ZGlmZiAtLWdpdCBhLy5jbGFuZy1mb3JtYXQgYi8uY2xhbmctZm9ybWF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYjgzM2EKLS0tIC9kZXYvbnVsbAorKysgYi8uY2xhbmctZm9ybWF0CkBAIC0wLDAgKzEsMiBAQAorIyBodHRwOi8vY2xhbmcubGx2bS5vcmcvZG9jcy9DbGFuZ0Zvcm1hdFN0eWxlT3B0aW9ucy5odG1sCitCYXNlZE9uU3R5bGU6IENocm9taXVtCmRpZmYgLS1naXQgYS9CVUlMRC5nbiBiL0JVSUxELmduCmluZGV4IGJhYjU3YjkuLjQ4N2I2MDQgMTAwNjQ0Ci0tLSBhL0JVSUxELmduCisrKyBiL0JVSUxELmduCkBAIC0yLDMwICsyLDM4IEBACiAjIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICMgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAoraW1wb3J0KCIvL2J1aWxkX292ZXJyaWRlcy92OC5nbmkiKQogaW1wb3J0KCIvL3Rlc3RpbmcvdGVzdC5nbmkiKQotCi1wZGZfdXNlX3NraWEgPSBmYWxzZQotCi1kZWNsYXJlX2FyZ3MoKSB7Ci0gICMgT24gQW5kcm9pZCB0aGVyZSdzIG5vIHN5c3RlbSBGcmVlVHlwZS4gT24gV2luZG93cyBhbmQgTWFjLCBvbmx5IGEgZmV3Ci0gICMgbWV0aG9kcyBhcmUgdXNlZCBmcm9tIGl0LgotICBwZGZpdW1fYnVuZGxlX2ZyZWV0eXBlID0gIWlzX2xpbnV4Ci19CitpbXBvcnQoInBkZml1bS5nbmkiKQogCiBjb25maWcoInBkZml1bV9jb25maWciKSB7CiAgIGNmbGFncyA9IFtdCi0gIGluY2x1ZGVfZGlycyA9IFsgInRoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUiIF0KKyAgaW5jbHVkZV9kaXJzID0gWworICAgICIuIiwKKyAgICAidGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZSIsCisgICAgInRoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUiLAorICBdCiAgIGRlZmluZXMgPSBbCi0gICAgIl9GUERGU0RLX0xJQiIsCi0gICAgIl9OT19HRElQTFVTXyIsICAjIHdvcmthcm91bmQgdGV4dCByZW5kZXJpbmcgaXNzdWVzIG9uIFdpbmRvd3MKICAgICAiT1BKX1NUQVRJQyIsCisgICAgIlBOR19QUkVGSVgiLAorICAgICJQTkdQUkVGSVhfSCIsCisgICAgIlBOR19VU0VfUkVBRF9NQUNST1MiLAogICAgICJWOF9ERVBSRUNBVElPTl9XQVJOSU5HUyIsCisgICAgIl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIiwKICAgXQogCiAgIGlmIChwZGZfdXNlX3NraWEpIHsKICAgICBkZWZpbmVzICs9IFsgIl9TS0lBX1NVUFBPUlRfIiBdCiAgIH0KIAorICBpZiAocGRmX2VuYWJsZV92OCkgeworICAgIGRlZmluZXMgKz0gWyAiUERGX0VOQUJMRV9WOCIgXQorICB9CisKKyAgaWYgKHBkZl9lbmFibGVfeGZhKSB7CisgICAgZGVmaW5lcyArPSBbICJQREZfRU5BQkxFX1hGQSIgXQorICB9CisKICAgaWYgKGlzX2xpbnV4KSB7CiAgICAgaWYgKGN1cnJlbnRfY3B1ID09ICJ4NjQiKSB7CiAgICAgICBkZWZpbmVzICs9IFsgIl9GWF9DUFVfPV9GWF9YNjRfIiBdCkBAIC00Miw4ICs1MCwyMyBAQAogICAgICAgIi93ZDQxNDYiLAogICAgICAgIi93ZDQzMzMiLAogICAgICAgIi93ZDQzNDUiLAorICAgICAgIi93ZDQyNjciLAorCisgICAgICAjIFRPRE8odGhlc3RpZyk6IEZpeCBhbGwgaW5zdGFuY2VzLCByZW1vdmUgdGhpcywgcGRmaXVtOjI5CisgICAgICAiL3dkNDI0NSIsCisgICAgICAiL3dkNDMxMCIsCisgICAgICAiL3dkNDM4OSIsCisgICAgICAiL3dkNDcwMSIsCisgICAgICAiL3dkNDcwMiIsCisgICAgICAiL3dkNDcwNiIsCisgICAgICAiL3dkNDgwMCIsCiAgICAgXQogICB9CisKKyAgaWYgKGlzX2NsYW5nKSB7CisgICAgIyBUT0RPKHRoZXN0aWcpOiBGaXggYWxsIGluc3RhbmNlcywgcmVtb3ZlIHRoaXMsIHBkZml1bToyOQorICAgIGNmbGFncyArPSBbICItV25vLXNpZ24tY29tcGFyZSIgXQorICB9CiB9CiAKIHN0YXRpY19saWJyYXJ5KCJwZGZpdW0iKSB7CkBAIC02NSw3ICs4OCw2IEBACiAgICAgImZwZGZzZGsvc3JjL2ZwZGZmb3JtZmlsbC5jcHAiLAogICAgICJmcGRmc2RrL3NyYy9mcGRmcHBvLmNwcCIsCiAgICAgImZwZGZzZGsvc3JjL2ZwZGZzYXZlLmNwcCIsCi0gICAgImZwZGZzZGsvc3JjL2ZwZGZzZGtkbGwucmMiLAogICAgICJmcGRmc2RrL3NyYy9mcGRmdGV4dC5jcHAiLAogICAgICJmcGRmc2RrL3NyYy9mcGRmdmlldy5jcHAiLAogICAgICJmcGRmc2RrL3NyYy9mc2RrX2FjdGlvbmhhbmRsZXIuY3BwIiwKQEAgLTc0LDcgKzk2LDYgQEAKICAgICAiZnBkZnNkay9zcmMvZnNka19iYXNlZm9ybS5jcHAiLAogICAgICJmcGRmc2RrL3NyYy9mc2RrX21nci5jcHAiLAogICAgICJmcGRmc2RrL3NyYy9mc2RrX3JlbmRlcmNvbnRleHQuY3BwIiwKLSAgICAiZnBkZnNkay9zcmMvcmVzb3VyY2UuaCIsCiAgICAgInB1YmxpYy9mcGRmX2RhdGFhdmFpbC5oIiwKICAgICAicHVibGljL2ZwZGZfZG9jLmgiLAogICAgICJwdWJsaWMvZnBkZl9lZGl0LmgiLApAQCAtOTMsMTEgKzExNCw3IEBACiAgIF0KIAogICBsaWJzID0gW10KLSAgY29uZmlncyAtPSBbICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpjaHJvbWl1bV9jb2RlIiBdCi0gIGNvbmZpZ3MgKz0gWwotICAgICI6cGRmaXVtX2NvbmZpZyIsCi0gICAgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOm5vX2Nocm9taXVtX2NvZGUiLAotICBdCisgIGNvbmZpZ3MgKz0gWyAiOnBkZml1bV9jb25maWciIF0KIAogICBkZXBzID0gWwogICAgICJ0aGlyZF9wYXJ0eTpiaWdpbnQiLApAQCAtMTEyLDEwICsxMjksMTUgQEAKICAgICAiOmZ4ZWRpdCIsCiAgICAgIjpmeGdlIiwKICAgICAiOmphdmFzY3JpcHQiLAotICAgICI6anNhcGkiLAogICAgICI6cGRmd2luZG93IiwKICAgXQogCisgIGlmIChwZGZfZW5hYmxlX3hmYSkgeworICAgIGRlcHMgKz0gWworICAgICAgIjpmcGRmeGZhIiwKKyAgICBdCisgIH0KKwogICBpZiAoaXNfd2luKSB7CiAgICAgbGlicyArPSBbCiAgICAgICAiYWR2YXBpMzIubGliIiwKQEAgLTEzMiwxMiArMTU0LDQxIEBACiAgIH0KIAogICBpZiAocGRmaXVtX2J1bmRsZV9mcmVldHlwZSkgewotICAgIGRlcHMgKz0gWyAidGhpcmRfcGFydHk6ZnJlZXR5cGUiIF0KKyAgICBkZXBzICs9IFsgInRoaXJkX3BhcnR5OmZ4X2ZyZWV0eXBlIiBdCiAgIH0gZWxzZSB7CiAgICAgbGlicyArPSBbICJmcmVldHlwZSIgXQogICB9CiB9CiAKK3NvdXJjZV9zZXQoInRlc3Rfc3VwcG9ydCIpIHsKKyAgdGVzdG9ubHkgPSB0cnVlCisgIHNvdXJjZXMgPSBbCisgICAgInRlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmNwcCIsCisgICAgInRlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmgiLAorICAgICJ0ZXN0aW5nL3Rlc3Rfc3VwcG9ydC5jcHAiLAorICAgICJ0ZXN0aW5nL3Rlc3Rfc3VwcG9ydC5oIiwKKyAgICAidGVzdGluZy91dGlscy9wYXRoX3NlcnZpY2UuY3BwIiwKKyAgXQorICBkZXBzID0gWworICAgICIvL3Rlc3RpbmcvZ21vY2siLAorICAgICIvL3Rlc3RpbmcvZ3Rlc3QiLAorICAgICI6cGRmaXVtIiwKKyAgXQorICBpbmNsdWRlX2RpcnMgPSBbXQorICBpZiAocGRmX2VuYWJsZV92OCkgeworICAgIGRlcHMgKz0gWworICAgICAgIi8vdjgiLAorICAgICAgIi8vdjg6djhfbGlicGxhdGZvcm0iLAorICAgIF0KKyAgICBpbmNsdWRlX2RpcnMgKz0gWworICAgICAgIi8vdjgiLAorICAgICAgIi8vdjgvaW5jbHVkZSIsCisgICAgXQorICAgIGNvbmZpZ3MgKz0gWyAiLy92ODpleHRlcm5hbF9zdGFydHVwX2RhdGEiIF0KKyAgfQorICBjb25maWdzICs9IFsgIjpwZGZpdW1fY29uZmlnIiBdCit9CisKICMgVGFyZ2V0cyBiZWxvdyB0aGlzIGFyZSBvbmx5IHZpc2libGUgd2l0aGluIHRoaXMgZmlsZSAoYW5kIHRvIHRoZQogIyB0b3AtbGV2ZWwgZ25fdmlzaWJpbGl0eSB0YXJnZXQgdXNlZCB0byBoZWxwIGduX2FsbCBidWlsZCBldmVyeXRoaW5nKS4KIHZpc2liaWxpdHkgPSBbCkBAIC0xNTIsMTEgKzIwMyw3IEBACiAgICAgImNvcmUvc3JjL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0X2Flcy5jcHAiLAogICAgICJjb3JlL3NyYy9mZHJtL2NyeXB0by9meF9jcnlwdF9zaGEuY3BwIiwKICAgXQotICBjb25maWdzIC09IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOmNocm9taXVtX2NvZGUiIF0KLSAgY29uZmlncyArPSBbCi0gICAgIjpwZGZpdW1fY29uZmlnIiwKLSAgICAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6bm9fY2hyb21pdW1fY29kZSIsCi0gIF0KKyAgY29uZmlncyArPSBbICI6cGRmaXVtX2NvbmZpZyIgXQogfQogCiBzdGF0aWNfbGlicmFyeSgiZnBkZmRvYyIpIHsKQEAgLTE4NSwxMSArMjMyLDcgQEAKICAgICAiY29yZS9zcmMvZnBkZmRvYy9wZGZfdnQuaCIsCiAgICAgImNvcmUvc3JjL2ZwZGZkb2MvdGFnZ2VkX2ludC5oIiwKICAgXQotICBjb25maWdzIC09IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOmNocm9taXVtX2NvZGUiIF0KLSAgY29uZmlncyArPSBbCi0gICAgIjpwZGZpdW1fY29uZmlnIiwKLSAgICAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6bm9fY2hyb21pdW1fY29kZSIsCi0gIF0KKyAgY29uZmlncyArPSBbICI6cGRmaXVtX2NvbmZpZyIgXQogfQogCiBzdGF0aWNfbGlicmFyeSgiZnBkZmFwaSIpIHsKQEAgLTIwMiw3ICsyNDUsNiBAQAogICAgICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3JlbmRlci5oIiwKICAgICAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZXNvdXJjZS5oIiwKICAgICAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9zZXJpYWwuaCIsCi0gICAgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZhcGkuaCIsCiAgICAgImNvcmUvc3JjL2ZwZGZhcGkvZnBkZl9iYXNpY19tb2R1bGUuY3BwIiwKICAgICAiY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvQWRvYmUtQ05TMS1VQ1MyXzUuY3BwIiwKICAgICAiY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvQjVwYy1IXzAuY3BwIiwKQEAgLTI1MSw4ICsyOTMsNiBAQAogICAgICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1VuaUpJUy1VQ1MyLUhXLVZfNC5jcHAiLAogICAgICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1VuaUpJUy1VQ1MyLUhfNC5jcHAiLAogICAgICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1VuaUpJUy1VQ1MyLVZfNC5jcHAiLAotICAgICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1VuaUpJUy1VVEYxNi1IXzUuY3BwIiwKLSAgICAiY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9VbmlKSVMtVVRGMTYtVl81LmNwcCIsCiAgICAgImNvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvVl8xLmNwcCIsCiAgICAgImNvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvY21hcHNfamFwYW4xLmNwcCIsCiAgICAgImNvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvQWRvYmUtS29yZWExLVVDUzJfMi5jcHAiLApAQCAtMjc0LDcgKzMxNCw2IEBACiAgICAgImNvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9jcmVhdGUuY3BwIiwKICAgICAiY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2RvYy5jcHAiLAogICAgICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfaW1hZ2UuY3BwIiwKLSAgICAiY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvY29tbW9uLmgiLAogICAgICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mb250X2ludC5oIiwKICAgICAiY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZnBkZl9mb250LmNwcCIsCiAgICAgImNvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZwZGZfZm9udF9jaGFyc2V0LmNwcCIsCkBAIC0yOTIsMTUgKzMzMSwxNCBAQAogICAgICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGF0aC5jcHAiLAogICAgICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGF0dGVybi5jcHAiLAogICAgICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9wYWdlaW50LmgiLAotICAgICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZpbHRlcnNfaW50LmgiLAogICAgICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZS5jcHAiLAogICAgICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2RvY3VtZW50LmNwcCIsCiAgICAgImNvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZW5jcnlwdC5jcHAiLAogICAgICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2ZkZi5jcHAiLAotICAgICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2ZpbHRlcnMuY3BwIiwKICAgICAiY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9vYmplY3RzLmNwcCIsCiAgICAgImNvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfcGFyc2VyLmNwcCIsCiAgICAgImNvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfdXRpbGl0eS5jcHAiLAorICAgICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL3BhcnNlcl9pbnQuaCIsCiAgICAgImNvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXIuY3BwIiwKICAgICAiY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9jYWNoZS5jcHAiLAogICAgICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2ltYWdlLmNwcCIsCkBAIC0zMDksMTEgKzM0Nyw3IEBACiAgICAgImNvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfdGV4dC5jcHAiLAogICAgICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL3JlbmRlcl9pbnQuaCIsCiAgIF0KLSAgY29uZmlncyAtPSBbICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpjaHJvbWl1bV9jb2RlIiBdCi0gIGNvbmZpZ3MgKz0gWwotICAgICI6cGRmaXVtX2NvbmZpZyIsCi0gICAgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOm5vX2Nocm9taXVtX2NvZGUiLAotICBdCisgIGNvbmZpZ3MgKz0gWyAiOnBkZml1bV9jb25maWciIF0KIH0KIAogc3RhdGljX2xpYnJhcnkoImZwZGZ0ZXh0IikgewpAQCAtMzI2LDc2ICszNjAsNDkgQEAKICAgICAiY29yZS9zcmMvZnBkZnRleHQvdHh0cHJvYy5oIiwKICAgICAiY29yZS9zcmMvZnBkZnRleHQvdW5pY29kZW5vcm1hbGl6YXRpb24uY3BwIiwKICAgICAiY29yZS9zcmMvZnBkZnRleHQvdW5pY29kZW5vcm1hbGl6YXRpb25kYXRhLmNwcCIsCisgICAgImNvcmUvc3JjL2ZwZGZ0ZXh0L3VuaWNvZGVub3JtYWxpemF0aW9uZGF0YS5oIiwKICAgXQotICBjb25maWdzIC09IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOmNocm9taXVtX2NvZGUiIF0KLSAgY29uZmlncyArPSBbCi0gICAgIjpwZGZpdW1fY29uZmlnIiwKLSAgICAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6bm9fY2hyb21pdW1fY29kZSIsCi0gIF0KKyAgY29uZmlncyArPSBbICI6cGRmaXVtX2NvbmZpZyIgXQogfQogCiBzdGF0aWNfbGlicmFyeSgiZnhjb2RlYyIpIHsKKyAgZGVwcyA9IFsKKyAgICAidGhpcmRfcGFydHk6ZnhfbGNtczIiLAorICAgICJ0aGlyZF9wYXJ0eTpmeF9saWJvcGVuanBlZyIsCisgICAgInRoaXJkX3BhcnR5OmZ4X3psaWIiLAorCisgICAgIyBUaGlzIGlzIGEgZ2VuZXJpYyBKUEVHIGxpYnJhcnkgZGVwZW5kZW5jeS4KKyAgICAiLy90aGlyZF9wYXJ0eTpqcGVnIiwKKyAgXQogICBzb3VyY2VzID0gWwogICAgICJjb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIiwKICAgICAiY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWNfZGVmLmgiLAotICAgICJjb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlY19wcm92aWRlci5oIiwKKyAgICAiY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWNfZmxhdGUuaCIsCiAgICAgImNvcmUvc3JjL2Z4Y29kZWMvY29kZWMvY29kZWNfaW50LmgiLAogICAgICJjb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjLmNwcCIsCiAgICAgImNvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZmF4LmNwcCIsCiAgICAgImNvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZmxhdGUuY3BwIiwKICAgICAiY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19pY2MuY3BwIiwKICAgICAiY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qYmlnLmNwcCIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfamJpZ19lbmMuY3BwIiwKICAgICAiY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qcGVnLmNwcCIsCiAgICAgImNvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanB4X29wai5jcHAiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2luY2x1ZGUvZnhfb3BlbmpwZWcuaCIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X2Jpby5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfY2lvLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9kd3QuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X2V2ZW50LmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9mdW5jdGlvbl9saXN0LmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9pbWFnZS5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfaW52ZXJ0LmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9qMmsuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X2oya19saWIuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X2pwdC5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfbWN0LmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9tcWMuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X29wZW5qcGVnLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9vcGVuanBlZ19qcDIuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X29wal9jbG9jay5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfcGkuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X3Jhdy5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfdDEuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X3QyLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF90Y2QuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X3RndC5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9meF96bGliL2luY2x1ZGUvZnhfemxpYi5oIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX2FkbGVyMzIuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl9jb21wcmVzcy5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX2NyYzMyLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfZGVmbGF0ZS5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX2d6Y2xvc2UuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl9nemxpYi5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX2d6cmVhZC5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX2d6d3JpdGUuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl9pbmZiYWNrLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfaW5mZmFzdC5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX2luZmxhdGUuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl9pbmZ0cmVlcy5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX3RyZWVzLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfdW5jb21wci5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX3p1dGlsLmMiLAorICAgICJjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0FyaXRoRGVjb2Rlci5jcHAiLAogICAgICJjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0FyaXRoRGVjb2Rlci5oIiwKICAgICAiY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Bcml0aEludERlY29kZXIuY3BwIiwKICAgICAiY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Bcml0aEludERlY29kZXIuaCIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQXJpdGhRZS5oIiwKKyAgICAiY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9CaXRTdHJlYW0uY3BwIiwKICAgICAiY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9CaXRTdHJlYW0uaCIsCiAgICAgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQ29udGV4dC5jcHAiLAogICAgICJjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0NvbnRleHQuaCIsCiAgICAgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfRGVmaW5lLmgiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0dlbmVyYWxEZWNvZGVyLmNwcCIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR2VuZXJhbERlY29kZXIuaCIsCisgICAgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR3JkUHJvYy5jcHAiLAorICAgICJjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0dyZFByb2MuaCIsCisgICAgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR3JyZFByb2MuY3BwIiwKKyAgICAiY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HcnJkUHJvYy5oIiwKKyAgICAiY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Hc2lkUHJvYy5jcHAiLAorICAgICJjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0dzaWRQcm9jLmgiLAorICAgICJjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h0cmRQcm9jLmNwcCIsCisgICAgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHRyZFByb2MuaCIsCiAgICAgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hbkRlY29kZXIuY3BwIiwKICAgICAiY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuRGVjb2Rlci5oIiwKICAgICAiY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGUuY3BwIiwKQEAgLTQwNCwxMjUgKzQxMSw3MCBAQAogICAgICJjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0ltYWdlLmNwcCIsCiAgICAgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuaCIsCiAgICAgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfTGlzdC5oIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Nb2R1bGUuaCIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfT2JqZWN0LmNwcCIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfT2JqZWN0LmgiLAogICAgICJjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1BhZ2UuaCIsCiAgICAgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfUGF0dGVybkRpY3QuY3BwIiwKICAgICAiY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9QYXR0ZXJuRGljdC5oIiwKKyAgICAiY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9QZGRQcm9jLmNwcCIsCisgICAgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfUGRkUHJvYy5oIiwKKyAgICAiY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TZGRQcm9jLmNwcCIsCisgICAgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU2RkUHJvYy5oIiwKICAgICAiY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TZWdtZW50LmNwcCIsCiAgICAgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU2VnbWVudC5oIiwKICAgICAiY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TeW1ib2xEaWN0LmNwcCIsCiAgICAgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU3ltYm9sRGljdC5oIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zY2FtMDIuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc2NnYXRzLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNjbnZydC5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zZXJyLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNnYW1tYS5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zZ210LmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNoYWxmLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNpbnRycC5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zaW8wLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNpbzEuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc2x1dC5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zbWQ1LmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNtdHJ4LmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNuYW1lZC5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zb3B0LmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNwYWNrLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNwY3MuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc3BsdWdpbi5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zcHMyLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNzYW1wLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNzbS5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zdHlwZXMuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc3ZpcnQuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc3d0cG50LmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXN4Zm9ybS5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2NkZXJyb3IuaCIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9jZGpwZWcuaCIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjYXBpbWluLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY2FwaXN0ZC5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNjb2VmY3QuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjY29sb3IuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjZGN0bWdyLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY2h1ZmYuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjaW5pdC5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNtYWluY3QuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjbWFya2VyLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY21hc3Rlci5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNvbWFwaS5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNwYXJhbS5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNwaHVmZi5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNwcmVwY3QuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjc2FtcGxlLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY3RyYW5zLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZGFwaW1pbi5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamRhcGlzdGQuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkY29lZmN0LmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZGNvbG9yLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZGRjdG1nci5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamRodWZmLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZGlucHV0LmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZG1haW5jdC5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamRtYXJrZXIuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkbWFzdGVyLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZG1lcmdlLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZHBodWZmLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZHBvc3RjdC5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamRzYW1wbGUuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkdHJhbnMuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2plcnJvci5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamZkY3Rmc3QuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pmZGN0aW50LmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qaWRjdGZzdC5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamlkY3RpbnQuYyIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2ppZGN0cmVkLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qbWVtbWdyLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qbWVtbm9icy5jIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfanV0aWxzLmMiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvamNodWZmLmgiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvamNvbmZpZy5oIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2pkY3QuaCIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9qZGh1ZmYuaCIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9qZXJyb3IuaCIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9qaW5jbHVkZS5oIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ptZW1zeXMuaCIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9qbW9yZWNmZy5oIiwKLSAgICAiY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2pwZWdpbnQuaCIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9qcGVnbGliLmgiLAotICAgICJjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvanZlcnNpb24uaCIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9tYWtlZmlsZSIsCi0gICAgImNvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy90cmFuc3VwcC5oIiwKKyAgICAiY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9UcmRQcm9jLmNwcCIsCisgICAgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfVHJkUHJvYy5oIiwKICAgXQotICBjb25maWdzIC09IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOmNocm9taXVtX2NvZGUiIF0KLQorICBpbmNsdWRlX2RpcnMgPSBbXQorICBpZiAocGRmX2VuYWJsZV94ZmEpIHsKKyAgICBzb3VyY2VzICs9IFsKKyAgICAgICJjb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2JtcC5jcHAiLAorICAgICAgImNvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZ2lmLmNwcCIsCisgICAgICAiY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19wbmcuY3BwIiwKKyAgICAgICJjb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3Byb2dyZXNzLmNwcCIsCisgICAgICAiY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19wcm9ncmVzcy5oIiwKKyAgICAgICJjb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3RpZmYuY3BwIiwKKyAgICAgICJjb3JlL3NyYy9meGNvZGVjL2xibXAvZnhfYm1wLmNwcCIsCisgICAgICAiY29yZS9zcmMvZnhjb2RlYy9sYm1wL2Z4X2JtcC5oIiwKKyAgICAgICJjb3JlL3NyYy9meGNvZGVjL2xnaWYvZnhfZ2lmLmNwcCIsCisgICAgICAiY29yZS9zcmMvZnhjb2RlYy9sZ2lmL2Z4X2dpZi5oIiwKKyAgICBdCisgICAgZGVwcyArPSBbCisgICAgICAidGhpcmRfcGFydHk6ZnhfbHBuZyIsCisgICAgICAidGhpcmRfcGFydHk6ZnhfdGlmZiIsCisgICAgXQorICB9CiAgIGlmIChpc19wb3NpeCkgewogICAgICMgY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfbWN0LmMgZG9lcyBhbiBwb2ludGVyLXRvLWludAogICAgICMgY29udmVyc2lvbiB0byBjaGVjayB0aGF0IGFuIGFkZHJlc3MgaXMgMTYtYml0IGFsaWduZWQgKGJlbmlnbikuCiAgICAgY2ZsYWdzX2MgPSBbICItV25vLXBvaW50ZXItdG8taW50LWNhc3QiIF0KICAgfQotICBjb25maWdzICs9IFsKLSAgICAiOnBkZml1bV9jb25maWciLAotICAgICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpub19jaHJvbWl1bV9jb2RlIiwKLSAgXQorICBjb25maWdzICs9IFsgIjpwZGZpdW1fY29uZmlnIiBdCit9CisKK2NvbmZpZygiZnhnZV93YXJuaW5ncyIpIHsKKyAgaWYgKGlzX2NsYW5nKSB7CisgICAgY2ZsYWdzID0gWworICAgICAgIyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcGRmaXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MTg4CisgICAgICAiLVduby1zd2l0Y2giLAorICAgIF0KKyAgfQogfQogCiBzdGF0aWNfbGlicmFyeSgiZnhjcnQiKSB7CiAgIHNvdXJjZXMgPSBbCi0gICAgImNvcmUvaW5jbHVkZS9meGNydC9meF9hcmIuaCIsCiAgICAgImNvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIiwKKyAgICAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2JpZGkuaCIsCiAgICAgImNvcmUvaW5jbHVkZS9meGNydC9meF9jb29yZGluYXRlcy5oIiwKICAgICAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2V4dC5oIiwKICAgICAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X21lbW9yeS5oIiwKKyAgICAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCIsCiAgICAgImNvcmUvaW5jbHVkZS9meGNydC9meF9zdHJlYW0uaCIsCiAgICAgImNvcmUvaW5jbHVkZS9meGNydC9meF9zdHJpbmcuaCIsCiAgICAgImNvcmUvaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaCIsCiAgICAgImNvcmUvaW5jbHVkZS9meGNydC9meF91Y2QuaCIsCiAgICAgImNvcmUvaW5jbHVkZS9meGNydC9meF94bWwuaCIsCiAgICAgImNvcmUvc3JjL2Z4Y3J0L2V4dGVuc2lvbi5oIiwKLSAgICAiY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmNwcCIsCi0gICAgImNvcmUvc3JjL2Z4Y3J0L2Z4X2FyYWJpYy5oIiwKICAgICAiY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfYXJyYXkuY3BwIiwKICAgICAiY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfYnN0cmluZy5jcHAiLAogICAgICJjb3JlL3NyYy9meGNydC9meF9iYXNpY19idWZmZXIuY3BwIiwKQEAgLTUzNSw4ICs0ODcsOCBAQAogICAgICJjb3JlL3NyYy9meGNydC9meF9iYXNpY191dGYuY3BwIiwKICAgICAiY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfdXRpbC5jcHAiLAogICAgICJjb3JlL3NyYy9meGNydC9meF9iYXNpY193c3RyaW5nLmNwcCIsCisgICAgImNvcmUvc3JjL2Z4Y3J0L2Z4X2JpZGkuY3BwIiwKICAgICAiY29yZS9zcmMvZnhjcnQvZnhfZXh0ZW5zaW9uLmNwcCIsCi0gICAgImNvcmUvc3JjL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCIsCiAgICAgImNvcmUvc3JjL2Z4Y3J0L2Z4X3VjZGRhdGEuY3BwIiwKICAgICAiY29yZS9zcmMvZnhjcnQvZnhfdW5pY29kZS5jcHAiLAogICAgICJjb3JlL3NyYy9meGNydC9meF94bWxfY29tcG9zZXIuY3BwIiwKQEAgLTU1MCwxNCArNTAyLDIwIEBACiAgICAgImNvcmUvc3JjL2Z4Y3J0L3BsZXguaCIsCiAgICAgImNvcmUvc3JjL2Z4Y3J0L3htbF9pbnQuaCIsCiAgIF0KLSAgY29uZmlncyAtPSBbICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpjaHJvbWl1bV9jb2RlIiBdCi0gIGNvbmZpZ3MgKz0gWwotICAgICI6cGRmaXVtX2NvbmZpZyIsCi0gICAgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOm5vX2Nocm9taXVtX2NvZGUiLAotICBdCisgIGlmIChwZGZfZW5hYmxlX3hmYSkgeworICAgIHNvdXJjZXMgKz0gWworICAgICAgImNvcmUvaW5jbHVkZS9meGNydC9meF9hcmIuaCIsCisgICAgICAiY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmNwcCIsCisgICAgICAiY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmgiLAorICAgIF0KKyAgfQorICBjb25maWdzICs9IFsgIjpwZGZpdW1fY29uZmlnIiBdCiB9CiAKIHN0YXRpY19saWJyYXJ5KCJmeGdlIikgeworICBkZXBzID0gWworICAgICJ0aGlyZF9wYXJ0eTpmeF9hZ2ciLAorICBdCiAgIHNvdXJjZXMgPSBbCiAgICAgImNvcmUvaW5jbHVkZS9meGdlL2ZwZi5oIiwKICAgICAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZGliLmgiLApAQCAtNTY3LDIyICs1MjUsNyBAQAogICAgICJjb3JlL2luY2x1ZGUvZnhnZS9meF9nZV9hcHBsZS5oIiwKICAgICAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2Vfd2luMzIuaCIsCiAgICAgImNvcmUvc3JjL2Z4Z2UvYWdnL2luY2x1ZGUvZnhfYWdnX2RyaXZlci5oIiwKLSAgICAiY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meGZ4X2FnZ19iYXNpY3MuaCIsCi0gICAgImNvcmUvc3JjL2Z4Z2UvYWdnL2luY2x1ZGUvZnhmeF9hZ2dfY2xpcF9saWFuZ19iYXJza3kuaCIsCi0gICAgImNvcmUvc3JjL2Z4Z2UvYWdnL2luY2x1ZGUvZnhmeF9hZ2dfY29udl9kYXNoLmgiLAotICAgICJjb3JlL3NyYy9meGdlL2FnZy9pbmNsdWRlL2Z4ZnhfYWdnX2NvbnZfc3Ryb2tlLmgiLAotICAgICJjb3JlL3NyYy9meGdlL2FnZy9pbmNsdWRlL2Z4ZnhfYWdnX2N1cnZlcy5oIiwKLSAgICAiY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meGZ4X2FnZ19wYXRoX3N0b3JhZ2UuaCIsCi0gICAgImNvcmUvc3JjL2Z4Z2UvYWdnL2luY2x1ZGUvZnhmeF9hZ2dfcmFzdGVyaXplcl9zY2FubGluZV9hYS5oIiwKLSAgICAiY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meGZ4X2FnZ19yZW5kZXJlcl9zY2FubGluZS5oIiwKLSAgICAiY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meGZ4X2FnZ19yZW5kZXJpbmdfYnVmZmVyLmgiLAotICAgICJjb3JlL3NyYy9meGdlL2FnZy9pbmNsdWRlL2Z4ZnhfYWdnX3NjYW5saW5lX3UuaCIsCi0gICAgImNvcmUvc3JjL2Z4Z2UvYWdnL3NyYy9meGZ4X2FnZ19jdXJ2ZXMuY3BwIiwKLSAgICAiY29yZS9zcmMvZnhnZS9hZ2cvc3JjL2Z4ZnhfYWdnX2RyaXZlci5jcHAiLAotICAgICJjb3JlL3NyYy9meGdlL2FnZy9zcmMvZnhmeF9hZ2dfcGF0aF9zdG9yYWdlLmNwcCIsCi0gICAgImNvcmUvc3JjL2Z4Z2UvYWdnL3NyYy9meGZ4X2FnZ19yYXN0ZXJpemVyX3NjYW5saW5lX2FhLmNwcCIsCi0gICAgImNvcmUvc3JjL2Z4Z2UvYWdnL3NyYy9meGZ4X2FnZ192Y2dlbl9kYXNoLmNwcCIsCi0gICAgImNvcmUvc3JjL2Z4Z2UvYWdnL3NyYy9meGZ4X2FnZ192Y2dlbl9zdHJva2UuY3BwIiwKKyAgICAiY29yZS9zcmMvZnhnZS9hZ2cvc3JjL2Z4X2FnZ19kcml2ZXIuY3BwIiwKICAgICAiY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udC5jcHAiLAogICAgICJjb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFmb250LmgiLAogICAgICJjb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFmb250bWdyLmNwcCIsCkBAIC02MTksNiArNTYyLDcgQEAKICAgICAiY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdFNlcmlmSXRhbGljLmMiLAogICAgICJjb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0U2VyaWZNTS5jIiwKICAgICAiY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdFN5bWJvbC5jIiwKKyAgICAiY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9jaHJvbWVmb250ZGF0YS5oIiwKICAgICAiY29yZS9zcmMvZnhnZS9mcmVldHlwZS9meF9mcmVldHlwZS5jIiwKICAgICAiY29yZS9zcmMvZnhnZS9nZS9meF9nZS5jcHAiLAogICAgICJjb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2RldmljZS5jcHAiLApAQCAtNjMxLDEwICs1NzUsOSBAQAogICAgICJjb3JlL3NyYy9meGdlL2dlL3RleHRfaW50LmgiLAogICBdCiAKLSAgY29uZmlncyAtPSBbICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpjaHJvbWl1bV9jb2RlIiBdCiAgIGNvbmZpZ3MgKz0gWworICAgICI6ZnhnZV93YXJuaW5ncyIsCiAgICAgIjpwZGZpdW1fY29uZmlnIiwKLSAgICAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6bm9fY2hyb21pdW1fY29kZSIsCiAgIF0KIAogICBpZiAocGRmX3VzZV9za2lhKSB7CkBAIC02NzYsMjQgKzYxOSwxNyBAQAogICAgICJmcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4X2VkaXQuaCIsCiAgICAgImZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhldF9lZGl0LmgiLAogICAgICJmcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfbGlzdC5oIiwKLSAgICAiZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meGV0X3N0dWIuaCIsCiAgICAgImZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X2FwLmNwcCIsCiAgICAgImZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X2VkaXQuY3BwIiwKICAgICAiZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfbGlzdC5jcHAiLAogICAgICJmcGRmc2RrL3NyYy9meGVkaXQvZnhldF9tb2R1bGUuY3BwIiwKICAgICAiZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfcGFnZW9ianMuY3BwIiwKICAgXQotICBjb25maWdzIC09IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOmNocm9taXVtX2NvZGUiIF0KLSAgY29uZmlncyArPSBbCi0gICAgIjpwZGZpdW1fY29uZmlnIiwKLSAgICAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6bm9fY2hyb21pdW1fY29kZSIsCi0gIF0KKyAgY29uZmlncyArPSBbICI6cGRmaXVtX2NvbmZpZyIgXQogfQogCiBzdGF0aWNfbGlicmFyeSgicGRmd2luZG93IikgewogICBzb3VyY2VzID0gWwotICAgICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L0lQREZXaW5kb3cuaCIsCi0gICAgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUERGV2luZG93LmgiLAogICAgICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9CdXR0b24uaCIsCiAgICAgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0NhcmV0LmgiLAogICAgICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Db21ib0JveC5oIiwKQEAgLTcyOSw5MiArNjY1LDY5IEBACiAgICAgImZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfVXRpbHMuY3BwIiwKICAgICAiZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9XbmQuY3BwIiwKICAgXQotICBjb25maWdzIC09IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOmNocm9taXVtX2NvZGUiIF0KLSAgY29uZmlncyArPSBbCi0gICAgIjpwZGZpdW1fY29uZmlnIiwKLSAgICAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6bm9fY2hyb21pdW1fY29kZSIsCi0gIF0KKyAgY29uZmlncyArPSBbICI6cGRmaXVtX2NvbmZpZyIgXQogfQogCiBzdGF0aWNfbGlicmFyeSgiamF2YXNjcmlwdCIpIHsKICAgc291cmNlcyA9IFsKLSAgICAiZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvQ29uc3RzLmgiLAotICAgICJmcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9Eb2N1bWVudC5oIiwKLSAgICAiZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvRmllbGQuaCIsCiAgICAgImZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiLAotICAgICJmcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9JY29uLmgiLAotICAgICJmcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19Db250ZXh0LmgiLAotICAgICJmcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19EZWZpbmUuaCIsCi0gICAgImZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oIiwKLSAgICAiZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfR2xvYmFsRGF0YS5oIiwKLSAgICAiZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgiLAotICAgICJmcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19SdW50aW1lLmgiLAotICAgICJmcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19WYWx1ZS5oIiwKLSAgICAiZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSmF2YVNjcmlwdC5oIiwKLSAgICAiZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvUHVibGljTWV0aG9kcy5oIiwKLSAgICAiZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvYXBwLmgiLAotICAgICJmcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9jb2xvci5oIiwKLSAgICAiZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvY29uc29sZS5oIiwKLSAgICAiZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvZXZlbnQuaCIsCi0gICAgImZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2dsb2JhbC5oIiwKLSAgICAiZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvcmVwb3J0LmgiLAotICAgICJmcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9yZXNvdXJjZS5oIiwKLSAgICAiZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvdXRpbC5oIiwKLSAgICAiZnBkZnNkay9zcmMvamF2YXNjcmlwdC9Db25zdHMuY3BwIiwKLSAgICAiZnBkZnNkay9zcmMvamF2YXNjcmlwdC9Eb2N1bWVudC5jcHAiLAotICAgICJmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ZpZWxkLmNwcCIsCi0gICAgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSWNvbi5jcHAiLAotICAgICJmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0NvbnRleHQuY3BwIiwKLSAgICAiZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuY3BwIiwKLSAgICAiZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19HbG9iYWxEYXRhLmNwcCIsCi0gICAgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfT2JqZWN0LmNwcCIsCi0gICAgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfUnVudGltZS5jcHAiLAotICAgICJmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX1ZhbHVlLmNwcCIsCi0gICAgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvUHVibGljTWV0aG9kcy5jcHAiLAotICAgICJmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2FwcC5jcHAiLAotICAgICJmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbG9yLmNwcCIsCi0gICAgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvY29uc29sZS5jcHAiLAotICAgICJmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2V2ZW50LmNwcCIsCi0gICAgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvZ2xvYmFsLmNwcCIsCi0gICAgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvcmVwb3J0LmNwcCIsCi0gICAgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvcmVzb3VyY2UuY3BwIiwKLSAgICAiZnBkZnNkay9zcmMvamF2YXNjcmlwdC91dGlsLmNwcCIsCiAgIF0KLQotICBjb25maWdzIC09IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOmNocm9taXVtX2NvZGUiIF0KLSAgY29uZmlncyArPSBbCi0gICAgIjpwZGZpdW1fY29uZmlnIiwKLSAgICAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6bm9fY2hyb21pdW1fY29kZSIsCi0gIF0KLSAgaW5jbHVkZV9kaXJzID0gWwotICAgICIvL3Y4IiwKLSAgICAiLy92OC9pbmNsdWRlIiwKLSAgXQotCi0gIHB1YmxpY19kZXBzID0gWwotICAgICIvL3Y4IiwKLSAgXQotfQotCi1zdGF0aWNfbGlicmFyeSgianNhcGkiKSB7Ci0gIHNvdXJjZXMgPSBbCi0gICAgImZwZGZzZGsvaW5jbHVkZS9qc2FwaS9meGpzX3Y4LmgiLAotICAgICJmcGRmc2RrL3NyYy9qc2FwaS9meGpzX3Y4LmNwcCIsCi0gIF0KLQotICBjb25maWdzIC09IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOmNocm9taXVtX2NvZGUiIF0KLSAgY29uZmlncyArPSBbCi0gICAgIjpwZGZpdW1fY29uZmlnIiwKLSAgICAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6bm9fY2hyb21pdW1fY29kZSIsCi0gIF0KLSAgaW5jbHVkZV9kaXJzID0gWwotICAgICIvL3Y4IiwKLSAgICAiLy92OC9pbmNsdWRlIiwKLSAgXQotCi0gIHB1YmxpY19kZXBzID0gWwotICAgICIvL3Y4IiwKLSAgXQorICBpZiAocGRmX2VuYWJsZV92OCkgeworICAgIHNvdXJjZXMgKz0gWworICAgICAgImZwZGZzZGsvaW5jbHVkZS9qc2FwaS9meGpzX3Y4LmgiLAorICAgICAgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvQ29uc3RzLmNwcCIsCisgICAgICAiZnBkZnNkay9zcmMvamF2YXNjcmlwdC9Db25zdHMuaCIsCisgICAgICAiZnBkZnNkay9zcmMvamF2YXNjcmlwdC9Eb2N1bWVudC5jcHAiLAorICAgICAgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvRG9jdW1lbnQuaCIsCisgICAgICAiZnBkZnNkay9zcmMvamF2YXNjcmlwdC9GaWVsZC5jcHAiLAorICAgICAgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvRmllbGQuaCIsCisgICAgICAiZnBkZnNkay9zcmMvamF2YXNjcmlwdC9JY29uLmNwcCIsCisgICAgICAiZnBkZnNkay9zcmMvamF2YXNjcmlwdC9JY29uLmgiLAorICAgICAgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfQ29udGV4dC5jcHAiLAorICAgICAgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oIiwKKyAgICAgICJmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0RlZmluZS5oIiwKKyAgICAgICJmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5jcHAiLAorICAgICAgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmgiLAorICAgICAgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfR2xvYmFsRGF0YS5jcHAiLAorICAgICAgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfR2xvYmFsRGF0YS5oIiwKKyAgICAgICJmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX09iamVjdC5jcHAiLAorICAgICAgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgiLAorICAgICAgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfUnVudGltZS5jcHAiLAorICAgICAgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfUnVudGltZS5oIiwKKyAgICAgICJmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX1ZhbHVlLmNwcCIsCisgICAgICAiZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19WYWx1ZS5oIiwKKyAgICAgICJmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuY3BwIiwKKyAgICAgICJmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuaCIsCisgICAgICAiZnBkZnNkay9zcmMvamF2YXNjcmlwdC9hcHAuY3BwIiwKKyAgICAgICJmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2FwcC5oIiwKKyAgICAgICJmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbG9yLmNwcCIsCisgICAgICAiZnBkZnNkay9zcmMvamF2YXNjcmlwdC9jb2xvci5oIiwKKyAgICAgICJmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbnNvbGUuY3BwIiwKKyAgICAgICJmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbnNvbGUuaCIsCisgICAgICAiZnBkZnNkay9zcmMvamF2YXNjcmlwdC9ldmVudC5jcHAiLAorICAgICAgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvZXZlbnQuaCIsCisgICAgICAiZnBkZnNkay9zcmMvamF2YXNjcmlwdC9nbG9iYWwuY3BwIiwKKyAgICAgICJmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2dsb2JhbC5oIiwKKyAgICAgICJmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3JlcG9ydC5jcHAiLAorICAgICAgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvcmVwb3J0LmgiLAorICAgICAgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvcmVzb3VyY2UuY3BwIiwKKyAgICAgICJmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3Jlc291cmNlLmgiLAorICAgICAgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvdXRpbC5jcHAiLAorICAgICAgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvdXRpbC5oIiwKKyAgICAgICJmcGRmc2RrL3NyYy9qc2FwaS9meGpzX3Y4LmNwcCIsCisgICAgXQorICAgIGluY2x1ZGVfZGlycyA9IFsKKyAgICAgICIvL3Y4IiwKKyAgICAgICIvL3Y4L2luY2x1ZGUiLAorICAgIF0KKyAgICBwdWJsaWNfZGVwcyA9IFsKKyAgICAgICIvL3Y4IiwKKyAgICBdCisgICAgY29uZmlncyArPSBbICIvL3Y4OmV4dGVybmFsX3N0YXJ0dXBfZGF0YSIgXQorICB9IGVsc2UgeworICAgIHNvdXJjZXMgKz0gWyAiZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19SdW50aW1lX1N0dWIuY3BwIiBdCisgIH0KKyAgY29uZmlncyArPSBbICI6cGRmaXVtX2NvbmZpZyIgXQogfQogCiBzdGF0aWNfbGlicmFyeSgiZm9ybWZpbGxlciIpIHsKQEAgLTgyNSw2MCArNzM4LDc1NiBAQAogICAgICJmcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5oIiwKICAgICAiZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmgiLAogICAgICJmcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfTGlzdEJveC5oIiwKLSAgICAiZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX05vdGlmeS5oIiwKICAgICAiZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1B1c2hCdXR0b24uaCIsCiAgICAgImZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9SYWRpb0J1dHRvbi5oIiwKICAgICAiZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1RleHRGaWVsZC5oIiwKLSAgICAiZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1V0aWxzLmgiLAotICAgICJmcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9Gb3JtRmlsbGVyLmgiLAogICAgICJmcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9DQkFfRm9udG1hcC5jcHAiLAogICAgICJmcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9DaGVja0JveC5jcHAiLAogICAgICJmcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9Db21ib0JveC5jcHAiLAogICAgICJmcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9Gb3JtRmlsbGVyLmNwcCIsCiAgICAgImZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmNwcCIsCiAgICAgImZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0xpc3RCb3guY3BwIiwKLSAgICAiZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfTm90aWZ5LmNwcCIsCiAgICAgImZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1B1c2hCdXR0b24uY3BwIiwKICAgICAiZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfUmFkaW9CdXR0b24uY3BwIiwKICAgICAiZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfVGV4dEZpZWxkLmNwcCIsCi0gICAgImZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1V0aWxzLmNwcCIsCiAgIF0KLSAgY29uZmlncyAtPSBbICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpjaHJvbWl1bV9jb2RlIiBdCi0gIGNvbmZpZ3MgKz0gWwotICAgICI6cGRmaXVtX2NvbmZpZyIsCi0gICAgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOm5vX2Nocm9taXVtX2NvZGUiLAotICBdCisgIGNvbmZpZ3MgKz0gWyAiOnBkZml1bV9jb25maWciIF0KK30KKworaWYgKHBkZl9lbmFibGVfeGZhKSB7CisgIHN0YXRpY19saWJyYXJ5KCJmcGRmeGZhIikgeworICAgIHNvdXJjZXMgPSBbCisgICAgICAiZnBkZnNkay9zcmMvZnBkZnhmYS9mcGRmeGZhX2FwcC5jcHAiLAorICAgICAgImZwZGZzZGsvc3JjL2ZwZGZ4ZmEvZnBkZnhmYV9kb2MuY3BwIiwKKyAgICAgICJmcGRmc2RrL3NyYy9mcGRmeGZhL2ZwZGZ4ZmFfcGFnZS5jcHAiLAorICAgICAgImZwZGZzZGsvc3JjL2ZwZGZ4ZmEvZnBkZnhmYV91dGlsLmNwcCIsCisgICAgICAiZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9hcHAuaCIsCisgICAgICAiZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9kb2MuaCIsCisgICAgICAiZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9wYWdlLmgiLAorICAgICAgImZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfdXRpbC5oIiwKKyAgICBdCisgICAgZGVwcyA9IFsKKyAgICAgICI6eGZhIiwKKyAgICBdCisgICAgY29uZmlncyAtPSBbICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpjaHJvbWl1bV9jb2RlIiBdCisgICAgY29uZmlncyArPSBbICI6cGRmaXVtX2NvbmZpZyIsICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpub19jaHJvbWl1bV9jb2RlIiBdCisgIH0KKworICBzdGF0aWNfbGlicmFyeSgieGZhIikgeworICAgIHNvdXJjZXMgPSBbCisgICAgICAieGZhL2luY2x1ZGUvZm94aXR4ZmEuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJjbGlwYm9hcmRtZ3IuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJjdXJzb3JtZ3IuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJtb25pdG9ybWdyLmgiLAorICAgICAgInhmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVybmF0aXZlLmgiLAorICAgICAgInhmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVydGhyZWFkbWdyLmgiLAorICAgICAgInhmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVydGltZXJtZ3IuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJ3aWRnZXRtZ3IuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX3NkYWRhcHRlcmltcC5oIiwKKyAgICAgICJ4ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfYmFyY29kZS5oIiwKKyAgICAgICJ4ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfY2FyZXQuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2NoZWNrYm94LmgiLAorICAgICAgInhmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9jb21ib2JveC5oIiwKKyAgICAgICJ4ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfZGF0ZXRpbWVwaWNrZXIuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2VkaXQuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2xpc3Rib3guaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX21lbnUuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX21vbnRoY2FsZW5kYXIuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX3BpY3R1cmVib3guaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX3B1c2hidXR0b24uaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX3Njcm9sbGJhci5oIiwKKyAgICAgICJ4ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfc3BpbmJ1dHRvbi5oIiwKKyAgICAgICJ4ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfdG9vbHRpcGN0cmwuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZnhtYXRoX2JhcmNvZGUuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2FwcC5oIiwKKyAgICAgICJ4ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfY29udGVudC5oIiwKKyAgICAgICJ4ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfZXJyb3IuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2Zvcm0uaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2dyaWQuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX25vdGUuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3BhbmVsLmgiLAorICAgICAgInhmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF90YXJnZXQuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3RoZW1lLmgiLAorICAgICAgInhmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF90aHJlYWQuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3RpbWVyLmgiLAorICAgICAgInhmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF93aWRnZXQuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3dpZGdldGRlZi5oIiwKKyAgICAgICJ4ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfd2lkZ2V0bWdyLmgiLAorICAgICAgInhmYS9pbmNsdWRlL2Z3bC9md2wuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2FwcC5oIiwKKyAgICAgICJ4ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvYmFyY29kZS5oIiwKKyAgICAgICJ4ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvY2FyZXQuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2NoZWNrYm94LmgiLAorICAgICAgInhmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9jb21ib2JveC5oIiwKKyAgICAgICJ4ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvZGF0ZXRpbWVwaWNrZXIuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2VkaXQuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2xpc3Rib3guaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3BpY3R1cmVib3guaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3B1c2hidXR0b24uaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3Njcm9sbGJhci5oIiwKKyAgICAgICJ4ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvdGhlbWUuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3Rvb2x0aXBjdHJsLmgiLAorICAgICAgInhmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC93aWRnZXQuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL3RoZW1lL2JhcmNvZGV0cC5oIiwKKyAgICAgICJ4ZmEvaW5jbHVkZS9md2wvdGhlbWUvY2FyZXR0cC5oIiwKKyAgICAgICJ4ZmEvaW5jbHVkZS9md2wvdGhlbWUvY2hlY2tib3h0cC5oIiwKKyAgICAgICJ4ZmEvaW5jbHVkZS9md2wvdGhlbWUvY29tYm9ib3h0cC5oIiwKKyAgICAgICJ4ZmEvaW5jbHVkZS9md2wvdGhlbWUvZGF0ZXRpbWVwaWNrZXJ0cC5oIiwKKyAgICAgICJ4ZmEvaW5jbHVkZS9md2wvdGhlbWUvZWRpdHRwLmgiLAorICAgICAgInhmYS9pbmNsdWRlL2Z3bC90aGVtZS9mb3JtdHAuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL3RoZW1lL2xpc3Rib3h0cC5oIiwKKyAgICAgICJ4ZmEvaW5jbHVkZS9md2wvdGhlbWUvbW9udGhjYWxlbmRhcnRwLmgiLAorICAgICAgInhmYS9pbmNsdWRlL2Z3bC90aGVtZS9waWN0dXJlYm94dHAuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL3RoZW1lL3B1c2hidXR0b250cC5oIiwKKyAgICAgICJ4ZmEvaW5jbHVkZS9md2wvdGhlbWUvc2Nyb2xsYmFydHAuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZndsL3RoZW1lL3V0aWxzLmgiLAorICAgICAgInhmYS9pbmNsdWRlL2Z3bC90aGVtZS93aWRnZXR0cC5oIiwKKyAgICAgICJ4ZmEvaW5jbHVkZS9meGJhcmNvZGUvQkNfQmFyQ29kZS5oIiwKKyAgICAgICJ4ZmEvaW5jbHVkZS9meGZhL2Z4ZmEuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZnhmYS9meGZhX2Jhc2ljLmgiLAorICAgICAgInhmYS9pbmNsdWRlL2Z4ZmEvZnhmYV9vYmplY3RhY2MuaCIsCisgICAgICAieGZhL2luY2x1ZGUvZnhmYS9meGZhX3dpZGdldC5oIiwKKyAgICAgICJ4ZmEvaW5jbHVkZS9meGdyYXBoaWNzL2Z4X2dyYXBoaWNzLmgiLAorICAgICAgInhmYS9pbmNsdWRlL2Z4anNlL2Z4anNlLmgiLAorICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlLmgiLAorICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX2Jycy5oIiwKKyAgICAgICJ4ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9jc3MuaCIsCisgICAgICAieGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfaW1nLmgiLAorICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX21lbS5oIiwKKyAgICAgICJ4ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9wZW4uaCIsCisgICAgICAieGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfcHNyLmgiLAorICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3B0aC5oIiwKKyAgICAgICJ4ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9yZHIuaCIsCisgICAgICAieGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfcmR2LmgiLAorICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3R0by5oIiwKKyAgICAgICJ4ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV94bWwuaCIsCisgICAgICAieGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3NzY2FjaGUuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NjYWNoZS5oIiwKKyAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NkYXRhdGFibGUuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NkYXRhdGFibGUuaCIsCisgICAgICAieGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3NzZGVjbGFyYXRpb24uY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NkZWNsYXJhdGlvbi5oIiwKKyAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzdHlsZXNlbGVjdG9yLmNwcCIsCisgICAgICAieGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3Nzc3R5bGVzZWxlY3Rvci5oIiwKKyAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzdHlsZXNoZWV0LmNwcCIsCisgICAgICAieGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3Nzc3R5bGVzaGVldC5oIiwKKyAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzeW50YXguY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzeW50YXguaCIsCisgICAgICAieGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZGV2YmFzaWMuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9kZXZiYXNpYy5oIiwKKyAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZWRldmljZS5jcHAiLAorICAgICAgInhmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2dlZGV2aWNlLmgiLAorICAgICAgInhmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2dlb2JqZWN0LmNwcCIsCisgICAgICAieGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZ2VvYmplY3QuaCIsCisgICAgICAieGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfaXRlcmF0b3IuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9pdGVyYXRvci5oIiwKKyAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9vYmplY3QuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9vYmplY3QuaCIsCisgICAgICAieGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfcmVuZGVyLmNwcCIsCisgICAgICAieGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfcmVuZGVyLmgiLAorICAgICAgInhmYS9zcmMvZmRwL3NyYy90dG8vZmRlX3RleHRvdXQuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvdHRvL2ZkZV90ZXh0b3V0LmgiLAorICAgICAgInhmYS9zcmMvZmRwL3NyYy94bWwvZmRlX3htbC5jcHAiLAorICAgICAgInhmYS9zcmMvZmRwL3NyYy94bWwvZmRlX3htbC5oIiwKKyAgICAgICJ4ZmEvc3JjL2ZlZS9pbmNsdWRlL2Z4X3dvcmRicmVhay5oIiwKKyAgICAgICJ4ZmEvc3JjL2ZlZS9pbmNsdWRlL2lmZGVfdHh0ZWR0YnVmLmgiLAorICAgICAgInhmYS9zcmMvZmVlL2luY2x1ZGUvaWZkZV90eHRlZHRlbmdpbmUuaCIsCisgICAgICAieGZhL3NyYy9mZWUvaW5jbHVkZS9pZmRlX3R4dGVkdHBhZ2UuaCIsCisgICAgICAieGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0YmxvY2suY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRibG9jay5oIiwKKyAgICAgICJ4ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRidWYuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRidWYuaCIsCisgICAgICAieGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0ZW5naW5lLmNwcCIsCisgICAgICAieGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0ZW5naW5lLmgiLAorICAgICAgInhmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdHBhZ2UuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRwYWdlLmgiLAorICAgICAgInhmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdHBhcmFnLmNwcCIsCisgICAgICAieGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0cGFyYWcuaCIsCisgICAgICAieGZhL3NyYy9mZWUvc3JjL2Z4X3dvcmRicmVhay9meF93b3JkYnJlYWtkYXRhLmNwcCIsCisgICAgICAieGZhL3NyYy9mZWUvc3JjL2Z4X3dvcmRicmVhay9meF93b3JkYnJlYWtfaW1wbC5jcHAiLAorICAgICAgInhmYS9zcmMvZmVlL3NyYy9meF93b3JkYnJlYWsvZnhfd29yZGJyZWFrX2ltcGwuaCIsCisgICAgICAieGZhL3NyYy9mZ2FzL2luY2x1ZGUvZmdhcy5oIiwKKyAgICAgICJ4ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9hbGcuaCIsCisgICAgICAieGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfY3BnLmgiLAorICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2RhdGV0aW1lLmgiLAorICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2ZudC5oIiwKKyAgICAgICJ4ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9sYmsuaCIsCisgICAgICAieGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfbGdnLmgiLAorICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2xvY2FsZS5oIiwKKyAgICAgICJ4ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9tZW0uaCIsCisgICAgICAieGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfcmJrLmgiLAorICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3NheC5oIiwKKyAgICAgICJ4ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9zdG0uaCIsCisgICAgICAieGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfc3lzLmgiLAorICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3Riay5oIiwKKyAgICAgICJ4ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF91Y2QuaCIsCisgICAgICAieGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfdXRsLmgiLAorICAgICAgInhmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X2FsZ29yaXRobS5jcHAiLAorICAgICAgInhmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X2NvZGVwYWdlLmNwcCIsCisgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfZW5jb2RlLmNwcCIsCisgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfbWVtb3J5LmNwcCIsCisgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfbWVtb3J5LmgiLAorICAgICAgInhmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3N0cmVhbS5jcHAiLAorICAgICAgInhmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3N0cmVhbS5oIiwKKyAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9zeXN0ZW0uY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF91dGlscy5jcHAiLAorICAgICAgInhmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3V0aWxzLmgiLAorICAgICAgInhmYS9zcmMvZmdhcy9zcmMvZmdhc19iYXNlLmgiLAorICAgICAgInhmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9mb250dXRpbHMuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfZm9udHV0aWxzLmgiLAorICAgICAgInhmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9nZWZvbnQuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfZ2Vmb250LmgiLAorICAgICAgInhmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9zdGRmb250bWdyLmNwcCIsCisgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X3N0ZGZvbnRtZ3IuaCIsCisgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfbGluZWJyZWFrLmNwcCIsCisgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfcnRmYnJlYWsuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF9ydGZicmVhay5oIiwKKyAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF90ZXh0YnJlYWsuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF90ZXh0YnJlYWsuaCIsCisgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfdW5pY29kZS5jcHAiLAorICAgICAgInhmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3VuaWNvZGUuaCIsCisgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9sb2NhbGl6YXRpb24vZnhfZGF0ZXRpbWUuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2xvY2FsaXphdGlvbi9meF9sb2NhbGUuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2xvY2FsaXphdGlvbi9meF9sb2NhbGVpbXAuaCIsCisgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9sb2NhbGl6YXRpb24vZnhfbG9jYWxlbWdyLmNwcCIsCisgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9sb2NhbGl6YXRpb24vZnhfbG9jYWxlbWdyLmgiLAorICAgICAgInhmYS9zcmMvZmdhcy9zcmMveG1sL2Z4X3NheF9pbXAuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL3htbC9meF9zYXhfaW1wLmgiLAorICAgICAgInhmYS9zcmMvZm94aXRsaWIuaCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2JhcmNvZGVpbXAuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfY2FyZXRpbXAuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfY2hlY2tib3hpbXAuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfY29tYm9ib3hpbXAuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfZGF0ZXRpbWVwaWNrZXJpbXAuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfZWRpdGltcC5jcHAiLAorICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9mb3JtcHJveHlpbXAuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfbGlzdGJveGltcC5jcHAiLAorICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9tb250aGNhbGVuZGFyaW1wLmNwcCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3BpY3R1cmVib3hpbXAuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfcHVzaGJ1dHRvbmltcC5jcHAiLAorICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9zY3JvbGxiYXJpbXAuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfc3BpbmJ1dHRvbmltcC5jcHAiLAorICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF90b29sdGlwY3RybGltcC5jcHAiLAorICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z4bWF0aF9iYXJjb2RlaW1wLmNwcCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfYmFyY29kZWltcC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9jYXJldGltcC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9jaGVja2JveGltcC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9jb21ib2JveGltcC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9kYXRldGltZXBpY2tlcmltcC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9lZGl0aW1wLmgiLAorICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2Zvcm1wcm94eWltcC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9saXN0Ym94aW1wLmgiLAorICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX21vbnRoY2FsZW5kYXJpbXAuaCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfcGljdHVyZWJveGltcC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9wdXNoYnV0dG9uaW1wLmgiLAorICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3Njcm9sbGJhcmltcC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9zcGluYnV0dG9uaW1wLmgiLAorICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3Rvb2x0aXBjdHJsaW1wLmgiLAorICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZnhtYXRoX2JhcmNvZGVpbXAuaCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX2FwcGltcC5jcHAiLAorICAgICAgInhmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9jb250ZW50aW1wLmNwcCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX2Zvcm1pbXAuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfZ3JpZGltcC5jcHAiLAorICAgICAgInhmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9ub3RlaW1wLmNwcCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3BhbmVsaW1wLmNwcCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3NkYWRhcHRlcmltcC5jcHAiLAorICAgICAgInhmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF90YXJnZXRpbXAuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfdGhyZWFkaW1wLmNwcCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3RpbWVyaW1wLmNwcCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3dpZGdldGltcC5jcHAiLAorICAgICAgInhmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF93aWRnZXRtZ3JpbXAuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9hcHBpbXAuaCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfY29udGVudGltcC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9mb3JtaW1wLmgiLAorICAgICAgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX2dyaWRpbXAuaCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9wYW5lbGltcC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF90YXJnZXRpbXAuaCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGhyZWFkaW1wLmgiLAorICAgICAgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3dpZGdldGltcC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF93aWRnZXRtZ3JpbXAuaCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2FwcC5jcHAiLAorICAgICAgInhmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9iYXJjb2RlLmNwcCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2NhcmV0LmNwcCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2NoZWNrYm94LmNwcCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2NvbWJvYm94LmNwcCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2RhdGV0aW1lcGlja2VyLmNwcCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2VkaXQuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvbGlzdGJveC5jcHAiLAorICAgICAgInhmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9waWN0dXJlYm94LmNwcCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3B1c2hidXR0b24uY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvc2Nyb2xsYmFyLmNwcCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3RoZW1lLmNwcCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3Rvb2x0aXBjdHJsLmNwcCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3dpZGdldC5jcHAiLAorICAgICAgInhmYS9zcmMvZndsL3NyYy90aGVtZS9iYXJjb2RldHAuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvY2FyZXR0cC5jcHAiLAorICAgICAgInhmYS9zcmMvZndsL3NyYy90aGVtZS9jaGVja2JveHRwLmNwcCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL3RoZW1lL2NvbWJvYm94dHAuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvZGF0ZXRpbWVwaWNrZXJ0cC5jcHAiLAorICAgICAgInhmYS9zcmMvZndsL3NyYy90aGVtZS9lZGl0dHAuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvZm9ybXRwLmNwcCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL3RoZW1lL2xpc3Rib3h0cC5jcHAiLAorICAgICAgInhmYS9zcmMvZndsL3NyYy90aGVtZS9tb250aGNhbGVuZGFydHAuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvcGljdHVyZWJveHRwLmNwcCIsCisgICAgICAieGZhL3NyYy9md2wvc3JjL3RoZW1lL3B1c2hidXR0b250cC5jcHAiLAorICAgICAgInhmYS9zcmMvZndsL3NyYy90aGVtZS9zY3JvbGxiYXJ0cC5jcHAiLAorICAgICAgInhmYS9zcmMvZndsL3NyYy90aGVtZS93aWRnZXR0cC5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRBcnJheS5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0U291cmNlLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVBcnJheS5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CeXRlTWF0cml4LmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSS5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25EZWNvZGVyUmVzdWx0LmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkVDSS5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybS5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRBcnJheS5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRTb3VyY2UuaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVBcnJheS5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZU1hdHJpeC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25EZWNvZGVyUmVzdWx0LmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25FQ0kuaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3IuaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplci5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIuaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uRGVjb2Rlci5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2LmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5LmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkRlY29kZXIuaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTYuaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5LmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlci5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERhdGFCbG9jay5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXIuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhEZWNvZGVyLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4RGV0ZWN0b3IuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhSZWFkZXIuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0LmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4VmVyc2lvbi5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFdyaXRlci5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlci5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhEYXRhQmxvY2suaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlci5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhEZWNvZGVyLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERldGVjdG9yLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFJlYWRlci5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0LmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFZlcnNpb24uaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4V3JpdGVyLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQVNDSUlFbmNvZGVyLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19CYXNlMjU2RW5jb2Rlci5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQzQwRW5jb2Rlci5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRWRpZmFjdEVuY29kZXIuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXJDb250ZXh0LmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FcnJvckNvcnJlY3Rpb24uY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbEluZm8uY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbFNoYXBlSGludC5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfVGV4dEVuY29kZXIuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1gxMkVuY29kZXIuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RlZmF1bHRQbGFjZW1lbnQuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0hpZ2hMZXZlbEVuY29kZXIuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0FTQ0lJRW5jb2Rlci5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Jhc2UyNTZFbmNvZGVyLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQzQwRW5jb2Rlci5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VkaWZhY3RFbmNvZGVyLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2RlckNvbnRleHQuaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FcnJvckNvcnJlY3Rpb24uaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xJbmZvLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sU2hhcGVIaW50LmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfVGV4dEVuY29kZXIuaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19YMTJFbmNvZGVyLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGVmYXVsdFBsYWNlbWVudC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19IaWdoTGV2ZWxFbmNvZGVyLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGFCYXJSZWFkZXIuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyV3JpdGVyLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTEyOFJlYWRlci5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhXcml0ZXIuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlSZWFkZXIuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlXcml0ZXIuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU4xM1JlYWRlci5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjEzV3JpdGVyLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFJlYWRlci5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjhXcml0ZXIuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVJlYWRlci5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lRGltV3JpdGVyLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVEUmVhZGVyLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkVVBDQVJlYWRlci5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZFVQQ0FXcml0ZXIuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyUmVhZGVyLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGFCYXJXcml0ZXIuaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTEyOFJlYWRlci5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMTI4V3JpdGVyLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUzOVJlYWRlci5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlXcml0ZXIuaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNSZWFkZXIuaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNXcml0ZXIuaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFJlYWRlci5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU44V3JpdGVyLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lRGltUmVhZGVyLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lRGltV3JpdGVyLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lRFJlYWRlci5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRVUENBUmVhZGVyLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZFVQQ0FXcml0ZXIuaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxNy5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlTWF0cml4LmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVNZXRhZGF0YS5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlUm93LmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVWYWx1ZS5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCb3VuZGluZ0JveC5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb2Rld29yZC5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb2Rld29yZERlY29kZXIuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29tbW9uLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbXBhY3Rpb24uY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGVjb2RlZEJpdFN0cmVhbVBhcnNlci5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3Rpb25SZXN1bHQuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Q29sdW1uLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbi5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3Rvci5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3RvclJlc3VsdC5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEaW1lbnNpb25zLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0VDTW9kdWx1c0dGLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0VDTW9kdWx1c1BvbHkuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXIuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3UmVhZGVyLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlci5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdXcml0ZXIuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3LmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlTWF0cml4LmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlTWV0YWRhdGEuaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVSb3cuaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVWYWx1ZS5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Qm91bmRpbmdCb3guaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvZGV3b3JkLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb2Rld29yZERlY29kZXIuaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbW1vbi5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29tcGFjdGlvbi5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGVjb2RlZEJpdFN0cmVhbVBhcnNlci5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0LmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3Rpb25SZXN1bHRDb2x1bW4uaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbi5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0b3IuaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdG9yUmVzdWx0LmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEaW1lbnNpb25zLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbi5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RUNNb2R1bHVzR0YuaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0VDTW9kdWx1c1BvbHkuaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbi5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlci5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3UmVhZGVyLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdSZXN1bHRNZXRhZGF0YS5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdXcml0ZXIuaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQWxpZ25tZW50UGF0dGVybi5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXIuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJCaXRNYXRyaXhQYXJzZXIuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlci5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyQml0VmVjdG9yLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCbG9ja1BhaXIuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckRlY29kZXIuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlUmVhZGVyLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0IuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQmxvY2tzLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFbmNvZGVyLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbC5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24uY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hc2tVdGlsLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNYXRyaXhVdGlsLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNb2RlLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJWZXJzaW9uLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZVdyaXRlci5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRhdGFCbG9jay5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRhdGFNYXNrLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlci5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRldGVjdG9yLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGV0ZWN0b3JSZXN1bHQuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJGaW5kZXJQYXR0ZXJuLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRmluZGVyUGF0dGVybkZpbmRlci5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkdyaWRTYW1wbGVyLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQWxpZ25tZW50UGF0dGVybi5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkJpdE1hdHJpeFBhcnNlci5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlci5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckJpdFZlY3Rvci5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckJsb2NrUGFpci5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckRlY29kZXIuaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZVJlYWRlci5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQi5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQmxvY2tzLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRW5jb2Rlci5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24uaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNYXNrVXRpbC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hdHJpeFV0aWwuaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNb2RlLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyVmVyc2lvbi5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlV3JpdGVyLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRhdGFCbG9jay5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEYXRhTWFzay5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRldGVjdG9yLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRldGVjdG9yUmVzdWx0LmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkZpbmRlclBhdHRlcm4uaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRmluZGVyUGF0dGVybkZpbmRlci5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJHcmlkU2FtcGxlci5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfRmluZGVyUGF0dGVybkluZm8uY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfRmluZGVyUGF0dGVybkluZm8uaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvQkNfQmFyQ29kZS5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL0JDX0JpbmFyaXplci5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL0JDX0JpbmFyeUJpdG1hcC5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2UuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19EaW1lbnNpb24uY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19MaWJyYXJ5LmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvQkNfTHVtaW5hbmNlU291cmNlLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvQkNfUmVhZGVyLmNwcCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvQkNfUmVzdWx0UG9pbnQuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19Ud29EaW1Xcml0ZXIuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19VdGlsQ29kaW5nQ29udmVydC5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1V0aWxSU1MuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19VdGlscy5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1dyaXRlci5jcHAiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL0JDX0JpbmFyaXplci5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19CaW5hcnlCaXRtYXAuaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZS5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19EZWNvZGVyUmVzdWx0LmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL0JDX0RpbWVuc2lvbi5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19MdW1pbmFuY2VTb3VyY2UuaCIsCisgICAgICAieGZhL3NyYy9meGJhcmNvZGUvQkNfUmVhZGVyLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1Jlc3VsdFBvaW50LmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1R3b0RpbVdyaXRlci5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19VdGlsQ29kaW5nQ29udmVydC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19VdGlsUlNTLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1dyaXRlci5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiLAorICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3V0aWxzLmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9jaGVja3N1bS5jcHAiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9jaGVja3N1bS5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZhcHAuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZhcHAuaCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmYmFyY29kZS5jcHAiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmJhcmNvZGUuaCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmY2hlY2tidXR0b24uY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZjaGVja2J1dHRvbi5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZjaG9pY2VsaXN0LmNwcCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmY2hvaWNlbGlzdC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZDb25maWdBY2MuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZDb25maWdBY2MuaCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZG9jLmNwcCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZG9jLmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvY2hhbmRsZXIuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2NoYW5kbGVyLmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvY3ZpZXcuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2N2aWV3LmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRyYXcuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkcmF3LmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmV4Y2xncm91cC5jcHAiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmV4Y2xncm91cC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZmaWVsZC5jcHAiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmZpZWxkLmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmltYWdlLmNwcCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmaW1hZ2UuaCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmaW1hZ2VlZGl0LmNwcCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmaW1hZ2VlZGl0LmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZm5vdGlmeS5jcHAiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZm5vdGlmeS5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwYWdldmlldy5jcHAiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnBhZ2V2aWV3LmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnBhdGguY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwYXRoLmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnB1c2hidXR0b24uY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwdXNoYnV0dG9uLmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnNpZ25hdHVyZS5jcHAiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnNpZ25hdHVyZS5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZzdWJmb3JtLmNwcCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmc3ViZm9ybS5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ0ZXh0LmNwcCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmdGV4dC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ0ZXh0ZWRpdC5jcHAiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnRleHRlZGl0LmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZndpZGdldC5jcHAiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZndpZGdldC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXRhY2MuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXRhY2MuaCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0aGFuZGxlci5jcHAiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZndpZGdldGhhbmRsZXIuaCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZvbnRtZ3IuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZm9udG1nci5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZndsYWRhcHRlci5jcHAiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9md2xhZGFwdGVyLmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9md2x0aGVtZS5jcHAiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9md2x0aGVtZS5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfcmVuZGVyY29udGV4dC5jcHAiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9yZW5kZXJjb250ZXh0LmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV90ZXh0bGF5b3V0LmNwcCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX3RleHRsYXlvdXQuaCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9jb21tb24vZnhmYV9sb2NhbGV2YWx1ZS5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfY29tbW9uLmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NkYXRhLmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NsYXlvdXQuaCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY3VtZW50LmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9mbTJqc2FwaS5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfbG9jYWxlbWdyLmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9vYmplY3QuaCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3BhcnNlci5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfc2NyaXB0LmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV91dGlscy5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9lcnJvci5jcHAiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2Vycm9yLmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2V4cHJlc3Npb24uY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9leHByZXNzaW9uLmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2ZtMmpzLmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2ZtMmpzYXBpLmNwcCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm0yanNjb250ZXh0LmNwcCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm0yanNjb250ZXh0LmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2ZtcGFyc2UuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbXBhcnNlLmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2xleGVyLmNwcCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfbGV4ZXIuaCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfcHJvZ3JhbS5jcHAiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX3Byb2dyYW0uaCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfc2ltcGxlZXhwcmVzc2lvbi5jcHAiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX3NpbXBsZWV4cHJlc3Npb24uaCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2Jhc2ljX2RhdGEuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfYmFzaWNfaW1wLmNwcCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2Jhc2ljX2ltcC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfZGF0YWRlc2NyaXB0aW9uX2ltcC5jcHAiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9kYXRhZGVzY3JpcHRpb25faW1wLmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9kYXRhbWVyZ2VyX2ltcC5jcHAiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9kYXRhbWVyZ2VyX2ltcC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfaW1wLmNwcCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2xheW91dF9pbXAuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfbGF5b3V0X2ltcC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfc2VyaWFsaXplLmNwcCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X3NlcmlhbGl6ZS5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X2FwcGFkYXB0ZXIuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X2FwcGFkYXB0ZXIuaCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9pdGVtbGF5b3V0LmNwcCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9pdGVtbGF5b3V0LmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sYXlvdXRfcGFnZW1ncl9uZXcuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X3BhZ2VtZ3JfbmV3LmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sb2NhbGUuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbG9jYWxlLmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sb2NhbGVtZ3IuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbG9jYWxldmFsdWUuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfb2JqZWN0YWNjX2ltcC5jcHAiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9vYmplY3RfaW1wLmNwcCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3BhcnNlcl9pbXAuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfcGFyc2VyX2ltcC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2RhdGF3aW5kb3cuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2RhdGF3aW5kb3cuaCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ldmVudHBzZXVkb21vZGVsLmNwcCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ldmVudHBzZXVkb21vZGVsLmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfaG9zdHBzZXVkb21vZGVsLmNwcCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ob3N0cHNldWRvbW9kZWwuaCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9pbXAuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2ltcC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2xheW91dHBzZXVkb21vZGVsLmNwcCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9sYXlvdXRwc2V1ZG9tb2RlbC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2xvZ3BzZXVkb21vZGVsLmNwcCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9sb2dwc2V1ZG9tb2RlbC5oIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X25vZGVoZWxwZXIuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X25vZGVoZWxwZXIuaCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9yZXNvbHZlcHJvY2Vzc29yLmNwcCIsCisgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9yZXNvbHZlcHJvY2Vzc29yLmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfc2lnbmF0dXJlcHNldWRvbW9kZWwuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X3NpZ25hdHVyZXBzZXVkb21vZGVsLmgiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV91dGlsc19pbXAuY3BwIiwKKyAgICAgICJ4ZmEvc3JjL2Z4Z3JhcGhpY3Mvc3JjL2Z4X2dyYXBoaWNzLmNwcCIsCisgICAgICAieGZhL3NyYy9meGdyYXBoaWNzL3NyYy9meF9wYXRoX2dlbmVyYXRvci5jcHAiLAorICAgICAgInhmYS9zcmMvZnhncmFwaGljcy9zcmMvZnhfcGF0aF9nZW5lcmF0b3IuaCIsCisgICAgICAieGZhL3NyYy9meGdyYXBoaWNzL3NyYy9wcmUuaCIsCisgICAgXQorICAgIGluY2x1ZGVfZGlycyA9IFsKKyAgICAgICIuIiwKKyAgICBdCisgICAgaWYgKHBkZl9lbmFibGVfdjgpIHsKKyAgICAgIHNvdXJjZXMgKz0gWworICAgICAgICAieGZhL3NyYy9meGpzZS9zcmMvY2xhc3MuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhqc2Uvc3JjL2NsYXNzLmgiLAorICAgICAgICAieGZhL3NyYy9meGpzZS9zcmMvY29udGV4dC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGpzZS9zcmMvY29udGV4dC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhqc2Uvc3JjL2R5bnByb3AuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhqc2Uvc3JjL3J1bnRpbWUuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhqc2Uvc3JjL3J1bnRpbWUuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4anNlL3NyYy9zY29wZV9pbmxpbmUuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4anNlL3NyYy91dGlsX2lubGluZS5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhqc2Uvc3JjL3ZhbHVlLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4anNlL3NyYy92YWx1ZS5oIgorICAgICAgXQorICAgICAgaW5jbHVkZV9kaXJzICs9IFsKKyAgICAgICAgIi8vdjgiLAorICAgICAgICAiLy92OC9pbmNsdWRlIiwKKyAgICAgIF0KKyAgICAgIHB1YmxpY19kZXBzID0gWworICAgICAgICAiLy92OCIsCisgICAgICBdCisgICAgICBkZXBzID0gWworICAgICAgICAiLy92ODp2OF9saWJwbGF0Zm9ybSIsCisgICAgICBdCisgICAgfQorICAgIGNvbmZpZ3MgLT0gWyAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6Y2hyb21pdW1fY29kZSIgXQorICAgIGNvbmZpZ3MgKz0gWworICAgICAgIjpwZGZpdW1fY29uZmlnIiwKKyAgICAgICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpub19jaHJvbWl1bV9jb2RlIiwKKyAgICBdCisgIH0KIH0KIAogdGVzdCgicGRmaXVtX3VuaXR0ZXN0cyIpIHsKICAgc291cmNlcyA9IFsKKyAgICAiY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZnBkZl9mb250X2NpZF91bml0dGVzdC5jcHAiLAorICAgICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnRfdW5pdHRlc3QuY3BwIiwKKyAgICAiY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhcnNlcl9vbGRfdW5pdHRlc3QuY3BwIiwKKyAgICAiY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGVfdW5pdHRlc3QuY3BwIiwKKyAgICAiY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9wYXJzZXJfdW5pdHRlc3QuY3BwIiwKKyAgICAiY29yZS9zcmMvZnBkZnRleHQvZnBkZl90ZXh0X2ludF91bml0dGVzdC5jcHAiLAogICAgICJjb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pweF91bml0dGVzdC5jcHAiLAogICAgICJjb3JlL3NyYy9meGNydC9meF9iYXNpY19ic3RyaW5nX3VuaXR0ZXN0LmNwcCIsCiAgICAgImNvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX21lbW1ncl91bml0dGVzdC5jcHAiLAogICAgICJjb3JlL3NyYy9meGNydC9meF9iYXNpY193c3RyaW5nX3VuaXR0ZXN0LmNwcCIsCi0gICAgInRlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmNwcCIsCi0gICAgInRlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmgiLAorICAgICJjb3JlL3NyYy9meGNydC9meF9iaWRpX3VuaXR0ZXN0LmNwcCIsCisgICAgImNvcmUvc3JjL2Z4Y3J0L2Z4X2V4dGVuc2lvbl91bml0dGVzdC5jcHAiLAorICAgICJjb3JlL3NyYy9meGNydC9meF9zeXN0ZW1fdW5pdHRlc3QuY3BwIiwKICAgXQogICBkZXBzID0gWwogICAgICIvL3Rlc3RpbmcvZ3Rlc3QiLAogICAgICIvL3Rlc3RpbmcvZ3Rlc3Q6Z3Rlc3RfbWFpbiIsCiAgICAgIjpwZGZpdW0iLAorICAgICI6dGVzdF9zdXBwb3J0IiwKICAgXQotICBpbmNsdWRlX2RpcnMgPSBbICIuIiBdCi0gIGNvbmZpZ3MgLT0gWyAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6Y2hyb21pdW1fY29kZSIgXQotICBjb25maWdzICs9IFsKLSAgICAiOnBkZml1bV9jb25maWciLAotICAgICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpub19jaHJvbWl1bV9jb2RlIiwKLSAgXQorICBpZiAocGRmX2VuYWJsZV94ZmEpIHsKKyAgICBzb3VyY2VzICs9IFsKKyAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcl91bml0dGVzdC5jcHAiLAorICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV91dGlsc19pbXBfdW5pdHRlc3QuY3BwIiwKKyAgICBdCisgIH0KKyAgY29uZmlncyArPSBbICI6cGRmaXVtX2NvbmZpZyIgXQogfQogCiB0ZXN0KCJwZGZpdW1fZW1iZWRkZXJ0ZXN0cyIpIHsKICAgc291cmNlcyA9IFsKKyAgICAiY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2Z1bmNfZW1iZWRkZXJ0ZXN0LmNwcCIsCiAgICAgImNvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlX2VtYmVkZGVydGVzdC5jcHAiLAogICAgICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX3BhcnNlcl9lbWJlZGRlcnRlc3QuY3BwIiwKKyAgICAiY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9sb2FkaW1hZ2VfZW1iZWRkZXJ0ZXN0LmNwcCIsCisgICAgImNvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfcGF0dGVybl9lbWJlZGRlcnRlc3QuY3BwIiwKICAgICAiZnBkZnNkay9zcmMvZnBkZl9kYXRhYXZhaWxfZW1iZWRkZXJ0ZXN0LmNwcCIsCiAgICAgImZwZGZzZGsvc3JjL2ZwZGZkb2NfZW1iZWRkZXJ0ZXN0LmNwcCIsCisgICAgImZwZGZzZGsvc3JjL2ZwZGZlZGl0X2VtYmVkZGVydGVzdC5jcHAiLAorICAgICJmcGRmc2RrL3NyYy9mcGRmZXh0X2VtYmVkZGVydGVzdC5jcHAiLAogICAgICJmcGRmc2RrL3NyYy9mcGRmZm9ybWZpbGxfZW1iZWRkZXJ0ZXN0LmNwcCIsCisgICAgImZwZGZzZGsvc3JjL2ZwZGZzYXZlX2VtYmVkZGVydGVzdC5jcHAiLAogICAgICJmcGRmc2RrL3NyYy9mcGRmdGV4dF9lbWJlZGRlcnRlc3QuY3BwIiwKICAgICAiZnBkZnNkay9zcmMvZnBkZnZpZXdfY19hcGlfdGVzdC5jIiwKICAgICAiZnBkZnNkay9zcmMvZnBkZnZpZXdfY19hcGlfdGVzdC5oIiwKQEAgLTg4NywyMyArMTQ5NiwzMSBAQAogICAgICJ0ZXN0aW5nL2VtYmVkZGVyX3Rlc3QuaCIsCiAgICAgInRlc3RpbmcvZW1iZWRkZXJfdGVzdF9tb2NrX2RlbGVnYXRlLmgiLAogICAgICJ0ZXN0aW5nL2VtYmVkZGVyX3Rlc3RfdGltZXJfaGFuZGxpbmdfZGVsZWdhdGUuaCIsCi0gICAgInRlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmNwcCIsCi0gICAgInRlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmgiLAorICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfcGFyc2VyX2ltcF9lbWJlZGRlcnRlc3QuY3BwIiwKICAgXQogICBkZXBzID0gWwogICAgICIvL3Rlc3RpbmcvZ21vY2siLAogICAgICIvL3Rlc3RpbmcvZ3Rlc3QiLAotICAgICIvL3Y4OnY4X2xpYnBsYXRmb3JtIiwKICAgICAiOnBkZml1bSIsCisgICAgIjp0ZXN0X3N1cHBvcnQiLAogICBdCi0gIGluY2x1ZGVfZGlycyA9IFsKLSAgICAiLy92OCIsCi0gICAgIi8vdjgvaW5jbHVkZSIsCi0gICAgIi4iCi0gIF0KLSAgY29uZmlncyAtPSBbICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpjaHJvbWl1bV9jb2RlIiBdCi0gIGNvbmZpZ3MgKz0gWwotICAgICI6cGRmaXVtX2NvbmZpZyIsCi0gICAgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOm5vX2Nocm9taXVtX2NvZGUiLAotICBdCisgIGluY2x1ZGVfZGlycyA9IFtdCisgIGlmIChwZGZfZW5hYmxlX3Y4KSB7CisgICAgc291cmNlcyArPSBbCisgICAgICAiZnBkZnNkay9zcmMvamF2YXNjcmlwdC9wdWJsaWNfbWV0aG9kc19lbWJlZGRlcnRlc3QuY3BwIiwKKyAgICAgICJmcGRmc2RrL3NyYy9qc2FwaS9meGpzX3Y4X2VtYmVkZGVydGVzdC5jcHAiLAorICAgICAgInRlc3RpbmcvanNfZW1iZWRkZXJfdGVzdC5jcHAiLAorICAgICAgInRlc3RpbmcvanNfZW1iZWRkZXJfdGVzdC5oIiwKKyAgICBdCisgICAgZGVwcyArPSBbCisgICAgICAiLy92OCIsCisgICAgICAiLy92ODp2OF9saWJwbGF0Zm9ybSIsCisgICAgXQorICAgIGluY2x1ZGVfZGlycyArPSBbCisgICAgICAiLy92OCIsCisgICAgICAiLy92OC9pbmNsdWRlIiwKKyAgICBdCisgICAgY29uZmlncyArPSBbICIvL3Y4OmV4dGVybmFsX3N0YXJ0dXBfZGF0YSIgXQorICB9CisgIGNvbmZpZ3MgKz0gWyAiOnBkZml1bV9jb25maWciIF0KIH0KZGlmZiAtLWdpdCBhL0RFUFMgYi9ERVBTCmluZGV4IGVmNTljMTQuLjc0ZjQ0YzIgMTAwNjQ0Ci0tLSBhL0RFUFMKKysrIGIvREVQUwpAQCAtNCw4ICs0LDExIEBACiAgICJidWlsZC9neXAiOgogICAgICJodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vZXh0ZXJuYWwvZ3lwIiwKIAorICAiYnVpbGR0b29scyI6CisgICAgImh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9idWlsZHRvb2xzLmdpdEBjMmYyNTk4MDlkNWVkZTMyNzVkZjVlYTA4NDJmMDQzMTk5MGM0Zjk4IiwKKwogICAidGVzdGluZy9jb3JwdXMiOgotICAgICAiaHR0cHM6Ly9wZGZpdW0uZ29vZ2xlc291cmNlLmNvbS9wZGZpdW1fdGVzdHNAOWNjMTU2N2E1ZWFiMTA2YzFmM2RiY2ZjYWRhODE1Yzk1MDVhYzkwNiIsCisgICAgICJodHRwczovL3BkZml1bS5nb29nbGVzb3VyY2UuY29tL3BkZml1bV90ZXN0c0BjYzEzMmZmODkyMWM3NmVhNjk4ODhjYWU0YmIwMGUwMWRkMWNlMGIzIiwKIAogICAidGVzdGluZy9nbW9jayI6CiAgICAgICJodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vZXh0ZXJuYWwvZ29vZ2xlbW9jay5naXRAMjk3NjM5NjVhYjUyZjI0NTY1Mjk5OTc2YjkzNmQxMjY1Y2I2YTI3MSIsCkBAIC0xMywxMSArMTYsMTcgQEAKICAgInRlc3RpbmcvZ3Rlc3QiOgogICAgICAiaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2V4dGVybmFsL2dvb2dsZXRlc3QuZ2l0QDgyNDU1NDViNmRjOWM0NzAzZTY0OTZkMWVmZDE5ZTk3NWFkMmIwMzgiLAogCisgICJ0b29scy9jbGFuZyI6CisgICAgImh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMvdG9vbHMvY2xhbmciLAorCiAgICJ2OCI6Ci0gICAgImh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS92OC92OC5naXQiLAorICAgICJodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vdjgvdjguZ2l0QGVlMTY3MWI5YWZkYjllYjIzMTc5ZDA4Y2QzZTU3M2U1MjBmNDU5MDQiLAorCisgICJ2OC9iYXNlL3RyYWNlX2V2ZW50L2NvbW1vbiI6CisgICAgImh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMvYmFzZS90cmFjZV9ldmVudC9jb21tb24uZ2l0QGQ4M2Q0NGIxM2QwN2MyZmQwYTQwMTAxYTdkZWVmOWI5M2I4NDE3MzIiLAogCiAgICJ2OC90aGlyZF9wYXJ0eS9pY3UiOgotICAgICJodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vZGVwcy9pY3U0NiIsCisgICAgImh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9kZXBzL2ljdS5naXRAOGQzNDJhNDA1YmU1YWU4YWFjYjFlMTZmMGJjMzFjM2E0ZmJmMjZhMiIsCiB9CiAKIGRlcHNfb3MgPSB7CkBAIC0yNiwzICszNSw1OSBAQAogICAgICAgImh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9kZXBzL2N5Z3dpbkBjODllNDQ2YjI3MzY5N2ZhZGYzYTEwZmYxMDA3YTk3YzBiN2RlNmRmIiwKICAgfSwKIH0KKworaW5jbHVkZV9ydWxlcyA9IFsKKyAgIyBCYXNpYyBzdHVmZiB0aGF0IGV2ZXJ5b25lIGNhbiB1c2UuCisgICMgTm90ZTogcHVibGljIGlzIG5vdCBoZXJlIGJlY2F1c2UgY29yZSBjYW5ub3QgZGVwZW5kIG9uIHB1YmxpYy4KKyAgJyt0ZXN0aW5nJywKKyAgJyt0aGlyZF9wYXJ0eS9iYXNlJywKK10KKworaG9va3MgPSBbCisgIHsKKyAgICAjIEEgY2hhbmdlIHRvIGEgLmd5cCwgLmd5cGksIG9yIHRvIEdZUCBpdHNlbGYgc2hvdWxkIHJ1biB0aGUgZ2VuZXJhdG9yLgorICAgICduYW1lJzogJ2d5cCcsCisgICAgJ3BhdHRlcm4nOiAnLicsCisgICAgJ2FjdGlvbic6IFsncHl0aG9uJywgJ3BkZml1bS9idWlsZC9neXBfcGRmaXVtJ10sCisgIH0sCisgICMgUHVsbCBjbGFuZy1mb3JtYXQgYmluYXJpZXMgdXNpbmcgY2hlY2tlZC1pbiBoYXNoZXMuCisgIHsKKyAgICAnbmFtZSc6ICdjbGFuZ19mb3JtYXRfd2luJywKKyAgICAncGF0dGVybic6ICcuJywKKyAgICAnYWN0aW9uJzogWyAnZG93bmxvYWRfZnJvbV9nb29nbGVfc3RvcmFnZScsCisgICAgICAgICAgICAgICAgJy0tbm9fcmVzdW1lJywKKyAgICAgICAgICAgICAgICAnLS1wbGF0Zm9ybT13aW4zMicsCisgICAgICAgICAgICAgICAgJy0tbm9fYXV0aCcsCisgICAgICAgICAgICAgICAgJy0tYnVja2V0JywgJ2Nocm9taXVtLWNsYW5nLWZvcm1hdCcsCisgICAgICAgICAgICAgICAgJy1zJywgJ3BkZml1bS9idWlsZHRvb2xzL3dpbi9jbGFuZy1mb3JtYXQuZXhlLnNoYTEnLAorICAgIF0sCisgIH0sCisgIHsKKyAgICAnbmFtZSc6ICdjbGFuZ19mb3JtYXRfbWFjJywKKyAgICAncGF0dGVybic6ICcuJywKKyAgICAnYWN0aW9uJzogWyAnZG93bmxvYWRfZnJvbV9nb29nbGVfc3RvcmFnZScsCisgICAgICAgICAgICAgICAgJy0tbm9fcmVzdW1lJywKKyAgICAgICAgICAgICAgICAnLS1wbGF0Zm9ybT1kYXJ3aW4nLAorICAgICAgICAgICAgICAgICctLW5vX2F1dGgnLAorICAgICAgICAgICAgICAgICctLWJ1Y2tldCcsICdjaHJvbWl1bS1jbGFuZy1mb3JtYXQnLAorICAgICAgICAgICAgICAgICctcycsICdwZGZpdW0vYnVpbGR0b29scy9tYWMvY2xhbmctZm9ybWF0LnNoYTEnLAorICAgIF0sCisgIH0sCisgIHsKKyAgICAnbmFtZSc6ICdjbGFuZ19mb3JtYXRfbGludXgnLAorICAgICdwYXR0ZXJuJzogJy4nLAorICAgICdhY3Rpb24nOiBbICdkb3dubG9hZF9mcm9tX2dvb2dsZV9zdG9yYWdlJywKKyAgICAgICAgICAgICAgICAnLS1ub19yZXN1bWUnLAorICAgICAgICAgICAgICAgICctLXBsYXRmb3JtPWxpbnV4KicsCisgICAgICAgICAgICAgICAgJy0tbm9fYXV0aCcsCisgICAgICAgICAgICAgICAgJy0tYnVja2V0JywgJ2Nocm9taXVtLWNsYW5nLWZvcm1hdCcsCisgICAgICAgICAgICAgICAgJy1zJywgJ3BkZml1bS9idWlsZHRvb2xzL2xpbnV4NjQvY2xhbmctZm9ybWF0LnNoYTEnLAorICAgIF0sCisgIH0sCisgIHsKKyAgICAjIFB1bGwgY2xhbmcgaWYgbmVlZGVkIG9yIHJlcXVlc3RlZCB2aWEgR1lQX0RFRklORVMuCisgICAgJ25hbWUnOiAnY2xhbmcnLAorICAgICdwYXR0ZXJuJzogJy4nLAorICAgICdhY3Rpb24nOiBbJ3B5dGhvbicsICdwZGZpdW0vdG9vbHMvY2xhbmcvc2NyaXB0cy91cGRhdGUucHknLCAnLS1pZi1uZWVkZWQnXSwKKyAgfSwKK10KZGlmZiAtLWdpdCBhL1BSRVNVQk1JVC5weSBiL1BSRVNVQk1JVC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWQzYTVlCi0tLSAvZGV2L251bGwKKysrIGIvUFJFU1VCTUlULnB5CkBAIC0wLDAgKzEsMTQgQEAKKyMgQ29weXJpZ2h0IDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKyMgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworIiIiUHJlc3VibWl0IHNjcmlwdCBmb3IgcGRmaXVtLgorCitTZWUgaHR0cDovL2Rldi5jaHJvbWl1bS5vcmcvZGV2ZWxvcGVycy9ob3ctdG9zL2RlcG90dG9vbHMvcHJlc3VibWl0LXNjcmlwdHMKK2ZvciBtb3JlIGRldGFpbHMgYWJvdXQgdGhlIHByZXN1Ym1pdCBBUEkgYnVpbHQgaW50byBkZXBvdF90b29scy4KKyIiIgorCitkZWYgQ2hlY2tDaGFuZ2VPblVwbG9hZChpbnB1dF9hcGksIG91dHB1dF9hcGkpOgorICByZXN1bHRzID0gW10KKyAgcmVzdWx0cyArPSBpbnB1dF9hcGkuY2FubmVkX2NoZWNrcy5DaGVja1BhdGNoRm9ybWF0dGVkKGlucHV0X2FwaSwgb3V0cHV0X2FwaSkKKyAgcmV0dXJuIHJlc3VsdHMKZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EyY2JkZS4uMDAwMDAwMAotLS0gYS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1Gb3IgYnVpbGQgaW5zdHJ1Y3Rpb25zIHZpc2l0IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvcGRmaXVtL3dpa2kvQnVpbGQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9SRUFETUUubWQgYi9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlmNTNlMgotLS0gL2Rldi9udWxsCisrKyBiL1JFQURNRS5tZApAQCAtMCwwICsxLDE0NCBAQAorIyBQREZpdW0KKworIyMgUHJlcmVxdWlzaXRlcworCitHZXQgdGhlIGNocm9taXVtIGRlcG90IHRvb2xzIHZpYSB0aGUgaW5zdHJ1Y3Rpb25zIGF0CitodHRwOi8vd3d3LmNocm9taXVtLm9yZy9kZXZlbG9wZXJzL2hvdy10b3MvaW5zdGFsbC1kZXBvdC10b29scyAodGhpcyBwcm92aWRlcwordGhlIGdjbGllbnQgdXRpbHR5IG5lZWRlZCBiZWxvdykuCisKK0Fsc28gaW5zdGFsbCBQeXRob24sIFN1YnZlcnNpb24sIGFuZCBHaXQgYW5kIG1ha2Ugc3VyZSB0aGV5J3JlIGluIHlvdXIgcGF0aC4KKworIyMgR2V0IHRoZSBjb2RlCisKK1RoZSBuYW1lIG9mIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5IGRvZXMgbm90IG1hdHRlci4gSW4gb3VyIGV4YW1wbGVzLCB3ZSB1c2UKKyJyZXBvIi4gVGhpcyBkaXJlY3RvcnkgbXVzdCBub3QgaGF2ZSBiZWVuIHVzZWQgYmVmb3JlIGJ5IGBnY2xpZW50IGNvbmZpZ2AgYXMKK2VhY2ggZGlyZWN0b3J5IGNhbiBvbmx5IGhvdXNlIGEgc2luZ2xlIGdjbGllbnQgY29uZmlndXJhdGlvbi4KKworYGBgCitta2RpciByZXBvCitjZCByZXBvCitnY2xpZW50IGNvbmZpZyAtLXVubWFuYWdlZCBodHRwczovL3BkZml1bS5nb29nbGVzb3VyY2UuY29tL3BkZml1bS5naXQKK2djbGllbnQgc3luYworY2QgcGRmaXVtCitgYGAKKworIyMgR2VuZXJhdGUgdGhlIGJ1aWxkIGZpbGVzCisKK1dlIHVzZSB0aGUgR1lQIGxpYnJhcnkgdG8gZ2VuZXJhdGUgdGhlIGJ1aWxkIGZpbGVzLgorCitBdCB0aGlzIHBvaW50LCB5b3UgaGF2ZSB0d28gb3B0aW9ucy4gVGhlIGZpcnN0IG9wdGlvbiBpcyB0byB1c2UgdGhlIFtOaW5qYV0KKyhodHRwOi8vbWFydGluZS5naXRodWIuaW8vbmluamEvKSBidWlsZCBzeXN0ZW0gKGFsc28gaW5jbHVkZWQgd2l0aCB0aGUKK2RlcG90XF90b29scyBjaGVja291dCkuIFRoaXMgaXMgdGhlIGRlZmF1bHQgYXMgb2YgbWlkLVNlcHRlbWJlciwgMjAxNS4KK1ByZXZpb3VzbHksIHRoZSBzZWNvbmQgb3B0aW9uIChwbGF0Zm9ybS1zcGVjaWZpYyBidWlsZCBmaWxlcykgd2FzIHRoZSBkZWZhdWx0LgorTW9zdCBQREZpdW0gZGV2ZWxvcGVycyB1c2UgTmluamEsIGFzIGRvZXMgb3VyIFtjb250aW51b3VzIGJ1aWxkIHN5c3RlbV0KKyhodHRwOi8vYnVpbGQuY2hyb21pdW0ub3JnL3AvY2xpZW50LnBkZml1bS8pLgorCisgKiBPbiBXaW5kb3dzOiBgYnVpbGRcZ3lwX3BkZml1bWAKKyAqIEZvciBhbGwgb3RoZXIgcGxhdGZvcm1zOiBgYnVpbGQvZ3lwX3BkZml1bWAKKworVGhlIHNlY29uZCBvcHRpb24gaXMgdG8gZ2VuZXJhdGUgcGxhdGZvcm0tc3BlY2lmaWMgYnVpbGQgZmlsZXMsIGkuZS4gTWFrZWZpbGVzCitvbiBMaW51eCwgc2xuIGZpbGVzIG9uIFdpbmRvd3MsIGFuZCB4Y29kZXByb2ogZmlsZXMgb24gTWFjLiBUbyBkbyBzbywgc2V0IHRoZQorR1lQXF9HRU5FUkFUT1JTIGVudmlyb25tZW50IHZhcmlhYmxlIGFwcHJvcHJpYXRlbHkgKGUuZy4gIm1ha2UiLCAibXN2cyIsIG9yCisieGNvZGUiKSBiZWZvcmUgcnVubmluZyB0aGUgYWJvdmUgY29tbWFuZC4KKworIyMjIFVzaW5nIGdvbWEgKEdvb2dsZXJzIG9ubHkpCisKK0lmIHlvdSB3b3VsZCBsaWtlIHRvIGJ1aWxkIHVzaW5nIGdvbWEsIHBhc3MgYHVzZV9nb21hPTFgIHRvIGBneXBfcGRmaXVtYC4gSWYKK3lvdSBpbnN0YWxsZWQgZ29tYSBpbiBhIG5vbi1zdGFuZGFyZCBsb2NhdGlvbiwgeW91IHdpbGwgYWxzbyBuZWVkIHRvIHNldAorYGdvbWFkaXJgLiBlLmcuCisKK2BgYAorYnVpbGQvZ3lwX3BkZml1bSAtRCB1c2VfZ29tYT0xIC1EIGdvbWFkaXI9cGF0aC90by9nb21hCitgYGAKKworIyMgQnVpbGRpbmcgdGhlIGNvZGUKKworSWYgeW91IHVzZWQgTmluamEsIHlvdSBjYW4gYnVpbGQgdGhlIHNhbXBsZSBwcm9ncmFtIGJ5OiBgbmluamEgLUMgb3V0L0RlYnVnCitwZGZpdW1fdGVzdGAgWW91IGNhbiBidWlsZCB0aGUgZW50aXJlIHByb2R1Y3QgKHdoaWNoIGluY2x1ZGVzIGEgZmV3IHVuaXQKK3Rlc3RzKSBieTogYG5pbmphIC1DIG91dC9EZWJ1Z2AuCisKK0lmIHlvdSdyZSBub3QgdXNpbmcgTmluamEsIHRoZW4gYnVpbGRpbmcgaXMgcGxhdGZvcm0tc3BlY2lmaWMuCisKKyAqIE9uIExpbnV4OiBgbWFrZSBwZGZpdW1fdGVzdGAKKyAqIE9uIE1hYzogYG9wZW4gYnVpbGQvYWxsLnhjb2RlcHJvamAKKyAqIE9uIFdpbmRvd3M6IG9wZW4gYnVpbGRcYWxsLnNsbgorCisjIyBSdW5uaW5nIHRoZSBzYW1wbGUgcHJvZ3JhbQorCitUaGUgcGRmaXVtXF90ZXN0IHByb2dyYW0gc3VwcG9ydHMgcmVhZGluZywgcGFyc2luZywgYW5kIHJhc3Rlcml6aW5nIHRoZSBwYWdlcyBvZgorYSAucGRmIGZpbGUgdG8gLnBwbSBvciAucG5nIG91dHB1dCBpbWFnZSBmaWxlcyAod2luZG93cyBzdXBwb3J0cyB0d28gb3RoZXIKK2Zvcm1hdHMpLiBGb3IgZXhhbXBsZTogYG91dC9EZWJ1Zy9wZGZpdW1fdGVzdCAtLXBwbSBwYXRoL3RvL215ZmlsZS5wZGZgLiBOb3RlCit0aGF0IHRoaXMgd2lsbCB3cml0ZSBvdXRwdXQgaW1hZ2VzIHRvIGBwYXRoL3RvL215ZmlsZS5wZGYuPG4+LnBwbWAuCisKKyMjIFRlc3RpbmcKKworVGhlcmUgYXJlIGN1cnJlbnRseSBzZXZlcmFsIHRlc3Qgc3VpdGVzIHRoYXQgY2FuIGJlIHJ1bjoKKworICogcGRmaXVtXF91bml0dGVzdHMKKyAqIHBkZml1bVxfZW1iZWRkZXJ0ZXN0cworICogdGVzdGluZy90b29scy9ydW5cX2NvcnB1c1xfdGVzdHMucHkKKyAqIHRlc3RpbmcvdG9vbHMvcnVuXF9qYXZhc2NyaXB0XF90ZXN0cy5weQorICogdGVzdGluZy90b29scy9ydW5cX3BpeGVsXF90ZXN0cy5weQorCitJdCBpcyBwb3NzaWJsZSB0aGUgdGVzdHMgaW4gdGhlIGB0ZXN0aW5nYCBkaXJlY3RvcnkgY2FuIGZhaWwgZHVlIHRvIGZvbnQKK2RpZmZlcmVuY2VzIG9uIHRoZSB2YXJpb3VzIHBsYXRmb3Jtcy4gVGhlc2UgdGVzdHMgYXJlIHJlbGlhYmxlIG9uIHRoZSBib3RzLiBJZgoreW91IHNlZSBmYWlsdXJlcywgaXQgY2FuIGJlIGEgZ29vZCBpZGVhIHRvIHJ1biB0aGUgdGVzdHMgb24gdGhlIHRpcC1vZi10cmVlCitjaGVja291dCB0byBzZWUgaWYgdGhlIHNhbWUgZmFpbHVyZXMgYXBwZWFyLgorCisjIyBXYXRlcmZhbGwKKworVGhlIGN1cnJlbnQgaGVhbHRoIG9mIHRoZSBzb3VyY2UgdHJlZSBjYW4gYmUgZm91bmQgYXQKK2h0dHA6Ly9idWlsZC5jaHJvbWl1bS5vcmcvcC9jbGllbnQucGRmaXVtL2NvbnNvbGUKKworIyMgQ29tbXVuaXR5CisKK1RoZXJlIGFyZSBzZXZlcmFsIG1haWxpbmcgbGlzdHMgdGhhdCBhcmUgc2V0dXA6CisKKyAqIFtQREZpdW1dKGh0dHBzOi8vZ3JvdXBzLmdvb2dsZS5jb20vZm9ydW0vIyFmb3J1bS9wZGZpdW0pCisgKiBbUERGaXVtIFJldmlld3NdKGh0dHBzOi8vZ3JvdXBzLmdvb2dsZS5jb20vZm9ydW0vIyFmb3J1bS9wZGZpdW0tcmV2aWV3cykKKyAqIFtQREZpdW0gQnVnc10oaHR0cHM6Ly9ncm91cHMuZ29vZ2xlLmNvbS9mb3J1bS8jIWZvcnVtL3BkZml1bS1idWdzKQorCitOb3RlLCB0aGUgUmV2aWV3cyBhbmQgQnVncyBsaXN0cyBhcmUgdHlwaWNhbGx5IHJlYWQtb25seS4KKworIyMgQnVncworCisgV2Ugd2lsbCBiZSB1c2luZyB0aGlzCitbYnVnIHRyYWNrZXJdKGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvcGRmaXVtL2lzc3Vlcy9saXN0KSwgYnV0IGZvciBzZWN1cml0eQorYnVncywgcGxlYXNlIHVzZSBbQ2hyb21pdW0ncyBzZWN1cml0eSBidWcgdGVtcGxhdGVdCisoaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZW50cnk/dGVtcGxhdGU9U2VjdXJpdHklMjBCdWcpCithbmQgYWRkIHRoZSAiQ3ItSW50ZXJuYWxzLVBsdWdpbnMtUERGIiBsYWJlbC4KKworIyMgQ29udHJpYnV0aW5nIGNvZGUKKworRm9yIGNvbnRyaWJ1dGluZyBjb2RlLCB3ZSB3aWxsIGZvbGxvdworW0Nocm9taXVtJ3MgcHJvY2Vzc10oaHR0cDovL2Rldi5jaHJvbWl1bS5vcmcvZGV2ZWxvcGVycy9jb250cmlidXRpbmctY29kZSkKK2FzIG11Y2ggYXMgcG9zc2libGUuIFRoZSBtYWluIGV4Y2VwdGlvbnMgYXJlOgorCisxLiBDb2RlIGhhcyB0byBjb25mb3JtIHRvIHRoZSBleGlzdGluZyBzdHlsZSBhbmQgbm90IENocm9taXVtL0dvb2dsZSBzdHlsZS4KKzIuIFRoZXJlIGlzIG5vIGNvbW1pdCBxdWV1ZSwgYXBwcm92ZWQgY29tbWl0dGVycyBjYW4gbGFuZCB0aGVpciBjaGFuZ2VzIHZpYQorYGdpdCBjbCBsYW5kYAorMy4gQ2hhbmdlcyBtdXN0IGJlIG1lcmdlZCB0byB0aGUgWEZBIGJyYW5jaCBhcyB3ZWxsIChzZWUgYmVsb3cpLgorCisjIyBCcmFuY2hlcworCitUaGVyZSBpcyBhIGJyYW5jaCBmb3IgYSBmb3J0aGNvbWluZyBmZWF0dXJlIGNhbGxlZCBYRkEgdGhhdCB5b3UgY2FuIGdldCBieQorZm9sbG93aW5nIHRoZSBzdGVwcyBhYm92ZSwgdGhlbjoKKworYGBgCitnaXQgY2hlY2tvdXQgb3JpZ2luL3hmYQorYnVpbGQvZ3lwX3BkZml1bQorbmluamEgLUMgb3V0L0RlYnVnCitgYGAKKworTWVyZ2luZyB0byBYRkEgcmVxdWlyZXM6CisKK2BgYAorZ2l0IGNoZWNrb3V0IG9yaWdpbi94ZmEKK2dpdCBjaGVja291dCAtYiBtZXJnZV9icmFuY2gKK2dpdCBicmFuY2ggLS1zZXQtdXBzdHJlYW0tdG89b3JpZ2luL3hmYQorZ2l0IGNoZXJyeS1waWNrIC14IDxjb21taXQgaGFzaD4KK2dpdCBjb21taXQgLS1hbWVuZCAjIGFkZCBNZXJnZSB0byBYRkEKK2dpdCBjbCB1cGxvYWQKK2BgYAorCitUaGVuIHdhaXQgZm9yIGFwcHJvdmFsLCBhbmQgYGdpdCBjbCBsYW5kYApkaWZmIC0tZ2l0IGEvYnVpbGQvZ3lwX3BkZml1bSBiL2J1aWxkL2d5cF9wZGZpdW0KaW5kZXggNzAxOTc5NS4uZmNhMmNhMyAxMDA3NTUKLS0tIGEvYnVpbGQvZ3lwX3BkZml1bQorKysgYi9idWlsZC9neXBfcGRmaXVtCkBAIC0yOCwxNSArMjgsMjAgQEAKIGRlZiBtYWluKCk6CiAgIGFyZ3MgPSBzeXMuYXJndlsxOl0KICAgYXJncy5hcHBlbmQob3MucGF0aC5qb2luKHNjcmlwdF9kaXIsICdhbGwuZ3lwJykpCi0gIAorCiAgIGFyZ3MuYXBwZW5kKCctSScpCiAgIGFyZ3MuYXBwZW5kKG9zLnBhdGguam9pbihwZGZpdW1fcm9vdCwgJ2J1aWxkJywgJ3N0YW5kYWxvbmUuZ3lwaScpKQotICAKKwogICBhcmdzLmV4dGVuZChbJy1EJywgJ2d5cF9vdXRwdXRfZGlyPW91dCddKQogCiAgICMgU2V0IHRoZSBHWVAgREVQVEggdmFyaWFibGUgdG8gdGhlIHJvb3Qgb2YgdGhlIFBERml1bSBwcm9qZWN0LgogICBhcmdzLmFwcGVuZCgnLS1kZXB0aD0nICsgb3MucGF0aC5yZWxwYXRoKHBkZml1bV9yb290KSkKIAorICAjIEdZUCBkb2VzIG5vdCBkZWZhdWx0IHRvIG5pbmphLCBidXQgUERGaXVtIHNob3VsZC4KKyAgaWYgbm90IG9zLmVudmlyb24uZ2V0KCdHWVBfR0VORVJBVE9SUycsICcnKToKKyAgICBwcmludCAnR1lQX0dFTkVSQVRPUlMgaXMgbm90IHNldCwgZGVmYXVsdGluZyB0byBuaW5qYScKKyAgICBvcy5lbnZpcm9uWydHWVBfR0VORVJBVE9SUyddID0gJ25pbmphJworCiAgIHByaW50ICdVcGRhdGluZyBwcm9qZWN0cyBmcm9tIGd5cCBmaWxlcy4uLicKICAgc3lzLnN0ZG91dC5mbHVzaCgpCiAKQEAgLTQ0LDQgKzQ5LDQgQEAKIAogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICBzeXMuZXhpdChtYWluKCkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICBzeXMuZXhpdChtYWluKCkpCmRpZmYgLS1naXQgYS9idWlsZC9zZXRfY2xhbmdfd2FybmluZ19mbGFncy5neXBpIGIvYnVpbGQvc2V0X2NsYW5nX3dhcm5pbmdfZmxhZ3MuZ3lwaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQ3YWVhCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvc2V0X2NsYW5nX3dhcm5pbmdfZmxhZ3MuZ3lwaQpAQCAtMCwwICsxLDU4IEBACisjIENvcHlyaWdodCAoYykgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjIFRoaXMgZmlsZSBpcyBtZWFudCB0byBiZSBpbmNsdWRlZCB0byBzZXQgY2xhbmctc3BlY2lmaWMgY29tcGlsZXIgZmxhZ3MuCisjIFRvIHVzZSB0aGlzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUgY2FuIGJlIGRlZmluZWQ6CisjICAgY2xhbmdfd2FybmluZ19mbGFnczogICAgICAgbGlzdDogQ29tcGlsZXIgZmxhZ3MgdG8gcGFzcyB0byBjbGFuZy4KKyMgICBjbGFuZ193YXJuaW5nX2ZsYWdzX3Vuc2V0OiBsaXN0OiBDb21waWxlciBmbGFncyB0byBub3QgcGFzcyB0byBjbGFuZy4KKyMKKyMgT25seSB1c2UgdGhpcyBpbiB0aGlyZC1wYXJ0eSBjb2RlLiBJbiBjaHJvbWl1bV9jb2RlLCBmaXggeW91ciBjb2RlIHRvIG5vdAorIyB3YXJuIGluc3RlYWQhCisjCisjIE5vdGUgdGhhdCB0aGUgZ3lwaSBmaWxlIGlzIGluY2x1ZGVkIGluIHRhcmdldF9kZWZhdWx0cywgc28gaXQgZG9lcyBub3QgbmVlZAorIyB0byBiZSBleHBsaWNpdGx5IGluY2x1ZGVkLgorIworIyBXYXJuaW5nIGZsYWdzIHNldCBieSB0aGlzIHdpbGwgYmUgdXNlZCBvbiBhbGwgcGxhdGZvcm1zLiBJZiB5b3Ugd2FudCB0byBzZXQKKyMgd2FybmluZyBmbGFncyBvbiBvbmx5IHNvbWUgcGxhdGZvcm1zLCB5b3UgaGF2ZSB0byBkbyBzbyBtYW51YWxseS4KKyMKKyMgVG8gdXNlIHRoaXMsIGNyZWF0ZSBhIGd5cCB0YXJnZXQgd2l0aCB0aGUgZm9sbG93aW5nIGZvcm06CisjIHsKKyMgICAndGFyZ2V0X25hbWUnOiAnbXlfdGFyZ2V0JywKKyMgICAndmFyaWFibGVzJzogeworIyAgICAgJ2NsYW5nX3dhcm5pbmdfZmxhZ3MnOiBbJy1Xbm8tYXdlc29tZS13YXJuaW5nJ10sCisjICAgICAnY2xhbmdfd2FybmluZ19mbGFnc191bnNldCc6IFsnLVdwcmV2aW91c2x5LXNldC1mbGFnJ10sCisjICAgfQorIyB9CisKK3sKKyAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAnY2xhbmdfd2FybmluZ19mbGFnc191bnNldCUnOiBbXSwgICMgUHJvdmlkZSBhIGRlZmF1bHQgdmFsdWUuCisgIH0sCisgICdjb25kaXRpb25zJzogWworICAgIFsnY2xhbmc9PTEnLCB7CisgICAgICAjIFRoaXMgdXNlcyA+QCBpbnN0ZWFkIG9mIEA8IHRvIGFsc28gc2VlIGNsYW5nX3dhcm5pbmdfZmxhZ3Mgc2V0IGluCisgICAgICAjIHRhcmdldHMgZGlyZWN0bHksIG5vdCBqdXN0IHRoZSBjbGFuZ193YXJuaW5nX2ZsYWdzIGluIHRhcmdldF9kZWZhdWx0cy4KKyAgICAgICdjZmxhZ3MnOiBbICc+QChjbGFuZ193YXJuaW5nX2ZsYWdzKScgXSwKKyAgICAgICdjZmxhZ3MhJzogWyAnPkAoY2xhbmdfd2FybmluZ19mbGFnc191bnNldCknIF0sCisgICAgICAneGNvZGVfc2V0dGluZ3MnOiB7CisgICAgICAgICdXQVJOSU5HX0NGTEFHUyc6IFsnPkAoY2xhbmdfd2FybmluZ19mbGFncyknXSwKKyAgICAgICAgJ1dBUk5JTkdfQ0ZMQUdTISc6IFsnPkAoY2xhbmdfd2FybmluZ19mbGFnc191bnNldCknXSwKKyAgICAgIH0sCisgICAgICAnbXN2c19zZXR0aW5ncyc6IHsKKyAgICAgICAgJ1ZDQ0xDb21waWxlclRvb2wnOiB7CisgICAgICAgICAgJ0FkZGl0aW9uYWxPcHRpb25zJzogWyAnPkAoY2xhbmdfd2FybmluZ19mbGFncyknIF0sCisgICAgICAgICAgJ0FkZGl0aW9uYWxPcHRpb25zISc6IFsgJz5AKGNsYW5nX3dhcm5pbmdfZmxhZ3NfdW5zZXQpJyBdLAorICAgICAgICB9LAorICAgICAgfSwKKyAgICB9XSwKKyAgICBbJ2NsYW5nPT0wIGFuZCBob3N0X2NsYW5nPT0xJywgeworICAgICAgJ3RhcmdldF9jb25kaXRpb25zJzogWworICAgICAgICBbJ190b29sc2V0PT0iaG9zdCInLCB7CisgICAgICAgICAgJ2NmbGFncyc6IFsgJz5AKGNsYW5nX3dhcm5pbmdfZmxhZ3MpJyBdLAorICAgICAgICAgICdjZmxhZ3MhJzogWyAnPkAoY2xhbmdfd2FybmluZ19mbGFnc191bnNldCknIF0sCisgICAgICAgIH1dLAorICAgICAgXSwKKyAgICB9XSwKKyAgXSwKK30KZGlmZiAtLWdpdCBhL2J1aWxkL3N0YW5kYWxvbmUuZ3lwaSBiL2J1aWxkL3N0YW5kYWxvbmUuZ3lwaQppbmRleCBjMGVhZWY0Li43Mjk3NWJjIDEwMDY0NAotLS0gYS9idWlsZC9zdGFuZGFsb25lLmd5cGkKKysrIGIvYnVpbGQvc3RhbmRhbG9uZS5neXBpCkBAIC04LDcgKzgsMTIgQEAKICAgJ3ZhcmlhYmxlcyc6IHsKICAgICAnY29tcG9uZW50JSc6ICdzdGF0aWNfbGlicmFyeScsCiAgICAgJ2NsYW5nJSc6IDAsCisgICAgJ2FzYW4lJzogMCwKKyAgICAnc2FuaXRpemVyX2NvdmVyYWdlJSc6IDAsCisgICAgJ3VzZV9nb21hJSc6IDAsCisgICAgJ2dvbWFkaXIlJzogJycsCiAgICAgJ21zdnNfbXVsdGlfY29yZV9jb21waWxlJSc6ICcxJywKKyAgICAncGRmX2VuYWJsZV94ZmElJzogMSwKICAgICAndmFyaWFibGVzJzogewogICAgICAgJ3ZhcmlhYmxlcyc6IHsKICAgICAgICAgJ3ZhcmlhYmxlcyc6IHsKQEAgLTM3LDYgKzQyLDcgQEAKICAgICAgICdob3N0X2FyY2glJzogJzwoaG9zdF9hcmNoKScsCiAgICAgICAndGFyZ2V0X2FyY2glJzogJzwodGFyZ2V0X2FyY2gpJywKICAgICB9LAorICAgICdjbGFuZ19kaXIlJzogJ3RoaXJkX3BhcnR5L2xsdm0tYnVpbGQvUmVsZWFzZStBc3NlcnRzJywKICAgICAjIFRoZXNlIHR3byBhcmUgbmVlZGVkIGJ5IFY4LgogICAgICdob3N0X2FyY2glJzogJzwoaG9zdF9hcmNoKScsCiAgICAgJ3RhcmdldF9hcmNoJSc6ICc8KHRhcmdldF9hcmNoKScsCkBAIC00NCwxMiArNTAsMjYgQEAKICAgICAndjhfb3B0aW1pemVkX2RlYnVnJSc6IDAsCiAgICAgJ3Y4X3VzZV9leHRlcm5hbF9zdGFydHVwX2RhdGElJzogMCwKICAgICAnaWN1X2d5cF9wYXRoJzogJy4uL3Y4L3RoaXJkX3BhcnR5L2ljdS9pY3UuZ3lwJywKKyAgICAnbGlianBlZ19neXBfcGF0aCc6ICcuLi90aGlyZF9wYXJ0eS90aGlyZF9wYXJ0eS5neXAnLAogICAgICdjb25kaXRpb25zJzogWwogICAgICAgWydPUyA9PSAid2luIicsIHsKICAgICAgICAgJ29zX3Bvc2l4JSc6IDAsCiAgICAgICB9LCB7CiAgICAgICAgICdvc19wb3NpeCUnOiAxLAogICAgICAgfV0sCisgICAgICBbJ09TPT0ibGludXgiIG9yIE9TPT0ibWFjIicsIHsKKyAgICAgICAgJ2NsYW5nJSc6IDEsCisgICAgICAgICdob3N0X2NsYW5nJSc6IDEsCisgICAgICB9LCB7CisgICAgICAgICdjbGFuZyUnOiAwLAorICAgICAgICAnaG9zdF9jbGFuZyUnOiAwLAorICAgICAgfV0sCisgICAgICAjIFNldCBkZWZhdWx0IGdvbWFkaXIuCisgICAgICBbJ09TPT0id2luIicsIHsKKyAgICAgICAgJ2dvbWFkaXIlJzogJ2M6XFxnb21hXFxnb21hLXdpbicsCisgICAgICB9LCB7CisgICAgICAgICdnb21hZGlyJSc6ICc8ISgvYmluL2VjaG8gLW4gJHtIT01FfS9nb21hKScsCisgICAgICB9XSwKICAgICBdLAogICB9LAogICAndGFyZ2V0X2RlZmF1bHRzJzogewpAQCAtODAsNiArMTAwLDEyIEBACiAgICAgICAgICd4Y29kZV9zZXR0aW5ncyc6IHsKICAgICAgICAgICAnR0NDX09QVElNSVpBVElPTl9MRVZFTCc6ICcwJywgICMgLU8wCiAgICAgICAgIH0sCisgICAgICAgICdjb25kaXRpb25zJzogWworICAgICAgICAgIFsnT1M9PSJsaW51eCInLCB7CisgICAgICAgICAgICAjIEVuYWJsZSBsaWJzdGRjKysgZGVidWdnaW5nIHRvIGhlbHAgY2F0Y2ggcHJvYmxlbXMgZWFybHkuCisgICAgICAgICAgICAnZGVmaW5lcyc6IFsnX0dMSUJDWFhfREVCVUc9MScsXSwKKyAgICAgICAgICB9XSwKKyAgICAgICAgXSwKICAgICAgIH0sCiAgICAgICAnUmVsZWFzZSc6IHsKICAgICAgICAgJ2NmbGFncyc6IFsKQEAgLTE3MSwxMiArMTk3LDk4IEBACiAgICAgICAnSW50ZXJtZWRpYXRlRGlyZWN0b3J5JzogJyQoT3V0RGlyKVxcb2JqXFwkKFByb2plY3ROYW1lKScsCiAgICAgICAnQ2hhcmFjdGVyU2V0JzogJzEnLAogICAgIH0sCi0gICAgJ21zdnNfZGlzYWJsZWRfd2FybmluZ3MnOiBbNDgwMCwgNDk5NiwgNDQ1NiwgNDQ1NywgNDQ1OCwgNDQ1OSwgNDA5MV0sCi0gICAgIyA0NDU2LCA0NDU3LCA0NDU4LCA0NDU5IGFyZSB2YXJpYWJsZSBzaGFkb3dpbmcgd2FybmluZ3MgdGhhdCBhcmUgbmV3IGluCi0gICAgIyBWUzIwMTUuCi0gICAgIyBDNDA5MTogJ3R5cGVkZWYgJzogaWdub3JlZCBvbiBsZWZ0IG9mICdYJyB3aGVuIG5vIHZhcmlhYmxlIGlzCi0gICAgIyAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWQuCi0gICAgIyBUaGlzIGhhcHBlbnMgaW4gYSBudW1iZXIgb2YgV2luZG93cyBoZWFkZXJzIHdpdGggVlMgMjAxNS4KKyAgICAnbXN2c19kaXNhYmxlZF93YXJuaW5ncyc6IFsKKyAgICAgICMgIyMjIworICAgICAgIyBUaGlzIHNlY3Rpb24gaXMgUERGaXVtIHNwZWNpZmljLgorICAgICAgIyAjIyMjCisKKyAgICAgICMgQzQ4MDA6IGZvcmNpbmcgdmFsdWUgdG8gYm9vbCAndHJ1ZScgb3IgJ2ZhbHNlJyAocGVyZm9ybWFuY2Ugd2FybmluZykKKyAgICAgIDQ4MDAsCisKKyAgICAgICMgIyMjIworICAgICAgIyBUaGlzIHNlY3Rpb24gc2hvdWxkIG1hdGNoIENocm9taXVtJ3MgYnVpbGQvY29tbW9uLmd5cGkuCisgICAgICAjICMjIyMKKworICAgICAgIyBDNDA5MTogJ3R5cGVkZWYgJzogaWdub3JlZCBvbiBsZWZ0IG9mICdYJyB3aGVuIG5vIHZhcmlhYmxlIGlzCisgICAgICAjICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZC4KKyAgICAgICMgVGhpcyBoYXBwZW5zIGluIGEgbnVtYmVyIG9mIFdpbmRvd3MgaGVhZGVycy4gRHVtYi4KKyAgICAgIDQwOTEsCisKKyAgICAgICMgQzQxMjc6IGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaXMgY29uc3RhbnQKKyAgICAgICMgVGhpcyB3YXJuaW5nIGNhbiBpbiB0aGVvcnkgY2F0Y2ggZGVhZCBjb2RlIGFuZCBvdGhlciBwcm9ibGVtcywgYnV0CisgICAgICAjIHRyaWdnZXJzIGluIGZhciB0b28gbWFueSBkZXNpcmFibGUgY2FzZXMgd2hlcmUgdGhlIGNvbmRpdGlvbmFsCisgICAgICAjIGV4cHJlc3Npb24gaXMgZWl0aGVyIHNldCBieSBtYWNyb3Mgb3IgY29ycmVzcG9uZHMgc29tZSBsZWdpdGltYXRlCisgICAgICAjIGNvbXBpbGUtdGltZSBjb25zdGFudCBleHByZXNzaW9uIChkdWUgdG8gY29uc3RhbnQgdGVtcGxhdGUgYXJncywKKyAgICAgICMgY29uZGl0aW9uYWxzIGNvbXBhcmluZyB0aGUgc2l6ZXMgb2YgZGlmZmVyZW50IHR5cGVzLCBldGMuKS4gIFNvbWUgb2YKKyAgICAgICMgdGhlc2UgY2FuIGJlIHdvcmtlZCBhcm91bmQsIGJ1dCBpdCdzIG5vdCB3b3J0aCBpdC4KKyAgICAgIDQxMjcsCisKKyAgICAgICMgQzQzNTE6IG5ldyBiZWhhdmlvcjogZWxlbWVudHMgb2YgYXJyYXkgJ2FycmF5JyB3aWxsIGJlIGRlZmF1bHQKKyAgICAgICMgICAgICAgIGluaXRpYWxpemVkCisgICAgICAjIFRoaXMgaXMgYSBzaWxseSAid2FybmluZyIgdGhhdCBiYXNpY2FsbHkganVzdCBhbGVydHMgeW91IHRoYXQgdGhlCisgICAgICAjIGNvbXBpbGVyIGlzIGdvaW5nIHRvIGFjdHVhbGx5IGZvbGxvdyB0aGUgbGFuZ3VhZ2Ugc3BlYyBsaWtlIGl0J3MKKyAgICAgICMgc3VwcG9zZWQgdG8sIGluc3RlYWQgb2Ygbm90IGZvbGxvd2luZyBpdCBsaWtlIG9sZCBidWdneSB2ZXJzaW9ucworICAgICAgIyBkaWQuICBUaGVyZSdzIGFic29sdXRlbHkgbm8gcmVhc29uIHRvIHR1cm4gdGhpcyBvbi4KKyAgICAgIDQzNTEsCisKKyAgICAgICMgQzQzNTU6ICd0aGlzJzogdXNlZCBpbiBiYXNlIG1lbWJlciBpbml0aWFsaXplciBsaXN0CisgICAgICAjIEl0J3MgY29tbW9ubHkgdXNlZnVsIHRvIHBhc3MgfHRoaXN8IHRvIG9iamVjdHMgaW4gYSBjbGFzcycKKyAgICAgICMgaW5pdGlhbGl6ZXIgbGlzdC4gIFdoaWxlIHRoaXMgd2FybmluZyBjYW4gY2F0Y2ggcmVhbCBidWdzLCBtb3N0IG9mCisgICAgICAjIHRoZSB0aW1lIHRoZSBjb25zdHJ1Y3RvcnMgaW4gcXVlc3Rpb24gZG9uJ3QgYXR0ZW1wdCB0byBjYWxsIG1ldGhvZHMKKyAgICAgICMgb24gdGhlIHBhc3NlZC1pbiBwb2ludGVyICh1bnRpbCBsYXRlciksIGFuZCBhbm5vdGF0aW5nIGV2ZXJ5IGxlZ2l0CisgICAgICAjIHVzYWdlIG9mIHRoaXMgaXMgc2ltcGx5IG1vcmUgaGFzc2xlIHRoYW4gdGhlIHdhcm5pbmcgaXMgd29ydGguCisgICAgICA0MzU1LAorCisgICAgICAjIEM0NTAzOiAnaWRlbnRpZmllcic6IGRlY29yYXRlZCBuYW1lIGxlbmd0aCBleGNlZWRlZCwgbmFtZSB3YXMKKyAgICAgICMgICAgICAgIHRydW5jYXRlZAorICAgICAgIyBUaGlzIG9ubHkgbWVhbnMgdGhhdCBzb21lIGxvbmcgZXJyb3IgbWVzc2FnZXMgbWlnaHQgaGF2ZSB0cnVuY2F0ZWQKKyAgICAgICMgaWRlbnRpZmllcnMgaW4gdGhlIHByZXNlbmNlIG9mIGxvdHMgb2YgdGVtcGxhdGVzLiAgSXQgaGFzIG5vIGVmZmVjdAorICAgICAgIyBvbiBwcm9ncmFtIGNvcnJlY3RuZXNzIGFuZCB0aGVyZSdzIG5vIHJlYWwgcmVhc29uIHRvIHdhc3RlIHRpbWUKKyAgICAgICMgdHJ5aW5nIHRvIHByZXZlbnQgaXQuCisgICAgICA0NTAzLAorCisgICAgICAjIFdhcm5pbmcgQzQ1ODkgc2F5czogIkNvbnN0cnVjdG9yIG9mIGFic3RyYWN0IGNsYXNzIGlnbm9yZXMKKyAgICAgICMgaW5pdGlhbGl6ZXIgZm9yIHZpcnR1YWwgYmFzZSBjbGFzcy4iIERpc2FibGUgdGhpcyB3YXJuaW5nIGJlY2F1c2UgaXQKKyAgICAgICMgaXMgZmxha3kgaW4gVlMgMjAxNSBSVE0uIEl0IHRyaWdnZXJzIG9uIGNvbXBpbGVyIGdlbmVyYXRlZAorICAgICAgIyBjb3B5LWNvbnN0cnVjdG9ycyBpbiBzb21lIGNhc2VzLgorICAgICAgNDU4OSwKKworICAgICAgIyBDNDYxMTogaW50ZXJhY3Rpb24gYmV0d2VlbiAnZnVuY3Rpb24nIGFuZCBDKysgb2JqZWN0IGRlc3RydWN0aW9uIGlzCisgICAgICAjICAgICAgICBub24tcG9ydGFibGUKKyAgICAgICMgVGhpcyB3YXJuaW5nIGlzIHVuYXZvaWRhYmxlIHdoZW4gdXNpbmcgZS5nLiBzZXRqbXAvbG9uZ2ptcC4gIE1TRE4KKyAgICAgICMgc3VnZ2VzdHMgdXNpbmcgZXhjZXB0aW9ucyBpbnN0ZWFkIG9mIHNldGptcC9sb25nam1wIGZvciBDKyssIGJ1dAorICAgICAgIyBDaHJvbWl1bSBjb2RlIGNvbXBpbGVzIHdpdGhvdXQgZXhjZXB0aW9uIHN1cHBvcnQuICBXZSB0aGVyZWZvcmUgaGF2ZQorICAgICAgIyB0byB1c2Ugc2V0am1wL2xvbmdqbXAgZm9yIGUuZy4gSlBFRyBkZWNvZGUgZXJyb3IgaGFuZGxpbmcsIHdoaWNoCisgICAgICAjIG1lYW5zIHdlIGhhdmUgdG8gdHVybiBvZmYgdGhpcyB3YXJuaW5nIChhbmQgYmUgY2FyZWZ1bCBhYm91dCBob3cKKyAgICAgICMgb2JqZWN0IGRlc3RydWN0aW9uIGhhcHBlbnMgaW4gc3VjaCBjYXNlcykuCisgICAgICA0NjExLAorCisgICAgICAjIFRPRE8odGhlc3RpZyk6IFRoZXNlIHdhcm5pbmdzIGFyZSBsZXZlbCA0LiBUaGV5IHdpbGwgYmUgc2xvd2x5CisgICAgICAjIHJlbW92ZWQgYXMgY29kZSBpcyBmaXhlZC4KKyAgICAgIDQxMDAsICMgVW5yZWZlcmVuY2VkIGZvcm1hbCBwYXJhbWV0ZXIKKyAgICAgIDQxMjEsICMgQWxpZ25tZW50IG9mIGEgbWVtYmVyIHdhcyBzZW5zaXRpdmUgdG8gcGFja2luZworICAgICAgNDI0NCwgIyBDb252ZXJzaW9uIGZyb20gJ3R5cGUxJyB0byAndHlwZTInLCBwb3NzaWJsZSBsb3NzIG9mIGRhdGEKKyAgICAgIDQ1MDUsICMgVW5yZWZlcmVuY2VkIGxvY2FsIGZ1bmN0aW9uIGhhcyBiZWVuIHJlbW92ZWQKKyAgICAgIDQ1MTAsICMgRGVmYXVsdCBjb25zdHJ1Y3RvciBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkCisgICAgICA0NTEyLCAjIEFzc2lnbm1lbnQgb3BlcmF0b3IgY291bGQgbm90IGJlIGdlbmVyYXRlZAorICAgICAgNDYxMCwgIyBPYmplY3QgY2FuIG5ldmVyIGJlIGluc3RhbnRpYXRlZAorICAgICAgNDgzOCwgIyBOYXJyb3dpbmcgY29udmVyc2lvbi4gRG9lc24ndCBzZWVtIHRvIGJlIHZlcnkgdXNlZnVsLgorICAgICAgNDk5NSwgIyAnWCc6IG5hbWUgd2FzIG1hcmtlZCBhcyAjcHJhZ21hIGRlcHJlY2F0ZWQKKyAgICAgIDQ5OTYsICMgJ1gnOiB3YXMgZGVjbGFyZWQgZGVwcmVjYXRlZCAoZm9yIEdldFZlcnNpb25FeCkuCisKKyAgICAgICMgVGhlc2UgYXJlIHZhcmlhYmxlIHNoYWRvd2luZyB3YXJuaW5ncyB0aGF0IGFyZSBuZXcgaW4gVlMyMDE1LiBXZQorICAgICAgIyBzaG91bGQgd29yayB0aHJvdWdoIHRoZXNlIGF0IHNvbWUgcG9pbnQgLS0gdGhleSBtYXkgYmUgcmVtb3ZlZCBmcm9tCisgICAgICAjIHRoZSBSVE0gcmVsZWFzZSBpbiB0aGUgL1c0IHNldC4KKyAgICAgIDQ0NTYsIDQ0NTcsIDQ0NTgsIDQ0NTksCisKKyAgICAgICMgVE9ETyhicnVjZWRhd3Nvbik6IGh0dHA6Ly9jcmJ1Zy5jb20vNTU0MjAwIDQzMTIgaXMgYSBWUworICAgICAgIyAyMDE1IDY0LWJpdCB3YXJuaW5nIGZvciBpbnRlZ2VyIHRvIGxhcmdlciBwb2ludGVyCisgICAgICA0MzEyLAorCisgICAgICAjICMjIyMKKyAgICAgICMgRG8gbm90IGFkZCBQREZpdW0gc3BlY2lmaWMgZW50cmllcyBoZXJlLiBBZGQgdGhlbSB0byB0aGUgdG9wLgorICAgICAgIyAjIyMjCisgICAgXSwKICAgICAnbXN2c19zZXR0aW5ncyc6IHsKICAgICAgICdWQ0NMQ29tcGlsZXJUb29sJzogewogICAgICAgICAnTWluaW1hbFJlYnVpbGQnOiAnZmFsc2UnLApAQCAtMjQzLDE1ICszNTUsMzUgQEAKICAgICAgICAgJy1Xbm8tdW51c2VkLXBhcmFtZXRlcicsCiAgICAgICBdLAogICAgIH0sCi0gIH0sCi0gICdjb25kaXRpb25zJzogWwotICAgIFsnY29tcG9uZW50PT0ic2hhcmVkX2xpYnJhcnkiJywgewotICAgICAgJ2NmbGFncyc6IFsKLSAgICAgICAgJy1mUElDJywKLSAgICAgIF0sCi0gICAgfV0sCi0gICAgWydPUz09IndpbiInLCB7Ci0gICAgICAndGFyZ2V0X2RlZmF1bHRzJzogeworICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAnY2xhbmdfd2FybmluZ19mbGFncyc6IFtdLAorICAgIH0sCisgICAgJ2luY2x1ZGVzJzogWyAnc2V0X2NsYW5nX3dhcm5pbmdfZmxhZ3MuZ3lwaScsIF0sCisgICAgJ2NvbmRpdGlvbnMnOiBbCisgICAgICBbJ2NvbXBvbmVudD09InNoYXJlZF9saWJyYXJ5IicsIHsKKyAgICAgICAgJ2NmbGFncyc6IFsKKyAgICAgICAgICAnLWZQSUMnLAorICAgICAgICBdLAorICAgICAgfV0sCisgICAgICBbJ2FzYW49PTEnLCB7CisgICAgICAgICdkZWZpbmVzJzogWworICAgICAgICAgICdBRERSRVNTX1NBTklUSVpFUicsCisgICAgICAgICAgJ0xFQUtfU0FOSVRJWkVSJywKKyAgICAgICAgXSwKKyAgICAgICAgJ2NmbGFncyc6IFsKKyAgICAgICAgICAnLWZzYW5pdGl6ZT1hZGRyZXNzJywKKyAgICAgICAgICAnLWdsaW5lLXRhYmxlcy1vbmx5JywKKyAgICAgICAgXSwKKyAgICAgICAgJ2xkZmxhZ3MnOiBbCisgICAgICAgICAgJy1mc2FuaXRpemU9YWRkcmVzcycsCisgICAgICAgIF0sCisgICAgICB9XSwKKyAgICAgIFsnc2FuaXRpemVyX2NvdmVyYWdlIT0wJywgeworICAgICAgICAnY2ZsYWdzJzogWworICAgICAgICAgICctZnNhbml0aXplLWNvdmVyYWdlPTwoc2FuaXRpemVyX2NvdmVyYWdlKScsCisgICAgICAgIF0sCisgICAgICB9XSwKKyAgICAgIFsnT1M9PSJ3aW4iJywgewogICAgICAgICAnZGVmaW5lcyc6IFsKICAgICAgICAgICAnTk9NSU5NQVgnLAogICAgICAgICAgICdfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUnLApAQCAtMjYzLDI4ICszOTUsNjEgQEAKICAgICAgICAgICAgICAgJ19IQVNfRVhDRVBUSU9OUz0wJywKICAgICAgICAgICAgIF0sCiAgICAgICAgICAgfV0sCisgICAgICAgICAgWyd1c2VfZ29tYT09MScsIHsKKyAgICAgICAgICAgICMgZ29tYSBkb2Vzbid0IHN1cHBvcnQgUERCIHlldC4KKyAgICAgICAgICAgICdtc3ZzX3NldHRpbmdzJzogeworICAgICAgICAgICAgICAnVkNMaW5rZXJUb29sJzogeworICAgICAgICAgICAgICAgICdHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24nOiAndHJ1ZScsCisgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICdWQ0NMQ29tcGlsZXJUb29sJzogeworICAgICAgICAgICAgICAgICdEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0JzogJzEnLAorICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICB9XSwKICAgICAgICAgXSwKLSAgICAgIH0sCi0gICAgfV0sICAjIE9TPT0id2luIgotICAgIFsnT1M9PSJtYWMiJywgewotICAgICAgJ3RhcmdldF9kZWZhdWx0cyc6IHsKKyAgICAgIH1dLCAgIyBPUz09IndpbiIKKyAgICAgIFsnT1M9PSJtYWMiJywgewogICAgICAgICAndGFyZ2V0X2NvbmRpdGlvbnMnOiBbCiAgICAgICAgICAgWydfdHlwZSE9InN0YXRpY19saWJyYXJ5IicsIHsKICAgICAgICAgICAgICd4Y29kZV9zZXR0aW5ncyc6IHsnT1RIRVJfTERGTEFHUyc6IFsnLVdsLC1zZWFyY2hfcGF0aHNfZmlyc3QnXX0sCiAgICAgICAgICAgfV0sCiAgICAgICAgIF0sICAjIHRhcmdldF9jb25kaXRpb25zCi0gICAgICB9LCAgIyB0YXJnZXRfZGVmYXVsdHMKLSAgICB9XSwgICMgT1M9PSJtYWMiCi0gICAgWyd2OF91c2VfZXh0ZXJuYWxfc3RhcnR1cF9kYXRhPT0xJywgewotICAgICAgJ3RhcmdldF9kZWZhdWx0cyc6IHsKKyAgICAgIH1dLCAgIyBPUz09Im1hYyIKKyAgICAgIFsndjhfdXNlX2V4dGVybmFsX3N0YXJ0dXBfZGF0YT09MScsIHsKICAgICAgICAgJ2RlZmluZXMnOiBbCiAgICAgICAgICAgJ1Y4X1VTRV9FWFRFUk5BTF9TVEFSVFVQX0RBVEEnLAogICAgICAgICBdLAotICAgICAgfSwKLSAgICB9XSwgICMgdjhfdXNlX2V4dGVybmFsX3N0YXJ0dXBfZGF0YT09MQotICBdLAorICAgICAgfV0sICAjIHY4X3VzZV9leHRlcm5hbF9zdGFydHVwX2RhdGE9PTEKKyAgICAgIFsnY2xhbmc9PTEgb3IgaG9zdF9jbGFuZz09MScsIHsKKyAgICAgICAgIyBUaGlzIGlzIGhlcmUgc28gdGhhdCBhbGwgZmlsZXMgZ2V0IHJlY29tcGlsZWQgYWZ0ZXIgYSBjbGFuZyByb2xsIGFuZAorICAgICAgICAjIHdoZW4gdHVybmluZyBjbGFuZyBvbiBvciBvZmYuCisgICAgICAgICMgKGRlZmluZXMgYXJlIHBhc3NlZCB2aWEgdGhlIGNvbW1hbmQgbGluZSwgYW5kIGJ1aWxkIHN5c3RlbXMgcmVidWlsZAorICAgICAgICAjIHRoaW5ncyB3aGVuIHRoZWlyIGNvbW1hbmRsaW5lIGNoYW5nZXMpLiBOb3RoaW5nIHNob3VsZCBldmVyIHJlYWQgdGhpcworICAgICAgICAjIGRlZmluZS4KKyAgICAgICAgJ2RlZmluZXMnOiBbJ0NSX0NMQU5HX1JFVklTSU9OPTwhKHB5dGhvbiA8KERFUFRIKS90b29scy9jbGFuZy9zY3JpcHRzL3VwZGF0ZS5weSAtLXByaW50LXJldmlzaW9uKSddLAorICAgICAgfV0sCisgICAgXSwKKyAgfSwKICAgJ3hjb2RlX3NldHRpbmdzJzogewogICAgICMgU2VlIGNvbW1lbnQgaW4gQ2hyb21pdW0ncyBjb21tb24uZ3lwaSBmb3Igd2h5IHRoaXMgaXMgbmVlZGVkLgogICAgICdTWU1ST09UJzogJzwoREVQVEgpL3hjb2RlYnVpbGQnLAotICB9CisgIH0sCisgICdjb25kaXRpb25zJzogWworICAgIFsnT1M9PSJsaW51eCIgb3IgT1M9PSJtYWMiJywgeworICAgICAgJ2NvbmRpdGlvbnMnOiBbCisgICAgICAgIFsnY2xhbmc9PTEnLCB7CisgICAgICAgICAgJ21ha2VfZ2xvYmFsX3NldHRpbmdzJzogWworICAgICAgICAgICAgWydDQycsICc8KGNsYW5nX2RpcikvYmluL2NsYW5nJ10sCisgICAgICAgICAgICBbJ0NYWCcsICc8KGNsYW5nX2RpcikvYmluL2NsYW5nKysnXSwKKyAgICAgICAgICBdLAorICAgICAgICB9XSwKKyAgICAgIF0sCisgICAgfV0sICAjIE9TPT0ibGludXgiIG9yIE9TPT0ibWFjIgorICAgIFsidXNlX2dvbWE9PTEiLCB7CisgICAgICAnbWFrZV9nbG9iYWxfc2V0dGluZ3MnOiBbCisgICAgICAgIFsnQ0Nfd3JhcHBlcicsICc8KGdvbWFkaXIpL2dvbWFjYyddLAorICAgICAgICBbJ0NYWF93cmFwcGVyJywgJzwoZ29tYWRpcikvZ29tYWNjJ10sCisgICAgICBdLAorICAgIH1dLCAgIyB1c2VfZ29tYT09MQorICBdLAogfQpkaWZmIC0tZ2l0IGEvY29yZS9BbmRyb2lkLm1rIGIvY29yZS9BbmRyb2lkLm1rCmluZGV4IDlmZjY0OTAuLjEyMmFmNjggMTAwNjQ0Ci0tLSBhL2NvcmUvQW5kcm9pZC5taworKysgYi9jb3JlL0FuZHJvaWQubWsKQEAgLTEsMzQyICsxLDkgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorQkFTRV9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiAKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEU6PSBsaWJwZGZpdW1jb3JlCi0KLUxPQ0FMX0FSTV9NT0RFIDo9IGFybQotTE9DQUxfTkRLX1NUTF9WQVJJQU5UIDo9IGdudXN0bF9zdGF0aWMKLQotTE9DQUxfQ0ZMQUdTICs9IC1PMyAtZnN0cmljdC1hbGlhc2luZyAtZnByZWZldGNoLWxvb3AtYXJyYXlzIC1mZXhjZXB0aW9ucwotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbm9uLXZpcnR1YWwtZHRvciAtV2FsbAotCi0jIE1hc2sgc29tZSB3YXJuaW5ncy4gVGhlc2UgYXJlIGJlbmlnbiwgYnV0IHdlIHByb2JhYmx5IHdhbnQgdG8gZml4IHRoZW0KLSMgdXBzdHJlYW0gYXQgc29tZSBwb2ludC4KLUxPQ0FMX0NGTEFHUyArPSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgXAotICAgICAgICAgICAgICAgIC1Xbm8tdW51c2VkLWZ1bmN0aW9uIFwKLSAgICAgICAgICAgICAgICAtV25vLXNpZ24tY29tcGFyZSBcCi0gICAgICAgICAgICAgICAgLVduby1taXNzaW5nLWJyYWNlcyBcCi0gICAgICAgICAgICAgICAgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyBcCi0gICAgICAgICAgICAgICAgLVduby1kZWxldGUtbm9uLXZpcnR1YWwtZHRvcgotTE9DQUxfQ0xBTkdfQ0ZMQUdTICs9IC1Xbm8tb3ZlcmxvYWRlZC12aXJ0dWFsCi0KLSMgV29yayBhcm91bmQgZ2NjIHRleHQgcmVsb2NhdGlvbiBidWcuIEZpeGVkIGluIGdjYyA0LjkuCi0jIFRPRE86IHJlbW92ZSB0aGlzIGxpbmUgYWZ0ZXIgd2UndmUgdXBncmFkZWQgdG8gZ2NjIDQuOS4KLUxPQ0FMX0NGTEFHU19hcm02NCArPSAtTzIKLQotTE9DQUxfQ0ZMQUdTX2FybTY0ICs9IC1EX0ZYX0NQVV89X0ZYX1g2NF8gLWZQSUMKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJmdDIKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICBzcmMvZmRybS9jcnlwdG8vZnhfY3J5cHQuY3BwIFwKLSAgICBzcmMvZmRybS9jcnlwdG8vZnhfY3J5cHRfYWVzLmNwcCBcCi0gICAgc3JjL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0X3NoYS5jcHAgXAotICAgIHNyYy9mcGRmZG9jL2RvY19hY3Rpb24uY3BwIFwKLSAgICBzcmMvZnBkZmRvYy9kb2NfYW5ub3QuY3BwIFwKLSAgICBzcmMvZnBkZmRvYy9kb2NfYXAuY3BwIFwKLSAgICBzcmMvZnBkZmRvYy9kb2NfYmFzaWMuY3BwIFwKLSAgICBzcmMvZnBkZmRvYy9kb2NfYm9va21hcmsuY3BwIFwKLSAgICBzcmMvZnBkZmRvYy9kb2NfZm9ybS5jcHAgXAotICAgIHNyYy9mcGRmZG9jL2RvY19mb3JtY29udHJvbC5jcHAgXAotICAgIHNyYy9mcGRmZG9jL2RvY19mb3JtZmllbGQuY3BwIFwKLSAgICBzcmMvZnBkZmRvYy9kb2NfbGluay5jcHAgXAotICAgIHNyYy9mcGRmZG9jL2RvY19tZXRhZGF0YS5jcHAgXAotICAgIHNyYy9mcGRmZG9jL2RvY19vY2cuY3BwIFwKLSAgICBzcmMvZnBkZmRvYy9kb2NfdGFnZ2VkLmNwcCBcCi0gICAgc3JjL2ZwZGZkb2MvZG9jX3V0aWxzLmNwcCBcCi0gICAgc3JjL2ZwZGZkb2MvZG9jX3ZpZXdlclByZWZlcmVuY2VzLmNwcCBcCi0gICAgc3JjL2ZwZGZkb2MvZG9jX3Z0LmNwcCBcCi0gICAgc3JjL2ZwZGZkb2MvZG9jX3Z0bW9kdWxlLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9iYXNpY19tb2R1bGUuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvQWRvYmUtQ05TMS1VQ1MyXzUuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvQjVwYy1IXzAuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvQjVwYy1WXzAuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvY21hcHNfY25zMS5jcHAgXAotICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9DTlMtRVVDLUhfMC5jcHAgXAotICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9DTlMtRVVDLVZfMC5jcHAgXAotICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9FVGVuLUI1LUhfMC5jcHAgXAotICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9FVGVuLUI1LVZfMC5jcHAgXAotICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9FVGVubXMtQjUtSF8wLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0VUZW5tcy1CNS1WXzAuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvSEtzY3MtQjUtSF81LmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0hLc2NzLUI1LVZfNS5jcHAgXAotICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9VbmlDTlMtVUNTMi1IXzMuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvVW5pQ05TLVVDUzItVl8zLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL1VuaUNOUy1VVEYxNi1IXzAuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL2ZwZGZfY21hcHMuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9BZG9iZS1HQjEtVUNTMl81LmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvY21hcHNfZ2IxLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0ItRVVDLUhfMC5jcHAgXAotICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL0dCLUVVQy1WXzAuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9HQkstRVVDLUhfMi5jcHAgXAotICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL0dCSy1FVUMtVl8yLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0JLMkstSF81LmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0JLMkstVl81LmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0JLcC1FVUMtSF8yLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0JLcC1FVUMtVl8yLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0JwYy1FVUMtSF8wLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0JwYy1FVUMtVl8wLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvVW5pR0ItVUNTMi1IXzQuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9VbmlHQi1VQ1MyLVZfNC5jcHAgXAotICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xLzgzcHYtUktTSi1IXzEuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS85MG1zLVJLU0otSF8yLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvOTBtcy1SS1NKLVZfMi5jcHAgXAotICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xLzkwbXNwLVJLU0otSF8yLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvOTBtc3AtUktTSi1WXzIuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS85MHB2LVJLU0otSF8xLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvQWRkLVJLU0otSF8xLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvQWRkLVJLU0otVl8xLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvQWRvYmUtSmFwYW4xLVVDUzJfNC5jcHAgXAotICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL2NtYXBzX2phcGFuMS5jcHAgXAotICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL0VVQy1IXzEuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9FVUMtVl8xLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvRXh0LVJLU0otSF8yLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvRXh0LVJLU0otVl8yLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvSF8xLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvVW5pSklTLVVDUzItSFctSF80LmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvVW5pSklTLVVDUzItSFctVl80LmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvVW5pSklTLVVDUzItSF80LmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvVW5pSklTLVVDUzItVl80LmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvVW5pSklTLVVURjE2LUhfNS5jcHAgXAotICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1VuaUpJUy1VVEYxNi1WXzUuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9WXzEuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9BZG9iZS1Lb3JlYTEtVUNTMl8yLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvY21hcHNfa29yZWExLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvS1NDLUVVQy1IXzAuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9LU0MtRVVDLVZfMC5jcHAgXAotICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL0tTQ21zLVVIQy1IVy1IXzEuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9LU0Ntcy1VSEMtSFctVl8xLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvS1NDbXMtVUhDLUhfMS5jcHAgXAotICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL0tTQ21zLVVIQy1WXzEuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9LU0NwYy1FVUMtSF8wLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvVW5pS1MtVUNTMi1IXzEuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9VbmlLUy1VQ1MyLVZfMS5jcHAgXAotICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL1VuaUtTLVVURjE2LUhfMC5jcHAgXAotICAgIHNyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfY29udGVudC5jcHAgXAotICAgIHNyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfY3JlYXRlLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9kb2MuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2ltYWdlLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZwZGZfZm9udC5jcHAgXAotICAgIHNyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnRfY2hhcnNldC5jcHAgXAotICAgIHNyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnRfY2lkLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9mb250L3R0Z3N1YnRhYmxlLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZS5jcHAgXAotICAgIHNyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfY29sb3JzLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9kb2MuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2Z1bmMuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2dyYXBoX3N0YXRlLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9pbWFnZS5jcHAgXAotICAgIHNyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGFyc2VyLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXJzZXJfb2xkLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXRoLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXR0ZXJuLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZG9jdW1lbnQuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9lbmNyeXB0LmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZmRmLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZmlsdGVycy5jcHAgXAotICAgIHNyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX29iamVjdHMuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9wYXJzZXIuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl91dGlsaXR5LmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXIuY3BwIFwKLSAgICBzcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9jYWNoZS5jcHAgXAotICAgIHNyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2ltYWdlLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfbG9hZGltYWdlLmNwcCBcCi0gICAgc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfcGF0dGVybi5jcHAgXAotICAgIHNyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX3RleHQuY3BwIFwKLSAgICBzcmMvZnBkZnRleHQvZnBkZl90ZXh0LmNwcCBcCi0gICAgc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dF9pbnQuY3BwIFwKLSAgICBzcmMvZnBkZnRleHQvZnBkZl90ZXh0X3NlYXJjaC5jcHAgXAotICAgIHNyYy9mcGRmdGV4dC91bmljb2Rlbm9ybWFsaXphdGlvbi5jcHAgXAotICAgIHNyYy9mcGRmdGV4dC91bmljb2Rlbm9ybWFsaXphdGlvbmRhdGEuY3BwIFwKLSAgICBzcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlYy5jcHAgXAotICAgIHNyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZheC5jcHAgXAotICAgIHNyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZsYXRlLmNwcCBcCi0gICAgc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfaWNjLmNwcCBcCi0gICAgc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfamJpZy5jcHAgXAotICAgIHNyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2piaWdfZW5jLmNwcCBcCi0gICAgc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanBlZy5jcHAgXAotICAgIHNyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pweF9vcGouY3BwIFwKLSAgICBzcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfYmlvLmMgXAotICAgIHNyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9jaW8uYyBcCi0gICAgc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X2R3dC5jIFwKLSAgICBzcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfZXZlbnQuYyBcCi0gICAgc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X2Z1bmN0aW9uX2xpc3QuYyBcCi0gICAgc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X2ltYWdlLmMgXAotICAgIHNyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9pbnZlcnQuYyBcCi0gICAgc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X2oyay5jIFwKLSAgICBzcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfajJrX2xpYi5jIFwKLSAgICBzcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfanB0LmMgXAotICAgIHNyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9tY3QuYyBcCi0gICAgc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X21xYy5jIFwKLSAgICBzcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfb3BlbmpwZWcuYyBcCi0gICAgc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X29wZW5qcGVnX2pwMi5jIFwKLSAgICBzcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfb3BqX2Nsb2NrLmMgXAotICAgIHNyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9waS5jIFwKLSAgICBzcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfcmF3LmMgXAotICAgIHNyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF90MS5jIFwKLSAgICBzcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfdDFfZ2VuZXJhdGVfbHV0cy5jIFwKLSAgICBzcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfdDIuYyBcCi0gICAgc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X3RjZC5jIFwKLSAgICBzcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfdGd0LmMgXAotICAgIHNyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfYWRsZXIzMi5jIFwKLSAgICBzcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX2NvbXByZXNzLmMgXAotICAgIHNyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfY3JjMzIuYyBcCi0gICAgc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl9kZWZsYXRlLmMgXAotICAgIHNyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfZ3pjbG9zZS5jIFwKLSAgICBzcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX2d6bGliLmMgXAotICAgIHNyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfZ3pyZWFkLmMgXAotICAgIHNyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfZ3p3cml0ZS5jIFwKLSAgICBzcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX2luZmJhY2suYyBcCi0gICAgc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl9pbmZmYXN0LmMgXAotICAgIHNyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfaW5mbGF0ZS5jIFwKLSAgICBzcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX2luZnRyZWVzLmMgXAotICAgIHNyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfdHJlZXMuYyBcCi0gICAgc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl91bmNvbXByLmMgXAotICAgIHNyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfenV0aWwuYyBcCi0gICAgc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQXJpdGhJbnREZWNvZGVyLmNwcCBcCi0gICAgc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQ29udGV4dC5jcHAgXAotICAgIHNyYy9meGNvZGVjL2piaWcyL0pCaWcyX0dlbmVyYWxEZWNvZGVyLmNwcCBcCi0gICAgc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hbkRlY29kZXIuY3BwIFwKLSAgICBzcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGUuY3BwIFwKLSAgICBzcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9JbWFnZS5jcHAgXAotICAgIHNyYy9meGNvZGVjL2piaWcyL0pCaWcyX09iamVjdC5jcHAgXAotICAgIHNyYy9meGNvZGVjL2piaWcyL0pCaWcyX1BhdHRlcm5EaWN0LmNwcCBcCi0gICAgc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU2VnbWVudC5jcHAgXAotICAgIHNyYy9meGNvZGVjL2piaWcyL0pCaWcyX1N5bWJvbERpY3QuY3BwIFwKLSAgICBzcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zY2FtMDIuYyBcCi0gICAgc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc2NnYXRzLmMgXAotICAgIHNyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNjbnZydC5jIFwKLSAgICBzcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zZXJyLmMgXAotICAgIHNyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNnYW1tYS5jIFwKLSAgICBzcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zZ210LmMgXAotICAgIHNyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNoYWxmLmMgXAotICAgIHNyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNpbnRycC5jIFwKLSAgICBzcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zaW8wLmMgXAotICAgIHNyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNpbzEuYyBcCi0gICAgc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc2x1dC5jIFwKLSAgICBzcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zbWQ1LmMgXAotICAgIHNyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNtdHJ4LmMgXAotICAgIHNyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNuYW1lZC5jIFwKLSAgICBzcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zb3B0LmMgXAotICAgIHNyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNwYWNrLmMgXAotICAgIHNyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNwY3MuYyBcCi0gICAgc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc3BsdWdpbi5jIFwKLSAgICBzcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zcHMyLmMgXAotICAgIHNyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNzYW1wLmMgXAotICAgIHNyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNzbS5jIFwKLSAgICBzcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zdHlwZXMuYyBcCi0gICAgc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc3ZpcnQuYyBcCi0gICAgc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc3d0cG50LmMgXAotICAgIHNyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXN4Zm9ybS5jIFwKLSAgICBzcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNhcGltaW4uYyBcCi0gICAgc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjYXBpc3RkLmMgXAotICAgIHNyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY2NvZWZjdC5jIFwKLSAgICBzcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNjb2xvci5jIFwKLSAgICBzcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNkY3RtZ3IuYyBcCi0gICAgc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjaHVmZi5jIFwKLSAgICBzcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNpbml0LmMgXAotICAgIHNyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY21haW5jdC5jIFwKLSAgICBzcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNtYXJrZXIuYyBcCi0gICAgc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjbWFzdGVyLmMgXAotICAgIHNyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY29tYXBpLmMgXAotICAgIHNyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY3BhcmFtLmMgXAotICAgIHNyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY3BodWZmLmMgXAotICAgIHNyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY3ByZXBjdC5jIFwKLSAgICBzcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNzYW1wbGUuYyBcCi0gICAgc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjdHJhbnMuYyBcCi0gICAgc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkYXBpbWluLmMgXAotICAgIHNyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZGFwaXN0ZC5jIFwKLSAgICBzcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamRjb2VmY3QuYyBcCi0gICAgc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkY29sb3IuYyBcCi0gICAgc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkZGN0bWdyLmMgXAotICAgIHNyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZGh1ZmYuYyBcCi0gICAgc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkaW5wdXQuYyBcCi0gICAgc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkbWFpbmN0LmMgXAotICAgIHNyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZG1hcmtlci5jIFwKLSAgICBzcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamRtYXN0ZXIuYyBcCi0gICAgc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkbWVyZ2UuYyBcCi0gICAgc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkcGh1ZmYuYyBcCi0gICAgc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkcG9zdGN0LmMgXAotICAgIHNyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZHNhbXBsZS5jIFwKLSAgICBzcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamR0cmFucy5jIFwKLSAgICBzcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamVycm9yLmMgXAotICAgIHNyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZmRjdGZzdC5jIFwKLSAgICBzcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamZkY3RpbnQuYyBcCi0gICAgc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2ppZGN0ZnN0LmMgXAotICAgIHNyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qaWRjdGludC5jIFwKLSAgICBzcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamlkY3RyZWQuYyBcCi0gICAgc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2ptZW1tZ3IuYyBcCi0gICAgc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2ptZW1ub2JzLmMgXAotICAgIHNyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qdXRpbHMuYyBcCi0gICAgc3JjL2Z4Y3J0L2Z4X2FyYWJpYy5jcHAgXAotICAgIHNyYy9meGNydC9meF9iYXNpY19hcnJheS5jcHAgXAotICAgIHNyYy9meGNydC9meF9iYXNpY19ic3RyaW5nLmNwcCBcCi0gICAgc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2J1ZmZlci5jcHAgXAotICAgIHNyYy9meGNydC9meF9iYXNpY19jb29yZHMuY3BwIFwKLSAgICBzcmMvZnhjcnQvZnhfYmFzaWNfZ2NjLmNwcCBcCi0gICAgc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2xpc3QuY3BwIFwKLSAgICBzcmMvZnhjcnQvZnhfYmFzaWNfbWFwcy5jcHAgXAotICAgIHNyYy9meGNydC9meF9iYXNpY19tZW1tZ3IuY3BwIFwKLSAgICBzcmMvZnhjcnQvZnhfYmFzaWNfcGxleC5jcHAgXAotICAgIHNyYy9meGNydC9meF9iYXNpY191dGYuY3BwIFwKLSAgICBzcmMvZnhjcnQvZnhfYmFzaWNfdXRpbC5jcHAgXAotICAgIHNyYy9meGNydC9meF9iYXNpY193c3RyaW5nLmNwcCBcCi0gICAgc3JjL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5jcHAgXAotICAgIHNyYy9meGNydC9meF91Y2RkYXRhLmNwcCBcCi0gICAgc3JjL2Z4Y3J0L2Z4X3VuaWNvZGUuY3BwIFwKLSAgICBzcmMvZnhjcnQvZnhfeG1sX2NvbXBvc2VyLmNwcCBcCi0gICAgc3JjL2Z4Y3J0L2Z4X3htbF9wYXJzZXIuY3BwIFwKLSAgICBzcmMvZnhjcnQvZnhjcnRfcGxhdGZvcm1zLmNwcCBcCi0gICAgc3JjL2Z4Y3J0L2Z4Y3J0X3Bvc2l4LmNwcCBcCi0gICAgc3JjL2Z4Y3J0L2Z4Y3J0X3dpbmRvd3MuY3BwIFwKLSAgICBzcmMvZnhnZS9hZ2cvc3JjL2Z4ZnhfYWdnX2N1cnZlcy5jcHAgXAotICAgIHNyYy9meGdlL2FnZy9zcmMvZnhmeF9hZ2dfZHJpdmVyLmNwcCBcCi0gICAgc3JjL2Z4Z2UvYWdnL3NyYy9meGZ4X2FnZ19wYXRoX3N0b3JhZ2UuY3BwIFwKLSAgICBzcmMvZnhnZS9hZ2cvc3JjL2Z4ZnhfYWdnX3Jhc3Rlcml6ZXJfc2NhbmxpbmVfYWEuY3BwIFwKLSAgICBzcmMvZnhnZS9hZ2cvc3JjL2Z4ZnhfYWdnX3ZjZ2VuX2Rhc2guY3BwIFwKLSAgICBzcmMvZnhnZS9hZ2cvc3JjL2Z4ZnhfYWdnX3ZjZ2VuX3N0cm9rZS5jcHAgXAotICAgIHNyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFmb250LmNwcCBcCi0gICAgc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnRtZ3IuY3BwIFwKLSAgICBzcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhbW9kdWxlLmNwcCBcCi0gICAgc3JjL2Z4Z2UvYW5kcm9pZC9meF9hbmRyb2lkX2ZvbnQuY3BwIFwKLSAgICBzcmMvZnhnZS9hbmRyb2lkL2Z4X2FuZHJvaWRfaW1wLmNwcCBcCi0gICAgc3JjL2Z4Z2UvYXBwbGUvZnhfYXBwbGVfcGxhdGZvcm0uY3BwIFwKLSAgICBzcmMvZnhnZS9hcHBsZS9meF9tYWNfaW1wLmNwcCBcCi0gICAgc3JjL2Z4Z2UvYXBwbGUvZnhfcXVhcnR6X2RldmljZS5jcHAgXAotICAgIHNyYy9meGdlL2RpYi9meF9kaWJfY29tcG9zaXRlLmNwcCBcCi0gICAgc3JjL2Z4Z2UvZGliL2Z4X2RpYl9jb252ZXJ0LmNwcCBcCi0gICAgc3JjL2Z4Z2UvZGliL2Z4X2RpYl9lbmdpbmUuY3BwIFwKLSAgICBzcmMvZnhnZS9kaWIvZnhfZGliX21haW4uY3BwIFwKLSAgICBzcmMvZnhnZS9kaWIvZnhfZGliX3RyYW5zZm9ybS5jcHAgXAotICAgIHNyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0RGluZ2JhdHMuYyBcCi0gICAgc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRGaXhlZC5jIFwKLSAgICBzcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdEZpeGVkQm9sZC5jIFwKLSAgICBzcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdEZpeGVkQm9sZEl0YWxpYy5jIFwKLSAgICBzcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdEZpeGVkSXRhbGljLmMgXAotICAgIHNyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0U2Fucy5jIFwKLSAgICBzcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdFNhbnNCb2xkLmMgXAotICAgIHNyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0U2Fuc0JvbGRJdGFsaWMuYyBcCi0gICAgc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTYW5zSXRhbGljLmMgXAotICAgIHNyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0U2Fuc01NLmMgXAotICAgIHNyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0U2VyaWYuYyBcCi0gICAgc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTZXJpZkJvbGQuYyBcCi0gICAgc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTZXJpZkJvbGRJdGFsaWMuYyBcCi0gICAgc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTZXJpZkl0YWxpYy5jIFwKLSAgICBzcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdFNlcmlmTU0uYyBcCi0gICAgc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTeW1ib2wuYyBcCi0gICAgc3JjL2Z4Z2UvZnJlZXR5cGUvZnhfZnJlZXR5cGUuYyBcCi0gICAgc3JjL2Z4Z2UvZ2UvZnhfZ2UuY3BwIFwKLSAgICBzcmMvZnhnZS9nZS9meF9nZV9kZXZpY2UuY3BwIFwKLSAgICBzcmMvZnhnZS9nZS9meF9nZV9mb250LmNwcCBcCi0gICAgc3JjL2Z4Z2UvZ2UvZnhfZ2VfZm9udG1hcC5jcHAgXAotICAgIHNyYy9meGdlL2dlL2Z4X2dlX2xpbnV4LmNwcCBcCi0gICAgc3JjL2Z4Z2UvZ2UvZnhfZ2VfcGF0aC5jcHAgXAotICAgIHNyYy9meGdlL2dlL2Z4X2dlX3BzLmNwcCBcCi0gICAgc3JjL2Z4Z2UvZ2UvZnhfZ2VfdGV4dC5jcHAKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgZXh0ZXJuYWwvZnJlZXR5cGUvaW5jbHVkZQotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCitpbmNsdWRlICQoQkFTRV9QQVRIKS9wZGZpdW1mZHJtLm1rCitpbmNsdWRlICQoQkFTRV9QQVRIKS9wZGZpdW1mcGRmYXBpLm1rCitpbmNsdWRlICQoQkFTRV9QQVRIKS9wZGZpdW1mcGRmZG9jLm1rCitpbmNsdWRlICQoQkFTRV9QQVRIKS9wZGZpdW1mcGRmdGV4dC5taworaW5jbHVkZSAkKEJBU0VfUEFUSCkvcGRmaXVtZnhjb2RlYy5taworaW5jbHVkZSAkKEJBU0VfUEFUSCkvcGRmaXVtZnhjcnQubWsKK2luY2x1ZGUgJChCQVNFX1BBVEgpL3BkZml1bWZ4Z2UubWsKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9mZHJtL2Z4X2NyeXB0LmggYi9jb3JlL2luY2x1ZGUvZmRybS9meF9jcnlwdC5oCmluZGV4IDdiZDY5ZGUuLjI1OWRjODUgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mZHJtL2Z4X2NyeXB0LmgKKysrIGIvY29yZS9pbmNsdWRlL2Zkcm0vZnhfY3J5cHQuaApAQCAtNyw0MCArNyw2MiBAQAogI2lmbmRlZiBDT1JFX0lOQ0xVREVfRkRSTV9GWF9DUllQVF9IXwogI2RlZmluZSBDT1JFX0lOQ0xVREVfRkRSTV9GWF9DUllQVF9IXwogCi0jaW5jbHVkZSAiLi4vZnhjcnQvZnhfYmFzaWMuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmgiCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAotdm9pZCBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayhGWF9MUEJZVEUgZGF0YSwgRlhfRFdPUkQgc2l6ZSwgRlhfTFBDQllURSBrZXksIEZYX0RXT1JEIGtleWxlbik7Ci12b2lkIENSWVBUX0FyY0ZvdXJTZXR1cChGWF9MUFZPSUQgY29udGV4dCwgRlhfTFBDQllURSBrZXksIEZYX0RXT1JEIGxlbmd0aCk7Ci12b2lkIENSWVBUX0FyY0ZvdXJDcnlwdChGWF9MUFZPSUQgY29udGV4dCwgRlhfTFBCWVRFIGRhdGEsIEZYX0RXT1JEIHNpemUpOwotdm9pZCBDUllQVF9BRVNTZXRLZXkoRlhfTFBWT0lEIGNvbnRleHQsIEZYX0RXT1JEIGJsb2NrbGVuLCBGWF9MUENCWVRFIGtleSwgRlhfRFdPUkQga2V5bGVuLCBGWF9CT09MIGJFbmNyeXB0KTsKLXZvaWQgQ1JZUFRfQUVTU2V0SVYoRlhfTFBWT0lEIGNvbnRleHQsIEZYX0xQQ0JZVEUgaXYpOwotdm9pZCBDUllQVF9BRVNEZWNyeXB0KEZYX0xQVk9JRCBjb250ZXh0LCBGWF9MUEJZVEUgZGVzdCwgRlhfTFBDQllURSBzcmMsIEZYX0RXT1JEIHNpemUpOwotdm9pZCBDUllQVF9BRVNFbmNyeXB0KEZYX0xQVk9JRCBjb250ZXh0LCBGWF9MUEJZVEUgZGVzdCwgRlhfTFBDQllURSBzcmMsIEZYX0RXT1JEIHNpemUpOwotdm9pZCBDUllQVF9NRDVHZW5lcmF0ZShGWF9MUENCWVRFIGRhdGEsIEZYX0RXT1JEIHNpemUsIEZYX0JZVEUgZGlnZXN0WzE2XSk7Ci12b2lkIENSWVBUX01ENVN0YXJ0KEZYX0xQVk9JRCBjb250ZXh0KTsKLXZvaWQgQ1JZUFRfTUQ1VXBkYXRlKEZYX0xQVk9JRCBjb250ZXh0LCBGWF9MUENCWVRFIGRhdGEsIEZYX0RXT1JEIHNpemUpOwotdm9pZCBDUllQVF9NRDVGaW5pc2goRlhfTFBWT0lEIGNvbnRleHQsIEZYX0JZVEUgZGlnZXN0WzE2XSk7Ci12b2lkIENSWVBUX1NIQTFHZW5lcmF0ZShGWF9MUENCWVRFIGRhdGEsIEZYX0RXT1JEIHNpemUsIEZYX0JZVEUgZGlnZXN0WzIwXSk7Ci12b2lkIENSWVBUX1NIQTFTdGFydChGWF9MUFZPSUQgY29udGV4dCk7Ci12b2lkIENSWVBUX1NIQTFVcGRhdGUoRlhfTFBWT0lEIGNvbnRleHQsIEZYX0xQQ0JZVEUgZGF0YSwgRlhfRFdPUkQgc2l6ZSk7Ci12b2lkIENSWVBUX1NIQTFGaW5pc2goRlhfTFBWT0lEIGNvbnRleHQsIEZYX0JZVEUgZGlnZXN0WzIwXSk7Ci12b2lkIENSWVBUX1NIQTI1NkdlbmVyYXRlKEZYX0xQQ0JZVEUgZGF0YSwgRlhfRFdPUkQgc2l6ZSwgRlhfQllURSBkaWdlc3RbMzJdKTsKLXZvaWQgQ1JZUFRfU0hBMjU2U3RhcnQoRlhfTFBWT0lEIGNvbnRleHQpOwotdm9pZCBDUllQVF9TSEEyNTZVcGRhdGUoRlhfTFBWT0lEIGNvbnRleHQsIEZYX0xQQ0JZVEUgZGF0YSwgRlhfRFdPUkQgc2l6ZSk7Ci12b2lkIENSWVBUX1NIQTI1NkZpbmlzaChGWF9MUFZPSUQgY29udGV4dCwgRlhfQllURSBkaWdlc3RbMzJdKTsKLXZvaWQgQ1JZUFRfU0hBMzg0U3RhcnQoRlhfTFBWT0lEIGNvbnRleHQpOwotdm9pZCBDUllQVF9TSEEzODRVcGRhdGUoRlhfTFBWT0lEIGNvbnRleHQsIEZYX0xQQ0JZVEUgZGF0YSwgRlhfRFdPUkQgc2l6ZSk7Ci12b2lkIENSWVBUX1NIQTM4NEZpbmlzaChGWF9MUFZPSUQgY29udGV4dCwgRlhfQllURSBkaWdlc3RbNDhdKTsKLXZvaWQgQ1JZUFRfU0hBMzg0R2VuZXJhdGUoRlhfTFBDQllURSBkYXRhLCBGWF9EV09SRCBzaXplLCBGWF9CWVRFIGRpZ2VzdFs0OF0pOwotdm9pZCBDUllQVF9TSEE1MTJTdGFydChGWF9MUFZPSUQgY29udGV4dCk7Ci12b2lkIENSWVBUX1NIQTUxMlVwZGF0ZShGWF9MUFZPSUQgY29udGV4dCwgRlhfTFBDQllURSBkYXRhLCBGWF9EV09SRCBzaXplKTsKLXZvaWQgQ1JZUFRfU0hBNTEyRmluaXNoKEZYX0xQVk9JRCBjb250ZXh0LCBGWF9CWVRFIGRpZ2VzdFs2NF0pOwotdm9pZCBDUllQVF9TSEE1MTJHZW5lcmF0ZShGWF9MUENCWVRFIGRhdGEsIEZYX0RXT1JEIHNpemUsIEZYX0JZVEUgZGlnZXN0WzY0XSk7Ci12b2lkIENSWVBUX1NldFB1YktleURlY3J5cHRvcihGWF9CT09MICgqZnVuYykoRlhfTFBDQllURSBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgRlhfTFBCWVRFIGRhdGFfYnVmLCBGWF9EV09SRCYgZGF0YV9sZW4pKTsKK3ZvaWQgQ1JZUFRfQXJjRm91ckNyeXB0QmxvY2sodWludDhfdCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCoga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBrZXlsZW4pOwordm9pZCBDUllQVF9BcmNGb3VyU2V0dXAodm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCoga2V5LCBGWF9EV09SRCBsZW5ndGgpOwordm9pZCBDUllQVF9BcmNGb3VyQ3J5cHQodm9pZCogY29udGV4dCwgdWludDhfdCogZGF0YSwgRlhfRFdPUkQgc2l6ZSk7Cit2b2lkIENSWVBUX0FFU1NldEtleSh2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgYmxvY2tsZW4sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBrZXksCisgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBrZXlsZW4sCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJFbmNyeXB0KTsKK3ZvaWQgQ1JZUFRfQUVTU2V0SVYodm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogaXYpOwordm9pZCBDUllQVF9BRVNEZWNyeXB0KHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSk7Cit2b2lkIENSWVBUX0FFU0VuY3J5cHQodm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplKTsKK3ZvaWQgQ1JZUFRfTUQ1R2VuZXJhdGUoY29uc3QgdWludDhfdCogZGF0YSwgRlhfRFdPUkQgc2l6ZSwgdWludDhfdCBkaWdlc3RbMTZdKTsKK3ZvaWQgQ1JZUFRfTUQ1U3RhcnQodm9pZCogY29udGV4dCk7Cit2b2lkIENSWVBUX01ENVVwZGF0ZSh2b2lkKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplKTsKK3ZvaWQgQ1JZUFRfTUQ1RmluaXNoKHZvaWQqIGNvbnRleHQsIHVpbnQ4X3QgZGlnZXN0WzE2XSk7Cit2b2lkIENSWVBUX1NIQTFHZW5lcmF0ZShjb25zdCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplLCB1aW50OF90IGRpZ2VzdFsyMF0pOwordm9pZCBDUllQVF9TSEExU3RhcnQodm9pZCogY29udGV4dCk7Cit2b2lkIENSWVBUX1NIQTFVcGRhdGUodm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogZGF0YSwgRlhfRFdPUkQgc2l6ZSk7Cit2b2lkIENSWVBUX1NIQTFGaW5pc2godm9pZCogY29udGV4dCwgdWludDhfdCBkaWdlc3RbMjBdKTsKK3ZvaWQgQ1JZUFRfU0hBMjU2R2VuZXJhdGUoY29uc3QgdWludDhfdCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkaWdlc3RbMzJdKTsKK3ZvaWQgQ1JZUFRfU0hBMjU2U3RhcnQodm9pZCogY29udGV4dCk7Cit2b2lkIENSWVBUX1NIQTI1NlVwZGF0ZSh2b2lkKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplKTsKK3ZvaWQgQ1JZUFRfU0hBMjU2RmluaXNoKHZvaWQqIGNvbnRleHQsIHVpbnQ4X3QgZGlnZXN0WzMyXSk7Cit2b2lkIENSWVBUX1NIQTM4NFN0YXJ0KHZvaWQqIGNvbnRleHQpOwordm9pZCBDUllQVF9TSEEzODRVcGRhdGUodm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogZGF0YSwgRlhfRFdPUkQgc2l6ZSk7Cit2b2lkIENSWVBUX1NIQTM4NEZpbmlzaCh2b2lkKiBjb250ZXh0LCB1aW50OF90IGRpZ2VzdFs0OF0pOwordm9pZCBDUllQVF9TSEEzODRHZW5lcmF0ZShjb25zdCB1aW50OF90KiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRpZ2VzdFs0OF0pOwordm9pZCBDUllQVF9TSEE1MTJTdGFydCh2b2lkKiBjb250ZXh0KTsKK3ZvaWQgQ1JZUFRfU0hBNTEyVXBkYXRlKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIEZYX0RXT1JEIHNpemUpOwordm9pZCBDUllQVF9TSEE1MTJGaW5pc2godm9pZCogY29udGV4dCwgdWludDhfdCBkaWdlc3RbNjRdKTsKK3ZvaWQgQ1JZUFRfU0hBNTEyR2VuZXJhdGUoY29uc3QgdWludDhfdCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkaWdlc3RbNjRdKTsKK3ZvaWQgQ1JZUFRfU2V0UHViS2V5RGVjcnlwdG9yKEZYX0JPT0wgKCpmdW5jKShjb25zdCB1aW50OF90KiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRhdGFfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkYXRhX2xlbikpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH07CmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oIGIvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaAppbmRleCA1YmUyYjE5Li5lMjJiNjNlIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgKQEAgLTEsMTggKzEsMjEgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBDT1JFX0lOQ0xVREVfRlBERkFQSV9GUERGX01PRFVMRV9IXwogI2RlZmluZSBDT1JFX0lOQ0xVREVfRlBERkFQSV9GUERGX01PRFVMRV9IXwogCi0jaW5jbHVkZSAiLi4vZnhjcnQvZnhfZXh0LmgiCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgogCiBjbGFzcyBDQ29kZWNfTW9kdWxlTWdyOwotY2xhc3MgQ0ZYX0FmZmluZU1hdHJpeDsKIGNsYXNzIENGWF9CaXRtYXBEZXZpY2U7CiBjbGFzcyBDRlhfRElCU291cmNlOworY2xhc3MgQ0ZYX01hdHJpeDsKIGNsYXNzIENQREZfQ29sb3JTcGFjZTsKIGNsYXNzIENQREZfRGljdGlvbmFyeTsKIGNsYXNzIENQREZfRG9jUGFnZURhdGE7CkBAIC0yMCwxMyArMjMsMTAgQEAKIGNsYXNzIENQREZfRG9jdW1lbnQ7CiBjbGFzcyBDUERGX0ZvbnRHbG9iYWxzOwogY2xhc3MgQ1BERl9JbWFnZTsKLWNsYXNzIENQREZfTW9kdWxlTWdyOwogY2xhc3MgQ1BERl9QYWdlOwotY2xhc3MgQ1BERl9QYWdlTW9kdWxlRGVmOwogY2xhc3MgQ1BERl9QYWdlT2JqZWN0czsKIGNsYXNzIENQREZfUGFnZVJlbmRlckNhY2hlOwogY2xhc3MgQ1BERl9SZW5kZXJDb25maWc7Ci1jbGFzcyBDUERGX1JlbmRlck1vZHVsZURlZjsKIGNsYXNzIENQREZfUmVuZGVyT3B0aW9uczsKIGNsYXNzIENQREZfU2VjdXJpdHlIYW5kbGVyOwogY2xhc3MgQ1BERl9TdHJlYW07CkBAIC0zNywxNjIgKzM3LDc4IEBACiBjbGFzcyBJQ29kZWNfSnBlZ01vZHVsZTsKIGNsYXNzIElDb2RlY19KcHhNb2R1bGU7CiBjbGFzcyBJUERGX0ZvbnRNYXBwZXI7CitjbGFzcyBJUERGX1BhZ2VNb2R1bGU7CitjbGFzcyBJUERGX1JlbmRlck1vZHVsZTsKIAotI2RlZmluZSBBRERJTl9OQU1FX0NKSwkJCSJFYXN0ZXJuIEFzaWFuIExhbmd1YWdlIFN1cHBvcnQiCi0jZGVmaW5lIEFERElOX05BTUVfREVDT0RFUgkJIkpQRUcyMDAwIGFuZCBKQklHMiBJbWFnZSBEZWNvZGVycyIKK2NsYXNzIENQREZfTW9kdWxlTWdyIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBDUERGX01vZHVsZU1nciogR2V0KCk7CisgIHN0YXRpYyB2b2lkIENyZWF0ZSgpOworICBzdGF0aWMgdm9pZCBEZXN0cm95KCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0ZpbGVCdWZTaXplID0gNTEyOwogCi1jbGFzcyBDUERGX01vZHVsZU1nciAKLXsKLXB1YmxpYzoKKyAgdm9pZCBTZXRDb2RlY01vZHVsZShDQ29kZWNfTW9kdWxlTWdyKiBwTW9kdWxlKSB7IG1fcENvZGVjTW9kdWxlID0gcE1vZHVsZTsgfQorICBDQ29kZWNfTW9kdWxlTWdyKiBHZXRDb2RlY01vZHVsZSgpIHsgcmV0dXJuIG1fcENvZGVjTW9kdWxlOyB9CiAKLSAgICBzdGF0aWMgdm9pZAlDcmVhdGUoKTsKKyAgdm9pZCBJbml0UGFnZU1vZHVsZSgpOworICB2b2lkIEluaXRSZW5kZXJNb2R1bGUoKTsKIAotICAgIHN0YXRpYyBDUERGX01vZHVsZU1ncioJR2V0KCk7CisgIElQREZfUmVuZGVyTW9kdWxlKiBHZXRSZW5kZXJNb2R1bGUoKSBjb25zdCB7IHJldHVybiBtX3BSZW5kZXJNb2R1bGUuZ2V0KCk7IH0KKyAgSVBERl9QYWdlTW9kdWxlKiBHZXRQYWdlTW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbV9wUGFnZU1vZHVsZS5nZXQoKTsgfQogCi0gICAgc3RhdGljIHZvaWQJRGVzdHJveSgpOworICB2b2lkIExvYWRFbWJlZGRlZEdCMUNNYXBzKCk7CisgIHZvaWQgTG9hZEVtYmVkZGVkQ05TMUNNYXBzKCk7CisgIHZvaWQgTG9hZEVtYmVkZGVkSmFwYW4xQ01hcHMoKTsKKyAgdm9pZCBMb2FkRW1iZWRkZWRLb3JlYTFDTWFwcygpOwogCisgIElDb2RlY19GYXhNb2R1bGUqIEdldEZheE1vZHVsZSgpOworICBJQ29kZWNfSnBlZ01vZHVsZSogR2V0SnBlZ01vZHVsZSgpOworICBJQ29kZWNfSnB4TW9kdWxlKiBHZXRKcHhNb2R1bGUoKTsKKyAgSUNvZGVjX0piaWcyTW9kdWxlKiBHZXRKYmlnMk1vZHVsZSgpOworICBJQ29kZWNfSWNjTW9kdWxlKiBHZXRJY2NNb2R1bGUoKTsKKyAgSUNvZGVjX0ZsYXRlTW9kdWxlKiBHZXRGbGF0ZU1vZHVsZSgpOwogCisgIHZvaWQgU2V0UHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgIFBEX0NBTExCQUNLX0ZSRUVEQVRBIGNhbGxiYWNrKTsKIAotICAgIHZvaWQJCVNldENvZGVjTW9kdWxlKENDb2RlY19Nb2R1bGVNZ3IqIHBNb2R1bGUpCi0gICAgewotICAgICAgICBtX3BDb2RlY01vZHVsZSA9IHBNb2R1bGU7Ci0gICAgfQotICAgIENDb2RlY19Nb2R1bGVNZ3IqCQlHZXRDb2RlY01vZHVsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wQ29kZWNNb2R1bGU7Ci0gICAgfQorICB2b2lkKiBHZXRQcml2YXRlRGF0YSh2b2lkKiBtb2R1bGVfaWQpOwogCi0gICAgdm9pZAkJSW5pdFBhZ2VNb2R1bGUoKTsKKyBwcml2YXRlOgorICBDUERGX01vZHVsZU1ncigpOworICB+Q1BERl9Nb2R1bGVNZ3IoKTsKIAotICAgIHZvaWQJCUluaXRSZW5kZXJNb2R1bGUoKTsKLQotICAgIHZvaWQJCVNldERvd25sb2FkQ2FsbGJhY2soRlhfQk9PTCAoKmNhbGxiYWNrKShGWF9MUENTVFIgbW9kdWxlX25hbWUpKTsKLQotICAgIEZYX0JPT0wJCURvd25sb2FkTW9kdWxlKEZYX0xQQ1NUUiBtb2R1bGVfbmFtZSk7Ci0KLSAgICB2b2lkCQlOb3RpZnlNb2R1bGVBdmFpbGFibGUoRlhfTFBDU1RSIG1vZHVsZV9uYW1lKTsKLQotCi0KLSAgICBDUERGX1JlbmRlck1vZHVsZURlZioJR2V0UmVuZGVyTW9kdWxlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BSZW5kZXJNb2R1bGU7Ci0gICAgfQotCi0gICAgQ1BERl9QYWdlTW9kdWxlRGVmKgkJR2V0UGFnZU1vZHVsZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wUGFnZU1vZHVsZTsKLSAgICB9Ci0KLQotCi0KLSAgICB2b2lkCQkJCQlMb2FkRW1iZWRkZWRHQjFDTWFwcygpOwotCi0gICAgdm9pZAkJCQkJTG9hZEVtYmVkZGVkQ05TMUNNYXBzKCk7Ci0KLSAgICB2b2lkCQkJCQlMb2FkRW1iZWRkZWRKYXBhbjFDTWFwcygpOwotCi0gICAgdm9pZAkJCQkJTG9hZEVtYmVkZGVkS29yZWExQ01hcHMoKTsKLQotICAgIElDb2RlY19GYXhNb2R1bGUqCQlHZXRGYXhNb2R1bGUoKTsKLSAgICBJQ29kZWNfSnBlZ01vZHVsZSoJCUdldEpwZWdNb2R1bGUoKTsKLSAgICBJQ29kZWNfSnB4TW9kdWxlKgkJR2V0SnB4TW9kdWxlKCk7Ci0gICAgSUNvZGVjX0piaWcyTW9kdWxlKgkJR2V0SmJpZzJNb2R1bGUoKTsKLSAgICBJQ29kZWNfSWNjTW9kdWxlKgkJR2V0SWNjTW9kdWxlKCk7Ci0gICAgSUNvZGVjX0ZsYXRlTW9kdWxlKgkJR2V0RmxhdGVNb2R1bGUoKTsKLQotICAgIHZvaWQJCQkJCVJlZ2lzdGVyU2VjdXJpdHlIYW5kbGVyKEZYX0xQQ1NUUiBuYW1lLCBDUERGX1NlY3VyaXR5SGFuZGxlciAqICgqQ3JlYXRlSGFuZGxlcikodm9pZCogcGFyYW0pLCB2b2lkKiBwYXJhbSk7Ci0KLSAgICBDUERGX1NlY3VyaXR5SGFuZGxlcioJQ3JlYXRlU2VjdXJpdHlIYW5kbGVyKEZYX0xQQ1NUUiBuYW1lKTsKLQotICAgIHZvaWQJCQkJCVNldFByaXZhdGVEYXRhKEZYX0xQVk9JRCBtb2R1bGVfaWQsIEZYX0xQVk9JRCBwRGF0YSwgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2spOwotCi0gICAgRlhfTFBWT0lECQkJCUdldFByaXZhdGVEYXRhKEZYX0xQVk9JRCBtb2R1bGVfaWQpOwotCi0gICAgaW50CQkJCQkJbV9GaWxlQnVmU2l6ZTsKLXByb3RlY3RlZDoKLQotICAgIENQREZfTW9kdWxlTWdyKCk7Ci0KLSAgICB+Q1BERl9Nb2R1bGVNZ3IoKTsKLSAgICB2b2lkCQkJCQlJbml0aWFsaXplKCk7Ci0KLSAgICB2b2lkCQkJCQlJbml0TW9kdWxlcygpOwotCi0KLQotICAgIENDb2RlY19Nb2R1bGVNZ3IqCQltX3BDb2RlY01vZHVsZTsKLQotICAgIENQREZfUmVuZGVyTW9kdWxlRGVmKgltX3BSZW5kZXJNb2R1bGU7Ci0KLSAgICBDUERGX1BhZ2VNb2R1bGVEZWYqCQltX3BQYWdlTW9kdWxlOwotCi0KLSAgICBGWF9CT09MICgqbV9wRG93bmxvYWRDYWxsYmFjaykoRlhfTFBDU1RSIG1vZHVsZV9uYW1lKTsKLQotICAgIENGWF9NYXBCeXRlU3RyaW5nVG9QdHIJbV9TZWN1cml0eUhhbmRsZXJNYXA7Ci0KLSAgICBDRlhfUHJpdmF0ZURhdGEJCQltX3ByaXZhdGVEYXRhOworICBDQ29kZWNfTW9kdWxlTWdyKiBtX3BDb2RlY01vZHVsZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREZfUmVuZGVyTW9kdWxlPiBtX3BSZW5kZXJNb2R1bGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERGX1BhZ2VNb2R1bGU+IG1fcFBhZ2VNb2R1bGU7CisgIEZYX0JPT0wgKCptX3BEb3dubG9hZENhbGxiYWNrKShjb25zdCBGWF9DSEFSKiBtb2R1bGVfbmFtZSk7CisgIENGWF9Qcml2YXRlRGF0YSBtX3ByaXZhdGVEYXRhOwogfTsKLWNsYXNzIENQREZfUGFnZU1vZHVsZURlZiAKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5DUERGX1BhZ2VNb2R1bGVEZWYoKSB7fQogCi0gICAgdmlydHVhbCBDUERGX0RvY1BhZ2VEYXRhKglDcmVhdGVEb2NEYXRhKENQREZfRG9jdW1lbnQqIHBEb2MpCi0gICAgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CitjbGFzcyBJUERGX1BhZ2VNb2R1bGUgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SVBERl9QYWdlTW9kdWxlKCkge30KIAotICAgIHZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlRG9jKENQREZfRG9jdW1lbnQqKSB7fQotICAgIHZpcnR1YWwgdm9pZAkJCQlDbGVhckRvYyhDUERGX0RvY3VtZW50Kikge30KLQotICAgIHZpcnR1YWwgQ1BERl9Gb250R2xvYmFscyoJR2V0Rm9udEdsb2JhbHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkCQkJCUNsZWFyU3RvY2tGb250KENQREZfRG9jdW1lbnQqIHBEb2MpIHt9Ci0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJTm90aWZ5Q0pLQXZhaWxhYmxlKCkge30KLQotICAgIHZpcnR1YWwgQ1BERl9Db2xvclNwYWNlKglHZXRTdG9ja0NTKGludCBmYW1pbHkpCi0gICAgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CisgIHZpcnR1YWwgQ1BERl9Eb2NQYWdlRGF0YSogQ3JlYXRlRG9jRGF0YShDUERGX0RvY3VtZW50KiBwRG9jKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlRG9jKENQREZfRG9jdW1lbnQqKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBDbGVhckRvYyhDUERGX0RvY3VtZW50KikgPSAwOworICB2aXJ0dWFsIENQREZfRm9udEdsb2JhbHMqIEdldEZvbnRHbG9iYWxzKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgQ2xlYXJTdG9ja0ZvbnQoQ1BERl9Eb2N1bWVudCogcERvYykgPSAwOworICB2aXJ0dWFsIHZvaWQgTm90aWZ5Q0pLQXZhaWxhYmxlKCkgPSAwOworICB2aXJ0dWFsIENQREZfQ29sb3JTcGFjZSogR2V0U3RvY2tDUyhpbnQgZmFtaWx5KSA9IDA7CiB9OwotY2xhc3MgQ1BERl9SZW5kZXJNb2R1bGVEZWYgCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+Q1BERl9SZW5kZXJNb2R1bGVEZWYoKSB7fQogCi0gICAgdmlydHVhbCBDUERGX0RvY1JlbmRlckRhdGEqCUNyZWF0ZURvY0RhdGEoQ1BERl9Eb2N1bWVudCogcERvYykKLSAgICB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KK2NsYXNzIElQREZfUmVuZGVyTW9kdWxlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklQREZfUmVuZGVyTW9kdWxlKCkge30KIAotICAgIHZpcnR1YWwgdm9pZAlEZXN0cm95RG9jRGF0YShDUERGX0RvY1JlbmRlckRhdGEqKSB7fQotICAgIHZpcnR1YWwgdm9pZAlDbGVhckRvY0RhdGEoQ1BERl9Eb2NSZW5kZXJEYXRhKikge30KLQotICAgIHZpcnR1YWwgQ1BERl9Eb2NSZW5kZXJEYXRhKiBHZXRSZW5kZXJEYXRhKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHZpcnR1YWwgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqCUNyZWF0ZVBhZ2VDYWNoZShDUERGX1BhZ2UqIHBQYWdlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkCURlc3Ryb3lQYWdlQ2FjaGUoQ1BERl9QYWdlUmVuZGVyQ2FjaGUqKSB7fQotCi0gICAgdmlydHVhbCB2b2lkCU5vdGlmeURlY29kZXJBdmFpbGFibGUoKSB7fQotCi0gICAgdmlydHVhbCBDUERGX1JlbmRlckNvbmZpZyogR2V0Q29uZmlnKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KKyAgdmlydHVhbCBDUERGX0RvY1JlbmRlckRhdGEqIENyZWF0ZURvY0RhdGEoQ1BERl9Eb2N1bWVudCogcERvYykgPSAwOworICB2aXJ0dWFsIHZvaWQgRGVzdHJveURvY0RhdGEoQ1BERl9Eb2NSZW5kZXJEYXRhKikgPSAwOworICB2aXJ0dWFsIHZvaWQgQ2xlYXJEb2NEYXRhKENQREZfRG9jUmVuZGVyRGF0YSopID0gMDsKKyAgdmlydHVhbCBDUERGX0RvY1JlbmRlckRhdGEqIEdldFJlbmRlckRhdGEoKSA9IDA7CisgIHZpcnR1YWwgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIENyZWF0ZVBhZ2VDYWNoZShDUERGX1BhZ2UqIHBQYWdlKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBEZXN0cm95UGFnZUNhY2hlKENQREZfUGFnZVJlbmRlckNhY2hlKikgPSAwOworICB2aXJ0dWFsIENQREZfUmVuZGVyQ29uZmlnKiBHZXRDb25maWcoKSA9IDA7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GUERGQVBJX0ZQREZfTU9EVUxFX0hfCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX29iamVjdHMuaCBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfb2JqZWN0cy5oCmluZGV4IDBhZDY0MWEuLjkyY2UwYjkgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfb2JqZWN0cy5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfb2JqZWN0cy5oCkBAIC0xLDIwICsxLDI1IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgQ09SRV9JTkNMVURFX0ZQREZBUElfRlBERl9PQkpFQ1RTX0hfCiAjZGVmaW5lIENPUkVfSU5DTFVERV9GUERGQVBJX0ZQREZfT0JKRUNUU19IXwogCi0jaW5jbHVkZSAiLi4vZnhjcnQvZnhfZXh0LmgiCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaCIKIAogY2xhc3MgQ1BERl9BcnJheTsKIGNsYXNzIENQREZfQm9vbGVhbjsKIGNsYXNzIENQREZfQ3J5cHRvSGFuZGxlcjsKIGNsYXNzIENQREZfRGljdGlvbmFyeTsKIGNsYXNzIENQREZfRG9jdW1lbnQ7Ci1jbGFzcyBDUERGX0luZGlyZWN0T2JqZWN0czsKK2NsYXNzIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXI7CitjbGFzcyBDUERGX05hbWU7CiBjbGFzcyBDUERGX051bGw7CiBjbGFzcyBDUERGX051bWJlcjsKIGNsYXNzIENQREZfUGFyc2VyOwpAQCAtMjQsNzI1ICsyOSw1ODAgQEAKIGNsYXNzIENQREZfU3RyZWFtRmlsdGVyOwogY2xhc3MgQ1BERl9TdHJpbmc7CiBjbGFzcyBJRlhfRmlsZVJlYWQ7CitzdHJ1Y3QgUEFSU0VfQ09OVEVYVDsKIAotI2RlZmluZSBQREZPQkpfSU5WQUxJRAkJMAotI2RlZmluZQlQREZPQkpfQk9PTEVBTgkJMQotI2RlZmluZSBQREZPQkpfTlVNQkVSCQkyCi0jZGVmaW5lIFBERk9CSl9TVFJJTkcJCTMKLSNkZWZpbmUgUERGT0JKX05BTUUJCQk0Ci0jZGVmaW5lIFBERk9CSl9BUlJBWQkJNQotI2RlZmluZSBQREZPQkpfRElDVElPTkFSWQk2Ci0jZGVmaW5lIFBERk9CSl9TVFJFQU0JCTcKLSNkZWZpbmUgUERGT0JKX05VTEwJCQk4Ci0jZGVmaW5lIFBERk9CSl9SRUZFUkVOQ0UJOQorI2RlZmluZSBQREZPQkpfSU5WQUxJRCAwCisjZGVmaW5lIFBERk9CSl9CT09MRUFOIDEKKyNkZWZpbmUgUERGT0JKX05VTUJFUiAyCisjZGVmaW5lIFBERk9CSl9TVFJJTkcgMworI2RlZmluZSBQREZPQkpfTkFNRSA0CisjZGVmaW5lIFBERk9CSl9BUlJBWSA1CisjZGVmaW5lIFBERk9CSl9ESUNUSU9OQVJZIDYKKyNkZWZpbmUgUERGT0JKX1NUUkVBTSA3CisjZGVmaW5lIFBERk9CSl9OVUxMIDgKKyNkZWZpbmUgUERGT0JKX1JFRkVSRU5DRSA5CiAKLXR5cGVkZWYgSUZYX0ZpbGVTdHJlYW0qICgqRlBERl9MUEZDbG9uZVN0cmVhbUNhbGxiYWNrKShDUERGX1N0cmVhbSAqcFN0cmVhbSwgRlhfTFBWT0lEIHBVc2VyRGF0YSk7Ci1jbGFzcyBDUERGX09iamVjdCAKLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfT2JqZWN0IHsKKyBwdWJsaWM6CisgIGludCBHZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gbV9UeXBlOyB9CiAKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRUeXBlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1R5cGU7Ci0gICAgfQorICBGWF9EV09SRCBHZXRPYmpOdW0oKSBjb25zdCB7IHJldHVybiBtX09iak51bTsgfQogCi0gICAgRlhfRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0T2JqTnVtKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX09iak51bTsKLSAgICB9CisgIEZYX0RXT1JEIEdldEdlbk51bSgpIGNvbnN0IHsgcmV0dXJuIG1fR2VuTnVtOyB9CiAKLSAgICBGWF9EV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRHZW5OdW0oKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fR2VuTnVtOwotICAgIH0KKyAgRlhfQk9PTCBJc0lkZW50aWNhbChDUERGX09iamVjdCogcE9iaikgY29uc3Q7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0lkZW50aWNhbChDUERGX09iamVjdCogcE9iaikgY29uc3Q7CisgIENQREZfT2JqZWN0KiBDbG9uZShGWF9CT09MIGJEaXJlY3QgPSBGQUxTRSkgY29uc3Q7CiAKLSAgICBDUERGX09iamVjdCogICAgICAgICAgICAgICAgICAgICAgICBDbG9uZShGWF9CT09MIGJEaXJlY3QgPSBGQUxTRSkgY29uc3Q7CisgIENQREZfT2JqZWN0KiBDbG9uZVJlZihDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBwT2JqcykgY29uc3Q7CiAKLSAgICBDUERGX09iamVjdCogICAgICAgICAgICAgICAgICAgICAgICBDbG9uZVJlZihDUERGX0luZGlyZWN0T2JqZWN0cyogcE9ianMpIGNvbnN0OworICBDUERGX09iamVjdCogR2V0RGlyZWN0KCkgY29uc3Q7CiAKLSAgICBDUERGX09iamVjdCogICAgICAgICAgICAgICAgICAgICAgICBHZXREaXJlY3QoKSBjb25zdDsKKyAgdm9pZCBSZWxlYXNlKCk7CiAKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxlYXNlKCk7CisgIENGWF9CeXRlU3RyaW5nIEdldFN0cmluZygpIGNvbnN0OwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgR2V0U3RyaW5nKCkgY29uc3Q7CisgIENGWF9CeXRlU3RyaW5nQyBHZXRDb25zdFN0cmluZygpIGNvbnN0OwogCi0gICAgQ0ZYX0J5dGVTdHJpbmdDICAgICAgICAgICAgICAgICAgICAgR2V0Q29uc3RTdHJpbmcoKSBjb25zdDsKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0VW5pY29kZVRleHQoQ0ZYX0NoYXJNYXAqIHBDaGFyTWFwID0gTlVMTCkgY29uc3Q7CisgIEZYX0ZMT0FUIEdldE51bWJlcigpIGNvbnN0OwogCi0gICAgQ0ZYX1dpZGVTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgR2V0VW5pY29kZVRleHQoQ0ZYX0NoYXJNYXAqIHBDaGFyTWFwID0gTlVMTCkgY29uc3Q7IAotICAgIEZYX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldE51bWJlcigpIGNvbnN0OworICBGWF9GTE9BVCBHZXROdW1iZXIxNigpIGNvbnN0OwogCi0gICAgRlhfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TnVtYmVyMTYoKSBjb25zdDsKKyAgaW50IEdldEludGVnZXIoKSBjb25zdDsKIAotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEludGVnZXIoKSBjb25zdDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBHZXREaWN0KCkgY29uc3Q7CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqICAgICAgICAgICAgICAgICAgICBHZXREaWN0KCkgY29uc3Q7CisgIENQREZfQXJyYXkqIEdldEFycmF5KCkgY29uc3Q7CiAKLSAgICBDUERGX0FycmF5KiAgICAgICAgICAgICAgICAgICAgICAgICBHZXRBcnJheSgpIGNvbnN0OworICB2b2lkIFNldFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKTsKIAotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKTsKKyAgdm9pZCBTZXRVbmljb2RlVGV4dChjb25zdCBGWF9XQ0hBUiogcFVuaWNvZGVzLCBpbnQgbGVuID0gLTEpOwogCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0VW5pY29kZVRleHQoRlhfTFBDV1NUUiBwVW5pY29kZXMsIGludCBsZW4gPSAtMSk7CisgIGludCBHZXREaXJlY3RUeXBlKCkgY29uc3Q7CiAKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXREaXJlY3RUeXBlKCkgY29uc3Q7CisgIEZYX0JPT0wgSXNNb2RpZmllZCgpIGNvbnN0IHsgcmV0dXJuIEZBTFNFOyB9CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc01vZGlmaWVkKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci1wcm90ZWN0ZWQ6Ci0gICAgQ1BERl9PYmplY3QoRlhfRFdPUkQgdHlwZSkgOiBtX1R5cGUodHlwZSksIG1fT2JqTnVtKDApLCBtX0dlbk51bSgwKSB7IH0KLSAgICB+Q1BERl9PYmplY3QoKSB7IH0KLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXN0cm95KCk7CisgIGJvb2wgSXNBcnJheSgpIGNvbnN0IHsgcmV0dXJuIG1fVHlwZSA9PSBQREZPQkpfQVJSQVk7IH0KKyAgYm9vbCBJc0Jvb2xlYW4oKSBjb25zdCB7IHJldHVybiBtX1R5cGUgPT0gUERGT0JKX0JPT0xFQU47IH0KKyAgYm9vbCBJc0RpY3Rpb25hcnkoKSBjb25zdCB7IHJldHVybiBtX1R5cGUgPT0gUERGT0JKX0RJQ1RJT05BUlk7IH0KKyAgYm9vbCBJc05hbWUoKSBjb25zdCB7IHJldHVybiBtX1R5cGUgPT0gUERGT0JKX05BTUU7IH0KKyAgYm9vbCBJc051bWJlcigpIGNvbnN0IHsgcmV0dXJuIG1fVHlwZSA9PSBQREZPQkpfTlVNQkVSOyB9CisgIGJvb2wgSXNSZWZlcmVuY2UoKSBjb25zdCB7IHJldHVybiBtX1R5cGUgPT0gUERGT0JKX1JFRkVSRU5DRTsgfQorICBib29sIElzU3RyZWFtKCkgY29uc3QgeyByZXR1cm4gbV9UeXBlID09IFBERk9CSl9TVFJFQU07IH0KKyAgYm9vbCBJc1N0cmluZygpIGNvbnN0IHsgcmV0dXJuIG1fVHlwZSA9PSBQREZPQkpfU1RSSU5HOyB9CiAKLSAgICBzdGF0aWMgY29uc3QgaW50ICAgICAgICAgICAgICAgICAgICBPQkpFQ1RfUkVGX01BWF9ERVBUSCA9IDEyODsKLSAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBzX25DdXJSZWZEZXB0aDsKLSAgICBGWF9EV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1R5cGU7Ci0gICAgRlhfRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9PYmpOdW07Ci0gICAgRlhfRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9HZW5OdW07CisgIENQREZfQXJyYXkqIEFzQXJyYXkoKTsKKyAgY29uc3QgQ1BERl9BcnJheSogQXNBcnJheSgpIGNvbnN0OwogCi0gICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9JbmRpcmVjdE9iamVjdHM7Ci0gICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9QYXJzZXI7Ci0gICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9TeW50YXhQYXJzZXI7Ci1wcml2YXRlOgotICAgIENQREZfT2JqZWN0KGNvbnN0IENQREZfT2JqZWN0JiBzcmMpIHt9Ci0gICAgQ1BERl9PYmplY3QqIENsb25lSW50ZXJuYWwoRlhfQk9PTCBiRGlyZWN0LCBDRlhfTWFwUHRyVG9QdHIqIHZpc2l0ZWQpIGNvbnN0OworICBDUERGX0Jvb2xlYW4qIEFzQm9vbGVhbigpOworICBjb25zdCBDUERGX0Jvb2xlYW4qIEFzQm9vbGVhbigpIGNvbnN0OworCisgIENQREZfRGljdGlvbmFyeSogQXNEaWN0aW9uYXJ5KCk7CisgIGNvbnN0IENQREZfRGljdGlvbmFyeSogQXNEaWN0aW9uYXJ5KCkgY29uc3Q7CisKKyAgQ1BERl9OYW1lKiBBc05hbWUoKTsKKyAgY29uc3QgQ1BERl9OYW1lKiBBc05hbWUoKSBjb25zdDsKKworICBDUERGX051bWJlciogQXNOdW1iZXIoKTsKKyAgY29uc3QgQ1BERl9OdW1iZXIqIEFzTnVtYmVyKCkgY29uc3Q7CisKKyAgQ1BERl9SZWZlcmVuY2UqIEFzUmVmZXJlbmNlKCk7CisgIGNvbnN0IENQREZfUmVmZXJlbmNlKiBBc1JlZmVyZW5jZSgpIGNvbnN0OworCisgIENQREZfU3RyZWFtKiBBc1N0cmVhbSgpOworICBjb25zdCBDUERGX1N0cmVhbSogQXNTdHJlYW0oKSBjb25zdDsKKworICBDUERGX1N0cmluZyogQXNTdHJpbmcoKTsKKyAgY29uc3QgQ1BERl9TdHJpbmcqIEFzU3RyaW5nKCkgY29uc3Q7CisKKyBwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IENQREZfT2JqZWN0KEZYX0RXT1JEIHR5cGUpCisgICAgICA6IG1fVHlwZSh0eXBlKSwgbV9PYmpOdW0oMCksIG1fR2VuTnVtKDApIHt9CisgIH5DUERGX09iamVjdCgpIHt9CisgIHZvaWQgRGVzdHJveSgpOworCisgIHN0YXRpYyBjb25zdCBpbnQga09iamVjdFJlZk1heERlcHRoID0gMTI4OworICBzdGF0aWMgaW50IHNfbkN1clJlZkRlcHRoOworICBGWF9EV09SRCBtX1R5cGU7CisgIEZYX0RXT1JEIG1fT2JqTnVtOworICBGWF9EV09SRCBtX0dlbk51bTsKKworICBmcmllbmQgY2xhc3MgQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlcjsKKyAgZnJpZW5kIGNsYXNzIENQREZfUGFyc2VyOworICBmcmllbmQgY2xhc3MgQ1BERl9TeW50YXhQYXJzZXI7CisKKyBwcml2YXRlOgorICBDUERGX09iamVjdChjb25zdCBDUERGX09iamVjdCYgc3JjKSB7fQorICBDUERGX09iamVjdCogQ2xvbmVJbnRlcm5hbChGWF9CT09MIGJEaXJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PEZYX0RXT1JEPiogdmlzaXRlZCkgY29uc3Q7CiB9OwotY2xhc3MgQ1BERl9Cb29sZWFuIDogcHVibGljIENQREZfT2JqZWN0Ci17Ci1wdWJsaWM6CitjbGFzcyBDUERGX0Jvb2xlYW4gOiBwdWJsaWMgQ1BERl9PYmplY3QgeworIHB1YmxpYzoKKyAgQ1BERl9Cb29sZWFuKCkgOiBDUERGX09iamVjdChQREZPQkpfQk9PTEVBTiksIG1fYlZhbHVlKGZhbHNlKSB7fQorICBleHBsaWNpdCBDUERGX0Jvb2xlYW4oRlhfQk9PTCB2YWx1ZSkKKyAgICAgIDogQ1BERl9PYmplY3QoUERGT0JKX0JPT0xFQU4pLCBtX2JWYWx1ZSh2YWx1ZSkge30KIAotICAgIHN0YXRpYyBDUERGX0Jvb2xlYW4qCUNyZWF0ZShGWF9CT09MIHZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDUERGX0Jvb2xlYW4odmFsdWUpOwotICAgIH0KKyAgRlhfQk9PTCBJZGVudGljYWwoQ1BERl9Cb29sZWFuKiBwT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9iVmFsdWUgPT0gcE90aGVyLT5tX2JWYWx1ZTsKKyAgfQogCi0gICAgQ1BERl9Cb29sZWFuKCkgOiBDUERGX09iamVjdChQREZPQkpfQk9PTEVBTiksIG1fYlZhbHVlKGZhbHNlKSB7IH0KLSAgICBDUERGX0Jvb2xlYW4oRlhfQk9PTCB2YWx1ZSkgOiBDUERGX09iamVjdChQREZPQkpfQk9PTEVBTiksIG1fYlZhbHVlKHZhbHVlKSB7IH0KLQotICAgIEZYX0JPT0wJCQkJCUlkZW50aWNhbChDUERGX0Jvb2xlYW4qIHBPdGhlcikgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2JWYWx1ZSA9PSBwT3RoZXItPm1fYlZhbHVlOwotICAgIH0KLXByb3RlY3RlZDoKLQotICAgIEZYX0JPT0wJCQkJCW1fYlZhbHVlOwotICAgIGZyaWVuZCBjbGFzcwkJCUNQREZfT2JqZWN0OworIHByb3RlY3RlZDoKKyAgRlhfQk9PTCBtX2JWYWx1ZTsKKyAgZnJpZW5kIGNsYXNzIENQREZfT2JqZWN0OwogfTsKLWNsYXNzIENQREZfTnVtYmVyIDogcHVibGljIENQREZfT2JqZWN0Ci17Ci1wdWJsaWM6CitpbmxpbmUgQ1BERl9Cb29sZWFuKiBUb0Jvb2xlYW4oQ1BERl9PYmplY3QqIG9iaikgeworICByZXR1cm4gb2JqID8gb2JqLT5Bc0Jvb2xlYW4oKSA6IG51bGxwdHI7Cit9CitpbmxpbmUgY29uc3QgQ1BERl9Cb29sZWFuKiBUb0Jvb2xlYW4oY29uc3QgQ1BERl9PYmplY3QqIG9iaikgeworICByZXR1cm4gb2JqID8gb2JqLT5Bc0Jvb2xlYW4oKSA6IG51bGxwdHI7Cit9CiAKLSAgICBzdGF0aWMgQ1BERl9OdW1iZXIqCQlDcmVhdGUoaW50IHZhbHVlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDUERGX051bWJlcih2YWx1ZSk7Ci0gICAgfQorY2xhc3MgQ1BERl9OdW1iZXIgOiBwdWJsaWMgQ1BERl9PYmplY3QgeworIHB1YmxpYzoKKyAgQ1BERl9OdW1iZXIoKSA6IENQREZfT2JqZWN0KFBERk9CSl9OVU1CRVIpLCBtX2JJbnRlZ2VyKFRSVUUpLCBtX0ludGVnZXIoMCkge30KIAotICAgIHN0YXRpYyBDUERGX051bWJlcioJCUNyZWF0ZShGWF9GTE9BVCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ1BERl9OdW1iZXIodmFsdWUpOwotICAgIH0KKyAgZXhwbGljaXQgQ1BERl9OdW1iZXIoaW50IHZhbHVlKTsKIAotICAgIHN0YXRpYyBDUERGX051bWJlcioJCUNyZWF0ZShGWF9CU1RSIHN0cikKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ1BERl9OdW1iZXIoc3RyKTsKLSAgICB9CisgIGV4cGxpY2l0IENQREZfTnVtYmVyKEZYX0ZMT0FUIHZhbHVlKTsKIAotICAgIHN0YXRpYyBDUERGX051bWJlcioJCUNyZWF0ZShGWF9CT09MIGJJbnRlZ2VyLCB2b2lkKiBwRGF0YSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ1BERl9OdW1iZXIoYkludGVnZXIsIHBEYXRhKTsKLSAgICB9CisgIGV4cGxpY2l0IENQREZfTnVtYmVyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKTsKIAotICAgIENQREZfTnVtYmVyKCkgOiBDUERGX09iamVjdChQREZPQkpfTlVNQkVSKSwgbV9iSW50ZWdlcihmYWxzZSksIG1fSW50ZWdlcigwKSB7IH0KKyAgRlhfQk9PTCBJZGVudGljYWwoQ1BERl9OdW1iZXIqIHBPdGhlcikgY29uc3Q7CiAKLSAgICBDUERGX051bWJlcihGWF9CT09MIGJJbnRlZ2VyLCB2b2lkKiBwRGF0YSk7CisgIENGWF9CeXRlU3RyaW5nIEdldFN0cmluZygpIGNvbnN0OwogCi0gICAgQ1BERl9OdW1iZXIoaW50IHZhbHVlKTsKKyAgdm9pZCBTZXRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpOwogCi0gICAgQ1BERl9OdW1iZXIoRlhfRkxPQVQgdmFsdWUpOworICBGWF9CT09MIElzSW50ZWdlcigpIGNvbnN0IHsgcmV0dXJuIG1fYkludGVnZXI7IH0KIAotICAgIENQREZfTnVtYmVyKEZYX0JTVFIgc3RyKTsKKyAgaW50IEdldEludGVnZXIoKSBjb25zdCB7IHJldHVybiBtX2JJbnRlZ2VyID8gbV9JbnRlZ2VyIDogKGludCltX0Zsb2F0OyB9CiAKLSAgICBGWF9CT09MCQkJCQlJZGVudGljYWwoQ1BERl9OdW1iZXIqIHBPdGhlcikgY29uc3Q7CisgIEZYX0ZMT0FUIEdldE51bWJlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9iSW50ZWdlciA/IChGWF9GTE9BVCltX0ludGVnZXIgOiBtX0Zsb2F0OworICB9CiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJCUdldFN0cmluZygpIGNvbnN0OworICB2b2lkIFNldE51bWJlcihGWF9GTE9BVCB2YWx1ZSk7CiAKLSAgICB2b2lkCQkJCQlTZXRTdHJpbmcoRlhfQlNUUiBzdHIpOworICBGWF9GTE9BVCBHZXROdW1iZXIxNigpIGNvbnN0IHsgcmV0dXJuIEdldE51bWJlcigpOyB9CiAKLSAgICBGWF9CT09MCQkJCQlJc0ludGVnZXIoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYkludGVnZXI7Ci0gICAgfQorICBGWF9GTE9BVCBHZXRGbG9hdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9iSW50ZWdlciA/IChGWF9GTE9BVCltX0ludGVnZXIgOiBtX0Zsb2F0OworICB9CiAKLSAgICBpbnQJCQkJCQlHZXRJbnRlZ2VyKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2JJbnRlZ2VyID8gbV9JbnRlZ2VyIDogKGludCltX0Zsb2F0OwotICAgIH0KKyBwcm90ZWN0ZWQ6CisgIEZYX0JPT0wgbV9iSW50ZWdlcjsKIAotICAgIEZYX0ZMT0FUCQkJCUdldE51bWJlcigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9iSW50ZWdlciA/IChGWF9GTE9BVCltX0ludGVnZXIgOiBtX0Zsb2F0OwotICAgIH0KKyAgdW5pb24geworICAgIGludCBtX0ludGVnZXI7CiAKLSAgICB2b2lkCQkJCQlTZXROdW1iZXIoRlhfRkxPQVQgdmFsdWUpOwotCi0gICAgRlhfRkxPQVQJCQlHZXROdW1iZXIxNigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gR2V0TnVtYmVyKCk7Ci0gICAgfQotCi0gICAgRlhfRkxPQVQJCQkJR2V0RmxvYXQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYkludGVnZXIgPyAoRlhfRkxPQVQpbV9JbnRlZ2VyIDogbV9GbG9hdDsKLSAgICB9Ci1wcm90ZWN0ZWQ6Ci0KLSAgICBGWF9CT09MCQkJCQltX2JJbnRlZ2VyOwotCi0gICAgdW5pb24gewotCi0gICAgICAgIGludAkJCQkJbV9JbnRlZ2VyOwotCi0gICAgICAgIEZYX0ZMT0FUCQkJbV9GbG9hdDsKLSAgICB9OwotICAgIGZyaWVuZCBjbGFzcwkJCUNQREZfT2JqZWN0OworICAgIEZYX0ZMT0FUIG1fRmxvYXQ7CisgIH07CisgIGZyaWVuZCBjbGFzcyBDUERGX09iamVjdDsKIH07Ci1jbGFzcyBDUERGX1N0cmluZyA6IHB1YmxpYyBDUERGX09iamVjdAotewotcHVibGljOgoraW5saW5lIENQREZfTnVtYmVyKiBUb051bWJlcihDUERGX09iamVjdCogb2JqKSB7CisgIHJldHVybiBvYmogPyBvYmotPkFzTnVtYmVyKCkgOiBudWxscHRyOworfQoraW5saW5lIGNvbnN0IENQREZfTnVtYmVyKiBUb051bWJlcihjb25zdCBDUERGX09iamVjdCogb2JqKSB7CisgIHJldHVybiBvYmogPyBvYmotPkFzTnVtYmVyKCkgOiBudWxscHRyOworfQogCi0gICAgc3RhdGljIENQREZfU3RyaW5nKgkJQ3JlYXRlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIsIEZYX0JPT0wgYkhleCA9IEZBTFNFKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDUERGX1N0cmluZyhzdHIsIGJIZXgpOwotICAgIH0KK2NsYXNzIENQREZfU3RyaW5nIDogcHVibGljIENQREZfT2JqZWN0IHsKKyBwdWJsaWM6CisgIENQREZfU3RyaW5nKCkgOiBDUERGX09iamVjdChQREZPQkpfU1RSSU5HKSwgbV9iSGV4KEZBTFNFKSB7fQogCi0gICAgc3RhdGljIENQREZfU3RyaW5nKgkJQ3JlYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IENQREZfU3RyaW5nKHN0cik7Ci0gICAgfQorICBDUERGX1N0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyLCBGWF9CT09MIGJIZXgpCisgICAgICA6IENQREZfT2JqZWN0KFBERk9CSl9TVFJJTkcpLCBtX1N0cmluZyhzdHIpLCBtX2JIZXgoYkhleCkge30KIAotICAgIENQREZfU3RyaW5nKCkgOiBDUERGX09iamVjdChQREZPQkpfU1RSSU5HKSwgbV9iSGV4KEZBTFNFKSB7IH0KKyAgZXhwbGljaXQgQ1BERl9TdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7CiAKLSAgICBDUERGX1N0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyLCBGWF9CT09MIGJIZXggPSBGQUxTRSkKLSAgICAgICAgOiBDUERGX09iamVjdChQREZPQkpfU1RSSU5HKSwgbV9TdHJpbmcoc3RyKSwgbV9iSGV4KGJIZXgpIHsKLSAgICB9CisgIENGWF9CeXRlU3RyaW5nJiBHZXRTdHJpbmcoKSB7IHJldHVybiBtX1N0cmluZzsgfQogCi0gICAgQ1BERl9TdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7CisgIEZYX0JPT0wgSWRlbnRpY2FsKENQREZfU3RyaW5nKiBwT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9TdHJpbmcgPT0gcE90aGVyLT5tX1N0cmluZzsKKyAgfQogCi0gICAgQ0ZYX0J5dGVTdHJpbmcmCQkJR2V0U3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1N0cmluZzsKLSAgICB9CisgIEZYX0JPT0wgSXNIZXgoKSBjb25zdCB7IHJldHVybiBtX2JIZXg7IH0KIAotICAgIEZYX0JPT0wJCQkJCUlkZW50aWNhbChDUERGX1N0cmluZyogcE90aGVyKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fU3RyaW5nID09IHBPdGhlci0+bV9TdHJpbmc7Ci0gICAgfQorIHByb3RlY3RlZDoKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9TdHJpbmc7CiAKLSAgICBGWF9CT09MCQkJCQlJc0hleCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9iSGV4OwotICAgIH0KLXByb3RlY3RlZDoKLQotICAgIENGWF9CeXRlU3RyaW5nCQkJbV9TdHJpbmc7Ci0KLSAgICBGWF9CT09MCQkJCQltX2JIZXg7Ci0gICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9PYmplY3Q7CisgIEZYX0JPT0wgbV9iSGV4OworICBmcmllbmQgY2xhc3MgQ1BERl9PYmplY3Q7CiB9OwotY2xhc3MgQ1BERl9OYW1lIDogcHVibGljIENQREZfT2JqZWN0Ci17Ci1wdWJsaWM6CitpbmxpbmUgQ1BERl9TdHJpbmcqIFRvU3RyaW5nKENQREZfT2JqZWN0KiBvYmopIHsKKyAgcmV0dXJuIG9iaiA/IG9iai0+QXNTdHJpbmcoKSA6IG51bGxwdHI7Cit9CitpbmxpbmUgY29uc3QgQ1BERl9TdHJpbmcqIFRvU3RyaW5nKGNvbnN0IENQREZfT2JqZWN0KiBvYmopIHsKKyAgcmV0dXJuIG9iaiA/IG9iai0+QXNTdHJpbmcoKSA6IG51bGxwdHI7Cit9CiAKLSAgICBzdGF0aWMgQ1BERl9OYW1lKgkJQ3JlYXRlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IENQREZfTmFtZShzdHIpOwotICAgIH0KK2NsYXNzIENQREZfTmFtZSA6IHB1YmxpYyBDUERGX09iamVjdCB7CisgcHVibGljOgorICBleHBsaWNpdCBDUERGX05hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cikKKyAgICAgIDogQ1BERl9PYmplY3QoUERGT0JKX05BTUUpLCBtX05hbWUoc3RyKSB7fQorICBleHBsaWNpdCBDUERGX05hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpCisgICAgICA6IENQREZfT2JqZWN0KFBERk9CSl9OQU1FKSwgbV9OYW1lKHN0cikge30KKyAgZXhwbGljaXQgQ1BERl9OYW1lKGNvbnN0IEZYX0NIQVIqIHN0cikKKyAgICAgIDogQ1BERl9PYmplY3QoUERGT0JKX05BTUUpLCBtX05hbWUoc3RyKSB7fQogCi0gICAgc3RhdGljIENQREZfTmFtZSoJCUNyZWF0ZShGWF9CU1RSIHN0cikKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ1BERl9OYW1lKHN0cik7Ci0gICAgfQorICBDRlhfQnl0ZVN0cmluZyYgR2V0U3RyaW5nKCkgeyByZXR1cm4gbV9OYW1lOyB9CiAKLSAgICBzdGF0aWMgQ1BERl9OYW1lKgkJQ3JlYXRlKEZYX0xQQ1NUUiBzdHIpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IENQREZfTmFtZShzdHIpOwotICAgIH0KKyAgRlhfQk9PTCBJZGVudGljYWwoQ1BERl9OYW1lKiBwT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9OYW1lID09IHBPdGhlci0+bV9OYW1lOworICB9CiAKLSAgICBDUERGX05hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cikgOiBDUERGX09iamVjdChQREZPQkpfTkFNRSksIG1fTmFtZShzdHIpIHsgfQotICAgIENQREZfTmFtZShGWF9CU1RSIHN0cikgOiBDUERGX09iamVjdChQREZPQkpfTkFNRSksIG1fTmFtZShzdHIpIHsgfQotICAgIENQREZfTmFtZShGWF9MUENTVFIgc3RyKSA6IENQREZfT2JqZWN0KFBERk9CSl9OQU1FKSwgbV9OYW1lKHN0cikgeyB9Ci0KLSAgICBDRlhfQnl0ZVN0cmluZyYJCQlHZXRTdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fTmFtZTsKLSAgICB9Ci0KLSAgICBGWF9CT09MCQkJCQlJZGVudGljYWwoQ1BERl9OYW1lKiBwT3RoZXIpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9OYW1lID09IHBPdGhlci0+bV9OYW1lOwotICAgIH0KLXByb3RlY3RlZDoKLQotICAgIENGWF9CeXRlU3RyaW5nCQkJbV9OYW1lOwotICAgIGZyaWVuZCBjbGFzcwkJCUNQREZfT2JqZWN0OworIHByb3RlY3RlZDoKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9OYW1lOworICBmcmllbmQgY2xhc3MgQ1BERl9PYmplY3Q7CiB9OwotY2xhc3MgQ1BERl9BcnJheSA6IHB1YmxpYyBDUERGX09iamVjdAotewotcHVibGljOgoraW5saW5lIENQREZfTmFtZSogVG9OYW1lKENQREZfT2JqZWN0KiBvYmopIHsKKyAgcmV0dXJuIG9iaiA/IG9iai0+QXNOYW1lKCkgOiBudWxscHRyOworfQoraW5saW5lIGNvbnN0IENQREZfTmFtZSogVG9OYW1lKGNvbnN0IENQREZfT2JqZWN0KiBvYmopIHsKKyAgcmV0dXJuIG9iaiA/IG9iai0+QXNOYW1lKCkgOiBudWxscHRyOworfQogCi0gICAgc3RhdGljIENQREZfQXJyYXkqCQlDcmVhdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDUERGX0FycmF5KCk7Ci0gICAgfQorY2xhc3MgQ1BERl9BcnJheSA6IHB1YmxpYyBDUERGX09iamVjdCB7CisgcHVibGljOgorICBDUERGX0FycmF5KCkgOiBDUERGX09iamVjdChQREZPQkpfQVJSQVkpIHt9CiAKLSAgICBDUERGX0FycmF5KCkgOiBDUERGX09iamVjdChQREZPQkpfQVJSQVkpIHsgfQorICBGWF9EV09SRCBHZXRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fT2JqZWN0cy5HZXRTaXplKCk7IH0KIAotICAgIEZYX0RXT1JECQkJCUdldENvdW50KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX09iamVjdHMuR2V0U2l6ZSgpOwotICAgIH0KKyAgQ1BERl9PYmplY3QqIEdldEVsZW1lbnQoRlhfRFdPUkQgaW5kZXgpIGNvbnN0OwogCi0gICAgQ1BERl9PYmplY3QqCQkJR2V0RWxlbWVudChGWF9EV09SRCBpbmRleCkgY29uc3Q7CisgIENQREZfT2JqZWN0KiBHZXRFbGVtZW50VmFsdWUoRlhfRFdPUkQgaW5kZXgpIGNvbnN0OwogCi0gICAgQ1BERl9PYmplY3QqCQkJR2V0RWxlbWVudFZhbHVlKEZYX0RXT1JEIGluZGV4KSBjb25zdDsKKyAgQ0ZYX01hdHJpeCBHZXRNYXRyaXgoKTsKIAorICBDRlhfRmxvYXRSZWN0IEdldFJlY3QoKTsKIAorICBDRlhfQnl0ZVN0cmluZyBHZXRTdHJpbmcoRlhfRFdPUkQgaW5kZXgpIGNvbnN0OwogCi0gICAgQ0ZYX0FmZmluZU1hdHJpeAkJR2V0TWF0cml4KCk7CisgIENGWF9CeXRlU3RyaW5nQyBHZXRDb25zdFN0cmluZyhGWF9EV09SRCBpbmRleCkgY29uc3Q7CiAKLSAgICBDRlhfRmxvYXRSZWN0CQkJR2V0UmVjdCgpOworICBpbnQgR2V0SW50ZWdlcihGWF9EV09SRCBpbmRleCkgY29uc3Q7CiAKKyAgRlhfRkxPQVQgR2V0TnVtYmVyKEZYX0RXT1JEIGluZGV4KSBjb25zdDsKIAorICBDUERGX0RpY3Rpb25hcnkqIEdldERpY3QoRlhfRFdPUkQgaW5kZXgpIGNvbnN0OwogCisgIENQREZfU3RyZWFtKiBHZXRTdHJlYW0oRlhfRFdPUkQgaW5kZXgpIGNvbnN0OwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCQlHZXRTdHJpbmcoRlhfRFdPUkQgaW5kZXgpIGNvbnN0OworICBDUERGX0FycmF5KiBHZXRBcnJheShGWF9EV09SRCBpbmRleCkgY29uc3Q7CiAKLSAgICBDRlhfQnl0ZVN0cmluZ0MJCQlHZXRDb25zdFN0cmluZyhGWF9EV09SRCBpbmRleCkgY29uc3Q7CisgIEZYX0ZMT0FUIEdldEZsb2F0KEZYX0RXT1JEIGluZGV4KSBjb25zdCB7IHJldHVybiBHZXROdW1iZXIoaW5kZXgpOyB9CiAKLSAgICBpbnQJCQkJCQlHZXRJbnRlZ2VyKEZYX0RXT1JEIGluZGV4KSBjb25zdDsKKyAgdm9pZCBTZXRBdChGWF9EV09SRCBpbmRleCwKKyAgICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiwKKyAgICAgICAgICAgICBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBwT2JqcyA9IE5VTEwpOwogCi0gICAgRlhfRkxPQVQJCQkJR2V0TnVtYmVyKEZYX0RXT1JEIGluZGV4KSBjb25zdDsKKyAgdm9pZCBJbnNlcnRBdChGWF9EV09SRCBpbmRleCwKKyAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBwT2JqcyA9IE5VTEwpOwogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgkJR2V0RGljdChGWF9EV09SRCBpbmRleCkgY29uc3Q7CisgIHZvaWQgUmVtb3ZlQXQoRlhfRFdPUkQgaW5kZXgsIGludCBuQ291bnQgPSAxKTsKIAotICAgIENQREZfU3RyZWFtKgkJCUdldFN0cmVhbShGWF9EV09SRCBpbmRleCkgY29uc3Q7CisgIHZvaWQgQWRkKENQREZfT2JqZWN0KiBwT2JqLCBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBwT2JqcyA9IE5VTEwpOwogCi0gICAgQ1BERl9BcnJheSoJCQkJR2V0QXJyYXkoRlhfRFdPUkQgaW5kZXgpIGNvbnN0OworICB2b2lkIEFkZE51bWJlcihGWF9GTE9BVCBmKTsKIAotICAgIEZYX0ZMT0FUCQkJCUdldEZsb2F0KEZYX0RXT1JEIGluZGV4KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIEdldE51bWJlcihpbmRleCk7Ci0gICAgfQorICB2b2lkIEFkZEludGVnZXIoaW50IGkpOwogCisgIHZvaWQgQWRkU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpOwogCisgIHZvaWQgQWRkTmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKTsKIAorICB2b2lkIEFkZFJlZmVyZW5jZShDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBwRG9jLCBGWF9EV09SRCBvYmpudW0pOwogCi0gICAgdm9pZAkJCQkJU2V0QXQoRlhfRFdPUkQgaW5kZXgsIENQREZfT2JqZWN0KiBwT2JqLCBDUERGX0luZGlyZWN0T2JqZWN0cyogcE9ianMgPSBOVUxMKTsKKyAgdm9pZCBBZGRSZWZlcmVuY2UoQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlciogcERvYywgQ1BERl9PYmplY3QqIG9iaikgeworICAgIEFkZFJlZmVyZW5jZShwRG9jLCBvYmotPkdldE9iak51bSgpKTsKKyAgfQogCisgIEZYX0ZMT0FUIEdldE51bWJlcjE2KEZYX0RXT1JEIGluZGV4KSBjb25zdCB7IHJldHVybiBHZXROdW1iZXIoaW5kZXgpOyB9CiAKLSAgICB2b2lkCQkJCQlJbnNlcnRBdChGWF9EV09SRCBpbmRleCwgQ1BERl9PYmplY3QqIHBPYmosIENQREZfSW5kaXJlY3RPYmplY3RzKiBwT2JqcyA9IE5VTEwpOworICB2b2lkIEFkZE51bWJlcjE2KEZYX0ZMT0FUIHZhbHVlKSB7IEFkZE51bWJlcih2YWx1ZSk7IH0KIAotICAgIHZvaWQJCQkJCVJlbW92ZUF0KEZYX0RXT1JEIGluZGV4KTsKKyAgRlhfQk9PTCBJZGVudGljYWwoQ1BERl9BcnJheSogcE90aGVyKSBjb25zdDsKIAorIHByb3RlY3RlZDoKKyAgfkNQREZfQXJyYXkoKTsKIAotICAgIHZvaWQJCQkJCUFkZChDUERGX09iamVjdCogcE9iaiwgQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBPYmpzID0gTlVMTCk7Ci0KLQotCi0gICAgdm9pZAkJCQkJQWRkTnVtYmVyKEZYX0ZMT0FUIGYpOwotCi0gICAgdm9pZAkJCQkJQWRkSW50ZWdlcihpbnQgaSk7Ci0KLSAgICB2b2lkCQkJCQlBZGRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cik7Ci0KLSAgICB2b2lkCQkJCQlBZGROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpOwotCi0gICAgdm9pZAkJCQkJQWRkUmVmZXJlbmNlKENQREZfSW5kaXJlY3RPYmplY3RzKiBwRG9jLCBGWF9EV09SRCBvYmpudW0pOwotCi0gICAgdm9pZAkJCQkJQWRkUmVmZXJlbmNlKENQREZfSW5kaXJlY3RPYmplY3RzKiBwRG9jLCBDUERGX09iamVjdCogb2JqKQotICAgIHsKLSAgICAgICAgQWRkUmVmZXJlbmNlKHBEb2MsIG9iai0+R2V0T2JqTnVtKCkpOwotICAgIH0KLQotCi0gICAgRlhfRkxPQVQJCQlHZXROdW1iZXIxNihGWF9EV09SRCBpbmRleCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBHZXROdW1iZXIoaW5kZXgpOwotICAgIH0KLQotICAgIHZvaWQJCQkJCUFkZE51bWJlcjE2KEZYX0ZMT0FUIHZhbHVlKQotICAgIHsKLSAgICAgICAgQWRkTnVtYmVyKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBGWF9CT09MCQkJCQlJZGVudGljYWwoQ1BERl9BcnJheSogcE90aGVyKSBjb25zdDsKLXByb3RlY3RlZDoKLQotICAgIH5DUERGX0FycmF5KCk7Ci0KLSAgICBDRlhfUHRyQXJyYXkJCQltX09iamVjdHM7Ci0gICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9PYmplY3Q7CisgIENGWF9BcnJheVRlbXBsYXRlPENQREZfT2JqZWN0Kj4gbV9PYmplY3RzOworICBmcmllbmQgY2xhc3MgQ1BERl9PYmplY3Q7CiB9OwotY2xhc3MgQ1BERl9EaWN0aW9uYXJ5IDogcHVibGljIENQREZfT2JqZWN0Ci17Ci1wdWJsaWM6CitpbmxpbmUgQ1BERl9BcnJheSogVG9BcnJheShDUERGX09iamVjdCogb2JqKSB7CisgIHJldHVybiBvYmogPyBvYmotPkFzQXJyYXkoKSA6IG51bGxwdHI7Cit9CitpbmxpbmUgY29uc3QgQ1BERl9BcnJheSogVG9BcnJheShjb25zdCBDUERGX09iamVjdCogb2JqKSB7CisgIHJldHVybiBvYmogPyBvYmotPkFzQXJyYXkoKSA6IG51bGxwdHI7Cit9CiAKLSAgICBzdGF0aWMgQ1BERl9EaWN0aW9uYXJ5KglDcmVhdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDUERGX0RpY3Rpb25hcnkoKTsKLSAgICB9CitjbGFzcyBDUERGX0RpY3Rpb25hcnkgOiBwdWJsaWMgQ1BERl9PYmplY3QgeworIHB1YmxpYzoKKyAgdXNpbmcgaXRlcmF0b3IgPSBzdGQ6Om1hcDxDRlhfQnl0ZVN0cmluZywgQ1BERl9PYmplY3QqPjo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gc3RkOjptYXA8Q0ZYX0J5dGVTdHJpbmcsIENQREZfT2JqZWN0Kj46OmNvbnN0X2l0ZXJhdG9yOwogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KCkgOiBDUERGX09iamVjdChQREZPQkpfRElDVElPTkFSWSkgeyB9CisgIENQREZfRGljdGlvbmFyeSgpIDogQ1BERl9PYmplY3QoUERGT0JKX0RJQ1RJT05BUlkpIHt9CiAKLSAgICBDUERGX09iamVjdCoJCQlHZXRFbGVtZW50KEZYX0JTVFIga2V5KSBjb25zdDsKKyAgQ1BERl9PYmplY3QqIEdldEVsZW1lbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0OwogCi0gICAgQ1BERl9PYmplY3QqCQkJR2V0RWxlbWVudFZhbHVlKEZYX0JTVFIga2V5KSBjb25zdDsKKyAgQ1BERl9PYmplY3QqIEdldEVsZW1lbnRWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3Q7CiAKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdDsKIAorICBDRlhfQnl0ZVN0cmluZ0MgR2V0Q29uc3RTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0OwogCisgIENGWF9CeXRlU3RyaW5nIEdldFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZGVmYXVsdF9zdHIpIGNvbnN0OwogCisgIENGWF9CeXRlU3RyaW5nQyBHZXRDb25zdFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZGVmYXVsdF9zdHIpIGNvbnN0OwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCQlHZXRTdHJpbmcoRlhfQlNUUiBrZXkpIGNvbnN0OworICBDRlhfV2lkZVN0cmluZyBHZXRVbmljb2RlVGV4dChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0NoYXJNYXAqIHBDaGFyTWFwID0gTlVMTCkgY29uc3Q7CiAKLSAgICBDRlhfQnl0ZVN0cmluZ0MJCQlHZXRDb25zdFN0cmluZyhGWF9CU1RSIGtleSkgY29uc3Q7CisgIGludCBHZXRJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdDsKIAotICAgIENGWF9CeXRlU3RyaW5nCQkJR2V0U3RyaW5nKEZYX0JTVFIga2V5LCBGWF9CU1RSIGRlZmF1bHRfc3RyKSBjb25zdDsKKyAgaW50IEdldEludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIGludCBkZWZhdWx0X2ludCkgY29uc3Q7CiAKLSAgICBDRlhfQnl0ZVN0cmluZ0MJCQlHZXRDb25zdFN0cmluZyhGWF9CU1RSIGtleSwgRlhfQlNUUiBkZWZhdWx0X3N0cikgY29uc3Q7CisgIEZYX0JPT0wgR2V0Qm9vbGVhbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRlZmF1bHQgPSBGQUxTRSkgY29uc3Q7CiAKLSAgICBDRlhfV2lkZVN0cmluZwkJCUdldFVuaWNvZGVUZXh0KEZYX0JTVFIga2V5LCBDRlhfQ2hhck1hcCogcENoYXJNYXAgPSBOVUxMKSBjb25zdDsKKyAgRlhfRkxPQVQgR2V0TnVtYmVyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdDsKIAotICAgIGludAkJCQkJCUdldEludGVnZXIoRlhfQlNUUiBrZXkpIGNvbnN0OworICBDUERGX0RpY3Rpb25hcnkqIEdldERpY3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0OwogCi0gICAgaW50CQkJCQkJR2V0SW50ZWdlcihGWF9CU1RSIGtleSwgaW50IGRlZmF1bHRfaW50KSBjb25zdDsKKyAgQ1BERl9TdHJlYW0qIEdldFN0cmVhbShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3Q7CiAKLSAgICBGWF9CT09MCQkJCQlHZXRCb29sZWFuKEZYX0JTVFIga2V5LCBGWF9CT09MIGJEZWZhdWx0ID0gRkFMU0UpIGNvbnN0OworICBDUERGX0FycmF5KiBHZXRBcnJheShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3Q7CiAKLSAgICBGWF9GTE9BVAkJCQlHZXROdW1iZXIoRlhfQlNUUiBrZXkpIGNvbnN0OworICBDRlhfRmxvYXRSZWN0IEdldFJlY3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0OwogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgkJR2V0RGljdChGWF9CU1RSIGtleSkgY29uc3Q7CisgIENGWF9NYXRyaXggR2V0TWF0cml4KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdDsKIAotICAgIENQREZfU3RyZWFtKgkJCUdldFN0cmVhbShGWF9CU1RSIGtleSkgY29uc3Q7CisgIEZYX0ZMT0FUIEdldEZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdCB7IHJldHVybiBHZXROdW1iZXIoa2V5KTsgfQogCi0gICAgQ1BERl9BcnJheSoJCQkJR2V0QXJyYXkoRlhfQlNUUiBrZXkpIGNvbnN0OworICBGWF9CT09MIEtleUV4aXN0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdDsKIAotICAgIENGWF9GbG9hdFJlY3QJCQlHZXRSZWN0KEZYX0JTVFIga2V5KSBjb25zdDsKKyAgLy8gU2V0KiBmdW5jdGlvbnMgaW52YWxpZGF0ZSBpdGVyYXRvcnMgZm9yIHRoZSBlbGVtZW50IHdpdGggdGhlIGtleSB8a2V5fC4KKyAgdm9pZCBTZXRBdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgQ1BERl9PYmplY3QqIHBPYmopOwogCi0gICAgQ0ZYX0FmZmluZU1hdHJpeAkJR2V0TWF0cml4KEZYX0JTVFIga2V5KSBjb25zdDsKKyAgdm9pZCBTZXRBdE5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKTsKIAotICAgIEZYX0ZMT0FUCQkJCUdldEZsb2F0KEZYX0JTVFIga2V5KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIEdldE51bWJlcihrZXkpOwotICAgIH0KKyAgdm9pZCBTZXRBdFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZyk7CiAKKyAgdm9pZCBTZXRBdEludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIGludCBpKTsKIAotICAgIEZYX0JPT0wJCQkJCUtleUV4aXN0KEZYX0JTVFIga2V5KSBjb25zdDsKKyAgdm9pZCBTZXRBdE51bWJlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgRlhfRkxPQVQgZik7CiAKLSAgICBGWF9QT1NJVElPTgkJCQlHZXRTdGFydFBvcygpIGNvbnN0OworICB2b2lkIFNldEF0UmVmZXJlbmNlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LAorICAgICAgICAgICAgICAgICAgICAgIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgb2JqbnVtKTsKIAotICAgIENQREZfT2JqZWN0KgkJCUdldE5leHRFbGVtZW50KEZYX1BPU0lUSU9OJiBwb3MsIENGWF9CeXRlU3RyaW5nJiBrZXkpIGNvbnN0OworICB2b2lkIFNldEF0UmVmZXJlbmNlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LAorICAgICAgICAgICAgICAgICAgICAgIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIG9iaikgeworICAgIFNldEF0UmVmZXJlbmNlKGtleSwgcERvYywgb2JqLT5HZXRPYmpOdW0oKSk7CisgIH0KIAotICAgIHZvaWQJCQkJCVNldEF0KEZYX0JTVFIga2V5LCBDUERGX09iamVjdCogcE9iaiwgQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBPYmpzID0gTlVMTCk7CisgIHZvaWQgQWRkUmVmZXJlbmNlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LAorICAgICAgICAgICAgICAgICAgICBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBwRG9jLAorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvYmpudW0pOwogCisgIHZvaWQgU2V0QXRSZWN0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KTsKIAorICB2b2lkIFNldEF0TWF0cml4KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpOwogCi0gICAgdm9pZAkJCQkJU2V0QXROYW1lKEZYX0JTVFIga2V5LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSk7CisgIHZvaWQgU2V0QXRCb29sZWFuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCBGWF9CT09MIGJWYWx1ZSk7CiAKKyAgLy8gSW52YWxpZGF0ZXMgaXRlcmF0b3JzIGZvciB0aGUgZWxlbWVudCB3aXRoIHRoZSBrZXkgfGtleXwuCisgIHZvaWQgUmVtb3ZlQXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpOwogCi0gICAgdm9pZAkJCQkJU2V0QXRTdHJpbmcoRlhfQlNUUiBrZXksIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpOworICAvLyBJbnZhbGlkYXRlcyBpdGVyYXRvcnMgZm9yIHRoZSBlbGVtZW50IHdpdGggdGhlIGtleSB8b2xka2V5fC4KKyAgdm9pZCBSZXBsYWNlS2V5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb2xka2V5LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5ld2tleSk7CiAKKyAgRlhfQk9PTCBJZGVudGljYWwoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgY29uc3Q7CiAKLSAgICB2b2lkCQkJCQlTZXRBdEludGVnZXIoRlhfQlNUUiBrZXksIGludCBpKTsKKyAgc2l6ZV90IEdldENvdW50KCkgY29uc3QgeyByZXR1cm4gbV9NYXAuc2l6ZSgpOyB9CiAKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBtX01hcC5iZWdpbigpOyB9CiAKLSAgICB2b2lkCQkJCQlTZXRBdE51bWJlcihGWF9CU1RSIGtleSwgRlhfRkxPQVQgZik7CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIG1fTWFwLmVuZCgpOyB9CiAKLSAgICB2b2lkCQkJCQlTZXRBdFJlZmVyZW5jZShGWF9CU1RSIGtleSwgQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBEb2MsIEZYX0RXT1JEIG9iam51bSk7CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gbV9NYXAuYmVnaW4oKTsgfQogCi0gICAgdm9pZAkJCQkJU2V0QXRSZWZlcmVuY2UoRlhfQlNUUiBrZXksIENQREZfSW5kaXJlY3RPYmplY3RzKiBwRG9jLCBDUERGX09iamVjdCogb2JqKQotICAgIHsKLSAgICAgICAgU2V0QXRSZWZlcmVuY2Uoa2V5LCBwRG9jLCBvYmotPkdldE9iak51bSgpKTsKLSAgICB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIG1fTWFwLmVuZCgpOyB9CiAKLSAgICB2b2lkCQkJCQlBZGRSZWZlcmVuY2UoRlhfQlNUUiBrZXksIENQREZfSW5kaXJlY3RPYmplY3RzKiBwRG9jLCBGWF9EV09SRCBvYmpudW0pOworIHByb3RlY3RlZDoKKyAgfkNQREZfRGljdGlvbmFyeSgpOwogCi0gICAgdm9pZAkJCQkJQWRkUmVmZXJlbmNlKEZYX0JTVFIga2V5LCBDUERGX0luZGlyZWN0T2JqZWN0cyogcERvYywgQ1BERl9PYmplY3QqIG9iaikKLSAgICB7Ci0gICAgICAgIEFkZFJlZmVyZW5jZShrZXksIHBEb2MsIG9iai0+R2V0T2JqTnVtKCkpOwotICAgIH0KKyAgc3RkOjptYXA8Q0ZYX0J5dGVTdHJpbmcsIENQREZfT2JqZWN0Kj4gbV9NYXA7CiAKLSAgICB2b2lkCQkJCQlTZXRBdFJlY3QoRlhfQlNUUiBrZXksIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpOwotCi0gICAgdm9pZAkJCQkJU2V0QXRNYXRyaXgoRlhfQlNUUiBrZXksIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCk7Ci0KLSAgICB2b2lkCQkJCQlTZXRBdEJvb2xlYW4oRlhfQlNUUiBrZXksIEZYX0JPT0wgYlZhbHVlKTsKLQotCi0KLSAgICB2b2lkCQkJCQlSZW1vdmVBdChGWF9CU1RSIGtleSk7Ci0KLQotICAgIHZvaWQJCQkJCVJlcGxhY2VLZXkoRlhfQlNUUiBvbGRrZXksIEZYX0JTVFIgbmV3a2V5KTsKLQotICAgIEZYX0JPT0wJCQkJCUlkZW50aWNhbChDUERGX0RpY3Rpb25hcnkqIHBEaWN0KSBjb25zdDsKLQotICAgIGludAkJCQkJCUdldENvdW50KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX01hcC5HZXRDb3VudCgpOwotICAgIH0KLQotICAgIHZvaWQJCQkJCUFkZFZhbHVlKEZYX0JTVFIga2V5LCBDUERGX09iamVjdCogcE9iaik7Ci1wcm90ZWN0ZWQ6Ci0KLSAgICB+Q1BERl9EaWN0aW9uYXJ5KCk7Ci0KLSAgICBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cgltX01hcDsKLQotICAgIGZyaWVuZCBjbGFzcwkJCUNQREZfT2JqZWN0OworICBmcmllbmQgY2xhc3MgQ1BERl9PYmplY3Q7CiB9OwotY2xhc3MgQ1BERl9TdHJlYW0gOiBwdWJsaWMgQ1BERl9PYmplY3QKLXsKLXB1YmxpYzoKK2lubGluZSBDUERGX0RpY3Rpb25hcnkqIFRvRGljdGlvbmFyeShDUERGX09iamVjdCogb2JqKSB7CisgIHJldHVybiBvYmogPyBvYmotPkFzRGljdGlvbmFyeSgpIDogbnVsbHB0cjsKK30KK2lubGluZSBjb25zdCBDUERGX0RpY3Rpb25hcnkqIFRvRGljdGlvbmFyeShjb25zdCBDUERGX09iamVjdCogb2JqKSB7CisgIHJldHVybiBvYmogPyBvYmotPkFzRGljdGlvbmFyeSgpIDogbnVsbHB0cjsKK30KIAotICAgIHN0YXRpYyBDUERGX1N0cmVhbSoJCUNyZWF0ZShGWF9MUEJZVEUgcERhdGEsIEZYX0RXT1JEIHNpemUsIENQREZfRGljdGlvbmFyeSogcERpY3QpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IENQREZfU3RyZWFtKHBEYXRhLCBzaXplLCBwRGljdCk7Ci0gICAgfQorY2xhc3MgQ1BERl9TdHJlYW0gOiBwdWJsaWMgQ1BERl9PYmplY3QgeworIHB1YmxpYzoKKyAgQ1BERl9TdHJlYW0odWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIENQREZfRGljdGlvbmFyeSogcERpY3QpOwogCi0gICAgQ1BERl9TdHJlYW0oRlhfTFBCWVRFIHBEYXRhLCBGWF9EV09SRCBzaXplLCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBHZXREaWN0KCkgY29uc3QgeyByZXR1cm4gbV9wRGljdDsgfQogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgkJR2V0RGljdCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRGljdDsKLSAgICB9CisgIHZvaWQgU2V0RGF0YShjb25zdCB1aW50OF90KiBwRGF0YSwKKyAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUsCisgICAgICAgICAgICAgICBGWF9CT09MIGJDb21wcmVzc2VkLAorICAgICAgICAgICAgICAgRlhfQk9PTCBiS2VlcEJ1Zik7CiAKLSAgICB2b2lkCQkJCQlTZXREYXRhKEZYX0xQQ0JZVEUgcERhdGEsIEZYX0RXT1JEIHNpemUsIEZYX0JPT0wgYkNvbXByZXNzZWQsIEZYX0JPT0wgYktlZXBCdWYpOworICB2b2lkIEluaXRTdHJlYW0odWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIENQREZfRGljdGlvbmFyeSogcERpY3QpOwogCi0gICAgdm9pZAkJCQkJSW5pdFN0cmVhbShGWF9CWVRFKiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7CisgIHZvaWQgSW5pdFN0cmVhbUZyb21GaWxlKElGWF9GaWxlUmVhZCogcEZpbGUsIENQREZfRGljdGlvbmFyeSogcERpY3QpOwogCi0gICAgdm9pZAkJCQkJSW5pdFN0cmVhbShJRlhfRmlsZVJlYWQgKnBGaWxlLCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKKyAgRlhfQk9PTCBJZGVudGljYWwoQ1BERl9TdHJlYW0qIHBPdGhlcikgY29uc3Q7CiAKLSAgICBGWF9CT09MCQkJCQlJZGVudGljYWwoQ1BERl9TdHJlYW0qIHBPdGhlcikgY29uc3Q7CisgIEZYX0RXT1JEIEdldFJhd1NpemUoKSBjb25zdCB7IHJldHVybiBtX2R3U2l6ZTsgfQogCi0gICAgQ1BERl9TdHJlYW1GaWx0ZXIqCQlHZXRTdHJlYW1GaWx0ZXIoRlhfQk9PTCBiUmF3ID0gRkFMU0UpIGNvbnN0OworICBGWF9CT09MIFJlYWRSYXdEYXRhKEZYX0ZJTEVTSVpFIHN0YXJ0X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGJ1Zl9zaXplKSBjb25zdDsKIAorICBGWF9CT09MIElzTWVtb3J5QmFzZWQoKSBjb25zdCB7IHJldHVybiBtX0dlbk51bSA9PSBrTWVtb3J5QmFzZWRHZW5OdW07IH0KIAorIHByb3RlY3RlZDoKKyAgZnJpZW5kIGNsYXNzIENQREZfT2JqZWN0OworICBmcmllbmQgY2xhc3MgQ1BERl9TdHJlYW1BY2M7CiAKLSAgICBGWF9EV09SRAkJCQlHZXRSYXdTaXplKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2R3U2l6ZTsKLSAgICB9CisgIHN0YXRpYyBjb25zdCBGWF9EV09SRCBrTWVtb3J5QmFzZWRHZW5OdW0gPSAoRlhfRFdPUkQpLTE7CisgIH5DUERGX1N0cmVhbSgpOwogCi0gICAgRlhfQk9PTAkJCQkJUmVhZFJhd0RhdGEoRlhfRklMRVNJWkUgc3RhcnRfcG9zLCBGWF9MUEJZVEUgcEJ1ZiwgRlhfRFdPUkQgYnVmX3NpemUpIGNvbnN0OworICB2b2lkIEluaXRTdHJlYW1JbnRlcm5hbChDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKIAorICBDUERGX0RpY3Rpb25hcnkqIG1fcERpY3Q7CiAKLSAgICBGWF9CT09MCQkJCQlJc01lbW9yeUJhc2VkKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0dlbk51bSA9PSAoRlhfRFdPUkQpIC0gMTsKLSAgICB9CisgIEZYX0RXT1JEIG1fZHdTaXplOwogCi0gICAgQ1BERl9TdHJlYW0qCQkJQ2xvbmUoRlhfQk9PTCBiRGlyZWN0LCBGUERGX0xQRkNsb25lU3RyZWFtQ2FsbGJhY2sgbHBmQ2FsbGJhY2ssIEZYX0xQVk9JRCBwVXNlckRhdGEpIGNvbnN0OwotcHJvdGVjdGVkOgorICBGWF9EV09SRCBtX0dlbk51bTsKIAotICAgIH5DUERGX1N0cmVhbSgpOworICB1bmlvbiB7CisgICAgdWludDhfdCogbV9wRGF0YUJ1ZjsKIAotICAgIENQREZfRGljdGlvbmFyeSoJCW1fcERpY3Q7Ci0KLSAgICBGWF9EV09SRAkJCQltX2R3U2l6ZTsKLQotICAgIEZYX0RXT1JECQkJCW1fR2VuTnVtOwotCi0gICAgdW5pb24gewotCi0gICAgICAgIEZYX0xQQllURQkJCW1fcERhdGFCdWY7Ci0KLSAgICAgICAgSUZYX0ZpbGVSZWFkKgkJbV9wRmlsZTsKLSAgICB9OwotCi0gICAgRlhfRklMRVNJWkUJCQkJbV9GaWxlT2Zmc2V0OwotCi0gICAgQ1BERl9DcnlwdG9IYW5kbGVyKgkJbV9wQ3J5cHRvSGFuZGxlcjsKLQotICAgIHZvaWQJCQkJCUluaXRTdHJlYW0oQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7Ci0gICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9PYmplY3Q7Ci0gICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9TdHJlYW1BY2M7Ci0gICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9BdHRhY2htZW50QWNjOworICAgIElGWF9GaWxlUmVhZCogbV9wRmlsZTsKKyAgfTsKIH07Ci1jbGFzcyBDUERGX1N0cmVhbUFjYyAKLXsKLXB1YmxpYzoKK2lubGluZSBDUERGX1N0cmVhbSogVG9TdHJlYW0oQ1BERl9PYmplY3QqIG9iaikgeworICByZXR1cm4gb2JqID8gb2JqLT5Bc1N0cmVhbSgpIDogbnVsbHB0cjsKK30KK2lubGluZSBjb25zdCBDUERGX1N0cmVhbSogVG9TdHJlYW0oY29uc3QgQ1BERl9PYmplY3QqIG9iaikgeworICByZXR1cm4gb2JqID8gb2JqLT5Bc1N0cmVhbSgpIDogbnVsbHB0cjsKK30KIAotICAgIENQREZfU3RyZWFtQWNjKCk7CitjbGFzcyBDUERGX1N0cmVhbUFjYyB7CisgcHVibGljOgorICBDUERGX1N0cmVhbUFjYygpOwogCi0gICAgfkNQREZfU3RyZWFtQWNjKCk7CisgIH5DUERGX1N0cmVhbUFjYygpOwogCi0gICAgdm9pZAkJCQkJTG9hZEFsbERhdGEoY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0sIEZYX0JPT0wgYlJhd0FjY2VzcyA9IEZBTFNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGVzdGltYXRlZF9zaXplID0gMCwgRlhfQk9PTCBiSW1hZ2VBY2MgPSBGQUxTRSk7CisgIHZvaWQgTG9hZEFsbERhdGEoY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmF3QWNjZXNzID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZXN0aW1hdGVkX3NpemUgPSAwLAorICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkltYWdlQWNjID0gRkFMU0UpOwogCi0gICAgY29uc3QgQ1BERl9TdHJlYW0qCQlHZXRTdHJlYW0oKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcFN0cmVhbTsKLSAgICB9CisgIGNvbnN0IENQREZfU3RyZWFtKiBHZXRTdHJlYW0oKSBjb25zdCB7IHJldHVybiBtX3BTdHJlYW07IH0KIAotICAgIENQREZfRGljdGlvbmFyeSoJCUdldERpY3QoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcFN0cmVhbT8gbV9wU3RyZWFtLT5HZXREaWN0KCkgOiBOVUxMOwotICAgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBHZXREaWN0KCkgY29uc3QgeworICAgIHJldHVybiBtX3BTdHJlYW0gPyBtX3BTdHJlYW0tPkdldERpY3QoKSA6IG51bGxwdHI7CisgIH0KIAotICAgIEZYX0xQQ0JZVEUJCQkJR2V0RGF0YSgpIGNvbnN0OworICBjb25zdCB1aW50OF90KiBHZXREYXRhKCkgY29uc3Q7CiAKLSAgICBGWF9EV09SRAkJCQlHZXRTaXplKCkgY29uc3Q7CisgIEZYX0RXT1JEIEdldFNpemUoKSBjb25zdDsKIAotICAgIEZYX0xQQllURQkJCQlEZXRhY2hEYXRhKCk7CisgIHVpbnQ4X3QqIERldGFjaERhdGEoKTsKIAotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJglHZXRJbWFnZURlY29kZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fSW1hZ2VEZWNvZGVyOwotICAgIH0KKyAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIEdldEltYWdlRGVjb2RlcigpIHsgcmV0dXJuIG1fSW1hZ2VEZWNvZGVyOyB9CiAKLSAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqCUdldEltYWdlUGFyYW0oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEltYWdlUGFyYW07Ci0gICAgfQotcHJvdGVjdGVkOgorICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIEdldEltYWdlUGFyYW0oKSB7IHJldHVybiBtX3BJbWFnZVBhcmFtOyB9CiAKLSAgICBGWF9MUEJZVEUJCQkJbV9wRGF0YTsKKyBwcm90ZWN0ZWQ6CisgIHVpbnQ4X3QqIG1fcERhdGE7CiAKLSAgICBGWF9EV09SRAkJCQltX2R3U2l6ZTsKKyAgRlhfRFdPUkQgbV9kd1NpemU7CiAKLSAgICBGWF9CT09MCQkJCQltX2JOZXdCdWY7CisgIEZYX0JPT0wgbV9iTmV3QnVmOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCQltX0ltYWdlRGVjb2RlcjsKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9JbWFnZURlY29kZXI7CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqCQltX3BJbWFnZVBhcmFtOworICBDUERGX0RpY3Rpb25hcnkqIG1fcEltYWdlUGFyYW07CiAKLSAgICBjb25zdCBDUERGX1N0cmVhbSoJCW1fcFN0cmVhbTsKKyAgY29uc3QgQ1BERl9TdHJlYW0qIG1fcFN0cmVhbTsKIAotICAgIEZYX0xQQllURQkJCQltX3BTcmNEYXRhOworICB1aW50OF90KiBtX3BTcmNEYXRhOwogfTsKLUNGWF9EYXRhRmlsdGVyKiBGUERGX0NyZWF0ZUZpbHRlcihGWF9CU1RSIG5hbWUsIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhcmFtLCBpbnQgd2lkdGggPSAwLCBpbnQgaGVpZ2h0ID0gMCk7Ci0jZGVmaW5lIEZQREZfRklMVEVSX0JVRkZFUl9TSVpFCQkyMDQ4MAotY2xhc3MgQ1BERl9TdHJlYW1GaWx0ZXIgCi17Ci1wdWJsaWM6CiAKLSAgICB+Q1BERl9TdHJlYW1GaWx0ZXIoKTsKLQotICAgIEZYX0RXT1JECQkJUmVhZEJsb2NrKEZYX0xQQllURSBidWZmZXIsIEZYX0RXT1JEIHNpemUpOwotCi0gICAgRlhfRFdPUkQJCQlHZXRTcmNQb3MoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fU3JjT2Zmc2V0OwotICAgIH0KLQotICAgIGNvbnN0IENQREZfU3RyZWFtKglHZXRTdHJlYW0oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcFN0cmVhbTsKLSAgICB9Ci1wcm90ZWN0ZWQ6Ci0KLSAgICBDUERGX1N0cmVhbUZpbHRlcigpIHt9Ci0KLSAgICBGWF9EV09SRAkJCVJlYWRMZWZ0T3ZlcihGWF9MUEJZVEUgYnVmZmVyLCBGWF9EV09SRCBidWZfc2l6ZSk7Ci0KLSAgICBjb25zdCBDUERGX1N0cmVhbSoJbV9wU3RyZWFtOwotCi0gICAgQ0ZYX0RhdGFGaWx0ZXIqCQltX3BGaWx0ZXI7Ci0KLSAgICBDRlhfQmluYXJ5QnVmKgkJbV9wQnVmZmVyOwotCi0gICAgRlhfRFdPUkQJCQltX0J1Zk9mZnNldDsKLQotICAgIEZYX0RXT1JECQkJbV9TcmNPZmZzZXQ7Ci0KLSAgICBGWF9CWVRFCQkJCW1fU3JjQnVmZmVyW0ZQREZfRklMVEVSX0JVRkZFUl9TSVpFXTsKLSAgICBmcmllbmQgY2xhc3MgQ1BERl9TdHJlYW07CitjbGFzcyBDUERGX051bGwgOiBwdWJsaWMgQ1BERl9PYmplY3QgeworIHB1YmxpYzoKKyAgQ1BERl9OdWxsKCkgOiBDUERGX09iamVjdChQREZPQkpfTlVMTCkge30KIH07Ci1jbGFzcyBDUERGX051bGwgOiBwdWJsaWMgQ1BERl9PYmplY3QKLXsKLXB1YmxpYzoKIAotICAgIHN0YXRpYyBDUERGX051bGwqCQlDcmVhdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDUERGX051bGwoKTsKLSAgICB9CitjbGFzcyBDUERGX1JlZmVyZW5jZSA6IHB1YmxpYyBDUERGX09iamVjdCB7CisgcHVibGljOgorICBDUERGX1JlZmVyZW5jZShDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBwRG9jLCBpbnQgb2JqbnVtKQorICAgICAgOiBDUERGX09iamVjdChQREZPQkpfUkVGRVJFTkNFKSwgbV9wT2JqTGlzdChwRG9jKSwgbV9SZWZPYmpOdW0ob2JqbnVtKSB7fQogCi0gICAgQ1BERl9OdWxsKCkgOiBDUERGX09iamVjdChQREZPQkpfTlVMTCkgeyB9CisgIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIqIEdldE9iakxpc3QoKSBjb25zdCB7IHJldHVybiBtX3BPYmpMaXN0OyB9CisKKyAgRlhfRFdPUkQgR2V0UmVmT2JqTnVtKCkgY29uc3QgeyByZXR1cm4gbV9SZWZPYmpOdW07IH0KKworICB2b2lkIFNldFJlZihDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBwRG9jLCBGWF9EV09SRCBvYmpudW0pOworCisgIEZYX0JPT0wgSWRlbnRpY2FsKENQREZfUmVmZXJlbmNlKiBwT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9SZWZPYmpOdW0gPT0gcE90aGVyLT5tX1JlZk9iak51bTsKKyAgfQorCisgcHJvdGVjdGVkOgorICBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBtX3BPYmpMaXN0OworCisgIEZYX0RXT1JEIG1fUmVmT2JqTnVtOworICBmcmllbmQgY2xhc3MgQ1BERl9PYmplY3Q7CiB9OwotY2xhc3MgQ1BERl9SZWZlcmVuY2UgOiBwdWJsaWMgQ1BERl9PYmplY3QKLXsKLXB1YmxpYzoKK2lubGluZSBDUERGX1JlZmVyZW5jZSogVG9SZWZlcmVuY2UoQ1BERl9PYmplY3QqIG9iaikgeworICByZXR1cm4gb2JqID8gb2JqLT5Bc1JlZmVyZW5jZSgpIDogbnVsbHB0cjsKK30KK2lubGluZSBjb25zdCBDUERGX1JlZmVyZW5jZSogVG9SZWZlcmVuY2UoY29uc3QgQ1BERl9PYmplY3QqIG9iaikgeworICByZXR1cm4gb2JqID8gb2JqLT5Bc1JlZmVyZW5jZSgpIDogbnVsbHB0cjsKK30KIAotICAgIHN0YXRpYyBDUERGX1JlZmVyZW5jZSoJQ3JlYXRlKENQREZfSW5kaXJlY3RPYmplY3RzKiBwRG9jLCBpbnQgb2JqbnVtKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDUERGX1JlZmVyZW5jZShwRG9jLCBvYmpudW0pOwotICAgIH0KK2NsYXNzIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIgeworIHB1YmxpYzoKKyAgdXNpbmcgaXRlcmF0b3IgPSBzdGQ6Om1hcDxGWF9EV09SRCwgQ1BERl9PYmplY3QqPjo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gc3RkOjptYXA8RlhfRFdPUkQsIENQREZfT2JqZWN0Kj46OmNvbnN0X2l0ZXJhdG9yOwogCi0gICAgQ1BERl9SZWZlcmVuY2UoQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBEb2MsIGludCBvYmpudW0pCi0gICAgICAgIDogQ1BERl9PYmplY3QoUERGT0JKX1JFRkVSRU5DRSksIG1fcE9iakxpc3QocERvYyksIG1fUmVmT2JqTnVtKG9iam51bSkgewotICAgIH0KKyAgZXhwbGljaXQgQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlcihDUERGX1BhcnNlciogcFBhcnNlcik7CisgIH5DUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKCk7CiAKLSAgICBDUERGX0luZGlyZWN0T2JqZWN0cyoJR2V0T2JqTGlzdCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wT2JqTGlzdDsKLSAgICB9CisgIGludCBHZXRJbmRpcmVjdFR5cGUoRlhfRFdPUkQgb2JqbnVtKTsKKyAgQ1BERl9PYmplY3QqIEdldEluZGlyZWN0T2JqZWN0KEZYX0RXT1JEIG9iam51bSwgUEFSU0VfQ09OVEVYVCogcENvbnRleHQpOworICBGWF9EV09SRCBBZGRJbmRpcmVjdE9iamVjdChDUERGX09iamVjdCogcE9iaik7CisgIHZvaWQgUmVsZWFzZUluZGlyZWN0T2JqZWN0KEZYX0RXT1JEIG9iam51bSk7CiAKLSAgICBGWF9EV09SRAkJCQlHZXRSZWZPYmpOdW0oKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fUmVmT2JqTnVtOwotICAgIH0KKyAgLy8gVGFrZXMgb3duZXJzaGlwIG9mIHxwT2JqfC4KKyAgRlhfQk9PTCBJbnNlcnRJbmRpcmVjdE9iamVjdChGWF9EV09SRCBvYmpudW0sIENQREZfT2JqZWN0KiBwT2JqKTsKIAotICAgIHZvaWQJCQkJCVNldFJlZihDUERGX0luZGlyZWN0T2JqZWN0cyogcERvYywgRlhfRFdPUkQgb2JqbnVtKTsKKyAgRlhfRFdPUkQgR2V0TGFzdE9iak51bSgpIGNvbnN0IHsgcmV0dXJuIG1fTGFzdE9iak51bTsgfQorICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIG1fSW5kaXJlY3RPYmpzLmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBtX0luZGlyZWN0T2Jqcy5jYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBtX0luZGlyZWN0T2Jqcy5lbmQoKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBtX0luZGlyZWN0T2Jqcy5lbmQoKTsgfQogCi0gICAgRlhfQk9PTAkJCQkJSWRlbnRpY2FsKENQREZfUmVmZXJlbmNlKiBwT3RoZXIpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9SZWZPYmpOdW0gPT0gcE90aGVyLT5tX1JlZk9iak51bTsKLSAgICB9Ci1wcm90ZWN0ZWQ6Ci0KLSAgICBDUERGX0luZGlyZWN0T2JqZWN0cyoJbV9wT2JqTGlzdDsKLQotICAgIEZYX0RXT1JECQkJCW1fUmVmT2JqTnVtOwotICAgIGZyaWVuZCBjbGFzcwkJCUNQREZfT2JqZWN0OwotfTsKLWNsYXNzIENQREZfSW5kaXJlY3RPYmplY3RzIAotewotcHVibGljOgotCi0gICAgQ1BERl9JbmRpcmVjdE9iamVjdHMoQ1BERl9QYXJzZXIqIHBQYXJzZXIpOwotCi0gICAgfkNQREZfSW5kaXJlY3RPYmplY3RzKCk7Ci0KLSAgICBDUERGX09iamVjdCoJCQlHZXRJbmRpcmVjdE9iamVjdChGWF9EV09SRCBvYmpudW0sIHN0cnVjdCBQQVJTRV9DT05URVhUKiBwQ29udGV4dCA9IE5VTEwpOwotCi0gICAgaW50CQkJCQkJR2V0SW5kaXJlY3RUeXBlKEZYX0RXT1JEIG9iam51bSk7Ci0KLSAgICBGWF9EV09SRAkJCQlBZGRJbmRpcmVjdE9iamVjdChDUERGX09iamVjdCogcE9iaik7Ci0KLSAgICB2b2lkCQkJCQlSZWxlYXNlSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgb2JqbnVtKTsKLQotICAgIHZvaWQJCQkJCUluc2VydEluZGlyZWN0T2JqZWN0KEZYX0RXT1JEIG9iam51bSwgQ1BERl9PYmplY3QqIHBPYmopOwotCi0gICAgRlhfRFdPUkQJCQkJR2V0TGFzdE9iak51bSgpIGNvbnN0OwotCi0gICAgRlhfUE9TSVRJT04JCQkJR2V0U3RhcnRQb3NpdGlvbigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9JbmRpcmVjdE9ianMuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIH0KLQotICAgIHZvaWQJCQkJCUdldE5leHRBc3NvYyhGWF9QT1NJVElPTiYgclBvcywgRlhfRFdPUkQmIG9iam51bSwgQ1BERl9PYmplY3QqJiBwT2JqZWN0KSBjb25zdAotICAgIHsKLSAgICAgICAgbV9JbmRpcmVjdE9ianMuR2V0TmV4dEFzc29jKHJQb3MsICh2b2lkKiYpb2JqbnVtLCAodm9pZComKXBPYmplY3QpOwotICAgIH0KLXByb3RlY3RlZDoKLQotICAgIENGWF9NYXBQdHJUb1B0cgkJCW1fSW5kaXJlY3RPYmpzOwotCi0gICAgQ1BERl9QYXJzZXIqCQkJbV9wUGFyc2VyOwotCi0gICAgRlhfRFdPUkQJCQkJbV9MYXN0T2JqTnVtOworIHByb3RlY3RlZDoKKyAgQ1BERl9QYXJzZXIqIG1fcFBhcnNlcjsKKyAgRlhfRFdPUkQgbV9MYXN0T2JqTnVtOworICBzdGQ6Om1hcDxGWF9EV09SRCwgQ1BERl9PYmplY3QqPiBtX0luZGlyZWN0T2JqczsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9JTkNMVURFX0ZQREZBUElfRlBERl9PQkpFQ1RTX0hfCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2UuaCBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oCmluZGV4IGQ1NDliNzcuLmQ1ODUzN2EgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oCkBAIC0xLDEzICsxLDEzIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgQ09SRV9JTkNMVURFX0ZQREZBUElfRlBERl9QQUdFX0hfCiAjZGVmaW5lIENPUkVfSU5DTFVERV9GUERGQVBJX0ZQREZfUEFHRV9IXwogCi0jaW5jbHVkZSAiLi4vZnhnZS9meF9kaWIuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9kaWIuaCIKICNpbmNsdWRlICJmcGRmX3BhcnNlci5oIgogI2luY2x1ZGUgImZwZGZfcmVzb3VyY2UuaCIKIApAQCAtMjEsMjI2ICsyMSwxNzIgQEAKIGNsYXNzIENQREZfQWxsU3RhdGVzOwogY2xhc3MgQ1BERl9Db250ZW50UGFyc2VyOwogY2xhc3MgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOwotY2xhc3MgQ1BERl9SZXNvdXJjZU5hbWluZzsKLSNkZWZpbmUgUERGVFJBTlNfR1JPVVAJCQkweDAxMDAKLSNkZWZpbmUgUERGVFJBTlNfSVNPTEFURUQJCTB4MDIwMAotI2RlZmluZSBQREZUUkFOU19LTk9DS09VVAkJMHgwNDAwCi0jZGVmaW5lIFBERl9DT05URU5UX05PVF9QQVJTRUQJMAotI2RlZmluZSBQREZfQ09OVEVOVF9QQVJTSU5HCQkxCi0jZGVmaW5lIFBERl9DT05URU5UX1BBUlNFRAkJMgotY2xhc3MgQ1BERl9QYWdlT2JqZWN0cyAKLXsKLXB1YmxpYzoKKyNkZWZpbmUgUERGVFJBTlNfR1JPVVAgMHgwMTAwCisjZGVmaW5lIFBERlRSQU5TX0lTT0xBVEVEIDB4MDIwMAorI2RlZmluZSBQREZUUkFOU19LTk9DS09VVCAweDA0MDAKIAotICAgIENQREZfUGFnZU9iamVjdHMoRlhfQk9PTCBiUmVsZWFzZU1lbWJlcnMgPSBUUlVFKTsKK2NsYXNzIENQREZfUGFnZU9iamVjdHMgeworIHB1YmxpYzoKKyAgQ1BERl9QYWdlT2JqZWN0cyhGWF9CT09MIGJSZWxlYXNlTWVtYmVycyA9IFRSVUUpOworICB+Q1BERl9QYWdlT2JqZWN0cygpOwogCi0gICAgfkNQREZfUGFnZU9iamVjdHMoKTsKKyAgdm9pZCBDb250aW51ZVBhcnNlKElGWF9QYXVzZSogcFBhdXNlKTsKIAorICBGWF9CT09MIElzUGFyc2VkKCkgY29uc3QgeyByZXR1cm4gbV9QYXJzZVN0YXRlID09IENPTlRFTlRfUEFSU0VEOyB9CiAKKyAgRlhfUE9TSVRJT04gR2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9PYmplY3RMaXN0LkdldEhlYWRQb3NpdGlvbigpOworICB9CiAKKyAgRlhfUE9TSVRJT04gR2V0TGFzdE9iamVjdFBvc2l0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBtX09iamVjdExpc3QuR2V0VGFpbFBvc2l0aW9uKCk7CisgIH0KIAotICAgIHZvaWQJCQkJQ29udGludWVQYXJzZShJRlhfUGF1c2UqIHBQYXVzZSk7CisgIENQREZfUGFnZU9iamVjdCogR2V0TmV4dE9iamVjdChGWF9QT1NJVElPTiYgcG9zKSBjb25zdCB7CisgICAgcmV0dXJuIChDUERGX1BhZ2VPYmplY3QqKW1fT2JqZWN0TGlzdC5HZXROZXh0KHBvcyk7CisgIH0KIAotICAgIGludAkJCQkJR2V0UGFyc2VTdGF0ZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9QYXJzZVN0YXRlOwotICAgIH0KKyAgQ1BERl9QYWdlT2JqZWN0KiBHZXRQcmV2T2JqZWN0KEZYX1BPU0lUSU9OJiBwb3MpIGNvbnN0IHsKKyAgICByZXR1cm4gKENQREZfUGFnZU9iamVjdCopbV9PYmplY3RMaXN0LkdldFByZXYocG9zKTsKKyAgfQogCi0gICAgRlhfQk9PTAkJCQlJc1BhcnNlZCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9QYXJzZVN0YXRlID09IFBERl9DT05URU5UX1BBUlNFRDsKLSAgICB9CisgIENQREZfUGFnZU9iamVjdCogR2V0T2JqZWN0QXQoRlhfUE9TSVRJT04gcG9zKSBjb25zdCB7CisgICAgcmV0dXJuIChDUERGX1BhZ2VPYmplY3QqKW1fT2JqZWN0TGlzdC5HZXRBdChwb3MpOworICB9CiAKLSAgICBpbnQJCQkJCUVzdGltYXRlUGFyc2VQcm9ncmVzcygpIGNvbnN0OworICBGWF9EV09SRCBDb3VudE9iamVjdHMoKSBjb25zdCB7IHJldHVybiBtX09iamVjdExpc3QuR2V0Q291bnQoKTsgfQogCisgIGludCBHZXRPYmplY3RJbmRleChDUERGX1BhZ2VPYmplY3QqIHBPYmopIGNvbnN0OwogCisgIENQREZfUGFnZU9iamVjdCogR2V0T2JqZWN0QnlJbmRleChpbnQgaW5kZXgpIGNvbnN0OwogCisgIEZYX1BPU0lUSU9OIEluc2VydE9iamVjdChGWF9QT1NJVElPTiBwb3NJbnNlcnRBZnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUGFnZU9iamVjdCogcE5ld09iamVjdCk7CiAKLSAgICBGWF9QT1NJVElPTgkJCUdldEZpcnN0T2JqZWN0UG9zaXRpb24oKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fT2JqZWN0TGlzdC5HZXRIZWFkUG9zaXRpb24oKTsKLSAgICB9CisgIHZvaWQgVHJhbnNmb3JtKGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCk7CiAKLSAgICBGWF9QT1NJVElPTgkJCUdldExhc3RPYmplY3RQb3NpdGlvbigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9PYmplY3RMaXN0LkdldFRhaWxQb3NpdGlvbigpOwotICAgIH0KKyAgRlhfQk9PTCBCYWNrZ3JvdW5kQWxwaGFOZWVkZWQoKSBjb25zdCB7IHJldHVybiBtX2JCYWNrZ3JvdW5kQWxwaGFOZWVkZWQ7IH0KIAotICAgIENQREZfUGFnZU9iamVjdCoJR2V0TmV4dE9iamVjdChGWF9QT1NJVElPTiYgcG9zKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIChDUERGX1BhZ2VPYmplY3QqKW1fT2JqZWN0TGlzdC5HZXROZXh0KHBvcyk7Ci0gICAgfQorICBGWF9CT09MIEhhc0ltYWdlTWFzaygpIGNvbnN0IHsgcmV0dXJuIG1fYkhhc0ltYWdlTWFzazsgfQogCi0gICAgQ1BERl9QYWdlT2JqZWN0KglHZXRQcmV2T2JqZWN0KEZYX1BPU0lUSU9OJiBwb3MpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gKENQREZfUGFnZU9iamVjdCopbV9PYmplY3RMaXN0LkdldFByZXYocG9zKTsKLSAgICB9CisgIENGWF9GbG9hdFJlY3QgQ2FsY0JvdW5kaW5nQm94KCkgY29uc3Q7CiAKLSAgICBDUERGX1BhZ2VPYmplY3QqCUdldE9iamVjdEF0KEZYX1BPU0lUSU9OIHBvcykgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiAoQ1BERl9QYWdlT2JqZWN0KiltX09iamVjdExpc3QuR2V0QXQocG9zKTsKLSAgICB9CisgIENQREZfRGljdGlvbmFyeSogbV9wRm9ybURpY3Q7CisgIENQREZfU3RyZWFtKiBtX3BGb3JtU3RyZWFtOworICBDUERGX0RvY3VtZW50KiBtX3BEb2N1bWVudDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BQYWdlUmVzb3VyY2VzOworICBDUERGX0RpY3Rpb25hcnkqIG1fcFJlc291cmNlczsKKyAgQ0ZYX0Zsb2F0UmVjdCBtX0JCb3g7CisgIGludCBtX1RyYW5zcGFyZW5jeTsKIAotICAgIEZYX0RXT1JECQkJQ291bnRPYmplY3RzKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX09iamVjdExpc3QuR2V0Q291bnQoKTsKLSAgICB9CisgcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgQ1BERl9Db250ZW50UGFyc2VyOworICBmcmllbmQgY2xhc3MgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOworICBmcmllbmQgY2xhc3MgQ1BERl9BbGxTdGF0ZXM7CiAKLSAgICBpbnQJCQkJCUdldE9iamVjdEluZGV4KENQREZfUGFnZU9iamVjdCogcE9iaikgY29uc3Q7CisgIGVudW0gUGFyc2VTdGF0ZSB7IENPTlRFTlRfTk9UX1BBUlNFRCwgQ09OVEVOVF9QQVJTSU5HLCBDT05URU5UX1BBUlNFRCB9OwogCi0gICAgQ1BERl9QYWdlT2JqZWN0KglHZXRPYmplY3RCeUluZGV4KGludCBpbmRleCkgY29uc3Q7CisgIHZvaWQgTG9hZFRyYW5zSW5mbygpOworICB2b2lkIENsZWFyQ2FjaGVPYmplY3RzKCk7CiAKLQotCi0KLQotICAgIEZYX1BPU0lUSU9OCQkJSW5zZXJ0T2JqZWN0KEZYX1BPU0lUSU9OIHBvc0luc2VydEFmdGVyLCBDUERGX1BhZ2VPYmplY3QqIHBOZXdPYmplY3QpOwotCi0gICAgdm9pZAkJCQlUcmFuc2Zvcm0oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KTsKLQotICAgIEZYX0JPT0wJCQkJQmFja2dyb3VuZEFscGhhTmVlZGVkKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2JCYWNrZ3JvdW5kQWxwaGFOZWVkZWQ7Ci0gICAgfQotCi0gICAgQ0ZYX0Zsb2F0UmVjdAkJQ2FsY0JvdW5kaW5nQm94KCkgY29uc3Q7Ci0KLSAgICBDUERGX0RpY3Rpb25hcnkqCW1fcEZvcm1EaWN0OwotCi0gICAgQ1BERl9TdHJlYW0qCQltX3BGb3JtU3RyZWFtOwotCi0gICAgQ1BERl9Eb2N1bWVudCoJCW1fcERvY3VtZW50OwotCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgltX3BQYWdlUmVzb3VyY2VzOwotCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgltX3BSZXNvdXJjZXM7Ci0KLSAgICBDRlhfRmxvYXRSZWN0CQltX0JCb3g7Ci0KLSAgICBpbnQJCQkJCW1fVHJhbnNwYXJlbmN5OwotCi1wcm90ZWN0ZWQ6Ci0gICAgZnJpZW5kIGNsYXNzCQlDUERGX0NvbnRlbnRQYXJzZXI7Ci0gICAgZnJpZW5kIGNsYXNzCQlDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI7Ci0gICAgZnJpZW5kIGNsYXNzCQlDUERGX0FsbFN0YXRlczsKLQotICAgIENGWF9QdHJMaXN0CQkJbV9PYmplY3RMaXN0OwotCi0gICAgRlhfQk9PTAkJCQltX2JCYWNrZ3JvdW5kQWxwaGFOZWVkZWQ7Ci0KLSAgICBGWF9CT09MCQkJCW1fYlJlbGVhc2VNZW1iZXJzOwotICAgIHZvaWQJCQkJTG9hZFRyYW5zSW5mbygpOwotICAgIHZvaWQgICAgICAgICAgICAgICAgQ2xlYXJDYWNoZU9iamVjdHMoKTsKLQotICAgIENQREZfQ29udGVudFBhcnNlcioJbV9wUGFyc2VyOwotCi0gICAgRlhfQk9PTAkJCQltX1BhcnNlU3RhdGU7CisgIENGWF9QdHJMaXN0IG1fT2JqZWN0TGlzdDsKKyAgRlhfQk9PTCBtX2JCYWNrZ3JvdW5kQWxwaGFOZWVkZWQ7CisgIEZYX0JPT0wgbV9iSGFzSW1hZ2VNYXNrOworICBGWF9CT09MIG1fYlJlbGVhc2VNZW1iZXJzOworICBDUERGX0NvbnRlbnRQYXJzZXIqIG1fcFBhcnNlcjsKKyAgUGFyc2VTdGF0ZSBtX1BhcnNlU3RhdGU7CiB9OwotY2xhc3MgQ1BERl9QYWdlIDogcHVibGljIENQREZfUGFnZU9iamVjdHMsIHB1YmxpYyBDRlhfUHJpdmF0ZURhdGEKLXsKLXB1YmxpYzoKIAotICAgIENQREZfUGFnZSgpOworY2xhc3MgQ1BERl9QYWdlIDogcHVibGljIENQREZfUGFnZU9iamVjdHMsIHB1YmxpYyBDRlhfUHJpdmF0ZURhdGEgeworIHB1YmxpYzoKKyAgQ1BERl9QYWdlKCk7CisgIH5DUERGX1BhZ2UoKTsKIAotICAgIH5DUERGX1BhZ2UoKTsKKyAgdm9pZCBMb2FkKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0LAorICAgICAgICAgICAgRlhfQk9PTCBiUGFnZUNhY2hlID0gVFJVRSk7CiAKLSAgICB2b2lkCQkJCUxvYWQoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCwgRlhfQk9PTCBiUGFnZUNhY2hlID0gVFJVRSk7CisgIHZvaWQgU3RhcnRQYXJzZShDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMgPSBOVUxMLCBGWF9CT09MIGJSZVBhcnNlID0gRkFMU0UpOworICB2b2lkIFBhcnNlQ29udGVudChDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZVBhcnNlID0gRkFMU0UpOwogCi0gICAgdm9pZAkJCQlTdGFydFBhcnNlKENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucyA9IE5VTEwsIEZYX0JPT0wgYlJlUGFyc2UgPSBGQUxTRSk7CisgIHZvaWQgR2V0RGlzcGxheU1hdHJpeChDRlhfTWF0cml4JiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB5UG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlSb3RhdGUpIGNvbnN0OwogCi0gICAgdm9pZAkJCQlQYXJzZUNvbnRlbnQoQ1BERl9QYXJzZU9wdGlvbnMqIHBPcHRpb25zID0gTlVMTCwgRlhfQk9PTCBiUmVQYXJzZSA9IEZBTFNFKTsKKyAgRlhfRkxPQVQgR2V0UGFnZVdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9QYWdlV2lkdGg7IH0KKyAgRlhfRkxPQVQgR2V0UGFnZUhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fUGFnZUhlaWdodDsgfQorICBDRlhfRmxvYXRSZWN0IEdldFBhZ2VCQm94KCkgY29uc3QgeyByZXR1cm4gbV9CQm94OyB9CisgIGNvbnN0IENGWF9NYXRyaXgmIEdldFBhZ2VNYXRyaXgoKSBjb25zdCB7IHJldHVybiBtX1BhZ2VNYXRyaXg7IH0KKyAgQ1BERl9PYmplY3QqIEdldFBhZ2VBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3Q7CisgIENQREZfUGFnZVJlbmRlckNhY2hlKiBHZXRSZW5kZXJDYWNoZSgpIGNvbnN0IHsgcmV0dXJuIG1fcFBhZ2VSZW5kZXI7IH0KIAotICAgIHZvaWQJCQkJR2V0RGlzcGxheU1hdHJpeChDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgsIGludCB4UG9zLCBpbnQgeVBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhTaXplLCBpbnQgeVNpemUsIGludCBpUm90YXRlKSBjb25zdDsKLQotICAgIEZYX0ZMT0FUCQkJR2V0UGFnZVdpZHRoKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1BhZ2VXaWR0aDsKLSAgICB9Ci0KLSAgICBGWF9GTE9BVAkJCUdldFBhZ2VIZWlnaHQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fUGFnZUhlaWdodDsKLSAgICB9Ci0KLSAgICBDRlhfRmxvYXRSZWN0CQlHZXRQYWdlQkJveCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9CQm94OwotICAgIH0KLQotICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmCUdldFBhZ2VNYXRyaXgoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fUGFnZU1hdHJpeDsKLSAgICB9Ci0KLSAgICBDUERGX09iamVjdCoJCUdldFBhZ2VBdHRyKEZYX0JTVFIgbmFtZSkgY29uc3Q7Ci0KLQotCi0gICAgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqCUdldFJlbmRlckNhY2hlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BQYWdlUmVuZGVyOwotICAgIH0KLQotICAgIHZvaWQJCQkJQ2xlYXJSZW5kZXJDYWNoZSgpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgZnJpZW5kIGNsYXNzCQlDUERGX0NvbnRlbnRQYXJzZXI7Ci0KLSAgICBGWF9GTE9BVAkJCW1fUGFnZVdpZHRoOwotCi0gICAgRlhfRkxPQVQJCQltX1BhZ2VIZWlnaHQ7Ci0KLSAgICBDRlhfQWZmaW5lTWF0cml4CW1fUGFnZU1hdHJpeDsKLQotICAgIENQREZfUGFnZVJlbmRlckNhY2hlKgltX3BQYWdlUmVuZGVyOworIHByb3RlY3RlZDoKKyAgZnJpZW5kIGNsYXNzIENQREZfQ29udGVudFBhcnNlcjsKKyAgRlhfRkxPQVQgbV9QYWdlV2lkdGg7CisgIEZYX0ZMT0FUIG1fUGFnZUhlaWdodDsKKyAgQ0ZYX01hdHJpeCBtX1BhZ2VNYXRyaXg7CisgIENQREZfUGFnZVJlbmRlckNhY2hlKiBtX3BQYWdlUmVuZGVyOwogfTsKLWNsYXNzIENQREZfUGFyc2VPcHRpb25zIAotewotcHVibGljOgorY2xhc3MgQ1BERl9QYXJzZU9wdGlvbnMgeworIHB1YmxpYzoKKyAgQ1BERl9QYXJzZU9wdGlvbnMoKTsKIAotICAgIENQREZfUGFyc2VPcHRpb25zKCk7CisgIEZYX0JPT0wgbV9iVGV4dE9ubHk7CiAKLSAgICBGWF9CT09MCQkJCW1fYlRleHRPbmx5OworICBGWF9CT09MIG1fYk1hcmtlZENvbnRlbnQ7CiAKLSAgICBGWF9CT09MCQkJCW1fYk1hcmtlZENvbnRlbnQ7CisgIEZYX0JPT0wgbV9iU2VwYXJhdGVGb3JtOwogCi0gICAgRlhfQk9PTAkJCQltX2JTZXBhcmF0ZUZvcm07Ci0KLSAgICBGWF9CT09MCQkJCW1fYkRlY29kZUlubGluZUltYWdlOworICBGWF9CT09MIG1fYkRlY29kZUlubGluZUltYWdlOwogfTsKLWNsYXNzIENQREZfRm9ybSA6IHB1YmxpYyBDUERGX1BhZ2VPYmplY3RzCi17Ci1wdWJsaWM6CitjbGFzcyBDUERGX0Zvcm0gOiBwdWJsaWMgQ1BERl9QYWdlT2JqZWN0cyB7CisgcHVibGljOgorICBDUERGX0Zvcm0oQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywKKyAgICAgICAgICAgIENQREZfU3RyZWFtKiBwRm9ybVN0cmVhbSwKKyAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhcmVudFJlc291cmNlcyA9IE5VTEwpOwogCi0gICAgQ1BERl9Gb3JtKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywgQ1BERl9TdHJlYW0qIHBGb3JtU3RyZWFtLCBDUERGX0RpY3Rpb25hcnkqIHBQYXJlbnRSZXNvdXJjZXMgPSBOVUxMKTsKKyAgfkNQREZfRm9ybSgpOwogCi0gICAgfkNQREZfRm9ybSgpOworICB2b2lkIFN0YXJ0UGFyc2UoQ1BERl9BbGxTdGF0ZXMqIHBHcmFwaGljU3RhdGVzLAorICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFBhcmVudE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgIENQREZfVHlwZTNDaGFyKiBwVHlwZTNDaGFyLAorICAgICAgICAgICAgICAgICAgQ1BERl9QYXJzZU9wdGlvbnMqIHBPcHRpb25zLAorICAgICAgICAgICAgICAgICAgaW50IGxldmVsID0gMCk7CiAKLSAgICB2b2lkCQkJCVN0YXJ0UGFyc2UoQ1BERl9BbGxTdGF0ZXMqIHBHcmFwaGljU3RhdGVzLCAgQ0ZYX0FmZmluZU1hdHJpeCogcFBhcmVudE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9UeXBlM0NoYXIqIHBUeXBlM0NoYXIsIENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucywgaW50IGxldmVsID0gMCk7CisgIHZvaWQgUGFyc2VDb250ZW50KENQREZfQWxsU3RhdGVzKiBwR3JhcGhpY1N0YXRlcywKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFBhcmVudE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgQ1BERl9UeXBlM0NoYXIqIHBUeXBlM0NoYXIsCisgICAgICAgICAgICAgICAgICAgIENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsID0gMCk7CiAKLSAgICB2b2lkCQkJCVBhcnNlQ29udGVudChDUERGX0FsbFN0YXRlcyogcEdyYXBoaWNTdGF0ZXMsIENGWF9BZmZpbmVNYXRyaXgqIHBQYXJlbnRNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9UeXBlM0NoYXIqIHBUeXBlM0NoYXIsIENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucywgaW50IGxldmVsID0gMCk7Ci0KLSAgICBDUERGX0Zvcm0qCQkJQ2xvbmUoKSBjb25zdDsKKyAgQ1BERl9Gb3JtKiBDbG9uZSgpIGNvbnN0OwogfTsKLWNsYXNzIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZSAKLXsKLXB1YmxpYzoKLSAgICBDUERGX1BhZ2VDb250ZW50R2VuZXJhdGUoQ1BERl9QYWdlKiBwUGFnZSk7Ci0gICAgfkNQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZSgpOwotICAgIEZYX0JPT0wgSW5zZXJ0UGFnZU9iamVjdChDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqZWN0KTsKLSAgICB2b2lkIEdlbmVyYXRlQ29udGVudCgpOwotICAgIHZvaWQgVHJhbnNmb3JtQ29udGVudChDRlhfTWF0cml4JiBtYXRyaXgpOwotcHJvdGVjdGVkOgotICAgIHZvaWQgICAgICAgICAgICBQcm9jZXNzSW1hZ2UoQ0ZYX0J5dGVUZXh0QnVmJiBidWYsIENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaik7Ci0gICAgdm9pZCAgICAgICAgICAgIFByb2Nlc3NGb3JtKENGWF9CeXRlVGV4dEJ1ZiYgYnVmLCBGWF9MUENCWVRFIGRhdGEsIEZYX0RXT1JEIHNpemUsIENGWF9NYXRyaXgmIG1hdHJpeCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgIFJlYWxpemVSZXNvdXJjZShDUERGX09iamVjdCogcFJlc291cmNlT2JqLCBjb25zdCBGWF9DSEFSKiBzelR5cGUpOwotcHJpdmF0ZToKLSAgICBDUERGX1BhZ2UqICAgICAgbV9wUGFnZTsKLSAgICBDUERGX0RvY3VtZW50KiAgbV9wRG9jdW1lbnQ7Ci0gICAgQ0ZYX1B0ckFycmF5ICAgIG1fcGFnZU9iamVjdHM7CitjbGFzcyBDUERGX1BhZ2VDb250ZW50R2VuZXJhdGUgeworIHB1YmxpYzoKKyAgQ1BERl9QYWdlQ29udGVudEdlbmVyYXRlKENQREZfUGFnZSogcFBhZ2UpOworICB+Q1BERl9QYWdlQ29udGVudEdlbmVyYXRlKCk7CisgIEZYX0JPT0wgSW5zZXJ0UGFnZU9iamVjdChDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqZWN0KTsKKyAgdm9pZCBHZW5lcmF0ZUNvbnRlbnQoKTsKKyAgdm9pZCBUcmFuc2Zvcm1Db250ZW50KENGWF9NYXRyaXgmIG1hdHJpeCk7CisKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgUHJvY2Vzc0ltYWdlKENGWF9CeXRlVGV4dEJ1ZiYgYnVmLCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmopOworICB2b2lkIFByb2Nlc3NGb3JtKENGWF9CeXRlVGV4dEJ1ZiYgYnVmLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4JiBtYXRyaXgpOworICBDRlhfQnl0ZVN0cmluZyBSZWFsaXplUmVzb3VyY2UoQ1BERl9PYmplY3QqIHBSZXNvdXJjZU9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIHN6VHlwZSk7CisKKyBwcml2YXRlOgorICBDUERGX1BhZ2UqIG1fcFBhZ2U7CisgIENQREZfRG9jdW1lbnQqIG1fcERvY3VtZW50OworICBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX1BhZ2VPYmplY3QqPiBtX3BhZ2VPYmplY3RzOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0lOQ0xVREVfRlBERkFQSV9GUERGX1BBR0VfSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZW9iai5oIGIvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlb2JqLmgKaW5kZXggMWI1M2JkYy4uMmI2Zjc4ZSAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlb2JqLmgKKysrIGIvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlb2JqLmgKQEAgLTEsNzE5ICsxLDU2OCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIENPUkVfSU5DTFVERV9GUERGQVBJX0ZQREZfUEFHRU9CSl9IXwogI2RlZmluZSBDT1JFX0lOQ0xVREVfRlBERkFQSV9GUERGX1BBR0VPQkpfSF8KIAotI2luY2x1ZGUgIi4uL2Z4Z2UvZnhfZ2UuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9nZS5oIgogI2luY2x1ZGUgImZwZGZfcmVzb3VyY2UuaCIKIAotY2xhc3MgQ1BERl9QYXRoOwotY2xhc3MgQ1BERl9DbGlwUGF0aERhdGE7CiBjbGFzcyBDUERGX0NsaXBQYXRoOwotY2xhc3MgQ1BERl9Db2xvclN0YXRlRGF0YTsKK2NsYXNzIENQREZfQ2xpcFBhdGhEYXRhOwogY2xhc3MgQ1BERl9Db2xvclN0YXRlOwotY2xhc3MgQ1BERl9HcmFwaFN0YXRlOwotY2xhc3MgQ1BERl9UZXh0U3RhdGVEYXRhOwotY2xhc3MgQ1BERl9UZXh0U3RhdGU7Ci1jbGFzcyBDUERGX0dlbmVyYWxTdGF0ZURhdGE7Ci1jbGFzcyBDUERGX0dlbmVyYWxTdGF0ZTsKLWNsYXNzIENQREZfQ29udGVudE1hcmtJdGVtOworY2xhc3MgQ1BERl9Db2xvclN0YXRlRGF0YTsKIGNsYXNzIENQREZfQ29udGVudE1hcms7Ci1jbGFzcyBDUERGX0dyYXBoaWNTdGF0ZXM7Ci1jbGFzcyBDUERGX1BhZ2VPYmplY3Q7Ci1jbGFzcyBDUERGX1RleHRPYmplY3Q7Ci1jbGFzcyBDUERGX1BhdGhPYmplY3Q7Ci1jbGFzcyBDUERGX0ltYWdlT2JqZWN0OwotY2xhc3MgQ1BERl9TaGFkaW5nT2JqZWN0OworY2xhc3MgQ1BERl9Db250ZW50TWFya0l0ZW07CiBjbGFzcyBDUERGX0Zvcm1PYmplY3Q7Ci1jbGFzcyBDUERGX0lubGluZUltYWdlczsKK2NsYXNzIENQREZfR2VuZXJhbFN0YXRlOworY2xhc3MgQ1BERl9HZW5lcmFsU3RhdGVEYXRhOworY2xhc3MgQ1BERl9HcmFwaGljU3RhdGVzOworY2xhc3MgQ1BERl9HcmFwaFN0YXRlOworY2xhc3MgQ1BERl9JbWFnZU9iamVjdDsKK2NsYXNzIENQREZfUGFnZU9iamVjdDsKK2NsYXNzIENQREZfUGF0aDsKK2NsYXNzIENQREZfUGF0aE9iamVjdDsKK2NsYXNzIENQREZfU2hhZGluZ09iamVjdDsKK2NsYXNzIENQREZfVGV4dE9iamVjdDsKK2NsYXNzIENQREZfVGV4dFN0YXRlOworY2xhc3MgQ1BERl9UZXh0U3RhdGVEYXRhOworY2xhc3MgQ1BERl9UcmFuc2ZlckZ1bmM7CisKIHR5cGVkZWYgQ0ZYX1BhdGhEYXRhIENQREZfUGF0aERhdGE7Ci1jbGFzcyBDUERGX1BhdGggOiBwdWJsaWMgQ0ZYX0NvdW50UmVmPENGWF9QYXRoRGF0YT4KLXsKLXB1YmxpYzoKIAorY2xhc3MgQ1BERl9QYXRoIDogcHVibGljIENGWF9Db3VudFJlZjxDRlhfUGF0aERhdGE+IHsKKyBwdWJsaWM6CisgIGludCBHZXRQb2ludENvdW50KCkgeyByZXR1cm4gbV9wT2JqZWN0LT5tX1BvaW50Q291bnQ7IH0KIAorICBpbnQgR2V0RmxhZyhpbnQgaW5kZXgpIHsgcmV0dXJuIG1fcE9iamVjdC0+bV9wUG9pbnRzW2luZGV4XS5tX0ZsYWc7IH0KIAorICBGWF9GTE9BVCBHZXRQb2ludFgoaW50IGluZGV4KSB7IHJldHVybiBtX3BPYmplY3QtPm1fcFBvaW50c1tpbmRleF0ubV9Qb2ludFg7IH0KIAotICAgIGludAkJCQkJR2V0UG9pbnRDb3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wT2JqZWN0LT5tX1BvaW50Q291bnQ7Ci0gICAgfQorICBGWF9GTE9BVCBHZXRQb2ludFkoaW50IGluZGV4KSB7IHJldHVybiBtX3BPYmplY3QtPm1fcFBvaW50c1tpbmRleF0ubV9Qb2ludFk7IH0KIAotICAgIGludAkJCQkJR2V0RmxhZyhpbnQgaW5kZXgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wT2JqZWN0LT5tX3BQb2ludHNbaW5kZXhdLm1fRmxhZzsKLSAgICB9CisgIEZYX1BBVEhQT0lOVCogR2V0UG9pbnRzKCkgeyByZXR1cm4gbV9wT2JqZWN0LT5tX3BQb2ludHM7IH0KIAotICAgIEZYX0ZMT0FUCQkJR2V0UG9pbnRYKGludCBpbmRleCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BPYmplY3QtPm1fcFBvaW50c1tpbmRleF0ubV9Qb2ludFg7Ci0gICAgfQorICBDRlhfRmxvYXRSZWN0IEdldEJvdW5kaW5nQm94KCkgY29uc3QgeyByZXR1cm4gbV9wT2JqZWN0LT5HZXRCb3VuZGluZ0JveCgpOyB9CiAKLSAgICBGWF9GTE9BVAkJCUdldFBvaW50WShpbnQgaW5kZXgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wT2JqZWN0LT5tX3BQb2ludHNbaW5kZXhdLm1fUG9pbnRZOwotICAgIH0KKyAgQ0ZYX0Zsb2F0UmVjdCBHZXRCb3VuZGluZ0JveChGWF9GTE9BVCBsaW5lX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG1pdGVyX2xpbWl0KSBjb25zdCB7CisgICAgcmV0dXJuIG1fcE9iamVjdC0+R2V0Qm91bmRpbmdCb3gobGluZV93aWR0aCwgbWl0ZXJfbGltaXQpOworICB9CiAKKyAgdm9pZCBUcmFuc2Zvcm0oY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgeyBHZXRNb2RpZnkoKS0+VHJhbnNmb3JtKHBNYXRyaXgpOyB9CiAKKyAgdm9pZCBBcHBlbmQoQ1BERl9QYXRoIHNyYywgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgeworICAgIG1fcE9iamVjdC0+QXBwZW5kKHNyYy5tX3BPYmplY3QsIHBNYXRyaXgpOworICB9CiAKKyAgdm9pZCBBcHBlbmRSZWN0KEZYX0ZMT0FUIGxlZnQsCisgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBib3R0b20sCisgICAgICAgICAgICAgICAgICBGWF9GTE9BVCByaWdodCwKKyAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRvcCkgeworICAgIG1fcE9iamVjdC0+QXBwZW5kUmVjdChsZWZ0LCBib3R0b20sIHJpZ2h0LCB0b3ApOworICB9CiAKLSAgICBGWF9QQVRIUE9JTlQqCQlHZXRQb2ludHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcE9iamVjdC0+bV9wUG9pbnRzOwotICAgIH0KLQotCi0gICAgQ0ZYX0Zsb2F0UmVjdAkJR2V0Qm91bmRpbmdCb3goKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcE9iamVjdC0+R2V0Qm91bmRpbmdCb3goKTsKLSAgICB9Ci0KLSAgICBDRlhfRmxvYXRSZWN0CQlHZXRCb3VuZGluZ0JveChGWF9GTE9BVCBsaW5lX3dpZHRoLCBGWF9GTE9BVCBtaXRlcl9saW1pdCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BPYmplY3QtPkdldEJvdW5kaW5nQm94KGxpbmVfd2lkdGgsIG1pdGVyX2xpbWl0KTsKLSAgICB9Ci0KLSAgICB2b2lkCQkJCVRyYW5zZm9ybShjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4KQotICAgIHsKLSAgICAgICAgR2V0TW9kaWZ5KCktPlRyYW5zZm9ybShwTWF0cml4KTsKLSAgICB9Ci0KLSAgICB2b2lkCQkJCUFwcGVuZChDUERGX1BhdGggc3JjLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4KQotICAgIHsKLSAgICAgICAgbV9wT2JqZWN0LT5BcHBlbmQoc3JjLm1fcE9iamVjdCwgcE1hdHJpeCk7Ci0gICAgfQotCi0gICAgdm9pZAkJCQlBcHBlbmRSZWN0KEZYX0ZMT0FUIGxlZnQsIEZYX0ZMT0FUIGJvdHRvbSwgRlhfRkxPQVQgcmlnaHQsIEZYX0ZMT0FUIHRvcCkKLSAgICB7Ci0gICAgICAgIG1fcE9iamVjdC0+QXBwZW5kUmVjdChsZWZ0LCBib3R0b20sIHJpZ2h0LCB0b3ApOwotICAgIH0KLQotICAgIEZYX0JPT0wJCQkJSXNSZWN0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BPYmplY3QtPklzUmVjdCgpOwotICAgIH0KKyAgRlhfQk9PTCBJc1JlY3QoKSBjb25zdCB7IHJldHVybiBtX3BPYmplY3QtPklzUmVjdCgpOyB9CiB9OwotY2xhc3MgQ1BERl9DbGlwUGF0aERhdGEgCi17Ci1wdWJsaWM6CitjbGFzcyBDUERGX0NsaXBQYXRoRGF0YSB7CisgcHVibGljOgorICBDUERGX0NsaXBQYXRoRGF0YSgpOworICBDUERGX0NsaXBQYXRoRGF0YShjb25zdCBDUERGX0NsaXBQYXRoRGF0YSYpOworICB+Q1BERl9DbGlwUGF0aERhdGEoKTsKIAotICAgIENQREZfQ2xpcFBhdGhEYXRhKCk7CisgIHZvaWQgU2V0Q291bnQoaW50IHBhdGhfY291bnQsIGludCB0ZXh0X2NvdW50KTsKIAotICAgIENQREZfQ2xpcFBhdGhEYXRhKGNvbnN0IENQREZfQ2xpcFBhdGhEYXRhJik7CisgcHVibGljOgorICBpbnQgbV9QYXRoQ291bnQ7CiAKLSAgICB+Q1BERl9DbGlwUGF0aERhdGEoKTsKKyAgQ1BERl9QYXRoKiBtX3BQYXRoTGlzdDsKIAotICAgIHZvaWQJCQkJU2V0Q291bnQoaW50IHBhdGhfY291bnQsIGludCB0ZXh0X2NvdW50KTsKLXB1YmxpYzoKKyAgdWludDhfdCogbV9wVHlwZUxpc3Q7CiAKLSAgICBpbnQJCQkJCW1fUGF0aENvdW50OworICBpbnQgbV9UZXh0Q291bnQ7CiAKLSAgICBDUERGX1BhdGgqCQkJbV9wUGF0aExpc3Q7Ci0KLSAgICBGWF9CWVRFKgkJCW1fcFR5cGVMaXN0OwotCi0gICAgaW50CQkJCQltX1RleHRDb3VudDsKLQotICAgIENQREZfVGV4dE9iamVjdCoqCW1fcFRleHRMaXN0OworICBDUERGX1RleHRPYmplY3QqKiBtX3BUZXh0TGlzdDsKIH07Ci1jbGFzcyBDUERGX0NsaXBQYXRoIDogcHVibGljIENGWF9Db3VudFJlZjxDUERGX0NsaXBQYXRoRGF0YT4KLXsKLXB1YmxpYzoKIAotICAgIEZYX0RXT1JECQkJR2V0UGF0aENvdW50KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BPYmplY3QtPm1fUGF0aENvdW50OwotICAgIH0KK2NsYXNzIENQREZfQ2xpcFBhdGggOiBwdWJsaWMgQ0ZYX0NvdW50UmVmPENQREZfQ2xpcFBhdGhEYXRhPiB7CisgcHVibGljOgorICBGWF9EV09SRCBHZXRQYXRoQ291bnQoKSBjb25zdCB7IHJldHVybiBtX3BPYmplY3QtPm1fUGF0aENvdW50OyB9CiAKLSAgICBDUERGX1BhdGgJCQlHZXRQYXRoKGludCBpKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcE9iamVjdC0+bV9wUGF0aExpc3RbaV07Ci0gICAgfQorICBDUERGX1BhdGggR2V0UGF0aChpbnQgaSkgY29uc3QgeyByZXR1cm4gbV9wT2JqZWN0LT5tX3BQYXRoTGlzdFtpXTsgfQogCi0gICAgaW50CQkJCQlHZXRDbGlwVHlwZShpbnQgaSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BPYmplY3QtPm1fcFR5cGVMaXN0W2ldOwotICAgIH0KKyAgaW50IEdldENsaXBUeXBlKGludCBpKSBjb25zdCB7IHJldHVybiBtX3BPYmplY3QtPm1fcFR5cGVMaXN0W2ldOyB9CiAKLSAgICBGWF9EV09SRAkJCUdldFRleHRDb3VudCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wT2JqZWN0LT5tX1RleHRDb3VudDsKLSAgICB9CisgIEZYX0RXT1JEIEdldFRleHRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fcE9iamVjdC0+bV9UZXh0Q291bnQ7IH0KIAotICAgIENQREZfVGV4dE9iamVjdCoJR2V0VGV4dChpbnQgaSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BPYmplY3QtPm1fcFRleHRMaXN0W2ldOwotICAgIH0KKyAgQ1BERl9UZXh0T2JqZWN0KiBHZXRUZXh0KGludCBpKSBjb25zdCB7IHJldHVybiBtX3BPYmplY3QtPm1fcFRleHRMaXN0W2ldOyB9CiAKLSAgICBDRlhfRmxvYXRSZWN0CQlHZXRDbGlwQm94KCkgY29uc3Q7CisgIENGWF9GbG9hdFJlY3QgR2V0Q2xpcEJveCgpIGNvbnN0OwogCi0gICAgdm9pZAkJCQlBcHBlbmRQYXRoKENQREZfUGF0aCBwYXRoLCBpbnQgdHlwZSwgRlhfQk9PTCBiQXV0b01lcmdlKTsKKyAgdm9pZCBBcHBlbmRQYXRoKENQREZfUGF0aCBwYXRoLCBpbnQgdHlwZSwgRlhfQk9PTCBiQXV0b01lcmdlKTsKIAotICAgIHZvaWQJCQkJRGVsZXRlUGF0aChpbnQgbGF5ZXJfaW5kZXgpOworICB2b2lkIERlbGV0ZVBhdGgoaW50IGxheWVyX2luZGV4KTsKIAotICAgIHZvaWQJCQkJQXBwZW5kVGV4dHMoQ1BERl9UZXh0T2JqZWN0KiogcFRleHRzLCBpbnQgY291bnQpOworICB2b2lkIEFwcGVuZFRleHRzKENQREZfVGV4dE9iamVjdCoqIHBUZXh0cywgaW50IGNvdW50KTsKIAotICAgIHZvaWQJCQkJVHJhbnNmb3JtKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCk7CisgIHZvaWQgVHJhbnNmb3JtKGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCk7CiB9OwotY2xhc3MgQ1BERl9Db2xvclN0YXRlRGF0YSAKLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfQ29sb3JTdGF0ZURhdGEgeworIHB1YmxpYzoKKyAgQ1BERl9Db2xvclN0YXRlRGF0YSgpIDogbV9GaWxsUkdCKDApLCBtX1N0cm9rZVJHQigwKSB7fQogCi0gICAgQ1BERl9Db2xvclN0YXRlRGF0YSgpOiBtX0ZpbGxSR0IoMCksIG1fU3Ryb2tlUkdCKDApIHt9CisgIENQREZfQ29sb3JTdGF0ZURhdGEoY29uc3QgQ1BERl9Db2xvclN0YXRlRGF0YSYgc3JjKTsKIAotICAgIENQREZfQ29sb3JTdGF0ZURhdGEoY29uc3QgQ1BERl9Db2xvclN0YXRlRGF0YSYgc3JjKTsKKyAgdm9pZCBEZWZhdWx0KCk7CiAKLSAgICB2b2lkCQkJCURlZmF1bHQoKTsKKyAgQ1BERl9Db2xvciBtX0ZpbGxDb2xvcjsKIAotICAgIENQREZfQ29sb3IJCQltX0ZpbGxDb2xvcjsKKyAgRlhfRFdPUkQgbV9GaWxsUkdCOwogCi0gICAgRlhfRFdPUkQJCQltX0ZpbGxSR0I7CisgIENQREZfQ29sb3IgbV9TdHJva2VDb2xvcjsKIAotICAgIENQREZfQ29sb3IJCQltX1N0cm9rZUNvbG9yOwotCi0gICAgRlhfRFdPUkQJCQltX1N0cm9rZVJHQjsKKyAgRlhfRFdPUkQgbV9TdHJva2VSR0I7CiB9OwotY2xhc3MgQ1BERl9Db2xvclN0YXRlIDogcHVibGljIENGWF9Db3VudFJlZjxDUERGX0NvbG9yU3RhdGVEYXRhPgotewotcHVibGljOgorY2xhc3MgQ1BERl9Db2xvclN0YXRlIDogcHVibGljIENGWF9Db3VudFJlZjxDUERGX0NvbG9yU3RhdGVEYXRhPiB7CisgcHVibGljOgorICBDUERGX0NvbG9yKiBHZXRGaWxsQ29sb3IoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fcE9iamVjdCA/ICZtX3BPYmplY3QtPm1fRmlsbENvbG9yIDogTlVMTDsKKyAgfQogCi0gICAgQ1BERl9Db2xvcioJCQlHZXRGaWxsQ29sb3IoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcE9iamVjdCA/ICZtX3BPYmplY3QtPm1fRmlsbENvbG9yIDogTlVMTDsKLSAgICB9CisgIENQREZfQ29sb3IqIEdldFN0cm9rZUNvbG9yKCkgY29uc3QgeworICAgIHJldHVybiBtX3BPYmplY3QgPyAmbV9wT2JqZWN0LT5tX1N0cm9rZUNvbG9yIDogTlVMTDsKKyAgfQogCi0gICAgQ1BERl9Db2xvcioJCQlHZXRTdHJva2VDb2xvcigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wT2JqZWN0ID8gJm1fcE9iamVjdC0+bV9TdHJva2VDb2xvciA6IE5VTEw7Ci0gICAgfQorICB2b2lkIFNldEZpbGxDb2xvcihDUERGX0NvbG9yU3BhY2UqIHBDUywgRlhfRkxPQVQqIHBWYWx1ZSwgaW50IG5WYWx1ZXMpOwogCi0gICAgdm9pZAkJCQlTZXRGaWxsQ29sb3IoQ1BERl9Db2xvclNwYWNlKiBwQ1MsIEZYX0ZMT0FUKiBwVmFsdWUsIGludCBuVmFsdWVzKTsKKyAgdm9pZCBTZXRTdHJva2VDb2xvcihDUERGX0NvbG9yU3BhY2UqIHBDUywgRlhfRkxPQVQqIHBWYWx1ZSwgaW50IG5WYWx1ZXMpOwogCi0gICAgdm9pZAkJCQlTZXRTdHJva2VDb2xvcihDUERGX0NvbG9yU3BhY2UqIHBDUywgRlhfRkxPQVQqIHBWYWx1ZSwgaW50IG5WYWx1ZXMpOworICB2b2lkIFNldEZpbGxQYXR0ZXJuKENQREZfUGF0dGVybiogcGF0dGVybiwgRlhfRkxPQVQqIHBWYWx1ZSwgaW50IG5WYWx1ZXMpOwogCi0gICAgdm9pZAkJCQlTZXRGaWxsUGF0dGVybihDUERGX1BhdHRlcm4qIHBhdHRlcm4sIEZYX0ZMT0FUKiBwVmFsdWUsIGludCBuVmFsdWVzKTsKKyAgdm9pZCBTZXRTdHJva2VQYXR0ZXJuKENQREZfUGF0dGVybiogcGF0dGVybiwgRlhfRkxPQVQqIHBWYWx1ZSwgaW50IG5WYWx1ZXMpOwogCi0gICAgdm9pZAkJCQlTZXRTdHJva2VQYXR0ZXJuKENQREZfUGF0dGVybiogcGF0dGVybiwgRlhfRkxPQVQqIHBWYWx1ZSwgaW50IG5WYWx1ZXMpOwotcHJpdmF0ZToKLSAgICB2b2lkCQkJCVNldENvbG9yKENQREZfQ29sb3ImIGNvbG9yLCBGWF9EV09SRCYgcmdiLCBDUERGX0NvbG9yU3BhY2UqIHBDUywgRlhfRkxPQVQqIHBWYWx1ZSwgaW50IG5WYWx1ZXMpOworIHByaXZhdGU6CisgIHZvaWQgU2V0Q29sb3IoQ1BERl9Db2xvciYgY29sb3IsCisgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHJnYiwKKyAgICAgICAgICAgICAgICBDUERGX0NvbG9yU3BhY2UqIHBDUywKKyAgICAgICAgICAgICAgICBGWF9GTE9BVCogcFZhbHVlLAorICAgICAgICAgICAgICAgIGludCBuVmFsdWVzKTsKIH07CiB0eXBlZGVmIENGWF9HcmFwaFN0YXRlRGF0YSBDUERGX0dyYXBoU3RhdGVEYXRhOwotY2xhc3MgQ1BERl9HcmFwaFN0YXRlIDogcHVibGljIENGWF9Db3VudFJlZjxDRlhfR3JhcGhTdGF0ZURhdGE+Ci17Ci1wdWJsaWM6CitjbGFzcyBDUERGX0dyYXBoU3RhdGUgOiBwdWJsaWMgQ0ZYX0NvdW50UmVmPENGWF9HcmFwaFN0YXRlRGF0YT4geworIHB1YmxpYzoKIH07Ci1jbGFzcyBDUERGX1RleHRTdGF0ZURhdGEgCi17Ci1wdWJsaWM6CitjbGFzcyBDUERGX1RleHRTdGF0ZURhdGEgeworIHB1YmxpYzoKKyAgQ1BERl9UZXh0U3RhdGVEYXRhKCk7CiAKLSAgICBDUERGX1RleHRTdGF0ZURhdGEoKTsKKyAgQ1BERl9UZXh0U3RhdGVEYXRhKGNvbnN0IENQREZfVGV4dFN0YXRlRGF0YSYgc3JjKTsKIAotICAgIENQREZfVGV4dFN0YXRlRGF0YShjb25zdCBDUERGX1RleHRTdGF0ZURhdGEmIHNyYyk7CisgIH5DUERGX1RleHRTdGF0ZURhdGEoKTsKIAotICAgIH5DUERGX1RleHRTdGF0ZURhdGEoKTsKKyAgQ1BERl9Gb250KiBtX3BGb250OwogCi0gICAgQ1BERl9Gb250KgkJCW1fcEZvbnQ7CisgIENQREZfRG9jdW1lbnQqIG1fcERvY3VtZW50OwogCi0gICAgQ1BERl9Eb2N1bWVudCoJCW1fcERvY3VtZW50OworICBGWF9GTE9BVCBtX0ZvbnRTaXplOwogCi0gICAgRlhfRkxPQVQJCQltX0ZvbnRTaXplOworICBGWF9GTE9BVCBtX0NoYXJTcGFjZTsKIAotICAgIEZYX0ZMT0FUCQkJbV9DaGFyU3BhY2U7CisgIEZYX0ZMT0FUIG1fV29yZFNwYWNlOwogCi0gICAgRlhfRkxPQVQJCQltX1dvcmRTcGFjZTsKKyAgRlhfRkxPQVQgbV9NYXRyaXhbNF07CiAKLSAgICBGWF9GTE9BVAkJbV9NYXRyaXhbNF07CisgIGludCBtX1RleHRNb2RlOwogCi0gICAgaW50CQkJCQltX1RleHRNb2RlOwotCi0gICAgRlhfRkxPQVQJCW1fQ1RNWzRdOworICBGWF9GTE9BVCBtX0NUTVs0XTsKIH07Ci1jbGFzcyBDUERGX1RleHRTdGF0ZSA6IHB1YmxpYyBDRlhfQ291bnRSZWY8Q1BERl9UZXh0U3RhdGVEYXRhPgotewotcHVibGljOgorY2xhc3MgQ1BERl9UZXh0U3RhdGUgOiBwdWJsaWMgQ0ZYX0NvdW50UmVmPENQREZfVGV4dFN0YXRlRGF0YT4geworIHB1YmxpYzoKKyAgQ1BERl9Gb250KiBHZXRGb250KCkgY29uc3QgeyByZXR1cm4gbV9wT2JqZWN0LT5tX3BGb250OyB9CiAKLSAgICBDUERGX0ZvbnQqCQkJR2V0Rm9udCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wT2JqZWN0LT5tX3BGb250OwotICAgIH0KKyAgdm9pZCBTZXRGb250KENQREZfRm9udCogcEZvbnQpOwogCi0gICAgdm9pZAkJCQlTZXRGb250KENQREZfRm9udCogcEZvbnQpOworICBGWF9GTE9BVCBHZXRGb250U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcE9iamVjdC0+bV9Gb250U2l6ZTsgfQogCi0gICAgRlhfRkxPQVQJCQlHZXRGb250U2l6ZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wT2JqZWN0LT5tX0ZvbnRTaXplOwotICAgIH0KKyAgRlhfRkxPQVQqIEdldE1hdHJpeCgpIGNvbnN0IHsgcmV0dXJuIG1fcE9iamVjdC0+bV9NYXRyaXg7IH0KIAotICAgIEZYX0ZMT0FUKgkJCUdldE1hdHJpeCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wT2JqZWN0LT5tX01hdHJpeDsKLSAgICB9CisgIEZYX0ZMT0FUIEdldEZvbnRTaXplVigpIGNvbnN0OwogCisgIEZYX0ZMT0FUIEdldEZvbnRTaXplSCgpIGNvbnN0OwogCisgIEZYX0ZMT0FUIEdldEJhc2VsaW5lQW5nbGUoKSBjb25zdDsKIAotICAgIEZYX0ZMT0FUCQkJR2V0Rm9udFNpemVWKCkgY29uc3Q7Ci0KLSAgICBGWF9GTE9BVAkJCUdldEZvbnRTaXplSCgpIGNvbnN0OwotCi0gICAgRlhfRkxPQVQJCQlHZXRCYXNlbGluZUFuZ2xlKCkgY29uc3Q7Ci0KLSAgICBGWF9GTE9BVAkJCUdldFNoZWFyQW5nbGUoKSBjb25zdDsKLQorICBGWF9GTE9BVCBHZXRTaGVhckFuZ2xlKCkgY29uc3Q7CiB9OwotY2xhc3MgQ1BERl9UcmFuc2ZlckZ1bmM7Ci1jbGFzcyBDUERGX0dlbmVyYWxTdGF0ZURhdGEgCi17Ci1wdWJsaWM6CiAKLSAgICBDUERGX0dlbmVyYWxTdGF0ZURhdGEoKTsKK2NsYXNzIENQREZfR2VuZXJhbFN0YXRlRGF0YSB7CisgcHVibGljOgorICBDUERGX0dlbmVyYWxTdGF0ZURhdGEoKTsKIAotICAgIENQREZfR2VuZXJhbFN0YXRlRGF0YShjb25zdCBDUERGX0dlbmVyYWxTdGF0ZURhdGEmIHNyYyk7Ci0gICAgfkNQREZfR2VuZXJhbFN0YXRlRGF0YSgpOworICBDUERGX0dlbmVyYWxTdGF0ZURhdGEoY29uc3QgQ1BERl9HZW5lcmFsU3RhdGVEYXRhJiBzcmMpOworICB+Q1BERl9HZW5lcmFsU3RhdGVEYXRhKCk7CiAKLSAgICB2b2lkCQkJCVNldEJsZW5kTW9kZShGWF9CU1RSIGJsZW5kX21vZGUpOworICB2b2lkIFNldEJsZW5kTW9kZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJsZW5kX21vZGUpOwogCi0gICAgY2hhcgkJCQltX0JsZW5kTW9kZVsxNl07CisgIGNoYXIgbV9CbGVuZE1vZGVbMTZdOwogCi0gICAgaW50CQkJCQltX0JsZW5kVHlwZTsKKyAgaW50IG1fQmxlbmRUeXBlOwogCi0gICAgQ1BERl9PYmplY3QqCQltX3BTb2Z0TWFzazsKKyAgQ1BERl9PYmplY3QqIG1fcFNvZnRNYXNrOwogCi0gICAgRlhfRkxPQVQJCQltX1NNYXNrTWF0cml4WzZdOworICBGWF9GTE9BVCBtX1NNYXNrTWF0cml4WzZdOwogCi0gICAgRlhfRkxPQVQJCQltX1N0cm9rZUFscGhhOworICBGWF9GTE9BVCBtX1N0cm9rZUFscGhhOwogCi0gICAgRlhfRkxPQVQJCQltX0ZpbGxBbHBoYTsKKyAgRlhfRkxPQVQgbV9GaWxsQWxwaGE7CiAKLSAgICBDUERGX09iamVjdCoJCW1fcFRSOworICBDUERGX09iamVjdCogbV9wVFI7CiAKLSAgICBDUERGX1RyYW5zZmVyRnVuYyoJbV9wVHJhbnNmZXJGdW5jOworICBDUERGX1RyYW5zZmVyRnVuYyogbV9wVHJhbnNmZXJGdW5jOwogCi0gICAgQ0ZYX01hdHJpeAkJCW1fTWF0cml4OworICBDRlhfTWF0cml4IG1fTWF0cml4OwogCi0gICAgaW50CQkJCQltX1JlbmRlckludGVudDsKKyAgaW50IG1fUmVuZGVySW50ZW50OwogCi0gICAgRlhfQk9PTAkJCQltX1N0cm9rZUFkanVzdDsKKyAgRlhfQk9PTCBtX1N0cm9rZUFkanVzdDsKIAotICAgIEZYX0JPT0wJCQkJbV9BbHBoYVNvdXJjZTsKKyAgRlhfQk9PTCBtX0FscGhhU291cmNlOwogCi0gICAgRlhfQk9PTAkJCQltX1RleHRLbm9ja291dDsKKyAgRlhfQk9PTCBtX1RleHRLbm9ja291dDsKIAotICAgIEZYX0JPT0wJCQkJbV9TdHJva2VPUDsKKyAgRlhfQk9PTCBtX1N0cm9rZU9QOwogCi0gICAgRlhfQk9PTAkJCQltX0ZpbGxPUDsKKyAgRlhfQk9PTCBtX0ZpbGxPUDsKIAotICAgIGludAkJCQkJbV9PUE1vZGU7CisgIGludCBtX09QTW9kZTsKIAotICAgIENQREZfT2JqZWN0KgkJbV9wQkc7CisgIENQREZfT2JqZWN0KiBtX3BCRzsKIAotICAgIENQREZfT2JqZWN0KgkJbV9wVUNSOworICBDUERGX09iamVjdCogbV9wVUNSOwogCi0gICAgQ1BERl9PYmplY3QqCQltX3BIVDsKKyAgQ1BERl9PYmplY3QqIG1fcEhUOwogCi0gICAgRlhfRkxPQVQJCQltX0ZsYXRuZXNzOworICBGWF9GTE9BVCBtX0ZsYXRuZXNzOwogCi0gICAgRlhfRkxPQVQJCQltX1Ntb290aG5lc3M7CisgIEZYX0ZMT0FUIG1fU21vb3RobmVzczsKIH07Ci1jbGFzcyBDUERGX0dlbmVyYWxTdGF0ZSA6IHB1YmxpYyBDRlhfQ291bnRSZWY8Q1BERl9HZW5lcmFsU3RhdGVEYXRhPgotewotcHVibGljOgorY2xhc3MgQ1BERl9HZW5lcmFsU3RhdGUgOiBwdWJsaWMgQ0ZYX0NvdW50UmVmPENQREZfR2VuZXJhbFN0YXRlRGF0YT4geworIHB1YmxpYzoKKyAgdm9pZCBTZXRSZW5kZXJJbnRlbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHJpKTsKIAotICAgIHZvaWQJCQkJU2V0UmVuZGVySW50ZW50KGNvbnN0IENGWF9CeXRlU3RyaW5nJiByaSk7CisgIGludCBHZXRCbGVuZFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fcE9iamVjdCA/IG1fcE9iamVjdC0+bV9CbGVuZFR5cGUgOiBGWERJQl9CTEVORF9OT1JNQUw7CisgIH0KIAotICAgIGludAkJCQkJR2V0QmxlbmRUeXBlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BPYmplY3QgPyBtX3BPYmplY3QtPm1fQmxlbmRUeXBlIDogRlhESUJfQkxFTkRfTk9STUFMOwotICAgIH0KLQotICAgIGludAkJCQkJR2V0QWxwaGEoRlhfQk9PTCBiU3Ryb2tlKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcE9iamVjdCA/IEZYU1lTX3JvdW5kKChiU3Ryb2tlID8gbV9wT2JqZWN0LT5tX1N0cm9rZUFscGhhIDogbV9wT2JqZWN0LT5tX0ZpbGxBbHBoYSkgKiAyNTUpIDogMjU1OwotICAgIH0KKyAgaW50IEdldEFscGhhKEZYX0JPT0wgYlN0cm9rZSkgY29uc3QgeworICAgIHJldHVybiBtX3BPYmplY3QgPyBGWFNZU19yb3VuZCgoYlN0cm9rZSA/IG1fcE9iamVjdC0+bV9TdHJva2VBbHBoYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1fcE9iamVjdC0+bV9GaWxsQWxwaGEpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1KQorICAgICAgICAgICAgICAgICAgICAgOiAyNTU7CisgIH0KIH07Ci1jbGFzcyBDUERGX0NvbnRlbnRNYXJrSXRlbSAKLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfQ29udGVudE1hcmtJdGVtIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgZW51bSB7IE5vbmUsIFByb3BlcnRpZXNEaWN0LCBEaXJlY3REaWN0LCBNQ0lEIH0gUGFyYW1UeXBlOwogCi0gICAgdHlwZWRlZiBlbnVtIHsKLSAgICAgICAgTm9uZSwKLSAgICAgICAgUHJvcGVydGllc0RpY3QsCi0gICAgICAgIERpcmVjdERpY3QsCi0gICAgICAgIE1DSUQKLSAgICB9IFBhcmFtVHlwZTsKKyAgQ1BERl9Db250ZW50TWFya0l0ZW0oKTsKIAotICAgIENQREZfQ29udGVudE1hcmtJdGVtKCk7CisgIENQREZfQ29udGVudE1hcmtJdGVtKGNvbnN0IENQREZfQ29udGVudE1hcmtJdGVtJiBzcmMpOwogCi0gICAgQ1BERl9Db250ZW50TWFya0l0ZW0oY29uc3QgQ1BERl9Db250ZW50TWFya0l0ZW0mIHNyYyk7CisgIH5DUERGX0NvbnRlbnRNYXJrSXRlbSgpOwogCi0gICAgfkNQREZfQ29udGVudE1hcmtJdGVtKCk7CisgIGlubGluZSBjb25zdCBDRlhfQnl0ZVN0cmluZyYgR2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fTWFya05hbWU7IH0KIAotICAgIGlubGluZSBjb25zdCBDRlhfQnl0ZVN0cmluZyYJR2V0TmFtZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9NYXJrTmFtZTsKLSAgICB9CisgIGlubGluZSBQYXJhbVR5cGUgR2V0UGFyYW1UeXBlKCkgY29uc3QgeyByZXR1cm4gbV9QYXJhbVR5cGU7IH0KIAotICAgIGlubGluZSBQYXJhbVR5cGUJR2V0UGFyYW1UeXBlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1BhcmFtVHlwZTsKLSAgICB9CisgIGlubGluZSB2b2lkKiBHZXRQYXJhbSgpIGNvbnN0IHsgcmV0dXJuIG1fcFBhcmFtOyB9CiAKLSAgICBpbmxpbmUgdm9pZCoJCUdldFBhcmFtKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BQYXJhbTsKLSAgICB9CisgIGlubGluZSBGWF9CT09MIEhhc01DSUQoKSBjb25zdDsKIAotICAgIGlubGluZSBGWF9CT09MCQlIYXNNQ0lEKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIFNldE5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpIHsgbV9NYXJrTmFtZSA9IG5hbWU7IH0KIAotICAgIGlubGluZSB2b2lkCQkJU2V0TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkKLSAgICB7Ci0gICAgICAgIG1fTWFya05hbWUgPSBuYW1lOwotICAgIH0KKyAgaW5saW5lIHZvaWQgU2V0UGFyYW0oUGFyYW1UeXBlIHR5cGUsIHZvaWQqIHBhcmFtKSB7CisgICAgbV9QYXJhbVR5cGUgPSB0eXBlOworICAgIG1fcFBhcmFtID0gcGFyYW07CisgIH0KIAotICAgIGlubGluZSB2b2lkCQkJU2V0UGFyYW0oUGFyYW1UeXBlIHR5cGUsIHZvaWQqIHBhcmFtKQotICAgIHsKLSAgICAgICAgbV9QYXJhbVR5cGUgPSB0eXBlOwotICAgICAgICBtX3BQYXJhbSA9IHBhcmFtOwotICAgIH0KLXByaXZhdGU6CisgcHJpdmF0ZToKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9NYXJrTmFtZTsKIAotICAgIENGWF9CeXRlU3RyaW5nCQltX01hcmtOYW1lOworICBQYXJhbVR5cGUgbV9QYXJhbVR5cGU7CiAKLSAgICBQYXJhbVR5cGUJCQltX1BhcmFtVHlwZTsKLQotICAgIHZvaWQqCQkJCW1fcFBhcmFtOworICB2b2lkKiBtX3BQYXJhbTsKIH07Ci1jbGFzcyBDUERGX0NvbnRlbnRNYXJrRGF0YSAKLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfQ29udGVudE1hcmtEYXRhIHsKKyBwdWJsaWM6CisgIENQREZfQ29udGVudE1hcmtEYXRhKCkge30KIAotICAgIENQREZfQ29udGVudE1hcmtEYXRhKCkgeyB9CisgIENQREZfQ29udGVudE1hcmtEYXRhKGNvbnN0IENQREZfQ29udGVudE1hcmtEYXRhJiBzcmMpOwogCi0gICAgQ1BERl9Db250ZW50TWFya0RhdGEoY29uc3QgQ1BERl9Db250ZW50TWFya0RhdGEmIHNyYyk7CisgIGlubGluZSBpbnQgQ291bnRJdGVtcygpIGNvbnN0IHsgcmV0dXJuIG1fTWFya3MuR2V0U2l6ZSgpOyB9CiAKLSAgICBpbmxpbmUgaW50CQkJQ291bnRJdGVtcygpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9NYXJrcy5HZXRTaXplKCk7Ci0gICAgfQorICBpbmxpbmUgQ1BERl9Db250ZW50TWFya0l0ZW0mIEdldEl0ZW0oaW50IGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1fTWFya3NbaW5kZXhdOworICB9CiAKLSAgICBpbmxpbmUgQ1BERl9Db250ZW50TWFya0l0ZW0mCUdldEl0ZW0oaW50IGluZGV4KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fTWFya3NbaW5kZXhdOwotICAgIH0KKyAgaW50IEdldE1DSUQoKSBjb25zdDsKIAotICAgIGludAkJCQkJR2V0TUNJRCgpIGNvbnN0OworICB2b2lkIEFkZE1hcmsoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAorICAgICAgICAgICAgICAgRlhfQk9PTCBiRGljdE5lZWRDbG9uZSk7CiAKLSAgICB2b2lkCQkJCUFkZE1hcmsoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsIENQREZfRGljdGlvbmFyeSogcERpY3QsIEZYX0JPT0wgYkRpY3ROZWVkQ2xvbmUpOworICB2b2lkIERlbGV0ZUxhc3RNYXJrKCk7CiAKLSAgICB2b2lkCQkJCURlbGV0ZUxhc3RNYXJrKCk7Ci1wcml2YXRlOgotCi0gICAgQ0ZYX09iamVjdEFycmF5PENQREZfQ29udGVudE1hcmtJdGVtPgltX01hcmtzOworIHByaXZhdGU6CisgIENGWF9PYmplY3RBcnJheTxDUERGX0NvbnRlbnRNYXJrSXRlbT4gbV9NYXJrczsKIH07Ci1jbGFzcyBDUERGX0NvbnRlbnRNYXJrIDogcHVibGljIENGWF9Db3VudFJlZjxDUERGX0NvbnRlbnRNYXJrRGF0YT4KLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfQ29udGVudE1hcmsgOiBwdWJsaWMgQ0ZYX0NvdW50UmVmPENQREZfQ29udGVudE1hcmtEYXRhPiB7CisgcHVibGljOgorICBpbnQgR2V0TUNJRCgpIGNvbnN0IHsgcmV0dXJuIG1fcE9iamVjdCA/IG1fcE9iamVjdC0+R2V0TUNJRCgpIDogLTE7IH0KIAotICAgIGludAkJCQkJR2V0TUNJRCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wT2JqZWN0ID8gbV9wT2JqZWN0LT5HZXRNQ0lEKCkgOiAtMTsKLSAgICB9CisgIEZYX0JPT0wgSGFzTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG1hcmspIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCQlIYXNNYXJrKEZYX0JTVFIgbWFyaykgY29uc3Q7Ci0KLSAgICBGWF9CT09MCQkJCUxvb2t1cE1hcmsoRlhfQlNUUiBtYXJrLCBDUERGX0RpY3Rpb25hcnkqJiBwRGljdCkgY29uc3Q7CisgIEZYX0JPT0wgTG9va3VwTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG1hcmssCisgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqJiBwRGljdCkgY29uc3Q7CiB9OwotI2RlZmluZSBQREZQQUdFX1RFWFQJCTEKLSNkZWZpbmUgUERGUEFHRV9QQVRICQkyCi0jZGVmaW5lIFBERlBBR0VfSU1BR0UJCTMKLSNkZWZpbmUgUERGUEFHRV9TSEFESU5HCQk0Ci0jZGVmaW5lIFBERlBBR0VfRk9STQkJNQotI2RlZmluZSBQREZQQUdFX0lOTElORVMJCTYKLWNsYXNzIENQREZfR3JhcGhpY1N0YXRlcyAKLXsKLXB1YmxpYzoKIAotICAgIHZvaWQJCQkJQ29weVN0YXRlcyhjb25zdCBDUERGX0dyYXBoaWNTdGF0ZXMmIHNyYyk7CisjZGVmaW5lIFBERlBBR0VfVEVYVCAxCisjZGVmaW5lIFBERlBBR0VfUEFUSCAyCisjZGVmaW5lIFBERlBBR0VfSU1BR0UgMworI2RlZmluZSBQREZQQUdFX1NIQURJTkcgNAorI2RlZmluZSBQREZQQUdFX0ZPUk0gNQogCi0gICAgdm9pZAkJCQlEZWZhdWx0U3RhdGVzKCk7CitjbGFzcyBDUERGX0dyYXBoaWNTdGF0ZXMgeworIHB1YmxpYzoKKyAgdm9pZCBDb3B5U3RhdGVzKGNvbnN0IENQREZfR3JhcGhpY1N0YXRlcyYgc3JjKTsKIAotICAgIENQREZfQ2xpcFBhdGgJCW1fQ2xpcFBhdGg7CisgIHZvaWQgRGVmYXVsdFN0YXRlcygpOwogCi0gICAgQ1BERl9HcmFwaFN0YXRlCQltX0dyYXBoU3RhdGU7CisgIENQREZfQ2xpcFBhdGggbV9DbGlwUGF0aDsKIAotICAgIENQREZfQ29sb3JTdGF0ZQkJbV9Db2xvclN0YXRlOworICBDUERGX0dyYXBoU3RhdGUgbV9HcmFwaFN0YXRlOwogCi0gICAgQ1BERl9UZXh0U3RhdGUJCW1fVGV4dFN0YXRlOworICBDUERGX0NvbG9yU3RhdGUgbV9Db2xvclN0YXRlOwogCi0gICAgQ1BERl9HZW5lcmFsU3RhdGUJbV9HZW5lcmFsU3RhdGU7CisgIENQREZfVGV4dFN0YXRlIG1fVGV4dFN0YXRlOworCisgIENQREZfR2VuZXJhbFN0YXRlIG1fR2VuZXJhbFN0YXRlOwogfTsKLWNsYXNzIENQREZfUGFnZU9iamVjdCA6IHB1YmxpYyBDUERGX0dyYXBoaWNTdGF0ZXMKLXsKLXB1YmxpYzoKLSAgICBzdGF0aWMgQ1BERl9QYWdlT2JqZWN0KiBDcmVhdGUoaW50IHR5cGUpOwotICAgIHZpcnR1YWwgfkNQREZfUGFnZU9iamVjdCgpOwogCi0gICAgQ1BERl9QYWdlT2JqZWN0KglDbG9uZSgpIGNvbnN0OworY2xhc3MgQ1BERl9QYWdlT2JqZWN0IDogcHVibGljIENQREZfR3JhcGhpY1N0YXRlcyB7CisgcHVibGljOgorICBzdGF0aWMgQ1BERl9QYWdlT2JqZWN0KiBDcmVhdGUoaW50IHR5cGUpOworICB2aXJ0dWFsIH5DUERGX1BhZ2VPYmplY3QoKTsKIAotICAgIHZvaWQJCQkJQ29weShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTcmNPYmplY3QpOworICBDUERGX1BhZ2VPYmplY3QqIENsb25lKCkgY29uc3Q7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCVRyYW5zZm9ybShjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgpID0gMDsKKyAgdm9pZCBDb3B5KGNvbnN0IENQREZfUGFnZU9iamVjdCogcFNyY09iamVjdCk7CiAKKyAgdmlydHVhbCB2b2lkIFRyYW5zZm9ybShjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpID0gMDsKIAorICB2b2lkIFJlbW92ZUNsaXBQYXRoKCk7CiAKLSAgICB2b2lkCQkJCVJlbW92ZUNsaXBQYXRoKCk7CisgIHZvaWQgQXBwZW5kQ2xpcFBhdGgoQ1BERl9QYXRoIHBhdGgsIGludCB0eXBlLCBGWF9CT09MIGJBdXRvTWVyZ2UpOwogCi0gICAgdm9pZAkJCQlBcHBlbmRDbGlwUGF0aChDUERGX1BhdGggcGF0aCwgaW50IHR5cGUsIEZYX0JPT0wgYkF1dG9NZXJnZSk7CisgIHZvaWQgQ29weUNsaXBQYXRoKENQREZfUGFnZU9iamVjdCogcE9iaik7CiAKLSAgICB2b2lkCQkJCUNvcHlDbGlwUGF0aChDUERGX1BhZ2VPYmplY3QqIHBPYmopOworICB2b2lkIFRyYW5zZm9ybUNsaXBQYXRoKENGWF9NYXRyaXgmIG1hdHJpeCk7CiAKLSAgICB2b2lkCQkJCVRyYW5zZm9ybUNsaXBQYXRoKENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCk7CisgIHZvaWQgVHJhbnNmb3JtR2VuZXJhbFN0YXRlKENGWF9NYXRyaXgmIG1hdHJpeCk7CiAKLSAgICB2b2lkCQkJCVRyYW5zZm9ybUdlbmVyYWxTdGF0ZShDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgpOworICB2b2lkIFNldENvbG9yU3RhdGUoQ1BERl9Db2xvclN0YXRlIHN0YXRlKSB7IG1fQ29sb3JTdGF0ZSA9IHN0YXRlOyB9CiAKKyAgRlhfUkVDVCBHZXRCQm94KGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIGNvbnN0OwogCi0gICAgdm9pZAkJCQlTZXRDb2xvclN0YXRlKENQREZfQ29sb3JTdGF0ZSBzdGF0ZSkKLSAgICB7Ci0gICAgICAgIG1fQ29sb3JTdGF0ZSA9IHN0YXRlOwotICAgIH0KKyAgaW50IG1fVHlwZTsKIAotICAgIEZYX1JFQ1QJCQkJR2V0QkJveChjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4KSBjb25zdDsKKyAgRlhfRkxPQVQgbV9MZWZ0OwogCi0gICAgaW50CQkJCQltX1R5cGU7CisgIEZYX0ZMT0FUIG1fUmlnaHQ7CiAKLSAgICBGWF9GTE9BVAkJCW1fTGVmdDsKKyAgRlhfRkxPQVQgbV9Ub3A7CiAKLSAgICBGWF9GTE9BVAkJCW1fUmlnaHQ7CisgIEZYX0ZMT0FUIG1fQm90dG9tOwogCi0gICAgRlhfRkxPQVQJCQltX1RvcDsKKyAgQ1BERl9Db250ZW50TWFyayBtX0NvbnRlbnRNYXJrOwogCi0gICAgRlhfRkxPQVQJCQltX0JvdHRvbTsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBDb3B5RGF0YShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTcmNPYmplY3QpID0gMDsKIAotICAgIENQREZfQ29udGVudE1hcmsJbV9Db250ZW50TWFyazsKLXByb3RlY3RlZDoKKyAgdm9pZCBSZWNhbGNCQm94KCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCUNvcHlEYXRhKGNvbnN0IENQREZfUGFnZU9iamVjdCogcFNyY09iamVjdCkge30KLQotICAgIHZvaWQJCQkJUmVjYWxjQkJveCgpOwotCi0gICAgQ1BERl9QYWdlT2JqZWN0KCkge30KLQorICBDUERGX1BhZ2VPYmplY3QoKSB7fQogfTsKLXN0cnVjdCBDUERGX1RleHRPYmplY3RJdGVtICB7CiAKLSAgICBGWF9EV09SRAkJCW1fQ2hhckNvZGU7Ci0KLSAgICBGWF9GTE9BVAkJCW1fT3JpZ2luWDsKLQotICAgIEZYX0ZMT0FUCQkJbV9PcmlnaW5ZOworc3RydWN0IENQREZfVGV4dE9iamVjdEl0ZW0geworICBGWF9EV09SRCBtX0NoYXJDb2RlOworICBGWF9GTE9BVCBtX09yaWdpblg7CisgIEZYX0ZMT0FUIG1fT3JpZ2luWTsKIH07Ci1jbGFzcyBDUERGX1RleHRPYmplY3QgOiBwdWJsaWMgQ1BERl9QYWdlT2JqZWN0Ci17Ci1wdWJsaWM6CiAKLSAgICBDUERGX1RleHRPYmplY3QoKTsKK2NsYXNzIENQREZfVGV4dE9iamVjdCA6IHB1YmxpYyBDUERGX1BhZ2VPYmplY3QgeworIHB1YmxpYzoKKyAgQ1BERl9UZXh0T2JqZWN0KCk7CisgIH5DUERGX1RleHRPYmplY3QoKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgfkNQREZfVGV4dE9iamVjdCgpOworICBpbnQgQ291bnRJdGVtcygpIGNvbnN0IHsgcmV0dXJuIG1fbkNoYXJzOyB9CiAKLSAgICBpbnQJCQkJCUNvdW50SXRlbXMoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbkNoYXJzOwotICAgIH0KKyAgdm9pZCBHZXRJdGVtSW5mbyhpbnQgaW5kZXgsIENQREZfVGV4dE9iamVjdEl0ZW0qIHBJbmZvKSBjb25zdDsKIAotICAgIHZvaWQJCQkJR2V0SXRlbUluZm8oaW50IGluZGV4LCBDUERGX1RleHRPYmplY3RJdGVtKiBwSW5mbykgY29uc3Q7CisgIGludCBDb3VudENoYXJzKCkgY29uc3Q7CiAKLSAgICBpbnQJCQkJCUNvdW50Q2hhcnMoKSBjb25zdDsKKyAgdm9pZCBHZXRDaGFySW5mbyhpbnQgaW5kZXgsIEZYX0RXT1JEJiBjaGFyY29kZSwgRlhfRkxPQVQmIGtlcm5pbmcpIGNvbnN0OworICB2b2lkIEdldENoYXJJbmZvKGludCBpbmRleCwgQ1BERl9UZXh0T2JqZWN0SXRlbSogcEluZm8pIGNvbnN0OwogCi0gICAgdm9pZAkJCQlHZXRDaGFySW5mbyhpbnQgaW5kZXgsIEZYX0RXT1JEJiBjaGFyY29kZSwgRlhfRkxPQVQmIGtlcm5pbmcpIGNvbnN0OwotICAgIHZvaWQJCQkJR2V0Q2hhckluZm8oaW50IGluZGV4LCBDUERGX1RleHRPYmplY3RJdGVtKiBwSW5mbykgY29uc3Q7CisgIHZvaWQgR2V0Q2hhclJlY3QoaW50IGluZGV4LCBDRlhfRmxvYXRSZWN0JiByZWN0KSBjb25zdDsKIAotICAgIHZvaWQJCQkJR2V0Q2hhclJlY3QoaW50IGluZGV4LCBDRlhfRmxvYXRSZWN0JiByZWN0KSBjb25zdDsKKyAgRlhfRkxPQVQgR2V0Q2hhcldpZHRoKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdDsKKyAgRlhfRkxPQVQgR2V0U3BhY2VDaGFyV2lkdGgoKSBjb25zdDsKIAorICBGWF9GTE9BVCBHZXRQb3NYKCkgY29uc3QgeyByZXR1cm4gbV9Qb3NYOyB9CiAKLSAgICBGWF9GTE9BVAkJCUdldENoYXJXaWR0aChGWF9EV09SRCBjaGFyY29kZSkgY29uc3Q7Ci0gICAgRlhfRkxPQVQJCQlHZXRTcGFjZUNoYXJXaWR0aCgpIGNvbnN0OworICBGWF9GTE9BVCBHZXRQb3NZKCkgY29uc3QgeyByZXR1cm4gbV9Qb3NZOyB9CiAKLSAgICBGWF9GTE9BVAkJCUdldFBvc1goKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fUG9zWDsKLSAgICB9CisgIHZvaWQgR2V0VGV4dE1hdHJpeChDRlhfTWF0cml4KiBwTWF0cml4KSBjb25zdDsKIAotICAgIEZYX0ZMT0FUCQkJR2V0UG9zWSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9Qb3NZOwotICAgIH0KKyAgQ1BERl9Gb250KiBHZXRGb250KCkgY29uc3QgeyByZXR1cm4gbV9UZXh0U3RhdGUuR2V0Rm9udCgpOyB9CiAKLSAgICB2b2lkCQkJCUdldFRleHRNYXRyaXgoQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCkgY29uc3Q7CisgIEZYX0ZMT0FUIEdldEZvbnRTaXplKCkgY29uc3QgeyByZXR1cm4gbV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKTsgfQogCi0gICAgQ1BERl9Gb250KgkJCUdldEZvbnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fVGV4dFN0YXRlLkdldEZvbnQoKTsKLSAgICB9CisgIHZvaWQgU2V0RW1wdHkoKTsKIAotICAgIEZYX0ZMT0FUCQkJR2V0Rm9udFNpemUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCk7Ci0gICAgfQorICB2b2lkIFNldFRleHQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHRleHQpOwogCi0gICAgdm9pZAkJCQlTZXRFbXB0eSgpOworICB2b2lkIFNldFRleHQoQ0ZYX0J5dGVTdHJpbmcqIHBTdHJzLCBGWF9GTE9BVCogcEtlcm5pbmcsIGludCBuU2Vncyk7CiAKLSAgICB2b2lkCQkJCVNldFRleHQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHRleHQpOworICB2b2lkIFNldFRleHQoaW50IG5DaGFycywgRlhfRFdPUkQqIHBDaGFyQ29kZXMsIEZYX0ZMT0FUKiBwS2VybmluZ3MpOwogCi0gICAgdm9pZAkJCQlTZXRUZXh0KENGWF9CeXRlU3RyaW5nKiBwU3RycywgRlhfRkxPQVQqIHBLZXJuaW5nLCBpbnQgblNlZ3MpOworICB2b2lkIFNldFBvc2l0aW9uKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpOwogCi0gICAgdm9pZAkJCQlTZXRUZXh0KGludCBuQ2hhcnMsIEZYX0RXT1JEKiBwQ2hhckNvZGVzLCBGWF9GTE9BVCogcEtlcm5pbmdzKTsKKyAgdm9pZCBTZXRUZXh0U3RhdGUoQ1BERl9UZXh0U3RhdGUgVGV4dFN0YXRlKTsKIAotICAgIHZvaWQJCQkJU2V0UG9zaXRpb24oRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSk7CisgIC8vIENQREZfUGFnZU9iamVjdDoKKyAgdm9pZCBUcmFuc2Zvcm0oY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSBvdmVycmlkZTsKIAotICAgIHZvaWQJCQkJU2V0VGV4dFN0YXRlKENQREZfVGV4dFN0YXRlIFRleHRTdGF0ZSk7Ci0gICAgdmlydHVhbCB2b2lkCQlUcmFuc2Zvcm0oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KTsKKyAgdm9pZCBDYWxjQ2hhclBvcyhGWF9GTE9BVCogcFBvc0FycmF5KSBjb25zdDsKIAotICAgIHZvaWQJCQkJQ2FsY0NoYXJQb3MoRlhfRkxPQVQqIHBQb3NBcnJheSkgY29uc3Q7CisgIHZvaWQgU2V0RGF0YShpbnQgbkNoYXJzLAorICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBDaGFyQ29kZXMsCisgICAgICAgICAgICAgICBGWF9GTE9BVCogcENoYXJQb3MsCisgICAgICAgICAgICAgICBGWF9GTE9BVCB4LAorICAgICAgICAgICAgICAgRlhfRkxPQVQgeSk7CiAKKyAgdm9pZCBHZXREYXRhKGludCYgbkNoYXJzLCBGWF9EV09SRComIHBDaGFyQ29kZXMsIEZYX0ZMT0FUKiYgcENoYXJQb3MpIHsKKyAgICBuQ2hhcnMgPSBtX25DaGFyczsKKyAgICBwQ2hhckNvZGVzID0gbV9wQ2hhckNvZGVzOworICAgIHBDaGFyUG9zID0gbV9wQ2hhclBvczsKKyAgfQogCisgIHZvaWQgUmVjYWxjUG9zaXRpb25EYXRhKCkgeyBDYWxjUG9zaXRpb25EYXRhKG51bGxwdHIsIG51bGxwdHIsIDEpOyB9CiAKLSAgICB2b2lkCQkJCVNldERhdGEoaW50IG5DaGFycywgRlhfRFdPUkQqIHBDaGFyQ29kZXMsIEZYX0ZMT0FUKiBwQ2hhclBvcywgRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSk7CisgcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgQ1BERl9SZW5kZXJTdGF0dXM7CisgIGZyaWVuZCBjbGFzcyBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI7CisgIGZyaWVuZCBjbGFzcyBDUERGX1RleHRSZW5kZXJlcjsKKyAgZnJpZW5kIGNsYXNzIENUZXh0UGFnZTsKIAotICAgIHZvaWQJCQkJR2V0RGF0YShpbnQmIG5DaGFycywgRlhfRFdPUkQqJiBwQ2hhckNvZGVzLCBGWF9GTE9BVComIHBDaGFyUG9zKQotICAgIHsKLSAgICAgICAgbkNoYXJzID0gbV9uQ2hhcnM7Ci0gICAgICAgIHBDaGFyQ29kZXMgPSBtX3BDaGFyQ29kZXM7Ci0gICAgICAgIHBDaGFyUG9zID0gbV9wQ2hhclBvczsKLSAgICB9CisgIC8vIENQREZfUGFnZU9iamVjdDoKKyAgdm9pZCBDb3B5RGF0YShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTcmNPYmplY3QpIG92ZXJyaWRlOwogCisgIHZvaWQgU2V0U2VnbWVudHMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcqIHBTdHJzLCBGWF9GTE9BVCogcEtlcm5pbmcsIGludCBuU2Vncyk7CiAKLSAgICB2b2lkCQkJCVJlY2FsY1Bvc2l0aW9uRGF0YSgpCi0gICAgewotICAgICAgICBDYWxjUG9zaXRpb25EYXRhKE5VTEwsIE5VTEwsIDEpOwotICAgIH0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQJCUNvcHlEYXRhKGNvbnN0IENQREZfUGFnZU9iamVjdCogcFNyY09iamVjdCk7CisgIHZvaWQgQ2FsY1Bvc2l0aW9uRGF0YShGWF9GTE9BVCogcFRleHRBZHZhbmNlWCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBwVGV4dEFkdmFuY2VZLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaG9yel9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCA9IDApOwogCi0gICAgRlhfRkxPQVQJCQltX1Bvc1g7CisgIEZYX0ZMT0FUIG1fUG9zWDsKKyAgRlhfRkxPQVQgbV9Qb3NZOwogCi0gICAgRlhfRkxPQVQJCQltX1Bvc1k7CisgIGludCBtX25DaGFyczsKIAotICAgIGludAkJCQkJbV9uQ2hhcnM7CisgIEZYX0RXT1JEKiBtX3BDaGFyQ29kZXM7CiAKLSAgICBGWF9EV09SRCoJCQltX3BDaGFyQ29kZXM7Ci0KLSAgICBGWF9GTE9BVCoJCW1fcENoYXJQb3M7Ci0KLSAgICB2b2lkCQkJCVNldFNlZ21lbnRzKGNvbnN0IENGWF9CeXRlU3RyaW5nKiBwU3RycywgRlhfRkxPQVQqIHBLZXJuaW5nLCBpbnQgblNlZ3MpOwotCi0gICAgdm9pZAkJCQlDYWxjUG9zaXRpb25EYXRhKEZYX0ZMT0FUKiBwVGV4dEFkdmFuY2VYLCBGWF9GTE9BVCogcFRleHRBZHZhbmNlWSwgRlhfRkxPQVQgaG9yel9zY2FsZSwgaW50IGxldmVsID0gMCk7Ci0gICAgZnJpZW5kIGNsYXNzCQlDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI7Ci0gICAgZnJpZW5kIGNsYXNzCQlDUERGX1JlbmRlclN0YXR1czsKLSAgICBmcmllbmQgY2xhc3MJCUNQREZfUXVpY2tEcmF3ZXI7Ci0gICAgZnJpZW5kIGNsYXNzCQlDUERGX1RleHRSZW5kZXJlcjsKLSAgICBmcmllbmQgY2xhc3MJCUNUZXh0UGFnZTsKLSAgICBmcmllbmQgY2xhc3MJCUNQREZfQ29udGVudEdlbmVyYXRvcjsKKyAgRlhfRkxPQVQqIG1fcENoYXJQb3M7CiB9OwotY2xhc3MgQ1BERl9QYXRoT2JqZWN0IDogcHVibGljIENQREZfUGFnZU9iamVjdAotewotcHVibGljOgogCi0gICAgQ1BERl9QYXRoT2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIG1fVHlwZSA9IFBERlBBR0VfUEFUSDsKLSAgICB9CitjbGFzcyBDUERGX1BhdGhPYmplY3QgOiBwdWJsaWMgQ1BERl9QYWdlT2JqZWN0IHsKKyBwdWJsaWM6CisgIENQREZfUGF0aE9iamVjdCgpIHsgbV9UeXBlID0gUERGUEFHRV9QQVRIOyB9CisgIH5DUERGX1BhdGhPYmplY3QoKSBvdmVycmlkZSB7fQogCi0gICAgdmlydHVhbCB+Q1BERl9QYXRoT2JqZWN0KCkge30KLSAgICB2aXJ0dWFsIHZvaWQJCVRyYW5zZm9ybShjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBtYXh0cml4KTsKKyAgdm9pZCBUcmFuc2Zvcm0oY29uc3QgQ0ZYX01hdHJpeCYgbWF4dHJpeCkgb3ZlcnJpZGU7CiAKLSAgICB2b2lkCQkJCVNldEdyYXBoU3RhdGUoQ1BERl9HcmFwaFN0YXRlIEdyYXBoU3RhdGUpOworICB2b2lkIFNldEdyYXBoU3RhdGUoQ1BERl9HcmFwaFN0YXRlIEdyYXBoU3RhdGUpOwogCi0gICAgQ1BERl9QYXRoCQkJbV9QYXRoOworICB2b2lkIENhbGNCb3VuZGluZ0JveCgpOwogCi0gICAgaW50CQkJCQltX0ZpbGxUeXBlOworICBDUERGX1BhdGggbV9QYXRoOwogCi0gICAgRlhfQk9PTAkJCQltX2JTdHJva2U7CisgIGludCBtX0ZpbGxUeXBlOwogCi0gICAgQ0ZYX0FmZmluZU1hdHJpeAltX01hdHJpeDsKKyAgRlhfQk9PTCBtX2JTdHJva2U7CiAKKyAgQ0ZYX01hdHJpeCBtX01hdHJpeDsKIAotICAgIHZvaWQJCQkJQ2FsY0JvdW5kaW5nQm94KCk7Ci1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lkCQlDb3B5RGF0YShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTcmNPYmpldCk7CisgcHJvdGVjdGVkOgorICB2b2lkIENvcHlEYXRhKGNvbnN0IENQREZfUGFnZU9iamVjdCogcFNyY09iamVjdCkgb3ZlcnJpZGU7CiB9OwotY2xhc3MgQ1BERl9JbWFnZU9iamVjdCA6IHB1YmxpYyBDUERGX1BhZ2VPYmplY3QKLXsKLXB1YmxpYzoKIAotICAgIENQREZfSW1hZ2VPYmplY3QoKTsKK2NsYXNzIENQREZfSW1hZ2VPYmplY3QgOiBwdWJsaWMgQ1BERl9QYWdlT2JqZWN0IHsKKyBwdWJsaWM6CisgIENQREZfSW1hZ2VPYmplY3QoKTsKKyAgfkNQREZfSW1hZ2VPYmplY3QoKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgfkNQREZfSW1hZ2VPYmplY3QoKTsKLSAgICB2aXJ0dWFsIHZvaWQJCVRyYW5zZm9ybShjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgpOworICB2b2lkIFRyYW5zZm9ybShjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIG92ZXJyaWRlOwogCi0gICAgQ1BERl9JbWFnZSoJCQltX3BJbWFnZTsKKyAgQ1BERl9JbWFnZSogbV9wSW1hZ2U7CiAKLSAgICBDRlhfQWZmaW5lTWF0cml4CW1fTWF0cml4OworICBDRlhfTWF0cml4IG1fTWF0cml4OwogCi0gICAgdm9pZAkJCQlDYWxjQm91bmRpbmdCb3goKTsKLXByaXZhdGU6Ci0gICAgdmlydHVhbCB2b2lkCQlDb3B5RGF0YShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTcmNPYmpldCk7CisgIHZvaWQgQ2FsY0JvdW5kaW5nQm94KCk7CisKKyBwcml2YXRlOgorICB2b2lkIENvcHlEYXRhKGNvbnN0IENQREZfUGFnZU9iamVjdCogcFNyY09iamVjdCkgb3ZlcnJpZGU7CiB9OwotY2xhc3MgQ1BERl9TaGFkaW5nT2JqZWN0IDogcHVibGljIENQREZfUGFnZU9iamVjdAotewotcHVibGljOgogCi0gICAgQ1BERl9TaGFkaW5nT2JqZWN0KCk7CitjbGFzcyBDUERGX1NoYWRpbmdPYmplY3QgOiBwdWJsaWMgQ1BERl9QYWdlT2JqZWN0IHsKKyBwdWJsaWM6CisgIENQREZfU2hhZGluZ09iamVjdCgpOworICB+Q1BERl9TaGFkaW5nT2JqZWN0KCkgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIH5DUERGX1NoYWRpbmdPYmplY3QoKTsKKyAgQ1BERl9TaGFkaW5nUGF0dGVybiogbV9wU2hhZGluZzsKIAotICAgIENQREZfU2hhZGluZ1BhdHRlcm4qCW1fcFNoYWRpbmc7CisgIENGWF9NYXRyaXggbV9NYXRyaXg7CiAKLSAgICBDRlhfQWZmaW5lTWF0cml4CW1fTWF0cml4OworICB2b2lkIFRyYW5zZm9ybShjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIG92ZXJyaWRlOwogCi0gICAgQ1BERl9QYWdlKgkJCW1fcFBhZ2U7Ci0gICAgdmlydHVhbCB2b2lkCQlUcmFuc2Zvcm0oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KTsKKyAgdm9pZCBDYWxjQm91bmRpbmdCb3goKTsKIAotICAgIHZvaWQJCQkJQ2FsY0JvdW5kaW5nQm94KCk7Ci1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lkCQlDb3B5RGF0YShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTcmNPYmpldCk7CisgcHJvdGVjdGVkOgorICB2b2lkIENvcHlEYXRhKGNvbnN0IENQREZfUGFnZU9iamVjdCogcFNyY09iamVjdCkgb3ZlcnJpZGU7CiB9OwotY2xhc3MgQ1BERl9Gb3JtT2JqZWN0IDogcHVibGljIENQREZfUGFnZU9iamVjdAotewotcHVibGljOgogCi0gICAgQ1BERl9Gb3JtT2JqZWN0KCkKLSAgICB7Ci0gICAgICAgIG1fVHlwZSA9IFBERlBBR0VfRk9STTsKLSAgICAgICAgbV9wRm9ybSA9IE5VTEw7Ci0gICAgfQorY2xhc3MgQ1BERl9Gb3JtT2JqZWN0IDogcHVibGljIENQREZfUGFnZU9iamVjdCB7CisgcHVibGljOgorICBDUERGX0Zvcm1PYmplY3QoKSB7CisgICAgbV9UeXBlID0gUERGUEFHRV9GT1JNOworICAgIG1fcEZvcm0gPSBOVUxMOworICB9CisgIH5DUERGX0Zvcm1PYmplY3QoKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgfkNQREZfRm9ybU9iamVjdCgpOwotICAgIHZpcnR1YWwgdm9pZAkJVHJhbnNmb3JtKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCk7CisgIHZvaWQgVHJhbnNmb3JtKGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgb3ZlcnJpZGU7CiAKLSAgICBDUERGX0Zvcm0qCQkJbV9wRm9ybTsKKyAgQ1BERl9Gb3JtKiBtX3BGb3JtOwogCi0gICAgQ0ZYX0FmZmluZU1hdHJpeAltX0Zvcm1NYXRyaXg7CisgIENGWF9NYXRyaXggbV9Gb3JtTWF0cml4OwogCi0gICAgdm9pZAkJCQlDYWxjQm91bmRpbmdCb3goKTsKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQJCUNvcHlEYXRhKGNvbnN0IENQREZfUGFnZU9iamVjdCogcFNyY09iamV0KTsKLX07Ci1jbGFzcyBDUERGX0lubGluZUltYWdlcyA6IHB1YmxpYyBDUERGX1BhZ2VPYmplY3QKLXsKLXB1YmxpYzoKKyAgdm9pZCBDYWxjQm91bmRpbmdCb3goKTsKIAotICAgIENQREZfSW5saW5lSW1hZ2VzKCk7Ci0KLSAgICB2aXJ0dWFsIH5DUERGX0lubGluZUltYWdlcygpOwotCi0gICAgQ1BERl9TdHJlYW0qCQltX3BTdHJlYW07Ci0KLSAgICBDRlhfRElCaXRtYXAqCQltX3BCaXRtYXA7Ci0KLSAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDRlhfQWZmaW5lTWF0cml4PgltX01hdHJpY2VzOwotCi0gICAgdm9pZAkJCQlBZGRNYXRyaXgoQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KTsKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQJCVRyYW5zZm9ybShjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgpIHt9Ci0gICAgdmlydHVhbCB2b2lkCQlDb3B5RGF0YShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTcmNPYmpldCkge30KKyBwcm90ZWN0ZWQ6CisgIHZvaWQgQ29weURhdGEoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwU3JjT2JqZWN0KSBvdmVycmlkZTsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9JTkNMVURFX0ZQREZBUElfRlBERl9QQUdFT0JKX0hfCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhcnNlci5oIGIvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYXJzZXIuaAppbmRleCBkMThkMzYyLi5mZGE0NTU3IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhcnNlci5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFyc2VyLmgKQEAgLTEsOTE4ICsxLDk5MCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIENPUkVfSU5DTFVERV9GUERGQVBJX0ZQREZfUEFSU0VSX0hfCiAjZGVmaW5lIENPUkVfSU5DTFVERV9GUERGQVBJX0ZQREZfUEFSU0VSX0hfCiAKLSNpbmNsdWRlICIuLi9meGNydC9meF9leHQuaCIKLSNpbmNsdWRlICJmcGRmX29iamVjdHMuaCIKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNldD4KIAotY2xhc3MgQ1BERl9Eb2N1bWVudDsKLWNsYXNzIENQREZfUGFyc2VyOwotY2xhc3MgQ1BERl9TZWN1cml0eUhhbmRsZXI7Ci1jbGFzcyBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOwotY2xhc3MgQ1BERl9DcnlwdG9IYW5kbGVyOwotY2xhc3MgQ1BERl9PYmplY3Q7Ci1jbGFzcyBJRlhfRmlsZVJlYWQ7Ci1jbGFzcyBDRkRGX0RvY3VtZW50OwotY2xhc3MgQ0ZERl9QYXJzZXI7CisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9vYmplY3RzLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorCiBjbGFzcyBDRlhfRm9udDsKLWNsYXNzIENGWF9BZmZpbmVNYXRyaXg7Ci1jbGFzcyBDRlhfRmxvYXRSZWN0OwotY2xhc3MgQ1BERl9Qb2ludDsKK2NsYXNzIENGWF9NYXRyaXg7CitjbGFzcyBDUERGX0NvbG9yU3BhY2U7CitjbGFzcyBDUERGX0NyeXB0b0hhbmRsZXI7CiBjbGFzcyBDUERGX0RvY1BhZ2VEYXRhOwogY2xhc3MgQ1BERl9Eb2NSZW5kZXJEYXRhOwotY2xhc3MgQ1BERl9Nb2R1bGVNZ3I7Ci1jbGFzcyBDRlhfRElCU291cmNlOwogY2xhc3MgQ1BERl9Gb250OwotY2xhc3MgQ1BERl9JbWFnZTsKLWNsYXNzIENQREZfQ29sb3JTcGFjZTsKLWNsYXNzIENQREZfUGF0dGVybjsKIGNsYXNzIENQREZfRm9udEVuY29kaW5nOwogY2xhc3MgQ1BERl9JY2NQcm9maWxlOwotY2xhc3MgQ0ZYX1ByaXZhdGVEYXRhOwotI2RlZmluZSBGUERGUEVSTV9QUklOVAkJCTB4MDAwNAotI2RlZmluZSBGUERGUEVSTV9NT0RJRlkJCQkweDAwMDgKLSNkZWZpbmUgRlBERlBFUk1fRVhUUkFDVAkJMHgwMDEwCi0jZGVmaW5lIEZQREZQRVJNX0FOTk9UX0ZPUk0JCTB4MDAyMAotI2RlZmluZSBGUERGUEVSTV9GSUxMX0ZPUk0JCTB4MDEwMAotI2RlZmluZSBGUERGUEVSTV9FWFRSQUNUX0FDQ0VTUwkweDAyMDAKLSNkZWZpbmUgRlBERlBFUk1fQVNTRU1CTEUJCTB4MDQwMAotI2RlZmluZSBGUERGUEVSTV9QUklOVF9ISUdICQkweDA4MDAKLSNkZWZpbmUgRlBERl9QQUdFX01BWF9OVU0JCTB4RkZGRkYKK2NsYXNzIENQREZfSW1hZ2U7CitjbGFzcyBDUERGX09iamVjdDsKK2NsYXNzIENQREZfUGFyc2VyOworY2xhc3MgQ1BERl9QYXR0ZXJuOworY2xhc3MgQ1BERl9TZWN1cml0eUhhbmRsZXI7CitjbGFzcyBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOworY2xhc3MgSUZYX0ZpbGVSZWFkOwogCi0vLyBJbmRleGVkIGJ5IDgtYml0IGNoYXJhY3RlciBjb2RlLCBjb250YWlucyBlaXRoZXI6Ci0vLyAgICdXJyAtIGZvciB3aGl0ZXNwYWNlOiBOVUwsIFRBQiwgQ1IsIExGLCBGRiwgMHg4MCwgMHhmZgotLy8gICAnTicgLSBmb3IgbnVtZXJpYzogMDEyMzQ1Njc4OSstLgotLy8gICAnRCcgLSBmb3IgZGVsaW1pdGVyOiAlKCkvPD5bXXt9Ci0vLyAgICdSJyAtIG90aGVyd2lzZS4KKyNkZWZpbmUgRlBERlBFUk1fUFJJTlQgMHgwMDA0CisjZGVmaW5lIEZQREZQRVJNX01PRElGWSAweDAwMDgKKyNkZWZpbmUgRlBERlBFUk1fRVhUUkFDVCAweDAwMTAKKyNkZWZpbmUgRlBERlBFUk1fQU5OT1RfRk9STSAweDAwMjAKKyNkZWZpbmUgRlBERlBFUk1fRklMTF9GT1JNIDB4MDEwMAorI2RlZmluZSBGUERGUEVSTV9FWFRSQUNUX0FDQ0VTUyAweDAyMDAKKyNkZWZpbmUgRlBERlBFUk1fQVNTRU1CTEUgMHgwNDAwCisjZGVmaW5lIEZQREZQRVJNX1BSSU5UX0hJR0ggMHgwODAwCisjZGVmaW5lIEZQREZfUEFHRV9NQVhfTlVNIDB4RkZGRkYKKworLy8gVXNlIHRoZSBhY2Nlc3NvcnMgYmVsb3cgaW5zdGVhZCBvZiBkaXJlY3RseSBhY2Nlc3NpbmcgUERGX0NoYXJUeXBlLgogZXh0ZXJuIGNvbnN0IGNoYXIgUERGX0NoYXJUeXBlWzI1Nl07CiAKLWNsYXNzIENQREZfRG9jdW1lbnQgOiBwdWJsaWMgQ0ZYX1ByaXZhdGVEYXRhLCBwdWJsaWMgQ1BERl9JbmRpcmVjdE9iamVjdHMKLXsKLXB1YmxpYzoKLSAgICBDUERGX0RvY3VtZW50KCk7Ci0gICAgZXhwbGljaXQgQ1BERl9Eb2N1bWVudChDUERGX1BhcnNlciogcFBhcnNlcik7CitpbmxpbmUgYm9vbCBQREZDaGFySXNXaGl0ZXNwYWNlKHVpbnQ4X3QgYykgeworICByZXR1cm4gUERGX0NoYXJUeXBlW2NdID09ICdXJzsKK30KK2lubGluZSBib29sIFBERkNoYXJJc051bWVyaWModWludDhfdCBjKSB7CisgIHJldHVybiBQREZfQ2hhclR5cGVbY10gPT0gJ04nOworfQoraW5saW5lIGJvb2wgUERGQ2hhcklzRGVsaW1pdGVyKHVpbnQ4X3QgYykgeworICByZXR1cm4gUERGX0NoYXJUeXBlW2NdID09ICdEJzsKK30KK2lubGluZSBib29sIFBERkNoYXJJc090aGVyKHVpbnQ4X3QgYykgeworICByZXR1cm4gUERGX0NoYXJUeXBlW2NdID09ICdSJzsKK30KIAotICAgIH5DUERGX0RvY3VtZW50KCk7CitpbmxpbmUgYm9vbCBQREZDaGFySXNMaW5lRW5kaW5nKHVpbnQ4X3QgYykgeworICByZXR1cm4gYyA9PSAnXHInIHx8IGMgPT0gJ1xuJzsKK30KIAotICAgIENQREZfUGFyc2VyKgkJCUdldFBhcnNlcigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wUGFyc2VyOwotICAgIH0KKy8vIEluZGV4ZWQgYnkgOC1iaXQgY2hhciBjb2RlLCBjb250YWlucyB1bmljb2RlIGNvZGUgcG9pbnRzLgorZXh0ZXJuIGNvbnN0IEZYX1dPUkQgUERGRG9jRW5jb2RpbmdbMjU2XTsKIAotICAgIENQREZfRGljdGlvbmFyeSoJCUdldFJvb3QoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcFJvb3REaWN0OwotICAgIH0KK2NsYXNzIENQREZfRG9jdW1lbnQgOiBwdWJsaWMgQ0ZYX1ByaXZhdGVEYXRhLCBwdWJsaWMgQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlciB7CisgcHVibGljOgorICBDUERGX0RvY3VtZW50KCk7CisgIGV4cGxpY2l0IENQREZfRG9jdW1lbnQoQ1BERl9QYXJzZXIqIHBQYXJzZXIpOwogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgkJR2V0SW5mbygpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wSW5mb0RpY3Q7Ci0gICAgfQorICB+Q1BERl9Eb2N1bWVudCgpOwogCi0gICAgdm9pZAkJCQkJR2V0SUQoQ0ZYX0J5dGVTdHJpbmcmIGlkMSwgQ0ZYX0J5dGVTdHJpbmcmIGlkMikgY29uc3QKLSAgICB7Ci0gICAgICAgIGlkMSA9IG1fSUQxOwotICAgICAgICBpZDIgPSBtX0lEMjsKLSAgICB9CisgIENQREZfUGFyc2VyKiBHZXRQYXJzZXIoKSBjb25zdCB7IHJldHVybiBtX3BQYXJzZXI7IH0KIAotICAgIGludAkJCQkJCUdldFBhZ2VDb3VudCgpIGNvbnN0OworICBDUERGX0RpY3Rpb25hcnkqIEdldFJvb3QoKSBjb25zdCB7IHJldHVybiBtX3BSb290RGljdDsgfQogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgkJR2V0UGFnZShpbnQgaVBhZ2UpOworICBDUERGX0RpY3Rpb25hcnkqIEdldEluZm8oKSBjb25zdCB7IHJldHVybiBtX3BJbmZvRGljdDsgfQogCi0gICAgaW50CQkJCQkJR2V0UGFnZUluZGV4KEZYX0RXT1JEIG9iam51bSk7CisgIHZvaWQgR2V0SUQoQ0ZYX0J5dGVTdHJpbmcmIGlkMSwgQ0ZYX0J5dGVTdHJpbmcmIGlkMikgY29uc3QgeworICAgIGlkMSA9IG1fSUQxOworICAgIGlkMiA9IG1fSUQyOworICB9CiAKLSAgICBGWF9EV09SRAkJCQlHZXRVc2VyUGVybWlzc2lvbnMoRlhfQk9PTCBiQ2hlY2tSZXZpc2lvbiA9IEZBTFNFKSBjb25zdDsKKyAgaW50IEdldFBhZ2VDb3VudCgpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCQkJSXNPd25lcigpIGNvbnN0OworICBDUERGX0RpY3Rpb25hcnkqIEdldFBhZ2UoaW50IGlQYWdlKTsKIAorICBpbnQgR2V0UGFnZUluZGV4KEZYX0RXT1JEIG9iam51bSk7CiAKKyAgRlhfRFdPUkQgR2V0VXNlclBlcm1pc3Npb25zKEZYX0JPT0wgYkNoZWNrUmV2aXNpb24gPSBGQUxTRSkgY29uc3Q7CiAKLSAgICBDUERGX0RvY1BhZ2VEYXRhKgkJR2V0UGFnZURhdGEoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdldFZhbGlkYXRlUGFnZURhdGEoKTsKLSAgICB9CisgIEZYX0JPT0wgSXNPd25lcigpIGNvbnN0OwogCi0gICAgdm9pZAkJCQkJQ2xlYXJQYWdlRGF0YSgpOworICBDUERGX0RvY1BhZ2VEYXRhKiBHZXRQYWdlRGF0YSgpIHsgcmV0dXJuIEdldFZhbGlkYXRlUGFnZURhdGEoKTsgfQogCi0gICAgdm9pZAkJCQkJUmVtb3ZlQ29sb3JTcGFjZUZyb21QYWdlRGF0YShDUERGX09iamVjdCogcE9iamVjdCk7CisgIHZvaWQgQ2xlYXJQYWdlRGF0YSgpOwogCisgIHZvaWQgUmVtb3ZlQ29sb3JTcGFjZUZyb21QYWdlRGF0YShDUERGX09iamVjdCogcE9iamVjdCk7CiAKLSAgICBDUERGX0RvY1JlbmRlckRhdGEqCQlHZXRSZW5kZXJEYXRhKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBHZXRWYWxpZGF0ZVJlbmRlckRhdGEoKTsKLSAgICB9CisgIENQREZfRG9jUmVuZGVyRGF0YSogR2V0UmVuZGVyRGF0YSgpIHsgcmV0dXJuIEdldFZhbGlkYXRlUmVuZGVyRGF0YSgpOyB9CiAKLSAgICB2b2lkCQkJCQlDbGVhclJlbmRlckRhdGEoKTsKKyAgdm9pZCBDbGVhclJlbmRlckRhdGEoKTsKIAotICAgIHZvaWQJCQkJCUNsZWFyUmVuZGVyRm9udCgpOworICB2b2lkIENsZWFyUmVuZGVyRm9udCgpOwogCisgIEZYX0JPT0wgSXNGb3JtU3RyZWFtKEZYX0RXT1JEIG9iam51bSwgRlhfQk9PTCYgYkZvcm0pIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCQkJSXNGb3JtU3RyZWFtKEZYX0RXT1JEIG9iam51bSwgRlhfQk9PTCYgYkZvcm0pIGNvbnN0OworICAvLyB8cEZvbnREaWN0fCBtdXN0IG5vdCBiZSBudWxsLgorICBDUERGX0ZvbnQqIExvYWRGb250KENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0KTsKIAorICBDUERGX0NvbG9yU3BhY2UqIExvYWRDb2xvclNwYWNlKENQREZfT2JqZWN0KiBwQ1NPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzb3VyY2VzID0gTlVMTCk7CiAKKyAgQ1BERl9QYXR0ZXJuKiBMb2FkUGF0dGVybihDUERGX09iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGFkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCA9IE5VTEwpOwogCisgIENQREZfSW1hZ2UqIExvYWRJbWFnZUYoQ1BERl9PYmplY3QqIHBPYmopOwogCi0gICAgQ1BERl9Gb250KgkJCQlMb2FkRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCk7CisgIENQREZfU3RyZWFtQWNjKiBMb2FkRm9udEZpbGUoQ1BERl9TdHJlYW0qIHBTdHJlYW0pOwogCi0gICAgQ1BERl9Gb250KgkJCQlGaW5kRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCk7Ci0KLSAgICBDUERGX0NvbG9yU3BhY2UqCQlMb2FkQ29sb3JTcGFjZShDUERGX09iamVjdCogcENTT2JqLCBDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZXMgPSBOVUxMKTsKLQotICAgIENQREZfUGF0dGVybioJCQlMb2FkUGF0dGVybihDUERGX09iamVjdCogcE9iaiwgRlhfQk9PTCBiU2hhZGluZywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogbWF0cml4ID0gTlVMTCk7Ci0KLSAgICBDUERGX0ltYWdlKgkJCQlMb2FkSW1hZ2VGKENQREZfT2JqZWN0KiBwT2JqKTsKLQotICAgIENQREZfU3RyZWFtQWNjKgkJCUxvYWRGb250RmlsZShDUERGX1N0cmVhbSogcFN0cmVhbSk7Ci0KLSAgICBDUERGX0ljY1Byb2ZpbGUqCQlMb2FkSWNjUHJvZmlsZShDUERGX1N0cmVhbSogcFN0cmVhbSk7CisgIENQREZfSWNjUHJvZmlsZSogTG9hZEljY1Byb2ZpbGUoQ1BERl9TdHJlYW0qIHBTdHJlYW0pOwogCiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwogCi0gICAgQ1BERl9Gb250KgkJCQlBZGRXaW5kb3dzRm9udChMT0dGT05UQSogcExvZ0ZvbnQsIEZYX0JPT0wgYlZlcnQsIEZYX0JPT0wgYlRyYW5zbGF0ZU5hbWUgPSBGQUxTRSk7Ci0gICAgQ1BERl9Gb250KgkJCQlBZGRXaW5kb3dzRm9udChMT0dGT05UVyogcExvZ0ZvbnQsIEZYX0JPT0wgYlZlcnQsIEZYX0JPT0wgYlRyYW5zbGF0ZU5hbWUgPSBGQUxTRSk7CisgIENQREZfRm9udCogQWRkV2luZG93c0ZvbnQoTE9HRk9OVEEqIHBMb2dGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZlcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJhbnNsYXRlTmFtZSA9IEZBTFNFKTsKKyAgQ1BERl9Gb250KiBBZGRXaW5kb3dzRm9udChMT0dGT05UVyogcExvZ0ZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUcmFuc2xhdGVOYW1lID0gRkFMU0UpOwogI2VuZGlmCiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICBDUERGX0ZvbnQqICAgICAgICAgICAgICBBZGRNYWNGb250KENURm9udFJlZiBwRm9udCwgRlhfQk9PTCBiVmVydCwgRlhfQk9PTCBiVHJhbnNsYXRlTmFtZSA9IEZBTFNFKTsKKyAgQ1BERl9Gb250KiBBZGRNYWNGb250KENURm9udFJlZiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZlcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUcmFuc2xhdGVOYW1lID0gRkFMU0UpOwogI2VuZGlmCiAKLSAgICBDUERGX0ZvbnQqCQkJCUFkZFN0YW5kYXJkRm9udChjb25zdCBGWF9DSEFSKiBmb250LCBDUERGX0ZvbnRFbmNvZGluZyogcEVuY29kaW5nKTsKKyAgQ1BERl9Gb250KiBBZGRTdGFuZGFyZEZvbnQoY29uc3QgRlhfQ0hBUiogZm9udCwgQ1BERl9Gb250RW5jb2RpbmcqIHBFbmNvZGluZyk7CiAKKyAgQ1BERl9Gb250KiBBZGRGb250KENGWF9Gb250KiBwRm9udCwgaW50IGNoYXJzZXQsIEZYX0JPT0wgYlZlcnQpOwogCi0gICAgQ1BERl9Gb250KgkJCQlBZGRGb250KENGWF9Gb250KiBwRm9udCwgaW50IGNoYXJzZXQsIEZYX0JPT0wgYlZlcnQpOworICB2b2lkIENyZWF0ZU5ld0RvYygpOwogCi0gICAgdm9pZAkJCQkJQ3JlYXRlTmV3RG9jKCk7CisgIENQREZfRGljdGlvbmFyeSogQ3JlYXRlTmV3UGFnZShpbnQgaVBhZ2UpOwogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgkJQ3JlYXRlTmV3UGFnZShpbnQgaVBhZ2UpOworICB2b2lkIERlbGV0ZVBhZ2UoaW50IGlQYWdlKTsKIAotICAgIHZvaWQJCQkJCURlbGV0ZVBhZ2UoaW50IGlQYWdlKTsKKyAgdm9pZCBMb2FkRG9jKCk7CisgIHZvaWQgTG9hZEFzeW5Eb2MoQ1BERl9EaWN0aW9uYXJ5KiBwTGluZWFyaXplZCk7CisgIHZvaWQgTG9hZFBhZ2VzKCk7CiAKLSAgICB2b2lkCQkJCQlMb2FkRG9jKCk7Ci0gICAgdm9pZAkJCQkJTG9hZEFzeW5Eb2MoQ1BERl9EaWN0aW9uYXJ5ICpwTGluZWFyaXplZCk7Ci0gICAgdm9pZAkJCQkJTG9hZFBhZ2VzKCk7Ci1wcm90ZWN0ZWQ6CisgcHJvdGVjdGVkOgorICBDUERGX0RpY3Rpb25hcnkqIG1fcFJvb3REaWN0OwogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgkJbV9wUm9vdERpY3Q7CisgIENQREZfRGljdGlvbmFyeSogbV9wSW5mb0RpY3Q7CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqCQltX3BJbmZvRGljdDsKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9JRDE7CiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJCW1fSUQxOworICBDRlhfQnl0ZVN0cmluZyBtX0lEMjsKIAotICAgIENGWF9CeXRlU3RyaW5nCQkJbV9JRDI7CisgIEZYX0JPT0wgbV9iTGluZWFyaXplZDsKIAorICBGWF9EV09SRCBtX2R3Rmlyc3RQYWdlTm87CiAKLSAgICBGWF9CT09MCQkJCQltX2JMaW5lYXJpemVkOworICBGWF9EV09SRCBtX2R3Rmlyc3RQYWdlT2JqTnVtOwogCi0gICAgRlhfRFdPUkQJCQkJbV9kd0ZpcnN0UGFnZU5vOworICBDRlhfRFdvcmRBcnJheSBtX1BhZ2VMaXN0OwogCi0gICAgRlhfRFdPUkQJCQkJbV9kd0ZpcnN0UGFnZU9iak51bTsKKyAgaW50IF9HZXRQYWdlQ291bnQoKSBjb25zdDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBfRmluZFBERlBhZ2UoQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5QYWdlc1RvR28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCk7CisgIGludCBfRmluZFBhZ2VJbmRleChDUERGX0RpY3Rpb25hcnkqIHBOb2RlLAorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHNraXBfY291bnQsCisgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICBpbnQmIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsID0gMCk7CisgIEZYX0JPT0wgSXNDb250ZW50VXNlZEVsc2V3aGVyZShGWF9EV09SRCBvYmpudW0sIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0KTsKKyAgRlhfQk9PTCBDaGVja09DR1Zpc2libGUoQ1BERl9EaWN0aW9uYXJ5KiBwT0NHLCBGWF9CT09MIGJQcmludGluZyk7CisgIENQREZfRG9jUGFnZURhdGEqIEdldFZhbGlkYXRlUGFnZURhdGEoKTsKKyAgQ1BERl9Eb2NSZW5kZXJEYXRhKiBHZXRWYWxpZGF0ZVJlbmRlckRhdGEoKTsKKyAgZnJpZW5kIGNsYXNzIENQREZfQ3JlYXRvcjsKKyAgZnJpZW5kIGNsYXNzIENQREZfUGFyc2VyOworICBmcmllbmQgY2xhc3MgQ1BERl9EYXRhQXZhaWw7CisgIGZyaWVuZCBjbGFzcyBDUERGX09DQ29udGV4dDsKIAotICAgIENGWF9EV29yZEFycmF5CQkJbV9QYWdlTGlzdDsKKyAgQ1BERl9Eb2NQYWdlRGF0YSogbV9wRG9jUGFnZTsKIAotICAgIGludAkJCQkJCV9HZXRQYWdlQ291bnQoKSBjb25zdDsKLSAgICBDUERGX0RpY3Rpb25hcnkqCQlfRmluZFBERlBhZ2UoQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZXMsIGludCBpUGFnZSwgaW50IG5QYWdlc1RvR28sIGludCBsZXZlbCk7Ci0gICAgaW50CQkJCQkJX0ZpbmRQYWdlSW5kZXgoQ1BERl9EaWN0aW9uYXJ5KiBwTm9kZSwgRlhfRFdPUkQmIHNraXBfY291bnQsIEZYX0RXT1JEIG9iam51bSwgaW50JiBpbmRleCwgaW50IGxldmVsID0gMCk7Ci0gICAgRlhfQk9PTAkJCQkJSXNDb250ZW50VXNlZEVsc2V3aGVyZShGWF9EV09SRCBvYmpudW0sIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0KTsKLSAgICBGWF9CT09MCQkJCQlDaGVja09DR1Zpc2libGUoQ1BERl9EaWN0aW9uYXJ5KiBwT0NHLCBGWF9CT09MIGJQcmludGluZyk7Ci0gICAgQ1BERl9Eb2NQYWdlRGF0YSoJCUdldFZhbGlkYXRlUGFnZURhdGEoKTsKLSAgICBDUERGX0RvY1JlbmRlckRhdGEqCQlHZXRWYWxpZGF0ZVJlbmRlckRhdGEoKTsKLSAgICBmcmllbmQgY2xhc3MJCQlDUERGX0NyZWF0b3I7Ci0gICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9QYXJzZXI7Ci0gICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9EYXRhQXZhaWw7Ci0gICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9PQ0NvbnRleHQ7Ci0KLQotCi0gICAgQ1BERl9Eb2NQYWdlRGF0YSoJCW1fcERvY1BhZ2U7Ci0KLSAgICBDUERGX0RvY1JlbmRlckRhdGEqCQltX3BEb2NSZW5kZXI7Ci0KKyAgQ1BERl9Eb2NSZW5kZXJEYXRhKiBtX3BEb2NSZW5kZXI7CiB9OwogCi0jZGVmaW5lIFBERldPUkRfRU9GCQkJMAotI2RlZmluZSBQREZXT1JEX05VTUJFUgkJMQotI2RlZmluZSBQREZXT1JEX1RFWFQJCTIKLSNkZWZpbmUgUERGV09SRF9ERUxJTUlURVIJMwotI2RlZmluZSBQREZXT1JEX05BTUUJCTQKLWNsYXNzIENQREZfU2ltcGxlUGFyc2VyIAotewotcHVibGljOgorI2RlZmluZSBQREZXT1JEX0VPRiAwCisjZGVmaW5lIFBERldPUkRfTlVNQkVSIDEKKyNkZWZpbmUgUERGV09SRF9URVhUIDIKKyNkZWZpbmUgUERGV09SRF9ERUxJTUlURVIgMworI2RlZmluZSBQREZXT1JEX05BTUUgNAorY2xhc3MgQ1BERl9TaW1wbGVQYXJzZXIgeworIHB1YmxpYzoKKyAgQ1BERl9TaW1wbGVQYXJzZXIoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3U2l6ZSk7CiAKLSAgICBDUERGX1NpbXBsZVBhcnNlcihGWF9MUENCWVRFIHBEYXRhLCBGWF9EV09SRCBkd1NpemUpOworICBDUERGX1NpbXBsZVBhcnNlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7CiAKLSAgICBDUERGX1NpbXBsZVBhcnNlcihGWF9CU1RSIHN0cik7CisgIENGWF9CeXRlU3RyaW5nQyBHZXRXb3JkKCk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZ0MJCUdldFdvcmQoKTsKKyAgRlhfQk9PTCBTZWFyY2hUb2tlbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRva2VuKTsKIAotICAgIEZYX0JPT0wJCQkJU2VhcmNoVG9rZW4oRlhfQlNUUiB0b2tlbik7CisgIEZYX0JPT0wgU2tpcFdvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0b2tlbik7CiAKLSAgICBGWF9CT09MCQkJCVNraXBXb3JkKEZYX0JTVFIgdG9rZW4pOworICBGWF9CT09MIEZpbmRUYWdQYWlyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RhcnRfdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBlbmRfdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHN0YXJ0X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZW5kX3Bvcyk7CiAKLSAgICBGWF9CT09MCQkJCUZpbmRUYWdQYWlyKEZYX0JTVFIgc3RhcnRfdG9rZW4sIEZYX0JTVFIgZW5kX3Rva2VuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHN0YXJ0X3BvcywgRlhfRFdPUkQmIGVuZF9wb3MpOworICBGWF9CT09MIEZpbmRUYWdQYXJhbShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRva2VuLCBpbnQgblBhcmFtcyk7CiAKLSAgICBGWF9CT09MCQkJCUZpbmRUYWdQYXJhbShGWF9CU1RSIHRva2VuLCBpbnQgblBhcmFtcyk7CisgIEZYX0RXT1JEIEdldFBvcygpIHsgcmV0dXJuIG1fZHdDdXJQb3M7IH0KIAotICAgIEZYX0RXT1JECQkJR2V0UG9zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2R3Q3VyUG9zOwotICAgIH0KKyAgdm9pZCBTZXRQb3MoRlhfRFdPUkQgcG9zKSB7CisgICAgQVNTRVJUKHBvcyA8PSBtX2R3U2l6ZSk7CisgICAgbV9kd0N1clBvcyA9IHBvczsKKyAgfQogCi0gICAgdm9pZAkJCQlTZXRQb3MoRlhfRFdPUkQgcG9zKQotICAgIHsKLSAgICAgICAgQVNTRVJUKHBvcyA8PSBtX2R3U2l6ZSk7Ci0gICAgICAgIG1fZHdDdXJQb3MgPSBwb3M7Ci0gICAgfQotcHJpdmF0ZToKKyBwcml2YXRlOgorICB2b2lkIFBhcnNlV29yZChjb25zdCB1aW50OF90KiYgcFN0YXJ0LCBGWF9EV09SRCYgZHdTaXplLCBpbnQmIHR5cGUpOwogCi0gICAgdm9pZAkJCQlQYXJzZVdvcmQoRlhfTFBDQllURSYgcFN0YXJ0LCBGWF9EV09SRCYgZHdTaXplLCBpbnQmIHR5cGUpOworICBjb25zdCB1aW50OF90KiBtX3BEYXRhOwogCi0gICAgRlhfTFBDQllURQkJCW1fcERhdGE7CisgIEZYX0RXT1JEIG1fZHdTaXplOwogCi0gICAgRlhfRFdPUkQJCQltX2R3U2l6ZTsKLQotICAgIEZYX0RXT1JECQkJbV9kd0N1clBvczsKKyAgRlhfRFdPUkQgbV9kd0N1clBvczsKIH07Ci1jbGFzcyBDUERGX1N5bnRheFBhcnNlciAKLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfU3ludGF4UGFyc2VyIHsKKyBwdWJsaWM6CisgIENQREZfU3ludGF4UGFyc2VyKCk7CisgIHZpcnR1YWwgfkNQREZfU3ludGF4UGFyc2VyKCk7CiAKLSAgICBDUERGX1N5bnRheFBhcnNlcigpOwotICAgIHZpcnR1YWwgfkNQREZfU3ludGF4UGFyc2VyKCk7CisgIHZvaWQgSW5pdFBhcnNlcihJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzLCBGWF9EV09SRCBIZWFkZXJPZmZzZXQpOwogCi0gICAgdm9pZAkJCQlJbml0UGFyc2VyKElGWF9GaWxlUmVhZCogcEZpbGVBY2Nlc3MsIEZYX0RXT1JEIEhlYWRlck9mZnNldCk7CisgIEZYX0ZJTEVTSVpFIFNhdmVQb3MoKSB7IHJldHVybiBtX1BvczsgfQogCi0gICAgRlhfRklMRVNJWkUJCQlTYXZlUG9zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1BvczsKLSAgICB9CisgIHZvaWQgUmVzdG9yZVBvcyhGWF9GSUxFU0laRSBwb3MpIHsgbV9Qb3MgPSBwb3M7IH0KIAotICAgIHZvaWQJCQkJUmVzdG9yZVBvcyhGWF9GSUxFU0laRSBwb3MpCi0gICAgewotICAgICAgICBtX1BvcyA9IHBvczsKLSAgICB9CisgIENQREZfT2JqZWN0KiBHZXRPYmplY3QoQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlciogcE9iakxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGdlbm51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQQVJTRV9DT05URVhUKiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEZWNyeXB0KTsKIAotICAgIENQREZfT2JqZWN0KgkJR2V0T2JqZWN0KENQREZfSW5kaXJlY3RPYmplY3RzKiBwT2JqTGlzdCwgRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0sIHN0cnVjdCBQQVJTRV9DT05URVhUKiBwQ29udGV4dCA9IE5VTEwsIEZYX0JPT0wgYkRlY3J5cHQgPSBUUlVFKTsKKyAgQ1BERl9PYmplY3QqIEdldE9iamVjdEJ5U3RyaWN0KENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIqIHBPYmpMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZ2VubnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSU0VfQ09OVEVYVCogcENvbnRleHQpOwogCisgIGludCBHZXREaXJlY3ROdW0oKTsKIAotICAgIENQREZfT2JqZWN0KgkJR2V0T2JqZWN0QnlTdHJpY3QoQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBPYmpMaXN0LCBGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSwgc3RydWN0IFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0ID0gTlVMTCk7CisgIENGWF9CeXRlU3RyaW5nIEdldFN0cmluZyhGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSk7CiAKLSAgICBpbnQJCQkJCUdldERpcmVjdE51bSgpOworICBDRlhfQnl0ZVN0cmluZyBHZXROYW1lKCk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJR2V0U3RyaW5nKEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0S2V5d29yZCgpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCUdldE5hbWUoKTsKKyAgdm9pZCBHZXRCaW5hcnkodWludDhfdCogYnVmZmVyLCBGWF9EV09SRCBzaXplKTsKIAotICAgIENGWF9CeXRlU3RyaW5nCQlHZXRLZXl3b3JkKCk7CisgIHZvaWQgVG9OZXh0TGluZSgpOwogCi0gICAgdm9pZAkJCQlHZXRCaW5hcnkoRlhfQllURSogYnVmZmVyLCBGWF9EV09SRCBzaXplKTsKKyAgdm9pZCBUb05leHRXb3JkKCk7CiAKLSAgICB2b2lkCQkJCVRvTmV4dExpbmUoKTsKKyAgRlhfQk9PTCBTZWFyY2hXb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgd29yZCwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYldob2xlV29yZCwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZvcndhcmQsCisgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBsaW1pdCk7CiAKLSAgICB2b2lkCQkJCVRvTmV4dFdvcmQoKTsKKyAgaW50IFNlYXJjaE11bHRpV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYldob2xlV29yZCwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBsaW1pdCk7CiAKLSAgICBGWF9CT09MCQkJCVNlYXJjaFdvcmQoRlhfQlNUUiB3b3JkLCBGWF9CT09MIGJXaG9sZVdvcmQsIEZYX0JPT0wgYkZvcndhcmQsIEZYX0ZJTEVTSVpFIGxpbWl0KTsKKyAgRlhfRklMRVNJWkUgRmluZFRhZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRhZywgRlhfRklMRVNJWkUgbGltaXQpOwogCi0gICAgaW50CQkJCQlTZWFyY2hNdWx0aVdvcmQoRlhfQlNUUiB3b3JkcywgRlhfQk9PTCBiV2hvbGVXb3JkLCBGWF9GSUxFU0laRSBsaW1pdCk7CisgIHZvaWQgU2V0RW5jcnlwdChDUERGX0NyeXB0b0hhbmRsZXIqIHBDcnlwdG9IYW5kbGVyKSB7CisgICAgbV9wQ3J5cHRvSGFuZGxlci5yZXNldChwQ3J5cHRvSGFuZGxlcik7CisgIH0KIAotICAgIEZYX0ZJTEVTSVpFCQkJRmluZFRhZyhGWF9CU1RSIHRhZywgRlhfRklMRVNJWkUgbGltaXQpOworICBGWF9CT09MIElzRW5jcnlwdGVkKCkgeyByZXR1cm4gbV9wQ3J5cHRvSGFuZGxlciAhPSBOVUxMOyB9CiAKLSAgICB2b2lkCQkJCVNldEVuY3J5cHQoQ1BERl9DcnlwdG9IYW5kbGVyKiBwQ3J5cHRvSGFuZGxlcikKLSAgICB7Ci0gICAgICAgIG1fcENyeXB0b0hhbmRsZXIgPSBwQ3J5cHRvSGFuZGxlcjsKLSAgICB9CisgIEZYX0JPT0wgR2V0Q2hhckF0KEZYX0ZJTEVTSVpFIHBvcywgdWludDhfdCYgY2gpOwogCi0gICAgRlhfQk9PTAkJCQlJc0VuY3J5cHRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wQ3J5cHRvSGFuZGxlciAhPSBOVUxMOwotICAgIH0KKyAgRlhfQk9PTCBSZWFkQmxvY2sodWludDhfdCogcEJ1ZiwgRlhfRFdPUkQgc2l6ZSk7CiAKLSAgICBGWF9CT09MCQkJCUdldENoYXJBdChGWF9GSUxFU0laRSBwb3MsIEZYX0JZVEUmIGNoKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0TmV4dFdvcmQoYm9vbCogYklzTnVtYmVyKTsKIAotICAgIEZYX0JPT0wJCQkJUmVhZEJsb2NrKEZYX0JZVEUqIHBCdWYsIEZYX0RXT1JEIHNpemUpOworIHByb3RlY3RlZDoKKyAgZnJpZW5kIGNsYXNzIENQREZfUGFyc2VyOworICBmcmllbmQgY2xhc3MgQ1BERl9EYXRhQXZhaWw7CisgIGZyaWVuZCBjbGFzcyBmcGRmX3BhcnNlcl9wYXJzZXJfUmVhZEhleFN0cmluZ19UZXN0OwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCUdldE5leHRXb3JkKEZYX0JPT0wmIGJJc051bWJlcik7Ci1wcm90ZWN0ZWQ6Ci0gICAgc3RhdGljIGNvbnN0IGludCBrUGFyc2VyTWF4UmVjdXJzaW9uRGVwdGggPSA2NDsKLSAgICBzdGF0aWMgaW50IHNfQ3VycmVudFJlY3Vyc2lvbkRlcHRoOworICBzdGF0aWMgY29uc3QgaW50IGtQYXJzZXJNYXhSZWN1cnNpb25EZXB0aCA9IDY0OworICBzdGF0aWMgaW50IHNfQ3VycmVudFJlY3Vyc2lvbkRlcHRoOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCUdldE5leHRDaGFyKEZYX0JZVEUmIGNoKTsKKyAgdmlydHVhbCBGWF9CT09MIEdldE5leHRDaGFyKHVpbnQ4X3QmIGNoKTsKIAotICAgIEZYX0JPT0wJCQkJR2V0Q2hhckF0QmFja3dhcmQoRlhfRklMRVNJWkUgcG9zLCBGWF9CWVRFJiBjaCk7CisgIEZYX0JPT0wgR2V0Q2hhckF0QmFja3dhcmQoRlhfRklMRVNJWkUgcG9zLCB1aW50OF90JiBjaCk7CiAKLSAgICB2b2lkCQkJCUdldE5leHRXb3JkKCk7CisgIHZvaWQgR2V0TmV4dFdvcmRJbnRlcm5hbChib29sKiBiSXNOdW1iZXIpOwogCi0gICAgRlhfQk9PTAkJCQlJc1dob2xlV29yZChGWF9GSUxFU0laRSBzdGFydHBvcywgRlhfRklMRVNJWkUgbGltaXQsIEZYX0xQQ0JZVEUgdGFnLCBGWF9EV09SRCB0YWdsZW4pOworICBib29sIElzV2hvbGVXb3JkKEZYX0ZJTEVTSVpFIHN0YXJ0cG9zLAorICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIGxpbWl0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdGFnLAorICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgY2hlY2tLZXl3b3JkKTsKIAotICAgIENGWF9CeXRlU3RyaW5nCQlSZWFkU3RyaW5nKCk7CisgIENGWF9CeXRlU3RyaW5nIFJlYWRTdHJpbmcoKTsKIAotICAgIENGWF9CeXRlU3RyaW5nCQlSZWFkSGV4U3RyaW5nKCk7CisgIENGWF9CeXRlU3RyaW5nIFJlYWRIZXhTdHJpbmcoKTsKIAotICAgIENQREZfU3RyZWFtKgkJUmVhZFN0cmVhbShDUERGX0RpY3Rpb25hcnkqIHBEaWN0LCBQQVJTRV9DT05URVhUKiBwQ29udGV4dCwgRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0pOworICB1bnNpZ25lZCBpbnQgUmVhZEVPTE1hcmtlcnMoRlhfRklMRVNJWkUgcG9zKTsKIAotICAgIEZYX0ZJTEVTSVpFCQkJbV9Qb3M7CisgIENQREZfU3RyZWFtKiBSZWFkU3RyZWFtKENQREZfRGljdGlvbmFyeSogcERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGdlbm51bSk7CiAKLSAgICBGWF9CT09MCQkJCW1fYkZpbGVTdHJlYW07CisgIEZYX0ZJTEVTSVpFIG1fUG9zOwogCi0gICAgaW50CQkJCQltX01ldGFkYXRhT2JqbnVtOworICBGWF9CT09MIG1fYkZpbGVTdHJlYW07CiAKLSAgICBJRlhfRmlsZVJlYWQqCQltX3BGaWxlQWNjZXNzOworICBpbnQgbV9NZXRhZGF0YU9iam51bTsKIAotICAgIEZYX0RXT1JECQkJbV9IZWFkZXJPZmZzZXQ7CisgIElGWF9GaWxlUmVhZCogbV9wRmlsZUFjY2VzczsKIAotICAgIEZYX0ZJTEVTSVpFCQkJbV9GaWxlTGVuOworICBGWF9EV09SRCBtX0hlYWRlck9mZnNldDsKIAotICAgIEZYX0JZVEUqCQkJbV9wRmlsZUJ1ZjsKKyAgRlhfRklMRVNJWkUgbV9GaWxlTGVuOwogCi0gICAgRlhfRFdPUkQJCQltX0J1ZlNpemU7CisgIHVpbnQ4X3QqIG1fcEZpbGVCdWY7CiAKLSAgICBGWF9GSUxFU0laRQkJCW1fQnVmT2Zmc2V0OworICBGWF9EV09SRCBtX0J1ZlNpemU7CiAKLSAgICBDUERGX0NyeXB0b0hhbmRsZXIqCW1fcENyeXB0b0hhbmRsZXI7CisgIEZYX0ZJTEVTSVpFIG1fQnVmT2Zmc2V0OwogCi0gICAgRlhfQllURQkJCQltX1dvcmRCdWZmZXJbMjU3XTsKKyAgc3RkOjp1bmlxdWVfcHRyPENQREZfQ3J5cHRvSGFuZGxlcj4gbV9wQ3J5cHRvSGFuZGxlcjsKIAotICAgIEZYX0RXT1JECQkJbV9Xb3JkU2l6ZTsKKyAgdWludDhfdCBtX1dvcmRCdWZmZXJbMjU3XTsKIAotICAgIEZYX0JPT0wJCQkJbV9iSXNOdW1iZXI7CisgIEZYX0RXT1JEIG1fV29yZFNpemU7CiAKLSAgICBGWF9GSUxFU0laRQkJCW1fZHdXb3JkUG9zOwotICAgIGZyaWVuZCBjbGFzcwkJQ1BERl9QYXJzZXI7Ci0gICAgZnJpZW5kIGNsYXNzCQlDUERGX0RhdGFBdmFpbDsKKyAgRlhfRklMRVNJWkUgbV9kd1dvcmRQb3M7CiB9OwogCi0jZGVmaW5lIFBERlBBUlNFX1RZUEVPTkxZCTEKLSNkZWZpbmUgUERGUEFSU0VfTk9TVFJFQU0JMgorI2RlZmluZSBQREZQQVJTRV9UWVBFT05MWSAxCisjZGVmaW5lIFBERlBBUlNFX05PU1RSRUFNIDIKIHN0cnVjdCBQQVJTRV9DT05URVhUIHsKLQotICAgIEZYX0JPT0wJCW1fRmxhZ3M7Ci0KLSAgICBGWF9GSUxFU0laRQltX0RpY3RTdGFydDsKLQotICAgIEZYX0ZJTEVTSVpFCW1fRGljdEVuZDsKLQotICAgIEZYX0ZJTEVTSVpFCW1fRGF0YVN0YXJ0OwotCi0gICAgRlhfRklMRVNJWkUJbV9EYXRhRW5kOworICB1aW50MzJfdCBtX0ZsYWdzOworICBGWF9GSUxFU0laRSBtX0RpY3RTdGFydDsKKyAgRlhfRklMRVNJWkUgbV9EaWN0RW5kOworICBGWF9GSUxFU0laRSBtX0RhdGFTdGFydDsKKyAgRlhfRklMRVNJWkUgbV9EYXRhRW5kOwogfTsKIAotI2RlZmluZSBQREZQQVJTRV9FUlJPUl9TVUNDRVNTCQkwCi0jZGVmaW5lIFBERlBBUlNFX0VSUk9SX0ZJTEUJCQkxCi0jZGVmaW5lIFBERlBBUlNFX0VSUk9SX0ZPUk1BVAkJMgotI2RlZmluZSBQREZQQVJTRV9FUlJPUl9QQVNTV09SRAkJMwotI2RlZmluZSBQREZQQVJTRV9FUlJPUl9IQU5ETEVSCQk0Ci0jZGVmaW5lIFBERlBBUlNFX0VSUk9SX0NFUlQJCQk1CisjZGVmaW5lIFBERlBBUlNFX0VSUk9SX1NVQ0NFU1MgMAorI2RlZmluZSBQREZQQVJTRV9FUlJPUl9GSUxFIDEKKyNkZWZpbmUgUERGUEFSU0VfRVJST1JfRk9STUFUIDIKKyNkZWZpbmUgUERGUEFSU0VfRVJST1JfUEFTU1dPUkQgMworI2RlZmluZSBQREZQQVJTRV9FUlJPUl9IQU5ETEVSIDQKKyNkZWZpbmUgUERGUEFSU0VfRVJST1JfQ0VSVCA1CiAKLWNsYXNzIENQREZfUGFyc2VyCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9QYXJzZXIoKTsKLSAgICB+Q1BERl9QYXJzZXIoKTsKK2NsYXNzIENQREZfUGFyc2VyIHsKKyBwdWJsaWM6CisgIENQREZfUGFyc2VyKCk7CisgIH5DUERGX1BhcnNlcigpOwogCi0gICAgRlhfRFdPUkQJCQlTdGFydFBhcnNlKEZYX0xQQ1NUUiBmaWxlbmFtZSwgRlhfQk9PTCBiUmVQYXJzZSA9IEZBTFNFKTsKLSAgICBGWF9EV09SRAkJCVN0YXJ0UGFyc2UoRlhfTFBDV1NUUiBmaWxlbmFtZSwgRlhfQk9PTCBiUmVQYXJzZSA9IEZBTFNFKTsKLSAgICBGWF9EV09SRAkJCVN0YXJ0UGFyc2UoSUZYX0ZpbGVSZWFkKiBwRmlsZSwgRlhfQk9PTCBiUmVQYXJzZSA9IEZBTFNFLCBGWF9CT09MIGJPd25GaWxlUmVhZCA9IFRSVUUpOworICBGWF9EV09SRCBTdGFydFBhcnNlKElGWF9GaWxlUmVhZCogcEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVQYXJzZSA9IEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk93bkZpbGVSZWFkID0gVFJVRSk7CiAKLSAgICB2b2lkCQkJCUNsb3NlUGFyc2VyKEZYX0JPT0wgYlJlUGFyc2UgPSBGQUxTRSk7CisgIHZvaWQgQ2xvc2VQYXJzZXIoRlhfQk9PTCBiUmVQYXJzZSA9IEZBTFNFKTsKIAotICAgIEZYX0RXT1JECUdldFBlcm1pc3Npb25zKEZYX0JPT0wgYkNoZWNrUmV2aXNpb24gPSBGQUxTRSk7CisgIEZYX0RXT1JEIEdldFBlcm1pc3Npb25zKEZYX0JPT0wgYkNoZWNrUmV2aXNpb24gPSBGQUxTRSk7CiAKLSAgICBGWF9CT09MCQlJc093bmVyKCk7CisgIEZYX0JPT0wgSXNPd25lcigpOwogCi0gICAgdm9pZAkJCQlTZXRQYXNzd29yZChjb25zdCBGWF9DSEFSKiBwYXNzd29yZCkKLSAgICB7Ci0gICAgICAgIG1fUGFzc3dvcmQgPSBwYXNzd29yZDsKLSAgICB9CisgIHZvaWQgU2V0UGFzc3dvcmQoY29uc3QgRlhfQ0hBUiogcGFzc3dvcmQpIHsgbV9QYXNzd29yZCA9IHBhc3N3b3JkOyB9CiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJR2V0UGFzc3dvcmQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fUGFzc3dvcmQ7Ci0gICAgfQorICBDRlhfQnl0ZVN0cmluZyBHZXRQYXNzd29yZCgpIHsgcmV0dXJuIG1fUGFzc3dvcmQ7IH0KIAotICAgIENQREZfU2VjdXJpdHlIYW5kbGVyKiBHZXRTZWN1cml0eUhhbmRsZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcFNlY3VyaXR5SGFuZGxlcjsKLSAgICB9CisgIENQREZfQ3J5cHRvSGFuZGxlciogR2V0Q3J5cHRvSGFuZGxlcigpIHsKKyAgICByZXR1cm4gbV9TeW50YXgubV9wQ3J5cHRvSGFuZGxlci5nZXQoKTsKKyAgfQogCi0gICAgQ1BERl9DcnlwdG9IYW5kbGVyKglHZXRDcnlwdG9IYW5kbGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1N5bnRheC5tX3BDcnlwdG9IYW5kbGVyOwotICAgIH0KKyAgdm9pZCBTZXRTZWN1cml0eUhhbmRsZXIoQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZvcmNlZCA9IEZBTFNFKTsKIAotICAgIHZvaWQJCQkJU2V0U2VjdXJpdHlIYW5kbGVyKENQREZfU2VjdXJpdHlIYW5kbGVyKiBwU2VjdXJpdHlIYW5kbGVyLCBGWF9CT09MIGJGb3JjZWQgPSBGQUxTRSk7CisgIENQREZfRGljdGlvbmFyeSogR2V0VHJhaWxlcigpIHsgcmV0dXJuIG1fcFRyYWlsZXI7IH0KIAotICAgIENGWF9CeXRlU3RyaW5nCQlHZXRSZWNpcGllbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYnNSZWNpcGllbnQ7Ci0gICAgfQorICBGWF9GSUxFU0laRSBHZXRMYXN0WFJlZk9mZnNldCgpIHsgcmV0dXJuIG1fTGFzdFhSZWZPZmZzZXQ7IH0KIAotICAgIENQREZfRGljdGlvbmFyeSoJR2V0VHJhaWxlcigpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wVHJhaWxlcjsKLSAgICB9CisgIENQREZfRG9jdW1lbnQqIEdldERvY3VtZW50KCkgeyByZXR1cm4gbV9wRG9jdW1lbnQ7IH0KIAotICAgIEZYX0ZJTEVTSVpFCQkJR2V0TGFzdFhSZWZPZmZzZXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fTGFzdFhSZWZPZmZzZXQ7Ci0gICAgfQorICBGWF9EV09SRCBHZXRSb290T2JqTnVtKCk7CisgIEZYX0RXT1JEIEdldEluZm9PYmpOdW0oKTsKKyAgQ1BERl9BcnJheSogR2V0SURBcnJheSgpOwogCi0gICAgQ1BERl9Eb2N1bWVudCoJCUdldERvY3VtZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEb2N1bWVudDsKLSAgICB9CisgIENQREZfRGljdGlvbmFyeSogR2V0RW5jcnlwdERpY3QoKSB7IHJldHVybiBtX3BFbmNyeXB0RGljdDsgfQogCi0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9EaWN0aW9uYXJ5Kj4qIEdldE90aGVyVHJhaWxlcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICZtX1RyYWlsZXJzOwotICAgIH0KKyAgQ1BERl9PYmplY3QqIFBhcnNlSW5kaXJlY3RPYmplY3QoQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlciogcE9iakxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG9iam51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSU0VfQ09OVEVYVCogcENvbnRleHQgPSBOVUxMKTsKKyAgRlhfRFdPUkQgR2V0TGFzdE9iak51bSgpIGNvbnN0OworICBib29sIElzVmFsaWRPYmplY3ROdW1iZXIoRlhfRFdPUkQgb2JqbnVtKSBjb25zdDsKKyAgRlhfQk9PTCBJc0Zvcm1TdHJlYW0oRlhfRFdPUkQgb2JqbnVtLCBGWF9CT09MJiBiRm9ybSk7CiAKLSAgICBGWF9EV09SRAlHZXRSb290T2JqTnVtKCk7Ci0gICAgRlhfRFdPUkQJR2V0SW5mb09iak51bSgpIDsKLSAgICBDUERGX0FycmF5KglHZXRJREFycmF5KCkgOworICBGWF9GSUxFU0laRSBHZXRPYmplY3RPZmZzZXQoRlhfRFdPUkQgb2JqbnVtKSBjb25zdDsKIAotICAgIENQREZfRGljdGlvbmFyeSoJR2V0RW5jcnlwdERpY3QoKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BFbmNyeXB0RGljdDsKLSAgICB9CisgIEZYX0ZJTEVTSVpFIEdldE9iamVjdFNpemUoRlhfRFdPUkQgb2JqbnVtKSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQkJSXNFbmNyeXB0ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdldEVuY3J5cHREaWN0KCkgIT0gTlVMTDsKLSAgICB9CisgIHZvaWQgR2V0SW5kaXJlY3RCaW5hcnkoRlhfRFdPUkQgb2JqbnVtLCB1aW50OF90KiYgcEJ1ZmZlciwgRlhfRFdPUkQmIHNpemUpOwogCisgIElGWF9GaWxlUmVhZCogR2V0RmlsZUFjY2VzcygpIGNvbnN0IHsgcmV0dXJuIG1fU3ludGF4Lm1fcEZpbGVBY2Nlc3M7IH0KIAotICAgIENQREZfT2JqZWN0KgkJUGFyc2VJbmRpcmVjdE9iamVjdChDUERGX0luZGlyZWN0T2JqZWN0cyogcE9iakxpc3QsIEZYX0RXT1JEIG9iam51bSwgUEFSU0VfQ09OVEVYVCogcENvbnRleHQgPSBOVUxMKSA7Ci0gICAgRlhfRFdPUkQJCQlHZXRMYXN0T2JqTnVtKCk7Ci0gICAgRlhfQk9PTAkJCQlJc0Zvcm1TdHJlYW0oRlhfRFdPUkQgb2JqbnVtLCBGWF9CT09MJiBiRm9ybSk7CisgIGludCBHZXRGaWxlVmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fRmlsZVZlcnNpb247IH0KIAotICAgIEZYX0ZJTEVTSVpFCQkJR2V0T2JqZWN0T2Zmc2V0KEZYX0RXT1JEIG9iam51bSk7CisgIEZYX0JPT0wgSXNYUmVmU3RyZWFtKCkgY29uc3QgeyByZXR1cm4gbV9iWFJlZlN0cmVhbTsgfQorICBDUERGX09iamVjdCogUGFyc2VJbmRpcmVjdE9iamVjdEF0KENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIqIHBPYmpMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSU0VfQ09OVEVYVCogcENvbnRleHQpOwogCi0gICAgRlhfRklMRVNJWkUJCQlHZXRPYmplY3RTaXplKEZYX0RXT1JEIG9iam51bSk7CisgIENQREZfT2JqZWN0KiBQYXJzZUluZGlyZWN0T2JqZWN0QXRCeVN0cmljdCgKKyAgICAgIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIqIHBPYmpMaXN0LAorICAgICAgRlhfRklMRVNJWkUgcG9zLAorICAgICAgRlhfRFdPUkQgb2JqbnVtLAorICAgICAgUEFSU0VfQ09OVEVYVCogcENvbnRleHQsCisgICAgICBGWF9GSUxFU0laRSogcFJlc3VsdFBvcyk7CiAKLSAgICBpbnQJCQkJCUdldE9iamVjdFZlcnNpb24oRlhfRFdPUkQgb2JqbnVtKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fT2JqVmVyc2lvbltvYmpudW1dOwotICAgIH0KKyAgRlhfRFdPUkQgU3RhcnRBc3luUGFyc2UoSUZYX0ZpbGVSZWFkKiBwRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVQYXJzZSA9IEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJPd25GaWxlUmVhZCA9IFRSVUUpOwogCi0gICAgdm9pZAkJCQlHZXRJbmRpcmVjdEJpbmFyeShGWF9EV09SRCBvYmpudW0sIEZYX0JZVEUqJiBwQnVmZmVyLCBGWF9EV09SRCYgc2l6ZSk7CisgIEZYX0RXT1JEIEdldEZpcnN0UGFnZU5vKCkgeyByZXR1cm4gbV9kd0ZpcnN0UGFnZU5vOyB9CiAKLSAgICBGWF9CT09MCQkJCUdldEZpbGVTdHJlYW1PcHRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fU3ludGF4Lm1fYkZpbGVTdHJlYW07Ci0gICAgfQorIHByb3RlY3RlZDoKKyAgQ1BERl9PYmplY3QqIFBhcnNlRGlyZWN0KENQREZfT2JqZWN0KiBwT2JqKTsKIAotICAgIHZvaWQJCQkJU2V0RmlsZVN0cmVhbU9wdGlvbihGWF9CT09MIGIpCi0gICAgewotICAgICAgICBtX1N5bnRheC5tX2JGaWxlU3RyZWFtID0gYjsKLSAgICB9CisgIEZYX0JPT0wgTG9hZEFsbENyb3NzUmVmVjQoRlhfRklMRVNJWkUgcG9zKTsKIAotICAgIElGWF9GaWxlUmVhZCoJCUdldEZpbGVBY2Nlc3MoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fU3ludGF4Lm1fcEZpbGVBY2Nlc3M7Ci0gICAgfQorICBGWF9CT09MIExvYWRBbGxDcm9zc1JlZlY1KEZYX0ZJTEVTSVpFIHBvcyk7CiAKLSAgICBpbnQJCQkJCUdldEZpbGVWZXJzaW9uKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0ZpbGVWZXJzaW9uOwotICAgIH0KKyAgYm9vbCBMb2FkQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSBwb3MsIEZYX0ZJTEVTSVpFIHN0cmVhbXBvcywgRlhfQk9PTCBiU2tpcCk7CiAKLSAgICBGWF9CT09MCQkJCUlzWFJlZlN0cmVhbSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9iWFJlZlN0cmVhbTsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqCQlQYXJzZUluZGlyZWN0T2JqZWN0QXQoQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBPYmpMaXN0LCBGWF9GSUxFU0laRSBwb3MsIEZYX0RXT1JEIG9iam51bSwKLSAgICAgICAgICAgIHN0cnVjdCBQQVJTRV9DT05URVhUKiBwQ29udGV4dCk7CisgIEZYX0JPT0wgTG9hZENyb3NzUmVmVjUoRlhfRklMRVNJWkUqIHBvcywgRlhfQk9PTCBiTWFpblhSZWYpOwogCi0gICAgQ1BERl9PYmplY3QqCQlQYXJzZUluZGlyZWN0T2JqZWN0QXRCeVN0cmljdChDUERGX0luZGlyZWN0T2JqZWN0cyogcE9iakxpc3QsIEZYX0ZJTEVTSVpFIHBvcywgRlhfRFdPUkQgb2JqbnVtLAotICAgICAgICAgICAgc3RydWN0IFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0LCBGWF9GSUxFU0laRSAqcFJlc3VsdFBvcyk7CisgIENQREZfRGljdGlvbmFyeSogTG9hZFRyYWlsZXJWNCgpOwogCi0gICAgRlhfRFdPUkQJCQlTdGFydEFzeW5QYXJzZShJRlhfRmlsZVJlYWQqIHBGaWxlLCBGWF9CT09MIGJSZVBhcnNlID0gRkFMU0UsIEZYX0JPT0wgYk93bkZpbGVSZWFkID0gVFJVRSk7CisgIEZYX0JPT0wgUmVidWlsZENyb3NzUmVmKCk7CiAKLSAgICBGWF9EV09SRAkJCUdldEZpcnN0UGFnZU5vKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2R3Rmlyc3RQYWdlTm87Ci0gICAgfQotcHJvdGVjdGVkOgotICAgIENQREZfRG9jdW1lbnQqCQltX3BEb2N1bWVudDsKKyAgRlhfRFdPUkQgU2V0RW5jcnlwdEhhbmRsZXIoKTsKIAotICAgIENQREZfU3ludGF4UGFyc2VyCW1fU3ludGF4OwotICAgIEZYX0JPT0wJCQkJbV9iT3duRmlsZVJlYWQ7Ci0gICAgQ1BERl9PYmplY3QqCQlQYXJzZURpcmVjdChDUERGX09iamVjdCogcE9iaik7CisgIHZvaWQgUmVsZWFzZUVuY3J5cHRIYW5kbGVyKCk7CiAKLSAgICBGWF9CT09MCQkJCUxvYWRBbGxDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHBvcyk7CisgIEZYX0JPT0wgTG9hZExpbmVhcml6ZWRBbGxDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHBvcywgRlhfRFdPUkQgZHdPYmpDb3VudCk7CiAKLSAgICBGWF9CT09MCQkJCUxvYWRBbGxDcm9zc1JlZlY1KEZYX0ZJTEVTSVpFIHBvcyk7CisgIEZYX0JPT0wgTG9hZExpbmVhcml6ZWRDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHBvcywgRlhfRFdPUkQgZHdPYmpDb3VudCk7CiAKLSAgICBGWF9CT09MCQkJCUxvYWRDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHBvcywgRlhfRklMRVNJWkUgc3RyZWFtcG9zLCBGWF9CT09MIGJTa2lwLCBGWF9CT09MIGJGaXJzdCk7CisgIEZYX0JPT0wgTG9hZExpbmVhcml6ZWRBbGxDcm9zc1JlZlY1KEZYX0ZJTEVTSVpFIHBvcyk7CiAKLSAgICBGWF9CT09MCQkJCUxvYWRDcm9zc1JlZlY1KEZYX0ZJTEVTSVpFIHBvcywgRlhfRklMRVNJWkUmIHByZXYsIEZYX0JPT0wgYk1haW5YUmVmKTsKKyAgRlhfRFdPUkQgTG9hZExpbmVhcml6ZWRNYWluWFJlZlRhYmxlKCk7CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqCUxvYWRUcmFpbGVyVjQoKTsKKyAgQ1BERl9TdHJlYW1BY2MqIEdldE9iamVjdFN0cmVhbShGWF9EV09SRCBudW1iZXIpOwogCi0gICAgRlhfQk9PTAkJCQlSZWJ1aWxkQ3Jvc3NSZWYoKTsKKyAgRlhfQk9PTCBJc0xpbmVhcml6ZWRGaWxlKElGWF9GaWxlUmVhZCogcEZpbGVBY2Nlc3MsIEZYX0RXT1JEIG9mZnNldCk7CiAKLSAgICBGWF9EV09SRAkJCVNldEVuY3J5cHRIYW5kbGVyKCk7CisgIGJvb2wgRmluZFBvc0luT2Zmc2V0cyhGWF9GSUxFU0laRSBwb3MpIGNvbnN0OwogCi0gICAgdm9pZAkJCQlSZWxlYXNlRW5jcnlwdEhhbmRsZXIoKTsKKyAgdm9pZCBTZXRFbmNyeXB0RGljdGlvbmFyeShDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKIAotICAgIEZYX0JPT0wJCQkJTG9hZExpbmVhcml6ZWRBbGxDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHBvcywgRlhfRFdPUkQgZHdPYmpDb3VudCk7CisgIEZYX0ZJTEVTSVpFIEdldE9iamVjdFBvc2l0aW9uT3JaZXJvKEZYX0RXT1JEIG9iam51bSkgY29uc3Q7CisgIHZvaWQgU2hyaW5rT2JqZWN0TWFwKEZYX0RXT1JEIHNpemUpOwogCi0gICAgRlhfQk9PTAkJCQlMb2FkTGluZWFyaXplZENyb3NzUmVmVjQoRlhfRklMRVNJWkUgcG9zLCBGWF9EV09SRCBkd09iakNvdW50KTsKKyAgQ1BERl9Eb2N1bWVudCogbV9wRG9jdW1lbnQ7CiAKLSAgICBGWF9CT09MCQkJCUxvYWRMaW5lYXJpemVkQWxsQ3Jvc3NSZWZWNShGWF9GSUxFU0laRSBwb3MpOworICBDUERGX1N5bnRheFBhcnNlciBtX1N5bnRheDsKKyAgRlhfQk9PTCBtX2JPd25GaWxlUmVhZDsKKyAgaW50IG1fRmlsZVZlcnNpb247CiAKLSAgICBGWF9EV09SRAkJCUxvYWRMaW5lYXJpemVkTWFpblhSZWZUYWJsZSgpOworICBDUERGX0RpY3Rpb25hcnkqIG1fcFRyYWlsZXI7CiAKLSAgICBDRlhfTWFwUHRyVG9QdHIJCW1fT2JqZWN0U3RyZWFtTWFwOworICBDUERGX0RpY3Rpb25hcnkqIG1fcEVuY3J5cHREaWN0OwogCi0gICAgQ1BERl9TdHJlYW1BY2MqCQlHZXRPYmplY3RTdHJlYW0oRlhfRFdPUkQgbnVtYmVyKTsKKyAgRlhfRklMRVNJWkUgbV9MYXN0WFJlZk9mZnNldDsKIAotICAgIEZYX0JPT0wJCQkJSXNMaW5lYXJpemVkRmlsZShJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzLCBGWF9EV09SRCBvZmZzZXQpOworICBGWF9CT09MIG1fYlhSZWZTdHJlYW07CiAKKyAgc3RkOjp1bmlxdWVfcHRyPENQREZfU2VjdXJpdHlIYW5kbGVyPiBtX3BTZWN1cml0eUhhbmRsZXI7CiAKKyAgRlhfQk9PTCBtX2JGb3JjZVVzZVNlY3VyaXR5SGFuZGxlcjsKIAotICAgIGludAkJCQkJbV9GaWxlVmVyc2lvbjsKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9ic1JlY2lwaWVudDsKIAotICAgIENQREZfRGljdGlvbmFyeSoJbV9wVHJhaWxlcjsKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9GaWxlUGF0aDsKIAotICAgIENQREZfRGljdGlvbmFyeSoJbV9wRW5jcnlwdERpY3Q7Ci0gICAgdm9pZCBTZXRFbmNyeXB0RGljdGlvbmFyeShDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9QYXNzd29yZDsKIAotICAgIEZYX0ZJTEVTSVpFCQkJbV9MYXN0WFJlZk9mZnNldDsKKyAgc3RydWN0IE9iamVjdEluZm8geworICAgIE9iamVjdEluZm8oKSA6IHBvcygwKSB7fQogCi0gICAgRlhfQk9PTAkJCQltX2JYUmVmU3RyZWFtOwotCi0KLSAgICBDUERGX1NlY3VyaXR5SGFuZGxlcioJbV9wU2VjdXJpdHlIYW5kbGVyOwotCi0gICAgRlhfQk9PTAkJCQkJbV9iRm9yY2VVc2VTZWN1cml0eUhhbmRsZXI7Ci0KLSAgICBDRlhfQnl0ZVN0cmluZwkJCW1fYnNSZWNpcGllbnQ7Ci0KLSAgICBDRlhfQnl0ZVN0cmluZwkJbV9GaWxlUGF0aDsKLQotICAgIENGWF9CeXRlU3RyaW5nCQltX1Bhc3N3b3JkOwotCi0gICAgQ0ZYX0ZpbGVTaXplQXJyYXkJbV9Dcm9zc1JlZjsKLQotICAgIENGWF9CeXRlQXJyYXkJCW1fVjVUeXBlOwotCi0gICAgQ0ZYX0ZpbGVTaXplQXJyYXkJbV9Tb3J0ZWRPZmZzZXQ7Ci0KLSAgICBDRlhfV29yZEFycmF5CQltX09ialZlcnNpb247Ci0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9EaWN0aW9uYXJ5ICo+CW1fVHJhaWxlcnM7Ci0KLSAgICBGWF9CT09MCQkJCW1fYlZlcnNpb25VcGRhdGVkOwotCi0gICAgQ1BERl9PYmplY3QqCQltX3BMaW5lYXJpemVkOwotCi0gICAgRlhfRFdPUkQJCQltX2R3Rmlyc3RQYWdlTm87Ci0KLSAgICBGWF9EV09SRAkJCW1fZHdYcmVmU3RhcnRPYmpOdW07Ci0gICAgZnJpZW5kIGNsYXNzCQlDUERGX0NyZWF0b3I7Ci0gICAgZnJpZW5kIGNsYXNzCQlDUERGX0RhdGFBdmFpbDsKLX07Ci0jZGVmaW5lIEZYQ0lQSEVSX05PTkUJMAotI2RlZmluZSBGWENJUEhFUl9SQzQJMQotI2RlZmluZSBGWENJUEhFUl9BRVMJMgotI2RlZmluZSBGWENJUEhFUl9BRVMyICAgMwotY2xhc3MgQ1BERl9TZWN1cml0eUhhbmRsZXIgCi17Ci1wdWJsaWM6Ci0KLSAgICB2aXJ0dWFsIH5DUERGX1NlY3VyaXR5SGFuZGxlcigpIHt9Ci0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9uSW5pdChDUERGX1BhcnNlciogcFBhcnNlciwgQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QpID0gMDsKLQotICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0UGVybWlzc2lvbnMoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzT3duZXIoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldENyeXB0SW5mbyhpbnQmIGNpcGhlciwgRlhfTFBDQllURSYgYnVmZmVyLCBpbnQmIGtleWxlbikgPSAwOwotCi0gICAgdmlydHVhbCBGWF9CT09MCQlJc01ldGFkYXRhRW5jcnlwdGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLQotICAgIHZpcnR1YWwgQ1BERl9DcnlwdG9IYW5kbGVyKglDcmVhdGVDcnlwdG9IYW5kbGVyKCkgPSAwOwotCi0gICAgdmlydHVhbCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKiBHZXRTdGFuZGFyZEhhbmRsZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfTsKLSNkZWZpbmUgUERGX0VOQ1JZUFRfQ09OVEVOVAkJCQkwCi1jbGFzcyBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyIDogcHVibGljIENQREZfU2VjdXJpdHlIYW5kbGVyCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcigpOwotCi0gICAgdmlydHVhbCB+Q1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcigpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJT25Jbml0KENQREZfUGFyc2VyKiBwUGFyc2VyLCBDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCk7Ci0gICAgdmlydHVhbCBGWF9EV09SRAlHZXRQZXJtaXNzaW9ucygpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJSXNPd25lcigpCi0gICAgewotICAgICAgICByZXR1cm4gbV9iT3duZXI7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0Q3J5cHRJbmZvKGludCYgY2lwaGVyLCBGWF9MUENCWVRFJiBidWZmZXIsIGludCYga2V5bGVuKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUlzTWV0YWRhdGFFbmNyeXB0ZWQoKTsKLSAgICB2aXJ0dWFsIENQREZfQ3J5cHRvSGFuZGxlcioJQ3JlYXRlQ3J5cHRvSGFuZGxlcigpOwotICAgIHZpcnR1YWwgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlciogR2V0U3RhbmRhcmRIYW5kbGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHZvaWQJCQkJT25DcmVhdGUoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIENQREZfQXJyYXkqIHBJZEFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBDQllURSB1c2VyX3Bhc3MsIEZYX0RXT1JEIHVzZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQ0JZVEUgb3duZXJfcGFzcywgRlhfRFdPUkQgb3duZXJfc2l6ZSwgRlhfRFdPUkQgdHlwZSA9IFBERl9FTkNSWVBUX0NPTlRFTlQpOwotCi0gICAgdm9pZAkJCQlPbkNyZWF0ZShDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgQ1BERl9BcnJheSogcElkQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUENCWVRFIHVzZXJfcGFzcywgRlhfRFdPUkQgdXNlcl9zaXplLCBGWF9EV09SRCB0eXBlID0gUERGX0VOQ1JZUFRfQ09OVEVOVCk7Ci0KLSAgICBDRlhfQnl0ZVN0cmluZwkJR2V0VXNlclBhc3N3b3JkKEZYX0xQQ0JZVEUgb3duZXJfcGFzcywgRlhfRFdPUkQgcGFzc19zaXplKTsKLSAgICBDRlhfQnl0ZVN0cmluZwkJR2V0VXNlclBhc3N3b3JkKEZYX0xQQ0JZVEUgb3duZXJfcGFzcywgRlhfRFdPUkQgcGFzc19zaXplLCBGWF9JTlQzMiBrZXlfbGVuKTsKLSAgICBpbnQJCQkJCUdldFZlcnNpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fVmVyc2lvbjsKLSAgICB9Ci0gICAgaW50CQkJCQlHZXRSZXZpc2lvbigpCi0gICAgewotICAgICAgICByZXR1cm4gbV9SZXZpc2lvbjsKLSAgICB9Ci0KLSAgICBpbnQJCQkJCUNoZWNrUGFzc3dvcmQoRlhfTFBDQllURSBwYXNzd29yZCwgRlhfRFdPUkQgcGFzc19zaXplLCBGWF9CT09MIGJPd25lciwgRlhfTFBCWVRFIGtleSk7Ci0gICAgaW50CQkJCQlDaGVja1Bhc3N3b3JkKEZYX0xQQ0JZVEUgcGFzc3dvcmQsIEZYX0RXT1JEIHBhc3Nfc2l6ZSwgRlhfQk9PTCBiT3duZXIsIEZYX0xQQllURSBrZXksIGludCBrZXlfbGVuKTsKLXByaXZhdGU6Ci0KLSAgICBpbnQJCQkJCW1fVmVyc2lvbjsKLQotICAgIGludAkJCQkJbV9SZXZpc2lvbjsKLQotICAgIENQREZfUGFyc2VyKgkJbV9wUGFyc2VyOwotCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgltX3BFbmNyeXB0RGljdDsKLQotICAgIEZYX0JPT0wJCQkJTG9hZERpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QpOwotICAgIEZYX0JPT0wJCQkJTG9hZERpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIEZYX0RXT1JEIHR5cGUsIGludCYgY2lwaGVyLCBpbnQmIGtleV9sZW4pOwotCi0gICAgRlhfQk9PTAkJCQlDaGVja1VzZXJQYXNzd29yZChGWF9MUENCWVRFIHBhc3N3b3JkLCBGWF9EV09SRCBwYXNzX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJZ25vcmVFbmNyeXB0TWV0YSwgRlhfTFBCWVRFIGtleSwgRlhfSU5UMzIga2V5X2xlbik7Ci0KLSAgICBGWF9CT09MCQkJCUNoZWNrT3duZXJQYXNzd29yZChGWF9MUENCWVRFIHBhc3N3b3JkLCBGWF9EV09SRCBwYXNzX3NpemUsIEZYX0xQQllURSBrZXksIEZYX0lOVDMyIGtleV9sZW4pOwotICAgIEZYX0JPT0wJCQkJQUVTMjU2X0NoZWNrUGFzc3dvcmQoRlhfTFBDQllURSBwYXNzd29yZCwgRlhfRFdPUkQgc2l6ZSwgRlhfQk9PTCBiT3duZXIsIEZYX0xQQllURSBrZXkpOwotICAgIHZvaWQJCQkJQUVTMjU2X1NldFBhc3N3b3JkKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBGWF9MUENCWVRFIHBhc3N3b3JkLCBGWF9EV09SRCBzaXplLCBGWF9CT09MIGJPd25lciwgRlhfTFBDQllURSBrZXkpOwotICAgIHZvaWQJCQkJQUVTMjU2X1NldFBlcm1zKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBGWF9EV09SRCBwZXJtaXNzaW9uLCBGWF9CT09MIGJFbmNyeXB0TWV0YWRhdGEsIEZYX0xQQ0JZVEUga2V5KTsKLSAgICB2b2lkCQkJCU9uQ3JlYXRlKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBDUERGX0FycmF5KiBwSWRBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQ0JZVEUgdXNlcl9wYXNzLCBGWF9EV09SRCB1c2VyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUENCWVRFIG93bmVyX3Bhc3MsIEZYX0RXT1JEIG93bmVyX3NpemUsIEZYX0JPT0wgYkRlZmF1bHQsIEZYX0RXT1JEIHR5cGUpOwotICAgIEZYX0JPT0wJCQkJQ2hlY2tTZWN1cml0eShGWF9JTlQzMiBrZXlfbGVuKTsKLQotICAgIEZYX0JPT0wJCQkJbV9iT3duZXI7Ci0KLSAgICBGWF9EV09SRAkJCW1fUGVybWlzc2lvbnM7Ci0KLSAgICBpbnQJCQkJCW1fQ2lwaGVyOwotCi0gICAgRlhfQllURQkJCQltX0VuY3J5cHRLZXlbMzJdOwotCi0gICAgaW50CQkJCQltX0tleUxlbjsKLX07Ci1jbGFzcyBDUERGX0NyeXB0b0hhbmRsZXIgCi17Ci1wdWJsaWM6Ci0KLSAgICB2aXJ0dWFsIH5DUERGX0NyeXB0b0hhbmRsZXIoKSB7fQotCi0gICAgdmlydHVhbCBGWF9CT09MCQlJbml0KENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBDUERGX1NlY3VyaXR5SGFuZGxlciogcFNlY3VyaXR5SGFuZGxlcikgPSAwOwotCi0gICAgdmlydHVhbCBGWF9EV09SRAlEZWNyeXB0R2V0U2l6ZShGWF9EV09SRCBzcmNfc2l6ZSkgPSAwOwotCi0gICAgdmlydHVhbCBGWF9MUFZPSUQJRGVjcnlwdFN0YXJ0KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURlY3J5cHRTdHJlYW0oRlhfTFBWT0lEIGNvbnRleHQsIEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURlY3J5cHRGaW5pc2goRlhfTFBWT0lEIGNvbnRleHQsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSA9IDA7Ci0KLQotICAgIHZpcnR1YWwgRlhfRFdPUkQJRW5jcnlwdEdldFNpemUoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCB2ZXJzaW9uLCBGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUVuY3J5cHRDb250ZW50KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgdmVyc2lvbiwgRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgPSAwOworICAgIEZYX0ZJTEVTSVpFIHBvczsKKy8vIFRPRE8odGhlc3RpZyk6IFVzZSBmaWVsZHMgYmVsb3cgaW4gcGxhY2Ugb2YgfG1fVjVUeXBlfCBhbmQgfG1fT2JqVmVyc2lvbnwKKyNpZiAwCisgICAgdWludDhfdCB0eXBlOworICAgIHVpbnQxNl90IGdlbm51bTsKKyNlbmRpZgorICB9OworICBzdGQ6Om1hcDxGWF9EV09SRCwgT2JqZWN0SW5mbz4gbV9PYmplY3RJbmZvOwogCi0gICAgdm9pZAkJCQlEZWNyeXB0KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgdmVyc2lvbiwgQ0ZYX0J5dGVTdHJpbmcmIHN0cik7Ci19OwotY2xhc3MgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXIgOiBwdWJsaWMgQ1BERl9DcnlwdG9IYW5kbGVyCi17Ci1wdWJsaWM6CisgIENGWF9CeXRlQXJyYXkgbV9WNVR5cGU7CisgIENGWF9Xb3JkQXJyYXkgbV9PYmpWZXJzaW9uOwogCi0gICAgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXIoKTsKKyAgQ0ZYX0ZpbGVTaXplQXJyYXkgbV9Tb3J0ZWRPZmZzZXQ7CiAKLSAgICB2aXJ0dWFsIH5DUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcigpOworICBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX0RpY3Rpb25hcnkqPiBtX1RyYWlsZXJzOwogCi0gICAgRlhfQk9PTAkJCQlJbml0KGludCBjaXBoZXIsIEZYX0xQQ0JZVEUga2V5LCBpbnQga2V5bGVuKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUluaXQoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIENQREZfU2VjdXJpdHlIYW5kbGVyKiBwU2VjdXJpdHlIYW5kbGVyKTsKLSAgICB2aXJ0dWFsIEZYX0RXT1JECURlY3J5cHRHZXRTaXplKEZYX0RXT1JEIHNyY19zaXplKTsKLSAgICB2aXJ0dWFsIEZYX0xQVk9JRAlEZWNyeXB0U3RhcnQoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0pOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVjcnlwdFN0cmVhbShGWF9MUFZPSUQgY29udGV4dCwgRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVjcnlwdEZpbmlzaChGWF9MUFZPSUQgY29udGV4dCwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOwotICAgIHZpcnR1YWwgRlhfRFdPUkQJRW5jcnlwdEdldFNpemUoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCB2ZXJzaW9uLCBGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUVuY3J5cHRDb250ZW50KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgdmVyc2lvbiwgRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7Ci1wcm90ZWN0ZWQ6CisgIEZYX0JPT0wgbV9iVmVyc2lvblVwZGF0ZWQ7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCUNyeXB0QmxvY2soRlhfQk9PTCBiRW5jcnlwdCwgRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0sIEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7Ci0gICAgdmlydHVhbCBGWF9MUFZPSUQJQ3J5cHRTdGFydChGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSwgRlhfQk9PTCBiRW5jcnlwdCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlDcnlwdFN0cmVhbShGWF9MUFZPSUQgY29udGV4dCwgRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYsIEZYX0JPT0wgYkVuY3J5cHQpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ3J5cHRGaW5pc2goRlhfTFBWT0lEIGNvbnRleHQsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmLCBGWF9CT09MIGJFbmNyeXB0KTsKKyAgQ1BERl9PYmplY3QqIG1fcExpbmVhcml6ZWQ7CiAKLSAgICBGWF9CWVRFCQkJCW1fRW5jcnlwdEtleVszMl07CisgIEZYX0RXT1JEIG1fZHdGaXJzdFBhZ2VObzsKIAotICAgIGludAkJCQkJbV9LZXlMZW47CisgIEZYX0RXT1JEIG1fZHdYcmVmU3RhcnRPYmpOdW07CiAKLSAgICBpbnQJCQkJCW1fQ2lwaGVyOworICAvLyBBIG1hcCBvZiBvYmplY3QgbnVtYmVycyB0byBpbmRpcmVjdCBzdHJlYW1zLiBNYXAgb3ducyB0aGUgc3RyZWFtcy4KKyAgQ0ZYX01hcFB0clRvUHRyIG1fT2JqZWN0U3RyZWFtTWFwOwogCi0gICAgRlhfTFBCWVRFCQkJbV9wQUVTQ29udGV4dDsKLX07Ci1jbGFzcyBDUERGX1BvaW50IAotewotcHVibGljOgorICAvLyBNYXBwaW5nIG9mIG9iamVjdCBudW1iZXJzIHRvIG9mZnNldHMuIFRoZSBvZmZzZXRzIGFyZSByZWxhdGl2ZSB0byB0aGUgZmlyc3QKKyAgLy8gb2JqZWN0IGluIHRoZSBzdHJlYW0uCisgIHVzaW5nIFN0cmVhbU9iamVjdENhY2hlID0gc3RkOjptYXA8RlhfRFdPUkQsIEZYX0RXT1JEPjsKIAotICAgIENQREZfUG9pbnQoRlhfRkxPQVQgeHgsIEZYX0ZMT0FUIHl5KQotICAgIHsKLSAgICAgICAgeCA9IHh4OwotICAgICAgICB5ID0geXk7Ci0gICAgfQorICAvLyBNYXBwaW5nIG9mIHN0cmVhbXMgdG8gdGhlaXIgb2JqZWN0IGNhY2hlcy4gVGhpcyBpcyB2YWxpZCBhcyBsb25nIGFzIHRoZQorICAvLyBzdHJlYW1zIGluIHxtX09iamVjdFN0cmVhbU1hcHwgYXJlIHZhbGlkLgorICBzdGQ6Om1hcDxDUERGX1N0cmVhbUFjYyosIFN0cmVhbU9iamVjdENhY2hlPiBtX09iakNhY2hlOwogCi0gICAgRlhfRkxPQVQJCQl4OworICAvLyBBbGwgaW5kaXJlY3Qgb2JqZWN0IG51bWJlcnMgdGhhdCBhcmUgYmVpbmcgcGFyc2VkLgorICBzdGQ6OnNldDxGWF9EV09SRD4gbV9QYXJzaW5nT2JqTnVtczsKIAotICAgIEZYX0ZMT0FUCQkJeTsKKyAgZnJpZW5kIGNsYXNzIENQREZfQ3JlYXRvcjsKKyAgZnJpZW5kIGNsYXNzIENQREZfRGF0YUF2YWlsOwogfTsKIAotI2RlZmluZSBDUERGX1JlY3QJCUNGWF9GbG9hdFJlY3QKLSNkZWZpbmUgQ1BERl9NYXRyaXgJCUNGWF9BZmZpbmVNYXRyaXgKLUNGWF9CeXRlU3RyaW5nIFBERl9OYW1lRGVjb2RlKEZYX0JTVFIgb3JpZyk7CisjZGVmaW5lIEZYQ0lQSEVSX05PTkUgMAorI2RlZmluZSBGWENJUEhFUl9SQzQgMQorI2RlZmluZSBGWENJUEhFUl9BRVMgMgorI2RlZmluZSBGWENJUEhFUl9BRVMyIDMKK2NsYXNzIENQREZfU2VjdXJpdHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkNQREZfU2VjdXJpdHlIYW5kbGVyKCkge30KKworICB2aXJ0dWFsIEZYX0JPT0wgT25Jbml0KENQREZfUGFyc2VyKiBwUGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0KSA9IDA7CisKKyAgdmlydHVhbCBGWF9EV09SRCBHZXRQZXJtaXNzaW9ucygpID0gMDsKKworICB2aXJ0dWFsIEZYX0JPT0wgSXNPd25lcigpID0gMDsKKworICB2aXJ0dWFsIEZYX0JPT0wgR2V0Q3J5cHRJbmZvKGludCYgY2lwaGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqJiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBrZXlsZW4pID0gMDsKKworICB2aXJ0dWFsIEZYX0JPT0wgSXNNZXRhZGF0YUVuY3J5cHRlZCgpIHsgcmV0dXJuIFRSVUU7IH0KKworICB2aXJ0dWFsIENQREZfQ3J5cHRvSGFuZGxlciogQ3JlYXRlQ3J5cHRvSGFuZGxlcigpID0gMDsKKworICB2aXJ0dWFsIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXIqIEdldFN0YW5kYXJkSGFuZGxlcigpIHsgcmV0dXJuIE5VTEw7IH0KK307CisjZGVmaW5lIFBERl9FTkNSWVBUX0NPTlRFTlQgMAorY2xhc3MgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlciA6IHB1YmxpYyBDUERGX1NlY3VyaXR5SGFuZGxlciB7CisgcHVibGljOgorICBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKCk7CisgIH5DUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKCkgb3ZlcnJpZGU7CisKKyAgLy8gQ1BERl9TZWN1cml0eUhhbmRsZXIKKyAgRlhfQk9PTCBPbkluaXQoQ1BERl9QYXJzZXIqIHBQYXJzZXIsIENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0KSBvdmVycmlkZTsKKyAgRlhfRFdPUkQgR2V0UGVybWlzc2lvbnMoKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBJc093bmVyKCkgb3ZlcnJpZGUgeyByZXR1cm4gbV9iT3duZXI7IH0KKyAgRlhfQk9PTCBHZXRDcnlwdEluZm8oaW50JiBjaXBoZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqJiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCYga2V5bGVuKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBJc01ldGFkYXRhRW5jcnlwdGVkKCkgb3ZlcnJpZGU7CisgIENQREZfQ3J5cHRvSGFuZGxlciogQ3JlYXRlQ3J5cHRvSGFuZGxlcigpIG92ZXJyaWRlOworICBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKiBHZXRTdGFuZGFyZEhhbmRsZXIoKSBvdmVycmlkZSB7IHJldHVybiB0aGlzOyB9CisKKyAgdm9pZCBPbkNyZWF0ZShDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKKyAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwSWRBcnJheSwKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1c2VyX3Bhc3MsCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgdXNlcl9zaXplLAorICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIG93bmVyX3Bhc3MsCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgb3duZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICBGWF9EV09SRCB0eXBlID0gUERGX0VOQ1JZUFRfQ09OVEVOVCk7CisKKyAgdm9pZCBPbkNyZWF0ZShDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKKyAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwSWRBcnJheSwKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1c2VyX3Bhc3MsCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgdXNlcl9zaXplLAorICAgICAgICAgICAgICAgIEZYX0RXT1JEIHR5cGUgPSBQREZfRU5DUllQVF9DT05URU5UKTsKKworICBDRlhfQnl0ZVN0cmluZyBHZXRVc2VyUGFzc3dvcmQoY29uc3QgdWludDhfdCogb3duZXJfcGFzcywgRlhfRFdPUkQgcGFzc19zaXplKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0VXNlclBhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIG93bmVyX3Bhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBwYXNzX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGtleV9sZW4pOworICBpbnQgR2V0VmVyc2lvbigpIHsgcmV0dXJuIG1fVmVyc2lvbjsgfQorICBpbnQgR2V0UmV2aXNpb24oKSB7IHJldHVybiBtX1JldmlzaW9uOyB9CisKKyAgaW50IENoZWNrUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHBhc3Nfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiT3duZXIsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGtleSk7CisgIGludCBDaGVja1Bhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBwYXNzX3NpemUsCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk93bmVyLAorICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBrZXksCisgICAgICAgICAgICAgICAgICAgIGludCBrZXlfbGVuKTsKKworIHByaXZhdGU6CisgIGludCBtX1ZlcnNpb247CisKKyAgaW50IG1fUmV2aXNpb247CisKKyAgQ1BERl9QYXJzZXIqIG1fcFBhcnNlcjsKKworICBDUERGX0RpY3Rpb25hcnkqIG1fcEVuY3J5cHREaWN0OworCisgIEZYX0JPT0wgTG9hZERpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QpOworICBGWF9CT09MIExvYWREaWN0KENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LAorICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHR5cGUsCisgICAgICAgICAgICAgICAgICAgaW50JiBjaXBoZXIsCisgICAgICAgICAgICAgICAgICAgaW50JiBrZXlfbGVuKTsKKworICBGWF9CT09MIENoZWNrVXNlclBhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHBhc3Nfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJZ25vcmVFbmNyeXB0TWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBrZXlfbGVuKTsKKworICBGWF9CT09MIENoZWNrT3duZXJQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgcGFzc19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qga2V5X2xlbik7CisgIEZYX0JPT0wgQUVTMjU2X0NoZWNrUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJPd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBrZXkpOworICB2b2lkIEFFUzI1Nl9TZXRQYXNzd29yZChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBrZXkpOworICB2b2lkIEFFUzI1Nl9TZXRQZXJtcyhDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgcGVybWlzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRW5jcnlwdE1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBrZXkpOworICB2b2lkIE9uQ3JlYXRlKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LAorICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBJZEFycmF5LAorICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHVzZXJfcGFzcywKKyAgICAgICAgICAgICAgICBGWF9EV09SRCB1c2VyX3NpemUsCisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogb3duZXJfcGFzcywKKyAgICAgICAgICAgICAgICBGWF9EV09SRCBvd25lcl9zaXplLAorICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRlZmF1bHQsCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgdHlwZSk7CisgIEZYX0JPT0wgQ2hlY2tTZWN1cml0eShpbnQzMl90IGtleV9sZW4pOworCisgIEZYX0JPT0wgbV9iT3duZXI7CisKKyAgRlhfRFdPUkQgbV9QZXJtaXNzaW9uczsKKworICBpbnQgbV9DaXBoZXI7CisKKyAgdWludDhfdCBtX0VuY3J5cHRLZXlbMzJdOworCisgIGludCBtX0tleUxlbjsKK307CitjbGFzcyBDUERGX0NyeXB0b0hhbmRsZXIgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+Q1BERl9DcnlwdG9IYW5kbGVyKCkge30KKworICB2aXJ0dWFsIEZYX0JPT0wgSW5pdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIpID0gMDsKKworICB2aXJ0dWFsIEZYX0RXT1JEIERlY3J5cHRHZXRTaXplKEZYX0RXT1JEIHNyY19zaXplKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkKiBEZWNyeXB0U3RhcnQoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0pID0gMDsKKworICB2aXJ0dWFsIEZYX0JPT0wgRGVjcnlwdFN0cmVhbSh2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpID0gMDsKKworICB2aXJ0dWFsIEZYX0JPT0wgRGVjcnlwdEZpbmlzaCh2b2lkKiBjb250ZXh0LCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikgPSAwOworCisgIHZpcnR1YWwgRlhfRFdPUkQgRW5jcnlwdEdldFNpemUoRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSkgPSAwOworCisgIHZpcnR1YWwgRlhfQk9PTCBFbmNyeXB0Q29udGVudChGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKSA9IDA7CisKKyAgdm9pZCBEZWNyeXB0KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgdmVyc2lvbiwgQ0ZYX0J5dGVTdHJpbmcmIHN0cik7Cit9OworY2xhc3MgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXIgOiBwdWJsaWMgQ1BERl9DcnlwdG9IYW5kbGVyIHsKKyBwdWJsaWM6CisgIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyKCk7CisgIH5DUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcigpIG92ZXJyaWRlOworCisgIC8vIENQREZfQ3J5cHRvSGFuZGxlcgorICBGWF9CT09MIEluaXQoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsCisgICAgICAgICAgICAgICBDUERGX1NlY3VyaXR5SGFuZGxlciogcFNlY3VyaXR5SGFuZGxlcikgb3ZlcnJpZGU7CisgIEZYX0RXT1JEIERlY3J5cHRHZXRTaXplKEZYX0RXT1JEIHNyY19zaXplKSBvdmVycmlkZTsKKyAgdm9pZCogRGVjcnlwdFN0YXJ0KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBEZWNyeXB0U3RyZWFtKHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zikgb3ZlcnJpZGU7CisgIEZYX0JPT0wgRGVjcnlwdEZpbmlzaCh2b2lkKiBjb250ZXh0LCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zikgb3ZlcnJpZGU7CisgIEZYX0RXT1JEIEVuY3J5cHRHZXRTaXplKEZYX0RXT1JEIG9iam51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUpIG92ZXJyaWRlOworICBGWF9CT09MIEVuY3J5cHRDb250ZW50KEZYX0RXT1JEIG9iam51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgb3ZlcnJpZGU7CisKKyAgRlhfQk9PTCBJbml0KGludCBjaXBoZXIsIGNvbnN0IHVpbnQ4X3QqIGtleSwgaW50IGtleWxlbik7CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBDcnlwdEJsb2NrKEZYX0JPT0wgYkVuY3J5cHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG9iam51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZ2VubnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpOworICB2aXJ0dWFsIHZvaWQqIENyeXB0U3RhcnQoRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0sIEZYX0JPT0wgYkVuY3J5cHQpOworICB2aXJ0dWFsIEZYX0JPT0wgQ3J5cHRTdHJlYW0odm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRW5jcnlwdCk7CisgIHZpcnR1YWwgRlhfQk9PTCBDcnlwdEZpbmlzaCh2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJFbmNyeXB0KTsKKworICB1aW50OF90IG1fRW5jcnlwdEtleVszMl07CisKKyAgaW50IG1fS2V5TGVuOworCisgIGludCBtX0NpcGhlcjsKKworICB1aW50OF90KiBtX3BBRVNDb250ZXh0OworfTsKK2NsYXNzIENQREZfUG9pbnQgeworIHB1YmxpYzoKKyAgQ1BERl9Qb2ludChGWF9GTE9BVCB4eCwgRlhfRkxPQVQgeXkpIHsKKyAgICB4ID0geHg7CisgICAgeSA9IHl5OworICB9CisKKyAgRlhfRkxPQVQgeDsKKworICBGWF9GTE9BVCB5OworfTsKKworI2RlZmluZSBDUERGX1JlY3QgQ0ZYX0Zsb2F0UmVjdAorQ0ZYX0J5dGVTdHJpbmcgUERGX05hbWVEZWNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvcmlnKTsKIENGWF9CeXRlU3RyaW5nIFBERl9OYW1lRGVjb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvcmlnKTsKIENGWF9CeXRlU3RyaW5nIFBERl9OYW1lRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvcmlnKTsKLUNGWF9CeXRlU3RyaW5nIFBERl9FbmNvZGVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNyYywgRlhfQk9PTCBiSGV4ID0gRkFMU0UpOwotQ0ZYX1dpZGVTdHJpbmcgUERGX0RlY29kZVRleHQoRlhfTFBDQllURSBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgQ0ZYX0NoYXJNYXAqIHBDaGFyTWFwID0gTlVMTCk7Ci1pbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgUERGX0RlY29kZVRleHQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJzdHIsIENGWF9DaGFyTWFwKiBwQ2hhck1hcCA9IE5VTEwpIHsKLSAgICByZXR1cm4gUERGX0RlY29kZVRleHQoKEZYX0xQQ0JZVEUpYnN0ci5jX3N0cigpLCBic3RyLkdldExlbmd0aCgpLCBwQ2hhck1hcCk7CitDRlhfQnl0ZVN0cmluZyBQREZfRW5jb2RlU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkhleCA9IEZBTFNFKTsKK0NGWF9XaWRlU3RyaW5nIFBERl9EZWNvZGVUZXh0KGNvbnN0IHVpbnQ4X3QqIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9DaGFyTWFwKiBwQ2hhck1hcCA9IE5VTEwpOworaW5saW5lIENGWF9XaWRlU3RyaW5nIFBERl9EZWNvZGVUZXh0KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9DaGFyTWFwKiBwQ2hhck1hcCA9IE5VTEwpIHsKKyAgcmV0dXJuIFBERl9EZWNvZGVUZXh0KChjb25zdCB1aW50OF90Kilic3RyLmNfc3RyKCksIGJzdHIuR2V0TGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhck1hcCk7CiB9Ci1DRlhfQnl0ZVN0cmluZyBQREZfRW5jb2RlVGV4dChGWF9MUENXU1RSIHBTdHJpbmcsIGludCBsZW4gPSAtMSwgQ0ZYX0NoYXJNYXAqIHBDaGFyTWFwID0gTlVMTCk7Ci1pbmxpbmUgQ0ZYX0J5dGVTdHJpbmcgUERGX0VuY29kZVRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ciwgQ0ZYX0NoYXJNYXAqIHBDaGFyTWFwID0gTlVMTCkgewotICAgIHJldHVybiBQREZfRW5jb2RlVGV4dChzdHIuY19zdHIoKSwgc3RyLkdldExlbmd0aCgpLCBwQ2hhck1hcCk7CitDRlhfQnl0ZVN0cmluZyBQREZfRW5jb2RlVGV4dChjb25zdCBGWF9XQ0hBUiogcFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9DaGFyTWFwKiBwQ2hhck1hcCA9IE5VTEwpOworaW5saW5lIENGWF9CeXRlU3RyaW5nIFBERl9FbmNvZGVUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0NoYXJNYXAqIHBDaGFyTWFwID0gTlVMTCkgeworICByZXR1cm4gUERGX0VuY29kZVRleHQoc3RyLmNfc3RyKCksIHN0ci5HZXRMZW5ndGgoKSwgcENoYXJNYXApOwogfQogRlhfRkxPQVQgUERGX0NsaXBGbG9hdChGWF9GTE9BVCBmKTsKLWNsYXNzIENGREZfRG9jdW1lbnQgOiBwdWJsaWMgQ1BERl9JbmRpcmVjdE9iamVjdHMKLXsKLXB1YmxpYzoKLSAgICBzdGF0aWMgQ0ZERl9Eb2N1bWVudCogQ3JlYXRlTmV3RG9jKCk7Ci0gICAgc3RhdGljIENGREZfRG9jdW1lbnQqIFBhcnNlRmlsZShJRlhfRmlsZVJlYWQgKnBGaWxlLCBGWF9CT09MIGJPd25GaWxlID0gRkFMU0UpOwotICAgIHN0YXRpYyBDRkRGX0RvY3VtZW50KiBQYXJzZU1lbW9yeShGWF9MUENCWVRFIHBEYXRhLCBGWF9EV09SRCBzaXplKTsKK2NsYXNzIENGREZfRG9jdW1lbnQgOiBwdWJsaWMgQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlciB7CisgcHVibGljOgorICBzdGF0aWMgQ0ZERl9Eb2N1bWVudCogQ3JlYXRlTmV3RG9jKCk7CisgIHN0YXRpYyBDRkRGX0RvY3VtZW50KiBQYXJzZUZpbGUoSUZYX0ZpbGVSZWFkKiBwRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJPd25GaWxlID0gRkFMU0UpOworICBzdGF0aWMgQ0ZERl9Eb2N1bWVudCogUGFyc2VNZW1vcnkoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUpOwogCi0gICAgfkNGREZfRG9jdW1lbnQoKTsKKyAgfkNGREZfRG9jdW1lbnQoKTsKIAotICAgIEZYX0JPT0wJCQkJCVdyaXRlQnVmKENGWF9CeXRlVGV4dEJ1ZiYgYnVmKSBjb25zdDsKKyAgRlhfQk9PTCBXcml0ZUJ1ZihDRlhfQnl0ZVRleHRCdWYmIGJ1ZikgY29uc3Q7CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqCQlHZXRSb290KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BSb290RGljdDsKLSAgICB9CisgIENQREZfRGljdGlvbmFyeSogR2V0Um9vdCgpIGNvbnN0IHsgcmV0dXJuIG1fcFJvb3REaWN0OyB9CiAKLSAgICBDRlhfV2lkZVN0cmluZwkJCUdldFdpbjMyUGF0aCgpIGNvbnN0OwotcHJvdGVjdGVkOgorICBDRlhfV2lkZVN0cmluZyBHZXRXaW4zMlBhdGgoKSBjb25zdDsKIAotICAgIENGREZfRG9jdW1lbnQoKTsKLSAgICB2b2lkCVBhcnNlU3RyZWFtKElGWF9GaWxlUmVhZCAqcEZpbGUsIEZYX0JPT0wgYk93bkZpbGUpOwotICAgIENQREZfRGljdGlvbmFyeSoJCW1fcFJvb3REaWN0OwotICAgIElGWF9GaWxlUmVhZCoJCQltX3BGaWxlOwotICAgIEZYX0JPT0wJCQkJCW1fYk93bkZpbGU7CisgcHJvdGVjdGVkOgorICBDRkRGX0RvY3VtZW50KCk7CisgIHZvaWQgUGFyc2VTdHJlYW0oSUZYX0ZpbGVSZWFkKiBwRmlsZSwgRlhfQk9PTCBiT3duRmlsZSk7CisgIENQREZfRGljdGlvbmFyeSogbV9wUm9vdERpY3Q7CisgIElGWF9GaWxlUmVhZCogbV9wRmlsZTsKKyAgRlhfQk9PTCBtX2JPd25GaWxlOwogfTsKIAotQ0ZYX1dpZGVTdHJpbmcJRlBERl9GaWxlU3BlY19HZXRXaW4zMlBhdGgoY29uc3QgQ1BERl9PYmplY3QqIHBGaWxlU3BlYyk7Ci12b2lkCQkJRlBERl9GaWxlU3BlY19TZXRXaW4zMlBhdGgoQ1BERl9PYmplY3QqIHBGaWxlU3BlYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZ1bGxwYXRoKTsKK0NGWF9XaWRlU3RyaW5nIEZQREZfRmlsZVNwZWNfR2V0V2luMzJQYXRoKGNvbnN0IENQREZfT2JqZWN0KiBwRmlsZVNwZWMpOwordm9pZCBGUERGX0ZpbGVTcGVjX1NldFdpbjMyUGF0aChDUERGX09iamVjdCogcEZpbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgZnVsbHBhdGgpOwogCi12b2lkIEZsYXRlRW5jb2RlKGNvbnN0IEZYX0JZVEUqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBGWF9MUEJZVEUmIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKTsKLUZYX0RXT1JEIEZsYXRlRGVjb2RlKGNvbnN0IEZYX0JZVEUqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBGWF9MUEJZVEUmIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKTsKLUZYX0RXT1JEIFJ1bkxlbmd0aERlY29kZShjb25zdCBGWF9CWVRFKiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgRlhfTFBCWVRFJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7Ci1jbGFzcyBDUERGX051bWJlclRyZWUgCi17Ci1wdWJsaWM6Cit2b2lkIEZsYXRlRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpOwordm9pZCBGbGF0ZUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgaW50IHByZWRpY3RvciwKKyAgICAgICAgICAgICAgICAgaW50IENvbG9ycywKKyAgICAgICAgICAgICAgICAgaW50IEJpdHNQZXJDb21wb25lbnQsCisgICAgICAgICAgICAgICAgIGludCBDb2x1bW5zLAorICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpOworRlhfRFdPUkQgRmxhdGVEZWNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7CitGWF9EV09SRCBSdW5MZW5ndGhEZWNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7Citib29sIElzU2lnbmF0dXJlRGljdChjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKIAotICAgIENQREZfTnVtYmVyVHJlZShDUERGX0RpY3Rpb25hcnkqIHBSb290KQotICAgIHsKLSAgICAgICAgbV9wUm9vdCA9IHBSb290OwotICAgIH0KK2NsYXNzIENQREZfTnVtYmVyVHJlZSB7CisgcHVibGljOgorICBDUERGX051bWJlclRyZWUoQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCkgeyBtX3BSb290ID0gcFJvb3Q7IH0KIAotICAgIENQREZfT2JqZWN0KgkJTG9va3VwVmFsdWUoaW50IG51bSk7Ci1wcm90ZWN0ZWQ6CisgIENQREZfT2JqZWN0KiBMb29rdXBWYWx1ZShpbnQgbnVtKTsKIAotICAgIENQREZfRGljdGlvbmFyeSoJbV9wUm9vdDsKKyBwcm90ZWN0ZWQ6CisgIENQREZfRGljdGlvbmFyeSogbV9wUm9vdDsKIH07CiAKLWNsYXNzIElGWF9GaWxlQXZhaWwKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5JRlhfRmlsZUF2YWlsKCkgeyB9Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNEYXRhQXZhaWwoIEZYX0ZJTEVTSVpFIG9mZnNldCwgRlhfRFdPUkQgc2l6ZSkgPSAwOworY2xhc3MgSUZYX0ZpbGVBdmFpbCB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JRlhfRmlsZUF2YWlsKCkge30KKyAgdmlydHVhbCBGWF9CT09MIElzRGF0YUF2YWlsKEZYX0ZJTEVTSVpFIG9mZnNldCwgRlhfRFdPUkQgc2l6ZSkgPSAwOwogfTsKLWNsYXNzIElGWF9Eb3dubG9hZEhpbnRzCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+SUZYX0Rvd25sb2FkSGludHMoKSB7IH0KLSAgICB2aXJ0dWFsIHZvaWQJCQlBZGRTZWdtZW50KEZYX0ZJTEVTSVpFIG9mZnNldCwgRlhfRFdPUkQgc2l6ZSkgPSAwOworY2xhc3MgSUZYX0Rvd25sb2FkSGludHMgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SUZYX0Rvd25sb2FkSGludHMoKSB7fQorICB2aXJ0dWFsIHZvaWQgQWRkU2VnbWVudChGWF9GSUxFU0laRSBvZmZzZXQsIEZYX0RXT1JEIHNpemUpID0gMDsKIH07Ci0jZGVmaW5lIFBERl9JU19MSU5FQVJJWkVECQkJMQotI2RlZmluZSBQREZfTk9UX0xJTkVBUklaRUQJCQkwCi0jZGVmaW5lIFBERl9VTktOT1dfTElORUFSSVpFRAkJLTEKLSNkZWZpbmUgUERGRk9STV9OT1RBVkFJTAkJMAotI2RlZmluZSBQREZGT1JNX0FWQUlMCQkJMQotI2RlZmluZSBQREZGT1JNX05PVEVYSVNUCQkyCi1jbGFzcyBJUERGX0RhdGFBdmFpbAotewotcHVibGljOgotICAgIHN0YXRpYyBJUERGX0RhdGFBdmFpbCogQ3JlYXRlKElGWF9GaWxlQXZhaWwqIHBGaWxlQXZhaWwsIElGWF9GaWxlUmVhZCogcEZpbGVSZWFkKTsKLSAgICB2aXJ0dWFsIH5JUERGX0RhdGFBdmFpbCgpIHsgfQogCi0gICAgSUZYX0ZpbGVBdmFpbCogR2V0RmlsZUF2YWlsKCkgY29uc3QgeyByZXR1cm4gbV9wRmlsZUF2YWlsOyB9Ci0gICAgSUZYX0ZpbGVSZWFkKiBHZXRGaWxlUmVhZCgpIGNvbnN0IHsgcmV0dXJuIG1fcEZpbGVSZWFkOyB9CitjbGFzcyBJUERGX0RhdGFBdmFpbCB7CisgcHVibGljOgorICAvLyBNdXN0IG1hdGNoIFBERl9EQVRBXyogZGVmaW5pdGlvbnMgaW4gcHVibGljL2ZwZGZfZGF0YWF2YWlsLmgsIGJ1dCBjYW5ub3QKKyAgLy8gI2luY2x1ZGUgdGhhdCBoZWFkZXIuIGZwZGZzZGsvc3JjL2ZwZGZfZGF0YWF2YWlsLmNwcCBoYXMgc3RhdGljX2Fzc2VydHMKKyAgLy8gdG8gbWFrZSBzdXJlIHRoZSB0d28gc2V0cyBvZiB2YWx1ZXMgbWF0Y2guCisgIGVudW0gRG9jQXZhaWxTdGF0dXMgeworICAgIERhdGFFcnJvciA9IC0xLCAgICAgICAgLy8gUERGX0RBVEFfRVJST1IKKyAgICBEYXRhTm90QXZhaWxhYmxlID0gMCwgIC8vIFBERl9EQVRBX05PVEFWQUlMCisgICAgRGF0YUF2YWlsYWJsZSA9IDEsICAgICAvLyBQREZfREFUQV9BVkFJTAorICB9OwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNEb2NBdmFpbChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkCQkJU2V0RG9jdW1lbnQoQ1BERl9Eb2N1bWVudCogcERvYykgPSAwOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzUGFnZUF2YWlsKGludCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgPSAwOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzTGluZWFyaXplZCgpID0gMDsKLSAgICB2aXJ0dWFsIEZYX0lOVDMyCQlJc0Zvcm1BdmFpbChJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9JTlQzMgkJSXNMaW5lYXJpemVkUERGKCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZAkJCQlHZXRMaW5lYXJpemVkTWFpblhSZWZJbmZvKEZYX0ZJTEVTSVpFICpwUG9zLCBGWF9EV09SRCAqcFNpemUpID0gMDsKKyAgLy8gTXVzdCBtYXRjaCBQREZfKkxJTkVBUiogZGVmaW5pdGlvbnMgaW4gcHVibGljL2ZwZGZfZGF0YWF2YWlsLmgsIGJ1dCBjYW5ub3QKKyAgLy8gI2luY2x1ZGUgdGhhdCBoZWFkZXIuIGZwZGZzZGsvc3JjL2ZwZGZfZGF0YWF2YWlsLmNwcCBoYXMgc3RhdGljX2Fzc2VydHMKKyAgLy8gdG8gbWFrZSBzdXJlIHRoZSB0d28gc2V0cyBvZiB2YWx1ZXMgbWF0Y2guCisgIGVudW0gRG9jTGluZWFyaXphdGlvblN0YXR1cyB7CisgICAgTGluZWFyaXphdGlvblVua25vd24gPSAtMSwgIC8vIFBERl9MSU5FQVJJWkFUSU9OX1VOS05PV04KKyAgICBOb3RMaW5lYXJpemVkID0gMCwgICAgICAgICAgLy8gUERGX05PVF9MSU5FQVJJWkVECisgICAgTGluZWFyaXplZCA9IDEsICAgICAgICAgICAgIC8vIFBERl9MSU5FQVJJWkVECisgIH07CiAKLXByb3RlY3RlZDoKLSAgICBJUERGX0RhdGFBdmFpbChJRlhfRmlsZUF2YWlsKiBwRmlsZUF2YWlsLCBJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZCk7CisgIC8vIE11c3QgbWF0Y2ggUERGX0ZPUk1fKiBkZWZpbml0aW9ucyBpbiBwdWJsaWMvZnBkZl9kYXRhYXZhaWwuaCwgYnV0IGNhbm5vdAorICAvLyAjaW5jbHVkZSB0aGF0IGhlYWRlci4gZnBkZnNkay9zcmMvZnBkZl9kYXRhYXZhaWwuY3BwIGhhcyBzdGF0aWNfYXNzZXJ0cworICAvLyB0byBtYWtlIHN1cmUgdGhlIHR3byBzZXRzIG9mIHZhbHVlcyBtYXRjaC4KKyAgZW51bSBEb2NGb3JtU3RhdHVzIHsKKyAgICBGb3JtRXJyb3IgPSAtMSwgICAgICAgIC8vIFBERl9GT1JNX0VSUk9SCisgICAgRm9ybU5vdEF2YWlsYWJsZSA9IDAsICAvLyBQREZfRk9STV9OT1RBVkFJTAorICAgIEZvcm1BdmFpbGFibGUgPSAxLCAgICAgLy8gUERGX0ZPUk1fQVZBSUwKKyAgICBGb3JtTm90RXhpc3QgPSAyLCAgICAgIC8vIFBERl9GT1JNX05PVEVYSVNUCisgIH07CiAKLSAgICBJRlhfRmlsZUF2YWlsKiBtX3BGaWxlQXZhaWw7Ci0gICAgSUZYX0ZpbGVSZWFkKiBtX3BGaWxlUmVhZDsKKyAgc3RhdGljIElQREZfRGF0YUF2YWlsKiBDcmVhdGUoSUZYX0ZpbGVBdmFpbCogcEZpbGVBdmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQpOworICB2aXJ0dWFsIH5JUERGX0RhdGFBdmFpbCgpIHt9CisKKyAgSUZYX0ZpbGVBdmFpbCogR2V0RmlsZUF2YWlsKCkgY29uc3QgeyByZXR1cm4gbV9wRmlsZUF2YWlsOyB9CisgIElGWF9GaWxlUmVhZCogR2V0RmlsZVJlYWQoKSBjb25zdCB7IHJldHVybiBtX3BGaWxlUmVhZDsgfQorCisgIHZpcnR1YWwgRG9jQXZhaWxTdGF0dXMgSXNEb2NBdmFpbChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXREb2N1bWVudChDUERGX0RvY3VtZW50KiBwRG9jKSA9IDA7CisgIHZpcnR1YWwgRG9jQXZhaWxTdGF0dXMgSXNQYWdlQXZhaWwoaW50IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBJc0xpbmVhcml6ZWQoKSA9IDA7CisgIHZpcnR1YWwgRG9jRm9ybVN0YXR1cyBJc0Zvcm1BdmFpbChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSA9IDA7CisgIHZpcnR1YWwgRG9jTGluZWFyaXphdGlvblN0YXR1cyBJc0xpbmVhcml6ZWRQREYoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBHZXRMaW5lYXJpemVkTWFpblhSZWZJbmZvKEZYX0ZJTEVTSVpFKiBwUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcFNpemUpID0gMDsKKworIHByb3RlY3RlZDoKKyAgSVBERl9EYXRhQXZhaWwoSUZYX0ZpbGVBdmFpbCogcEZpbGVBdmFpbCwgSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQpOworCisgIElGWF9GaWxlQXZhaWwqIG1fcEZpbGVBdmFpbDsKKyAgSUZYX0ZpbGVSZWFkKiBtX3BGaWxlUmVhZDsKIH07Ci1jbGFzcyBDUERGX1NvcnRPYmpOdW1BcnJheSAKLXsKLXB1YmxpYzoKIAotICAgIHZvaWQgQWRkT2JqTnVtKEZYX0RXT1JEIGR3T2JqTnVtKTsKLQotICAgIEZYX0JPT0wgRmluZChGWF9EV09SRCBkd09iak51bSk7Ci0KLSAgICB2b2lkIFJlbW92ZUFsbCgpCi0gICAgewotICAgICAgICBtX251bWJlcl9hcnJheS5SZW1vdmVBbGwoKTsKLSAgICB9Ci1wcm90ZWN0ZWQ6Ci0KLSAgICBGWF9CT09MIEJpbmFyeVNlYXJjaChGWF9EV09SRCB2YWx1ZSwgaW50ICZpTmV4dCk7Ci1wcm90ZWN0ZWQ6Ci0KLSAgICBDRlhfRFdvcmRBcnJheQkJCW1fbnVtYmVyX2FycmF5OwotfTsKIGVudW0gUERGX1BBR0VOT0RFX1RZUEUgewotICAgIFBERl9QQUdFTk9ERV9VTktPV04gPSAwLAotICAgIFBERl9QQUdFTk9ERV9QQUdFLAotICAgIFBERl9QQUdFTk9ERV9QQUdFUywKLSAgICBQREZfUEFHRU5PREVfQVJSQVksCisgIFBERl9QQUdFTk9ERV9VTktPV04gPSAwLAorICBQREZfUEFHRU5PREVfUEFHRSwKKyAgUERGX1BBR0VOT0RFX1BBR0VTLAorICBQREZfUEFHRU5PREVfQVJSQVksCiB9OwotY2xhc3MgQ1BERl9QYWdlTm9kZSAKLXsKLXB1YmxpYzoKLSAgICBDUERGX1BhZ2VOb2RlKCkgOiBtX3R5cGUoUERGX1BBR0VOT0RFX1VOS09XTikge30KLSAgICB+Q1BERl9QYWdlTm9kZSgpOwotICAgIFBERl9QQUdFTk9ERV9UWVBFCW1fdHlwZTsKLSAgICBGWF9EV09SRAkJCW1fZHdQYWdlTm87Ci0gICAgQ0ZYX1B0ckFycmF5CQltX2NoaWxkTm9kZTsKK2NsYXNzIENQREZfUGFnZU5vZGUgeworIHB1YmxpYzoKKyAgQ1BERl9QYWdlTm9kZSgpIDogbV90eXBlKFBERl9QQUdFTk9ERV9VTktPV04pIHt9CisgIH5DUERGX1BhZ2VOb2RlKCk7CisgIFBERl9QQUdFTk9ERV9UWVBFIG1fdHlwZTsKKyAgRlhfRFdPUkQgbV9kd1BhZ2VObzsKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9QYWdlTm9kZSo+IG1fY2hpbGROb2RlOwogfTsKIGVudW0gUERGX0RBVEFBVkFJTF9TVEFUVVMgewotICAgIFBERl9EQVRBQVZBSUxfSEVBREVSID0gMCwKLSAgICBQREZfREFUQUFWQUlMX0ZJUlNUUEFHRSwKLSAgICBQREZfREFUQUFWQUlMX0ZJUlNUUEFHRV9QUkVQQVJFLAotICAgIFBERl9EQVRBQVZBSUxfRU5ELAotICAgIFBERl9EQVRBQVZBSUxfQ1JPU1NSRUYsCi0gICAgUERGX0RBVEFBVkFJTF9DUk9TU1JFRl9JVEVNLAotICAgIFBERl9EQVRBQVZBSUxfQ1JPU1NSRUZfU1RSRUFNLAotICAgIFBERl9EQVRBQVZBSUxfVFJBSUxFUiwKLSAgICBQREZfREFUQUFWQUlMX0xPQURBTExDUlNPU1NSRUYsCi0gICAgUERGX0RBVEFBVkFJTF9ST09ULAotICAgIFBERl9EQVRBQVZBSUxfSU5GTywKLSAgICBQREZfREFUQUFWQUlMX0FDUk9GT1JNLAotICAgIFBERl9EQVRBQVZBSUxfQUNST0ZPUk1fU1VCT0JKRUNULAotICAgIFBERl9EQVRBQVZBSUxfUEFHRVRSRUUsCi0gICAgUERGX0RBVEFBVkFJTF9QQUdFLAotICAgIFBERl9EQVRBQVZBSUxfUEFHRV9MQVRFUkxPQUQsCi0gICAgUERGX0RBVEFBVkFJTF9SRVNPVVJDRVMsCi0gICAgUERGX0RBVEFBVkFJTF9ET05FLAotICAgIFBERl9EQVRBQVZBSUxfRVJST1IsCi0gICAgUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRSwKLSAgICBQREZfREFUQUFWQUlMX1RSQUlMRVJfQVBQRU5ECisgIFBERl9EQVRBQVZBSUxfSEVBREVSID0gMCwKKyAgUERGX0RBVEFBVkFJTF9GSVJTVFBBR0UsCisgIFBERl9EQVRBQVZBSUxfRklSU1RQQUdFX1BSRVBBUkUsCisgIFBERl9EQVRBQVZBSUxfSElOVFRBQkxFLAorICBQREZfREFUQUFWQUlMX0VORCwKKyAgUERGX0RBVEFBVkFJTF9DUk9TU1JFRiwKKyAgUERGX0RBVEFBVkFJTF9DUk9TU1JFRl9JVEVNLAorICBQREZfREFUQUFWQUlMX0NST1NTUkVGX1NUUkVBTSwKKyAgUERGX0RBVEFBVkFJTF9UUkFJTEVSLAorICBQREZfREFUQUFWQUlMX0xPQURBTExDUk9TU1JFRiwKKyAgUERGX0RBVEFBVkFJTF9ST09ULAorICBQREZfREFUQUFWQUlMX0lORk8sCisgIFBERl9EQVRBQVZBSUxfQUNST0ZPUk0sCisgIFBERl9EQVRBQVZBSUxfQUNST0ZPUk1fU1VCT0JKRUNULAorICBQREZfREFUQUFWQUlMX1BBR0VUUkVFLAorICBQREZfREFUQUFWQUlMX1BBR0UsCisgIFBERl9EQVRBQVZBSUxfUEFHRV9MQVRFUkxPQUQsCisgIFBERl9EQVRBQVZBSUxfUkVTT1VSQ0VTLAorICBQREZfREFUQUFWQUlMX0RPTkUsCisgIFBERl9EQVRBQVZBSUxfRVJST1IsCisgIFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEUsCisgIFBERl9EQVRBQVZBSUxfVFJBSUxFUl9BUFBFTkQKIH07CiAKKy8vIFB1YmxpYyBmb3IgdGVzdGluZy4KK0ZYX0RXT1JEIEE4NURlY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKTsKKy8vIFB1YmxpYyBmb3IgdGVzdGluZy4KK0ZYX0RXT1JEIEhleERlY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKTsKKy8vIFB1YmxpYyBmb3IgdGVzdGluZy4KK0ZYX0RXT1JEIEZQREZBUElfRmxhdGVPckxaV0RlY29kZShGWF9CT09MIGJMWlcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZXN0aW1hdGVkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpOworRlhfQk9PTCBQREZfRGF0YURlY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgSW1hZ2VFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiYgcEltYWdlUGFybXMsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGVzdGltYXRlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbWFnZUFjYyk7CisKICNlbmRpZiAgLy8gQ09SRV9JTkNMVURFX0ZQREZBUElfRlBERl9QQVJTRVJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcmVuZGVyLmggYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3JlbmRlci5oCmluZGV4IDQ3ZDFiMTkuLjFjOGE5OWEgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcmVuZGVyLmgKKysrIGIvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZW5kZXIuaApAQCAtMSwyOTEgKzEsMjgwIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgQ09SRV9JTkNMVURFX0ZQREZBUElfRlBERl9SRU5ERVJfSF8KICNkZWZpbmUgQ09SRV9JTkNMVURFX0ZQREZBUElfRlBERl9SRU5ERVJfSF8KIAotI2luY2x1ZGUgIi4uL2Z4Z2UvZnhfZ2UuaCIKLSNpbmNsdWRlICJmcGRmX3BhZ2UuaCIKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgogCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKKworY2xhc3MgQ0ZYX0dyYXBoU3RhdGVEYXRhOworY2xhc3MgQ0ZYX1BhdGhEYXRhOworY2xhc3MgQ0ZYX1JlbmRlckRldmljZTsKK2NsYXNzIENQREZfRm9ybU9iamVjdDsKK2NsYXNzIENQREZfSW1hZ2VDYWNoZUVudHJ5OworY2xhc3MgQ1BERl9JbWFnZU9iamVjdDsKK2NsYXNzIENQREZfUGF0aE9iamVjdDsKIGNsYXNzIENQREZfUmVuZGVyQ29udGV4dDsKIGNsYXNzIENQREZfUmVuZGVyT3B0aW9uczsKLWNsYXNzIENQREZfSW1hZ2VDYWNoZTsKLWNsYXNzIElQREZfT0NDb250ZXh0OwotY2xhc3MgQ1BERl9RdWlja1N0cmV0Y2hlcjsKLWNsYXNzIENGWF9QYXRoRGF0YTsKLWNsYXNzIENGWF9HcmFwaFN0YXRlRGF0YTsKLWNsYXNzIENGWF9SZW5kZXJEZXZpY2U7Ci1jbGFzcyBDUERGX1RleHRPYmplY3Q7Ci1jbGFzcyBDUERGX1BhdGhPYmplY3Q7Ci1jbGFzcyBDUERGX0ltYWdlT2JqZWN0OworY2xhc3MgQ1BERl9SZW5kZXJTdGF0dXM7CiBjbGFzcyBDUERGX1NoYWRpbmdPYmplY3Q7Ci1jbGFzcyBDUERGX0Zvcm1PYmplY3Q7Ci1jbGFzcyBJUERGX09DQ29udGV4dAotewotcHVibGljOgorY2xhc3MgQ1BERl9UZXh0T2JqZWN0OworY2xhc3MgSUZYX1BhdXNlOwogCi0gICAgdmlydHVhbCB+SVBERl9PQ0NvbnRleHQoKSB7fQorY2xhc3MgSVBERl9PQ0NvbnRleHQgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SVBERl9PQ0NvbnRleHQoKSB7fQogCi0gICAgdmlydHVhbCBGWF9CT09MCUNoZWNrT0NHVmlzaWJsZShjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBPQ0cpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIENoZWNrT0NHVmlzaWJsZShjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBPQ0cpID0gMDsKIAotICAgIEZYX0JPT0wgQ2hlY2tPYmplY3RWaXNpYmxlKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaik7CisgIEZYX0JPT0wgQ2hlY2tPYmplY3RWaXNpYmxlKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaik7CiB9OwotI2RlZmluZSBSRU5ERVJfQ09MT1JfTk9STUFMCQkwCi0jZGVmaW5lIFJFTkRFUl9DT0xPUl9HUkFZCQkxCi0jZGVmaW5lIFJFTkRFUl9DT0xPUl9UV09DT0xPUgkyCi0jZGVmaW5lIFJFTkRFUl9DT0xPUl9BTFBIQQkJMwotI2RlZmluZSBSRU5ERVJfQ0xFQVJUWVBFCQkJMHgwMDAwMDAwMQotI2RlZmluZSBSRU5ERVJfUFJJTlRHUkFQSElDVEVYVAkJMHgwMDAwMDAwMgotI2RlZmluZSBSRU5ERVJfRk9SQ0VfRE9XTlNBTVBMRQkJMHgwMDAwMDAwNAotI2RlZmluZSBSRU5ERVJfUFJJTlRQUkVWSUVXCQkJMHgwMDAwMDAwOAotI2RlZmluZSBSRU5ERVJfQkdSX1NUUklQRQkJCTB4MDAwMDAwMTAKLSNkZWZpbmUgUkVOREVSX05PX05BVElWRVRFWFQJCTB4MDAwMDAwMjAKLSNkZWZpbmUgUkVOREVSX0ZPUkNFX0hBTEZUT05FCQkweDAwMDAwMDQwCi0jZGVmaW5lIFJFTkRFUl9SRUNUX0FBCQkJCTB4MDAwMDAwODAKLSNkZWZpbmUgUkVOREVSX0ZJTExfRlVMTENPVkVSCQkweDAwMDAwMTAwCi0jZGVmaW5lIFJFTkRFUl9QUklOVElNQUdFVEVYVCAgICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIFJFTkRFUl9PVkVSUFJJTlQgICAgICAgICAgICAweDAwMDAwNDAwCi0jZGVmaW5lIFJFTkRFUl9USElOTElORSAgICAgICAgICAgICAweDAwMDAwODAwCi0jZGVmaW5lIFJFTkRFUl9OT1RFWFRTTU9PVEgJCQkweDEwMDAwMDAwCi0jZGVmaW5lIFJFTkRFUl9OT1BBVEhTTU9PVEgJCQkweDIwMDAwMDAwCi0jZGVmaW5lIFJFTkRFUl9OT0lNQUdFU01PT1RICQkweDQwMDAwMDAwCi0jZGVmaW5lIFJFTkRFUl9MSU1JVEVESU1BR0VDQUNIRQkweDgwMDAwMDAwCi1jbGFzcyBDUERGX1JlbmRlck9wdGlvbnMgCi17Ci1wdWJsaWM6CisjZGVmaW5lIFJFTkRFUl9DT0xPUl9OT1JNQUwgMAorI2RlZmluZSBSRU5ERVJfQ09MT1JfR1JBWSAxCisjZGVmaW5lIFJFTkRFUl9DT0xPUl9UV09DT0xPUiAyCisjZGVmaW5lIFJFTkRFUl9DT0xPUl9BTFBIQSAzCisjZGVmaW5lIFJFTkRFUl9DTEVBUlRZUEUgMHgwMDAwMDAwMQorI2RlZmluZSBSRU5ERVJfUFJJTlRHUkFQSElDVEVYVCAweDAwMDAwMDAyCisjZGVmaW5lIFJFTkRFUl9GT1JDRV9ET1dOU0FNUExFIDB4MDAwMDAwMDQKKyNkZWZpbmUgUkVOREVSX1BSSU5UUFJFVklFVyAweDAwMDAwMDA4CisjZGVmaW5lIFJFTkRFUl9CR1JfU1RSSVBFIDB4MDAwMDAwMTAKKyNkZWZpbmUgUkVOREVSX05PX05BVElWRVRFWFQgMHgwMDAwMDAyMAorI2RlZmluZSBSRU5ERVJfRk9SQ0VfSEFMRlRPTkUgMHgwMDAwMDA0MAorI2RlZmluZSBSRU5ERVJfUkVDVF9BQSAweDAwMDAwMDgwCisjZGVmaW5lIFJFTkRFUl9GSUxMX0ZVTExDT1ZFUiAweDAwMDAwMTAwCisjZGVmaW5lIFJFTkRFUl9QUklOVElNQUdFVEVYVCAweDAwMDAwMjAwCisjZGVmaW5lIFJFTkRFUl9PVkVSUFJJTlQgMHgwMDAwMDQwMAorI2RlZmluZSBSRU5ERVJfVEhJTkxJTkUgMHgwMDAwMDgwMAorI2RlZmluZSBSRU5ERVJfTk9URVhUU01PT1RIIDB4MTAwMDAwMDAKKyNkZWZpbmUgUkVOREVSX05PUEFUSFNNT09USCAweDIwMDAwMDAwCisjZGVmaW5lIFJFTkRFUl9OT0lNQUdFU01PT1RIIDB4NDAwMDAwMDAKKyNkZWZpbmUgUkVOREVSX0xJTUlURURJTUFHRUNBQ0hFIDB4ODAwMDAwMDAKK2NsYXNzIENQREZfUmVuZGVyT3B0aW9ucyB7CisgcHVibGljOgorICBDUERGX1JlbmRlck9wdGlvbnMoKTsKIAotICAgIENQREZfUmVuZGVyT3B0aW9ucygpOworICBpbnQgbV9Db2xvck1vZGU7CiAKLSAgICBpbnQJCQkJbV9Db2xvck1vZGU7CisgIEZYX0NPTE9SUkVGIG1fQmFja0NvbG9yOwogCi0gICAgRlhfQ09MT1JSRUYJCW1fQmFja0NvbG9yOworICBGWF9DT0xPUlJFRiBtX0ZvcmVDb2xvcjsKIAotICAgIEZYX0NPTE9SUkVGCQltX0ZvcmVDb2xvcjsKKyAgRlhfRFdPUkQgbV9GbGFnczsKIAotICAgIEZYX0RXT1JECQltX0ZsYWdzOworICBpbnQgbV9JbnRlcnBvbGF0aW9uOwogCi0gICAgaW50CQkJCW1fSW50ZXJwb2xhdGlvbjsKKyAgRlhfRFdPUkQgbV9BZGRGbGFnczsKIAotICAgIEZYX0RXT1JECQltX0FkZEZsYWdzOworICBJUERGX09DQ29udGV4dCogbV9wT0NDb250ZXh0OwogCi0gICAgSVBERl9PQ0NvbnRleHQqCW1fcE9DQ29udGV4dDsKKyAgRlhfRFdPUkQgbV9kd0xpbWl0Q2FjaGVTaXplOwogCi0gICAgRlhfRFdPUkQJCW1fZHdMaW1pdENhY2hlU2l6ZTsKKyAgaW50IG1fSGFsZnRvbmVMaW1pdDsKIAotICAgIGludAkJCQltX0hhbGZ0b25lTGltaXQ7Ci0KLSAgICBGWF9BUkdCCQkJVHJhbnNsYXRlQ29sb3IoRlhfQVJHQiBhcmdiKSBjb25zdDsKKyAgRlhfQVJHQiBUcmFuc2xhdGVDb2xvcihGWF9BUkdCIGFyZ2IpIGNvbnN0OwogfTsKLWNsYXNzIENQREZfUmVuZGVyQ29udGV4dCAKLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfUmVuZGVyQ29udGV4dCB7CisgcHVibGljOgorICBleHBsaWNpdCBDUERGX1JlbmRlckNvbnRleHQoQ1BERl9QYWdlKiBwUGFnZSk7CisgIENQREZfUmVuZGVyQ29udGV4dChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcFBhZ2VDYWNoZSk7CisgIH5DUERGX1JlbmRlckNvbnRleHQoKTsKIAotICAgIENQREZfUmVuZGVyQ29udGV4dCgpOworICB2b2lkIEFwcGVuZE9iamVjdExpc3QoQ1BERl9QYWdlT2JqZWN0cyogcE9ianMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSk7CiAKLSAgICB2b2lkCQkJQ3JlYXRlKENQREZfUGFnZSogcFBhZ2UsIEZYX0JPT0wgYkZpcnN0TGF5ZXIgPSBUUlVFKTsKKyAgdm9pZCBSZW5kZXIoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyA9IE5VTEwsCisgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBGaW5hbE1hdHJpeCA9IE5VTEwpOwogCi0gICAgdm9pZAkJCUNyZWF0ZShDUERGX0RvY3VtZW50KiBwRG9jID0gTlVMTCwgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBQYWdlQ2FjaGUgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcyA9IE5VTEwsIEZYX0JPT0wgYkZpcnN0TGF5ZXIgPSBUUlVFKTsKKyAgdm9pZCBEcmF3T2JqZWN0TGlzdChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIENQREZfUGFnZU9iamVjdHMqIHBPYmpzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpOwogCi0gICAgfkNQREZfUmVuZGVyQ29udGV4dCgpOworICB2b2lkIEdldEJhY2tncm91bmQoQ0ZYX0RJQml0bWFwKiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBGaW5hbE1hdHJpeCk7CiAKLSAgICB2b2lkCQkJQ2xlYXIoKTsKKyAgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIEdldFBhZ2VDYWNoZSgpIGNvbnN0IHsgcmV0dXJuIG1fcFBhZ2VDYWNoZTsgfQogCi0gICAgdm9pZAkJCUFwcGVuZE9iamVjdExpc3QoQ1BERl9QYWdlT2JqZWN0cyogcE9ianMsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlKTsKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgUmVuZGVyKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgIGNvbnN0IENQREZfUGFnZU9iamVjdCogcFN0b3BPYmosCisgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsCisgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBGaW5hbE1hdHJpeCk7CiAKLSAgICB2b2lkCQkJUmVuZGVyKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcEZpbmFsTWF0cml4ID0gTlVMTCk7CisgIENQREZfRG9jdW1lbnQqIGNvbnN0IG1fcERvY3VtZW50OworICBDUERGX0RpY3Rpb25hcnkqIG1fcFBhZ2VSZXNvdXJjZXM7CisgIENQREZfUGFnZVJlbmRlckNhY2hlKiBtX3BQYWdlQ2FjaGU7CisgIENGWF9BcnJheVRlbXBsYXRlPHN0cnVjdCBfUERGX1JlbmRlckl0ZW0+IG1fQ29udGVudExpc3Q7CisgIEZYX0JPT0wgbV9iRmlyc3RMYXllcjsKIAotICAgIHZvaWQJCQlEcmF3T2JqZWN0TGlzdChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX1BhZ2VPYmplY3RzKiBwT2JqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpOwotCi0gICAgdm9pZAkJCUdldEJhY2tncm91bmQoQ0ZYX0RJQml0bWFwKiBwQnVmZmVyLCBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywgQ0ZYX0FmZmluZU1hdHJpeCogcEZpbmFsTWF0cml4KTsKLQotICAgIENQREZfUGFnZVJlbmRlckNhY2hlKglHZXRQYWdlQ2FjaGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcFBhZ2VDYWNoZTsKLSAgICB9Ci0KLQotCi0gICAgQ1BERl9Eb2N1bWVudCoJCQltX3BEb2N1bWVudDsKLQotICAgIENQREZfRGljdGlvbmFyeSoJCW1fcFBhZ2VSZXNvdXJjZXM7Ci0KLSAgICBDUERGX1BhZ2VSZW5kZXJDYWNoZSoJbV9wUGFnZUNhY2hlOwotCi1wcm90ZWN0ZWQ6Ci0KLSAgICBDRlhfQXJyYXlUZW1wbGF0ZTxzdHJ1Y3QgX1BERl9SZW5kZXJJdGVtPgltX0NvbnRlbnRMaXN0OwotCi0gICAgRlhfQk9PTAkJCQkJbV9iRmlyc3RMYXllcjsKLQotICAgIHZvaWQJCQlSZW5kZXIoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwU3RvcE9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBGaW5hbE1hdHJpeCk7Ci0gICAgZnJpZW5kIGNsYXNzIENQREZfUmVuZGVyU3RhdHVzOwotICAgIGZyaWVuZCBjbGFzcyBDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXI7CisgIGZyaWVuZCBjbGFzcyBDUERGX1JlbmRlclN0YXR1czsKKyAgZnJpZW5kIGNsYXNzIENQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcjsKIH07Ci1jbGFzcyBDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXIgCi17Ci1wdWJsaWM6CiAKLSAgICBDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXIoKTsKK2NsYXNzIENQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlciB7CisgcHVibGljOgorICAvLyBNdXN0IG1hdGNoIEZERl9SRU5ERVJfKiBkZWZpbml0aW9ucyBpbiBwdWJsaWMvZnBkZl9wcm9ncmVzc2l2ZS5oLCBidXQKKyAgLy8gY2Fubm90ICNpbmNsdWRlIHRoYXQgaGVhZGVyLiBmcGRmc2RrL3NyYy9mcGRmX3Byb2dyZXNzaXZlLmNwcCBoYXMKKyAgLy8gc3RhdGljX2Fzc2VydHMgdG8gbWFrZSBzdXJlIHRoZSB0d28gc2V0cyBvZiB2YWx1ZXMgbWF0Y2guCisgIGVudW0gU3RhdHVzIHsKKyAgICBSZWFkeSwgICAgICAgICAgLy8gRlBERl9SRU5ERVJfUkVBREVSCisgICAgVG9CZUNvbnRpbnVlZCwgIC8vIEZQREZfUkVOREVSX1RPQkVDT1VOVElOVUVECisgICAgRG9uZSwgICAgICAgICAgIC8vIEZQREZfUkVOREVSX0RPTkUKKyAgICBGYWlsZWQgICAgICAgICAgLy8gRlBERl9SRU5ERVJfRkFJTEVECisgIH07CiAKLSAgICB+Q1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyKCk7CisgIHN0YXRpYyBpbnQgVG9GUERGU3RhdHVzKFN0YXR1cyBzdGF0dXMpIHsgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oc3RhdHVzKTsgfQogCi0gICAgdHlwZWRlZiBlbnVtIHsKLSAgICAgICAgUmVhZHksCi0gICAgICAgIFRvQmVDb250aW51ZWQsCi0gICAgICAgIERvbmUsCi0gICAgICAgIEZhaWxlZAotICAgIH0gUmVuZGVyU3RhdHVzOworICBDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXIoQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKTsKKyAgfkNQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcigpOwogCi0gICAgUmVuZGVyU3RhdHVzCQlHZXRTdGF0dXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fU3RhdHVzOwotICAgIH0KKyAgU3RhdHVzIEdldFN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIG1fU3RhdHVzOyB9CisgIHZvaWQgU3RhcnQoSUZYX1BhdXNlKiBwUGF1c2UpOworICB2b2lkIENvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgaW50IEVzdGltYXRlUHJvZ3Jlc3MoKTsKIAorIHByaXZhdGU6CisgIHZvaWQgUmVuZGVyU3RlcCgpOwogCi0KLSAgICB2b2lkCQkJCVN0YXJ0KENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLCBjbGFzcyBJRlhfUGF1c2UqIHBQYXVzZSwgRlhfQk9PTCBiRHJvcE9iamVjdHMgPSBGQUxTRSk7Ci0KLSAgICB2b2lkCQkJCUNvbnRpbnVlKGNsYXNzIElGWF9QYXVzZSogcFBhdXNlKTsKLQotCi0gICAgaW50CQkJCQlFc3RpbWF0ZVByb2dyZXNzKCk7Ci0KLSAgICB2b2lkCQkJCUNsZWFyKCk7Ci1wcm90ZWN0ZWQ6Ci0KLSAgICBSZW5kZXJTdGF0dXMJCW1fU3RhdHVzOwotCi0gICAgQ1BERl9SZW5kZXJDb250ZXh0KgltX3BDb250ZXh0OwotCi0gICAgQ0ZYX1JlbmRlckRldmljZSoJbV9wRGV2aWNlOwotCi0gICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKgltX3BPcHRpb25zOwotCi0gICAgRlhfQk9PTAkJCQltX2JEcm9wT2JqZWN0czsKLQotICAgIGNsYXNzIENQREZfUmVuZGVyU3RhdHVzKgltX3BSZW5kZXJlcjsKLQotICAgIENGWF9GbG9hdFJlY3QJCW1fQ2xpcFJlY3Q7Ci0KLSAgICBGWF9EV09SRAkJCW1fTGF5ZXJJbmRleDsKLQotICAgIEZYX0RXT1JECQkJbV9PYmplY3RJbmRleDsKLQotICAgIEZYX1BPU0lUSU9OCQkJbV9PYmplY3RQb3M7Ci0KLSAgICBGWF9QT1NJVElPTgkJCW1fUHJldkxhc3RQb3M7Ci0KLSAgICB2b2lkCQkJCVJlbmRlclN0ZXAoKTsKKyAgU3RhdHVzIG1fU3RhdHVzOworICBDUERGX1JlbmRlckNvbnRleHQqIGNvbnN0IG1fcENvbnRleHQ7CisgIENGWF9SZW5kZXJEZXZpY2UqIGNvbnN0IG1fcERldmljZTsKKyAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBjb25zdCBtX3BPcHRpb25zOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9SZW5kZXJTdGF0dXM+IG1fcFJlbmRlclN0YXR1czsKKyAgQ0ZYX0Zsb2F0UmVjdCBtX0NsaXBSZWN0OworICBGWF9EV09SRCBtX0xheWVySW5kZXg7CisgIEZYX0RXT1JEIG1fT2JqZWN0SW5kZXg7CisgIEZYX1BPU0lUSU9OIG1fT2JqZWN0UG9zOworICBGWF9QT1NJVElPTiBtX1ByZXZMYXN0UG9zOwogfTsKLWNsYXNzIENQREZfVGV4dFJlbmRlcmVyIAotewotcHVibGljOgogCi0gICAgc3RhdGljIHZvaWQJCURyYXdUZXh0U3RyaW5nKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGludCBsZWZ0LCBpbnQgdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGFyZ2IpOworY2xhc3MgQ1BERl9UZXh0UmVuZGVyZXIgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgRHJhd1RleHRTdHJpbmcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYik7CiAKLSAgICBzdGF0aWMgdm9pZAkJRHJhd1RleHRTdHJpbmcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgRlhfRkxPQVQgb3JpZ2luX3gsIEZYX0ZMT0FUIG9yaWdpbl95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBmaWxsX2FyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0Igc3Ryb2tlX2FyZ2IgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyA9IE5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICBzdGF0aWMgdm9pZCBEcmF3VGV4dFN0cmluZyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBvcmlnaW5feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgb3JpZ2luX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGZpbGxfYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBzdHJva2VfYXJnYiA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zID0gTlVMTCk7CiAKLSAgICBzdGF0aWMgRlhfQk9PTAlEcmF3VGV4dFBhdGgoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgaW50IG5DaGFycywgRlhfRFdPUkQqIHBDaGFyQ29kZXMsIEZYX0ZMT0FUKiBwQ2hhclBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBUZXh0MlVzZXIsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGZpbGxfYXJnYiwgRlhfQVJHQiBzdHJva2VfYXJnYiwgQ0ZYX1BhdGhEYXRhKiBwQ2xpcHBpbmdQYXRoLCBpbnQgbkZsYWcgPSAwKTsKKyAgc3RhdGljIEZYX0JPT0wgRHJhd1RleHRQYXRoKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBDaGFyQ29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcENoYXJQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFRleHQyVXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGZpbGxfYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0Igc3Ryb2tlX2FyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEqIHBDbGlwcGluZ1BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZsYWcgPSAwKTsKIAotICAgIHN0YXRpYyBGWF9CT09MCURyYXdOb3JtYWxUZXh0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGludCBuQ2hhcnMsIEZYX0RXT1JEKiBwQ2hhckNvZGVzLCBGWF9GTE9BVCogcENoYXJQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHQyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGZpbGxfYXJnYiwgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyk7CisgIHN0YXRpYyBGWF9CT09MIERyYXdOb3JtYWxUZXh0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwQ2hhckNvZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcENoYXJQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFRleHQyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGZpbGxfYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyk7CiAKLSAgICBzdGF0aWMgRlhfQk9PTAlEcmF3VHlwZTNUZXh0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGludCBuQ2hhcnMsIEZYX0RXT1JEKiBwQ2hhckNvZGVzLCBGWF9GTE9BVCogcENoYXJQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwgRlhfRkxPQVQgZm9udF9zaXplLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBmaWxsX2FyZ2IpOworICBzdGF0aWMgRlhfQk9PTCBEcmF3VHlwZTNUZXh0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5DaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcENoYXJDb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcENoYXJQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFRleHQyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZmlsbF9hcmdiKTsKIH07Ci1jbGFzcyBDUERGX1BhZ2VSZW5kZXJDYWNoZSAKLXsKLXB1YmxpYzoKLSAgICBDUERGX1BhZ2VSZW5kZXJDYWNoZShDUERGX1BhZ2UqIHBQYWdlKQotICAgIHsKLSAgICAgICAgbV9wUGFnZSA9IHBQYWdlOwotICAgICAgICBtX25UaW1lQ291bnQgPSAwOwotICAgICAgICBtX25DYWNoZVNpemUgPSAwOwotICAgICAgICBtX3BDdXJJbWFnZUNhY2hlID0gTlVMTDsKLSAgICAgICAgbV9iQ3VyRmluZENhY2hlID0gRkFMU0U7Ci0gICAgICAgIG1fcEN1ckltYWdlQ2FjaGVzID0gTlVMTDsKLSAgICB9Ci0gICAgfkNQREZfUGFnZVJlbmRlckNhY2hlKCkKLSAgICB7Ci0gICAgICAgIENsZWFyQWxsKCk7Ci0gICAgfQotICAgIHZvaWQJCQkJQ2xlYXJBbGwoKTsKLSAgICB2b2lkCQkJCUNsZWFySW1hZ2VEYXRhKCk7CitjbGFzcyBDUERGX1BhZ2VSZW5kZXJDYWNoZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDUERGX1BhZ2VSZW5kZXJDYWNoZShDUERGX1BhZ2UqIHBQYWdlKQorICAgICAgOiBtX3BQYWdlKHBQYWdlKSwKKyAgICAgICAgbV9wQ3VySW1hZ2VDYWNoZUVudHJ5KG51bGxwdHIpLAorICAgICAgICBtX25UaW1lQ291bnQoMCksCisgICAgICAgIG1fbkNhY2hlU2l6ZSgwKSwKKyAgICAgICAgbV9iQ3VyRmluZENhY2hlKEZBTFNFKSB7fQorICB+Q1BERl9QYWdlUmVuZGVyQ2FjaGUoKTsKKyAgdm9pZCBDbGVhckltYWdlRGF0YSgpOwogCi0gICAgRlhfRFdPUkQJCQlFc3RpbWF0ZVNpemUoKTsKLSAgICB2b2lkCQkJCUNhY2hlT3B0aW1pemF0aW9uKEZYX0lOVDMyIGR3TGltaXRDYWNoZVNpemUpOwotICAgIEZYX0RXT1JECQkJR2V0Q2FjaGVkU2l6ZShDUERGX1N0cmVhbSogcFN0cmVhbSkgY29uc3Q7Ci0gICAgRlhfRFdPUkQJCQlHZXRUaW1lQ291bnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fblRpbWVDb3VudDsKLSAgICB9Ci0gICAgdm9pZAkJCQlTZXRUaW1lQ291bnQoRlhfRFdPUkQgZHdUaW1lQ291bnQpCi0gICAgewotICAgICAgICBtX25UaW1lQ291bnQgPSBkd1RpbWVDb3VudDsKLSAgICB9CisgIEZYX0RXT1JEIEVzdGltYXRlU2l6ZSgpOworICB2b2lkIENhY2hlT3B0aW1pemF0aW9uKGludDMyX3QgZHdMaW1pdENhY2hlU2l6ZSk7CisgIEZYX0RXT1JEIEdldFRpbWVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fblRpbWVDb3VudDsgfQorICB2b2lkIFNldFRpbWVDb3VudChGWF9EV09SRCBkd1RpbWVDb3VudCkgeyBtX25UaW1lQ291bnQgPSBkd1RpbWVDb3VudDsgfQogCi0gICAgdm9pZAkJCQlHZXRDYWNoZWRCaXRtYXAoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIENGWF9ESUJTb3VyY2UqJiBwQml0bWFwLCBDRlhfRElCU291cmNlKiYgcE1hc2ssIEZYX0RXT1JEJiBNYXR0ZUNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwsIEZYX0lOVDMyIGRvd25zYW1wbGVXaWR0aCA9IDAsIEZYX0lOVDMyIGRvd25zYW1wbGVIZWlnaHQgPSAwKTsKKyAgdm9pZCBHZXRDYWNoZWRCaXRtYXAoQ1BERl9TdHJlYW0qIHBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJTb3VyY2UqJiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCU291cmNlKiYgcE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBNYXR0ZUNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkb3duc2FtcGxlV2lkdGggPSAwLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRvd25zYW1wbGVIZWlnaHQgPSAwKTsKIAotICAgIHZvaWQJCQkJUmVzZXRCaXRtYXAoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCk7Ci0gICAgdm9pZAkJCQlDbGVhckltYWdlQ2FjaGUoQ1BERl9TdHJlYW0qIHBTdHJlYW0pOwotICAgIENQREZfUGFnZSoJCQlHZXRQYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BQYWdlOwotICAgIH0KLSAgICBDRlhfTWFwUHRyVG9QdHIJCW1fSW1hZ2VDYWNoZXM7Ci1wdWJsaWM6Ci0gICAgRlhfQk9PTAkJCQlTdGFydEdldENhY2hlZEJpdG1hcChDUERGX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLAotICAgICAgICAgICAgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSwgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMgPSBOVUxMLAotICAgICAgICAgICAgRlhfSU5UMzIgZG93bnNhbXBsZVdpZHRoID0gMCwgRlhfSU5UMzIgZG93bnNhbXBsZUhlaWdodCA9IDApOworICB2b2lkIFJlc2V0Qml0bWFwKENQREZfU3RyZWFtKiBwU3RyZWFtLCBjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXApOworICB2b2lkIENsZWFySW1hZ2VDYWNoZUVudHJ5KENQREZfU3RyZWFtKiBwU3RyZWFtKTsKKyAgQ1BERl9QYWdlKiBHZXRQYWdlKCkgY29uc3QgeyByZXR1cm4gbV9wUGFnZTsgfQorICBDUERGX0ltYWdlQ2FjaGVFbnRyeSogR2V0Q3VySW1hZ2VDYWNoZUVudHJ5KCkgY29uc3QgeworICAgIHJldHVybiBtX3BDdXJJbWFnZUNhY2hlRW50cnk7CisgIH0KIAotICAgIEZYX0JPT0wJCQkJQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOwotICAgIENQREZfSW1hZ2VDYWNoZSoJbV9wQ3VySW1hZ2VDYWNoZTsKLSAgICBDRlhfUHRyQXJyYXkqICAgICAgIG1fcEN1ckltYWdlQ2FjaGVzOwotcHJvdGVjdGVkOgotICAgIGZyaWVuZCBjbGFzcwkJQ1BERl9QYWdlOwotICAgIENQREZfUGFnZSoJCQltX3BQYWdlOworICBGWF9CT09MIFN0YXJ0R2V0Q2FjaGVkQml0bWFwKENQREZfU3RyZWFtKiBwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZG93bnNhbXBsZVdpZHRoID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRvd25zYW1wbGVIZWlnaHQgPSAwKTsKIAotICAgIEZYX0RXT1JECQkJbV9uVGltZUNvdW50OwotICAgIEZYX0RXT1JECQkJbV9uQ2FjaGVTaXplOwotICAgIEZYX0JPT0wJCQkJbV9iQ3VyRmluZENhY2hlOworICBGWF9CT09MIENvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKKworIHByb3RlY3RlZDoKKyAgZnJpZW5kIGNsYXNzIENQREZfUGFnZTsKKyAgQ1BERl9QYWdlKiBjb25zdCBtX3BQYWdlOworICBDUERGX0ltYWdlQ2FjaGVFbnRyeSogbV9wQ3VySW1hZ2VDYWNoZUVudHJ5OworICBzdGQ6Om1hcDxDUERGX1N0cmVhbSosIENQREZfSW1hZ2VDYWNoZUVudHJ5Kj4gbV9JbWFnZUNhY2hlOworICBGWF9EV09SRCBtX25UaW1lQ291bnQ7CisgIEZYX0RXT1JEIG1fbkNhY2hlU2l6ZTsKKyAgRlhfQk9PTCBtX2JDdXJGaW5kQ2FjaGU7CiB9OwotY2xhc3MgQ1BERl9SZW5kZXJDb25maWcgCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9SZW5kZXJDb25maWcoKTsKLSAgICB+Q1BERl9SZW5kZXJDb25maWcoKTsKLSAgICBpbnQJCQkJCW1fSGFsZnRvbmVMaW1pdDsKLSAgICBpbnQJCQkJCW1fUmVuZGVyU3RlcExpbWl0OworY2xhc3MgQ1BERl9SZW5kZXJDb25maWcgeworIHB1YmxpYzoKKyAgQ1BERl9SZW5kZXJDb25maWcoKTsKKyAgfkNQREZfUmVuZGVyQ29uZmlnKCk7CisgIGludCBtX0hhbGZ0b25lTGltaXQ7CisgIGludCBtX1JlbmRlclN0ZXBMaW1pdDsKIH07CiAKK0ZYX0JPT0wgSXNBdmFpbGFibGVNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KTsKKwogI2VuZGlmICAvLyBDT1JFX0lOQ0xVREVfRlBERkFQSV9GUERGX1JFTkRFUl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZXNvdXJjZS5oIGIvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZXNvdXJjZS5oCmluZGV4IGYxZWE2YjUuLmIxMGEwMWMgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcmVzb3VyY2UuaAorKysgYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3Jlc291cmNlLmgKQEAgLTEsOTQ4ICsxLDg1NSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIENPUkVfSU5DTFVERV9GUERGQVBJX0ZQREZfUkVTT1VSQ0VfSF8KICNkZWZpbmUgQ09SRV9JTkNMVURFX0ZQREZBUElfRlBERl9SRVNPVVJDRV9IXwogCi0jaW5jbHVkZSAiLi4vZnhnZS9meF9mb250LmgiCisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2ZvbnQuaCIKICNpbmNsdWRlICJmcGRmX3BhcnNlci5oIgogCi1jbGFzcyBDUERGX0ZvbnQ7Ci1jbGFzcyBDUERGX1R5cGUxRm9udDsKLWNsYXNzIENQREZfVHJ1ZVR5cGVGb250OwotY2xhc3MgQ1BERl9DSURGb250OwotY2xhc3MgQ1BERl9UeXBlM0ZvbnQ7Ci1jbGFzcyBDUERGX0ZvbnRFbmNvZGluZzsKLWNsYXNzIENQREZfQ01hcDsKLWNsYXNzIENQREZfQ0lEMlVuaWNvZGVNYXA7Ci1jbGFzcyBDUERGX0NvbG9yU3BhY2U7Ci1jbGFzcyBDUERGX0NvbG9yOwotY2xhc3MgQ1BERl9GdW5jdGlvbjsKLWNsYXNzIENQREZfUGF0dGVybjsKLWNsYXNzIENQREZfVGlsaW5nUGF0dGVybjsKLWNsYXNzIENQREZfU2hhZGluZ1BhdHRlcm47Ci1jbGFzcyBDUERGX0ltYWdlOwotY2xhc3MgQ1BERl9GYWNlOwotY2xhc3MgQ1BERl9Ub1VuaWNvZGVNYXA7Ci1jbGFzcyBDRlhfU3Vic3RGb250OwotY2xhc3MgQ0ZYX0ZvbnQ7Ci1jbGFzcyBDUERGX1JlbmRlckNvbnRleHQ7Ci1jbGFzcyBDUERGX0Zvcm07Ci1jbGFzcyBDUERGX0ltYWdlT2JqZWN0OwotY2xhc3MgQ0ZYX0RJQml0bWFwOwotdHlwZWRlZiBzdHJ1Y3QgRlRfRmFjZVJlY18qIEZYRlRfRmFjZTsKIGNsYXNzIENGWF9DVFRHU1VCVGFibGU7CitjbGFzcyBDRlhfRElCaXRtYXA7CitjbGFzcyBDRlhfRm9udDsKK2NsYXNzIENGWF9TdWJzdEZvbnQ7CitjbGFzcyBDUERGX0NJRDJVbmljb2RlTWFwOworY2xhc3MgQ1BERl9DSURGb250OworY2xhc3MgQ1BERl9DTWFwOworY2xhc3MgQ1BERl9Db2xvcjsKK2NsYXNzIENQREZfQ29sb3JTcGFjZTsKK2NsYXNzIENQREZfRmFjZTsKK2NsYXNzIENQREZfRm9udEVuY29kaW5nOworY2xhc3MgQ1BERl9Gb3JtOworY2xhc3MgQ1BERl9GdW5jdGlvbjsKK2NsYXNzIENQREZfSW1hZ2U7CitjbGFzcyBDUERGX0ltYWdlT2JqZWN0OwogY2xhc3MgQ1BERl9QYWdlOworY2xhc3MgQ1BERl9QYXR0ZXJuOworY2xhc3MgQ1BERl9SZW5kZXJDb250ZXh0OworY2xhc3MgQ1BERl9TaGFkaW5nUGF0dGVybjsKK2NsYXNzIENQREZfVGlsaW5nUGF0dGVybjsKK2NsYXNzIENQREZfVG9Vbmljb2RlTWFwOworY2xhc3MgQ1BERl9UcnVlVHlwZUZvbnQ7CitjbGFzcyBDUERGX1R5cGUxRm9udDsKK2NsYXNzIENQREZfVHlwZTNGb250OwordHlwZWRlZiBzdHJ1Y3QgRlRfRmFjZVJlY18qIEZYRlRfRmFjZTsKIAotdGVtcGxhdGUgPGNsYXNzIE9iakNsYXNzPiBjbGFzcyBDUERGX0NvdW50ZWRPYmplY3QgCi17Ci1wdWJsaWM6Ci0gICAgT2JqQ2xhc3MJbV9PYmo7Ci0gICAgRlhfRFdPUkQJbV9uQ291bnQ7Ci19OwotdHlwZWRlZiBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9Gb250Kj4gICAgICAgICAgQ1BERl9Db3VudGVkRm9udDsKLXR5cGVkZWYgQ1BERl9Db3VudGVkT2JqZWN0PENQREZfQ29sb3JTcGFjZSo+ICAgIENQREZfQ291bnRlZENvbG9yU3BhY2U7Ci10eXBlZGVmIENQREZfQ291bnRlZE9iamVjdDxDUERGX1BhdHRlcm4qPiAgICAgICBDUERGX0NvdW50ZWRQYXR0ZXJuOwotdHlwZWRlZiBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9JbWFnZSo+ICAgICAgICAgQ1BERl9Db3VudGVkSW1hZ2U7Ci10eXBlZGVmIENQREZfQ291bnRlZE9iamVjdDxDUERGX0ljY1Byb2ZpbGUqPiAgICBDUERGX0NvdW50ZWRJQ0NQcm9maWxlOwotdHlwZWRlZiBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9TdHJlYW1BY2MqPiAgICAgQ1BERl9Db3VudGVkU3RyZWFtQWNjOwotCi0KLXR5cGVkZWYgQ0ZYX01hcFB0clRlbXBsYXRlPENQREZfRGljdGlvbmFyeSosIENQREZfQ291bnRlZEZvbnQqPiAgICAgQ1BERl9Gb250TWFwOwotdHlwZWRlZiBDRlhfTWFwUHRyVGVtcGxhdGU8Q1BERl9PYmplY3QqLCBDUERGX0NvdW50ZWRDb2xvclNwYWNlKj4gICBDUERGX0NvbG9yU3BhY2VNYXA7Ci10eXBlZGVmIENGWF9NYXBQdHJUZW1wbGF0ZTxDUERGX09iamVjdCosIENQREZfQ291bnRlZFBhdHRlcm4qPiAgICAgIENQREZfUGF0dGVybk1hcDsKLXR5cGVkZWYgQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0RXT1JELCBDUERGX0NvdW50ZWRJbWFnZSo+ICAgICAgICAgICAgQ1BERl9JbWFnZU1hcDsKLXR5cGVkZWYgQ0ZYX01hcFB0clRlbXBsYXRlPENQREZfU3RyZWFtKiwgQ1BERl9Db3VudGVkSUNDUHJvZmlsZSo+ICAgQ1BERl9JY2NQcm9maWxlTWFwOwotdHlwZWRlZiBDRlhfTWFwUHRyVGVtcGxhdGU8Q1BERl9TdHJlYW0qLCBDUERGX0NvdW50ZWRTdHJlYW1BY2MqPiAgICBDUERGX0ZvbnRGaWxlTWFwOwotCi0jZGVmaW5lIFBERkZPTlRfVFlQRTEJCQkxCi0jZGVmaW5lIFBERkZPTlRfVFJVRVRZUEUJCTIKLSNkZWZpbmUgUERGRk9OVF9UWVBFMwkJCTMKLSNkZWZpbmUgUERGRk9OVF9DSURGT05UCQkJNAotI2RlZmluZSBQREZGT05UX0ZJWEVEUElUQ0gJCTEKLSNkZWZpbmUgUERGRk9OVF9TRVJJRgkJCTIKLSNkZWZpbmUgUERGRk9OVF9TWU1CT0xJQwkJNAotI2RlZmluZSBQREZGT05UX1NDUklQVAkJCTgKLSNkZWZpbmUgUERGRk9OVF9OT05TWU1CT0xJQwkJMzIKLSNkZWZpbmUgUERGRk9OVF9JVEFMSUMJCQk2NAotI2RlZmluZSBQREZGT05UX0FMTENBUAkJCTB4MTAwMDAKLSNkZWZpbmUgUERGRk9OVF9TTUFMTENBUAkJMHgyMDAwMAotI2RlZmluZSBQREZGT05UX0ZPUkNFQk9MRAkJMHg0MDAwMAotI2RlZmluZSBQREZGT05UX1VTRUVYVEVSTkFUVFIJMHg4MDAwMAogRlhfV0NIQVIgUERGX1VuaWNvZGVGcm9tQWRvYmVOYW1lKGNvbnN0IEZYX0NIQVIqIG5hbWUpOwogQ0ZYX0J5dGVTdHJpbmcgUERGX0Fkb2JlTmFtZUZyb21Vbmljb2RlKEZYX1dDSEFSIHVuaWNvZGUpOwotY2xhc3MgQ1BERl9Gb250Ci17Ci1wdWJsaWM6Ci0gICAgc3RhdGljIENQREZfRm9udCoJCUNyZWF0ZUZvbnRGKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0KTsKLSAgICBzdGF0aWMgQ1BERl9Gb250KgkJR2V0U3RvY2tGb250KENQREZfRG9jdW1lbnQqIHBEb2MsIEZYX0JTVFIgZm9udG5hbWUpOworY29uc3QgRlhfQ0hBUiogRkNTX0dldEFsdFN0cihGWF9XQ0hBUiB1bmljb2RlKTsKK2NvbnN0IEZYX0NIQVIqIFBERl9DaGFyTmFtZUZyb21QcmVkZWZpbmVkQ2hhclNldChpbnQgZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjaGFyY29kZSk7CiAKLSAgICB2aXJ0dWFsIH5DUERGX0ZvbnQoKTsKK0ZYX1dDSEFSIEZUX1VuaWNvZGVGcm9tQ2hhckNvZGUoaW50IGVuY29kaW5nLCBGWF9EV09SRCBjaGFyY29kZSk7CitGWF9EV09SRCBGVF9DaGFyQ29kZUZyb21Vbmljb2RlKGludCBlbmNvZGluZywgRlhfV0NIQVIgdW5pY29kZSk7Citjb25zdCBGWF9XT1JEKiBQREZfVW5pY29kZXNGb3JQcmVkZWZpbmVkQ2hhclNldChpbnQgZW5jb2RpbmcpOworY29uc3QgRlhfQ0hBUiogR2V0QWRvYmVDaGFyTmFtZShpbnQgaUJhc2VFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcqIHBDaGFyTmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFyY29kZSk7CiAKLSAgICBib29sIElzRm9udFR5cGUoaW50IGZvbnR0eXBlKSBjb25zdCB7IHJldHVybiBmb250dHlwZSA9PSBtX0ZvbnRUeXBlOyB9Ci0gICAgaW50CUdldEZvbnRUeXBlKCkgY29uc3QgeyByZXR1cm4gbV9Gb250VHlwZTsgIH0KK3RlbXBsYXRlIDxjbGFzcyBUPgorY2xhc3MgQ1BERl9Db3VudGVkT2JqZWN0IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENQREZfQ291bnRlZE9iamVjdChUKiBwdHIpIDogbV9uQ291bnQoMSksIG1fcE9iaihwdHIpIHt9CisgIHZvaWQgcmVzZXQoVCogcHRyKSB7ICAvLyBDQVVUSU9OOiB0b3NzZXMgcHJpb3IgcmVmIGNvdW50cy4KKyAgICBtX25Db3VudCA9IDE7CisgICAgbV9wT2JqID0gcHRyOworICB9CisgIHZvaWQgY2xlYXIoKSB7ICAvLyBOb3cgeW91J3JlIGFsbCB3ZWFrIHB0cnMgLi4uCisgICAgZGVsZXRlIG1fcE9iajsKKyAgICBtX3BPYmogPSBudWxscHRyOworICB9CisgIFQqIGdldCgpIGNvbnN0IHsgcmV0dXJuIG1fcE9iajsgfQorICBUKiBBZGRSZWYoKSB7CisgICAgRlhTWVNfYXNzZXJ0KG1fcE9iaik7CisgICAgKyttX25Db3VudDsKKyAgICByZXR1cm4gbV9wT2JqOworICB9CisgIHZvaWQgUmVtb3ZlUmVmKCkgeworICAgIGlmIChtX25Db3VudCkKKyAgICAgIC0tbV9uQ291bnQ7CisgIH0KKyAgc2l6ZV90IHVzZV9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fbkNvdW50OyB9CiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJCUdldEZvbnRUeXBlTmFtZSgpIGNvbnN0OwotCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmCUdldEJhc2VGb250KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0Jhc2VGb250OwotICAgIH0KLQotICAgIGNvbnN0IENGWF9TdWJzdEZvbnQqCUdldFN1YnN0Rm9udCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9Gb250LkdldFN1YnN0Rm9udCgpOwotICAgIH0KLQotICAgIEZYX0RXT1JECQkJCUdldEZsYWdzKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0ZsYWdzOwotICAgIH0KLQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzVmVydFdyaXRpbmcoKWNvbnN0OwotCi0KLQotCi0gICAgQ1BERl9UeXBlMUZvbnQqCQkJR2V0VHlwZTFGb250KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0ZvbnRUeXBlID09IFBERkZPTlRfVFlQRTEgPyAoQ1BERl9UeXBlMUZvbnQqKSh2b2lkKil0aGlzIDogTlVMTDsKLSAgICB9Ci0KLSAgICBDUERGX1RydWVUeXBlRm9udCoJCUdldFRydWVUeXBlRm9udCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9Gb250VHlwZSA9PSBQREZGT05UX1RSVUVUWVBFID8gKENQREZfVHJ1ZVR5cGVGb250Kikodm9pZCopdGhpcyA6IE5VTEw7Ci0gICAgfQotCi0gICAgQ1BERl9DSURGb250KgkJCUdldENJREZvbnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIChtX0ZvbnRUeXBlID09IFBERkZPTlRfQ0lERk9OVCkgPyAoQ1BERl9DSURGb250Kikodm9pZCopdGhpcyA6IE5VTEw7Ci0gICAgfQotCi0gICAgQ1BERl9UeXBlM0ZvbnQqCQkJR2V0VHlwZTNGb250KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiAobV9Gb250VHlwZSA9PSBQREZGT05UX1RZUEUzKSA/IChDUERGX1R5cGUzRm9udCopKHZvaWQqKXRoaXMgOiBOVUxMOwotICAgIH0KLQotCi0gICAgRlhfQk9PTAkJCQkJSXNFbWJlZGRlZCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9Gb250VHlwZSA9PSBQREZGT05UX1RZUEUzIHx8IG1fcEZvbnRGaWxlICE9IE5VTEw7Ci0gICAgfQotCi0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNVbmljb2RlQ29tcGF0aWJsZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgQ1BERl9TdHJlYW1BY2MqCQkJR2V0Rm9udEZpbGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEZvbnRGaWxlOwotICAgIH0KLQotICAgIENQREZfRGljdGlvbmFyeSoJCUdldEZvbnREaWN0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BGb250RGljdDsKLSAgICB9Ci0KLSAgICBGWF9CT09MCQkJCQlJc1N0YW5kYXJkRm9udCgpIGNvbnN0OwotCi0gICAgRlhGVF9GYWNlCQkJCUdldEZhY2UoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fRm9udC5HZXRGYWNlKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBGWF9EV09SRAkJR2V0TmV4dENoYXIoRlhfTFBDU1RSIHBTdHJpbmcsIGludCBuU3RyTGVuLCBpbnQmIG9mZnNldCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG5TdHJMZW4gPCAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBGWF9CWVRFIGNoID0gb2Zmc2V0IDwgblN0ckxlbiA/IHBTdHJpbmdbb2Zmc2V0KytdIDogcFN0cmluZ1tuU3RyTGVuLTFdOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RlhfRFdPUkQ+KGNoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGludAkJCQlDb3VudENoYXIoRlhfTFBDU1RSIHBTdHJpbmcsIGludCBzaXplKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgdm9pZAkJCQkJQXBwZW5kQ2hhcihDRlhfQnl0ZVN0cmluZyYgc3RyLCBGWF9EV09SRCBjaGFyY29kZSkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGludAkJCQlBcHBlbmRDaGFyKEZYX0xQU1RSIGJ1ZiwgRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0Ci0gICAgewotICAgICAgICAqYnVmID0gKEZYX0NIQVIpY2hhcmNvZGU7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIHZpcnR1YWwgaW50CQkJCUdldENoYXJTaXplKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0KLQotCi0gICAgdmlydHVhbCBpbnQJCQkJR2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUsIEZYX0JPT0wgKnBWZXJ0R2x5cGggPSBOVUxMKSA9IDA7Ci0gICAgdmlydHVhbCBpbnQJCQkJR2x5cGhGcm9tQ2hhckNvZGVFeHQoRlhfRFdPUkQgY2hhcmNvZGUpCi0gICAgewotICAgICAgICByZXR1cm4gR2x5cGhGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOwotICAgIH0KLQotICAgIENGWF9XaWRlU3RyaW5nCQkJVW5pY29kZUZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3Q7Ci0KLSAgICBGWF9EV09SRAkJCQlDaGFyQ29kZUZyb21Vbmljb2RlKEZYX1dDSEFSIFVuaWNvZGUpIGNvbnN0OwotCi0gICAgQ0ZYX0NoYXJNYXAqCQkJR2V0Q2hhck1hcCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wQ2hhck1hcDsKLSAgICB9Ci0KLSAgICBDRlhfQnl0ZVN0cmluZwkJCUVuY29kZVN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKSBjb25zdDsKLQotICAgIENGWF9XaWRlU3RyaW5nCQkJRGVjb2RlU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpIGNvbnN0OwotCi0KLQotCi0gICAgdm9pZAkJCQkJR2V0Rm9udEJCb3goRlhfUkVDVCYgcmVjdCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJlY3QgPSBtX0ZvbnRCQm94OwotICAgIH0KLQotICAgIGludAkJCQkJCUdldFR5cGVBc2NlbnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fQXNjZW50OwotICAgIH0KLQotICAgIGludAkJCQkJCUdldFR5cGVEZXNjZW50KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0Rlc2NlbnQ7Ci0gICAgfQotCi0gICAgaW50CQkJCQkJR2V0SXRhbGljQW5nbGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fSXRhbGljQW5nbGU7Ci0gICAgfQotCi0gICAgaW50CQkJCQkJR2V0U3RlbVYoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fU3RlbVY7Ci0gICAgfQotCi0gICAgaW50CQkJCQkJR2V0U3RyaW5nV2lkdGgoY29uc3QgRlhfQ0hBUiogcFN0cmluZywgaW50IHNpemUpOwotCi0gICAgdmlydHVhbCBpbnQJCQkJR2V0Q2hhcldpZHRoRihGWF9EV09SRCBjaGFyY29kZSwgaW50IGxldmVsID0gMCkgPSAwOwotCi0gICAgdmlydHVhbCBpbnQJCQkJR2V0Q2hhclR5cGVXaWR0aChGWF9EV09SRCBjaGFyY29kZSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQJCQlHZXRDaGFyQkJveChGWF9EV09SRCBjaGFyY29kZSwgRlhfUkVDVCYgcmVjdCwgaW50IGxldmVsID0gMCkgPSAwOwotCi0KLQotICAgIENQREZfRG9jdW1lbnQqCQkJbV9wRG9jdW1lbnQ7Ci0KLSAgICBjbGFzcyBDRlhfUGF0aERhdGEqCQlMb2FkR2x5cGhQYXRoKEZYX0RXT1JEIGNoYXJjb2RlLCBpbnQgZGVzdF93aWR0aCA9IDApOwotCi0gICAgQ0ZYX0ZvbnQJCQkJbV9Gb250OwotCi1wcm90ZWN0ZWQ6Ci0gICAgZXhwbGljaXQgQ1BERl9Gb250KGludCBmb250dHlwZSk7Ci0KLSAgICBGWF9CT09MCQkJCQlJbml0aWFsaXplKCk7Ci0KLSAgICBGWF9CT09MCQkJCQlMb2FkKCk7Ci0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlfTG9hZCgpID0gMDsKLQotICAgIHZpcnR1YWwgRlhfV0NIQVIJCV9Vbmljb2RlRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECQlfQ2hhckNvZGVGcm9tVW5pY29kZShGWF9XQ0hBUiBVbmljb2RlKSBjb25zdCA9IDA7Ci0KLSAgICB2b2lkCQkJCQlMb2FkVW5pY29kZU1hcCgpOwotCi0gICAgdm9pZAkJCQkJTG9hZFBERkVuY29kaW5nKENQREZfT2JqZWN0KiBwRW5jb2RpbmcsIGludCYgaUJhc2VFbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcqJiBwQ2hhck5hbWVzLCBGWF9CT09MIGJFbWJlZGRlZCwgRlhfQk9PTCBiVHJ1ZVR5cGUpOwotCi0gICAgdm9pZAkJCQkJTG9hZEZvbnREZXNjcmlwdG9yKENQREZfRGljdGlvbmFyeSopOwotCi0gICAgdm9pZAkJCQkJTG9hZENoYXJXaWR0aHMoRlhfV09SRCogcFdpZHRocyk7Ci0KLSAgICB2b2lkCQkJCQlDaGVja0ZvbnRNZXRyaWNzKCk7Ci0KLSAgICBDRlhfQ2hhck1hcCoJCQltX3BDaGFyTWFwOwotCi0KLQotICAgIENGWF9CeXRlU3RyaW5nCQkJbV9CYXNlRm9udDsKLQotICAgIENQREZfU3RyZWFtQWNjKgkJCW1fcEZvbnRGaWxlOwotCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgkJbV9wRm9udERpY3Q7Ci0KLSAgICBDUERGX1RvVW5pY29kZU1hcCoJCW1fcFRvVW5pY29kZU1hcDsKLQotICAgIEZYX0JPT0wJCQkJCW1fYlRvVW5pY29kZUxvYWRlZDsKLQotCi0KLQotICAgIGludAkJCQkJCW1fRmxhZ3M7Ci0KLSAgICBGWF9SRUNUCQkJCQltX0ZvbnRCQm94OwotCi0gICAgaW50CQkJCQkJbV9TdGVtVjsKLQotICAgIGludAkJCQkJCW1fQXNjZW50OwotCi0gICAgaW50CQkJCQkJbV9EZXNjZW50OwotCi0gICAgaW50CQkJCQkJbV9JdGFsaWNBbmdsZTsKLQotcHJpdmF0ZToKLSAgICBjb25zdCBpbnQJCQkJbV9Gb250VHlwZTsKKyBwcm90ZWN0ZWQ6CisgIHNpemVfdCBtX25Db3VudDsKKyAgVCogbV9wT2JqOwogfTsKLSNkZWZpbmUgUERGRk9OVF9FTkNPRElOR19CVUlMVElOCQkwCi0jZGVmaW5lIFBERkZPTlRfRU5DT0RJTkdfV0lOQU5TSQkJMQotI2RlZmluZSBQREZGT05UX0VOQ09ESU5HX01BQ1JPTUFOCQkyCi0jZGVmaW5lIFBERkZPTlRfRU5DT0RJTkdfTUFDRVhQRVJUCQkzCi0jZGVmaW5lIFBERkZPTlRfRU5DT0RJTkdfU1RBTkRBUkQJCTQKLSNkZWZpbmUgUERGRk9OVF9FTkNPRElOR19BRE9CRV9TWU1CT0wJNQotI2RlZmluZSBQREZGT05UX0VOQ09ESU5HX1pBUEZESU5HQkFUUwk2Ci0jZGVmaW5lIFBERkZPTlRfRU5DT0RJTkdfUERGRE9DCQkJNwotI2RlZmluZSBQREZGT05UX0VOQ09ESU5HX01TX1NZTUJPTAkJOAotI2RlZmluZSBQREZGT05UX0VOQ09ESU5HX1VOSUNPREUJCTkKLWNsYXNzIENQREZfRm9udEVuY29kaW5nIAotewotcHVibGljOgordXNpbmcgQ1BERl9Db3VudGVkQ29sb3JTcGFjZSA9IENQREZfQ291bnRlZE9iamVjdDxDUERGX0NvbG9yU3BhY2U+OwordXNpbmcgQ1BERl9Db3VudGVkUGF0dGVybiA9IENQREZfQ291bnRlZE9iamVjdDxDUERGX1BhdHRlcm4+OworI2RlZmluZSBQREZGT05UX1RZUEUxIDEKKyNkZWZpbmUgUERGRk9OVF9UUlVFVFlQRSAyCisjZGVmaW5lIFBERkZPTlRfVFlQRTMgMworI2RlZmluZSBQREZGT05UX0NJREZPTlQgNAorI2RlZmluZSBQREZGT05UX0ZJWEVEUElUQ0ggMQorI2RlZmluZSBQREZGT05UX1NFUklGIDIKKyNkZWZpbmUgUERGRk9OVF9TWU1CT0xJQyA0CisjZGVmaW5lIFBERkZPTlRfU0NSSVBUIDgKKyNkZWZpbmUgUERGRk9OVF9OT05TWU1CT0xJQyAzMgorI2RlZmluZSBQREZGT05UX0lUQUxJQyA2NAorI2RlZmluZSBQREZGT05UX0FMTENBUCAweDEwMDAwCisjZGVmaW5lIFBERkZPTlRfU01BTExDQVAgMHgyMDAwMAorI2RlZmluZSBQREZGT05UX0ZPUkNFQk9MRCAweDQwMDAwCisjZGVmaW5lIFBERkZPTlRfVVNFRVhURVJOQVRUUiAweDgwMDAwCitjbGFzcyBDUERGX0ZvbnQgeworIHB1YmxpYzoKKyAgc3RhdGljIENQREZfRm9udCogQ3JlYXRlRm9udEYoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QpOworICBzdGF0aWMgQ1BERl9Gb250KiBHZXRTdG9ja0ZvbnQoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZm9udG5hbWUpOworICBzdGF0aWMgY29uc3QgRlhfRFdPUkQga0ludmFsaWRDaGFyQ29kZSA9IHN0YXRpY19jYXN0PEZYX0RXT1JEPigtMSk7CiAKLSAgICBDUERGX0ZvbnRFbmNvZGluZygpOworICB2aXJ0dWFsIH5DUERGX0ZvbnQoKTsKIAotICAgIENQREZfRm9udEVuY29kaW5nKGludCBQcmVkZWZpbmVkRW5jb2RpbmcpOworICBib29sIElzRm9udFR5cGUoaW50IGZvbnR0eXBlKSBjb25zdCB7IHJldHVybiBmb250dHlwZSA9PSBtX0ZvbnRUeXBlOyB9CisgIGludCBHZXRGb250VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fRm9udFR5cGU7IH0KIAotICAgIHZvaWQJCQkJCUxvYWRFbmNvZGluZyhDUERGX09iamVjdCogcEVuY29kaW5nKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0Rm9udFR5cGVOYW1lKCkgY29uc3Q7CiAKLSAgICBGWF9CT09MCQkJCQlJc0lkZW50aWNhbChDUERGX0ZvbnRFbmNvZGluZyogcEFub3RoZXIpIGNvbnN0OworICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgR2V0QmFzZUZvbnQoKSBjb25zdCB7IHJldHVybiBtX0Jhc2VGb250OyB9CiAKLSAgICBGWF9XQ0hBUgkJCQlVbmljb2RlRnJvbUNoYXJDb2RlKEZYX0JZVEUgY2hhcmNvZGUpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9Vbmljb2Rlc1tjaGFyY29kZV07CisgIGNvbnN0IENGWF9TdWJzdEZvbnQqIEdldFN1YnN0Rm9udCgpIGNvbnN0IHsgcmV0dXJuIG1fRm9udC5HZXRTdWJzdEZvbnQoKTsgfQorCisgIEZYX0RXT1JEIEdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gbV9GbGFnczsgfQorCisgIHZpcnR1YWwgRlhfQk9PTCBJc1ZlcnRXcml0aW5nKCkgY29uc3Q7CisKKyAgQ1BERl9UeXBlMUZvbnQqIEdldFR5cGUxRm9udCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9Gb250VHlwZSA9PSBQREZGT05UX1RZUEUxID8gKENQREZfVHlwZTFGb250Kikodm9pZCopdGhpcyA6IE5VTEw7CisgIH0KKworICBDUERGX1RydWVUeXBlRm9udCogR2V0VHJ1ZVR5cGVGb250KCkgY29uc3QgeworICAgIHJldHVybiBtX0ZvbnRUeXBlID09IFBERkZPTlRfVFJVRVRZUEUgPyAoQ1BERl9UcnVlVHlwZUZvbnQqKSh2b2lkKil0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7CisgIH0KKworICBDUERGX0NJREZvbnQqIEdldENJREZvbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIChtX0ZvbnRUeXBlID09IFBERkZPTlRfQ0lERk9OVCkgPyAoQ1BERl9DSURGb250Kikodm9pZCopdGhpcyA6IE5VTEw7CisgIH0KKworICBDUERGX1R5cGUzRm9udCogR2V0VHlwZTNGb250KCkgY29uc3QgeworICAgIHJldHVybiAobV9Gb250VHlwZSA9PSBQREZGT05UX1RZUEUzKSA/IChDUERGX1R5cGUzRm9udCopKHZvaWQqKXRoaXMgOiBOVUxMOworICB9CisKKyAgRlhfQk9PTCBJc0VtYmVkZGVkKCkgY29uc3QgeworICAgIHJldHVybiBtX0ZvbnRUeXBlID09IFBERkZPTlRfVFlQRTMgfHwgbV9wRm9udEZpbGUgIT0gTlVMTDsKKyAgfQorCisgIHZpcnR1YWwgRlhfQk9PTCBJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3QgeyByZXR1cm4gRkFMU0U7IH0KKworICBDUERGX1N0cmVhbUFjYyogR2V0Rm9udEZpbGUoKSBjb25zdCB7IHJldHVybiBtX3BGb250RmlsZTsgfQorCisgIENQREZfRGljdGlvbmFyeSogR2V0Rm9udERpY3QoKSBjb25zdCB7IHJldHVybiBtX3BGb250RGljdDsgfQorCisgIEZYX0JPT0wgSXNTdGFuZGFyZEZvbnQoKSBjb25zdDsKKworICBGWEZUX0ZhY2UgR2V0RmFjZSgpIGNvbnN0IHsgcmV0dXJuIG1fRm9udC5HZXRGYWNlKCk7IH0KKworICB2aXJ0dWFsIEZYX0RXT1JEIEdldE5leHRDaGFyKGNvbnN0IEZYX0NIQVIqIHBTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5TdHJMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBvZmZzZXQpIGNvbnN0IHsKKyAgICBpZiAob2Zmc2V0IDwgMCB8fCBuU3RyTGVuIDwgMSkgeworICAgICAgcmV0dXJuIDA7CiAgICAgfQorICAgIHVpbnQ4X3QgY2ggPSBvZmZzZXQgPCBuU3RyTGVuID8gcFN0cmluZ1tvZmZzZXQrK10gOiBwU3RyaW5nW25TdHJMZW4gLSAxXTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RlhfRFdPUkQ+KGNoKTsKKyAgfQogCi0gICAgaW50CQkJCQkJQ2hhckNvZGVGcm9tVW5pY29kZShGWF9XQ0hBUiB1bmljb2RlKSBjb25zdDsKKyAgdmlydHVhbCBpbnQgQ291bnRDaGFyKGNvbnN0IEZYX0NIQVIqIHBTdHJpbmcsIGludCBzaXplKSBjb25zdCB7IHJldHVybiBzaXplOyB9CiAKLSAgICB2b2lkCQkJCQlTZXRVbmljb2RlKEZYX0JZVEUgY2hhcmNvZGUsIEZYX1dDSEFSIHVuaWNvZGUpCi0gICAgewotICAgICAgICBtX1VuaWNvZGVzW2NoYXJjb2RlXSA9IHVuaWNvZGU7Ci0gICAgfQorICB2b2lkIEFwcGVuZENoYXIoQ0ZYX0J5dGVTdHJpbmcmIHN0ciwgRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0OwogCi0gICAgQ1BERl9PYmplY3QqCQkJUmVhbGl6ZSgpOwotcHVibGljOgorICB2aXJ0dWFsIGludCBBcHBlbmRDaGFyKEZYX0NIQVIqIGJ1ZiwgRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0IHsKKyAgICAqYnVmID0gKEZYX0NIQVIpY2hhcmNvZGU7CisgICAgcmV0dXJuIDE7CisgIH0KIAotICAgIEZYX1dDSEFSCQkJCW1fVW5pY29kZXNbMjU2XTsKKyAgdmlydHVhbCBpbnQgR2V0Q2hhclNpemUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0IHsgcmV0dXJuIDE7IH0KKworICB2aXJ0dWFsIGludCBHbHlwaEZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCogcFZlcnRHbHlwaCA9IE5VTEwpID0gMDsKKyAgdmlydHVhbCBpbnQgR2x5cGhGcm9tQ2hhckNvZGVFeHQoRlhfRFdPUkQgY2hhcmNvZGUpIHsKKyAgICByZXR1cm4gR2x5cGhGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOworICB9CisKKyAgQ0ZYX1dpZGVTdHJpbmcgVW5pY29kZUZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3Q7CisKKyAgRlhfRFdPUkQgQ2hhckNvZGVGcm9tVW5pY29kZShGWF9XQ0hBUiBVbmljb2RlKSBjb25zdDsKKworICBDRlhfQ2hhck1hcCogR2V0Q2hhck1hcCgpIHsgcmV0dXJuIG1fcENoYXJNYXA7IH0KKworICBDRlhfQnl0ZVN0cmluZyBFbmNvZGVTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikgY29uc3Q7CisKKyAgQ0ZYX1dpZGVTdHJpbmcgRGVjb2RlU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpIGNvbnN0OworCisgIHZvaWQgR2V0Rm9udEJCb3goRlhfUkVDVCYgcmVjdCkgY29uc3QgeyByZWN0ID0gbV9Gb250QkJveDsgfQorCisgIGludCBHZXRUeXBlQXNjZW50KCkgY29uc3QgeyByZXR1cm4gbV9Bc2NlbnQ7IH0KKworICBpbnQgR2V0VHlwZURlc2NlbnQoKSBjb25zdCB7IHJldHVybiBtX0Rlc2NlbnQ7IH0KKworICBpbnQgR2V0SXRhbGljQW5nbGUoKSBjb25zdCB7IHJldHVybiBtX0l0YWxpY0FuZ2xlOyB9CisKKyAgaW50IEdldFN0ZW1WKCkgY29uc3QgeyByZXR1cm4gbV9TdGVtVjsgfQorCisgIGludCBHZXRTdHJpbmdXaWR0aChjb25zdCBGWF9DSEFSKiBwU3RyaW5nLCBpbnQgc2l6ZSk7CisKKyAgdmlydHVhbCBpbnQgR2V0Q2hhcldpZHRoRihGWF9EV09SRCBjaGFyY29kZSwgaW50IGxldmVsID0gMCkgPSAwOworCisgIHZpcnR1YWwgaW50IEdldENoYXJUeXBlV2lkdGgoRlhfRFdPUkQgY2hhcmNvZGUpOworCisgIHZpcnR1YWwgdm9pZCBHZXRDaGFyQkJveChGWF9EV09SRCBjaGFyY29kZSwgRlhfUkVDVCYgcmVjdCwgaW50IGxldmVsID0gMCkgPSAwOworCisgIENQREZfRG9jdW1lbnQqIG1fcERvY3VtZW50OworCisgIGNsYXNzIENGWF9QYXRoRGF0YSogTG9hZEdseXBoUGF0aChGWF9EV09SRCBjaGFyY29kZSwgaW50IGRlc3Rfd2lkdGggPSAwKTsKKworICBDRlhfRm9udCBtX0ZvbnQ7CisKKyBwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IENQREZfRm9udChpbnQgZm9udHR5cGUpOworCisgIEZYX0JPT0wgSW5pdGlhbGl6ZSgpOworCisgIEZYX0JPT0wgTG9hZCgpOworCisgIHZpcnR1YWwgRlhfQk9PTCBfTG9hZCgpID0gMDsKKworICB2aXJ0dWFsIEZYX1dDSEFSIF9Vbmljb2RlRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBGWF9EV09SRCBfQ2hhckNvZGVGcm9tVW5pY29kZShGWF9XQ0hBUiBVbmljb2RlKSBjb25zdCA9IDA7CisKKyAgdm9pZCBMb2FkVW5pY29kZU1hcCgpOworCisgIHZvaWQgTG9hZFBERkVuY29kaW5nKENQREZfT2JqZWN0KiBwRW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIGludCYgaUJhc2VFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcqJiBwQ2hhck5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJFbWJlZGRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJ1ZVR5cGUpOworCisgIHZvaWQgTG9hZEZvbnREZXNjcmlwdG9yKENQREZfRGljdGlvbmFyeSopOworCisgIHZvaWQgTG9hZENoYXJXaWR0aHMoRlhfV09SRCogcFdpZHRocyk7CisKKyAgdm9pZCBDaGVja0ZvbnRNZXRyaWNzKCk7CisKKyAgQ0ZYX0NoYXJNYXAqIG1fcENoYXJNYXA7CisKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9CYXNlRm9udDsKKworICBDUERGX1N0cmVhbUFjYyogbV9wRm9udEZpbGU7CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BGb250RGljdDsKKworICBDUERGX1RvVW5pY29kZU1hcCogbV9wVG9Vbmljb2RlTWFwOworCisgIEZYX0JPT0wgbV9iVG9Vbmljb2RlTG9hZGVkOworCisgIGludCBtX0ZsYWdzOworCisgIEZYX1JFQ1QgbV9Gb250QkJveDsKKworICBpbnQgbV9TdGVtVjsKKworICBpbnQgbV9Bc2NlbnQ7CisKKyAgaW50IG1fRGVzY2VudDsKKworICBpbnQgbV9JdGFsaWNBbmdsZTsKKworIHByaXZhdGU6CisgIGNvbnN0IGludCBtX0ZvbnRUeXBlOwogfTsKLWNsYXNzIENQREZfU2ltcGxlRm9udCA6IHB1YmxpYyBDUERGX0ZvbnQKLXsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBDUERGX1NpbXBsZUZvbnQoaW50IGZvbnR0eXBlKTsKLSAgICB+Q1BERl9TaW1wbGVGb250KCkgb3ZlcnJpZGU7CisjZGVmaW5lIFBERkZPTlRfRU5DT0RJTkdfQlVJTFRJTiAwCisjZGVmaW5lIFBERkZPTlRfRU5DT0RJTkdfV0lOQU5TSSAxCisjZGVmaW5lIFBERkZPTlRfRU5DT0RJTkdfTUFDUk9NQU4gMgorI2RlZmluZSBQREZGT05UX0VOQ09ESU5HX01BQ0VYUEVSVCAzCisjZGVmaW5lIFBERkZPTlRfRU5DT0RJTkdfU1RBTkRBUkQgNAorI2RlZmluZSBQREZGT05UX0VOQ09ESU5HX0FET0JFX1NZTUJPTCA1CisjZGVmaW5lIFBERkZPTlRfRU5DT0RJTkdfWkFQRkRJTkdCQVRTIDYKKyNkZWZpbmUgUERGRk9OVF9FTkNPRElOR19QREZET0MgNworI2RlZmluZSBQREZGT05UX0VOQ09ESU5HX01TX1NZTUJPTCA4CisjZGVmaW5lIFBERkZPTlRfRU5DT0RJTkdfVU5JQ09ERSA5CitjbGFzcyBDUERGX0ZvbnRFbmNvZGluZyB7CisgcHVibGljOgorICBDUERGX0ZvbnRFbmNvZGluZygpOwogCi0gICAgQ1BERl9Gb250RW5jb2RpbmcqCQlHZXRFbmNvZGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gJm1fRW5jb2Rpbmc7Ci0gICAgfQotICAgIHZpcnR1YWwgaW50CQkJCUdldENoYXJXaWR0aEYoRlhfRFdPUkQgY2hhcmNvZGUsIGludCBsZXZlbCA9IDApOwotICAgIHZpcnR1YWwgdm9pZAkJCUdldENoYXJCQm94KEZYX0RXT1JEIGNoYXJjb2RlLCBGWF9SRUNUJiByZWN0LCBpbnQgbGV2ZWwgPSAwKTsKLSAgICB2aXJ0dWFsIGludAkJCQlHbHlwaEZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSwgRlhfQk9PTCAqcFZlcnRHbHlwaCA9IE5VTEwpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzVW5pY29kZUNvbXBhdGlibGUoKSBjb25zdDsKLXByb3RlY3RlZDoKKyAgQ1BERl9Gb250RW5jb2RpbmcoaW50IFByZWRlZmluZWRFbmNvZGluZyk7CiAKLSAgICBGWF9CT09MCQkJCQlMb2FkQ29tbW9uKCk7CisgIHZvaWQgTG9hZEVuY29kaW5nKENQREZfT2JqZWN0KiBwRW5jb2RpbmcpOwogCi0gICAgdm9pZAkJCQkJTG9hZFN1YnN0Rm9udCgpOworICBGWF9CT09MIElzSWRlbnRpY2FsKENQREZfRm9udEVuY29kaW5nKiBwQW5vdGhlcikgY29uc3Q7CiAKLSAgICB2b2lkCQkJCQlMb2FkRmFjZU1ldHJpY3MoKTsKKyAgRlhfV0NIQVIgVW5pY29kZUZyb21DaGFyQ29kZSh1aW50OF90IGNoYXJjb2RlKSBjb25zdCB7CisgICAgcmV0dXJuIG1fVW5pY29kZXNbY2hhcmNvZGVdOworICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQlMb2FkR2x5cGhNYXAoKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9XQ0hBUgkJX1VuaWNvZGVGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9FbmNvZGluZy5Vbmljb2RlRnJvbUNoYXJDb2RlKChGWF9CWVRFKWNoYXJjb2RlKTsKLSAgICB9Ci0gICAgdmlydHVhbCBGWF9EV09SRAkJX0NoYXJDb2RlRnJvbVVuaWNvZGUoRlhfV0NIQVIgVW5pY29kZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0VuY29kaW5nLkNoYXJDb2RlRnJvbVVuaWNvZGUoVW5pY29kZSk7Ci0gICAgfQorICBpbnQgQ2hhckNvZGVGcm9tVW5pY29kZShGWF9XQ0hBUiB1bmljb2RlKSBjb25zdDsKIAorICB2b2lkIFNldFVuaWNvZGUodWludDhfdCBjaGFyY29kZSwgRlhfV0NIQVIgdW5pY29kZSkgeworICAgIG1fVW5pY29kZXNbY2hhcmNvZGVdID0gdW5pY29kZTsKKyAgfQogCisgIENQREZfT2JqZWN0KiBSZWFsaXplKCk7CiAKLSAgICBDUERGX0ZvbnRFbmNvZGluZwkJbV9FbmNvZGluZzsKLQotICAgIEZYX1dPUkQJCQkJCW1fR2x5cGhJbmRleFsyNTZdOwotICAgIEZYX1dPUkQJCQkJCW1fRXh0R0lEWzI1Nl07Ci0KLQotCi0KLSAgICBDRlhfQnl0ZVN0cmluZyoJCQltX3BDaGFyTmFtZXM7Ci0KLSAgICBpbnQJCQkJCQltX0Jhc2VFbmNvZGluZzsKLQotCi0KLQotICAgIEZYX1dPUkQJCQkJCW1fQ2hhcldpZHRoWzI1Nl07Ci0KLSAgICBGWF9TTUFMTF9SRUNUCQkJbV9DaGFyQkJveFsyNTZdOwotCi0gICAgRlhfQk9PTAkJCQkJbV9iVXNlRm9udFdpZHRoOwotCi0gICAgdm9pZAkJCQkJTG9hZENoYXJNZXRyaWNzKGludCBjaGFyY29kZSk7Ci0KLX07Ci1jbGFzcyBDUERGX1R5cGUxRm9udCA6IHB1YmxpYyBDUERGX1NpbXBsZUZvbnQKLXsKLXB1YmxpYzoKLQotICAgIENQREZfVHlwZTFGb250KCk7Ci0KLSAgICBpbnQJCQkJCQlHZXRCYXNlMTRGb250KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0Jhc2UxNEZvbnQ7Ci0gICAgfQotICAgIHZpcnR1YWwgaW50CQkJCUdseXBoRnJvbUNoYXJDb2RlRXh0KEZYX0RXT1JEIGNoYXJjb2RlKTsKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlfTG9hZCgpOwotCi0gICAgaW50CQkJCQkJbV9CYXNlMTRGb250OwotICAgIHZpcnR1YWwgdm9pZAkJCUxvYWRHbHlwaE1hcCgpOwotfTsKLWNsYXNzIENQREZfVHJ1ZVR5cGVGb250IDogcHVibGljIENQREZfU2ltcGxlRm9udAotewotcHVibGljOgotCi0gICAgQ1BERl9UcnVlVHlwZUZvbnQoKTsKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlfTG9hZCgpOwotICAgIHZpcnR1YWwgdm9pZAkJCUxvYWRHbHlwaE1hcCgpOwotfTsKLWNsYXNzIENQREZfVHlwZTNDaGFyIAotewotcHVibGljOgotCi0gICAgQ1BERl9UeXBlM0NoYXIoKTsKLQotICAgIH5DUERGX1R5cGUzQ2hhcigpOwotCi0gICAgRlhfQk9PTCBMb2FkQml0bWFwKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQpOwotCi0gICAgRlhfQk9PTAkJCQkJbV9iQ29sb3JlZDsKLQotICAgIEZYX0JPT0wJCQkJCW1fYlBhZ2VSZXF1aXJlZDsKLQotCi0KLSAgICBDUERGX0Zvcm0qCQkJCW1fcEZvcm07Ci0KLSAgICBDRlhfQWZmaW5lTWF0cml4CQltX0ltYWdlTWF0cml4OwotCi0gICAgQ0ZYX0RJQml0bWFwKgkJCW1fcEJpdG1hcDsKLQotCi0gICAgaW50CQkJCQkJbV9XaWR0aDsKLQotICAgIEZYX1JFQ1QJCQkJCW1fQkJveDsKLX07Ci1jbGFzcyBDUERGX1R5cGUzRm9udCA6IHB1YmxpYyBDUERGX1NpbXBsZUZvbnQKLXsKLXB1YmxpYzoKLSAgICBDUERGX1R5cGUzRm9udCgpOwotICAgIH5DUERGX1R5cGUzRm9udCgpIG92ZXJyaWRlOwotICAgIHZvaWQJCQkJCVNldFBhZ2VSZXNvdXJjZXMoQ1BERl9EaWN0aW9uYXJ5KiBwUmVzb3VyY2VzKQotICAgIHsKLSAgICAgICAgbV9wUGFnZVJlc291cmNlcyA9IHBSZXNvdXJjZXM7Ci0gICAgfQotICAgIENQREZfVHlwZTNDaGFyKgkJCUxvYWRDaGFyKEZYX0RXT1JEIGNoYXJjb2RlLCBpbnQgbGV2ZWwgPSAwKTsKLSAgICB2aXJ0dWFsIGludAkJCQlHZXRDaGFyV2lkdGhGKEZYX0RXT1JEIGNoYXJjb2RlLCBpbnQgbGV2ZWwgPSAwKTsKLSAgICB2aXJ0dWFsIGludAkJCQlHZXRDaGFyVHlwZVdpZHRoKEZYX0RXT1JEIGNoYXJjb2RlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdldENoYXJXaWR0aEYoY2hhcmNvZGUpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQJCQlHZXRDaGFyQkJveChGWF9EV09SRCBjaGFyY29kZSwgRlhfUkVDVCYgcmVjdCwgaW50IGxldmVsID0gMCk7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCYJCUdldEZvbnRNYXRyaXgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fRm9udE1hdHJpeDsKLSAgICB9Ci0gICAgdm9pZAkJCQkJQ2hlY2tUeXBlM0ZvbnRNZXRyaWNzKCk7Ci1wcml2YXRlOgotICAgIHZpcnR1YWwgRlhfQk9PTAkJCV9Mb2FkKCk7Ci0gICAgdmlydHVhbCB2b2lkCQkJTG9hZEdseXBoTWFwKCkge30KLSAgICBpbnQJCQkJCQltX0NoYXJXaWR0aExbMjU2XTsKLSAgICBDUERGX0RpY3Rpb25hcnkqCQltX3BDaGFyUHJvY3M7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KgkJbV9wUGFnZVJlc291cmNlczsKLSAgICBDUERGX0RpY3Rpb25hcnkqCQltX3BGb250UmVzb3VyY2VzOwotICAgIENGWF9NYXBQdHJUb1B0cgkJCW1fQ2FjaGVNYXA7Ci0gICAgQ0ZYX01hcFB0clRvUHRyCQkJbV9EZWxldGVkTWFwOwotcHJvdGVjdGVkOgotICAgIENGWF9BZmZpbmVNYXRyaXgJCW1fRm9udE1hdHJpeDsKLX07Ci0jZGVmaW5lIENJRFNFVF9VTktOT1dOCQkwCi0jZGVmaW5lIENJRFNFVF9HQjEJCQkxCi0jZGVmaW5lIENJRFNFVF9DTlMxCQkJMgotI2RlZmluZSBDSURTRVRfSkFQQU4xCQkzCi0jZGVmaW5lIENJRFNFVF9LT1JFQTEJCTQKLSNkZWZpbmUgQ0lEU0VUX1VOSUNPREUJCTUKLSNkZWZpbmUgTlVNQkVSX09GX0NJRFNFVFMgICA2Ci0KLWNsYXNzIENQREZfQ0lERm9udCA6IHB1YmxpYyBDUERGX0ZvbnQKLXsKLXB1YmxpYzoKLQotICAgIENQREZfQ0lERm9udCgpOwotCi0gICAgdmlydHVhbCB+Q1BERl9DSURGb250KCk7Ci0KLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBMb2FkR0IyMzEyKCk7Ci0gICAgdmlydHVhbCBpbnQgICAgICAgICAgICAgR2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUsIEZYX0JPT0wgKnBWZXJ0R2x5cGggPSBOVUxMKTsKLSAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBHZXRDaGFyV2lkdGhGKEZYX0RXT1JEIGNoYXJjb2RlLCBpbnQgbGV2ZWwgPSAwKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBHZXRDaGFyQkJveChGWF9EV09SRCBjaGFyY29kZSwgRlhfUkVDVCYgcmVjdCwgaW50IGxldmVsID0gMCk7Ci0gICAgRlhfV09SRCAgICAgICAgICAgICAgICAgQ0lERnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdDsKLQotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIElzVHJ1ZVR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICFtX2JUeXBlMTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIEZYX0RXT1JEICAgICAgICBHZXROZXh0Q2hhcihGWF9MUENTVFIgcFN0cmluZywgaW50IG5TdHJMZW4sIGludCYgb2Zmc2V0KSBjb25zdCBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBDb3VudENoYXIoRlhfTFBDU1RSIHBTdHJpbmcsIGludCBzaXplKSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCAgICAgICAgICAgICBBcHBlbmRDaGFyKEZYX0xQU1RSIHN0ciwgRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0OwotICAgIHZpcnR1YWwgaW50ICAgICAgICAgICAgIEdldENoYXJTaXplKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdDsKLQotICAgIGludCAgICAgICAgICAgICAgICAgICAgIEdldENoYXJzZXQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fQ2hhcnNldDsKLSAgICB9Ci0KLSAgICBGWF9MUENCWVRFICAgICAgICAgICAgICBHZXRDSURUcmFuc2Zvcm0oRlhfV09SRCBDSUQpIGNvbnN0OwotICAgIHZpcnR1YWwgRlhfQk9PTCAgICAgICAgIElzVmVydFdyaXRpbmcoKSBjb25zdDsKLSAgICBzaG9ydCAgICAgICAgICAgICAgICAgICBHZXRWZXJ0V2lkdGgoRlhfV09SRCBDSUQpIGNvbnN0OwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIEdldFZlcnRPcmlnaW4oRlhfV09SRCBDSUQsIHNob3J0JiB2eCwgc2hvcnQmIHZ5KSBjb25zdDsKLSAgICB2aXJ0dWFsIEZYX0JPT0wgICAgICAgICBJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBGWF9CT09MICAgICAgICAgSXNGb250U3R5bGVGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gICAgZnJpZW5kIGNsYXNzICAgICAgICAgICAgQ1BERl9Gb250OwotICAgIHZpcnR1YWwgRlhfQk9PTCAgICAgICAgIF9Mb2FkKCk7Ci0gICAgdmlydHVhbCBGWF9XQ0hBUiAgICAgICAgX1VuaWNvZGVGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0OwotICAgIHZpcnR1YWwgRlhfRFdPUkQgICAgICAgIF9DaGFyQ29kZUZyb21Vbmljb2RlKEZYX1dDSEFSIFVuaWNvZGUpIGNvbnN0OwotICAgIGludCAgICAgICAgICAgICAgICAgICAgIEdldEdseXBoSW5kZXgoRlhfRFdPUkQgdW5pY29kZWIsIEZYX0JPT0wgKnBWZXJ0R2x5cGgpOwotCi0gICAgQ1BERl9DTWFwKiAgICAgICAgICAgICAgbV9wQ01hcDsKLSAgICBDUERGX0NNYXAqICAgICAgICAgICAgICBtX3BBbGxvY2F0ZWRDTWFwOwotICAgIENQREZfQ0lEMlVuaWNvZGVNYXAqICAgIG1fcENJRDJVbmljb2RlTWFwOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1fQ2hhcnNldDsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBtX2JUeXBlMTsKLSAgICBDUERGX1N0cmVhbUFjYyogICAgICAgICBtX3BDSURUb0dJRE1hcDsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBtX2JDSURJc0dJRDsKLSAgICBGWF9XT1JEICAgICAgICAgICAgICAgICBtX0RlZmF1bHRXaWR0aDsKLSAgICBGWF9XT1JEKiAgICAgICAgICAgICAgICBtX3BBbnNpV2lkdGhzOwotICAgIEZYX1NNQUxMX1JFQ1QgICAgICAgICAgIG1fQ2hhckJCb3hbMjU2XTsKLSAgICBDRlhfRFdvcmRBcnJheSAgICAgICAgICBtX1dpZHRoTGlzdDsKLSAgICBzaG9ydCAgICAgICAgICAgICAgICAgICBtX0RlZmF1bHRWWTsKLSAgICBzaG9ydCAgICAgICAgICAgICAgICAgICBtX0RlZmF1bHRXMTsKLSAgICBDRlhfRFdvcmRBcnJheSAgICAgICAgICBtX1ZlcnRNZXRyaWNzOwotCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgTG9hZE1ldHJpY3NBcnJheShDUERGX0FycmF5KiBwQXJyYXksIENGWF9EV29yZEFycmF5JiByZXN1bHQsIGludCBuRWxlbWVudHMpOwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIExvYWRTdWJzdEZvbnQoKTsKLQotICAgIEZYX0JPT0wJCQkJCW1fYkFkb2JlQ291cmllclN0ZDsKLSAgICBDRlhfQ1RUR1NVQlRhYmxlKiAgICAgICBtX3BUVEdTVUJUYWJsZTsKKyBwdWJsaWM6CisgIEZYX1dDSEFSIG1fVW5pY29kZXNbMjU2XTsKIH07CiAKLSNkZWZpbmUgUERGQ1NfREVWSUNFR1JBWSAgICAgICAgMQotI2RlZmluZSBQREZDU19ERVZJQ0VSR0IgICAgICAgICAyCi0jZGVmaW5lIFBERkNTX0RFVklDRUNNWUsgICAgICAgIDMKLSNkZWZpbmUgUERGQ1NfQ0FMR1JBWSAgICAgICAgICAgNAotI2RlZmluZSBQREZDU19DQUxSR0IgICAgICAgICAgICA1Ci0jZGVmaW5lIFBERkNTX0xBQiAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgUERGQ1NfSUNDQkFTRUQgICAgICAgICAgNwotI2RlZmluZSBQREZDU19TRVBBUkFUSU9OICAgICAgICA4Ci0jZGVmaW5lIFBERkNTX0RFVklDRU4gICAgICAgICAgIDkKLSNkZWZpbmUgUERGQ1NfSU5ERVhFRCAgICAgICAgICAgMTAKLSNkZWZpbmUgUERGQ1NfUEFUVEVSTiAgICAgICAgICAgMTEKK2NsYXNzIENQREZfU2ltcGxlRm9udCA6IHB1YmxpYyBDUERGX0ZvbnQgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1BERl9TaW1wbGVGb250KGludCBmb250dHlwZSk7CisgIH5DUERGX1NpbXBsZUZvbnQoKSBvdmVycmlkZTsKIAotY2xhc3MgQ1BERl9Db2xvclNwYWNlCi17Ci1wdWJsaWM6CisgIENQREZfRm9udEVuY29kaW5nKiBHZXRFbmNvZGluZygpIHsgcmV0dXJuICZtX0VuY29kaW5nOyB9CisgIGludCBHZXRDaGFyV2lkdGhGKEZYX0RXT1JEIGNoYXJjb2RlLCBpbnQgbGV2ZWwgPSAwKSBvdmVycmlkZTsKKyAgdm9pZCBHZXRDaGFyQkJveChGWF9EV09SRCBjaGFyY29kZSwgRlhfUkVDVCYgcmVjdCwgaW50IGxldmVsID0gMCkgb3ZlcnJpZGU7CisgIGludCBHbHlwaEZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSwgRlhfQk9PTCogcFZlcnRHbHlwaCA9IE5VTEwpIG92ZXJyaWRlOworICBGWF9CT09MIElzVW5pY29kZUNvbXBhdGlibGUoKSBjb25zdCBvdmVycmlkZTsKIAotICAgIHN0YXRpYyBDUERGX0NvbG9yU3BhY2UqIEdldFN0b2NrQ1MoaW50IEZhbWlseSk7CisgcHJvdGVjdGVkOgorICBGWF9CT09MIExvYWRDb21tb24oKTsKIAotICAgIHN0YXRpYyBDUERGX0NvbG9yU3BhY2UqCUxvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9PYmplY3QqIHBDU09iaik7CisgIHZvaWQgTG9hZFN1YnN0Rm9udCgpOwogCi0gICAgdm9pZAkJCQkJUmVsZWFzZUNTKCk7CisgIHZvaWQgTG9hZEZhY2VNZXRyaWNzKCk7CiAKLSAgICBpbnQJCQkJCQlHZXRCdWZTaXplKCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBMb2FkR2x5cGhNYXAoKSA9IDA7CiAKLSAgICBGWF9GTE9BVCoJCQlDcmVhdGVCdWYoKTsKKyAgRlhfV0NIQVIgX1VuaWNvZGVGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gbV9FbmNvZGluZy5Vbmljb2RlRnJvbUNoYXJDb2RlKCh1aW50OF90KWNoYXJjb2RlKTsKKyAgfQogCi0gICAgdm9pZAkJCQkJR2V0RGVmYXVsdENvbG9yKEZYX0ZMT0FUKiBidWYpIGNvbnN0OworICBGWF9EV09SRCBfQ2hhckNvZGVGcm9tVW5pY29kZShGWF9XQ0hBUiBVbmljb2RlKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIG1fRW5jb2RpbmcuQ2hhckNvZGVGcm9tVW5pY29kZShVbmljb2RlKTsKKyAgfQogCi0gICAgaW50CQkJCQkJQ291bnRDb21wb25lbnRzKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX25Db21wb25lbnRzOwotICAgIH0KKyAgdm9pZCBMb2FkQ2hhck1ldHJpY3MoaW50IGNoYXJjb2RlKTsKIAotICAgIGludAkJCQkJCUdldEZhbWlseSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9GYW1pbHk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkCQkJR2V0RGVmYXVsdFZhbHVlKGludCBpQ29tcG9uZW50LCBGWF9GTE9BVCYgdmFsdWUsIEZYX0ZMT0FUJiBtaW4sIEZYX0ZMT0FUJiBtYXgpIGNvbnN0Ci0gICAgewotICAgICAgICB2YWx1ZSA9IDA7Ci0gICAgICAgIG1pbiA9IDA7Ci0gICAgICAgIG1heCA9IDEuMGY7Ci0gICAgfQotCi0gICAgRlhfQk9PTAkJCQkJc1JHQigpIGNvbnN0OwotCi0KLQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCBGWF9CT09MCQkJU2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotCi0KLQotICAgIEZYX0JPT0wJCQkJCUdldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBjLCBGWF9GTE9BVCYgbSwgRlhfRkxPQVQmIHksIEZYX0ZMT0FUJiBrKSBjb25zdDsKLQotICAgIEZYX0JPT0wJCQkJCVNldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIGMsIEZYX0ZMT0FUIG0sIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIGspIGNvbnN0OwotCi0KLSAgICB2aXJ0dWFsIHZvaWQJCQlUcmFuc2xhdGVJbWFnZUxpbmUoRlhfTFBCWVRFIGRlc3RfYnVmLCBGWF9MUENCWVRFIHNyY19idWYsIGludCBwaXhlbHMsCi0gICAgICAgICAgICBpbnQgaW1hZ2Vfd2lkdGgsIGludCBpbWFnZV9oZWlnaHQsIEZYX0JPT0wgYlRyYW5zTWFzayA9IEZBTFNFKSBjb25zdDsKLQotICAgIENQREZfQXJyYXkqJgkJCUdldEFycmF5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BBcnJheTsKLSAgICB9Ci0KLSAgICBpbnQJCQkJCQlHZXRNYXhJbmRleCgpIGNvbnN0OwotCi0gICAgdmlydHVhbCBDUERGX0NvbG9yU3BhY2UqCUdldEJhc2VDUygpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQJCQlFbmFibGVTdGRDb252ZXJzaW9uKEZYX0JPT0wgYkVuYWJsZWQpOwotICAgIENQREZfRG9jdW1lbnQqCQkJbV9wRG9jdW1lbnQ7Ci1wcm90ZWN0ZWQ6Ci0KLSAgICBDUERGX0NvbG9yU3BhY2UoKTsKLQotICAgIHZpcnR1YWwgfkNQREZfQ29sb3JTcGFjZSgpIHt9Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQl2X0dldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBjLCBGWF9GTE9BVCYgbSwgRlhfRkxPQVQmIHksIEZYX0ZMT0FUJiBrKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQl2X1NldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIGMsIEZYX0ZMT0FUIG0sIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIGspIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgaW50CQkJCQkJbV9GYW1pbHk7Ci0KLSAgICBpbnQJCQkJCQltX25Db21wb25lbnRzOwotCi0gICAgQ1BERl9BcnJheSoJCQkJbV9wQXJyYXk7Ci0KLSAgICBGWF9EV09SRAkJCQltX2R3U3RkQ29udmVyc2lvbjsKLX07Ci1jbGFzcyBDUERGX0NvbG9yIAotewotcHVibGljOgotCi0gICAgQ1BERl9Db2xvcigpIDptX3BDUyhOVUxMKSwgbV9wQnVmZmVyKE5VTEwpCi0gICAgewotICAgIH0KLQotICAgIENQREZfQ29sb3IoaW50IGZhbWlseSk7Ci0KLSAgICB+Q1BERl9Db2xvcigpOwotCi0gICAgRlhfQk9PTAkJCQkJSXNOdWxsKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BCdWZmZXIgPT0gTlVMTDsKLSAgICB9Ci0KLSAgICBGWF9CT09MCQkJCQlJc0VxdWFsKGNvbnN0IENQREZfQ29sb3ImIG90aGVyKSBjb25zdDsKLQotICAgIEZYX0JPT0wJCQkJCUlzUGF0dGVybigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wQ1MgJiYgbV9wQ1MtPkdldEZhbWlseSgpID09IFBERkNTX1BBVFRFUk47Ci0gICAgfQotCi0gICAgdm9pZAkJCQkJQ29weShjb25zdCBDUERGX0NvbG9yKiBwU3JjKTsKLQotICAgIHZvaWQJCQkJCVNldENvbG9yU3BhY2UoQ1BERl9Db2xvclNwYWNlKiBwQ1MpOwotCi0gICAgdm9pZAkJCQkJU2V0VmFsdWUoRlhfRkxPQVQqIGNvbXApOwotCi0gICAgdm9pZAkJCQkJU2V0VmFsdWUoQ1BERl9QYXR0ZXJuKiBwUGF0dGVybiwgRlhfRkxPQVQqIGNvbXAsIGludCBuY29tcHMpOwotCi0gICAgRlhfQk9PTAkJCQkJR2V0UkdCKGludCYgUiwgaW50JiBHLCBpbnQmIEIpIGNvbnN0OwotCi0gICAgQ1BERl9QYXR0ZXJuKgkJCUdldFBhdHRlcm4oKSBjb25zdDsKLQotICAgIENQREZfQ29sb3JTcGFjZSoJCUdldFBhdHRlcm5DUygpIGNvbnN0OwotCi0gICAgRlhfRkxPQVQqCQkJR2V0UGF0dGVybkNvbG9yKCkgY29uc3Q7Ci0KLSAgICBDUERGX0NvbG9yU3BhY2UqCQltX3BDUzsKLQotcHJvdGVjdGVkOgotICAgIHZvaWQJUmVsZWFzZUJ1ZmZlcigpOwotICAgIHZvaWQJUmVsZWFzZUNvbG9yU3BhY2UoKTsKLSAgICBGWF9GTE9BVCoJCQkgICAgbV9wQnVmZmVyOwotfTsKLSNkZWZpbmUgUEFUVEVSTl9USUxJTkcJCTEKLSNkZWZpbmUgUEFUVEVSTl9TSEFESU5HCQkyCi1jbGFzcyBDUERGX1BhdHRlcm4gCi17Ci1wdWJsaWM6Ci0gICAKLSAgICB2aXJ0dWFsIH5DUERGX1BhdHRlcm4oKTsKLSAgICB2b2lkICAgIFNldEZvcmNlQ2xlYXIoRlhfQk9PTCBiRm9yY2VDbGVhcikgeyBtX2JGb3JjZUNsZWFyID0gYkZvcmNlQ2xlYXI7IH0KLQotICAgIENQREZfT2JqZWN0KiAgICAgICAgICAgICAgICBtX3BQYXR0ZXJuT2JqOwotCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1fUGF0dGVyblR5cGU7Ci0KLSAgICBDRlhfQWZmaW5lTWF0cml4ICAgICAgICAgICAgbV9QYXR0ZXJuMkZvcm07Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCAgICAgICAgICAgIG1fUGFyZW50TWF0cml4OwotCi0gICAgQ1BERl9Eb2N1bWVudCogICAgICAgICAgICAgIG1fcERvY3VtZW50OwotCi1wcm90ZWN0ZWQ6Ci0gICAgQ1BERl9QYXR0ZXJuKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBQYXJlbnRNYXRyaXgpOwotICAgIEZYX0JPT0wgICAgIG1fYkZvcmNlQ2xlYXI7CisgIENQREZfRm9udEVuY29kaW5nIG1fRW5jb2Rpbmc7CisgIEZYX1dPUkQgbV9HbHlwaEluZGV4WzI1Nl07CisgIEZYX1dPUkQgbV9FeHRHSURbMjU2XTsKKyAgQ0ZYX0J5dGVTdHJpbmcqIG1fcENoYXJOYW1lczsKKyAgaW50IG1fQmFzZUVuY29kaW5nOworICBGWF9XT1JEIG1fQ2hhcldpZHRoWzI1Nl07CisgIEZYX1NNQUxMX1JFQ1QgbV9DaGFyQkJveFsyNTZdOworICBGWF9CT09MIG1fYlVzZUZvbnRXaWR0aDsKIH07CiAKLWNsYXNzIENQREZfVGlsaW5nUGF0dGVybiA6IHB1YmxpYyBDUERGX1BhdHRlcm4KLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfVHlwZTFGb250IDogcHVibGljIENQREZfU2ltcGxlRm9udCB7CisgcHVibGljOgorICBDUERGX1R5cGUxRm9udCgpOwogCi0gICAgQ1BERl9UaWxpbmdQYXR0ZXJuKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfT2JqZWN0KiBwUGF0dGVybk9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcGFyZW50TWF0cml4KTsKKyAgaW50IEdldEJhc2UxNEZvbnQoKSB7IHJldHVybiBtX0Jhc2UxNEZvbnQ7IH0KIAotICAgIHZpcnR1YWwgfkNQREZfVGlsaW5nUGF0dGVybigpOworIHByb3RlY3RlZDoKKyAgLy8gQ1BERl9TaW1wbGVGb250OgorICBpbnQgR2x5cGhGcm9tQ2hhckNvZGVFeHQoRlhfRFdPUkQgY2hhcmNvZGUpIG92ZXJyaWRlOworICBGWF9CT09MIF9Mb2FkKCkgb3ZlcnJpZGU7CisgIHZvaWQgTG9hZEdseXBoTWFwKCkgb3ZlcnJpZGU7CiAKLSAgICBGWF9CT09MCQkJCUxvYWQoKTsKLQotCi0KLSAgICBGWF9CT09MCQkJCW1fYkNvbG9yZWQ7Ci0KLSAgICBDRlhfRmxvYXRSZWN0CQltX0JCb3g7Ci0KLSAgICBGWF9GTE9BVAkJCW1fWFN0ZXA7Ci0KLSAgICBGWF9GTE9BVAkJCW1fWVN0ZXA7Ci0KLQotCi0gICAgQ1BERl9Gb3JtKgkJCW1fcEZvcm07CisgIGludCBtX0Jhc2UxNEZvbnQ7CiB9OwotY2xhc3MgQ1BERl9TaGFkaW5nUGF0dGVybiA6IHB1YmxpYyBDUERGX1BhdHRlcm4KLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfVHJ1ZVR5cGVGb250IDogcHVibGljIENQREZfU2ltcGxlRm9udCB7CisgcHVibGljOgorICBDUERGX1RydWVUeXBlRm9udCgpOwogCi0gICAgQ1BERl9TaGFkaW5nUGF0dGVybihDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX09iamVjdCogcFBhdHRlcm5PYmosIEZYX0JPT0wgYlNoYWRpbmcsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBhcmVudE1hdHJpeCk7Ci0KLSAgICB2aXJ0dWFsIH5DUERGX1NoYWRpbmdQYXR0ZXJuKCk7Ci0KLSAgICBDUERGX09iamVjdCoJCW1fcFNoYWRpbmdPYmo7Ci0KLSAgICBGWF9CT09MCQkJCW1fYlNoYWRpbmdPYmo7Ci0KLSAgICBGWF9CT09MCQkJCUxvYWQoKTsKLQotICAgIEZYX0JPT0wJCQkJUmVsb2FkKCk7Ci0KLSAgICBpbnQJCQkJCW1fU2hhZGluZ1R5cGU7Ci0KLSAgICBDUERGX0NvbG9yU3BhY2UqCW1fcENTOyAvLyBTdGlsbCBrZWVwIG1fcENTIGFzIHNvbWUgQ1BERl9Db2xvclNwYWNlIChuYW1lIG9iamVjdCkgYXJlIG5vdCBtYW5hZ2VkIGFzIGNvdW50ZWQgb2JqZWN0cy4gUmVmZXIgdG8gQ1BERl9Eb2NQYWdlRGF0YTo6R2V0Q29sb3JTcGFjZS4KLQotICAgIENQREZfQ291bnRlZENvbG9yU3BhY2UqCW1fcENvdW50ZWRDUzsKLQotICAgIENQREZfRnVuY3Rpb24qCQltX3BGdW5jdGlvbnNbNF07Ci0KLSAgICBpbnQJCQkJCW1fbkZ1bmNzOwotcHJvdGVjdGVkOgotICAgIHZvaWQJQ2xlYXIoKTsKKyBwcm90ZWN0ZWQ6CisgIC8vIENQREZfU2ltcGxlRm9udDoKKyAgRlhfQk9PTCBfTG9hZCgpIG92ZXJyaWRlOworICB2b2lkIExvYWRHbHlwaE1hcCgpIG92ZXJyaWRlOwogfTsKKworY2xhc3MgQ1BERl9UeXBlM0NoYXIgeworIHB1YmxpYzoKKyAgLy8gVGFrZXMgb3duZXJzaGlwIG9mIHxwRm9ybXwuCisgIGV4cGxpY2l0IENQREZfVHlwZTNDaGFyKENQREZfRm9ybSogcEZvcm0pOworICB+Q1BERl9UeXBlM0NoYXIoKTsKKworICBGWF9CT09MIExvYWRCaXRtYXAoQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCk7CisKKyAgQ1BERl9Gb3JtKiBtX3BGb3JtOworICBDRlhfRElCaXRtYXAqIG1fcEJpdG1hcDsKKyAgRlhfQk9PTCBtX2JDb2xvcmVkOworICBpbnQgbV9XaWR0aDsKKyAgQ0ZYX01hdHJpeCBtX0ltYWdlTWF0cml4OworICBGWF9SRUNUIG1fQkJveDsKK307CisKK2NsYXNzIENQREZfVHlwZTNGb250IDogcHVibGljIENQREZfU2ltcGxlRm9udCB7CisgcHVibGljOgorICBDUERGX1R5cGUzRm9udCgpOworICB+Q1BERl9UeXBlM0ZvbnQoKSBvdmVycmlkZTsKKworICB2b2lkIFNldFBhZ2VSZXNvdXJjZXMoQ1BERl9EaWN0aW9uYXJ5KiBwUmVzb3VyY2VzKSB7CisgICAgbV9wUGFnZVJlc291cmNlcyA9IHBSZXNvdXJjZXM7CisgIH0KKyAgQ1BERl9UeXBlM0NoYXIqIExvYWRDaGFyKEZYX0RXT1JEIGNoYXJjb2RlLCBpbnQgbGV2ZWwgPSAwKTsKKyAgaW50IEdldENoYXJXaWR0aEYoRlhfRFdPUkQgY2hhcmNvZGUsIGludCBsZXZlbCA9IDApIG92ZXJyaWRlOworICBpbnQgR2V0Q2hhclR5cGVXaWR0aChGWF9EV09SRCBjaGFyY29kZSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBHZXRDaGFyV2lkdGhGKGNoYXJjb2RlKTsKKyAgfQorICB2b2lkIEdldENoYXJCQm94KEZYX0RXT1JEIGNoYXJjb2RlLCBGWF9SRUNUJiByZWN0LCBpbnQgbGV2ZWwgPSAwKSBvdmVycmlkZTsKKyAgQ0ZYX01hdHJpeCYgR2V0Rm9udE1hdHJpeCgpIHsgcmV0dXJuIG1fRm9udE1hdHJpeDsgfQorICB2b2lkIENoZWNrVHlwZTNGb250TWV0cmljcygpOworCisgcHJvdGVjdGVkOgorICBDRlhfTWF0cml4IG1fRm9udE1hdHJpeDsKKworIHByaXZhdGU6CisgIEZYX0JPT0wgX0xvYWQoKSBvdmVycmlkZTsKKyAgdm9pZCBMb2FkR2x5cGhNYXAoKSBvdmVycmlkZSB7fQorCisgIGludCBtX0NoYXJXaWR0aExbMjU2XTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BDaGFyUHJvY3M7CisgIENQREZfRGljdGlvbmFyeSogbV9wUGFnZVJlc291cmNlczsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BGb250UmVzb3VyY2VzOworICBzdGQ6Om1hcDxGWF9EV09SRCwgQ1BERl9UeXBlM0NoYXIqPiBtX0NhY2hlTWFwOworfTsKKworZW51bSBDSURTZXQgeworICBDSURTRVRfVU5LTk9XTiwKKyAgQ0lEU0VUX0dCMSwKKyAgQ0lEU0VUX0NOUzEsCisgIENJRFNFVF9KQVBBTjEsCisgIENJRFNFVF9LT1JFQTEsCisgIENJRFNFVF9VTklDT0RFLAorICBDSURTRVRfTlVNX1NFVFMKK307CisKK2NsYXNzIENQREZfQ0lERm9udCA6IHB1YmxpYyBDUERGX0ZvbnQgeworIHB1YmxpYzoKKyAgQ1BERl9DSURGb250KCk7CisKKyAgfkNQREZfQ0lERm9udCgpIG92ZXJyaWRlOworCisgIHN0YXRpYyBGWF9GTE9BVCBDSURUcmFuc2Zvcm1Ub0Zsb2F0KHVpbnQ4X3QgY2gpOworCisgIC8vIENQREZfRm9udDoKKyAgaW50IEdseXBoRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlLCBGWF9CT09MKiBwVmVydEdseXBoID0gTlVMTCkgb3ZlcnJpZGU7CisgIGludCBHZXRDaGFyV2lkdGhGKEZYX0RXT1JEIGNoYXJjb2RlLCBpbnQgbGV2ZWwgPSAwKSBvdmVycmlkZTsKKyAgdm9pZCBHZXRDaGFyQkJveChGWF9EV09SRCBjaGFyY29kZSwgRlhfUkVDVCYgcmVjdCwgaW50IGxldmVsID0gMCkgb3ZlcnJpZGU7CisgIEZYX0RXT1JEIEdldE5leHRDaGFyKGNvbnN0IEZYX0NIQVIqIHBTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBuU3RyTGVuLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG9mZnNldCkgY29uc3Qgb3ZlcnJpZGU7CisgIGludCBDb3VudENoYXIoY29uc3QgRlhfQ0hBUiogcFN0cmluZywgaW50IHNpemUpIGNvbnN0IG92ZXJyaWRlOworICBpbnQgQXBwZW5kQ2hhcihGWF9DSEFSKiBzdHIsIEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdCBvdmVycmlkZTsKKyAgaW50IEdldENoYXJTaXplKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdCBvdmVycmlkZTsKKyAgRlhfQk9PTCBJc1ZlcnRXcml0aW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgIEZYX0JPT0wgSXNVbmljb2RlQ29tcGF0aWJsZSgpIGNvbnN0IG92ZXJyaWRlOworICBGWF9CT09MIF9Mb2FkKCkgb3ZlcnJpZGU7CisgIEZYX1dDSEFSIF9Vbmljb2RlRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdCBvdmVycmlkZTsKKyAgRlhfRFdPUkQgX0NoYXJDb2RlRnJvbVVuaWNvZGUoRlhfV0NIQVIgVW5pY29kZSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgRlhfQk9PTCBMb2FkR0IyMzEyKCk7CisgIEZYX1dPUkQgQ0lERnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdDsKKyAgRlhfQk9PTCBJc1RydWVUeXBlKCkgY29uc3QgeyByZXR1cm4gIW1fYlR5cGUxOyB9CisgIGNvbnN0IHVpbnQ4X3QqIEdldENJRFRyYW5zZm9ybShGWF9XT1JEIENJRCkgY29uc3Q7CisgIHNob3J0IEdldFZlcnRXaWR0aChGWF9XT1JEIENJRCkgY29uc3Q7CisgIHZvaWQgR2V0VmVydE9yaWdpbihGWF9XT1JEIENJRCwgc2hvcnQmIHZ4LCBzaG9ydCYgdnkpIGNvbnN0OworICB2aXJ0dWFsIEZYX0JPT0wgSXNGb250U3R5bGVGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0OworCisgcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgQ1BERl9Gb250OworCisgIGludCBHZXRHbHlwaEluZGV4KEZYX0RXT1JEIHVuaWNvZGViLCBGWF9CT09MKiBwVmVydEdseXBoKTsKKyAgdm9pZCBMb2FkTWV0cmljc0FycmF5KENQREZfQXJyYXkqIHBBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9EV29yZEFycmF5JiByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkVsZW1lbnRzKTsKKyAgdm9pZCBMb2FkU3Vic3RGb250KCk7CisKKyAgQ1BERl9DTWFwKiBtX3BDTWFwOworICBDUERGX0NNYXAqIG1fcEFsbG9jYXRlZENNYXA7CisgIENQREZfQ0lEMlVuaWNvZGVNYXAqIG1fcENJRDJVbmljb2RlTWFwOworICBDSURTZXQgbV9DaGFyc2V0OworICBGWF9CT09MIG1fYlR5cGUxOworICBDUERGX1N0cmVhbUFjYyogbV9wQ0lEVG9HSURNYXA7CisgIEZYX0JPT0wgbV9iQ0lESXNHSUQ7CisgIEZYX1dPUkQgbV9EZWZhdWx0V2lkdGg7CisgIEZYX1dPUkQqIG1fcEFuc2lXaWR0aHM7CisgIEZYX1NNQUxMX1JFQ1QgbV9DaGFyQkJveFsyNTZdOworICBDRlhfRFdvcmRBcnJheSBtX1dpZHRoTGlzdDsKKyAgc2hvcnQgbV9EZWZhdWx0Vlk7CisgIHNob3J0IG1fRGVmYXVsdFcxOworICBDRlhfRFdvcmRBcnJheSBtX1ZlcnRNZXRyaWNzOworICBGWF9CT09MIG1fYkFkb2JlQ291cmllclN0ZDsKKyAgQ0ZYX0NUVEdTVUJUYWJsZSogbV9wVFRHU1VCVGFibGU7Cit9OworCisjZGVmaW5lIFBERkNTX0RFVklDRUdSQVkgMQorI2RlZmluZSBQREZDU19ERVZJQ0VSR0IgMgorI2RlZmluZSBQREZDU19ERVZJQ0VDTVlLIDMKKyNkZWZpbmUgUERGQ1NfQ0FMR1JBWSA0CisjZGVmaW5lIFBERkNTX0NBTFJHQiA1CisjZGVmaW5lIFBERkNTX0xBQiA2CisjZGVmaW5lIFBERkNTX0lDQ0JBU0VEIDcKKyNkZWZpbmUgUERGQ1NfU0VQQVJBVElPTiA4CisjZGVmaW5lIFBERkNTX0RFVklDRU4gOQorI2RlZmluZSBQREZDU19JTkRFWEVEIDEwCisjZGVmaW5lIFBERkNTX1BBVFRFUk4gMTEKKworY2xhc3MgQ1BERl9Db2xvclNwYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBDUERGX0NvbG9yU3BhY2UqIEdldFN0b2NrQ1MoaW50IEZhbWlseSk7CisKKyAgc3RhdGljIENQREZfQ29sb3JTcGFjZSogTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX09iamVjdCogcENTT2JqKTsKKworICB2b2lkIFJlbGVhc2VDUygpOworCisgIGludCBHZXRCdWZTaXplKCkgY29uc3Q7CisKKyAgRlhfRkxPQVQqIENyZWF0ZUJ1ZigpOworCisgIHZvaWQgR2V0RGVmYXVsdENvbG9yKEZYX0ZMT0FUKiBidWYpIGNvbnN0OworCisgIGludCBDb3VudENvbXBvbmVudHMoKSBjb25zdCB7IHJldHVybiBtX25Db21wb25lbnRzOyB9CisKKyAgaW50IEdldEZhbWlseSgpIGNvbnN0IHsgcmV0dXJuIG1fRmFtaWx5OyB9CisKKyAgdmlydHVhbCB2b2lkIEdldERlZmF1bHRWYWx1ZShpbnQgaUNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIG1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbWF4KSBjb25zdCB7CisgICAgdmFsdWUgPSAwOworICAgIG1pbiA9IDA7CisgICAgbWF4ID0gMS4wZjsKKyAgfQorCisgIEZYX0JPT0wgc1JHQigpIGNvbnN0OworCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRSR0IoRlhfRkxPQVQqIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEIpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIEZYX0JPT0wgU2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBCKSBjb25zdCB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgRlhfQk9PTCBHZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGMsCisgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbSwKKyAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiB5LAorICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGspIGNvbnN0OworCisgIEZYX0JPT0wgU2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGMsCisgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBtLAorICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSwKKyAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGspIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCBUcmFuc2xhdGVJbWFnZUxpbmUodWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRyYW5zTWFzayA9IEZBTFNFKSBjb25zdDsKKworICBDUERGX0FycmF5KiYgR2V0QXJyYXkoKSB7IHJldHVybiBtX3BBcnJheTsgfQorCisgIGludCBHZXRNYXhJbmRleCgpIGNvbnN0OworCisgIHZpcnR1YWwgQ1BERl9Db2xvclNwYWNlKiBHZXRCYXNlQ1MoKSBjb25zdCB7IHJldHVybiBOVUxMOyB9CisKKyAgdmlydHVhbCB2b2lkIEVuYWJsZVN0ZENvbnZlcnNpb24oRlhfQk9PTCBiRW5hYmxlZCk7CisKKyAgQ1BERl9Eb2N1bWVudCogY29uc3QgbV9wRG9jdW1lbnQ7CisKKyBwcm90ZWN0ZWQ6CisgIENQREZfQ29sb3JTcGFjZShDUERGX0RvY3VtZW50KiBwRG9jLCBpbnQgZmFtaWx5LCBpbnQgbkNvbXBvbmVudHMpCisgICAgICA6IG1fcERvY3VtZW50KHBEb2MpLAorICAgICAgICBtX0ZhbWlseShmYW1pbHkpLAorICAgICAgICBtX25Db21wb25lbnRzKG5Db21wb25lbnRzKSwKKyAgICAgICAgbV9wQXJyYXkobnVsbHB0ciksCisgICAgICAgIG1fZHdTdGRDb252ZXJzaW9uKDApIHt9CisgIHZpcnR1YWwgfkNQREZfQ29sb3JTcGFjZSgpIHt9CisgIHZpcnR1YWwgRlhfQk9PTCB2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgdmlydHVhbCBGWF9CT09MIHZfR2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgaykgY29uc3QgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICB2aXJ0dWFsIEZYX0JPT0wgdl9TZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGspIGNvbnN0IHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpbnQgbV9GYW1pbHk7CisKKyAgaW50IG1fbkNvbXBvbmVudHM7CisKKyAgQ1BERl9BcnJheSogbV9wQXJyYXk7CisKKyAgRlhfRFdPUkQgbV9kd1N0ZENvbnZlcnNpb247Cit9OworY2xhc3MgQ1BERl9Db2xvciB7CisgcHVibGljOgorICBDUERGX0NvbG9yKCkgOiBtX3BDUyhOVUxMKSwgbV9wQnVmZmVyKE5VTEwpIHt9CisKKyAgQ1BERl9Db2xvcihpbnQgZmFtaWx5KTsKKworICB+Q1BERl9Db2xvcigpOworCisgIEZYX0JPT0wgSXNOdWxsKCkgY29uc3QgeyByZXR1cm4gIW1fcEJ1ZmZlcjsgfQorCisgIEZYX0JPT0wgSXNFcXVhbChjb25zdCBDUERGX0NvbG9yJiBvdGhlcikgY29uc3Q7CisKKyAgRlhfQk9PTCBJc1BhdHRlcm4oKSBjb25zdCB7CisgICAgcmV0dXJuIG1fcENTICYmIG1fcENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19QQVRURVJOOworICB9CisKKyAgdm9pZCBDb3B5KGNvbnN0IENQREZfQ29sb3IqIHBTcmMpOworCisgIHZvaWQgU2V0Q29sb3JTcGFjZShDUERGX0NvbG9yU3BhY2UqIHBDUyk7CisKKyAgdm9pZCBTZXRWYWx1ZShGWF9GTE9BVCogY29tcCk7CisKKyAgdm9pZCBTZXRWYWx1ZShDUERGX1BhdHRlcm4qIHBQYXR0ZXJuLCBGWF9GTE9BVCogY29tcCwgaW50IG5jb21wcyk7CisKKyAgRlhfQk9PTCBHZXRSR0IoaW50JiBSLCBpbnQmIEcsIGludCYgQikgY29uc3Q7CisKKyAgQ1BERl9QYXR0ZXJuKiBHZXRQYXR0ZXJuKCkgY29uc3Q7CisKKyAgQ1BERl9Db2xvclNwYWNlKiBHZXRQYXR0ZXJuQ1MoKSBjb25zdDsKKworICBGWF9GTE9BVCogR2V0UGF0dGVybkNvbG9yKCkgY29uc3Q7CisKKyAgQ1BERl9Db2xvclNwYWNlKiBtX3BDUzsKKworIHByb3RlY3RlZDoKKyAgdm9pZCBSZWxlYXNlQnVmZmVyKCk7CisgIHZvaWQgUmVsZWFzZUNvbG9yU3BhY2UoKTsKKyAgRlhfRkxPQVQqIG1fcEJ1ZmZlcjsKK307CisKK2NsYXNzIENQREZfUGF0dGVybiB7CisgcHVibGljOgorICBlbnVtIFBhdHRlcm5UeXBlIHsgVElMSU5HID0gMSwgU0hBRElORyB9OworCisgIHZpcnR1YWwgfkNQREZfUGF0dGVybigpOworCisgIHZvaWQgU2V0Rm9yY2VDbGVhcihGWF9CT09MIGJGb3JjZUNsZWFyKSB7IG1fYkZvcmNlQ2xlYXIgPSBiRm9yY2VDbGVhcjsgfQorCisgIGNvbnN0IFBhdHRlcm5UeXBlIG1fUGF0dGVyblR5cGU7CisgIENQREZfRG9jdW1lbnQqIGNvbnN0IG1fcERvY3VtZW50OworICBDUERGX09iamVjdCogY29uc3QgbV9wUGF0dGVybk9iajsKKyAgQ0ZYX01hdHJpeCBtX1BhdHRlcm4yRm9ybTsKKyAgQ0ZYX01hdHJpeCBtX1BhcmVudE1hdHJpeDsKKworIHByb3RlY3RlZDoKKyAgQ1BERl9QYXR0ZXJuKFBhdHRlcm5UeXBlIHR5cGUsCisgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBPYmosCisgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwUGFyZW50TWF0cml4KTsKKworICBGWF9CT09MIG1fYkZvcmNlQ2xlYXI7Cit9OworCitjbGFzcyBDUERGX1RpbGluZ1BhdHRlcm4gOiBwdWJsaWMgQ1BERl9QYXR0ZXJuIHsKKyBwdWJsaWM6CisgIENQREZfVGlsaW5nUGF0dGVybihDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcGFyZW50TWF0cml4KTsKKworICB+Q1BERl9UaWxpbmdQYXR0ZXJuKCkgb3ZlcnJpZGU7CisKKyAgRlhfQk9PTCBMb2FkKCk7CisKKyAgRlhfQk9PTCBtX2JDb2xvcmVkOworCisgIENGWF9GbG9hdFJlY3QgbV9CQm94OworCisgIEZYX0ZMT0FUIG1fWFN0ZXA7CisKKyAgRlhfRkxPQVQgbV9ZU3RlcDsKKworICBDUERGX0Zvcm0qIG1fcEZvcm07Cit9OworCit0eXBlZGVmIGVudW0geworICBrSW52YWxpZFNoYWRpbmcgPSAwLAorICBrRnVuY3Rpb25CYXNlZFNoYWRpbmcgPSAxLAorICBrQXhpYWxTaGFkaW5nID0gMiwKKyAga1JhZGlhbFNoYWRpbmcgPSAzLAorICBrRnJlZUZvcm1Hb3VyYXVkVHJpYW5nbGVNZXNoU2hhZGluZyA9IDQsCisgIGtMYXR0aWNlRm9ybUdvdXJhdWRUcmlhbmdsZU1lc2hTaGFkaW5nID0gNSwKKyAga0Nvb25zUGF0Y2hNZXNoU2hhZGluZyA9IDYsCisgIGtUZW5zb3JQcm9kdWN0UGF0Y2hNZXNoU2hhZGluZyA9IDcsCisgIGtNYXhTaGFkaW5nID0gOAorfSBTaGFkaW5nVHlwZTsKKworY2xhc3MgQ1BERl9TaGFkaW5nUGF0dGVybiA6IHB1YmxpYyBDUERGX1BhdHRlcm4geworIHB1YmxpYzoKKyAgQ1BERl9TaGFkaW5nUGF0dGVybihDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwUGF0dGVybk9iaiwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGFkaW5nLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBhcmVudE1hdHJpeCk7CisKKyAgfkNQREZfU2hhZGluZ1BhdHRlcm4oKSBvdmVycmlkZTsKKworICBib29sIElzTWVzaFNoYWRpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fU2hhZGluZ1R5cGUgPT0ga0ZyZWVGb3JtR291cmF1ZFRyaWFuZ2xlTWVzaFNoYWRpbmcgfHwKKyAgICAgICAgICAgbV9TaGFkaW5nVHlwZSA9PSBrTGF0dGljZUZvcm1Hb3VyYXVkVHJpYW5nbGVNZXNoU2hhZGluZyB8fAorICAgICAgICAgICBtX1NoYWRpbmdUeXBlID09IGtDb29uc1BhdGNoTWVzaFNoYWRpbmcgfHwKKyAgICAgICAgICAgbV9TaGFkaW5nVHlwZSA9PSBrVGVuc29yUHJvZHVjdFBhdGNoTWVzaFNoYWRpbmc7CisgIH0KKyAgRlhfQk9PTCBMb2FkKCk7CisKKyAgU2hhZGluZ1R5cGUgbV9TaGFkaW5nVHlwZTsKKyAgRlhfQk9PTCBtX2JTaGFkaW5nT2JqOworICBDUERGX09iamVjdCogbV9wU2hhZGluZ09iajsKKworICAvLyBTdGlsbCBrZWVwIHxtX3BDU3wgYXMgc29tZSBDUERGX0NvbG9yU3BhY2UgKG5hbWUgb2JqZWN0KSBhcmUgbm90IG1hbmFnZWQKKyAgLy8gYXMgY291bnRlZCBvYmplY3RzLiBSZWZlciB0byBDUERGX0RvY1BhZ2VEYXRhOjpHZXRDb2xvclNwYWNlLgorICBDUERGX0NvbG9yU3BhY2UqIG1fcENTOworCisgIENQREZfQ291bnRlZENvbG9yU3BhY2UqIG1fcENvdW50ZWRDUzsKKyAgQ1BERl9GdW5jdGlvbiogbV9wRnVuY3Rpb25zWzRdOworICBpbnQgbV9uRnVuY3M7Cit9OworCiBzdHJ1Y3QgQ1BERl9NZXNoVmVydGV4IHsKLSAgICBGWF9GTE9BVCB4LCB5OwotICAgIEZYX0ZMT0FUIHIsIGcsIGI7CisgIEZYX0ZMT0FUIHgsIHk7CisgIEZYX0ZMT0FUIHIsIGcsIGI7CiB9OwotY2xhc3MgQ1BERl9NZXNoU3RyZWFtIAotewotcHVibGljOgorY2xhc3MgQ1BERl9NZXNoU3RyZWFtIHsKKyBwdWJsaWM6CisgIEZYX0JPT0wgTG9hZChDUERGX1N0cmVhbSogcFNoYWRpbmdTdHJlYW0sCisgICAgICAgICAgICAgICBDUERGX0Z1bmN0aW9uKiogcEZ1bmNzLAorICAgICAgICAgICAgICAgaW50IG5GdW5jcywKKyAgICAgICAgICAgICAgIENQREZfQ29sb3JTcGFjZSogcENTKTsKIAotICAgIEZYX0JPT0wJCQkJTG9hZChDUERGX1N0cmVhbSogcFNoYWRpbmdTdHJlYW0sIENQREZfRnVuY3Rpb24qKiBwRnVuY3MsIGludCBuRnVuY3MsIENQREZfQ29sb3JTcGFjZSogcENTKTsKKyAgRlhfRFdPUkQgR2V0RmxhZygpOwogCi0gICAgRlhfRFdPUkQJCQlHZXRGbGFnKCk7CisgIHZvaWQgR2V0Q29vcmRzKEZYX0ZMT0FUJiB4LCBGWF9GTE9BVCYgeSk7CiAKLSAgICB2b2lkCQkJCUdldENvb3JkcyhGWF9GTE9BVCYgeCwgRlhfRkxPQVQmIHkpOworICB2b2lkIEdldENvbG9yKEZYX0ZMT0FUJiByLCBGWF9GTE9BVCYgZywgRlhfRkxPQVQmIGIpOwogCi0gICAgdm9pZAkJCQlHZXRDb2xvcihGWF9GTE9BVCYgciwgRlhfRkxPQVQmIGcsIEZYX0ZMT0FUJiBiKTsKKyAgRlhfRFdPUkQgR2V0VmVydGV4KENQREZfTWVzaFZlcnRleCYgdmVydGV4LCBDRlhfTWF0cml4KiBwT2JqZWN0MkJpdG1hcCk7CiAKLSAgICBGWF9EV09SRCAJCQlHZXRWZXJ0ZXgoQ1BERl9NZXNoVmVydGV4JiB2ZXJ0ZXgsIENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyQml0bWFwKTsKLQotICAgIEZYX0JPT0wJCQkJR2V0VmVydGV4Um93KENQREZfTWVzaFZlcnRleCogdmVydGV4LCBpbnQgY291bnQsIENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyQml0bWFwKTsKLSAgICBDUERGX0Z1bmN0aW9uKioJbV9wRnVuY3M7Ci0gICAgQ1BERl9Db2xvclNwYWNlKgltX3BDUzsKLSAgICBGWF9EV09SRAkJCW1fbkZ1bmNzLCBtX25Db29yZEJpdHMsIG1fbkNvbXBCaXRzLCBtX25GbGFnQml0cywgbV9uQ29tcHM7Ci0gICAgRlhfRFdPUkQJCQltX0Nvb3JkTWF4LCBtX0NvbXBNYXg7Ci0gICAgRlhfRkxPQVQJCQltX3htaW4sIG1feG1heCwgbV95bWluLCBtX3ltYXg7Ci0gICAgRlhfRkxPQVQJCQltX0NvbG9yTWluWzhdLCBtX0NvbG9yTWF4WzhdOwotICAgIENQREZfU3RyZWFtQWNjCQltX1N0cmVhbTsKLSAgICBDRlhfQml0U3RyZWFtCQltX0JpdFN0cmVhbTsKKyAgRlhfQk9PTCBHZXRWZXJ0ZXhSb3coQ1BERl9NZXNoVmVydGV4KiB2ZXJ0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE9iamVjdDJCaXRtYXApOworICBDUERGX0Z1bmN0aW9uKiogbV9wRnVuY3M7CisgIENQREZfQ29sb3JTcGFjZSogbV9wQ1M7CisgIEZYX0RXT1JEIG1fbkZ1bmNzLCBtX25Db29yZEJpdHMsIG1fbkNvbXBCaXRzLCBtX25GbGFnQml0cywgbV9uQ29tcHM7CisgIEZYX0RXT1JEIG1fQ29vcmRNYXgsIG1fQ29tcE1heDsKKyAgRlhfRkxPQVQgbV94bWluLCBtX3htYXgsIG1feW1pbiwgbV95bWF4OworICBGWF9GTE9BVCBtX0NvbG9yTWluWzhdLCBtX0NvbG9yTWF4WzhdOworICBDUERGX1N0cmVhbUFjYyBtX1N0cmVhbTsKKyAgQ0ZYX0JpdFN0cmVhbSBtX0JpdFN0cmVhbTsKIH07Ci0jZGVmaW5lIFBERl9JTUFHRV9OT19DT01QUkVTUwkJCQkweDAwMDAKLSNkZWZpbmUgUERGX0lNQUdFX0xPU1NZX0NPTVBSRVNTCQkJMHgwMDAxCi0jZGVmaW5lIFBERl9JTUFHRV9MT1NTTEVTU19DT01QUkVTUwkJCTB4MDAwMgotI2RlZmluZSBQREZfSU1BR0VfTUFTS19MT1NTWV9DT01QUkVTUwkJMHgwMDA0Ci0jZGVmaW5lIFBERl9JTUFHRV9NQVNLX0xPU1NMRVNTX0NPTVBSRVNTCTB4MDAwOAotY2xhc3MgQ1BERl9JbWFnZVNldFBhcmFtCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9JbWFnZVNldFBhcmFtKCkKLSAgICAgICAgOiBwTWF0dGVDb2xvcihOVUxMKQotICAgICAgICAsIG5RdWFsaXR5KDgwKQotICAgIHsKLSAgICB9Ci0gICAgRlhfQVJHQiogcE1hdHRlQ29sb3I7Ci0gICAgRlhfSU5UMzIgblF1YWxpdHk7CisjZGVmaW5lIFBERl9JTUFHRV9OT19DT01QUkVTUyAweDAwMDAKKyNkZWZpbmUgUERGX0lNQUdFX0xPU1NZX0NPTVBSRVNTIDB4MDAwMQorI2RlZmluZSBQREZfSU1BR0VfTE9TU0xFU1NfQ09NUFJFU1MgMHgwMDAyCisjZGVmaW5lIFBERl9JTUFHRV9NQVNLX0xPU1NZX0NPTVBSRVNTIDB4MDAwNAorI2RlZmluZSBQREZfSU1BR0VfTUFTS19MT1NTTEVTU19DT01QUkVTUyAweDAwMDgKK2NsYXNzIENQREZfSW1hZ2VTZXRQYXJhbSB7CisgcHVibGljOgorICBDUERGX0ltYWdlU2V0UGFyYW0oKSA6IHBNYXR0ZUNvbG9yKE5VTEwpLCBuUXVhbGl0eSg4MCkge30KKyAgRlhfQVJHQiogcE1hdHRlQ29sb3I7CisgIGludDMyX3QgblF1YWxpdHk7CiB9OwotY2xhc3MgQ1BERl9JbWFnZSAKLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfSW1hZ2UgeworIHB1YmxpYzoKKyAgQ1BERl9JbWFnZShDUERGX0RvY3VtZW50KiBwRG9jKTsKIAotICAgIENQREZfSW1hZ2UoQ1BERl9Eb2N1bWVudCogcERvYyk7CisgIH5DUERGX0ltYWdlKCk7CiAKLSAgICB+Q1BERl9JbWFnZSgpOworICBGWF9CT09MIExvYWRJbWFnZUYoQ1BERl9TdHJlYW0qIHBJbWFnZVN0cmVhbSwgRlhfQk9PTCBiSW5saW5lKTsKIAotICAgIEZYX0JPT0wJCQkJCUxvYWRJbWFnZUYoQ1BERl9TdHJlYW0qIHBJbWFnZVN0cmVhbSwgRlhfQk9PTCBiSW5saW5lKTsKKyAgdm9pZCBSZWxlYXNlKCk7CiAKLSAgICB2b2lkCQkJCQlSZWxlYXNlKCk7CisgIENQREZfSW1hZ2UqIENsb25lKCk7CiAKLSAgICBDUERGX0ltYWdlKgkJCQlDbG9uZSgpOworICBGWF9CT09MIElzSW5saW5lKCkgeyByZXR1cm4gbV9iSW5saW5lOyB9CiAKLSAgICBGWF9CT09MCQkJCQlJc0lubGluZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9iSW5saW5lOwotICAgIH0KKyAgdm9pZCBTZXRJbmxpbmVEaWN0KENQREZfRGljdGlvbmFyeSogcERpY3QpIHsgbV9wSW5saW5lRGljdCA9IHBEaWN0OyB9CiAKLSAgICB2b2lkCQkJCQlTZXRJbmxpbmVEaWN0KENQREZfRGljdGlvbmFyeSogcERpY3QpCi0gICAgewotICAgICAgICBtX3BJbmxpbmVEaWN0ID0gcERpY3Q7Ci0gICAgfQorICBDUERGX0RpY3Rpb25hcnkqIEdldElubGluZURpY3QoKSBjb25zdCB7IHJldHVybiBtX3BJbmxpbmVEaWN0OyB9CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqCQlHZXRJbmxpbmVEaWN0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BJbmxpbmVEaWN0OwotICAgIH0KKyAgQ1BERl9TdHJlYW0qIEdldFN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIG1fcFN0cmVhbTsgfQogCi0gICAgQ1BERl9TdHJlYW0qCQkJR2V0U3RyZWFtKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BTdHJlYW07Ci0gICAgfQorICBDUERGX0RpY3Rpb25hcnkqIEdldERpY3QoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fcFN0cmVhbSA/IG1fcFN0cmVhbS0+R2V0RGljdCgpIDogTlVMTDsKKyAgfQogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgkJR2V0RGljdCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wU3RyZWFtPyBtX3BTdHJlYW0tPkdldERpY3QoKTogTlVMTDsKLSAgICB9CisgIENQREZfRGljdGlvbmFyeSogR2V0T0MoKSBjb25zdCB7IHJldHVybiBtX3BPQzsgfQogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgkJR2V0T0MoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcE9DOwotICAgIH0KKyAgQ1BERl9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BEb2N1bWVudDsgfQogCi0gICAgQ1BERl9Eb2N1bWVudCoJCQlHZXREb2N1bWVudCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRG9jdW1lbnQ7Ci0gICAgfQorICBpbnQzMl90IEdldFBpeGVsSGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9IZWlnaHQ7IH0KIAorICBpbnQzMl90IEdldFBpeGVsV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX1dpZHRoOyB9CiAKKyAgRlhfQk9PTCBJc01hc2soKSBjb25zdCB7IHJldHVybiBtX2JJc01hc2s7IH0KIAotICAgIEZYX0lOVDMyCQkJCUdldFBpeGVsSGVpZ2h0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0hlaWdodDsKLSAgICB9CisgIEZYX0JPT0wgSXNJbnRlcnBvbCgpIGNvbnN0IHsgcmV0dXJuIG1fYkludGVycG9sYXRlOyB9CiAKLSAgICBGWF9JTlQzMgkJCQlHZXRQaXhlbFdpZHRoKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1dpZHRoOwotICAgIH0KKyAgQ0ZYX0RJQlNvdXJjZSogTG9hZERJQlNvdXJjZShDRlhfRElCU291cmNlKiogcHBNYXNrID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcE1hdHRlQ29sb3IgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UpIGNvbnN0OwogCisgIHZvaWQgU2V0SW1hZ2UoY29uc3QgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsCisgICAgICAgICAgICAgICAgaW50MzJfdCBpQ29tcHJlc3MsCisgICAgICAgICAgICAgICAgSUZYX0ZpbGVXcml0ZSogcEZpbGVXcml0ZSA9IE5VTEwsCisgICAgICAgICAgICAgICAgSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQgPSBOVUxMLAorICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcE1hc2sgPSBOVUxMLAorICAgICAgICAgICAgICAgIGNvbnN0IENQREZfSW1hZ2VTZXRQYXJhbSogcFBhcmFtID0gTlVMTCk7CiAKLSAgICBGWF9CT09MCQkJCQlJc01hc2soKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYklzTWFzazsKLSAgICB9CisgIHZvaWQgU2V0SnBlZ0ltYWdlKHVpbnQ4X3QqIHBJbWFnZURhdGEsIEZYX0RXT1JEIHNpemUpOwogCi0gICAgRlhfQk9PTAkJCQkJSXNJbnRlcnBvbCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9iSW50ZXJwb2xhdGU7Ci0gICAgfQorICB2b2lkIFNldEpwZWdJbWFnZShJRlhfRmlsZVJlYWQqIHBGaWxlKTsKIAotICAgIENGWF9ESUJTb3VyY2UqCQkJTG9hZERJQlNvdXJjZShDRlhfRElCU291cmNlKiogcHBNYXNrID0gTlVMTCwgRlhfRFdPUkQqIHBNYXR0ZUNvbG9yID0gTlVMTCwgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLCBGWF9CT09MIGJMb2FkTWFzayA9IEZBTFNFKSBjb25zdDsKKyAgdm9pZCBSZXNldENhY2hlKENQREZfUGFnZSogcFBhZ2UsIGNvbnN0IENGWF9ESUJpdG1hcCogcERJQml0bWFwKTsKIAorIHB1YmxpYzoKKyAgRlhfQk9PTCBTdGFydExvYWRESUJTb3VyY2UoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSk7CisgIEZYX0JPT0wgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOworICBDRlhfRElCU291cmNlKiBEZXRhY2hCaXRtYXAoKTsKKyAgQ0ZYX0RJQlNvdXJjZSogRGV0YWNoTWFzaygpOworICBDRlhfRElCU291cmNlKiBtX3BESUJTb3VyY2U7CisgIENGWF9ESUJTb3VyY2UqIG1fcE1hc2s7CisgIEZYX0RXT1JEIG1fTWF0dGVDb2xvcjsKIAorIHByaXZhdGU6CisgIENQREZfU3RyZWFtKiBtX3BTdHJlYW07CisgIEZYX0JPT0wgbV9iSW5saW5lOworICBDUERGX0RpY3Rpb25hcnkqIG1fcElubGluZURpY3Q7CiAKLSAgICB2b2lkCQkJCQlTZXRJbWFnZShjb25zdCBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwgRlhfSU5UMzIgaUNvbXByZXNzLCBJRlhfRmlsZVdyaXRlICpwRmlsZVdyaXRlID0gTlVMTCwgSUZYX0ZpbGVSZWFkICpwRmlsZVJlYWQgPSBOVUxMLCBjb25zdCBDRlhfRElCaXRtYXAqIHBNYXNrID0gTlVMTCwgY29uc3QgQ1BERl9JbWFnZVNldFBhcmFtKiBwUGFyYW0gPSBOVUxMKTsKKyAgaW50MzJfdCBtX0hlaWdodDsKIAotICAgIHZvaWQJCQkJCVNldEpwZWdJbWFnZShGWF9CWVRFKiBwSW1hZ2VEYXRhLCBGWF9EV09SRCBzaXplKTsKKyAgaW50MzJfdCBtX1dpZHRoOwogCi0gICAgdm9pZAkJCQkJU2V0SnBlZ0ltYWdlKElGWF9GaWxlUmVhZCAqcEZpbGUpOworICBGWF9CT09MIG1fYklzTWFzazsKIAotICAgIHZvaWQJCQkJCVJlc2V0Q2FjaGUoQ1BERl9QYWdlKiBwUGFnZSwgY29uc3QgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXApOworICBGWF9CT09MIG1fYkludGVycG9sYXRlOwogCi1wdWJsaWM6Ci0gICAgRlhfQk9PTAkJCQkJU3RhcnRMb2FkRElCU291cmNlKENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlLCBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UpOwotICAgIEZYX0JPT0wJCQkJCUNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKLSAgICBDRlhfRElCU291cmNlKgkJCURldGFjaEJpdG1hcCgpOwotICAgIENGWF9ESUJTb3VyY2UqCQkJRGV0YWNoTWFzaygpOwotICAgIENGWF9ESUJTb3VyY2UqCQkJbV9wRElCU291cmNlOwotICAgIENGWF9ESUJTb3VyY2UqCQkJbV9wTWFzazsKLSAgICBGWF9EV09SRAkJCQltX01hdHRlQ29sb3I7Ci1wcml2YXRlOgorICBDUERGX0RvY3VtZW50KiBtX3BEb2N1bWVudDsKIAotICAgIENQREZfU3RyZWFtKgkJCW1fcFN0cmVhbTsKLSAgICBGWF9CT09MCQkJCQltX2JJbmxpbmU7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KgkJbV9wSW5saW5lRGljdDsKLQotICAgIEZYX0lOVDMyCQkJCW1fSGVpZ2h0OwotCi0gICAgRlhfSU5UMzIJCQkJbV9XaWR0aDsKLQotICAgIEZYX0JPT0wJCQkJCW1fYklzTWFzazsKLQotICAgIEZYX0JPT0wJCQkJCW1fYkludGVycG9sYXRlOwotCi0gICAgQ1BERl9Eb2N1bWVudCoJCQltX3BEb2N1bWVudDsKLQotICAgIENQREZfRGljdGlvbmFyeSoJCW1fcE9DOwotICAgIENQREZfRGljdGlvbmFyeSoJSW5pdEpQRUcoRlhfTFBCWVRFIHBEYXRhLCBGWF9EV09SRCBzaXplKTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BPQzsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBJbml0SlBFRyh1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSk7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GUERGQVBJX0ZQREZfUkVTT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfc2VyaWFsLmggYi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3NlcmlhbC5oCmluZGV4IGZjNTVmYTAuLmIwOTg5ZjcgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfc2VyaWFsLmgKKysrIGIvY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9zZXJpYWwuaApAQCAtMTIsMTkzICsxMiw5MiBAQAogCiBjbGFzcyBDUERGX09iamVjdFN0cmVhbTsKIGNsYXNzIENQREZfWFJlZlN0cmVhbTsKLUNGWF9CeXRlVGV4dEJ1ZiYgb3BlcmF0b3IgPDwgKENGWF9CeXRlVGV4dEJ1ZiYgYnVmLCBjb25zdCBDUERGX09iamVjdCogcE9iaik7Ci1jbGFzcyBDUERGX09iakFyY2hpdmVTYXZlciA6IHB1YmxpYyBDRlhfQXJjaGl2ZVNhdmVyCi17Ci1wdWJsaWM6CitDRlhfQnl0ZVRleHRCdWYmIG9wZXJhdG9yPDwoQ0ZYX0J5dGVUZXh0QnVmJiBidWYsIGNvbnN0IENQREZfT2JqZWN0KiBwT2JqKTsKKyNkZWZpbmUgRlBERkNSRUFURV9JTkNSRU1FTlRBTCAxCisjZGVmaW5lIEZQREZDUkVBVEVfTk9fT1JJR0lOQUwgMgorI2RlZmluZSBGUERGQ1JFQVRFX1BST0dSRVNTSVZFIDQKKyNkZWZpbmUgRlBERkNSRUFURV9PQkpFQ1RTVFJFQU0gOAogCi0gICAgZnJpZW5kIENQREZfT2JqQXJjaGl2ZVNhdmVyJglvcGVyYXRvciA8PCAoQ1BERl9PYmpBcmNoaXZlU2F2ZXImIGFyLCBjb25zdCBDUERGX09iamVjdCogcE9iaik7Ci1wcm90ZWN0ZWQ6CitjbGFzcyBDUERGX0NyZWF0b3IgeworIHB1YmxpYzoKKyAgQ1BERl9DcmVhdG9yKENQREZfRG9jdW1lbnQqIHBEb2MpOworICB+Q1BERl9DcmVhdG9yKCk7CiAKLSAgICBDRlhfTWFwUHRyVG9QdHIJCQltX09iamVjdE1hcDsKLX07Ci1jbGFzcyBDUERGX09iakFyY2hpdmVMb2FkZXIgOiBwdWJsaWMgQ0ZYX0FyY2hpdmVMb2FkZXIKLXsKLXB1YmxpYzoKKyAgdm9pZCBSZW1vdmVTZWN1cml0eSgpOworICBGWF9CT09MIENyZWF0ZShJRlhfU3RyZWFtV3JpdGUqIHBGaWxlLCBGWF9EV09SRCBmbGFncyA9IDApOworICBpbnQzMl90IENvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCk7CisgIEZYX0JPT0wgU2V0RmlsZVZlcnNpb24oaW50MzJfdCBmaWxlVmVyc2lvbiA9IDE3KTsKIAotICAgIENQREZfT2JqQXJjaGl2ZUxvYWRlcihGWF9MUENCWVRFIHBEYXRhLCBGWF9EV09SRCBkd1NpemUpIDogQ0ZYX0FyY2hpdmVMb2FkZXIocERhdGEsIGR3U2l6ZSksCi0gICAgICAgIG1fSW5kaXJlY3RPYmplY3RzKE5VTEwpIHt9CisgcHJvdGVjdGVkOgorICBDUERGX0RvY3VtZW50KiBtX3BEb2N1bWVudDsKIAotICAgIGZyaWVuZCBDUERGX09iakFyY2hpdmVMb2FkZXImCW9wZXJhdG9yID4+IChDUERGX09iakFyY2hpdmVMb2FkZXImIGFyLCBDUERGX09iamVjdComIHBPYmopOwotcHJvdGVjdGVkOgorICBDUERGX1BhcnNlciogbV9wUGFyc2VyOwogCi0gICAgQ1BERl9JbmRpcmVjdE9iamVjdHMJCW1fSW5kaXJlY3RPYmplY3RzOwotfTsKLWNsYXNzIENQREZfUGFnZUFyY2hpdmVTYXZlciA6IHB1YmxpYyBDUERGX09iakFyY2hpdmVTYXZlcgotewotcHVibGljOgorICBGWF9CT09MIG1fYkNvbXByZXNzOwogCi0gICAgQ1BERl9QYWdlQXJjaGl2ZVNhdmVyKENQREZfUGFnZU9iamVjdHMqIHBQYWdlT2Jqcyk7CisgIEZYX0JPT0wgbV9iU2VjdXJpdHlDaGFuZ2VkOwogCi0gICAgZnJpZW5kIENQREZfUGFnZUFyY2hpdmVTYXZlciYJb3BlcmF0b3IgPDwgKENQREZfUGFnZUFyY2hpdmVTYXZlciYgYXIsIENQREZfUGFnZU9iamVjdCogcE9iaik7CisgIENQREZfRGljdGlvbmFyeSogbV9wRW5jcnlwdERpY3Q7CisgIEZYX0RXT1JEIG1fZHdFbnJ5cHRPYmpOdW07CisgIEZYX0JPT0wgbV9iRW5jcnlwdENsb25lZDsKIAorICBGWF9CT09MIG1fYlN0YW5kYXJkU2VjdXJpdHk7CiAKKyAgQ1BERl9DcnlwdG9IYW5kbGVyKiBtX3BDcnlwdG9IYW5kbGVyOworICBGWF9CT09MIG1fYk5ld0NyeXB0bzsKIAotICAgIGZyaWVuZCBDUERGX1BhZ2VBcmNoaXZlU2F2ZXImCW9wZXJhdG9yIDw8IChDUERGX1BhZ2VBcmNoaXZlU2F2ZXImIGFyLCBDUERGX0NsaXBQYXRoIGNsaXBfcGF0aCk7CisgIEZYX0JPT0wgbV9iRW5jcnlwdE1ldGFkYXRhOwogCi0gICAgZnJpZW5kIENQREZfUGFnZUFyY2hpdmVTYXZlciYJb3BlcmF0b3IgPDwgKENQREZfUGFnZUFyY2hpdmVTYXZlciYgYXIsIENQREZfR3JhcGhTdGF0ZSBncmFwaF9zdGF0ZSk7CisgIENQREZfT2JqZWN0KiBtX3BNZXRhZGF0YTsKIAotICAgIGZyaWVuZCBDUERGX1BhZ2VBcmNoaXZlU2F2ZXImCW9wZXJhdG9yIDw8IChDUERGX1BhZ2VBcmNoaXZlU2F2ZXImIGFyLCBDUERGX1RleHRTdGF0ZSB0ZXh0X3N0YXRlKTsKKyAgQ1BERl9YUmVmU3RyZWFtKiBtX3BYUmVmU3RyZWFtOwogCi0gICAgZnJpZW5kIENQREZfUGFnZUFyY2hpdmVTYXZlciYJb3BlcmF0b3IgPDwgKENQREZfUGFnZUFyY2hpdmVTYXZlciYgYXIsIENQREZfQ29sb3JTdGF0ZSBjb2xvcl9zdGF0ZSk7CisgIGludDMyX3QgbV9PYmplY3RTdHJlYW1TaXplOwogCi0gICAgZnJpZW5kIENQREZfUGFnZUFyY2hpdmVTYXZlciYJb3BlcmF0b3IgPDwgKENQREZfUGFnZUFyY2hpdmVTYXZlciYgYXIsIENQREZfR2VuZXJhbFN0YXRlIGdlbmVyYWxfc3RhdGUpOworICBGWF9EV09SRCBtX2R3TGFzdE9iak51bTsKKyAgRlhfQk9PTCBDcmVhdGUoRlhfRFdPUkQgZmxhZ3MpOworICB2b2lkIFJlc2V0U3RhbmRhcmRTZWN1cml0eSgpOworICB2b2lkIENsZWFyKCk7CisgIGludDMyX3QgV3JpdGVEb2NfU3RhZ2UxKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgaW50MzJfdCBXcml0ZURvY19TdGFnZTIoSUZYX1BhdXNlKiBwUGF1c2UpOworICBpbnQzMl90IFdyaXRlRG9jX1N0YWdlMyhJRlhfUGF1c2UqIHBQYXVzZSk7CisgIGludDMyX3QgV3JpdGVEb2NfU3RhZ2U0KElGWF9QYXVzZSogcFBhdXNlKTsKIAotcHJvdGVjdGVkOgorICBDRlhfRmlsZUJ1ZmZlckFyY2hpdmUgbV9GaWxlOwogCi0gICAgQ1BERl9DbGlwUGF0aAkJbV9MYXN0Q2xpcFBhdGg7CisgIEZYX0ZJTEVTSVpFIG1fT2Zmc2V0OworICB2b2lkIEluaXRPbGRPYmpOdW1PZmZzZXRzKCk7CisgIHZvaWQgSW5pdE5ld09iak51bU9mZnNldHMoKTsKKyAgdm9pZCBBcHBlbmROZXdPYmpOdW0oRlhfRFdPUkQgb2JqYnVtKTsKKyAgaW50MzJfdCBXcml0ZU9sZEluZGlyZWN0T2JqZWN0KEZYX0RXT1JEIG9iam51bSk7CisgIGludDMyX3QgV3JpdGVPbGRPYmpzKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgaW50MzJfdCBXcml0ZU5ld09ianMoRlhfQk9PTCBiSW5jcmVtZW50YWwsIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgaW50MzJfdCBXcml0ZUluZGlyZWN0T2JqKGNvbnN0IENQREZfT2JqZWN0KiBwT2JqKTsKKyAgaW50MzJfdCBXcml0ZURpcmVjdE9iaihGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9PYmplY3QqIHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRW5jcnlwdCA9IFRSVUUpOworICBpbnQzMl90IFdyaXRlSW5kaXJlY3RPYmplY3RUb1N0cmVhbShjb25zdCBDUERGX09iamVjdCogcE9iaik7CisgIGludDMyX3QgV3JpdGVJbmRpcmVjdE9iaihGWF9EV09SRCBvYmpudW0sIGNvbnN0IENQREZfT2JqZWN0KiBwT2JqKTsKKyAgaW50MzJfdCBXcml0ZUluZGlyZWN0T2JqZWN0VG9TdHJlYW0oRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1NpemUpOworICBpbnQzMl90IEFwcGVuZE9iamVjdE51bWJlclRvWFJlZihGWF9EV09SRCBvYmpudW0pOworICB2b2lkIEluaXRJRChGWF9CT09MIGJEZWZhdWx0ID0gVFJVRSk7CisgIGludDMyX3QgV3JpdGVTdHJlYW0oY29uc3QgQ1BERl9PYmplY3QqIHBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgIENQREZfQ3J5cHRvSGFuZGxlciogcENyeXB0byk7CiAKLSAgICBDUERGX0dyYXBoU3RhdGUJCW1fTGFzdEdyYXBoU3RhdGU7CisgIGludDMyX3QgbV9pU3RhZ2U7CisgIEZYX0RXT1JEIG1fZHdGbGFnczsKKyAgRlhfUE9TSVRJT04gbV9Qb3M7CisgIEZYX0ZJTEVTSVpFIG1fWHJlZlN0YXJ0OworICBDRlhfRmlsZVNpemVMaXN0QXJyYXkgbV9PYmplY3RPZmZzZXQ7CisgIENGWF9EV29yZEFycmF5IG1fTmV3T2JqTnVtQXJyYXk7CisgIENQREZfQXJyYXkqIG1fcElEQXJyYXk7CisgIGludDMyX3QgbV9GaWxlVmVyc2lvbjsKIAotICAgIENQREZfQ29sb3JTdGF0ZQkJbV9MYXN0Q29sb3JTdGF0ZTsKLQotICAgIENQREZfVGV4dFN0YXRlCQltX0xhc3RUZXh0U3RhdGU7Ci0KLSAgICBDUERGX0dlbmVyYWxTdGF0ZQltX0xhc3RHZW5lcmFsU3RhdGU7Ci0KLSAgICBDUERGX1BhZ2VPYmplY3RzKgltX3BDdXJQYWdlOwotfTsKLWNsYXNzIENQREZfUGFnZUFyY2hpdmVMb2FkZXIgOiBwdWJsaWMgQ1BERl9PYmpBcmNoaXZlTG9hZGVyCi17Ci1wdWJsaWM6Ci0KLSAgICBDUERGX1BhZ2VBcmNoaXZlTG9hZGVyKENQREZfUGFnZU9iamVjdHMqIHBQYWdlT2JqcywgRlhfTFBDQllURSBwRGF0YSwgRlhfRFdPUkQgZHdTaXplKTsKLQotICAgIGZyaWVuZCBDUERGX1BhZ2VBcmNoaXZlTG9hZGVyJglvcGVyYXRvciA+PiAoQ1BERl9QYWdlQXJjaGl2ZUxvYWRlciYgYXIsIENQREZfUGFnZU9iamVjdComIHBPYmopOwotCi0KLQotICAgIGZyaWVuZCBDUERGX1BhZ2VBcmNoaXZlTG9hZGVyJglvcGVyYXRvciA+PiAoQ1BERl9QYWdlQXJjaGl2ZUxvYWRlciYgYXIsIENQREZfQ2xpcFBhdGgmIGNsaXBfcGF0aCk7Ci0KLSAgICBmcmllbmQgQ1BERl9QYWdlQXJjaGl2ZUxvYWRlciYJb3BlcmF0b3IgPj4gKENQREZfUGFnZUFyY2hpdmVMb2FkZXImIGFyLCBDUERGX0dyYXBoU3RhdGUmIGdyYXBoX3N0YXRlKTsKLQotICAgIGZyaWVuZCBDUERGX1BhZ2VBcmNoaXZlTG9hZGVyJglvcGVyYXRvciA+PiAoQ1BERl9QYWdlQXJjaGl2ZUxvYWRlciYgYXIsIENQREZfVGV4dFN0YXRlJiB0ZXh0X3N0YXRlKTsKLQotICAgIGZyaWVuZCBDUERGX1BhZ2VBcmNoaXZlTG9hZGVyJglvcGVyYXRvciA+PiAoQ1BERl9QYWdlQXJjaGl2ZUxvYWRlciYgYXIsIENQREZfQ29sb3JTdGF0ZSYgY29sb3Jfc3RhdGUpOwotCi0gICAgZnJpZW5kIENQREZfUGFnZUFyY2hpdmVMb2FkZXImCW9wZXJhdG9yID4+IChDUERGX1BhZ2VBcmNoaXZlTG9hZGVyJiBhciwgQ1BERl9HZW5lcmFsU3RhdGUmIGdlbmVyYWxfc3RhdGUpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdm9pZAkJCQlQb3N0UHJvY0NvbG9yKENQREZfQ29sb3ImIGNvbG9yKTsKLQotICAgIENQREZfT2JqZWN0KgkJQWRkUmVzb3VyY2UoQ1BERl9PYmplY3QqIHBTcmNPYmosIEZYX0xQQ1NUUiB0eXBlKTsKLQotICAgIENQREZfQ2xpcFBhdGgJCW1fTGFzdENsaXBQYXRoOwotCi0gICAgQ1BERl9HcmFwaFN0YXRlCQltX0xhc3RHcmFwaFN0YXRlOwotCi0gICAgQ1BERl9Db2xvclN0YXRlCQltX0xhc3RDb2xvclN0YXRlOwotCi0gICAgQ1BERl9UZXh0U3RhdGUJCW1fTGFzdFRleHRTdGF0ZTsKLQotICAgIENQREZfR2VuZXJhbFN0YXRlCW1fTGFzdEdlbmVyYWxTdGF0ZTsKLQotICAgIENQREZfUGFnZU9iamVjdHMqCW1fcEN1clBhZ2U7Ci0KLSAgICBDRlhfTWFwUHRyVG9QdHIJCW1fT2JqZWN0TWFwOwotfTsKLSNkZWZpbmUgRlBERkNSRUFURV9JTkNSRU1FTlRBTAkJMQotI2RlZmluZSBGUERGQ1JFQVRFX05PX09SSUdJTkFMCQkyCi0jZGVmaW5lIEZQREZDUkVBVEVfUFJPR1JFU1NJVkUJCTQKLSNkZWZpbmUgRlBERkNSRUFURV9PQkpFQ1RTVFJFQU0JCTgKLWNsYXNzIENQREZfQ3JlYXRvciAKLXsKLXB1YmxpYzoKLQotICAgIENQREZfQ3JlYXRvcihDUERGX0RvY3VtZW50KiBwRG9jKTsKLQotICAgIH5DUERGX0NyZWF0b3IoKTsKLQotICAgIHZvaWQJCQkJUmVtb3ZlU2VjdXJpdHkoKTsKLQotICAgIEZYX0JPT0wJCQkJQ3JlYXRlKEZYX0xQQ1dTVFIgZmlsZW5hbWUsIEZYX0RXT1JEIGZsYWdzID0gMCk7Ci0KLSAgICBGWF9CT09MCQkJCUNyZWF0ZShGWF9MUENTVFIgZmlsZW5hbWUsIEZYX0RXT1JEIGZsYWdzID0gMCk7Ci0KLSAgICBGWF9CT09MCQkJCUNyZWF0ZShJRlhfU3RyZWFtV3JpdGUqIHBGaWxlLCBGWF9EV09SRCBmbGFncyA9IDApOwotCi0gICAgRlhfSU5UMzIJCQlDb250aW51ZShJRlhfUGF1c2UgKnBQYXVzZSA9IE5VTEwpOwotCi0gICAgRlhfQk9PTAkJCQlTZXRGaWxlVmVyc2lvbihGWF9JTlQzMiBmaWxlVmVyc2lvbiA9IDE3KTsKLXByb3RlY3RlZDoKLQotICAgIENQREZfRG9jdW1lbnQqCQltX3BEb2N1bWVudDsKLQotICAgIENQREZfUGFyc2VyKgkJbV9wUGFyc2VyOwotCi0gICAgRlhfQk9PTAkJCQltX2JDb21wcmVzczsKLQotICAgIEZYX0JPT0wJCQkJbV9iU2VjdXJpdHlDaGFuZ2VkOwotCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgltX3BFbmNyeXB0RGljdDsKLSAgICBGWF9EV09SRAkJCW1fZHdFbnJ5cHRPYmpOdW07Ci0gICAgRlhfQk9PTAkJCQltX2JFbmNyeXB0Q2xvbmVkOwotCi0gICAgRlhfQk9PTAkJCQltX2JTdGFuZGFyZFNlY3VyaXR5OwotCi0gICAgQ1BERl9DcnlwdG9IYW5kbGVyKgltX3BDcnlwdG9IYW5kbGVyOwotICAgIEZYX0JPT0wJCQkJbV9iTmV3Q3J5cHRvOwotCi0gICAgRlhfQk9PTAkJCQltX2JFbmNyeXB0TWV0YWRhdGE7Ci0KLSAgICBDUERGX09iamVjdCoJCW1fcE1ldGFkYXRhOwotCi0gICAgQ1BERl9YUmVmU3RyZWFtKgltX3BYUmVmU3RyZWFtOwotCi0gICAgRlhfSU5UMzIJCQltX09iamVjdFN0cmVhbVNpemU7Ci0KLSAgICBGWF9EV09SRAkJCW1fZHdMYXN0T2JqTnVtOwotICAgIEZYX0JPT0wJCQkJQ3JlYXRlKEZYX0RXT1JEIGZsYWdzKTsKLSAgICB2b2lkCQkJCVJlc2V0U3RhbmRhcmRTZWN1cml0eSgpOwotICAgIHZvaWQJCQkJQ2xlYXIoKTsKLSAgICBGWF9JTlQzMgkJCVdyaXRlRG9jX1N0YWdlMShJRlhfUGF1c2UgKnBQYXVzZSk7Ci0gICAgRlhfSU5UMzIJCQlXcml0ZURvY19TdGFnZTIoSUZYX1BhdXNlICpwUGF1c2UpOwotICAgIEZYX0lOVDMyCQkJV3JpdGVEb2NfU3RhZ2UzKElGWF9QYXVzZSAqcFBhdXNlKTsKLSAgICBGWF9JTlQzMgkJCVdyaXRlRG9jX1N0YWdlNChJRlhfUGF1c2UgKnBQYXVzZSk7Ci0KLSAgICBDRlhfRmlsZUJ1ZmZlckFyY2hpdmUJbV9GaWxlOwotCi0gICAgRlhfRklMRVNJWkUJCQltX09mZnNldDsKLSAgICB2b2lkCQkJCUluaXRPbGRPYmpOdW1PZmZzZXRzKCk7Ci0gICAgdm9pZAkJCQlJbml0TmV3T2JqTnVtT2Zmc2V0cygpOwotICAgIHZvaWQJCQkJQXBwZW5kTmV3T2JqTnVtKEZYX0RXT1JEIG9iamJ1bSk7Ci0gICAgRlhfSU5UMzIJCQlXcml0ZU9sZEluZGlyZWN0T2JqZWN0KEZYX0RXT1JEIG9iam51bSk7Ci0gICAgRlhfSU5UMzIJCQlXcml0ZU9sZE9ianMoSUZYX1BhdXNlICpwUGF1c2UpOwotICAgIEZYX0lOVDMyCQkJV3JpdGVOZXdPYmpzKEZYX0JPT0wgYkluY3JlbWVudGFsLCBJRlhfUGF1c2UgKnBQYXVzZSk7Ci0gICAgRlhfSU5UMzIJCQlXcml0ZUluZGlyZWN0T2JqKGNvbnN0IENQREZfT2JqZWN0KiBwT2JqKTsKLSAgICBGWF9JTlQzMgkJCVdyaXRlRGlyZWN0T2JqKEZYX0RXT1JEIG9iam51bSwgY29uc3QgQ1BERl9PYmplY3QqIHBPYmosIEZYX0JPT0wgYkVuY3J5cHQgPSBUUlVFKTsKLSAgICBGWF9JTlQzMgkJCVdyaXRlSW5kaXJlY3RPYmplY3RUb1N0cmVhbShjb25zdCBDUERGX09iamVjdCogcE9iaik7Ci0gICAgRlhfSU5UMzIJCQlXcml0ZUluZGlyZWN0T2JqKEZYX0RXT1JEIG9iam51bSwgY29uc3QgQ1BERl9PYmplY3QqIHBPYmopOwotICAgIEZYX0lOVDMyCQkJV3JpdGVJbmRpcmVjdE9iamVjdFRvU3RyZWFtKEZYX0RXT1JEIG9iam51bSwgRlhfTFBDQllURSBwQnVmZmVyLCBGWF9EV09SRCBkd1NpemUpOwotICAgIEZYX0lOVDMyCQkJQXBwZW5kT2JqZWN0TnVtYmVyVG9YUmVmKEZYX0RXT1JEIG9iam51bSk7Ci0gICAgdm9pZAkJCQlJbml0SUQoRlhfQk9PTCBiRGVmYXVsdCA9IFRSVUUpOwotICAgIEZYX0lOVDMyCQkJV3JpdGVTdHJlYW0oY29uc3QgQ1BERl9PYmplY3QqIHBTdHJlYW0sIEZYX0RXT1JEIG9iam51bSwgQ1BERl9DcnlwdG9IYW5kbGVyKiBwQ3J5cHRvKTsKLQotICAgIEZYX0lOVDMyCQkJbV9pU3RhZ2U7Ci0gICAgRlhfRFdPUkQJCQltX2R3RmxhZ3M7Ci0gICAgRlhfUE9TSVRJT04JCQltX1BvczsKLSAgICBGWF9GSUxFU0laRQkJCW1fWHJlZlN0YXJ0OwotCi0gICAgQ0ZYX0ZpbGVTaXplTGlzdEFycmF5CW1fT2JqZWN0T2Zmc2V0OwotCi0gICAgQ0ZYX0RXb3JkTGlzdEFycmF5CQltX09iamVjdFNpemU7Ci0gICAgQ0ZYX0RXb3JkQXJyYXkJCW1fTmV3T2JqTnVtQXJyYXk7Ci0KLSAgICBDUERGX0FycmF5KgkJCW1fcElEQXJyYXk7Ci0KLSAgICBGWF9JTlQzMgkJCW1fRmlsZVZlcnNpb247Ci0gICAgZnJpZW5kIGNsYXNzIENQREZfT2JqZWN0U3RyZWFtOwotICAgIGZyaWVuZCBjbGFzcyBDUERGX1hSZWZTdHJlYW07CisgIGZyaWVuZCBjbGFzcyBDUERGX09iamVjdFN0cmVhbTsKKyAgZnJpZW5kIGNsYXNzIENQREZfWFJlZlN0cmVhbTsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9JTkNMVURFX0ZQREZBUElfRlBERl9TRVJJQUxfSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZhcGkuaCBiL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZhcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQzMjgyMy4uMDAwMDAwMAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfSU5DTFVERV9GUERGQVBJX0ZQREZBUElfSF8KLSNkZWZpbmUgQ09SRV9JTkNMVURFX0ZQREZBUElfRlBERkFQSV9IXwotCi0jaW5jbHVkZSAiLi4vZnhjcnQvZnhfYmFzaWMuaCIKLSNpbmNsdWRlICIuLi9meGdlL2Z4X2dlLmgiCi0jaW5jbHVkZSAiZnBkZl9tb2R1bGUuaCIKLSNpbmNsdWRlICJmcGRmX3BhZ2VvYmouaCIKLSNpbmNsdWRlICJmcGRmX3JlbmRlci5oIgotI2luY2x1ZGUgImZwZGZfc2VyaWFsLmgiCi0KLSNlbmRpZiAgLy8gQ09SRV9JTkNMVURFX0ZQREZBUElfRlBERkFQSV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9hcC5oIGIvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9hcC5oCmluZGV4IDM5ZGFmMDIuLjZkMDQ3OGMgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfYXAuaAorKysgYi9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2FwLmgKQEAgLTEsOTYgKzEsMTA2IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgQ09SRV9JTkNMVURFX0ZQREZET0NfRlBERl9BUF9IXwogI2RlZmluZSBDT1JFX0lOQ0xVREVfRlBERkRPQ19GUERGX0FQX0hfCiAKLSNpbmNsdWRlICIuLi9meGNydC9meF9iYXNpYy5oIgotI2luY2x1ZGUgIi4uL2ZwZGZhcGkvZnBkZl9wYXJzZXIuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhcnNlci5oIgogI2luY2x1ZGUgImZwZGZfdnQuaCIKIAotY2xhc3MgSVBWVF9Gb250TWFwCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+SVBWVF9Gb250TWFwKCkgeyB9Ci0gICAgdmlydHVhbCBDUERGX0ZvbnQqCQkJCQkJR2V0UERGRm9udChGWF9JTlQzMiBuRm9udEluZGV4KSA9IDA7Ci0gICAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0UERGRm9udEFsaWFzKEZYX0lOVDMyIG5Gb250SW5kZXgpID0gMDsKK2NsYXNzIElQVlRfRm9udE1hcCB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JUFZUX0ZvbnRNYXAoKSB7fQorICB2aXJ0dWFsIENQREZfRm9udCogR2V0UERGRm9udChpbnQzMl90IG5Gb250SW5kZXgpID0gMDsKKyAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZyBHZXRQREZGb250QWxpYXMoaW50MzJfdCBuRm9udEluZGV4KSA9IDA7CiB9Owogc3RydWN0IENQVlRfRGFzaCB7CisgIENQVlRfRGFzaChpbnQzMl90IGRhc2gsIGludDMyX3QgZ2FwLCBpbnQzMl90IHBoYXNlKQorICAgICAgOiBuRGFzaChkYXNoKSwgbkdhcChnYXApLCBuUGhhc2UocGhhc2UpIHt9CiAKLSAgICBDUFZUX0Rhc2goRlhfSU5UMzIgZGFzaCwgRlhfSU5UMzIgZ2FwLCBGWF9JTlQzMiBwaGFzZSkgOiBuRGFzaChkYXNoKSwgbkdhcChnYXApLCBuUGhhc2UocGhhc2UpCi0gICAge30KKyAgaW50MzJfdCBuRGFzaDsKIAotICAgIEZYX0lOVDMyCQkJbkRhc2g7CisgIGludDMyX3QgbkdhcDsKIAotICAgIEZYX0lOVDMyCQkJbkdhcDsKLQotICAgIEZYX0lOVDMyCQkJblBoYXNlOworICBpbnQzMl90IG5QaGFzZTsKIH07Ci0jZGVmaW5lIENUX1RSQU5TUEFSRU5UCQkwCi0jZGVmaW5lCUNUX0dSQVkJCQkJMQotI2RlZmluZQlDVF9SR0IJCQkJMgotI2RlZmluZQlDVF9DTVlLCQkJCTMKKyNkZWZpbmUgQ1RfVFJBTlNQQVJFTlQgMAorI2RlZmluZSBDVF9HUkFZIDEKKyNkZWZpbmUgQ1RfUkdCIDIKKyNkZWZpbmUgQ1RfQ01ZSyAzCiBzdHJ1Y3QgQ1BWVF9Db2xvciB7CisgIENQVlRfQ29sb3IoaW50MzJfdCB0eXBlID0gMCwKKyAgICAgICAgICAgICBGWF9GTE9BVCBjb2xvcjEgPSAwLjBmLAorICAgICAgICAgICAgIEZYX0ZMT0FUIGNvbG9yMiA9IDAuMGYsCisgICAgICAgICAgICAgRlhfRkxPQVQgY29sb3IzID0gMC4wZiwKKyAgICAgICAgICAgICBGWF9GTE9BVCBjb2xvcjQgPSAwLjBmKQorICAgICAgOiBuQ29sb3JUeXBlKHR5cGUpLAorICAgICAgICBmQ29sb3IxKGNvbG9yMSksCisgICAgICAgIGZDb2xvcjIoY29sb3IyKSwKKyAgICAgICAgZkNvbG9yMyhjb2xvcjMpLAorICAgICAgICBmQ29sb3I0KGNvbG9yNCkge30KIAotICAgIENQVlRfQ29sb3IoRlhfSU5UMzIgdHlwZSA9IDAsIEZYX0ZMT0FUIGNvbG9yMSA9IDAuMGYsIEZYX0ZMT0FUIGNvbG9yMiA9IDAuMGYsIEZYX0ZMT0FUIGNvbG9yMyA9IDAuMGYsIEZYX0ZMT0FUIGNvbG9yNCA9IDAuMGYpCi0gICAgICAgIDogbkNvbG9yVHlwZSh0eXBlKSwgZkNvbG9yMShjb2xvcjEpLCBmQ29sb3IyKGNvbG9yMiksIGZDb2xvcjMoY29sb3IzKSwgZkNvbG9yNChjb2xvcjQpCi0gICAge30KLQotICAgIEZYX0lOVDMyCQkJbkNvbG9yVHlwZTsKLSAgICBGWF9GTE9BVAkJCWZDb2xvcjE7Ci0gICAgRlhfRkxPQVQJCQlmQ29sb3IyOwotICAgIEZYX0ZMT0FUCQkJZkNvbG9yMzsKLSAgICBGWF9GTE9BVAkJCWZDb2xvcjQ7CisgIGludDMyX3QgbkNvbG9yVHlwZTsKKyAgRlhfRkxPQVQgZkNvbG9yMTsKKyAgRlhfRkxPQVQgZkNvbG9yMjsKKyAgRlhfRkxPQVQgZkNvbG9yMzsKKyAgRlhfRkxPQVQgZkNvbG9yNDsKIH07Ci1jbGFzcyBDUFZUX1Byb3ZpZGVyIDogcHVibGljIElQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyCi17Ci1wdWJsaWM6CitjbGFzcyBDUFZUX1Byb3ZpZGVyIDogcHVibGljIElQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyIHsKKyBwdWJsaWM6CisgIENQVlRfUHJvdmlkZXIoSVBWVF9Gb250TWFwKiBwRm9udE1hcCk7CisgIH5DUFZUX1Byb3ZpZGVyKCkgb3ZlcnJpZGU7CiAKLSAgICBDUFZUX1Byb3ZpZGVyKElQVlRfRm9udE1hcCAqIHBGb250TWFwKTsKKyAgLy8gSVBERl9WYXJpYWJsZVRleHRfUHJvdmlkZXIKKyAgaW50MzJfdCBHZXRDaGFyV2lkdGgoaW50MzJfdCBuRm9udEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbldvcmRTdHlsZSkgb3ZlcnJpZGU7CisgIGludDMyX3QgR2V0VHlwZUFzY2VudChpbnQzMl90IG5Gb250SW5kZXgpIG92ZXJyaWRlOworICBpbnQzMl90IEdldFR5cGVEZXNjZW50KGludDMyX3QgbkZvbnRJbmRleCkgb3ZlcnJpZGU7CisgIGludDMyX3QgR2V0V29yZEZvbnRJbmRleChGWF9XT1JEIHdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Gb250SW5kZXgpIG92ZXJyaWRlOworICBGWF9CT09MIElzTGF0aW5Xb3JkKEZYX1dPUkQgd29yZCkgb3ZlcnJpZGU7CisgIGludDMyX3QgR2V0RGVmYXVsdEZvbnRJbmRleCgpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCB+Q1BWVF9Qcm92aWRlcigpOwotCi0gICAgRlhfSU5UMzIJCQkJCQlHZXRDaGFyV2lkdGgoRlhfSU5UMzIgbkZvbnRJbmRleCwgRlhfV09SRCB3b3JkLCBGWF9JTlQzMiBuV29yZFN0eWxlKTsKLQotICAgIEZYX0lOVDMyCQkJCQkJR2V0VHlwZUFzY2VudChGWF9JTlQzMiBuRm9udEluZGV4KTsKLQotICAgIEZYX0lOVDMyCQkJCQkJR2V0VHlwZURlc2NlbnQoRlhfSU5UMzIgbkZvbnRJbmRleCk7Ci0KLSAgICBGWF9JTlQzMgkJCQkJCUdldFdvcmRGb250SW5kZXgoRlhfV09SRCB3b3JkLCBGWF9JTlQzMiBjaGFyc2V0LCBGWF9JTlQzMiBuRm9udEluZGV4KTsKLQotICAgIEZYX0JPT0wJCQkJCQkJSXNMYXRpbldvcmQoRlhfV09SRCB3b3JkKTsKLQotICAgIEZYX0lOVDMyCQkJCQkJR2V0RGVmYXVsdEZvbnRJbmRleCgpOwotcHJpdmF0ZToKLQotICAgIElQVlRfRm9udE1hcCAqCW1fcEZvbnRNYXA7CisgcHJpdmF0ZToKKyAgSVBWVF9Gb250TWFwKiBtX3BGb250TWFwOwogfTsKLSNkZWZpbmUgUEJTX1NPTElECQkJMAotI2RlZmluZSBQQlNfREFTSAkJCTEKLSNkZWZpbmUgUEJTX0JFVkVMRUQJCQkyCi0jZGVmaW5lIFBCU19JTlNFVAkJCTMKLSNkZWZpbmUgUEJTX1VOREVSTElORUQJCTQKLWNsYXNzIENQVlRfR2VuZXJhdGVBUAotewotcHVibGljOgorI2RlZmluZSBQQlNfU09MSUQgMAorI2RlZmluZSBQQlNfREFTSCAxCisjZGVmaW5lIFBCU19CRVZFTEVEIDIKKyNkZWZpbmUgUEJTX0lOU0VUIDMKKyNkZWZpbmUgUEJTX1VOREVSTElORUQgNAorY2xhc3MgQ1BWVF9HZW5lcmF0ZUFQIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBGWF9CT09MIEdlbmVyYXRlVGV4dEZpZWxkQVAoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpOwogCi0gICAgc3RhdGljIEZYX0JPT0wJCQkJCQkJR2VuZXJhdGVUZXh0RmllbGRBUChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpOworICBzdGF0aWMgRlhfQk9PTCBHZW5lcmF0ZUNvbWJvQm94QVAoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCk7CiAKLSAgICBzdGF0aWMgRlhfQk9PTAkJCQkJCQlHZW5lcmF0ZUNvbWJvQm94QVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKKyAgc3RhdGljIEZYX0JPT0wgR2VuZXJhdGVMaXN0Qm94QVAoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKIAotICAgIHN0YXRpYyBGWF9CT09MCQkJCQkJCUdlbmVyYXRlTGlzdEJveEFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCk7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZW5lcmF0ZUVkaXRBUChJUFZUX0ZvbnRNYXAqIHBGb250TWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIHBJdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ29udGludW91cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgU3ViV29yZCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFZpc2libGUgPSBOVUxMKTsKIAotICAgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2VuZXJhdGVFZGl0QVAoSVBWVF9Gb250TWFwICogcEZvbnRNYXAsIElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogcEl0ZXJhdG9yLAotICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0LCBGWF9CT09MIGJDb250aW51b3VzLCBGWF9XT1JEIFN1YldvcmQgPSAwLCBjb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBWaXNpYmxlID0gTlVMTCk7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZW5lcmF0ZUJvcmRlckFQKGNvbnN0IENQREZfUmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX0NvbG9yJiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Db2xvciYgY3JMZWZ0VG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX0NvbG9yJiBjclJpZ2h0Qm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9EYXNoJiBkYXNoKTsKIAotICAgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2VuZXJhdGVCb3JkZXJBUChjb25zdCBDUERGX1JlY3QgJiByZWN0LCBGWF9GTE9BVCBmV2lkdGgsCi0gICAgICAgICAgICBjb25zdCBDUFZUX0NvbG9yICYgY29sb3IsIGNvbnN0IENQVlRfQ29sb3IgJiBjckxlZnRUb3AsIGNvbnN0IENQVlRfQ29sb3IgJiBjclJpZ2h0Qm90dG9tLAotICAgICAgICAgICAgRlhfSU5UMzIgblN0eWxlLCBjb25zdCBDUFZUX0Rhc2ggJiBkYXNoKTsKLQotICAgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2VuZXJhdGVDb2xvckFQKGNvbnN0IENQVlRfQ29sb3IgJiBjb2xvciwgY29uc3QgRlhfQk9PTCAmIGJGaWxsT3JTdHJva2UpOworICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2VuZXJhdGVDb2xvckFQKGNvbnN0IENQVlRfQ29sb3ImIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0JPT0wmIGJGaWxsT3JTdHJva2UpOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0lOQ0xVREVfRlBERkRPQ19GUERGX0FQX0hfCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oIGIvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9kb2MuaAppbmRleCA3MTViNzllLi43YTZkZDRmIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgKQEAgLTEsMTc1MyArMSwxMTU3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgQ09SRV9JTkNMVURFX0ZQREZET0NfRlBERl9ET0NfSF8KICNkZWZpbmUgQ09SRV9JTkNMVURFX0ZQREZET0NfRlBERl9ET0NfSF8KIAotI2luY2x1ZGUgIi4uL2ZwZGZhcGkvZnBkZl9wYXJzZXIuaCIKLSNpbmNsdWRlICIuLi9mcGRmYXBpL2ZwZGZfcmVuZGVyLmgiCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhcnNlci5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcmVuZGVyLmgiCisKK2NsYXNzIENGaWVsZFRyZWU7CitjbGFzcyBDUERGX0FBY3Rpb247CiBjbGFzcyBDUERGX0FjdGlvbjsKK2NsYXNzIENQREZfQWN0aW9uRmllbGRzOwogY2xhc3MgQ1BERl9Bbm5vdDsKIGNsYXNzIENQREZfQW5ub3RMaXN0OworY2xhc3MgQ1BERl9BcFNldHRpbmdzOwogY2xhc3MgQ1BERl9Cb29rbWFyazsKIGNsYXNzIENQREZfQm9va21hcmtUcmVlOwotY2xhc3MgQ1BERl9EZXN0OwotY2xhc3MgQ1BERl9MaW5rOwotY2xhc3MgQ1BERl9MaW5rTGlzdDsKLWNsYXNzIENQREZfTWV0YWRhdGE7Ci1jbGFzcyBDUERGX05hbWVUcmVlOwotY2xhc3MgQ1BERl9OdW1iZXJUcmVlOwotY2xhc3MgQ1BERl9UZXh0T2JqZWN0OwotY2xhc3MgQ1BERl9WaWV3ZXJQcmVmZXJlbmNlczsKLWNsYXNzIENQREZfUGFnZTsKLWNsYXNzIENQREZfUmVuZGVyT3B0aW9uczsKLWNsYXNzIENYTUxfRWxlbWVudDsKLWNsYXNzIENQREZfT0NDb250ZXh0OwotY2xhc3MgQ1BERl9Eb2NKU0FjdGlvbnM7Ci1jbGFzcyBDUERGX0FjdGlvbkZpZWxkczsKLWNsYXNzIENQREZfQUFjdGlvbjsKLWNsYXNzIENQREZfRmlsZVNwZWM7Ci1jbGFzcyBDUERGX0ljb25GaXQ7CiBjbGFzcyBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOwotY2xhc3MgQ1BERl9JbnRlckZvcm07CitjbGFzcyBDUERGX0Rlc3Q7CitjbGFzcyBDUERGX0RvY0pTQWN0aW9uczsKK2NsYXNzIENQREZfRmlsZVNwZWM7CitjbGFzcyBDUERGX0Zvcm1Db250cm9sOwogY2xhc3MgQ1BERl9Gb3JtRmllbGQ7CiBjbGFzcyBDUERGX0Zvcm1Ob3RpZnk7Ci1jbGFzcyBDUERGX0Zvcm1Db250cm9sOwotY2xhc3MgQ1BERl9MV2luUGFyYW07Ci1jbGFzcyBDRmllbGRUcmVlOwotY2xhc3MgQ1BERl9BcFNldHRpbmdzOwotY2xhc3MgQ1BERl9OYW1lVHJlZSAKLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfSWNvbkZpdDsKK2NsYXNzIENQREZfSW50ZXJGb3JtOworY2xhc3MgQ1BERl9MaW5rOworY2xhc3MgQ1BERl9NZXRhZGF0YTsKK2NsYXNzIENQREZfTnVtYmVyVHJlZTsKK2NsYXNzIENQREZfT0NDb250ZXh0OworY2xhc3MgQ1BERl9QYWdlOworY2xhc3MgQ1BERl9SZW5kZXJPcHRpb25zOworY2xhc3MgQ1BERl9UZXh0T2JqZWN0OworY2xhc3MgQ1BERl9WaWV3ZXJQcmVmZXJlbmNlczsKK2NsYXNzIENYTUxfRWxlbWVudDsKIAotICAgIENQREZfTmFtZVRyZWUoQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCkKLSAgICB7Ci0gICAgICAgIG1fcFJvb3QgPSBwUm9vdDsKLSAgICB9CitjbGFzcyBDUERGX05hbWVUcmVlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENQREZfTmFtZVRyZWUoQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCkgeyBtX3BSb290ID0gcFJvb3Q7IH0KIAotICAgIENQREZfTmFtZVRyZWUoQ1BERl9Eb2N1bWVudCogcERvYywgRlhfQlNUUiBjYXRlZ29yeSk7CisgIENQREZfTmFtZVRyZWUoQ1BERl9Eb2N1bWVudCogcERvYywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjYXRlZ29yeSk7CiAKLSAgICBDUERGX09iamVjdCoJCUxvb2t1cFZhbHVlKGludCBuSW5kZXgsIENGWF9CeXRlU3RyaW5nJiBjc05hbWUpIGNvbnN0OworICBDUERGX09iamVjdCogTG9va3VwVmFsdWUoaW50IG5JbmRleCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZSkgY29uc3Q7CiAKLSAgICBDUERGX09iamVjdCoJCUxvb2t1cFZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc05hbWUpIGNvbnN0OworICBDUERGX09iamVjdCogTG9va3VwVmFsdWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZSkgY29uc3Q7CiAKLSAgICBDUERGX0FycmF5KgkJCUxvb2t1cE5hbWVkRGVzdChDUERGX0RvY3VtZW50KiBwRG9jLCBGWF9CU1RSIHNOYW1lKTsKKyAgQ1BERl9BcnJheSogTG9va3VwTmFtZWREZXN0KENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNOYW1lKTsKIAotICAgIGludAkJCQkJR2V0SW5kZXgoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZSkgY29uc3Q7CisgIGludCBHZXRJbmRleChjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lKSBjb25zdDsKIAotICAgIGludAkJCQkJR2V0Q291bnQoKSBjb25zdDsKKyAgaW50IEdldENvdW50KCkgY29uc3Q7CiAKKyAgQ1BERl9EaWN0aW9uYXJ5KiBHZXRSb290KCkgY29uc3QgeyByZXR1cm4gbV9wUm9vdDsgfQogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KglHZXRSb290KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BSb290OwotICAgIH0KLQotcHJvdGVjdGVkOgotCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgkJbV9wUm9vdDsKKyBwcm90ZWN0ZWQ6CisgIENQREZfRGljdGlvbmFyeSogbV9wUm9vdDsKIH07Ci1jbGFzcyBDUERGX0Jvb2ttYXJrVHJlZSAKLXsKLXB1YmxpYzoKLSAgICBDUERGX0Jvb2ttYXJrVHJlZShDUERGX0RvY3VtZW50KiBwRG9jKSA6IG1fcERvY3VtZW50KHBEb2MpIHt9CitjbGFzcyBDUERGX0Jvb2ttYXJrVHJlZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDUERGX0Jvb2ttYXJrVHJlZShDUERGX0RvY3VtZW50KiBwRG9jKSA6IG1fcERvY3VtZW50KHBEb2MpIHt9CiAKLSAgICBDUERGX0Jvb2ttYXJrCQlHZXRGaXJzdENoaWxkKGNvbnN0IENQREZfQm9va21hcmsmIHBhcmVudCkgY29uc3Q7CisgIENQREZfQm9va21hcmsgR2V0Rmlyc3RDaGlsZChjb25zdCBDUERGX0Jvb2ttYXJrJiBwYXJlbnQpIGNvbnN0OwogCi0gICAgQ1BERl9Cb29rbWFyawkJR2V0TmV4dFNpYmxpbmcoY29uc3QgQ1BERl9Cb29rbWFyayYgYm9va21hcmspIGNvbnN0OworICBDUERGX0Jvb2ttYXJrIEdldE5leHRTaWJsaW5nKGNvbnN0IENQREZfQm9va21hcmsmIGJvb2ttYXJrKSBjb25zdDsKIAotICAgIENQREZfRG9jdW1lbnQqCQlHZXREb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fcERvY3VtZW50OyB9CisgIENQREZfRG9jdW1lbnQqIEdldERvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9wRG9jdW1lbnQ7IH0KIAotcHJvdGVjdGVkOgotICAgIENQREZfRG9jdW1lbnQqCQltX3BEb2N1bWVudDsKKyBwcm90ZWN0ZWQ6CisgIENQREZfRG9jdW1lbnQqIG1fcERvY3VtZW50OwogfTsKLSNkZWZpbmUgUERGQk9PS01BUktfSVRBTElDCQkJMQotI2RlZmluZSBQREZCT09LTUFSS19CT0xECQkJMgotY2xhc3MgQ1BERl9Cb29rbWFyayAKLXsKLXB1YmxpYzoKKyNkZWZpbmUgUERGQk9PS01BUktfSVRBTElDIDEKKyNkZWZpbmUgUERGQk9PS01BUktfQk9MRCAyCitjbGFzcyBDUERGX0Jvb2ttYXJrIHsKKyBwdWJsaWM6CisgIENQREZfQm9va21hcmsoKSA6IG1fcERpY3QoTlVMTCkge30KIAotICAgIENQREZfQm9va21hcmsoKSA6IG1fcERpY3QoTlVMTCkge30KKyAgZXhwbGljaXQgQ1BERl9Cb29rbWFyayhDUERGX0RpY3Rpb25hcnkqIHBEaWN0KSA6IG1fcERpY3QocERpY3QpIHt9CiAKLSAgICBleHBsaWNpdCBDUERGX0Jvb2ttYXJrKENQREZfRGljdGlvbmFyeSogcERpY3QpIDogbV9wRGljdChwRGljdCkge30KKyAgQ1BERl9EaWN0aW9uYXJ5KiBHZXREaWN0KCkgY29uc3QgeyByZXR1cm4gbV9wRGljdDsgfQogCi0gICAgQ1BERl9EaWN0aW9uYXJ5KiBHZXREaWN0KCkgY29uc3QgeyByZXR1cm4gbV9wRGljdDsgfQorICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gbV9wRGljdCAhPSBOVUxMOyB9CiAKLSAgICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gbV9wRGljdCAhPSBOVUxMOyB9CisgIEZYX0RXT1JEIEdldENvbG9yUmVmKCkgY29uc3Q7CiAKLSAgICBGWF9EV09SRAkJCUdldENvbG9yUmVmKCkgY29uc3Q7CisgIEZYX0RXT1JEIEdldEZvbnRTdHlsZSgpIGNvbnN0OwogCi0gICAgRlhfRFdPUkQJCQlHZXRGb250U3R5bGUoKSBjb25zdDsKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0VGl0bGUoKSBjb25zdDsKIAotICAgIENGWF9XaWRlU3RyaW5nCQlHZXRUaXRsZSgpIGNvbnN0OworICBDUERGX0Rlc3QgR2V0RGVzdChDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQpIGNvbnN0OwogCi0gICAgQ1BERl9EZXN0CQkJR2V0RGVzdChDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQpIGNvbnN0OworICBDUERGX0FjdGlvbiBHZXRBY3Rpb24oKSBjb25zdDsKIAotICAgIENQREZfQWN0aW9uCQkJR2V0QWN0aW9uKCkgY29uc3Q7Ci0KLSAgICBDUERGX0RpY3Rpb25hcnkqCW1fcERpY3Q7CisgIENQREZfRGljdGlvbmFyeSogbV9wRGljdDsKIH07Ci0jZGVmaW5lIFBERlpPT01fWFlaCQkJCQkxCi0jZGVmaW5lIFBERlpPT01fRklUUEFHRQkJCQkyCi0jZGVmaW5lIFBERlpPT01fRklUSE9SWgkJCQkzCi0jZGVmaW5lIFBERlpPT01fRklUVkVSVAkJCQk0Ci0jZGVmaW5lIFBERlpPT01fRklUUkVDVAkJCQk1Ci0jZGVmaW5lIFBERlpPT01fRklUQkJPWAkJCQk2Ci0jZGVmaW5lIFBERlpPT01fRklUQkhPUloJCQk3Ci0jZGVmaW5lIFBERlpPT01fRklUQlZFUlQJCQk4Ci1jbGFzcyBDUERGX0Rlc3QgCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9EZXN0KCkgOiBtX3BPYmoobnVsbHB0cikgeyB9Ci0gICAgZXhwbGljaXQgQ1BERl9EZXN0KENQREZfT2JqZWN0KiBwT2JqKSA6IG1fcE9iaihwT2JqKSB7IH0KKyNkZWZpbmUgUERGWk9PTV9YWVogMQorI2RlZmluZSBQREZaT09NX0ZJVFBBR0UgMgorI2RlZmluZSBQREZaT09NX0ZJVEhPUlogMworI2RlZmluZSBQREZaT09NX0ZJVFZFUlQgNAorI2RlZmluZSBQREZaT09NX0ZJVFJFQ1QgNQorI2RlZmluZSBQREZaT09NX0ZJVEJCT1ggNgorI2RlZmluZSBQREZaT09NX0ZJVEJIT1JaIDcKKyNkZWZpbmUgUERGWk9PTV9GSVRCVkVSVCA4CitjbGFzcyBDUERGX0Rlc3QgeworIHB1YmxpYzoKKyAgQ1BERl9EZXN0KCkgOiBtX3BPYmoobnVsbHB0cikge30KKyAgZXhwbGljaXQgQ1BERl9EZXN0KENQREZfT2JqZWN0KiBwT2JqKSA6IG1fcE9iaihwT2JqKSB7fQogCi0gICAgb3BlcmF0b3IgYm9vbCAoKSBjb25zdCB7IHJldHVybiBtX3BPYmogIT0gTlVMTDsgfQotICAgIENQREZfT2JqZWN0KiBHZXRPYmplY3QoKSBjb25zdCB7IHJldHVybiBtX3BPYmo7IH0KKyAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIG1fcE9iaiAhPSBOVUxMOyB9CisgIENQREZfT2JqZWN0KiBHZXRPYmplY3QoKSBjb25zdCB7IHJldHVybiBtX3BPYmo7IH0KIAotICAgIENGWF9CeXRlU3RyaW5nCQlHZXRSZW1vdGVOYW1lKCk7Ci0gICAgaW50CQkJCQlHZXRQYWdlSW5kZXgoQ1BERl9Eb2N1bWVudCogcERvYyk7Ci0gICAgRlhfRFdPUkQJCQlHZXRQYWdlT2JqTnVtKCk7Ci0gICAgaW50CQkJCQlHZXRab29tTW9kZSgpOwotICAgIEZYX0ZMT0FUCQkJR2V0UGFyYW0oaW50IGluZGV4KTsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0UmVtb3RlTmFtZSgpOworICBpbnQgR2V0UGFnZUluZGV4KENQREZfRG9jdW1lbnQqIHBEb2MpOworICBGWF9EV09SRCBHZXRQYWdlT2JqTnVtKCk7CisgIGludCBHZXRab29tTW9kZSgpOworICBGWF9GTE9BVCBHZXRQYXJhbShpbnQgaW5kZXgpOwogCi1wcm90ZWN0ZWQ6Ci0gICAgQ1BERl9PYmplY3QqCQltX3BPYmo7CisgcHJvdGVjdGVkOgorICBDUERGX09iamVjdCogbV9wT2JqOwogfTsKLWNsYXNzIENQREZfT0NDb250ZXh0IDogcHVibGljIElQREZfT0NDb250ZXh0Ci17Ci1wdWJsaWM6CitjbGFzcyBDUERGX09DQ29udGV4dCA6IHB1YmxpYyBJUERGX09DQ29udGV4dCB7CisgcHVibGljOgorICBlbnVtIFVzYWdlVHlwZSB7IFZpZXcgPSAwLCBEZXNpZ24sIFByaW50LCBFeHBvcnQgfTsKIAotICAgIGVudW0gVXNhZ2VUeXBlIHsKLSAgICAgICAgVmlldyA9IDAsCi0gICAgICAgIERlc2lnbiwKLSAgICAgICAgUHJpbnQsCi0gICAgICAgIEV4cG9ydAotICAgIH07CisgIGV4cGxpY2l0IENQREZfT0NDb250ZXh0KENQREZfRG9jdW1lbnQqIHBEb2MsIFVzYWdlVHlwZSBlVXNhZ2VUeXBlID0gVmlldyk7CisgIH5DUERGX09DQ29udGV4dCgpIG92ZXJyaWRlOwogCi0gICAgQ1BERl9PQ0NvbnRleHQoQ1BERl9Eb2N1bWVudCAqcERvYywgVXNhZ2VUeXBlIGVVc2FnZVR5cGUgPSBWaWV3KTsKKyAgQ1BERl9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BEb2N1bWVudDsgfQogCi0gICAgdmlydHVhbCB+Q1BERl9PQ0NvbnRleHQoKTsKKyAgVXNhZ2VUeXBlIEdldFVzYWdlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fZVVzYWdlVHlwZTsgfQogCi0gICAgQ1BERl9Eb2N1bWVudCoJR2V0RG9jdW1lbnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcERvY3VtZW50OwotICAgIH0KKyAgRlhfQk9PTCBDaGVja09DR1Zpc2libGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwT0NHRGljdCkgb3ZlcnJpZGU7CiAKLSAgICBVc2FnZVR5cGUJCUdldFVzYWdlVHlwZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9lVXNhZ2VUeXBlOwotICAgIH0KKyAgdm9pZCBSZXNldE9DQ29udGV4dCgpOwogCi0gICAgRlhfQk9PTAkJCUNoZWNrT0NHVmlzaWJsZShjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ0dEaWN0KTsKKyBwcm90ZWN0ZWQ6CisgIEZYX0JPT0wgTG9hZE9DR1N0YXRlRnJvbUNvbmZpZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwT0NHRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJWYWxpZENvbmZpZykgY29uc3Q7CiAKLSAgICB2b2lkCQkJUmVzZXRPQ0NvbnRleHQoKTsKLXByb3RlY3RlZDoKKyAgRlhfQk9PTCBMb2FkT0NHU3RhdGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwT0NHRGljdCkgY29uc3Q7CiAKLSAgICBGWF9CT09MCQkJTG9hZE9DR1N0YXRlRnJvbUNvbmZpZyhGWF9CU1RSIGNzQ29uZmlnLCBjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ0dEaWN0LCBGWF9CT09MICZiVmFsaWRDb25maWcpIGNvbnN0OworICBGWF9CT09MIEdldE9DR1Zpc2libGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwT0NHRGljdCk7CiAKLSAgICBGWF9CT09MCQkJTG9hZE9DR1N0YXRlKGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DR0RpY3QpIGNvbnN0OworICBGWF9CT09MIEdldE9DR1ZFKENQREZfQXJyYXkqIHBFeHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZyb21Db25maWcsCisgICAgICAgICAgICAgICAgICAgaW50IG5MZXZlbCA9IDApOwogCi0gICAgRlhfQk9PTAkJCUdldE9DR1Zpc2libGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5ICpwT0NHRGljdCk7CisgIEZYX0JPT0wgTG9hZE9DTURTdGF0ZShjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBPQ01ERGljdCwgRlhfQk9PTCBiRnJvbUNvbmZpZyk7CiAKLSAgICBGWF9CT09MCQkJR2V0T0NHVkUoQ1BERl9BcnJheSAqcEV4cHJlc3Npb24sIEZYX0JPT0wgYkZyb21Db25maWcsIGludCBuTGV2ZWwgPSAwKTsKKyAgQ1BERl9Eb2N1bWVudCogbV9wRG9jdW1lbnQ7CiAKLSAgICBGWF9CT09MCQkJTG9hZE9DTURTdGF0ZShjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ01ERGljdCwgRlhfQk9PTCBiRnJvbUNvbmZpZyk7CisgIFVzYWdlVHlwZSBtX2VVc2FnZVR5cGU7CiAKLSAgICBDUERGX0RvY3VtZW50CQkqbV9wRG9jdW1lbnQ7Ci0KLSAgICBVc2FnZVR5cGUJCQltX2VVc2FnZVR5cGU7Ci0KLSAgICBDRlhfTWFwUHRyVGVtcGxhdGU8Y29uc3QgQ1BERl9EaWN0aW9uYXJ5Kiwgdm9pZCo+CW1fT0NHU3RhdGVzOwotfTsKLWNsYXNzIENQREZfTFdpblBhcmFtIAotewotcHVibGljOgotCi0gICAgQ1BERl9MV2luUGFyYW0oQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkKLSAgICB7Ci0gICAgICAgIG1fcERpY3QgPSBwRGljdDsKLSAgICB9Ci0KLSAgICBvcGVyYXRvciBDUERGX0RpY3Rpb25hcnkqICgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRGljdDsKLSAgICB9Ci0KLSAgICBpbmxpbmUgQ0ZYX0J5dGVTdHJpbmcJR2V0RmlsZU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcERpY3QtPkdldFN0cmluZygiRiIpOwotICAgIH0KLQotCi0gICAgaW5saW5lIENGWF9CeXRlU3RyaW5nCUdldERlZmF1bHREaXJlY3RvcnkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcERpY3QtPkdldFN0cmluZygiRCIpOwotICAgIH0KLQotCi0gICAgaW5saW5lIENGWF9CeXRlU3RyaW5nCUdldE9wZXJhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wRGljdC0+R2V0U3RyaW5nKCJPIik7Ci0gICAgfQotCi0KLSAgICBpbmxpbmUgQ0ZYX0J5dGVTdHJpbmcJR2V0UGFyYW1ldGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEaWN0LT5HZXRTdHJpbmcoIlAiKTsKLSAgICB9Ci0KLSAgICBDUERGX0RpY3Rpb25hcnkqCQltX3BEaWN0OwotfTsKLWNsYXNzIENQREZfQWN0aW9uRmllbGRzIAotewotcHVibGljOgotCi0gICAgQ1BERl9BY3Rpb25GaWVsZHMoY29uc3QgQ1BERl9BY3Rpb24qIHBBY3Rpb24pCi0gICAgewotICAgICAgICBtX3BBY3Rpb24gPSAoQ1BERl9BY3Rpb24qKXBBY3Rpb247Ci0gICAgfQotCi0gICAgb3BlcmF0b3IgQ1BERl9BY3Rpb24qKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BBY3Rpb247Ci0gICAgfQotCi0gICAgRlhfRFdPUkQJCQkJR2V0RmllbGRzQ291bnQoKSBjb25zdDsKLQotICAgIHZvaWQJCQkJCUdldEFsbEZpZWxkcyhDRlhfUHRyQXJyYXkmIGZpZWxkT2JqZWN0cykgY29uc3Q7Ci0KLSAgICBDUERGX09iamVjdCoJCQlHZXRGaWVsZChGWF9EV09SRCBpSW5kZXgpIGNvbnN0OwotCi0gICAgQ1BERl9BY3Rpb24qCQkJbV9wQWN0aW9uOworICBzdGQ6Om1hcDxjb25zdCBDUERGX0RpY3Rpb25hcnkqLCBGWF9CT09MPiBtX09DR1N0YXRlczsKIH07CiAKLSNkZWZpbmUgUERGTkFNRURfTkVYVFBBR0UJCTEKLSNkZWZpbmUgUERGTkFNRURfUFJFVlBBR0UJCTIKLSNkZWZpbmUgUERGTkFNRURfRklSU1RQQUdFCQkzCi0jZGVmaW5lIFBERk5BTUVEX0xBU1RQQUdFCQk0Ci0jZGVmaW5lIFBERkpTX01BWExFTkdUSAkJCTY0Ci1jbGFzcyBDUERGX0FjdGlvbiAKLXsKLXB1YmxpYzoKLSAgICBlbnVtIEFjdGlvblR5cGUgewotICAgICAgICBVbmtub3duID0gMCwKLSAgICAgICAgR29UbywKLSAgICAgICAgR29Ub1IsCi0gICAgICAgIEdvVG9FLAotICAgICAgICBMYXVuY2gsCi0gICAgICAgIFRocmVhZCwKLSAgICAgICAgVVJJLAotICAgICAgICBTb3VuZCwKLSAgICAgICAgTW92aWUsCi0gICAgICAgIEhpZGUsCi0gICAgICAgIE5hbWVkLAotICAgICAgICBTdWJtaXRGb3JtLAotICAgICAgICBSZXNldEZvcm0sCi0gICAgICAgIEltcG9ydERhdGEsCi0gICAgICAgIEphdmFTY3JpcHQsCi0gICAgICAgIFNldE9DR1N0YXRlLAotICAgICAgICBSZW5kaXRpb24sCi0gICAgICAgIFRyYW5zLAotICAgICAgICBHb1RvM0RWaWV3Ci0gICAgfTsKK2NsYXNzIENQREZfQWN0aW9uRmllbGRzIHsKKyBwdWJsaWM6CisgIC8vIFRPRE8odGhlc3RpZyk6IEV4YW1pbmUgd2h5IHRoaXMgY2Fubm90IGJlIGV4cGxpY2l0LgorICBDUERGX0FjdGlvbkZpZWxkcyhjb25zdCBDUERGX0FjdGlvbiogcEFjdGlvbikgeworICAgIG1fcEFjdGlvbiA9IChDUERGX0FjdGlvbiopcEFjdGlvbjsKKyAgfQogCi0gICAgQ1BERl9BY3Rpb24oKSA6IG1fcERpY3QobnVsbHB0cikgeyB9Ci0gICAgZXhwbGljaXQgQ1BERl9BY3Rpb24oQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgOiBtX3BEaWN0KHBEaWN0KSB7IH0KKyAgLy8gVE9ETyh0aGVzdGlnKTogUmVwbGFjZSB0aGlzLgorICBvcGVyYXRvciBDUERGX0FjdGlvbiooKSBjb25zdCB7IHJldHVybiBtX3BBY3Rpb247IH0KIAotICAgIG9wZXJhdG9yIGJvb2wgKCkgY29uc3QgeyByZXR1cm4gbV9wRGljdCAhPSBOVUxMOyB9CisgIEZYX0RXT1JEIEdldEZpZWxkc0NvdW50KCkgY29uc3Q7CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqIEdldERpY3QoKSBjb25zdCB7IHJldHVybiBtX3BEaWN0OyB9CisgIHN0ZDo6dmVjdG9yPENQREZfT2JqZWN0Kj4gR2V0QWxsRmllbGRzKCkgY29uc3Q7CiAKLSAgICBDRlhfQnl0ZVN0cmluZwkJR2V0VHlwZU5hbWUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcERpY3QtPkdldFN0cmluZygiUyIpOwotICAgIH0KKyAgQ1BERl9PYmplY3QqIEdldEZpZWxkKEZYX0RXT1JEIGlJbmRleCkgY29uc3Q7CiAKLSAgICBBY3Rpb25UeXBlCQkJR2V0VHlwZSgpIGNvbnN0OwotCi0KLQotICAgIENQREZfRGVzdAkJCUdldERlc3QoQ1BERl9Eb2N1bWVudCogcERvYykgY29uc3Q7Ci0KLQotCi0KLQotICAgIENGWF9XaWRlU3RyaW5nCQlHZXRGaWxlUGF0aCgpIGNvbnN0OwotCi0KLQotCi0gICAgRlhfQk9PTAkJCQlHZXROZXdXaW5kb3coKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcERpY3QtPkdldEJvb2xlYW4oIk5ld1dpbmRvdyIpOwotICAgIH0KLQotCi0KLQotICAgIENQREZfTFdpblBhcmFtCQlHZXRXaW5QYXJhbSgpIGNvbnN0OwotCi0KLQotCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCUdldFVSSShDUERGX0RvY3VtZW50KiBwRG9jKSBjb25zdDsKLQotCi0KLQotICAgIEZYX0JPT0wJCQkJR2V0TW91c2VNYXAoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcERpY3QtPkdldEJvb2xlYW4oIklzTWFwIik7Ci0gICAgfQotCi0KLQotCi0gICAgQ1BERl9BY3Rpb25GaWVsZHMJR2V0V2lkZ2V0cygpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLQotCi0KLSAgICBGWF9CT09MCQkJCUdldEhpZGVTdGF0dXMoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcERpY3QtPkdldEJvb2xlYW4oIkgiLCBUUlVFKTsKLSAgICB9Ci0KLQotCi0KLSAgICBDRlhfQnl0ZVN0cmluZwkJR2V0TmFtZWRBY3Rpb24oKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcERpY3QtPkdldFN0cmluZygiTiIpOwotICAgIH0KLQotCi0KLQotICAgIEZYX0RXT1JECQkJR2V0RmxhZ3MoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcERpY3QtPkdldEludGVnZXIoIkZsYWdzIik7Ci0gICAgfQotCi0KLQotCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCUdldEphdmFTY3JpcHQoKSBjb25zdDsKLQotCi0KLQotICAgIENQREZfRGljdGlvbmFyeSoJR2V0QW5ub3QoKSBjb25zdDsKLQotCi0KLQotICAgIEZYX0lOVDMyCQkJR2V0T3BlcmF0aW9uVHlwZSgpIGNvbnN0OwotCi0KLQotCi0gICAgQ1BERl9TdHJlYW0qCQlHZXRTb3VuZFN0cmVhbSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRGljdC0+R2V0U3RyZWFtKCJTb3VuZCIpOwotICAgIH0KLQotICAgIEZYX0ZMT0FUCQkJR2V0Vm9sdW1lKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEaWN0LT5HZXROdW1iZXIoIlZvbHVtZSIpOwotICAgIH0KLQotICAgIEZYX0JPT0wJCQkJSXNTeW5jaHJvbm91cygpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRGljdC0+R2V0Qm9vbGVhbigiU3luY2hyb25vdXMiKTsKLSAgICB9Ci0KLSAgICBGWF9CT09MCQkJCUlzUmVwZWF0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEaWN0LT5HZXRCb29sZWFuKCJSZXBlYXQiKTsKLSAgICB9Ci0KLSAgICBGWF9CT09MCQkJCUlzTWl4UGxheSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRGljdC0+R2V0Qm9vbGVhbigiTWl4Iik7Ci0gICAgfQotCi0KLQotCi0gICAgRlhfRFdPUkQJCQlHZXRTdWJBY3Rpb25zQ291bnQoKSBjb25zdDsKLQotICAgIENQREZfQWN0aW9uCQkJR2V0U3ViQWN0aW9uKEZYX0RXT1JEIGlJbmRleCkgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgICBDUERGX0RpY3Rpb25hcnkqCW1fcERpY3Q7Ci19OwotY2xhc3MgQ1BERl9BQWN0aW9uIAotewotcHVibGljOgotCi0gICAgQ1BERl9BQWN0aW9uKENQREZfRGljdGlvbmFyeSogcERpY3QgPSBOVUxMKQotICAgIHsKLSAgICAgICAgbV9wRGljdCA9IHBEaWN0OwotICAgIH0KLQotICAgIG9wZXJhdG9yIENQREZfRGljdGlvbmFyeSooKQljb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcERpY3Q7Ci0gICAgfQotCi0gICAgZW51bSBBQWN0aW9uVHlwZSB7Ci0gICAgICAgIEN1cnNvckVudGVyID0gMCwKLSAgICAgICAgQ3Vyc29yRXhpdCwKLSAgICAgICAgQnV0dG9uRG93biwKLSAgICAgICAgQnV0dG9uVXAsCi0gICAgICAgIEdldEZvY3VzLAotICAgICAgICBMb3NlRm9jdXMsCi0gICAgICAgIFBhZ2VPcGVuLAotICAgICAgICBQYWdlQ2xvc2UsCi0gICAgICAgIFBhZ2VWaXNpYmxlLAotICAgICAgICBQYWdlSW52aXNpYmxlLAotICAgICAgICBPcGVuUGFnZSwKLSAgICAgICAgQ2xvc2VQYWdlLAotICAgICAgICBLZXlTdHJva2UsCi0gICAgICAgIEZvcm1hdCwKLSAgICAgICAgVmFsaWRhdGUsCi0gICAgICAgIENhbGN1bGF0ZSwKLSAgICAgICAgQ2xvc2VEb2N1bWVudCwKLSAgICAgICAgU2F2ZURvY3VtZW50LAotICAgICAgICBEb2N1bWVudFNhdmVkLAotICAgICAgICBQcmludERvY3VtZW50LAotICAgICAgICBEb2N1bWVudFByaW50ZWQKLSAgICB9OwotCi0gICAgRlhfQk9PTAkJCQlBY3Rpb25FeGlzdChBQWN0aW9uVHlwZSBlVHlwZSkgY29uc3Q7Ci0KLSAgICBDUERGX0FjdGlvbgkJCUdldEFjdGlvbihBQWN0aW9uVHlwZSBlVHlwZSkgY29uc3Q7Ci0KLSAgICBGWF9QT1NJVElPTgkJCUdldFN0YXJ0UG9zKCkgY29uc3Q7Ci0KLSAgICBDUERGX0FjdGlvbgkJCUdldE5leHRBY3Rpb24oRlhfUE9TSVRJT04mIHBvcywgQUFjdGlvblR5cGUmIGVUeXBlKSBjb25zdDsKLQotICAgIENQREZfRGljdGlvbmFyeSoJbV9wRGljdDsKLX07Ci1jbGFzcyBDUERGX0RvY0pTQWN0aW9ucyAKLXsKLXB1YmxpYzoKLSAgICBDUERGX0RvY0pTQWN0aW9ucyhDUERGX0RvY3VtZW50KiBwRG9jKTsKLQotCi0gICAgaW50CQkJCQlDb3VudEpTQWN0aW9ucygpIGNvbnN0OwotCi0gICAgQ1BERl9BY3Rpb24JCQlHZXRKU0FjdGlvbihpbnQgaW5kZXgsIENGWF9CeXRlU3RyaW5nJiBjc05hbWUpIGNvbnN0OwotCi0gICAgQ1BERl9BY3Rpb24JCQlHZXRKU0FjdGlvbihjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lKSBjb25zdDsKLQotICAgIGludAkJCQkJRmluZEpTQWN0aW9uKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc05hbWUpIGNvbnN0OwotCi0KLSAgICBDUERGX0RvY3VtZW50KgkJR2V0RG9jdW1lbnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcERvY3VtZW50OwotICAgIH0KLQotcHJvdGVjdGVkOgotCi0gICAgQ1BERl9Eb2N1bWVudCoJCW1fcERvY3VtZW50OwotfTsKLWNsYXNzIENQREZfRmlsZVNwZWMgCi17Ci1wdWJsaWM6Ci0KLSAgICBDUERGX0ZpbGVTcGVjKCk7Ci0KLSAgICBDUERGX0ZpbGVTcGVjKENQREZfT2JqZWN0ICpwT2JqKQotICAgIHsKLSAgICAgICAgbV9wT2JqID0gcE9iajsKLSAgICB9Ci0KLSAgICBvcGVyYXRvciBDUERGX09iamVjdCooKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcE9iajsKLSAgICB9Ci0KLSAgICBGWF9CT09MCQkJSXNVUkwoKSBjb25zdDsKLQotICAgIEZYX0JPT0wJCQlHZXRGaWxlTmFtZShDRlhfV2lkZVN0cmluZyAmd3NGaWxlTmFtZSkgY29uc3Q7Ci0KLSAgICBDUERGX1N0cmVhbSoJR2V0RmlsZVN0cmVhbSgpIGNvbnN0OwotCi0gICAgdm9pZAkJCVNldEZpbGVOYW1lKEZYX1dTVFIgd3NGaWxlTmFtZSwgRlhfQk9PTCBiVVJMID0gRkFMU0UpOwotcHJvdGVjdGVkOgotCi0gICAgQ1BERl9PYmplY3QJCSptX3BPYmo7Ci19OwotY2xhc3MgQ1BERl9MaW5rTGlzdCAKLXsKLXB1YmxpYzoKLQotICAgIENQREZfTGlua0xpc3QoQ1BERl9Eb2N1bWVudCogcERvYykKLSAgICB7Ci0gICAgICAgIG1fcERvY3VtZW50ID0gcERvYzsKLSAgICB9Ci0KLSAgICB+Q1BERl9MaW5rTGlzdCgpOwotCi0gICAgQ1BERl9MaW5rCQkJR2V0TGlua0F0UG9pbnQoQ1BERl9QYWdlKiBwUGFnZSwgRlhfRkxPQVQgcGRmX3gsIEZYX0ZMT0FUIHBkZl95KTsKLQotICAgIGludAkJCQkJQ291bnRMaW5rcyhDUERGX1BhZ2UqIHBQYWdlKTsKLQotICAgIENQREZfTGluawkJCUdldExpbmsoQ1BERl9QYWdlKiBwUGFnZSwgaW50IGluZGV4KTsKLQotICAgIENQREZfRG9jdW1lbnQqCQlHZXREb2N1bWVudCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRG9jdW1lbnQ7Ci0gICAgfQotcHJvdGVjdGVkOgotCi0gICAgQ1BERl9Eb2N1bWVudCoJCW1fcERvY3VtZW50OwotCi0gICAgQ0ZYX01hcFB0clRvUHRyCQltX1BhZ2VNYXA7Ci0KLSAgICBDRlhfUHRyQXJyYXkqCQlHZXRQYWdlTGlua3MoQ1BERl9QYWdlKiBwUGFnZSk7Ci0KLSAgICB2b2lkCQkJCUxvYWRQYWdlTGlua3MoQ1BERl9QYWdlKiBwUGFnZSwgQ0ZYX1B0ckFycmF5KiBwTGlzdCk7Ci19OwotY2xhc3MgQ1BERl9MaW5rIAotewotcHVibGljOgotICAgIENQREZfTGluaygpIDogbV9wRGljdChudWxscHRyKSB7IH0KLSAgICBleHBsaWNpdCBDUERGX0xpbmsoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgOiBtX3BEaWN0KHBEaWN0KSB7IH0KLQotICAgIENQREZfRGljdGlvbmFyeSogR2V0RGljdCgpIGNvbnN0IHsgcmV0dXJuIG1fcERpY3Q7IH0KLQotICAgIENGWF9GbG9hdFJlY3QJCUdldFJlY3QoKTsKLSAgICBDUERGX0Rlc3QJCQlHZXREZXN0KENQREZfRG9jdW1lbnQqIHBEb2MpOwotICAgIENQREZfQWN0aW9uCQkJR2V0QWN0aW9uKCk7Ci0KLXByb3RlY3RlZDoKLSAgICBDUERGX0RpY3Rpb25hcnkqCW1fcERpY3Q7Ci19OwotI2RlZmluZSBBTk5PVEZMQUdfSU5WSVNJQkxFCQkJMQotI2RlZmluZSBBTk5PVEZMQUdfSElEREVOCQkJMgotI2RlZmluZSBBTk5PVEZMQUdfUFJJTlQJCQkJNAotI2RlZmluZSBBTk5PVEZMQUdfTk9aT09NCQkJOAotI2RlZmluZSBBTk5PVEZMQUdfTk9ST1RBVEUJCQkweDEwCi0jZGVmaW5lIEFOTk9URkxBR19OT1ZJRVcJCQkweDIwCi0jZGVmaW5lIEFOTk9URkxBR19SRUFET05MWQkJCTB4NDAKLSNkZWZpbmUgQU5OT1RGTEFHX0xPQ0tFRAkJCTB4ODAKLSNkZWZpbmUgQU5OT1RGTEFHX1RPR0dMRU5PVklFVwkJMHgxMDAKLWNsYXNzIENQREZfQW5ub3QgOiBwdWJsaWMgQ0ZYX1ByaXZhdGVEYXRhCi17Ci1wdWJsaWM6Ci0KLSAgICBDUERGX0Fubm90KENQREZfRGljdGlvbmFyeSogcERpY3QpOwotCi0gICAgfkNQREZfQW5ub3QoKTsKLQotICAgIENQREZfRGljdGlvbmFyeSoJbV9wQW5ub3REaWN0OwotCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCUdldFN1YlR5cGUoKSBjb25zdDsKLQotICAgIEZYX0RXT1JECQkJR2V0RmxhZ3MoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEFubm90RGljdC0+R2V0SW50ZWdlcigiRiIpOwotICAgIH0KLQotICAgIHZvaWQJCQkJR2V0UmVjdChDRlhfRmxvYXRSZWN0JiByZWN0KSBjb25zdDsKLQotICAgIGVudW0gQXBwZWFyYW5jZU1vZGUJewotICAgICAgICBOb3JtYWwsCi0gICAgICAgIFJvbGxvdmVyLAotICAgICAgICBEb3duCi0gICAgfTsKLQotICAgIEZYX0JPT0wJCQkJRHJhd0FwcGVhcmFuY2UoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFVzZXIyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwZWFyYW5jZU1vZGUgbW9kZSwgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyk7Ci0KLSAgICBGWF9CT09MCQkJCURyYXdJbkNvbnRleHQoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgY29uc3QgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFVzZXIyRGV2aWNlLCBBcHBlYXJhbmNlTW9kZSBtb2RlKTsKLQotICAgIHZvaWQJCQkJQ2xlYXJDYWNoZWRBUCgpOwotCi0KLSAgICB2b2lkCQkJCURyYXdCb3JkZXIoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFVzZXIyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKTsKLQotICAgIENQREZfUGFnZU9iamVjdCoJR2V0Qm9yZGVyKEZYX0JPT0wgYlByaW50LCBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKTsKLQotCi0KLSAgICBpbnQJCQkJCUNvdW50SVJUTm90ZXMoKTsKLQotICAgIENQREZfQW5ub3QqCQkJR2V0SVJUTm90ZShpbnQgaW5kZXgpOwotCi0KLSAgICBDUERGX0Zvcm0qCQkJR2V0QVBGb3JtKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsIEFwcGVhcmFuY2VNb2RlIG1vZGUpOwotcHJpdmF0ZToKLQotICAgIENGWF9NYXBQdHJUb1B0cgkJbV9BUE1hcDsKLXByb3RlY3RlZDoKLSAgICBmcmllbmQgY2xhc3MJCUNQREZfQW5ub3RMaXN0OwotCi0gICAgQ1BERl9Bbm5vdExpc3QqCQltX3BMaXN0OwotCi0gICAgQ1BERl9SZWZlcmVuY2UqCQlOZXdBbm5vdFJlZigpOwotfTsKLWNsYXNzIENQREZfQW5ub3RMaXN0IAotewotcHVibGljOgotCi0gICAgQ1BERl9Bbm5vdExpc3QoQ1BERl9QYWdlKiBwUGFnZSk7Ci0KLSAgICB+Q1BERl9Bbm5vdExpc3QoKTsKLQotICAgIHZvaWQJR2V0QW5ub3RNYXRyaXgoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0LCBjb25zdCBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsIENGWF9NYXRyaXggJm1hdHJpeCkgY29uc3Q7Ci0KLSAgICB2b2lkCUdldEFubm90UmVjdChjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QsIGNvbnN0IENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwgQ1BERl9SZWN0ICZydEFubm90KSBjb25zdDsKLQotICAgIHZvaWQJCQkJRGlzcGxheUFubm90cyhjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9CT09MIGJTaG93V2lkZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKTsKLQotICAgIHZvaWQJCQkJRGlzcGxheUFubm90cyhjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcmludGluZywgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfQk9PTCBiU2hvd1dpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykKLSAgICB7Ci0gICAgICAgIERpc3BsYXlBbm5vdHMocFBhZ2UsIE5VTEwsIHBDb250ZXh0LCBiUHJpbnRpbmcsIHBNYXRyaXgsIGJTaG93V2lkZ2V0ID8gMyA6IDEsIHBPcHRpb25zLCBOVUxMKTsKLSAgICB9Ci0KLSAgICB2b2lkCQkJCURpc3BsYXlBbm5vdHMoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJpbnRpbmcsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0JPT0wgYlNob3dXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsIEZYX1JFQ1QgKnBDbGlwUmVjdCkKLSAgICB7Ci0gICAgICAgIERpc3BsYXlBbm5vdHMocFBhZ2UsIE5VTEwsIHBDb250ZXh0LCBiUHJpbnRpbmcsIHBNYXRyaXgsIGJTaG93V2lkZ2V0ID8gMyA6IDEsIHBPcHRpb25zLCBwQ2xpcFJlY3QpOwotICAgIH0KLQotICAgIHZvaWQJCQkJRGlzcGxheUFubm90cyhjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcmludGluZywgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgZHdBbm5vdEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLCBGWF9SRUNUKiBwQ2xpcFJlY3QpOwotCi0KLQotICAgIENQREZfQW5ub3QqCQkJR2V0QXQoaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgcmV0dXJuIChDUERGX0Fubm90KiltX0Fubm90TGlzdC5HZXRBdChpbmRleCk7Ci0gICAgfQotCi0gICAgaW50CQkJCQlDb3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9Bbm5vdExpc3QuR2V0U2l6ZSgpOwotICAgIH0KLQotICAgIGludAkJCQkJR2V0SW5kZXgoQ1BERl9Bbm5vdCogcEFubm90KTsKLQotCi0gICAgQ1BERl9Eb2N1bWVudCoJCUdldERvY3VtZW50KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEb2N1bWVudDsKLSAgICB9Ci1wcm90ZWN0ZWQ6Ci0KLSAgICBDRlhfUHRyQXJyYXkJCW1fQW5ub3RMaXN0OwotCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgltX3BQYWdlRGljdDsKLQotICAgIENQREZfRG9jdW1lbnQqCQltX3BEb2N1bWVudDsKLQotICAgIENGWF9QdHJBcnJheQkJbV9Cb3JkZXJzOwotCi0gICAgdm9pZAkJCQlEaXNwbGF5UGFzcyhjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgRlhfQk9PTCBiUHJpbnRpbmcsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJXaWRnZXQsIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsIEZYX1JFQ1QqIGNsaXBfcmVjdCk7Ci0gICAgZnJpZW5kIGNsYXNzCQlDUERGX0Fubm90OwotfTsKLSNkZWZpbmUgQ09MT1JUWVBFX1RSQU5TUEFSRU5UCTAKLSNkZWZpbmUgQ09MT1JUWVBFX0dSQVkJCQkxCi0jZGVmaW5lIENPTE9SVFlQRV9SR0IJCQkyCi0jZGVmaW5lIENPTE9SVFlQRV9DTVlLCQkJMwotY2xhc3MgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSAKLXsKLXB1YmxpYzoKLQotICAgIENQREZfRGVmYXVsdEFwcGVhcmFuY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzREEgPSAiIikKLSAgICB7Ci0gICAgICAgIG1fY3NEQSA9IGNzREE7Ci0gICAgfQotCi0gICAgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZShjb25zdCBDUERGX0RlZmF1bHRBcHBlYXJhbmNlJiBjREEpCi0gICAgewotICAgICAgICBtX2NzREEgPSAoQ0ZYX0J5dGVTdHJpbmcpKENQREZfRGVmYXVsdEFwcGVhcmFuY2UmKWNEQTsKLSAgICB9Ci0KLQotICAgIG9wZXJhdG9yIENGWF9CeXRlU3RyaW5nKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2NzREE7Ci0gICAgfQotCi0gICAgY29uc3QgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSYgb3BlcmF0b3IgPShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NEQSkKLSAgICB7Ci0gICAgICAgIG1fY3NEQSA9IGNzREE7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgICBjb25zdCBDUERGX0RlZmF1bHRBcHBlYXJhbmNlJiBvcGVyYXRvciA9KGNvbnN0IENQREZfRGVmYXVsdEFwcGVhcmFuY2UmIGNEQSkKLSAgICB7Ci0gICAgICAgIG1fY3NEQSA9IChDRlhfQnl0ZVN0cmluZykoQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSYpY0RBOwotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0KLQotICAgIEZYX0JPT0wJCQkJSGFzRm9udCgpOwotCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCUdldEZvbnRTdHJpbmcoKTsKLQotICAgIHZvaWQJCQkJR2V0Rm9udChDRlhfQnl0ZVN0cmluZyYgY3NGb250TmFtZVRhZywgRlhfRkxPQVQmIGZGb250U2l6ZSk7Ci0KLQotCi0KLSAgICBGWF9CT09MCQkJCUhhc0NvbG9yKEZYX0JPT0wgYlN0cm9raW5nT3BlcmF0aW9uID0gRkFMU0UpOwotCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCUdldENvbG9yU3RyaW5nKEZYX0JPT0wgYlN0cm9raW5nT3BlcmF0aW9uID0gRkFMU0UpOwotCi0gICAgdm9pZAkJCQlHZXRDb2xvcihpbnQmIGlDb2xvclR5cGUsIEZYX0ZMT0FUIGZjWzRdLCBGWF9CT09MIGJTdHJva2luZ09wZXJhdGlvbiA9IEZBTFNFKTsKLQotICAgIHZvaWQJCQkJR2V0Q29sb3IoRlhfQVJHQiYgY29sb3IsIGludCYgaUNvbG9yVHlwZSwgRlhfQk9PTCBiU3Ryb2tpbmdPcGVyYXRpb24gPSBGQUxTRSk7Ci0KLQotCi0KLSAgICBGWF9CT09MCQkJCUhhc1RleHRNYXRyaXgoKTsKLQotICAgIENGWF9CeXRlU3RyaW5nCQlHZXRUZXh0TWF0cml4U3RyaW5nKCk7Ci0KLSAgICBDRlhfQWZmaW5lTWF0cml4CUdldFRleHRNYXRyaXgoKTsKLQotcHJvdGVjdGVkOgotCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCW1fY3NEQTsKLX07Ci0jZGVmaW5lIEZJRUxEVFlQRV9VTktOT1dOCQkJMAotI2RlZmluZSBGSUVMRFRZUEVfUFVTSEJVVFRPTgkJMQotI2RlZmluZSBGSUVMRFRZUEVfQ0hFQ0tCT1gJCQkyCi0jZGVmaW5lIEZJRUxEVFlQRV9SQURJT0JVVFRPTgkJMwotI2RlZmluZSBGSUVMRFRZUEVfQ09NQk9CT1gJCQk0Ci0jZGVmaW5lIEZJRUxEVFlQRV9MSVNUQk9YCQkJNQotI2RlZmluZSBGSUVMRFRZUEVfVEVYVEZJRUxECQkJNgotI2RlZmluZSBGSUVMRFRZUEVfU0lHTkFUVVJFCQkJNwotY2xhc3MgQ1BERl9JbnRlckZvcm0gOiBwdWJsaWMgQ0ZYX1ByaXZhdGVEYXRhCi17Ci1wdWJsaWM6Ci0KLSAgICBDUERGX0ludGVyRm9ybShDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIEZYX0JPT0wgYlVwZGF0ZUFQKTsKLQotICAgIH5DUERGX0ludGVyRm9ybSgpOwotCi0KLQotICAgIHN0YXRpYyB2b2lkCQkJCUVuYWJsZVVwZGF0ZUFQKEZYX0JPT0wgYlVwZGF0ZUFQKTsKLQotICAgIHN0YXRpYyBGWF9CT09MCQkJVXBkYXRpbmdBUEVuYWJsZWQoKTsKLQotCi0gICAgc3RhdGljIENGWF9CeXRlU3RyaW5nCUdlbmVyYXRlTmV3UmVzb3VyY2VOYW1lKGNvbnN0IENQREZfRGljdGlvbmFyeSogcFJlc0RpY3QsIEZYX0xQQ1NUUiBjc1R5cGUsIGludCBpTWluTGVuID0gMiwgRlhfTFBDU1RSIGNzUHJlZml4ID0gIiIpOwotCi0KLQotICAgIHN0YXRpYyBDUERGX0ZvbnQqCQlBZGRTeXN0ZW1EZWZhdWx0Rm9udChjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCi0gICAgc3RhdGljIENQREZfRm9udCoJCUFkZFN5c3RlbUZvbnQoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lLCBGWF9CWVRFIGlDaGFyU2V0ID0gMSk7Ci0KLSAgICBzdGF0aWMgQ1BERl9Gb250KgkJQWRkU3lzdGVtRm9udChjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9XaWRlU3RyaW5nIGNzRm9udE5hbWUsIEZYX0JZVEUgaUNoYXJTZXQgPSAxKTsKLQotICAgIHN0YXRpYyBDUERGX0ZvbnQqCQlBZGRTdGFuZGFyZEZvbnQoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lKTsKLQotICAgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZwlHZXROYXRpdmVGb250KEZYX0JZVEUgaUNoYXJTZXQsIEZYX0xQVk9JRCBwTG9nRm9udCA9IE5VTEwpOwotCi0gICAgc3RhdGljIENGWF9CeXRlU3RyaW5nCUdldE5hdGl2ZUZvbnQoRlhfTFBWT0lEIHBMb2dGb250ID0gTlVMTCk7Ci0KLSAgICBzdGF0aWMgRlhfQllURQkJCUdldE5hdGl2ZUNoYXJTZXQoKTsKLQotICAgIHN0YXRpYyBDUERGX0ZvbnQqCQlBZGROYXRpdmVGb250KEZYX0JZVEUgaUNoYXJTZXQsIGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0KLSAgICBzdGF0aWMgQ1BERl9Gb250KgkJQWRkTmF0aXZlRm9udChjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCi0KLQotCi0gICAgRlhfQk9PTAkJCQkJVmFsaWRhdGVGaWVsZE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lLCBpbnQgaVR5cGUpOwotCi0gICAgRlhfQk9PTAkJCQkJVmFsaWRhdGVGaWVsZE5hbWUoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lKTsKLQotICAgIEZYX0JPT0wJCQkJCVZhbGlkYXRlRmllbGROYW1lKGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sLCBDRlhfV2lkZVN0cmluZyYgY3NOZXdGaWVsZE5hbWUpOwotCi0KLQotCi0gICAgRlhfRFdPUkQJCQkJQ291bnRGaWVsZHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJmNzRmllbGROYW1lID0gTCIiKTsKLQotICAgIENQREZfRm9ybUZpZWxkKgkJCUdldEZpZWxkKEZYX0RXT1JEIGluZGV4LCBjb25zdCBDRlhfV2lkZVN0cmluZyAmY3NGaWVsZE5hbWUgPSBMIiIpOwotCi0gICAgdm9pZAkJCQkJR2V0QWxsRmllbGROYW1lcyhDRlhfV2lkZVN0cmluZ0FycmF5JiBhbGxGaWVsZE5hbWVzKTsKLQotICAgIEZYX0JPT0wJCQkJCUlzVmFsaWRGb3JtRmllbGQoY29uc3Qgdm9pZCogcEZpZWxkKTsKLQotICAgIENQREZfRm9ybUZpZWxkKgkJCUdldEZpZWxkQnlEaWN0KENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCkgY29uc3Q7Ci0KLQotCi0KLSAgICBGWF9EV09SRAkJCQlDb3VudENvbnRyb2xzKENGWF9XaWRlU3RyaW5nIGNzRmllbGROYW1lID0gTCIiKTsKLQotICAgIENQREZfRm9ybUNvbnRyb2wqCQlHZXRDb250cm9sKEZYX0RXT1JEIGluZGV4LCBDRlhfV2lkZVN0cmluZyBjc0ZpZWxkTmFtZSA9IEwiIik7Ci0KLSAgICBGWF9CT09MCQkJCQlJc1ZhbGlkRm9ybUNvbnRyb2woY29uc3Qgdm9pZCogcENvbnRyb2wpOwotCi0gICAgaW50CQkJCQkJQ291bnRQYWdlQ29udHJvbHMoQ1BERl9QYWdlKiBwUGFnZSkgY29uc3Q7Ci0KLSAgICBDUERGX0Zvcm1Db250cm9sKgkJR2V0UGFnZUNvbnRyb2woQ1BERl9QYWdlKiBwUGFnZSwgaW50IGluZGV4KSBjb25zdDsKLQotCi0gICAgQ1BERl9Gb3JtQ29udHJvbCoJCUdldENvbnRyb2xBdFBvaW50KENQREZfUGFnZSogcFBhZ2UsIEZYX0ZMT0FUIHBkZl94LCBGWF9GTE9BVCBwZGZfeSkgY29uc3Q7Ci0KLSAgICBDUERGX0Zvcm1Db250cm9sKgkJR2V0Q29udHJvbEJ5RGljdChDUERGX0RpY3Rpb25hcnkqIHBXaWRnZXREaWN0KSBjb25zdDsKLQotCi0KLQotICAgIEZYX0RXT1JECQkJCUNvdW50SW50ZXJuYWxGaWVsZHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lID0gTCIiKSBjb25zdDsKLQotICAgIENQREZfRGljdGlvbmFyeSoJCUdldEludGVybmFsRmllbGQoRlhfRFdPUkQgaW5kZXgsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSA9IEwiIikgY29uc3Q7Ci0KLQotCi0KLQotICAgIENQREZfRG9jdW1lbnQqCQkJR2V0RG9jdW1lbnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcERvY3VtZW50OwotICAgIH0KLQotICAgIENQREZfRGljdGlvbmFyeSoJCUdldEZvcm1EaWN0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BGb3JtRGljdDsKLSAgICB9Ci0KLQotCi0KLSAgICBGWF9CT09MCQkJCQlOZWVkQ29uc3RydWN0QVAoKTsKLQotICAgIHZvaWQJCQkJCU5lZWRDb25zdHJ1Y3RBUChGWF9CT09MIGJOZWVkQVApOwotCi0KLQotCi0gICAgaW50CQkJCQkJQ291bnRGaWVsZHNJbkNhbGN1bGF0aW9uT3JkZXIoKTsKLQotICAgIENQREZfRm9ybUZpZWxkKgkJCUdldEZpZWxkSW5DYWxjdWxhdGlvbk9yZGVyKGludCBpbmRleCk7Ci0KLSAgICBpbnQJCQkJCQlGaW5kRmllbGRJbkNhbGN1bGF0aW9uT3JkZXIoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCk7Ci0KLQotCi0KLSAgICBGWF9EV09SRAkJCQlDb3VudEZvcm1Gb250cygpOwotCi0gICAgQ1BERl9Gb250KgkJCQlHZXRGb3JtRm9udChGWF9EV09SRCBpbmRleCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7Ci0KLSAgICBDUERGX0ZvbnQqCQkJCUdldEZvcm1Gb250KENGWF9CeXRlU3RyaW5nIGNzTmFtZVRhZyk7Ci0KLSAgICBDUERGX0ZvbnQqCQkJCUdldEZvcm1Gb250KENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwotCi0gICAgQ1BERl9Gb250KgkJCQlHZXROYXRpdmVGb3JtRm9udChGWF9CWVRFIGlDaGFyU2V0LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKLQotICAgIENQREZfRm9udCoJCQkJR2V0TmF0aXZlRm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7Ci0KLSAgICBGWF9CT09MCQkJCQlGaW5kRm9ybUZvbnQoY29uc3QgQ1BERl9Gb250KiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7Ci0KLSAgICBGWF9CT09MCQkJCQlGaW5kRm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwgQ1BERl9Gb250KiYgcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwotCi0gICAgaW5saW5lIEZYX0JPT0wJCQlGaW5kRm9ybUZvbnQoQ0ZYX1dpZGVTdHJpbmcgY3NGb250TmFtZSwgQ1BERl9Gb250KiYgcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCi0gICAgewotICAgICAgICByZXR1cm4gRmluZEZvcm1Gb250KFBERl9FbmNvZGVUZXh0KGNzRm9udE5hbWUpLCBwRm9udCwgY3NOYW1lVGFnKTsKLSAgICB9Ci0KLQotCi0KLQotICAgIHZvaWQJCQkJCUFkZEZvcm1Gb250KGNvbnN0IENQREZfRm9udCogcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwotCi0gICAgQ1BERl9Gb250KgkJCQlBZGROYXRpdmVGb3JtRm9udChGWF9CWVRFIGlDaGFyU2V0LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKLQotICAgIENQREZfRm9udCoJCQkJQWRkTmF0aXZlRm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7Ci0KLSAgICB2b2lkCQkJCQlSZW1vdmVGb3JtRm9udChjb25zdCBDUERGX0ZvbnQqIHBGb250KTsKLQotICAgIHZvaWQJCQkJCVJlbW92ZUZvcm1Gb250KENGWF9CeXRlU3RyaW5nIGNzTmFtZVRhZyk7Ci0KLQotCi0KLSAgICBDUERGX0RlZmF1bHRBcHBlYXJhbmNlCUdldERlZmF1bHRBcHBlYXJhbmNlKCk7Ci0KLSAgICBDUERGX0ZvbnQqCQkJCUdldERlZmF1bHRGb3JtRm9udCgpOwotCi0KLQotICAgIGludAkJCQkJCUdldEZvcm1BbGlnbm1lbnQoKTsKLQotCi0KLQotICAgIENQREZfRm9ybUZpZWxkKgkJCUNoZWNrUmVxdWlyZWRGaWVsZHMoY29uc3QgQ0ZYX1B0ckFycmF5ICpmaWVsZHMgPSBOVUxMLCBGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlID0gVFJVRSkgY29uc3Q7Ci0KLSAgICBDRkRGX0RvY3VtZW50KiAJCQlFeHBvcnRUb0ZERihGWF9XU1RSIHBkZl9wYXRoLCBGWF9CT09MIGJTaW1wbGVGaWxlU3BlYyA9IEZBTFNFKSBjb25zdDsKLQotICAgIENGREZfRG9jdW1lbnQqCQkJRXhwb3J0VG9GREYoRlhfV1NUUiBwZGZfcGF0aCwgQ0ZYX1B0ckFycmF5JiBmaWVsZHMsIEZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUgPSBUUlVFLCBGWF9CT09MIGJTaW1wbGVGaWxlU3BlYyA9IEZBTFNFKSBjb25zdDsKLQotICAgIEZYX0JPT0wJCQkJCUltcG9ydEZyb21GREYoY29uc3QgQ0ZERl9Eb2N1bWVudCogcEZERkRvYywgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOwotCi0KLQotCi0gICAgRlhfQk9PTAkJCQkJUmVzZXRGb3JtKGNvbnN0IENGWF9QdHJBcnJheSYgZmllbGRzLCBGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlID0gVFJVRSwgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOwotCi0gICAgRlhfQk9PTAkJCQkJUmVzZXRGb3JtKEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsKLQotICAgIHZvaWQJCQkJCVJlbG9hZEZvcm0oKTsKLQotICAgIENQREZfRm9ybU5vdGlmeSoJCUdldEZvcm1Ob3RpZnkoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEZvcm1Ob3RpZnk7Ci0gICAgfQotCi0gICAgdm9pZAkJCQkJU2V0Rm9ybU5vdGlmeShjb25zdCBDUERGX0Zvcm1Ob3RpZnkqIHBOb3RpZnkpOwotCi0KLSAgICBpbnQJCQkJCQlHZXRQYWdlV2l0aFdpZGdldChpbnQgaUN1clBhZ2UsIEZYX0JPT0wgYk5leHQpOwotCi0KLQotICAgIEZYX0JPT0wJCQkJCUlzVXBkYXRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9iVXBkYXRlZDsKLSAgICB9Ci0KLSAgICB2b2lkCQkJCQlDbGVhclVwZGF0ZWRGbGFnKCkKLSAgICB7Ci0gICAgICAgIG1fYlVwZGF0ZWQgPSBGQUxTRTsKLSAgICB9Ci0KLQotICAgIEZYX0JPT0wJCQkJCUhhc1hGQUZvcm0oKSBjb25zdDsKLQotICAgIHZvaWQJCQkJCUZpeFBhZ2VGaWVsZHMoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSk7Ci1wcm90ZWN0ZWQ6Ci0KLSAgICBzdGF0aWMgRlhfQk9PTAkJCW1fYlVwZGF0ZUFQOwotCi0gICAgdm9pZAkJCQkJTG9hZEZpZWxkKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCwgaW50IG5MZXZlbCA9IDApOwotCi0gICAgQ1BERl9PYmplY3QqCQkJR2V0RmllbGRBdHRyKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCwgY29uc3QgRlhfQ0hBUiogbmFtZSk7Ci0KLSAgICBDUERGX0Zvcm1GaWVsZCoJCQlBZGRUZXJtaW5hbEZpZWxkKGNvbnN0IENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCk7Ci0KLSAgICBDUERGX0Zvcm1Db250cm9sKgkJQWRkQ29udHJvbChjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBXaWRnZXREaWN0KTsKLQotICAgIHZvaWQJCQkJCUZERl9JbXBvcnRGaWVsZChDUERGX0RpY3Rpb25hcnkqIHBGaWVsZCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHBhcmVudF9uYW1lLCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSwgaW50IG5MZXZlbCA9IDApOwotCi0gICAgRlhfQk9PTAkJCQkJVmFsaWRhdGVGaWVsZE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lLCBpbnQgaVR5cGUsIGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRXhjbHVkZWRGaWVsZCwgY29uc3QgQ1BERl9Gb3JtQ29udHJvbCogcEV4Y2x1ZGVkQ29udHJvbCk7Ci0KLSAgICBpbnQJCQkJCQlDb21wYXJlRmllbGROYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBuYW1lMSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG5hbWUyKTsKLQotICAgIGludAkJCQkJCUNvbXBhcmVGaWVsZE5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUxLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZTIpOwotCi0gICAgQ1BERl9Eb2N1bWVudCoJCQltX3BEb2N1bWVudDsKLQotICAgIEZYX0JPT0wJCQkJCW1fYkdlbmVyYXRlQVA7Ci0KLSAgICBDUERGX0RpY3Rpb25hcnkqCQltX3BGb3JtRGljdDsKLQotICAgIENGWF9NYXBQdHJUb1B0cgkJCW1fQ29udHJvbE1hcDsKLQotICAgIENGaWVsZFRyZWUgKm1fcEZpZWxkVHJlZTsKLQotICAgIENGWF9CeXRlU3RyaW5nCQkJbV9ic0VuY29kaW5nOwotCi0gICAgQ1BERl9Gb3JtTm90aWZ5KgkJbV9wRm9ybU5vdGlmeTsKLQotICAgIEZYX0JPT0wJCQkJCW1fYlVwZGF0ZWQ7Ci0gICAgZnJpZW5kIGNsYXNzIENQREZfRm9ybUNvbnRyb2w7Ci0gICAgZnJpZW5kIGNsYXNzIENQREZfRm9ybUZpZWxkOwotfTsKLSNkZWZpbmUgRk9STUZJRUxEX1JFQURPTkxZCQkweDAxCi0jZGVmaW5lIEZPUk1GSUVMRF9SRVFVSVJFRAkJMHgwMgotI2RlZmluZSBGT1JNRklFTERfTk9FWFBPUlQJCTB4MDQKLSNkZWZpbmUgRk9STVJBRElPX05PVE9HR0xFT0ZGCTB4MTAwCi0jZGVmaW5lIEZPUk1SQURJT19VTklTT04JCTB4MjAwCi0jZGVmaW5lIEZPUk1URVhUX01VTFRJTElORQkJMHgxMDAKLSNkZWZpbmUgRk9STVRFWFRfUEFTU1dPUkQJCTB4MjAwCi0jZGVmaW5lIEZPUk1URVhUX05PU0NST0xMCQkweDQwMAotI2RlZmluZSBGT1JNVEVYVF9DT01CCQkJMHg4MDAKLSNkZWZpbmUgRk9STUNPTUJPX0VESVQJCQkweDEwMAotI2RlZmluZSBGT1JNTElTVF9NVUxUSVNFTEVDVAkweDEwMAotY2xhc3MgQ1BERl9Gb3JtRmllbGQgCi17Ci1wdWJsaWM6Ci0KLSAgICBlbnVtIFR5cGUgewotICAgICAgICBVbmtub3duLAotICAgICAgICBQdXNoQnV0dG9uLAotICAgICAgICBSYWRpb0J1dHRvbiwKLSAgICAgICAgQ2hlY2tCb3gsCi0gICAgICAgIFRleHQsCi0gICAgICAgIFJpY2hUZXh0LAotICAgICAgICBGaWxlLAotICAgICAgICBMaXN0Qm94LAotICAgICAgICBDb21ib0JveCwKLSAgICAgICAgU2lnbgotICAgIH07Ci0KLSAgICBDRlhfV2lkZVN0cmluZwkJCUdldEZ1bGxOYW1lKCk7Ci0KLSAgICBUeXBlCQkJCQlHZXRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1R5cGU7Ci0gICAgfQotCi0gICAgRlhfRFdPUkQJCQkJR2V0RmxhZ3MoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fRmxhZ3M7Ci0gICAgfQotCi0gICAgQ1BERl9JbnRlckZvcm0qCQkJR2V0SW50ZXJGb3JtKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BGb3JtOwotICAgIH0KLQotICAgIENQREZfRGljdGlvbmFyeSoJCUdldEZpZWxkRGljdCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRGljdDsKLSAgICB9Ci0KLSAgICB2b2lkCQkJCQlTZXRGaWVsZERpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkKLSAgICB7Ci0gICAgICAgIG1fcERpY3QgPSBwRGljdDsKLSAgICB9Ci0KLSAgICBGWF9CT09MCQkJCQlSZXNldEZpZWxkKEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsKLQotCi0KLSAgICBpbnQJCQkJCQlDb3VudENvbnRyb2xzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0NvbnRyb2xMaXN0LkdldFNpemUoKTsKLSAgICB9Ci0KLSAgICBDUERGX0Zvcm1Db250cm9sKgkJR2V0Q29udHJvbChpbnQgaW5kZXgpCi0gICAgewotICAgICAgICByZXR1cm4gKENQREZfRm9ybUNvbnRyb2wqKW1fQ29udHJvbExpc3QuR2V0QXQoaW5kZXgpOwotICAgIH0KLQotICAgIGludAkJCQkJCUdldENvbnRyb2xJbmRleChjb25zdCBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCk7Ci0KLQotCi0KLSAgICBpbnQJCQkJCQlHZXRGaWVsZFR5cGUoKTsKLQotCi0KLQotICAgIENQREZfQUFjdGlvbgkJCUdldEFkZGl0aW9uYWxBY3Rpb24oKTsKLQotCi0KLQotICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0QWx0ZXJuYXRlTmFtZSgpOwotCi0KLQotCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXRNYXBwaW5nTmFtZSgpOwotCi0KLQotCi0gICAgRlhfRFdPUkQJCQkJR2V0RmllbGRGbGFncygpOwotCi0KLQotCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCQlHZXREZWZhdWx0U3R5bGUoKTsKLQotCi0KLQotICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0UmljaFRleHRTdHJpbmcoKTsKLQotCi0KLSAgICBDRlhfV2lkZVN0cmluZwkJCUdldFZhbHVlKCk7Ci0KLSAgICBDRlhfV2lkZVN0cmluZwkJCUdldERlZmF1bHRWYWx1ZSgpOwotCi0gICAgRlhfQk9PTAkJCQkJU2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7Ci0KLQotCi0KLQotICAgIGludAkJCQkJCUdldE1heExlbigpOwotCi0KLQotCi0gICAgaW50CQkJCQkJQ291bnRTZWxlY3RlZEl0ZW1zKCk7Ci0KLSAgICBpbnQJCQkJCQlHZXRTZWxlY3RlZEluZGV4KGludCBpbmRleCk7Ci0KLSAgICBGWF9CT09MCQkJCQlDbGVhclNlbGVjdGlvbihGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7Ci0KLSAgICBGWF9CT09MCQkJCQlJc0l0ZW1TZWxlY3RlZChpbnQgaW5kZXgpOwotCi0gICAgRlhfQk9PTAkJCQkJU2V0SXRlbVNlbGVjdGlvbihpbnQgaW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkLCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7Ci0KLSAgICBGWF9CT09MCQkJCQlJc0l0ZW1EZWZhdWx0U2VsZWN0ZWQoaW50IGluZGV4KTsKLQotICAgIGludAkJCQkJCUdldERlZmF1bHRTZWxlY3RlZEl0ZW0oKTsKLQotCi0KLQotICAgIGludAkJCQkJCUNvdW50T3B0aW9ucygpOwotCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXRPcHRpb25MYWJlbChpbnQgaW5kZXgpOwotCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXRPcHRpb25WYWx1ZShpbnQgaW5kZXgpOwotCi0gICAgaW50CQkJCQkJRmluZE9wdGlvbihDRlhfV2lkZVN0cmluZyBjc09wdExhYmVsKTsKLQotICAgIGludAkJCQkJCUZpbmRPcHRpb25WYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NPcHRWYWx1ZSwgaW50IGlTdGFydEluZGV4ID0gMCk7Ci0KLQotCi0KLSAgICBGWF9CT09MCQkJCQlDaGVja0NvbnRyb2woaW50IGlDb250cm9sSW5kZXgsIEZYX0JPT0wgYkNoZWNrZWQsIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsKLQotCi0KLQotICAgIGludAkJCQkJCUdldFRvcFZpc2libGVJbmRleCgpOwotCi0KLQotCi0gICAgaW50CQkJCQkJQ291bnRTZWxlY3RlZE9wdGlvbnMoKTsKLQotICAgIGludAkJCQkJCUdldFNlbGVjdGVkT3B0aW9uSW5kZXgoaW50IGluZGV4KTsKLQotICAgIEZYX0JPT0wJCQkJCUlzT3B0aW9uU2VsZWN0ZWQoaW50IGlPcHRJbmRleCk7Ci0KLSAgICBGWF9CT09MCQkJCQlTZWxlY3RPcHRpb24oaW50IGlPcHRJbmRleCwgRlhfQk9PTCBiU2VsZWN0ZWQsIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsKLQotICAgIEZYX0JPT0wJCQkJCUNsZWFyU2VsZWN0ZWRPcHRpb25zKEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsKLQotCi0KLQotICAgIEZYX0ZMT0FUCQkJCUdldEZvbnRTaXplKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0ZvbnRTaXplOwotICAgIH0KLQotICAgIENQREZfRm9udCoJCQkJR2V0Rm9udCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wRm9udDsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLQotICAgIENQREZfRm9ybUZpZWxkKENQREZfSW50ZXJGb3JtKiBwRm9ybSwgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7Ci0KLSAgICB+Q1BERl9Gb3JtRmllbGQoKTsKLQotICAgIENQREZfRm9ybUZpZWxkOjpUeXBlCW1fVHlwZTsKLQotICAgIEZYX0RXT1JECQkJCW1fRmxhZ3M7Ci0KLSAgICBDUERGX0ludGVyRm9ybSoJCQltX3BGb3JtOwotCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgkJbV9wRGljdDsKLQotICAgIENGWF9QdHJBcnJheQkJCW1fQ29udHJvbExpc3Q7Ci0gICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9JbnRlckZvcm07Ci0gICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9Gb3JtQ29udHJvbDsKLQotCi0KLSAgICBDRlhfV2lkZVN0cmluZwkJCUdldFZhbHVlKEZYX0JPT0wgYkRlZmF1bHQpOwotCi0gICAgRlhfQk9PTAkJCQkJU2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBGWF9CT09MIGJEZWZhdWx0LCBGWF9CT09MIGJOb3RpZnkpOwotCi0KLSAgICB2b2lkCQkJCQlTeW5jRmllbGRGbGFncygpOwotCi0gICAgaW50CQkJCQkJRmluZExpc3RTZWwoQ1BERl9TdHJpbmcqIHN0cik7Ci0KLSAgICBDRlhfV2lkZVN0cmluZwkJCUdldE9wdGlvblRleHQoaW50IGluZGV4LCBpbnQgc3ViX2luZGV4KTsKLQotICAgIHZvaWQJCQkJCUxvYWREQSgpOwotCi0gICAgdm9pZAkJCQkJVXBkYXRlQVAoQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wpOwotCi0KLQotICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0Q2hlY2tWYWx1ZShGWF9CT09MIGJEZWZhdWx0KTsKLQotICAgIEZYX0JPT0wJCQkJCVNldENoZWNrVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBGWF9CT09MIGJEZWZhdWx0LCBGWF9CT09MIGJOb3RpZnkpOwotCi0KLSAgICBGWF9GTE9BVAkJCQltX0ZvbnRTaXplOwotCi0gICAgQ1BERl9Gb250KgkJCQltX3BGb250OwotfTsKLUNQREZfT2JqZWN0KglGUERGX0dldEZpZWxkQXR0cihDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QsIGNvbnN0IEZYX0NIQVIqIG5hbWUsIGludCBuTGV2ZWwgPSAwKTsKLWNsYXNzIENQREZfSWNvbkZpdCAKLXsKLXB1YmxpYzoKLQotICAgIENQREZfSWNvbkZpdChDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gTlVMTCkKLSAgICB7Ci0gICAgICAgIG1fcERpY3QgPSBwRGljdDsKLSAgICB9Ci0KLSAgICBvcGVyYXRvciBDUERGX0RpY3Rpb25hcnkqKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEaWN0OwotICAgIH0KLQotCi0KLQotICAgIGVudW0gU2NhbGVNZXRob2QgewotICAgICAgICBBbHdheXMgPSAwLAotICAgICAgICBCaWdnZXIsCi0gICAgICAgIFNtYWxsZXIsCi0gICAgICAgIE5ldmVyCi0gICAgfTsKLQotICAgIFNjYWxlTWV0aG9kCQkJCUdldFNjYWxlTWV0aG9kKCk7Ci0KLQotCi0KLSAgICBGWF9CT09MCQkJCQlJc1Byb3BvcnRpb25hbFNjYWxlKCk7Ci0KLQotCi0KLSAgICB2b2lkCQkJCQlHZXRJY29uUG9zaXRpb24oRlhfRkxPQVQmIGZMZWZ0LCBGWF9GTE9BVCYgZkJvdHRvbSk7Ci0KLQotCi0KLSAgICBGWF9CT09MCQkJCQlHZXRGaXR0aW5nQm91bmRzKCk7Ci0KLQotICAgIENQREZfRGljdGlvbmFyeSoJCW1fcERpY3Q7CisgIENQREZfQWN0aW9uKiBtX3BBY3Rpb247CiB9OwogCi0jZGVmaW5lIFRFWFRQT1NfQ0FQVElPTgkJMAotI2RlZmluZSBURVhUUE9TX0lDT04JCTEKLSNkZWZpbmUgVEVYVFBPU19CRUxPVwkJMgotI2RlZmluZSBURVhUUE9TX0FCT1ZFCQkzCi0jZGVmaW5lIFRFWFRQT1NfUklHSFQJCTQKLSNkZWZpbmUgVEVYVFBPU19MRUZUCQk1Ci0jZGVmaW5lIFRFWFRQT1NfT1ZFUkxBSUQJNgotY2xhc3MgQ1BERl9Gb3JtQ29udHJvbCAKLXsKLXB1YmxpYzoKKyNkZWZpbmUgUERGTkFNRURfTkVYVFBBR0UgMQorI2RlZmluZSBQREZOQU1FRF9QUkVWUEFHRSAyCisjZGVmaW5lIFBERk5BTUVEX0ZJUlNUUEFHRSAzCisjZGVmaW5lIFBERk5BTUVEX0xBU1RQQUdFIDQKKyNkZWZpbmUgUERGSlNfTUFYTEVOR1RIIDY0CitjbGFzcyBDUERGX0FjdGlvbiB7CisgcHVibGljOgorICBlbnVtIEFjdGlvblR5cGUgeworICAgIFVua25vd24gPSAwLAorICAgIEdvVG8sCisgICAgR29Ub1IsCisgICAgR29Ub0UsCisgICAgTGF1bmNoLAorICAgIFRocmVhZCwKKyAgICBVUkksCisgICAgU291bmQsCisgICAgTW92aWUsCisgICAgSGlkZSwKKyAgICBOYW1lZCwKKyAgICBTdWJtaXRGb3JtLAorICAgIFJlc2V0Rm9ybSwKKyAgICBJbXBvcnREYXRhLAorICAgIEphdmFTY3JpcHQsCisgICAgU2V0T0NHU3RhdGUsCisgICAgUmVuZGl0aW9uLAorICAgIFRyYW5zLAorICAgIEdvVG8zRFZpZXcKKyAgfTsKIAotICAgIENQREZfRm9ybUZpZWxkOjpUeXBlCUdldFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEZpZWxkLT5HZXRUeXBlKCk7Ci0gICAgfQorICBDUERGX0FjdGlvbigpIDogbV9wRGljdChudWxscHRyKSB7fQorICBleHBsaWNpdCBDUERGX0FjdGlvbihDUERGX0RpY3Rpb25hcnkqIHBEaWN0KSA6IG1fcERpY3QocERpY3QpIHt9CiAKLSAgICBDUERGX0ludGVyRm9ybSoJCQlHZXRJbnRlckZvcm0oKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEZvcm07Ci0gICAgfQorICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gbV9wRGljdCAhPSBOVUxMOyB9CiAKLSAgICBDUERGX0Zvcm1GaWVsZCoJCQlHZXRGaWVsZCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRmllbGQ7Ci0gICAgfQorICBDUERGX0RpY3Rpb25hcnkqIEdldERpY3QoKSBjb25zdCB7IHJldHVybiBtX3BEaWN0OyB9CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqCQlHZXRXaWRnZXQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcFdpZGdldERpY3Q7Ci0gICAgfQorICBDRlhfQnl0ZVN0cmluZyBHZXRUeXBlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fcERpY3QtPkdldFN0cmluZygiUyIpOyB9CiAKLSAgICBDRlhfRmxvYXRSZWN0CQkJR2V0UmVjdCgpOworICBBY3Rpb25UeXBlIEdldFR5cGUoKSBjb25zdDsKIAotICAgIHZvaWQJCQkJCURyYXdDb250cm9sKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYWdlKiBwUGFnZSwgQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSwgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyA9IE5VTEwpOworICBDUERGX0Rlc3QgR2V0RGVzdChDUERGX0RvY3VtZW50KiBwRG9jKSBjb25zdDsKIAorICBDRlhfV2lkZVN0cmluZyBHZXRGaWxlUGF0aCgpIGNvbnN0OwogCisgIEZYX0JPT0wgR2V0TmV3V2luZG93KCkgY29uc3QgeyByZXR1cm4gbV9wRGljdC0+R2V0Qm9vbGVhbigiTmV3V2luZG93Iik7IH0KIAotICAgIENGWF9CeXRlU3RyaW5nCQkJR2V0Q2hlY2tlZEFQU3RhdGUoKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0VVJJKENQREZfRG9jdW1lbnQqIHBEb2MpIGNvbnN0OwogCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXRFeHBvcnRWYWx1ZSgpOworICBGWF9CT09MIEdldE1vdXNlTWFwKCkgY29uc3QgeyByZXR1cm4gbV9wRGljdC0+R2V0Qm9vbGVhbigiSXNNYXAiKTsgfQogCi0gICAgRlhfQk9PTAkJCQkJSXNDaGVja2VkKCk7CisgIENQREZfQWN0aW9uRmllbGRzIEdldFdpZGdldHMoKSBjb25zdCB7IHJldHVybiB0aGlzOyB9CiAKLSAgICBGWF9CT09MCQkJCQlJc0RlZmF1bHRDaGVja2VkKCk7CisgIEZYX0JPT0wgR2V0SGlkZVN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIG1fcERpY3QtPkdldEJvb2xlYW4oIkgiLCBUUlVFKTsgfQogCisgIENGWF9CeXRlU3RyaW5nIEdldE5hbWVkQWN0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9wRGljdC0+R2V0U3RyaW5nKCJOIik7IH0KIAorICBGWF9EV09SRCBHZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIG1fcERpY3QtPkdldEludGVnZXIoIkZsYWdzIik7IH0KIAorICBDRlhfV2lkZVN0cmluZyBHZXRKYXZhU2NyaXB0KCkgY29uc3Q7CiAKLSAgICBlbnVtIEhpZ2hsaWdodGluZ01vZGUJewotICAgICAgICBOb25lID0gMCwKLSAgICAgICAgSW52ZXJ0LAotICAgICAgICBPdXRsaW5lLAotICAgICAgICBQdXNoLAotICAgICAgICBUb2dnbGUKLSAgICB9OworICBDUERGX0RpY3Rpb25hcnkqIEdldEFubm90KCkgY29uc3Q7CiAKLSAgICBIaWdobGlnaHRpbmdNb2RlCQlHZXRIaWdobGlnaHRpbmdNb2RlKCk7CisgIGludDMyX3QgR2V0T3BlcmF0aW9uVHlwZSgpIGNvbnN0OwogCisgIENQREZfU3RyZWFtKiBHZXRTb3VuZFN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIG1fcERpY3QtPkdldFN0cmVhbSgiU291bmQiKTsgfQogCisgIEZYX0ZMT0FUIEdldFZvbHVtZSgpIGNvbnN0IHsgcmV0dXJuIG1fcERpY3QtPkdldE51bWJlcigiVm9sdW1lIik7IH0KIAorICBGWF9CT09MIElzU3luY2hyb25vdXMoKSBjb25zdCB7IHJldHVybiBtX3BEaWN0LT5HZXRCb29sZWFuKCJTeW5jaHJvbm91cyIpOyB9CiAKLSAgICBGWF9CT09MCQkJCQlIYXNNS0VudHJ5KENGWF9CeXRlU3RyaW5nIGNzRW50cnkpOworICBGWF9CT09MIElzUmVwZWF0KCkgY29uc3QgeyByZXR1cm4gbV9wRGljdC0+R2V0Qm9vbGVhbigiUmVwZWF0Iik7IH0KIAorICBGWF9CT09MIElzTWl4UGxheSgpIGNvbnN0IHsgcmV0dXJuIG1fcERpY3QtPkdldEJvb2xlYW4oIk1peCIpOyB9CiAKKyAgRlhfRFdPUkQgR2V0U3ViQWN0aW9uc0NvdW50KCkgY29uc3Q7CiAKKyAgQ1BERl9BY3Rpb24gR2V0U3ViQWN0aW9uKEZYX0RXT1JEIGlJbmRleCkgY29uc3Q7CiAKLSAgICBpbnQJCQkJCQlHZXRSb3RhdGlvbigpOwotCi0KLQotCi0gICAgaW5saW5lIEZYX0FSR0IJCQlHZXRCb3JkZXJDb2xvcihpbnQmIGlDb2xvclR5cGUpCi0gICAgewotICAgICAgICByZXR1cm4gR2V0Q29sb3IoaUNvbG9yVHlwZSwgIkJDIik7Ci0gICAgfQotCi0gICAgaW5saW5lIEZYX0ZMT0FUCQkJR2V0T3JpZ2luYWxCb3JkZXJDb2xvcihpbnQgaW5kZXgpCi0gICAgewotICAgICAgICByZXR1cm4gR2V0T3JpZ2luYWxDb2xvcihpbmRleCwgIkJDIik7Ci0gICAgfQotCi0gICAgaW5saW5lIHZvaWQJCQkJR2V0T3JpZ2luYWxCb3JkZXJDb2xvcihpbnQmIGlDb2xvclR5cGUsIEZYX0ZMT0FUIGZjWzRdKQotICAgIHsKLSAgICAgICAgR2V0T3JpZ2luYWxDb2xvcihpQ29sb3JUeXBlLCBmYywgIkJDIik7Ci0gICAgfQotCi0KLQotCi0gICAgaW5saW5lIEZYX0FSR0IJCQlHZXRCYWNrZ3JvdW5kQ29sb3IoaW50JiBpQ29sb3JUeXBlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdldENvbG9yKGlDb2xvclR5cGUsICJCRyIpOwotICAgIH0KLQotICAgIGlubGluZSBGWF9GTE9BVAkJCUdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKGludCBpbmRleCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBHZXRPcmlnaW5hbENvbG9yKGluZGV4LCAiQkciKTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgdm9pZAkJCQlHZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcihpbnQmIGlDb2xvclR5cGUsIEZYX0ZMT0FUIGZjWzRdKQotICAgIHsKLSAgICAgICAgR2V0T3JpZ2luYWxDb2xvcihpQ29sb3JUeXBlLCBmYywgIkJHIik7Ci0gICAgfQotCi0KLQotCi0gICAgaW5saW5lIENGWF9XaWRlU3RyaW5nCUdldE5vcm1hbENhcHRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdldENhcHRpb24oIkNBIik7Ci0gICAgfQotCi0KLQotCi0gICAgaW5saW5lIENGWF9XaWRlU3RyaW5nCUdldFJvbGxvdmVyQ2FwdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gR2V0Q2FwdGlvbigiUkMiKTsKLSAgICB9Ci0KLQotCi0KLSAgICBpbmxpbmUgQ0ZYX1dpZGVTdHJpbmcJR2V0RG93bkNhcHRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdldENhcHRpb24oIkFDIik7Ci0gICAgfQotCi0KLQotCi0gICAgaW5saW5lIENQREZfU3RyZWFtKgkJR2V0Tm9ybWFsSWNvbigpCi0gICAgewotICAgICAgICByZXR1cm4gR2V0SWNvbigiSSIpOwotICAgIH0KLQotCi0KLQotICAgIGlubGluZSBDUERGX1N0cmVhbSoJCUdldFJvbGxvdmVySWNvbigpCi0gICAgewotICAgICAgICByZXR1cm4gR2V0SWNvbigiUkkiKTsKLSAgICB9Ci0KLQotCi0KLSAgICBpbmxpbmUgQ1BERl9TdHJlYW0qCQlHZXREb3duSWNvbigpCi0gICAgewotICAgICAgICByZXR1cm4gR2V0SWNvbigiSVgiKTsKLSAgICB9Ci0KLQotCi0KLSAgICBDUERGX0ljb25GaXQJCQlHZXRJY29uRml0KCk7Ci0KLQotCi0KLSAgICBpbnQJCQkJCQlHZXRUZXh0UG9zaXRpb24oKTsKLQotCi0KLQotICAgIENQREZfQWN0aW9uCQkJCUdldEFjdGlvbigpOwotCi0KLQotCi0gICAgQ1BERl9BQWN0aW9uCQkJR2V0QWRkaXRpb25hbEFjdGlvbigpOwotCi0KLQotCi0gICAgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZQlHZXREZWZhdWx0QXBwZWFyYW5jZSgpOwotCi0gICAgQ1BERl9Gb250KgkJCQlHZXREZWZhdWx0Q29udHJvbEZvbnQoKTsKLQotCi0KLQotICAgIGludAkJCQkJCUdldENvbnRyb2xBbGlnbm1lbnQoKTsKLQotcHJvdGVjdGVkOgotCi0gICAgQ1BERl9Gb3JtQ29udHJvbChDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBDUERGX0RpY3Rpb25hcnkqIHBXaWRnZXREaWN0KTsKLQotICAgIENGWF9CeXRlU3RyaW5nCQkJR2V0T25TdGF0ZU5hbWUoKTsKLQotICAgIHZvaWQJCQkJCVNldE9uU3RhdGVOYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc09uKTsKLQotICAgIHZvaWQJCQkJCUNoZWNrQ29udHJvbChGWF9CT09MIGJDaGVja2VkKTsKLQotICAgIEZYX0FSR0IJCQkJCUdldENvbG9yKGludCYgaUNvbG9yVHlwZSwgQ0ZYX0J5dGVTdHJpbmcgY3NFbnRyeSk7Ci0KLSAgICBGWF9GTE9BVAkJCQlHZXRPcmlnaW5hbENvbG9yKGludCBpbmRleCwgQ0ZYX0J5dGVTdHJpbmcgY3NFbnRyeSk7Ci0KLSAgICB2b2lkCQkJCQlHZXRPcmlnaW5hbENvbG9yKGludCYgaUNvbG9yVHlwZSwgRlhfRkxPQVQgZmNbNF0sIENGWF9CeXRlU3RyaW5nIGNzRW50cnkpOwotCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXRDYXB0aW9uKENGWF9CeXRlU3RyaW5nIGNzRW50cnkpOwotCi0gICAgQ1BERl9TdHJlYW0qCQkJR2V0SWNvbihDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KTsKLQotICAgIENQREZfQXBTZXR0aW5ncwkJCUdldE1LKEZYX0JPT0wgYkNyZWF0ZSk7Ci0KLSAgICBDUERGX0ludGVyRm9ybSoJCQltX3BGb3JtOwotCi0gICAgQ1BERl9Gb3JtRmllbGQqCQkJbV9wRmllbGQ7Ci0KLSAgICBDUERGX0RpY3Rpb25hcnkqCQltX3BXaWRnZXREaWN0OwotICAgIGZyaWVuZCBjbGFzcwkJCUNQREZfSW50ZXJGb3JtOwotICAgIGZyaWVuZCBjbGFzcwkJCUNQREZfRm9ybUZpZWxkOworIHByb3RlY3RlZDoKKyAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BEaWN0OwogfTsKLWNsYXNzIENQREZfRm9ybU5vdGlmeSAKLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfQUFjdGlvbiB7CisgcHVibGljOgorICAvLyBUT0RPKHRoZXN0aWcpOiBFeGFtaW5lIHdoeSB0aGlzIGNhbm5vdCBiZSBleHBsaWNpdC4KKyAgQ1BERl9BQWN0aW9uKENQREZfRGljdGlvbmFyeSogcERpY3QgPSBOVUxMKSB7IG1fcERpY3QgPSBwRGljdDsgfQogCi0gICAgdmlydHVhbCB+Q1BERl9Gb3JtTm90aWZ5KCkge30KKyAgb3BlcmF0b3IgQ1BERl9EaWN0aW9uYXJ5KigpIGNvbnN0IHsgcmV0dXJuIG1fcERpY3Q7IH0KIAotICAgIHZpcnR1YWwgaW50CQlCZWZvcmVWYWx1ZUNoYW5nZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKyAgZW51bSBBQWN0aW9uVHlwZSB7CisgICAgQ3Vyc29yRW50ZXIgPSAwLAorICAgIEN1cnNvckV4aXQsCisgICAgQnV0dG9uRG93biwKKyAgICBCdXR0b25VcCwKKyAgICBHZXRGb2N1cywKKyAgICBMb3NlRm9jdXMsCisgICAgUGFnZU9wZW4sCisgICAgUGFnZUNsb3NlLAorICAgIFBhZ2VWaXNpYmxlLAorICAgIFBhZ2VJbnZpc2libGUsCisgICAgT3BlblBhZ2UsCisgICAgQ2xvc2VQYWdlLAorICAgIEtleVN0cm9rZSwKKyAgICBGb3JtYXQsCisgICAgVmFsaWRhdGUsCisgICAgQ2FsY3VsYXRlLAorICAgIENsb3NlRG9jdW1lbnQsCisgICAgU2F2ZURvY3VtZW50LAorICAgIERvY3VtZW50U2F2ZWQsCisgICAgUHJpbnREb2N1bWVudCwKKyAgICBEb2N1bWVudFByaW50ZWQKKyAgfTsKIAotICAgIHZpcnR1YWwgaW50CQlBZnRlclZhbHVlQ2hhbmdlKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQpCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgIEZYX0JPT0wgQWN0aW9uRXhpc3QoQUFjdGlvblR5cGUgZVR5cGUpIGNvbnN0OwogCi0gICAgdmlydHVhbCBpbnQJCUJlZm9yZVNlbGVjdGlvbkNoYW5nZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKyAgQ1BERl9BY3Rpb24gR2V0QWN0aW9uKEFBY3Rpb25UeXBlIGVUeXBlKSBjb25zdDsKIAotICAgIHZpcnR1YWwgaW50CQlBZnRlclNlbGVjdGlvbkNoYW5nZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgdmlydHVhbCBpbnQJCUFmdGVyQ2hlY2tlZFN0YXR1c0NoYW5nZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBjb25zdCBDRlhfQnl0ZUFycmF5JiBzdGF0dXNBcnJheSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHZpcnR1YWwgaW50CQlCZWZvcmVGb3JtUmVzZXQoY29uc3QgQ1BERl9JbnRlckZvcm0qIHBGb3JtKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgdmlydHVhbCBpbnQJCUFmdGVyRm9ybVJlc2V0KGNvbnN0IENQREZfSW50ZXJGb3JtKiBwRm9ybSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHZpcnR1YWwgaW50CQlCZWZvcmVGb3JtSW1wb3J0RGF0YShjb25zdCBDUERGX0ludGVyRm9ybSogcEZvcm0pCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGludAkJQWZ0ZXJGb3JtSW1wb3J0RGF0YShjb25zdCBDUERGX0ludGVyRm9ybSogcEZvcm0pCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgIENQREZfRGljdGlvbmFyeSogbV9wRGljdDsKIH07Ci1GWF9CT09MCQlGUERGX0dlbmVyYXRlQVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKLWNsYXNzIENQREZfUGFnZUxhYmVsIAotewotcHVibGljOgorY2xhc3MgQ1BERl9Eb2NKU0FjdGlvbnMgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1BERl9Eb2NKU0FjdGlvbnMoQ1BERl9Eb2N1bWVudCogcERvYyk7CiAKLSAgICBDUERGX1BhZ2VMYWJlbChDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQpCi0gICAgewotICAgICAgICBtX3BEb2N1bWVudCA9IHBEb2N1bWVudDsKLSAgICB9CisgIGludCBDb3VudEpTQWN0aW9ucygpIGNvbnN0OwogCisgIENQREZfQWN0aW9uIEdldEpTQWN0aW9uKGludCBpbmRleCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZSkgY29uc3Q7CiAKLSAgICBDRlhfV2lkZVN0cmluZwkJCQkJR2V0TGFiZWwoaW50IG5QYWdlKSBjb25zdDsKKyAgQ1BERl9BY3Rpb24gR2V0SlNBY3Rpb24oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZSkgY29uc3Q7CiAKLSAgICBGWF9JTlQzMgkJCQkJCUdldFBhZ2VCeUxhYmVsKEZYX0JTVFIgYnNMYWJlbCkgY29uc3Q7CisgIGludCBGaW5kSlNBY3Rpb24oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZSkgY29uc3Q7CiAKKyAgQ1BERl9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BEb2N1bWVudDsgfQogCi0gICAgRlhfSU5UMzIJCQkJCQlHZXRQYWdlQnlMYWJlbChGWF9XU1RSIHdzTGFiZWwpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gICAgQ1BERl9Eb2N1bWVudCoJCQkJCW1fcERvY3VtZW50OworIHByb3RlY3RlZDoKKyAgQ1BERl9Eb2N1bWVudCogY29uc3QgbV9wRG9jdW1lbnQ7CiB9OwotY2xhc3MgQ1BERl9NZXRhZGF0YQotewotcHVibGljOgorY2xhc3MgQ1BERl9GaWxlU3BlYyB7CisgcHVibGljOgorICBDUERGX0ZpbGVTcGVjKCk7CiAKLSAgICBDUERGX01ldGFkYXRhKCk7CisgIGV4cGxpY2l0IENQREZfRmlsZVNwZWMoQ1BERl9PYmplY3QqIHBPYmopIHsgbV9wT2JqID0gcE9iajsgfQogCisgIG9wZXJhdG9yIENQREZfT2JqZWN0KigpIGNvbnN0IHsgcmV0dXJuIG1fcE9iajsgfQogCi0gICAgfkNQREZfTWV0YWRhdGEoKTsKKyAgRlhfQk9PTCBJc1VSTCgpIGNvbnN0OwogCi0gICAgdm9pZAkJCQlMb2FkRG9jKENQREZfRG9jdW1lbnQgKnBEb2MpOworICBGWF9CT09MIEdldEZpbGVOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0ZpbGVOYW1lKSBjb25zdDsKIAorICBDUERGX1N0cmVhbSogR2V0RmlsZVN0cmVhbSgpIGNvbnN0OwogCi0gICAgRlhfSU5UMzIJCQlHZXRTdHJpbmcoRlhfQlNUUiBic0l0ZW0sIENGWF9XaWRlU3RyaW5nICZ3c1N0cik7CisgIHZvaWQgU2V0RmlsZU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZpbGVOYW1lLCBGWF9CT09MIGJVUkwgPSBGQUxTRSk7CiAKLSAgICBDWE1MX0VsZW1lbnQqCQlHZXRSb290KCkgY29uc3Q7Ci0KLSAgICBDWE1MX0VsZW1lbnQqCQlHZXRSREYoKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICAgIEZYX0xQVk9JRAltX3BEYXRhOworIHByb3RlY3RlZDoKKyAgQ1BERl9PYmplY3QqIG1fcE9iajsKIH07Ci1jbGFzcyBDUERGX1ZpZXdlclByZWZlcmVuY2VzCi17Ci1wdWJsaWM6CiAKLSAgICBDUERGX1ZpZXdlclByZWZlcmVuY2VzKENQREZfRG9jdW1lbnQgKnBEb2MpOworY2xhc3MgQ1BERl9MaW5rTGlzdCB7CisgcHVibGljOgorICBDUERGX0xpbmtMaXN0KCk7CisgIH5DUERGX0xpbmtMaXN0KCk7CiAKKyAgQ1BERl9MaW5rIEdldExpbmtBdFBvaW50KENQREZfUGFnZSogcFBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwZGZfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHBkZl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB6X29yZGVyKTsKIAotICAgIH5DUERGX1ZpZXdlclByZWZlcmVuY2VzKCk7CisgcHJpdmF0ZToKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Q1BERl9EaWN0aW9uYXJ5Kj4qIEdldFBhZ2VMaW5rcyhDUERGX1BhZ2UqIHBQYWdlKTsKIAorICB2b2lkIExvYWRQYWdlTGlua3MoQ1BERl9QYWdlKiBwUGFnZSwgc3RkOjp2ZWN0b3I8Q1BERl9EaWN0aW9uYXJ5Kj4qIHBMaXN0KTsKIAotICAgIEZYX0JPT0wgSXNEaXJlY3Rpb25SMkwoKSBjb25zdDsKLQotICAgIEZYX0JPT0wgUHJpbnRTY2FsaW5nKCkgY29uc3Q7Ci0KLSAgICBGWF9JTlQzMiBOdW1Db3BpZXMoKSBjb25zdDsKLQotICAgIENQREZfQXJyYXkqIFByaW50UGFnZVJhbmdlKCkgY29uc3Q7Ci0KLSAgICBDRlhfQnl0ZVN0cmluZyBEdXBsZXgoKSBjb25zdDsKLQotcHJvdGVjdGVkOgotICAgIENQREZfRG9jdW1lbnQqCW1fcERvYzsKKyAgc3RkOjptYXA8RlhfRFdPUkQsIHN0ZDo6dmVjdG9yPENQREZfRGljdGlvbmFyeSo+PiBtX1BhZ2VNYXA7CiB9OwotY2xhc3MgQ1BERl9BcFNldHRpbmdzIAotewotcHVibGljOgogCi0gICAgQ1BERl9BcFNldHRpbmdzKENQREZfRGljdGlvbmFyeSogcERpY3QgPSBOVUxMKQotICAgIHsKLSAgICAgICAgbV9wRGljdCA9IHBEaWN0OwotICAgIH0KK2NsYXNzIENQREZfTGluayB7CisgcHVibGljOgorICBDUERGX0xpbmsoKSA6IG1fcERpY3QobnVsbHB0cikge30KKyAgZXhwbGljaXQgQ1BERl9MaW5rKENQREZfRGljdGlvbmFyeSogcERpY3QpIDogbV9wRGljdChwRGljdCkge30KIAotICAgIG9wZXJhdG9yIENQREZfRGljdGlvbmFyeSogKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEaWN0OwotICAgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBHZXREaWN0KCkgY29uc3QgeyByZXR1cm4gbV9wRGljdDsgfQogCi0gICAgRlhfQk9PTAkJCQkJSGFzTUtFbnRyeShGWF9CU1RSIGNzRW50cnkpOworICBDRlhfRmxvYXRSZWN0IEdldFJlY3QoKTsKKyAgQ1BERl9EZXN0IEdldERlc3QoQ1BERl9Eb2N1bWVudCogcERvYyk7CisgIENQREZfQWN0aW9uIEdldEFjdGlvbigpOwogCi0KLQotICAgIGludAkJCQkJCUdldFJvdGF0aW9uKCk7Ci0KLQotCi0KLSAgICBpbmxpbmUgRlhfQVJHQgkJCUdldEJvcmRlckNvbG9yKGludCYgaUNvbG9yVHlwZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBHZXRDb2xvcihpQ29sb3JUeXBlLCBGWF9CU1RSQygiQkMiKSk7Ci0gICAgfQotCi0gICAgaW5saW5lIEZYX0ZMT0FUCQkJR2V0T3JpZ2luYWxCb3JkZXJDb2xvcihpbnQgaW5kZXgpCi0gICAgewotICAgICAgICByZXR1cm4gR2V0T3JpZ2luYWxDb2xvcihpbmRleCwgRlhfQlNUUkMoIkJDIikpOwotICAgIH0KLQotICAgIGlubGluZSB2b2lkCQkJCUdldE9yaWdpbmFsQm9yZGVyQ29sb3IoaW50JiBpQ29sb3JUeXBlLCBGWF9GTE9BVCBmY1s0XSkKLSAgICB7Ci0gICAgICAgIEdldE9yaWdpbmFsQ29sb3IoaUNvbG9yVHlwZSwgZmMsIEZYX0JTVFJDKCJCQyIpKTsKLSAgICB9Ci0KLQotCi0KLSAgICBpbmxpbmUgRlhfQVJHQgkJCUdldEJhY2tncm91bmRDb2xvcihpbnQmIGlDb2xvclR5cGUpCi0gICAgewotICAgICAgICByZXR1cm4gR2V0Q29sb3IoaUNvbG9yVHlwZSwgRlhfQlNUUkMoIkJHIikpOwotICAgIH0KLQotICAgIGlubGluZSBGWF9GTE9BVAkJCUdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKGludCBpbmRleCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBHZXRPcmlnaW5hbENvbG9yKGluZGV4LCBGWF9CU1RSQygiQkciKSk7Ci0gICAgfQotCi0gICAgaW5saW5lIHZvaWQJCQkJR2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoaW50JiBpQ29sb3JUeXBlLCBGWF9GTE9BVCBmY1s0XSkKLSAgICB7Ci0gICAgICAgIEdldE9yaWdpbmFsQ29sb3IoaUNvbG9yVHlwZSwgZmMsIEZYX0JTVFJDKCJCRyIpKTsKLSAgICB9Ci0KLQotCi0KLSAgICBpbmxpbmUgQ0ZYX1dpZGVTdHJpbmcJR2V0Tm9ybWFsQ2FwdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gR2V0Q2FwdGlvbihGWF9CU1RSQygiQ0EiKSk7Ci0gICAgfQotCi0KLQotCi0gICAgaW5saW5lIENGWF9XaWRlU3RyaW5nCUdldFJvbGxvdmVyQ2FwdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gR2V0Q2FwdGlvbihGWF9CU1RSQygiUkMiKSk7Ci0gICAgfQotCi0KLQotCi0gICAgaW5saW5lIENGWF9XaWRlU3RyaW5nCUdldERvd25DYXB0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBHZXRDYXB0aW9uKEZYX0JTVFJDKCJBQyIpKTsKLSAgICB9Ci0KLQotCi0KLSAgICBpbmxpbmUgQ1BERl9TdHJlYW0qCQlHZXROb3JtYWxJY29uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBHZXRJY29uKEZYX0JTVFJDKCJJIikpOwotICAgIH0KLQotCi0KLQotICAgIGlubGluZSBDUERGX1N0cmVhbSoJCUdldFJvbGxvdmVySWNvbigpCi0gICAgewotICAgICAgICByZXR1cm4gR2V0SWNvbihGWF9CU1RSQygiUkkiKSk7Ci0gICAgfQotCi0KLQotCi0gICAgaW5saW5lIENQREZfU3RyZWFtKgkJR2V0RG93bkljb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdldEljb24oRlhfQlNUUkMoIklYIikpOwotICAgIH0KLQotCi0KLQotICAgIENQREZfSWNvbkZpdAkJCUdldEljb25GaXQoKTsKLQotCi0KLQotICAgIGludAkJCQkJCUdldFRleHRQb3NpdGlvbigpOwotCi0gICAgQ1BERl9EaWN0aW9uYXJ5KgkJbV9wRGljdDsKLXByb3RlY3RlZDoKLQotICAgIEZYX0FSR0IJCQkJCUdldENvbG9yKGludCYgaUNvbG9yVHlwZSwgRlhfQlNUUiBjc0VudHJ5KTsKLQotICAgIEZYX0ZMT0FUCQkJCUdldE9yaWdpbmFsQ29sb3IoaW50IGluZGV4LCBGWF9CU1RSIGNzRW50cnkpOwotCi0gICAgdm9pZAkJCQkJR2V0T3JpZ2luYWxDb2xvcihpbnQmIGlDb2xvclR5cGUsIEZYX0ZMT0FUIGZjWzRdLCBGWF9CU1RSIGNzRW50cnkpOwotCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlHZXRDYXB0aW9uKEZYX0JTVFIgY3NFbnRyeSk7Ci0KLSAgICBDUERGX1N0cmVhbSoJCQlHZXRJY29uKEZYX0JTVFIgY3NFbnRyeSk7Ci0gICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9Gb3JtQ29udHJvbDsKKyBwcm90ZWN0ZWQ6CisgIENQREZfRGljdGlvbmFyeSogbV9wRGljdDsKIH07CiAKKyNkZWZpbmUgQU5OT1RGTEFHX0lOVklTSUJMRSAweDAwMDEKKyNkZWZpbmUgQU5OT1RGTEFHX0hJRERFTiAweDAwMDIKKyNkZWZpbmUgQU5OT1RGTEFHX1BSSU5UIDB4MDAwNAorI2RlZmluZSBBTk5PVEZMQUdfTk9aT09NIDB4MDAwOAorI2RlZmluZSBBTk5PVEZMQUdfTk9ST1RBVEUgMHgwMDEwCisjZGVmaW5lIEFOTk9URkxBR19OT1ZJRVcgMHgwMDIwCisjZGVmaW5lIEFOTk9URkxBR19SRUFET05MWSAweDAwNDAKKyNkZWZpbmUgQU5OT1RGTEFHX0xPQ0tFRCAweDAwODAKKyNkZWZpbmUgQU5OT1RGTEFHX1RPR0dMRU5PVklFVyAweDAxMDAKKworY2xhc3MgQ1BERl9Bbm5vdCA6IHB1YmxpYyBDRlhfUHJpdmF0ZURhdGEgeworIHB1YmxpYzoKKyAgZW51bSBBcHBlYXJhbmNlTW9kZSB7IE5vcm1hbCwgUm9sbG92ZXIsIERvd24gfTsKKworICBDUERGX0Fubm90KENQREZfRGljdGlvbmFyeSogcERpY3QsIENQREZfQW5ub3RMaXN0KiBwTGlzdCk7CisgIH5DUERGX0Fubm90KCk7CisKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0U3ViVHlwZSgpIGNvbnN0OworCisgIEZYX0RXT1JEIEdldEZsYWdzKCkgY29uc3Q7CisKKyAgdm9pZCBHZXRSZWN0KENGWF9GbG9hdFJlY3QmIHJlY3QpIGNvbnN0OworCisgIGNvbnN0IENQREZfRGljdGlvbmFyeSogR2V0QW5ub3REaWN0KCkgY29uc3QgeyByZXR1cm4gbV9wQW5ub3REaWN0OyB9CisgIENQREZfRGljdGlvbmFyeSogR2V0QW5ub3REaWN0KCkgeyByZXR1cm4gbV9wQW5ub3REaWN0OyB9CisKKyAgRlhfQk9PTCBEcmF3QXBwZWFyYW5jZShDUERGX1BhZ2UqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGVhcmFuY2VNb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyk7CisKKyAgRlhfQk9PTCBEcmF3SW5Db250ZXh0KGNvbnN0IENQREZfUGFnZSogcFBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgQXBwZWFyYW5jZU1vZGUgbW9kZSk7CisKKyAgdm9pZCBDbGVhckNhY2hlZEFQKCk7CisKKyAgdm9pZCBEcmF3Qm9yZGVyKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKTsKKworICBDUERGX0Zvcm0qIEdldEFQRm9ybShjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBBcHBlYXJhbmNlTW9kZSBtb2RlKTsKKworIHByaXZhdGU6CisgIENQREZfRGljdGlvbmFyeSogY29uc3QgbV9wQW5ub3REaWN0OworICBDUERGX0Fubm90TGlzdCogY29uc3QgbV9wTGlzdDsKKyAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcgbV9zU3VidHlwZTsKKyAgc3RkOjptYXA8Q1BERl9TdHJlYW0qLCBDUERGX0Zvcm0qPiBtX0FQTWFwOworfTsKKworY2xhc3MgQ1BERl9Bbm5vdExpc3QgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1BERl9Bbm5vdExpc3QoQ1BERl9QYWdlKiBwUGFnZSk7CisgIH5DUERGX0Fubm90TGlzdCgpOworCisgIHZvaWQgRGlzcGxheUFubm90cyhDUERGX1BhZ2UqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlByaW50aW5nLAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNob3dXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKSB7CisgICAgRGlzcGxheUFubm90cyhwUGFnZSwgbnVsbHB0ciwgcENvbnRleHQsIGJQcmludGluZywgcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgIGJTaG93V2lkZ2V0ID8gMyA6IDEsIHBPcHRpb25zLCBudWxscHRyKTsKKyAgfQorICB2b2lkIERpc3BsYXlBbm5vdHMoQ1BERl9QYWdlKiBwUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJpbnRpbmcsCisgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdBbm5vdEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QqIHBDbGlwUmVjdCk7CisgIHNpemVfdCBDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fQW5ub3RMaXN0LnNpemUoKTsgfQorICBDUERGX0Fubm90KiBHZXRBdChzaXplX3QgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fQW5ub3RMaXN0W2luZGV4XTsgfQorICBjb25zdCBzdGQ6OnZlY3RvcjxDUERGX0Fubm90Kj4mIEFsbCgpIGNvbnN0IHsgcmV0dXJuIG1fQW5ub3RMaXN0OyB9CisgIENQREZfRG9jdW1lbnQqIEdldERvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9wRG9jdW1lbnQ7IH0KKworIHByb3RlY3RlZDoKKyAgdm9pZCBEaXNwbGF5UGFzcyhDUERGX1BhZ2UqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcmludGluZywKKyAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYldpZGdldCwKKyAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLAorICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QqIGNsaXBfcmVjdCk7CisKKyAgQ1BERl9Eb2N1bWVudCogY29uc3QgbV9wRG9jdW1lbnQ7CisgIHN0ZDo6dmVjdG9yPENQREZfQW5ub3QqPiBtX0Fubm90TGlzdDsKK307CisKKyNkZWZpbmUgQ09MT1JUWVBFX1RSQU5TUEFSRU5UIDAKKyNkZWZpbmUgQ09MT1JUWVBFX0dSQVkgMQorI2RlZmluZSBDT0xPUlRZUEVfUkdCIDIKKyNkZWZpbmUgQ09MT1JUWVBFX0NNWUsgMworY2xhc3MgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSB7CisgcHVibGljOgorICAvLyBUT0RPKHRoZXN0aWcpOiBFeGFtaW5lIHdoeSB0aGlzIGNhbm5vdCBiZSBleHBsaWNpdC4KKyAgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NEQSA9ICIiKSB7IG1fY3NEQSA9IGNzREE7IH0KKworICBDUERGX0RlZmF1bHRBcHBlYXJhbmNlKGNvbnN0IENQREZfRGVmYXVsdEFwcGVhcmFuY2UmIGNEQSkgeworICAgIG1fY3NEQSA9IChDRlhfQnl0ZVN0cmluZykoQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSYpY0RBOworICB9CisKKyAgb3BlcmF0b3IgQ0ZYX0J5dGVTdHJpbmcoKSBjb25zdCB7IHJldHVybiBtX2NzREE7IH0KKworICBjb25zdCBDUERGX0RlZmF1bHRBcHBlYXJhbmNlJiBvcGVyYXRvcj0oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzREEpIHsKKyAgICBtX2NzREEgPSBjc0RBOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IENQREZfRGVmYXVsdEFwcGVhcmFuY2UmIG9wZXJhdG9yPShjb25zdCBDUERGX0RlZmF1bHRBcHBlYXJhbmNlJiBjREEpIHsKKyAgICBtX2NzREEgPSAoQ0ZYX0J5dGVTdHJpbmcpKENQREZfRGVmYXVsdEFwcGVhcmFuY2UmKWNEQTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBGWF9CT09MIEhhc0ZvbnQoKTsKKworICBDRlhfQnl0ZVN0cmluZyBHZXRGb250U3RyaW5nKCk7CisKKyAgdm9pZCBHZXRGb250KENGWF9CeXRlU3RyaW5nJiBjc0ZvbnROYW1lVGFnLCBGWF9GTE9BVCYgZkZvbnRTaXplKTsKKworICBGWF9CT09MIEhhc0NvbG9yKEZYX0JPT0wgYlN0cm9raW5nT3BlcmF0aW9uID0gRkFMU0UpOworCisgIENGWF9CeXRlU3RyaW5nIEdldENvbG9yU3RyaW5nKEZYX0JPT0wgYlN0cm9raW5nT3BlcmF0aW9uID0gRkFMU0UpOworCisgIHZvaWQgR2V0Q29sb3IoaW50JiBpQ29sb3JUeXBlLAorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZjWzRdLAorICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0cm9raW5nT3BlcmF0aW9uID0gRkFMU0UpOworCisgIHZvaWQgR2V0Q29sb3IoRlhfQVJHQiYgY29sb3IsCisgICAgICAgICAgICAgICAgaW50JiBpQ29sb3JUeXBlLAorICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0cm9raW5nT3BlcmF0aW9uID0gRkFMU0UpOworCisgIEZYX0JPT0wgSGFzVGV4dE1hdHJpeCgpOworCisgIENGWF9CeXRlU3RyaW5nIEdldFRleHRNYXRyaXhTdHJpbmcoKTsKKworICBDRlhfTWF0cml4IEdldFRleHRNYXRyaXgoKTsKKworIHByb3RlY3RlZDoKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9jc0RBOworfTsKKyNkZWZpbmUgRklFTERUWVBFX1VOS05PV04gMAorI2RlZmluZSBGSUVMRFRZUEVfUFVTSEJVVFRPTiAxCisjZGVmaW5lIEZJRUxEVFlQRV9DSEVDS0JPWCAyCisjZGVmaW5lIEZJRUxEVFlQRV9SQURJT0JVVFRPTiAzCisjZGVmaW5lIEZJRUxEVFlQRV9DT01CT0JPWCA0CisjZGVmaW5lIEZJRUxEVFlQRV9MSVNUQk9YIDUKKyNkZWZpbmUgRklFTERUWVBFX1RFWFRGSUVMRCA2CisjZGVmaW5lIEZJRUxEVFlQRV9TSUdOQVRVUkUgNworY2xhc3MgQ1BERl9JbnRlckZvcm0gOiBwdWJsaWMgQ0ZYX1ByaXZhdGVEYXRhIHsKKyBwdWJsaWM6CisgIENQREZfSW50ZXJGb3JtKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgRlhfQk9PTCBiVXBkYXRlQVApOworICB+Q1BERl9JbnRlckZvcm0oKTsKKworICBzdGF0aWMgdm9pZCBFbmFibGVVcGRhdGVBUChGWF9CT09MIGJVcGRhdGVBUCk7CisKKyAgc3RhdGljIEZYX0JPT0wgVXBkYXRpbmdBUEVuYWJsZWQoKTsKKworICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2VuZXJhdGVOZXdSZXNvdXJjZU5hbWUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGNzVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpTWluTGVuID0gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGNzUHJlZml4ID0gIiIpOworCisgIHN0YXRpYyBDUERGX0ZvbnQqIEFkZFN0YW5kYXJkRm9udChDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lKTsKKworICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0TmF0aXZlRm9udCh1aW50OF90IGlDaGFyU2V0LCB2b2lkKiBwTG9nRm9udCA9IE5VTEwpOworCisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXROYXRpdmVGb250KHZvaWQqIHBMb2dGb250ID0gTlVMTCk7CisKKyAgc3RhdGljIHVpbnQ4X3QgR2V0TmF0aXZlQ2hhclNldCgpOworCisgIHN0YXRpYyBDUERGX0ZvbnQqIEFkZE5hdGl2ZUZvbnQodWludDhfdCBpQ2hhclNldCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KTsKKworICBzdGF0aWMgQ1BERl9Gb250KiBBZGROYXRpdmVGb250KENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisKKyAgRlhfQk9PTCBWYWxpZGF0ZUZpZWxkTmFtZShDRlhfV2lkZVN0cmluZyYgY3NOZXdGaWVsZE5hbWUsIGludCBpVHlwZSk7CisKKyAgRlhfQk9PTCBWYWxpZGF0ZUZpZWxkTmFtZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSk7CisKKyAgRlhfQk9PTCBWYWxpZGF0ZUZpZWxkTmFtZShjb25zdCBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgY3NOZXdGaWVsZE5hbWUpOworCisgIEZYX0RXT1JEIENvdW50RmllbGRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSA9IEwiIik7CisKKyAgQ1BERl9Gb3JtRmllbGQqIEdldEZpZWxkKEZYX0RXT1JEIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lID0gTCIiKTsKKworICB2b2lkIEdldEFsbEZpZWxkTmFtZXMoQ0ZYX1dpZGVTdHJpbmdBcnJheSYgYWxsRmllbGROYW1lcyk7CisKKyAgQ1BERl9Gb3JtRmllbGQqIEdldEZpZWxkQnlEaWN0KENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCkgY29uc3Q7CisKKyAgQ1BERl9Gb3JtQ29udHJvbCogR2V0Q29udHJvbEF0UG9pbnQoQ1BERl9QYWdlKiBwUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcGRmX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHBkZl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHpfb3JkZXIpIGNvbnN0OworCisgIENQREZfRm9ybUNvbnRyb2wqIEdldENvbnRyb2xCeURpY3QoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwV2lkZ2V0RGljdCkgY29uc3Q7CisKKyAgQ1BERl9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BEb2N1bWVudDsgfQorCisgIENQREZfRGljdGlvbmFyeSogR2V0Rm9ybURpY3QoKSBjb25zdCB7IHJldHVybiBtX3BGb3JtRGljdDsgfQorCisgIEZYX0JPT0wgTmVlZENvbnN0cnVjdEFQKCk7CisKKyAgdm9pZCBOZWVkQ29uc3RydWN0QVAoRlhfQk9PTCBiTmVlZEFQKTsKKworICBpbnQgQ291bnRGaWVsZHNJbkNhbGN1bGF0aW9uT3JkZXIoKTsKKworICBDUERGX0Zvcm1GaWVsZCogR2V0RmllbGRJbkNhbGN1bGF0aW9uT3JkZXIoaW50IGluZGV4KTsKKworICBpbnQgRmluZEZpZWxkSW5DYWxjdWxhdGlvbk9yZGVyKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQpOworCisgIEZYX0RXT1JEIENvdW50Rm9ybUZvbnRzKCk7CisKKyAgQ1BERl9Gb250KiBHZXRGb3JtRm9udChGWF9EV09SRCBpbmRleCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7CisKKyAgQ1BERl9Gb250KiBHZXRGb3JtRm9udChDRlhfQnl0ZVN0cmluZyBjc05hbWVUYWcpOworCisgIENQREZfRm9udCogR2V0Rm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7CisKKyAgQ1BERl9Gb250KiBHZXROYXRpdmVGb3JtRm9udCh1aW50OF90IGlDaGFyU2V0LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKKworICBDUERGX0ZvbnQqIEdldE5hdGl2ZUZvcm1Gb250KENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOworCisgIEZYX0JPT0wgRmluZEZvcm1Gb250KGNvbnN0IENQREZfRm9udCogcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOworCisgIEZYX0JPT0wgRmluZEZvcm1Gb250KENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udComIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKKworICBpbmxpbmUgRlhfQk9PTCBGaW5kRm9ybUZvbnQoQ0ZYX1dpZGVTdHJpbmcgY3NGb250TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udComIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykgeworICAgIHJldHVybiBGaW5kRm9ybUZvbnQoUERGX0VuY29kZVRleHQoY3NGb250TmFtZSksIHBGb250LCBjc05hbWVUYWcpOworICB9CisKKyAgdm9pZCBBZGRGb3JtRm9udChjb25zdCBDUERGX0ZvbnQqIHBGb250LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKKworICBDUERGX0ZvbnQqIEFkZE5hdGl2ZUZvcm1Gb250KHVpbnQ4X3QgaUNoYXJTZXQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOworCisgIENQREZfRm9udCogQWRkTmF0aXZlRm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7CisKKyAgdm9pZCBSZW1vdmVGb3JtRm9udChjb25zdCBDUERGX0ZvbnQqIHBGb250KTsKKworICB2b2lkIFJlbW92ZUZvcm1Gb250KENGWF9CeXRlU3RyaW5nIGNzTmFtZVRhZyk7CisKKyAgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSBHZXREZWZhdWx0QXBwZWFyYW5jZSgpOworCisgIENQREZfRm9udCogR2V0RGVmYXVsdEZvcm1Gb250KCk7CisKKyAgaW50IEdldEZvcm1BbGlnbm1lbnQoKTsKKworICBDUERGX0Zvcm1GaWVsZCogQ2hlY2tSZXF1aXJlZEZpZWxkcygKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4qIGZpZWxkcywKKyAgICAgIGJvb2wgYkluY2x1ZGVPckV4Y2x1ZGUpIGNvbnN0OworCisgIENGREZfRG9jdW1lbnQqIEV4cG9ydFRvRkRGKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgcGRmX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNpbXBsZUZpbGVTcGVjID0gZmFsc2UpIGNvbnN0OworCisgIENGREZfRG9jdW1lbnQqIEV4cG9ydFRvRkRGKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgcGRmX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4mIGZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSW5jbHVkZU9yRXhjbHVkZSA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNpbXBsZUZpbGVTcGVjID0gZmFsc2UpIGNvbnN0OworCisgIEZYX0JPT0wgSW1wb3J0RnJvbUZERihjb25zdCBDRkRGX0RvY3VtZW50KiBwRkRGRG9jLCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7CisKKyAgYm9vbCBSZXNldEZvcm0oY29uc3Qgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiYgZmllbGRzLAorICAgICAgICAgICAgICAgICBib29sIGJJbmNsdWRlT3JFeGNsdWRlID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5ID0gZmFsc2UpOworCisgIGJvb2wgUmVzZXRGb3JtKGJvb2wgYk5vdGlmeSA9IGZhbHNlKTsKKworICBDUERGX0Zvcm1Ob3RpZnkqIEdldEZvcm1Ob3RpZnkoKSBjb25zdCB7IHJldHVybiBtX3BGb3JtTm90aWZ5OyB9CisKKyAgdm9pZCBTZXRGb3JtTm90aWZ5KGNvbnN0IENQREZfRm9ybU5vdGlmeSogcE5vdGlmeSk7CisKKyAgRlhfQk9PTCBJc1VwZGF0ZWQoKSB7IHJldHVybiBtX2JVcGRhdGVkOyB9CisKKyAgdm9pZCBDbGVhclVwZGF0ZWRGbGFnKCkgeyBtX2JVcGRhdGVkID0gRkFMU0U7IH0KKworICBGWF9CT09MIEhhc1hGQUZvcm0oKSBjb25zdDsKKworICB2b2lkIEZpeFBhZ2VGaWVsZHMoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSk7CisKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyBGWF9CT09MIG1fYlVwZGF0ZUFQOworCisgIHZvaWQgTG9hZEZpZWxkKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCwgaW50IG5MZXZlbCA9IDApOworCisgIENQREZfT2JqZWN0KiBHZXRGaWVsZEF0dHIoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0LCBjb25zdCBGWF9DSEFSKiBuYW1lKTsKKworICBDUERGX0Zvcm1GaWVsZCogQWRkVGVybWluYWxGaWVsZChDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpOworCisgIENQREZfRm9ybUNvbnRyb2wqIEFkZENvbnRyb2woY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBXaWRnZXREaWN0KTsKKworICB2b2lkIEZERl9JbXBvcnRGaWVsZChDUERGX0RpY3Rpb25hcnkqIHBGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHBhcmVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG5MZXZlbCA9IDApOworCisgIEZYX0JPT0wgVmFsaWRhdGVGaWVsZE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0Zvcm1GaWVsZCogcEV4Y2x1ZGVkRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Gb3JtQ29udHJvbCogcEV4Y2x1ZGVkQ29udHJvbCk7CisKKyAgaW50IENvbXBhcmVGaWVsZE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG5hbWUxLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgbmFtZTIpOworCisgIGludCBDb21wYXJlRmllbGROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lMSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUyKTsKKworICBDUERGX0RvY3VtZW50KiBjb25zdCBtX3BEb2N1bWVudDsKKworICBGWF9CT09MIG1fYkdlbmVyYXRlQVA7CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BGb3JtRGljdDsKKworICBzdGQ6Om1hcDxjb25zdCBDUERGX0RpY3Rpb25hcnkqLCBDUERGX0Zvcm1Db250cm9sKj4gbV9Db250cm9sTWFwOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDRmllbGRUcmVlPiBtX3BGaWVsZFRyZWU7CisKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9ic0VuY29kaW5nOworCisgIENQREZfRm9ybU5vdGlmeSogbV9wRm9ybU5vdGlmeTsKKworICBGWF9CT09MIG1fYlVwZGF0ZWQ7CisgIGZyaWVuZCBjbGFzcyBDUERGX0Zvcm1Db250cm9sOworICBmcmllbmQgY2xhc3MgQ1BERl9Gb3JtRmllbGQ7Cit9OworI2RlZmluZSBGT1JNRklFTERfUkVBRE9OTFkgMHgwMQorI2RlZmluZSBGT1JNRklFTERfUkVRVUlSRUQgMHgwMgorI2RlZmluZSBGT1JNRklFTERfTk9FWFBPUlQgMHgwNAorI2RlZmluZSBGT1JNUkFESU9fTk9UT0dHTEVPRkYgMHgxMDAKKyNkZWZpbmUgRk9STVJBRElPX1VOSVNPTiAweDIwMAorI2RlZmluZSBGT1JNVEVYVF9NVUxUSUxJTkUgMHgxMDAKKyNkZWZpbmUgRk9STVRFWFRfUEFTU1dPUkQgMHgyMDAKKyNkZWZpbmUgRk9STVRFWFRfTk9TQ1JPTEwgMHg0MDAKKyNkZWZpbmUgRk9STVRFWFRfQ09NQiAweDgwMAorI2RlZmluZSBGT1JNQ09NQk9fRURJVCAweDEwMAorI2RlZmluZSBGT1JNTElTVF9NVUxUSVNFTEVDVCAweDEwMAorY2xhc3MgQ1BERl9Gb3JtRmllbGQgeworIHB1YmxpYzoKKyAgZW51bSBUeXBlIHsKKyAgICBVbmtub3duLAorICAgIFB1c2hCdXR0b24sCisgICAgUmFkaW9CdXR0b24sCisgICAgQ2hlY2tCb3gsCisgICAgVGV4dCwKKyAgICBSaWNoVGV4dCwKKyAgICBGaWxlLAorICAgIExpc3RCb3gsCisgICAgQ29tYm9Cb3gsCisgICAgU2lnbgorICB9OworCisgIENGWF9XaWRlU3RyaW5nIEdldEZ1bGxOYW1lKCk7CisKKyAgVHlwZSBHZXRUeXBlKCkgeyByZXR1cm4gbV9UeXBlOyB9CisKKyAgRlhfRFdPUkQgR2V0RmxhZ3MoKSB7IHJldHVybiBtX0ZsYWdzOyB9CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBHZXRGaWVsZERpY3QoKSBjb25zdCB7IHJldHVybiBtX3BEaWN0OyB9CisKKyAgdm9pZCBTZXRGaWVsZERpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgeyBtX3BEaWN0ID0gcERpY3Q7IH0KKworICBGWF9CT09MIFJlc2V0RmllbGQoRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOworCisgIGludCBDb3VudENvbnRyb2xzKCkgeyByZXR1cm4gbV9Db250cm9sTGlzdC5HZXRTaXplKCk7IH0KKworICBDUERGX0Zvcm1Db250cm9sKiBHZXRDb250cm9sKGludCBpbmRleCkgeyByZXR1cm4gbV9Db250cm9sTGlzdC5HZXRBdChpbmRleCk7IH0KKworICBpbnQgR2V0Q29udHJvbEluZGV4KGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sKTsKKworICBpbnQgR2V0RmllbGRUeXBlKCk7CisKKyAgQ1BERl9BQWN0aW9uIEdldEFkZGl0aW9uYWxBY3Rpb24oKTsKKworICBDRlhfV2lkZVN0cmluZyBHZXRBbHRlcm5hdGVOYW1lKCk7CisKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0TWFwcGluZ05hbWUoKTsKKworICBGWF9EV09SRCBHZXRGaWVsZEZsYWdzKCk7CisKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0RGVmYXVsdFN0eWxlKCk7CisKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0UmljaFRleHRTdHJpbmcoKTsKKworICBDRlhfV2lkZVN0cmluZyBHZXRWYWx1ZSgpOworCisgIENGWF9XaWRlU3RyaW5nIEdldERlZmF1bHRWYWx1ZSgpOworCisgIEZYX0JPT0wgU2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7CisKKyAgaW50IEdldE1heExlbigpOworCisgIGludCBDb3VudFNlbGVjdGVkSXRlbXMoKTsKKworICBpbnQgR2V0U2VsZWN0ZWRJbmRleChpbnQgaW5kZXgpOworCisgIEZYX0JPT0wgQ2xlYXJTZWxlY3Rpb24oRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOworCisgIEZYX0JPT0wgSXNJdGVtU2VsZWN0ZWQoaW50IGluZGV4KTsKKworICBGWF9CT09MIFNldEl0ZW1TZWxlY3Rpb24oaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2VsZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7CisKKyAgRlhfQk9PTCBJc0l0ZW1EZWZhdWx0U2VsZWN0ZWQoaW50IGluZGV4KTsKKworICBpbnQgR2V0RGVmYXVsdFNlbGVjdGVkSXRlbSgpOworCisgIGludCBDb3VudE9wdGlvbnMoKTsKKworICBDRlhfV2lkZVN0cmluZyBHZXRPcHRpb25MYWJlbChpbnQgaW5kZXgpOworCisgIENGWF9XaWRlU3RyaW5nIEdldE9wdGlvblZhbHVlKGludCBpbmRleCk7CisKKyAgaW50IEZpbmRPcHRpb24oQ0ZYX1dpZGVTdHJpbmcgY3NPcHRMYWJlbCk7CisKKyAgaW50IEZpbmRPcHRpb25WYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NPcHRWYWx1ZSwgaW50IGlTdGFydEluZGV4ID0gMCk7CisKKyAgRlhfQk9PTCBDaGVja0NvbnRyb2woaW50IGlDb250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoZWNrZWQsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsKKworICBpbnQgR2V0VG9wVmlzaWJsZUluZGV4KCk7CisKKyAgaW50IENvdW50U2VsZWN0ZWRPcHRpb25zKCk7CisKKyAgaW50IEdldFNlbGVjdGVkT3B0aW9uSW5kZXgoaW50IGluZGV4KTsKKworICBGWF9CT09MIElzT3B0aW9uU2VsZWN0ZWQoaW50IGlPcHRJbmRleCk7CisKKyAgRlhfQk9PTCBTZWxlY3RPcHRpb24oaW50IGlPcHRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2VsZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsKKworICBGWF9CT09MIENsZWFyU2VsZWN0ZWRPcHRpb25zKEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIEZYX0JPT0wgQ2xlYXJPcHRpb25zKEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsKKworICBpbnQgSW5zZXJ0T3B0aW9uKENGWF9XaWRlU3RyaW5nIGNzT3B0TGFiZWwsCisgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gLTEsCisgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCisgIEZYX0ZMT0FUIEdldEZvbnRTaXplKCkgeyByZXR1cm4gbV9Gb250U2l6ZTsgfQorCisgIENQREZfRm9udCogR2V0Rm9udCgpIHsgcmV0dXJuIG1fcEZvbnQ7IH0KKworIHByb3RlY3RlZDoKKyAgQ1BERl9Gb3JtRmllbGQoQ1BERl9JbnRlckZvcm0qIHBGb3JtLCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKKyAgfkNQREZfRm9ybUZpZWxkKCk7CisKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0VmFsdWUoRlhfQk9PTCBiRGVmYXVsdCk7CisKKyAgRlhfQk9PTCBTZXRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkpOworCisgIHZvaWQgU3luY0ZpZWxkRmxhZ3MoKTsKKworICBpbnQgRmluZExpc3RTZWwoQ1BERl9TdHJpbmcqIHN0cik7CisKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0T3B0aW9uVGV4dChpbnQgaW5kZXgsIGludCBzdWJfaW5kZXgpOworCisgIHZvaWQgTG9hZERBKCk7CisKKyAgdm9pZCBVcGRhdGVBUChDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCk7CisKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0Q2hlY2tWYWx1ZShGWF9CT09MIGJEZWZhdWx0KTsKKworICBGWF9CT09MIFNldENoZWNrVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSk7CisKKyAgQ1BERl9Gb3JtRmllbGQ6OlR5cGUgbV9UeXBlOworICBGWF9EV09SRCBtX0ZsYWdzOworICBDUERGX0ludGVyRm9ybSogbV9wRm9ybTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BEaWN0OworICBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX0Zvcm1Db250cm9sKj4gbV9Db250cm9sTGlzdDsKKyAgRlhfRkxPQVQgbV9Gb250U2l6ZTsKKyAgQ1BERl9Gb250KiBtX3BGb250OworCisgIGZyaWVuZCBjbGFzcyBDUERGX0ludGVyRm9ybTsKKyAgZnJpZW5kIGNsYXNzIENQREZfRm9ybUNvbnRyb2w7Cit9OworQ1BERl9PYmplY3QqIEZQREZfR2V0RmllbGRBdHRyKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuTGV2ZWwgPSAwKTsKK2NsYXNzIENQREZfSWNvbkZpdCB7CisgcHVibGljOgorICAvLyBUT0RPKHRoZXN0aWcpOiBFeGFtaW5lIHdoeSB0aGlzIGNhbm5vdCBiZSBleHBsaWNpdC4KKyAgQ1BERl9JY29uRml0KENQREZfRGljdGlvbmFyeSogcERpY3QgPSBOVUxMKSB7IG1fcERpY3QgPSBwRGljdDsgfQorCisgIG9wZXJhdG9yIENQREZfRGljdGlvbmFyeSooKSBjb25zdCB7IHJldHVybiBtX3BEaWN0OyB9CisKKyAgZW51bSBTY2FsZU1ldGhvZCB7IEFsd2F5cyA9IDAsIEJpZ2dlciwgU21hbGxlciwgTmV2ZXIgfTsKKworICBTY2FsZU1ldGhvZCBHZXRTY2FsZU1ldGhvZCgpOworCisgIEZYX0JPT0wgSXNQcm9wb3J0aW9uYWxTY2FsZSgpOworCisgIHZvaWQgR2V0SWNvblBvc2l0aW9uKEZYX0ZMT0FUJiBmTGVmdCwgRlhfRkxPQVQmIGZCb3R0b20pOworCisgIEZYX0JPT0wgR2V0Rml0dGluZ0JvdW5kcygpOworCisgIENQREZfRGljdGlvbmFyeSogbV9wRGljdDsKK307CisKKyNkZWZpbmUgVEVYVFBPU19DQVBUSU9OIDAKKyNkZWZpbmUgVEVYVFBPU19JQ09OIDEKKyNkZWZpbmUgVEVYVFBPU19CRUxPVyAyCisjZGVmaW5lIFRFWFRQT1NfQUJPVkUgMworI2RlZmluZSBURVhUUE9TX1JJR0hUIDQKKyNkZWZpbmUgVEVYVFBPU19MRUZUIDUKKyNkZWZpbmUgVEVYVFBPU19PVkVSTEFJRCA2CitjbGFzcyBDUERGX0Zvcm1Db250cm9sIHsKKyBwdWJsaWM6CisgIENQREZfRm9ybUZpZWxkOjpUeXBlIEdldFR5cGUoKSB7IHJldHVybiBtX3BGaWVsZC0+R2V0VHlwZSgpOyB9CisKKyAgQ1BERl9JbnRlckZvcm0qIEdldEludGVyRm9ybSgpIGNvbnN0IHsgcmV0dXJuIG1fcEZvcm07IH0KKworICBDUERGX0Zvcm1GaWVsZCogR2V0RmllbGQoKSBjb25zdCB7IHJldHVybiBtX3BGaWVsZDsgfQorCisgIENQREZfRGljdGlvbmFyeSogR2V0V2lkZ2V0KCkgY29uc3QgeyByZXR1cm4gbV9wV2lkZ2V0RGljdDsgfQorCisgIENGWF9GbG9hdFJlY3QgR2V0UmVjdCgpIGNvbnN0OworCisgIHZvaWQgRHJhd0NvbnRyb2woQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgIENQREZfUGFnZSogcFBhZ2UsCisgICAgICAgICAgICAgICAgICAgQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zID0gTlVMTCk7CisKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0Q2hlY2tlZEFQU3RhdGUoKTsKKworICBDRlhfV2lkZVN0cmluZyBHZXRFeHBvcnRWYWx1ZSgpOworCisgIEZYX0JPT0wgSXNDaGVja2VkKCk7CisKKyAgRlhfQk9PTCBJc0RlZmF1bHRDaGVja2VkKCk7CisKKyAgZW51bSBIaWdobGlnaHRpbmdNb2RlIHsgTm9uZSA9IDAsIEludmVydCwgT3V0bGluZSwgUHVzaCwgVG9nZ2xlIH07CisKKyAgSGlnaGxpZ2h0aW5nTW9kZSBHZXRIaWdobGlnaHRpbmdNb2RlKCk7CisKKyAgYm9vbCBIYXNNS0VudHJ5KENGWF9CeXRlU3RyaW5nIGNzRW50cnkpIGNvbnN0OworCisgIGludCBHZXRSb3RhdGlvbigpOworCisgIGlubGluZSBGWF9BUkdCIEdldEJvcmRlckNvbG9yKGludCYgaUNvbG9yVHlwZSkgeworICAgIHJldHVybiBHZXRDb2xvcihpQ29sb3JUeXBlLCAiQkMiKTsKKyAgfQorCisgIEZYX0ZMT0FUIEdldE9yaWdpbmFsQm9yZGVyQ29sb3IoaW50IGluZGV4KSB7CisgICAgcmV0dXJuIEdldE9yaWdpbmFsQ29sb3IoaW5kZXgsICJCQyIpOworICB9CisKKyAgdm9pZCBHZXRPcmlnaW5hbEJvcmRlckNvbG9yKGludCYgaUNvbG9yVHlwZSwgRlhfRkxPQVQgZmNbNF0pIHsKKyAgICBHZXRPcmlnaW5hbENvbG9yKGlDb2xvclR5cGUsIGZjLCAiQkMiKTsKKyAgfQorCisgIEZYX0FSR0IgR2V0QmFja2dyb3VuZENvbG9yKGludCYgaUNvbG9yVHlwZSkgeworICAgIHJldHVybiBHZXRDb2xvcihpQ29sb3JUeXBlLCAiQkciKTsKKyAgfQorCisgIEZYX0ZMT0FUIEdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKGludCBpbmRleCkgeworICAgIHJldHVybiBHZXRPcmlnaW5hbENvbG9yKGluZGV4LCAiQkciKTsKKyAgfQorCisgIHZvaWQgR2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoaW50JiBpQ29sb3JUeXBlLCBGWF9GTE9BVCBmY1s0XSkgeworICAgIEdldE9yaWdpbmFsQ29sb3IoaUNvbG9yVHlwZSwgZmMsICJCRyIpOworICB9CisKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0Tm9ybWFsQ2FwdGlvbigpIHsgcmV0dXJuIEdldENhcHRpb24oIkNBIik7IH0KKworICBDRlhfV2lkZVN0cmluZyBHZXRSb2xsb3ZlckNhcHRpb24oKSB7IHJldHVybiBHZXRDYXB0aW9uKCJSQyIpOyB9CisKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0RG93bkNhcHRpb24oKSB7IHJldHVybiBHZXRDYXB0aW9uKCJBQyIpOyB9CisKKyAgQ1BERl9TdHJlYW0qIEdldE5vcm1hbEljb24oKSB7IHJldHVybiBHZXRJY29uKCJJIik7IH0KKworICBDUERGX1N0cmVhbSogR2V0Um9sbG92ZXJJY29uKCkgeyByZXR1cm4gR2V0SWNvbigiUkkiKTsgfQorCisgIENQREZfU3RyZWFtKiBHZXREb3duSWNvbigpIHsgcmV0dXJuIEdldEljb24oIklYIik7IH0KKworICBDUERGX0ljb25GaXQgR2V0SWNvbkZpdCgpOworCisgIGludCBHZXRUZXh0UG9zaXRpb24oKTsKKworICBDUERGX0FjdGlvbiBHZXRBY3Rpb24oKTsKKworICBDUERGX0FBY3Rpb24gR2V0QWRkaXRpb25hbEFjdGlvbigpOworCisgIENQREZfRGVmYXVsdEFwcGVhcmFuY2UgR2V0RGVmYXVsdEFwcGVhcmFuY2UoKTsKKworICBDUERGX0ZvbnQqIEdldERlZmF1bHRDb250cm9sRm9udCgpOworCisgIGludCBHZXRDb250cm9sQWxpZ25tZW50KCk7CisKKyBwcm90ZWN0ZWQ6CisgIENQREZfRm9ybUNvbnRyb2woQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwgQ1BERl9EaWN0aW9uYXJ5KiBwV2lkZ2V0RGljdCk7CisKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0T25TdGF0ZU5hbWUoKTsKKworICB2b2lkIFNldE9uU3RhdGVOYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc09uKTsKKworICB2b2lkIENoZWNrQ29udHJvbChGWF9CT09MIGJDaGVja2VkKTsKKworICBGWF9BUkdCIEdldENvbG9yKGludCYgaUNvbG9yVHlwZSwgQ0ZYX0J5dGVTdHJpbmcgY3NFbnRyeSk7CisKKyAgRlhfRkxPQVQgR2V0T3JpZ2luYWxDb2xvcihpbnQgaW5kZXgsIENGWF9CeXRlU3RyaW5nIGNzRW50cnkpOworCisgIHZvaWQgR2V0T3JpZ2luYWxDb2xvcihpbnQmIGlDb2xvclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmY1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNzRW50cnkpOworCisgIENGWF9XaWRlU3RyaW5nIEdldENhcHRpb24oQ0ZYX0J5dGVTdHJpbmcgY3NFbnRyeSk7CisKKyAgQ1BERl9TdHJlYW0qIEdldEljb24oQ0ZYX0J5dGVTdHJpbmcgY3NFbnRyeSk7CisKKyAgQ1BERl9BcFNldHRpbmdzIEdldE1LKCkgY29uc3Q7CisKKyAgQ1BERl9JbnRlckZvcm0qIG1fcEZvcm07CisKKyAgQ1BERl9Gb3JtRmllbGQqIG1fcEZpZWxkOworCisgIENQREZfRGljdGlvbmFyeSogbV9wV2lkZ2V0RGljdDsKKyAgZnJpZW5kIGNsYXNzIENQREZfSW50ZXJGb3JtOworICBmcmllbmQgY2xhc3MgQ1BERl9Gb3JtRmllbGQ7Cit9OworY2xhc3MgQ1BERl9Gb3JtTm90aWZ5IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkNQREZfRm9ybU5vdGlmeSgpIHt9CisKKyAgdmlydHVhbCBpbnQgQmVmb3JlVmFsdWVDaGFuZ2UoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGNzVmFsdWUpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHZpcnR1YWwgaW50IEFmdGVyVmFsdWVDaGFuZ2UoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCkgeyByZXR1cm4gMDsgfQorCisgIHZpcnR1YWwgaW50IEJlZm9yZVNlbGVjdGlvbkNoYW5nZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGNzVmFsdWUpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHZpcnR1YWwgaW50IEFmdGVyU2VsZWN0aW9uQ2hhbmdlKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQpIHsgcmV0dXJuIDA7IH0KKworICB2aXJ0dWFsIGludCBBZnRlckNoZWNrZWRTdGF0dXNDaGFuZ2UoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlQXJyYXkmIHN0YXR1c0FycmF5KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB2aXJ0dWFsIGludCBCZWZvcmVGb3JtUmVzZXQoY29uc3QgQ1BERl9JbnRlckZvcm0qIHBGb3JtKSB7IHJldHVybiAwOyB9CisKKyAgdmlydHVhbCBpbnQgQWZ0ZXJGb3JtUmVzZXQoY29uc3QgQ1BERl9JbnRlckZvcm0qIHBGb3JtKSB7IHJldHVybiAwOyB9CisKKyAgdmlydHVhbCBpbnQgQmVmb3JlRm9ybUltcG9ydERhdGEoY29uc3QgQ1BERl9JbnRlckZvcm0qIHBGb3JtKSB7IHJldHVybiAwOyB9CisKKyAgdmlydHVhbCBpbnQgQWZ0ZXJGb3JtSW1wb3J0RGF0YShjb25zdCBDUERGX0ludGVyRm9ybSogcEZvcm0pIHsgcmV0dXJuIDA7IH0KK307CitGWF9CT09MIEZQREZfR2VuZXJhdGVBUChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpOworY2xhc3MgQ1BERl9QYWdlTGFiZWwgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1BERl9QYWdlTGFiZWwoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KSB7IG1fcERvY3VtZW50ID0gcERvY3VtZW50OyB9CisKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0TGFiZWwoaW50IG5QYWdlKSBjb25zdDsKKworICBpbnQzMl90IEdldFBhZ2VCeUxhYmVsKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNMYWJlbCkgY29uc3Q7CisKKyAgaW50MzJfdCBHZXRQYWdlQnlMYWJlbChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTGFiZWwpIGNvbnN0OworCisgcHJvdGVjdGVkOgorICBDUERGX0RvY3VtZW50KiBtX3BEb2N1bWVudDsKK307CisKK2NsYXNzIENQREZfTWV0YWRhdGEgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1BERl9NZXRhZGF0YShDUERGX0RvY3VtZW50KiBwRG9jKTsKKyAgfkNQREZfTWV0YWRhdGEoKTsKKworICBjb25zdCBDWE1MX0VsZW1lbnQqIEdldFJvb3QoKSBjb25zdDsKKworIHByaXZhdGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxDWE1MX0VsZW1lbnQ+IG1fcFhtbEVsZW1lbnQ7Cit9OworCitjbGFzcyBDUERGX1ZpZXdlclByZWZlcmVuY2VzIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENQREZfVmlld2VyUHJlZmVyZW5jZXMoQ1BERl9Eb2N1bWVudCogcERvYyk7CisKKyAgfkNQREZfVmlld2VyUHJlZmVyZW5jZXMoKTsKKworICBGWF9CT09MIElzRGlyZWN0aW9uUjJMKCkgY29uc3Q7CisKKyAgRlhfQk9PTCBQcmludFNjYWxpbmcoKSBjb25zdDsKKworICBpbnQzMl90IE51bUNvcGllcygpIGNvbnN0OworCisgIENQREZfQXJyYXkqIFByaW50UGFnZVJhbmdlKCkgY29uc3Q7CisKKyAgQ0ZYX0J5dGVTdHJpbmcgRHVwbGV4KCkgY29uc3Q7CisKKyBwcm90ZWN0ZWQ6CisgIENQREZfRG9jdW1lbnQqIGNvbnN0IG1fcERvYzsKK307CisKK2NsYXNzIENQREZfQXBTZXR0aW5ncyB7CisgcHVibGljOgorICBleHBsaWNpdCBDUERGX0FwU2V0dGluZ3MoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7CisKKyAgYm9vbCBIYXNNS0VudHJ5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NFbnRyeSkgY29uc3Q7CisgIGludCBHZXRSb3RhdGlvbigpIGNvbnN0OworCisgIEZYX0FSR0IgR2V0Qm9yZGVyQ29sb3IoaW50JiBpQ29sb3JUeXBlKSBjb25zdCB7CisgICAgcmV0dXJuIEdldENvbG9yKGlDb2xvclR5cGUsICJCQyIpOworICB9CisKKyAgRlhfRkxPQVQgR2V0T3JpZ2luYWxCb3JkZXJDb2xvcihpbnQgaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0T3JpZ2luYWxDb2xvcihpbmRleCwgIkJDIik7CisgIH0KKworICB2b2lkIEdldE9yaWdpbmFsQm9yZGVyQ29sb3IoaW50JiBpQ29sb3JUeXBlLCBGWF9GTE9BVCBmY1s0XSkgY29uc3QgeworICAgIEdldE9yaWdpbmFsQ29sb3IoaUNvbG9yVHlwZSwgZmMsICJCQyIpOworICB9CisKKyAgRlhfQVJHQiBHZXRCYWNrZ3JvdW5kQ29sb3IoaW50JiBpQ29sb3JUeXBlKSBjb25zdCB7CisgICAgcmV0dXJuIEdldENvbG9yKGlDb2xvclR5cGUsICJCRyIpOworICB9CisKKyAgRlhfRkxPQVQgR2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoaW50IGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIEdldE9yaWdpbmFsQ29sb3IoaW5kZXgsICJCRyIpOworICB9CisKKyAgdm9pZCBHZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcihpbnQmIGlDb2xvclR5cGUsIEZYX0ZMT0FUIGZjWzRdKSBjb25zdCB7CisgICAgR2V0T3JpZ2luYWxDb2xvcihpQ29sb3JUeXBlLCBmYywgIkJHIik7CisgIH0KKworICBDRlhfV2lkZVN0cmluZyBHZXROb3JtYWxDYXB0aW9uKCkgY29uc3QgeyByZXR1cm4gR2V0Q2FwdGlvbigiQ0EiKTsgfQorCisgIENGWF9XaWRlU3RyaW5nIEdldFJvbGxvdmVyQ2FwdGlvbigpIGNvbnN0IHsgcmV0dXJuIEdldENhcHRpb24oIlJDIik7IH0KKworICBDRlhfV2lkZVN0cmluZyBHZXREb3duQ2FwdGlvbigpIGNvbnN0IHsgcmV0dXJuIEdldENhcHRpb24oIkFDIik7IH0KKworICBDUERGX1N0cmVhbSogR2V0Tm9ybWFsSWNvbigpIGNvbnN0IHsgcmV0dXJuIEdldEljb24oIkkiKTsgfQorCisgIENQREZfU3RyZWFtKiBHZXRSb2xsb3Zlckljb24oKSBjb25zdCB7IHJldHVybiBHZXRJY29uKCJSSSIpOyB9CisKKyAgQ1BERl9TdHJlYW0qIEdldERvd25JY29uKCkgY29uc3QgeyByZXR1cm4gR2V0SWNvbigiSVgiKTsgfQorCisgIENQREZfSWNvbkZpdCBHZXRJY29uRml0KCkgY29uc3Q7CisKKyAgaW50IEdldFRleHRQb3NpdGlvbigpIGNvbnN0OworCisgcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgQ1BERl9Gb3JtQ29udHJvbDsKKworICBGWF9BUkdCIEdldENvbG9yKGludCYgaUNvbG9yVHlwZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjc0VudHJ5KSBjb25zdDsKKworICBGWF9GTE9BVCBHZXRPcmlnaW5hbENvbG9yKGludCBpbmRleCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjc0VudHJ5KSBjb25zdDsKKworICB2b2lkIEdldE9yaWdpbmFsQ29sb3IoaW50JiBpQ29sb3JUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZmNbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzRW50cnkpIGNvbnN0OworCisgIENGWF9XaWRlU3RyaW5nIEdldENhcHRpb24oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjc0VudHJ5KSBjb25zdDsKKworICBDUERGX1N0cmVhbSogR2V0SWNvbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzRW50cnkpIGNvbnN0OworCisgIENQREZfRGljdGlvbmFyeSogY29uc3QgbV9wRGljdDsKK307CisKK0NGWF9XaWRlU3RyaW5nIEZJTEVTUEVDX0VuY29kZUZpbGVOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZXBhdGgpOworCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GUERGRE9DX0ZQREZfRE9DX0hfCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3RhZ2dlZC5oIGIvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl90YWdnZWQuaAppbmRleCA0OTQzYWQwLi40NTI3N2ZiIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3RhZ2dlZC5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfdGFnZ2VkLmgKQEAgLTEsNyArMSw3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgQ09SRV9JTkNMVURFX0ZQREZET0NfRlBERl9UQUdHRURfSF8KQEAgLTE0LDg5ICsxNCw5MSBAQAogY2xhc3MgSVBERl9SZWZsb3dlZFBhZ2U7CiBzdHJ1Y3QgQ1BERl9TdHJ1Y3RLaWQ7CiAKLWNsYXNzIENQREZfU3RydWN0VHJlZSAKLXsKLXB1YmxpYzoKK2NsYXNzIENQREZfU3RydWN0VHJlZSB7CisgcHVibGljOgorICBzdGF0aWMgQ1BERl9TdHJ1Y3RUcmVlKiBMb2FkRG9jKGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2MpOwogCi0gICAgc3RhdGljIENQREZfU3RydWN0VHJlZSogTG9hZERvYyhjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jKTsKKyAgc3RhdGljIENQREZfU3RydWN0VHJlZSogTG9hZFBhZ2UoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QpOwogCi0gICAgc3RhdGljIENQREZfU3RydWN0VHJlZSogTG9hZFBhZ2UoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvYywgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QpOworICB2aXJ0dWFsIH5DUERGX1N0cnVjdFRyZWUoKSB7fQogCi0gICAgdmlydHVhbCB+Q1BERl9TdHJ1Y3RUcmVlKCkge30KKyAgdmlydHVhbCBpbnQgQ291bnRUb3BFbGVtZW50cygpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgaW50CQkJQ291bnRUb3BFbGVtZW50cygpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgQ1BERl9TdHJ1Y3RFbGVtZW50KglHZXRUb3BFbGVtZW50KGludCBpKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgQ1BERl9TdHJ1Y3RFbGVtZW50KiBHZXRUb3BFbGVtZW50KGludCBpKSBjb25zdCA9IDA7CiB9Owogc3RydWN0IENQREZfU3RydWN0S2lkIHsKLSAgICBlbnVtIHsKLSAgICAgICAgSW52YWxpZCwKLSAgICAgICAgRWxlbWVudCwKLSAgICAgICAgUGFnZUNvbnRlbnQsCi0gICAgICAgIFN0cmVhbUNvbnRlbnQsCi0gICAgICAgIE9iamVjdAotICAgIH0gbV9UeXBlOworICBlbnVtIHsgSW52YWxpZCwgRWxlbWVudCwgUGFnZUNvbnRlbnQsIFN0cmVhbUNvbnRlbnQsIE9iamVjdCB9IG1fVHlwZTsKIAotICAgIHVuaW9uIHsKLSAgICAgICAgc3RydWN0IHsKKyAgdW5pb24geworICAgIHN0cnVjdCB7CisgICAgICBDUERGX1N0cnVjdEVsZW1lbnQqIG1fcEVsZW1lbnQ7CiAKLSAgICAgICAgICAgIENQREZfU3RydWN0RWxlbWVudCoJbV9wRWxlbWVudDsKKyAgICAgIENQREZfRGljdGlvbmFyeSogbV9wRGljdDsKKyAgICB9IG1fRWxlbWVudDsKKyAgICBzdHJ1Y3QgeworICAgICAgRlhfRFdPUkQgbV9QYWdlT2JqTnVtOwogCi0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqCW1fcERpY3Q7Ci0gICAgICAgIH0gbV9FbGVtZW50OwotICAgICAgICBzdHJ1Y3QgeworICAgICAgRlhfRFdPUkQgbV9Db250ZW50SWQ7CisgICAgfSBtX1BhZ2VDb250ZW50OworICAgIHN0cnVjdCB7CisgICAgICBGWF9EV09SRCBtX1BhZ2VPYmpOdW07CiAKLSAgICAgICAgICAgIEZYX0RXT1JECQkJbV9QYWdlT2JqTnVtOworICAgICAgRlhfRFdPUkQgbV9Db250ZW50SWQ7CiAKLSAgICAgICAgICAgIEZYX0RXT1JECQkJbV9Db250ZW50SWQ7Ci0gICAgICAgIH0gbV9QYWdlQ29udGVudDsKLSAgICAgICAgc3RydWN0IHsKKyAgICAgIEZYX0RXT1JEIG1fUmVmT2JqTnVtOworICAgIH0gbV9TdHJlYW1Db250ZW50OworICAgIHN0cnVjdCB7CisgICAgICBGWF9EV09SRCBtX1BhZ2VPYmpOdW07CiAKLSAgICAgICAgICAgIEZYX0RXT1JECQkJbV9QYWdlT2JqTnVtOwotCi0gICAgICAgICAgICBGWF9EV09SRAkJCW1fQ29udGVudElkOwotCi0gICAgICAgICAgICBGWF9EV09SRAkJCW1fUmVmT2JqTnVtOwotICAgICAgICB9IG1fU3RyZWFtQ29udGVudDsKLSAgICAgICAgc3RydWN0IHsKLQotICAgICAgICAgICAgRlhfRFdPUkQJCQltX1BhZ2VPYmpOdW07Ci0KLSAgICAgICAgICAgIEZYX0RXT1JECQkJbV9SZWZPYmpOdW07Ci0gICAgICAgIH0gbV9PYmplY3Q7Ci0gICAgfTsKKyAgICAgIEZYX0RXT1JEIG1fUmVmT2JqTnVtOworICAgIH0gbV9PYmplY3Q7CisgIH07CiB9OwotY2xhc3MgQ1BERl9TdHJ1Y3RFbGVtZW50IAotewotcHVibGljOgotICAgIHZpcnR1YWwgfkNQREZfU3RydWN0RWxlbWVudCgpIHsgfQorY2xhc3MgQ1BERl9TdHJ1Y3RFbGVtZW50IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkNQREZfU3RydWN0RWxlbWVudCgpIHt9CiAKLSAgICB2aXJ0dWFsIENQREZfU3RydWN0VHJlZSoJR2V0VHJlZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBDUERGX1N0cnVjdFRyZWUqIEdldFRyZWUoKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIGNvbnN0IENGWF9CeXRlU3RyaW5nJglHZXRUeXBlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBHZXRUeXBlKCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBDUERGX1N0cnVjdEVsZW1lbnQqCUdldFBhcmVudCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBDUERGX1N0cnVjdEVsZW1lbnQqIEdldFBhcmVudCgpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgQ1BERl9EaWN0aW9uYXJ5ICoJR2V0RGljdCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBDUERGX0RpY3Rpb25hcnkqIEdldERpY3QoKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIGludAkJCQkJQ291bnRLaWRzKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGludCBDb3VudEtpZHMoKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIGNvbnN0IENQREZfU3RydWN0S2lkJglHZXRLaWQoaW50IGluZGV4KSBjb25zdCA9IDA7CisgIHZpcnR1YWwgY29uc3QgQ1BERl9TdHJ1Y3RLaWQmIEdldEtpZChpbnQgaW5kZXgpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgQ0ZYX1B0ckFycmF5KgkJR2V0T2JqZWN0QXJyYXkoKSA9IDA7CisgIHZpcnR1YWwgQ1BERl9PYmplY3QqIEdldEF0dHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW5oZXJpdGFibGUgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTGV2ZWwgPSAwLjBGKSA9IDA7CiAKLSAgICB2aXJ0dWFsIENQREZfT2JqZWN0KgkJR2V0QXR0cihGWF9CU1RSIG93bmVyLCBGWF9CU1RSIG5hbWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsIEZYX0ZMT0FUIGZMZXZlbCA9IDAuMEYpID0gMDsKKyAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZyBHZXROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGRlZmF1bHRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbmhlcml0YWJsZSA9IEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YmluZGV4ID0gLTEpID0gMDsKIAorICB2aXJ0dWFsIEZYX0FSR0IgR2V0Q29sb3IoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZGVmYXVsdF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ViaW5kZXggPSAtMSkgPSAwOwogCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0TnVtYmVyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZGVmYXVsdF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW5oZXJpdGFibGUgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YmluZGV4ID0gLTEpID0gMDsKIAotICAgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldE5hbWUoRlhfQlNUUiBvd25lciwgRlhfQlNUUiBuYW1lLCBGWF9CU1RSIGRlZmF1bHRfdmFsdWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsIGludCBzdWJpbmRleCA9IC0xKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIEZYX0FSR0IJCQkJR2V0Q29sb3IoRlhfQlNUUiBvd25lciwgRlhfQlNUUiBuYW1lLCBGWF9BUkdCIGRlZmF1bHRfdmFsdWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsIGludCBzdWJpbmRleCA9IC0xKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJR2V0TnVtYmVyKEZYX0JTVFIgb3duZXIsIEZYX0JTVFIgbmFtZSwgRlhfRkxPQVQgZGVmYXVsdF92YWx1ZSwgRlhfQk9PTCBiSW5oZXJpdGFibGUgPSBGQUxTRSwgaW50IHN1YmluZGV4ID0gLTEpID0gMDsKLQotICAgIHZpcnR1YWwgaW50CQkJCQlHZXRJbnRlZ2VyKEZYX0JTVFIgb3duZXIsIEZYX0JTVFIgbmFtZSwgaW50IGRlZmF1bHRfdmFsdWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsIGludCBzdWJpbmRleCA9IC0xKSA9IDA7Ci0KKyAgdmlydHVhbCBpbnQgR2V0SW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbmhlcml0YWJsZSA9IEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJpbmRleCA9IC0xKSA9IDA7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GUERGRE9DX0ZQREZfVEFHR0VEX0hfCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3Z0LmggYi9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3Z0LmgKaW5kZXggODdlZjAyNS4uOTFhOTM4OCAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl92dC5oCisrKyBiL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfdnQuaApAQCAtMSwxNSArMSwxNCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIENPUkVfSU5DTFVERV9GUERGRE9DX0ZQREZfVlRfSF8KICNkZWZpbmUgQ09SRV9JTkNMVURFX0ZQREZET0NfRlBERl9WVF9IXwogCi0jaW5jbHVkZSAiLi4vZnBkZmFwaS9mcGRmX3BhcnNlci5oIgotI2luY2x1ZGUgIi4uL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0jaW5jbHVkZSAiLi4vZnhnZS9meF9kaWIuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhcnNlci5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2RpYi5oIgogCiBjbGFzcyBJUERGX1ZhcmlhYmxlVGV4dDsKIGNsYXNzIElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOwpAQCAtMjEsNDMyICsyMCw0NDMgQEAKIHN0cnVjdCBDUFZUX1dvcmRSYW5nZTsKIAogc3RydWN0IENQVlRfV29yZFBsYWNlIHsKKyAgQ1BWVF9Xb3JkUGxhY2UoKSA6IG5TZWNJbmRleCgtMSksIG5MaW5lSW5kZXgoLTEpLCBuV29yZEluZGV4KC0xKSB7fQogCi0gICAgQ1BWVF9Xb3JkUGxhY2UoKSA6IG5TZWNJbmRleCgtMSksIG5MaW5lSW5kZXgoLTEpLCBuV29yZEluZGV4KC0xKQotICAgIHsKKyAgQ1BWVF9Xb3JkUGxhY2UoaW50MzJfdCBvdGhlcl9uU2VjSW5kZXgsCisgICAgICAgICAgICAgICAgIGludDMyX3Qgb3RoZXJfbkxpbmVJbmRleCwKKyAgICAgICAgICAgICAgICAgaW50MzJfdCBvdGhlcl9uV29yZEluZGV4KSB7CisgICAgblNlY0luZGV4ID0gb3RoZXJfblNlY0luZGV4OworICAgIG5MaW5lSW5kZXggPSBvdGhlcl9uTGluZUluZGV4OworICAgIG5Xb3JkSW5kZXggPSBvdGhlcl9uV29yZEluZGV4OworICB9CisKKyAgdm9pZCBEZWZhdWx0KCkgeyBuU2VjSW5kZXggPSBuTGluZUluZGV4ID0gbldvcmRJbmRleCA9IC0xOyB9CisKKyAgRlhfQk9PTCBvcGVyYXRvcj09KGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cCkgY29uc3QgeworICAgIHJldHVybiB3cC5uU2VjSW5kZXggPT0gblNlY0luZGV4ICYmIHdwLm5MaW5lSW5kZXggPT0gbkxpbmVJbmRleCAmJgorICAgICAgICAgICB3cC5uV29yZEluZGV4ID09IG5Xb3JkSW5kZXg7CisgIH0KKworICBGWF9CT09MIG9wZXJhdG9yIT0oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwKSBjb25zdCB7CisgICAgcmV0dXJuIHdwLm5TZWNJbmRleCAhPSBuU2VjSW5kZXggfHwgd3AubkxpbmVJbmRleCAhPSBuTGluZUluZGV4IHx8CisgICAgICAgICAgIHdwLm5Xb3JkSW5kZXggIT0gbldvcmRJbmRleDsKKyAgfQorCisgIGlubGluZSBpbnQzMl90IFdvcmRDbXAoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwKSBjb25zdCB7CisgICAgaWYgKG5TZWNJbmRleCA+IHdwLm5TZWNJbmRleCkgeworICAgICAgcmV0dXJuIDE7CiAgICAgfQotCi0gICAgQ1BWVF9Xb3JkUGxhY2UoRlhfSU5UMzIgblNlY0luZGV4LCBGWF9JTlQzMiBuTGluZUluZGV4LCBGWF9JTlQzMiBuV29yZEluZGV4KQotICAgIHsKLSAgICAgICAgdGhpcy0+blNlY0luZGV4ID0gblNlY0luZGV4OwotICAgICAgICB0aGlzLT5uTGluZUluZGV4ID0gbkxpbmVJbmRleDsKLSAgICAgICAgdGhpcy0+bldvcmRJbmRleCA9IG5Xb3JkSW5kZXg7CisgICAgaWYgKG5TZWNJbmRleCA8IHdwLm5TZWNJbmRleCkgeworICAgICAgcmV0dXJuIC0xOwogICAgIH0KLQotICAgIHZvaWQgRGVmYXVsdCgpCi0gICAgewotICAgICAgICBuU2VjSW5kZXggPSBuTGluZUluZGV4ID0gbldvcmRJbmRleCA9IC0xOworICAgIGlmIChuTGluZUluZGV4ID4gd3AubkxpbmVJbmRleCkgeworICAgICAgcmV0dXJuIDE7CiAgICAgfQotCi0gICAgRlhfQk9PTCBvcGVyYXRvciA9PSAoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cC5uU2VjSW5kZXggPT0gdGhpcy0+blNlY0luZGV4ICYmIHdwLm5MaW5lSW5kZXggPT0gdGhpcy0+bkxpbmVJbmRleCAmJiB3cC5uV29yZEluZGV4ID09IHRoaXMtPm5Xb3JkSW5kZXg7CisgICAgaWYgKG5MaW5lSW5kZXggPCB3cC5uTGluZUluZGV4KSB7CisgICAgICByZXR1cm4gLTE7CiAgICAgfQotCi0gICAgRlhfQk9PTCBvcGVyYXRvciAhPSAoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cC5uU2VjSW5kZXggIT0gdGhpcy0+blNlY0luZGV4IHx8IHdwLm5MaW5lSW5kZXggIT0gdGhpcy0+bkxpbmVJbmRleCB8fCB3cC5uV29yZEluZGV4ICE9IHRoaXMtPm5Xb3JkSW5kZXg7CisgICAgaWYgKG5Xb3JkSW5kZXggPiB3cC5uV29yZEluZGV4KSB7CisgICAgICByZXR1cm4gMTsKICAgICB9Ci0KLSAgICBpbmxpbmUgRlhfSU5UMzIgV29yZENtcChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwKSBjb25zdAotICAgIHsKLSAgICAgICAgaWYgKHRoaXMtPm5TZWNJbmRleCA+IHdwLm5TZWNJbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRoaXMtPm5TZWNJbmRleCA8IHdwLm5TZWNJbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0aGlzLT5uTGluZUluZGV4ID4gd3AubkxpbmVJbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRoaXMtPm5MaW5lSW5kZXggPCB3cC5uTGluZUluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRoaXMtPm5Xb3JkSW5kZXggPiB3cC5uV29yZEluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGhpcy0+bldvcmRJbmRleCA8IHdwLm5Xb3JkSW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAobldvcmRJbmRleCA8IHdwLm5Xb3JkSW5kZXgpIHsKKyAgICAgIHJldHVybiAtMTsKICAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KIAotICAgIGlubGluZSBGWF9JTlQzMiBMaW5lQ21wKGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3ApIGNvbnN0Ci0gICAgewotICAgICAgICBpZiAodGhpcy0+blNlY0luZGV4ID4gd3AublNlY0luZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGhpcy0+blNlY0luZGV4IDwgd3AublNlY0luZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRoaXMtPm5MaW5lSW5kZXggPiB3cC5uTGluZUluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGhpcy0+bkxpbmVJbmRleCA8IHdwLm5MaW5lSW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKKyAgaW5saW5lIGludDMyX3QgTGluZUNtcChjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3ApIGNvbnN0IHsKKyAgICBpZiAoblNlY0luZGV4ID4gd3AublNlY0luZGV4KSB7CisgICAgICByZXR1cm4gMTsKICAgICB9Ci0KLSAgICBpbmxpbmUgRlhfSU5UMzIgU2VjQ21wKGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3ApIGNvbnN0Ci0gICAgewotICAgICAgICBpZiAodGhpcy0+blNlY0luZGV4ID4gd3AublNlY0luZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAodGhpcy0+blNlY0luZGV4IDwgd3AublNlY0luZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKG5TZWNJbmRleCA8IHdwLm5TZWNJbmRleCkgeworICAgICAgcmV0dXJuIC0xOwogICAgIH0KKyAgICBpZiAobkxpbmVJbmRleCA+IHdwLm5MaW5lSW5kZXgpIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAobkxpbmVJbmRleCA8IHdwLm5MaW5lSW5kZXgpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KIAotICAgIEZYX0lOVDMyCQkJCQkJCW5TZWNJbmRleDsKKyAgaW5saW5lIGludDMyX3QgU2VjQ21wKGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cCkgY29uc3QgeworICAgIGlmIChuU2VjSW5kZXggPiB3cC5uU2VjSW5kZXgpIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoblNlY0luZGV4IDwgd3AublNlY0luZGV4KSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworICB9CiAKLSAgICBGWF9JTlQzMgkJCQkJCQluTGluZUluZGV4OworICBpbnQzMl90IG5TZWNJbmRleDsKIAotICAgIEZYX0lOVDMyCQkJCQkJCW5Xb3JkSW5kZXg7CisgIGludDMyX3QgbkxpbmVJbmRleDsKKworICBpbnQzMl90IG5Xb3JkSW5kZXg7CiB9Owogc3RydWN0IENQVlRfV29yZFJhbmdlIHsKKyAgQ1BWVF9Xb3JkUmFuZ2UoKSB7fQogCi0gICAgQ1BWVF9Xb3JkUmFuZ2UoKQotICAgIHsKKyAgQ1BWVF9Xb3JkUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIGJlZ2luLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgZW5kKSB7CisgICAgU2V0KGJlZ2luLCBlbmQpOworICB9CisKKyAgdm9pZCBEZWZhdWx0KCkgeworICAgIEJlZ2luUG9zLkRlZmF1bHQoKTsKKyAgICBFbmRQb3MuRGVmYXVsdCgpOworICB9CisKKyAgdm9pZCBTZXQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIGJlZ2luLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgZW5kKSB7CisgICAgQmVnaW5Qb3MgPSBiZWdpbjsKKyAgICBFbmRQb3MgPSBlbmQ7CisgICAgU3dhcFdvcmRQbGFjZSgpOworICB9CisKKyAgdm9pZCBTZXRCZWdpblBvcyhjb25zdCBDUFZUX1dvcmRQbGFjZSYgYmVnaW4pIHsKKyAgICBCZWdpblBvcyA9IGJlZ2luOworICAgIFN3YXBXb3JkUGxhY2UoKTsKKyAgfQorCisgIHZvaWQgU2V0RW5kUG9zKGNvbnN0IENQVlRfV29yZFBsYWNlJiBlbmQpIHsKKyAgICBFbmRQb3MgPSBlbmQ7CisgICAgU3dhcFdvcmRQbGFjZSgpOworICB9CisKKyAgRlhfQk9PTCBJc0V4aXN0KCkgY29uc3QgeyByZXR1cm4gQmVnaW5Qb3MgIT0gRW5kUG9zOyB9CisKKyAgRlhfQk9PTCBvcGVyYXRvciE9KGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cikgY29uc3QgeworICAgIHJldHVybiB3ci5CZWdpblBvcyAhPSBCZWdpblBvcyB8fCB3ci5FbmRQb3MgIT0gRW5kUG9zOworICB9CisKKyAgdm9pZCBTd2FwV29yZFBsYWNlKCkgeworICAgIGlmIChCZWdpblBvcy5Xb3JkQ21wKEVuZFBvcykgPiAwKSB7CisgICAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IEVuZFBvczsKKyAgICAgIEVuZFBvcyA9IEJlZ2luUG9zOworICAgICAgQmVnaW5Qb3MgPSBwbGFjZTsKICAgICB9CisgIH0KIAotICAgIENQVlRfV29yZFJhbmdlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgYmVnaW4sIGNvbnN0IENQVlRfV29yZFBsYWNlICYgZW5kKQotICAgIHsKLSAgICAgICAgU2V0KGJlZ2luLCBlbmQpOwotICAgIH0KKyAgQ1BWVF9Xb3JkUGxhY2UgQmVnaW5Qb3M7CiAKLSAgICB2b2lkIERlZmF1bHQoKQotICAgIHsKLSAgICAgICAgQmVnaW5Qb3MuRGVmYXVsdCgpOwotICAgICAgICBFbmRQb3MuRGVmYXVsdCgpOwotICAgIH0KLQotICAgIHZvaWQgU2V0KGNvbnN0IENQVlRfV29yZFBsYWNlICYgYmVnaW4sIGNvbnN0IENQVlRfV29yZFBsYWNlICYgZW5kKQotICAgIHsKLSAgICAgICAgdGhpcy0+QmVnaW5Qb3MgPSBiZWdpbjsKLSAgICAgICAgdGhpcy0+RW5kUG9zID0gZW5kOwotICAgICAgICBTd2FwV29yZFBsYWNlKCk7Ci0gICAgfQotCi0gICAgdm9pZCBTZXRCZWdpblBvcyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIGJlZ2luKQotICAgIHsKLSAgICAgICAgdGhpcy0+QmVnaW5Qb3MgPSBiZWdpbjsKLSAgICAgICAgU3dhcFdvcmRQbGFjZSgpOwotICAgIH0KLQotICAgIHZvaWQgU2V0RW5kUG9zKGNvbnN0IENQVlRfV29yZFBsYWNlICYgZW5kKQotICAgIHsKLSAgICAgICAgdGhpcy0+RW5kUG9zID0gZW5kOwotICAgICAgICBTd2FwV29yZFBsYWNlKCk7Ci0gICAgfQotCi0gICAgRlhfQk9PTCBJc0V4aXN0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLT5CZWdpblBvcyAhPSB0aGlzLT5FbmRQb3M7Ci0gICAgfQotCi0gICAgRlhfQk9PTCBvcGVyYXRvciAhPSAoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3cikgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB3ci5CZWdpblBvcyAhPSB0aGlzLT5CZWdpblBvcyB8fCB3ci5FbmRQb3MgIT0gdGhpcy0+RW5kUG9zOwotICAgIH0KLQotICAgIHZvaWQgU3dhcFdvcmRQbGFjZSgpCi0gICAgewotICAgICAgICBpZiAoQmVnaW5Qb3MuV29yZENtcChFbmRQb3MpID4gMCkgewotICAgICAgICAgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBFbmRQb3M7Ci0gICAgICAgICAgICBFbmRQb3MgPSBCZWdpblBvczsKLSAgICAgICAgICAgIEJlZ2luUG9zID0gcGxhY2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBDUFZUX1dvcmRQbGFjZSBCZWdpblBvczsKLQotICAgIENQVlRfV29yZFBsYWNlIEVuZFBvczsKKyAgQ1BWVF9Xb3JkUGxhY2UgRW5kUG9zOwogfTsKLXN0cnVjdCBDUFZUX1NlY1Byb3BzICB7CitzdHJ1Y3QgQ1BWVF9TZWNQcm9wcyB7CisgIENQVlRfU2VjUHJvcHMoKSA6IGZMaW5lTGVhZGluZygwLjBmKSwgZkxpbmVJbmRlbnQoMC4wZiksIG5BbGlnbm1lbnQoMCkge30KIAotICAgIENQVlRfU2VjUHJvcHMoKSA6IGZMaW5lTGVhZGluZygwLjBmKSwgZkxpbmVJbmRlbnQoMC4wZiksIG5BbGlnbm1lbnQoMCkKLSAgICB7Ci0gICAgfQorICBDUFZUX1NlY1Byb3BzKEZYX0ZMT0FUIGxpbmVMZWFkaW5nLCBGWF9GTE9BVCBsaW5lSW5kZW50LCBpbnQzMl90IGFsaWdubWVudCkKKyAgICAgIDogZkxpbmVMZWFkaW5nKGxpbmVMZWFkaW5nKSwKKyAgICAgICAgZkxpbmVJbmRlbnQobGluZUluZGVudCksCisgICAgICAgIG5BbGlnbm1lbnQoYWxpZ25tZW50KSB7fQogCi0gICAgQ1BWVF9TZWNQcm9wcyhGWF9GTE9BVCBsaW5lTGVhZGluZywgRlhfRkxPQVQgbGluZUluZGVudCwgRlhfSU5UMzIgYWxpZ25tZW50KSA6Ci0gICAgICAgIGZMaW5lTGVhZGluZyhsaW5lTGVhZGluZyksIGZMaW5lSW5kZW50KGxpbmVJbmRlbnQpLCBuQWxpZ25tZW50KGFsaWdubWVudCkKLSAgICB7Ci0gICAgfQorICBDUFZUX1NlY1Byb3BzKGNvbnN0IENQVlRfU2VjUHJvcHMmIG90aGVyKQorICAgICAgOiBmTGluZUxlYWRpbmcob3RoZXIuZkxpbmVMZWFkaW5nKSwKKyAgICAgICAgZkxpbmVJbmRlbnQob3RoZXIuZkxpbmVJbmRlbnQpLAorICAgICAgICBuQWxpZ25tZW50KG90aGVyLm5BbGlnbm1lbnQpIHt9CiAKLSAgICBDUFZUX1NlY1Byb3BzKGNvbnN0IENQVlRfU2VjUHJvcHMgJiBvdGhlcikgOgotICAgICAgICBmTGluZUxlYWRpbmcob3RoZXIuZkxpbmVMZWFkaW5nKSwgZkxpbmVJbmRlbnQob3RoZXIuZkxpbmVJbmRlbnQpLCBuQWxpZ25tZW50KG90aGVyLm5BbGlnbm1lbnQpCi0gICAgewotICAgIH0KKyAgRlhfRkxPQVQgZkxpbmVMZWFkaW5nOwogCi0gICAgRlhfRkxPQVQJCQlmTGluZUxlYWRpbmc7CisgIEZYX0ZMT0FUIGZMaW5lSW5kZW50OwogCi0gICAgRlhfRkxPQVQJCQlmTGluZUluZGVudDsKLQotICAgIEZYX0lOVDMyCQkJbkFsaWdubWVudDsKKyAgaW50MzJfdCBuQWxpZ25tZW50OwogfTsKLXN0cnVjdCBDUFZUX1dvcmRQcm9wcyAgeworc3RydWN0IENQVlRfV29yZFByb3BzIHsKKyAgQ1BWVF9Xb3JkUHJvcHMoKQorICAgICAgOiBuRm9udEluZGV4KC0xKSwKKyAgICAgICAgZkZvbnRTaXplKDAuMGYpLAorICAgICAgICBkd1dvcmRDb2xvcigwKSwKKyAgICAgICAgblNjcmlwdFR5cGUoMCksCisgICAgICAgIG5Xb3JkU3R5bGUoMCksCisgICAgICAgIGZDaGFyU3BhY2UoMC4wZiksCisgICAgICAgIG5Ib3J6U2NhbGUoMCkge30KIAotICAgIENQVlRfV29yZFByb3BzKCkgOiBuRm9udEluZGV4KC0xKSwgZkZvbnRTaXplKDAuMGYpLCBkd1dvcmRDb2xvcigwKSwgblNjcmlwdFR5cGUoMCksIG5Xb3JkU3R5bGUoMCksCi0gICAgICAgIGZDaGFyU3BhY2UoMC4wZiksIG5Ib3J6U2NhbGUoMCkKLSAgICB7Ci0gICAgfQorICBDUFZUX1dvcmRQcm9wcyhpbnQzMl90IGZvbnRJbmRleCwKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udFNpemUsCisgICAgICAgICAgICAgICAgIEZYX0NPTE9SUkVGIHdvcmRDb2xvciA9IDAsCisgICAgICAgICAgICAgICAgIGludDMyX3Qgc2NyaXB0VHlwZSA9IDAsCisgICAgICAgICAgICAgICAgIGludDMyX3Qgd29yZFN0eWxlID0gMCwKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY2hhclNwYWNlID0gMCwKKyAgICAgICAgICAgICAgICAgaW50MzJfdCBob3J6U2NhbGUgPSAxMDApCisgICAgICA6IG5Gb250SW5kZXgoZm9udEluZGV4KSwKKyAgICAgICAgZkZvbnRTaXplKGZvbnRTaXplKSwKKyAgICAgICAgZHdXb3JkQ29sb3Iod29yZENvbG9yKSwKKyAgICAgICAgblNjcmlwdFR5cGUoc2NyaXB0VHlwZSksCisgICAgICAgIG5Xb3JkU3R5bGUod29yZFN0eWxlKSwKKyAgICAgICAgZkNoYXJTcGFjZShjaGFyU3BhY2UpLAorICAgICAgICBuSG9yelNjYWxlKGhvcnpTY2FsZSkge30KIAotICAgIENQVlRfV29yZFByb3BzKEZYX0lOVDMyCWZvbnRJbmRleCwgRlhfRkxPQVQgZm9udFNpemUsIEZYX0NPTE9SUkVGIHdvcmRDb2xvciA9IDAsIEZYX0lOVDMyIHNjcmlwdFR5cGUgPSAwLCBGWF9JTlQzMiB3b3JkU3R5bGUgPSAwLAotICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGNoYXJTcGFjZSA9IDAsIEZYX0lOVDMyIGhvcnpTY2FsZSA9IDEwMCkgOgotICAgICAgICBuRm9udEluZGV4KGZvbnRJbmRleCksIGZGb250U2l6ZShmb250U2l6ZSksIGR3V29yZENvbG9yKHdvcmRDb2xvciksIG5TY3JpcHRUeXBlKHNjcmlwdFR5cGUpLAotICAgICAgICBuV29yZFN0eWxlKHdvcmRTdHlsZSksIGZDaGFyU3BhY2UoY2hhclNwYWNlKSwgbkhvcnpTY2FsZShob3J6U2NhbGUpCi0gICAgewotICAgIH0KKyAgQ1BWVF9Xb3JkUHJvcHMoY29uc3QgQ1BWVF9Xb3JkUHJvcHMmIG90aGVyKQorICAgICAgOiBuRm9udEluZGV4KG90aGVyLm5Gb250SW5kZXgpLAorICAgICAgICBmRm9udFNpemUob3RoZXIuZkZvbnRTaXplKSwKKyAgICAgICAgZHdXb3JkQ29sb3Iob3RoZXIuZHdXb3JkQ29sb3IpLAorICAgICAgICBuU2NyaXB0VHlwZShvdGhlci5uU2NyaXB0VHlwZSksCisgICAgICAgIG5Xb3JkU3R5bGUob3RoZXIubldvcmRTdHlsZSksCisgICAgICAgIGZDaGFyU3BhY2Uob3RoZXIuZkNoYXJTcGFjZSksCisgICAgICAgIG5Ib3J6U2NhbGUob3RoZXIubkhvcnpTY2FsZSkge30KIAotICAgIENQVlRfV29yZFByb3BzKGNvbnN0IENQVlRfV29yZFByb3BzICYgb3RoZXIpIDoKLSAgICAgICAgbkZvbnRJbmRleChvdGhlci5uRm9udEluZGV4KSwgZkZvbnRTaXplKG90aGVyLmZGb250U2l6ZSksIGR3V29yZENvbG9yKG90aGVyLmR3V29yZENvbG9yKSwKLSAgICAgICAgblNjcmlwdFR5cGUob3RoZXIublNjcmlwdFR5cGUpLCBuV29yZFN0eWxlKG90aGVyLm5Xb3JkU3R5bGUpLCBmQ2hhclNwYWNlKG90aGVyLmZDaGFyU3BhY2UpLAotICAgICAgICBuSG9yelNjYWxlKG90aGVyLm5Ib3J6U2NhbGUpCi0gICAgewotICAgIH0KKyAgaW50MzJfdCBuRm9udEluZGV4OwogCi0gICAgRlhfSU5UMzIJCQkJCW5Gb250SW5kZXg7CisgIEZYX0ZMT0FUIGZGb250U2l6ZTsKIAotICAgIEZYX0ZMT0FUCQkJCQlmRm9udFNpemU7CisgIEZYX0NPTE9SUkVGIGR3V29yZENvbG9yOwogCi0gICAgRlhfQ09MT1JSRUYJCQkJCWR3V29yZENvbG9yOworICBpbnQzMl90IG5TY3JpcHRUeXBlOwogCi0gICAgRlhfSU5UMzIJCQkJCW5TY3JpcHRUeXBlOworICBpbnQzMl90IG5Xb3JkU3R5bGU7CiAKLSAgICBGWF9JTlQzMgkJCQkJbldvcmRTdHlsZTsKKyAgRlhfRkxPQVQgZkNoYXJTcGFjZTsKIAotICAgIEZYX0ZMT0FUCQkJCQlmQ2hhclNwYWNlOwotCi0gICAgRlhfSU5UMzIJCQkJCW5Ib3J6U2NhbGU7CisgIGludDMyX3QgbkhvcnpTY2FsZTsKIH07CiBzdHJ1Y3QgQ1BWVF9Xb3JkIHsKKyAgQ1BWVF9Xb3JkKCkKKyAgICAgIDogV29yZCgwKSwKKyAgICAgICAgbkNoYXJzZXQoMCksCisgICAgICAgIHB0V29yZCgwLCAwKSwKKyAgICAgICAgZkFzY2VudCgwLjBmKSwKKyAgICAgICAgZkRlc2NlbnQoMC4wZiksCisgICAgICAgIGZXaWR0aCgwLjBmKSwKKyAgICAgICAgZkZvbnRTaXplKDApLAorICAgICAgICBXb3JkUHJvcHMoKSB7fQogCi0gICAgQ1BWVF9Xb3JkKCkgOiBXb3JkKDApLCBuQ2hhcnNldCgwKSwgcHRXb3JkKDAsIDApLCBmQXNjZW50KDAuMGYpLCBmRGVzY2VudCgwLjBmKSwgZldpZHRoKDAuMGYpLAotICAgICAgICBmRm9udFNpemUoMCksIFdvcmRQcm9wcygpCi0gICAgewotICAgIH0KKyAgRlhfV09SRCBXb3JkOwogCi0gICAgRlhfV09SRAkJCQkJCVdvcmQ7CisgIGludDMyX3QgbkNoYXJzZXQ7CiAKLSAgICBGWF9JTlQzMgkJCQkJbkNoYXJzZXQ7CisgIENQVlRfV29yZFBsYWNlIFdvcmRQbGFjZTsKIAotICAgIENQVlRfV29yZFBsYWNlCQkJCVdvcmRQbGFjZTsKKyAgQ1BERl9Qb2ludCBwdFdvcmQ7CiAKLSAgICBDUERGX1BvaW50CQkJCQlwdFdvcmQ7CisgIEZYX0ZMT0FUIGZBc2NlbnQ7CiAKLSAgICBGWF9GTE9BVAkJCQkJZkFzY2VudDsKKyAgRlhfRkxPQVQgZkRlc2NlbnQ7CiAKLSAgICBGWF9GTE9BVAkJCQkJZkRlc2NlbnQ7CisgIEZYX0ZMT0FUIGZXaWR0aDsKIAotICAgIEZYX0ZMT0FUCQkJCQlmV2lkdGg7CisgIGludDMyX3QgbkZvbnRJbmRleDsKIAotICAgIEZYX0lOVDMyCQkJCQluRm9udEluZGV4OworICBGWF9GTE9BVCBmRm9udFNpemU7CiAKLSAgICBGWF9GTE9BVAkJCQkJZkZvbnRTaXplOwotCi0gICAgQ1BWVF9Xb3JkUHJvcHMJCQkJV29yZFByb3BzOworICBDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7CiB9Owogc3RydWN0IENQVlRfTGluZSB7CisgIENQVlRfTGluZSgpCisgICAgICA6IHB0TGluZSgwLCAwKSwgZkxpbmVXaWR0aCgwLjBmKSwgZkxpbmVBc2NlbnQoMC4wZiksIGZMaW5lRGVzY2VudCgwLjBmKSB7fQogCi0gICAgQ1BWVF9MaW5lKCkgOiBwdExpbmUoMCwgMCksIGZMaW5lV2lkdGgoMC4wZiksIGZMaW5lQXNjZW50KDAuMGYpLCBmTGluZURlc2NlbnQoMC4wZikKLSAgICB7Ci0gICAgfQorICBDUFZUX1dvcmRQbGFjZSBsaW5lcGxhY2U7CiAKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQlsaW5lcGxhY2U7CisgIENQVlRfV29yZFBsYWNlIGxpbmVFbmQ7CiAKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQlsaW5lRW5kOworICBDUERGX1BvaW50IHB0TGluZTsKIAotICAgIENQREZfUG9pbnQJCQkJCXB0TGluZTsKKyAgRlhfRkxPQVQgZkxpbmVXaWR0aDsKIAotICAgIEZYX0ZMT0FUCQkJCQlmTGluZVdpZHRoOworICBGWF9GTE9BVCBmTGluZUFzY2VudDsKIAotICAgIEZYX0ZMT0FUCQkJCQlmTGluZUFzY2VudDsKLQotICAgIEZYX0ZMT0FUCQkJCQlmTGluZURlc2NlbnQ7CisgIEZYX0ZMT0FUIGZMaW5lRGVzY2VudDsKIH07CiBzdHJ1Y3QgQ1BWVF9TZWN0aW9uIHsKKyAgQ1BWVF9Xb3JkUGxhY2Ugc2VjcGxhY2U7CiAKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQlzZWNwbGFjZTsKKyAgQ1BERl9SZWN0IHJjU2VjdGlvbjsKIAotICAgIENQREZfUmVjdAkJCQkJcmNTZWN0aW9uOworICBDUFZUX1NlY1Byb3BzIFNlY1Byb3BzOwogCi0gICAgQ1BWVF9TZWNQcm9wcwkJCQlTZWNQcm9wczsKLQotICAgIENQVlRfV29yZFByb3BzCQkJCVdvcmRQcm9wczsKKyAgQ1BWVF9Xb3JkUHJvcHMgV29yZFByb3BzOwogfTsKLWNsYXNzIElQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+SVBERl9WYXJpYWJsZVRleHRfUHJvdmlkZXIoKSB7IH0KK2NsYXNzIElQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyKCkge30KIAotICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJCQlHZXRDaGFyV2lkdGgoRlhfSU5UMzIgbkZvbnRJbmRleCwgRlhfV09SRCB3b3JkLCBGWF9JTlQzMiBuV29yZFN0eWxlKSA9IDA7CisgIHZpcnR1YWwgaW50MzJfdCBHZXRDaGFyV2lkdGgoaW50MzJfdCBuRm9udEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Xb3JkU3R5bGUpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJCQlHZXRUeXBlQXNjZW50KEZYX0lOVDMyIG5Gb250SW5kZXgpID0gMDsKKyAgdmlydHVhbCBpbnQzMl90IEdldFR5cGVBc2NlbnQoaW50MzJfdCBuRm9udEluZGV4KSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJCQkJR2V0VHlwZURlc2NlbnQoRlhfSU5UMzIgbkZvbnRJbmRleCkgPSAwOworICB2aXJ0dWFsIGludDMyX3QgR2V0VHlwZURlc2NlbnQoaW50MzJfdCBuRm9udEluZGV4KSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJCQkJR2V0V29yZEZvbnRJbmRleChGWF9XT1JEIHdvcmQsIEZYX0lOVDMyIGNoYXJzZXQsIEZYX0lOVDMyIG5Gb250SW5kZXgpID0gMDsKKyAgdmlydHVhbCBpbnQzMl90IEdldFdvcmRGb250SW5kZXgoRlhfV09SRCB3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZvbnRJbmRleCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQkJCUlzTGF0aW5Xb3JkKEZYX1dPUkQgd29yZCkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgSXNMYXRpbldvcmQoRlhfV09SRCB3b3JkKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0lOVDMyCQkJCQkJR2V0RGVmYXVsdEZvbnRJbmRleCgpID0gMDsKKyAgdmlydHVhbCBpbnQzMl90IEdldERlZmF1bHRGb250SW5kZXgoKSA9IDA7CiB9OwotY2xhc3MgSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5JUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcigpIHsgfQorY2xhc3MgSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IoKSB7fQogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQkJCU5leHRXb3JkKCkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgTmV4dFdvcmQoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJUHJldldvcmQoKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBQcmV2V29yZCgpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJCQlOZXh0TGluZSgpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIE5leHRMaW5lKCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQkJCVByZXZMaW5lKCkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgUHJldkxpbmUoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJTmV4dFNlY3Rpb24oKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBOZXh0U2VjdGlvbigpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJCQlQcmV2U2VjdGlvbigpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIFByZXZTZWN0aW9uKCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQkJCUdldFdvcmQoQ1BWVF9Xb3JkICYgd29yZCkgY29uc3QgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgR2V0V29yZChDUFZUX1dvcmQmIHdvcmQpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRXb3JkKGNvbnN0IENQVlRfV29yZCAmIHdvcmQpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIFNldFdvcmQoY29uc3QgQ1BWVF9Xb3JkJiB3b3JkKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJR2V0TGluZShDUFZUX0xpbmUgJiBsaW5lKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBHZXRMaW5lKENQVlRfTGluZSYgbGluZSkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJCQkJCUdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uICYgc2VjdGlvbikgY29uc3QgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgR2V0U2VjdGlvbihDUFZUX1NlY3Rpb24mIHNlY3Rpb24pIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwJRlhfQk9PTAkJCQkJCQlTZXRTZWN0aW9uKGNvbnN0IENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIFNldFNlY3Rpb24oY29uc3QgQ1BWVF9TZWN0aW9uJiBzZWN0aW9uKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0QXQoRlhfSU5UMzIgbldvcmRJbmRleCkgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0QXQoaW50MzJfdCBuV29yZEluZGV4KSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0QXQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0QXQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSA9IDA7CiAKLSAgICB2aXJ0dWFsIGNvbnN0IENQVlRfV29yZFBsYWNlICYJCQlHZXRBdCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgR2V0QXQoKSBjb25zdCA9IDA7CiB9OwotY2xhc3MgSVBERl9WYXJpYWJsZVRleHQKLXsKLXB1YmxpYzoKLSAgICBzdGF0aWMgSVBERl9WYXJpYWJsZVRleHQqCQkJTmV3VmFyaWFibGVUZXh0KCk7CitjbGFzcyBJUERGX1ZhcmlhYmxlVGV4dCB7CisgcHVibGljOgorICBzdGF0aWMgSVBERl9WYXJpYWJsZVRleHQqIE5ld1ZhcmlhYmxlVGV4dCgpOwogCi0gICAgc3RhdGljIHZvaWQJCQkJCQkJRGVsVmFyaWFibGVUZXh0KElQREZfVmFyaWFibGVUZXh0KiBwVlQpOworICBzdGF0aWMgdm9pZCBEZWxWYXJpYWJsZVRleHQoSVBERl9WYXJpYWJsZVRleHQqIHBWVCk7CiAKLSAgICB2aXJ0dWFsIElQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyKgkJU2V0UHJvdmlkZXIoSVBERl9WYXJpYWJsZVRleHRfUHJvdmlkZXIgKiBwUHJvdmlkZXIpID0gMDsKKyAgdmlydHVhbCBJUERGX1ZhcmlhYmxlVGV4dF9Qcm92aWRlciogU2V0UHJvdmlkZXIoCisgICAgICBJUERGX1ZhcmlhYmxlVGV4dF9Qcm92aWRlciogcFByb3ZpZGVyKSA9IDA7CiAKLSAgICB2aXJ0dWFsIElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKgkJR2V0SXRlcmF0b3IoKSA9IDA7CisgIHZpcnR1YWwgSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIEdldEl0ZXJhdG9yKCkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRQbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0JiByZWN0KSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0QWxpZ25tZW50KEZYX0lOVDMyIG5Gb3JtYXQgPSAwKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRBbGlnbm1lbnQoaW50MzJfdCBuRm9ybWF0ID0gMCkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldFBhc3N3b3JkQ2hhcihGWF9XT1JEIHdTdWJXb3JkID0gJyonKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRQYXNzd29yZENoYXIoRlhfV09SRCB3U3ViV29yZCA9ICcqJykgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldExpbWl0Q2hhcihGWF9JTlQzMiBuTGltaXRDaGFyID0gMCkgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0TGltaXRDaGFyKGludDMyX3QgbkxpbWl0Q2hhciA9IDApID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlTZXRDaGFyQXJyYXkoRlhfSU5UMzIgbkNoYXJBcnJheSA9IDApID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldENoYXJBcnJheShpbnQzMl90IG5DaGFyQXJyYXkgPSAwKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UgPSAwLjBmKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSA9IDAuMGYpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlTZXRIb3J6U2NhbGUoRlhfSU5UMzIgbkhvcnpTY2FsZSA9IDEwMCkgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZSA9IDEwMCkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldE11bHRpTGluZShGWF9CT09MIGJNdWx0aUxpbmUgPSBUUlVFKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRNdWx0aUxpbmUoRlhfQk9PTCBiTXVsdGlMaW5lID0gVFJVRSkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldEF1dG9SZXR1cm4oRlhfQk9PTCBiQXV0byA9IFRSVUUpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldEF1dG9SZXR1cm4oRlhfQk9PTCBiQXV0byA9IFRSVUUpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBdXRvRm9udFNpemUoRlhfQk9PTCBiQXV0byA9IFRSVUUpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldEF1dG9Gb250U2l6ZShGWF9CT09MIGJBdXRvID0gVFJVRSkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlTZXRSaWNoVGV4dChGWF9CT09MIGJSaWNoVGV4dCkgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0UmljaFRleHQoRlhfQk9PTCBiUmljaFRleHQpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlJbml0aWFsaXplKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZSgpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJCQlJc1ZhbGlkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgSXNWYWxpZCgpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQkJCQlJc1JpY2hUZXh0KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgSXNSaWNoVGV4dCgpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlSZWFycmFuZ2VBbGwoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBSZWFycmFuZ2VBbGwoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJUmVhcnJhbmdlUGFydChjb25zdCBDUFZUX1dvcmRSYW5nZSAmIFBsYWNlUmFuZ2UpID0gMDsKKyAgdmlydHVhbCB2b2lkIFJlYXJyYW5nZVBhcnQoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIFBsYWNlUmFuZ2UpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJCQkJCQlSZXNldEFsbCgpID0gMDsKKyAgdmlydHVhbCB2b2lkIFJlc2V0QWxsKCkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldFRleHQoRlhfTFBDV1NUUiB0ZXh0LCBGWF9JTlQzMiBjaGFyc2V0ID0gMSwgY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyA9IE5VTEwsCi0gICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgPSBOVUxMKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcyA9IE5VTEwpID0gMDsKIAotICAgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UJCQkJCUluc2VydFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgRlhfV09SRCB3b3JkLCBGWF9JTlQzMiBjaGFyc2V0ID0gMSwKLSAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpID0gMDsKKyAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZSBJbnNlcnRXb3JkKAorICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgRlhfV09SRCB3b3JkLAorICAgICAgaW50MzJfdCBjaGFyc2V0ID0gMSwKKyAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzID0gTlVMTCkgPSAwOwogCi0gICAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZQkJCQkJSW5zZXJ0U2VjdGlvbihjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzID0gTlVMTCwKLSAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpID0gMDsKKyAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZSBJbnNlcnRTZWN0aW9uKAorICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzID0gTlVMTCwKKyAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzID0gTlVMTCkgPSAwOwogCi0gICAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZQkJCQkJSW5zZXJ0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBGWF9MUENXU1RSIHRleHQsIEZYX0lOVDMyIGNoYXJzZXQgPSAxLAotICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyA9IE5VTEwsCWNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpID0gMDsKKyAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZSBJbnNlcnRUZXh0KAorICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgY29uc3QgRlhfV0NIQVIqIHRleHQsCisgICAgICBpbnQzMl90IGNoYXJzZXQgPSAxLAorICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzID0gTlVMTCwKKyAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzID0gTlVMTCkgPSAwOwogCi0gICAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZQkJCQkJRGVsZXRlV29yZHMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKSA9IDA7CisgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UgRGVsZXRlV29yZHMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIFBsYWNlUmFuZ2UpID0gMDsKIAotICAgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UJCQkJCURlbGV0ZVdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgPSAwOworICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlIERlbGV0ZVdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSA9IDA7CiAKLSAgICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlCQkJCQlCYWNrU3BhY2VXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpID0gMDsKKyAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZSBCYWNrU3BhY2VXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgPSAwOwogCi0gICAgdmlydHVhbCBjb25zdCBDUERGX1JlY3QgJgkJCQlHZXRQbGF0ZVJlY3QoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgY29uc3QgQ1BERl9SZWN0JiBHZXRQbGF0ZVJlY3QoKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIENQREZfUmVjdAkJCQkJCUdldENvbnRlbnRSZWN0KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIENQREZfUmVjdCBHZXRDb250ZW50UmVjdCgpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJCQlHZXRUb3RhbFdvcmRzKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGludDMyX3QgR2V0VG90YWxXb3JkcygpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgRlhfRkxPQVQJCQkJCQlHZXRGb250U2l6ZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRGb250U2l6ZSgpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJCQlHZXRBbGlnbm1lbnQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50MzJfdCBHZXRBbGlnbm1lbnQoKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX1dPUkQJCQkJCQkJR2V0UGFzc3dvcmRDaGFyKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIEZYX1dPUkQgR2V0UGFzc3dvcmRDaGFyKCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBGWF9JTlQzMgkJCQkJCUdldENoYXJBcnJheSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBpbnQzMl90IEdldENoYXJBcnJheSgpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJCQlHZXRMaW1pdENoYXIoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50MzJfdCBHZXRMaW1pdENoYXIoKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSXNNdWx0aUxpbmUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBJc011bHRpTGluZSgpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgRlhfSU5UMzIJCQkJCQlHZXRIb3J6U2NhbGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50MzJfdCBHZXRIb3J6U2NhbGUoKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0ZMT0FUCQkJCQkJR2V0Q2hhclNwYWNlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIEZYX0ZMT0FUIEdldENoYXJTcGFjZSgpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UJCQkJCUdldEJlZ2luV29yZFBsYWNlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlIEdldEJlZ2luV29yZFBsYWNlKCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZQkJCQkJR2V0RW5kV29yZFBsYWNlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlIEdldEVuZFdvcmRQbGFjZSgpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UJCQkJCUdldFByZXZXb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlIEdldFByZXZXb3JkUGxhY2UoCisgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UJCQkJCUdldE5leHRXb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlIEdldE5leHRXb3JkUGxhY2UoCisgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UJCQkJCVNlYXJjaFdvcmRQbGFjZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZSBTZWFyY2hXb3JkUGxhY2UoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UJCQkJCUdldFVwV29yZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3QgPSAwOworICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlIEdldFVwV29yZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZQkJCQkJR2V0RG93bldvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZSBHZXREb3duV29yZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlCQkJCQlHZXRMaW5lQmVnaW5QbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UgR2V0TGluZUJlZ2luUGxhY2UoCisgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UJCQkJCUdldExpbmVFbmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UgR2V0TGluZUVuZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZQkJCQkJR2V0U2VjdGlvbkJlZ2luUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlIEdldFNlY3Rpb25CZWdpblBsYWNlKAorICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlCQkJCQlHZXRTZWN0aW9uRW5kUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlIEdldFNlY3Rpb25FbmRQbGFjZSgKKyAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCQkJCQkJCVVwZGF0ZVdvcmRQbGFjZShDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBVcGRhdGVXb3JkUGxhY2UoQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlCQkJCQlBanVzdExpbmVIZWFkZXIoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgRlhfQk9PTCBiUHJldk9yTmV4dCkgY29uc3QgPSAwOworICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlIEFkanVzdExpbmVIZWFkZXIoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJldk9yTmV4dCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBGWF9JTlQzMgkJCQkJCVdvcmRQbGFjZVRvV29yZEluZGV4KGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBpbnQzMl90IFdvcmRQbGFjZVRvV29yZEluZGV4KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZQkJCQkJV29yZEluZGV4VG9Xb3JkUGxhY2UoRlhfSU5UMzIgaW5kZXgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZSBXb3JkSW5kZXhUb1dvcmRQbGFjZShpbnQzMl90IGluZGV4KSBjb25zdCA9IDA7CiAKLXByb3RlY3RlZDoKLSAgICB+SVBERl9WYXJpYWJsZVRleHQoKSB7IH0KKyBwcm90ZWN0ZWQ6CisgIH5JUERGX1ZhcmlhYmxlVGV4dCgpIHt9CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GUERGRE9DX0ZQREZfVlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9mcGRmdGV4dC9mcGRmX3RleHQuaCBiL2NvcmUvaW5jbHVkZS9mcGRmdGV4dC9mcGRmX3RleHQuaAppbmRleCBkMThhNzY5Li5hN2ZjNmJkIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnBkZnRleHQvZnBkZl90ZXh0LmgKKysrIGIvY29yZS9pbmNsdWRlL2ZwZGZ0ZXh0L2ZwZGZfdGV4dC5oCkBAIC0xLDE3MSArMSwxODQgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBDT1JFX0lOQ0xVREVfRlBERlRFWFRfRlBERl9URVhUX0hfCiAjZGVmaW5lIENPUkVfSU5DTFVERV9GUERGVEVYVF9GUERGX1RFWFRfSF8KIAotI2luY2x1ZGUgIi4uL2ZwZGZhcGkvZnBkZl9wYWdlLmgiCi0jaW5jbHVkZSAiLi4vZnBkZmFwaS9mcGRmX3BhZ2VvYmouaCIKLSNpbmNsdWRlICIuLi9mcGRmYXBpL2ZwZGZfcGFyc2VyLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYXJzZXIuaCIKIAorY2xhc3MgQ1BERl9QYWdlOwogY2xhc3MgQ1BERl9QYWdlT2JqZWN0czsKK2NsYXNzIENQREZfVGV4dE9iamVjdDsKIGNsYXNzIElQREZfTGlua0V4dHJhY3Q7CiBjbGFzcyBJUERGX1JlZmxvd2VkUGFnZTsKIGNsYXNzIElQREZfVGV4dFBhZ2U7CiBjbGFzcyBJUERGX1RleHRQYWdlRmluZDsKIAotI2RlZmluZSBQREYyVFhUX0FVVE9fUk9UQVRFCQkxCi0jZGVmaW5lIFBERjJUWFRfQVVUT19XSURUSAkJMgotI2RlZmluZSBQREYyVFhUX0tFRVBfQ09MVU1OCQk0Ci0jZGVmaW5lIFBERjJUWFRfVVNFX09DUgkJCTgKLSNkZWZpbmUgUERGMlRYVF9JTkNMVURFX0lOVklTSUJMRQkxNgotdm9pZCBQREZfR2V0UGFnZVRleHQoQ0ZYX0J5dGVTdHJpbmdBcnJheSYgbGluZXMsIENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcFBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgaU1pbldpZHRoLCBGWF9EV09SRCBmbGFncyk7Ci12b2lkIFBERl9HZXRQYWdlVGV4dF9Vbmljb2RlKENGWF9XaWRlU3RyaW5nQXJyYXkmIGxpbmVzLCBDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaU1pbldpZHRoLCBGWF9EV09SRCBmbGFncyk7Ci12b2lkIFBERl9HZXRUZXh0U3RyZWFtX1VuaWNvZGUoQ0ZYX1dpZGVUZXh0QnVmJiBidWZmZXIsIENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcFBhZ2UsCisjZGVmaW5lIFBERjJUWFRfQVVUT19ST1RBVEUgMQorI2RlZmluZSBQREYyVFhUX0FVVE9fV0lEVEggMgorI2RlZmluZSBQREYyVFhUX0tFRVBfQ09MVU1OIDQKKyNkZWZpbmUgUERGMlRYVF9VU0VfT0NSIDgKKyNkZWZpbmUgUERGMlRYVF9JTkNMVURFX0lOVklTSUJMRSAxNgordm9pZCBQREZfR2V0UGFnZVRleHQoQ0ZYX0J5dGVTdHJpbmdBcnJheSYgbGluZXMsCisgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBpTWluV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncyk7Cit2b2lkIFBERl9HZXRQYWdlVGV4dF9Vbmljb2RlKENGWF9XaWRlU3RyaW5nQXJyYXkmIGxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaU1pbldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncyk7Cit2b2lkIFBERl9HZXRUZXh0U3RyZWFtX1VuaWNvZGUoQ0ZYX1dpZGVUZXh0QnVmJiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzKTsKLUNGWF9XaWRlU3RyaW5nIFBERl9HZXRGaXJzdFRleHRMaW5lX1VuaWNvZGUoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZSk7Ci0jZGVmaW5lIENIQVJfRVJST1IJCQktMQotI2RlZmluZSBDSEFSX05PUk1BTAkJCTAKLSNkZWZpbmUgQ0hBUl9HRU5FUkFURUQJCTEKLSNkZWZpbmUgQ0hBUl9VTlVOSUNPREUJCTIKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBGWF9XQ0hBUgkJCW1fVW5pY29kZTsKLSAgICBGWF9XQ0hBUgkJCW1fQ2hhcmNvZGU7Ci0gICAgRlhfSU5UMzIJCQltX0ZsYWc7Ci0gICAgRlhfRkxPQVQJCQltX0ZvbnRTaXplOwotICAgIEZYX0ZMT0FUCQkJbV9PcmlnaW5YOwotICAgIEZYX0ZMT0FUCQkJbV9PcmlnaW5ZOwotICAgIENGWF9GbG9hdFJlY3QJCW1fQ2hhckJveDsKLSAgICBDUERGX1RleHRPYmplY3QqCW1fcFRleHRPYmo7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeAltX01hdHJpeDsKLX0gRlBERl9DSEFSX0lORk87Ci10eXBlZGVmCUNGWF9BcnJheVRlbXBsYXRlPENGWF9GbG9hdFJlY3Q+IENGWF9SZWN0QXJyYXk7Ci0jZGVmaW5lIEZQREZURVhUX0xSVEIJMAotI2RlZmluZSBGUERGVEVYVF9STFRCCTEKLSNkZWZpbmUgRlBERlRFWFRfVEJSTAkyCi0jZGVmaW5lIEZQREZURVhUX0xFRlQJCQktMQotI2RlZmluZSBGUERGVEVYVF9SSUdIVAkJCTEKLSNkZWZpbmUgRlBERlRFWFRfVVAJCQkJLTIKLSNkZWZpbmUgRlBERlRFWFRfRE9XTgkJCTIKLSNkZWZpbmUgRlBERlRFWFRfV1JJVElOR01PREVfVU5LTk9XCTAKLSNkZWZpbmUgRlBERlRFWFRfV1JJVElOR01PREVfTFJUQgkxCi0jZGVmaW5lIEZQREZURVhUX1dSSVRJTkdNT0RFX1JMVEIJMgotI2RlZmluZSBGUERGVEVYVF9XUklUSU5HTU9ERV9UQlJMCTMKLWNsYXNzIENQREZUZXh0X1BhcnNlT3B0aW9ucyAKLXsKLXB1YmxpYzoKK0NGWF9XaWRlU3RyaW5nIFBERl9HZXRGaXJzdFRleHRMaW5lX1VuaWNvZGUoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZSk7CisjZGVmaW5lIENIQVJfRVJST1IgLTEKKyNkZWZpbmUgQ0hBUl9OT1JNQUwgMAorI2RlZmluZSBDSEFSX0dFTkVSQVRFRCAxCisjZGVmaW5lIENIQVJfVU5VTklDT0RFIDIKIAotICAgIENQREZUZXh0X1BhcnNlT3B0aW9ucygpOwotICAgIEZYX0JPT0wJCQltX2JHZXRDaGFyQ29kZU9ubHk7Ci0gICAgRlhfQk9PTAkJCW1fYk5vcm1hbGl6ZU9ianM7Ci0gICAgRlhfQk9PTAkJCW1fYk91dHB1dEh5cGhlbjsKK3N0cnVjdCBGUERGX0NIQVJfSU5GTyB7CisgIEZYX1dDSEFSIG1fVW5pY29kZTsKKyAgRlhfV0NIQVIgbV9DaGFyY29kZTsKKyAgaW50MzJfdCBtX0ZsYWc7CisgIEZYX0ZMT0FUIG1fRm9udFNpemU7CisgIEZYX0ZMT0FUIG1fT3JpZ2luWDsKKyAgRlhfRkxPQVQgbV9PcmlnaW5ZOworICBDRlhfRmxvYXRSZWN0IG1fQ2hhckJveDsKKyAgQ1BERl9UZXh0T2JqZWN0KiBtX3BUZXh0T2JqOworICBDRlhfTWF0cml4IG1fTWF0cml4OwogfTsKLWNsYXNzIElQREZfVGV4dFBhZ2UgCi17Ci1wdWJsaWM6CiAKLSAgICB2aXJ0dWFsIH5JUERGX1RleHRQYWdlKCkge30KLSAgICBzdGF0aWMgSVBERl9UZXh0UGFnZSoJQ3JlYXRlVGV4dFBhZ2UoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ1BERlRleHRfUGFyc2VPcHRpb25zIFBhcnNlck9wdGlvbnMpOwotICAgIHN0YXRpYyBJUERGX1RleHRQYWdlKglDcmVhdGVUZXh0UGFnZShjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBpbnQgZmxhZ3MgPSAwKTsKLSAgICBzdGF0aWMgSVBERl9UZXh0UGFnZSoJQ3JlYXRlVGV4dFBhZ2UoY29uc3QgQ1BERl9QYWdlT2JqZWN0cyogcE9ianMsIGludCBmbGFncyA9IDApOwotICAgIHN0YXRpYyBJUERGX1RleHRQYWdlKglDcmVhdGVSZWZsb3dUZXh0UGFnZShJUERGX1JlZmxvd2VkUGFnZSogcFJlZlBhZ2UpOwotCi0gICAgdmlydHVhbCB2b2lkCQkJTm9ybWFsaXplT2JqZWN0cyhGWF9CT09MIGJOb3JtYWxpemUpID0gMDsKLQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVBhcnNlVGV4dFBhZ2UoKSA9IDA7Ci0KLQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzUGFyc2VyZWQoKSBjb25zdCA9IDA7Ci1wdWJsaWM6Ci0KLSAgICB2aXJ0dWFsIGludCBDaGFySW5kZXhGcm9tVGV4dEluZGV4KGludCBUZXh0SW5kZXgpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgaW50IFRleHRJbmRleEZyb21DaGFySW5kZXgoaW50IENoYXJJbmRleCkgY29uc3QgPSAwOwotCi0KLSAgICB2aXJ0dWFsIGludAkJCQlDb3VudENoYXJzKCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbAl2b2lkCQkJR2V0Q2hhckluZm8oaW50IGluZGV4LCBGUERGX0NIQVJfSU5GTyAmIGluZm8pIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZAkJCUdldFJlY3RBcnJheShpbnQgc3RhcnQsIGludCBuQ291bnQsIENGWF9SZWN0QXJyYXkmIHJlY3RBcnJheSkgY29uc3QgPSAwOwotCi0KLQotICAgIHZpcnR1YWwgaW50CQkJCUdldEluZGV4QXRQb3MoQ1BERl9Qb2ludCBwb2ludCwgRlhfRkxPQVQgeFRvcmVsYW5jZSwgRlhfRkxPQVQgeVRvcmVsYW5jZSkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCBpbnQJCQkJR2V0SW5kZXhBdFBvcyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBGWF9GTE9BVCB4VG9yZWxhbmNlLCBGWF9GTE9BVCB5VG9yZWxhbmNlKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsCWludAkJCQlHZXRPcmRlckJ5RGlyZWN0aW9uKGludCBpbmRleCwgaW50IGRpcmVjdGlvbikgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCBDRlhfV2lkZVN0cmluZwlHZXRUZXh0QnlSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZAkJCUdldFJlY3RzQXJyYXlCeVJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwgQ0ZYX1JlY3RBcnJheSYgcmVzUmVjdEFycmF5KSBjb25zdCA9IDA7Ci0KLQotICAgIHZpcnR1YWwgaW50CQkJCUNvdW50UmVjdHMoaW50IHN0YXJ0LCBpbnQgbkNvdW50KSA9IDA7Ci0KLSAgICB2aXJ0dWFsCXZvaWQJCQlHZXRSZWN0KGludCByZWN0SW5kZXgsIEZYX0ZMT0FUJiBsZWZ0LCBGWF9GTE9BVCYgdG9wLCBGWF9GTE9BVCYgcmlnaHQsIEZYX0ZMT0FUICZib3R0b20pIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldEJhc2VsaW5lUm90YXRlKGludCByZWN0SW5kZXgsIGludCYgUm90YXRlKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRCYXNlbGluZVJvdGF0ZShjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0LCBpbnQmIFJvdGF0ZSkgPSAwOwotCi0gICAgdmlydHVhbAlpbnQJCQkJQ291bnRCb3VuZGVkU2VnbWVudHMoRlhfRkxPQVQgbGVmdCwgRlhfRkxPQVQgdG9wLCBGWF9GTE9BVCByaWdodCwgRlhfRkxPQVQgYm90dG9tLCBGWF9CT09MIGJDb250YWlucyA9IEZBTFNFKSA9IDA7Ci0KLSAgICB2aXJ0dWFsCXZvaWQJCQlHZXRCb3VuZGVkU2VnbWVudChpbnQgaW5kZXgsIGludCYgc3RhcnQsIGludCYgY291bnQpIGNvbnN0ID0gMDsKLQotCi0gICAgdmlydHVhbCBpbnQJCQkJR2V0V29yZEJyZWFrKGludCBpbmRleCwgaW50IGRpcmVjdGlvbikgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCBDRlhfV2lkZVN0cmluZwlHZXRQYWdlVGV4dChpbnQgc3RhcnQgPSAwLCBpbnQgbkNvdW50ID0gLTEgKSBjb25zdCA9IDA7Cit0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPENGWF9GbG9hdFJlY3Q+IENGWF9SZWN0QXJyYXk7CisjZGVmaW5lIEZQREZURVhUX0xSVEIgMAorI2RlZmluZSBGUERGVEVYVF9STFRCIDEKKyNkZWZpbmUgRlBERlRFWFRfVEJSTCAyCisjZGVmaW5lIEZQREZURVhUX0xFRlQgLTEKKyNkZWZpbmUgRlBERlRFWFRfUklHSFQgMQorI2RlZmluZSBGUERGVEVYVF9VUCAtMgorI2RlZmluZSBGUERGVEVYVF9ET1dOIDIKKyNkZWZpbmUgRlBERlRFWFRfV1JJVElOR01PREVfVU5LTk9XIDAKKyNkZWZpbmUgRlBERlRFWFRfV1JJVElOR01PREVfTFJUQiAxCisjZGVmaW5lIEZQREZURVhUX1dSSVRJTkdNT0RFX1JMVEIgMgorI2RlZmluZSBGUERGVEVYVF9XUklUSU5HTU9ERV9UQlJMIDMKK2NsYXNzIENQREZUZXh0X1BhcnNlT3B0aW9ucyB7CisgcHVibGljOgorICBDUERGVGV4dF9QYXJzZU9wdGlvbnMoKTsKKyAgRlhfQk9PTCBtX2JHZXRDaGFyQ29kZU9ubHk7CisgIEZYX0JPT0wgbV9iTm9ybWFsaXplT2JqczsKKyAgRlhfQk9PTCBtX2JPdXRwdXRIeXBoZW47CiB9OwotI2RlZmluZSBGUERGVEVYVF9NQVRDSENBU0UgICAgICAweDAwMDAwMDAxCisKK2NsYXNzIElQREZfVGV4dFBhZ2UgeworIHB1YmxpYzoKKyAgc3RhdGljIElQREZfVGV4dFBhZ2UqIENyZWF0ZVRleHRQYWdlKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsIGludCBmbGFncyA9IDApOworICBzdGF0aWMgSVBERl9UZXh0UGFnZSogQ3JlYXRlUmVmbG93VGV4dFBhZ2UoSVBERl9SZWZsb3dlZFBhZ2UqIHBSZWZQYWdlKTsKKworICB2aXJ0dWFsIH5JUERGX1RleHRQYWdlKCkge30KKworICB2aXJ0dWFsIHZvaWQgTm9ybWFsaXplT2JqZWN0cyhGWF9CT09MIGJOb3JtYWxpemUpID0gMDsKKworICB2aXJ0dWFsIEZYX0JPT0wgUGFyc2VUZXh0UGFnZSgpID0gMDsKKworICB2aXJ0dWFsIGJvb2wgSXNQYXJzZWQoKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBpbnQgQ2hhckluZGV4RnJvbVRleHRJbmRleChpbnQgVGV4dEluZGV4KSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBpbnQgVGV4dEluZGV4RnJvbUNoYXJJbmRleChpbnQgQ2hhckluZGV4KSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBpbnQgQ291bnRDaGFycygpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIHZvaWQgR2V0Q2hhckluZm8oaW50IGluZGV4LCBGUERGX0NIQVJfSU5GTyogaW5mbykgY29uc3QgPSAwOworCisgIHZpcnR1YWwgdm9pZCBHZXRSZWN0QXJyYXkoaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RBcnJheSYgcmVjdEFycmF5KSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBpbnQgR2V0SW5kZXhBdFBvcyhDUERGX1BvaW50IHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHhUb2xlcmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeVRvbGVyYW5jZSkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgaW50IEdldEluZGV4QXRQb3MoRlhfRkxPQVQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHhUb2xlcmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeVRvbGVyYW5jZSkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0VGV4dEJ5UmVjdChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCB2b2lkIEdldFJlY3RzQXJyYXlCeVJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RBcnJheSYgcmVzUmVjdEFycmF5KSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBpbnQgQ291bnRSZWN0cyhpbnQgc3RhcnQsIGludCBuQ291bnQpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgR2V0UmVjdChpbnQgcmVjdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgYm90dG9tKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBGWF9CT09MIEdldEJhc2VsaW5lUm90YXRlKGludCByZWN0SW5kZXgsIGludCYgUm90YXRlKSA9IDA7CisKKyAgdmlydHVhbCBGWF9CT09MIEdldEJhc2VsaW5lUm90YXRlKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QsIGludCYgUm90YXRlKSA9IDA7CisKKyAgdmlydHVhbCBpbnQgQ291bnRCb3VuZGVkU2VnbWVudHMoRlhfRkxPQVQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDb250YWlucyA9IEZBTFNFKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIEdldEJvdW5kZWRTZWdtZW50KGludCBpbmRleCwgaW50JiBzdGFydCwgaW50JiBjb3VudCkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgaW50IEdldFdvcmRCcmVhayhpbnQgaW5kZXgsIGludCBkaXJlY3Rpb24pIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIEdldFBhZ2VUZXh0KGludCBzdGFydCA9IDAsIGludCBuQ291bnQgPSAtMSkgY29uc3QgPSAwOworfTsKKworI2RlZmluZSBGUERGVEVYVF9NQVRDSENBU0UgMHgwMDAwMDAwMQogI2RlZmluZSBGUERGVEVYVF9NQVRDSFdIT0xFV09SRCAweDAwMDAwMDAyCi0jZGVmaW5lIEZQREZURVhUX0NPTlNFQ1VUSVZFCTB4MDAwMDAwMDQKLWNsYXNzIElQREZfVGV4dFBhZ2VGaW5kIAotewotcHVibGljOgorI2RlZmluZSBGUERGVEVYVF9DT05TRUNVVElWRSAweDAwMDAwMDA0CitjbGFzcyBJUERGX1RleHRQYWdlRmluZCB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JUERGX1RleHRQYWdlRmluZCgpIHt9CiAKLSAgICB2aXJ0dWFsCX5JUERGX1RleHRQYWdlRmluZCgpIHt9CisgIHN0YXRpYyBJUERGX1RleHRQYWdlRmluZCogQ3JlYXRlUGFnZUZpbmQoY29uc3QgSVBERl9UZXh0UGFnZSogcFRleHRQYWdlKTsKIAotICAgIHN0YXRpYwlJUERGX1RleHRQYWdlRmluZCoJQ3JlYXRlUGFnZUZpbmQoY29uc3QgSVBERl9UZXh0UGFnZSogcFRleHRQYWdlKTsKLXB1YmxpYzoKKyBwdWJsaWM6CisgIHZpcnR1YWwgRlhfQk9PTCBGaW5kRmlyc3QoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZpbmR3aGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRQb3MgPSAwKSA9IDA7CiAKLSAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJRmluZEZpcnN0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmaW5kd2hhdCwgaW50IGZsYWdzLCBpbnQgc3RhcnRQb3MgPSAwKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBGaW5kTmV4dCgpID0gMDsKIAotICAgIHZpcnR1YWwJRlhfQk9PTAkJCQlGaW5kTmV4dCgpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIEZpbmRQcmV2KCkgPSAwOwogCi0gICAgdmlydHVhbAlGWF9CT09MCQkJCUZpbmRQcmV2KCkgPSAwOworICB2aXJ0dWFsIHZvaWQgR2V0UmVjdEFycmF5KENGWF9SZWN0QXJyYXkmIHJlY3RzKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQkJR2V0UmVjdEFycmF5KENGWF9SZWN0QXJyYXkmIHJlY3RzKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50IEdldEN1ck9yZGVyKCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBpbnQJCQkJCUdldEN1ck9yZGVyKCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCBpbnQJCQkJCUdldE1hdGNoZWRDb3VudCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBpbnQgR2V0TWF0Y2hlZENvdW50KCkgY29uc3QgPSAwOwogfTsKLWNsYXNzIElQREZfTGlua0V4dHJhY3QgCi17Ci1wdWJsaWM6CitjbGFzcyBJUERGX0xpbmtFeHRyYWN0IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklQREZfTGlua0V4dHJhY3QoKSB7fQogCi0gICAgdmlydHVhbAl+SVBERl9MaW5rRXh0cmFjdCgpIHt9CisgIHN0YXRpYyBJUERGX0xpbmtFeHRyYWN0KiBDcmVhdGVMaW5rRXh0cmFjdCgpOwogCi0gICAgc3RhdGljCUlQREZfTGlua0V4dHJhY3QqCUNyZWF0ZUxpbmtFeHRyYWN0KCk7CisgIHZpcnR1YWwgRlhfQk9PTCBFeHRyYWN0TGlua3MoY29uc3QgSVBERl9UZXh0UGFnZSogcFRleHRQYWdlKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRXh0cmFjdExpbmtzKGNvbnN0IElQREZfVGV4dFBhZ2UqIHBUZXh0UGFnZSkgPSAwOwotcHVibGljOgorIHB1YmxpYzoKKyAgdmlydHVhbCBpbnQgQ291bnRMaW5rcygpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgaW50CQkJCQlDb3VudExpbmtzKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIEdldFVSTChpbnQgaW5kZXgpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcJCUdldFVSTChpbnQgaW5kZXgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdldEJvdW5kZWRTZWdtZW50KGludCBpbmRleCwgaW50JiBzdGFydCwgaW50JiBjb3VudCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbAl2b2lkCQkJCUdldEJvdW5kZWRTZWdtZW50KGludCBpbmRleCwgaW50JiBzdGFydCwgaW50JiBjb3VudCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkCQkJCUdldFJlY3RzKGludCBpbmRleCwgQ0ZYX1JlY3RBcnJheSYgcmVjdHMpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdldFJlY3RzKGludCBpbmRleCwgQ0ZYX1JlY3RBcnJheSYgcmVjdHMpIGNvbnN0ID0gMDsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9JTkNMVURFX0ZQREZURVhUX0ZQREZfVEVYVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y29kZWMvREVQUyBiL2NvcmUvaW5jbHVkZS9meGNvZGVjL0RFUFMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ4ZWI2MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaW5jbHVkZS9meGNvZGVjL0RFUFMKQEAgLTAsMCArMSwzIEBACitpbmNsdWRlX3J1bGVzID0gWworICAnK3RoaXJkX3BhcnR5L3psaWJfdjEyOC96bGliLmgnLAorXQpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCBiL2NvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgKaW5kZXggMmQ5MDJjOC4uYjBjMWQ1NyAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oCkBAIC0xLDI5MCArMSw1NTggQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBDT1JFX0lOQ0xVREVfRlhDT0RFQ19GWF9DT0RFQ19IXwogI2RlZmluZSBDT1JFX0lOQ0xVREVfRlhDT0RFQ19GWF9DT0RFQ19IXwogCi0jaW5jbHVkZSAiLi4vZnhjcnQvZnhfZXh0LmgiCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlY19kZWYuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIgIC8vIEZvciBGWF9SRUNULgogI2luY2x1ZGUgImZ4X2NvZGVjX2RlZi5oIgotI2luY2x1ZGUgImZ4X2NvZGVjX3Byb3ZpZGVyLmgiCiAKIGNsYXNzIENGWF9ESUJTb3VyY2U7Ci1jbGFzcyBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyOworY2xhc3MgQ0pQWF9EZWNvZGVyOworY2xhc3MgQ1BERl9Db2xvclNwYWNlOworY2xhc3MgQ1BERl9Qcml2YXRlRGF0YTsKK2NsYXNzIENQREZfU3RyZWFtQWNjOwogY2xhc3MgSUNvZGVjX0Jhc2ljTW9kdWxlOwogY2xhc3MgSUNvZGVjX0ZheE1vZHVsZTsKK2NsYXNzIElDb2RlY19GbGF0ZU1vZHVsZTsKK2NsYXNzIElDb2RlY19JY2NNb2R1bGU7CitjbGFzcyBJQ29kZWNfSmJpZzJFbmNvZGVyOworY2xhc3MgSUNvZGVjX0piaWcyTW9kdWxlOwogY2xhc3MgSUNvZGVjX0pwZWdNb2R1bGU7CiBjbGFzcyBJQ29kZWNfSnB4TW9kdWxlOwotY2xhc3MgSUNvZGVjX0piaWcyTW9kdWxlOwotY2xhc3MgSUNvZGVjX0ljY01vZHVsZTsKLWNsYXNzIElDb2RlY19GbGF0ZU1vZHVsZTsKLWNsYXNzIElDb2RlY19KYmlnMkVuY29kZXI7CiBjbGFzcyBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyOwotY2xhc3MgQ0NvZGVjX01vZHVsZU1nciAKLXsKLXB1YmxpYzoKIAotICAgIHN0YXRpYyBDQ29kZWNfTW9kdWxlTWdyKglDcmVhdGUoKTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorY2xhc3MgSUNvZGVjX0JtcE1vZHVsZTsKK2NsYXNzIElDb2RlY19HaWZNb2R1bGU7CitjbGFzcyBJQ29kZWNfUG5nTW9kdWxlOworY2xhc3MgSUNvZGVjX1Byb2dyZXNzaXZlRGVjb2RlcjsKK2NsYXNzIElDb2RlY19UaWZmTW9kdWxlOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCi0gICAgdm9pZAkJCQlEZXN0cm95KCk7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK2NsYXNzIENGWF9ESUJBdHRyaWJ1dGUgeworIHB1YmxpYzoKKyAgQ0ZYX0RJQkF0dHJpYnV0ZSgpOworICB+Q0ZYX0RJQkF0dHJpYnV0ZSgpOwogCi0gICAgdm9pZAkJCQlJbml0SmJpZzJEZWNvZGVyKCk7Ci0KLSAgICB2b2lkCQkJCUluaXRKcHhEZWNvZGVyKCk7Ci0KLQotICAgIHZvaWQJCQkJSW5pdEljY0RlY29kZXIoKTsKLQotICAgIElDb2RlY19KYmlnMkVuY29kZXIqCQlDcmVhdGVKYmlnMkVuY29kZXIoKTsKLXByb3RlY3RlZDoKLSAgICBDQ29kZWNfTW9kdWxlTWdyKCk7Ci0gICAgfkNDb2RlY19Nb2R1bGVNZ3IoKTsKLXB1YmxpYzoKLSAgICBJQ29kZWNfQmFzaWNNb2R1bGUqCUdldEJhc2ljTW9kdWxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BCYXNpY01vZHVsZTsKLSAgICB9Ci0gICAgSUNvZGVjX0ZheE1vZHVsZSoJR2V0RmF4TW9kdWxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BGYXhNb2R1bGU7Ci0gICAgfQotICAgIElDb2RlY19KcGVnTW9kdWxlKglHZXRKcGVnTW9kdWxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BKcGVnTW9kdWxlOwotICAgIH0KLSAgICBJQ29kZWNfSnB4TW9kdWxlKglHZXRKcHhNb2R1bGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEpweE1vZHVsZTsKLSAgICB9Ci0gICAgSUNvZGVjX0piaWcyTW9kdWxlKglHZXRKYmlnMk1vZHVsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wSmJpZzJNb2R1bGU7Ci0gICAgfQotICAgIElDb2RlY19JY2NNb2R1bGUqCUdldEljY01vZHVsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wSWNjTW9kdWxlOwotICAgIH0KLSAgICBJQ29kZWNfRmxhdGVNb2R1bGUqCUdldEZsYXRlTW9kdWxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BGbGF0ZU1vZHVsZTsKLSAgICB9Ci1wcm90ZWN0ZWQ6Ci0gICAgSUNvZGVjX0Jhc2ljTW9kdWxlKgltX3BCYXNpY01vZHVsZTsKLSAgICBJQ29kZWNfRmF4TW9kdWxlKgltX3BGYXhNb2R1bGU7Ci0gICAgSUNvZGVjX0pwZWdNb2R1bGUqCW1fcEpwZWdNb2R1bGU7Ci0gICAgSUNvZGVjX0pweE1vZHVsZSoJbV9wSnB4TW9kdWxlOwotICAgIElDb2RlY19KYmlnMk1vZHVsZSoJbV9wSmJpZzJNb2R1bGU7Ci0gICAgSUNvZGVjX0ljY01vZHVsZSoJbV9wSWNjTW9kdWxlOwotICAgIElDb2RlY19GbGF0ZU1vZHVsZSoJbV9wRmxhdGVNb2R1bGU7Ci0KKyAgaW50MzJfdCBtX25YRFBJOworICBpbnQzMl90IG1fbllEUEk7CisgIEZYX0ZMT0FUIG1fZkFzcGVjdFJhdGlvOworICBGWF9XT1JEIG1fd0RQSVVuaXQ7CisgIENGWF9CeXRlU3RyaW5nIG1fc3RyQXV0aG9yOworICB1aW50OF90IG1fc3RyVGltZVsyMF07CisgIGludDMyX3QgbV9uR2lmTGVmdDsKKyAgaW50MzJfdCBtX25HaWZUb3A7CisgIEZYX0RXT1JEKiBtX3BHaWZMb2NhbFBhbGV0dGU7CisgIEZYX0RXT1JEIG1fbkdpZkxvY2FsUGFsTnVtOworICBpbnQzMl90IG1fbkJtcENvbXByZXNzVHlwZTsKKyAgc3RkOjptYXA8RlhfRFdPUkQsIHZvaWQqPiBtX0V4aWY7CiB9OwotY2xhc3MgSUNvZGVjX0Jhc2ljTW9kdWxlIAotewotcHVibGljOgorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCi0gICAgdmlydHVhbCB+SUNvZGVjX0Jhc2ljTW9kdWxlKCkge30KLSAgICB2aXJ0dWFsIEZYX0JPT0wJUnVuTGVuZ3RoRW5jb2RlKGNvbnN0IEZYX0JZVEUqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBGWF9MUEJZVEUmIGRlc3RfYnVmLAorY2xhc3MgQ0NvZGVjX01vZHVsZU1nciB7CisgcHVibGljOgorICBDQ29kZWNfTW9kdWxlTWdyKCk7CisKKyAgSUNvZGVjX0Jhc2ljTW9kdWxlKiBHZXRCYXNpY01vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcEJhc2ljTW9kdWxlLmdldCgpOyB9CisgIElDb2RlY19GYXhNb2R1bGUqIEdldEZheE1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcEZheE1vZHVsZS5nZXQoKTsgfQorICBJQ29kZWNfSnBlZ01vZHVsZSogR2V0SnBlZ01vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcEpwZWdNb2R1bGUuZ2V0KCk7IH0KKyAgSUNvZGVjX0pweE1vZHVsZSogR2V0SnB4TW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbV9wSnB4TW9kdWxlLmdldCgpOyB9CisgIElDb2RlY19KYmlnMk1vZHVsZSogR2V0SmJpZzJNb2R1bGUoKSBjb25zdCB7IHJldHVybiBtX3BKYmlnMk1vZHVsZS5nZXQoKTsgfQorICBJQ29kZWNfSWNjTW9kdWxlKiBHZXRJY2NNb2R1bGUoKSBjb25zdCB7IHJldHVybiBtX3BJY2NNb2R1bGUuZ2V0KCk7IH0KKyAgSUNvZGVjX0ZsYXRlTW9kdWxlKiBHZXRGbGF0ZU1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcEZsYXRlTW9kdWxlLmdldCgpOyB9CisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBJQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKiBDcmVhdGVQcm9ncmVzc2l2ZURlY29kZXIoKTsKKyAgSUNvZGVjX1BuZ01vZHVsZSogR2V0UG5nTW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbV9wUG5nTW9kdWxlLmdldCgpOyB9CisgIElDb2RlY19HaWZNb2R1bGUqIEdldEdpZk1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcEdpZk1vZHVsZS5nZXQoKTsgfQorICBJQ29kZWNfQm1wTW9kdWxlKiBHZXRCbXBNb2R1bGUoKSBjb25zdCB7IHJldHVybiBtX3BCbXBNb2R1bGUuZ2V0KCk7IH0KKyAgSUNvZGVjX1RpZmZNb2R1bGUqIEdldFRpZmZNb2R1bGUoKSBjb25zdCB7IHJldHVybiBtX3BUaWZmTW9kdWxlLmdldCgpOyB9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKKyBwcm90ZWN0ZWQ6CisgIHN0ZDo6dW5pcXVlX3B0cjxJQ29kZWNfQmFzaWNNb2R1bGU+IG1fcEJhc2ljTW9kdWxlOworICBzdGQ6OnVuaXF1ZV9wdHI8SUNvZGVjX0ZheE1vZHVsZT4gbV9wRmF4TW9kdWxlOworICBzdGQ6OnVuaXF1ZV9wdHI8SUNvZGVjX0pwZWdNb2R1bGU+IG1fcEpwZWdNb2R1bGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJQ29kZWNfSnB4TW9kdWxlPiBtX3BKcHhNb2R1bGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJQ29kZWNfSmJpZzJNb2R1bGU+IG1fcEpiaWcyTW9kdWxlOworICBzdGQ6OnVuaXF1ZV9wdHI8SUNvZGVjX0ljY01vZHVsZT4gbV9wSWNjTW9kdWxlOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIHN0ZDo6dW5pcXVlX3B0cjxJQ29kZWNfUG5nTW9kdWxlPiBtX3BQbmdNb2R1bGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJQ29kZWNfR2lmTW9kdWxlPiBtX3BHaWZNb2R1bGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJQ29kZWNfQm1wTW9kdWxlPiBtX3BCbXBNb2R1bGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJQ29kZWNfVGlmZk1vZHVsZT4gbV9wVGlmZk1vZHVsZTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgc3RkOjp1bmlxdWVfcHRyPElDb2RlY19GbGF0ZU1vZHVsZT4gbV9wRmxhdGVNb2R1bGU7Cit9OworY2xhc3MgSUNvZGVjX0Jhc2ljTW9kdWxlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklDb2RlY19CYXNpY01vZHVsZSgpIHt9CisgIHZpcnR1YWwgRlhfQk9PTCBSdW5MZW5ndGhFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgQTg1RW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpID0gMDsKKyAgdmlydHVhbCBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKiBDcmVhdGVSdW5MZW5ndGhEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJwYykgPSAwOworfTsKKworY2xhc3MgSUNvZGVjX1NjYW5saW5lRGVjb2RlciB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JQ29kZWNfU2NhbmxpbmVEZWNvZGVyKCkge30KKworICB2aXJ0dWFsIEZYX0RXT1JEIEdldFNyY09mZnNldCgpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgRG93blNjYWxlKGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQpID0gMDsKKworICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIEdldFNjYW5saW5lKGludCBsaW5lKSA9IDA7CisKKyAgdmlydHVhbCBGWF9CT09MIFNraXBUb1NjYW5saW5lKGludCBsaW5lLCBJRlhfUGF1c2UqIHBQYXVzZSkgPSAwOworCisgIHZpcnR1YWwgaW50IEdldFdpZHRoKCkgPSAwOworCisgIHZpcnR1YWwgaW50IEdldEhlaWdodCgpID0gMDsKKworICB2aXJ0dWFsIGludCBDb3VudENvbXBzKCkgPSAwOworCisgIHZpcnR1YWwgaW50IEdldEJQQygpID0gMDsKKworICB2aXJ0dWFsIEZYX0JPT0wgSXNDb2xvclRyYW5zZm9ybWVkKCkgPSAwOworCisgIHZpcnR1YWwgdm9pZCBDbGVhckltYWdlRGF0YSgpID0gMDsKK307CisKK2NsYXNzIElDb2RlY19GbGF0ZU1vZHVsZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JQ29kZWNfRmxhdGVNb2R1bGUoKSB7fQorICB2aXJ0dWFsIElDb2RlY19TY2FubGluZURlY29kZXIqIENyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWRpY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2xvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQml0c1BlckNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2x1bW5zKSA9IDA7CisgIHZpcnR1YWwgRlhfRFdPUkQgRmxhdGVPckxaV0RlY29kZShGWF9CT09MIGJMWlcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJFYXJseUNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVkaWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJpdHNQZXJDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGVzdGltYXRlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgPSAwOwotICAgIHZpcnR1YWwgRlhfQk9PTAlBODVFbmNvZGUoY29uc3QgRlhfQllURSogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIEZYX0xQQllURSYgZGVzdF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKSA9IDA7Ci0gICAgdmlydHVhbCBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKglDcmVhdGVSdW5MZW5ndGhEZWNvZGVyKEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgIGludCBuQ29tcHMsIGludCBicGMpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIEVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVkaWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQml0c1BlckNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpID0gMDsKIH07Ci1jbGFzcyBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyIAotewotcHVibGljOgorY2xhc3MgSUNvZGVjX0ZheE1vZHVsZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JQ29kZWNfRmF4TW9kdWxlKCkge30KIAotICAgIHZpcnR1YWwgfklDb2RlY19TY2FubGluZURlY29kZXIoKSB7fQorICB2aXJ0dWFsIElDb2RlY19TY2FubGluZURlY29kZXIqIENyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBFbmRPZkxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIEVuY29kZWRCeXRlQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIEJsYWNrSXMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgUm93cykgPSAwOwogCi0gICAgdmlydHVhbCBGWF9EV09SRAlHZXRTcmNPZmZzZXQoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQJCURvd25TY2FsZShpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIEZYX0xQQllURQlHZXRTY2FubGluZShpbnQgbGluZSkgPSAwOwotCi0gICAgdmlydHVhbCBGWF9CT09MCQlTa2lwVG9TY2FubGluZShpbnQgbGluZSwgSUZYX1BhdXNlKiBwUGF1c2UpID0gMDsKLQotICAgIHZpcnR1YWwgaW50CQkJR2V0V2lkdGgoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIGludAkJCUdldEhlaWdodCgpID0gMDsKLQotICAgIHZpcnR1YWwgaW50CQkJQ291bnRDb21wcygpID0gMDsKLQotICAgIHZpcnR1YWwgaW50CQkJR2V0QlBDKCkgPSAwOwotCi0gICAgdmlydHVhbCBGWF9CT09MCQlJc0NvbG9yVHJhbnNmb3JtZWQoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQJCUNsZWFySW1hZ2VEYXRhKCkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKSA9IDA7CiB9OwotY2xhc3MgSUNvZGVjX0ZsYXRlTW9kdWxlIAotewotcHVibGljOgorY2xhc3MgSUNvZGVjX0pwZWdNb2R1bGUgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SUNvZGVjX0pwZWdNb2R1bGUoKSB7fQogCi0gICAgdmlydHVhbCB+SUNvZGVjX0ZsYXRlTW9kdWxlKCkge30KLSAgICB2aXJ0dWFsIElDb2RlY19TY2FubGluZURlY29kZXIqCUNyZWF0ZURlY29kZXIoRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgaW50IG5Db21wcywgaW50IGJwYywgaW50IHByZWRpY3RvciwgaW50IENvbG9ycywgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9EV09SRAlGbGF0ZU9yTFpXRGVjb2RlKEZYX0JPT0wgYkxaVywgY29uc3QgRlhfQllURSogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIEZYX0JPT0wgYkVhcmx5Q2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZGljdG9yLCBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGVzdGltYXRlZF9zaXplLCBGWF9MUEJZVEUmIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlFbmNvZGUoY29uc3QgRlhfQllURSogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWRpY3RvciwgaW50IENvbG9ycywgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpID0gMDsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUVuY29kZShGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBGWF9MUEJZVEUmIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKSA9IDA7CisgIHZpcnR1YWwgSUNvZGVjX1NjYW5saW5lRGVjb2RlciogQ3JlYXRlRGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgQ29sb3JUcmFuc2Zvcm0pID0gMDsKKworICB2aXJ0dWFsIEZYX0JPT0wgTG9hZEluZm8oY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBudW1fY29tcG9uZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgYml0c19wZXJfY29tcG9uZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGNvbG9yX3RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBpY2NfYnVmX3B0ciA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogaWNjX2xlbmd0aCA9IE5VTEwpID0gMDsKKworICB2aXJ0dWFsIEZYX0JPT0wgRW5jb2RlKGNvbnN0IGNsYXNzIENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1NUUlNJWkUmIGRlc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhbGl0eSA9IDc1LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGljY19idWYgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGljY19sZW5ndGggPSAwKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkKiBTdGFydCgpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgRmluaXNoKHZvaWQqIHBDb250ZXh0KSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIElucHV0KHZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplKSA9IDA7CisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICB2aXJ0dWFsIGludCBSZWFkSGVhZGVyKHZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBuQ29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkgPSAwOworI2Vsc2UgICAvLyBQREZfRU5BQkxFX1hGQQorICB2aXJ0dWFsIGludCBSZWFkSGVhZGVyKHZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBuQ29tcHMpID0gMDsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworICB2aXJ0dWFsIGludCBTdGFydFNjYW5saW5lKHZvaWQqIHBDb250ZXh0LCBpbnQgZG93bl9zY2FsZSkgPSAwOworCisgIHZpcnR1YWwgRlhfQk9PTCBSZWFkU2NhbmxpbmUodm9pZCogcENvbnRleHQsIHVpbnQ4X3QqIGRlc3RfYnVmKSA9IDA7CisKKyAgdmlydHVhbCBGWF9EV09SRCBHZXRBdmFpbElucHV0KHZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGF2YWlsX2J1Zl9wdHIgPSBOVUxMKSA9IDA7CiB9OwotY2xhc3MgSUNvZGVjX0ZheE1vZHVsZSAKLXsKLXB1YmxpYzoKIAotICAgIHZpcnR1YWwgfklDb2RlY19GYXhNb2R1bGUoKSB7fQorY2xhc3MgSUNvZGVjX0pweE1vZHVsZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JQ29kZWNfSnB4TW9kdWxlKCkge30KIAotICAgIHZpcnR1YWwgSUNvZGVjX1NjYW5saW5lRGVjb2RlcioJQ3JlYXRlRGVjb2RlcihGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICBpbnQgSywgRlhfQk9PTCBFbmRPZkxpbmUsIEZYX0JPT0wgRW5jb2RlZEJ5dGVBbGlnbiwgRlhfQk9PTCBCbGFja0lzMSwgaW50IENvbHVtbnMsIGludCBSb3dzKSA9IDA7CisgIHZpcnR1YWwgQ0pQWF9EZWNvZGVyKiBDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0NvbG9yU3BhY2UqIGNzKSA9IDA7CiAKKyAgdmlydHVhbCB2b2lkIEdldEltYWdlSW5mbyhDSlBYX0RlY29kZXIqIHBEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBjb21wb25lbnRzKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUVuY29kZShGWF9MUENCWVRFIHNyY19idWYsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHBpdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpID0gMDsKKyAgdmlydHVhbCBib29sIERlY29kZShDSlBYX0RlY29kZXIqIHBEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIG9mZnNldHMpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgRGVzdHJveURlY29kZXIoQ0pQWF9EZWNvZGVyKiBwRGVjb2RlcikgPSAwOwogfTsKLWNsYXNzIElDb2RlY19KcGVnTW9kdWxlIAotewotcHVibGljOgorI2lmZGVmIFBERl9FTkFCTEVfWEZBCitjbGFzcyBJQ29kZWNfUG5nTW9kdWxlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklDb2RlY19QbmdNb2R1bGUoKSB7fQogCi0gICAgdmlydHVhbCB+SUNvZGVjX0pwZWdNb2R1bGUoKSB7fQorICB2aXJ0dWFsIHZvaWQqIFN0YXJ0KHZvaWQqIHBNb2R1bGUpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZAkJU2V0UG92aWRlcihJRlhfSnBlZ1Byb3ZpZGVyKiBwSlApID0gMDsKKyAgdmlydHVhbCB2b2lkIEZpbmlzaCh2b2lkKiBwQ29udGV4dCkgPSAwOwogCi0gICAgdmlydHVhbCBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKglDcmVhdGVEZWNvZGVyKEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCi0gICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuQ29tcHMsIEZYX0JPT0wgQ29sb3JUcmFuc2Zvcm0pID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIElucHV0KHZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQlMb2FkSW5mbyhGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQmIHdpZHRoLCBpbnQmIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbnVtX2NvbXBvbmVudHMsIGludCYgYml0c19wZXJfY29tcG9uZW50cywgRlhfQk9PTCYgY29sb3JfdHJhbnNmb3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBCWVRFKiBpY2NfYnVmX3B0ciA9IE5VTEwsIEZYX0RXT1JEKiBpY2NfbGVuZ3RoID0gTlVMTCkgPSAwOworICBGWF9CT09MICgqUmVhZEhlYWRlckNhbGxiYWNrKSh2b2lkKiBwTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBicGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbG9yX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZ2FtbWEpOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQlFbmNvZGUoY29uc3QgY2xhc3MgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfTFBCWVRFJiBkZXN0X2J1ZiwgRlhfU1RSU0laRSYgZGVzdF9zaXplLCBpbnQgcXVhbGl0eSA9IDc1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQ0JZVEUgaWNjX2J1ZiA9IE5VTEwsIEZYX0RXT1JEIGljY19sZW5ndGggPSAwKSA9IDA7CisgIEZYX0JPT0wgKCpBc2tTY2FubGluZUJ1ZkNhbGxiYWNrKSh2b2lkKiBwTW9kdWxlLCBpbnQgbGluZSwgdWludDhfdComIHNyY19idWYpOwogCi0gICAgdmlydHVhbCB2b2lkKgkJU3RhcnQoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQJCUZpbmlzaCh2b2lkKiBwQ29udGV4dCkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkCQlJbnB1dCh2b2lkKiBwQ29udGV4dCwgRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSkgPSAwOwotCi0gICAgdmlydHVhbCBpbnQJCQlSZWFkSGVhZGVyKHZvaWQqIHBDb250ZXh0LCBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCwgaW50KiBuQ29tcHMpID0gMDsKLQotCi0gICAgdmlydHVhbCBpbnQJCQlTdGFydFNjYW5saW5lKHZvaWQqIHBDb250ZXh0LCBpbnQgZG93bl9zY2FsZSkgPSAwOwotCi0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVJlYWRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgRlhfTFBCWVRFIGRlc3RfYnVmKSA9IDA7Ci0KLQotICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0QXZhaWxJbnB1dCh2b2lkKiBwQ29udGV4dCwgRlhfTFBCWVRFKiBhdmFpbF9idWZfcHRyID0gTlVMTCkgPSAwOworICB2b2lkICgqRmlsbFNjYW5saW5lQnVmQ29tcGxldGVkQ2FsbGJhY2spKHZvaWQqIHBNb2R1bGUsIGludCBwYXNzLCBpbnQgbGluZSk7CiB9OwotY2xhc3MgSUNvZGVjX0pweE1vZHVsZSAKLXsKLXB1YmxpYzoKK2NsYXNzIElDb2RlY19HaWZNb2R1bGUgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SUNvZGVjX0dpZk1vZHVsZSgpIHt9CiAKLSAgICB2aXJ0dWFsIH5JQ29kZWNfSnB4TW9kdWxlKCkge30KKyAgdmlydHVhbCB2b2lkKiBTdGFydCh2b2lkKiBwTW9kdWxlKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0xQVk9JRCAJQ3JlYXRlRGVjb2RlcihGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBGWF9CT09MIHVzZUNvbG9yU3BhY2UgPSBGQUxTRSkgPSAwOworICB2aXJ0dWFsIHZvaWQgRmluaXNoKHZvaWQqIHBDb250ZXh0KSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCUdldEltYWdlSW5mbyhGWF9MUFZPSUQgY3R4LCBGWF9EV09SRCYgd2lkdGgsIEZYX0RXT1JEJiBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGNvZGVzdHJlYW1fbkNvbXBzLCBGWF9EV09SRCYgb3V0cHV0X25Db21wcykgPSAwOworICB2aXJ0dWFsIEZYX0RXT1JEIEdldEF2YWlsSW5wdXQodm9pZCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogYXZhaWxfYnVmX3B0ciA9IE5VTEwpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVjb2RlKEZYX0xQVk9JRCBjdHgsIEZYX0xQQllURSBkZXN0X2RhdGEsIGludCBwaXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUcmFuc2xhdGVDb2xvciwgRlhfTFBCWVRFIG9mZnNldHMpID0gMDsKKyAgdmlydHVhbCB2b2lkIElucHV0KHZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCURlc3Ryb3lEZWNvZGVyKEZYX0xQVk9JRCBjdHgpID0gMDsKKyAgdmlydHVhbCBpbnQzMl90IFJlYWRIZWFkZXIodm9pZCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHBhbF9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBwYWxfcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogYmdfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpID0gMDsKKworICB2aXJ0dWFsIGludDMyX3QgTG9hZEZyYW1lSW5mbyh2b2lkKiBwQ29udGV4dCwgaW50KiBmcmFtZV9udW0pID0gMDsKKworICB2b2lkICgqUmVjb3JkQ3VycmVudFBvc2l0aW9uQ2FsbGJhY2spKHZvaWQqIHBNb2R1bGUsIEZYX0RXT1JEJiBjdXJfcG9zKTsKKworICB1aW50OF90KiAoKkFza0xvY2FsUGFsZXR0ZUJ1ZkNhbGxiYWNrKSh2b2lkKiBwTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwYWxfc2l6ZSk7CisKKyAgdmlydHVhbCBpbnQzMl90IExvYWRGcmFtZSh2b2lkKiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpID0gMDsKKworICBGWF9CT09MICgqSW5wdXRSZWNvcmRQb3NpdGlvbkJ1ZkNhbGxiYWNrKSh2b2lkKiBwTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCByY2RfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUJiBpbWdfcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGFsX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFsX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZWxheV90aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIHVzZXJfaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHJhbnNfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGlzcG9zYWxfbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGludGVybGFjZSk7CisKKyAgdm9pZCAoKlJlYWRTY2FubGluZUNhbGxiYWNrKSh2b2lkKiBwTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm93X251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByb3dfYnVmKTsKIH07Ci1jbGFzcyBJQ29kZWNfSmJpZzJNb2R1bGUgCi17Ci1wdWJsaWM6CitjbGFzcyBJQ29kZWNfQm1wTW9kdWxlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklDb2RlY19CbXBNb2R1bGUoKSB7fQogCi0gICAgdmlydHVhbCB+SUNvZGVjX0piaWcyTW9kdWxlKCkge30KKyAgdmlydHVhbCB2b2lkKiBTdGFydCh2b2lkKiBwTW9kdWxlKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCURlY29kZShGWF9EV09SRCB3aWR0aCwgRlhfRFdPUkQgaGVpZ2h0LCBGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQ0JZVEUgZ2xvYmFsX2RhdGEsIEZYX0RXT1JEIGdsb2JhbF9zaXplLCBGWF9MUEJZVEUgZGVzdF9idWYsIEZYX0RXT1JEIGRlc3RfcGl0Y2gpICA9IDA7CisgIHZpcnR1YWwgdm9pZCBGaW5pc2godm9pZCogcENvbnRleHQpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJRGVjb2RlKElGWF9GaWxlUmVhZCogZmlsZV9wdHIsIEZYX0RXT1JEJiB3aWR0aCwgRlhfRFdPUkQmIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgcGl0Y2gsIEZYX0xQQllURSYgZGVzdF9idWYpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQqCQkJCUNyZWF0ZUpiaWcyQ29udGV4dCgpID0gMDsKKyAgdmlydHVhbCBGWF9EV09SRCBHZXRBdmFpbElucHV0KHZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGF2YWlsX2J1Zl9wdHIgPSBOVUxMKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYQ09ERUNfU1RBVFVTCQlTdGFydERlY29kZSh2b2lkKiBwSmJpZzJDb250ZXh0LCBGWF9EV09SRCB3aWR0aCwgRlhfRFdPUkQgaGVpZ2h0LCBGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUENCWVRFIGdsb2JhbF9kYXRhLCBGWF9EV09SRCBnbG9iYWxfc2l6ZSwgRlhfTFBCWVRFIGRlc3RfYnVmLCBGWF9EV09SRCBkZXN0X3BpdGNoLCBJRlhfUGF1c2UqIHBQYXVzZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgSW5wdXQodm9pZCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUpID0gMDsKIAotICAgIHZpcnR1YWwgRlhDT0RFQ19TVEFUVVMJCVN0YXJ0RGVjb2RlKHZvaWQqIHBKYmlnMkNvbnRleHQsIElGWF9GaWxlUmVhZCogZmlsZV9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiB3aWR0aCwgRlhfRFdPUkQmIGhlaWdodCwgRlhfRFdPUkQmIHBpdGNoLCBGWF9MUEJZVEUmIGRlc3RfYnVmLCBJRlhfUGF1c2UqIHBQYXVzZSkgPSAwOwotICAgIHZpcnR1YWwgRlhDT0RFQ19TVEFUVVMJCUNvbnRpbnVlRGVjb2RlKHZvaWQqIHBKYmlnMkNvbnRlbnQsIElGWF9QYXVzZSogcFBhdXNlKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkCQkJCURlc3Ryb3lKYmlnMkNvbnRleHQodm9pZCogcEpiaWcyQ29udGVudCkgPSAwOworICB2aXJ0dWFsIGludDMyX3QgUmVhZEhlYWRlcih2b2lkKiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCogdGJfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogY29tcG9uZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBwYWxfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCoqIHBhbF9wcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkgPSAwOworCisgIHZpcnR1YWwgaW50MzJfdCBMb2FkSW1hZ2Uodm9pZCogcENvbnRleHQpID0gMDsKKworICBGWF9CT09MICgqSW5wdXRJbWFnZVBvc2l0aW9uQnVmQ2FsbGJhY2spKHZvaWQqIHBNb2R1bGUsIEZYX0RXT1JEIHJjZF9wb3MpOworCisgIHZvaWQgKCpSZWFkU2NhbmxpbmVDYWxsYmFjaykodm9pZCogcE1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJvd19udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcm93X2J1Zik7CiB9OwotY2xhc3MgSUNvZGVjX0piaWcyRW5jb2RlciAKLXsKLXB1YmxpYzoKK2NsYXNzIElDb2RlY19UaWZmTW9kdWxlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklDb2RlY19UaWZmTW9kdWxlKCkge30KIAotICAgIHZpcnR1YWwgfklDb2RlY19KYmlnMkVuY29kZXIoKSB7fQorICB2aXJ0dWFsIHZvaWQqIENyZWF0ZURlY29kZXIoSUZYX0ZpbGVSZWFkKiBmaWxlX3B0cikgPSAwOworCisgIHZpcnR1YWwgdm9pZCBHZXRGcmFtZXModm9pZCogY3R4LCBpbnQzMl90JiBmcmFtZXMpID0gMDsKKworICB2aXJ0dWFsIEZYX0JPT0wgTG9hZEZyYW1lSW5mbyh2b2lkKiBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGNvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgYnBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKSA9IDA7CisKKyAgdmlydHVhbCBGWF9CT09MIERlY29kZSh2b2lkKiBjdHgsIGNsYXNzIENGWF9ESUJpdG1hcCogcERJQml0bWFwKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIERlc3Ryb3lEZWNvZGVyKHZvaWQqIGN0eCkgPSAwOwogfTsKLWNsYXNzIElDb2RlY19JY2NNb2R1bGUgCi17Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBlbnVtIHsKLSAgICAgICAgSWNjQ1NfVW5rbm93biA9IDAsCi0gICAgICAgIEljY0NTX1hZWiwKLSAgICAgICAgSWNjQ1NfTGFiLAotICAgICAgICBJY2NDU19MdXYsCi0gICAgICAgIEljY0NTX1lDYkNyLAotICAgICAgICBJY2NDU19ZeHksCi0gICAgICAgIEljY0NTX0hzdiwKLSAgICAgICAgSWNjQ1NfSGxzLAotICAgICAgICBJY2NDU19HcmF5LAotICAgICAgICBJY2NDU19SZ2IsCi0gICAgICAgIEljY0NTX0NteWssCi0gICAgICAgIEljY0NTX0NteQotICAgIH0gSWNjQ1M7Ci0gICAgdHlwZWRlZiBzdHJ1Y3QgX0ljY1BhcmFtIHsKLSAgICAgICAgRlhfRFdPUkQJVmVyc2lvbjsKLSAgICAgICAgSWNjQ1MJCUNvbG9yU3BhY2U7Ci0gICAgICAgIEZYX0RXT1JECWR3UHJvZmlsZVR5cGU7Ci0gICAgICAgIEZYX0RXT1JECWR3Rm9ybWF0OwotICAgICAgICBGWF9MUEJZVEUJcFByb2ZpbGVEYXRhOwotICAgICAgICBGWF9EV09SRAlkd1Byb2ZpbGVTaXplOwotICAgICAgICBkb3VibGUJCUdhbW1hOwotICAgIH0gSWNjUGFyYW07CisjZW5kaWYKIAotICAgIHZpcnR1YWwgfklDb2RlY19JY2NNb2R1bGUoKSB7fQorY2xhc3MgSUNvZGVjX0piaWcyTW9kdWxlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklDb2RlY19KYmlnMk1vZHVsZSgpIHt9CiAKLSAgICB2aXJ0dWFsIEljY0NTCQkJR2V0UHJvZmlsZUNTKEZYX0xQQ0JZVEUgcFByb2ZpbGVEYXRhLCB1bnNpZ25lZCBpbnQgZHdQcm9maWxlU2l6ZSkgPSAwOworICB2aXJ0dWFsIHZvaWQqIENyZWF0ZUpiaWcyQ29udGV4dCgpID0gMDsKIAotICAgIHZpcnR1YWwgSWNjQ1MJCQlHZXRQcm9maWxlQ1MoSUZYX0ZpbGVSZWFkKiBwRmlsZSkgPSAwOworICB2aXJ0dWFsIEZYQ09ERUNfU1RBVFVTIFN0YXJ0RGVjb2RlKHZvaWQqIHBKYmlnMkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1ByaXZhdGVEYXRhKiBwUHJpdmF0ZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtQWNjKiBzcmNfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtQWNjKiBnbG9iYWxfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfTFBWT0lECUNyZWF0ZVRyYW5zZm9ybShJQ29kZWNfSWNjTW9kdWxlOjpJY2NQYXJhbSogcElucHV0UGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNvZGVjX0ljY01vZHVsZTo6SWNjUGFyYW0qIHBPdXRwdXRQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ29kZWNfSWNjTW9kdWxlOjpJY2NQYXJhbSogcFByb29mUGFyYW0gPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3SW50ZW50ID0gSWNjX0lOVEVOVF9QRVJDRVBUVUFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZyA9IEljY19GTEFHU19ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3UHJmSW50ZW50ID0gSWNjX0lOVEVOVF9BQlNPTFVURV9DT0xPUklNRVRSSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQcmZGbGFnID0gSWNjX0ZMQUdTX1NPRlRQUk9PRklORwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPSAwOwotCi0KLSAgICB2aXJ0dWFsIEZYX0xQVk9JRAlDcmVhdGVUcmFuc2Zvcm1fc1JHQihGWF9MUENCWVRFIHBQcm9maWxlRGF0YSwgRlhfRFdPUkQgZHdQcm9maWxlU2l6ZSwgRlhfSU5UMzImIG5Db21wb25lbnRzLCBGWF9JTlQzMiBpbnRlbnQgPSAwLAotICAgICAgICAgICAgRlhfRFdPUkQgZHdTcmNGb3JtYXQgPSBJY2NfRk9STUFUX0RFRkFVTFQpID0gMDsKLQotICAgIHZpcnR1YWwgRlhfTFBWT0lECUNyZWF0ZVRyYW5zZm9ybV9DTVlLKEZYX0xQQ0JZVEUgcFNyY1Byb2ZpbGVEYXRhLCBGWF9EV09SRCBkd1NyY1Byb2ZpbGVTaXplLCBGWF9JTlQzMiYgblNyY0NvbXBvbmVudHMsCi0gICAgICAgICAgICBGWF9MUENCWVRFIHBEc3RQcm9maWxlRGF0YSwgRlhfRFdPUkQgZHdEc3RQcm9maWxlU2l6ZSwgRlhfSU5UMzIgaW50ZW50ID0gMCwKLSAgICAgICAgICAgIEZYX0RXT1JEIGR3U3JjRm9ybWF0ID0gSWNjX0ZPUk1BVF9ERUZBVUxULAotICAgICAgICAgICAgRlhfRFdPUkQgZHdEc3RGb3JtYXQgPSBJY2NfRk9STUFUX0RFRkFVTFQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkCQkJRGVzdHJveVRyYW5zZm9ybShGWF9MUFZPSUQgcFRyYW5zZm9ybSkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkCQkJVHJhbnNsYXRlKEZYX0xQVk9JRCBwVHJhbnNmb3JtLCBGWF9GTE9BVCogcFNyY1ZhbHVlcywgRlhfRkxPQVQqIHBEZXN0VmFsdWVzKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQJCQlUcmFuc2xhdGVTY2FubGluZShGWF9MUFZPSUQgcFRyYW5zZm9ybSwgRlhfTFBCWVRFIHBEZXN0LCBGWF9MUENCWVRFIHBTcmMsIGludCBwaXhlbHMpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICBTZXRDb21wb25lbnRzKEZYX0RXT1JEIG5Db21wb25lbnRzKSA9IDA7CisgIHZpcnR1YWwgRlhDT0RFQ19TVEFUVVMgQ29udGludWVEZWNvZGUodm9pZCogcEpiaWcyQ29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgRGVzdHJveUpiaWcyQ29udGV4dCh2b2lkKiBwSmJpZzJDb250ZW50KSA9IDA7CiB9Owotdm9pZCBBZG9iZUNNWUtfdG9fc1JHQihGWF9GTE9BVCBjLCBGWF9GTE9BVCBtLCBGWF9GTE9BVCB5LCBGWF9GTE9BVCBrLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKTsKLXZvaWQgQWRvYmVDTVlLX3RvX3NSR0IxKEZYX0JZVEUgYywgRlhfQllURSBtLCBGWF9CWVRFIHksIEZYX0JZVEUgaywgRlhfQllURSYgUiwgRlhfQllURSYgRywgRlhfQllURSYgQik7Ci1GWF9CT09MIE1ENUNvbXB1dGVJRChGWF9MUENWT0lEIGJ1ZiwgRlhfRFdPUkQgZHdTaXplLCBGWF9CWVRFIElEWzE2XSk7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK2NsYXNzIElDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SUNvZGVjX1Byb2dyZXNzaXZlRGVjb2RlcigpIHt9CisKKyAgdmlydHVhbCBGWENPREVDX1NUQVRVUyBMb2FkSW1hZ2VJbmZvKElGWF9GaWxlUmVhZCogcEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWENPREVDX0lNQUdFX1RZUEUgaW1hZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkgPSAwOworCisgIHZpcnR1YWwgRlhDT0RFQ19JTUFHRV9UWVBFIEdldFR5cGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50MzJfdCBHZXRXaWR0aCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBpbnQzMl90IEdldEhlaWdodCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBpbnQzMl90IEdldE51bUNvbXBvbmVudHMoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50MzJfdCBHZXRCUEMoKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCB2b2lkIFNldENsaXBCb3goRlhfUkVDVCogY2xpcCkgPSAwOworCisgIHZpcnR1YWwgRlhDT0RFQ19TVEFUVVMgR2V0RnJhbWVzKGludDMyX3QmIGZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKSA9IDA7CisKKyAgdmlydHVhbCBGWENPREVDX1NUQVRVUyBTdGFydERlY29kZShjbGFzcyBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2l6ZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbnRlcnBvbCA9IFRSVUUpID0gMDsKKworICB2aXJ0dWFsIEZYQ09ERUNfU1RBVFVTIENvbnRpbnVlRGVjb2RlKElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCkgPSAwOworfTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKK2NsYXNzIElDb2RlY19KYmlnMkVuY29kZXIgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SUNvZGVjX0piaWcyRW5jb2RlcigpIHt9Cit9OworY2xhc3MgSUNvZGVjX0ljY01vZHVsZSB7CisgcHVibGljOgorICB0eXBlZGVmIGVudW0geworICAgIEljY0NTX1Vua25vd24gPSAwLAorICAgIEljY0NTX1hZWiwKKyAgICBJY2NDU19MYWIsCisgICAgSWNjQ1NfTHV2LAorICAgIEljY0NTX1lDYkNyLAorICAgIEljY0NTX1l4eSwKKyAgICBJY2NDU19Ic3YsCisgICAgSWNjQ1NfSGxzLAorICAgIEljY0NTX0dyYXksCisgICAgSWNjQ1NfUmdiLAorICAgIEljY0NTX0NteWssCisgICAgSWNjQ1NfQ215CisgIH0gSWNjQ1M7CisgIHR5cGVkZWYgc3RydWN0IF9JY2NQYXJhbSB7CisgICAgRlhfRFdPUkQgVmVyc2lvbjsKKyAgICBJY2NDUyBDb2xvclNwYWNlOworICAgIEZYX0RXT1JEIGR3UHJvZmlsZVR5cGU7CisgICAgRlhfRFdPUkQgZHdGb3JtYXQ7CisgICAgdWludDhfdCogcFByb2ZpbGVEYXRhOworICAgIEZYX0RXT1JEIGR3UHJvZmlsZVNpemU7CisgICAgZG91YmxlIEdhbW1hOworICB9IEljY1BhcmFtOworCisgIHZpcnR1YWwgfklDb2RlY19JY2NNb2R1bGUoKSB7fQorCisgIHZpcnR1YWwgSWNjQ1MgR2V0UHJvZmlsZUNTKGNvbnN0IHVpbnQ4X3QqIHBQcm9maWxlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGR3UHJvZmlsZVNpemUpID0gMDsKKworICB2aXJ0dWFsIEljY0NTIEdldFByb2ZpbGVDUyhJRlhfRmlsZVJlYWQqIHBGaWxlKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkKiBDcmVhdGVUcmFuc2Zvcm0oCisgICAgICBJQ29kZWNfSWNjTW9kdWxlOjpJY2NQYXJhbSogcElucHV0UGFyYW0sCisgICAgICBJQ29kZWNfSWNjTW9kdWxlOjpJY2NQYXJhbSogcE91dHB1dFBhcmFtLAorICAgICAgSUNvZGVjX0ljY01vZHVsZTo6SWNjUGFyYW0qIHBQcm9vZlBhcmFtID0gTlVMTCwKKyAgICAgIEZYX0RXT1JEIGR3SW50ZW50ID0gSWNjX0lOVEVOVF9QRVJDRVBUVUFMLAorICAgICAgRlhfRFdPUkQgZHdGbGFnID0gSWNjX0ZMQUdTX0RFRkFVTFQsCisgICAgICBGWF9EV09SRCBkd1ByZkludGVudCA9IEljY19JTlRFTlRfQUJTT0xVVEVfQ09MT1JJTUVUUklDLAorICAgICAgRlhfRFdPUkQgZHdQcmZGbGFnID0gSWNjX0ZMQUdTX1NPRlRQUk9PRklORykgPSAwOworCisgIHZpcnR1YWwgdm9pZCogQ3JlYXRlVHJhbnNmb3JtX3NSR0IoCisgICAgICBjb25zdCB1aW50OF90KiBwUHJvZmlsZURhdGEsCisgICAgICBGWF9EV09SRCBkd1Byb2ZpbGVTaXplLAorICAgICAgaW50MzJfdCYgbkNvbXBvbmVudHMsCisgICAgICBpbnQzMl90IGludGVudCA9IDAsCisgICAgICBGWF9EV09SRCBkd1NyY0Zvcm1hdCA9IEljY19GT1JNQVRfREVGQVVMVCkgPSAwOworCisgIHZpcnR1YWwgdm9pZCogQ3JlYXRlVHJhbnNmb3JtX0NNWUsoCisgICAgICBjb25zdCB1aW50OF90KiBwU3JjUHJvZmlsZURhdGEsCisgICAgICBGWF9EV09SRCBkd1NyY1Byb2ZpbGVTaXplLAorICAgICAgaW50MzJfdCYgblNyY0NvbXBvbmVudHMsCisgICAgICBjb25zdCB1aW50OF90KiBwRHN0UHJvZmlsZURhdGEsCisgICAgICBGWF9EV09SRCBkd0RzdFByb2ZpbGVTaXplLAorICAgICAgaW50MzJfdCBpbnRlbnQgPSAwLAorICAgICAgRlhfRFdPUkQgZHdTcmNGb3JtYXQgPSBJY2NfRk9STUFUX0RFRkFVTFQsCisgICAgICBGWF9EV09SRCBkd0RzdEZvcm1hdCA9IEljY19GT1JNQVRfREVGQVVMVCkgPSAwOworCisgIHZpcnR1YWwgdm9pZCBEZXN0cm95VHJhbnNmb3JtKHZvaWQqIHBUcmFuc2Zvcm0pID0gMDsKKworICB2aXJ0dWFsIHZvaWQgVHJhbnNsYXRlKHZvaWQqIHBUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIHBTcmNWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIHBEZXN0VmFsdWVzKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIFRyYW5zbGF0ZVNjYW5saW5lKHZvaWQqIHBUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwRGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxzKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRDb21wb25lbnRzKEZYX0RXT1JEIG5Db21wb25lbnRzKSA9IDA7Cit9OworCit2b2lkIEFkb2JlQ01ZS190b19zUkdCKEZYX0ZMT0FUIGMsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG0sCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHksCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGssCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBSLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgRywKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEIpOwordm9pZCBBZG9iZUNNWUtfdG9fc1JHQjEodWludDhfdCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCYgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QmIEcsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90JiBCKTsKK0ZYX0JPT0wgTUQ1Q29tcHV0ZUlEKGNvbnN0IHZvaWQqIGJ1ZiwgRlhfRFdPUkQgZHdTaXplLCB1aW50OF90IElEWzE2XSk7Cit2b2lkIEZheEc0RGVjb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICBpbnQqIHBiaXRwb3MsCisgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgIGludCBwaXRjaCk7CiAKICNlbmRpZiAgLy8gQ09SRV9JTkNMVURFX0ZYQ09ERUNfRlhfQ09ERUNfSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjX2RlZi5oIGIvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWNfZGVmLmgKaW5kZXggODZjMDU5Yi4uOTljY2YxNSAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWNfZGVmLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWNfZGVmLmgKQEAgLTEsNzIgKzEsOTIgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBDT1JFX0lOQ0xVREVfRlhDT0RFQ19GWF9DT0RFQ19ERUZfSF8KICNkZWZpbmUgQ09SRV9JTkNMVURFX0ZYQ09ERUNfRlhfQ09ERUNfREVGX0hfCiAKIGVudW0gRlhDT0RFQ19TVEFUVVMgewotICAgIEZYQ09ERUNfU1RBVFVTX0VSUk9SID0gLTEsCi0gICAgRlhDT0RFQ19TVEFUVVNfRlJBTUVfUkVBRFksCi0gICAgRlhDT0RFQ19TVEFUVVNfRlJBTUVfVE9CRUNPTlRJTlVFLAotICAgIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9SRUFEWSwKLSAgICBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFLAotICAgIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0gsCi0gICAgRlhDT0RFQ19TVEFUVVNfRVJSX1JFQUQsCi0gICAgRlhDT0RFQ19TVEFUVVNfRVJSX0ZMVVNILAotICAgIEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQsCi0gICAgRlhDT0RFQ19TVEFUVVNfRVJSX1BBUkFNUworICBGWENPREVDX1NUQVRVU19FUlJPUiA9IC0xLAorICBGWENPREVDX1NUQVRVU19GUkFNRV9SRUFEWSwKKyAgRlhDT0RFQ19TVEFUVVNfRlJBTUVfVE9CRUNPTlRJTlVFLAorICBGWENPREVDX1NUQVRVU19ERUNPREVfUkVBRFksCisgIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUsCisgIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0gsCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWSwKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgRlhDT0RFQ19TVEFUVVNfRVJSX1JFQUQsCisgIEZYQ09ERUNfU1RBVFVTX0VSUl9GTFVTSCwKKyAgRlhDT0RFQ19TVEFUVVNfRVJSX0ZPUk1BVCwKKyAgRlhDT0RFQ19TVEFUVVNfRVJSX1BBUkFNUwogfTsKLSNkZWZpbmUgSlAyX1NQQUNFX0lOVkFMSUQJLTEKLSNkZWZpbmUgSlBYX1NQQUNFX0lOVkFMSUQJLTEKLSNkZWZpbmUgSlAyX1NQQUNFX2JpbGV2ZWwxCTAKLSNkZWZpbmUgSlAyX1NQQUNFX1lDYkNyMQkxCi0jZGVmaW5lIEpQMl9TUEFDRV9ZQ2JDcjIJMwotI2RlZmluZSBKUDJfU1BBQ0VfWUNiQ3IzCTQKLSNkZWZpbmUgSlAyX1NQQUNFX1Bob3RvWUNDCTkKLSNkZWZpbmUgSlAyX1NQQUNFX0NNWQkJMTEKLSNkZWZpbmUgSlAyX1NQQUNFX0NNWUsJCTEyCi0jZGVmaW5lIEpQMl9TUEFDRV9ZQ0NLCQkxMwotI2RlZmluZSBKUDJfU1BBQ0VfQ0lFTGFiCTE0Ci0jZGVmaW5lIEpQMl9TUEFDRV9iaWxldmVsMgkxNQotI2RlZmluZSBKUDJfU1BBQ0Vfc1JHQgkJMTYKLSNkZWZpbmUgSlAyX1NQQUNFX3NMVU0JCTE3Ci0jZGVmaW5lIEpQMl9TUEFDRV9zWUNDCQkxOAotI2RlZmluZSBKUDJfU1BBQ0VfQ0lFSmFiCTE5Ci0jZGVmaW5lIEpQMl9TUEFDRV9lc1JHQgkJMjAKLSNkZWZpbmUgSlAyX1NQQUNFX1JPTU1SR0IJMjEKLSNkZWZpbmUgSlAyX1NQQUNFX1lQYlByNjAJMjIKLSNkZWZpbmUgSlAyX1NQQUNFX1lQYlByNTAJMjMKLSNkZWZpbmUgSlAyX1NQQUNFX2VzWUNDCQkyNAotI2RlZmluZSBKUDJfU1BBQ0VfaWNjTFVNCTEwMAotI2RlZmluZSBKUDJfU1BBQ0VfaWNjUkdCCTEwMQotI2RlZmluZSBJY2NfSU5URU5UX1BFUkNFUFRVQUwJCQkJMAotI2RlZmluZSBJY2NfSU5URU5UX1JFTEFUSVZFX0NPTE9SSU1FVFJJQwkxCi0jZGVmaW5lIEljY19JTlRFTlRfU0FUVVJBVElPTgkJCQkyCi0jZGVmaW5lIEljY19JTlRFTlRfQUJTT0xVVEVfQ09MT1JJTUVUUklDCTMKLSNkZWZpbmUgSWNjX0ZPUk1BVF9ERUZBVUxUCQkJCQkwCi0jZGVmaW5lIEljY19GT1JNQVRfU1dBUAkJCQkJCSgxPDwxMCkKLSNkZWZpbmUgSWNjX0ZMQUdTX0RFRkFVTFQJCQkJCTB4MDAwMAotI2RlZmluZSBJY2NfRkxBR1NfQkxBQ0tQT0lOVENPTVBFTlNBVElPTgkweDIwMDAKLSNkZWZpbmUgSWNjX0ZMQUdTX05PV0hJVEVPTldISVRFRklYVVAJCTB4MDAwNAotI2RlZmluZSBJY2NfRkxBR1NfSElHSFJFU1BSRUNBTEMJCQkweDA0MDAKLSNkZWZpbmUgSWNjX0ZMQUdTX0xPV1JFU1BSRUNBTEMJCQkJMHgwODAwCi0jZGVmaW5lIEljY19GTEFHU19HQU1VVENIRUNLCQkJCTB4MTAwMAotI2RlZmluZSBJY2NfRkxBR1NfU09GVFBST09GSU5HCQkJCTB4NDAwMAotI2RlZmluZSBJY2NfUEFSQU1UWVBFX05PTkUJCQkJCTAKLSNkZWZpbmUgSWNjX1BBUkFNVFlQRV9CVUZGRVIJCQkJMQotI2RlZmluZSBJY2NfUEFSQU1UWVBFX1BBUkFNCQkJCQkyCi0jZGVmaW5lIEVYSUZUQUdfVVNIT1JUX1JFU1VOSVQJCQkJMjk2Ci0jZGVmaW5lIEVYSUZUQUdfRkxPQVRfRFBJWAkJCQkJMjgyCi0jZGVmaW5lIEVYSUZUQUdfRkxPQVRfRFBJWQkJCQkJMjgzCi0jZGVmaW5lIEVYSUZUQUdfVVNIT1JUX09SSUVOVEFUSU9OCQkJMjc0Ci0jZGVmaW5lIEVYSUZUQUdfU1RSSU5HX01BTlVGQUNUVVJFUgkJCTI3MQotI2RlZmluZSBFWElGVEFHX1NUUklOR19NT0RVTEUJCQkJMjcyCi0jZGVmaW5lIEVYSUZUQUdfU1RSSU5HX1NPRlRXQVJFCQkJCTMwNQotI2RlZmluZSBFWElGVEFHX1NUUklOR19JQU1HRURFU0NSSVBUSU9OCQkyNzAKLSNkZWZpbmUgRVhJRlRBR19TVFJJTkdfREFURVRJTUUJCQkJMzA2Ci0jZGVmaW5lIEVYSUZUQUdfU1RSSU5HX0NPUFlSSUdIVAkJCTMzNDMyCisjZGVmaW5lIEpQMl9TUEFDRV9JTlZBTElEIC0xCisjZGVmaW5lIEpQWF9TUEFDRV9JTlZBTElEIC0xCisjZGVmaW5lIEpQMl9TUEFDRV9iaWxldmVsMSAwCisjZGVmaW5lIEpQMl9TUEFDRV9ZQ2JDcjEgMQorI2RlZmluZSBKUDJfU1BBQ0VfWUNiQ3IyIDMKKyNkZWZpbmUgSlAyX1NQQUNFX1lDYkNyMyA0CisjZGVmaW5lIEpQMl9TUEFDRV9QaG90b1lDQyA5CisjZGVmaW5lIEpQMl9TUEFDRV9DTVkgMTEKKyNkZWZpbmUgSlAyX1NQQUNFX0NNWUsgMTIKKyNkZWZpbmUgSlAyX1NQQUNFX1lDQ0sgMTMKKyNkZWZpbmUgSlAyX1NQQUNFX0NJRUxhYiAxNAorI2RlZmluZSBKUDJfU1BBQ0VfYmlsZXZlbDIgMTUKKyNkZWZpbmUgSlAyX1NQQUNFX3NSR0IgMTYKKyNkZWZpbmUgSlAyX1NQQUNFX3NMVU0gMTcKKyNkZWZpbmUgSlAyX1NQQUNFX3NZQ0MgMTgKKyNkZWZpbmUgSlAyX1NQQUNFX0NJRUphYiAxOQorI2RlZmluZSBKUDJfU1BBQ0VfZXNSR0IgMjAKKyNkZWZpbmUgSlAyX1NQQUNFX1JPTU1SR0IgMjEKKyNkZWZpbmUgSlAyX1NQQUNFX1lQYlByNjAgMjIKKyNkZWZpbmUgSlAyX1NQQUNFX1lQYlByNTAgMjMKKyNkZWZpbmUgSlAyX1NQQUNFX2VzWUNDIDI0CisjZGVmaW5lIEpQMl9TUEFDRV9pY2NMVU0gMTAwCisjZGVmaW5lIEpQMl9TUEFDRV9pY2NSR0IgMTAxCisjZGVmaW5lIEljY19JTlRFTlRfUEVSQ0VQVFVBTCAwCisjZGVmaW5lIEljY19JTlRFTlRfUkVMQVRJVkVfQ09MT1JJTUVUUklDIDEKKyNkZWZpbmUgSWNjX0lOVEVOVF9TQVRVUkFUSU9OIDIKKyNkZWZpbmUgSWNjX0lOVEVOVF9BQlNPTFVURV9DT0xPUklNRVRSSUMgMworI2RlZmluZSBJY2NfRk9STUFUX0RFRkFVTFQgMAorI2RlZmluZSBJY2NfRk9STUFUX1NXQVAgKDEgPDwgMTApCisjZGVmaW5lIEljY19GTEFHU19ERUZBVUxUIDB4MDAwMAorI2RlZmluZSBJY2NfRkxBR1NfQkxBQ0tQT0lOVENPTVBFTlNBVElPTiAweDIwMDAKKyNkZWZpbmUgSWNjX0ZMQUdTX05PV0hJVEVPTldISVRFRklYVVAgMHgwMDA0CisjZGVmaW5lIEljY19GTEFHU19ISUdIUkVTUFJFQ0FMQyAweDA0MDAKKyNkZWZpbmUgSWNjX0ZMQUdTX0xPV1JFU1BSRUNBTEMgMHgwODAwCisjZGVmaW5lIEljY19GTEFHU19HQU1VVENIRUNLIDB4MTAwMAorI2RlZmluZSBJY2NfRkxBR1NfU09GVFBST09GSU5HIDB4NDAwMAorI2RlZmluZSBJY2NfUEFSQU1UWVBFX05PTkUgMAorI2RlZmluZSBJY2NfUEFSQU1UWVBFX0JVRkZFUiAxCisjZGVmaW5lIEljY19QQVJBTVRZUEVfUEFSQU0gMgorI2lmZGVmIFBERl9FTkFCTEVfWEZBCitlbnVtIEZYQ09ERUNfSU1BR0VfVFlQRSB7CisgIEZYQ09ERUNfSU1BR0VfVU5LTk9XTiA9IDAsCisgIEZYQ09ERUNfSU1BR0VfQk1QLAorICBGWENPREVDX0lNQUdFX0pQRywKKyAgRlhDT0RFQ19JTUFHRV9QTkcsCisgIEZYQ09ERUNfSU1BR0VfR0lGLAorICBGWENPREVDX0lNQUdFX1RJRiwKKyAgRlhDT0RFQ19JTUFHRV9NQVgKK307CitlbnVtIEZYQ09ERUNfUkVTVU5JVCB7CisgIEZYQ09ERUNfUkVTVU5JVF9OT05FID0gMCwKKyAgRlhDT0RFQ19SRVNVTklUX0lOQ0gsCisgIEZYQ09ERUNfUkVTVU5JVF9DRU5USU1FVEVSLAorICBGWENPREVDX1JFU1VOSVRfTUVURVIKK307CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisjZGVmaW5lIEVYSUZUQUdfVVNIT1JUX1JFU1VOSVQgMjk2CisjZGVmaW5lIEVYSUZUQUdfRkxPQVRfRFBJWCAyODIKKyNkZWZpbmUgRVhJRlRBR19GTE9BVF9EUElZIDI4MworI2RlZmluZSBFWElGVEFHX1VTSE9SVF9PUklFTlRBVElPTiAyNzQKKyNkZWZpbmUgRVhJRlRBR19TVFJJTkdfTUFOVUZBQ1RVUkVSIDI3MQorI2RlZmluZSBFWElGVEFHX1NUUklOR19NT0RVTEUgMjcyCisjZGVmaW5lIEVYSUZUQUdfU1RSSU5HX1NPRlRXQVJFIDMwNQorI2RlZmluZSBFWElGVEFHX1NUUklOR19JQU1HRURFU0NSSVBUSU9OIDI3MAorI2RlZmluZSBFWElGVEFHX1NUUklOR19EQVRFVElNRSAzMDYKKyNkZWZpbmUgRVhJRlRBR19TVFJJTkdfQ09QWVJJR0hUIDMzNDMyCiAKICNlbmRpZiAgLy8gQ09SRV9JTkNMVURFX0ZYQ09ERUNfRlhfQ09ERUNfREVGX0hfCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlY19mbGF0ZS5oIGIvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWNfZmxhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWVjZWY0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWNfZmxhdGUuaApAQCAtMCwwICsxLDI4IEBACisvLyBDb3B5cmlnaHQgMjAxNSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS96bGliX3YxMjgvemxpYi5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIE5vdGU6IFNvbWUgb2YgdGhlc2UgcmV0dXJuIFpfKiBzdGF0dXMgY29kZXMgZnJvbSB6bGliLmguCit2b2lkKiBGUERGQVBJX0ZsYXRlSW5pdCh2b2lkKiAoKmFsbG9jX2Z1bmMpKHZvaWQqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCksCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZnJlZV9mdW5jKSh2b2lkKiwgdm9pZCopKTsKK3ZvaWQgRlBERkFQSV9GbGF0ZUlucHV0KHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNyY19zaXplKTsKK2ludCBGUERGQVBJX0ZsYXRlT3V0cHV0KHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3NpemUpOworaW50IEZQREZBUElfRmxhdGVHZXRBdmFpbEluKHZvaWQqIGNvbnRleHQpOworaW50IEZQREZBUElfRmxhdGVHZXRBdmFpbE91dCh2b2lkKiBjb250ZXh0KTsKK3ZvaWQgRlBERkFQSV9GbGF0ZUVuZCh2b2lkKiBjb250ZXh0KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAvLyBleHRlcm4gIkMiCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjX3Byb3ZpZGVyLmggYi9jb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlY19wcm92aWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDE1NDczLi4wMDAwMDAwCi0tLSBhL2NvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjX3Byb3ZpZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfSU5DTFVERV9GWENPREVDX0ZYX0NPREVDX1BST1ZJREVSX0hfCi0jZGVmaW5lIENPUkVfSU5DTFVERV9GWENPREVDX0ZYX0NPREVDX1BST1ZJREVSX0hfCi0KLWNsYXNzIElGWF9KcGVnUHJvdmlkZXIKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQqCQlDcmVhdGVEZWNvZGVyKEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5Db21wcywgRlhfQk9PTCBDb2xvclRyYW5zZm9ybSkgPSAwOwotCi0KLSAgICB2aXJ0dWFsIHZvaWQJCURlc3Ryb3lEZWNvZGVyKHZvaWQqIHBEZWNvZGVyKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQJCURvd25TY2FsZSh2b2lkKiBwRGVjb2RlciwgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCkgPSAwOwotCi0gICAgdmlydHVhbCBGWF9CT09MCQlSZXdpbmQodm9pZCogcERlY29kZXIpID0gMDsKLQotICAgIHZpcnR1YWwgRlhfTFBCWVRFCUdldE5leHRMaW5lKHZvaWQqIHBEZWNvZGVyKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECUdldFNyY09mZnNldCh2b2lkKiBwRGVjb2RlcikgPSAwOwotCi0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUxvYWRJbmZvKEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCYgd2lkdGgsIGludCYgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBudW1fY29tcG9uZW50cywgaW50JiBiaXRzX3Blcl9jb21wb25lbnRzLCBGWF9CT09MJiBjb2xvcl90cmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUEJZVEUqIGljY19idWZfcHRyID0gTlVMTCwgRlhfRFdPUkQqIGljY19sZW5ndGggPSBOVUxMKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUVuY29kZShjb25zdCBjbGFzcyBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9MUEJZVEUmIGRlc3RfYnVmLCBGWF9TVFJTSVpFJiBkZXN0X3NpemUsIGludCBxdWFsaXR5ID0gNzUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBDQllURSBpY2NfYnVmID0gTlVMTCwgRlhfRFdPUkQgaWNjX2xlbmd0aCA9IDApID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCoJCVN0YXJ0KCkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkCQlGaW5pc2godm9pZCogcENvbnRleHQpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZAkJSW5wdXQodm9pZCogcENvbnRleHQsIEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUpID0gMDsKLQotICAgIHZpcnR1YWwgaW50CQkJUmVhZEhlYWRlcih2b2lkKiBwQ29udGV4dCwgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsIGludCogbkNvbXBzKSA9IDA7Ci0KLQotICAgIHZpcnR1YWwgaW50CQkJU3RhcnRTY2FubGluZSh2b2lkKiBwQ29udGV4dCwgaW50IGRvd25fc2NhbGUpID0gMDsKLQotCi0gICAgdmlydHVhbCBGWF9CT09MCQlSZWFkU2NhbmxpbmUodm9pZCogcENvbnRleHQsIEZYX0xQQllURSBkZXN0X2J1ZikgPSAwOwotCi0KLSAgICB2aXJ0dWFsIEZYX0RXT1JECUdldEF2YWlsSW5wdXQodm9pZCogcENvbnRleHQsIEZYX0xQQllURSogYXZhaWxfYnVmX3B0ciA9IE5VTEwpID0gMDsKLQotcHJvdGVjdGVkOgotICAgIH5JRlhfSnBlZ1Byb3ZpZGVyKCkgeyB9Ci19OwotCi0jZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GWENPREVDX0ZYX0NPREVDX1BST1ZJREVSX0hfCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfYXJiLmggYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfYXJiLmgKaW5kZXggZmY4NmZhNi4uNjc2MGVmMyAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2FyYi5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9hcmIuaApAQCAtMSwyNyArMSw2NiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIENPUkVfSU5DTFVERV9GWENSVF9GWF9BUkJfSF8KICNkZWZpbmUgQ09SRV9JTkNMVURFX0ZYQ1JUX0ZYX0FSQl9IXwogCiAjaW5jbHVkZSAiZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiZnhfdWNkLmgiCiAKLWNsYXNzIElGWF9CaWRpQ2hhcgotewotcHVibGljOgotICAgIHN0YXRpYyBJRlhfQmlkaUNoYXIqCUNyZWF0ZSgpOwotICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkCQkJU2V0UG9saWN5KEZYX0JPT0wgYlNlcGFyYXRlTmV1dHJhbCA9IFRSVUUpID0gMDsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCkgPSAwOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUVuZENoYXIoKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0QmlkaUluZm8oRlhfSU5UMzIgJmlTdGFydCwgRlhfSU5UMzIgJmlDb3VudCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZAkJCVJlc2V0KCkgPSAwOworY2xhc3MgSUZYX0FyYWJpY0NoYXI7CiAKLXByb3RlY3RlZDoKLSAgICB+SUZYX0JpZGlDaGFyKCkgeyB9CitzdHJ1Y3QgRlhfQVJCRk9STVRBQkxFIHsKKyAgRlhfV0NIQVIgd0lzb2xhdGVkOworICBGWF9XQ0hBUiB3RmluYWw7CisgIEZYX1dDSEFSIHdJbml0aWFsOworICBGWF9XQ0hBUiB3TWVkaWFsOwogfTsKIAorc3RydWN0IEZYX0FSQUFMRUYgeworICBGWF9XQ0hBUiB3QWxlZjsKKyAgRlhfV0NIQVIgd0lzb2xhdGVkOworfTsKKworc3RydWN0IEZYX0FSQVNIQUREQSB7CisgIEZYX1dDSEFSIHdTaGFkZGE7CisgIEZYX1dDSEFSIHdJc29sYXRlZDsKK307CisKK2NvbnN0IEZYX0FSQkZPUk1UQUJMRSogRlhfR2V0QXJhYmljRm9ybVRhYmxlKEZYX1dDSEFSIHVuaWNvZGUpOworRlhfV0NIQVIgRlhfR2V0QXJhYmljRnJvbUFsZWZUYWJsZShGWF9XQ0hBUiBhbGVmKTsKK0ZYX1dDSEFSIEZYX0dldEFyYWJpY0Zyb21TaGFkZGFUYWJsZShGWF9XQ0hBUiBzaGFkZGEpOworCitlbnVtIEZYX0FSQlBPU0lUSU9OIHsKKyAgRlhfQVJCUE9TSVRJT05fSXNvbGF0ZWQgPSAwLAorICBGWF9BUkJQT1NJVElPTl9GaW5hbCwKKyAgRlhfQVJCUE9TSVRJT05fSW5pdGlhbCwKKyAgRlhfQVJCUE9TSVRJT05fTWVkaWFsLAorfTsKKworY2xhc3MgSUZYX0FyYWJpY0NoYXIgeworIHB1YmxpYzoKKyAgc3RhdGljIElGWF9BcmFiaWNDaGFyKiBDcmVhdGUoKTsKKyAgdmlydHVhbCB+SUZYX0FyYWJpY0NoYXIoKSB7fQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIElzQXJhYmljQ2hhcihGWF9XQ0hBUiB3Y2gpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIElzQXJhYmljRm9ybUNoYXIoRlhfV0NIQVIgd2NoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgRlhfV0NIQVIgR2V0Rm9ybUNoYXIoRlhfV0NIQVIgd2NoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIHByZXYgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIG5leHQgPSAwKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgRlhfV0NIQVIgR2V0Rm9ybUNoYXIoY29uc3QgQ0ZYX0NoYXIqIGN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2hhciogcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2hhciogbmV4dCkgY29uc3QgPSAwOworfTsKKwordm9pZCBGWF9CaWRpTGluZShDRlhfV2lkZVN0cmluZyYgd3NUZXh0LCBpbnQzMl90IGlCYXNlTGV2ZWwgPSAwKTsKK3ZvaWQgRlhfQmlkaUxpbmUoQ0ZYX1R4dENoYXJBcnJheSYgY2hhcnMsCisgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LAorICAgICAgICAgICAgICAgICBpbnQzMl90IGlCYXNlTGV2ZWwgPSAwKTsKK3ZvaWQgRlhfQmlkaUxpbmUoQ0ZYX1JURkNoYXJBcnJheSYgY2hhcnMsCisgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LAorICAgICAgICAgICAgICAgICBpbnQzMl90IGlCYXNlTGV2ZWwgPSAwKTsKKwogI2VuZGlmICAvLyBDT1JFX0lOQ0xVREVfRlhDUlRfRlhfQVJCX0hfCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oCmluZGV4IDBhNWQ0OTAuLjRlN2M4YzggMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oCkBAIC03LDYgKzcsOCBAQAogI2lmbmRlZiBDT1JFX0lOQ0xVREVfRlhDUlRfRlhfQkFTSUNfSF8KICNkZWZpbmUgQ09SRV9JTkNMVURFX0ZYQ1JUX0ZYX0JBU0lDX0hfCiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKICNpbmNsdWRlICJmeF9tZW1vcnkuaCIKICNpbmNsdWRlICJmeF9zdHJlYW0uaCIKICNpbmNsdWRlICJmeF9zdHJpbmcuaCIKQEAgLTI1LDE1ODkgKzI3LDEyMzggQEAKIC8vIE5vdGUgdGhhdCB0aGUgZnVuY3Rpb24gZG9lc24ndCBuZWVkIGFuIGltcGxlbWVudGF0aW9uLCBhcyB3ZSBvbmx5CiAvLyB1c2UgaXRzIHR5cGUuCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Ci1jaGFyICgmQXJyYXlTaXplSGVscGVyKFQgKCZhcnJheSlbTl0pKVtOXTsKK2NoYXIoJkFycmF5U2l6ZUhlbHBlcihUKCZhcnJheSlbTl0pKVtOXTsKIAotY2xhc3MgQ0ZYX0JpbmFyeUJ1ZiAKLXsKLXB1YmxpYzoKLSAgICBDRlhfQmluYXJ5QnVmKCk7Ci0gICAgQ0ZYX0JpbmFyeUJ1ZihGWF9TVFJTSVpFIHNpemUpOworY2xhc3MgQ0ZYX0JpbmFyeUJ1ZiB7CisgcHVibGljOgorICBDRlhfQmluYXJ5QnVmKCk7CisgIENGWF9CaW5hcnlCdWYoRlhfU1RSU0laRSBzaXplKTsKIAotICAgIH5DRlhfQmluYXJ5QnVmKCk7CisgIH5DRlhfQmluYXJ5QnVmKCk7CiAKLSAgICB2b2lkCQkJCQlDbGVhcigpOworICB2b2lkIENsZWFyKCk7CiAKLSAgICB2b2lkCQkJCQlFc3RpbWF0ZVNpemUoRlhfU1RSU0laRSBzaXplLCBGWF9TVFJTSVpFIGFsbG9jX3N0ZXAgPSAwKTsKKyAgdm9pZCBFc3RpbWF0ZVNpemUoRlhfU1RSU0laRSBzaXplLCBGWF9TVFJTSVpFIGFsbG9jX3N0ZXAgPSAwKTsKIAotICAgIHZvaWQJCQkJCUFwcGVuZEJsb2NrKGNvbnN0IHZvaWQqIHBCdWYsIEZYX1NUUlNJWkUgc2l6ZSk7CisgIHZvaWQgQXBwZW5kQmxvY2soY29uc3Qgdm9pZCogcEJ1ZiwgRlhfU1RSU0laRSBzaXplKTsKIAotICAgIHZvaWQJCQkJCUFwcGVuZEZpbGwoRlhfQllURSBieXRlLCBGWF9TVFJTSVpFIGNvdW50KTsKKyAgdm9pZCBBcHBlbmRGaWxsKHVpbnQ4X3QgYnl0ZSwgRlhfU1RSU0laRSBjb3VudCk7CiAKLSAgICB2b2lkCQkJCQlBcHBlbmRTdHJpbmcoRlhfQlNUUiBzdHIpCi0gICAgewotICAgICAgICBBcHBlbmRCbG9jayhzdHIuR2V0UHRyKCksIHN0ci5HZXRMZW5ndGgoKSk7CisgIHZvaWQgQXBwZW5kU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSB7CisgICAgQXBwZW5kQmxvY2soc3RyLkdldFB0cigpLCBzdHIuR2V0TGVuZ3RoKCkpOworICB9CisKKyAgaW5saW5lIHZvaWQgQXBwZW5kQnl0ZSh1aW50OF90IGJ5dGUpIHsKKyAgICBpZiAobV9BbGxvY1NpemUgPD0gbV9EYXRhU2l6ZSkgeworICAgICAgRXhwYW5kQnVmKDEpOwogICAgIH0KKyAgICBtX3BCdWZmZXJbbV9EYXRhU2l6ZSsrXSA9IGJ5dGU7CisgIH0KIAotICAgIGlubGluZSB2b2lkCQkJCUFwcGVuZEJ5dGUoRlhfQllURSBieXRlKQotICAgIHsKLSAgICAgICAgaWYgKG1fQWxsb2NTaXplIDw9IG1fRGF0YVNpemUpIHsKLSAgICAgICAgICAgIEV4cGFuZEJ1ZigxKTsKLSAgICAgICAgfQotICAgICAgICBtX3BCdWZmZXJbbV9EYXRhU2l6ZSsrXSA9IGJ5dGU7Ci0gICAgfQorICB2b2lkIEluc2VydEJsb2NrKEZYX1NUUlNJWkUgcG9zLCBjb25zdCB2b2lkKiBwQnVmLCBGWF9TVFJTSVpFIHNpemUpOwogCi0gICAgdm9pZAkJCQkJSW5zZXJ0QmxvY2soRlhfU1RSU0laRSBwb3MsIGNvbnN0IHZvaWQqIHBCdWYsIEZYX1NUUlNJWkUgc2l6ZSk7CisgIHZvaWQgQXR0YWNoRGF0YSh2b2lkKiBwQnVmLCBGWF9TVFJTSVpFIHNpemUpOwogCi0gICAgdm9pZAkJCQkJQXR0YWNoRGF0YSh2b2lkKiBwQnVmLCBGWF9TVFJTSVpFIHNpemUpOworICB2b2lkIENvcHlEYXRhKGNvbnN0IHZvaWQqIHBCdWYsIEZYX1NUUlNJWkUgc2l6ZSk7CiAKLSAgICB2b2lkCQkJCQlDb3B5RGF0YShjb25zdCB2b2lkKiBwQnVmLCBGWF9TVFJTSVpFIHNpemUpOworICB2b2lkIFRha2VPdmVyKENGWF9CaW5hcnlCdWYmIG90aGVyKTsKIAotICAgIHZvaWQJCQkJCVRha2VPdmVyKENGWF9CaW5hcnlCdWYmIG90aGVyKTsKKyAgdm9pZCBEZWxldGUoaW50IHN0YXJ0X2luZGV4LCBpbnQgY291bnQpOwogCi0gICAgdm9pZAkJCQkJRGVsZXRlKGludCBzdGFydF9pbmRleCwgaW50IGNvdW50KTsKKyAgdWludDhfdCogR2V0QnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbV9wQnVmZmVyOyB9CiAKLSAgICBGWF9MUEJZVEUJCQkJR2V0QnVmZmVyKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BCdWZmZXI7Ci0gICAgfQorICBGWF9TVFJTSVpFIEdldFNpemUoKSBjb25zdCB7IHJldHVybiBtX0RhdGFTaXplOyB9CiAKLSAgICBGWF9TVFJTSVpFCQkJCUdldFNpemUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fRGF0YVNpemU7Ci0gICAgfQorICBDRlhfQnl0ZVN0cmluZ0MgR2V0Qnl0ZVN0cmluZygpIGNvbnN0OwogCi0gICAgQ0ZYX0J5dGVTdHJpbmdDCQkJR2V0Qnl0ZVN0cmluZygpIGNvbnN0OworICB2b2lkIERldGFjaEJ1ZmZlcigpOwogCi0gICAgdm9pZAkJCQkJRGV0YWNoQnVmZmVyKCk7Ci1wcm90ZWN0ZWQ6CisgcHJvdGVjdGVkOgorICBGWF9TVFJTSVpFIG1fQWxsb2NTdGVwOwogCi0gICAgRlhfU1RSU0laRQkJCQltX0FsbG9jU3RlcDsKKyAgdWludDhfdCogbV9wQnVmZmVyOwogCi0gICAgRlhfTFBCWVRFCQkJCW1fcEJ1ZmZlcjsKKyAgRlhfU1RSU0laRSBtX0RhdGFTaXplOwogCi0gICAgRlhfU1RSU0laRQkJCQltX0RhdGFTaXplOworICBGWF9TVFJTSVpFIG1fQWxsb2NTaXplOwogCi0gICAgRlhfU1RSU0laRQkJCQltX0FsbG9jU2l6ZTsKLQotICAgIHZvaWQJCQkJCUV4cGFuZEJ1ZihGWF9TVFJTSVpFIHNpemUpOworICB2b2lkIEV4cGFuZEJ1ZihGWF9TVFJTSVpFIHNpemUpOwogfTsKLWNsYXNzIENGWF9CeXRlVGV4dEJ1ZiA6IHB1YmxpYyBDRlhfQmluYXJ5QnVmCi17Ci1wdWJsaWM6CitjbGFzcyBDRlhfQnl0ZVRleHRCdWYgOiBwdWJsaWMgQ0ZYX0JpbmFyeUJ1ZiB7CisgcHVibGljOgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7CiAKLSAgICB2b2lkCQkJCQlvcGVyYXRvciA9IChGWF9CU1RSIHN0cik7CisgIHZvaWQgQXBwZW5kQ2hhcihpbnQgY2gpIHsgQXBwZW5kQnl0ZSgodWludDhfdCljaCk7IH0KIAotICAgIHZvaWQJCQkJCUFwcGVuZENoYXIoaW50IGNoKQotICAgIHsKLSAgICAgICAgQXBwZW5kQnl0ZSgoRlhfQllURSljaCk7Ci0gICAgfQorICBDRlhfQnl0ZVRleHRCdWYmIG9wZXJhdG9yPDwoaW50IGkpOwogCi0gICAgQ0ZYX0J5dGVUZXh0QnVmJgkJb3BlcmF0b3IgPDwgKGludCBpKTsKKyAgQ0ZYX0J5dGVUZXh0QnVmJiBvcGVyYXRvcjw8KEZYX0RXT1JEIGkpOwogCi0gICAgQ0ZYX0J5dGVUZXh0QnVmJgkJb3BlcmF0b3IgPDwgKEZYX0RXT1JEIGkpOworICBDRlhfQnl0ZVRleHRCdWYmIG9wZXJhdG9yPDwoZG91YmxlIGYpOwogCi0gICAgQ0ZYX0J5dGVUZXh0QnVmJgkJb3BlcmF0b3IgPDwgKGRvdWJsZSBmKTsKKyAgQ0ZYX0J5dGVUZXh0QnVmJiBvcGVyYXRvcjw8KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbHBzeik7CiAKLSAgICBDRlhfQnl0ZVRleHRCdWYmCQlvcGVyYXRvciA8PCAoRlhfQlNUUiBscHN6KTsKKyAgQ0ZYX0J5dGVUZXh0QnVmJiBvcGVyYXRvcjw8KGNvbnN0IENGWF9CeXRlVGV4dEJ1ZiYgYnVmKTsKIAotICAgIENGWF9CeXRlVGV4dEJ1ZiYJCW9wZXJhdG9yIDw8IChjb25zdCBDRlhfQnl0ZVRleHRCdWYmIGJ1Zik7Ci0KLSAgICBGWF9TVFJTSVpFCQkJCUdldExlbmd0aCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9EYXRhU2l6ZTsKLSAgICB9CisgIEZYX1NUUlNJWkUgR2V0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9EYXRhU2l6ZTsgfQogfTsKLWNsYXNzIENGWF9XaWRlVGV4dEJ1ZiA6IHB1YmxpYyBDRlhfQmluYXJ5QnVmCi17Ci1wdWJsaWM6CitjbGFzcyBDRlhfV2lkZVRleHRCdWYgOiBwdWJsaWMgQ0ZYX0JpbmFyeUJ1ZiB7CisgcHVibGljOgorICB2b2lkIG9wZXJhdG9yPShjb25zdCBGWF9XQ0hBUiogbHBzeik7CiAKLSAgICB2b2lkCQkJCQlvcGVyYXRvciA9IChGWF9MUENXU1RSIGxwc3opOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cik7CiAKLSAgICB2b2lkCQkJCQlvcGVyYXRvciA9IChGWF9XU1RSIHN0cik7CisgIHZvaWQgQXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpOwogCi0gICAgdm9pZAkJCQkJQXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpOworICBDRlhfV2lkZVRleHRCdWYmIG9wZXJhdG9yPDwoaW50IGkpOwogCi0gICAgQ0ZYX1dpZGVUZXh0QnVmJgkJb3BlcmF0b3IgPDwgKGludCBpKTsKKyAgQ0ZYX1dpZGVUZXh0QnVmJiBvcGVyYXRvcjw8KGRvdWJsZSBmKTsKIAotICAgIENGWF9XaWRlVGV4dEJ1ZiYJCW9wZXJhdG9yIDw8IChkb3VibGUgZik7CisgIENGWF9XaWRlVGV4dEJ1ZiYgb3BlcmF0b3I8PChjb25zdCBGWF9XQ0hBUiogbHBzeik7CiAKLSAgICBDRlhfV2lkZVRleHRCdWYmCQlvcGVyYXRvciA8PCAoRlhfTFBDV1NUUiBscHN6KTsKKyAgQ0ZYX1dpZGVUZXh0QnVmJiBvcGVyYXRvcjw8KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKTsKKyAgQ0ZYX1dpZGVUZXh0QnVmJiBvcGVyYXRvcjw8KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpOwogCi0gICAgQ0ZYX1dpZGVUZXh0QnVmJgkJb3BlcmF0b3IgPDwgKEZYX1dTVFIgc3RyKTsKLSAgICBDRlhfV2lkZVRleHRCdWYmCQlvcGVyYXRvciA8PCAoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJnN0cik7CisgIENGWF9XaWRlVGV4dEJ1ZiYgb3BlcmF0b3I8PChjb25zdCBDRlhfV2lkZVRleHRCdWYmIGJ1Zik7CiAKLSAgICBDRlhfV2lkZVRleHRCdWYmCQlvcGVyYXRvciA8PCAoY29uc3QgQ0ZYX1dpZGVUZXh0QnVmJiBidWYpOworICBGWF9TVFJTSVpFIEdldExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fRGF0YVNpemUgLyBzaXplb2YoRlhfV0NIQVIpOyB9CiAKLSAgICBGWF9TVFJTSVpFCQkJCUdldExlbmd0aCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9EYXRhU2l6ZSAvIHNpemVvZihGWF9XQ0hBUik7Ci0gICAgfQorICBGWF9XQ0hBUiogR2V0QnVmZmVyKCkgY29uc3QgeyByZXR1cm4gKEZYX1dDSEFSKiltX3BCdWZmZXI7IH0KIAotICAgIEZYX0xQV1NUUgkJCQlHZXRCdWZmZXIoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIChGWF9MUFdTVFIpbV9wQnVmZmVyOwotICAgIH0KKyAgdm9pZCBEZWxldGUoaW50IHN0YXJ0X2luZGV4LCBpbnQgY291bnQpIHsKKyAgICBDRlhfQmluYXJ5QnVmOjpEZWxldGUoc3RhcnRfaW5kZXggKiBzaXplb2YoRlhfV0NIQVIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCAqIHNpemVvZihGWF9XQ0hBUikpOworICB9CiAKLSAgICB2b2lkCQkJCQlEZWxldGUoaW50IHN0YXJ0X2luZGV4LCBpbnQgY291bnQpCi0gICAgewotICAgICAgICBDRlhfQmluYXJ5QnVmOjpEZWxldGUoc3RhcnRfaW5kZXggKiBzaXplb2YoRlhfV0NIQVIpLCBjb3VudCAqIHNpemVvZihGWF9XQ0hBUikpOwotICAgIH0KLQotICAgIENGWF9XaWRlU3RyaW5nQwkJCUdldFdpZGVTdHJpbmcoKSBjb25zdDsKKyAgQ0ZYX1dpZGVTdHJpbmdDIEdldFdpZGVTdHJpbmcoKSBjb25zdDsKIH07Ci1jbGFzcyBDRlhfQXJjaGl2ZVNhdmVyIAotewotcHVibGljOgotICAgIENGWF9BcmNoaXZlU2F2ZXIoKSA6IG1fcFN0cmVhbShOVUxMKSB7fQorI2lmZGVmIFBERl9FTkFCTEVfWEZBCitjbGFzcyBDRlhfQXJjaGl2ZVNhdmVyIHsKKyBwdWJsaWM6CisgIENGWF9BcmNoaXZlU2F2ZXIoKSA6IG1fcFN0cmVhbShOVUxMKSB7fQogCi0gICAgQ0ZYX0FyY2hpdmVTYXZlciYJCW9wZXJhdG9yIDw8IChGWF9CWVRFIGkpOworICBDRlhfQXJjaGl2ZVNhdmVyJiBvcGVyYXRvcjw8KHVpbnQ4X3QgaSk7CiAKLSAgICBDRlhfQXJjaGl2ZVNhdmVyJgkJb3BlcmF0b3IgPDwgKGludCBpKTsKKyAgQ0ZYX0FyY2hpdmVTYXZlciYgb3BlcmF0b3I8PChpbnQgaSk7CiAKLSAgICBDRlhfQXJjaGl2ZVNhdmVyJgkJb3BlcmF0b3IgPDwgKEZYX0RXT1JEIGkpOworICBDRlhfQXJjaGl2ZVNhdmVyJiBvcGVyYXRvcjw8KEZYX0RXT1JEIGkpOwogCi0gICAgQ0ZYX0FyY2hpdmVTYXZlciYJCW9wZXJhdG9yIDw8IChGWF9GTE9BVCBpKTsKKyAgQ0ZYX0FyY2hpdmVTYXZlciYgb3BlcmF0b3I8PChGWF9GTE9BVCBpKTsKIAotICAgIENGWF9BcmNoaXZlU2F2ZXImCQlvcGVyYXRvciA8PCAoZG91YmxlIGkpOworICBDRlhfQXJjaGl2ZVNhdmVyJiBvcGVyYXRvcjw8KGRvdWJsZSBpKTsKIAotICAgIENGWF9BcmNoaXZlU2F2ZXImCQlvcGVyYXRvciA8PCAoRlhfQlNUUiBic3RyKTsKKyAgQ0ZYX0FyY2hpdmVTYXZlciYgb3BlcmF0b3I8PChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzdHIpOwogCi0gICAgQ0ZYX0FyY2hpdmVTYXZlciYJCW9wZXJhdG9yIDw8IChGWF9MUENXU1RSIGJzdHIpOworICBDRlhfQXJjaGl2ZVNhdmVyJiBvcGVyYXRvcjw8KGNvbnN0IEZYX1dDSEFSKiBic3RyKTsKIAotICAgIENGWF9BcmNoaXZlU2F2ZXImCQlvcGVyYXRvciA8PCAoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzdHIpOworICBDRlhfQXJjaGl2ZVNhdmVyJiBvcGVyYXRvcjw8KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c3RyKTsKIAotICAgIHZvaWQJCQkJCVdyaXRlKGNvbnN0IHZvaWQqIHBEYXRhLCBGWF9TVFJTSVpFIGR3U2l6ZSk7CisgIHZvaWQgV3JpdGUoY29uc3Qgdm9pZCogcERhdGEsIEZYX1NUUlNJWkUgZHdTaXplKTsKIAotICAgIEZYX0lOVFBUUgkJCQlHZXRMZW5ndGgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fU2F2aW5nQnVmLkdldFNpemUoKTsKLSAgICB9CisgIGludHB0cl90IEdldExlbmd0aCgpIHsgcmV0dXJuIG1fU2F2aW5nQnVmLkdldFNpemUoKTsgfQogCi0gICAgRlhfTFBDQllURQkJCQlHZXRCdWZmZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fU2F2aW5nQnVmLkdldEJ1ZmZlcigpOwotICAgIH0KKyAgY29uc3QgdWludDhfdCogR2V0QnVmZmVyKCkgeyByZXR1cm4gbV9TYXZpbmdCdWYuR2V0QnVmZmVyKCk7IH0KIAotICAgIHZvaWQJCQkJCVNldFN0cmVhbShJRlhfRmlsZVN0cmVhbSogcFN0cmVhbSkKLSAgICB7Ci0gICAgICAgIG1fcFN0cmVhbSA9IHBTdHJlYW07Ci0gICAgfQotcHJvdGVjdGVkOgorICB2b2lkIFNldFN0cmVhbShJRlhfRmlsZVN0cmVhbSogcFN0cmVhbSkgeyBtX3BTdHJlYW0gPSBwU3RyZWFtOyB9CiAKLSAgICBDRlhfQmluYXJ5QnVmCQkJbV9TYXZpbmdCdWY7CisgcHJvdGVjdGVkOgorICBDRlhfQmluYXJ5QnVmIG1fU2F2aW5nQnVmOwogCi0gICAgSUZYX0ZpbGVTdHJlYW0qCQkJbV9wU3RyZWFtOworICBJRlhfRmlsZVN0cmVhbSogbV9wU3RyZWFtOwogfTsKLWNsYXNzIENGWF9BcmNoaXZlTG9hZGVyIAotewotcHVibGljOgorY2xhc3MgQ0ZYX0FyY2hpdmVMb2FkZXIgeworIHB1YmxpYzoKKyAgQ0ZYX0FyY2hpdmVMb2FkZXIoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3U2l6ZSk7CiAKLSAgICBDRlhfQXJjaGl2ZUxvYWRlcihGWF9MUENCWVRFIHBEYXRhLCBGWF9EV09SRCBkd1NpemUpOworICBDRlhfQXJjaGl2ZUxvYWRlciYgb3BlcmF0b3I+Pih1aW50OF90JiBpKTsKIAotICAgIENGWF9BcmNoaXZlTG9hZGVyJgkJb3BlcmF0b3IgPj4gKEZYX0JZVEUmIGkpOworICBDRlhfQXJjaGl2ZUxvYWRlciYgb3BlcmF0b3I+PihpbnQmIGkpOwogCi0gICAgQ0ZYX0FyY2hpdmVMb2FkZXImCQlvcGVyYXRvciA+PiAoaW50JiBpKTsKKyAgQ0ZYX0FyY2hpdmVMb2FkZXImIG9wZXJhdG9yPj4oRlhfRFdPUkQmIGkpOwogCi0gICAgQ0ZYX0FyY2hpdmVMb2FkZXImCQlvcGVyYXRvciA+PiAoRlhfRFdPUkQmIGkpOworICBDRlhfQXJjaGl2ZUxvYWRlciYgb3BlcmF0b3I+PihGWF9GTE9BVCYgaSk7CiAKLSAgICBDRlhfQXJjaGl2ZUxvYWRlciYJCW9wZXJhdG9yID4+IChGWF9GTE9BVCYgaSk7CisgIENGWF9BcmNoaXZlTG9hZGVyJiBvcGVyYXRvcj4+KGRvdWJsZSYgaSk7CiAKLSAgICBDRlhfQXJjaGl2ZUxvYWRlciYJCW9wZXJhdG9yID4+IChkb3VibGUmIGkpOworICBDRlhfQXJjaGl2ZUxvYWRlciYgb3BlcmF0b3I+PihDRlhfQnl0ZVN0cmluZyYgYnN0cik7CiAKLSAgICBDRlhfQXJjaGl2ZUxvYWRlciYJCW9wZXJhdG9yID4+IChDRlhfQnl0ZVN0cmluZyYgYnN0cik7CisgIENGWF9BcmNoaXZlTG9hZGVyJiBvcGVyYXRvcj4+KENGWF9XaWRlU3RyaW5nJiB3c3RyKTsKIAotICAgIENGWF9BcmNoaXZlTG9hZGVyJgkJb3BlcmF0b3IgPj4gKENGWF9XaWRlU3RyaW5nJiB3c3RyKTsKKyAgRlhfQk9PTCBJc0VPRigpOwogCi0gICAgRlhfQk9PTAkJCQkJSXNFT0YoKTsKKyAgRlhfQk9PTCBSZWFkKHZvaWQqIHBCdWYsIEZYX0RXT1JEIGR3U2l6ZSk7CiAKLSAgICBGWF9CT09MCQkJCQlSZWFkKHZvaWQqIHBCdWYsIEZYX0RXT1JEIGR3U2l6ZSk7Ci1wcm90ZWN0ZWQ6CisgcHJvdGVjdGVkOgorICBGWF9EV09SRCBtX0xvYWRpbmdQb3M7CiAKLSAgICBGWF9EV09SRAkJCQltX0xvYWRpbmdQb3M7CisgIGNvbnN0IHVpbnQ4X3QqIG1fcExvYWRpbmdCdWY7CiAKLSAgICBGWF9MUENCWVRFCQkJCW1fcExvYWRpbmdCdWY7Ci0KLSAgICBGWF9EV09SRAkJCQltX0xvYWRpbmdTaXplOworICBGWF9EV09SRCBtX0xvYWRpbmdTaXplOwogfTsKLWNsYXNzIElGWF9CdWZmZXJBcmNoaXZlCi17Ci1wdWJsaWM6Ci0gICAgSUZYX0J1ZmZlckFyY2hpdmUoRlhfU1RSU0laRSBzaXplKTsKLSAgICB2aXJ0dWFsIH5JRlhfQnVmZmVyQXJjaGl2ZSgpIHsgfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCi0gICAgdmlydHVhbCB2b2lkCQkJQ2xlYXIoKTsKK2NsYXNzIElGWF9CdWZmZXJBcmNoaXZlIHsKKyBwdWJsaWM6CisgIElGWF9CdWZmZXJBcmNoaXZlKEZYX1NUUlNJWkUgc2l6ZSk7CisgIHZpcnR1YWwgfklGWF9CdWZmZXJBcmNoaXZlKCkge30KIAorICB2aXJ0dWFsIHZvaWQgQ2xlYXIoKTsKIAotICAgIEZYX0JPT0wJCQkJCUZsdXNoKCk7CisgIEZYX0JPT0wgRmx1c2goKTsKIAorICBpbnQzMl90IEFwcGVuZEJsb2NrKGNvbnN0IHZvaWQqIHBCdWYsIHNpemVfdCBzaXplKTsKIAotICAgIEZYX0lOVDMyCQkJCUFwcGVuZEJsb2NrKGNvbnN0IHZvaWQqIHBCdWYsIHNpemVfdCBzaXplKTsKKyAgaW50MzJfdCBBcHBlbmRCeXRlKHVpbnQ4X3QgYnl0ZSk7CiAKLSAgICBGWF9JTlQzMgkJCQlBcHBlbmRCeXRlKEZYX0JZVEUgYnl0ZSk7CisgIGludDMyX3QgQXBwZW5kRFdvcmQoRlhfRFdPUkQgaSk7CiAKLSAgICBGWF9JTlQzMgkJCQlBcHBlbmREV29yZChGWF9EV09SRCBpKTsKKyAgaW50MzJfdCBBcHBlbmRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBscHN6KTsKIAorIHByb3RlY3RlZDoKKyAgdmlydHVhbCBGWF9CT09MIERvV29yayhjb25zdCB2b2lkKiBwQnVmLCBzaXplX3Qgc2l6ZSkgPSAwOwogCi0gICAgRlhfSU5UMzIJCQkJQXBwZW5kU3RyaW5nKEZYX0JTVFIgbHBzeik7CisgIEZYX1NUUlNJWkUgbV9CdWZTaXplOwogCi1wcm90ZWN0ZWQ6CisgIHVpbnQ4X3QqIG1fcEJ1ZmZlcjsKIAotICAgIHZpcnR1YWwJRlhfQk9PTAkJCURvV29yayhjb25zdCB2b2lkKiBwQnVmLCBzaXplX3Qgc2l6ZSkgPSAwOwotCi0gICAgRlhfU1RSU0laRQkJCQltX0J1ZlNpemU7Ci0KLSAgICBGWF9MUEJZVEUJCQkJbV9wQnVmZmVyOwotCi0gICAgRlhfU1RSU0laRQkJCQltX0xlbmd0aDsKKyAgRlhfU1RSU0laRSBtX0xlbmd0aDsKIH07Ci1jbGFzcyBDRlhfRmlsZUJ1ZmZlckFyY2hpdmUgOiBwdWJsaWMgSUZYX0J1ZmZlckFyY2hpdmUKLXsKLXB1YmxpYzoKLSAgICBDRlhfRmlsZUJ1ZmZlckFyY2hpdmUoRlhfU1RSU0laRSBzaXplID0gMzI3NjgpOwotICAgIH5DRlhfRmlsZUJ1ZmZlckFyY2hpdmUoKSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIHZvaWQJCQlDbGVhcigpOwogCi0gICAgRlhfQk9PTAkJCQkJQXR0YWNoRmlsZShJRlhfU3RyZWFtV3JpdGUgKnBGaWxlLCBGWF9CT09MIGJUYWtlb3ZlciA9IEZBTFNFKTsKK2NsYXNzIENGWF9GaWxlQnVmZmVyQXJjaGl2ZSA6IHB1YmxpYyBJRlhfQnVmZmVyQXJjaGl2ZSB7CisgcHVibGljOgorICBDRlhfRmlsZUJ1ZmZlckFyY2hpdmUoRlhfU1RSU0laRSBzaXplID0gMzI3NjgpOworICB+Q0ZYX0ZpbGVCdWZmZXJBcmNoaXZlKCkgb3ZlcnJpZGU7CiAKLSAgICBGWF9CT09MCQkJCQlBdHRhY2hGaWxlKEZYX0xQQ1dTVFIgZmlsZW5hbWUpOworICB2b2lkIENsZWFyKCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgQXR0YWNoRmlsZShJRlhfU3RyZWFtV3JpdGUqIHBGaWxlLCBGWF9CT09MIGJUYWtlb3ZlciA9IEZBTFNFKTsKIAotICAgIEZYX0JPT0wJCQkJCUF0dGFjaEZpbGUoRlhfTFBDU1RSIGZpbGVuYW1lKTsKLXByaXZhdGU6CisgcHJpdmF0ZToKKyAgRlhfQk9PTCBEb1dvcmsoY29uc3Qgdm9pZCogcEJ1Ziwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJRG9Xb3JrKGNvbnN0IHZvaWQqIHBCdWYsIHNpemVfdCBzaXplKTsKLQotICAgIElGWF9TdHJlYW1Xcml0ZQkJCSptX3BGaWxlOwotCi0gICAgRlhfQk9PTAkJCQkJbV9iVGFrZW92ZXI7CisgIElGWF9TdHJlYW1Xcml0ZSogbV9wRmlsZTsKKyAgRlhfQk9PTCBtX2JUYWtlb3ZlcjsKIH07CisKIHN0cnVjdCBDRlhfQ2hhck1hcCB7CisgIHN0YXRpYyBDRlhfQ2hhck1hcCogR2V0RGVmYXVsdE1hcHBlcihpbnQzMl90IGNvZGVwYWdlID0gMCk7CiAKLSAgICBzdGF0aWMgQ0ZYX0NoYXJNYXAqCQlHZXREZWZhdWx0TWFwcGVyKEZYX0lOVDMyIGNvZGVwYWdlID0gMCk7CisgIENGWF9XaWRlU3RyaW5nICgqbV9HZXRXaWRlU3RyaW5nKShDRlhfQ2hhck1hcCogcE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic3RyKTsKIAorICBDRlhfQnl0ZVN0cmluZyAoKm1fR2V0Qnl0ZVN0cmluZykoQ0ZYX0NoYXJNYXAqIHBNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3N0cik7CiAKLSAgICBDRlhfV2lkZVN0cmluZwkoKm1fR2V0V2lkZVN0cmluZykoQ0ZYX0NoYXJNYXAqIHBNYXAsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic3RyKTsKLQotICAgIENGWF9CeXRlU3RyaW5nCSgqbV9HZXRCeXRlU3RyaW5nKShDRlhfQ2hhck1hcCogcE1hcCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzdHIpOwotCi0gICAgRlhfSU5UMzIJCSgqbV9HZXRDb2RlUGFnZSkoKTsKKyAgaW50MzJfdCAoKm1fR2V0Q29kZVBhZ2UpKCk7CiB9OwotY2xhc3MgQ0ZYX1VURjhEZWNvZGVyCi17Ci1wdWJsaWM6Ci0gICAgQ0ZYX1VURjhEZWNvZGVyKCkKLSAgICB7Ci0gICAgICAgIG1fUGVuZGluZ0J5dGVzID0gMDsKLSAgICB9CitjbGFzcyBDRlhfVVRGOERlY29kZXIgeworIHB1YmxpYzoKKyAgQ0ZYX1VURjhEZWNvZGVyKCkgeyBtX1BlbmRpbmdCeXRlcyA9IDA7IH0KIAotICAgIHZvaWQJCQlDbGVhcigpOworICB2b2lkIENsZWFyKCk7CiAKLSAgICB2b2lkCQkJSW5wdXQoRlhfQllURSBieXRlKTsKKyAgdm9pZCBJbnB1dCh1aW50OF90IGJ5dGUpOwogCi0gICAgdm9pZAkJCUFwcGVuZENoYXIoRlhfRFdPUkQgY2gpOworICB2b2lkIEFwcGVuZENoYXIoRlhfRFdPUkQgY2gpOwogCi0gICAgdm9pZAkJCUNsZWFyU3RhdHVzKCkKLSAgICB7Ci0gICAgICAgIG1fUGVuZGluZ0J5dGVzID0gMDsKLSAgICB9CisgIHZvaWQgQ2xlYXJTdGF0dXMoKSB7IG1fUGVuZGluZ0J5dGVzID0gMDsgfQogCi0gICAgQ0ZYX1dpZGVTdHJpbmdDCUdldFJlc3VsdCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9CdWZmZXIuR2V0V2lkZVN0cmluZygpOwotICAgIH0KLXByb3RlY3RlZDoKKyAgQ0ZYX1dpZGVTdHJpbmdDIEdldFJlc3VsdCgpIGNvbnN0IHsgcmV0dXJuIG1fQnVmZmVyLkdldFdpZGVTdHJpbmcoKTsgfQogCi0gICAgaW50CQkJCW1fUGVuZGluZ0J5dGVzOworIHByb3RlY3RlZDoKKyAgaW50IG1fUGVuZGluZ0J5dGVzOwogCi0gICAgRlhfRFdPUkQJCW1fUGVuZGluZ0NoYXI7CisgIEZYX0RXT1JEIG1fUGVuZGluZ0NoYXI7CiAKLSAgICBDRlhfV2lkZVRleHRCdWYJbV9CdWZmZXI7CisgIENGWF9XaWRlVGV4dEJ1ZiBtX0J1ZmZlcjsKIH07Ci1jbGFzcyBDRlhfVVRGOEVuY29kZXIKLXsKLXB1YmxpYzoKLSAgICBDRlhfVVRGOEVuY29kZXIoKQotICAgIHsKLSAgICAgICAgbV9VVEYxNkZpcnN0ID0gMDsKLSAgICB9CiAKLSAgICB2b2lkCQkJSW5wdXQoRlhfV0NIQVIgdW5pY29kZSk7CitjbGFzcyBDRlhfVVRGOEVuY29kZXIgeworIHB1YmxpYzoKKyAgQ0ZYX1VURjhFbmNvZGVyKCkge30KIAotICAgIHZvaWQJCQlBcHBlbmRTdHIoRlhfQlNUUiBzdHIpCi0gICAgewotICAgICAgICBtX1VURjE2Rmlyc3QgPSAwOwotICAgICAgICBtX0J1ZmZlciA8PCBzdHI7Ci0gICAgfQorICB2b2lkIElucHV0KEZYX1dDSEFSIHVuaWNvZGUpOworICB2b2lkIEFwcGVuZFN0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgeyBtX0J1ZmZlciA8PCBzdHI7IH0KKyAgQ0ZYX0J5dGVTdHJpbmdDIEdldFJlc3VsdCgpIGNvbnN0IHsgcmV0dXJuIG1fQnVmZmVyLkdldEJ5dGVTdHJpbmcoKTsgfQogCi0gICAgQ0ZYX0J5dGVTdHJpbmdDCUdldFJlc3VsdCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9CdWZmZXIuR2V0Qnl0ZVN0cmluZygpOwotICAgIH0KLXByb3RlY3RlZDoKLQotICAgIENGWF9CeXRlVGV4dEJ1ZgltX0J1ZmZlcjsKLQotICAgIEZYX0RXT1JECQltX1VURjE2Rmlyc3Q7CisgcHJvdGVjdGVkOgorICBDRlhfQnl0ZVRleHRCdWYgbV9CdWZmZXI7CiB9OwotQ0ZYX0J5dGVTdHJpbmcgRlhfVXJsRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1VybCk7Ci1DRlhfV2lkZVN0cmluZyBGWF9VcmxEZWNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJzVXJsKTsKLUNGWF9CeXRlU3RyaW5nIEZYX0VuY29kZVVSSShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NVUkkpOwotQ0ZYX1dpZGVTdHJpbmcgRlhfRGVjb2RlVVJJKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic1VSSSk7Ci1jbGFzcyBDRlhfQmFzaWNBcnJheSAKLXsKLXByb3RlY3RlZDoKLSAgICBDRlhfQmFzaWNBcnJheShpbnQgdW5pdF9zaXplKTsKIAotICAgIH5DRlhfQmFzaWNBcnJheSgpOworY2xhc3MgQ0ZYX0Jhc2ljQXJyYXkgeworIHByb3RlY3RlZDoKKyAgQ0ZYX0Jhc2ljQXJyYXkoaW50IHVuaXRfc2l6ZSk7CiAKLSAgICBGWF9CT09MCQkJU2V0U2l6ZShpbnQgbk5ld1NpemUpOworICB+Q0ZYX0Jhc2ljQXJyYXkoKTsKIAotICAgIEZYX0JPT0wJCQlBcHBlbmQoY29uc3QgQ0ZYX0Jhc2ljQXJyYXkmIHNyYyk7CisgIEZYX0JPT0wgU2V0U2l6ZShpbnQgbk5ld1NpemUpOwogCi0gICAgRlhfQk9PTAkJCUNvcHkoY29uc3QgQ0ZYX0Jhc2ljQXJyYXkmIHNyYyk7CisgIEZYX0JPT0wgQXBwZW5kKGNvbnN0IENGWF9CYXNpY0FycmF5JiBzcmMpOwogCi0gICAgRlhfTFBCWVRFCQlJbnNlcnRTcGFjZUF0KGludCBuSW5kZXgsIGludCBuQ291bnQpOworICBGWF9CT09MIENvcHkoY29uc3QgQ0ZYX0Jhc2ljQXJyYXkmIHNyYyk7CiAKLSAgICBGWF9CT09MCQkJUmVtb3ZlQXQoaW50IG5JbmRleCwgaW50IG5Db3VudCk7CisgIHVpbnQ4X3QqIEluc2VydFNwYWNlQXQoaW50IG5JbmRleCwgaW50IG5Db3VudCk7CiAKLSAgICBGWF9CT09MCQkJSW5zZXJ0QXQoaW50IG5TdGFydEluZGV4LCBjb25zdCBDRlhfQmFzaWNBcnJheSogcE5ld0FycmF5KTsKKyAgRlhfQk9PTCBSZW1vdmVBdChpbnQgbkluZGV4LCBpbnQgbkNvdW50KTsKIAotICAgIGNvbnN0IHZvaWQqCQlHZXREYXRhUHRyKGludCBpbmRleCkgY29uc3Q7Ci1wcm90ZWN0ZWQ6CisgIEZYX0JPT0wgSW5zZXJ0QXQoaW50IG5TdGFydEluZGV4LCBjb25zdCBDRlhfQmFzaWNBcnJheSogcE5ld0FycmF5KTsKIAotICAgIEZYX0xQQllURQkJbV9wRGF0YTsKKyAgY29uc3Qgdm9pZCogR2V0RGF0YVB0cihpbnQgaW5kZXgpIGNvbnN0OwogCi0gICAgaW50CQkJCW1fblNpemU7CisgcHJvdGVjdGVkOgorICB1aW50OF90KiBtX3BEYXRhOwogCi0gICAgaW50CQkJCW1fbk1heFNpemU7CisgIGludCBtX25TaXplOwogCi0gICAgaW50CQkJCW1fblVuaXRTaXplOworICBpbnQgbV9uTWF4U2l6ZTsKKworICBpbnQgbV9uVW5pdFNpemU7CiB9OwotdGVtcGxhdGU8Y2xhc3MgVFlQRT4KLWNsYXNzIENGWF9BcnJheVRlbXBsYXRlIDogcHVibGljIENGWF9CYXNpY0FycmF5Ci17Ci1wdWJsaWM6Ci0gICAgQ0ZYX0FycmF5VGVtcGxhdGUoKSA6IENGWF9CYXNpY0FycmF5KHNpemVvZihUWVBFKSkge30KK3RlbXBsYXRlIDxjbGFzcyBUWVBFPgorY2xhc3MgQ0ZYX0FycmF5VGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0Jhc2ljQXJyYXkgeworIHB1YmxpYzoKKyAgQ0ZYX0FycmF5VGVtcGxhdGUoKSA6IENGWF9CYXNpY0FycmF5KHNpemVvZihUWVBFKSkge30KIAotICAgIGludAkJCUdldFNpemUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fblNpemU7Ci0gICAgfQorICBpbnQgR2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fblNpemU7IH0KIAotICAgIGludAkJCUdldFVwcGVyQm91bmQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fblNpemUgLSAxOwotICAgIH0KKyAgaW50IEdldFVwcGVyQm91bmQoKSBjb25zdCB7IHJldHVybiBtX25TaXplIC0gMTsgfQogCi0gICAgRlhfQk9PTAkJU2V0U2l6ZShpbnQgbk5ld1NpemUpCi0gICAgewotICAgICAgICByZXR1cm4gQ0ZYX0Jhc2ljQXJyYXk6OlNldFNpemUobk5ld1NpemUpOwotICAgIH0KKyAgRlhfQk9PTCBTZXRTaXplKGludCBuTmV3U2l6ZSkgeyByZXR1cm4gQ0ZYX0Jhc2ljQXJyYXk6OlNldFNpemUobk5ld1NpemUpOyB9CiAKLSAgICB2b2lkCQlSZW1vdmVBbGwoKQotICAgIHsKLSAgICAgICAgU2V0U2l6ZSgwKTsKLSAgICB9CisgIHZvaWQgUmVtb3ZlQWxsKCkgeyBTZXRTaXplKDApOyB9CiAKLSAgICBjb25zdCBUWVBFCUdldEF0KGludCBuSW5kZXgpIGNvbnN0Ci0gICAgewotICAgICAgICBpZiAobkluZGV4IDwgMCB8fCBuSW5kZXggPj0gbV9uU2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIChjb25zdCBUWVBFJikoKih2b2xhdGlsZSBjb25zdCBUWVBFKilOVUxMKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKChjb25zdCBUWVBFKiltX3BEYXRhKVtuSW5kZXhdOworICBjb25zdCBUWVBFIEdldEF0KGludCBuSW5kZXgpIGNvbnN0IHsKKyAgICBpZiAobkluZGV4IDwgMCB8fCBuSW5kZXggPj0gbV9uU2l6ZSkgeworICAgICAgcmV0dXJuIChjb25zdCBUWVBFJikoKih2b2xhdGlsZSBjb25zdCBUWVBFKilOVUxMKTsKICAgICB9CisgICAgcmV0dXJuICgoY29uc3QgVFlQRSopbV9wRGF0YSlbbkluZGV4XTsKKyAgfQogCi0gICAgRlhfQk9PTAkJU2V0QXQoaW50IG5JbmRleCwgVFlQRSBuZXdFbGVtZW50KQotICAgIHsKLSAgICAgICAgaWYgKG5JbmRleCA8IDAgfHwgbkluZGV4ID49IG1fblNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICAoKFRZUEUqKW1fcERhdGEpW25JbmRleF0gPSBuZXdFbGVtZW50OwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgRlhfQk9PTCBTZXRBdChpbnQgbkluZGV4LCBUWVBFIG5ld0VsZW1lbnQpIHsKKyAgICBpZiAobkluZGV4IDwgMCB8fCBuSW5kZXggPj0gbV9uU2l6ZSkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KKyAgICAoKFRZUEUqKW1fcERhdGEpW25JbmRleF0gPSBuZXdFbGVtZW50OworICAgIHJldHVybiBUUlVFOworICB9CiAKLSAgICBUWVBFJgkJRWxlbWVudEF0KGludCBuSW5kZXgpCi0gICAgewotICAgICAgICBpZiAobkluZGV4IDwgMCB8fCBuSW5kZXggPj0gbV9uU2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuICooVFlQRSopTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKChUWVBFKiltX3BEYXRhKVtuSW5kZXhdOworICBUWVBFJiBFbGVtZW50QXQoaW50IG5JbmRleCkgeworICAgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBtX25TaXplKSB7CisgICAgICByZXR1cm4gKihUWVBFKilOVUxMOwogICAgIH0KKyAgICByZXR1cm4gKChUWVBFKiltX3BEYXRhKVtuSW5kZXhdOworICB9CiAKLSAgICBjb25zdCBUWVBFKglHZXREYXRhKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiAoY29uc3QgVFlQRSopbV9wRGF0YTsKLSAgICB9CisgIGNvbnN0IFRZUEUqIEdldERhdGEoKSBjb25zdCB7IHJldHVybiAoY29uc3QgVFlQRSopbV9wRGF0YTsgfQogCi0gICAgVFlQRSoJCUdldERhdGEoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUWVBFKiltX3BEYXRhOwotICAgIH0KKyAgVFlQRSogR2V0RGF0YSgpIHsgcmV0dXJuIChUWVBFKiltX3BEYXRhOyB9CiAKLSAgICBGWF9CT09MCQlTZXRBdEdyb3coaW50IG5JbmRleCwgVFlQRSBuZXdFbGVtZW50KQotICAgIHsKLSAgICAgICAgaWYgKG5JbmRleCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAobkluZGV4ID49IG1fblNpemUpCi0gICAgICAgICAgICBpZiAoIVNldFNpemUobkluZGV4ICsgMSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICgoVFlQRSopbV9wRGF0YSlbbkluZGV4XSA9IG5ld0VsZW1lbnQ7Ci0gICAgICAgIHJldHVybiBUUlVFOworICBGWF9CT09MIFNldEF0R3JvdyhpbnQgbkluZGV4LCBUWVBFIG5ld0VsZW1lbnQpIHsKKyAgICBpZiAobkluZGV4IDwgMCkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KKyAgICBpZiAobkluZGV4ID49IG1fblNpemUpCisgICAgICBpZiAoIVNldFNpemUobkluZGV4ICsgMSkpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICgoVFlQRSopbV9wRGF0YSlbbkluZGV4XSA9IG5ld0VsZW1lbnQ7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KIAotICAgIEZYX0JPT0wJCUFkZChUWVBFIG5ld0VsZW1lbnQpCi0gICAgewotICAgICAgICBpZiAobV9uU2l6ZSA8IG1fbk1heFNpemUpIHsKLSAgICAgICAgICAgIG1fblNpemUgKys7Ci0gICAgICAgIH0gZWxzZSBpZiAoIVNldFNpemUobV9uU2l6ZSArIDEpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgKChUWVBFKiltX3BEYXRhKVttX25TaXplIC0gMV0gPSBuZXdFbGVtZW50OwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgRlhfQk9PTCBBZGQoVFlQRSBuZXdFbGVtZW50KSB7CisgICAgaWYgKG1fblNpemUgPCBtX25NYXhTaXplKSB7CisgICAgICBtX25TaXplKys7CisgICAgfSBlbHNlIGlmICghU2V0U2l6ZShtX25TaXplICsgMSkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CisgICAgKChUWVBFKiltX3BEYXRhKVttX25TaXplIC0gMV0gPSBuZXdFbGVtZW50OworICAgIHJldHVybiBUUlVFOworICB9CiAKLSAgICBGWF9CT09MCQlBcHBlbmQoY29uc3QgQ0ZYX0FycmF5VGVtcGxhdGUmIHNyYykKLSAgICB7Ci0gICAgICAgIHJldHVybiBDRlhfQmFzaWNBcnJheTo6QXBwZW5kKHNyYyk7Ci0gICAgfQorICBGWF9CT09MIEFwcGVuZChjb25zdCBDRlhfQXJyYXlUZW1wbGF0ZSYgc3JjKSB7CisgICAgcmV0dXJuIENGWF9CYXNpY0FycmF5OjpBcHBlbmQoc3JjKTsKKyAgfQogCi0gICAgRlhfQk9PTAkJQ29weShjb25zdCBDRlhfQXJyYXlUZW1wbGF0ZSYgc3JjKQotICAgIHsKLSAgICAgICAgcmV0dXJuIENGWF9CYXNpY0FycmF5OjpDb3B5KHNyYyk7Ci0gICAgfQorICBGWF9CT09MIENvcHkoY29uc3QgQ0ZYX0FycmF5VGVtcGxhdGUmIHNyYykgeworICAgIHJldHVybiBDRlhfQmFzaWNBcnJheTo6Q29weShzcmMpOworICB9CiAKLSAgICBUWVBFKgkJR2V0RGF0YVB0cihpbnQgaW5kZXgpCi0gICAgewotICAgICAgICByZXR1cm4gKFRZUEUqKUNGWF9CYXNpY0FycmF5OjpHZXREYXRhUHRyKGluZGV4KTsKLSAgICB9CisgIFRZUEUqIEdldERhdGFQdHIoaW50IGluZGV4KSB7CisgICAgcmV0dXJuIChUWVBFKilDRlhfQmFzaWNBcnJheTo6R2V0RGF0YVB0cihpbmRleCk7CisgIH0KIAotICAgIFRZUEUqCQlBZGRTcGFjZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKFRZUEUqKUNGWF9CYXNpY0FycmF5OjpJbnNlcnRTcGFjZUF0KG1fblNpemUsIDEpOwotICAgIH0KKyAgVFlQRSogQWRkU3BhY2UoKSB7IHJldHVybiAoVFlQRSopQ0ZYX0Jhc2ljQXJyYXk6Okluc2VydFNwYWNlQXQobV9uU2l6ZSwgMSk7IH0KIAotICAgIFRZUEUqCQlJbnNlcnRTcGFjZUF0KGludCBuSW5kZXgsIGludCBuQ291bnQpCi0gICAgewotICAgICAgICByZXR1cm4gKFRZUEUqKUNGWF9CYXNpY0FycmF5OjpJbnNlcnRTcGFjZUF0KG5JbmRleCwgbkNvdW50KTsKLSAgICB9CisgIFRZUEUqIEluc2VydFNwYWNlQXQoaW50IG5JbmRleCwgaW50IG5Db3VudCkgeworICAgIHJldHVybiAoVFlQRSopQ0ZYX0Jhc2ljQXJyYXk6Okluc2VydFNwYWNlQXQobkluZGV4LCBuQ291bnQpOworICB9CiAKLSAgICBjb25zdCBUWVBFCW9wZXJhdG9yW10oaW50IG5JbmRleCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBtX25TaXplKSB7Ci0gICAgICAgICAgICAqKHZvbGF0aWxlIGNoYXIqKTAgPSAnXDAnOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoKGNvbnN0IFRZUEUqKW1fcERhdGEpW25JbmRleF07CisgIGNvbnN0IFRZUEUgb3BlcmF0b3JbXShpbnQgbkluZGV4KSBjb25zdCB7CisgICAgaWYgKG5JbmRleCA8IDAgfHwgbkluZGV4ID49IG1fblNpemUpIHsKKyAgICAgICoodm9sYXRpbGUgY2hhciopMCA9ICdcMCc7CiAgICAgfQorICAgIHJldHVybiAoKGNvbnN0IFRZUEUqKW1fcERhdGEpW25JbmRleF07CisgIH0KIAotICAgIFRZUEUmCQlvcGVyYXRvcltdKGludCBuSW5kZXgpCi0gICAgewotICAgICAgICBpZiAobkluZGV4IDwgMCB8fCBuSW5kZXggPj0gbV9uU2l6ZSkgewotICAgICAgICAgICAgKih2b2xhdGlsZSBjaGFyKikwID0gJ1wwJzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKChUWVBFKiltX3BEYXRhKVtuSW5kZXhdOworICBUWVBFJiBvcGVyYXRvcltdKGludCBuSW5kZXgpIHsKKyAgICBpZiAobkluZGV4IDwgMCB8fCBuSW5kZXggPj0gbV9uU2l6ZSkgeworICAgICAgKih2b2xhdGlsZSBjaGFyKikwID0gJ1wwJzsKICAgICB9CisgICAgcmV0dXJuICgoVFlQRSopbV9wRGF0YSlbbkluZGV4XTsKKyAgfQogCi0gICAgRlhfQk9PTAkJSW5zZXJ0QXQoaW50IG5JbmRleCwgVFlQRSBuZXdFbGVtZW50LCBpbnQgbkNvdW50ID0gMSkKLSAgICB7Ci0gICAgICAgIGlmICghSW5zZXJ0U3BhY2VBdChuSW5kZXgsIG5Db3VudCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAobkNvdW50LS0pIHsKLSAgICAgICAgICAgICgoVFlQRSopbV9wRGF0YSlbbkluZGV4KytdID0gbmV3RWxlbWVudDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgRlhfQk9PTCBJbnNlcnRBdChpbnQgbkluZGV4LCBUWVBFIG5ld0VsZW1lbnQsIGludCBuQ291bnQgPSAxKSB7CisgICAgaWYgKCFJbnNlcnRTcGFjZUF0KG5JbmRleCwgbkNvdW50KSkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KKyAgICB3aGlsZSAobkNvdW50LS0pIHsKKyAgICAgICgoVFlQRSopbV9wRGF0YSlbbkluZGV4KytdID0gbmV3RWxlbWVudDsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CisgIH0KIAotICAgIEZYX0JPT0wJCVJlbW92ZUF0KGludCBuSW5kZXgsIGludCBuQ291bnQgPSAxKQotICAgIHsKLSAgICAgICAgcmV0dXJuIENGWF9CYXNpY0FycmF5OjpSZW1vdmVBdChuSW5kZXgsIG5Db3VudCk7Ci0gICAgfQorICBGWF9CT09MIFJlbW92ZUF0KGludCBuSW5kZXgsIGludCBuQ291bnQgPSAxKSB7CisgICAgcmV0dXJuIENGWF9CYXNpY0FycmF5OjpSZW1vdmVBdChuSW5kZXgsIG5Db3VudCk7CisgIH0KIAotICAgIEZYX0JPT0wJCUluc2VydEF0KGludCBuU3RhcnRJbmRleCwgY29uc3QgQ0ZYX0Jhc2ljQXJyYXkqIHBOZXdBcnJheSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBDRlhfQmFzaWNBcnJheTo6SW5zZXJ0QXQoblN0YXJ0SW5kZXgsIHBOZXdBcnJheSk7Ci0gICAgfQorICBGWF9CT09MIEluc2VydEF0KGludCBuU3RhcnRJbmRleCwgY29uc3QgQ0ZYX0Jhc2ljQXJyYXkqIHBOZXdBcnJheSkgeworICAgIHJldHVybiBDRlhfQmFzaWNBcnJheTo6SW5zZXJ0QXQoblN0YXJ0SW5kZXgsIHBOZXdBcnJheSk7CisgIH0KIAotICAgIGludAkJCUZpbmQoVFlQRSBkYXRhLCBpbnQgaVN0YXJ0ID0gMCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmIChpU3RhcnQgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICg7IGlTdGFydCA8IChpbnQpbV9uU2l6ZTsgaVN0YXJ0ICsrKQotICAgICAgICAgICAgaWYgKCgoVFlQRSopbV9wRGF0YSlbaVN0YXJ0XSA9PSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlTdGFydDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOworICBpbnQgRmluZChUWVBFIGRhdGEsIGludCBpU3RhcnQgPSAwKSBjb25zdCB7CisgICAgaWYgKGlTdGFydCA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKICAgICB9CisgICAgZm9yICg7IGlTdGFydCA8IChpbnQpbV9uU2l6ZTsgaVN0YXJ0KyspCisgICAgICBpZiAoKChUWVBFKiltX3BEYXRhKVtpU3RhcnRdID09IGRhdGEpIHsKKyAgICAgICAgcmV0dXJuIGlTdGFydDsKKyAgICAgIH0KKyAgICByZXR1cm4gLTE7CisgIH0KIH07Ci10eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPEZYX0JZVEU+CQlDRlhfQnl0ZUFycmF5OwotdHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxGWF9XT1JEPgkJQ0ZYX1dvcmRBcnJheTsKLXR5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfRFdPUkQ+CQlDRlhfRFdvcmRBcnJheTsKLXR5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8dm9pZCo+CQlDRlhfUHRyQXJyYXk7Ci10eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPEZYX0ZJTEVTSVpFPglDRlhfRmlsZVNpemVBcnJheTsKLXR5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfRkxPQVQ+CQlDRlhfRmxvYXRBcnJheTsKLXR5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfSU5UMzI+CQlDRlhfSW50MzJBcnJheTsKK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8dWludDhfdD4gQ0ZYX0J5dGVBcnJheTsKK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfV09SRD4gQ0ZYX1dvcmRBcnJheTsKK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfRFdPUkQ+IENGWF9EV29yZEFycmF5OwordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTx2b2lkKj4gQ0ZYX1B0ckFycmF5OwordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxGWF9GSUxFU0laRT4gQ0ZYX0ZpbGVTaXplQXJyYXk7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfRkxPQVQ+IENGWF9GbG9hdEFycmF5OwordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiBDRlhfSW50MzJBcnJheTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKwogdGVtcGxhdGUgPGNsYXNzIE9iamVjdENsYXNzPgotY2xhc3MgQ0ZYX09iamVjdEFycmF5IDogcHVibGljIENGWF9CYXNpY0FycmF5Ci17Ci1wdWJsaWM6Ci0gICAgQ0ZYX09iamVjdEFycmF5KCkgOiBDRlhfQmFzaWNBcnJheShzaXplb2YoT2JqZWN0Q2xhc3MpKSB7fQorY2xhc3MgQ0ZYX09iamVjdEFycmF5IDogcHVibGljIENGWF9CYXNpY0FycmF5IHsKKyBwdWJsaWM6CisgIENGWF9PYmplY3RBcnJheSgpIDogQ0ZYX0Jhc2ljQXJyYXkoc2l6ZW9mKE9iamVjdENsYXNzKSkge30KIAotICAgIH5DRlhfT2JqZWN0QXJyYXkoKQotICAgIHsKLSAgICAgICAgUmVtb3ZlQWxsKCk7Ci0gICAgfQorICB+Q0ZYX09iamVjdEFycmF5KCkgeyBSZW1vdmVBbGwoKTsgfQogCi0gICAgdm9pZAkJCUFkZChjb25zdCBPYmplY3RDbGFzcyYgZGF0YSkKLSAgICB7Ci0gICAgICAgIG5ldyAoKHZvaWQqKUluc2VydFNwYWNlQXQobV9uU2l6ZSwgMSkpIE9iamVjdENsYXNzKGRhdGEpOwotICAgIH0KKyAgdm9pZCBBZGQoY29uc3QgT2JqZWN0Q2xhc3MmIGRhdGEpIHsKKyAgICBuZXcgKCh2b2lkKilJbnNlcnRTcGFjZUF0KG1fblNpemUsIDEpKSBPYmplY3RDbGFzcyhkYXRhKTsKKyAgfQogCi0gICAgT2JqZWN0Q2xhc3MmCUFkZCgpCi0gICAgewotICAgICAgICByZXR1cm4gKihPYmplY3RDbGFzcyopIG5ldyAoKHZvaWQqKUluc2VydFNwYWNlQXQobV9uU2l6ZSwgMSkpIE9iamVjdENsYXNzKCk7Ci0gICAgfQorICBPYmplY3RDbGFzcyYgQWRkKCkgeworICAgIHJldHVybiAqKE9iamVjdENsYXNzKiluZXcgKCh2b2lkKilJbnNlcnRTcGFjZUF0KG1fblNpemUsIDEpKSBPYmplY3RDbGFzcygpOworICB9CiAKLSAgICB2b2lkKgkJCUFkZFNwYWNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBJbnNlcnRTcGFjZUF0KG1fblNpemUsIDEpOwotICAgIH0KKyAgdm9pZCogQWRkU3BhY2UoKSB7IHJldHVybiBJbnNlcnRTcGFjZUF0KG1fblNpemUsIDEpOyB9CiAKLSAgICBGWF9JTlQzMgkJQXBwZW5kKGNvbnN0IENGWF9PYmplY3RBcnJheSYgc3JjLCBGWF9JTlQzMiBuU3RhcnQgPSAwLCBGWF9JTlQzMiBuQ291bnQgPSAtMSkKLSAgICB7Ci0gICAgICAgIGlmIChuQ291bnQgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfSU5UMzIgblNpemUgPSBzcmMuR2V0U2l6ZSgpOwotICAgICAgICBpZiAoIW5TaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBGWFNZU19hc3NlcnQoblN0YXJ0ID4gLTEgJiYgblN0YXJ0IDwgblNpemUpOwotICAgICAgICBpZiAobkNvdW50IDwgMCkgewotICAgICAgICAgICAgbkNvdW50ID0gblNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5TdGFydCArIG5Db3VudCA+IG5TaXplKSB7Ci0gICAgICAgICAgICBuQ291bnQgPSBuU2l6ZSAtIG5TdGFydDsKLSAgICAgICAgfQotICAgICAgICBpZiAobkNvdW50IDwgMSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgblNpemUgPSBtX25TaXplOwotICAgICAgICBJbnNlcnRTcGFjZUF0KG1fblNpemUsIG5Db3VudCk7Ci0gICAgICAgIE9iamVjdENsYXNzKiBwU3RhcnRPYmogPSAoT2JqZWN0Q2xhc3MqKUdldERhdGFQdHIoblNpemUpOwotICAgICAgICBuU2l6ZSA9IG5TdGFydCArIG5Db3VudDsKLSAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gblN0YXJ0OyBpIDwgblNpemU7IGkgKyssIHBTdGFydE9iaisrKSB7Ci0gICAgICAgICAgICBuZXcgKCh2b2lkKilwU3RhcnRPYmopIE9iamVjdENsYXNzKHNyY1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5Db3VudDsKKyAgaW50MzJfdCBBcHBlbmQoY29uc3QgQ0ZYX09iamVjdEFycmF5JiBzcmMsCisgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0ID0gMCwKKyAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQgPSAtMSkgeworICAgIGlmIChuQ291bnQgPT0gMCkgeworICAgICAgcmV0dXJuIDA7CiAgICAgfQorICAgIGludDMyX3QgblNpemUgPSBzcmMuR2V0U2l6ZSgpOworICAgIGlmICghblNpemUpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBGWFNZU19hc3NlcnQoblN0YXJ0ID4gLTEgJiYgblN0YXJ0IDwgblNpemUpOworICAgIGlmIChuQ291bnQgPCAwKSB7CisgICAgICBuQ291bnQgPSBuU2l6ZTsKKyAgICB9CisgICAgaWYgKG5TdGFydCArIG5Db3VudCA+IG5TaXplKSB7CisgICAgICBuQ291bnQgPSBuU2l6ZSAtIG5TdGFydDsKKyAgICB9CisgICAgaWYgKG5Db3VudCA8IDEpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBuU2l6ZSA9IG1fblNpemU7CisgICAgSW5zZXJ0U3BhY2VBdChtX25TaXplLCBuQ291bnQpOworICAgIE9iamVjdENsYXNzKiBwU3RhcnRPYmogPSAoT2JqZWN0Q2xhc3MqKUdldERhdGFQdHIoblNpemUpOworICAgIG5TaXplID0gblN0YXJ0ICsgbkNvdW50OworICAgIGZvciAoaW50MzJfdCBpID0gblN0YXJ0OyBpIDwgblNpemU7IGkrKywgcFN0YXJ0T2JqKyspIHsKKyAgICAgIG5ldyAoKHZvaWQqKXBTdGFydE9iaikgT2JqZWN0Q2xhc3Moc3JjW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIG5Db3VudDsKKyAgfQogCi0gICAgRlhfSU5UMzIJCUNvcHkoY29uc3QgQ0ZYX09iamVjdEFycmF5JiBzcmMsIEZYX0lOVDMyIG5TdGFydCA9IDAsIEZYX0lOVDMyIG5Db3VudCA9IC0xKQotICAgIHsKLSAgICAgICAgaWYgKG5Db3VudCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBGWF9JTlQzMiBuU2l6ZSA9IHNyYy5HZXRTaXplKCk7Ci0gICAgICAgIGlmICghblNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIEZYU1lTX2Fzc2VydChuU3RhcnQgPiAtMSAmJiBuU3RhcnQgPCBuU2l6ZSk7Ci0gICAgICAgIGlmIChuQ291bnQgPCAwKSB7Ci0gICAgICAgICAgICBuQ291bnQgPSBuU2l6ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoblN0YXJ0ICsgbkNvdW50ID4gblNpemUpIHsKLSAgICAgICAgICAgIG5Db3VudCA9IG5TaXplIC0gblN0YXJ0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChuQ291bnQgPCAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBSZW1vdmVBbGwoKTsKLSAgICAgICAgU2V0U2l6ZShuQ291bnQpOwotICAgICAgICBPYmplY3RDbGFzcyogcFN0YXJ0T2JqID0gKE9iamVjdENsYXNzKiltX3BEYXRhOwotICAgICAgICBuU2l6ZSA9IG5TdGFydCArIG5Db3VudDsKLSAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gblN0YXJ0OyBpIDwgblNpemU7IGkgKyssIHBTdGFydE9iaisrKSB7Ci0gICAgICAgICAgICBuZXcgKCh2b2lkKilwU3RhcnRPYmopIE9iamVjdENsYXNzKHNyY1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5Db3VudDsKKyAgaW50MzJfdCBDb3B5KGNvbnN0IENGWF9PYmplY3RBcnJheSYgc3JjLAorICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnQgPSAwLAorICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQgPSAtMSkgeworICAgIGlmIChuQ291bnQgPT0gMCkgeworICAgICAgcmV0dXJuIDA7CiAgICAgfQorICAgIGludDMyX3QgblNpemUgPSBzcmMuR2V0U2l6ZSgpOworICAgIGlmICghblNpemUpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBGWFNZU19hc3NlcnQoblN0YXJ0ID4gLTEgJiYgblN0YXJ0IDwgblNpemUpOworICAgIGlmIChuQ291bnQgPCAwKSB7CisgICAgICBuQ291bnQgPSBuU2l6ZTsKKyAgICB9CisgICAgaWYgKG5TdGFydCArIG5Db3VudCA+IG5TaXplKSB7CisgICAgICBuQ291bnQgPSBuU2l6ZSAtIG5TdGFydDsKKyAgICB9CisgICAgaWYgKG5Db3VudCA8IDEpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBSZW1vdmVBbGwoKTsKKyAgICBTZXRTaXplKG5Db3VudCk7CisgICAgT2JqZWN0Q2xhc3MqIHBTdGFydE9iaiA9IChPYmplY3RDbGFzcyopbV9wRGF0YTsKKyAgICBuU2l6ZSA9IG5TdGFydCArIG5Db3VudDsKKyAgICBmb3IgKGludDMyX3QgaSA9IG5TdGFydDsgaSA8IG5TaXplOyBpKyssIHBTdGFydE9iaisrKSB7CisgICAgICBuZXcgKCh2b2lkKilwU3RhcnRPYmopIE9iamVjdENsYXNzKHNyY1tpXSk7CisgICAgfQorICAgIHJldHVybiBuQ291bnQ7CisgIH0KIAotICAgIGludAkJCQlHZXRTaXplKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX25TaXplOwotICAgIH0KKyAgaW50IEdldFNpemUoKSBjb25zdCB7IHJldHVybiBtX25TaXplOyB9CiAKLSAgICBPYmplY3RDbGFzcyYJb3BlcmF0b3JbXSAoaW50IGluZGV4KSBjb25zdAotICAgIHsKLSAgICAgICAgRlhTWVNfYXNzZXJ0KGluZGV4IDwgbV9uU2l6ZSk7Ci0gICAgICAgIHJldHVybiAqKE9iamVjdENsYXNzKilDRlhfQmFzaWNBcnJheTo6R2V0RGF0YVB0cihpbmRleCk7Ci0gICAgfQorICBPYmplY3RDbGFzcyYgb3BlcmF0b3JbXShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgICBGWFNZU19hc3NlcnQoaW5kZXggPCBtX25TaXplKTsKKyAgICByZXR1cm4gKihPYmplY3RDbGFzcyopQ0ZYX0Jhc2ljQXJyYXk6OkdldERhdGFQdHIoaW5kZXgpOworICB9CiAKLSAgICBPYmplY3RDbGFzcyoJR2V0RGF0YVB0cihpbnQgaW5kZXgpCi0gICAgewotICAgICAgICByZXR1cm4gKE9iamVjdENsYXNzKilDRlhfQmFzaWNBcnJheTo6R2V0RGF0YVB0cihpbmRleCk7Ci0gICAgfQorICBPYmplY3RDbGFzcyogR2V0RGF0YVB0cihpbnQgaW5kZXgpIHsKKyAgICByZXR1cm4gKE9iamVjdENsYXNzKilDRlhfQmFzaWNBcnJheTo6R2V0RGF0YVB0cihpbmRleCk7CisgIH0KIAotICAgIHZvaWQJCQlSZW1vdmVBdChpbnQgaW5kZXgpCi0gICAgewotICAgICAgICBGWFNZU19hc3NlcnQoaW5kZXggPCBtX25TaXplKTsKLSAgICAgICAgKChPYmplY3RDbGFzcyopR2V0RGF0YVB0cihpbmRleCkpLT5+T2JqZWN0Q2xhc3MoKTsKLSAgICAgICAgQ0ZYX0Jhc2ljQXJyYXk6OlJlbW92ZUF0KGluZGV4LCAxKTsKLSAgICB9CisgIHZvaWQgUmVtb3ZlQXQoaW50IGluZGV4KSB7CisgICAgRlhTWVNfYXNzZXJ0KGluZGV4IDwgbV9uU2l6ZSk7CisgICAgKChPYmplY3RDbGFzcyopR2V0RGF0YVB0cihpbmRleCkpLT5+T2JqZWN0Q2xhc3MoKTsKKyAgICBDRlhfQmFzaWNBcnJheTo6UmVtb3ZlQXQoaW5kZXgsIDEpOworICB9CiAKLSAgICB2b2lkCQkJUmVtb3ZlQWxsKCkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uU2l6ZTsgaSArKykgewotICAgICAgICAgICAgKChPYmplY3RDbGFzcyopR2V0RGF0YVB0cihpKSktPn5PYmplY3RDbGFzcygpOwotICAgICAgICB9Ci0gICAgICAgIENGWF9CYXNpY0FycmF5OjpTZXRTaXplKDApOworICB2b2lkIFJlbW92ZUFsbCgpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fblNpemU7IGkrKykgeworICAgICAgKChPYmplY3RDbGFzcyopR2V0RGF0YVB0cihpKSktPn5PYmplY3RDbGFzcygpOwogICAgIH0KKyAgICBDRlhfQmFzaWNBcnJheTo6U2V0U2l6ZSgwKTsKKyAgfQogfTsKIHR5cGVkZWYgQ0ZYX09iamVjdEFycmF5PENGWF9CeXRlU3RyaW5nPiBDRlhfQnl0ZVN0cmluZ0FycmF5OwogdHlwZWRlZiBDRlhfT2JqZWN0QXJyYXk8Q0ZYX1dpZGVTdHJpbmc+IENGWF9XaWRlU3RyaW5nQXJyYXk7Ci1jbGFzcyBDRlhfQmFzZVNlZ21lbnRlZEFycmF5IAotewotcHVibGljOgotICAgIENGWF9CYXNlU2VnbWVudGVkQXJyYXkoaW50IHVuaXRfc2l6ZSA9IDEsIGludCBzZWdtZW50X3VuaXRzID0gNTEyLCBpbnQgaW5kZXhfc2l6ZSA9IDgpOworY2xhc3MgQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheSB7CisgcHVibGljOgorICBDRlhfQmFzZVNlZ21lbnRlZEFycmF5KGludCB1bml0X3NpemUgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWdtZW50X3VuaXRzID0gNTEyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleF9zaXplID0gOCk7CiAKLSAgICB+Q0ZYX0Jhc2VTZWdtZW50ZWRBcnJheSgpOworICB+Q0ZYX0Jhc2VTZWdtZW50ZWRBcnJheSgpOwogCi0gICAgdm9pZAlTZXRVbml0U2l6ZShpbnQgdW5pdF9zaXplLCBpbnQgc2VnbWVudF91bml0cywgaW50IGluZGV4X3NpemUgPSA4KTsKKyAgdm9pZCBTZXRVbml0U2l6ZShpbnQgdW5pdF9zaXplLCBpbnQgc2VnbWVudF91bml0cywgaW50IGluZGV4X3NpemUgPSA4KTsKIAotICAgIHZvaWQqCUFkZCgpOworICB2b2lkKiBBZGQoKTsKIAotICAgIHZvaWQqCUdldEF0KGludCBpbmRleCkgY29uc3Q7CisgIHZvaWQqIEdldEF0KGludCBpbmRleCkgY29uc3Q7CiAKLSAgICB2b2lkCVJlbW92ZUFsbCgpOworICB2b2lkIFJlbW92ZUFsbCgpOwogCi0gICAgdm9pZAlEZWxldGUoaW50IGluZGV4LCBpbnQgY291bnQgPSAxKTsKKyAgdm9pZCBEZWxldGUoaW50IGluZGV4LCBpbnQgY291bnQgPSAxKTsKIAotICAgIGludAkJR2V0U2l6ZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9EYXRhU2l6ZTsKLSAgICB9CisgIGludCBHZXRTaXplKCkgY29uc3QgeyByZXR1cm4gbV9EYXRhU2l6ZTsgfQogCi0gICAgaW50CQlHZXRTZWdtZW50U2l6ZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9TZWdtZW50U2l6ZTsKLSAgICB9CisgIGludCBHZXRTZWdtZW50U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fU2VnbWVudFNpemU7IH0KIAotICAgIGludAkJR2V0VW5pdFNpemUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fVW5pdFNpemU7Ci0gICAgfQorICBpbnQgR2V0VW5pdFNpemUoKSBjb25zdCB7IHJldHVybiBtX1VuaXRTaXplOyB9CiAKLSAgICB2b2lkKglJdGVyYXRlKEZYX0JPT0wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKSwgdm9pZCogcGFyYW0pIGNvbnN0OwotcHJpdmF0ZToKKyAgdm9pZCogSXRlcmF0ZShGWF9CT09MICgqY2FsbGJhY2spKHZvaWQqIHBhcmFtLCB2b2lkKiBwRGF0YSksCisgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0pIGNvbnN0OwogCi0gICAgaW50CQkJCW1fVW5pdFNpemU7CisgcHJpdmF0ZToKKyAgaW50IG1fVW5pdFNpemU7CiAKLSAgICBzaG9ydAkJCW1fU2VnbWVudFNpemU7CisgIHNob3J0IG1fU2VnbWVudFNpemU7CiAKLSAgICBGWF9CWVRFCQkJbV9JbmRleFNpemU7CisgIHVpbnQ4X3QgbV9JbmRleFNpemU7CiAKLSAgICBGWF9CWVRFCQkJbV9JbmRleERlcHRoOworICB1aW50OF90IG1fSW5kZXhEZXB0aDsKIAotICAgIGludAkJCQltX0RhdGFTaXplOworICBpbnQgbV9EYXRhU2l6ZTsKIAotICAgIHZvaWQqCQkJbV9wSW5kZXg7Ci0gICAgdm9pZCoqCUdldEluZGV4KGludCBzZWdfaW5kZXgpIGNvbnN0OwotICAgIHZvaWQqCUl0ZXJhdGVJbmRleChpbnQgbGV2ZWwsIGludCYgc3RhcnQsIHZvaWQqKiBwSW5kZXgsIEZYX0JPT0wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKSwgdm9pZCogcGFyYW0pIGNvbnN0OwotICAgIHZvaWQqCUl0ZXJhdGVTZWdtZW50KEZYX0xQQ0JZVEUgcFNlZ21lbnQsIGludCBjb3VudCwgRlhfQk9PTCAoKmNhbGxiYWNrKSh2b2lkKiBwYXJhbSwgdm9pZCogcERhdGEpLCB2b2lkKiBwYXJhbSkgY29uc3Q7CisgIHZvaWQqIG1fcEluZGV4OworICB2b2lkKiogR2V0SW5kZXgoaW50IHNlZ19pbmRleCkgY29uc3Q7CisgIHZvaWQqIEl0ZXJhdGVJbmRleChpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICBpbnQmIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIHBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtKSBjb25zdDsKKyAgdm9pZCogSXRlcmF0ZVNlZ21lbnQoY29uc3QgdWludDhfdCogcFNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCAoKmNhbGxiYWNrKSh2b2lkKiBwYXJhbSwgdm9pZCogcERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSkgY29uc3Q7CiB9OwogdGVtcGxhdGUgPGNsYXNzIEVsZW1lbnRUeXBlPgotY2xhc3MgQ0ZYX1NlZ21lbnRlZEFycmF5IDogcHVibGljIENGWF9CYXNlU2VnbWVudGVkQXJyYXkKLXsKLXB1YmxpYzoKLSAgICBDRlhfU2VnbWVudGVkQXJyYXkoaW50IHNlZ21lbnRfdW5pdHMsIGludCBpbmRleF9zaXplID0gOCkKLSAgICAgICAgOiBDRlhfQmFzZVNlZ21lbnRlZEFycmF5KHNpemVvZihFbGVtZW50VHlwZSksIHNlZ21lbnRfdW5pdHMsIGluZGV4X3NpemUpCi0gICAge30KK2NsYXNzIENGWF9TZWdtZW50ZWRBcnJheSA6IHB1YmxpYyBDRlhfQmFzZVNlZ21lbnRlZEFycmF5IHsKKyBwdWJsaWM6CisgIENGWF9TZWdtZW50ZWRBcnJheShpbnQgc2VnbWVudF91bml0cywgaW50IGluZGV4X3NpemUgPSA4KQorICAgICAgOiBDRlhfQmFzZVNlZ21lbnRlZEFycmF5KHNpemVvZihFbGVtZW50VHlwZSksIHNlZ21lbnRfdW5pdHMsIGluZGV4X3NpemUpIHsKKyAgfQogCi0gICAgdm9pZAlBZGQoRWxlbWVudFR5cGUgZGF0YSkKLSAgICB7Ci0gICAgICAgICooRWxlbWVudFR5cGUqKUNGWF9CYXNlU2VnbWVudGVkQXJyYXk6OkFkZCgpID0gZGF0YTsKLSAgICB9CisgIHZvaWQgQWRkKEVsZW1lbnRUeXBlIGRhdGEpIHsKKyAgICAqKEVsZW1lbnRUeXBlKilDRlhfQmFzZVNlZ21lbnRlZEFycmF5OjpBZGQoKSA9IGRhdGE7CisgIH0KIAotICAgIEVsZW1lbnRUeXBlJiBvcGVyYXRvciBbXSAoaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgcmV0dXJuICooRWxlbWVudFR5cGUqKUNGWF9CYXNlU2VnbWVudGVkQXJyYXk6OkdldEF0KGluZGV4KTsKLSAgICB9CisgIEVsZW1lbnRUeXBlJiBvcGVyYXRvcltdKGludCBpbmRleCkgeworICAgIHJldHVybiAqKEVsZW1lbnRUeXBlKilDRlhfQmFzZVNlZ21lbnRlZEFycmF5OjpHZXRBdChpbmRleCk7CisgIH0KIH07CiB0ZW1wbGF0ZSA8Y2xhc3MgRGF0YVR5cGUsIGludCBGaXhlZFNpemU+Ci1jbGFzcyBDRlhfRml4ZWRCdWZHcm93IAotewotcHVibGljOgotICAgIENGWF9GaXhlZEJ1Zkdyb3coKSA6IG1fcERhdGEoTlVMTCkKLSAgICB7fQotICAgIENGWF9GaXhlZEJ1Zkdyb3coaW50IGRhdGFfc2l6ZSkgOiBtX3BEYXRhKE5VTEwpCi0gICAgewotICAgICAgICBpZiAoZGF0YV9zaXplID4gRml4ZWRTaXplKSB7Ci0gICAgICAgICAgICBtX3BEYXRhID0gRlhfQWxsb2MoRGF0YVR5cGUsIGRhdGFfc2l6ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1zZXQzMihtX0RhdGEsIDAsIHNpemVvZihEYXRhVHlwZSkqRml4ZWRTaXplKTsKLSAgICAgICAgfQorY2xhc3MgQ0ZYX0ZpeGVkQnVmR3JvdyB7CisgcHVibGljOgorICBDRlhfRml4ZWRCdWZHcm93KCkgOiBtX3BEYXRhKE5VTEwpIHt9CisgIENGWF9GaXhlZEJ1Zkdyb3coaW50IGRhdGFfc2l6ZSkgOiBtX3BEYXRhKE5VTEwpIHsKKyAgICBpZiAoZGF0YV9zaXplID4gRml4ZWRTaXplKSB7CisgICAgICBtX3BEYXRhID0gRlhfQWxsb2MoRGF0YVR5cGUsIGRhdGFfc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZYU1lTX21lbXNldChtX0RhdGEsIDAsIHNpemVvZihEYXRhVHlwZSkgKiBGaXhlZFNpemUpOwogICAgIH0KLSAgICB2b2lkIFNldERhdGFTaXplKGludCBkYXRhX3NpemUpCi0gICAgewotICAgICAgICBpZiAobV9wRGF0YSkgewotICAgICAgICAgICAgRlhfRnJlZShtX3BEYXRhKTsKLSAgICAgICAgfQotICAgICAgICBtX3BEYXRhID0gTlVMTDsKLSAgICAgICAgaWYgKGRhdGFfc2l6ZSA+IEZpeGVkU2l6ZSkgewotICAgICAgICAgICAgbV9wRGF0YSA9IEZYX0FsbG9jKERhdGFUeXBlLCBkYXRhX3NpemUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRlhTWVNfbWVtc2V0MzIobV9EYXRhLCAwLCBzaXplb2YoRGF0YVR5cGUpKkZpeGVkU2l6ZSk7Ci0gICAgICAgIH0KKyAgfQorICB2b2lkIFNldERhdGFTaXplKGludCBkYXRhX3NpemUpIHsKKyAgICBGWF9GcmVlKG1fcERhdGEpOworICAgIG1fcERhdGEgPSBOVUxMOworICAgIGlmIChkYXRhX3NpemUgPiBGaXhlZFNpemUpIHsKKyAgICAgIG1fcERhdGEgPSBGWF9BbGxvYyhEYXRhVHlwZSwgZGF0YV9zaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgRlhTWVNfbWVtc2V0KG1fRGF0YSwgMCwgc2l6ZW9mKERhdGFUeXBlKSAqIEZpeGVkU2l6ZSk7CiAgICAgfQotICAgIH5DRlhfRml4ZWRCdWZHcm93KCkKLSAgICB7Ci0gICAgICAgIGlmIChtX3BEYXRhKSB7Ci0gICAgICAgICAgICBGWF9GcmVlKG1fcERhdGEpOwotICAgICAgICB9Ci0gICAgfQotICAgIG9wZXJhdG9yIERhdGFUeXBlKigpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wRGF0YSA/IG1fcERhdGEgOiBtX0RhdGE7Ci0gICAgfQotcHJpdmF0ZToKLSAgICBEYXRhVHlwZQkJbV9EYXRhW0ZpeGVkU2l6ZV07Ci0gICAgRGF0YVR5cGUqCQltX3BEYXRhOworICB9CisgIH5DRlhfRml4ZWRCdWZHcm93KCkgeyBGWF9GcmVlKG1fcERhdGEpOyB9CisgIG9wZXJhdG9yIERhdGFUeXBlKigpIHsgcmV0dXJuIG1fcERhdGEgPyBtX3BEYXRhIDogbV9EYXRhOyB9CisKKyBwcml2YXRlOgorICBEYXRhVHlwZSBtX0RhdGFbRml4ZWRTaXplXTsKKyAgRGF0YVR5cGUqIG1fcERhdGE7CiB9OwotY2xhc3MgQ0ZYX01hcFB0clRvUHRyIAotewotcHJvdGVjdGVkOgorY2xhc3MgQ0ZYX01hcFB0clRvUHRyIHsKKyBwcm90ZWN0ZWQ6CisgIHN0cnVjdCBDQXNzb2MgeworICAgIENBc3NvYyogcE5leHQ7CiAKLSAgICBzdHJ1Y3QgQ0Fzc29jIHsKKyAgICB2b2lkKiBrZXk7CiAKLSAgICAgICAgQ0Fzc29jKiBwTmV4dDsKKyAgICB2b2lkKiB2YWx1ZTsKKyAgfTsKIAotICAgICAgICB2b2lkKiBrZXk7CisgcHVibGljOgorICBDRlhfTWFwUHRyVG9QdHIoaW50IG5CbG9ja1NpemUgPSAxMCk7CiAKLSAgICAgICAgdm9pZCogdmFsdWU7Ci0gICAgfTsKLXB1YmxpYzoKLSAgICBDRlhfTWFwUHRyVG9QdHIoaW50IG5CbG9ja1NpemUgPSAxMCk7CisgIH5DRlhfTWFwUHRyVG9QdHIoKTsKIAotICAgIH5DRlhfTWFwUHRyVG9QdHIoKTsKKyAgaW50IEdldENvdW50KCkgY29uc3QgeyByZXR1cm4gbV9uQ291bnQ7IH0KIAotICAgIGludCBHZXRDb3VudCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9uQ291bnQ7Ci0gICAgfQorICBGWF9CT09MIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX25Db3VudCA9PSAwOyB9CiAKLSAgICBGWF9CT09MIElzRW1wdHkoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbkNvdW50ID09IDA7Ci0gICAgfQorICBGWF9CT09MIExvb2t1cCh2b2lkKiBrZXksIHZvaWQqJiByVmFsdWUpIGNvbnN0OwogCi0gICAgRlhfQk9PTCBMb29rdXAodm9pZCoga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdDsKKyAgdm9pZCogR2V0VmFsdWVBdCh2b2lkKiBrZXkpIGNvbnN0OwogCi0gICAgdm9pZCogR2V0VmFsdWVBdCh2b2lkKiBrZXkpIGNvbnN0OworICB2b2lkKiYgb3BlcmF0b3JbXSh2b2lkKiBrZXkpOwogCi0gICAgdm9pZComIG9wZXJhdG9yW10odm9pZCoga2V5KTsKKyAgdm9pZCBTZXRBdCh2b2lkKiBrZXksIHZvaWQqIG5ld1ZhbHVlKSB7ICgqdGhpcylba2V5XSA9IG5ld1ZhbHVlOyB9CiAKLSAgICB2b2lkIFNldEF0KHZvaWQqIGtleSwgdm9pZCogbmV3VmFsdWUpCi0gICAgewotICAgICAgICAoKnRoaXMpW2tleV0gPSBuZXdWYWx1ZTsKLSAgICB9CisgIEZYX0JPT0wgUmVtb3ZlS2V5KHZvaWQqIGtleSk7CiAKLSAgICBGWF9CT09MIFJlbW92ZUtleSh2b2lkKiBrZXkpOworICB2b2lkIFJlbW92ZUFsbCgpOwogCi0gICAgdm9pZCBSZW1vdmVBbGwoKTsKKyAgRlhfUE9TSVRJT04gR2V0U3RhcnRQb3NpdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gKG1fbkNvdW50ID09IDApID8gTlVMTCA6IChGWF9QT1NJVElPTiktMTsKKyAgfQogCi0gICAgRlhfUE9TSVRJT04gR2V0U3RhcnRQb3NpdGlvbigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gKG1fbkNvdW50ID09IDApID8gTlVMTCA6IChGWF9QT1NJVElPTikgLSAxOwotICAgIH0KKyAgdm9pZCBHZXROZXh0QXNzb2MoRlhfUE9TSVRJT04mIHJOZXh0UG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgIHZvaWQqJiByS2V5LAorICAgICAgICAgICAgICAgICAgICB2b2lkKiYgclZhbHVlKSBjb25zdDsKIAotICAgIHZvaWQgR2V0TmV4dEFzc29jKEZYX1BPU0lUSU9OJiByTmV4dFBvc2l0aW9uLCB2b2lkKiYgcktleSwgdm9pZComIHJWYWx1ZSkgY29uc3Q7CisgIEZYX0RXT1JEIEdldEhhc2hUYWJsZVNpemUoKSBjb25zdCB7IHJldHVybiBtX25IYXNoVGFibGVTaXplOyB9CiAKLSAgICBGWF9EV09SRCBHZXRIYXNoVGFibGVTaXplKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX25IYXNoVGFibGVTaXplOwotICAgIH0KKyAgdm9pZCBJbml0SGFzaFRhYmxlKEZYX0RXT1JEIGhhc2hTaXplLCBGWF9CT09MIGJBbGxvY05vdyA9IFRSVUUpOwogCi0gICAgdm9pZCBJbml0SGFzaFRhYmxlKEZYX0RXT1JEIGhhc2hTaXplLCBGWF9CT09MIGJBbGxvY05vdyA9IFRSVUUpOwotcHJvdGVjdGVkOgorIHByb3RlY3RlZDoKKyAgQ0Fzc29jKiogbV9wSGFzaFRhYmxlOwogCi0gICAgQ0Fzc29jKiogbV9wSGFzaFRhYmxlOworICBGWF9EV09SRCBtX25IYXNoVGFibGVTaXplOwogCi0gICAgRlhfRFdPUkQgbV9uSGFzaFRhYmxlU2l6ZTsKKyAgaW50IG1fbkNvdW50OwogCi0gICAgaW50IG1fbkNvdW50OworICBDQXNzb2MqIG1fcEZyZWVMaXN0OwogCi0gICAgQ0Fzc29jKiBtX3BGcmVlTGlzdDsKKyAgc3RydWN0IENGWF9QbGV4KiBtX3BCbG9ja3M7CiAKLSAgICBzdHJ1Y3QgQ0ZYX1BsZXgqIG1fcEJsb2NrczsKKyAgaW50IG1fbkJsb2NrU2l6ZTsKIAotICAgIGludCBtX25CbG9ja1NpemU7CisgIEZYX0RXT1JEIEhhc2hLZXkodm9pZCoga2V5KSBjb25zdDsKIAotICAgIEZYX0RXT1JEIEhhc2hLZXkodm9pZCoga2V5KSBjb25zdDsKKyAgQ0Fzc29jKiBOZXdBc3NvYygpOwogCi0gICAgQ0Fzc29jKiBOZXdBc3NvYygpOworICB2b2lkIEZyZWVBc3NvYyhDQXNzb2MqIHBBc3NvYyk7CiAKLSAgICB2b2lkIEZyZWVBc3NvYyhDQXNzb2MqIHBBc3NvYyk7Ci0KLSAgICBDQXNzb2MqIEdldEFzc29jQXQodm9pZCoga2V5LCBGWF9EV09SRCYgaGFzaCkgY29uc3Q7CisgIENBc3NvYyogR2V0QXNzb2NBdCh2b2lkKiBrZXksIEZYX0RXT1JEJiBoYXNoKSBjb25zdDsKIH07CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKIHRlbXBsYXRlIDxjbGFzcyBLZXlUeXBlLCBjbGFzcyBWYWx1ZVR5cGU+Ci1jbGFzcyBDRlhfTWFwUHRyVGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX01hcFB0clRvUHRyCi17Ci1wdWJsaWM6Ci0gICAgQ0ZYX01hcFB0clRlbXBsYXRlKCkgOiBDRlhfTWFwUHRyVG9QdHIoMTApIHt9CitjbGFzcyBDRlhfTWFwUHRyVGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX01hcFB0clRvUHRyIHsKKyBwdWJsaWM6CisgIENGWF9NYXBQdHJUZW1wbGF0ZSgpIDogQ0ZYX01hcFB0clRvUHRyKDEwKSB7fQogCi0gICAgRlhfQk9PTAlMb29rdXAoS2V5VHlwZSBrZXksIFZhbHVlVHlwZSYgclZhbHVlKSBjb25zdAotICAgIHsKLSAgICAgICAgRlhfTFBWT0lEIHBWYWx1ZSA9IE5VTEw7Ci0gICAgICAgIGlmICghQ0ZYX01hcFB0clRvUHRyOjpMb29rdXAoKHZvaWQqKShGWF9VSU5UUFRSKWtleSwgcFZhbHVlKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIHJWYWx1ZSA9IChWYWx1ZVR5cGUpKEZYX1VJTlRQVFIpcFZhbHVlOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgRlhfQk9PTCBMb29rdXAoS2V5VHlwZSBrZXksIFZhbHVlVHlwZSYgclZhbHVlKSBjb25zdCB7CisgICAgdm9pZCogcFZhbHVlID0gTlVMTDsKKyAgICBpZiAoIUNGWF9NYXBQdHJUb1B0cjo6TG9va3VwKCh2b2lkKikodWludHB0cl90KWtleSwgcFZhbHVlKSkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KKyAgICByVmFsdWUgPSAoVmFsdWVUeXBlKSh1aW50cHRyX3QpcFZhbHVlOworICAgIHJldHVybiBUUlVFOworICB9CiAKLSAgICBWYWx1ZVR5cGUmIG9wZXJhdG9yW10oS2V5VHlwZSBrZXkpCi0gICAgewotICAgICAgICByZXR1cm4gKFZhbHVlVHlwZSYpQ0ZYX01hcFB0clRvUHRyOjpvcGVyYXRvciBbXSgodm9pZCopKEZYX1VJTlRQVFIpa2V5KTsKLSAgICB9CisgIFZhbHVlVHlwZSYgb3BlcmF0b3JbXShLZXlUeXBlIGtleSkgeworICAgIHJldHVybiAoVmFsdWVUeXBlJilDRlhfTWFwUHRyVG9QdHI6Om9wZXJhdG9yW10oKHZvaWQqKSh1aW50cHRyX3Qpa2V5KTsKKyAgfQogCi0gICAgdm9pZCBTZXRBdChLZXlUeXBlIGtleSwgVmFsdWVUeXBlIG5ld1ZhbHVlKQotICAgIHsKLSAgICAgICAgQ0ZYX01hcFB0clRvUHRyOjpTZXRBdCgodm9pZCopKEZYX1VJTlRQVFIpa2V5LCAodm9pZCopKEZYX1VJTlRQVFIpbmV3VmFsdWUpOwotICAgIH0KKyAgdm9pZCBTZXRBdChLZXlUeXBlIGtleSwgVmFsdWVUeXBlIG5ld1ZhbHVlKSB7CisgICAgQ0ZYX01hcFB0clRvUHRyOjpTZXRBdCgodm9pZCopKHVpbnRwdHJfdClrZXksICh2b2lkKikodWludHB0cl90KW5ld1ZhbHVlKTsKKyAgfQogCi0gICAgRlhfQk9PTAlSZW1vdmVLZXkoS2V5VHlwZSBrZXkpCi0gICAgewotICAgICAgICByZXR1cm4gQ0ZYX01hcFB0clRvUHRyOjpSZW1vdmVLZXkoKHZvaWQqKShGWF9VSU5UUFRSKWtleSk7Ci0gICAgfQorICBGWF9CT09MIFJlbW92ZUtleShLZXlUeXBlIGtleSkgeworICAgIHJldHVybiBDRlhfTWFwUHRyVG9QdHI6OlJlbW92ZUtleSgodm9pZCopKHVpbnRwdHJfdClrZXkpOworICB9CiAKLSAgICB2b2lkIEdldE5leHRBc3NvYyhGWF9QT1NJVElPTiYgck5leHRQb3NpdGlvbiwgS2V5VHlwZSYgcktleSwgVmFsdWVUeXBlJiByVmFsdWUpIGNvbnN0Ci0gICAgewotICAgICAgICB2b2lkKiBwS2V5ID0gTlVMTDsKLSAgICAgICAgdm9pZCogcFZhbHVlID0gTlVMTDsKLSAgICAgICAgQ0ZYX01hcFB0clRvUHRyOjpHZXROZXh0QXNzb2Mock5leHRQb3NpdGlvbiwgcEtleSwgcFZhbHVlKTsKLSAgICAgICAgcktleSA9IChLZXlUeXBlKShGWF9VSU5UUFRSKXBLZXk7Ci0gICAgICAgIHJWYWx1ZSA9IChWYWx1ZVR5cGUpKEZYX1VJTlRQVFIpcFZhbHVlOwotICAgIH0KKyAgdm9pZCBHZXROZXh0QXNzb2MoRlhfUE9TSVRJT04mIHJOZXh0UG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgIEtleVR5cGUmIHJLZXksCisgICAgICAgICAgICAgICAgICAgIFZhbHVlVHlwZSYgclZhbHVlKSBjb25zdCB7CisgICAgdm9pZCogcEtleSA9IE5VTEw7CisgICAgdm9pZCogcFZhbHVlID0gTlVMTDsKKyAgICBDRlhfTWFwUHRyVG9QdHI6OkdldE5leHRBc3NvYyhyTmV4dFBvc2l0aW9uLCBwS2V5LCBwVmFsdWUpOworICAgIHJLZXkgPSAoS2V5VHlwZSkodWludHB0cl90KXBLZXk7CisgICAgclZhbHVlID0gKFZhbHVlVHlwZSkodWludHB0cl90KXBWYWx1ZTsKKyAgfQogfTsKLWNsYXNzIENGWF9DTWFwRFdvcmRUb0RXb3JkIAotewotcHVibGljOgorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorY2xhc3MgQ0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHIgeworIHB1YmxpYzoKKyAgQ0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHIoKTsKIAotICAgIEZYX0JPT0wJCQlMb29rdXAoRlhfRFdPUkQga2V5LCBGWF9EV09SRCYgdmFsdWUpIGNvbnN0OworICB+Q0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHIoKTsKIAotICAgIHZvaWQJCQlTZXRBdChGWF9EV09SRCBrZXksIEZYX0RXT1JEIHZhbHVlKTsKKyAgdm9pZCBSZW1vdmVBbGwoKTsKIAotICAgIHZvaWQJCQlFc3RpbWF0ZVNpemUoRlhfRFdPUkQgc2l6ZSwgRlhfRFdPUkQgZ3Jvd19ieSk7CisgIEZYX1BPU0lUSU9OIEdldFN0YXJ0UG9zaXRpb24oKSBjb25zdDsKIAotICAgIEZYX1BPU0lUSU9OCQlHZXRTdGFydFBvc2l0aW9uKCkgY29uc3Q7CisgIHZvaWQgR2V0TmV4dEFzc29jKEZYX1BPU0lUSU9OJiByTmV4dFBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgcktleSwKKyAgICAgICAgICAgICAgICAgICAgdm9pZComIHJWYWx1ZSkgY29uc3Q7CiAKLSAgICB2b2lkCQkJR2V0TmV4dEFzc29jKEZYX1BPU0lUSU9OJiBwb3MsIEZYX0RXT1JEJiBrZXksIEZYX0RXT1JEJiB2YWx1ZSkgY29uc3Q7Ci1wcm90ZWN0ZWQ6CisgIHZvaWQqIEdldE5leHRWYWx1ZShGWF9QT1NJVElPTiYgck5leHRQb3NpdGlvbikgY29uc3Q7CiAKLSAgICBDRlhfQmluYXJ5QnVmCW1fQnVmZmVyOworICBGWF9CT09MIExvb2t1cChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgdm9pZComIHJWYWx1ZSkgY29uc3Q7CisKKyAgdm9pZCBTZXRBdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgdm9pZCogdmFsdWUpOworCisgIHZvaWQgUmVtb3ZlS2V5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KTsKKworICBpbnQgR2V0Q291bnQoKSBjb25zdDsKKworICB2b2lkIEFkZFZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LCB2b2lkKiBwVmFsdWUpOworCisgcHJpdmF0ZToKKyAgQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheSBtX0J1ZmZlcjsKIH07Ci1jbGFzcyBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyIAotewotcHJvdGVjdGVkOgorY2xhc3MgQ0ZYX1B0ckxpc3QgeworIHByb3RlY3RlZDoKKyAgc3RydWN0IENOb2RlIHsKKyAgICBDTm9kZSogcE5leHQ7CiAKLSAgICBzdHJ1Y3QgQ0Fzc29jIHsKKyAgICBDTm9kZSogcFByZXY7CiAKLSAgICAgICAgQ0Fzc29jKiBwTmV4dDsKKyAgICB2b2lkKiBkYXRhOworICB9OwogCi0gICAgICAgIEZYX0RXT1JEIG5IYXNoVmFsdWU7CisgcHVibGljOgorICBDRlhfUHRyTGlzdChpbnQgbkJsb2NrU2l6ZSA9IDEwKTsKIAotICAgICAgICBDRlhfQnl0ZVN0cmluZyBrZXk7CisgIEZYX1BPU0lUSU9OIEdldEhlYWRQb3NpdGlvbigpIGNvbnN0IHsgcmV0dXJuIChGWF9QT1NJVElPTiltX3BOb2RlSGVhZDsgfQogCi0gICAgICAgIHZvaWQqIHZhbHVlOwotICAgIH07Ci1wdWJsaWM6Ci0gICAgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cihpbnQgbkJsb2NrU2l6ZSA9IDEwKTsKKyAgRlhfUE9TSVRJT04gR2V0VGFpbFBvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4gKEZYX1BPU0lUSU9OKW1fcE5vZGVUYWlsOyB9CiAKLSAgICBpbnQgR2V0Q291bnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbkNvdW50OwotICAgIH0KKyAgdm9pZCogR2V0TmV4dChGWF9QT1NJVElPTiYgclBvc2l0aW9uKSBjb25zdCB7CisgICAgQ05vZGUqIHBOb2RlID0gKENOb2RlKilyUG9zaXRpb247CisgICAgclBvc2l0aW9uID0gKEZYX1BPU0lUSU9OKXBOb2RlLT5wTmV4dDsKKyAgICByZXR1cm4gcE5vZGUtPmRhdGE7CisgIH0KIAotICAgIEZYX0JPT0wgSXNFbXB0eSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9uQ291bnQgPT0gMDsKLSAgICB9CisgIHZvaWQqIEdldFByZXYoRlhfUE9TSVRJT04mIHJQb3NpdGlvbikgY29uc3QgeworICAgIENOb2RlKiBwTm9kZSA9IChDTm9kZSopclBvc2l0aW9uOworICAgIHJQb3NpdGlvbiA9IChGWF9QT1NJVElPTilwTm9kZS0+cFByZXY7CisgICAgcmV0dXJuIHBOb2RlLT5kYXRhOworICB9CiAKLSAgICBGWF9CT09MIExvb2t1cChGWF9CU1RSIGtleSwgdm9pZComIHJWYWx1ZSkgY29uc3Q7CisgIEZYX1BPU0lUSU9OIEdldE5leHRQb3NpdGlvbihGWF9QT1NJVElPTiBwb3MpIGNvbnN0IHsKKyAgICByZXR1cm4gKChDTm9kZSopcG9zKS0+cE5leHQ7CisgIH0KIAotICAgIHZvaWQqJiBvcGVyYXRvcltdKEZYX0JTVFIga2V5KTsKKyAgRlhfUE9TSVRJT04gR2V0UHJldlBvc2l0aW9uKEZYX1BPU0lUSU9OIHBvcykgY29uc3QgeworICAgIHJldHVybiAoKENOb2RlKilwb3MpLT5wUHJldjsKKyAgfQogCi0gICAgdm9pZCBTZXRBdChGWF9CU1RSIGtleSwgdm9pZCogbmV3VmFsdWUpCi0gICAgewotICAgICAgICAoKnRoaXMpW2tleV0gPSBuZXdWYWx1ZTsKLSAgICB9CisgIHZvaWQqIEdldEF0KEZYX1BPU0lUSU9OIHJQb3NpdGlvbikgY29uc3QgeworICAgIENOb2RlKiBwTm9kZSA9IChDTm9kZSopclBvc2l0aW9uOworICAgIHJldHVybiBwTm9kZS0+ZGF0YTsKKyAgfQogCi0gICAgRlhfQk9PTCBSZW1vdmVLZXkoRlhfQlNUUiBrZXkpOworICBpbnQgR2V0Q291bnQoKSBjb25zdCB7IHJldHVybiBtX25Db3VudDsgfQogCi0gICAgdm9pZCBSZW1vdmVBbGwoKTsKKyAgRlhfUE9TSVRJT04gQWRkVGFpbCh2b2lkKiBuZXdFbGVtZW50KTsKIAotICAgIEZYX1BPU0lUSU9OIEdldFN0YXJ0UG9zaXRpb24oKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIChtX25Db3VudCA9PSAwKSA/IE5VTEwgOiAoRlhfUE9TSVRJT04pIC0gMTsKLSAgICB9CisgIEZYX1BPU0lUSU9OIEFkZEhlYWQodm9pZCogbmV3RWxlbWVudCk7CiAKLSAgICB2b2lkIEdldE5leHRBc3NvYyhGWF9QT1NJVElPTiYgck5leHRQb3NpdGlvbiwgQ0ZYX0J5dGVTdHJpbmcmIHJLZXksIHZvaWQqJiByVmFsdWUpIGNvbnN0OworICB2b2lkIFNldEF0KEZYX1BPU0lUSU9OIHBvcywgdm9pZCogbmV3RWxlbWVudCkgeworICAgIENOb2RlKiBwTm9kZSA9IChDTm9kZSopcG9zOworICAgIHBOb2RlLT5kYXRhID0gbmV3RWxlbWVudDsKKyAgfQogCi0gICAgRlhfTFBWT0lECQlHZXROZXh0VmFsdWUoRlhfUE9TSVRJT04mIHJOZXh0UG9zaXRpb24pIGNvbnN0OworICBGWF9QT1NJVElPTiBJbnNlcnRBZnRlcihGWF9QT1NJVElPTiBwb3MsIHZvaWQqIG5ld0VsZW1lbnQpOwogCi0gICAgRlhfRFdPUkQgR2V0SGFzaFRhYmxlU2l6ZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9uSGFzaFRhYmxlU2l6ZTsKLSAgICB9CisgIEZYX1BPU0lUSU9OIEZpbmQodm9pZCogc2VhcmNoVmFsdWUsIEZYX1BPU0lUSU9OIHN0YXJ0QWZ0ZXIgPSBOVUxMKSBjb25zdDsKIAotICAgIHZvaWQgSW5pdEhhc2hUYWJsZShGWF9EV09SRCBoYXNoU2l6ZSwgRlhfQk9PTCBiQWxsb2NOb3cgPSBUUlVFKTsKKyAgRlhfUE9TSVRJT04gRmluZEluZGV4KGludCBpbmRleCkgY29uc3Q7CiAKLSAgICBGWF9EV09SRCBIYXNoS2V5KEZYX0JTVFIga2V5KSBjb25zdDsKLXByb3RlY3RlZDoKKyAgdm9pZCBSZW1vdmVBdChGWF9QT1NJVElPTiBwb3MpOwogCi0gICAgQ0Fzc29jKiogbV9wSGFzaFRhYmxlOworICB2b2lkIFJlbW92ZUFsbCgpOwogCi0gICAgRlhfRFdPUkQgbV9uSGFzaFRhYmxlU2l6ZTsKKyBwcm90ZWN0ZWQ6CisgIENOb2RlKiBtX3BOb2RlSGVhZDsKIAotICAgIGludCBtX25Db3VudDsKKyAgQ05vZGUqIG1fcE5vZGVUYWlsOwogCi0gICAgQ0Fzc29jKiBtX3BGcmVlTGlzdDsKKyAgaW50IG1fbkNvdW50OwogCi0gICAgc3RydWN0IENGWF9QbGV4KiBtX3BCbG9ja3M7CisgIENOb2RlKiBtX3BOb2RlRnJlZTsKIAotICAgIGludCBtX25CbG9ja1NpemU7CisgIHN0cnVjdCBDRlhfUGxleCogbV9wQmxvY2tzOwogCi0gICAgQ0Fzc29jKiBOZXdBc3NvYygpOworICBpbnQgbV9uQmxvY2tTaXplOwogCi0gICAgdm9pZCBGcmVlQXNzb2MoQ0Fzc29jKiBwQXNzb2MpOworICBDTm9kZSogTmV3Tm9kZShDTm9kZSogcFByZXYsIENOb2RlKiBwTmV4dCk7CiAKLSAgICBDQXNzb2MqIEdldEFzc29jQXQoRlhfQlNUUiBrZXksIEZYX0RXT1JEJiBoYXNoKSBjb25zdDsKLXB1YmxpYzoKKyAgdm9pZCBGcmVlTm9kZShDTm9kZSogcE5vZGUpOwogCi0gICAgfkNGWF9NYXBCeXRlU3RyaW5nVG9QdHIoKTsKKyBwdWJsaWM6CisgIH5DRlhfUHRyTGlzdCgpOwogfTsKLWNsYXNzIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyIAotewotcHVibGljOgotICAgIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyKCk7Ci0KLSAgICB+Q0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHIoKTsKLQotICAgIHZvaWQJCQlSZW1vdmVBbGwoKTsKLQotICAgIEZYX1BPU0lUSU9OCQlHZXRTdGFydFBvc2l0aW9uKCkgY29uc3Q7Ci0KLSAgICB2b2lkCQkJR2V0TmV4dEFzc29jKEZYX1BPU0lUSU9OJiByTmV4dFBvc2l0aW9uLCBDRlhfQnl0ZVN0cmluZyYgcktleSwgdm9pZComIHJWYWx1ZSkgY29uc3Q7Ci0KLSAgICBGWF9MUFZPSUQJCUdldE5leHRWYWx1ZShGWF9QT1NJVElPTiYgck5leHRQb3NpdGlvbikgY29uc3Q7Ci0KLSAgICBGWF9CT09MCQkJTG9va3VwKEZYX0JTVFIga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdDsKLQotICAgIHZvaWQJCQlTZXRBdChGWF9CU1RSIGtleSwgdm9pZCogdmFsdWUpOwotCi0gICAgdm9pZAkJCVJlbW92ZUtleShGWF9CU1RSIGtleSk7Ci0KLSAgICBpbnQJCQkJR2V0Q291bnQoKSBjb25zdDsKLQotICAgIHZvaWQJCQlBZGRWYWx1ZShGWF9CU1RSIGtleSwgdm9pZCogcFZhbHVlKTsKLXByaXZhdGU6Ci0KLSAgICBDRlhfQmFzZVNlZ21lbnRlZEFycmF5CQkJbV9CdWZmZXI7Ci19OwotY2xhc3MgQ0ZYX1B0ckxpc3QgCi17Ci1wcm90ZWN0ZWQ6Ci0KLSAgICBzdHJ1Y3QgQ05vZGUgewotCi0gICAgICAgIENOb2RlKiBwTmV4dDsKLQotICAgICAgICBDTm9kZSogcFByZXY7Ci0KLSAgICAgICAgdm9pZCogZGF0YTsKLSAgICB9OwotcHVibGljOgotICAgIENGWF9QdHJMaXN0KGludCBuQmxvY2tTaXplID0gMTApOwotCi0gICAgRlhfUE9TSVRJT04gR2V0SGVhZFBvc2l0aW9uKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRlhfUE9TSVRJT04pbV9wTm9kZUhlYWQ7Ci0gICAgfQotCi0gICAgRlhfUE9TSVRJT04gR2V0VGFpbFBvc2l0aW9uKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRlhfUE9TSVRJT04pbV9wTm9kZVRhaWw7Ci0gICAgfQotCi0gICAgdm9pZCoJR2V0TmV4dChGWF9QT1NJVElPTiYgclBvc2l0aW9uKSBjb25zdAotICAgIHsKLSAgICAgICAgQ05vZGUqIHBOb2RlID0gKENOb2RlKikgclBvc2l0aW9uOwotICAgICAgICByUG9zaXRpb24gPSAoRlhfUE9TSVRJT04pIHBOb2RlLT5wTmV4dDsKLSAgICAgICAgcmV0dXJuIHBOb2RlLT5kYXRhOwotICAgIH0KLQotICAgIHZvaWQqCUdldFByZXYoRlhfUE9TSVRJT04mIHJQb3NpdGlvbikgY29uc3QKLSAgICB7Ci0gICAgICAgIENOb2RlKiBwTm9kZSA9IChDTm9kZSopIHJQb3NpdGlvbjsKLSAgICAgICAgclBvc2l0aW9uID0gKEZYX1BPU0lUSU9OKSBwTm9kZS0+cFByZXY7Ci0gICAgICAgIHJldHVybiBwTm9kZS0+ZGF0YTsKLSAgICB9Ci0KLSAgICBGWF9QT1NJVElPTglHZXROZXh0UG9zaXRpb24oRlhfUE9TSVRJT04gcG9zKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuICgoQ05vZGUqKXBvcyktPnBOZXh0OwotICAgIH0KLQotICAgIEZYX1BPU0lUSU9OCUdldFByZXZQb3NpdGlvbihGWF9QT1NJVElPTiBwb3MpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gKChDTm9kZSopcG9zKS0+cFByZXY7Ci0gICAgfQotCi0gICAgdm9pZCoJR2V0QXQoRlhfUE9TSVRJT04gclBvc2l0aW9uKSBjb25zdAotICAgIHsKLSAgICAgICAgQ05vZGUqIHBOb2RlID0gKENOb2RlKikgclBvc2l0aW9uOwotICAgICAgICByZXR1cm4gcE5vZGUtPmRhdGE7Ci0gICAgfQotCi0gICAgaW50CQlHZXRDb3VudCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9uQ291bnQ7Ci0gICAgfQotCi0gICAgRlhfUE9TSVRJT04JQWRkVGFpbCh2b2lkKiBuZXdFbGVtZW50KTsKLQotICAgIEZYX1BPU0lUSU9OIEFkZEhlYWQodm9pZCogbmV3RWxlbWVudCk7Ci0KLSAgICB2b2lkCVNldEF0KEZYX1BPU0lUSU9OIHBvcywgdm9pZCogbmV3RWxlbWVudCkKLSAgICB7Ci0gICAgICAgIENOb2RlKiBwTm9kZSA9IChDTm9kZSopIHBvczsKLSAgICAgICAgcE5vZGUtPmRhdGEgPSBuZXdFbGVtZW50OwotICAgIH0KLQotICAgIEZYX1BPU0lUSU9OIEluc2VydEFmdGVyKEZYX1BPU0lUSU9OIHBvcywgdm9pZCogbmV3RWxlbWVudCk7Ci0KLSAgICBGWF9QT1NJVElPTiBGaW5kKHZvaWQqIHNlYXJjaFZhbHVlLCBGWF9QT1NJVElPTiBzdGFydEFmdGVyID0gTlVMTCApIGNvbnN0OwotCi0gICAgRlhfUE9TSVRJT04gRmluZEluZGV4KGludCBpbmRleCkgY29uc3Q7Ci0KLSAgICB2b2lkCVJlbW92ZUF0KEZYX1BPU0lUSU9OIHBvcyk7Ci0KLSAgICB2b2lkCVJlbW92ZUFsbCgpOwotcHJvdGVjdGVkOgotCi0gICAgQ05vZGUqIG1fcE5vZGVIZWFkOwotCi0gICAgQ05vZGUqIG1fcE5vZGVUYWlsOwotCi0gICAgaW50IG1fbkNvdW50OwotCi0gICAgQ05vZGUqIG1fcE5vZGVGcmVlOwotCi0gICAgc3RydWN0IENGWF9QbGV4KiBtX3BCbG9ja3M7Ci0KLSAgICBpbnQgbV9uQmxvY2tTaXplOwotCi0gICAgQ05vZGUqIE5ld05vZGUoQ05vZGUqIHBQcmV2LCBDTm9kZSogcE5leHQpOwotCi0gICAgdm9pZCBGcmVlTm9kZShDTm9kZSogcE5vZGUpOwotcHVibGljOgotCi0gICAgfkNGWF9QdHJMaXN0KCk7Ci19OwotdHlwZWRlZiB2b2lkICgqUERfQ0FMTEJBQ0tfRlJFRURBVEEpKEZYX0xQVk9JRCBwRGF0YSk7Cit0eXBlZGVmIHZvaWQgKCpQRF9DQUxMQkFDS19GUkVFREFUQSkodm9pZCogcERhdGEpOwogc3RydWN0IEZYX1BSSVZBVEVEQVRBIHsKKyAgdm9pZCBGcmVlRGF0YSgpOwogCi0gICAgdm9pZAkJCQkJRnJlZURhdGEoKTsKKyAgdm9pZCogbV9wTW9kdWxlSWQ7CiAKLSAgICBGWF9MUFZPSUQJCQkJbV9wTW9kdWxlSWQ7CisgIHZvaWQqIG1fcERhdGE7CiAKLSAgICBGWF9MUFZPSUQJCQkJbV9wRGF0YTsKKyAgUERfQ0FMTEJBQ0tfRlJFRURBVEEgbV9wQ2FsbGJhY2s7CiAKLSAgICBQRF9DQUxMQkFDS19GUkVFREFUQQltX3BDYWxsYmFjazsKLQotICAgIEZYX0JPT0wJCQkJCW1fYlNlbGZEZXN0cnVjdDsKKyAgRlhfQk9PTCBtX2JTZWxmRGVzdHJ1Y3Q7CiB9OwotY2xhc3MgQ0ZYX1ByaXZhdGVEYXRhCi17Ci1wdWJsaWM6CitjbGFzcyBDRlhfUHJpdmF0ZURhdGEgeworIHB1YmxpYzoKKyAgfkNGWF9Qcml2YXRlRGF0YSgpOwogCi0gICAgfkNGWF9Qcml2YXRlRGF0YSgpOworICB2b2lkIENsZWFyQWxsKCk7CiAKLSAgICB2b2lkCQkJCQlDbGVhckFsbCgpOworICB2b2lkIFNldFByaXZhdGVEYXRhKHZvaWQqIG1vZHVsZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjayk7CiAKLSAgICB2b2lkCQkJCQlTZXRQcml2YXRlRGF0YShGWF9MUFZPSUQgbW9kdWxlX2lkLCBGWF9MUFZPSUQgcERhdGEsIFBEX0NBTExCQUNLX0ZSRUVEQVRBIGNhbGxiYWNrKTsKKyAgdm9pZCBTZXRQcml2YXRlT2JqKHZvaWQqIG1vZHVsZV9pZCwgQ0ZYX0Rlc3RydWN0T2JqZWN0KiBwT2JqKTsKIAotICAgIHZvaWQJCQkJCVNldFByaXZhdGVPYmooRlhfTFBWT0lEIG1vZHVsZV9pZCwgQ0ZYX0Rlc3RydWN0T2JqZWN0KiBwT2JqKTsKKyAgdm9pZCogR2V0UHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkKTsKIAotICAgIEZYX0xQVk9JRAkJCQlHZXRQcml2YXRlRGF0YShGWF9MUFZPSUQgbW9kdWxlX2lkKTsKLQotICAgIEZYX0JPT0wJCQkJCUxvb2t1cFByaXZhdGVEYXRhKEZYX0xQVk9JRCBtb2R1bGVfaWQsIEZYX0xQVk9JRCAmcERhdGEpIGNvbnN0Ci0gICAgewotICAgICAgICBpZiAoIW1vZHVsZV9pZCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIEZYX0RXT1JEIG5Db3VudCA9IG1fRGF0YUxpc3QuR2V0U2l6ZSgpOwotICAgICAgICBmb3IgKEZYX0RXT1JEIG4gPSAwOyBuIDwgbkNvdW50OyBuICsrKSB7Ci0gICAgICAgICAgICBpZiAobV9EYXRhTGlzdFtuXS5tX3BNb2R1bGVJZCA9PSBtb2R1bGVfaWQpIHsKLSAgICAgICAgICAgICAgICBwRGF0YSA9IG1fRGF0YUxpc3Rbbl0ubV9wRGF0YTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7CisgIEZYX0JPT0wgTG9va3VwUHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkLCB2b2lkKiYgcERhdGEpIGNvbnN0IHsKKyAgICBpZiAoIW1vZHVsZV9pZCkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KKyAgICBGWF9EV09SRCBuQ291bnQgPSBtX0RhdGFMaXN0LkdldFNpemUoKTsKKyAgICBmb3IgKEZYX0RXT1JEIG4gPSAwOyBuIDwgbkNvdW50OyBuKyspIHsKKyAgICAgIGlmIChtX0RhdGFMaXN0W25dLm1fcE1vZHVsZUlkID09IG1vZHVsZV9pZCkgeworICAgICAgICBwRGF0YSA9IG1fRGF0YUxpc3Rbbl0ubV9wRGF0YTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKKyAgfQogCi0gICAgRlhfQk9PTAkJCQkJUmVtb3ZlUHJpdmF0ZURhdGEoRlhfTFBWT0lEIG1vZHVsZV9pZCk7Ci1wcm90ZWN0ZWQ6CisgIEZYX0JPT0wgUmVtb3ZlUHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkKTsKIAotICAgIENGWF9BcnJheVRlbXBsYXRlPEZYX1BSSVZBVEVEQVRBPgltX0RhdGFMaXN0OworIHByb3RlY3RlZDoKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfUFJJVkFURURBVEE+IG1fRGF0YUxpc3Q7CiAKLSAgICB2b2lkCQkJCQlBZGREYXRhKEZYX0xQVk9JRCBtb2R1bGVfaWQsIEZYX0xQVk9JRCBwRGF0YSwgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2ssIEZYX0JPT0wgYlNlbGZEZXN0cnVjdCk7CisgIHZvaWQgQWRkRGF0YSh2b2lkKiBtb2R1bGVfaWQsCisgICAgICAgICAgICAgICB2b2lkKiBwRGF0YSwKKyAgICAgICAgICAgICAgIFBEX0NBTExCQUNLX0ZSRUVEQVRBIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgRlhfQk9PTCBiU2VsZkRlc3RydWN0KTsKIH07Ci1jbGFzcyBDRlhfQml0U3RyZWFtIAotewotcHVibGljOgorY2xhc3MgQ0ZYX0JpdFN0cmVhbSB7CisgcHVibGljOgorICB2b2lkIEluaXQoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3U2l6ZSk7CiAKLSAgICB2b2lkCQkJCUluaXQoRlhfTFBDQllURSBwRGF0YSwgRlhfRFdPUkQgZHdTaXplKTsKKyAgRlhfRFdPUkQgR2V0Qml0cyhGWF9EV09SRCBuQml0cyk7CiAKKyAgdm9pZCBCeXRlQWxpZ24oKTsKIAotICAgIEZYX0RXT1JECQkJR2V0Qml0cyhGWF9EV09SRCBuQml0cyk7CisgIEZYX0JPT0wgSXNFT0YoKSB7IHJldHVybiBtX0JpdFBvcyA+PSBtX0JpdFNpemU7IH0KIAotICAgIHZvaWQJCQkJQnl0ZUFsaWduKCk7CisgIHZvaWQgU2tpcEJpdHMoRlhfRFdPUkQgbkJpdHMpIHsgbV9CaXRQb3MgKz0gbkJpdHM7IH0KIAotICAgIEZYX0JPT0wJCQkJSXNFT0YoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fQml0UG9zID49IG1fQml0U2l6ZTsKLSAgICB9CisgIHZvaWQgUmV3aW5kKCkgeyBtX0JpdFBvcyA9IDA7IH0KIAotICAgIHZvaWQJCQkJU2tpcEJpdHMoRlhfRFdPUkQgbkJpdHMpCi0gICAgewotICAgICAgICBtX0JpdFBvcyArPSBuQml0czsKLSAgICB9CisgIEZYX0RXT1JEIEdldFBvcygpIGNvbnN0IHsgcmV0dXJuIG1fQml0UG9zOyB9CiAKLSAgICB2b2lkCQkJCVJld2luZCgpCi0gICAgewotICAgICAgICBtX0JpdFBvcyA9IDA7Ci0gICAgfQotcHJvdGVjdGVkOgorICBGWF9EV09SRCBCaXRzUmVtYWluaW5nKCkgY29uc3QgeworICAgIHJldHVybiBtX0JpdFNpemUgPj0gbV9CaXRQb3MgPyBtX0JpdFNpemUgLSBtX0JpdFBvcyA6IDA7CisgIH0KIAotICAgIEZYX0RXT1JECQkJbV9CaXRQb3M7CisgcHJvdGVjdGVkOgorICBGWF9EV09SRCBtX0JpdFBvczsKIAotICAgIEZYX0RXT1JECQkJbV9CaXRTaXplOworICBGWF9EV09SRCBtX0JpdFNpemU7CiAKLSAgICBGWF9MUENCWVRFCQkJbV9wRGF0YTsKKyAgY29uc3QgdWludDhfdCogbV9wRGF0YTsKIH07Ci10ZW1wbGF0ZSA8Y2xhc3MgT2JqQ2xhc3M+IGNsYXNzIENGWF9Db3VudFJlZiAKLXsKLXB1YmxpYzoKK3RlbXBsYXRlIDxjbGFzcyBPYmpDbGFzcz4KK2NsYXNzIENGWF9Db3VudFJlZiB7CisgcHVibGljOgorICB0eXBlZGVmIENGWF9Db3VudFJlZjxPYmpDbGFzcz4gUmVmOwogCi0gICAgdHlwZWRlZiBDRlhfQ291bnRSZWY8T2JqQ2xhc3M+IFJlZjsKKyAgY2xhc3MgQ291bnRlZE9iaiA6IHB1YmxpYyBPYmpDbGFzcyB7CisgICBwdWJsaWM6CisgICAgQ291bnRlZE9iaigpIHt9CiAKLSAgICBjbGFzcyBDb3VudGVkT2JqIDogcHVibGljIE9iakNsYXNzCi0gICAgewotICAgIHB1YmxpYzoKKyAgICBDb3VudGVkT2JqKGNvbnN0IENvdW50ZWRPYmomIHNyYykgOiBPYmpDbGFzcyhzcmMpIHt9CiAKLSAgICAgICAgQ291bnRlZE9iaigpIHt9CisgICAgaW50IG1fUmVmQ291bnQ7CisgIH07CiAKLSAgICAgICAgQ291bnRlZE9iaihjb25zdCBDb3VudGVkT2JqJiBzcmMpIDogT2JqQ2xhc3Moc3JjKSB7fQorICBDRlhfQ291bnRSZWYoKSB7IG1fcE9iamVjdCA9IE5VTEw7IH0KIAotICAgICAgICBpbnQJCQltX1JlZkNvdW50OwotICAgIH07Ci0KLSAgICBDRlhfQ291bnRSZWYoKQotICAgIHsKLSAgICAgICAgbV9wT2JqZWN0ID0gTlVMTDsKKyAgQ0ZYX0NvdW50UmVmKGNvbnN0IFJlZiYgcmVmKSB7CisgICAgbV9wT2JqZWN0ID0gcmVmLm1fcE9iamVjdDsKKyAgICBpZiAobV9wT2JqZWN0KSB7CisgICAgICBtX3BPYmplY3QtPm1fUmVmQ291bnQrKzsKICAgICB9CisgIH0KIAotICAgIENGWF9Db3VudFJlZihjb25zdCBSZWYmIHJlZikKLSAgICB7Ci0gICAgICAgIG1fcE9iamVjdCA9IHJlZi5tX3BPYmplY3Q7Ci0gICAgICAgIGlmIChtX3BPYmplY3QpIHsKLSAgICAgICAgICAgIG1fcE9iamVjdC0+bV9SZWZDb3VudCArKzsKLSAgICAgICAgfQorICB+Q0ZYX0NvdW50UmVmKCkgeworICAgIGlmICghbV9wT2JqZWN0KSB7CisgICAgICByZXR1cm47CiAgICAgfQotCi0gICAgfkNGWF9Db3VudFJlZigpCi0gICAgewotICAgICAgICBpZiAoIW1fcE9iamVjdCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1fcE9iamVjdC0+bV9SZWZDb3VudCAtLTsKLSAgICAgICAgaWYgKG1fcE9iamVjdC0+bV9SZWZDb3VudCA8PSAwKSB7Ci0gICAgICAgICAgICBkZWxldGUgbV9wT2JqZWN0OwotICAgICAgICB9CisgICAgbV9wT2JqZWN0LT5tX1JlZkNvdW50LS07CisgICAgaWYgKG1fcE9iamVjdC0+bV9SZWZDb3VudCA8PSAwKSB7CisgICAgICBkZWxldGUgbV9wT2JqZWN0OwogICAgIH0KKyAgfQogCi0gICAgT2JqQ2xhc3MqCQkJTmV3KCkKLSAgICB7Ci0gICAgICAgIGlmIChtX3BPYmplY3QpIHsKLSAgICAgICAgICAgIG1fcE9iamVjdC0+bV9SZWZDb3VudCAtLTsKLSAgICAgICAgICAgIGlmIChtX3BPYmplY3QtPm1fUmVmQ291bnQgPD0gMCkgewotICAgICAgICAgICAgICAgIGRlbGV0ZSBtX3BPYmplY3Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9wT2JqZWN0ID0gbmV3IENvdW50ZWRPYmo7Ci0gICAgICAgIG1fcE9iamVjdC0+bV9SZWZDb3VudCA9IDE7Ci0gICAgICAgIHJldHVybiBtX3BPYmplY3Q7CisgIE9iakNsYXNzKiBOZXcoKSB7CisgICAgaWYgKG1fcE9iamVjdCkgeworICAgICAgbV9wT2JqZWN0LT5tX1JlZkNvdW50LS07CisgICAgICBpZiAobV9wT2JqZWN0LT5tX1JlZkNvdW50IDw9IDApIHsKKyAgICAgICAgZGVsZXRlIG1fcE9iamVjdDsKKyAgICAgIH0KICAgICB9CisgICAgbV9wT2JqZWN0ID0gbmV3IENvdW50ZWRPYmo7CisgICAgbV9wT2JqZWN0LT5tX1JlZkNvdW50ID0gMTsKKyAgICByZXR1cm4gbV9wT2JqZWN0OworICB9CiAKLSAgICB2b2lkCQkJCW9wZXJhdG9yID0gKGNvbnN0IFJlZiYgcmVmKQotICAgIHsKLSAgICAgICAgaWYgKHJlZi5tX3BPYmplY3QpIHsKLSAgICAgICAgICAgIHJlZi5tX3BPYmplY3QtPm1fUmVmQ291bnQgKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fcE9iamVjdCkgewotICAgICAgICAgICAgbV9wT2JqZWN0LT5tX1JlZkNvdW50IC0tOwotICAgICAgICAgICAgaWYgKG1fcE9iamVjdC0+bV9SZWZDb3VudCA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIG1fcE9iamVjdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX3BPYmplY3QgPSByZWYubV9wT2JqZWN0OworICB2b2lkIG9wZXJhdG9yPShjb25zdCBSZWYmIHJlZikgeworICAgIGlmIChyZWYubV9wT2JqZWN0KSB7CisgICAgICByZWYubV9wT2JqZWN0LT5tX1JlZkNvdW50Kys7CiAgICAgfQotCi0gICAgdm9pZAkJCQlvcGVyYXRvciA9ICh2b2lkKiBwKQotICAgIHsKLSAgICAgICAgRlhTWVNfYXNzZXJ0KHAgPT0gMCk7Ci0gICAgICAgIGlmIChtX3BPYmplY3QgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1fcE9iamVjdC0+bV9SZWZDb3VudCAtLTsKLSAgICAgICAgaWYgKG1fcE9iamVjdC0+bV9SZWZDb3VudCA8PSAwKSB7Ci0gICAgICAgICAgICBkZWxldGUgbV9wT2JqZWN0OwotICAgICAgICB9Ci0gICAgICAgIG1fcE9iamVjdCA9IE5VTEw7CisgICAgaWYgKG1fcE9iamVjdCkgeworICAgICAgbV9wT2JqZWN0LT5tX1JlZkNvdW50LS07CisgICAgICBpZiAobV9wT2JqZWN0LT5tX1JlZkNvdW50IDw9IDApIHsKKyAgICAgICAgZGVsZXRlIG1fcE9iamVjdDsKKyAgICAgIH0KICAgICB9CisgICAgbV9wT2JqZWN0ID0gcmVmLm1fcE9iamVjdDsKKyAgfQogCi0gICAgY29uc3QgT2JqQ2xhc3MqCQlHZXRPYmplY3QoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcE9iamVjdDsKKyAgdm9pZCBvcGVyYXRvcj0odm9pZCogcCkgeworICAgIEZYU1lTX2Fzc2VydChwID09IDApOworICAgIGlmICghbV9wT2JqZWN0KSB7CisgICAgICByZXR1cm47CiAgICAgfQotCi0gICAgb3BlcmF0b3IJCQljb25zdCBPYmpDbGFzcyooKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcE9iamVjdDsKKyAgICBtX3BPYmplY3QtPm1fUmVmQ291bnQtLTsKKyAgICBpZiAobV9wT2JqZWN0LT5tX1JlZkNvdW50IDw9IDApIHsKKyAgICAgIGRlbGV0ZSBtX3BPYmplY3Q7CiAgICAgfQorICAgIG1fcE9iamVjdCA9IE5VTEw7CisgIH0KIAotICAgIEZYX0JPT0wJCQkJSXNOdWxsKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BPYmplY3QgPT0gTlVMTDsKKyAgY29uc3QgT2JqQ2xhc3MqIEdldE9iamVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fcE9iamVjdDsgfQorCisgIG9wZXJhdG9yIGNvbnN0IE9iakNsYXNzKigpIGNvbnN0IHsgcmV0dXJuIG1fcE9iamVjdDsgfQorCisgIEZYX0JPT0wgSXNOdWxsKCkgY29uc3QgeyByZXR1cm4gIW1fcE9iamVjdDsgfQorCisgIEZYX0JPT0wgTm90TnVsbCgpIGNvbnN0IHsgcmV0dXJuICFJc051bGwoKTsgfQorCisgIE9iakNsYXNzKiBHZXRNb2RpZnkoKSB7CisgICAgaWYgKCFtX3BPYmplY3QpIHsKKyAgICAgIG1fcE9iamVjdCA9IG5ldyBDb3VudGVkT2JqOworICAgICAgbV9wT2JqZWN0LT5tX1JlZkNvdW50ID0gMTsKKyAgICB9IGVsc2UgaWYgKG1fcE9iamVjdC0+bV9SZWZDb3VudCA+IDEpIHsKKyAgICAgIG1fcE9iamVjdC0+bV9SZWZDb3VudC0tOworICAgICAgQ291bnRlZE9iaiogcE9sZE9iamVjdCA9IG1fcE9iamVjdDsKKyAgICAgIG1fcE9iamVjdCA9IG5ldyBDb3VudGVkT2JqKCpwT2xkT2JqZWN0KTsKKyAgICAgIG1fcE9iamVjdC0+bV9SZWZDb3VudCA9IDE7CiAgICAgfQorICAgIHJldHVybiBtX3BPYmplY3Q7CisgIH0KIAotICAgIEZYX0JPT0wJCQkJTm90TnVsbCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wT2JqZWN0ICE9IE5VTEw7CisgIHZvaWQgU2V0TnVsbCgpIHsKKyAgICBpZiAoIW1fcE9iamVjdCkgeworICAgICAgcmV0dXJuOwogICAgIH0KLQotICAgIE9iakNsYXNzKgkJCUdldE1vZGlmeSgpCi0gICAgewotICAgICAgICBpZiAobV9wT2JqZWN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1fcE9iamVjdCA9IG5ldyBDb3VudGVkT2JqOwotICAgICAgICAgICAgbV9wT2JqZWN0LT5tX1JlZkNvdW50ID0gMTsKLSAgICAgICAgfSBlbHNlIGlmIChtX3BPYmplY3QtPm1fUmVmQ291bnQgPiAxKSB7Ci0gICAgICAgICAgICBtX3BPYmplY3QtPm1fUmVmQ291bnQgLS07Ci0gICAgICAgICAgICBDb3VudGVkT2JqKiBwT2xkT2JqZWN0ID0gbV9wT2JqZWN0OwotICAgICAgICAgICAgbV9wT2JqZWN0ID0gbmV3IENvdW50ZWRPYmooKnBPbGRPYmplY3QpOwotICAgICAgICAgICAgbV9wT2JqZWN0LT5tX1JlZkNvdW50ID0gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbV9wT2JqZWN0OworICAgIG1fcE9iamVjdC0+bV9SZWZDb3VudC0tOworICAgIGlmIChtX3BPYmplY3QtPm1fUmVmQ291bnQgPD0gMCkgeworICAgICAgZGVsZXRlIG1fcE9iamVjdDsKICAgICB9CisgICAgbV9wT2JqZWN0ID0gTlVMTDsKKyAgfQogCi0gICAgdm9pZAkJCQlTZXROdWxsKCkKLSAgICB7Ci0gICAgICAgIGlmIChtX3BPYmplY3QgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1fcE9iamVjdC0+bV9SZWZDb3VudCAtLTsKLSAgICAgICAgaWYgKG1fcE9iamVjdC0+bV9SZWZDb3VudCA8PSAwKSB7Ci0gICAgICAgICAgICBkZWxldGUgbV9wT2JqZWN0OwotICAgICAgICB9Ci0gICAgICAgIG1fcE9iamVjdCA9IE5VTEw7Ci0gICAgfQorICBGWF9CT09MIG9wZXJhdG9yPT0oY29uc3QgUmVmJiByZWYpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9wT2JqZWN0ID09IHJlZi5tX3BPYmplY3Q7CisgIH0KIAotICAgIEZYX0JPT0wJCQkJb3BlcmF0b3IgPT0gKGNvbnN0IFJlZiYgcmVmKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcE9iamVjdCA9PSByZWYubV9wT2JqZWN0OwotICAgIH0KLXByb3RlY3RlZDoKLQotICAgIENvdW50ZWRPYmoqCQkJbV9wT2JqZWN0OworIHByb3RlY3RlZDoKKyAgQ291bnRlZE9iaiogbV9wT2JqZWN0OwogfTsKLWNsYXNzIElGWF9QYXVzZQotewotcHVibGljOgotICAgIHZpcnR1YWwgfklGWF9QYXVzZSgpIHsgfQotICAgIHZpcnR1YWwgRlhfQk9PTAlOZWVkVG9QYXVzZU5vdygpID0gMDsKLX07Ci1jbGFzcyBDRlhfRGF0YUZpbHRlciAKLXsKLXB1YmxpYzoKLQotICAgIHZpcnR1YWwgfkNGWF9EYXRhRmlsdGVyKCk7Ci0KLSAgICB2b2lkCQkJU2V0RGVzdEZpbHRlcihDRlhfRGF0YUZpbHRlciogcEZpbHRlcik7Ci0KLSAgICBGWF9CT09MCQkJSXNFT0YoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYkVPRjsKLSAgICB9Ci0KLSAgICBGWF9EV09SRAkJR2V0U3JjUG9zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1NyY1BvczsKLSAgICB9Ci0KLSAgICB2b2lkCQkJRmlsdGVySW4oRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOwotCi0gICAgdm9pZAkJCUZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7Ci1wcm90ZWN0ZWQ6Ci0KLSAgICBDRlhfRGF0YUZpbHRlcigpOwotICAgIHZpcnR1YWwgdm9pZAl2X0ZpbHRlckluKEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkCXZfRmlsdGVyRmluaXNoKENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSA9IDA7Ci0gICAgdm9pZAkJCVJlcG9ydEVPRihGWF9EV09SRCBsZWZ0X2lucHV0KTsKLQotICAgIEZYX0JPT0wJCQltX2JFT0Y7Ci0KLSAgICBGWF9EV09SRAkJbV9TcmNQb3M7Ci0KLSAgICBDRlhfRGF0YUZpbHRlcioJbV9wRGVzdEZpbHRlcjsKK2NsYXNzIElGWF9QYXVzZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JRlhfUGF1c2UoKSB7fQorICB2aXJ0dWFsIEZYX0JPT0wgTmVlZFRvUGF1c2VOb3coKSA9IDA7CiB9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBjbGFzcyBDRlhfQXV0b1Jlc3RvcmVyIHsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBDRlhfQXV0b1Jlc3RvcmVyKFQqIGxvY2F0aW9uKSB7Ci0gICAgICBtX0xvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgICBtX09sZFZhbHVlID0gKmxvY2F0aW9uOwotICAgIH0KLSAgICB+Q0ZYX0F1dG9SZXN0b3JlcigpIHsgKm1fTG9jYXRpb24gPSBtX09sZFZhbHVlOyB9CisgcHVibGljOgorICBleHBsaWNpdCBDRlhfQXV0b1Jlc3RvcmVyKFQqIGxvY2F0aW9uKQorICAgICAgOiBtX0xvY2F0aW9uKGxvY2F0aW9uKSwgbV9PbGRWYWx1ZSgqbG9jYXRpb24pIHt9CisgIH5DRlhfQXV0b1Jlc3RvcmVyKCkgeyAqbV9Mb2NhdGlvbiA9IG1fT2xkVmFsdWU7IH0KIAotcHJpdmF0ZToKLSAgVCogbV9Mb2NhdGlvbjsKLSAgVCBtX09sZFZhbHVlOworIHByaXZhdGU6CisgIFQqIGNvbnN0IG1fTG9jYXRpb247CisgIGNvbnN0IFQgbV9PbGRWYWx1ZTsKIH07CiAKK3N0cnVjdCBGeEZyZWVEZWxldGVyIHsKKyAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKSh2b2lkKiBwdHIpIGNvbnN0IHsgRlhfRnJlZShwdHIpOyB9Cit9OworCisvLyBVc2VkIHdpdGggc3RkOjp1bmlxdWVfcHRyIHRvIFJlbGVhc2UoKSBvYmplY3RzIHRoYXQgY2FuJ3QgYmUgZGVsZXRlZC4KIHRlbXBsYXRlIDxjbGFzcyBUPgotY2xhc3MgQ0ZYX1NtYXJ0UG9pbnRlcgotewotcHVibGljOgotICAgIENGWF9TbWFydFBvaW50ZXIoVCAqcE9iaikgOiBtX3BPYmoocE9iaikge30KLSAgICB+Q0ZYX1NtYXJ0UG9pbnRlcigpCi0gICAgewotICAgICAgICBtX3BPYmotPlJlbGVhc2UoKTsKLSAgICB9Ci0gICAgVCogR2V0KHZvaWQpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wT2JqOwotICAgIH0KLSAgICBUJgkJb3BlcmF0b3IgKih2b2lkKQotICAgIHsKLSAgICAgICAgcmV0dXJuICptX3BPYmo7Ci0gICAgfQotICAgIFQqCQlvcGVyYXRvciAtPih2b2lkKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcE9iajsKLSAgICB9Ci1wcm90ZWN0ZWQ6Ci0gICAgVCAqbV9wT2JqOworc3RydWN0IFJlbGVhc2VEZWxldGVyIHsKKyAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKShUKiBwdHIpIGNvbnN0IHsgcHRyLT5SZWxlYXNlKCk7IH0KIH07Ci0jZGVmaW5lIEZYX0RBVEFMSVNUX0xFTkdUSAkxMDI0Ci10ZW1wbGF0ZTxzaXplX3QgdW5pdD4KLWNsYXNzIENGWF9Tb3J0TGlzdEFycmF5IAotewotcHJvdGVjdGVkOgogCi0gICAgc3RydWN0IERhdGFMaXN0IHsKKyNkZWZpbmUgRlhfREFUQUxJU1RfTEVOR1RIIDEwMjQKK3RlbXBsYXRlIDxzaXplX3QgdW5pdD4KK2NsYXNzIENGWF9Tb3J0TGlzdEFycmF5IHsKKyBwcm90ZWN0ZWQ6CisgIHN0cnVjdCBEYXRhTGlzdCB7CisgICAgaW50MzJfdCBzdGFydDsKIAotICAgICAgICBGWF9JTlQzMglzdGFydDsKKyAgICBpbnQzMl90IGNvdW50OworICAgIHVpbnQ4X3QqIGRhdGE7CisgIH07CiAKLSAgICAgICAgRlhfSU5UMzIJY291bnQ7Ci0gICAgICAgIEZYX0xQQllURQlkYXRhOwotICAgIH07Ci1wdWJsaWM6CisgcHVibGljOgorICBDRlhfU29ydExpc3RBcnJheSgpIDogbV9DdXJMaXN0KDApIHt9CiAKLSAgICBDRlhfU29ydExpc3RBcnJheSgpIDogbV9DdXJMaXN0KDApIHt9CisgIH5DRlhfU29ydExpc3RBcnJheSgpIHsgQ2xlYXIoKTsgfQogCi0gICAgfkNGWF9Tb3J0TGlzdEFycmF5KCkKLSAgICB7Ci0gICAgICAgIENsZWFyKCk7CisgIHZvaWQgQ2xlYXIoKSB7CisgICAgZm9yIChpbnQzMl90IGkgPSBtX0RhdGFMaXN0cy5HZXRVcHBlckJvdW5kKCk7IGkgPj0gMDsgaS0tKSB7CisgICAgICBEYXRhTGlzdCBsaXN0ID0gbV9EYXRhTGlzdHMuRWxlbWVudEF0KGkpOworICAgICAgRlhfRnJlZShsaXN0LmRhdGEpOwogICAgIH0KKyAgICBtX0RhdGFMaXN0cy5SZW1vdmVBbGwoKTsKKyAgICBtX0N1ckxpc3QgPSAwOworICB9CiAKKyAgdm9pZCBBcHBlbmQoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50KSB7CisgICAgaWYgKG5TdGFydCA8IDApIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgd2hpbGUgKG5Db3VudCA+IDApIHsKKyAgICAgIGludDMyX3QgdGVtcF9jb3VudCA9IHN0ZDo6bWluKG5Db3VudCwgRlhfREFUQUxJU1RfTEVOR1RIKTsKKyAgICAgIERhdGFMaXN0IGxpc3Q7CisgICAgICBsaXN0LmRhdGEgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIHRlbXBfY291bnQsIHVuaXQpOworICAgICAgbGlzdC5zdGFydCA9IG5TdGFydDsKKyAgICAgIGxpc3QuY291bnQgPSB0ZW1wX2NvdW50OworICAgICAgQXBwZW5kKGxpc3QpOworICAgICAgbkNvdW50IC09IHRlbXBfY291bnQ7CisgICAgICBuU3RhcnQgKz0gdGVtcF9jb3VudDsKKyAgICB9CisgIH0KIAotICAgIHZvaWQJCQlDbGVhcigpCi0gICAgewotICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSBtX0RhdGFMaXN0cy5HZXRVcHBlckJvdW5kKCk7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICBEYXRhTGlzdCBsaXN0ID0gbV9EYXRhTGlzdHMuRWxlbWVudEF0KGkpOwotICAgICAgICAgICAgaWYgKGxpc3QuZGF0YSkgewotICAgICAgICAgICAgICAgIEZYX0ZyZWUobGlzdC5kYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX0RhdGFMaXN0cy5SZW1vdmVBbGwoKTsKLSAgICAgICAgbV9DdXJMaXN0ID0gMDsKKyAgdWludDhfdCogR2V0QXQoaW50MzJfdCBuSW5kZXgpIHsKKyAgICBpZiAobkluZGV4IDwgMCkgeworICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQorICAgIGlmIChtX0N1ckxpc3QgPCAwIHx8IG1fQ3VyTGlzdCA+PSBtX0RhdGFMaXN0cy5HZXRTaXplKCkpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBEYXRhTGlzdCogcEN1ckxpc3QgPSBtX0RhdGFMaXN0cy5HZXREYXRhUHRyKG1fQ3VyTGlzdCk7CisgICAgaWYgKCFwQ3VyTGlzdCB8fCBuSW5kZXggPCBwQ3VyTGlzdC0+c3RhcnQgfHwKKyAgICAgICAgbkluZGV4ID49IHBDdXJMaXN0LT5zdGFydCArIHBDdXJMaXN0LT5jb3VudCkgeworICAgICAgcEN1ckxpc3QgPSBOVUxMOworICAgICAgaW50MzJfdCBpU3RhcnQgPSAwOworICAgICAgaW50MzJfdCBpRW5kID0gbV9EYXRhTGlzdHMuR2V0VXBwZXJCb3VuZCgpOworICAgICAgaW50MzJfdCBpTWlkID0gMDsKKyAgICAgIHdoaWxlIChpU3RhcnQgPD0gaUVuZCkgeworICAgICAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsKKyAgICAgICAgRGF0YUxpc3QqIGxpc3QgPSBtX0RhdGFMaXN0cy5HZXREYXRhUHRyKGlNaWQpOworICAgICAgICBpZiAobkluZGV4IDwgbGlzdC0+c3RhcnQpIHsKKyAgICAgICAgICBpRW5kID0gaU1pZCAtIDE7CisgICAgICAgIH0gZWxzZSBpZiAobkluZGV4ID49IGxpc3QtPnN0YXJ0ICsgbGlzdC0+Y291bnQpIHsKKyAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwQ3VyTGlzdCA9IGxpc3Q7CisgICAgICAgICAgbV9DdXJMaXN0ID0gaU1pZDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcEN1ckxpc3QgPyBwQ3VyTGlzdC0+ZGF0YSArIChuSW5kZXggLSBwQ3VyTGlzdC0+c3RhcnQpICogdW5pdCA6IE5VTEw7CisgIH0KIAotICAgIHZvaWQJCQlBcHBlbmQoRlhfSU5UMzIgblN0YXJ0LCBGWF9JTlQzMiBuQ291bnQpCi0gICAgewotICAgICAgICBpZiAoblN0YXJ0IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuOworIHByb3RlY3RlZDoKKyAgdm9pZCBBcHBlbmQoY29uc3QgRGF0YUxpc3QmIGxpc3QpIHsKKyAgICBpbnQzMl90IGlTdGFydCA9IDA7CisgICAgaW50MzJfdCBpRW5kID0gbV9EYXRhTGlzdHMuR2V0VXBwZXJCb3VuZCgpOworICAgIGludDMyX3QgaUZpbmQgPSAwOworICAgIHdoaWxlIChpU3RhcnQgPD0gaUVuZCkgeworICAgICAgaW50MzJfdCBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsKKyAgICAgIERhdGFMaXN0KiBjdXJfbGlzdCA9IG1fRGF0YUxpc3RzLkdldERhdGFQdHIoaU1pZCk7CisgICAgICBpZiAobGlzdC5zdGFydCA8IGN1cl9saXN0LT5zdGFydCArIGN1cl9saXN0LT5jb3VudCkgeworICAgICAgICBpRW5kID0gaU1pZCAtIDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoaU1pZCA9PSBpRW5kKSB7CisgICAgICAgICAgaUZpbmQgPSBpTWlkICsgMTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICB3aGlsZSAobkNvdW50ID4gMCkgewotICAgICAgICAgICAgRlhfSU5UMzIgdGVtcF9jb3VudCA9IEZYX01JTihuQ291bnQsIEZYX0RBVEFMSVNUX0xFTkdUSCk7Ci0gICAgICAgICAgICBEYXRhTGlzdCBsaXN0OwotICAgICAgICAgICAgbGlzdC5kYXRhID0gRlhfQWxsb2MyRChGWF9CWVRFLCB0ZW1wX2NvdW50LCB1bml0KTsKLSAgICAgICAgICAgIGxpc3Quc3RhcnQgPSBuU3RhcnQ7Ci0gICAgICAgICAgICBsaXN0LmNvdW50ID0gdGVtcF9jb3VudDsKLSAgICAgICAgICAgIEFwcGVuZChsaXN0KTsKLSAgICAgICAgICAgIG5Db3VudCAtPSB0ZW1wX2NvdW50OwotICAgICAgICAgICAgblN0YXJ0ICs9IHRlbXBfY291bnQ7CisgICAgICAgIERhdGFMaXN0KiBuZXh0X2xpc3QgPSBtX0RhdGFMaXN0cy5HZXREYXRhUHRyKGlNaWQgKyAxKTsKKyAgICAgICAgaWYgKGxpc3Quc3RhcnQgPCBuZXh0X2xpc3QtPnN0YXJ0KSB7CisgICAgICAgICAgaUZpbmQgPSBpTWlkICsgMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsKICAgICAgICAgfQorICAgICAgfQogICAgIH0KLQotICAgIEZYX0xQQllURQkJR2V0QXQoRlhfSU5UMzIgbkluZGV4KQotICAgIHsKLSAgICAgICAgaWYgKG5JbmRleCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX0N1ckxpc3QgPCAwIHx8IG1fQ3VyTGlzdCA+PSBtX0RhdGFMaXN0cy5HZXRTaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIERhdGFMaXN0ICpwQ3VyTGlzdCA9IG1fRGF0YUxpc3RzLkdldERhdGFQdHIobV9DdXJMaXN0KTsKLSAgICAgICAgaWYgKCFwQ3VyTGlzdCB8fCBuSW5kZXggPCBwQ3VyTGlzdC0+c3RhcnQgfHwgbkluZGV4ID49IHBDdXJMaXN0LT5zdGFydCArIHBDdXJMaXN0LT5jb3VudCkgewotICAgICAgICAgICAgcEN1ckxpc3QgPSBOVUxMOwotICAgICAgICAgICAgRlhfSU5UMzIgaVN0YXJ0ID0gMDsKLSAgICAgICAgICAgIEZYX0lOVDMyIGlFbmQgPSBtX0RhdGFMaXN0cy5HZXRVcHBlckJvdW5kKCk7Ci0gICAgICAgICAgICBGWF9JTlQzMiBpTWlkID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChpU3RhcnQgPD0gaUVuZCkgewotICAgICAgICAgICAgICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOwotICAgICAgICAgICAgICAgIERhdGFMaXN0KiBsaXN0ID0gbV9EYXRhTGlzdHMuR2V0RGF0YVB0cihpTWlkKTsKLSAgICAgICAgICAgICAgICBpZiAobkluZGV4IDwgbGlzdC0+c3RhcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobkluZGV4ID49IGxpc3QtPnN0YXJ0ICsgbGlzdC0+Y291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcEN1ckxpc3QgPSBsaXN0OwotICAgICAgICAgICAgICAgICAgICBtX0N1ckxpc3QgPSBpTWlkOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBDdXJMaXN0ID8gcEN1ckxpc3QtPmRhdGEgKyAobkluZGV4IC0gcEN1ckxpc3QtPnN0YXJ0KSAqIHVuaXQgOiBOVUxMOwotICAgIH0KLXByb3RlY3RlZDoKLSAgICB2b2lkCQkJQXBwZW5kKGNvbnN0IERhdGFMaXN0JiBsaXN0KQotICAgIHsKLSAgICAgICAgRlhfSU5UMzIgaVN0YXJ0ID0gMDsKLSAgICAgICAgRlhfSU5UMzIgaUVuZCA9IG1fRGF0YUxpc3RzLkdldFVwcGVyQm91bmQoKTsKLSAgICAgICAgRlhfSU5UMzIgaUZpbmQgPSAwOwotICAgICAgICB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpIHsKLSAgICAgICAgICAgIEZYX0lOVDMyIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOwotICAgICAgICAgICAgRGF0YUxpc3QqIGN1cl9saXN0ID0gbV9EYXRhTGlzdHMuR2V0RGF0YVB0cihpTWlkKTsKLSAgICAgICAgICAgIGlmIChsaXN0LnN0YXJ0IDwgY3VyX2xpc3QtPnN0YXJ0ICsgY3VyX2xpc3QtPmNvdW50KSB7Ci0gICAgICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoaU1pZCA9PSBpRW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlGaW5kID0gaU1pZCArIDE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBEYXRhTGlzdCogbmV4dF9saXN0ID0gbV9EYXRhTGlzdHMuR2V0RGF0YVB0cihpTWlkICsgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpc3Quc3RhcnQgPCBuZXh0X2xpc3QtPnN0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlGaW5kID0gaU1pZCArIDE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX0RhdGFMaXN0cy5JbnNlcnRBdChpRmluZCwgbGlzdCk7Ci0gICAgfQotICAgIEZYX0lOVDMyCQltX0N1ckxpc3Q7Ci0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8RGF0YUxpc3Q+CW1fRGF0YUxpc3RzOworICAgIG1fRGF0YUxpc3RzLkluc2VydEF0KGlGaW5kLCBsaXN0KTsKKyAgfQorICBpbnQzMl90IG1fQ3VyTGlzdDsKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8RGF0YUxpc3Q+IG1fRGF0YUxpc3RzOwogfTsKLXRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KLWNsYXNzIENGWF9MaXN0QXJyYXlUZW1wbGF0ZSAKLXsKLXB1YmxpYzoKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitjbGFzcyBDRlhfTGlzdEFycmF5VGVtcGxhdGUgeworIHB1YmxpYzoKKyAgdm9pZCBDbGVhcigpIHsgbV9EYXRhLkNsZWFyKCk7IH0KIAotICAgIHZvaWQJCQlDbGVhcigpCi0gICAgewotICAgICAgICBtX0RhdGEuQ2xlYXIoKTsKLSAgICB9CisgIHZvaWQgQWRkKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCkgeyBtX0RhdGEuQXBwZW5kKG5TdGFydCwgbkNvdW50KTsgfQogCi0gICAgdm9pZAkJCUFkZChGWF9JTlQzMiBuU3RhcnQsIEZYX0lOVDMyIG5Db3VudCkKLSAgICB7Ci0gICAgICAgIG1fRGF0YS5BcHBlbmQoblN0YXJ0LCBuQ291bnQpOwotICAgIH0KKyAgVDImIG9wZXJhdG9yW10oaW50MzJfdCBuSW5kZXgpIHsKKyAgICB1aW50OF90KiBkYXRhID0gbV9EYXRhLkdldEF0KG5JbmRleCk7CisgICAgRlhTWVNfYXNzZXJ0KGRhdGEpOworICAgIHJldHVybiAoVDImKSgqKHZvbGF0aWxlIFQyKilkYXRhKTsKKyAgfQogCi0gICAgVDImCQkJCW9wZXJhdG9yIFtdIChGWF9JTlQzMiBuSW5kZXgpCi0gICAgewotICAgICAgICBGWF9MUEJZVEUgZGF0YSA9IG1fRGF0YS5HZXRBdChuSW5kZXgpOwotICAgICAgICBGWFNZU19hc3NlcnQoZGF0YSAhPSBOVUxMKTsKLSAgICAgICAgcmV0dXJuIChUMiYpKCoodm9sYXRpbGUgVDIqKWRhdGEpOwotICAgIH0KKyAgVDIqIEdldFB0ckF0KGludDMyX3QgbkluZGV4KSB7IHJldHVybiAoVDIqKW1fRGF0YS5HZXRBdChuSW5kZXgpOyB9CiAKLSAgICBUMioJCQkJR2V0UHRyQXQoRlhfSU5UMzIgbkluZGV4KQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUMiopbV9EYXRhLkdldEF0KG5JbmRleCk7Ci0gICAgfQotcHJvdGVjdGVkOgotICAgIFQxCQkJbV9EYXRhOworIHByb3RlY3RlZDoKKyAgVDEgbV9EYXRhOwogfTsKLXR5cGVkZWYgQ0ZYX0xpc3RBcnJheVRlbXBsYXRlPENGWF9Tb3J0TGlzdEFycmF5PHNpemVvZihGWF9GSUxFU0laRSk+LCBGWF9GSUxFU0laRT4JQ0ZYX0ZpbGVTaXplTGlzdEFycmF5OwotdHlwZWRlZiBDRlhfTGlzdEFycmF5VGVtcGxhdGU8Q0ZYX1NvcnRMaXN0QXJyYXk8c2l6ZW9mKEZYX0RXT1JEKT4sIEZYX0RXT1JEPgkJQ0ZYX0RXb3JkTGlzdEFycmF5OwordHlwZWRlZiBDRlhfTGlzdEFycmF5VGVtcGxhdGU8Q0ZYX1NvcnRMaXN0QXJyYXk8c2l6ZW9mKEZYX0ZJTEVTSVpFKT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRT4gQ0ZYX0ZpbGVTaXplTGlzdEFycmF5OworCiB0eXBlZGVmIGVudW0gewotICAgIFJlYWR5LAotICAgIFRvQmVDb250aW51ZWQsCi0gICAgRm91bmQsCi0gICAgTm90Rm91bmQsCi0gICAgRmFpbGVkLAotICAgIERvbmUKKyAgUmVhZHksCisgIFRvQmVDb250aW51ZWQsCisgIEZvdW5kLAorICBOb3RGb3VuZCwKKyAgRmFpbGVkLAorICBEb25lCiB9IEZYX1Byb2dyZXNzaXZlU3RhdHVzOwotI2RlZmluZSBQcm9ncmVzc2l2ZVN0YXR1cwlGWF9Qcm9ncmVzc2l2ZVN0YXR1cwotI2RlZmluZSBGWF9OQU1FU1BBQ0VfREVDTEFSRShuYW1lc3BhY2UsIHR5cGUpICAgICAgIG5hbWVzcGFjZTo6dHlwZQotCi1jbGFzcyBDRlhfVmVjdG9yXzNieTEgCi17Ci1wdWJsaWM6Ci0KLSAgICBDRlhfVmVjdG9yXzNieTEoKSA6Ci0gICAgICAgIGEoMC4wZiksIGIoMC4wZiksIGMoMC4wZikKLSAgICB7fQotCi0gICAgQ0ZYX1ZlY3Rvcl8zYnkxKEZYX0ZMT0FUIGExLCBGWF9GTE9BVCBiMSwgRlhfRkxPQVQgYzEpOgotICAgICAgICBhKGExKSwgYihiMSksIGMoYzEpCi0gICAge30KLQotICAgIEZYX0ZMT0FUIGE7Ci0gICAgRlhfRkxPQVQgYjsKLSAgICBGWF9GTE9BVCBjOworI2RlZmluZSBQcm9ncmVzc2l2ZVN0YXR1cyBGWF9Qcm9ncmVzc2l2ZVN0YXR1cworI2lmZGVmIFBERl9FTkFCTEVfWEZBCitjbGFzcyBJRlhfVW5rbm93biB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JRlhfVW5rbm93bigpIHt9CisgIHZpcnR1YWwgRlhfRFdPUkQgUmVsZWFzZSgpID0gMDsKKyAgdmlydHVhbCBGWF9EV09SRCBBZGRSZWYoKSA9IDA7CiB9OwotY2xhc3MgQ0ZYX01hdHJpeF8zYnkzIAotewotcHVibGljOgorI2RlZmluZSBGWF9Jc09kZChhKSAoKGEpJjEpCisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKLSAgICBDRlhfTWF0cml4XzNieTMoKToKLSAgICAgICAgYSgwLjBmKSwgYigwLjBmKSwgYygwLjBmKSwgZCgwLjBmKSwgZSgwLjBmKSwgZigwLjBmKSwgZygwLjBmKSwgaCgwLjBmKSwgaSgwLjBmKQotICAgIHt9CitjbGFzcyBDRlhfVmVjdG9yXzNieTEgeworIHB1YmxpYzoKKyAgQ0ZYX1ZlY3Rvcl8zYnkxKCkgOiBhKDAuMGYpLCBiKDAuMGYpLCBjKDAuMGYpIHt9CiAKLSAgICBDRlhfTWF0cml4XzNieTMoRlhfRkxPQVQgYTEsIEZYX0ZMT0FUIGIxLCBGWF9GTE9BVCBjMSwgRlhfRkxPQVQgZDEsIEZYX0ZMT0FUIGUxLCBGWF9GTE9BVCBmMSwgRlhfRkxPQVQgZzEsIEZYX0ZMT0FUIGgxLCBGWF9GTE9BVCBpMSkgOgotICAgICAgICBhKGExKSwgYihiMSksIGMoYzEpLCBkKGQxKSwgZShlMSksIGYoZjEpLCBnKGcxKSwgaChoMSksIGkoaTEpCi0gICAge30KKyAgQ0ZYX1ZlY3Rvcl8zYnkxKEZYX0ZMT0FUIGExLCBGWF9GTE9BVCBiMSwgRlhfRkxPQVQgYzEpCisgICAgICA6IGEoYTEpLCBiKGIxKSwgYyhjMSkge30KIAotICAgIENGWF9NYXRyaXhfM2J5MyBJbnZlcnNlKCk7CisgIEZYX0ZMT0FUIGE7CisgIEZYX0ZMT0FUIGI7CisgIEZYX0ZMT0FUIGM7Cit9OworY2xhc3MgQ0ZYX01hdHJpeF8zYnkzIHsKKyBwdWJsaWM6CisgIENGWF9NYXRyaXhfM2J5MygpCisgICAgICA6IGEoMC4wZiksCisgICAgICAgIGIoMC4wZiksCisgICAgICAgIGMoMC4wZiksCisgICAgICAgIGQoMC4wZiksCisgICAgICAgIGUoMC4wZiksCisgICAgICAgIGYoMC4wZiksCisgICAgICAgIGcoMC4wZiksCisgICAgICAgIGgoMC4wZiksCisgICAgICAgIGkoMC4wZikge30KIAotICAgIENGWF9NYXRyaXhfM2J5MyBNdWx0aXBseShjb25zdCBDRlhfTWF0cml4XzNieTMgJm0pOworICBDRlhfTWF0cml4XzNieTMoRlhfRkxPQVQgYTEsCisgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBiMSwKKyAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGMxLAorICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZDEsCisgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBlMSwKKyAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGYxLAorICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZzEsCisgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoMSwKKyAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGkxKQorICAgICAgOiBhKGExKSwgYihiMSksIGMoYzEpLCBkKGQxKSwgZShlMSksIGYoZjEpLCBnKGcxKSwgaChoMSksIGkoaTEpIHt9CiAKLSAgICBDRlhfVmVjdG9yXzNieTEgVHJhbnNmb3JtVmVjdG9yKGNvbnN0IENGWF9WZWN0b3JfM2J5MSAmdik7CisgIENGWF9NYXRyaXhfM2J5MyBJbnZlcnNlKCk7CiAKLSAgICBGWF9GTE9BVCBhOwotICAgIEZYX0ZMT0FUIGI7Ci0gICAgRlhfRkxPQVQgYzsKLSAgICBGWF9GTE9BVCBkOwotICAgIEZYX0ZMT0FUIGU7Ci0gICAgRlhfRkxPQVQgZjsKLSAgICBGWF9GTE9BVCBnOwotICAgIEZYX0ZMT0FUIGg7Ci0gICAgRlhfRkxPQVQgaTsKKyAgQ0ZYX01hdHJpeF8zYnkzIE11bHRpcGx5KGNvbnN0IENGWF9NYXRyaXhfM2J5MyYgbSk7CisKKyAgQ0ZYX1ZlY3Rvcl8zYnkxIFRyYW5zZm9ybVZlY3Rvcihjb25zdCBDRlhfVmVjdG9yXzNieTEmIHYpOworCisgIEZYX0ZMT0FUIGE7CisgIEZYX0ZMT0FUIGI7CisgIEZYX0ZMT0FUIGM7CisgIEZYX0ZMT0FUIGQ7CisgIEZYX0ZMT0FUIGU7CisgIEZYX0ZMT0FUIGY7CisgIEZYX0ZMT0FUIGc7CisgIEZYX0ZMT0FUIGg7CisgIEZYX0ZMT0FUIGk7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GWENSVF9GWF9CQVNJQ19IXwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2JpZGkuaCBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9iaWRpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU1Y2U2YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9iaWRpLmgKQEAgLTAsMCArMSw1OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfSU5DTFVERV9GWENSVF9GWF9CSURJX0hfCisjZGVmaW5lIENPUkVfSU5DTFVERV9GWENSVF9GWF9CSURJX0hfCisKKyNpbmNsdWRlICJmeF9zeXN0ZW0uaCIKKworLy8gUHJvY2Vzc2VzIGNoYXJhY3RlcnMgYW5kIGdyb3VwIHRoZW0gaW50byBzZWdtZW50cyBiYXNlZCBvbiB0ZXh0IGRpcmVjdGlvbi4KK2NsYXNzIENGWF9CaWRpQ2hhciB7CisgcHVibGljOgorICBlbnVtIERpcmVjdGlvbiB7IE5FVVRSQUwsIExFRlQsIFJJR0hUIH07CisKKyAgQ0ZYX0JpZGlDaGFyKCk7CisgIH5DRlhfQmlkaUNoYXIoKTsKKworICAvLyBBcHBlbmQgYSBjaGFyYWN0ZXIgYW5kIGNsYXNzaWZ5IGl0IGFzIGxlZnQsIHJpZ2h0LCBvciBuZXV0cmFsLgorICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNoYXJhY3RlciBoYXMgYSBkaWZmZXJlbnQgZGlyZWN0aW9uIHRoYW4gdGhlCisgIC8vIGV4aXN0aW5nIGRpcmVjdGlvbiB0byBpbmRpY2F0ZSB0aGVyZSBpcyBhIHNlZ21lbnQgdG8gcHJvY2Vzcy4KKyAgYm9vbCBBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCk7CisKKyAgLy8gQ2FsbCB0aGlzIGFmdGVyIHRoZSBsYXN0IGNoYXJhY3RlciBoYXMgYmVlbiBhcHBlbmRlZC4gQXBwZW5kQ2hhcigpCisgIC8vIG11c3Qgbm90IGJlIGNhbGxlZCBhZnRlciB0aGlzLgorICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgc3RpbGwgYSBzZWdtZW50IHRvIHByb2Nlc3MuCisgIGJvb2wgRW5kQ2hhcigpOworCisgIC8vIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VnbWVudCB0byBwcm9jZXNzLgorICAvLyBUaGUgc2VnbWVudCdzIHN0YXJ0IHBvc2l0aW9uIGFuZCBjaGFyYWN0ZXIgY291bnQgaXMgcmV0dXJuZWQgaW4gfGlTdGFydHwKKyAgLy8gYW5kIHxpQ291bnR8LCByZXNwZWN0aXZlbHkuIFBhc3MgaW4gbnVsbCBwb2ludGVycyBpZiB0aGUgaW5mb3JtYXRpb24gaXMKKyAgLy8gbm90IG5lZWRlZC4KKyAgLy8gUmV0dXJucyB0aGUgc2VnbWVudCBkaXJlY3Rpb24uCisgIERpcmVjdGlvbiBHZXRCaWRpSW5mbyhpbnQzMl90KiBpU3RhcnQsIGludDMyX3QqIGlDb3VudCkgY29uc3Q7CisKKyBwcml2YXRlOgorICB2b2lkIFNhdmVDdXJyZW50U3RhdGVUb0xhc3RTdGF0ZSgpOworCisgIC8vIFBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IHNlZ21lbnQuCisgIGludDMyX3QgbV9pQ3VyU3RhcnQ7CisKKyAgLy8gTnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGN1cnJlbnQgc2VnbWVudC4KKyAgaW50MzJfdCBtX2lDdXJDb3VudDsKKworICAvLyBEaXJlY3Rpb24gb2YgdGhlIGN1cnJlbnQgc2VnbWVudC4KKyAgRGlyZWN0aW9uIG1fQ3VyQmlkaTsKKworICAvLyBOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgbGFzdCBzZWdtZW50LgorICBpbnQzMl90IG1faUxhc3RTdGFydDsKKworICAvLyBOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgbGFzdCBzZWdtZW50LgorICBpbnQzMl90IG1faUxhc3RDb3VudDsKKworICAvLyBEaXJlY3Rpb24gb2YgdGhlIGxhc3Qgc2VnbWVudC4KKyAgRGlyZWN0aW9uIG1fTGFzdEJpZGk7Cit9OworCisjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GWENSVF9GWF9CSURJX0hfCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9jb29yZGluYXRlcy5oCmluZGV4IDA3NmMwZTYuLmJiOGYyZjcgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9jb29yZGluYXRlcy5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9jb29yZGluYXRlcy5oCkBAIC0xLDcgKzEsNyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIENPUkVfSU5DTFVERV9GWENSVF9GWF9DT09SRElOQVRFU19IXwpAQCAtOSw4OTkgKzksNzM3IEBACiAKICNpbmNsdWRlICJmeF9iYXNpYy5oIgogCi10ZW1wbGF0ZTxjbGFzcyBiYXNlVHlwZT4gY2xhc3MgQ0ZYX1BTVlRlbXBsYXRlOwotdGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+IGNsYXNzIENGWF9WVGVtcGxhdGU7Ci10ZW1wbGF0ZTxjbGFzcyBiYXNlVHlwZT4gY2xhc3MgQ0ZYX1BSTFRlbXBsYXRlOwotdGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+IGNsYXNzIENGWF9SVGVtcGxhdGU7Ci10ZW1wbGF0ZTxjbGFzcyBiYXNlVHlwZT4gY2xhc3MgQ0ZYX0VUZW1wbGF0ZTsKLXRlbXBsYXRlPGNsYXNzIGJhc2VUeXBlPiBjbGFzcyBDRlhfQVRlbXBsYXRlOwotdGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+IGNsYXNzIENGWF9SUlRlbXBsYXRlOwordGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPgorY2xhc3MgQ0ZYX1BTVlRlbXBsYXRlOwordGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPgorY2xhc3MgQ0ZYX1ZUZW1wbGF0ZTsKK3RlbXBsYXRlIDxjbGFzcyBiYXNlVHlwZT4KK2NsYXNzIENGWF9QUkxUZW1wbGF0ZTsKK3RlbXBsYXRlIDxjbGFzcyBiYXNlVHlwZT4KK2NsYXNzIENGWF9SVGVtcGxhdGU7Cit0ZW1wbGF0ZSA8Y2xhc3MgYmFzZVR5cGU+CitjbGFzcyBDRlhfRVRlbXBsYXRlOwordGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPgorY2xhc3MgQ0ZYX0FUZW1wbGF0ZTsKK3RlbXBsYXRlIDxjbGFzcyBiYXNlVHlwZT4KK2NsYXNzIENGWF9SUlRlbXBsYXRlOwogY2xhc3MgQ0ZYX01hdHJpeDsKLXRlbXBsYXRlPGNsYXNzIGJhc2VUeXBlPgotY2xhc3MgQ0ZYX1BTVlRlbXBsYXRlIAotewotcHVibGljOgotICAgIHR5cGVkZWYgQ0ZYX1BTVlRlbXBsYXRlPGJhc2VUeXBlPglGWFRfUFNWOwotICAgIHR5cGVkZWYgQ0ZYX1BTVlRlbXBsYXRlPGJhc2VUeXBlPglGWFRfUE9JTlQ7Ci0gICAgdHlwZWRlZiBDRlhfUFNWVGVtcGxhdGU8YmFzZVR5cGU+CUZYVF9TSVpFOwotICAgIHZvaWQJCVNldChiYXNlVHlwZSB4LCBiYXNlVHlwZSB5KQotICAgIHsKLSAgICAgICAgRlhUX1BTVjo6eCA9IHgsIEZYVF9QU1Y6OnkgPSB5OwotICAgIH0KLSAgICB2b2lkCQlTZXQoY29uc3QgRlhUX1BTViAmcHN2KQotICAgIHsKLSAgICAgICAgRlhUX1BTVjo6eCA9IHBzdi54LCBGWFRfUFNWOjp5ID0gcHN2Lnk7Ci0gICAgfQotICAgIHZvaWQJCUFkZChiYXNlVHlwZSB4LCBiYXNlVHlwZSB5KQotICAgIHsKLSAgICAgICAgRlhUX1BTVjo6eCArPSB4LCBGWFRfUFNWOjp5ICs9IHk7Ci0gICAgfQotICAgIHZvaWQJCVN1YnRyYWN0KGJhc2VUeXBlIHgsIGJhc2VUeXBlIHkpCi0gICAgewotICAgICAgICBGWFRfUFNWOjp4IC09IHgsIEZYVF9QU1Y6OnkgLT0geTsKLSAgICB9Ci0gICAgdm9pZAkJUmVzZXQoKQotICAgIHsKLSAgICAgICAgRlhUX1BTVjo6eCA9IEZYVF9QU1Y6OnkgPSAwOwotICAgIH0KLSAgICBGWFRfUFNWJglvcGVyYXRvciArPSAoY29uc3QgRlhUX1BTViAmb2JqKQotICAgIHsKLSAgICAgICAgeCArPSBvYmoueDsKLSAgICAgICAgeSArPSBvYmoueTsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgICBGWFRfUFNWJglvcGVyYXRvciAtPSAoY29uc3QgRlhUX1BTViAmb2JqKQotICAgIHsKLSAgICAgICAgeCAtPSBvYmoueDsKLSAgICAgICAgeSAtPSBvYmoueTsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgICBGWFRfUFNWJglvcGVyYXRvciAqPSAoYmFzZVR5cGUgbGFtZGEpCi0gICAgewotICAgICAgICB4ICo9IGxhbWRhOwotICAgICAgICB5ICo9IGxhbWRhOwotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotICAgIEZYVF9QU1YmCW9wZXJhdG9yIC89IChiYXNlVHlwZSBsYW1kYSkKLSAgICB7Ci0gICAgICAgIHggLz0gbGFtZGE7Ci0gICAgICAgIHkgLz0gbGFtZGE7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0gICAgZnJpZW5kCUZYX0JPT0wJCW9wZXJhdG9yID09IChjb25zdCBGWFRfUFNWICZvYmoxLCBjb25zdCBGWFRfUFNWICZvYmoyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG9iajEueCA9PSBvYmoyLnggJiYgb2JqMS55ID09IG9iajIueTsKLSAgICB9Ci0gICAgZnJpZW5kCUZYX0JPT0wJCW9wZXJhdG9yICE9IChjb25zdCBGWFRfUFNWICZvYmoxLCBjb25zdCBGWFRfUFNWICZvYmoyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG9iajEueCAhPSBvYmoyLnggfHwgb2JqMS55ICE9IG9iajIueTsKLSAgICB9Ci0gICAgZnJpZW5kCUZYVF9QU1YJCW9wZXJhdG9yICsgKGNvbnN0IEZYVF9QU1YgJm9iajEsIGNvbnN0IEZYVF9QU1YgJm9iajIpCi0gICAgewotICAgICAgICBDRlhfUFNWVGVtcGxhdGUgb2JqOwotICAgICAgICBvYmoueCA9IG9iajEueCArIG9iajIueDsKLSAgICAgICAgb2JqLnkgPSBvYmoxLnkgKyBvYmoyLnk7Ci0gICAgICAgIHJldHVybiBvYmo7Ci0gICAgfQotICAgIGZyaWVuZAlGWFRfUFNWCQlvcGVyYXRvciAtIChjb25zdCBGWFRfUFNWICZvYmoxLCBjb25zdCBGWFRfUFNWICZvYmoyKQotICAgIHsKLSAgICAgICAgQ0ZYX1BTVlRlbXBsYXRlIG9iajsKLSAgICAgICAgb2JqLnggPSBvYmoxLnggLSBvYmoyLng7Ci0gICAgICAgIG9iai55ID0gb2JqMS55IC0gb2JqMi55OwotICAgICAgICByZXR1cm4gb2JqOwotICAgIH0KLSAgICBmcmllbmQJRlhUX1BTVgkJb3BlcmF0b3IgKiAoY29uc3QgRlhUX1BTViAmb2JqLCBiYXNlVHlwZSBsYW1kYSkKLSAgICB7Ci0gICAgICAgIENGWF9QU1ZUZW1wbGF0ZSB0OwotICAgICAgICB0LnggPSBvYmoueCAqIGxhbWRhOwotICAgICAgICB0LnkgPSBvYmoueSAqIGxhbWRhOwotICAgICAgICByZXR1cm4gdDsKLSAgICB9Ci0gICAgZnJpZW5kCUZYVF9QU1YJCW9wZXJhdG9yICogKGJhc2VUeXBlIGxhbWRhLCBjb25zdCBGWFRfUFNWICZvYmopCi0gICAgewotICAgICAgICBDRlhfUFNWVGVtcGxhdGUgdDsKLSAgICAgICAgdC54ID0gbGFtZGEgKiBvYmoueDsKLSAgICAgICAgdC55ID0gbGFtZGEgKiBvYmoueTsKLSAgICAgICAgcmV0dXJuIHQ7Ci0gICAgfQotICAgIGZyaWVuZAlGWFRfUFNWCQlvcGVyYXRvciAvIChjb25zdCBGWFRfUFNWICZvYmosIGJhc2VUeXBlIGxhbWRhKQotICAgIHsKLSAgICAgICAgQ0ZYX1BTVlRlbXBsYXRlIHQ7Ci0gICAgICAgIHQueCA9IG9iai54IC8gbGFtZGE7Ci0gICAgICAgIHQueSA9IG9iai55IC8gbGFtZGE7Ci0gICAgICAgIHJldHVybiB0OwotICAgIH0KLSAgICBiYXNlVHlwZSB4LCB5OwordGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPgorY2xhc3MgQ0ZYX1BTVlRlbXBsYXRlIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgQ0ZYX1BTVlRlbXBsYXRlPGJhc2VUeXBlPiBGWFRfUFNWOworICB0eXBlZGVmIENGWF9QU1ZUZW1wbGF0ZTxiYXNlVHlwZT4gRlhUX1BPSU5UOworICB0eXBlZGVmIENGWF9QU1ZUZW1wbGF0ZTxiYXNlVHlwZT4gRlhUX1NJWkU7CisgIHZvaWQgU2V0KGJhc2VUeXBlIHgsIGJhc2VUeXBlIHkpIHsgRlhUX1BTVjo6eCA9IHgsIEZYVF9QU1Y6OnkgPSB5OyB9CisgIHZvaWQgU2V0KGNvbnN0IEZYVF9QU1YmIHBzdikgeyBGWFRfUFNWOjp4ID0gcHN2LngsIEZYVF9QU1Y6OnkgPSBwc3YueTsgfQorICB2b2lkIEFkZChiYXNlVHlwZSB4LCBiYXNlVHlwZSB5KSB7IEZYVF9QU1Y6OnggKz0geCwgRlhUX1BTVjo6eSArPSB5OyB9CisgIHZvaWQgU3VidHJhY3QoYmFzZVR5cGUgeCwgYmFzZVR5cGUgeSkgeyBGWFRfUFNWOjp4IC09IHgsIEZYVF9QU1Y6OnkgLT0geTsgfQorICB2b2lkIFJlc2V0KCkgeyBGWFRfUFNWOjp4ID0gRlhUX1BTVjo6eSA9IDA7IH0KKyAgRlhUX1BTViYgb3BlcmF0b3IrPShjb25zdCBGWFRfUFNWJiBvYmopIHsKKyAgICB4ICs9IG9iai54OworICAgIHkgKz0gb2JqLnk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIEZYVF9QU1YmIG9wZXJhdG9yLT0oY29uc3QgRlhUX1BTViYgb2JqKSB7CisgICAgeCAtPSBvYmoueDsKKyAgICB5IC09IG9iai55OworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBGWFRfUFNWJiBvcGVyYXRvcio9KGJhc2VUeXBlIGxhbWRhKSB7CisgICAgeCAqPSBsYW1kYTsKKyAgICB5ICo9IGxhbWRhOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBGWFRfUFNWJiBvcGVyYXRvci89KGJhc2VUeXBlIGxhbWRhKSB7CisgICAgeCAvPSBsYW1kYTsKKyAgICB5IC89IGxhbWRhOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvcj09KGNvbnN0IEZYVF9QU1YmIG9iajEsIGNvbnN0IEZYVF9QU1YmIG9iajIpIHsKKyAgICByZXR1cm4gb2JqMS54ID09IG9iajIueCAmJiBvYmoxLnkgPT0gb2JqMi55OworICB9CisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yIT0oY29uc3QgRlhUX1BTViYgb2JqMSwgY29uc3QgRlhUX1BTViYgb2JqMikgeworICAgIHJldHVybiBvYmoxLnggIT0gb2JqMi54IHx8IG9iajEueSAhPSBvYmoyLnk7CisgIH0KKyAgZnJpZW5kIEZYVF9QU1Ygb3BlcmF0b3IrKGNvbnN0IEZYVF9QU1YmIG9iajEsIGNvbnN0IEZYVF9QU1YmIG9iajIpIHsKKyAgICBDRlhfUFNWVGVtcGxhdGUgb2JqOworICAgIG9iai54ID0gb2JqMS54ICsgb2JqMi54OworICAgIG9iai55ID0gb2JqMS55ICsgb2JqMi55OworICAgIHJldHVybiBvYmo7CisgIH0KKyAgZnJpZW5kIEZYVF9QU1Ygb3BlcmF0b3ItKGNvbnN0IEZYVF9QU1YmIG9iajEsIGNvbnN0IEZYVF9QU1YmIG9iajIpIHsKKyAgICBDRlhfUFNWVGVtcGxhdGUgb2JqOworICAgIG9iai54ID0gb2JqMS54IC0gb2JqMi54OworICAgIG9iai55ID0gb2JqMS55IC0gb2JqMi55OworICAgIHJldHVybiBvYmo7CisgIH0KKyAgZnJpZW5kIEZYVF9QU1Ygb3BlcmF0b3IqKGNvbnN0IEZYVF9QU1YmIG9iaiwgYmFzZVR5cGUgbGFtZGEpIHsKKyAgICBDRlhfUFNWVGVtcGxhdGUgdDsKKyAgICB0LnggPSBvYmoueCAqIGxhbWRhOworICAgIHQueSA9IG9iai55ICogbGFtZGE7CisgICAgcmV0dXJuIHQ7CisgIH0KKyAgZnJpZW5kIEZYVF9QU1Ygb3BlcmF0b3IqKGJhc2VUeXBlIGxhbWRhLCBjb25zdCBGWFRfUFNWJiBvYmopIHsKKyAgICBDRlhfUFNWVGVtcGxhdGUgdDsKKyAgICB0LnggPSBsYW1kYSAqIG9iai54OworICAgIHQueSA9IGxhbWRhICogb2JqLnk7CisgICAgcmV0dXJuIHQ7CisgIH0KKyAgZnJpZW5kIEZYVF9QU1Ygb3BlcmF0b3IvKGNvbnN0IEZYVF9QU1YmIG9iaiwgYmFzZVR5cGUgbGFtZGEpIHsKKyAgICBDRlhfUFNWVGVtcGxhdGUgdDsKKyAgICB0LnggPSBvYmoueCAvIGxhbWRhOworICAgIHQueSA9IG9iai55IC8gbGFtZGE7CisgICAgcmV0dXJuIHQ7CisgIH0KKyAgYmFzZVR5cGUgeCwgeTsKIH07Ci10eXBlZGVmIENGWF9QU1ZUZW1wbGF0ZTxGWF9JTlQzMj4JCQlDRlhfUG9pbnQ7Ci10eXBlZGVmIENGWF9QU1ZUZW1wbGF0ZTxGWF9GTE9BVD4JCQlDRlhfUG9pbnRGOwotdHlwZWRlZiBDRlhfUFNWVGVtcGxhdGU8RlhfSU5UMzI+CQkJQ0ZYX1NpemU7Ci10eXBlZGVmIENGWF9QU1ZUZW1wbGF0ZTxGWF9GTE9BVD4JCQlDRlhfU2l6ZUY7Ci10eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPENGWF9Qb2ludD4JCUNGWF9Qb2ludHM7Ci10eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPENGWF9Qb2ludEY+CQlDRlhfUG9pbnRzRjsKLXR5cGVkZWYgQ0ZYX1BTVlRlbXBsYXRlPEZYX0lOVDMyPiAqCQkJRlhfTFBQT0lOVDsKLXR5cGVkZWYgQ0ZYX1BTVlRlbXBsYXRlPEZYX0ZMT0FUPiAqCQkJRlhfTFBQT0lOVEY7Ci10eXBlZGVmIENGWF9QU1ZUZW1wbGF0ZTxGWF9JTlQzMj4gY29uc3QgKglGWF9MUENQT0lOVDsKLXR5cGVkZWYgQ0ZYX1BTVlRlbXBsYXRlPEZYX0ZMT0FUPiBjb25zdCAqCUZYX0xQQ1BPSU5URjsKLSNkZWZpbmUgQ0ZYX0Zsb2F0UG9pbnQJQ0ZYX1BvaW50RgotdGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+Ci1jbGFzcyBDRlhfVlRlbXBsYXRlOiBwdWJsaWMgQ0ZYX1BTVlRlbXBsYXRlPGJhc2VUeXBlPgotewotcHVibGljOgotICAgIHR5cGVkZWYgQ0ZYX1BTVlRlbXBsYXRlPGJhc2VUeXBlPglGWFRfUFNWOwotICAgIHR5cGVkZWYgQ0ZYX1BTVlRlbXBsYXRlPGJhc2VUeXBlPglGWFRfUE9JTlQ7Ci0gICAgdHlwZWRlZiBDRlhfUFNWVGVtcGxhdGU8YmFzZVR5cGU+CUZYVF9TSVpFOwotICAgIHR5cGVkZWYgQ0ZYX1ZUZW1wbGF0ZTxiYXNlVHlwZT4JCUZYVF9WRUNUT1I7Ci0gICAgdm9pZAkJU2V0KGJhc2VUeXBlIG5ld3gsIGJhc2VUeXBlIG5ld3kpCi0gICAgewotICAgICAgICBGWFRfUFNWOjp4ID0gbmV3eDsKLSAgICAgICAgRlhUX1BTVjo6eSA9IG5ld3k7Cit0eXBlZGVmIENGWF9QU1ZUZW1wbGF0ZTxpbnQzMl90PiBDRlhfUG9pbnQ7Cit0eXBlZGVmIENGWF9QU1ZUZW1wbGF0ZTxGWF9GTE9BVD4gQ0ZYX1BvaW50RjsKK3R5cGVkZWYgQ0ZYX1BTVlRlbXBsYXRlPGludDMyX3Q+IENGWF9TaXplOwordHlwZWRlZiBDRlhfUFNWVGVtcGxhdGU8RlhfRkxPQVQ+IENGWF9TaXplRjsKK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8Q0ZYX1BvaW50PiBDRlhfUG9pbnRzOwordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxDRlhfUG9pbnRGPiBDRlhfUG9pbnRzRjsKK3R5cGVkZWYgQ0ZYX1BTVlRlbXBsYXRlPGludDMyX3Q+KiBGWF9MUFBPSU5UOwordHlwZWRlZiBDRlhfUFNWVGVtcGxhdGU8RlhfRkxPQVQ+KiBGWF9MUFBPSU5URjsKK3R5cGVkZWYgQ0ZYX1BTVlRlbXBsYXRlPGludDMyX3Q+IGNvbnN0KiBGWF9MUENQT0lOVDsKK3R5cGVkZWYgQ0ZYX1BTVlRlbXBsYXRlPEZYX0ZMT0FUPiBjb25zdCogRlhfTFBDUE9JTlRGOworI2RlZmluZSBDRlhfRmxvYXRQb2ludCBDRlhfUG9pbnRGCit0ZW1wbGF0ZSA8Y2xhc3MgYmFzZVR5cGU+CitjbGFzcyBDRlhfVlRlbXBsYXRlIDogcHVibGljIENGWF9QU1ZUZW1wbGF0ZTxiYXNlVHlwZT4geworIHB1YmxpYzoKKyAgdHlwZWRlZiBDRlhfUFNWVGVtcGxhdGU8YmFzZVR5cGU+IEZYVF9QU1Y7CisgIHR5cGVkZWYgQ0ZYX1BTVlRlbXBsYXRlPGJhc2VUeXBlPiBGWFRfUE9JTlQ7CisgIHR5cGVkZWYgQ0ZYX1BTVlRlbXBsYXRlPGJhc2VUeXBlPiBGWFRfU0laRTsKKyAgdHlwZWRlZiBDRlhfVlRlbXBsYXRlPGJhc2VUeXBlPiBGWFRfVkVDVE9SOworICB2b2lkIFNldChiYXNlVHlwZSBuZXd4LCBiYXNlVHlwZSBuZXd5KSB7CisgICAgRlhUX1BTVjo6eCA9IG5ld3g7CisgICAgRlhUX1BTVjo6eSA9IG5ld3k7CisgIH0KKyAgdm9pZCBTZXQoY29uc3QgRlhUX1BTViYgcHN2KSB7IEZYVF9QU1Y6OnggPSBwc3YueCwgRlhUX1BTVjo6eSA9IHBzdi55OyB9CisgIHZvaWQgU2V0KGNvbnN0IEZYVF9QT0lOVCYgcDEsIGNvbnN0IEZYVF9QT0lOVCYgcDIpIHsKKyAgICBGWFRfUFNWOjp4ID0gcDIueCAtIHAxLngsIEZYVF9QU1Y6OnkgPSBwMi55IC0gcDEueTsKKyAgfQorICB2b2lkIFJlc2V0KCkgeyBGWFRfUFNWOjp4ID0gRlhUX1BTVjo6eSA9IDA7IH0KKyAgYmFzZVR5cGUgU3F1YXJlTGVuZ3RoKCkgY29uc3QgeworICAgIHJldHVybiBGWFRfUFNWOjp4ICogRlhUX1BTVjo6eCArIEZYVF9QU1Y6OnkgKiBGWFRfUFNWOjp5OworICB9CisgIGJhc2VUeXBlIExlbmd0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRlhTWVNfc3FydChGWFRfUFNWOjp4ICogRlhUX1BTVjo6eCArIEZYVF9QU1Y6OnkgKiBGWFRfUFNWOjp5KTsKKyAgfQorICB2b2lkIE5vcm1hbGl6ZSgpIHsKKyAgICBGWF9GTE9BVCBmTGVuID0KKyAgICAgICAgRlhTWVNfc3FydChGWFRfUFNWOjp4ICogRlhUX1BTVjo6eCArIEZYVF9QU1Y6OnkgKiBGWFRfUFNWOjp5KTsKKyAgICBpZiAoZkxlbiA8IDAuMDAwMWYpIHsKKyAgICAgIHJldHVybjsKICAgICB9Ci0gICAgdm9pZAkJU2V0KGNvbnN0IEZYVF9QU1YgJnBzdikKLSAgICB7Ci0gICAgICAgIEZYVF9QU1Y6OnggPSBwc3YueCwgRlhUX1BTVjo6eSA9IHBzdi55OwotICAgIH0KLSAgICB2b2lkCQlTZXQoY29uc3QgRlhUX1BPSU5UICZwMSwgY29uc3QgRlhUX1BPSU5UICZwMikKLSAgICB7Ci0gICAgICAgIEZYVF9QU1Y6OnggPSBwMi54IC0gcDEueCwgRlhUX1BTVjo6eSA9IHAyLnkgLSBwMS55OwotICAgIH0KLSAgICB2b2lkCQlSZXNldCgpCi0gICAgewotICAgICAgICBGWFRfUFNWOjp4ID0gRlhUX1BTVjo6eSA9IDA7Ci0gICAgfQotICAgIGJhc2VUeXBlCVNxdWFyZUxlbmd0aCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gRlhUX1BTVjo6eCAqIEZYVF9QU1Y6OnggKyBGWFRfUFNWOjp5ICogRlhUX1BTVjo6eTsKLSAgICB9Ci0gICAgYmFzZVR5cGUJTGVuZ3RoKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBGWFNZU19zcXJ0KEZYVF9QU1Y6OnggKiBGWFRfUFNWOjp4ICsgRlhUX1BTVjo6eSAqIEZYVF9QU1Y6OnkpOwotICAgIH0KLSAgICB2b2lkCQlOb3JtYWxpemUoKQotICAgIHsKLSAgICAgICAgRlhfRkxPQVQgZkxlbiA9IEZYU1lTX3NxcnQoRlhUX1BTVjo6eCAqIEZYVF9QU1Y6OnggKyBGWFRfUFNWOjp5ICogRlhUX1BTVjo6eSk7Ci0gICAgICAgIGlmIChmTGVuIDwgMC4wMDAxZikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIEZYVF9QU1Y6OnggPSAoKGJhc2VUeXBlKUZYVF9QU1Y6OngpIC8gZkxlbjsKLSAgICAgICAgRlhUX1BTVjo6eSA9ICgoYmFzZVR5cGUpRlhUX1BTVjo6eSkgLyBmTGVuOwotICAgIH0KLSAgICBiYXNlVHlwZQlEb3RQcm9kdWN0KGJhc2VUeXBlIG90aGVyeCwgYmFzZVR5cGUgb3RoZXJ5KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIEZYVF9QU1Y6OnggKiBvdGhlcnggKyBGWFRfUFNWOjp5ICogb3RoZXJ5OwotICAgIH0KLSAgICBiYXNlVHlwZQlEb3RQcm9kdWN0KGNvbnN0IEZYVF9WRUNUT1IgJnYpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gRlhUX1BTVjo6eCAqIHYueCArIEZYVF9QU1Y6OnkgKiB2Lnk7Ci0gICAgfQotICAgIEZYX0JPT0wJCUlzUGFyYWxsZWwoYmFzZVR5cGUgb3RoZXJ4LCBiYXNlVHlwZSBvdGhlcnkpIGNvbnN0Ci0gICAgewotICAgICAgICBiYXNlVHlwZSB0ID0gRlhUX1BTVjo6eCAqIG90aGVyeSAtIEZYVF9QU1Y6OnkgKiBvdGhlcng7Ci0gICAgICAgIHJldHVybiBGWFNZU19mYWJzKHQpIDwgMHgwMDAxZjsKLSAgICB9Ci0gICAgRlhfQk9PTAkJSXNQYXJhbGxlbChjb25zdCBGWFRfVkVDVE9SICZ2KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIElzUGFyYWxsZWwodi54LCB2LnkpOwotICAgIH0KLSAgICBGWF9CT09MCQlJc1BlcnBlbmRpY3VsYXIoYmFzZVR5cGUgb3RoZXJ4LCBiYXNlVHlwZSBvdGhlcnkpIGNvbnN0Ci0gICAgewotICAgICAgICBiYXNlVHlwZSB0ID0gRG90UHJvZHVjdChvdGhlcngsIG90aGVyeSk7Ci0gICAgICAgIHJldHVybiBGWFNZU19mYWJzKHQpIDwgMHgwMDAxZjsKLSAgICB9Ci0gICAgRlhfQk9PTAkJSXNQZXJwZW5kaWN1bGFyKGNvbnN0IEZYVF9WRUNUT1IgJnYpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gSXNQZXJwZW5kaWN1bGFyKHYueCwgdi55KTsKLSAgICB9Ci0gICAgdm9pZAkJVHJhbnNsYXRlKGJhc2VUeXBlIGR4LCBiYXNlVHlwZSBkeSkKLSAgICB7Ci0gICAgICAgIEZYVF9QU1Y6OnggKz0gZHgsIEZYVF9QU1Y6OnkgKz0gZHk7Ci0gICAgfQotICAgIHZvaWQJCVNjYWxlKGJhc2VUeXBlIHN4LCBiYXNlVHlwZSBzeSkKLSAgICB7Ci0gICAgICAgIEZYVF9QU1Y6OnggKj0gc3gsIEZYVF9QU1Y6OnkgKj0gc3k7Ci0gICAgfQotICAgIHZvaWQJCVJvdGF0ZShGWF9GTE9BVCBmUmFkaWFuKQotICAgIHsKLSAgICAgICAgRlhfRkxPQVQgeHggPSAoRlhfRkxPQVQpRlhUX1BTVjo6eDsKLSAgICAgICAgRlhfRkxPQVQgeXkgPSAoRlhfRkxPQVQpRlhUX1BTVjo6eTsKLSAgICAgICAgRlhfRkxPQVQgY29zVmFsdWUgPSBGWFNZU19jb3MoZlJhZGlhbik7Ci0gICAgICAgIEZYX0ZMT0FUIHNpblZhbHVlID0gRlhTWVNfc2luKGZSYWRpYW4pOwotICAgICAgICBGWFRfUFNWOjp4ID0geHggKiBjb3NWYWx1ZSAtIHl5ICogc2luVmFsdWU7Ci0gICAgICAgIEZYVF9QU1Y6OnkgPSB4eCAqIHNpblZhbHVlICsgeXkgKiBjb3NWYWx1ZTsKLSAgICB9Ci0gICAgZnJpZW5kCUZYX0ZMT0FUCUNvc2luZShjb25zdCBGWFRfVkVDVE9SICZ2MSwgY29uc3QgRlhUX1ZFQ1RPUiAmdjIpCi0gICAgewotICAgICAgICBGWFNZU19hc3NlcnQodjEuU3F1YXJlTGVuZ3RoKCkgIT0gMCAmJiB2Mi5TcXVhcmVMZW5ndGgoKSAhPSAwKTsKLSAgICAgICAgRlhfRkxPQVQgZG90UHJvZHVjdCA9IHYxLkRvdFByb2R1Y3QodjIpOwotICAgICAgICByZXR1cm4gZG90UHJvZHVjdCAvIChGWF9GTE9BVClGWFNZU19zcXJ0KHYxLlNxdWFyZUxlbmd0aCgpICogdjIuU3F1YXJlTGVuZ3RoKCkpOwotICAgIH0KLSAgICBmcmllbmQJRlhfRkxPQVQJQXJjQ29zaW5lKGNvbnN0IEZYVF9WRUNUT1IgJnYxLCBjb25zdCBGWFRfVkVDVE9SICZ2MikKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRlhfRkxPQVQpRlhTWVNfYWNvcyhDb3NpbmUodjEsIHYyKSk7Ci0gICAgfQotICAgIGZyaWVuZAlGWF9GTE9BVAlTbG9wZUFuZ2xlKGNvbnN0IEZYVF9WRUNUT1IgJnYpCi0gICAgewotICAgICAgICBDRlhfVlRlbXBsYXRlIHZ4OwotICAgICAgICB2eC5TZXQoMSwgMCk7Ci0gICAgICAgIEZYX0ZMT0FUIGZTbG9wZSA9IEFyY0Nvc2luZSh2LCB2eCk7Ci0gICAgICAgIHJldHVybiB2LnkgPCAwID8gLWZTbG9wZSA6IGZTbG9wZTsKLSAgICB9CisgICAgRlhUX1BTVjo6eCA9ICgoYmFzZVR5cGUpRlhUX1BTVjo6eCkgLyBmTGVuOworICAgIEZYVF9QU1Y6OnkgPSAoKGJhc2VUeXBlKUZYVF9QU1Y6OnkpIC8gZkxlbjsKKyAgfQorICBiYXNlVHlwZSBEb3RQcm9kdWN0KGJhc2VUeXBlIG90aGVyeCwgYmFzZVR5cGUgb3RoZXJ5KSBjb25zdCB7CisgICAgcmV0dXJuIEZYVF9QU1Y6OnggKiBvdGhlcnggKyBGWFRfUFNWOjp5ICogb3RoZXJ5OworICB9CisgIGJhc2VUeXBlIERvdFByb2R1Y3QoY29uc3QgRlhUX1ZFQ1RPUiYgdikgY29uc3QgeworICAgIHJldHVybiBGWFRfUFNWOjp4ICogdi54ICsgRlhUX1BTVjo6eSAqIHYueTsKKyAgfQorICBGWF9CT09MIElzUGFyYWxsZWwoYmFzZVR5cGUgb3RoZXJ4LCBiYXNlVHlwZSBvdGhlcnkpIGNvbnN0IHsKKyAgICBiYXNlVHlwZSB0ID0gRlhUX1BTVjo6eCAqIG90aGVyeSAtIEZYVF9QU1Y6OnkgKiBvdGhlcng7CisgICAgcmV0dXJuIEZYU1lTX2ZhYnModCkgPCAweDAwMDFmOworICB9CisgIEZYX0JPT0wgSXNQYXJhbGxlbChjb25zdCBGWFRfVkVDVE9SJiB2KSBjb25zdCB7IHJldHVybiBJc1BhcmFsbGVsKHYueCwgdi55KTsgfQorICBGWF9CT09MIElzUGVycGVuZGljdWxhcihiYXNlVHlwZSBvdGhlcngsIGJhc2VUeXBlIG90aGVyeSkgY29uc3QgeworICAgIGJhc2VUeXBlIHQgPSBEb3RQcm9kdWN0KG90aGVyeCwgb3RoZXJ5KTsKKyAgICByZXR1cm4gRlhTWVNfZmFicyh0KSA8IDB4MDAwMWY7CisgIH0KKyAgRlhfQk9PTCBJc1BlcnBlbmRpY3VsYXIoY29uc3QgRlhUX1ZFQ1RPUiYgdikgY29uc3QgeworICAgIHJldHVybiBJc1BlcnBlbmRpY3VsYXIodi54LCB2LnkpOworICB9CisgIHZvaWQgVHJhbnNsYXRlKGJhc2VUeXBlIGR4LCBiYXNlVHlwZSBkeSkgeworICAgIEZYVF9QU1Y6OnggKz0gZHgsIEZYVF9QU1Y6OnkgKz0gZHk7CisgIH0KKyAgdm9pZCBTY2FsZShiYXNlVHlwZSBzeCwgYmFzZVR5cGUgc3kpIHsgRlhUX1BTVjo6eCAqPSBzeCwgRlhUX1BTVjo6eSAqPSBzeTsgfQorICB2b2lkIFJvdGF0ZShGWF9GTE9BVCBmUmFkaWFuKSB7CisgICAgRlhfRkxPQVQgeHggPSAoRlhfRkxPQVQpRlhUX1BTVjo6eDsKKyAgICBGWF9GTE9BVCB5eSA9IChGWF9GTE9BVClGWFRfUFNWOjp5OworICAgIEZYX0ZMT0FUIGNvc1ZhbHVlID0gRlhTWVNfY29zKGZSYWRpYW4pOworICAgIEZYX0ZMT0FUIHNpblZhbHVlID0gRlhTWVNfc2luKGZSYWRpYW4pOworICAgIEZYVF9QU1Y6OnggPSB4eCAqIGNvc1ZhbHVlIC0geXkgKiBzaW5WYWx1ZTsKKyAgICBGWFRfUFNWOjp5ID0geHggKiBzaW5WYWx1ZSArIHl5ICogY29zVmFsdWU7CisgIH0KKyAgZnJpZW5kIEZYX0ZMT0FUIENvc2luZShjb25zdCBGWFRfVkVDVE9SJiB2MSwgY29uc3QgRlhUX1ZFQ1RPUiYgdjIpIHsKKyAgICBGWFNZU19hc3NlcnQodjEuU3F1YXJlTGVuZ3RoKCkgIT0gMCAmJiB2Mi5TcXVhcmVMZW5ndGgoKSAhPSAwKTsKKyAgICBGWF9GTE9BVCBkb3RQcm9kdWN0ID0gdjEuRG90UHJvZHVjdCh2Mik7CisgICAgcmV0dXJuIGRvdFByb2R1Y3QgLworICAgICAgICAgICAoRlhfRkxPQVQpRlhTWVNfc3FydCh2MS5TcXVhcmVMZW5ndGgoKSAqIHYyLlNxdWFyZUxlbmd0aCgpKTsKKyAgfQorICBmcmllbmQgRlhfRkxPQVQgQXJjQ29zaW5lKGNvbnN0IEZYVF9WRUNUT1ImIHYxLCBjb25zdCBGWFRfVkVDVE9SJiB2MikgeworICAgIHJldHVybiAoRlhfRkxPQVQpRlhTWVNfYWNvcyhDb3NpbmUodjEsIHYyKSk7CisgIH0KKyAgZnJpZW5kIEZYX0ZMT0FUIFNsb3BlQW5nbGUoY29uc3QgRlhUX1ZFQ1RPUiYgdikgeworICAgIENGWF9WVGVtcGxhdGUgdng7CisgICAgdnguU2V0KDEsIDApOworICAgIEZYX0ZMT0FUIGZTbG9wZSA9IEFyY0Nvc2luZSh2LCB2eCk7CisgICAgcmV0dXJuIHYueSA8IDAgPyAtZlNsb3BlIDogZlNsb3BlOworICB9CiB9OwotdHlwZWRlZiBDRlhfVlRlbXBsYXRlPEZYX0lOVDMyPiBDRlhfVmVjdG9yOwordHlwZWRlZiBDRlhfVlRlbXBsYXRlPGludDMyX3Q+IENGWF9WZWN0b3I7CiB0eXBlZGVmIENGWF9WVGVtcGxhdGU8RlhfRkxPQVQ+IENGWF9WZWN0b3JGOwotdGVtcGxhdGU8Y2xhc3MgYmFzZVR5cGU+Ci1jbGFzcyBDRlhfUlRlbXBsYXRlCi17Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBDRlhfUFNWVGVtcGxhdGU8YmFzZVR5cGU+CUZYVF9QT0lOVDsKLSAgICB0eXBlZGVmIENGWF9QU1ZUZW1wbGF0ZTxiYXNlVHlwZT4JRlhUX1NJWkU7Ci0gICAgdHlwZWRlZiBDRlhfVlRlbXBsYXRlPGJhc2VUeXBlPgkJRlhUX1ZFQ1RPUjsKLSAgICB0eXBlZGVmIENGWF9QUkxUZW1wbGF0ZTxiYXNlVHlwZT4JRlhUX1BBUkFMOwotICAgIHR5cGVkZWYgQ0ZYX1JUZW1wbGF0ZTxiYXNlVHlwZT4JCUZYVF9SRUNUOwotICAgIHZvaWQJCVNldChiYXNlVHlwZSBsZWZ0LCBiYXNlVHlwZSB0b3AsIGJhc2VUeXBlIHdpZHRoLCBiYXNlVHlwZSBoZWlnaHQpCi0gICAgewotICAgICAgICBGWFRfUkVDVDo6bGVmdCA9IGxlZnQsIEZYVF9SRUNUOjp0b3AgPSB0b3AsIEZYVF9SRUNUOjp3aWR0aCA9IHdpZHRoLCBGWFRfUkVDVDo6aGVpZ2h0ID0gaGVpZ2h0OwordGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPgorY2xhc3MgQ0ZYX1JUZW1wbGF0ZSB7CisgcHVibGljOgorICB0eXBlZGVmIENGWF9QU1ZUZW1wbGF0ZTxiYXNlVHlwZT4gRlhUX1BPSU5UOworICB0eXBlZGVmIENGWF9QU1ZUZW1wbGF0ZTxiYXNlVHlwZT4gRlhUX1NJWkU7CisgIHR5cGVkZWYgQ0ZYX1ZUZW1wbGF0ZTxiYXNlVHlwZT4gRlhUX1ZFQ1RPUjsKKyAgdHlwZWRlZiBDRlhfUFJMVGVtcGxhdGU8YmFzZVR5cGU+IEZYVF9QQVJBTDsKKyAgdHlwZWRlZiBDRlhfUlRlbXBsYXRlPGJhc2VUeXBlPiBGWFRfUkVDVDsKKyAgdm9pZCBTZXQoYmFzZVR5cGUgbGVmdCwgYmFzZVR5cGUgdG9wLCBiYXNlVHlwZSB3aWR0aCwgYmFzZVR5cGUgaGVpZ2h0KSB7CisgICAgRlhUX1JFQ1Q6OmxlZnQgPSBsZWZ0LCBGWFRfUkVDVDo6dG9wID0gdG9wLCBGWFRfUkVDVDo6d2lkdGggPSB3aWR0aCwKKyAgICBGWFRfUkVDVDo6aGVpZ2h0ID0gaGVpZ2h0OworICB9CisgIHZvaWQgU2V0KGJhc2VUeXBlIGxlZnQsIGJhc2VUeXBlIHRvcCwgY29uc3QgRlhUX1NJWkUmIHNpemUpIHsKKyAgICBGWFRfUkVDVDo6bGVmdCA9IGxlZnQsIEZYVF9SRUNUOjp0b3AgPSB0b3AsIEZYVF9SRUNUOjpTaXplKHNpemUpOworICB9CisgIHZvaWQgU2V0KGNvbnN0IEZYVF9QT0lOVCYgcCwgYmFzZVR5cGUgd2lkdGgsIGJhc2VUeXBlIGhlaWdodCkgeworICAgIFRvcExlZnQocCksIEZYVF9SRUNUOjp3aWR0aCA9IHdpZHRoLCBGWFRfUkVDVDo6aGVpZ2h0ID0gaGVpZ2h0OworICB9CisgIHZvaWQgU2V0KGNvbnN0IEZYVF9QT0lOVCYgcDEsIGNvbnN0IEZYVF9QT0lOVCYgcDIpIHsKKyAgICBUb3BMZWZ0KHAxKSwgRlhUX1JFQ1Q6OndpZHRoID0gcDIueCAtIHAxLngsIEZYVF9SRUNUOjpoZWlnaHQgPSBwMi55IC0gcDEueSwKKyAgICAgICAgICAgICAgICAgRlhUX1JFQ1Q6Ok5vcm1hbGl6ZSgpOworICB9CisgIHZvaWQgU2V0KGNvbnN0IEZYVF9QT0lOVCYgcCwgY29uc3QgRlhUX1ZFQ1RPUiYgdikgeworICAgIFRvcExlZnQocCksIEZYVF9SRUNUOjp3aWR0aCA9IHYueCwgRlhUX1JFQ1Q6OmhlaWdodCA9IHYueSwKKyAgICAgICAgICAgICAgICBGWFRfUkVDVDo6Tm9ybWFsaXplKCk7CisgIH0KKyAgdm9pZCBSZXNldCgpIHsKKyAgICBGWFRfUkVDVDo6bGVmdCA9IEZYVF9SRUNUOjp0b3AgPSBGWFRfUkVDVDo6d2lkdGggPSBGWFRfUkVDVDo6aGVpZ2h0ID0gMDsKKyAgfQorICBGWFRfUkVDVCYgb3BlcmF0b3IrPShjb25zdCBGWFRfUE9JTlQmIHApIHsKKyAgICBsZWZ0ICs9IHAueCwgdG9wICs9IHAueTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgRlhUX1JFQ1QmIG9wZXJhdG9yLT0oY29uc3QgRlhUX1BPSU5UJiBwKSB7CisgICAgbGVmdCAtPSBwLngsIHRvcCAtPSBwLnk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGJhc2VUeXBlIHJpZ2h0KCkgY29uc3QgeyByZXR1cm4gbGVmdCArIHdpZHRoOyB9CisgIGJhc2VUeXBlIGJvdHRvbSgpIGNvbnN0IHsgcmV0dXJuIHRvcCArIGhlaWdodDsgfQorICB2b2lkIE5vcm1hbGl6ZSgpIHsKKyAgICBpZiAod2lkdGggPCAwKSB7CisgICAgICBsZWZ0ICs9IHdpZHRoOworICAgICAgd2lkdGggPSAtd2lkdGg7CiAgICAgfQotICAgIHZvaWQJCVNldChiYXNlVHlwZSBsZWZ0LCBiYXNlVHlwZSB0b3AsIGNvbnN0IEZYVF9TSVpFICZzaXplKQotICAgIHsKLSAgICAgICAgRlhUX1JFQ1Q6OmxlZnQgPSBsZWZ0LCBGWFRfUkVDVDo6dG9wID0gdG9wLCBGWFRfUkVDVDo6U2l6ZShzaXplKTsKKyAgICBpZiAoaGVpZ2h0IDwgMCkgeworICAgICAgdG9wICs9IGhlaWdodDsKKyAgICAgIGhlaWdodCA9IC1oZWlnaHQ7CiAgICAgfQotICAgIHZvaWQJCVNldChjb25zdCBGWFRfUE9JTlQgJnAsIGJhc2VUeXBlIHdpZHRoLCBiYXNlVHlwZSBoZWlnaHQpCi0gICAgewotICAgICAgICBUb3BMZWZ0KHApLCBGWFRfUkVDVDo6d2lkdGggPSB3aWR0aCwgRlhUX1JFQ1Q6OmhlaWdodCA9IGhlaWdodDsKKyAgfQorICB2b2lkIE9mZnNldChiYXNlVHlwZSBkeCwgYmFzZVR5cGUgZHkpIHsKKyAgICBsZWZ0ICs9IGR4OworICAgIHRvcCArPSBkeTsKKyAgfQorICB2b2lkIEluZmxhdGUoYmFzZVR5cGUgeCwgYmFzZVR5cGUgeSkgeworICAgIGxlZnQgLT0geDsKKyAgICB3aWR0aCArPSB4ICogMjsKKyAgICB0b3AgLT0geTsKKyAgICBoZWlnaHQgKz0geSAqIDI7CisgIH0KKyAgdm9pZCBJbmZsYXRlKGNvbnN0IEZYVF9QT0lOVCYgcCkgeyBJbmZsYXRlKHAueCwgcC55KTsgfQorICB2b2lkIEluZmxhdGUoYmFzZVR5cGUgbGVmdCwgYmFzZVR5cGUgdG9wLCBiYXNlVHlwZSByaWdodCwgYmFzZVR5cGUgYm90dG9tKSB7CisgICAgRlhUX1JFQ1Q6OmxlZnQgLT0gbGVmdDsKKyAgICBGWFRfUkVDVDo6dG9wIC09IHRvcDsKKyAgICBGWFRfUkVDVDo6d2lkdGggKz0gbGVmdCArIHJpZ2h0OworICAgIEZYVF9SRUNUOjpoZWlnaHQgKz0gdG9wICsgYm90dG9tOworICB9CisgIHZvaWQgSW5mbGF0ZShjb25zdCBGWFRfUkVDVCYgcnQpIHsKKyAgICBJbmZsYXRlKHJ0LmxlZnQsIHJ0LnRvcCwgcnQubGVmdCArIHJ0LndpZHRoLCBydC50b3AgKyBydC5oZWlnaHQpOworICB9CisgIHZvaWQgRGVmbGF0ZShiYXNlVHlwZSB4LCBiYXNlVHlwZSB5KSB7CisgICAgbGVmdCArPSB4OworICAgIHdpZHRoIC09IHggKiAyOworICAgIHRvcCArPSB5OworICAgIGhlaWdodCAtPSB5ICogMjsKKyAgfQorICB2b2lkIERlZmxhdGUoY29uc3QgRlhUX1BPSU5UJiBwKSB7IERlZmxhdGUocC54LCBwLnkpOyB9CisgIHZvaWQgRGVmbGF0ZShiYXNlVHlwZSBsZWZ0LCBiYXNlVHlwZSB0b3AsIGJhc2VUeXBlIHJpZ2h0LCBiYXNlVHlwZSBib3R0b20pIHsKKyAgICBGWFRfUkVDVDo6bGVmdCArPSBsZWZ0OworICAgIEZYVF9SRUNUOjp0b3AgKz0gdG9wOworICAgIEZYVF9SRUNUOjp3aWR0aCAtPSBsZWZ0ICsgcmlnaHQ7CisgICAgRlhUX1JFQ1Q6OmhlaWdodCAtPSB0b3AgKyBib3R0b207CisgIH0KKyAgdm9pZCBEZWZsYXRlKGNvbnN0IEZYVF9SRUNUJiBydCkgeworICAgIERlZmxhdGUocnQubGVmdCwgcnQudG9wLCBydC50b3AgKyBydC53aWR0aCwgcnQudG9wICsgcnQuaGVpZ2h0KTsKKyAgfQorICBGWF9CT09MIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiB3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwOyB9CisgIEZYX0JPT0wgSXNFbXB0eShGWF9GTE9BVCBmRXBzaWxvbikgY29uc3QgeworICAgIHJldHVybiB3aWR0aCA8PSBmRXBzaWxvbiB8fCBoZWlnaHQgPD0gZkVwc2lsb247CisgIH0KKyAgdm9pZCBFbXB0eSgpIHsgd2lkdGggPSBoZWlnaHQgPSAwOyB9CisgIEZYX0JPT0wgQ29udGFpbnMoYmFzZVR5cGUgeCwgYmFzZVR5cGUgeSkgY29uc3QgeworICAgIHJldHVybiB4ID49IGxlZnQgJiYgeCA8IGxlZnQgKyB3aWR0aCAmJiB5ID49IHRvcCAmJiB5IDwgdG9wICsgaGVpZ2h0OworICB9CisgIEZYX0JPT0wgQ29udGFpbnMoY29uc3QgRlhUX1BPSU5UJiBwKSBjb25zdCB7IHJldHVybiBDb250YWlucyhwLngsIHAueSk7IH0KKyAgRlhfQk9PTCBDb250YWlucyhjb25zdCBGWFRfUkVDVCYgcnQpIGNvbnN0IHsKKyAgICByZXR1cm4gcnQubGVmdCA+PSBsZWZ0ICYmIHJ0LnJpZ2h0KCkgPD0gcmlnaHQoKSAmJiBydC50b3AgPj0gdG9wICYmCisgICAgICAgICAgIHJ0LmJvdHRvbSgpIDw9IGJvdHRvbSgpOworICB9CisgIGJhc2VUeXBlIFdpZHRoKCkgY29uc3QgeyByZXR1cm4gd2lkdGg7IH0KKyAgYmFzZVR5cGUgSGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gaGVpZ2h0OyB9CisgIEZYVF9TSVpFIFNpemUoKSBjb25zdCB7CisgICAgRlhUX1NJWkUgc2l6ZTsKKyAgICBzaXplLlNldCh3aWR0aCwgaGVpZ2h0KTsKKyAgICByZXR1cm4gc2l6ZTsKKyAgfQorICB2b2lkIFNpemUoRlhUX1NJWkUgcykgeyB3aWR0aCA9IHMueCwgaGVpZ2h0ID0gcy55OyB9CisgIEZYVF9QT0lOVCBUb3BMZWZ0KCkgY29uc3QgeworICAgIEZYVF9QT0lOVCBwOworICAgIHAueCA9IGxlZnQ7CisgICAgcC55ID0gdG9wOworICAgIHJldHVybiBwOworICB9CisgIEZYVF9QT0lOVCBUb3BSaWdodCgpIGNvbnN0IHsKKyAgICBGWFRfUE9JTlQgcDsKKyAgICBwLnggPSBsZWZ0ICsgd2lkdGg7CisgICAgcC55ID0gdG9wOworICAgIHJldHVybiBwOworICB9CisgIEZYVF9QT0lOVCBCb3R0b21MZWZ0KCkgY29uc3QgeworICAgIEZYVF9QT0lOVCBwOworICAgIHAueCA9IGxlZnQ7CisgICAgcC55ID0gdG9wICsgaGVpZ2h0OworICAgIHJldHVybiBwOworICB9CisgIEZYVF9QT0lOVCBCb3R0b21SaWdodCgpIGNvbnN0IHsKKyAgICBGWFRfUE9JTlQgcDsKKyAgICBwLnggPSBsZWZ0ICsgd2lkdGg7CisgICAgcC55ID0gdG9wICsgaGVpZ2h0OworICAgIHJldHVybiBwOworICB9CisgIHZvaWQgVG9wTGVmdChGWFRfUE9JTlQgdGwpIHsKKyAgICBsZWZ0ID0gdGwueDsKKyAgICB0b3AgPSB0bC55OworICB9CisgIHZvaWQgVG9wUmlnaHQoRlhUX1BPSU5UIHRyKSB7CisgICAgd2lkdGggPSB0ci54IC0gbGVmdDsKKyAgICB0b3AgPSB0ci55OworICB9CisgIHZvaWQgQm90dG9tTGVmdChGWFRfUE9JTlQgYmwpIHsKKyAgICBsZWZ0ID0gYmwueDsKKyAgICBoZWlnaHQgPSBibC55IC0gdG9wOworICB9CisgIHZvaWQgQm90dG9tUmlnaHQoRlhUX1BPSU5UIGJyKSB7CisgICAgd2lkdGggPSBici54IC0gbGVmdDsKKyAgICBoZWlnaHQgPSBici55IC0gdG9wOworICB9CisgIEZYVF9QT0lOVCBDZW50ZXIoKSBjb25zdCB7CisgICAgRlhUX1BPSU5UIHA7CisgICAgcC54ID0gbGVmdCArIHdpZHRoIC8gMjsKKyAgICBwLnkgPSB0b3AgKyBoZWlnaHQgLyAyOworICAgIHJldHVybiBwOworICB9CisgIHZvaWQgR2V0UGFyYWxsZWxvZ3JhbShGWFRfUEFSQUwmIHBnKSBjb25zdCB7CisgICAgcGcueCA9IGxlZnQsIHBnLnkgPSB0b3A7CisgICAgcGcueDEgPSB3aWR0aCwgcGcueTEgPSAwOworICAgIHBnLngyID0gMCwgcGcueTIgPSBoZWlnaHQ7CisgIH0KKyAgdm9pZCBVbmlvbihiYXNlVHlwZSB4LCBiYXNlVHlwZSB5KSB7CisgICAgYmFzZVR5cGUgciA9IHJpZ2h0KCksIGIgPSBib3R0b20oKTsKKyAgICBpZiAobGVmdCA+IHgpIHsKKyAgICAgIGxlZnQgPSB4OwogICAgIH0KLSAgICB2b2lkCQlTZXQoY29uc3QgRlhUX1BPSU5UICZwMSwgY29uc3QgRlhUX1BPSU5UICZwMikKLSAgICB7Ci0gICAgICAgIFRvcExlZnQocDEpLCBGWFRfUkVDVDo6d2lkdGggPSBwMi54IC0gcDEueCwgRlhUX1JFQ1Q6OmhlaWdodCA9IHAyLnkgLSBwMS55LCBGWFRfUkVDVDo6Tm9ybWFsaXplKCk7CisgICAgaWYgKHIgPCB4KSB7CisgICAgICByID0geDsKICAgICB9Ci0gICAgdm9pZAkJU2V0KGNvbnN0IEZYVF9QT0lOVCAmcCwgY29uc3QgRlhUX1ZFQ1RPUiAmdikKLSAgICB7Ci0gICAgICAgIFRvcExlZnQocCksIEZYVF9SRUNUOjp3aWR0aCA9IHYueCwgRlhUX1JFQ1Q6OmhlaWdodCA9IHYueSwgRlhUX1JFQ1Q6Ok5vcm1hbGl6ZSgpOworICAgIGlmICh0b3AgPiB5KSB7CisgICAgICB0b3AgPSB5OwogICAgIH0KLSAgICB2b2lkCQlSZXNldCgpCi0gICAgewotICAgICAgICBGWFRfUkVDVDo6bGVmdCA9IEZYVF9SRUNUOjp0b3AgPSBGWFRfUkVDVDo6d2lkdGggPSBGWFRfUkVDVDo6aGVpZ2h0ID0gMDsKKyAgICBpZiAoYiA8IHkpIHsKKyAgICAgIGIgPSB5OwogICAgIH0KLSAgICBGWFRfUkVDVCYJb3BlcmF0b3IgKz0gKGNvbnN0IEZYVF9QT0lOVCAmcCkKLSAgICB7Ci0gICAgICAgIGxlZnQgKz0gcC54LCB0b3AgKz0gcC55OwotICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgd2lkdGggPSByIC0gbGVmdDsKKyAgICBoZWlnaHQgPSBiIC0gdG9wOworICB9CisgIHZvaWQgVW5pb24oY29uc3QgRlhUX1BPSU5UJiBwKSB7IFVuaW9uKHAueCwgcC55KTsgfQorICB2b2lkIFVuaW9uKGNvbnN0IEZYVF9SRUNUJiBydCkgeworICAgIGJhc2VUeXBlIHIgPSByaWdodCgpLCBiID0gYm90dG9tKCk7CisgICAgaWYgKGxlZnQgPiBydC5sZWZ0KSB7CisgICAgICBsZWZ0ID0gcnQubGVmdDsKICAgICB9Ci0gICAgRlhUX1JFQ1QmCW9wZXJhdG9yIC09IChjb25zdCBGWFRfUE9JTlQgJnApCi0gICAgewotICAgICAgICBsZWZ0IC09IHAueCwgdG9wIC09IHAueTsKLSAgICAgICAgcmV0dXJuICp0aGlzOworICAgIGlmIChyIDwgcnQucmlnaHQoKSkgeworICAgICAgciA9IHJ0LnJpZ2h0KCk7CiAgICAgfQotICAgIGJhc2VUeXBlCXJpZ2h0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBsZWZ0ICsgd2lkdGg7CisgICAgaWYgKHRvcCA+IHJ0LnRvcCkgeworICAgICAgdG9wID0gcnQudG9wOwogICAgIH0KLSAgICBiYXNlVHlwZQlib3R0b20oKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHRvcCArIGhlaWdodDsKKyAgICBpZiAoYiA8IHJ0LmJvdHRvbSgpKSB7CisgICAgICBiID0gcnQuYm90dG9tKCk7CiAgICAgfQotICAgIHZvaWQJCU5vcm1hbGl6ZSgpCi0gICAgewotICAgICAgICBpZiAod2lkdGggPCAwKSB7Ci0gICAgICAgICAgICBsZWZ0ICs9IHdpZHRoOwotICAgICAgICAgICAgd2lkdGggPSAtd2lkdGg7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhlaWdodCA8IDApIHsKLSAgICAgICAgICAgIHRvcCArPSBoZWlnaHQ7Ci0gICAgICAgICAgICBoZWlnaHQgPSAtaGVpZ2h0OwotICAgICAgICB9CisgICAgd2lkdGggPSByIC0gbGVmdDsKKyAgICBoZWlnaHQgPSBiIC0gdG9wOworICB9CisgIHZvaWQgSW50ZXJzZWN0KGNvbnN0IEZYVF9SRUNUJiBydCkgeworICAgIGJhc2VUeXBlIHIgPSByaWdodCgpLCBiID0gYm90dG9tKCk7CisgICAgaWYgKGxlZnQgPCBydC5sZWZ0KSB7CisgICAgICBsZWZ0ID0gcnQubGVmdDsKICAgICB9Ci0gICAgdm9pZAkJT2Zmc2V0KGJhc2VUeXBlIGR4LCBiYXNlVHlwZSBkeSkKLSAgICB7Ci0gICAgICAgIGxlZnQgKz0gZHg7Ci0gICAgICAgIHRvcCArPSBkeTsKKyAgICBpZiAociA+IHJ0LnJpZ2h0KCkpIHsKKyAgICAgIHIgPSBydC5yaWdodCgpOwogICAgIH0KLSAgICB2b2lkCQlJbmZsYXRlKGJhc2VUeXBlIHgsIGJhc2VUeXBlIHkpCi0gICAgewotICAgICAgICBsZWZ0IC09IHg7Ci0gICAgICAgIHdpZHRoICs9IHggKiAyOwotICAgICAgICB0b3AgLT0geTsKLSAgICAgICAgaGVpZ2h0ICs9IHkgKiAyOworICAgIGlmICh0b3AgPCBydC50b3ApIHsKKyAgICAgIHRvcCA9IHJ0LnRvcDsKICAgICB9Ci0gICAgdm9pZAkJSW5mbGF0ZShjb25zdCBGWFRfUE9JTlQgJnApCi0gICAgewotICAgICAgICBJbmZsYXRlKHAueCwgcC55KTsKKyAgICBpZiAoYiA+IHJ0LmJvdHRvbSgpKSB7CisgICAgICBiID0gcnQuYm90dG9tKCk7CiAgICAgfQotICAgIHZvaWQJCUluZmxhdGUoYmFzZVR5cGUgbGVmdCwgYmFzZVR5cGUgdG9wLCBiYXNlVHlwZSByaWdodCwgYmFzZVR5cGUgYm90dG9tKQotICAgIHsKLSAgICAgICAgRlhUX1JFQ1Q6OmxlZnQgLT0gbGVmdDsKLSAgICAgICAgRlhUX1JFQ1Q6OnRvcCAtPSB0b3A7Ci0gICAgICAgIEZYVF9SRUNUOjp3aWR0aCArPSBsZWZ0ICsgcmlnaHQ7Ci0gICAgICAgIEZYVF9SRUNUOjpoZWlnaHQgKz0gdG9wICsgYm90dG9tOwotICAgIH0KLSAgICB2b2lkCQlJbmZsYXRlKGNvbnN0IEZYVF9SRUNUICZydCkKLSAgICB7Ci0gICAgICAgIEluZmxhdGUocnQubGVmdCwgcnQudG9wLCBydC5sZWZ0ICsgcnQud2lkdGgsIHJ0LnRvcCArIHJ0LmhlaWdodCk7Ci0gICAgfQotICAgIHZvaWQJCURlZmxhdGUoYmFzZVR5cGUgeCwgYmFzZVR5cGUgeSkKLSAgICB7Ci0gICAgICAgIGxlZnQgKz0geDsKLSAgICAgICAgd2lkdGggLT0geCAqIDI7Ci0gICAgICAgIHRvcCArPSB5OwotICAgICAgICBoZWlnaHQgLT0geSAqIDI7Ci0gICAgfQotICAgIHZvaWQJCURlZmxhdGUoY29uc3QgRlhUX1BPSU5UICZwKQotICAgIHsKLSAgICAgICAgRGVmbGF0ZShwLngsIHAueSk7Ci0gICAgfQotICAgIHZvaWQJCURlZmxhdGUoYmFzZVR5cGUgbGVmdCwgYmFzZVR5cGUgdG9wLCBiYXNlVHlwZSByaWdodCwgYmFzZVR5cGUgYm90dG9tKQotICAgIHsKLSAgICAgICAgRlhUX1JFQ1Q6OmxlZnQgKz0gbGVmdDsKLSAgICAgICAgRlhUX1JFQ1Q6OnRvcCArPSB0b3A7Ci0gICAgICAgIEZYVF9SRUNUOjp3aWR0aCAtPSBsZWZ0ICsgcmlnaHQ7Ci0gICAgICAgIEZYVF9SRUNUOjpoZWlnaHQgLT0gdG9wICsgYm90dG9tOwotICAgIH0KLSAgICB2b2lkCQlEZWZsYXRlKGNvbnN0IEZYVF9SRUNUICZydCkKLSAgICB7Ci0gICAgICAgIERlZmxhdGUocnQubGVmdCwgcnQudG9wLCBydC50b3AgKyBydC53aWR0aCwgcnQudG9wICsgcnQuaGVpZ2h0KTsKLSAgICB9Ci0gICAgRlhfQk9PTAkJSXNFbXB0eSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gd2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMDsKLSAgICB9Ci0gICAgRlhfQk9PTAkJSXNFbXB0eShGWF9GTE9BVCBmRXBzaWxvbikgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB3aWR0aCA8PSBmRXBzaWxvbiB8fCBoZWlnaHQgPD0gZkVwc2lsb247Ci0gICAgfQotICAgIHZvaWQJCUVtcHR5KCkKLSAgICB7Ci0gICAgICAgIHdpZHRoID0gaGVpZ2h0ID0gMDsKLSAgICB9Ci0gICAgRlhfQk9PTAkJQ29udGFpbnMoYmFzZVR5cGUgeCwgYmFzZVR5cGUgeSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB4ID49IGxlZnQgJiYgeCA8IGxlZnQgKyB3aWR0aCAmJiB5ID49IHRvcCAmJiB5IDwgdG9wICsgaGVpZ2h0OwotICAgIH0KLSAgICBGWF9CT09MCQlDb250YWlucyhjb25zdCBGWFRfUE9JTlQgJnApIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gQ29udGFpbnMocC54LCBwLnkpOwotICAgIH0KLSAgICBGWF9CT09MCQlDb250YWlucyhjb25zdCBGWFRfUkVDVCAmcnQpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gcnQubGVmdCA+PSBsZWZ0ICYmIHJ0LnJpZ2h0KCkgPD0gcmlnaHQoKSAmJiBydC50b3AgPj0gdG9wICYmIHJ0LmJvdHRvbSgpIDw9IGJvdHRvbSgpOwotICAgIH0KLSAgICBiYXNlVHlwZQlXaWR0aCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gd2lkdGg7Ci0gICAgfQotICAgIGJhc2VUeXBlCUhlaWdodCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gaGVpZ2h0OwotICAgIH0KLSAgICBGWFRfU0laRQlTaXplKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIEZYVF9TSVpFIHNpemU7Ci0gICAgICAgIHNpemUuU2V0KHdpZHRoLCBoZWlnaHQpOwotICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0gICAgdm9pZAkJU2l6ZShGWFRfU0laRSBzKQotICAgIHsKLSAgICAgICAgd2lkdGggPSBzLngsIGhlaWdodCA9IHMueTsKLSAgICB9Ci0gICAgRlhUX1BPSU5UCVRvcExlZnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgRlhUX1BPSU5UIHA7Ci0gICAgICAgIHAueCA9IGxlZnQ7Ci0gICAgICAgIHAueSA9IHRvcDsKLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgfQotICAgIEZYVF9QT0lOVAlUb3BSaWdodCgpIGNvbnN0Ci0gICAgewotICAgICAgICBGWFRfUE9JTlQgcDsKLSAgICAgICAgcC54ID0gbGVmdCArIHdpZHRoOwotICAgICAgICBwLnkgPSB0b3A7Ci0gICAgICAgIHJldHVybiBwOwotICAgIH0KLSAgICBGWFRfUE9JTlQJQm90dG9tTGVmdCgpIGNvbnN0Ci0gICAgewotICAgICAgICBGWFRfUE9JTlQgcDsKLSAgICAgICAgcC54ID0gbGVmdDsKLSAgICAgICAgcC55ID0gdG9wICsgaGVpZ2h0OwotICAgICAgICByZXR1cm4gcDsKLSAgICB9Ci0gICAgRlhUX1BPSU5UCUJvdHRvbVJpZ2h0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIEZYVF9QT0lOVCBwOwotICAgICAgICBwLnggPSBsZWZ0ICsgd2lkdGg7Ci0gICAgICAgIHAueSA9IHRvcCArIGhlaWdodDsKLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgfQotICAgIHZvaWQJCVRvcExlZnQoRlhUX1BPSU5UIHRsKQotICAgIHsKLSAgICAgICAgbGVmdCA9IHRsLng7Ci0gICAgICAgIHRvcCA9IHRsLnk7Ci0gICAgfQotICAgIHZvaWQJCVRvcFJpZ2h0KEZYVF9QT0lOVCB0cikKLSAgICB7Ci0gICAgICAgIHdpZHRoID0gdHIueCAtIGxlZnQ7Ci0gICAgICAgIHRvcCA9IHRyLnk7Ci0gICAgfQotICAgIHZvaWQJCUJvdHRvbUxlZnQoRlhUX1BPSU5UIGJsKQotICAgIHsKLSAgICAgICAgbGVmdCA9IGJsLng7Ci0gICAgICAgIGhlaWdodCA9IGJsLnkgLSB0b3A7Ci0gICAgfQotICAgIHZvaWQJCUJvdHRvbVJpZ2h0KEZYVF9QT0lOVCBicikKLSAgICB7Ci0gICAgICAgIHdpZHRoID0gYnIueCAtIGxlZnQ7Ci0gICAgICAgIGhlaWdodCA9IGJyLnkgLSB0b3A7Ci0gICAgfQotICAgIEZYVF9QT0lOVAlDZW50ZXIoKSBjb25zdAotICAgIHsKLSAgICAgICAgRlhUX1BPSU5UIHA7Ci0gICAgICAgIHAueCA9IGxlZnQgKyB3aWR0aCAvIDI7Ci0gICAgICAgIHAueSA9IHRvcCArIGhlaWdodCAvIDI7Ci0gICAgICAgIHJldHVybiBwOwotICAgIH0KLSAgICB2b2lkCQlHZXRQYXJhbGxlbG9ncmFtKEZYVF9QQVJBTCAmcGcpIGNvbnN0Ci0gICAgewotICAgICAgICBwZy54ID0gbGVmdCwgcGcueSA9IHRvcDsKLSAgICAgICAgcGcueDEgPSB3aWR0aCwgcGcueTEgPSAwOwotICAgICAgICBwZy54MiA9IDAsIHBnLnkyID0gaGVpZ2h0OwotICAgIH0KLSAgICB2b2lkCQlVbmlvbihiYXNlVHlwZSB4LCBiYXNlVHlwZSB5KQotICAgIHsKLSAgICAgICAgYmFzZVR5cGUgciA9IHJpZ2h0KCksIGIgPSBib3R0b20oKTsKLSAgICAgICAgaWYgKGxlZnQgPiB4KSB7Ci0gICAgICAgICAgICBsZWZ0ID0geDsKLSAgICAgICAgfQotICAgICAgICBpZiAociA8IHgpIHsKLSAgICAgICAgICAgIHIgPSB4OwotICAgICAgICB9Ci0gICAgICAgIGlmICh0b3AgPiB5KSB7Ci0gICAgICAgICAgICB0b3AgPSB5OwotICAgICAgICB9Ci0gICAgICAgIGlmIChiIDwgeSkgewotICAgICAgICAgICAgYiA9IHk7Ci0gICAgICAgIH0KLSAgICAgICAgd2lkdGggPSByIC0gbGVmdDsKLSAgICAgICAgaGVpZ2h0ID0gYiAtIHRvcDsKLSAgICB9Ci0gICAgdm9pZAkJVW5pb24oY29uc3QgRlhUX1BPSU5UICZwKQotICAgIHsKLSAgICAgICAgVW5pb24ocC54LCBwLnkpOwotICAgIH0KLSAgICB2b2lkCQlVbmlvbihjb25zdCBGWFRfUkVDVCAmcnQpCi0gICAgewotICAgICAgICBiYXNlVHlwZSByID0gcmlnaHQoKSwgYiA9IGJvdHRvbSgpOwotICAgICAgICBpZiAobGVmdCA+IHJ0LmxlZnQpIHsKLSAgICAgICAgICAgIGxlZnQgPSBydC5sZWZ0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChyIDwgcnQucmlnaHQoKSkgewotICAgICAgICAgICAgciA9IHJ0LnJpZ2h0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRvcCA+IHJ0LnRvcCkgewotICAgICAgICAgICAgdG9wID0gcnQudG9wOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiIDwgcnQuYm90dG9tKCkpIHsKLSAgICAgICAgICAgIGIgPSBydC5ib3R0b20oKTsKLSAgICAgICAgfQotICAgICAgICB3aWR0aCA9IHIgLSBsZWZ0OwotICAgICAgICBoZWlnaHQgPSBiIC0gdG9wOwotICAgIH0KLSAgICB2b2lkCQlJbnRlcnNlY3QoY29uc3QgRlhUX1JFQ1QgJnJ0KQotICAgIHsKLSAgICAgICAgYmFzZVR5cGUgciA9IHJpZ2h0KCksIGIgPSBib3R0b20oKTsKLSAgICAgICAgaWYgKGxlZnQgPCBydC5sZWZ0KSB7Ci0gICAgICAgICAgICBsZWZ0ID0gcnQubGVmdDsKLSAgICAgICAgfQotICAgICAgICBpZiAociA+IHJ0LnJpZ2h0KCkpIHsKLSAgICAgICAgICAgIHIgPSBydC5yaWdodCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0b3AgPCBydC50b3ApIHsKLSAgICAgICAgICAgIHRvcCA9IHJ0LnRvcDsKLSAgICAgICAgfQotICAgICAgICBpZiAoYiA+IHJ0LmJvdHRvbSgpKSB7Ci0gICAgICAgICAgICBiID0gcnQuYm90dG9tKCk7Ci0gICAgICAgIH0KLSAgICAgICAgd2lkdGggPSByIC0gbGVmdDsKLSAgICAgICAgaGVpZ2h0ID0gYiAtIHRvcDsKLSAgICB9Ci0gICAgRlhfQk9PTAkJSW50ZXJzZWN0V2l0aChjb25zdCBGWFRfUkVDVCAmcnQpIGNvbnN0Ci0gICAgewotICAgICAgICBGWFRfUkVDVCByZWN0ID0gcnQ7Ci0gICAgICAgIHJlY3QuSW50ZXJzZWN0KCp0aGlzKTsKLSAgICAgICAgcmV0dXJuICFyZWN0LklzRW1wdHkoKTsKLSAgICB9Ci0gICAgRlhfQk9PTAkJSW50ZXJzZWN0V2l0aChjb25zdCBGWFRfUkVDVCAmcnQsIEZYX0ZMT0FUIGZFcHNpbG9uKSBjb25zdAotICAgIHsKLSAgICAgICAgRlhUX1JFQ1QgcmVjdCA9IHJ0OwotICAgICAgICByZWN0LkludGVyc2VjdCgqdGhpcyk7Ci0gICAgICAgIHJldHVybiAhcmVjdC5Jc0VtcHR5KGZFcHNpbG9uKTsKLSAgICB9Ci0gICAgZnJpZW5kCUZYX0JPT0wJb3BlcmF0b3IgPT0gKGNvbnN0IEZYVF9SRUNUICZyYzEsIGNvbnN0IEZYVF9SRUNUICZyYzIpCi0gICAgewotICAgICAgICByZXR1cm4gcmMxLmxlZnQgPT0gcmMyLmxlZnQgJiYgcmMxLnRvcCA9PSByYzIudG9wICYmIHJjMS53aWR0aCA9PSByYzIud2lkdGggJiYgcmMxLmhlaWdodCA9PSByYzIuaGVpZ2h0OwotICAgIH0KLSAgICBmcmllbmQJRlhfQk9PTAlvcGVyYXRvciAhPSAoY29uc3QgRlhUX1JFQ1QgJnJjMSwgY29uc3QgRlhUX1JFQ1QgJnJjMikKLSAgICB7Ci0gICAgICAgIHJldHVybiByYzEubGVmdCAhPSByYzIubGVmdCB8fCByYzEudG9wICE9IHJjMi50b3AgfHwgcmMxLndpZHRoICE9IHJjMi53aWR0aCB8fCByYzEuaGVpZ2h0ICE9IHJjMi5oZWlnaHQ7Ci0gICAgfQotICAgIGJhc2VUeXBlIGxlZnQsIHRvcDsKLSAgICBiYXNlVHlwZSB3aWR0aCwgaGVpZ2h0OworICAgIHdpZHRoID0gciAtIGxlZnQ7CisgICAgaGVpZ2h0ID0gYiAtIHRvcDsKKyAgfQorICBGWF9CT09MIEludGVyc2VjdFdpdGgoY29uc3QgRlhUX1JFQ1QmIHJ0KSBjb25zdCB7CisgICAgRlhUX1JFQ1QgcmVjdCA9IHJ0OworICAgIHJlY3QuSW50ZXJzZWN0KCp0aGlzKTsKKyAgICByZXR1cm4gIXJlY3QuSXNFbXB0eSgpOworICB9CisgIEZYX0JPT0wgSW50ZXJzZWN0V2l0aChjb25zdCBGWFRfUkVDVCYgcnQsIEZYX0ZMT0FUIGZFcHNpbG9uKSBjb25zdCB7CisgICAgRlhUX1JFQ1QgcmVjdCA9IHJ0OworICAgIHJlY3QuSW50ZXJzZWN0KCp0aGlzKTsKKyAgICByZXR1cm4gIXJlY3QuSXNFbXB0eShmRXBzaWxvbik7CisgIH0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3I9PShjb25zdCBGWFRfUkVDVCYgcmMxLCBjb25zdCBGWFRfUkVDVCYgcmMyKSB7CisgICAgcmV0dXJuIHJjMS5sZWZ0ID09IHJjMi5sZWZ0ICYmIHJjMS50b3AgPT0gcmMyLnRvcCAmJgorICAgICAgICAgICByYzEud2lkdGggPT0gcmMyLndpZHRoICYmIHJjMS5oZWlnaHQgPT0gcmMyLmhlaWdodDsKKyAgfQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvciE9KGNvbnN0IEZYVF9SRUNUJiByYzEsIGNvbnN0IEZYVF9SRUNUJiByYzIpIHsKKyAgICByZXR1cm4gcmMxLmxlZnQgIT0gcmMyLmxlZnQgfHwgcmMxLnRvcCAhPSByYzIudG9wIHx8CisgICAgICAgICAgIHJjMS53aWR0aCAhPSByYzIud2lkdGggfHwgcmMxLmhlaWdodCAhPSByYzIuaGVpZ2h0OworICB9CisgIGJhc2VUeXBlIGxlZnQsIHRvcDsKKyAgYmFzZVR5cGUgd2lkdGgsIGhlaWdodDsKIH07Ci10eXBlZGVmIENGWF9SVGVtcGxhdGU8RlhfSU5UMzI+CQkJQ0ZYX1JlY3Q7Ci10eXBlZGVmIENGWF9SVGVtcGxhdGU8RlhfRkxPQVQ+CQkJQ0ZYX1JlY3RGOwotdHlwZWRlZiBDRlhfUlRlbXBsYXRlPEZYX0lOVDMyPiAqCQlGWF9MUFJFQ1Q7Ci10eXBlZGVmIENGWF9SVGVtcGxhdGU8RlhfRkxPQVQ+ICoJCUZYX0xQUkVDVEY7Ci10eXBlZGVmIENGWF9SVGVtcGxhdGU8RlhfSU5UMzI+IGNvbnN0ICoJRlhfTFBDUkVDVDsKLXR5cGVkZWYgQ0ZYX1JUZW1wbGF0ZTxGWF9GTE9BVD4gY29uc3QgKglGWF9MUENSRUNURjsKLXR5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8Q0ZYX1JlY3RGPglDRlhfUmVjdEZBcnJheTsKK3R5cGVkZWYgQ0ZYX1JUZW1wbGF0ZTxpbnQzMl90PiBDRlhfUmVjdDsKK3R5cGVkZWYgQ0ZYX1JUZW1wbGF0ZTxGWF9GTE9BVD4gQ0ZYX1JlY3RGOwordHlwZWRlZiBDRlhfUlRlbXBsYXRlPGludDMyX3Q+KiBGWF9MUFJFQ1Q7Cit0eXBlZGVmIENGWF9SVGVtcGxhdGU8RlhfRkxPQVQ+KiBGWF9MUFJFQ1RGOwordHlwZWRlZiBDRlhfUlRlbXBsYXRlPGludDMyX3Q+IGNvbnN0KiBGWF9MUENSRUNUOwordHlwZWRlZiBDRlhfUlRlbXBsYXRlPEZYX0ZMT0FUPiBjb25zdCogRlhfTFBDUkVDVEY7Cit0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPENGWF9SZWN0Rj4gQ0ZYX1JlY3RGQXJyYXk7CiBzdHJ1Y3QgRlhfUkVDVCB7CisgIGludCBsZWZ0OwogCi0gICAgaW50CQkJbGVmdDsKKyAgaW50IHRvcDsKIAotICAgIGludAkJCXRvcDsKKyAgaW50IHJpZ2h0OwogCi0gICAgaW50CQkJcmlnaHQ7CisgIGludCBib3R0b207CiAKLSAgICBpbnQJCQlib3R0b207CisgIEZYX1JFQ1QoKSA6IGxlZnQoMCksIHRvcCgwKSwgcmlnaHQoMCksIGJvdHRvbSgwKSB7fQogCi0gICAgRlhfUkVDVCgpOiBsZWZ0KDApLCB0b3AoMCksIHJpZ2h0KDApLCBib3R0b20oMCkgeyB9CisgIEZYX1JFQ1QoaW50IGxlZnQxLCBpbnQgdG9wMSwgaW50IHJpZ2h0MSwgaW50IGJvdHRvbTEpIHsKKyAgICBsZWZ0ID0gbGVmdDE7CisgICAgdG9wID0gdG9wMTsKKyAgICByaWdodCA9IHJpZ2h0MTsKKyAgICBib3R0b20gPSBib3R0b20xOworICB9CiAKLSAgICBGWF9SRUNUKGludCBsZWZ0MSwgaW50IHRvcDEsIGludCByaWdodDEsIGludCBib3R0b20xKQotICAgIHsKLSAgICAgICAgbGVmdCA9IGxlZnQxOwotICAgICAgICB0b3AgPSB0b3AxOwotICAgICAgICByaWdodCA9IHJpZ2h0MTsKLSAgICAgICAgYm90dG9tID0gYm90dG9tMTsKLSAgICB9CisgIGludCBXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIHJpZ2h0IC0gbGVmdDsgfQogCi0gICAgaW50CQkJV2lkdGgoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHJpZ2h0IC0gbGVmdDsKLSAgICB9CisgIGludCBIZWlnaHQoKSBjb25zdCB7IHJldHVybiBib3R0b20gLSB0b3A7IH0KIAotICAgIGludAkJCUhlaWdodCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gYm90dG9tIC0gdG9wOwotICAgIH0KKyAgRlhfQk9PTCBJc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gcmlnaHQgPD0gbGVmdCB8fCBib3R0b20gPD0gdG9wOyB9CiAKLSAgICBGWF9CT09MCQlJc0VtcHR5KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiByaWdodCA8PSBsZWZ0IHx8IGJvdHRvbSA8PSB0b3A7Ci0gICAgfQorICB2b2lkIE5vcm1hbGl6ZSgpOwogCi0gICAgdm9pZAkJTm9ybWFsaXplKCk7CisgIHZvaWQgSW50ZXJzZWN0KGNvbnN0IEZYX1JFQ1QmIHNyYyk7CiAKLSAgICB2b2lkCQlJbnRlcnNlY3QoY29uc3QgRlhfUkVDVCYgc3JjKTsKKyAgdm9pZCBJbnRlcnNlY3QoaW50IGxlZnQxLCBpbnQgdG9wMSwgaW50IHJpZ2h0MSwgaW50IGJvdHRvbTEpIHsKKyAgICBJbnRlcnNlY3QoRlhfUkVDVChsZWZ0MSwgdG9wMSwgcmlnaHQxLCBib3R0b20xKSk7CisgIH0KIAotICAgIHZvaWQJCUludGVyc2VjdChpbnQgbGVmdDEsIGludCB0b3AxLCBpbnQgcmlnaHQxLCBpbnQgYm90dG9tMSkKLSAgICB7Ci0gICAgICAgIEludGVyc2VjdChGWF9SRUNUKGxlZnQxLCB0b3AxLCByaWdodDEsIGJvdHRvbTEpKTsKLSAgICB9CisgIHZvaWQgVW5pb24oY29uc3QgRlhfUkVDVCYgb3RoZXJfcmVjdCk7CiAKLSAgICB2b2lkCQlVbmlvbihjb25zdCBGWF9SRUNUJiBvdGhlcl9yZWN0KTsKKyAgRlhfQk9PTCBvcGVyYXRvcj09KGNvbnN0IEZYX1JFQ1QmIHNyYykgY29uc3QgeworICAgIHJldHVybiBsZWZ0ID09IHNyYy5sZWZ0ICYmIHJpZ2h0ID09IHNyYy5yaWdodCAmJiB0b3AgPT0gc3JjLnRvcCAmJgorICAgICAgICAgICBib3R0b20gPT0gc3JjLmJvdHRvbTsKKyAgfQogCi0gICAgRlhfQk9PTAkJb3BlcmF0b3IgPT0gKGNvbnN0IEZYX1JFQ1QmIHNyYykgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBsZWZ0ID09IHNyYy5sZWZ0ICYmIHJpZ2h0ID09IHNyYy5yaWdodCAmJiB0b3AgPT0gc3JjLnRvcCAmJiBib3R0b20gPT0gc3JjLmJvdHRvbTsKLSAgICB9CisgIHZvaWQgT2Zmc2V0KGludCBkeCwgaW50IGR5KSB7CisgICAgbGVmdCArPSBkeDsKKyAgICByaWdodCArPSBkeDsKKyAgICB0b3AgKz0gZHk7CisgICAgYm90dG9tICs9IGR5OworICB9CiAKLSAgICB2b2lkCQlPZmZzZXQoaW50IGR4LCBpbnQgZHkpCi0gICAgewotICAgICAgICBsZWZ0ICs9IGR4OwotICAgICAgICByaWdodCArPSBkeDsKLSAgICAgICAgdG9wICs9IGR5OwotICAgICAgICBib3R0b20gKz0gZHk7Ci0gICAgfQorICBGWF9CT09MIENvbnRhaW5zKGNvbnN0IEZYX1JFQ1QmIG90aGVyX3JlY3QpIGNvbnN0IHsKKyAgICByZXR1cm4gb3RoZXJfcmVjdC5sZWZ0ID49IGxlZnQgJiYgb3RoZXJfcmVjdC5yaWdodCA8PSByaWdodCAmJgorICAgICAgICAgICBvdGhlcl9yZWN0LnRvcCA+PSB0b3AgJiYgb3RoZXJfcmVjdC5ib3R0b20gPD0gYm90dG9tOworICB9CiAKLSAgICBGWF9CT09MCQlDb250YWlucyhjb25zdCBGWF9SRUNUJiBvdGhlcl9yZWN0KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG90aGVyX3JlY3QubGVmdCA+PSBsZWZ0ICYmIG90aGVyX3JlY3QucmlnaHQgPD0gcmlnaHQgJiYgb3RoZXJfcmVjdC50b3AgPj0gdG9wICYmIG90aGVyX3JlY3QuYm90dG9tIDw9IGJvdHRvbTsKLSAgICB9Ci0KLSAgICBGWF9CT09MCQlDb250YWlucyhpbnQgeCwgaW50IHkpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4geCA+PSBsZWZ0ICYmIHggPCByaWdodCAmJiB5ID49IHRvcCAmJiB5IDwgYm90dG9tOwotICAgIH0KKyAgRlhfQk9PTCBDb250YWlucyhpbnQgeCwgaW50IHkpIGNvbnN0IHsKKyAgICByZXR1cm4geCA+PSBsZWZ0ICYmIHggPCByaWdodCAmJiB5ID49IHRvcCAmJiB5IDwgYm90dG9tOworICB9CiB9Owogc3RydWN0IEZYX1NNQUxMX1JFQ1QgeworICBpbnQxNl90IExlZnQ7CiAKLSAgICBGWF9TSE9SVAlMZWZ0OworICBpbnQxNl90IFRvcDsKIAotICAgIEZYX1NIT1JUCVRvcDsKKyAgaW50MTZfdCBSaWdodDsKIAotICAgIEZYX1NIT1JUCVJpZ2h0OwotCi0gICAgRlhfU0hPUlQJQm90dG9tOworICBpbnQxNl90IEJvdHRvbTsKIH07Ci1jbGFzcyBDRlhfRmxvYXRSZWN0IAotewotcHVibGljOgorY2xhc3MgQ0ZYX0Zsb2F0UmVjdCB7CisgcHVibGljOgorICBDRlhfRmxvYXRSZWN0KCkgeyBsZWZ0ID0gcmlnaHQgPSBib3R0b20gPSB0b3AgPSAwOyB9CiAKLSAgICBDRlhfRmxvYXRSZWN0KCkKLSAgICB7Ci0gICAgICAgIGxlZnQgPSByaWdodCA9IGJvdHRvbSA9IHRvcCA9IDA7Ci0gICAgfQorICBDRlhfRmxvYXRSZWN0KEZYX0ZMT0FUIGxlZnQxLAorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJvdHRvbTEsCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgcmlnaHQxLAorICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRvcDEpIHsKKyAgICBsZWZ0ID0gbGVmdDE7CisgICAgYm90dG9tID0gYm90dG9tMTsKKyAgICByaWdodCA9IHJpZ2h0MTsKKyAgICB0b3AgPSB0b3AxOworICB9CiAKLSAgICBDRlhfRmxvYXRSZWN0KEZYX0ZMT0FUIGxlZnQxLCBGWF9GTE9BVCBib3R0b20xLCBGWF9GTE9BVCByaWdodDEsIEZYX0ZMT0FUIHRvcDEpCi0gICAgewotICAgICAgICBsZWZ0ID0gbGVmdDE7Ci0gICAgICAgIGJvdHRvbSA9IGJvdHRvbTE7Ci0gICAgICAgIHJpZ2h0ID0gcmlnaHQxOwotICAgICAgICB0b3AgPSB0b3AxOwotICAgIH0KKyAgQ0ZYX0Zsb2F0UmVjdChjb25zdCBGWF9GTE9BVCogcEFycmF5KSB7CisgICAgbGVmdCA9IHBBcnJheVswXTsKKyAgICBib3R0b20gPSBwQXJyYXlbMV07CisgICAgcmlnaHQgPSBwQXJyYXlbMl07CisgICAgdG9wID0gcEFycmF5WzNdOworICB9CiAKLSAgICBDRlhfRmxvYXRSZWN0KGNvbnN0IEZYX0ZMT0FUKiBwQXJyYXkpCi0gICAgewotICAgICAgICBsZWZ0ID0gcEFycmF5WzBdOwotICAgICAgICBib3R0b20gPSBwQXJyYXlbMV07Ci0gICAgICAgIHJpZ2h0ID0gcEFycmF5WzJdOwotICAgICAgICB0b3AgPSBwQXJyYXlbM107Ci0gICAgfQorICBDRlhfRmxvYXRSZWN0KGNvbnN0IEZYX1JFQ1QmIHJlY3QpOwogCi0gICAgQ0ZYX0Zsb2F0UmVjdChjb25zdCBGWF9SRUNUJiByZWN0KTsKKyAgRlhfQk9PTCBJc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbGVmdCA+PSByaWdodCB8fCBib3R0b20gPj0gdG9wOyB9CiAKLSAgICBGWF9CT09MCQkJCUlzRW1wdHkoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGxlZnQgPj0gcmlnaHQgfHwgYm90dG9tID49IHRvcDsKLSAgICB9CisgIHZvaWQgTm9ybWFsaXplKCk7CiAKLSAgICB2b2lkCQkJCU5vcm1hbGl6ZSgpOworICB2b2lkIFJlc2V0KCkgeyBsZWZ0ID0gcmlnaHQgPSBib3R0b20gPSB0b3AgPSAwOyB9CiAKLSAgICB2b2lkCQkJCVJlc2V0KCkKLSAgICB7Ci0gICAgICAgIGxlZnQgPSByaWdodCA9IGJvdHRvbSA9IHRvcCA9IDA7Ci0gICAgfQorICBGWF9CT09MIENvbnRhaW5zKGNvbnN0IENGWF9GbG9hdFJlY3QmIG90aGVyX3JlY3QpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCQlDb250YWlucyhjb25zdCBDRlhfRmxvYXRSZWN0JiBvdGhlcl9yZWN0KSBjb25zdDsKKyAgRlhfQk9PTCBDb250YWlucyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KSBjb25zdDsKIAotICAgIEZYX0JPT0wJCQkJQ29udGFpbnMoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkgY29uc3Q7CisgIHZvaWQgVHJhbnNmb3JtKGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOwogCi0gICAgdm9pZAkJCQlUcmFuc2Zvcm0oY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7CisgIHZvaWQgSW50ZXJzZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIG90aGVyX3JlY3QpOwogCi0gICAgdm9pZAkJCQlJbnRlcnNlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgb3RoZXJfcmVjdCk7CisgIHZvaWQgVW5pb24oY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgb3RoZXJfcmVjdCk7CiAKLSAgICB2b2lkCQkJCVVuaW9uKGNvbnN0IENGWF9GbG9hdFJlY3QmIG90aGVyX3JlY3QpOworICBGWF9SRUNUIEdldElubmVyUmVjdCgpIGNvbnN0OwogCi0gICAgRlhfUkVDVAkJCQlHZXRJbm5lclJlY3QoKSBjb25zdDsKKyAgRlhfUkVDVCBHZXRPdXR0ZXJSZWN0KCkgY29uc3Q7CiAKLSAgICBGWF9SRUNUCQkJCUdldE91dHRlclJlY3QoKSBjb25zdDsKKyAgRlhfUkVDVCBHZXRDbG9zZXN0UmVjdCgpIGNvbnN0OwogCi0gICAgRlhfUkVDVAkJCQlHZXRDbG9zZXN0UmVjdCgpIGNvbnN0OworICBpbnQgU3Vic3RyYWN0NChDRlhfRmxvYXRSZWN0JiBzdWJzdHJhY3RfcmVjdCwgQ0ZYX0Zsb2F0UmVjdCogcFJlY3RzKTsKIAotICAgIGludAkJCQkJU3Vic3RyYWN0NChDRlhfRmxvYXRSZWN0JiBzdWJzdHJhY3RfcmVjdCwgQ0ZYX0Zsb2F0UmVjdCogcFJlY3RzKTsKKyAgdm9pZCBJbml0UmVjdChGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KSB7CisgICAgbGVmdCA9IHJpZ2h0ID0geDsKKyAgICBib3R0b20gPSB0b3AgPSB5OworICB9CiAKLSAgICB2b2lkCQkJCUluaXRSZWN0KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpCi0gICAgewotICAgICAgICBsZWZ0ID0gcmlnaHQgPSB4OwotICAgICAgICBib3R0b20gPSB0b3AgPSB5OwotICAgIH0KKyAgdm9pZCBVcGRhdGVSZWN0KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpOwogCi0gICAgdm9pZAkJCQlVcGRhdGVSZWN0KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpOworICBGWF9GTE9BVCBXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIHJpZ2h0IC0gbGVmdDsgfQogCi0gICAgRlhfRkxPQVQJCQlXaWR0aCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gcmlnaHQgLSBsZWZ0OwotICAgIH0KKyAgRlhfRkxPQVQgSGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gdG9wIC0gYm90dG9tOyB9CiAKLSAgICBGWF9GTE9BVAkJCUhlaWdodCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gdG9wIC0gYm90dG9tOwotICAgIH0KKyAgdm9pZCBJbmZsYXRlKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpIHsKKyAgICBOb3JtYWxpemUoKTsKKyAgICBsZWZ0IC09IHg7CisgICAgcmlnaHQgKz0geDsKKyAgICBib3R0b20gLT0geTsKKyAgICB0b3AgKz0geTsKKyAgfQogCi0gICAgdm9pZAkJCQlJbmZsYXRlKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpCi0gICAgewotICAgICAgICBOb3JtYWxpemUoKTsKLSAgICAgICAgbGVmdCAtPSB4OwotICAgICAgICByaWdodCArPSB4OwotICAgICAgICBib3R0b20gLT0geTsKLSAgICAgICAgdG9wICs9IHk7Ci0gICAgfQorICB2b2lkIEluZmxhdGUoRlhfRkxPQVQgb3RoZXJfbGVmdCwKKyAgICAgICAgICAgICAgIEZYX0ZMT0FUIG90aGVyX2JvdHRvbSwKKyAgICAgICAgICAgICAgIEZYX0ZMT0FUIG90aGVyX3JpZ2h0LAorICAgICAgICAgICAgICAgRlhfRkxPQVQgb3RoZXJfdG9wKSB7CisgICAgTm9ybWFsaXplKCk7CisgICAgbGVmdCAtPSBvdGhlcl9sZWZ0OworICAgIGJvdHRvbSAtPSBvdGhlcl9ib3R0b207CisgICAgcmlnaHQgKz0gb3RoZXJfcmlnaHQ7CisgICAgdG9wICs9IG90aGVyX3RvcDsKKyAgfQogCi0gICAgdm9pZAkJCQlJbmZsYXRlKEZYX0ZMT0FUIGxlZnQsIEZYX0ZMT0FUIGJvdHRvbSwgRlhfRkxPQVQgcmlnaHQsIEZYX0ZMT0FUIHRvcCkKLSAgICB7Ci0gICAgICAgIE5vcm1hbGl6ZSgpOwotICAgICAgICB0aGlzLT5sZWZ0IC09IGxlZnQ7Ci0gICAgICAgIHRoaXMtPmJvdHRvbSAtPSBib3R0b207Ci0gICAgICAgIHRoaXMtPnJpZ2h0ICs9IHJpZ2h0OwotICAgICAgICB0aGlzLT50b3AgKz0gdG9wOwotICAgIH0KKyAgdm9pZCBJbmZsYXRlKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJ0KSB7CisgICAgSW5mbGF0ZShydC5sZWZ0LCBydC5ib3R0b20sIHJ0LnJpZ2h0LCBydC50b3ApOworICB9CiAKLSAgICB2b2lkCQkJCUluZmxhdGUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCAmcnQpCi0gICAgewotICAgICAgICBJbmZsYXRlKHJ0LmxlZnQsIHJ0LmJvdHRvbSwgcnQucmlnaHQsIHJ0LnRvcCk7Ci0gICAgfQorICB2b2lkIERlZmxhdGUoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkgeworICAgIE5vcm1hbGl6ZSgpOworICAgIGxlZnQgKz0geDsKKyAgICByaWdodCAtPSB4OworICAgIGJvdHRvbSArPSB5OworICAgIHRvcCAtPSB5OworICB9CiAKLSAgICB2b2lkCQkJCURlZmxhdGUoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkKLSAgICB7Ci0gICAgICAgIE5vcm1hbGl6ZSgpOwotICAgICAgICBsZWZ0ICs9IHg7Ci0gICAgICAgIHJpZ2h0IC09IHg7Ci0gICAgICAgIGJvdHRvbSArPSB5OwotICAgICAgICB0b3AgLT0geTsKLSAgICB9CisgIHZvaWQgRGVmbGF0ZShGWF9GTE9BVCBvdGhlcl9sZWZ0LAorICAgICAgICAgICAgICAgRlhfRkxPQVQgb3RoZXJfYm90dG9tLAorICAgICAgICAgICAgICAgRlhfRkxPQVQgb3RoZXJfcmlnaHQsCisgICAgICAgICAgICAgICBGWF9GTE9BVCBvdGhlcl90b3ApIHsKKyAgICBOb3JtYWxpemUoKTsKKyAgICBsZWZ0ICs9IG90aGVyX2xlZnQ7CisgICAgYm90dG9tICs9IG90aGVyX2JvdHRvbTsKKyAgICByaWdodCAtPSBvdGhlcl9yaWdodDsKKyAgICB0b3AgLT0gb3RoZXJfdG9wOworICB9CiAKLSAgICB2b2lkCQkJCURlZmxhdGUoRlhfRkxPQVQgbGVmdCwgRlhfRkxPQVQgYm90dG9tLCBGWF9GTE9BVCByaWdodCwgRlhfRkxPQVQgdG9wKQotICAgIHsKLSAgICAgICAgTm9ybWFsaXplKCk7Ci0gICAgICAgIHRoaXMtPmxlZnQgKz0gbGVmdDsKLSAgICAgICAgdGhpcy0+Ym90dG9tICs9IGJvdHRvbTsKLSAgICAgICAgdGhpcy0+cmlnaHQgLT0gcmlnaHQ7Ci0gICAgICAgIHRoaXMtPnRvcCAtPSB0b3A7Ci0gICAgfQorICB2b2lkIERlZmxhdGUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcnQpIHsKKyAgICBEZWZsYXRlKHJ0LmxlZnQsIHJ0LmJvdHRvbSwgcnQucmlnaHQsIHJ0LnRvcCk7CisgIH0KIAotICAgIHZvaWQJCQkJRGVmbGF0ZShjb25zdCBDRlhfRmxvYXRSZWN0ICZydCkKLSAgICB7Ci0gICAgICAgIERlZmxhdGUocnQubGVmdCwgcnQuYm90dG9tLCBydC5yaWdodCwgcnQudG9wKTsKLSAgICB9CisgIHZvaWQgVHJhbnNsYXRlKEZYX0ZMT0FUIGUsIEZYX0ZMT0FUIGYpIHsKKyAgICBsZWZ0ICs9IGU7CisgICAgcmlnaHQgKz0gZTsKKyAgICB0b3AgKz0gZjsKKyAgICBib3R0b20gKz0gZjsKKyAgfQogCi0gICAgdm9pZAkJCQlUcmFuc2xhdGUoRlhfRkxPQVQgZSwgRlhfRkxPQVQgZikKLSAgICB7Ci0gICAgICAgIGxlZnQgKz0gZTsKLSAgICAgICAgcmlnaHQgKz0gZTsKLSAgICAgICAgdG9wICs9IGY7Ci0gICAgICAgIGJvdHRvbSArPSBmOwotICAgIH0KKyAgc3RhdGljIENGWF9GbG9hdFJlY3QgR2V0QkJveChjb25zdCBDRlhfRmxvYXRQb2ludCogcFBvaW50cywgaW50IG5Qb2ludHMpOwogCi0gICAgc3RhdGljIENGWF9GbG9hdFJlY3QJR2V0QkJveChjb25zdCBDRlhfRmxvYXRQb2ludCogcFBvaW50cywgaW50IG5Qb2ludHMpOworICBGWF9GTE9BVCBsZWZ0OwogCi0gICAgRlhfRkxPQVQJCQlsZWZ0OworICBGWF9GTE9BVCByaWdodDsKIAotICAgIEZYX0ZMT0FUCQkJcmlnaHQ7CisgIEZYX0ZMT0FUIGJvdHRvbTsKIAotICAgIEZYX0ZMT0FUCQkJYm90dG9tOwotCi0gICAgRlhfRkxPQVQJCQl0b3A7CisgIEZYX0ZMT0FUIHRvcDsKIH07Ci1jbGFzcyBDRlhfTWF0cml4IAotewotcHVibGljOgorY2xhc3MgQ0ZYX01hdHJpeCB7CisgcHVibGljOgorICBDRlhfTWF0cml4KCkgeyBTZXRJZGVudGl0eSgpOyB9CiAKLSAgICBDRlhfTWF0cml4KCkKLSAgICB7Ci0gICAgICAgIGEgPSBkID0gMTsKLSAgICAgICAgYiA9IGMgPSBlID0gZiA9IDA7Ci0gICAgfQorICBDRlhfTWF0cml4KEZYX0ZMT0FUIGExLAorICAgICAgICAgICAgIEZYX0ZMT0FUIGIxLAorICAgICAgICAgICAgIEZYX0ZMT0FUIGMxLAorICAgICAgICAgICAgIEZYX0ZMT0FUIGQxLAorICAgICAgICAgICAgIEZYX0ZMT0FUIGUxLAorICAgICAgICAgICAgIEZYX0ZMT0FUIGYxKSB7CisgICAgYSA9IGExOworICAgIGIgPSBiMTsKKyAgICBjID0gYzE7CisgICAgZCA9IGQxOworICAgIGUgPSBlMTsKKyAgICBmID0gZjE7CisgIH0KIAotICAgIENGWF9NYXRyaXgoRlhfRkxPQVQgYTEsIEZYX0ZMT0FUIGIxLCBGWF9GTE9BVCBjMSwgRlhfRkxPQVQgZDEsIEZYX0ZMT0FUIGUxLCBGWF9GTE9BVCBmMSkKLSAgICB7Ci0gICAgICAgIGEgPSBhMTsKLSAgICAgICAgYiA9IGIxOwotICAgICAgICBjID0gYzE7Ci0gICAgICAgIGQgPSBkMTsKLSAgICAgICAgZSA9IGUxOwotICAgICAgICBmID0gZjE7Ci0gICAgfQorICB2b2lkIFNldChGWF9GTE9BVCBhLAorICAgICAgICAgICBGWF9GTE9BVCBiLAorICAgICAgICAgICBGWF9GTE9BVCBjLAorICAgICAgICAgICBGWF9GTE9BVCBkLAorICAgICAgICAgICBGWF9GTE9BVCBlLAorICAgICAgICAgICBGWF9GTE9BVCBmKTsKKyAgdm9pZCBTZXQoY29uc3QgRlhfRkxPQVQgbls2XSk7CiAKLSAgICB2b2lkCQkJU2V0KEZYX0ZMT0FUIGEsIEZYX0ZMT0FUIGIsIEZYX0ZMT0FUIGMsIEZYX0ZMT0FUIGQsIEZYX0ZMT0FUIGUsIEZYX0ZMT0FUIGYpOwotICAgIHZvaWQJCQlTZXQoY29uc3QgRlhfRkxPQVQgbls2XSk7CisgIHZvaWQgU2V0SWRlbnRpdHkoKSB7CisgICAgYSA9IGQgPSAxOworICAgIGIgPSBjID0gZSA9IGYgPSAwOworICB9CiAKLSAgICB2b2lkCQkJU2V0SWRlbnRpdHkoKQotICAgIHsKLSAgICAgICAgYSA9IGQgPSAxOwotICAgICAgICBiID0gYyA9IGUgPSBmID0gMDsKLSAgICB9CisgIHZvaWQgU2V0UmV2ZXJzZShjb25zdCBDRlhfTWF0cml4JiBtKTsKIAotICAgIHZvaWQJCQlTZXRSZXZlcnNlKGNvbnN0IENGWF9NYXRyaXggJm0pOworICB2b2lkIENvbmNhdChGWF9GTE9BVCBhLAorICAgICAgICAgICAgICBGWF9GTE9BVCBiLAorICAgICAgICAgICAgICBGWF9GTE9BVCBjLAorICAgICAgICAgICAgICBGWF9GTE9BVCBkLAorICAgICAgICAgICAgICBGWF9GTE9BVCBlLAorICAgICAgICAgICAgICBGWF9GTE9BVCBmLAorICAgICAgICAgICAgICBGWF9CT09MIGJQcmVwZW5kZWQgPSBGQUxTRSk7CisgIHZvaWQgQ29uY2F0KGNvbnN0IENGWF9NYXRyaXgmIG0sIEZYX0JPT0wgYlByZXBlbmRlZCA9IEZBTFNFKTsKKyAgdm9pZCBDb25jYXRJbnZlcnNlKGNvbnN0IENGWF9NYXRyaXgmIG0sIEZYX0JPT0wgYlByZXBlbmRlZCA9IEZBTFNFKTsKIAotICAgIHZvaWQJCQlDb25jYXQoRlhfRkxPQVQgYSwgRlhfRkxPQVQgYiwgRlhfRkxPQVQgYywgRlhfRkxPQVQgZCwgRlhfRkxPQVQgZSwgRlhfRkxPQVQgZiwgRlhfQk9PTCBiUHJlcGVuZGVkID0gRkFMU0UpOworICB2b2lkIENvcHkoY29uc3QgQ0ZYX01hdHJpeCYgbSkgeyAqdGhpcyA9IG07IH0KIAotICAgIHZvaWQJCQlDb25jYXQoY29uc3QgQ0ZYX01hdHJpeCAmbSwgRlhfQk9PTCBiUHJlcGVuZGVkID0gRkFMU0UpOworICBGWF9CT09MIElzSWRlbnRpdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIGEgPT0gMSAmJiBiID09IDAgJiYgYyA9PSAwICYmIGQgPT0gMSAmJiBlID09IDAgJiYgZiA9PSAwOworICB9CisgIEZYX0JPT0wgSXNJbnZlcnRpYmxlKCkgY29uc3Q7CiAKLSAgICB2b2lkCQkJQ29uY2F0SW52ZXJzZShjb25zdCBDRlhfTWF0cml4JiBtLCBGWF9CT09MIGJQcmVwZW5kZWQgPSBGQUxTRSk7Ci0gICAgdm9pZAkJCVJlc2V0KCkKLSAgICB7Ci0gICAgICAgIFNldElkZW50aXR5KCk7Ci0gICAgfQorICBGWF9CT09MIElzOTBSb3RhdGVkKCkgY29uc3Q7CiAKLSAgICB2b2lkCQkJQ29weShjb25zdCBDRlhfTWF0cml4JiBtKQotICAgIHsKLSAgICAgICAgKnRoaXMgPSBtOwotICAgIH0KKyAgRlhfQk9PTCBJc1NjYWxlZCgpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCUlzSWRlbnRpdHkoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGEgPT0gMSAmJiBiID09IDAgJiYgYyA9PSAwICYmIGQgPT0gMSAmJiBlID09IDAgJiYgZiA9PSAwOwotICAgIH0KLSAgICBGWF9CT09MCQkJSXNJbnZlcnRpYmxlKCkgY29uc3Q7CisgIHZvaWQgVHJhbnNsYXRlKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIEZYX0JPT0wgYlByZXBlbmRlZCA9IEZBTFNFKTsKIAotICAgIEZYX0JPT0wJCQlJczkwUm90YXRlZCgpIGNvbnN0OworICB2b2lkIFRyYW5zbGF0ZUkoaW50MzJfdCB4LCBpbnQzMl90IHksIEZYX0JPT0wgYlByZXBlbmRlZCA9IEZBTFNFKSB7CisgICAgVHJhbnNsYXRlKChGWF9GTE9BVCl4LCAoRlhfRkxPQVQpeSwgYlByZXBlbmRlZCk7CisgIH0KIAotICAgIEZYX0JPT0wJCQlJc1NjYWxlZCgpIGNvbnN0OworICB2b2lkIFNjYWxlKEZYX0ZMT0FUIHN4LCBGWF9GTE9BVCBzeSwgRlhfQk9PTCBiUHJlcGVuZGVkID0gRkFMU0UpOwogCi0gICAgdm9pZAkJCVRyYW5zbGF0ZShGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBGWF9CT09MIGJQcmVwZW5kZWQgPSBGQUxTRSk7CisgIHZvaWQgUm90YXRlKEZYX0ZMT0FUIGZSYWRpYW4sIEZYX0JPT0wgYlByZXBlbmRlZCA9IEZBTFNFKTsKIAotICAgIHZvaWQJCQlUcmFuc2xhdGVJKEZYX0lOVDMyIHgsIEZYX0lOVDMyIHksIEZYX0JPT0wgYlByZXBlbmRlZCA9IEZBTFNFKQotICAgIHsKLSAgICAgICAgVHJhbnNsYXRlKChGWF9GTE9BVCl4LCAoRlhfRkxPQVQpeSwgYlByZXBlbmRlZCk7Ci0gICAgfQorICB2b2lkIFJvdGF0ZUF0KEZYX0ZMT0FUIGZSYWRpYW4sCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgeCwKKyAgICAgICAgICAgICAgICBGWF9GTE9BVCB5LAorICAgICAgICAgICAgICAgIEZYX0JPT0wgYlByZXBlbmRlZCA9IEZBTFNFKTsKIAotICAgIHZvaWQJCQlTY2FsZShGWF9GTE9BVCBzeCwgRlhfRkxPQVQgc3ksIEZYX0JPT0wgYlByZXBlbmRlZCA9IEZBTFNFKTsKKyAgdm9pZCBTaGVhcihGWF9GTE9BVCBmQWxwaGFSYWRpYW4sCisgICAgICAgICAgICAgRlhfRkxPQVQgZkJldGFSYWRpYW4sCisgICAgICAgICAgICAgRlhfQk9PTCBiUHJlcGVuZGVkID0gRkFMU0UpOwogCi0gICAgdm9pZAkJCVJvdGF0ZShGWF9GTE9BVCBmUmFkaWFuLCBGWF9CT09MIGJQcmVwZW5kZWQgPSBGQUxTRSk7CisgIHZvaWQgTWF0Y2hSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIGRlc3QsIGNvbnN0IENGWF9GbG9hdFJlY3QmIHNyYyk7CiAKLSAgICB2b2lkCQkJUm90YXRlQXQoRlhfRkxPQVQgZlJhZGlhbiwgRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgRlhfQk9PTCBiUHJlcGVuZGVkID0gRkFMU0UpOworICBGWF9GTE9BVCBHZXRYVW5pdCgpIGNvbnN0OwogCi0gICAgdm9pZAkJCVNoZWFyKEZYX0ZMT0FUIGZBbHBoYVJhZGlhbiwgRlhfRkxPQVQgZkJldGFSYWRpYW4sIEZYX0JPT0wgYlByZXBlbmRlZCA9IEZBTFNFKTsKKyAgRlhfRkxPQVQgR2V0WVVuaXQoKSBjb25zdDsKKyAgdm9pZCBHZXRVbml0UmVjdChDRlhfUmVjdEYmIHJlY3QpIGNvbnN0OwogCi0gICAgdm9pZAkJCU1hdGNoUmVjdChjb25zdCBDRlhfRmxvYXRSZWN0ICZkZXN0LCBjb25zdCBDRlhfRmxvYXRSZWN0ICZzcmMpOworICBDRlhfRmxvYXRSZWN0IEdldFVuaXRSZWN0KCkgY29uc3Q7CiAKLSAgICBGWF9GTE9BVAkJR2V0WFVuaXQoKSBjb25zdDsKKyAgRlhfRkxPQVQgR2V0VW5pdEFyZWEoKSBjb25zdDsKKyAgRlhfRkxPQVQgVHJhbnNmb3JtWERpc3RhbmNlKEZYX0ZMT0FUIGR4KSBjb25zdDsKKyAgaW50MzJfdCBUcmFuc2Zvcm1YRGlzdGFuY2UoaW50MzJfdCBkeCkgY29uc3Q7CisgIEZYX0ZMT0FUIFRyYW5zZm9ybVlEaXN0YW5jZShGWF9GTE9BVCBkeSkgY29uc3Q7CisgIGludDMyX3QgVHJhbnNmb3JtWURpc3RhbmNlKGludDMyX3QgZHkpIGNvbnN0OworICBGWF9GTE9BVCBUcmFuc2Zvcm1EaXN0YW5jZShGWF9GTE9BVCBkeCwgRlhfRkxPQVQgZHkpIGNvbnN0OworICBpbnQzMl90IFRyYW5zZm9ybURpc3RhbmNlKGludDMyX3QgZHgsIGludDMyX3QgZHkpIGNvbnN0OwogCi0gICAgRlhfRkxPQVQJCUdldFlVbml0KCkgY29uc3Q7Ci0gICAgdm9pZAkJCUdldFVuaXRSZWN0KENGWF9SZWN0RiAmcmVjdCkgY29uc3Q7CisgIEZYX0ZMT0FUIFRyYW5zZm9ybURpc3RhbmNlKEZYX0ZMT0FUIGRpc3RhbmNlKSBjb25zdDsKKyAgdm9pZCBUcmFuc2Zvcm1Qb2ludChGWF9GTE9BVCYgeCwgRlhfRkxPQVQmIHkpIGNvbnN0OworICB2b2lkIFRyYW5zZm9ybVBvaW50KGludDMyX3QmIHgsIGludDMyX3QmIHkpIGNvbnN0OworICB2b2lkIFRyYW5zZm9ybVBvaW50cyhDRlhfUG9pbnRGKiBwb2ludHMsIGludDMyX3QgaUNvdW50KSBjb25zdDsKKyAgdm9pZCBUcmFuc2Zvcm1Qb2ludHMoQ0ZYX1BvaW50KiBwb2ludHMsIGludDMyX3QgaUNvdW50KSBjb25zdDsKIAotICAgIENGWF9GbG9hdFJlY3QJR2V0VW5pdFJlY3QoKSBjb25zdDsKKyAgdm9pZCBUcmFuc2Zvcm0oRlhfRkxPQVQmIHgsIEZYX0ZMT0FUJiB5KSBjb25zdCB7IFRyYW5zZm9ybVBvaW50KHgsIHkpOyB9CiAKLSAgICBGWF9GTE9BVAkJR2V0VW5pdEFyZWEoKSBjb25zdDsKLSAgICBGWF9GTE9BVAkJVHJhbnNmb3JtWERpc3RhbmNlKEZYX0ZMT0FUIGR4KSBjb25zdDsKLSAgICBGWF9JTlQzMgkJVHJhbnNmb3JtWERpc3RhbmNlKEZYX0lOVDMyIGR4KSBjb25zdDsKLSAgICBGWF9GTE9BVAkJVHJhbnNmb3JtWURpc3RhbmNlKEZYX0ZMT0FUIGR5KSBjb25zdDsKLSAgICBGWF9JTlQzMgkJVHJhbnNmb3JtWURpc3RhbmNlKEZYX0lOVDMyIGR5KSBjb25zdDsKLSAgICBGWF9GTE9BVAkJVHJhbnNmb3JtRGlzdGFuY2UoRlhfRkxPQVQgZHgsIEZYX0ZMT0FUIGR5KSBjb25zdDsKLSAgICBGWF9JTlQzMgkJVHJhbnNmb3JtRGlzdGFuY2UoRlhfSU5UMzIgZHgsIEZYX0lOVDMyIGR5KSBjb25zdDsKKyAgdm9pZCBUcmFuc2Zvcm0oRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgRlhfRkxPQVQmIHgxLCBGWF9GTE9BVCYgeTEpIGNvbnN0IHsKKyAgICB4MSA9IHgsIHkxID0geTsKKyAgICBUcmFuc2Zvcm1Qb2ludCh4MSwgeTEpOworICB9CisgIHZvaWQgVHJhbnNmb3JtVmVjdG9yKENGWF9WZWN0b3JGJiB2KSBjb25zdDsKKyAgdm9pZCBUcmFuc2Zvcm1WZWN0b3IoQ0ZYX1ZlY3RvciYgdikgY29uc3Q7CisgIHZvaWQgVHJhbnNmb3JtUmVjdChDRlhfUmVjdEYmIHJlY3QpIGNvbnN0OworICB2b2lkIFRyYW5zZm9ybVJlY3QoQ0ZYX1JlY3QmIHJlY3QpIGNvbnN0OwogCi0gICAgRlhfRkxPQVQJCVRyYW5zZm9ybURpc3RhbmNlKEZYX0ZMT0FUIGRpc3RhbmNlKSBjb25zdDsKLSAgICB2b2lkCQkJVHJhbnNmb3JtUG9pbnQoRlhfRkxPQVQgJngsIEZYX0ZMT0FUICZ5KSBjb25zdDsKLSAgICB2b2lkCQkJVHJhbnNmb3JtUG9pbnQoRlhfSU5UMzIgJngsIEZYX0lOVDMyICZ5KSBjb25zdDsKLSAgICB2b2lkCQkJVHJhbnNmb3JtUG9pbnRzKENGWF9Qb2ludEYgKnBvaW50cywgRlhfSU5UMzIgaUNvdW50KSBjb25zdDsKLSAgICB2b2lkCQkJVHJhbnNmb3JtUG9pbnRzKENGWF9Qb2ludCAqcG9pbnRzLCBGWF9JTlQzMiBpQ291bnQpIGNvbnN0OworICB2b2lkIFRyYW5zZm9ybVJlY3QoRlhfRkxPQVQmIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgdG9wLAorICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGJvdHRvbSkgY29uc3Q7CiAKLSAgICB2b2lkCQkJVHJhbnNmb3JtKEZYX0ZMT0FUJiB4LCBGWF9GTE9BVCYgeSkgY29uc3QKLSAgICB7Ci0gICAgICAgIFRyYW5zZm9ybVBvaW50KHgsIHkpOwotICAgIH0KKyAgdm9pZCBUcmFuc2Zvcm1SZWN0KENGWF9GbG9hdFJlY3QmIHJlY3QpIGNvbnN0IHsKKyAgICBUcmFuc2Zvcm1SZWN0KHJlY3QubGVmdCwgcmVjdC5yaWdodCwgcmVjdC50b3AsIHJlY3QuYm90dG9tKTsKKyAgfQogCi0gICAgdm9pZAkJCVRyYW5zZm9ybShGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBGWF9GTE9BVCYgeDEsIEZYX0ZMT0FUJiB5MSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHgxID0geCwgeTEgPSB5OwotICAgICAgICBUcmFuc2Zvcm1Qb2ludCh4MSwgeTEpOwotICAgIH0KLSAgICB2b2lkCQkJVHJhbnNmb3JtVmVjdG9yKENGWF9WZWN0b3JGICZ2KSBjb25zdDsKLSAgICB2b2lkCQkJVHJhbnNmb3JtVmVjdG9yKENGWF9WZWN0b3IgJnYpIGNvbnN0OwotICAgIHZvaWQJCQlUcmFuc2Zvcm1SZWN0KENGWF9SZWN0RiAmcmVjdCkgY29uc3Q7Ci0gICAgdm9pZAkJCVRyYW5zZm9ybVJlY3QoQ0ZYX1JlY3QgJnJlY3QpIGNvbnN0OworICBGWF9GTE9BVCBHZXRBKCkgY29uc3QgeyByZXR1cm4gYTsgfQogCi0gICAgdm9pZAkJCVRyYW5zZm9ybVJlY3QoRlhfRkxPQVQmIGxlZnQsIEZYX0ZMT0FUJiByaWdodCwgRlhfRkxPQVQmIHRvcCwgRlhfRkxPQVQmIGJvdHRvbSkgY29uc3Q7CisgIEZYX0ZMT0FUIEdldEIoKSBjb25zdCB7IHJldHVybiBiOyB9CiAKLSAgICB2b2lkCQkJVHJhbnNmb3JtUmVjdChDRlhfRmxvYXRSZWN0JiByZWN0KSBjb25zdAotICAgIHsKLSAgICAgICAgVHJhbnNmb3JtUmVjdChyZWN0LmxlZnQsIHJlY3QucmlnaHQsIHJlY3QudG9wLCByZWN0LmJvdHRvbSk7Ci0gICAgfQorICBGWF9GTE9BVCBHZXRDKCkgY29uc3QgeyByZXR1cm4gYzsgfQogCi0gICAgRlhfRkxPQVQJCUdldEEoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGE7Ci0gICAgfQorICBGWF9GTE9BVCBHZXREKCkgY29uc3QgeyByZXR1cm4gZDsgfQogCi0gICAgRlhfRkxPQVQJCUdldEIoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGI7Ci0gICAgfQorICBGWF9GTE9BVCBHZXRFKCkgY29uc3QgeyByZXR1cm4gZTsgfQogCi0gICAgRlhfRkxPQVQJCUdldEMoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGM7Ci0gICAgfQorICBGWF9GTE9BVCBHZXRGKCkgY29uc3QgeyByZXR1cm4gZjsgfQogCi0gICAgRlhfRkxPQVQJCUdldEQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGQ7Ci0gICAgfQotCi0gICAgRlhfRkxPQVQJCUdldEUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGU7Ci0gICAgfQotCi0gICAgRlhfRkxPQVQJCUdldEYoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGY7Ci0gICAgfQotcHVibGljOgotICAgIEZYX0ZMT0FUIGE7Ci0gICAgRlhfRkxPQVQgYjsKLSAgICBGWF9GTE9BVCBjOwotICAgIEZYX0ZMT0FUIGQ7Ci0gICAgRlhfRkxPQVQgZTsKLSAgICBGWF9GTE9BVCBmOworIHB1YmxpYzoKKyAgRlhfRkxPQVQgYTsKKyAgRlhfRkxPQVQgYjsKKyAgRlhfRkxPQVQgYzsKKyAgRlhfRkxPQVQgZDsKKyAgRlhfRkxPQVQgZTsKKyAgRlhfRkxPQVQgZjsKIH07Ci0jZGVmaW5lIENGWF9BZmZpbmVNYXRyaXgJQ0ZYX01hdHJpeAogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GWENSVF9GWF9DT09SRElOQVRFU19IXwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2V4dC5oIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2V4dC5oCmluZGV4IDNkMGNkZWQuLjNmNGY2NjggMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9leHQuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfZXh0LmgKQEAgLTEsOTQgKzEsMTI0IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgQ09SRV9JTkNMVURFX0ZYQ1JUX0ZYX0VYVF9IXwogI2RlZmluZSBDT1JFX0lOQ0xVREVfRlhDUlRfRlhfRVhUX0hfCiAKLSNpbmNsdWRlICJmeF9hcmIuaCIKLSNpbmNsdWRlICJmeF9iYXNpYy5oIgotI2luY2x1ZGUgImZ4X2Nvb3JkaW5hdGVzLmgiCi0jaW5jbHVkZSAiZnhfdWNkLmgiCi0jaW5jbHVkZSAiZnhfeG1sLmgiCisjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPGN3Y3R5cGU+CiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKIAotRlhfRkxPQVQJCUZYU1lTX3RhbihGWF9GTE9BVCBhKTsKLUZYX0ZMT0FUCQlGWFNZU19sb2diKEZYX0ZMT0FUIGIsIEZYX0ZMT0FUIHgpOwotRlhfRkxPQVQJCUZYU1lTX3N0cnRvZihGWF9MUENTVFIgcGNzU3RyLCBGWF9JTlQzMiBpTGVuZ3RoID0gLTEsIEZYX0lOVDMyICpwVXNlZExlbiA9IE5VTEwpOwotRlhfRkxPQVQJCUZYU1lTX3djc3RvZihGWF9MUENXU1RSIHB3c1N0ciwgRlhfSU5UMzIgaUxlbmd0aCA9IC0xLCBGWF9JTlQzMiAqcFVzZWRMZW4gPSBOVUxMKTsKLUZYX0xQV1NUUgkJRlhTWVNfd2NzbmNweShGWF9MUFdTVFIgZHN0U3RyLCBGWF9MUENXU1RSIHNyY1N0ciwgc2l6ZV90IGNvdW50KTsKLUZYX0lOVDMyCQlGWFNZU193Y3NuaWNtcChGWF9MUENXU1RSIHMxLCBGWF9MUENXU1RSIHMyLCBzaXplX3QgY291bnQpOwotRlhfSU5UMzIJCUZYU1lTX3N0cm5pY21wKEZYX0xQQ1NUUiBzMSwgRlhfTFBDU1RSIHMyLCBzaXplX3QgY291bnQpOworRlhfRkxPQVQgRlhTWVNfdGFuKEZYX0ZMT0FUIGEpOworRlhfRkxPQVQgRlhTWVNfbG9nYihGWF9GTE9BVCBiLCBGWF9GTE9BVCB4KTsKK0ZYX0ZMT0FUIEZYU1lTX3N0cnRvZihjb25zdCBGWF9DSEFSKiBwY3NTdHIsCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoID0gLTEsCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcFVzZWRMZW4gPSBOVUxMKTsKK0ZYX0ZMT0FUIEZYU1lTX3djc3RvZihjb25zdCBGWF9XQ0hBUiogcHdzU3RyLAorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBVc2VkTGVuID0gTlVMTCk7CitGWF9XQ0hBUiogRlhTWVNfd2NzbmNweShGWF9XQ0hBUiogZHN0U3RyLCBjb25zdCBGWF9XQ0hBUiogc3JjU3RyLCBzaXplX3QgY291bnQpOworaW50MzJfdCBGWFNZU193Y3NuaWNtcChjb25zdCBGWF9XQ0hBUiogczEsIGNvbnN0IEZYX1dDSEFSKiBzMiwgc2l6ZV90IGNvdW50KTsKK2ludDMyX3QgRlhTWVNfc3RybmljbXAoY29uc3QgRlhfQ0hBUiogczEsIGNvbnN0IEZYX0NIQVIqIHMyLCBzaXplX3QgY291bnQpOwogCi1pbmxpbmUgRlhfQk9PTAlGWFNZU19pc2xvd2VyKEZYX0lOVDMyIGNoKQotewotICAgIHJldHVybiBjaCA+PSAnYScgJiYgY2ggPD0gJ3onOworaW5saW5lIEZYX0JPT0wgRlhTWVNfaXNsb3dlcihpbnQzMl90IGNoKSB7CisgIHJldHVybiBjaCA+PSAnYScgJiYgY2ggPD0gJ3onOwogfQotaW5saW5lIEZYX0JPT0wJRlhTWVNfaXN1cHBlcihGWF9JTlQzMiBjaCkKLXsKLSAgICByZXR1cm4gY2ggPj0gJ0EnICYmIGNoIDw9ICdaJzsKK2lubGluZSBGWF9CT09MIEZYU1lTX2lzdXBwZXIoaW50MzJfdCBjaCkgeworICByZXR1cm4gY2ggPj0gJ0EnICYmIGNoIDw9ICdaJzsKIH0KLWlubGluZSBGWF9JTlQzMglGWFNZU190b2xvd2VyKEZYX0lOVDMyIGNoKQotewotICAgIHJldHVybiBjaCA8ICdBJyB8fCBjaCA+ICdaJyA/IGNoIDogKGNoICsgMHgyMCk7CitpbmxpbmUgaW50MzJfdCBGWFNZU190b2xvd2VyKGludDMyX3QgY2gpIHsKKyAgcmV0dXJuIGNoIDwgJ0EnIHx8IGNoID4gJ1onID8gY2ggOiAoY2ggKyAweDIwKTsKIH0KLWlubGluZSBGWF9JTlQzMiBGWFNZU190b3VwcGVyKEZYX0lOVDMyIGNoKQotewotICAgIHJldHVybiBjaCA8ICdhJyB8fCBjaCA+ICd6JyA/IGNoIDogKGNoIC0gMHgyMCk7CitpbmxpbmUgaW50MzJfdCBGWFNZU190b3VwcGVyKGludDMyX3QgY2gpIHsKKyAgcmV0dXJuIGNoIDwgJ2EnIHx8IGNoID4gJ3onID8gY2ggOiAoY2ggLSAweDIwKTsKK30KK2lubGluZSBGWF9CT09MIEZYU1lTX2lzd2FscGhhKHdjaGFyX3Qgd2NoKSB7CisgIHJldHVybiAod2NoID49IEwnQScgJiYgd2NoIDw9IEwnWicpIHx8ICh3Y2ggPj0gTCdhJyAmJiB3Y2ggPD0gTCd6Jyk7Cit9CitpbmxpbmUgRlhfQk9PTCBGWFNZU19pc3dkaWdpdCh3Y2hhcl90IHdjaCkgeworICByZXR1cm4gd2NoID49IEwnMCcgJiYgd2NoIDw9IEwnOSc7Cit9CitpbmxpbmUgRlhfQk9PTCBGWFNZU19pc3dhbG51bSh3Y2hhcl90IHdjaCkgeworICByZXR1cm4gRlhTWVNfaXN3YWxwaGEod2NoKSB8fCBGWFNZU19pc3dkaWdpdCh3Y2gpOwogfQogCi1GWF9EV09SRAlGWF9IYXNoQ29kZV9TdHJpbmdfR2V0QShGWF9MUENTVFIgcFN0ciwgRlhfSU5UMzIgaUxlbmd0aCwgRlhfQk9PTCBiSWdub3JlQ2FzZSA9IEZBTFNFKTsKLUZYX0RXT1JECUZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKEZYX0xQQ1dTVFIgcFN0ciwgRlhfSU5UMzIgaUxlbmd0aCwgRlhfQk9PTCBiSWdub3JlQ2FzZSA9IEZBTFNFKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCitpbmxpbmUgaW50IEZYU1lTX3RvSGV4RGlnaXQoY29uc3QgRlhfQ0hBUiBjKSB7CisgIGlmICghc3RkOjppc3hkaWdpdChjKSkKKyAgICByZXR1cm4gMDsKKyAgY2hhciB1cGNoYXIgPSBzdGQ6OnRvdXBwZXIoYyk7CisgIHJldHVybiB1cGNoYXIgPiAnOScgPyB1cGNoYXIgLSAnQScgKyAxMCA6IHVwY2hhciAtICcwJzsKIH0KLSNlbmRpZgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgogCi1GWF9MUFZPSUQJRlhfUmFuZG9tX01UX1N0YXJ0KEZYX0RXT1JEIGR3U2VlZCk7Ci0KLUZYX0RXT1JECUZYX1JhbmRvbV9NVF9HZW5lcmF0ZShGWF9MUFZPSUQgcENvbnRleHQpOwotCi12b2lkCQlGWF9SYW5kb21fTVRfQ2xvc2UoRlhfTFBWT0lEIHBDb250ZXh0KTsKLQotdm9pZAkJRlhfUmFuZG9tX0dlbmVyYXRlQmFzZShGWF9MUERXT1JEIHBCdWZmZXIsIEZYX0lOVDMyIGlDb3VudCk7Ci0KLXZvaWQJCUZYX1JhbmRvbV9HZW5lcmF0ZU1UKEZYX0xQRFdPUkQgcEJ1ZmZlciwgRlhfSU5UMzIgaUNvdW50KTsKLQotdm9pZAkJRlhfUmFuZG9tX0dlbmVyYXRlQ3J5cHRvKEZYX0xQRFdPUkQgcEJ1ZmZlciwgRlhfSU5UMzIgaUNvdW50KTsKLSNpZmRlZiBfX2NwbHVzcGx1cworaW5saW5lIGludCBGWFNZU190b0RlY2ltYWxEaWdpdChjb25zdCBGWF9DSEFSIGMpIHsKKyAgaWYgKCFzdGQ6OmlzZGlnaXQoYykpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBjIC0gJzAnOwogfQotI2VuZGlmCi10ZW1wbGF0ZTxjbGFzcyBiYXNlVHlwZT4KLWNsYXNzIENGWF9TU29ydFRlbXBsYXRlCi17Ci1wdWJsaWM6Ci0gICAgdm9pZCBTaGVsbFNvcnQoYmFzZVR5cGUgKnBBcnJheSwgRlhfSU5UMzIgaUNvdW50KQotICAgIHsKLSAgICAgICAgRlhTWVNfYXNzZXJ0KHBBcnJheSAhPSBOVUxMICYmIGlDb3VudCA+IDApOwotICAgICAgICBGWF9JTlQzMiBpLCBqLCBnYXA7Ci0gICAgICAgIGJhc2VUeXBlIHYxLCB2MjsKLSAgICAgICAgZ2FwID0gaUNvdW50ID4+IDE7Ci0gICAgICAgIHdoaWxlIChnYXAgPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKGkgPSBnYXA7IGkgPCBpQ291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBqID0gaSAtIGdhcDsKLSAgICAgICAgICAgICAgICB2MSA9IHBBcnJheVtpXTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaiA+IC0xICYmICh2MiA9IHBBcnJheVtqXSkgPiB2MSkgewotICAgICAgICAgICAgICAgICAgICBwQXJyYXlbaiArIGdhcF0gPSB2MjsKLSAgICAgICAgICAgICAgICAgICAgaiAtPSBnYXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBBcnJheVtqICsgZ2FwXSA9IHYxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2FwID4+PSAxOworCitpbmxpbmUgaW50IEZYU1lTX3RvRGVjaW1hbERpZ2l0V2lkZShjb25zdCBGWF9XQ0hBUiBjKSB7CisgIGlmICghc3RkOjppc3dkaWdpdChjKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIGMgLSBMJzAnOworfQorCitGWF9EV09SRCBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0QShjb25zdCBGWF9DSEFSKiBwU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSWdub3JlQ2FzZSA9IEZBTFNFKTsKK0ZYX0RXT1JEIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKGNvbnN0IEZYX1dDSEFSKiBwU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSWdub3JlQ2FzZSA9IEZBTFNFKTsKKwordm9pZCogRlhfUmFuZG9tX01UX1N0YXJ0KEZYX0RXT1JEIGR3U2VlZCk7CisKK0ZYX0RXT1JEIEZYX1JhbmRvbV9NVF9HZW5lcmF0ZSh2b2lkKiBwQ29udGV4dCk7CisKK3ZvaWQgRlhfUmFuZG9tX01UX0Nsb3NlKHZvaWQqIHBDb250ZXh0KTsKKwordm9pZCBGWF9SYW5kb21fR2VuZXJhdGVCYXNlKEZYX0RXT1JEKiBwQnVmZmVyLCBpbnQzMl90IGlDb3VudCk7CisKK3ZvaWQgRlhfUmFuZG9tX0dlbmVyYXRlTVQoRlhfRFdPUkQqIHBCdWZmZXIsIGludDMyX3QgaUNvdW50KTsKKwordm9pZCBGWF9SYW5kb21fR2VuZXJhdGVDcnlwdG8oRlhfRFdPUkQqIHBCdWZmZXIsIGludDMyX3QgaUNvdW50KTsKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCit0eXBlZGVmIHN0cnVjdCBGWF9HVUlEIHsKKyAgRlhfRFdPUkQgZGF0YTE7CisgIEZYX1dPUkQgZGF0YTI7CisgIEZYX1dPUkQgZGF0YTM7CisgIHVpbnQ4X3QgZGF0YTRbOF07Cit9IEZYX0dVSUQsICpGWF9MUEdVSUQ7Cit0eXBlZGVmIEZYX0dVSUQgY29uc3QqIEZYX0xQQ0dVSUQ7Cit2b2lkIEZYX0dVSURfQ3JlYXRlVjQoRlhfTFBHVUlEIHBHVUlEKTsKK3ZvaWQgRlhfR1VJRF9Ub1N0cmluZyhGWF9MUENHVUlEIHBHVUlELAorICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBic1N0ciwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXBhcmF0b3IgPSBUUlVFKTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKwordGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPgorY2xhc3MgQ0ZYX1NTb3J0VGVtcGxhdGUgeworIHB1YmxpYzoKKyAgdm9pZCBTaGVsbFNvcnQoYmFzZVR5cGUqIHBBcnJheSwgaW50MzJfdCBpQ291bnQpIHsKKyAgICBGWFNZU19hc3NlcnQocEFycmF5ICYmIGlDb3VudCA+IDApOworICAgIGludDMyX3QgaSwgaiwgZ2FwOworICAgIGJhc2VUeXBlIHYxLCB2MjsKKyAgICBnYXAgPSBpQ291bnQgPj4gMTsKKyAgICB3aGlsZSAoZ2FwID4gMCkgeworICAgICAgZm9yIChpID0gZ2FwOyBpIDwgaUNvdW50OyBpKyspIHsKKyAgICAgICAgaiA9IGkgLSBnYXA7CisgICAgICAgIHYxID0gcEFycmF5W2ldOworICAgICAgICB3aGlsZSAoaiA+IC0xICYmICh2MiA9IHBBcnJheVtqXSkgPiB2MSkgeworICAgICAgICAgIHBBcnJheVtqICsgZ2FwXSA9IHYyOworICAgICAgICAgIGogLT0gZ2FwOwogICAgICAgICB9CisgICAgICAgIHBBcnJheVtqICsgZ2FwXSA9IHYxOworICAgICAgfQorICAgICAgZ2FwID4+PSAxOwogICAgIH0KKyAgfQogfTsKIAogI2VuZGlmICAvLyBDT1JFX0lOQ0xVREVfRlhDUlRfRlhfRVhUX0hfCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfbWVtb3J5LmggYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfbWVtb3J5LmgKaW5kZXggYzZhN2Q0OC4uYzYwN2RlMiAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X21lbW9yeS5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9tZW1vcnkuaApAQCAtMTMsOSArMTMsOSBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIC8vIEZvciBleHRlcm5hbCBDIGxpYnJhcmllcyB0byBtYWxsb2MgdGhyb3VnaCBQREZpdW0uIFRoZXNlIG1heSByZXR1cm4gTlVMTC4KLXZvaWQqCUZYTUVNX0RlZmF1bHRBbGxvYyhzaXplX3QgYnl0ZV9zaXplLCBpbnQgZmxhZ3MpOwotdm9pZCoJRlhNRU1fRGVmYXVsdFJlYWxsb2Modm9pZCogcG9pbnRlciwgc2l6ZV90IG5ld19zaXplLCBpbnQgZmxhZ3MpOwotdm9pZAlGWE1FTV9EZWZhdWx0RnJlZSh2b2lkKiBwb2ludGVyLCBpbnQgZmxhZ3MpOwordm9pZCogRlhNRU1fRGVmYXVsdEFsbG9jKHNpemVfdCBieXRlX3NpemUsIGludCBmbGFncyk7Cit2b2lkKiBGWE1FTV9EZWZhdWx0UmVhbGxvYyh2b2lkKiBwb2ludGVyLCBzaXplX3QgbmV3X3NpemUsIGludCBmbGFncyk7Cit2b2lkIEZYTUVNX0RlZmF1bHRGcmVlKHZvaWQqIHBvaW50ZXIsIGludCBmbGFncyk7CiAjaWZkZWYgX19jcGx1c3BsdXMKIH0gIC8vIGV4dGVybiAiQyIKIApAQCAtMjYsOTQgKzI2LDg0IEBACiBORVZFUl9JTkxJTkUgdm9pZCBGWF9PdXRPZk1lbW9yeVRlcm1pbmF0ZSgpOwogCiBpbmxpbmUgdm9pZCogRlhfU2FmZVJlYWxsb2Modm9pZCogcHRyLCBzaXplX3QgbnVtX21lbWJlcnMsIHNpemVfdCBtZW1iZXJfc2l6ZSkgewotICAgIGlmIChudW1fbWVtYmVycyA8IHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCkgLyBtZW1iZXJfc2l6ZSkgewotICAgICAgICByZXR1cm4gcmVhbGxvYyhwdHIsIG51bV9tZW1iZXJzICogbWVtYmVyX3NpemUpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbHB0cjsKKyAgaWYgKG51bV9tZW1iZXJzIDwgc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKSAvIG1lbWJlcl9zaXplKSB7CisgICAgcmV0dXJuIHJlYWxsb2MocHRyLCBudW1fbWVtYmVycyAqIG1lbWJlcl9zaXplKTsKKyAgfQorICByZXR1cm4gbnVsbHB0cjsKIH0KIAogaW5saW5lIHZvaWQqIEZYX0FsbG9jT3JEaWUoc2l6ZV90IG51bV9tZW1iZXJzLCBzaXplX3QgbWVtYmVyX3NpemUpIHsKLSAgICAvLyBUT0RPKHRzZXBleik6IFNlZSBpZiB3ZSBjYW4gYXZvaWQgdGhlIGltcGxpY2l0IG1lbXNldCgwKS4KLSAgICBpZiAodm9pZCogcmVzdWx0ID0gY2FsbG9jKG51bV9tZW1iZXJzLCBtZW1iZXJfc2l6ZSkpIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgRlhfT3V0T2ZNZW1vcnlUZXJtaW5hdGUoKTsgIC8vIE5ldmVyIHJldHVybnMuCi0gICAgcmV0dXJuIG51bGxwdHI7ICAvLyBTdXBwcmVzcyBjb21waWxlciB3YXJuaW5nLgorICAvLyBUT0RPKHRzZXBleik6IFNlZSBpZiB3ZSBjYW4gYXZvaWQgdGhlIGltcGxpY2l0IG1lbXNldCgwKS4KKyAgaWYgKHZvaWQqIHJlc3VsdCA9IGNhbGxvYyhudW1fbWVtYmVycywgbWVtYmVyX3NpemUpKSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBGWF9PdXRPZk1lbW9yeVRlcm1pbmF0ZSgpOyAgLy8gTmV2ZXIgcmV0dXJucy4KKyAgcmV0dXJuIG51bGxwdHI7ICAgICAgICAgICAgIC8vIFN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmcuCiB9CiAKIGlubGluZSB2b2lkKiBGWF9BbGxvY09yRGllMkQoc2l6ZV90IHcsIHNpemVfdCBoLCBzaXplX3QgbWVtYmVyX3NpemUpIHsKLSAgICBpZiAodyA8IHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCkgLyBoKSB7Ci0gICAgICAgIHJldHVybiBGWF9BbGxvY09yRGllKHcgKiBoLCBtZW1iZXJfc2l6ZSk7Ci0gICAgfQotICAgIEZYX091dE9mTWVtb3J5VGVybWluYXRlKCk7ICAvLyBOZXZlciByZXR1cm5zLgotICAgIHJldHVybiBudWxscHRyOyAgLy8gU3VwcHJlc3MgY29tcGlsZXIgd2FybmluZy4KKyAgaWYgKHcgPCBzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpIC8gaCkgeworICAgIHJldHVybiBGWF9BbGxvY09yRGllKHcgKiBoLCBtZW1iZXJfc2l6ZSk7CisgIH0KKyAgRlhfT3V0T2ZNZW1vcnlUZXJtaW5hdGUoKTsgIC8vIE5ldmVyIHJldHVybnMuCisgIHJldHVybiBudWxscHRyOyAgICAgICAgICAgICAvLyBTdXBwcmVzcyBjb21waWxlciB3YXJuaW5nLgogfQogCi1pbmxpbmUgdm9pZCogRlhfUmVhbGxvY09yRGllKHZvaWQqIHB0ciwgc2l6ZV90IG51bV9tZW1iZXJzLCBzaXplX3QgbWVtYmVyX3NpemUpIHsKLSAgICBpZiAodm9pZCogcmVzdWx0ID0gRlhfU2FmZVJlYWxsb2MocHRyLCBudW1fbWVtYmVycywgbWVtYmVyX3NpemUpKSB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIEZYX091dE9mTWVtb3J5VGVybWluYXRlKCk7ICAvLyBOZXZlciByZXR1cm5zLgotICAgIHJldHVybiBudWxscHRyOyAgLy8gU3VwcHJlc3MgY29tcGlsZXIgd2FybmluZy4KK2lubGluZSB2b2lkKiBGWF9SZWFsbG9jT3JEaWUodm9pZCogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX21lbWJlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtZW1iZXJfc2l6ZSkgeworICBpZiAodm9pZCogcmVzdWx0ID0gRlhfU2FmZVJlYWxsb2MocHRyLCBudW1fbWVtYmVycywgbWVtYmVyX3NpemUpKSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBGWF9PdXRPZk1lbW9yeVRlcm1pbmF0ZSgpOyAgLy8gTmV2ZXIgcmV0dXJucy4KKyAgcmV0dXJuIG51bGxwdHI7ICAgICAgICAgICAgIC8vIFN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmcuCiB9CiAKIC8vIE5ldmVyIHJldHVybnMgTlVMTC4KLSNkZWZpbmUgRlhfQWxsb2ModHlwZSwgc2l6ZSkgKHR5cGUqKUZYX0FsbG9jT3JEaWUoc2l6ZSwgc2l6ZW9mKHR5cGUpKQotI2RlZmluZSBGWF9BbGxvYzJEKHR5cGUsIHcsIGgpICh0eXBlKilGWF9BbGxvY09yRGllMkQodywgaCwgc2l6ZW9mKHR5cGUpKQorI2RlZmluZSBGWF9BbGxvYyh0eXBlLCBzaXplKSAodHlwZSopIEZYX0FsbG9jT3JEaWUoc2l6ZSwgc2l6ZW9mKHR5cGUpKQorI2RlZmluZSBGWF9BbGxvYzJEKHR5cGUsIHcsIGgpICh0eXBlKikgRlhfQWxsb2NPckRpZTJEKHcsIGgsIHNpemVvZih0eXBlKSkKICNkZWZpbmUgRlhfUmVhbGxvYyh0eXBlLCBwdHIsIHNpemUpIFwKLSAgICAodHlwZSopRlhfUmVhbGxvY09yRGllKHB0ciwgc2l6ZSwgc2l6ZW9mKHR5cGUpKQorICAodHlwZSopIEZYX1JlYWxsb2NPckRpZShwdHIsIHNpemUsIHNpemVvZih0eXBlKSkKIAogLy8gTWF5IHJldHVybiBOVUxMLgotI2RlZmluZSBGWF9UcnlBbGxvYyh0eXBlLCBzaXplKSAodHlwZSopY2FsbG9jKHNpemUsIHNpemVvZih0eXBlKSkKKyNkZWZpbmUgRlhfVHJ5QWxsb2ModHlwZSwgc2l6ZSkgKHR5cGUqKSBjYWxsb2Moc2l6ZSwgc2l6ZW9mKHR5cGUpKQogI2RlZmluZSBGWF9UcnlSZWFsbG9jKHR5cGUsIHB0ciwgc2l6ZSkgXAotICAgICh0eXBlKilGWF9TYWZlUmVhbGxvYyhwdHIsIHNpemUsIHNpemVvZih0eXBlKSkKKyAgKHR5cGUqKSBGWF9TYWZlUmVhbGxvYyhwdHIsIHNpemUsIHNpemVvZih0eXBlKSkKIAogI2RlZmluZSBGWF9GcmVlKHB0cikgZnJlZShwdHIpCiAKLWNsYXNzIENGWF9EZXN0cnVjdE9iamVjdCAKLXsKLXB1YmxpYzoKLQotICAgIHZpcnR1YWwgfkNGWF9EZXN0cnVjdE9iamVjdCgpIHt9CitjbGFzcyBDRlhfRGVzdHJ1Y3RPYmplY3QgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+Q0ZYX0Rlc3RydWN0T2JqZWN0KCkge30KIH07Ci1jbGFzcyBDRlhfR3Jvd09ubHlQb29sIAotewotcHVibGljOgorY2xhc3MgQ0ZYX0dyb3dPbmx5UG9vbCB7CisgcHVibGljOgorICBDRlhfR3Jvd09ubHlQb29sKHNpemVfdCB0cnVua19zaXplID0gMTYzODQpOwogCi0gICAgQ0ZYX0dyb3dPbmx5UG9vbChzaXplX3QgdHJ1bmtfc2l6ZSA9IDE2Mzg0KTsKKyAgfkNGWF9Hcm93T25seVBvb2woKTsKIAotICAgIH5DRlhfR3Jvd09ubHlQb29sKCk7CisgIHZvaWQgU2V0VHJ1bmtTaXplKHNpemVfdCB0cnVua19zaXplKSB7IG1fVHJ1bmtTaXplID0gdHJ1bmtfc2l6ZTsgfQogCi0gICAgdm9pZAlTZXRUcnVua1NpemUoc2l6ZV90IHRydW5rX3NpemUpCi0gICAgewotICAgICAgICBtX1RydW5rU2l6ZSA9IHRydW5rX3NpemU7Ci0gICAgfQorICB2b2lkKiBBbGxvY0RlYnVnKHNpemVfdCBzaXplLCBjb25zdCBGWF9DSEFSKiBmaWxlLCBpbnQgbGluZSkgeworICAgIHJldHVybiBBbGxvYyhzaXplKTsKKyAgfQogCi0gICAgdm9pZCoJQWxsb2NEZWJ1ZyhzaXplX3Qgc2l6ZSwgRlhfTFBDU1RSIGZpbGUsIGludCBsaW5lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEFsbG9jKHNpemUpOwotICAgIH0KKyAgdm9pZCogQWxsb2Moc2l6ZV90IHNpemUpOwogCi0gICAgdm9pZCoJQWxsb2Moc2l6ZV90IHNpemUpOworICB2b2lkKiBSZWFsbG9jRGVidWcodm9pZCogcCwgc2l6ZV90IG5ld19zaXplLCBjb25zdCBGWF9DSEFSKiBmaWxlLCBpbnQgbGluZSkgeworICAgIHJldHVybiBOVUxMOworICB9CiAKLSAgICB2b2lkKglSZWFsbG9jRGVidWcodm9pZCogcCwgc2l6ZV90IG5ld19zaXplLCBGWF9MUENTVFIgZmlsZSwgaW50IGxpbmUpCi0gICAgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CisgIHZvaWQqIFJlYWxsb2Modm9pZCogcCwgc2l6ZV90IG5ld19zaXplKSB7IHJldHVybiBOVUxMOyB9CiAKLSAgICB2b2lkKglSZWFsbG9jKHZvaWQqIHAsIHNpemVfdCBuZXdfc2l6ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KKyAgdm9pZCBGcmVlKHZvaWQqKSB7fQogCi0gICAgdm9pZAlGcmVlKHZvaWQqKSB7fQorICB2b2lkIEZyZWVBbGwoKTsKIAotICAgIHZvaWQJRnJlZUFsbCgpOwotcHJpdmF0ZToKKyBwcml2YXRlOgorICBzaXplX3QgbV9UcnVua1NpemU7CiAKLSAgICBzaXplX3QJbV9UcnVua1NpemU7Ci0KLSAgICB2b2lkKgltX3BGaXJzdFRydW5rOworICB2b2lkKiBtX3BGaXJzdFRydW5rOwogfTsKICNlbmRpZiAgLy8gX19jcGx1c3BsdXMKIApkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9zYWZlX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEwYmRiZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9zYWZlX3R5cGVzLmgKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIENPUkVfSU5DTFVERV9GWENSVF9GWF9TQUZFX1RZUEVTX0hfCisjZGVmaW5lIENPUkVfSU5DTFVERV9GWENSVF9GWF9TQUZFX1RZUEVTX0hfCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4gIC8vIEZvciBzaXplX3QuCisKKyNpbmNsdWRlICJmeF9zdHJlYW0uaCIgIC8vIGZvciBGWF9GSUxFU0laRS4KKyNpbmNsdWRlICJmeF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfbWF0aC5oIgorCit0eXBlZGVmIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8RlhfRFdPUkQ+IEZYX1NBRkVfRFdPUkQ7Cit0eXBlZGVmIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8aW50MzJfdD4gRlhfU0FGRV9JTlQzMjsKK3R5cGVkZWYgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxzaXplX3Q+IEZYX1NBRkVfU0laRV9UOwordHlwZWRlZiBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPEZYX0ZJTEVTSVpFPiBGWF9TQUZFX0ZJTEVTSVpFOworCisjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GWENSVF9GWF9TQUZFX1RZUEVTX0hfCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyZWFtLmggYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyZWFtLmgKaW5kZXggN2YzNjM0Mi4uZjk4ZTQ0YiAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmVhbS5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9zdHJlYW0uaApAQCAtNywxOTggKzcsMTU3IEBACiAjaWZuZGVmIENPUkVfSU5DTFVERV9GWENSVF9GWF9TVFJFQU1fSF8KICNkZWZpbmUgQ09SRV9JTkNMVURFX0ZYQ1JUX0ZYX1NUUkVBTV9IXwogCi0jaW5jbHVkZSAiZnhfbWVtb3J5LmgiCiAjaW5jbHVkZSAiZnhfc3RyaW5nLmgiCiAKLXZvaWQqIEZYX09wZW5Gb2xkZXIoRlhfTFBDU1RSIHBhdGgpOwotdm9pZCogRlhfT3BlbkZvbGRlcihGWF9MUENXU1RSIHBhdGgpOwotRlhfQk9PTCBGWF9HZXROZXh0RmlsZSh2b2lkKiBoYW5kbGUsIENGWF9CeXRlU3RyaW5nJiBmaWxlbmFtZSwgRlhfQk9PTCYgYkZvbGRlcik7Ci1GWF9CT09MIEZYX0dldE5leHRGaWxlKHZvaWQqIGhhbmRsZSwgQ0ZYX1dpZGVTdHJpbmcmIGZpbGVuYW1lLCBGWF9CT09MJiBiRm9sZGVyKTsKK3ZvaWQqIEZYX09wZW5Gb2xkZXIoY29uc3QgRlhfQ0hBUiogcGF0aCk7Cit2b2lkKiBGWF9PcGVuRm9sZGVyKGNvbnN0IEZYX1dDSEFSKiBwYXRoKTsKK0ZYX0JPT0wgRlhfR2V0TmV4dEZpbGUodm9pZCogaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJGb2xkZXIpOworRlhfQk9PTCBGWF9HZXROZXh0RmlsZSh2b2lkKiBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkZvbGRlcik7CiB2b2lkIEZYX0Nsb3NlRm9sZGVyKHZvaWQqIGhhbmRsZSk7CiBGWF9XQ0hBUiBGWF9HZXRGb2xkZXJTZXBhcmF0b3IoKTsKLXR5cGVkZWYgc3RydWN0IEZYX0hGSUxFXyB7Ci0gICAgRlhfTFBWT0lEIHBEYXRhOwotfSogRlhfSEZJTEU7CiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotI2RlZmluZSBGWF9GSUxFU0laRQkJCUZYX0lOVDMyCisjZGVmaW5lIEZYX0ZJTEVTSVpFIGludDMyX3QKICNlbHNlCiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2lmbmRlZiBPX0JJTkFSWQotI2RlZmluZSBPX0JJTkFSWSAJCTAKKyNkZWZpbmUgT19CSU5BUlkgMAogI2VuZGlmCiAjaWZuZGVmIE9fTEFSR0VGSUxFCi0jZGVmaW5lIE9fTEFSR0VGSUxFCQkwCisjZGVmaW5lIE9fTEFSR0VGSUxFIDAKICNlbmRpZgotI2RlZmluZSBGWF9GSUxFU0laRQkJCW9mZl90CisjZGVmaW5lIEZYX0ZJTEVTSVpFIG9mZl90CiAjZW5kaWYKLSNkZWZpbmUgRlhfR0VUQllURU9GRlNFVDMyKGEpCTAKLSNkZWZpbmUgRlhfR0VUQllURU9GRlNFVDQwKGEpCTAKLSNkZWZpbmUgRlhfR0VUQllURU9GRlNFVDQ4KGEpCTAKLSNkZWZpbmUgRlhfR0VUQllURU9GRlNFVDU2KGEpCTAKLSNkZWZpbmUgRlhfR0VUQllURU9GRlNFVDI0KGEpICAoKEZYX0JZVEUpKGE+PjI0KSkKLSNkZWZpbmUgRlhfR0VUQllURU9GRlNFVDE2KGEpICAoKEZYX0JZVEUpKGE+PjE2KSkKLSNkZWZpbmUgRlhfR0VUQllURU9GRlNFVDgoYSkgICAoKEZYX0JZVEUpKGE+PjgpKQotI2RlZmluZSBGWF9HRVRCWVRFT0ZGU0VUMChhKSAgICgoRlhfQllURSkoYSkpCi0jZGVmaW5lIEZYX0ZJTEVNT0RFX1dyaXRlCQkwCi0jZGVmaW5lIEZYX0ZJTEVNT0RFX1JlYWRPbmx5CTEKLSNkZWZpbmUgRlhfRklMRU1PREVfVHJ1bmNhdGUJMgotRlhfSEZJTEUJRlhfRmlsZV9PcGVuKEZYX0JTVFIgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSk7Ci1GWF9IRklMRQlGWF9GaWxlX09wZW4oRlhfV1NUUiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKTsKLXZvaWQJCUZYX0ZpbGVfQ2xvc2UoRlhfSEZJTEUgaEZpbGUpOwotRlhfRklMRVNJWkUJRlhfRmlsZV9HZXRTaXplKEZYX0hGSUxFIGhGaWxlKTsKLUZYX0ZJTEVTSVpFCUZYX0ZpbGVfR2V0UG9zaXRpb24oRlhfSEZJTEUgaEZpbGUpOwotRlhfRklMRVNJWkUJRlhfRmlsZV9TZXRQb3NpdGlvbihGWF9IRklMRSBoRmlsZSwgRlhfRklMRVNJWkUgcG9zKTsKLXNpemVfdAkJRlhfRmlsZV9SZWFkKEZYX0hGSUxFIGhGaWxlLCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpOwotc2l6ZV90CQlGWF9GaWxlX1JlYWRQb3MoRlhfSEZJTEUgaEZpbGUsIHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKTsKLXNpemVfdAkJRlhfRmlsZV9Xcml0ZShGWF9IRklMRSBoRmlsZSwgY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKTsKLXNpemVfdAkJRlhfRmlsZV9Xcml0ZVBvcyhGWF9IRklMRSBoRmlsZSwgY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpOwotRlhfQk9PTAkJRlhfRmlsZV9GbHVzaChGWF9IRklMRSBoRmlsZSk7Ci1GWF9CT09MCQlGWF9GaWxlX1RydW5jYXRlKEZYX0hGSUxFIGhGaWxlLCBGWF9GSUxFU0laRSBzekZpbGUpOwotRlhfQk9PTAkJRlhfRmlsZV9FeGlzdChGWF9CU1RSIGZpbGVOYW1lKTsKLUZYX0JPT0wJCUZYX0ZpbGVfRXhpc3QoRlhfV1NUUiBmaWxlTmFtZSk7Ci1GWF9CT09MCQlGWF9GaWxlX0RlbGV0ZShGWF9CU1RSIGZpbGVOYW1lKTsKLUZYX0JPT0wJCUZYX0ZpbGVfRGVsZXRlKEZYX1dTVFIgZmlsZU5hbWUpOwotRlhfQk9PTAkJRlhfRmlsZV9Db3B5KEZYX0JTVFIgZmlsZU5hbWVTcmMsIEZYX0JTVFIgZmlsZU5hbWVEc3QpOwotRlhfQk9PTAkJRlhfRmlsZV9Db3B5KEZYX1dTVFIgZmlsZU5hbWVTcmMsIEZYX1dTVFIgZmlsZU5hbWVEc3QpOwotRlhfQk9PTAkJRlhfRmlsZV9Nb3ZlKEZYX0JTVFIgZmlsZU5hbWVTcmMsIEZYX0JTVFIgZmlsZU5hbWVEc3QpOwotRlhfQk9PTAkJRlhfRmlsZV9Nb3ZlKEZYX1dTVFIgZmlsZU5hbWVTcmMsIEZYX1dTVFIgZmlsZU5hbWVEc3QpOwotY2xhc3MgSUZYX1N0cmVhbVdyaXRlCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+SUZYX1N0cmVhbVdyaXRlKCkgeyB9Ci0gICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCkgPSAwOworI2RlZmluZSBGWF9HRVRCWVRFT0ZGU0VUMzIoYSkgMAorI2RlZmluZSBGWF9HRVRCWVRFT0ZGU0VUNDAoYSkgMAorI2RlZmluZSBGWF9HRVRCWVRFT0ZGU0VUNDgoYSkgMAorI2RlZmluZSBGWF9HRVRCWVRFT0ZGU0VUNTYoYSkgMAorI2RlZmluZSBGWF9HRVRCWVRFT0ZGU0VUMjQoYSkgKCh1aW50OF90KShhID4+IDI0KSkKKyNkZWZpbmUgRlhfR0VUQllURU9GRlNFVDE2KGEpICgodWludDhfdCkoYSA+PiAxNikpCisjZGVmaW5lIEZYX0dFVEJZVEVPRkZTRVQ4KGEpICgodWludDhfdCkoYSA+PiA4KSkKKyNkZWZpbmUgRlhfR0VUQllURU9GRlNFVDAoYSkgKCh1aW50OF90KShhKSkKKyNkZWZpbmUgRlhfRklMRU1PREVfV3JpdGUgMAorI2RlZmluZSBGWF9GSUxFTU9ERV9SZWFkT25seSAxCisjZGVmaW5lIEZYX0ZJTEVNT0RFX1RydW5jYXRlIDIKIAotICAgIHZpcnR1YWwJRlhfQk9PTAkJV3JpdGVCbG9jayhjb25zdCB2b2lkKiBwRGF0YSwgc2l6ZV90IHNpemUpID0gMDsKK2NsYXNzIElGWF9TdHJlYW1Xcml0ZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JRlhfU3RyZWFtV3JpdGUoKSB7fQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIFdyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIHNpemVfdCBzaXplKSA9IDA7CiB9OwotY2xhc3MgSUZYX0ZpbGVXcml0ZSA6IHB1YmxpYyBJRlhfU3RyZWFtV3JpdGUKLXsKLXB1YmxpYzoKIAotICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKSA9IDA7CitjbGFzcyBJRlhfRmlsZVdyaXRlIDogcHVibGljIElGWF9TdHJlYW1Xcml0ZSB7CisgcHVibGljOgorICAvLyBJRlhfU3RyZWFtV3JpdGU6CisgIEZYX0JPT0wgV3JpdGVCbG9jayhjb25zdCB2b2lkKiBwRGF0YSwgc2l6ZV90IHNpemUpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gV3JpdGVCbG9jayhwRGF0YSwgR2V0U2l6ZSgpLCBzaXplKTsKKyAgfQogCi0gICAgdmlydHVhbCBGWF9GSUxFU0laRQkJR2V0U2l6ZSgpID0gMDsKLQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUZsdXNoKCkgPSAwOwotCi0gICAgdmlydHVhbAlGWF9CT09MCQkJV3JpdGVCbG9jayhjb25zdCB2b2lkKiBwRGF0YSwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgPSAwOwotICAgIHZpcnR1YWwJRlhfQk9PTAkJCVdyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIHNpemVfdCBzaXplKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFdyaXRlQmxvY2socERhdGEsIEdldFNpemUoKSwgc2l6ZSk7Ci0gICAgfQorICB2aXJ0dWFsIEZYX0ZJTEVTSVpFIEdldFNpemUoKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBGbHVzaCgpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIFdyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpID0gMDsKIH07Ci1JRlhfRmlsZVdyaXRlKiBGWF9DcmVhdGVGaWxlV3JpdGUoRlhfTFBDU1RSIGZpbGVuYW1lKTsKLUlGWF9GaWxlV3JpdGUqIEZYX0NyZWF0ZUZpbGVXcml0ZShGWF9MUENXU1RSIGZpbGVuYW1lKTsKLWNsYXNzIElGWF9TdHJlYW1SZWFkCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+SUZYX1N0cmVhbVJlYWQoKSB7IH0KIAotICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKSA9IDA7CitjbGFzcyBJRlhfU3RyZWFtUmVhZCB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JRlhfU3RyZWFtUmVhZCgpIHt9CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc0VPRigpID0gMDsKLQotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCUdldFBvc2l0aW9uKCkgPSAwOwotCi0gICAgdmlydHVhbCBzaXplX3QJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIElzRU9GKCkgPSAwOworICB2aXJ0dWFsIEZYX0ZJTEVTSVpFIEdldFBvc2l0aW9uKCkgPSAwOworICB2aXJ0dWFsIHNpemVfdCBSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgPSAwOwogfTsKLWNsYXNzIElGWF9GaWxlUmVhZCA6IElGWF9TdHJlYW1SZWFkCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCUdldFNpemUoKSA9IDA7CitjbGFzcyBJRlhfRmlsZVJlYWQgOiBJRlhfU3RyZWFtUmVhZCB7CisgcHVibGljOgorICAvLyBJRlhfU3RyZWFtUmVhZDoKKyAgdm9pZCBSZWxlYXNlKCkgb3ZlcnJpZGUgPSAwOworICBGWF9CT09MIElzRU9GKCkgb3ZlcnJpZGUgeyByZXR1cm4gRkFMU0U7IH0KKyAgRlhfRklMRVNJWkUgR2V0UG9zaXRpb24oKSBvdmVycmlkZSB7IHJldHVybiAwOyB9CisgIHNpemVfdCBSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNFT0YoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCUdldFBvc2l0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVNldFJhbmdlKEZYX0ZJTEVTSVpFIG9mZnNldCwgRlhfRklMRVNJWkUgc2l6ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQJCQlDbGVhclJhbmdlKCkge30KLQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpID0gMDsKLQotICAgIHZpcnR1YWwgc2l6ZV90CQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgIHZpcnR1YWwgRlhfQk9PTCBSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSA9IDA7CisgIHZpcnR1YWwgRlhfRklMRVNJWkUgR2V0U2l6ZSgpID0gMDsKIH07Ci1JRlhfRmlsZVJlYWQqIEZYX0NyZWF0ZUZpbGVSZWFkKEZYX0xQQ1NUUiBmaWxlbmFtZSk7Ci1JRlhfRmlsZVJlYWQqIEZYX0NyZWF0ZUZpbGVSZWFkKEZYX0xQQ1dTVFIgZmlsZW5hbWUpOwotY2xhc3MgSUZYX0ZpbGVTdHJlYW0gOiBwdWJsaWMgSUZYX0ZpbGVSZWFkLCBwdWJsaWMgSUZYX0ZpbGVXcml0ZQotewotcHVibGljOgogCi0gICAgdmlydHVhbCBJRlhfRmlsZVN0cmVhbSoJCVJldGFpbigpID0gMDsKK0lGWF9GaWxlUmVhZCogRlhfQ3JlYXRlRmlsZVJlYWQoY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUpOworSUZYX0ZpbGVSZWFkKiBGWF9DcmVhdGVGaWxlUmVhZChjb25zdCBGWF9XQ0hBUiogZmlsZW5hbWUpOwogCi0gICAgdmlydHVhbCB2b2lkCQkJCVJlbGVhc2UoKSA9IDA7CitjbGFzcyBJRlhfRmlsZVN0cmVhbSA6IHB1YmxpYyBJRlhfRmlsZVJlYWQsIHB1YmxpYyBJRlhfRmlsZVdyaXRlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgSUZYX0ZpbGVTdHJlYW0qIFJldGFpbigpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCQlHZXRTaXplKCkgPSAwOworICAvLyBJRlhfRmlsZVJlYWQ6CisgIHZvaWQgUmVsZWFzZSgpIG92ZXJyaWRlID0gMDsKKyAgRlhfQk9PTCBJc0VPRigpIG92ZXJyaWRlID0gMDsKKyAgRlhfRklMRVNJWkUgR2V0UG9zaXRpb24oKSBvdmVycmlkZSA9IDA7CisgIHNpemVfdCBSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGUgPSAwOworICBGWF9CT09MIFJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlID0gMDsKKyAgRlhfRklMRVNJWkUgR2V0U2l6ZSgpIG92ZXJyaWRlID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlJc0VPRigpID0gMDsKLQotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCQlHZXRQb3NpdGlvbigpID0gMDsKLQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHNpemVfdAkJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgPSAwOwotCi0gICAgdmlydHVhbAlGWF9CT09MCQkJCVdyaXRlQmxvY2soY29uc3Qgdm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSA9IDA7Ci0gICAgdmlydHVhbAlGWF9CT09MCQkJCVdyaXRlQmxvY2soY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBXcml0ZUJsb2NrKGJ1ZmZlciwgR2V0U2l6ZSgpLCBzaXplKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJRmx1c2goKSA9IDA7CisgIC8vIElGWF9GaWxlV3JpdGU6CisgIEZYX0JPT0wgV3JpdGVCbG9jayhjb25zdCB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGUgPSAwOworICBGWF9CT09MIFdyaXRlQmxvY2soY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBXcml0ZUJsb2NrKGJ1ZmZlciwgR2V0U2l6ZSgpLCBzaXplKTsKKyAgfQorICBGWF9CT09MIEZsdXNoKCkgb3ZlcnJpZGUgPSAwOwogfTsKLUlGWF9GaWxlU3RyZWFtKgkJRlhfQ3JlYXRlRmlsZVN0cmVhbShGWF9MUENTVFIgZmlsZW5hbWUsIEZYX0RXT1JEIGR3TW9kZXMpOwotSUZYX0ZpbGVTdHJlYW0qCQlGWF9DcmVhdGVGaWxlU3RyZWFtKEZYX0xQQ1dTVFIgZmlsZW5hbWUsIEZYX0RXT1JEIGR3TW9kZXMpOwotY2xhc3MgSUZYX01lbW9yeVN0cmVhbSA6IHB1YmxpYyBJRlhfRmlsZVN0cmVhbQotewotcHVibGljOgogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNDb25zZWN1dGl2ZSgpIGNvbnN0ID0gMDsKK0lGWF9GaWxlU3RyZWFtKiBGWF9DcmVhdGVGaWxlU3RyZWFtKGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLCBGWF9EV09SRCBkd01vZGVzKTsKK0lGWF9GaWxlU3RyZWFtKiBGWF9DcmVhdGVGaWxlU3RyZWFtKGNvbnN0IEZYX1dDSEFSKiBmaWxlbmFtZSwgRlhfRFdPUkQgZHdNb2Rlcyk7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCQlFc3RpbWF0ZVNpemUoc2l6ZV90IG5Jbml0U2l6ZSwgc2l6ZV90IG5Hcm93U2l6ZSkgPSAwOwotCi0gICAgdmlydHVhbCBGWF9MUEJZVEUJCUdldEJ1ZmZlcigpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZAkJCUF0dGFjaEJ1ZmZlcihGWF9MUEJZVEUgcEJ1ZmZlciwgc2l6ZV90IG5TaXplLCBGWF9CT09MIGJUYWtlT3ZlciA9IEZBTFNFKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQJCQlEZXRhY2hCdWZmZXIoKSA9IDA7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK2NsYXNzIElGWF9GaWxlQWNjZXNzIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklGWF9GaWxlQWNjZXNzKCkge30KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7CisgIHZpcnR1YWwgSUZYX0ZpbGVBY2Nlc3MqIFJldGFpbigpID0gMDsKKyAgdmlydHVhbCB2b2lkIEdldFBhdGgoQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0aCkgPSAwOworICB2aXJ0dWFsIElGWF9GaWxlU3RyZWFtKiBDcmVhdGVGaWxlU3RyZWFtKEZYX0RXT1JEIGR3TW9kZXMpID0gMDsKIH07Ci1JRlhfTWVtb3J5U3RyZWFtKglGWF9DcmVhdGVNZW1vcnlTdHJlYW0oRlhfTFBCWVRFIHBCdWZmZXIsIHNpemVfdCBuU2l6ZSwgRlhfQk9PTCBiVGFrZU92ZXIgPSBGQUxTRSk7Ci1JRlhfTWVtb3J5U3RyZWFtKglGWF9DcmVhdGVNZW1vcnlTdHJlYW0oRlhfQk9PTCBiQ29uc2VjdXRpdmUgPSBGQUxTRSk7Ci1jbGFzcyBJRlhfQnVmZmVyUmVhZCA6IHB1YmxpYyBJRlhfU3RyZWFtUmVhZAotewotcHVibGljOgorSUZYX0ZpbGVBY2Nlc3MqIEZYX0NyZWF0ZURlZmF1bHRGaWxlQWNjZXNzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NQYXRoKTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAotICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKSA9IDA7CitjbGFzcyBJRlhfTWVtb3J5U3RyZWFtIDogcHVibGljIElGWF9GaWxlU3RyZWFtIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgRlhfQk9PTCBJc0NvbnNlY3V0aXZlKCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNFT0YoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBFc3RpbWF0ZVNpemUoc2l6ZV90IG5Jbml0U2l6ZSwgc2l6ZV90IG5Hcm93U2l6ZSkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9GSUxFU0laRQkJR2V0UG9zaXRpb24oKSA9IDA7CisgIHZpcnR1YWwgdWludDhfdCogR2V0QnVmZmVyKCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBzaXplX3QJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgQXR0YWNoQnVmZmVyKHVpbnQ4X3QqIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRha2VPdmVyID0gRkFMU0UpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVJlYWROZXh0QmxvY2soRlhfQk9PTCBiUmVzdGFydCA9IEZBTFNFKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBEZXRhY2hCdWZmZXIoKSA9IDA7Cit9OworSUZYX01lbW9yeVN0cmVhbSogRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKHVpbnQ4X3QqIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRha2VPdmVyID0gRkFMU0UpOworSUZYX01lbW9yeVN0cmVhbSogRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKEZYX0JPT0wgYkNvbnNlY3V0aXZlID0gRkFMU0UpOworY2xhc3MgSUZYX0J1ZmZlclJlYWQgOiBwdWJsaWMgSUZYX1N0cmVhbVJlYWQgeworIHB1YmxpYzoKKyAgLy8gSUZYX1N0cmVhbVJlYWQ6CisgIHZvaWQgUmVsZWFzZSgpIG92ZXJyaWRlID0gMDsKKyAgRlhfQk9PTCBJc0VPRigpIG92ZXJyaWRlID0gMDsKKyAgRlhfRklMRVNJWkUgR2V0UG9zaXRpb24oKSBvdmVycmlkZSA9IDA7CisgIHNpemVfdCBSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGUgPSAwOwogCi0gICAgdmlydHVhbCBGWF9MUENCWVRFCQlHZXRCbG9ja0J1ZmZlcigpID0gMDsKLQotICAgIHZpcnR1YWwgc2l6ZV90CQkJR2V0QmxvY2tTaXplKCkgPSAwOwotCi0gICAgdmlydHVhbCBGWF9GSUxFU0laRQkJR2V0QmxvY2tPZmZzZXQoKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBSZWFkTmV4dEJsb2NrKEZYX0JPT0wgYlJlc3RhcnQgPSBGQUxTRSkgPSAwOworICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIEdldEJsb2NrQnVmZmVyKCkgPSAwOworICB2aXJ0dWFsIHNpemVfdCBHZXRCbG9ja1NpemUoKSA9IDA7CisgIHZpcnR1YWwgRlhfRklMRVNJWkUgR2V0QmxvY2tPZmZzZXQoKSA9IDA7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GWENSVF9GWF9TVFJFQU1fSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGNydC9meF9zdHJpbmcuaCBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9zdHJpbmcuaAppbmRleCBlZmJlODBhLi4xYzFlMjM3IDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyaW5nLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmluZy5oCkBAIC0yMCw4ODcgKzIwLDc4OSBAQAogCiAvLyBBbiBpbW11dGFibGUgc3RyaW5nIHdpdGggY2FsbGVyLXByb3ZpZGVkIHN0b3JhZ2Ugd2hpY2ggbXVzdCBvdXRsaXZlIHRoZQogLy8gc3RyaW5nIGl0c2VsZi4KLWNsYXNzIENGWF9CeXRlU3RyaW5nQwotewotcHVibGljOgotICAgIHR5cGVkZWYgRlhfQ0hBUiB2YWx1ZV90eXBlOworY2xhc3MgQ0ZYX0J5dGVTdHJpbmdDIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgRlhfQ0hBUiB2YWx1ZV90eXBlOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmdDKCkKLSAgICB7Ci0gICAgICAgIG1fUHRyID0gTlVMTDsKLSAgICAgICAgbV9MZW5ndGggPSAwOworICBDRlhfQnl0ZVN0cmluZ0MoKSB7CisgICAgbV9QdHIgPSBOVUxMOworICAgIG1fTGVuZ3RoID0gMDsKKyAgfQorCisgIENGWF9CeXRlU3RyaW5nQyhjb25zdCB1aW50OF90KiBwdHIsIEZYX1NUUlNJWkUgc2l6ZSkgeworICAgIG1fUHRyID0gcHRyOworICAgIG1fTGVuZ3RoID0gc2l6ZTsKKyAgfQorCisgIENGWF9CeXRlU3RyaW5nQyhjb25zdCBGWF9DSEFSKiBwdHIpIHsKKyAgICBtX1B0ciA9IChjb25zdCB1aW50OF90KilwdHI7CisgICAgbV9MZW5ndGggPSBwdHIgPyBGWFNZU19zdHJsZW4ocHRyKSA6IDA7CisgIH0KKworICAvLyB8Y2h8IG11c3QgYmUgYW4gbHZhbHVlIHRoYXQgb3V0bGl2ZXMgdGhlIHRoZSBDRlhfQnl0ZVN0cmluZ0MuIEhvd2V2ZXIsCisgIC8vIHRoZSB1c2Ugb2YgY2hhciBydmFsdWVzIGFyZSBub3QgY2F1Z2h0IGF0IGNvbXBpbGUgdGltZS4gIFRoZXkgYXJlCisgIC8vIGltcGxpY2l0bHkgcHJvbW90ZWQgdG8gQ0ZYX0J5dGVTdHJpbmcgKHNlZSBiZWxvdykgYW5kIHRoZW4gdGhlCisgIC8vIENGWF9CeXRlU3RyaW5nQyBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBDRlhfQnl0ZVN0cmluZyB2aWEgdGhlIGFsdGVybmF0ZQorICAvLyBjb25zdHJ1Y3RvciBiZWxvdy4gVGhlIENGWF9CeXRlU3RyaW5nIHRoZW4gdHlwaWNhbGx5IGdvZXMgb3V0IG9mIHNjb3BlCisgIC8vIGFuZCB8bV9QdHJ8IG1heSBiZSBsZWZ0IHBvaW50aW5nIHRvIGludmFsaWQgbWVtb3J5LiBCZXdhcmUuCisgIC8vIFRPRE8odHNlcGV6KTogTWFyayBzaW5nbGUtYXJndW1lbnQgc3RyaW5nIGNvbnN0cnVjdG9ycyBhcyBleHBsaWNpdC4KKyAgQ0ZYX0J5dGVTdHJpbmdDKEZYX0NIQVImIGNoKSB7CisgICAgbV9QdHIgPSAoY29uc3QgdWludDhfdCopJmNoOworICAgIG1fTGVuZ3RoID0gMTsKKyAgfQorCisgIENGWF9CeXRlU3RyaW5nQyhjb25zdCBGWF9DSEFSKiBwdHIsIEZYX1NUUlNJWkUgbGVuKSB7CisgICAgbV9QdHIgPSAoY29uc3QgdWludDhfdCopcHRyOworICAgIG1fTGVuZ3RoID0gKGxlbiA9PSAtMSkgPyBGWFNZU19zdHJsZW4ocHRyKSA6IGxlbjsKKyAgfQorCisgIENGWF9CeXRlU3RyaW5nQyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNyYykgeworICAgIG1fUHRyID0gc3JjLm1fUHRyOworICAgIG1fTGVuZ3RoID0gc3JjLm1fTGVuZ3RoOworICB9CisKKyAgQ0ZYX0J5dGVTdHJpbmdDKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzcmMpOworCisgIENGWF9CeXRlU3RyaW5nQyYgb3BlcmF0b3I9KGNvbnN0IEZYX0NIQVIqIHNyYykgeworICAgIG1fUHRyID0gKGNvbnN0IHVpbnQ4X3QqKXNyYzsKKyAgICBtX0xlbmd0aCA9IG1fUHRyID8gRlhTWVNfc3RybGVuKHNyYykgOiAwOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIENGWF9CeXRlU3RyaW5nQyYgb3BlcmF0b3I9KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3JjKSB7CisgICAgbV9QdHIgPSBzcmMubV9QdHI7CisgICAgbV9MZW5ndGggPSBzcmMubV9MZW5ndGg7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgQ0ZYX0J5dGVTdHJpbmdDJiBvcGVyYXRvcj0oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNyYyk7CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGNoYXIqIHB0cikgY29uc3QgeworICAgIHJldHVybiBGWFNZU19zdHJsZW4ocHRyKSA9PSBtX0xlbmd0aCAmJgorICAgICAgICAgICBGWFNZU19tZW1jbXAocHRyLCBtX1B0ciwgbV9MZW5ndGgpID09IDA7CisgIH0KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gb3RoZXIubV9MZW5ndGggPT0gbV9MZW5ndGggJiYKKyAgICAgICAgICAgRlhTWVNfbWVtY21wKG90aGVyLm1fUHRyLCBtX1B0ciwgbV9MZW5ndGgpID09IDA7CisgIH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGNoYXIqIHB0cikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBwdHIpOyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICB9CisKKyAgRlhfRFdPUkQgR2V0SUQoRlhfU1RSU0laRSBzdGFydF9wb3MgPSAwKSBjb25zdDsKKworICBjb25zdCB1aW50OF90KiBHZXRQdHIoKSBjb25zdCB7IHJldHVybiBtX1B0cjsgfQorCisgIGNvbnN0IEZYX0NIQVIqIEdldENTdHIoKSBjb25zdCB7IHJldHVybiAoY29uc3QgRlhfQ0hBUiopbV9QdHI7IH0KKworICBGWF9TVFJTSVpFIEdldExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fTGVuZ3RoOyB9CisKKyAgYm9vbCBJc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbV9MZW5ndGggPT0gMDsgfQorCisgIHVpbnQ4X3QgR2V0QXQoRlhfU1RSU0laRSBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9QdHJbaW5kZXhdOyB9CisKKyAgQ0ZYX0J5dGVTdHJpbmdDIE1pZChGWF9TVFJTSVpFIGluZGV4LCBGWF9TVFJTSVpFIGNvdW50ID0gLTEpIGNvbnN0IHsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICBpbmRleCA9IDA7CiAgICAgfQotCi0gICAgQ0ZYX0J5dGVTdHJpbmdDKEZYX0xQQ0JZVEUgcHRyLCBGWF9TVFJTSVpFIHNpemUpCi0gICAgewotICAgICAgICBtX1B0ciA9IHB0cjsKLSAgICAgICAgbV9MZW5ndGggPSBzaXplOworICAgIGlmIChpbmRleCA+IG1fTGVuZ3RoKSB7CisgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKCk7CiAgICAgfQotCi0gICAgQ0ZYX0J5dGVTdHJpbmdDKEZYX0xQQ1NUUiBwdHIpCi0gICAgewotICAgICAgICBtX1B0ciA9IChGWF9MUENCWVRFKXB0cjsKLSAgICAgICAgbV9MZW5ndGggPSBwdHIgPyBGWFNZU19zdHJsZW4ocHRyKSA6IDA7CisgICAgaWYgKGNvdW50IDwgMCB8fCBjb3VudCA+IG1fTGVuZ3RoIC0gaW5kZXgpIHsKKyAgICAgIGNvdW50ID0gbV9MZW5ndGggLSBpbmRleDsKICAgICB9CisgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQyhtX1B0ciArIGluZGV4LCBjb3VudCk7CisgIH0KIAotICAgIC8vIHxjaHwgbXVzdCBiZSBhbiBsdmFsdWUgdGhhdCBvdXRsaXZlcyB0aGUgdGhlIENGWF9CeXRlU3RyaW5nQy4gSG93ZXZlciwKLSAgICAvLyB0aGUgdXNlIG9mIGNoYXIgcnZhbHVlcyBhcmUgbm90IGNhdWdodCBhdCBjb21waWxlIHRpbWUuICBUaGV5IGFyZQotICAgIC8vIGltcGxpY2l0bHkgcHJvbW90ZWQgdG8gQ0ZYX0J5dGVTdHJpbmcgKHNlZSBiZWxvdykgYW5kIHRoZW4gdGhlCi0gICAgLy8gQ0ZYX0J5dGVTdHJpbmdDIGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlIENGWF9CeXRlU3RyaW5nIHZpYSB0aGUgYWx0ZXJuYXRlCi0gICAgLy8gY29uc3RydWN0b3IgYmVsb3cuIFRoZSBDRlhfQnl0ZVN0cmluZyB0aGVuIHR5cGljYWxseSBnb2VzIG91dCBvZiBzY29wZQotICAgIC8vIGFuZCB8bV9QdHJ8IG1heSBiZSBsZWZ0IHBvaW50aW5nIHRvIGludmFsaWQgbWVtb3J5LiBCZXdhcmUuCi0gICAgLy8gVE9ETyh0c2VwZXopOiBNYXJrIHNpbmdsZS1hcmd1bWVudCBzdHJpbmcgY29uc3RydWN0b3JzIGFzIGV4cGxpY2l0LgotICAgIENGWF9CeXRlU3RyaW5nQyhGWF9DSEFSJiBjaCkKLSAgICB7Ci0gICAgICAgIG1fUHRyID0gKEZYX0xQQ0JZVEUpJmNoOwotICAgICAgICBtX0xlbmd0aCA9IDE7Ci0gICAgfQorICBjb25zdCB1aW50OF90JiBvcGVyYXRvcltdKHNpemVfdCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9QdHJbaW5kZXhdOyB9CiAKLSAgICBDRlhfQnl0ZVN0cmluZ0MoRlhfTFBDU1RSIHB0ciwgRlhfU1RSU0laRSBsZW4pCi0gICAgewotICAgICAgICBtX1B0ciA9IChGWF9MUENCWVRFKXB0cjsKLSAgICAgICAgbV9MZW5ndGggPSAobGVuID09IC0xKSA/IEZYU1lTX3N0cmxlbihwdHIpIDogbGVuOwotICAgIH0KKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0aGF0KSBjb25zdCB7CisgICAgaW50IHJlc3VsdCA9IG1lbWNtcChtX1B0ciwgdGhhdC5tX1B0ciwgc3RkOjptaW4obV9MZW5ndGgsIHRoYXQubV9MZW5ndGgpKTsKKyAgICByZXR1cm4gcmVzdWx0IDwgMCB8fCAocmVzdWx0ID09IDAgJiYgbV9MZW5ndGggPCB0aGF0Lm1fTGVuZ3RoKTsKKyAgfQogCi0gICAgQ0ZYX0J5dGVTdHJpbmdDKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3JjKQotICAgIHsKLSAgICAgICAgbV9QdHIgPSBzcmMubV9QdHI7Ci0gICAgICAgIG1fTGVuZ3RoID0gc3JjLm1fTGVuZ3RoOwotICAgIH0KKyBwcm90ZWN0ZWQ6CisgIGNvbnN0IHVpbnQ4X3QqIG1fUHRyOworICBGWF9TVFJTSVpFIG1fTGVuZ3RoOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmdDKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzcmMpOwotCi0gICAgQ0ZYX0J5dGVTdHJpbmdDJiBvcGVyYXRvciA9IChGWF9MUENTVFIgc3JjKQotICAgIHsKLSAgICAgICAgbV9QdHIgPSAoRlhfTFBDQllURSlzcmM7Ci0gICAgICAgIG1fTGVuZ3RoID0gbV9QdHIgPyBGWFNZU19zdHJsZW4oc3JjKSA6IDA7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgICBDRlhfQnl0ZVN0cmluZ0MmIG9wZXJhdG9yID0gKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3JjKQotICAgIHsKLSAgICAgICAgbV9QdHIgPSBzcmMubV9QdHI7Ci0gICAgICAgIG1fTGVuZ3RoID0gc3JjLm1fTGVuZ3RoOwotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotCi0gICAgQ0ZYX0J5dGVTdHJpbmdDJiBvcGVyYXRvciA9IChjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3JjKTsKLQotICAgIGJvb2wgb3BlcmF0b3I9PSAoY29uc3QgY2hhciogcHRyKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBGWFNZU19zdHJsZW4ocHRyKSA9PSBtX0xlbmd0aCAmJgotICAgICAgICAgICAgICAgIEZYU1lTX21lbWNtcDMyKHB0ciwgbV9QdHIsIG1fTGVuZ3RoKSA9PSAwOwotICAgIH0KLSAgICBib29sIG9wZXJhdG9yPT0gKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3RoZXIpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG90aGVyLm1fTGVuZ3RoID09IG1fTGVuZ3RoICYmCi0gICAgICAgICAgICAgICAgRlhTWVNfbWVtY21wMzIob3RoZXIubV9QdHIsIG1fUHRyLCBtX0xlbmd0aCkgPT0gMDsKLSAgICB9Ci0gICAgYm9vbCBvcGVyYXRvciE9IChjb25zdCBjaGFyKiBwdHIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gcHRyKTsgfQotICAgIGJvb2wgb3BlcmF0b3IhPSAoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvdGhlcikgY29uc3QgewotICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7Ci0gICAgfQotCi0gICAgRlhfRFdPUkQJCUdldElEKEZYX1NUUlNJWkUgc3RhcnRfcG9zID0gMCkgY29uc3Q7Ci0KLSAgICBGWF9MUENCWVRFCQlHZXRQdHIoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fUHRyOwotICAgIH0KLQotICAgIEZYX0xQQ1NUUgkJR2V0Q1N0cigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gKEZYX0xQQ1NUUiltX1B0cjsKLSAgICB9Ci0KLSAgICBGWF9TVFJTSVpFCQlHZXRMZW5ndGgoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fTGVuZ3RoOwotICAgIH0KLQotICAgIGJvb2wJCQlJc0VtcHR5KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0xlbmd0aCA9PSAwOwotICAgIH0KLQotICAgIEZYX0JZVEUJCQlHZXRBdChGWF9TVFJTSVpFIGluZGV4KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fUHRyW2luZGV4XTsKLSAgICB9Ci0KLSAgICBDRlhfQnl0ZVN0cmluZ0MJTWlkKEZYX1NUUlNJWkUgaW5kZXgsIEZYX1NUUlNJWkUgY291bnQgPSAtMSkgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIGluZGV4ID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5kZXggPiBtX0xlbmd0aCkgewotICAgICAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQygpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb3VudCA8IDAgfHwgY291bnQgPiBtX0xlbmd0aCAtIGluZGV4KSB7Ci0gICAgICAgICAgICBjb3VudCA9IG1fTGVuZ3RoIC0gaW5kZXg7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQyhtX1B0ciArIGluZGV4LCBjb3VudCk7Ci0gICAgfQotCi0gICAgY29uc3QgRlhfQllURSYgb3BlcmF0b3JbXSAoc2l6ZV90IGluZGV4KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fUHRyW2luZGV4XTsKLSAgICB9Ci0KLSAgICBib29sIG9wZXJhdG9yPCAoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0aGF0KSBjb25zdAotICAgIHsKLSAgICAgICAgaW50IHJlc3VsdCA9IG1lbWNtcChtX1B0ciwgdGhhdC5tX1B0ciwgc3RkOjptaW4obV9MZW5ndGgsIHRoYXQubV9MZW5ndGgpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdCA8IDAgfHwgKHJlc3VsdCA9PSAwICYmIG1fTGVuZ3RoIDwgdGhhdC5tX0xlbmd0aCk7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgRlhfTFBDQllURQkJbV9QdHI7Ci0gICAgRlhfU1RSU0laRQkJbV9MZW5ndGg7Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCoJCQlvcGVyYXRvciBuZXcgKHNpemVfdCkgdGhyb3coKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQorIHByaXZhdGU6CisgIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3QpIHRocm93KCkgeyByZXR1cm4gTlVMTDsgfQogfTsKLWlubGluZSBib29sIG9wZXJhdG9yPT0gKGNvbnN0IGNoYXIqIGxocywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiByaHMpIHsKLSAgICByZXR1cm4gcmhzID09IGxoczsKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgY2hhciogbGhzLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHJocykgeworICByZXR1cm4gcmhzID09IGxoczsKIH0KLWlubGluZSBib29sIG9wZXJhdG9yIT0gKGNvbnN0IGNoYXIqIGxocywgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiByaHMpIHsKLSAgICByZXR1cm4gcmhzICE9IGxoczsKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgY2hhciogbGhzLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHJocykgeworICByZXR1cm4gcmhzICE9IGxoczsKIH0KLXR5cGVkZWYgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBGWF9CU1RSOwotI2RlZmluZSBGWF9CU1RSQyhzdHIpIENGWF9CeXRlU3RyaW5nQyhzdHIsIHNpemVvZiBzdHItMSkKICNkZWZpbmUgRlhCU1RSX0lEKGMxLCBjMiwgYzMsIGM0KSAoKGMxIDw8IDI0KSB8IChjMiA8PCAxNikgfCAoYzMgPDwgOCkgfCAoYzQpKQogCiAvLyBBIG11dGFibGUgc3RyaW5nIHdpdGggc2hhcmVkIGJ1ZmZlcnMgdXNpbmcgY29weS1vbi13cml0ZSBzZW1hbnRpY3MgdGhhdAogLy8gYXZvaWRzIHRoZSBjb3N0IG9mIHN0ZDo6c3RyaW5nJ3MgaXRlcmF0b3Igc3RhYmlsaXR5IGd1YXJhbnRlZXMuCi1jbGFzcyBDRlhfQnl0ZVN0cmluZwotewotcHVibGljOgotICAgIHR5cGVkZWYgRlhfQ0hBUiB2YWx1ZV90eXBlOworY2xhc3MgQ0ZYX0J5dGVTdHJpbmcgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBGWF9DSEFSIHZhbHVlX3R5cGU7CiAKLSAgICBDRlhfQnl0ZVN0cmluZygpCi0gICAgewotICAgICAgICBtX3BEYXRhID0gTlVMTDsKKyAgQ0ZYX0J5dGVTdHJpbmcoKSA6IG1fcERhdGEobnVsbHB0cikge30KKworICAvLyBDb3B5IGNvbnN0cnVjdG9yLgorICBDRlhfQnl0ZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKTsKKworICAvLyBNb3ZlIGNvbnN0cnVjdG9yLgorICBpbmxpbmUgQ0ZYX0J5dGVTdHJpbmcoQ0ZYX0J5dGVTdHJpbmcmJiBvdGhlcikgeworICAgIG1fcERhdGEgPSBvdGhlci5tX3BEYXRhOworICAgIG90aGVyLm1fcERhdGEgPSBudWxscHRyOworICB9CisKKyAgQ0ZYX0J5dGVTdHJpbmcoY2hhciBjaCk7CisgIENGWF9CeXRlU3RyaW5nKGNvbnN0IEZYX0NIQVIqIHB0cikKKyAgICAgIDogQ0ZYX0J5dGVTdHJpbmcocHRyLCBwdHIgPyBGWFNZU19zdHJsZW4ocHRyKSA6IDApIHt9CisKKyAgQ0ZYX0J5dGVTdHJpbmcoY29uc3QgRlhfQ0hBUiogcHRyLCBGWF9TVFJTSVpFIGxlbik7CisgIENGWF9CeXRlU3RyaW5nKGNvbnN0IHVpbnQ4X3QqIHB0ciwgRlhfU1RSU0laRSBsZW4pOworCisgIENGWF9CeXRlU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnN0cmMpOworICBDRlhfQnl0ZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzdHJjMSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic3RyYzIpOworCisgIH5DRlhfQnl0ZVN0cmluZygpOworCisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBGcm9tVW5pY29kZShjb25zdCBGWF9XQ0hBUiogcHRyLCBGWF9TVFJTSVpFIGxlbiA9IC0xKTsKKworICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgRnJvbVVuaWNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7CisKKyAgLy8gRXhwbGljaXQgY29udmVyc2lvbiB0byByYXcgc3RyaW5nCisgIGNvbnN0IEZYX0NIQVIqIGNfc3RyKCkgY29uc3QgeyByZXR1cm4gbV9wRGF0YSA/IG1fcERhdGEtPm1fU3RyaW5nIDogIiI7IH0KKworICAvLyBJbXBsaWNpdCBjb252ZXJzaW9uIHRvIEMtc3R5bGUgc3RyaW5nIC0tIGRlcHJlY2F0ZWQKKyAgb3BlcmF0b3IgY29uc3QgRlhfQ0hBUiooKSBjb25zdCB7IHJldHVybiBtX3BEYXRhID8gbV9wRGF0YS0+bV9TdHJpbmcgOiAiIjsgfQorCisgIG9wZXJhdG9yIGNvbnN0IHVpbnQ4X3QqKCkgY29uc3QgeworICAgIHJldHVybiBtX3BEYXRhID8gKGNvbnN0IHVpbnQ4X3QqKW1fcERhdGEtPm1fU3RyaW5nIDogTlVMTDsKKyAgfQorCisgIEZYX1NUUlNJWkUgR2V0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9wRGF0YSA/IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggOiAwOyB9CisKKyAgYm9vbCBJc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gIUdldExlbmd0aCgpOyB9CisKKyAgaW50IENvbXBhcmUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpIGNvbnN0OworCisgIGJvb2wgRXF1YWwoY29uc3QgY2hhciogcHRyKSBjb25zdDsKKyAgYm9vbCBFcXVhbChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgY29uc3Q7CisgIGJvb2wgRXF1YWwoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG90aGVyKSBjb25zdDsKKworICBib29sIEVxdWFsTm9DYXNlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSBjb25zdDsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgY2hhciogcHRyKSBjb25zdCB7IHJldHVybiBFcXVhbChwdHIpOyB9CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgY29uc3QgeyByZXR1cm4gRXF1YWwoc3RyKTsgfQorICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG90aGVyKSBjb25zdCB7IHJldHVybiBFcXVhbChvdGhlcik7IH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgY2hhciogcHRyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IHB0cik7IH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IHN0cik7IH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvdGhlcikgY29uc3QgeworICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpIGNvbnN0IHsKKyAgICBpbnQgcmVzdWx0ID0gRlhTWVNfbWVtY21wKGNfc3RyKCksIHN0ci5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptaW4oR2V0TGVuZ3RoKCksIHN0ci5HZXRMZW5ndGgoKSkpOworICAgIHJldHVybiByZXN1bHQgPCAwIHx8IChyZXN1bHQgPT0gMCAmJiBHZXRMZW5ndGgoKSA8IHN0ci5HZXRMZW5ndGgoKSk7CisgIH0KKworICB2b2lkIEVtcHR5KCk7CisKKyAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG9wZXJhdG9yPShjb25zdCBGWF9DSEFSKiBzdHIpOworCisgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvcGVyYXRvcj0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic3RyYyk7CisKKyAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG9wZXJhdG9yPShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nU3JjKTsKKworICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgb3BlcmF0b3I9KGNvbnN0IENGWF9CaW5hcnlCdWYmIGJ1Zik7CisKKyAgdm9pZCBMb2FkKGNvbnN0IHVpbnQ4X3QqIHN0ciwgRlhfU1RSU0laRSBsZW4pOworCisgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvcGVyYXRvcis9KEZYX0NIQVIgY2gpOworCisgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvcGVyYXRvcis9KGNvbnN0IEZYX0NIQVIqIHN0cik7CisKKyAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG9wZXJhdG9yKz0oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cik7CisKKyAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG9wZXJhdG9yKz0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic3RyYyk7CisKKyAgdWludDhfdCBHZXRBdChGWF9TVFJTSVpFIG5JbmRleCkgY29uc3QgeworICAgIHJldHVybiBtX3BEYXRhID8gbV9wRGF0YS0+bV9TdHJpbmdbbkluZGV4XSA6IDA7CisgIH0KKworICB1aW50OF90IG9wZXJhdG9yW10oRlhfU1RSU0laRSBuSW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9wRGF0YSA/IG1fcERhdGEtPm1fU3RyaW5nW25JbmRleF0gOiAwOworICB9CisKKyAgdm9pZCBTZXRBdChGWF9TVFJTSVpFIG5JbmRleCwgRlhfQ0hBUiBjaCk7CisKKyAgRlhfU1RSU0laRSBJbnNlcnQoRlhfU1RSU0laRSBpbmRleCwgRlhfQ0hBUiBjaCk7CisKKyAgRlhfU1RSU0laRSBEZWxldGUoRlhfU1RSU0laRSBpbmRleCwgRlhfU1RSU0laRSBjb3VudCA9IDEpOworCisgIHZvaWQgRm9ybWF0KGNvbnN0IEZYX0NIQVIqIGxwc3pGb3JtYXQsIC4uLik7CisKKyAgdm9pZCBGb3JtYXRWKGNvbnN0IEZYX0NIQVIqIGxwc3pGb3JtYXQsIHZhX2xpc3QgYXJnTGlzdCk7CisKKyAgdm9pZCBSZXNlcnZlKEZYX1NUUlNJWkUgbGVuKTsKKworICBGWF9DSEFSKiBHZXRCdWZmZXIoRlhfU1RSU0laRSBsZW4pOworCisgIHZvaWQgUmVsZWFzZUJ1ZmZlcihGWF9TVFJTSVpFIGxlbiA9IC0xKTsKKworICBDRlhfQnl0ZVN0cmluZyBNaWQoRlhfU1RSU0laRSBmaXJzdCkgY29uc3Q7CisKKyAgQ0ZYX0J5dGVTdHJpbmcgTWlkKEZYX1NUUlNJWkUgZmlyc3QsIEZYX1NUUlNJWkUgY291bnQpIGNvbnN0OworCisgIENGWF9CeXRlU3RyaW5nIExlZnQoRlhfU1RSU0laRSBjb3VudCkgY29uc3Q7CisKKyAgQ0ZYX0J5dGVTdHJpbmcgUmlnaHQoRlhfU1RSU0laRSBjb3VudCkgY29uc3Q7CisKKyAgRlhfU1RSU0laRSBGaW5kKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbHBzelN1YiwgRlhfU1RSU0laRSBzdGFydCA9IDApIGNvbnN0OworCisgIEZYX1NUUlNJWkUgRmluZChGWF9DSEFSIGNoLCBGWF9TVFJTSVpFIHN0YXJ0ID0gMCkgY29uc3Q7CisKKyAgRlhfU1RSU0laRSBSZXZlcnNlRmluZChGWF9DSEFSIGNoKSBjb25zdDsKKworICB2b2lkIE1ha2VMb3dlcigpOworCisgIHZvaWQgTWFrZVVwcGVyKCk7CisKKyAgdm9pZCBUcmltUmlnaHQoKTsKKworICB2b2lkIFRyaW1SaWdodChGWF9DSEFSIGNoVGFyZ2V0KTsKKworICB2b2lkIFRyaW1SaWdodChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGxwc3pUYXJnZXRzKTsKKworICB2b2lkIFRyaW1MZWZ0KCk7CisKKyAgdm9pZCBUcmltTGVmdChGWF9DSEFSIGNoVGFyZ2V0KTsKKworICB2b2lkIFRyaW1MZWZ0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbHBzelRhcmdldHMpOworCisgIEZYX1NUUlNJWkUgUmVwbGFjZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGxwc3pPbGQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGxwc3pOZXcpOworCisgIEZYX1NUUlNJWkUgUmVtb3ZlKEZYX0NIQVIgY2gpOworCisgIENGWF9XaWRlU3RyaW5nIFVURjhEZWNvZGUoKSBjb25zdDsKKworICB2b2lkIENvbnZlcnRGcm9tKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIsIENGWF9DaGFyTWFwKiBwQ2hhck1hcCA9IE5VTEwpOworCisgIEZYX0RXT1JEIEdldElEKEZYX1NUUlNJWkUgc3RhcnRfcG9zID0gMCkgY29uc3Q7CisKKyNkZWZpbmUgRlhGT1JNQVRfU0lHTkVEIDEKKyNkZWZpbmUgRlhGT1JNQVRfSEVYIDIKKyNkZWZpbmUgRlhGT1JNQVRfQ0FQSVRBTCA0CisKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEZvcm1hdEludGVnZXIoaW50IGksIEZYX0RXT1JEIGZsYWdzID0gMCk7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBGb3JtYXRGbG9hdChGWF9GTE9BVCBmLCBpbnQgcHJlY2lzaW9uID0gMCk7CisKKyBwcm90ZWN0ZWQ6CisgIC8vIFRvIGVuc3VyZSByZWYgY291bnRzIGRvIG5vdCBvdmVyZmxvdywgY29uc2lkZXIgdGhlIHdvcnN0IHBvc3NpYmxlIGNhc2U6CisgIC8vIHRoZSBlbnRpcmUgYWRkcmVzcyBzcGFjZSBjb250YWlucyBub3RoaW5nIGJ1dCBwb2ludGVycyB0byB0aGlzIG9iamVjdC4KKyAgLy8gU2luY2UgdGhlIGNvdW50IGluY3JlbWVudHMgd2l0aCBlYWNoIG5ldyBwb2ludGVyLCB0aGUgbGFyZ2VzdCB2YWx1ZSBpcworICAvLyB0aGUgbnVtYmVyIG9mIHBvaW50ZXJzIHRoYXQgY2FuIGZpdCBpbnRvIHRoZSBhZGRyZXNzIHNwYWNlLiBUaGUgc2l6ZSBvZgorICAvLyB0aGUgYWRkcmVzcyBzcGFjZSBpdHNlbGYgaXMgYSBnb29kIHVwcGVyIGJvdW5kIG9uIGl0OyB3ZSBuZWVkIG5vdCBnbworICAvLyBsYXJnZXIuCisgIGNsYXNzIFN0cmluZ0RhdGEgeworICAgcHVibGljOgorICAgIHN0YXRpYyBTdHJpbmdEYXRhKiBDcmVhdGUoaW50IG5MZW4pOworICAgIHZvaWQgUmV0YWluKCkgeyArK21fblJlZnM7IH0KKyAgICB2b2lkIFJlbGVhc2UoKSB7CisgICAgICBpZiAoLS1tX25SZWZzIDw9IDApCisgICAgICAgIEZYX0ZyZWUodGhpcyk7CiAgICAgfQogCi0gICAgQ0ZYX0J5dGVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cik7CisgICAgaW50cHRyX3QgbV9uUmVmczsgIC8vIFdvdWxkIHByZWZlciBzc2l6ZV90LCBidXQgbm8gd2luZG93cyBzdXBwb3J0LgorICAgIEZYX1NUUlNJWkUgbV9uRGF0YUxlbmd0aDsKKyAgICBGWF9TVFJTSVpFIG1fbkFsbG9jTGVuZ3RoOworICAgIEZYX0NIQVIgbV9TdHJpbmdbMV07CiAKLSAgICBDRlhfQnl0ZVN0cmluZyhjaGFyIGNoKTsKLQotICAgIENGWF9CeXRlU3RyaW5nKEZYX0xQQ1NUUiBwdHIpCi0gICAgICAgICAgICA6IENGWF9CeXRlU3RyaW5nKHB0ciwgcHRyID8gRlhTWVNfc3RybGVuKHB0cikgOiAwKSB7IH0KLQotICAgIENGWF9CeXRlU3RyaW5nKEZYX0xQQ1NUUiBwdHIsIEZYX1NUUlNJWkUgbGVuKTsKLQotICAgIENGWF9CeXRlU3RyaW5nKEZYX0xQQ0JZVEUgcHRyLCBGWF9TVFJTSVpFIGxlbik7Ci0KLSAgICBDRlhfQnl0ZVN0cmluZyhGWF9CU1RSIGJzdHJjKTsKLSAgICBDRlhfQnl0ZVN0cmluZyhGWF9CU1RSIGJzdHJjMSwgRlhfQlNUUiBic3RyYzIpOwotCi0gICAgfkNGWF9CeXRlU3RyaW5nKCk7Ci0KLSAgICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJRnJvbVVuaWNvZGUoRlhfTFBDV1NUUiBwdHIsIEZYX1NUUlNJWkUgbGVuID0gLTEpOwotCi0gICAgc3RhdGljIENGWF9CeXRlU3RyaW5nCUZyb21Vbmljb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpOwotCi0gICAgLy8gRXhwbGljaXQgY29udmVyc2lvbiB0byByYXcgc3RyaW5nCi0gICAgRlhfTFBDU1RSIGNfc3RyKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEYXRhID8gbV9wRGF0YS0+bV9TdHJpbmcgOiAiIjsKKyAgIHByaXZhdGU6CisgICAgU3RyaW5nRGF0YShGWF9TVFJTSVpFIGRhdGFMZW4sIEZYX1NUUlNJWkUgYWxsb2NMZW4pCisgICAgICAgIDogbV9uUmVmcygxKSwgbV9uRGF0YUxlbmd0aChkYXRhTGVuKSwgbV9uQWxsb2NMZW5ndGgoYWxsb2NMZW4pIHsKKyAgICAgIEZYU1lTX2Fzc2VydChkYXRhTGVuID49IDApOworICAgICAgRlhTWVNfYXNzZXJ0KGFsbG9jTGVuID49IDApOworICAgICAgRlhTWVNfYXNzZXJ0KGRhdGFMZW4gPD0gYWxsb2NMZW4pOworICAgICAgbV9TdHJpbmdbZGF0YUxlbl0gPSAwOwogICAgIH0KKyAgICB+U3RyaW5nRGF0YSgpID0gZGVsZXRlOworICB9OwogCi0gICAgLy8gSW1wbGljaXQgY29udmVyc2lvbiB0byBDLXN0eWxlIHN0cmluZyAtLSBkZXByZWNhdGVkCi0gICAgb3BlcmF0b3IJCQkJRlhfTFBDU1RSKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEYXRhID8gbV9wRGF0YS0+bV9TdHJpbmcgOiAiIjsKLSAgICB9CisgIHZvaWQgQWxsb2NDb3B5KENGWF9CeXRlU3RyaW5nJiBkZXN0LAorICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFIG5Db3B5TGVuLAorICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFIG5Db3B5SW5kZXgpIGNvbnN0OworICB2b2lkIEFzc2lnbkNvcHkoRlhfU1RSU0laRSBuU3JjTGVuLCBjb25zdCBGWF9DSEFSKiBscHN6U3JjRGF0YSk7CisgIHZvaWQgQ29uY2F0Q29weShGWF9TVFJTSVpFIG5TcmMxTGVuLAorICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogbHBzelNyYzFEYXRhLAorICAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSBuU3JjMkxlbiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGxwc3pTcmMyRGF0YSk7CisgIHZvaWQgQ29uY2F0SW5QbGFjZShGWF9TVFJTSVpFIG5TcmNMZW4sIGNvbnN0IEZYX0NIQVIqIGxwc3pTcmNEYXRhKTsKKyAgdm9pZCBDb3B5QmVmb3JlV3JpdGUoKTsKKyAgdm9pZCBBbGxvY0JlZm9yZVdyaXRlKEZYX1NUUlNJWkUgbkxlbik7CiAKLSAgICBvcGVyYXRvcgkJCQlGWF9MUENCWVRFKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEYXRhID8gKEZYX0xQQ0JZVEUpbV9wRGF0YS0+bV9TdHJpbmcgOiBOVUxMOwotICAgIH0KLQotICAgIEZYX1NUUlNJWkUJCQkJR2V0TGVuZ3RoKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEYXRhID8gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA6IDA7Ci0gICAgfQotCi0gICAgYm9vbAkJCQkJSXNFbXB0eSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gIUdldExlbmd0aCgpOwotICAgIH0KLQotICAgIGludAkJCQkJCUNvbXBhcmUoRlhfQlNUUiBzdHIpIGNvbnN0OwotCi0KLSAgICBib29sIEVxdWFsKGNvbnN0IGNoYXIqIHB0cikgY29uc3Q7Ci0gICAgYm9vbCBFcXVhbChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgY29uc3Q7Ci0gICAgYm9vbCBFcXVhbChjb25zdCBDRlhfQnl0ZVN0cmluZyYgb3RoZXIpIGNvbnN0OwotCi0gICAgYm9vbCBFcXVhbE5vQ2FzZShGWF9CU1RSIHN0cikgY29uc3Q7Ci0KLSAgICBib29sIG9wZXJhdG9yPT0gKGNvbnN0IGNoYXIqIHB0cikgY29uc3QgeyByZXR1cm4gRXF1YWwocHRyKTsgfQotICAgIGJvb2wgb3BlcmF0b3I9PSAoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpIGNvbnN0IHsgcmV0dXJuIEVxdWFsKHN0cik7IH0KLSAgICBib29sIG9wZXJhdG9yPT0gKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvdGhlcikgY29uc3QgeyByZXR1cm4gRXF1YWwob3RoZXIpOyB9Ci0KLSAgICBib29sIG9wZXJhdG9yIT0gKGNvbnN0IGNoYXIqIHB0cikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBwdHIpOyB9Ci0gICAgYm9vbCBvcGVyYXRvciE9IChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgY29uc3QgewotICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBzdHIpOwotICAgIH0KLSAgICBib29sIG9wZXJhdG9yIT0gKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvdGhlcikgY29uc3QgewotICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7Ci0gICAgfQotCi0gICAgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpIGNvbnN0Ci0gICAgewotICAgICAgICBpbnQgcmVzdWx0ID0gRlhTWVNfbWVtY21wMzIoY19zdHIoKSwgc3RyLmNfc3RyKCksIHN0ZDo6bWluKEdldExlbmd0aCgpLCBzdHIuR2V0TGVuZ3RoKCkpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdCA8IDAgfHwgKHJlc3VsdCA9PSAwICYmIEdldExlbmd0aCgpIDwgc3RyLkdldExlbmd0aCgpKTsKLSAgICB9Ci0KLSAgICB2b2lkCQkJCQlFbXB0eSgpOwotCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmCW9wZXJhdG9yID0gKEZYX0xQQ1NUUiBzdHIpOwotCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmCW9wZXJhdG9yID0gKEZYX0JTVFIgYnN0cmMpOwotCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmCW9wZXJhdG9yID0gKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmdTcmMpOwotCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmCW9wZXJhdG9yID0gKGNvbnN0IENGWF9CaW5hcnlCdWYmIGJ1Zik7Ci0KLSAgICB2b2lkCQkJCQlMb2FkKEZYX0xQQ0JZVEUgc3RyLCBGWF9TVFJTSVpFIGxlbik7Ci0KLSAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYJb3BlcmF0b3IgKz0gKEZYX0NIQVIgY2gpOwotCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmCW9wZXJhdG9yICs9IChGWF9MUENTVFIgc3RyKTsKLQotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJglvcGVyYXRvciArPSAoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cik7Ci0KLSAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYJb3BlcmF0b3IgKz0gKEZYX0JTVFIgYnN0cmMpOwotCi0gICAgRlhfQllURQkJCQkJR2V0QXQoRlhfU1RSU0laRSBuSW5kZXgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRGF0YSA/IG1fcERhdGEtPm1fU3RyaW5nW25JbmRleF0gOiAwOwotICAgIH0KLQotICAgIEZYX0JZVEUJCQkJCW9wZXJhdG9yW10oRlhfU1RSU0laRSBuSW5kZXgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRGF0YSA/IG1fcERhdGEtPm1fU3RyaW5nW25JbmRleF0gOiAwOwotICAgIH0KLQotICAgIHZvaWQJCQkJCVNldEF0KEZYX1NUUlNJWkUgbkluZGV4LCBGWF9DSEFSIGNoKTsKLQotICAgIEZYX1NUUlNJWkUJCQkJSW5zZXJ0KEZYX1NUUlNJWkUgaW5kZXgsIEZYX0NIQVIgY2gpOwotCi0gICAgRlhfU1RSU0laRQkJCQlEZWxldGUoRlhfU1RSU0laRSBpbmRleCwgRlhfU1RSU0laRSBjb3VudCA9IDEpOwotCi0KLSAgICB2b2lkCQkJCQlGb3JtYXQoRlhfTFBDU1RSIGxwc3pGb3JtYXQsIC4uLiApOwotCi0gICAgdm9pZAkJCQkJRm9ybWF0VihGWF9MUENTVFIgbHBzekZvcm1hdCwgdmFfbGlzdCBhcmdMaXN0KTsKLQotCi0gICAgdm9pZAkJCQkJUmVzZXJ2ZShGWF9TVFJTSVpFIGxlbik7Ci0KLSAgICBGWF9MUFNUUgkJCQlHZXRCdWZmZXIoRlhfU1RSU0laRSBsZW4pOwotCi0gICAgdm9pZAkJCQkJUmVsZWFzZUJ1ZmZlcihGWF9TVFJTSVpFIGxlbiA9IC0xKTsKLQotICAgIENGWF9CeXRlU3RyaW5nCQkJTWlkKEZYX1NUUlNJWkUgZmlyc3QpIGNvbnN0OwotCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCQlNaWQoRlhfU1RSU0laRSBmaXJzdCwgRlhfU1RSU0laRSBjb3VudCkgY29uc3Q7Ci0KLSAgICBDRlhfQnl0ZVN0cmluZwkJCUxlZnQoRlhfU1RSU0laRSBjb3VudCkgY29uc3Q7Ci0KLSAgICBDRlhfQnl0ZVN0cmluZwkJCVJpZ2h0KEZYX1NUUlNJWkUgY291bnQpIGNvbnN0OwotCi0gICAgRlhfU1RSU0laRQkJCQlGaW5kKEZYX0JTVFIgbHBzelN1YiwgRlhfU1RSU0laRSBzdGFydCA9IDApIGNvbnN0OwotCi0gICAgRlhfU1RSU0laRQkJCQlGaW5kKEZYX0NIQVIgY2gsIEZYX1NUUlNJWkUgc3RhcnQgPSAwKSBjb25zdDsKLQotICAgIEZYX1NUUlNJWkUJCQkJUmV2ZXJzZUZpbmQoRlhfQ0hBUiBjaCkgY29uc3Q7Ci0KLSAgICB2b2lkCQkJCQlNYWtlTG93ZXIoKTsKLQotICAgIHZvaWQJCQkJCU1ha2VVcHBlcigpOwotCi0gICAgdm9pZAkJCQkJVHJpbVJpZ2h0KCk7Ci0KLSAgICB2b2lkCQkJCQlUcmltUmlnaHQoRlhfQ0hBUiBjaFRhcmdldCk7Ci0KLSAgICB2b2lkCQkJCQlUcmltUmlnaHQoRlhfQlNUUiBscHN6VGFyZ2V0cyk7Ci0KLSAgICB2b2lkCQkJCQlUcmltTGVmdCgpOwotCi0gICAgdm9pZAkJCQkJVHJpbUxlZnQoRlhfQ0hBUiBjaFRhcmdldCk7Ci0KLSAgICB2b2lkCQkJCQlUcmltTGVmdChGWF9CU1RSIGxwc3pUYXJnZXRzKTsKLQotICAgIEZYX1NUUlNJWkUJCQkJUmVwbGFjZShGWF9CU1RSIGxwc3pPbGQsIEZYX0JTVFIgbHBzek5ldyk7Ci0KLSAgICBGWF9TVFJTSVpFCQkJCVJlbW92ZShGWF9DSEFSIGNoKTsKLQotICAgIENGWF9XaWRlU3RyaW5nCQkJVVRGOERlY29kZSgpIGNvbnN0OwotCi0gICAgdm9pZAkJCQkJQ29udmVydEZyb20oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ciwgQ0ZYX0NoYXJNYXAqIHBDaGFyTWFwID0gTlVMTCk7Ci0KLSAgICBGWF9EV09SRAkJCQlHZXRJRChGWF9TVFJTSVpFIHN0YXJ0X3BvcyA9IDApIGNvbnN0OwotCi0jZGVmaW5lIEZYRk9STUFUX1NJR05FRAkJCTEKLSNkZWZpbmUgRlhGT1JNQVRfSEVYCQkJMgotI2RlZmluZSBGWEZPUk1BVF9DQVBJVEFMCQk0Ci0KLSAgICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJRm9ybWF0SW50ZWdlcihpbnQgaSwgRlhfRFdPUkQgZmxhZ3MgPSAwKTsKLSAgICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJRm9ybWF0RmxvYXQoRlhfRkxPQVQgZiwgaW50IHByZWNpc2lvbiA9IDApOwotCi1wcm90ZWN0ZWQ6Ci0gICAgLy8gVG8gZW5zdXJlIHJlZiBjb3VudHMgZG8gbm90IG92ZXJmbG93LCBjb25zaWRlciB0aGUgd29yc3QgcG9zc2libGUgY2FzZToKLSAgICAvLyB0aGUgZW50aXJlIGFkZHJlc3Mgc3BhY2UgY29udGFpbnMgbm90aGluZyBidXQgcG9pbnRlcnMgdG8gdGhpcyBvYmplY3QuCi0gICAgLy8gU2luY2UgdGhlIGNvdW50IGluY3JlbWVudHMgd2l0aCBlYWNoIG5ldyBwb2ludGVyLCB0aGUgbGFyZ2VzdCB2YWx1ZSBpcwotICAgIC8vIHRoZSBudW1iZXIgb2YgcG9pbnRlcnMgdGhhdCBjYW4gZml0IGludG8gdGhlIGFkZHJlc3Mgc3BhY2UuIFRoZSBzaXplIG9mCi0gICAgLy8gdGhlIGFkZHJlc3Mgc3BhY2UgaXRzZWxmIGlzIGEgZ29vZCB1cHBlciBib3VuZCBvbiBpdDsgd2UgbmVlZCBub3QgZ28KLSAgICAvLyBsYXJnZXIuCi0gICAgY2xhc3MgU3RyaW5nRGF0YSB7Ci0gICAgICBwdWJsaWM6Ci0gICAgICAgIHN0YXRpYyBTdHJpbmdEYXRhKiBDcmVhdGUoaW50IG5MZW4pOwotICAgICAgICB2b2lkIFJldGFpbigpIHsgKyttX25SZWZzOyB9Ci0gICAgICAgIHZvaWQgUmVsZWFzZSgpIHsgaWYgKC0tbV9uUmVmcyA8PSAwKSBGWF9GcmVlKHRoaXMpOyB9Ci0KLSAgICAgICAgaW50cHRyX3QgICAgbV9uUmVmczsgIC8vIFdvdWxkIHByZWZlciBzc2l6ZV90LCBidXQgbm8gd2luZG93cyBzdXBwb3J0LgotICAgICAgICBGWF9TVFJTSVpFICBtX25EYXRhTGVuZ3RoOwotICAgICAgICBGWF9TVFJTSVpFICBtX25BbGxvY0xlbmd0aDsKLSAgICAgICAgRlhfQ0hBUiAgICAgbV9TdHJpbmdbMV07Ci0KLSAgICAgIHByaXZhdGU6Ci0gICAgICAgIFN0cmluZ0RhdGEoRlhfU1RSU0laRSBkYXRhTGVuLCBGWF9TVFJTSVpFIGFsbG9jTGVuKQotICAgICAgICAgICAgICAgIDogbV9uUmVmcygxKSwgbV9uRGF0YUxlbmd0aChkYXRhTGVuKSwgbV9uQWxsb2NMZW5ndGgoYWxsb2NMZW4pIHsKLSAgICAgICAgICAgIEZYU1lTX2Fzc2VydChkYXRhTGVuID49IDApOwotICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KGFsbG9jTGVuID49IDApOwotICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KGRhdGFMZW4gPD0gYWxsb2NMZW4pOwotICAgICAgICAgICAgbV9TdHJpbmdbZGF0YUxlbl0gPSAwOwotICAgICAgICB9Ci0gICAgICAgIH5TdHJpbmdEYXRhKCkgPSBkZWxldGU7Ci0gICAgfTsKLQotICAgIHZvaWQJCQkJCUFsbG9jQ29weShDRlhfQnl0ZVN0cmluZyYgZGVzdCwgRlhfU1RSU0laRSBuQ29weUxlbiwgRlhfU1RSU0laRSBuQ29weUluZGV4KSBjb25zdDsKLSAgICB2b2lkCQkJCQlBc3NpZ25Db3B5KEZYX1NUUlNJWkUgblNyY0xlbiwgRlhfTFBDU1RSIGxwc3pTcmNEYXRhKTsKLSAgICB2b2lkCQkJCQlDb25jYXRDb3B5KEZYX1NUUlNJWkUgblNyYzFMZW4sIEZYX0xQQ1NUUiBscHN6U3JjMURhdGEsIEZYX1NUUlNJWkUgblNyYzJMZW4sIEZYX0xQQ1NUUiBscHN6U3JjMkRhdGEpOwotICAgIHZvaWQJCQkJCUNvbmNhdEluUGxhY2UoRlhfU1RSU0laRSBuU3JjTGVuLCBGWF9MUENTVFIgbHBzelNyY0RhdGEpOwotICAgIHZvaWQJCQkJCUNvcHlCZWZvcmVXcml0ZSgpOwotICAgIHZvaWQJCQkJCUFsbG9jQmVmb3JlV3JpdGUoRlhfU1RSU0laRSBuTGVuKTsKLQotICAgIFN0cmluZ0RhdGEqIG1fcERhdGE7Ci0gICAgZnJpZW5kIGNsYXNzIGZ4Y3J0X0J5dGVTdHJpbmdDb25jYXRJblBsYWNlX1Rlc3Q7CisgIFN0cmluZ0RhdGEqIG1fcERhdGE7CisgIGZyaWVuZCBjbGFzcyBmeGNydF9CeXRlU3RyaW5nQ29uY2F0SW5QbGFjZV9UZXN0OwogfTsKLWlubGluZSBDRlhfQnl0ZVN0cmluZ0M6OkNGWF9CeXRlU3RyaW5nQyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3JjKQotewotICAgIG1fUHRyID0gKEZYX0xQQ0JZVEUpc3JjOwotICAgIG1fTGVuZ3RoID0gc3JjLkdldExlbmd0aCgpOworaW5saW5lIENGWF9CeXRlU3RyaW5nQzo6Q0ZYX0J5dGVTdHJpbmdDKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzcmMpIHsKKyAgbV9QdHIgPSAoY29uc3QgdWludDhfdCopc3JjOworICBtX0xlbmd0aCA9IHNyYy5HZXRMZW5ndGgoKTsKIH0KLWlubGluZSBDRlhfQnl0ZVN0cmluZ0MmIENGWF9CeXRlU3RyaW5nQzo6b3BlcmF0b3IgPSAoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNyYykKLXsKLSAgICBtX1B0ciA9IChGWF9MUENCWVRFKXNyYzsKLSAgICBtX0xlbmd0aCA9IHNyYy5HZXRMZW5ndGgoKTsKK2lubGluZSBDRlhfQnl0ZVN0cmluZ0MmIENGWF9CeXRlU3RyaW5nQzo6b3BlcmF0b3I9KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzcmMpIHsKKyAgbV9QdHIgPSAoY29uc3QgdWludDhfdCopc3JjOworICBtX0xlbmd0aCA9IHNyYy5HZXRMZW5ndGgoKTsKKyAgcmV0dXJuICp0aGlzOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGNoYXIqIGxocywgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHJocykgeworICByZXR1cm4gcmhzID09IGxoczsKK30KK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBsaHMsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiByaHMpIHsKKyAgcmV0dXJuIHJocyA9PSBsaHM7Cit9CitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGNoYXIqIGxocywgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHJocykgeworICByZXR1cm4gcmhzICE9IGxoczsKK30KK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBsaHMsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiByaHMpIHsKKyAgcmV0dXJuIHJocyAhPSBsaHM7Cit9CisKK2lubGluZSBDRlhfQnl0ZVN0cmluZyBvcGVyYXRvcisoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cjIpIHsKKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKHN0cjEsIHN0cjIpOworfQoraW5saW5lIENGWF9CeXRlU3RyaW5nIG9wZXJhdG9yKyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIHN0cjIpIHsKKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKHN0cjEsIHN0cjIpOworfQoraW5saW5lIENGWF9CeXRlU3RyaW5nIG9wZXJhdG9yKyhjb25zdCBGWF9DSEFSKiBzdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cjIpIHsKKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKHN0cjEsIHN0cjIpOworfQoraW5saW5lIENGWF9CeXRlU3RyaW5nIG9wZXJhdG9yKyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cjEsIEZYX0NIQVIgY2gpIHsKKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKHN0cjEsIENGWF9CeXRlU3RyaW5nQyhjaCkpOworfQoraW5saW5lIENGWF9CeXRlU3RyaW5nIG9wZXJhdG9yKyhGWF9DSEFSIGNoLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cjIpIHsKKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKGNoLCBzdHIyKTsKK30KK2lubGluZSBDRlhfQnl0ZVN0cmluZyBvcGVyYXRvcisoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIyKSB7CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhzdHIxLCBzdHIyKTsKK30KK2lubGluZSBDRlhfQnl0ZVN0cmluZyBvcGVyYXRvcisoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cjEsIEZYX0NIQVIgY2gpIHsKKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKHN0cjEsIENGWF9CeXRlU3RyaW5nQyhjaCkpOworfQoraW5saW5lIENGWF9CeXRlU3RyaW5nIG9wZXJhdG9yKyhGWF9DSEFSIGNoLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyMikgeworICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoY2gsIHN0cjIpOworfQoraW5saW5lIENGWF9CeXRlU3RyaW5nIG9wZXJhdG9yKyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogc3RyMikgeworICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoc3RyMSwgc3RyMik7Cit9CitpbmxpbmUgQ0ZYX0J5dGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IEZYX0NIQVIqIHN0cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIyKSB7CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhzdHIxLCBzdHIyKTsKK30KK2lubGluZSBDRlhfQnl0ZVN0cmluZyBvcGVyYXRvcisoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyMikgeworICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoc3RyMSwgc3RyMik7Cit9CitpbmxpbmUgQ0ZYX0J5dGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cjIpIHsKKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKHN0cjEsIHN0cjIpOworfQorY2xhc3MgQ0ZYX1dpZGVTdHJpbmdDIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgRlhfV0NIQVIgdmFsdWVfdHlwZTsKKworICBDRlhfV2lkZVN0cmluZ0MoKSB7CisgICAgbV9QdHIgPSBOVUxMOworICAgIG1fTGVuZ3RoID0gMDsKKyAgfQorCisgIENGWF9XaWRlU3RyaW5nQyhjb25zdCBGWF9XQ0hBUiogcHRyKSB7CisgICAgbV9QdHIgPSBwdHI7CisgICAgbV9MZW5ndGggPSBwdHIgPyBGWFNZU193Y3NsZW4ocHRyKSA6IDA7CisgIH0KKworICBDRlhfV2lkZVN0cmluZ0MoRlhfV0NIQVImIGNoKSB7CisgICAgbV9QdHIgPSAmY2g7CisgICAgbV9MZW5ndGggPSAxOworICB9CisKKyAgQ0ZYX1dpZGVTdHJpbmdDKGNvbnN0IEZYX1dDSEFSKiBwdHIsIEZYX1NUUlNJWkUgbGVuKSB7CisgICAgbV9QdHIgPSBwdHI7CisgICAgbV9MZW5ndGggPSAobGVuID09IC0xKSA/IEZYU1lTX3djc2xlbihwdHIpIDogbGVuOworICB9CisKKyAgQ0ZYX1dpZGVTdHJpbmdDKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3JjKSB7CisgICAgbV9QdHIgPSBzcmMubV9QdHI7CisgICAgbV9MZW5ndGggPSBzcmMubV9MZW5ndGg7CisgIH0KKworICBDRlhfV2lkZVN0cmluZ0MoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNyYyk7CisKKyAgQ0ZYX1dpZGVTdHJpbmdDJiBvcGVyYXRvcj0oY29uc3QgRlhfV0NIQVIqIHNyYykgeworICAgIG1fUHRyID0gc3JjOworICAgIG1fTGVuZ3RoID0gRlhTWVNfd2NzbGVuKHNyYyk7CiAgICAgcmV0dXJuICp0aGlzOwotfQorICB9CiAKLWlubGluZSBib29sIG9wZXJhdG9yPT0gKGNvbnN0IGNoYXIqIGxocywgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHJocykgewotICAgIHJldHVybiByaHMgPT0gbGhzOwotfQotaW5saW5lIGJvb2wgb3BlcmF0b3I9PSAoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBsaHMsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiByaHMpIHsKLSAgICByZXR1cm4gcmhzID09IGxoczsKLX0KLWlubGluZSBib29sIG9wZXJhdG9yIT0gKGNvbnN0IGNoYXIqIGxocywgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHJocykgewotICAgIHJldHVybiByaHMgIT0gbGhzOwotfQotaW5saW5lIGJvb2wgb3BlcmF0b3IhPSAoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBsaHMsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiByaHMpIHsKLSAgICByZXR1cm4gcmhzICE9IGxoczsKLX0KKyAgQ0ZYX1dpZGVTdHJpbmdDJiBvcGVyYXRvcj0oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzcmMpIHsKKyAgICBtX1B0ciA9IHNyYy5tX1B0cjsKKyAgICBtX0xlbmd0aCA9IHNyYy5tX0xlbmd0aDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KIAotaW5saW5lIENGWF9CeXRlU3RyaW5nIG9wZXJhdG9yICsgKEZYX0JTVFIgc3RyMSwgRlhfQlNUUiBzdHIyKQotewotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhzdHIxLCBzdHIyKTsKLX0KLWlubGluZSBDRlhfQnl0ZVN0cmluZyBvcGVyYXRvciArIChGWF9CU1RSIHN0cjEsIEZYX0xQQ1NUUiBzdHIyKQotewotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhzdHIxLCBzdHIyKTsKLX0KLWlubGluZSBDRlhfQnl0ZVN0cmluZyBvcGVyYXRvciArIChGWF9MUENTVFIgc3RyMSwgRlhfQlNUUiBzdHIyKQotewotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhzdHIxLCBzdHIyKTsKLX0KLWlubGluZSBDRlhfQnl0ZVN0cmluZyBvcGVyYXRvciArIChGWF9CU1RSIHN0cjEsIEZYX0NIQVIgY2gpCi17Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKHN0cjEsIENGWF9CeXRlU3RyaW5nQyhjaCkpOwotfQotaW5saW5lIENGWF9CeXRlU3RyaW5nIG9wZXJhdG9yICsgKEZYX0NIQVIgY2gsIEZYX0JTVFIgc3RyMikKLXsKLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoY2gsIHN0cjIpOwotfQotaW5saW5lIENGWF9CeXRlU3RyaW5nIG9wZXJhdG9yICsgKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIxLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyMikKLXsKLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoc3RyMSwgc3RyMik7Ci19Ci1pbmxpbmUgQ0ZYX0J5dGVTdHJpbmcgb3BlcmF0b3IgKyAoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cjEsIEZYX0NIQVIgY2gpCi17Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKHN0cjEsIENGWF9CeXRlU3RyaW5nQyhjaCkpOwotfQotaW5saW5lIENGWF9CeXRlU3RyaW5nIG9wZXJhdG9yICsgKEZYX0NIQVIgY2gsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIyKQotewotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhjaCwgc3RyMik7Ci19Ci1pbmxpbmUgQ0ZYX0J5dGVTdHJpbmcgb3BlcmF0b3IgKyAoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cjEsIEZYX0xQQ1NUUiBzdHIyKQotewotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhzdHIxLCBzdHIyKTsKLX0KLWlubGluZSBDRlhfQnl0ZVN0cmluZyBvcGVyYXRvciArIChGWF9MUENTVFIgc3RyMSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cjIpCi17Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKHN0cjEsIHN0cjIpOwotfQotaW5saW5lIENGWF9CeXRlU3RyaW5nIG9wZXJhdG9yICsgKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIxLCBGWF9CU1RSIHN0cjIpCi17Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKHN0cjEsIHN0cjIpOwotfQotaW5saW5lIENGWF9CeXRlU3RyaW5nIG9wZXJhdG9yICsgKEZYX0JTVFIgc3RyMSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cjIpCi17Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKHN0cjEsIHN0cjIpOwotfQotY2xhc3MgQ0ZYX1dpZGVTdHJpbmdDCi17Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBGWF9XQ0hBUiB2YWx1ZV90eXBlOworICBDRlhfV2lkZVN0cmluZ0MmIG9wZXJhdG9yPShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3JjKTsKIAotICAgIENGWF9XaWRlU3RyaW5nQygpCi0gICAgewotICAgICAgICBtX1B0ciA9IE5VTEw7Ci0gICAgICAgIG1fTGVuZ3RoID0gMDsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHdjaGFyX3QqIHB0cikgY29uc3QgeworICAgIHJldHVybiBGWFNZU193Y3NsZW4ocHRyKSA9PSBtX0xlbmd0aCAmJiB3bWVtY21wKHB0ciwgbV9QdHIsIG1fTGVuZ3RoKSA9PSAwOworICB9CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cikgY29uc3QgeworICAgIHJldHVybiBzdHIubV9MZW5ndGggPT0gbV9MZW5ndGggJiYgd21lbWNtcChzdHIubV9QdHIsIG1fUHRyLCBtX0xlbmd0aCkgPT0gMDsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3Qgd2NoYXJfdCogcHRyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IHB0cik7IH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IHN0cik7IH0KKworICBjb25zdCBGWF9XQ0hBUiogR2V0UHRyKCkgY29uc3QgeyByZXR1cm4gbV9QdHI7IH0KKworICBGWF9TVFJTSVpFIEdldExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fTGVuZ3RoOyB9CisKKyAgYm9vbCBJc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbV9MZW5ndGggPT0gMDsgfQorCisgIEZYX1dDSEFSIEdldEF0KEZYX1NUUlNJWkUgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fUHRyW2luZGV4XTsgfQorCisgIENGWF9XaWRlU3RyaW5nQyBMZWZ0KEZYX1NUUlNJWkUgY291bnQpIGNvbnN0IHsKKyAgICBpZiAoY291bnQgPCAxKSB7CisgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmdDKCk7CiAgICAgfQotCi0gICAgQ0ZYX1dpZGVTdHJpbmdDKEZYX0xQQ1dTVFIgcHRyKQotICAgIHsKLSAgICAgICAgbV9QdHIgPSBwdHI7Ci0gICAgICAgIG1fTGVuZ3RoID0gcHRyID8gRlhTWVNfd2NzbGVuKHB0cikgOiAwOworICAgIGlmIChjb3VudCA+IG1fTGVuZ3RoKSB7CisgICAgICBjb3VudCA9IG1fTGVuZ3RoOwogICAgIH0KKyAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmdDKG1fUHRyLCBjb3VudCk7CisgIH0KIAotICAgIENGWF9XaWRlU3RyaW5nQyhGWF9XQ0hBUiYgY2gpCi0gICAgewotICAgICAgICBtX1B0ciA9ICZjaDsKLSAgICAgICAgbV9MZW5ndGggPSAxOworICBDRlhfV2lkZVN0cmluZ0MgTWlkKEZYX1NUUlNJWkUgaW5kZXgsIEZYX1NUUlNJWkUgY291bnQgPSAtMSkgY29uc3QgeworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgIGluZGV4ID0gMDsKICAgICB9Ci0KLSAgICBDRlhfV2lkZVN0cmluZ0MoRlhfTFBDV1NUUiBwdHIsIEZYX1NUUlNJWkUgbGVuKQotICAgIHsKLSAgICAgICAgbV9QdHIgPSBwdHI7Ci0gICAgICAgIG1fTGVuZ3RoID0gKGxlbiA9PSAtMSkgPyBGWFNZU193Y3NsZW4ocHRyKSA6IGxlbjsKKyAgICBpZiAoaW5kZXggPiBtX0xlbmd0aCkgeworICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nQygpOwogICAgIH0KLQotICAgIENGWF9XaWRlU3RyaW5nQyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHNyYykKLSAgICB7Ci0gICAgICAgIG1fUHRyID0gc3JjLm1fUHRyOwotICAgICAgICBtX0xlbmd0aCA9IHNyYy5tX0xlbmd0aDsKKyAgICBpZiAoY291bnQgPCAwIHx8IGNvdW50ID4gbV9MZW5ndGggLSBpbmRleCkgeworICAgICAgY291bnQgPSBtX0xlbmd0aCAtIGluZGV4OwogICAgIH0KKyAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmdDKG1fUHRyICsgaW5kZXgsIGNvdW50KTsKKyAgfQogCi0gICAgQ0ZYX1dpZGVTdHJpbmdDKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzcmMpOwotCi0gICAgQ0ZYX1dpZGVTdHJpbmdDJiBvcGVyYXRvciA9IChGWF9MUENXU1RSIHNyYykKLSAgICB7Ci0gICAgICAgIG1fUHRyID0gc3JjOwotICAgICAgICBtX0xlbmd0aCA9IEZYU1lTX3djc2xlbihzcmMpOwotICAgICAgICByZXR1cm4gKnRoaXM7CisgIENGWF9XaWRlU3RyaW5nQyBSaWdodChGWF9TVFJTSVpFIGNvdW50KSBjb25zdCB7CisgICAgaWYgKGNvdW50IDwgMSkgeworICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nQygpOwogICAgIH0KLQotICAgIENGWF9XaWRlU3RyaW5nQyYgb3BlcmF0b3IgPSAoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzcmMpCi0gICAgewotICAgICAgICBtX1B0ciA9IHNyYy5tX1B0cjsKLSAgICAgICAgbV9MZW5ndGggPSBzcmMubV9MZW5ndGg7Ci0gICAgICAgIHJldHVybiAqdGhpczsKKyAgICBpZiAoY291bnQgPiBtX0xlbmd0aCkgeworICAgICAgY291bnQgPSBtX0xlbmd0aDsKICAgICB9CisgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nQyhtX1B0ciArIG1fTGVuZ3RoIC0gY291bnQsIGNvdW50KTsKKyAgfQogCi0gICAgQ0ZYX1dpZGVTdHJpbmdDJiBvcGVyYXRvciA9IChjb25zdCBDRlhfV2lkZVN0cmluZyYgc3JjKTsKKyAgY29uc3QgRlhfV0NIQVImIG9wZXJhdG9yW10oc2l6ZV90IGluZGV4KSBjb25zdCB7IHJldHVybiBtX1B0cltpbmRleF07IH0KIAotICAgIGJvb2wgb3BlcmF0b3I9PSAoY29uc3Qgd2NoYXJfdCogcHRyKSBjb25zdCAgewotICAgICAgICByZXR1cm4gRlhTWVNfd2NzbGVuKHB0cikgPT0gbV9MZW5ndGggJiYKLSAgICAgICAgICAgIHdtZW1jbXAocHRyLCBtX1B0ciwgbV9MZW5ndGgpID09IDA7Ci0gICAgfQotICAgIGJvb2wgb3BlcmF0b3I9PSAoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIpIGNvbnN0ICB7Ci0gICAgICAgIHJldHVybiBzdHIubV9MZW5ndGggPT0gbV9MZW5ndGggJiYKLSAgICAgICAgICAgIHdtZW1jbXAoc3RyLm1fUHRyLCBtX1B0ciwgbV9MZW5ndGgpID09IDA7Ci0gICAgfQotICAgIGJvb2wgb3BlcmF0b3IhPSAoY29uc3Qgd2NoYXJfdCogcHRyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IHB0cik7IH0KLSAgICBib29sIG9wZXJhdG9yIT0gKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAhKCp0aGlzID09IHN0cik7Ci0gICAgfQorICBib29sIG9wZXJhdG9yPChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHRoYXQpIGNvbnN0IHsKKyAgICBpbnQgcmVzdWx0ID0gd21lbWNtcChtX1B0ciwgdGhhdC5tX1B0ciwgc3RkOjptaW4obV9MZW5ndGgsIHRoYXQubV9MZW5ndGgpKTsKKyAgICByZXR1cm4gcmVzdWx0IDwgMCB8fCAocmVzdWx0ID09IDAgJiYgbV9MZW5ndGggPCB0aGF0Lm1fTGVuZ3RoKTsKKyAgfQogCi0gICAgRlhfTFBDV1NUUgkJR2V0UHRyKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1B0cjsKLSAgICB9CisgcHJvdGVjdGVkOgorICBjb25zdCBGWF9XQ0hBUiogbV9QdHI7CisgIEZYX1NUUlNJWkUgbV9MZW5ndGg7CiAKLSAgICBGWF9TVFJTSVpFCQlHZXRMZW5ndGgoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fTGVuZ3RoOwotICAgIH0KLQotICAgIGJvb2wJCQlJc0VtcHR5KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0xlbmd0aCA9PSAwOwotICAgIH0KLQotICAgIEZYX1dDSEFSCQlHZXRBdChGWF9TVFJTSVpFIGluZGV4KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fUHRyW2luZGV4XTsKLSAgICB9Ci0KLSAgICBDRlhfV2lkZVN0cmluZ0MJTGVmdChGWF9TVFJTSVpFIGNvdW50KSBjb25zdAotICAgIHsKLSAgICAgICAgaWYgKGNvdW50IDwgMSkgewotICAgICAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nQygpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb3VudCA+IG1fTGVuZ3RoKSB7Ci0gICAgICAgICAgICBjb3VudCA9IG1fTGVuZ3RoOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZ0MobV9QdHIsIGNvdW50KTsKLSAgICB9Ci0KLSAgICBDRlhfV2lkZVN0cmluZ0MJTWlkKEZYX1NUUlNJWkUgaW5kZXgsIEZYX1NUUlNJWkUgY291bnQgPSAtMSkgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIGluZGV4ID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5kZXggPiBtX0xlbmd0aCkgewotICAgICAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nQygpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb3VudCA8IDAgfHwgY291bnQgPiBtX0xlbmd0aCAtIGluZGV4KSB7Ci0gICAgICAgICAgICBjb3VudCA9IG1fTGVuZ3RoIC0gaW5kZXg7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nQyhtX1B0ciArIGluZGV4LCBjb3VudCk7Ci0gICAgfQotCi0gICAgQ0ZYX1dpZGVTdHJpbmdDCVJpZ2h0KEZYX1NUUlNJWkUgY291bnQpIGNvbnN0Ci0gICAgewotICAgICAgICBpZiAoY291bnQgPCAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmdDKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvdW50ID4gbV9MZW5ndGgpIHsKLSAgICAgICAgICAgIGNvdW50ID0gbV9MZW5ndGg7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nQyhtX1B0ciArIG1fTGVuZ3RoIC0gY291bnQsIGNvdW50KTsKLSAgICB9Ci0KLSAgICBjb25zdCBGWF9XQ0hBUiYgb3BlcmF0b3JbXSAoc2l6ZV90IGluZGV4KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fUHRyW2luZGV4XTsKLSAgICB9Ci0KLSAgICBib29sIG9wZXJhdG9yPCAoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB0aGF0KSBjb25zdAotICAgIHsKLSAgICAgICAgaW50IHJlc3VsdCA9IHdtZW1jbXAobV9QdHIsIHRoYXQubV9QdHIsIHN0ZDo6bWluKG1fTGVuZ3RoLCB0aGF0Lm1fTGVuZ3RoKSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQgPCAwIHx8IChyZXN1bHQgPT0gMCAmJiBtX0xlbmd0aCA8IHRoYXQubV9MZW5ndGgpOwotICAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICBGWF9MUENXU1RSCQltX1B0cjsKLSAgICBGWF9TVFJTSVpFCQltX0xlbmd0aDsKLQotcHJpdmF0ZToKLSAgICB2b2lkKgkJCW9wZXJhdG9yIG5ldyAoc2l6ZV90KSB0aHJvdygpCi0gICAgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CisgcHJpdmF0ZToKKyAgdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCkgdGhyb3coKSB7IHJldHVybiBOVUxMOyB9CiB9OwotaW5saW5lIGJvb2wgb3BlcmF0b3I9PSAoY29uc3Qgd2NoYXJfdCogbGhzLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHJocykgewotICAgIHJldHVybiByaHMgPT0gbGhzOworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCB3Y2hhcl90KiBsaHMsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgcmhzKSB7CisgIHJldHVybiByaHMgPT0gbGhzOwogfQotaW5saW5lIGJvb2wgb3BlcmF0b3IhPSAoY29uc3Qgd2NoYXJfdCogbGhzLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHJocykgewotICAgIHJldHVybiByaHMgIT0gbGhzOworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCB3Y2hhcl90KiBsaHMsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgcmhzKSB7CisgIHJldHVybiByaHMgIT0gbGhzOwogfQotdHlwZWRlZiBjb25zdCBDRlhfV2lkZVN0cmluZ0MmCUZYX1dTVFI7CiAjZGVmaW5lIEZYX1dTVFJDKHdzdHIpIENGWF9XaWRlU3RyaW5nQyh3c3RyLCBGWF9BcnJheVNpemUod3N0cikgLSAxKQogCiAvLyBBIG11dGFibGUgc3RyaW5nIHdpdGggc2hhcmVkIGJ1ZmZlcnMgdXNpbmcgY29weS1vbi13cml0ZSBzZW1hbnRpY3MgdGhhdAogLy8gYXZvaWRzIHRoZSBjb3N0IG9mIHN0ZDo6c3RyaW5nJ3MgaXRlcmF0b3Igc3RhYmlsaXR5IGd1YXJhbnRlZXMuCi1jbGFzcyBDRlhfV2lkZVN0cmluZwotewotcHVibGljOgotICAgIHR5cGVkZWYgRlhfV0NIQVIgdmFsdWVfdHlwZTsKK2NsYXNzIENGWF9XaWRlU3RyaW5nIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgRlhfV0NIQVIgdmFsdWVfdHlwZTsKIAotICAgIENGWF9XaWRlU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIG1fcERhdGEgPSBOVUxMOworICBDRlhfV2lkZVN0cmluZygpIDogbV9wRGF0YShudWxscHRyKSB7fQorCisgIC8vIENvcHkgY29uc3RydWN0b3IuCisgIENGWF9XaWRlU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpOworCisgIC8vIE1vdmUgY29uc3RydWN0b3IuCisgIGlubGluZSBDRlhfV2lkZVN0cmluZyhDRlhfV2lkZVN0cmluZyYmIG90aGVyKSB7CisgICAgbV9wRGF0YSA9IG90aGVyLm1fcERhdGE7CisgICAgb3RoZXIubV9wRGF0YSA9IG51bGxwdHI7CisgIH0KKworICBDRlhfV2lkZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcHRyKQorICAgICAgOiBDRlhfV2lkZVN0cmluZyhwdHIsIHB0ciA/IEZYU1lTX3djc2xlbihwdHIpIDogMCkge30KKworICBDRlhfV2lkZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcHRyLCBGWF9TVFJTSVpFIGxlbik7CisKKyAgQ0ZYX1dpZGVTdHJpbmcoRlhfV0NIQVIgY2gpOworCisgIENGWF9XaWRlU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKTsKKworICBDRlhfV2lkZVN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cjEsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyMik7CisKKyAgfkNGWF9XaWRlU3RyaW5nKCk7CisKKyAgc3RhdGljIENGWF9XaWRlU3RyaW5nIEZyb21Mb2NhbChjb25zdCBjaGFyKiBzdHIsIEZYX1NUUlNJWkUgbGVuID0gLTEpOworCisgIHN0YXRpYyBDRlhfV2lkZVN0cmluZyBGcm9tVVRGOChjb25zdCBjaGFyKiBzdHIsIEZYX1NUUlNJWkUgbGVuKTsKKworICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgRnJvbVVURjE2TEUoY29uc3QgdW5zaWduZWQgc2hvcnQqIHN0ciwgRlhfU1RSU0laRSBsZW4pOworCisgIHN0YXRpYyBGWF9TVFJTSVpFIFdTdHJpbmdMZW5ndGgoY29uc3QgdW5zaWduZWQgc2hvcnQqIHN0cik7CisKKyAgLy8gRXhwbGljaXQgY29udmVyc2lvbiB0byByYXcgc3RyaW5nCisgIGNvbnN0IEZYX1dDSEFSKiBjX3N0cigpIGNvbnN0IHsgcmV0dXJuIG1fcERhdGEgPyBtX3BEYXRhLT5tX1N0cmluZyA6IEwiIjsgfQorCisgIC8vIEltcGxpY2l0IGNvbnZlcnNpb24gdG8gQy1zdHlsZSB3aWRlIHN0cmluZyAtLSBkZXByZWNhdGVkCisgIG9wZXJhdG9yIGNvbnN0IEZYX1dDSEFSKigpIGNvbnN0IHsgcmV0dXJuIG1fcERhdGEgPyBtX3BEYXRhLT5tX1N0cmluZyA6IEwiIjsgfQorCisgIHZvaWQgRW1wdHkoKTsKKworICBGWF9CT09MIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiAhR2V0TGVuZ3RoKCk7IH0KKworICBGWF9TVFJTSVpFIEdldExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fcERhdGEgPyBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIDogMDsgfQorCisgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBvcGVyYXRvcj0oY29uc3QgRlhfV0NIQVIqIHN0cik7CisKKyAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG9wZXJhdG9yPShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nU3JjKTsKKworICBjb25zdCBDRlhfV2lkZVN0cmluZyYgb3BlcmF0b3I9KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyaW5nU3JjKTsKKworICBjb25zdCBDRlhfV2lkZVN0cmluZyYgb3BlcmF0b3IrPShjb25zdCBGWF9XQ0hBUiogc3RyKTsKKworICBjb25zdCBDRlhfV2lkZVN0cmluZyYgb3BlcmF0b3IrPShGWF9XQ0hBUiBjaCk7CisKKyAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG9wZXJhdG9yKz0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7CisKKyAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG9wZXJhdG9yKz0oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIpOworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCB3Y2hhcl90KiBwdHIpIGNvbnN0IHsgcmV0dXJuIEVxdWFsKHB0cik7IH0KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKSBjb25zdCB7IHJldHVybiBFcXVhbChzdHIpOyB9CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDRlhfV2lkZVN0cmluZyYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuIEVxdWFsKG90aGVyKTsgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCB3Y2hhcl90KiBwdHIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gcHRyKTsgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gc3RyKTsgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICB9CisKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikgY29uc3QgeworICAgIGludCByZXN1bHQgPQorICAgICAgICB3bWVtY21wKGNfc3RyKCksIHN0ci5jX3N0cigpLCBzdGQ6Om1pbihHZXRMZW5ndGgoKSwgc3RyLkdldExlbmd0aCgpKSk7CisgICAgcmV0dXJuIHJlc3VsdCA8IDAgfHwgKHJlc3VsdCA9PSAwICYmIEdldExlbmd0aCgpIDwgc3RyLkdldExlbmd0aCgpKTsKKyAgfQorCisgIEZYX1dDSEFSIEdldEF0KEZYX1NUUlNJWkUgbkluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1fcERhdGEgPyBtX3BEYXRhLT5tX1N0cmluZ1tuSW5kZXhdIDogMDsKKyAgfQorCisgIEZYX1dDSEFSIG9wZXJhdG9yW10oRlhfU1RSU0laRSBuSW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9wRGF0YSA/IG1fcERhdGEtPm1fU3RyaW5nW25JbmRleF0gOiAwOworICB9CisKKyAgdm9pZCBTZXRBdChGWF9TVFJTSVpFIG5JbmRleCwgRlhfV0NIQVIgY2gpOworCisgIGludCBDb21wYXJlKGNvbnN0IEZYX1dDSEFSKiBzdHIpIGNvbnN0OworCisgIGludCBDb21wYXJlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIGNvbnN0OworCisgIGludCBDb21wYXJlTm9DYXNlKGNvbnN0IEZYX1dDSEFSKiBzdHIpIGNvbnN0OworCisgIGJvb2wgRXF1YWwoY29uc3Qgd2NoYXJfdCogcHRyKSBjb25zdDsKKyAgYm9vbCBFcXVhbChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cikgY29uc3Q7CisgIGJvb2wgRXF1YWwoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG90aGVyKSBjb25zdDsKKworICBDRlhfV2lkZVN0cmluZyBNaWQoRlhfU1RSU0laRSBmaXJzdCkgY29uc3Q7CisKKyAgQ0ZYX1dpZGVTdHJpbmcgTWlkKEZYX1NUUlNJWkUgZmlyc3QsIEZYX1NUUlNJWkUgY291bnQpIGNvbnN0OworCisgIENGWF9XaWRlU3RyaW5nIExlZnQoRlhfU1RSU0laRSBjb3VudCkgY29uc3Q7CisKKyAgQ0ZYX1dpZGVTdHJpbmcgUmlnaHQoRlhfU1RSU0laRSBjb3VudCkgY29uc3Q7CisKKyAgRlhfU1RSU0laRSBJbnNlcnQoRlhfU1RSU0laRSBpbmRleCwgRlhfV0NIQVIgY2gpOworCisgIEZYX1NUUlNJWkUgRGVsZXRlKEZYX1NUUlNJWkUgaW5kZXgsIEZYX1NUUlNJWkUgY291bnQgPSAxKTsKKworICB2b2lkIEZvcm1hdChjb25zdCBGWF9XQ0hBUiogbHBzekZvcm1hdCwgLi4uKTsKKworICB2b2lkIEZvcm1hdFYoY29uc3QgRlhfV0NIQVIqIGxwc3pGb3JtYXQsIHZhX2xpc3QgYXJnTGlzdCk7CisKKyAgdm9pZCBNYWtlTG93ZXIoKTsKKworICB2b2lkIE1ha2VVcHBlcigpOworCisgIHZvaWQgVHJpbVJpZ2h0KCk7CisKKyAgdm9pZCBUcmltUmlnaHQoRlhfV0NIQVIgY2hUYXJnZXQpOworCisgIHZvaWQgVHJpbVJpZ2h0KGNvbnN0IEZYX1dDSEFSKiBscHN6VGFyZ2V0cyk7CisKKyAgdm9pZCBUcmltTGVmdCgpOworCisgIHZvaWQgVHJpbUxlZnQoRlhfV0NIQVIgY2hUYXJnZXQpOworCisgIHZvaWQgVHJpbUxlZnQoY29uc3QgRlhfV0NIQVIqIGxwc3pUYXJnZXRzKTsKKworICB2b2lkIFJlc2VydmUoRlhfU1RSU0laRSBsZW4pOworCisgIEZYX1dDSEFSKiBHZXRCdWZmZXIoRlhfU1RSU0laRSBsZW4pOworCisgIHZvaWQgUmVsZWFzZUJ1ZmZlcihGWF9TVFJTSVpFIGxlbiA9IC0xKTsKKworICBpbnQgR2V0SW50ZWdlcigpIGNvbnN0OworCisgIEZYX0ZMT0FUIEdldEZsb2F0KCkgY29uc3Q7CisKKyAgRlhfU1RSU0laRSBGaW5kKGNvbnN0IEZYX1dDSEFSKiBscHN6U3ViLCBGWF9TVFJTSVpFIHN0YXJ0ID0gMCkgY29uc3Q7CisKKyAgRlhfU1RSU0laRSBGaW5kKEZYX1dDSEFSIGNoLCBGWF9TVFJTSVpFIHN0YXJ0ID0gMCkgY29uc3Q7CisKKyAgRlhfU1RSU0laRSBSZXBsYWNlKGNvbnN0IEZYX1dDSEFSKiBscHN6T2xkLCBjb25zdCBGWF9XQ0hBUiogbHBzek5ldyk7CisKKyAgRlhfU1RSU0laRSBSZW1vdmUoRlhfV0NIQVIgY2gpOworCisgIENGWF9CeXRlU3RyaW5nIFVURjhFbmNvZGUoKSBjb25zdDsKKworICBDRlhfQnl0ZVN0cmluZyBVVEYxNkxFX0VuY29kZSgpIGNvbnN0OworCisgIHZvaWQgQ29udmVydEZyb20oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0ciwgQ0ZYX0NoYXJNYXAqIHBDaGFyTWFwID0gTlVMTCk7CisKKyBwcm90ZWN0ZWQ6CisgIGNsYXNzIFN0cmluZ0RhdGEgeworICAgcHVibGljOgorICAgIHN0YXRpYyBTdHJpbmdEYXRhKiBDcmVhdGUoaW50IG5MZW4pOworICAgIHZvaWQgUmV0YWluKCkgeyArK21fblJlZnM7IH0KKyAgICB2b2lkIFJlbGVhc2UoKSB7CisgICAgICBpZiAoLS1tX25SZWZzIDw9IDApCisgICAgICAgIEZYX0ZyZWUodGhpcyk7CiAgICAgfQogCi0gICAgQ0ZYX1dpZGVTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7CisgICAgaW50cHRyX3QgbV9uUmVmczsgIC8vIFdvdWxkIHByZWZlciBzc2l6ZV90LCBidXQgbm8gd2luZG93cyBzdXBwb3J0LgorICAgIEZYX1NUUlNJWkUgbV9uRGF0YUxlbmd0aDsKKyAgICBGWF9TVFJTSVpFIG1fbkFsbG9jTGVuZ3RoOworICAgIEZYX1dDSEFSIG1fU3RyaW5nWzFdOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmcoRlhfTFBDV1NUUiBwdHIpCi0gICAgICAgICAgICA6IENGWF9XaWRlU3RyaW5nKHB0ciwgcHRyID8gRlhTWVNfd2NzbGVuKHB0cikgOiAwKSB7IH0KLQotICAgIENGWF9XaWRlU3RyaW5nKEZYX0xQQ1dTVFIgcHRyLCBGWF9TVFJTSVpFIGxlbik7Ci0KLSAgICBDRlhfV2lkZVN0cmluZyhGWF9XQ0hBUiBjaCk7Ci0KLSAgICBDRlhfV2lkZVN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cik7Ci0KLSAgICBDRlhfV2lkZVN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cjEsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyMik7Ci0KLSAgICB+Q0ZYX1dpZGVTdHJpbmcoKTsKLQotICAgIHN0YXRpYyBDRlhfV2lkZVN0cmluZwlGcm9tTG9jYWwoY29uc3QgY2hhciogc3RyLCBGWF9TVFJTSVpFIGxlbiA9IC0xKTsKLQotICAgIHN0YXRpYyBDRlhfV2lkZVN0cmluZwlGcm9tVVRGOChjb25zdCBjaGFyKiBzdHIsIEZYX1NUUlNJWkUgbGVuKTsKLQotICAgIHN0YXRpYyBDRlhfV2lkZVN0cmluZwlGcm9tVVRGMTZMRShjb25zdCB1bnNpZ25lZCBzaG9ydCogc3RyLCBGWF9TVFJTSVpFIGxlbik7Ci0KLSAgICBzdGF0aWMgRlhfU1RSU0laRSAgICAgICBXU3RyaW5nTGVuZ3RoKGNvbnN0IHVuc2lnbmVkIHNob3J0KiBzdHIpOwotCi0gICAgLy8gRXhwbGljaXQgY29udmVyc2lvbiB0byByYXcgc3RyaW5nCi0gICAgRlhfTFBDV1NUUiBjX3N0cigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRGF0YSA/IG1fcERhdGEtPm1fU3RyaW5nIDogTCIiOworICAgcHJpdmF0ZToKKyAgICBTdHJpbmdEYXRhKEZYX1NUUlNJWkUgZGF0YUxlbiwgRlhfU1RSU0laRSBhbGxvY0xlbikKKyAgICAgICAgOiBtX25SZWZzKDEpLCBtX25EYXRhTGVuZ3RoKGRhdGFMZW4pLCBtX25BbGxvY0xlbmd0aChhbGxvY0xlbikgeworICAgICAgRlhTWVNfYXNzZXJ0KGRhdGFMZW4gPj0gMCk7CisgICAgICBGWFNZU19hc3NlcnQoYWxsb2NMZW4gPj0gMCk7CisgICAgICBGWFNZU19hc3NlcnQoZGF0YUxlbiA8PSBhbGxvY0xlbik7CisgICAgICBtX1N0cmluZ1tkYXRhTGVuXSA9IDA7CiAgICAgfQorICAgIH5TdHJpbmdEYXRhKCkgPSBkZWxldGU7CisgIH07CiAKLSAgICAvLyBJbXBsaWNpdCBjb252ZXJzaW9uIHRvIEMtc3R5bGUgd2lkZSBzdHJpbmcgLS0gZGVwcmVjYXRlZAotICAgIG9wZXJhdG9yIEZYX0xQQ1dTVFIoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcERhdGEgPyBtX3BEYXRhLT5tX1N0cmluZyA6IEwiIjsKLSAgICB9CisgIHZvaWQgQ29weUJlZm9yZVdyaXRlKCk7CisgIHZvaWQgQWxsb2NCZWZvcmVXcml0ZShGWF9TVFJTSVpFIG5MZW4pOworICB2b2lkIENvbmNhdEluUGxhY2UoRlhfU1RSU0laRSBuU3JjTGVuLCBjb25zdCBGWF9XQ0hBUiogbHBzelNyY0RhdGEpOworICB2b2lkIENvbmNhdENvcHkoRlhfU1RSU0laRSBuU3JjMUxlbiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBscHN6U3JjMURhdGEsCisgICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFIG5TcmMyTGVuLAorICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIGxwc3pTcmMyRGF0YSk7CisgIHZvaWQgQXNzaWduQ29weShGWF9TVFJTSVpFIG5TcmNMZW4sIGNvbnN0IEZYX1dDSEFSKiBscHN6U3JjRGF0YSk7CisgIHZvaWQgQWxsb2NDb3B5KENGWF9XaWRlU3RyaW5nJiBkZXN0LAorICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFIG5Db3B5TGVuLAorICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFIG5Db3B5SW5kZXgpIGNvbnN0OwogCi0gICAgdm9pZAkJCQkJRW1wdHkoKTsKLQotCi0gICAgRlhfQk9PTAkJCQkJSXNFbXB0eSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gIUdldExlbmd0aCgpOwotICAgIH0KLQotICAgIEZYX1NUUlNJWkUJCQkJR2V0TGVuZ3RoKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BEYXRhID8gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA6IDA7Ci0gICAgfQotCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmCW9wZXJhdG9yID0gKEZYX0xQQ1dTVFIgc3RyKTsKLQotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJglvcGVyYXRvciA9KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmdTcmMpOwotCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmCW9wZXJhdG9yID0oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHJpbmdTcmMpOwotCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmCW9wZXJhdG9yICs9IChGWF9MUENXU1RSIHN0cik7Ci0KLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYJb3BlcmF0b3IgKz0gKEZYX1dDSEFSIGNoKTsKLQotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJglvcGVyYXRvciArPSAoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7Ci0KLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYJb3BlcmF0b3IgKz0gKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKTsKLQotICAgIGJvb2wgb3BlcmF0b3I9PSAoY29uc3Qgd2NoYXJfdCogcHRyKSBjb25zdCB7IHJldHVybiBFcXVhbChwdHIpOyB9Ci0gICAgYm9vbCBvcGVyYXRvcj09IChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cikgY29uc3QgeyByZXR1cm4gRXF1YWwoc3RyKTsgfQotICAgIGJvb2wgb3BlcmF0b3I9PSAoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG90aGVyKSBjb25zdCB7IHJldHVybiBFcXVhbChvdGhlcik7IH0KLQotICAgIGJvb2wgb3BlcmF0b3IhPSAoY29uc3Qgd2NoYXJfdCogcHRyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IHB0cik7IH0KLSAgICBib29sIG9wZXJhdG9yIT0gKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAhKCp0aGlzID09IHN0cik7Ci0gICAgfQotICAgIGJvb2wgb3BlcmF0b3IhPSAoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG90aGVyKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKLSAgICB9Ci0KLSAgICBib29sIG9wZXJhdG9yPCAoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikgY29uc3QgewotICAgICAgICBpbnQgcmVzdWx0ID0gd21lbWNtcChjX3N0cigpLCBzdHIuY19zdHIoKSwgc3RkOjptaW4oR2V0TGVuZ3RoKCksIHN0ci5HZXRMZW5ndGgoKSkpOwotICAgICAgICByZXR1cm4gcmVzdWx0IDwgMCB8fCAocmVzdWx0ID09IDAgJiYgR2V0TGVuZ3RoKCkgPCBzdHIuR2V0TGVuZ3RoKCkpOwotICAgIH0KLQotICAgIEZYX1dDSEFSCQkJCUdldEF0KEZYX1NUUlNJWkUgbkluZGV4KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcERhdGEgPyBtX3BEYXRhLT5tX1N0cmluZ1tuSW5kZXhdIDogMDsKLSAgICB9Ci0KLSAgICBGWF9XQ0hBUgkJCQlvcGVyYXRvcltdKEZYX1NUUlNJWkUgbkluZGV4KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcERhdGEgPyBtX3BEYXRhLT5tX1N0cmluZ1tuSW5kZXhdIDogMDsKLSAgICB9Ci0KLSAgICB2b2lkCQkJCQlTZXRBdChGWF9TVFJTSVpFIG5JbmRleCwgRlhfV0NIQVIgY2gpOwotCi0gICAgaW50CQkJCQkJQ29tcGFyZShGWF9MUENXU1RSIHN0cikgY29uc3Q7Ci0KLSAgICBpbnQJCQkJCQlDb21wYXJlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIGNvbnN0OwotCi0gICAgaW50CQkJCQkJQ29tcGFyZU5vQ2FzZShGWF9MUENXU1RSIHN0cikgY29uc3Q7Ci0KLSAgICBib29sIEVxdWFsKGNvbnN0IHdjaGFyX3QqIHB0cikgY29uc3Q7Ci0gICAgYm9vbCBFcXVhbChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cikgY29uc3Q7Ci0gICAgYm9vbCBFcXVhbChjb25zdCBDRlhfV2lkZVN0cmluZyYgb3RoZXIpIGNvbnN0OwotCi0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlNaWQoRlhfU1RSU0laRSBmaXJzdCkgY29uc3Q7Ci0KLSAgICBDRlhfV2lkZVN0cmluZwkJCU1pZChGWF9TVFJTSVpFIGZpcnN0LCBGWF9TVFJTSVpFIGNvdW50KSBjb25zdDsKLQotICAgIENGWF9XaWRlU3RyaW5nCQkJTGVmdChGWF9TVFJTSVpFIGNvdW50KSBjb25zdDsKLQotICAgIENGWF9XaWRlU3RyaW5nCQkJUmlnaHQoRlhfU1RSU0laRSBjb3VudCkgY29uc3Q7Ci0KLSAgICBGWF9TVFJTSVpFCQkJCUluc2VydChGWF9TVFJTSVpFIGluZGV4LCBGWF9XQ0hBUiBjaCk7Ci0KLSAgICBGWF9TVFJTSVpFCQkJCURlbGV0ZShGWF9TVFJTSVpFIGluZGV4LCBGWF9TVFJTSVpFIGNvdW50ID0gMSk7Ci0KLSAgICB2b2lkCQkJCQlGb3JtYXQoRlhfTFBDV1NUUiBscHN6Rm9ybWF0LCAuLi4gKTsKLQotICAgIHZvaWQJCQkJCUZvcm1hdFYoRlhfTFBDV1NUUiBscHN6Rm9ybWF0LCB2YV9saXN0IGFyZ0xpc3QpOwotCi0gICAgdm9pZAkJCQkJTWFrZUxvd2VyKCk7Ci0KLSAgICB2b2lkCQkJCQlNYWtlVXBwZXIoKTsKLQotICAgIHZvaWQJCQkJCVRyaW1SaWdodCgpOwotCi0gICAgdm9pZAkJCQkJVHJpbVJpZ2h0KEZYX1dDSEFSIGNoVGFyZ2V0KTsKLQotICAgIHZvaWQJCQkJCVRyaW1SaWdodChGWF9MUENXU1RSIGxwc3pUYXJnZXRzKTsKLQotICAgIHZvaWQJCQkJCVRyaW1MZWZ0KCk7Ci0KLSAgICB2b2lkCQkJCQlUcmltTGVmdChGWF9XQ0hBUiBjaFRhcmdldCk7Ci0KLSAgICB2b2lkCQkJCQlUcmltTGVmdChGWF9MUENXU1RSIGxwc3pUYXJnZXRzKTsKLQotICAgIHZvaWQJCQkJCVJlc2VydmUoRlhfU1RSU0laRSBsZW4pOwotCi0gICAgRlhfTFBXU1RSCQkJCUdldEJ1ZmZlcihGWF9TVFJTSVpFIGxlbik7Ci0KLSAgICB2b2lkCQkJCQlSZWxlYXNlQnVmZmVyKEZYX1NUUlNJWkUgbGVuID0gLTEpOwotCi0gICAgaW50CQkJCQkJR2V0SW50ZWdlcigpIGNvbnN0OwotCi0gICAgRlhfRkxPQVQJCQkJR2V0RmxvYXQoKSBjb25zdDsKLQotICAgIEZYX1NUUlNJWkUJCQkJRmluZChGWF9MUENXU1RSIGxwc3pTdWIsIEZYX1NUUlNJWkUgc3RhcnQgPSAwKSBjb25zdDsKLQotICAgIEZYX1NUUlNJWkUJCQkJRmluZChGWF9XQ0hBUiBjaCwgRlhfU1RSU0laRSBzdGFydCA9IDApIGNvbnN0OwotCi0gICAgRlhfU1RSU0laRQkJCQlSZXBsYWNlKEZYX0xQQ1dTVFIgbHBzek9sZCwgRlhfTFBDV1NUUiBscHN6TmV3KTsKLQotICAgIEZYX1NUUlNJWkUJCQkJUmVtb3ZlKEZYX1dDSEFSIGNoKTsKLQotICAgIENGWF9CeXRlU3RyaW5nCQkJVVRGOEVuY29kZSgpIGNvbnN0OwotCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCQlVVEYxNkxFX0VuY29kZSgpIGNvbnN0OwotCi0gICAgdm9pZAkJCQkJQ29udmVydEZyb20oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0ciwgQ0ZYX0NoYXJNYXAqIHBDaGFyTWFwID0gTlVMTCk7Ci0KLXByb3RlY3RlZDoKLSAgICBjbGFzcyBTdHJpbmdEYXRhIHsKLSAgICAgIHB1YmxpYzoKLSAgICAgICAgc3RhdGljIFN0cmluZ0RhdGEqIENyZWF0ZShpbnQgbkxlbik7Ci0gICAgICAgIHZvaWQgUmV0YWluKCkgeyArK21fblJlZnM7IH0KLSAgICAgICAgdm9pZCBSZWxlYXNlKCkgeyBpZiAoLS1tX25SZWZzIDw9IDApIEZYX0ZyZWUodGhpcyk7IH0KLQotICAgICAgICBpbnRwdHJfdCAgICBtX25SZWZzOyAgLy8gV291bGQgcHJlZmVyIHNzaXplX3QsIGJ1dCBubyB3aW5kb3dzIHN1cHBvcnQuCi0gICAgICAgIEZYX1NUUlNJWkUgIG1fbkRhdGFMZW5ndGg7Ci0gICAgICAgIEZYX1NUUlNJWkUgIG1fbkFsbG9jTGVuZ3RoOwotICAgICAgICBGWF9XQ0hBUiAgICBtX1N0cmluZ1sxXTsKLQotICAgICAgcHJpdmF0ZToKLSAgICAgICAgU3RyaW5nRGF0YShGWF9TVFJTSVpFIGRhdGFMZW4sIEZYX1NUUlNJWkUgYWxsb2NMZW4pCi0gICAgICAgICAgICAgICAgOiBtX25SZWZzKDEpLCBtX25EYXRhTGVuZ3RoKGRhdGFMZW4pLCBtX25BbGxvY0xlbmd0aChhbGxvY0xlbikgewotICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KGRhdGFMZW4gPj0gMCk7Ci0gICAgICAgICAgICBGWFNZU19hc3NlcnQoYWxsb2NMZW4gPj0gMCk7Ci0gICAgICAgICAgICBGWFNZU19hc3NlcnQoZGF0YUxlbiA8PSBhbGxvY0xlbik7Ci0gICAgICAgICAgICBtX1N0cmluZ1tkYXRhTGVuXSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgflN0cmluZ0RhdGEoKSA9IGRlbGV0ZTsKLSAgICB9OwotCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgQ29weUJlZm9yZVdyaXRlKCk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgQWxsb2NCZWZvcmVXcml0ZShGWF9TVFJTSVpFIG5MZW4pOwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIENvbmNhdEluUGxhY2UoRlhfU1RSU0laRSBuU3JjTGVuLCBGWF9MUENXU1RSIGxwc3pTcmNEYXRhKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICBDb25jYXRDb3B5KEZYX1NUUlNJWkUgblNyYzFMZW4sIEZYX0xQQ1dTVFIgbHBzelNyYzFEYXRhLCBGWF9TVFJTSVpFIG5TcmMyTGVuLCBGWF9MUENXU1RSIGxwc3pTcmMyRGF0YSk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgQXNzaWduQ29weShGWF9TVFJTSVpFIG5TcmNMZW4sIEZYX0xQQ1dTVFIgbHBzelNyY0RhdGEpOwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIEFsbG9jQ29weShDRlhfV2lkZVN0cmluZyYgZGVzdCwgRlhfU1RSU0laRSBuQ29weUxlbiwgRlhfU1RSU0laRSBuQ29weUluZGV4KSBjb25zdDsKLQotICAgIFN0cmluZ0RhdGEqIG1fcERhdGE7Ci0gICAgZnJpZW5kIGNsYXNzIGZ4Y3J0X1dpZGVTdHJpbmdDb25jYXRJblBsYWNlX1Rlc3Q7CisgIFN0cmluZ0RhdGEqIG1fcERhdGE7CisgIGZyaWVuZCBjbGFzcyBmeGNydF9XaWRlU3RyaW5nQ29uY2F0SW5QbGFjZV9UZXN0OwogfTsKLWlubGluZSBDRlhfV2lkZVN0cmluZ0M6OkNGWF9XaWRlU3RyaW5nQyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc3JjKQotewotICAgIG1fUHRyID0gc3JjLmNfc3RyKCk7Ci0gICAgbV9MZW5ndGggPSBzcmMuR2V0TGVuZ3RoKCk7CitpbmxpbmUgQ0ZYX1dpZGVTdHJpbmdDOjpDRlhfV2lkZVN0cmluZ0MoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNyYykgeworICBtX1B0ciA9IHNyYy5jX3N0cigpOworICBtX0xlbmd0aCA9IHNyYy5HZXRMZW5ndGgoKTsKIH0KLWlubGluZSBDRlhfV2lkZVN0cmluZ0MmIENGWF9XaWRlU3RyaW5nQzo6b3BlcmF0b3IgPSAoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNyYykKLXsKLSAgICBtX1B0ciA9IHNyYy5jX3N0cigpOwotICAgIG1fTGVuZ3RoID0gc3JjLkdldExlbmd0aCgpOwotICAgIHJldHVybiAqdGhpczsKK2lubGluZSBDRlhfV2lkZVN0cmluZ0MmIENGWF9XaWRlU3RyaW5nQzo6b3BlcmF0b3I9KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzcmMpIHsKKyAgbV9QdHIgPSBzcmMuY19zdHIoKTsKKyAgbV9MZW5ndGggPSBzcmMuR2V0TGVuZ3RoKCk7CisgIHJldHVybiAqdGhpczsKIH0KIAotaW5saW5lIENGWF9XaWRlU3RyaW5nIG9wZXJhdG9yICsgKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyMSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIyKQotewotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZyhzdHIxLCBzdHIyKTsKK2lubGluZSBDRlhfV2lkZVN0cmluZyBvcGVyYXRvcisoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cjIpIHsKKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKHN0cjEsIHN0cjIpOwogfQotaW5saW5lIENGWF9XaWRlU3RyaW5nIG9wZXJhdG9yICsgKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyMSwgRlhfTFBDV1NUUiBzdHIyKQotewotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZyhzdHIxLCBzdHIyKTsKK2lubGluZSBDRlhfV2lkZVN0cmluZyBvcGVyYXRvcisoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogc3RyMikgeworICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoc3RyMSwgc3RyMik7CiB9Ci1pbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgb3BlcmF0b3IgKyAoRlhfTFBDV1NUUiBzdHIxLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cjIpCi17Ci0gICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKHN0cjEsIHN0cjIpOworaW5saW5lIENGWF9XaWRlU3RyaW5nIG9wZXJhdG9yKyhjb25zdCBGWF9XQ0hBUiogc3RyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIyKSB7CisgIHJldHVybiBDRlhfV2lkZVN0cmluZyhzdHIxLCBzdHIyKTsKIH0KLWlubGluZSBDRlhfV2lkZVN0cmluZyBvcGVyYXRvciArIChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cjEsIEZYX1dDSEFSIGNoKQotewotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZyhzdHIxLCBDRlhfV2lkZVN0cmluZ0MoY2gpKTsKK2lubGluZSBDRlhfV2lkZVN0cmluZyBvcGVyYXRvcisoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIxLCBGWF9XQ0hBUiBjaCkgeworICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoc3RyMSwgQ0ZYX1dpZGVTdHJpbmdDKGNoKSk7CiB9Ci1pbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgb3BlcmF0b3IgKyAoRlhfV0NIQVIgY2gsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyMikKLXsKLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoY2gsIHN0cjIpOworaW5saW5lIENGWF9XaWRlU3RyaW5nIG9wZXJhdG9yKyhGWF9XQ0hBUiBjaCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIyKSB7CisgIHJldHVybiBDRlhfV2lkZVN0cmluZyhjaCwgc3RyMik7CiB9Ci1pbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgb3BlcmF0b3IgKyAoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cjEsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIyKQotewotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZyhzdHIxLCBzdHIyKTsKK2lubGluZSBDRlhfV2lkZVN0cmluZyBvcGVyYXRvcisoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIyKSB7CisgIHJldHVybiBDRlhfV2lkZVN0cmluZyhzdHIxLCBzdHIyKTsKIH0KLWlubGluZSBDRlhfV2lkZVN0cmluZyBvcGVyYXRvciArIChjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyMSwgRlhfV0NIQVIgY2gpCi17Ci0gICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKHN0cjEsIENGWF9XaWRlU3RyaW5nQyhjaCkpOworaW5saW5lIENGWF9XaWRlU3RyaW5nIG9wZXJhdG9yKyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyMSwgRlhfV0NIQVIgY2gpIHsKKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKHN0cjEsIENGWF9XaWRlU3RyaW5nQyhjaCkpOwogfQotaW5saW5lIENGWF9XaWRlU3RyaW5nIG9wZXJhdG9yICsgKEZYX1dDSEFSIGNoLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyMikKLXsKLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoY2gsIHN0cjIpOworaW5saW5lIENGWF9XaWRlU3RyaW5nIG9wZXJhdG9yKyhGWF9XQ0hBUiBjaCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cjIpIHsKKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKGNoLCBzdHIyKTsKIH0KLWlubGluZSBDRlhfV2lkZVN0cmluZyBvcGVyYXRvciArIChjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyMSwgRlhfTFBDV1NUUiBzdHIyKQotewotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZyhzdHIxLCBzdHIyKTsKK2lubGluZSBDRlhfV2lkZVN0cmluZyBvcGVyYXRvcisoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBzdHIyKSB7CisgIHJldHVybiBDRlhfV2lkZVN0cmluZyhzdHIxLCBzdHIyKTsKIH0KLWlubGluZSBDRlhfV2lkZVN0cmluZyBvcGVyYXRvciArIChGWF9MUENXU1RSIHN0cjEsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIyKQotewotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZyhzdHIxLCBzdHIyKTsKK2lubGluZSBDRlhfV2lkZVN0cmluZyBvcGVyYXRvcisoY29uc3QgRlhfV0NIQVIqIHN0cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIyKSB7CisgIHJldHVybiBDRlhfV2lkZVN0cmluZyhzdHIxLCBzdHIyKTsKIH0KLWlubGluZSBDRlhfV2lkZVN0cmluZyBvcGVyYXRvciArIChjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyMSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIyKQotewotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZyhzdHIxLCBzdHIyKTsKK2lubGluZSBDRlhfV2lkZVN0cmluZyBvcGVyYXRvcisoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyMikgeworICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoc3RyMSwgc3RyMik7CiB9Ci1pbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgb3BlcmF0b3IgKyAoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIxLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyMikKLXsKLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoc3RyMSwgc3RyMik7CitpbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cjIpIHsKKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKHN0cjEsIHN0cjIpOwogfQotaW5saW5lIGJvb2wgb3BlcmF0b3I9PSAoY29uc3Qgd2NoYXJfdCogbGhzLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgcmhzKSB7Ci0gICAgcmV0dXJuIHJocyA9PSBsaHM7CitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHdjaGFyX3QqIGxocywgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHJocykgeworICByZXR1cm4gcmhzID09IGxoczsKIH0KLWlubGluZSBib29sIG9wZXJhdG9yPT0gKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgbGhzLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgcmhzKSB7Ci0gICAgcmV0dXJuIHJocyA9PSBsaHM7CitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgbGhzLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgcmhzKSB7CisgIHJldHVybiByaHMgPT0gbGhzOwogfQotaW5saW5lIGJvb2wgb3BlcmF0b3IhPSAoY29uc3Qgd2NoYXJfdCogbGhzLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgcmhzKSB7Ci0gICAgcmV0dXJuIHJocyAhPSBsaHM7CitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHdjaGFyX3QqIGxocywgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHJocykgeworICByZXR1cm4gcmhzICE9IGxoczsKIH0KLWlubGluZSBib29sIG9wZXJhdG9yIT0gKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgbGhzLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgcmhzKSB7Ci0gICAgcmV0dXJuIHJocyAhPSBsaHM7CitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgbGhzLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgcmhzKSB7CisgIHJldHVybiByaHMgIT0gbGhzOwogfQotRlhfRkxPQVQgRlhfYXRvZihGWF9CU1RSIHN0cik7Ci12b2lkIEZYX2F0b251bShGWF9CU1RSIHN0ciwgRlhfQk9PTCYgYkludGVnZXIsIHZvaWQqIHBEYXRhKTsKLUZYX1NUUlNJWkUgRlhfZnRvYShGWF9GTE9BVCBmLCBGWF9MUFNUUiBidWYpOwotQ0ZYX0J5dGVTdHJpbmcJRlhfVVRGOEVuY29kZShGWF9MUENXU1RSIHB3c1N0ciwgRlhfU1RSU0laRSBsZW4pOwotaW5saW5lIENGWF9CeXRlU3RyaW5nCUZYX1VURjhFbmNvZGUoRlhfV1NUUiB3c1N0cikKLXsKLSAgICByZXR1cm4gRlhfVVRGOEVuY29kZSh3c1N0ci5HZXRQdHIoKSwgd3NTdHIuR2V0TGVuZ3RoKCkpOworRlhfRkxPQVQgRlhfYXRvZihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7Cit2b2lkIEZYX2F0b251bShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0ciwgRlhfQk9PTCYgYkludGVnZXIsIHZvaWQqIHBEYXRhKTsKK0ZYX1NUUlNJWkUgRlhfZnRvYShGWF9GTE9BVCBmLCBGWF9DSEFSKiBidWYpOworQ0ZYX0J5dGVTdHJpbmcgRlhfVVRGOEVuY29kZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBGWF9TVFJTSVpFIGxlbik7CitpbmxpbmUgQ0ZYX0J5dGVTdHJpbmcgRlhfVVRGOEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzU3RyKSB7CisgIHJldHVybiBGWF9VVEY4RW5jb2RlKHdzU3RyLkdldFB0cigpLCB3c1N0ci5HZXRMZW5ndGgoKSk7CiB9Ci1pbmxpbmUgQ0ZYX0J5dGVTdHJpbmcJRlhfVVRGOEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyAmd3NTdHIpCi17Ci0gICAgcmV0dXJuIEZYX1VURjhFbmNvZGUod3NTdHIuY19zdHIoKSwgd3NTdHIuR2V0TGVuZ3RoKCkpOworaW5saW5lIENGWF9CeXRlU3RyaW5nIEZYX1VURjhFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3RyKSB7CisgIHJldHVybiBGWF9VVEY4RW5jb2RlKHdzU3RyLmNfc3RyKCksIHdzU3RyLkdldExlbmd0aCgpKTsKIH0KIAogI2VuZGlmICAvLyBDT1JFX0lOQ0xVREVfRlhDUlRfRlhfU1RSSU5HX0hfCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmggYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmgKaW5kZXggNzZjNmI1OS4uMmZiYWI5OCAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaApAQCAtMSwyOSArMSw0NSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIENPUkVfSU5DTFVERV9GWENSVF9GWF9TWVNURU1fSF8KICNkZWZpbmUgQ09SRV9JTkNMVURFX0ZYQ1JUX0ZYX1NZU1RFTV9IXwogCi0jZGVmaW5lIF9GWF9XSU4zMl9ERVNLVE9QXwkJMQotI2RlZmluZSBfRlhfTElOVVhfREVTS1RPUF8JCTQKLSNkZWZpbmUgX0ZYX01BQ09TWF8JCQkJNwotI2RlZmluZSBfRlhfQU5EUk9JRF8JCQkxMgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHdjaGFyLmg+CiAKLSNkZWZpbmUgX0ZYTV9QTEFURk9STV9XSU5ET1dTXwkJMQotI2RlZmluZSBfRlhNX1BMQVRGT1JNX0xJTlVYXwkJMgotI2RlZmluZSBfRlhNX1BMQVRGT1JNX0FQUExFXwkJMwotI2RlZmluZSBfRlhNX1BMQVRGT1JNX0FORFJPSURfCQk0CisvLyBfRlhfT1NfIHZhbHVlczoKKyNkZWZpbmUgX0ZYX1dJTjMyX0RFU0tUT1BfIDEKKyNkZWZpbmUgX0ZYX1dJTjY0X0RFU0tUT1BfIDIKKyNkZWZpbmUgX0ZYX0xJTlVYX0RFU0tUT1BfIDQKKyNkZWZpbmUgX0ZYX01BQ09TWF8gNworI2RlZmluZSBfRlhfQU5EUk9JRF8gMTIKKworLy8gX0ZYTV9QTEFURk9STV8gdmFsdWVzOworI2RlZmluZSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfIDEgIC8vIF9GWF9XSU4zMl9ERVNLVE9QXyBvciBfRlhfV0lONjRfREVTS1RPUF8uCisjZGVmaW5lIF9GWE1fUExBVEZPUk1fTElOVVhfIDIgICAgLy8gX0ZYX0xJTlVYX0RFU0tUT1BfIGFsd2F5cy4KKyNkZWZpbmUgX0ZYTV9QTEFURk9STV9BUFBMRV8gMyAgICAvLyBfRlhfTUFDT1NYXyBhbHdheXMuCisjZGVmaW5lIF9GWE1fUExBVEZPUk1fQU5EUk9JRF8gNCAgLy8gX0ZYX0FORFJPSURfIGFsd2F5cy4KIAogI2lmbmRlZiBfRlhfT1NfCiAjaWYgZGVmaW5lZChfX0FORFJPSURfXykKICNkZWZpbmUgX0ZYX09TXyBfRlhfQU5EUk9JRF8KICNkZWZpbmUgX0ZYTV9QTEFURk9STV8gX0ZYTV9QTEFURk9STV9BTkRST0lEXwotI2VsaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KQorI2VsaWYgZGVmaW5lZChfV0lOMzIpCiAjZGVmaW5lIF9GWF9PU18gX0ZYX1dJTjMyX0RFU0tUT1BfCiAjZGVmaW5lIF9GWE1fUExBVEZPUk1fIF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyNlbGlmIGRlZmluZWQoX1dJTjY0KQorI2RlZmluZSBfRlhfT1NfIF9GWF9XSU42NF9ERVNLVE9QXworI2RlZmluZSBfRlhNX1BMQVRGT1JNXyBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCiAjZWxpZiBkZWZpbmVkKF9fbGludXhfXykKICNkZWZpbmUgX0ZYX09TXyBfRlhfTElOVVhfREVTS1RPUF8KICNkZWZpbmUgX0ZYTV9QTEFURk9STV8gX0ZYTV9QTEFURk9STV9MSU5VWF8KQEAgLTMxLDk0ICs0NywzMyBAQAogI2RlZmluZSBfRlhfT1NfIF9GWF9NQUNPU1hfCiAjZGVmaW5lIF9GWE1fUExBVEZPUk1fIF9GWE1fUExBVEZPUk1fQVBQTEVfCiAjZW5kaWYKLSNlbmRpZgorI2VuZGlmICAvLyBfRlhfT1NfCiAKICNpZiAhZGVmaW5lZChfRlhfT1NfKSB8fCBfRlhfT1NfID09IDAKLSNlcnJvciBTb3JyeSwgY2FuIG5vdCBmaWd1cmUgb3V0IHdoYXQgT1MgeW91IGFyZSB0YXJnZXRpbmcgdG8uIFBsZWFzZSBzcGVjaWZ5IF9GWF9PU18gbWFjcm8uCisjZXJyb3IgU29ycnksIGNhbiBub3QgZmlndXJlIG91dCB0YXJnZXQgT1MuIFBsZWFzZSBzcGVjaWZ5IF9GWF9PU18gbWFjcm8uCiAjZW5kaWYKIAogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KICNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKICNpbmNsdWRlIDxzYWwuaD4KICNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZW5kaWYgIC8vIF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSNkZWZpbmUgX0ZYX1czMl8JCTEKLSNkZWZpbmUgX0ZYX1c2NF8JCTIKLSNpZm5kZWYgX0ZYX1dPUkRTSVpFXwotI2lmIGRlZmluZWQoX1dJTjY0KSB8fCBkZWZpbmVkKF9fYXJtNjQpIHx8IGRlZmluZWQoX19hcm02NF9fKSB8fCBkZWZpbmVkKF9NX0FNRDY0KSB8fCBkZWZpbmVkKF9NX1g2NCkgfHwgZGVmaW5lZChfTV9JQTY0KSB8fCBkZWZpbmVkKF9fcG93ZXJwYzY0X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgX19XT1JEU0laRSA9PSA2NCB8fCBkZWZpbmVkKF9fTFA2NF9fKQotI2RlZmluZSBfRlhfV09SRFNJWkVfCV9GWF9XNjRfCi0jZWxzZQotI2RlZmluZSBfRlhfV09SRFNJWkVfCV9GWF9XMzJfCiAjZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c2V0am1wLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDx3Y2hhci5oPgogCiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KICNpbmNsdWRlIDxsaWJrZXJuL09TQXRvbWljLmg+Ci0jaWYgX0ZYX09TXyA9PSBfRlhfTUFDT1NYXwogI2luY2x1ZGUgPENhcmJvbi9DYXJib24uaD4KLSNlbGlmIF9GWF9PU18gPT0gX0ZYX0lPU18KLSNpbmNsdWRlIDxDb3JlVGV4dC9Db3JlVGV4dC5oPgotI2luY2x1ZGUgPENvcmVHcmFwaGljcy9Db3JlR3JhcGhpY3MuaD4KLSNlbmRpZgogI2VuZGlmCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKLXR5cGVkZWYgdm9pZCoJCQkJCUZYX0xQVk9JRDsKLXR5cGVkZWYgdm9pZCBjb25zdCoJCQkJRlhfTFBDVk9JRDsKLXR5cGVkZWYgdm9pZCoJCQkJCUZYX1BPU0lUSU9OOwotdHlwZWRlZiBzaWduZWQgY2hhcgkJCQlGWF9JTlQ4OwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyCQkJRlhfVUlOVDg7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIJCQlGWF9CWVRFOwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyKgkJCUZYX0xQQllURTsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBjb25zdCoJRlhfTFBDQllURTsKLXR5cGVkZWYgc2hvcnQJCQkJCUZYX0lOVDE2OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJCUZYX1VJTlQxNjsKLXR5cGVkZWYgc2hvcnQJCQkJCUZYX1NIT1JUOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJCUZYX1dPUkQ7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0KgkJCUZYX0xQV09SRDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgY29uc3QqCUZYX0xQQ1dPUkQ7Ci10eXBlZGVmIGludAkJCQkJCUZYX0lOVDMyOwotdHlwZWRlZiBmbG9hdAkJCQkJRlhfRkxPQVQ7Ci10eXBlZGVmIGludAkJCQkJCUZYX0JPT0w7Ci10eXBlZGVmIGludAkJCQkJCUZYX0VSUjsKLSNkZWZpbmUgRlhfU1VDQ0VFREVEKFN0YXR1cykJKChGWF9FUlIpKFN0YXR1cykgPj0gMCkKLSNkZWZpbmUgRlhfRkFJTEVEKFN0YXR1cykJCSgoRlhfRVJSKShTdGF0dXMpIDwgMCkKLXR5cGVkZWYgY2hhcgkJCQkJRlhfQ0hBUjsKLXR5cGVkZWYgY2hhcioJCQkJCUZYX0xQU1RSOwotdHlwZWRlZiBjaGFyIGNvbnN0KgkJCQlGWF9MUENTVFI7Ci0jZGVmaW5lIEZYX0RXT1JEX01BWCBVSU5UX01BWAotdHlwZWRlZiB1bnNpZ25lZCBpbnQJCUZYX0RXT1JEOwotdHlwZWRlZiB1bnNpZ25lZCBpbnQqCQlGWF9MUERXT1JEOwotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLXR5cGVkZWYgX19pbnQ2NAkJCQlGWF9JTlQ2NDsKLXR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NAlGWF9VSU5UNjQ7Ci0jZWxzZQotdHlwZWRlZiBsb25nIGxvbmcgaW50CQlGWF9JTlQ2NDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nCUZYX1VJTlQ2NDsKLSNlbmRpZgotI2lmIF9GWF9XT1JEU0laRV8gPT0gX0ZYX1c2NF8KLXR5cGVkZWYgRlhfSU5UNjQJCQlGWF9JTlRQVFI7Ci10eXBlZGVmIEZYX1VJTlQ2NAkJCUZYX1VJTlRQVFI7Ci0jZWxzZQotdHlwZWRlZiBpbnQJCQkJCUZYX0lOVFBUUjsKLXR5cGVkZWYgdW5zaWduZWQgaW50CQlGWF9VSU5UUFRSOwotI2VuZGlmCi10eXBlZGVmIHdjaGFyX3QJCQkJCUZYX1dDSEFSOwotdHlwZWRlZiB3Y2hhcl90KgkJCQlGWF9MUFdTVFI7Ci10eXBlZGVmIHdjaGFyX3QgY29uc3QqCQkJRlhfTFBDV1NUUjsKLXR5cGVkZWYgRlhfRFdPUkQJCQkJRlhfVUlOVDMyOwotdHlwZWRlZiBGWF9VSU5UNjQJCQkJRlhfUVdPUkQ7Cit0eXBlZGVmIHZvaWQqIEZYX1BPU0lUSU9OOyAgICAgICAvLyBLZWVwIHVudGlsIGZ4Y3J0IGNvbnRhaW5lcnMgZ29uZQordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBGWF9XT1JEOyAgLy8gS2VlcCAtICJhbiBlZmZpY2llbnQgc21hbGwgdHlwZSIKK3R5cGVkZWYgdW5zaWduZWQgaW50IEZYX0RXT1JEOyAgIC8vIEtlZXAgLSAiYW4gZWZmaWNpZW50IHR5cGUiCit0eXBlZGVmIGZsb2F0IEZYX0ZMT0FUOyAgICAgICAgICAvLyBLZWVwLCBhbGxvdyB1cGdyYWRlIHRvIGRvdWJsZXMuCit0eXBlZGVmIGludCBGWF9CT09MOyAgICAgICAgICAgICAvLyBLZWVwLCBzYWRseSBub3QgYWx3YXlzIDAgb3IgMS4KK3R5cGVkZWYgY2hhciBGWF9DSEFSOyAgICAgICAgICAgIC8vIEtlZXAsIHF1ZXN0aW9uYWJsZSBzaWduZWRuZXNzLgordHlwZWRlZiB3Y2hhcl90IEZYX1dDSEFSOyAgICAgICAgLy8gS2VlcCwgbWF5YmUgYmFkIHBsYXRmb3JtIHdjaGFycy4KIAogLy8gUERGaXVtIHN0cmluZyBzaXplcyBhcmUgbGltaXRlZCB0byAyXjMxLTEsIGFuZCB0aGUgdmFsdWUgaXMgc2lnbmVkIHRvCiAvLyBhbGxvdyAtMSBhcyBhIHBsYWNlaG9sZGVyIGZvciAidW5rbm93biIuCkBAIC0xMjgsNjEgKzgzLDY5IEBACiAjaWYgZGVmaW5lZChERUJVRykgJiYgIWRlZmluZWQoX0RFQlVHKQogI2RlZmluZSBfREVCVUcKICNlbmRpZgorCiAjaWZuZGVmIFRSVUUKLQotI2RlZmluZSBUUlVFCTEKKyNkZWZpbmUgVFJVRSAxCiAjZW5kaWYKKwogI2lmbmRlZiBGQUxTRQotCi0jZGVmaW5lIEZBTFNFCTAKKyNkZWZpbmUgRkFMU0UgMAogI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworc3RhdGljX2Fzc2VydChUUlVFID09IHRydWUsICJ0cnVlX25lZWRzX3RvX2JlX3RydWUiKTsKK3N0YXRpY19hc3NlcnQoRkFMU0UgPT0gZmFsc2UsICJmYWxzZV9uZWVkc190b19iZV9mYWxzZSIpOworI2VuZGlmCisKICNpZm5kZWYgTlVMTAotCi0jZGVmaW5lIE5VTEwJMAorI2RlZmluZSBOVUxMIDAKICNlbmRpZgorCiAjZGVmaW5lIEZYU1lTX2Fzc2VydCBhc3NlcnQKICNpZm5kZWYgQVNTRVJUCiAjaWZkZWYgX0RFQlVHCiAjZGVmaW5lIEFTU0VSVCBGWFNZU19hc3NlcnQKICNlbHNlCi0KICNkZWZpbmUgQVNTRVJUKGEpCiAjZW5kaWYKICNlbmRpZgotI2RlZmluZSBGWF9NQVgoYSwgYikgKCgoYSkgPiAoYikpID8gKGEpIDogKGIpKQorCiAjZGVmaW5lIEZYX01JTihhLCBiKSAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCi0jZGVmaW5lIEZYX1BJCTMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NWYKKyNkZWZpbmUgRlhfUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1ZgogCiAvLyBOT1RFOiBwcmV2ZW50IHVzZSBvZiB0aGUgcmV0dXJuIHZhbHVlIGZyb20gc25wcmludGYoKSBzaW5jZSBzb21lIHBsYXRmb3JtcwogLy8gaGF2ZSBkaWZmZXJlbnQgcmV0dXJuIHZhbHVlcyAoZS5nLiB3aW5kb3dzIF92c25wcmludGYoKSksIGFuZCBwcm92aWRlCiAvLyB2ZXJzaW9ucyB0aGF0IGFsd2F5cyBOVUwtdGVybWluYXRlLgogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18gJiYgX01TQ19WRVIgPCAxOTAwCi12b2lkIEZYU1lTX3NucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IHNpemUsIF9QcmludGZfZm9ybWF0X3N0cmluZ18gY29uc3QgY2hhciogZm10LCAuLi4pOwotdm9pZCBGWFNZU192c25wcmludGYoY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciogZm10LCB2YV9saXN0IGFwKTsKK3ZvaWQgRlhTWVNfc25wcmludGYoY2hhciogc3RyLAorICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgX1ByaW50Zl9mb3JtYXRfc3RyaW5nXyBjb25zdCBjaGFyKiBmbXQsCisgICAgICAgICAgICAgICAgICAgIC4uLik7Cit2b2lkIEZYU1lTX3ZzbnByaW50ZihjaGFyKiBzdHIsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyKiBmbXQsIHZhX2xpc3QgYXApOwogI2Vsc2UKLSNkZWZpbmUgRlhTWVNfc25wcmludGYJKHZvaWQpIHNucHJpbnRmCi0jZGVmaW5lIEZYU1lTX3ZzbnByaW50Zgkodm9pZCkgdnNucHJpbnRmCisjZGVmaW5lIEZYU1lTX3NucHJpbnRmICh2b2lkKSBzbnByaW50ZgorI2RlZmluZSBGWFNZU192c25wcmludGYgKHZvaWQpIHZzbnByaW50ZgogI2VuZGlmCiAKLSNkZWZpbmUgRlhTWVNfc3ByaW50ZglET19OT1RfVVNFX1NQUklOVEZfRElFX0RJRV9ESUUKLSNkZWZpbmUgRlhTWVNfdnNwcmludGYJRE9fTk9UX1VTRV9WU1BSSU5URl9ESUVfRElFX0RJRQotI2RlZmluZSBGWFNZU19zdHJjaHIJc3RyY2hyCi0jZGVmaW5lIEZYU1lTX3N0cm5jbXAJc3RybmNtcAotI2RlZmluZSBGWFNZU19zdHJjbXAJc3RyY21wCi0jZGVmaW5lIEZYU1lTX3N0cmNweQlzdHJjcHkKLSNkZWZpbmUgRlhTWVNfc3RybmNweQlzdHJuY3B5Ci0jZGVmaW5lIEZYU1lTX3N0cnN0cglzdHJzdHIKLSNkZWZpbmUgRlhTWVNfRklMRQkJRklMRQotI2RlZmluZSBGWFNZU19mb3BlbgkJZm9wZW4KLSNkZWZpbmUgRlhTWVNfZmNsb3NlCWZjbG9zZQotI2RlZmluZSBGWFNZU19TRUVLX0VORAlTRUVLX0VORAotI2RlZmluZSBGWFNZU19TRUVLX1NFVAlTRUVLX1NFVAotI2RlZmluZSBGWFNZU19mc2VlawkJZnNlZWsKLSNkZWZpbmUgRlhTWVNfZnRlbGwJCWZ0ZWxsCi0jZGVmaW5lIEZYU1lTX2ZyZWFkCQlmcmVhZAotI2RlZmluZSBGWFNZU19md3JpdGUJZndyaXRlCi0jZGVmaW5lIEZYU1lTX2ZwcmludGYJZnByaW50ZgotI2RlZmluZSBGWFNZU19mZmx1c2gJZmZsdXNoCisjZGVmaW5lIEZYU1lTX3NwcmludGYgRE9fTk9UX1VTRV9TUFJJTlRGX0RJRV9ESUVfRElFCisjZGVmaW5lIEZYU1lTX3ZzcHJpbnRmIERPX05PVF9VU0VfVlNQUklOVEZfRElFX0RJRV9ESUUKKyNkZWZpbmUgRlhTWVNfc3RyY2hyIHN0cmNocgorI2RlZmluZSBGWFNZU19zdHJuY21wIHN0cm5jbXAKKyNkZWZpbmUgRlhTWVNfc3RyY21wIHN0cmNtcAorI2RlZmluZSBGWFNZU19zdHJjcHkgc3RyY3B5CisjZGVmaW5lIEZYU1lTX3N0cm5jcHkgc3RybmNweQorI2RlZmluZSBGWFNZU19zdHJzdHIgc3Ryc3RyCisjZGVmaW5lIEZYU1lTX0ZJTEUgRklMRQorI2RlZmluZSBGWFNZU19mb3BlbiBmb3BlbgorI2RlZmluZSBGWFNZU19mY2xvc2UgZmNsb3NlCisjZGVmaW5lIEZYU1lTX1NFRUtfRU5EIFNFRUtfRU5ECisjZGVmaW5lIEZYU1lTX1NFRUtfU0VUIFNFRUtfU0VUCisjZGVmaW5lIEZYU1lTX2ZzZWVrIGZzZWVrCisjZGVmaW5lIEZYU1lTX2Z0ZWxsIGZ0ZWxsCisjZGVmaW5lIEZYU1lTX2ZyZWFkIGZyZWFkCisjZGVmaW5lIEZYU1lTX2Z3cml0ZSBmd3JpdGUKKyNkZWZpbmUgRlhTWVNfZnByaW50ZiBmcHJpbnRmCisjZGVmaW5lIEZYU1lTX2ZmbHVzaCBmZmx1c2gKIAogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KICNpZmRlZiBfTkFUSVZFX1dDSEFSX1RfREVGSU5FRApAQCAtMTkxLDEyICsxNTQsMTIgQEAKICNkZWZpbmUgRlhTWVNfd2ZvcGVuIF93Zm9wZW4KICNlbmRpZgogI2Vsc2UKLUZYU1lTX0ZJTEUqIEZYU1lTX3dmb3BlbihGWF9MUENXU1RSIGZpbGVuYW1lLCBGWF9MUENXU1RSIG1vZGUpOwotI2VuZGlmCitGWFNZU19GSUxFKiBGWFNZU193Zm9wZW4oY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lLCBjb25zdCBGWF9XQ0hBUiogbW9kZSk7CisjZW5kaWYgIC8vIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KIAogI2lmZGVmIF9fY3BsdXNwbHVzCi19IC8vIGV4dGVybiAiQyIKLSNpbmNsdWRlICIuLi8uLi8uLi90aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfY29udmVyc2lvbnMuaCIKK30gIC8vIGV4dGVybiAiQyIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfY29udmVyc2lvbnMuaCIKICNkZWZpbmUgRlhTWVNfc3RybGVuKHB0cikgcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlhfU1RSU0laRT4oc3RybGVuKHB0cikpCiAjZGVmaW5lIEZYU1lTX3djc2xlbihwdHIpIHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PEZYX1NUUlNJWkU+KHdjc2xlbihwdHIpKQogZXh0ZXJuICJDIiB7CkBAIC0yMDUsMjAgKzE2OCwyMSBAQAogI2RlZmluZSBGWFNZU193Y3NsZW4ocHRyKSAoKEZYX1NUUlNJWkUpd2NzbGVuKHB0cikpCiAjZW5kaWYKIAotI2RlZmluZSBGWFNZU193Y3NjbXAJd2NzY21wCi0jZGVmaW5lIEZYU1lTX3djc2Nocgl3Y3NjaHIKLSNkZWZpbmUgRlhTWVNfd2Nzc3RyCXdjc3N0cgotI2RlZmluZSBGWFNZU193Y3NuY21wCXdjc25jbXAKLSNkZWZpbmUgRlhTWVNfdnN3cHJpbnRmCXZzd3ByaW50ZgotI2RlZmluZSBGWFNZU19tYnN0b3djcwltYnN0b3djcwotI2RlZmluZSBGWFNZU193Y3N0b21icwl3Y3N0b21icwotI2RlZmluZSBGWFNZU19tZW1jbXAJbWVtY21wCi0jZGVmaW5lIEZYU1lTX21lbWNweQltZW1jcHkKLSNkZWZpbmUgRlhTWVNfbWVtbW92ZQltZW1tb3ZlCi0jZGVmaW5lIEZYU1lTX21lbXNldAltZW1zZXQKLSNkZWZpbmUgRlhTWVNfbWVtY2hyCW1lbWNocgotI2RlZmluZSBGWFNZU19xc29ydAkJcXNvcnQKLSNkZWZpbmUgRlhTWVNfYnNlYXJjaAlic2VhcmNoCisjZGVmaW5lIEZYU1lTX3djc2NtcCB3Y3NjbXAKKyNkZWZpbmUgRlhTWVNfd2NzY2hyIHdjc2NocgorI2RlZmluZSBGWFNZU193Y3NzdHIgd2Nzc3RyCisjZGVmaW5lIEZYU1lTX3djc25jbXAgd2NzbmNtcAorI2RlZmluZSBGWFNZU192c3dwcmludGYgdnN3cHJpbnRmCisjZGVmaW5lIEZYU1lTX21ic3Rvd2NzIG1ic3Rvd2NzCisjZGVmaW5lIEZYU1lTX3djc3RvbWJzIHdjc3RvbWJzCisjZGVmaW5lIEZYU1lTX21lbWNtcCBtZW1jbXAKKyNkZWZpbmUgRlhTWVNfbWVtY3B5IG1lbWNweQorI2RlZmluZSBGWFNZU19tZW1tb3ZlIG1lbW1vdmUKKyNkZWZpbmUgRlhTWVNfbWVtc2V0IG1lbXNldAorI2RlZmluZSBGWFNZU19tZW1jaHIgbWVtY2hyCisjZGVmaW5lIEZYU1lTX3Fzb3J0IHFzb3J0CisjZGVmaW5lIEZYU1lTX2JzZWFyY2ggYnNlYXJjaAorCiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwogI2RlZmluZSBGWFNZU19HZXRBQ1AgR2V0QUNQCiAjZGVmaW5lIEZYU1lTX2l0b2EgX2l0b2EKQEAgLTIyNyw4ICsxOTEsMTAgQEAKICNkZWZpbmUgRlhTWVNfc3RyaWNtcCBfc3RyaWNtcAogI2lmZGVmIF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVECiAjZGVmaW5lIEZYU1lTX3djc2ljbXAoc3RyMSwgc3RyMikgX3djc2ljbXAoKHdjaGFyX3QqKShzdHIxKSwgKHdjaGFyX3QqKShzdHIyKSkKLSNkZWZpbmUgRlhTWVNfV2lkZUNoYXJUb011bHRpQnl0ZShwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgpIFdpZGVDaGFyVG9NdWx0aUJ5dGUocDEsIHAyLCAoY29uc3Qgd2NoYXJfdCopKHAzKSwgcDQsIHA1LCBwNiwgcDcsIHA4KQotI2RlZmluZSBGWFNZU19NdWx0aUJ5dGVUb1dpZGVDaGFyKHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYpIE11bHRpQnl0ZVRvV2lkZUNoYXIocDEsIHAyLCBwMywgcDQsICh3Y2hhcl90KikocDUpLCBwNikKKyNkZWZpbmUgRlhTWVNfV2lkZUNoYXJUb011bHRpQnl0ZShwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgpIFwKKyAgV2lkZUNoYXJUb011bHRpQnl0ZShwMSwgcDIsIChjb25zdCB3Y2hhcl90KikocDMpLCBwNCwgcDUsIHA2LCBwNywgcDgpCisjZGVmaW5lIEZYU1lTX011bHRpQnl0ZVRvV2lkZUNoYXIocDEsIHAyLCBwMywgcDQsIHA1LCBwNikgXAorICBNdWx0aUJ5dGVUb1dpZGVDaGFyKHAxLCBwMiwgcDMsIHA0LCAod2NoYXJfdCopKHA1KSwgcDYpCiAjZGVmaW5lIEZYU1lTX3djc2x3cihzdHIpIF93Y3Nsd3IoKHdjaGFyX3QqKShzdHIpKQogI2RlZmluZSBGWFNZU193Y3N1cHIoc3RyKSBfd2NzdXByKCh3Y2hhcl90Kikoc3RyKSkKICNlbHNlCkBAIC0yNDEsODQgKzIwNyw3NiBAQAogI2RlZmluZSBGWFNZU19HZXRGdWxsUGF0aE5hbWUgR2V0RnVsbFBhdGhOYW1lCiAjZGVmaW5lIEZYU1lTX0dldE1vZHVsZUZpbGVOYW1lIEdldE1vZHVsZUZpbGVOYW1lCiAjZWxzZQotaW50CQkJRlhTWVNfR2V0QUNQKHZvaWQpOwotY2hhcioJCUZYU1lTX2l0b2EoaW50IHZhbHVlLCBjaGFyKiBzdHJpbmcsIGludCByYWRpeCk7Ci1pbnQJCQlGWFNZU19XaWRlQ2hhclRvTXVsdGlCeXRlKEZYX0RXT1JEIGNvZGVwYWdlLCBGWF9EV09SRCBkd0ZsYWdzLCBjb25zdCB3Y2hhcl90KiB3c3RyLCBpbnQgd2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmLCBpbnQgYnVmbGVuLCBjb25zdCBjaGFyKiBkZWZhdWx0X3N0ciwgaW50KiBwVXNlRGVmYXVsdCk7Ci1pbnQJCQlGWFNZU19NdWx0aUJ5dGVUb1dpZGVDaGFyKEZYX0RXT1JEIGNvZGVwYWdlLCBGWF9EV09SRCBkd0ZsYWdzLCBjb25zdCBjaGFyKiBic3RyLCBpbnQgYmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCogYnVmLCBpbnQgYnVmbGVuKTsKLUZYX0RXT1JECUZYU1lTX0dldEZ1bGxQYXRoTmFtZShjb25zdCBjaGFyKiBmaWxlbmFtZSwgRlhfRFdPUkQgYnVmbGVuLCBjaGFyKiBidWYsIGNoYXIqKiBmaWxlcGFydCk7Ci1GWF9EV09SRAlGWFNZU19HZXRNb2R1bGVGaWxlTmFtZSh2b2lkKiBoTW9kdWxlLCBjaGFyKiBidWYsIEZYX0RXT1JEIGJ1ZnNpemUpOwotY2hhcioJCUZYU1lTX3N0cmx3cihjaGFyKiBzdHIpOwotY2hhcioJCUZYU1lTX3N0cnVwcihjaGFyKiBzdHIpOwotaW50CQkJRlhTWVNfc3RyaWNtcChjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOwotaW50CQkJRlhTWVNfd2NzaWNtcChjb25zdCB3Y2hhcl90ICpzdHJpbmcxLCBjb25zdCB3Y2hhcl90ICpzdHJpbmcyKTsKLXdjaGFyX3QqCUZYU1lTX3djc2x3cih3Y2hhcl90KiBzdHIpOwotd2NoYXJfdCoJRlhTWVNfd2NzdXByKHdjaGFyX3QqIHN0cik7Ci0jZW5kaWYKLSNkZWZpbmUgRlhTWVNfbWVtY3B5MzIJCUZYU1lTX21lbWNweQotI2RlZmluZSBGWFNZU19tZW1jbXAzMgkJRlhTWVNfbWVtY21wCi0jZGVmaW5lIEZYU1lTX21lbXNldDMyCQlGWFNZU19tZW1zZXQKLSNkZWZpbmUgRlhTWVNfbWVtc2V0OAkJRlhTWVNfbWVtc2V0Ci0jZGVmaW5lIEZYU1lTX21lbW1vdmUzMgkJRlhTWVNfbWVtbW92ZQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLSNpbmNsdWRlIDxtYXRoLmg+CitpbnQgRlhTWVNfR2V0QUNQKHZvaWQpOworY2hhciogRlhTWVNfaXRvYShpbnQgdmFsdWUsIGNoYXIqIHN0cmluZywgaW50IHJhZGl4KTsKK2ludCBGWFNZU19XaWRlQ2hhclRvTXVsdGlCeXRlKEZYX0RXT1JEIGNvZGVwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHdzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZWZhdWx0X3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcFVzZURlZmF1bHQpOworaW50IEZYU1lTX011bHRpQnl0ZVRvV2lkZUNoYXIoRlhfRFdPUkQgY29kZXBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCogYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zmxlbik7CitGWF9EV09SRCBGWFNZU19HZXRGdWxsUGF0aE5hbWUoY29uc3QgY2hhciogZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgYnVmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiogZmlsZXBhcnQpOworRlhfRFdPUkQgRlhTWVNfR2V0TW9kdWxlRmlsZU5hbWUodm9pZCogaE1vZHVsZSwgY2hhciogYnVmLCBGWF9EV09SRCBidWZzaXplKTsKK2NoYXIqIEZYU1lTX3N0cmx3cihjaGFyKiBzdHIpOworY2hhciogRlhTWVNfc3RydXByKGNoYXIqIHN0cik7CitpbnQgRlhTWVNfc3RyaWNtcChjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworaW50IEZYU1lTX3djc2ljbXAoY29uc3Qgd2NoYXJfdCogc3RyaW5nMSwgY29uc3Qgd2NoYXJfdCogc3RyaW5nMik7Cit3Y2hhcl90KiBGWFNZU193Y3Nsd3Iod2NoYXJfdCogc3RyKTsKK3djaGFyX3QqIEZYU1lTX3djc3Vwcih3Y2hhcl90KiBzdHIpOworI2VuZGlmICAvLyBfRlhNX1BMQVRGT1JNID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKwogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSNkZWZpbmUgRlhTWVNfcG93KGEsIGIpCQkoRlhfRkxPQVQpcG93ZihhLCBiKQorI2RlZmluZSBGWFNZU19wb3coYSwgYikgKEZYX0ZMT0FUKSBwb3dmKGEsIGIpCiAjZWxzZQotI2RlZmluZSBGWFNZU19wb3coYSwgYikJCShGWF9GTE9BVClwb3coYSwgYikKKyNkZWZpbmUgRlhTWVNfcG93KGEsIGIpIChGWF9GTE9BVCkgcG93KGEsIGIpCiAjZW5kaWYKLSNkZWZpbmUgRlhTWVNfc3FydChhKQkJKEZYX0ZMT0FUKXNxcnQoYSkKLSNkZWZpbmUgRlhTWVNfZmFicyhhKQkJKEZYX0ZMT0FUKWZhYnMoYSkKLSNkZWZpbmUgRlhTWVNfYXRhbjIoYSwgYikJKEZYX0ZMT0FUKWF0YW4yKGEsIGIpCi0jZGVmaW5lIEZYU1lTX2NlaWwoYSkJCShGWF9GTE9BVCljZWlsKGEpCi0jZGVmaW5lIEZYU1lTX2Zsb29yKGEpCQkoRlhfRkxPQVQpZmxvb3IoYSkKLSNkZWZpbmUgRlhTWVNfY29zKGEpCQkoRlhfRkxPQVQpY29zKGEpCi0jZGVmaW5lIEZYU1lTX2Fjb3MoYSkJCShGWF9GTE9BVClhY29zKGEpCi0jZGVmaW5lIEZYU1lTX3NpbihhKQkJKEZYX0ZMT0FUKXNpbihhKQotI2RlZmluZSBGWFNZU19sb2coYSkJCShGWF9GTE9BVClsb2coYSkKLSNkZWZpbmUgRlhTWVNfbG9nMTAoYSkJCShGWF9GTE9BVClsb2cxMChhKQotI2RlZmluZSBGWFNZU19mbW9kKGEsIGIpCShGWF9GTE9BVClmbW9kKGEsIGIpCi0jZGVmaW5lIEZYU1lTX2FicwkJCWFicwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotI2RlZmluZSBfRlhfTFNCX0ZJUlNUXwotI2RlZmluZSBGWERXT1JEX0ZST01fTFNCRklSU1QoaSkJKGkpCi0jZGVmaW5lIEZYRFdPUkRfRlJPTV9NU0JGSVJTVChpKQkoKChGWF9CWVRFKShpKSA8PCAyNCkgfCAoKEZYX0JZVEUpKChpKSA+PiA4KSA8PCAxNikgfCAoKEZYX0JZVEUpKChpKSA+PiAxNikgPDwgOCkgfCAoRlhfQllURSkoKGkpID4+IDI0KSkKLSNkZWZpbmUgRlhEV09SRF9HRVRfTFNCRklSU1QocCkJCSgoKChGWF9MUEJZVEUpKHApKVszXSA8PCAyNCkgfCAoKChGWF9MUEJZVEUpKHApKVsyXSA8PCAxNikgfCAoKChGWF9MUEJZVEUpKHApKVsxXSA8PCA4KSB8ICgoKEZYX0xQQllURSkocCkpWzBdKSkKLSNkZWZpbmUgRlhEV09SRF9HRVRfTVNCRklSU1QocCkgKCgoKEZYX0xQQllURSkocCkpWzBdIDw8IDI0KSB8ICgoKEZYX0xQQllURSkocCkpWzFdIDw8IDE2KSB8ICgoKEZYX0xQQllURSkocCkpWzJdIDw8IDgpIHwgKCgoRlhfTFBCWVRFKShwKSlbM10pKQotI2RlZmluZSBGWFNZU19ISUJZVEUod29yZCkJKChGWF9CWVRFKSgod29yZCkgPj4gOCkpCi0jZGVmaW5lIEZYU1lTX0xPQllURSh3b3JkKQkoKEZYX0JZVEUpKHdvcmQpKQotI2RlZmluZSBGWFNZU19ISVdPUkQoZHdvcmQpCSgoRlhfV09SRCkoKGR3b3JkKSA+PiAxNikpCi0jZGVmaW5lIEZYU1lTX0xPV09SRChkd29yZCkJKChGWF9XT1JEKShkd29yZCkpCi1GWF9JTlQzMglGWFNZU19hdG9pKEZYX0xQQ1NUUiBzdHIpOwotRlhfSU5UMzIJRlhTWVNfd3RvaShGWF9MUENXU1RSIHN0cik7Ci1GWF9JTlQ2NAlGWFNZU19hdG9pNjQoRlhfTFBDU1RSIHN0cik7Ci1GWF9JTlQ2NAlGWFNZU193dG9pNjQoRlhfTFBDV1NUUiBzdHIpOwotRlhfTFBDU1RSCUZYU1lTX2k2NHRvYShGWF9JTlQ2NCB2YWx1ZSwgRlhfTFBTVFIgc3RyLCBpbnQgcmFkaXgpOwotRlhfTFBDV1NUUglGWFNZU19pNjR0b3coRlhfSU5UNjQgdmFsdWUsIEZYX0xQV1NUUiBzdHIsIGludCByYWRpeCk7Ci1pbnQJCQlGWFNZU19yb3VuZChGWF9GTE9BVCBmKTsKLSNkZWZpbmUJCUZYU1lTX011bChhLCBiKSAoKGEpICogKGIpKQotI2RlZmluZQkJRlhTWVNfRGl2KGEsIGIpICgoYSkgLyAoYikpCi0jZGVmaW5lCQlGWFNZU19NdWxEaXYoYSwgYiwgYykgKChhKSAqIChiKSAvIChjKSkKLSNkZWZpbmUJCUZYU1lTX3NxcnQyKGEsIGIpIChGWF9GTE9BVClGWFNZU19zcXJ0KChhKSooYSkgKyAoYikqKGIpKQorI2RlZmluZSBGWFNZU19zcXJ0KGEpIChGWF9GTE9BVCkgc3FydChhKQorI2RlZmluZSBGWFNZU19mYWJzKGEpIChGWF9GTE9BVCkgZmFicyhhKQorI2RlZmluZSBGWFNZU19hdGFuMihhLCBiKSAoRlhfRkxPQVQpIGF0YW4yKGEsIGIpCisjZGVmaW5lIEZYU1lTX2NlaWwoYSkgKEZYX0ZMT0FUKSBjZWlsKGEpCisjZGVmaW5lIEZYU1lTX2Zsb29yKGEpIChGWF9GTE9BVCkgZmxvb3IoYSkKKyNkZWZpbmUgRlhTWVNfY29zKGEpIChGWF9GTE9BVCkgY29zKGEpCisjZGVmaW5lIEZYU1lTX2Fjb3MoYSkgKEZYX0ZMT0FUKSBhY29zKGEpCisjZGVmaW5lIEZYU1lTX3NpbihhKSAoRlhfRkxPQVQpIHNpbihhKQorI2RlZmluZSBGWFNZU19sb2coYSkgKEZYX0ZMT0FUKSBsb2coYSkKKyNkZWZpbmUgRlhTWVNfbG9nMTAoYSkgKEZYX0ZMT0FUKSBsb2cxMChhKQorI2RlZmluZSBGWFNZU19mbW9kKGEsIGIpIChGWF9GTE9BVCkgZm1vZChhLCBiKQorI2RlZmluZSBGWFNZU19hYnMgYWJzCisjZGVmaW5lIEZYRFdPUkRfRlJPTV9MU0JGSVJTVChpKSAoaSkKKyNkZWZpbmUgRlhEV09SRF9GUk9NX01TQkZJUlNUKGkpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCh1aW50OF90KShpKSA8PCAyNCkgfCAoKHVpbnQ4X3QpKChpKSA+PiA4KSA8PCAxNikgfCBcCisgICAoKHVpbnQ4X3QpKChpKSA+PiAxNikgPDwgOCkgfCAodWludDhfdCkoKGkpID4+IDI0KSkKKyNkZWZpbmUgRlhEV09SRF9HRVRfTFNCRklSU1QocCkgXAorICAoKHBbM10gPDwgMjQpIHwgKHBbMl0gPDwgMTYpIHwgKHBbMV0gPDwgOCkgfCAocFswXSkpCisjZGVmaW5lIEZYRFdPUkRfR0VUX01TQkZJUlNUKHApIFwKKyAgKChwWzBdIDw8IDI0KSB8IChwWzFdIDw8IDE2KSB8IChwWzJdIDw8IDgpIHwgKHBbM10pKQorI2RlZmluZSBGWFNZU19ISUJZVEUod29yZCkgKCh1aW50OF90KSgod29yZCkgPj4gOCkpCisjZGVmaW5lIEZYU1lTX0xPQllURSh3b3JkKSAoKHVpbnQ4X3QpKHdvcmQpKQorI2RlZmluZSBGWFNZU19ISVdPUkQoZHdvcmQpICgoRlhfV09SRCkoKGR3b3JkKSA+PiAxNikpCisjZGVmaW5lIEZYU1lTX0xPV09SRChkd29yZCkgKChGWF9XT1JEKShkd29yZCkpCitpbnQzMl90IEZYU1lTX2F0b2koY29uc3QgRlhfQ0hBUiogc3RyKTsKK2ludDMyX3QgRlhTWVNfd3RvaShjb25zdCBGWF9XQ0hBUiogc3RyKTsKK2ludDY0X3QgRlhTWVNfYXRvaTY0KGNvbnN0IEZYX0NIQVIqIHN0cik7CitpbnQ2NF90IEZYU1lTX3d0b2k2NChjb25zdCBGWF9XQ0hBUiogc3RyKTsKK2NvbnN0IEZYX0NIQVIqIEZYU1lTX2k2NHRvYShpbnQ2NF90IHZhbHVlLCBGWF9DSEFSKiBzdHIsIGludCByYWRpeCk7CitpbnQgRlhTWVNfcm91bmQoRlhfRkxPQVQgZik7CisjZGVmaW5lIEZYU1lTX011bChhLCBiKSAoKGEpICogKGIpKQorI2RlZmluZSBGWFNZU19EaXYoYSwgYikgKChhKSAvIChiKSkKKyNkZWZpbmUgRlhTWVNfTXVsRGl2KGEsIGIsIGMpICgoYSkgKiAoYikgLyAoYykpCisjZGVmaW5lIEZYU1lTX3NxcnQyKGEsIGIpIChGWF9GTE9BVCkgRlhTWVNfc3FydCgoYSkgKiAoYSkgKyAoYikgKiAoYikpCiAjaWZkZWYgX19jcGx1c3BsdXMKIH07Ci0KLSNpZiBkZWZpbmVkKF9fY2xhbmdfXykgfHwgX01TQ19WRVIgPj0gMTcwMAotI2RlZmluZSBGWF9GSU5BTCBmaW5hbAotI2RlZmluZSBGWF9PVkVSUklERSBvdmVycmlkZQotI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19jcGx1c3BsdXMgPj0gMjAxMTAzICYmIFwKLSAgICAgIChfX0dOVUNfXyAqIDEwMDAwICsgX19HTlVDX01JTk9SX18gKiAxMDApID49IDQwNzAwCi0jZGVmaW5lIEZYX0ZJTkFMIGZpbmFsCi0jZGVmaW5lIEZYX09WRVJSSURFIG92ZXJyaWRlCi0jZWxzZQotI2RlZmluZSBGWF9GSU5BTAotI2RlZmluZSBGWF9PVkVSUklERQotI2VuZGlmCiAjZW5kaWYKIAogLy8gVG8gcHJpbnQgYSBzaXplX3QgdmFsdWUgaW4gYSBwb3J0YWJsZSB3YXk6CkBAIC0zNTMsNyArMzExLDcgQEAKIAogLy8gUHJldmVudCBhIGZ1bmN0aW9uIGZyb20gZXZlciBiZWluZyBpbmxpbmVkLCB0eXBpY2FsbHkgYmVjYXVzZSB3ZSdkCiAvLyBsaWtlIGl0IHRvIGFwcGVhciBpbiBzdGFjayB0cmFjZXMuCi0jaWYgIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCiAjZGVmaW5lIE5FVkVSX0lOTElORSBfX2RlY2xzcGVjKG5vaW5saW5lKQogI2Vsc2UgIC8vIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KICNkZWZpbmUgTkVWRVJfSU5MSU5FIF9fYXR0cmlidXRlX18oKF9fbm9pbmxpbmVfXykpCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfdWNkLmggYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfdWNkLmgKaW5kZXggZTc2NGQ5Zi4uMjc4MTJkZSAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3VjZC5oCisrKyBiL2NvcmUvaW5jbHVkZS9meGNydC9meF91Y2QuaApAQCAtMSwxMDIgKzEsMTkxIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgQ09SRV9JTkNMVURFX0ZYQ1JUX0ZYX1VDRF9IXwogI2RlZmluZSBDT1JFX0lOQ0xVREVfRlhDUlRfRlhfVUNEX0hfCiAKLSNpbmNsdWRlICJmeF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJmeF9iYXNpYy5oIgogCi1lbnVtIEZYX0NIQVJCUkVBS1BST1AgewotICAgIEZYX0NCUF9PUCA9IDAsCi0gICAgRlhfQ0JQX0NMID0gMSwKLSAgICBGWF9DQlBfUVUgPSAyLAotICAgIEZYX0NCUF9HTCA9IDMsCi0gICAgRlhfQ0JQX05TID0gNCwKLSAgICBGWF9DQlBfRVggPSA1LAotICAgIEZYX0NCUF9TWSA9IDYsCi0gICAgRlhfQ0JQX0lTID0gNywKLSAgICBGWF9DQlBfUFIgPSA4LAotICAgIEZYX0NCUF9QTyA9IDksCi0gICAgRlhfQ0JQX05VID0gMTAsCi0gICAgRlhfQ0JQX0FMID0gMTEsCi0gICAgRlhfQ0JQX0lEID0gMTIsCi0gICAgRlhfQ0JQX0lOID0gMTMsCi0gICAgRlhfQ0JQX0hZID0gMTQsCi0gICAgRlhfQ0JQX0JBID0gMTUsCi0gICAgRlhfQ0JQX0JCID0gMTYsCi0gICAgRlhfQ0JQX0IyID0gMTcsCi0gICAgRlhfQ0JQX1pXID0gMTgsCi0gICAgRlhfQ0JQX0NNID0gMTksCi0gICAgRlhfQ0JQX1dKID0gMjAsCi0gICAgRlhfQ0JQX0gyID0gMjEsCi0gICAgRlhfQ0JQX0gzID0gMjIsCi0gICAgRlhfQ0JQX0pMID0gMjMsCi0gICAgRlhfQ0JQX0pWID0gMjQsCi0gICAgRlhfQ0JQX0pUID0gMjUsCi0KLSAgICBGWF9DQlBfQksgPSAyNiwKLSAgICBGWF9DQlBfQ1IgPSAyNywKLSAgICBGWF9DQlBfTEYgPSAyOCwKLSAgICBGWF9DQlBfTkwgPSAyOSwKLSAgICBGWF9DQlBfU0EgPSAzMCwKLSAgICBGWF9DQlBfU0cgPSAzMSwKLSAgICBGWF9DQlBfQ0IgPSAzMiwKLSAgICBGWF9DQlBfWFggPSAzMywKLSAgICBGWF9DQlBfQUkgPSAzNCwKLSAgICBGWF9DQlBfU1AgPSAzNSwKLSAgICBGWF9DQlBfVEIgPSAzNywKLSAgICBGWF9DQlBfTk9ORSA9IDM2LAotfTsKLSNkZWZpbmUgRlhfQklESUNMQVNTQklUUwkJNgotI2RlZmluZSBGWF9CSURJQ0xBU1NCSVRTTUFTSwkoMzEgPDwgRlhfQklESUNMQVNTQklUUykKKyNkZWZpbmUgRlhfQklESUNMQVNTQklUUyA2CisjZGVmaW5lIEZYX0JJRElDTEFTU0JJVFNNQVNLICgzMSA8PCBGWF9CSURJQ0xBU1NCSVRTKQogZW51bSBGWF9CSURJQ0xBU1MgewotICAgIEZYX0JJRElDTEFTU19PTgkJPSAwLAotICAgIEZYX0JJRElDTEFTU19MCQk9IDEsCi0gICAgRlhfQklESUNMQVNTX1IJCT0gMiwKLSAgICBGWF9CSURJQ0xBU1NfQU4JCT0gMywKLSAgICBGWF9CSURJQ0xBU1NfRU4JCT0gNCwKLSAgICBGWF9CSURJQ0xBU1NfQUwJCT0gNSwKLSAgICBGWF9CSURJQ0xBU1NfTlNNCT0gNiwKLSAgICBGWF9CSURJQ0xBU1NfQ1MJCT0gNywKLSAgICBGWF9CSURJQ0xBU1NfRVMJCT0gOCwKLSAgICBGWF9CSURJQ0xBU1NfRVQJCT0gOSwKLSAgICBGWF9CSURJQ0xBU1NfQk4JCT0gMTAsCi0gICAgRlhfQklESUNMQVNTX1MJCT0gMTEsCi0gICAgRlhfQklESUNMQVNTX1dTCQk9IDEyLAotICAgIEZYX0JJRElDTEFTU19CCQk9IDEzLAotICAgIEZYX0JJRElDTEFTU19STE8JPSAxNCwKLSAgICBGWF9CSURJQ0xBU1NfUkxFCT0gMTUsCi0gICAgRlhfQklESUNMQVNTX0xSTwk9IDE2LAotICAgIEZYX0JJRElDTEFTU19MUkUJPSAxNywKLSAgICBGWF9CSURJQ0xBU1NfUERGCT0gMTgsCi0gICAgRlhfQklESUNMQVNTX04JCT0gRlhfQklESUNMQVNTX09OLAorICBGWF9CSURJQ0xBU1NfT04gPSAwLCAgICAvLyBPdGhlciBOZXV0cmFsCisgIEZYX0JJRElDTEFTU19MID0gMSwgICAgIC8vIExlZnQgTGV0dGVyCisgIEZYX0JJRElDTEFTU19SID0gMiwgICAgIC8vIFJpZ2h0IExldHRlcgorICBGWF9CSURJQ0xBU1NfQU4gPSAzLCAgICAvLyBBcmFiaWMgTnVtYmVyCisgIEZYX0JJRElDTEFTU19FTiA9IDQsICAgIC8vIEV1cm9wZWFuIE51bWJlcgorICBGWF9CSURJQ0xBU1NfQUwgPSA1LCAgICAvLyBBcmFiaWMgTGV0dGVyCisgIEZYX0JJRElDTEFTU19OU00gPSA2LCAgIC8vIE5vbi1zcGFjaW5nIE1hcmsKKyAgRlhfQklESUNMQVNTX0NTID0gNywgICAgLy8gQ29tbW9uIE51bWJlciBTZXBhcmF0b3IKKyAgRlhfQklESUNMQVNTX0VTID0gOCwgICAgLy8gRXVyb3BlYW4gU2VwYXJhdG9yCisgIEZYX0JJRElDTEFTU19FVCA9IDksICAgIC8vIEV1cm9wZWFuIE51bWJlciBUZXJtaW5hdG9yCisgIEZYX0JJRElDTEFTU19CTiA9IDEwLCAgIC8vIEJvdW5kYXJ5IE5ldXRyYWwKKyAgRlhfQklESUNMQVNTX1MgPSAxMSwgICAgLy8gU2VnbWVudCBTZXBhcmF0b3IKKyAgRlhfQklESUNMQVNTX1dTID0gMTIsICAgLy8gV2hpdGVzcGFjZQorICBGWF9CSURJQ0xBU1NfQiA9IDEzLCAgICAvLyBQYXJhZ3JhcGggU2VwYXJhdG9yCisgIEZYX0JJRElDTEFTU19STE8gPSAxNCwgIC8vIFJpZ2h0LXRvLUxlZnQgT3ZlcnJpZGUKKyAgRlhfQklESUNMQVNTX1JMRSA9IDE1LCAgLy8gUmlnaHQtdG8tTGVmdCBFbWJlZGRpbmcKKyAgRlhfQklESUNMQVNTX0xSTyA9IDE2LCAgLy8gTGVmdC10by1SaWdodCBPdmVycmlkZQorICBGWF9CSURJQ0xBU1NfTFJFID0gMTcsICAvLyBMZWZ0LXRvLVJpZ2h0IEVtYmVkZGluZworICBGWF9CSURJQ0xBU1NfUERGID0gMTgsICAvLyBQb3AgRGlyZWN0aW9uYWwgRm9ybWF0CisgIEZYX0JJRElDTEFTU19OID0gRlhfQklESUNMQVNTX09OLAogfTsKLSNkZWZpbmUgRlhfQ0hBUlRZUEVCSVRTCQkxMQotI2RlZmluZSBGWF9DSEFSVFlQRUJJVFNNQVNLCSgxNSA8PCBGWF9DSEFSVFlQRUJJVFMpCi1lbnVtIEZYX0NIQVJUWVBFIHsKLSAgICBGWF9DSEFSVFlQRV9Vbmtub3duCQkJCT0gMCwKLSAgICBGWF9DSEFSVFlQRV9UYWIJCQkJCT0gKDEgPDwgRlhfQ0hBUlRZUEVCSVRTKSwKLSAgICBGWF9DSEFSVFlQRV9TcGFjZQkJCQk9ICgyIDw8IEZYX0NIQVJUWVBFQklUUyksCi0gICAgRlhfQ0hBUlRZUEVfQ29udHJvbAkJCQk9ICgzIDw8IEZYX0NIQVJUWVBFQklUUyksCi0gICAgRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24JCQk9ICg0IDw8IEZYX0NIQVJUWVBFQklUUyksCi0gICAgRlhfQ0hBUlRZUEVfTnVtZXJpYwkJCQk9ICg1IDw8IEZYX0NIQVJUWVBFQklUUyksCi0gICAgRlhfQ0hBUlRZUEVfTm9ybWFsCQkJCT0gKDYgPDwgRlhfQ0hBUlRZUEVCSVRTKSwKLSAgICBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmCQkJPSAoNyA8PCBGWF9DSEFSVFlQRUJJVFMpLAotICAgIEZYX0NIQVJUWVBFX0FyYWJpY1NwZWNpYWwJCT0gKDggPDwgRlhfQ0hBUlRZUEVCSVRTKSwKLSAgICBGWF9DSEFSVFlQRV9BcmFiaWNEaXN0b3J0aW9uCT0gKDkgPDwgRlhfQ0hBUlRZUEVCSVRTKSwKLSAgICBGWF9DSEFSVFlQRV9BcmFiaWNOb3JtYWwJCT0gKDEwIDw8IEZYX0NIQVJUWVBFQklUUyksCi0gICAgRlhfQ0hBUlRZUEVfQXJhYmljRm9ybQkJCT0gKDExIDw8IEZYX0NIQVJUWVBFQklUUyksCi0gICAgRlhfQ0hBUlRZUEVfQXJhYmljCQkJCT0gKDEyIDw8IEZYX0NIQVJUWVBFQklUUyksCi19OworCitleHRlcm4gY29uc3QgRlhfRFdPUkQga1RleHRMYXlvdXRDb2RlUHJvcGVydGllc1tdOworZXh0ZXJuIGNvbnN0IHNpemVfdCBrVGV4dExheW91dENvZGVQcm9wZXJ0aWVzU2l6ZTsKKworZXh0ZXJuIGNvbnN0IEZYX1dDSEFSIGtGWFRleHRMYXlvdXRWZXJ0aWNhbE1pcnJvcltdOworZXh0ZXJuIGNvbnN0IHNpemVfdCBrRlhUZXh0TGF5b3V0VmVydGljYWxNaXJyb3JTaXplOworCitleHRlcm4gY29uc3QgRlhfV0NIQVIga0ZYVGV4dExheW91dEJpZGlNaXJyb3JbXTsKK2V4dGVybiBjb25zdCBzaXplX3Qga0ZYVGV4dExheW91dEJpZGlNaXJyb3JTaXplOworCiBGWF9EV09SRCBGWF9HZXRVbmljb2RlUHJvcGVydGllcyhGWF9XQ0hBUiB3Y2gpOwotRlhfQk9PTAlGWF9Jc0N0cmxDb2RlKEZYX1dDSEFSIGNoKTsKLUZYX0JPT0wJRlhfSXNSb3RhdGlvbkNvZGUoRlhfV0NIQVIgY2gpOwotRlhfQk9PTCBGWF9Jc0NvbWJpbmF0aW9uQ2hhcihGWF9XQ0hBUiB3Y2gpOwotRlhfQk9PTAlGWF9Jc0JpZGlDaGFyKEZYX1dDSEFSIHdjaCk7CiBGWF9XQ0hBUiBGWF9HZXRNaXJyb3JDaGFyKEZYX1dDSEFSIHdjaCwgRlhfQk9PTCBiUlRMLCBGWF9CT09MIGJWZXJ0aWNhbCk7Ci1GWF9XQ0hBUiBGWF9HZXRNaXJyb3JDaGFyKEZYX1dDSEFSIHdjaCwgRlhfRFdPUkQgZHdQcm9wcywgRlhfQk9PTCBiUlRMLCBGWF9CT09MIGJWZXJ0aWNhbCk7CisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorZW51bSBGWF9DSEFSQlJFQUtQUk9QIHsKKyAgRlhfQ0JQX09QID0gMCwKKyAgRlhfQ0JQX0NMID0gMSwKKyAgRlhfQ0JQX1FVID0gMiwKKyAgRlhfQ0JQX0dMID0gMywKKyAgRlhfQ0JQX05TID0gNCwKKyAgRlhfQ0JQX0VYID0gNSwKKyAgRlhfQ0JQX1NZID0gNiwKKyAgRlhfQ0JQX0lTID0gNywKKyAgRlhfQ0JQX1BSID0gOCwKKyAgRlhfQ0JQX1BPID0gOSwKKyAgRlhfQ0JQX05VID0gMTAsCisgIEZYX0NCUF9BTCA9IDExLAorICBGWF9DQlBfSUQgPSAxMiwKKyAgRlhfQ0JQX0lOID0gMTMsCisgIEZYX0NCUF9IWSA9IDE0LAorICBGWF9DQlBfQkEgPSAxNSwKKyAgRlhfQ0JQX0JCID0gMTYsCisgIEZYX0NCUF9CMiA9IDE3LAorICBGWF9DQlBfWlcgPSAxOCwKKyAgRlhfQ0JQX0NNID0gMTksCisgIEZYX0NCUF9XSiA9IDIwLAorICBGWF9DQlBfSDIgPSAyMSwKKyAgRlhfQ0JQX0gzID0gMjIsCisgIEZYX0NCUF9KTCA9IDIzLAorICBGWF9DQlBfSlYgPSAyNCwKKyAgRlhfQ0JQX0pUID0gMjUsCisKKyAgRlhfQ0JQX0JLID0gMjYsCisgIEZYX0NCUF9DUiA9IDI3LAorICBGWF9DQlBfTEYgPSAyOCwKKyAgRlhfQ0JQX05MID0gMjksCisgIEZYX0NCUF9TQSA9IDMwLAorICBGWF9DQlBfU0cgPSAzMSwKKyAgRlhfQ0JQX0NCID0gMzIsCisgIEZYX0NCUF9YWCA9IDMzLAorICBGWF9DQlBfQUkgPSAzNCwKKyAgRlhfQ0JQX1NQID0gMzUsCisgIEZYX0NCUF9UQiA9IDM3LAorICBGWF9DQlBfTk9ORSA9IDM2LAorfTsKKworI2RlZmluZSBGWF9DSEFSVFlQRUJJVFMgMTEKKyNkZWZpbmUgRlhfQ0hBUlRZUEVCSVRTTUFTSyAoMTUgPDwgRlhfQ0hBUlRZUEVCSVRTKQorZW51bSBGWF9DSEFSVFlQRSB7CisgIEZYX0NIQVJUWVBFX1Vua25vd24gPSAwLAorICBGWF9DSEFSVFlQRV9UYWIgPSAoMSA8PCBGWF9DSEFSVFlQRUJJVFMpLAorICBGWF9DSEFSVFlQRV9TcGFjZSA9ICgyIDw8IEZYX0NIQVJUWVBFQklUUyksCisgIEZYX0NIQVJUWVBFX0NvbnRyb2wgPSAoMyA8PCBGWF9DSEFSVFlQRUJJVFMpLAorICBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbiA9ICg0IDw8IEZYX0NIQVJUWVBFQklUUyksCisgIEZYX0NIQVJUWVBFX051bWVyaWMgPSAoNSA8PCBGWF9DSEFSVFlQRUJJVFMpLAorICBGWF9DSEFSVFlQRV9Ob3JtYWwgPSAoNiA8PCBGWF9DSEFSVFlQRUJJVFMpLAorICBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmID0gKDcgPDwgRlhfQ0hBUlRZUEVCSVRTKSwKKyAgRlhfQ0hBUlRZUEVfQXJhYmljU3BlY2lhbCA9ICg4IDw8IEZYX0NIQVJUWVBFQklUUyksCisgIEZYX0NIQVJUWVBFX0FyYWJpY0Rpc3RvcnRpb24gPSAoOSA8PCBGWF9DSEFSVFlQRUJJVFMpLAorICBGWF9DSEFSVFlQRV9BcmFiaWNOb3JtYWwgPSAoMTAgPDwgRlhfQ0hBUlRZUEVCSVRTKSwKKyAgRlhfQ0hBUlRZUEVfQXJhYmljRm9ybSA9ICgxMSA8PCBGWF9DSEFSVFlQRUJJVFMpLAorICBGWF9DSEFSVFlQRV9BcmFiaWMgPSAoMTIgPDwgRlhfQ0hBUlRZUEVCSVRTKSwKK307CisKK0ZYX0JPT0wgRlhfSXNDdHJsQ29kZShGWF9XQ0hBUiBjaCk7CitGWF9XQ0hBUiBGWF9HZXRNaXJyb3JDaGFyKEZYX1dDSEFSIHdjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUlRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJWZXJ0aWNhbCk7CitjbGFzcyBDRlhfQ2hhciB7CisgcHVibGljOgorICBDRlhfQ2hhcigpCisgICAgICA6IG1fd0NoYXJDb2RlKDApLAorICAgICAgICBtX25CcmVha1R5cGUoMCksCisgICAgICAgIG1fblJvdGF0aW9uKDApLAorICAgICAgICBtX2R3Q2hhclByb3BzKDApLAorICAgICAgICBtX2R3Q2hhclN0eWxlcygwKSwKKyAgICAgICAgbV9pQ2hhcldpZHRoKDApLAorICAgICAgICBtX2lIb3Jpem9udGFsU2NhbGUoMTAwKSwKKyAgICAgICAgbV9pVmVydGlhbFNjYWxlKDEwMCkge30KKyAgQ0ZYX0NoYXIoRlhfV09SRCB3Q2hhckNvZGUsIEZYX0RXT1JEIGR3Q2hhclByb3BzKQorICAgICAgOiBtX3dDaGFyQ29kZSh3Q2hhckNvZGUpLAorICAgICAgICBtX25CcmVha1R5cGUoMCksCisgICAgICAgIG1fblJvdGF0aW9uKDApLAorICAgICAgICBtX2R3Q2hhclByb3BzKGR3Q2hhclByb3BzKSwKKyAgICAgICAgbV9kd0NoYXJTdHlsZXMoMCksCisgICAgICAgIG1faUNoYXJXaWR0aCgwKSwKKyAgICAgICAgbV9pSG9yaXpvbnRhbFNjYWxlKDEwMCksCisgICAgICAgIG1faVZlcnRpYWxTY2FsZSgxMDApIHt9CisgIEZYX0RXT1JEIEdldENoYXJUeXBlKCkgY29uc3QgeyByZXR1cm4gbV9kd0NoYXJQcm9wcyAmIEZYX0NIQVJUWVBFQklUU01BU0s7IH0KKyAgRlhfV09SRCBtX3dDaGFyQ29kZTsKKyAgdWludDhfdCBtX25CcmVha1R5cGU7CisgIGludDhfdCBtX25Sb3RhdGlvbjsKKyAgRlhfRFdPUkQgbV9kd0NoYXJQcm9wczsKKyAgRlhfRFdPUkQgbV9kd0NoYXJTdHlsZXM7CisgIGludDMyX3QgbV9pQ2hhcldpZHRoOworICBpbnQzMl90IG1faUhvcml6b250YWxTY2FsZTsKKyAgaW50MzJfdCBtX2lWZXJ0aWFsU2NhbGU7Cit9OwordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxDRlhfQ2hhcj4gQ0ZYX0NoYXJBcnJheTsKK2NsYXNzIENGWF9UeHRDaGFyIDogcHVibGljIENGWF9DaGFyIHsKKyBwdWJsaWM6CisgIENGWF9UeHRDaGFyKCkKKyAgICAgIDogQ0ZYX0NoYXIoKSwKKyAgICAgICAgbV9kd1N0YXR1cygwKSwKKyAgICAgICAgbV9pQmlkaUNsYXNzKDApLAorICAgICAgICBtX2lCaWRpTGV2ZWwoMCksCisgICAgICAgIG1faUJpZGlQb3MoMCksCisgICAgICAgIG1faUJpZGlPcmRlcigwKSwKKyAgICAgICAgbV9wVXNlckRhdGEoTlVMTCkge30KKyAgRlhfRFdPUkQgbV9kd1N0YXR1czsKKyAgaW50MTZfdCBtX2lCaWRpQ2xhc3M7CisgIGludDE2X3QgbV9pQmlkaUxldmVsOworICBpbnQxNl90IG1faUJpZGlQb3M7CisgIGludDE2X3QgbV9pQmlkaU9yZGVyOworICB2b2lkKiBtX3BVc2VyRGF0YTsKK307Cit0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPENGWF9UeHRDaGFyPiBDRlhfVHh0Q2hhckFycmF5OworY2xhc3MgQ0ZYX1JURkNoYXIgOiBwdWJsaWMgQ0ZYX0NoYXIgeworIHB1YmxpYzoKKyAgQ0ZYX1JURkNoYXIoKQorICAgICAgOiBDRlhfQ2hhcigpLAorICAgICAgICBtX2R3U3RhdHVzKDApLAorICAgICAgICBtX2lGb250U2l6ZSgwKSwKKyAgICAgICAgbV9pRm9udEhlaWdodCgwKSwKKyAgICAgICAgbV9pQmlkaUNsYXNzKDApLAorICAgICAgICBtX2lCaWRpTGV2ZWwoMCksCisgICAgICAgIG1faUJpZGlQb3MoMCksCisgICAgICAgIG1fZHdMYXlvdXRTdHlsZXMoMCksCisgICAgICAgIG1fZHdJZGVudGl0eSgwKSwKKyAgICAgICAgbV9wVXNlckRhdGEoTlVMTCkge30KKyAgRlhfRFdPUkQgbV9kd1N0YXR1czsKKyAgaW50MzJfdCBtX2lGb250U2l6ZTsKKyAgaW50MzJfdCBtX2lGb250SGVpZ2h0OworICBpbnQxNl90IG1faUJpZGlDbGFzczsKKyAgaW50MTZfdCBtX2lCaWRpTGV2ZWw7CisgIGludDE2X3QgbV9pQmlkaVBvczsKKyAgaW50MTZfdCBtX2lCaWRpT3JkZXI7CisgIEZYX0RXT1JEIG1fZHdMYXlvdXRTdHlsZXM7CisgIEZYX0RXT1JEIG1fZHdJZGVudGl0eTsKKyAgSUZYX1Vua25vd24qIG1fcFVzZXJEYXRhOworfTsKK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8Q0ZYX1JURkNoYXI+IENGWF9SVEZDaGFyQXJyYXk7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKICNlbmRpZiAgLy8gQ09SRV9JTkNMVURFX0ZYQ1JUX0ZYX1VDRF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3htbC5oIGIvY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3htbC5oCmluZGV4IGIyZmIyNGMuLmVhZjg3MmMgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGNydC9meF94bWwuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfeG1sLmgKQEAgLTksMTcyICs5LDE2OCBAQAogCiAjaW5jbHVkZSAiZnhfYmFzaWMuaCIKIAotY2xhc3MgQ1hNTF9BdHRySXRlbSAKLXsKLXB1YmxpYzoKLSAgICBDRlhfQnl0ZVN0cmluZwltX1FTcGFjZU5hbWU7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcJbV9BdHRyTmFtZTsKLSAgICBDRlhfV2lkZVN0cmluZwltX1ZhbHVlOworY2xhc3MgQ1hNTF9BdHRySXRlbSB7CisgcHVibGljOgorICBDRlhfQnl0ZVN0cmluZyBtX1FTcGFjZU5hbWU7CisgIENGWF9CeXRlU3RyaW5nIG1fQXR0ck5hbWU7CisgIENGWF9XaWRlU3RyaW5nIG1fVmFsdWU7CiB9OwotY2xhc3MgQ1hNTF9BdHRyTWFwIAotewotcHVibGljOgotICAgIENYTUxfQXR0ck1hcCgpCi0gICAgewotICAgICAgICBtX3BNYXAgPSBOVUxMOwotICAgIH0KLSAgICB+Q1hNTF9BdHRyTWFwKCkKLSAgICB7Ci0gICAgICAgIFJlbW92ZUFsbCgpOwotICAgIH0KLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZyoJTG9va3VwKEZYX0JTVFIgc3BhY2UsIEZYX0JTVFIgbmFtZSkgY29uc3Q7Ci0gICAgdm9pZAkJCQkJU2V0QXQoRlhfQlNUUiBzcGFjZSwgRlhfQlNUUiBuYW1lLCBGWF9XU1RSIHZhbHVlKTsKLSAgICB2b2lkCQkJCQlSZW1vdmVBdChGWF9CU1RSIHNwYWNlLCBGWF9CU1RSIG5hbWUpOwotICAgIHZvaWQJCQkJCVJlbW92ZUFsbCgpOwotICAgIGludAkJCQkJCUdldFNpemUoKSBjb25zdDsKLSAgICBDWE1MX0F0dHJJdGVtJgkJCUdldEF0KGludCBpbmRleCkgY29uc3Q7Ci0gICAgQ0ZYX09iamVjdEFycmF5PENYTUxfQXR0ckl0ZW0+KgltX3BNYXA7CitjbGFzcyBDWE1MX0F0dHJNYXAgeworIHB1YmxpYzoKKyAgQ1hNTF9BdHRyTWFwKCkgeyBtX3BNYXAgPSBOVUxMOyB9CisgIH5DWE1MX0F0dHJNYXAoKSB7IFJlbW92ZUFsbCgpOyB9CisgIGNvbnN0IENGWF9XaWRlU3RyaW5nKiBMb29rdXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIGNvbnN0OworICB2b2lkIFNldEF0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsCisgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAorICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgdmFsdWUpOworICB2b2lkIFJlbW92ZUF0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSk7CisgIHZvaWQgUmVtb3ZlQWxsKCk7CisgIGludCBHZXRTaXplKCkgY29uc3Q7CisgIENYTUxfQXR0ckl0ZW0mIEdldEF0KGludCBpbmRleCkgY29uc3Q7CisgIENGWF9PYmplY3RBcnJheTxDWE1MX0F0dHJJdGVtPiogbV9wTWFwOwogfTsKLWNsYXNzIENYTUxfQ29udGVudCAKLXsKLXB1YmxpYzoKLSAgICBDWE1MX0NvbnRlbnQoKSA6IG1fYkNEQVRBKEZBTFNFKSwgbV9Db250ZW50KCkge30KLSAgICB2b2lkCVNldChGWF9CT09MIGJDREFUQSwgRlhfV1NUUiBjb250ZW50KQotICAgIHsKLSAgICAgICAgbV9iQ0RBVEEgPSBiQ0RBVEE7Ci0gICAgICAgIG1fQ29udGVudCA9IGNvbnRlbnQ7Ci0gICAgfQotICAgIEZYX0JPT0wJCQltX2JDREFUQTsKLSAgICBDRlhfV2lkZVN0cmluZwltX0NvbnRlbnQ7CitjbGFzcyBDWE1MX0NvbnRlbnQgeworIHB1YmxpYzoKKyAgQ1hNTF9Db250ZW50KCkgOiBtX2JDREFUQShGQUxTRSksIG1fQ29udGVudCgpIHt9CisgIHZvaWQgU2V0KEZYX0JPT0wgYkNEQVRBLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnQpIHsKKyAgICBtX2JDREFUQSA9IGJDREFUQTsKKyAgICBtX0NvbnRlbnQgPSBjb250ZW50OworICB9CisgIEZYX0JPT0wgbV9iQ0RBVEE7CisgIENGWF9XaWRlU3RyaW5nIG1fQ29udGVudDsKIH07Ci1jbGFzcyBDWE1MX0VsZW1lbnQgCi17Ci1wdWJsaWM6Ci0gICAgc3RhdGljIENYTUxfRWxlbWVudCoJUGFyc2UoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHNpemUsIEZYX0JPT0wgYlNhdmVTcGFjZUNoYXJzID0gRkFMU0UsIEZYX0ZJTEVTSVpFKiBwUGFyc2VkU2l6ZSA9IE5VTEwpOwotICAgIHN0YXRpYyBDWE1MX0VsZW1lbnQqCVBhcnNlKElGWF9GaWxlUmVhZCAqcEZpbGUsIEZYX0JPT0wgYlNhdmVTcGFjZUNoYXJzID0gRkFMU0UsIEZYX0ZJTEVTSVpFKiBwUGFyc2VkU2l6ZSA9IE5VTEwpOwotICAgIHN0YXRpYyBDWE1MX0VsZW1lbnQqCVBhcnNlKElGWF9CdWZmZXJSZWFkICpwQnVmZmVyLCBGWF9CT09MIGJTYXZlU3BhY2VDaGFycyA9IEZBTFNFLCBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUgPSBOVUxMKTsKLSAgICBDWE1MX0VsZW1lbnQoRlhfQlNUUiBxU3BhY2UsIEZYX0JTVFIgdGFnTmFtZSk7Ci0gICAgQ1hNTF9FbGVtZW50KEZYX0JTVFIgcVRhZ05hbWUpOwotICAgIENYTUxfRWxlbWVudCgpOworY2xhc3MgQ1hNTF9FbGVtZW50IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBDWE1MX0VsZW1lbnQqIFBhcnNlKGNvbnN0IHZvaWQqIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlU3BhY2VDaGFycyA9IEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUgPSBOVUxMKTsKKyAgc3RhdGljIENYTUxfRWxlbWVudCogUGFyc2UoSUZYX0ZpbGVSZWFkKiBwRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVNwYWNlQ2hhcnMgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUqIHBQYXJzZWRTaXplID0gTlVMTCk7CisgIHN0YXRpYyBDWE1MX0VsZW1lbnQqIFBhcnNlKElGWF9CdWZmZXJSZWFkKiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlU3BhY2VDaGFycyA9IEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUgPSBOVUxMKTsKKyAgQ1hNTF9FbGVtZW50KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcVNwYWNlLCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRhZ05hbWUpOworICBDWE1MX0VsZW1lbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBxVGFnTmFtZSk7CisgIENYTUxfRWxlbWVudCgpOwogCi0gICAgfkNYTUxfRWxlbWVudCgpOworICB+Q1hNTF9FbGVtZW50KCk7CiAKLSAgICB2b2lkCUVtcHR5KCk7CisgIHZvaWQgRW1wdHkoKTsKIAorICBDRlhfQnl0ZVN0cmluZyBHZXRUYWdOYW1lKEZYX0JPT0wgYlF1YWxpZmllZCA9IEZBTFNFKSBjb25zdDsKIAorICBDRlhfQnl0ZVN0cmluZyBHZXROYW1lc3BhY2UoRlhfQk9PTCBiUXVhbGlmaWVkID0gRkFMU0UpIGNvbnN0OwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCQlHZXRUYWdOYW1lKEZYX0JPT0wgYlF1YWxpZmllZCA9IEZBTFNFKSBjb25zdDsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0TmFtZXNwYWNlVVJJKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcU5hbWUpIGNvbnN0OwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCQlHZXROYW1lc3BhY2UoRlhfQk9PTCBiUXVhbGlmaWVkID0gRkFMU0UpIGNvbnN0OworICBDWE1MX0VsZW1lbnQqIEdldFBhcmVudCgpIGNvbnN0IHsgcmV0dXJuIG1fcFBhcmVudDsgfQogCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCQlHZXROYW1lc3BhY2VVUkkoRlhfQlNUUiBxTmFtZSkgY29uc3Q7CisgIEZYX0RXT1JEIENvdW50QXR0cnMoKSBjb25zdCB7IHJldHVybiBtX0F0dHJNYXAuR2V0U2l6ZSgpOyB9CiAKLSAgICBDWE1MX0VsZW1lbnQqCQkJR2V0UGFyZW50KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BQYXJlbnQ7Ci0gICAgfQorICB2b2lkIEdldEF0dHJCeUluZGV4KGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlKSBjb25zdDsKIAotICAgIEZYX0RXT1JECQkJCUNvdW50QXR0cnMoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fQXR0ck1hcC5HZXRTaXplKCk7Ci0gICAgfQorICBGWF9CT09MIEhhc0F0dHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBxTmFtZSkgY29uc3Q7CiAKLSAgICB2b2lkCQkJCQlHZXRBdHRyQnlJbmRleChpbnQgaW5kZXgsIENGWF9CeXRlU3RyaW5nICZzcGFjZSwgQ0ZYX0J5dGVTdHJpbmcgJm5hbWUsIENGWF9XaWRlU3RyaW5nICZ2YWx1ZSkgY29uc3Q7CisgIEZYX0JPT0wgR2V0QXR0clZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGF0dHJpYnV0ZSkgY29uc3Q7CisgIENGWF9XaWRlU3RyaW5nIEdldEF0dHJWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIGNvbnN0IHsKKyAgICBDRlhfV2lkZVN0cmluZyBhdHRyOworICAgIEdldEF0dHJWYWx1ZShuYW1lLCBhdHRyKTsKKyAgICByZXR1cm4gYXR0cjsKKyAgfQogCi0gICAgRlhfQk9PTAkJCQkJSGFzQXR0cihGWF9CU1RSIHFOYW1lKSBjb25zdDsKKyAgRlhfQk9PTCBHZXRBdHRyVmFsdWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgYXR0cmlidXRlKSBjb25zdDsKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0QXR0clZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIGNvbnN0IHsKKyAgICBDRlhfV2lkZVN0cmluZyBhdHRyOworICAgIEdldEF0dHJWYWx1ZShzcGFjZSwgbmFtZSwgYXR0cik7CisgICAgcmV0dXJuIGF0dHI7CisgIH0KIAotICAgIEZYX0JPT0wJCQkJCUdldEF0dHJWYWx1ZShGWF9CU1RSIG5hbWUsIENGWF9XaWRlU3RyaW5nJiBhdHRyaWJ1dGUpIGNvbnN0OwotICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0QXR0clZhbHVlKEZYX0JTVFIgbmFtZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIGF0dHI7Ci0gICAgICAgIEdldEF0dHJWYWx1ZShuYW1lLCBhdHRyKTsKLSAgICAgICAgcmV0dXJuIGF0dHI7Ci0gICAgfQorICBGWF9CT09MIEdldEF0dHJJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwgaW50JiBhdHRyaWJ1dGUpIGNvbnN0OworICBpbnQgR2V0QXR0ckludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lKSBjb25zdCB7CisgICAgaW50IGF0dHIgPSAwOworICAgIEdldEF0dHJJbnRlZ2VyKG5hbWUsIGF0dHIpOworICAgIHJldHVybiBhdHRyOworICB9CiAKLSAgICBGWF9CT09MCQkJCQlHZXRBdHRyVmFsdWUoRlhfQlNUUiBzcGFjZSwgRlhfQlNUUiBuYW1lLCBDRlhfV2lkZVN0cmluZyYgYXR0cmlidXRlKSBjb25zdDsKLSAgICBDRlhfV2lkZVN0cmluZwkJCUdldEF0dHJWYWx1ZShGWF9CU1RSIHNwYWNlLCBGWF9CU1RSIG5hbWUpIGNvbnN0Ci0gICAgewotICAgICAgICBDRlhfV2lkZVN0cmluZyBhdHRyOwotICAgICAgICBHZXRBdHRyVmFsdWUoc3BhY2UsIG5hbWUsIGF0dHIpOwotICAgICAgICByZXR1cm4gYXR0cjsKLSAgICB9CisgIEZYX0JPT0wgR2V0QXR0ckludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBhdHRyaWJ1dGUpIGNvbnN0OworICBpbnQgR2V0QXR0ckludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3QgeworICAgIGludCBhdHRyID0gMDsKKyAgICBHZXRBdHRySW50ZWdlcihzcGFjZSwgbmFtZSwgYXR0cik7CisgICAgcmV0dXJuIGF0dHI7CisgIH0KIAotICAgIEZYX0JPT0wJCQkJCUdldEF0dHJJbnRlZ2VyKEZYX0JTVFIgbmFtZSwgaW50JiBhdHRyaWJ1dGUpIGNvbnN0OwotICAgIGludAkJCQkJCUdldEF0dHJJbnRlZ2VyKEZYX0JTVFIgbmFtZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIGludCBhdHRyID0gMDsKLSAgICAgICAgR2V0QXR0ckludGVnZXIobmFtZSwgYXR0cik7Ci0gICAgICAgIHJldHVybiBhdHRyOwotICAgIH0KKyAgRlhfQk9PTCBHZXRBdHRyRmxvYXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLCBGWF9GTE9BVCYgYXR0cmlidXRlKSBjb25zdDsKKyAgRlhfRkxPQVQgR2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3QgeworICAgIEZYX0ZMT0FUIGF0dHIgPSAwOworICAgIEdldEF0dHJGbG9hdChuYW1lLCBhdHRyKTsKKyAgICByZXR1cm4gYXR0cjsKKyAgfQogCi0gICAgRlhfQk9PTAkJCQkJR2V0QXR0ckludGVnZXIoRlhfQlNUUiBzcGFjZSwgRlhfQlNUUiBuYW1lLCBpbnQmIGF0dHJpYnV0ZSkgY29uc3Q7Ci0gICAgaW50CQkJCQkJR2V0QXR0ckludGVnZXIoRlhfQlNUUiBzcGFjZSwgRlhfQlNUUiBuYW1lKSBjb25zdAotICAgIHsKLSAgICAgICAgaW50IGF0dHIgPSAwOwotICAgICAgICBHZXRBdHRySW50ZWdlcihzcGFjZSwgbmFtZSwgYXR0cik7Ci0gICAgICAgIHJldHVybiBhdHRyOwotICAgIH0KKyAgRlhfQk9PTCBHZXRBdHRyRmxvYXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgYXR0cmlidXRlKSBjb25zdDsKKyAgRlhfRkxPQVQgR2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIGNvbnN0IHsKKyAgICBGWF9GTE9BVCBhdHRyID0gMDsKKyAgICBHZXRBdHRyRmxvYXQoc3BhY2UsIG5hbWUsIGF0dHIpOworICAgIHJldHVybiBhdHRyOworICB9CiAKLSAgICBGWF9CT09MCQkJCQlHZXRBdHRyRmxvYXQoRlhfQlNUUiBuYW1lLCBGWF9GTE9BVCYgYXR0cmlidXRlKSBjb25zdDsKLSAgICBGWF9GTE9BVAkJCQlHZXRBdHRyRmxvYXQoRlhfQlNUUiBuYW1lKSBjb25zdAotICAgIHsKLSAgICAgICAgRlhfRkxPQVQgYXR0ciA9IDA7Ci0gICAgICAgIEdldEF0dHJGbG9hdChuYW1lLCBhdHRyKTsKLSAgICAgICAgcmV0dXJuIGF0dHI7Ci0gICAgfQorICBGWF9EV09SRCBDb3VudENoaWxkcmVuKCkgY29uc3Q7CiAKLSAgICBGWF9CT09MCQkJCQlHZXRBdHRyRmxvYXQoRlhfQlNUUiBzcGFjZSwgRlhfQlNUUiBuYW1lLCBGWF9GTE9BVCYgYXR0cmlidXRlKSBjb25zdDsKLSAgICBGWF9GTE9BVAkJCQlHZXRBdHRyRmxvYXQoRlhfQlNUUiBzcGFjZSwgRlhfQlNUUiBuYW1lKSBjb25zdAotICAgIHsKLSAgICAgICAgRlhfRkxPQVQgYXR0ciA9IDA7Ci0gICAgICAgIEdldEF0dHJGbG9hdChzcGFjZSwgbmFtZSwgYXR0cik7Ci0gICAgICAgIHJldHVybiBhdHRyOwotICAgIH0KKyAgZW51bSBDaGlsZFR5cGUgeyBJbnZhbGlkLCBFbGVtZW50LCBDb250ZW50IH07CiAKLSAgICBGWF9EV09SRAkJCQlDb3VudENoaWxkcmVuKCkgY29uc3Q7CisgIENoaWxkVHlwZSBHZXRDaGlsZFR5cGUoRlhfRFdPUkQgaW5kZXgpIGNvbnN0OwogCi0gICAgZW51bSBDaGlsZFR5cGUgeyBJbnZhbGlkLCBFbGVtZW50LCBDb250ZW50fTsKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0Q29udGVudChGWF9EV09SRCBpbmRleCkgY29uc3Q7CiAKLSAgICBDaGlsZFR5cGUJCQkJR2V0Q2hpbGRUeXBlKEZYX0RXT1JEIGluZGV4KSBjb25zdDsKKyAgQ1hNTF9FbGVtZW50KiBHZXRFbGVtZW50KEZYX0RXT1JEIGluZGV4KSBjb25zdDsKIAotICAgIENGWF9XaWRlU3RyaW5nCQkJR2V0Q29udGVudChGWF9EV09SRCBpbmRleCkgY29uc3Q7CisgIENYTUxfRWxlbWVudCogR2V0RWxlbWVudChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0YWcpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RWxlbWVudChzcGFjZSwgdGFnLCAwKTsKKyAgfQogCi0gICAgQ1hNTF9FbGVtZW50KgkJCUdldEVsZW1lbnQoRlhfRFdPUkQgaW5kZXgpIGNvbnN0OworICBGWF9EV09SRCBDb3VudEVsZW1lbnRzKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0YWcpIGNvbnN0OwogCi0gICAgQ1hNTF9FbGVtZW50KgkJCUdldEVsZW1lbnQoRlhfQlNUUiBzcGFjZSwgRlhfQlNUUiB0YWcpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gR2V0RWxlbWVudChzcGFjZSwgdGFnLCAwKTsKLSAgICB9CisgIENYTUxfRWxlbWVudCogR2V0RWxlbWVudChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0OwogCi0gICAgRlhfRFdPUkQJCQkJQ291bnRFbGVtZW50cyhGWF9CU1RSIHNwYWNlLCBGWF9CU1RSIHRhZykgY29uc3Q7CisgIEZYX0RXT1JEIEZpbmRFbGVtZW50KENYTUxfRWxlbWVudCogcENoaWxkKSBjb25zdDsKIAotICAgIENYTUxfRWxlbWVudCoJCQlHZXRFbGVtZW50KEZYX0JTVFIgc3BhY2UsIEZYX0JTVFIgdGFnLCBpbnQgaW5kZXgpIGNvbnN0OworICB2b2lkIFNldFRhZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHFTcGFjZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0YWduYW1lKTsKIAotICAgIEZYX0RXT1JECQkJCUZpbmRFbGVtZW50KENYTUxfRWxlbWVudCAqcENoaWxkKSBjb25zdDsKKyAgdm9pZCBTZXRUYWcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBxVGFnTmFtZSk7CiAKKyAgdm9pZCBSZW1vdmVDaGlsZHJlbigpOwogCisgIHZvaWQgUmVtb3ZlQ2hpbGQoRlhfRFdPUkQgaW5kZXgpOwogCisgcHJvdGVjdGVkOgorICBDWE1MX0VsZW1lbnQqIG1fcFBhcmVudDsKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9RU3BhY2VOYW1lOworICBDRlhfQnl0ZVN0cmluZyBtX1RhZ05hbWU7CiAKLSAgICB2b2lkCQkJCQlTZXRUYWcoRlhfQlNUUiBxU3BhY2UsIEZYX0JTVFIgdGFnbmFtZSk7CisgIENYTUxfQXR0ck1hcCBtX0F0dHJNYXA7CiAKLSAgICB2b2lkCQkJCQlTZXRUYWcoRlhfQlNUUiBxVGFnTmFtZSk7Ci0KLSAgICB2b2lkCQkJCQlSZW1vdmVDaGlsZHJlbigpOwotCi0gICAgdm9pZAkJCQkJUmVtb3ZlQ2hpbGQoRlhfRFdPUkQgaW5kZXgpOwotCi0KLXByb3RlY3RlZDoKLQotICAgIENYTUxfRWxlbWVudCoJCQltX3BQYXJlbnQ7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcJCQltX1FTcGFjZU5hbWU7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcJCQltX1RhZ05hbWU7Ci0KLSAgICBDWE1MX0F0dHJNYXAJCQltX0F0dHJNYXA7Ci0KLSAgICBDRlhfUHRyQXJyYXkJCQltX0NoaWxkcmVuOwotICAgIGZyaWVuZCBjbGFzcyBDWE1MX1BhcnNlcjsKLSAgICBmcmllbmQgY2xhc3MgQ1hNTF9Db21wb3NlcjsKKyAgQ0ZYX1B0ckFycmF5IG1fQ2hpbGRyZW47CisgIGZyaWVuZCBjbGFzcyBDWE1MX1BhcnNlcjsKKyAgZnJpZW5kIGNsYXNzIENYTUxfQ29tcG9zZXI7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GWENSVF9GWF9YTUxfSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGdlL2ZwZi5oIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnBmLmgKaW5kZXggNDQwYzMyOS4uMTFlMmJmMSAxMDA2NDQKLS0tIGEvY29yZS9pbmNsdWRlL2Z4Z2UvZnBmLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnBmLmgKQEAgLTEsNjQgKzEsNzAgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBDT1JFX0lOQ0xVREVfRlhHRV9GUEZfSF8KICNkZWZpbmUgQ09SRV9JTkNMVURFX0ZYR0VfRlBGX0hfCiAKLWNsYXNzIElGUEZfRGV2aWNlTW9kdWxlOworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorCiBjbGFzcyBJRlBGX0ZvbnRNZ3I7Ci1jbGFzcyBJRlBGX0ZvbnQ7Ci1jbGFzcyBJRlBGX0RldmljZU1vZHVsZQotewotcHVibGljOgotICAgIHZpcnR1YWwgfklGUEZfRGV2aWNlTW9kdWxlKCkgeyB9Ci0gICAgdmlydHVhbCB2b2lkCQkJCURlc3Ryb3koKSA9IDA7Ci0gICAgdmlydHVhbCBJRlBGX0ZvbnRNZ3IqCQlHZXRGb250TWdyKCkgPSAwOworCitjbGFzcyBJRlBGX0RldmljZU1vZHVsZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JRlBGX0RldmljZU1vZHVsZSgpIHt9CisgIHZpcnR1YWwgdm9pZCBEZXN0cm95KCkgPSAwOworICB2aXJ0dWFsIElGUEZfRm9udE1nciogR2V0Rm9udE1ncigpID0gMDsKIH07Ci1JRlBGX0RldmljZU1vZHVsZSoJRlBGX0dldERldmljZU1vZHVsZSgpOwotI2RlZmluZSBGUEZfTUFUQ0hGT05UX1JFUExBQ0VBTlNJCQkxCi10eXBlZGVmIHN0cnVjdCBGUEZfSEZPTlRfIHsKLSAgICBGWF9MUFZPSUQgcERhdGE7Ci19KiBGUEZfSEZPTlQ7Ci1jbGFzcyBJRlBGX0ZvbnQKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQJCQlSZWxlYXNlKCkgPSAwOwotICAgIHZpcnR1YWwgSUZQRl9Gb250KgkJUmV0YWluKCkgPSAwOwotICAgIHZpcnR1YWwgRlBGX0hGT05UCQlHZXRIYW5kbGUoKSA9IDA7Ci0gICAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZwlHZXRGYW1pbHlOYW1lKCkgPSAwOwotICAgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcJR2V0UHNOYW1lKCkgPSAwOwotICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdldEZvbnRTdHlsZSgpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIEZYX0JZVEUJCQlHZXRDaGFyc2V0KCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0R2x5cGhJbmRleChGWF9XQ0hBUiB3VW5pY29kZSkgPSAwOwotICAgIHZpcnR1YWwgRlhfSU5UMzIJCUdldEdseXBoV2lkdGgoRlhfSU5UMzIgaUdseXBoSW5kZXgpID0gMDsKK0lGUEZfRGV2aWNlTW9kdWxlKiBGUEZfR2V0RGV2aWNlTW9kdWxlKCk7CiAKLSAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRBc2NlbnQoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0RGVzY2VudCgpIGNvbnN0ID0gMDsKKyNkZWZpbmUgRlBGX01BVENIRk9OVF9SRVBMQUNFQU5TSSAxCiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRHbHlwaEJCb3goRlhfSU5UMzIgaUdseXBoSW5kZXgsIEZYX1JFQ1QgJnJ0QkJveCkgPSAwOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldEJCb3goRlhfUkVDVCAmcnRCQm94KSA9IDA7Cit0eXBlZGVmIHN0cnVjdCBGUEZfSEZPTlRfIHsgdm9pZCogcERhdGE7IH0gKiBGUEZfSEZPTlQ7CiAKLSAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRIZWlnaHQoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0SXRhbGljQW5nbGUoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBGWF9EV09SRAkJR2V0Rm9udERhdGEoRlhfRFdPUkQgZHdUYWJsZSwgRlhfTFBCWVRFIHBCdWZmZXIsIEZYX0RXT1JEIGR3U2l6ZSkgPSAwOworY2xhc3MgSUZQRl9Gb250IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOworICB2aXJ0dWFsIElGUEZfRm9udCogUmV0YWluKCkgPSAwOworICB2aXJ0dWFsIEZQRl9IRk9OVCBHZXRIYW5kbGUoKSA9IDA7CisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0RmFtaWx5TmFtZSgpID0gMDsKKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBHZXRQc05hbWUoKSA9IDA7CisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Rm9udFN0eWxlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQ4X3QgR2V0Q2hhcnNldCgpIGNvbnN0ID0gMDsKIAotcHJvdGVjdGVkOgotICAgIH5JRlBGX0ZvbnQoKSB7IH0KKyAgdmlydHVhbCBpbnQzMl90IEdldEdseXBoSW5kZXgoRlhfV0NIQVIgd1VuaWNvZGUpID0gMDsKKyAgdmlydHVhbCBpbnQzMl90IEdldEdseXBoV2lkdGgoaW50MzJfdCBpR2x5cGhJbmRleCkgPSAwOworCisgIHZpcnR1YWwgaW50MzJfdCBHZXRBc2NlbnQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50MzJfdCBHZXREZXNjZW50KCkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRHbHlwaEJCb3goaW50MzJfdCBpR2x5cGhJbmRleCwgRlhfUkVDVCYgcnRCQm94KSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBHZXRCQm94KEZYX1JFQ1QmIHJ0QkJveCkgPSAwOworCisgIHZpcnR1YWwgaW50MzJfdCBHZXRIZWlnaHQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50MzJfdCBHZXRJdGFsaWNBbmdsZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBGWF9EV09SRCBHZXRGb250RGF0YShGWF9EV09SRCBkd1RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTaXplKSA9IDA7CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgfklGUEZfRm9udCgpIHt9CiB9OwotY2xhc3MgSUZQRl9Gb250TWdyCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+SUZQRl9Gb250TWdyKCkgeyB9Ci0gICAgdmlydHVhbCB2b2lkCQkJTG9hZFN5c3RlbUZvbnRzKCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZAkJCUxvYWRQcml2YXRlRm9udChJRlhfRmlsZVJlYWQqIHBGb250RmlsZSkgPSAwOwotICAgIHZpcnR1YWwgdm9pZAkJCUxvYWRQcml2YXRlRm9udChGWF9CU1RSIGJzRmlsZU5hbWUpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQJCQlMb2FkUHJpdmF0ZUZvbnQoRlhfTFBWT0lEIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikgPSAwOwogCi0gICAgdmlydHVhbCBJRlBGX0ZvbnQqCQlDcmVhdGVGb250KEZYX0JTVFIgYnNGYW1pbHluYW1lLCBGWF9CWVRFIGNoYXJzZXQsIEZYX0RXT1JEIGR3U3R5bGUsIEZYX0RXT1JEIGR3TWF0Y2ggPSAwKSA9IDA7CitjbGFzcyBJRlBGX0ZvbnRNZ3IgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SUZQRl9Gb250TWdyKCkge30KKyAgdmlydHVhbCB2b2lkIExvYWRTeXN0ZW1Gb250cygpID0gMDsKKyAgdmlydHVhbCB2b2lkIExvYWRQcml2YXRlRm9udChJRlhfRmlsZVJlYWQqIHBGb250RmlsZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgTG9hZFByaXZhdGVGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGaWxlTmFtZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgTG9hZFByaXZhdGVGb250KHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikgPSAwOworCisgIHZpcnR1YWwgSUZQRl9Gb250KiBDcmVhdGVGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGYW1pbHluYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TWF0Y2ggPSAwKSA9IDA7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GWEdFX0ZQRl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZGliLmggYi9jb3JlL2luY2x1ZGUvZnhnZS9meF9kaWIuaAppbmRleCA3NDczOGQwLi5mNGY0ZmQyIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhnZS9meF9kaWIuaAorKysgYi9jb3JlL2luY2x1ZGUvZnhnZS9meF9kaWIuaApAQCAtMSw2MDYgKzEsNjk3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgQ09SRV9JTkNMVURFX0ZYR0VfRlhfRElCX0hfCiAjZGVmaW5lIENPUkVfSU5DTFVERV9GWEdFX0ZYX0RJQl9IXwogCi0jaW5jbHVkZSAiLi4vZnhjcnQvZnhfZXh0LmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCiAKIGVudW0gRlhESUJfRm9ybWF0IHsKLSAgICBGWERJQl9JbnZhbGlkID0gMCwKLSAgICBGWERJQl8xYnBwTWFzayA9IDB4MTAxLAotICAgIEZYRElCXzFicHBSZ2IgPSAweDAwMSwKLSAgICBGWERJQl8xYnBwQ215ayA9IDB4NDAxLAotICAgIEZYRElCXzhicHBNYXNrID0gMHgxMDgsCi0gICAgRlhESUJfOGJwcFJnYiA9IDB4MDA4LAotICAgIEZYRElCXzhicHBSZ2JhID0gMHgyMDgsCi0gICAgRlhESUJfOGJwcENteWsgPSAweDQwOCwKLSAgICBGWERJQl84YnBwQ215a2EgPSAweDYwOCwKLSAgICBGWERJQl9SZ2IgPSAweDAxOCwKLSAgICBGWERJQl9SZ2JhID0gMHgyMTgsCi0gICAgRlhESUJfUmdiMzIgPSAweDAyMCwKLSAgICBGWERJQl9BcmdiID0gMHgyMjAsCi0gICAgRlhESUJfQ215ayA9IDB4NDIwLAotICAgIEZYRElCX0NteWthID0gMHg2MjAsCisgIEZYRElCX0ludmFsaWQgPSAwLAorICBGWERJQl8xYnBwTWFzayA9IDB4MTAxLAorICBGWERJQl8xYnBwUmdiID0gMHgwMDEsCisgIEZYRElCXzFicHBDbXlrID0gMHg0MDEsCisgIEZYRElCXzhicHBNYXNrID0gMHgxMDgsCisgIEZYRElCXzhicHBSZ2IgPSAweDAwOCwKKyAgRlhESUJfOGJwcFJnYmEgPSAweDIwOCwKKyAgRlhESUJfOGJwcENteWsgPSAweDQwOCwKKyAgRlhESUJfOGJwcENteWthID0gMHg2MDgsCisgIEZYRElCX1JnYiA9IDB4MDE4LAorICBGWERJQl9SZ2JhID0gMHgyMTgsCisgIEZYRElCX1JnYjMyID0gMHgwMjAsCisgIEZYRElCX0FyZ2IgPSAweDIyMCwKKyAgRlhESUJfQ215ayA9IDB4NDIwLAorICBGWERJQl9DbXlrYSA9IDB4NjIwLAogfTsKIGVudW0gRlhESUJfQ2hhbm5lbCB7Ci0gICAgRlhESUJfUmVkID0gMSwKLSAgICBGWERJQl9HcmVlbiwKLSAgICBGWERJQl9CbHVlLAotICAgIEZYRElCX0N5YW4sCi0gICAgRlhESUJfTWFnZW50YSwKLSAgICBGWERJQl9ZZWxsb3csCi0gICAgRlhESUJfQmxhY2ssCi0gICAgRlhESUJfQWxwaGEKKyAgRlhESUJfUmVkID0gMSwKKyAgRlhESUJfR3JlZW4sCisgIEZYRElCX0JsdWUsCisgIEZYRElCX0N5YW4sCisgIEZYRElCX01hZ2VudGEsCisgIEZYRElCX1llbGxvdywKKyAgRlhESUJfQmxhY2ssCisgIEZYRElCX0FscGhhCiB9OwotI2RlZmluZSBGWERJQl9ET1dOU0FNUExFCQkweDA0Ci0jZGVmaW5lIEZYRElCX0lOVEVSUE9MCQkJMHgyMAotI2RlZmluZSBGWERJQl9CSUNVQklDX0lOVEVSUE9MICAweDgwCi0jZGVmaW5lIEZYRElCX05PU01PT1RICQkJMHgxMDAKLSNkZWZpbmUgRlhESUJfUEFMRVRURV9MT0MJCTB4MDEKLSNkZWZpbmUgRlhESUJfUEFMRVRURV9XSU4JCTB4MDIKLSNkZWZpbmUgRlhESUJfUEFMRVRURV9NQUMJCTB4MDQKLSNkZWZpbmUgRlhESUJfQkxFTkRfTk9STUFMCQkJMAotI2RlZmluZSBGWERJQl9CTEVORF9NVUxUSVBMWQkJMQotI2RlZmluZSBGWERJQl9CTEVORF9TQ1JFRU4JCQkyCi0jZGVmaW5lIEZYRElCX0JMRU5EX09WRVJMQVkJCQkzCi0jZGVmaW5lIEZYRElCX0JMRU5EX0RBUktFTgkJCTQKLSNkZWZpbmUgRlhESUJfQkxFTkRfTElHSFRFTgkJCTUKKyNkZWZpbmUgRlhESUJfRE9XTlNBTVBMRSAweDA0CisjZGVmaW5lIEZYRElCX0lOVEVSUE9MIDB4MjAKKyNkZWZpbmUgRlhESUJfQklDVUJJQ19JTlRFUlBPTCAweDgwCisjZGVmaW5lIEZYRElCX05PU01PT1RIIDB4MTAwCisjZGVmaW5lIEZYRElCX1BBTEVUVEVfTE9DIDB4MDEKKyNkZWZpbmUgRlhESUJfUEFMRVRURV9XSU4gMHgwMgorI2RlZmluZSBGWERJQl9QQUxFVFRFX01BQyAweDA0CisjZGVmaW5lIEZYRElCX0JMRU5EX05PUk1BTCAwCisjZGVmaW5lIEZYRElCX0JMRU5EX01VTFRJUExZIDEKKyNkZWZpbmUgRlhESUJfQkxFTkRfU0NSRUVOIDIKKyNkZWZpbmUgRlhESUJfQkxFTkRfT1ZFUkxBWSAzCisjZGVmaW5lIEZYRElCX0JMRU5EX0RBUktFTiA0CisjZGVmaW5lIEZYRElCX0JMRU5EX0xJR0hURU4gNQogCi0jZGVmaW5lIEZYRElCX0JMRU5EX0NPTE9SRE9ER0UJCTYKLSNkZWZpbmUgRlhESUJfQkxFTkRfQ09MT1JCVVJOCQk3Ci0jZGVmaW5lIEZYRElCX0JMRU5EX0hBUkRMSUdIVAkJOAotI2RlZmluZSBGWERJQl9CTEVORF9TT0ZUTElHSFQJCTkKLSNkZWZpbmUgRlhESUJfQkxFTkRfRElGRkVSRU5DRQkJMTAKLSNkZWZpbmUgRlhESUJfQkxFTkRfRVhDTFVTSU9OCQkxMQotI2RlZmluZSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEUJMjEKLSNkZWZpbmUgRlhESUJfQkxFTkRfSFVFCQkJCTIxCi0jZGVmaW5lIEZYRElCX0JMRU5EX1NBVFVSQVRJT04JCTIyCi0jZGVmaW5lIEZYRElCX0JMRU5EX0NPTE9SCQkJMjMKLSNkZWZpbmUgRlhESUJfQkxFTkRfTFVNSU5PU0lUWQkJMjQKLSNkZWZpbmUgRlhESUJfQkxFTkRfVU5TVVBQT1JURUQJCS0xCi10eXBlZGVmIEZYX0RXT1JECUZYX0FSR0I7Ci10eXBlZGVmIEZYX0RXT1JECUZYX0NPTE9SUkVGOwotdHlwZWRlZiBGWF9EV09SRAlGWF9DTVlLOworI2RlZmluZSBGWERJQl9CTEVORF9DT0xPUkRPREdFIDYKKyNkZWZpbmUgRlhESUJfQkxFTkRfQ09MT1JCVVJOIDcKKyNkZWZpbmUgRlhESUJfQkxFTkRfSEFSRExJR0hUIDgKKyNkZWZpbmUgRlhESUJfQkxFTkRfU09GVExJR0hUIDkKKyNkZWZpbmUgRlhESUJfQkxFTkRfRElGRkVSRU5DRSAxMAorI2RlZmluZSBGWERJQl9CTEVORF9FWENMVVNJT04gMTEKKyNkZWZpbmUgRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFIDIxCisjZGVmaW5lIEZYRElCX0JMRU5EX0hVRSAyMQorI2RlZmluZSBGWERJQl9CTEVORF9TQVRVUkFUSU9OIDIyCisjZGVmaW5lIEZYRElCX0JMRU5EX0NPTE9SIDIzCisjZGVmaW5lIEZYRElCX0JMRU5EX0xVTUlOT1NJVFkgMjQKKyNkZWZpbmUgRlhESUJfQkxFTkRfVU5TVVBQT1JURUQgLTEKK3R5cGVkZWYgRlhfRFdPUkQgRlhfQVJHQjsKK3R5cGVkZWYgRlhfRFdPUkQgRlhfQ09MT1JSRUY7Cit0eXBlZGVmIEZYX0RXT1JEIEZYX0NNWUs7CiBjbGFzcyBDRlhfQ2xpcFJnbjsKIGNsYXNzIENGWF9ESUJTb3VyY2U7CiBjbGFzcyBDRlhfRElCaXRtYXA7Ci0jZGVmaW5lIEZYU1lTX1JHQihyLCBnLCBiKSAgKChyKSB8ICgoZykgPDwgOCkgfCAoKGIpIDw8IDE2KSkKLSNkZWZpbmUgRlhTWVNfR2V0UlZhbHVlKHJnYikgKChyZ2IpICYgMHhmZikKK2NsYXNzIENTdHJldGNoRW5naW5lOworCisjZGVmaW5lIEZYU1lTX1JHQihyLCBnLCBiKSAoKHIpIHwgKChnKSA8PCA4KSB8ICgoYikgPDwgMTYpKQorI2RlZmluZSBGWFNZU19HZXRSVmFsdWUocmdiKSAoKHJnYikmMHhmZikKICNkZWZpbmUgRlhTWVNfR2V0R1ZhbHVlKHJnYikgKCgocmdiKSA+PiA4KSAmIDB4ZmYpCiAjZGVmaW5lIEZYU1lTX0dldEJWYWx1ZShyZ2IpICgoKHJnYikgPj4gMTYpICYgMHhmZikKLSNkZWZpbmUgRlhfQ0NPTE9SKHZhbCkgKDI1NS0odmFsKSkKKyNkZWZpbmUgRlhfQ0NPTE9SKHZhbCkgKDI1NSAtICh2YWwpKQogI2RlZmluZSBGWFNZU19DTVlLKGMsIG0sIHksIGspICgoKGMpIDw8IDI0KSB8ICgobSkgPDwgMTYpIHwgKCh5KSA8PCA4KSB8IChrKSkKLSNkZWZpbmUgRlhTWVNfR2V0Q1ZhbHVlKGNteWspICgoRlhfQllURSkoKGNteWspID4+IDI0KSAmIDB4ZmYpCi0jZGVmaW5lIEZYU1lTX0dldE1WYWx1ZShjbXlrKSAoKEZYX0JZVEUpKChjbXlrKSA+PiAxNikgJiAweGZmKQotI2RlZmluZSBGWFNZU19HZXRZVmFsdWUoY215aykgKChGWF9CWVRFKSgoY215aykgPj4gOCkgJiAweGZmKQotI2RlZmluZSBGWFNZU19HZXRLVmFsdWUoY215aykgKChGWF9CWVRFKShjbXlrKSAmIDB4ZmYpCisjZGVmaW5lIEZYU1lTX0dldENWYWx1ZShjbXlrKSAoKHVpbnQ4X3QpKChjbXlrKSA+PiAyNCkgJiAweGZmKQorI2RlZmluZSBGWFNZU19HZXRNVmFsdWUoY215aykgKCh1aW50OF90KSgoY215aykgPj4gMTYpICYgMHhmZikKKyNkZWZpbmUgRlhTWVNfR2V0WVZhbHVlKGNteWspICgodWludDhfdCkoKGNteWspID4+IDgpICYgMHhmZikKKyNkZWZpbmUgRlhTWVNfR2V0S1ZhbHVlKGNteWspICgodWludDhfdCkoY215aykmMHhmZikKIHZvaWQgQ215a0RlY29kZShGWF9DTVlLIGNteWssIGludCYgYywgaW50JiBtLCBpbnQmIHksIGludCYgayk7Ci1pbmxpbmUgRlhfQ01ZSyBDbXlrRW5jb2RlKGludCBjLCBpbnQgbSwgaW50IHksIGludCBrKQotewotICAgIHJldHVybiAoYyA8PCAyNCkgfCAobSA8PCAxNikgfCAoeSA8PCA4KSB8IGs7CitpbmxpbmUgRlhfQ01ZSyBDbXlrRW5jb2RlKGludCBjLCBpbnQgbSwgaW50IHksIGludCBrKSB7CisgIHJldHVybiAoYyA8PCAyNCkgfCAobSA8PCAxNikgfCAoeSA8PCA4KSB8IGs7CiB9Ci12b2lkIEFyZ2JEZWNvZGUoRlhfQVJHQiBhcmdiLCBpbnQmIGEsIGludCYgciwgaW50JmcsIGludCYgYik7Cit2b2lkIEFyZ2JEZWNvZGUoRlhfQVJHQiBhcmdiLCBpbnQmIGEsIGludCYgciwgaW50JiBnLCBpbnQmIGIpOwogdm9pZCBBcmdiRGVjb2RlKEZYX0FSR0IgYXJnYiwgaW50JiBhLCBGWF9DT0xPUlJFRiYgcmdiKTsKLWlubGluZSBGWF9BUkdCIEFyZ2JFbmNvZGUoaW50IGEsIGludCByLCBpbnQgZywgaW50IGIpCi17Ci0gICAgcmV0dXJuIChhIDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8IDgpIHwgYjsKK2lubGluZSBGWF9BUkdCIEFyZ2JFbmNvZGUoaW50IGEsIGludCByLCBpbnQgZywgaW50IGIpIHsKKyAgcmV0dXJuIChhIDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8IDgpIHwgYjsKIH0KIEZYX0FSR0IgQXJnYkVuY29kZShpbnQgYSwgRlhfQ09MT1JSRUYgcmdiKTsKLSNkZWZpbmUgRlhBUkdCX0EoYXJnYikgKChGWF9CWVRFKSgoYXJnYikgPj4gMjQpKQotI2RlZmluZSBGWEFSR0JfUihhcmdiKSAoKEZYX0JZVEUpKChhcmdiKSA+PiAxNikpCi0jZGVmaW5lIEZYQVJHQl9HKGFyZ2IpICgoRlhfQllURSkoKGFyZ2IpID4+IDgpKQotI2RlZmluZSBGWEFSR0JfQihhcmdiKSAoKEZYX0JZVEUpKGFyZ2IpKQotI2RlZmluZSBGWEFSR0JfTUFLRShhLHIsZyxiKSAoKChGWF9EV09SRCkoYSkgPDwgMjQpIHwgKChyKSA8PCAxNikgfCAoKGcpIDw8IDgpIHwgKGIpKQotI2RlZmluZSBGWEFSR0JfTVVMX0FMUEhBKGFyZ2IsIGFscGhhKSAoKCgoKGFyZ2IpID4+IDI0KSAqIChhbHBoYSkgLyAyNTUpIDw8IDI0KSB8ICgoYXJnYikgJiAweGZmZmZmZikpCi0jZGVmaW5lIEZYUkdCMkdSQVkocixnLGIpICgoKGIpICogMTEgKyAoZykgKiA1OSArIChyKSAqIDMwKSAvIDEwMCkKLSNkZWZpbmUgRlhDTVlLMkdSQVkoYyxtLHksaykgKCgoMjU1LShjKSkgKiAoMjU1LShrKSkgKiAzMCArICgyNTUtKG0pKSAqICgyNTUtKGspKSAqIDU5ICsgKDI1NS0oeSkpICogKDI1NS0oaykpICogMTEpIC8gMjU1MDApCi0jZGVmaW5lIEZYRElCX0FMUEhBX01FUkdFKGJhY2tkcm9wLCBzb3VyY2UsIHNvdXJjZV9hbHBoYSkgKCgoYmFja2Ryb3ApICogKDI1NS0oc291cmNlX2FscGhhKSkgKyAoc291cmNlKSooc291cmNlX2FscGhhKSkvMjU1KQotI2RlZmluZSBGWERJQl9BTFBIQV9VTklPTihkZXN0LCBzcmMpICgoZGVzdCkgKyAoc3JjKSAtIChkZXN0KSooc3JjKS8yNTUpCi0jZGVmaW5lIEZYQ01ZS19HRVRESUIocCkgKCgoKEZYX0xQQllURSkocCkpWzBdIDw8IDI0IHwgKCgoRlhfTFBCWVRFKShwKSlbMV0gPDwgMTYpIHwgKCgoRlhfTFBCWVRFKShwKSlbMl0gPDwgOCkgfCAoKEZYX0xQQllURSkocCkpWzNdKSkKLSNkZWZpbmUgRlhDTVlLX1NFVERJQihwLCBjbXlrKSAgKChGWF9MUEJZVEUpKHApKVswXSA9IChGWF9CWVRFKSgoY215aykgPj4gMjQpLCBcCi0gICAgICAgICgoRlhfTFBCWVRFKShwKSlbMV0gPSAoRlhfQllURSkoKGNteWspID4+IDE2KSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGWF9MUEJZVEUpKHApKVsyXSA9IChGWF9CWVRFKSgoY215aykgPj4gOCksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGWF9MUEJZVEUpKHApKVszXSA9IChGWF9CWVRFKShjbXlrKSkKLSNkZWZpbmUgRlhBUkdCX0dFVERJQihwKSAoKCgoRlhfTFBCWVRFKShwKSlbMF0pIHwgKCgoRlhfTFBCWVRFKShwKSlbMV0gPDwgOCkgfCAoKChGWF9MUEJZVEUpKHApKVsyXSA8PCAxNikgfCAoKChGWF9MUEJZVEUpKHApKVszXSA8PCAyNCkpCi0jZGVmaW5lIEZYQVJHQl9TRVRESUIocCwgYXJnYikgKChGWF9MUEJZVEUpKHApKVswXSA9IChGWF9CWVRFKShhcmdiKSwgXAotICAgICAgICAoKEZYX0xQQllURSkocCkpWzFdID0gKEZYX0JZVEUpKChhcmdiKSA+PiA4KSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGWF9MUEJZVEUpKHApKVsyXSA9IChGWF9CWVRFKSgoYXJnYikgPj4gMTYpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRlhfTFBCWVRFKShwKSlbM10gPSAoRlhfQllURSkoKGFyZ2IpID4+IDI0KQotI2RlZmluZSBGWEFSR0JfQ09QWShkZXN0LCBzcmMpICooRlhfTFBCWVRFKShkZXN0KSA9ICooRlhfTFBCWVRFKShzcmMpLCBcCi0gICAgICAgICooKEZYX0xQQllURSkoZGVzdCkrMSkgPSAqKChGWF9MUEJZVEUpKHNyYykrMSksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooKEZYX0xQQllURSkoZGVzdCkrMikgPSAqKChGWF9MUEJZVEUpKHNyYykrMiksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigoRlhfTFBCWVRFKShkZXN0KSszKSA9ICooKEZYX0xQQllURSkoc3JjKSszKQotI2RlZmluZSBGWENNWUtfQ09QWShkZXN0LCBzcmMpICAqKEZYX0xQQllURSkoZGVzdCkgPSAqKEZYX0xQQllURSkoc3JjKSwgXAotICAgICAgICAqKChGWF9MUEJZVEUpKGRlc3QpKzEpID0gKigoRlhfTFBCWVRFKShzcmMpKzEpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKChGWF9MUEJZVEUpKGRlc3QpKzIpID0gKigoRlhfTFBCWVRFKShzcmMpKzIpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooKEZYX0xQQllURSkoZGVzdCkrMykgPSAqKChGWF9MUEJZVEUpKHNyYykrMykKLSNkZWZpbmUgRlhBUkdCX1NFVFJHQk9SREVSRElCKHAsIGFyZ2IpICgoRlhfTFBCWVRFKShwKSlbM10gPSAoRlhfQllURSkoYXJnYj4+MjQpLCBcCi0gICAgICAgICgoRlhfTFBCWVRFKShwKSlbMF0gPSAoRlhfQllURSkoKGFyZ2IpID4+IDE2KSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGWF9MUEJZVEUpKHApKVsxXSA9IChGWF9CWVRFKSgoYXJnYikgPj4gOCksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGWF9MUEJZVEUpKHApKVsyXSA9IChGWF9CWVRFKShhcmdiKQotI2RlZmluZSBGWEFSR0JfR0VUUkdCT1JERVJESUIocCkgKCgoRlhfTFBCWVRFKShwKSlbMl0pIHwgKCgoRlhfTFBCWVRFKShwKSlbMV0gPDwgOCkgfCAoKChGWF9MUEJZVEUpKHApKVswXSA8PCAxNikgfCAoKChGWF9MUEJZVEUpKHApKVszXSA8PCAyNCkKLSNkZWZpbmUgRlhBUkdCX1JHQk9SREVSQ09QWShkZXN0LCBzcmMpICooKEZYX0xQQllURSkoZGVzdCkrMykgPSAqKChGWF9MUEJZVEUpKHNyYykrMyksIFwKLSAgICAgICAgKihGWF9MUEJZVEUpKGRlc3QpID0gKigoRlhfTFBCWVRFKShzcmMpKzIpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICooKEZYX0xQQllURSkoZGVzdCkrMSkgPSAqKChGWF9MUEJZVEUpKHNyYykrMSksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKChGWF9MUEJZVEUpKGRlc3QpKzIpID0gKigoRlhfTFBCWVRFKShzcmMpKQorI2RlZmluZSBGWEFSR0JfQShhcmdiKSAoKHVpbnQ4X3QpKChhcmdiKSA+PiAyNCkpCisjZGVmaW5lIEZYQVJHQl9SKGFyZ2IpICgodWludDhfdCkoKGFyZ2IpID4+IDE2KSkKKyNkZWZpbmUgRlhBUkdCX0coYXJnYikgKCh1aW50OF90KSgoYXJnYikgPj4gOCkpCisjZGVmaW5lIEZYQVJHQl9CKGFyZ2IpICgodWludDhfdCkoYXJnYikpCisjZGVmaW5lIEZYQVJHQl9NQUtFKGEsIHIsIGcsIGIpIFwKKyAgKCgoRlhfRFdPUkQpKGEpIDw8IDI0KSB8ICgocikgPDwgMTYpIHwgKChnKSA8PCA4KSB8IChiKSkKKyNkZWZpbmUgRlhBUkdCX01VTF9BTFBIQShhcmdiLCBhbHBoYSkgXAorICAoKCgoKGFyZ2IpID4+IDI0KSAqIChhbHBoYSkgLyAyNTUpIDw8IDI0KSB8ICgoYXJnYikmMHhmZmZmZmYpKQorI2RlZmluZSBGWFJHQjJHUkFZKHIsIGcsIGIpICgoKGIpKjExICsgKGcpKjU5ICsgKHIpKjMwKSAvIDEwMCkKKyNkZWZpbmUgRlhDTVlLMkdSQVkoYywgbSwgeSwgaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKDI1NSAtIChjKSkgKiAoMjU1IC0gKGspKSAqIDMwICsgKDI1NSAtIChtKSkgKiAoMjU1IC0gKGspKSAqIDU5ICsgXAorICAgICgyNTUgLSAoeSkpICogKDI1NSAtIChrKSkgKiAxMSkgLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIDI1NTAwKQorI2RlZmluZSBGWERJQl9BTFBIQV9NRVJHRShiYWNrZHJvcCwgc291cmNlLCBzb3VyY2VfYWxwaGEpIFwKKyAgKCgoYmFja2Ryb3ApICogKDI1NSAtIChzb3VyY2VfYWxwaGEpKSArIChzb3VyY2UpICogKHNvdXJjZV9hbHBoYSkpIC8gMjU1KQorI2RlZmluZSBGWERJQl9BTFBIQV9VTklPTihkZXN0LCBzcmMpICgoZGVzdCkgKyAoc3JjKSAtIChkZXN0KSAqIChzcmMpIC8gMjU1KQorI2RlZmluZSBGWENNWUtfR0VURElCKHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgodWludDhfdCopKHApKVswXSA8PCAyNCB8ICgoKHVpbnQ4X3QqKShwKSlbMV0gPDwgMTYpIHwgXAorICAgICgoKHVpbnQ4X3QqKShwKSlbMl0gPDwgOCkgfCAoKHVpbnQ4X3QqKShwKSlbM10pKQorI2RlZmluZSBGWENNWUtfU0VURElCKHAsIGNteWspICAoKHVpbnQ4X3QqKShwKSlbMF0gPSAodWludDhfdCkoKGNteWspID4+IDI0KSwgXAorICAgICAgICAoKHVpbnQ4X3QqKShwKSlbMV0gPSAodWludDhfdCkoKGNteWspID4+IDE2KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KikocCkpWzJdID0gKHVpbnQ4X3QpKChjbXlrKSA+PiA4KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QqKShwKSlbM10gPSAodWludDhfdCkoY215aykpCisjZGVmaW5lIEZYQVJHQl9HRVRESUIocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKCh1aW50OF90KikocCkpWzBdKSB8ICgoKHVpbnQ4X3QqKShwKSlbMV0gPDwgOCkgfCBcCisgICAoKCh1aW50OF90KikocCkpWzJdIDw8IDE2KSB8ICgoKHVpbnQ4X3QqKShwKSlbM10gPDwgMjQpKQorI2RlZmluZSBGWEFSR0JfU0VURElCKHAsIGFyZ2IpICAgICAgICAgICAgICAgICAgXAorICAoKHVpbnQ4X3QqKShwKSlbMF0gPSAodWludDhfdCkoYXJnYiksICAgICAgICAgXAorICAoKHVpbnQ4X3QqKShwKSlbMV0gPSAodWludDhfdCkoKGFyZ2IpID4+IDgpLCAgXAorICAoKHVpbnQ4X3QqKShwKSlbMl0gPSAodWludDhfdCkoKGFyZ2IpID4+IDE2KSwgXAorICAoKHVpbnQ4X3QqKShwKSlbM10gPSAodWludDhfdCkoKGFyZ2IpID4+IDI0KQorI2RlZmluZSBGWEFSR0JfQ09QWShkZXN0LCBzcmMpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKih1aW50OF90KikoZGVzdCkgPSAqKHVpbnQ4X3QqKShzcmMpLCAgICAgICAgICAgICBcCisgICooKHVpbnQ4X3QqKShkZXN0KSArIDEpID0gKigodWludDhfdCopKHNyYykgKyAxKSwgXAorICAqKCh1aW50OF90KikoZGVzdCkgKyAyKSA9ICooKHVpbnQ4X3QqKShzcmMpICsgMiksIFwKKyAgKigodWludDhfdCopKGRlc3QpICsgMykgPSAqKCh1aW50OF90Kikoc3JjKSArIDMpCisjZGVmaW5lIEZYQ01ZS19DT1BZKGRlc3QsIHNyYykgICAgICAgICAgICAgICAgICAgICAgXAorICAqKHVpbnQ4X3QqKShkZXN0KSA9ICoodWludDhfdCopKHNyYyksICAgICAgICAgICAgIFwKKyAgKigodWludDhfdCopKGRlc3QpICsgMSkgPSAqKCh1aW50OF90Kikoc3JjKSArIDEpLCBcCisgICooKHVpbnQ4X3QqKShkZXN0KSArIDIpID0gKigodWludDhfdCopKHNyYykgKyAyKSwgXAorICAqKCh1aW50OF90KikoZGVzdCkgKyAzKSA9ICooKHVpbnQ4X3QqKShzcmMpICsgMykKKyNkZWZpbmUgRlhBUkdCX1NFVFJHQk9SREVSRElCKHAsIGFyZ2IpICAgICAgICAgIFwKKyAgKCh1aW50OF90KikocCkpWzNdID0gKHVpbnQ4X3QpKGFyZ2IgPj4gMjQpLCAgIFwKKyAgKCh1aW50OF90KikocCkpWzBdID0gKHVpbnQ4X3QpKChhcmdiKSA+PiAxNiksIFwKKyAgKCh1aW50OF90KikocCkpWzFdID0gKHVpbnQ4X3QpKChhcmdiKSA+PiA4KSwgIFwKKyAgKCh1aW50OF90KikocCkpWzJdID0gKHVpbnQ4X3QpKGFyZ2IpCisjZGVmaW5lIEZYQVJHQl9HRVRSR0JPUkRFUkRJQihwKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgodWludDhfdCopKHApKVsyXSkgfCAoKCh1aW50OF90KikocCkpWzFdIDw8IDgpIHwgXAorICAgICAgKCgodWludDhfdCopKHApKVswXSA8PCAxNikgfCAoKCh1aW50OF90KikocCkpWzNdIDw8IDI0KQorI2RlZmluZSBGWEFSR0JfUkdCT1JERVJDT1BZKGRlc3QsIHNyYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKigodWludDhfdCopKGRlc3QpICsgMykgPSAqKCh1aW50OF90Kikoc3JjKSArIDMpLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICoodWludDhfdCopKGRlc3QpID0gKigodWludDhfdCopKHNyYykgKyAyKSwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAqKCh1aW50OF90KikoZGVzdCkgKyAxKSA9ICooKHVpbnQ4X3QqKShzcmMpICsgMSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgKigodWludDhfdCopKGRlc3QpICsgMikgPSAqKCh1aW50OF90Kikoc3JjKSkKICNkZWZpbmUgRlhBUkdCX1RPRElCKGFyZ2IpIChhcmdiKQotI2RlZmluZSBGWENNWUtfVE9ESUIoY215aykgKChGWF9CWVRFKSgoY215aykgPj4gMjQpIHwgKChGWF9CWVRFKSgoY215aykgPj4gMTYpKSA8PCA4IHwgKChGWF9CWVRFKSgoY215aykgPj4gOCkpIDw8IDE2IHwgKChGWF9CWVRFKShjbXlrKSA8PCAyNCkpCi0jZGVmaW5lIEZYQVJHQl9UT0JHUk9SREVSRElCKGFyZ2IpICgoRlhfQllURSkoYXJnYj4+MTYpIHwgKChGWF9CWVRFKShhcmdiPj44KSkgPDwgOCB8ICgoRlhfQllURSkoYXJnYikpIDw8IDE2IHwgKChGWF9CWVRFKShhcmdiPj4yNCkgPDwgMjQpKQotI2RlZmluZSBGWEdFVEZMQUdfQ09MT1JUWVBFKGZsYWcpCQkJKEZYX0JZVEUpKChmbGFnKT4+OCkKLSNkZWZpbmUgRlhHRVRGTEFHX0FMUEhBX0ZJTEwoZmxhZykJCQkoRlhfQllURSkoZmxhZykKLSNkZWZpbmUgRlhHRVRGTEFHX0FMUEhBX1NUUk9LRShmbGFnKQkJKEZYX0JZVEUpKChmbGFnKT4+MTYpCi0jZGVmaW5lIEZYU0VURkxBR19DT0xPUlRZUEUoZmxhZywgdmFsKQkJZmxhZyA9ICgoKHZhbCk8PDgpfChmbGFnJjB4ZmZmZjAwZmYpKQotI2RlZmluZSBGWFNFVEZMQUdfQUxQSEFfRklMTChmbGFnLCB2YWwpCQlmbGFnID0gKCh2YWwpfChmbGFnJjB4ZmZmZmZmMDApKQotI2RlZmluZSBGWFNFVEZMQUdfQUxQSEFfU1RST0tFKGZsYWcsIHZhbCkJZmxhZyA9ICgoKHZhbCk8PDE2KXwoZmxhZyYweGZmMDBmZmZmKSkKLWNsYXNzIENGWF9ESUJTb3VyY2UgCi17Ci1wdWJsaWM6CisjZGVmaW5lIEZYQ01ZS19UT0RJQihjbXlrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh1aW50OF90KSgoY215aykgPj4gMjQpIHwgKCh1aW50OF90KSgoY215aykgPj4gMTYpKSA8PCA4IHwgXAorICAgKCh1aW50OF90KSgoY215aykgPj4gOCkpIDw8IDE2IHwgKCh1aW50OF90KShjbXlrKSA8PCAyNCkpCisjZGVmaW5lIEZYQVJHQl9UT0JHUk9SREVSRElCKGFyZ2IpICAgICAgICAgICAgICAgICAgICAgICBcCisgICgodWludDhfdCkoYXJnYiA+PiAxNikgfCAoKHVpbnQ4X3QpKGFyZ2IgPj4gOCkpIDw8IDggfCBcCisgICAoKHVpbnQ4X3QpKGFyZ2IpKSA8PCAxNiB8ICgodWludDhfdCkoYXJnYiA+PiAyNCkgPDwgMjQpKQorI2RlZmluZSBGWEdFVEZMQUdfQ09MT1JUWVBFKGZsYWcpICh1aW50OF90KSgoZmxhZykgPj4gOCkKKyNkZWZpbmUgRlhHRVRGTEFHX0FMUEhBX0ZJTEwoZmxhZykgKHVpbnQ4X3QpKGZsYWcpCisjZGVmaW5lIEZYR0VURkxBR19BTFBIQV9TVFJPS0UoZmxhZykgKHVpbnQ4X3QpKChmbGFnKSA+PiAxNikKKyNkZWZpbmUgRlhTRVRGTEFHX0NPTE9SVFlQRShmbGFnLCB2YWwpIFwKKyAgZmxhZyA9ICgoKHZhbCkgPDwgOCkgfCAoZmxhZyAmIDB4ZmZmZjAwZmYpKQorI2RlZmluZSBGWFNFVEZMQUdfQUxQSEFfRklMTChmbGFnLCB2YWwpIGZsYWcgPSAoKHZhbCkgfCAoZmxhZyAmIDB4ZmZmZmZmMDApKQorI2RlZmluZSBGWFNFVEZMQUdfQUxQSEFfU1RST0tFKGZsYWcsIHZhbCkgXAorICBmbGFnID0gKCgodmFsKSA8PCAxNikgfCAoZmxhZyAmIDB4ZmYwMGZmZmYpKQorY2xhc3MgQ0ZYX0RJQlNvdXJjZSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5DRlhfRElCU291cmNlKCk7CiAKLSAgICB2aXJ0dWFsCQkJfkNGWF9ESUJTb3VyY2UoKTsKKyAgaW50IEdldFdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9XaWR0aDsgfQogCisgIGludCBHZXRIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX0hlaWdodDsgfQogCisgIEZYRElCX0Zvcm1hdCBHZXRGb3JtYXQoKSBjb25zdCB7CisgICAgcmV0dXJuIChGWERJQl9Gb3JtYXQpKG1fQWxwaGFGbGFnICogMHgxMDAgKyBtX2JwcCk7CisgIH0KIAotICAgIGludAkJCQlHZXRXaWR0aCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9XaWR0aDsKLSAgICB9CisgIEZYX0RXT1JEIEdldFBpdGNoKCkgY29uc3QgeyByZXR1cm4gbV9QaXRjaDsgfQogCi0gICAgaW50CQkJCUdldEhlaWdodCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9IZWlnaHQ7Ci0gICAgfQorICBGWF9EV09SRCogR2V0UGFsZXR0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcFBhbGV0dGU7IH0KIAotICAgIEZYRElCX0Zvcm1hdAlHZXRGb3JtYXQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIChGWERJQl9Gb3JtYXQpKG1fQWxwaGFGbGFnICogMHgxMDAgKyBtX2JwcCk7Ci0gICAgfQorICB2aXJ0dWFsIHVpbnQ4X3QqIEdldEJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIE5VTEw7IH0KIAotICAgIEZYX0RXT1JECQlHZXRQaXRjaCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9QaXRjaDsKLSAgICB9CisgIHZpcnR1YWwgY29uc3QgdWludDhfdCogR2V0U2NhbmxpbmUoaW50IGxpbmUpIGNvbnN0ID0gMDsKIAotICAgIEZYX0RXT1JEKgkJR2V0UGFsZXR0ZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wUGFsZXR0ZTsKLSAgICB9CisgIHZpcnR1YWwgRlhfQk9PTCBTa2lwVG9TY2FubGluZShpbnQgbGluZSwgSUZYX1BhdXNlKiBwUGF1c2UpIGNvbnN0IHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KIAorICB2aXJ0dWFsIHZvaWQgRG93blNhbXBsZVNjYW5saW5lKGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9icHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmxpcFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF93aWR0aCkgY29uc3QgPSAwOwogCisgIHZpcnR1YWwgdm9pZCBTZXREb3duU2FtcGxlU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIGNvbnN0IHt9CiAKLSAgICB2aXJ0dWFsCUZYX0xQQllURQlHZXRCdWZmZXIoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQorICBpbnQgR2V0QlBQKCkgY29uc3QgeyByZXR1cm4gbV9icHA7IH0KIAotICAgIHZpcnR1YWwgRlhfTFBDQllURQlHZXRTY2FubGluZShpbnQgbGluZSkgY29uc3QgPSAwOworICAvLyBUT0RPKHRoZXN0aWcpOiBJbnZlc3RpZ2F0ZSB0aGlzLiBHaXZlbiB0aGUgcG9zc2libGUgdmFsdWVzIG9mIEZYRElCX0Zvcm1hdCwKKyAgLy8gaXQgZmVlbHMgYXMgdGhvdWdoIHRoaXMgc2hvdWxkIGJlIGltcGxlbWVudGVkIGFzICEhKG1fQWxwaGFGbGFnICYgMSkgYW5kCisgIC8vIElzT3BhcXVlSW1hZ2UoKSBiZWxvdyBzaG91bGQgbmV2ZXIgYmUgYWJsZSB0byByZXR1cm4gVFJVRS4KKyAgRlhfQk9PTCBJc0FscGhhTWFzaygpIGNvbnN0IHsgcmV0dXJuIG1fQWxwaGFGbGFnID09IDE7IH0KIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJU2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsIElGWF9QYXVzZSogcFBhdXNlKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KKyAgRlhfQk9PTCBIYXNBbHBoYSgpIGNvbnN0IHsgcmV0dXJuICEhKG1fQWxwaGFGbGFnICYgMik7IH0KIAotICAgIHZpcnR1YWwgdm9pZAkJRG93blNhbXBsZVNjYW5saW5lKGludCBsaW5lLCBGWF9MUEJZVEUgZGVzdF9zY2FuLCBpbnQgZGVzdF9icHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIEZYX0JPT0wgYkZsaXBYLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF93aWR0aCkgY29uc3QgPSAwOworICBGWF9CT09MIElzT3BhcXVlSW1hZ2UoKSBjb25zdCB7IHJldHVybiAhKG1fQWxwaGFGbGFnICYgMyk7IH0KIAotICAgIHZpcnR1YWwgdm9pZAkJU2V0RG93blNhbXBsZVNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSBjb25zdCB7fQorICBGWF9CT09MIElzQ215a0ltYWdlKCkgY29uc3QgeyByZXR1cm4gISEobV9BbHBoYUZsYWcgJiA0KTsgfQogCi0gICAgaW50CQkJCUdldEJQUCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9icHA7Ci0gICAgfQorICBpbnQgR2V0UGFsZXR0ZVNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIElzQWxwaGFNYXNrKCkgPyAwIDogKG1fYnBwID09IDEgPyAyIDogKG1fYnBwID09IDggPyAyNTYgOiAwKSk7CisgIH0KIAotICAgIEZYX0JPT0wJCQlJc0FscGhhTWFzaygpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9BbHBoYUZsYWcgPT0gMTsKLSAgICB9CisgIEZYX0RXT1JEIEdldFBhbGV0dGVFbnRyeShpbnQgaW5kZXgpIGNvbnN0OwogCi0gICAgRlhfQk9PTAkJCUhhc0FscGhhKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0FscGhhRmxhZyAmIDIgPyBUUlVFIDogRkFMU0U7Ci0gICAgfQorICB2b2lkIFNldFBhbGV0dGVFbnRyeShpbnQgaW5kZXgsIEZYX0RXT1JEIGNvbG9yKTsKKyAgRlhfRFdPUkQgR2V0UGFsZXR0ZUFyZ2IoaW50IGluZGV4KSBjb25zdCB7IHJldHVybiBHZXRQYWxldHRlRW50cnkoaW5kZXgpOyB9CisgIHZvaWQgU2V0UGFsZXR0ZUFyZ2IoaW50IGluZGV4LCBGWF9EV09SRCBjb2xvcikgeworICAgIFNldFBhbGV0dGVFbnRyeShpbmRleCwgY29sb3IpOworICB9CiAKLSAgICBGWF9CT09MCQkJSXNPcGFxdWVJbWFnZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gIShtX0FscGhhRmxhZyAmIDMpOwotICAgIH0KKyAgdm9pZCBDb3B5UGFsZXR0ZShjb25zdCBGWF9EV09SRCogcFNyY1BhbCwgRlhfRFdPUkQgc2l6ZSA9IDI1Nik7CiAKLSAgICBGWF9CT09MCQkJSXNDbXlrSW1hZ2UoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fQWxwaGFGbGFnICYgNCA/IFRSVUUgOiBGQUxTRTsKLSAgICB9CisgIENGWF9ESUJpdG1hcCogQ2xvbmUoY29uc3QgRlhfUkVDVCogcENsaXAgPSBOVUxMKSBjb25zdDsKIAorICBDRlhfRElCaXRtYXAqIENsb25lQ29udmVydChGWERJQl9Gb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcCA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKSBjb25zdDsKIAorICBDRlhfRElCaXRtYXAqIFN0cmV0Y2hUbyhpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwID0gTlVMTCkgY29uc3Q7CiAKLSAgICBpbnQJCQkJR2V0UGFsZXR0ZVNpemUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIElzQWxwaGFNYXNrKCkgPyAwIDogKG1fYnBwID09IDEgPyAyIDogKG1fYnBwID09IDggPyAyNTYgOiAwKSk7Ci0gICAgfQorICBDRlhfRElCaXRtYXAqIFRyYW5zZm9ybVRvKGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcCA9IE5VTEwpIGNvbnN0OwogCi0gICAgRlhfRFdPUkQJCUdldFBhbGV0dGVFbnRyeShpbnQgaW5kZXgpIGNvbnN0OworICBDRlhfRElCaXRtYXAqIEdldEFscGhhTWFzayhjb25zdCBGWF9SRUNUKiBwQ2xpcCA9IE5VTEwpIGNvbnN0OwogCi0gICAgdm9pZAkJCVNldFBhbGV0dGVFbnRyeShpbnQgaW5kZXgsIEZYX0RXT1JEIGNvbG9yKTsKLSAgICBGWF9EV09SRAkJR2V0UGFsZXR0ZUFyZ2IoaW50IGluZGV4KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIEdldFBhbGV0dGVFbnRyeShpbmRleCk7Ci0gICAgfQotICAgIHZvaWQJCQlTZXRQYWxldHRlQXJnYihpbnQgaW5kZXgsIEZYX0RXT1JEIGNvbG9yKQotICAgIHsKLSAgICAgICAgU2V0UGFsZXR0ZUVudHJ5KGluZGV4LCBjb2xvcik7Ci0gICAgfQorICBGWF9CT09MIENvcHlBbHBoYU1hc2soY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEFscGhhTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwID0gTlVMTCk7CiAKLSAgICB2b2lkCQkJQ29weVBhbGV0dGUoY29uc3QgRlhfRFdPUkQqIHBTcmNQYWwsIEZYX0RXT1JEIHNpemUgPSAyNTYpOworICBDRlhfRElCaXRtYXAqIFN3YXBYWShGWF9CT09MIGJYRmxpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiWUZsaXAsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwID0gTlVMTCkgY29uc3Q7CiAKKyAgQ0ZYX0RJQml0bWFwKiBGbGlwSW1hZ2UoRlhfQk9PTCBiWEZsaXAsIEZYX0JPT0wgYllGbGlwKSBjb25zdDsKIAotICAgIENGWF9ESUJpdG1hcCoJQ2xvbmUoY29uc3QgRlhfUkVDVCogcENsaXAgPSBOVUxMKSBjb25zdDsKKyAgdm9pZCBHZXRPdmVybGFwUmVjdChpbnQmIGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQmIGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgIGludCYgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgaW50JiBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY193aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQmIHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgIGludCYgc3JjX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24pOwogCi0gICAgQ0ZYX0RJQml0bWFwKglDbG9uZUNvbnZlcnQoRlhESUJfRm9ybWF0IGZvcm1hdCwgY29uc3QgRlhfUkVDVCogcENsaXAgPSBOVUxMLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCkgY29uc3Q7CisgIENGWF9ESUJpdG1hcCogbV9wQWxwaGFNYXNrOwogCi0gICAgQ0ZYX0RJQml0bWFwKglTdHJldGNoVG8oaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgRlhfRFdPUkQgZmxhZ3MgPSAwLCBjb25zdCBGWF9SRUNUKiBwQ2xpcCA9IE5VTEwpIGNvbnN0OworIHByb3RlY3RlZDoKKyAgQ0ZYX0RJQlNvdXJjZSgpOwogCisgIGludCBtX1dpZHRoOwogCi0gICAgQ0ZYX0RJQml0bWFwKglUcmFuc2Zvcm1Ubyhjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBpbnQmIGxlZnQsIGludCAmdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncyA9IDAsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwID0gTlVMTCkgY29uc3Q7CisgIGludCBtX0hlaWdodDsKIAotICAgIENGWF9ESUJpdG1hcCoJR2V0QWxwaGFNYXNrKGNvbnN0IEZYX1JFQ1QqIHBDbGlwID0gTlVMTCkgY29uc3Q7CisgIGludCBtX2JwcDsKIAotICAgIEZYX0JPT0wJCQlDb3B5QWxwaGFNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBBbHBoYU1hc2ssIGNvbnN0IEZYX1JFQ1QqIHBDbGlwID0gTlVMTCk7CisgIEZYX0RXT1JEIG1fQWxwaGFGbGFnOwogCi0gICAgQ0ZYX0RJQml0bWFwKglTd2FwWFkoRlhfQk9PTCBiWEZsaXAsIEZYX0JPT0wgYllGbGlwLCBjb25zdCBGWF9SRUNUKiBwQ2xpcCA9IE5VTEwpIGNvbnN0OworICBGWF9EV09SRCBtX1BpdGNoOwogCi0gICAgQ0ZYX0RJQml0bWFwKglGbGlwSW1hZ2UoRlhfQk9PTCBiWEZsaXAsIEZYX0JPT0wgYllGbGlwKSBjb25zdDsKKyAgRlhfRFdPUkQqIG1fcFBhbGV0dGU7CiAKLSAgICB2b2lkCQkJR2V0T3ZlcmxhcFJlY3QoaW50JiBkZXN0X2xlZnQsIGludCYgZGVzdF90b3AsIGludCYgd2lkdGgsIGludCYgaGVpZ2h0LCBpbnQgc3JjX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2hlaWdodCwgaW50JiBzcmNfbGVmdCwgaW50JiBzcmNfdG9wLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24pOworICB2b2lkIEJ1aWxkUGFsZXR0ZSgpOwogCi0gICAgQ0ZYX0RJQml0bWFwKgltX3BBbHBoYU1hc2s7Ci1wcm90ZWN0ZWQ6CisgIEZYX0JPT0wgQnVpbGRBbHBoYU1hc2soKTsKIAotICAgIENGWF9ESUJTb3VyY2UoKTsKKyAgaW50IEZpbmRQYWxldHRlKEZYX0RXT1JEIGNvbG9yKSBjb25zdDsKIAotICAgIGludAkJCQltX1dpZHRoOwotCi0gICAgaW50CQkJCW1fSGVpZ2h0OwotCi0gICAgaW50CQkJCW1fYnBwOwotCi0gICAgRlhfRFdPUkQJCW1fQWxwaGFGbGFnOwotCi0gICAgRlhfRFdPUkQJCW1fUGl0Y2g7Ci0KLSAgICBGWF9EV09SRCoJCW1fcFBhbGV0dGU7Ci0KLSAgICB2b2lkCQkJQnVpbGRQYWxldHRlKCk7Ci0KLSAgICBGWF9CT09MCQkJQnVpbGRBbHBoYU1hc2soKTsKLQotICAgIGludAkJCQlGaW5kUGFsZXR0ZShGWF9EV09SRCBjb2xvcikgY29uc3Q7Ci0KLSAgICB2b2lkCQkJR2V0UGFsZXR0ZShGWF9EV09SRCogcGFsLCBpbnQgYWxwaGEpIGNvbnN0OworICB2b2lkIEdldFBhbGV0dGUoRlhfRFdPUkQqIHBhbCwgaW50IGFscGhhKSBjb25zdDsKIH07Ci1jbGFzcyBDRlhfRElCaXRtYXAgOiBwdWJsaWMgQ0ZYX0RJQlNvdXJjZQotewotcHVibGljOgorY2xhc3MgQ0ZYX0RJQml0bWFwIDogcHVibGljIENGWF9ESUJTb3VyY2UgeworIHB1YmxpYzoKKyAgQ0ZYX0RJQml0bWFwKCk7CisgIGV4cGxpY2l0IENGWF9ESUJpdG1hcChjb25zdCBDRlhfRElCaXRtYXAmIHNyYyk7CisgIH5DRlhfRElCaXRtYXAoKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgfkNGWF9ESUJpdG1hcCgpOworICBGWF9CT09MIENyZWF0ZShpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBCdWZmZXIgPSBOVUxMLAorICAgICAgICAgICAgICAgICBpbnQgcGl0Y2ggPSAwKTsKIAotICAgIENGWF9ESUJpdG1hcCgpOworICBGWF9CT09MIENvcHkoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYyk7CiAKLSAgICBDRlhfRElCaXRtYXAoY29uc3QgQ0ZYX0RJQml0bWFwJiBzcmMpOworICAvLyBDRlhfRElCU291cmNlCisgIHVpbnQ4X3QqIEdldEJ1ZmZlcigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1fcEJ1ZmZlcjsgfQorICBjb25zdCB1aW50OF90KiBHZXRTY2FubGluZShpbnQgbGluZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBtX3BCdWZmZXIgPyBtX3BCdWZmZXIgKyBsaW5lICogbV9QaXRjaCA6IE5VTEw7CisgIH0KKyAgdm9pZCBEb3duU2FtcGxlU2NhbmxpbmUoaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfYnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmxpcFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3dpZHRoKSBjb25zdCBvdmVycmlkZTsKIAotICAgIEZYX0JPT0wJCQlDcmVhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgZm9ybWF0LCBGWF9MUEJZVEUgcEJ1ZmZlciA9IE5VTEwsIGludCBwaXRjaCA9IDApOworICB2b2lkIFRha2VPdmVyKENGWF9ESUJpdG1hcCogcFNyY0JpdG1hcCk7CiAKLSAgICBGWF9CT09MCQkJQ29weShjb25zdCBDRlhfRElCU291cmNlKiBwU3JjKTsKKyAgRlhfQk9PTCBDb252ZXJ0Rm9ybWF0KEZYRElCX0Zvcm1hdCBmb3JtYXQsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotICAgIHZpcnR1YWwJRlhfTFBCWVRFCUdldEJ1ZmZlcigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wQnVmZmVyOwotICAgIH0KKyAgdm9pZCBDbGVhcihGWF9EV09SRCBjb2xvcik7CiAKLSAgICB2aXJ0dWFsIEZYX0xQQ0JZVEUJR2V0U2NhbmxpbmUoaW50IGxpbmUpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wQnVmZmVyID8gbV9wQnVmZmVyICsgbGluZSAqIG1fUGl0Y2ggOiBOVUxMOwotICAgIH0KKyAgRlhfRFdPUkQgR2V0UGl4ZWwoaW50IHgsIGludCB5KSBjb25zdDsKIAotICAgIHZpcnR1YWwgdm9pZAlEb3duU2FtcGxlU2NhbmxpbmUoaW50IGxpbmUsIEZYX0xQQllURSBkZXN0X3NjYW4sIGludCBkZXN0X2JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBGWF9CT09MIGJGbGlwWCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfd2lkdGgpIGNvbnN0OworICB2b2lkIFNldFBpeGVsKGludCB4LCBpbnQgeSwgRlhfRFdPUkQgY29sb3IpOwogCi0gICAgdm9pZAkJCVRha2VPdmVyKENGWF9ESUJpdG1hcCogcFNyY0JpdG1hcCk7CisgIEZYX0JPT0wgTG9hZENoYW5uZWwoRlhESUJfQ2hhbm5lbCBkZXN0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0NoYW5uZWwgc3JjQ2hhbm5lbCk7CiAKLSAgICBGWF9CT09MCQkJQ29udmVydEZvcm1hdChGWERJQl9Gb3JtYXQgZm9ybWF0LCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CisgIEZYX0JPT0wgTG9hZENoYW5uZWwoRlhESUJfQ2hhbm5lbCBkZXN0Q2hhbm5lbCwgaW50IHZhbHVlKTsKIAotICAgIHZvaWQJCQlDbGVhcihGWF9EV09SRCBjb2xvcik7CisgIEZYX0JPT0wgTXVsdGlwbHlBbHBoYShpbnQgYWxwaGEpOwogCi0gICAgRlhfRFdPUkQJCUdldFBpeGVsKGludCB4LCBpbnQgeSkgY29uc3Q7CisgIEZYX0JPT0wgTXVsdGlwbHlBbHBoYShjb25zdCBDRlhfRElCU291cmNlKiBwQWxwaGFNYXNrKTsKIAotICAgIHZvaWQJCQlTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yKTsKKyAgRlhfQk9PTCBUcmFuc2ZlckJpdG1hcChpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBGWF9CT09MCQkJTG9hZENoYW5uZWwoRlhESUJfQ2hhbm5lbCBkZXN0Q2hhbm5lbCwgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgRlhESUJfQ2hhbm5lbCBzcmNDaGFubmVsKTsKKyAgRlhfQk9PTCBDb21wb3NpdGVCaXRtYXAoaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24gPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCi0gICAgRlhfQk9PTAkJCUxvYWRDaGFubmVsKEZYRElCX0NoYW5uZWwgZGVzdENoYW5uZWwsIGludCB2YWx1ZSk7CisgIEZYX0JPT0wgVHJhbnNmZXJNYXNrKGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3AsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCi0gICAgRlhfQk9PTAkJCU11bHRpcGx5QWxwaGEoaW50IGFscGhhKTsKKyAgRlhfQk9PTCBDb21wb3NpdGVNYXNrKGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24gPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBGWF9CT09MCQkJTXVsdGlwbHlBbHBoYShjb25zdCBDRlhfRElCU291cmNlKiBwQWxwaGFNYXNrKTsKKyAgRlhfQk9PTCBDb21wb3NpdGVSZWN0KGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBGWF9CT09MCQkJVHJhbnNmZXJCaXRtYXAoaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKyAgRlhfQk9PTCBDb252ZXJ0Q29sb3JTY2FsZShGWF9EV09SRCBmb3JlY29sb3IsIEZYX0RXT1JEIGJhY2tjb2xvcik7CiAKLSAgICBGWF9CT09MCQkJQ29tcG9zaXRlQml0bWFwKGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24gPSBOVUxMLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgPSBGQUxTRSwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOworICBGWF9CT09MIERpdGhlckZTKGNvbnN0IEZYX0RXT1JEKiBwUGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgcGFsX3NpemUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFJlY3QgPSBOVUxMKTsKIAotICAgIEZYX0JPT0wJCQlUcmFuc2Zlck1hc2soaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwTWFzaywgRlhfRFdPUkQgY29sb3IsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOworIHByb3RlY3RlZDoKKyAgdWludDhfdCogbV9wQnVmZmVyOwogCi0gICAgRlhfQk9PTAkJCUNvbXBvc2l0ZU1hc2soaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcE1hc2ssIEZYX0RXT1JEIGNvbG9yLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24gPSBOVUxMLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgPSBGQUxTRSwgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CisgIEZYX0JPT0wgbV9iRXh0QnVmOwogCi0gICAgRlhfQk9PTAkJCUNvbXBvc2l0ZVJlY3QoaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYX0RXT1JEIGNvbG9yLCBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKLQotICAgIEZYX0JPT0wJCQlDb252ZXJ0Q29sb3JTY2FsZShGWF9EV09SRCBmb3JlY29sb3IsIEZYX0RXT1JEIGJhY2tjb2xvcik7Ci0KLSAgICBGWF9CT09MCQkJRGl0aGVyRlMoY29uc3QgRlhfRFdPUkQqIHBQYWxldHRlLCBpbnQgcGFsX3NpemUsIGNvbnN0IEZYX1JFQ1QqIHBSZWN0ID0gTlVMTCk7Ci1wcm90ZWN0ZWQ6Ci0KLSAgICBGWF9MUEJZVEUJCW1fcEJ1ZmZlcjsKLQotICAgIEZYX0JPT0wJCQltX2JFeHRCdWY7Ci0KLSAgICBGWF9CT09MCQkJR2V0R3JheURhdGEodm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOworICBGWF9CT09MIEdldEdyYXlEYXRhKHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIH07Ci1jbGFzcyBDRlhfRElCRXh0cmFjdG9yIAotewotcHVibGljOgorY2xhc3MgQ0ZYX0RJQkV4dHJhY3RvciB7CisgcHVibGljOgorICBDRlhfRElCRXh0cmFjdG9yKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMpOwogCi0gICAgQ0ZYX0RJQkV4dHJhY3Rvcihjb25zdCBDRlhfRElCU291cmNlKiBwU3JjKTsKKyAgfkNGWF9ESUJFeHRyYWN0b3IoKTsKIAotICAgIH5DRlhfRElCRXh0cmFjdG9yKCk7CisgIG9wZXJhdG9yIENGWF9ESUJpdG1hcCooKSB7IHJldHVybiBtX3BCaXRtYXA7IH0KIAotICAgIG9wZXJhdG9yIENGWF9ESUJpdG1hcCooKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEJpdG1hcDsKLSAgICB9Ci1wcml2YXRlOgotCi0gICAgQ0ZYX0RJQml0bWFwKgkJCW1fcEJpdG1hcDsKKyBwcml2YXRlOgorICBDRlhfRElCaXRtYXAqIG1fcEJpdG1hcDsKIH07CisKIHR5cGVkZWYgQ0ZYX0NvdW50UmVmPENGWF9ESUJpdG1hcD4gQ0ZYX0RJQml0bWFwUmVmOwotY2xhc3MgQ0ZYX0ZpbHRlcmVkRElCIDogcHVibGljIENGWF9ESUJTb3VyY2UKLXsKLXB1YmxpYzoKK2NsYXNzIENGWF9GaWx0ZXJlZERJQiA6IHB1YmxpYyBDRlhfRElCU291cmNlIHsKKyBwdWJsaWM6CisgIENGWF9GaWx0ZXJlZERJQigpOworICB+Q0ZYX0ZpbHRlcmVkRElCKCkgb3ZlcnJpZGU7CiAKLSAgICBDRlhfRmlsdGVyZWRESUIoKTsKKyAgdm9pZCBMb2FkU3JjKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsIEZYX0JPT0wgYkF1dG9Ecm9wU3JjID0gRkFMU0UpOwogCi0gICAgfkNGWF9GaWx0ZXJlZERJQigpOworICB2aXJ0dWFsIEZYRElCX0Zvcm1hdCBHZXREZXN0Rm9ybWF0KCkgPSAwOwogCi0gICAgdm9pZAkJCQkJTG9hZFNyYyhjb25zdCBDRlhfRElCU291cmNlKiBwU3JjLCBGWF9CT09MIGJBdXRvRHJvcFNyYyA9IEZBTFNFKTsKKyAgdmlydHVhbCBGWF9EV09SRCogR2V0RGVzdFBhbGV0dGUoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYRElCX0Zvcm1hdAlHZXREZXN0Rm9ybWF0KCkgPSAwOworICB2aXJ0dWFsIHZvaWQgVHJhbnNsYXRlU2NhbmxpbmUodWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0RXT1JEKgkJR2V0RGVzdFBhbGV0dGUoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBUcmFuc2xhdGVEb3duU2FtcGxlcyh1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCkgY29uc3QgPSAwOwogCisgcHJvdGVjdGVkOgorICAvLyBDRlhfRElCU291cmNlCisgIGNvbnN0IHVpbnQ4X3QqIEdldFNjYW5saW5lKGludCBsaW5lKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBEb3duU2FtcGxlU2NhbmxpbmUoaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfYnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmxpcFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3dpZHRoKSBjb25zdCBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgdm9pZAkJCVRyYW5zbGF0ZVNjYW5saW5lKEZYX0xQQllURSBkZXN0X2J1ZiwgRlhfTFBDQllURSBzcmNfYnVmKSBjb25zdCA9IDA7CisgIGNvbnN0IENGWF9ESUJTb3VyY2UqIG1fcFNyYzsKIAotICAgIHZpcnR1YWwgdm9pZAkJCVRyYW5zbGF0ZURvd25TYW1wbGVzKEZYX0xQQllURSBkZXN0X2J1ZiwgRlhfTFBDQllURSBzcmNfYnVmLCBpbnQgcGl4ZWxzLCBpbnQgQnBwKSBjb25zdCA9IDA7Ci1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBGWF9MUENCWVRFCQlHZXRTY2FubGluZShpbnQgbGluZSkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkCQkJRG93blNhbXBsZVNjYW5saW5lKGludCBsaW5lLCBGWF9MUEJZVEUgZGVzdF9zY2FuLCBpbnQgZGVzdF9icHAsCi0gICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgRlhfQk9PTCBiRmxpcFgsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3dpZHRoKSBjb25zdDsKKyAgRlhfQk9PTCBtX2JBdXRvRHJvcFNyYzsKIAotICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqCW1fcFNyYzsKLQotICAgIEZYX0JPT0wJCQkJCW1fYkF1dG9Ecm9wU3JjOwotCi0gICAgRlhfTFBCWVRFCQkJCW1fcFNjYW5saW5lOworICB1aW50OF90KiBtX3BTY2FubGluZTsKIH07Ci1jbGFzcyBJRlhfU2NhbmxpbmVDb21wb3NlcgotewotcHVibGljOgotICAgIHZpcnR1YWwgfklGWF9TY2FubGluZUNvbXBvc2VyKCkgeyB9CiAKLSAgICB2aXJ0dWFsCXZvaWQJCUNvbXBvc2VTY2FubGluZShpbnQgbGluZSwgRlhfTFBDQllURSBzY2FubGluZSwgRlhfTFBDQllURSBzY2FuX2V4dHJhX2FscGhhID0gTlVMTCkgPSAwOworY2xhc3MgSUZYX1NjYW5saW5lQ29tcG9zZXIgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SUZYX1NjYW5saW5lQ29tcG9zZXIoKSB7fQogCi0gICAgdmlydHVhbCBGWF9CT09MCQlTZXRJbmZvKGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQsIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgQ29tcG9zZVNjYW5saW5lKGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNjYW5saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNjYW5fZXh0cmFfYWxwaGEgPSBOVUxMKSA9IDA7CisKKyAgdmlydHVhbCBGWF9CT09MIFNldEluZm8oaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBTcmNQYWxldHRlKSA9IDA7CiB9OwotY2xhc3MgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvciAKLXsKLXB1YmxpYzoKLSAgICBDRlhfU2NhbmxpbmVDb21wb3NpdG9yKCk7CitjbGFzcyBDRlhfU2NhbmxpbmVDb21wb3NpdG9yIHsKKyBwdWJsaWM6CisgIENGWF9TY2FubGluZUNvbXBvc2l0b3IoKTsKIAotICAgIH5DRlhfU2NhbmxpbmVDb21wb3NpdG9yKCk7CisgIH5DRlhfU2NhbmxpbmVDb21wb3NpdG9yKCk7CiAKLSAgICBGWF9CT09MCQkJCUluaXQoRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgRlhfSU5UMzIgd2lkdGgsIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFza19jb2xvciwgaW50IGJsZW5kX3R5cGUsIEZYX0JPT0wgYkNsaXAsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciA9IEZBTFNFLCBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKyAgRlhfQk9PTCBJbml0KEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwKKyAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LAorICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSwKKyAgICAgICAgICAgICAgIEZYX0RXT1JEIG1hc2tfY29sb3IsCisgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgIEZYX0JPT0wgYkNsaXAsCisgICAgICAgICAgICAgICBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgPSBGQUxTRSwKKyAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAorICB2b2lkIENvbXBvc2l0ZVJnYkJpdG1hcExpbmUodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfZXh0cmFfYWxwaGEgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0X2V4dHJhX2FscGhhID0gTlVMTCk7CiAKLSAgICB2b2lkCQkJCUNvbXBvc2l0ZVJnYkJpdG1hcExpbmUoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgaW50IHdpZHRoLCBGWF9MUENCWVRFIGNsaXBfc2NhbiwKLSAgICAgICAgICAgIEZYX0xQQ0JZVEUgc3JjX2V4dHJhX2FscGhhID0gTlVMTCwgRlhfTFBCWVRFIGRzdF9leHRyYV9hbHBoYSA9IE5VTEwpOworICB2b2lkIENvbXBvc2l0ZVBhbEJpdG1hcExpbmUodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfZXh0cmFfYWxwaGEgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0X2V4dHJhX2FscGhhID0gTlVMTCk7CiAKKyAgdm9pZCBDb21wb3NpdGVCeXRlTWFza0xpbmUodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdF9leHRyYV9hbHBoYSA9IE5VTEwpOwogCi0gICAgdm9pZAkJCQlDb21wb3NpdGVQYWxCaXRtYXBMaW5lKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCBzcmNfbGVmdCwgaW50IHdpZHRoLCBGWF9MUENCWVRFIGNsaXBfc2NhbiwKLSAgICAgICAgICAgIEZYX0xQQ0JZVEUgc3JjX2V4dHJhX2FscGhhID0gTlVMTCwgRlhfTFBCWVRFIGRzdF9leHRyYV9hbHBoYSA9IE5VTEwpOworICB2b2lkIENvbXBvc2l0ZUJpdE1hc2tMaW5lKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3RfZXh0cmFfYWxwaGEgPSBOVUxMKTsKIAorIHByb3RlY3RlZDoKKyAgaW50IG1fVHJhbnNwYXJlbmN5OworICBGWERJQl9Gb3JtYXQgbV9TcmNGb3JtYXQsIG1fRGVzdEZvcm1hdDsKKyAgRlhfRFdPUkQqIG1fcFNyY1BhbGV0dGU7CiAKLSAgICB2b2lkCQkJCUNvbXBvc2l0ZUJ5dGVNYXNrTGluZShGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUENCWVRFIHNyY19zY2FuLCBpbnQgd2lkdGgsIEZYX0xQQ0JZVEUgY2xpcF9zY2FuLAotICAgICAgICAgICAgRlhfTFBCWVRFIGRzdF9leHRyYV9hbHBoYSA9IE5VTEwpOwotCi0KLSAgICB2b2lkCQkJCUNvbXBvc2l0ZUJpdE1hc2tMaW5lKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCBzcmNfbGVmdCwgaW50IHdpZHRoLCBGWF9MUENCWVRFIGNsaXBfc2NhbiwKLSAgICAgICAgICAgIEZYX0xQQllURSBkc3RfZXh0cmFfYWxwaGEgPSBOVUxMKTsKLXByb3RlY3RlZDoKLSAgICBpbnQJCQkJCW1fVHJhbnNwYXJlbmN5OwotICAgIEZYRElCX0Zvcm1hdAkJbV9TcmNGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBtX0Rlc3RGb3JtYXQ7Ci0gICAgRlhfRFdPUkQqCQkJbV9wU3JjUGFsZXR0ZTsKLQotICAgIGludAkJCQkJbV9NYXNrQWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBtX01hc2tSZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBtX01hc2tHcmVlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fTWFza0JsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBtX01hc2tCbGFjazsKLSAgICBpbnQJCQkJCW1fQmxlbmRUeXBlOwotICAgIHZvaWQqCQkJCW1fcEljY1RyYW5zZm9ybTsKLSAgICBGWF9MUEJZVEUJCQltX3BDYWNoZVNjYW5saW5lOwotICAgIGludAkJCQkJbV9DYWNoZVNpemU7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICBtX2JSZ2JCeXRlT3JkZXI7CisgIGludCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLCBtX01hc2tHcmVlbiwgbV9NYXNrQmx1ZSwgbV9NYXNrQmxhY2s7CisgIGludCBtX0JsZW5kVHlwZTsKKyAgdm9pZCogbV9wSWNjVHJhbnNmb3JtOworICB1aW50OF90KiBtX3BDYWNoZVNjYW5saW5lOworICBpbnQgbV9DYWNoZVNpemU7CisgIEZYX0JPT0wgbV9iUmdiQnl0ZU9yZGVyOwogfTsKLWNsYXNzIENGWF9CaXRtYXBDb21wb3NlciA6IHB1YmxpYyBJRlhfU2NhbmxpbmVDb21wb3NlcgotewotcHVibGljOgogCi0gICAgQ0ZYX0JpdG1hcENvbXBvc2VyKCk7CitjbGFzcyBDRlhfQml0bWFwQ29tcG9zZXIgOiBwdWJsaWMgSUZYX1NjYW5saW5lQ29tcG9zZXIgeworIHB1YmxpYzoKKyAgQ0ZYX0JpdG1hcENvbXBvc2VyKCk7CisgIH5DRlhfQml0bWFwQ29tcG9zZXIoKSBvdmVycmlkZTsKIAotICAgIH5DRlhfQml0bWFwQ29tcG9zZXIoKTsKKyAgdm9pZCBDb21wb3NlKENGWF9ESUJpdG1hcCogcERlc3QsCisgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCisgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLAorICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFza19jb2xvciwKKyAgICAgICAgICAgICAgIEZYX1JFQ1QmIGRlc3RfcmVjdCwKKyAgICAgICAgICAgICAgIEZYX0JPT0wgYlZlcnRpY2FsLAorICAgICAgICAgICAgICAgRlhfQk9PTCBiRmxpcFgsCisgICAgICAgICAgICAgICBGWF9CT09MIGJGbGlwWSwKKyAgICAgICAgICAgICAgIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciA9IEZBTFNFLAorICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsCisgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7CiAKKyAgLy8gSUZYX1NjYW5saW5lQ29tcG9zZXIKKyAgRlhfQk9PTCBTZXRJbmZvKGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSkgb3ZlcnJpZGU7CiAKLSAgICB2b2lkCQkJCUNvbXBvc2UoQ0ZYX0RJQml0bWFwKiBwRGVzdCwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLCBpbnQgYml0bWFwX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtYXNrX2NvbG9yLCBGWF9SRUNUJiBkZXN0X3JlY3QsIEZYX0JPT0wgYlZlcnRpY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGbGlwWCwgRlhfQk9PTCBiRmxpcFksIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciA9IEZBTFNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7CisgIHZvaWQgQ29tcG9zZVNjYW5saW5lKGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzY2FubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2Nhbl9leHRyYV9hbHBoYSkgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVNldEluZm8oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlKTsKLQotCi0gICAgdmlydHVhbAl2b2lkCQlDb21wb3NlU2NhbmxpbmUoaW50IGxpbmUsIEZYX0xQQ0JZVEUgc2NhbmxpbmUsIEZYX0xQQ0JZVEUgc2Nhbl9leHRyYV9hbHBoYSk7Ci1wcm90ZWN0ZWQ6Ci0KLSAgICB2b2lkCQkJCURvQ29tcG9zZShGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUENCWVRFIHNyY19zY2FuLCBpbnQgZGVzdF93aWR0aCwgRlhfTFBDQllURSBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBDQllURSBzcmNfZXh0cmFfYWxwaGEgPSBOVUxMLCBGWF9MUEJZVEUgZHN0X2V4dHJhX2FscGhhID0gTlVMTCk7Ci0gICAgQ0ZYX0RJQml0bWFwKgkJbV9wQml0bWFwOwotICAgIGNvbnN0IENGWF9DbGlwUmduKgltX3BDbGlwUmduOwotICAgIEZYRElCX0Zvcm1hdAkJbV9TcmNGb3JtYXQ7Ci0gICAgaW50CQkJCQltX0Rlc3RMZWZ0LCBtX0Rlc3RUb3AsIG1fRGVzdFdpZHRoLCBtX0Rlc3RIZWlnaHQsIG1fQml0bWFwQWxwaGE7Ci0gICAgRlhfRFdPUkQJCQltX01hc2tDb2xvcjsKLSAgICBjb25zdCBDRlhfRElCaXRtYXAqCW1fcENsaXBNYXNrOwotICAgIENGWF9TY2FubGluZUNvbXBvc2l0b3IJbV9Db21wb3NpdG9yOwotICAgIEZYX0JPT0wJCQkJbV9iVmVydGljYWwsIG1fYkZsaXBYLCBtX2JGbGlwWTsKLSAgICBpbnQJCQkJCW1fQWxwaGFGbGFnOwotICAgIHZvaWQqCQkJCW1fcEljY1RyYW5zZm9ybTsKLSAgICBGWF9CT09MICAgICAgICAgICAgIG1fYlJnYkJ5dGVPcmRlcjsKLSAgICBpbnQJCQkJCW1fQmxlbmRUeXBlOwotICAgIHZvaWQJCQkJQ29tcG9zZVNjYW5saW5lVihpbnQgbGluZSwgRlhfTFBDQllURSBzY2FubGluZSwgRlhfTFBDQllURSBzY2FuX2V4dHJhX2FscGhhID0gTlVMTCk7Ci0gICAgRlhfTFBCWVRFCQkJbV9wU2NhbmxpbmVWLCBtX3BDbGlwU2NhblYsIG1fcEFkZENsaXBTY2FuLCBtX3BTY2FubGluZUFscGhhVjsKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgRG9Db21wb3NlKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19leHRyYV9hbHBoYSA9IE5VTEwsCisgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdF9leHRyYV9hbHBoYSA9IE5VTEwpOworICBDRlhfRElCaXRtYXAqIG1fcEJpdG1hcDsKKyAgY29uc3QgQ0ZYX0NsaXBSZ24qIG1fcENsaXBSZ247CisgIEZYRElCX0Zvcm1hdCBtX1NyY0Zvcm1hdDsKKyAgaW50IG1fRGVzdExlZnQsIG1fRGVzdFRvcCwgbV9EZXN0V2lkdGgsIG1fRGVzdEhlaWdodCwgbV9CaXRtYXBBbHBoYTsKKyAgRlhfRFdPUkQgbV9NYXNrQ29sb3I7CisgIGNvbnN0IENGWF9ESUJpdG1hcCogbV9wQ2xpcE1hc2s7CisgIENGWF9TY2FubGluZUNvbXBvc2l0b3IgbV9Db21wb3NpdG9yOworICBGWF9CT09MIG1fYlZlcnRpY2FsLCBtX2JGbGlwWCwgbV9iRmxpcFk7CisgIGludCBtX0FscGhhRmxhZzsKKyAgdm9pZCogbV9wSWNjVHJhbnNmb3JtOworICBGWF9CT09MIG1fYlJnYkJ5dGVPcmRlcjsKKyAgaW50IG1fQmxlbmRUeXBlOworICB2b2lkIENvbXBvc2VTY2FubGluZVYoaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzY2FubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNjYW5fZXh0cmFfYWxwaGEgPSBOVUxMKTsKKyAgdWludDhfdCogbV9wU2NhbmxpbmVWOworICB1aW50OF90KiBtX3BDbGlwU2NhblY7CisgIHVpbnQ4X3QqIG1fcEFkZENsaXBTY2FuOworICB1aW50OF90KiBtX3BTY2FubGluZUFscGhhVjsKIH07Ci1jbGFzcyBDRlhfQml0bWFwU3RvcmVyIDogcHVibGljIElGWF9TY2FubGluZUNvbXBvc2VyCi17Ci1wdWJsaWM6CiAKLSAgICBDRlhfQml0bWFwU3RvcmVyKCk7CitjbGFzcyBDRlhfQml0bWFwU3RvcmVyIDogcHVibGljIElGWF9TY2FubGluZUNvbXBvc2VyIHsKKyBwdWJsaWM6CisgIENGWF9CaXRtYXBTdG9yZXIoKTsKKyAgfkNGWF9CaXRtYXBTdG9yZXIoKSBvdmVycmlkZTsKIAotICAgIH5DRlhfQml0bWFwU3RvcmVyKCk7CisgIC8vIElGWF9TY2FubGluZUNvbXBvc2VyCisgIHZvaWQgQ29tcG9zZVNjYW5saW5lKGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzY2FubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2Nhbl9leHRyYV9hbHBoYSkgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsCXZvaWQJCUNvbXBvc2VTY2FubGluZShpbnQgbGluZSwgRlhfTFBDQllURSBzY2FubGluZSwgRlhfTFBDQllURSBzY2FuX2V4dHJhX2FscGhhKTsKKyAgRlhfQk9PTCBTZXRJbmZvKGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSkgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVNldEluZm8oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlKTsKKyAgQ0ZYX0RJQml0bWFwKiBHZXRCaXRtYXAoKSB7IHJldHVybiBtX3BCaXRtYXA7IH0KIAotICAgIENGWF9ESUJpdG1hcCoJCUdldEJpdG1hcCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wQml0bWFwOwotICAgIH0KKyAgQ0ZYX0RJQml0bWFwKiBEZXRhY2goKTsKIAotICAgIENGWF9ESUJpdG1hcCoJCURldGFjaCgpOworICB2b2lkIFJlcGxhY2UoQ0ZYX0RJQml0bWFwKiBwQml0bWFwKTsKIAotICAgIHZvaWQJCQkJUmVwbGFjZShDRlhfRElCaXRtYXAqIHBCaXRtYXApOwotcHJpdmF0ZToKLSAgICBDRlhfRElCaXRtYXAqCQltX3BCaXRtYXA7CisgcHJpdmF0ZToKKyAgQ0ZYX0RJQml0bWFwKiBtX3BCaXRtYXA7CiB9OwotY2xhc3MgQ1N0cmV0Y2hFbmdpbmU7Ci1jbGFzcyBDRlhfSW1hZ2VTdHJldGNoZXIgCi17Ci1wdWJsaWM6CiAKLSAgICBDRlhfSW1hZ2VTdHJldGNoZXIoKTsKK2NsYXNzIENGWF9JbWFnZVN0cmV0Y2hlciB7CisgcHVibGljOgorICBDRlhfSW1hZ2VTdHJldGNoZXIoKTsKKyAgfkNGWF9JbWFnZVN0cmV0Y2hlcigpOwogCi0gICAgfkNGWF9JbWFnZVN0cmV0Y2hlcigpOworICBGWF9CT09MIFN0YXJ0KElGWF9TY2FubGluZUNvbXBvc2VyKiBwRGVzdCwKKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUJiBiaXRtYXBfcmVjdCwKKyAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncyk7CiAKLSAgICBGWF9JTlQzMgkJU3RhcnQoSUZYX1NjYW5saW5lQ29tcG9zZXIqIHBEZXN0LCBjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUJiBiaXRtYXBfcmVjdCwgRlhfRFdPUkQgZmxhZ3MpOworICBGWF9CT09MIENvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgRlhfQk9PTCBTdGFydFF1aWNrU3RyZXRjaCgpOworICBGWF9CT09MIFN0YXJ0U3RyZXRjaCgpOworICBGWF9CT09MIENvbnRpbnVlUXVpY2tTdHJldGNoKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgRlhfQk9PTCBDb250aW51ZVN0cmV0Y2goSUZYX1BhdXNlKiBwUGF1c2UpOwogCi0KLSAgICBGWF9JTlQzMgkJQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOwotICAgIElGWF9TY2FubGluZUNvbXBvc2VyKgltX3BEZXN0OwotICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqCW1fcFNvdXJjZTsKLSAgICBDU3RyZXRjaEVuZ2luZSoJCW1fcFN0cmV0Y2hFbmdpbmU7Ci0gICAgRlhfRFdPUkQJCW1fRmxhZ3M7Ci0gICAgRlhfQk9PTAkJCW1fYkZsaXBYLAotICAgICAgICAgICAgICAgICAgICBtX2JGbGlwWTsKLSAgICBpbnQJCQkJbV9EZXN0V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIG1fRGVzdEhlaWdodDsKLSAgICBGWF9SRUNUCQkJbV9DbGlwUmVjdDsKLSAgICBpbnQJCQkJbV9MaW5lSW5kZXg7Ci0gICAgaW50CQkJCW1fRGVzdEJQUDsKLSAgICBGWF9MUEJZVEUJCW1fcFNjYW5saW5lOwotICAgIEZYX0xQQllURSAgICAgICBtX3BNYXNrU2NhbmxpbmU7Ci0gICAgRlhESUJfRm9ybWF0CW1fRGVzdEZvcm1hdDsKLSAgICBGWF9JTlQzMgkJbV9TdGF0dXM7Ci0KLSAgICBGWF9JTlQzMgkJU3RhcnRRdWlja1N0cmV0Y2goKTsKLQotICAgIEZYX0lOVDMyCQlTdGFydFN0cmV0Y2goKTsKLQotICAgIEZYX0lOVDMyCQlDb250aW51ZVF1aWNrU3RyZXRjaChJRlhfUGF1c2UqIHBQYXVzZSk7Ci0KLSAgICBGWF9JTlQzMgkJQ29udGludWVTdHJldGNoKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgSUZYX1NjYW5saW5lQ29tcG9zZXIqIG1fcERlc3Q7CisgIGNvbnN0IENGWF9ESUJTb3VyY2UqIG1fcFNvdXJjZTsKKyAgQ1N0cmV0Y2hFbmdpbmUqIG1fcFN0cmV0Y2hFbmdpbmU7CisgIEZYX0RXT1JEIG1fRmxhZ3M7CisgIEZYX0JPT0wgbV9iRmxpcFg7CisgIEZYX0JPT0wgbV9iRmxpcFk7CisgIGludCBtX0Rlc3RXaWR0aDsKKyAgaW50IG1fRGVzdEhlaWdodDsKKyAgRlhfUkVDVCBtX0NsaXBSZWN0OworICBpbnQgbV9MaW5lSW5kZXg7CisgIGludCBtX0Rlc3RCUFA7CisgIHVpbnQ4X3QqIG1fcFNjYW5saW5lOworICB1aW50OF90KiBtX3BNYXNrU2NhbmxpbmU7CisgIEZYRElCX0Zvcm1hdCBtX0Rlc3RGb3JtYXQ7CiB9OwotY2xhc3MgQ0ZYX0ltYWdlVHJhbnNmb3JtZXIgCi17Ci1wdWJsaWM6CitjbGFzcyBDRlhfSW1hZ2VUcmFuc2Zvcm1lciB7CisgcHVibGljOgorICBDRlhfSW1hZ2VUcmFuc2Zvcm1lcigpOworICB+Q0ZYX0ltYWdlVHJhbnNmb3JtZXIoKTsKIAotICAgIENGWF9JbWFnZVRyYW5zZm9ybWVyKCk7CisgIEZYX0JPT0wgU3RhcnQoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYywKKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgIGludCBmbGFncywKKyAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcCk7CiAKLSAgICB+Q0ZYX0ltYWdlVHJhbnNmb3JtZXIoKTsKKyAgRlhfQk9PTCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CiAKLSAgICBGWF9JTlQzMglTdGFydChjb25zdCBDRlhfRElCU291cmNlKiBwU3JjLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBpbnQgZmxhZ3MsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwKTsKLQotCi0gICAgRlhfSU5UMzIJQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOwotICAgIENGWF9BZmZpbmVNYXRyaXgqIG1fcE1hdHJpeDsKLSAgICBGWF9SRUNUCQltX1N0cmV0Y2hDbGlwOwotICAgIGludAkJCW1fUmVzdWx0TGVmdCwgbV9SZXN1bHRUb3AsIG1fUmVzdWx0V2lkdGgsIG1fUmVzdWx0SGVpZ2h0OwotICAgIENGWF9BZmZpbmVNYXRyaXgJbV9kZXN0MnN0cmV0Y2g7Ci0gICAgQ0ZYX0ltYWdlU3RyZXRjaGVyCW1fU3RyZXRjaGVyOwotICAgIENGWF9CaXRtYXBTdG9yZXIJbV9TdG9yZXI7Ci0gICAgRlhfRFdPUkQJbV9GbGFnczsKLSAgICBpbnQJCQltX1N0YXR1czsKKyAgQ0ZYX01hdHJpeCogbV9wTWF0cml4OworICBGWF9SRUNUIG1fU3RyZXRjaENsaXA7CisgIGludCBtX1Jlc3VsdExlZnQ7CisgIGludCBtX1Jlc3VsdFRvcDsKKyAgaW50IG1fUmVzdWx0V2lkdGg7CisgIGludCBtX1Jlc3VsdEhlaWdodDsKKyAgQ0ZYX01hdHJpeCBtX2Rlc3Qyc3RyZXRjaDsKKyAgQ0ZYX0ltYWdlU3RyZXRjaGVyIG1fU3RyZXRjaGVyOworICBDRlhfQml0bWFwU3RvcmVyIG1fU3RvcmVyOworICBGWF9EV09SRCBtX0ZsYWdzOworICBpbnQgbV9TdGF0dXM7CiB9OwotY2xhc3MgQ0ZYX0ltYWdlUmVuZGVyZXIgCi17Ci1wdWJsaWM6CitjbGFzcyBDRlhfSW1hZ2VSZW5kZXJlciB7CisgcHVibGljOgorICBDRlhfSW1hZ2VSZW5kZXJlcigpOworICB+Q0ZYX0ltYWdlUmVuZGVyZXIoKTsKIAotICAgIENGWF9JbWFnZVJlbmRlcmVyKCk7CisgIEZYX0JPT0wgU3RhcnQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwKKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLAorICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFza19jb2xvciwKKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRpYl9mbGFncywKKyAgICAgICAgICAgICAgICBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsCisgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOwogCi0gICAgfkNGWF9JbWFnZVJlbmRlcmVyKCk7CisgIEZYX0JPT0wgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOwogCi0gICAgRlhfSU5UMzIJCQlTdGFydChDRlhfRElCaXRtYXAqIHBEZXZpY2UsIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIGludCBiaXRtYXBfYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtYXNrX2NvbG9yLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBkaWJfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgPSBGQUxTRSwgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKLQotICAgIEZYX0lOVDMyCQkJQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOwotcHJvdGVjdGVkOgotICAgIENGWF9ESUJpdG1hcCoJCW1fcERldmljZTsKLSAgICBjb25zdCBDRlhfQ2xpcFJnbioJbV9wQ2xpcFJnbjsKLSAgICBpbnQJCQkJCW1fQml0bWFwQWxwaGE7Ci0gICAgRlhfRFdPUkQJCQltX01hc2tDb2xvcjsKLSAgICBDRlhfQWZmaW5lTWF0cml4CW1fTWF0cml4OwotICAgIENGWF9JbWFnZVRyYW5zZm9ybWVyKgltX3BUcmFuc2Zvcm1lcjsKLSAgICBDRlhfSW1hZ2VTdHJldGNoZXIJbV9TdHJldGNoZXI7Ci0gICAgQ0ZYX0JpdG1hcENvbXBvc2VyCW1fQ29tcG9zZXI7Ci0gICAgaW50CQkJCQltX1N0YXR1czsKLSAgICBpbnQJCQkJCW1fRGVzdExlZnQsIG1fRGVzdFRvcDsKLSAgICBGWF9SRUNUCQkJCW1fQ2xpcEJveDsKLSAgICBGWF9EV09SRAkJCW1fRmxhZ3M7Ci0gICAgaW50CQkJCQltX0FscGhhRmxhZzsKLSAgICB2b2lkKgkJCQltX3BJY2NUcmFuc2Zvcm07Ci0gICAgRlhfQk9PTAkJCQltX2JSZ2JCeXRlT3JkZXI7Ci0gICAgaW50CQkJCQltX0JsZW5kVHlwZTsKKyBwcm90ZWN0ZWQ6CisgIENGWF9ESUJpdG1hcCogbV9wRGV2aWNlOworICBjb25zdCBDRlhfQ2xpcFJnbiogbV9wQ2xpcFJnbjsKKyAgaW50IG1fQml0bWFwQWxwaGE7CisgIEZYX0RXT1JEIG1fTWFza0NvbG9yOworICBDRlhfTWF0cml4IG1fTWF0cml4OworICBDRlhfSW1hZ2VUcmFuc2Zvcm1lciogbV9wVHJhbnNmb3JtZXI7CisgIENGWF9JbWFnZVN0cmV0Y2hlciBtX1N0cmV0Y2hlcjsKKyAgQ0ZYX0JpdG1hcENvbXBvc2VyIG1fQ29tcG9zZXI7CisgIGludCBtX1N0YXR1czsKKyAgRlhfUkVDVCBtX0NsaXBCb3g7CisgIEZYX0RXT1JEIG1fRmxhZ3M7CisgIGludCBtX0FscGhhRmxhZzsKKyAgdm9pZCogbV9wSWNjVHJhbnNmb3JtOworICBGWF9CT09MIG1fYlJnYkJ5dGVPcmRlcjsKKyAgaW50IG1fQmxlbmRUeXBlOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0lOQ0xVREVfRlhHRV9GWF9ESUJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2ZvbnQuaCBiL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2ZvbnQuaAppbmRleCBhYTk4NTgyLi45NTQ4MjRlIDEwMDY0NAotLS0gYS9jb3JlL2luY2x1ZGUvZnhnZS9meF9mb250LmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZm9udC5oCkBAIC0xLDQzNSArMSw1MzkgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBDT1JFX0lOQ0xVREVfRlhHRV9GWF9GT05UX0hfCiAjZGVmaW5lIENPUkVfSU5DTFVERV9GWEdFX0ZYX0ZPTlRfSF8KIAotI2luY2x1ZGUgIi4uL2Z4Y3J0L2Z4X2V4dC5oIgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmgiCiAjaW5jbHVkZSAiZnhfZGliLmgiCiAKIHR5cGVkZWYgc3RydWN0IEZUX0ZhY2VSZWNfKiBGWEZUX0ZhY2U7CiB0eXBlZGVmIHZvaWQqIEZYRlRfTGlicmFyeTsKLWNsYXNzIElGWF9Gb250RW5jb2Rpbmc7Ci1jbGFzcyBDRlhfUGF0aERhdGE7Ci1jbGFzcyBDRlhfU3Vic3RGb250OworCiBjbGFzcyBDRlhfRmFjZUNhY2hlOwotY2xhc3MgSUZYX0ZvbnRNYXBwZXI7CitjbGFzcyBDRlhfRm9udEZhY2VJbmZvOwogY2xhc3MgQ0ZYX0ZvbnRNYXBwZXI7CitjbGFzcyBDRlhfUGF0aERhdGE7CitjbGFzcyBDRlhfU2l6ZUdseXBoQ2FjaGU7CitjbGFzcyBDRlhfU3Vic3RGb250OworY2xhc3MgQ1RURm9udERlc2M7CitjbGFzcyBJRlhfRm9udEVuY29kaW5nOwogY2xhc3MgSUZYX1N5c3RlbUZvbnRJbmZvOwotY2xhc3MgQ0ZvbnRGaWxlRmFjZUluZm87Ci0jZGVmaW5lIEZYRk9OVF9GSVhFRF9QSVRDSAkJMHgwMQotI2RlZmluZSBGWEZPTlRfU0VSSUYJCQkweDAyCi0jZGVmaW5lIEZYRk9OVF9TWU1CT0xJQwkJCTB4MDQKLSNkZWZpbmUgRlhGT05UX1NDUklQVAkJCTB4MDgKLSNkZWZpbmUgRlhGT05UX0lUQUxJQwkJCTB4NDAKLSNkZWZpbmUgRlhGT05UX0JPTEQJCQkJMHg0MDAwMAotI2RlZmluZSBGWEZPTlRfVVNFRVhURVJOQVRUUgkweDgwMDAwCi0jZGVmaW5lIEZYRk9OVF9DSURGT05UCQkJMHgxMDAwMDAKLSNkZWZpbmUgRlhGT05UX0FOU0lfQ0hBUlNFVAkJMAotI2RlZmluZSBGWEZPTlRfREVGQVVMVF9DSEFSU0VUCTEKLSNkZWZpbmUgRlhGT05UX1NZTUJPTF9DSEFSU0VUCTIKLSNkZWZpbmUgRlhGT05UX1NISUZUSklTX0NIQVJTRVQJMTI4Ci0jZGVmaW5lIEZYRk9OVF9IQU5HRVVMX0NIQVJTRVQJMTI5Ci0jZGVmaW5lIEZYRk9OVF9HQjIzMTJfQ0hBUlNFVAkxMzQKLSNkZWZpbmUgRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQJMTM2Ci0jZGVmaW5lIEZYRk9OVF9USEFJX0NIQVJTRVQJCTIyMgotI2RlZmluZSBGWEZPTlRfRUFTVEVVUk9QRV9DSEFSU0VUCTIzOAotI2RlZmluZSBGWEZPTlRfUlVTU0lBTl9DSEFSU0VUCTIwNAotI2RlZmluZSBGWEZPTlRfR1JFRUtfQ0hBUlNFVAkxNjEKLSNkZWZpbmUgRlhGT05UX1RVUktJU0hfQ0hBUlNFVAkxNjIKLSNkZWZpbmUgRlhGT05UX0hFQlJFV19DSEFSU0VUCTE3NwotI2RlZmluZSBGWEZPTlRfQVJBQklDX0NIQVJTRVQJMTc4Ci0jZGVmaW5lIEZYRk9OVF9CQUxUSUNfQ0hBUlNFVAkxODYKLSNkZWZpbmUgRlhGT05UX0ZGX0ZJWEVEUElUQ0gJMQotI2RlZmluZSBGWEZPTlRfRkZfUk9NQU4JCQkoMTw8NCkKLSNkZWZpbmUgRlhGT05UX0ZGX1NDUklQVAkJKDQ8PDQpCi0jZGVmaW5lIEZYRk9OVF9GV19OT1JNQUwJCTQwMAotI2RlZmluZSBGWEZPTlRfRldfQk9MRAkJCTcwMAotY2xhc3MgQ0ZYX0ZvbnQgCi17Ci1wdWJsaWM6Ci0gICAgQ0ZYX0ZvbnQoKTsKLSAgICB+Q0ZYX0ZvbnQoKTsKIAotICAgIEZYX0JPT0wJCQkJCUxvYWRTdWJzdChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLCBGWF9CT09MIGJUcnVlVHlwZSwgRlhfRFdPUkQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIGludCBpdGFsaWNfYW5nbGUsIGludCBDaGFyc2V0Q1AsIEZYX0JPT0wgYlZlcnRpY2FsID0gRkFMU0UpOworI2RlZmluZSBGWEZPTlRfRklYRURfUElUQ0ggMHgwMQorI2RlZmluZSBGWEZPTlRfU0VSSUYgMHgwMgorI2RlZmluZSBGWEZPTlRfU1lNQk9MSUMgMHgwNAorI2RlZmluZSBGWEZPTlRfU0NSSVBUIDB4MDgKKyNkZWZpbmUgRlhGT05UX0lUQUxJQyAweDQwCisjZGVmaW5lIEZYRk9OVF9CT0xEIDB4NDAwMDAKKyNkZWZpbmUgRlhGT05UX1VTRUVYVEVSTkFUVFIgMHg4MDAwMAorI2RlZmluZSBGWEZPTlRfQ0lERk9OVCAweDEwMDAwMAorI2lmZGVmIFBERl9FTkFCTEVfWEZBCisjZGVmaW5lIEZYRk9OVF9FWEFDVE1BVENIIDB4ODAwMDAwMDAKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyNkZWZpbmUgRlhGT05UX0FOU0lfQ0hBUlNFVCAwCisjZGVmaW5lIEZYRk9OVF9ERUZBVUxUX0NIQVJTRVQgMQorI2RlZmluZSBGWEZPTlRfU1lNQk9MX0NIQVJTRVQgMgorI2RlZmluZSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVCAxMjgKKyNkZWZpbmUgRlhGT05UX0hBTkdFVUxfQ0hBUlNFVCAxMjkKKyNkZWZpbmUgRlhGT05UX0dCMjMxMl9DSEFSU0VUIDEzNAorI2RlZmluZSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVCAxMzYKKyNkZWZpbmUgRlhGT05UX1RIQUlfQ0hBUlNFVCAyMjIKKyNkZWZpbmUgRlhGT05UX0VBU1RFVVJPUEVfQ0hBUlNFVCAyMzgKKyNkZWZpbmUgRlhGT05UX1JVU1NJQU5fQ0hBUlNFVCAyMDQKKyNkZWZpbmUgRlhGT05UX0dSRUVLX0NIQVJTRVQgMTYxCisjZGVmaW5lIEZYRk9OVF9UVVJLSVNIX0NIQVJTRVQgMTYyCisjZGVmaW5lIEZYRk9OVF9IRUJSRVdfQ0hBUlNFVCAxNzcKKyNkZWZpbmUgRlhGT05UX0FSQUJJQ19DSEFSU0VUIDE3OAorI2RlZmluZSBGWEZPTlRfQkFMVElDX0NIQVJTRVQgMTg2CisjZGVmaW5lIEZYRk9OVF9GRl9GSVhFRFBJVENIIDEKKyNkZWZpbmUgRlhGT05UX0ZGX1JPTUFOICgxIDw8IDQpCisjZGVmaW5lIEZYRk9OVF9GRl9TQ1JJUFQgKDQgPDwgNCkKKyNkZWZpbmUgRlhGT05UX0ZXX05PUk1BTCA0MDAKKyNkZWZpbmUgRlhGT05UX0ZXX0JPTEQgNzAwCiAKLSAgICBGWF9CT09MCQkJCQlMb2FkRW1iZWRkZWQoRlhfTFBDQllURSBkYXRhLCBGWF9EV09SRCBzaXplKTsKK2NsYXNzIENGWF9Gb250IHsKKyBwdWJsaWM6CisgIENGWF9Gb250KCk7CisgIH5DRlhfRm9udCgpOwogCi0gICAgRlhfQk9PTAkJCQkJTG9hZEZpbGUoSUZYX0ZpbGVSZWFkKiBwRmlsZSk7CisgIHZvaWQgTG9hZFN1YnN0KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsCisgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRydWVUeXBlLAorICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncywKKyAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgaW50IGl0YWxpY19hbmdsZSwKKyAgICAgICAgICAgICAgICAgaW50IENoYXJzZXRDUCwKKyAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydGljYWwgPSBGQUxTRSk7CisgIEZYX0JPT0wgTG9hZEVtYmVkZGVkKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIEZYX0RXT1JEIHNpemUpOworICBGWEZUX0ZhY2UgR2V0RmFjZSgpIGNvbnN0IHsgcmV0dXJuIG1fRmFjZTsgfQogCi0gICAgRlhGVF9GYWNlCQkJCUdldEZhY2UoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fRmFjZTsKLSAgICB9CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgRlhfQk9PTCBMb2FkRmlsZShJRlhfRmlsZVJlYWQqIHBGaWxlLAorICAgICAgICAgICAgICAgICAgIGludCBuRmFjZUluZGV4ID0gMCwKKyAgICAgICAgICAgICAgICAgICBpbnQqIHBGYWNlQ291bnQgPSBOVUxMKTsKIAorICBGWF9CT09MIExvYWRDbG9uZShjb25zdCBDRlhfRm9udCogcEZvbnQpOworICBDRlhfU3Vic3RGb250KiBHZXRTdWJzdEZvbnQoKSBjb25zdCB7IHJldHVybiBtX3BTdWJzdEZvbnQ7IH0KKyAgdm9pZCBTZXRGYWNlKEZYRlRfRmFjZSBmYWNlKSB7IG1fRmFjZSA9IGZhY2U7IH0KKyAgdm9pZCBTZXRTdWJzdEZvbnQoQ0ZYX1N1YnN0Rm9udCogc3Vic3QpIHsgbV9wU3Vic3RGb250ID0gc3Vic3Q7IH0KKyNlbHNlICAgLy8gUERGX0VOQUJMRV9YRkEKKyAgY29uc3QgQ0ZYX1N1YnN0Rm9udCogR2V0U3Vic3RGb250KCkgY29uc3QgeyByZXR1cm4gbV9wU3Vic3RGb250OyB9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKLSAgICBjb25zdCBDRlhfU3Vic3RGb250KglHZXRTdWJzdEZvbnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcFN1YnN0Rm9udDsKLSAgICB9CisgIENGWF9QYXRoRGF0YSogTG9hZEdseXBoUGF0aChGWF9EV09SRCBnbHlwaF9pbmRleCwgaW50IGRlc3Rfd2lkdGggPSAwKTsKKyAgaW50IEdldEdseXBoV2lkdGgoRlhfRFdPUkQgZ2x5cGhfaW5kZXgpOworICBpbnQgR2V0QXNjZW50KCkgY29uc3Q7CisgIGludCBHZXREZXNjZW50KCkgY29uc3Q7CisgIEZYX0JPT0wgR2V0R2x5cGhCQm94KEZYX0RXT1JEIGdseXBoX2luZGV4LCBGWF9SRUNUJiBiYm94KTsKKyAgRlhfQk9PTCBJc0l0YWxpYygpIGNvbnN0OworICBGWF9CT09MIElzQm9sZCgpIGNvbnN0OworICBGWF9CT09MIElzRml4ZWRXaWR0aCgpIGNvbnN0OworICBGWF9CT09MIElzVmVydGljYWwoKSBjb25zdCB7IHJldHVybiBtX2JWZXJ0aWNhbDsgfQorICBDRlhfV2lkZVN0cmluZyBHZXRQc05hbWUoKSBjb25zdDsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0RmFtaWx5TmFtZSgpIGNvbnN0OworICBDRlhfQnl0ZVN0cmluZyBHZXRGYWNlTmFtZSgpIGNvbnN0OworICBGWF9CT09MIElzVFRGb250KCkgY29uc3Q7CisgIEZYX0JPT0wgR2V0QkJveChGWF9SRUNUJiBiYm94KTsKKyAgaW50IEdldEhlaWdodCgpIGNvbnN0OworICBpbnQgR2V0VUxQb3MoKSBjb25zdDsKKyAgaW50IEdldFVMdGhpY2tuZXNzKCkgY29uc3Q7CisgIGludCBHZXRNYXhBZHZhbmNlV2lkdGgoKSBjb25zdDsKKyAgRlhfQk9PTCBJc0VtYmVkZGVkKCkgY29uc3QgeyByZXR1cm4gbV9iRW1iZWRkZWQ7IH0KKyAgdWludDhfdCogR2V0U3ViRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fcEdzdWJEYXRhOyB9CisgIHZvaWQgU2V0U3ViRGF0YSh1aW50OF90KiBkYXRhKSB7IG1fcEdzdWJEYXRhID0gZGF0YTsgfQorICB2b2lkKiBHZXRQbGF0Zm9ybUZvbnQoKSBjb25zdCB7IHJldHVybiBtX3BQbGF0Zm9ybUZvbnQ7IH0KKyAgdm9pZCBTZXRQbGF0Zm9ybUZvbnQodm9pZCogZm9udCkgeyBtX3BQbGF0Zm9ybUZvbnQgPSBmb250OyB9CisgIHVpbnQ4X3QqIEdldEZvbnREYXRhKCkgY29uc3QgeyByZXR1cm4gbV9wRm9udERhdGE7IH0KKyAgRlhfRFdPUkQgR2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZHdTaXplOyB9CisgIHZvaWQgQWRqdXN0TU1QYXJhbXMoaW50IGdseXBoX2luZGV4LCBpbnQgd2lkdGgsIGludCB3ZWlnaHQpOwogCi0gICAgQ0ZYX1BhdGhEYXRhKgkJCUxvYWRHbHlwaFBhdGgoRlhfRFdPUkQgZ2x5cGhfaW5kZXgsIGludCBkZXN0X3dpZHRoID0gMCk7CisgcHJpdmF0ZToKKyAgdm9pZCBSZWxlYXNlUGxhdGZvcm1SZXNvdXJjZSgpOworICB2b2lkIERlbGV0ZUZhY2UoKTsKIAotICAgIGludAkJCQkJCUdldEdseXBoV2lkdGgoRlhfRFdPUkQgZ2x5cGhfaW5kZXgpOworICBGWEZUX0ZhY2UgbV9GYWNlOworICBDRlhfU3Vic3RGb250KiBtX3BTdWJzdEZvbnQ7CisgIHVpbnQ4X3QqIG1fcEZvbnREYXRhQWxsb2NhdGlvbjsKKyAgdWludDhfdCogbV9wRm9udERhdGE7CisgIHVpbnQ4X3QqIG1fcEdzdWJEYXRhOworICBGWF9EV09SRCBtX2R3U2l6ZTsKKyAgQ0ZYX0JpbmFyeUJ1ZiBtX090ZkZvbnREYXRhOworICB2b2lkKiBtX2hIYW5kbGU7CisgIHZvaWQqIG1fcFBsYXRmb3JtRm9udDsKKyAgdm9pZCogbV9wUGxhdGZvcm1Gb250Q29sbGVjdGlvbjsKKyAgdm9pZCogbV9wRHdGb250OworICBGWF9CT09MIG1fYkR3TG9hZGVkOworICBGWF9CT09MIG1fYkVtYmVkZGVkOworICBGWF9CT09MIG1fYlZlcnRpY2FsOwogCi0gICAgaW50CQkJCQkJR2V0QXNjZW50KCkgY29uc3Q7Ci0KLSAgICBpbnQJCQkJCQlHZXREZXNjZW50KCkgY29uc3Q7Ci0KLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBHZXRHbHlwaEJCb3goRlhfRFdPUkQgZ2x5cGhfaW5kZXgsIEZYX1JFQ1QgJmJib3gpOwotCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgSXNJdGFsaWMoKTsKLQotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIElzQm9sZCgpOwotCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgSXNGaXhlZFdpZHRoKCk7Ci0KLSAgICBGWF9CT09MCQkJCQlJc1ZlcnRpY2FsKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2JWZXJ0aWNhbDsKLSAgICB9Ci0KLSAgICBDRlhfV2lkZVN0cmluZyAgICAgICAgICBHZXRQc05hbWUoKSBjb25zdDsKLQotCi0gICAgQ0ZYX0J5dGVTdHJpbmcgICAgICAgICAgR2V0RmFtaWx5TmFtZSgpIGNvbnN0OwotCi0gICAgQ0ZYX0J5dGVTdHJpbmcgICAgICAgICAgR2V0RmFjZU5hbWUoKSBjb25zdDsKLQotCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgSXNUVEZvbnQoKTsKLQotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgIEdldEJCb3goRlhfUkVDVCAmYmJveCk7Ci0KLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBHZXRIZWlnaHQoKTsKLQotICAgIGludCAgICAgICAgICAgICAgICAgICAgIEdldFVMUG9zKCk7Ci0KLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBHZXRVTHRoaWNrbmVzcygpOwotCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgR2V0TWF4QWR2YW5jZVdpZHRoKCk7Ci0KLSAgICBGWEZUX0ZhY2UJCQkJbV9GYWNlOwotCi0gICAgQ0ZYX1N1YnN0Rm9udCoJCQltX3BTdWJzdEZvbnQ7Ci0gICAgRlhfQk9PTAkJCQkJSXNFbWJlZGRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9iRW1iZWRkZWQ7Ci0gICAgfQotCi0gICAgdm9pZAkJCQkJQWRqdXN0TU1QYXJhbXMoaW50IGdseXBoX2luZGV4LCBpbnQgd2lkdGgsIGludCB3ZWlnaHQpOwotICAgIEZYX0xQQllURQkJCQltX3BGb250RGF0YUFsbG9jYXRpb247Ci0gICAgRlhfTFBCWVRFICAgICAgICAgICAgICAgbV9wRm9udERhdGE7Ci0gICAgRlhfTFBCWVRFCQkJCW1fcEdzdWJEYXRhOwotICAgIEZYX0RXT1JEICAgICAgICAgICAgICAgIG1fZHdTaXplOwotICAgIENGWF9CaW5hcnlCdWYgICAgICAgICAgIG1fT3RmRm9udERhdGE7Ci0gICAgdm9pZCogICAgICAgICAgICAgICAgICAgbV9oSGFuZGxlOwotICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIG1fcFBsYXRmb3JtRm9udDsKLSAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBtX3BQbGF0Zm9ybUZvbnRDb2xsZWN0aW9uOwotICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIG1fcER3Rm9udDsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICBtX2JEd0xvYWRlZDsKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICBSZWxlYXNlUGxhdGZvcm1SZXNvdXJjZSgpOwotCi0gICAgdm9pZAkJCQkJRGVsZXRlRmFjZSgpOwotcHJvdGVjdGVkOgotCi0gICAgRlhfQk9PTAkJCQkJbV9iRW1iZWRkZWQ7Ci0gICAgRlhfQk9PTAkJCQkJbV9iVmVydGljYWw7Ci0gICAgdm9pZCoJCQkJCW1fcE93bmVkU3RyZWFtOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgcHJvdGVjdGVkOgorICBGWF9CT09MIG1fYkxvZ2ljOworICB2b2lkKiBtX3BPd25lZFN0cmVhbTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIH07Ci0jZGVmaW5lIEVOQ09ESU5HX0lOVEVSTkFMCQkwCi0jZGVmaW5lIEVOQ09ESU5HX1VOSUNPREUJCTEKLWNsYXNzIElGWF9Gb250RW5jb2RpbmcgCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+SUZYX0ZvbnRFbmNvZGluZygpIHt9CiAKLSAgICB2aXJ0dWFsIEZYX0RXT1JECQlHbHlwaEZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgPSAwOworI2RlZmluZSBFTkNPRElOR19JTlRFUk5BTCAwCisjZGVmaW5lIEVOQ09ESU5HX1VOSUNPREUgMQogCi0gICAgdmlydHVhbCBDRlhfV2lkZVN0cmluZwlVbmljb2RlRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdCA9IDA7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyNkZWZpbmUgRlhGTV9FTkNfVEFHKGEsIGIsIGMsIGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKChGWF9EV09SRCkoYSkgPDwgMjQpIHwgKChGWF9EV09SRCkoYikgPDwgMTYpIHwgKChGWF9EV09SRCkoYykgPDwgOCkgfCBcCisgICAoRlhfRFdPUkQpKGQpKQorI2RlZmluZSBGWEZNX0VOQ09ESU5HX05PTkUgRlhGTV9FTkNfVEFHKDAsIDAsIDAsIDApCisjZGVmaW5lIEZYRk1fRU5DT0RJTkdfTVNfU1lNQk9MIEZYRk1fRU5DX1RBRygncycsICd5JywgJ20nLCAnYicpCisjZGVmaW5lIEZYRk1fRU5DT0RJTkdfVU5JQ09ERSBGWEZNX0VOQ19UQUcoJ3UnLCAnbicsICdpJywgJ2MnKQorI2RlZmluZSBGWEZNX0VOQ09ESU5HX01TX1NKSVMgRlhGTV9FTkNfVEFHKCdzJywgJ2onLCAnaScsICdzJykKKyNkZWZpbmUgRlhGTV9FTkNPRElOR19NU19HQjIzMTIgRlhGTV9FTkNfVEFHKCdnJywgJ2InLCAnICcsICcgJykKKyNkZWZpbmUgRlhGTV9FTkNPRElOR19NU19CSUc1IEZYRk1fRU5DX1RBRygnYicsICdpJywgJ2cnLCAnNScpCisjZGVmaW5lIEZYRk1fRU5DT0RJTkdfTVNfV0FOU1VORyBGWEZNX0VOQ19UQUcoJ3cnLCAnYScsICduJywgJ3MnKQorI2RlZmluZSBGWEZNX0VOQ09ESU5HX01TX0pPSEFCIEZYRk1fRU5DX1RBRygnaicsICdvJywgJ2gnLCAnYScpCisjZGVmaW5lIEZYRk1fRU5DT0RJTkdfQURPQkVfU1RBTkRBUkQgRlhGTV9FTkNfVEFHKCdBJywgJ0QnLCAnTycsICdCJykKKyNkZWZpbmUgRlhGTV9FTkNPRElOR19BRE9CRV9FWFBFUlQgRlhGTV9FTkNfVEFHKCdBJywgJ0QnLCAnQicsICdFJykKKyNkZWZpbmUgRlhGTV9FTkNPRElOR19BRE9CRV9DVVNUT00gRlhGTV9FTkNfVEFHKCdBJywgJ0QnLCAnQicsICdDJykKKyNkZWZpbmUgRlhGTV9FTkNPRElOR19BRE9CRV9MQVRJTl8xIEZYRk1fRU5DX1RBRygnbCcsICdhJywgJ3QnLCAnMScpCisjZGVmaW5lIEZYRk1fRU5DT0RJTkdfT0xEX0xBVElOXzIgRlhGTV9FTkNfVEFHKCdsJywgJ2EnLCAndCcsICcyJykKKyNkZWZpbmUgRlhGTV9FTkNPRElOR19BUFBMRV9ST01BTiBGWEZNX0VOQ19UQUcoJ2EnLCAncicsICdtJywgJ24nKQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCi0gICAgdmlydHVhbCBGWF9EV09SRAkJQ2hhckNvZGVGcm9tVW5pY29kZShGWF9XQ0hBUiBVbmljb2RlKSBjb25zdCA9IDA7CitjbGFzcyBDRlhfVW5pY29kZUVuY29kaW5nIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENGWF9Vbmljb2RlRW5jb2RpbmcoQ0ZYX0ZvbnQqIHBGb250KTsKKyAgdmlydHVhbCB+Q0ZYX1VuaWNvZGVFbmNvZGluZygpOworCisgIHZpcnR1YWwgRlhfRFdPUkQgR2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpOworCisgcHJvdGVjdGVkOgorICAvLyBVbm93bmVkLCBub3QgbnVsbHB0ci4KKyAgQ0ZYX0ZvbnQqIG1fcEZvbnQ7CiB9OwotSUZYX0ZvbnRFbmNvZGluZyogRlhHRV9DcmVhdGVVbmljb2RlRW5jb2RpbmcoQ0ZYX0ZvbnQqIHBGb250KTsKLSNkZWZpbmUgRlhGT05UX1NVQlNUX01NCQkJCTB4MDEKLSNkZWZpbmUgRlhGT05UX1NVQlNUX0dMWVBIUEFUSAkJMHgwNAotI2RlZmluZSBGWEZPTlRfU1VCU1RfQ0xFQVJUWVBFCQkweDA4Ci0jZGVmaW5lIEZYRk9OVF9TVUJTVF9UUkFOU0ZPUk0JCTB4MTAKLSNkZWZpbmUgRlhGT05UX1NVQlNUX05PTlNZTUJPTAkJMHgyMAotI2RlZmluZSBGWEZPTlRfU1VCU1RfRVhBQ1QJCQkweDQwCi0jZGVmaW5lIEZYRk9OVF9TVUJTVF9TVEFOREFSRAkJMHg4MAotY2xhc3MgQ0ZYX1N1YnN0Rm9udCAKLXsKLXB1YmxpYzoKIAotICAgIENGWF9TdWJzdEZvbnQoKTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorY2xhc3MgQ0ZYX1VuaWNvZGVFbmNvZGluZ0V4IDogcHVibGljIENGWF9Vbmljb2RlRW5jb2RpbmcgeworIHB1YmxpYzoKKyAgQ0ZYX1VuaWNvZGVFbmNvZGluZ0V4KENGWF9Gb250KiBwRm9udCwgRlhfRFdPUkQgRW5jb2RpbmdJRCk7CisgIH5DRlhfVW5pY29kZUVuY29kaW5nRXgoKSBvdmVycmlkZTsKIAotICAgIEZYX0xQVk9JRAkJCQltX0V4dEhhbmRsZTsKKyAgLy8gQ0ZYX1VuaWNvZGVFbmNvZGluZzoKKyAgRlhfRFdPUkQgR2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIG92ZXJyaWRlOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCQltX0ZhbWlseTsKKyAgRlhfRFdPUkQgQ2hhckNvZGVGcm9tVW5pY29kZShGWF9XQ0hBUiBVbmljb2RlKSBjb25zdDsKIAotICAgIGludAkJCQkJCW1fQ2hhcnNldDsKLQotICAgIEZYX0RXT1JECQkJCW1fU3Vic3RGbGFnczsKLQotICAgIGludAkJCQkJCW1fV2VpZ2h0OwotCi0gICAgaW50CQkJCQkJbV9JdGFsaWNBbmdsZTsKLQotICAgIEZYX0JPT0wJCQkJCW1fYlN1YnN0T2ZDSks7Ci0KLSAgICBpbnQJCQkJCQltX1dlaWdodENKSzsKLQotICAgIEZYX0JPT0wJCQkJCW1fYkl0bGljQ0pLOworIHByaXZhdGU6CisgIEZYX0RXT1JEIG1fbkVuY29kaW5nSUQ7CiB9OwotI2RlZmluZSBGWF9GT05UX0ZMQUdfU0VSSUYgICAgICAgICAgICAgIDB4MDEKLSNkZWZpbmUgRlhfRk9OVF9GTEFHX0ZJWEVEUElUQ0gJCQkweDAyCi0jZGVmaW5lIEZYX0ZPTlRfRkxBR19JVEFMSUMJCQkJMHgwNAotI2RlZmluZSBGWF9GT05UX0ZMQUdfQk9MRAkJCQkweDA4Ci0jZGVmaW5lIEZYX0ZPTlRfRkxBR19TWU1CT0xJQ19TWU1CT0wJMHgxMAotI2RlZmluZSBGWF9GT05UX0ZMQUdfU1lNQk9MSUNfRElOR0JBVFMJMHgyMAotI2RlZmluZSBGWF9GT05UX0ZMQUdfTVVMVElQTEVNQVNURVIJCTB4NDAKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBGWF9MUENCWVRFCW1fcEZvbnREYXRhOwotICAgIEZYX0RXT1JECW1fZHdTaXplOwotfSBGb3hpdEZvbnRzOwotY2xhc3MgQ0ZYX0ZvbnRNZ3IgCi17Ci1wdWJsaWM6Ci0gICAgQ0ZYX0ZvbnRNZ3IoKTsKLSAgICB+Q0ZYX0ZvbnRNZ3IoKTsKLSAgICB2b2lkCQkJSW5pdEZUTGlicmFyeSgpOwotICAgIEZYRlRfRmFjZQkJR2V0Q2FjaGVkRmFjZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgRlhfTFBCWVRFJiBwRm9udERhdGEpOwotICAgIEZYRlRfRmFjZQkJQWRkQ2FjaGVkRmFjZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgRlhfTFBCWVRFIHBEYXRhLCBGWF9EV09SRCBzaXplLCBpbnQgZmFjZV9pbmRleCk7Ci0gICAgRlhGVF9GYWNlCQlHZXRDYWNoZWRUVENGYWNlKGludCB0dGNfc2l6ZSwgRlhfRFdPUkQgY2hlY2tzdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbnRfb2Zmc2V0LCBGWF9MUEJZVEUmIHBGb250RGF0YSk7Ci0gICAgRlhGVF9GYWNlCQlBZGRDYWNoZWRUVENGYWNlKGludCB0dGNfc2l6ZSwgRlhfRFdPUkQgY2hlY2tzdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBCWVRFIHBEYXRhLCBGWF9EV09SRCBzaXplLCBpbnQgZm9udF9vZmZzZXQpOwotICAgIEZYRlRfRmFjZQkJR2V0RmlsZUZhY2UoRlhfTFBDU1RSIGZpbGVuYW1lLCBpbnQgZmFjZV9pbmRleCk7Ci0gICAgRlhGVF9GYWNlCQlHZXRGaXhlZEZhY2UoRlhfTFBDQllURSBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgaW50IGZhY2VfaW5kZXgpOwotICAgIHZvaWQJCQlSZWxlYXNlRmFjZShGWEZUX0ZhY2UgZmFjZSk7Ci0gICAgdm9pZAkJCVNldFN5c3RlbUZvbnRJbmZvKElGWF9TeXN0ZW1Gb250SW5mbyogcEZvbnRJbmZvKTsKLSAgICBGWEZUX0ZhY2UJCUZpbmRTdWJzdEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGZhY2VfbmFtZSwgRlhfQk9PTCBiVHJ1ZVR5cGUsIEZYX0RXT1JEIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIGludCBpdGFsaWNfYW5nbGUsIGludCBDaGFyc2V0Q1AsIENGWF9TdWJzdEZvbnQqIHBTdWJzdEZvbnQpOworQ0ZYX1VuaWNvZGVFbmNvZGluZ0V4KiBGWF9DcmVhdGVGb250RW5jb2RpbmdFeCgKKyAgICBDRlhfRm9udCogcEZvbnQsCisgICAgRlhfRFdPUkQgbkVuY29kaW5nSUQgPSBGWEZNX0VOQ09ESU5HX05PTkUpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCi0gICAgdm9pZAkJCUZyZWVDYWNoZSgpOworI2RlZmluZSBGWEZPTlRfU1VCU1RfTU0gMHgwMQorI2RlZmluZSBGWEZPTlRfU1VCU1RfR0xZUEhQQVRIIDB4MDQKKyNkZWZpbmUgRlhGT05UX1NVQlNUX0NMRUFSVFlQRSAweDA4CisjZGVmaW5lIEZYRk9OVF9TVUJTVF9UUkFOU0ZPUk0gMHgxMAorI2RlZmluZSBGWEZPTlRfU1VCU1RfTk9OU1lNQk9MIDB4MjAKKyNkZWZpbmUgRlhGT05UX1NVQlNUX0VYQUNUIDB4NDAKKyNkZWZpbmUgRlhGT05UX1NVQlNUX1NUQU5EQVJEIDB4ODAKIAotICAgIEZYX0JPT0wJCQlHZXRTdGFuZGFyZEZvbnQoRlhfTFBDQllURSYgcEZvbnREYXRhLCBGWF9EV09SRCYgc2l6ZSwgaW50IGluZGV4KTsKLSAgICBDRlhfRm9udE1hcHBlcioJbV9wQnVpbHRpbk1hcHBlcjsKLSAgICBJRlhfRm9udE1hcHBlcioJbV9wRXh0TWFwcGVyOwotICAgIENGWF9NYXBCeXRlU3RyaW5nVG9QdHIJbV9GYWNlTWFwOwotICAgIEZYRlRfTGlicmFyeQltX0ZUTGlicmFyeTsKLSAgICBGb3hpdEZvbnRzIG1fRXh0ZXJuYWxGb250c1sxNl07CitjbGFzcyBDRlhfU3Vic3RGb250IHsKKyBwdWJsaWM6CisgIENGWF9TdWJzdEZvbnQoKTsKKworICB2b2lkKiBtX0V4dEhhbmRsZTsKKworICBDRlhfQnl0ZVN0cmluZyBtX0ZhbWlseTsKKworICBpbnQgbV9DaGFyc2V0OworCisgIEZYX0RXT1JEIG1fU3Vic3RGbGFnczsKKworICBpbnQgbV9XZWlnaHQ7CisKKyAgaW50IG1fSXRhbGljQW5nbGU7CisKKyAgRlhfQk9PTCBtX2JTdWJzdE9mQ0pLOworCisgIGludCBtX1dlaWdodENKSzsKKworICBGWF9CT09MIG1fYkl0bGljQ0pLOwogfTsKLWNsYXNzIElGWF9Gb250TWFwcGVyIAotewotcHVibGljOgorI2RlZmluZSBGWF9GT05UX0ZMQUdfU0VSSUYgMHgwMQorI2RlZmluZSBGWF9GT05UX0ZMQUdfRklYRURQSVRDSCAweDAyCisjZGVmaW5lIEZYX0ZPTlRfRkxBR19JVEFMSUMgMHgwNAorI2RlZmluZSBGWF9GT05UX0ZMQUdfQk9MRCAweDA4CisjZGVmaW5lIEZYX0ZPTlRfRkxBR19TWU1CT0xJQ19TWU1CT0wgMHgxMAorI2RlZmluZSBGWF9GT05UX0ZMQUdfU1lNQk9MSUNfRElOR0JBVFMgMHgyMAorI2RlZmluZSBGWF9GT05UX0ZMQUdfTVVMVElQTEVNQVNURVIgMHg0MAogCi0gICAgdmlydHVhbCB+SUZYX0ZvbnRNYXBwZXIoKSB7fQorY2xhc3MgQ0ZYX0ZvbnRNZ3IgeworIHB1YmxpYzoKKyAgQ0ZYX0ZvbnRNZ3IoKTsKKyAgfkNGWF9Gb250TWdyKCk7CiAKLSAgICB2aXJ0dWFsIEZYRlRfRmFjZQlGaW5kU3Vic3RGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsIEZYX0JPT0wgYlRydWVUeXBlLCBGWF9EV09SRCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgaW50IGl0YWxpY19hbmdsZSwgaW50IENoYXJzZXRDUCwgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCkgPSAwOworICB2b2lkIEluaXRGVExpYnJhcnkoKTsKIAotICAgIENGWF9Gb250TWdyKgkJbV9wRm9udE1ncjsKLX07Ci1jbGFzcyBJRlhfRm9udEVudW1lcmF0b3IKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5JRlhfRm9udEVudW1lcmF0b3IoKSB7IH0KKyAgRlhGVF9GYWNlIEdldENhY2hlZEZhY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGZhY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXRhbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgcEZvbnREYXRhKTsKKyAgRlhGVF9GYWNlIEFkZENhY2hlZEZhY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGZhY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXRhbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZhY2VfaW5kZXgpOworICBGWEZUX0ZhY2UgR2V0Q2FjaGVkVFRDRmFjZShpbnQgdHRjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNoZWNrc3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9udF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBwRm9udERhdGEpOworICBGWEZUX0ZhY2UgQWRkQ2FjaGVkVFRDRmFjZShpbnQgdHRjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNoZWNrc3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbnRfb2Zmc2V0KTsKKyAgRlhGVF9GYWNlIEdldEZpbGVGYWNlKGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLCBpbnQgZmFjZV9pbmRleCk7CisgIEZYRlRfRmFjZSBHZXRGaXhlZEZhY2UoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIGludCBmYWNlX2luZGV4KTsKKyAgdm9pZCBSZWxlYXNlRmFjZShGWEZUX0ZhY2UgZmFjZSk7CisgIHZvaWQgU2V0U3lzdGVtRm9udEluZm8oSUZYX1N5c3RlbUZvbnRJbmZvKiBwRm9udEluZm8pOworICBGWEZUX0ZhY2UgRmluZFN1YnN0Rm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUcnVlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGFsaWNfYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDaGFyc2V0Q1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9TdWJzdEZvbnQqIHBTdWJzdEZvbnQpOworICBib29sIEdldEJ1aWx0aW5Gb250KHNpemVfdCBpbmRleCwgY29uc3QgdWludDhfdCoqIHBGb250RGF0YSwgRlhfRFdPUkQqIHNpemUpOworICBDRlhfRm9udE1hcHBlciogR2V0QnVpbHRpbk1hcHBlcigpIGNvbnN0IHsgcmV0dXJuIG1fcEJ1aWx0aW5NYXBwZXIuZ2V0KCk7IH0KKyAgRlhGVF9MaWJyYXJ5IEdldEZUTGlicmFyeSgpIGNvbnN0IHsgcmV0dXJuIG1fRlRMaWJyYXJ5OyB9CiAKLSAgICB2aXJ0dWFsIHZvaWQJCUhpdEZvbnQoKSA9IDA7CisgcHJpdmF0ZToKKyAgc3RkOjp1bmlxdWVfcHRyPENGWF9Gb250TWFwcGVyPiBtX3BCdWlsdGluTWFwcGVyOworICBzdGQ6Om1hcDxDRlhfQnl0ZVN0cmluZywgQ1RURm9udERlc2MqPiBtX0ZhY2VNYXA7CisgIEZYRlRfTGlicmFyeSBtX0ZUTGlicmFyeTsKK307CiAKLSAgICB2aXJ0dWFsIHZvaWQJCUZpbmlzaCgpID0gMDsKLX07Ci1jbGFzcyBJRlhfQWRkaXRpb25hbEZvbnRFbnVtCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+SUZYX0FkZGl0aW9uYWxGb250RW51bSgpIHsgfQotICAgIHZpcnR1YWwgaW50ICBDb3VudEZpbGVzKCkgPSAwOwotICAgIHZpcnR1YWwgSUZYX0ZpbGVTdHJlYW0qIEdldEZvbnRGaWxlKGludCBpbmRleCkgPSAwOwotfTsKLWNsYXNzIENGWF9Gb250TWFwcGVyIDogcHVibGljIElGWF9Gb250TWFwcGVyCi17Ci1wdWJsaWM6Ci0gICAgQ0ZYX0ZvbnRNYXBwZXIoKTsKLSAgICB2aXJ0dWFsIH5DRlhfRm9udE1hcHBlcigpOwotICAgIHZvaWQJCQkJU2V0U3lzdGVtRm9udEluZm8oSUZYX1N5c3RlbUZvbnRJbmZvKiBwRm9udEluZm8pOwotICAgIElGWF9TeXN0ZW1Gb250SW5mbyoJR2V0U3lzdGVtRm9udEluZm8oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEZvbnRJbmZvOwotICAgIH0KLSAgICB2b2lkCQkJCUFkZEluc3RhbGxlZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsIGludCBjaGFyc2V0KTsKLSAgICB2b2lkCQkJCUxvYWRJbnN0YWxsZWRGb250cygpOwotICAgIENGWF9CeXRlU3RyaW5nQXJyYXkJbV9JbnN0YWxsZWRUVEZvbnRzOwotICAgIHZvaWQJCQkJU2V0Rm9udEVudW1lcmF0b3IoSUZYX0ZvbnRFbnVtZXJhdG9yKiBwRm9udEVudW1lcmF0b3IpCi0gICAgewotICAgICAgICBtX3BGb250RW51bWVyYXRvciA9IHBGb250RW51bWVyYXRvcjsKLSAgICB9Ci0gICAgSUZYX0ZvbnRFbnVtZXJhdG9yKglHZXRGb250RW51bWVyYXRvcigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRm9udEVudW1lcmF0b3I7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhGVF9GYWNlCUZpbmRTdWJzdEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGZhY2VfbmFtZSwgRlhfQk9PTCBiVHJ1ZVR5cGUsIEZYX0RXT1JEIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LCBpbnQgaXRhbGljX2FuZ2xlLCBpbnQgQ2hhcnNldENQLCBDRlhfU3Vic3RGb250KiBwU3Vic3RGb250KTsKLXByaXZhdGU6Ci0gICAgQ0ZYX0J5dGVTdHJpbmcJCUdldFBTTmFtZUZyb21UVCh2b2lkKiBoRm9udCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcJCU1hdGNoSW5zdGFsbGVkRm9udHMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5vcm1fbmFtZSk7Ci0gICAgRlhGVF9GYWNlCQkJVXNlSW50ZXJuYWxTdWJzdChDRlhfU3Vic3RGb250KiBwU3Vic3RGb250LCBpbnQgaUJhc2VGb250LCBpbnQgaXRhbGljX2FuZ2xlLCBpbnQgd2VpZ2h0LCBpbnQgcGljdGhmYW1pbHkpOworY2xhc3MgSUZYX0ZvbnRFbnVtZXJhdG9yIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBIaXRGb250KCkgPSAwOwogCi0gICAgRlhfQk9PTAkJCQltX2JMaXN0TG9hZGVkOwotICAgIEZYRlRfRmFjZQkJCW1fTU1GYWNlc1syXTsKLSAgICBDRlhfQnl0ZVN0cmluZwkJbV9MYXN0RmFtaWx5OwotICAgIENGWF9EV29yZEFycmF5CQltX0NoYXJzZXRBcnJheTsKLSAgICBDRlhfQnl0ZVN0cmluZ0FycmF5CW1fRmFjZUFycmF5OwotICAgIElGWF9TeXN0ZW1Gb250SW5mbyoJbV9wRm9udEluZm87Ci0gICAgRlhGVF9GYWNlCQkJbV9Gb3hpdEZhY2VzWzE0XTsKLSAgICBJRlhfRm9udEVudW1lcmF0b3IqCQltX3BGb250RW51bWVyYXRvcjsKLX07Ci1jbGFzcyBJRlhfU3lzdGVtRm9udEluZm8gCi17Ci1wdWJsaWM6Ci0gICAgc3RhdGljIElGWF9TeXN0ZW1Gb250SW5mbyoJQ3JlYXRlRGVmYXVsdCgpOwotICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpID0gMDsKKyAgdmlydHVhbCB2b2lkIEZpbmlzaCgpID0gMDsKIAotICAgIHZpcnR1YWwJRlhfQk9PTAkJRW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkKgkJTWFwRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBGWF9MUENTVFIgZmFjZSwgRlhfQk9PTCYgYkV4YWN0KSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkKgkJR2V0Rm9udChGWF9MUENTVFIgZmFjZSkgPSAwOwotICAgIHZpcnR1YWwgRlhfRFdPUkQJR2V0Rm9udERhdGEodm9pZCogaEZvbnQsIEZYX0RXT1JEIHRhYmxlLCBGWF9MUEJZVEUgYnVmZmVyLCBGWF9EV09SRCBzaXplKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpID0gMDsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpID0gMDsKLSAgICB2aXJ0dWFsIGludAkJCUdldEZhY2VJbmRleCh2b2lkKiBoRm9udCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQJCURlbGV0ZUZvbnQodm9pZCogaEZvbnQpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQqICAgICAgIFJldGFpbkZvbnQodm9pZCogaEZvbnQpCi0gICAgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci1wcm90ZWN0ZWQ6Ci0gICAgfklGWF9TeXN0ZW1Gb250SW5mbygpIHsgfQorIHByb3RlY3RlZDoKKyAgdmlydHVhbCB+SUZYX0ZvbnRFbnVtZXJhdG9yKCkge30KIH07Ci1jbGFzcyBDRlhfRm9sZGVyRm9udEluZm8gOiBwdWJsaWMgSUZYX1N5c3RlbUZvbnRJbmZvCi17Ci1wdWJsaWM6Ci0gICAgQ0ZYX0ZvbGRlckZvbnRJbmZvKCk7Ci0gICAgdmlydHVhbCB+Q0ZYX0ZvbGRlckZvbnRJbmZvKCk7Ci0gICAgdm9pZAkJCQlBZGRQYXRoKEZYX0JTVFIgcGF0aCk7Ci0gICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCk7Ci0gICAgdmlydHVhbAlGWF9CT09MCQlFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpOwotICAgIHZpcnR1YWwgdm9pZCoJCU1hcEZvbnQoaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgRlhfTFBDU1RSIGZhY2UsIEZYX0JPT0wmIGJFeGFjdCk7Ci0gICAgdmlydHVhbCB2b2lkKgkJR2V0Rm9udChGWF9MUENTVFIgZmFjZSk7Ci0gICAgdmlydHVhbCBGWF9EV09SRAlHZXRGb250RGF0YSh2b2lkKiBoRm9udCwgRlhfRFdPUkQgdGFibGUsIEZYX0xQQllURSBidWZmZXIsIEZYX0RXT1JEIHNpemUpOwotICAgIHZpcnR1YWwgdm9pZAkJRGVsZXRlRm9udCh2b2lkKiBoRm9udCk7Ci0gICAgdmlydHVhbAlGWF9CT09MCQlHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCk7Ci1wcm90ZWN0ZWQ6Ci0gICAgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cgltX0ZvbnRMaXN0OwotICAgIENGWF9CeXRlU3RyaW5nQXJyYXkJbV9QYXRoTGlzdDsKLSAgICBDRlhfRm9udE1hcHBlcioJCW1fcE1hcHBlcjsKLSAgICB2b2lkCQkJCVNjYW5QYXRoKENGWF9CeXRlU3RyaW5nJiBwYXRoKTsKLSAgICB2b2lkCQkJCVNjYW5GaWxlKENGWF9CeXRlU3RyaW5nJiBwYXRoKTsKLSAgICB2b2lkCQkJCVJlcG9ydEZhY2UoQ0ZYX0J5dGVTdHJpbmcmIHBhdGgsIEZYU1lTX0ZJTEUqIHBGaWxlLCBGWF9EV09SRCBmaWxlc2l6ZSwgRlhfRFdPUkQgb2Zmc2V0KTsKLX07Ci1jbGFzcyBDRlhfQ291bnRlZEZhY2VDYWNoZSAKLXsKLXB1YmxpYzoKLSAgICBDRlhfRmFjZUNhY2hlKgltX09iajsKLSAgICBGWF9EV09SRAkJbV9uQ291bnQ7Ci19OwotdHlwZWRlZiBDRlhfTWFwUHRyVGVtcGxhdGU8RlhGVF9GYWNlLCBDRlhfQ291bnRlZEZhY2VDYWNoZSo+IENGWF9GVENhY2hlTWFwOwotY2xhc3MgQ0ZYX0ZvbnRDYWNoZSAKLXsKLXB1YmxpYzoKLSAgICB+Q0ZYX0ZvbnRDYWNoZSgpOwotICAgIENGWF9GYWNlQ2FjaGUqCQkJR2V0Q2FjaGVkRmFjZShDRlhfRm9udCogcEZvbnQpOwotICAgIHZvaWQJCQkJCVJlbGVhc2VDYWNoZWRGYWNlKENGWF9Gb250KiBwRm9udCk7Ci0gICAgdm9pZAkJCQkJRnJlZUNhY2hlKEZYX0JPT0wgYlJlbGVhc2UgPSBGQUxTRSk7CiAKLXByaXZhdGU6Ci0gICAgQ0ZYX0ZUQ2FjaGVNYXAJCQltX0ZURmFjZU1hcDsKLSAgICBDRlhfRlRDYWNoZU1hcAkJCW1fRXh0RmFjZU1hcDsKLX07Ci1jbGFzcyBDRlhfQXV0b0ZvbnRDYWNoZQotewotcHVibGljOgotICAgIENGWF9BdXRvRm9udENhY2hlKENGWF9Gb250Q2FjaGUqIHBGb250Q2FjaGUsIENGWF9Gb250KiBwRm9udCkKLSAgICAgICAgOiBtX3BGb250Q2FjaGUocEZvbnRDYWNoZSkKLSAgICAgICAgLCBtX3BGb250KHBGb250KQotICAgIHsKLSAgICB9Ci0gICAgfkNGWF9BdXRvRm9udENhY2hlKCkKLSAgICB7Ci0gICAgICAgIG1fcEZvbnRDYWNoZS0+UmVsZWFzZUNhY2hlZEZhY2UobV9wRm9udCk7Ci0gICAgfQotICAgIENGWF9Gb250Q2FjaGUqIG1fcEZvbnRDYWNoZTsKLSAgICBDRlhfRm9udCogbV9wRm9udDsKLX07Ci0jZGVmaW5lIEZYX0ZPTlRDQUNIRV9ERUZJTkUocEZvbnRDYWNoZSwgcEZvbnQpIENGWF9BdXRvRm9udENhY2hlIGF1dG9Gb250Q2FjaGUoKHBGb250Q2FjaGUpLCAocEZvbnQpKQotY2xhc3MgQ0ZYX0dseXBoQml0bWFwIAotewotcHVibGljOgotICAgIGludAkJCQkJCW1fVG9wOwotICAgIGludAkJCQkJCW1fTGVmdDsKLSAgICBDRlhfRElCaXRtYXAJCQltX0JpdG1hcDsKLX07Ci1jbGFzcyBDRlhfRmFjZUNhY2hlIAotewotcHVibGljOgotICAgIH5DRlhfRmFjZUNhY2hlKCk7Ci0gICAgY29uc3QgQ0ZYX0dseXBoQml0bWFwKglMb2FkR2x5cGhCaXRtYXAoQ0ZYX0ZvbnQqIHBGb250LCBGWF9EV09SRCBnbHlwaF9pbmRleCwgRlhfQk9PTCBiRm9udFN0eWxlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGFudGlfYWxpYXMsIGludCYgdGV4dF9mbGFncyk7Ci0gICAgY29uc3QgQ0ZYX1BhdGhEYXRhKgkJTG9hZEdseXBoUGF0aChDRlhfRm9udCogcEZvbnQsIEZYX0RXT1JEIGdseXBoX2luZGV4LCBpbnQgZGVzdF93aWR0aCk7CitjbGFzcyBJRlhfQWRkaXRpb25hbEZvbnRFbnVtIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgaW50IENvdW50RmlsZXMoKSA9IDA7CisgIHZpcnR1YWwgSUZYX0ZpbGVTdHJlYW0qIEdldEZvbnRGaWxlKGludCBpbmRleCkgPSAwOwogCi0KLSAgICBDRlhfRmFjZUNhY2hlKEZYRlRfRmFjZSBmYWNlKTsKLXByaXZhdGU6Ci0gICAgRlhGVF9GYWNlCQkJCW1fRmFjZTsKLSAgICBDRlhfR2x5cGhCaXRtYXAqCQlSZW5kZXJHbHlwaChDRlhfRm9udCogcEZvbnQsIEZYX0RXT1JEIGdseXBoX2luZGV4LCBGWF9CT09MIGJGb250U3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgaW50IGRlc3Rfd2lkdGgsIGludCBhbnRpX2FsaWFzKTsKLSAgICBDRlhfR2x5cGhCaXRtYXAqCQlSZW5kZXJHbHlwaF9OYXRpdmV0ZXh0KENGWF9Gb250KiBwRm9udCwgRlhfRFdPUkQgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBpbnQgZGVzdF93aWR0aCwgaW50IGFudGlfYWxpYXMpOwotICAgIENGWF9HbHlwaEJpdG1hcCogICAgICAgIExvb2tVcEdseXBoQml0bWFwKENGWF9Gb250KiBwRm9udCwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgQ0ZYX0J5dGVTdHJpbmdDJiBGYWNlR2x5cGhzS2V5LAotICAgICAgICAgICAgRlhfRFdPUkQgZ2x5cGhfaW5kZXgsIEZYX0JPT0wgYkZvbnRTdHlsZSwgaW50IGRlc3Rfd2lkdGgsIGludCBhbnRpX2FsaWFzKTsKLSAgICBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyCW1fU2l6ZU1hcDsKLSAgICBDRlhfTWFwUHRyVG9QdHIJCQltX1BhdGhNYXA7Ci0gICAgQ0ZYX0RJQml0bWFwKiAgICAgICAgICAgbV9wQml0bWFwOwotICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIG1fcFBsYXRmb3JtR3JhcGhpY3M7Ci0gICAgdm9pZCogICAgICAgICAgICAgICAgICAgbV9wUGxhdGZvcm1CaXRtYXA7Ci0gICAgdm9pZCogICAgICAgICAgICAgICAgICAgbV9oREM7Ci0gICAgdm9pZCogICAgICAgICAgICAgICAgICAgbV9oQml0bWFwOwotICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIG1faE9sZEJpdG1hcDsKLSAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBtX2hHZGlGb250OwotICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIG1faE9sZEdkaUZvbnQ7Ci0KLSAgICB2b2lkCQkJCSAgICBJbml0UGxhdGZvcm0oKTsKLSAgICB2b2lkCQkJCSAgICBEZXN0cm95UGxhdGZvcm0oKTsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgfklGWF9BZGRpdGlvbmFsRm9udEVudW0oKSB7fQogfTsKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjb25zdCBDRlhfR2x5cGhCaXRtYXAqCW1fcEdseXBoOwotICAgIGludAkJCQkJbV9PcmlnaW5YLCBtX09yaWdpblk7Ci0gICAgRlhfRkxPQVQJCQltX2ZPcmlnaW5YLCBtX2ZPcmlnaW5ZOwotfSBGWFRFWFRfR0xZUEhQT1M7Ci1GWF9SRUNUIEZYR0VfR2V0R2x5cGhzQkJveChGWFRFWFRfR0xZUEhQT1MqIHBHbHlwaEFuZFBvcywgaW50IG5DaGFycywgaW50IGFudGlfYWxpYXMsIEZYX0ZMT0FUIHJldGluYVNjYWxlWCA9IDEuMGYsIEZYX0ZMT0FUIHJldGluYVNjYWxlWSA9IDEuMGYpOwotRlhfQk9PTAlPdXRwdXRHbHlwaCh2b2lkKiBkaWIsIGludCB4LCBpbnQgeSwgQ0ZYX0ZvbnQqIHBGb250LCBkb3VibGUgZm9udF9zaXplLAotICAgICAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCB1bnNpZ25lZCBsb25nIGdseXBoX2luZGV4LCB1bnNpZ25lZCBsb25nIGFyZ2IpOwotRlhfQk9PTAlPdXRwdXRUZXh0KHZvaWQqIGRpYiwgaW50IHgsIGludCB5LCBDRlhfRm9udCogcEZvbnQsIGRvdWJsZSBmb250X3NpemUsCi0gICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHRfbWF0cml4LCB1bnNpZ25lZCBzaG9ydCBjb25zdCogdGV4dCwgdW5zaWduZWQgbG9uZyBhcmdiKTsKLWNsYXNzIElGWF9HU1VCVGFibGUKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQJUmVsZWFzZSgpID0gMDsKLSAgICB2aXJ0dWFsIEZYX0JPT0wgR2V0VmVydGljYWxHbHlwaChGWF9EV09SRCBnbHlwaG51bSwgRlhfRFdPUkQqIHZnbHlwaG51bSkgPSAwOwogCi1wcm90ZWN0ZWQ6Ci0gICAgIH5JRlhfR1NVQlRhYmxlKCkgeyB9CitjbGFzcyBDRlhfRm9udE1hcHBlciB7CisgcHVibGljOgorICBleHBsaWNpdCBDRlhfRm9udE1hcHBlcihDRlhfRm9udE1nciogbWdyKTsKKyAgfkNGWF9Gb250TWFwcGVyKCk7CisKKyAgdm9pZCBTZXRTeXN0ZW1Gb250SW5mbyhJRlhfU3lzdGVtRm9udEluZm8qIHBGb250SW5mbyk7CisgIElGWF9TeXN0ZW1Gb250SW5mbyogR2V0U3lzdGVtRm9udEluZm8oKSB7IHJldHVybiBtX3BGb250SW5mbzsgfQorICB2b2lkIEFkZEluc3RhbGxlZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsIGludCBjaGFyc2V0KTsKKyAgdm9pZCBMb2FkSW5zdGFsbGVkRm9udHMoKTsKKyAgQ0ZYX0J5dGVTdHJpbmdBcnJheSBtX0luc3RhbGxlZFRURm9udHM7CisgIHZvaWQgU2V0Rm9udEVudW1lcmF0b3IoSUZYX0ZvbnRFbnVtZXJhdG9yKiBwRm9udEVudW1lcmF0b3IpIHsKKyAgICBtX3BGb250RW51bWVyYXRvciA9IHBGb250RW51bWVyYXRvcjsKKyAgfQorICBJRlhfRm9udEVudW1lcmF0b3IqIEdldEZvbnRFbnVtZXJhdG9yKCkgY29uc3QgeyByZXR1cm4gbV9wRm9udEVudW1lcmF0b3I7IH0KKyAgRlhGVF9GYWNlIEZpbmRTdWJzdEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGZhY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJ1ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRhbGljX2FuZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ2hhcnNldENQLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfU3Vic3RGb250KiBwU3Vic3RGb250KTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBGWEZUX0ZhY2UgRmluZFN1YnN0Rm9udEJ5VW5pY29kZShGWF9EV09SRCBkd1VuaWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRhbGljX2FuZ2xlKTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgRlhfQk9PTCBJc0J1aWx0aW5GYWNlKGNvbnN0IEZYRlRfRmFjZSBmYWNlKSBjb25zdDsKKworIHByaXZhdGU6CisgIHN0YXRpYyBjb25zdCBzaXplX3QgTU1fRkFDRV9DT1VOVCA9IDI7CisgIHN0YXRpYyBjb25zdCBzaXplX3QgRk9YSVRfRkFDRV9DT1VOVCA9IDE0OworCisgIENGWF9CeXRlU3RyaW5nIEdldFBTTmFtZUZyb21UVCh2b2lkKiBoRm9udCk7CisgIENGWF9CeXRlU3RyaW5nIE1hdGNoSW5zdGFsbGVkRm9udHMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5vcm1fbmFtZSk7CisgIEZYRlRfRmFjZSBVc2VJbnRlcm5hbFN1YnN0KENGWF9TdWJzdEZvbnQqIHBTdWJzdEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpQmFzZUZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGFsaWNfYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaWN0aGZhbWlseSk7CisKKyAgRlhfQk9PTCBtX2JMaXN0TG9hZGVkOworICBGWEZUX0ZhY2UgbV9NTUZhY2VzW01NX0ZBQ0VfQ09VTlRdOworICBDRlhfQnl0ZVN0cmluZyBtX0xhc3RGYW1pbHk7CisgIENGWF9EV29yZEFycmF5IG1fQ2hhcnNldEFycmF5OworICBDRlhfQnl0ZVN0cmluZ0FycmF5IG1fRmFjZUFycmF5OworICBJRlhfU3lzdGVtRm9udEluZm8qIG1fcEZvbnRJbmZvOworICBGWEZUX0ZhY2UgbV9Gb3hpdEZhY2VzW0ZPWElUX0ZBQ0VfQ09VTlRdOworICBJRlhfRm9udEVudW1lcmF0b3IqIG1fcEZvbnRFbnVtZXJhdG9yOworICBDRlhfRm9udE1nciogY29uc3QgbV9wRm9udE1ncjsKIH07Ci1JRlhfR1NVQlRhYmxlKiBGWEdFX0NyZWF0ZUdTVUJUYWJsZShDRlhfRm9udCogcEZvbnQpOworCitjbGFzcyBJRlhfU3lzdGVtRm9udEluZm8geworIHB1YmxpYzoKKyAgc3RhdGljIElGWF9TeXN0ZW1Gb250SW5mbyogQ3JlYXRlRGVmYXVsdChjb25zdCBjaGFyKiogcFVzZXJQYXRocyk7CisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOworCisgIHZpcnR1YWwgRlhfQk9PTCBFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpID0gMDsKKyAgdmlydHVhbCB2b2lkKiBNYXBGb250KGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJdGFsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBpRXhhY3QpID0gMDsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICB2aXJ0dWFsIHZvaWQqIE1hcEZvbnRCeVVuaWNvZGUoRlhfRFdPUkQgZHdVbmljb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICB2aXJ0dWFsIHZvaWQqIEdldEZvbnQoY29uc3QgRlhfQ0hBUiogZmFjZSkgPSAwOworICB2aXJ0dWFsIEZYX0RXT1JEIEdldEZvbnREYXRhKHZvaWQqIGhGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIEdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpID0gMDsKKyAgdmlydHVhbCBpbnQgR2V0RmFjZUluZGV4KHZvaWQqIGhGb250KSB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgdm9pZCBEZWxldGVGb250KHZvaWQqIGhGb250KSA9IDA7CisgIHZpcnR1YWwgdm9pZCogUmV0YWluRm9udCh2b2lkKiBoRm9udCkgeyByZXR1cm4gTlVMTDsgfQorCisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIH5JRlhfU3lzdGVtRm9udEluZm8oKSB7fQorfTsKKworY2xhc3MgQ0ZYX0ZvbGRlckZvbnRJbmZvIDogcHVibGljIElGWF9TeXN0ZW1Gb250SW5mbyB7CisgcHVibGljOgorICBDRlhfRm9sZGVyRm9udEluZm8oKTsKKyAgfkNGWF9Gb2xkZXJGb250SW5mbygpIG92ZXJyaWRlOworICB2b2lkIEFkZFBhdGgoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBwYXRoKTsKKworICAvLyBJRlhfU3l0ZW1Gb250SW5mbzoKKyAgdm9pZCBSZWxlYXNlKCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgRW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKSBvdmVycmlkZTsKKyAgdm9pZCogTWFwRm9udChpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgIEZYX0JPT0wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfZmFtaWx5LAorICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGZhY2UsCisgICAgICAgICAgICAgICAgaW50JiBiRXhhY3QpIG92ZXJyaWRlOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIHZvaWQqIE1hcEZvbnRCeVVuaWNvZGUoRlhfRFdPUkQgZHdVbmljb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXRhbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHkpIG92ZXJyaWRlOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICB2b2lkKiBHZXRGb250KGNvbnN0IEZYX0NIQVIqIGZhY2UpIG92ZXJyaWRlOworICBGWF9EV09SRCBHZXRGb250RGF0YSh2b2lkKiBoRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSkgb3ZlcnJpZGU7CisgIHZvaWQgRGVsZXRlRm9udCh2b2lkKiBoRm9udCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KSBvdmVycmlkZTsKKworIHByb3RlY3RlZDoKKyAgc3RkOjptYXA8Q0ZYX0J5dGVTdHJpbmcsIENGWF9Gb250RmFjZUluZm8qPiBtX0ZvbnRMaXN0OworICBDRlhfQnl0ZVN0cmluZ0FycmF5IG1fUGF0aExpc3Q7CisgIENGWF9Gb250TWFwcGVyKiBtX3BNYXBwZXI7CisgIHZvaWQgU2NhblBhdGgoQ0ZYX0J5dGVTdHJpbmcmIHBhdGgpOworICB2b2lkIFNjYW5GaWxlKENGWF9CeXRlU3RyaW5nJiBwYXRoKTsKKyAgdm9pZCBSZXBvcnRGYWNlKENGWF9CeXRlU3RyaW5nJiBwYXRoLAorICAgICAgICAgICAgICAgICAgRlhTWVNfRklMRSogcEZpbGUsCisgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxlc2l6ZSwKKyAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG9mZnNldCk7CisgIHZvaWQqIEdldFN1YnN0Rm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZSk7CisgIHZvaWQqIEZpbmRGb250KGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICAgaW50IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHksCisgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwKKyAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTWF0Y2hOYW1lKTsKK307CitjbGFzcyBDRlhfQ291bnRlZEZhY2VDYWNoZSB7CisgcHVibGljOgorICBDRlhfRmFjZUNhY2hlKiBtX09iajsKKyAgRlhfRFdPUkQgbV9uQ291bnQ7Cit9OworCitjbGFzcyBDRlhfRm9udENhY2hlIHsKKyBwdWJsaWM6CisgIH5DRlhfRm9udENhY2hlKCk7CisgIENGWF9GYWNlQ2FjaGUqIEdldENhY2hlZEZhY2UoQ0ZYX0ZvbnQqIHBGb250KTsKKyAgdm9pZCBSZWxlYXNlQ2FjaGVkRmFjZShDRlhfRm9udCogcEZvbnQpOworICB2b2lkIEZyZWVDYWNoZShGWF9CT09MIGJSZWxlYXNlID0gRkFMU0UpOworCisgcHJpdmF0ZToKKyAgdXNpbmcgQ0ZYX0ZUQ2FjaGVNYXAgPSBzdGQ6Om1hcDxGWEZUX0ZhY2UsIENGWF9Db3VudGVkRmFjZUNhY2hlKj47CisgIENGWF9GVENhY2hlTWFwIG1fRlRGYWNlTWFwOworICBDRlhfRlRDYWNoZU1hcCBtX0V4dEZhY2VNYXA7Cit9OworY2xhc3MgQ0ZYX0F1dG9Gb250Q2FjaGUgeworIHB1YmxpYzoKKyAgQ0ZYX0F1dG9Gb250Q2FjaGUoQ0ZYX0ZvbnRDYWNoZSogcEZvbnRDYWNoZSwgQ0ZYX0ZvbnQqIHBGb250KQorICAgICAgOiBtX3BGb250Q2FjaGUocEZvbnRDYWNoZSksIG1fcEZvbnQocEZvbnQpIHt9CisgIH5DRlhfQXV0b0ZvbnRDYWNoZSgpIHsgbV9wRm9udENhY2hlLT5SZWxlYXNlQ2FjaGVkRmFjZShtX3BGb250KTsgfQorICBDRlhfRm9udENhY2hlKiBtX3BGb250Q2FjaGU7CisgIENGWF9Gb250KiBtX3BGb250OworfTsKKyNkZWZpbmUgRlhfRk9OVENBQ0hFX0RFRklORShwRm9udENhY2hlLCBwRm9udCkgXAorICBDRlhfQXV0b0ZvbnRDYWNoZSBhdXRvRm9udENhY2hlKChwRm9udENhY2hlKSwgKHBGb250KSkKK2NsYXNzIENGWF9HbHlwaEJpdG1hcCB7CisgcHVibGljOgorICBpbnQgbV9Ub3A7CisgIGludCBtX0xlZnQ7CisgIENGWF9ESUJpdG1hcCBtX0JpdG1hcDsKK307CitjbGFzcyBDRlhfRmFjZUNhY2hlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENGWF9GYWNlQ2FjaGUoRlhGVF9GYWNlIGZhY2UpOworICB+Q0ZYX0ZhY2VDYWNoZSgpOworICBjb25zdCBDRlhfR2x5cGhCaXRtYXAqIExvYWRHbHlwaEJpdG1hcChDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGb250U3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW50aV9hbGlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiB0ZXh0X2ZsYWdzKTsKKyAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBMb2FkR2x5cGhQYXRoKENGWF9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgpOworCisgcHJpdmF0ZToKKyAgQ0ZYX0dseXBoQml0bWFwKiBSZW5kZXJHbHlwaChDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRm9udFN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFudGlfYWxpYXMpOworICBDRlhfR2x5cGhCaXRtYXAqIFJlbmRlckdseXBoX05hdGl2ZXRleHQoQ0ZYX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW50aV9hbGlhcyk7CisgIENGWF9HbHlwaEJpdG1hcCogTG9va1VwR2x5cGhCaXRtYXAoQ0ZYX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDJiBGYWNlR2x5cGhzS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZvbnRTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW50aV9hbGlhcyk7CisgIHZvaWQgSW5pdFBsYXRmb3JtKCk7CisgIHZvaWQgRGVzdHJveVBsYXRmb3JtKCk7CisKKyAgRlhGVF9GYWNlIGNvbnN0IG1fRmFjZTsKKyAgc3RkOjptYXA8Q0ZYX0J5dGVTdHJpbmcsIENGWF9TaXplR2x5cGhDYWNoZSo+IG1fU2l6ZU1hcDsKKyAgc3RkOjptYXA8RlhfRFdPUkQsIENGWF9QYXRoRGF0YSo+IG1fUGF0aE1hcDsKKyAgQ0ZYX0RJQml0bWFwKiBtX3BCaXRtYXA7Cit9OworCitzdHJ1Y3QgRlhURVhUX0dMWVBIUE9TIHsKKyAgY29uc3QgQ0ZYX0dseXBoQml0bWFwKiBtX3BHbHlwaDsKKyAgaW50IG1fT3JpZ2luWDsKKyAgaW50IG1fT3JpZ2luWTsKKyAgRlhfRkxPQVQgbV9mT3JpZ2luWDsKKyAgRlhfRkxPQVQgbV9mT3JpZ2luWTsKK307CisKK0ZYX1JFQ1QgRlhHRV9HZXRHbHlwaHNCQm94KEZYVEVYVF9HTFlQSFBPUyogcEdseXBoQW5kUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5DaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbnRpX2FsaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcmV0aW5hU2NhbGVYID0gMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHJldGluYVNjYWxlWSA9IDEuMGYpOworCitjbGFzcyBJRlhfR1NVQlRhYmxlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBJRlhfR1NVQlRhYmxlKiBDcmVhdGUoQ0ZYX0ZvbnQqIHBGb250KTsKKyAgdmlydHVhbCBGWF9CT09MIEdldFZlcnRpY2FsR2x5cGgoRlhfRFdPUkQgZ2x5cGhudW0sIEZYX0RXT1JEKiB2Z2x5cGhudW0pID0gMDsKKworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB+SUZYX0dTVUJUYWJsZSgpIHt9Cit9OworCitDRlhfQnl0ZVN0cmluZyBHZXROYW1lRnJvbVRUKGNvbnN0IHVpbnQ4X3QqIG5hbWVfdGFibGUsIEZYX0RXT1JEIG5hbWUpOworCitpbnQgUERGX0dldFN0YW5kYXJkRm9udE5hbWUoQ0ZYX0J5dGVTdHJpbmcqIG5hbWUpOwogCiAjZW5kaWYgIC8vIENPUkVfSU5DTFVERV9GWEdFX0ZYX0ZPTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2ZyZWV0eXBlLmggYi9jb3JlL2luY2x1ZGUvZnhnZS9meF9mcmVldHlwZS5oCmluZGV4IDdhZDk4MTIuLmM3YzgyOTUgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2ZyZWV0eXBlLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZnJlZXR5cGUuaApAQCAtMSwxOSArMSwxOSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIENPUkVfSU5DTFVERV9GWEdFX0ZYX0ZSRUVUWVBFX0hfCiAjZGVmaW5lIENPUkVfSU5DTFVERV9GWEdFX0ZYX0ZSRUVUWVBFX0hfCiAKICNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfR0xZUEhfSAotI2luY2x1ZGUgRlRfTENEX0ZJTFRFUl9ICi0jaW5jbHVkZSBGVF9NVUxUSVBMRV9NQVNURVJTX0gKLSNpbmNsdWRlIEZUX09VVExJTkVfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFCTEVTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS5oPgorI2luY2x1ZGUgPGZ0Z2x5cGguaD4KKyNpbmNsdWRlIDxmdGxjZGZpbC5oPgorI2luY2x1ZGUgPGZ0bW0uaD4KKyNpbmNsdWRlIDxmdG91dGxuLmg+CisjaW5jbHVkZSA8dHR0YWJsZXMuaD4KICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKQEAgLTMwLDcgKzMwLDggQEAKICNkZWZpbmUgRlhGVF9FTkNPRElOR19KT0hBQiBGVF9FTkNPRElOR19KT0hBQgogI2RlZmluZSBGWEZUX0VOQ09ESU5HX1dBTlNVTkcgRlRfRU5DT0RJTkdfV0FOU1VORwogI2RlZmluZSBGWEZUX0xPQURfTk9fU0NBTEUgRlRfTE9BRF9OT19TQ0FMRQotI2RlZmluZSBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIIEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRICisjZGVmaW5lIEZYRlRfTE9BRF9JR05PUkVfR0xPQkFMX0FEVkFOQ0VfV0lEVEggXAorICBGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSAogI2RlZmluZSBGWEZUX1JFTkRFUl9NT0RFX0xDRCBGVF9SRU5ERVJfTU9ERV9MQ0QKICNkZWZpbmUgRlhGVF9SRU5ERVJfTU9ERV9NT05PIEZUX1JFTkRFUl9NT0RFX01PTk8KICNkZWZpbmUgRlhGVF9SRU5ERVJfTU9ERV9OT1JNQUwgRlRfUkVOREVSX01PREVfTk9STUFMCkBAIC00MSw1NyArNDIsNzMgQEAKICNkZWZpbmUgRlhGVF9TVFlMRV9GTEFHX0lUQUxJQyBGVF9TVFlMRV9GTEFHX0lUQUxJQwogI2RlZmluZSBGWEZUX1NUWUxFX0ZMQUdfQk9MRCBGVF9TVFlMRV9GTEFHX0JPTEQKICNkZWZpbmUgRlhGVF9GQUNFX0ZMQUdfU0ZOVCBGVF9GQUNFX0ZMQUdfU0ZOVAotI2RlZmluZSBGWEZUX0ZBQ0VfRkxBR19UUklDS1kgKCAxTCA8PCAxMyApCi10eXBlZGVmIEZUX01NX1ZhcioJCUZYRlRfTU1fVmFyOwotdHlwZWRlZiBGVF9CaXRtYXAqCQlGWEZUX0JpdG1hcDsKLSNkZWZpbmUgRlhGVF9NYXRyaXgJCUZUX01hdHJpeAotI2RlZmluZSBGWEZUX1ZlY3RvcgkJRlRfVmVjdG9yCisjZGVmaW5lIEZYRlRfRkFDRV9GTEFHX1RSSUNLWSAoMUwgPDwgMTMpCit0eXBlZGVmIEZUX01NX1ZhciogRlhGVF9NTV9WYXI7Cit0eXBlZGVmIEZUX0JpdG1hcCogRlhGVF9CaXRtYXA7CisjZGVmaW5lIEZYRlRfTWF0cml4IEZUX01hdHJpeAorI2RlZmluZSBGWEZUX1ZlY3RvciBGVF9WZWN0b3IKICNkZWZpbmUgRlhGVF9PdXRsaW5lX0Z1bmNzIEZUX091dGxpbmVfRnVuY3MKLXR5cGVkZWYgRlRfT3Blbl9BcmdzCUZYRlRfT3Blbl9BcmdzOwotdHlwZWRlZiBGVF9TdHJlYW1SZWMJRlhGVF9TdHJlYW1SZWM7Ci10eXBlZGVmIEZUX1N0cmVhbVJlYyoJRlhGVF9TdHJlYW07Ci10eXBlZGVmIEZUX0JCb3gJCQlGWEZUX0JCb3g7Ci10eXBlZGVmIEZUX0dseXBoCQlGWEZUX0dseXBoOwotdHlwZWRlZiBGVF9DaGFyTWFwCQlGWEZUX0NoYXJNYXA7Ci0jZGVmaW5lIEZYRlRfR0xZUEhfQkJPWF9QSVhFTFMJRlRfR0xZUEhfQkJPWF9QSVhFTFMKK3R5cGVkZWYgRlRfT3Blbl9BcmdzIEZYRlRfT3Blbl9BcmdzOwordHlwZWRlZiBGVF9TdHJlYW1SZWMgRlhGVF9TdHJlYW1SZWM7Cit0eXBlZGVmIEZUX1N0cmVhbVJlYyogRlhGVF9TdHJlYW07Cit0eXBlZGVmIEZUX0JCb3ggRlhGVF9CQm94OwordHlwZWRlZiBGVF9HbHlwaCBGWEZUX0dseXBoOwordHlwZWRlZiBGVF9DaGFyTWFwIEZYRlRfQ2hhck1hcDsKKyNkZWZpbmUgRlhGVF9HTFlQSF9CQk9YX1BJWEVMUyBGVF9HTFlQSF9CQk9YX1BJWEVMUwogI2RlZmluZSBGWEZUX09wZW5fRmFjZShsaWJyYXJ5LCBhcmdzLCBpbmRleCwgZmFjZSkgXAotICAgIEZUX09wZW5fRmFjZSgoRlRfTGlicmFyeSkobGlicmFyeSksIGFyZ3MsIGluZGV4LCAoRlRfRmFjZSopKGZhY2UpKQorICBGVF9PcGVuX0ZhY2UoKEZUX0xpYnJhcnkpKGxpYnJhcnkpLCBhcmdzLCBpbmRleCwgKEZUX0ZhY2UqKShmYWNlKSkKICNkZWZpbmUgRlhGVF9Eb25lX0ZhY2UoZmFjZSkgRlRfRG9uZV9GYWNlKChGVF9GYWNlKShmYWNlKSkKICNkZWZpbmUgRlhGVF9Eb25lX0ZyZWVUeXBlKGxpYnJhcnkpIEZUX0RvbmVfRnJlZVR5cGUoKEZUX0xpYnJhcnkpKGxpYnJhcnkpKQogI2RlZmluZSBGWEZUX0luaXRfRnJlZVR5cGUobGlicmFyeSkgRlRfSW5pdF9GcmVlVHlwZSgoRlRfTGlicmFyeSopKGxpYnJhcnkpKQogI2RlZmluZSBGWEZUX05ld19NZW1vcnlfRmFjZShsaWJyYXJ5LCBiYXNlLCBzaXplLCBpbmRleCwgZmFjZSkgXAotICAgIEZUX05ld19NZW1vcnlfRmFjZSgoRlRfTGlicmFyeSkobGlicmFyeSksIGJhc2UsIHNpemUsIGluZGV4LCAoRlRfRmFjZSopKGZhY2UpKQorICBGVF9OZXdfTWVtb3J5X0ZhY2UoKEZUX0xpYnJhcnkpKGxpYnJhcnkpLCBiYXNlLCBzaXplLCBpbmRleCwgKEZUX0ZhY2UqKShmYWNlKSkKICNkZWZpbmUgRlhGVF9OZXdfRmFjZShsaWJyYXJ5LCBmaWxlbmFtZSwgaW5kZXgsIGZhY2UpIFwKLSAgICBGVF9OZXdfRmFjZSgoRlRfTGlicmFyeSkobGlicmFyeSksIGZpbGVuYW1lLCBpbmRleCwgKEZUX0ZhY2UqKShmYWNlKSkKKyAgRlRfTmV3X0ZhY2UoKEZUX0xpYnJhcnkpKGxpYnJhcnkpLCBmaWxlbmFtZSwgaW5kZXgsIChGVF9GYWNlKikoZmFjZSkpCiAjZGVmaW5lIEZYRlRfR2V0X0ZhY2VfRnJlZVR5cGUoZmFjZSkgKChGVF9GYWNlKWZhY2UpLT5kcml2ZXItPnJvb3QubGlicmFyeQotI2RlZmluZSBGWEZUX1NlbGVjdF9DaGFybWFwKGZhY2UsIGVuY29kaW5nKSBGVF9TZWxlY3RfQ2hhcm1hcCgoRlRfRmFjZSlmYWNlLCAoRlRfRW5jb2RpbmcpZW5jb2RpbmcpCi0jZGVmaW5lIEZYRlRfU2V0X0NoYXJtYXAoZmFjZSwgY2hhcm1hcCkgRlRfU2V0X0NoYXJtYXAoKEZUX0ZhY2UpZmFjZSwgKEZUX0NoYXJNYXApY2hhcm1hcCkKLSNkZWZpbmUgRlhGVF9Mb2FkX0dseXBoKGZhY2UsIGdseXBoX2luZGV4LCBmbGFncykgRlRfTG9hZF9HbHlwaCgoRlRfRmFjZSlmYWNlLCBnbHlwaF9pbmRleCwgZmxhZ3MpCisjZGVmaW5lIEZYRlRfU2VsZWN0X0NoYXJtYXAoZmFjZSwgZW5jb2RpbmcpIFwKKyAgRlRfU2VsZWN0X0NoYXJtYXAoKEZUX0ZhY2UpZmFjZSwgKEZUX0VuY29kaW5nKWVuY29kaW5nKQorI2RlZmluZSBGWEZUX1NldF9DaGFybWFwKGZhY2UsIGNoYXJtYXApIFwKKyAgRlRfU2V0X0NoYXJtYXAoKEZUX0ZhY2UpZmFjZSwgKEZUX0NoYXJNYXApY2hhcm1hcCkKKyNkZWZpbmUgRlhGVF9Mb2FkX0dseXBoKGZhY2UsIGdseXBoX2luZGV4LCBmbGFncykgXAorICBGVF9Mb2FkX0dseXBoKChGVF9GYWNlKWZhY2UsIGdseXBoX2luZGV4LCBmbGFncykKICNkZWZpbmUgRlhGVF9HZXRfQ2hhcl9JbmRleChmYWNlLCBjb2RlKSBGVF9HZXRfQ2hhcl9JbmRleCgoRlRfRmFjZSlmYWNlLCBjb2RlKQotI2RlZmluZSBGWEZUX0dldF9HbHlwaF9OYW1lKGZhY2UsIGluZGV4LCBidWZmZXIsIHNpemUpIEZUX0dldF9HbHlwaF9OYW1lKChGVF9GYWNlKWZhY2UsIGluZGV4LCBidWZmZXIsIHNpemUpCisjZGVmaW5lIEZYRlRfR2V0X0dseXBoX05hbWUoZmFjZSwgaW5kZXgsIGJ1ZmZlciwgc2l6ZSkgXAorICBGVF9HZXRfR2x5cGhfTmFtZSgoRlRfRmFjZSlmYWNlLCBpbmRleCwgYnVmZmVyLCBzaXplKQogI2RlZmluZSBGWEZUX0dldF9OYW1lX0luZGV4KGZhY2UsIG5hbWUpIEZUX0dldF9OYW1lX0luZGV4KChGVF9GYWNlKWZhY2UsIG5hbWUpCi0jZGVmaW5lIEZYRlRfSGFzX0dseXBoX05hbWVzKGZhY2UpICAoKChGVF9GYWNlKWZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0dMWVBIX05BTUVTKQorI2RlZmluZSBGWEZUX0hhc19HbHlwaF9OYW1lcyhmYWNlKSBcCisgICgoKEZUX0ZhY2UpZmFjZSktPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfR0xZUEhfTkFNRVMpCiAjZGVmaW5lIEZYRlRfR2V0X1Bvc3RzY3JpcHRfTmFtZShmYWNlKSBGVF9HZXRfUG9zdHNjcmlwdF9OYW1lKChGVF9GYWNlKWZhY2UpCiAjZGVmaW5lIEZYRlRfTG9hZF9TZm50X1RhYmxlKGZhY2UsIHRhZywgb2Zmc2V0LCBidWZmZXIsIGxlbmd0aCkgXAotICAgIEZUX0xvYWRfU2ZudF9UYWJsZSgoRlRfRmFjZSlmYWNlLCB0YWcsIG9mZnNldCwgYnVmZmVyLCBsZW5ndGgpCi0jZGVmaW5lIEZYRlRfR2V0X0ZpcnN0X0NoYXIoZmFjZSwgZ2x5cGhfaW5kZXgpIEZUX0dldF9GaXJzdF9DaGFyKChGVF9GYWNlKWZhY2UsIGdseXBoX2luZGV4KQotI2RlZmluZSBGWEZUX0dldF9OZXh0X0NoYXIoZmFjZSwgY29kZSwgZ2x5cGhfaW5kZXgpIEZUX0dldF9OZXh0X0NoYXIoKEZUX0ZhY2UpZmFjZSwgY29kZSwgZ2x5cGhfaW5kZXgpCi0jZGVmaW5lIEZYRlRfQ2xlYXJfRmFjZV9FeHRlcm5hbF9TdHJlYW0oZmFjZSkgKCgoRlRfRmFjZSlmYWNlKS0+ZmFjZV9mbGFncyY9fkZUX0ZBQ0VfRkxBR19FWFRFUk5BTF9TVFJFQU0pCi0jZGVmaW5lIEZYRlRfR2V0X0ZhY2VfRXh0ZXJuYWxfU3RyZWFtKGZhY2UpICgoKEZUX0ZhY2UpZmFjZSktPmZhY2VfZmxhZ3MmRlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTSkKLSNkZWZpbmUgRlhGVF9Jc19GYWNlX1RUX09UKGZhY2UpICgoKEZUX0ZhY2UpZmFjZSktPmZhY2VfZmxhZ3MmRlRfRkFDRV9GTEFHX1NGTlQpCi0jZGVmaW5lIEZYRlRfSXNfRmFjZV9Ucmlja3koZmFjZSkgKCgoRlRfRmFjZSlmYWNlKS0+ZmFjZV9mbGFncyZGWEZUX0ZBQ0VfRkxBR19UUklDS1kpCi0jZGVmaW5lIEZYRlRfSXNfRmFjZV9maXhlZHdpZHRoKGZhY2UpICgoKEZUX0ZhY2UpZmFjZSktPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfRklYRURfV0lEVEgpCisgIEZUX0xvYWRfU2ZudF9UYWJsZSgoRlRfRmFjZSlmYWNlLCB0YWcsIG9mZnNldCwgYnVmZmVyLCBsZW5ndGgpCisjZGVmaW5lIEZYRlRfR2V0X0ZpcnN0X0NoYXIoZmFjZSwgZ2x5cGhfaW5kZXgpIFwKKyAgRlRfR2V0X0ZpcnN0X0NoYXIoKEZUX0ZhY2UpZmFjZSwgZ2x5cGhfaW5kZXgpCisjZGVmaW5lIEZYRlRfR2V0X05leHRfQ2hhcihmYWNlLCBjb2RlLCBnbHlwaF9pbmRleCkgXAorICBGVF9HZXRfTmV4dF9DaGFyKChGVF9GYWNlKWZhY2UsIGNvZGUsIGdseXBoX2luZGV4KQorI2RlZmluZSBGWEZUX0NsZWFyX0ZhY2VfRXh0ZXJuYWxfU3RyZWFtKGZhY2UpIFwKKyAgKCgoRlRfRmFjZSlmYWNlKS0+ZmFjZV9mbGFncyAmPSB+RlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTSkKKyNkZWZpbmUgRlhGVF9HZXRfRmFjZV9FeHRlcm5hbF9TdHJlYW0oZmFjZSkgXAorICAoKChGVF9GYWNlKWZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTSkKKyNkZWZpbmUgRlhGVF9Jc19GYWNlX1RUX09UKGZhY2UpIFwKKyAgKCgoRlRfRmFjZSlmYWNlKS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TRk5UKQorI2RlZmluZSBGWEZUX0lzX0ZhY2VfVHJpY2t5KGZhY2UpIFwKKyAgKCgoRlRfRmFjZSlmYWNlKS0+ZmFjZV9mbGFncyAmIEZYRlRfRkFDRV9GTEFHX1RSSUNLWSkKKyNkZWZpbmUgRlhGVF9Jc19GYWNlX2ZpeGVkd2lkdGgoZmFjZSkgXAorICAoKChGVF9GYWNlKWZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0ZJWEVEX1dJRFRIKQogI2RlZmluZSBGWEZUX0dldF9GYWNlX1N0cmVhbV9CYXNlKGZhY2UpICgoRlRfRmFjZSlmYWNlKS0+c3RyZWFtLT5iYXNlCiAjZGVmaW5lIEZYRlRfR2V0X0ZhY2VfU3RyZWFtX1NpemUoZmFjZSkgKChGVF9GYWNlKWZhY2UpLT5zdHJlYW0tPnNpemUKICNkZWZpbmUgRlhGVF9HZXRfRmFjZV9GYW1pbHlfTmFtZShmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPmZhbWlseV9uYW1lCiAjZGVmaW5lIEZYRlRfR2V0X0ZhY2VfU3R5bGVfTmFtZShmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPnN0eWxlX25hbWUKICNkZWZpbmUgRlhGVF9HZXRfRmFjZV9OdW1mYWNlcyhmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPm51bV9mYWNlcwogI2RlZmluZSBGWEZUX0dldF9GYWNlX0ZhY2VpbmRleChmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPmZhY2VfaW5kZXgKLSNkZWZpbmUgRlhGVF9Jc19GYWNlX0l0YWxpYyhmYWNlKSAoKChGVF9GYWNlKWZhY2UpLT5zdHlsZV9mbGFncyZGVF9TVFlMRV9GTEFHX0lUQUxJQykKLSNkZWZpbmUgRlhGVF9Jc19GYWNlX0JvbGQoZmFjZSkgKCgoRlRfRmFjZSlmYWNlKS0+c3R5bGVfZmxhZ3MmRlRfU1RZTEVfRkxBR19CT0xEKQorI2RlZmluZSBGWEZUX0lzX0ZhY2VfSXRhbGljKGZhY2UpIFwKKyAgKCgoRlRfRmFjZSlmYWNlKS0+c3R5bGVfZmxhZ3MgJiBGVF9TVFlMRV9GTEFHX0lUQUxJQykKKyNkZWZpbmUgRlhGVF9Jc19GYWNlX0JvbGQoZmFjZSkgXAorICAoKChGVF9GYWNlKWZhY2UpLT5zdHlsZV9mbGFncyAmIEZUX1NUWUxFX0ZMQUdfQk9MRCkKICNkZWZpbmUgRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPmNoYXJtYXBzCi0jZGVmaW5lIEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWChmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPmdseXBoLT5tZXRyaWNzLmhvcmlCZWFyaW5nWAotI2RlZmluZSBGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1koZmFjZSkgKChGVF9GYWNlKWZhY2UpLT5nbHlwaC0+bWV0cmljcy5ob3JpQmVhcmluZ1kKKyNkZWZpbmUgRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdYKGZhY2UpIFwKKyAgKChGVF9GYWNlKWZhY2UpLT5nbHlwaC0+bWV0cmljcy5ob3JpQmVhcmluZ1gKKyNkZWZpbmUgRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdZKGZhY2UpIFwKKyAgKChGVF9GYWNlKWZhY2UpLT5nbHlwaC0+bWV0cmljcy5ob3JpQmVhcmluZ1kKICNkZWZpbmUgRlhGVF9HZXRfR2x5cGhfV2lkdGgoZmFjZSkgKChGVF9GYWNlKWZhY2UpLT5nbHlwaC0+bWV0cmljcy53aWR0aAogI2RlZmluZSBGWEZUX0dldF9HbHlwaF9IZWlnaHQoZmFjZSkgKChGVF9GYWNlKWZhY2UpLT5nbHlwaC0+bWV0cmljcy5oZWlnaHQKICNkZWZpbmUgRlhGVF9HZXRfRmFjZV9DaGFybWFwQ291bnQoZmFjZSkgKChGVF9GYWNlKWZhY2UpLT5udW1fY2hhcm1hcHMKQEAgLTEwNSwyMyArMTIyLDMwIEBACiAjZGVmaW5lIEZYRlRfR2V0X0ZhY2VfeU1pbihmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPmJib3gueU1pbgogI2RlZmluZSBGWEZUX0dldF9GYWNlX3lNYXgoZmFjZSkgKChGVF9GYWNlKWZhY2UpLT5iYm94LnlNYXgKICNkZWZpbmUgRlhGVF9HZXRfRmFjZV9IZWlnaHQoZmFjZSkgKChGVF9GYWNlKWZhY2UpLT5oZWlnaHQKLSNkZWZpbmUgRlhGVF9HZXRfRmFjZV9VbmRlckxpbmVUaGlja25lc3MoZmFjZSkgKChGVF9GYWNlKWZhY2UpLT51bmRlcmxpbmVfdGhpY2tuZXNzCi0jZGVmaW5lIEZYRlRfR2V0X0ZhY2VfVW5kZXJMaW5lUG9zaXRpb24oZmFjZSkgKChGVF9GYWNlKWZhY2UpLT51bmRlcmxpbmVfcG9zaXRpb24KKyNkZWZpbmUgRlhGVF9HZXRfRmFjZV9VbmRlckxpbmVUaGlja25lc3MoZmFjZSkgXAorICAoKEZUX0ZhY2UpZmFjZSktPnVuZGVybGluZV90aGlja25lc3MKKyNkZWZpbmUgRlhGVF9HZXRfRmFjZV9VbmRlckxpbmVQb3NpdGlvbihmYWNlKSBcCisgICgoRlRfRmFjZSlmYWNlKS0+dW5kZXJsaW5lX3Bvc2l0aW9uCiAjZGVmaW5lIEZYRlRfR2V0X0ZhY2VfTWF4QWR2YW5jZVdpZHRoKGZhY2UpICgoRlRfRmFjZSlmYWNlKS0+bWF4X2FkdmFuY2Vfd2lkdGgKICNkZWZpbmUgRlhGVF9HZXRfRmFjZV9Bc2NlbmRlcihmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPmFzY2VuZGVyCiAjZGVmaW5lIEZYRlRfR2V0X0ZhY2VfRGVzY2VuZGVyKGZhY2UpICgoRlRfRmFjZSlmYWNlKS0+ZGVzY2VuZGVyCi0jZGVmaW5lIEZYRlRfR2V0X0dseXBoX0hvcmlBZHZhbmNlKGZhY2UpICgoRlRfRmFjZSlmYWNlKS0+Z2x5cGgtPm1ldHJpY3MuaG9yaUFkdmFuY2UKKyNkZWZpbmUgRlhGVF9HZXRfR2x5cGhfSG9yaUFkdmFuY2UoZmFjZSkgXAorICAoKEZUX0ZhY2UpZmFjZSktPmdseXBoLT5tZXRyaWNzLmhvcmlBZHZhbmNlCiAjZGVmaW5lIEZYRlRfR2V0X01NX0F4aXModmFyLCBpbmRleCkgJigoRlRfTU1fVmFyKil2YXIpLT5heGlzW2luZGV4XQogI2RlZmluZSBGWEZUX0dldF9NTV9BeGlzX01pbihheGlzKSAoKEZUX1Zhcl9BeGlzKilheGlzKS0+bWluaW11bQogI2RlZmluZSBGWEZUX0dldF9NTV9BeGlzX01heChheGlzKSAoKEZUX1Zhcl9BeGlzKilheGlzKS0+bWF4aW11bQogI2RlZmluZSBGWEZUX0dldF9NTV9BeGlzX0RlZihheGlzKSAoKEZUX1Zhcl9BeGlzKilheGlzKS0+ZGVmCi0jZGVmaW5lIEZYRlRfQWxsb2MobGlicmFyeSwgc2l6ZSkgKChGVF9MaWJyYXJ5KWxpYnJhcnkpLT5tZW1vcnktPmFsbG9jKCgoRlRfTGlicmFyeSlsaWJyYXJ5KS0+bWVtb3J5LCBzaXplKQotI2RlZmluZSBGWEZUX0ZyZWUoZmFjZSwgcCkgKChGVF9GYWNlKWZhY2UpLT5tZW1vcnktPmZyZWUoKChGVF9GYWNlKWZhY2UpLT5tZW1vcnksIHApCisjZGVmaW5lIEZYRlRfQWxsb2MobGlicmFyeSwgc2l6ZSkgXAorICAoKEZUX0xpYnJhcnkpbGlicmFyeSktPm1lbW9yeS0+YWxsb2MoKChGVF9MaWJyYXJ5KWxpYnJhcnkpLT5tZW1vcnksIHNpemUpCisjZGVmaW5lIEZYRlRfRnJlZShmYWNlLCBwKSBcCisgICgoRlRfRmFjZSlmYWNlKS0+bWVtb3J5LT5mcmVlKCgoRlRfRmFjZSlmYWNlKS0+bWVtb3J5LCBwKQogI2RlZmluZSBGWEZUX0dldF9HbHlwaF9PdXRsaW5lKGZhY2UpICYoKEZUX0ZhY2UpZmFjZSktPmdseXBoLT5vdXRsaW5lCi0jZGVmaW5lIEZYRlRfR2V0X091dGxpbmVfQmJveChvdXRsaW5lLCBjYm94KSAgRlRfT3V0bGluZV9HZXRfQ0JveChvdXRsaW5lLCBjYm94KQotI2RlZmluZSBGWEZUX1JlbmRlcl9HbHlwaChmYWNlLCBtb2RlKSBGVF9SZW5kZXJfR2x5cGgoKChGVF9GYWNlKWZhY2UpLT5nbHlwaCwgKGVudW0gRlRfUmVuZGVyX01vZGVfKW1vZGUpCisjZGVmaW5lIEZYRlRfR2V0X091dGxpbmVfQmJveChvdXRsaW5lLCBjYm94KSBGVF9PdXRsaW5lX0dldF9DQm94KG91dGxpbmUsIGNib3gpCisjZGVmaW5lIEZYRlRfUmVuZGVyX0dseXBoKGZhY2UsIG1vZGUpIFwKKyAgRlRfUmVuZGVyX0dseXBoKCgoRlRfRmFjZSlmYWNlKS0+Z2x5cGgsIChlbnVtIEZUX1JlbmRlcl9Nb2RlXyltb2RlKQogI2RlZmluZSBGWEZUX0dldF9NTV9WYXIoZmFjZSwgcCkgRlRfR2V0X01NX1ZhcigoRlRfRmFjZSlmYWNlLCBwKQotI2RlZmluZSBGWEZUX1NldF9NTV9EZXNpZ25fQ29vcmRpbmF0ZXMoZmFjZSwgbiwgcCkgRlRfU2V0X01NX0Rlc2lnbl9Db29yZGluYXRlcygoRlRfRmFjZSlmYWNlLCBuLCBwKQorI2RlZmluZSBGWEZUX1NldF9NTV9EZXNpZ25fQ29vcmRpbmF0ZXMoZmFjZSwgbiwgcCkgXAorICBGVF9TZXRfTU1fRGVzaWduX0Nvb3JkaW5hdGVzKChGVF9GYWNlKWZhY2UsIG4sIHApCiAjZGVmaW5lIEZYRlRfU2V0X1BpeGVsX1NpemVzKGZhY2UsIHcsIGgpIEZUX1NldF9QaXhlbF9TaXplcygoRlRfRmFjZSlmYWNlLCB3LCBoKQogI2RlZmluZSBGWEZUX1NldF9UcmFuc2Zvcm0oZmFjZSwgbSwgZCkgRlRfU2V0X1RyYW5zZm9ybSgoRlRfRmFjZSlmYWNlLCBtLCBkKQogI2RlZmluZSBGWEZUX091dGxpbmVfRW1ib2xkZW4ob3V0bGluZSwgcykgRlRfT3V0bGluZV9FbWJvbGRlbihvdXRsaW5lLCBzKQpAQCAtMTMzLDEzICsxNTcsMTkgQEAKICNkZWZpbmUgRlhGVF9HZXRfQml0bWFwX0J1ZmZlcihiaXRtYXApICgoRlRfQml0bWFwKiliaXRtYXApLT5idWZmZXIKICNkZWZpbmUgRlhGVF9HZXRfR2x5cGhfQml0bWFwTGVmdChmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPmdseXBoLT5iaXRtYXBfbGVmdAogI2RlZmluZSBGWEZUX0dldF9HbHlwaF9CaXRtYXBUb3AoZmFjZSkgKChGVF9GYWNlKWZhY2UpLT5nbHlwaC0+Yml0bWFwX3RvcAotI2RlZmluZSBGWEZUX091dGxpbmVfRGVjb21wb3NlKG91dGxpbmUsIGZ1bmNzLCBwYXJhbXMpIEZUX091dGxpbmVfRGVjb21wb3NlKG91dGxpbmUsIGZ1bmNzLCBwYXJhbXMpCi0jZGVmaW5lIEZYRlRfU2V0X0NoYXJfU2l6ZShmYWNlLCBjaGFyX3dpZHRoLCBjaGFyX2hlaWdodCwgaG9yel9yZXNvbHV0aW9uLCB2ZXJ0X3Jlc29sdXRpb24pIEZUX1NldF9DaGFyX1NpemUoZmFjZSwgY2hhcl93aWR0aCwgY2hhcl9oZWlnaHQsIGhvcnpfcmVzb2x1dGlvbiwgdmVydF9yZXNvbHV0aW9uKQorI2RlZmluZSBGWEZUX091dGxpbmVfRGVjb21wb3NlKG91dGxpbmUsIGZ1bmNzLCBwYXJhbXMpIFwKKyAgRlRfT3V0bGluZV9EZWNvbXBvc2Uob3V0bGluZSwgZnVuY3MsIHBhcmFtcykKKyNkZWZpbmUgRlhGVF9TZXRfQ2hhcl9TaXplKGZhY2UsIGNoYXJfd2lkdGgsIGNoYXJfaGVpZ2h0LCBob3J6X3Jlc29sdXRpb24sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRfcmVzb2x1dGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlRfU2V0X0NoYXJfU2l6ZShmYWNlLCBjaGFyX3dpZHRoLCBjaGFyX2hlaWdodCwgaG9yel9yZXNvbHV0aW9uLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICB2ZXJ0X3Jlc29sdXRpb24pCiAjZGVmaW5lIEZYRlRfR2V0X0dseXBoKHNsb3QsIGFnbHlwaCkgRlRfR2V0X0dseXBoKHNsb3QsIGFnbHlwaCkKLSNkZWZpbmUgRlhGVF9HbHlwaF9HZXRfQ0JveChnbHlwaCwgYmJveF9tb2RlLCBhY2JveCkgRlRfR2x5cGhfR2V0X0NCb3goZ2x5cGgsIGJib3hfbW9kZSwgYWNib3gpCi0jZGVmaW5lIEZYRlRfRG9uZV9HbHlwaChnbHlwaCkJRlRfRG9uZV9HbHlwaChnbHlwaCkKLSNkZWZpbmUgRlhGVF9MaWJyYXJ5X1NldExjZEZpbHRlcihsaWJyYXJ5LCBmaWx0ZXIpIEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyKChGVF9MaWJyYXJ5KShsaWJyYXJ5KSwgZmlsdGVyKQotaW50IEZYRlRfdW5pY29kZV9mcm9tX2Fkb2JlX25hbWUoY29uc3QgY2hhciogIGdseXBoX25hbWUpOworI2RlZmluZSBGWEZUX0dseXBoX0dldF9DQm94KGdseXBoLCBiYm94X21vZGUsIGFjYm94KSBcCisgIEZUX0dseXBoX0dldF9DQm94KGdseXBoLCBiYm94X21vZGUsIGFjYm94KQorI2RlZmluZSBGWEZUX0RvbmVfR2x5cGgoZ2x5cGgpIEZUX0RvbmVfR2x5cGgoZ2x5cGgpCisjZGVmaW5lIEZYRlRfTGlicmFyeV9TZXRMY2RGaWx0ZXIobGlicmFyeSwgZmlsdGVyKSBcCisgIEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyKChGVF9MaWJyYXJ5KShsaWJyYXJ5KSwgZmlsdGVyKQoraW50IEZYRlRfdW5pY29kZV9mcm9tX2Fkb2JlX25hbWUoY29uc3QgY2hhciogZ2x5cGhfbmFtZSk7CiB2b2lkIEZYRlRfYWRvYmVfbmFtZV9mcm9tX3VuaWNvZGUoY2hhciogbmFtZSwgd2NoYXJfdCB1bmljb2RlKTsKICNpZmRlZiBfX2NwbHVzcGx1cwogfTsKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlLmggYi9jb3JlL2luY2x1ZGUvZnhnZS9meF9nZS5oCmluZGV4IDYwMzc0ZWYuLjAxYTFjNzIgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaApAQCAtMSw3ICsxLDcgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBDT1JFX0lOQ0xVREVfRlhHRV9GWF9HRV9IXwpAQCAtMTAsNzIzICsxMCw3MjEgQEAKICNpbmNsdWRlICJmeF9kaWIuaCIKICNpbmNsdWRlICJmeF9mb250LmgiCiAKLWNsYXNzIENGWF9DbGlwUmduOwotY2xhc3MgQ0ZYX1BhdGhEYXRhOwotY2xhc3MgQ0ZYX0dyYXBoU3RhdGVEYXRhOwogY2xhc3MgQ0ZYX0ZvbnQ7CiBjbGFzcyBDRlhfRm9udE1ncjsKIGNsYXNzIENGWF9Gb250Q2FjaGU7CiBjbGFzcyBDRlhfRmFjZUNhY2hlOwotY2xhc3MgQ0ZYX1JlbmRlckRldmljZTsKIGNsYXNzIElGWF9SZW5kZXJEZXZpY2VEcml2ZXI7CiBjbGFzcyBDQ29kZWNfTW9kdWxlTWdyOwotY2xhc3MgSUZYR19QYWludE1vZHVsZU1ncjsKIAotY2xhc3MgQ0ZYX0dFTW9kdWxlIAotewotcHVibGljOgorY2xhc3MgQ0ZYX0dFTW9kdWxlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIENyZWF0ZShjb25zdCBjaGFyKiogcFVzZXJGb250UGF0aHMpOwogCi0gICAgc3RhdGljIHZvaWQJCQkJQ3JlYXRlKCk7CisgIHN0YXRpYyB2b2lkIFVzZShDRlhfR0VNb2R1bGUqIHBNZ3IpOwogCi0gICAgc3RhdGljIHZvaWQJCQkJVXNlKENGWF9HRU1vZHVsZSogcE1ncik7CisgIHN0YXRpYyBDRlhfR0VNb2R1bGUqIEdldCgpOwogCi0gICAgc3RhdGljIENGWF9HRU1vZHVsZSoJR2V0KCk7CisgIHN0YXRpYyB2b2lkIERlc3Ryb3koKTsKIAotICAgIHN0YXRpYyB2b2lkCQkJCURlc3Ryb3koKTsKLXB1YmxpYzoKKyBwdWJsaWM6CisgIENGWF9Gb250Q2FjaGUqIEdldEZvbnRDYWNoZSgpOworICBDRlhfRm9udE1nciogR2V0Rm9udE1ncigpIHsgcmV0dXJuIG1fcEZvbnRNZ3I7IH0KKyAgdm9pZCBTZXRUZXh0R2FtbWEoRlhfRkxPQVQgZ2FtbWFWYWx1ZSk7CisgIGNvbnN0IHVpbnQ4X3QqIEdldFRleHRHYW1tYVRhYmxlKCk7CiAKLSAgICBDRlhfRm9udENhY2hlKgkJCUdldEZvbnRDYWNoZSgpOwotICAgIENGWF9Gb250TWdyKgkJCUdldEZvbnRNZ3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEZvbnRNZ3I7Ci0gICAgfQotICAgIHZvaWQJCQkJCVNldFRleHRHYW1tYShGWF9GTE9BVCBnYW1tYVZhbHVlKTsKLSAgICBGWF9MUENCWVRFCQkJCUdldFRleHRHYW1tYVRhYmxlKCk7Ci0gICAgdm9pZAkJCQkJU2V0RXh0Rm9udE1hcHBlcihJRlhfRm9udE1hcHBlciogcEZvbnRNYXBwZXIpOworICB2b2lkIFNldENvZGVjTW9kdWxlKENDb2RlY19Nb2R1bGVNZ3IqIHBDb2RlY01vZHVsZSkgeworICAgIG1fcENvZGVjTW9kdWxlID0gcENvZGVjTW9kdWxlOworICB9CisgIENDb2RlY19Nb2R1bGVNZ3IqIEdldENvZGVjTW9kdWxlKCkgeyByZXR1cm4gbV9wQ29kZWNNb2R1bGU7IH0KKyAgRlhGVF9MaWJyYXJ5IG1fRlRMaWJyYXJ5OworICB2b2lkKiBHZXRQbGF0Zm9ybURhdGEoKSB7IHJldHVybiBtX3BQbGF0Zm9ybURhdGE7IH0KIAotICAgIHZvaWQJCQkJCVNldENvZGVjTW9kdWxlKENDb2RlY19Nb2R1bGVNZ3IqIHBDb2RlY01vZHVsZSkKLSAgICB7Ci0gICAgICAgIG1fcENvZGVjTW9kdWxlID0gcENvZGVjTW9kdWxlOwotICAgIH0KLSAgICBDQ29kZWNfTW9kdWxlTWdyKgkJR2V0Q29kZWNNb2R1bGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcENvZGVjTW9kdWxlOwotICAgIH0KLSAgICBGWEZUX0xpYnJhcnkJCQltX0ZUTGlicmFyeTsKLSAgICB2b2lkKgkJCQkJR2V0UGxhdGZvcm1EYXRhKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BQbGF0Zm9ybURhdGE7Ci0gICAgfQotcHJvdGVjdGVkOgorIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgQ0ZYX0dFTW9kdWxlKGNvbnN0IGNoYXIqKiBwVXNlckZvbnRQYXRocyk7CiAKLSAgICBDRlhfR0VNb2R1bGUoKTsKKyAgfkNGWF9HRU1vZHVsZSgpOworICB2b2lkIEluaXRQbGF0Zm9ybSgpOworICB2b2lkIERlc3Ryb3lQbGF0Zm9ybSgpOwogCi0gICAgfkNGWF9HRU1vZHVsZSgpOwotICAgIHZvaWQJCQkJCUluaXRQbGF0Zm9ybSgpOwotICAgIHZvaWQJCQkJCURlc3Ryb3lQbGF0Zm9ybSgpOwotcHJpdmF0ZToKLSAgICBGWF9CWVRFCQkJCQltX0dhbW1hVmFsdWVbMjU2XTsKLSAgICBDRlhfRm9udENhY2hlKgkJCW1fcEZvbnRDYWNoZTsKLSAgICBDRlhfRm9udE1ncioJCQltX3BGb250TWdyOwotICAgIENDb2RlY19Nb2R1bGVNZ3IqCQltX3BDb2RlY01vZHVsZTsKLSAgICB2b2lkKgkJCQkJbV9wUGxhdGZvcm1EYXRhOworIHByaXZhdGU6CisgIHVpbnQ4X3QgbV9HYW1tYVZhbHVlWzI1Nl07CisgIENGWF9Gb250Q2FjaGUqIG1fcEZvbnRDYWNoZTsKKyAgQ0ZYX0ZvbnRNZ3IqIG1fcEZvbnRNZ3I7CisgIENDb2RlY19Nb2R1bGVNZ3IqIG1fcENvZGVjTW9kdWxlOworICB2b2lkKiBtX3BQbGF0Zm9ybURhdGE7CisgIGNvbnN0IGNoYXIqKiBtX3BVc2VyRm9udFBhdGhzOwogfTsKIHR5cGVkZWYgc3RydWN0IHsKKyAgRlhfRkxPQVQgbV9Qb2ludFg7CiAKLSAgICBGWF9GTE9BVAkJCW1fUG9pbnRYOworICBGWF9GTE9BVCBtX1BvaW50WTsKIAotICAgIEZYX0ZMT0FUCQkJbV9Qb2ludFk7Ci0KLSAgICBpbnQJCQkJCW1fRmxhZzsKKyAgaW50IG1fRmxhZzsKIH0gRlhfUEFUSFBPSU5UOwotI2RlZmluZSBGWFBUX0NMT1NFRklHVVJFCQkweDAxCi0jZGVmaW5lIEZYUFRfTElORVRPCQkJCTB4MDIKLSNkZWZpbmUgRlhQVF9CRVpJRVJUTwkJCTB4MDQKLSNkZWZpbmUgRlhQVF9NT1ZFVE8JCQkJMHgwNgotI2RlZmluZSBGWFBUX1RZUEUJCQkJMHgwNgotI2RlZmluZSBGWEZJTExfQUxURVJOQVRFCQkxCi0jZGVmaW5lIEZYRklMTF9XSU5ESU5HCQkJMgotY2xhc3MgQ0ZYX0NsaXBSZ24gCi17Ci1wdWJsaWM6CisjZGVmaW5lIEZYUFRfQ0xPU0VGSUdVUkUgMHgwMQorI2RlZmluZSBGWFBUX0xJTkVUTyAweDAyCisjZGVmaW5lIEZYUFRfQkVaSUVSVE8gMHgwNAorI2RlZmluZSBGWFBUX01PVkVUTyAweDA2CisjZGVmaW5lIEZYUFRfVFlQRSAweDA2CisjZGVmaW5lIEZYRklMTF9BTFRFUk5BVEUgMQorI2RlZmluZSBGWEZJTExfV0lORElORyAyCitjbGFzcyBDRlhfQ2xpcFJnbiB7CisgcHVibGljOgorICBDRlhfQ2xpcFJnbihpbnQgZGV2aWNlX3dpZHRoLCBpbnQgZGV2aWNlX2hlaWdodCk7CiAKLSAgICBDRlhfQ2xpcFJnbihpbnQgZGV2aWNlX3dpZHRoLCBpbnQgZGV2aWNlX2hlaWdodCk7CisgIENGWF9DbGlwUmduKGNvbnN0IEZYX1JFQ1QmIHJlY3QpOwogCi0gICAgQ0ZYX0NsaXBSZ24oY29uc3QgRlhfUkVDVCYgcmVjdCk7CisgIENGWF9DbGlwUmduKGNvbnN0IENGWF9DbGlwUmduJiBzcmMpOwogCi0gICAgQ0ZYX0NsaXBSZ24oY29uc3QgQ0ZYX0NsaXBSZ24mIHNyYyk7CisgIH5DRlhfQ2xpcFJnbigpOwogCi0gICAgfkNGWF9DbGlwUmduKCk7CisgIHR5cGVkZWYgZW51bSB7IFJlY3RJLCBNYXNrRiB9IENsaXBUeXBlOwogCi0gICAgdHlwZWRlZiBlbnVtIHsKLSAgICAgICAgUmVjdEksCi0gICAgICAgIE1hc2tGCi0gICAgfSBDbGlwVHlwZTsKKyAgdm9pZCBSZXNldChjb25zdCBGWF9SRUNUJiByZWN0KTsKIAotICAgIHZvaWQJCQlSZXNldChjb25zdCBGWF9SRUNUJiByZWN0KTsKKyAgQ2xpcFR5cGUgR2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fVHlwZTsgfQogCi0gICAgQ2xpcFR5cGUJCUdldFR5cGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fVHlwZTsKLSAgICB9CisgIGNvbnN0IEZYX1JFQ1QmIEdldEJveCgpIGNvbnN0IHsgcmV0dXJuIG1fQm94OyB9CiAKLSAgICBjb25zdCBGWF9SRUNUJglHZXRCb3goKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fQm94OwotICAgIH0KKyAgQ0ZYX0RJQml0bWFwUmVmIEdldE1hc2soKSBjb25zdCB7IHJldHVybiBtX01hc2s7IH0KIAotICAgIENGWF9ESUJpdG1hcFJlZglHZXRNYXNrKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX01hc2s7Ci0gICAgfQorICB2b2lkIEludGVyc2VjdFJlY3QoY29uc3QgRlhfUkVDVCYgcmVjdCk7CiAKLSAgICB2b2lkCQkJSW50ZXJzZWN0UmVjdChjb25zdCBGWF9SRUNUJiByZWN0KTsKKyAgdm9pZCBJbnRlcnNlY3RNYXNrRihpbnQgbGVmdCwgaW50IHRvcCwgQ0ZYX0RJQml0bWFwUmVmIE1hc2spOwogCi0gICAgdm9pZAkJCUludGVyc2VjdE1hc2tGKGludCBsZWZ0LCBpbnQgdG9wLCBDRlhfRElCaXRtYXBSZWYgTWFzayk7Ci1wcm90ZWN0ZWQ6CisgcHJvdGVjdGVkOgorICBDbGlwVHlwZSBtX1R5cGU7CiAKLSAgICBDbGlwVHlwZQkJbV9UeXBlOworICBGWF9SRUNUIG1fQm94OwogCi0gICAgRlhfUkVDVAkJCW1fQm94OworICBDRlhfRElCaXRtYXBSZWYgbV9NYXNrOwogCi0gICAgQ0ZYX0RJQml0bWFwUmVmCW1fTWFzazsKLQotICAgIHZvaWQJCQlJbnRlcnNlY3RNYXNrUmVjdChGWF9SRUNUIHJlY3QsIEZYX1JFQ1QgbWFza19ib3gsIENGWF9ESUJpdG1hcFJlZiBNYXNrKTsKKyAgdm9pZCBJbnRlcnNlY3RNYXNrUmVjdChGWF9SRUNUIHJlY3QsIEZYX1JFQ1QgbWFza19ib3gsIENGWF9ESUJpdG1hcFJlZiBNYXNrKTsKIH07Ci1leHRlcm4gY29uc3QgRlhfQllURSBnX0dhbW1hUmFtcFsyNTZdOwotZXh0ZXJuIGNvbnN0IEZYX0JZVEUgZ19HYW1tYUludmVyc2VbMjU2XTsKLSNkZWZpbmUgRlhfR0FNTUEodmFsdWUpCQkJKHZhbHVlKQotI2RlZmluZSBGWF9HQU1NQV9JTlZFUlNFKHZhbHVlKQkodmFsdWUpCi1pbmxpbmUgRlhfQVJHQiBBcmdiR2FtbWEoRlhfQVJHQiBhcmdiKQotewotICAgIHJldHVybiBhcmdiOworI2RlZmluZSBGWF9HQU1NQSh2YWx1ZSkgKHZhbHVlKQorI2RlZmluZSBGWF9HQU1NQV9JTlZFUlNFKHZhbHVlKSAodmFsdWUpCitpbmxpbmUgRlhfQVJHQiBBcmdiR2FtbWEoRlhfQVJHQiBhcmdiKSB7CisgIHJldHVybiBhcmdiOwogfQotaW5saW5lIEZYX0FSR0IgQXJnYkdhbW1hSW52ZXJzZShGWF9BUkdCIGFyZ2IpCi17Ci0gICAgcmV0dXJuIGFyZ2I7CitpbmxpbmUgRlhfQVJHQiBBcmdiR2FtbWFJbnZlcnNlKEZYX0FSR0IgYXJnYikgeworICByZXR1cm4gYXJnYjsKIH0KLWNsYXNzIENGWF9QYXRoRGF0YSAKLXsKLXB1YmxpYzoKK2NsYXNzIENGWF9QYXRoRGF0YSB7CisgcHVibGljOgorICBDRlhfUGF0aERhdGEoKTsKIAotICAgIENGWF9QYXRoRGF0YSgpOworICBDRlhfUGF0aERhdGEoY29uc3QgQ0ZYX1BhdGhEYXRhJiBzcmMpOwogCi0gICAgQ0ZYX1BhdGhEYXRhKGNvbnN0IENGWF9QYXRoRGF0YSYgc3JjKTsKKyAgfkNGWF9QYXRoRGF0YSgpOwogCi0gICAgfkNGWF9QYXRoRGF0YSgpOworICBpbnQgR2V0UG9pbnRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fUG9pbnRDb3VudDsgfQogCisgIGludCBHZXRGbGFnKGludCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9wUG9pbnRzW2luZGV4XS5tX0ZsYWc7IH0KIAorICBGWF9GTE9BVCBHZXRQb2ludFgoaW50IGluZGV4KSBjb25zdCB7IHJldHVybiBtX3BQb2ludHNbaW5kZXhdLm1fUG9pbnRYOyB9CiAKKyAgRlhfRkxPQVQgR2V0UG9pbnRZKGludCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9wUG9pbnRzW2luZGV4XS5tX1BvaW50WTsgfQogCi0gICAgaW50CQkJCQlHZXRQb2ludENvdW50KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1BvaW50Q291bnQ7Ci0gICAgfQorICBGWF9QQVRIUE9JTlQqIEdldFBvaW50cygpIGNvbnN0IHsgcmV0dXJuIG1fcFBvaW50czsgfQogCi0gICAgaW50CQkJCQlHZXRGbGFnKGludCBpbmRleCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BQb2ludHNbaW5kZXhdLm1fRmxhZzsKLSAgICB9CisgIHZvaWQgU2V0UG9pbnRDb3VudChpbnQgblBvaW50cyk7CisgIHZvaWQgQWxsb2NQb2ludENvdW50KGludCBuUG9pbnRzKTsKKyAgdm9pZCBBZGRQb2ludENvdW50KGludCBhZGRQb2ludHMpOwogCi0gICAgRlhfRkxPQVQJCQlHZXRQb2ludFgoaW50IGluZGV4KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcFBvaW50c1tpbmRleF0ubV9Qb2ludFg7Ci0gICAgfQorICBDRlhfRmxvYXRSZWN0IEdldEJvdW5kaW5nQm94KCkgY29uc3Q7CiAKLSAgICBGWF9GTE9BVAkJCUdldFBvaW50WShpbnQgaW5kZXgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wUG9pbnRzW2luZGV4XS5tX1BvaW50WTsKLSAgICB9CisgIENGWF9GbG9hdFJlY3QgR2V0Qm91bmRpbmdCb3goRlhfRkxPQVQgbGluZV93aWR0aCwgRlhfRkxPQVQgbWl0ZXJfbGltaXQpIGNvbnN0OwogCisgIHZvaWQgVHJhbnNmb3JtKGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOwogCisgIEZYX0JPT0wgSXNSZWN0KCkgY29uc3Q7CiAKLSAgICBGWF9QQVRIUE9JTlQqCQlHZXRQb2ludHMoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcFBvaW50czsKLSAgICB9CisgIEZYX0JPT0wgR2V0WmVyb0FyZWFQYXRoKENGWF9QYXRoRGF0YSYgTmV3UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlRoaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFkanVzdCkgY29uc3Q7CiAKLSAgICB2b2lkIFNldFBvaW50Q291bnQoaW50IG5Qb2ludHMpOwotICAgIHZvaWQgQWxsb2NQb2ludENvdW50KGludCBuUG9pbnRzKTsKLSAgICB2b2lkIEFkZFBvaW50Q291bnQoaW50IGFkZFBvaW50cyk7CisgIEZYX0JPT0wgSXNSZWN0KGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsIENGWF9GbG9hdFJlY3QqIHJlY3QpIGNvbnN0OwogCi0gICAgQ0ZYX0Zsb2F0UmVjdAkJR2V0Qm91bmRpbmdCb3goKSBjb25zdDsKKyAgdm9pZCBBcHBlbmQoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwU3JjLCBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKKyAgdm9pZCBBcHBlbmRSZWN0KEZYX0ZMT0FUIGxlZnQsIEZYX0ZMT0FUIGJvdHRvbSwgRlhfRkxPQVQgcmlnaHQsIEZYX0ZMT0FUIHRvcCk7CiAKLSAgICBDRlhfRmxvYXRSZWN0CQlHZXRCb3VuZGluZ0JveChGWF9GTE9BVCBsaW5lX3dpZHRoLCBGWF9GTE9BVCBtaXRlcl9saW1pdCkgY29uc3Q7CisgIHZvaWQgU2V0UG9pbnQoaW50IGluZGV4LCBGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBpbnQgZmxhZyk7CiAKLSAgICB2b2lkCQkJCVRyYW5zZm9ybShjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4KTsKKyAgdm9pZCBUcmltUG9pbnRzKGludCBuUG9pbnRzKTsKIAotICAgIEZYX0JPT0wJCQkJSXNSZWN0KCkgY29uc3Q7CisgIHZvaWQgQ29weShjb25zdCBDRlhfUGF0aERhdGEmIHNyYyk7CiAKLSAgICBGWF9CT09MCQkJCUdldFplcm9BcmVhUGF0aChDRlhfUGF0aERhdGEmIE5ld1BhdGgsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0JPT0wmYlRoaW4sIEZYX0JPT0wgYkFkanVzdCkgY29uc3Q7CisgcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgQ1BERl9QYXRoOwogCi0gICAgRlhfQk9PTAkJCQlJc1JlY3QoY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgQ0ZYX0Zsb2F0UmVjdCogcmVjdCkgY29uc3Q7CisgIGludCBtX1BvaW50Q291bnQ7CiAKLSAgICB2b2lkIEFwcGVuZChjb25zdCBDRlhfUGF0aERhdGEqIHBTcmMsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgpOwotICAgIHZvaWQgQXBwZW5kUmVjdChGWF9GTE9BVCBsZWZ0LCBGWF9GTE9BVCBib3R0b20sIEZYX0ZMT0FUIHJpZ2h0LCBGWF9GTE9BVCB0b3ApOworICBGWF9QQVRIUE9JTlQqIG1fcFBvaW50czsKIAotICAgIHZvaWQJCQkJU2V0UG9pbnQoaW50IGluZGV4LCBGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBpbnQgZmxhZyk7Ci0KLSAgICB2b2lkCQkJCVRyaW1Qb2ludHMoaW50IG5Qb2ludHMpOwotCi0gICAgdm9pZCBDb3B5KGNvbnN0IENGWF9QYXRoRGF0YSAmc3JjKTsKLXByb3RlY3RlZDoKLSAgICBmcmllbmQgY2xhc3MJCUNQREZfUGF0aDsKLQotICAgIGludAkJCQkJbV9Qb2ludENvdW50OwotCi0gICAgRlhfUEFUSFBPSU5UKgkJbV9wUG9pbnRzOwotCi0gICAgaW50CQkJCQltX0FsbG9jQ291bnQ7CisgIGludCBtX0FsbG9jQ291bnQ7CiB9OwotY2xhc3MgQ0ZYX0dyYXBoU3RhdGVEYXRhIAotewotcHVibGljOgorY2xhc3MgQ0ZYX0dyYXBoU3RhdGVEYXRhIHsKKyBwdWJsaWM6CisgIENGWF9HcmFwaFN0YXRlRGF0YSgpOwogCi0gICAgQ0ZYX0dyYXBoU3RhdGVEYXRhKCk7CisgIENGWF9HcmFwaFN0YXRlRGF0YShjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEmIHNyYyk7CiAKLSAgICBDRlhfR3JhcGhTdGF0ZURhdGEoY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhJiBzcmMpOworICB+Q0ZYX0dyYXBoU3RhdGVEYXRhKCk7CiAKLSAgICB+Q0ZYX0dyYXBoU3RhdGVEYXRhKCk7CisgIHZvaWQgQ29weShjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEmIHNyYyk7CiAKLSAgICB2b2lkCQkJCUNvcHkoY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhJiBzcmMpOworICB2b2lkIFNldERhc2hDb3VudChpbnQgY291bnQpOwogCi0gICAgdm9pZAkJCQlTZXREYXNoQ291bnQoaW50IGNvdW50KTsKKyAgdHlwZWRlZiBlbnVtIHsgTGluZUNhcEJ1dHQgPSAwLCBMaW5lQ2FwUm91bmQgPSAxLCBMaW5lQ2FwU3F1YXJlID0gMiB9IExpbmVDYXA7CisgIExpbmVDYXAgbV9MaW5lQ2FwOworICBpbnQgbV9EYXNoQ291bnQ7CisgIEZYX0ZMT0FUKiBtX0Rhc2hBcnJheTsKKyAgRlhfRkxPQVQgbV9EYXNoUGhhc2U7CiAKLQotCi0gICAgdHlwZWRlZiBlbnVtIHsKLSAgICAgICAgTGluZUNhcEJ1dHQgPSAwLAotICAgICAgICBMaW5lQ2FwUm91bmQgPSAxLAotICAgICAgICBMaW5lQ2FwU3F1YXJlID0gMgotICAgIH0gTGluZUNhcDsKLSAgICBMaW5lQ2FwCQkJCW1fTGluZUNhcDsKLSAgICBpbnQJCQkJCW1fRGFzaENvdW50OwotICAgIEZYX0ZMT0FUKgkJbV9EYXNoQXJyYXk7Ci0gICAgRlhfRkxPQVQJCQltX0Rhc2hQaGFzZTsKLQotICAgIHR5cGVkZWYgZW51bSB7Ci0gICAgICAgIExpbmVKb2luTWl0ZXIgPSAwLAotICAgICAgICBMaW5lSm9pblJvdW5kID0gMSwKLSAgICAgICAgTGluZUpvaW5CZXZlbCA9IDIsCi0gICAgfSBMaW5lSm9pbjsKLSAgICBMaW5lSm9pbgkJCW1fTGluZUpvaW47Ci0gICAgRlhfRkxPQVQJCQltX01pdGVyTGltaXQ7Ci0gICAgRlhfRkxPQVQJCQltX0xpbmVXaWR0aDsKLQorICB0eXBlZGVmIGVudW0geworICAgIExpbmVKb2luTWl0ZXIgPSAwLAorICAgIExpbmVKb2luUm91bmQgPSAxLAorICAgIExpbmVKb2luQmV2ZWwgPSAyLAorICB9IExpbmVKb2luOworICBMaW5lSm9pbiBtX0xpbmVKb2luOworICBGWF9GTE9BVCBtX01pdGVyTGltaXQ7CisgIEZYX0ZMT0FUIG1fTGluZVdpZHRoOwogfTsKLSNkZWZpbmUgRlhEQ19ERVZJQ0VfQ0xBU1MJCQkxCi0jZGVmaW5lIEZYRENfUElYRUxfV0lEVEgJCQkyCi0jZGVmaW5lIEZYRENfUElYRUxfSEVJR0hUCQkJMwotI2RlZmluZSBGWERDX0JJVFNfUElYRUwJCQkJNAotI2RlZmluZSBGWERDX0hPUlpfU0laRQkJCQk1Ci0jZGVmaW5lIEZYRENfVkVSVF9TSVpFCQkJCTYKLSNkZWZpbmUgRlhEQ19SRU5ERVJfQ0FQUwkJCTcKLSNkZWZpbmUgRlhEQ19ESVRIRVJfQklUUwkJCTgKLSNkZWZpbmUgRlhEQ19ESVNQTEFZCQkJCTEKLSNkZWZpbmUgRlhEQ19QUklOVEVSCQkJCTIKLSNkZWZpbmUgRlhSQ19HRVRfQklUUwkJCQkweDAxCi0jZGVmaW5lIEZYUkNfQklUX01BU0sJCQkJMHgwMgotI2RlZmluZSBGWFJDX0FMUEhBX01BU0sJCQkJMHgwNAotI2RlZmluZSBGWFJDX0FMUEhBX1BBVEgJCQkJMHgxMAotI2RlZmluZSBGWFJDX0FMUEhBX0lNQUdFCQkJMHgyMAotI2RlZmluZSBGWFJDX0FMUEhBX09VVFBVVAkJCTB4NDAKLSNkZWZpbmUgRlhSQ19CTEVORF9NT0RFCQkJCTB4ODAKLSNkZWZpbmUgRlhSQ19TT0ZUX0NMSVAJCQkJMHgxMDAKLSNkZWZpbmUgRlhSQ19DTVlLX09VVFBVVAkJCTB4MjAwCi0jZGVmaW5lIEZYUkNfQklUTUFTS19PVVRQVVQgICAgICAgICAweDQwMAotI2RlZmluZSBGWFJDX0JZVEVNQVNLX09VVFBVVCAgICAgICAgMHg4MDAKLSNkZWZpbmUgRlhSRU5ERVJfSU1BR0VfTE9TU1kJCTB4MTAwMAotI2RlZmluZSBGWEZJTExfQUxURVJOQVRFCQkxCi0jZGVmaW5lIEZYRklMTF9XSU5ESU5HCQkJMgotI2RlZmluZSBGWEZJTExfRlVMTENPVkVSCQk0Ci0jZGVmaW5lIEZYRklMTF9SRUNUX0FBCQkJOAotI2RlZmluZSBGWF9GSUxMX1NUUk9LRQkJCTE2Ci0jZGVmaW5lIEZYX1NUUk9LRV9BREpVU1QJCTMyCi0jZGVmaW5lIEZYX1NUUk9LRV9URVhUX01PREUJCTY0Ci0jZGVmaW5lIEZYX0ZJTExfVEVYVF9NT0RFCQkxMjgKLSNkZWZpbmUgRlhfWkVST0FSRUFfRklMTAkJMjU2Ci0jZGVmaW5lIEZYRklMTF9OT1BBVEhTTU9PVEgJCTUxMgotI2RlZmluZSBGWFRFWFRfQ0xFQVJUWVBFCQkJMHgwMQotI2RlZmluZSBGWFRFWFRfQkdSX1NUUklQRQkJCTB4MDIKLSNkZWZpbmUgRlhURVhUX1BSSU5UR1JBUEhJQ1RFWFQJCTB4MDQKLSNkZWZpbmUgRlhURVhUX05PX05BVElWRVRFWFQJCTB4MDgKLSNkZWZpbmUgRlhURVhUX1BSSU5USU1BR0VURVhUCQkweDEwCi0jZGVmaW5lIEZYVEVYVF9OT1NNT09USAkJCQkweDIwCisjZGVmaW5lIEZYRENfREVWSUNFX0NMQVNTIDEKKyNkZWZpbmUgRlhEQ19QSVhFTF9XSURUSCAyCisjZGVmaW5lIEZYRENfUElYRUxfSEVJR0hUIDMKKyNkZWZpbmUgRlhEQ19CSVRTX1BJWEVMIDQKKyNkZWZpbmUgRlhEQ19IT1JaX1NJWkUgNQorI2RlZmluZSBGWERDX1ZFUlRfU0laRSA2CisjZGVmaW5lIEZYRENfUkVOREVSX0NBUFMgNworI2RlZmluZSBGWERDX0RJVEhFUl9CSVRTIDgKKyNkZWZpbmUgRlhEQ19ESVNQTEFZIDEKKyNkZWZpbmUgRlhEQ19QUklOVEVSIDIKKyNkZWZpbmUgRlhSQ19HRVRfQklUUyAweDAxCisjZGVmaW5lIEZYUkNfQklUX01BU0sgMHgwMgorI2RlZmluZSBGWFJDX0FMUEhBX01BU0sgMHgwNAorI2RlZmluZSBGWFJDX0FMUEhBX1BBVEggMHgxMAorI2RlZmluZSBGWFJDX0FMUEhBX0lNQUdFIDB4MjAKKyNkZWZpbmUgRlhSQ19BTFBIQV9PVVRQVVQgMHg0MAorI2RlZmluZSBGWFJDX0JMRU5EX01PREUgMHg4MAorI2RlZmluZSBGWFJDX1NPRlRfQ0xJUCAweDEwMAorI2RlZmluZSBGWFJDX0NNWUtfT1VUUFVUIDB4MjAwCisjZGVmaW5lIEZYUkNfQklUTUFTS19PVVRQVVQgMHg0MDAKKyNkZWZpbmUgRlhSQ19CWVRFTUFTS19PVVRQVVQgMHg4MDAKKyNkZWZpbmUgRlhSRU5ERVJfSU1BR0VfTE9TU1kgMHgxMDAwCisjZGVmaW5lIEZYRklMTF9BTFRFUk5BVEUgMQorI2RlZmluZSBGWEZJTExfV0lORElORyAyCisjZGVmaW5lIEZYRklMTF9GVUxMQ09WRVIgNAorI2RlZmluZSBGWEZJTExfUkVDVF9BQSA4CisjZGVmaW5lIEZYX0ZJTExfU1RST0tFIDE2CisjZGVmaW5lIEZYX1NUUk9LRV9BREpVU1QgMzIKKyNkZWZpbmUgRlhfU1RST0tFX1RFWFRfTU9ERSA2NAorI2RlZmluZSBGWF9GSUxMX1RFWFRfTU9ERSAxMjgKKyNkZWZpbmUgRlhfWkVST0FSRUFfRklMTCAyNTYKKyNkZWZpbmUgRlhGSUxMX05PUEFUSFNNT09USCA1MTIKKyNkZWZpbmUgRlhURVhUX0NMRUFSVFlQRSAweDAxCisjZGVmaW5lIEZYVEVYVF9CR1JfU1RSSVBFIDB4MDIKKyNkZWZpbmUgRlhURVhUX1BSSU5UR1JBUEhJQ1RFWFQgMHgwNAorI2RlZmluZSBGWFRFWFRfTk9fTkFUSVZFVEVYVCAweDA4CisjZGVmaW5lIEZYVEVYVF9QUklOVElNQUdFVEVYVCAweDEwCisjZGVmaW5lIEZYVEVYVF9OT1NNT09USCAweDIwCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgRlhfRFdPUkQJCQltX0dseXBoSW5kZXg7Ci0gICAgRlhfRkxPQVQJCQltX09yaWdpblgsIG1fT3JpZ2luWTsKLSAgICBpbnQJCQkJCW1fRm9udENoYXJXaWR0aDsKLSAgICBGWF9CT09MCQkJCW1fYkdseXBoQWRqdXN0OwotICAgIEZYX0ZMT0FUCQkJbV9BZGp1c3RNYXRyaXhbNF07Ci0gICAgRlhfRFdPUkQJCQltX0V4dEdJRDsKLSAgICBGWF9CT09MCQkJCW1fYkZvbnRTdHlsZTsKKyAgRlhfRFdPUkQgbV9HbHlwaEluZGV4OworICBGWF9GTE9BVCBtX09yaWdpblgsIG1fT3JpZ2luWTsKKyAgaW50IG1fRm9udENoYXJXaWR0aDsKKyAgRlhfQk9PTCBtX2JHbHlwaEFkanVzdDsKKyAgRlhfRkxPQVQgbV9BZGp1c3RNYXRyaXhbNF07CisgIEZYX0RXT1JEIG1fRXh0R0lEOworICBGWF9CT09MIG1fYkZvbnRTdHlsZTsKIH0gRlhURVhUX0NIQVJQT1M7Ci1jbGFzcyBDRlhfUmVuZGVyRGV2aWNlIAotewotcHVibGljOgotICAgIENGWF9SZW5kZXJEZXZpY2UoKTsKK2NsYXNzIENGWF9SZW5kZXJEZXZpY2UgeworIHB1YmxpYzoKKyAgQ0ZYX1JlbmRlckRldmljZSgpOwogCi0gICAgdmlydHVhbCB+Q0ZYX1JlbmRlckRldmljZSgpOworICB2aXJ0dWFsIH5DRlhfUmVuZGVyRGV2aWNlKCk7CiAKLSAgICB2b2lkCQkJU2V0RGV2aWNlRHJpdmVyKElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIHBEcml2ZXIpOworICB2b2lkIFNldERldmljZURyaXZlcihJRlhfUmVuZGVyRGV2aWNlRHJpdmVyKiBwRHJpdmVyKTsKIAotICAgIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqCUdldERldmljZURyaXZlcigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyOwotICAgIH0KKyAgSUZYX1JlbmRlckRldmljZURyaXZlciogR2V0RGV2aWNlRHJpdmVyKCkgY29uc3QgeyByZXR1cm4gbV9wRGV2aWNlRHJpdmVyOyB9CiAKLSAgICBGWF9CT09MCQkJU3RhcnRSZW5kZXJpbmcoKTsKKyAgRlhfQk9PTCBTdGFydFJlbmRlcmluZygpOwogCi0gICAgdm9pZAkJCUVuZFJlbmRlcmluZygpOworICB2b2lkIEVuZFJlbmRlcmluZygpOwogCisgIHZvaWQgU2F2ZVN0YXRlKCk7CiAKKyAgdm9pZCBSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkID0gRkFMU0UpOwogCi0gICAgdm9pZAkJCVNhdmVTdGF0ZSgpOworICBpbnQgR2V0V2lkdGgoKSBjb25zdCB7IHJldHVybiBtX1dpZHRoOyB9CiAKLSAgICB2b2lkCQkJUmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCA9IEZBTFNFKTsKKyAgaW50IEdldEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fSGVpZ2h0OyB9CiAKKyAgaW50IEdldERldmljZUNsYXNzKCkgY29uc3QgeyByZXR1cm4gbV9EZXZpY2VDbGFzczsgfQogCisgIGludCBHZXRCUFAoKSBjb25zdCB7IHJldHVybiBtX2JwcDsgfQogCisgIGludCBHZXRSZW5kZXJDYXBzKCkgY29uc3QgeyByZXR1cm4gbV9SZW5kZXJDYXBzOyB9CiAKLSAgICBpbnQJCQkJR2V0V2lkdGgoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fV2lkdGg7Ci0gICAgfQorICBpbnQgR2V0RGV2aWNlQ2FwcyhpbnQgaWQpIGNvbnN0OwogCi0gICAgaW50CQkJCUdldEhlaWdodCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9IZWlnaHQ7Ci0gICAgfQorICBDRlhfTWF0cml4IEdldENUTSgpIGNvbnN0OwogCi0gICAgaW50CQkJCUdldERldmljZUNsYXNzKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0RldmljZUNsYXNzOwotICAgIH0KKyAgQ0ZYX0RJQml0bWFwKiBHZXRCaXRtYXAoKSBjb25zdCB7IHJldHVybiBtX3BCaXRtYXA7IH0KKyAgdm9pZCBTZXRCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwQml0bWFwKSB7IG1fcEJpdG1hcCA9IHBCaXRtYXA7IH0KIAotICAgIGludAkJCQlHZXRCUFAoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYnBwOwotICAgIH0KKyAgRlhfQk9PTCBDcmVhdGVDb21wYXRpYmxlQml0bWFwKENGWF9ESUJpdG1hcCogcERJQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQpIGNvbnN0OwogCi0gICAgaW50CQkJCUdldFJlbmRlckNhcHMoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fUmVuZGVyQ2FwczsKLSAgICB9CisgIGNvbnN0IEZYX1JFQ1QmIEdldENsaXBCb3goKSBjb25zdCB7IHJldHVybiBtX0NsaXBCb3g7IH0KIAotICAgIGludAkJCQlHZXREZXZpY2VDYXBzKGludCBpZCkgY29uc3Q7CisgIEZYX0JPT0wgU2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSk7CiAKLSAgICBDRlhfTWF0cml4CQlHZXRDVE0oKSBjb25zdDsKKyAgRlhfQk9PTCBTZXRDbGlwX1JlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QpOwogCisgIEZYX0JPT0wgU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSk7CiAKLSAgICBDRlhfRElCaXRtYXAqCUdldEJpdG1hcCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wQml0bWFwOwotICAgIH0KLSAgICB2b2lkCQkJU2V0Qml0bWFwKENGWF9ESUJpdG1hcCogcEJpdG1hcCkKLSAgICB7Ci0gICAgICAgIG1fcEJpdG1hcCA9IHBCaXRtYXA7Ci0gICAgfQorICBGWF9CT09MIERyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzdHJva2VfY29sb3IsCisgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOwogCi0gICAgRlhfQk9PTAkJCUNyZWF0ZUNvbXBhdGlibGVCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwRElCLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIGNvbnN0OworICBGWF9CT09MIFNldFBpeGVsKGludCB4LAorICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBjb25zdCBGWF9SRUNUJglHZXRDbGlwQm94KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0NsaXBCb3g7Ci0gICAgfQorICBGWF9CT09MIEZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LAorICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7CiAKLSAgICBGWF9CT09MCQkJU2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICBGWF9CT09MIERyYXdDb3NtZXRpY0xpbmUoRlhfRkxPQVQgeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7CiAKLSAgICBGWF9CT09MCQkJU2V0Q2xpcF9SZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0KTsKKyAgRlhfQk9PTCBHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCi0gICAgRlhfQk9PTAkJCVNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICBDRlhfRElCaXRtYXAqIEdldEJhY2tEcm9wKCk7CiAKLSAgICBGWF9CT09MCQkJRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzdHJva2VfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMCi0gICAgICAgICAgICAgICAgICAgICAgKTsKKyAgRlhfQk9PTCBTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMLAorICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBGWF9CT09MCQkJU2V0UGl4ZWwoaW50IHgsIGludCB5LCBGWF9EV09SRCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CisgIEZYX0JPT0wgU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKIAotICAgIEZYX0JPT0wJCQlGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKKyAgRlhfQk9PTCBTZXRCaXRNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotICAgIEZYX0JPT0wJCQlEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLCBGWF9EV09SRCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlID0gMCwgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOworICBGWF9CT09MIFN0cmV0Y2hCaXRNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBGWF9CT09MCQkJR2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKyAgRlhfQk9PTCBTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7CiAKLSAgICBDRlhfRElCaXRtYXAqICAgR2V0QmFja0Ryb3AoKTsKKyAgRlhfQk9PTCBDb250aW51ZURJQml0cyh2b2lkKiBoYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKTsKIAotICAgIEZYX0JPT0wJCQlTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOworICB2b2lkIENhbmNlbERJQml0cyh2b2lkKiBoYW5kbGUpOwogCi0gICAgRlhfQk9PTAkJCVN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOworICBGWF9CT09MIERyYXdOb3JtYWxUZXh0KGludCBuQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udENhY2hlKiBwQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBUZXh0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHRleHRfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotICAgIEZYX0JPT0wJCQlTZXRCaXRNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCBGWF9EV09SRCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKyAgRlhfQk9PTCBEcmF3VGV4dFBhdGgoaW50IG5DaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwVGV4dDJVc2VyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0cm9rZV9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhKiBwQ2xpcHBpbmdQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7CisgIHZpcnR1YWwgdm9pZCBCZWdpbigpIHt9CisgIHZpcnR1YWwgdm9pZCBFbmQoKSB7fQogCi0gICAgRlhfQk9PTAkJCVN0cmV0Y2hCaXRNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwgRlhfRFdPUkQgZmxhZ3MgPSAwLCBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKyBwcml2YXRlOgorICBDRlhfRElCaXRtYXAqIG1fcEJpdG1hcDsKIAotICAgIEZYX0JPT0wJCQlTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgZmxhZ3MsIEZYX0xQVk9JRCYgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCk7CisgIGludCBtX1dpZHRoOwogCi0gICAgRlhfQk9PTAkJCUNvbnRpbnVlRElCaXRzKEZYX0xQVk9JRCBoYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgaW50IG1fSGVpZ2h0OwogCi0gICAgdm9pZAkJCUNhbmNlbERJQml0cyhGWF9MUFZPSUQgaGFuZGxlKTsKKyAgaW50IG1fYnBwOwogCi0gICAgRlhfQk9PTAkJCURyYXdOb3JtYWxUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LCBDRlhfRm9udENhY2hlKiBwQ2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHQyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLCBGWF9EV09SRCB0ZXh0X2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKyAgaW50IG1fUmVuZGVyQ2FwczsKIAotICAgIEZYX0JPT0wJCQlEcmF3VGV4dFBhdGgoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LCBDRlhfRm9udENhY2hlKiBwQ2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBUZXh0MlVzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVXNlcjJEZXZpY2UsIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLCBGWF9EV09SRCBzdHJva2VfY29sb3IsIENGWF9QYXRoRGF0YSogcENsaXBwaW5nUGF0aCwgaW50IG5GbGFnID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKLSAgICB2aXJ0dWFsIHZvaWQgQmVnaW4oKSB7fQotICAgIHZpcnR1YWwgdm9pZCBFbmQoKSB7fQotcHJpdmF0ZToKKyAgaW50IG1fRGV2aWNlQ2xhc3M7CiAKLSAgICBDRlhfRElCaXRtYXAqCW1fcEJpdG1hcDsKKyAgRlhfUkVDVCBtX0NsaXBCb3g7CiAKKyBwcm90ZWN0ZWQ6CisgIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIG1fcERldmljZURyaXZlcjsKIAorIHByaXZhdGU6CisgIHZvaWQgSW5pdERldmljZUluZm8oKTsKIAotICAgIGludAkJCQltX1dpZHRoOwotCi0gICAgaW50CQkJCW1fSGVpZ2h0OwotCi0gICAgaW50CQkJCW1fYnBwOwotCi0gICAgaW50CQkJCW1fUmVuZGVyQ2FwczsKLQotICAgIGludAkJCQltX0RldmljZUNsYXNzOwotCi0gICAgRlhfUkVDVAkJCW1fQ2xpcEJveDsKLQotcHJvdGVjdGVkOgotCi0gICAgSUZYX1JlbmRlckRldmljZURyaXZlcioJbV9wRGV2aWNlRHJpdmVyOwotcHJpdmF0ZToKLQotICAgIHZvaWQJCQlJbml0RGV2aWNlSW5mbygpOwotCi0gICAgdm9pZAkJCVVwZGF0ZUNsaXBCb3goKTsKKyAgdm9pZCBVcGRhdGVDbGlwQm94KCk7CiB9OwotY2xhc3MgQ0ZYX0Z4Z2VEZXZpY2UgOiBwdWJsaWMgQ0ZYX1JlbmRlckRldmljZQotewotcHVibGljOgorY2xhc3MgQ0ZYX0Z4Z2VEZXZpY2UgOiBwdWJsaWMgQ0ZYX1JlbmRlckRldmljZSB7CisgcHVibGljOgorICBDRlhfRnhnZURldmljZSgpOworICB+Q0ZYX0Z4Z2VEZXZpY2UoKSBvdmVycmlkZTsKIAotICAgIENGWF9GeGdlRGV2aWNlKCk7CisgIEZYX0JPT0wgQXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgaW50IGRpdGhlcl9iaXRzID0gMCwKKyAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyID0gRkFMU0UsCisgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE9yaURldmljZSA9IE5VTEwsCisgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQgPSBGQUxTRSk7CiAKLSAgICB+Q0ZYX0Z4Z2VEZXZpY2UoKTsKKyAgRlhfQk9PTCBDcmVhdGUoaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICBpbnQgZGl0aGVyX2JpdHMgPSAwLAorICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UgPSBOVUxMKTsKIAotICAgIEZYX0JPT0wJCQlBdHRhY2goQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGl0aGVyX2JpdHMgPSAwLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgPSBGQUxTRSwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlID0gTlVMTCwgRlhfQk9PTCBiR3JvdXBLbm9ja291dCA9IEZBTFNFKTsKLQotICAgIEZYX0JPT0wJCQlDcmVhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgZm9ybWF0LCBpbnQgZGl0aGVyX2JpdHMgPSAwLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UgPSBOVUxMKTsKLXByb3RlY3RlZDoKLQotICAgIEZYX0JPT0wJCQltX2JPd25lZEJpdG1hcDsKKyBwcm90ZWN0ZWQ6CisgIEZYX0JPT0wgbV9iT3duZWRCaXRtYXA7CiB9OwotY2xhc3MgQ0ZYX1NraWFEZXZpY2UgOiBwdWJsaWMgQ0ZYX1JlbmRlckRldmljZQotewotcHVibGljOgorY2xhc3MgQ0ZYX1NraWFEZXZpY2UgOiBwdWJsaWMgQ0ZYX1JlbmRlckRldmljZSB7CisgcHVibGljOgorICBDRlhfU2tpYURldmljZSgpOworICB+Q0ZYX1NraWFEZXZpY2UoKSBvdmVycmlkZTsKIAotICAgIENGWF9Ta2lhRGV2aWNlKCk7CisgIEZYX0JPT0wgQXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgaW50IGRpdGhlcl9iaXRzID0gMCwKKyAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyID0gRkFMU0UsCisgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE9yaURldmljZSA9IE5VTEwsCisgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQgPSBGQUxTRSk7CiAKLSAgICB+Q0ZYX1NraWFEZXZpY2UoKTsKKyAgRlhfQk9PTCBDcmVhdGUoaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICBpbnQgZGl0aGVyX2JpdHMgPSAwLAorICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UgPSBOVUxMKTsKIAotICAgIEZYX0JPT0wJCQlBdHRhY2goQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGl0aGVyX2JpdHMgPSAwLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgPSBGQUxTRSwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlID0gTlVMTCwgRlhfQk9PTCBiR3JvdXBLbm9ja291dCA9IEZBTFNFKTsKLQotICAgIEZYX0JPT0wJCQlDcmVhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgZm9ybWF0LCBpbnQgZGl0aGVyX2JpdHMgPSAwLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UgPSBOVUxMKTsKLXByb3RlY3RlZDoKLQotICAgIEZYX0JPT0wJCQltX2JPd25lZEJpdG1hcDsKKyBwcm90ZWN0ZWQ6CisgIEZYX0JPT0wgbV9iT3duZWRCaXRtYXA7CiB9OwotY2xhc3MgSUZYX1JlbmRlckRldmljZURyaXZlciAKLXsKLXB1YmxpYzoKIAotICAgIHN0YXRpYyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyKgkJQ3JlYXRlRnhnZURyaXZlcihDRlhfRElCaXRtYXAqIHBCaXRtYXAsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciA9IEZBTFNFLAotICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlID0gTlVMTCwgRlhfQk9PTCBiR3JvdXBLbm9ja291dCA9IEZBTFNFKTsKK2NsYXNzIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIgeworIHB1YmxpYzoKKyAgc3RhdGljIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIENyZWF0ZUZ4Z2VEcml2ZXIoCisgICAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICBGWF9CT09MIGJSZ2JCeXRlT3JkZXIgPSBGQUxTRSwKKyAgICAgIENGWF9ESUJpdG1hcCogcE9yaURldmljZSA9IE5VTEwsCisgICAgICBGWF9CT09MIGJHcm91cEtub2Nrb3V0ID0gRkFMU0UpOwogCi0gICAgdmlydHVhbCB+SUZYX1JlbmRlckRldmljZURyaXZlcigpIHt9Ci0gICAgdmlydHVhbCB2b2lkIEJlZ2luKCkgeyB9Ci0gICAgdmlydHVhbCB2b2lkIEVuZCgpIHsgfQorICB2aXJ0dWFsIH5JRlhfUmVuZGVyRGV2aWNlRHJpdmVyKCkge30KKyAgdmlydHVhbCB2b2lkIEJlZ2luKCkge30KKyAgdmlydHVhbCB2b2lkIEVuZCgpIHt9CiAKLSAgICB2aXJ0dWFsIGludAkJR2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCkgPSAwOworICB2aXJ0dWFsIGludCBHZXREZXZpY2VDYXBzKGludCBjYXBzX2lkKSA9IDA7CiAKLSAgICB2aXJ0dWFsIENGWF9NYXRyaXgJR2V0Q1RNKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBDRlhfTWF0cml4KCk7Ci0gICAgfQorICB2aXJ0dWFsIENGWF9NYXRyaXggR2V0Q1RNKCkgY29uc3QgeyByZXR1cm4gQ0ZYX01hdHJpeCgpOyB9CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wgSXNQU1ByaW50RHJpdmVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisgIHZpcnR1YWwgRlhfQk9PTCBJc1BTUHJpbnREcml2ZXIoKSB7IHJldHVybiBGQUxTRTsgfQogCi0gICAgdmlydHVhbCBGWF9CT09MCVN0YXJ0UmVuZGVyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KKyAgdmlydHVhbCBGWF9CT09MIFN0YXJ0UmVuZGVyaW5nKCkgeyByZXR1cm4gVFJVRTsgfQogCi0gICAgdmlydHVhbCB2b2lkCUVuZFJlbmRlcmluZygpIHt9CisgIHZpcnR1YWwgdm9pZCBFbmRSZW5kZXJpbmcoKSB7fQogCisgIHZpcnR1YWwgdm9pZCBTYXZlU3RhdGUoKSA9IDA7CiAKKyAgdmlydHVhbCB2b2lkIFJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQgPSBGQUxTRSkgPSAwOwogCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkCVNhdmVTdGF0ZSgpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIFNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQJUmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCA9IEZBTFNFKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzdHJva2VfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCkgPSAwOwogCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRQaXhlbChpbnQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQogCi0gICAgdmlydHVhbCBGWF9CT09MCVNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotICAgIHZpcnR1YWwgRlhfQk9PTAlEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0cm9rZV9jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIEdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpID0gMDsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAlTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KKyAgdmlydHVhbCBGWF9CT09MIEdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJERWRnZSA9IEZBTFNFKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHZpcnR1YWwgQ0ZYX0RJQml0bWFwKiBHZXRCYWNrRHJvcCgpIHsgcmV0dXJuIE5VTEw7IH0KIAotICAgIHZpcnR1YWwgRlhfQk9PTCBGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgZmlsbF9jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpCi0gICAgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKSA9IDA7CiAKLSAgICB2aXJ0dWFsIEZYX0JPT0wJRHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpCi0gICAgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQorICB2aXJ0dWFsIEZYX0JPT0wgU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MIEdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIFN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCkgPSAwOwogCi0gICAgdmlydHVhbCBGWF9CT09MCUdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgRlhfQk9PTCBiREVkZ2UgPSBGQUxTRSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgdmlydHVhbCBDRlhfRElCaXRtYXAqICAgR2V0QmFja0Ryb3AoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQorICB2aXJ0dWFsIEZYX0JPT0wgQ29udGludWVESUJpdHModm9pZCogaGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQogCi0gICAgdmlydHVhbCBGWF9CT09MCVNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCBibGVuZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCkgPSAwOworICB2aXJ0dWFsIHZvaWQgQ2FuY2VsRElCaXRzKHZvaWQqIGhhbmRsZSkge30KIAotICAgIHZpcnR1YWwgRlhfQk9PTAlTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBGWF9EV09SRCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgRHJhd0RldmljZVRleHQoaW50IG5DaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQogCi0gICAgdmlydHVhbCBGWF9CT09MCVN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBmbGFncywgRlhfTFBWT0lEJiBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKSA9IDA7CisgIHZpcnR1YWwgdm9pZCogR2V0UGxhdGZvcm1TdXJmYWNlKCkgeyByZXR1cm4gTlVMTDsgfQogCi0gICAgdmlydHVhbCBGWF9CT09MCUNvbnRpbnVlRElCaXRzKEZYX0xQVk9JRCBoYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KKyAgdmlydHVhbCBpbnQgR2V0RHJpdmVyVHlwZSgpIHsgcmV0dXJuIDA7IH0KIAotICAgIHZpcnR1YWwgdm9pZAlDYW5jZWxESUJpdHMoRlhfTFBWT0lEIGhhbmRsZSkge30KLQotICAgIHZpcnR1YWwgRlhfQk9PTCBEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwgRlhfRkxPQVQgZm9udF9zaXplLCBGWF9EV09SRCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQqCUdldFBsYXRmb3JtU3VyZmFjZSgpCi0gICAgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGludAkJR2V0RHJpdmVyVHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgICAgQ2xlYXJEcml2ZXIoKSB7fQorICB2aXJ0dWFsIHZvaWQgQ2xlYXJEcml2ZXIoKSB7fQogfTsKLWNsYXNzIElGWF9QU091dHB1dAotewotcHVibGljOgotICAgIHZpcnR1YWwgdm9pZCAgUmVsZWFzZSgpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQJT3V0cHV0UFMoRlhfTFBDU1RSIHN0cmluZywgaW50IGxlbikgPSAwOwogCi1wcm90ZWN0ZWQ6Ci0gICAgfklGWF9QU091dHB1dCgpIHsgfQorY2xhc3MgSUZYX1BTT3V0cHV0IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgT3V0cHV0UFMoY29uc3QgRlhfQ0hBUiogc3RyaW5nLCBpbnQgbGVuKSA9IDA7CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgfklGWF9QU091dHB1dCgpIHt9CiB9OworCiBjbGFzcyBDUFNGb250OwotY2xhc3MgQ0ZYX1BTUmVuZGVyZXIgCi17Ci1wdWJsaWM6CitjbGFzcyBDRlhfUFNSZW5kZXJlciB7CisgcHVibGljOgorICBDRlhfUFNSZW5kZXJlcigpOwogCi0gICAgQ0ZYX1BTUmVuZGVyZXIoKTsKKyAgfkNGWF9QU1JlbmRlcmVyKCk7CiAKLSAgICB+Q0ZYX1BTUmVuZGVyZXIoKTsKKyAgdm9pZCBJbml0KElGWF9QU091dHB1dCogcE91dHB1dCwKKyAgICAgICAgICAgIGludCBwc19sZXZlbCwKKyAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICBGWF9CT09MIGJDbXlrT3V0cHV0KTsKKyAgRlhfQk9PTCBTdGFydFJlbmRlcmluZygpOworICB2b2lkIEVuZFJlbmRlcmluZygpOwogCi0gICAgdm9pZAkJCUluaXQoSUZYX1BTT3V0cHV0KiBwT3V0cHV0LCBpbnQgcHNfbGV2ZWwsIGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhfQk9PTCBiQ215a091dHB1dCk7Ci0gICAgRlhfQk9PTAkJCVN0YXJ0UmVuZGVyaW5nKCk7Ci0gICAgdm9pZAkJCUVuZFJlbmRlcmluZygpOworICB2b2lkIFNhdmVTdGF0ZSgpOwogCi0gICAgdm9pZAkJCVNhdmVTdGF0ZSgpOworICB2b2lkIFJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQgPSBGQUxTRSk7CiAKLSAgICB2b2lkCQkJUmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCA9IEZBTFNFKTsKKyAgdm9pZCBTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlKTsKIAotICAgIHZvaWQJCQlTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgIHZvaWQgU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSk7CiAKLSAgICB2b2lkCQkJU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgIEZYX1JFQ1QgR2V0Q2xpcEJveCgpIHsgcmV0dXJuIG1fQ2xpcEJveDsgfQogCi0gICAgRlhfUkVDVAkJCUdldENsaXBCb3goKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fQ2xpcEJveDsKLSAgICB9CisgIEZYX0JPT0wgRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLAorICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0cm9rZV9jb2xvciwKKyAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlLAorICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBGWF9CT09MCQkJRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzdHJva2VfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwKLSAgICAgICAgICAgICAgICAgICAgICApOworICBGWF9CT09MIFNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotICAgIEZYX0JPT0wJCQlTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOworICBGWF9CT09MIFN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CiAKLSAgICBGWF9CT09MCQkJU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIEZYX0RXT1JEIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOworICBGWF9CT09MIERyYXdESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwogCi0gICAgRlhfQk9PTAkJCURyYXdESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CisgIEZYX0JPT0wgRHJhd1RleHQoaW50IG5DaGFycywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCisgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKIAotICAgIEZYX0JPT0wJCQlEcmF3VGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwgRlhfRkxPQVQgZm9udF9zaXplLCBGWF9EV09SRCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7Ci1wcml2YXRlOgorIHByaXZhdGU6CisgIElGWF9QU091dHB1dCogbV9wT3V0cHV0OwogCi0gICAgSUZYX1BTT3V0cHV0KgltX3BPdXRwdXQ7CisgIGludCBtX1BTTGV2ZWw7CiAKLSAgICBpbnQJCQkJbV9QU0xldmVsOworICBDRlhfR3JhcGhTdGF0ZURhdGEgbV9DdXJHcmFwaFN0YXRlOwogCi0gICAgQ0ZYX0dyYXBoU3RhdGVEYXRhCW1fQ3VyR3JhcGhTdGF0ZTsKKyAgRlhfQk9PTCBtX2JHcmFwaFN0YXRlU2V0OwogCi0gICAgRlhfQk9PTAkJCW1fYkdyYXBoU3RhdGVTZXQ7CisgIEZYX0JPT0wgbV9iQ215a091dHB1dDsKIAotICAgIEZYX0JPT0wJCQltX2JDbXlrT3V0cHV0OworICBGWF9CT09MIG1fYkNvbG9yU2V0OwogCi0gICAgRlhfQk9PTAkJCW1fYkNvbG9yU2V0OworICBGWF9EV09SRCBtX0xhc3RDb2xvcjsKIAotICAgIEZYX0RXT1JECQltX0xhc3RDb2xvcjsKKyAgRlhfUkVDVCBtX0NsaXBCb3g7CiAKLSAgICBGWF9SRUNUCQkJbV9DbGlwQm94OworICBDRlhfQXJyYXlUZW1wbGF0ZTxDUFNGb250Kj4gbV9QU0ZvbnRMaXN0OwogCi0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BTRm9udCo+CW1fUFNGb250TGlzdDsKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfUkVDVD4gbV9DbGlwQm94U3RhY2s7CisgIEZYX0JPT0wgbV9iSW5pdGVkOwogCi0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfUkVDVD4JbV9DbGlwQm94U3RhY2s7Ci0gICAgRlhfQk9PTAkJCW1fYkluaXRlZDsKKyAgdm9pZCBPdXRwdXRQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UpOwogCi0gICAgdm9pZAkJCU91dHB1dFBhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlKTsKKyAgdm9pZCBTZXRHcmFwaFN0YXRlKGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUpOwogCi0gICAgdm9pZAkJCVNldEdyYXBoU3RhdGUoY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSk7CisgIHZvaWQgU2V0Q29sb3IoRlhfRFdPUkQgY29sb3IsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKTsKIAotICAgIHZvaWQJCQlTZXRDb2xvcihGWF9EV09SRCBjb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pOworICB2b2lkIEZpbmRQU0ZvbnRHbHlwaChDRlhfRmFjZUNhY2hlKiBwRmFjZUNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TJiBjaGFycG9zLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHBzX2ZvbnRudW0sCisgICAgICAgICAgICAgICAgICAgICAgIGludCYgcHNfZ2x5cGhpbmRleCk7CiAKLSAgICB2b2lkCQkJRmluZFBTRm9udEdseXBoKENGWF9GYWNlQ2FjaGUqIHBGYWNlQ2FjaGUsIENGWF9Gb250KiBwRm9udCwgY29uc3QgRlhURVhUX0NIQVJQT1MmIGNoYXJwb3MsIGludCYgcHNfZm9udG51bSwgaW50ICZwc19nbHlwaGluZGV4KTsKLQotICAgIHZvaWQJCQlXcml0ZVBTQmluYXJ5KEZYX0xQQ0JZVEUgZGF0YSwgaW50IGxlbik7CisgIHZvaWQgV3JpdGVQU0JpbmFyeShjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgbGVuKTsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9JTkNMVURFX0ZYR0VfRlhfR0VfSF8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlX2FwcGxlLmggYi9jb3JlL2luY2x1ZGUvZnhnZS9meF9nZV9hcHBsZS5oCmluZGV4IDkwY2QwMzQuLjE2Mjk4NTggMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlX2FwcGxlLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2VfYXBwbGUuaApAQCAtMSwyNyArMSwyNiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIENPUkVfSU5DTFVERV9GWEdFX0ZYX0dFX0FQUExFX0hfCiAjZGVmaW5lIENPUkVfSU5DTFVERV9GWEdFX0ZYX0dFX0FQUExFX0hfCiAKLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLWNsYXNzIENGWF9RdWFydHpEZXZpY2UgOiBwdWJsaWMgQ0ZYX1JlbmRlckRldmljZQotewotcHVibGljOgotICAgIENGWF9RdWFydHpEZXZpY2UoKTsKLSAgICB+Q0ZYX1F1YXJ0ekRldmljZSgpOwotICAgIEZYX0JPT0wgQXR0YWNoKENHQ29udGV4dFJlZiBjb250ZXh0LCBGWF9JTlQzMiBuRGV2aWNlQ2xhc3MgPSBGWERDX0RJU1BMQVkpOwotICAgIEZYX0JPT0wgQXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCk7Ci0gICAgRlhfQk9PTCBDcmVhdGUoRlhfSU5UMzIgd2lkdGgsIEZYX0lOVDMyIGhlaWdodCwgRlhESUJfRm9ybWF0IGZvcm1hdCk7CisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KK2NsYXNzIENGWF9RdWFydHpEZXZpY2UgOiBwdWJsaWMgQ0ZYX1JlbmRlckRldmljZSB7CisgcHVibGljOgorICBDRlhfUXVhcnR6RGV2aWNlKCk7CisgIH5DRlhfUXVhcnR6RGV2aWNlKCk7CisgIEZYX0JPT0wgQXR0YWNoKENHQ29udGV4dFJlZiBjb250ZXh0LCBpbnQzMl90IG5EZXZpY2VDbGFzcyA9IEZYRENfRElTUExBWSk7CisgIEZYX0JPT0wgQXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCk7CisgIEZYX0JPT0wgQ3JlYXRlKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgZm9ybWF0KTsKIAotICAgIENHQ29udGV4dFJlZiBHZXRDb250ZXh0KCk7CisgIENHQ29udGV4dFJlZiBHZXRDb250ZXh0KCk7CiAKLXByb3RlY3RlZDoKLSAgICBDR0NvbnRleHRSZWYgbV9wQ29udGV4dDsKLSAgICBGWF9CT09MIG1fYk93bmVkQml0bWFwOworIHByb3RlY3RlZDoKKyAgQ0dDb250ZXh0UmVmIG1fcENvbnRleHQ7CisgIEZYX0JPT0wgbV9iT3duZWRCaXRtYXA7CiB9OwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlX3dpbjMyLmggYi9jb3JlL2luY2x1ZGUvZnhnZS9meF9nZV93aW4zMi5oCmluZGV4IGM5Y2IyYTMuLjE0OWM0NmQgMTAwNjQ0Ci0tLSBhL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlX3dpbjMyLmgKKysrIGIvY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2Vfd2luMzIuaApAQCAtMSw3ICsxLDcgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBDT1JFX0lOQ0xVREVfRlhHRV9GWF9HRV9XSU4zMl9IXwpAQCAtMTEsOTYgKzExLDg3IEBACiAjaWZuZGVmIF9XSU5ET1dTXwogI2luY2x1ZGUgPHdpbmRvd3MuaD4KICNlbmRpZgotI2RlZmluZSBXSU5ESUJfT1BFTl9NRU1PUlkgICAgMHgxCi0jZGVmaW5lIFdJTkRJQl9PUEVOX1BBVEhOQU1FICAweDIKLXR5cGVkZWYgc3RydWN0ICBXSU5ESUJfT3Blbl9BcmdzXyB7CisjZGVmaW5lIFdJTkRJQl9PUEVOX01FTU9SWSAweDEKKyNkZWZpbmUgV0lORElCX09QRU5fUEFUSE5BTUUgMHgyCit0eXBlZGVmIHN0cnVjdCBXSU5ESUJfT3Blbl9BcmdzXyB7CisgIGludCBmbGFnczsKIAotICAgIGludCAgICAgICAgIGZsYWdzOworICBjb25zdCB1aW50OF90KiBtZW1vcnlfYmFzZTsKIAotICAgIGNvbnN0IEZYX0JZVEUqICBtZW1vcnlfYmFzZTsKKyAgc2l6ZV90IG1lbW9yeV9zaXplOwogCi0gICAgc2l6ZV90ICAgIG1lbW9yeV9zaXplOwotCi0gICAgRlhfTFBDV1NUUiAgcGF0aF9uYW1lOworICBjb25zdCBGWF9XQ0hBUiogcGF0aF9uYW1lOwogfSBXSU5ESUJfT3Blbl9BcmdzXzsKLWNsYXNzIENGWF9XaW5kb3dzRElCIDogcHVibGljIENGWF9ESUJpdG1hcAotewotcHVibGljOgorY2xhc3MgQ0ZYX1dpbmRvd3NESUIgOiBwdWJsaWMgQ0ZYX0RJQml0bWFwIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRCaXRtYXBJbmZvKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCk7CiAKLSAgICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJR2V0Qml0bWFwSW5mbyhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXApOworICBzdGF0aWMgQ0ZYX0RJQml0bWFwKiBMb2FkRnJvbUJ1ZihCSVRNQVBJTkZPKiBwYm1pLCB2b2lkKiBwRGF0YSk7CiAKLSAgICBzdGF0aWMgQ0ZYX0RJQml0bWFwKiBMb2FkRnJvbUJ1ZihCSVRNQVBJTkZPKiBwYm1pLCB2b2lkKiBwRGF0YSk7CisgIHN0YXRpYyBIQklUTUFQIEdldEREQml0bWFwKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgSERDIGhEQyk7CiAKLSAgICBzdGF0aWMgSEJJVE1BUAkJR2V0RERCaXRtYXAoY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBIREMgaERDKTsKKyAgc3RhdGljIENGWF9ESUJpdG1hcCogTG9hZEZyb21EREIoSERDIGhEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEJJVE1BUCBoQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcFBhbGV0dGUgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplID0gMjU2KTsKIAotICAgIHN0YXRpYyBDRlhfRElCaXRtYXAqIExvYWRGcm9tRERCKEhEQyBoREMsIEhCSVRNQVAgaEJpdG1hcCwgRlhfRFdPUkQqIHBQYWxldHRlID0gTlVMTCwgRlhfRFdPUkQgc2l6ZSA9IDI1Nik7CisgIHN0YXRpYyBDRlhfRElCaXRtYXAqIExvYWRGcm9tRmlsZShjb25zdCBGWF9XQ0hBUiogZmlsZW5hbWUpOwogCi0gICAgc3RhdGljIENGWF9ESUJpdG1hcCogTG9hZEZyb21GaWxlKEZYX0xQQ1dTVFIgZmlsZW5hbWUpOworICBzdGF0aWMgQ0ZYX0RJQml0bWFwKiBMb2FkRnJvbUZpbGUoY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUpIHsKKyAgICByZXR1cm4gTG9hZEZyb21GaWxlKENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoZmlsZW5hbWUpLmNfc3RyKCkpOworICB9CiAKLSAgICBzdGF0aWMgQ0ZYX0RJQml0bWFwKiBMb2FkRnJvbUZpbGUoRlhfTFBDU1RSIGZpbGVuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIExvYWRGcm9tRmlsZShDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKGZpbGVuYW1lKS5jX3N0cigpKTsKLSAgICB9CisgIHN0YXRpYyBDRlhfRElCaXRtYXAqIExvYWRESUJpdG1hcChXSU5ESUJfT3Blbl9BcmdzXyBhcmdzKTsKIAotICAgIHN0YXRpYyBDRlhfRElCaXRtYXAqIExvYWRESUJpdG1hcChXSU5ESUJfT3Blbl9BcmdzXyBhcmdzKTsKKyAgQ0ZYX1dpbmRvd3NESUIoSERDIGhEQywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKIAotICAgIENGWF9XaW5kb3dzRElCKEhEQyBoREMsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisgIH5DRlhfV2luZG93c0RJQigpOwogCi0gICAgfkNGWF9XaW5kb3dzRElCKCk7CisgIEhEQyBHZXREQygpIGNvbnN0IHsgcmV0dXJuIG1faE1lbURDOyB9CiAKLSAgICBIREMJCQkJCUdldERDKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2hNZW1EQzsKLSAgICB9CisgIEhCSVRNQVAgR2V0V2luZG93c0JpdG1hcCgpIGNvbnN0IHsgcmV0dXJuIG1faEJpdG1hcDsgfQogCi0gICAgSEJJVE1BUAkJCQlHZXRXaW5kb3dzQml0bWFwKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2hCaXRtYXA7Ci0gICAgfQorICB2b2lkIExvYWRGcm9tRGV2aWNlKEhEQyBoREMsIGludCBsZWZ0LCBpbnQgdG9wKTsKIAotICAgIHZvaWQJCQkJTG9hZEZyb21EZXZpY2UoSERDIGhEQywgaW50IGxlZnQsIGludCB0b3ApOworICB2b2lkIFNldFRvRGV2aWNlKEhEQyBoREMsIGludCBsZWZ0LCBpbnQgdG9wKTsKIAotICAgIHZvaWQJCQkJU2V0VG9EZXZpY2UoSERDIGhEQywgaW50IGxlZnQsIGludCB0b3ApOwotcHJvdGVjdGVkOgorIHByb3RlY3RlZDoKKyAgSERDIG1faE1lbURDOwogCi0gICAgSERDCQkJCQltX2hNZW1EQzsKKyAgSEJJVE1BUCBtX2hCaXRtYXA7CiAKLSAgICBIQklUTUFQCQkJCW1faEJpdG1hcDsKLQotICAgIEhCSVRNQVAJCQkJbV9oT2xkQml0bWFwOworICBIQklUTUFQIG1faE9sZEJpdG1hcDsKIH07Ci1jbGFzcyBDRlhfV2luZG93c0RldmljZSA6IHB1YmxpYyBDRlhfUmVuZGVyRGV2aWNlCi17Ci1wdWJsaWM6Ci0gICAgc3RhdGljIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqCUNyZWF0ZURyaXZlcihIREMgaERDLCBGWF9CT09MIGJDbXlrT3V0cHV0ID0gRkFMU0UpOworY2xhc3MgQ0ZYX1dpbmRvd3NEZXZpY2UgOiBwdWJsaWMgQ0ZYX1JlbmRlckRldmljZSB7CisgcHVibGljOgorICBzdGF0aWMgSUZYX1JlbmRlckRldmljZURyaXZlciogQ3JlYXRlRHJpdmVyKEhEQyBoREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ215a091dHB1dCA9IEZBTFNFKTsKIAotICAgIENGWF9XaW5kb3dzRGV2aWNlKEhEQyBoREMsIEZYX0JPT0wgYkNteWtPdXRwdXQgPSBGQUxTRSwgRlhfQk9PTCBiRm9yY2VQU091dHB1dCA9IEZBTFNFLCBpbnQgcHNMZXZlbCA9IDIpOworICBDRlhfV2luZG93c0RldmljZShIREMgaERDLAorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDbXlrT3V0cHV0ID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZvcmNlUFNPdXRwdXQgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgaW50IHBzTGV2ZWwgPSAyKTsKIAotICAgIEhEQwkJR2V0REMoKSBjb25zdDsKKyAgSERDIEdldERDKCkgY29uc3Q7CiAKLSAgICBGWF9CT09MIG1fYkZvcmNlUFNPdXRwdXQ7CisgIEZYX0JPT0wgbV9iRm9yY2VQU091dHB1dDsKIAotICAgIHN0YXRpYyBpbnQgbV9wc0xldmVsOworICBzdGF0aWMgaW50IG1fcHNMZXZlbDsKIH07Ci1jbGFzcyBDRlhfV2luQml0bWFwRGV2aWNlIDogcHVibGljIENGWF9SZW5kZXJEZXZpY2UKLXsKLXB1YmxpYzoKK2NsYXNzIENGWF9XaW5CaXRtYXBEZXZpY2UgOiBwdWJsaWMgQ0ZYX1JlbmRlckRldmljZSB7CisgcHVibGljOgorICBDRlhfV2luQml0bWFwRGV2aWNlKGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhESUJfRm9ybWF0IGZvcm1hdCk7CiAKLSAgICBDRlhfV2luQml0bWFwRGV2aWNlKGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhESUJfRm9ybWF0IGZvcm1hdCk7CisgIH5DRlhfV2luQml0bWFwRGV2aWNlKCk7CiAKLSAgICB+Q0ZYX1dpbkJpdG1hcERldmljZSgpOworICBIREMgR2V0REMoKSB7IHJldHVybiBtX2hEQzsgfQogCi0gICAgSERDCQlHZXREQygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9oREM7Ci0gICAgfQotcHJvdGVjdGVkOgorIHByb3RlY3RlZDoKKyAgSEJJVE1BUCBtX2hCaXRtYXA7CiAKLSAgICBIQklUTUFQCW1faEJpdG1hcDsKKyAgSEJJVE1BUCBtX2hPbGRCaXRtYXA7CiAKLSAgICBIQklUTUFQIG1faE9sZEJpdG1hcDsKLQotICAgIEhEQwkJbV9oREM7CisgIEhEQyBtX2hEQzsKIH07CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL3JlZmxvdy9mcGRmX2xheW91dC5oIGIvY29yZS9pbmNsdWRlL3JlZmxvdy9mcGRmX2xheW91dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmQ4NzljLi4wMDAwMDAwCi0tLSBhL2NvcmUvaW5jbHVkZS9yZWZsb3cvZnBkZl9sYXlvdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfSU5DTFVERV9SRUZMT1dfRlBERl9MQVlPVVRfSF8KLSNkZWZpbmUgQ09SRV9JTkNMVURFX1JFRkxPV19GUERGX0xBWU9VVF9IXwotCi1jbGFzcyBJUERGX0xheW91dEVsZW1lbnQ7Ci1jbGFzcyBJUERGX0xheW91dFByb2Nlc3NvcjsKLWNsYXNzIElQREZfTGF5b3V0UHJvdmlkZXI7Ci10eXBlZGVmIGVudW0gewotICAgIExheW91dFVua25vd24sCi0gICAgTGF5b3V0QXJpZmFjdCwKLSAgICBMYXlvdXREb2N1bWVudCwKLSAgICBMYXlvdXRQYXJ0LAotICAgIExheW91dEFydCwKLSAgICBMYXlvdXRTZWN0LAotICAgIExheW91dERpdiwKLSAgICBMYXlvdXRCbG9ja1F1b3RlLAotICAgIExheW91dENhcHRpb24sCi0gICAgTGF5b3V0VE9DLAotICAgIExheW91dFRPQ0ksCi0gICAgTGF5b3V0SW5kZXgsCi0gICAgTGF5b3V0Tm9uU3RydWN0LAotICAgIExheW91dFByaXZhdGUsCi0gICAgTGF5b3V0UGFyYWdyYXBoLAotICAgIExheW91dEhlYWRpbmcsCi0gICAgTGF5b3V0SGVhZGluZzEsCi0gICAgTGF5b3V0SGVhZGluZzIsCi0gICAgTGF5b3V0SGVhZGluZzMsCi0gICAgTGF5b3V0SGVhZGluZzQsCi0gICAgTGF5b3V0SGVhZGluZzUsCi0gICAgTGF5b3V0SGVhZGluZzYsCi0gICAgTGF5b3V0TGlzdCwKLSAgICBMYXlvdXRMaXN0SXRlbSwKLSAgICBMYXlvdXRMaXN0TGFiZWwsCi0gICAgTGF5b3V0TGlzdEJvZHksCi0gICAgTGF5b3V0VGFibGUsCi0gICAgTGF5b3V0VGFibGVSb3csCi0gICAgTGF5b3V0VGFibGVIZWFkZXJDZWxsLAotICAgIExheW91dFRhYmxlRGF0YUNlbGwsCi0gICAgTGF5b3V0VGFibGVIZWFkZXJHcm91cCwKLSAgICBMYXlvdXRUYWJsZUJvZHlHcm91cCwKLSAgICBMYXlvdXRUYWJsZUZvb3RHcm91cCwKLSAgICBMYXlvdXRTcGFuLAotICAgIExheW91dFF1b3RlLAotICAgIExheW91dE5vdGUsCi0gICAgTGF5b3V0UmVmZXJlbmNlLAotICAgIExheW91dEJpYkVudHJ5LAotICAgIExheW91dENvZGUsCi0gICAgTGF5b3V0TGluaywKLSAgICBMYXlvdXRBbm5vdCwKLSAgICBMYXlvdXRSdWJ5LAotICAgIExheW91dFJ1YnlCYXNlLAotICAgIExheW91dFJ1YnlBbm5vdCwKLSAgICBMYXlvdXRSdWJ5UHVuYywKLSAgICBMYXlvdXRXYXJpY2h1LAotICAgIExheW91dFdhcmljaHVUZXh0LAotICAgIExheW91dFdhcmljaHVQdW5jLAotICAgIExheW91dEZpZ3VyZSwKLSAgICBMYXlvdXRGb3JtdWxhLAotICAgIExheW91dEZvcm0sCi19IExheW91dFR5cGU7Ci10eXBlZGVmIGVudW0gewotICAgIExheW91dEFydGlmYWN0VHlwZSwKLSAgICBMYXlvdXRBcnRpZmFjdEF0dGFjaGVkLAotICAgIExheW91dEFydGlmYWN0U3ViVHlwZSwKLSAgICBMYXlvdXRQbGFjZW1lbnQsCi0gICAgTGF5b3V0V3JpdGluZ01vZGUsCi0gICAgTGF5b3V0QmFja2dyb3VuZENvbG9yLAotICAgIExheW91dEJvcmRlckNvbG9yLAotICAgIExheW91dEJvcmRlclN0eWxlLAotICAgIExheW91dEJvcmRlclRoaWNrbmVzcywKLSAgICBMYXlvdXRQYWRkaW5nLAotICAgIExheW91dENvbG9yLAotICAgIExheW91dFNwYWNlQmVmb3JlLAotICAgIExheW91dFNwYWNlQWZ0ZXIsCi0gICAgTGF5b3V0U3RhcnRJbmRlbnQsCi0gICAgTGF5b3V0RW5kSW5kZW50LAotICAgIExheW91dFRleHRJbmRlbnQsCi0gICAgTGF5b3V0VGV4dEFsaWduLAotICAgIExheW91dEJCb3gsCi0gICAgTGF5b3V0V2lkdGgsCi0gICAgTGF5b3V0SGVpZ2h0LAotICAgIExheW91dEJsb2NrQWxpZ24sCi0gICAgTGF5b3V0SW5saW5lQWxpZ24sCi0gICAgTGF5b3V0VEJvcmRlclN0eWxlLAotICAgIExheW91dFRQYWRkaW5nLAotICAgIExheW91dEJhc2VsaW5lU2hpZnQsCi0gICAgTGF5b3V0TGluZUhlaWdodCwKLSAgICBMYXlvdXRUZXh0RGVjb3JhdGlvbkNvbG9yLAotICAgIExheW91dFRleHREZWNvcmF0aW9uVGhpY2tuZXNzLAotICAgIExheW91dFRleHREZWNvcmF0aW9uVHlwZSwKLSAgICBMYXlvdXRSdWJ5QWxpZ24sCi0gICAgTGF5b3V0UnVieVBvc2l0aW9uLAotICAgIExheW91dEdseXBoT3JpZW50YXRpb25WZXJ0aWNhbCwKLSAgICBMYXlvdXRDb2x1bW5Db3VudCwKLSAgICBMYXlvdXRDb2x1bW5HYXAsCi0gICAgTGF5b3V0Q29sdW1uV2lkdGhzLAotICAgIExheW91dExpc3ROdW1iZXJpbmcsCi0gICAgTGF5b3V0RmllbGRSb2xlLAotICAgIExheW91dEZpZWxkQ2hlY2tlZCwKLSAgICBMYXlvdXRGaWVsZERlc2MsCi0gICAgTGF5b3V0Um93U3BhbiwKLSAgICBMYXlvdXRDb2xTcGFuLAotICAgIExheW91dFRhYmxlSGVhZGVycywKLSAgICBMYXlvdXRUYWJsZUhlYWRlclNjb3BlLAotICAgIExheW91dFRhYmxlU3VtbWFyeSwKLX0gTGF5b3V0QXR0cjsKLXR5cGVkZWYgZW51bSB7Ci0gICAgTGF5b3V0SW52YWxpZCA9IDAsCi0gICAgTGF5b3V0QmxvY2ssCi0gICAgTGF5b3V0SW5saW5lLAotICAgIExheW91dEJlZm9yZSwKLSAgICBMYXlvdXRBZnRlciwKLSAgICBMYXlvdXRTdGFydCwKLSAgICBMYXlvdXRFbmQsCi0gICAgTGF5b3V0THJUYiwKLSAgICBMYXlvdXRSbFRiLAotICAgIExheW91dFRiUmwsCi0gICAgTGF5b3V0Tm9uZSwKLSAgICBMYXlvdXRIaWRkZW4sCi0gICAgTGF5b3V0RG90dGVkLAotICAgIExheW91dERhc2hlZCwKLSAgICBMYXlvdXRTb2xpZCwKLSAgICBMYXlvdXREb3VibGUsCi0gICAgTGF5b3V0R3Jvb3ZlLAotICAgIExheW91dFJpZGdlLAotICAgIExheW91dEluc2V0LAotICAgIExheW91dE91dHNldCwKLSAgICBMYXlvdXROb3JtYWwsCi0gICAgTGF5b3V0QXV0bywKLSAgICBMYXlvdXRDZW50ZXIsCi0gICAgTGF5b3V0SnVzdGlmeSwKLSAgICBMYXlvdXRNaWRkbGUsCi0gICAgTGF5b3V0VW5kZXJsaW5lLAotICAgIExheW91dE92ZXJsaW5lLAotICAgIExheW91dExpbmVUaHJvdWdoLAotICAgIExheW91dERpc3RyaWJ1dGUsCi0gICAgTGF5b3V0TWludXM5MERlZ3JlZSwKLSAgICBMYXlvdXRaZXJvRGVncmVlLAotICAgIExheW91dDkwRGVncmVlLAotICAgIExheW91dDE4MERlZ3JlZSwKLSAgICBMYXlvdXQyNzBEZWdyZWUsCi0gICAgTGF5b3V0RGlzYywKLSAgICBMYXlvdXRDaXJjbGUsCi0gICAgTGF5b3V0U3F1YXJlLAotICAgIExheW91dERlY2ltYWwsCi0gICAgTGF5b3V0VXBwZXJSb21hbiwKLSAgICBMYXlvdXRMb3dlclJvbWFuLAotICAgIExheW91dFVwcGVyQWxwaGEsCi0gICAgTGF5b3V0TG93ZXJBbHBoYSwKLSAgICBMYXlvdXRSQiwKLSAgICBMYXlvdXRDQiwKLSAgICBMYXlvdXRQQiwKLSAgICBMYXlvdXRUViwKLSAgICBMYXlvdXRPbiwKLSAgICBMYXlvdXRPZmYsCi0gICAgTGF5b3V0TmV1dHJhbCwKLSAgICBMYXlvdXRSb3csCi0gICAgTGF5b3V0Q29sdW1uLAotICAgIExheW91dEJvdGgsCi0gICAgTGF5b3V0TGVmdCwKLSAgICBMYXlvdXRUb3AsCi0gICAgTGF5b3V0Qm90dG9tLAotICAgIExheW91dFJpZ2h0LAotICAgIExheW91dFBhZ2luYXRpb24sCi0gICAgTGF5b3V0TGF5b3V0LAotICAgIExheW91dFBhZ2UsCi0gICAgTGF5b3V0QmFja2dyb3VuZCwKLSAgICBMYXlvdXRIZWFkZXIsCi0gICAgTGF5b3V0Rm9vdGVyLAotICAgIExheW91dFdhdGVybWFyaywKLX0gTGF5b3V0RW51bTsKLWNsYXNzIElQREZfTGF5b3V0RWxlbWVudAotewotcHVibGljOgotCi0gICAgdmlydHVhbCB+SVBERl9MYXlvdXRFbGVtZW50KCkge307Ci0KLQotICAgIHZpcnR1YWwgTGF5b3V0VHlwZQlHZXRUeXBlKCkgPSAwOwotCi0gICAgdmlydHVhbCBpbnQJCUNvdW50QXR0clZhbHVlcyhMYXlvdXRBdHRyIGF0dHJfdHlwZSkgPSAwOwotCi0KLSAgICB2aXJ0dWFsIExheW91dEVudW0JR2V0RW51bUF0dHIoTGF5b3V0QXR0ciBhdHRyX3R5cGUsIGludCBpbmRleCA9IDApID0gMDsKLQotICAgIHZpcnR1YWwgRlhfRkxPQVQJR2V0TnVtYmVyQXR0cihMYXlvdXRBdHRyIGF0dHJfdHlwZSwgaW50IGluZGV4ID0gMCkgPSAwOwotCi0gICAgdmlydHVhbCBGWF9DT0xPUlJFRglHZXRDb2xvckF0dHIoTGF5b3V0QXR0ciBhdHRyX3R5cGUsIGludCBpbmRleCA9IDApID0gMDsKLQotCi0gICAgdmlydHVhbCBpbnQJCUNvdW50Q2hpbGRyZW4oKSA9IDA7Ci0KLQotICAgIHZpcnR1YWwgSVBERl9MYXlvdXRFbGVtZW50KiBHZXRDaGlsZChpbnQgaW5kZXgpID0gMDsKLQotCi0gICAgdmlydHVhbCBJUERGX0xheW91dEVsZW1lbnQqIEdldFBhcmVudCgpID0gMDsKLQotCi0gICAgdmlydHVhbCBpbnQJCUNvdW50T2JqZWN0cygpID0gMDsKLQotICAgIHZpcnR1YWwgQ1BERl9QYWdlT2JqZWN0KglHZXRPYmplY3QoaW50IGluZGV4KSA9IDA7Ci19OwotdHlwZWRlZiBlbnVtIHsKLSAgICBMYXlvdXRSZWFkeSwKLSAgICBMYXlvdXRGaW5pc2hlZCwKLSAgICBMYXlvdXRUb0JlQ29udGludWVkLAotICAgIExheW91dEVycm9yCi19IExheW91dFN0YXR1czsKLSNkZWZpbmUgUkZfUEFSU0VSX0lNQUdFCQkweDEKLSNkZWZpbmUgUkZfUEFSU0VSX0RFQlVHSU5GTwkweDIKLSNkZWZpbmUgUkZfUEFSU0VSX1BBR0VNT0RFCTB4NAotI2RlZmluZSBSRl9QQVJTRVJfUkVBREVST1JERVIJMHg4Ci1jbGFzcyBJUERGX0xheW91dFByb2Nlc3NvcgotewotcHVibGljOgotCi0gICAgdmlydHVhbCB+SVBERl9MYXlvdXRQcm9jZXNzb3IoKSB7fTsKLQotICAgIHN0YXRpYyBJUERGX0xheW91dFByb2Nlc3NvciogQ3JlYXRlX0xheW91dFByb2Nlc3Nvcl9SZWZsb3coRlhfRkxPQVQgVG9wSW5kZW50LCBGWF9GTE9BVCBmV2lkdGgsIEZYX0ZMT0FUIGZIZWlnaHQsIHZvaWQqIHBSZWZsb3dlZFBhZ2UsIGludCBmbGFncywgRlhfRkxPQVQgbGluZVNwYWNlID0gMCk7Ci0KLSAgICBzdGF0aWMgSVBERl9MYXlvdXRQcm9jZXNzb3IqIENyZWF0ZV9MYXlvdXRQcm9jZXNzb3JfMkhUTUwoRlhfTFBDU1RSIGZpbGVOYW1lKTsKLQotICAgIHZpcnR1YWwgTGF5b3V0U3RhdHVzCVN0YXJ0UHJvY2VzcyhJUERGX0xheW91dEVsZW1lbnQqIHBFbGVtZW50LCBJRlhfUGF1c2UqIHBQYXVzZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFBERk1hdHJpeCA9IE5VTEwpID0gMDsKLQotICAgIHZpcnR1YWwgTGF5b3V0U3RhdHVzCUNvbnRpbnVlKCkgPSAwOwotICAgIHZpcnR1YWwgaW50CQkJCUdldFBvc2l0aW9uKCkgPSAwOwotfTsKLSNkZWZpbmUgTFBfTGFuZ19Vbmtub3cJIAkJMHgwCi0jZGVmaW5lIExQX0xhbmdfRW5nbGlzaAkgCQkweDEKLSNkZWZpbmUgTFBfTGFuZ19GcmVuY2gJCQkweDIKLSNkZWZpbmUgTFBfTGFuZ19JdGFsaWFuCQkJMHg0Ci0jZGVmaW5lIExQX0xhbmdfR2VybWFuCQkJMHg4Ci0jZGVmaW5lIExQX0xhbmdfU3BhbmlzaAkJCTB4MTAKLSNkZWZpbmUgTFBfTGFuZ19Qb2xpc2gJCQkweDIwCi0jZGVmaW5lIExQX0xhbmdfUnVzc2lhbgkJCTB4NDAKLSNkZWZpbmUgTFBfTGFuZ19DaGluZXNlUFJDCQkweDgwCi0jZGVmaW5lIExQX0xhbmdfQ2hpbmVzZVRhaXdhbgkweDEwMAotI2RlZmluZSBMUF9MYW5nX0phcGFuZXNlCQkweDIwMAotI2RlZmluZSBMUF9MYW5nX0tvcmVhbgkJCTB4NDAwCi0jZGVmaW5lIExQX0xhbmdfUG9ydHVndWVzZQkJMHg4MDAKLSNkZWZpbmUgTFBfTGFuZ19UdXJraXNoCQkJMHgxMDAwCi0jZGVmaW5lIExQX0xhbmdfRHV0Y2gJCQkweDIwMDAKLXR5cGVkZWYgc3RydWN0IF9MYXlvdXRQcm92aWRlclN0eWxlIHsKLSAgICBfTGF5b3V0UHJvdmlkZXJTdHlsZSgpCi0gICAgewotICAgICAgICBtX0xhbmd1YWdlID0gTFBfTGFuZ19Vbmtub3c7Ci0gICAgICAgIG1fYklnbm9yZUludmlzaWJsZVRleHQgPSBUUlVFOwotICAgIH0KLSAgICBGWF9JTlQzMgltX0xhbmd1YWdlOwotICAgIEZYX0JPT0wJCW1fYklnbm9yZUludmlzaWJsZVRleHQ7Ci19IExBWU9VVFBST1ZJREVSX1NUWUxFOwotY2xhc3MgSVBERl9MYXlvdXRQcm92aWRlcgotewotcHVibGljOgotCi0gICAgdmlydHVhbCB+SVBERl9MYXlvdXRQcm92aWRlcigpIHt9OwotCi0gICAgc3RhdGljIElQREZfTGF5b3V0UHJvdmlkZXIqIENyZWF0ZV9MYXlvdXRQcm92aWRlcl9UYWdnZWRQREYoQ1BERl9QYWdlT2JqZWN0cyogcFBhZ2VPYmpzKTsKLQotICAgIHN0YXRpYyBJUERGX0xheW91dFByb3ZpZGVyKiBDcmVhdGVfTGF5b3V0UHJvdmlkZXJfQXV0b1JlZmxvdyhDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9ianMsIEZYX0JPT0wgYlJlYWRPcmRlcik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQJCQlTZXRMYXlvdXRQcm92aWRlclN0eWxlKExBWU9VVFBST1ZJREVSX1NUWUxFIFN0eWxlKSA9IDA7Ci0KLQotCi0KLSAgICB2aXJ0dWFsIExheW91dFN0YXR1cwlTdGFydExvYWQoSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIExheW91dFN0YXR1cwlDb250aW51ZSgpID0gMDsKLSAgICB2aXJ0dWFsIGludAkJCQlHZXRQb3NpdGlvbigpID0gMDsKLQotCi0gICAgdmlydHVhbCBJUERGX0xheW91dEVsZW1lbnQqIEdldFJvb3QoKSA9IDA7Ci19OwotI2VuZGlmICAvLyBDT1JFX0lOQ0xVREVfUkVGTE9XX0ZQREZfTEFZT1VUX0hfCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvcmVmbG93L3JlZmxvd2VuZ2luZS5oIGIvY29yZS9pbmNsdWRlL3JlZmxvdy9yZWZsb3dlbmdpbmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYzYzk0My4uMDAwMDAwMAotLS0gYS9jb3JlL2luY2x1ZGUvcmVmbG93L3JlZmxvd2VuZ2luZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBDT1JFX0lOQ0xVREVfUkVGTE9XX1JFRkxPV0VOR0lORV9IXwotI2RlZmluZSBDT1JFX0lOQ0xVREVfUkVGTE9XX1JFRkxPV0VOR0lORV9IXwotCi0jaW5jbHVkZSAiLi4vZnBkZmFwaS9mcGRmX3BhZ2VvYmouaCIKLSNpbmNsdWRlICIuLi9mcGRmYXBpL2ZwZGZfcmVuZGVyLmgiCi0jaW5jbHVkZSAiLi4vZnBkZmRvYy9mcGRmX3RhZ2dlZC5oIgotI2luY2x1ZGUgIi4uL2ZwZGZ0ZXh0L2ZwZGZfdGV4dC5oIgotI2luY2x1ZGUgImZwZGZfbGF5b3V0LmgiCi0KLWNsYXNzIElQREZfUmVmbG93ZWRQYWdlCi17Ci1wdWJsaWM6Ci0gICAgc3RhdGljIElQREZfUmVmbG93ZWRQYWdlKiBDcmVhdGUoKTsKLQotICAgIHZpcnR1YWwgfklQREZfUmVmbG93ZWRQYWdlKCkge30KLSAgICB2aXJ0dWFsIENGWF9Qcml2YXRlRGF0YSoJR2V0UHJpdmF0ZURhdGFDdHJsKCkgPSAwOwotCi0KLSAgICB2aXJ0dWFsIHZvaWQJCUdldERpc3BsYXlNYXRyaXgoQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4LCBGWF9JTlQzMiB4UG9zLCBGWF9JTlQzMiB5UG9zLCBGWF9JTlQzMiB4U2l6ZSwgRlhfSU5UMzIgeVNpemUsIEZYX0lOVDMyIGlSb3RhdGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBQYWdlTWF0cml4KSA9IDA7Ci0gICAgdmlydHVhbCBGWF9GTE9BVAlHZXRQYWdlSGVpZ2h0KCkgPSAwOwotICAgIHZpcnR1YWwgRlhfRkxPQVQJR2V0UGFnZVdpZHRoKCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZAkJRm9jdXNHZXREYXRhKGNvbnN0IENGWF9BZmZpbmVNYXRyaXggbWF0cml4LCBGWF9JTlQzMiB4LCBGWF9JTlQzMiB5LCBDRlhfQnl0ZVN0cmluZyYgc3RyKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlGb2N1c0dldFBvc2l0aW9uKGNvbnN0IENGWF9BZmZpbmVNYXRyaXggbWF0cml4LCBDRlhfQnl0ZVN0cmluZyBzdHIsIEZYX0lOVDMyJiB4LCBGWF9JTlQzMiYgeSkgPSAwOwotfTsKLXR5cGVkZWYgc3RydWN0IF9SRl9QYXJzZVN0eWxlIHsKLSAgICBfUkZfUGFyc2VTdHlsZSgpCi0gICAgewotICAgICAgICBtX0xpbmVTcGFjZSA9IDA7Ci0gICAgfTsKLSAgICBGWF9GTE9BVCBtX0xpbmVTcGFjZTsKLX0gUkZfUGFyc2VTdHlsZTsKLWNsYXNzIElQREZfUHJvZ3Jlc3NpdmVSZWZsb3dQYWdlUGFyc2VyCi17Ci1wdWJsaWM6Ci0gICAgc3RhdGljIElQREZfUHJvZ3Jlc3NpdmVSZWZsb3dQYWdlUGFyc2VyKiBDcmVhdGUoKTsKLSAgICBzdGF0aWMgRlhfQk9PTAlJc1RhZ2dlZFBhZ2UoQ1BERl9QYWdlT2JqZWN0cypwUGFnZSk7Ci0KLSAgICB2aXJ0dWFsIH5JUERGX1Byb2dyZXNzaXZlUmVmbG93UGFnZVBhcnNlcigpIHt9Ci0gICAgdHlwZWRlZiBlbnVtIHsgUmVhZHksIFRvQmVDb250aW51ZWQsIERvbmUsIEZhaWxlZCB9IFBhcnNlU3RhdHVzOwotCi0gICAgdmlydHVhbCBQYXJzZVN0YXR1cwkJR2V0U3RhdHVzKCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZAkJCVNldFBhcnNlclN0eWxlKFJGX1BhcnNlU3R5bGUgc3R5bGUpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQJCQlTdGFydChJUERGX1JlZmxvd2VkUGFnZSogcFJlZmxvd1BhZ2UsIENQREZfUGFnZSogcFBhZ2UsIEZYX0ZMT0FUIFRvcEluZGVudCwgRlhfRkxPQVQgZldpZHRoLCBGWF9GTE9BVCBmSGVpZ2h0LCBJRlhfUGF1c2UqIHBQYXVzZSwgaW50IGZsYWdzKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkCQkJQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpID0gMDsKLQotICAgIHZpcnR1YWwgaW50CQkJCUdldFBvc2l0aW9uKCkgPSAwOwotCi0KLSAgICB2aXJ0dWFsIHZvaWQJCQlDbGVhcigpID0gMDsKLX07Ci1jbGFzcyBJUERGX1Byb2dyZXNzaXZlUmVmbG93UGFnZVJlbmRlcgotewotcHVibGljOgotICAgIHN0YXRpYyBJUERGX1Byb2dyZXNzaXZlUmVmbG93UGFnZVJlbmRlciogQ3JlYXRlKCk7Ci0KLSAgICB2aXJ0dWFsIH5JUERGX1Byb2dyZXNzaXZlUmVmbG93UGFnZVJlbmRlcigpIHt9Ci0gICAgdHlwZWRlZiBlbnVtIHsgUmVhZHksIFRvQmVDb250aW51ZWQsIFdhaXRpbmcsIERvbmUsIEZhaWxlZCB9IFJlbmRlclN0YXR1czsKLQotICAgIHZpcnR1YWwgUmVuZGVyU3RhdHVzCUdldFN0YXR1cygpID0gMDsKLQotCi0gICAgdmlydHVhbCB2b2lkCQlTdGFydChJUERGX1JlZmxvd2VkUGFnZSogcFJlZmxvd1BhZ2UsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIElGWF9QYXVzZSogcFBhdXNlLCBpbnQgRGl0aGVyQml0cyApID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQJCUNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKSA9IDA7Ci0gICAgdmlydHVhbCBpbnQJCQlHZXRQb3NpdGlvbigpID0gMDsKLQotCi0gICAgdmlydHVhbCB2b2lkCQkJCUNsZWFyKCkgPSAwOwotfTsKLUlQREZfUmVmbG93ZWRQYWdlKiBDcmVhdGVfUmVmbG93UGFnZSgpOwotSVBERl9Qcm9ncmVzc2l2ZVJlZmxvd1BhZ2VQYXJzZXIqIENyZWF0ZV9SZWZsb3dQYWdlUGFyc2VyKCk7Ci1JUERGX1Byb2dyZXNzaXZlUmVmbG93UGFnZVJlbmRlciogQ3JlYXRlX1JlZmxvd1BhZ2VSZW5kZXIoKTsKLQotI2VuZGlmICAvLyBDT1JFX0lOQ0xVREVfUkVGTE9XX1JFRkxPV0VOR0lORV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL3RoaXJkcGFydGllcy9saWJqcGVnL2pjb25maWcuaCBiL2NvcmUvaW5jbHVkZS90aGlyZHBhcnRpZXMvbGlianBlZy9qY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhM2MzOTcuLjAwMDAwMDAKLS0tIGEvY29yZS9pbmNsdWRlL3RoaXJkcGFydGllcy9saWJqcGVnL2pjb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotLyogamNvbmZpZy52YyAtLS0gamNvbmZpZy5oIGZvciBNaWNyb3NvZnQgVmlzdWFsIEMrKyBvbiBXaW5kb3dzIDk1IG9yIE5ULiAqLwotLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KLQotI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCi0jZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKLS8qICNkZWZpbmUgdm9pZCBjaGFyICovCi0vKiAjZGVmaW5lIGNvbnN0ICovCi0jdW5kZWYgQ0hBUl9JU19VTlNJR05FRAotI2RlZmluZSBIQVZFX1NURERFRl9ICi0jZGVmaW5lIEhBVkVfU1RETElCX0gKLSN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCi0jdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAotI3VuZGVmIE5FRURfRkFSX1BPSU5URVJTCS8qIHdlIHByZXN1bWUgYSAzMi1iaXQgZmxhdCBtZW1vcnkgbW9kZWwgKi8KLSN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KLQotLyogRGVmaW5lICJib29sZWFuIiBhcyB1bnNpZ25lZCBjaGFyLCBub3QgaW50LCBwZXIgV2luZG93cyBjdXN0b20gKi8KLSNpZm5kZWYgX19SUENORFJfSF9fCQkvKiBkb24ndCBjb25mbGljdCBpZiBycGNuZHIuaCBhbHJlYWR5IHJlYWQgKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBib29sZWFuOwotI2VuZGlmCi0jZGVmaW5lIEhBVkVfQk9PTEVBTgkJLyogcHJldmVudCBqbW9yZWNmZy5oIGZyb20gcmVkZWZpbmluZyBpdCAqLwotCi0KLSNpZmRlZiBKUEVHX0lOVEVSTkFMUwotCi0jdW5kZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKLQotI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCi0KLSNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHCi0KLSNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovCi0KLSNkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUJLyogb3B0aW9uYWwgKi8KLSNkZWZpbmUgVVNFX1NFVE1PREUJCS8qIE1pY3Jvc29mdCBoYXMgc2V0bW9kZSgpICovCi0jdW5kZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgotI3VuZGVmIERPTlRfVVNFX0JfTU9ERQotI3VuZGVmIFBST0dSRVNTX1JFUE9SVAkJLyogb3B0aW9uYWwgKi8KLQotI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS90aGlyZHBhcnRpZXMvbGlianBlZy9qZXJyb3IuaCBiL2NvcmUvaW5jbHVkZS90aGlyZHBhcnRpZXMvbGlianBlZy9qZXJyb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZkMzQ0MC4uMDAwMDAwMAotLS0gYS9jb3JlL2luY2x1ZGUvdGhpcmRwYXJ0aWVzL2xpYmpwZWcvamVycm9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoKLSAqIGplcnJvci5oCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZXJyb3IgYW5kIG1lc3NhZ2UgY29kZXMgZm9yIHRoZSBKUEVHIGxpYnJhcnkuCi0gKiBFZGl0IHRoaXMgZmlsZSB0byBhZGQgbmV3IGNvZGVzLCBvciB0byB0cmFuc2xhdGUgdGhlIG1lc3NhZ2Ugc3RyaW5ncyB0bwotICogc29tZSBvdGhlciBsYW5ndWFnZS4KLSAqIEEgc2V0IG9mIGVycm9yLXJlcG9ydGluZyBtYWNyb3MgYXJlIGRlZmluZWQgdG9vLiAgU29tZSBhcHBsaWNhdGlvbnMgdXNpbmcKLSAqIHRoZSBKUEVHIGxpYnJhcnkgbWF5IHdpc2ggdG8gaW5jbHVkZSB0aGlzIGZpbGUgdG8gZ2V0IHRoZSBlcnJvciBjb2RlcwotICogYW5kL29yIHRoZSBtYWNyb3MuCi0gKi8KLQotLyoKLSAqIFRvIGRlZmluZSB0aGUgZW51bSBsaXN0IG9mIG1lc3NhZ2UgY29kZXMsIGluY2x1ZGUgdGhpcyBmaWxlIHdpdGhvdXQKLSAqIGRlZmluaW5nIG1hY3JvIEpNRVNTQUdFLiAgVG8gY3JlYXRlIGEgbWVzc2FnZSBzdHJpbmcgdGFibGUsIGluY2x1ZGUgaXQKLSAqIGFnYWluIHdpdGggYSBzdWl0YWJsZSBKTUVTU0FHRSBkZWZpbml0aW9uIChzZWUgamVycm9yLmMgZm9yIGFuIGV4YW1wbGUpLgotICovCi0jaWZuZGVmIEpNRVNTQUdFCi0jaWZuZGVmIEpFUlJPUl9ICi0vKiBGaXJzdCB0aW1lIHRocm91Z2gsIGRlZmluZSB0aGUgZW51bSBsaXN0ICovCi0jZGVmaW5lIEpNQUtFX0VOVU1fTElTVAotI2Vsc2UKLS8qIFJlcGVhdGVkIGluY2x1c2lvbnMgb2YgdGhpcyBmaWxlIGFyZSBuby1vcHMgdW5sZXNzIEpNRVNTQUdFIGlzIGRlZmluZWQgKi8KLSNkZWZpbmUgSk1FU1NBR0UoY29kZSxzdHJpbmcpCi0jZW5kaWYgLyogSkVSUk9SX0ggKi8KLSNlbmRpZiAvKiBKTUVTU0FHRSAqLwotCi0jaWZkZWYgSk1BS0VfRU5VTV9MSVNUCi0KLXR5cGVkZWYgZW51bSB7Ci0KLSNkZWZpbmUgSk1FU1NBR0UoY29kZSxzdHJpbmcpCWNvZGUgLAotCi0jZW5kaWYgLyogSk1BS0VfRU5VTV9MSVNUICovCi0KLUpNRVNTQUdFKEpNU0dfTk9NRVNTQUdFLCAiQm9ndXMgbWVzc2FnZSBjb2RlICVkIikgLyogTXVzdCBiZSBmaXJzdCBlbnRyeSEgKi8KLQotLyogRm9yIG1haW50ZW5hbmNlIGNvbnZlbmllbmNlLCBsaXN0IGlzIGFscGhhYmV0aWNhbCBieSBtZXNzYWdlIGNvZGUgbmFtZSAqLwotSk1FU1NBR0UoSkVSUl9BUklUSF9OT1RJTVBMLAotCSAiU29ycnksIHRoZXJlIGFyZSBsZWdhbCByZXN0cmljdGlvbnMgb24gYXJpdGhtZXRpYyBjb2RpbmciKQotSk1FU1NBR0UoSkVSUl9CQURfQUxJR05fVFlQRSwgIkFMSUdOX1RZUEUgaXMgd3JvbmcsIHBsZWFzZSBmaXgiKQotSk1FU1NBR0UoSkVSUl9CQURfQUxMT0NfQ0hVTkssICJNQVhfQUxMT0NfQ0hVTksgaXMgd3JvbmcsIHBsZWFzZSBmaXgiKQotSk1FU1NBR0UoSkVSUl9CQURfQlVGRkVSX01PREUsICJCb2d1cyBidWZmZXIgY29udHJvbCBtb2RlIikKLUpNRVNTQUdFKEpFUlJfQkFEX0NPTVBPTkVOVF9JRCwgIkludmFsaWQgY29tcG9uZW50IElEICVkIGluIFNPUyIpCi1KTUVTU0FHRShKRVJSX0JBRF9EQ1RfQ09FRiwgIkRDVCBjb2VmZmljaWVudCBvdXQgb2YgcmFuZ2UiKQotSk1FU1NBR0UoSkVSUl9CQURfRENUU0laRSwgIklEQ1Qgb3V0cHV0IGJsb2NrIHNpemUgJWQgbm90IHN1cHBvcnRlZCIpCi1KTUVTU0FHRShKRVJSX0JBRF9IVUZGX1RBQkxFLCAiQm9ndXMgSHVmZm1hbiB0YWJsZSBkZWZpbml0aW9uIikKLUpNRVNTQUdFKEpFUlJfQkFEX0lOX0NPTE9SU1BBQ0UsICJCb2d1cyBpbnB1dCBjb2xvcnNwYWNlIikKLUpNRVNTQUdFKEpFUlJfQkFEX0pfQ09MT1JTUEFDRSwgIkJvZ3VzIEpQRUcgY29sb3JzcGFjZSIpCi1KTUVTU0FHRShKRVJSX0JBRF9MRU5HVEgsICJCb2d1cyBtYXJrZXIgbGVuZ3RoIikKLUpNRVNTQUdFKEpFUlJfQkFEX0xJQl9WRVJTSU9OLAotCSAiV3JvbmcgSlBFRyBsaWJyYXJ5IHZlcnNpb246IGxpYnJhcnkgaXMgJWQsIGNhbGxlciBleHBlY3RzICVkIikKLUpNRVNTQUdFKEpFUlJfQkFEX01DVV9TSVpFLCAiU2FtcGxpbmcgZmFjdG9ycyB0b28gbGFyZ2UgZm9yIGludGVybGVhdmVkIHNjYW4iKQotSk1FU1NBR0UoSkVSUl9CQURfUE9PTF9JRCwgIkludmFsaWQgbWVtb3J5IHBvb2wgY29kZSAlZCIpCi1KTUVTU0FHRShKRVJSX0JBRF9QUkVDSVNJT04sICJVbnN1cHBvcnRlZCBKUEVHIGRhdGEgcHJlY2lzaW9uICVkIikKLUpNRVNTQUdFKEpFUlJfQkFEX1BST0dSRVNTSU9OLAotCSAiSW52YWxpZCBwcm9ncmVzc2l2ZSBwYXJhbWV0ZXJzIFNzPSVkIFNlPSVkIEFoPSVkIEFsPSVkIikKLUpNRVNTQUdFKEpFUlJfQkFEX1BST0dfU0NSSVBULAotCSAiSW52YWxpZCBwcm9ncmVzc2l2ZSBwYXJhbWV0ZXJzIGF0IHNjYW4gc2NyaXB0IGVudHJ5ICVkIikKLUpNRVNTQUdFKEpFUlJfQkFEX1NBTVBMSU5HLCAiQm9ndXMgc2FtcGxpbmcgZmFjdG9ycyIpCi1KTUVTU0FHRShKRVJSX0JBRF9TQ0FOX1NDUklQVCwgIkludmFsaWQgc2NhbiBzY3JpcHQgYXQgZW50cnkgJWQiKQotSk1FU1NBR0UoSkVSUl9CQURfU1RBVEUsICJJbXByb3BlciBjYWxsIHRvIEpQRUcgbGlicmFyeSBpbiBzdGF0ZSAlZCIpCi1KTUVTU0FHRShKRVJSX0JBRF9TVFJVQ1RfU0laRSwKLQkgIkpQRUcgcGFyYW1ldGVyIHN0cnVjdCBtaXNtYXRjaDogbGlicmFyeSB0aGlua3Mgc2l6ZSBpcyAldSwgY2FsbGVyIGV4cGVjdHMgJXUiKQotSk1FU1NBR0UoSkVSUl9CQURfVklSVFVBTF9BQ0NFU1MsICJCb2d1cyB2aXJ0dWFsIGFycmF5IGFjY2VzcyIpCi1KTUVTU0FHRShKRVJSX0JVRkZFUl9TSVpFLCAiQnVmZmVyIHBhc3NlZCB0byBKUEVHIGxpYnJhcnkgaXMgdG9vIHNtYWxsIikKLUpNRVNTQUdFKEpFUlJfQ0FOVF9TVVNQRU5ELCAiU3VzcGVuc2lvbiBub3QgYWxsb3dlZCBoZXJlIikKLUpNRVNTQUdFKEpFUlJfQ0NJUjYwMV9OT1RJTVBMLCAiQ0NJUjYwMSBzYW1wbGluZyBub3QgaW1wbGVtZW50ZWQgeWV0IikKLUpNRVNTQUdFKEpFUlJfQ09NUE9ORU5UX0NPVU5ULCAiVG9vIG1hbnkgY29sb3IgY29tcG9uZW50czogJWQsIG1heCAlZCIpCi1KTUVTU0FHRShKRVJSX0NPTlZFUlNJT05fTk9USU1QTCwgIlVuc3VwcG9ydGVkIGNvbG9yIGNvbnZlcnNpb24gcmVxdWVzdCIpCi1KTUVTU0FHRShKRVJSX0RBQ19JTkRFWCwgIkJvZ3VzIERBQyBpbmRleCAlZCIpCi1KTUVTU0FHRShKRVJSX0RBQ19WQUxVRSwgIkJvZ3VzIERBQyB2YWx1ZSAweCV4IikKLUpNRVNTQUdFKEpFUlJfREhUX0lOREVYLCAiQm9ndXMgREhUIGluZGV4ICVkIikKLUpNRVNTQUdFKEpFUlJfRFFUX0lOREVYLCAiQm9ndXMgRFFUIGluZGV4ICVkIikKLUpNRVNTQUdFKEpFUlJfRU1QVFlfSU1BR0UsICJFbXB0eSBKUEVHIGltYWdlIChETkwgbm90IHN1cHBvcnRlZCkiKQotSk1FU1NBR0UoSkVSUl9FTVNfUkVBRCwgIlJlYWQgZnJvbSBFTVMgZmFpbGVkIikKLUpNRVNTQUdFKEpFUlJfRU1TX1dSSVRFLCAiV3JpdGUgdG8gRU1TIGZhaWxlZCIpCi1KTUVTU0FHRShKRVJSX0VPSV9FWFBFQ1RFRCwgIkRpZG4ndCBleHBlY3QgbW9yZSB0aGFuIG9uZSBzY2FuIikKLUpNRVNTQUdFKEpFUlJfRklMRV9SRUFELCAiSW5wdXQgZmlsZSByZWFkIGVycm9yIikKLUpNRVNTQUdFKEpFUlJfRklMRV9XUklURSwgIk91dHB1dCBmaWxlIHdyaXRlIGVycm9yIC0tLSBvdXQgb2YgZGlzayBzcGFjZT8iKQotSk1FU1NBR0UoSkVSUl9GUkFDVF9TQU1QTEVfTk9USU1QTCwgIkZyYWN0aW9uYWwgc2FtcGxpbmcgbm90IGltcGxlbWVudGVkIHlldCIpCi1KTUVTU0FHRShKRVJSX0hVRkZfQ0xFTl9PVkVSRkxPVywgIkh1ZmZtYW4gY29kZSBzaXplIHRhYmxlIG92ZXJmbG93IikKLUpNRVNTQUdFKEpFUlJfSFVGRl9NSVNTSU5HX0NPREUsICJNaXNzaW5nIEh1ZmZtYW4gY29kZSB0YWJsZSBlbnRyeSIpCi1KTUVTU0FHRShKRVJSX0lNQUdFX1RPT19CSUcsICJNYXhpbXVtIHN1cHBvcnRlZCBpbWFnZSBkaW1lbnNpb24gaXMgJXUgcGl4ZWxzIikKLUpNRVNTQUdFKEpFUlJfSU5QVVRfRU1QVFksICJFbXB0eSBpbnB1dCBmaWxlIikKLUpNRVNTQUdFKEpFUlJfSU5QVVRfRU9GLCAiUHJlbWF0dXJlIGVuZCBvZiBpbnB1dCBmaWxlIikKLUpNRVNTQUdFKEpFUlJfTUlTTUFUQ0hFRF9RVUFOVF9UQUJMRSwKLQkgIkNhbm5vdCB0cmFuc2NvZGUgZHVlIHRvIG11bHRpcGxlIHVzZSBvZiBxdWFudGl6YXRpb24gdGFibGUgJWQiKQotSk1FU1NBR0UoSkVSUl9NSVNTSU5HX0RBVEEsICJTY2FuIHNjcmlwdCBkb2VzIG5vdCB0cmFuc21pdCBhbGwgZGF0YSIpCi1KTUVTU0FHRShKRVJSX01PREVfQ0hBTkdFLCAiSW52YWxpZCBjb2xvciBxdWFudGl6YXRpb24gbW9kZSBjaGFuZ2UiKQotSk1FU1NBR0UoSkVSUl9OT1RJTVBMLCAiTm90IGltcGxlbWVudGVkIHlldCIpCi1KTUVTU0FHRShKRVJSX05PVF9DT01QSUxFRCwgIlJlcXVlc3RlZCBmZWF0dXJlIHdhcyBvbWl0dGVkIGF0IGNvbXBpbGUgdGltZSIpCi1KTUVTU0FHRShKRVJSX05PX0JBQ0tJTkdfU1RPUkUsICJCYWNraW5nIHN0b3JlIG5vdCBzdXBwb3J0ZWQiKQotSk1FU1NBR0UoSkVSUl9OT19IVUZGX1RBQkxFLCAiSHVmZm1hbiB0YWJsZSAweCUwMnggd2FzIG5vdCBkZWZpbmVkIikKLUpNRVNTQUdFKEpFUlJfTk9fSU1BR0UsICJKUEVHIGRhdGFzdHJlYW0gY29udGFpbnMgbm8gaW1hZ2UiKQotSk1FU1NBR0UoSkVSUl9OT19RVUFOVF9UQUJMRSwgIlF1YW50aXphdGlvbiB0YWJsZSAweCUwMnggd2FzIG5vdCBkZWZpbmVkIikKLUpNRVNTQUdFKEpFUlJfTk9fU09JLCAiTm90IGEgSlBFRyBmaWxlOiBzdGFydHMgd2l0aCAweCUwMnggMHglMDJ4IikKLUpNRVNTQUdFKEpFUlJfT1VUX09GX01FTU9SWSwgIkluc3VmZmljaWVudCBtZW1vcnkgKGNhc2UgJWQpIikKLUpNRVNTQUdFKEpFUlJfUVVBTlRfQ09NUE9ORU5UUywKLQkgIkNhbm5vdCBxdWFudGl6ZSBtb3JlIHRoYW4gJWQgY29sb3IgY29tcG9uZW50cyIpCi1KTUVTU0FHRShKRVJSX1FVQU5UX0ZFV19DT0xPUlMsICJDYW5ub3QgcXVhbnRpemUgdG8gZmV3ZXIgdGhhbiAlZCBjb2xvcnMiKQotSk1FU1NBR0UoSkVSUl9RVUFOVF9NQU5ZX0NPTE9SUywgIkNhbm5vdCBxdWFudGl6ZSB0byBtb3JlIHRoYW4gJWQgY29sb3JzIikKLUpNRVNTQUdFKEpFUlJfU09GX0RVUExJQ0FURSwgIkludmFsaWQgSlBFRyBmaWxlIHN0cnVjdHVyZTogdHdvIFNPRiBtYXJrZXJzIikKLUpNRVNTQUdFKEpFUlJfU09GX05PX1NPUywgIkludmFsaWQgSlBFRyBmaWxlIHN0cnVjdHVyZTogbWlzc2luZyBTT1MgbWFya2VyIikKLUpNRVNTQUdFKEpFUlJfU09GX1VOU1VQUE9SVEVELCAiVW5zdXBwb3J0ZWQgSlBFRyBwcm9jZXNzOiBTT0YgdHlwZSAweCUwMngiKQotSk1FU1NBR0UoSkVSUl9TT0lfRFVQTElDQVRFLCAiSW52YWxpZCBKUEVHIGZpbGUgc3RydWN0dXJlOiB0d28gU09JIG1hcmtlcnMiKQotSk1FU1NBR0UoSkVSUl9TT1NfTk9fU09GLCAiSW52YWxpZCBKUEVHIGZpbGUgc3RydWN0dXJlOiBTT1MgYmVmb3JlIFNPRiIpCi1KTUVTU0FHRShKRVJSX1RGSUxFX0NSRUFURSwgIkZhaWxlZCB0byBjcmVhdGUgdGVtcG9yYXJ5IGZpbGUgJXMiKQotSk1FU1NBR0UoSkVSUl9URklMRV9SRUFELCAiUmVhZCBmYWlsZWQgb24gdGVtcG9yYXJ5IGZpbGUiKQotSk1FU1NBR0UoSkVSUl9URklMRV9TRUVLLCAiU2VlayBmYWlsZWQgb24gdGVtcG9yYXJ5IGZpbGUiKQotSk1FU1NBR0UoSkVSUl9URklMRV9XUklURSwKLQkgIldyaXRlIGZhaWxlZCBvbiB0ZW1wb3JhcnkgZmlsZSAtLS0gb3V0IG9mIGRpc2sgc3BhY2U/IikKLUpNRVNTQUdFKEpFUlJfVE9PX0xJVFRMRV9EQVRBLCAiQXBwbGljYXRpb24gdHJhbnNmZXJyZWQgdG9vIGZldyBzY2FubGluZXMiKQotSk1FU1NBR0UoSkVSUl9VTktOT1dOX01BUktFUiwgIlVuc3VwcG9ydGVkIG1hcmtlciB0eXBlIDB4JTAyeCIpCi1KTUVTU0FHRShKRVJSX1ZJUlRVQUxfQlVHLCAiVmlydHVhbCBhcnJheSBjb250cm9sbGVyIG1lc3NlZCB1cCIpCi1KTUVTU0FHRShKRVJSX1dJRFRIX09WRVJGTE9XLCAiSW1hZ2UgdG9vIHdpZGUgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24iKQotSk1FU1NBR0UoSkVSUl9YTVNfUkVBRCwgIlJlYWQgZnJvbSBYTVMgZmFpbGVkIikKLUpNRVNTQUdFKEpFUlJfWE1TX1dSSVRFLCAiV3JpdGUgdG8gWE1TIGZhaWxlZCIpCi1KTUVTU0FHRShKTVNHX0NPUFlSSUdIVCwgSkNPUFlSSUdIVCkKLUpNRVNTQUdFKEpNU0dfVkVSU0lPTiwgSlZFUlNJT04pCi1KTUVTU0FHRShKVFJDXzE2QklUX1RBQkxFUywKLQkgIkNhdXRpb246IHF1YW50aXphdGlvbiB0YWJsZXMgYXJlIHRvbyBjb2Fyc2UgZm9yIGJhc2VsaW5lIEpQRUciKQotSk1FU1NBR0UoSlRSQ19BRE9CRSwKLQkgIkFkb2JlIEFQUDE0IG1hcmtlcjogdmVyc2lvbiAlZCwgZmxhZ3MgMHglMDR4IDB4JTA0eCwgdHJhbnNmb3JtICVkIikKLUpNRVNTQUdFKEpUUkNfQVBQMCwgIlVua25vd24gQVBQMCBtYXJrZXIgKG5vdCBKRklGKSwgbGVuZ3RoICV1IikKLUpNRVNTQUdFKEpUUkNfQVBQMTQsICJVbmtub3duIEFQUDE0IG1hcmtlciAobm90IEFkb2JlKSwgbGVuZ3RoICV1IikKLUpNRVNTQUdFKEpUUkNfREFDLCAiRGVmaW5lIEFyaXRobWV0aWMgVGFibGUgMHglMDJ4OiAweCUwMngiKQotSk1FU1NBR0UoSlRSQ19ESFQsICJEZWZpbmUgSHVmZm1hbiBUYWJsZSAweCUwMngiKQotSk1FU1NBR0UoSlRSQ19EUVQsICJEZWZpbmUgUXVhbnRpemF0aW9uIFRhYmxlICVkICBwcmVjaXNpb24gJWQiKQotSk1FU1NBR0UoSlRSQ19EUkksICJEZWZpbmUgUmVzdGFydCBJbnRlcnZhbCAldSIpCi1KTUVTU0FHRShKVFJDX0VNU19DTE9TRSwgIkZyZWVkIEVNUyBoYW5kbGUgJXUiKQotSk1FU1NBR0UoSlRSQ19FTVNfT1BFTiwgIk9idGFpbmVkIEVNUyBoYW5kbGUgJXUiKQotSk1FU1NBR0UoSlRSQ19FT0ksICJFbmQgT2YgSW1hZ2UiKQotSk1FU1NBR0UoSlRSQ19IVUZGQklUUywgIiAgICAgICAgJTNkICUzZCAlM2QgJTNkICUzZCAlM2QgJTNkICUzZCIpCi1KTUVTU0FHRShKVFJDX0pGSUYsICJKRklGIEFQUDAgbWFya2VyOiB2ZXJzaW9uICVkLiUwMmQsIGRlbnNpdHkgJWR4JWQgICVkIikKLUpNRVNTQUdFKEpUUkNfSkZJRl9CQURUSFVNQk5BSUxTSVpFLAotCSAiV2FybmluZzogdGh1bWJuYWlsIGltYWdlIHNpemUgZG9lcyBub3QgbWF0Y2ggZGF0YSBsZW5ndGggJXUiKQotSk1FU1NBR0UoSlRSQ19KRklGX0VYVEVOU0lPTiwKLQkgIkpGSUYgZXh0ZW5zaW9uIG1hcmtlcjogdHlwZSAweCUwMngsIGxlbmd0aCAldSIpCi1KTUVTU0FHRShKVFJDX0pGSUZfVEhVTUJOQUlMLCAiICAgIHdpdGggJWQgeCAlZCB0aHVtYm5haWwgaW1hZ2UiKQotSk1FU1NBR0UoSlRSQ19NSVNDX01BUktFUiwgIk1pc2NlbGxhbmVvdXMgbWFya2VyIDB4JTAyeCwgbGVuZ3RoICV1IikKLUpNRVNTQUdFKEpUUkNfUEFSTUxFU1NfTUFSS0VSLCAiVW5leHBlY3RlZCBtYXJrZXIgMHglMDJ4IikKLUpNRVNTQUdFKEpUUkNfUVVBTlRWQUxTLCAiICAgICAgICAlNHUgJTR1ICU0dSAlNHUgJTR1ICU0dSAlNHUgJTR1IikKLUpNRVNTQUdFKEpUUkNfUVVBTlRfM19OQ09MT1JTLCAiUXVhbnRpemluZyB0byAlZCA9ICVkKiVkKiVkIGNvbG9ycyIpCi1KTUVTU0FHRShKVFJDX1FVQU5UX05DT0xPUlMsICJRdWFudGl6aW5nIHRvICVkIGNvbG9ycyIpCi1KTUVTU0FHRShKVFJDX1FVQU5UX1NFTEVDVEVELCAiU2VsZWN0ZWQgJWQgY29sb3JzIGZvciBxdWFudGl6YXRpb24iKQotSk1FU1NBR0UoSlRSQ19SRUNPVkVSWV9BQ1RJT04sICJBdCBtYXJrZXIgMHglMDJ4LCByZWNvdmVyeSBhY3Rpb24gJWQiKQotSk1FU1NBR0UoSlRSQ19SU1QsICJSU1QlZCIpCi1KTUVTU0FHRShKVFJDX1NNT09USF9OT1RJTVBMLAotCSAiU21vb3RoaW5nIG5vdCBzdXBwb3J0ZWQgd2l0aCBub25zdGFuZGFyZCBzYW1wbGluZyByYXRpb3MiKQotSk1FU1NBR0UoSlRSQ19TT0YsICJTdGFydCBPZiBGcmFtZSAweCUwMng6IHdpZHRoPSV1LCBoZWlnaHQ9JXUsIGNvbXBvbmVudHM9JWQiKQotSk1FU1NBR0UoSlRSQ19TT0ZfQ09NUE9ORU5ULCAiICAgIENvbXBvbmVudCAlZDogJWRoeCVkdiBxPSVkIikKLUpNRVNTQUdFKEpUUkNfU09JLCAiU3RhcnQgb2YgSW1hZ2UiKQotSk1FU1NBR0UoSlRSQ19TT1MsICJTdGFydCBPZiBTY2FuOiAlZCBjb21wb25lbnRzIikKLUpNRVNTQUdFKEpUUkNfU09TX0NPTVBPTkVOVCwgIiAgICBDb21wb25lbnQgJWQ6IGRjPSVkIGFjPSVkIikKLUpNRVNTQUdFKEpUUkNfU09TX1BBUkFNUywgIiAgU3M9JWQsIFNlPSVkLCBBaD0lZCwgQWw9JWQiKQotSk1FU1NBR0UoSlRSQ19URklMRV9DTE9TRSwgIkNsb3NlZCB0ZW1wb3JhcnkgZmlsZSAlcyIpCi1KTUVTU0FHRShKVFJDX1RGSUxFX09QRU4sICJPcGVuZWQgdGVtcG9yYXJ5IGZpbGUgJXMiKQotSk1FU1NBR0UoSlRSQ19USFVNQl9KUEVHLAotCSAiSkZJRiBleHRlbnNpb24gbWFya2VyOiBKUEVHLWNvbXByZXNzZWQgdGh1bWJuYWlsIGltYWdlLCBsZW5ndGggJXUiKQotSk1FU1NBR0UoSlRSQ19USFVNQl9QQUxFVFRFLAotCSAiSkZJRiBleHRlbnNpb24gbWFya2VyOiBwYWxldHRlIHRodW1ibmFpbCBpbWFnZSwgbGVuZ3RoICV1IikKLUpNRVNTQUdFKEpUUkNfVEhVTUJfUkdCLAotCSAiSkZJRiBleHRlbnNpb24gbWFya2VyOiBSR0IgdGh1bWJuYWlsIGltYWdlLCBsZW5ndGggJXUiKQotSk1FU1NBR0UoSlRSQ19VTktOT1dOX0lEUywKLQkgIlVucmVjb2duaXplZCBjb21wb25lbnQgSURzICVkICVkICVkLCBhc3N1bWluZyBZQ2JDciIpCi1KTUVTU0FHRShKVFJDX1hNU19DTE9TRSwgIkZyZWVkIFhNUyBoYW5kbGUgJXUiKQotSk1FU1NBR0UoSlRSQ19YTVNfT1BFTiwgIk9idGFpbmVkIFhNUyBoYW5kbGUgJXUiKQotSk1FU1NBR0UoSldSTl9BRE9CRV9YRk9STSwgIlVua25vd24gQWRvYmUgY29sb3IgdHJhbnNmb3JtIGNvZGUgJWQiKQotSk1FU1NBR0UoSldSTl9CT0dVU19QUk9HUkVTU0lPTiwKLQkgIkluY29uc2lzdGVudCBwcm9ncmVzc2lvbiBzZXF1ZW5jZSBmb3IgY29tcG9uZW50ICVkIGNvZWZmaWNpZW50ICVkIikKLUpNRVNTQUdFKEpXUk5fRVhUUkFORU9VU19EQVRBLAotCSAiQ29ycnVwdCBKUEVHIGRhdGE6ICV1IGV4dHJhbmVvdXMgYnl0ZXMgYmVmb3JlIG1hcmtlciAweCUwMngiKQotSk1FU1NBR0UoSldSTl9ISVRfTUFSS0VSLCAiQ29ycnVwdCBKUEVHIGRhdGE6IHByZW1hdHVyZSBlbmQgb2YgZGF0YSBzZWdtZW50IikKLUpNRVNTQUdFKEpXUk5fSFVGRl9CQURfQ09ERSwgIkNvcnJ1cHQgSlBFRyBkYXRhOiBiYWQgSHVmZm1hbiBjb2RlIikKLUpNRVNTQUdFKEpXUk5fSkZJRl9NQUpPUiwgIldhcm5pbmc6IHVua25vd24gSkZJRiByZXZpc2lvbiBudW1iZXIgJWQuJTAyZCIpCi1KTUVTU0FHRShKV1JOX0pQRUdfRU9GLCAiUHJlbWF0dXJlIGVuZCBvZiBKUEVHIGZpbGUiKQotSk1FU1NBR0UoSldSTl9NVVNUX1JFU1lOQywKLQkgIkNvcnJ1cHQgSlBFRyBkYXRhOiBmb3VuZCBtYXJrZXIgMHglMDJ4IGluc3RlYWQgb2YgUlNUJWQiKQotSk1FU1NBR0UoSldSTl9OT1RfU0VRVUVOVElBTCwgIkludmFsaWQgU09TIHBhcmFtZXRlcnMgZm9yIHNlcXVlbnRpYWwgSlBFRyIpCi1KTUVTU0FHRShKV1JOX1RPT19NVUNIX0RBVEEsICJBcHBsaWNhdGlvbiB0cmFuc2ZlcnJlZCB0b28gbWFueSBzY2FubGluZXMiKQotCi0jaWZkZWYgSk1BS0VfRU5VTV9MSVNUCi0KLSAgSk1TR19MQVNUTVNHQ09ERQotfSBKX01FU1NBR0VfQ09ERTsKLQotI3VuZGVmIEpNQUtFX0VOVU1fTElTVAotI2VuZGlmIC8qIEpNQUtFX0VOVU1fTElTVCAqLwotCi0vKiBaYXAgSk1FU1NBR0UgbWFjcm8gc28gdGhhdCBmdXR1cmUgcmUtaW5jbHVzaW9ucyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQgKi8KLSN1bmRlZiBKTUVTU0FHRQotCi0KLSNpZm5kZWYgSkVSUk9SX0gKLSNkZWZpbmUgSkVSUk9SX0gKLQotLyogTWFjcm9zIHRvIHNpbXBsaWZ5IHVzaW5nIHRoZSBlcnJvciBhbmQgdHJhY2UgbWVzc2FnZSBzdHVmZiAqLwotLyogVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBlaXRoZXIgdHlwZSBvZiBjaW5mbyBwb2ludGVyICovCi0KLS8qIEZhdGFsIGVycm9ycyAocHJpbnQgbWVzc2FnZSBhbmQgZXhpdCkgKi8KLSNkZWZpbmUgRVJSRVhJVChjaW5mbyxjb2RlKSAgXAotICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAotICAgKCooY2luZm8pLT5lcnItPmVycm9yX2V4aXQpICgoal9jb21tb25fcHRyKSAoY2luZm8pKSkKLSNkZWZpbmUgRVJSRVhJVDEoY2luZm8sY29kZSxwMSkgIFwKLSAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKLSAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVswXSA9IChwMSksIFwKLSAgICgqKGNpbmZvKS0+ZXJyLT5lcnJvcl9leGl0KSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSkpCi0jZGVmaW5lIEVSUkVYSVQyKGNpbmZvLGNvZGUscDEscDIpICBcCi0gICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCi0gICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCi0gICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMV0gPSAocDIpLCBcCi0gICAoKihjaW5mbyktPmVyci0+ZXJyb3JfZXhpdCkgKChqX2NvbW1vbl9wdHIpIChjaW5mbykpKQotI2RlZmluZSBFUlJFWElUMyhjaW5mbyxjb2RlLHAxLHAyLHAzKSAgXAotICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAotICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzBdID0gKHAxKSwgXAotICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzFdID0gKHAyKSwgXAotICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzJdID0gKHAzKSwgXAotICAgKCooY2luZm8pLT5lcnItPmVycm9yX2V4aXQpICgoal9jb21tb25fcHRyKSAoY2luZm8pKSkKLSNkZWZpbmUgRVJSRVhJVDQoY2luZm8sY29kZSxwMSxwMixwMyxwNCkgIFwKLSAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKLSAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVswXSA9IChwMSksIFwKLSAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVsxXSA9IChwMiksIFwKLSAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVsyXSA9IChwMyksIFwKLSAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVszXSA9IChwNCksIFwKLSAgICgqKGNpbmZvKS0+ZXJyLT5lcnJvcl9leGl0KSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSkpCi0jZGVmaW5lIEVSUkVYSVRTKGNpbmZvLGNvZGUsc3RyKSAgXAotICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAotICAgRlhTWVNfc3RybmNweSgoY2luZm8pLT5lcnItPm1zZ19wYXJtLnMsIChzdHIpLCBKTVNHX1NUUl9QQVJNX01BWCksIFwKLSAgICgqKGNpbmZvKS0+ZXJyLT5lcnJvcl9leGl0KSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSkpCi0KLSNkZWZpbmUgTUFLRVNUTVQoc3R1ZmYpCQlkbyB7IHN0dWZmIH0gd2hpbGUgKDApCi0KLS8qIE5vbmZhdGFsIGVycm9ycyAod2UgY2FuIGtlZXAgZ29pbmcsIGJ1dCB0aGUgZGF0YSBpcyBwcm9iYWJseSBjb3JydXB0KSAqLwotI2RlZmluZSBXQVJOTVMoY2luZm8sY29kZSkgIFwKLSAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKLSAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAtMSkpCi0jZGVmaW5lIFdBUk5NUzEoY2luZm8sY29kZSxwMSkgIFwKLSAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKLSAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVswXSA9IChwMSksIFwKLSAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAtMSkpCi0jZGVmaW5lIFdBUk5NUzIoY2luZm8sY29kZSxwMSxwMikgIFwKLSAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKLSAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVswXSA9IChwMSksIFwKLSAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVsxXSA9IChwMiksIFwKLSAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAtMSkpCi0KLS8qIEluZm9ybWF0aW9uYWwvZGVidWdnaW5nIG1lc3NhZ2VzICovCi0jZGVmaW5lIFRSQUNFTVMoY2luZm8sbHZsLGNvZGUpICBcCi0gICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCi0gICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgKGx2bCkpKQotI2RlZmluZSBUUkFDRU1TMShjaW5mbyxsdmwsY29kZSxwMSkgIFwKLSAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKLSAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVswXSA9IChwMSksIFwKLSAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAobHZsKSkpCi0jZGVmaW5lIFRSQUNFTVMyKGNpbmZvLGx2bCxjb2RlLHAxLHAyKSAgXAotICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAotICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzBdID0gKHAxKSwgXAotICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzFdID0gKHAyKSwgXAotICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKSkKLSNkZWZpbmUgVFJBQ0VNUzMoY2luZm8sbHZsLGNvZGUscDEscDIscDMpICBcCi0gIE1BS0VTVE1UKGludCAqIF9tcCA9IChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaTsgXAotCSAgIF9tcFswXSA9IChwMSk7IF9tcFsxXSA9IChwMik7IF9tcFsyXSA9IChwMyk7IFwKLQkgICAoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpOyBcCi0JICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKTsgKQotI2RlZmluZSBUUkFDRU1TNChjaW5mbyxsdmwsY29kZSxwMSxwMixwMyxwNCkgIFwKLSAgTUFLRVNUTVQoaW50ICogX21wID0gKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pOyBcCi0JICAgX21wWzBdID0gKHAxKTsgX21wWzFdID0gKHAyKTsgX21wWzJdID0gKHAzKTsgX21wWzNdID0gKHA0KTsgXAotCSAgIChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSk7IFwKLQkgICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgKGx2bCkpOyApCi0jZGVmaW5lIFRSQUNFTVM1KGNpbmZvLGx2bCxjb2RlLHAxLHAyLHAzLHA0LHA1KSAgXAotICBNQUtFU1RNVChpbnQgKiBfbXAgPSAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmk7IFwKLQkgICBfbXBbMF0gPSAocDEpOyBfbXBbMV0gPSAocDIpOyBfbXBbMl0gPSAocDMpOyBfbXBbM10gPSAocDQpOyBcCi0JICAgX21wWzRdID0gKHA1KTsgXAotCSAgIChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSk7IFwKLQkgICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgKGx2bCkpOyApCi0jZGVmaW5lIFRSQUNFTVM4KGNpbmZvLGx2bCxjb2RlLHAxLHAyLHAzLHA0LHA1LHA2LHA3LHA4KSAgXAotICBNQUtFU1RNVChpbnQgKiBfbXAgPSAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmk7IFwKLQkgICBfbXBbMF0gPSAocDEpOyBfbXBbMV0gPSAocDIpOyBfbXBbMl0gPSAocDMpOyBfbXBbM10gPSAocDQpOyBcCi0JICAgX21wWzRdID0gKHA1KTsgX21wWzVdID0gKHA2KTsgX21wWzZdID0gKHA3KTsgX21wWzddID0gKHA4KTsgXAotCSAgIChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSk7IFwKLQkgICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgKGx2bCkpOyApCi0jZGVmaW5lIFRSQUNFTVNTKGNpbmZvLGx2bCxjb2RlLHN0cikgIFwKLSAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKLSAgIEZYU1lTX3N0cm5jcHkoKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5zLCAoc3RyKSwgSk1TR19TVFJfUEFSTV9NQVgpLCBcCi0gICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgKGx2bCkpKQotCi0jZW5kaWYgLyogSkVSUk9SX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS90aGlyZHBhcnRpZXMvbGlianBlZy9qbW9yZWNmZy5oIGIvY29yZS9pbmNsdWRlL3RoaXJkcGFydGllcy9saWJqcGVnL2ptb3JlY2ZnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZDIxMDkuLjAwMDAwMDAKLS0tIGEvY29yZS9pbmNsdWRlL3RoaXJkcGFydGllcy9saWJqcGVnL2ptb3JlY2ZnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNzYgKzAsMCBAQAotLyoKLSAqIGptb3JlY2ZnLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGN1c3RvbWl6ZSB0aGUKLSAqIEpQRUcgc29mdHdhcmUgZm9yIHNwZWNpYWwgYXBwbGljYXRpb25zIG9yIHN1cHBvcnQgbWFjaGluZS1kZXBlbmRlbnQKLSAqIG9wdGltaXphdGlvbnMuICBNb3N0IHVzZXJzIHdpbGwgbm90IG5lZWQgdG8gdG91Y2ggdGhpcyBmaWxlLgotICovCi0KLSNpZmRlZiBfTVNDX1ZFUgotI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDE0MikKLSNlbmRpZgotCi0vKgotICogRGVmaW5lIEJJVFNfSU5fSlNBTVBMRSBhcyBlaXRoZXIKLSAqICAgOCAgIGZvciA4LWJpdCBzYW1wbGUgdmFsdWVzICh0aGUgdXN1YWwgc2V0dGluZykKLSAqICAgMTIgIGZvciAxMi1iaXQgc2FtcGxlIHZhbHVlcwotICogT25seSA4IGFuZCAxMiBhcmUgbGVnYWwgZGF0YSBwcmVjaXNpb25zIGZvciBsb3NzeSBKUEVHIGFjY29yZGluZyB0byB0aGUKLSAqIEpQRUcgc3RhbmRhcmQsIGFuZCB0aGUgSUpHIGNvZGUgZG9lcyBub3Qgc3VwcG9ydCBhbnl0aGluZyBlbHNlIQotICogV2UgZG8gbm90IHN1cHBvcnQgcnVuLXRpbWUgc2VsZWN0aW9uIG9mIGRhdGEgcHJlY2lzaW9uLCBzb3JyeS4KLSAqLwotCi0jZGVmaW5lIEJJVFNfSU5fSlNBTVBMRSAgOAkvKiB1c2UgOCBvciAxMiAqLwotCi0KLS8qCi0gKiBNYXhpbXVtIG51bWJlciBvZiBjb21wb25lbnRzIChjb2xvciBjaGFubmVscykgYWxsb3dlZCBpbiBKUEVHIGltYWdlLgotICogVG8gbWVldCB0aGUgbGV0dGVyIG9mIHRoZSBKUEVHIHNwZWMsIHNldCB0aGlzIHRvIDI1NS4gIEhvd2V2ZXIsIGRhcm4KLSAqIGZldyBhcHBsaWNhdGlvbnMgbmVlZCBtb3JlIHRoYW4gNCBjaGFubmVscyAobWF5YmUgNSBmb3IgQ01ZSyArIGFscGhhCi0gKiBtYXNrKS4gIFdlIHJlY29tbWVuZCAxMCBhcyBhIHJlYXNvbmFibGUgY29tcHJvbWlzZTsgdXNlIDQgaWYgeW91IGFyZQotICogcmVhbGx5IHNob3J0IG9uIG1lbW9yeS4gIChFYWNoIGFsbG93ZWQgY29tcG9uZW50IGNvc3RzIGEgaHVuZHJlZCBvciBzbwotICogYnl0ZXMgb2Ygc3RvcmFnZSwgd2hldGhlciBhY3R1YWxseSB1c2VkIGluIGFuIGltYWdlIG9yIG5vdC4pCi0gKi8KLQotI2RlZmluZSBNQVhfQ09NUE9ORU5UUyAgMTAJLyogbWF4aW11bSBudW1iZXIgb2YgaW1hZ2UgY29tcG9uZW50cyAqLwotCi0KLS8qCi0gKiBCYXNpYyBkYXRhIHR5cGVzLgotICogWW91IG1heSBuZWVkIHRvIGNoYW5nZSB0aGVzZSBpZiB5b3UgaGF2ZSBhIG1hY2hpbmUgd2l0aCB1bnVzdWFsIGRhdGEKLSAqIHR5cGUgc2l6ZXM7IGZvciBleGFtcGxlLCAiY2hhciIgbm90IDggYml0cywgInNob3J0IiBub3QgMTYgYml0cywKLSAqIG9yICJsb25nIiBub3QgMzIgYml0cy4gIFdlIGRvbid0IGNhcmUgd2hldGhlciAiaW50IiBpcyAxNiBvciAzMiBiaXRzLAotICogYnV0IGl0IGhhZCBiZXR0ZXIgYmUgYXQgbGVhc3QgMTYuCi0gKi8KLQotLyogUmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgc2FtcGxlIChwaXhlbCBlbGVtZW50IHZhbHVlKS4KLSAqIFdlIGZyZXF1ZW50bHkgYWxsb2NhdGUgbGFyZ2UgYXJyYXlzIG9mIHRoZXNlLCBzbyBpdCdzIGltcG9ydGFudCB0byBrZWVwCi0gKiB0aGVtIHNtYWxsLiAgQnV0IGlmIHlvdSBoYXZlIG1lbW9yeSB0byBidXJuIGFuZCBhY2Nlc3MgdG8gY2hhciBvciBzaG9ydAotICogYXJyYXlzIGlzIHZlcnkgc2xvdyBvbiB5b3VyIGhhcmR3YXJlLCB5b3UgbWlnaHQgd2FudCB0byBjaGFuZ2UgdGhlc2UuCi0gKi8KLQotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci0vKiBKU0FNUExFIHNob3VsZCBiZSB0aGUgc21hbGxlc3QgdHlwZSB0aGF0IHdpbGwgaG9sZCB0aGUgdmFsdWVzIDAuLjI1NS4KLSAqIFlvdSBjYW4gdXNlIGEgc2lnbmVkIGNoYXIgYnkgaGF2aW5nIEdFVEpTQU1QTEUgbWFzayBpdCB3aXRoIDB4RkYuCi0gKi8KLQotI2lmZGVmIEhBVkVfVU5TSUdORURfQ0hBUgotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgSlNBTVBMRTsKLSNkZWZpbmUgR0VUSlNBTVBMRSh2YWx1ZSkgICgoaW50KSAodmFsdWUpKQotCi0jZWxzZSAvKiBub3QgSEFWRV9VTlNJR05FRF9DSEFSICovCi0KLXR5cGVkZWYgY2hhciBKU0FNUExFOwotI2lmZGVmIENIQVJfSVNfVU5TSUdORUQKLSNkZWZpbmUgR0VUSlNBTVBMRSh2YWx1ZSkgICgoaW50KSAodmFsdWUpKQotI2Vsc2UKLSNkZWZpbmUgR0VUSlNBTVBMRSh2YWx1ZSkgICgoaW50KSAodmFsdWUpICYgMHhGRikKLSNlbmRpZiAvKiBDSEFSX0lTX1VOU0lHTkVEICovCi0KLSNlbmRpZiAvKiBIQVZFX1VOU0lHTkVEX0NIQVIgKi8KLQotI2RlZmluZSBNQVhKU0FNUExFCTI1NQotI2RlZmluZSBDRU5URVJKU0FNUExFCTEyOAotCi0jZW5kaWYgLyogQklUU19JTl9KU0FNUExFID09IDggKi8KLQotCi0jaWYgQklUU19JTl9KU0FNUExFID09IDEyCi0vKiBKU0FNUExFIHNob3VsZCBiZSB0aGUgc21hbGxlc3QgdHlwZSB0aGF0IHdpbGwgaG9sZCB0aGUgdmFsdWVzIDAuLjQwOTUuCi0gKiBPbiBuZWFybHkgYWxsIG1hY2hpbmVzICJzaG9ydCIgd2lsbCBkbyBuaWNlbHkuCi0gKi8KLQotdHlwZWRlZiBzaG9ydCBKU0FNUExFOwotI2RlZmluZSBHRVRKU0FNUExFKHZhbHVlKSAgKChpbnQpICh2YWx1ZSkpCi0KLSNkZWZpbmUgTUFYSlNBTVBMRQk0MDk1Ci0jZGVmaW5lIENFTlRFUkpTQU1QTEUJMjA0OAotCi0jZW5kaWYgLyogQklUU19JTl9KU0FNUExFID09IDEyICovCi0KLQotLyogUmVwcmVzZW50YXRpb24gb2YgYSBEQ1QgZnJlcXVlbmN5IGNvZWZmaWNpZW50LgotICogVGhpcyBzaG91bGQgYmUgYSBzaWduZWQgdmFsdWUgb2YgYXQgbGVhc3QgMTYgYml0czsgInNob3J0IiBpcyB1c3VhbGx5IE9LLgotICogQWdhaW4sIHdlIGFsbG9jYXRlIGxhcmdlIGFycmF5cyBvZiB0aGVzZSwgYnV0IHlvdSBjYW4gY2hhbmdlIHRvIGludAotICogaWYgeW91IGhhdmUgbWVtb3J5IHRvIGJ1cm4gYW5kICJzaG9ydCIgaXMgcmVhbGx5IHNsb3cuCi0gKi8KLQotdHlwZWRlZiBzaG9ydCBKQ09FRjsKLQotCi0vKiBDb21wcmVzc2VkIGRhdGFzdHJlYW1zIGFyZSByZXByZXNlbnRlZCBhcyBhcnJheXMgb2YgSk9DVEVULgotICogVGhlc2UgbXVzdCBiZSBFWEFDVExZIDggYml0cyB3aWRlLCBhdCBsZWFzdCBvbmNlIHRoZXkgYXJlIHdyaXR0ZW4gdG8KLSAqIGV4dGVybmFsIHN0b3JhZ2UuICBOb3RlIHRoYXQgd2hlbiB1c2luZyB0aGUgc3RkaW8gZGF0YSBzb3VyY2UvZGVzdGluYXRpb24KLSAqIG1hbmFnZXJzLCB0aGlzIGlzIGFsc28gdGhlIGRhdGEgdHlwZSBwYXNzZWQgdG8gZnJlYWQvZndyaXRlLgotICovCi0KLSNpZmRlZiBIQVZFX1VOU0lHTkVEX0NIQVIKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIEpPQ1RFVDsKLSNkZWZpbmUgR0VUSk9DVEVUKHZhbHVlKSAgKHZhbHVlKQotCi0jZWxzZSAvKiBub3QgSEFWRV9VTlNJR05FRF9DSEFSICovCi0KLXR5cGVkZWYgY2hhciBKT0NURVQ7Ci0jaWZkZWYgQ0hBUl9JU19VTlNJR05FRAotI2RlZmluZSBHRVRKT0NURVQodmFsdWUpICAodmFsdWUpCi0jZWxzZQotI2RlZmluZSBHRVRKT0NURVQodmFsdWUpICAoKHZhbHVlKSAmIDB4RkYpCi0jZW5kaWYgLyogQ0hBUl9JU19VTlNJR05FRCAqLwotCi0jZW5kaWYgLyogSEFWRV9VTlNJR05FRF9DSEFSICovCi0KLQotLyogVGhlc2UgdHlwZWRlZnMgYXJlIHVzZWQgZm9yIHZhcmlvdXMgdGFibGUgZW50cmllcyBhbmQgc28gZm9ydGguCi0gKiBUaGV5IG11c3QgYmUgYXQgbGVhc3QgYXMgd2lkZSBhcyBzcGVjaWZpZWQ7IGJ1dCBtYWtpbmcgdGhlbSB0b28gYmlnCi0gKiB3b24ndCBjb3N0IGEgaHVnZSBhbW91bnQgb2YgbWVtb3J5LCBzbyB3ZSBkb24ndCBwcm92aWRlIHNwZWNpYWwKLSAqIGV4dHJhY3Rpb24gY29kZSBsaWtlIHdlIGRpZCBmb3IgSlNBTVBMRS4gIChJbiBvdGhlciB3b3JkcywgdGhlc2UKLSAqIHR5cGVkZWZzIGxpdmUgYXQgYSBkaWZmZXJlbnQgcG9pbnQgb24gdGhlIHNwZWVkL3NwYWNlIHRyYWRlb2ZmIGN1cnZlLikKLSAqLwotCi0jaWYgX0ZYX09TXyAhPSBfRlhfVlhXT1JLU18KLQotLyogVUlOVDggbXVzdCBob2xkIGF0IGxlYXN0IHRoZSB2YWx1ZXMgMC4uMjU1LiAqLwotCi0jaWZkZWYgSEFWRV9VTlNJR05FRF9DSEFSCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgVUlOVDg7Ci0jZWxzZSAvKiBub3QgSEFWRV9VTlNJR05FRF9DSEFSICovCi0jaWZkZWYgQ0hBUl9JU19VTlNJR05FRAotdHlwZWRlZiBjaGFyIFVJTlQ4OwotI2Vsc2UgLyogbm90IENIQVJfSVNfVU5TSUdORUQgKi8KLXR5cGVkZWYgc2hvcnQgVUlOVDg7Ci0jZW5kaWYgLyogQ0hBUl9JU19VTlNJR05FRCAqLwotI2VuZGlmIC8qIEhBVkVfVU5TSUdORURfQ0hBUiAqLwotCi0KLS8qIFVJTlQxNiBtdXN0IGhvbGQgYXQgbGVhc3QgdGhlIHZhbHVlcyAwLi42NTUzNS4gKi8KLQotI2lmZGVmIEhBVkVfVU5TSUdORURfU0hPUlQKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgVUlOVDE2OwotI2Vsc2UgLyogbm90IEhBVkVfVU5TSUdORURfU0hPUlQgKi8KLXR5cGVkZWYgdW5zaWduZWQgaW50IFVJTlQxNjsKLSNlbmRpZiAvKiBIQVZFX1VOU0lHTkVEX1NIT1JUICovCi0KLS8qIElOVDE2IG11c3QgaG9sZCBhdCBsZWFzdCB0aGUgdmFsdWVzIC0zMjc2OC4uMzI3NjcuICovCi0KLSNpZm5kZWYgWE1EX0gJCQkvKiBYMTEveG1kLmggY29ycmVjdGx5IGRlZmluZXMgSU5UMTYgKi8KLXR5cGVkZWYgc2hvcnQgSU5UMTY7Ci0jZW5kaWYKLQotLyogSU5UMzIgbXVzdCBob2xkIGF0IGxlYXN0IHNpZ25lZCAzMi1iaXQgdmFsdWVzLiAqLwotCi0jaWZuZGVmIFhNRF9ICQkJLyogWDExL3htZC5oIGNvcnJlY3RseSBkZWZpbmVzIElOVDMyICovCi10eXBlZGVmIGludCBJTlQzMjsKLSNlbmRpZgotCi0jZW5kaWYgCi0KLS8qIERhdGF0eXBlIHVzZWQgZm9yIGltYWdlIGRpbWVuc2lvbnMuICBUaGUgSlBFRyBzdGFuZGFyZCBvbmx5IHN1cHBvcnRzCi0gKiBpbWFnZXMgdXAgdG8gNjRLKjY0SyBkdWUgdG8gMTYtYml0IGZpZWxkcyBpbiBTT0YgbWFya2Vycy4gIFRoZXJlZm9yZQotICogInVuc2lnbmVkIGludCIgaXMgc3VmZmljaWVudCBvbiBhbGwgbWFjaGluZXMuICBIb3dldmVyLCBpZiB5b3UgbmVlZCB0bwotICogaGFuZGxlIGxhcmdlciBpbWFnZXMgYW5kIHlvdSBkb24ndCBtaW5kIGRldmlhdGluZyBmcm9tIHRoZSBzcGVjLCB5b3UKLSAqIGNhbiBjaGFuZ2UgdGhpcyBkYXRhdHlwZS4KLSAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGludCBKRElNRU5TSU9OOwotCi0jZGVmaW5lIEpQRUdfTUFYX0RJTUVOU0lPTiAgNjU1MDBMICAvKiBhIHRhZCB1bmRlciA2NEsgdG8gcHJldmVudCBvdmVyZmxvd3MgKi8KLQotCi0vKiBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgaW4gYWxsIGZ1bmN0aW9uIGRlZmluaXRpb25zIGFuZCBleHRlcm4gZGVjbGFyYXRpb25zLgotICogWW91IGNvdWxkIG1vZGlmeSB0aGVtIGlmIHlvdSBuZWVkIHRvIGNoYW5nZSBmdW5jdGlvbiBsaW5rYWdlIGNvbnZlbnRpb25zOwotICogaW4gcGFydGljdWxhciwgeW91J2xsIG5lZWQgdG8gZG8gdGhhdCB0byBtYWtlIHRoZSBsaWJyYXJ5IGEgV2luZG93cyBETEwuCi0gKiBBbm90aGVyIGFwcGxpY2F0aW9uIGlzIHRvIG1ha2UgYWxsIGZ1bmN0aW9ucyBnbG9iYWwgZm9yIHVzZSB3aXRoIGRlYnVnZ2VycwotICogb3IgY29kZSBwcm9maWxlcnMgdGhhdCByZXF1aXJlIGl0LgotICovCi0KLS8qIGEgZnVuY3Rpb24gY2FsbGVkIHRocm91Z2ggbWV0aG9kIHBvaW50ZXJzOiAqLwotI2RlZmluZSBNRVRIT0RERUYodHlwZSkJCXN0YXRpYyB0eXBlCi0vKiBhIGZ1bmN0aW9uIHVzZWQgb25seSBpbiBpdHMgbW9kdWxlOiAqLwotI2RlZmluZSBMT0NBTCh0eXBlKQkJc3RhdGljIHR5cGUKLS8qIGEgZnVuY3Rpb24gcmVmZXJlbmNlZCB0aHJ1IEVYVEVSTnM6ICovCi0jZGVmaW5lIEdMT0JBTCh0eXBlKQkJdHlwZQotCi0jaWZkZWYgX0ZYX01BTkFHRURfQ09ERV8KLSNkZWZpbmUgRVhURVJOKHR5cGUpCQlleHRlcm4gIkMiIHR5cGUKLSNlbHNlCi0vKiBhIHJlZmVyZW5jZSB0byBhIEdMT0JBTCBmdW5jdGlvbjogKi8KLSNkZWZpbmUgRVhURVJOKHR5cGUpCQlleHRlcm4gdHlwZQotI2VuZGlmCi0KLQotLyogVGhpcyBtYWNybyBpcyB1c2VkIHRvIGRlY2xhcmUgYSAibWV0aG9kIiwgdGhhdCBpcywgYSBmdW5jdGlvbiBwb2ludGVyLgotICogV2Ugd2FudCB0byBzdXBwbHkgcHJvdG90eXBlIHBhcmFtZXRlcnMgaWYgdGhlIGNvbXBpbGVyIGNhbiBjb3BlLgotICogTm90ZSB0aGF0IHRoZSBhcmdsaXN0IHBhcmFtZXRlciBtdXN0IGJlIHBhcmVudGhlc2l6ZWQhCi0gKiBBZ2FpbiwgeW91IGNhbiBjdXN0b21pemUgdGhpcyBpZiB5b3UgbmVlZCBzcGVjaWFsIGxpbmthZ2Uga2V5d29yZHMuCi0gKi8KLQotI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwotI2RlZmluZSBKTUVUSE9EKHR5cGUsbWV0aG9kbmFtZSxhcmdsaXN0KSAgdHlwZSAoKm1ldGhvZG5hbWUpIGFyZ2xpc3QKLSNlbHNlCi0jZGVmaW5lIEpNRVRIT0QodHlwZSxtZXRob2RuYW1lLGFyZ2xpc3QpICB0eXBlICgqbWV0aG9kbmFtZSkgKCkKLSNlbmRpZgotCi0KLS8qIEhlcmUgaXMgdGhlIHBzZXVkby1rZXl3b3JkIGZvciBkZWNsYXJpbmcgcG9pbnRlcnMgdGhhdCBtdXN0IGJlICJmYXIiCi0gKiBvbiA4MHg4NiBtYWNoaW5lcy4gIE1vc3Qgb2YgdGhlIHNwZWNpYWxpemVkIGNvZGluZyBmb3IgODB4ODYgaXMgaGFuZGxlZAotICogYnkganVzdCBzYXlpbmcgIkZBUiAqIiB3aGVyZSBzdWNoIGEgcG9pbnRlciBpcyBuZWVkZWQuICBJbiBhIGZldyBwbGFjZXMKLSAqIGV4cGxpY2l0IGNvZGluZyBpcyBuZWVkZWQ7IHNlZSB1c2VzIG9mIHRoZSBORUVEX0ZBUl9QT0lOVEVSUyBzeW1ib2wuCi0gKi8KLQotI2lmZGVmIE5FRURfRkFSX1BPSU5URVJTCi0jZGVmaW5lIEZBUiAgZmFyCi0jZWxzZQotLy8jZGVmaW5lIEZBUgotI2VuZGlmCi0KLQotLyoKLSAqIE9uIGEgZmV3IHN5c3RlbXMsIHR5cGUgYm9vbGVhbiBhbmQvb3IgaXRzIHZhbHVlcyBGQUxTRSwgVFJVRSBtYXkgYXBwZWFyCi0gKiBpbiBzdGFuZGFyZCBoZWFkZXIgZmlsZXMuICBPciB5b3UgbWF5IGhhdmUgY29uZmxpY3RzIHdpdGggYXBwbGljYXRpb24tCi0gKiBzcGVjaWZpYyBoZWFkZXIgZmlsZXMgdGhhdCB5b3Ugd2FudCB0byBpbmNsdWRlIHRvZ2V0aGVyIHdpdGggdGhlc2UgZmlsZXMuCi0gKiBEZWZpbmluZyBIQVZFX0JPT0xFQU4gYmVmb3JlIGluY2x1ZGluZyBqcGVnbGliLmggc2hvdWxkIG1ha2UgaXQgd29yay4KLSAqLwotCi0jaWZuZGVmIEhBVkVfQk9PTEVBTgotdHlwZWRlZiBpbnQgYm9vbGVhbjsKLSNlbmRpZgotI2lmbmRlZiBGQUxTRQkJCS8qIGluIGNhc2UgdGhlc2UgbWFjcm9zIGFscmVhZHkgZXhpc3QgKi8KLSNkZWZpbmUgRkFMU0UJMAkJLyogdmFsdWVzIG9mIGJvb2xlYW4gKi8KLSNlbmRpZgotI2lmbmRlZiBUUlVFCi0jZGVmaW5lIFRSVUUJMQotI2VuZGlmCi0KLQotLyoKLSAqIFRoZSByZW1haW5pbmcgb3B0aW9ucyBhZmZlY3QgY29kZSBzZWxlY3Rpb24gd2l0aGluIHRoZSBKUEVHIGxpYnJhcnksCi0gKiBidXQgdGhleSBkb24ndCBuZWVkIHRvIGJlIHZpc2libGUgdG8gbW9zdCBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxpYnJhcnkuCi0gKiBUbyBtaW5pbWl6ZSBhcHBsaWNhdGlvbiBuYW1lc3BhY2UgcG9sbHV0aW9uLCB0aGUgc3ltYm9scyB3b24ndCBiZQotICogZGVmaW5lZCB1bmxlc3MgSlBFR19JTlRFUk5BTFMgb3IgSlBFR19JTlRFUk5BTF9PUFRJT05TIGhhcyBiZWVuIGRlZmluZWQuCi0gKi8KLQotI2lmZGVmIEpQRUdfSU5URVJOQUxTCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxfT1BUSU9OUwotI2VuZGlmCi0KLSNpZmRlZiBKUEVHX0lOVEVSTkFMX09QVElPTlMKLQotCi0vKgotICogVGhlc2UgZGVmaW5lcyBpbmRpY2F0ZSB3aGV0aGVyIHRvIGluY2x1ZGUgdmFyaW91cyBvcHRpb25hbCBmdW5jdGlvbnMuCi0gKiBVbmRlZmluaW5nIHNvbWUgb2YgdGhlc2Ugc3ltYm9scyB3aWxsIHByb2R1Y2UgYSBzbWFsbGVyIGJ1dCBsZXNzIGNhcGFibGUKLSAqIGxpYnJhcnkuICBOb3RlIHRoYXQgeW91IGNhbiBsZWF2ZSBjZXJ0YWluIHNvdXJjZSBmaWxlcyBvdXQgb2YgdGhlCi0gKiBjb21waWxhdGlvbi9saW5raW5nIHByb2Nlc3MgaWYgeW91J3ZlICN1bmRlZidkIHRoZSBjb3JyZXNwb25kaW5nIHN5bWJvbHMuCi0gKiAoWW91IG1heSBIQVZFIHRvIGRvIHRoYXQgaWYgeW91ciBjb21waWxlciBkb2Vzbid0IGxpa2UgbnVsbCBzb3VyY2UgZmlsZXMuKQotICovCi0KLS8qIEFyaXRobWV0aWMgY29kaW5nIGlzIHVuc3VwcG9ydGVkIGZvciBsZWdhbCByZWFzb25zLiAgQ29tcGxhaW50cyB0byBJQk0uICovCi0KLS8qIENhcGFiaWxpdHkgb3B0aW9ucyBjb21tb24gdG8gZW5jb2RlciBhbmQgZGVjb2RlcjogKi8KLQotI2RlZmluZSBEQ1RfSVNMT1dfU1VQUE9SVEVECS8qIHNsb3cgYnV0IGFjY3VyYXRlIGludGVnZXIgYWxnb3JpdGhtICovCi0jZGVmaW5lIERDVF9JRkFTVF9TVVBQT1JURUQJLyogZmFzdGVyLCBsZXNzIGFjY3VyYXRlIGludGVnZXIgbWV0aG9kICovCi0jdW5kZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAkvKiBmbG9hdGluZy1wb2ludDogYWNjdXJhdGUsIGZhc3Qgb24gZmFzdCBIVyAqLwotCi0vKiBFbmNvZGVyIGNhcGFiaWxpdHkgb3B0aW9uczogKi8KLQotI3VuZGVmICBDX0FSSVRIX0NPRElOR19TVVBQT1JURUQgICAgLyogQXJpdGhtZXRpYyBjb2RpbmcgYmFjayBlbmQ/ICovCi0jZGVmaW5lIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAvKiBNdWx0aXBsZS1zY2FuIEpQRUcgZmlsZXM/ICovCi0jZGVmaW5lIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECSAgICAvKiBQcm9ncmVzc2l2ZSBKUEVHPyAoUmVxdWlyZXMgTVVMVElTQ0FOKSovCi0jZGVmaW5lIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAkgICAgLyogT3B0aW1pemF0aW9uIG9mIGVudHJvcHkgY29kaW5nIHBhcm1zPyAqLwotLyogTm90ZTogaWYgeW91IHNlbGVjdGVkIDEyLWJpdCBkYXRhIHByZWNpc2lvbiwgaXQgaXMgZGFuZ2Vyb3VzIHRvIHR1cm4gb2ZmCi0gKiBFTlRST1BZX09QVF9TVVBQT1JURUQuICBUaGUgc3RhbmRhcmQgSHVmZm1hbiB0YWJsZXMgYXJlIG9ubHkgZ29vZCBmb3IgOC1iaXQKLSAqIHByZWNpc2lvbiwgc28gamNodWZmLmMgbm9ybWFsbHkgdXNlcyBlbnRyb3B5IG9wdGltaXphdGlvbiB0byBjb21wdXRlCi0gKiB1c2FibGUgdGFibGVzIGZvciBoaWdoZXIgcHJlY2lzaW9uLiAgSWYgeW91IGRvbid0IHdhbnQgdG8gZG8gb3B0aW1pemF0aW9uLAotICogeW91J2xsIGhhdmUgdG8gc3VwcGx5IGRpZmZlcmVudCBkZWZhdWx0IEh1ZmZtYW4gdGFibGVzLgotICogVGhlIGV4YWN0IHNhbWUgc3RhdGVtZW50cyBhcHBseSBmb3IgcHJvZ3Jlc3NpdmUgSlBFRzogdGhlIGRlZmF1bHQgdGFibGVzCi0gKiBkb24ndCB3b3JrIGZvciBwcm9ncmVzc2l2ZSBtb2RlLiAgKFRoaXMgbWF5IGdldCBmaXhlZCwgaG93ZXZlci4pCi0gKi8KLSNkZWZpbmUgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRCAgIC8qIElucHV0IGltYWdlIHNtb290aGluZyBvcHRpb24/ICovCi0KLS8qIERlY29kZXIgY2FwYWJpbGl0eSBvcHRpb25zOiAqLwotCi0jdW5kZWYgIERfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRCAgICAvKiBBcml0aG1ldGljIGNvZGluZyBiYWNrIGVuZD8gKi8KLSNkZWZpbmUgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEIC8qIE11bHRpcGxlLXNjYW4gSlBFRyBmaWxlcz8gKi8KLSNkZWZpbmUgRF9QUk9HUkVTU0lWRV9TVVBQT1JURUQJICAgIC8qIFByb2dyZXNzaXZlIEpQRUc/IChSZXF1aXJlcyBNVUxUSVNDQU4pKi8KLSNkZWZpbmUgU0FWRV9NQVJLRVJTX1NVUFBPUlRFRAkgICAgLyoganBlZ19zYXZlX21hcmtlcnMoKSBuZWVkZWQ/ICovCi0jZGVmaW5lIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQgICAvKiBCbG9jayBzbW9vdGhpbmc/IChQcm9ncmVzc2l2ZSBvbmx5KSAqLwotI2RlZmluZSBJRENUX1NDQUxJTkdfU1VQUE9SVEVECSAgICAvKiBPdXRwdXQgcmVzY2FsaW5nIHZpYSBJRENUPyAqLwotI3VuZGVmIFVQU0FNUExFX1NDQUxJTkdfU1VQUE9SVEVEICAvKiBPdXRwdXQgcmVzY2FsaW5nIGF0IHVwc2FtcGxlIHN0YWdlPyAqLwotI2RlZmluZSBVUFNBTVBMRV9NRVJHSU5HX1NVUFBPUlRFRCAgLyogRmFzdCBwYXRoIGZvciBzbG9wcHkgdXBzYW1wbGluZz8gKi8KLSN1bmRlZiBRVUFOVF8xUEFTU19TVVBQT1JURUQJICAgIC8qIDEtcGFzcyBjb2xvciBxdWFudGl6YXRpb24/ICovCi0jdW5kZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECSAgICAvKiAyLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uPyAqLwotCi0vKiBtb3JlIGNhcGFiaWxpdHkgb3B0aW9ucyBsYXRlciwgbm8gZG91YnQgKi8KLQotCi0vKgotICogT3JkZXJpbmcgb2YgUkdCIGRhdGEgaW4gc2NhbmxpbmVzIHBhc3NlZCB0byBvciBmcm9tIHRoZSBhcHBsaWNhdGlvbi4KLSAqIElmIHlvdXIgYXBwbGljYXRpb24gd2FudHMgdG8gZGVhbCB3aXRoIGRhdGEgaW4gdGhlIG9yZGVyIEIsRyxSLCBqdXN0Ci0gKiBjaGFuZ2UgdGhlc2UgbWFjcm9zLiAgWW91IGNhbiBhbHNvIGRlYWwgd2l0aCBmb3JtYXRzIHN1Y2ggYXMgUixHLEIsWAotICogKG9uZSBleHRyYSBieXRlIHBlciBwaXhlbCkgYnkgY2hhbmdpbmcgUkdCX1BJWEVMU0laRS4gIE5vdGUgdGhhdCBjaGFuZ2luZwotICogdGhlIG9mZnNldHMgd2lsbCBhbHNvIGNoYW5nZSB0aGUgb3JkZXIgaW4gd2hpY2ggY29sb3JtYXAgZGF0YSBpcyBvcmdhbml6ZWQuCi0gKiBSRVNUUklDVElPTlM6Ci0gKiAxLiBUaGUgc2FtcGxlIGFwcGxpY2F0aW9ucyBjanBlZyxkanBlZyBkbyBOT1Qgc3VwcG9ydCBtb2RpZmllZCBSR0IgZm9ybWF0cy4KLSAqIDIuIFRoZXNlIG1hY3JvcyBvbmx5IGFmZmVjdCBSR0I8PT5ZQ2JDciBjb2xvciBjb252ZXJzaW9uLCBzbyB0aGV5IGFyZSBub3QKLSAqICAgIHVzZWZ1bCBpZiB5b3UgYXJlIHVzaW5nIEpQRUcgY29sb3Igc3BhY2VzIG90aGVyIHRoYW4gWUNiQ3Igb3IgZ3JheXNjYWxlLgotICogMy4gVGhlIGNvbG9yIHF1YW50aXplciBtb2R1bGVzIHdpbGwgbm90IGJlaGF2ZSBkZXNpcmFibHkgaWYgUkdCX1BJWEVMU0laRQotICogICAgaXMgbm90IDMgKHRoZXkgZG9uJ3QgdW5kZXJzdGFuZCBhYm91dCBkdW1teSBjb2xvciBjb21wb25lbnRzISkuICBTbyB5b3UKLSAqICAgIGNhbid0IHVzZSBjb2xvciBxdWFudGl6YXRpb24gaWYgeW91IGNoYW5nZSB0aGF0IHZhbHVlLgotICovCi0KLSNkZWZpbmUgUkdCX1JFRAkJMAkvKiBPZmZzZXQgb2YgUmVkIGluIGFuIFJHQiBzY2FubGluZSBlbGVtZW50ICovCi0jZGVmaW5lIFJHQl9HUkVFTgkxCS8qIE9mZnNldCBvZiBHcmVlbiAqLwotI2RlZmluZSBSR0JfQkxVRQkyCS8qIE9mZnNldCBvZiBCbHVlICovCi0jZGVmaW5lIFJHQl9QSVhFTFNJWkUJMwkvKiBKU0FNUExFcyBwZXIgUkdCIHNjYW5saW5lIGVsZW1lbnQgKi8KLQotCi0vKiBEZWZpbml0aW9ucyBmb3Igc3BlZWQtcmVsYXRlZCBvcHRpbWl6YXRpb25zLiAqLwotCi0KLS8qIElmIHlvdXIgY29tcGlsZXIgc3VwcG9ydHMgaW5saW5lIGZ1bmN0aW9ucywgZGVmaW5lIElOTElORQotICogYXMgdGhlIGlubGluZSBrZXl3b3JkOyBvdGhlcndpc2UgZGVmaW5lIGl0IGFzIGVtcHR5LgotICovCi0KLSNpZm5kZWYgSU5MSU5FCi0jaWZkZWYgX19HTlVDX18JCQkvKiBmb3IgaW5zdGFuY2UsIEdOVSBDIGtub3dzIGFib3V0IGlubGluZSAqLwotI2RlZmluZSBJTkxJTkUgX19pbmxpbmVfXwotI2VuZGlmCi0jaWZuZGVmIElOTElORQotI2RlZmluZSBJTkxJTkUJCQkvKiBkZWZhdWx0IGlzIHRvIGRlZmluZSBpdCBhcyBlbXB0eSAqLwotI2VuZGlmCi0jZW5kaWYKLQotCi0vKiBPbiBzb21lIG1hY2hpbmVzIChub3RhYmx5IDY4MDAwIHNlcmllcykgImludCIgaXMgMzIgYml0cywgYnV0IG11bHRpcGx5aW5nCi0gKiB0d28gMTYtYml0IHNob3J0cyBpcyBmYXN0ZXIgdGhhbiBtdWx0aXBseWluZyB0d28gaW50cy4gIERlZmluZSBNVUxUSVBMSUVSCi0gKiBhcyBzaG9ydCBvbiBzdWNoIGEgbWFjaGluZS4gIE1VTFRJUExJRVIgbXVzdCBiZSBhdCBsZWFzdCAxNiBiaXRzIHdpZGUuCi0gKi8KLQotI2lmbmRlZiBNVUxUSVBMSUVSCi0jZGVmaW5lIE1VTFRJUExJRVIgIGludAkJLyogdHlwZSBmb3IgZmFzdGVzdCBpbnRlZ2VyIG11bHRpcGx5ICovCi0jZW5kaWYKLQotCi0vKiBGQVNUX0ZMT0FUIHNob3VsZCBiZSBlaXRoZXIgZmxvYXQgb3IgZG91YmxlLCB3aGljaGV2ZXIgaXMgZG9uZSBmYXN0ZXIKLSAqIGJ5IHlvdXIgY29tcGlsZXIuICAoTm90ZSB0aGF0IHRoaXMgdHlwZSBpcyBvbmx5IHVzZWQgaW4gdGhlIGZsb2F0aW5nIHBvaW50Ci0gKiBEQ1Qgcm91dGluZXMsIHNvIGl0IG9ubHkgbWF0dGVycyBpZiB5b3UndmUgZGVmaW5lZCBEQ1RfRkxPQVRfU1VQUE9SVEVELikKLSAqIFR5cGljYWxseSwgZmxvYXQgaXMgZmFzdGVyIGluIEFOU0kgQyBjb21waWxlcnMsIHdoaWxlIGRvdWJsZSBpcyBmYXN0ZXIgaW4KLSAqIHByZS1BTlNJIGNvbXBpbGVycyAoYmVjYXVzZSB0aGV5IGluc2lzdCBvbiBjb252ZXJ0aW5nIHRvIGRvdWJsZSBhbnl3YXkpLgotICogVGhlIGNvZGUgYmVsb3cgdGhlcmVmb3JlIGNob29zZXMgZmxvYXQgaWYgd2UgaGF2ZSBBTlNJLXN0eWxlIHByb3RvdHlwZXMuCi0gKi8KLQotI2lmbmRlZiBGQVNUX0ZMT0FUCi0jaWZkZWYgSEFWRV9QUk9UT1RZUEVTCi0jZGVmaW5lIEZBU1RfRkxPQVQgIGZsb2F0Ci0jZWxzZQotI2RlZmluZSBGQVNUX0ZMT0FUICBkb3VibGUKLSNlbmRpZgotI2VuZGlmCi0KLSNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMX09QVElPTlMgKi8KZGlmZiAtLWdpdCBhL2NvcmUvaW5jbHVkZS90aGlyZHBhcnRpZXMvbGlianBlZy9qcGVnaW50LmggYi9jb3JlL2luY2x1ZGUvdGhpcmRwYXJ0aWVzL2xpYmpwZWcvanBlZ2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWIwMGQ0Li4wMDAwMDAwCi0tLSBhL2NvcmUvaW5jbHVkZS90aGlyZHBhcnRpZXMvbGlianBlZy9qcGVnaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOTIgKzAsMCBAQAotLyoKLSAqIGpwZWdpbnQuaAotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIHByb3ZpZGVzIGNvbW1vbiBkZWNsYXJhdGlvbnMgZm9yIHRoZSB2YXJpb3VzIEpQRUcgbW9kdWxlcy4KLSAqIFRoZXNlIGRlY2xhcmF0aW9ucyBhcmUgY29uc2lkZXJlZCBpbnRlcm5hbCB0byB0aGUgSlBFRyBsaWJyYXJ5OyBtb3N0Ci0gKiBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxpYnJhcnkgc2hvdWxkbid0IG5lZWQgdG8gaW5jbHVkZSB0aGlzIGZpbGUuCi0gKi8KLQotCi0vKiBEZWNsYXJhdGlvbnMgZm9yIGJvdGggY29tcHJlc3Npb24gJiBkZWNvbXByZXNzaW9uICovCi0KLXR5cGVkZWYgZW51bSB7CQkJLyogT3BlcmF0aW5nIG1vZGVzIGZvciBidWZmZXIgY29udHJvbGxlcnMgKi8KLQlKQlVGX1BBU1NfVEhSVSwJCS8qIFBsYWluIHN0cmlwd2lzZSBvcGVyYXRpb24gKi8KLQkvKiBSZW1haW5pbmcgbW9kZXMgcmVxdWlyZSBhIGZ1bGwtaW1hZ2UgYnVmZmVyIHRvIGhhdmUgYmVlbiBjcmVhdGVkICovCi0JSkJVRl9TQVZFX1NPVVJDRSwJLyogUnVuIHNvdXJjZSBzdWJvYmplY3Qgb25seSwgc2F2ZSBvdXRwdXQgKi8KLQlKQlVGX0NSQU5LX0RFU1QsCS8qIFJ1biBkZXN0IHN1Ym9iamVjdCBvbmx5LCB1c2luZyBzYXZlZCBkYXRhICovCi0JSkJVRl9TQVZFX0FORF9QQVNTCS8qIFJ1biBib3RoIHN1Ym9iamVjdHMsIHNhdmUgb3V0cHV0ICovCi19IEpfQlVGX01PREU7Ci0KLS8qIFZhbHVlcyBvZiBnbG9iYWxfc3RhdGUgZmllbGQgKGpkYXBpLmMgaGFzIHNvbWUgZGVwZW5kZW5jaWVzIG9uIG9yZGVyaW5nISkgKi8KLSNkZWZpbmUgQ1NUQVRFX1NUQVJUCTEwMAkvKiBhZnRlciBjcmVhdGVfY29tcHJlc3MgKi8KLSNkZWZpbmUgQ1NUQVRFX1NDQU5OSU5HCTEwMQkvKiBzdGFydF9jb21wcmVzcyBkb25lLCB3cml0ZV9zY2FubGluZXMgT0sgKi8KLSNkZWZpbmUgQ1NUQVRFX1JBV19PSwkxMDIJLyogc3RhcnRfY29tcHJlc3MgZG9uZSwgd3JpdGVfcmF3X2RhdGEgT0sgKi8KLSNkZWZpbmUgQ1NUQVRFX1dSQ09FRlMJMTAzCS8qIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzIGRvbmUgKi8KLSNkZWZpbmUgRFNUQVRFX1NUQVJUCTIwMAkvKiBhZnRlciBjcmVhdGVfZGVjb21wcmVzcyAqLwotI2RlZmluZSBEU1RBVEVfSU5IRUFERVIJMjAxCS8qIHJlYWRpbmcgaGVhZGVyIG1hcmtlcnMsIG5vIFNPUyB5ZXQgKi8KLSNkZWZpbmUgRFNUQVRFX1JFQURZCTIwMgkvKiBmb3VuZCBTT1MsIHJlYWR5IGZvciBzdGFydF9kZWNvbXByZXNzICovCi0jZGVmaW5lIERTVEFURV9QUkVMT0FECTIwMwkvKiByZWFkaW5nIG11bHRpc2NhbiBmaWxlIGluIHN0YXJ0X2RlY29tcHJlc3MqLwotI2RlZmluZSBEU1RBVEVfUFJFU0NBTgkyMDQJLyogcGVyZm9ybWluZyBkdW1teSBwYXNzIGZvciAyLXBhc3MgcXVhbnQgKi8KLSNkZWZpbmUgRFNUQVRFX1NDQU5OSU5HCTIwNQkvKiBzdGFydF9kZWNvbXByZXNzIGRvbmUsIHJlYWRfc2NhbmxpbmVzIE9LICovCi0jZGVmaW5lIERTVEFURV9SQVdfT0sJMjA2CS8qIHN0YXJ0X2RlY29tcHJlc3MgZG9uZSwgcmVhZF9yYXdfZGF0YSBPSyAqLwotI2RlZmluZSBEU1RBVEVfQlVGSU1BR0UJMjA3CS8qIGV4cGVjdGluZyBqcGVnX3N0YXJ0X291dHB1dCAqLwotI2RlZmluZSBEU1RBVEVfQlVGUE9TVAkyMDgJLyogbG9va2luZyBmb3IgU09TL0VPSSBpbiBqcGVnX2ZpbmlzaF9vdXRwdXQgKi8KLSNkZWZpbmUgRFNUQVRFX1JEQ09FRlMJMjA5CS8qIHJlYWRpbmcgZmlsZSBpbiBqcGVnX3JlYWRfY29lZmZpY2llbnRzICovCi0jZGVmaW5lIERTVEFURV9TVE9QUElORwkyMTAJLyogbG9va2luZyBmb3IgRU9JIGluIGpwZWdfZmluaXNoX2RlY29tcHJlc3MgKi8KLQotCi0vKiBEZWNsYXJhdGlvbnMgZm9yIGNvbXByZXNzaW9uIG1vZHVsZXMgKi8KLQotLyogTWFzdGVyIGNvbnRyb2wgbW9kdWxlICovCi1zdHJ1Y3QganBlZ19jb21wX21hc3RlciB7Ci0gIEpNRVRIT0Qodm9pZCwgcHJlcGFyZV9mb3JfcGFzcywgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgcGFzc19zdGFydHVwLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRCh2b2lkLCBmaW5pc2hfcGFzcywgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLSAgLyogU3RhdGUgdmFyaWFibGVzIG1hZGUgdmlzaWJsZSB0byBvdGhlciBtb2R1bGVzICovCi0gIGJvb2xlYW4gY2FsbF9wYXNzX3N0YXJ0dXA7CS8qIFRydWUgaWYgcGFzc19zdGFydHVwIG11c3QgYmUgY2FsbGVkICovCi0gIGJvb2xlYW4gaXNfbGFzdF9wYXNzOwkJLyogVHJ1ZSBkdXJpbmcgbGFzdCBwYXNzICovCi19OwotCi0vKiBNYWluIGJ1ZmZlciBjb250cm9sIChkb3duc2FtcGxlZC1kYXRhIGJ1ZmZlcikgKi8KLXN0cnVjdCBqcGVnX2NfbWFpbl9jb250cm9sbGVyIHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKSk7Ci0gIEpNRVRIT0Qodm9pZCwgcHJvY2Vzc19kYXRhLCAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19jdHIsCi0JCQkgICAgICAgSkRJTUVOU0lPTiBpbl9yb3dzX2F2YWlsKSk7Ci19OwotCi0vKiBDb21wcmVzc2lvbiBwcmVwcm9jZXNzaW5nIChkb3duc2FtcGxpbmcgaW5wdXQgYnVmZmVyIGNvbnRyb2wpICovCi1zdHJ1Y3QganBlZ19jX3ByZXBfY29udHJvbGxlciB7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkpOwotICBKTUVUSE9EKHZvaWQsIHByZV9wcm9jZXNzX2RhdGEsIChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkgICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwKLQkJCQkgICBKRElNRU5TSU9OICppbl9yb3dfY3RyLAotCQkJCSAgIEpESU1FTlNJT04gaW5fcm93c19hdmFpbCwKLQkJCQkgICBKU0FNUElNQUdFIG91dHB1dF9idWYsCi0JCQkJICAgSkRJTUVOU0lPTiAqb3V0X3Jvd19ncm91cF9jdHIsCi0JCQkJICAgSkRJTUVOU0lPTiBvdXRfcm93X2dyb3Vwc19hdmFpbCkpOwotfTsKLQotLyogQ29lZmZpY2llbnQgYnVmZmVyIGNvbnRyb2wgKi8KLXN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyIHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKSk7Ci0gIEpNRVRIT0QoYm9vbGVhbiwgY29tcHJlc3NfZGF0YSwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCSAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmKSk7Ci19OwotCi0vKiBDb2xvcnNwYWNlIGNvbnZlcnNpb24gKi8KLXN0cnVjdCBqcGVnX2NvbG9yX2NvbnZlcnRlciB7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgY29sb3JfY29udmVydCwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCUpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUElNQUdFIG91dHB1dF9idWYsCi0JCQkJSkRJTUVOU0lPTiBvdXRwdXRfcm93LCBpbnQgbnVtX3Jvd3MpKTsKLX07Ci0KLS8qIERvd25zYW1wbGluZyAqLwotc3RydWN0IGpwZWdfZG93bnNhbXBsZXIgewotICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIGRvd25zYW1wbGUsIChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCSAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5fcm93X2luZGV4LAotCQkJICAgICBKU0FNUElNQUdFIG91dHB1dF9idWYsCi0JCQkgICAgIEpESU1FTlNJT04gb3V0X3Jvd19ncm91cF9pbmRleCkpOwotCi0gIGJvb2xlYW4gbmVlZF9jb250ZXh0X3Jvd3M7CS8qIFRSVUUgaWYgbmVlZCByb3dzIGFib3ZlICYgYmVsb3cgKi8KLX07Ci0KLS8qIEZvcndhcmQgRENUIChhbHNvIGNvbnRyb2xzIGNvZWZmaWNpZW50IHF1YW50aXphdGlvbikgKi8KLXN0cnVjdCBqcGVnX2ZvcndhcmRfZGN0IHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLSAgLyogcGVyaGFwcyB0aGlzIHNob3VsZCBiZSBhbiBhcnJheT8/PyAqLwotICBKTUVUSE9EKHZvaWQsIGZvcndhcmRfRENULCAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkgICAgICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJCSAgICAgIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpCTE9DS1JPVyBjb2VmX2Jsb2NrcywKLQkJCSAgICAgIEpESU1FTlNJT04gc3RhcnRfcm93LCBKRElNRU5TSU9OIHN0YXJ0X2NvbCwKLQkJCSAgICAgIEpESU1FTlNJT04gbnVtX2Jsb2NrcykpOwotfTsKLQotLyogRW50cm9weSBlbmNvZGluZyAqLwotc3RydWN0IGpwZWdfZW50cm9weV9lbmNvZGVyIHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gZ2F0aGVyX3N0YXRpc3RpY3MpKTsKLSAgSk1FVEhPRChib29sZWFuLCBlbmNvZGVfbWN1LCAoal9jb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKLSAgSk1FVEhPRCh2b2lkLCBmaW5pc2hfcGFzcywgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci19OwotCi0vKiBNYXJrZXIgd3JpdGluZyAqLwotc3RydWN0IGpwZWdfbWFya2VyX3dyaXRlciB7Ci0gIEpNRVRIT0Qodm9pZCwgd3JpdGVfZmlsZV9oZWFkZXIsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIHdyaXRlX2ZyYW1lX2hlYWRlciwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgd3JpdGVfc2Nhbl9oZWFkZXIsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIHdyaXRlX2ZpbGVfdHJhaWxlciwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgd3JpdGVfdGFibGVzX29ubHksIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotICAvKiBUaGVzZSByb3V0aW5lcyBhcmUgZXhwb3J0ZWQgdG8gYWxsb3cgaW5zZXJ0aW9uIG9mIGV4dHJhIG1hcmtlcnMgKi8KLSAgLyogUHJvYmFibHkgb25seSBDT00gYW5kIEFQUG4gbWFya2VycyBzaG91bGQgYmUgd3JpdHRlbiB0aGlzIHdheSAqLwotICBKTUVUSE9EKHZvaWQsIHdyaXRlX21hcmtlcl9oZWFkZXIsIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlciwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgZGF0YWxlbikpOwotICBKTUVUSE9EKHZvaWQsIHdyaXRlX21hcmtlcl9ieXRlLCAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB2YWwpKTsKLX07Ci0KLQotLyogRGVjbGFyYXRpb25zIGZvciBkZWNvbXByZXNzaW9uIG1vZHVsZXMgKi8KLQotLyogTWFzdGVyIGNvbnRyb2wgbW9kdWxlICovCi1zdHJ1Y3QganBlZ19kZWNvbXBfbWFzdGVyIHsKLSAgSk1FVEhPRCh2b2lkLCBwcmVwYXJlX2Zvcl9vdXRwdXRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRCh2b2lkLCBmaW5pc2hfb3V0cHV0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLSAgLyogU3RhdGUgdmFyaWFibGVzIG1hZGUgdmlzaWJsZSB0byBvdGhlciBtb2R1bGVzICovCi0gIGJvb2xlYW4gaXNfZHVtbXlfcGFzczsJLyogVHJ1ZSBkdXJpbmcgMXN0IHBhc3MgZm9yIDItcGFzcyBxdWFudCAqLwotfTsKLQotLyogSW5wdXQgY29udHJvbCBtb2R1bGUgKi8KLXN0cnVjdCBqcGVnX2lucHV0X2NvbnRyb2xsZXIgewotICBKTUVUSE9EKGludCwgY29uc3VtZV9pbnB1dCwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRCh2b2lkLCByZXNldF9pbnB1dF9jb250cm9sbGVyLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIHN0YXJ0X2lucHV0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgZmluaXNoX2lucHV0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLSAgLyogU3RhdGUgdmFyaWFibGVzIG1hZGUgdmlzaWJsZSB0byBvdGhlciBtb2R1bGVzICovCi0gIGJvb2xlYW4gaGFzX211bHRpcGxlX3NjYW5zOwkvKiBUcnVlIGlmIGZpbGUgaGFzIG11bHRpcGxlIHNjYW5zICovCi0gIGJvb2xlYW4gZW9pX3JlYWNoZWQ7CQkvKiBUcnVlIHdoZW4gRU9JIGhhcyBiZWVuIGNvbnN1bWVkICovCi19OwotCi0vKiBNYWluIGJ1ZmZlciBjb250cm9sIChkb3duc2FtcGxlZC1kYXRhIGJ1ZmZlcikgKi8KLXN0cnVjdCBqcGVnX2RfbWFpbl9jb250cm9sbGVyIHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpKTsKLSAgSk1FVEhPRCh2b2lkLCBwcm9jZXNzX2RhdGEsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCi0JCQkgICAgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOwotfTsKLQotLyogQ29lZmZpY2llbnQgYnVmZmVyIGNvbnRyb2wgKi8KLXN0cnVjdCBqcGVnX2RfY29lZl9jb250cm9sbGVyIHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9pbnB1dF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKGludCwgY29uc3VtZV9kYXRhLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIHN0YXJ0X291dHB1dF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKGludCwgZGVjb21wcmVzc19kYXRhLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkgSlNBTVBJTUFHRSBvdXRwdXRfYnVmKSk7Ci0gIC8qIFBvaW50ZXIgdG8gYXJyYXkgb2YgY29lZmZpY2llbnQgdmlydHVhbCBhcnJheXMsIG9yIE5VTEwgaWYgbm9uZSAqLwotICBqdmlydF9iYXJyYXlfcHRyICpjb2VmX2FycmF5czsKLX07Ci0KLS8qIERlY29tcHJlc3Npb24gcG9zdHByb2Nlc3NpbmcgKGNvbG9yIHF1YW50aXphdGlvbiBidWZmZXIgY29udHJvbCkgKi8KLXN0cnVjdCBqcGVnX2RfcG9zdF9jb250cm9sbGVyIHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpKTsKLSAgSk1FVEhPRCh2b2lkLCBwb3N0X3Byb2Nlc3NfZGF0YSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLAotCQkJCSAgICBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAotCQkJCSAgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCi0JCQkJICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKLQkJCQkgICAgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCi0JCQkJICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKLX07Ci0KLS8qIE1hcmtlciByZWFkaW5nICYgcGFyc2luZyAqLwotc3RydWN0IGpwZWdfbWFya2VyX3JlYWRlciB7Ci0gIEpNRVRIT0Qodm9pZCwgcmVzZXRfbWFya2VyX3JlYWRlciwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLSAgLyogUmVhZCBtYXJrZXJzIHVudGlsIFNPUyBvciBFT0kuCi0gICAqIFJldHVybnMgc2FtZSBjb2RlcyBhcyBhcmUgZGVmaW5lZCBmb3IganBlZ19jb25zdW1lX2lucHV0OgotICAgKiBKUEVHX1NVU1BFTkRFRCwgSlBFR19SRUFDSEVEX1NPUywgb3IgSlBFR19SRUFDSEVEX0VPSS4KLSAgICovCi0gIEpNRVRIT0QoaW50LCByZWFkX21hcmtlcnMsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIC8qIFJlYWQgYSByZXN0YXJ0IG1hcmtlciAtLS0gZXhwb3J0ZWQgZm9yIHVzZSBieSBlbnRyb3B5IGRlY29kZXIgb25seSAqLwotICBqcGVnX21hcmtlcl9wYXJzZXJfbWV0aG9kIHJlYWRfcmVzdGFydF9tYXJrZXI7Ci0KLSAgLyogU3RhdGUgb2YgbWFya2VyIHJlYWRlciAtLS0gbm9taW5hbGx5IGludGVybmFsLCBidXQgYXBwbGljYXRpb25zCi0gICAqIHN1cHBseWluZyBDT00gb3IgQVBQbiBoYW5kbGVycyBtaWdodCBsaWtlIHRvIGtub3cgdGhlIHN0YXRlLgotICAgKi8KLSAgYm9vbGVhbiBzYXdfU09JOwkJLyogZm91bmQgU09JPyAqLwotICBib29sZWFuIHNhd19TT0Y7CQkvKiBmb3VuZCBTT0Y/ICovCi0gIGludCBuZXh0X3Jlc3RhcnRfbnVtOwkJLyogbmV4dCByZXN0YXJ0IG51bWJlciBleHBlY3RlZCAoMC03KSAqLwotICB1bnNpZ25lZCBpbnQgZGlzY2FyZGVkX2J5dGVzOwkvKiAjIG9mIGJ5dGVzIHNraXBwZWQgbG9va2luZyBmb3IgYSBtYXJrZXIgKi8KLX07Ci0KLS8qIEVudHJvcHkgZGVjb2RpbmcgKi8KLXN0cnVjdCBqcGVnX2VudHJvcHlfZGVjb2RlciB7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRChib29sZWFuLCBkZWNvZGVfbWN1LCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQlKQkxPQ0tST1cgKk1DVV9kYXRhKSk7Ci0KLSAgLyogVGhpcyBpcyBoZXJlIHRvIHNoYXJlIGNvZGUgYmV0d2VlbiBiYXNlbGluZSBhbmQgcHJvZ3Jlc3NpdmUgZGVjb2RlcnM7ICovCi0gIC8qIG90aGVyIG1vZHVsZXMgcHJvYmFibHkgc2hvdWxkIG5vdCB1c2UgaXQgKi8KLSAgYm9vbGVhbiBpbnN1ZmZpY2llbnRfZGF0YTsJLyogc2V0IFRSVUUgYWZ0ZXIgZW1pdHRpbmcgd2FybmluZyAqLwotfTsKLQotLyogSW52ZXJzZSBEQ1QgKGFsc28gcGVyZm9ybXMgZGVxdWFudGl6YXRpb24pICovCi10eXBlZGVmIEpNRVRIT0Qodm9pZCwgaW52ZXJzZV9EQ1RfbWV0aG9kX3B0ciwKLQkJKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCQkgSkNPRUZQVFIgY29lZl9ibG9jaywKLQkJIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7Ci0KLXN0cnVjdCBqcGVnX2ludmVyc2VfZGN0IHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICAvKiBJdCBpcyB1c2VmdWwgdG8gYWxsb3cgZWFjaCBjb21wb25lbnQgdG8gaGF2ZSBhIHNlcGFyYXRlIElEQ1QgbWV0aG9kLiAqLwotICBpbnZlcnNlX0RDVF9tZXRob2RfcHRyIGludmVyc2VfRENUW01BWF9DT01QT05FTlRTXTsKLX07Ci0KLS8qIFVwc2FtcGxpbmcgKG5vdGUgdGhhdCB1cHNhbXBsZXIgbXVzdCBhbHNvIGNhbGwgY29sb3IgY29udmVydGVyKSAqLwotc3RydWN0IGpwZWdfdXBzYW1wbGVyIHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIHVwc2FtcGxlLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCSAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLAotCQkJICAgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKLQkJCSAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKLQkJCSAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKLQkJCSAgIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAotCQkJICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOwotCi0gIGJvb2xlYW4gbmVlZF9jb250ZXh0X3Jvd3M7CS8qIFRSVUUgaWYgbmVlZCByb3dzIGFib3ZlICYgYmVsb3cgKi8KLX07Ci0KLS8qIENvbG9yc3BhY2UgY29udmVyc2lvbiAqLwotc3RydWN0IGpwZWdfY29sb3JfZGVjb252ZXJ0ZXIgewotICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgY29sb3JfY29udmVydCwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAotCQkJCUpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKSk7Ci19OwotCi0vKiBDb2xvciBxdWFudGl6YXRpb24gb3IgY29sb3IgcHJlY2lzaW9uIHJlZHVjdGlvbiAqLwotc3RydWN0IGpwZWdfY29sb3JfcXVhbnRpemVyIHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBpc19wcmVfc2NhbikpOwotICBKTUVUSE9EKHZvaWQsIGNvbG9yX3F1YW50aXplLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKLQkJCQkgaW50IG51bV9yb3dzKSk7Ci0gIEpNRVRIT0Qodm9pZCwgZmluaXNoX3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgbmV3X2NvbG9yX21hcCwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLX07Ci0KLQotLyogTWlzY2VsbGFuZW91cyB1c2VmdWwgbWFjcm9zICovCi0KLSN1bmRlZiBNQVgKLSNkZWZpbmUgTUFYKGEsYikJKChhKSA+IChiKSA/IChhKSA6IChiKSkKLSN1bmRlZiBNSU4KLSNkZWZpbmUgTUlOKGEsYikJKChhKSA8IChiKSA/IChhKSA6IChiKSkKLQotCi0vKiBXZSBhc3N1bWUgdGhhdCByaWdodCBzaGlmdCBjb3JyZXNwb25kcyB0byBzaWduZWQgZGl2aXNpb24gYnkgMiB3aXRoCi0gKiByb3VuZGluZyB0b3dhcmRzIG1pbnVzIGluZmluaXR5LiAgVGhpcyBpcyBjb3JyZWN0IGZvciB0eXBpY2FsICJhcml0aG1ldGljCi0gKiBzaGlmdCIgaW5zdHJ1Y3Rpb25zIHRoYXQgc2hpZnQgaW4gY29waWVzIG9mIHRoZSBzaWduIGJpdC4gIEJ1dCBzb21lCi0gKiBDIGNvbXBpbGVycyBpbXBsZW1lbnQgPj4gd2l0aCBhbiB1bnNpZ25lZCBzaGlmdC4gIEZvciB0aGVzZSBtYWNoaW5lcyB5b3UKLSAqIG11c3QgZGVmaW5lIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVELgotICogUklHSFRfU0hJRlQgcHJvdmlkZXMgYSBwcm9wZXIgc2lnbmVkIHJpZ2h0IHNoaWZ0IG9mIGFuIElOVDMyIHF1YW50aXR5LgotICogSXQgaXMgb25seSBhcHBsaWVkIHdpdGggY29uc3RhbnQgc2hpZnQgY291bnRzLiAgU0hJRlRfVEVNUFMgbXVzdCBiZQotICogaW5jbHVkZWQgaW4gdGhlIHZhcmlhYmxlcyBvZiBhbnkgcm91dGluZSB1c2luZyBSSUdIVF9TSElGVC4KLSAqLwotCi0jaWZkZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKLSNkZWZpbmUgU0hJRlRfVEVNUFMJSU5UMzIgc2hpZnRfdGVtcDsKLSNkZWZpbmUgUklHSFRfU0hJRlQoeCxzaGZ0KSAgXAotCSgoc2hpZnRfdGVtcCA9ICh4KSkgPCAwID8gXAotCSAoc2hpZnRfdGVtcCA+PiAoc2hmdCkpIHwgKCh+KChJTlQzMikgMCkpIDw8ICgzMi0oc2hmdCkpKSA6IFwKLQkgKHNoaWZ0X3RlbXAgPj4gKHNoZnQpKSkKLSNlbHNlCi0jZGVmaW5lIFNISUZUX1RFTVBTCi0jZGVmaW5lIFJJR0hUX1NISUZUKHgsc2hmdCkJKCh4KSA+PiAoc2hmdCkpCi0jZW5kaWYKLQotCi0vKiBTaG9ydCBmb3JtcyBvZiBleHRlcm5hbCBuYW1lcyBmb3Igc3lzdGVtcyB3aXRoIGJyYWluLWRhbWFnZWQgbGlua2Vycy4gKi8KLQotI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLSNkZWZpbmUgamluaXRfY29tcHJlc3NfbWFzdGVyCWpJQ29tcHJlc3MKLSNkZWZpbmUgamluaXRfY19tYXN0ZXJfY29udHJvbAlqSUNNYXN0ZXIKLSNkZWZpbmUgamluaXRfY19tYWluX2NvbnRyb2xsZXIJaklDTWFpbkMKLSNkZWZpbmUgamluaXRfY19wcmVwX2NvbnRyb2xsZXIJaklDUHJlcEMKLSNkZWZpbmUgamluaXRfY19jb2VmX2NvbnRyb2xsZXIJaklDQ29lZkMKLSNkZWZpbmUgamluaXRfY29sb3JfY29udmVydGVyCWpJQ0NvbG9yCi0jZGVmaW5lIGppbml0X2Rvd25zYW1wbGVyCWpJRG93bnNhbXBsZXIKLSNkZWZpbmUgamluaXRfZm9yd2FyZF9kY3QJaklGRENUCi0jZGVmaW5lIGppbml0X2h1ZmZfZW5jb2RlcglqSUhFbmNvZGVyCi0jZGVmaW5lIGppbml0X3BodWZmX2VuY29kZXIJaklQSEVuY29kZXIKLSNkZWZpbmUgamluaXRfbWFya2VyX3dyaXRlcglqSU1Xcml0ZXIKLSNkZWZpbmUgamluaXRfbWFzdGVyX2RlY29tcHJlc3MJaklETWFzdGVyCi0jZGVmaW5lIGppbml0X2RfbWFpbl9jb250cm9sbGVyCWpJRE1haW5DCi0jZGVmaW5lIGppbml0X2RfY29lZl9jb250cm9sbGVyCWpJRENvZWZDCi0jZGVmaW5lIGppbml0X2RfcG9zdF9jb250cm9sbGVyCWpJRFBvc3RDCi0jZGVmaW5lIGppbml0X2lucHV0X2NvbnRyb2xsZXIJaklJbkN0bHIKLSNkZWZpbmUgamluaXRfbWFya2VyX3JlYWRlcglqSU1SZWFkZXIKLSNkZWZpbmUgamluaXRfaHVmZl9kZWNvZGVyCWpJSERlY29kZXIKLSNkZWZpbmUgamluaXRfcGh1ZmZfZGVjb2RlcglqSVBIRGVjb2RlcgotI2RlZmluZSBqaW5pdF9pbnZlcnNlX2RjdAlqSUlEQ1QKLSNkZWZpbmUgamluaXRfdXBzYW1wbGVyCQlqSVVwc2FtcGxlcgotI2RlZmluZSBqaW5pdF9jb2xvcl9kZWNvbnZlcnRlcglqSURDb2xvcgotI2RlZmluZSBqaW5pdF8xcGFzc19xdWFudGl6ZXIJakkxUXVhbnQKLSNkZWZpbmUgamluaXRfMnBhc3NfcXVhbnRpemVyCWpJMlF1YW50Ci0jZGVmaW5lIGppbml0X21lcmdlZF91cHNhbXBsZXIJaklNVXBzYW1wbGVyCi0jZGVmaW5lIGppbml0X21lbW9yeV9tZ3IJaklNZW1NZ3IKLSNkZWZpbmUgamRpdl9yb3VuZF91cAkJakRpdlJvdW5kCi0jZGVmaW5lIGpyb3VuZF91cAkJalJvdW5kCi0jZGVmaW5lIGpjb3B5X3NhbXBsZV9yb3dzCWpDb3B5U2FtcGxlcwotI2RlZmluZSBqY29weV9ibG9ja19yb3cJCWpDb3B5QmxvY2tzCi0jZGVmaW5lIGp6ZXJvX2ZhcgkJalplcm9GYXIKLSNkZWZpbmUganBlZ196aWd6YWdfb3JkZXIJalpJR1RhYmxlCi0jZGVmaW5lIGpwZWdfbmF0dXJhbF9vcmRlcglqWkFHVGFibGUKLSNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCi0KLQotLyogQ29tcHJlc3Npb24gbW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzICovCi1FWFRFUk4odm9pZCkgamluaXRfY29tcHJlc3NfbWFzdGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqaW5pdF9jX21hc3Rlcl9jb250cm9sIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSBib29sZWFuIHRyYW5zY29kZV9vbmx5KSk7Ci1FWFRFUk4odm9pZCkgamluaXRfY19tYWluX2NvbnRyb2xsZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpKTsKLUVYVEVSTih2b2lkKSBqaW5pdF9jX3ByZXBfY29udHJvbGxlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikpOwotRVhURVJOKHZvaWQpIGppbml0X2NfY29lZl9jb250cm9sbGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfY29sb3JfY29udmVydGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqaW5pdF9kb3duc2FtcGxlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfZm9yd2FyZF9kY3QgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGppbml0X2h1ZmZfZW5jb2RlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfcGh1ZmZfZW5jb2RlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfbWFya2VyX3dyaXRlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0vKiBEZWNvbXByZXNzaW9uIG1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lcyAqLwotRVhURVJOKHZvaWQpIGppbml0X21hc3Rlcl9kZWNvbXByZXNzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGppbml0X2RfbWFpbl9jb250cm9sbGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpKTsKLUVYVEVSTih2b2lkKSBqaW5pdF9kX2NvZWZfY29udHJvbGxlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfZF9wb3N0X2NvbnRyb2xsZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikpOwotRVhURVJOKHZvaWQpIGppbml0X2lucHV0X2NvbnRyb2xsZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfbWFya2VyX3JlYWRlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqaW5pdF9odWZmX2RlY29kZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfcGh1ZmZfZGVjb2RlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqaW5pdF9pbnZlcnNlX2RjdCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqaW5pdF91cHNhbXBsZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfY29sb3JfZGVjb252ZXJ0ZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfMXBhc3NfcXVhbnRpemVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGppbml0XzJwYXNzX3F1YW50aXplciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqaW5pdF9tZXJnZWRfdXBzYW1wbGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotLyogTWVtb3J5IG1hbmFnZXIgaW5pdGlhbGl6YXRpb24gKi8KLUVYVEVSTih2b2lkKSBqaW5pdF9tZW1vcnlfbWdyIEpQUCgoal9jb21tb25fcHRyIGNpbmZvKSk7Ci0KLS8qIFV0aWxpdHkgcm91dGluZXMgaW4ganV0aWxzLmMgKi8KLUVYVEVSTihsb25nKSBqZGl2X3JvdW5kX3VwIEpQUCgobG9uZyBhLCBsb25nIGIpKTsKLUVYVEVSTihsb25nKSBqcm91bmRfdXAgSlBQKChsb25nIGEsIGxvbmcgYikpOwotRVhURVJOKHZvaWQpIGpjb3B5X3NhbXBsZV9yb3dzIEpQUCgoSlNBTVBBUlJBWSBpbnB1dF9hcnJheSwgaW50IHNvdXJjZV9yb3csCi0JCQkJICAgIEpTQU1QQVJSQVkgb3V0cHV0X2FycmF5LCBpbnQgZGVzdF9yb3csCi0JCQkJICAgIGludCBudW1fcm93cywgSkRJTUVOU0lPTiBudW1fY29scykpOwotRVhURVJOKHZvaWQpIGpjb3B5X2Jsb2NrX3JvdyBKUFAoKEpCTE9DS1JPVyBpbnB1dF9yb3csIEpCTE9DS1JPVyBvdXRwdXRfcm93LAotCQkJCSAgSkRJTUVOU0lPTiBudW1fYmxvY2tzKSk7Ci1FWFRFUk4odm9pZCkganplcm9fZmFyIEpQUCgodm9pZCBGQVIgKiB0YXJnZXQsIHNpemVfdCBieXRlc3RvemVybykpOwotLyogQ29uc3RhbnQgdGFibGVzIGluIGp1dGlscy5jICovCi0jaWYgMAkJCQkvKiBUaGlzIHRhYmxlIGlzIG5vdCBhY3R1YWxseSBuZWVkZWQgaW4gdjZhICovCi1leHRlcm4gY29uc3QgaW50IGpwZWdfemlnemFnX29yZGVyW107IC8qIG5hdHVyYWwgY29lZiBvcmRlciB0byB6aWd6YWcgb3JkZXIgKi8KLSNlbmRpZgotZXh0ZXJuIGNvbnN0IGludCBqcGVnX25hdHVyYWxfb3JkZXJbXTsgLyogemlnemFnIGNvZWYgb3JkZXIgdG8gbmF0dXJhbCBvcmRlciAqLwotCi0vKiBTdXBwcmVzcyB1bmRlZmluZWQtc3RydWN0dXJlIGNvbXBsYWludHMgaWYgbmVjZXNzYXJ5LiAqLwotCi0jaWZkZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KLSNpZm5kZWYgQU1fTUVNT1JZX01BTkFHRVIJLyogb25seSBqbWVtbWdyLmMgZGVmaW5lcyB0aGVzZSAqLwotc3RydWN0IGp2aXJ0X3NhcnJheV9jb250cm9sIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqdmlydF9iYXJyYXlfY29udHJvbCB7IGxvbmcgZHVtbXk7IH07Ci0jZW5kaWYKLSNlbmRpZiAvKiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTiAqLwpkaWZmIC0tZ2l0IGEvY29yZS9pbmNsdWRlL3RoaXJkcGFydGllcy9saWJqcGVnL2pwZWdsaWIuaCBiL2NvcmUvaW5jbHVkZS90aGlyZHBhcnRpZXMvbGlianBlZy9qcGVnbGliLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZTVhYjcuLjAwMDAwMDAKLS0tIGEvY29yZS9pbmNsdWRlL3RoaXJkcGFydGllcy9saWJqcGVnL2pwZWdsaWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNjUgKzAsMCBAQAotLyoKLSAqIGpwZWdsaWIuaAotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGRlZmluZXMgdGhlIGFwcGxpY2F0aW9uIGludGVyZmFjZSBmb3IgdGhlIEpQRUcgbGlicmFyeS4KLSAqIE1vc3QgYXBwbGljYXRpb25zIHVzaW5nIHRoZSBsaWJyYXJ5IG5lZWQgb25seSBpbmNsdWRlIHRoaXMgZmlsZSwKLSAqIGFuZCBwZXJoYXBzIGplcnJvci5oIGlmIHRoZXkgd2FudCB0byBrbm93IHRoZSBleGFjdCBlcnJvciBjb2Rlcy4KLSAqLwotCi0jaWZuZGVmIEpQRUdMSUJfSAotI2RlZmluZSBKUEVHTElCX0gKLQotI2RlZmluZSBGT1hJVF9QUkVGSVgob3JpZ05hbWUpICBGUERGQVBJSlBFR18jI29yaWdOYW1lCi0KLSNkZWZpbmUgamNvcHlfYmxvY2tfcm93IEZPWElUX1BSRUZJWChqY29weV9ibG9ja19yb3cpCi0jZGVmaW5lIGpjb3B5X3NhbXBsZV9yb3dzIEZPWElUX1BSRUZJWChqY29weV9zYW1wbGVfcm93cykKLSNkZWZpbmUgamRpdl9yb3VuZF91cCBGT1hJVF9QUkVGSVgoamRpdl9yb3VuZF91cCkKLSNkZWZpbmUgamluaXRfMXBhc3NfcXVhbnRpemVyIEZPWElUX1BSRUZJWChqaW5pdF8xcGFzc19xdWFudGl6ZXIpCi0jZGVmaW5lIGppbml0XzJwYXNzX3F1YW50aXplciBGT1hJVF9QUkVGSVgoamluaXRfMnBhc3NfcXVhbnRpemVyKQotI2RlZmluZSBqaW5pdF9jb2xvcl9kZWNvbnZlcnRlciBGT1hJVF9QUkVGSVgoamluaXRfY29sb3JfZGVjb252ZXJ0ZXIpCi0jZGVmaW5lIGppbml0X2RfY29lZl9jb250cm9sbGVyIEZPWElUX1BSRUZJWChqaW5pdF9kX2NvZWZfY29udHJvbGxlcikKLSNkZWZpbmUgamluaXRfZF9tYWluX2NvbnRyb2xsZXIgRk9YSVRfUFJFRklYKGppbml0X2RfbWFpbl9jb250cm9sbGVyKQotI2RlZmluZSBqaW5pdF9kX3Bvc3RfY29udHJvbGxlciBGT1hJVF9QUkVGSVgoamluaXRfZF9wb3N0X2NvbnRyb2xsZXIpCi0jZGVmaW5lIGppbml0X2h1ZmZfZGVjb2RlciBGT1hJVF9QUkVGSVgoamluaXRfaHVmZl9kZWNvZGVyKQotI2RlZmluZSBqaW5pdF9pbnB1dF9jb250cm9sbGVyIEZPWElUX1BSRUZJWChqaW5pdF9pbnB1dF9jb250cm9sbGVyKQotI2RlZmluZSBqaW5pdF9pbnZlcnNlX2RjdCBGT1hJVF9QUkVGSVgoamluaXRfaW52ZXJzZV9kY3QpCi0jZGVmaW5lIGppbml0X21hcmtlcl9yZWFkZXIgRk9YSVRfUFJFRklYKGppbml0X21hcmtlcl9yZWFkZXIpCi0jZGVmaW5lIGppbml0X21hc3Rlcl9kZWNvbXByZXNzIEZPWElUX1BSRUZJWChqaW5pdF9tYXN0ZXJfZGVjb21wcmVzcykKLSNkZWZpbmUgamluaXRfbWVtb3J5X21nciBGT1hJVF9QUkVGSVgoamluaXRfbWVtb3J5X21ncikKLSNkZWZpbmUgamluaXRfbWVyZ2VkX3Vwc2FtcGxlciBGT1hJVF9QUkVGSVgoamluaXRfbWVyZ2VkX3Vwc2FtcGxlcikKLSNkZWZpbmUgamluaXRfcGh1ZmZfZGVjb2RlciBGT1hJVF9QUkVGSVgoamluaXRfcGh1ZmZfZGVjb2RlcikKLSNkZWZpbmUgamluaXRfdXBzYW1wbGVyIEZPWElUX1BSRUZJWChqaW5pdF91cHNhbXBsZXIpCi0jZGVmaW5lIGpwZWdfQ3JlYXRlRGVjb21wcmVzcyBGT1hJVF9QUkVGSVgoanBlZ19DcmVhdGVEZWNvbXByZXNzKQotI2RlZmluZSBqcGVnX2Fib3J0IEZPWElUX1BSRUZJWChqcGVnX2Fib3J0KQotI2RlZmluZSBqcGVnX2Fib3J0X2RlY29tcHJlc3MgRk9YSVRfUFJFRklYKGpwZWdfYWJvcnRfZGVjb21wcmVzcykKLSNkZWZpbmUganBlZ19hbGxvY19odWZmX3RhYmxlIEZPWElUX1BSRUZJWChqcGVnX2FsbG9jX2h1ZmZfdGFibGUpCi0jZGVmaW5lIGpwZWdfYWxsb2NfcXVhbnRfdGFibGUgRk9YSVRfUFJFRklYKGpwZWdfYWxsb2NfcXVhbnRfdGFibGUpCi0jZGVmaW5lIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucyBGT1hJVF9QUkVGSVgoanBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKQotI2RlZmluZSBqcGVnX2NvbnN1bWVfaW5wdXQgRk9YSVRfUFJFRklYKGpwZWdfY29uc3VtZV9pbnB1dCkKLSNkZWZpbmUganBlZ19kZXN0cm95IEZPWElUX1BSRUZJWChqcGVnX2Rlc3Ryb3kpCi0jZGVmaW5lIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzIEZPWElUX1BSRUZJWChqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcykKLSNkZWZpbmUganBlZ19maWxsX2JpdF9idWZmZXIgRk9YSVRfUFJFRklYKGpwZWdfZmlsbF9iaXRfYnVmZmVyKQotI2RlZmluZSBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzIEZPWElUX1BSRUZJWChqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKQotI2RlZmluZSBqcGVnX2ZpbmlzaF9vdXRwdXQgRk9YSVRfUFJFRklYKGpwZWdfZmluaXNoX291dHB1dCkKLSNkZWZpbmUganBlZ19mcmVlX2xhcmdlIEZPWElUX1BSRUZJWChqcGVnX2ZyZWVfbGFyZ2UpCi0jZGVmaW5lIGpwZWdfZnJlZV9zbWFsbCBGT1hJVF9QUkVGSVgoanBlZ19mcmVlX3NtYWxsKQotI2RlZmluZSBqcGVnX2dldF9sYXJnZSBGT1hJVF9QUkVGSVgoanBlZ19nZXRfbGFyZ2UpCi0jZGVmaW5lIGpwZWdfZ2V0X3NtYWxsIEZPWElUX1BSRUZJWChqcGVnX2dldF9zbWFsbCkKLSNkZWZpbmUganBlZ19oYXNfbXVsdGlwbGVfc2NhbnMgRk9YSVRfUFJFRklYKGpwZWdfaGFzX211bHRpcGxlX3NjYW5zKQotI2RlZmluZSBqcGVnX2h1ZmZfZGVjb2RlIEZPWElUX1BSRUZJWChqcGVnX2h1ZmZfZGVjb2RlKQotI2RlZmluZSBqcGVnX2lkY3RfMXgxIEZPWElUX1BSRUZJWChqcGVnX2lkY3RfMXgxKQotI2RlZmluZSBqcGVnX2lkY3RfMngyIEZPWElUX1BSRUZJWChqcGVnX2lkY3RfMngyKQotI2RlZmluZSBqcGVnX2lkY3RfNHg0IEZPWElUX1BSRUZJWChqcGVnX2lkY3RfNHg0KQotI2RlZmluZSBqcGVnX2lkY3RfZmxvYXQgRk9YSVRfUFJFRklYKGpwZWdfaWRjdF9mbG9hdCkKLSNkZWZpbmUganBlZ19pZGN0X2lmYXN0IEZPWElUX1BSRUZJWChqcGVnX2lkY3RfaWZhc3QpCi0jZGVmaW5lIGpwZWdfaWRjdF9pc2xvdyBGT1hJVF9QUkVGSVgoanBlZ19pZGN0X2lzbG93KQotI2RlZmluZSBqcGVnX2lucHV0X2NvbXBsZXRlIEZPWElUX1BSRUZJWChqcGVnX2lucHV0X2NvbXBsZXRlKQotI2RlZmluZSBqcGVnX21ha2VfZF9kZXJpdmVkX3RibCBGT1hJVF9QUkVGSVgoanBlZ19tYWtlX2RfZGVyaXZlZF90YmwpCi0jZGVmaW5lIGpwZWdfbWVtX2F2YWlsYWJsZSBGT1hJVF9QUkVGSVgoanBlZ19tZW1fYXZhaWxhYmxlKQotI2RlZmluZSBqcGVnX21lbV9pbml0IEZPWElUX1BSRUZJWChqcGVnX21lbV9pbml0KQotI2RlZmluZSBqcGVnX21lbV90ZXJtIEZPWElUX1BSRUZJWChqcGVnX21lbV90ZXJtKQotI2RlZmluZSBqcGVnX25hdHVyYWxfb3JkZXIgRk9YSVRfUFJFRklYKGpwZWdfbmF0dXJhbF9vcmRlcikKLSNkZWZpbmUganBlZ19uZXdfY29sb3JtYXAgRk9YSVRfUFJFRklYKGpwZWdfbmV3X2NvbG9ybWFwKQotI2RlZmluZSBqcGVnX29wZW5fYmFja2luZ19zdG9yZSBGT1hJVF9QUkVGSVgoanBlZ19vcGVuX2JhY2tpbmdfc3RvcmUpCi0jZGVmaW5lIGpwZWdfcmVhZF9jb2VmZmljaWVudHMgRk9YSVRfUFJFRklYKGpwZWdfcmVhZF9jb2VmZmljaWVudHMpCi0jZGVmaW5lIGpwZWdfcmVhZF9oZWFkZXIgRk9YSVRfUFJFRklYKGpwZWdfcmVhZF9oZWFkZXIpCi0jZGVmaW5lIGpwZWdfcmVhZF9yYXdfZGF0YSBGT1hJVF9QUkVGSVgoanBlZ19yZWFkX3Jhd19kYXRhKQotI2RlZmluZSBqcGVnX3JlYWRfc2NhbmxpbmVzIEZPWElUX1BSRUZJWChqcGVnX3JlYWRfc2NhbmxpbmVzKQotI2RlZmluZSBqcGVnX3Jlc3luY190b19yZXN0YXJ0IEZPWElUX1BSRUZJWChqcGVnX3Jlc3luY190b19yZXN0YXJ0KQotI2RlZmluZSBqcGVnX3NhdmVfbWFya2VycyBGT1hJVF9QUkVGSVgoanBlZ19zYXZlX21hcmtlcnMpCi0jZGVmaW5lIGpwZWdfc2V0X21hcmtlcl9wcm9jZXNzb3IgRk9YSVRfUFJFRklYKGpwZWdfc2V0X21hcmtlcl9wcm9jZXNzb3IpCi0jZGVmaW5lIGpwZWdfc3RhcnRfZGVjb21wcmVzcyBGT1hJVF9QUkVGSVgoanBlZ19zdGFydF9kZWNvbXByZXNzKQotI2RlZmluZSBqcGVnX3N0YXJ0X291dHB1dCBGT1hJVF9QUkVGSVgoanBlZ19zdGFydF9vdXRwdXQpCi0jZGVmaW5lIGpwZWdfc3RkX2Vycm9yIEZPWElUX1BSRUZJWChqcGVnX3N0ZF9lcnJvcikKLSNkZWZpbmUganBlZ19zdGRfbWVzc2FnZV90YWJsZSBGT1hJVF9QUkVGSVgoanBlZ19zdGRfbWVzc2FnZV90YWJsZSkKLSNkZWZpbmUganBlZ19zdGRpb19zcmMgRk9YSVRfUFJFRklYKGpwZWdfc3RkaW9fc3JjKQotI2RlZmluZSBqcm91bmRfdXAgRk9YSVRfUFJFRklYKGpyb3VuZF91cCkKLSNkZWZpbmUganplcm9fZmFyIEZPWElUX1BSRUZJWChqemVyb19mYXIpCi0KLSAvKgotICogRmlyc3Qgd2UgaW5jbHVkZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyB0aGF0IHJlY29yZCBob3cgdGhpcwotICogaW5zdGFsbGF0aW9uIG9mIHRoZSBKUEVHIGxpYnJhcnkgaXMgc2V0IHVwLiAgamNvbmZpZy5oIGNhbiBiZQotICogZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZm9yIG1hbnkgc3lzdGVtcy4gIGptb3JlY2ZnLmggY29udGFpbnMKLSAqIG1hbnVhbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBtb3N0IHBlb3BsZSBuZWVkIG5vdCB3b3JyeSBhYm91dC4KLSAqLwotCi0jaWZuZGVmIEpDT05GSUdfSU5DTFVERUQJLyogaW4gY2FzZSBqaW5jbHVkZS5oIGFscmVhZHkgZGlkICovCi0jaW5jbHVkZSAiamNvbmZpZy5oIgkJLyogd2lkZWx5IHVzZWQgY29uZmlndXJhdGlvbiBvcHRpb25zICovCi0jZW5kaWYKLSNpbmNsdWRlICJqbW9yZWNmZy5oIgkJLyogc2VsZG9tIGNoYW5nZWQgb3B0aW9ucyAqLwotCi0KLS8qIFZlcnNpb24gSUQgZm9yIHRoZSBKUEVHIGxpYnJhcnkuCi0gKiBNaWdodCBiZSB1c2VmdWwgZm9yIHRlc3RzIGxpa2UgIiNpZiBKUEVHX0xJQl9WRVJTSU9OID49IDYwIi4KLSAqLwotCi0jZGVmaW5lIEpQRUdfTElCX1ZFUlNJT04gIDYyCS8qIFZlcnNpb24gNmIgKi8KLQotCi0vKiBWYXJpb3VzIGNvbnN0YW50cyBkZXRlcm1pbmluZyB0aGUgc2l6ZXMgb2YgdGhpbmdzLgotICogQWxsIG9mIHRoZXNlIGFyZSBzcGVjaWZpZWQgYnkgdGhlIEpQRUcgc3RhbmRhcmQsIHNvIGRvbid0IGNoYW5nZSB0aGVtCi0gKiBpZiB5b3Ugd2FudCB0byBiZSBjb21wYXRpYmxlLgotICovCi0KLSNkZWZpbmUgRENUU0laRQkJICAgIDgJLyogVGhlIGJhc2ljIERDVCBibG9jayBpcyA4eDggc2FtcGxlcyAqLwotI2RlZmluZSBEQ1RTSVpFMgkgICAgNjQJLyogRENUU0laRSBzcXVhcmVkOyAjIG9mIGVsZW1lbnRzIGluIGEgYmxvY2sgKi8KLSNkZWZpbmUgTlVNX1FVQU5UX1RCTFMgICAgICA0CS8qIFF1YW50aXphdGlvbiB0YWJsZXMgYXJlIG51bWJlcmVkIDAuLjMgKi8KLSNkZWZpbmUgTlVNX0hVRkZfVEJMUyAgICAgICA0CS8qIEh1ZmZtYW4gdGFibGVzIGFyZSBudW1iZXJlZCAwLi4zICovCi0jZGVmaW5lIE5VTV9BUklUSF9UQkxTICAgICAgMTYJLyogQXJpdGgtY29kaW5nIHRhYmxlcyBhcmUgbnVtYmVyZWQgMC4uMTUgKi8KLSNkZWZpbmUgTUFYX0NPTVBTX0lOX1NDQU4gICA0CS8qIEpQRUcgbGltaXQgb24gIyBvZiBjb21wb25lbnRzIGluIG9uZSBzY2FuICovCi0jZGVmaW5lIE1BWF9TQU1QX0ZBQ1RPUiAgICAgNAkvKiBKUEVHIGxpbWl0IG9uIHNhbXBsaW5nIGZhY3RvcnMgKi8KLS8qIFVuZm9ydHVuYXRlbHksIHNvbWUgYm96byBhdCBBZG9iZSBzYXcgbm8gcmVhc29uIHRvIGJlIGJvdW5kIGJ5IHRoZSBzdGFuZGFyZDsKLSAqIHRoZSBQb3N0U2NyaXB0IERDVCBmaWx0ZXIgY2FuIGVtaXQgZmlsZXMgd2l0aCBtYW55IG1vcmUgdGhhbiAxMCBibG9ja3MvTUNVLgotICogSWYgeW91IGhhcHBlbiB0byBydW4gYWNyb3NzIHN1Y2ggYSBmaWxlLCB5b3UgY2FuIHVwIERfTUFYX0JMT0NLU19JTl9NQ1UKLSAqIHRvIGhhbmRsZSBpdC4gIFdlIGV2ZW4gbGV0IHlvdSBkbyB0aGlzIGZyb20gdGhlIGpjb25maWcuaCBmaWxlLiAgSG93ZXZlciwKLSAqIHdlIHN0cm9uZ2x5IGRpc2NvdXJhZ2UgY2hhbmdpbmcgQ19NQVhfQkxPQ0tTX0lOX01DVTsganVzdCBiZWNhdXNlIEFkb2JlCi0gKiBzb21ldGltZXMgZW1pdHMgbm9uY29tcGxpYW50IGZpbGVzIGRvZXNuJ3QgbWVhbiB5b3Ugc2hvdWxkIHRvby4KLSAqLwotI2RlZmluZSBDX01BWF9CTE9DS1NfSU5fTUNVICAgMTAgLyogY29tcHJlc3NvcidzIGxpbWl0IG9uIGJsb2NrcyBwZXIgTUNVICovCi0jaWZuZGVmIERfTUFYX0JMT0NLU19JTl9NQ1UKLSNkZWZpbmUgRF9NQVhfQkxPQ0tTX0lOX01DVSAgIDEwIC8qIGRlY29tcHJlc3NvcidzIGxpbWl0IG9uIGJsb2NrcyBwZXIgTUNVICovCi0jZW5kaWYKLQotCi0vKiBEYXRhIHN0cnVjdHVyZXMgZm9yIGltYWdlcyAoYXJyYXlzIG9mIHNhbXBsZXMgYW5kIG9mIERDVCBjb2VmZmljaWVudHMpLgotICogT24gODB4ODYgbWFjaGluZXMsIHRoZSBpbWFnZSBhcnJheXMgYXJlIHRvbyBiaWcgZm9yIG5lYXIgcG9pbnRlcnMsCi0gKiBidXQgdGhlIHBvaW50ZXIgYXJyYXlzIGNhbiBmaXQgaW4gbmVhciBtZW1vcnkuCi0gKi8KLQotdHlwZWRlZiBKU0FNUExFICAqSlNBTVBST1c7CS8qIHB0ciB0byBvbmUgaW1hZ2Ugcm93IG9mIHBpeGVsIHNhbXBsZXMuICovCi10eXBlZGVmIEpTQU1QUk9XICpKU0FNUEFSUkFZOwkvKiBwdHIgdG8gc29tZSByb3dzIChhIDItRCBzYW1wbGUgYXJyYXkpICovCi10eXBlZGVmIEpTQU1QQVJSQVkgKkpTQU1QSU1BR0U7CS8qIGEgMy1EIHNhbXBsZSBhcnJheTogdG9wIGluZGV4IGlzIGNvbG9yICovCi0KLXR5cGVkZWYgSkNPRUYgSkJMT0NLW0RDVFNJWkUyXTsJLyogb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cyAqLwotdHlwZWRlZiBKQkxPQ0sgICpKQkxPQ0tST1c7CS8qIHBvaW50ZXIgdG8gb25lIHJvdyBvZiBjb2VmZmljaWVudCBibG9ja3MgKi8KLXR5cGVkZWYgSkJMT0NLUk9XICpKQkxPQ0tBUlJBWTsJCS8qIGEgMi1EIGFycmF5IG9mIGNvZWZmaWNpZW50IGJsb2NrcyAqLwotdHlwZWRlZiBKQkxPQ0tBUlJBWSAqSkJMT0NLSU1BR0U7CS8qIGEgMy1EIGFycmF5IG9mIGNvZWZmaWNpZW50IGJsb2NrcyAqLwotCi10eXBlZGVmIEpDT0VGICAqSkNPRUZQVFI7CS8qIHVzZWZ1bCBpbiBhIGNvdXBsZSBvZiBwbGFjZXMgKi8KLQotCi0vKiBUeXBlcyBmb3IgSlBFRyBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGFuZCB3b3JraW5nIHRhYmxlcy4gKi8KLQotCi0vKiBEQ1QgY29lZmZpY2llbnQgcXVhbnRpemF0aW9uIHRhYmxlcy4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBUaGlzIGFycmF5IGdpdmVzIHRoZSBjb2VmZmljaWVudCBxdWFudGl6ZXJzIGluIG5hdHVyYWwgYXJyYXkgb3JkZXIKLSAgICogKG5vdCB0aGUgemlnemFnIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIHN0b3JlZCBpbiBhIEpQRUcgRFFUIG1hcmtlcikuCi0gICAqIENBVVRJT046IElKRyB2ZXJzaW9ucyBwcmlvciB0byB2NmEga2VwdCB0aGlzIGFycmF5IGluIHppZ3phZyBvcmRlci4KLSAgICovCi0gIFVJTlQxNiBxdWFudHZhbFtEQ1RTSVpFMl07CS8qIHF1YW50aXphdGlvbiBzdGVwIGZvciBlYWNoIGNvZWZmaWNpZW50ICovCi0gIC8qIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGR1cmluZyBjb21wcmVzc2lvbi4gIEl0J3MgaW5pdGlhbGl6ZWQgRkFMU0Ugd2hlbgotICAgKiB0aGUgdGFibGUgaXMgY3JlYXRlZCwgYW5kIHNldCBUUlVFIHdoZW4gaXQncyBiZWVuIG91dHB1dCB0byB0aGUgZmlsZS4KLSAgICogWW91IGNvdWxkIHN1cHByZXNzIG91dHB1dCBvZiBhIHRhYmxlIGJ5IHNldHRpbmcgdGhpcyB0byBUUlVFLgotICAgKiAoU2VlIGpwZWdfc3VwcHJlc3NfdGFibGVzIGZvciBhbiBleGFtcGxlLikKLSAgICovCi0gIGJvb2xlYW4gc2VudF90YWJsZTsJCS8qIFRSVUUgd2hlbiB0YWJsZSBoYXMgYmVlbiBvdXRwdXQgKi8KLX0gSlFVQU5UX1RCTDsKLQotCi0vKiBIdWZmbWFuIGNvZGluZyB0YWJsZXMuICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogVGhlc2UgdHdvIGZpZWxkcyBkaXJlY3RseSByZXByZXNlbnQgdGhlIGNvbnRlbnRzIG9mIGEgSlBFRyBESFQgbWFya2VyICovCi0gIFVJTlQ4IGJpdHNbMTddOwkJLyogYml0c1trXSA9ICMgb2Ygc3ltYm9scyB3aXRoIGNvZGVzIG9mICovCi0JCQkJLyogbGVuZ3RoIGsgYml0czsgYml0c1swXSBpcyB1bnVzZWQgKi8KLSAgVUlOVDggaHVmZnZhbFsyNTZdOwkJLyogVGhlIHN5bWJvbHMsIGluIG9yZGVyIG9mIGluY3IgY29kZSBsZW5ndGggKi8KLSAgLyogVGhpcyBmaWVsZCBpcyB1c2VkIG9ubHkgZHVyaW5nIGNvbXByZXNzaW9uLiAgSXQncyBpbml0aWFsaXplZCBGQUxTRSB3aGVuCi0gICAqIHRoZSB0YWJsZSBpcyBjcmVhdGVkLCBhbmQgc2V0IFRSVUUgd2hlbiBpdCdzIGJlZW4gb3V0cHV0IHRvIHRoZSBmaWxlLgotICAgKiBZb3UgY291bGQgc3VwcHJlc3Mgb3V0cHV0IG9mIGEgdGFibGUgYnkgc2V0dGluZyB0aGlzIHRvIFRSVUUuCi0gICAqIChTZWUganBlZ19zdXBwcmVzc190YWJsZXMgZm9yIGFuIGV4YW1wbGUuKQotICAgKi8KLSAgYm9vbGVhbiBzZW50X3RhYmxlOwkJLyogVFJVRSB3aGVuIHRhYmxlIGhhcyBiZWVuIG91dHB1dCAqLwotfSBKSFVGRl9UQkw7Ci0KLQotLyogQmFzaWMgaW5mbyBhYm91dCBvbmUgY29tcG9uZW50IChjb2xvciBjaGFubmVsKS4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBUaGVzZSB2YWx1ZXMgYXJlIGZpeGVkIG92ZXIgdGhlIHdob2xlIGltYWdlLiAqLwotICAvKiBGb3IgY29tcHJlc3Npb24sIHRoZXkgbXVzdCBiZSBzdXBwbGllZCBieSBwYXJhbWV0ZXIgc2V0dXA7ICovCi0gIC8qIGZvciBkZWNvbXByZXNzaW9uLCB0aGV5IGFyZSByZWFkIGZyb20gdGhlIFNPRiBtYXJrZXIuICovCi0gIGludCBjb21wb25lbnRfaWQ7CQkvKiBpZGVudGlmaWVyIGZvciB0aGlzIGNvbXBvbmVudCAoMC4uMjU1KSAqLwotICBpbnQgY29tcG9uZW50X2luZGV4OwkJLyogaXRzIGluZGV4IGluIFNPRiBvciBjaW5mby0+Y29tcF9pbmZvW10gKi8KLSAgaW50IGhfc2FtcF9mYWN0b3I7CQkvKiBob3Jpem9udGFsIHNhbXBsaW5nIGZhY3RvciAoMS4uNCkgKi8KLSAgaW50IHZfc2FtcF9mYWN0b3I7CQkvKiB2ZXJ0aWNhbCBzYW1wbGluZyBmYWN0b3IgKDEuLjQpICovCi0gIGludCBxdWFudF90Ymxfbm87CQkvKiBxdWFudGl6YXRpb24gdGFibGUgc2VsZWN0b3IgKDAuLjMpICovCi0gIC8qIFRoZXNlIHZhbHVlcyBtYXkgdmFyeSBiZXR3ZWVuIHNjYW5zLiAqLwotICAvKiBGb3IgY29tcHJlc3Npb24sIHRoZXkgbXVzdCBiZSBzdXBwbGllZCBieSBwYXJhbWV0ZXIgc2V0dXA7ICovCi0gIC8qIGZvciBkZWNvbXByZXNzaW9uLCB0aGV5IGFyZSByZWFkIGZyb20gdGhlIFNPUyBtYXJrZXIuICovCi0gIC8qIFRoZSBkZWNvbXByZXNzb3Igb3V0cHV0IHNpZGUgbWF5IG5vdCB1c2UgdGhlc2UgdmFyaWFibGVzLiAqLwotICBpbnQgZGNfdGJsX25vOwkJLyogREMgZW50cm9weSB0YWJsZSBzZWxlY3RvciAoMC4uMykgKi8KLSAgaW50IGFjX3RibF9ubzsJCS8qIEFDIGVudHJvcHkgdGFibGUgc2VsZWN0b3IgKDAuLjMpICovCi0gIAotICAvKiBSZW1haW5pbmcgZmllbGRzIHNob3VsZCBiZSB0cmVhdGVkIGFzIHByaXZhdGUgYnkgYXBwbGljYXRpb25zLiAqLwotICAKLSAgLyogVGhlc2UgdmFsdWVzIGFyZSBjb21wdXRlZCBkdXJpbmcgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBzdGFydHVwOiAqLwotICAvKiBDb21wb25lbnQncyBzaXplIGluIERDVCBibG9ja3MuCi0gICAqIEFueSBkdW1teSBibG9ja3MgYWRkZWQgdG8gY29tcGxldGUgYW4gTUNVIGFyZSBub3QgY291bnRlZDsgdGhlcmVmb3JlCi0gICAqIHRoZXNlIHZhbHVlcyBkbyBub3QgZGVwZW5kIG9uIHdoZXRoZXIgYSBzY2FuIGlzIGludGVybGVhdmVkIG9yIG5vdC4KLSAgICovCi0gIEpESU1FTlNJT04gd2lkdGhfaW5fYmxvY2tzOwotICBKRElNRU5TSU9OIGhlaWdodF9pbl9ibG9ja3M7Ci0gIC8qIFNpemUgb2YgYSBEQ1QgYmxvY2sgaW4gc2FtcGxlcy4gIEFsd2F5cyBEQ1RTSVpFIGZvciBjb21wcmVzc2lvbi4KLSAgICogRm9yIGRlY29tcHJlc3Npb24gdGhpcyBpcyB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGZyb20gb25lIERDVCBibG9jaywKLSAgICogcmVmbGVjdGluZyBhbnkgc2NhbGluZyB3ZSBjaG9vc2UgdG8gYXBwbHkgZHVyaW5nIHRoZSBJRENUIHN0ZXAuCi0gICAqIFZhbHVlcyBvZiAxLDIsNCw4IGFyZSBsaWtlbHkgdG8gYmUgc3VwcG9ydGVkLiAgTm90ZSB0aGF0IGRpZmZlcmVudAotICAgKiBjb21wb25lbnRzIG1heSByZWNlaXZlIGRpZmZlcmVudCBJRENUIHNjYWxpbmdzLgotICAgKi8KLSAgaW50IERDVF9zY2FsZWRfc2l6ZTsKLSAgLyogVGhlIGRvd25zYW1wbGVkIGRpbWVuc2lvbnMgYXJlIHRoZSBjb21wb25lbnQncyBhY3R1YWwsIHVucGFkZGVkIG51bWJlcgotICAgKiBvZiBzYW1wbGVzIGF0IHRoZSBtYWluIGJ1ZmZlciAocHJlcHJvY2Vzc2luZy9jb21wcmVzc2lvbiBpbnRlcmZhY2UpLCB0aHVzCi0gICAqIGRvd25zYW1wbGVkX3dpZHRoID0gY2VpbChpbWFnZV93aWR0aCAqIEhpL0htYXgpCi0gICAqIGFuZCBzaW1pbGFybHkgZm9yIGhlaWdodC4gIEZvciBkZWNvbXByZXNzaW9uLCBJRENUIHNjYWxpbmcgaXMgaW5jbHVkZWQsIHNvCi0gICAqIGRvd25zYW1wbGVkX3dpZHRoID0gY2VpbChpbWFnZV93aWR0aCAqIEhpL0htYXggKiBEQ1Rfc2NhbGVkX3NpemUvRENUU0laRSkKLSAgICovCi0gIEpESU1FTlNJT04gZG93bnNhbXBsZWRfd2lkdGg7CSAvKiBhY3R1YWwgd2lkdGggaW4gc2FtcGxlcyAqLwotICBKRElNRU5TSU9OIGRvd25zYW1wbGVkX2hlaWdodDsgLyogYWN0dWFsIGhlaWdodCBpbiBzYW1wbGVzICovCi0gIC8qIFRoaXMgZmxhZyBpcyB1c2VkIG9ubHkgZm9yIGRlY29tcHJlc3Npb24uICBJbiBjYXNlcyB3aGVyZSBzb21lIG9mIHRoZQotICAgKiBjb21wb25lbnRzIHdpbGwgYmUgaWdub3JlZCAoZWcgZ3JheXNjYWxlIG91dHB1dCBmcm9tIFlDYkNyIGltYWdlKSwKLSAgICogd2UgY2FuIHNraXAgbW9zdCBjb21wdXRhdGlvbnMgZm9yIHRoZSB1bnVzZWQgY29tcG9uZW50cy4KLSAgICovCi0gIGJvb2xlYW4gY29tcG9uZW50X25lZWRlZDsJLyogZG8gd2UgbmVlZCB0aGUgdmFsdWUgb2YgdGhpcyBjb21wb25lbnQ/ICovCi0KLSAgLyogVGhlc2UgdmFsdWVzIGFyZSBjb21wdXRlZCBiZWZvcmUgc3RhcnRpbmcgYSBzY2FuIG9mIHRoZSBjb21wb25lbnQuICovCi0gIC8qIFRoZSBkZWNvbXByZXNzb3Igb3V0cHV0IHNpZGUgbWF5IG5vdCB1c2UgdGhlc2UgdmFyaWFibGVzLiAqLwotICBpbnQgTUNVX3dpZHRoOwkJLyogbnVtYmVyIG9mIGJsb2NrcyBwZXIgTUNVLCBob3Jpem9udGFsbHkgKi8KLSAgaW50IE1DVV9oZWlnaHQ7CQkvKiBudW1iZXIgb2YgYmxvY2tzIHBlciBNQ1UsIHZlcnRpY2FsbHkgKi8KLSAgaW50IE1DVV9ibG9ja3M7CQkvKiBNQ1Vfd2lkdGggKiBNQ1VfaGVpZ2h0ICovCi0gIGludCBNQ1Vfc2FtcGxlX3dpZHRoOwkJLyogTUNVIHdpZHRoIGluIHNhbXBsZXMsIE1DVV93aWR0aCpEQ1Rfc2NhbGVkX3NpemUgKi8KLSAgaW50IGxhc3RfY29sX3dpZHRoOwkJLyogIyBvZiBub24tZHVtbXkgYmxvY2tzIGFjcm9zcyBpbiBsYXN0IE1DVSAqLwotICBpbnQgbGFzdF9yb3dfaGVpZ2h0OwkJLyogIyBvZiBub24tZHVtbXkgYmxvY2tzIGRvd24gaW4gbGFzdCBNQ1UgKi8KLQotICAvKiBTYXZlZCBxdWFudGl6YXRpb24gdGFibGUgZm9yIGNvbXBvbmVudDsgTlVMTCBpZiBub25lIHlldCBzYXZlZC4KLSAgICogU2VlIGpkaW5wdXQuYyBjb21tZW50cyBhYm91dCB0aGUgbmVlZCBmb3IgdGhpcyBpbmZvcm1hdGlvbi4KLSAgICogVGhpcyBmaWVsZCBpcyBjdXJyZW50bHkgdXNlZCBvbmx5IGZvciBkZWNvbXByZXNzaW9uLgotICAgKi8KLSAgSlFVQU5UX1RCTCAqIHF1YW50X3RhYmxlOwotCi0gIC8qIFByaXZhdGUgcGVyLWNvbXBvbmVudCBzdG9yYWdlIGZvciBEQ1Qgb3IgSURDVCBzdWJzeXN0ZW0uICovCi0gIHZvaWQgKiBkY3RfdGFibGU7Ci19IGpwZWdfY29tcG9uZW50X2luZm87Ci0KLQotLyogVGhlIHNjcmlwdCBmb3IgZW5jb2RpbmcgYSBtdWx0aXBsZS1zY2FuIGZpbGUgaXMgYW4gYXJyYXkgb2YgdGhlc2U6ICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IGNvbXBzX2luX3NjYW47CQkvKiBudW1iZXIgb2YgY29tcG9uZW50cyBlbmNvZGVkIGluIHRoaXMgc2NhbiAqLwotICBpbnQgY29tcG9uZW50X2luZGV4W01BWF9DT01QU19JTl9TQ0FOXTsgLyogdGhlaXIgU09GL2NvbXBfaW5mb1tdIGluZGV4ZXMgKi8KLSAgaW50IFNzLCBTZTsJCQkvKiBwcm9ncmVzc2l2ZSBKUEVHIHNwZWN0cmFsIHNlbGVjdGlvbiBwYXJtcyAqLwotICBpbnQgQWgsIEFsOwkJCS8qIHByb2dyZXNzaXZlIEpQRUcgc3VjY2Vzc2l2ZSBhcHByb3guIHBhcm1zICovCi19IGpwZWdfc2Nhbl9pbmZvOwotCi0vKiBUaGUgZGVjb21wcmVzc29yIGNhbiBzYXZlIEFQUG4gYW5kIENPTSBtYXJrZXJzIGluIGEgbGlzdCBvZiB0aGVzZTogKi8KLQotdHlwZWRlZiBzdHJ1Y3QganBlZ19tYXJrZXJfc3RydWN0ICAqIGpwZWdfc2F2ZWRfbWFya2VyX3B0cjsKLQotc3RydWN0IGpwZWdfbWFya2VyX3N0cnVjdCB7Ci0gIGpwZWdfc2F2ZWRfbWFya2VyX3B0ciBuZXh0OwkvKiBuZXh0IGluIGxpc3QsIG9yIE5VTEwgKi8KLSAgVUlOVDggbWFya2VyOwkJCS8qIG1hcmtlciBjb2RlOiBKUEVHX0NPTSwgb3IgSlBFR19BUFAwK24gKi8KLSAgdW5zaWduZWQgaW50IG9yaWdpbmFsX2xlbmd0aDsJLyogIyBieXRlcyBvZiBkYXRhIGluIHRoZSBmaWxlICovCi0gIHVuc2lnbmVkIGludCBkYXRhX2xlbmd0aDsJLyogIyBieXRlcyBvZiBkYXRhIHNhdmVkIGF0IGRhdGFbXSAqLwotICBKT0NURVQgICogZGF0YTsJCS8qIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgbWFya2VyICovCi0gIC8qIHRoZSBtYXJrZXIgbGVuZ3RoIHdvcmQgaXMgbm90IGNvdW50ZWQgaW4gZGF0YV9sZW5ndGggb3Igb3JpZ2luYWxfbGVuZ3RoICovCi19OwotCi0vKiBLbm93biBjb2xvciBzcGFjZXMuICovCi0KLXR5cGVkZWYgZW51bSB7Ci0JSkNTX1VOS05PV04sCQkvKiBlcnJvci91bnNwZWNpZmllZCAqLwotCUpDU19HUkFZU0NBTEUsCQkvKiBtb25vY2hyb21lICovCi0JSkNTX1JHQiwJCS8qIHJlZC9ncmVlbi9ibHVlICovCi0JSkNTX1lDYkNyLAkJLyogWS9DYi9DciAoYWxzbyBrbm93biBhcyBZVVYpICovCi0JSkNTX0NNWUssCQkvKiBDL00vWS9LICovCi0JSkNTX1lDQ0sJCS8qIFkvQ2IvQ3IvSyAqLwotfSBKX0NPTE9SX1NQQUNFOwotCi0vKiBEQ1QvSURDVCBhbGdvcml0aG0gb3B0aW9ucy4gKi8KLQotdHlwZWRlZiBlbnVtIHsKLQlKRENUX0lTTE9XLAkJLyogc2xvdyBidXQgYWNjdXJhdGUgaW50ZWdlciBhbGdvcml0aG0gKi8KLQlKRENUX0lGQVNULAkJLyogZmFzdGVyLCBsZXNzIGFjY3VyYXRlIGludGVnZXIgbWV0aG9kICovCi0JSkRDVF9GTE9BVAkJLyogZmxvYXRpbmctcG9pbnQ6IGFjY3VyYXRlLCBmYXN0IG9uIGZhc3QgSFcgKi8KLX0gSl9EQ1RfTUVUSE9EOwotCi0jaWZuZGVmIEpEQ1RfREVGQVVMVAkJLyogbWF5IGJlIG92ZXJyaWRkZW4gaW4gamNvbmZpZy5oICovCi0jZGVmaW5lIEpEQ1RfREVGQVVMVCAgSkRDVF9JU0xPVwotI2VuZGlmCi0jaWZuZGVmIEpEQ1RfRkFTVEVTVAkJLyogbWF5IGJlIG92ZXJyaWRkZW4gaW4gamNvbmZpZy5oICovCi0jZGVmaW5lIEpEQ1RfRkFTVEVTVCAgSkRDVF9JRkFTVAotI2VuZGlmCi0KLS8qIERpdGhlcmluZyBvcHRpb25zIGZvciBkZWNvbXByZXNzaW9uLiAqLwotCi10eXBlZGVmIGVudW0gewotCUpESVRIRVJfTk9ORSwJCS8qIG5vIGRpdGhlcmluZyAqLwotCUpESVRIRVJfT1JERVJFRCwJLyogc2ltcGxlIG9yZGVyZWQgZGl0aGVyICovCi0JSkRJVEhFUl9GUwkJLyogRmxveWQtU3RlaW5iZXJnIGVycm9yIGRpZmZ1c2lvbiBkaXRoZXIgKi8KLX0gSl9ESVRIRVJfTU9ERTsKLQotCi0vKiBDb21tb24gZmllbGRzIGJldHdlZW4gSlBFRyBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBtYXN0ZXIgc3RydWN0cy4gKi8KLQotI2RlZmluZSBqcGVnX2NvbW1vbl9maWVsZHMgXAotICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKiBlcnI7CS8qIEVycm9yIGhhbmRsZXIgbW9kdWxlICovXAotICBzdHJ1Y3QganBlZ19tZW1vcnlfbWdyICogbWVtOwkvKiBNZW1vcnkgbWFuYWdlciBtb2R1bGUgKi9cCi0gIHN0cnVjdCBqcGVnX3Byb2dyZXNzX21nciAqIHByb2dyZXNzOyAvKiBQcm9ncmVzcyBtb25pdG9yLCBvciBOVUxMIGlmIG5vbmUgKi9cCi0gIHZvaWQgKiBjbGllbnRfZGF0YTsJCS8qIEF2YWlsYWJsZSBmb3IgdXNlIGJ5IGFwcGxpY2F0aW9uICovXAotICBib29sZWFuIGlzX2RlY29tcHJlc3NvcjsJLyogU28gY29tbW9uIGNvZGUgY2FuIHRlbGwgd2hpY2ggaXMgd2hpY2ggKi9cCi0gIGludCBnbG9iYWxfc3RhdGUJCS8qIEZvciBjaGVja2luZyBjYWxsIHNlcXVlbmNlIHZhbGlkaXR5ICovCi0KLS8qIFJvdXRpbmVzIHRoYXQgYXJlIHRvIGJlIHVzZWQgYnkgYm90aCBoYWx2ZXMgb2YgdGhlIGxpYnJhcnkgYXJlIGRlY2xhcmVkCi0gKiB0byByZWNlaXZlIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZS4gIFRoZXJlIGFyZSBubyBhY3R1YWwgaW5zdGFuY2VzIG9mCi0gKiBqcGVnX2NvbW1vbl9zdHJ1Y3QsIG9ubHkgb2YganBlZ19jb21wcmVzc19zdHJ1Y3QgYW5kIGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QuCi0gKi8KLXN0cnVjdCBqcGVnX2NvbW1vbl9zdHJ1Y3QgewotICBqcGVnX2NvbW1vbl9maWVsZHM7CQkvKiBGaWVsZHMgY29tbW9uIHRvIGJvdGggbWFzdGVyIHN0cnVjdCB0eXBlcyAqLwotICAvKiBBZGRpdGlvbmFsIGZpZWxkcyBmb2xsb3cgaW4gYW4gYWN0dWFsIGpwZWdfY29tcHJlc3Nfc3RydWN0IG9yCi0gICAqIGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QuICBBbGwgdGhyZWUgc3RydWN0cyBtdXN0IGFncmVlIG9uIHRoZXNlCi0gICAqIGluaXRpYWwgZmllbGRzISAgKFRoaXMgd291bGQgYmUgYSBsb3QgY2xlYW5lciBpbiBDKysuKQotICAgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IGpwZWdfY29tbW9uX3N0cnVjdCAqIGpfY29tbW9uX3B0cjsKLXR5cGVkZWYgc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0ICogal9jb21wcmVzc19wdHI7Ci10eXBlZGVmIHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0ICogal9kZWNvbXByZXNzX3B0cjsKLQotCi0vKiBNYXN0ZXIgcmVjb3JkIGZvciBhIGNvbXByZXNzaW9uIGluc3RhbmNlICovCi0KLXN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCB7Ci0gIGpwZWdfY29tbW9uX2ZpZWxkczsJCS8qIEZpZWxkcyBzaGFyZWQgd2l0aCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0ICovCi0KLSAgLyogRGVzdGluYXRpb24gZm9yIGNvbXByZXNzZWQgZGF0YSAqLwotICBzdHJ1Y3QganBlZ19kZXN0aW5hdGlvbl9tZ3IgKiBkZXN0OwotCi0gIC8qIERlc2NyaXB0aW9uIG9mIHNvdXJjZSBpbWFnZSAtLS0gdGhlc2UgZmllbGRzIG11c3QgYmUgZmlsbGVkIGluIGJ5Ci0gICAqIG91dGVyIGFwcGxpY2F0aW9uIGJlZm9yZSBzdGFydGluZyBjb21wcmVzc2lvbi4gIGluX2NvbG9yX3NwYWNlIG11c3QKLSAgICogYmUgY29ycmVjdCBiZWZvcmUgeW91IGNhbiBldmVuIGNhbGwganBlZ19zZXRfZGVmYXVsdHMoKS4KLSAgICovCi0KLSAgSkRJTUVOU0lPTiBpbWFnZV93aWR0aDsJLyogaW5wdXQgaW1hZ2Ugd2lkdGggKi8KLSAgSkRJTUVOU0lPTiBpbWFnZV9oZWlnaHQ7CS8qIGlucHV0IGltYWdlIGhlaWdodCAqLwotICBpbnQgaW5wdXRfY29tcG9uZW50czsJCS8qICMgb2YgY29sb3IgY29tcG9uZW50cyBpbiBpbnB1dCBpbWFnZSAqLwotICBKX0NPTE9SX1NQQUNFIGluX2NvbG9yX3NwYWNlOwkvKiBjb2xvcnNwYWNlIG9mIGlucHV0IGltYWdlICovCi0KLSAgZG91YmxlIGlucHV0X2dhbW1hOwkJLyogaW1hZ2UgZ2FtbWEgb2YgaW5wdXQgaW1hZ2UgKi8KLQotICAvKiBDb21wcmVzc2lvbiBwYXJhbWV0ZXJzIC0tLSB0aGVzZSBmaWVsZHMgbXVzdCBiZSBzZXQgYmVmb3JlIGNhbGxpbmcKLSAgICoganBlZ19zdGFydF9jb21wcmVzcygpLiAgV2UgcmVjb21tZW5kIGNhbGxpbmcganBlZ19zZXRfZGVmYXVsdHMoKSB0bwotICAgKiBpbml0aWFsaXplIGV2ZXJ5dGhpbmcgdG8gcmVhc29uYWJsZSBkZWZhdWx0cywgdGhlbiBjaGFuZ2luZyBhbnl0aGluZwotICAgKiB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWNhbGx5IHdhbnRzIHRvIGNoYW5nZS4gIFRoYXQgd2F5IHlvdSB3b24ndCBnZXQKLSAgICogYnVybnQgd2hlbiBuZXcgcGFyYW1ldGVycyBhcmUgYWRkZWQuICBBbHNvIG5vdGUgdGhhdCB0aGVyZSBhcmUgc2V2ZXJhbAotICAgKiBoZWxwZXIgcm91dGluZXMgdG8gc2ltcGxpZnkgY2hhbmdpbmcgcGFyYW1ldGVycy4KLSAgICovCi0KLSAgaW50IGRhdGFfcHJlY2lzaW9uOwkJLyogYml0cyBvZiBwcmVjaXNpb24gaW4gaW1hZ2UgZGF0YSAqLwotCi0gIGludCBudW1fY29tcG9uZW50czsJCS8qICMgb2YgY29sb3IgY29tcG9uZW50cyBpbiBKUEVHIGltYWdlICovCi0gIEpfQ09MT1JfU1BBQ0UganBlZ19jb2xvcl9zcGFjZTsgLyogY29sb3JzcGFjZSBvZiBKUEVHIGltYWdlICovCi0KLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBfaW5mbzsKLSAgLyogY29tcF9pbmZvW2ldIGRlc2NyaWJlcyBjb21wb25lbnQgdGhhdCBhcHBlYXJzIGkndGggaW4gU09GICovCi0gIAotICBKUVVBTlRfVEJMICogcXVhbnRfdGJsX3B0cnNbTlVNX1FVQU5UX1RCTFNdOwotICAvKiBwdHJzIHRvIGNvZWZmaWNpZW50IHF1YW50aXphdGlvbiB0YWJsZXMsIG9yIE5VTEwgaWYgbm90IGRlZmluZWQgKi8KLSAgCi0gIEpIVUZGX1RCTCAqIGRjX2h1ZmZfdGJsX3B0cnNbTlVNX0hVRkZfVEJMU107Ci0gIEpIVUZGX1RCTCAqIGFjX2h1ZmZfdGJsX3B0cnNbTlVNX0hVRkZfVEJMU107Ci0gIC8qIHB0cnMgdG8gSHVmZm1hbiBjb2RpbmcgdGFibGVzLCBvciBOVUxMIGlmIG5vdCBkZWZpbmVkICovCi0gIAotICBVSU5UOCBhcml0aF9kY19MW05VTV9BUklUSF9UQkxTXTsgLyogTCB2YWx1ZXMgZm9yIERDIGFyaXRoLWNvZGluZyB0YWJsZXMgKi8KLSAgVUlOVDggYXJpdGhfZGNfVVtOVU1fQVJJVEhfVEJMU107IC8qIFUgdmFsdWVzIGZvciBEQyBhcml0aC1jb2RpbmcgdGFibGVzICovCi0gIFVJTlQ4IGFyaXRoX2FjX0tbTlVNX0FSSVRIX1RCTFNdOyAvKiBLeCB2YWx1ZXMgZm9yIEFDIGFyaXRoLWNvZGluZyB0YWJsZXMgKi8KLQotICBpbnQgbnVtX3NjYW5zOwkJLyogIyBvZiBlbnRyaWVzIGluIHNjYW5faW5mbyBhcnJheSAqLwotICBjb25zdCBqcGVnX3NjYW5faW5mbyAqIHNjYW5faW5mbzsgLyogc2NyaXB0IGZvciBtdWx0aS1zY2FuIGZpbGUsIG9yIE5VTEwgKi8KLSAgLyogVGhlIGRlZmF1bHQgdmFsdWUgb2Ygc2Nhbl9pbmZvIGlzIE5VTEwsIHdoaWNoIGNhdXNlcyBhIHNpbmdsZS1zY2FuCi0gICAqIHNlcXVlbnRpYWwgSlBFRyBmaWxlIHRvIGJlIGVtaXR0ZWQuICBUbyBjcmVhdGUgYSBtdWx0aS1zY2FuIGZpbGUsCi0gICAqIHNldCBudW1fc2NhbnMgYW5kIHNjYW5faW5mbyB0byBwb2ludCB0byBhbiBhcnJheSBvZiBzY2FuIGRlZmluaXRpb25zLgotICAgKi8KLQotICBib29sZWFuIHJhd19kYXRhX2luOwkJLyogVFJVRT1jYWxsZXIgc3VwcGxpZXMgZG93bnNhbXBsZWQgZGF0YSAqLwotICBib29sZWFuIGFyaXRoX2NvZGU7CQkvKiBUUlVFPWFyaXRobWV0aWMgY29kaW5nLCBGQUxTRT1IdWZmbWFuICovCi0gIGJvb2xlYW4gb3B0aW1pemVfY29kaW5nOwkvKiBUUlVFPW9wdGltaXplIGVudHJvcHkgZW5jb2RpbmcgcGFybXMgKi8KLSAgYm9vbGVhbiBDQ0lSNjAxX3NhbXBsaW5nOwkvKiBUUlVFPWZpcnN0IHNhbXBsZXMgYXJlIGNvc2l0ZWQgKi8KLSAgaW50IHNtb290aGluZ19mYWN0b3I7CQkvKiAxLi4xMDAsIG9yIDAgZm9yIG5vIGlucHV0IHNtb290aGluZyAqLwotICBKX0RDVF9NRVRIT0QgZGN0X21ldGhvZDsJLyogRENUIGFsZ29yaXRobSBzZWxlY3RvciAqLwotCi0gIC8qIFRoZSByZXN0YXJ0IGludGVydmFsIGNhbiBiZSBzcGVjaWZpZWQgaW4gYWJzb2x1dGUgTUNVcyBieSBzZXR0aW5nCi0gICAqIHJlc3RhcnRfaW50ZXJ2YWwsIG9yIGluIE1DVSByb3dzIGJ5IHNldHRpbmcgcmVzdGFydF9pbl9yb3dzCi0gICAqIChpbiB3aGljaCBjYXNlIHRoZSBjb3JyZWN0IHJlc3RhcnRfaW50ZXJ2YWwgd2lsbCBiZSBmaWd1cmVkCi0gICAqIGZvciBlYWNoIHNjYW4pLgotICAgKi8KLSAgdW5zaWduZWQgaW50IHJlc3RhcnRfaW50ZXJ2YWw7IC8qIE1DVXMgcGVyIHJlc3RhcnQsIG9yIDAgZm9yIG5vIHJlc3RhcnQgKi8KLSAgaW50IHJlc3RhcnRfaW5fcm93czsJCS8qIGlmID4gMCwgTUNVIHJvd3MgcGVyIHJlc3RhcnQgaW50ZXJ2YWwgKi8KLQotICAvKiBQYXJhbWV0ZXJzIGNvbnRyb2xsaW5nIGVtaXNzaW9uIG9mIHNwZWNpYWwgbWFya2Vycy4gKi8KLQotICBib29sZWFuIHdyaXRlX0pGSUZfaGVhZGVyOwkvKiBzaG91bGQgYSBKRklGIG1hcmtlciBiZSB3cml0dGVuPyAqLwotICBVSU5UOCBKRklGX21ham9yX3ZlcnNpb247CS8qIFdoYXQgdG8gd3JpdGUgZm9yIHRoZSBKRklGIHZlcnNpb24gbnVtYmVyICovCi0gIFVJTlQ4IEpGSUZfbWlub3JfdmVyc2lvbjsKLSAgLyogVGhlc2UgdGhyZWUgdmFsdWVzIGFyZSBub3QgdXNlZCBieSB0aGUgSlBFRyBjb2RlLCBtZXJlbHkgY29waWVkICovCi0gIC8qIGludG8gdGhlIEpGSUYgQVBQMCBtYXJrZXIuICBkZW5zaXR5X3VuaXQgY2FuIGJlIDAgZm9yIHVua25vd24sICovCi0gIC8qIDEgZm9yIGRvdHMvaW5jaCwgb3IgMiBmb3IgZG90cy9jbS4gIE5vdGUgdGhhdCB0aGUgcGl4ZWwgYXNwZWN0ICovCi0gIC8qIHJhdGlvIGlzIGRlZmluZWQgYnkgWF9kZW5zaXR5L1lfZGVuc2l0eSBldmVuIHdoZW4gZGVuc2l0eV91bml0PTAuICovCi0gIFVJTlQ4IGRlbnNpdHlfdW5pdDsJCS8qIEpGSUYgY29kZSBmb3IgcGl4ZWwgc2l6ZSB1bml0cyAqLwotICBVSU5UMTYgWF9kZW5zaXR5OwkJLyogSG9yaXpvbnRhbCBwaXhlbCBkZW5zaXR5ICovCi0gIFVJTlQxNiBZX2RlbnNpdHk7CQkvKiBWZXJ0aWNhbCBwaXhlbCBkZW5zaXR5ICovCi0gIGJvb2xlYW4gd3JpdGVfQWRvYmVfbWFya2VyOwkvKiBzaG91bGQgYW4gQWRvYmUgbWFya2VyIGJlIHdyaXR0ZW4/ICovCi0gIAotICAvKiBTdGF0ZSB2YXJpYWJsZTogaW5kZXggb2YgbmV4dCBzY2FubGluZSB0byBiZSB3cml0dGVuIHRvCi0gICAqIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkuICBBcHBsaWNhdGlvbiBtYXkgdXNlIHRoaXMgdG8gY29udHJvbCBpdHMKLSAgICogcHJvY2Vzc2luZyBsb29wLCBlLmcuLCAid2hpbGUgKG5leHRfc2NhbmxpbmUgPCBpbWFnZV9oZWlnaHQpIi4KLSAgICovCi0KLSAgSkRJTUVOU0lPTiBuZXh0X3NjYW5saW5lOwkvKiAwIC4uIGltYWdlX2hlaWdodC0xICAqLwotCi0gIC8qIFJlbWFpbmluZyBmaWVsZHMgYXJlIGtub3duIHRocm91Z2hvdXQgY29tcHJlc3NvciwgYnV0IGdlbmVyYWxseQotICAgKiBzaG91bGQgbm90IGJlIHRvdWNoZWQgYnkgYSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbi4KLSAgICovCi0KLSAgLyoKLSAgICogVGhlc2UgZmllbGRzIGFyZSBjb21wdXRlZCBkdXJpbmcgY29tcHJlc3Npb24gc3RhcnR1cAotICAgKi8KLSAgYm9vbGVhbiBwcm9ncmVzc2l2ZV9tb2RlOwkvKiBUUlVFIGlmIHNjYW4gc2NyaXB0IHVzZXMgcHJvZ3Jlc3NpdmUgbW9kZSAqLwotICBpbnQgbWF4X2hfc2FtcF9mYWN0b3I7CS8qIGxhcmdlc3QgaF9zYW1wX2ZhY3RvciAqLwotICBpbnQgbWF4X3Zfc2FtcF9mYWN0b3I7CS8qIGxhcmdlc3Qgdl9zYW1wX2ZhY3RvciAqLwotCi0gIEpESU1FTlNJT04gdG90YWxfaU1DVV9yb3dzOwkvKiAjIG9mIGlNQ1Ugcm93cyB0byBiZSBpbnB1dCB0byBjb2VmIGN0bHIgKi8KLSAgLyogVGhlIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIgcmVjZWl2ZXMgZGF0YSBpbiB1bml0cyBvZiBNQ1Ugcm93cyBhcyBkZWZpbmVkCi0gICAqIGZvciBmdWxseSBpbnRlcmxlYXZlZCBzY2FucyAod2hldGhlciB0aGUgSlBFRyBmaWxlIGlzIGludGVybGVhdmVkIG9yIG5vdCkuCi0gICAqIFRoZXJlIGFyZSB2X3NhbXBfZmFjdG9yICogRENUU0laRSBzYW1wbGUgcm93cyBvZiBlYWNoIGNvbXBvbmVudCBpbiBhbgotICAgKiAiaU1DVSIgKGludGVybGVhdmVkIE1DVSkgcm93LgotICAgKi8KLSAgCi0gIC8qCi0gICAqIFRoZXNlIGZpZWxkcyBhcmUgdmFsaWQgZHVyaW5nIGFueSBvbmUgc2Nhbi4KLSAgICogVGhleSBkZXNjcmliZSB0aGUgY29tcG9uZW50cyBhbmQgTUNVcyBhY3R1YWxseSBhcHBlYXJpbmcgaW4gdGhlIHNjYW4uCi0gICAqLwotICBpbnQgY29tcHNfaW5fc2NhbjsJCS8qICMgb2YgSlBFRyBjb21wb25lbnRzIGluIHRoaXMgc2NhbiAqLwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY3VyX2NvbXBfaW5mb1tNQVhfQ09NUFNfSU5fU0NBTl07Ci0gIC8qICpjdXJfY29tcF9pbmZvW2ldIGRlc2NyaWJlcyBjb21wb25lbnQgdGhhdCBhcHBlYXJzIGkndGggaW4gU09TICovCi0gIAotICBKRElNRU5TSU9OIE1DVXNfcGVyX3JvdzsJLyogIyBvZiBNQ1VzIGFjcm9zcyB0aGUgaW1hZ2UgKi8KLSAgSkRJTUVOU0lPTiBNQ1Vfcm93c19pbl9zY2FuOwkvKiAjIG9mIE1DVSByb3dzIGluIHRoZSBpbWFnZSAqLwotICAKLSAgaW50IGJsb2Nrc19pbl9NQ1U7CQkvKiAjIG9mIERDVCBibG9ja3MgcGVyIE1DVSAqLwotICBpbnQgTUNVX21lbWJlcnNoaXBbQ19NQVhfQkxPQ0tTX0lOX01DVV07Ci0gIC8qIE1DVV9tZW1iZXJzaGlwW2ldIGlzIGluZGV4IGluIGN1cl9jb21wX2luZm8gb2YgY29tcG9uZW50IG93bmluZyAqLwotICAvKiBpJ3RoIGJsb2NrIGluIGFuIE1DVSAqLwotCi0gIGludCBTcywgU2UsIEFoLCBBbDsJCS8qIHByb2dyZXNzaXZlIEpQRUcgcGFyYW1ldGVycyBmb3Igc2NhbiAqLwotCi0gIC8qCi0gICAqIExpbmtzIHRvIGNvbXByZXNzaW9uIHN1Ym9iamVjdHMgKG1ldGhvZHMgYW5kIHByaXZhdGUgdmFyaWFibGVzIG9mIG1vZHVsZXMpCi0gICAqLwotICBzdHJ1Y3QganBlZ19jb21wX21hc3RlciAqIG1hc3RlcjsKLSAgc3RydWN0IGpwZWdfY19tYWluX2NvbnRyb2xsZXIgKiBtYWluOwotICBzdHJ1Y3QganBlZ19jX3ByZXBfY29udHJvbGxlciAqIHByZXA7Ci0gIHN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyICogY29lZjsKLSAgc3RydWN0IGpwZWdfbWFya2VyX3dyaXRlciAqIG1hcmtlcjsKLSAgc3RydWN0IGpwZWdfY29sb3JfY29udmVydGVyICogY2NvbnZlcnQ7Ci0gIHN0cnVjdCBqcGVnX2Rvd25zYW1wbGVyICogZG93bnNhbXBsZTsKLSAgc3RydWN0IGpwZWdfZm9yd2FyZF9kY3QgKiBmZGN0OwotICBzdHJ1Y3QganBlZ19lbnRyb3B5X2VuY29kZXIgKiBlbnRyb3B5OwotICBqcGVnX3NjYW5faW5mbyAqIHNjcmlwdF9zcGFjZTsgLyogd29ya3NwYWNlIGZvciBqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbiAqLwotICBpbnQgc2NyaXB0X3NwYWNlX3NpemU7Ci19OwotCi0KLS8qIE1hc3RlciByZWNvcmQgZm9yIGEgZGVjb21wcmVzc2lvbiBpbnN0YW5jZSAqLwotCi1zdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCB7Ci0gIGpwZWdfY29tbW9uX2ZpZWxkczsJCS8qIEZpZWxkcyBzaGFyZWQgd2l0aCBqcGVnX2NvbXByZXNzX3N0cnVjdCAqLwotCi0gIC8qIFNvdXJjZSBvZiBjb21wcmVzc2VkIGRhdGEgKi8KLSAgc3RydWN0IGpwZWdfc291cmNlX21nciAqIHNyYzsKLQotICAvKiBCYXNpYyBkZXNjcmlwdGlvbiBvZiBpbWFnZSAtLS0gZmlsbGVkIGluIGJ5IGpwZWdfcmVhZF9oZWFkZXIoKS4gKi8KLSAgLyogQXBwbGljYXRpb24gbWF5IGluc3BlY3QgdGhlc2UgdmFsdWVzIHRvIGRlY2lkZSBob3cgdG8gcHJvY2VzcyBpbWFnZS4gKi8KLQotICBKRElNRU5TSU9OIGltYWdlX3dpZHRoOwkvKiBub21pbmFsIGltYWdlIHdpZHRoIChmcm9tIFNPRiBtYXJrZXIpICovCi0gIEpESU1FTlNJT04gaW1hZ2VfaGVpZ2h0OwkvKiBub21pbmFsIGltYWdlIGhlaWdodCAqLwotICBpbnQgbnVtX2NvbXBvbmVudHM7CQkvKiAjIG9mIGNvbG9yIGNvbXBvbmVudHMgaW4gSlBFRyBpbWFnZSAqLwotICBKX0NPTE9SX1NQQUNFIGpwZWdfY29sb3Jfc3BhY2U7IC8qIGNvbG9yc3BhY2Ugb2YgSlBFRyBpbWFnZSAqLwotCi0gIC8qIERlY29tcHJlc3Npb24gcHJvY2Vzc2luZyBwYXJhbWV0ZXJzIC0tLSB0aGVzZSBmaWVsZHMgbXVzdCBiZSBzZXQgYmVmb3JlCi0gICAqIGNhbGxpbmcganBlZ19zdGFydF9kZWNvbXByZXNzKCkuICBOb3RlIHRoYXQganBlZ19yZWFkX2hlYWRlcigpIGluaXRpYWxpemVzCi0gICAqIHRoZW0gdG8gZGVmYXVsdCB2YWx1ZXMuCi0gICAqLwotCi0gIEpfQ09MT1JfU1BBQ0Ugb3V0X2NvbG9yX3NwYWNlOyAvKiBjb2xvcnNwYWNlIGZvciBvdXRwdXQgKi8KLQotICB1bnNpZ25lZCBpbnQgc2NhbGVfbnVtLCBzY2FsZV9kZW5vbTsgLyogZnJhY3Rpb24gYnkgd2hpY2ggdG8gc2NhbGUgaW1hZ2UgKi8KLQotICBkb3VibGUgb3V0cHV0X2dhbW1hOwkJLyogaW1hZ2UgZ2FtbWEgd2FudGVkIGluIG91dHB1dCAqLwotCi0gIGJvb2xlYW4gYnVmZmVyZWRfaW1hZ2U7CS8qIFRSVUU9bXVsdGlwbGUgb3V0cHV0IHBhc3NlcyAqLwotICBib29sZWFuIHJhd19kYXRhX291dDsJCS8qIFRSVUU9ZG93bnNhbXBsZWQgZGF0YSB3YW50ZWQgKi8KLQotICBKX0RDVF9NRVRIT0QgZGN0X21ldGhvZDsJLyogSURDVCBhbGdvcml0aG0gc2VsZWN0b3IgKi8KLSAgYm9vbGVhbiBkb19mYW5jeV91cHNhbXBsaW5nOwkvKiBUUlVFPWFwcGx5IGZhbmN5IHVwc2FtcGxpbmcgKi8KLSAgYm9vbGVhbiBkb19ibG9ja19zbW9vdGhpbmc7CS8qIFRSVUU9YXBwbHkgaW50ZXJibG9jayBzbW9vdGhpbmcgKi8KLQotICBib29sZWFuIHF1YW50aXplX2NvbG9yczsJLyogVFJVRT1jb2xvcm1hcHBlZCBvdXRwdXQgd2FudGVkICovCi0gIC8qIHRoZSBmb2xsb3dpbmcgYXJlIGlnbm9yZWQgaWYgbm90IHF1YW50aXplX2NvbG9yczogKi8KLSAgSl9ESVRIRVJfTU9ERSBkaXRoZXJfbW9kZTsJLyogdHlwZSBvZiBjb2xvciBkaXRoZXJpbmcgdG8gdXNlICovCi0gIGJvb2xlYW4gdHdvX3Bhc3NfcXVhbnRpemU7CS8qIFRSVUU9dXNlIHR3by1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiAqLwotICBpbnQgZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzOwkvKiBtYXggIyBjb2xvcnMgdG8gdXNlIGluIGNyZWF0ZWQgY29sb3JtYXAgKi8KLSAgLyogdGhlc2UgYXJlIHNpZ25pZmljYW50IG9ubHkgaW4gYnVmZmVyZWQtaW1hZ2UgbW9kZTogKi8KLSAgYm9vbGVhbiBlbmFibGVfMXBhc3NfcXVhbnQ7CS8qIGVuYWJsZSBmdXR1cmUgdXNlIG9mIDEtcGFzcyBxdWFudGl6ZXIgKi8KLSAgYm9vbGVhbiBlbmFibGVfZXh0ZXJuYWxfcXVhbnQ7LyogZW5hYmxlIGZ1dHVyZSB1c2Ugb2YgZXh0ZXJuYWwgY29sb3JtYXAgKi8KLSAgYm9vbGVhbiBlbmFibGVfMnBhc3NfcXVhbnQ7CS8qIGVuYWJsZSBmdXR1cmUgdXNlIG9mIDItcGFzcyBxdWFudGl6ZXIgKi8KLQotICAvKiBEZXNjcmlwdGlvbiBvZiBhY3R1YWwgb3V0cHV0IGltYWdlIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB0byBhcHBsaWNhdGlvbi4KLSAgICogVGhlc2UgZmllbGRzIGFyZSBjb21wdXRlZCBieSBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4KLSAgICogWW91IGNhbiBhbHNvIHVzZSBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoKSB0byBkZXRlcm1pbmUgdGhlc2UgdmFsdWVzCi0gICAqIGluIGFkdmFuY2Ugb2YgY2FsbGluZyBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4KLSAgICovCi0KLSAgSkRJTUVOU0lPTiBvdXRwdXRfd2lkdGg7CS8qIHNjYWxlZCBpbWFnZSB3aWR0aCAqLwotICBKRElNRU5TSU9OIG91dHB1dF9oZWlnaHQ7CS8qIHNjYWxlZCBpbWFnZSBoZWlnaHQgKi8KLSAgaW50IG91dF9jb2xvcl9jb21wb25lbnRzOwkvKiAjIG9mIGNvbG9yIGNvbXBvbmVudHMgaW4gb3V0X2NvbG9yX3NwYWNlICovCi0gIGludCBvdXRwdXRfY29tcG9uZW50czsJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIHJldHVybmVkICovCi0gIC8qIG91dHB1dF9jb21wb25lbnRzIGlzIDEgKGEgY29sb3JtYXAgaW5kZXgpIHdoZW4gcXVhbnRpemluZyBjb2xvcnM7Ci0gICAqIG90aGVyd2lzZSBpdCBlcXVhbHMgb3V0X2NvbG9yX2NvbXBvbmVudHMuCi0gICAqLwotICBpbnQgcmVjX291dGJ1Zl9oZWlnaHQ7CS8qIG1pbiByZWNvbW1lbmRlZCBoZWlnaHQgb2Ygc2NhbmxpbmUgYnVmZmVyICovCi0gIC8qIElmIHRoZSBidWZmZXIgcGFzc2VkIHRvIGpwZWdfcmVhZF9zY2FubGluZXMoKSBpcyBsZXNzIHRoYW4gdGhpcyBtYW55IHJvd3MKLSAgICogaGlnaCwgc3BhY2UgYW5kIHRpbWUgd2lsbCBiZSB3YXN0ZWQgZHVlIHRvIHVubmVjZXNzYXJ5IGRhdGEgY29weWluZy4KLSAgICogVXN1YWxseSByZWNfb3V0YnVmX2hlaWdodCB3aWxsIGJlIDEgb3IgMiwgYXQgbW9zdCA0LgotICAgKi8KLQotICAvKiBXaGVuIHF1YW50aXppbmcgY29sb3JzLCB0aGUgb3V0cHV0IGNvbG9ybWFwIGlzIGRlc2NyaWJlZCBieSB0aGVzZSBmaWVsZHMuCi0gICAqIFRoZSBhcHBsaWNhdGlvbiBjYW4gc3VwcGx5IGEgY29sb3JtYXAgYnkgc2V0dGluZyBjb2xvcm1hcCBub24tTlVMTCBiZWZvcmUKLSAgICogY2FsbGluZyBqcGVnX3N0YXJ0X2RlY29tcHJlc3M7IG90aGVyd2lzZSBhIGNvbG9ybWFwIGlzIGNyZWF0ZWQgZHVyaW5nCi0gICAqIGpwZWdfc3RhcnRfZGVjb21wcmVzcyBvciBqcGVnX3N0YXJ0X291dHB1dC4KLSAgICogVGhlIG1hcCBoYXMgb3V0X2NvbG9yX2NvbXBvbmVudHMgcm93cyBhbmQgYWN0dWFsX251bWJlcl9vZl9jb2xvcnMgY29sdW1ucy4KLSAgICovCi0gIGludCBhY3R1YWxfbnVtYmVyX29mX2NvbG9yczsJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gdXNlICovCi0gIEpTQU1QQVJSQVkgY29sb3JtYXA7CQkvKiBUaGUgY29sb3IgbWFwIGFzIGEgMi1EIHBpeGVsIGFycmF5ICovCi0KLSAgLyogU3RhdGUgdmFyaWFibGVzOiB0aGVzZSB2YXJpYWJsZXMgaW5kaWNhdGUgdGhlIHByb2dyZXNzIG9mIGRlY29tcHJlc3Npb24uCi0gICAqIFRoZSBhcHBsaWNhdGlvbiBtYXkgZXhhbWluZSB0aGVzZSBidXQgbXVzdCBub3QgbW9kaWZ5IHRoZW0uCi0gICAqLwotCi0gIC8qIFJvdyBpbmRleCBvZiBuZXh0IHNjYW5saW5lIHRvIGJlIHJlYWQgZnJvbSBqcGVnX3JlYWRfc2NhbmxpbmVzKCkuCi0gICAqIEFwcGxpY2F0aW9uIG1heSB1c2UgdGhpcyB0byBjb250cm9sIGl0cyBwcm9jZXNzaW5nIGxvb3AsIGUuZy4sCi0gICAqICJ3aGlsZSAob3V0cHV0X3NjYW5saW5lIDwgb3V0cHV0X2hlaWdodCkiLgotICAgKi8KLSAgSkRJTUVOU0lPTiBvdXRwdXRfc2NhbmxpbmU7CS8qIDAgLi4gb3V0cHV0X2hlaWdodC0xICAqLwotCi0gIC8qIEN1cnJlbnQgaW5wdXQgc2NhbiBudW1iZXIgYW5kIG51bWJlciBvZiBpTUNVIHJvd3MgY29tcGxldGVkIGluIHNjYW4uCi0gICAqIFRoZXNlIGluZGljYXRlIHRoZSBwcm9ncmVzcyBvZiB0aGUgZGVjb21wcmVzc29yIGlucHV0IHNpZGUuCi0gICAqLwotICBpbnQgaW5wdXRfc2Nhbl9udW1iZXI7CS8qIE51bWJlciBvZiBTT1MgbWFya2VycyBzZWVuIHNvIGZhciAqLwotICBKRElNRU5TSU9OIGlucHV0X2lNQ1Vfcm93OwkvKiBOdW1iZXIgb2YgaU1DVSByb3dzIGNvbXBsZXRlZCAqLwotCi0gIC8qIFRoZSAib3V0cHV0IHNjYW4gbnVtYmVyIiBpcyB0aGUgbm90aW9uYWwgc2NhbiBiZWluZyBkaXNwbGF5ZWQgYnkgdGhlCi0gICAqIG91dHB1dCBzaWRlLiAgVGhlIGRlY29tcHJlc3NvciB3aWxsIG5vdCBhbGxvdyBvdXRwdXQgc2Nhbi9yb3cgbnVtYmVyCi0gICAqIHRvIGdldCBhaGVhZCBvZiBpbnB1dCBzY2FuL3JvdywgYnV0IGl0IGNhbiBmYWxsIGFyYml0cmFyaWx5IGZhciBiZWhpbmQuCi0gICAqLwotICBpbnQgb3V0cHV0X3NjYW5fbnVtYmVyOwkvKiBOb21pbmFsIHNjYW4gbnVtYmVyIGJlaW5nIGRpc3BsYXllZCAqLwotICBKRElNRU5TSU9OIG91dHB1dF9pTUNVX3JvdzsJLyogTnVtYmVyIG9mIGlNQ1Ugcm93cyByZWFkICovCi0KLSAgLyogQ3VycmVudCBwcm9ncmVzc2lvbiBzdGF0dXMuICBjb2VmX2JpdHNbY11baV0gaW5kaWNhdGVzIHRoZSBwcmVjaXNpb24KLSAgICogd2l0aCB3aGljaCBjb21wb25lbnQgYydzIERDVCBjb2VmZmljaWVudCBpIChpbiB6aWd6YWcgb3JkZXIpIGlzIGtub3duLgotICAgKiBJdCBpcyAtMSB3aGVuIG5vIGRhdGEgaGFzIHlldCBiZWVuIHJlY2VpdmVkLCBvdGhlcndpc2UgaXQgaXMgdGhlIHBvaW50Ci0gICAqIHRyYW5zZm9ybSAoc2hpZnQpIHZhbHVlIGZvciB0aGUgbW9zdCByZWNlbnQgc2NhbiBvZiB0aGUgY29lZmZpY2llbnQKLSAgICogKHRodXMsIDAgYXQgY29tcGxldGlvbiBvZiB0aGUgcHJvZ3Jlc3Npb24pLgotICAgKiBUaGlzIHBvaW50ZXIgaXMgTlVMTCB3aGVuIHJlYWRpbmcgYSBub24tcHJvZ3Jlc3NpdmUgZmlsZS4KLSAgICovCi0gIGludCAoKmNvZWZfYml0cylbRENUU0laRTJdOwkvKiAtMSBvciBjdXJyZW50IEFsIHZhbHVlIGZvciBlYWNoIGNvZWYgKi8KLQotICAvKiBJbnRlcm5hbCBKUEVHIHBhcmFtZXRlcnMgLS0tIHRoZSBhcHBsaWNhdGlvbiB1c3VhbGx5IG5lZWQgbm90IGxvb2sgYXQKLSAgICogdGhlc2UgZmllbGRzLiAgTm90ZSB0aGF0IHRoZSBkZWNvbXByZXNzb3Igb3V0cHV0IHNpZGUgbWF5IG5vdCB1c2UKLSAgICogYW55IHBhcmFtZXRlcnMgdGhhdCBjYW4gY2hhbmdlIGJldHdlZW4gc2NhbnMuCi0gICAqLwotCi0gIC8qIFF1YW50aXphdGlvbiBhbmQgSHVmZm1hbiB0YWJsZXMgYXJlIGNhcnJpZWQgZm9yd2FyZCBhY3Jvc3MgaW5wdXQKLSAgICogZGF0YXN0cmVhbXMgd2hlbiBwcm9jZXNzaW5nIGFiYnJldmlhdGVkIEpQRUcgZGF0YXN0cmVhbXMuCi0gICAqLwotCi0gIEpRVUFOVF9UQkwgKiBxdWFudF90YmxfcHRyc1tOVU1fUVVBTlRfVEJMU107Ci0gIC8qIHB0cnMgdG8gY29lZmZpY2llbnQgcXVhbnRpemF0aW9uIHRhYmxlcywgb3IgTlVMTCBpZiBub3QgZGVmaW5lZCAqLwotCi0gIEpIVUZGX1RCTCAqIGRjX2h1ZmZfdGJsX3B0cnNbTlVNX0hVRkZfVEJMU107Ci0gIEpIVUZGX1RCTCAqIGFjX2h1ZmZfdGJsX3B0cnNbTlVNX0hVRkZfVEJMU107Ci0gIC8qIHB0cnMgdG8gSHVmZm1hbiBjb2RpbmcgdGFibGVzLCBvciBOVUxMIGlmIG5vdCBkZWZpbmVkICovCi0KLSAgLyogVGhlc2UgcGFyYW1ldGVycyBhcmUgbmV2ZXIgY2FycmllZCBhY3Jvc3MgZGF0YXN0cmVhbXMsIHNpbmNlIHRoZXkKLSAgICogYXJlIGdpdmVuIGluIFNPRi9TT1MgbWFya2VycyBvciBkZWZpbmVkIHRvIGJlIHJlc2V0IGJ5IFNPSS4KLSAgICovCi0KLSAgaW50IGRhdGFfcHJlY2lzaW9uOwkJLyogYml0cyBvZiBwcmVjaXNpb24gaW4gaW1hZ2UgZGF0YSAqLwotCi0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wX2luZm87Ci0gIC8qIGNvbXBfaW5mb1tpXSBkZXNjcmliZXMgY29tcG9uZW50IHRoYXQgYXBwZWFycyBpJ3RoIGluIFNPRiAqLwotCi0gIGJvb2xlYW4gcHJvZ3Jlc3NpdmVfbW9kZTsJLyogVFJVRSBpZiBTT0ZuIHNwZWNpZmllcyBwcm9ncmVzc2l2ZSBtb2RlICovCi0gIGJvb2xlYW4gYXJpdGhfY29kZTsJCS8qIFRSVUU9YXJpdGhtZXRpYyBjb2RpbmcsIEZBTFNFPUh1ZmZtYW4gKi8KLQotICBVSU5UOCBhcml0aF9kY19MW05VTV9BUklUSF9UQkxTXTsgLyogTCB2YWx1ZXMgZm9yIERDIGFyaXRoLWNvZGluZyB0YWJsZXMgKi8KLSAgVUlOVDggYXJpdGhfZGNfVVtOVU1fQVJJVEhfVEJMU107IC8qIFUgdmFsdWVzIGZvciBEQyBhcml0aC1jb2RpbmcgdGFibGVzICovCi0gIFVJTlQ4IGFyaXRoX2FjX0tbTlVNX0FSSVRIX1RCTFNdOyAvKiBLeCB2YWx1ZXMgZm9yIEFDIGFyaXRoLWNvZGluZyB0YWJsZXMgKi8KLQotICB1bnNpZ25lZCBpbnQgcmVzdGFydF9pbnRlcnZhbDsgLyogTUNVcyBwZXIgcmVzdGFydCBpbnRlcnZhbCwgb3IgMCBmb3Igbm8gcmVzdGFydCAqLwotCi0gIC8qIFRoZXNlIGZpZWxkcyByZWNvcmQgZGF0YSBvYnRhaW5lZCBmcm9tIG9wdGlvbmFsIG1hcmtlcnMgcmVjb2duaXplZCBieQotICAgKiB0aGUgSlBFRyBsaWJyYXJ5LgotICAgKi8KLSAgYm9vbGVhbiBzYXdfSkZJRl9tYXJrZXI7CS8qIFRSVUUgaWZmIGEgSkZJRiBBUFAwIG1hcmtlciB3YXMgZm91bmQgKi8KLSAgLyogRGF0YSBjb3BpZWQgZnJvbSBKRklGIG1hcmtlcjsgb25seSB2YWxpZCBpZiBzYXdfSkZJRl9tYXJrZXIgaXMgVFJVRTogKi8KLSAgVUlOVDggSkZJRl9tYWpvcl92ZXJzaW9uOwkvKiBKRklGIHZlcnNpb24gbnVtYmVyICovCi0gIFVJTlQ4IEpGSUZfbWlub3JfdmVyc2lvbjsKLSAgVUlOVDggZGVuc2l0eV91bml0OwkJLyogSkZJRiBjb2RlIGZvciBwaXhlbCBzaXplIHVuaXRzICovCi0gIFVJTlQxNiBYX2RlbnNpdHk7CQkvKiBIb3Jpem9udGFsIHBpeGVsIGRlbnNpdHkgKi8KLSAgVUlOVDE2IFlfZGVuc2l0eTsJCS8qIFZlcnRpY2FsIHBpeGVsIGRlbnNpdHkgKi8KLSAgYm9vbGVhbiBzYXdfQWRvYmVfbWFya2VyOwkvKiBUUlVFIGlmZiBhbiBBZG9iZSBBUFAxNCBtYXJrZXIgd2FzIGZvdW5kICovCi0gIFVJTlQ4IEFkb2JlX3RyYW5zZm9ybTsJLyogQ29sb3IgdHJhbnNmb3JtIGNvZGUgZnJvbSBBZG9iZSBtYXJrZXIgKi8KLQotICBib29sZWFuIENDSVI2MDFfc2FtcGxpbmc7CS8qIFRSVUU9Zmlyc3Qgc2FtcGxlcyBhcmUgY29zaXRlZCAqLwotCi0gIC8qIEFzaWRlIGZyb20gdGhlIHNwZWNpZmljIGRhdGEgcmV0YWluZWQgZnJvbSBBUFBuIG1hcmtlcnMga25vd24gdG8gdGhlCi0gICAqIGxpYnJhcnksIHRoZSB1bmludGVycHJldGVkIGNvbnRlbnRzIG9mIGFueSBvciBhbGwgQVBQbiBhbmQgQ09NIG1hcmtlcnMKLSAgICogY2FuIGJlIHNhdmVkIGluIGEgbGlzdCBmb3IgZXhhbWluYXRpb24gYnkgdGhlIGFwcGxpY2F0aW9uLgotICAgKi8KLSAganBlZ19zYXZlZF9tYXJrZXJfcHRyIG1hcmtlcl9saXN0OyAvKiBIZWFkIG9mIGxpc3Qgb2Ygc2F2ZWQgbWFya2VycyAqLwotCi0gIC8qIFJlbWFpbmluZyBmaWVsZHMgYXJlIGtub3duIHRocm91Z2hvdXQgZGVjb21wcmVzc29yLCBidXQgZ2VuZXJhbGx5Ci0gICAqIHNob3VsZCBub3QgYmUgdG91Y2hlZCBieSBhIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uLgotICAgKi8KLQotICAvKgotICAgKiBUaGVzZSBmaWVsZHMgYXJlIGNvbXB1dGVkIGR1cmluZyBkZWNvbXByZXNzaW9uIHN0YXJ0dXAKLSAgICovCi0gIGludCBtYXhfaF9zYW1wX2ZhY3RvcjsJLyogbGFyZ2VzdCBoX3NhbXBfZmFjdG9yICovCi0gIGludCBtYXhfdl9zYW1wX2ZhY3RvcjsJLyogbGFyZ2VzdCB2X3NhbXBfZmFjdG9yICovCi0KLSAgaW50IG1pbl9EQ1Rfc2NhbGVkX3NpemU7CS8qIHNtYWxsZXN0IERDVF9zY2FsZWRfc2l6ZSBvZiBhbnkgY29tcG9uZW50ICovCi0KLSAgSkRJTUVOU0lPTiB0b3RhbF9pTUNVX3Jvd3M7CS8qICMgb2YgaU1DVSByb3dzIGluIGltYWdlICovCi0gIC8qIFRoZSBjb2VmZmljaWVudCBjb250cm9sbGVyJ3MgaW5wdXQgYW5kIG91dHB1dCBwcm9ncmVzcyBpcyBtZWFzdXJlZCBpbgotICAgKiB1bml0cyBvZiAiaU1DVSIgKGludGVybGVhdmVkIE1DVSkgcm93cy4gIFRoZXNlIGFyZSB0aGUgc2FtZSBhcyBNQ1Ugcm93cwotICAgKiBpbiBmdWxseSBpbnRlcmxlYXZlZCBKUEVHIHNjYW5zLCBidXQgYXJlIHVzZWQgd2hldGhlciB0aGUgc2NhbiBpcwotICAgKiBpbnRlcmxlYXZlZCBvciBub3QuICBXZSBkZWZpbmUgYW4gaU1DVSByb3cgYXMgdl9zYW1wX2ZhY3RvciBEQ1QgYmxvY2sKLSAgICogcm93cyBvZiBlYWNoIGNvbXBvbmVudC4gIFRoZXJlZm9yZSwgdGhlIElEQ1Qgb3V0cHV0IGNvbnRhaW5zCi0gICAqIHZfc2FtcF9mYWN0b3IqRENUX3NjYWxlZF9zaXplIHNhbXBsZSByb3dzIG9mIGEgY29tcG9uZW50IHBlciBpTUNVIHJvdy4KLSAgICovCi0KLSAgSlNBTVBMRSAqIHNhbXBsZV9yYW5nZV9saW1pdDsgLyogdGFibGUgZm9yIGZhc3QgcmFuZ2UtbGltaXRpbmcgKi8KLQotICAvKgotICAgKiBUaGVzZSBmaWVsZHMgYXJlIHZhbGlkIGR1cmluZyBhbnkgb25lIHNjYW4uCi0gICAqIFRoZXkgZGVzY3JpYmUgdGhlIGNvbXBvbmVudHMgYW5kIE1DVXMgYWN0dWFsbHkgYXBwZWFyaW5nIGluIHRoZSBzY2FuLgotICAgKiBOb3RlIHRoYXQgdGhlIGRlY29tcHJlc3NvciBvdXRwdXQgc2lkZSBtdXN0IG5vdCB1c2UgdGhlc2UgZmllbGRzLgotICAgKi8KLSAgaW50IGNvbXBzX2luX3NjYW47CQkvKiAjIG9mIEpQRUcgY29tcG9uZW50cyBpbiB0aGlzIHNjYW4gKi8KLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGN1cl9jb21wX2luZm9bTUFYX0NPTVBTX0lOX1NDQU5dOwotICAvKiAqY3VyX2NvbXBfaW5mb1tpXSBkZXNjcmliZXMgY29tcG9uZW50IHRoYXQgYXBwZWFycyBpJ3RoIGluIFNPUyAqLwotCi0gIEpESU1FTlNJT04gTUNVc19wZXJfcm93OwkvKiAjIG9mIE1DVXMgYWNyb3NzIHRoZSBpbWFnZSAqLwotICBKRElNRU5TSU9OIE1DVV9yb3dzX2luX3NjYW47CS8qICMgb2YgTUNVIHJvd3MgaW4gdGhlIGltYWdlICovCi0KLSAgaW50IGJsb2Nrc19pbl9NQ1U7CQkvKiAjIG9mIERDVCBibG9ja3MgcGVyIE1DVSAqLwotICBpbnQgTUNVX21lbWJlcnNoaXBbRF9NQVhfQkxPQ0tTX0lOX01DVV07Ci0gIC8qIE1DVV9tZW1iZXJzaGlwW2ldIGlzIGluZGV4IGluIGN1cl9jb21wX2luZm8gb2YgY29tcG9uZW50IG93bmluZyAqLwotICAvKiBpJ3RoIGJsb2NrIGluIGFuIE1DVSAqLwotCi0gIGludCBTcywgU2UsIEFoLCBBbDsJCS8qIHByb2dyZXNzaXZlIEpQRUcgcGFyYW1ldGVycyBmb3Igc2NhbiAqLwotCi0gIC8qIFRoaXMgZmllbGQgaXMgc2hhcmVkIGJldHdlZW4gZW50cm9weSBkZWNvZGVyIGFuZCBtYXJrZXIgcGFyc2VyLgotICAgKiBJdCBpcyBlaXRoZXIgemVybyBvciB0aGUgY29kZSBvZiBhIEpQRUcgbWFya2VyIHRoYXQgaGFzIGJlZW4KLSAgICogcmVhZCBmcm9tIHRoZSBkYXRhIHNvdXJjZSwgYnV0IGhhcyBub3QgeWV0IGJlZW4gcHJvY2Vzc2VkLgotICAgKi8KLSAgaW50IHVucmVhZF9tYXJrZXI7Ci0KLSAgLyoKLSAgICogTGlua3MgdG8gZGVjb21wcmVzc2lvbiBzdWJvYmplY3RzIChtZXRob2RzLCBwcml2YXRlIHZhcmlhYmxlcyBvZiBtb2R1bGVzKQotICAgKi8KLSAgc3RydWN0IGpwZWdfZGVjb21wX21hc3RlciAqIG1hc3RlcjsKLSAgc3RydWN0IGpwZWdfZF9tYWluX2NvbnRyb2xsZXIgKiBtYWluOwotICBzdHJ1Y3QganBlZ19kX2NvZWZfY29udHJvbGxlciAqIGNvZWY7Ci0gIHN0cnVjdCBqcGVnX2RfcG9zdF9jb250cm9sbGVyICogcG9zdDsKLSAgc3RydWN0IGpwZWdfaW5wdXRfY29udHJvbGxlciAqIGlucHV0Y3RsOwotICBzdHJ1Y3QganBlZ19tYXJrZXJfcmVhZGVyICogbWFya2VyOwotICBzdHJ1Y3QganBlZ19lbnRyb3B5X2RlY29kZXIgKiBlbnRyb3B5OwotICBzdHJ1Y3QganBlZ19pbnZlcnNlX2RjdCAqIGlkY3Q7Ci0gIHN0cnVjdCBqcGVnX3Vwc2FtcGxlciAqIHVwc2FtcGxlOwotICBzdHJ1Y3QganBlZ19jb2xvcl9kZWNvbnZlcnRlciAqIGNjb252ZXJ0OwotICBzdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgKiBjcXVhbnRpemU7Ci19OwotCi0KLS8qICJPYmplY3QiIGRlY2xhcmF0aW9ucyBmb3IgSlBFRyBtb2R1bGVzIHRoYXQgbWF5IGJlIHN1cHBsaWVkIG9yIGNhbGxlZAotICogZGlyZWN0bHkgYnkgdGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uLgotICogQXMgd2l0aCBhbGwgb2JqZWN0cyBpbiB0aGUgSlBFRyBsaWJyYXJ5LCB0aGVzZSBzdHJ1Y3RzIG9ubHkgZGVmaW5lIHRoZQotICogcHVibGljbHkgdmlzaWJsZSBtZXRob2RzIGFuZCBzdGF0ZSB2YXJpYWJsZXMgb2YgYSBtb2R1bGUuICBBZGRpdGlvbmFsCi0gKiBwcml2YXRlIGZpZWxkcyBtYXkgZXhpc3QgYWZ0ZXIgdGhlIHB1YmxpYyBvbmVzLgotICovCi0KLQotLyogRXJyb3IgaGFuZGxlciBvYmplY3QgKi8KLQotc3RydWN0IGpwZWdfZXJyb3JfbWdyIHsKLSAgLyogRXJyb3IgZXhpdCBoYW5kbGVyOiBkb2VzIG5vdCByZXR1cm4gdG8gY2FsbGVyICovCi0gIEpNRVRIT0Qodm9pZCwgZXJyb3JfZXhpdCwgKGpfY29tbW9uX3B0ciBjaW5mbykpOwotICAvKiBDb25kaXRpb25hbGx5IGVtaXQgYSB0cmFjZSBvciB3YXJuaW5nIG1lc3NhZ2UgKi8KLSAgSk1FVEhPRCh2b2lkLCBlbWl0X21lc3NhZ2UsIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBtc2dfbGV2ZWwpKTsKLSAgLyogUm91dGluZSB0aGF0IGFjdHVhbGx5IG91dHB1dHMgYSB0cmFjZSBvciBlcnJvciBtZXNzYWdlICovCi0gIEpNRVRIT0Qodm9pZCwgb3V0cHV0X21lc3NhZ2UsIChqX2NvbW1vbl9wdHIgY2luZm8pKTsKLSAgLyogRm9ybWF0IGEgbWVzc2FnZSBzdHJpbmcgZm9yIHRoZSBtb3N0IHJlY2VudCBKUEVHIGVycm9yIG9yIG1lc3NhZ2UgKi8KLSAgSk1FVEhPRCh2b2lkLCBmb3JtYXRfbWVzc2FnZSwgKGpfY29tbW9uX3B0ciBjaW5mbywgY2hhciAqIGJ1ZmZlcikpOwotI2RlZmluZSBKTVNHX0xFTkdUSF9NQVggIDIwMAkvKiByZWNvbW1lbmRlZCBzaXplIG9mIGZvcm1hdF9tZXNzYWdlIGJ1ZmZlciAqLwotICAvKiBSZXNldCBlcnJvciBzdGF0ZSB2YXJpYWJsZXMgYXQgc3RhcnQgb2YgYSBuZXcgaW1hZ2UgKi8KLSAgSk1FVEhPRCh2b2lkLCByZXNldF9lcnJvcl9tZ3IsIChqX2NvbW1vbl9wdHIgY2luZm8pKTsKLSAgCi0gIC8qIFRoZSBtZXNzYWdlIElEIGNvZGUgYW5kIGFueSBwYXJhbWV0ZXJzIGFyZSBzYXZlZCBoZXJlLgotICAgKiBBIG1lc3NhZ2UgY2FuIGhhdmUgb25lIHN0cmluZyBwYXJhbWV0ZXIgb3IgdXAgdG8gOCBpbnQgcGFyYW1ldGVycy4KLSAgICovCi0gIGludCBtc2dfY29kZTsKLSNkZWZpbmUgSk1TR19TVFJfUEFSTV9NQVggIDgwCi0gIHVuaW9uIHsKLSAgICBpbnQgaVs4XTsKLSAgICBjaGFyIHNbSk1TR19TVFJfUEFSTV9NQVhdOwotICB9IG1zZ19wYXJtOwotICAKLSAgLyogU3RhbmRhcmQgc3RhdGUgdmFyaWFibGVzIGZvciBlcnJvciBmYWNpbGl0eSAqLwotICAKLSAgaW50IHRyYWNlX2xldmVsOwkJLyogbWF4IG1zZ19sZXZlbCB0aGF0IHdpbGwgYmUgZGlzcGxheWVkICovCi0gIAotICAvKiBGb3IgcmVjb3ZlcmFibGUgY29ycnVwdC1kYXRhIGVycm9ycywgd2UgZW1pdCBhIHdhcm5pbmcgbWVzc2FnZSwKLSAgICogYnV0IGtlZXAgZ29pbmcgdW5sZXNzIGVtaXRfbWVzc2FnZSBjaG9vc2VzIHRvIGFib3J0LiAgZW1pdF9tZXNzYWdlCi0gICAqIHNob3VsZCBjb3VudCB3YXJuaW5ncyBpbiBudW1fd2FybmluZ3MuICBUaGUgc3Vycm91bmRpbmcgYXBwbGljYXRpb24KLSAgICogY2FuIGNoZWNrIGZvciBiYWQgZGF0YSBieSBzZWVpbmcgaWYgbnVtX3dhcm5pbmdzIGlzIG5vbnplcm8gYXQgdGhlCi0gICAqIGVuZCBvZiBwcm9jZXNzaW5nLgotICAgKi8KLSAgbG9uZyBudW1fd2FybmluZ3M7CQkvKiBudW1iZXIgb2YgY29ycnVwdC1kYXRhIHdhcm5pbmdzICovCi0KLSAgLyogVGhlc2UgZmllbGRzIHBvaW50IHRvIHRoZSB0YWJsZShzKSBvZiBlcnJvciBtZXNzYWdlIHN0cmluZ3MuCi0gICAqIEFuIGFwcGxpY2F0aW9uIGNhbiBjaGFuZ2UgdGhlIHRhYmxlIHBvaW50ZXIgdG8gc3dpdGNoIHRvIGEgZGlmZmVyZW50Ci0gICAqIG1lc3NhZ2UgbGlzdCAodHlwaWNhbGx5LCB0byBjaGFuZ2UgdGhlIGxhbmd1YWdlIGluIHdoaWNoIGVycm9ycyBhcmUKLSAgICogcmVwb3J0ZWQpLiAgU29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gYWRkIGFkZGl0aW9uYWwgZXJyb3IgY29kZXMKLSAgICogdGhhdCB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIEpQRUcgbGlicmFyeSBlcnJvciBtZWNoYW5pc207IHRoZSBzZWNvbmQKLSAgICogdGFibGUgcG9pbnRlciBpcyB1c2VkIGZvciB0aGlzIHB1cnBvc2UuCi0gICAqCi0gICAqIEZpcnN0IHRhYmxlIGluY2x1ZGVzIGFsbCBlcnJvcnMgZ2VuZXJhdGVkIGJ5IEpQRUcgbGlicmFyeSBpdHNlbGYuCi0gICAqIEVycm9yIGNvZGUgMCBpcyByZXNlcnZlZCBmb3IgYSAibm8gc3VjaCBlcnJvciBzdHJpbmciIG1lc3NhZ2UuCi0gICAqLwotICBjb25zdCBjaGFyICogY29uc3QgKiBqcGVnX21lc3NhZ2VfdGFibGU7IC8qIExpYnJhcnkgZXJyb3JzICovCi0gIGludCBsYXN0X2pwZWdfbWVzc2FnZTsgICAgLyogVGFibGUgY29udGFpbnMgc3RyaW5ncyAwLi5sYXN0X2pwZWdfbWVzc2FnZSAqLwotICAvKiBTZWNvbmQgdGFibGUgY2FuIGJlIGFkZGVkIGJ5IGFwcGxpY2F0aW9uIChzZWUgY2pwZWcvZGpwZWcgZm9yIGV4YW1wbGUpLgotICAgKiBJdCBjb250YWlucyBzdHJpbmdzIG51bWJlcmVkIGZpcnN0X2FkZG9uX21lc3NhZ2UuLmxhc3RfYWRkb25fbWVzc2FnZS4KLSAgICovCi0gIGNvbnN0IGNoYXIgKiBjb25zdCAqIGFkZG9uX21lc3NhZ2VfdGFibGU7IC8qIE5vbi1saWJyYXJ5IGVycm9ycyAqLwotICBpbnQgZmlyc3RfYWRkb25fbWVzc2FnZTsJLyogY29kZSBmb3IgZmlyc3Qgc3RyaW5nIGluIGFkZG9uIHRhYmxlICovCi0gIGludCBsYXN0X2FkZG9uX21lc3NhZ2U7CS8qIGNvZGUgZm9yIGxhc3Qgc3RyaW5nIGluIGFkZG9uIHRhYmxlICovCi19OwotCi0KLS8qIFByb2dyZXNzIG1vbml0b3Igb2JqZWN0ICovCi0KLXN0cnVjdCBqcGVnX3Byb2dyZXNzX21nciB7Ci0gIEpNRVRIT0Qodm9pZCwgcHJvZ3Jlc3NfbW9uaXRvciwgKGpfY29tbW9uX3B0ciBjaW5mbykpOwotCi0gIGxvbmcgcGFzc19jb3VudGVyOwkJLyogd29yayB1bml0cyBjb21wbGV0ZWQgaW4gdGhpcyBwYXNzICovCi0gIGxvbmcgcGFzc19saW1pdDsJCS8qIHRvdGFsIG51bWJlciBvZiB3b3JrIHVuaXRzIGluIHRoaXMgcGFzcyAqLwotICBpbnQgY29tcGxldGVkX3Bhc3NlczsJCS8qIHBhc3NlcyBjb21wbGV0ZWQgc28gZmFyICovCi0gIGludCB0b3RhbF9wYXNzZXM7CQkvKiB0b3RhbCBudW1iZXIgb2YgcGFzc2VzIGV4cGVjdGVkICovCi19OwotCi0KLS8qIERhdGEgZGVzdGluYXRpb24gb2JqZWN0IGZvciBjb21wcmVzc2lvbiAqLwotCi1zdHJ1Y3QganBlZ19kZXN0aW5hdGlvbl9tZ3IgewotICBKT0NURVQgKiBuZXh0X291dHB1dF9ieXRlOwkvKiA9PiBuZXh0IGJ5dGUgdG8gd3JpdGUgaW4gYnVmZmVyICovCi0gIHNpemVfdCBmcmVlX2luX2J1ZmZlcjsJLyogIyBvZiBieXRlIHNwYWNlcyByZW1haW5pbmcgaW4gYnVmZmVyICovCi0KLSAgSk1FVEhPRCh2b2lkLCBpbml0X2Rlc3RpbmF0aW9uLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRChib29sZWFuLCBlbXB0eV9vdXRwdXRfYnVmZmVyLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRCh2b2lkLCB0ZXJtX2Rlc3RpbmF0aW9uLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLX07Ci0KLQotLyogRGF0YSBzb3VyY2Ugb2JqZWN0IGZvciBkZWNvbXByZXNzaW9uICovCi0KLXN0cnVjdCBqcGVnX3NvdXJjZV9tZ3IgewotICBjb25zdCBKT0NURVQgKiBuZXh0X2lucHV0X2J5dGU7IC8qID0+IG5leHQgYnl0ZSB0byByZWFkIGZyb20gYnVmZmVyICovCi0gIHNpemVfdCBieXRlc19pbl9idWZmZXI7CS8qICMgb2YgYnl0ZXMgcmVtYWluaW5nIGluIGJ1ZmZlciAqLwotCi0gIEpNRVRIT0Qodm9pZCwgaW5pdF9zb3VyY2UsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0QoYm9vbGVhbiwgZmlsbF9pbnB1dF9idWZmZXIsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgc2tpcF9pbnB1dF9kYXRhLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgbG9uZyBudW1fYnl0ZXMpKTsKLSAgSk1FVEhPRChib29sZWFuLCByZXN5bmNfdG9fcmVzdGFydCwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBkZXNpcmVkKSk7Ci0gIEpNRVRIT0Qodm9pZCwgdGVybV9zb3VyY2UsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci19OwotCi0KLS8qIE1lbW9yeSBtYW5hZ2VyIG9iamVjdC4KLSAqIEFsbG9jYXRlcyAic21hbGwiIG9iamVjdHMgKGEgZmV3IEsgdG90YWwpLCAibGFyZ2UiIG9iamVjdHMgKHRlbnMgb2YgSyksCi0gKiBhbmQgInJlYWxseSBiaWciIG9iamVjdHMgKHZpcnR1YWwgYXJyYXlzIHdpdGggYmFja2luZyBzdG9yZSBpZiBuZWVkZWQpLgotICogVGhlIG1lbW9yeSBtYW5hZ2VyIGRvZXMgbm90IGFsbG93IGluZGl2aWR1YWwgb2JqZWN0cyB0byBiZSBmcmVlZDsgcmF0aGVyLAotICogZWFjaCBjcmVhdGVkIG9iamVjdCBpcyBhc3NpZ25lZCB0byBhIHBvb2wsIGFuZCB3aG9sZSBwb29scyBjYW4gYmUgZnJlZWQKLSAqIGF0IG9uY2UuICBUaGlzIGlzIGZhc3RlciBhbmQgbW9yZSBjb252ZW5pZW50IHRoYW4gcmVtZW1iZXJpbmcgZXhhY3RseSB3aGF0Ci0gKiB0byBmcmVlLCBlc3BlY2lhbGx5IHdoZXJlIG1hbGxvYygpL2ZyZWUoKSBhcmUgbm90IHRvbyBzcGVlZHkuCi0gKiBOQjogYWxsb2Mgcm91dGluZXMgbmV2ZXIgcmV0dXJuIE5VTEwuICBUaGV5IGV4aXQgdG8gZXJyb3JfZXhpdCBpZiBub3QKLSAqIHN1Y2Nlc3NmdWwuCi0gKi8KLQotI2RlZmluZSBKUE9PTF9QRVJNQU5FTlQJMAkvKiBsYXN0cyB1bnRpbCBtYXN0ZXIgcmVjb3JkIGlzIGRlc3Ryb3llZCAqLwotI2RlZmluZSBKUE9PTF9JTUFHRQkxCS8qIGxhc3RzIHVudGlsIGRvbmUgd2l0aCBpbWFnZS9kYXRhc3RyZWFtICovCi0jZGVmaW5lIEpQT09MX05VTVBPT0xTCTIKLQotdHlwZWRlZiBzdHJ1Y3QganZpcnRfc2FycmF5X2NvbnRyb2wgKiBqdmlydF9zYXJyYXlfcHRyOwotdHlwZWRlZiBzdHJ1Y3QganZpcnRfYmFycmF5X2NvbnRyb2wgKiBqdmlydF9iYXJyYXlfcHRyOwotCi0KLXN0cnVjdCBqcGVnX21lbW9yeV9tZ3IgewotICAvKiBNZXRob2QgcG9pbnRlcnMgKi8KLSAgSk1FVEhPRCh2b2lkICosIGFsbG9jX3NtYWxsLCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwKLQkJCQlzaXplX3Qgc2l6ZW9mb2JqZWN0KSk7Ci0gIEpNRVRIT0Qodm9pZCAgKiwgYWxsb2NfbGFyZ2UsIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLAotCQkJCSAgICAgc2l6ZV90IHNpemVvZm9iamVjdCkpOwotICBKTUVUSE9EKEpTQU1QQVJSQVksIGFsbG9jX3NhcnJheSwgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsCi0JCQkJICAgICBKRElNRU5TSU9OIHNhbXBsZXNwZXJyb3csCi0JCQkJICAgICBKRElNRU5TSU9OIG51bXJvd3MpKTsKLSAgSk1FVEhPRChKQkxPQ0tBUlJBWSwgYWxsb2NfYmFycmF5LCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwKLQkJCQkgICAgICBKRElNRU5TSU9OIGJsb2Nrc3BlcnJvdywKLQkJCQkgICAgICBKRElNRU5TSU9OIG51bXJvd3MpKTsKLSAgSk1FVEhPRChqdmlydF9zYXJyYXlfcHRyLCByZXF1ZXN0X3ZpcnRfc2FycmF5LCAoal9jb21tb25fcHRyIGNpbmZvLAotCQkJCQkJICBpbnQgcG9vbF9pZCwKLQkJCQkJCSAgYm9vbGVhbiBwcmVfemVybywKLQkJCQkJCSAgSkRJTUVOU0lPTiBzYW1wbGVzcGVycm93LAotCQkJCQkJICBKRElNRU5TSU9OIG51bXJvd3MsCi0JCQkJCQkgIEpESU1FTlNJT04gbWF4YWNjZXNzKSk7Ci0gIEpNRVRIT0QoanZpcnRfYmFycmF5X3B0ciwgcmVxdWVzdF92aXJ0X2JhcnJheSwgKGpfY29tbW9uX3B0ciBjaW5mbywKLQkJCQkJCSAgaW50IHBvb2xfaWQsCi0JCQkJCQkgIGJvb2xlYW4gcHJlX3plcm8sCi0JCQkJCQkgIEpESU1FTlNJT04gYmxvY2tzcGVycm93LAotCQkJCQkJICBKRElNRU5TSU9OIG51bXJvd3MsCi0JCQkJCQkgIEpESU1FTlNJT04gbWF4YWNjZXNzKSk7Ci0gIEpNRVRIT0Qodm9pZCwgcmVhbGl6ZV92aXJ0X2FycmF5cywgKGpfY29tbW9uX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKEpTQU1QQVJSQVksIGFjY2Vzc192aXJ0X3NhcnJheSwgKGpfY29tbW9uX3B0ciBjaW5mbywKLQkJCQkJICAganZpcnRfc2FycmF5X3B0ciBwdHIsCi0JCQkJCSAgIEpESU1FTlNJT04gc3RhcnRfcm93LAotCQkJCQkgICBKRElNRU5TSU9OIG51bV9yb3dzLAotCQkJCQkgICBib29sZWFuIHdyaXRhYmxlKSk7Ci0gIEpNRVRIT0QoSkJMT0NLQVJSQVksIGFjY2Vzc192aXJ0X2JhcnJheSwgKGpfY29tbW9uX3B0ciBjaW5mbywKLQkJCQkJICAgIGp2aXJ0X2JhcnJheV9wdHIgcHRyLAotCQkJCQkgICAgSkRJTUVOU0lPTiBzdGFydF9yb3csCi0JCQkJCSAgICBKRElNRU5TSU9OIG51bV9yb3dzLAotCQkJCQkgICAgYm9vbGVhbiB3cml0YWJsZSkpOwotICBKTUVUSE9EKHZvaWQsIGZyZWVfcG9vbCwgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQpKTsKLSAgSk1FVEhPRCh2b2lkLCBzZWxmX2Rlc3RydWN0LCAoal9jb21tb25fcHRyIGNpbmZvKSk7Ci0KLSAgLyogTGltaXQgb24gbWVtb3J5IGFsbG9jYXRpb24gZm9yIHRoaXMgSlBFRyBvYmplY3QuICAoTm90ZSB0aGF0IHRoaXMgaXMKLSAgICogbWVyZWx5IGFkdmlzb3J5LCBub3QgYSBndWFyYW50ZWVkIG1heGltdW07IGl0IG9ubHkgYWZmZWN0cyB0aGUgc3BhY2UKLSAgICogdXNlZCBmb3IgdmlydHVhbC1hcnJheSBidWZmZXJzLikgIE1heSBiZSBjaGFuZ2VkIGJ5IG91dGVyIGFwcGxpY2F0aW9uCi0gICAqIGFmdGVyIGNyZWF0aW5nIHRoZSBKUEVHIG9iamVjdC4KLSAgICovCi0gIGxvbmcgbWF4X21lbW9yeV90b191c2U7Ci0KLSAgLyogTWF4aW11bSBhbGxvY2F0aW9uIHJlcXVlc3QgYWNjZXB0ZWQgYnkgYWxsb2NfbGFyZ2UuICovCi0gIGxvbmcgbWF4X2FsbG9jX2NodW5rOwotfTsKLQotCi0vKiBSb3V0aW5lIHNpZ25hdHVyZSBmb3IgYXBwbGljYXRpb24tc3VwcGxpZWQgbWFya2VyIHByb2Nlc3NpbmcgbWV0aG9kcy4KLSAqIE5lZWQgbm90IHBhc3MgbWFya2VyIGNvZGUgc2luY2UgaXQgaXMgc3RvcmVkIGluIGNpbmZvLT51bnJlYWRfbWFya2VyLgotICovCi10eXBlZGVmIEpNRVRIT0QoYm9vbGVhbiwganBlZ19tYXJrZXJfcGFyc2VyX21ldGhvZCwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLQotCi0vKiBEZWNsYXJhdGlvbnMgZm9yIHJvdXRpbmVzIGNhbGxlZCBieSBhcHBsaWNhdGlvbi4KLSAqIFRoZSBKUFAgbWFjcm8gaGlkZXMgcHJvdG90eXBlIHBhcmFtZXRlcnMgZnJvbSBjb21waWxlcnMgdGhhdCBjYW4ndCBjb3BlLgotICogTm90ZSBKUFAgcmVxdWlyZXMgZG91YmxlIHBhcmVudGhlc2VzLgotICovCi0KLSNpZmRlZiBIQVZFX1BST1RPVFlQRVMKLSNkZWZpbmUgSlBQKGFyZ2xpc3QpCWFyZ2xpc3QKLSNlbHNlCi0jZGVmaW5lIEpQUChhcmdsaXN0KQkoKQotI2VuZGlmCi0KLQotLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuCi0gKiBXZSBzaG9ydGVuIGV4dGVybmFsIG5hbWVzIHRvIGJlIHVuaXF1ZSBpbiB0aGUgZmlyc3Qgc2l4IGxldHRlcnMsIHdoaWNoCi0gKiBpcyBnb29kIGVub3VnaCBmb3IgYWxsIGtub3duIHN5c3RlbXMuCi0gKiAoSWYgeW91ciBjb21waWxlciBpdHNlbGYgbmVlZHMgbmFtZXMgdG8gYmUgdW5pcXVlIGluIGxlc3MgdGhhbiAxNSAKLSAqIGNoYXJhY3RlcnMsIHlvdSBhcmUgb3V0IG9mIGx1Y2suICBHZXQgYSBiZXR0ZXIgY29tcGlsZXIuKQotICovCi0KLSNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jZGVmaW5lIGpwZWdfc3RkX2Vycm9yCQlqU3RkRXJyb3IKLSNkZWZpbmUganBlZ19DcmVhdGVDb21wcmVzcwlqQ3JlYUNvbXByZXNzCi0jZGVmaW5lIGpwZWdfQ3JlYXRlRGVjb21wcmVzcwlqQ3JlYURlY29tcHJlc3MKLSNkZWZpbmUganBlZ19kZXN0cm95X2NvbXByZXNzCWpEZXN0Q29tcHJlc3MKLSNkZWZpbmUganBlZ19kZXN0cm95X2RlY29tcHJlc3MJakRlc3REZWNvbXByZXNzCi0jZGVmaW5lIGpwZWdfc3RkaW9fZGVzdAkJalN0ZERlc3QKLSNkZWZpbmUganBlZ19zdGRpb19zcmMJCWpTdGRTcmMKLSNkZWZpbmUganBlZ19zZXRfZGVmYXVsdHMJalNldERlZmF1bHRzCi0jZGVmaW5lIGpwZWdfc2V0X2NvbG9yc3BhY2UJalNldENvbG9yc3BhY2UKLSNkZWZpbmUganBlZ19kZWZhdWx0X2NvbG9yc3BhY2UJakRlZkNvbG9yc3BhY2UKLSNkZWZpbmUganBlZ19zZXRfcXVhbGl0eQlqU2V0UXVhbGl0eQotI2RlZmluZSBqcGVnX3NldF9saW5lYXJfcXVhbGl0eQlqU2V0TFF1YWxpdHkKLSNkZWZpbmUganBlZ19hZGRfcXVhbnRfdGFibGUJakFkZFF1YW50VGFibGUKLSNkZWZpbmUganBlZ19xdWFsaXR5X3NjYWxpbmcJalF1YWxpdHlTY2FsaW5nCi0jZGVmaW5lIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uCWpTaW1Qcm9ncmVzcwotI2RlZmluZSBqcGVnX3N1cHByZXNzX3RhYmxlcwlqU3VwcHJlc3NUYWJsZXMKLSNkZWZpbmUganBlZ19hbGxvY19xdWFudF90YWJsZQlqQWxjUVRhYmxlCi0jZGVmaW5lIGpwZWdfYWxsb2NfaHVmZl90YWJsZQlqQWxjSFRhYmxlCi0jZGVmaW5lIGpwZWdfc3RhcnRfY29tcHJlc3MJalN0cnRDb21wcmVzcwotI2RlZmluZSBqcGVnX3dyaXRlX3NjYW5saW5lcwlqV3J0U2NhbmxpbmVzCi0jZGVmaW5lIGpwZWdfZmluaXNoX2NvbXByZXNzCWpGaW5Db21wcmVzcwotI2RlZmluZSBqcGVnX3dyaXRlX3Jhd19kYXRhCWpXcnRSYXdEYXRhCi0jZGVmaW5lIGpwZWdfd3JpdGVfbWFya2VyCWpXcnRNYXJrZXIKLSNkZWZpbmUganBlZ193cml0ZV9tX2hlYWRlcglqV3J0TUhlYWRlcgotI2RlZmluZSBqcGVnX3dyaXRlX21fYnl0ZQlqV3J0TUJ5dGUKLSNkZWZpbmUganBlZ193cml0ZV90YWJsZXMJaldydFRhYmxlcwotI2RlZmluZSBqcGVnX3JlYWRfaGVhZGVyCWpSZWFkSGVhZGVyCi0jZGVmaW5lIGpwZWdfc3RhcnRfZGVjb21wcmVzcwlqU3RydERlY29tcHJlc3MKLSNkZWZpbmUganBlZ19yZWFkX3NjYW5saW5lcwlqUmVhZFNjYW5saW5lcwotI2RlZmluZSBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzCWpGaW5EZWNvbXByZXNzCi0jZGVmaW5lIGpwZWdfcmVhZF9yYXdfZGF0YQlqUmVhZFJhd0RhdGEKLSNkZWZpbmUganBlZ19oYXNfbXVsdGlwbGVfc2NhbnMJakhhc011bHRTY24KLSNkZWZpbmUganBlZ19zdGFydF9vdXRwdXQJalN0cnRPdXRwdXQKLSNkZWZpbmUganBlZ19maW5pc2hfb3V0cHV0CWpGaW5PdXRwdXQKLSNkZWZpbmUganBlZ19pbnB1dF9jb21wbGV0ZQlqSW5Db21wbGV0ZQotI2RlZmluZSBqcGVnX25ld19jb2xvcm1hcAlqTmV3Q01hcAotI2RlZmluZSBqcGVnX2NvbnN1bWVfaW5wdXQJakNvbnN1bWVJbnB1dAotI2RlZmluZSBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMJakNhbGNEaW1lbnNpb25zCi0jZGVmaW5lIGpwZWdfc2F2ZV9tYXJrZXJzCWpTYXZlTWFya2VycwotI2RlZmluZSBqcGVnX3NldF9tYXJrZXJfcHJvY2Vzc29yCWpTZXRNYXJrZXIKLSNkZWZpbmUganBlZ19yZWFkX2NvZWZmaWNpZW50cwlqUmVhZENvZWZzCi0jZGVmaW5lIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzCWpXcnRDb2VmcwotI2RlZmluZSBqcGVnX2NvcHlfY3JpdGljYWxfcGFyYW1ldGVycwlqQ29weUNyaXQKLSNkZWZpbmUganBlZ19hYm9ydF9jb21wcmVzcwlqQWJydENvbXByZXNzCi0jZGVmaW5lIGpwZWdfYWJvcnRfZGVjb21wcmVzcwlqQWJydERlY29tcHJlc3MKLSNkZWZpbmUganBlZ19hYm9ydAkJakFib3J0Ci0jZGVmaW5lIGpwZWdfZGVzdHJveQkJakRlc3Ryb3kKLSNkZWZpbmUganBlZ19yZXN5bmNfdG9fcmVzdGFydAlqUmVzeW5jUmVzdGFydAotI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KLQotCi0vKiBEZWZhdWx0IGVycm9yLW1hbmFnZW1lbnQgc2V0dXAgKi8KLUVYVEVSTihzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKikganBlZ19zdGRfZXJyb3IKLQlKUFAoKHN0cnVjdCBqcGVnX2Vycm9yX21nciAqIGVycikpOwotCi0vKiBJbml0aWFsaXphdGlvbiBvZiBKUEVHIGNvbXByZXNzaW9uIG9iamVjdHMuCi0gKiBqcGVnX2NyZWF0ZV9jb21wcmVzcygpIGFuZCBqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKCkgYXJlIHRoZSBleHBvcnRlZAotICogbmFtZXMgdGhhdCBhcHBsaWNhdGlvbnMgc2hvdWxkIGNhbGwuICBUaGVzZSBleHBhbmQgdG8gY2FsbHMgb24KLSAqIGpwZWdfQ3JlYXRlQ29tcHJlc3MgYW5kIGpwZWdfQ3JlYXRlRGVjb21wcmVzcyB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHBhc3NlZCBmb3IgdmVyc2lvbiBtaXNtYXRjaCBjaGVja2luZy4KLSAqIE5COiB5b3UgbXVzdCBzZXQgdXAgdGhlIGVycm9yLW1hbmFnZXIgQkVGT1JFIGNhbGxpbmcganBlZ19jcmVhdGVfeHh4LgotICovCi0jZGVmaW5lIGpwZWdfY3JlYXRlX2NvbXByZXNzKGNpbmZvKSBcCi0gICAganBlZ19DcmVhdGVDb21wcmVzcygoY2luZm8pLCBKUEVHX0xJQl9WRVJTSU9OLCBcCi0JCQkoc2l6ZV90KSBzaXplb2Yoc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0KSkKLSNkZWZpbmUganBlZ19jcmVhdGVfZGVjb21wcmVzcyhjaW5mbykgXAotICAgIGpwZWdfQ3JlYXRlRGVjb21wcmVzcygoY2luZm8pLCBKUEVHX0xJQl9WRVJTSU9OLCBcCi0JCQkgIChzaXplX3QpIHNpemVvZihzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCkpCi1FWFRFUk4odm9pZCkganBlZ19DcmVhdGVDb21wcmVzcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCSAgICAgIGludCB2ZXJzaW9uLCBzaXplX3Qgc3RydWN0c2l6ZSkpOwotRVhURVJOKHZvaWQpIGpwZWdfQ3JlYXRlRGVjb21wcmVzcyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCWludCB2ZXJzaW9uLCBzaXplX3Qgc3RydWN0c2l6ZSkpOwotLyogRGVzdHJ1Y3Rpb24gb2YgSlBFRyBjb21wcmVzc2lvbiBvYmplY3RzICovCi1FWFRFUk4odm9pZCkganBlZ19kZXN0cm95X2NvbXByZXNzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLQotI2lmIDAKLS8qIFN0YW5kYXJkIGRhdGEgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBtYW5hZ2Vyczogc3RkaW8gc3RyZWFtcy4gKi8KLS8qIENhbGxlciBpcyByZXNwb25zaWJsZSBmb3Igb3BlbmluZyB0aGUgZmlsZSBiZWZvcmUgYW5kIGNsb3NpbmcgYWZ0ZXIuICovCi1FWFRFUk4odm9pZCkganBlZ19zdGRpb19kZXN0IEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIEZYU1lTX0ZJTEUgKiBvdXRmaWxlKSk7Ci1FWFRFUk4odm9pZCkganBlZ19zdGRpb19zcmMgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBGWFNZU19GSUxFICogaW5maWxlKSk7Ci0jZW5kaWYKLQotLyogRGVmYXVsdCBwYXJhbWV0ZXIgc2V0dXAgZm9yIGNvbXByZXNzaW9uICovCi1FWFRFUk4odm9pZCkganBlZ19zZXRfZGVmYXVsdHMgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotLyogQ29tcHJlc3Npb24gcGFyYW1ldGVyIHNldHVwIGFpZHMgKi8KLUVYVEVSTih2b2lkKSBqcGVnX3NldF9jb2xvcnNwYWNlIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJICAgICAgSl9DT0xPUl9TUEFDRSBjb2xvcnNwYWNlKSk7Ci1FWFRFUk4odm9pZCkganBlZ19kZWZhdWx0X2NvbG9yc3BhY2UgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGpwZWdfc2V0X3F1YWxpdHkgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHF1YWxpdHksCi0JCQkJICAgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkpOwotRVhURVJOKHZvaWQpIGpwZWdfc2V0X2xpbmVhcl9xdWFsaXR5IEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgaW50IHNjYWxlX2ZhY3RvciwKLQkJCQkJICBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKSk7Ci1FWFRFUk4odm9pZCkganBlZ19hZGRfcXVhbnRfdGFibGUgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHdoaWNoX3RibCwKLQkJCQkgICAgICAgY29uc3QgdW5zaWduZWQgaW50ICpiYXNpY190YWJsZSwKLQkJCQkgICAgICAgaW50IHNjYWxlX2ZhY3RvciwKLQkJCQkgICAgICAgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkpOwotRVhURVJOKGludCkganBlZ19xdWFsaXR5X3NjYWxpbmcgSlBQKChpbnQgcXVhbGl0eSkpOwotRVhURVJOKHZvaWQpIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqcGVnX3N1cHByZXNzX3RhYmxlcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCSAgICAgICBib29sZWFuIHN1cHByZXNzKSk7Ci1FWFRFUk4oSlFVQU5UX1RCTCAqKSBqcGVnX2FsbG9jX3F1YW50X3RhYmxlIEpQUCgoal9jb21tb25fcHRyIGNpbmZvKSk7Ci1FWFRFUk4oSkhVRkZfVEJMICopIGpwZWdfYWxsb2NfaHVmZl90YWJsZSBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbykpOwotCi0vKiBNYWluIGVudHJ5IHBvaW50cyBmb3IgY29tcHJlc3Npb24gKi8KLUVYVEVSTih2b2lkKSBqcGVnX3N0YXJ0X2NvbXByZXNzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJICAgICAgYm9vbGVhbiB3cml0ZV9hbGxfdGFibGVzKSk7Ci1FWFRFUk4oSkRJTUVOU0lPTikganBlZ193cml0ZV9zY2FubGluZXMgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICAgICBKU0FNUEFSUkFZIHNjYW5saW5lcywKLQkJCQkJICAgICBKRElNRU5TSU9OIG51bV9saW5lcykpOwotRVhURVJOKHZvaWQpIGpwZWdfZmluaXNoX2NvbXByZXNzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLQotLyogUmVwbGFjZXMganBlZ193cml0ZV9zY2FubGluZXMgd2hlbiB3cml0aW5nIHJhdyBkb3duc2FtcGxlZCBkYXRhLiAqLwotRVhURVJOKEpESU1FTlNJT04pIGpwZWdfd3JpdGVfcmF3X2RhdGEgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICAgIEpTQU1QSU1BR0UgZGF0YSwKLQkJCQkJICAgIEpESU1FTlNJT04gbnVtX2xpbmVzKSk7Ci0KLS8qIFdyaXRlIGEgc3BlY2lhbCBtYXJrZXIuICBTZWUgbGlianBlZy5kb2MgY29uY2VybmluZyBzYWZlIHVzYWdlLiAqLwotRVhURVJOKHZvaWQpIGpwZWdfd3JpdGVfbWFya2VyCi0JSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlciwKLQkgICAgIGNvbnN0IEpPQ1RFVCAqIGRhdGFwdHIsIHVuc2lnbmVkIGludCBkYXRhbGVuKSk7Ci0vKiBTYW1lLCBidXQgcGllY2VtZWFsLiAqLwotRVhURVJOKHZvaWQpIGpwZWdfd3JpdGVfbV9oZWFkZXIKLQlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikpOwotRVhURVJOKHZvaWQpIGpwZWdfd3JpdGVfbV9ieXRlCi0JSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHZhbCkpOwotCi0vKiBBbHRlcm5hdGUgY29tcHJlc3Npb24gZnVuY3Rpb246IGp1c3Qgd3JpdGUgYW4gYWJicmV2aWF0ZWQgdGFibGUgZmlsZSAqLwotRVhURVJOKHZvaWQpIGpwZWdfd3JpdGVfdGFibGVzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLQotLyogRGVjb21wcmVzc2lvbiBzdGFydHVwOiByZWFkIHN0YXJ0IG9mIEpQRUcgZGF0YXN0cmVhbSB0byBzZWUgd2hhdCdzIHRoZXJlICovCi1FWFRFUk4oaW50KSBqcGVnX3JlYWRfaGVhZGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkgIGJvb2xlYW4gcmVxdWlyZV9pbWFnZSkpOwotLyogUmV0dXJuIHZhbHVlIGlzIG9uZSBvZjogKi8KLSNkZWZpbmUgSlBFR19TVVNQRU5ERUQJCTAgLyogU3VzcGVuZGVkIGR1ZSB0byBsYWNrIG9mIGlucHV0IGRhdGEgKi8KLSNkZWZpbmUgSlBFR19IRUFERVJfT0sJCTEgLyogRm91bmQgdmFsaWQgaW1hZ2UgZGF0YXN0cmVhbSAqLwotI2RlZmluZSBKUEVHX0hFQURFUl9UQUJMRVNfT05MWQkyIC8qIEZvdW5kIHZhbGlkIHRhYmxlLXNwZWNzLW9ubHkgZGF0YXN0cmVhbSAqLwotLyogSWYgeW91IHBhc3MgcmVxdWlyZV9pbWFnZSA9IFRSVUUgKG5vcm1hbCBjYXNlKSwgeW91IG5lZWQgbm90IGNoZWNrIGZvcgotICogYSBUQUJMRVNfT05MWSByZXR1cm4gY29kZTsgYW4gYWJicmV2aWF0ZWQgZmlsZSB3aWxsIGNhdXNlIGFuIGVycm9yIGV4aXQuCi0gKiBKUEVHX1NVU1BFTkRFRCBpcyBvbmx5IHBvc3NpYmxlIGlmIHlvdSB1c2UgYSBkYXRhIHNvdXJjZSBtb2R1bGUgdGhhdCBjYW4KLSAqIGdpdmUgYSBzdXNwZW5zaW9uIHJldHVybiAodGhlIHN0ZGlvIHNvdXJjZSBtb2R1bGUgZG9lc24ndCkuCi0gKi8KLQotLyogTWFpbiBlbnRyeSBwb2ludHMgZm9yIGRlY29tcHJlc3Npb24gKi8KLUVYVEVSTihib29sZWFuKSBqcGVnX3N0YXJ0X2RlY29tcHJlc3MgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4oSkRJTUVOU0lPTikganBlZ19yZWFkX3NjYW5saW5lcyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgICBKU0FNUEFSUkFZIHNjYW5saW5lcywKLQkJCQkJICAgIEpESU1FTlNJT04gbWF4X2xpbmVzKSk7Ci1FWFRFUk4oYm9vbGVhbikganBlZ19maW5pc2hfZGVjb21wcmVzcyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLQotLyogUmVwbGFjZXMganBlZ19yZWFkX3NjYW5saW5lcyB3aGVuIHJlYWRpbmcgcmF3IGRvd25zYW1wbGVkIGRhdGEuICovCi1FWFRFUk4oSkRJTUVOU0lPTikganBlZ19yZWFkX3Jhd19kYXRhIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICAgSlNBTVBJTUFHRSBkYXRhLAotCQkJCQkgICBKRElNRU5TSU9OIG1heF9saW5lcykpOwotCi0vKiBBZGRpdGlvbmFsIGVudHJ5IHBvaW50cyBmb3IgYnVmZmVyZWQtaW1hZ2UgbW9kZS4gKi8KLUVYVEVSTihib29sZWFuKSBqcGVnX2hhc19tdWx0aXBsZV9zY2FucyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTihib29sZWFuKSBqcGVnX3N0YXJ0X291dHB1dCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJICAgICAgIGludCBzY2FuX251bWJlcikpOwotRVhURVJOKGJvb2xlYW4pIGpwZWdfZmluaXNoX291dHB1dCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTihib29sZWFuKSBqcGVnX2lucHV0X2NvbXBsZXRlIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGpwZWdfbmV3X2NvbG9ybWFwIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKGludCkganBlZ19jb25zdW1lX2lucHV0IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotLyogUmV0dXJuIHZhbHVlIGlzIG9uZSBvZjogKi8KLS8qICNkZWZpbmUgSlBFR19TVVNQRU5ERUQJMCAgICBTdXNwZW5kZWQgZHVlIHRvIGxhY2sgb2YgaW5wdXQgZGF0YSAqLwotI2RlZmluZSBKUEVHX1JFQUNIRURfU09TCTEgLyogUmVhY2hlZCBzdGFydCBvZiBuZXcgc2NhbiAqLwotI2RlZmluZSBKUEVHX1JFQUNIRURfRU9JCTIgLyogUmVhY2hlZCBlbmQgb2YgaW1hZ2UgKi8KLSNkZWZpbmUgSlBFR19ST1dfQ09NUExFVEVECTMgLyogQ29tcGxldGVkIG9uZSBpTUNVIHJvdyAqLwotI2RlZmluZSBKUEVHX1NDQU5fQ09NUExFVEVECTQgLyogQ29tcGxldGVkIGxhc3QgaU1DVSByb3cgb2YgYSBzY2FuICovCi0KLS8qIFByZWNhbGN1bGF0ZSBvdXRwdXQgZGltZW5zaW9ucyBmb3IgY3VycmVudCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMuICovCi1FWFRFUk4odm9pZCkganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotCi0vKiBDb250cm9sIHNhdmluZyBvZiBDT00gYW5kIEFQUG4gbWFya2VycyBpbnRvIG1hcmtlcl9saXN0LiAqLwotRVhURVJOKHZvaWQpIGpwZWdfc2F2ZV9tYXJrZXJzCi0JSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyX2NvZGUsCi0JICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoX2xpbWl0KSk7Ci0KLS8qIEluc3RhbGwgYSBzcGVjaWFsIHByb2Nlc3NpbmcgbWV0aG9kIGZvciBDT00gb3IgQVBQbiBtYXJrZXJzLiAqLwotRVhURVJOKHZvaWQpIGpwZWdfc2V0X21hcmtlcl9wcm9jZXNzb3IKLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXJfY29kZSwKLQkgICAgIGpwZWdfbWFya2VyX3BhcnNlcl9tZXRob2Qgcm91dGluZSkpOwotCi0vKiBSZWFkIG9yIHdyaXRlIHJhdyBEQ1QgY29lZmZpY2llbnRzIC0tLSB1c2VmdWwgZm9yIGxvc3NsZXNzIHRyYW5zY29kaW5nLiAqLwotRVhURVJOKGp2aXJ0X2JhcnJheV9wdHIgKikganBlZ19yZWFkX2NvZWZmaWNpZW50cyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgIGp2aXJ0X2JhcnJheV9wdHIgKiBjb2VmX2FycmF5cykpOwotRVhURVJOKHZvaWQpIGpwZWdfY29weV9jcml0aWNhbF9wYXJhbWV0ZXJzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLAotCQkJCQkJal9jb21wcmVzc19wdHIgZHN0aW5mbykpOwotCi0vKiBJZiB5b3UgY2hvb3NlIHRvIGFib3J0IGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gYmVmb3JlIGNvbXBsZXRpbmcKLSAqIGpwZWdfZmluaXNoXyhkZSljb21wcmVzcywgdGhlbiB5b3UgbmVlZCB0byBjbGVhbiB1cCB0byByZWxlYXNlIG1lbW9yeSwKLSAqIHRlbXBvcmFyeSBmaWxlcywgZXRjLiAgWW91IGNhbiBqdXN0IGNhbGwganBlZ19kZXN0cm95XyhkZSljb21wcmVzcwotICogaWYgeW91J3JlIGRvbmUgd2l0aCB0aGUgSlBFRyBvYmplY3QsIGJ1dCBpZiB5b3Ugd2FudCB0byBjbGVhbiBpdCB1cCBhbmQKLSAqIHJldXNlIGl0LCBjYWxsIHRoaXM6Ci0gKi8KLUVYVEVSTih2b2lkKSBqcGVnX2Fib3J0X2NvbXByZXNzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqcGVnX2Fib3J0X2RlY29tcHJlc3MgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLS8qIEdlbmVyaWMgdmVyc2lvbnMgb2YganBlZ19hYm9ydCBhbmQganBlZ19kZXN0cm95IHRoYXQgd29yayBvbiBlaXRoZXIKLSAqIGZsYXZvciBvZiBKUEVHIG9iamVjdC4gIFRoZXNlIG1heSBiZSBtb3JlIGNvbnZlbmllbnQgaW4gc29tZSBwbGFjZXMuCi0gKi8KLUVYVEVSTih2b2lkKSBqcGVnX2Fib3J0IEpQUCgoal9jb21tb25fcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkganBlZ19kZXN0cm95IEpQUCgoal9jb21tb25fcHRyIGNpbmZvKSk7Ci0KLS8qIERlZmF1bHQgcmVzdGFydC1tYXJrZXItcmVzeW5jIHByb2NlZHVyZSBmb3IgdXNlIGJ5IGRhdGEgc291cmNlIG1vZHVsZXMgKi8KLUVYVEVSTihib29sZWFuKSBqcGVnX3Jlc3luY190b19yZXN0YXJ0IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICAgIGludCBkZXNpcmVkKSk7Ci0KLQotLyogVGhlc2UgbWFya2VyIGNvZGVzIGFyZSBleHBvcnRlZCBzaW5jZSBhcHBsaWNhdGlvbnMgYW5kIGRhdGEgc291cmNlIG1vZHVsZXMKLSAqIGFyZSBsaWtlbHkgdG8gd2FudCB0byB1c2UgdGhlbS4KLSAqLwotCi0jZGVmaW5lIEpQRUdfUlNUMAkweEQwCS8qIFJTVDAgbWFya2VyIGNvZGUgKi8KLSNkZWZpbmUgSlBFR19FT0kJMHhEOQkvKiBFT0kgbWFya2VyIGNvZGUgKi8KLSNkZWZpbmUgSlBFR19BUFAwCTB4RTAJLyogQVBQMCBtYXJrZXIgY29kZSAqLwotI2RlZmluZSBKUEVHX0NPTQkweEZFCS8qIENPTSBtYXJrZXIgY29kZSAqLwotCi0KLS8qIElmIHdlIGhhdmUgYSBicmFpbi1kYW1hZ2VkIGNvbXBpbGVyIHRoYXQgZW1pdHMgd2FybmluZ3MgKG9yIHdvcnNlLCBlcnJvcnMpCi0gKiBmb3Igc3RydWN0dXJlIGRlZmluaXRpb25zIHRoYXQgYXJlIG5ldmVyIGZpbGxlZCBpbiwga2VlcCBpdCBxdWlldCBieQotICogc3VwcGx5aW5nIGR1bW15IGRlZmluaXRpb25zIGZvciB0aGUgdmFyaW91cyBzdWJzdHJ1Y3R1cmVzLgotICovCi0KLSNpZmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgotI2lmbmRlZiBKUEVHX0lOVEVSTkFMUwkJLyogd2lsbCBiZSBkZWZpbmVkIGluIGpwZWdpbnQuaCAqLwotc3RydWN0IGp2aXJ0X3NhcnJheV9jb250cm9sIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqdmlydF9iYXJyYXlfY29udHJvbCB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19jb21wX21hc3RlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19jX21haW5fY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19jX3ByZXBfY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19jX2NvZWZfY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19tYXJrZXJfd3JpdGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2NvbG9yX2NvbnZlcnRlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19kb3duc2FtcGxlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19mb3J3YXJkX2RjdCB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19lbnRyb3B5X2VuY29kZXIgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfZGVjb21wX21hc3RlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19kX21haW5fY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19kX2NvZWZfY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19kX3Bvc3RfY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19pbnB1dF9jb250cm9sbGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX21hcmtlcl9yZWFkZXIgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfZW50cm9weV9kZWNvZGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2ludmVyc2VfZGN0IHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX3Vwc2FtcGxlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19jb2xvcl9kZWNvbnZlcnRlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgeyBsb25nIGR1bW15OyB9OwotI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCi0jZW5kaWYgLyogSU5DT01QTEVURV9UWVBFU19CUk9LRU4gKi8KLQotCi0vKgotICogVGhlIEpQRUcgbGlicmFyeSBtb2R1bGVzIGRlZmluZSBKUEVHX0lOVEVSTkFMUyBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgZmlsZS4KLSAqIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgZGVjbGFyYXRpb25zIGFyZSByZWFkIG9ubHkgd2hlbiB0aGF0IGlzIHRydWUuCi0gKiBBcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxpYnJhcnkgc2hvdWxkIG5vdCBpbmNsdWRlIGpwZWdpbnQuaCwgYnV0IG1heSB3aXNoCi0gKiB0byBpbmNsdWRlIGplcnJvci5oLgotICovCi0KLSNpZmRlZiBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImpwZWdpbnQuaCIJCS8qIGZldGNoIHByaXZhdGUgZGVjbGFyYXRpb25zICovCi0jaW5jbHVkZSAiamVycm9yLmgiCQkvKiBmZXRjaCBlcnJvciBjb2RlcyB0b28gKi8KLSNlbmRpZgotCi0jZW5kaWYgLyogSlBFR0xJQl9IICovCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvdGhpcmRwYXJ0aWVzL3psaWIvemNvbmYuaCBiL2NvcmUvaW5jbHVkZS90aGlyZHBhcnRpZXMvemxpYi96Y29uZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzA4YTM3Li4wMDAwMDAwCi0tLSBhL2NvcmUvaW5jbHVkZS90aGlyZHBhcnRpZXMvemxpYi96Y29uZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTE5ICswLDAgQEAKLS8qIHpjb25mLmggLS0gY29uZmlndXJhdGlvbiBvZiB0aGUgemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5Ci0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5LgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qIEAoIykgJElkJCAqLwotCi0jaWZuZGVmIFpDT05GX0gKLSNkZWZpbmUgWkNPTkZfSAotCi0vKgotICogSWYgeW91ICpyZWFsbHkqIG5lZWQgYSB1bmlxdWUgcHJlZml4IGZvciBhbGwgdHlwZXMgYW5kIGxpYnJhcnkgZnVuY3Rpb25zLAotICogY29tcGlsZSB3aXRoIC1EWl9QUkVGSVguIFRoZSAic3RhbmRhcmQiIHpsaWIgc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGhvdXQgaXQuCi0gKiBFdmVuIGJldHRlciB0aGFuIGNvbXBpbGluZyB3aXRoIC1EWl9QUkVGSVggd291bGQgYmUgdG8gdXNlIGNvbmZpZ3VyZSB0byBzZXQKLSAqIHRoaXMgcGVybWFuZW50bHkgaW4gemNvbmYuaCB1c2luZyAiLi9jb25maWd1cmUgLS16cHJlZml4Ii4KLSAqLwotI2lmZGVmIFpfUFJFRklYICAgICAvKiBtYXkgYmUgc2V0IHRvICNpZiAxIGJ5IC4vY29uZmlndXJlICovCi0jICBkZWZpbmUgWl9QUkVGSVhfU0VUCi0KLS8qIGFsbCBsaW5rZWQgc3ltYm9scyAqLwotIyAgZGVmaW5lIF9kaXN0X2NvZGUgICAgICAgICAgICB6X19kaXN0X2NvZGUKLSMgIGRlZmluZSBfbGVuZ3RoX2NvZGUgICAgICAgICAgel9fbGVuZ3RoX2NvZGUKLSMgIGRlZmluZSBfdHJfYWxpZ24gICAgICAgICAgICAgel9fdHJfYWxpZ24KLSMgIGRlZmluZSBfdHJfZmx1c2hfYml0cyAgICAgICAgel9fdHJfZmx1c2hfYml0cwotIyAgZGVmaW5lIF90cl9mbHVzaF9ibG9jayAgICAgICB6X190cl9mbHVzaF9ibG9jawotIyAgZGVmaW5lIF90cl9pbml0ICAgICAgICAgICAgICB6X190cl9pbml0Ci0jICBkZWZpbmUgX3RyX3N0b3JlZF9ibG9jayAgICAgIHpfX3RyX3N0b3JlZF9ibG9jawotIyAgZGVmaW5lIF90cl90YWxseSAgICAgICAgICAgICB6X190cl90YWxseQotIyAgZGVmaW5lIGFkbGVyMzIgICAgICAgICAgICAgICB6X2FkbGVyMzIKLSMgIGRlZmluZSBhZGxlcjMyX2NvbWJpbmUgICAgICAgel9hZGxlcjMyX2NvbWJpbmUKLSMgIGRlZmluZSBhZGxlcjMyX2NvbWJpbmU2NCAgICAgel9hZGxlcjMyX2NvbWJpbmU2NAotIyAgaWZuZGVmIFpfU09MTwotIyAgICBkZWZpbmUgY29tcHJlc3MgICAgICAgICAgICAgIHpfY29tcHJlc3MKLSMgICAgZGVmaW5lIGNvbXByZXNzMiAgICAgICAgICAgICB6X2NvbXByZXNzMgotIyAgICBkZWZpbmUgY29tcHJlc3NCb3VuZCAgICAgICAgIHpfY29tcHJlc3NCb3VuZAotIyAgZW5kaWYKLSMgIGRlZmluZSBjcmMzMiAgICAgICAgICAgICAgICAgel9jcmMzMgotIyAgZGVmaW5lIGNyYzMyX2NvbWJpbmUgICAgICAgICB6X2NyYzMyX2NvbWJpbmUKLSMgIGRlZmluZSBjcmMzMl9jb21iaW5lNjQgICAgICAgel9jcmMzMl9jb21iaW5lNjQKLSMgIGRlZmluZSBkZWZsYXRlICAgICAgICAgICAgICAgel9kZWZsYXRlCi0jICBkZWZpbmUgZGVmbGF0ZUJvdW5kICAgICAgICAgIHpfZGVmbGF0ZUJvdW5kCi0jICBkZWZpbmUgZGVmbGF0ZUNvcHkgICAgICAgICAgIHpfZGVmbGF0ZUNvcHkKLSMgIGRlZmluZSBkZWZsYXRlRW5kICAgICAgICAgICAgel9kZWZsYXRlRW5kCi0jICBkZWZpbmUgZGVmbGF0ZUluaXQyXyAgICAgICAgIHpfZGVmbGF0ZUluaXQyXwotIyAgZGVmaW5lIGRlZmxhdGVJbml0XyAgICAgICAgICB6X2RlZmxhdGVJbml0XwotIyAgZGVmaW5lIGRlZmxhdGVQYXJhbXMgICAgICAgICB6X2RlZmxhdGVQYXJhbXMKLSMgIGRlZmluZSBkZWZsYXRlUGVuZGluZyAgICAgICAgel9kZWZsYXRlUGVuZGluZwotIyAgZGVmaW5lIGRlZmxhdGVQcmltZSAgICAgICAgICB6X2RlZmxhdGVQcmltZQotIyAgZGVmaW5lIGRlZmxhdGVSZXNldCAgICAgICAgICB6X2RlZmxhdGVSZXNldAotIyAgZGVmaW5lIGRlZmxhdGVSZXNldEtlZXAgICAgICB6X2RlZmxhdGVSZXNldEtlZXAKLSMgIGRlZmluZSBkZWZsYXRlU2V0RGljdGlvbmFyeSAgel9kZWZsYXRlU2V0RGljdGlvbmFyeQotIyAgZGVmaW5lIGRlZmxhdGVTZXRIZWFkZXIgICAgICB6X2RlZmxhdGVTZXRIZWFkZXIKLSMgIGRlZmluZSBkZWZsYXRlVHVuZSAgICAgICAgICAgel9kZWZsYXRlVHVuZQotIyAgZGVmaW5lIGRlZmxhdGVfY29weXJpZ2h0ICAgICB6X2RlZmxhdGVfY29weXJpZ2h0Ci0jICBkZWZpbmUgZ2V0X2NyY190YWJsZSAgICAgICAgIHpfZ2V0X2NyY190YWJsZQotIyAgaWZuZGVmIFpfU09MTwotIyAgICBkZWZpbmUgZ3pfZXJyb3IgICAgICAgICAgICAgIHpfZ3pfZXJyb3IKLSMgICAgZGVmaW5lIGd6X2ludG1heCAgICAgICAgICAgICB6X2d6X2ludG1heAotIyAgICBkZWZpbmUgZ3pfc3Ryd2luZXJyb3IgICAgICAgIHpfZ3pfc3Ryd2luZXJyb3IKLSMgICAgZGVmaW5lIGd6YnVmZmVyICAgICAgICAgICAgICB6X2d6YnVmZmVyCi0jICAgIGRlZmluZSBnemNsZWFyZXJyICAgICAgICAgICAgel9nemNsZWFyZXJyCi0jICAgIGRlZmluZSBnemNsb3NlICAgICAgICAgICAgICAgel9nemNsb3NlCi0jICAgIGRlZmluZSBnemNsb3NlX3IgICAgICAgICAgICAgel9nemNsb3NlX3IKLSMgICAgZGVmaW5lIGd6Y2xvc2VfdyAgICAgICAgICAgICB6X2d6Y2xvc2VfdwotIyAgICBkZWZpbmUgZ3pkaXJlY3QgICAgICAgICAgICAgIHpfZ3pkaXJlY3QKLSMgICAgZGVmaW5lIGd6ZG9wZW4gICAgICAgICAgICAgICB6X2d6ZG9wZW4KLSMgICAgZGVmaW5lIGd6ZW9mICAgICAgICAgICAgICAgICB6X2d6ZW9mCi0jICAgIGRlZmluZSBnemVycm9yICAgICAgICAgICAgICAgel9nemVycm9yCi0jICAgIGRlZmluZSBnemZsdXNoICAgICAgICAgICAgICAgel9nemZsdXNoCi0jICAgIGRlZmluZSBnemdldGMgICAgICAgICAgICAgICAgel9nemdldGMKLSMgICAgZGVmaW5lIGd6Z2V0Y18gICAgICAgICAgICAgICB6X2d6Z2V0Y18KLSMgICAgZGVmaW5lIGd6Z2V0cyAgICAgICAgICAgICAgICB6X2d6Z2V0cwotIyAgICBkZWZpbmUgZ3pvZmZzZXQgICAgICAgICAgICAgIHpfZ3pvZmZzZXQKLSMgICAgZGVmaW5lIGd6b2Zmc2V0NjQgICAgICAgICAgICB6X2d6b2Zmc2V0NjQKLSMgICAgZGVmaW5lIGd6b3BlbiAgICAgICAgICAgICAgICB6X2d6b3BlbgotIyAgICBkZWZpbmUgZ3pvcGVuNjQgICAgICAgICAgICAgIHpfZ3pvcGVuNjQKLSMgICAgaWZkZWYgX1dJTjMyCi0jICAgICAgZGVmaW5lIGd6b3Blbl93ICAgICAgICAgICAgICB6X2d6b3Blbl93Ci0jICAgIGVuZGlmCi0jICAgIGRlZmluZSBnenByaW50ZiAgICAgICAgICAgICAgel9nenByaW50ZgotIyAgICBkZWZpbmUgZ3p2cHJpbnRmICAgICAgICAgICAgIHpfZ3p2cHJpbnRmCi0jICAgIGRlZmluZSBnenB1dGMgICAgICAgICAgICAgICAgel9nenB1dGMKLSMgICAgZGVmaW5lIGd6cHV0cyAgICAgICAgICAgICAgICB6X2d6cHV0cwotIyAgICBkZWZpbmUgZ3pyZWFkICAgICAgICAgICAgICAgIHpfZ3pyZWFkCi0jICAgIGRlZmluZSBnenJld2luZCAgICAgICAgICAgICAgel9nenJld2luZAotIyAgICBkZWZpbmUgZ3pzZWVrICAgICAgICAgICAgICAgIHpfZ3pzZWVrCi0jICAgIGRlZmluZSBnenNlZWs2NCAgICAgICAgICAgICAgel9nenNlZWs2NAotIyAgICBkZWZpbmUgZ3pzZXRwYXJhbXMgICAgICAgICAgIHpfZ3pzZXRwYXJhbXMKLSMgICAgZGVmaW5lIGd6dGVsbCAgICAgICAgICAgICAgICB6X2d6dGVsbAotIyAgICBkZWZpbmUgZ3p0ZWxsNjQgICAgICAgICAgICAgIHpfZ3p0ZWxsNjQKLSMgICAgZGVmaW5lIGd6dW5nZXRjICAgICAgICAgICAgICB6X2d6dW5nZXRjCi0jICAgIGRlZmluZSBnendyaXRlICAgICAgICAgICAgICAgel9nendyaXRlCi0jICBlbmRpZgotIyAgZGVmaW5lIGluZmxhdGUgICAgICAgICAgICAgICB6X2luZmxhdGUKLSMgIGRlZmluZSBpbmZsYXRlQmFjayAgICAgICAgICAgel9pbmZsYXRlQmFjawotIyAgZGVmaW5lIGluZmxhdGVCYWNrRW5kICAgICAgICB6X2luZmxhdGVCYWNrRW5kCi0jICBkZWZpbmUgaW5mbGF0ZUJhY2tJbml0XyAgICAgIHpfaW5mbGF0ZUJhY2tJbml0XwotIyAgZGVmaW5lIGluZmxhdGVDb3B5ICAgICAgICAgICB6X2luZmxhdGVDb3B5Ci0jICBkZWZpbmUgaW5mbGF0ZUVuZCAgICAgICAgICAgIHpfaW5mbGF0ZUVuZAotIyAgZGVmaW5lIGluZmxhdGVHZXRIZWFkZXIgICAgICB6X2luZmxhdGVHZXRIZWFkZXIKLSMgIGRlZmluZSBpbmZsYXRlSW5pdDJfICAgICAgICAgel9pbmZsYXRlSW5pdDJfCi0jICBkZWZpbmUgaW5mbGF0ZUluaXRfICAgICAgICAgIHpfaW5mbGF0ZUluaXRfCi0jICBkZWZpbmUgaW5mbGF0ZU1hcmsgICAgICAgICAgIHpfaW5mbGF0ZU1hcmsKLSMgIGRlZmluZSBpbmZsYXRlUHJpbWUgICAgICAgICAgel9pbmZsYXRlUHJpbWUKLSMgIGRlZmluZSBpbmZsYXRlUmVzZXQgICAgICAgICAgel9pbmZsYXRlUmVzZXQKLSMgIGRlZmluZSBpbmZsYXRlUmVzZXQyICAgICAgICAgel9pbmZsYXRlUmVzZXQyCi0jICBkZWZpbmUgaW5mbGF0ZVNldERpY3Rpb25hcnkgIHpfaW5mbGF0ZVNldERpY3Rpb25hcnkKLSMgIGRlZmluZSBpbmZsYXRlR2V0RGljdGlvbmFyeSAgel9pbmZsYXRlR2V0RGljdGlvbmFyeQotIyAgZGVmaW5lIGluZmxhdGVTeW5jICAgICAgICAgICB6X2luZmxhdGVTeW5jCi0jICBkZWZpbmUgaW5mbGF0ZVN5bmNQb2ludCAgICAgIHpfaW5mbGF0ZVN5bmNQb2ludAotIyAgZGVmaW5lIGluZmxhdGVVbmRlcm1pbmUgICAgICB6X2luZmxhdGVVbmRlcm1pbmUKLSMgIGRlZmluZSBpbmZsYXRlUmVzZXRLZWVwICAgICAgel9pbmZsYXRlUmVzZXRLZWVwCi0jICBkZWZpbmUgaW5mbGF0ZV9jb3B5cmlnaHQgICAgIHpfaW5mbGF0ZV9jb3B5cmlnaHQKLSMgIGRlZmluZSBpbmZsYXRlX2Zhc3QgICAgICAgICAgel9pbmZsYXRlX2Zhc3QKLSMgIGRlZmluZSBpbmZsYXRlX3RhYmxlICAgICAgICAgel9pbmZsYXRlX3RhYmxlCi0jICBpZm5kZWYgWl9TT0xPCi0jICAgIGRlZmluZSB1bmNvbXByZXNzICAgICAgICAgICAgel91bmNvbXByZXNzCi0jICBlbmRpZgotIyAgZGVmaW5lIHpFcnJvciAgICAgICAgICAgICAgICB6X3pFcnJvcgotIyAgaWZuZGVmIFpfU09MTwotIyAgICBkZWZpbmUgemNhbGxvYyAgICAgICAgICAgICAgIHpfemNhbGxvYwotIyAgICBkZWZpbmUgemNmcmVlICAgICAgICAgICAgICAgIHpfemNmcmVlCi0jICBlbmRpZgotIyAgZGVmaW5lIHpsaWJDb21waWxlRmxhZ3MgICAgICB6X3psaWJDb21waWxlRmxhZ3MKLSMgIGRlZmluZSB6bGliVmVyc2lvbiAgICAgICAgICAgel96bGliVmVyc2lvbgotCi0vKiBhbGwgemxpYiB0eXBlZGVmcyBpbiB6bGliLmggYW5kIHpjb25mLmggKi8KLSMgIGRlZmluZSBCeXRlICAgICAgICAgICAgICAgICAgel9CeXRlCi0jICBkZWZpbmUgQnl0ZWYgICAgICAgICAgICAgICAgIHpfQnl0ZWYKLSMgIGRlZmluZSBhbGxvY19mdW5jICAgICAgICAgICAgel9hbGxvY19mdW5jCi0jICBkZWZpbmUgY2hhcmYgICAgICAgICAgICAgICAgIHpfY2hhcmYKLSMgIGRlZmluZSBmcmVlX2Z1bmMgICAgICAgICAgICAgel9mcmVlX2Z1bmMKLSMgIGlmbmRlZiBaX1NPTE8KLSMgICAgZGVmaW5lIGd6RmlsZSAgICAgICAgICAgICAgICB6X2d6RmlsZQotIyAgZW5kaWYKLSMgIGRlZmluZSBnel9oZWFkZXIgICAgICAgICAgICAgel9nel9oZWFkZXIKLSMgIGRlZmluZSBnel9oZWFkZXJwICAgICAgICAgICAgel9nel9oZWFkZXJwCi0jICBkZWZpbmUgaW5fZnVuYyAgICAgICAgICAgICAgIHpfaW5fZnVuYwotIyAgZGVmaW5lIGludGYgICAgICAgICAgICAgICAgICB6X2ludGYKLSMgIGRlZmluZSBvdXRfZnVuYyAgICAgICAgICAgICAgel9vdXRfZnVuYwotIyAgZGVmaW5lIHVJbnQgICAgICAgICAgICAgICAgICB6X3VJbnQKLSMgIGRlZmluZSB1SW50ZiAgICAgICAgICAgICAgICAgel91SW50ZgotIyAgZGVmaW5lIHVMb25nICAgICAgICAgICAgICAgICB6X3VMb25nCi0jICBkZWZpbmUgdUxvbmdmICAgICAgICAgICAgICAgIHpfdUxvbmdmCi0jICBkZWZpbmUgdm9pZHAgICAgICAgICAgICAgICAgIHpfdm9pZHAKLSMgIGRlZmluZSB2b2lkcGMgICAgICAgICAgICAgICAgel92b2lkcGMKLSMgIGRlZmluZSB2b2lkcGYgICAgICAgICAgICAgICAgel92b2lkcGYKLQotLyogYWxsIHpsaWIgc3RydWN0cyBpbiB6bGliLmggYW5kIHpjb25mLmggKi8KLSMgIGRlZmluZSBnel9oZWFkZXJfcyAgICAgICAgICAgel9nel9oZWFkZXJfcwotIyAgZGVmaW5lIGludGVybmFsX3N0YXRlICAgICAgICB6X2ludGVybmFsX3N0YXRlCi0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX01TRE9TX18pICYmICFkZWZpbmVkKE1TRE9TKQotIyAgZGVmaW5lIE1TRE9TCi0jZW5kaWYKLSNpZiAoZGVmaW5lZChPU18yKSB8fCBkZWZpbmVkKF9fT1MyX18pKSAmJiAhZGVmaW5lZChPUzIpCi0jICBkZWZpbmUgT1MyCi0jZW5kaWYKLSNpZiBkZWZpbmVkKF9XSU5ET1dTKSAmJiAhZGVmaW5lZChXSU5ET1dTKQotIyAgZGVmaW5lIFdJTkRPV1MKLSNlbmRpZgotI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMl9XQ0UpIHx8IGRlZmluZWQoX19XSU4zMl9fKQotIyAgaWZuZGVmIFdJTjMyCi0jICAgIGRlZmluZSBXSU4zMgotIyAgZW5kaWYKLSNlbmRpZgotI2lmIChkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChXSU5ET1dTKSkgJiYgIWRlZmluZWQoV0lOMzIpCi0jICBpZiAhZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19GTEFUX18pICYmICFkZWZpbmVkKF9fMzg2X18pCi0jICAgIGlmbmRlZiBTWVMxNkJJVAotIyAgICAgIGRlZmluZSBTWVMxNkJJVAotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi0vKgotICogQ29tcGlsZSB3aXRoIC1ETUFYU0VHXzY0SyBpZiB0aGUgYWxsb2MgZnVuY3Rpb24gY2Fubm90IGFsbG9jYXRlIG1vcmUKLSAqIHRoYW4gNjRrIGJ5dGVzIGF0IGEgdGltZSAobmVlZGVkIG9uIHN5c3RlbXMgd2l0aCAxNi1iaXQgaW50KS4KLSAqLwotI2lmZGVmIFNZUzE2QklUCi0jICBkZWZpbmUgTUFYU0VHXzY0SwotI2VuZGlmCi0jaWZkZWYgTVNET1MKLSMgIGRlZmluZSBVTkFMSUdORURfT0sKLSNlbmRpZgotCi0jaWZkZWYgX19TVERDX1ZFUlNJT05fXwotIyAgaWZuZGVmIFNUREMKLSMgICAgZGVmaW5lIFNUREMKLSMgIGVuZGlmCi0jICBpZiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKLSMgICAgaWZuZGVmIFNUREM5OQotIyAgICAgIGRlZmluZSBTVERDOTkKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykpCi0jICBkZWZpbmUgU1REQwotI2VuZGlmCi0jaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKSkKLSMgIGRlZmluZSBTVERDCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU5ET1dTKSB8fCBkZWZpbmVkKFdJTjMyKSkKLSMgIGRlZmluZSBTVERDCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoX19IT1NfQUlYX18pKQotIyAgZGVmaW5lIFNUREMKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX09TNDAwX18pICYmICFkZWZpbmVkKFNUREMpICAgIC8qIGlTZXJpZXMgKGZvcm1lcmx5IEFTLzQwMCkuICovCi0jICBkZWZpbmUgU1REQwotI2VuZGlmCi0KLSNpZm5kZWYgU1REQwotIyAgaWZuZGVmIGNvbnN0IC8qIGNhbm5vdCB1c2UgIWRlZmluZWQoU1REQykgJiYgIWRlZmluZWQoY29uc3QpIG9uIE1hYyAqLwotIyAgICBkZWZpbmUgY29uc3QgICAgICAgLyogbm90ZTogbmVlZCBhIG1vcmUgZ2VudGxlIHNvbHV0aW9uIGhlcmUgKi8KLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoWkxJQl9DT05TVCkgJiYgIWRlZmluZWQoel9jb25zdCkKLSMgIGRlZmluZSB6X2NvbnN0IGNvbnN0Ci0jZWxzZQotIyAgZGVmaW5lIHpfY29uc3QKLSNlbmRpZgotCi0vKiBTb21lIE1hYyBjb21waWxlcnMgbWVyZ2UgYWxsIC5oIGZpbGVzIGluY29ycmVjdGx5OiAqLwotI2lmIGRlZmluZWQoX19NV0VSS1NfXyl8fGRlZmluZWQoYXBwbGVjKXx8ZGVmaW5lZChUSElOS19DKXx8ZGVmaW5lZChfX1NDX18pCi0jICBkZWZpbmUgTk9fRFVNTVlfREVDTAotI2VuZGlmCi0KLS8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJbml0MiAqLwotI2lmbmRlZiBNQVhfTUVNX0xFVkVMCi0jICBpZmRlZiBNQVhTRUdfNjRLCi0jICAgIGRlZmluZSBNQVhfTUVNX0xFVkVMIDgKLSMgIGVsc2UKLSMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOQotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBNYXhpbXVtIHZhbHVlIGZvciB3aW5kb3dCaXRzIGluIGRlZmxhdGVJbml0MiBhbmQgaW5mbGF0ZUluaXQyLgotICogV0FSTklORzogcmVkdWNpbmcgTUFYX1dCSVRTIG1ha2VzIG1pbmlnemlwIHVuYWJsZSB0byBleHRyYWN0IC5neiBmaWxlcwotICogY3JlYXRlZCBieSBnemlwLiAoRmlsZXMgY3JlYXRlZCBieSBtaW5pZ3ppcCBjYW4gc3RpbGwgYmUgZXh0cmFjdGVkIGJ5Ci0gKiBnemlwLikKLSAqLwotI2lmbmRlZiBNQVhfV0JJVFMKLSMgIGRlZmluZSBNQVhfV0JJVFMgICAxNSAvKiAzMksgTFo3NyB3aW5kb3cgKi8KLSNlbmRpZgotCi0vKiBUaGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgZGVmbGF0ZSBhcmUgKGluIGJ5dGVzKToKLSAgICAgICAgICAgICgxIDw8ICh3aW5kb3dCaXRzKzIpKSArICAoMSA8PCAobWVtTGV2ZWwrOSkpCi0gdGhhdCBpczogMTI4SyBmb3Igd2luZG93Qml0cz0xNSAgKyAgMTI4SyBmb3IgbWVtTGV2ZWwgPSA4ICAoZGVmYXVsdCB2YWx1ZXMpCi0gcGx1cyBhIGZldyBraWxvYnl0ZXMgZm9yIHNtYWxsIG9iamVjdHMuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byByZWR1Y2UKLSB0aGUgZGVmYXVsdCBtZW1vcnkgcmVxdWlyZW1lbnRzIGZyb20gMjU2SyB0byAxMjhLLCBjb21waWxlIHdpdGgKLSAgICAgbWFrZSBDRkxBR1M9Ii1PIC1ETUFYX1dCSVRTPTE0IC1ETUFYX01FTV9MRVZFTD03IgotIE9mIGNvdXJzZSB0aGlzIHdpbGwgZ2VuZXJhbGx5IGRlZ3JhZGUgY29tcHJlc3Npb24gKHRoZXJlJ3Mgbm8gZnJlZSBsdW5jaCkuCi0KLSAgIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBpbmZsYXRlIGFyZSAoaW4gYnl0ZXMpIDEgPDwgd2luZG93Qml0cwotIHRoYXQgaXMsIDMySyBmb3Igd2luZG93Qml0cz0xNSAoZGVmYXVsdCB2YWx1ZSkgcGx1cyBhIGZldyBraWxvYnl0ZXMKLSBmb3Igc21hbGwgb2JqZWN0cy4KLSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgZGVjbGFyYXRpb25zICovCi0KLSNpZm5kZWYgT0YgLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLwotIyAgaWZkZWYgU1REQwotIyAgICBkZWZpbmUgT0YoYXJncykgIGFyZ3MKLSMgIGVsc2UKLSMgICAgZGVmaW5lIE9GKGFyZ3MpICAoKQotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFpfQVJHIC8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIHN0ZGFyZyAqLwotIyAgaWYgZGVmaW5lZChTVERDKSB8fCBkZWZpbmVkKFpfSEFWRV9TVERBUkdfSCkKLSMgICAgZGVmaW5lIFpfQVJHKGFyZ3MpICBhcmdzCi0jICBlbHNlCi0jICAgIGRlZmluZSBaX0FSRyhhcmdzKSAgKCkKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBmb3IgRkFSIGFyZSBuZWVkZWQgb25seSBmb3IgTVNET1MgbWl4ZWQKLSAqIG1vZGVsIHByb2dyYW1taW5nIChzbWFsbCBvciBtZWRpdW0gbW9kZWwgd2l0aCBzb21lIGZhciBhbGxvY2F0aW9ucykuCi0gKiBUaGlzIHdhcyB0ZXN0ZWQgb25seSB3aXRoIE1TQzsgZm9yIG90aGVyIE1TRE9TIGNvbXBpbGVycyB5b3UgbWF5IGhhdmUKLSAqIHRvIGRlZmluZSBOT19NRU1DUFkgaW4genV0aWwuaC4gIElmIHlvdSBkb24ndCBuZWVkIHRoZSBtaXhlZCBtb2RlbCwKLSAqIGp1c3QgZGVmaW5lIEZBUiB0byBiZSBlbXB0eS4KLSAqLwotI2lmZGVmIFNZUzE2QklUCi0jICBpZiBkZWZpbmVkKE1fSTg2U00pIHx8IGRlZmluZWQoTV9JODZNTSkKLSAgICAgLyogTVNDIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLwotIyAgICBkZWZpbmUgU01BTExfTUVESVVNCi0jICAgIGlmZGVmIF9NU0NfVkVSCi0jICAgICAgZGVmaW5lIEZBUiBfZmFyCi0jICAgIGVsc2UKLSMgICAgICBkZWZpbmUgRkFSIGZhcgotIyAgICBlbmRpZgotIyAgZW5kaWYKLSMgIGlmIChkZWZpbmVkKF9fU01BTExfXykgfHwgZGVmaW5lZChfX01FRElVTV9fKSkKLSAgICAgLyogVHVyYm8gQyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KLSMgICAgZGVmaW5lIFNNQUxMX01FRElVTQotIyAgICBpZmRlZiBfX0JPUkxBTkRDX18KLSMgICAgICBkZWZpbmUgRkFSIF9mYXIKLSMgICAgZWxzZQotIyAgICAgIGRlZmluZSBGQVIgZmFyCi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFdJTkRPV1MpIHx8IGRlZmluZWQoV0lOMzIpCi0gICAvKiBJZiBidWlsZGluZyBvciB1c2luZyB6bGliIGFzIGEgRExMLCBkZWZpbmUgWkxJQl9ETEwuCi0gICAgKiBUaGlzIGlzIG5vdCBtYW5kYXRvcnksIGJ1dCBpdCBvZmZlcnMgYSBsaXR0bGUgcGVyZm9ybWFuY2UgaW5jcmVhc2UuCi0gICAgKi8KLSMgIGlmZGVmIFpMSUJfRExMCi0jICAgIGlmIGRlZmluZWQoV0lOMzIpICYmICghZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IChfX0JPUkxBTkRDX18gPj0gMHg1MDApKQotIyAgICAgIGlmZGVmIFpMSUJfSU5URVJOQUwKLSMgICAgICAgIGRlZmluZSBaRVhURVJOIGV4dGVybiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSMgICAgICBlbHNlCi0jICAgICAgICBkZWZpbmUgWkVYVEVSTiBleHRlcm4gX19kZWNsc3BlYyhkbGxpbXBvcnQpCi0jICAgICAgZW5kaWYKLSMgICAgZW5kaWYKLSMgIGVuZGlmICAvKiBaTElCX0RMTCAqLwotICAgLyogSWYgYnVpbGRpbmcgb3IgdXNpbmcgemxpYiB3aXRoIHRoZSBXSU5BUEkvV0lOQVBJViBjYWxsaW5nIGNvbnZlbnRpb24sCi0gICAgKiBkZWZpbmUgWkxJQl9XSU5BUEkuCi0gICAgKiBDYXV0aW9uOiB0aGUgc3RhbmRhcmQgWkxJQjEuRExMIGlzIE5PVCBjb21waWxlZCB1c2luZyBaTElCX1dJTkFQSS4KLSAgICAqLwotIyAgaWZkZWYgWkxJQl9XSU5BUEkKLSMgICAgaWZkZWYgRkFSCi0jICAgICAgdW5kZWYgRkFSCi0jICAgIGVuZGlmCi0jICAgIGluY2x1ZGUgPHdpbmRvd3MuaD4KLSAgICAgLyogTm8gbmVlZCBmb3IgX2V4cG9ydCwgdXNlIFpMSUIuREVGIGluc3RlYWQuICovCi0gICAgIC8qIEZvciBjb21wbGV0ZSBXaW5kb3dzIGNvbXBhdGliaWxpdHksIHVzZSBXSU5BUEksIG5vdCBfX3N0ZGNhbGwuICovCi0jICAgIGRlZmluZSBaRVhQT1JUIFdJTkFQSQotIyAgICBpZmRlZiBXSU4zMgotIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgV0lOQVBJVgotIyAgICBlbHNlCi0jICAgICAgZGVmaW5lIFpFWFBPUlRWQSBGQVIgQ0RFQ0wKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fQkVPU19fKQotIyAgaWZkZWYgWkxJQl9ETEwKLSMgICAgaWZkZWYgWkxJQl9JTlRFUk5BTAotIyAgICAgIGRlZmluZSBaRVhQT1JUICAgX19kZWNsc3BlYyhkbGxleHBvcnQpCi0jICAgICAgZGVmaW5lIFpFWFBPUlRWQSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSMgICAgZWxzZQotIyAgICAgIGRlZmluZSBaRVhQT1JUICAgX19kZWNsc3BlYyhkbGxpbXBvcnQpCi0jICAgICAgZGVmaW5lIFpFWFBPUlRWQSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBaRVhURVJOCi0jICBkZWZpbmUgWkVYVEVSTiBleHRlcm4KLSNlbmRpZgotI2lmbmRlZiBaRVhQT1JUCi0jICBkZWZpbmUgWkVYUE9SVAotI2VuZGlmCi0jaWZuZGVmIFpFWFBPUlRWQQotIyAgZGVmaW5lIFpFWFBPUlRWQQotI2VuZGlmCi0KLSNpZm5kZWYgRkFSCi0jICBkZWZpbmUgRkFSCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKF9fTUFDVFlQRVNfXykKLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgQnl0ZTsgIC8qIDggYml0cyAqLwotI2VuZGlmCi10eXBlZGVmIHVuc2lnbmVkIGludCAgIHVJbnQ7ICAvKiAxNiBiaXRzIG9yIG1vcmUgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAgdUxvbmc7IC8qIDMyIGJpdHMgb3IgbW9yZSAqLwotCi0jaWZkZWYgU01BTExfTUVESVVNCi0gICAvKiBCb3JsYW5kIEMvQysrIGFuZCBzb21lIG9sZCBNU0MgdmVyc2lvbnMgaWdub3JlIEZBUiBpbnNpZGUgdHlwZWRlZiAqLwotIyAgZGVmaW5lIEJ5dGVmIEJ5dGUgRkFSCi0jZWxzZQotICAgdHlwZWRlZiBCeXRlICBGQVIgQnl0ZWY7Ci0jZW5kaWYKLXR5cGVkZWYgY2hhciAgRkFSIGNoYXJmOwotdHlwZWRlZiBpbnQgICBGQVIgaW50ZjsKLXR5cGVkZWYgdUludCAgRkFSIHVJbnRmOwotdHlwZWRlZiB1TG9uZyBGQVIgdUxvbmdmOwotCi0jaWZkZWYgU1REQwotICAgdHlwZWRlZiB2b2lkIGNvbnN0ICp2b2lkcGM7Ci0gICB0eXBlZGVmIHZvaWQgRkFSICAgKnZvaWRwZjsKLSAgIHR5cGVkZWYgdm9pZCAgICAgICAqdm9pZHA7Ci0jZWxzZQotICAgdHlwZWRlZiBCeXRlIGNvbnN0ICp2b2lkcGM7Ci0gICB0eXBlZGVmIEJ5dGUgRkFSICAgKnZvaWRwZjsKLSAgIHR5cGVkZWYgQnl0ZSAgICAgICAqdm9pZHA7Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkKFpfVTQpICYmICFkZWZpbmVkKFpfU09MTykgJiYgZGVmaW5lZChTVERDKQotIyAgaW5jbHVkZSA8bGltaXRzLmg+Ci0jICBpZiAoVUlOVF9NQVggPT0gMHhmZmZmZmZmZlVMKQotIyAgICBkZWZpbmUgWl9VNCB1bnNpZ25lZAotIyAgZWxpZiAoVUxPTkdfTUFYID09IDB4ZmZmZmZmZmZVTCkKLSMgICAgZGVmaW5lIFpfVTQgdW5zaWduZWQgbG9uZwotIyAgZWxpZiAoVVNIUlRfTUFYID09IDB4ZmZmZmZmZmZVTCkKLSMgICAgZGVmaW5lIFpfVTQgdW5zaWduZWQgc2hvcnQKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFpfVTQKLSAgIHR5cGVkZWYgWl9VNCB6X2NyY190OwotI2Vsc2UKLSAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyB6X2NyY190OwotI2VuZGlmCi0KLSNpZiAwCQkJCS8qIFN1bmxpYW5nLkxpdSAyMDEwMDkwOCBzeW5jIHRoZSBjb25maWcgdG8gdGhlIG9sZCByZXZpc2lvbiwgb3RoZXJ3aXNlLCBldmMgY29tcGlsZSBmYWlsZWQuICovCi0jaWZkZWYgSEFWRV9VTklTVERfSCAgICAvKiBtYXkgYmUgc2V0IHRvICNpZiAxIGJ5IC4vY29uZmlndXJlICovCi0jICBkZWZpbmUgWl9IQVZFX1VOSVNURF9ICi0jZW5kaWYKLSNlbmRpZiAvKiAwICovCi0KLSNpZmRlZiBIQVZFX1NUREFSR19IICAgIC8qIG1heSBiZSBzZXQgdG8gI2lmIDEgYnkgLi9jb25maWd1cmUgKi8KLSMgIGRlZmluZSBaX0hBVkVfU1REQVJHX0gKLSNlbmRpZgotCi0jaWYgMAkJCQkvKiBTdW5saWFuZy5MaXUgMjAxMDA5MDggc3luYyB0aGUgY29uZmlnIHRvIHRoZSBvbGQgcmV2aXNpb24sIG90aGVyd2lzZSwgZXZjIGNvbXBpbGUgZmFpbGVkLiAqLwotI2lmZGVmIFNUREMKLSMgIGlmbmRlZiBaX1NPTE8KLSMgICAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAgICAgLyogZm9yIG9mZl90ICovCi0jICBlbmRpZgotI2VuZGlmCi0jZW5kaWYgLyogMCAqLwotCi0jaWYgZGVmaW5lZChTVERDKSB8fCBkZWZpbmVkKFpfSEFWRV9TVERBUkdfSCkKLSMgIGlmbmRlZiBaX1NPTE8KLSMgICAgaW5jbHVkZSA8c3RkYXJnLmg+ICAgICAgICAgLyogZm9yIHZhX2xpc3QgKi8KLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIF9XSU4zMgotIyAgaWZuZGVmIFpfU09MTwotIyAgICBpbmNsdWRlIDxzdGRkZWYuaD4gICAgICAgICAvKiBmb3Igd2NoYXJfdCAqLwotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgMAkJCQkvKiBTdW5saWFuZy5MaXUgMjAxMDA5MDggc3luYyB0aGUgY29uZmlnIHRvIHRoZSBvbGQgcmV2aXNpb24sIG90aGVyd2lzZSwgZXZjIGNvbXBpbGUgZmFpbGVkLiAqLwotLyogYSBsaXR0bGUgdHJpY2sgdG8gYWNjb21tb2RhdGUgYm90aCAiI2RlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIiBhbmQKLSAqICIjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UgMSIgYXMgcmVxdWVzdGluZyA2NC1iaXQgb3BlcmF0aW9ucywgKGV2ZW4KLSAqIHRob3VnaCB0aGUgZm9ybWVyIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIExGUyBkb2N1bWVudCksIGJ1dCBjb25zaWRlcmluZwotICogYm90aCAiI3VuZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UiIGFuZCAiI2RlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIDAiIGFzCi0gKiBlcXVpdmFsZW50bHkgcmVxdWVzdGluZyBubyA2NC1iaXQgb3BlcmF0aW9ucwotICovCi0jaWYgZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKSAmJiAtX0xBUkdFRklMRTY0X1NPVVJDRSAtIC0xID09IDEKLSMgIHVuZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UKLSNlbmRpZgotI2VuZGlmIC8qIDAgKi8KLQotI2lmIGRlZmluZWQoX19XQVRDT01DX18pICYmICFkZWZpbmVkKFpfSEFWRV9VTklTVERfSCkKLSMgIGRlZmluZSBaX0hBVkVfVU5JU1REX0gKLSNlbmRpZgotI2lmbmRlZiBaX1NPTE8KLSNpZiAwCQkJCS8qIFN1bmxpYW5nLkxpdSAyMDEwMDkwOCBzeW5jIHRoZSBjb25maWcgdG8gdGhlIG9sZCByZXZpc2lvbiwgb3RoZXJ3aXNlLCBldmMgY29tcGlsZSBmYWlsZWQuICovCi0jICBpZiBkZWZpbmVkKFpfSEFWRV9VTklTVERfSCkgfHwgZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKQotIyAgICBpbmNsdWRlIDx1bmlzdGQuaD4gICAgICAgICAvKiBmb3IgU0VFS18qLCBvZmZfdCwgYW5kIF9MRlM2NF9MQVJHRUZJTEUgKi8KLSMgICAgaWZkZWYgVk1TCi0jICAgICAgaW5jbHVkZSA8dW5peGlvLmg+ICAgICAgIC8qIGZvciBvZmZfdCAqLwotIyAgICBlbmRpZgotIyAgICBpZm5kZWYgel9vZmZfdAotIyAgICAgIGRlZmluZSB6X29mZl90IG9mZl90Ci0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmIC8qIDAgKi8KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfTEZTNjRfTEFSR0VGSUxFKSAmJiBfTEZTNjRfTEFSR0VGSUxFLTAKLSMgIGRlZmluZSBaX0xGUzY0Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoX0xBUkdFRklMRTY0X1NPVVJDRSkgJiYgZGVmaW5lZChaX0xGUzY0KQotIyAgZGVmaW5lIFpfTEFSR0U2NAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9GSUxFX09GRlNFVF9CSVRTKSAmJiBfRklMRV9PRkZTRVRfQklUUy0wID09IDY0ICYmIGRlZmluZWQoWl9MRlM2NCkKLSMgIGRlZmluZSBaX1dBTlQ2NAotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChTRUVLX1NFVCkgJiYgIWRlZmluZWQoWl9TT0xPKQotIyAgZGVmaW5lIFNFRUtfU0VUICAgICAgICAwICAgICAgIC8qIFNlZWsgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4gICovCi0jICBkZWZpbmUgU0VFS19DVVIgICAgICAgIDEgICAgICAgLyogU2VlayBmcm9tIGN1cnJlbnQgcG9zaXRpb24uICAqLwotIyAgZGVmaW5lIFNFRUtfRU5EICAgICAgICAyICAgICAgIC8qIFNldCBmaWxlIHBvaW50ZXIgdG8gRU9GIHBsdXMgIm9mZnNldCIgKi8KLSNlbmRpZgotCi0jaWZuZGVmIHpfb2ZmX3QKLSMgIGRlZmluZSB6X29mZl90IGxvbmcKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoX1dJTjMyKSAmJiBkZWZpbmVkKFpfTEFSR0U2NCkKLSMgIGRlZmluZSB6X29mZjY0X3Qgb2ZmNjRfdAotI2Vsc2UKLSMgIGlmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoWl9TT0xPKQotIyAgICBkZWZpbmUgel9vZmY2NF90IF9faW50NjQKLSMgIGVsc2UKLSMgICAgZGVmaW5lIHpfb2ZmNjRfdCB6X29mZl90Ci0jICBlbmRpZgotI2VuZGlmCi0KLS8qIE1WUyBsaW5rZXIgZG9lcyBub3Qgc3VwcG9ydCBleHRlcm5hbCBuYW1lcyBsYXJnZXIgdGhhbiA4IGJ5dGVzICovCi0jaWYgZGVmaW5lZChfX01WU19fKQotICAjcHJhZ21hIG1hcChkZWZsYXRlSW5pdF8sIkRFSU4iKQotICAjcHJhZ21hIG1hcChkZWZsYXRlSW5pdDJfLCJERUlOMiIpCi0gICNwcmFnbWEgbWFwKGRlZmxhdGVFbmQsIkRFRU5EIikKLSAgI3ByYWdtYSBtYXAoZGVmbGF0ZUJvdW5kLCJERUJORCIpCi0gICNwcmFnbWEgbWFwKGluZmxhdGVJbml0XywiSU5JTiIpCi0gICNwcmFnbWEgbWFwKGluZmxhdGVJbml0Ml8sIklOSU4yIikKLSAgI3ByYWdtYSBtYXAoaW5mbGF0ZUVuZCwiSU5FTkQiKQotICAjcHJhZ21hIG1hcChpbmZsYXRlU3luYywiSU5TWSIpCi0gICNwcmFnbWEgbWFwKGluZmxhdGVTZXREaWN0aW9uYXJ5LCJJTlNFREkiKQotICAjcHJhZ21hIG1hcChjb21wcmVzc0JvdW5kLCJDTUJORCIpCi0gICNwcmFnbWEgbWFwKGluZmxhdGVfdGFibGUsIklOVEFCTCIpCi0gICNwcmFnbWEgbWFwKGluZmxhdGVfZmFzdCwiSU5GQSIpCi0gICNwcmFnbWEgbWFwKGluZmxhdGVfY29weXJpZ2h0LCJJTkNPUFkiKQotI2VuZGlmCi0KLSNlbmRpZiAvKiBaQ09ORl9IICovCmRpZmYgLS1naXQgYS9jb3JlL2luY2x1ZGUvdGhpcmRwYXJ0aWVzL3psaWIvemxpYi5oIGIvY29yZS9pbmNsdWRlL3RoaXJkcGFydGllcy96bGliL3psaWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI3MjFjZi4uMDAwMDAwMAotLS0gYS9jb3JlL2luY2x1ZGUvdGhpcmRwYXJ0aWVzL3psaWIvemxpYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgzMyArMCwwIEBACi0vKiB6bGliLmggLS0gaW50ZXJmYWNlIG9mIHRoZSAnemxpYicgZ2VuZXJhbCBwdXJwb3NlIGNvbXByZXNzaW9uIGxpYnJhcnkKLSAgdmVyc2lvbiAxLjIuOCwgQXByaWwgMjh0aCwgMjAxMwotCi0gIENvcHlyaWdodCAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKLQotICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgSmVhbi1sb3VwIEdhaWxseSAgICAgICAgTWFyayBBZGxlcgotICBqbG91cEBnemlwLm9yZyAgICAgICAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1Ci0KLQotICBUaGUgZGF0YSBmb3JtYXQgdXNlZCBieSB0aGUgemxpYiBsaWJyYXJ5IGlzIGRlc2NyaWJlZCBieSBSRkNzIChSZXF1ZXN0IGZvcgotICBDb21tZW50cykgMTk1MCB0byAxOTUyIGluIHRoZSBmaWxlcyBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMxOTUwCi0gICh6bGliIGZvcm1hdCksIHJmYzE5NTEgKGRlZmxhdGUgZm9ybWF0KSBhbmQgcmZjMTk1MiAoZ3ppcCBmb3JtYXQpLgotKi8KLQotI2lmbmRlZiBaTElCX0gKLSNkZWZpbmUgWkxJQl9ICi0KLSNkZWZpbmUgZGVmbGF0ZV9jb3B5cmlnaHQgRlBERkFQSV9kZWZsYXRlX2NvcHlyaWdodAotI2RlZmluZSBhZGxlcjMyIEZQREZBUElfYWRsZXIzMgotI2RlZmluZSBjb21wcmVzczIgRlBERkFQSV9jb21wcmVzczIKLSNkZWZpbmUgY29tcHJlc3MgRlBERkFQSV9jb21wcmVzcwotI2RlZmluZSBjb21wcmVzc0JvdW5kIEZQREZBUElfY29tcHJlc3NCb3VuZAotI2RlZmluZSBnZXRfY3JjX3RhYmxlIEZQREZBUElfZ2V0X2NyY190YWJsZQotI2RlZmluZSBjcmMzMiBGUERGQVBJX2NyYzMyCi0jZGVmaW5lIGRlZmxhdGVJbml0XyBGUERGQVBJX2RlZmxhdGVJbml0XwotI2RlZmluZSBkZWZsYXRlSW5pdDJfIEZQREZBUElfZGVmbGF0ZUluaXQyXwotI2RlZmluZSBkZWZsYXRlU2V0RGljdGlvbmFyeSBGUERGQVBJX2RlZmxhdGVTZXREaWN0aW9uYXJ5Ci0jZGVmaW5lIGRlZmxhdGVSZXNldCBGUERGQVBJX2RlZmxhdGVSZXNldAotI2RlZmluZSBkZWZsYXRlUGVuZGluZyBGUERGQVBJX2RlZmxhdGVQZW5kaW5nCi0jZGVmaW5lIGRlZmxhdGVQcmltZSBGUERGQVBJX2RlZmxhdGVQcmltZQotI2RlZmluZSBkZWZsYXRlUGFyYW1zIEZQREZBUElfZGVmbGF0ZVBhcmFtcwotI2RlZmluZSBkZWZsYXRlQm91bmQgRlBERkFQSV9kZWZsYXRlQm91bmQKLSNkZWZpbmUgZGVmbGF0ZVNldEhlYWRlciBGUERGQVBJX2RlZmxhdGVTZXRIZWFkZXIKLSNkZWZpbmUgZGVmbGF0ZVR1bmUgRlBERkFQSV9kZWZsYXRlVHVuZQotI2RlZmluZSBkZWZsYXRlIEZQREZBUElfZGVmbGF0ZQotI2RlZmluZSBkZWZsYXRlRW5kIEZQREZBUElfZGVmbGF0ZUVuZAotI2RlZmluZSBkZWZsYXRlQ29weSBGUERGQVBJX2RlZmxhdGVDb3B5Ci0jZGVmaW5lIGluZmxhdGVCYWNrSW5pdF8gRlBERkFQSV9pbmZsYXRlQmFja0luaXRfCi0jZGVmaW5lIGluZmxhdGVCYWNrIEZQREZBUElfaW5mbGF0ZUJhY2sKLSNkZWZpbmUgaW5mbGF0ZUJhY2tFbmQgRlBERkFQSV9pbmZsYXRlQmFja0VuZAotI2RlZmluZSBpbmZsYXRlUmVzZXQgRlBERkFQSV9pbmZsYXRlUmVzZXQKLSNkZWZpbmUgaW5mbGF0ZUluaXQyXyBGUERGQVBJX2luZmxhdGVJbml0Ml8KLSNkZWZpbmUgaW5mbGF0ZUluaXRfIEZQREZBUElfaW5mbGF0ZUluaXRfCi0jZGVmaW5lIGluZmxhdGUgRlBERkFQSV9pbmZsYXRlCi0jZGVmaW5lIGluZmxhdGVFbmQgRlBERkFQSV9pbmZsYXRlRW5kCi0jZGVmaW5lIGluZmxhdGVTZXREaWN0aW9uYXJ5IEZQREZBUElfaW5mbGF0ZVNldERpY3Rpb25hcnkKLSNkZWZpbmUgaW5mbGF0ZVN5bmMgRlBERkFQSV9pbmZsYXRlU3luYwotI2RlZmluZSBpbmZsYXRlU3luY1BvaW50IEZQREZBUElfaW5mbGF0ZVN5bmNQb2ludAotI2RlZmluZSBpbmZsYXRlQ29weSBGUERGQVBJX2luZmxhdGVDb3B5Ci0jZGVmaW5lIHVuY29tcHJlc3MgRlBERkFQSV91bmNvbXByZXNzCi0jZGVmaW5lIHpsaWJWZXJzaW9uIEZQREZBUElfemxpYlZlcnNpb24KLSNkZWZpbmUgemxpYkNvbXBpbGVGbGFncyBGUERGQVBJX3psaWJDb21waWxlRmxhZ3MKLSNkZWZpbmUgekVycm9yIEZQREZBUElfekVycm9yCi0jZGVmaW5lIHpfZXJybXNnIEZQREZBUElfel9lcnJtc2cKLSNkZWZpbmUgemNmcmVlIEZQREZBUElfemNmcmVlCi0jZGVmaW5lIHpjYWxsb2MgRlBERkFQSV96Y2FsbG9jCi0jZGVmaW5lIGluZmxhdGVfZmFzdCBGUERGQVBJX2luZmxhdGVfZmFzdAotI2RlZmluZSBpbmZsYXRlX3RhYmxlIEZQREZBUElfaW5mbGF0ZV90YWJsZQotI2RlZmluZSBpbmZsYXRlX2NvcHlyaWdodCBGUERGQVBJX2luZmxhdGVfY29weXJpZ2h0Ci0jZGVmaW5lIF9sZW5ndGhfY29kZSBGUERGQVBJX2xlbmd0aF9jb2RlCi0jZGVmaW5lIF90cl9mbHVzaF9ibG9jayBGUERGQVBJX3RyX2ZsdXNoX2Jsb2NrCi0jZGVmaW5lIF9kaXN0X2NvZGUgRlBERkFQSV9kaXN0X2NvZGUKLSNkZWZpbmUgX3RyX3N0b3JlZF9ibG9jayBGUERGQVBJX3RyX3N0b3JlZF9ibG9jawotI2RlZmluZSBfdHJfaW5pdCBGUERGQVBJX3RyX2luaXQKLSNkZWZpbmUgX3RyX2FsaWduIEZQREZBUElfdHJfYWxpZ24KLSNkZWZpbmUgX3RyX3RhbGx5IEZQREZBUElfdHJfdGFsbHkKLSNkZWZpbmUgX3RyX2ZsdXNoX2JpdHMgRlBERkFQSV90cl9mbHVzaF9iaXRzCi0jZGVmaW5lIGFkbGVyMzJfY29tYmluZSBGUERGQVBJX2FkbGVyMzJfY29tYmluZQotI2RlZmluZSBpbmZsYXRlUHJpbWUgRlBERkFQSV9pbmZsYXRlUHJpbWUKLSNkZWZpbmUgaW5mbGF0ZUdldERpY3Rpb25hcnkgRlBERkFQSV9pbmZsYXRlR2V0RGljdGlvbmFyeQotI2RlZmluZSBpbmZsYXRlR2V0SGVhZGVyIEZQREZBUElfaW5mbGF0ZUdldEhlYWRlcgotI2RlZmluZSBjcmMzMl9jb21iaW5lIEZQREZBUElfY3JjMzJfY29tYmluZQotI2RlZmluZSBpbmZsYXRlUmVzZXQyIEZQREZBUElfaW5mbGF0ZVJlc2V0MgotI2RlZmluZSBpbmZsYXRlVW5kZXJtaW5lIEZQREZBUElfaW5mbGF0ZVVuZGVybWluZQotI2RlZmluZSBpbmZsYXRlTWFyayBGUERGQVBJX2luZmxhdGVNYXJrCi0jZGVmaW5lIGFkbGVyMzJfY29tYmluZTY0IEZQREZBUElfYWRsZXIzMl9jb21iaW5lNjQKLSNkZWZpbmUgaW5mbGF0ZVJlc2V0S2VlcCBGUERGQVBJX2luZmxhdGVSZXNldEtlZXAKLSNkZWZpbmUgZGVmbGF0ZVJlc2V0S2VlcCBGUERGQVBJX2RlZmxhdGVSZXNldEtlZXAKLQotI2luY2x1ZGUgInpjb25mLmgiCi0KLS8qIFN1bmxpYW5nLkxpdSAyMDEwMDkwOCBzeW5jIHRoZSBjb25maWcgdG8gdGhlIG9sZCByZXZpc2lvbi4gTk9fR1pJUCAqLwotI2RlZmluZSBOT19HWklQCQkvKiBYWVEgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jZGVmaW5lIFpMSUJfVkVSU0lPTiAiMS4yLjgiCi0jZGVmaW5lIFpMSUJfVkVSTlVNIDB4MTI4MAotI2RlZmluZSBaTElCX1ZFUl9NQUpPUiAxCi0jZGVmaW5lIFpMSUJfVkVSX01JTk9SIDIKLSNkZWZpbmUgWkxJQl9WRVJfUkVWSVNJT04gOAotI2RlZmluZSBaTElCX1ZFUl9TVUJSRVZJU0lPTiAwCi0KLS8qCi0gICAgVGhlICd6bGliJyBjb21wcmVzc2lvbiBsaWJyYXJ5IHByb3ZpZGVzIGluLW1lbW9yeSBjb21wcmVzc2lvbiBhbmQKLSAgZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMsIGluY2x1ZGluZyBpbnRlZ3JpdHkgY2hlY2tzIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YS4KLSAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHN1cHBvcnRzIG9ubHkgb25lIGNvbXByZXNzaW9uIG1ldGhvZCAoZGVmbGF0aW9uKQotICBidXQgb3RoZXIgYWxnb3JpdGhtcyB3aWxsIGJlIGFkZGVkIGxhdGVyIGFuZCB3aWxsIGhhdmUgdGhlIHNhbWUgc3RyZWFtCi0gIGludGVyZmFjZS4KLQotICAgIENvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAgaWYgdGhlIGJ1ZmZlcnMgYXJlIGxhcmdlIGVub3VnaCwKLSAgb3IgY2FuIGJlIGRvbmUgYnkgcmVwZWF0ZWQgY2FsbHMgb2YgdGhlIGNvbXByZXNzaW9uIGZ1bmN0aW9uLiAgSW4gdGhlIGxhdHRlcgotICBjYXNlLCB0aGUgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWUgdGhlIG91dHB1dAotICAocHJvdmlkaW5nIG1vcmUgb3V0cHV0IHNwYWNlKSBiZWZvcmUgZWFjaCBjYWxsLgotCi0gICAgVGhlIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQgdXNlZCBieSBkZWZhdWx0IGJ5IHRoZSBpbi1tZW1vcnkgZnVuY3Rpb25zIGlzCi0gIHRoZSB6bGliIGZvcm1hdCwgd2hpY2ggaXMgYSB6bGliIHdyYXBwZXIgZG9jdW1lbnRlZCBpbiBSRkMgMTk1MCwgd3JhcHBlZAotICBhcm91bmQgYSBkZWZsYXRlIHN0cmVhbSwgd2hpY2ggaXMgaXRzZWxmIGRvY3VtZW50ZWQgaW4gUkZDIDE5NTEuCi0KLSAgICBUaGUgbGlicmFyeSBhbHNvIHN1cHBvcnRzIHJlYWRpbmcgYW5kIHdyaXRpbmcgZmlsZXMgaW4gZ3ppcCAoLmd6KSBmb3JtYXQKLSAgd2l0aCBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aGF0IG9mIHN0ZGlvIHVzaW5nIHRoZSBmdW5jdGlvbnMgdGhhdCBzdGFydAotICB3aXRoICJneiIuICBUaGUgZ3ppcCBmb3JtYXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIHpsaWIgZm9ybWF0LiAgZ3ppcCBpcyBhCi0gIGd6aXAgd3JhcHBlciwgZG9jdW1lbnRlZCBpbiBSRkMgMTk1Miwgd3JhcHBlZCBhcm91bmQgYSBkZWZsYXRlIHN0cmVhbS4KLQotICAgIFRoaXMgbGlicmFyeSBjYW4gb3B0aW9uYWxseSByZWFkIGFuZCB3cml0ZSBnemlwIHN0cmVhbXMgaW4gbWVtb3J5IGFzIHdlbGwuCi0KLSAgICBUaGUgemxpYiBmb3JtYXQgd2FzIGRlc2lnbmVkIHRvIGJlIGNvbXBhY3QgYW5kIGZhc3QgZm9yIHVzZSBpbiBtZW1vcnkKLSAgYW5kIG9uIGNvbW11bmljYXRpb25zIGNoYW5uZWxzLiAgVGhlIGd6aXAgZm9ybWF0IHdhcyBkZXNpZ25lZCBmb3Igc2luZ2xlLQotICBmaWxlIGNvbXByZXNzaW9uIG9uIGZpbGUgc3lzdGVtcywgaGFzIGEgbGFyZ2VyIGhlYWRlciB0aGFuIHpsaWIgdG8gbWFpbnRhaW4KLSAgZGlyZWN0b3J5IGluZm9ybWF0aW9uLCBhbmQgdXNlcyBhIGRpZmZlcmVudCwgc2xvd2VyIGNoZWNrIG1ldGhvZCB0aGFuIHpsaWIuCi0KLSAgICBUaGUgbGlicmFyeSBkb2VzIG5vdCBpbnN0YWxsIGFueSBzaWduYWwgaGFuZGxlci4gIFRoZSBkZWNvZGVyIGNoZWNrcwotICB0aGUgY29uc2lzdGVuY3kgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSwgc28gdGhlIGxpYnJhcnkgc2hvdWxkIG5ldmVyIGNyYXNoCi0gIGV2ZW4gaW4gY2FzZSBvZiBjb3JydXB0ZWQgaW5wdXQuCi0qLwotCi10eXBlZGVmIHZvaWRwZiAoKmFsbG9jX2Z1bmMpIE9GKCh2b2lkcGYgb3BhcXVlLCB1SW50IGl0ZW1zLCB1SW50IHNpemUpKTsKLXR5cGVkZWYgdm9pZCAgICgqZnJlZV9mdW5jKSAgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBhZGRyZXNzKSk7Ci0KLXN0cnVjdCBpbnRlcm5hbF9zdGF0ZTsKLQotdHlwZWRlZiBzdHJ1Y3Qgel9zdHJlYW1fcyB7Ci0gICAgel9jb25zdCBCeXRlZiAqbmV4dF9pbjsgICAgIC8qIG5leHQgaW5wdXQgYnl0ZSAqLwotICAgIHVJbnQgICAgIGF2YWlsX2luOyAgLyogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBhdCBuZXh0X2luICovCi0gICAgdUxvbmcgICAgdG90YWxfaW47ICAvKiB0b3RhbCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIgKi8KLQotICAgIEJ5dGVmICAgICpuZXh0X291dDsgLyogbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlICovCi0gICAgdUludCAgICAgYXZhaWxfb3V0OyAvKiByZW1haW5pbmcgZnJlZSBzcGFjZSBhdCBuZXh0X291dCAqLwotICAgIHVMb25nICAgIHRvdGFsX291dDsgLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIgKi8KLQotICAgIHpfY29uc3QgY2hhciAqbXNnOyAgLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovCi0gICAgc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqc3RhdGU7IC8qIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucyAqLwotCi0gICAgYWxsb2NfZnVuYyB6YWxsb2M7ICAvKiB1c2VkIHRvIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLwotICAgIGZyZWVfZnVuYyAgemZyZWU7ICAgLyogdXNlZCB0byBmcmVlIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLwotICAgIHZvaWRwZiAgICAgb3BhcXVlOyAgLyogcHJpdmF0ZSBkYXRhIG9iamVjdCBwYXNzZWQgdG8gemFsbG9jIGFuZCB6ZnJlZSAqLwotCi0gICAgaW50ICAgICBkYXRhX3R5cGU7ICAvKiBiZXN0IGd1ZXNzIGFib3V0IHRoZSBkYXRhIHR5cGU6IGJpbmFyeSBvciB0ZXh0ICovCi0gICAgdUxvbmcgICBhZGxlcjsgICAgICAvKiBhZGxlcjMyIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAqLwotICAgIHVMb25nICAgcmVzZXJ2ZWQ7ICAgLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KLX0gel9zdHJlYW07Ci0KLXR5cGVkZWYgel9zdHJlYW0gRkFSICp6X3N0cmVhbXA7Ci0KLS8qCi0gICAgIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIHBhc3NlZCB0byBhbmQgZnJvbSB6bGliIHJvdXRpbmVzLiAgU2VlIFJGQyAxOTUyCi0gIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIG1lYW5pbmdzIG9mIHRoZXNlIGZpZWxkcy4KLSovCi10eXBlZGVmIHN0cnVjdCBnel9oZWFkZXJfcyB7Ci0gICAgaW50ICAgICB0ZXh0OyAgICAgICAvKiB0cnVlIGlmIGNvbXByZXNzZWQgZGF0YSBiZWxpZXZlZCB0byBiZSB0ZXh0ICovCi0gICAgdUxvbmcgICB0aW1lOyAgICAgICAvKiBtb2RpZmljYXRpb24gdGltZSAqLwotICAgIGludCAgICAgeGZsYWdzOyAgICAgLyogZXh0cmEgZmxhZ3MgKG5vdCB1c2VkIHdoZW4gd3JpdGluZyBhIGd6aXAgZmlsZSkgKi8KLSAgICBpbnQgICAgIG9zOyAgICAgICAgIC8qIG9wZXJhdGluZyBzeXN0ZW0gKi8KLSAgICBCeXRlZiAgICpleHRyYTsgICAgIC8qIHBvaW50ZXIgdG8gZXh0cmEgZmllbGQgb3IgWl9OVUxMIGlmIG5vbmUgKi8KLSAgICB1SW50ICAgIGV4dHJhX2xlbjsgIC8qIGV4dHJhIGZpZWxkIGxlbmd0aCAodmFsaWQgaWYgZXh0cmEgIT0gWl9OVUxMKSAqLwotICAgIHVJbnQgICAgZXh0cmFfbWF4OyAgLyogc3BhY2UgYXQgZXh0cmEgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi8KLSAgICBCeXRlZiAgICpuYW1lOyAgICAgIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGZpbGUgbmFtZSBvciBaX05VTEwgKi8KLSAgICB1SW50ICAgIG5hbWVfbWF4OyAgIC8qIHNwYWNlIGF0IG5hbWUgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi8KLSAgICBCeXRlZiAgICpjb21tZW50OyAgIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGNvbW1lbnQgb3IgWl9OVUxMICovCi0gICAgdUludCAgICBjb21tX21heDsgICAvKiBzcGFjZSBhdCBjb21tZW50IChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovCi0gICAgaW50ICAgICBoY3JjOyAgICAgICAvKiB0cnVlIGlmIHRoZXJlIHdhcyBvciB3aWxsIGJlIGEgaGVhZGVyIGNyYyAqLwotICAgIGludCAgICAgZG9uZTsgICAgICAgLyogdHJ1ZSB3aGVuIGRvbmUgcmVhZGluZyBnemlwIGhlYWRlciAobm90IHVzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gd3JpdGluZyBhIGd6aXAgZmlsZSkgKi8KLX0gZ3pfaGVhZGVyOwotCi10eXBlZGVmIGd6X2hlYWRlciBGQVIgKmd6X2hlYWRlcnA7Ci0KLS8qCi0gICAgIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbiB3aGVuIGF2YWlsX2luIGhhcyBkcm9wcGVkCi0gICB0byB6ZXJvLiAgSXQgbXVzdCB1cGRhdGUgbmV4dF9vdXQgYW5kIGF2YWlsX291dCB3aGVuIGF2YWlsX291dCBoYXMgZHJvcHBlZAotICAgdG8gemVyby4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGluaXRpYWxpemUgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIGJlZm9yZQotICAgY2FsbGluZyB0aGUgaW5pdCBmdW5jdGlvbi4gIEFsbCBvdGhlciBmaWVsZHMgYXJlIHNldCBieSB0aGUgY29tcHJlc3Npb24KLSAgIGxpYnJhcnkgYW5kIG11c3Qgbm90IGJlIHVwZGF0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgotCi0gICAgIFRoZSBvcGFxdWUgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHdpbGwgYmUgcGFzc2VkIGFzIHRoZSBmaXJzdAotICAgcGFyYW1ldGVyIGZvciBjYWxscyBvZiB6YWxsb2MgYW5kIHpmcmVlLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBjdXN0b20KLSAgIG1lbW9yeSBtYW5hZ2VtZW50LiAgVGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYXR0YWNoZXMgbm8gbWVhbmluZyB0byB0aGUKLSAgIG9wYXF1ZSB2YWx1ZS4KLQotICAgICB6YWxsb2MgbXVzdCByZXR1cm4gWl9OVUxMIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggbWVtb3J5IGZvciB0aGUgb2JqZWN0LgotICAgSWYgemxpYiBpcyB1c2VkIGluIGEgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb24sIHphbGxvYyBhbmQgemZyZWUgbXVzdCBiZQotICAgdGhyZWFkIHNhZmUuCi0KLSAgICAgT24gMTYtYml0IHN5c3RlbXMsIHRoZSBmdW5jdGlvbnMgemFsbG9jIGFuZCB6ZnJlZSBtdXN0IGJlIGFibGUgdG8gYWxsb2NhdGUKLSAgIGV4YWN0bHkgNjU1MzYgYnl0ZXMsIGJ1dCB3aWxsIG5vdCBiZSByZXF1aXJlZCB0byBhbGxvY2F0ZSBtb3JlIHRoYW4gdGhpcyBpZgotICAgdGhlIHN5bWJvbCBNQVhTRUdfNjRLIGlzIGRlZmluZWQgKHNlZSB6Y29uZi5oKS4gIFdBUk5JTkc6IE9uIE1TRE9TLCBwb2ludGVycwotICAgcmV0dXJuZWQgYnkgemFsbG9jIGZvciBvYmplY3RzIG9mIGV4YWN0bHkgNjU1MzYgYnl0ZXMgKm11c3QqIGhhdmUgdGhlaXIKLSAgIG9mZnNldCBub3JtYWxpemVkIHRvIHplcm8uICBUaGUgZGVmYXVsdCBhbGxvY2F0aW9uIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IHRoaXMKLSAgIGxpYnJhcnkgZW5zdXJlcyB0aGlzIChzZWUgenV0aWwuYykuICBUbyByZWR1Y2UgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgYXZvaWQKLSAgIGFueSBhbGxvY2F0aW9uIG9mIDY0SyBvYmplY3RzLCBhdCB0aGUgZXhwZW5zZSBvZiBjb21wcmVzc2lvbiByYXRpbywgY29tcGlsZQotICAgdGhlIGxpYnJhcnkgd2l0aCAtRE1BWF9XQklUUz0xNCAoc2VlIHpjb25mLmgpLgotCi0gICAgIFRoZSBmaWVsZHMgdG90YWxfaW4gYW5kIHRvdGFsX291dCBjYW4gYmUgdXNlZCBmb3Igc3RhdGlzdGljcyBvciBwcm9ncmVzcwotICAgcmVwb3J0cy4gIEFmdGVyIGNvbXByZXNzaW9uLCB0b3RhbF9pbiBob2xkcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUKLSAgIHVuY29tcHJlc3NlZCBkYXRhIGFuZCBtYXkgYmUgc2F2ZWQgZm9yIHVzZSBpbiB0aGUgZGVjb21wcmVzc29yIChwYXJ0aWN1bGFybHkKLSAgIGlmIHRoZSBkZWNvbXByZXNzb3Igd2FudHMgdG8gZGVjb21wcmVzcyBldmVyeXRoaW5nIGluIGEgc2luZ2xlIHN0ZXApLgotKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogY29uc3RhbnRzICovCi0KLSNkZWZpbmUgWl9OT19GTFVTSCAgICAgIDAKLSNkZWZpbmUgWl9QQVJUSUFMX0ZMVVNIIDEKLSNkZWZpbmUgWl9TWU5DX0ZMVVNIICAgIDIKLSNkZWZpbmUgWl9GVUxMX0ZMVVNIICAgIDMKLSNkZWZpbmUgWl9GSU5JU0ggICAgICAgIDQKLSNkZWZpbmUgWl9CTE9DSyAgICAgICAgIDUKLSNkZWZpbmUgWl9UUkVFUyAgICAgICAgIDYKLS8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KLQotI2RlZmluZSBaX09LICAgICAgICAgICAgMAotI2RlZmluZSBaX1NUUkVBTV9FTkQgICAgMQotI2RlZmluZSBaX05FRURfRElDVCAgICAgMgotI2RlZmluZSBaX0VSUk5PICAgICAgICAoLTEpCi0jZGVmaW5lIFpfU1RSRUFNX0VSUk9SICgtMikKLSNkZWZpbmUgWl9EQVRBX0VSUk9SICAgKC0zKQotI2RlZmluZSBaX01FTV9FUlJPUiAgICAoLTQpCi0jZGVmaW5lIFpfQlVGX0VSUk9SICAgICgtNSkKLSNkZWZpbmUgWl9WRVJTSU9OX0VSUk9SICgtNikKLS8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXMKLSAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy4KLSAqLwotCi0jZGVmaW5lIFpfTk9fQ09NUFJFU1NJT04gICAgICAgICAwCi0jZGVmaW5lIFpfQkVTVF9TUEVFRCAgICAgICAgICAgICAxCi0jZGVmaW5lIFpfQkVTVF9DT01QUkVTU0lPTiAgICAgICA5Ci0jZGVmaW5lIFpfREVGQVVMVF9DT01QUkVTU0lPTiAgKC0xKQotLyogY29tcHJlc3Npb24gbGV2ZWxzICovCi0KLSNkZWZpbmUgWl9GSUxURVJFRCAgICAgICAgICAgIDEKLSNkZWZpbmUgWl9IVUZGTUFOX09OTFkgICAgICAgIDIKLSNkZWZpbmUgWl9STEUgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgWl9GSVhFRCAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgWl9ERUZBVUxUX1NUUkFURUdZICAgIDAKLS8qIGNvbXByZXNzaW9uIHN0cmF0ZWd5OyBzZWUgZGVmbGF0ZUluaXQyKCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KLQotI2RlZmluZSBaX0JJTkFSWSAgIDAKLSNkZWZpbmUgWl9URVhUICAgICAxCi0jZGVmaW5lIFpfQVNDSUkgICAgWl9URVhUICAgLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCAxLjIuMiBhbmQgZWFybGllciAqLwotI2RlZmluZSBaX1VOS05PV04gIDIKLS8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi8KLQotI2RlZmluZSBaX0RFRkxBVEVEICAgOAotLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICh0aGUgb25seSBvbmUgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbikgKi8KLQotI2RlZmluZSBaX05VTEwgIDAgIC8qIGZvciBpbml0aWFsaXppbmcgemFsbG9jLCB6ZnJlZSwgb3BhcXVlICovCi0KLSNkZWZpbmUgemxpYl92ZXJzaW9uIHpsaWJWZXJzaW9uKCkKLS8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdmVyc2lvbnMgPCAxLjAuMiAqLwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2ljIGZ1bmN0aW9ucyAqLwotCi1aRVhURVJOIGNvbnN0IGNoYXIgKiBaRVhQT1JUIHpsaWJWZXJzaW9uIE9GKCh2b2lkKSk7Ci0vKiBUaGUgYXBwbGljYXRpb24gY2FuIGNvbXBhcmUgemxpYlZlcnNpb24gYW5kIFpMSUJfVkVSU0lPTiBmb3IgY29uc2lzdGVuY3kuCi0gICBJZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGRpZmZlcnMsIHRoZSBsaWJyYXJ5IGNvZGUgYWN0dWFsbHkgdXNlZCBpcyBub3QKLSAgIGNvbXBhdGlibGUgd2l0aCB0aGUgemxpYi5oIGhlYWRlciBmaWxlIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiAgVGhpcyBjaGVjawotICAgaXMgYXV0b21hdGljYWxseSBtYWRlIGJ5IGRlZmxhdGVJbml0IGFuZCBpbmZsYXRlSW5pdC4KLSAqLwotCi0vKgotWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdCBPRigoel9zdHJlYW1wIHN0cm0sIGludCBsZXZlbCkpOwotCi0gICAgIEluaXRpYWxpemVzIHRoZSBpbnRlcm5hbCBzdHJlYW0gc3RhdGUgZm9yIGNvbXByZXNzaW9uLiAgVGhlIGZpZWxkcwotICAgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5IHRoZSBjYWxsZXIuICBJZgotICAgemFsbG9jIGFuZCB6ZnJlZSBhcmUgc2V0IHRvIFpfTlVMTCwgZGVmbGF0ZUluaXQgdXBkYXRlcyB0aGVtIHRvIHVzZSBkZWZhdWx0Ci0gICBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KLQotICAgICBUaGUgY29tcHJlc3Npb24gbGV2ZWwgbXVzdCBiZSBaX0RFRkFVTFRfQ09NUFJFU1NJT04sIG9yIGJldHdlZW4gMCBhbmQgOToKLSAgIDEgZ2l2ZXMgYmVzdCBzcGVlZCwgOSBnaXZlcyBiZXN0IGNvbXByZXNzaW9uLCAwIGdpdmVzIG5vIGNvbXByZXNzaW9uIGF0IGFsbAotICAgKHRoZSBpbnB1dCBkYXRhIGlzIHNpbXBseSBjb3BpZWQgYSBibG9jayBhdCBhIHRpbWUpLiAgWl9ERUZBVUxUX0NPTVBSRVNTSU9OCi0gICByZXF1ZXN0cyBhIGRlZmF1bHQgY29tcHJvbWlzZSBiZXR3ZWVuIHNwZWVkIGFuZCBjb21wcmVzc2lvbiAoY3VycmVudGx5Ci0gICBlcXVpdmFsZW50IHRvIGxldmVsIDYpLgotCi0gICAgIGRlZmxhdGVJbml0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAotICAgbWVtb3J5LCBaX1NUUkVBTV9FUlJPUiBpZiBsZXZlbCBpcyBub3QgYSB2YWxpZCBjb21wcmVzc2lvbiBsZXZlbCwgb3IKLSAgIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgemxpYiBsaWJyYXJ5IHZlcnNpb24gKHpsaWJfdmVyc2lvbikgaXMgaW5jb21wYXRpYmxlCi0gICB3aXRoIHRoZSB2ZXJzaW9uIGFzc3VtZWQgYnkgdGhlIGNhbGxlciAoWkxJQl9WRVJTSU9OKS4gIG1zZyBpcyBzZXQgdG8gbnVsbAotICAgaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIGRlZmxhdGVJbml0IGRvZXMgbm90IHBlcmZvcm0gYW55IGNvbXByZXNzaW9uOgotICAgdGhpcyB3aWxsIGJlIGRvbmUgYnkgZGVmbGF0ZSgpLgotKi8KLQotCi1aRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGUgT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgZmx1c2gpKTsKLS8qCi0gICAgZGVmbGF0ZSBjb21wcmVzc2VzIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSwgYW5kIHN0b3BzIHdoZW4gdGhlIGlucHV0Ci0gIGJ1ZmZlciBiZWNvbWVzIGVtcHR5IG9yIHRoZSBvdXRwdXQgYnVmZmVyIGJlY29tZXMgZnVsbC4gIEl0IG1heSBpbnRyb2R1Y2UKLSAgc29tZSBvdXRwdXQgbGF0ZW5jeSAocmVhZGluZyBpbnB1dCB3aXRob3V0IHByb2R1Y2luZyBhbnkgb3V0cHV0KSBleGNlcHQgd2hlbgotICBmb3JjZWQgdG8gZmx1c2guCi0KLSAgICBUaGUgZGV0YWlsZWQgc2VtYW50aWNzIGFyZSBhcyBmb2xsb3dzLiAgZGVmbGF0ZSBwZXJmb3JtcyBvbmUgb3IgYm90aCBvZiB0aGUKLSAgZm9sbG93aW5nIGFjdGlvbnM6Ci0KLSAgLSBDb21wcmVzcyBtb3JlIGlucHV0IHN0YXJ0aW5nIGF0IG5leHRfaW4gYW5kIHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbgotICAgIGFjY29yZGluZ2x5LiAgSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdAotICAgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyKSwgbmV4dF9pbiBhbmQgYXZhaWxfaW4gYXJlIHVwZGF0ZWQgYW5kCi0gICAgcHJvY2Vzc2luZyB3aWxsIHJlc3VtZSBhdCB0aGlzIHBvaW50IGZvciB0aGUgbmV4dCBjYWxsIG9mIGRlZmxhdGUoKS4KLQotICAtIFByb3ZpZGUgbW9yZSBvdXRwdXQgc3RhcnRpbmcgYXQgbmV4dF9vdXQgYW5kIHVwZGF0ZSBuZXh0X291dCBhbmQgYXZhaWxfb3V0Ci0gICAgYWNjb3JkaW5nbHkuICBUaGlzIGFjdGlvbiBpcyBmb3JjZWQgaWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBub24gemVyby4KLSAgICBGb3JjaW5nIGZsdXNoIGZyZXF1ZW50bHkgZGVncmFkZXMgdGhlIGNvbXByZXNzaW9uIHJhdGlvLCBzbyB0aGlzIHBhcmFtZXRlcgotICAgIHNob3VsZCBiZSBzZXQgb25seSB3aGVuIG5lY2Vzc2FyeSAoaW4gaW50ZXJhY3RpdmUgYXBwbGljYXRpb25zKS4gIFNvbWUKLSAgICBvdXRwdXQgbWF5IGJlIHByb3ZpZGVkIGV2ZW4gaWYgZmx1c2ggaXMgbm90IHNldC4KLQotICAgIEJlZm9yZSB0aGUgY2FsbCBvZiBkZWZsYXRlKCksIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgYXQgbGVhc3QKLSAgb25lIG9mIHRoZSBhY3Rpb25zIGlzIHBvc3NpYmxlLCBieSBwcm92aWRpbmcgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtaW5nIG1vcmUKLSAgb3V0cHV0LCBhbmQgdXBkYXRpbmcgYXZhaWxfaW4gb3IgYXZhaWxfb3V0IGFjY29yZGluZ2x5OyBhdmFpbF9vdXQgc2hvdWxkCi0gIG5ldmVyIGJlIHplcm8gYmVmb3JlIHRoZSBjYWxsLiAgVGhlIGFwcGxpY2F0aW9uIGNhbiBjb25zdW1lIHRoZSBjb21wcmVzc2VkCi0gIG91dHB1dCB3aGVuIGl0IHdhbnRzLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwgKGF2YWlsX291dAotICA9PSAwKSwgb3IgYWZ0ZXIgZWFjaCBjYWxsIG9mIGRlZmxhdGUoKS4gIElmIGRlZmxhdGUgcmV0dXJucyBaX09LIGFuZCB3aXRoCi0gIHplcm8gYXZhaWxfb3V0LCBpdCBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhZnRlciBtYWtpbmcgcm9vbSBpbiB0aGUgb3V0cHV0Ci0gIGJ1ZmZlciBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIG1vcmUgb3V0cHV0IHBlbmRpbmcuCi0KLSAgICBOb3JtYWxseSB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byBaX05PX0ZMVVNILCB3aGljaCBhbGxvd3MgZGVmbGF0ZSB0bwotICBkZWNpZGUgaG93IG11Y2ggZGF0YSB0byBhY2N1bXVsYXRlIGJlZm9yZSBwcm9kdWNpbmcgb3V0cHV0LCBpbiBvcmRlciB0bwotICBtYXhpbWl6ZSBjb21wcmVzc2lvbi4KLQotICAgIElmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgc2V0IHRvIFpfU1lOQ19GTFVTSCwgYWxsIHBlbmRpbmcgb3V0cHV0IGlzCi0gIGZsdXNoZWQgdG8gdGhlIG91dHB1dCBidWZmZXIgYW5kIHRoZSBvdXRwdXQgaXMgYWxpZ25lZCBvbiBhIGJ5dGUgYm91bmRhcnksIHNvCi0gIHRoYXQgdGhlIGRlY29tcHJlc3NvciBjYW4gZ2V0IGFsbCBpbnB1dCBkYXRhIGF2YWlsYWJsZSBzbyBmYXIuICAoSW4KLSAgcGFydGljdWxhciBhdmFpbF9pbiBpcyB6ZXJvIGFmdGVyIHRoZSBjYWxsIGlmIGVub3VnaCBvdXRwdXQgc3BhY2UgaGFzIGJlZW4KLSAgcHJvdmlkZWQgYmVmb3JlIHRoZSBjYWxsLikgRmx1c2hpbmcgbWF5IGRlZ3JhZGUgY29tcHJlc3Npb24gZm9yIHNvbWUKLSAgY29tcHJlc3Npb24gYWxnb3JpdGhtcyBhbmQgc28gaXQgc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIG5lY2Vzc2FyeS4gIFRoaXMKLSAgY29tcGxldGVzIHRoZSBjdXJyZW50IGRlZmxhdGUgYmxvY2sgYW5kIGZvbGxvd3MgaXQgd2l0aCBhbiBlbXB0eSBzdG9yZWQgYmxvY2sKLSAgdGhhdCBpcyB0aHJlZSBiaXRzIHBsdXMgZmlsbGVyIGJpdHMgdG8gdGhlIG5leHQgYnl0ZSwgZm9sbG93ZWQgYnkgZm91ciBieXRlcwotICAoMDAgMDAgZmYgZmYpLgotCi0gICAgSWYgZmx1c2ggaXMgc2V0IHRvIFpfUEFSVElBTF9GTFVTSCwgYWxsIHBlbmRpbmcgb3V0cHV0IGlzIGZsdXNoZWQgdG8gdGhlCi0gIG91dHB1dCBidWZmZXIsIGJ1dCB0aGUgb3V0cHV0IGlzIG5vdCBhbGlnbmVkIHRvIGEgYnl0ZSBib3VuZGFyeS4gIEFsbCBvZiB0aGUKLSAgaW5wdXQgZGF0YSBzbyBmYXIgd2lsbCBiZSBhdmFpbGFibGUgdG8gdGhlIGRlY29tcHJlc3NvciwgYXMgZm9yIFpfU1lOQ19GTFVTSC4KLSAgVGhpcyBjb21wbGV0ZXMgdGhlIGN1cnJlbnQgZGVmbGF0ZSBibG9jayBhbmQgZm9sbG93cyBpdCB3aXRoIGFuIGVtcHR5IGZpeGVkCi0gIGNvZGVzIGJsb2NrIHRoYXQgaXMgMTAgYml0cyBsb25nLiAgVGhpcyBhc3N1cmVzIHRoYXQgZW5vdWdoIGJ5dGVzIGFyZSBvdXRwdXQKLSAgaW4gb3JkZXIgZm9yIHRoZSBkZWNvbXByZXNzb3IgdG8gZmluaXNoIHRoZSBibG9jayBiZWZvcmUgdGhlIGVtcHR5IGZpeGVkIGNvZGUKLSAgYmxvY2suCi0KLSAgICBJZiBmbHVzaCBpcyBzZXQgdG8gWl9CTE9DSywgYSBkZWZsYXRlIGJsb2NrIGlzIGNvbXBsZXRlZCBhbmQgZW1pdHRlZCwgYXMKLSAgZm9yIFpfU1lOQ19GTFVTSCwgYnV0IHRoZSBvdXRwdXQgaXMgbm90IGFsaWduZWQgb24gYSBieXRlIGJvdW5kYXJ5LCBhbmQgdXAgdG8KLSAgc2V2ZW4gYml0cyBvZiB0aGUgY3VycmVudCBibG9jayBhcmUgaGVsZCB0byBiZSB3cml0dGVuIGFzIHRoZSBuZXh0IGJ5dGUgYWZ0ZXIKLSAgdGhlIG5leHQgZGVmbGF0ZSBibG9jayBpcyBjb21wbGV0ZWQuICBJbiB0aGlzIGNhc2UsIHRoZSBkZWNvbXByZXNzb3IgbWF5IG5vdAotICBiZSBwcm92aWRlZCBlbm91Z2ggYml0cyBhdCB0aGlzIHBvaW50IGluIG9yZGVyIHRvIGNvbXBsZXRlIGRlY29tcHJlc3Npb24gb2YKLSAgdGhlIGRhdGEgcHJvdmlkZWQgc28gZmFyIHRvIHRoZSBjb21wcmVzc29yLiAgSXQgbWF5IG5lZWQgdG8gd2FpdCBmb3IgdGhlIG5leHQKLSAgYmxvY2sgdG8gYmUgZW1pdHRlZC4gIFRoaXMgaXMgZm9yIGFkdmFuY2VkIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdG8gY29udHJvbAotICB0aGUgZW1pc3Npb24gb2YgZGVmbGF0ZSBibG9ja3MuCi0KLSAgICBJZiBmbHVzaCBpcyBzZXQgdG8gWl9GVUxMX0ZMVVNILCBhbGwgb3V0cHV0IGlzIGZsdXNoZWQgYXMgd2l0aAotICBaX1NZTkNfRkxVU0gsIGFuZCB0aGUgY29tcHJlc3Npb24gc3RhdGUgaXMgcmVzZXQgc28gdGhhdCBkZWNvbXByZXNzaW9uIGNhbgotICByZXN0YXJ0IGZyb20gdGhpcyBwb2ludCBpZiBwcmV2aW91cyBjb21wcmVzc2VkIGRhdGEgaGFzIGJlZW4gZGFtYWdlZCBvciBpZgotICByYW5kb20gYWNjZXNzIGlzIGRlc2lyZWQuICBVc2luZyBaX0ZVTExfRkxVU0ggdG9vIG9mdGVuIGNhbiBzZXJpb3VzbHkgZGVncmFkZQotICBjb21wcmVzc2lvbi4KLQotICAgIElmIGRlZmxhdGUgcmV0dXJucyB3aXRoIGF2YWlsX291dCA9PSAwLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFnYWluCi0gIHdpdGggdGhlIHNhbWUgdmFsdWUgb2YgdGhlIGZsdXNoIHBhcmFtZXRlciBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgKHVwZGF0ZWQKLSAgYXZhaWxfb3V0KSwgdW50aWwgdGhlIGZsdXNoIGlzIGNvbXBsZXRlIChkZWZsYXRlIHJldHVybnMgd2l0aCBub24temVybwotICBhdmFpbF9vdXQpLiAgSW4gdGhlIGNhc2Ugb2YgYSBaX0ZVTExfRkxVU0ggb3IgWl9TWU5DX0ZMVVNILCBtYWtlIHN1cmUgdGhhdAotICBhdmFpbF9vdXQgaXMgZ3JlYXRlciB0aGFuIHNpeCB0byBhdm9pZCByZXBlYXRlZCBmbHVzaCBtYXJrZXJzIGR1ZSB0bwotICBhdmFpbF9vdXQgPT0gMCBvbiByZXR1cm4uCi0KLSAgICBJZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byBaX0ZJTklTSCwgcGVuZGluZyBpbnB1dCBpcyBwcm9jZXNzZWQsCi0gIHBlbmRpbmcgb3V0cHV0IGlzIGZsdXNoZWQgYW5kIGRlZmxhdGUgcmV0dXJucyB3aXRoIFpfU1RSRUFNX0VORCBpZiB0aGVyZSB3YXMKLSAgZW5vdWdoIG91dHB1dCBzcGFjZTsgaWYgZGVmbGF0ZSByZXR1cm5zIHdpdGggWl9PSywgdGhpcyBmdW5jdGlvbiBtdXN0IGJlCi0gIGNhbGxlZCBhZ2FpbiB3aXRoIFpfRklOSVNIIGFuZCBtb3JlIG91dHB1dCBzcGFjZSAodXBkYXRlZCBhdmFpbF9vdXQpIGJ1dCBubwotICBtb3JlIGlucHV0IGRhdGEsIHVudGlsIGl0IHJldHVybnMgd2l0aCBaX1NUUkVBTV9FTkQgb3IgYW4gZXJyb3IuICBBZnRlcgotICBkZWZsYXRlIGhhcyByZXR1cm5lZCBaX1NUUkVBTV9FTkQsIHRoZSBvbmx5IHBvc3NpYmxlIG9wZXJhdGlvbnMgb24gdGhlIHN0cmVhbQotICBhcmUgZGVmbGF0ZVJlc2V0IG9yIGRlZmxhdGVFbmQuCi0KLSAgICBaX0ZJTklTSCBjYW4gYmUgdXNlZCBpbW1lZGlhdGVseSBhZnRlciBkZWZsYXRlSW5pdCBpZiBhbGwgdGhlIGNvbXByZXNzaW9uCi0gIGlzIHRvIGJlIGRvbmUgaW4gYSBzaW5nbGUgc3RlcC4gIEluIHRoaXMgY2FzZSwgYXZhaWxfb3V0IG11c3QgYmUgYXQgbGVhc3QgdGhlCi0gIHZhbHVlIHJldHVybmVkIGJ5IGRlZmxhdGVCb3VuZCAoc2VlIGJlbG93KS4gIFRoZW4gZGVmbGF0ZSBpcyBndWFyYW50ZWVkIHRvCi0gIHJldHVybiBaX1NUUkVBTV9FTkQuICBJZiBub3QgZW5vdWdoIG91dHB1dCBzcGFjZSBpcyBwcm92aWRlZCwgZGVmbGF0ZSB3aWxsCi0gIG5vdCByZXR1cm4gWl9TVFJFQU1fRU5ELCBhbmQgaXQgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYXMgZGVzY3JpYmVkIGFib3ZlLgotCi0gICAgZGVmbGF0ZSgpIHNldHMgc3RybS0+YWRsZXIgdG8gdGhlIGFkbGVyMzIgY2hlY2tzdW0gb2YgYWxsIGlucHV0IHJlYWQKLSAgc28gZmFyICh0aGF0IGlzLCB0b3RhbF9pbiBieXRlcykuCi0KLSAgICBkZWZsYXRlKCkgbWF5IHVwZGF0ZSBzdHJtLT5kYXRhX3R5cGUgaWYgaXQgY2FuIG1ha2UgYSBnb29kIGd1ZXNzIGFib3V0Ci0gIHRoZSBpbnB1dCBkYXRhIHR5cGUgKFpfQklOQVJZIG9yIFpfVEVYVCkuICBJbiBkb3VidCwgdGhlIGRhdGEgaXMgY29uc2lkZXJlZAotICBiaW5hcnkuICBUaGlzIGZpZWxkIGlzIG9ubHkgZm9yIGluZm9ybWF0aW9uIHB1cnBvc2VzIGFuZCBkb2VzIG5vdCBhZmZlY3QgdGhlCi0gIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpbiBhbnkgbWFubmVyLgotCi0gICAgZGVmbGF0ZSgpIHJldHVybnMgWl9PSyBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQKLSAgcHJvY2Vzc2VkIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgWl9TVFJFQU1fRU5EIGlmIGFsbCBpbnB1dCBoYXMgYmVlbgotICBjb25zdW1lZCBhbmQgYWxsIG91dHB1dCBoYXMgYmVlbiBwcm9kdWNlZCAob25seSB3aGVuIGZsdXNoIGlzIHNldCB0bwotICBaX0ZJTklTSCksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUKLSAgaWYgbmV4dF9pbiBvciBuZXh0X291dCB3YXMgWl9OVUxMKSwgWl9CVUZfRVJST1IgaWYgbm8gcHJvZ3Jlc3MgaXMgcG9zc2libGUKLSAgKGZvciBleGFtcGxlIGF2YWlsX2luIG9yIGF2YWlsX291dCB3YXMgemVybykuICBOb3RlIHRoYXQgWl9CVUZfRVJST1IgaXMgbm90Ci0gIGZhdGFsLCBhbmQgZGVmbGF0ZSgpIGNhbiBiZSBjYWxsZWQgYWdhaW4gd2l0aCBtb3JlIGlucHV0IGFuZCBtb3JlIG91dHB1dAotICBzcGFjZSB0byBjb250aW51ZSBjb21wcmVzc2luZy4KLSovCi0KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlRW5kIE9GKCh6X3N0cmVhbXAgc3RybSkpOwotLyoKLSAgICAgQWxsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoaXMgc3RyZWFtIGFyZSBmcmVlZC4KLSAgIFRoaXMgZnVuY3Rpb24gZGlzY2FyZHMgYW55IHVucHJvY2Vzc2VkIGlucHV0IGFuZCBkb2VzIG5vdCBmbHVzaCBhbnkgcGVuZGluZwotICAgb3V0cHV0LgotCi0gICAgIGRlZmxhdGVFbmQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIHRoZQotICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQsIFpfREFUQV9FUlJPUiBpZiB0aGUgc3RyZWFtIHdhcyBmcmVlZAotICAgcHJlbWF0dXJlbHkgKHNvbWUgaW5wdXQgb3Igb3V0cHV0IHdhcyBkaXNjYXJkZWQpLiAgSW4gdGhlIGVycm9yIGNhc2UsIG1zZwotICAgbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYSBzdGF0aWMgc3RyaW5nICh3aGljaCBtdXN0IG5vdCBiZQotICAgZGVhbGxvY2F0ZWQpLgotKi8KLQotCi0vKgotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdCBPRigoel9zdHJlYW1wIHN0cm0pKTsKLQotICAgICBJbml0aWFsaXplcyB0aGUgaW50ZXJuYWwgc3RyZWFtIHN0YXRlIGZvciBkZWNvbXByZXNzaW9uLiAgVGhlIGZpZWxkcwotICAgbmV4dF9pbiwgYXZhaWxfaW4sIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBieQotICAgdGhlIGNhbGxlci4gIElmIG5leHRfaW4gaXMgbm90IFpfTlVMTCBhbmQgYXZhaWxfaW4gaXMgbGFyZ2UgZW5vdWdoICh0aGUKLSAgIGV4YWN0IHZhbHVlIGRlcGVuZHMgb24gdGhlIGNvbXByZXNzaW9uIG1ldGhvZCksIGluZmxhdGVJbml0IGRldGVybWluZXMgdGhlCi0gICBjb21wcmVzc2lvbiBtZXRob2QgZnJvbSB0aGUgemxpYiBoZWFkZXIgYW5kIGFsbG9jYXRlcyBhbGwgZGF0YSBzdHJ1Y3R1cmVzCi0gICBhY2NvcmRpbmdseTsgb3RoZXJ3aXNlIHRoZSBhbGxvY2F0aW9uIHdpbGwgYmUgZGVmZXJyZWQgdG8gdGhlIGZpcnN0IGNhbGwgb2YKLSAgIGluZmxhdGUuICBJZiB6YWxsb2MgYW5kIHpmcmVlIGFyZSBzZXQgdG8gWl9OVUxMLCBpbmZsYXRlSW5pdCB1cGRhdGVzIHRoZW0gdG8KLSAgIHVzZSBkZWZhdWx0IGFsbG9jYXRpb24gZnVuY3Rpb25zLgotCi0gICAgIGluZmxhdGVJbml0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAotICAgbWVtb3J5LCBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHpsaWIgbGlicmFyeSB2ZXJzaW9uIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZQotICAgdmVyc2lvbiBhc3N1bWVkIGJ5IHRoZSBjYWxsZXIsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBwYXJhbWV0ZXJzIGFyZQotICAgaW52YWxpZCwgc3VjaCBhcyBhIG51bGwgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlLiAgbXNnIGlzIHNldCB0byBudWxsIGlmCi0gICB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgaW5mbGF0ZUluaXQgZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbgotICAgYXBhcnQgZnJvbSBwb3NzaWJseSByZWFkaW5nIHRoZSB6bGliIGhlYWRlciBpZiBwcmVzZW50OiBhY3R1YWwgZGVjb21wcmVzc2lvbgotICAgd2lsbCBiZSBkb25lIGJ5IGluZmxhdGUoKS4gIChTbyBuZXh0X2luIGFuZCBhdmFpbF9pbiBtYXkgYmUgbW9kaWZpZWQsIGJ1dAotICAgbmV4dF9vdXQgYW5kIGF2YWlsX291dCBhcmUgdW51c2VkIGFuZCB1bmNoYW5nZWQuKSBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbgotICAgb2YgaW5mbGF0ZUluaXQoKSBkb2VzIG5vdCBwcm9jZXNzIGFueSBoZWFkZXIgaW5mb3JtYXRpb24gLS0gdGhhdCBpcyBkZWZlcnJlZAotICAgdW50aWwgaW5mbGF0ZSgpIGlzIGNhbGxlZC4KLSovCi0KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IGZsdXNoKSk7Ci0vKgotICAgIGluZmxhdGUgZGVjb21wcmVzc2VzIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSwgYW5kIHN0b3BzIHdoZW4gdGhlIGlucHV0Ci0gIGJ1ZmZlciBiZWNvbWVzIGVtcHR5IG9yIHRoZSBvdXRwdXQgYnVmZmVyIGJlY29tZXMgZnVsbC4gIEl0IG1heSBpbnRyb2R1Y2UKLSAgc29tZSBvdXRwdXQgbGF0ZW5jeSAocmVhZGluZyBpbnB1dCB3aXRob3V0IHByb2R1Y2luZyBhbnkgb3V0cHV0KSBleGNlcHQgd2hlbgotICBmb3JjZWQgdG8gZmx1c2guCi0KLSAgVGhlIGRldGFpbGVkIHNlbWFudGljcyBhcmUgYXMgZm9sbG93cy4gIGluZmxhdGUgcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCi0gIGZvbGxvd2luZyBhY3Rpb25zOgotCi0gIC0gRGVjb21wcmVzcyBtb3JlIGlucHV0IHN0YXJ0aW5nIGF0IG5leHRfaW4gYW5kIHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbgotICAgIGFjY29yZGluZ2x5LiAgSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdAotICAgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyKSwgbmV4dF9pbiBpcyB1cGRhdGVkIGFuZCBwcm9jZXNzaW5nIHdpbGwKLSAgICByZXN1bWUgYXQgdGhpcyBwb2ludCBmb3IgdGhlIG5leHQgY2FsbCBvZiBpbmZsYXRlKCkuCi0KLSAgLSBQcm92aWRlIG1vcmUgb3V0cHV0IHN0YXJ0aW5nIGF0IG5leHRfb3V0IGFuZCB1cGRhdGUgbmV4dF9vdXQgYW5kIGF2YWlsX291dAotICAgIGFjY29yZGluZ2x5LiAgaW5mbGF0ZSgpIHByb3ZpZGVzIGFzIG11Y2ggb3V0cHV0IGFzIHBvc3NpYmxlLCB1bnRpbCB0aGVyZSBpcwotICAgIG5vIG1vcmUgaW5wdXQgZGF0YSBvciBubyBtb3JlIHNwYWNlIGluIHRoZSBvdXRwdXQgYnVmZmVyIChzZWUgYmVsb3cgYWJvdXQKLSAgICB0aGUgZmx1c2ggcGFyYW1ldGVyKS4KLQotICAgIEJlZm9yZSB0aGUgY2FsbCBvZiBpbmZsYXRlKCksIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgYXQgbGVhc3QKLSAgb25lIG9mIHRoZSBhY3Rpb25zIGlzIHBvc3NpYmxlLCBieSBwcm92aWRpbmcgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtaW5nIG1vcmUKLSAgb3V0cHV0LCBhbmQgdXBkYXRpbmcgdGhlIG5leHRfKiBhbmQgYXZhaWxfKiB2YWx1ZXMgYWNjb3JkaW5nbHkuICBUaGUKLSAgYXBwbGljYXRpb24gY2FuIGNvbnN1bWUgdGhlIHVuY29tcHJlc3NlZCBvdXRwdXQgd2hlbiBpdCB3YW50cywgZm9yIGV4YW1wbGUKLSAgd2hlbiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsIChhdmFpbF9vdXQgPT0gMCksIG9yIGFmdGVyIGVhY2ggY2FsbCBvZgotICBpbmZsYXRlKCkuICBJZiBpbmZsYXRlIHJldHVybnMgWl9PSyBhbmQgd2l0aCB6ZXJvIGF2YWlsX291dCwgaXQgbXVzdCBiZQotICBjYWxsZWQgYWdhaW4gYWZ0ZXIgbWFraW5nIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIgYmVjYXVzZSB0aGVyZSBtaWdodCBiZQotICBtb3JlIG91dHB1dCBwZW5kaW5nLgotCi0gICAgVGhlIGZsdXNoIHBhcmFtZXRlciBvZiBpbmZsYXRlKCkgY2FuIGJlIFpfTk9fRkxVU0gsIFpfU1lOQ19GTFVTSCwgWl9GSU5JU0gsCi0gIFpfQkxPQ0ssIG9yIFpfVFJFRVMuICBaX1NZTkNfRkxVU0ggcmVxdWVzdHMgdGhhdCBpbmZsYXRlKCkgZmx1c2ggYXMgbXVjaAotICBvdXRwdXQgYXMgcG9zc2libGUgdG8gdGhlIG91dHB1dCBidWZmZXIuICBaX0JMT0NLIHJlcXVlc3RzIHRoYXQgaW5mbGF0ZSgpCi0gIHN0b3AgaWYgYW5kIHdoZW4gaXQgZ2V0cyB0byB0aGUgbmV4dCBkZWZsYXRlIGJsb2NrIGJvdW5kYXJ5LiAgV2hlbiBkZWNvZGluZwotICB0aGUgemxpYiBvciBnemlwIGZvcm1hdCwgdGhpcyB3aWxsIGNhdXNlIGluZmxhdGUoKSB0byByZXR1cm4gaW1tZWRpYXRlbHkKLSAgYWZ0ZXIgdGhlIGhlYWRlciBhbmQgYmVmb3JlIHRoZSBmaXJzdCBibG9jay4gIFdoZW4gZG9pbmcgYSByYXcgaW5mbGF0ZSwKLSAgaW5mbGF0ZSgpIHdpbGwgZ28gYWhlYWQgYW5kIHByb2Nlc3MgdGhlIGZpcnN0IGJsb2NrLCBhbmQgd2lsbCByZXR1cm4gd2hlbiBpdAotICBnZXRzIHRvIHRoZSBlbmQgb2YgdGhhdCBibG9jaywgb3Igd2hlbiBpdCBydW5zIG91dCBvZiBkYXRhLgotCi0gICAgVGhlIFpfQkxPQ0sgb3B0aW9uIGFzc2lzdHMgaW4gYXBwZW5kaW5nIHRvIG9yIGNvbWJpbmluZyBkZWZsYXRlIHN0cmVhbXMuCi0gIEFsc28gdG8gYXNzaXN0IGluIHRoaXMsIG9uIHJldHVybiBpbmZsYXRlKCkgd2lsbCBzZXQgc3RybS0+ZGF0YV90eXBlIHRvIHRoZQotICBudW1iZXIgb2YgdW51c2VkIGJpdHMgaW4gdGhlIGxhc3QgYnl0ZSB0YWtlbiBmcm9tIHN0cm0tPm5leHRfaW4sIHBsdXMgNjQgaWYKLSAgaW5mbGF0ZSgpIGlzIGN1cnJlbnRseSBkZWNvZGluZyB0aGUgbGFzdCBibG9jayBpbiB0aGUgZGVmbGF0ZSBzdHJlYW0sIHBsdXMKLSAgMTI4IGlmIGluZmxhdGUoKSByZXR1cm5lZCBpbW1lZGlhdGVseSBhZnRlciBkZWNvZGluZyBhbiBlbmQtb2YtYmxvY2sgY29kZSBvcgotICBkZWNvZGluZyB0aGUgY29tcGxldGUgaGVhZGVyIHVwIHRvIGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBkZWZsYXRlCi0gIHN0cmVhbS4gIFRoZSBlbmQtb2YtYmxvY2sgd2lsbCBub3QgYmUgaW5kaWNhdGVkIHVudGlsIGFsbCBvZiB0aGUgdW5jb21wcmVzc2VkCi0gIGRhdGEgZnJvbSB0aGF0IGJsb2NrIGhhcyBiZWVuIHdyaXR0ZW4gdG8gc3RybS0+bmV4dF9vdXQuICBUaGUgbnVtYmVyIG9mCi0gIHVudXNlZCBiaXRzIG1heSBpbiBnZW5lcmFsIGJlIGdyZWF0ZXIgdGhhbiBzZXZlbiwgZXhjZXB0IHdoZW4gYml0IDcgb2YKLSAgZGF0YV90eXBlIGlzIHNldCwgaW4gd2hpY2ggY2FzZSB0aGUgbnVtYmVyIG9mIHVudXNlZCBiaXRzIHdpbGwgYmUgbGVzcyB0aGFuCi0gIGVpZ2h0LiAgZGF0YV90eXBlIGlzIHNldCBhcyBub3RlZCBoZXJlIGV2ZXJ5IHRpbWUgaW5mbGF0ZSgpIHJldHVybnMgZm9yIGFsbAotICBmbHVzaCBvcHRpb25zLCBhbmQgc28gY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBhbW91bnQgb2YgY3VycmVudGx5Ci0gIGNvbnN1bWVkIGlucHV0IGluIGJpdHMuCi0KLSAgICBUaGUgWl9UUkVFUyBvcHRpb24gYmVoYXZlcyBhcyBaX0JMT0NLIGRvZXMsIGJ1dCBpdCBhbHNvIHJldHVybnMgd2hlbiB0aGUKLSAgZW5kIG9mIGVhY2ggZGVmbGF0ZSBibG9jayBoZWFkZXIgaXMgcmVhY2hlZCwgYmVmb3JlIGFueSBhY3R1YWwgZGF0YSBpbiB0aGF0Ci0gIGJsb2NrIGlzIGRlY29kZWQuICBUaGlzIGFsbG93cyB0aGUgY2FsbGVyIHRvIGRldGVybWluZSB0aGUgbGVuZ3RoIG9mIHRoZQotICBkZWZsYXRlIGJsb2NrIGhlYWRlciBmb3IgbGF0ZXIgdXNlIGluIHJhbmRvbSBhY2Nlc3Mgd2l0aGluIGEgZGVmbGF0ZSBibG9jay4KLSAgMjU2IGlzIGFkZGVkIHRvIHRoZSB2YWx1ZSBvZiBzdHJtLT5kYXRhX3R5cGUgd2hlbiBpbmZsYXRlKCkgcmV0dXJucwotICBpbW1lZGlhdGVseSBhZnRlciByZWFjaGluZyB0aGUgZW5kIG9mIHRoZSBkZWZsYXRlIGJsb2NrIGhlYWRlci4KLQotICAgIGluZmxhdGUoKSBzaG91bGQgbm9ybWFsbHkgYmUgY2FsbGVkIHVudGlsIGl0IHJldHVybnMgWl9TVFJFQU1fRU5EIG9yIGFuCi0gIGVycm9yLiAgSG93ZXZlciBpZiBhbGwgZGVjb21wcmVzc2lvbiBpcyB0byBiZSBwZXJmb3JtZWQgaW4gYSBzaW5nbGUgc3RlcCAoYQotICBzaW5nbGUgY2FsbCBvZiBpbmZsYXRlKSwgdGhlIHBhcmFtZXRlciBmbHVzaCBzaG91bGQgYmUgc2V0IHRvIFpfRklOSVNILiAgSW4KLSAgdGhpcyBjYXNlIGFsbCBwZW5kaW5nIGlucHV0IGlzIHByb2Nlc3NlZCBhbmQgYWxsIHBlbmRpbmcgb3V0cHV0IGlzIGZsdXNoZWQ7Ci0gIGF2YWlsX291dCBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIGFsbCBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgZm9yIHRoZQotICBvcGVyYXRpb24gdG8gY29tcGxldGUuICAoVGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG1heSBoYXZlIGJlZW4KLSAgc2F2ZWQgYnkgdGhlIGNvbXByZXNzb3IgZm9yIHRoaXMgcHVycG9zZS4pIFRoZSB1c2Ugb2YgWl9GSU5JU0ggaXMgbm90Ci0gIHJlcXVpcmVkIHRvIHBlcmZvcm0gYW4gaW5mbGF0aW9uIGluIG9uZSBzdGVwLiAgSG93ZXZlciBpdCBtYXkgYmUgdXNlZCB0bwotICBpbmZvcm0gaW5mbGF0ZSB0aGF0IGEgZmFzdGVyIGFwcHJvYWNoIGNhbiBiZSB1c2VkIGZvciB0aGUgc2luZ2xlIGluZmxhdGUoKQotICBjYWxsLiAgWl9GSU5JU0ggYWxzbyBpbmZvcm1zIGluZmxhdGUgdG8gbm90IG1haW50YWluIGEgc2xpZGluZyB3aW5kb3cgaWYgdGhlCi0gIHN0cmVhbSBjb21wbGV0ZXMsIHdoaWNoIHJlZHVjZXMgaW5mbGF0ZSdzIG1lbW9yeSBmb290cHJpbnQuICBJZiB0aGUgc3RyZWFtCi0gIGRvZXMgbm90IGNvbXBsZXRlLCBlaXRoZXIgYmVjYXVzZSBub3QgYWxsIG9mIHRoZSBzdHJlYW0gaXMgcHJvdmlkZWQgb3Igbm90Ci0gIGVub3VnaCBvdXRwdXQgc3BhY2UgaXMgcHJvdmlkZWQsIHRoZW4gYSBzbGlkaW5nIHdpbmRvdyB3aWxsIGJlIGFsbG9jYXRlZCBhbmQKLSAgaW5mbGF0ZSgpIGNhbiBiZSBjYWxsZWQgYWdhaW4gdG8gY29udGludWUgdGhlIG9wZXJhdGlvbiBhcyBpZiBaX05PX0ZMVVNIIGhhZAotICBiZWVuIHVzZWQuCi0KLSAgICAgSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgaW5mbGF0ZSgpIGFsd2F5cyBmbHVzaGVzIGFzIG11Y2ggb3V0cHV0IGFzCi0gIHBvc3NpYmxlIHRvIHRoZSBvdXRwdXQgYnVmZmVyLCBhbmQgYWx3YXlzIHVzZXMgdGhlIGZhc3RlciBhcHByb2FjaCBvbiB0aGUKLSAgZmlyc3QgY2FsbC4gIFNvIHRoZSBlZmZlY3RzIG9mIHRoZSBmbHVzaCBwYXJhbWV0ZXIgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbiBhcmUKLSAgb24gdGhlIHJldHVybiB2YWx1ZSBvZiBpbmZsYXRlKCkgYXMgbm90ZWQgYmVsb3csIHdoZW4gaW5mbGF0ZSgpIHJldHVybnMgZWFybHkKLSAgd2hlbiBaX0JMT0NLIG9yIFpfVFJFRVMgaXMgdXNlZCwgYW5kIHdoZW4gaW5mbGF0ZSgpIGF2b2lkcyB0aGUgYWxsb2NhdGlvbiBvZgotICBtZW1vcnkgZm9yIGEgc2xpZGluZyB3aW5kb3cgd2hlbiBaX0ZJTklTSCBpcyB1c2VkLgotCi0gICAgIElmIGEgcHJlc2V0IGRpY3Rpb25hcnkgaXMgbmVlZGVkIGFmdGVyIHRoaXMgY2FsbCAoc2VlIGluZmxhdGVTZXREaWN0aW9uYXJ5Ci0gIGJlbG93KSwgaW5mbGF0ZSBzZXRzIHN0cm0tPmFkbGVyIHRvIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZiB0aGUgZGljdGlvbmFyeQotICBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IgYW5kIHJldHVybnMgWl9ORUVEX0RJQ1Q7IG90aGVyd2lzZSBpdCBzZXRzCi0gIHN0cm0tPmFkbGVyIHRvIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZiBhbGwgb3V0cHV0IHByb2R1Y2VkIHNvIGZhciAodGhhdCBpcywKLSAgdG90YWxfb3V0IGJ5dGVzKSBhbmQgcmV0dXJucyBaX09LLCBaX1NUUkVBTV9FTkQgb3IgYW4gZXJyb3IgY29kZSBhcyBkZXNjcmliZWQKLSAgYmVsb3cuICBBdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0sIGluZmxhdGUoKSBjaGVja3MgdGhhdCBpdHMgY29tcHV0ZWQgYWRsZXIzMgotICBjaGVja3N1bSBpcyBlcXVhbCB0byB0aGF0IHNhdmVkIGJ5IHRoZSBjb21wcmVzc29yIGFuZCByZXR1cm5zIFpfU1RSRUFNX0VORAotICBvbmx5IGlmIHRoZSBjaGVja3N1bSBpcyBjb3JyZWN0LgotCi0gICAgaW5mbGF0ZSgpIGNhbiBkZWNvbXByZXNzIGFuZCBjaGVjayBlaXRoZXIgemxpYi13cmFwcGVkIG9yIGd6aXAtd3JhcHBlZAotICBkZWZsYXRlIGRhdGEuICBUaGUgaGVhZGVyIHR5cGUgaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseSwgaWYgcmVxdWVzdGVkIHdoZW4KLSAgaW5pdGlhbGl6aW5nIHdpdGggaW5mbGF0ZUluaXQyKCkuICBBbnkgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZSBnemlwCi0gIGhlYWRlciBpcyBub3QgcmV0YWluZWQsIHNvIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdGhhdCBpbmZvcm1hdGlvbiBzaG91bGQKLSAgaW5zdGVhZCB1c2UgcmF3IGluZmxhdGUsIHNlZSBpbmZsYXRlSW5pdDIoKSBiZWxvdywgb3IgaW5mbGF0ZUJhY2soKSBhbmQKLSAgcGVyZm9ybSB0aGVpciBvd24gcHJvY2Vzc2luZyBvZiB0aGUgZ3ppcCBoZWFkZXIgYW5kIHRyYWlsZXIuICBXaGVuIHByb2Nlc3NpbmcKLSAgZ3ppcC13cmFwcGVkIGRlZmxhdGUgZGF0YSwgc3RybS0+YWRsZXIzMiBpcyBzZXQgdG8gdGhlIENSQy0zMiBvZiB0aGUgb3V0cHV0Ci0gIHByb2R1Y3RlZCBzbyBmYXIuICBUaGUgQ1JDLTMyIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgZ3ppcCB0cmFpbGVyLgotCi0gICAgaW5mbGF0ZSgpIHJldHVybnMgWl9PSyBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQgcHJvY2Vzc2VkCi0gIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgWl9TVFJFQU1fRU5EIGlmIHRoZSBlbmQgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBoYXMKLSAgYmVlbiByZWFjaGVkIGFuZCBhbGwgdW5jb21wcmVzc2VkIG91dHB1dCBoYXMgYmVlbiBwcm9kdWNlZCwgWl9ORUVEX0RJQ1QgaWYgYQotICBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYXQgdGhpcyBwb2ludCwgWl9EQVRBX0VSUk9SIGlmIHRoZSBpbnB1dCBkYXRhIHdhcwotICBjb3JydXB0ZWQgKGlucHV0IHN0cmVhbSBub3QgY29uZm9ybWluZyB0byB0aGUgemxpYiBmb3JtYXQgb3IgaW5jb3JyZWN0IGNoZWNrCi0gIHZhbHVlKSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdHJ1Y3R1cmUgd2FzIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUKLSAgbmV4dF9pbiBvciBuZXh0X291dCB3YXMgWl9OVUxMKSwgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5LAotICBaX0JVRl9FUlJPUiBpZiBubyBwcm9ncmVzcyBpcyBwb3NzaWJsZSBvciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZQotICBvdXRwdXQgYnVmZmVyIHdoZW4gWl9GSU5JU0ggaXMgdXNlZC4gIE5vdGUgdGhhdCBaX0JVRl9FUlJPUiBpcyBub3QgZmF0YWwsIGFuZAotICBpbmZsYXRlKCkgY2FuIGJlIGNhbGxlZCBhZ2FpbiB3aXRoIG1vcmUgaW5wdXQgYW5kIG1vcmUgb3V0cHV0IHNwYWNlIHRvCi0gIGNvbnRpbnVlIGRlY29tcHJlc3NpbmcuICBJZiBaX0RBVEFfRVJST1IgaXMgcmV0dXJuZWQsIHRoZSBhcHBsaWNhdGlvbiBtYXkKLSAgdGhlbiBjYWxsIGluZmxhdGVTeW5jKCkgdG8gbG9vayBmb3IgYSBnb29kIGNvbXByZXNzaW9uIGJsb2NrIGlmIGEgcGFydGlhbAotICByZWNvdmVyeSBvZiB0aGUgZGF0YSBpcyBkZXNpcmVkLgotKi8KLQotCi1aRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVFbmQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7Ci0vKgotICAgICBBbGwgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhpcyBzdHJlYW0gYXJlIGZyZWVkLgotICAgVGhpcyBmdW5jdGlvbiBkaXNjYXJkcyBhbnkgdW5wcm9jZXNzZWQgaW5wdXQgYW5kIGRvZXMgbm90IGZsdXNoIGFueSBwZW5kaW5nCi0gICBvdXRwdXQuCi0KLSAgICAgaW5mbGF0ZUVuZCByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdGF0ZQotICAgd2FzIGluY29uc2lzdGVudC4gIEluIHRoZSBlcnJvciBjYXNlLCBtc2cgbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYQotICAgc3RhdGljIHN0cmluZyAod2hpY2ggbXVzdCBub3QgYmUgZGVhbGxvY2F0ZWQpLgotKi8KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBBZHZhbmNlZCBmdW5jdGlvbnMgKi8KLQotLyoKLSAgICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIG9ubHkgaW4gc29tZSBzcGVjaWFsIGFwcGxpY2F0aW9ucy4KLSovCi0KLS8qCi1aRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVJbml0MiBPRigoel9zdHJlYW1wIHN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIHdpbmRvd0JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBtZW1MZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIHN0cmF0ZWd5KSk7Ci0KLSAgICAgVGhpcyBpcyBhbm90aGVyIHZlcnNpb24gb2YgZGVmbGF0ZUluaXQgd2l0aCBtb3JlIGNvbXByZXNzaW9uIG9wdGlvbnMuICBUaGUKLSAgIGZpZWxkcyBuZXh0X2luLCB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkgdGhlCi0gICBjYWxsZXIuCi0KLSAgICAgVGhlIG1ldGhvZCBwYXJhbWV0ZXIgaXMgdGhlIGNvbXByZXNzaW9uIG1ldGhvZC4gIEl0IG11c3QgYmUgWl9ERUZMQVRFRCBpbgotICAgdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LgotCi0gICAgIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyB0aGUgYmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSB3aW5kb3cgc2l6ZQotICAgKHRoZSBzaXplIG9mIHRoZSBoaXN0b3J5IGJ1ZmZlcikuICBJdCBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIDguLjE1IGZvciB0aGlzCi0gICB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiAgTGFyZ2VyIHZhbHVlcyBvZiB0aGlzIHBhcmFtZXRlciByZXN1bHQgaW4gYmV0dGVyCi0gICBjb21wcmVzc2lvbiBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkgdXNhZ2UuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBpZgotICAgZGVmbGF0ZUluaXQgaXMgdXNlZCBpbnN0ZWFkLgotCi0gICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgLTguLi0xNSBmb3IgcmF3IGRlZmxhdGUuICBJbiB0aGlzIGNhc2UsIC13aW5kb3dCaXRzCi0gICBkZXRlcm1pbmVzIHRoZSB3aW5kb3cgc2l6ZS4gIGRlZmxhdGUoKSB3aWxsIHRoZW4gZ2VuZXJhdGUgcmF3IGRlZmxhdGUgZGF0YQotICAgd2l0aCBubyB6bGliIGhlYWRlciBvciB0cmFpbGVyLCBhbmQgd2lsbCBub3QgY29tcHV0ZSBhbiBhZGxlcjMyIGNoZWNrIHZhbHVlLgotCi0gICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgZ3JlYXRlciB0aGFuIDE1IGZvciBvcHRpb25hbCBnemlwIGVuY29kaW5nLiAgQWRkCi0gICAxNiB0byB3aW5kb3dCaXRzIHRvIHdyaXRlIGEgc2ltcGxlIGd6aXAgaGVhZGVyIGFuZCB0cmFpbGVyIGFyb3VuZCB0aGUKLSAgIGNvbXByZXNzZWQgZGF0YSBpbnN0ZWFkIG9mIGEgemxpYiB3cmFwcGVyLiAgVGhlIGd6aXAgaGVhZGVyIHdpbGwgaGF2ZSBubwotICAgZmlsZSBuYW1lLCBubyBleHRyYSBkYXRhLCBubyBjb21tZW50LCBubyBtb2RpZmljYXRpb24gdGltZSAoc2V0IHRvIHplcm8pLCBubwotICAgaGVhZGVyIGNyYywgYW5kIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHdpbGwgYmUgc2V0IHRvIDI1NSAodW5rbm93bikuICBJZiBhCi0gICBnemlwIHN0cmVhbSBpcyBiZWluZyB3cml0dGVuLCBzdHJtLT5hZGxlciBpcyBhIGNyYzMyIGluc3RlYWQgb2YgYW4gYWRsZXIzMi4KLQotICAgICBUaGUgbWVtTGV2ZWwgcGFyYW1ldGVyIHNwZWNpZmllcyBob3cgbXVjaCBtZW1vcnkgc2hvdWxkIGJlIGFsbG9jYXRlZAotICAgZm9yIHRoZSBpbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS4gIG1lbUxldmVsPTEgdXNlcyBtaW5pbXVtIG1lbW9yeSBidXQgaXMKLSAgIHNsb3cgYW5kIHJlZHVjZXMgY29tcHJlc3Npb24gcmF0aW87IG1lbUxldmVsPTkgdXNlcyBtYXhpbXVtIG1lbW9yeSBmb3IKLSAgIG9wdGltYWwgc3BlZWQuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA4LiAgU2VlIHpjb25mLmggZm9yIHRvdGFsIG1lbW9yeSB1c2FnZQotICAgYXMgYSBmdW5jdGlvbiBvZiB3aW5kb3dCaXRzIGFuZCBtZW1MZXZlbC4KLQotICAgICBUaGUgc3RyYXRlZ3kgcGFyYW1ldGVyIGlzIHVzZWQgdG8gdHVuZSB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtLiAgVXNlIHRoZQotICAgdmFsdWUgWl9ERUZBVUxUX1NUUkFURUdZIGZvciBub3JtYWwgZGF0YSwgWl9GSUxURVJFRCBmb3IgZGF0YSBwcm9kdWNlZCBieSBhCi0gICBmaWx0ZXIgKG9yIHByZWRpY3RvciksIFpfSFVGRk1BTl9PTkxZIHRvIGZvcmNlIEh1ZmZtYW4gZW5jb2Rpbmcgb25seSAobm8KLSAgIHN0cmluZyBtYXRjaCksIG9yIFpfUkxFIHRvIGxpbWl0IG1hdGNoIGRpc3RhbmNlcyB0byBvbmUgKHJ1bi1sZW5ndGgKLSAgIGVuY29kaW5nKS4gIEZpbHRlcmVkIGRhdGEgY29uc2lzdHMgbW9zdGx5IG9mIHNtYWxsIHZhbHVlcyB3aXRoIGEgc29tZXdoYXQKLSAgIHJhbmRvbSBkaXN0cmlidXRpb24uICBJbiB0aGlzIGNhc2UsIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gaXMgdHVuZWQgdG8KLSAgIGNvbXByZXNzIHRoZW0gYmV0dGVyLiAgVGhlIGVmZmVjdCBvZiBaX0ZJTFRFUkVEIGlzIHRvIGZvcmNlIG1vcmUgSHVmZm1hbgotICAgY29kaW5nIGFuZCBsZXNzIHN0cmluZyBtYXRjaGluZzsgaXQgaXMgc29tZXdoYXQgaW50ZXJtZWRpYXRlIGJldHdlZW4KLSAgIFpfREVGQVVMVF9TVFJBVEVHWSBhbmQgWl9IVUZGTUFOX09OTFkuICBaX1JMRSBpcyBkZXNpZ25lZCB0byBiZSBhbG1vc3QgYXMKLSAgIGZhc3QgYXMgWl9IVUZGTUFOX09OTFksIGJ1dCBnaXZlIGJldHRlciBjb21wcmVzc2lvbiBmb3IgUE5HIGltYWdlIGRhdGEuICBUaGUKLSAgIHN0cmF0ZWd5IHBhcmFtZXRlciBvbmx5IGFmZmVjdHMgdGhlIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBub3QgdGhlCi0gICBjb3JyZWN0bmVzcyBvZiB0aGUgY29tcHJlc3NlZCBvdXRwdXQgZXZlbiBpZiBpdCBpcyBub3Qgc2V0IGFwcHJvcHJpYXRlbHkuCi0gICBaX0ZJWEVEIHByZXZlbnRzIHRoZSB1c2Ugb2YgZHluYW1pYyBIdWZmbWFuIGNvZGVzLCBhbGxvd2luZyBmb3IgYSBzaW1wbGVyCi0gICBkZWNvZGVyIGZvciBzcGVjaWFsIGFwcGxpY2F0aW9ucy4KLQotICAgICBkZWZsYXRlSW5pdDIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCi0gICBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIGFueSBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBhbiBpbnZhbGlkCi0gICBtZXRob2QpLCBvciBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHpsaWIgbGlicmFyeSB2ZXJzaW9uICh6bGliX3ZlcnNpb24pIGlzCi0gICBpbmNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiBhc3N1bWVkIGJ5IHRoZSBjYWxsZXIgKFpMSUJfVkVSU0lPTikuICBtc2cgaXMKLSAgIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICBkZWZsYXRlSW5pdDIgZG9lcyBub3QgcGVyZm9ybSBhbnkKLSAgIGNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBkZWZsYXRlKCkuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVTZXREaWN0aW9uYXJ5IE9GKCh6X3N0cmVhbXAgc3RybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpkaWN0aW9uYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUludCAgZGljdExlbmd0aCkpOwotLyoKLSAgICAgSW5pdGlhbGl6ZXMgdGhlIGNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gYnl0ZSBzZXF1ZW5jZQotICAgd2l0aG91dCBwcm9kdWNpbmcgYW55IGNvbXByZXNzZWQgb3V0cHV0LiAgV2hlbiB1c2luZyB0aGUgemxpYiBmb3JtYXQsIHRoaXMKLSAgIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGRlZmxhdGVJbml0LCBkZWZsYXRlSW5pdDIgb3IKLSAgIGRlZmxhdGVSZXNldCwgYW5kIGJlZm9yZSBhbnkgY2FsbCBvZiBkZWZsYXRlLiAgV2hlbiBkb2luZyByYXcgZGVmbGF0ZSwgdGhpcwotICAgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgZWl0aGVyIGJlZm9yZSBhbnkgY2FsbCBvZiBkZWZsYXRlLCBvciBpbW1lZGlhdGVseQotICAgYWZ0ZXIgdGhlIGNvbXBsZXRpb24gb2YgYSBkZWZsYXRlIGJsb2NrLCBpLmUuIGFmdGVyIGFsbCBpbnB1dCBoYXMgYmVlbgotICAgY29uc3VtZWQgYW5kIGFsbCBvdXRwdXQgaGFzIGJlZW4gZGVsaXZlcmVkIHdoZW4gdXNpbmcgYW55IG9mIHRoZSBmbHVzaAotICAgb3B0aW9ucyBaX0JMT0NLLCBaX1BBUlRJQUxfRkxVU0gsIFpfU1lOQ19GTFVTSCwgb3IgWl9GVUxMX0ZMVVNILiAgVGhlCi0gICBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgbXVzdCB1c2UgZXhhY3RseSB0aGUgc2FtZSBkaWN0aW9uYXJ5IChzZWUKLSAgIGluZmxhdGVTZXREaWN0aW9uYXJ5KS4KLQotICAgICBUaGUgZGljdGlvbmFyeSBzaG91bGQgY29uc2lzdCBvZiBzdHJpbmdzIChieXRlIHNlcXVlbmNlcykgdGhhdCBhcmUgbGlrZWx5Ci0gICB0byBiZSBlbmNvdW50ZXJlZCBsYXRlciBpbiB0aGUgZGF0YSB0byBiZSBjb21wcmVzc2VkLCB3aXRoIHRoZSBtb3N0IGNvbW1vbmx5Ci0gICB1c2VkIHN0cmluZ3MgcHJlZmVyYWJseSBwdXQgdG93YXJkcyB0aGUgZW5kIG9mIHRoZSBkaWN0aW9uYXJ5LiAgVXNpbmcgYQotICAgZGljdGlvbmFyeSBpcyBtb3N0IHVzZWZ1bCB3aGVuIHRoZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQgaXMgc2hvcnQgYW5kIGNhbiBiZQotICAgcHJlZGljdGVkIHdpdGggZ29vZCBhY2N1cmFjeTsgdGhlIGRhdGEgY2FuIHRoZW4gYmUgY29tcHJlc3NlZCBiZXR0ZXIgdGhhbgotICAgd2l0aCB0aGUgZGVmYXVsdCBlbXB0eSBkaWN0aW9uYXJ5LgotCi0gICAgIERlcGVuZGluZyBvbiB0aGUgc2l6ZSBvZiB0aGUgY29tcHJlc3Npb24gZGF0YSBzdHJ1Y3R1cmVzIHNlbGVjdGVkIGJ5Ci0gICBkZWZsYXRlSW5pdCBvciBkZWZsYXRlSW5pdDIsIGEgcGFydCBvZiB0aGUgZGljdGlvbmFyeSBtYXkgaW4gZWZmZWN0IGJlCi0gICBkaXNjYXJkZWQsIGZvciBleGFtcGxlIGlmIHRoZSBkaWN0aW9uYXJ5IGlzIGxhcmdlciB0aGFuIHRoZSB3aW5kb3cgc2l6ZQotICAgcHJvdmlkZWQgaW4gZGVmbGF0ZUluaXQgb3IgZGVmbGF0ZUluaXQyLiAgVGh1cyB0aGUgc3RyaW5ncyBtb3N0IGxpa2VseSB0byBiZQotICAgdXNlZnVsIHNob3VsZCBiZSBwdXQgYXQgdGhlIGVuZCBvZiB0aGUgZGljdGlvbmFyeSwgbm90IGF0IHRoZSBmcm9udC4gIEluCi0gICBhZGRpdGlvbiwgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgZGVmbGF0ZSB3aWxsIHVzZSBhdCBtb3N0IHRoZSB3aW5kb3cKLSAgIHNpemUgbWludXMgMjYyIGJ5dGVzIG9mIHRoZSBwcm92aWRlZCBkaWN0aW9uYXJ5LgotCi0gICAgIFVwb24gcmV0dXJuIG9mIHRoaXMgZnVuY3Rpb24sIHN0cm0tPmFkbGVyIGlzIHNldCB0byB0aGUgYWRsZXIzMiB2YWx1ZQotICAgb2YgdGhlIGRpY3Rpb25hcnk7IHRoZSBkZWNvbXByZXNzb3IgbWF5IGxhdGVyIHVzZSB0aGlzIHZhbHVlIHRvIGRldGVybWluZQotICAgd2hpY2ggZGljdGlvbmFyeSBoYXMgYmVlbiB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLiAgKFRoZSBhZGxlcjMyIHZhbHVlCi0gICBhcHBsaWVzIHRvIHRoZSB3aG9sZSBkaWN0aW9uYXJ5IGV2ZW4gaWYgb25seSBhIHN1YnNldCBvZiB0aGUgZGljdGlvbmFyeSBpcwotICAgYWN0dWFsbHkgdXNlZCBieSB0aGUgY29tcHJlc3Nvci4pIElmIGEgcmF3IGRlZmxhdGUgd2FzIHJlcXVlc3RlZCwgdGhlbiB0aGUKLSAgIGFkbGVyMzIgdmFsdWUgaXMgbm90IGNvbXB1dGVkIGFuZCBzdHJtLT5hZGxlciBpcyBub3Qgc2V0LgotCi0gICAgIGRlZmxhdGVTZXREaWN0aW9uYXJ5IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiBhCi0gICBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoZS5nLiAgZGljdGlvbmFyeSBiZWluZyBaX05VTEwpIG9yIHRoZSBzdHJlYW0gc3RhdGUgaXMKLSAgIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUgaWYgZGVmbGF0ZSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhpcyBzdHJlYW0KLSAgIG9yIGlmIG5vdCBhdCBhIGJsb2NrIGJvdW5kYXJ5IGZvciByYXcgZGVmbGF0ZSkuICBkZWZsYXRlU2V0RGljdGlvbmFyeSBkb2VzCi0gICBub3QgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IGRlZmxhdGUoKS4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUNvcHkgT0YoKHpfc3RyZWFtcCBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgel9zdHJlYW1wIHNvdXJjZSkpOwotLyoKLSAgICAgU2V0cyB0aGUgZGVzdGluYXRpb24gc3RyZWFtIGFzIGEgY29tcGxldGUgY29weSBvZiB0aGUgc291cmNlIHN0cmVhbS4KLQotICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiBzZXZlcmFsIGNvbXByZXNzaW9uIHN0cmF0ZWdpZXMgd2lsbCBiZQotICAgdHJpZWQsIGZvciBleGFtcGxlIHdoZW4gdGhlcmUgYXJlIHNldmVyYWwgd2F5cyBvZiBwcmUtcHJvY2Vzc2luZyB0aGUgaW5wdXQKLSAgIGRhdGEgd2l0aCBhIGZpbHRlci4gIFRoZSBzdHJlYW1zIHRoYXQgd2lsbCBiZSBkaXNjYXJkZWQgc2hvdWxkIHRoZW4gYmUgZnJlZWQKLSAgIGJ5IGNhbGxpbmcgZGVmbGF0ZUVuZC4gIE5vdGUgdGhhdCBkZWZsYXRlQ29weSBkdXBsaWNhdGVzIHRoZSBpbnRlcm5hbAotICAgY29tcHJlc3Npb24gc3RhdGUgd2hpY2ggY2FuIGJlIHF1aXRlIGxhcmdlLCBzbyB0aGlzIHN0cmF0ZWd5IGlzIHNsb3cgYW5kIGNhbgotICAgY29uc3VtZSBsb3RzIG9mIG1lbW9yeS4KLQotICAgICBkZWZsYXRlQ29weSByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAotICAgZW5vdWdoIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudAotICAgKHN1Y2ggYXMgemFsbG9jIGJlaW5nIFpfTlVMTCkuICBtc2cgaXMgbGVmdCB1bmNoYW5nZWQgaW4gYm90aCBzb3VyY2UgYW5kCi0gICBkZXN0aW5hdGlvbi4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVJlc2V0IE9GKCh6X3N0cmVhbXAgc3RybSkpOwotLyoKLSAgICAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGRlZmxhdGVFbmQgZm9sbG93ZWQgYnkgZGVmbGF0ZUluaXQsCi0gICBidXQgZG9lcyBub3QgZnJlZSBhbmQgcmVhbGxvY2F0ZSBhbGwgdGhlIGludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLiAgVGhlCi0gICBzdHJlYW0gd2lsbCBrZWVwIHRoZSBzYW1lIGNvbXByZXNzaW9uIGxldmVsIGFuZCBhbnkgb3RoZXIgYXR0cmlidXRlcyB0aGF0Ci0gICBtYXkgaGF2ZSBiZWVuIHNldCBieSBkZWZsYXRlSW5pdDIuCi0KLSAgICAgZGVmbGF0ZVJlc2V0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCi0gICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCAoc3VjaCBhcyB6YWxsb2Mgb3Igc3RhdGUgYmVpbmcgWl9OVUxMKS4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVBhcmFtcyBPRigoel9zdHJlYW1wIHN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmF0ZWd5KSk7Ci0vKgotICAgICBEeW5hbWljYWxseSB1cGRhdGUgdGhlIGNvbXByZXNzaW9uIGxldmVsIGFuZCBjb21wcmVzc2lvbiBzdHJhdGVneS4gIFRoZQotICAgaW50ZXJwcmV0YXRpb24gb2YgbGV2ZWwgYW5kIHN0cmF0ZWd5IGlzIGFzIGluIGRlZmxhdGVJbml0Mi4gIFRoaXMgY2FuIGJlCi0gICB1c2VkIHRvIHN3aXRjaCBiZXR3ZWVuIGNvbXByZXNzaW9uIGFuZCBzdHJhaWdodCBjb3B5IG9mIHRoZSBpbnB1dCBkYXRhLCBvcgotICAgdG8gc3dpdGNoIHRvIGEgZGlmZmVyZW50IGtpbmQgb2YgaW5wdXQgZGF0YSByZXF1aXJpbmcgYSBkaWZmZXJlbnQgc3RyYXRlZ3kuCi0gICBJZiB0aGUgY29tcHJlc3Npb24gbGV2ZWwgaXMgY2hhbmdlZCwgdGhlIGlucHV0IGF2YWlsYWJsZSBzbyBmYXIgaXMKLSAgIGNvbXByZXNzZWQgd2l0aCB0aGUgb2xkIGxldmVsIChhbmQgbWF5IGJlIGZsdXNoZWQpOyB0aGUgbmV3IGxldmVsIHdpbGwgdGFrZQotICAgZWZmZWN0IG9ubHkgYXQgdGhlIG5leHQgY2FsbCBvZiBkZWZsYXRlKCkuCi0KLSAgICAgQmVmb3JlIHRoZSBjYWxsIG9mIGRlZmxhdGVQYXJhbXMsIHRoZSBzdHJlYW0gc3RhdGUgbXVzdCBiZSBzZXQgYXMgZm9yCi0gICBhIGNhbGwgb2YgZGVmbGF0ZSgpLCBzaW5jZSB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBpbnB1dCBtYXkgaGF2ZSB0byBiZQotICAgY29tcHJlc3NlZCBhbmQgZmx1c2hlZC4gIEluIHBhcnRpY3VsYXIsIHN0cm0tPmF2YWlsX291dCBtdXN0IGJlIG5vbi16ZXJvLgotCi0gICAgIGRlZmxhdGVQYXJhbXMgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKLSAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IG9yIGlmIGEgcGFyYW1ldGVyIHdhcyBpbnZhbGlkLCBaX0JVRl9FUlJPUiBpZgotICAgc3RybS0+YXZhaWxfb3V0IHdhcyB6ZXJvLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlVHVuZSBPRigoel9zdHJlYW1wIHN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ29vZF9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2xhenksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmljZV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2NoYWluKSk7Ci0vKgotICAgICBGaW5lIHR1bmUgZGVmbGF0ZSdzIGludGVybmFsIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMuICBUaGlzIHNob3VsZCBvbmx5IGJlCi0gICB1c2VkIGJ5IHNvbWVvbmUgd2hvIHVuZGVyc3RhbmRzIHRoZSBhbGdvcml0aG0gdXNlZCBieSB6bGliJ3MgZGVmbGF0ZSBmb3IKLSAgIHNlYXJjaGluZyBmb3IgdGhlIGJlc3QgbWF0Y2hpbmcgc3RyaW5nLCBhbmQgZXZlbiB0aGVuIG9ubHkgYnkgdGhlIG1vc3QKLSAgIGZhbmF0aWMgb3B0aW1pemVyIHRyeWluZyB0byBzcXVlZXplIG91dCB0aGUgbGFzdCBjb21wcmVzc2VkIGJpdCBmb3IgdGhlaXIKLSAgIHNwZWNpZmljIGlucHV0IGRhdGEuICBSZWFkIHRoZSBkZWZsYXRlLmMgc291cmNlIGNvZGUgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZQotICAgbWF4X2xhenksIGdvb2RfbGVuZ3RoLCBuaWNlX2xlbmd0aCwgYW5kIG1heF9jaGFpbiBwYXJhbWV0ZXJzLgotCi0gICAgIGRlZmxhdGVUdW5lKCkgY2FuIGJlIGNhbGxlZCBhZnRlciBkZWZsYXRlSW5pdCgpIG9yIGRlZmxhdGVJbml0MigpLCBhbmQKLSAgIHJldHVybnMgWl9PSyBvbiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBmb3IgYW4gaW52YWxpZCBkZWZsYXRlIHN0cmVhbS4KLSAqLwotCi1aRVhURVJOIHVMb25nIFpFWFBPUlQgZGVmbGF0ZUJvdW5kIE9GKCh6X3N0cmVhbXAgc3RybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIHNvdXJjZUxlbikpOwotLyoKLSAgICAgZGVmbGF0ZUJvdW5kKCkgcmV0dXJucyBhbiB1cHBlciBib3VuZCBvbiB0aGUgY29tcHJlc3NlZCBzaXplIGFmdGVyCi0gICBkZWZsYXRpb24gb2Ygc291cmNlTGVuIGJ5dGVzLiAgSXQgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZGVmbGF0ZUluaXQoKSBvcgotICAgZGVmbGF0ZUluaXQyKCksIGFuZCBhZnRlciBkZWZsYXRlU2V0SGVhZGVyKCksIGlmIHVzZWQuICBUaGlzIHdvdWxkIGJlIHVzZWQKLSAgIHRvIGFsbG9jYXRlIGFuIG91dHB1dCBidWZmZXIgZm9yIGRlZmxhdGlvbiBpbiBhIHNpbmdsZSBwYXNzLCBhbmQgc28gd291bGQgYmUKLSAgIGNhbGxlZCBiZWZvcmUgZGVmbGF0ZSgpLiAgSWYgdGhhdCBmaXJzdCBkZWZsYXRlKCkgY2FsbCBpcyBwcm92aWRlZCB0aGUKLSAgIHNvdXJjZUxlbiBpbnB1dCBieXRlcywgYW4gb3V0cHV0IGJ1ZmZlciBhbGxvY2F0ZWQgdG8gdGhlIHNpemUgcmV0dXJuZWQgYnkKLSAgIGRlZmxhdGVCb3VuZCgpLCBhbmQgdGhlIGZsdXNoIHZhbHVlIFpfRklOSVNILCB0aGVuIGRlZmxhdGUoKSBpcyBndWFyYW50ZWVkCi0gICB0byByZXR1cm4gWl9TVFJFQU1fRU5ELiAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgY29tcHJlc3NlZCBzaXplIHRvCi0gICBiZSBsYXJnZXIgdGhhbiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgZGVmbGF0ZUJvdW5kKCkgaWYgZmx1c2ggb3B0aW9ucyBvdGhlcgotICAgdGhhbiBaX0ZJTklTSCBvciBaX05PX0ZMVVNIIGFyZSB1c2VkLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlUGVuZGluZyBPRigoel9zdHJlYW1wIHN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqcGVuZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYml0cykpOwotLyoKLSAgICAgZGVmbGF0ZVBlbmRpbmcoKSByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgYW5kIGJpdHMgb2Ygb3V0cHV0IHRoYXQgaGF2ZQotICAgYmVlbiBnZW5lcmF0ZWQsIGJ1dCBub3QgeWV0IHByb3ZpZGVkIGluIHRoZSBhdmFpbGFibGUgb3V0cHV0LiAgVGhlIGJ5dGVzIG5vdAotICAgcHJvdmlkZWQgd291bGQgYmUgZHVlIHRvIHRoZSBhdmFpbGFibGUgb3V0cHV0IHNwYWNlIGhhdmluZyBiZWluZyBjb25zdW1lZC4KLSAgIFRoZSBudW1iZXIgb2YgYml0cyBvZiBvdXRwdXQgbm90IHByb3ZpZGVkIGFyZSBiZXR3ZWVuIDAgYW5kIDcsIHdoZXJlIHRoZXkKLSAgIGF3YWl0IG1vcmUgYml0cyB0byBqb2luIHRoZW0gaW4gb3JkZXIgdG8gZmlsbCBvdXQgYSBmdWxsIGJ5dGUuICBJZiBwZW5kaW5nCi0gICBvciBiaXRzIGFyZSBaX05VTEwsIHRoZW4gdGhvc2UgdmFsdWVzIGFyZSBub3Qgc2V0LgotCi0gICAgIGRlZmxhdGVQZW5kaW5nIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCi0gICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KLSAqLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVQcmltZSBPRigoel9zdHJlYW1wIHN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKSk7Ci0vKgotICAgICBkZWZsYXRlUHJpbWUoKSBpbnNlcnRzIGJpdHMgaW4gdGhlIGRlZmxhdGUgb3V0cHV0IHN0cmVhbS4gIFRoZSBpbnRlbnQKLSAgIGlzIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IG9mZiB0aGUgZGVmbGF0ZSBvdXRwdXQgd2l0aCB0aGUgYml0cwotICAgbGVmdG92ZXIgZnJvbSBhIHByZXZpb3VzIGRlZmxhdGUgc3RyZWFtIHdoZW4gYXBwZW5kaW5nIHRvIGl0LiAgQXMgc3VjaCwgdGhpcwotICAgZnVuY3Rpb24gY2FuIG9ubHkgYmUgdXNlZCBmb3IgcmF3IGRlZmxhdGUsIGFuZCBtdXN0IGJlIHVzZWQgYmVmb3JlIHRoZSBmaXJzdAotICAgZGVmbGF0ZSgpIGNhbGwgYWZ0ZXIgYSBkZWZsYXRlSW5pdDIoKSBvciBkZWZsYXRlUmVzZXQoKS4gIGJpdHMgbXVzdCBiZSBsZXNzCi0gICB0aGFuIG9yIGVxdWFsIHRvIDE2LCBhbmQgdGhhdCBtYW55IG9mIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHZhbHVlCi0gICB3aWxsIGJlIGluc2VydGVkIGluIHRoZSBvdXRwdXQuCi0KLSAgICAgZGVmbGF0ZVByaW1lIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAotICAgcm9vbSBpbiB0aGUgaW50ZXJuYWwgYnVmZmVyIHRvIGluc2VydCB0aGUgYml0cywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlCi0gICBzb3VyY2Ugc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVTZXRIZWFkZXIgT0YoKHpfc3RyZWFtcCBzdHJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnel9oZWFkZXJwIGhlYWQpKTsKLS8qCi0gICAgIGRlZmxhdGVTZXRIZWFkZXIoKSBwcm92aWRlcyBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBmb3Igd2hlbiBhIGd6aXAKLSAgIHN0cmVhbSBpcyByZXF1ZXN0ZWQgYnkgZGVmbGF0ZUluaXQyKCkuICBkZWZsYXRlU2V0SGVhZGVyKCkgbWF5IGJlIGNhbGxlZAotICAgYWZ0ZXIgZGVmbGF0ZUluaXQyKCkgb3IgZGVmbGF0ZVJlc2V0KCkgYW5kIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCBvZgotICAgZGVmbGF0ZSgpLiAgVGhlIHRleHQsIHRpbWUsIG9zLCBleHRyYSBmaWVsZCwgbmFtZSwgYW5kIGNvbW1lbnQgaW5mb3JtYXRpb24KLSAgIGluIHRoZSBwcm92aWRlZCBnel9oZWFkZXIgc3RydWN0dXJlIGFyZSB3cml0dGVuIHRvIHRoZSBnemlwIGhlYWRlciAoeGZsYWcgaXMKLSAgIGlnbm9yZWQgLS0gdGhlIGV4dHJhIGZsYWdzIGFyZSBzZXQgYWNjb3JkaW5nIHRvIHRoZSBjb21wcmVzc2lvbiBsZXZlbCkuICBUaGUKLSAgIGNhbGxlciBtdXN0IGFzc3VyZSB0aGF0LCBpZiBub3QgWl9OVUxMLCBuYW1lIGFuZCBjb21tZW50IGFyZSB0ZXJtaW5hdGVkIHdpdGgKLSAgIGEgemVybyBieXRlLCBhbmQgdGhhdCBpZiBleHRyYSBpcyBub3QgWl9OVUxMLCB0aGF0IGV4dHJhX2xlbiBieXRlcyBhcmUKLSAgIGF2YWlsYWJsZSB0aGVyZS4gIElmIGhjcmMgaXMgdHJ1ZSwgYSBnemlwIGhlYWRlciBjcmMgaXMgaW5jbHVkZWQuICBOb3RlIHRoYXQKLSAgIHRoZSBjdXJyZW50IHZlcnNpb25zIG9mIHRoZSBjb21tYW5kLWxpbmUgdmVyc2lvbiBvZiBnemlwICh1cCB0aHJvdWdoIHZlcnNpb24KLSAgIDEuMy54KSBkbyBub3Qgc3VwcG9ydCBoZWFkZXIgY3JjJ3MsIGFuZCB3aWxsIHJlcG9ydCB0aGF0IGl0IGlzIGEgIm11bHRpLXBhcnQKLSAgIGd6aXAgZmlsZSIgYW5kIGdpdmUgdXAuCi0KLSAgICAgSWYgZGVmbGF0ZVNldEhlYWRlciBpcyBub3QgdXNlZCwgdGhlIGRlZmF1bHQgZ3ppcCBoZWFkZXIgaGFzIHRleHQgZmFsc2UsCi0gICB0aGUgdGltZSBzZXQgdG8gemVybywgYW5kIG9zIHNldCB0byAyNTUsIHdpdGggbm8gZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQKLSAgIGZpZWxkcy4gIFRoZSBnemlwIGhlYWRlciBpcyByZXR1cm5lZCB0byB0aGUgZGVmYXVsdCBzdGF0ZSBieSBkZWZsYXRlUmVzZXQoKS4KLQotICAgICBkZWZsYXRlU2V0SGVhZGVyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCi0gICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KLSovCi0KLS8qCi1aRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVJbml0MiBPRigoel9zdHJlYW1wIHN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICB3aW5kb3dCaXRzKSk7Ci0KLSAgICAgVGhpcyBpcyBhbm90aGVyIHZlcnNpb24gb2YgaW5mbGF0ZUluaXQgd2l0aCBhbiBleHRyYSBwYXJhbWV0ZXIuICBUaGUKLSAgIGZpZWxkcyBuZXh0X2luLCBhdmFpbF9pbiwgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQKLSAgIGJlZm9yZSBieSB0aGUgY2FsbGVyLgotCi0gICAgIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyB0aGUgYmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSBtYXhpbXVtIHdpbmRvdwotICAgc2l6ZSAodGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgYnVmZmVyKS4gIEl0IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgOC4uMTUgZm9yCi0gICB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBpZiBpbmZsYXRlSW5pdCBpcyB1c2VkCi0gICBpbnN0ZWFkLiAgd2luZG93Qml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgd2luZG93Qml0cyB2YWx1ZQotICAgcHJvdmlkZWQgdG8gZGVmbGF0ZUluaXQyKCkgd2hpbGUgY29tcHJlc3NpbmcsIG9yIGl0IG11c3QgYmUgZXF1YWwgdG8gMTUgaWYKLSAgIGRlZmxhdGVJbml0MigpIHdhcyBub3QgdXNlZC4gIElmIGEgY29tcHJlc3NlZCBzdHJlYW0gd2l0aCBhIGxhcmdlciB3aW5kb3cKLSAgIHNpemUgaXMgZ2l2ZW4gYXMgaW5wdXQsIGluZmxhdGUoKSB3aWxsIHJldHVybiB3aXRoIHRoZSBlcnJvciBjb2RlCi0gICBaX0RBVEFfRVJST1IgaW5zdGVhZCBvZiB0cnlpbmcgdG8gYWxsb2NhdGUgYSBsYXJnZXIgd2luZG93LgotCi0gICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgemVybyB0byByZXF1ZXN0IHRoYXQgaW5mbGF0ZSB1c2UgdGhlIHdpbmRvdyBzaXplIGluCi0gICB0aGUgemxpYiBoZWFkZXIgb2YgdGhlIGNvbXByZXNzZWQgc3RyZWFtLgotCi0gICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgLTguLi0xNSBmb3IgcmF3IGluZmxhdGUuICBJbiB0aGlzIGNhc2UsIC13aW5kb3dCaXRzCi0gICBkZXRlcm1pbmVzIHRoZSB3aW5kb3cgc2l6ZS4gIGluZmxhdGUoKSB3aWxsIHRoZW4gcHJvY2VzcyByYXcgZGVmbGF0ZSBkYXRhLAotICAgbm90IGxvb2tpbmcgZm9yIGEgemxpYiBvciBnemlwIGhlYWRlciwgbm90IGdlbmVyYXRpbmcgYSBjaGVjayB2YWx1ZSwgYW5kIG5vdAotICAgbG9va2luZyBmb3IgYW55IGNoZWNrIHZhbHVlcyBmb3IgY29tcGFyaXNvbiBhdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uICBUaGlzCi0gICBpcyBmb3IgdXNlIHdpdGggb3RoZXIgZm9ybWF0cyB0aGF0IHVzZSB0aGUgZGVmbGF0ZSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0Ci0gICBzdWNoIGFzIHppcC4gIFRob3NlIGZvcm1hdHMgcHJvdmlkZSB0aGVpciBvd24gY2hlY2sgdmFsdWVzLiAgSWYgYSBjdXN0b20KLSAgIGZvcm1hdCBpcyBkZXZlbG9wZWQgdXNpbmcgdGhlIHJhdyBkZWZsYXRlIGZvcm1hdCBmb3IgY29tcHJlc3NlZCBkYXRhLCBpdCBpcwotICAgcmVjb21tZW5kZWQgdGhhdCBhIGNoZWNrIHZhbHVlIHN1Y2ggYXMgYW4gYWRsZXIzMiBvciBhIGNyYzMyIGJlIGFwcGxpZWQgdG8KLSAgIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBhcyBpcyBkb25lIGluIHRoZSB6bGliLCBnemlwLCBhbmQgemlwIGZvcm1hdHMuICBGb3IKLSAgIG1vc3QgYXBwbGljYXRpb25zLCB0aGUgemxpYiBmb3JtYXQgc2hvdWxkIGJlIHVzZWQgYXMgaXMuICBOb3RlIHRoYXQgY29tbWVudHMKLSAgIGFib3ZlIG9uIHRoZSB1c2UgaW4gZGVmbGF0ZUluaXQyKCkgYXBwbGllcyB0byB0aGUgbWFnbml0dWRlIG9mIHdpbmRvd0JpdHMuCi0KLSAgICAgd2luZG93Qml0cyBjYW4gYWxzbyBiZSBncmVhdGVyIHRoYW4gMTUgZm9yIG9wdGlvbmFsIGd6aXAgZGVjb2RpbmcuICBBZGQKLSAgIDMyIHRvIHdpbmRvd0JpdHMgdG8gZW5hYmxlIHpsaWIgYW5kIGd6aXAgZGVjb2Rpbmcgd2l0aCBhdXRvbWF0aWMgaGVhZGVyCi0gICBkZXRlY3Rpb24sIG9yIGFkZCAxNiB0byBkZWNvZGUgb25seSB0aGUgZ3ppcCBmb3JtYXQgKHRoZSB6bGliIGZvcm1hdCB3aWxsCi0gICByZXR1cm4gYSBaX0RBVEFfRVJST1IpLiAgSWYgYSBnemlwIHN0cmVhbSBpcyBiZWluZyBkZWNvZGVkLCBzdHJtLT5hZGxlciBpcyBhCi0gICBjcmMzMiBpbnN0ZWFkIG9mIGFuIGFkbGVyMzIuCi0KLSAgICAgaW5mbGF0ZUluaXQyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAotICAgbWVtb3J5LCBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHpsaWIgbGlicmFyeSB2ZXJzaW9uIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZQotICAgdmVyc2lvbiBhc3N1bWVkIGJ5IHRoZSBjYWxsZXIsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBwYXJhbWV0ZXJzIGFyZQotICAgaW52YWxpZCwgc3VjaCBhcyBhIG51bGwgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlLiAgbXNnIGlzIHNldCB0byBudWxsIGlmCi0gICB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgaW5mbGF0ZUluaXQyIGRvZXMgbm90IHBlcmZvcm0gYW55IGRlY29tcHJlc3Npb24KLSAgIGFwYXJ0IGZyb20gcG9zc2libHkgcmVhZGluZyB0aGUgemxpYiBoZWFkZXIgaWYgcHJlc2VudDogYWN0dWFsIGRlY29tcHJlc3Npb24KLSAgIHdpbGwgYmUgZG9uZSBieSBpbmZsYXRlKCkuICAoU28gbmV4dF9pbiBhbmQgYXZhaWxfaW4gbWF5IGJlIG1vZGlmaWVkLCBidXQKLSAgIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgYXJlIHVudXNlZCBhbmQgdW5jaGFuZ2VkLikgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24KLSAgIG9mIGluZmxhdGVJbml0MigpIGRvZXMgbm90IHByb2Nlc3MgYW55IGhlYWRlciBpbmZvcm1hdGlvbiAtLSB0aGF0IGlzCi0gICBkZWZlcnJlZCB1bnRpbCBpbmZsYXRlKCkgaXMgY2FsbGVkLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlU2V0RGljdGlvbmFyeSBPRigoel9zdHJlYW1wIHN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqZGljdGlvbmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgIGRpY3RMZW5ndGgpKTsKLS8qCi0gICAgIEluaXRpYWxpemVzIHRoZSBkZWNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gdW5jb21wcmVzc2VkIGJ5dGUKLSAgIHNlcXVlbmNlLiAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBhIGNhbGwgb2YgaW5mbGF0ZSwKLSAgIGlmIHRoYXQgY2FsbCByZXR1cm5lZCBaX05FRURfRElDVC4gIFRoZSBkaWN0aW9uYXJ5IGNob3NlbiBieSB0aGUgY29tcHJlc3NvcgotICAgY2FuIGJlIGRldGVybWluZWQgZnJvbSB0aGUgYWRsZXIzMiB2YWx1ZSByZXR1cm5lZCBieSB0aGF0IGNhbGwgb2YgaW5mbGF0ZS4KLSAgIFRoZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgbXVzdCB1c2UgZXhhY3RseSB0aGUgc2FtZSBkaWN0aW9uYXJ5IChzZWUKLSAgIGRlZmxhdGVTZXREaWN0aW9uYXJ5KS4gIEZvciByYXcgaW5mbGF0ZSwgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGF0IGFueQotICAgdGltZSB0byBzZXQgdGhlIGRpY3Rpb25hcnkuICBJZiB0aGUgcHJvdmlkZWQgZGljdGlvbmFyeSBpcyBzbWFsbGVyIHRoYW4gdGhlCi0gICB3aW5kb3cgYW5kIHRoZXJlIGlzIGFscmVhZHkgZGF0YSBpbiB0aGUgd2luZG93LCB0aGVuIHRoZSBwcm92aWRlZCBkaWN0aW9uYXJ5Ci0gICB3aWxsIGFtZW5kIHdoYXQncyB0aGVyZS4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGluc3VyZSB0aGF0IHRoZSBkaWN0aW9uYXJ5Ci0gICB0aGF0IHdhcyB1c2VkIGZvciBjb21wcmVzc2lvbiBpcyBwcm92aWRlZC4KLQotICAgICBpbmZsYXRlU2V0RGljdGlvbmFyeSByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgYQotICAgcGFyYW1ldGVyIGlzIGludmFsaWQgKGUuZy4gIGRpY3Rpb25hcnkgYmVpbmcgWl9OVUxMKSBvciB0aGUgc3RyZWFtIHN0YXRlIGlzCi0gICBpbmNvbnNpc3RlbnQsIFpfREFUQV9FUlJPUiBpZiB0aGUgZ2l2ZW4gZGljdGlvbmFyeSBkb2Vzbid0IG1hdGNoIHRoZQotICAgZXhwZWN0ZWQgb25lIChpbmNvcnJlY3QgYWRsZXIzMiB2YWx1ZSkuICBpbmZsYXRlU2V0RGljdGlvbmFyeSBkb2VzIG5vdAotICAgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgc3Vic2VxdWVudCBjYWxscyBvZgotICAgaW5mbGF0ZSgpLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlR2V0RGljdGlvbmFyeSBPRigoel9zdHJlYW1wIHN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlZiAqZGljdGlvbmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgICpkaWN0TGVuZ3RoKSk7Ci0vKgotICAgICBSZXR1cm5zIHRoZSBzbGlkaW5nIGRpY3Rpb25hcnkgYmVpbmcgbWFpbnRhaW5lZCBieSBpbmZsYXRlLiAgZGljdExlbmd0aCBpcwotICAgc2V0IHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGRpY3Rpb25hcnksIGFuZCB0aGF0IG1hbnkgYnl0ZXMgYXJlIGNvcGllZAotICAgdG8gZGljdGlvbmFyeS4gIGRpY3Rpb25hcnkgbXVzdCBoYXZlIGVub3VnaCBzcGFjZSwgd2hlcmUgMzI3NjggYnl0ZXMgaXMKLSAgIGFsd2F5cyBlbm91Z2guICBJZiBpbmZsYXRlR2V0RGljdGlvbmFyeSgpIGlzIGNhbGxlZCB3aXRoIGRpY3Rpb25hcnkgZXF1YWwgdG8KLSAgIFpfTlVMTCwgdGhlbiBvbmx5IHRoZSBkaWN0aW9uYXJ5IGxlbmd0aCBpcyByZXR1cm5lZCwgYW5kIG5vdGhpbmcgaXMgY29waWVkLgotICAgU2ltaWxhcnksIGlmIGRpY3RMZW5ndGggaXMgWl9OVUxMLCB0aGVuIGl0IGlzIG5vdCBzZXQuCi0KLSAgICAgaW5mbGF0ZUdldERpY3Rpb25hcnkgcmV0dXJucyBaX09LIG9uIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZQotICAgc3RyZWFtIHN0YXRlIGlzIGluY29uc2lzdGVudC4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZVN5bmMgT0YoKHpfc3RyZWFtcCBzdHJtKSk7Ci0vKgotICAgICBTa2lwcyBpbnZhbGlkIGNvbXByZXNzZWQgZGF0YSB1bnRpbCBhIHBvc3NpYmxlIGZ1bGwgZmx1c2ggcG9pbnQgKHNlZSBhYm92ZQotICAgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiBkZWZsYXRlIHdpdGggWl9GVUxMX0ZMVVNIKSBjYW4gYmUgZm91bmQsIG9yIHVudGlsIGFsbAotICAgYXZhaWxhYmxlIGlucHV0IGlzIHNraXBwZWQuICBObyBvdXRwdXQgaXMgcHJvdmlkZWQuCi0KLSAgICAgaW5mbGF0ZVN5bmMgc2VhcmNoZXMgZm9yIGEgMDAgMDAgRkYgRkYgcGF0dGVybiBpbiB0aGUgY29tcHJlc3NlZCBkYXRhLgotICAgQWxsIGZ1bGwgZmx1c2ggcG9pbnRzIGhhdmUgdGhpcyBwYXR0ZXJuLCBidXQgbm90IGFsbCBvY2N1cnJlbmNlcyBvZiB0aGlzCi0gICBwYXR0ZXJuIGFyZSBmdWxsIGZsdXNoIHBvaW50cy4KLQotICAgICBpbmZsYXRlU3luYyByZXR1cm5zIFpfT0sgaWYgYSBwb3NzaWJsZSBmdWxsIGZsdXNoIHBvaW50IGhhcyBiZWVuIGZvdW5kLAotICAgWl9CVUZfRVJST1IgaWYgbm8gbW9yZSBpbnB1dCB3YXMgcHJvdmlkZWQsIFpfREFUQV9FUlJPUiBpZiBubyBmbHVzaCBwb2ludAotICAgaGFzIGJlZW4gZm91bmQsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQuCi0gICBJbiB0aGUgc3VjY2VzcyBjYXNlLCB0aGUgYXBwbGljYXRpb24gbWF5IHNhdmUgdGhlIGN1cnJlbnQgY3VycmVudCB2YWx1ZSBvZgotICAgdG90YWxfaW4gd2hpY2ggaW5kaWNhdGVzIHdoZXJlIHZhbGlkIGNvbXByZXNzZWQgZGF0YSB3YXMgZm91bmQuICBJbiB0aGUKLSAgIGVycm9yIGNhc2UsIHRoZSBhcHBsaWNhdGlvbiBtYXkgcmVwZWF0ZWRseSBjYWxsIGluZmxhdGVTeW5jLCBwcm92aWRpbmcgbW9yZQotICAgaW5wdXQgZWFjaCB0aW1lLCB1bnRpbCBzdWNjZXNzIG9yIGVuZCBvZiB0aGUgaW5wdXQgZGF0YS4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUNvcHkgT0YoKHpfc3RyZWFtcCBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgel9zdHJlYW1wIHNvdXJjZSkpOwotLyoKLSAgICAgU2V0cyB0aGUgZGVzdGluYXRpb24gc3RyZWFtIGFzIGEgY29tcGxldGUgY29weSBvZiB0aGUgc291cmNlIHN0cmVhbS4KLQotICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiByYW5kb21seSBhY2Nlc3NpbmcgYSBsYXJnZSBzdHJlYW0uICBUaGUKLSAgIGZpcnN0IHBhc3MgdGhyb3VnaCB0aGUgc3RyZWFtIGNhbiBwZXJpb2RpY2FsbHkgcmVjb3JkIHRoZSBpbmZsYXRlIHN0YXRlLAotICAgYWxsb3dpbmcgcmVzdGFydGluZyBpbmZsYXRlIGF0IHRob3NlIHBvaW50cyB3aGVuIHJhbmRvbWx5IGFjY2Vzc2luZyB0aGUKLSAgIHN0cmVhbS4KLQotICAgICBpbmZsYXRlQ29weSByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAotICAgZW5vdWdoIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudAotICAgKHN1Y2ggYXMgemFsbG9jIGJlaW5nIFpfTlVMTCkuICBtc2cgaXMgbGVmdCB1bmNoYW5nZWQgaW4gYm90aCBzb3VyY2UgYW5kCi0gICBkZXN0aW5hdGlvbi4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZVJlc2V0IE9GKCh6X3N0cmVhbXAgc3RybSkpOwotLyoKLSAgICAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGluZmxhdGVFbmQgZm9sbG93ZWQgYnkgaW5mbGF0ZUluaXQsCi0gICBidXQgZG9lcyBub3QgZnJlZSBhbmQgcmVhbGxvY2F0ZSBhbGwgdGhlIGludGVybmFsIGRlY29tcHJlc3Npb24gc3RhdGUuICBUaGUKLSAgIHN0cmVhbSB3aWxsIGtlZXAgYXR0cmlidXRlcyB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IGJ5IGluZmxhdGVJbml0Mi4KLQotICAgICBpbmZsYXRlUmVzZXQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKLSAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IChzdWNoIGFzIHphbGxvYyBvciBzdGF0ZSBiZWluZyBaX05VTEwpLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlUmVzZXQyIE9GKCh6X3N0cmVhbXAgc3RybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbmRvd0JpdHMpKTsKLS8qCi0gICAgIFRoaXMgZnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMgaW5mbGF0ZVJlc2V0LCBidXQgaXQgYWxzbyBwZXJtaXRzIGNoYW5naW5nCi0gICB0aGUgd3JhcCBhbmQgd2luZG93IHNpemUgcmVxdWVzdHMuICBUaGUgd2luZG93Qml0cyBwYXJhbWV0ZXIgaXMgaW50ZXJwcmV0ZWQKLSAgIHRoZSBzYW1lIGFzIGl0IGlzIGZvciBpbmZsYXRlSW5pdDIuCi0KLSAgICAgaW5mbGF0ZVJlc2V0MiByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQotICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgKHN1Y2ggYXMgemFsbG9jIG9yIHN0YXRlIGJlaW5nIFpfTlVMTCksIG9yIGlmCi0gICB0aGUgd2luZG93Qml0cyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZVByaW1lIE9GKCh6X3N0cmVhbXAgc3RybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpKTsKLS8qCi0gICAgIFRoaXMgZnVuY3Rpb24gaW5zZXJ0cyBiaXRzIGluIHRoZSBpbmZsYXRlIGlucHV0IHN0cmVhbS4gIFRoZSBpbnRlbnQgaXMKLSAgIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IGluZmxhdGluZyBhdCBhIGJpdCBwb3NpdGlvbiBpbiB0aGUKLSAgIG1pZGRsZSBvZiBhIGJ5dGUuICBUaGUgcHJvdmlkZWQgYml0cyB3aWxsIGJlIHVzZWQgYmVmb3JlIGFueSBieXRlcyBhcmUgdXNlZAotICAgZnJvbSBuZXh0X2luLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIHdpdGggcmF3IGluZmxhdGUsIGFuZAotICAgc2hvdWxkIGJlIHVzZWQgYmVmb3JlIHRoZSBmaXJzdCBpbmZsYXRlKCkgY2FsbCBhZnRlciBpbmZsYXRlSW5pdDIoKSBvcgotICAgaW5mbGF0ZVJlc2V0KCkuICBiaXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDE2LCBhbmQgdGhhdCBtYW55IG9mIHRoZQotICAgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB2YWx1ZSB3aWxsIGJlIGluc2VydGVkIGluIHRoZSBpbnB1dC4KLQotICAgICBJZiBiaXRzIGlzIG5lZ2F0aXZlLCB0aGVuIHRoZSBpbnB1dCBzdHJlYW0gYml0IGJ1ZmZlciBpcyBlbXB0aWVkLiAgVGhlbgotICAgaW5mbGF0ZVByaW1lKCkgY2FuIGJlIGNhbGxlZCBhZ2FpbiB0byBwdXQgYml0cyBpbiB0aGUgYnVmZmVyLiAgVGhpcyBpcyB1c2VkCi0gICB0byBjbGVhciBvdXQgYml0cyBsZWZ0b3ZlciBhZnRlciBmZWVkaW5nIGluZmxhdGUgYSBibG9jayBkZXNjcmlwdGlvbiBwcmlvcgotICAgdG8gZmVlZGluZyBpbmZsYXRlIGNvZGVzLgotCi0gICAgIGluZmxhdGVQcmltZSByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQotICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCi0qLwotCi1aRVhURVJOIGxvbmcgWkVYUE9SVCBpbmZsYXRlTWFyayBPRigoel9zdHJlYW1wIHN0cm0pKTsKLS8qCi0gICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0d28gdmFsdWVzLCBvbmUgaW4gdGhlIGxvd2VyIDE2IGJpdHMgb2YgdGhlIHJldHVybgotICAgdmFsdWUsIGFuZCB0aGUgb3RoZXIgaW4gdGhlIHJlbWFpbmluZyB1cHBlciBiaXRzLCBvYnRhaW5lZCBieSBzaGlmdGluZyB0aGUKLSAgIHJldHVybiB2YWx1ZSBkb3duIDE2IGJpdHMuICBJZiB0aGUgdXBwZXIgdmFsdWUgaXMgLTEgYW5kIHRoZSBsb3dlciB2YWx1ZSBpcwotICAgemVybywgdGhlbiBpbmZsYXRlKCkgaXMgY3VycmVudGx5IGRlY29kaW5nIGluZm9ybWF0aW9uIG91dHNpZGUgb2YgYSBibG9jay4KLSAgIElmIHRoZSB1cHBlciB2YWx1ZSBpcyAtMSBhbmQgdGhlIGxvd2VyIHZhbHVlIGlzIG5vbi16ZXJvLCB0aGVuIGluZmxhdGUgaXMgaW4KLSAgIHRoZSBtaWRkbGUgb2YgYSBzdG9yZWQgYmxvY2ssIHdpdGggdGhlIGxvd2VyIHZhbHVlIGVxdWFsaW5nIHRoZSBudW1iZXIgb2YKLSAgIGJ5dGVzIGZyb20gdGhlIGlucHV0IHJlbWFpbmluZyB0byBjb3B5LiAgSWYgdGhlIHVwcGVyIHZhbHVlIGlzIG5vdCAtMSwgdGhlbgotICAgaXQgaXMgdGhlIG51bWJlciBvZiBiaXRzIGJhY2sgZnJvbSB0aGUgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGlucHV0IG9mCi0gICB0aGUgY29kZSAobGl0ZXJhbCBvciBsZW5ndGgvZGlzdGFuY2UgcGFpcikgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4gIEluCi0gICB0aGF0IGNhc2UgdGhlIGxvd2VyIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWxyZWFkeSBlbWl0dGVkIGZvciB0aGF0Ci0gICBjb2RlLgotCi0gICAgIEEgY29kZSBpcyBiZWluZyBwcm9jZXNzZWQgaWYgaW5mbGF0ZSBpcyB3YWl0aW5nIGZvciBtb3JlIGlucHV0IHRvIGNvbXBsZXRlCi0gICBkZWNvZGluZyBvZiB0aGUgY29kZSwgb3IgaWYgaXQgaGFzIGNvbXBsZXRlZCBkZWNvZGluZyBidXQgaXMgd2FpdGluZyBmb3IKLSAgIG1vcmUgb3V0cHV0IHNwYWNlIHRvIHdyaXRlIHRoZSBsaXRlcmFsIG9yIG1hdGNoIGRhdGEuCi0KLSAgICAgaW5mbGF0ZU1hcmsoKSBpcyB1c2VkIHRvIG1hcmsgbG9jYXRpb25zIGluIHRoZSBpbnB1dCBkYXRhIGZvciByYW5kb20KLSAgIGFjY2Vzcywgd2hpY2ggbWF5IGJlIGF0IGJpdCBwb3NpdGlvbnMsIGFuZCB0byBub3RlIHRob3NlIGNhc2VzIHdoZXJlIHRoZQotICAgb3V0cHV0IG9mIGEgY29kZSBtYXkgc3BhbiBib3VuZGFyaWVzIG9mIHJhbmRvbSBhY2Nlc3MgYmxvY2tzLiAgVGhlIGN1cnJlbnQKLSAgIGxvY2F0aW9uIGluIHRoZSBpbnB1dCBzdHJlYW0gY2FuIGJlIGRldGVybWluZWQgZnJvbSBhdmFpbF9pbiBhbmQgZGF0YV90eXBlCi0gICBhcyBub3RlZCBpbiB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBaX0JMT0NLIGZsdXNoIHBhcmFtZXRlciBmb3IgaW5mbGF0ZS4KLQotICAgICBpbmZsYXRlTWFyayByZXR1cm5zIHRoZSB2YWx1ZSBub3RlZCBhYm92ZSBvciAtMSA8PCAxNiBpZiB0aGUgcHJvdmlkZWQKLSAgIHNvdXJjZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUdldEhlYWRlciBPRigoel9zdHJlYW1wIHN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd6X2hlYWRlcnAgaGVhZCkpOwotLyoKLSAgICAgaW5mbGF0ZUdldEhlYWRlcigpIHJlcXVlc3RzIHRoYXQgZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gYmUgc3RvcmVkIGluIHRoZQotICAgcHJvdmlkZWQgZ3pfaGVhZGVyIHN0cnVjdHVyZS4gIGluZmxhdGVHZXRIZWFkZXIoKSBtYXkgYmUgY2FsbGVkIGFmdGVyCi0gICBpbmZsYXRlSW5pdDIoKSBvciBpbmZsYXRlUmVzZXQoKSwgYW5kIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCBvZiBpbmZsYXRlKCkuCi0gICBBcyBpbmZsYXRlKCkgcHJvY2Vzc2VzIHRoZSBnemlwIHN0cmVhbSwgaGVhZC0+ZG9uZSBpcyB6ZXJvIHVudGlsIHRoZSBoZWFkZXIKLSAgIGlzIGNvbXBsZXRlZCwgYXQgd2hpY2ggdGltZSBoZWFkLT5kb25lIGlzIHNldCB0byBvbmUuICBJZiBhIHpsaWIgc3RyZWFtIGlzCi0gICBiZWluZyBkZWNvZGVkLCB0aGVuIGhlYWQtPmRvbmUgaXMgc2V0IHRvIC0xIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgd2lsbCBiZQotICAgbm8gZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gZm9ydGhjb21pbmcuICBOb3RlIHRoYXQgWl9CTE9DSyBvciBaX1RSRUVTIGNhbiBiZQotICAgdXNlZCB0byBmb3JjZSBpbmZsYXRlKCkgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IGFmdGVyIGhlYWRlciBwcm9jZXNzaW5nIGlzCi0gICBjb21wbGV0ZSBhbmQgYmVmb3JlIGFueSBhY3R1YWwgZGF0YSBpcyBkZWNvbXByZXNzZWQuCi0KLSAgICAgVGhlIHRleHQsIHRpbWUsIHhmbGFncywgYW5kIG9zIGZpZWxkcyBhcmUgZmlsbGVkIGluIHdpdGggdGhlIGd6aXAgaGVhZGVyCi0gICBjb250ZW50cy4gIGhjcmMgaXMgc2V0IHRvIHRydWUgaWYgdGhlcmUgaXMgYSBoZWFkZXIgQ1JDLiAgKFRoZSBoZWFkZXIgQ1JDCi0gICB3YXMgdmFsaWQgaWYgZG9uZSBpcyBzZXQgdG8gb25lLikgSWYgZXh0cmEgaXMgbm90IFpfTlVMTCwgdGhlbiBleHRyYV9tYXgKLSAgIGNvbnRhaW5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSB0byBleHRyYS4gIE9uY2UgZG9uZSBpcyB0cnVlLAotICAgZXh0cmFfbGVuIGNvbnRhaW5zIHRoZSBhY3R1YWwgZXh0cmEgZmllbGQgbGVuZ3RoLCBhbmQgZXh0cmEgY29udGFpbnMgdGhlCi0gICBleHRyYSBmaWVsZCwgb3IgdGhhdCBmaWVsZCB0cnVuY2F0ZWQgaWYgZXh0cmFfbWF4IGlzIGxlc3MgdGhhbiBleHRyYV9sZW4uCi0gICBJZiBuYW1lIGlzIG5vdCBaX05VTEwsIHRoZW4gdXAgdG8gbmFtZV9tYXggY2hhcmFjdGVycyBhcmUgd3JpdHRlbiB0aGVyZSwKLSAgIHRlcm1pbmF0ZWQgd2l0aCBhIHplcm8gdW5sZXNzIHRoZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIG5hbWVfbWF4LiAgSWYKLSAgIGNvbW1lbnQgaXMgbm90IFpfTlVMTCwgdGhlbiB1cCB0byBjb21tX21heCBjaGFyYWN0ZXJzIGFyZSB3cml0dGVuIHRoZXJlLAotICAgdGVybWluYXRlZCB3aXRoIGEgemVybyB1bmxlc3MgdGhlIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gY29tbV9tYXguICBXaGVuIGFueQotICAgb2YgZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQgYXJlIG5vdCBaX05VTEwgYW5kIHRoZSByZXNwZWN0aXZlIGZpZWxkIGlzIG5vdAotICAgcHJlc2VudCBpbiB0aGUgaGVhZGVyLCB0aGVuIHRoYXQgZmllbGQgaXMgc2V0IHRvIFpfTlVMTCB0byBzaWduYWwgaXRzCi0gICBhYnNlbmNlLiAgVGhpcyBhbGxvd3MgdGhlIHVzZSBvZiBkZWZsYXRlU2V0SGVhZGVyKCkgd2l0aCB0aGUgcmV0dXJuZWQKLSAgIHN0cnVjdHVyZSB0byBkdXBsaWNhdGUgdGhlIGhlYWRlci4gIEhvd2V2ZXIgaWYgdGhvc2UgZmllbGRzIGFyZSBzZXQgdG8KLSAgIGFsbG9jYXRlZCBtZW1vcnksIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHdpbGwgbmVlZCB0byBzYXZlIHRob3NlIHBvaW50ZXJzCi0gICBlbHNld2hlcmUgc28gdGhhdCB0aGV5IGNhbiBiZSBldmVudHVhbGx5IGZyZWVkLgotCi0gICAgIElmIGluZmxhdGVHZXRIZWFkZXIgaXMgbm90IHVzZWQsIHRoZW4gdGhlIGhlYWRlciBpbmZvcm1hdGlvbiBpcyBzaW1wbHkKLSAgIGRpc2NhcmRlZC4gIFRoZSBoZWFkZXIgaXMgYWx3YXlzIGNoZWNrZWQgZm9yIHZhbGlkaXR5LCBpbmNsdWRpbmcgdGhlIGhlYWRlcgotICAgQ1JDIGlmIHByZXNlbnQuICBpbmZsYXRlUmVzZXQoKSB3aWxsIHJlc2V0IHRoZSBwcm9jZXNzIHRvIGRpc2NhcmQgdGhlIGhlYWRlcgotICAgaW5mb3JtYXRpb24uICBUaGUgYXBwbGljYXRpb24gd291bGQgbmVlZCB0byBjYWxsIGluZmxhdGVHZXRIZWFkZXIoKSBhZ2FpbiB0bwotICAgcmV0cmlldmUgdGhlIGhlYWRlciBmcm9tIHRoZSBuZXh0IGd6aXAgc3RyZWFtLgotCi0gICAgIGluZmxhdGVHZXRIZWFkZXIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKLSAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50LgotKi8KLQotLyoKLVpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2tJbml0IE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IHdpbmRvd0JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBGQVIgKndpbmRvdykpOwotCi0gICAgIEluaXRpYWxpemUgdGhlIGludGVybmFsIHN0cmVhbSBzdGF0ZSBmb3IgZGVjb21wcmVzc2lvbiB1c2luZyBpbmZsYXRlQmFjaygpCi0gICBjYWxscy4gIFRoZSBmaWVsZHMgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIGluIHN0cm0gbXVzdCBiZSBpbml0aWFsaXplZAotICAgYmVmb3JlIHRoZSBjYWxsLiAgSWYgemFsbG9jIGFuZCB6ZnJlZSBhcmUgWl9OVUxMLCB0aGVuIHRoZSBkZWZhdWx0IGxpYnJhcnktCi0gICBkZXJpdmVkIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIGFyZSB1c2VkLiAgd2luZG93Qml0cyBpcyB0aGUgYmFzZSB0d28KLSAgIGxvZ2FyaXRobSBvZiB0aGUgd2luZG93IHNpemUsIGluIHRoZSByYW5nZSA4Li4xNS4gIHdpbmRvdyBpcyBhIGNhbGxlcgotICAgc3VwcGxpZWQgYnVmZmVyIG9mIHRoYXQgc2l6ZS4gIEV4Y2VwdCBmb3Igc3BlY2lhbCBhcHBsaWNhdGlvbnMgd2hlcmUgaXQgaXMKLSAgIGFzc3VyZWQgdGhhdCBkZWZsYXRlIHdhcyB1c2VkIHdpdGggc21hbGwgd2luZG93IHNpemVzLCB3aW5kb3dCaXRzIG11c3QgYmUgMTUKLSAgIGFuZCBhIDMySyBieXRlIHdpbmRvdyBtdXN0IGJlIHN1cHBsaWVkIHRvIGJlIGFibGUgdG8gZGVjb21wcmVzcyBnZW5lcmFsCi0gICBkZWZsYXRlIHN0cmVhbXMuCi0KLSAgICAgU2VlIGluZmxhdGVCYWNrKCkgZm9yIHRoZSB1c2FnZSBvZiB0aGVzZSByb3V0aW5lcy4KLQotICAgICBpbmZsYXRlQmFja0luaXQgd2lsbCByZXR1cm4gWl9PSyBvbiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiBhbnkgb2YKLSAgIHRoZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLCBaX01FTV9FUlJPUiBpZiB0aGUgaW50ZXJuYWwgc3RhdGUgY291bGQgbm90IGJlCi0gICBhbGxvY2F0ZWQsIG9yIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBkb2VzIG5vdCBtYXRjaAotICAgdGhlIHZlcnNpb24gb2YgdGhlIGhlYWRlciBmaWxlLgotKi8KLQotdHlwZWRlZiB1bnNpZ25lZCAoKmluX2Z1bmMpIE9GKCh2b2lkIEZBUiAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6X2NvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICogRkFSICopKTsKLXR5cGVkZWYgaW50ICgqb3V0X2Z1bmMpIE9GKCh2b2lkIEZBUiAqLCB1bnNpZ25lZCBjaGFyIEZBUiAqLCB1bnNpZ25lZCkpOwotCi1aRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVCYWNrIE9GKCh6X3N0cmVhbXAgc3RybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2Z1bmMgaW4sIHZvaWQgRkFSICppbl9kZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2Z1bmMgb3V0LCB2b2lkIEZBUiAqb3V0X2Rlc2MpKTsKLS8qCi0gICAgIGluZmxhdGVCYWNrKCkgZG9lcyBhIHJhdyBpbmZsYXRlIHdpdGggYSBzaW5nbGUgY2FsbCB1c2luZyBhIGNhbGwtYmFjawotICAgaW50ZXJmYWNlIGZvciBpbnB1dCBhbmQgb3V0cHV0LiAgVGhpcyBpcyBwb3RlbnRpYWxseSBtb3JlIGVmZmljaWVudCB0aGFuCi0gICBpbmZsYXRlKCkgZm9yIGZpbGUgaS9vIGFwcGxpY2F0aW9ucywgaW4gdGhhdCBpdCBhdm9pZHMgY29weWluZyBiZXR3ZWVuIHRoZQotICAgb3V0cHV0IGFuZCB0aGUgc2xpZGluZyB3aW5kb3cgYnkgc2ltcGx5IG1ha2luZyB0aGUgd2luZG93IGl0c2VsZiB0aGUgb3V0cHV0Ci0gICBidWZmZXIuICBpbmZsYXRlKCkgY2FuIGJlIGZhc3RlciBvbiBtb2Rlcm4gQ1BVcyB3aGVuIHVzZWQgd2l0aCBsYXJnZQotICAgYnVmZmVycy4gIGluZmxhdGVCYWNrKCkgdHJ1c3RzIHRoZSBhcHBsaWNhdGlvbiB0byBub3QgY2hhbmdlIHRoZSBvdXRwdXQKLSAgIGJ1ZmZlciBwYXNzZWQgYnkgdGhlIG91dHB1dCBmdW5jdGlvbiwgYXQgbGVhc3QgdW50aWwgaW5mbGF0ZUJhY2soKSByZXR1cm5zLgotCi0gICAgIGluZmxhdGVCYWNrSW5pdCgpIG11c3QgYmUgY2FsbGVkIGZpcnN0IHRvIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZQotICAgYW5kIHRvIGluaXRpYWxpemUgdGhlIHN0YXRlIHdpdGggdGhlIHVzZXItcHJvdmlkZWQgd2luZG93IGJ1ZmZlci4KLSAgIGluZmxhdGVCYWNrKCkgbWF5IHRoZW4gYmUgdXNlZCBtdWx0aXBsZSB0aW1lcyB0byBpbmZsYXRlIGEgY29tcGxldGUsIHJhdwotICAgZGVmbGF0ZSBzdHJlYW0gd2l0aCBlYWNoIGNhbGwuICBpbmZsYXRlQmFja0VuZCgpIGlzIHRoZW4gY2FsbGVkIHRvIGZyZWUgdGhlCi0gICBhbGxvY2F0ZWQgc3RhdGUuCi0KLSAgICAgQSByYXcgZGVmbGF0ZSBzdHJlYW0gaXMgb25lIHdpdGggbm8gemxpYiBvciBnemlwIGhlYWRlciBvciB0cmFpbGVyLgotICAgVGhpcyByb3V0aW5lIHdvdWxkIG5vcm1hbGx5IGJlIHVzZWQgaW4gYSB1dGlsaXR5IHRoYXQgcmVhZHMgemlwIG9yIGd6aXAKLSAgIGZpbGVzIGFuZCB3cml0ZXMgb3V0IHVuY29tcHJlc3NlZCBmaWxlcy4gIFRoZSB1dGlsaXR5IHdvdWxkIGRlY29kZSB0aGUKLSAgIGhlYWRlciBhbmQgcHJvY2VzcyB0aGUgdHJhaWxlciBvbiBpdHMgb3duLCBoZW5jZSB0aGlzIHJvdXRpbmUgZXhwZWN0cyBvbmx5Ci0gICB0aGUgcmF3IGRlZmxhdGUgc3RyZWFtIHRvIGRlY29tcHJlc3MuICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBub3JtYWwKLSAgIGJlaGF2aW9yIG9mIGluZmxhdGUoKSwgd2hpY2ggZXhwZWN0cyBlaXRoZXIgYSB6bGliIG9yIGd6aXAgaGVhZGVyIGFuZAotICAgdHJhaWxlciBhcm91bmQgdGhlIGRlZmxhdGUgc3RyZWFtLgotCi0gICAgIGluZmxhdGVCYWNrKCkgdXNlcyB0d28gc3Vicm91dGluZXMgc3VwcGxpZWQgYnkgdGhlIGNhbGxlciB0aGF0IGFyZSB0aGVuCi0gICBjYWxsZWQgYnkgaW5mbGF0ZUJhY2soKSBmb3IgaW5wdXQgYW5kIG91dHB1dC4gIGluZmxhdGVCYWNrKCkgY2FsbHMgdGhvc2UKLSAgIHJvdXRpbmVzIHVudGlsIGl0IHJlYWRzIGEgY29tcGxldGUgZGVmbGF0ZSBzdHJlYW0gYW5kIHdyaXRlcyBvdXQgYWxsIG9mIHRoZQotICAgdW5jb21wcmVzc2VkIGRhdGEsIG9yIHVudGlsIGl0IGVuY291bnRlcnMgYW4gZXJyb3IuICBUaGUgZnVuY3Rpb24ncwotICAgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHR5cGVzIGFyZSBkZWZpbmVkIGFib3ZlIGluIHRoZSBpbl9mdW5jIGFuZCBvdXRfZnVuYwotICAgdHlwZWRlZnMuICBpbmZsYXRlQmFjaygpIHdpbGwgY2FsbCBpbihpbl9kZXNjLCAmYnVmKSB3aGljaCBzaG91bGQgcmV0dXJuIHRoZQotICAgbnVtYmVyIG9mIGJ5dGVzIG9mIHByb3ZpZGVkIGlucHV0LCBhbmQgYSBwb2ludGVyIHRvIHRoYXQgaW5wdXQgaW4gYnVmLiAgSWYKLSAgIHRoZXJlIGlzIG5vIGlucHV0IGF2YWlsYWJsZSwgaW4oKSBtdXN0IHJldHVybiB6ZXJvLS1idWYgaXMgaWdub3JlZCBpbiB0aGF0Ci0gICBjYXNlLS1hbmQgaW5mbGF0ZUJhY2soKSB3aWxsIHJldHVybiBhIGJ1ZmZlciBlcnJvci4gIGluZmxhdGVCYWNrKCkgd2lsbCBjYWxsCi0gICBvdXQob3V0X2Rlc2MsIGJ1ZiwgbGVuKSB0byB3cml0ZSB0aGUgdW5jb21wcmVzc2VkIGRhdGEgYnVmWzAuLmxlbi0xXS4gIG91dCgpCi0gICBzaG91bGQgcmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb3Igbm9uLXplcm8gb24gZmFpbHVyZS4gIElmIG91dCgpIHJldHVybnMKLSAgIG5vbi16ZXJvLCBpbmZsYXRlQmFjaygpIHdpbGwgcmV0dXJuIHdpdGggYW4gZXJyb3IuICBOZWl0aGVyIGluKCkgbm9yIG91dCgpCi0gICBhcmUgcGVybWl0dGVkIHRvIGNoYW5nZSB0aGUgY29udGVudHMgb2YgdGhlIHdpbmRvdyBwcm92aWRlZCB0bwotICAgaW5mbGF0ZUJhY2tJbml0KCksIHdoaWNoIGlzIGFsc28gdGhlIGJ1ZmZlciB0aGF0IG91dCgpIHVzZXMgdG8gd3JpdGUgZnJvbS4KLSAgIFRoZSBsZW5ndGggd3JpdHRlbiBieSBvdXQoKSB3aWxsIGJlIGF0IG1vc3QgdGhlIHdpbmRvdyBzaXplLiAgQW55IG5vbi16ZXJvCi0gICBhbW91bnQgb2YgaW5wdXQgbWF5IGJlIHByb3ZpZGVkIGJ5IGluKCkuCi0KLSAgICAgRm9yIGNvbnZlbmllbmNlLCBpbmZsYXRlQmFjaygpIGNhbiBiZSBwcm92aWRlZCBpbnB1dCBvbiB0aGUgZmlyc3QgY2FsbCBieQotICAgc2V0dGluZyBzdHJtLT5uZXh0X2luIGFuZCBzdHJtLT5hdmFpbF9pbi4gIElmIHRoYXQgaW5wdXQgaXMgZXhoYXVzdGVkLCB0aGVuCi0gICBpbigpIHdpbGwgYmUgY2FsbGVkLiAgVGhlcmVmb3JlIHN0cm0tPm5leHRfaW4gbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUKLSAgIGNhbGxpbmcgaW5mbGF0ZUJhY2soKS4gIElmIHN0cm0tPm5leHRfaW4gaXMgWl9OVUxMLCB0aGVuIGluKCkgd2lsbCBiZSBjYWxsZWQKLSAgIGltbWVkaWF0ZWx5IGZvciBpbnB1dC4gIElmIHN0cm0tPm5leHRfaW4gaXMgbm90IFpfTlVMTCwgdGhlbiBzdHJtLT5hdmFpbF9pbgotICAgbXVzdCBhbHNvIGJlIGluaXRpYWxpemVkLCBhbmQgdGhlbiBpZiBzdHJtLT5hdmFpbF9pbiBpcyBub3QgemVybywgaW5wdXQgd2lsbAotICAgaW5pdGlhbGx5IGJlIHRha2VuIGZyb20gc3RybS0+bmV4dF9pblswIC4uICBzdHJtLT5hdmFpbF9pbiAtIDFdLgotCi0gICAgIFRoZSBpbl9kZXNjIGFuZCBvdXRfZGVzYyBwYXJhbWV0ZXJzIG9mIGluZmxhdGVCYWNrKCkgaXMgcGFzc2VkIGFzIHRoZQotICAgZmlyc3QgcGFyYW1ldGVyIG9mIGluKCkgYW5kIG91dCgpIHJlc3BlY3RpdmVseSB3aGVuIHRoZXkgYXJlIGNhbGxlZC4gIFRoZXNlCi0gICBkZXNjcmlwdG9ycyBjYW4gYmUgb3B0aW9uYWxseSB1c2VkIHRvIHBhc3MgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGNhbGxlci0KLSAgIHN1cHBsaWVkIGluKCkgYW5kIG91dCgpIGZ1bmN0aW9ucyBuZWVkIHRvIGRvIHRoZWlyIGpvYi4KLQotICAgICBPbiByZXR1cm4sIGluZmxhdGVCYWNrKCkgd2lsbCBzZXQgc3RybS0+bmV4dF9pbiBhbmQgc3RybS0+YXZhaWxfaW4gdG8KLSAgIHBhc3MgYmFjayBhbnkgdW51c2VkIGlucHV0IHRoYXQgd2FzIHByb3ZpZGVkIGJ5IHRoZSBsYXN0IGluKCkgY2FsbC4gIFRoZQotICAgcmV0dXJuIHZhbHVlcyBvZiBpbmZsYXRlQmFjaygpIGNhbiBiZSBaX1NUUkVBTV9FTkQgb24gc3VjY2VzcywgWl9CVUZfRVJST1IKLSAgIGlmIGluKCkgb3Igb3V0KCkgcmV0dXJuZWQgYW4gZXJyb3IsIFpfREFUQV9FUlJPUiBpZiB0aGVyZSB3YXMgYSBmb3JtYXQgZXJyb3IKLSAgIGluIHRoZSBkZWZsYXRlIHN0cmVhbSAoaW4gd2hpY2ggY2FzZSBzdHJtLT5tc2cgaXMgc2V0IHRvIGluZGljYXRlIHRoZSBuYXR1cmUKLSAgIG9mIHRoZSBlcnJvciksIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gd2FzIG5vdCBwcm9wZXJseSBpbml0aWFsaXplZC4KLSAgIEluIHRoZSBjYXNlIG9mIFpfQlVGX0VSUk9SLCBhbiBpbnB1dCBvciBvdXRwdXQgZXJyb3IgY2FuIGJlIGRpc3Rpbmd1aXNoZWQKLSAgIHVzaW5nIHN0cm0tPm5leHRfaW4gd2hpY2ggd2lsbCBiZSBaX05VTEwgb25seSBpZiBpbigpIHJldHVybmVkIGFuIGVycm9yLiAgSWYKLSAgIHN0cm0tPm5leHRfaW4gaXMgbm90IFpfTlVMTCwgdGhlbiB0aGUgWl9CVUZfRVJST1Igd2FzIGR1ZSB0byBvdXQoKSByZXR1cm5pbmcKLSAgIG5vbi16ZXJvLiAgKGluKCkgd2lsbCBhbHdheXMgYmUgY2FsbGVkIGJlZm9yZSBvdXQoKSwgc28gc3RybS0+bmV4dF9pbiBpcwotICAgYXNzdXJlZCB0byBiZSBkZWZpbmVkIGlmIG91dCgpIHJldHVybnMgbm9uLXplcm8uKSBOb3RlIHRoYXQgaW5mbGF0ZUJhY2soKQotICAgY2Fubm90IHJldHVybiBaX09LLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFja0VuZCBPRigoel9zdHJlYW1wIHN0cm0pKTsKLS8qCi0gICAgIEFsbCBtZW1vcnkgYWxsb2NhdGVkIGJ5IGluZmxhdGVCYWNrSW5pdCgpIGlzIGZyZWVkLgotCi0gICAgIGluZmxhdGVCYWNrRW5kKCkgcmV0dXJucyBaX09LIG9uIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0KLSAgIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCi0qLwotCi1aRVhURVJOIHVMb25nIFpFWFBPUlQgemxpYkNvbXBpbGVGbGFncyBPRigodm9pZCkpOwotLyogUmV0dXJuIGZsYWdzIGluZGljYXRpbmcgY29tcGlsZS10aW1lIG9wdGlvbnMuCi0KLSAgICBUeXBlIHNpemVzLCB0d28gYml0cyBlYWNoLCAwMCA9IDE2IGJpdHMsIDAxID0gMzIsIDEwID0gNjQsIDExID0gb3RoZXI6Ci0gICAgIDEuMDogc2l6ZSBvZiB1SW50Ci0gICAgIDMuMjogc2l6ZSBvZiB1TG9uZwotICAgICA1LjQ6IHNpemUgb2Ygdm9pZHBmIChwb2ludGVyKQotICAgICA3LjY6IHNpemUgb2Ygel9vZmZfdAotCi0gICAgQ29tcGlsZXIsIGFzc2VtYmxlciwgYW5kIGRlYnVnIG9wdGlvbnM6Ci0gICAgIDg6IERFQlVHCi0gICAgIDk6IEFTTVYgb3IgQVNNSU5GIC0tIHVzZSBBU00gY29kZQotICAgICAxMDogWkxJQl9XSU5BUEkgLS0gZXhwb3J0ZWQgZnVuY3Rpb25zIHVzZSB0aGUgV0lOQVBJIGNhbGxpbmcgY29udmVudGlvbgotICAgICAxMTogMCAocmVzZXJ2ZWQpCi0KLSAgICBPbmUtdGltZSB0YWJsZSBidWlsZGluZyAoc21hbGxlciBjb2RlLCBidXQgbm90IHRocmVhZC1zYWZlIGlmIHRydWUpOgotICAgICAxMjogQlVJTERGSVhFRCAtLSBidWlsZCBzdGF0aWMgYmxvY2sgZGVjb2RpbmcgdGFibGVzIHdoZW4gbmVlZGVkCi0gICAgIDEzOiBEWU5BTUlDX0NSQ19UQUJMRSAtLSBidWlsZCBDUkMgY2FsY3VsYXRpb24gdGFibGVzIHdoZW4gbmVlZGVkCi0gICAgIDE0LDE1OiAwIChyZXNlcnZlZCkKLQotICAgIExpYnJhcnkgY29udGVudCAoaW5kaWNhdGVzIG1pc3NpbmcgZnVuY3Rpb25hbGl0eSk6Ci0gICAgIDE2OiBOT19HWkNPTVBSRVNTIC0tIGd6KiBmdW5jdGlvbnMgY2Fubm90IGNvbXByZXNzICh0byBhdm9pZCBsaW5raW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmxhdGUgY29kZSB3aGVuIG5vdCBuZWVkZWQpCi0gICAgIDE3OiBOT19HWklQIC0tIGRlZmxhdGUgY2FuJ3Qgd3JpdGUgZ3ppcCBzdHJlYW1zLCBhbmQgaW5mbGF0ZSBjYW4ndCBkZXRlY3QKLSAgICAgICAgICAgICAgICAgICAgYW5kIGRlY29kZSBnemlwIHN0cmVhbXMgKHRvIGF2b2lkIGxpbmtpbmcgY3JjIGNvZGUpCi0gICAgIDE4LTE5OiAwIChyZXNlcnZlZCkKLQotICAgIE9wZXJhdGlvbiB2YXJpYXRpb25zIChjaGFuZ2VzIGluIGxpYnJhcnkgZnVuY3Rpb25hbGl0eSk6Ci0gICAgIDIwOiBQS1pJUF9CVUdfV09SS0FST1VORCAtLSBzbGlnaHRseSBtb3JlIHBlcm1pc3NpdmUgaW5mbGF0ZQotICAgICAyMTogRkFTVEVTVCAtLSBkZWZsYXRlIGFsZ29yaXRobSB3aXRoIG9ubHkgb25lLCBsb3dlc3QgY29tcHJlc3Npb24gbGV2ZWwKLSAgICAgMjIsMjM6IDAgKHJlc2VydmVkKQotCi0gICAgVGhlIHNwcmludGYgdmFyaWFudCB1c2VkIGJ5IGd6cHJpbnRmICh6ZXJvIGlzIGJlc3QpOgotICAgICAyNDogMCA9IHZzKiwgMSA9IHMqIC0tIDEgbWVhbnMgbGltaXRlZCB0byAyMCBhcmd1bWVudHMgYWZ0ZXIgdGhlIGZvcm1hdAotICAgICAyNTogMCA9ICpucHJpbnRmLCAxID0gKnByaW50ZiAtLSAxIG1lYW5zIGd6cHJpbnRmKCkgbm90IHNlY3VyZSEKLSAgICAgMjY6IDAgPSByZXR1cm5zIHZhbHVlLCAxID0gdm9pZCAtLSAxIG1lYW5zIGluZmVycmVkIHN0cmluZyBsZW5ndGggcmV0dXJuZWQKLQotICAgIFJlbWFpbmRlcjoKLSAgICAgMjctMzE6IDAgKHJlc2VydmVkKQotICovCi0KLSNpZm5kZWYgWl9TT0xPCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHV0aWxpdHkgZnVuY3Rpb25zICovCi0KLS8qCi0gICAgIFRoZSBmb2xsb3dpbmcgdXRpbGl0eSBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZiB0aGUgYmFzaWMKLSAgIHN0cmVhbS1vcmllbnRlZCBmdW5jdGlvbnMuICBUbyBzaW1wbGlmeSB0aGUgaW50ZXJmYWNlLCBzb21lIGRlZmF1bHQgb3B0aW9ucwotICAgYXJlIGFzc3VtZWQgKGNvbXByZXNzaW9uIGxldmVsIGFuZCBtZW1vcnkgdXNhZ2UsIHN0YW5kYXJkIG1lbW9yeSBhbGxvY2F0aW9uCi0gICBmdW5jdGlvbnMpLiAgVGhlIHNvdXJjZSBjb2RlIG9mIHRoZXNlIHV0aWxpdHkgZnVuY3Rpb25zIGNhbiBiZSBtb2RpZmllZCBpZgotICAgeW91IG5lZWQgc3BlY2lhbCBvcHRpb25zLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBjb21wcmVzcyBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZWYgKnNvdXJjZSwgdUxvbmcgc291cmNlTGVuKSk7Ci0vKgotICAgICBDb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gIHNvdXJjZUxlbiBpcwotICAgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAgVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwgc2l6ZQotICAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBhdCBsZWFzdCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkKLSAgIGNvbXByZXNzQm91bmQoc291cmNlTGVuKS4gIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlCi0gICBjb21wcmVzc2VkIGJ1ZmZlci4KLQotICAgICBjb21wcmVzcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAotICAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0Ci0gICBidWZmZXIuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGNvbXByZXNzMiBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpKTsKLS8qCi0gICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgVGhlIGxldmVsCi0gICBwYXJhbWV0ZXIgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgaW4gZGVmbGF0ZUluaXQuICBzb3VyY2VMZW4gaXMgdGhlIGJ5dGUKLSAgIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsIHNpemUgb2YgdGhlCi0gICBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgYXQgbGVhc3QgdGhlIHZhbHVlIHJldHVybmVkIGJ5Ci0gICBjb21wcmVzc0JvdW5kKHNvdXJjZUxlbikuICBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZQotICAgY29tcHJlc3NlZCBidWZmZXIuCi0KLSAgICAgY29tcHJlc3MyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAotICAgbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyLAotICAgWl9TVFJFQU1fRVJST1IgaWYgdGhlIGxldmVsIHBhcmFtZXRlciBpcyBpbnZhbGlkLgotKi8KLQotWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNvbXByZXNzQm91bmQgT0YoKHVMb25nIHNvdXJjZUxlbikpOwotLyoKLSAgICAgY29tcHJlc3NCb3VuZCgpIHJldHVybnMgYW4gdXBwZXIgYm91bmQgb24gdGhlIGNvbXByZXNzZWQgc2l6ZSBhZnRlcgotICAgY29tcHJlc3MoKSBvciBjb21wcmVzczIoKSBvbiBzb3VyY2VMZW4gYnl0ZXMuICBJdCB3b3VsZCBiZSB1c2VkIGJlZm9yZSBhCi0gICBjb21wcmVzcygpIG9yIGNvbXByZXNzMigpIGNhbGwgdG8gYWxsb2NhdGUgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgdW5jb21wcmVzcyBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4pKTsKLS8qCi0gICAgIERlY29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBzb3VyY2VMZW4gaXMKLSAgIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsIHNpemUKLSAgIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIGVudGlyZQotICAgdW5jb21wcmVzc2VkIGRhdGEuICAoVGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG11c3QgaGF2ZSBiZWVuIHNhdmVkCi0gICBwcmV2aW91c2x5IGJ5IHRoZSBjb21wcmVzc29yIGFuZCB0cmFuc21pdHRlZCB0byB0aGUgZGVjb21wcmVzc29yIGJ5IHNvbWUKLSAgIG1lY2hhbmlzbSBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIGNvbXByZXNzaW9uIGxpYnJhcnkuKSBVcG9uIGV4aXQsIGRlc3RMZW4KLSAgIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGJ1ZmZlci4KLQotICAgICB1bmNvbXByZXNzIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90Ci0gICBlbm91Z2ggbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQKLSAgIGJ1ZmZlciwgb3IgWl9EQVRBX0VSUk9SIGlmIHRoZSBpbnB1dCBkYXRhIHdhcyBjb3JydXB0ZWQgb3IgaW5jb21wbGV0ZS4gIEluCi0gICB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20sIHVuY29tcHJlc3MoKSB3aWxsIGZpbGwgdGhlIG91dHB1dAotICAgYnVmZmVyIHdpdGggdGhlIHVuY29tcHJlc3NlZCBkYXRhIHVwIHRvIHRoYXQgcG9pbnQuCi0qLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBnemlwIGZpbGUgYWNjZXNzIGZ1bmN0aW9ucyAqLwotCi0vKgotICAgICBUaGlzIGxpYnJhcnkgc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbiBnemlwICguZ3opIGZvcm1hdCB3aXRoCi0gICBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aGF0IG9mIHN0ZGlvLCB1c2luZyB0aGUgZnVuY3Rpb25zIHRoYXQgc3RhcnQgd2l0aAotICAgImd6Ii4gIFRoZSBnemlwIGZvcm1hdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgemxpYiBmb3JtYXQuICBnemlwIGlzIGEgZ3ppcAotICAgd3JhcHBlciwgZG9jdW1lbnRlZCBpbiBSRkMgMTk1Miwgd3JhcHBlZCBhcm91bmQgYSBkZWZsYXRlIHN0cmVhbS4KLSovCi0KLXR5cGVkZWYgc3RydWN0IGd6RmlsZV9zICpnekZpbGU7ICAgIC8qIHNlbWktb3BhcXVlIGd6aXAgZmlsZSBkZXNjcmlwdG9yICovCi0KLS8qCi1aRVhURVJOIGd6RmlsZSBaRVhQT1JUIGd6b3BlbiBPRigoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbW9kZSkpOwotCi0gICAgIE9wZW5zIGEgZ3ppcCAoLmd6KSBmaWxlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuICBUaGUgbW9kZSBwYXJhbWV0ZXIgaXMgYXMKLSAgIGluIGZvcGVuICgicmIiIG9yICJ3YiIpIGJ1dCBjYW4gYWxzbyBpbmNsdWRlIGEgY29tcHJlc3Npb24gbGV2ZWwgKCJ3YjkiKSBvcgotICAgYSBzdHJhdGVneTogJ2YnIGZvciBmaWx0ZXJlZCBkYXRhIGFzIGluICJ3YjZmIiwgJ2gnIGZvciBIdWZmbWFuLW9ubHkKLSAgIGNvbXByZXNzaW9uIGFzIGluICJ3YjFoIiwgJ1InIGZvciBydW4tbGVuZ3RoIGVuY29kaW5nIGFzIGluICJ3YjFSIiwgb3IgJ0YnCi0gICBmb3IgZml4ZWQgY29kZSBjb21wcmVzc2lvbiBhcyBpbiAid2I5RiIuICAoU2VlIHRoZSBkZXNjcmlwdGlvbiBvZgotICAgZGVmbGF0ZUluaXQyIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdHJhdGVneSBwYXJhbWV0ZXIuKSAgJ1QnIHdpbGwKLSAgIHJlcXVlc3QgdHJhbnNwYXJlbnQgd3JpdGluZyBvciBhcHBlbmRpbmcgd2l0aCBubyBjb21wcmVzc2lvbiBhbmQgbm90IHVzaW5nCi0gICB0aGUgZ3ppcCBmb3JtYXQuCi0KLSAgICAgImEiIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgInciIHRvIHJlcXVlc3QgdGhhdCB0aGUgZ3ppcCBzdHJlYW0gdGhhdCB3aWxsCi0gICBiZSB3cml0dGVuIGJlIGFwcGVuZGVkIHRvIHRoZSBmaWxlLiAgIisiIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLCBzaW5jZQotICAgcmVhZGluZyBhbmQgd3JpdGluZyB0byB0aGUgc2FtZSBnemlwIGZpbGUgaXMgbm90IHN1cHBvcnRlZC4gIFRoZSBhZGRpdGlvbiBvZgotICAgIngiIHdoZW4gd3JpdGluZyB3aWxsIGNyZWF0ZSB0aGUgZmlsZSBleGNsdXNpdmVseSwgd2hpY2ggZmFpbHMgaWYgdGhlIGZpbGUKLSAgIGFscmVhZHkgZXhpc3RzLiAgT24gc3lzdGVtcyB0aGF0IHN1cHBvcnQgaXQsIHRoZSBhZGRpdGlvbiBvZiAiZSIgd2hlbgotICAgcmVhZGluZyBvciB3cml0aW5nIHdpbGwgc2V0IHRoZSBmbGFnIHRvIGNsb3NlIHRoZSBmaWxlIG9uIGFuIGV4ZWN2ZSgpIGNhbGwuCi0KLSAgICAgVGhlc2UgZnVuY3Rpb25zLCBhcyB3ZWxsIGFzIGd6aXAsIHdpbGwgcmVhZCBhbmQgZGVjb2RlIGEgc2VxdWVuY2Ugb2YgZ3ppcAotICAgc3RyZWFtcyBpbiBhIGZpbGUuICBUaGUgYXBwZW5kIGZ1bmN0aW9uIG9mIGd6b3BlbigpIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZQotICAgc3VjaCBhIGZpbGUuICAoQWxzbyBzZWUgZ3pmbHVzaCgpIGZvciBhbm90aGVyIHdheSB0byBkbyB0aGlzLikgIFdoZW4KLSAgIGFwcGVuZGluZywgZ3pvcGVuIGRvZXMgbm90IHRlc3Qgd2hldGhlciB0aGUgZmlsZSBiZWdpbnMgd2l0aCBhIGd6aXAgc3RyZWFtLAotICAgbm9yIGRvZXMgaXQgbG9vayBmb3IgdGhlIGVuZCBvZiB0aGUgZ3ppcCBzdHJlYW1zIHRvIGJlZ2luIGFwcGVuZGluZy4gIGd6b3BlbgotICAgd2lsbCBzaW1wbHkgYXBwZW5kIGEgZ3ppcCBzdHJlYW0gdG8gdGhlIGV4aXN0aW5nIGZpbGUuCi0KLSAgICAgZ3pvcGVuIGNhbiBiZSB1c2VkIHRvIHJlYWQgYSBmaWxlIHdoaWNoIGlzIG5vdCBpbiBnemlwIGZvcm1hdDsgaW4gdGhpcwotICAgY2FzZSBnenJlYWQgd2lsbCBkaXJlY3RseSByZWFkIGZyb20gdGhlIGZpbGUgd2l0aG91dCBkZWNvbXByZXNzaW9uLiAgV2hlbgotICAgcmVhZGluZywgdGhpcyB3aWxsIGJlIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkgYnkgbG9va2luZyBmb3IgdGhlIG1hZ2ljIHR3by0KLSAgIGJ5dGUgZ3ppcCBoZWFkZXIuCi0KLSAgICAgZ3pvcGVuIHJldHVybnMgTlVMTCBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkLCBpZiB0aGVyZSB3YXMKLSAgIGluc3VmZmljaWVudCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIGd6RmlsZSBzdGF0ZSwgb3IgaWYgYW4gaW52YWxpZCBtb2RlIHdhcwotICAgc3BlY2lmaWVkIChhbiAncicsICd3Jywgb3IgJ2EnIHdhcyBub3QgcHJvdmlkZWQsIG9yICcrJyB3YXMgcHJvdmlkZWQpLgotICAgZXJybm8gY2FuIGJlIGNoZWNrZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSByZWFzb24gZ3pvcGVuIGZhaWxlZCB3YXMgdGhhdCB0aGUKLSAgIGZpbGUgY291bGQgbm90IGJlIG9wZW5lZC4KLSovCi0KLVpFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pkb3BlbiBPRigoaW50IGZkLCBjb25zdCBjaGFyICptb2RlKSk7Ci0vKgotICAgICBnemRvcGVuIGFzc29jaWF0ZXMgYSBnekZpbGUgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yIGZkLiAgRmlsZSBkZXNjcmlwdG9ycwotICAgYXJlIG9idGFpbmVkIGZyb20gY2FsbHMgbGlrZSBvcGVuLCBkdXAsIGNyZWF0LCBwaXBlIG9yIGZpbGVubyAoaWYgdGhlIGZpbGUKLSAgIGhhcyBiZWVuIHByZXZpb3VzbHkgb3BlbmVkIHdpdGggZm9wZW4pLiAgVGhlIG1vZGUgcGFyYW1ldGVyIGlzIGFzIGluIGd6b3Blbi4KLQotICAgICBUaGUgbmV4dCBjYWxsIG9mIGd6Y2xvc2Ugb24gdGhlIHJldHVybmVkIGd6RmlsZSB3aWxsIGFsc28gY2xvc2UgdGhlIGZpbGUKLSAgIGRlc2NyaXB0b3IgZmQsIGp1c3QgbGlrZSBmY2xvc2UoZmRvcGVuKGZkLCBtb2RlKSkgY2xvc2VzIHRoZSBmaWxlIGRlc2NyaXB0b3IKLSAgIGZkLiAgSWYgeW91IHdhbnQgdG8ga2VlcCBmZCBvcGVuLCB1c2UgZmQgPSBkdXAoZmRfa2VlcCk7IGd6ID0gZ3pkb3BlbihmZCwKLSAgIG1vZGUpOy4gIFRoZSBkdXBsaWNhdGVkIGRlc2NyaXB0b3Igc2hvdWxkIGJlIHNhdmVkIHRvIGF2b2lkIGEgbGVhaywgc2luY2UKLSAgIGd6ZG9wZW4gZG9lcyBub3QgY2xvc2UgZmQgaWYgaXQgZmFpbHMuICBJZiB5b3UgYXJlIHVzaW5nIGZpbGVubygpIHRvIGdldCB0aGUKLSAgIGZpbGUgZGVzY3JpcHRvciBmcm9tIGEgRklMRSAqLCB0aGVuIHlvdSB3aWxsIGhhdmUgdG8gdXNlIGR1cCgpIHRvIGF2b2lkCi0gICBkb3VibGUtY2xvc2UoKWluZyB0aGUgZmlsZSBkZXNjcmlwdG9yLiAgQm90aCBnemNsb3NlKCkgYW5kIGZjbG9zZSgpIHdpbGwKLSAgIGNsb3NlIHRoZSBhc3NvY2lhdGVkIGZpbGUgZGVzY3JpcHRvciwgc28gdGhleSBuZWVkIHRvIGhhdmUgZGlmZmVyZW50IGZpbGUKLSAgIGRlc2NyaXB0b3JzLgotCi0gICAgIGd6ZG9wZW4gcmV0dXJucyBOVUxMIGlmIHRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFsbG9jYXRlIHRoZQotICAgZ3pGaWxlIHN0YXRlLCBpZiBhbiBpbnZhbGlkIG1vZGUgd2FzIHNwZWNpZmllZCAoYW4gJ3InLCAndycsIG9yICdhJyB3YXMgbm90Ci0gICBwcm92aWRlZCwgb3IgJysnIHdhcyBwcm92aWRlZCksIG9yIGlmIGZkIGlzIC0xLiAgVGhlIGZpbGUgZGVzY3JpcHRvciBpcyBub3QKLSAgIHVzZWQgdW50aWwgdGhlIG5leHQgZ3oqIHJlYWQsIHdyaXRlLCBzZWVrLCBvciBjbG9zZSBvcGVyYXRpb24sIHNvIGd6ZG9wZW4KLSAgIHdpbGwgbm90IGRldGVjdCBpZiBmZCBpcyBpbnZhbGlkICh1bmxlc3MgZmQgaXMgLTEpLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBnemJ1ZmZlciBPRigoZ3pGaWxlIGZpbGUsIHVuc2lnbmVkIHNpemUpKTsKLS8qCi0gICAgIFNldCB0aGUgaW50ZXJuYWwgYnVmZmVyIHNpemUgdXNlZCBieSB0aGlzIGxpYnJhcnkncyBmdW5jdGlvbnMuICBUaGUKLSAgIGRlZmF1bHQgYnVmZmVyIHNpemUgaXMgODE5MiBieXRlcy4gIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIKLSAgIGd6b3BlbigpIG9yIGd6ZG9wZW4oKSwgYW5kIGJlZm9yZSBhbnkgb3RoZXIgY2FsbHMgdGhhdCByZWFkIG9yIHdyaXRlIHRoZQotICAgZmlsZS4gIFRoZSBidWZmZXIgbWVtb3J5IGFsbG9jYXRpb24gaXMgYWx3YXlzIGRlZmVycmVkIHRvIHRoZSBmaXJzdCByZWFkIG9yCi0gICB3cml0ZS4gIFR3byBidWZmZXJzIGFyZSBhbGxvY2F0ZWQsIGVpdGhlciBib3RoIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSB3aGVuCi0gICB3cml0aW5nLCBvciBvbmUgb2YgdGhlIHNwZWNpZmllZCBzaXplIGFuZCB0aGUgb3RoZXIgdHdpY2UgdGhhdCBzaXplIHdoZW4KLSAgIHJlYWRpbmcuICBBIGxhcmdlciBidWZmZXIgc2l6ZSBvZiwgZm9yIGV4YW1wbGUsIDY0SyBvciAxMjhLIGJ5dGVzIHdpbGwKLSAgIG5vdGljZWFibHkgaW5jcmVhc2UgdGhlIHNwZWVkIG9mIGRlY29tcHJlc3Npb24gKHJlYWRpbmcpLgotCi0gICAgIFRoZSBuZXcgYnVmZmVyIHNpemUgYWxzbyBhZmZlY3RzIHRoZSBtYXhpbXVtIGxlbmd0aCBmb3IgZ3pwcmludGYoKS4KLQotICAgICBnemJ1ZmZlcigpIHJldHVybnMgMCBvbiBzdWNjZXNzLCBvciAtMSBvbiBmYWlsdXJlLCBzdWNoIGFzIGJlaW5nIGNhbGxlZAotICAgdG9vIGxhdGUuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGd6c2V0cGFyYW1zIE9GKChnekZpbGUgZmlsZSwgaW50IGxldmVsLCBpbnQgc3RyYXRlZ3kpKTsKLS8qCi0gICAgIER5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwgb3Igc3RyYXRlZ3kuICBTZWUgdGhlIGRlc2NyaXB0aW9uCi0gICBvZiBkZWZsYXRlSW5pdDIgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMuCi0KLSAgICAgZ3pzZXRwYXJhbXMgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBmaWxlIHdhcyBub3QKLSAgIG9wZW5lZCBmb3Igd3JpdGluZy4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZ3pyZWFkIE9GKChnekZpbGUgZmlsZSwgdm9pZHAgYnVmLCB1bnNpZ25lZCBsZW4pKTsKLS8qCi0gICAgIFJlYWRzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4gIElmCi0gICB0aGUgaW5wdXQgZmlsZSBpcyBub3QgaW4gZ3ppcCBmb3JtYXQsIGd6cmVhZCBjb3BpZXMgdGhlIGdpdmVuIG51bWJlciBvZgotICAgYnl0ZXMgaW50byB0aGUgYnVmZmVyIGRpcmVjdGx5IGZyb20gdGhlIGZpbGUuCi0KLSAgICAgQWZ0ZXIgcmVhY2hpbmcgdGhlIGVuZCBvZiBhIGd6aXAgc3RyZWFtIGluIHRoZSBpbnB1dCwgZ3pyZWFkIHdpbGwgY29udGludWUKLSAgIHRvIHJlYWQsIGxvb2tpbmcgZm9yIGFub3RoZXIgZ3ppcCBzdHJlYW0uICBBbnkgbnVtYmVyIG9mIGd6aXAgc3RyZWFtcyBtYXkgYmUKLSAgIGNvbmNhdGVuYXRlZCBpbiB0aGUgaW5wdXQgZmlsZSwgYW5kIHdpbGwgYWxsIGJlIGRlY29tcHJlc3NlZCBieSBnenJlYWQoKS4KLSAgIElmIHNvbWV0aGluZyBvdGhlciB0aGFuIGEgZ3ppcCBzdHJlYW0gaXMgZW5jb3VudGVyZWQgYWZ0ZXIgYSBnemlwIHN0cmVhbSwKLSAgIHRoYXQgcmVtYWluaW5nIHRyYWlsaW5nIGdhcmJhZ2UgaXMgaWdub3JlZCAoYW5kIG5vIGVycm9yIGlzIHJldHVybmVkKS4KLQotICAgICBnenJlYWQgY2FuIGJlIHVzZWQgdG8gcmVhZCBhIGd6aXAgZmlsZSB0aGF0IGlzIGJlaW5nIGNvbmN1cnJlbnRseSB3cml0dGVuLgotICAgVXBvbiByZWFjaGluZyB0aGUgZW5kIG9mIHRoZSBpbnB1dCwgZ3pyZWFkIHdpbGwgcmV0dXJuIHdpdGggdGhlIGF2YWlsYWJsZQotICAgZGF0YS4gIElmIHRoZSBlcnJvciBjb2RlIHJldHVybmVkIGJ5IGd6ZXJyb3IgaXMgWl9PSyBvciBaX0JVRl9FUlJPUiwgdGhlbgotICAgZ3pjbGVhcmVyciBjYW4gYmUgdXNlZCB0byBjbGVhciB0aGUgZW5kIG9mIGZpbGUgaW5kaWNhdG9yIGluIG9yZGVyIHRvIHBlcm1pdAotICAgZ3pyZWFkIHRvIGJlIHRyaWVkIGFnYWluLiAgWl9PSyBpbmRpY2F0ZXMgdGhhdCBhIGd6aXAgc3RyZWFtIHdhcyBjb21wbGV0ZWQKLSAgIG9uIHRoZSBsYXN0IGd6cmVhZC4gIFpfQlVGX0VSUk9SIGluZGljYXRlcyB0aGF0IHRoZSBpbnB1dCBmaWxlIGVuZGVkIGluIHRoZQotICAgbWlkZGxlIG9mIGEgZ3ppcCBzdHJlYW0uICBOb3RlIHRoYXQgZ3pyZWFkIGRvZXMgbm90IHJldHVybiAtMSBpbiB0aGUgZXZlbnQKLSAgIG9mIGFuIGluY29tcGxldGUgZ3ppcCBzdHJlYW0uICBUaGlzIGVycm9yIGlzIGRlZmVycmVkIHVudGlsIGd6Y2xvc2UoKSwgd2hpY2gKLSAgIHdpbGwgcmV0dXJuIFpfQlVGX0VSUk9SIGlmIHRoZSBsYXN0IGd6cmVhZCBlbmRlZCBpbiB0aGUgbWlkZGxlIG9mIGEgZ3ppcAotICAgc3RyZWFtLiAgQWx0ZXJuYXRpdmVseSwgZ3plcnJvciBjYW4gYmUgdXNlZCBiZWZvcmUgZ3pjbG9zZSB0byBkZXRlY3QgdGhpcwotICAgY2FzZS4KLQotICAgICBnenJlYWQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSByZWFkLCBsZXNzIHRoYW4KLSAgIGxlbiBmb3IgZW5kIG9mIGZpbGUsIG9yIC0xIGZvciBlcnJvci4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZ3p3cml0ZSBPRigoZ3pGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWRwYyBidWYsIHVuc2lnbmVkIGxlbikpOwotLyoKLSAgICAgV3JpdGVzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4KLSAgIGd6d3JpdGUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyB3cml0dGVuIG9yIDAgaW4gY2FzZSBvZgotICAgZXJyb3IuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUVkEgZ3pwcmludGYgWl9BUkcoKGd6RmlsZSBmaWxlLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikpOwotLyoKLSAgICAgQ29udmVydHMsIGZvcm1hdHMsIGFuZCB3cml0ZXMgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29tcHJlc3NlZCBmaWxlIHVuZGVyCi0gICBjb250cm9sIG9mIHRoZSBmb3JtYXQgc3RyaW5nLCBhcyBpbiBmcHJpbnRmLiAgZ3pwcmludGYgcmV0dXJucyB0aGUgbnVtYmVyIG9mCi0gICB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiwgb3IgMCBpbiBjYXNlIG9mIGVycm9yLiAgVGhlIG51bWJlciBvZgotICAgdW5jb21wcmVzc2VkIGJ5dGVzIHdyaXR0ZW4gaXMgbGltaXRlZCB0byA4MTkxLCBvciBvbmUgbGVzcyB0aGFuIHRoZSBidWZmZXIKLSAgIHNpemUgZ2l2ZW4gdG8gZ3pidWZmZXIoKS4gIFRoZSBjYWxsZXIgc2hvdWxkIGFzc3VyZSB0aGF0IHRoaXMgbGltaXQgaXMgbm90Ci0gICBleGNlZWRlZC4gIElmIGl0IGlzIGV4Y2VlZGVkLCB0aGVuIGd6cHJpbnRmKCkgd2lsbCByZXR1cm4gYW4gZXJyb3IgKDApIHdpdGgKLSAgIG5vdGhpbmcgd3JpdHRlbi4gIEluIHRoaXMgY2FzZSwgdGhlcmUgbWF5IGFsc28gYmUgYSBidWZmZXIgb3ZlcmZsb3cgd2l0aAotICAgdW5wcmVkaWN0YWJsZSBjb25zZXF1ZW5jZXMsIHdoaWNoIGlzIHBvc3NpYmxlIG9ubHkgaWYgemxpYiB3YXMgY29tcGlsZWQgd2l0aAotICAgdGhlIGluc2VjdXJlIGZ1bmN0aW9ucyBzcHJpbnRmKCkgb3IgdnNwcmludGYoKSBiZWNhdXNlIHRoZSBzZWN1cmUgc25wcmludGYoKQotICAgb3IgdnNucHJpbnRmKCkgZnVuY3Rpb25zIHdlcmUgbm90IGF2YWlsYWJsZS4gIFRoaXMgY2FuIGJlIGRldGVybWluZWQgdXNpbmcKLSAgIHpsaWJDb21waWxlRmxhZ3MoKS4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZ3pwdXRzIE9GKChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqcykpOwotLyoKLSAgICAgV3JpdGVzIHRoZSBnaXZlbiBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUsIGV4Y2x1ZGluZwotICAgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyLgotCi0gICAgIGd6cHV0cyByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLgotKi8KLQotWkVYVEVSTiBjaGFyICogWkVYUE9SVCBnemdldHMgT0YoKGd6RmlsZSBmaWxlLCBjaGFyICpidWYsIGludCBsZW4pKTsKLS8qCi0gICAgIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZSB1bnRpbCBsZW4tMSBjaGFyYWN0ZXJzIGFyZSByZWFkLCBvciBhCi0gICBuZXdsaW5lIGNoYXJhY3RlciBpcyByZWFkIGFuZCB0cmFuc2ZlcnJlZCB0byBidWYsIG9yIGFuIGVuZC1vZi1maWxlCi0gICBjb25kaXRpb24gaXMgZW5jb3VudGVyZWQuICBJZiBhbnkgY2hhcmFjdGVycyBhcmUgcmVhZCBvciBpZiBsZW4gPT0gMSwgdGhlCi0gICBzdHJpbmcgaXMgdGVybWluYXRlZCB3aXRoIGEgbnVsbCBjaGFyYWN0ZXIuICBJZiBubyBjaGFyYWN0ZXJzIGFyZSByZWFkIGR1ZQotICAgdG8gYW4gZW5kLW9mLWZpbGUgb3IgbGVuIDwgMSwgdGhlbiB0aGUgYnVmZmVyIGlzIGxlZnQgdW50b3VjaGVkLgotCi0gICAgIGd6Z2V0cyByZXR1cm5zIGJ1ZiB3aGljaCBpcyBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcsIG9yIGl0IHJldHVybnMgTlVMTAotICAgZm9yIGVuZC1vZi1maWxlIG9yIGluIGNhc2Ugb2YgZXJyb3IuICBJZiB0aGVyZSB3YXMgYW4gZXJyb3IsIHRoZSBjb250ZW50cyBhdAotICAgYnVmIGFyZSBpbmRldGVybWluYXRlLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBnenB1dGMgT0YoKGd6RmlsZSBmaWxlLCBpbnQgYykpOwotLyoKLSAgICAgV3JpdGVzIGMsIGNvbnZlcnRlZCB0byBhbiB1bnNpZ25lZCBjaGFyLCBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuICBnenB1dGMKLSAgIHJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGd6Z2V0YyBPRigoZ3pGaWxlIGZpbGUpKTsKLS8qCi0gICAgIFJlYWRzIG9uZSBieXRlIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4gIGd6Z2V0YyByZXR1cm5zIHRoaXMgYnl0ZSBvciAtMQotICAgaW4gY2FzZSBvZiBlbmQgb2YgZmlsZSBvciBlcnJvci4gIFRoaXMgaXMgaW1wbGVtZW50ZWQgYXMgYSBtYWNybyBmb3Igc3BlZWQuCi0gICBBcyBzdWNoLCBpdCBkb2VzIG5vdCBkbyBhbGwgb2YgdGhlIGNoZWNraW5nIHRoZSBvdGhlciBmdW5jdGlvbnMgZG8uICBJLmUuCi0gICBpdCBkb2VzIG5vdCBjaGVjayB0byBzZWUgaWYgZmlsZSBpcyBOVUxMLCBub3Igd2hldGhlciB0aGUgc3RydWN0dXJlIGZpbGUKLSAgIHBvaW50cyB0byBoYXMgYmVlbiBjbG9iYmVyZWQgb3Igbm90LgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBnenVuZ2V0YyBPRigoaW50IGMsIGd6RmlsZSBmaWxlKSk7Ci0vKgotICAgICBQdXNoIG9uZSBjaGFyYWN0ZXIgYmFjayBvbnRvIHRoZSBzdHJlYW0gdG8gYmUgcmVhZCBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyCi0gICBvbiB0aGUgbmV4dCByZWFkLiAgQXQgbGVhc3Qgb25lIGNoYXJhY3RlciBvZiBwdXNoLWJhY2sgaXMgYWxsb3dlZC4KLSAgIGd6dW5nZXRjKCkgcmV0dXJucyB0aGUgY2hhcmFjdGVyIHB1c2hlZCwgb3IgLTEgb24gZmFpbHVyZS4gIGd6dW5nZXRjKCkgd2lsbAotICAgZmFpbCBpZiBjIGlzIC0xLCBhbmQgbWF5IGZhaWwgaWYgYSBjaGFyYWN0ZXIgaGFzIGJlZW4gcHVzaGVkIGJ1dCBub3QgcmVhZAotICAgeWV0LiAgSWYgZ3p1bmdldGMgaXMgdXNlZCBpbW1lZGlhdGVseSBhZnRlciBnem9wZW4gb3IgZ3pkb3BlbiwgYXQgbGVhc3QgdGhlCi0gICBvdXRwdXQgYnVmZmVyIHNpemUgb2YgcHVzaGVkIGNoYXJhY3RlcnMgaXMgYWxsb3dlZC4gIChTZWUgZ3pidWZmZXIgYWJvdmUuKQotICAgVGhlIHB1c2hlZCBjaGFyYWN0ZXIgd2lsbCBiZSBkaXNjYXJkZWQgaWYgdGhlIHN0cmVhbSBpcyByZXBvc2l0aW9uZWQgd2l0aAotICAgZ3pzZWVrKCkgb3IgZ3pyZXdpbmQoKS4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZ3pmbHVzaCBPRigoZ3pGaWxlIGZpbGUsIGludCBmbHVzaCkpOwotLyoKLSAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLiAgVGhlIHBhcmFtZXRlciBmbHVzaAotICAgaXMgYXMgaW4gdGhlIGRlZmxhdGUoKSBmdW5jdGlvbi4gIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHpsaWIgZXJyb3IgbnVtYmVyCi0gICAoc2VlIGZ1bmN0aW9uIGd6ZXJyb3IgYmVsb3cpLiAgZ3pmbHVzaCBpcyBvbmx5IHBlcm1pdHRlZCB3aGVuIHdyaXRpbmcuCi0KLSAgICAgSWYgdGhlIGZsdXNoIHBhcmFtZXRlciBpcyBaX0ZJTklTSCwgdGhlIHJlbWFpbmluZyBkYXRhIGlzIHdyaXR0ZW4gYW5kIHRoZQotICAgZ3ppcCBzdHJlYW0gaXMgY29tcGxldGVkIGluIHRoZSBvdXRwdXQuICBJZiBnendyaXRlKCkgaXMgY2FsbGVkIGFnYWluLCBhIG5ldwotICAgZ3ppcCBzdHJlYW0gd2lsbCBiZSBzdGFydGVkIGluIHRoZSBvdXRwdXQuICBnenJlYWQoKSBpcyBhYmxlIHRvIHJlYWQgc3VjaAotICAgY29uY2F0ZW50ZWQgZ3ppcCBzdHJlYW1zLgotCi0gICAgIGd6Zmx1c2ggc2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4gc3RyaWN0bHkgbmVjZXNzYXJ5IGJlY2F1c2UgaXQgd2lsbAotICAgZGVncmFkZSBjb21wcmVzc2lvbiBpZiBjYWxsZWQgdG9vIG9mdGVuLgotKi8KLQotLyoKLVpFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6c2VlayBPRigoZ3pGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpfb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKSk7Ci0KLSAgICAgU2V0cyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBuZXh0IGd6cmVhZCBvciBnendyaXRlIG9uIHRoZSBnaXZlbgotICAgY29tcHJlc3NlZCBmaWxlLiAgVGhlIG9mZnNldCByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQotICAgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLiAgVGhlIHdoZW5jZSBwYXJhbWV0ZXIgaXMgZGVmaW5lZCBhcyBpbiBsc2VlaygyKTsKLSAgIHRoZSB2YWx1ZSBTRUVLX0VORCBpcyBub3Qgc3VwcG9ydGVkLgotCi0gICAgIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3IgcmVhZGluZywgdGhpcyBmdW5jdGlvbiBpcyBlbXVsYXRlZCBidXQgY2FuIGJlCi0gICBleHRyZW1lbHkgc2xvdy4gIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZywgb25seSBmb3J3YXJkIHNlZWtzIGFyZQotICAgc3VwcG9ydGVkOyBnenNlZWsgdGhlbiBjb21wcmVzc2VzIGEgc2VxdWVuY2Ugb2YgemVyb2VzIHVwIHRvIHRoZSBuZXcKLSAgIHN0YXJ0aW5nIHBvc2l0aW9uLgotCi0gICAgIGd6c2VlayByZXR1cm5zIHRoZSByZXN1bHRpbmcgb2Zmc2V0IGxvY2F0aW9uIGFzIG1lYXN1cmVkIGluIGJ5dGVzIGZyb20KLSAgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVuY29tcHJlc3NlZCBzdHJlYW0sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IsIGluCi0gICBwYXJ0aWN1bGFyIGlmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZyBhbmQgdGhlIG5ldyBzdGFydGluZyBwb3NpdGlvbgotICAgd291bGQgYmUgYmVmb3JlIHRoZSBjdXJyZW50IHBvc2l0aW9uLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnenJld2luZCBPRigoZ3pGaWxlIGZpbGUpKTsKLS8qCi0gICAgIFJld2luZHMgdGhlIGdpdmVuIGZpbGUuIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIG9ubHkgZm9yIHJlYWRpbmcuCi0KLSAgICAgZ3pyZXdpbmQoZmlsZSkgaXMgZXF1aXZhbGVudCB0byAoaW50KWd6c2VlayhmaWxlLCAwTCwgU0VFS19TRVQpCi0qLwotCi0vKgotWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgICAgZ3p0ZWxsIE9GKChnekZpbGUgZmlsZSkpOwotCi0gICAgIFJldHVybnMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBnenJlYWQgb3IgZ3p3cml0ZSBvbiB0aGUgZ2l2ZW4KLSAgIGNvbXByZXNzZWQgZmlsZS4gIFRoaXMgcG9zaXRpb24gcmVwcmVzZW50cyBhIG51bWJlciBvZiBieXRlcyBpbiB0aGUKLSAgIHVuY29tcHJlc3NlZCBkYXRhIHN0cmVhbSwgYW5kIGlzIHplcm8gd2hlbiBzdGFydGluZywgZXZlbiBpZiBhcHBlbmRpbmcgb3IKLSAgIHJlYWRpbmcgYSBnemlwIHN0cmVhbSBmcm9tIHRoZSBtaWRkbGUgb2YgYSBmaWxlIHVzaW5nIGd6ZG9wZW4oKS4KLQotICAgICBnenRlbGwoZmlsZSkgaXMgZXF1aXZhbGVudCB0byBnenNlZWsoZmlsZSwgMEwsIFNFRUtfQ1VSKQotKi8KLQotLyoKLVpFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6b2Zmc2V0IE9GKChnekZpbGUgZmlsZSkpOwotCi0gICAgIFJldHVybnMgdGhlIGN1cnJlbnQgb2Zmc2V0IGluIHRoZSBmaWxlIGJlaW5nIHJlYWQgb3Igd3JpdHRlbi4gIFRoaXMgb2Zmc2V0Ci0gICBpbmNsdWRlcyB0aGUgY291bnQgb2YgYnl0ZXMgdGhhdCBwcmVjZWRlIHRoZSBnemlwIHN0cmVhbSwgZm9yIGV4YW1wbGUgd2hlbgotICAgYXBwZW5kaW5nIG9yIHdoZW4gdXNpbmcgZ3pkb3BlbigpIGZvciByZWFkaW5nLiAgV2hlbiByZWFkaW5nLCB0aGUgb2Zmc2V0Ci0gICBkb2VzIG5vdCBpbmNsdWRlIGFzIHlldCB1bnVzZWQgYnVmZmVyZWQgaW5wdXQuICBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZSB1c2VkCi0gICBmb3IgYSBwcm9ncmVzcyBpbmRpY2F0b3IuICBPbiBlcnJvciwgZ3pvZmZzZXQoKSByZXR1cm5zIC0xLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBnemVvZiBPRigoZ3pGaWxlIGZpbGUpKTsKLS8qCi0gICAgIFJldHVybnMgdHJ1ZSAoMSkgaWYgdGhlIGVuZC1vZi1maWxlIGluZGljYXRvciBoYXMgYmVlbiBzZXQgd2hpbGUgcmVhZGluZywKLSAgIGZhbHNlICgwKSBvdGhlcndpc2UuICBOb3RlIHRoYXQgdGhlIGVuZC1vZi1maWxlIGluZGljYXRvciBpcyBzZXQgb25seSBpZiB0aGUKLSAgIHJlYWQgdHJpZWQgdG8gZ28gcGFzdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCwgYnV0IGNhbWUgdXAgc2hvcnQuICBUaGVyZWZvcmUsCi0gICBqdXN0IGxpa2UgZmVvZigpLCBnemVvZigpIG1heSByZXR1cm4gZmFsc2UgZXZlbiBpZiB0aGVyZSBpcyBubyBtb3JlIGRhdGEgdG8KLSAgIHJlYWQsIGluIHRoZSBldmVudCB0aGF0IHRoZSBsYXN0IHJlYWQgcmVxdWVzdCB3YXMgZm9yIHRoZSBleGFjdCBudW1iZXIgb2YKLSAgIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgd2lsbCBoYXBwZW4gaWYgdGhlIGlucHV0IGZpbGUgc2l6ZQotICAgaXMgYW4gZXhhY3QgbXVsdGlwbGUgb2YgdGhlIGJ1ZmZlciBzaXplLgotCi0gICAgIElmIGd6ZW9mKCkgcmV0dXJucyB0cnVlLCB0aGVuIHRoZSByZWFkIGZ1bmN0aW9ucyB3aWxsIHJldHVybiBubyBtb3JlIGRhdGEsCi0gICB1bmxlc3MgdGhlIGVuZC1vZi1maWxlIGluZGljYXRvciBpcyByZXNldCBieSBnemNsZWFyZXJyKCkgYW5kIHRoZSBpbnB1dCBmaWxlCi0gICBoYXMgZ3Jvd24gc2luY2UgdGhlIHByZXZpb3VzIGVuZCBvZiBmaWxlIHdhcyBkZXRlY3RlZC4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZ3pkaXJlY3QgT0YoKGd6RmlsZSBmaWxlKSk7Ci0vKgotICAgICBSZXR1cm5zIHRydWUgKDEpIGlmIGZpbGUgaXMgYmVpbmcgY29waWVkIGRpcmVjdGx5IHdoaWxlIHJlYWRpbmcsIG9yIGZhbHNlCi0gICAoMCkgaWYgZmlsZSBpcyBhIGd6aXAgc3RyZWFtIGJlaW5nIGRlY29tcHJlc3NlZC4KLQotICAgICBJZiB0aGUgaW5wdXQgZmlsZSBpcyBlbXB0eSwgZ3pkaXJlY3QoKSB3aWxsIHJldHVybiB0cnVlLCBzaW5jZSB0aGUgaW5wdXQKLSAgIGRvZXMgbm90IGNvbnRhaW4gYSBnemlwIHN0cmVhbS4KLQotICAgICBJZiBnemRpcmVjdCgpIGlzIHVzZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZ3pvcGVuKCkgb3IgZ3pkb3BlbigpIGl0IHdpbGwKLSAgIGNhdXNlIGJ1ZmZlcnMgdG8gYmUgYWxsb2NhdGVkIHRvIGFsbG93IHJlYWRpbmcgdGhlIGZpbGUgdG8gZGV0ZXJtaW5lIGlmIGl0Ci0gICBpcyBhIGd6aXAgZmlsZS4gIFRoZXJlZm9yZSBpZiBnemJ1ZmZlcigpIGlzIHVzZWQsIGl0IHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlCi0gICBnemRpcmVjdCgpLgotCi0gICAgIFdoZW4gd3JpdGluZywgZ3pkaXJlY3QoKSByZXR1cm5zIHRydWUgKDEpIGlmIHRyYW5zcGFyZW50IHdyaXRpbmcgd2FzCi0gICByZXF1ZXN0ZWQgKCJ3VCIgZm9yIHRoZSBnem9wZW4oKSBtb2RlKSwgb3IgZmFsc2UgKDApIG90aGVyd2lzZS4gIChOb3RlOgotICAgZ3pkaXJlY3QoKSBpcyBub3QgbmVlZGVkIHdoZW4gd3JpdGluZy4gIFRyYW5zcGFyZW50IHdyaXRpbmcgbXVzdCBiZQotICAgZXhwbGljaXRseSByZXF1ZXN0ZWQsIHNvIHRoZSBhcHBsaWNhdGlvbiBhbHJlYWR5IGtub3dzIHRoZSBhbnN3ZXIuICBXaGVuCi0gICBsaW5raW5nIHN0YXRpY2FsbHksIHVzaW5nIGd6ZGlyZWN0KCkgd2lsbCBpbmNsdWRlIGFsbCBvZiB0aGUgemxpYiBjb2RlIGZvcgotICAgZ3ppcCBmaWxlIHJlYWRpbmcgYW5kIGRlY29tcHJlc3Npb24sIHdoaWNoIG1heSBub3QgYmUgZGVzaXJlZC4pCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUICAgIGd6Y2xvc2UgT0YoKGd6RmlsZSBmaWxlKSk7Ci0vKgotICAgICBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpZiBuZWNlc3NhcnksIGNsb3NlcyB0aGUgY29tcHJlc3NlZCBmaWxlIGFuZAotICAgZGVhbGxvY2F0ZXMgdGhlIChkZSljb21wcmVzc2lvbiBzdGF0ZS4gIE5vdGUgdGhhdCBvbmNlIGZpbGUgaXMgY2xvc2VkLCB5b3UKLSAgIGNhbm5vdCBjYWxsIGd6ZXJyb3Igd2l0aCBmaWxlLCBzaW5jZSBpdHMgc3RydWN0dXJlcyBoYXZlIGJlZW4gZGVhbGxvY2F0ZWQuCi0gICBnemNsb3NlIG11c3Qgbm90IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBmaWxlLCBqdXN0IGFzIGZyZWUKLSAgIG11c3Qgbm90IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBhbGxvY2F0aW9uLgotCi0gICAgIGd6Y2xvc2Ugd2lsbCByZXR1cm4gWl9TVFJFQU1fRVJST1IgaWYgZmlsZSBpcyBub3QgdmFsaWQsIFpfRVJSTk8gb24gYQotICAgZmlsZSBvcGVyYXRpb24gZXJyb3IsIFpfTUVNX0VSUk9SIGlmIG91dCBvZiBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIHRoZQotICAgbGFzdCByZWFkIGVuZGVkIGluIHRoZSBtaWRkbGUgb2YgYSBnemlwIHN0cmVhbSwgb3IgWl9PSyBvbiBzdWNjZXNzLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBnemNsb3NlX3IgT0YoKGd6RmlsZSBmaWxlKSk7Ci1aRVhURVJOIGludCBaRVhQT1JUIGd6Y2xvc2VfdyBPRigoZ3pGaWxlIGZpbGUpKTsKLS8qCi0gICAgIFNhbWUgYXMgZ3pjbG9zZSgpLCBidXQgZ3pjbG9zZV9yKCkgaXMgb25seSBmb3IgdXNlIHdoZW4gcmVhZGluZywgYW5kCi0gICBnemNsb3NlX3coKSBpcyBvbmx5IGZvciB1c2Ugd2hlbiB3cml0aW5nIG9yIGFwcGVuZGluZy4gIFRoZSBhZHZhbnRhZ2UgdG8KLSAgIHVzaW5nIHRoZXNlIGluc3RlYWQgb2YgZ3pjbG9zZSgpIGlzIHRoYXQgdGhleSBhdm9pZCBsaW5raW5nIGluIHpsaWIKLSAgIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gY29kZSB0aGF0IGlzIG5vdCB1c2VkIHdoZW4gb25seSByZWFkaW5nIG9yIG9ubHkKLSAgIHdyaXRpbmcgcmVzcGVjdGl2ZWx5LiAgSWYgZ3pjbG9zZSgpIGlzIHVzZWQsIHRoZW4gYm90aCBjb21wcmVzc2lvbiBhbmQKLSAgIGRlY29tcHJlc3Npb24gY29kZSB3aWxsIGJlIGluY2x1ZGVkIHRoZSBhcHBsaWNhdGlvbiB3aGVuIGxpbmtpbmcgdG8gYSBzdGF0aWMKLSAgIHpsaWIgbGlicmFyeS4KLSovCi0KLVpFWFRFUk4gY29uc3QgY2hhciAqIFpFWFBPUlQgZ3plcnJvciBPRigoZ3pGaWxlIGZpbGUsIGludCAqZXJybnVtKSk7Ci0vKgotICAgICBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgbGFzdCBlcnJvciB3aGljaCBvY2N1cnJlZCBvbiB0aGUgZ2l2ZW4KLSAgIGNvbXByZXNzZWQgZmlsZS4gIGVycm51bSBpcyBzZXQgdG8gemxpYiBlcnJvciBudW1iZXIuICBJZiBhbiBlcnJvciBvY2N1cnJlZAotICAgaW4gdGhlIGZpbGUgc3lzdGVtIGFuZCBub3QgaW4gdGhlIGNvbXByZXNzaW9uIGxpYnJhcnksIGVycm51bSBpcyBzZXQgdG8KLSAgIFpfRVJSTk8gYW5kIHRoZSBhcHBsaWNhdGlvbiBtYXkgY29uc3VsdCBlcnJubyB0byBnZXQgdGhlIGV4YWN0IGVycm9yIGNvZGUuCi0KLSAgICAgVGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90IG1vZGlmeSB0aGUgcmV0dXJuZWQgc3RyaW5nLiAgRnV0dXJlIGNhbGxzIHRvCi0gICB0aGlzIGZ1bmN0aW9uIG1heSBpbnZhbGlkYXRlIHRoZSBwcmV2aW91c2x5IHJldHVybmVkIHN0cmluZy4gIElmIGZpbGUgaXMKLSAgIGNsb3NlZCwgdGhlbiB0aGUgc3RyaW5nIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgZ3plcnJvciB3aWxsIG5vIGxvbmdlciBiZQotICAgYXZhaWxhYmxlLgotCi0gICAgIGd6ZXJyb3IoKSBzaG91bGQgYmUgdXNlZCB0byBkaXN0aW5ndWlzaCBlcnJvcnMgZnJvbSBlbmQtb2YtZmlsZSBmb3IgdGhvc2UKLSAgIGZ1bmN0aW9ucyBhYm92ZSB0aGF0IGRvIG5vdCBkaXN0aW5ndWlzaCB0aG9zZSBjYXNlcyBpbiB0aGVpciByZXR1cm4gdmFsdWVzLgotKi8KLQotWkVYVEVSTiB2b2lkIFpFWFBPUlQgZ3pjbGVhcmVyciBPRigoZ3pGaWxlIGZpbGUpKTsKLS8qCi0gICAgIENsZWFycyB0aGUgZXJyb3IgYW5kIGVuZC1vZi1maWxlIGZsYWdzIGZvciBmaWxlLiAgVGhpcyBpcyBhbmFsb2dvdXMgdG8gdGhlCi0gICBjbGVhcmVycigpIGZ1bmN0aW9uIGluIHN0ZGlvLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNvbnRpbnVpbmcgdG8gcmVhZCBhIGd6aXAKLSAgIGZpbGUgdGhhdCBpcyBiZWluZyB3cml0dGVuIGNvbmN1cnJlbnRseS4KLSovCi0KLSNlbmRpZiAvKiAhWl9TT0xPICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrc3VtIGZ1bmN0aW9ucyAqLwotCi0vKgotICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCByZWxhdGVkIHRvIGNvbXByZXNzaW9uIGJ1dCBhcmUgZXhwb3J0ZWQKLSAgIGFueXdheSBiZWNhdXNlIHRoZXkgbWlnaHQgYmUgdXNlZnVsIGluIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUgY29tcHJlc3Npb24KLSAgIGxpYnJhcnkuCi0qLwotCi1aRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMiBPRigodUxvbmcgYWRsZXIsIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKSk7Ci0vKgotICAgICBVcGRhdGUgYSBydW5uaW5nIEFkbGVyLTMyIGNoZWNrc3VtIHdpdGggdGhlIGJ5dGVzIGJ1ZlswLi5sZW4tMV0gYW5kCi0gICByZXR1cm4gdGhlIHVwZGF0ZWQgY2hlY2tzdW0uICBJZiBidWYgaXMgWl9OVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlCi0gICByZXF1aXJlZCBpbml0aWFsIHZhbHVlIGZvciB0aGUgY2hlY2tzdW0uCi0KLSAgICAgQW4gQWRsZXItMzIgY2hlY2tzdW0gaXMgYWxtb3N0IGFzIHJlbGlhYmxlIGFzIGEgQ1JDMzIgYnV0IGNhbiBiZSBjb21wdXRlZAotICAgbXVjaCBmYXN0ZXIuCi0KLSAgIFVzYWdlIGV4YW1wbGU6Ci0KLSAgICAgdUxvbmcgYWRsZXIgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOwotCi0gICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7Ci0gICAgICAgYWRsZXIgPSBhZGxlcjMyKGFkbGVyLCBidWZmZXIsIGxlbmd0aCk7Ci0gICAgIH0KLSAgICAgaWYgKGFkbGVyICE9IG9yaWdpbmFsX2FkbGVyKSBlcnJvcigpOwotKi8KLQotLyoKLVpFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmUgT0YoKHVMb25nIGFkbGVyMSwgdUxvbmcgYWRsZXIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgel9vZmZfdCBsZW4yKSk7Ci0KLSAgICAgQ29tYmluZSB0d28gQWRsZXItMzIgY2hlY2tzdW1zIGludG8gb25lLiAgRm9yIHR3byBzZXF1ZW5jZXMgb2YgYnl0ZXMsIHNlcTEKLSAgIGFuZCBzZXEyIHdpdGggbGVuZ3RocyBsZW4xIGFuZCBsZW4yLCBBZGxlci0zMiBjaGVja3N1bXMgd2VyZSBjYWxjdWxhdGVkIGZvcgotICAgZWFjaCwgYWRsZXIxIGFuZCBhZGxlcjIuICBhZGxlcjMyX2NvbWJpbmUoKSByZXR1cm5zIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZgotICAgc2VxMSBhbmQgc2VxMiBjb25jYXRlbmF0ZWQsIHJlcXVpcmluZyBvbmx5IGFkbGVyMSwgYWRsZXIyLCBhbmQgbGVuMi4gIE5vdGUKLSAgIHRoYXQgdGhlIHpfb2ZmX3QgdHlwZSAobGlrZSBvZmZfdCkgaXMgYSBzaWduZWQgaW50ZWdlci4gIElmIGxlbjIgaXMKLSAgIG5lZ2F0aXZlLCB0aGUgcmVzdWx0IGhhcyBubyBtZWFuaW5nIG9yIHV0aWxpdHkuCi0qLwotCi1aRVhURVJOIHVMb25nIFpFWFBPUlQgY3JjMzIgICBPRigodUxvbmcgY3JjLCBjb25zdCBCeXRlZiAqYnVmLCB1SW50IGxlbikpOwotLyoKLSAgICAgVXBkYXRlIGEgcnVubmluZyBDUkMtMzIgd2l0aCB0aGUgYnl0ZXMgYnVmWzAuLmxlbi0xXSBhbmQgcmV0dXJuIHRoZQotICAgdXBkYXRlZCBDUkMtMzIuICBJZiBidWYgaXMgWl9OVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVpcmVkCi0gICBpbml0aWFsIHZhbHVlIGZvciB0aGUgY3JjLiAgUHJlLSBhbmQgcG9zdC1jb25kaXRpb25pbmcgKG9uZSdzIGNvbXBsZW1lbnQpIGlzCi0gICBwZXJmb3JtZWQgd2l0aGluIHRoaXMgZnVuY3Rpb24gc28gaXQgc2hvdWxkbid0IGJlIGRvbmUgYnkgdGhlIGFwcGxpY2F0aW9uLgotCi0gICBVc2FnZSBleGFtcGxlOgotCi0gICAgIHVMb25nIGNyYyA9IGNyYzMyKDBMLCBaX05VTEwsIDApOwotCi0gICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7Ci0gICAgICAgY3JjID0gY3JjMzIoY3JjLCBidWZmZXIsIGxlbmd0aCk7Ci0gICAgIH0KLSAgICAgaWYgKGNyYyAhPSBvcmlnaW5hbF9jcmMpIGVycm9yKCk7Ci0qLwotCi0vKgotWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNyYzMyX2NvbWJpbmUgT0YoKHVMb25nIGNyYzEsIHVMb25nIGNyYzIsIHpfb2ZmX3QgbGVuMikpOwotCi0gICAgIENvbWJpbmUgdHdvIENSQy0zMiBjaGVjayB2YWx1ZXMgaW50byBvbmUuICBGb3IgdHdvIHNlcXVlbmNlcyBvZiBieXRlcywKLSAgIHNlcTEgYW5kIHNlcTIgd2l0aCBsZW5ndGhzIGxlbjEgYW5kIGxlbjIsIENSQy0zMiBjaGVjayB2YWx1ZXMgd2VyZQotICAgY2FsY3VsYXRlZCBmb3IgZWFjaCwgY3JjMSBhbmQgY3JjMi4gIGNyYzMyX2NvbWJpbmUoKSByZXR1cm5zIHRoZSBDUkMtMzIKLSAgIGNoZWNrIHZhbHVlIG9mIHNlcTEgYW5kIHNlcTIgY29uY2F0ZW5hdGVkLCByZXF1aXJpbmcgb25seSBjcmMxLCBjcmMyLCBhbmQKLSAgIGxlbjIuCi0qLwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZhcmlvdXMgaGFja3MsIGRvbid0IGxvb2sgOikgKi8KLQotLyogZGVmbGF0ZUluaXQgYW5kIGluZmxhdGVJbml0IGFyZSBtYWNyb3MgdG8gYWxsb3cgY2hlY2tpbmcgdGhlIHpsaWIgdmVyc2lvbgotICogYW5kIHRoZSBjb21waWxlcidzIHZpZXcgb2Ygel9zdHJlYW06Ci0gKi8KLVpFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUluaXRfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSkpOwotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdF8gT0YoKHpfc3RyZWFtcCBzdHJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSkpOwotWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdDJfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50ICBsZXZlbCwgaW50ICBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aW5kb3dCaXRzLCBpbnQgbWVtTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJhdGVneSwgY29uc3QgY2hhciAqdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbV9zaXplKSk7Ci1aRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVJbml0Ml8gT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgIHdpbmRvd0JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSkpOwotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFja0luaXRfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IHdpbmRvd0JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1fc2l6ZSkpOwotI2RlZmluZSBkZWZsYXRlSW5pdChzdHJtLCBsZXZlbCkgXAotICAgICAgICBkZWZsYXRlSW5pdF8oKHN0cm0pLCAobGV2ZWwpLCBaTElCX1ZFUlNJT04sIChpbnQpc2l6ZW9mKHpfc3RyZWFtKSkKLSNkZWZpbmUgaW5mbGF0ZUluaXQoc3RybSkgXAotICAgICAgICBpbmZsYXRlSW5pdF8oKHN0cm0pLCBaTElCX1ZFUlNJT04sIChpbnQpc2l6ZW9mKHpfc3RyZWFtKSkKLSNkZWZpbmUgZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSkgXAotICAgICAgICBkZWZsYXRlSW5pdDJfKChzdHJtKSwobGV2ZWwpLChtZXRob2QpLCh3aW5kb3dCaXRzKSwobWVtTGV2ZWwpLFwKLSAgICAgICAgICAgICAgICAgICAgICAoc3RyYXRlZ3kpLCBaTElCX1ZFUlNJT04sIChpbnQpc2l6ZW9mKHpfc3RyZWFtKSkKLSNkZWZpbmUgaW5mbGF0ZUluaXQyKHN0cm0sIHdpbmRvd0JpdHMpIFwKLSAgICAgICAgaW5mbGF0ZUluaXQyXygoc3RybSksICh3aW5kb3dCaXRzKSwgWkxJQl9WRVJTSU9OLCBcCi0gICAgICAgICAgICAgICAgICAgICAgKGludClzaXplb2Yoel9zdHJlYW0pKQotI2RlZmluZSBpbmZsYXRlQmFja0luaXQoc3RybSwgd2luZG93Qml0cywgd2luZG93KSBcCi0gICAgICAgIGluZmxhdGVCYWNrSW5pdF8oKHN0cm0pLCAod2luZG93Qml0cyksICh3aW5kb3cpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgWkxJQl9WRVJTSU9OLCAoaW50KXNpemVvZih6X3N0cmVhbSkpCi0KLSNpZm5kZWYgWl9TT0xPCi0KLS8qIGd6Z2V0YygpIG1hY3JvIGFuZCBpdHMgc3VwcG9ydGluZyBmdW5jdGlvbiBhbmQgZXhwb3NlZCBkYXRhIHN0cnVjdHVyZS4gIE5vdGUKLSAqIHRoYXQgdGhlIHJlYWwgaW50ZXJuYWwgc3RhdGUgaXMgbXVjaCBsYXJnZXIgdGhhbiB0aGUgZXhwb3NlZCBzdHJ1Y3R1cmUuCi0gKiBUaGlzIGFiYnJldmlhdGVkIHN0cnVjdHVyZSBleHBvc2VzIGp1c3QgZW5vdWdoIGZvciB0aGUgZ3pnZXRjKCkgbWFjcm8uICBUaGUKLSAqIHVzZXIgc2hvdWxkIG5vdCBtZXNzIHdpdGggdGhlc2UgZXhwb3NlZCBlbGVtZW50cywgc2luY2UgdGhlaXIgbmFtZXMgb3IKLSAqIGJlaGF2aW9yIGNvdWxkIGNoYW5nZSBpbiB0aGUgZnV0dXJlLCBwZXJoYXBzIGV2ZW4gY2FwcmljaW91c2x5LiAgVGhleSBjYW4KLSAqIG9ubHkgYmUgdXNlZCBieSB0aGUgZ3pnZXRjKCkgbWFjcm8uICBZb3UgaGF2ZSBiZWVuIHdhcm5lZC4KLSAqLwotc3RydWN0IGd6RmlsZV9zIHsKLSAgICB1bnNpZ25lZCBoYXZlOwotICAgIHVuc2lnbmVkIGNoYXIgKm5leHQ7Ci0gICAgel9vZmY2NF90IHBvczsKLX07Ci1aRVhURVJOIGludCBaRVhQT1JUIGd6Z2V0Y18gT0YoKGd6RmlsZSBmaWxlKSk7ICAvKiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCi0jaWZkZWYgWl9QUkVGSVhfU0VUCi0jICB1bmRlZiB6X2d6Z2V0YwotIyAgZGVmaW5lIHpfZ3pnZXRjKGcpIFwKLSAgICAgICAgICAoKGcpLT5oYXZlID8gKChnKS0+aGF2ZS0tLCAoZyktPnBvcysrLCAqKChnKS0+bmV4dCkrKykgOiBnemdldGMoZykpCi0jZWxzZQotIyAgZGVmaW5lIGd6Z2V0YyhnKSBcCi0gICAgICAgICAgKChnKS0+aGF2ZSA/ICgoZyktPmhhdmUtLSwgKGcpLT5wb3MrKywgKigoZyktPm5leHQpKyspIDogZ3pnZXRjKGcpKQotI2VuZGlmCi0KLS8qIHByb3ZpZGUgNjQtYml0IG9mZnNldCBmdW5jdGlvbnMgaWYgX0xBUkdFRklMRTY0X1NPVVJDRSBkZWZpbmVkLCBhbmQvb3IKLSAqIGNoYW5nZSB0aGUgcmVndWxhciBmdW5jdGlvbnMgdG8gNjQgYml0cyBpZiBfRklMRV9PRkZTRVRfQklUUyBpcyA2NCAoaWYKLSAqIGJvdGggYXJlIHRydWUsIHRoZSBhcHBsaWNhdGlvbiBnZXRzIHRoZSAqNjQgZnVuY3Rpb25zLCBhbmQgdGhlIHJlZ3VsYXIKLSAqIGZ1bmN0aW9ucyBhcmUgY2hhbmdlZCB0byA2NCBiaXRzKSAtLSBpbiBjYXNlIHRoZXNlIGFyZSBzZXQgb24gc3lzdGVtcwotICogd2l0aG91dCBsYXJnZSBmaWxlIHN1cHBvcnQsIF9MRlM2NF9MQVJHRUZJTEUgbXVzdCBhbHNvIGJlIHRydWUKLSAqLwotI2lmZGVmIFpfTEFSR0U2NAotICAgWkVYVEVSTiBnekZpbGUgWkVYUE9SVCBnem9wZW42NCBPRigoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLSAgIFpFWFRFUk4gel9vZmY2NF90IFpFWFBPUlQgZ3pzZWVrNjQgT0YoKGd6RmlsZSwgel9vZmY2NF90LCBpbnQpKTsKLSAgIFpFWFRFUk4gel9vZmY2NF90IFpFWFBPUlQgZ3p0ZWxsNjQgT0YoKGd6RmlsZSkpOwotICAgWkVYVEVSTiB6X29mZjY0X3QgWkVYUE9SVCBnem9mZnNldDY0IE9GKChnekZpbGUpKTsKLSAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmU2NCBPRigodUxvbmcsIHVMb25nLCB6X29mZjY0X3QpKTsKLSAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lNjQgT0YoKHVMb25nLCB1TG9uZywgel9vZmY2NF90KSk7Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkKFpMSUJfSU5URVJOQUwpICYmIGRlZmluZWQoWl9XQU5UNjQpCi0jICBpZmRlZiBaX1BSRUZJWF9TRVQKLSMgICAgZGVmaW5lIHpfZ3pvcGVuIHpfZ3pvcGVuNjQKLSMgICAgZGVmaW5lIHpfZ3pzZWVrIHpfZ3pzZWVrNjQKLSMgICAgZGVmaW5lIHpfZ3p0ZWxsIHpfZ3p0ZWxsNjQKLSMgICAgZGVmaW5lIHpfZ3pvZmZzZXQgel9nem9mZnNldDY0Ci0jICAgIGRlZmluZSB6X2FkbGVyMzJfY29tYmluZSB6X2FkbGVyMzJfY29tYmluZTY0Ci0jICAgIGRlZmluZSB6X2NyYzMyX2NvbWJpbmUgel9jcmMzMl9jb21iaW5lNjQKLSMgIGVsc2UKLSMgICAgZGVmaW5lIGd6b3BlbiBnem9wZW42NAotIyAgICBkZWZpbmUgZ3pzZWVrIGd6c2VlazY0Ci0jICAgIGRlZmluZSBnenRlbGwgZ3p0ZWxsNjQKLSMgICAgZGVmaW5lIGd6b2Zmc2V0IGd6b2Zmc2V0NjQKLSMgICAgZGVmaW5lIGFkbGVyMzJfY29tYmluZSBhZGxlcjMyX2NvbWJpbmU2NAotIyAgICBkZWZpbmUgY3JjMzJfY29tYmluZSBjcmMzMl9jb21iaW5lNjQKLSMgIGVuZGlmCi0jICBpZm5kZWYgWl9MQVJHRTY0Ci0gICAgIFpFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pvcGVuNjQgT0YoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci0gICAgIFpFWFRFUk4gb2ZmNjRfdCBaRVhQT1JUIGd6c2VlazY0IE9GKChnekZpbGUsIG9mZjY0X3QsIGludCkpOwotICAgICBaRVhURVJOIG9mZjY0X3QgWkVYUE9SVCBnenRlbGw2NCBPRigoZ3pGaWxlKSk7Ci0gICAgIFpFWFRFUk4gel9vZmY2NF90IFpFWFBPUlQgZ3pvZmZzZXQ2NCBPRigoZ3pGaWxlKSk7Ci0gICAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmU2NCBPRigodUxvbmcsIHVMb25nLCBvZmY2NF90KSk7Ci0gICAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lNjQgT0YoKHVMb25nLCB1TG9uZywgb2ZmNjRfdCkpOwotIyAgZW5kaWYKLSNlbHNlCi0gICBaRVhURVJOIGd6RmlsZSBaRVhQT1JUIGd6b3BlbiBPRigoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLSAgIFpFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6c2VlayBPRigoZ3pGaWxlLCB6X29mZl90LCBpbnQpKTsKLSAgIFpFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6dGVsbCBPRigoZ3pGaWxlKSk7Ci0gICBaRVhURVJOIHpfb2ZmX3QgWkVYUE9SVCBnem9mZnNldCBPRigoZ3pGaWxlKSk7Ci0gICBaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMl9jb21iaW5lIE9GKCh1TG9uZywgdUxvbmcsIHpfb2ZmX3QpKTsKLSAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lIE9GKCh1TG9uZywgdUxvbmcsIHpfb2ZmX3QpKTsKLSNlbmRpZgotCi0jZWxzZSAvKiBaX1NPTE8gKi8KLQotICAgWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGFkbGVyMzJfY29tYmluZSBPRigodUxvbmcsIHVMb25nLCB6X29mZl90KSk7Ci0gICBaRVhURVJOIHVMb25nIFpFWFBPUlQgY3JjMzJfY29tYmluZSBPRigodUxvbmcsIHVMb25nLCB6X29mZl90KSk7Ci0KLSNlbmRpZiAvKiAhWl9TT0xPICovCi0KLS8qIGhhY2sgZm9yIGJ1Z2d5IGNvbXBpbGVycyAqLwotI2lmICFkZWZpbmVkKFpVVElMX0gpICYmICFkZWZpbmVkKE5PX0RVTU1ZX0RFQ0wpCi0gICAgc3RydWN0IGludGVybmFsX3N0YXRlIHtpbnQgZHVtbXk7fTsKLSNlbmRpZgotCi0vKiB1bmRvY3VtZW50ZWQgZnVuY3Rpb25zICovCi1aRVhURVJOIGNvbnN0IGNoYXIgICAqIFpFWFBPUlQgekVycm9yICAgICAgICAgICBPRigoaW50KSk7Ci1aRVhURVJOIGludCAgICAgICAgICAgIFpFWFBPUlQgaW5mbGF0ZVN5bmNQb2ludCBPRigoel9zdHJlYW1wKSk7Ci1aRVhURVJOIGNvbnN0IHpfY3JjX3QgRkFSICogWkVYUE9SVCBnZXRfY3JjX3RhYmxlICAgIE9GKCh2b2lkKSk7Ci1aRVhURVJOIGludCAgICAgICAgICAgIFpFWFBPUlQgaW5mbGF0ZVVuZGVybWluZSBPRigoel9zdHJlYW1wLCBpbnQpKTsKLVpFWFRFUk4gaW50ICAgICAgICAgICAgWkVYUE9SVCBpbmZsYXRlUmVzZXRLZWVwIE9GKCh6X3N0cmVhbXApKTsKLVpFWFRFUk4gaW50ICAgICAgICAgICAgWkVYUE9SVCBkZWZsYXRlUmVzZXRLZWVwIE9GKCh6X3N0cmVhbXApKTsKLSNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoWl9TT0xPKQotWkVYVEVSTiBnekZpbGUgICAgICAgICBaRVhQT1JUIGd6b3Blbl93IE9GKChjb25zdCB3Y2hhcl90ICpwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2RlKSk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFNUREMpIHx8IGRlZmluZWQoWl9IQVZFX1NUREFSR19IKQotIyAgaWZuZGVmIFpfU09MTwotWkVYVEVSTiBpbnQgICAgICAgICAgICBaRVhQT1JUVkEgZ3p2cHJpbnRmIFpfQVJHKChnekZpbGUgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IHZhKSk7Ci0jICBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBaTElCX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvcGRmaXVtZmRybS5tayBiL2NvcmUvcGRmaXVtZmRybS5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjc5MTIyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9wZGZpdW1mZHJtLm1rCkBAIC0wLDAgKzEsMjkgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFOj0gbGlicGRmaXVtZmRybQorCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KK0xPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBnbnVzdGxfc3RhdGljCisKK0xPQ0FMX0NGTEFHUyArPSAtTzMgLWZzdHJpY3QtYWxpYXNpbmcgLWZwcmVmZXRjaC1sb29wLWFycmF5cyAtZmV4Y2VwdGlvbnMKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW5vbi12aXJ0dWFsLWR0b3IgLVdhbGwgLURPUEpfU1RBVElDIFwKKyAgICAgICAgICAgICAgICAtRFY4X0RFUFJFQ0FUSU9OX1dBUk5JTkdTIC1EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKKworIyBNYXNrIHNvbWUgd2FybmluZ3MuIFRoZXNlIGFyZSBiZW5pZ24sIGJ1dCB3ZSBwcm9iYWJseSB3YW50IHRvIGZpeCB0aGVtCisjIHVwc3RyZWFtIGF0IHNvbWUgcG9pbnQuCitMT0NBTF9DRkxBR1MgKz0gLVduby1zaWduLWNvbXBhcmUgLVduby11bnVzZWQtcGFyYW1ldGVyCitMT0NBTF9DTEFOR19DRkxBR1MgKz0gLVduby1zaWduLWNvbXBhcmUKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBzcmMvZmRybS9jcnlwdG8vZnhfY3J5cHQuY3BwIFwKKyAgICBzcmMvZmRybS9jcnlwdG8vZnhfY3J5cHRfYWVzLmNwcCBcCisgICAgc3JjL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0X3NoYS5jcHAKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgZXh0ZXJuYWwvcGRmaXVtIFwKKyAgICBleHRlcm5hbC9mcmVldHlwZS9pbmNsdWRlIFwKKyAgICBleHRlcm5hbC9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2NvcmUvcGRmaXVtZnBkZmFwaS5tayBiL2NvcmUvcGRmaXVtZnBkZmFwaS5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmJmMDA4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9wZGZpdW1mcGRmYXBpLm1rCkBAIC0wLDAgKzEsMTIwIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRTo9IGxpYnBkZml1bWZwZGZhcGkKKworTE9DQUxfQVJNX01PREUgOj0gYXJtCitMT0NBTF9OREtfU1RMX1ZBUklBTlQgOj0gZ251c3RsX3N0YXRpYworCitMT0NBTF9DRkxBR1MgKz0gLU8zIC1mc3RyaWN0LWFsaWFzaW5nIC1mcHJlZmV0Y2gtbG9vcC1hcnJheXMgLWZleGNlcHRpb25zCitMT0NBTF9DRkxBR1MgKz0gLVduby1ub24tdmlydHVhbC1kdG9yIC1XYWxsIC1ET1BKX1NUQVRJQyBcCisgICAgICAgICAgICAgICAgLURWOF9ERVBSRUNBVElPTl9XQVJOSU5HUyAtRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCisKKyMgTWFzayBzb21lIHdhcm5pbmdzLiBUaGVzZSBhcmUgYmVuaWduLCBidXQgd2UgcHJvYmFibHkgd2FudCB0byBmaXggdGhlbQorIyB1cHN0cmVhbSBhdCBzb21lIHBvaW50LgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tc2lnbi1jb21wYXJlIC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzCitMT0NBTF9DTEFOR19DRkxBR1MgKz0gLVduby1zaWduLWNvbXBhcmUKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2Jhc2ljX21vZHVsZS5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9BZG9iZS1DTlMxLVVDUzJfNS5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9CNXBjLUhfMC5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9CNXBjLVZfMC5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9DTlMtRVVDLUhfMC5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9DTlMtRVVDLVZfMC5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9FVGVuLUI1LUhfMC5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9FVGVuLUI1LVZfMC5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9FVGVubXMtQjUtSF8wLmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0VUZW5tcy1CNS1WXzAuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvSEtzY3MtQjUtSF81LmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0hLc2NzLUI1LVZfNS5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9VbmlDTlMtVUNTMi1IXzMuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvVW5pQ05TLVVDUzItVl8zLmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL1VuaUNOUy1VVEYxNi1IXzAuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvY21hcHNfY25zMS5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL0Fkb2JlLUdCMS1VQ1MyXzUuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9HQi1FVUMtSF8wLmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0ItRVVDLVZfMC5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL0dCSy1FVUMtSF8yLmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0JLLUVVQy1WXzIuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9HQksySy1IXzUuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9HQksySy1WXzUuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9HQktwLUVVQy1IXzIuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9HQktwLUVVQy1WXzIuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9HQnBjLUVVQy1IXzAuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9HQnBjLUVVQy1WXzAuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9VbmlHQi1VQ1MyLUhfNC5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL1VuaUdCLVVDUzItVl80LmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvY21hcHNfZ2IxLmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvODNwdi1SS1NKLUhfMS5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xLzkwbXMtUktTSi1IXzIuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS85MG1zLVJLU0otVl8yLmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvOTBtc3AtUktTSi1IXzIuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS85MG1zcC1SS1NKLVZfMi5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xLzkwcHYtUktTSi1IXzEuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9BZGQtUktTSi1IXzEuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9BZGQtUktTSi1WXzEuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9BZG9iZS1KYXBhbjEtVUNTMl80LmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvRVVDLUhfMS5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL0VVQy1WXzEuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9FeHQtUktTSi1IXzIuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9FeHQtUktTSi1WXzIuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9IXzEuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9VbmlKSVMtVUNTMi1IVy1IXzQuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9VbmlKSVMtVUNTMi1IVy1WXzQuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9VbmlKSVMtVUNTMi1IXzQuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9VbmlKSVMtVUNTMi1WXzQuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9WXzEuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9jbWFwc19qYXBhbjEuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9BZG9iZS1Lb3JlYTEtVUNTMl8yLmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvS1NDLUVVQy1IXzAuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9LU0MtRVVDLVZfMC5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL0tTQ21zLVVIQy1IVy1IXzEuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9LU0Ntcy1VSEMtSFctVl8xLmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvS1NDbXMtVUhDLUhfMS5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL0tTQ21zLVVIQy1WXzEuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9LU0NwYy1FVUMtSF8wLmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvVW5pS1MtVUNTMi1IXzEuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9VbmlLUy1VQ1MyLVZfMS5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL1VuaUtTLVVURjE2LUhfMC5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL2NtYXBzX2tvcmVhMS5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfY21hcHMvZnBkZl9jbWFwcy5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfY29udGVudC5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfY3JlYXRlLmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9kb2MuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2ltYWdlLmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZwZGZfZm9udC5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnRfY2hhcnNldC5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnRfY2lkLmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9mb250L3R0Z3N1YnRhYmxlLmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZS5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfY29sb3JzLmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9kb2MuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2Z1bmMuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2dyYXBoX3N0YXRlLmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9pbWFnZS5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGFyc2VyLmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXJzZXJfb2xkLmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXRoLmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXR0ZXJuLmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlLmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZG9jdW1lbnQuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9lbmNyeXB0LmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZmRmLmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfb2JqZWN0cy5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX3BhcnNlci5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX3V0aWxpdHkuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlci5jcHAgXAorICAgIHNyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2NhY2hlLmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfaW1hZ2UuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9sb2FkaW1hZ2UuY3BwIFwKKyAgICBzcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9wYXR0ZXJuLmNwcCBcCisgICAgc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfdGV4dC5jcHAKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgZXh0ZXJuYWwvcGRmaXVtIFwKKyAgICBleHRlcm5hbC9mcmVldHlwZS9pbmNsdWRlIFwKKyAgICBleHRlcm5hbC9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2NvcmUvcGRmaXVtZnBkZmRvYy5tayBiL2NvcmUvcGRmaXVtZnBkZmRvYy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGZmYzNhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9wZGZpdW1mcGRmZG9jLm1rCkBAIC0wLDAgKzEsNDIgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFOj0gbGlicGRmaXVtZnBkZmRvYworCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KK0xPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBnbnVzdGxfc3RhdGljCisKK0xPQ0FMX0NGTEFHUyArPSAtTzMgLWZzdHJpY3QtYWxpYXNpbmcgLWZwcmVmZXRjaC1sb29wLWFycmF5cyAtZmV4Y2VwdGlvbnMKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW5vbi12aXJ0dWFsLWR0b3IgLVdhbGwgLURPUEpfU1RBVElDIFwKKyAgICAgICAgICAgICAgICAtRFY4X0RFUFJFQ0FUSU9OX1dBUk5JTkdTIC1EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKKworIyBNYXNrIHNvbWUgd2FybmluZ3MuIFRoZXNlIGFyZSBiZW5pZ24sIGJ1dCB3ZSBwcm9iYWJseSB3YW50IHRvIGZpeCB0aGVtCisjIHVwc3RyZWFtIGF0IHNvbWUgcG9pbnQuCitMT0NBTF9DRkxBR1MgKz0gLVduby1zaWduLWNvbXBhcmUgLVduby11bnVzZWQtcGFyYW1ldGVyCitMT0NBTF9DTEFOR19DRkxBR1MgKz0gLVduby1zaWduLWNvbXBhcmUKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBzcmMvZnBkZmRvYy9kb2NfYWN0aW9uLmNwcCBcCisgICAgc3JjL2ZwZGZkb2MvZG9jX2Fubm90LmNwcCBcCisgICAgc3JjL2ZwZGZkb2MvZG9jX2FwLmNwcCBcCisgICAgc3JjL2ZwZGZkb2MvZG9jX2Jhc2ljLmNwcCBcCisgICAgc3JjL2ZwZGZkb2MvZG9jX2Jvb2ttYXJrLmNwcCBcCisgICAgc3JjL2ZwZGZkb2MvZG9jX2Zvcm0uY3BwIFwKKyAgICBzcmMvZnBkZmRvYy9kb2NfZm9ybWNvbnRyb2wuY3BwIFwKKyAgICBzcmMvZnBkZmRvYy9kb2NfZm9ybWZpZWxkLmNwcCBcCisgICAgc3JjL2ZwZGZkb2MvZG9jX2xpbmsuY3BwIFwKKyAgICBzcmMvZnBkZmRvYy9kb2NfbWV0YWRhdGEuY3BwIFwKKyAgICBzcmMvZnBkZmRvYy9kb2Nfb2NnLmNwcCBcCisgICAgc3JjL2ZwZGZkb2MvZG9jX3RhZ2dlZC5jcHAgXAorICAgIHNyYy9mcGRmZG9jL2RvY191dGlscy5jcHAgXAorICAgIHNyYy9mcGRmZG9jL2RvY192aWV3ZXJQcmVmZXJlbmNlcy5jcHAgXAorICAgIHNyYy9mcGRmZG9jL2RvY192dC5jcHAgXAorICAgIHNyYy9mcGRmZG9jL2RvY192dG1vZHVsZS5jcHAKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgZXh0ZXJuYWwvcGRmaXVtIFwKKyAgICBleHRlcm5hbC9mcmVldHlwZS9pbmNsdWRlIFwKKyAgICBleHRlcm5hbC9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2NvcmUvcGRmaXVtZnBkZnRleHQubWsgYi9jb3JlL3BkZml1bWZwZGZ0ZXh0Lm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNmM1ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3BkZml1bWZwZGZ0ZXh0Lm1rCkBAIC0wLDAgKzEsMzEgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFOj0gbGlicGRmaXVtZnBkZnRleHQKKworTE9DQUxfQVJNX01PREUgOj0gYXJtCitMT0NBTF9OREtfU1RMX1ZBUklBTlQgOj0gZ251c3RsX3N0YXRpYworCitMT0NBTF9DRkxBR1MgKz0gLU8zIC1mc3RyaWN0LWFsaWFzaW5nIC1mcHJlZmV0Y2gtbG9vcC1hcnJheXMgLWZleGNlcHRpb25zCitMT0NBTF9DRkxBR1MgKz0gLVduby1ub24tdmlydHVhbC1kdG9yIC1XYWxsIC1ET1BKX1NUQVRJQyBcCisgICAgICAgICAgICAgICAgLURWOF9ERVBSRUNBVElPTl9XQVJOSU5HUyAtRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCisKKyMgTWFzayBzb21lIHdhcm5pbmdzLiBUaGVzZSBhcmUgYmVuaWduLCBidXQgd2UgcHJvYmFibHkgd2FudCB0byBmaXggdGhlbQorIyB1cHN0cmVhbSBhdCBzb21lIHBvaW50LgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tc2lnbi1jb21wYXJlIC1Xbm8tdW51c2VkLXBhcmFtZXRlcgorTE9DQUxfQ0xBTkdfQ0ZMQUdTICs9IC1Xbm8tc2lnbi1jb21wYXJlCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dC5jcHAgXAorICAgIHNyYy9mcGRmdGV4dC9mcGRmX3RleHRfaW50LmNwcCBcCisgICAgc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dF9zZWFyY2guY3BwIFwKKyAgICBzcmMvZnBkZnRleHQvdW5pY29kZW5vcm1hbGl6YXRpb24uY3BwIFwKKyAgICBzcmMvZnBkZnRleHQvdW5pY29kZW5vcm1hbGl6YXRpb25kYXRhLmNwcCBcCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgIGV4dGVybmFsL3BkZml1bSBcCisgICAgZXh0ZXJuYWwvZnJlZXR5cGUvaW5jbHVkZSBcCisgICAgZXh0ZXJuYWwvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZQorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9jb3JlL3BkZml1bWZ4Y29kZWMubWsgYi9jb3JlL3BkZml1bWZ4Y29kZWMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEwYzUwZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcGRmaXVtZnhjb2RlYy5tawpAQCAtMCwwICsxLDUyIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRTo9IGxpYnBkZml1bWZ4Y29kZWMKKworTE9DQUxfQVJNX01PREUgOj0gYXJtCitMT0NBTF9OREtfU1RMX1ZBUklBTlQgOj0gZ251c3RsX3N0YXRpYworCitMT0NBTF9DRkxBR1MgKz0gLU8zIC1mc3RyaWN0LWFsaWFzaW5nIC1mcHJlZmV0Y2gtbG9vcC1hcnJheXMgLWZleGNlcHRpb25zCitMT0NBTF9DRkxBR1MgKz0gLVduby1ub24tdmlydHVhbC1kdG9yIC1XYWxsIC1ET1BKX1NUQVRJQyBcCisgICAgICAgICAgICAgICAgLURWOF9ERVBSRUNBVElPTl9XQVJOSU5HUyAtRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCisKKyMgTWFzayBzb21lIHdhcm5pbmdzLiBUaGVzZSBhcmUgYmVuaWduLCBidXQgd2UgcHJvYmFibHkgd2FudCB0byBmaXggdGhlbQorIyB1cHN0cmVhbSBhdCBzb21lIHBvaW50LgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tc2lnbi1jb21wYXJlIC1Xbm8tcG9pbnRlci10by1pbnQtY2FzdCAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX0NMQU5HX0NGTEFHUyArPSAtV25vLXNpZ24tY29tcGFyZQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYnoKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBzcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlYy5jcHAgXAorICAgIHNyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZheC5jcHAgXAorICAgIHNyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZsYXRlLmNwcCBcCisgICAgc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfaWNjLmNwcCBcCisgICAgc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfamJpZy5jcHAgXAorICAgIHNyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pwZWcuY3BwIFwKKyAgICBzcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qcHhfb3BqLmNwcCBcCisgICAgc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQXJpdGhEZWNvZGVyLmNwcCBcCisgICAgc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQXJpdGhJbnREZWNvZGVyLmNwcCBcCisgICAgc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQml0U3RyZWFtLmNwcCBcCisgICAgc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQ29udGV4dC5jcHAgXAorICAgIHNyYy9meGNvZGVjL2piaWcyL0pCaWcyX0dyZFByb2MuY3BwIFwKKyAgICBzcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HcnJkUHJvYy5jcHAgXAorICAgIHNyYy9meGNvZGVjL2piaWcyL0pCaWcyX0dzaWRQcm9jLmNwcCBcCisgICAgc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHRyZFByb2MuY3BwIFwKKyAgICBzcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuRGVjb2Rlci5jcHAgXAorICAgIHNyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5UYWJsZS5jcHAgXAorICAgIHNyYy9meGNvZGVjL2piaWcyL0pCaWcyX0ltYWdlLmNwcCBcCisgICAgc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfUGF0dGVybkRpY3QuY3BwIFwKKyAgICBzcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9QZGRQcm9jLmNwcCBcCisgICAgc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU2RkUHJvYy5jcHAgXAorICAgIHNyYy9meGNvZGVjL2piaWcyL0pCaWcyX1NlZ21lbnQuY3BwIFwKKyAgICBzcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TeW1ib2xEaWN0LmNwcCBcCisgICAgc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfVHJkUHJvYy5jcHAKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgZXh0ZXJuYWwvcGRmaXVtIFwKKyAgICBleHRlcm5hbC9mcmVldHlwZS9pbmNsdWRlIFwKKyAgICBleHRlcm5hbC9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2NvcmUvcGRmaXVtZnhjcnQubWsgYi9jb3JlL3BkZml1bWZ4Y3J0Lm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MmRkNWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3BkZml1bWZ4Y3J0Lm1rCkBAIC0wLDAgKzEsNDggQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFOj0gbGlicGRmaXVtZnhjcnQKKworTE9DQUxfQVJNX01PREUgOj0gYXJtCitMT0NBTF9OREtfU1RMX1ZBUklBTlQgOj0gZ251c3RsX3N0YXRpYworCitMT0NBTF9DRkxBR1MgKz0gLU8zIC1mc3RyaWN0LWFsaWFzaW5nIC1mcHJlZmV0Y2gtbG9vcC1hcnJheXMgLWZleGNlcHRpb25zCitMT0NBTF9DRkxBR1MgKz0gLVduby1ub24tdmlydHVhbC1kdG9yIC1XYWxsIC1ET1BKX1NUQVRJQyBcCisgICAgICAgICAgICAgICAgLURWOF9ERVBSRUNBVElPTl9XQVJOSU5HUyAtRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCitMT0NBTF9DRkxBR1NfYXJtNjQgKz0gLURfRlhfQ1BVXz1fRlhfWDY0XyAtZlBJQworCisjIE1hc2sgc29tZSB3YXJuaW5ncy4gVGhlc2UgYXJlIGJlbmlnbiwgYnV0IHdlIHByb2JhYmx5IHdhbnQgdG8gZml4IHRoZW0KKyMgdXBzdHJlYW0gYXQgc29tZSBwb2ludC4KK0xPQ0FMX0NGTEFHUyArPSAtV25vLXNpZ24tY29tcGFyZSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX0NMQU5HX0NGTEFHUyArPSAtV25vLXNpZ24tY29tcGFyZQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIHNyYy9meGNydC9meF9iYXNpY19hcnJheS5jcHAgXAorICAgIHNyYy9meGNydC9meF9iYXNpY19ic3RyaW5nLmNwcCBcCisgICAgc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2J1ZmZlci5jcHAgXAorICAgIHNyYy9meGNydC9meF9iYXNpY19jb29yZHMuY3BwIFwKKyAgICBzcmMvZnhjcnQvZnhfYmFzaWNfZ2NjLmNwcCBcCisgICAgc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2xpc3QuY3BwIFwKKyAgICBzcmMvZnhjcnQvZnhfYmFzaWNfbWFwcy5jcHAgXAorICAgIHNyYy9meGNydC9meF9iYXNpY19tZW1tZ3IuY3BwIFwKKyAgICBzcmMvZnhjcnQvZnhfYmFzaWNfcGxleC5jcHAgXAorICAgIHNyYy9meGNydC9meF9iYXNpY191dGYuY3BwIFwKKyAgICBzcmMvZnhjcnQvZnhfYmFzaWNfdXRpbC5jcHAgXAorICAgIHNyYy9meGNydC9meF9iYXNpY193c3RyaW5nLmNwcCBcCisgICAgc3JjL2Z4Y3J0L2Z4X2JpZGkuY3BwIFwKKyAgICBzcmMvZnhjcnQvZnhfZXh0ZW5zaW9uLmNwcCBcCisgICAgc3JjL2Z4Y3J0L2Z4X3VjZGRhdGEuY3BwIFwKKyAgICBzcmMvZnhjcnQvZnhfdW5pY29kZS5jcHAgXAorICAgIHNyYy9meGNydC9meF94bWxfY29tcG9zZXIuY3BwIFwKKyAgICBzcmMvZnhjcnQvZnhfeG1sX3BhcnNlci5jcHAgXAorICAgIHNyYy9meGNydC9meGNydF9wbGF0Zm9ybXMuY3BwIFwKKyAgICBzcmMvZnhjcnQvZnhjcnRfcG9zaXguY3BwIFwKKyAgICBzcmMvZnhjcnQvZnhjcnRfd2luZG93cy5jcHAKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgZXh0ZXJuYWwvcGRmaXVtIFwKKyAgICBleHRlcm5hbC9mcmVldHlwZS9pbmNsdWRlIFwKKyAgICBleHRlcm5hbC9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2NvcmUvcGRmaXVtZnhnZS5tayBiL2NvcmUvcGRmaXVtZnhnZS5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTEyNzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9wZGZpdW1meGdlLm1rCkBAIC0wLDAgKzEsNjUgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFOj0gbGlicGRmaXVtZnhnZQorCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KK0xPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBnbnVzdGxfc3RhdGljCisKK0xPQ0FMX0NGTEFHUyArPSAtTzMgLWZzdHJpY3QtYWxpYXNpbmcgLWZwcmVmZXRjaC1sb29wLWFycmF5cyAtZmV4Y2VwdGlvbnMKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW5vbi12aXJ0dWFsLWR0b3IgLVdhbGwgLURPUEpfU1RBVElDIFwKKyAgICAgICAgICAgICAgICAtRFY4X0RFUFJFQ0FUSU9OX1dBUk5JTkdTIC1EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKKworIyBNYXNrIHNvbWUgd2FybmluZ3MuIFRoZXNlIGFyZSBiZW5pZ24sIGJ1dCB3ZSBwcm9iYWJseSB3YW50IHRvIGZpeCB0aGVtCisjIHVwc3RyZWFtIGF0IHNvbWUgcG9pbnQuCitMT0NBTF9DRkxBR1MgKz0gLVduby1zaWduLWNvbXBhcmUgLVduby11bnVzZWQtcGFyYW1ldGVyCitMT0NBTF9DTEFOR19DRkxBR1MgKz0gLVduby1zaWduLWNvbXBhcmUgLVduby1zd2l0Y2gKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBzcmMvZnhnZS9hZ2cvc3JjL2Z4X2FnZ19kcml2ZXIuY3BwIFwKKyAgICBzcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udC5jcHAgXAorICAgIHNyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFmb250bWdyLmNwcCBcCisgICAgc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYW1vZHVsZS5jcHAgXAorICAgIHNyYy9meGdlL2FuZHJvaWQvZnhfYW5kcm9pZF9mb250LmNwcCBcCisgICAgc3JjL2Z4Z2UvYW5kcm9pZC9meF9hbmRyb2lkX2ltcC5jcHAgXAorICAgIHNyYy9meGdlL2FwcGxlL2Z4X2FwcGxlX3BsYXRmb3JtLmNwcCBcCisgICAgc3JjL2Z4Z2UvYXBwbGUvZnhfbWFjX2ltcC5jcHAgXAorICAgIHNyYy9meGdlL2FwcGxlL2Z4X3F1YXJ0el9kZXZpY2UuY3BwIFwKKyAgICBzcmMvZnhnZS9kaWIvZnhfZGliX2NvbXBvc2l0ZS5jcHAgXAorICAgIHNyYy9meGdlL2RpYi9meF9kaWJfY29udmVydC5jcHAgXAorICAgIHNyYy9meGdlL2RpYi9meF9kaWJfZW5naW5lLmNwcCBcCisgICAgc3JjL2Z4Z2UvZGliL2Z4X2RpYl9tYWluLmNwcCBcCisgICAgc3JjL2Z4Z2UvZGliL2Z4X2RpYl90cmFuc2Zvcm0uY3BwIFwKKyAgICBzcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdERpbmdiYXRzLmMgXAorICAgIHNyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0Rml4ZWQuYyBcCisgICAgc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRGaXhlZEJvbGQuYyBcCisgICAgc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRGaXhlZEJvbGRJdGFsaWMuYyBcCisgICAgc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRGaXhlZEl0YWxpYy5jIFwKKyAgICBzcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdFNhbnMuYyBcCisgICAgc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTYW5zQm9sZC5jIFwKKyAgICBzcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdFNhbnNCb2xkSXRhbGljLmMgXAorICAgIHNyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0U2Fuc0l0YWxpYy5jIFwKKyAgICBzcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdFNhbnNNTS5jIFwKKyAgICBzcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdFNlcmlmLmMgXAorICAgIHNyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0U2VyaWZCb2xkLmMgXAorICAgIHNyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0U2VyaWZCb2xkSXRhbGljLmMgXAorICAgIHNyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0U2VyaWZJdGFsaWMuYyBcCisgICAgc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTZXJpZk1NLmMgXAorICAgIHNyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0U3ltYm9sLmMgXAorICAgIHNyYy9meGdlL2ZyZWV0eXBlL2Z4X2ZyZWV0eXBlLmMgXAorICAgIHNyYy9meGdlL2dlL2Z4X2dlLmNwcCBcCisgICAgc3JjL2Z4Z2UvZ2UvZnhfZ2VfZGV2aWNlLmNwcCBcCisgICAgc3JjL2Z4Z2UvZ2UvZnhfZ2VfZm9udC5jcHAgXAorICAgIHNyYy9meGdlL2dlL2Z4X2dlX2ZvbnRtYXAuY3BwIFwKKyAgICBzcmMvZnhnZS9nZS9meF9nZV9saW51eC5jcHAgXAorICAgIHNyYy9meGdlL2dlL2Z4X2dlX3BhdGguY3BwIFwKKyAgICBzcmMvZnhnZS9nZS9meF9nZV9wcy5jcHAgXAorICAgIHNyYy9meGdlL2dlL2Z4X2dlX3RleHQuY3BwCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgIGV4dGVybmFsL3BkZml1bSBcCisgICAgZXh0ZXJuYWwvZnJlZXR5cGUvaW5jbHVkZSBcCisgICAgZXh0ZXJuYWwvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZQorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mZHJtL2NyeXB0by9meF9jcnlwdC5jcHAgYi9jb3JlL3NyYy9mZHJtL2NyeXB0by9meF9jcnlwdC5jcHAKaW5kZXggMWZiYmE5OS4uYzEwMTZjZCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZmRybS9jcnlwdG8vZnhfY3J5cHQuY3BwCisrKyBiL2NvcmUvc3JjL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0LmNwcApAQCAtMSwyNjAgKzEsMjU5IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mZHJtL2Z4X2NyeXB0LmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vc3JjL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZmRybS9meF9jcnlwdC5oIgogCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCiBzdHJ1Y3QgcmM0X3N0YXRlIHsKLSAgICBpbnQgeCwgeSwgbVsyNTZdOworICBpbnQgeCwgeSwgbVsyNTZdOwogfTsKLXZvaWQgQ1JZUFRfQXJjRm91clNldHVwKHZvaWQqIGNvbnRleHQsICBGWF9MUENCWVRFIGtleSwgIEZYX0RXT1JEIGxlbmd0aCApCi17Ci0gICAgcmM0X3N0YXRlICpzID0gKHJjNF9zdGF0ZSopY29udGV4dDsKLSAgICBpbnQgaSwgaiwgaywgKm0sIGE7Ci0gICAgcy0+eCA9IDA7Ci0gICAgcy0+eSA9IDA7Ci0gICAgbSA9IHMtPm07Ci0gICAgZm9yKCBpID0gMDsgaSA8IDI1NjsgaSsrICkgewotICAgICAgICBtW2ldID0gaTsKK3ZvaWQgQ1JZUFRfQXJjRm91clNldHVwKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIGtleSwgRlhfRFdPUkQgbGVuZ3RoKSB7CisgIHJjNF9zdGF0ZSogcyA9IChyYzRfc3RhdGUqKWNvbnRleHQ7CisgIGludCBpLCBqLCBrLCAqbSwgYTsKKyAgcy0+eCA9IDA7CisgIHMtPnkgPSAwOworICBtID0gcy0+bTsKKyAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgbVtpXSA9IGk7CisgIH0KKyAgaiA9IGsgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICBhID0gbVtpXTsKKyAgICBqID0gKGogKyBhICsga2V5W2tdKSAmIDB4RkY7CisgICAgbVtpXSA9IG1bal07CisgICAgbVtqXSA9IGE7CisgICAgaWYgKCsrayA+PSAoaW50KWxlbmd0aCkgeworICAgICAgayA9IDA7CiAgICAgfQotICAgIGogPSBrID0gMDsKLSAgICBmb3IoIGkgPSAwOyBpIDwgMjU2OyBpKysgKSB7Ci0gICAgICAgIGEgPSBtW2ldOwotICAgICAgICBqID0gKCBqICsgYSArIGtleVtrXSApICYgMHhGRjsKLSAgICAgICAgbVtpXSA9IG1bal07Ci0gICAgICAgIG1bal0gPSBhOwotICAgICAgICBpZiggKytrID49IChpbnQpbGVuZ3RoICkgewotICAgICAgICAgICAgayA9IDA7Ci0gICAgICAgIH0KLSAgICB9CisgIH0KIH0KLXZvaWQgQ1JZUFRfQXJjRm91ckNyeXB0KHZvaWQqIGNvbnRleHQsIHVuc2lnbmVkIGNoYXIgKmRhdGEsIEZYX0RXT1JEIGxlbmd0aCApCi17Ci0gICAgc3RydWN0IHJjNF9zdGF0ZSogcyA9IChzdHJ1Y3QgcmM0X3N0YXRlKiljb250ZXh0OwotICAgIGludCBpLCB4LCB5LCAqbSwgYSwgYjsKLSAgICB4ID0gcy0+eDsKLSAgICB5ID0gcy0+eTsKLSAgICBtID0gcy0+bTsKLSAgICBmb3IoIGkgPSAwOyBpIDwgKGludClsZW5ndGg7IGkrKyApIHsKLSAgICAgICAgeCA9ICggeCArIDEgKSAmIDB4RkY7Ci0gICAgICAgIGEgPSBtW3hdOwotICAgICAgICB5ID0gKCB5ICsgYSApICYgMHhGRjsKLSAgICAgICAgbVt4XSA9IGIgPSBtW3ldOwotICAgICAgICBtW3ldID0gYTsKLSAgICAgICAgZGF0YVtpXSBePSBtWyggYSArIGIgKSAmIDB4RkZdOwotICAgIH0KLSAgICBzLT54ID0geDsKLSAgICBzLT55ID0geTsKK3ZvaWQgQ1JZUFRfQXJjRm91ckNyeXB0KHZvaWQqIGNvbnRleHQsIHVuc2lnbmVkIGNoYXIqIGRhdGEsIEZYX0RXT1JEIGxlbmd0aCkgeworICBzdHJ1Y3QgcmM0X3N0YXRlKiBzID0gKHN0cnVjdCByYzRfc3RhdGUqKWNvbnRleHQ7CisgIGludCBpLCB4LCB5LCAqbSwgYSwgYjsKKyAgeCA9IHMtPng7CisgIHkgPSBzLT55OworICBtID0gcy0+bTsKKyAgZm9yIChpID0gMDsgaSA8IChpbnQpbGVuZ3RoOyBpKyspIHsKKyAgICB4ID0gKHggKyAxKSAmIDB4RkY7CisgICAgYSA9IG1beF07CisgICAgeSA9ICh5ICsgYSkgJiAweEZGOworICAgIG1beF0gPSBiID0gbVt5XTsKKyAgICBtW3ldID0gYTsKKyAgICBkYXRhW2ldIF49IG1bKGEgKyBiKSAmIDB4RkZdOworICB9CisgIHMtPnggPSB4OworICBzLT55ID0geTsKIH0KLXZvaWQgQ1JZUFRfQXJjRm91ckNyeXB0QmxvY2soRlhfTFBCWVRFIHBEYXRhLCBGWF9EV09SRCBzaXplLCBGWF9MUENCWVRFIGtleSwgRlhfRFdPUkQga2V5bGVuKQotewotICAgIHJjNF9zdGF0ZSBzOwotICAgIENSWVBUX0FyY0ZvdXJTZXR1cCgmcywga2V5LCBrZXlsZW4pOwotICAgIENSWVBUX0FyY0ZvdXJDcnlwdCgmcywgcERhdGEsIHNpemUpOwordm9pZCBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayh1aW50OF90KiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCoga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBrZXlsZW4pIHsKKyAgcmM0X3N0YXRlIHM7CisgIENSWVBUX0FyY0ZvdXJTZXR1cCgmcywga2V5LCBrZXlsZW4pOworICBDUllQVF9BcmNGb3VyQ3J5cHQoJnMsIHBEYXRhLCBzaXplKTsKIH0KIHN0cnVjdCBtZDVfY29udGV4dCB7Ci0gICAgRlhfRFdPUkQgdG90YWxbMl07Ci0gICAgRlhfRFdPUkQgc3RhdGVbNF07Ci0gICAgRlhfQllURSBidWZmZXJbNjRdOworICBGWF9EV09SRCB0b3RhbFsyXTsKKyAgRlhfRFdPUkQgc3RhdGVbNF07CisgIHVpbnQ4X3QgYnVmZmVyWzY0XTsKIH07Ci0jZGVmaW5lIEdFVF9GWF9EV09SRChuLGIsaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKG4pID0gKEZYX0RXT1JEKSAoKEZYX0JZVEUgKikgYilbKGkpXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgfCAoKChGWF9EV09SRCkgKChGWF9CWVRFICopIGIpWyhpKSsxXSkgPDwgIDgpICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIHwgKCgoRlhfRFdPUkQpICgoRlhfQllURSAqKSBiKVsoaSkrMl0pIDw8IDE2KSAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICB8ICgoKEZYX0RXT1JEKSAoKEZYX0JZVEUgKikgYilbKGkpKzNdKSA8PCAyNCk7ICAgICAgICAgICAgICAgIFwKLSAgICB9Ci0jZGVmaW5lIFBVVF9GWF9EV09SRChuLGIsaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKCgoRlhfQllURSAqKSBiKVsoaSldICApID0gKEZYX0JZVEUpICgoKG4pICAgICAgKSAmIDB4RkYpOyAgICAgIFwKLSAgICAgICAgKCgoRlhfQllURSAqKSBiKVsoaSkrMV0pID0gKEZYX0JZVEUpICgoKG4pID4+ICA4KSAmIDB4RkYpOyAgICAgIFwKLSAgICAgICAgKCgoRlhfQllURSAqKSBiKVsoaSkrMl0pID0gKEZYX0JZVEUpICgoKG4pID4+IDE2KSAmIDB4RkYpOyAgICAgIFwKLSAgICAgICAgKCgoRlhfQllURSAqKSBiKVsoaSkrM10pID0gKEZYX0JZVEUpICgoKG4pID4+IDI0KSAmIDB4RkYpOyAgICAgIFwKLSAgICB9Ci12b2lkIG1kNV9wcm9jZXNzKCBzdHJ1Y3QgbWQ1X2NvbnRleHQgKmN0eCwgY29uc3QgRlhfQllURSBkYXRhWzY0XSApCi17Ci0gICAgRlhfRFdPUkQgQSwgQiwgQywgRCwgWFsxNl07Ci0gICAgR0VUX0ZYX0RXT1JEKCBYWzBdLCAgZGF0YSwgIDAgKTsKLSAgICBHRVRfRlhfRFdPUkQoIFhbMV0sICBkYXRhLCAgNCApOwotICAgIEdFVF9GWF9EV09SRCggWFsyXSwgIGRhdGEsICA4ICk7Ci0gICAgR0VUX0ZYX0RXT1JEKCBYWzNdLCAgZGF0YSwgMTIgKTsKLSAgICBHRVRfRlhfRFdPUkQoIFhbNF0sICBkYXRhLCAxNiApOwotICAgIEdFVF9GWF9EV09SRCggWFs1XSwgIGRhdGEsIDIwICk7Ci0gICAgR0VUX0ZYX0RXT1JEKCBYWzZdLCAgZGF0YSwgMjQgKTsKLSAgICBHRVRfRlhfRFdPUkQoIFhbN10sICBkYXRhLCAyOCApOwotICAgIEdFVF9GWF9EV09SRCggWFs4XSwgIGRhdGEsIDMyICk7Ci0gICAgR0VUX0ZYX0RXT1JEKCBYWzldLCAgZGF0YSwgMzYgKTsKLSAgICBHRVRfRlhfRFdPUkQoIFhbMTBdLCBkYXRhLCA0MCApOwotICAgIEdFVF9GWF9EV09SRCggWFsxMV0sIGRhdGEsIDQ0ICk7Ci0gICAgR0VUX0ZYX0RXT1JEKCBYWzEyXSwgZGF0YSwgNDggKTsKLSAgICBHRVRfRlhfRFdPUkQoIFhbMTNdLCBkYXRhLCA1MiApOwotICAgIEdFVF9GWF9EV09SRCggWFsxNF0sIGRhdGEsIDU2ICk7Ci0gICAgR0VUX0ZYX0RXT1JEKCBYWzE1XSwgZGF0YSwgNjAgKTsKLSNkZWZpbmUgUyh4LG4pICgoeCA8PCBuKSB8ICgoeCAmIDB4RkZGRkZGRkYpID4+ICgzMiAtIG4pKSkKLSNkZWZpbmUgUChhLGIsYyxkLGsscyx0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBhICs9IEYoYixjLGQpICsgWFtrXSArIHQ7IGEgPSBTKGEscykgKyBiOyAgICAgICAgICAgXAotICAgIH0KLSAgICBBID0gY3R4LT5zdGF0ZVswXTsKLSAgICBCID0gY3R4LT5zdGF0ZVsxXTsKLSAgICBDID0gY3R4LT5zdGF0ZVsyXTsKLSAgICBEID0gY3R4LT5zdGF0ZVszXTsKLSNkZWZpbmUgRih4LHkseikgKHogXiAoeCAmICh5IF4geikpKQotICAgIFAoIEEsIEIsIEMsIEQsICAwLCAgNywgMHhENzZBQTQ3OCApOwotICAgIFAoIEQsIEEsIEIsIEMsICAxLCAxMiwgMHhFOEM3Qjc1NiApOwotICAgIFAoIEMsIEQsIEEsIEIsICAyLCAxNywgMHgyNDIwNzBEQiApOwotICAgIFAoIEIsIEMsIEQsIEEsICAzLCAyMiwgMHhDMUJEQ0VFRSApOwotICAgIFAoIEEsIEIsIEMsIEQsICA0LCAgNywgMHhGNTdDMEZBRiApOwotICAgIFAoIEQsIEEsIEIsIEMsICA1LCAxMiwgMHg0Nzg3QzYyQSApOwotICAgIFAoIEMsIEQsIEEsIEIsICA2LCAxNywgMHhBODMwNDYxMyApOwotICAgIFAoIEIsIEMsIEQsIEEsICA3LCAyMiwgMHhGRDQ2OTUwMSApOwotICAgIFAoIEEsIEIsIEMsIEQsICA4LCAgNywgMHg2OTgwOThEOCApOwotICAgIFAoIEQsIEEsIEIsIEMsICA5LCAxMiwgMHg4QjQ0RjdBRiApOwotICAgIFAoIEMsIEQsIEEsIEIsIDEwLCAxNywgMHhGRkZGNUJCMSApOwotICAgIFAoIEIsIEMsIEQsIEEsIDExLCAyMiwgMHg4OTVDRDdCRSApOwotICAgIFAoIEEsIEIsIEMsIEQsIDEyLCAgNywgMHg2QjkwMTEyMiApOwotICAgIFAoIEQsIEEsIEIsIEMsIDEzLCAxMiwgMHhGRDk4NzE5MyApOwotICAgIFAoIEMsIEQsIEEsIEIsIDE0LCAxNywgMHhBNjc5NDM4RSApOwotICAgIFAoIEIsIEMsIEQsIEEsIDE1LCAyMiwgMHg0OUI0MDgyMSApOworI2RlZmluZSBHRVRfRlhfRFdPUkQobiwgYiwgaSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKG4pID0gKEZYX0RXT1JEKSgodWludDhfdCopYilbKGkpXSB8ICAgICAgICAgICAgICAgXAorICAgICAgICAgICgoKEZYX0RXT1JEKSgodWludDhfdCopYilbKGkpICsgMV0pIDw8IDgpIHwgIFwKKyAgICAgICAgICAoKChGWF9EV09SRCkoKHVpbnQ4X3QqKWIpWyhpKSArIDJdKSA8PCAxNikgfCBcCisgICAgICAgICAgKCgoRlhfRFdPUkQpKCh1aW50OF90KiliKVsoaSkgKyAzXSkgPDwgMjQpOyAgXAorICB9CisjZGVmaW5lIFBVVF9GWF9EV09SRChuLCBiLCBpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKHVpbnQ4X3QqKWIpWyhpKV0pID0gKHVpbnQ4X3QpKCgobikpICYgMHhGRik7ICAgICAgICAgICBcCisgICAgKCgodWludDhfdCopYilbKGkpICsgMV0pID0gKHVpbnQ4X3QpKCgobikgPj4gOCkgJiAweEZGKTsgIFwKKyAgICAoKCh1aW50OF90KiliKVsoaSkgKyAyXSkgPSAodWludDhfdCkoKChuKSA+PiAxNikgJiAweEZGKTsgXAorICAgICgoKHVpbnQ4X3QqKWIpWyhpKSArIDNdKSA9ICh1aW50OF90KSgoKG4pID4+IDI0KSAmIDB4RkYpOyBcCisgIH0KK3ZvaWQgbWQ1X3Byb2Nlc3Moc3RydWN0IG1kNV9jb250ZXh0KiBjdHgsIGNvbnN0IHVpbnQ4X3QgZGF0YVs2NF0pIHsKKyAgRlhfRFdPUkQgQSwgQiwgQywgRCwgWFsxNl07CisgIEdFVF9GWF9EV09SRChYWzBdLCBkYXRhLCAwKTsKKyAgR0VUX0ZYX0RXT1JEKFhbMV0sIGRhdGEsIDQpOworICBHRVRfRlhfRFdPUkQoWFsyXSwgZGF0YSwgOCk7CisgIEdFVF9GWF9EV09SRChYWzNdLCBkYXRhLCAxMik7CisgIEdFVF9GWF9EV09SRChYWzRdLCBkYXRhLCAxNik7CisgIEdFVF9GWF9EV09SRChYWzVdLCBkYXRhLCAyMCk7CisgIEdFVF9GWF9EV09SRChYWzZdLCBkYXRhLCAyNCk7CisgIEdFVF9GWF9EV09SRChYWzddLCBkYXRhLCAyOCk7CisgIEdFVF9GWF9EV09SRChYWzhdLCBkYXRhLCAzMik7CisgIEdFVF9GWF9EV09SRChYWzldLCBkYXRhLCAzNik7CisgIEdFVF9GWF9EV09SRChYWzEwXSwgZGF0YSwgNDApOworICBHRVRfRlhfRFdPUkQoWFsxMV0sIGRhdGEsIDQ0KTsKKyAgR0VUX0ZYX0RXT1JEKFhbMTJdLCBkYXRhLCA0OCk7CisgIEdFVF9GWF9EV09SRChYWzEzXSwgZGF0YSwgNTIpOworICBHRVRfRlhfRFdPUkQoWFsxNF0sIGRhdGEsIDU2KTsKKyAgR0VUX0ZYX0RXT1JEKFhbMTVdLCBkYXRhLCA2MCk7CisjZGVmaW5lIFMoeCwgbikgKCh4IDw8IG4pIHwgKCh4ICYgMHhGRkZGRkZGRikgPj4gKDMyIC0gbikpKQorI2RlZmluZSBQKGEsIGIsIGMsIGQsIGssIHMsIHQpICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhICs9IEYoYiwgYywgZCkgKyBYW2tdICsgdDsgXAorICAgIGEgPSBTKGEsIHMpICsgYjsgICAgICAgICAgICBcCisgIH0KKyAgQSA9IGN0eC0+c3RhdGVbMF07CisgIEIgPSBjdHgtPnN0YXRlWzFdOworICBDID0gY3R4LT5zdGF0ZVsyXTsKKyAgRCA9IGN0eC0+c3RhdGVbM107CisjZGVmaW5lIEYoeCwgeSwgeikgKHogXiAoeCAmICh5IF4geikpKQorICBQKEEsIEIsIEMsIEQsIDAsIDcsIDB4RDc2QUE0NzgpOworICBQKEQsIEEsIEIsIEMsIDEsIDEyLCAweEU4QzdCNzU2KTsKKyAgUChDLCBELCBBLCBCLCAyLCAxNywgMHgyNDIwNzBEQik7CisgIFAoQiwgQywgRCwgQSwgMywgMjIsIDB4QzFCRENFRUUpOworICBQKEEsIEIsIEMsIEQsIDQsIDcsIDB4RjU3QzBGQUYpOworICBQKEQsIEEsIEIsIEMsIDUsIDEyLCAweDQ3ODdDNjJBKTsKKyAgUChDLCBELCBBLCBCLCA2LCAxNywgMHhBODMwNDYxMyk7CisgIFAoQiwgQywgRCwgQSwgNywgMjIsIDB4RkQ0Njk1MDEpOworICBQKEEsIEIsIEMsIEQsIDgsIDcsIDB4Njk4MDk4RDgpOworICBQKEQsIEEsIEIsIEMsIDksIDEyLCAweDhCNDRGN0FGKTsKKyAgUChDLCBELCBBLCBCLCAxMCwgMTcsIDB4RkZGRjVCQjEpOworICBQKEIsIEMsIEQsIEEsIDExLCAyMiwgMHg4OTVDRDdCRSk7CisgIFAoQSwgQiwgQywgRCwgMTIsIDcsIDB4NkI5MDExMjIpOworICBQKEQsIEEsIEIsIEMsIDEzLCAxMiwgMHhGRDk4NzE5Myk7CisgIFAoQywgRCwgQSwgQiwgMTQsIDE3LCAweEE2Nzk0MzhFKTsKKyAgUChCLCBDLCBELCBBLCAxNSwgMjIsIDB4NDlCNDA4MjEpOwogI3VuZGVmIEYKLSNkZWZpbmUgRih4LHkseikgKHkgXiAoeiAmICh4IF4geSkpKQotICAgIFAoIEEsIEIsIEMsIEQsICAxLCAgNSwgMHhGNjFFMjU2MiApOwotICAgIFAoIEQsIEEsIEIsIEMsICA2LCAgOSwgMHhDMDQwQjM0MCApOwotICAgIFAoIEMsIEQsIEEsIEIsIDExLCAxNCwgMHgyNjVFNUE1MSApOwotICAgIFAoIEIsIEMsIEQsIEEsICAwLCAyMCwgMHhFOUI2QzdBQSApOwotICAgIFAoIEEsIEIsIEMsIEQsICA1LCAgNSwgMHhENjJGMTA1RCApOwotICAgIFAoIEQsIEEsIEIsIEMsIDEwLCAgOSwgMHgwMjQ0MTQ1MyApOwotICAgIFAoIEMsIEQsIEEsIEIsIDE1LCAxNCwgMHhEOEExRTY4MSApOwotICAgIFAoIEIsIEMsIEQsIEEsICA0LCAyMCwgMHhFN0QzRkJDOCApOwotICAgIFAoIEEsIEIsIEMsIEQsICA5LCAgNSwgMHgyMUUxQ0RFNiApOwotICAgIFAoIEQsIEEsIEIsIEMsIDE0LCAgOSwgMHhDMzM3MDdENiApOwotICAgIFAoIEMsIEQsIEEsIEIsICAzLCAxNCwgMHhGNEQ1MEQ4NyApOwotICAgIFAoIEIsIEMsIEQsIEEsICA4LCAyMCwgMHg0NTVBMTRFRCApOwotICAgIFAoIEEsIEIsIEMsIEQsIDEzLCAgNSwgMHhBOUUzRTkwNSApOwotICAgIFAoIEQsIEEsIEIsIEMsICAyLCAgOSwgMHhGQ0VGQTNGOCApOwotICAgIFAoIEMsIEQsIEEsIEIsICA3LCAxNCwgMHg2NzZGMDJEOSApOwotICAgIFAoIEIsIEMsIEQsIEEsIDEyLCAyMCwgMHg4RDJBNEM4QSApOworI2RlZmluZSBGKHgsIHksIHopICh5IF4gKHogJiAoeCBeIHkpKSkKKyAgUChBLCBCLCBDLCBELCAxLCA1LCAweEY2MUUyNTYyKTsKKyAgUChELCBBLCBCLCBDLCA2LCA5LCAweEMwNDBCMzQwKTsKKyAgUChDLCBELCBBLCBCLCAxMSwgMTQsIDB4MjY1RTVBNTEpOworICBQKEIsIEMsIEQsIEEsIDAsIDIwLCAweEU5QjZDN0FBKTsKKyAgUChBLCBCLCBDLCBELCA1LCA1LCAweEQ2MkYxMDVEKTsKKyAgUChELCBBLCBCLCBDLCAxMCwgOSwgMHgwMjQ0MTQ1Myk7CisgIFAoQywgRCwgQSwgQiwgMTUsIDE0LCAweEQ4QTFFNjgxKTsKKyAgUChCLCBDLCBELCBBLCA0LCAyMCwgMHhFN0QzRkJDOCk7CisgIFAoQSwgQiwgQywgRCwgOSwgNSwgMHgyMUUxQ0RFNik7CisgIFAoRCwgQSwgQiwgQywgMTQsIDksIDB4QzMzNzA3RDYpOworICBQKEMsIEQsIEEsIEIsIDMsIDE0LCAweEY0RDUwRDg3KTsKKyAgUChCLCBDLCBELCBBLCA4LCAyMCwgMHg0NTVBMTRFRCk7CisgIFAoQSwgQiwgQywgRCwgMTMsIDUsIDB4QTlFM0U5MDUpOworICBQKEQsIEEsIEIsIEMsIDIsIDksIDB4RkNFRkEzRjgpOworICBQKEMsIEQsIEEsIEIsIDcsIDE0LCAweDY3NkYwMkQ5KTsKKyAgUChCLCBDLCBELCBBLCAxMiwgMjAsIDB4OEQyQTRDOEEpOwogI3VuZGVmIEYKLSNkZWZpbmUgRih4LHkseikgKHggXiB5IF4geikKLSAgICBQKCBBLCBCLCBDLCBELCAgNSwgIDQsIDB4RkZGQTM5NDIgKTsKLSAgICBQKCBELCBBLCBCLCBDLCAgOCwgMTEsIDB4ODc3MUY2ODEgKTsKLSAgICBQKCBDLCBELCBBLCBCLCAxMSwgMTYsIDB4NkQ5RDYxMjIgKTsKLSAgICBQKCBCLCBDLCBELCBBLCAxNCwgMjMsIDB4RkRFNTM4MEMgKTsKLSAgICBQKCBBLCBCLCBDLCBELCAgMSwgIDQsIDB4QTRCRUVBNDQgKTsKLSAgICBQKCBELCBBLCBCLCBDLCAgNCwgMTEsIDB4NEJERUNGQTkgKTsKLSAgICBQKCBDLCBELCBBLCBCLCAgNywgMTYsIDB4RjZCQjRCNjAgKTsKLSAgICBQKCBCLCBDLCBELCBBLCAxMCwgMjMsIDB4QkVCRkJDNzAgKTsKLSAgICBQKCBBLCBCLCBDLCBELCAxMywgIDQsIDB4Mjg5QjdFQzYgKTsKLSAgICBQKCBELCBBLCBCLCBDLCAgMCwgMTEsIDB4RUFBMTI3RkEgKTsKLSAgICBQKCBDLCBELCBBLCBCLCAgMywgMTYsIDB4RDRFRjMwODUgKTsKLSAgICBQKCBCLCBDLCBELCBBLCAgNiwgMjMsIDB4MDQ4ODFEMDUgKTsKLSAgICBQKCBBLCBCLCBDLCBELCAgOSwgIDQsIDB4RDlENEQwMzkgKTsKLSAgICBQKCBELCBBLCBCLCBDLCAxMiwgMTEsIDB4RTZEQjk5RTUgKTsKLSAgICBQKCBDLCBELCBBLCBCLCAxNSwgMTYsIDB4MUZBMjdDRjggKTsKLSAgICBQKCBCLCBDLCBELCBBLCAgMiwgMjMsIDB4QzRBQzU2NjUgKTsKKyNkZWZpbmUgRih4LCB5LCB6KSAoeCBeIHkgXiB6KQorICBQKEEsIEIsIEMsIEQsIDUsIDQsIDB4RkZGQTM5NDIpOworICBQKEQsIEEsIEIsIEMsIDgsIDExLCAweDg3NzFGNjgxKTsKKyAgUChDLCBELCBBLCBCLCAxMSwgMTYsIDB4NkQ5RDYxMjIpOworICBQKEIsIEMsIEQsIEEsIDE0LCAyMywgMHhGREU1MzgwQyk7CisgIFAoQSwgQiwgQywgRCwgMSwgNCwgMHhBNEJFRUE0NCk7CisgIFAoRCwgQSwgQiwgQywgNCwgMTEsIDB4NEJERUNGQTkpOworICBQKEMsIEQsIEEsIEIsIDcsIDE2LCAweEY2QkI0QjYwKTsKKyAgUChCLCBDLCBELCBBLCAxMCwgMjMsIDB4QkVCRkJDNzApOworICBQKEEsIEIsIEMsIEQsIDEzLCA0LCAweDI4OUI3RUM2KTsKKyAgUChELCBBLCBCLCBDLCAwLCAxMSwgMHhFQUExMjdGQSk7CisgIFAoQywgRCwgQSwgQiwgMywgMTYsIDB4RDRFRjMwODUpOworICBQKEIsIEMsIEQsIEEsIDYsIDIzLCAweDA0ODgxRDA1KTsKKyAgUChBLCBCLCBDLCBELCA5LCA0LCAweEQ5RDREMDM5KTsKKyAgUChELCBBLCBCLCBDLCAxMiwgMTEsIDB4RTZEQjk5RTUpOworICBQKEMsIEQsIEEsIEIsIDE1LCAxNiwgMHgxRkEyN0NGOCk7CisgIFAoQiwgQywgRCwgQSwgMiwgMjMsIDB4QzRBQzU2NjUpOwogI3VuZGVmIEYKLSNkZWZpbmUgRih4LHkseikgKHkgXiAoeCB8IH56KSkKLSAgICBQKCBBLCBCLCBDLCBELCAgMCwgIDYsIDB4RjQyOTIyNDQgKTsKLSAgICBQKCBELCBBLCBCLCBDLCAgNywgMTAsIDB4NDMyQUZGOTcgKTsKLSAgICBQKCBDLCBELCBBLCBCLCAxNCwgMTUsIDB4QUI5NDIzQTcgKTsKLSAgICBQKCBCLCBDLCBELCBBLCAgNSwgMjEsIDB4RkM5M0EwMzkgKTsKLSAgICBQKCBBLCBCLCBDLCBELCAxMiwgIDYsIDB4NjU1QjU5QzMgKTsKLSAgICBQKCBELCBBLCBCLCBDLCAgMywgMTAsIDB4OEYwQ0NDOTIgKTsKLSAgICBQKCBDLCBELCBBLCBCLCAxMCwgMTUsIDB4RkZFRkY0N0QgKTsKLSAgICBQKCBCLCBDLCBELCBBLCAgMSwgMjEsIDB4ODU4NDVERDEgKTsKLSAgICBQKCBBLCBCLCBDLCBELCAgOCwgIDYsIDB4NkZBODdFNEYgKTsKLSAgICBQKCBELCBBLCBCLCBDLCAxNSwgMTAsIDB4RkUyQ0U2RTAgKTsKLSAgICBQKCBDLCBELCBBLCBCLCAgNiwgMTUsIDB4QTMwMTQzMTQgKTsKLSAgICBQKCBCLCBDLCBELCBBLCAxMywgMjEsIDB4NEUwODExQTEgKTsKLSAgICBQKCBBLCBCLCBDLCBELCAgNCwgIDYsIDB4Rjc1MzdFODIgKTsKLSAgICBQKCBELCBBLCBCLCBDLCAxMSwgMTAsIDB4QkQzQUYyMzUgKTsKLSAgICBQKCBDLCBELCBBLCBCLCAgMiwgMTUsIDB4MkFEN0QyQkIgKTsKLSAgICBQKCBCLCBDLCBELCBBLCAgOSwgMjEsIDB4RUI4NkQzOTEgKTsKKyNkZWZpbmUgRih4LCB5LCB6KSAoeSBeICh4IHwgfnopKQorICBQKEEsIEIsIEMsIEQsIDAsIDYsIDB4RjQyOTIyNDQpOworICBQKEQsIEEsIEIsIEMsIDcsIDEwLCAweDQzMkFGRjk3KTsKKyAgUChDLCBELCBBLCBCLCAxNCwgMTUsIDB4QUI5NDIzQTcpOworICBQKEIsIEMsIEQsIEEsIDUsIDIxLCAweEZDOTNBMDM5KTsKKyAgUChBLCBCLCBDLCBELCAxMiwgNiwgMHg2NTVCNTlDMyk7CisgIFAoRCwgQSwgQiwgQywgMywgMTAsIDB4OEYwQ0NDOTIpOworICBQKEMsIEQsIEEsIEIsIDEwLCAxNSwgMHhGRkVGRjQ3RCk7CisgIFAoQiwgQywgRCwgQSwgMSwgMjEsIDB4ODU4NDVERDEpOworICBQKEEsIEIsIEMsIEQsIDgsIDYsIDB4NkZBODdFNEYpOworICBQKEQsIEEsIEIsIEMsIDE1LCAxMCwgMHhGRTJDRTZFMCk7CisgIFAoQywgRCwgQSwgQiwgNiwgMTUsIDB4QTMwMTQzMTQpOworICBQKEIsIEMsIEQsIEEsIDEzLCAyMSwgMHg0RTA4MTFBMSk7CisgIFAoQSwgQiwgQywgRCwgNCwgNiwgMHhGNzUzN0U4Mik7CisgIFAoRCwgQSwgQiwgQywgMTEsIDEwLCAweEJEM0FGMjM1KTsKKyAgUChDLCBELCBBLCBCLCAyLCAxNSwgMHgyQUQ3RDJCQik7CisgIFAoQiwgQywgRCwgQSwgOSwgMjEsIDB4RUI4NkQzOTEpOwogI3VuZGVmIEYKLSAgICBjdHgtPnN0YXRlWzBdICs9IEE7Ci0gICAgY3R4LT5zdGF0ZVsxXSArPSBCOwotICAgIGN0eC0+c3RhdGVbMl0gKz0gQzsKLSAgICBjdHgtPnN0YXRlWzNdICs9IEQ7CisgIGN0eC0+c3RhdGVbMF0gKz0gQTsKKyAgY3R4LT5zdGF0ZVsxXSArPSBCOworICBjdHgtPnN0YXRlWzJdICs9IEM7CisgIGN0eC0+c3RhdGVbM10gKz0gRDsKIH0KLXZvaWQgQ1JZUFRfTUQ1U3RhcnQodm9pZCogY29udGV4dCkKLXsKLSAgICBzdHJ1Y3QgbWQ1X2NvbnRleHQgKmN0eCA9IChzdHJ1Y3QgbWQ1X2NvbnRleHQqKWNvbnRleHQ7Ci0gICAgY3R4LT50b3RhbFswXSA9IDA7Ci0gICAgY3R4LT50b3RhbFsxXSA9IDA7Ci0gICAgY3R4LT5zdGF0ZVswXSA9IDB4Njc0NTIzMDE7Ci0gICAgY3R4LT5zdGF0ZVsxXSA9IDB4RUZDREFCODk7Ci0gICAgY3R4LT5zdGF0ZVsyXSA9IDB4OThCQURDRkU7Ci0gICAgY3R4LT5zdGF0ZVszXSA9IDB4MTAzMjU0NzY7Cit2b2lkIENSWVBUX01ENVN0YXJ0KHZvaWQqIGNvbnRleHQpIHsKKyAgc3RydWN0IG1kNV9jb250ZXh0KiBjdHggPSAoc3RydWN0IG1kNV9jb250ZXh0Kiljb250ZXh0OworICBjdHgtPnRvdGFsWzBdID0gMDsKKyAgY3R4LT50b3RhbFsxXSA9IDA7CisgIGN0eC0+c3RhdGVbMF0gPSAweDY3NDUyMzAxOworICBjdHgtPnN0YXRlWzFdID0gMHhFRkNEQUI4OTsKKyAgY3R4LT5zdGF0ZVsyXSA9IDB4OThCQURDRkU7CisgIGN0eC0+c3RhdGVbM10gPSAweDEwMzI1NDc2OwogfQotdm9pZCBDUllQVF9NRDVVcGRhdGUoRlhfTFBWT0lEIHBjdHgsIEZYX0xQQ0JZVEUgaW5wdXQsIEZYX0RXT1JEIGxlbmd0aCApCi17Ci0gICAgc3RydWN0IG1kNV9jb250ZXh0ICpjdHggPSAoc3RydWN0IG1kNV9jb250ZXh0ICopcGN0eDsKLSAgICBGWF9EV09SRCBsZWZ0LCBmaWxsOwotICAgIGlmKCAhIGxlbmd0aCApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsZWZ0ID0gKCBjdHgtPnRvdGFsWzBdID4+IDMgKSAmIDB4M0Y7Ci0gICAgZmlsbCA9IDY0IC0gbGVmdDsKLSAgICBjdHgtPnRvdGFsWzBdICs9IGxlbmd0aCA8PCAgMzsKLSAgICBjdHgtPnRvdGFsWzFdICs9IGxlbmd0aCA+PiAyOTsKLSAgICBjdHgtPnRvdGFsWzBdICY9IDB4RkZGRkZGRkY7Ci0gICAgY3R4LT50b3RhbFsxXSArPSBjdHgtPnRvdGFsWzBdIDwgbGVuZ3RoIDw8IDM7Ci0gICAgaWYoIGxlZnQgJiYgbGVuZ3RoID49IGZpbGwgKSB7Ci0gICAgICAgIEZYU1lTX21lbWNweTMyKCAodm9pZCAqKSAoY3R4LT5idWZmZXIgKyBsZWZ0KSwgKHZvaWQgKikgaW5wdXQsIGZpbGwgKTsKLSAgICAgICAgbWQ1X3Byb2Nlc3MoIGN0eCwgY3R4LT5idWZmZXIgKTsKLSAgICAgICAgbGVuZ3RoIC09IGZpbGw7Ci0gICAgICAgIGlucHV0ICArPSBmaWxsOwotICAgICAgICBsZWZ0ID0gMDsKLSAgICB9Ci0gICAgd2hpbGUoIGxlbmd0aCA+PSA2NCApIHsKLSAgICAgICAgbWQ1X3Byb2Nlc3MoIGN0eCwgaW5wdXQgKTsKLSAgICAgICAgbGVuZ3RoIC09IDY0OwotICAgICAgICBpbnB1dCAgKz0gNjQ7Ci0gICAgfQotICAgIGlmKCBsZW5ndGggKSB7Ci0gICAgICAgIEZYU1lTX21lbWNweTMyKCAodm9pZCAqKSAoY3R4LT5idWZmZXIgKyBsZWZ0KSwgKHZvaWQgKikgaW5wdXQsIGxlbmd0aCApOwotICAgIH0KK3ZvaWQgQ1JZUFRfTUQ1VXBkYXRlKHZvaWQqIHBjdHgsIGNvbnN0IHVpbnQ4X3QqIGlucHV0LCBGWF9EV09SRCBsZW5ndGgpIHsKKyAgc3RydWN0IG1kNV9jb250ZXh0KiBjdHggPSAoc3RydWN0IG1kNV9jb250ZXh0KilwY3R4OworICBGWF9EV09SRCBsZWZ0LCBmaWxsOworICBpZiAoIWxlbmd0aCkgeworICAgIHJldHVybjsKKyAgfQorICBsZWZ0ID0gKGN0eC0+dG90YWxbMF0gPj4gMykgJiAweDNGOworICBmaWxsID0gNjQgLSBsZWZ0OworICBjdHgtPnRvdGFsWzBdICs9IGxlbmd0aCA8PCAzOworICBjdHgtPnRvdGFsWzFdICs9IGxlbmd0aCA+PiAyOTsKKyAgY3R4LT50b3RhbFswXSAmPSAweEZGRkZGRkZGOworICBjdHgtPnRvdGFsWzFdICs9IGN0eC0+dG90YWxbMF0gPCBsZW5ndGggPDwgMzsKKyAgaWYgKGxlZnQgJiYgbGVuZ3RoID49IGZpbGwpIHsKKyAgICBGWFNZU19tZW1jcHkoKHZvaWQqKShjdHgtPmJ1ZmZlciArIGxlZnQpLCAodm9pZCopaW5wdXQsIGZpbGwpOworICAgIG1kNV9wcm9jZXNzKGN0eCwgY3R4LT5idWZmZXIpOworICAgIGxlbmd0aCAtPSBmaWxsOworICAgIGlucHV0ICs9IGZpbGw7CisgICAgbGVmdCA9IDA7CisgIH0KKyAgd2hpbGUgKGxlbmd0aCA+PSA2NCkgeworICAgIG1kNV9wcm9jZXNzKGN0eCwgaW5wdXQpOworICAgIGxlbmd0aCAtPSA2NDsKKyAgICBpbnB1dCArPSA2NDsKKyAgfQorICBpZiAobGVuZ3RoKSB7CisgICAgRlhTWVNfbWVtY3B5KCh2b2lkKikoY3R4LT5idWZmZXIgKyBsZWZ0KSwgKHZvaWQqKWlucHV0LCBsZW5ndGgpOworICB9CiB9Ci1jb25zdCBGWF9CWVRFIG1kNV9wYWRkaW5nWzY0XSA9IHsKLSAgICAweDgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCi19Owotdm9pZCBDUllQVF9NRDVGaW5pc2goRlhfTFBWT0lEIHBjdHgsIEZYX0JZVEUgZGlnZXN0WzE2XSApCi17Ci0gICAgc3RydWN0IG1kNV9jb250ZXh0ICpjdHggPSAoc3RydWN0IG1kNV9jb250ZXh0ICopcGN0eDsKLSAgICBGWF9EV09SRCBsYXN0LCBwYWRuOwotICAgIEZYX0JZVEUgbXNnbGVuWzhdOwotICAgIFBVVF9GWF9EV09SRCggY3R4LT50b3RhbFswXSwgbXNnbGVuLCAwICk7Ci0gICAgUFVUX0ZYX0RXT1JEKCBjdHgtPnRvdGFsWzFdLCBtc2dsZW4sIDQgKTsKLSAgICBsYXN0ID0gKCBjdHgtPnRvdGFsWzBdID4+IDMgKSAmIDB4M0Y7Ci0gICAgcGFkbiA9ICggbGFzdCA8IDU2ICkgPyAoIDU2IC0gbGFzdCApIDogKCAxMjAgLSBsYXN0ICk7Ci0gICAgQ1JZUFRfTUQ1VXBkYXRlKCBjdHgsIG1kNV9wYWRkaW5nLCBwYWRuICk7Ci0gICAgQ1JZUFRfTUQ1VXBkYXRlKCBjdHgsIG1zZ2xlbiwgOCApOwotICAgIFBVVF9GWF9EV09SRCggY3R4LT5zdGF0ZVswXSwgZGlnZXN0LCAgMCApOwotICAgIFBVVF9GWF9EV09SRCggY3R4LT5zdGF0ZVsxXSwgZGlnZXN0LCAgNCApOwotICAgIFBVVF9GWF9EV09SRCggY3R4LT5zdGF0ZVsyXSwgZGlnZXN0LCAgOCApOwotICAgIFBVVF9GWF9EV09SRCggY3R4LT5zdGF0ZVszXSwgZGlnZXN0LCAxMiApOworY29uc3QgdWludDhfdCBtZDVfcGFkZGluZ1s2NF0gPSB7CisgICAgMHg4MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9Owordm9pZCBDUllQVF9NRDVGaW5pc2godm9pZCogcGN0eCwgdWludDhfdCBkaWdlc3RbMTZdKSB7CisgIHN0cnVjdCBtZDVfY29udGV4dCogY3R4ID0gKHN0cnVjdCBtZDVfY29udGV4dCopcGN0eDsKKyAgRlhfRFdPUkQgbGFzdCwgcGFkbjsKKyAgdWludDhfdCBtc2dsZW5bOF07CisgIFBVVF9GWF9EV09SRChjdHgtPnRvdGFsWzBdLCBtc2dsZW4sIDApOworICBQVVRfRlhfRFdPUkQoY3R4LT50b3RhbFsxXSwgbXNnbGVuLCA0KTsKKyAgbGFzdCA9IChjdHgtPnRvdGFsWzBdID4+IDMpICYgMHgzRjsKKyAgcGFkbiA9IChsYXN0IDwgNTYpID8gKDU2IC0gbGFzdCkgOiAoMTIwIC0gbGFzdCk7CisgIENSWVBUX01ENVVwZGF0ZShjdHgsIG1kNV9wYWRkaW5nLCBwYWRuKTsKKyAgQ1JZUFRfTUQ1VXBkYXRlKGN0eCwgbXNnbGVuLCA4KTsKKyAgUFVUX0ZYX0RXT1JEKGN0eC0+c3RhdGVbMF0sIGRpZ2VzdCwgMCk7CisgIFBVVF9GWF9EV09SRChjdHgtPnN0YXRlWzFdLCBkaWdlc3QsIDQpOworICBQVVRfRlhfRFdPUkQoY3R4LT5zdGF0ZVsyXSwgZGlnZXN0LCA4KTsKKyAgUFVUX0ZYX0RXT1JEKGN0eC0+c3RhdGVbM10sIGRpZ2VzdCwgMTIpOwogfQotdm9pZCBDUllQVF9NRDVHZW5lcmF0ZShGWF9MUENCWVRFIGlucHV0LCBGWF9EV09SRCBsZW5ndGgsIEZYX0JZVEUgZGlnZXN0WzE2XSkKLXsKLSAgICBtZDVfY29udGV4dCBjdHg7Ci0gICAgQ1JZUFRfTUQ1U3RhcnQoJmN0eCk7Ci0gICAgQ1JZUFRfTUQ1VXBkYXRlKCZjdHgsIGlucHV0LCBsZW5ndGgpOwotICAgIENSWVBUX01ENUZpbmlzaCgmY3R4LCBkaWdlc3QpOwordm9pZCBDUllQVF9NRDVHZW5lcmF0ZShjb25zdCB1aW50OF90KiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRpZ2VzdFsxNl0pIHsKKyAgbWQ1X2NvbnRleHQgY3R4OworICBDUllQVF9NRDVTdGFydCgmY3R4KTsKKyAgQ1JZUFRfTUQ1VXBkYXRlKCZjdHgsIGlucHV0LCBsZW5ndGgpOworICBDUllQVF9NRDVGaW5pc2goJmN0eCwgZGlnZXN0KTsKIH0KLXN0YXRpYyBGWF9CT09MICgqZ19QdWJLZXlEZWNyeXB0b3IpKEZYX0xQQ0JZVEUgcERhdGEsIEZYX0RXT1JEIHNpemUsIEZYX0xQQllURSBkYXRhX2J1ZiwgRlhfRFdPUkQmIGRhdGFfbGVuKSA9IE5VTEw7Ci12b2lkIENSWVBUX1NldFB1YktleURlY3J5cHRvcihGWF9CT09MICgqZnVuYykoRlhfTFBDQllURSBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgRlhfTFBCWVRFIGRhdGFfYnVmLCBGWF9EV09SRCYgZGF0YV9sZW4pKQotewotICAgIGdfUHViS2V5RGVjcnlwdG9yID0gZnVuYzsKK3N0YXRpYyBGWF9CT09MICgqZ19QdWJLZXlEZWNyeXB0b3IpKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRhdGFfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRhdGFfbGVuKSA9IE5VTEw7Cit2b2lkIENSWVBUX1NldFB1YktleURlY3J5cHRvcihGWF9CT09MICgqZnVuYykoY29uc3QgdWludDhfdCogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkYXRhX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGF0YV9sZW4pKSB7CisgIGdfUHViS2V5RGVjcnlwdG9yID0gZnVuYzsKIH0KICNpZmRlZiBfX2NwbHVzcGx1cwogfTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0X2Flcy5jcHAgYi9jb3JlL3NyYy9mZHJtL2NyeXB0by9meF9jcnlwdF9hZXMuY3BwCmluZGV4IDZlZmE5MzUuLmQyNzc4M2YgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0X2Flcy5jcHAKKysrIGIvY29yZS9zcmMvZmRybS9jcnlwdG8vZnhfY3J5cHRfYWVzLmNwcApAQCAtMSw3NDkgKzEsNTQzIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mZHJtL2Z4X2NyeXB0LmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Zkcm0vZnhfY3J5cHQuaCIKKwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgogI2RlZmluZSBNQVhfTlIgMTQKICNkZWZpbmUgTUFYX05LIDgKICNkZWZpbmUgTUFYX05CIDgKLSNkZWZpbmUgbXVsYnkyKHgpICggKCh4JjB4N0YpIDw8IDEpIF4gKHggJiAweDgwID8gMHgxQiA6IDApICkKLSNkZWZpbmUgR0VUXzMyQklUX01TQl9GSVJTVChjcCkgXAotICAgICgoKHVuc2lnbmVkIGxvbmcpKHVuc2lnbmVkIGNoYXIpKGNwKVszXSkgfCBcCi0gICAgICgodW5zaWduZWQgbG9uZykodW5zaWduZWQgY2hhcikoY3ApWzJdIDw8IDgpIHwgXAotICAgICAoKHVuc2lnbmVkIGxvbmcpKHVuc2lnbmVkIGNoYXIpKGNwKVsxXSA8PCAxNikgfCBcCi0gICAgICgodW5zaWduZWQgbG9uZykodW5zaWduZWQgY2hhcikoY3ApWzBdIDw8IDI0KSkKLSNkZWZpbmUgUFVUXzMyQklUX01TQl9GSVJTVChjcCwgdmFsdWUpIGRvIHsgXAotICAgICAgICAoY3ApWzNdID0gKHZhbHVlKTsgXAotICAgICAgICAoY3ApWzJdID0gKHZhbHVlKSA+PiA4OyBcCi0gICAgICAgIChjcClbMV0gPSAodmFsdWUpID4+IDE2OyBcCi0gICAgICAgIChjcClbMF0gPSAodmFsdWUpID4+IDI0OyB9IHdoaWxlICgwKQorI2RlZmluZSBtdWxieTIoeCkgKCgoeCAmIDB4N0YpIDw8IDEpIF4gKHggJiAweDgwID8gMHgxQiA6IDApKQorI2RlZmluZSBHRVRfMzJCSVRfTVNCX0ZJUlNUKGNwKSAgICAgICAgICAgICAgICAgICAgXAorICAoKCh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZCBjaGFyKShjcClbM10pIHwgICAgICAgXAorICAgKCh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZCBjaGFyKShjcClbMl0gPDwgOCkgfCAgXAorICAgKCh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZCBjaGFyKShjcClbMV0gPDwgMTYpIHwgXAorICAgKCh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZCBjaGFyKShjcClbMF0gPDwgMjQpKQorI2RlZmluZSBQVVRfMzJCSVRfTVNCX0ZJUlNUKGNwLCB2YWx1ZSkgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChjcClbM10gPSAodmFsdWUpOyAgICAgICAgICAgICAgICAgXAorICAgIChjcClbMl0gPSAodmFsdWUpID4+IDg7ICAgICAgICAgICAgXAorICAgIChjcClbMV0gPSAodmFsdWUpID4+IDE2OyAgICAgICAgICAgXAorICAgIChjcClbMF0gPSAodmFsdWUpID4+IDI0OyAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQogc3RydWN0IEFFU0NvbnRleHQgewotICAgIHVuc2lnbmVkIGludCBrZXlzY2hlZFsoTUFYX05SICsgMSkgKiBNQVhfTkJdOwotICAgIHVuc2lnbmVkIGludCBpbnZrZXlzY2hlZFsoTUFYX05SICsgMSkgKiBNQVhfTkJdOwotICAgIHZvaWQgKCplbmNyeXB0KSAoQUVTQ29udGV4dCAqIGN0eCwgdW5zaWduZWQgaW50ICogYmxvY2spOwotICAgIHZvaWQgKCpkZWNyeXB0KSAoQUVTQ29udGV4dCAqIGN0eCwgdW5zaWduZWQgaW50ICogYmxvY2spOwotICAgIHVuc2lnbmVkIGludCBpdltNQVhfTkJdOwotICAgIGludCBOYiwgTnI7CisgIHVuc2lnbmVkIGludCBrZXlzY2hlZFsoTUFYX05SICsgMSkgKiBNQVhfTkJdOworICB1bnNpZ25lZCBpbnQgaW52a2V5c2NoZWRbKE1BWF9OUiArIDEpICogTUFYX05CXTsKKyAgdm9pZCAoKmVuY3J5cHQpKEFFU0NvbnRleHQqIGN0eCwgdW5zaWduZWQgaW50KiBibG9jayk7CisgIHZvaWQgKCpkZWNyeXB0KShBRVNDb250ZXh0KiBjdHgsIHVuc2lnbmVkIGludCogYmxvY2spOworICB1bnNpZ25lZCBpbnQgaXZbTUFYX05CXTsKKyAgaW50IE5iLCBOcjsKIH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTYm94WzI1Nl0gPSB7Ci0gICAgMHg2MywgMHg3YywgMHg3NywgMHg3YiwgMHhmMiwgMHg2YiwgMHg2ZiwgMHhjNSwKLSAgICAweDMwLCAweDAxLCAweDY3LCAweDJiLCAweGZlLCAweGQ3LCAweGFiLCAweDc2LAotICAgIDB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjAsCi0gICAgMHhhZCwgMHhkNCwgMHhhMiwgMHhhZiwgMHg5YywgMHhhNCwgMHg3MiwgMHhjMCwKLSAgICAweGI3LCAweGZkLCAweDkzLCAweDI2LCAweDM2LCAweDNmLCAweGY3LCAweGNjLAotICAgIDB4MzQsIDB4YTUsIDB4ZTUsIDB4ZjEsIDB4NzEsIDB4ZDgsIDB4MzEsIDB4MTUsCi0gICAgMHgwNCwgMHhjNywgMHgyMywgMHhjMywgMHgxOCwgMHg5NiwgMHgwNSwgMHg5YSwKLSAgICAweDA3LCAweDEyLCAweDgwLCAweGUyLCAweGViLCAweDI3LCAweGIyLCAweDc1LAotICAgIDB4MDksIDB4ODMsIDB4MmMsIDB4MWEsIDB4MWIsIDB4NmUsIDB4NWEsIDB4YTAsCi0gICAgMHg1MiwgMHgzYiwgMHhkNiwgMHhiMywgMHgyOSwgMHhlMywgMHgyZiwgMHg4NCwKLSAgICAweDUzLCAweGQxLCAweDAwLCAweGVkLCAweDIwLCAweGZjLCAweGIxLCAweDViLAotICAgIDB4NmEsIDB4Y2IsIDB4YmUsIDB4MzksIDB4NGEsIDB4NGMsIDB4NTgsIDB4Y2YsCi0gICAgMHhkMCwgMHhlZiwgMHhhYSwgMHhmYiwgMHg0MywgMHg0ZCwgMHgzMywgMHg4NSwKLSAgICAweDQ1LCAweGY5LCAweDAyLCAweDdmLCAweDUwLCAweDNjLCAweDlmLCAweGE4LAotICAgIDB4NTEsIDB4YTMsIDB4NDAsIDB4OGYsIDB4OTIsIDB4OWQsIDB4MzgsIDB4ZjUsCi0gICAgMHhiYywgMHhiNiwgMHhkYSwgMHgyMSwgMHgxMCwgMHhmZiwgMHhmMywgMHhkMiwKLSAgICAweGNkLCAweDBjLCAweDEzLCAweGVjLCAweDVmLCAweDk3LCAweDQ0LCAweDE3LAotICAgIDB4YzQsIDB4YTcsIDB4N2UsIDB4M2QsIDB4NjQsIDB4NWQsIDB4MTksIDB4NzMsCi0gICAgMHg2MCwgMHg4MSwgMHg0ZiwgMHhkYywgMHgyMiwgMHgyYSwgMHg5MCwgMHg4OCwKLSAgICAweDQ2LCAweGVlLCAweGI4LCAweDE0LCAweGRlLCAweDVlLCAweDBiLCAweGRiLAotICAgIDB4ZTAsIDB4MzIsIDB4M2EsIDB4MGEsIDB4NDksIDB4MDYsIDB4MjQsIDB4NWMsCi0gICAgMHhjMiwgMHhkMywgMHhhYywgMHg2MiwgMHg5MSwgMHg5NSwgMHhlNCwgMHg3OSwKLSAgICAweGU3LCAweGM4LCAweDM3LCAweDZkLCAweDhkLCAweGQ1LCAweDRlLCAweGE5LAotICAgIDB4NmMsIDB4NTYsIDB4ZjQsIDB4ZWEsIDB4NjUsIDB4N2EsIDB4YWUsIDB4MDgsCi0gICAgMHhiYSwgMHg3OCwgMHgyNSwgMHgyZSwgMHgxYywgMHhhNiwgMHhiNCwgMHhjNiwKLSAgICAweGU4LCAweGRkLCAweDc0LCAweDFmLCAweDRiLCAweGJkLCAweDhiLCAweDhhLAotICAgIDB4NzAsIDB4M2UsIDB4YjUsIDB4NjYsIDB4NDgsIDB4MDMsIDB4ZjYsIDB4MGUsCi0gICAgMHg2MSwgMHgzNSwgMHg1NywgMHhiOSwgMHg4NiwgMHhjMSwgMHgxZCwgMHg5ZSwKLSAgICAweGUxLCAweGY4LCAweDk4LCAweDExLCAweDY5LCAweGQ5LCAweDhlLCAweDk0LAotICAgIDB4OWIsIDB4MWUsIDB4ODcsIDB4ZTksIDB4Y2UsIDB4NTUsIDB4MjgsIDB4ZGYsCi0gICAgMHg4YywgMHhhMSwgMHg4OSwgMHgwZCwgMHhiZiwgMHhlNiwgMHg0MiwgMHg2OCwKLSAgICAweDQxLCAweDk5LCAweDJkLCAweDBmLCAweGIwLCAweDU0LCAweGJiLCAweDE2Ci19OworICAgIDB4NjMsIDB4N2MsIDB4NzcsIDB4N2IsIDB4ZjIsIDB4NmIsIDB4NmYsIDB4YzUsIDB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsCisgICAgMHhmZSwgMHhkNywgMHhhYiwgMHg3NiwgMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCwKKyAgICAweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwLCAweGI3LCAweGZkLCAweDkzLCAweDI2LAorICAgIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MsIDB4MzQsIDB4YTUsIDB4ZTUsIDB4ZjEsIDB4NzEsIDB4ZDgsIDB4MzEsIDB4MTUsCisgICAgMHgwNCwgMHhjNywgMHgyMywgMHhjMywgMHgxOCwgMHg5NiwgMHgwNSwgMHg5YSwgMHgwNywgMHgxMiwgMHg4MCwgMHhlMiwKKyAgICAweGViLCAweDI3LCAweGIyLCAweDc1LCAweDA5LCAweDgzLCAweDJjLCAweDFhLCAweDFiLCAweDZlLCAweDVhLCAweGEwLAorICAgIDB4NTIsIDB4M2IsIDB4ZDYsIDB4YjMsIDB4MjksIDB4ZTMsIDB4MmYsIDB4ODQsIDB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsCisgICAgMHgyMCwgMHhmYywgMHhiMSwgMHg1YiwgMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZiwKKyAgICAweGQwLCAweGVmLCAweGFhLCAweGZiLCAweDQzLCAweDRkLCAweDMzLCAweDg1LCAweDQ1LCAweGY5LCAweDAyLCAweDdmLAorICAgIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgsIDB4NTEsIDB4YTMsIDB4NDAsIDB4OGYsIDB4OTIsIDB4OWQsIDB4MzgsIDB4ZjUsCisgICAgMHhiYywgMHhiNiwgMHhkYSwgMHgyMSwgMHgxMCwgMHhmZiwgMHhmMywgMHhkMiwgMHhjZCwgMHgwYywgMHgxMywgMHhlYywKKyAgICAweDVmLCAweDk3LCAweDQ0LCAweDE3LCAweGM0LCAweGE3LCAweDdlLCAweDNkLCAweDY0LCAweDVkLCAweDE5LCAweDczLAorICAgIDB4NjAsIDB4ODEsIDB4NGYsIDB4ZGMsIDB4MjIsIDB4MmEsIDB4OTAsIDB4ODgsIDB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsCisgICAgMHhkZSwgMHg1ZSwgMHgwYiwgMHhkYiwgMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1YywKKyAgICAweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1LCAweGU0LCAweDc5LCAweGU3LCAweGM4LCAweDM3LCAweDZkLAorICAgIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTksIDB4NmMsIDB4NTYsIDB4ZjQsIDB4ZWEsIDB4NjUsIDB4N2EsIDB4YWUsIDB4MDgsCisgICAgMHhiYSwgMHg3OCwgMHgyNSwgMHgyZSwgMHgxYywgMHhhNiwgMHhiNCwgMHhjNiwgMHhlOCwgMHhkZCwgMHg3NCwgMHgxZiwKKyAgICAweDRiLCAweGJkLCAweDhiLCAweDhhLCAweDcwLCAweDNlLCAweGI1LCAweDY2LCAweDQ4LCAweDAzLCAweGY2LCAweDBlLAorICAgIDB4NjEsIDB4MzUsIDB4NTcsIDB4YjksIDB4ODYsIDB4YzEsIDB4MWQsIDB4OWUsIDB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsCisgICAgMHg2OSwgMHhkOSwgMHg4ZSwgMHg5NCwgMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZiwKKyAgICAweDhjLCAweGExLCAweDg5LCAweDBkLCAweGJmLCAweGU2LCAweDQyLCAweDY4LCAweDQxLCAweDk5LCAweDJkLCAweDBmLAorICAgIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTZ9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2JveGludlsyNTZdID0gewotICAgIDB4NTIsIDB4MDksIDB4NmEsIDB4ZDUsIDB4MzAsIDB4MzYsIDB4YTUsIDB4MzgsCi0gICAgMHhiZiwgMHg0MCwgMHhhMywgMHg5ZSwgMHg4MSwgMHhmMywgMHhkNywgMHhmYiwKLSAgICAweDdjLCAweGUzLCAweDM5LCAweDgyLCAweDliLCAweDJmLCAweGZmLCAweDg3LAotICAgIDB4MzQsIDB4OGUsIDB4NDMsIDB4NDQsIDB4YzQsIDB4ZGUsIDB4ZTksIDB4Y2IsCi0gICAgMHg1NCwgMHg3YiwgMHg5NCwgMHgzMiwgMHhhNiwgMHhjMiwgMHgyMywgMHgzZCwKLSAgICAweGVlLCAweDRjLCAweDk1LCAweDBiLCAweDQyLCAweGZhLCAweGMzLCAweDRlLAotICAgIDB4MDgsIDB4MmUsIDB4YTEsIDB4NjYsIDB4MjgsIDB4ZDksIDB4MjQsIDB4YjIsCi0gICAgMHg3NiwgMHg1YiwgMHhhMiwgMHg0OSwgMHg2ZCwgMHg4YiwgMHhkMSwgMHgyNSwKLSAgICAweDcyLCAweGY4LCAweGY2LCAweDY0LCAweDg2LCAweDY4LCAweDk4LCAweDE2LAotICAgIDB4ZDQsIDB4YTQsIDB4NWMsIDB4Y2MsIDB4NWQsIDB4NjUsIDB4YjYsIDB4OTIsCi0gICAgMHg2YywgMHg3MCwgMHg0OCwgMHg1MCwgMHhmZCwgMHhlZCwgMHhiOSwgMHhkYSwKLSAgICAweDVlLCAweDE1LCAweDQ2LCAweDU3LCAweGE3LCAweDhkLCAweDlkLCAweDg0LAotICAgIDB4OTAsIDB4ZDgsIDB4YWIsIDB4MDAsIDB4OGMsIDB4YmMsIDB4ZDMsIDB4MGEsCi0gICAgMHhmNywgMHhlNCwgMHg1OCwgMHgwNSwgMHhiOCwgMHhiMywgMHg0NSwgMHgwNiwKLSAgICAweGQwLCAweDJjLCAweDFlLCAweDhmLCAweGNhLCAweDNmLCAweDBmLCAweDAyLAotICAgIDB4YzEsIDB4YWYsIDB4YmQsIDB4MDMsIDB4MDEsIDB4MTMsIDB4OGEsIDB4NmIsCi0gICAgMHgzYSwgMHg5MSwgMHgxMSwgMHg0MSwgMHg0ZiwgMHg2NywgMHhkYywgMHhlYSwKLSAgICAweDk3LCAweGYyLCAweGNmLCAweGNlLCAweGYwLCAweGI0LCAweGU2LCAweDczLAotICAgIDB4OTYsIDB4YWMsIDB4NzQsIDB4MjIsIDB4ZTcsIDB4YWQsIDB4MzUsIDB4ODUsCi0gICAgMHhlMiwgMHhmOSwgMHgzNywgMHhlOCwgMHgxYywgMHg3NSwgMHhkZiwgMHg2ZSwKLSAgICAweDQ3LCAweGYxLCAweDFhLCAweDcxLCAweDFkLCAweDI5LCAweGM1LCAweDg5LAotICAgIDB4NmYsIDB4YjcsIDB4NjIsIDB4MGUsIDB4YWEsIDB4MTgsIDB4YmUsIDB4MWIsCi0gICAgMHhmYywgMHg1NiwgMHgzZSwgMHg0YiwgMHhjNiwgMHhkMiwgMHg3OSwgMHgyMCwKLSAgICAweDlhLCAweGRiLCAweGMwLCAweGZlLCAweDc4LCAweGNkLCAweDVhLCAweGY0LAotICAgIDB4MWYsIDB4ZGQsIDB4YTgsIDB4MzMsIDB4ODgsIDB4MDcsIDB4YzcsIDB4MzEsCi0gICAgMHhiMSwgMHgxMiwgMHgxMCwgMHg1OSwgMHgyNywgMHg4MCwgMHhlYywgMHg1ZiwKLSAgICAweDYwLCAweDUxLCAweDdmLCAweGE5LCAweDE5LCAweGI1LCAweDRhLCAweDBkLAotICAgIDB4MmQsIDB4ZTUsIDB4N2EsIDB4OWYsIDB4OTMsIDB4YzksIDB4OWMsIDB4ZWYsCi0gICAgMHhhMCwgMHhlMCwgMHgzYiwgMHg0ZCwgMHhhZSwgMHgyYSwgMHhmNSwgMHhiMCwKLSAgICAweGM4LCAweGViLCAweGJiLCAweDNjLCAweDgzLCAweDUzLCAweDk5LCAweDYxLAotICAgIDB4MTcsIDB4MmIsIDB4MDQsIDB4N2UsIDB4YmEsIDB4NzcsIDB4ZDYsIDB4MjYsCi0gICAgMHhlMSwgMHg2OSwgMHgxNCwgMHg2MywgMHg1NSwgMHgyMSwgMHgwYywgMHg3ZAotfTsKKyAgICAweDUyLCAweDA5LCAweDZhLCAweGQ1LCAweDMwLCAweDM2LCAweGE1LCAweDM4LCAweGJmLCAweDQwLCAweGEzLCAweDllLAorICAgIDB4ODEsIDB4ZjMsIDB4ZDcsIDB4ZmIsIDB4N2MsIDB4ZTMsIDB4MzksIDB4ODIsIDB4OWIsIDB4MmYsIDB4ZmYsIDB4ODcsCisgICAgMHgzNCwgMHg4ZSwgMHg0MywgMHg0NCwgMHhjNCwgMHhkZSwgMHhlOSwgMHhjYiwgMHg1NCwgMHg3YiwgMHg5NCwgMHgzMiwKKyAgICAweGE2LCAweGMyLCAweDIzLCAweDNkLCAweGVlLCAweDRjLCAweDk1LCAweDBiLCAweDQyLCAweGZhLCAweGMzLCAweDRlLAorICAgIDB4MDgsIDB4MmUsIDB4YTEsIDB4NjYsIDB4MjgsIDB4ZDksIDB4MjQsIDB4YjIsIDB4NzYsIDB4NWIsIDB4YTIsIDB4NDksCisgICAgMHg2ZCwgMHg4YiwgMHhkMSwgMHgyNSwgMHg3MiwgMHhmOCwgMHhmNiwgMHg2NCwgMHg4NiwgMHg2OCwgMHg5OCwgMHgxNiwKKyAgICAweGQ0LCAweGE0LCAweDVjLCAweGNjLCAweDVkLCAweDY1LCAweGI2LCAweDkyLCAweDZjLCAweDcwLCAweDQ4LCAweDUwLAorICAgIDB4ZmQsIDB4ZWQsIDB4YjksIDB4ZGEsIDB4NWUsIDB4MTUsIDB4NDYsIDB4NTcsIDB4YTcsIDB4OGQsIDB4OWQsIDB4ODQsCisgICAgMHg5MCwgMHhkOCwgMHhhYiwgMHgwMCwgMHg4YywgMHhiYywgMHhkMywgMHgwYSwgMHhmNywgMHhlNCwgMHg1OCwgMHgwNSwKKyAgICAweGI4LCAweGIzLCAweDQ1LCAweDA2LCAweGQwLCAweDJjLCAweDFlLCAweDhmLCAweGNhLCAweDNmLCAweDBmLCAweDAyLAorICAgIDB4YzEsIDB4YWYsIDB4YmQsIDB4MDMsIDB4MDEsIDB4MTMsIDB4OGEsIDB4NmIsIDB4M2EsIDB4OTEsIDB4MTEsIDB4NDEsCisgICAgMHg0ZiwgMHg2NywgMHhkYywgMHhlYSwgMHg5NywgMHhmMiwgMHhjZiwgMHhjZSwgMHhmMCwgMHhiNCwgMHhlNiwgMHg3MywKKyAgICAweDk2LCAweGFjLCAweDc0LCAweDIyLCAweGU3LCAweGFkLCAweDM1LCAweDg1LCAweGUyLCAweGY5LCAweDM3LCAweGU4LAorICAgIDB4MWMsIDB4NzUsIDB4ZGYsIDB4NmUsIDB4NDcsIDB4ZjEsIDB4MWEsIDB4NzEsIDB4MWQsIDB4MjksIDB4YzUsIDB4ODksCisgICAgMHg2ZiwgMHhiNywgMHg2MiwgMHgwZSwgMHhhYSwgMHgxOCwgMHhiZSwgMHgxYiwgMHhmYywgMHg1NiwgMHgzZSwgMHg0YiwKKyAgICAweGM2LCAweGQyLCAweDc5LCAweDIwLCAweDlhLCAweGRiLCAweGMwLCAweGZlLCAweDc4LCAweGNkLCAweDVhLCAweGY0LAorICAgIDB4MWYsIDB4ZGQsIDB4YTgsIDB4MzMsIDB4ODgsIDB4MDcsIDB4YzcsIDB4MzEsIDB4YjEsIDB4MTIsIDB4MTAsIDB4NTksCisgICAgMHgyNywgMHg4MCwgMHhlYywgMHg1ZiwgMHg2MCwgMHg1MSwgMHg3ZiwgMHhhOSwgMHgxOSwgMHhiNSwgMHg0YSwgMHgwZCwKKyAgICAweDJkLCAweGU1LCAweDdhLCAweDlmLCAweDkzLCAweGM5LCAweDljLCAweGVmLCAweGEwLCAweGUwLCAweDNiLCAweDRkLAorICAgIDB4YWUsIDB4MmEsIDB4ZjUsIDB4YjAsIDB4YzgsIDB4ZWIsIDB4YmIsIDB4M2MsIDB4ODMsIDB4NTMsIDB4OTksIDB4NjEsCisgICAgMHgxNywgMHgyYiwgMHgwNCwgMHg3ZSwgMHhiYSwgMHg3NywgMHhkNiwgMHgyNiwgMHhlMSwgMHg2OSwgMHgxNCwgMHg2MywKKyAgICAweDU1LCAweDIxLCAweDBjLCAweDdkfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgRTBbMjU2XSA9IHsKLSAgICAweGM2NjM2M2E1LCAweGY4N2M3Yzg0LCAweGVlNzc3Nzk5LCAweGY2N2I3YjhkLAotICAgIDB4ZmZmMmYyMGQsIDB4ZDY2YjZiYmQsIDB4ZGU2ZjZmYjEsIDB4OTFjNWM1NTQsCi0gICAgMHg2MDMwMzA1MCwgMHgwMjAxMDEwMywgMHhjZTY3NjdhOSwgMHg1NjJiMmI3ZCwKLSAgICAweGU3ZmVmZTE5LCAweGI1ZDdkNzYyLCAweDRkYWJhYmU2LCAweGVjNzY3NjlhLAotICAgIDB4OGZjYWNhNDUsIDB4MWY4MjgyOWQsIDB4ODljOWM5NDAsIDB4ZmE3ZDdkODcsCi0gICAgMHhlZmZhZmExNSwgMHhiMjU5NTllYiwgMHg4ZTQ3NDdjOSwgMHhmYmYwZjAwYiwKLSAgICAweDQxYWRhZGVjLCAweGIzZDRkNDY3LCAweDVmYTJhMmZkLCAweDQ1YWZhZmVhLAotICAgIDB4MjM5YzljYmYsIDB4NTNhNGE0ZjcsIDB4ZTQ3MjcyOTYsIDB4OWJjMGMwNWIsCi0gICAgMHg3NWI3YjdjMiwgMHhlMWZkZmQxYywgMHgzZDkzOTNhZSwgMHg0YzI2MjY2YSwKLSAgICAweDZjMzYzNjVhLCAweDdlM2YzZjQxLCAweGY1ZjdmNzAyLCAweDgzY2NjYzRmLAotICAgIDB4NjgzNDM0NWMsIDB4NTFhNWE1ZjQsIDB4ZDFlNWU1MzQsIDB4ZjlmMWYxMDgsCi0gICAgMHhlMjcxNzE5MywgMHhhYmQ4ZDg3MywgMHg2MjMxMzE1MywgMHgyYTE1MTUzZiwKLSAgICAweDA4MDQwNDBjLCAweDk1YzdjNzUyLCAweDQ2MjMyMzY1LCAweDlkYzNjMzVlLAotICAgIDB4MzAxODE4MjgsIDB4Mzc5Njk2YTEsIDB4MGEwNTA1MGYsIDB4MmY5YTlhYjUsCi0gICAgMHgwZTA3MDcwOSwgMHgyNDEyMTIzNiwgMHgxYjgwODA5YiwgMHhkZmUyZTIzZCwKLSAgICAweGNkZWJlYjI2LCAweDRlMjcyNzY5LCAweDdmYjJiMmNkLCAweGVhNzU3NTlmLAotICAgIDB4MTIwOTA5MWIsIDB4MWQ4MzgzOWUsIDB4NTgyYzJjNzQsIDB4MzQxYTFhMmUsCi0gICAgMHgzNjFiMWIyZCwgMHhkYzZlNmViMiwgMHhiNDVhNWFlZSwgMHg1YmEwYTBmYiwKLSAgICAweGE0NTI1MmY2LCAweDc2M2IzYjRkLCAweGI3ZDZkNjYxLCAweDdkYjNiM2NlLAotICAgIDB4NTIyOTI5N2IsIDB4ZGRlM2UzM2UsIDB4NWUyZjJmNzEsIDB4MTM4NDg0OTcsCi0gICAgMHhhNjUzNTNmNSwgMHhiOWQxZDE2OCwgMHgwMDAwMDAwMCwgMHhjMWVkZWQyYywKLSAgICAweDQwMjAyMDYwLCAweGUzZmNmYzFmLCAweDc5YjFiMWM4LCAweGI2NWI1YmVkLAotICAgIDB4ZDQ2YTZhYmUsIDB4OGRjYmNiNDYsIDB4NjdiZWJlZDksIDB4NzIzOTM5NGIsCi0gICAgMHg5NDRhNGFkZSwgMHg5ODRjNGNkNCwgMHhiMDU4NThlOCwgMHg4NWNmY2Y0YSwKLSAgICAweGJiZDBkMDZiLCAweGM1ZWZlZjJhLCAweDRmYWFhYWU1LCAweGVkZmJmYjE2LAotICAgIDB4ODY0MzQzYzUsIDB4OWE0ZDRkZDcsIDB4NjYzMzMzNTUsIDB4MTE4NTg1OTQsCi0gICAgMHg4YTQ1NDVjZiwgMHhlOWY5ZjkxMCwgMHgwNDAyMDIwNiwgMHhmZTdmN2Y4MSwKLSAgICAweGEwNTA1MGYwLCAweDc4M2MzYzQ0LCAweDI1OWY5ZmJhLCAweDRiYThhOGUzLAotICAgIDB4YTI1MTUxZjMsIDB4NWRhM2EzZmUsIDB4ODA0MDQwYzAsIDB4MDU4ZjhmOGEsCi0gICAgMHgzZjkyOTJhZCwgMHgyMTlkOWRiYywgMHg3MDM4Mzg0OCwgMHhmMWY1ZjUwNCwKLSAgICAweDYzYmNiY2RmLCAweDc3YjZiNmMxLCAweGFmZGFkYTc1LCAweDQyMjEyMTYzLAotICAgIDB4MjAxMDEwMzAsIDB4ZTVmZmZmMWEsIDB4ZmRmM2YzMGUsIDB4YmZkMmQyNmQsCi0gICAgMHg4MWNkY2Q0YywgMHgxODBjMGMxNCwgMHgyNjEzMTMzNSwgMHhjM2VjZWMyZiwKLSAgICAweGJlNWY1ZmUxLCAweDM1OTc5N2EyLCAweDg4NDQ0NGNjLCAweDJlMTcxNzM5LAotICAgIDB4OTNjNGM0NTcsIDB4NTVhN2E3ZjIsIDB4ZmM3ZTdlODIsIDB4N2EzZDNkNDcsCi0gICAgMHhjODY0NjRhYywgMHhiYTVkNWRlNywgMHgzMjE5MTkyYiwgMHhlNjczNzM5NSwKLSAgICAweGMwNjA2MGEwLCAweDE5ODE4MTk4LCAweDllNGY0ZmQxLCAweGEzZGNkYzdmLAotICAgIDB4NDQyMjIyNjYsIDB4NTQyYTJhN2UsIDB4M2I5MDkwYWIsIDB4MGI4ODg4ODMsCi0gICAgMHg4YzQ2NDZjYSwgMHhjN2VlZWUyOSwgMHg2YmI4YjhkMywgMHgyODE0MTQzYywKLSAgICAweGE3ZGVkZTc5LCAweGJjNWU1ZWUyLCAweDE2MGIwYjFkLCAweGFkZGJkYjc2LAotICAgIDB4ZGJlMGUwM2IsIDB4NjQzMjMyNTYsIDB4NzQzYTNhNGUsIDB4MTQwYTBhMWUsCi0gICAgMHg5MjQ5NDlkYiwgMHgwYzA2MDYwYSwgMHg0ODI0MjQ2YywgMHhiODVjNWNlNCwKLSAgICAweDlmYzJjMjVkLCAweGJkZDNkMzZlLCAweDQzYWNhY2VmLCAweGM0NjI2MmE2LAotICAgIDB4Mzk5MTkxYTgsIDB4MzE5NTk1YTQsIDB4ZDNlNGU0MzcsIDB4ZjI3OTc5OGIsCi0gICAgMHhkNWU3ZTczMiwgMHg4YmM4Yzg0MywgMHg2ZTM3Mzc1OSwgMHhkYTZkNmRiNywKLSAgICAweDAxOGQ4ZDhjLCAweGIxZDVkNTY0LCAweDljNGU0ZWQyLCAweDQ5YTlhOWUwLAotICAgIDB4ZDg2YzZjYjQsIDB4YWM1NjU2ZmEsIDB4ZjNmNGY0MDcsIDB4Y2ZlYWVhMjUsCi0gICAgMHhjYTY1NjVhZiwgMHhmNDdhN2E4ZSwgMHg0N2FlYWVlOSwgMHgxMDA4MDgxOCwKLSAgICAweDZmYmFiYWQ1LCAweGYwNzg3ODg4LCAweDRhMjUyNTZmLCAweDVjMmUyZTcyLAotICAgIDB4MzgxYzFjMjQsIDB4NTdhNmE2ZjEsIDB4NzNiNGI0YzcsIDB4OTdjNmM2NTEsCi0gICAgMHhjYmU4ZTgyMywgMHhhMWRkZGQ3YywgMHhlODc0NzQ5YywgMHgzZTFmMWYyMSwKLSAgICAweDk2NGI0YmRkLCAweDYxYmRiZGRjLCAweDBkOGI4Yjg2LCAweDBmOGE4YTg1LAotICAgIDB4ZTA3MDcwOTAsIDB4N2MzZTNlNDIsIDB4NzFiNWI1YzQsIDB4Y2M2NjY2YWEsCi0gICAgMHg5MDQ4NDhkOCwgMHgwNjAzMDMwNSwgMHhmN2Y2ZjYwMSwgMHgxYzBlMGUxMiwKLSAgICAweGMyNjE2MWEzLCAweDZhMzUzNTVmLCAweGFlNTc1N2Y5LCAweDY5YjliOWQwLAotICAgIDB4MTc4Njg2OTEsIDB4OTljMWMxNTgsIDB4M2ExZDFkMjcsIDB4Mjc5ZTllYjksCi0gICAgMHhkOWUxZTEzOCwgMHhlYmY4ZjgxMywgMHgyYjk4OThiMywgMHgyMjExMTEzMywKLSAgICAweGQyNjk2OWJiLCAweGE5ZDlkOTcwLCAweDA3OGU4ZTg5LCAweDMzOTQ5NGE3LAotICAgIDB4MmQ5YjliYjYsIDB4M2MxZTFlMjIsIDB4MTU4Nzg3OTIsIDB4YzllOWU5MjAsCi0gICAgMHg4N2NlY2U0OSwgMHhhYTU1NTVmZiwgMHg1MDI4Mjg3OCwgMHhhNWRmZGY3YSwKLSAgICAweDAzOGM4YzhmLCAweDU5YTFhMWY4LCAweDA5ODk4OTgwLCAweDFhMGQwZDE3LAotICAgIDB4NjViZmJmZGEsIDB4ZDdlNmU2MzEsIDB4ODQ0MjQyYzYsIDB4ZDA2ODY4YjgsCi0gICAgMHg4MjQxNDFjMywgMHgyOTk5OTliMCwgMHg1YTJkMmQ3NywgMHgxZTBmMGYxMSwKKyAgICAweGM2NjM2M2E1LCAweGY4N2M3Yzg0LCAweGVlNzc3Nzk5LCAweGY2N2I3YjhkLCAweGZmZjJmMjBkLCAweGQ2NmI2YmJkLAorICAgIDB4ZGU2ZjZmYjEsIDB4OTFjNWM1NTQsIDB4NjAzMDMwNTAsIDB4MDIwMTAxMDMsIDB4Y2U2NzY3YTksIDB4NTYyYjJiN2QsCisgICAgMHhlN2ZlZmUxOSwgMHhiNWQ3ZDc2MiwgMHg0ZGFiYWJlNiwgMHhlYzc2NzY5YSwgMHg4ZmNhY2E0NSwgMHgxZjgyODI5ZCwKKyAgICAweDg5YzljOTQwLCAweGZhN2Q3ZDg3LCAweGVmZmFmYTE1LCAweGIyNTk1OWViLCAweDhlNDc0N2M5LCAweGZiZjBmMDBiLAorICAgIDB4NDFhZGFkZWMsIDB4YjNkNGQ0NjcsIDB4NWZhMmEyZmQsIDB4NDVhZmFmZWEsIDB4MjM5YzljYmYsIDB4NTNhNGE0ZjcsCisgICAgMHhlNDcyNzI5NiwgMHg5YmMwYzA1YiwgMHg3NWI3YjdjMiwgMHhlMWZkZmQxYywgMHgzZDkzOTNhZSwgMHg0YzI2MjY2YSwKKyAgICAweDZjMzYzNjVhLCAweDdlM2YzZjQxLCAweGY1ZjdmNzAyLCAweDgzY2NjYzRmLCAweDY4MzQzNDVjLCAweDUxYTVhNWY0LAorICAgIDB4ZDFlNWU1MzQsIDB4ZjlmMWYxMDgsIDB4ZTI3MTcxOTMsIDB4YWJkOGQ4NzMsIDB4NjIzMTMxNTMsIDB4MmExNTE1M2YsCisgICAgMHgwODA0MDQwYywgMHg5NWM3Yzc1MiwgMHg0NjIzMjM2NSwgMHg5ZGMzYzM1ZSwgMHgzMDE4MTgyOCwgMHgzNzk2OTZhMSwKKyAgICAweDBhMDUwNTBmLCAweDJmOWE5YWI1LCAweDBlMDcwNzA5LCAweDI0MTIxMjM2LCAweDFiODA4MDliLCAweGRmZTJlMjNkLAorICAgIDB4Y2RlYmViMjYsIDB4NGUyNzI3NjksIDB4N2ZiMmIyY2QsIDB4ZWE3NTc1OWYsIDB4MTIwOTA5MWIsIDB4MWQ4MzgzOWUsCisgICAgMHg1ODJjMmM3NCwgMHgzNDFhMWEyZSwgMHgzNjFiMWIyZCwgMHhkYzZlNmViMiwgMHhiNDVhNWFlZSwgMHg1YmEwYTBmYiwKKyAgICAweGE0NTI1MmY2LCAweDc2M2IzYjRkLCAweGI3ZDZkNjYxLCAweDdkYjNiM2NlLCAweDUyMjkyOTdiLCAweGRkZTNlMzNlLAorICAgIDB4NWUyZjJmNzEsIDB4MTM4NDg0OTcsIDB4YTY1MzUzZjUsIDB4YjlkMWQxNjgsIDB4MDAwMDAwMDAsIDB4YzFlZGVkMmMsCisgICAgMHg0MDIwMjA2MCwgMHhlM2ZjZmMxZiwgMHg3OWIxYjFjOCwgMHhiNjViNWJlZCwgMHhkNDZhNmFiZSwgMHg4ZGNiY2I0NiwKKyAgICAweDY3YmViZWQ5LCAweDcyMzkzOTRiLCAweDk0NGE0YWRlLCAweDk4NGM0Y2Q0LCAweGIwNTg1OGU4LCAweDg1Y2ZjZjRhLAorICAgIDB4YmJkMGQwNmIsIDB4YzVlZmVmMmEsIDB4NGZhYWFhZTUsIDB4ZWRmYmZiMTYsIDB4ODY0MzQzYzUsIDB4OWE0ZDRkZDcsCisgICAgMHg2NjMzMzM1NSwgMHgxMTg1ODU5NCwgMHg4YTQ1NDVjZiwgMHhlOWY5ZjkxMCwgMHgwNDAyMDIwNiwgMHhmZTdmN2Y4MSwKKyAgICAweGEwNTA1MGYwLCAweDc4M2MzYzQ0LCAweDI1OWY5ZmJhLCAweDRiYThhOGUzLCAweGEyNTE1MWYzLCAweDVkYTNhM2ZlLAorICAgIDB4ODA0MDQwYzAsIDB4MDU4ZjhmOGEsIDB4M2Y5MjkyYWQsIDB4MjE5ZDlkYmMsIDB4NzAzODM4NDgsIDB4ZjFmNWY1MDQsCisgICAgMHg2M2JjYmNkZiwgMHg3N2I2YjZjMSwgMHhhZmRhZGE3NSwgMHg0MjIxMjE2MywgMHgyMDEwMTAzMCwgMHhlNWZmZmYxYSwKKyAgICAweGZkZjNmMzBlLCAweGJmZDJkMjZkLCAweDgxY2RjZDRjLCAweDE4MGMwYzE0LCAweDI2MTMxMzM1LCAweGMzZWNlYzJmLAorICAgIDB4YmU1ZjVmZTEsIDB4MzU5Nzk3YTIsIDB4ODg0NDQ0Y2MsIDB4MmUxNzE3MzksIDB4OTNjNGM0NTcsIDB4NTVhN2E3ZjIsCisgICAgMHhmYzdlN2U4MiwgMHg3YTNkM2Q0NywgMHhjODY0NjRhYywgMHhiYTVkNWRlNywgMHgzMjE5MTkyYiwgMHhlNjczNzM5NSwKKyAgICAweGMwNjA2MGEwLCAweDE5ODE4MTk4LCAweDllNGY0ZmQxLCAweGEzZGNkYzdmLCAweDQ0MjIyMjY2LCAweDU0MmEyYTdlLAorICAgIDB4M2I5MDkwYWIsIDB4MGI4ODg4ODMsIDB4OGM0NjQ2Y2EsIDB4YzdlZWVlMjksIDB4NmJiOGI4ZDMsIDB4MjgxNDE0M2MsCisgICAgMHhhN2RlZGU3OSwgMHhiYzVlNWVlMiwgMHgxNjBiMGIxZCwgMHhhZGRiZGI3NiwgMHhkYmUwZTAzYiwgMHg2NDMyMzI1NiwKKyAgICAweDc0M2EzYTRlLCAweDE0MGEwYTFlLCAweDkyNDk0OWRiLCAweDBjMDYwNjBhLCAweDQ4MjQyNDZjLCAweGI4NWM1Y2U0LAorICAgIDB4OWZjMmMyNWQsIDB4YmRkM2QzNmUsIDB4NDNhY2FjZWYsIDB4YzQ2MjYyYTYsIDB4Mzk5MTkxYTgsIDB4MzE5NTk1YTQsCisgICAgMHhkM2U0ZTQzNywgMHhmMjc5Nzk4YiwgMHhkNWU3ZTczMiwgMHg4YmM4Yzg0MywgMHg2ZTM3Mzc1OSwgMHhkYTZkNmRiNywKKyAgICAweDAxOGQ4ZDhjLCAweGIxZDVkNTY0LCAweDljNGU0ZWQyLCAweDQ5YTlhOWUwLCAweGQ4NmM2Y2I0LCAweGFjNTY1NmZhLAorICAgIDB4ZjNmNGY0MDcsIDB4Y2ZlYWVhMjUsIDB4Y2E2NTY1YWYsIDB4ZjQ3YTdhOGUsIDB4NDdhZWFlZTksIDB4MTAwODA4MTgsCisgICAgMHg2ZmJhYmFkNSwgMHhmMDc4Nzg4OCwgMHg0YTI1MjU2ZiwgMHg1YzJlMmU3MiwgMHgzODFjMWMyNCwgMHg1N2E2YTZmMSwKKyAgICAweDczYjRiNGM3LCAweDk3YzZjNjUxLCAweGNiZThlODIzLCAweGExZGRkZDdjLCAweGU4NzQ3NDljLCAweDNlMWYxZjIxLAorICAgIDB4OTY0YjRiZGQsIDB4NjFiZGJkZGMsIDB4MGQ4YjhiODYsIDB4MGY4YThhODUsIDB4ZTA3MDcwOTAsIDB4N2MzZTNlNDIsCisgICAgMHg3MWI1YjVjNCwgMHhjYzY2NjZhYSwgMHg5MDQ4NDhkOCwgMHgwNjAzMDMwNSwgMHhmN2Y2ZjYwMSwgMHgxYzBlMGUxMiwKKyAgICAweGMyNjE2MWEzLCAweDZhMzUzNTVmLCAweGFlNTc1N2Y5LCAweDY5YjliOWQwLCAweDE3ODY4NjkxLCAweDk5YzFjMTU4LAorICAgIDB4M2ExZDFkMjcsIDB4Mjc5ZTllYjksIDB4ZDllMWUxMzgsIDB4ZWJmOGY4MTMsIDB4MmI5ODk4YjMsIDB4MjIxMTExMzMsCisgICAgMHhkMjY5NjliYiwgMHhhOWQ5ZDk3MCwgMHgwNzhlOGU4OSwgMHgzMzk0OTRhNywgMHgyZDliOWJiNiwgMHgzYzFlMWUyMiwKKyAgICAweDE1ODc4NzkyLCAweGM5ZTllOTIwLCAweDg3Y2VjZTQ5LCAweGFhNTU1NWZmLCAweDUwMjgyODc4LCAweGE1ZGZkZjdhLAorICAgIDB4MDM4YzhjOGYsIDB4NTlhMWExZjgsIDB4MDk4OTg5ODAsIDB4MWEwZDBkMTcsIDB4NjViZmJmZGEsIDB4ZDdlNmU2MzEsCisgICAgMHg4NDQyNDJjNiwgMHhkMDY4NjhiOCwgMHg4MjQxNDFjMywgMHgyOTk5OTliMCwgMHg1YTJkMmQ3NywgMHgxZTBmMGYxMSwKICAgICAweDdiYjBiMGNiLCAweGE4NTQ1NGZjLCAweDZkYmJiYmQ2LCAweDJjMTYxNjNhLAogfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgRTFbMjU2XSA9IHsKLSAgICAweGE1YzY2MzYzLCAweDg0Zjg3YzdjLCAweDk5ZWU3Nzc3LCAweDhkZjY3YjdiLAotICAgIDB4MGRmZmYyZjIsIDB4YmRkNjZiNmIsIDB4YjFkZTZmNmYsIDB4NTQ5MWM1YzUsCi0gICAgMHg1MDYwMzAzMCwgMHgwMzAyMDEwMSwgMHhhOWNlNjc2NywgMHg3ZDU2MmIyYiwKLSAgICAweDE5ZTdmZWZlLCAweDYyYjVkN2Q3LCAweGU2NGRhYmFiLCAweDlhZWM3Njc2LAotICAgIDB4NDU4ZmNhY2EsIDB4OWQxZjgyODIsIDB4NDA4OWM5YzksIDB4ODdmYTdkN2QsCi0gICAgMHgxNWVmZmFmYSwgMHhlYmIyNTk1OSwgMHhjOThlNDc0NywgMHgwYmZiZjBmMCwKLSAgICAweGVjNDFhZGFkLCAweDY3YjNkNGQ0LCAweGZkNWZhMmEyLCAweGVhNDVhZmFmLAotICAgIDB4YmYyMzljOWMsIDB4Zjc1M2E0YTQsIDB4OTZlNDcyNzIsIDB4NWI5YmMwYzAsCi0gICAgMHhjMjc1YjdiNywgMHgxY2UxZmRmZCwgMHhhZTNkOTM5MywgMHg2YTRjMjYyNiwKLSAgICAweDVhNmMzNjM2LCAweDQxN2UzZjNmLCAweDAyZjVmN2Y3LCAweDRmODNjY2NjLAotICAgIDB4NWM2ODM0MzQsIDB4ZjQ1MWE1YTUsIDB4MzRkMWU1ZTUsIDB4MDhmOWYxZjEsCi0gICAgMHg5M2UyNzE3MSwgMHg3M2FiZDhkOCwgMHg1MzYyMzEzMSwgMHgzZjJhMTUxNSwKLSAgICAweDBjMDgwNDA0LCAweDUyOTVjN2M3LCAweDY1NDYyMzIzLCAweDVlOWRjM2MzLAotICAgIDB4MjgzMDE4MTgsIDB4YTEzNzk2OTYsIDB4MGYwYTA1MDUsIDB4YjUyZjlhOWEsCi0gICAgMHgwOTBlMDcwNywgMHgzNjI0MTIxMiwgMHg5YjFiODA4MCwgMHgzZGRmZTJlMiwKLSAgICAweDI2Y2RlYmViLCAweDY5NGUyNzI3LCAweGNkN2ZiMmIyLCAweDlmZWE3NTc1LAotICAgIDB4MWIxMjA5MDksIDB4OWUxZDgzODMsIDB4NzQ1ODJjMmMsIDB4MmUzNDFhMWEsCi0gICAgMHgyZDM2MWIxYiwgMHhiMmRjNmU2ZSwgMHhlZWI0NWE1YSwgMHhmYjViYTBhMCwKLSAgICAweGY2YTQ1MjUyLCAweDRkNzYzYjNiLCAweDYxYjdkNmQ2LCAweGNlN2RiM2IzLAotICAgIDB4N2I1MjI5MjksIDB4M2VkZGUzZTMsIDB4NzE1ZTJmMmYsIDB4OTcxMzg0ODQsCi0gICAgMHhmNWE2NTM1MywgMHg2OGI5ZDFkMSwgMHgwMDAwMDAwMCwgMHgyY2MxZWRlZCwKLSAgICAweDYwNDAyMDIwLCAweDFmZTNmY2ZjLCAweGM4NzliMWIxLCAweGVkYjY1YjViLAotICAgIDB4YmVkNDZhNmEsIDB4NDY4ZGNiY2IsIDB4ZDk2N2JlYmUsIDB4NGI3MjM5MzksCi0gICAgMHhkZTk0NGE0YSwgMHhkNDk4NGM0YywgMHhlOGIwNTg1OCwgMHg0YTg1Y2ZjZiwKLSAgICAweDZiYmJkMGQwLCAweDJhYzVlZmVmLCAweGU1NGZhYWFhLCAweDE2ZWRmYmZiLAotICAgIDB4YzU4NjQzNDMsIDB4ZDc5YTRkNGQsIDB4NTU2NjMzMzMsIDB4OTQxMTg1ODUsCi0gICAgMHhjZjhhNDU0NSwgMHgxMGU5ZjlmOSwgMHgwNjA0MDIwMiwgMHg4MWZlN2Y3ZiwKLSAgICAweGYwYTA1MDUwLCAweDQ0NzgzYzNjLCAweGJhMjU5ZjlmLCAweGUzNGJhOGE4LAotICAgIDB4ZjNhMjUxNTEsIDB4ZmU1ZGEzYTMsIDB4YzA4MDQwNDAsIDB4OGEwNThmOGYsCi0gICAgMHhhZDNmOTI5MiwgMHhiYzIxOWQ5ZCwgMHg0ODcwMzgzOCwgMHgwNGYxZjVmNSwKLSAgICAweGRmNjNiY2JjLCAweGMxNzdiNmI2LCAweDc1YWZkYWRhLCAweDYzNDIyMTIxLAotICAgIDB4MzAyMDEwMTAsIDB4MWFlNWZmZmYsIDB4MGVmZGYzZjMsIDB4NmRiZmQyZDIsCi0gICAgMHg0YzgxY2RjZCwgMHgxNDE4MGMwYywgMHgzNTI2MTMxMywgMHgyZmMzZWNlYywKLSAgICAweGUxYmU1ZjVmLCAweGEyMzU5Nzk3LCAweGNjODg0NDQ0LCAweDM5MmUxNzE3LAotICAgIDB4NTc5M2M0YzQsIDB4ZjI1NWE3YTcsIDB4ODJmYzdlN2UsIDB4NDc3YTNkM2QsCi0gICAgMHhhY2M4NjQ2NCwgMHhlN2JhNWQ1ZCwgMHgyYjMyMTkxOSwgMHg5NWU2NzM3MywKLSAgICAweGEwYzA2MDYwLCAweDk4MTk4MTgxLCAweGQxOWU0ZjRmLCAweDdmYTNkY2RjLAotICAgIDB4NjY0NDIyMjIsIDB4N2U1NDJhMmEsIDB4YWIzYjkwOTAsIDB4ODMwYjg4ODgsCi0gICAgMHhjYThjNDY0NiwgMHgyOWM3ZWVlZSwgMHhkMzZiYjhiOCwgMHgzYzI4MTQxNCwKLSAgICAweDc5YTdkZWRlLCAweGUyYmM1ZTVlLCAweDFkMTYwYjBiLCAweDc2YWRkYmRiLAotICAgIDB4M2JkYmUwZTAsIDB4NTY2NDMyMzIsIDB4NGU3NDNhM2EsIDB4MWUxNDBhMGEsCi0gICAgMHhkYjkyNDk0OSwgMHgwYTBjMDYwNiwgMHg2YzQ4MjQyNCwgMHhlNGI4NWM1YywKLSAgICAweDVkOWZjMmMyLCAweDZlYmRkM2QzLCAweGVmNDNhY2FjLCAweGE2YzQ2MjYyLAotICAgIDB4YTgzOTkxOTEsIDB4YTQzMTk1OTUsIDB4MzdkM2U0ZTQsIDB4OGJmMjc5NzksCi0gICAgMHgzMmQ1ZTdlNywgMHg0MzhiYzhjOCwgMHg1OTZlMzczNywgMHhiN2RhNmQ2ZCwKLSAgICAweDhjMDE4ZDhkLCAweDY0YjFkNWQ1LCAweGQyOWM0ZTRlLCAweGUwNDlhOWE5LAotICAgIDB4YjRkODZjNmMsIDB4ZmFhYzU2NTYsIDB4MDdmM2Y0ZjQsIDB4MjVjZmVhZWEsCi0gICAgMHhhZmNhNjU2NSwgMHg4ZWY0N2E3YSwgMHhlOTQ3YWVhZSwgMHgxODEwMDgwOCwKLSAgICAweGQ1NmZiYWJhLCAweDg4ZjA3ODc4LCAweDZmNGEyNTI1LCAweDcyNWMyZTJlLAotICAgIDB4MjQzODFjMWMsIDB4ZjE1N2E2YTYsIDB4Yzc3M2I0YjQsIDB4NTE5N2M2YzYsCi0gICAgMHgyM2NiZThlOCwgMHg3Y2ExZGRkZCwgMHg5Y2U4NzQ3NCwgMHgyMTNlMWYxZiwKLSAgICAweGRkOTY0YjRiLCAweGRjNjFiZGJkLCAweDg2MGQ4YjhiLCAweDg1MGY4YThhLAotICAgIDB4OTBlMDcwNzAsIDB4NDI3YzNlM2UsIDB4YzQ3MWI1YjUsIDB4YWFjYzY2NjYsCi0gICAgMHhkODkwNDg0OCwgMHgwNTA2MDMwMywgMHgwMWY3ZjZmNiwgMHgxMjFjMGUwZSwKLSAgICAweGEzYzI2MTYxLCAweDVmNmEzNTM1LCAweGY5YWU1NzU3LCAweGQwNjliOWI5LAotICAgIDB4OTExNzg2ODYsIDB4NTg5OWMxYzEsIDB4MjczYTFkMWQsIDB4YjkyNzllOWUsCi0gICAgMHgzOGQ5ZTFlMSwgMHgxM2ViZjhmOCwgMHhiMzJiOTg5OCwgMHgzMzIyMTExMSwKLSAgICAweGJiZDI2OTY5LCAweDcwYTlkOWQ5LCAweDg5MDc4ZThlLCAweGE3MzM5NDk0LAotICAgIDB4YjYyZDliOWIsIDB4MjIzYzFlMWUsIDB4OTIxNTg3ODcsIDB4MjBjOWU5ZTksCi0gICAgMHg0OTg3Y2VjZSwgMHhmZmFhNTU1NSwgMHg3ODUwMjgyOCwgMHg3YWE1ZGZkZiwKLSAgICAweDhmMDM4YzhjLCAweGY4NTlhMWExLCAweDgwMDk4OTg5LCAweDE3MWEwZDBkLAotICAgIDB4ZGE2NWJmYmYsIDB4MzFkN2U2ZTYsIDB4YzY4NDQyNDIsIDB4YjhkMDY4NjgsCi0gICAgMHhjMzgyNDE0MSwgMHhiMDI5OTk5OSwgMHg3NzVhMmQyZCwgMHgxMTFlMGYwZiwKKyAgICAweGE1YzY2MzYzLCAweDg0Zjg3YzdjLCAweDk5ZWU3Nzc3LCAweDhkZjY3YjdiLCAweDBkZmZmMmYyLCAweGJkZDY2YjZiLAorICAgIDB4YjFkZTZmNmYsIDB4NTQ5MWM1YzUsIDB4NTA2MDMwMzAsIDB4MDMwMjAxMDEsIDB4YTljZTY3NjcsIDB4N2Q1NjJiMmIsCisgICAgMHgxOWU3ZmVmZSwgMHg2MmI1ZDdkNywgMHhlNjRkYWJhYiwgMHg5YWVjNzY3NiwgMHg0NThmY2FjYSwgMHg5ZDFmODI4MiwKKyAgICAweDQwODljOWM5LCAweDg3ZmE3ZDdkLCAweDE1ZWZmYWZhLCAweGViYjI1OTU5LCAweGM5OGU0NzQ3LCAweDBiZmJmMGYwLAorICAgIDB4ZWM0MWFkYWQsIDB4NjdiM2Q0ZDQsIDB4ZmQ1ZmEyYTIsIDB4ZWE0NWFmYWYsIDB4YmYyMzljOWMsIDB4Zjc1M2E0YTQsCisgICAgMHg5NmU0NzI3MiwgMHg1YjliYzBjMCwgMHhjMjc1YjdiNywgMHgxY2UxZmRmZCwgMHhhZTNkOTM5MywgMHg2YTRjMjYyNiwKKyAgICAweDVhNmMzNjM2LCAweDQxN2UzZjNmLCAweDAyZjVmN2Y3LCAweDRmODNjY2NjLCAweDVjNjgzNDM0LCAweGY0NTFhNWE1LAorICAgIDB4MzRkMWU1ZTUsIDB4MDhmOWYxZjEsIDB4OTNlMjcxNzEsIDB4NzNhYmQ4ZDgsIDB4NTM2MjMxMzEsIDB4M2YyYTE1MTUsCisgICAgMHgwYzA4MDQwNCwgMHg1Mjk1YzdjNywgMHg2NTQ2MjMyMywgMHg1ZTlkYzNjMywgMHgyODMwMTgxOCwgMHhhMTM3OTY5NiwKKyAgICAweDBmMGEwNTA1LCAweGI1MmY5YTlhLCAweDA5MGUwNzA3LCAweDM2MjQxMjEyLCAweDliMWI4MDgwLCAweDNkZGZlMmUyLAorICAgIDB4MjZjZGViZWIsIDB4Njk0ZTI3MjcsIDB4Y2Q3ZmIyYjIsIDB4OWZlYTc1NzUsIDB4MWIxMjA5MDksIDB4OWUxZDgzODMsCisgICAgMHg3NDU4MmMyYywgMHgyZTM0MWExYSwgMHgyZDM2MWIxYiwgMHhiMmRjNmU2ZSwgMHhlZWI0NWE1YSwgMHhmYjViYTBhMCwKKyAgICAweGY2YTQ1MjUyLCAweDRkNzYzYjNiLCAweDYxYjdkNmQ2LCAweGNlN2RiM2IzLCAweDdiNTIyOTI5LCAweDNlZGRlM2UzLAorICAgIDB4NzE1ZTJmMmYsIDB4OTcxMzg0ODQsIDB4ZjVhNjUzNTMsIDB4NjhiOWQxZDEsIDB4MDAwMDAwMDAsIDB4MmNjMWVkZWQsCisgICAgMHg2MDQwMjAyMCwgMHgxZmUzZmNmYywgMHhjODc5YjFiMSwgMHhlZGI2NWI1YiwgMHhiZWQ0NmE2YSwgMHg0NjhkY2JjYiwKKyAgICAweGQ5NjdiZWJlLCAweDRiNzIzOTM5LCAweGRlOTQ0YTRhLCAweGQ0OTg0YzRjLCAweGU4YjA1ODU4LCAweDRhODVjZmNmLAorICAgIDB4NmJiYmQwZDAsIDB4MmFjNWVmZWYsIDB4ZTU0ZmFhYWEsIDB4MTZlZGZiZmIsIDB4YzU4NjQzNDMsIDB4ZDc5YTRkNGQsCisgICAgMHg1NTY2MzMzMywgMHg5NDExODU4NSwgMHhjZjhhNDU0NSwgMHgxMGU5ZjlmOSwgMHgwNjA0MDIwMiwgMHg4MWZlN2Y3ZiwKKyAgICAweGYwYTA1MDUwLCAweDQ0NzgzYzNjLCAweGJhMjU5ZjlmLCAweGUzNGJhOGE4LCAweGYzYTI1MTUxLCAweGZlNWRhM2EzLAorICAgIDB4YzA4MDQwNDAsIDB4OGEwNThmOGYsIDB4YWQzZjkyOTIsIDB4YmMyMTlkOWQsIDB4NDg3MDM4MzgsIDB4MDRmMWY1ZjUsCisgICAgMHhkZjYzYmNiYywgMHhjMTc3YjZiNiwgMHg3NWFmZGFkYSwgMHg2MzQyMjEyMSwgMHgzMDIwMTAxMCwgMHgxYWU1ZmZmZiwKKyAgICAweDBlZmRmM2YzLCAweDZkYmZkMmQyLCAweDRjODFjZGNkLCAweDE0MTgwYzBjLCAweDM1MjYxMzEzLCAweDJmYzNlY2VjLAorICAgIDB4ZTFiZTVmNWYsIDB4YTIzNTk3OTcsIDB4Y2M4ODQ0NDQsIDB4MzkyZTE3MTcsIDB4NTc5M2M0YzQsIDB4ZjI1NWE3YTcsCisgICAgMHg4MmZjN2U3ZSwgMHg0NzdhM2QzZCwgMHhhY2M4NjQ2NCwgMHhlN2JhNWQ1ZCwgMHgyYjMyMTkxOSwgMHg5NWU2NzM3MywKKyAgICAweGEwYzA2MDYwLCAweDk4MTk4MTgxLCAweGQxOWU0ZjRmLCAweDdmYTNkY2RjLCAweDY2NDQyMjIyLCAweDdlNTQyYTJhLAorICAgIDB4YWIzYjkwOTAsIDB4ODMwYjg4ODgsIDB4Y2E4YzQ2NDYsIDB4MjljN2VlZWUsIDB4ZDM2YmI4YjgsIDB4M2MyODE0MTQsCisgICAgMHg3OWE3ZGVkZSwgMHhlMmJjNWU1ZSwgMHgxZDE2MGIwYiwgMHg3NmFkZGJkYiwgMHgzYmRiZTBlMCwgMHg1NjY0MzIzMiwKKyAgICAweDRlNzQzYTNhLCAweDFlMTQwYTBhLCAweGRiOTI0OTQ5LCAweDBhMGMwNjA2LCAweDZjNDgyNDI0LCAweGU0Yjg1YzVjLAorICAgIDB4NWQ5ZmMyYzIsIDB4NmViZGQzZDMsIDB4ZWY0M2FjYWMsIDB4YTZjNDYyNjIsIDB4YTgzOTkxOTEsIDB4YTQzMTk1OTUsCisgICAgMHgzN2QzZTRlNCwgMHg4YmYyNzk3OSwgMHgzMmQ1ZTdlNywgMHg0MzhiYzhjOCwgMHg1OTZlMzczNywgMHhiN2RhNmQ2ZCwKKyAgICAweDhjMDE4ZDhkLCAweDY0YjFkNWQ1LCAweGQyOWM0ZTRlLCAweGUwNDlhOWE5LCAweGI0ZDg2YzZjLCAweGZhYWM1NjU2LAorICAgIDB4MDdmM2Y0ZjQsIDB4MjVjZmVhZWEsIDB4YWZjYTY1NjUsIDB4OGVmNDdhN2EsIDB4ZTk0N2FlYWUsIDB4MTgxMDA4MDgsCisgICAgMHhkNTZmYmFiYSwgMHg4OGYwNzg3OCwgMHg2ZjRhMjUyNSwgMHg3MjVjMmUyZSwgMHgyNDM4MWMxYywgMHhmMTU3YTZhNiwKKyAgICAweGM3NzNiNGI0LCAweDUxOTdjNmM2LCAweDIzY2JlOGU4LCAweDdjYTFkZGRkLCAweDljZTg3NDc0LCAweDIxM2UxZjFmLAorICAgIDB4ZGQ5NjRiNGIsIDB4ZGM2MWJkYmQsIDB4ODYwZDhiOGIsIDB4ODUwZjhhOGEsIDB4OTBlMDcwNzAsIDB4NDI3YzNlM2UsCisgICAgMHhjNDcxYjViNSwgMHhhYWNjNjY2NiwgMHhkODkwNDg0OCwgMHgwNTA2MDMwMywgMHgwMWY3ZjZmNiwgMHgxMjFjMGUwZSwKKyAgICAweGEzYzI2MTYxLCAweDVmNmEzNTM1LCAweGY5YWU1NzU3LCAweGQwNjliOWI5LCAweDkxMTc4Njg2LCAweDU4OTljMWMxLAorICAgIDB4MjczYTFkMWQsIDB4YjkyNzllOWUsIDB4MzhkOWUxZTEsIDB4MTNlYmY4ZjgsIDB4YjMyYjk4OTgsIDB4MzMyMjExMTEsCisgICAgMHhiYmQyNjk2OSwgMHg3MGE5ZDlkOSwgMHg4OTA3OGU4ZSwgMHhhNzMzOTQ5NCwgMHhiNjJkOWI5YiwgMHgyMjNjMWUxZSwKKyAgICAweDkyMTU4Nzg3LCAweDIwYzllOWU5LCAweDQ5ODdjZWNlLCAweGZmYWE1NTU1LCAweDc4NTAyODI4LCAweDdhYTVkZmRmLAorICAgIDB4OGYwMzhjOGMsIDB4Zjg1OWExYTEsIDB4ODAwOTg5ODksIDB4MTcxYTBkMGQsIDB4ZGE2NWJmYmYsIDB4MzFkN2U2ZTYsCisgICAgMHhjNjg0NDI0MiwgMHhiOGQwNjg2OCwgMHhjMzgyNDE0MSwgMHhiMDI5OTk5OSwgMHg3NzVhMmQyZCwgMHgxMTFlMGYwZiwKICAgICAweGNiN2JiMGIwLCAweGZjYTg1NDU0LCAweGQ2NmRiYmJiLCAweDNhMmMxNjE2LAogfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgRTJbMjU2XSA9IHsKLSAgICAweDYzYTVjNjYzLCAweDdjODRmODdjLCAweDc3OTllZTc3LCAweDdiOGRmNjdiLAotICAgIDB4ZjIwZGZmZjIsIDB4NmJiZGQ2NmIsIDB4NmZiMWRlNmYsIDB4YzU1NDkxYzUsCi0gICAgMHgzMDUwNjAzMCwgMHgwMTAzMDIwMSwgMHg2N2E5Y2U2NywgMHgyYjdkNTYyYiwKLSAgICAweGZlMTllN2ZlLCAweGQ3NjJiNWQ3LCAweGFiZTY0ZGFiLCAweDc2OWFlYzc2LAotICAgIDB4Y2E0NThmY2EsIDB4ODI5ZDFmODIsIDB4Yzk0MDg5YzksIDB4N2Q4N2ZhN2QsCi0gICAgMHhmYTE1ZWZmYSwgMHg1OWViYjI1OSwgMHg0N2M5OGU0NywgMHhmMDBiZmJmMCwKLSAgICAweGFkZWM0MWFkLCAweGQ0NjdiM2Q0LCAweGEyZmQ1ZmEyLCAweGFmZWE0NWFmLAotICAgIDB4OWNiZjIzOWMsIDB4YTRmNzUzYTQsIDB4NzI5NmU0NzIsIDB4YzA1YjliYzAsCi0gICAgMHhiN2MyNzViNywgMHhmZDFjZTFmZCwgMHg5M2FlM2Q5MywgMHgyNjZhNGMyNiwKLSAgICAweDM2NWE2YzM2LCAweDNmNDE3ZTNmLCAweGY3MDJmNWY3LCAweGNjNGY4M2NjLAotICAgIDB4MzQ1YzY4MzQsIDB4YTVmNDUxYTUsIDB4ZTUzNGQxZTUsIDB4ZjEwOGY5ZjEsCi0gICAgMHg3MTkzZTI3MSwgMHhkODczYWJkOCwgMHgzMTUzNjIzMSwgMHgxNTNmMmExNSwKLSAgICAweDA0MGMwODA0LCAweGM3NTI5NWM3LCAweDIzNjU0NjIzLCAweGMzNWU5ZGMzLAotICAgIDB4MTgyODMwMTgsIDB4OTZhMTM3OTYsIDB4MDUwZjBhMDUsIDB4OWFiNTJmOWEsCi0gICAgMHgwNzA5MGUwNywgMHgxMjM2MjQxMiwgMHg4MDliMWI4MCwgMHhlMjNkZGZlMiwKLSAgICAweGViMjZjZGViLCAweDI3Njk0ZTI3LCAweGIyY2Q3ZmIyLCAweDc1OWZlYTc1LAotICAgIDB4MDkxYjEyMDksIDB4ODM5ZTFkODMsIDB4MmM3NDU4MmMsIDB4MWEyZTM0MWEsCi0gICAgMHgxYjJkMzYxYiwgMHg2ZWIyZGM2ZSwgMHg1YWVlYjQ1YSwgMHhhMGZiNWJhMCwKLSAgICAweDUyZjZhNDUyLCAweDNiNGQ3NjNiLCAweGQ2NjFiN2Q2LCAweGIzY2U3ZGIzLAotICAgIDB4Mjk3YjUyMjksIDB4ZTMzZWRkZTMsIDB4MmY3MTVlMmYsIDB4ODQ5NzEzODQsCi0gICAgMHg1M2Y1YTY1MywgMHhkMTY4YjlkMSwgMHgwMDAwMDAwMCwgMHhlZDJjYzFlZCwKLSAgICAweDIwNjA0MDIwLCAweGZjMWZlM2ZjLCAweGIxYzg3OWIxLCAweDViZWRiNjViLAotICAgIDB4NmFiZWQ0NmEsIDB4Y2I0NjhkY2IsIDB4YmVkOTY3YmUsIDB4Mzk0YjcyMzksCi0gICAgMHg0YWRlOTQ0YSwgMHg0Y2Q0OTg0YywgMHg1OGU4YjA1OCwgMHhjZjRhODVjZiwKLSAgICAweGQwNmJiYmQwLCAweGVmMmFjNWVmLCAweGFhZTU0ZmFhLCAweGZiMTZlZGZiLAotICAgIDB4NDNjNTg2NDMsIDB4NGRkNzlhNGQsIDB4MzM1NTY2MzMsIDB4ODU5NDExODUsCi0gICAgMHg0NWNmOGE0NSwgMHhmOTEwZTlmOSwgMHgwMjA2MDQwMiwgMHg3ZjgxZmU3ZiwKLSAgICAweDUwZjBhMDUwLCAweDNjNDQ3ODNjLCAweDlmYmEyNTlmLCAweGE4ZTM0YmE4LAotICAgIDB4NTFmM2EyNTEsIDB4YTNmZTVkYTMsIDB4NDBjMDgwNDAsIDB4OGY4YTA1OGYsCi0gICAgMHg5MmFkM2Y5MiwgMHg5ZGJjMjE5ZCwgMHgzODQ4NzAzOCwgMHhmNTA0ZjFmNSwKLSAgICAweGJjZGY2M2JjLCAweGI2YzE3N2I2LCAweGRhNzVhZmRhLCAweDIxNjM0MjIxLAotICAgIDB4MTAzMDIwMTAsIDB4ZmYxYWU1ZmYsIDB4ZjMwZWZkZjMsIDB4ZDI2ZGJmZDIsCi0gICAgMHhjZDRjODFjZCwgMHgwYzE0MTgwYywgMHgxMzM1MjYxMywgMHhlYzJmYzNlYywKLSAgICAweDVmZTFiZTVmLCAweDk3YTIzNTk3LCAweDQ0Y2M4ODQ0LCAweDE3MzkyZTE3LAotICAgIDB4YzQ1NzkzYzQsIDB4YTdmMjU1YTcsIDB4N2U4MmZjN2UsIDB4M2Q0NzdhM2QsCi0gICAgMHg2NGFjYzg2NCwgMHg1ZGU3YmE1ZCwgMHgxOTJiMzIxOSwgMHg3Mzk1ZTY3MywKLSAgICAweDYwYTBjMDYwLCAweDgxOTgxOTgxLCAweDRmZDE5ZTRmLCAweGRjN2ZhM2RjLAotICAgIDB4MjI2NjQ0MjIsIDB4MmE3ZTU0MmEsIDB4OTBhYjNiOTAsIDB4ODg4MzBiODgsCi0gICAgMHg0NmNhOGM0NiwgMHhlZTI5YzdlZSwgMHhiOGQzNmJiOCwgMHgxNDNjMjgxNCwKLSAgICAweGRlNzlhN2RlLCAweDVlZTJiYzVlLCAweDBiMWQxNjBiLCAweGRiNzZhZGRiLAotICAgIDB4ZTAzYmRiZTAsIDB4MzI1NjY0MzIsIDB4M2E0ZTc0M2EsIDB4MGExZTE0MGEsCi0gICAgMHg0OWRiOTI0OSwgMHgwNjBhMGMwNiwgMHgyNDZjNDgyNCwgMHg1Y2U0Yjg1YywKLSAgICAweGMyNWQ5ZmMyLCAweGQzNmViZGQzLCAweGFjZWY0M2FjLCAweDYyYTZjNDYyLAotICAgIDB4OTFhODM5OTEsIDB4OTVhNDMxOTUsIDB4ZTQzN2QzZTQsIDB4Nzk4YmYyNzksCi0gICAgMHhlNzMyZDVlNywgMHhjODQzOGJjOCwgMHgzNzU5NmUzNywgMHg2ZGI3ZGE2ZCwKLSAgICAweDhkOGMwMThkLCAweGQ1NjRiMWQ1LCAweDRlZDI5YzRlLCAweGE5ZTA0OWE5LAotICAgIDB4NmNiNGQ4NmMsIDB4NTZmYWFjNTYsIDB4ZjQwN2YzZjQsIDB4ZWEyNWNmZWEsCi0gICAgMHg2NWFmY2E2NSwgMHg3YThlZjQ3YSwgMHhhZWU5NDdhZSwgMHgwODE4MTAwOCwKLSAgICAweGJhZDU2ZmJhLCAweDc4ODhmMDc4LCAweDI1NmY0YTI1LCAweDJlNzI1YzJlLAotICAgIDB4MWMyNDM4MWMsIDB4YTZmMTU3YTYsIDB4YjRjNzczYjQsIDB4YzY1MTk3YzYsCi0gICAgMHhlODIzY2JlOCwgMHhkZDdjYTFkZCwgMHg3NDljZTg3NCwgMHgxZjIxM2UxZiwKLSAgICAweDRiZGQ5NjRiLCAweGJkZGM2MWJkLCAweDhiODYwZDhiLCAweDhhODUwZjhhLAotICAgIDB4NzA5MGUwNzAsIDB4M2U0MjdjM2UsIDB4YjVjNDcxYjUsIDB4NjZhYWNjNjYsCi0gICAgMHg0OGQ4OTA0OCwgMHgwMzA1MDYwMywgMHhmNjAxZjdmNiwgMHgwZTEyMWMwZSwKLSAgICAweDYxYTNjMjYxLCAweDM1NWY2YTM1LCAweDU3ZjlhZTU3LCAweGI5ZDA2OWI5LAotICAgIDB4ODY5MTE3ODYsIDB4YzE1ODk5YzEsIDB4MWQyNzNhMWQsIDB4OWViOTI3OWUsCi0gICAgMHhlMTM4ZDllMSwgMHhmODEzZWJmOCwgMHg5OGIzMmI5OCwgMHgxMTMzMjIxMSwKLSAgICAweDY5YmJkMjY5LCAweGQ5NzBhOWQ5LCAweDhlODkwNzhlLCAweDk0YTczMzk0LAotICAgIDB4OWJiNjJkOWIsIDB4MWUyMjNjMWUsIDB4ODc5MjE1ODcsIDB4ZTkyMGM5ZTksCi0gICAgMHhjZTQ5ODdjZSwgMHg1NWZmYWE1NSwgMHgyODc4NTAyOCwgMHhkZjdhYTVkZiwKLSAgICAweDhjOGYwMzhjLCAweGExZjg1OWExLCAweDg5ODAwOTg5LCAweDBkMTcxYTBkLAotICAgIDB4YmZkYTY1YmYsIDB4ZTYzMWQ3ZTYsIDB4NDJjNjg0NDIsIDB4NjhiOGQwNjgsCi0gICAgMHg0MWMzODI0MSwgMHg5OWIwMjk5OSwgMHgyZDc3NWEyZCwgMHgwZjExMWUwZiwKKyAgICAweDYzYTVjNjYzLCAweDdjODRmODdjLCAweDc3OTllZTc3LCAweDdiOGRmNjdiLCAweGYyMGRmZmYyLCAweDZiYmRkNjZiLAorICAgIDB4NmZiMWRlNmYsIDB4YzU1NDkxYzUsIDB4MzA1MDYwMzAsIDB4MDEwMzAyMDEsIDB4NjdhOWNlNjcsIDB4MmI3ZDU2MmIsCisgICAgMHhmZTE5ZTdmZSwgMHhkNzYyYjVkNywgMHhhYmU2NGRhYiwgMHg3NjlhZWM3NiwgMHhjYTQ1OGZjYSwgMHg4MjlkMWY4MiwKKyAgICAweGM5NDA4OWM5LCAweDdkODdmYTdkLCAweGZhMTVlZmZhLCAweDU5ZWJiMjU5LCAweDQ3Yzk4ZTQ3LCAweGYwMGJmYmYwLAorICAgIDB4YWRlYzQxYWQsIDB4ZDQ2N2IzZDQsIDB4YTJmZDVmYTIsIDB4YWZlYTQ1YWYsIDB4OWNiZjIzOWMsIDB4YTRmNzUzYTQsCisgICAgMHg3Mjk2ZTQ3MiwgMHhjMDViOWJjMCwgMHhiN2MyNzViNywgMHhmZDFjZTFmZCwgMHg5M2FlM2Q5MywgMHgyNjZhNGMyNiwKKyAgICAweDM2NWE2YzM2LCAweDNmNDE3ZTNmLCAweGY3MDJmNWY3LCAweGNjNGY4M2NjLCAweDM0NWM2ODM0LCAweGE1ZjQ1MWE1LAorICAgIDB4ZTUzNGQxZTUsIDB4ZjEwOGY5ZjEsIDB4NzE5M2UyNzEsIDB4ZDg3M2FiZDgsIDB4MzE1MzYyMzEsIDB4MTUzZjJhMTUsCisgICAgMHgwNDBjMDgwNCwgMHhjNzUyOTVjNywgMHgyMzY1NDYyMywgMHhjMzVlOWRjMywgMHgxODI4MzAxOCwgMHg5NmExMzc5NiwKKyAgICAweDA1MGYwYTA1LCAweDlhYjUyZjlhLCAweDA3MDkwZTA3LCAweDEyMzYyNDEyLCAweDgwOWIxYjgwLCAweGUyM2RkZmUyLAorICAgIDB4ZWIyNmNkZWIsIDB4Mjc2OTRlMjcsIDB4YjJjZDdmYjIsIDB4NzU5ZmVhNzUsIDB4MDkxYjEyMDksIDB4ODM5ZTFkODMsCisgICAgMHgyYzc0NTgyYywgMHgxYTJlMzQxYSwgMHgxYjJkMzYxYiwgMHg2ZWIyZGM2ZSwgMHg1YWVlYjQ1YSwgMHhhMGZiNWJhMCwKKyAgICAweDUyZjZhNDUyLCAweDNiNGQ3NjNiLCAweGQ2NjFiN2Q2LCAweGIzY2U3ZGIzLCAweDI5N2I1MjI5LCAweGUzM2VkZGUzLAorICAgIDB4MmY3MTVlMmYsIDB4ODQ5NzEzODQsIDB4NTNmNWE2NTMsIDB4ZDE2OGI5ZDEsIDB4MDAwMDAwMDAsIDB4ZWQyY2MxZWQsCisgICAgMHgyMDYwNDAyMCwgMHhmYzFmZTNmYywgMHhiMWM4NzliMSwgMHg1YmVkYjY1YiwgMHg2YWJlZDQ2YSwgMHhjYjQ2OGRjYiwKKyAgICAweGJlZDk2N2JlLCAweDM5NGI3MjM5LCAweDRhZGU5NDRhLCAweDRjZDQ5ODRjLCAweDU4ZThiMDU4LCAweGNmNGE4NWNmLAorICAgIDB4ZDA2YmJiZDAsIDB4ZWYyYWM1ZWYsIDB4YWFlNTRmYWEsIDB4ZmIxNmVkZmIsIDB4NDNjNTg2NDMsIDB4NGRkNzlhNGQsCisgICAgMHgzMzU1NjYzMywgMHg4NTk0MTE4NSwgMHg0NWNmOGE0NSwgMHhmOTEwZTlmOSwgMHgwMjA2MDQwMiwgMHg3ZjgxZmU3ZiwKKyAgICAweDUwZjBhMDUwLCAweDNjNDQ3ODNjLCAweDlmYmEyNTlmLCAweGE4ZTM0YmE4LCAweDUxZjNhMjUxLCAweGEzZmU1ZGEzLAorICAgIDB4NDBjMDgwNDAsIDB4OGY4YTA1OGYsIDB4OTJhZDNmOTIsIDB4OWRiYzIxOWQsIDB4Mzg0ODcwMzgsIDB4ZjUwNGYxZjUsCisgICAgMHhiY2RmNjNiYywgMHhiNmMxNzdiNiwgMHhkYTc1YWZkYSwgMHgyMTYzNDIyMSwgMHgxMDMwMjAxMCwgMHhmZjFhZTVmZiwKKyAgICAweGYzMGVmZGYzLCAweGQyNmRiZmQyLCAweGNkNGM4MWNkLCAweDBjMTQxODBjLCAweDEzMzUyNjEzLCAweGVjMmZjM2VjLAorICAgIDB4NWZlMWJlNWYsIDB4OTdhMjM1OTcsIDB4NDRjYzg4NDQsIDB4MTczOTJlMTcsIDB4YzQ1NzkzYzQsIDB4YTdmMjU1YTcsCisgICAgMHg3ZTgyZmM3ZSwgMHgzZDQ3N2EzZCwgMHg2NGFjYzg2NCwgMHg1ZGU3YmE1ZCwgMHgxOTJiMzIxOSwgMHg3Mzk1ZTY3MywKKyAgICAweDYwYTBjMDYwLCAweDgxOTgxOTgxLCAweDRmZDE5ZTRmLCAweGRjN2ZhM2RjLCAweDIyNjY0NDIyLCAweDJhN2U1NDJhLAorICAgIDB4OTBhYjNiOTAsIDB4ODg4MzBiODgsIDB4NDZjYThjNDYsIDB4ZWUyOWM3ZWUsIDB4YjhkMzZiYjgsIDB4MTQzYzI4MTQsCisgICAgMHhkZTc5YTdkZSwgMHg1ZWUyYmM1ZSwgMHgwYjFkMTYwYiwgMHhkYjc2YWRkYiwgMHhlMDNiZGJlMCwgMHgzMjU2NjQzMiwKKyAgICAweDNhNGU3NDNhLCAweDBhMWUxNDBhLCAweDQ5ZGI5MjQ5LCAweDA2MGEwYzA2LCAweDI0NmM0ODI0LCAweDVjZTRiODVjLAorICAgIDB4YzI1ZDlmYzIsIDB4ZDM2ZWJkZDMsIDB4YWNlZjQzYWMsIDB4NjJhNmM0NjIsIDB4OTFhODM5OTEsIDB4OTVhNDMxOTUsCisgICAgMHhlNDM3ZDNlNCwgMHg3OThiZjI3OSwgMHhlNzMyZDVlNywgMHhjODQzOGJjOCwgMHgzNzU5NmUzNywgMHg2ZGI3ZGE2ZCwKKyAgICAweDhkOGMwMThkLCAweGQ1NjRiMWQ1LCAweDRlZDI5YzRlLCAweGE5ZTA0OWE5LCAweDZjYjRkODZjLCAweDU2ZmFhYzU2LAorICAgIDB4ZjQwN2YzZjQsIDB4ZWEyNWNmZWEsIDB4NjVhZmNhNjUsIDB4N2E4ZWY0N2EsIDB4YWVlOTQ3YWUsIDB4MDgxODEwMDgsCisgICAgMHhiYWQ1NmZiYSwgMHg3ODg4ZjA3OCwgMHgyNTZmNGEyNSwgMHgyZTcyNWMyZSwgMHgxYzI0MzgxYywgMHhhNmYxNTdhNiwKKyAgICAweGI0Yzc3M2I0LCAweGM2NTE5N2M2LCAweGU4MjNjYmU4LCAweGRkN2NhMWRkLCAweDc0OWNlODc0LCAweDFmMjEzZTFmLAorICAgIDB4NGJkZDk2NGIsIDB4YmRkYzYxYmQsIDB4OGI4NjBkOGIsIDB4OGE4NTBmOGEsIDB4NzA5MGUwNzAsIDB4M2U0MjdjM2UsCisgICAgMHhiNWM0NzFiNSwgMHg2NmFhY2M2NiwgMHg0OGQ4OTA0OCwgMHgwMzA1MDYwMywgMHhmNjAxZjdmNiwgMHgwZTEyMWMwZSwKKyAgICAweDYxYTNjMjYxLCAweDM1NWY2YTM1LCAweDU3ZjlhZTU3LCAweGI5ZDA2OWI5LCAweDg2OTExNzg2LCAweGMxNTg5OWMxLAorICAgIDB4MWQyNzNhMWQsIDB4OWViOTI3OWUsIDB4ZTEzOGQ5ZTEsIDB4ZjgxM2ViZjgsIDB4OThiMzJiOTgsIDB4MTEzMzIyMTEsCisgICAgMHg2OWJiZDI2OSwgMHhkOTcwYTlkOSwgMHg4ZTg5MDc4ZSwgMHg5NGE3MzM5NCwgMHg5YmI2MmQ5YiwgMHgxZTIyM2MxZSwKKyAgICAweDg3OTIxNTg3LCAweGU5MjBjOWU5LCAweGNlNDk4N2NlLCAweDU1ZmZhYTU1LCAweDI4Nzg1MDI4LCAweGRmN2FhNWRmLAorICAgIDB4OGM4ZjAzOGMsIDB4YTFmODU5YTEsIDB4ODk4MDA5ODksIDB4MGQxNzFhMGQsIDB4YmZkYTY1YmYsIDB4ZTYzMWQ3ZTYsCisgICAgMHg0MmM2ODQ0MiwgMHg2OGI4ZDA2OCwgMHg0MWMzODI0MSwgMHg5OWIwMjk5OSwgMHgyZDc3NWEyZCwgMHgwZjExMWUwZiwKICAgICAweGIwY2I3YmIwLCAweDU0ZmNhODU0LCAweGJiZDY2ZGJiLCAweDE2M2EyYzE2LAogfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgRTNbMjU2XSA9IHsKLSAgICAweDYzNjNhNWM2LCAweDdjN2M4NGY4LCAweDc3Nzc5OWVlLCAweDdiN2I4ZGY2LAotICAgIDB4ZjJmMjBkZmYsIDB4NmI2YmJkZDYsIDB4NmY2ZmIxZGUsIDB4YzVjNTU0OTEsCi0gICAgMHgzMDMwNTA2MCwgMHgwMTAxMDMwMiwgMHg2NzY3YTljZSwgMHgyYjJiN2Q1NiwKLSAgICAweGZlZmUxOWU3LCAweGQ3ZDc2MmI1LCAweGFiYWJlNjRkLCAweDc2NzY5YWVjLAotICAgIDB4Y2FjYTQ1OGYsIDB4ODI4MjlkMWYsIDB4YzljOTQwODksIDB4N2Q3ZDg3ZmEsCi0gICAgMHhmYWZhMTVlZiwgMHg1OTU5ZWJiMiwgMHg0NzQ3Yzk4ZSwgMHhmMGYwMGJmYiwKLSAgICAweGFkYWRlYzQxLCAweGQ0ZDQ2N2IzLCAweGEyYTJmZDVmLCAweGFmYWZlYTQ1LAotICAgIDB4OWM5Y2JmMjMsIDB4YTRhNGY3NTMsIDB4NzI3Mjk2ZTQsIDB4YzBjMDViOWIsCi0gICAgMHhiN2I3YzI3NSwgMHhmZGZkMWNlMSwgMHg5MzkzYWUzZCwgMHgyNjI2NmE0YywKLSAgICAweDM2MzY1YTZjLCAweDNmM2Y0MTdlLCAweGY3ZjcwMmY1LCAweGNjY2M0ZjgzLAotICAgIDB4MzQzNDVjNjgsIDB4YTVhNWY0NTEsIDB4ZTVlNTM0ZDEsIDB4ZjFmMTA4ZjksCi0gICAgMHg3MTcxOTNlMiwgMHhkOGQ4NzNhYiwgMHgzMTMxNTM2MiwgMHgxNTE1M2YyYSwKLSAgICAweDA0MDQwYzA4LCAweGM3Yzc1Mjk1LCAweDIzMjM2NTQ2LCAweGMzYzM1ZTlkLAotICAgIDB4MTgxODI4MzAsIDB4OTY5NmExMzcsIDB4MDUwNTBmMGEsIDB4OWE5YWI1MmYsCi0gICAgMHgwNzA3MDkwZSwgMHgxMjEyMzYyNCwgMHg4MDgwOWIxYiwgMHhlMmUyM2RkZiwKLSAgICAweGViZWIyNmNkLCAweDI3Mjc2OTRlLCAweGIyYjJjZDdmLCAweDc1NzU5ZmVhLAotICAgIDB4MDkwOTFiMTIsIDB4ODM4MzllMWQsIDB4MmMyYzc0NTgsIDB4MWExYTJlMzQsCi0gICAgMHgxYjFiMmQzNiwgMHg2ZTZlYjJkYywgMHg1YTVhZWViNCwgMHhhMGEwZmI1YiwKLSAgICAweDUyNTJmNmE0LCAweDNiM2I0ZDc2LCAweGQ2ZDY2MWI3LCAweGIzYjNjZTdkLAotICAgIDB4MjkyOTdiNTIsIDB4ZTNlMzNlZGQsIDB4MmYyZjcxNWUsIDB4ODQ4NDk3MTMsCi0gICAgMHg1MzUzZjVhNiwgMHhkMWQxNjhiOSwgMHgwMDAwMDAwMCwgMHhlZGVkMmNjMSwKLSAgICAweDIwMjA2MDQwLCAweGZjZmMxZmUzLCAweGIxYjFjODc5LCAweDViNWJlZGI2LAotICAgIDB4NmE2YWJlZDQsIDB4Y2JjYjQ2OGQsIDB4YmViZWQ5NjcsIDB4MzkzOTRiNzIsCi0gICAgMHg0YTRhZGU5NCwgMHg0YzRjZDQ5OCwgMHg1ODU4ZThiMCwgMHhjZmNmNGE4NSwKLSAgICAweGQwZDA2YmJiLCAweGVmZWYyYWM1LCAweGFhYWFlNTRmLCAweGZiZmIxNmVkLAotICAgIDB4NDM0M2M1ODYsIDB4NGQ0ZGQ3OWEsIDB4MzMzMzU1NjYsIDB4ODU4NTk0MTEsCi0gICAgMHg0NTQ1Y2Y4YSwgMHhmOWY5MTBlOSwgMHgwMjAyMDYwNCwgMHg3ZjdmODFmZSwKLSAgICAweDUwNTBmMGEwLCAweDNjM2M0NDc4LCAweDlmOWZiYTI1LCAweGE4YThlMzRiLAotICAgIDB4NTE1MWYzYTIsIDB4YTNhM2ZlNWQsIDB4NDA0MGMwODAsIDB4OGY4ZjhhMDUsCi0gICAgMHg5MjkyYWQzZiwgMHg5ZDlkYmMyMSwgMHgzODM4NDg3MCwgMHhmNWY1MDRmMSwKLSAgICAweGJjYmNkZjYzLCAweGI2YjZjMTc3LCAweGRhZGE3NWFmLCAweDIxMjE2MzQyLAotICAgIDB4MTAxMDMwMjAsIDB4ZmZmZjFhZTUsIDB4ZjNmMzBlZmQsIDB4ZDJkMjZkYmYsCi0gICAgMHhjZGNkNGM4MSwgMHgwYzBjMTQxOCwgMHgxMzEzMzUyNiwgMHhlY2VjMmZjMywKLSAgICAweDVmNWZlMWJlLCAweDk3OTdhMjM1LCAweDQ0NDRjYzg4LCAweDE3MTczOTJlLAotICAgIDB4YzRjNDU3OTMsIDB4YTdhN2YyNTUsIDB4N2U3ZTgyZmMsIDB4M2QzZDQ3N2EsCi0gICAgMHg2NDY0YWNjOCwgMHg1ZDVkZTdiYSwgMHgxOTE5MmIzMiwgMHg3MzczOTVlNiwKLSAgICAweDYwNjBhMGMwLCAweDgxODE5ODE5LCAweDRmNGZkMTllLCAweGRjZGM3ZmEzLAotICAgIDB4MjIyMjY2NDQsIDB4MmEyYTdlNTQsIDB4OTA5MGFiM2IsIDB4ODg4ODgzMGIsCi0gICAgMHg0NjQ2Y2E4YywgMHhlZWVlMjljNywgMHhiOGI4ZDM2YiwgMHgxNDE0M2MyOCwKLSAgICAweGRlZGU3OWE3LCAweDVlNWVlMmJjLCAweDBiMGIxZDE2LCAweGRiZGI3NmFkLAotICAgIDB4ZTBlMDNiZGIsIDB4MzIzMjU2NjQsIDB4M2EzYTRlNzQsIDB4MGEwYTFlMTQsCi0gICAgMHg0OTQ5ZGI5MiwgMHgwNjA2MGEwYywgMHgyNDI0NmM0OCwgMHg1YzVjZTRiOCwKLSAgICAweGMyYzI1ZDlmLCAweGQzZDM2ZWJkLCAweGFjYWNlZjQzLCAweDYyNjJhNmM0LAotICAgIDB4OTE5MWE4MzksIDB4OTU5NWE0MzEsIDB4ZTRlNDM3ZDMsIDB4Nzk3OThiZjIsCi0gICAgMHhlN2U3MzJkNSwgMHhjOGM4NDM4YiwgMHgzNzM3NTk2ZSwgMHg2ZDZkYjdkYSwKLSAgICAweDhkOGQ4YzAxLCAweGQ1ZDU2NGIxLCAweDRlNGVkMjljLCAweGE5YTllMDQ5LAotICAgIDB4NmM2Y2I0ZDgsIDB4NTY1NmZhYWMsIDB4ZjRmNDA3ZjMsIDB4ZWFlYTI1Y2YsCi0gICAgMHg2NTY1YWZjYSwgMHg3YTdhOGVmNCwgMHhhZWFlZTk0NywgMHgwODA4MTgxMCwKLSAgICAweGJhYmFkNTZmLCAweDc4Nzg4OGYwLCAweDI1MjU2ZjRhLCAweDJlMmU3MjVjLAotICAgIDB4MWMxYzI0MzgsIDB4YTZhNmYxNTcsIDB4YjRiNGM3NzMsIDB4YzZjNjUxOTcsCi0gICAgMHhlOGU4MjNjYiwgMHhkZGRkN2NhMSwgMHg3NDc0OWNlOCwgMHgxZjFmMjEzZSwKLSAgICAweDRiNGJkZDk2LCAweGJkYmRkYzYxLCAweDhiOGI4NjBkLCAweDhhOGE4NTBmLAotICAgIDB4NzA3MDkwZTAsIDB4M2UzZTQyN2MsIDB4YjViNWM0NzEsIDB4NjY2NmFhY2MsCi0gICAgMHg0ODQ4ZDg5MCwgMHgwMzAzMDUwNiwgMHhmNmY2MDFmNywgMHgwZTBlMTIxYywKLSAgICAweDYxNjFhM2MyLCAweDM1MzU1ZjZhLCAweDU3NTdmOWFlLCAweGI5YjlkMDY5LAotICAgIDB4ODY4NjkxMTcsIDB4YzFjMTU4OTksIDB4MWQxZDI3M2EsIDB4OWU5ZWI5MjcsCi0gICAgMHhlMWUxMzhkOSwgMHhmOGY4MTNlYiwgMHg5ODk4YjMyYiwgMHgxMTExMzMyMiwKLSAgICAweDY5NjliYmQyLCAweGQ5ZDk3MGE5LCAweDhlOGU4OTA3LCAweDk0OTRhNzMzLAotICAgIDB4OWI5YmI2MmQsIDB4MWUxZTIyM2MsIDB4ODc4NzkyMTUsIDB4ZTllOTIwYzksCi0gICAgMHhjZWNlNDk4NywgMHg1NTU1ZmZhYSwgMHgyODI4Nzg1MCwgMHhkZmRmN2FhNSwKLSAgICAweDhjOGM4ZjAzLCAweGExYTFmODU5LCAweDg5ODk4MDA5LCAweDBkMGQxNzFhLAotICAgIDB4YmZiZmRhNjUsIDB4ZTZlNjMxZDcsIDB4NDI0MmM2ODQsIDB4Njg2OGI4ZDAsCi0gICAgMHg0MTQxYzM4MiwgMHg5OTk5YjAyOSwgMHgyZDJkNzc1YSwgMHgwZjBmMTExZSwKKyAgICAweDYzNjNhNWM2LCAweDdjN2M4NGY4LCAweDc3Nzc5OWVlLCAweDdiN2I4ZGY2LCAweGYyZjIwZGZmLCAweDZiNmJiZGQ2LAorICAgIDB4NmY2ZmIxZGUsIDB4YzVjNTU0OTEsIDB4MzAzMDUwNjAsIDB4MDEwMTAzMDIsIDB4Njc2N2E5Y2UsIDB4MmIyYjdkNTYsCisgICAgMHhmZWZlMTllNywgMHhkN2Q3NjJiNSwgMHhhYmFiZTY0ZCwgMHg3Njc2OWFlYywgMHhjYWNhNDU4ZiwgMHg4MjgyOWQxZiwKKyAgICAweGM5Yzk0MDg5LCAweDdkN2Q4N2ZhLCAweGZhZmExNWVmLCAweDU5NTllYmIyLCAweDQ3NDdjOThlLCAweGYwZjAwYmZiLAorICAgIDB4YWRhZGVjNDEsIDB4ZDRkNDY3YjMsIDB4YTJhMmZkNWYsIDB4YWZhZmVhNDUsIDB4OWM5Y2JmMjMsIDB4YTRhNGY3NTMsCisgICAgMHg3MjcyOTZlNCwgMHhjMGMwNWI5YiwgMHhiN2I3YzI3NSwgMHhmZGZkMWNlMSwgMHg5MzkzYWUzZCwgMHgyNjI2NmE0YywKKyAgICAweDM2MzY1YTZjLCAweDNmM2Y0MTdlLCAweGY3ZjcwMmY1LCAweGNjY2M0ZjgzLCAweDM0MzQ1YzY4LCAweGE1YTVmNDUxLAorICAgIDB4ZTVlNTM0ZDEsIDB4ZjFmMTA4ZjksIDB4NzE3MTkzZTIsIDB4ZDhkODczYWIsIDB4MzEzMTUzNjIsIDB4MTUxNTNmMmEsCisgICAgMHgwNDA0MGMwOCwgMHhjN2M3NTI5NSwgMHgyMzIzNjU0NiwgMHhjM2MzNWU5ZCwgMHgxODE4MjgzMCwgMHg5Njk2YTEzNywKKyAgICAweDA1MDUwZjBhLCAweDlhOWFiNTJmLCAweDA3MDcwOTBlLCAweDEyMTIzNjI0LCAweDgwODA5YjFiLCAweGUyZTIzZGRmLAorICAgIDB4ZWJlYjI2Y2QsIDB4MjcyNzY5NGUsIDB4YjJiMmNkN2YsIDB4NzU3NTlmZWEsIDB4MDkwOTFiMTIsIDB4ODM4MzllMWQsCisgICAgMHgyYzJjNzQ1OCwgMHgxYTFhMmUzNCwgMHgxYjFiMmQzNiwgMHg2ZTZlYjJkYywgMHg1YTVhZWViNCwgMHhhMGEwZmI1YiwKKyAgICAweDUyNTJmNmE0LCAweDNiM2I0ZDc2LCAweGQ2ZDY2MWI3LCAweGIzYjNjZTdkLCAweDI5Mjk3YjUyLCAweGUzZTMzZWRkLAorICAgIDB4MmYyZjcxNWUsIDB4ODQ4NDk3MTMsIDB4NTM1M2Y1YTYsIDB4ZDFkMTY4YjksIDB4MDAwMDAwMDAsIDB4ZWRlZDJjYzEsCisgICAgMHgyMDIwNjA0MCwgMHhmY2ZjMWZlMywgMHhiMWIxYzg3OSwgMHg1YjViZWRiNiwgMHg2YTZhYmVkNCwgMHhjYmNiNDY4ZCwKKyAgICAweGJlYmVkOTY3LCAweDM5Mzk0YjcyLCAweDRhNGFkZTk0LCAweDRjNGNkNDk4LCAweDU4NThlOGIwLCAweGNmY2Y0YTg1LAorICAgIDB4ZDBkMDZiYmIsIDB4ZWZlZjJhYzUsIDB4YWFhYWU1NGYsIDB4ZmJmYjE2ZWQsIDB4NDM0M2M1ODYsIDB4NGQ0ZGQ3OWEsCisgICAgMHgzMzMzNTU2NiwgMHg4NTg1OTQxMSwgMHg0NTQ1Y2Y4YSwgMHhmOWY5MTBlOSwgMHgwMjAyMDYwNCwgMHg3ZjdmODFmZSwKKyAgICAweDUwNTBmMGEwLCAweDNjM2M0NDc4LCAweDlmOWZiYTI1LCAweGE4YThlMzRiLCAweDUxNTFmM2EyLCAweGEzYTNmZTVkLAorICAgIDB4NDA0MGMwODAsIDB4OGY4ZjhhMDUsIDB4OTI5MmFkM2YsIDB4OWQ5ZGJjMjEsIDB4MzgzODQ4NzAsIDB4ZjVmNTA0ZjEsCisgICAgMHhiY2JjZGY2MywgMHhiNmI2YzE3NywgMHhkYWRhNzVhZiwgMHgyMTIxNjM0MiwgMHgxMDEwMzAyMCwgMHhmZmZmMWFlNSwKKyAgICAweGYzZjMwZWZkLCAweGQyZDI2ZGJmLCAweGNkY2Q0YzgxLCAweDBjMGMxNDE4LCAweDEzMTMzNTI2LCAweGVjZWMyZmMzLAorICAgIDB4NWY1ZmUxYmUsIDB4OTc5N2EyMzUsIDB4NDQ0NGNjODgsIDB4MTcxNzM5MmUsIDB4YzRjNDU3OTMsIDB4YTdhN2YyNTUsCisgICAgMHg3ZTdlODJmYywgMHgzZDNkNDc3YSwgMHg2NDY0YWNjOCwgMHg1ZDVkZTdiYSwgMHgxOTE5MmIzMiwgMHg3MzczOTVlNiwKKyAgICAweDYwNjBhMGMwLCAweDgxODE5ODE5LCAweDRmNGZkMTllLCAweGRjZGM3ZmEzLCAweDIyMjI2NjQ0LCAweDJhMmE3ZTU0LAorICAgIDB4OTA5MGFiM2IsIDB4ODg4ODgzMGIsIDB4NDY0NmNhOGMsIDB4ZWVlZTI5YzcsIDB4YjhiOGQzNmIsIDB4MTQxNDNjMjgsCisgICAgMHhkZWRlNzlhNywgMHg1ZTVlZTJiYywgMHgwYjBiMWQxNiwgMHhkYmRiNzZhZCwgMHhlMGUwM2JkYiwgMHgzMjMyNTY2NCwKKyAgICAweDNhM2E0ZTc0LCAweDBhMGExZTE0LCAweDQ5NDlkYjkyLCAweDA2MDYwYTBjLCAweDI0MjQ2YzQ4LCAweDVjNWNlNGI4LAorICAgIDB4YzJjMjVkOWYsIDB4ZDNkMzZlYmQsIDB4YWNhY2VmNDMsIDB4NjI2MmE2YzQsIDB4OTE5MWE4MzksIDB4OTU5NWE0MzEsCisgICAgMHhlNGU0MzdkMywgMHg3OTc5OGJmMiwgMHhlN2U3MzJkNSwgMHhjOGM4NDM4YiwgMHgzNzM3NTk2ZSwgMHg2ZDZkYjdkYSwKKyAgICAweDhkOGQ4YzAxLCAweGQ1ZDU2NGIxLCAweDRlNGVkMjljLCAweGE5YTllMDQ5LCAweDZjNmNiNGQ4LCAweDU2NTZmYWFjLAorICAgIDB4ZjRmNDA3ZjMsIDB4ZWFlYTI1Y2YsIDB4NjU2NWFmY2EsIDB4N2E3YThlZjQsIDB4YWVhZWU5NDcsIDB4MDgwODE4MTAsCisgICAgMHhiYWJhZDU2ZiwgMHg3ODc4ODhmMCwgMHgyNTI1NmY0YSwgMHgyZTJlNzI1YywgMHgxYzFjMjQzOCwgMHhhNmE2ZjE1NywKKyAgICAweGI0YjRjNzczLCAweGM2YzY1MTk3LCAweGU4ZTgyM2NiLCAweGRkZGQ3Y2ExLCAweDc0NzQ5Y2U4LCAweDFmMWYyMTNlLAorICAgIDB4NGI0YmRkOTYsIDB4YmRiZGRjNjEsIDB4OGI4Yjg2MGQsIDB4OGE4YTg1MGYsIDB4NzA3MDkwZTAsIDB4M2UzZTQyN2MsCisgICAgMHhiNWI1YzQ3MSwgMHg2NjY2YWFjYywgMHg0ODQ4ZDg5MCwgMHgwMzAzMDUwNiwgMHhmNmY2MDFmNywgMHgwZTBlMTIxYywKKyAgICAweDYxNjFhM2MyLCAweDM1MzU1ZjZhLCAweDU3NTdmOWFlLCAweGI5YjlkMDY5LCAweDg2ODY5MTE3LCAweGMxYzE1ODk5LAorICAgIDB4MWQxZDI3M2EsIDB4OWU5ZWI5MjcsIDB4ZTFlMTM4ZDksIDB4ZjhmODEzZWIsIDB4OTg5OGIzMmIsIDB4MTExMTMzMjIsCisgICAgMHg2OTY5YmJkMiwgMHhkOWQ5NzBhOSwgMHg4ZThlODkwNywgMHg5NDk0YTczMywgMHg5YjliYjYyZCwgMHgxZTFlMjIzYywKKyAgICAweDg3ODc5MjE1LCAweGU5ZTkyMGM5LCAweGNlY2U0OTg3LCAweDU1NTVmZmFhLCAweDI4Mjg3ODUwLCAweGRmZGY3YWE1LAorICAgIDB4OGM4YzhmMDMsIDB4YTFhMWY4NTksIDB4ODk4OTgwMDksIDB4MGQwZDE3MWEsIDB4YmZiZmRhNjUsIDB4ZTZlNjMxZDcsCisgICAgMHg0MjQyYzY4NCwgMHg2ODY4YjhkMCwgMHg0MTQxYzM4MiwgMHg5OTk5YjAyOSwgMHgyZDJkNzc1YSwgMHgwZjBmMTExZSwKICAgICAweGIwYjBjYjdiLCAweDU0NTRmY2E4LCAweGJiYmJkNjZkLCAweDE2MTYzYTJjLAogfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgRDBbMjU2XSA9IHsKLSAgICAweDUxZjRhNzUwLCAweDdlNDE2NTUzLCAweDFhMTdhNGMzLCAweDNhMjc1ZTk2LAotICAgIDB4M2JhYjZiY2IsIDB4MWY5ZDQ1ZjEsIDB4YWNmYTU4YWIsIDB4NGJlMzAzOTMsCi0gICAgMHgyMDMwZmE1NSwgMHhhZDc2NmRmNiwgMHg4OGNjNzY5MSwgMHhmNTAyNGMyNSwKLSAgICAweDRmZTVkN2ZjLCAweGM1MmFjYmQ3LCAweDI2MzU0NDgwLCAweGI1NjJhMzhmLAotICAgIDB4ZGViMTVhNDksIDB4MjViYTFiNjcsIDB4NDVlYTBlOTgsIDB4NWRmZWMwZTEsCi0gICAgMHhjMzJmNzUwMiwgMHg4MTRjZjAxMiwgMHg4ZDQ2OTdhMywgMHg2YmQzZjljNiwKLSAgICAweDAzOGY1ZmU3LCAweDE1OTI5Yzk1LCAweGJmNmQ3YWViLCAweDk1NTI1OWRhLAotICAgIDB4ZDRiZTgzMmQsIDB4NTg3NDIxZDMsIDB4NDllMDY5MjksIDB4OGVjOWM4NDQsCi0gICAgMHg3NWMyODk2YSwgMHhmNDhlNzk3OCwgMHg5OTU4M2U2YiwgMHgyN2I5NzFkZCwKLSAgICAweGJlZTE0ZmI2LCAweGYwODhhZDE3LCAweGM5MjBhYzY2LCAweDdkY2UzYWI0LAotICAgIDB4NjNkZjRhMTgsIDB4ZTUxYTMxODIsIDB4OTc1MTMzNjAsIDB4NjI1MzdmNDUsCi0gICAgMHhiMTY0NzdlMCwgMHhiYjZiYWU4NCwgMHhmZTgxYTAxYywgMHhmOTA4MmI5NCwKLSAgICAweDcwNDg2ODU4LCAweDhmNDVmZDE5LCAweDk0ZGU2Yzg3LCAweDUyN2JmOGI3LAotICAgIDB4YWI3M2QzMjMsIDB4NzI0YjAyZTIsIDB4ZTMxZjhmNTcsIDB4NjY1NWFiMmEsCi0gICAgMHhiMmViMjgwNywgMHgyZmI1YzIwMywgMHg4NmM1N2I5YSwgMHhkMzM3MDhhNSwKLSAgICAweDMwMjg4N2YyLCAweDIzYmZhNWIyLCAweDAyMDM2YWJhLCAweGVkMTY4MjVjLAotICAgIDB4OGFjZjFjMmIsIDB4YTc3OWI0OTIsIDB4ZjMwN2YyZjAsIDB4NGU2OWUyYTEsCi0gICAgMHg2NWRhZjRjZCwgMHgwNjA1YmVkNSwgMHhkMTM0NjIxZiwgMHhjNGE2ZmU4YSwKLSAgICAweDM0MmU1MzlkLCAweGEyZjM1NWEwLCAweDA1OGFlMTMyLCAweGE0ZjZlYjc1LAotICAgIDB4MGI4M2VjMzksIDB4NDA2MGVmYWEsIDB4NWU3MTlmMDYsIDB4YmQ2ZTEwNTEsCi0gICAgMHgzZTIxOGFmOSwgMHg5NmRkMDYzZCwgMHhkZDNlMDVhZSwgMHg0ZGU2YmQ0NiwKLSAgICAweDkxNTQ4ZGI1LCAweDcxYzQ1ZDA1LCAweDA0MDZkNDZmLCAweDYwNTAxNWZmLAotICAgIDB4MTk5OGZiMjQsIDB4ZDZiZGU5OTcsIDB4ODk0MDQzY2MsIDB4NjdkOTllNzcsCi0gICAgMHhiMGU4NDJiZCwgMHgwNzg5OGI4OCwgMHhlNzE5NWIzOCwgMHg3OWM4ZWVkYiwKLSAgICAweGExN2MwYTQ3LCAweDdjNDIwZmU5LCAweGY4ODQxZWM5LCAweDAwMDAwMDAwLAotICAgIDB4MDk4MDg2ODMsIDB4MzIyYmVkNDgsIDB4MWUxMTcwYWMsIDB4NmM1YTcyNGUsCi0gICAgMHhmZDBlZmZmYiwgMHgwZjg1Mzg1NiwgMHgzZGFlZDUxZSwgMHgzNjJkMzkyNywKLSAgICAweDBhMGZkOTY0LCAweDY4NWNhNjIxLCAweDliNWI1NGQxLCAweDI0MzYyZTNhLAotICAgIDB4MGMwYTY3YjEsIDB4OTM1N2U3MGYsIDB4YjRlZTk2ZDIsIDB4MWI5YjkxOWUsCi0gICAgMHg4MGMwYzU0ZiwgMHg2MWRjMjBhMiwgMHg1YTc3NGI2OSwgMHgxYzEyMWExNiwKLSAgICAweGUyOTNiYTBhLCAweGMwYTAyYWU1LCAweDNjMjJlMDQzLCAweDEyMWIxNzFkLAotICAgIDB4MGUwOTBkMGIsIDB4ZjI4YmM3YWQsIDB4MmRiNmE4YjksIDB4MTQxZWE5YzgsCi0gICAgMHg1N2YxMTk4NSwgMHhhZjc1MDc0YywgMHhlZTk5ZGRiYiwgMHhhMzdmNjBmZCwKLSAgICAweGY3MDEyNjlmLCAweDVjNzJmNWJjLCAweDQ0NjYzYmM1LCAweDViZmI3ZTM0LAotICAgIDB4OGI0MzI5NzYsIDB4Y2IyM2M2ZGMsIDB4YjZlZGZjNjgsIDB4YjhlNGYxNjMsCi0gICAgMHhkNzMxZGNjYSwgMHg0MjYzODUxMCwgMHgxMzk3MjI0MCwgMHg4NGM2MTEyMCwKLSAgICAweDg1NGEyNDdkLCAweGQyYmIzZGY4LCAweGFlZjkzMjExLCAweGM3MjlhMTZkLAotICAgIDB4MWQ5ZTJmNGIsIDB4ZGNiMjMwZjMsIDB4MGQ4NjUyZWMsIDB4NzdjMWUzZDAsCi0gICAgMHgyYmIzMTY2YywgMHhhOTcwYjk5OSwgMHgxMTk0NDhmYSwgMHg0N2U5NjQyMiwKLSAgICAweGE4ZmM4Y2M0LCAweGEwZjAzZjFhLCAweDU2N2QyY2Q4LCAweDIyMzM5MGVmLAotICAgIDB4ODc0OTRlYzcsIDB4ZDkzOGQxYzEsIDB4OGNjYWEyZmUsIDB4OThkNDBiMzYsCi0gICAgMHhhNmY1ODFjZiwgMHhhNTdhZGUyOCwgMHhkYWI3OGUyNiwgMHgzZmFkYmZhNCwKLSAgICAweDJjM2E5ZGU0LCAweDUwNzg5MjBkLCAweDZhNWZjYzliLCAweDU0N2U0NjYyLAotICAgIDB4ZjY4ZDEzYzIsIDB4OTBkOGI4ZTgsIDB4MmUzOWY3NWUsIDB4ODJjM2FmZjUsCi0gICAgMHg5ZjVkODBiZSwgMHg2OWQwOTM3YywgMHg2ZmQ1MmRhOSwgMHhjZjI1MTJiMywKLSAgICAweGM4YWM5OTNiLCAweDEwMTg3ZGE3LCAweGU4OWM2MzZlLCAweGRiM2JiYjdiLAotICAgIDB4Y2QyNjc4MDksIDB4NmU1OTE4ZjQsIDB4ZWM5YWI3MDEsIDB4ODM0ZjlhYTgsCi0gICAgMHhlNjk1NmU2NSwgMHhhYWZmZTY3ZSwgMHgyMWJjY2YwOCwgMHhlZjE1ZThlNiwKLSAgICAweGJhZTc5YmQ5LCAweDRhNmYzNmNlLCAweGVhOWYwOWQ0LCAweDI5YjA3Y2Q2LAotICAgIDB4MzFhNGIyYWYsIDB4MmEzZjIzMzEsIDB4YzZhNTk0MzAsIDB4MzVhMjY2YzAsCi0gICAgMHg3NDRlYmMzNywgMHhmYzgyY2FhNiwgMHhlMDkwZDBiMCwgMHgzM2E3ZDgxNSwKLSAgICAweGYxMDQ5ODRhLCAweDQxZWNkYWY3LCAweDdmY2Q1MDBlLCAweDE3OTFmNjJmLAotICAgIDB4NzY0ZGQ2OGQsIDB4NDNlZmIwNGQsIDB4Y2NhYTRkNTQsIDB4ZTQ5NjA0ZGYsCi0gICAgMHg5ZWQxYjVlMywgMHg0YzZhODgxYiwgMHhjMTJjMWZiOCwgMHg0NjY1NTE3ZiwKLSAgICAweDlkNWVlYTA0LCAweDAxOGMzNTVkLCAweGZhODc3NDczLCAweGZiMGI0MTJlLAotICAgIDB4YjM2NzFkNWEsIDB4OTJkYmQyNTIsIDB4ZTkxMDU2MzMsIDB4NmRkNjQ3MTMsCi0gICAgMHg5YWQ3NjE4YywgMHgzN2ExMGM3YSwgMHg1OWY4MTQ4ZSwgMHhlYjEzM2M4OSwKLSAgICAweGNlYTkyN2VlLCAweGI3NjFjOTM1LCAweGUxMWNlNWVkLCAweDdhNDdiMTNjLAotICAgIDB4OWNkMmRmNTksIDB4NTVmMjczM2YsIDB4MTgxNGNlNzksIDB4NzNjNzM3YmYsCi0gICAgMHg1M2Y3Y2RlYSwgMHg1ZmZkYWE1YiwgMHhkZjNkNmYxNCwgMHg3ODQ0ZGI4NiwKLSAgICAweGNhYWZmMzgxLCAweGI5NjhjNDNlLCAweDM4MjQzNDJjLCAweGMyYTM0MDVmLAotICAgIDB4MTYxZGMzNzIsIDB4YmNlMjI1MGMsIDB4MjgzYzQ5OGIsIDB4ZmYwZDk1NDEsCi0gICAgMHgzOWE4MDE3MSwgMHgwODBjYjNkZSwgMHhkOGI0ZTQ5YywgMHg2NDU2YzE5MCwKKyAgICAweDUxZjRhNzUwLCAweDdlNDE2NTUzLCAweDFhMTdhNGMzLCAweDNhMjc1ZTk2LCAweDNiYWI2YmNiLCAweDFmOWQ0NWYxLAorICAgIDB4YWNmYTU4YWIsIDB4NGJlMzAzOTMsIDB4MjAzMGZhNTUsIDB4YWQ3NjZkZjYsIDB4ODhjYzc2OTEsIDB4ZjUwMjRjMjUsCisgICAgMHg0ZmU1ZDdmYywgMHhjNTJhY2JkNywgMHgyNjM1NDQ4MCwgMHhiNTYyYTM4ZiwgMHhkZWIxNWE0OSwgMHgyNWJhMWI2NywKKyAgICAweDQ1ZWEwZTk4LCAweDVkZmVjMGUxLCAweGMzMmY3NTAyLCAweDgxNGNmMDEyLCAweDhkNDY5N2EzLCAweDZiZDNmOWM2LAorICAgIDB4MDM4ZjVmZTcsIDB4MTU5MjljOTUsIDB4YmY2ZDdhZWIsIDB4OTU1MjU5ZGEsIDB4ZDRiZTgzMmQsIDB4NTg3NDIxZDMsCisgICAgMHg0OWUwNjkyOSwgMHg4ZWM5Yzg0NCwgMHg3NWMyODk2YSwgMHhmNDhlNzk3OCwgMHg5OTU4M2U2YiwgMHgyN2I5NzFkZCwKKyAgICAweGJlZTE0ZmI2LCAweGYwODhhZDE3LCAweGM5MjBhYzY2LCAweDdkY2UzYWI0LCAweDYzZGY0YTE4LCAweGU1MWEzMTgyLAorICAgIDB4OTc1MTMzNjAsIDB4NjI1MzdmNDUsIDB4YjE2NDc3ZTAsIDB4YmI2YmFlODQsIDB4ZmU4MWEwMWMsIDB4ZjkwODJiOTQsCisgICAgMHg3MDQ4Njg1OCwgMHg4ZjQ1ZmQxOSwgMHg5NGRlNmM4NywgMHg1MjdiZjhiNywgMHhhYjczZDMyMywgMHg3MjRiMDJlMiwKKyAgICAweGUzMWY4ZjU3LCAweDY2NTVhYjJhLCAweGIyZWIyODA3LCAweDJmYjVjMjAzLCAweDg2YzU3YjlhLCAweGQzMzcwOGE1LAorICAgIDB4MzAyODg3ZjIsIDB4MjNiZmE1YjIsIDB4MDIwMzZhYmEsIDB4ZWQxNjgyNWMsIDB4OGFjZjFjMmIsIDB4YTc3OWI0OTIsCisgICAgMHhmMzA3ZjJmMCwgMHg0ZTY5ZTJhMSwgMHg2NWRhZjRjZCwgMHgwNjA1YmVkNSwgMHhkMTM0NjIxZiwgMHhjNGE2ZmU4YSwKKyAgICAweDM0MmU1MzlkLCAweGEyZjM1NWEwLCAweDA1OGFlMTMyLCAweGE0ZjZlYjc1LCAweDBiODNlYzM5LCAweDQwNjBlZmFhLAorICAgIDB4NWU3MTlmMDYsIDB4YmQ2ZTEwNTEsIDB4M2UyMThhZjksIDB4OTZkZDA2M2QsIDB4ZGQzZTA1YWUsIDB4NGRlNmJkNDYsCisgICAgMHg5MTU0OGRiNSwgMHg3MWM0NWQwNSwgMHgwNDA2ZDQ2ZiwgMHg2MDUwMTVmZiwgMHgxOTk4ZmIyNCwgMHhkNmJkZTk5NywKKyAgICAweDg5NDA0M2NjLCAweDY3ZDk5ZTc3LCAweGIwZTg0MmJkLCAweDA3ODk4Yjg4LCAweGU3MTk1YjM4LCAweDc5YzhlZWRiLAorICAgIDB4YTE3YzBhNDcsIDB4N2M0MjBmZTksIDB4Zjg4NDFlYzksIDB4MDAwMDAwMDAsIDB4MDk4MDg2ODMsIDB4MzIyYmVkNDgsCisgICAgMHgxZTExNzBhYywgMHg2YzVhNzI0ZSwgMHhmZDBlZmZmYiwgMHgwZjg1Mzg1NiwgMHgzZGFlZDUxZSwgMHgzNjJkMzkyNywKKyAgICAweDBhMGZkOTY0LCAweDY4NWNhNjIxLCAweDliNWI1NGQxLCAweDI0MzYyZTNhLCAweDBjMGE2N2IxLCAweDkzNTdlNzBmLAorICAgIDB4YjRlZTk2ZDIsIDB4MWI5YjkxOWUsIDB4ODBjMGM1NGYsIDB4NjFkYzIwYTIsIDB4NWE3NzRiNjksIDB4MWMxMjFhMTYsCisgICAgMHhlMjkzYmEwYSwgMHhjMGEwMmFlNSwgMHgzYzIyZTA0MywgMHgxMjFiMTcxZCwgMHgwZTA5MGQwYiwgMHhmMjhiYzdhZCwKKyAgICAweDJkYjZhOGI5LCAweDE0MWVhOWM4LCAweDU3ZjExOTg1LCAweGFmNzUwNzRjLCAweGVlOTlkZGJiLCAweGEzN2Y2MGZkLAorICAgIDB4ZjcwMTI2OWYsIDB4NWM3MmY1YmMsIDB4NDQ2NjNiYzUsIDB4NWJmYjdlMzQsIDB4OGI0MzI5NzYsIDB4Y2IyM2M2ZGMsCisgICAgMHhiNmVkZmM2OCwgMHhiOGU0ZjE2MywgMHhkNzMxZGNjYSwgMHg0MjYzODUxMCwgMHgxMzk3MjI0MCwgMHg4NGM2MTEyMCwKKyAgICAweDg1NGEyNDdkLCAweGQyYmIzZGY4LCAweGFlZjkzMjExLCAweGM3MjlhMTZkLCAweDFkOWUyZjRiLCAweGRjYjIzMGYzLAorICAgIDB4MGQ4NjUyZWMsIDB4NzdjMWUzZDAsIDB4MmJiMzE2NmMsIDB4YTk3MGI5OTksIDB4MTE5NDQ4ZmEsIDB4NDdlOTY0MjIsCisgICAgMHhhOGZjOGNjNCwgMHhhMGYwM2YxYSwgMHg1NjdkMmNkOCwgMHgyMjMzOTBlZiwgMHg4NzQ5NGVjNywgMHhkOTM4ZDFjMSwKKyAgICAweDhjY2FhMmZlLCAweDk4ZDQwYjM2LCAweGE2ZjU4MWNmLCAweGE1N2FkZTI4LCAweGRhYjc4ZTI2LCAweDNmYWRiZmE0LAorICAgIDB4MmMzYTlkZTQsIDB4NTA3ODkyMGQsIDB4NmE1ZmNjOWIsIDB4NTQ3ZTQ2NjIsIDB4ZjY4ZDEzYzIsIDB4OTBkOGI4ZTgsCisgICAgMHgyZTM5Zjc1ZSwgMHg4MmMzYWZmNSwgMHg5ZjVkODBiZSwgMHg2OWQwOTM3YywgMHg2ZmQ1MmRhOSwgMHhjZjI1MTJiMywKKyAgICAweGM4YWM5OTNiLCAweDEwMTg3ZGE3LCAweGU4OWM2MzZlLCAweGRiM2JiYjdiLCAweGNkMjY3ODA5LCAweDZlNTkxOGY0LAorICAgIDB4ZWM5YWI3MDEsIDB4ODM0ZjlhYTgsIDB4ZTY5NTZlNjUsIDB4YWFmZmU2N2UsIDB4MjFiY2NmMDgsIDB4ZWYxNWU4ZTYsCisgICAgMHhiYWU3OWJkOSwgMHg0YTZmMzZjZSwgMHhlYTlmMDlkNCwgMHgyOWIwN2NkNiwgMHgzMWE0YjJhZiwgMHgyYTNmMjMzMSwKKyAgICAweGM2YTU5NDMwLCAweDM1YTI2NmMwLCAweDc0NGViYzM3LCAweGZjODJjYWE2LCAweGUwOTBkMGIwLCAweDMzYTdkODE1LAorICAgIDB4ZjEwNDk4NGEsIDB4NDFlY2RhZjcsIDB4N2ZjZDUwMGUsIDB4MTc5MWY2MmYsIDB4NzY0ZGQ2OGQsIDB4NDNlZmIwNGQsCisgICAgMHhjY2FhNGQ1NCwgMHhlNDk2MDRkZiwgMHg5ZWQxYjVlMywgMHg0YzZhODgxYiwgMHhjMTJjMWZiOCwgMHg0NjY1NTE3ZiwKKyAgICAweDlkNWVlYTA0LCAweDAxOGMzNTVkLCAweGZhODc3NDczLCAweGZiMGI0MTJlLCAweGIzNjcxZDVhLCAweDkyZGJkMjUyLAorICAgIDB4ZTkxMDU2MzMsIDB4NmRkNjQ3MTMsIDB4OWFkNzYxOGMsIDB4MzdhMTBjN2EsIDB4NTlmODE0OGUsIDB4ZWIxMzNjODksCisgICAgMHhjZWE5MjdlZSwgMHhiNzYxYzkzNSwgMHhlMTFjZTVlZCwgMHg3YTQ3YjEzYywgMHg5Y2QyZGY1OSwgMHg1NWYyNzMzZiwKKyAgICAweDE4MTRjZTc5LCAweDczYzczN2JmLCAweDUzZjdjZGVhLCAweDVmZmRhYTViLCAweGRmM2Q2ZjE0LCAweDc4NDRkYjg2LAorICAgIDB4Y2FhZmYzODEsIDB4Yjk2OGM0M2UsIDB4MzgyNDM0MmMsIDB4YzJhMzQwNWYsIDB4MTYxZGMzNzIsIDB4YmNlMjI1MGMsCisgICAgMHgyODNjNDk4YiwgMHhmZjBkOTU0MSwgMHgzOWE4MDE3MSwgMHgwODBjYjNkZSwgMHhkOGI0ZTQ5YywgMHg2NDU2YzE5MCwKICAgICAweDdiY2I4NDYxLCAweGQ1MzJiNjcwLCAweDQ4NmM1Yzc0LCAweGQwYjg1NzQyLAogfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgRDFbMjU2XSA9IHsKLSAgICAweDUwNTFmNGE3LCAweDUzN2U0MTY1LCAweGMzMWExN2E0LCAweDk2M2EyNzVlLAotICAgIDB4Y2IzYmFiNmIsIDB4ZjExZjlkNDUsIDB4YWJhY2ZhNTgsIDB4OTM0YmUzMDMsCi0gICAgMHg1NTIwMzBmYSwgMHhmNmFkNzY2ZCwgMHg5MTg4Y2M3NiwgMHgyNWY1MDI0YywKLSAgICAweGZjNGZlNWQ3LCAweGQ3YzUyYWNiLCAweDgwMjYzNTQ0LCAweDhmYjU2MmEzLAotICAgIDB4NDlkZWIxNWEsIDB4NjcyNWJhMWIsIDB4OTg0NWVhMGUsIDB4ZTE1ZGZlYzAsCi0gICAgMHgwMmMzMmY3NSwgMHgxMjgxNGNmMCwgMHhhMzhkNDY5NywgMHhjNjZiZDNmOSwKLSAgICAweGU3MDM4ZjVmLCAweDk1MTU5MjljLCAweGViYmY2ZDdhLCAweGRhOTU1MjU5LAotICAgIDB4MmRkNGJlODMsIDB4ZDM1ODc0MjEsIDB4Mjk0OWUwNjksIDB4NDQ4ZWM5YzgsCi0gICAgMHg2YTc1YzI4OSwgMHg3OGY0OGU3OSwgMHg2Yjk5NTgzZSwgMHhkZDI3Yjk3MSwKLSAgICAweGI2YmVlMTRmLCAweDE3ZjA4OGFkLCAweDY2YzkyMGFjLCAweGI0N2RjZTNhLAotICAgIDB4MTg2M2RmNGEsIDB4ODJlNTFhMzEsIDB4NjA5NzUxMzMsIDB4NDU2MjUzN2YsCi0gICAgMHhlMGIxNjQ3NywgMHg4NGJiNmJhZSwgMHgxY2ZlODFhMCwgMHg5NGY5MDgyYiwKLSAgICAweDU4NzA0ODY4LCAweDE5OGY0NWZkLCAweDg3OTRkZTZjLCAweGI3NTI3YmY4LAotICAgIDB4MjNhYjczZDMsIDB4ZTI3MjRiMDIsIDB4NTdlMzFmOGYsIDB4MmE2NjU1YWIsCi0gICAgMHgwN2IyZWIyOCwgMHgwMzJmYjVjMiwgMHg5YTg2YzU3YiwgMHhhNWQzMzcwOCwKLSAgICAweGYyMzAyODg3LCAweGIyMjNiZmE1LCAweGJhMDIwMzZhLCAweDVjZWQxNjgyLAotICAgIDB4MmI4YWNmMWMsIDB4OTJhNzc5YjQsIDB4ZjBmMzA3ZjIsIDB4YTE0ZTY5ZTIsCi0gICAgMHhjZDY1ZGFmNCwgMHhkNTA2MDViZSwgMHgxZmQxMzQ2MiwgMHg4YWM0YTZmZSwKLSAgICAweDlkMzQyZTUzLCAweGEwYTJmMzU1LCAweDMyMDU4YWUxLCAweDc1YTRmNmViLAotICAgIDB4MzkwYjgzZWMsIDB4YWE0MDYwZWYsIDB4MDY1ZTcxOWYsIDB4NTFiZDZlMTAsCi0gICAgMHhmOTNlMjE4YSwgMHgzZDk2ZGQwNiwgMHhhZWRkM2UwNSwgMHg0NjRkZTZiZCwKLSAgICAweGI1OTE1NDhkLCAweDA1NzFjNDVkLCAweDZmMDQwNmQ0LCAweGZmNjA1MDE1LAotICAgIDB4MjQxOTk4ZmIsIDB4OTdkNmJkZTksIDB4Y2M4OTQwNDMsIDB4Nzc2N2Q5OWUsCi0gICAgMHhiZGIwZTg0MiwgMHg4ODA3ODk4YiwgMHgzOGU3MTk1YiwgMHhkYjc5YzhlZSwKLSAgICAweDQ3YTE3YzBhLCAweGU5N2M0MjBmLCAweGM5Zjg4NDFlLCAweDAwMDAwMDAwLAotICAgIDB4ODMwOTgwODYsIDB4NDgzMjJiZWQsIDB4YWMxZTExNzAsIDB4NGU2YzVhNzIsCi0gICAgMHhmYmZkMGVmZiwgMHg1NjBmODUzOCwgMHgxZTNkYWVkNSwgMHgyNzM2MmQzOSwKLSAgICAweDY0MGEwZmQ5LCAweDIxNjg1Y2E2LCAweGQxOWI1YjU0LCAweDNhMjQzNjJlLAotICAgIDB4YjEwYzBhNjcsIDB4MGY5MzU3ZTcsIDB4ZDJiNGVlOTYsIDB4OWUxYjliOTEsCi0gICAgMHg0ZjgwYzBjNSwgMHhhMjYxZGMyMCwgMHg2OTVhNzc0YiwgMHgxNjFjMTIxYSwKLSAgICAweDBhZTI5M2JhLCAweGU1YzBhMDJhLCAweDQzM2MyMmUwLCAweDFkMTIxYjE3LAotICAgIDB4MGIwZTA5MGQsIDB4YWRmMjhiYzcsIDB4YjkyZGI2YTgsIDB4YzgxNDFlYTksCi0gICAgMHg4NTU3ZjExOSwgMHg0Y2FmNzUwNywgMHhiYmVlOTlkZCwgMHhmZGEzN2Y2MCwKLSAgICAweDlmZjcwMTI2LCAweGJjNWM3MmY1LCAweGM1NDQ2NjNiLCAweDM0NWJmYjdlLAotICAgIDB4NzY4YjQzMjksIDB4ZGNjYjIzYzYsIDB4NjhiNmVkZmMsIDB4NjNiOGU0ZjEsCi0gICAgMHhjYWQ3MzFkYywgMHgxMDQyNjM4NSwgMHg0MDEzOTcyMiwgMHgyMDg0YzYxMSwKLSAgICAweDdkODU0YTI0LCAweGY4ZDJiYjNkLCAweDExYWVmOTMyLCAweDZkYzcyOWExLAotICAgIDB4NGIxZDllMmYsIDB4ZjNkY2IyMzAsIDB4ZWMwZDg2NTIsIDB4ZDA3N2MxZTMsCi0gICAgMHg2YzJiYjMxNiwgMHg5OWE5NzBiOSwgMHhmYTExOTQ0OCwgMHgyMjQ3ZTk2NCwKLSAgICAweGM0YThmYzhjLCAweDFhYTBmMDNmLCAweGQ4NTY3ZDJjLCAweGVmMjIzMzkwLAotICAgIDB4Yzc4NzQ5NGUsIDB4YzFkOTM4ZDEsIDB4ZmU4Y2NhYTIsIDB4MzY5OGQ0MGIsCi0gICAgMHhjZmE2ZjU4MSwgMHgyOGE1N2FkZSwgMHgyNmRhYjc4ZSwgMHhhNDNmYWRiZiwKLSAgICAweGU0MmMzYTlkLCAweDBkNTA3ODkyLCAweDliNmE1ZmNjLCAweDYyNTQ3ZTQ2LAotICAgIDB4YzJmNjhkMTMsIDB4ZTg5MGQ4YjgsIDB4NWUyZTM5ZjcsIDB4ZjU4MmMzYWYsCi0gICAgMHhiZTlmNWQ4MCwgMHg3YzY5ZDA5MywgMHhhOTZmZDUyZCwgMHhiM2NmMjUxMiwKLSAgICAweDNiYzhhYzk5LCAweGE3MTAxODdkLCAweDZlZTg5YzYzLCAweDdiZGIzYmJiLAotICAgIDB4MDljZDI2NzgsIDB4ZjQ2ZTU5MTgsIDB4MDFlYzlhYjcsIDB4YTg4MzRmOWEsCi0gICAgMHg2NWU2OTU2ZSwgMHg3ZWFhZmZlNiwgMHgwODIxYmNjZiwgMHhlNmVmMTVlOCwKLSAgICAweGQ5YmFlNzliLCAweGNlNGE2ZjM2LCAweGQ0ZWE5ZjA5LCAweGQ2MjliMDdjLAotICAgIDB4YWYzMWE0YjIsIDB4MzEyYTNmMjMsIDB4MzBjNmE1OTQsIDB4YzAzNWEyNjYsCi0gICAgMHgzNzc0NGViYywgMHhhNmZjODJjYSwgMHhiMGUwOTBkMCwgMHgxNTMzYTdkOCwKLSAgICAweDRhZjEwNDk4LCAweGY3NDFlY2RhLCAweDBlN2ZjZDUwLCAweDJmMTc5MWY2LAotICAgIDB4OGQ3NjRkZDYsIDB4NGQ0M2VmYjAsIDB4NTRjY2FhNGQsIDB4ZGZlNDk2MDQsCi0gICAgMHhlMzllZDFiNSwgMHgxYjRjNmE4OCwgMHhiOGMxMmMxZiwgMHg3ZjQ2NjU1MSwKLSAgICAweDA0OWQ1ZWVhLCAweDVkMDE4YzM1LCAweDczZmE4Nzc0LCAweDJlZmIwYjQxLAotICAgIDB4NWFiMzY3MWQsIDB4NTI5MmRiZDIsIDB4MzNlOTEwNTYsIDB4MTM2ZGQ2NDcsCi0gICAgMHg4YzlhZDc2MSwgMHg3YTM3YTEwYywgMHg4ZTU5ZjgxNCwgMHg4OWViMTMzYywKLSAgICAweGVlY2VhOTI3LCAweDM1Yjc2MWM5LCAweGVkZTExY2U1LCAweDNjN2E0N2IxLAotICAgIDB4NTk5Y2QyZGYsIDB4M2Y1NWYyNzMsIDB4NzkxODE0Y2UsIDB4YmY3M2M3MzcsCi0gICAgMHhlYTUzZjdjZCwgMHg1YjVmZmRhYSwgMHgxNGRmM2Q2ZiwgMHg4Njc4NDRkYiwKLSAgICAweDgxY2FhZmYzLCAweDNlYjk2OGM0LCAweDJjMzgyNDM0LCAweDVmYzJhMzQwLAotICAgIDB4NzIxNjFkYzMsIDB4MGNiY2UyMjUsIDB4OGIyODNjNDksIDB4NDFmZjBkOTUsCi0gICAgMHg3MTM5YTgwMSwgMHhkZTA4MGNiMywgMHg5Y2Q4YjRlNCwgMHg5MDY0NTZjMSwKKyAgICAweDUwNTFmNGE3LCAweDUzN2U0MTY1LCAweGMzMWExN2E0LCAweDk2M2EyNzVlLCAweGNiM2JhYjZiLCAweGYxMWY5ZDQ1LAorICAgIDB4YWJhY2ZhNTgsIDB4OTM0YmUzMDMsIDB4NTUyMDMwZmEsIDB4ZjZhZDc2NmQsIDB4OTE4OGNjNzYsIDB4MjVmNTAyNGMsCisgICAgMHhmYzRmZTVkNywgMHhkN2M1MmFjYiwgMHg4MDI2MzU0NCwgMHg4ZmI1NjJhMywgMHg0OWRlYjE1YSwgMHg2NzI1YmExYiwKKyAgICAweDk4NDVlYTBlLCAweGUxNWRmZWMwLCAweDAyYzMyZjc1LCAweDEyODE0Y2YwLCAweGEzOGQ0Njk3LCAweGM2NmJkM2Y5LAorICAgIDB4ZTcwMzhmNWYsIDB4OTUxNTkyOWMsIDB4ZWJiZjZkN2EsIDB4ZGE5NTUyNTksIDB4MmRkNGJlODMsIDB4ZDM1ODc0MjEsCisgICAgMHgyOTQ5ZTA2OSwgMHg0NDhlYzljOCwgMHg2YTc1YzI4OSwgMHg3OGY0OGU3OSwgMHg2Yjk5NTgzZSwgMHhkZDI3Yjk3MSwKKyAgICAweGI2YmVlMTRmLCAweDE3ZjA4OGFkLCAweDY2YzkyMGFjLCAweGI0N2RjZTNhLCAweDE4NjNkZjRhLCAweDgyZTUxYTMxLAorICAgIDB4NjA5NzUxMzMsIDB4NDU2MjUzN2YsIDB4ZTBiMTY0NzcsIDB4ODRiYjZiYWUsIDB4MWNmZTgxYTAsIDB4OTRmOTA4MmIsCisgICAgMHg1ODcwNDg2OCwgMHgxOThmNDVmZCwgMHg4Nzk0ZGU2YywgMHhiNzUyN2JmOCwgMHgyM2FiNzNkMywgMHhlMjcyNGIwMiwKKyAgICAweDU3ZTMxZjhmLCAweDJhNjY1NWFiLCAweDA3YjJlYjI4LCAweDAzMmZiNWMyLCAweDlhODZjNTdiLCAweGE1ZDMzNzA4LAorICAgIDB4ZjIzMDI4ODcsIDB4YjIyM2JmYTUsIDB4YmEwMjAzNmEsIDB4NWNlZDE2ODIsIDB4MmI4YWNmMWMsIDB4OTJhNzc5YjQsCisgICAgMHhmMGYzMDdmMiwgMHhhMTRlNjllMiwgMHhjZDY1ZGFmNCwgMHhkNTA2MDViZSwgMHgxZmQxMzQ2MiwgMHg4YWM0YTZmZSwKKyAgICAweDlkMzQyZTUzLCAweGEwYTJmMzU1LCAweDMyMDU4YWUxLCAweDc1YTRmNmViLCAweDM5MGI4M2VjLCAweGFhNDA2MGVmLAorICAgIDB4MDY1ZTcxOWYsIDB4NTFiZDZlMTAsIDB4ZjkzZTIxOGEsIDB4M2Q5NmRkMDYsIDB4YWVkZDNlMDUsIDB4NDY0ZGU2YmQsCisgICAgMHhiNTkxNTQ4ZCwgMHgwNTcxYzQ1ZCwgMHg2ZjA0MDZkNCwgMHhmZjYwNTAxNSwgMHgyNDE5OThmYiwgMHg5N2Q2YmRlOSwKKyAgICAweGNjODk0MDQzLCAweDc3NjdkOTllLCAweGJkYjBlODQyLCAweDg4MDc4OThiLCAweDM4ZTcxOTViLCAweGRiNzljOGVlLAorICAgIDB4NDdhMTdjMGEsIDB4ZTk3YzQyMGYsIDB4YzlmODg0MWUsIDB4MDAwMDAwMDAsIDB4ODMwOTgwODYsIDB4NDgzMjJiZWQsCisgICAgMHhhYzFlMTE3MCwgMHg0ZTZjNWE3MiwgMHhmYmZkMGVmZiwgMHg1NjBmODUzOCwgMHgxZTNkYWVkNSwgMHgyNzM2MmQzOSwKKyAgICAweDY0MGEwZmQ5LCAweDIxNjg1Y2E2LCAweGQxOWI1YjU0LCAweDNhMjQzNjJlLCAweGIxMGMwYTY3LCAweDBmOTM1N2U3LAorICAgIDB4ZDJiNGVlOTYsIDB4OWUxYjliOTEsIDB4NGY4MGMwYzUsIDB4YTI2MWRjMjAsIDB4Njk1YTc3NGIsIDB4MTYxYzEyMWEsCisgICAgMHgwYWUyOTNiYSwgMHhlNWMwYTAyYSwgMHg0MzNjMjJlMCwgMHgxZDEyMWIxNywgMHgwYjBlMDkwZCwgMHhhZGYyOGJjNywKKyAgICAweGI5MmRiNmE4LCAweGM4MTQxZWE5LCAweDg1NTdmMTE5LCAweDRjYWY3NTA3LCAweGJiZWU5OWRkLCAweGZkYTM3ZjYwLAorICAgIDB4OWZmNzAxMjYsIDB4YmM1YzcyZjUsIDB4YzU0NDY2M2IsIDB4MzQ1YmZiN2UsIDB4NzY4YjQzMjksIDB4ZGNjYjIzYzYsCisgICAgMHg2OGI2ZWRmYywgMHg2M2I4ZTRmMSwgMHhjYWQ3MzFkYywgMHgxMDQyNjM4NSwgMHg0MDEzOTcyMiwgMHgyMDg0YzYxMSwKKyAgICAweDdkODU0YTI0LCAweGY4ZDJiYjNkLCAweDExYWVmOTMyLCAweDZkYzcyOWExLCAweDRiMWQ5ZTJmLCAweGYzZGNiMjMwLAorICAgIDB4ZWMwZDg2NTIsIDB4ZDA3N2MxZTMsIDB4NmMyYmIzMTYsIDB4OTlhOTcwYjksIDB4ZmExMTk0NDgsIDB4MjI0N2U5NjQsCisgICAgMHhjNGE4ZmM4YywgMHgxYWEwZjAzZiwgMHhkODU2N2QyYywgMHhlZjIyMzM5MCwgMHhjNzg3NDk0ZSwgMHhjMWQ5MzhkMSwKKyAgICAweGZlOGNjYWEyLCAweDM2OThkNDBiLCAweGNmYTZmNTgxLCAweDI4YTU3YWRlLCAweDI2ZGFiNzhlLCAweGE0M2ZhZGJmLAorICAgIDB4ZTQyYzNhOWQsIDB4MGQ1MDc4OTIsIDB4OWI2YTVmY2MsIDB4NjI1NDdlNDYsIDB4YzJmNjhkMTMsIDB4ZTg5MGQ4YjgsCisgICAgMHg1ZTJlMzlmNywgMHhmNTgyYzNhZiwgMHhiZTlmNWQ4MCwgMHg3YzY5ZDA5MywgMHhhOTZmZDUyZCwgMHhiM2NmMjUxMiwKKyAgICAweDNiYzhhYzk5LCAweGE3MTAxODdkLCAweDZlZTg5YzYzLCAweDdiZGIzYmJiLCAweDA5Y2QyNjc4LCAweGY0NmU1OTE4LAorICAgIDB4MDFlYzlhYjcsIDB4YTg4MzRmOWEsIDB4NjVlNjk1NmUsIDB4N2VhYWZmZTYsIDB4MDgyMWJjY2YsIDB4ZTZlZjE1ZTgsCisgICAgMHhkOWJhZTc5YiwgMHhjZTRhNmYzNiwgMHhkNGVhOWYwOSwgMHhkNjI5YjA3YywgMHhhZjMxYTRiMiwgMHgzMTJhM2YyMywKKyAgICAweDMwYzZhNTk0LCAweGMwMzVhMjY2LCAweDM3NzQ0ZWJjLCAweGE2ZmM4MmNhLCAweGIwZTA5MGQwLCAweDE1MzNhN2Q4LAorICAgIDB4NGFmMTA0OTgsIDB4Zjc0MWVjZGEsIDB4MGU3ZmNkNTAsIDB4MmYxNzkxZjYsIDB4OGQ3NjRkZDYsIDB4NGQ0M2VmYjAsCisgICAgMHg1NGNjYWE0ZCwgMHhkZmU0OTYwNCwgMHhlMzllZDFiNSwgMHgxYjRjNmE4OCwgMHhiOGMxMmMxZiwgMHg3ZjQ2NjU1MSwKKyAgICAweDA0OWQ1ZWVhLCAweDVkMDE4YzM1LCAweDczZmE4Nzc0LCAweDJlZmIwYjQxLCAweDVhYjM2NzFkLCAweDUyOTJkYmQyLAorICAgIDB4MzNlOTEwNTYsIDB4MTM2ZGQ2NDcsIDB4OGM5YWQ3NjEsIDB4N2EzN2ExMGMsIDB4OGU1OWY4MTQsIDB4ODllYjEzM2MsCisgICAgMHhlZWNlYTkyNywgMHgzNWI3NjFjOSwgMHhlZGUxMWNlNSwgMHgzYzdhNDdiMSwgMHg1OTljZDJkZiwgMHgzZjU1ZjI3MywKKyAgICAweDc5MTgxNGNlLCAweGJmNzNjNzM3LCAweGVhNTNmN2NkLCAweDViNWZmZGFhLCAweDE0ZGYzZDZmLCAweDg2Nzg0NGRiLAorICAgIDB4ODFjYWFmZjMsIDB4M2ViOTY4YzQsIDB4MmMzODI0MzQsIDB4NWZjMmEzNDAsIDB4NzIxNjFkYzMsIDB4MGNiY2UyMjUsCisgICAgMHg4YjI4M2M0OSwgMHg0MWZmMGQ5NSwgMHg3MTM5YTgwMSwgMHhkZTA4MGNiMywgMHg5Y2Q4YjRlNCwgMHg5MDY0NTZjMSwKICAgICAweDYxN2JjYjg0LCAweDcwZDUzMmI2LCAweDc0NDg2YzVjLCAweDQyZDBiODU3LAogfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgRDJbMjU2XSA9IHsKLSAgICAweGE3NTA1MWY0LCAweDY1NTM3ZTQxLCAweGE0YzMxYTE3LCAweDVlOTYzYTI3LAotICAgIDB4NmJjYjNiYWIsIDB4NDVmMTFmOWQsIDB4NThhYmFjZmEsIDB4MDM5MzRiZTMsCi0gICAgMHhmYTU1MjAzMCwgMHg2ZGY2YWQ3NiwgMHg3NjkxODhjYywgMHg0YzI1ZjUwMiwKLSAgICAweGQ3ZmM0ZmU1LCAweGNiZDdjNTJhLCAweDQ0ODAyNjM1LCAweGEzOGZiNTYyLAotICAgIDB4NWE0OWRlYjEsIDB4MWI2NzI1YmEsIDB4MGU5ODQ1ZWEsIDB4YzBlMTVkZmUsCi0gICAgMHg3NTAyYzMyZiwgMHhmMDEyODE0YywgMHg5N2EzOGQ0NiwgMHhmOWM2NmJkMywKLSAgICAweDVmZTcwMzhmLCAweDljOTUxNTkyLCAweDdhZWJiZjZkLCAweDU5ZGE5NTUyLAotICAgIDB4ODMyZGQ0YmUsIDB4MjFkMzU4NzQsIDB4NjkyOTQ5ZTAsIDB4Yzg0NDhlYzksCi0gICAgMHg4OTZhNzVjMiwgMHg3OTc4ZjQ4ZSwgMHgzZTZiOTk1OCwgMHg3MWRkMjdiOSwKLSAgICAweDRmYjZiZWUxLCAweGFkMTdmMDg4LCAweGFjNjZjOTIwLCAweDNhYjQ3ZGNlLAotICAgIDB4NGExODYzZGYsIDB4MzE4MmU1MWEsIDB4MzM2MDk3NTEsIDB4N2Y0NTYyNTMsCi0gICAgMHg3N2UwYjE2NCwgMHhhZTg0YmI2YiwgMHhhMDFjZmU4MSwgMHgyYjk0ZjkwOCwKLSAgICAweDY4NTg3MDQ4LCAweGZkMTk4ZjQ1LCAweDZjODc5NGRlLCAweGY4Yjc1MjdiLAotICAgIDB4ZDMyM2FiNzMsIDB4MDJlMjcyNGIsIDB4OGY1N2UzMWYsIDB4YWIyYTY2NTUsCi0gICAgMHgyODA3YjJlYiwgMHhjMjAzMmZiNSwgMHg3YjlhODZjNSwgMHgwOGE1ZDMzNywKLSAgICAweDg3ZjIzMDI4LCAweGE1YjIyM2JmLCAweDZhYmEwMjAzLCAweDgyNWNlZDE2LAotICAgIDB4MWMyYjhhY2YsIDB4YjQ5MmE3NzksIDB4ZjJmMGYzMDcsIDB4ZTJhMTRlNjksCi0gICAgMHhmNGNkNjVkYSwgMHhiZWQ1MDYwNSwgMHg2MjFmZDEzNCwgMHhmZThhYzRhNiwKLSAgICAweDUzOWQzNDJlLCAweDU1YTBhMmYzLCAweGUxMzIwNThhLCAweGViNzVhNGY2LAotICAgIDB4ZWMzOTBiODMsIDB4ZWZhYTQwNjAsIDB4OWYwNjVlNzEsIDB4MTA1MWJkNmUsCi0gICAgMHg4YWY5M2UyMSwgMHgwNjNkOTZkZCwgMHgwNWFlZGQzZSwgMHhiZDQ2NGRlNiwKLSAgICAweDhkYjU5MTU0LCAweDVkMDU3MWM0LCAweGQ0NmYwNDA2LCAweDE1ZmY2MDUwLAotICAgIDB4ZmIyNDE5OTgsIDB4ZTk5N2Q2YmQsIDB4NDNjYzg5NDAsIDB4OWU3NzY3ZDksCi0gICAgMHg0MmJkYjBlOCwgMHg4Yjg4MDc4OSwgMHg1YjM4ZTcxOSwgMHhlZWRiNzljOCwKLSAgICAweDBhNDdhMTdjLCAweDBmZTk3YzQyLCAweDFlYzlmODg0LCAweDAwMDAwMDAwLAotICAgIDB4ODY4MzA5ODAsIDB4ZWQ0ODMyMmIsIDB4NzBhYzFlMTEsIDB4NzI0ZTZjNWEsCi0gICAgMHhmZmZiZmQwZSwgMHgzODU2MGY4NSwgMHhkNTFlM2RhZSwgMHgzOTI3MzYyZCwKLSAgICAweGQ5NjQwYTBmLCAweGE2MjE2ODVjLCAweDU0ZDE5YjViLCAweDJlM2EyNDM2LAotICAgIDB4NjdiMTBjMGEsIDB4ZTcwZjkzNTcsIDB4OTZkMmI0ZWUsIDB4OTE5ZTFiOWIsCi0gICAgMHhjNTRmODBjMCwgMHgyMGEyNjFkYywgMHg0YjY5NWE3NywgMHgxYTE2MWMxMiwKLSAgICAweGJhMGFlMjkzLCAweDJhZTVjMGEwLCAweGUwNDMzYzIyLCAweDE3MWQxMjFiLAotICAgIDB4MGQwYjBlMDksIDB4YzdhZGYyOGIsIDB4YThiOTJkYjYsIDB4YTljODE0MWUsCi0gICAgMHgxOTg1NTdmMSwgMHgwNzRjYWY3NSwgMHhkZGJiZWU5OSwgMHg2MGZkYTM3ZiwKLSAgICAweDI2OWZmNzAxLCAweGY1YmM1YzcyLCAweDNiYzU0NDY2LCAweDdlMzQ1YmZiLAotICAgIDB4Mjk3NjhiNDMsIDB4YzZkY2NiMjMsIDB4ZmM2OGI2ZWQsIDB4ZjE2M2I4ZTQsCi0gICAgMHhkY2NhZDczMSwgMHg4NTEwNDI2MywgMHgyMjQwMTM5NywgMHgxMTIwODRjNiwKLSAgICAweDI0N2Q4NTRhLCAweDNkZjhkMmJiLCAweDMyMTFhZWY5LCAweGExNmRjNzI5LAotICAgIDB4MmY0YjFkOWUsIDB4MzBmM2RjYjIsIDB4NTJlYzBkODYsIDB4ZTNkMDc3YzEsCi0gICAgMHgxNjZjMmJiMywgMHhiOTk5YTk3MCwgMHg0OGZhMTE5NCwgMHg2NDIyNDdlOSwKLSAgICAweDhjYzRhOGZjLCAweDNmMWFhMGYwLCAweDJjZDg1NjdkLCAweDkwZWYyMjMzLAotICAgIDB4NGVjNzg3NDksIDB4ZDFjMWQ5MzgsIDB4YTJmZThjY2EsIDB4MGIzNjk4ZDQsCi0gICAgMHg4MWNmYTZmNSwgMHhkZTI4YTU3YSwgMHg4ZTI2ZGFiNywgMHhiZmE0M2ZhZCwKLSAgICAweDlkZTQyYzNhLCAweDkyMGQ1MDc4LCAweGNjOWI2YTVmLCAweDQ2NjI1NDdlLAotICAgIDB4MTNjMmY2OGQsIDB4YjhlODkwZDgsIDB4Zjc1ZTJlMzksIDB4YWZmNTgyYzMsCi0gICAgMHg4MGJlOWY1ZCwgMHg5MzdjNjlkMCwgMHgyZGE5NmZkNSwgMHgxMmIzY2YyNSwKLSAgICAweDk5M2JjOGFjLCAweDdkYTcxMDE4LCAweDYzNmVlODljLCAweGJiN2JkYjNiLAotICAgIDB4NzgwOWNkMjYsIDB4MThmNDZlNTksIDB4YjcwMWVjOWEsIDB4OWFhODgzNGYsCi0gICAgMHg2ZTY1ZTY5NSwgMHhlNjdlYWFmZiwgMHhjZjA4MjFiYywgMHhlOGU2ZWYxNSwKLSAgICAweDliZDliYWU3LCAweDM2Y2U0YTZmLCAweDA5ZDRlYTlmLCAweDdjZDYyOWIwLAotICAgIDB4YjJhZjMxYTQsIDB4MjMzMTJhM2YsIDB4OTQzMGM2YTUsIDB4NjZjMDM1YTIsCi0gICAgMHhiYzM3NzQ0ZSwgMHhjYWE2ZmM4MiwgMHhkMGIwZTA5MCwgMHhkODE1MzNhNywKLSAgICAweDk4NGFmMTA0LCAweGRhZjc0MWVjLCAweDUwMGU3ZmNkLCAweGY2MmYxNzkxLAotICAgIDB4ZDY4ZDc2NGQsIDB4YjA0ZDQzZWYsIDB4NGQ1NGNjYWEsIDB4MDRkZmU0OTYsCi0gICAgMHhiNWUzOWVkMSwgMHg4ODFiNGM2YSwgMHgxZmI4YzEyYywgMHg1MTdmNDY2NSwKLSAgICAweGVhMDQ5ZDVlLCAweDM1NWQwMThjLCAweDc0NzNmYTg3LCAweDQxMmVmYjBiLAotICAgIDB4MWQ1YWIzNjcsIDB4ZDI1MjkyZGIsIDB4NTYzM2U5MTAsIDB4NDcxMzZkZDYsCi0gICAgMHg2MThjOWFkNywgMHgwYzdhMzdhMSwgMHgxNDhlNTlmOCwgMHgzYzg5ZWIxMywKLSAgICAweDI3ZWVjZWE5LCAweGM5MzViNzYxLCAweGU1ZWRlMTFjLCAweGIxM2M3YTQ3LAotICAgIDB4ZGY1OTljZDIsIDB4NzMzZjU1ZjIsIDB4Y2U3OTE4MTQsIDB4MzdiZjczYzcsCi0gICAgMHhjZGVhNTNmNywgMHhhYTViNWZmZCwgMHg2ZjE0ZGYzZCwgMHhkYjg2Nzg0NCwKLSAgICAweGYzODFjYWFmLCAweGM0M2ViOTY4LCAweDM0MmMzODI0LCAweDQwNWZjMmEzLAotICAgIDB4YzM3MjE2MWQsIDB4MjUwY2JjZTIsIDB4NDk4YjI4M2MsIDB4OTU0MWZmMGQsCi0gICAgMHgwMTcxMzlhOCwgMHhiM2RlMDgwYywgMHhlNDljZDhiNCwgMHhjMTkwNjQ1NiwKKyAgICAweGE3NTA1MWY0LCAweDY1NTM3ZTQxLCAweGE0YzMxYTE3LCAweDVlOTYzYTI3LCAweDZiY2IzYmFiLCAweDQ1ZjExZjlkLAorICAgIDB4NThhYmFjZmEsIDB4MDM5MzRiZTMsIDB4ZmE1NTIwMzAsIDB4NmRmNmFkNzYsIDB4NzY5MTg4Y2MsIDB4NGMyNWY1MDIsCisgICAgMHhkN2ZjNGZlNSwgMHhjYmQ3YzUyYSwgMHg0NDgwMjYzNSwgMHhhMzhmYjU2MiwgMHg1YTQ5ZGViMSwgMHgxYjY3MjViYSwKKyAgICAweDBlOTg0NWVhLCAweGMwZTE1ZGZlLCAweDc1MDJjMzJmLCAweGYwMTI4MTRjLCAweDk3YTM4ZDQ2LCAweGY5YzY2YmQzLAorICAgIDB4NWZlNzAzOGYsIDB4OWM5NTE1OTIsIDB4N2FlYmJmNmQsIDB4NTlkYTk1NTIsIDB4ODMyZGQ0YmUsIDB4MjFkMzU4NzQsCisgICAgMHg2OTI5NDllMCwgMHhjODQ0OGVjOSwgMHg4OTZhNzVjMiwgMHg3OTc4ZjQ4ZSwgMHgzZTZiOTk1OCwgMHg3MWRkMjdiOSwKKyAgICAweDRmYjZiZWUxLCAweGFkMTdmMDg4LCAweGFjNjZjOTIwLCAweDNhYjQ3ZGNlLCAweDRhMTg2M2RmLCAweDMxODJlNTFhLAorICAgIDB4MzM2MDk3NTEsIDB4N2Y0NTYyNTMsIDB4NzdlMGIxNjQsIDB4YWU4NGJiNmIsIDB4YTAxY2ZlODEsIDB4MmI5NGY5MDgsCisgICAgMHg2ODU4NzA0OCwgMHhmZDE5OGY0NSwgMHg2Yzg3OTRkZSwgMHhmOGI3NTI3YiwgMHhkMzIzYWI3MywgMHgwMmUyNzI0YiwKKyAgICAweDhmNTdlMzFmLCAweGFiMmE2NjU1LCAweDI4MDdiMmViLCAweGMyMDMyZmI1LCAweDdiOWE4NmM1LCAweDA4YTVkMzM3LAorICAgIDB4ODdmMjMwMjgsIDB4YTViMjIzYmYsIDB4NmFiYTAyMDMsIDB4ODI1Y2VkMTYsIDB4MWMyYjhhY2YsIDB4YjQ5MmE3NzksCisgICAgMHhmMmYwZjMwNywgMHhlMmExNGU2OSwgMHhmNGNkNjVkYSwgMHhiZWQ1MDYwNSwgMHg2MjFmZDEzNCwgMHhmZThhYzRhNiwKKyAgICAweDUzOWQzNDJlLCAweDU1YTBhMmYzLCAweGUxMzIwNThhLCAweGViNzVhNGY2LCAweGVjMzkwYjgzLCAweGVmYWE0MDYwLAorICAgIDB4OWYwNjVlNzEsIDB4MTA1MWJkNmUsIDB4OGFmOTNlMjEsIDB4MDYzZDk2ZGQsIDB4MDVhZWRkM2UsIDB4YmQ0NjRkZTYsCisgICAgMHg4ZGI1OTE1NCwgMHg1ZDA1NzFjNCwgMHhkNDZmMDQwNiwgMHgxNWZmNjA1MCwgMHhmYjI0MTk5OCwgMHhlOTk3ZDZiZCwKKyAgICAweDQzY2M4OTQwLCAweDllNzc2N2Q5LCAweDQyYmRiMGU4LCAweDhiODgwNzg5LCAweDViMzhlNzE5LCAweGVlZGI3OWM4LAorICAgIDB4MGE0N2ExN2MsIDB4MGZlOTdjNDIsIDB4MWVjOWY4ODQsIDB4MDAwMDAwMDAsIDB4ODY4MzA5ODAsIDB4ZWQ0ODMyMmIsCisgICAgMHg3MGFjMWUxMSwgMHg3MjRlNmM1YSwgMHhmZmZiZmQwZSwgMHgzODU2MGY4NSwgMHhkNTFlM2RhZSwgMHgzOTI3MzYyZCwKKyAgICAweGQ5NjQwYTBmLCAweGE2MjE2ODVjLCAweDU0ZDE5YjViLCAweDJlM2EyNDM2LCAweDY3YjEwYzBhLCAweGU3MGY5MzU3LAorICAgIDB4OTZkMmI0ZWUsIDB4OTE5ZTFiOWIsIDB4YzU0ZjgwYzAsIDB4MjBhMjYxZGMsIDB4NGI2OTVhNzcsIDB4MWExNjFjMTIsCisgICAgMHhiYTBhZTI5MywgMHgyYWU1YzBhMCwgMHhlMDQzM2MyMiwgMHgxNzFkMTIxYiwgMHgwZDBiMGUwOSwgMHhjN2FkZjI4YiwKKyAgICAweGE4YjkyZGI2LCAweGE5YzgxNDFlLCAweDE5ODU1N2YxLCAweDA3NGNhZjc1LCAweGRkYmJlZTk5LCAweDYwZmRhMzdmLAorICAgIDB4MjY5ZmY3MDEsIDB4ZjViYzVjNzIsIDB4M2JjNTQ0NjYsIDB4N2UzNDViZmIsIDB4Mjk3NjhiNDMsIDB4YzZkY2NiMjMsCisgICAgMHhmYzY4YjZlZCwgMHhmMTYzYjhlNCwgMHhkY2NhZDczMSwgMHg4NTEwNDI2MywgMHgyMjQwMTM5NywgMHgxMTIwODRjNiwKKyAgICAweDI0N2Q4NTRhLCAweDNkZjhkMmJiLCAweDMyMTFhZWY5LCAweGExNmRjNzI5LCAweDJmNGIxZDllLCAweDMwZjNkY2IyLAorICAgIDB4NTJlYzBkODYsIDB4ZTNkMDc3YzEsIDB4MTY2YzJiYjMsIDB4Yjk5OWE5NzAsIDB4NDhmYTExOTQsIDB4NjQyMjQ3ZTksCisgICAgMHg4Y2M0YThmYywgMHgzZjFhYTBmMCwgMHgyY2Q4NTY3ZCwgMHg5MGVmMjIzMywgMHg0ZWM3ODc0OSwgMHhkMWMxZDkzOCwKKyAgICAweGEyZmU4Y2NhLCAweDBiMzY5OGQ0LCAweDgxY2ZhNmY1LCAweGRlMjhhNTdhLCAweDhlMjZkYWI3LCAweGJmYTQzZmFkLAorICAgIDB4OWRlNDJjM2EsIDB4OTIwZDUwNzgsIDB4Y2M5YjZhNWYsIDB4NDY2MjU0N2UsIDB4MTNjMmY2OGQsIDB4YjhlODkwZDgsCisgICAgMHhmNzVlMmUzOSwgMHhhZmY1ODJjMywgMHg4MGJlOWY1ZCwgMHg5MzdjNjlkMCwgMHgyZGE5NmZkNSwgMHgxMmIzY2YyNSwKKyAgICAweDk5M2JjOGFjLCAweDdkYTcxMDE4LCAweDYzNmVlODljLCAweGJiN2JkYjNiLCAweDc4MDljZDI2LCAweDE4ZjQ2ZTU5LAorICAgIDB4YjcwMWVjOWEsIDB4OWFhODgzNGYsIDB4NmU2NWU2OTUsIDB4ZTY3ZWFhZmYsIDB4Y2YwODIxYmMsIDB4ZThlNmVmMTUsCisgICAgMHg5YmQ5YmFlNywgMHgzNmNlNGE2ZiwgMHgwOWQ0ZWE5ZiwgMHg3Y2Q2MjliMCwgMHhiMmFmMzFhNCwgMHgyMzMxMmEzZiwKKyAgICAweDk0MzBjNmE1LCAweDY2YzAzNWEyLCAweGJjMzc3NDRlLCAweGNhYTZmYzgyLCAweGQwYjBlMDkwLCAweGQ4MTUzM2E3LAorICAgIDB4OTg0YWYxMDQsIDB4ZGFmNzQxZWMsIDB4NTAwZTdmY2QsIDB4ZjYyZjE3OTEsIDB4ZDY4ZDc2NGQsIDB4YjA0ZDQzZWYsCisgICAgMHg0ZDU0Y2NhYSwgMHgwNGRmZTQ5NiwgMHhiNWUzOWVkMSwgMHg4ODFiNGM2YSwgMHgxZmI4YzEyYywgMHg1MTdmNDY2NSwKKyAgICAweGVhMDQ5ZDVlLCAweDM1NWQwMThjLCAweDc0NzNmYTg3LCAweDQxMmVmYjBiLCAweDFkNWFiMzY3LCAweGQyNTI5MmRiLAorICAgIDB4NTYzM2U5MTAsIDB4NDcxMzZkZDYsIDB4NjE4YzlhZDcsIDB4MGM3YTM3YTEsIDB4MTQ4ZTU5ZjgsIDB4M2M4OWViMTMsCisgICAgMHgyN2VlY2VhOSwgMHhjOTM1Yjc2MSwgMHhlNWVkZTExYywgMHhiMTNjN2E0NywgMHhkZjU5OWNkMiwgMHg3MzNmNTVmMiwKKyAgICAweGNlNzkxODE0LCAweDM3YmY3M2M3LCAweGNkZWE1M2Y3LCAweGFhNWI1ZmZkLCAweDZmMTRkZjNkLCAweGRiODY3ODQ0LAorICAgIDB4ZjM4MWNhYWYsIDB4YzQzZWI5NjgsIDB4MzQyYzM4MjQsIDB4NDA1ZmMyYTMsIDB4YzM3MjE2MWQsIDB4MjUwY2JjZTIsCisgICAgMHg0OThiMjgzYywgMHg5NTQxZmYwZCwgMHgwMTcxMzlhOCwgMHhiM2RlMDgwYywgMHhlNDljZDhiNCwgMHhjMTkwNjQ1NiwKICAgICAweDg0NjE3YmNiLCAweGI2NzBkNTMyLCAweDVjNzQ0ODZjLCAweDU3NDJkMGI4LAogfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgRDNbMjU2XSA9IHsKLSAgICAweGY0YTc1MDUxLCAweDQxNjU1MzdlLCAweDE3YTRjMzFhLCAweDI3NWU5NjNhLAotICAgIDB4YWI2YmNiM2IsIDB4OWQ0NWYxMWYsIDB4ZmE1OGFiYWMsIDB4ZTMwMzkzNGIsCi0gICAgMHgzMGZhNTUyMCwgMHg3NjZkZjZhZCwgMHhjYzc2OTE4OCwgMHgwMjRjMjVmNSwKLSAgICAweGU1ZDdmYzRmLCAweDJhY2JkN2M1LCAweDM1NDQ4MDI2LCAweDYyYTM4ZmI1LAotICAgIDB4YjE1YTQ5ZGUsIDB4YmExYjY3MjUsIDB4ZWEwZTk4NDUsIDB4ZmVjMGUxNWQsCi0gICAgMHgyZjc1MDJjMywgMHg0Y2YwMTI4MSwgMHg0Njk3YTM4ZCwgMHhkM2Y5YzY2YiwKLSAgICAweDhmNWZlNzAzLCAweDkyOWM5NTE1LCAweDZkN2FlYmJmLCAweDUyNTlkYTk1LAotICAgIDB4YmU4MzJkZDQsIDB4NzQyMWQzNTgsIDB4ZTA2OTI5NDksIDB4YzljODQ0OGUsCi0gICAgMHhjMjg5NmE3NSwgMHg4ZTc5NzhmNCwgMHg1ODNlNmI5OSwgMHhiOTcxZGQyNywKLSAgICAweGUxNGZiNmJlLCAweDg4YWQxN2YwLCAweDIwYWM2NmM5LCAweGNlM2FiNDdkLAotICAgIDB4ZGY0YTE4NjMsIDB4MWEzMTgyZTUsIDB4NTEzMzYwOTcsIDB4NTM3ZjQ1NjIsCi0gICAgMHg2NDc3ZTBiMSwgMHg2YmFlODRiYiwgMHg4MWEwMWNmZSwgMHgwODJiOTRmOSwKLSAgICAweDQ4Njg1ODcwLCAweDQ1ZmQxOThmLCAweGRlNmM4Nzk0LCAweDdiZjhiNzUyLAotICAgIDB4NzNkMzIzYWIsIDB4NGIwMmUyNzIsIDB4MWY4ZjU3ZTMsIDB4NTVhYjJhNjYsCi0gICAgMHhlYjI4MDdiMiwgMHhiNWMyMDMyZiwgMHhjNTdiOWE4NiwgMHgzNzA4YTVkMywKLSAgICAweDI4ODdmMjMwLCAweGJmYTViMjIzLCAweDAzNmFiYTAyLCAweDE2ODI1Y2VkLAotICAgIDB4Y2YxYzJiOGEsIDB4NzliNDkyYTcsIDB4MDdmMmYwZjMsIDB4NjllMmExNGUsCi0gICAgMHhkYWY0Y2Q2NSwgMHgwNWJlZDUwNiwgMHgzNDYyMWZkMSwgMHhhNmZlOGFjNCwKLSAgICAweDJlNTM5ZDM0LCAweGYzNTVhMGEyLCAweDhhZTEzMjA1LCAweGY2ZWI3NWE0LAotICAgIDB4ODNlYzM5MGIsIDB4NjBlZmFhNDAsIDB4NzE5ZjA2NWUsIDB4NmUxMDUxYmQsCi0gICAgMHgyMThhZjkzZSwgMHhkZDA2M2Q5NiwgMHgzZTA1YWVkZCwgMHhlNmJkNDY0ZCwKLSAgICAweDU0OGRiNTkxLCAweGM0NWQwNTcxLCAweDA2ZDQ2ZjA0LCAweDUwMTVmZjYwLAotICAgIDB4OThmYjI0MTksIDB4YmRlOTk3ZDYsIDB4NDA0M2NjODksIDB4ZDk5ZTc3NjcsCi0gICAgMHhlODQyYmRiMCwgMHg4OThiODgwNywgMHgxOTViMzhlNywgMHhjOGVlZGI3OSwKLSAgICAweDdjMGE0N2ExLCAweDQyMGZlOTdjLCAweDg0MWVjOWY4LCAweDAwMDAwMDAwLAotICAgIDB4ODA4NjgzMDksIDB4MmJlZDQ4MzIsIDB4MTE3MGFjMWUsIDB4NWE3MjRlNmMsCi0gICAgMHgwZWZmZmJmZCwgMHg4NTM4NTYwZiwgMHhhZWQ1MWUzZCwgMHgyZDM5MjczNiwKLSAgICAweDBmZDk2NDBhLCAweDVjYTYyMTY4LCAweDViNTRkMTliLCAweDM2MmUzYTI0LAotICAgIDB4MGE2N2IxMGMsIDB4NTdlNzBmOTMsIDB4ZWU5NmQyYjQsIDB4OWI5MTllMWIsCi0gICAgMHhjMGM1NGY4MCwgMHhkYzIwYTI2MSwgMHg3NzRiNjk1YSwgMHgxMjFhMTYxYywKLSAgICAweDkzYmEwYWUyLCAweGEwMmFlNWMwLCAweDIyZTA0MzNjLCAweDFiMTcxZDEyLAotICAgIDB4MDkwZDBiMGUsIDB4OGJjN2FkZjIsIDB4YjZhOGI5MmQsIDB4MWVhOWM4MTQsCi0gICAgMHhmMTE5ODU1NywgMHg3NTA3NGNhZiwgMHg5OWRkYmJlZSwgMHg3ZjYwZmRhMywKLSAgICAweDAxMjY5ZmY3LCAweDcyZjViYzVjLCAweDY2M2JjNTQ0LCAweGZiN2UzNDViLAotICAgIDB4NDMyOTc2OGIsIDB4MjNjNmRjY2IsIDB4ZWRmYzY4YjYsIDB4ZTRmMTYzYjgsCi0gICAgMHgzMWRjY2FkNywgMHg2Mzg1MTA0MiwgMHg5NzIyNDAxMywgMHhjNjExMjA4NCwKLSAgICAweDRhMjQ3ZDg1LCAweGJiM2RmOGQyLCAweGY5MzIxMWFlLCAweDI5YTE2ZGM3LAotICAgIDB4OWUyZjRiMWQsIDB4YjIzMGYzZGMsIDB4ODY1MmVjMGQsIDB4YzFlM2QwNzcsCi0gICAgMHhiMzE2NmMyYiwgMHg3MGI5OTlhOSwgMHg5NDQ4ZmExMSwgMHhlOTY0MjI0NywKLSAgICAweGZjOGNjNGE4LCAweGYwM2YxYWEwLCAweDdkMmNkODU2LCAweDMzOTBlZjIyLAotICAgIDB4NDk0ZWM3ODcsIDB4MzhkMWMxZDksIDB4Y2FhMmZlOGMsIDB4ZDQwYjM2OTgsCi0gICAgMHhmNTgxY2ZhNiwgMHg3YWRlMjhhNSwgMHhiNzhlMjZkYSwgMHhhZGJmYTQzZiwKLSAgICAweDNhOWRlNDJjLCAweDc4OTIwZDUwLCAweDVmY2M5YjZhLCAweDdlNDY2MjU0LAotICAgIDB4OGQxM2MyZjYsIDB4ZDhiOGU4OTAsIDB4MzlmNzVlMmUsIDB4YzNhZmY1ODIsCi0gICAgMHg1ZDgwYmU5ZiwgMHhkMDkzN2M2OSwgMHhkNTJkYTk2ZiwgMHgyNTEyYjNjZiwKLSAgICAweGFjOTkzYmM4LCAweDE4N2RhNzEwLCAweDljNjM2ZWU4LCAweDNiYmI3YmRiLAotICAgIDB4MjY3ODA5Y2QsIDB4NTkxOGY0NmUsIDB4OWFiNzAxZWMsIDB4NGY5YWE4ODMsCi0gICAgMHg5NTZlNjVlNiwgMHhmZmU2N2VhYSwgMHhiY2NmMDgyMSwgMHgxNWU4ZTZlZiwKLSAgICAweGU3OWJkOWJhLCAweDZmMzZjZTRhLCAweDlmMDlkNGVhLCAweGIwN2NkNjI5LAotICAgIDB4YTRiMmFmMzEsIDB4M2YyMzMxMmEsIDB4YTU5NDMwYzYsIDB4YTI2NmMwMzUsCi0gICAgMHg0ZWJjMzc3NCwgMHg4MmNhYTZmYywgMHg5MGQwYjBlMCwgMHhhN2Q4MTUzMywKLSAgICAweDA0OTg0YWYxLCAweGVjZGFmNzQxLCAweGNkNTAwZTdmLCAweDkxZjYyZjE3LAotICAgIDB4NGRkNjhkNzYsIDB4ZWZiMDRkNDMsIDB4YWE0ZDU0Y2MsIDB4OTYwNGRmZTQsCi0gICAgMHhkMWI1ZTM5ZSwgMHg2YTg4MWI0YywgMHgyYzFmYjhjMSwgMHg2NTUxN2Y0NiwKLSAgICAweDVlZWEwNDlkLCAweDhjMzU1ZDAxLCAweDg3NzQ3M2ZhLCAweDBiNDEyZWZiLAotICAgIDB4NjcxZDVhYjMsIDB4ZGJkMjUyOTIsIDB4MTA1NjMzZTksIDB4ZDY0NzEzNmQsCi0gICAgMHhkNzYxOGM5YSwgMHhhMTBjN2EzNywgMHhmODE0OGU1OSwgMHgxMzNjODllYiwKLSAgICAweGE5MjdlZWNlLCAweDYxYzkzNWI3LCAweDFjZTVlZGUxLCAweDQ3YjEzYzdhLAotICAgIDB4ZDJkZjU5OWMsIDB4ZjI3MzNmNTUsIDB4MTRjZTc5MTgsIDB4YzczN2JmNzMsCi0gICAgMHhmN2NkZWE1MywgMHhmZGFhNWI1ZiwgMHgzZDZmMTRkZiwgMHg0NGRiODY3OCwKLSAgICAweGFmZjM4MWNhLCAweDY4YzQzZWI5LCAweDI0MzQyYzM4LCAweGEzNDA1ZmMyLAotICAgIDB4MWRjMzcyMTYsIDB4ZTIyNTBjYmMsIDB4M2M0OThiMjgsIDB4MGQ5NTQxZmYsCi0gICAgMHhhODAxNzEzOSwgMHgwY2IzZGUwOCwgMHhiNGU0OWNkOCwgMHg1NmMxOTA2NCwKKyAgICAweGY0YTc1MDUxLCAweDQxNjU1MzdlLCAweDE3YTRjMzFhLCAweDI3NWU5NjNhLCAweGFiNmJjYjNiLCAweDlkNDVmMTFmLAorICAgIDB4ZmE1OGFiYWMsIDB4ZTMwMzkzNGIsIDB4MzBmYTU1MjAsIDB4NzY2ZGY2YWQsIDB4Y2M3NjkxODgsIDB4MDI0YzI1ZjUsCisgICAgMHhlNWQ3ZmM0ZiwgMHgyYWNiZDdjNSwgMHgzNTQ0ODAyNiwgMHg2MmEzOGZiNSwgMHhiMTVhNDlkZSwgMHhiYTFiNjcyNSwKKyAgICAweGVhMGU5ODQ1LCAweGZlYzBlMTVkLCAweDJmNzUwMmMzLCAweDRjZjAxMjgxLCAweDQ2OTdhMzhkLCAweGQzZjljNjZiLAorICAgIDB4OGY1ZmU3MDMsIDB4OTI5Yzk1MTUsIDB4NmQ3YWViYmYsIDB4NTI1OWRhOTUsIDB4YmU4MzJkZDQsIDB4NzQyMWQzNTgsCisgICAgMHhlMDY5Mjk0OSwgMHhjOWM4NDQ4ZSwgMHhjMjg5NmE3NSwgMHg4ZTc5NzhmNCwgMHg1ODNlNmI5OSwgMHhiOTcxZGQyNywKKyAgICAweGUxNGZiNmJlLCAweDg4YWQxN2YwLCAweDIwYWM2NmM5LCAweGNlM2FiNDdkLCAweGRmNGExODYzLCAweDFhMzE4MmU1LAorICAgIDB4NTEzMzYwOTcsIDB4NTM3ZjQ1NjIsIDB4NjQ3N2UwYjEsIDB4NmJhZTg0YmIsIDB4ODFhMDFjZmUsIDB4MDgyYjk0ZjksCisgICAgMHg0ODY4NTg3MCwgMHg0NWZkMTk4ZiwgMHhkZTZjODc5NCwgMHg3YmY4Yjc1MiwgMHg3M2QzMjNhYiwgMHg0YjAyZTI3MiwKKyAgICAweDFmOGY1N2UzLCAweDU1YWIyYTY2LCAweGViMjgwN2IyLCAweGI1YzIwMzJmLCAweGM1N2I5YTg2LCAweDM3MDhhNWQzLAorICAgIDB4Mjg4N2YyMzAsIDB4YmZhNWIyMjMsIDB4MDM2YWJhMDIsIDB4MTY4MjVjZWQsIDB4Y2YxYzJiOGEsIDB4NzliNDkyYTcsCisgICAgMHgwN2YyZjBmMywgMHg2OWUyYTE0ZSwgMHhkYWY0Y2Q2NSwgMHgwNWJlZDUwNiwgMHgzNDYyMWZkMSwgMHhhNmZlOGFjNCwKKyAgICAweDJlNTM5ZDM0LCAweGYzNTVhMGEyLCAweDhhZTEzMjA1LCAweGY2ZWI3NWE0LCAweDgzZWMzOTBiLCAweDYwZWZhYTQwLAorICAgIDB4NzE5ZjA2NWUsIDB4NmUxMDUxYmQsIDB4MjE4YWY5M2UsIDB4ZGQwNjNkOTYsIDB4M2UwNWFlZGQsIDB4ZTZiZDQ2NGQsCisgICAgMHg1NDhkYjU5MSwgMHhjNDVkMDU3MSwgMHgwNmQ0NmYwNCwgMHg1MDE1ZmY2MCwgMHg5OGZiMjQxOSwgMHhiZGU5OTdkNiwKKyAgICAweDQwNDNjYzg5LCAweGQ5OWU3NzY3LCAweGU4NDJiZGIwLCAweDg5OGI4ODA3LCAweDE5NWIzOGU3LCAweGM4ZWVkYjc5LAorICAgIDB4N2MwYTQ3YTEsIDB4NDIwZmU5N2MsIDB4ODQxZWM5ZjgsIDB4MDAwMDAwMDAsIDB4ODA4NjgzMDksIDB4MmJlZDQ4MzIsCisgICAgMHgxMTcwYWMxZSwgMHg1YTcyNGU2YywgMHgwZWZmZmJmZCwgMHg4NTM4NTYwZiwgMHhhZWQ1MWUzZCwgMHgyZDM5MjczNiwKKyAgICAweDBmZDk2NDBhLCAweDVjYTYyMTY4LCAweDViNTRkMTliLCAweDM2MmUzYTI0LCAweDBhNjdiMTBjLCAweDU3ZTcwZjkzLAorICAgIDB4ZWU5NmQyYjQsIDB4OWI5MTllMWIsIDB4YzBjNTRmODAsIDB4ZGMyMGEyNjEsIDB4Nzc0YjY5NWEsIDB4MTIxYTE2MWMsCisgICAgMHg5M2JhMGFlMiwgMHhhMDJhZTVjMCwgMHgyMmUwNDMzYywgMHgxYjE3MWQxMiwgMHgwOTBkMGIwZSwgMHg4YmM3YWRmMiwKKyAgICAweGI2YThiOTJkLCAweDFlYTljODE0LCAweGYxMTk4NTU3LCAweDc1MDc0Y2FmLCAweDk5ZGRiYmVlLCAweDdmNjBmZGEzLAorICAgIDB4MDEyNjlmZjcsIDB4NzJmNWJjNWMsIDB4NjYzYmM1NDQsIDB4ZmI3ZTM0NWIsIDB4NDMyOTc2OGIsIDB4MjNjNmRjY2IsCisgICAgMHhlZGZjNjhiNiwgMHhlNGYxNjNiOCwgMHgzMWRjY2FkNywgMHg2Mzg1MTA0MiwgMHg5NzIyNDAxMywgMHhjNjExMjA4NCwKKyAgICAweDRhMjQ3ZDg1LCAweGJiM2RmOGQyLCAweGY5MzIxMWFlLCAweDI5YTE2ZGM3LCAweDllMmY0YjFkLCAweGIyMzBmM2RjLAorICAgIDB4ODY1MmVjMGQsIDB4YzFlM2QwNzcsIDB4YjMxNjZjMmIsIDB4NzBiOTk5YTksIDB4OTQ0OGZhMTEsIDB4ZTk2NDIyNDcsCisgICAgMHhmYzhjYzRhOCwgMHhmMDNmMWFhMCwgMHg3ZDJjZDg1NiwgMHgzMzkwZWYyMiwgMHg0OTRlYzc4NywgMHgzOGQxYzFkOSwKKyAgICAweGNhYTJmZThjLCAweGQ0MGIzNjk4LCAweGY1ODFjZmE2LCAweDdhZGUyOGE1LCAweGI3OGUyNmRhLCAweGFkYmZhNDNmLAorICAgIDB4M2E5ZGU0MmMsIDB4Nzg5MjBkNTAsIDB4NWZjYzliNmEsIDB4N2U0NjYyNTQsIDB4OGQxM2MyZjYsIDB4ZDhiOGU4OTAsCisgICAgMHgzOWY3NWUyZSwgMHhjM2FmZjU4MiwgMHg1ZDgwYmU5ZiwgMHhkMDkzN2M2OSwgMHhkNTJkYTk2ZiwgMHgyNTEyYjNjZiwKKyAgICAweGFjOTkzYmM4LCAweDE4N2RhNzEwLCAweDljNjM2ZWU4LCAweDNiYmI3YmRiLCAweDI2NzgwOWNkLCAweDU5MThmNDZlLAorICAgIDB4OWFiNzAxZWMsIDB4NGY5YWE4ODMsIDB4OTU2ZTY1ZTYsIDB4ZmZlNjdlYWEsIDB4YmNjZjA4MjEsIDB4MTVlOGU2ZWYsCisgICAgMHhlNzliZDliYSwgMHg2ZjM2Y2U0YSwgMHg5ZjA5ZDRlYSwgMHhiMDdjZDYyOSwgMHhhNGIyYWYzMSwgMHgzZjIzMzEyYSwKKyAgICAweGE1OTQzMGM2LCAweGEyNjZjMDM1LCAweDRlYmMzNzc0LCAweDgyY2FhNmZjLCAweDkwZDBiMGUwLCAweGE3ZDgxNTMzLAorICAgIDB4MDQ5ODRhZjEsIDB4ZWNkYWY3NDEsIDB4Y2Q1MDBlN2YsIDB4OTFmNjJmMTcsIDB4NGRkNjhkNzYsIDB4ZWZiMDRkNDMsCisgICAgMHhhYTRkNTRjYywgMHg5NjA0ZGZlNCwgMHhkMWI1ZTM5ZSwgMHg2YTg4MWI0YywgMHgyYzFmYjhjMSwgMHg2NTUxN2Y0NiwKKyAgICAweDVlZWEwNDlkLCAweDhjMzU1ZDAxLCAweDg3NzQ3M2ZhLCAweDBiNDEyZWZiLCAweDY3MWQ1YWIzLCAweGRiZDI1MjkyLAorICAgIDB4MTA1NjMzZTksIDB4ZDY0NzEzNmQsIDB4ZDc2MThjOWEsIDB4YTEwYzdhMzcsIDB4ZjgxNDhlNTksIDB4MTMzYzg5ZWIsCisgICAgMHhhOTI3ZWVjZSwgMHg2MWM5MzViNywgMHgxY2U1ZWRlMSwgMHg0N2IxM2M3YSwgMHhkMmRmNTk5YywgMHhmMjczM2Y1NSwKKyAgICAweDE0Y2U3OTE4LCAweGM3MzdiZjczLCAweGY3Y2RlYTUzLCAweGZkYWE1YjVmLCAweDNkNmYxNGRmLCAweDQ0ZGI4Njc4LAorICAgIDB4YWZmMzgxY2EsIDB4NjhjNDNlYjksIDB4MjQzNDJjMzgsIDB4YTM0MDVmYzIsIDB4MWRjMzcyMTYsIDB4ZTIyNTBjYmMsCisgICAgMHgzYzQ5OGIyOCwgMHgwZDk1NDFmZiwgMHhhODAxNzEzOSwgMHgwY2IzZGUwOCwgMHhiNGU0OWNkOCwgMHg1NmMxOTA2NCwKICAgICAweGNiODQ2MTdiLCAweDMyYjY3MGQ1LCAweDZjNWM3NDQ4LCAweGI4NTc0MmQwLAogfTsKLSNkZWZpbmUgQUREX1JPVU5EX0tFWV80IChibG9ja1swXV49KmtleXNjaGVkKyssIGJsb2NrWzFdXj0qa2V5c2NoZWQrKywgXAotICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrWzJdXj0qa2V5c2NoZWQrKywgYmxvY2tbM11ePSprZXlzY2hlZCsrKQotI2RlZmluZSBBRERfUk9VTkRfS0VZXzYgKGJsb2NrWzBdXj0qa2V5c2NoZWQrKywgYmxvY2tbMV1ePSprZXlzY2hlZCsrLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tbMl1ePSprZXlzY2hlZCsrLCBibG9ja1szXV49KmtleXNjaGVkKyssIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1s0XV49KmtleXNjaGVkKyssIGJsb2NrWzVdXj0qa2V5c2NoZWQrKykKLSNkZWZpbmUgQUREX1JPVU5EX0tFWV84IChibG9ja1swXV49KmtleXNjaGVkKyssIGJsb2NrWzFdXj0qa2V5c2NoZWQrKywgXAotICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrWzJdXj0qa2V5c2NoZWQrKywgYmxvY2tbM11ePSprZXlzY2hlZCsrLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tbNF1ePSprZXlzY2hlZCsrLCBibG9ja1s1XV49KmtleXNjaGVkKyssIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1s2XV49KmtleXNjaGVkKyssIGJsb2NrWzddXj0qa2V5c2NoZWQrKykKLSNkZWZpbmUgTU9WRVdPUkQoaSkgKCBibG9ja1tpXSA9IG5ld3N0YXRlW2ldICkKKyNkZWZpbmUgQUREX1JPVU5EX0tFWV80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGJsb2NrWzBdIF49ICprZXlzY2hlZCsrLCBibG9ja1sxXSBePSAqa2V5c2NoZWQrKywgYmxvY2tbMl0gXj0gKmtleXNjaGVkKyssIFwKKyAgIGJsb2NrWzNdIF49ICprZXlzY2hlZCsrKQorI2RlZmluZSBBRERfUk9VTkRfS0VZXzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoYmxvY2tbMF0gXj0gKmtleXNjaGVkKyssIGJsb2NrWzFdIF49ICprZXlzY2hlZCsrLCBibG9ja1syXSBePSAqa2V5c2NoZWQrKywgXAorICAgYmxvY2tbM10gXj0gKmtleXNjaGVkKyssIGJsb2NrWzRdIF49ICprZXlzY2hlZCsrLCBibG9ja1s1XSBePSAqa2V5c2NoZWQrKykKKyNkZWZpbmUgQUREX1JPVU5EX0tFWV84ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGJsb2NrWzBdIF49ICprZXlzY2hlZCsrLCBibG9ja1sxXSBePSAqa2V5c2NoZWQrKywgYmxvY2tbMl0gXj0gKmtleXNjaGVkKyssIFwKKyAgIGJsb2NrWzNdIF49ICprZXlzY2hlZCsrLCBibG9ja1s0XSBePSAqa2V5c2NoZWQrKywgYmxvY2tbNV0gXj0gKmtleXNjaGVkKyssIFwKKyAgIGJsb2NrWzZdIF49ICprZXlzY2hlZCsrLCBibG9ja1s3XSBePSAqa2V5c2NoZWQrKykKKyNkZWZpbmUgTU9WRVdPUkQoaSkgKGJsb2NrW2ldID0gbmV3c3RhdGVbaV0pCiAjdW5kZWYgTUFLRVdPUkQKLSNkZWZpbmUgTUFLRVdPUkQoaSkgKCBuZXdzdGF0ZVtpXSA9IChFMFsoYmxvY2tbaV0gPj4gMjQpICYgMHhGRl0gXiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRTFbKGJsb2NrWyhpK0MxKSVOYl0gPj4gMTYpICYgMHhGRl0gXiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRTJbKGJsb2NrWyhpK0MyKSVOYl0gPj4gOCkgJiAweEZGXSBeIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFM1tibG9ja1soaStDMyklTmJdICYgMHhGRl0pICkKLSNkZWZpbmUgTEFTVFdPUkQoaSkgKCBuZXdzdGF0ZVtpXSA9IChTYm94WyhibG9ja1tpXSA+PiAyNCkgJiAweEZGXSA8PCAyNCkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2JveFsoYmxvY2tbKGkrQzEpJU5iXSA+PiAxNikgJiAweEZGXSA8PCAxNikgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2JveFsoYmxvY2tbKGkrQzIpJU5iXSA+PiAgOCkgJiAweEZGXSA8PCAgOCkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2JveFsoYmxvY2tbKGkrQzMpJU5iXSAgICAgICkgJiAweEZGXSAgICAgICkgKQotc3RhdGljIHZvaWQgYWVzX2VuY3J5cHRfbmJfNChBRVNDb250ZXh0ICogY3R4LCB1bnNpZ25lZCBpbnQgKiBibG9jaykKLXsKLSAgICBpbnQgaTsKLSAgICBzdGF0aWMgY29uc3QgaW50IEMxID0gMSwgQzIgPSAyLCBDMyA9IDMsIE5iID0gNDsKLSAgICB1bnNpZ25lZCBpbnQgKmtleXNjaGVkID0gY3R4LT5rZXlzY2hlZDsKLSAgICB1bnNpZ25lZCBpbnQgbmV3c3RhdGVbNF07Ci0gICAgZm9yIChpID0gMDsgaSA8IGN0eC0+TnIgLSAxOyBpKyspIHsKLSAgICAgICAgQUREX1JPVU5EX0tFWV80OwotICAgICAgICBNQUtFV09SRCgwKTsKLSAgICAgICAgTUFLRVdPUkQoMSk7Ci0gICAgICAgIE1BS0VXT1JEKDIpOwotICAgICAgICBNQUtFV09SRCgzKTsKLSAgICAgICAgTU9WRVdPUkQoMCk7Ci0gICAgICAgIE1PVkVXT1JEKDEpOwotICAgICAgICBNT1ZFV09SRCgyKTsKLSAgICAgICAgTU9WRVdPUkQoMyk7Ci0gICAgfQorI2RlZmluZSBNQUtFV09SRChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAobmV3c3RhdGVbaV0gPSAoRTBbKGJsb2NrW2ldID4+IDI0KSAmIDB4RkZdIF4gICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgRTFbKGJsb2NrWyhpICsgQzEpICUgTmJdID4+IDE2KSAmIDB4RkZdIF4gXAorICAgICAgICAgICAgICAgICAgRTJbKGJsb2NrWyhpICsgQzIpICUgTmJdID4+IDgpICYgMHhGRl0gXiAgXAorICAgICAgICAgICAgICAgICAgRTNbYmxvY2tbKGkgKyBDMykgJSBOYl0gJiAweEZGXSkpCisjZGVmaW5lIExBU1RXT1JEKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChuZXdzdGF0ZVtpXSA9IChTYm94WyhibG9ja1tpXSA+PiAyNCkgJiAweEZGXSA8PCAyNCkgfCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIChTYm94WyhibG9ja1soaSArIEMxKSAlIE5iXSA+PiAxNikgJiAweEZGXSA8PCAxNikgfCBcCisgICAgICAgICAgICAgICAgIChTYm94WyhibG9ja1soaSArIEMyKSAlIE5iXSA+PiA4KSAmIDB4RkZdIDw8IDgpIHwgICBcCisgICAgICAgICAgICAgICAgIChTYm94WyhibG9ja1soaSArIEMzKSAlIE5iXSkgJiAweEZGXSkpCitzdGF0aWMgdm9pZCBhZXNfZW5jcnlwdF9uYl80KEFFU0NvbnRleHQqIGN0eCwgdW5zaWduZWQgaW50KiBibG9jaykgeworICBpbnQgaTsKKyAgc3RhdGljIGNvbnN0IGludCBDMSA9IDEsIEMyID0gMiwgQzMgPSAzLCBOYiA9IDQ7CisgIHVuc2lnbmVkIGludCoga2V5c2NoZWQgPSBjdHgtPmtleXNjaGVkOworICB1bnNpZ25lZCBpbnQgbmV3c3RhdGVbNF07CisgIGZvciAoaSA9IDA7IGkgPCBjdHgtPk5yIC0gMTsgaSsrKSB7CiAgICAgQUREX1JPVU5EX0tFWV80OwotICAgIExBU1RXT1JEKDApOwotICAgIExBU1RXT1JEKDEpOwotICAgIExBU1RXT1JEKDIpOwotICAgIExBU1RXT1JEKDMpOworICAgIE1BS0VXT1JEKDApOworICAgIE1BS0VXT1JEKDEpOworICAgIE1BS0VXT1JEKDIpOworICAgIE1BS0VXT1JEKDMpOwogICAgIE1PVkVXT1JEKDApOwogICAgIE1PVkVXT1JEKDEpOwogICAgIE1PVkVXT1JEKDIpOwogICAgIE1PVkVXT1JEKDMpOwotICAgIEFERF9ST1VORF9LRVlfNDsKKyAgfQorICBBRERfUk9VTkRfS0VZXzQ7CisgIExBU1RXT1JEKDApOworICBMQVNUV09SRCgxKTsKKyAgTEFTVFdPUkQoMik7CisgIExBU1RXT1JEKDMpOworICBNT1ZFV09SRCgwKTsKKyAgTU9WRVdPUkQoMSk7CisgIE1PVkVXT1JEKDIpOworICBNT1ZFV09SRCgzKTsKKyAgQUREX1JPVU5EX0tFWV80OwogfQotc3RhdGljIHZvaWQgYWVzX2VuY3J5cHRfbmJfNihBRVNDb250ZXh0ICogY3R4LCB1bnNpZ25lZCBpbnQgKiBibG9jaykKLXsKLSAgICBpbnQgaTsKLSAgICBzdGF0aWMgY29uc3QgaW50IEMxID0gMSwgQzIgPSAyLCBDMyA9IDMsIE5iID0gNjsKLSAgICB1bnNpZ25lZCBpbnQgKmtleXNjaGVkID0gY3R4LT5rZXlzY2hlZDsKLSAgICB1bnNpZ25lZCBpbnQgbmV3c3RhdGVbNl07Ci0gICAgZm9yIChpID0gMDsgaSA8IGN0eC0+TnIgLSAxOyBpKyspIHsKLSAgICAgICAgQUREX1JPVU5EX0tFWV82OwotICAgICAgICBNQUtFV09SRCgwKTsKLSAgICAgICAgTUFLRVdPUkQoMSk7Ci0gICAgICAgIE1BS0VXT1JEKDIpOwotICAgICAgICBNQUtFV09SRCgzKTsKLSAgICAgICAgTUFLRVdPUkQoNCk7Ci0gICAgICAgIE1BS0VXT1JEKDUpOwotICAgICAgICBNT1ZFV09SRCgwKTsKLSAgICAgICAgTU9WRVdPUkQoMSk7Ci0gICAgICAgIE1PVkVXT1JEKDIpOwotICAgICAgICBNT1ZFV09SRCgzKTsKLSAgICAgICAgTU9WRVdPUkQoNCk7Ci0gICAgICAgIE1PVkVXT1JEKDUpOwotICAgIH0KK3N0YXRpYyB2b2lkIGFlc19lbmNyeXB0X25iXzYoQUVTQ29udGV4dCogY3R4LCB1bnNpZ25lZCBpbnQqIGJsb2NrKSB7CisgIGludCBpOworICBzdGF0aWMgY29uc3QgaW50IEMxID0gMSwgQzIgPSAyLCBDMyA9IDMsIE5iID0gNjsKKyAgdW5zaWduZWQgaW50KiBrZXlzY2hlZCA9IGN0eC0+a2V5c2NoZWQ7CisgIHVuc2lnbmVkIGludCBuZXdzdGF0ZVs2XTsKKyAgZm9yIChpID0gMDsgaSA8IGN0eC0+TnIgLSAxOyBpKyspIHsKICAgICBBRERfUk9VTkRfS0VZXzY7Ci0gICAgTEFTVFdPUkQoMCk7Ci0gICAgTEFTVFdPUkQoMSk7Ci0gICAgTEFTVFdPUkQoMik7Ci0gICAgTEFTVFdPUkQoMyk7Ci0gICAgTEFTVFdPUkQoNCk7Ci0gICAgTEFTVFdPUkQoNSk7CisgICAgTUFLRVdPUkQoMCk7CisgICAgTUFLRVdPUkQoMSk7CisgICAgTUFLRVdPUkQoMik7CisgICAgTUFLRVdPUkQoMyk7CisgICAgTUFLRVdPUkQoNCk7CisgICAgTUFLRVdPUkQoNSk7CiAgICAgTU9WRVdPUkQoMCk7CiAgICAgTU9WRVdPUkQoMSk7CiAgICAgTU9WRVdPUkQoMik7CiAgICAgTU9WRVdPUkQoMyk7CiAgICAgTU9WRVdPUkQoNCk7CiAgICAgTU9WRVdPUkQoNSk7Ci0gICAgQUREX1JPVU5EX0tFWV82OworICB9CisgIEFERF9ST1VORF9LRVlfNjsKKyAgTEFTVFdPUkQoMCk7CisgIExBU1RXT1JEKDEpOworICBMQVNUV09SRCgyKTsKKyAgTEFTVFdPUkQoMyk7CisgIExBU1RXT1JEKDQpOworICBMQVNUV09SRCg1KTsKKyAgTU9WRVdPUkQoMCk7CisgIE1PVkVXT1JEKDEpOworICBNT1ZFV09SRCgyKTsKKyAgTU9WRVdPUkQoMyk7CisgIE1PVkVXT1JEKDQpOworICBNT1ZFV09SRCg1KTsKKyAgQUREX1JPVU5EX0tFWV82OwogfQotc3RhdGljIHZvaWQgYWVzX2VuY3J5cHRfbmJfOChBRVNDb250ZXh0ICogY3R4LCB1bnNpZ25lZCBpbnQgKiBibG9jaykKLXsKLSAgICBpbnQgaTsKLSAgICBzdGF0aWMgY29uc3QgaW50IEMxID0gMSwgQzIgPSAzLCBDMyA9IDQsIE5iID0gODsKLSAgICB1bnNpZ25lZCBpbnQgKmtleXNjaGVkID0gY3R4LT5rZXlzY2hlZDsKLSAgICB1bnNpZ25lZCBpbnQgbmV3c3RhdGVbOF07Ci0gICAgZm9yIChpID0gMDsgaSA8IGN0eC0+TnIgLSAxOyBpKyspIHsKLSAgICAgICAgQUREX1JPVU5EX0tFWV84OwotICAgICAgICBNQUtFV09SRCgwKTsKLSAgICAgICAgTUFLRVdPUkQoMSk7Ci0gICAgICAgIE1BS0VXT1JEKDIpOwotICAgICAgICBNQUtFV09SRCgzKTsKLSAgICAgICAgTUFLRVdPUkQoNCk7Ci0gICAgICAgIE1BS0VXT1JEKDUpOwotICAgICAgICBNQUtFV09SRCg2KTsKLSAgICAgICAgTUFLRVdPUkQoNyk7Ci0gICAgICAgIE1PVkVXT1JEKDApOwotICAgICAgICBNT1ZFV09SRCgxKTsKLSAgICAgICAgTU9WRVdPUkQoMik7Ci0gICAgICAgIE1PVkVXT1JEKDMpOwotICAgICAgICBNT1ZFV09SRCg0KTsKLSAgICAgICAgTU9WRVdPUkQoNSk7Ci0gICAgICAgIE1PVkVXT1JEKDYpOwotICAgICAgICBNT1ZFV09SRCg3KTsKLSAgICB9CitzdGF0aWMgdm9pZCBhZXNfZW5jcnlwdF9uYl84KEFFU0NvbnRleHQqIGN0eCwgdW5zaWduZWQgaW50KiBibG9jaykgeworICBpbnQgaTsKKyAgc3RhdGljIGNvbnN0IGludCBDMSA9IDEsIEMyID0gMywgQzMgPSA0LCBOYiA9IDg7CisgIHVuc2lnbmVkIGludCoga2V5c2NoZWQgPSBjdHgtPmtleXNjaGVkOworICB1bnNpZ25lZCBpbnQgbmV3c3RhdGVbOF07CisgIGZvciAoaSA9IDA7IGkgPCBjdHgtPk5yIC0gMTsgaSsrKSB7CiAgICAgQUREX1JPVU5EX0tFWV84OwotICAgIExBU1RXT1JEKDApOwotICAgIExBU1RXT1JEKDEpOwotICAgIExBU1RXT1JEKDIpOwotICAgIExBU1RXT1JEKDMpOwotICAgIExBU1RXT1JEKDQpOwotICAgIExBU1RXT1JEKDUpOwotICAgIExBU1RXT1JEKDYpOwotICAgIExBU1RXT1JEKDcpOworICAgIE1BS0VXT1JEKDApOworICAgIE1BS0VXT1JEKDEpOworICAgIE1BS0VXT1JEKDIpOworICAgIE1BS0VXT1JEKDMpOworICAgIE1BS0VXT1JEKDQpOworICAgIE1BS0VXT1JEKDUpOworICAgIE1BS0VXT1JEKDYpOworICAgIE1BS0VXT1JEKDcpOwogICAgIE1PVkVXT1JEKDApOwogICAgIE1PVkVXT1JEKDEpOwogICAgIE1PVkVXT1JEKDIpOwpAQCAtNzUyLDExNiArNTQ2LDExNSBAQAogICAgIE1PVkVXT1JEKDUpOwogICAgIE1PVkVXT1JEKDYpOwogICAgIE1PVkVXT1JEKDcpOwotICAgIEFERF9ST1VORF9LRVlfODsKKyAgfQorICBBRERfUk9VTkRfS0VZXzg7CisgIExBU1RXT1JEKDApOworICBMQVNUV09SRCgxKTsKKyAgTEFTVFdPUkQoMik7CisgIExBU1RXT1JEKDMpOworICBMQVNUV09SRCg0KTsKKyAgTEFTVFdPUkQoNSk7CisgIExBU1RXT1JEKDYpOworICBMQVNUV09SRCg3KTsKKyAgTU9WRVdPUkQoMCk7CisgIE1PVkVXT1JEKDEpOworICBNT1ZFV09SRCgyKTsKKyAgTU9WRVdPUkQoMyk7CisgIE1PVkVXT1JEKDQpOworICBNT1ZFV09SRCg1KTsKKyAgTU9WRVdPUkQoNik7CisgIE1PVkVXT1JEKDcpOworICBBRERfUk9VTkRfS0VZXzg7CiB9CiAjdW5kZWYgTUFLRVdPUkQKICN1bmRlZiBMQVNUV09SRAotI2RlZmluZSBNQUtFV09SRChpKSAoIG5ld3N0YXRlW2ldID0gKEQwWyhibG9ja1tpXSA+PiAyNCkgJiAweEZGXSBeIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEMVsoYmxvY2tbKGkrQzEpJU5iXSA+PiAxNikgJiAweEZGXSBeIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEMlsoYmxvY2tbKGkrQzIpJU5iXSA+PiA4KSAmIDB4RkZdIF4gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzW2Jsb2NrWyhpK0MzKSVOYl0gJiAweEZGXSkgKQotI2RlZmluZSBMQVNUV09SRChpKSAobmV3c3RhdGVbaV0gPSAoU2JveGludlsoYmxvY2tbaV0gPj4gMjQpICYgMHhGRl0gPDwgMjQpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2JveGludlsoYmxvY2tbKGkrQzEpJU5iXSA+PiAxNikgJiAweEZGXSA8PCAxNikgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTYm94aW52WyhibG9ja1soaStDMiklTmJdID4+ICA4KSAmIDB4RkZdIDw8ICA4KSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNib3hpbnZbKGJsb2NrWyhpK0MzKSVOYl0gICAgICApICYgMHhGRl0gICAgICApICkKLXN0YXRpYyB2b2lkIGFlc19kZWNyeXB0X25iXzQoQUVTQ29udGV4dCAqIGN0eCwgdW5zaWduZWQgaW50ICogYmxvY2spCi17Ci0gICAgaW50IGk7Ci0gICAgc3RhdGljIGNvbnN0IGludCBDMSA9IDQgLSAxLCBDMiA9IDQgLSAyLCBDMyA9IDQgLSAzLCBOYiA9IDQ7Ci0gICAgdW5zaWduZWQgaW50ICprZXlzY2hlZCA9IGN0eC0+aW52a2V5c2NoZWQ7Ci0gICAgdW5zaWduZWQgaW50IG5ld3N0YXRlWzRdOwotICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPk5yIC0gMTsgaSsrKSB7Ci0gICAgICAgIEFERF9ST1VORF9LRVlfNDsKLSAgICAgICAgTUFLRVdPUkQoMCk7Ci0gICAgICAgIE1BS0VXT1JEKDEpOwotICAgICAgICBNQUtFV09SRCgyKTsKLSAgICAgICAgTUFLRVdPUkQoMyk7Ci0gICAgICAgIE1PVkVXT1JEKDApOwotICAgICAgICBNT1ZFV09SRCgxKTsKLSAgICAgICAgTU9WRVdPUkQoMik7Ci0gICAgICAgIE1PVkVXT1JEKDMpOwotICAgIH0KKyNkZWZpbmUgTUFLRVdPUkQoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKG5ld3N0YXRlW2ldID0gKEQwWyhibG9ja1tpXSA+PiAyNCkgJiAweEZGXSBeICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIEQxWyhibG9ja1soaSArIEMxKSAlIE5iXSA+PiAxNikgJiAweEZGXSBeIFwKKyAgICAgICAgICAgICAgICAgIEQyWyhibG9ja1soaSArIEMyKSAlIE5iXSA+PiA4KSAmIDB4RkZdIF4gIFwKKyAgICAgICAgICAgICAgICAgIEQzW2Jsb2NrWyhpICsgQzMpICUgTmJdICYgMHhGRl0pKQorI2RlZmluZSBMQVNUV09SRChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAobmV3c3RhdGVbaV0gPSAoU2JveGludlsoYmxvY2tbaV0gPj4gMjQpICYgMHhGRl0gPDwgMjQpIHwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAoU2JveGludlsoYmxvY2tbKGkgKyBDMSkgJSBOYl0gPj4gMTYpICYgMHhGRl0gPDwgMTYpIHwgXAorICAgICAgICAgICAgICAgICAoU2JveGludlsoYmxvY2tbKGkgKyBDMikgJSBOYl0gPj4gOCkgJiAweEZGXSA8PCA4KSB8ICAgXAorICAgICAgICAgICAgICAgICAoU2JveGludlsoYmxvY2tbKGkgKyBDMykgJSBOYl0pICYgMHhGRl0pKQorc3RhdGljIHZvaWQgYWVzX2RlY3J5cHRfbmJfNChBRVNDb250ZXh0KiBjdHgsIHVuc2lnbmVkIGludCogYmxvY2spIHsKKyAgaW50IGk7CisgIHN0YXRpYyBjb25zdCBpbnQgQzEgPSA0IC0gMSwgQzIgPSA0IC0gMiwgQzMgPSA0IC0gMywgTmIgPSA0OworICB1bnNpZ25lZCBpbnQqIGtleXNjaGVkID0gY3R4LT5pbnZrZXlzY2hlZDsKKyAgdW5zaWduZWQgaW50IG5ld3N0YXRlWzRdOworICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5OciAtIDE7IGkrKykgewogICAgIEFERF9ST1VORF9LRVlfNDsKLSAgICBMQVNUV09SRCgwKTsKLSAgICBMQVNUV09SRCgxKTsKLSAgICBMQVNUV09SRCgyKTsKLSAgICBMQVNUV09SRCgzKTsKKyAgICBNQUtFV09SRCgwKTsKKyAgICBNQUtFV09SRCgxKTsKKyAgICBNQUtFV09SRCgyKTsKKyAgICBNQUtFV09SRCgzKTsKICAgICBNT1ZFV09SRCgwKTsKICAgICBNT1ZFV09SRCgxKTsKICAgICBNT1ZFV09SRCgyKTsKICAgICBNT1ZFV09SRCgzKTsKLSAgICBBRERfUk9VTkRfS0VZXzQ7CisgIH0KKyAgQUREX1JPVU5EX0tFWV80OworICBMQVNUV09SRCgwKTsKKyAgTEFTVFdPUkQoMSk7CisgIExBU1RXT1JEKDIpOworICBMQVNUV09SRCgzKTsKKyAgTU9WRVdPUkQoMCk7CisgIE1PVkVXT1JEKDEpOworICBNT1ZFV09SRCgyKTsKKyAgTU9WRVdPUkQoMyk7CisgIEFERF9ST1VORF9LRVlfNDsKIH0KLXN0YXRpYyB2b2lkIGFlc19kZWNyeXB0X25iXzYoQUVTQ29udGV4dCAqIGN0eCwgdW5zaWduZWQgaW50ICogYmxvY2spCi17Ci0gICAgaW50IGk7Ci0gICAgc3RhdGljIGNvbnN0IGludCBDMSA9IDYgLSAxLCBDMiA9IDYgLSAyLCBDMyA9IDYgLSAzLCBOYiA9IDY7Ci0gICAgdW5zaWduZWQgaW50ICprZXlzY2hlZCA9IGN0eC0+aW52a2V5c2NoZWQ7Ci0gICAgdW5zaWduZWQgaW50IG5ld3N0YXRlWzZdOwotICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPk5yIC0gMTsgaSsrKSB7Ci0gICAgICAgIEFERF9ST1VORF9LRVlfNjsKLSAgICAgICAgTUFLRVdPUkQoMCk7Ci0gICAgICAgIE1BS0VXT1JEKDEpOwotICAgICAgICBNQUtFV09SRCgyKTsKLSAgICAgICAgTUFLRVdPUkQoMyk7Ci0gICAgICAgIE1BS0VXT1JEKDQpOwotICAgICAgICBNQUtFV09SRCg1KTsKLSAgICAgICAgTU9WRVdPUkQoMCk7Ci0gICAgICAgIE1PVkVXT1JEKDEpOwotICAgICAgICBNT1ZFV09SRCgyKTsKLSAgICAgICAgTU9WRVdPUkQoMyk7Ci0gICAgICAgIE1PVkVXT1JEKDQpOwotICAgICAgICBNT1ZFV09SRCg1KTsKLSAgICB9CitzdGF0aWMgdm9pZCBhZXNfZGVjcnlwdF9uYl82KEFFU0NvbnRleHQqIGN0eCwgdW5zaWduZWQgaW50KiBibG9jaykgeworICBpbnQgaTsKKyAgc3RhdGljIGNvbnN0IGludCBDMSA9IDYgLSAxLCBDMiA9IDYgLSAyLCBDMyA9IDYgLSAzLCBOYiA9IDY7CisgIHVuc2lnbmVkIGludCoga2V5c2NoZWQgPSBjdHgtPmludmtleXNjaGVkOworICB1bnNpZ25lZCBpbnQgbmV3c3RhdGVbNl07CisgIGZvciAoaSA9IDA7IGkgPCBjdHgtPk5yIC0gMTsgaSsrKSB7CiAgICAgQUREX1JPVU5EX0tFWV82OwotICAgIExBU1RXT1JEKDApOwotICAgIExBU1RXT1JEKDEpOwotICAgIExBU1RXT1JEKDIpOwotICAgIExBU1RXT1JEKDMpOwotICAgIExBU1RXT1JEKDQpOwotICAgIExBU1RXT1JEKDUpOworICAgIE1BS0VXT1JEKDApOworICAgIE1BS0VXT1JEKDEpOworICAgIE1BS0VXT1JEKDIpOworICAgIE1BS0VXT1JEKDMpOworICAgIE1BS0VXT1JEKDQpOworICAgIE1BS0VXT1JEKDUpOwogICAgIE1PVkVXT1JEKDApOwogICAgIE1PVkVXT1JEKDEpOwogICAgIE1PVkVXT1JEKDIpOwogICAgIE1PVkVXT1JEKDMpOwogICAgIE1PVkVXT1JEKDQpOwogICAgIE1PVkVXT1JEKDUpOwotICAgIEFERF9ST1VORF9LRVlfNjsKKyAgfQorICBBRERfUk9VTkRfS0VZXzY7CisgIExBU1RXT1JEKDApOworICBMQVNUV09SRCgxKTsKKyAgTEFTVFdPUkQoMik7CisgIExBU1RXT1JEKDMpOworICBMQVNUV09SRCg0KTsKKyAgTEFTVFdPUkQoNSk7CisgIE1PVkVXT1JEKDApOworICBNT1ZFV09SRCgxKTsKKyAgTU9WRVdPUkQoMik7CisgIE1PVkVXT1JEKDMpOworICBNT1ZFV09SRCg0KTsKKyAgTU9WRVdPUkQoNSk7CisgIEFERF9ST1VORF9LRVlfNjsKIH0KLXN0YXRpYyB2b2lkIGFlc19kZWNyeXB0X25iXzgoQUVTQ29udGV4dCAqIGN0eCwgdW5zaWduZWQgaW50ICogYmxvY2spCi17Ci0gICAgaW50IGk7Ci0gICAgc3RhdGljIGNvbnN0IGludCBDMSA9IDggLSAxLCBDMiA9IDggLSAzLCBDMyA9IDggLSA0LCBOYiA9IDg7Ci0gICAgdW5zaWduZWQgaW50ICprZXlzY2hlZCA9IGN0eC0+aW52a2V5c2NoZWQ7Ci0gICAgdW5zaWduZWQgaW50IG5ld3N0YXRlWzhdOwotICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPk5yIC0gMTsgaSsrKSB7Ci0gICAgICAgIEFERF9ST1VORF9LRVlfODsKLSAgICAgICAgTUFLRVdPUkQoMCk7Ci0gICAgICAgIE1BS0VXT1JEKDEpOwotICAgICAgICBNQUtFV09SRCgyKTsKLSAgICAgICAgTUFLRVdPUkQoMyk7Ci0gICAgICAgIE1BS0VXT1JEKDQpOwotICAgICAgICBNQUtFV09SRCg1KTsKLSAgICAgICAgTUFLRVdPUkQoNik7Ci0gICAgICAgIE1BS0VXT1JEKDcpOwotICAgICAgICBNT1ZFV09SRCgwKTsKLSAgICAgICAgTU9WRVdPUkQoMSk7Ci0gICAgICAgIE1PVkVXT1JEKDIpOwotICAgICAgICBNT1ZFV09SRCgzKTsKLSAgICAgICAgTU9WRVdPUkQoNCk7Ci0gICAgICAgIE1PVkVXT1JEKDUpOwotICAgICAgICBNT1ZFV09SRCg2KTsKLSAgICAgICAgTU9WRVdPUkQoNyk7Ci0gICAgfQorc3RhdGljIHZvaWQgYWVzX2RlY3J5cHRfbmJfOChBRVNDb250ZXh0KiBjdHgsIHVuc2lnbmVkIGludCogYmxvY2spIHsKKyAgaW50IGk7CisgIHN0YXRpYyBjb25zdCBpbnQgQzEgPSA4IC0gMSwgQzIgPSA4IC0gMywgQzMgPSA4IC0gNCwgTmIgPSA4OworICB1bnNpZ25lZCBpbnQqIGtleXNjaGVkID0gY3R4LT5pbnZrZXlzY2hlZDsKKyAgdW5zaWduZWQgaW50IG5ld3N0YXRlWzhdOworICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5OciAtIDE7IGkrKykgewogICAgIEFERF9ST1VORF9LRVlfODsKLSAgICBMQVNUV09SRCgwKTsKLSAgICBMQVNUV09SRCgxKTsKLSAgICBMQVNUV09SRCgyKTsKLSAgICBMQVNUV09SRCgzKTsKLSAgICBMQVNUV09SRCg0KTsKLSAgICBMQVNUV09SRCg1KTsKLSAgICBMQVNUV09SRCg2KTsKLSAgICBMQVNUV09SRCg3KTsKKyAgICBNQUtFV09SRCgwKTsKKyAgICBNQUtFV09SRCgxKTsKKyAgICBNQUtFV09SRCgyKTsKKyAgICBNQUtFV09SRCgzKTsKKyAgICBNQUtFV09SRCg0KTsKKyAgICBNQUtFV09SRCg1KTsKKyAgICBNQUtFV09SRCg2KTsKKyAgICBNQUtFV09SRCg3KTsKICAgICBNT1ZFV09SRCgwKTsKICAgICBNT1ZFV09SRCgxKTsKICAgICBNT1ZFV09SRCgyKTsKQEAgLTg3MCwxNDMgKzY2MywxNzAgQEAKICAgICBNT1ZFV09SRCg1KTsKICAgICBNT1ZFV09SRCg2KTsKICAgICBNT1ZFV09SRCg3KTsKLSAgICBBRERfUk9VTkRfS0VZXzg7CisgIH0KKyAgQUREX1JPVU5EX0tFWV84OworICBMQVNUV09SRCgwKTsKKyAgTEFTVFdPUkQoMSk7CisgIExBU1RXT1JEKDIpOworICBMQVNUV09SRCgzKTsKKyAgTEFTVFdPUkQoNCk7CisgIExBU1RXT1JEKDUpOworICBMQVNUV09SRCg2KTsKKyAgTEFTVFdPUkQoNyk7CisgIE1PVkVXT1JEKDApOworICBNT1ZFV09SRCgxKTsKKyAgTU9WRVdPUkQoMik7CisgIE1PVkVXT1JEKDMpOworICBNT1ZFV09SRCg0KTsKKyAgTU9WRVdPUkQoNSk7CisgIE1PVkVXT1JEKDYpOworICBNT1ZFV09SRCg3KTsKKyAgQUREX1JPVU5EX0tFWV84OwogfQogI3VuZGVmIE1BS0VXT1JECiAjdW5kZWYgTEFTVFdPUkQKLXN0YXRpYyB2b2lkIGFlc19zZXR1cChBRVNDb250ZXh0ICogY3R4LCBpbnQgYmxvY2tsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuKQotewotICAgIGludCBpLCBqLCBOaywgcmNvbnN0OwotICAgIEFTU0VSVChibG9ja2xlbiA9PSAxNiB8fCBibG9ja2xlbiA9PSAyNCB8fCBibG9ja2xlbiA9PSAzMik7Ci0gICAgQVNTRVJUKGtleWxlbiA9PSAxNiB8fCBrZXlsZW4gPT0gMjQgfHwga2V5bGVuID09IDMyKTsKLSAgICBOayA9IGtleWxlbiAvIDQ7Ci0gICAgY3R4LT5OYiA9IGJsb2NrbGVuIC8gNDsKLSAgICBjdHgtPk5yID0gNiArIChjdHgtPk5iID4gTmsgPyBjdHgtPk5iIDogTmspOwotICAgIGlmIChjdHgtPk5iID09IDgpIHsKLSAgICAgICAgY3R4LT5lbmNyeXB0ID0gYWVzX2VuY3J5cHRfbmJfOCwgY3R4LT5kZWNyeXB0ID0gYWVzX2RlY3J5cHRfbmJfODsKLSAgICB9IGVsc2UgaWYgKGN0eC0+TmIgPT0gNikgewotICAgICAgICBjdHgtPmVuY3J5cHQgPSBhZXNfZW5jcnlwdF9uYl82LCBjdHgtPmRlY3J5cHQgPSBhZXNfZGVjcnlwdF9uYl82OwotICAgIH0gZWxzZSBpZiAoY3R4LT5OYiA9PSA0KSB7Ci0gICAgICAgIGN0eC0+ZW5jcnlwdCA9IGFlc19lbmNyeXB0X25iXzQsIGN0eC0+ZGVjcnlwdCA9IGFlc19kZWNyeXB0X25iXzQ7CitzdGF0aWMgdm9pZCBhZXNfc2V0dXAoQUVTQ29udGV4dCogY3R4LAorICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgaW50IGtleWxlbikgeworICBpbnQgaSwgaiwgTmssIHJjb25zdDsKKyAgQVNTRVJUKGJsb2NrbGVuID09IDE2IHx8IGJsb2NrbGVuID09IDI0IHx8IGJsb2NrbGVuID09IDMyKTsKKyAgQVNTRVJUKGtleWxlbiA9PSAxNiB8fCBrZXlsZW4gPT0gMjQgfHwga2V5bGVuID09IDMyKTsKKyAgTmsgPSBrZXlsZW4gLyA0OworICBjdHgtPk5iID0gYmxvY2tsZW4gLyA0OworICBjdHgtPk5yID0gNiArIChjdHgtPk5iID4gTmsgPyBjdHgtPk5iIDogTmspOworICBpZiAoY3R4LT5OYiA9PSA4KSB7CisgICAgY3R4LT5lbmNyeXB0ID0gYWVzX2VuY3J5cHRfbmJfOCwgY3R4LT5kZWNyeXB0ID0gYWVzX2RlY3J5cHRfbmJfODsKKyAgfSBlbHNlIGlmIChjdHgtPk5iID09IDYpIHsKKyAgICBjdHgtPmVuY3J5cHQgPSBhZXNfZW5jcnlwdF9uYl82LCBjdHgtPmRlY3J5cHQgPSBhZXNfZGVjcnlwdF9uYl82OworICB9IGVsc2UgaWYgKGN0eC0+TmIgPT0gNCkgeworICAgIGN0eC0+ZW5jcnlwdCA9IGFlc19lbmNyeXB0X25iXzQsIGN0eC0+ZGVjcnlwdCA9IGFlc19kZWNyeXB0X25iXzQ7CisgIH0KKyAgcmNvbnN0ID0gMTsKKyAgZm9yIChpID0gMDsgaSA8IChjdHgtPk5yICsgMSkgKiBjdHgtPk5iOyBpKyspIHsKKyAgICBpZiAoaSA8IE5rKSB7CisgICAgICBjdHgtPmtleXNjaGVkW2ldID0gR0VUXzMyQklUX01TQl9GSVJTVChrZXkgKyA0ICogaSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHVuc2lnbmVkIGludCB0ZW1wID0gY3R4LT5rZXlzY2hlZFtpIC0gMV07CisgICAgICBpZiAoaSAlIE5rID09IDApIHsKKyAgICAgICAgaW50IGEsIGIsIGMsIGQ7CisgICAgICAgIGEgPSAodGVtcCA+PiAxNikgJiAweEZGOworICAgICAgICBiID0gKHRlbXAgPj4gOCkgJiAweEZGOworICAgICAgICBjID0gKHRlbXAgPj4gMCkgJiAweEZGOworICAgICAgICBkID0gKHRlbXAgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgdGVtcCA9IFNib3hbYV0gXiByY29uc3Q7CisgICAgICAgIHRlbXAgPSAodGVtcCA8PCA4KSB8IFNib3hbYl07CisgICAgICAgIHRlbXAgPSAodGVtcCA8PCA4KSB8IFNib3hbY107CisgICAgICAgIHRlbXAgPSAodGVtcCA8PCA4KSB8IFNib3hbZF07CisgICAgICAgIHJjb25zdCA9IG11bGJ5MihyY29uc3QpOworICAgICAgfSBlbHNlIGlmIChpICUgTmsgPT0gNCAmJiBOayA+IDYpIHsKKyAgICAgICAgaW50IGEsIGIsIGMsIGQ7CisgICAgICAgIGEgPSAodGVtcCA+PiAyNCkgJiAweEZGOworICAgICAgICBiID0gKHRlbXAgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgYyA9ICh0ZW1wID4+IDgpICYgMHhGRjsKKyAgICAgICAgZCA9ICh0ZW1wID4+IDApICYgMHhGRjsKKyAgICAgICAgdGVtcCA9IFNib3hbYV07CisgICAgICAgIHRlbXAgPSAodGVtcCA8PCA4KSB8IFNib3hbYl07CisgICAgICAgIHRlbXAgPSAodGVtcCA8PCA4KSB8IFNib3hbY107CisgICAgICAgIHRlbXAgPSAodGVtcCA8PCA4KSB8IFNib3hbZF07CisgICAgICB9CisgICAgICBjdHgtPmtleXNjaGVkW2ldID0gY3R4LT5rZXlzY2hlZFtpIC0gTmtdIF4gdGVtcDsKICAgICB9Ci0gICAgcmNvbnN0ID0gMTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgKGN0eC0+TnIgKyAxKSAqIGN0eC0+TmI7IGkrKykgewotICAgICAgICBpZiAoaSA8IE5rKSB7Ci0gICAgICAgICAgICBjdHgtPmtleXNjaGVkW2ldID0gR0VUXzMyQklUX01TQl9GSVJTVChrZXkgKyA0ICogaSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGVtcCA9IGN0eC0+a2V5c2NoZWRbaSAtIDFdOwotICAgICAgICAgICAgaWYgKGkgJSBOayA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IGEsIGIsIGMsIGQ7Ci0gICAgICAgICAgICAgICAgYSA9ICh0ZW1wID4+IDE2KSAmIDB4RkY7Ci0gICAgICAgICAgICAgICAgYiA9ICh0ZW1wID4+IDgpICYgMHhGRjsKLSAgICAgICAgICAgICAgICBjID0gKHRlbXAgPj4gMCkgJiAweEZGOwotICAgICAgICAgICAgICAgIGQgPSAodGVtcCA+PiAyNCkgJiAweEZGOwotICAgICAgICAgICAgICAgIHRlbXAgPSBTYm94W2FdIF4gcmNvbnN0OwotICAgICAgICAgICAgICAgIHRlbXAgPSAodGVtcCA8PCA4KSB8IFNib3hbYl07Ci0gICAgICAgICAgICAgICAgdGVtcCA9ICh0ZW1wIDw8IDgpIHwgU2JveFtjXTsKLSAgICAgICAgICAgICAgICB0ZW1wID0gKHRlbXAgPDwgOCkgfCBTYm94W2RdOwotICAgICAgICAgICAgICAgIHJjb25zdCA9IG11bGJ5MihyY29uc3QpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpICUgTmsgPT0gNCAmJiBOayA+IDYpIHsKLSAgICAgICAgICAgICAgICBpbnQgYSwgYiwgYywgZDsKLSAgICAgICAgICAgICAgICBhID0gKHRlbXAgPj4gMjQpICYgMHhGRjsKLSAgICAgICAgICAgICAgICBiID0gKHRlbXAgPj4gMTYpICYgMHhGRjsKLSAgICAgICAgICAgICAgICBjID0gKHRlbXAgPj4gOCkgJiAweEZGOwotICAgICAgICAgICAgICAgIGQgPSAodGVtcCA+PiAwKSAmIDB4RkY7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IFNib3hbYV07Ci0gICAgICAgICAgICAgICAgdGVtcCA9ICh0ZW1wIDw8IDgpIHwgU2JveFtiXTsKLSAgICAgICAgICAgICAgICB0ZW1wID0gKHRlbXAgPDwgOCkgfCBTYm94W2NdOwotICAgICAgICAgICAgICAgIHRlbXAgPSAodGVtcCA8PCA4KSB8IFNib3hbZF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjdHgtPmtleXNjaGVkW2ldID0gY3R4LT5rZXlzY2hlZFtpIC0gTmtdIF4gdGVtcDsKLSAgICAgICAgfQorICB9CisgIGZvciAoaSA9IDA7IGkgPD0gY3R4LT5OcjsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IGN0eC0+TmI7IGorKykgeworICAgICAgdW5zaWduZWQgaW50IHRlbXA7CisgICAgICB0ZW1wID0gY3R4LT5rZXlzY2hlZFsoY3R4LT5OciAtIGkpICogY3R4LT5OYiArIGpdOworICAgICAgaWYgKGkgIT0gMCAmJiBpICE9IGN0eC0+TnIpIHsKKyAgICAgICAgaW50IGEsIGIsIGMsIGQ7CisgICAgICAgIGEgPSAodGVtcCA+PiAyNCkgJiAweEZGOworICAgICAgICBiID0gKHRlbXAgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgYyA9ICh0ZW1wID4+IDgpICYgMHhGRjsKKyAgICAgICAgZCA9ICh0ZW1wID4+IDApICYgMHhGRjsKKyAgICAgICAgdGVtcCA9IEQwW1Nib3hbYV1dOworICAgICAgICB0ZW1wIF49IEQxW1Nib3hbYl1dOworICAgICAgICB0ZW1wIF49IEQyW1Nib3hbY11dOworICAgICAgICB0ZW1wIF49IEQzW1Nib3hbZF1dOworICAgICAgfQorICAgICAgY3R4LT5pbnZrZXlzY2hlZFtpICogY3R4LT5OYiArIGpdID0gdGVtcDsKICAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8PSBjdHgtPk5yOyBpKyspIHsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IGN0eC0+TmI7IGorKykgewotICAgICAgICAgICAgdW5zaWduZWQgaW50IHRlbXA7Ci0gICAgICAgICAgICB0ZW1wID0gY3R4LT5rZXlzY2hlZFsoY3R4LT5OciAtIGkpICogY3R4LT5OYiArIGpdOwotICAgICAgICAgICAgaWYgKGkgIT0gMCAmJiBpICE9IGN0eC0+TnIpIHsKLSAgICAgICAgICAgICAgICBpbnQgYSwgYiwgYywgZDsKLSAgICAgICAgICAgICAgICBhID0gKHRlbXAgPj4gMjQpICYgMHhGRjsKLSAgICAgICAgICAgICAgICBiID0gKHRlbXAgPj4gMTYpICYgMHhGRjsKLSAgICAgICAgICAgICAgICBjID0gKHRlbXAgPj4gOCkgJiAweEZGOwotICAgICAgICAgICAgICAgIGQgPSAodGVtcCA+PiAwKSAmIDB4RkY7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IEQwW1Nib3hbYV1dOwotICAgICAgICAgICAgICAgIHRlbXAgXj0gRDFbU2JveFtiXV07Ci0gICAgICAgICAgICAgICAgdGVtcCBePSBEMltTYm94W2NdXTsKLSAgICAgICAgICAgICAgICB0ZW1wIF49IEQzW1Nib3hbZF1dOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY3R4LT5pbnZrZXlzY2hlZFtpICogY3R4LT5OYiArIGpdID0gdGVtcDsKLSAgICAgICAgfQorICB9Cit9CitzdGF0aWMgdm9pZCBhZXNfZGVjcnlwdChBRVNDb250ZXh0KiBjdHgsIHVuc2lnbmVkIGludCogYmxvY2spIHsKKyAgY3R4LT5kZWNyeXB0KGN0eCwgYmxvY2spOworfQorc3RhdGljIHZvaWQgYWVzX2RlY3J5cHRfY2JjKHVuc2lnbmVkIGNoYXIqIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTQ29udGV4dCogY3R4KSB7CisgIHVuc2lnbmVkIGludCBpdls0XSwgeFs0XSwgY3RbNF07CisgIGludCBpOworICBBU1NFUlQoKGxlbiAmIDE1KSA9PSAwKTsKKyAgRlhTWVNfbWVtY3B5KGl2LCBjdHgtPml2LCBzaXplb2YoaXYpKTsKKyAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICB4W2ldID0gY3RbaV0gPSBHRVRfMzJCSVRfTVNCX0ZJUlNUKHNyYyArIDQgKiBpKTsKICAgICB9Ci19Ci1zdGF0aWMgdm9pZCBhZXNfZGVjcnlwdChBRVNDb250ZXh0ICogY3R4LCB1bnNpZ25lZCBpbnQgKiBibG9jaykKLXsKLSAgICBjdHgtPmRlY3J5cHQoY3R4LCBibG9jayk7Ci19Ci1zdGF0aWMgdm9pZCBhZXNfZGVjcnlwdF9jYmModW5zaWduZWQgY2hhciAqZGVzdCwgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCBpbnQgbGVuLCBBRVNDb250ZXh0ICogY3R4KQotewotICAgIHVuc2lnbmVkIGludCBpdls0XSwgeFs0XSwgY3RbNF07Ci0gICAgaW50IGk7Ci0gICAgQVNTRVJUKChsZW4gJiAxNSkgPT0gMCk7Ci0gICAgRlhTWVNfbWVtY3B5MzIoaXYsIGN0eC0+aXYsIHNpemVvZihpdikpOwotICAgIHdoaWxlIChsZW4gPiAwKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgICAgIHhbaV0gPSBjdFtpXSA9IEdFVF8zMkJJVF9NU0JfRklSU1Qoc3JjICsgNCAqIGkpOwotICAgICAgICB9Ci0gICAgICAgIGFlc19kZWNyeXB0KGN0eCwgeCk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgICAgIFBVVF8zMkJJVF9NU0JfRklSU1QoZGVzdCArIDQgKiBpLCBpdltpXSBeIHhbaV0pOwotICAgICAgICAgICAgaXZbaV0gPSBjdFtpXTsKLSAgICAgICAgfQotICAgICAgICBkZXN0ICs9IDE2OwotICAgICAgICBzcmMgKz0gMTY7Ci0gICAgICAgIGxlbiAtPSAxNjsKKyAgICBhZXNfZGVjcnlwdChjdHgsIHgpOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgIFBVVF8zMkJJVF9NU0JfRklSU1QoZGVzdCArIDQgKiBpLCBpdltpXSBeIHhbaV0pOworICAgICAgaXZbaV0gPSBjdFtpXTsKICAgICB9Ci0gICAgRlhTWVNfbWVtY3B5MzIoY3R4LT5pdiwgaXYsIHNpemVvZihpdikpOworICAgIGRlc3QgKz0gMTY7CisgICAgc3JjICs9IDE2OworICAgIGxlbiAtPSAxNjsKKyAgfQorICBGWFNZU19tZW1jcHkoY3R4LT5pdiwgaXYsIHNpemVvZihpdikpOwogfQotc3RhdGljIHZvaWQgYWVzX2VuY3J5cHQoQUVTQ29udGV4dCAqIGN0eCwgdW5zaWduZWQgaW50ICogYmxvY2spCi17Ci0gICAgY3R4LT5lbmNyeXB0KGN0eCwgYmxvY2spOworc3RhdGljIHZvaWQgYWVzX2VuY3J5cHQoQUVTQ29udGV4dCogY3R4LCB1bnNpZ25lZCBpbnQqIGJsb2NrKSB7CisgIGN0eC0+ZW5jcnlwdChjdHgsIGJsb2NrKTsKIH0KLXN0YXRpYyB2b2lkIGFlc19lbmNyeXB0X2NiYyh1bnNpZ25lZCBjaGFyICpkZXN0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIGludCBsZW4sIEFFU0NvbnRleHQgKiBjdHgpCi17Ci0gICAgdW5zaWduZWQgaW50IGl2WzRdOwotICAgIGludCBpOwotICAgIEFTU0VSVCgobGVuICYgMTUpID09IDApOwotICAgIEZYU1lTX21lbWNweTMyKGl2LCBjdHgtPml2LCBzaXplb2YoaXYpKTsKLSAgICB3aGlsZSAobGVuID4gMCkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgICAgICBpdltpXSBePSBHRVRfMzJCSVRfTVNCX0ZJUlNUKHNyYyArIDQgKiBpKTsKLSAgICAgICAgfQotICAgICAgICBhZXNfZW5jcnlwdChjdHgsIGl2KTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgUFVUXzMyQklUX01TQl9GSVJTVChkZXN0ICsgNCAqIGksIGl2W2ldKTsKLSAgICAgICAgfQotICAgICAgICBkZXN0ICs9IDE2OwotICAgICAgICBzcmMgKz0gMTY7Ci0gICAgICAgIGxlbiAtPSAxNjsKK3N0YXRpYyB2b2lkIGFlc19lbmNyeXB0X2NiYyh1bnNpZ25lZCBjaGFyKiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU0NvbnRleHQqIGN0eCkgeworICB1bnNpZ25lZCBpbnQgaXZbNF07CisgIGludCBpOworICBBU1NFUlQoKGxlbiAmIDE1KSA9PSAwKTsKKyAgRlhTWVNfbWVtY3B5KGl2LCBjdHgtPml2LCBzaXplb2YoaXYpKTsKKyAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICBpdltpXSBePSBHRVRfMzJCSVRfTVNCX0ZJUlNUKHNyYyArIDQgKiBpKTsKICAgICB9Ci0gICAgRlhTWVNfbWVtY3B5MzIoY3R4LT5pdiwgaXYsIHNpemVvZihpdikpOwotfQotdm9pZCBDUllQVF9BRVNTZXRLZXkoRlhfTFBWT0lEIGNvbnRleHQsIEZYX0RXT1JEIGJsb2NrbGVuLCBGWF9MUENCWVRFIGtleSwgRlhfRFdPUkQga2V5bGVuLCBGWF9CT09MIGJFbmNyeXB0KQotewotICAgIGFlc19zZXR1cCgoQUVTQ29udGV4dCopY29udGV4dCwgYmxvY2tsZW4sIGtleSwga2V5bGVuKTsKLX0KLXZvaWQgQ1JZUFRfQUVTU2V0SVYoRlhfTFBWT0lEIGNvbnRleHQsIEZYX0xQQ0JZVEUgaXYpCi17Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8ICgoQUVTQ29udGV4dCopY29udGV4dCktPk5iOyBpKyspIHsKLSAgICAgICAgKChBRVNDb250ZXh0Kiljb250ZXh0KS0+aXZbaV0gPSBHRVRfMzJCSVRfTVNCX0ZJUlNUKGl2ICsgNCAqIGkpOworICAgIGFlc19lbmNyeXB0KGN0eCwgaXYpOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgIFBVVF8zMkJJVF9NU0JfRklSU1QoZGVzdCArIDQgKiBpLCBpdltpXSk7CiAgICAgfQorICAgIGRlc3QgKz0gMTY7CisgICAgc3JjICs9IDE2OworICAgIGxlbiAtPSAxNjsKKyAgfQorICBGWFNZU19tZW1jcHkoY3R4LT5pdiwgaXYsIHNpemVvZihpdikpOwogfQotdm9pZCBDUllQVF9BRVNEZWNyeXB0KEZYX0xQVk9JRCBjb250ZXh0LCBGWF9MUEJZVEUgZGVzdCwgRlhfTFBDQllURSBzcmMsIEZYX0RXT1JEIGxlbikKLXsKLSAgICBhZXNfZGVjcnlwdF9jYmMoZGVzdCwgc3JjLCBsZW4sIChBRVNDb250ZXh0Kiljb250ZXh0KTsKK3ZvaWQgQ1JZUFRfQUVTU2V0S2V5KHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBibG9ja2xlbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGtleSwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGtleWxlbiwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkVuY3J5cHQpIHsKKyAgYWVzX3NldHVwKChBRVNDb250ZXh0Kiljb250ZXh0LCBibG9ja2xlbiwga2V5LCBrZXlsZW4pOwogfQotdm9pZCBDUllQVF9BRVNFbmNyeXB0KEZYX0xQVk9JRCBjb250ZXh0LCBGWF9MUEJZVEUgZGVzdCwgRlhfTFBDQllURSBzcmMsIEZYX0RXT1JEIGxlbikKLXsKLSAgICBhZXNfZW5jcnlwdF9jYmMoZGVzdCwgc3JjLCBsZW4sIChBRVNDb250ZXh0Kiljb250ZXh0KTsKK3ZvaWQgQ1JZUFRfQUVTU2V0SVYodm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogaXYpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCAoKEFFU0NvbnRleHQqKWNvbnRleHQpLT5OYjsgaSsrKSB7CisgICAgKChBRVNDb250ZXh0Kiljb250ZXh0KS0+aXZbaV0gPSBHRVRfMzJCSVRfTVNCX0ZJUlNUKGl2ICsgNCAqIGkpOworICB9Cit9Cit2b2lkIENSWVBUX0FFU0RlY3J5cHQodm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBsZW4pIHsKKyAgYWVzX2RlY3J5cHRfY2JjKGRlc3QsIHNyYywgbGVuLCAoQUVTQ29udGV4dCopY29udGV4dCk7Cit9Cit2b2lkIENSWVBUX0FFU0VuY3J5cHQodm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBsZW4pIHsKKyAgYWVzX2VuY3J5cHRfY2JjKGRlc3QsIHNyYywgbGVuLCAoQUVTQ29udGV4dCopY29udGV4dCk7CiB9CiAjaWZkZWYgX19jcGx1c3BsdXMKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mZHJtL2NyeXB0by9meF9jcnlwdF9zaGEuY3BwIGIvY29yZS9zcmMvZmRybS9jcnlwdG8vZnhfY3J5cHRfc2hhLmNwcAppbmRleCA0ZTkzMWIyLi5jN2QxNzEwIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mZHJtL2NyeXB0by9meF9jcnlwdF9zaGEuY3BwCisrKyBiL2NvcmUvc3JjL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0X3NoYS5jcHAKQEAgLTEsNzQxICsxLDY1NiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZmRybS9meF9jcnlwdC5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mZHJtL2Z4X2NyeXB0LmgiCisKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIHR5cGVkZWYgc3RydWN0IHsKLSAgICB1bnNpZ25lZCBpbnQgaFs1XTsKLSAgICB1bnNpZ25lZCBjaGFyIGJsb2NrWzY0XTsKLSAgICBpbnQgYmxrdXNlZDsKLSAgICB1bnNpZ25lZCBpbnQgbGVuaGksIGxlbmxvOworICB1bnNpZ25lZCBpbnQgaFs1XTsKKyAgdW5zaWduZWQgY2hhciBibG9ja1s2NF07CisgIGludCBibGt1c2VkOworICB1bnNpZ25lZCBpbnQgbGVuaGksIGxlbmxvOwogfSBTSEFfU3RhdGU7Ci0jZGVmaW5lIHJvbCh4LHkpICggKCh4KSA8PCAoeSkpIHwgKCgodW5zaWduZWQgaW50KXgpID4+ICgzMi15KSkgKQotc3RhdGljIHZvaWQgU0hBX0NvcmVfSW5pdCh1bnNpZ25lZCBpbnQgaFs1XSkKLXsKLSAgICBoWzBdID0gMHg2NzQ1MjMwMTsKLSAgICBoWzFdID0gMHhlZmNkYWI4OTsKLSAgICBoWzJdID0gMHg5OGJhZGNmZTsKLSAgICBoWzNdID0gMHgxMDMyNTQ3NjsKLSAgICBoWzRdID0gMHhjM2QyZTFmMDsKKyNkZWZpbmUgcm9sKHgsIHkpICgoKHgpIDw8ICh5KSkgfCAoKCh1bnNpZ25lZCBpbnQpeCkgPj4gKDMyIC0geSkpKQorc3RhdGljIHZvaWQgU0hBX0NvcmVfSW5pdCh1bnNpZ25lZCBpbnQgaFs1XSkgeworICBoWzBdID0gMHg2NzQ1MjMwMTsKKyAgaFsxXSA9IDB4ZWZjZGFiODk7CisgIGhbMl0gPSAweDk4YmFkY2ZlOworICBoWzNdID0gMHgxMDMyNTQ3NjsKKyAgaFs0XSA9IDB4YzNkMmUxZjA7CiB9Ci1zdGF0aWMgdm9pZCBTSEFUcmFuc2Zvcm0odW5zaWduZWQgaW50ICogZGlnZXN0LCB1bnNpZ25lZCBpbnQgKiBibG9jaykKLXsKLSAgICB1bnNpZ25lZCBpbnQgd1s4MF07Ci0gICAgdW5zaWduZWQgaW50IGEsIGIsIGMsIGQsIGU7Ci0gICAgaW50IHQ7Ci0gICAgZm9yICh0ID0gMDsgdCA8IDE2OyB0KyspIHsKLSAgICAgICAgd1t0XSA9IGJsb2NrW3RdOwotICAgIH0KLSAgICBmb3IgKHQgPSAxNjsgdCA8IDgwOyB0KyspIHsKLSAgICAgICAgdW5zaWduZWQgaW50IHRtcCA9IHdbdCAtIDNdIF4gd1t0IC0gOF0gXiB3W3QgLSAxNF0gXiB3W3QgLSAxNl07Ci0gICAgICAgIHdbdF0gPSByb2wodG1wLCAxKTsKLSAgICB9Ci0gICAgYSA9IGRpZ2VzdFswXTsKLSAgICBiID0gZGlnZXN0WzFdOwotICAgIGMgPSBkaWdlc3RbMl07Ci0gICAgZCA9IGRpZ2VzdFszXTsKLSAgICBlID0gZGlnZXN0WzRdOwotICAgIGZvciAodCA9IDA7IHQgPCAyMDsgdCsrKSB7Ci0gICAgICAgIHVuc2lnbmVkIGludCB0bXAgPQotICAgICAgICAgICAgcm9sKGEsIDUpICsgKChiICYgYykgfCAoZCAmIH5iKSkgKyBlICsgd1t0XSArIDB4NWE4Mjc5OTk7Ci0gICAgICAgIGUgPSBkOwotICAgICAgICBkID0gYzsKLSAgICAgICAgYyA9IHJvbChiLCAzMCk7Ci0gICAgICAgIGIgPSBhOwotICAgICAgICBhID0gdG1wOwotICAgIH0KLSAgICBmb3IgKHQgPSAyMDsgdCA8IDQwOyB0KyspIHsKLSAgICAgICAgdW5zaWduZWQgaW50IHRtcCA9IHJvbChhLCA1KSArIChiIF4gYyBeIGQpICsgZSArIHdbdF0gKyAweDZlZDllYmExOwotICAgICAgICBlID0gZDsKLSAgICAgICAgZCA9IGM7Ci0gICAgICAgIGMgPSByb2woYiwgMzApOwotICAgICAgICBiID0gYTsKLSAgICAgICAgYSA9IHRtcDsKLSAgICB9Ci0gICAgZm9yICh0ID0gNDA7IHQgPCA2MDsgdCsrKSB7Ci0gICAgICAgIHVuc2lnbmVkIGludCB0bXAgPSByb2woYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1KSArICgoYiAmIGMpIHwgKGIgJiBkKSB8IChjICYgZCkpICsgZSArIHdbdF0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ZjFiYmNkYzsKLSAgICAgICAgZSA9IGQ7Ci0gICAgICAgIGQgPSBjOwotICAgICAgICBjID0gcm9sKGIsIDMwKTsKLSAgICAgICAgYiA9IGE7Ci0gICAgICAgIGEgPSB0bXA7Ci0gICAgfQotICAgIGZvciAodCA9IDYwOyB0IDwgODA7IHQrKykgewotICAgICAgICB1bnNpZ25lZCBpbnQgdG1wID0gcm9sKGEsIDUpICsgKGIgXiBjIF4gZCkgKyBlICsgd1t0XSArIDB4Y2E2MmMxZDY7Ci0gICAgICAgIGUgPSBkOwotICAgICAgICBkID0gYzsKLSAgICAgICAgYyA9IHJvbChiLCAzMCk7Ci0gICAgICAgIGIgPSBhOwotICAgICAgICBhID0gdG1wOwotICAgIH0KLSAgICBkaWdlc3RbMF0gKz0gYTsKLSAgICBkaWdlc3RbMV0gKz0gYjsKLSAgICBkaWdlc3RbMl0gKz0gYzsKLSAgICBkaWdlc3RbM10gKz0gZDsKLSAgICBkaWdlc3RbNF0gKz0gZTsKK3N0YXRpYyB2b2lkIFNIQVRyYW5zZm9ybSh1bnNpZ25lZCBpbnQqIGRpZ2VzdCwgdW5zaWduZWQgaW50KiBibG9jaykgeworICB1bnNpZ25lZCBpbnQgd1s4MF07CisgIHVuc2lnbmVkIGludCBhLCBiLCBjLCBkLCBlOworICBpbnQgdDsKKyAgZm9yICh0ID0gMDsgdCA8IDE2OyB0KyspIHsKKyAgICB3W3RdID0gYmxvY2tbdF07CisgIH0KKyAgZm9yICh0ID0gMTY7IHQgPCA4MDsgdCsrKSB7CisgICAgdW5zaWduZWQgaW50IHRtcCA9IHdbdCAtIDNdIF4gd1t0IC0gOF0gXiB3W3QgLSAxNF0gXiB3W3QgLSAxNl07CisgICAgd1t0XSA9IHJvbCh0bXAsIDEpOworICB9CisgIGEgPSBkaWdlc3RbMF07CisgIGIgPSBkaWdlc3RbMV07CisgIGMgPSBkaWdlc3RbMl07CisgIGQgPSBkaWdlc3RbM107CisgIGUgPSBkaWdlc3RbNF07CisgIGZvciAodCA9IDA7IHQgPCAyMDsgdCsrKSB7CisgICAgdW5zaWduZWQgaW50IHRtcCA9IHJvbChhLCA1KSArICgoYiAmIGMpIHwgKGQgJiB+YikpICsgZSArIHdbdF0gKyAweDVhODI3OTk5OworICAgIGUgPSBkOworICAgIGQgPSBjOworICAgIGMgPSByb2woYiwgMzApOworICAgIGIgPSBhOworICAgIGEgPSB0bXA7CisgIH0KKyAgZm9yICh0ID0gMjA7IHQgPCA0MDsgdCsrKSB7CisgICAgdW5zaWduZWQgaW50IHRtcCA9IHJvbChhLCA1KSArIChiIF4gYyBeIGQpICsgZSArIHdbdF0gKyAweDZlZDllYmExOworICAgIGUgPSBkOworICAgIGQgPSBjOworICAgIGMgPSByb2woYiwgMzApOworICAgIGIgPSBhOworICAgIGEgPSB0bXA7CisgIH0KKyAgZm9yICh0ID0gNDA7IHQgPCA2MDsgdCsrKSB7CisgICAgdW5zaWduZWQgaW50IHRtcCA9CisgICAgICAgIHJvbChhLCA1KSArICgoYiAmIGMpIHwgKGIgJiBkKSB8IChjICYgZCkpICsgZSArIHdbdF0gKyAweDhmMWJiY2RjOworICAgIGUgPSBkOworICAgIGQgPSBjOworICAgIGMgPSByb2woYiwgMzApOworICAgIGIgPSBhOworICAgIGEgPSB0bXA7CisgIH0KKyAgZm9yICh0ID0gNjA7IHQgPCA4MDsgdCsrKSB7CisgICAgdW5zaWduZWQgaW50IHRtcCA9IHJvbChhLCA1KSArIChiIF4gYyBeIGQpICsgZSArIHdbdF0gKyAweGNhNjJjMWQ2OworICAgIGUgPSBkOworICAgIGQgPSBjOworICAgIGMgPSByb2woYiwgMzApOworICAgIGIgPSBhOworICAgIGEgPSB0bXA7CisgIH0KKyAgZGlnZXN0WzBdICs9IGE7CisgIGRpZ2VzdFsxXSArPSBiOworICBkaWdlc3RbMl0gKz0gYzsKKyAgZGlnZXN0WzNdICs9IGQ7CisgIGRpZ2VzdFs0XSArPSBlOwogfQotdm9pZCBDUllQVF9TSEExU3RhcnQoRlhfTFBWT0lEIGNvbnRleHQpCi17Ci0gICAgU0hBX1N0YXRlICogcyA9IChTSEFfU3RhdGUqKWNvbnRleHQ7Ci0gICAgU0hBX0NvcmVfSW5pdChzLT5oKTsKLSAgICBzLT5ibGt1c2VkID0gMDsKLSAgICBzLT5sZW5oaSA9IHMtPmxlbmxvID0gMDsKK3ZvaWQgQ1JZUFRfU0hBMVN0YXJ0KHZvaWQqIGNvbnRleHQpIHsKKyAgU0hBX1N0YXRlKiBzID0gKFNIQV9TdGF0ZSopY29udGV4dDsKKyAgU0hBX0NvcmVfSW5pdChzLT5oKTsKKyAgcy0+YmxrdXNlZCA9IDA7CisgIHMtPmxlbmhpID0gcy0+bGVubG8gPSAwOwogfQotdm9pZCBDUllQVF9TSEExVXBkYXRlKEZYX0xQVk9JRCBjb250ZXh0LCBGWF9MUENCWVRFIGRhdGEsIEZYX0RXT1JEIHNpemUpCi17Ci0gICAgU0hBX1N0YXRlICogcyA9IChTSEFfU3RhdGUqKWNvbnRleHQ7Ci0gICAgdW5zaWduZWQgY2hhciAqcSA9ICh1bnNpZ25lZCBjaGFyICopZGF0YTsKLSAgICB1bnNpZ25lZCBpbnQgd29yZGJsb2NrWzE2XTsKLSAgICBpbnQgbGVuID0gc2l6ZTsKLSAgICB1bnNpZ25lZCBpbnQgbGVudyA9IGxlbjsKLSAgICBpbnQgaTsKLSAgICBzLT5sZW5sbyArPSBsZW53OwotICAgIHMtPmxlbmhpICs9IChzLT5sZW5sbyA8IGxlbncpOwotICAgIGlmIChzLT5ibGt1c2VkICYmIHMtPmJsa3VzZWQgKyBsZW4gPCA2NCkgewotICAgICAgICBGWFNZU19tZW1jcHkzMihzLT5ibG9jayArIHMtPmJsa3VzZWQsIHEsIGxlbik7Ci0gICAgICAgIHMtPmJsa3VzZWQgKz0gbGVuOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHdoaWxlIChzLT5ibGt1c2VkICsgbGVuID49IDY0KSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkzMihzLT5ibG9jayArIHMtPmJsa3VzZWQsIHEsIDY0IC0gcy0+YmxrdXNlZCk7Ci0gICAgICAgICAgICBxICs9IDY0IC0gcy0+YmxrdXNlZDsKLSAgICAgICAgICAgIGxlbiAtPSA2NCAtIHMtPmJsa3VzZWQ7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgICAgICAgICAgICAgIHdvcmRibG9ja1tpXSA9Ci0gICAgICAgICAgICAgICAgICAgICgoKHVuc2lnbmVkIGludCkgcy0+YmxvY2tbaSAqIDQgKyAwXSkgPDwgMjQpIHwKLSAgICAgICAgICAgICAgICAgICAgKCgodW5zaWduZWQgaW50KSBzLT5ibG9ja1tpICogNCArIDFdKSA8PCAxNikgfAotICAgICAgICAgICAgICAgICAgICAoKCh1bnNpZ25lZCBpbnQpIHMtPmJsb2NrW2kgKiA0ICsgMl0pIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICAgKCgodW5zaWduZWQgaW50KSBzLT5ibG9ja1tpICogNCArIDNdKSA8PCAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNIQVRyYW5zZm9ybShzLT5oLCB3b3JkYmxvY2spOwotICAgICAgICAgICAgcy0+YmxrdXNlZCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgRlhTWVNfbWVtY3B5MzIocy0+YmxvY2ssIHEsIGxlbik7Ci0gICAgICAgIHMtPmJsa3VzZWQgPSBsZW47Cit2b2lkIENSWVBUX1NIQTFVcGRhdGUodm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogZGF0YSwgRlhfRFdPUkQgc2l6ZSkgeworICBTSEFfU3RhdGUqIHMgPSAoU0hBX1N0YXRlKiljb250ZXh0OworICB1bnNpZ25lZCBjaGFyKiBxID0gKHVuc2lnbmVkIGNoYXIqKWRhdGE7CisgIHVuc2lnbmVkIGludCB3b3JkYmxvY2tbMTZdOworICBpbnQgbGVuID0gc2l6ZTsKKyAgdW5zaWduZWQgaW50IGxlbncgPSBsZW47CisgIGludCBpOworICBzLT5sZW5sbyArPSBsZW53OworICBzLT5sZW5oaSArPSAocy0+bGVubG8gPCBsZW53KTsKKyAgaWYgKHMtPmJsa3VzZWQgJiYgcy0+YmxrdXNlZCArIGxlbiA8IDY0KSB7CisgICAgRlhTWVNfbWVtY3B5KHMtPmJsb2NrICsgcy0+YmxrdXNlZCwgcSwgbGVuKTsKKyAgICBzLT5ibGt1c2VkICs9IGxlbjsKKyAgfSBlbHNlIHsKKyAgICB3aGlsZSAocy0+YmxrdXNlZCArIGxlbiA+PSA2NCkgeworICAgICAgRlhTWVNfbWVtY3B5KHMtPmJsb2NrICsgcy0+YmxrdXNlZCwgcSwgNjQgLSBzLT5ibGt1c2VkKTsKKyAgICAgIHEgKz0gNjQgLSBzLT5ibGt1c2VkOworICAgICAgbGVuIC09IDY0IC0gcy0+YmxrdXNlZDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIHdvcmRibG9ja1tpXSA9ICgoKHVuc2lnbmVkIGludClzLT5ibG9ja1tpICogNCArIDBdKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICAgICAgICAoKCh1bnNpZ25lZCBpbnQpcy0+YmxvY2tbaSAqIDQgKyAxXSkgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKCgodW5zaWduZWQgaW50KXMtPmJsb2NrW2kgKiA0ICsgMl0pIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKCgodW5zaWduZWQgaW50KXMtPmJsb2NrW2kgKiA0ICsgM10pIDw8IDApOworICAgICAgfQorICAgICAgU0hBVHJhbnNmb3JtKHMtPmgsIHdvcmRibG9jayk7CisgICAgICBzLT5ibGt1c2VkID0gMDsKICAgICB9CisgICAgRlhTWVNfbWVtY3B5KHMtPmJsb2NrLCBxLCBsZW4pOworICAgIHMtPmJsa3VzZWQgPSBsZW47CisgIH0KIH0KLXZvaWQgQ1JZUFRfU0hBMUZpbmlzaChGWF9MUFZPSUQgY29udGV4dCwgRlhfQllURSBkaWdlc3RbMjBdKQotewotICAgIFNIQV9TdGF0ZSAqIHMgPSAoU0hBX1N0YXRlKiljb250ZXh0OwotICAgIGludCBpOwotICAgIGludCBwYWQ7Ci0gICAgdW5zaWduZWQgY2hhciBjWzY0XTsKLSAgICB1bnNpZ25lZCBpbnQgbGVuaGksIGxlbmxvOwotICAgIGlmIChzLT5ibGt1c2VkID49IDU2KSB7Ci0gICAgICAgIHBhZCA9IDU2ICsgNjQgLSBzLT5ibGt1c2VkOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBhZCA9IDU2IC0gcy0+YmxrdXNlZDsKLSAgICB9Ci0gICAgbGVuaGkgPSAocy0+bGVuaGkgPDwgMykgfCAocy0+bGVubG8gPj4gKDMyIC0gMykpOwotICAgIGxlbmxvID0gKHMtPmxlbmxvIDw8IDMpOwotICAgIEZYU1lTX21lbXNldDMyKGMsIDAsIHBhZCk7Ci0gICAgY1swXSA9IDB4ODA7Ci0gICAgQ1JZUFRfU0hBMVVwZGF0ZShzLCBjLCBwYWQpOwotICAgIGNbMF0gPSAobGVuaGkgPj4gMjQpICYgMHhGRjsKLSAgICBjWzFdID0gKGxlbmhpID4+IDE2KSAmIDB4RkY7Ci0gICAgY1syXSA9IChsZW5oaSA+PiA4KSAmIDB4RkY7Ci0gICAgY1szXSA9IChsZW5oaSA+PiAwKSAmIDB4RkY7Ci0gICAgY1s0XSA9IChsZW5sbyA+PiAyNCkgJiAweEZGOwotICAgIGNbNV0gPSAobGVubG8gPj4gMTYpICYgMHhGRjsKLSAgICBjWzZdID0gKGxlbmxvID4+IDgpICYgMHhGRjsKLSAgICBjWzddID0gKGxlbmxvID4+IDApICYgMHhGRjsKLSAgICBDUllQVF9TSEExVXBkYXRlKHMsIGMsIDgpOwotICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKLSAgICAgICAgZGlnZXN0W2kgKiA0XSA9IChzLT5oW2ldID4+IDI0KSAmIDB4RkY7Ci0gICAgICAgIGRpZ2VzdFtpICogNCArIDFdID0gKHMtPmhbaV0gPj4gMTYpICYgMHhGRjsKLSAgICAgICAgZGlnZXN0W2kgKiA0ICsgMl0gPSAocy0+aFtpXSA+PiA4KSAmIDB4RkY7Ci0gICAgICAgIGRpZ2VzdFtpICogNCArIDNdID0gKHMtPmhbaV0pICYgMHhGRjsKLSAgICB9Cit2b2lkIENSWVBUX1NIQTFGaW5pc2godm9pZCogY29udGV4dCwgdWludDhfdCBkaWdlc3RbMjBdKSB7CisgIFNIQV9TdGF0ZSogcyA9IChTSEFfU3RhdGUqKWNvbnRleHQ7CisgIGludCBpOworICBpbnQgcGFkOworICB1bnNpZ25lZCBjaGFyIGNbNjRdOworICB1bnNpZ25lZCBpbnQgbGVuaGksIGxlbmxvOworICBpZiAocy0+YmxrdXNlZCA+PSA1NikgeworICAgIHBhZCA9IDU2ICsgNjQgLSBzLT5ibGt1c2VkOworICB9IGVsc2UgeworICAgIHBhZCA9IDU2IC0gcy0+YmxrdXNlZDsKKyAgfQorICBsZW5oaSA9IChzLT5sZW5oaSA8PCAzKSB8IChzLT5sZW5sbyA+PiAoMzIgLSAzKSk7CisgIGxlbmxvID0gKHMtPmxlbmxvIDw8IDMpOworICBGWFNZU19tZW1zZXQoYywgMCwgcGFkKTsKKyAgY1swXSA9IDB4ODA7CisgIENSWVBUX1NIQTFVcGRhdGUocywgYywgcGFkKTsKKyAgY1swXSA9IChsZW5oaSA+PiAyNCkgJiAweEZGOworICBjWzFdID0gKGxlbmhpID4+IDE2KSAmIDB4RkY7CisgIGNbMl0gPSAobGVuaGkgPj4gOCkgJiAweEZGOworICBjWzNdID0gKGxlbmhpID4+IDApICYgMHhGRjsKKyAgY1s0XSA9IChsZW5sbyA+PiAyNCkgJiAweEZGOworICBjWzVdID0gKGxlbmxvID4+IDE2KSAmIDB4RkY7CisgIGNbNl0gPSAobGVubG8gPj4gOCkgJiAweEZGOworICBjWzddID0gKGxlbmxvID4+IDApICYgMHhGRjsKKyAgQ1JZUFRfU0hBMVVwZGF0ZShzLCBjLCA4KTsKKyAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworICAgIGRpZ2VzdFtpICogNF0gPSAocy0+aFtpXSA+PiAyNCkgJiAweEZGOworICAgIGRpZ2VzdFtpICogNCArIDFdID0gKHMtPmhbaV0gPj4gMTYpICYgMHhGRjsKKyAgICBkaWdlc3RbaSAqIDQgKyAyXSA9IChzLT5oW2ldID4+IDgpICYgMHhGRjsKKyAgICBkaWdlc3RbaSAqIDQgKyAzXSA9IChzLT5oW2ldKSAmIDB4RkY7CisgIH0KIH0KLXZvaWQgQ1JZUFRfU0hBMUdlbmVyYXRlKEZYX0xQQ0JZVEUgZGF0YSwgRlhfRFdPUkQgc2l6ZSwgRlhfQllURSBkaWdlc3RbMjBdKQotewotICAgIFNIQV9TdGF0ZSBzOwotICAgIENSWVBUX1NIQTFTdGFydCgmcyk7Ci0gICAgQ1JZUFRfU0hBMVVwZGF0ZSgmcywgZGF0YSwgc2l6ZSk7Ci0gICAgQ1JZUFRfU0hBMUZpbmlzaCgmcywgZGlnZXN0KTsKK3ZvaWQgQ1JZUFRfU0hBMUdlbmVyYXRlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkaWdlc3RbMjBdKSB7CisgIFNIQV9TdGF0ZSBzOworICBDUllQVF9TSEExU3RhcnQoJnMpOworICBDUllQVF9TSEExVXBkYXRlKCZzLCBkYXRhLCBzaXplKTsKKyAgQ1JZUFRfU0hBMUZpbmlzaCgmcywgZGlnZXN0KTsKIH0KIHR5cGVkZWYgc3RydWN0IHsKLSAgICBGWF9EV09SRCB0b3RhbFsyXTsKLSAgICBGWF9EV09SRCBzdGF0ZVs4XTsKLSAgICBGWF9CWVRFIGJ1ZmZlcls2NF07CisgIEZYX0RXT1JEIHRvdGFsWzJdOworICBGWF9EV09SRCBzdGF0ZVs4XTsKKyAgdWludDhfdCBidWZmZXJbNjRdOworfSBzaGEyNTZfY29udGV4dDsKKyNkZWZpbmUgR0VUX0ZYX0RXT1JEKG4sIGIsIGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAobikgPSAoKEZYX0RXT1JEKShiKVsoaSldIDw8IDI0KSB8ICgoRlhfRFdPUkQpKGIpWyhpKSArIDFdIDw8IDE2KSB8IFwKKyAgICAgICAgICAoKEZYX0RXT1JEKShiKVsoaSkgKyAyXSA8PCA4KSB8ICgoRlhfRFdPUkQpKGIpWyhpKSArIDNdKTsgICAgIFwKKyAgfQorI2RlZmluZSBQVVRfRlhfRFdPUkQobiwgYiwgaSkgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYilbKGkpXSA9ICh1aW50OF90KSgobikgPj4gMjQpOyAgICAgXAorICAgIChiKVsoaSkgKyAxXSA9ICh1aW50OF90KSgobikgPj4gMTYpOyBcCisgICAgKGIpWyhpKSArIDJdID0gKHVpbnQ4X3QpKChuKSA+PiA4KTsgIFwKKyAgICAoYilbKGkpICsgM10gPSAodWludDhfdCkoKG4pKTsgICAgICAgXAorICB9Cit2b2lkIENSWVBUX1NIQTI1NlN0YXJ0KHZvaWQqIGNvbnRleHQpIHsKKyAgc2hhMjU2X2NvbnRleHQqIGN0eCA9IChzaGEyNTZfY29udGV4dCopY29udGV4dDsKKyAgY3R4LT50b3RhbFswXSA9IDA7CisgIGN0eC0+dG90YWxbMV0gPSAwOworICBjdHgtPnN0YXRlWzBdID0gMHg2QTA5RTY2NzsKKyAgY3R4LT5zdGF0ZVsxXSA9IDB4QkI2N0FFODU7CisgIGN0eC0+c3RhdGVbMl0gPSAweDNDNkVGMzcyOworICBjdHgtPnN0YXRlWzNdID0gMHhBNTRGRjUzQTsKKyAgY3R4LT5zdGF0ZVs0XSA9IDB4NTEwRTUyN0Y7CisgIGN0eC0+c3RhdGVbNV0gPSAweDlCMDU2ODhDOworICBjdHgtPnN0YXRlWzZdID0gMHgxRjgzRDlBQjsKKyAgY3R4LT5zdGF0ZVs3XSA9IDB4NUJFMENEMTk7CiB9Ci1zaGEyNTZfY29udGV4dDsKLSNkZWZpbmUgR0VUX0ZYX0RXT1JEKG4sYixpKSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKG4pID0gKCAoRlhfRFdPUkQpIChiKVsoaSkgICAgXSA8PCAyNCApICAgICAgIFwKLSAgICAgICAgICAgICAgfCAoIChGWF9EV09SRCkgKGIpWyhpKSArIDFdIDw8IDE2ICkgICAgICAgXAotICAgICAgICAgICAgICB8ICggKEZYX0RXT1JEKSAoYilbKGkpICsgMl0gPDwgIDggKSAgICAgICBcCi0gICAgICAgICAgICAgIHwgKCAoRlhfRFdPUkQpIChiKVsoaSkgKyAzXSAgICAgICApOyAgICAgIFwKLSAgICB9Ci0jZGVmaW5lIFBVVF9GWF9EV09SRChuLGIsaSkgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChiKVsoaSkgICAgXSA9IChGWF9CWVRFKSAoIChuKSA+PiAyNCApOyAgICAgICBcCi0gICAgICAgIChiKVsoaSkgKyAxXSA9IChGWF9CWVRFKSAoIChuKSA+PiAxNiApOyAgICAgICBcCi0gICAgICAgIChiKVsoaSkgKyAyXSA9IChGWF9CWVRFKSAoIChuKSA+PiAgOCApOyAgICAgICBcCi0gICAgICAgIChiKVsoaSkgKyAzXSA9IChGWF9CWVRFKSAoIChuKSAgICAgICApOyAgICAgICBcCi0gICAgfQotdm9pZCBDUllQVF9TSEEyNTZTdGFydCggRlhfTFBWT0lEIGNvbnRleHQgKQotewotICAgIHNoYTI1Nl9jb250ZXh0ICpjdHggPSAoc2hhMjU2X2NvbnRleHQgKiljb250ZXh0OwotICAgIGN0eC0+dG90YWxbMF0gPSAwOwotICAgIGN0eC0+dG90YWxbMV0gPSAwOwotICAgIGN0eC0+c3RhdGVbMF0gPSAweDZBMDlFNjY3OwotICAgIGN0eC0+c3RhdGVbMV0gPSAweEJCNjdBRTg1OwotICAgIGN0eC0+c3RhdGVbMl0gPSAweDNDNkVGMzcyOwotICAgIGN0eC0+c3RhdGVbM10gPSAweEE1NEZGNTNBOwotICAgIGN0eC0+c3RhdGVbNF0gPSAweDUxMEU1MjdGOwotICAgIGN0eC0+c3RhdGVbNV0gPSAweDlCMDU2ODhDOwotICAgIGN0eC0+c3RhdGVbNl0gPSAweDFGODNEOUFCOwotICAgIGN0eC0+c3RhdGVbN10gPSAweDVCRTBDRDE5Oworc3RhdGljIHZvaWQgc2hhMjU2X3Byb2Nlc3Moc2hhMjU2X2NvbnRleHQqIGN0eCwgY29uc3QgdWludDhfdCBkYXRhWzY0XSkgeworICBGWF9EV09SRCB0ZW1wMSwgdGVtcDIsIFdbNjRdOworICBGWF9EV09SRCBBLCBCLCBDLCBELCBFLCBGLCBHLCBIOworICBHRVRfRlhfRFdPUkQoV1swXSwgZGF0YSwgMCk7CisgIEdFVF9GWF9EV09SRChXWzFdLCBkYXRhLCA0KTsKKyAgR0VUX0ZYX0RXT1JEKFdbMl0sIGRhdGEsIDgpOworICBHRVRfRlhfRFdPUkQoV1szXSwgZGF0YSwgMTIpOworICBHRVRfRlhfRFdPUkQoV1s0XSwgZGF0YSwgMTYpOworICBHRVRfRlhfRFdPUkQoV1s1XSwgZGF0YSwgMjApOworICBHRVRfRlhfRFdPUkQoV1s2XSwgZGF0YSwgMjQpOworICBHRVRfRlhfRFdPUkQoV1s3XSwgZGF0YSwgMjgpOworICBHRVRfRlhfRFdPUkQoV1s4XSwgZGF0YSwgMzIpOworICBHRVRfRlhfRFdPUkQoV1s5XSwgZGF0YSwgMzYpOworICBHRVRfRlhfRFdPUkQoV1sxMF0sIGRhdGEsIDQwKTsKKyAgR0VUX0ZYX0RXT1JEKFdbMTFdLCBkYXRhLCA0NCk7CisgIEdFVF9GWF9EV09SRChXWzEyXSwgZGF0YSwgNDgpOworICBHRVRfRlhfRFdPUkQoV1sxM10sIGRhdGEsIDUyKTsKKyAgR0VUX0ZYX0RXT1JEKFdbMTRdLCBkYXRhLCA1Nik7CisgIEdFVF9GWF9EV09SRChXWzE1XSwgZGF0YSwgNjApOworI2RlZmluZSBTSFIoeCwgbikgKCh4ICYgMHhGRkZGRkZGRikgPj4gbikKKyNkZWZpbmUgUk9UUih4LCBuKSAoU0hSKHgsIG4pIHwgKHggPDwgKDMyIC0gbikpKQorI2RlZmluZSBTMCh4KSAoUk9UUih4LCA3KSBeIFJPVFIoeCwgMTgpIF4gU0hSKHgsIDMpKQorI2RlZmluZSBTMSh4KSAoUk9UUih4LCAxNykgXiBST1RSKHgsIDE5KSBeIFNIUih4LCAxMCkpCisjZGVmaW5lIFMyKHgpIChST1RSKHgsIDIpIF4gUk9UUih4LCAxMykgXiBST1RSKHgsIDIyKSkKKyNkZWZpbmUgUzMoeCkgKFJPVFIoeCwgNikgXiBST1RSKHgsIDExKSBeIFJPVFIoeCwgMjUpKQorI2RlZmluZSBGMCh4LCB5LCB6KSAoKHggJiB5KSB8ICh6ICYgKHggfCB5KSkpCisjZGVmaW5lIEYxKHgsIHksIHopICh6IF4gKHggJiAoeSBeIHopKSkKKyNkZWZpbmUgUih0KSAoV1t0XSA9IFMxKFdbdCAtIDJdKSArIFdbdCAtIDddICsgUzAoV1t0IC0gMTVdKSArIFdbdCAtIDE2XSkKKyNkZWZpbmUgUChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCB4LCBLKSAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wMSA9IGggKyBTMyhlKSArIEYxKGUsIGYsIGcpICsgSyArIHg7IFwKKyAgICB0ZW1wMiA9IFMyKGEpICsgRjAoYSwgYiwgYyk7ICAgICAgICAgICAgIFwKKyAgICBkICs9IHRlbXAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBoID0gdGVtcDEgKyB0ZW1wMjsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorICBBID0gY3R4LT5zdGF0ZVswXTsKKyAgQiA9IGN0eC0+c3RhdGVbMV07CisgIEMgPSBjdHgtPnN0YXRlWzJdOworICBEID0gY3R4LT5zdGF0ZVszXTsKKyAgRSA9IGN0eC0+c3RhdGVbNF07CisgIEYgPSBjdHgtPnN0YXRlWzVdOworICBHID0gY3R4LT5zdGF0ZVs2XTsKKyAgSCA9IGN0eC0+c3RhdGVbN107CisgIFAoQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgV1swXSwgMHg0MjhBMkY5OCk7CisgIFAoSCwgQSwgQiwgQywgRCwgRSwgRiwgRywgV1sxXSwgMHg3MTM3NDQ5MSk7CisgIFAoRywgSCwgQSwgQiwgQywgRCwgRSwgRiwgV1syXSwgMHhCNUMwRkJDRik7CisgIFAoRiwgRywgSCwgQSwgQiwgQywgRCwgRSwgV1szXSwgMHhFOUI1REJBNSk7CisgIFAoRSwgRiwgRywgSCwgQSwgQiwgQywgRCwgV1s0XSwgMHgzOTU2QzI1Qik7CisgIFAoRCwgRSwgRiwgRywgSCwgQSwgQiwgQywgV1s1XSwgMHg1OUYxMTFGMSk7CisgIFAoQywgRCwgRSwgRiwgRywgSCwgQSwgQiwgV1s2XSwgMHg5MjNGODJBNCk7CisgIFAoQiwgQywgRCwgRSwgRiwgRywgSCwgQSwgV1s3XSwgMHhBQjFDNUVENSk7CisgIFAoQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgV1s4XSwgMHhEODA3QUE5OCk7CisgIFAoSCwgQSwgQiwgQywgRCwgRSwgRiwgRywgV1s5XSwgMHgxMjgzNUIwMSk7CisgIFAoRywgSCwgQSwgQiwgQywgRCwgRSwgRiwgV1sxMF0sIDB4MjQzMTg1QkUpOworICBQKEYsIEcsIEgsIEEsIEIsIEMsIEQsIEUsIFdbMTFdLCAweDU1MEM3REMzKTsKKyAgUChFLCBGLCBHLCBILCBBLCBCLCBDLCBELCBXWzEyXSwgMHg3MkJFNUQ3NCk7CisgIFAoRCwgRSwgRiwgRywgSCwgQSwgQiwgQywgV1sxM10sIDB4ODBERUIxRkUpOworICBQKEMsIEQsIEUsIEYsIEcsIEgsIEEsIEIsIFdbMTRdLCAweDlCREMwNkE3KTsKKyAgUChCLCBDLCBELCBFLCBGLCBHLCBILCBBLCBXWzE1XSwgMHhDMTlCRjE3NCk7CisgIFAoQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgUigxNiksIDB4RTQ5QjY5QzEpOworICBQKEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIFIoMTcpLCAweEVGQkU0Nzg2KTsKKyAgUChHLCBILCBBLCBCLCBDLCBELCBFLCBGLCBSKDE4KSwgMHgwRkMxOURDNik7CisgIFAoRiwgRywgSCwgQSwgQiwgQywgRCwgRSwgUigxOSksIDB4MjQwQ0ExQ0MpOworICBQKEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIFIoMjApLCAweDJERTkyQzZGKTsKKyAgUChELCBFLCBGLCBHLCBILCBBLCBCLCBDLCBSKDIxKSwgMHg0QTc0ODRBQSk7CisgIFAoQywgRCwgRSwgRiwgRywgSCwgQSwgQiwgUigyMiksIDB4NUNCMEE5REMpOworICBQKEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIFIoMjMpLCAweDc2Rjk4OERBKTsKKyAgUChBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBSKDI0KSwgMHg5ODNFNTE1Mik7CisgIFAoSCwgQSwgQiwgQywgRCwgRSwgRiwgRywgUigyNSksIDB4QTgzMUM2NkQpOworICBQKEcsIEgsIEEsIEIsIEMsIEQsIEUsIEYsIFIoMjYpLCAweEIwMDMyN0M4KTsKKyAgUChGLCBHLCBILCBBLCBCLCBDLCBELCBFLCBSKDI3KSwgMHhCRjU5N0ZDNyk7CisgIFAoRSwgRiwgRywgSCwgQSwgQiwgQywgRCwgUigyOCksIDB4QzZFMDBCRjMpOworICBQKEQsIEUsIEYsIEcsIEgsIEEsIEIsIEMsIFIoMjkpLCAweEQ1QTc5MTQ3KTsKKyAgUChDLCBELCBFLCBGLCBHLCBILCBBLCBCLCBSKDMwKSwgMHgwNkNBNjM1MSk7CisgIFAoQiwgQywgRCwgRSwgRiwgRywgSCwgQSwgUigzMSksIDB4MTQyOTI5NjcpOworICBQKEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIFIoMzIpLCAweDI3QjcwQTg1KTsKKyAgUChILCBBLCBCLCBDLCBELCBFLCBGLCBHLCBSKDMzKSwgMHgyRTFCMjEzOCk7CisgIFAoRywgSCwgQSwgQiwgQywgRCwgRSwgRiwgUigzNCksIDB4NEQyQzZERkMpOworICBQKEYsIEcsIEgsIEEsIEIsIEMsIEQsIEUsIFIoMzUpLCAweDUzMzgwRDEzKTsKKyAgUChFLCBGLCBHLCBILCBBLCBCLCBDLCBELCBSKDM2KSwgMHg2NTBBNzM1NCk7CisgIFAoRCwgRSwgRiwgRywgSCwgQSwgQiwgQywgUigzNyksIDB4NzY2QTBBQkIpOworICBQKEMsIEQsIEUsIEYsIEcsIEgsIEEsIEIsIFIoMzgpLCAweDgxQzJDOTJFKTsKKyAgUChCLCBDLCBELCBFLCBGLCBHLCBILCBBLCBSKDM5KSwgMHg5MjcyMkM4NSk7CisgIFAoQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgUig0MCksIDB4QTJCRkU4QTEpOworICBQKEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIFIoNDEpLCAweEE4MUE2NjRCKTsKKyAgUChHLCBILCBBLCBCLCBDLCBELCBFLCBGLCBSKDQyKSwgMHhDMjRCOEI3MCk7CisgIFAoRiwgRywgSCwgQSwgQiwgQywgRCwgRSwgUig0MyksIDB4Qzc2QzUxQTMpOworICBQKEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIFIoNDQpLCAweEQxOTJFODE5KTsKKyAgUChELCBFLCBGLCBHLCBILCBBLCBCLCBDLCBSKDQ1KSwgMHhENjk5MDYyNCk7CisgIFAoQywgRCwgRSwgRiwgRywgSCwgQSwgQiwgUig0NiksIDB4RjQwRTM1ODUpOworICBQKEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIFIoNDcpLCAweDEwNkFBMDcwKTsKKyAgUChBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBSKDQ4KSwgMHgxOUE0QzExNik7CisgIFAoSCwgQSwgQiwgQywgRCwgRSwgRiwgRywgUig0OSksIDB4MUUzNzZDMDgpOworICBQKEcsIEgsIEEsIEIsIEMsIEQsIEUsIEYsIFIoNTApLCAweDI3NDg3NzRDKTsKKyAgUChGLCBHLCBILCBBLCBCLCBDLCBELCBFLCBSKDUxKSwgMHgzNEIwQkNCNSk7CisgIFAoRSwgRiwgRywgSCwgQSwgQiwgQywgRCwgUig1MiksIDB4MzkxQzBDQjMpOworICBQKEQsIEUsIEYsIEcsIEgsIEEsIEIsIEMsIFIoNTMpLCAweDRFRDhBQTRBKTsKKyAgUChDLCBELCBFLCBGLCBHLCBILCBBLCBCLCBSKDU0KSwgMHg1QjlDQ0E0Rik7CisgIFAoQiwgQywgRCwgRSwgRiwgRywgSCwgQSwgUig1NSksIDB4NjgyRTZGRjMpOworICBQKEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIFIoNTYpLCAweDc0OEY4MkVFKTsKKyAgUChILCBBLCBCLCBDLCBELCBFLCBGLCBHLCBSKDU3KSwgMHg3OEE1NjM2Rik7CisgIFAoRywgSCwgQSwgQiwgQywgRCwgRSwgRiwgUig1OCksIDB4ODRDODc4MTQpOworICBQKEYsIEcsIEgsIEEsIEIsIEMsIEQsIEUsIFIoNTkpLCAweDhDQzcwMjA4KTsKKyAgUChFLCBGLCBHLCBILCBBLCBCLCBDLCBELCBSKDYwKSwgMHg5MEJFRkZGQSk7CisgIFAoRCwgRSwgRiwgRywgSCwgQSwgQiwgQywgUig2MSksIDB4QTQ1MDZDRUIpOworICBQKEMsIEQsIEUsIEYsIEcsIEgsIEEsIEIsIFIoNjIpLCAweEJFRjlBM0Y3KTsKKyAgUChCLCBDLCBELCBFLCBGLCBHLCBILCBBLCBSKDYzKSwgMHhDNjcxNzhGMik7CisgIGN0eC0+c3RhdGVbMF0gKz0gQTsKKyAgY3R4LT5zdGF0ZVsxXSArPSBCOworICBjdHgtPnN0YXRlWzJdICs9IEM7CisgIGN0eC0+c3RhdGVbM10gKz0gRDsKKyAgY3R4LT5zdGF0ZVs0XSArPSBFOworICBjdHgtPnN0YXRlWzVdICs9IEY7CisgIGN0eC0+c3RhdGVbNl0gKz0gRzsKKyAgY3R4LT5zdGF0ZVs3XSArPSBIOwogfQotc3RhdGljIHZvaWQgc2hhMjU2X3Byb2Nlc3MoIHNoYTI1Nl9jb250ZXh0ICpjdHgsIGNvbnN0IEZYX0JZVEUgZGF0YVs2NF0gKQotewotICAgIEZYX0RXT1JEIHRlbXAxLCB0ZW1wMiwgV1s2NF07Ci0gICAgRlhfRFdPUkQgQSwgQiwgQywgRCwgRSwgRiwgRywgSDsKLSAgICBHRVRfRlhfRFdPUkQoIFdbMF0sICBkYXRhLCAgMCApOwotICAgIEdFVF9GWF9EV09SRCggV1sxXSwgIGRhdGEsICA0ICk7Ci0gICAgR0VUX0ZYX0RXT1JEKCBXWzJdLCAgZGF0YSwgIDggKTsKLSAgICBHRVRfRlhfRFdPUkQoIFdbM10sICBkYXRhLCAxMiApOwotICAgIEdFVF9GWF9EV09SRCggV1s0XSwgIGRhdGEsIDE2ICk7Ci0gICAgR0VUX0ZYX0RXT1JEKCBXWzVdLCAgZGF0YSwgMjAgKTsKLSAgICBHRVRfRlhfRFdPUkQoIFdbNl0sICBkYXRhLCAyNCApOwotICAgIEdFVF9GWF9EV09SRCggV1s3XSwgIGRhdGEsIDI4ICk7Ci0gICAgR0VUX0ZYX0RXT1JEKCBXWzhdLCAgZGF0YSwgMzIgKTsKLSAgICBHRVRfRlhfRFdPUkQoIFdbOV0sICBkYXRhLCAzNiApOwotICAgIEdFVF9GWF9EV09SRCggV1sxMF0sIGRhdGEsIDQwICk7Ci0gICAgR0VUX0ZYX0RXT1JEKCBXWzExXSwgZGF0YSwgNDQgKTsKLSAgICBHRVRfRlhfRFdPUkQoIFdbMTJdLCBkYXRhLCA0OCApOwotICAgIEdFVF9GWF9EV09SRCggV1sxM10sIGRhdGEsIDUyICk7Ci0gICAgR0VUX0ZYX0RXT1JEKCBXWzE0XSwgZGF0YSwgNTYgKTsKLSAgICBHRVRfRlhfRFdPUkQoIFdbMTVdLCBkYXRhLCA2MCApOwotI2RlZmluZSAgU0hSKHgsbikgKCh4ICYgMHhGRkZGRkZGRikgPj4gbikKLSNkZWZpbmUgUk9UUih4LG4pIChTSFIoeCxuKSB8ICh4IDw8ICgzMiAtIG4pKSkKLSNkZWZpbmUgUzAoeCkgKFJPVFIoeCwgNykgXiBST1RSKHgsMTgpIF4gIFNIUih4LCAzKSkKLSNkZWZpbmUgUzEoeCkgKFJPVFIoeCwxNykgXiBST1RSKHgsMTkpIF4gIFNIUih4LDEwKSkKLSNkZWZpbmUgUzIoeCkgKFJPVFIoeCwgMikgXiBST1RSKHgsMTMpIF4gUk9UUih4LDIyKSkKLSNkZWZpbmUgUzMoeCkgKFJPVFIoeCwgNikgXiBST1RSKHgsMTEpIF4gUk9UUih4LDI1KSkKLSNkZWZpbmUgRjAoeCx5LHopICgoeCAmIHkpIHwgKHogJiAoeCB8IHkpKSkKLSNkZWZpbmUgRjEoeCx5LHopICh6IF4gKHggJiAoeSBeIHopKSkKLSNkZWZpbmUgUih0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBXW3RdID0gUzEoV1t0IC0gIDJdKSArIFdbdCAtICA3XSArICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICBTMChXW3QgLSAxNV0pICsgV1t0IC0gMTZdICAgICAgICAgICAgXAotICAgICkKLSNkZWZpbmUgUChhLGIsYyxkLGUsZixnLGgseCxLKSAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHRlbXAxID0gaCArIFMzKGUpICsgRjEoZSxmLGcpICsgSyArIHg7ICAgICAgXAotICAgICAgICB0ZW1wMiA9IFMyKGEpICsgRjAoYSxiLGMpOyAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZCArPSB0ZW1wMTsgaCA9IHRlbXAxICsgdGVtcDI7ICAgICAgICAgICAgICBcCi0gICAgfQotICAgIEEgPSBjdHgtPnN0YXRlWzBdOwotICAgIEIgPSBjdHgtPnN0YXRlWzFdOwotICAgIEMgPSBjdHgtPnN0YXRlWzJdOwotICAgIEQgPSBjdHgtPnN0YXRlWzNdOwotICAgIEUgPSBjdHgtPnN0YXRlWzRdOwotICAgIEYgPSBjdHgtPnN0YXRlWzVdOwotICAgIEcgPSBjdHgtPnN0YXRlWzZdOwotICAgIEggPSBjdHgtPnN0YXRlWzddOwotICAgIFAoIEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIFdbIDBdLCAweDQyOEEyRjk4ICk7Ci0gICAgUCggSCwgQSwgQiwgQywgRCwgRSwgRiwgRywgV1sgMV0sIDB4NzEzNzQ0OTEgKTsKLSAgICBQKCBHLCBILCBBLCBCLCBDLCBELCBFLCBGLCBXWyAyXSwgMHhCNUMwRkJDRiApOwotICAgIFAoIEYsIEcsIEgsIEEsIEIsIEMsIEQsIEUsIFdbIDNdLCAweEU5QjVEQkE1ICk7Ci0gICAgUCggRSwgRiwgRywgSCwgQSwgQiwgQywgRCwgV1sgNF0sIDB4Mzk1NkMyNUIgKTsKLSAgICBQKCBELCBFLCBGLCBHLCBILCBBLCBCLCBDLCBXWyA1XSwgMHg1OUYxMTFGMSApOwotICAgIFAoIEMsIEQsIEUsIEYsIEcsIEgsIEEsIEIsIFdbIDZdLCAweDkyM0Y4MkE0ICk7Ci0gICAgUCggQiwgQywgRCwgRSwgRiwgRywgSCwgQSwgV1sgN10sIDB4QUIxQzVFRDUgKTsKLSAgICBQKCBBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBXWyA4XSwgMHhEODA3QUE5OCApOwotICAgIFAoIEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIFdbIDldLCAweDEyODM1QjAxICk7Ci0gICAgUCggRywgSCwgQSwgQiwgQywgRCwgRSwgRiwgV1sxMF0sIDB4MjQzMTg1QkUgKTsKLSAgICBQKCBGLCBHLCBILCBBLCBCLCBDLCBELCBFLCBXWzExXSwgMHg1NTBDN0RDMyApOwotICAgIFAoIEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIFdbMTJdLCAweDcyQkU1RDc0ICk7Ci0gICAgUCggRCwgRSwgRiwgRywgSCwgQSwgQiwgQywgV1sxM10sIDB4ODBERUIxRkUgKTsKLSAgICBQKCBDLCBELCBFLCBGLCBHLCBILCBBLCBCLCBXWzE0XSwgMHg5QkRDMDZBNyApOwotICAgIFAoIEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIFdbMTVdLCAweEMxOUJGMTc0ICk7Ci0gICAgUCggQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgUigxNiksIDB4RTQ5QjY5QzEgKTsKLSAgICBQKCBILCBBLCBCLCBDLCBELCBFLCBGLCBHLCBSKDE3KSwgMHhFRkJFNDc4NiApOwotICAgIFAoIEcsIEgsIEEsIEIsIEMsIEQsIEUsIEYsIFIoMTgpLCAweDBGQzE5REM2ICk7Ci0gICAgUCggRiwgRywgSCwgQSwgQiwgQywgRCwgRSwgUigxOSksIDB4MjQwQ0ExQ0MgKTsKLSAgICBQKCBFLCBGLCBHLCBILCBBLCBCLCBDLCBELCBSKDIwKSwgMHgyREU5MkM2RiApOwotICAgIFAoIEQsIEUsIEYsIEcsIEgsIEEsIEIsIEMsIFIoMjEpLCAweDRBNzQ4NEFBICk7Ci0gICAgUCggQywgRCwgRSwgRiwgRywgSCwgQSwgQiwgUigyMiksIDB4NUNCMEE5REMgKTsKLSAgICBQKCBCLCBDLCBELCBFLCBGLCBHLCBILCBBLCBSKDIzKSwgMHg3NkY5ODhEQSApOwotICAgIFAoIEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIFIoMjQpLCAweDk4M0U1MTUyICk7Ci0gICAgUCggSCwgQSwgQiwgQywgRCwgRSwgRiwgRywgUigyNSksIDB4QTgzMUM2NkQgKTsKLSAgICBQKCBHLCBILCBBLCBCLCBDLCBELCBFLCBGLCBSKDI2KSwgMHhCMDAzMjdDOCApOwotICAgIFAoIEYsIEcsIEgsIEEsIEIsIEMsIEQsIEUsIFIoMjcpLCAweEJGNTk3RkM3ICk7Ci0gICAgUCggRSwgRiwgRywgSCwgQSwgQiwgQywgRCwgUigyOCksIDB4QzZFMDBCRjMgKTsKLSAgICBQKCBELCBFLCBGLCBHLCBILCBBLCBCLCBDLCBSKDI5KSwgMHhENUE3OTE0NyApOwotICAgIFAoIEMsIEQsIEUsIEYsIEcsIEgsIEEsIEIsIFIoMzApLCAweDA2Q0E2MzUxICk7Ci0gICAgUCggQiwgQywgRCwgRSwgRiwgRywgSCwgQSwgUigzMSksIDB4MTQyOTI5NjcgKTsKLSAgICBQKCBBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBSKDMyKSwgMHgyN0I3MEE4NSApOwotICAgIFAoIEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIFIoMzMpLCAweDJFMUIyMTM4ICk7Ci0gICAgUCggRywgSCwgQSwgQiwgQywgRCwgRSwgRiwgUigzNCksIDB4NEQyQzZERkMgKTsKLSAgICBQKCBGLCBHLCBILCBBLCBCLCBDLCBELCBFLCBSKDM1KSwgMHg1MzM4MEQxMyApOwotICAgIFAoIEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIFIoMzYpLCAweDY1MEE3MzU0ICk7Ci0gICAgUCggRCwgRSwgRiwgRywgSCwgQSwgQiwgQywgUigzNyksIDB4NzY2QTBBQkIgKTsKLSAgICBQKCBDLCBELCBFLCBGLCBHLCBILCBBLCBCLCBSKDM4KSwgMHg4MUMyQzkyRSApOwotICAgIFAoIEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIFIoMzkpLCAweDkyNzIyQzg1ICk7Ci0gICAgUCggQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgUig0MCksIDB4QTJCRkU4QTEgKTsKLSAgICBQKCBILCBBLCBCLCBDLCBELCBFLCBGLCBHLCBSKDQxKSwgMHhBODFBNjY0QiApOwotICAgIFAoIEcsIEgsIEEsIEIsIEMsIEQsIEUsIEYsIFIoNDIpLCAweEMyNEI4QjcwICk7Ci0gICAgUCggRiwgRywgSCwgQSwgQiwgQywgRCwgRSwgUig0MyksIDB4Qzc2QzUxQTMgKTsKLSAgICBQKCBFLCBGLCBHLCBILCBBLCBCLCBDLCBELCBSKDQ0KSwgMHhEMTkyRTgxOSApOwotICAgIFAoIEQsIEUsIEYsIEcsIEgsIEEsIEIsIEMsIFIoNDUpLCAweEQ2OTkwNjI0ICk7Ci0gICAgUCggQywgRCwgRSwgRiwgRywgSCwgQSwgQiwgUig0NiksIDB4RjQwRTM1ODUgKTsKLSAgICBQKCBCLCBDLCBELCBFLCBGLCBHLCBILCBBLCBSKDQ3KSwgMHgxMDZBQTA3MCApOwotICAgIFAoIEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIFIoNDgpLCAweDE5QTRDMTE2ICk7Ci0gICAgUCggSCwgQSwgQiwgQywgRCwgRSwgRiwgRywgUig0OSksIDB4MUUzNzZDMDggKTsKLSAgICBQKCBHLCBILCBBLCBCLCBDLCBELCBFLCBGLCBSKDUwKSwgMHgyNzQ4Nzc0QyApOwotICAgIFAoIEYsIEcsIEgsIEEsIEIsIEMsIEQsIEUsIFIoNTEpLCAweDM0QjBCQ0I1ICk7Ci0gICAgUCggRSwgRiwgRywgSCwgQSwgQiwgQywgRCwgUig1MiksIDB4MzkxQzBDQjMgKTsKLSAgICBQKCBELCBFLCBGLCBHLCBILCBBLCBCLCBDLCBSKDUzKSwgMHg0RUQ4QUE0QSApOwotICAgIFAoIEMsIEQsIEUsIEYsIEcsIEgsIEEsIEIsIFIoNTQpLCAweDVCOUNDQTRGICk7Ci0gICAgUCggQiwgQywgRCwgRSwgRiwgRywgSCwgQSwgUig1NSksIDB4NjgyRTZGRjMgKTsKLSAgICBQKCBBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBSKDU2KSwgMHg3NDhGODJFRSApOwotICAgIFAoIEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIFIoNTcpLCAweDc4QTU2MzZGICk7Ci0gICAgUCggRywgSCwgQSwgQiwgQywgRCwgRSwgRiwgUig1OCksIDB4ODRDODc4MTQgKTsKLSAgICBQKCBGLCBHLCBILCBBLCBCLCBDLCBELCBFLCBSKDU5KSwgMHg4Q0M3MDIwOCApOwotICAgIFAoIEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIFIoNjApLCAweDkwQkVGRkZBICk7Ci0gICAgUCggRCwgRSwgRiwgRywgSCwgQSwgQiwgQywgUig2MSksIDB4QTQ1MDZDRUIgKTsKLSAgICBQKCBDLCBELCBFLCBGLCBHLCBILCBBLCBCLCBSKDYyKSwgMHhCRUY5QTNGNyApOwotICAgIFAoIEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIFIoNjMpLCAweEM2NzE3OEYyICk7Ci0gICAgY3R4LT5zdGF0ZVswXSArPSBBOwotICAgIGN0eC0+c3RhdGVbMV0gKz0gQjsKLSAgICBjdHgtPnN0YXRlWzJdICs9IEM7Ci0gICAgY3R4LT5zdGF0ZVszXSArPSBEOwotICAgIGN0eC0+c3RhdGVbNF0gKz0gRTsKLSAgICBjdHgtPnN0YXRlWzVdICs9IEY7Ci0gICAgY3R4LT5zdGF0ZVs2XSArPSBHOwotICAgIGN0eC0+c3RhdGVbN10gKz0gSDsKK3ZvaWQgQ1JZUFRfU0hBMjU2VXBkYXRlKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIGlucHV0LCBGWF9EV09SRCBsZW5ndGgpIHsKKyAgc2hhMjU2X2NvbnRleHQqIGN0eCA9IChzaGEyNTZfY29udGV4dCopY29udGV4dDsKKyAgRlhfRFdPUkQgbGVmdCwgZmlsbDsKKyAgaWYgKCFsZW5ndGgpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbGVmdCA9IGN0eC0+dG90YWxbMF0gJiAweDNGOworICBmaWxsID0gNjQgLSBsZWZ0OworICBjdHgtPnRvdGFsWzBdICs9IGxlbmd0aDsKKyAgY3R4LT50b3RhbFswXSAmPSAweEZGRkZGRkZGOworICBpZiAoY3R4LT50b3RhbFswXSA8IGxlbmd0aCkgeworICAgIGN0eC0+dG90YWxbMV0rKzsKKyAgfQorICBpZiAobGVmdCAmJiBsZW5ndGggPj0gZmlsbCkgeworICAgIEZYU1lTX21lbWNweSgodm9pZCopKGN0eC0+YnVmZmVyICsgbGVmdCksICh2b2lkKilpbnB1dCwgZmlsbCk7CisgICAgc2hhMjU2X3Byb2Nlc3MoY3R4LCBjdHgtPmJ1ZmZlcik7CisgICAgbGVuZ3RoIC09IGZpbGw7CisgICAgaW5wdXQgKz0gZmlsbDsKKyAgICBsZWZ0ID0gMDsKKyAgfQorICB3aGlsZSAobGVuZ3RoID49IDY0KSB7CisgICAgc2hhMjU2X3Byb2Nlc3MoY3R4LCBpbnB1dCk7CisgICAgbGVuZ3RoIC09IDY0OworICAgIGlucHV0ICs9IDY0OworICB9CisgIGlmIChsZW5ndGgpIHsKKyAgICBGWFNZU19tZW1jcHkoKHZvaWQqKShjdHgtPmJ1ZmZlciArIGxlZnQpLCAodm9pZCopaW5wdXQsIGxlbmd0aCk7CisgIH0KIH0KLXZvaWQgQ1JZUFRfU0hBMjU2VXBkYXRlKCB2b2lkKiBjb250ZXh0LCBGWF9MUENCWVRFIGlucHV0LCBGWF9EV09SRCBsZW5ndGggKQotewotICAgIHNoYTI1Nl9jb250ZXh0ICpjdHggPSAoc2hhMjU2X2NvbnRleHQgKiljb250ZXh0OwotICAgIEZYX0RXT1JEIGxlZnQsIGZpbGw7Ci0gICAgaWYoICEgbGVuZ3RoICkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxlZnQgPSBjdHgtPnRvdGFsWzBdICYgMHgzRjsKLSAgICBmaWxsID0gNjQgLSBsZWZ0OwotICAgIGN0eC0+dG90YWxbMF0gKz0gbGVuZ3RoOwotICAgIGN0eC0+dG90YWxbMF0gJj0gMHhGRkZGRkZGRjsKLSAgICBpZiggY3R4LT50b3RhbFswXSA8IGxlbmd0aCApIHsKLSAgICAgICAgY3R4LT50b3RhbFsxXSsrOwotICAgIH0KLSAgICBpZiggbGVmdCAmJiBsZW5ndGggPj0gZmlsbCApIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5MzIoICh2b2lkICopIChjdHgtPmJ1ZmZlciArIGxlZnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgaW5wdXQsIGZpbGwgKTsKLSAgICAgICAgc2hhMjU2X3Byb2Nlc3MoIGN0eCwgY3R4LT5idWZmZXIgKTsKLSAgICAgICAgbGVuZ3RoIC09IGZpbGw7Ci0gICAgICAgIGlucHV0ICArPSBmaWxsOwotICAgICAgICBsZWZ0ID0gMDsKLSAgICB9Ci0gICAgd2hpbGUoIGxlbmd0aCA+PSA2NCApIHsKLSAgICAgICAgc2hhMjU2X3Byb2Nlc3MoIGN0eCwgaW5wdXQgKTsKLSAgICAgICAgbGVuZ3RoIC09IDY0OwotICAgICAgICBpbnB1dCAgKz0gNjQ7Ci0gICAgfQotICAgIGlmKCBsZW5ndGggKSB7Ci0gICAgICAgIEZYU1lTX21lbWNweTMyKCAodm9pZCAqKSAoY3R4LT5idWZmZXIgKyBsZWZ0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIGlucHV0LCBsZW5ndGggKTsKLSAgICB9CitzdGF0aWMgY29uc3QgdWludDhfdCBzaGEyNTZfcGFkZGluZ1s2NF0gPSB7CisgICAgMHg4MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9Owordm9pZCBDUllQVF9TSEEyNTZGaW5pc2godm9pZCogY29udGV4dCwgdWludDhfdCBkaWdlc3RbMzJdKSB7CisgIHNoYTI1Nl9jb250ZXh0KiBjdHggPSAoc2hhMjU2X2NvbnRleHQqKWNvbnRleHQ7CisgIEZYX0RXT1JEIGxhc3QsIHBhZG47CisgIEZYX0RXT1JEIGhpZ2gsIGxvdzsKKyAgdWludDhfdCBtc2dsZW5bOF07CisgIGhpZ2ggPSAoY3R4LT50b3RhbFswXSA+PiAyOSkgfCAoY3R4LT50b3RhbFsxXSA8PCAzKTsKKyAgbG93ID0gKGN0eC0+dG90YWxbMF0gPDwgMyk7CisgIFBVVF9GWF9EV09SRChoaWdoLCBtc2dsZW4sIDApOworICBQVVRfRlhfRFdPUkQobG93LCBtc2dsZW4sIDQpOworICBsYXN0ID0gY3R4LT50b3RhbFswXSAmIDB4M0Y7CisgIHBhZG4gPSAobGFzdCA8IDU2KSA/ICg1NiAtIGxhc3QpIDogKDEyMCAtIGxhc3QpOworICBDUllQVF9TSEEyNTZVcGRhdGUoY3R4LCBzaGEyNTZfcGFkZGluZywgcGFkbik7CisgIENSWVBUX1NIQTI1NlVwZGF0ZShjdHgsIG1zZ2xlbiwgOCk7CisgIFBVVF9GWF9EV09SRChjdHgtPnN0YXRlWzBdLCBkaWdlc3QsIDApOworICBQVVRfRlhfRFdPUkQoY3R4LT5zdGF0ZVsxXSwgZGlnZXN0LCA0KTsKKyAgUFVUX0ZYX0RXT1JEKGN0eC0+c3RhdGVbMl0sIGRpZ2VzdCwgOCk7CisgIFBVVF9GWF9EV09SRChjdHgtPnN0YXRlWzNdLCBkaWdlc3QsIDEyKTsKKyAgUFVUX0ZYX0RXT1JEKGN0eC0+c3RhdGVbNF0sIGRpZ2VzdCwgMTYpOworICBQVVRfRlhfRFdPUkQoY3R4LT5zdGF0ZVs1XSwgZGlnZXN0LCAyMCk7CisgIFBVVF9GWF9EV09SRChjdHgtPnN0YXRlWzZdLCBkaWdlc3QsIDI0KTsKKyAgUFVUX0ZYX0RXT1JEKGN0eC0+c3RhdGVbN10sIGRpZ2VzdCwgMjgpOwogfQotc3RhdGljIGNvbnN0IEZYX0JZVEUgc2hhMjU2X3BhZGRpbmdbNjRdID0gewotICAgIDB4ODAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKLX07Ci12b2lkIENSWVBUX1NIQTI1NkZpbmlzaCggRlhfTFBWT0lEIGNvbnRleHQsIEZYX0JZVEUgZGlnZXN0WzMyXSApCi17Ci0gICAgc2hhMjU2X2NvbnRleHQgKmN0eCA9IChzaGEyNTZfY29udGV4dCAqKWNvbnRleHQ7Ci0gICAgRlhfRFdPUkQgbGFzdCwgcGFkbjsKLSAgICBGWF9EV09SRCBoaWdoLCBsb3c7Ci0gICAgRlhfQllURSBtc2dsZW5bOF07Ci0gICAgaGlnaCA9ICggY3R4LT50b3RhbFswXSA+PiAyOSApCi0gICAgICAgICAgIHwgKCBjdHgtPnRvdGFsWzFdIDw8ICAzICk7Ci0gICAgbG93ICA9ICggY3R4LT50b3RhbFswXSA8PCAgMyApOwotICAgIFBVVF9GWF9EV09SRCggaGlnaCwgbXNnbGVuLCAwICk7Ci0gICAgUFVUX0ZYX0RXT1JEKCBsb3csICBtc2dsZW4sIDQgKTsKLSAgICBsYXN0ID0gY3R4LT50b3RhbFswXSAmIDB4M0Y7Ci0gICAgcGFkbiA9ICggbGFzdCA8IDU2ICkgPyAoIDU2IC0gbGFzdCApIDogKCAxMjAgLSBsYXN0ICk7Ci0gICAgQ1JZUFRfU0hBMjU2VXBkYXRlKCBjdHgsIHNoYTI1Nl9wYWRkaW5nLCBwYWRuICk7Ci0gICAgQ1JZUFRfU0hBMjU2VXBkYXRlKCBjdHgsIG1zZ2xlbiwgOCApOwotICAgIFBVVF9GWF9EV09SRCggY3R4LT5zdGF0ZVswXSwgZGlnZXN0LCAgMCApOwotICAgIFBVVF9GWF9EV09SRCggY3R4LT5zdGF0ZVsxXSwgZGlnZXN0LCAgNCApOwotICAgIFBVVF9GWF9EV09SRCggY3R4LT5zdGF0ZVsyXSwgZGlnZXN0LCAgOCApOwotICAgIFBVVF9GWF9EV09SRCggY3R4LT5zdGF0ZVszXSwgZGlnZXN0LCAxMiApOwotICAgIFBVVF9GWF9EV09SRCggY3R4LT5zdGF0ZVs0XSwgZGlnZXN0LCAxNiApOwotICAgIFBVVF9GWF9EV09SRCggY3R4LT5zdGF0ZVs1XSwgZGlnZXN0LCAyMCApOwotICAgIFBVVF9GWF9EV09SRCggY3R4LT5zdGF0ZVs2XSwgZGlnZXN0LCAyNCApOwotICAgIFBVVF9GWF9EV09SRCggY3R4LT5zdGF0ZVs3XSwgZGlnZXN0LCAyOCApOwotfQotdm9pZCBDUllQVF9TSEEyNTZHZW5lcmF0ZShGWF9MUENCWVRFIGRhdGEsIEZYX0RXT1JEIHNpemUsIEZYX0JZVEUgZGlnZXN0WzMyXSkKLXsKLSAgICBzaGEyNTZfY29udGV4dCBjdHg7Ci0gICAgQ1JZUFRfU0hBMjU2U3RhcnQoJmN0eCk7Ci0gICAgQ1JZUFRfU0hBMjU2VXBkYXRlKCZjdHgsIGRhdGEsIHNpemUpOwotICAgIENSWVBUX1NIQTI1NkZpbmlzaCgmY3R4LCBkaWdlc3QpOwordm9pZCBDUllQVF9TSEEyNTZHZW5lcmF0ZShjb25zdCB1aW50OF90KiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRpZ2VzdFszMl0pIHsKKyAgc2hhMjU2X2NvbnRleHQgY3R4OworICBDUllQVF9TSEEyNTZTdGFydCgmY3R4KTsKKyAgQ1JZUFRfU0hBMjU2VXBkYXRlKCZjdHgsIGRhdGEsIHNpemUpOworICBDUllQVF9TSEEyNTZGaW5pc2goJmN0eCwgZGlnZXN0KTsKIH0KIHR5cGVkZWYgc3RydWN0IHsKLSAgICBGWF9VSU5UNjQJdG90YWxbMl07Ci0gICAgRlhfVUlOVDY0CXN0YXRlWzhdOwotICAgIEZYX0JZVEUJCWJ1ZmZlclsxMjhdOworICB1aW50NjRfdCB0b3RhbFsyXTsKKyAgdWludDY0X3Qgc3RhdGVbOF07CisgIHVpbnQ4X3QgYnVmZmVyWzEyOF07CiB9IHNoYTM4NF9jb250ZXh0OwotRlhfVUlOVDY0IEZYX2F0bzY0aShGWF9MUENTVFIgc3RyKQotewotICAgIEZYU1lTX2Fzc2VydChzdHIgIT0gTlVMTCk7Ci0gICAgRlhfVUlOVDY0IHJldCA9IDA7Ci0gICAgaW50IGxlbiA9IChpbnQpRlhTWVNfc3RybGVuKHN0cik7Ci0gICAgbGVuID0gbGVuID4gMTYgPyAxNiA6IGxlbjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7Ci0gICAgICAgIGlmIChpKSB7Ci0gICAgICAgICAgICByZXQgPDw9IDQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0cltpXSA+PSAnMCcgJiYgc3RyW2ldIDw9ICc5JykgewotICAgICAgICAgICAgcmV0IHw9IChzdHJbaV0gLSAnMCcpICYgMHhGRjsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPj0gJ2EnICYmIHN0cltpXSA8PSAnZicpIHsKLSAgICAgICAgICAgIHJldCB8PSAoc3RyW2ldIC0gJ2EnICsgMTApICYgMHhGRjsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJbaV0gPj0gJ0EnICYmIHN0cltpXSA8PSAnRicpIHsKLSAgICAgICAgICAgIHJldCB8PSAoc3RyW2ldIC0gJ0EnICsgMTApICYgMHhGRjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7Ci0gICAgICAgIH0KK3VpbnQ2NF90IEZYX2F0bzY0aShjb25zdCBGWF9DSEFSKiBzdHIpIHsKKyAgRlhTWVNfYXNzZXJ0KHN0cik7CisgIHVpbnQ2NF90IHJldCA9IDA7CisgIGludCBsZW4gPSAoaW50KUZYU1lTX3N0cmxlbihzdHIpOworICBsZW4gPSBsZW4gPiAxNiA/IDE2IDogbGVuOworICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgaWYgKGkpIHsKKyAgICAgIHJldCA8PD0gNDsKICAgICB9Ci0gICAgcmV0dXJuIHJldDsKKyAgICBpZiAoc3RyW2ldID49ICcwJyAmJiBzdHJbaV0gPD0gJzknKSB7CisgICAgICByZXQgfD0gKHN0cltpXSAtICcwJykgJiAweEZGOworICAgIH0gZWxzZSBpZiAoc3RyW2ldID49ICdhJyAmJiBzdHJbaV0gPD0gJ2YnKSB7CisgICAgICByZXQgfD0gKHN0cltpXSAtICdhJyArIDEwKSAmIDB4RkY7CisgICAgfSBlbHNlIGlmIChzdHJbaV0gPj0gJ0EnICYmIHN0cltpXSA8PSAnRicpIHsKKyAgICAgIHJldCB8PSAoc3RyW2ldIC0gJ0EnICsgMTApICYgMHhGRjsKKyAgICB9IGVsc2UgeworICAgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJldDsKIH0KLXZvaWQgQ1JZUFRfU0hBMzg0U3RhcnQoRlhfTFBWT0lEIGNvbnRleHQpCi17Ci0gICAgaWYgKGNvbnRleHQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHNoYTM4NF9jb250ZXh0ICpjdHggPSAoc2hhMzg0X2NvbnRleHQgKiljb250ZXh0OwotICAgIEZYU1lTX21lbXNldDMyKGN0eCwgMCwgc2l6ZW9mKHNoYTM4NF9jb250ZXh0KSk7Ci0gICAgY3R4LT5zdGF0ZVswXSA9IEZYX2F0bzY0aSgiY2JiYjlkNWRjMTA1OWVkOCIpOwotICAgIGN0eC0+c3RhdGVbMV0gPSBGWF9hdG82NGkoIjYyOWEyOTJhMzY3Y2Q1MDciKTsKLSAgICBjdHgtPnN0YXRlWzJdID0gRlhfYXRvNjRpKCI5MTU5MDE1YTMwNzBkZDE3Iik7Ci0gICAgY3R4LT5zdGF0ZVszXSA9IEZYX2F0bzY0aSgiMTUyZmVjZDhmNzBlNTkzOSIpOwotICAgIGN0eC0+c3RhdGVbNF0gPSBGWF9hdG82NGkoIjY3MzMyNjY3ZmZjMDBiMzEiKTsKLSAgICBjdHgtPnN0YXRlWzVdID0gRlhfYXRvNjRpKCI4ZWI0NGE4NzY4NTgxNTExIik7Ci0gICAgY3R4LT5zdGF0ZVs2XSA9IEZYX2F0bzY0aSgiZGIwYzJlMGQ2NGY5OGZhNyIpOwotICAgIGN0eC0+c3RhdGVbN10gPSBGWF9hdG82NGkoIjQ3YjU0ODFkYmVmYTRmYTQiKTsKK3ZvaWQgQ1JZUFRfU0hBMzg0U3RhcnQodm9pZCogY29udGV4dCkgeworICBpZiAoIWNvbnRleHQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgc2hhMzg0X2NvbnRleHQqIGN0eCA9IChzaGEzODRfY29udGV4dCopY29udGV4dDsKKyAgRlhTWVNfbWVtc2V0KGN0eCwgMCwgc2l6ZW9mKHNoYTM4NF9jb250ZXh0KSk7CisgIGN0eC0+c3RhdGVbMF0gPSBGWF9hdG82NGkoImNiYmI5ZDVkYzEwNTllZDgiKTsKKyAgY3R4LT5zdGF0ZVsxXSA9IEZYX2F0bzY0aSgiNjI5YTI5MmEzNjdjZDUwNyIpOworICBjdHgtPnN0YXRlWzJdID0gRlhfYXRvNjRpKCI5MTU5MDE1YTMwNzBkZDE3Iik7CisgIGN0eC0+c3RhdGVbM10gPSBGWF9hdG82NGkoIjE1MmZlY2Q4ZjcwZTU5MzkiKTsKKyAgY3R4LT5zdGF0ZVs0XSA9IEZYX2F0bzY0aSgiNjczMzI2NjdmZmMwMGIzMSIpOworICBjdHgtPnN0YXRlWzVdID0gRlhfYXRvNjRpKCI4ZWI0NGE4NzY4NTgxNTExIik7CisgIGN0eC0+c3RhdGVbNl0gPSBGWF9hdG82NGkoImRiMGMyZTBkNjRmOThmYTciKTsKKyAgY3R4LT5zdGF0ZVs3XSA9IEZYX2F0bzY0aSgiNDdiNTQ4MWRiZWZhNGZhNCIpOwogfQotI2RlZmluZSBTSEEzODRfRjAoeCx5LHopICgoeCAmIHkpIHwgKHogJiAoeCB8IHkpKSkKLSNkZWZpbmUgU0hBMzg0X0YxKHgseSx6KSAoeiBeICh4ICYgKHkgXiB6KSkpCi0jZGVmaW5lIFNIQTM4NF9TSFIoeCxuKSAoeCA+PiBuKQotI2RlZmluZSBTSEEzODRfUk9UUih4LG4pIChTSEEzODRfU0hSKHgsIG4pIHwgeCA8PCAoNjQgLSBuKSkKLSNkZWZpbmUgU0hBMzg0X1MwKHgpIChTSEEzODRfUk9UUih4LCAxKSBeIFNIQTM4NF9ST1RSKHgsIDgpIF4gIFNIQTM4NF9TSFIoeCwgNykpCi0jZGVmaW5lIFNIQTM4NF9TMSh4KSAoU0hBMzg0X1JPVFIoeCwxOSkgXiBTSEEzODRfUk9UUih4LCA2MSkgXiAgU0hBMzg0X1NIUih4LCA2KSkKLSNkZWZpbmUgU0hBMzg0X1MyKHgpIChTSEEzODRfUk9UUih4LCAyOCkgXiBTSEEzODRfUk9UUih4LCAzNCkgXiBTSEEzODRfUk9UUih4LCAzOSkpCi0jZGVmaW5lIFNIQTM4NF9TMyh4KSAoU0hBMzg0X1JPVFIoeCwgMTQpIF4gU0hBMzg0X1JPVFIoeCwxOCkgXiBTSEEzODRfUk9UUih4LCA0MSkpCi0jZGVmaW5lIFNIQTM4NF9QKGEsYixjLGQsZSxmLGcsaCx4LEspCQkJCQkJCVwKLSAgICB7CQkJCQkJCQkJCQkJCQkJCVwKLSAgICAgICAgdGVtcDEgPSBoICsgU0hBMzg0X1MzKGUpICsgU0hBMzg0X0YxKGUsZixnKSArIEsgKyB4OwkJXAotICAgICAgICB0ZW1wMiA9IFNIQTM4NF9TMihhKSArIFNIQTM4NF9GMChhLGIsYyk7CQkJCQlcCi0gICAgICAgIGQgKz0gdGVtcDE7IGggPSB0ZW1wMSArIHRlbXAyOwkJCQkJCQkJXAotICAgIH0KLXN0YXRpYyBjb25zdCBGWF9CWVRFIHNoYTM4NF9wYWRkaW5nWzEyOF0gPSB7Ci0gICAgMHg4MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorI2RlZmluZSBTSEEzODRfRjAoeCwgeSwgeikgKCh4ICYgeSkgfCAoeiAmICh4IHwgeSkpKQorI2RlZmluZSBTSEEzODRfRjEoeCwgeSwgeikgKHogXiAoeCAmICh5IF4geikpKQorI2RlZmluZSBTSEEzODRfU0hSKHgsIG4pICh4ID4+IG4pCisjZGVmaW5lIFNIQTM4NF9ST1RSKHgsIG4pIChTSEEzODRfU0hSKHgsIG4pIHwgeCA8PCAoNjQgLSBuKSkKKyNkZWZpbmUgU0hBMzg0X1MwKHgpIChTSEEzODRfUk9UUih4LCAxKSBeIFNIQTM4NF9ST1RSKHgsIDgpIF4gU0hBMzg0X1NIUih4LCA3KSkKKyNkZWZpbmUgU0hBMzg0X1MxKHgpIFwKKyAgKFNIQTM4NF9ST1RSKHgsIDE5KSBeIFNIQTM4NF9ST1RSKHgsIDYxKSBeIFNIQTM4NF9TSFIoeCwgNikpCisjZGVmaW5lIFNIQTM4NF9TMih4KSBcCisgIChTSEEzODRfUk9UUih4LCAyOCkgXiBTSEEzODRfUk9UUih4LCAzNCkgXiBTSEEzODRfUk9UUih4LCAzOSkpCisjZGVmaW5lIFNIQTM4NF9TMyh4KSBcCisgIChTSEEzODRfUk9UUih4LCAxNCkgXiBTSEEzODRfUk9UUih4LCAxOCkgXiBTSEEzODRfUk9UUih4LCA0MSkpCisjZGVmaW5lIFNIQTM4NF9QKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIHgsIEspICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAxID0gaCArIFNIQTM4NF9TMyhlKSArIFNIQTM4NF9GMShlLCBmLCBnKSArIEsgKyB4OyBcCisgICAgdGVtcDIgPSBTSEEzODRfUzIoYSkgKyBTSEEzODRfRjAoYSwgYiwgYyk7ICAgICAgICAgICAgIFwKKyAgICBkICs9IHRlbXAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGggPSB0ZW1wMSArIHRlbXAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KK3N0YXRpYyBjb25zdCB1aW50OF90IHNoYTM4NF9wYWRkaW5nWzEyOF0gPSB7CisgICAgMHg4MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCiB9OwotI2RlZmluZSBTSEEzODRfUih0KSAoV1t0XSA9IFNIQTM4NF9TMShXW3QgLSAgMl0pICsgV1t0IC0gIDddICsgU0hBMzg0X1MwKFdbdCAtIDE1XSkgKyBXW3QgLSAxNl0pCi1zdGF0aWMgRlhfTFBDU1RSIGNvbnN0YW50c1tdID0gewotICAgICI0MjhhMmY5OGQ3MjhhZTIyIiwKLSAgICAiNzEzNzQ0OTEyM2VmNjVjZCIsCi0gICAgImI1YzBmYmNmZWM0ZDNiMmYiLAotICAgICJlOWI1ZGJhNTgxODlkYmJjIiwKLSAgICAiMzk1NmMyNWJmMzQ4YjUzOCIsCi0gICAgIjU5ZjExMWYxYjYwNWQwMTkiLAotICAgICI5MjNmODJhNGFmMTk0ZjliIiwKLSAgICAiYWIxYzVlZDVkYTZkODExOCIsCi0gICAgImQ4MDdhYTk4YTMwMzAyNDIiLAotICAgICIxMjgzNWIwMTQ1NzA2ZmJlIiwKLSAgICAiMjQzMTg1YmU0ZWU0YjI4YyIsCi0gICAgIjU1MGM3ZGMzZDVmZmI0ZTIiLAotICAgICI3MmJlNWQ3NGYyN2I4OTZmIiwKLSAgICAiODBkZWIxZmUzYjE2OTZiMSIsCi0gICAgIjliZGMwNmE3MjVjNzEyMzUiLAotICAgICJjMTliZjE3NGNmNjkyNjk0IiwKLSAgICAiZTQ5YjY5YzE5ZWYxNGFkMiIsCi0gICAgImVmYmU0Nzg2Mzg0ZjI1ZTMiLAotICAgICIwZmMxOWRjNjhiOGNkNWI1IiwKLSAgICAiMjQwY2ExY2M3N2FjOWM2NSIsCi0gICAgIjJkZTkyYzZmNTkyYjAyNzUiLAotICAgICI0YTc0ODRhYTZlYTZlNDgzIiwKLSAgICAiNWNiMGE5ZGNiZDQxZmJkNCIsCi0gICAgIjc2Zjk4OGRhODMxMTUzYjUiLAotICAgICI5ODNlNTE1MmVlNjZkZmFiIiwKLSAgICAiYTgzMWM2NmQyZGI0MzIxMCIsCi0gICAgImIwMDMyN2M4OThmYjIxM2YiLAotICAgICJiZjU5N2ZjN2JlZWYwZWU0IiwKLSAgICAiYzZlMDBiZjMzZGE4OGZjMiIsCi0gICAgImQ1YTc5MTQ3OTMwYWE3MjUiLAotICAgICIwNmNhNjM1MWUwMDM4MjZmIiwKLSAgICAiMTQyOTI5NjcwYTBlNmU3MCIsCi0gICAgIjI3YjcwYTg1NDZkMjJmZmMiLAotICAgICIyZTFiMjEzODVjMjZjOTI2IiwKLSAgICAiNGQyYzZkZmM1YWM0MmFlZCIsCi0gICAgIjUzMzgwZDEzOWQ5NWIzZGYiLAotICAgICI2NTBhNzM1NDhiYWY2M2RlIiwKLSAgICAiNzY2YTBhYmIzYzc3YjJhOCIsCi0gICAgIjgxYzJjOTJlNDdlZGFlZTYiLAotICAgICI5MjcyMmM4NTE0ODIzNTNiIiwKLSAgICAiYTJiZmU4YTE0Y2YxMDM2NCIsCi0gICAgImE4MWE2NjRiYmM0MjMwMDEiLAotICAgICJjMjRiOGI3MGQwZjg5NzkxIiwKLSAgICAiYzc2YzUxYTMwNjU0YmUzMCIsCi0gICAgImQxOTJlODE5ZDZlZjUyMTgiLAotICAgICJkNjk5MDYyNDU1NjVhOTEwIiwKLSAgICAiZjQwZTM1ODU1NzcxMjAyYSIsCi0gICAgIjEwNmFhMDcwMzJiYmQxYjgiLAotICAgICIxOWE0YzExNmI4ZDJkMGM4IiwKLSAgICAiMWUzNzZjMDg1MTQxYWI1MyIsCi0gICAgIjI3NDg3NzRjZGY4ZWViOTkiLAotICAgICIzNGIwYmNiNWUxOWI0OGE4IiwKLSAgICAiMzkxYzBjYjNjNWM5NWE2MyIsCi0gICAgIjRlZDhhYTRhZTM0MThhY2IiLAotICAgICI1YjljY2E0Zjc3NjNlMzczIiwKLSAgICAiNjgyZTZmZjNkNmIyYjhhMyIsCi0gICAgIjc0OGY4MmVlNWRlZmIyZmMiLAotICAgICI3OGE1NjM2ZjQzMTcyZjYwIiwKLSAgICAiODRjODc4MTRhMWYwYWI3MiIsCi0gICAgIjhjYzcwMjA4MWE2NDM5ZWMiLAotICAgICI5MGJlZmZmYTIzNjMxZTI4IiwKLSAgICAiYTQ1MDZjZWJkZTgyYmRlOSIsCi0gICAgImJlZjlhM2Y3YjJjNjc5MTUiLAotICAgICJjNjcxNzhmMmUzNzI1MzJiIiwKLSAgICAiY2EyNzNlY2VlYTI2NjE5YyIsCi0gICAgImQxODZiOGM3MjFjMGMyMDciLAotICAgICJlYWRhN2RkNmNkZTBlYjFlIiwKLSAgICAiZjU3ZDRmN2ZlZTZlZDE3OCIsCi0gICAgIjA2ZjA2N2FhNzIxNzZmYmEiLAotICAgICIwYTYzN2RjNWEyYzg5OGE2IiwKLSAgICAiMTEzZjk4MDRiZWY5MGRhZSIsCi0gICAgIjFiNzEwYjM1MTMxYzQ3MWIiLAotICAgICIyOGRiNzdmNTIzMDQ3ZDg0IiwKLSAgICAiMzJjYWFiN2I0MGM3MjQ5MyIsCi0gICAgIjNjOWViZTBhMTVjOWJlYmMiLAotICAgICI0MzFkNjdjNDljMTAwZDRjIiwKLSAgICAiNGNjNWQ0YmVjYjNlNDJiNiIsCi0gICAgIjU5N2YyOTljZmM2NTdlMmEiLAotICAgICI1ZmNiNmZhYjNhZDZmYWVjIiwKLSAgICAiNmM0NDE5OGM0YTQ3NTgxNyIsCisjZGVmaW5lIFNIQTM4NF9SKHQpIFwKKyAgKFdbdF0gPSBTSEEzODRfUzEoV1t0IC0gMl0pICsgV1t0IC0gN10gKyBTSEEzODRfUzAoV1t0IC0gMTVdKSArIFdbdCAtIDE2XSkKK3N0YXRpYyBjb25zdCBGWF9DSEFSKiBjb25zdGFudHNbXSA9IHsKKyAgICAiNDI4YTJmOThkNzI4YWUyMiIsICI3MTM3NDQ5MTIzZWY2NWNkIiwgImI1YzBmYmNmZWM0ZDNiMmYiLAorICAgICJlOWI1ZGJhNTgxODlkYmJjIiwgIjM5NTZjMjViZjM0OGI1MzgiLCAiNTlmMTExZjFiNjA1ZDAxOSIsCisgICAgIjkyM2Y4MmE0YWYxOTRmOWIiLCAiYWIxYzVlZDVkYTZkODExOCIsICJkODA3YWE5OGEzMDMwMjQyIiwKKyAgICAiMTI4MzViMDE0NTcwNmZiZSIsICIyNDMxODViZTRlZTRiMjhjIiwgIjU1MGM3ZGMzZDVmZmI0ZTIiLAorICAgICI3MmJlNWQ3NGYyN2I4OTZmIiwgIjgwZGViMWZlM2IxNjk2YjEiLCAiOWJkYzA2YTcyNWM3MTIzNSIsCisgICAgImMxOWJmMTc0Y2Y2OTI2OTQiLCAiZTQ5YjY5YzE5ZWYxNGFkMiIsICJlZmJlNDc4NjM4NGYyNWUzIiwKKyAgICAiMGZjMTlkYzY4YjhjZDViNSIsICIyNDBjYTFjYzc3YWM5YzY1IiwgIjJkZTkyYzZmNTkyYjAyNzUiLAorICAgICI0YTc0ODRhYTZlYTZlNDgzIiwgIjVjYjBhOWRjYmQ0MWZiZDQiLCAiNzZmOTg4ZGE4MzExNTNiNSIsCisgICAgIjk4M2U1MTUyZWU2NmRmYWIiLCAiYTgzMWM2NmQyZGI0MzIxMCIsICJiMDAzMjdjODk4ZmIyMTNmIiwKKyAgICAiYmY1OTdmYzdiZWVmMGVlNCIsICJjNmUwMGJmMzNkYTg4ZmMyIiwgImQ1YTc5MTQ3OTMwYWE3MjUiLAorICAgICIwNmNhNjM1MWUwMDM4MjZmIiwgIjE0MjkyOTY3MGEwZTZlNzAiLCAiMjdiNzBhODU0NmQyMmZmYyIsCisgICAgIjJlMWIyMTM4NWMyNmM5MjYiLCAiNGQyYzZkZmM1YWM0MmFlZCIsICI1MzM4MGQxMzlkOTViM2RmIiwKKyAgICAiNjUwYTczNTQ4YmFmNjNkZSIsICI3NjZhMGFiYjNjNzdiMmE4IiwgIjgxYzJjOTJlNDdlZGFlZTYiLAorICAgICI5MjcyMmM4NTE0ODIzNTNiIiwgImEyYmZlOGExNGNmMTAzNjQiLCAiYTgxYTY2NGJiYzQyMzAwMSIsCisgICAgImMyNGI4YjcwZDBmODk3OTEiLCAiYzc2YzUxYTMwNjU0YmUzMCIsICJkMTkyZTgxOWQ2ZWY1MjE4IiwKKyAgICAiZDY5OTA2MjQ1NTY1YTkxMCIsICJmNDBlMzU4NTU3NzEyMDJhIiwgIjEwNmFhMDcwMzJiYmQxYjgiLAorICAgICIxOWE0YzExNmI4ZDJkMGM4IiwgIjFlMzc2YzA4NTE0MWFiNTMiLCAiMjc0ODc3NGNkZjhlZWI5OSIsCisgICAgIjM0YjBiY2I1ZTE5YjQ4YTgiLCAiMzkxYzBjYjNjNWM5NWE2MyIsICI0ZWQ4YWE0YWUzNDE4YWNiIiwKKyAgICAiNWI5Y2NhNGY3NzYzZTM3MyIsICI2ODJlNmZmM2Q2YjJiOGEzIiwgIjc0OGY4MmVlNWRlZmIyZmMiLAorICAgICI3OGE1NjM2ZjQzMTcyZjYwIiwgIjg0Yzg3ODE0YTFmMGFiNzIiLCAiOGNjNzAyMDgxYTY0MzllYyIsCisgICAgIjkwYmVmZmZhMjM2MzFlMjgiLCAiYTQ1MDZjZWJkZTgyYmRlOSIsICJiZWY5YTNmN2IyYzY3OTE1IiwKKyAgICAiYzY3MTc4ZjJlMzcyNTMyYiIsICJjYTI3M2VjZWVhMjY2MTljIiwgImQxODZiOGM3MjFjMGMyMDciLAorICAgICJlYWRhN2RkNmNkZTBlYjFlIiwgImY1N2Q0ZjdmZWU2ZWQxNzgiLCAiMDZmMDY3YWE3MjE3NmZiYSIsCisgICAgIjBhNjM3ZGM1YTJjODk4YTYiLCAiMTEzZjk4MDRiZWY5MGRhZSIsICIxYjcxMGIzNTEzMWM0NzFiIiwKKyAgICAiMjhkYjc3ZjUyMzA0N2Q4NCIsICIzMmNhYWI3YjQwYzcyNDkzIiwgIjNjOWViZTBhMTVjOWJlYmMiLAorICAgICI0MzFkNjdjNDljMTAwZDRjIiwgIjRjYzVkNGJlY2IzZTQyYjYiLCAiNTk3ZjI5OWNmYzY1N2UyYSIsCisgICAgIjVmY2I2ZmFiM2FkNmZhZWMiLCAiNmM0NDE5OGM0YTQ3NTgxNyIsCiB9OwotI2RlZmluZSBHRVRfRlhfNjRXT1JEKG4sYixpKSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKG4pID0gKCAoRlhfVUlOVDY0KSAoYilbKGkpICAgIF0gPDwgNTYgKSAgICAgICBcCi0gICAgICAgICAgICAgIHwgKCAoRlhfVUlOVDY0KSAoYilbKGkpICsgMV0gPDwgNDggKSAgICAgICBcCi0gICAgICAgICAgICAgIHwgKCAoRlhfVUlOVDY0KSAoYilbKGkpICsgMl0gPDwgNDAgKSAgICAgICBcCi0gICAgICAgICAgICAgIHwgKCAoRlhfVUlOVDY0KSAoYilbKGkpICsgM10gPDwgMzIgKSAgICAgIFwKLSAgICAgICAgICAgICAgfCAoIChGWF9VSU5UNjQpIChiKVsoaSkgKyA0XSA8PCAyNCApICAgICAgIFwKLSAgICAgICAgICAgICAgfCAoIChGWF9VSU5UNjQpIChiKVsoaSkgKyA1XSA8PCAxNiApICAgICAgIFwKLSAgICAgICAgICAgICAgfCAoIChGWF9VSU5UNjQpIChiKVsoaSkgKyA2XSA8PCAgOCApICAgICAgIFwKLSAgICAgICAgICAgICAgfCAoIChGWF9VSU5UNjQpIChiKVsoaSkgKyA3XSAgICAgICApOyAgICAgIFwKKyNkZWZpbmUgR0VUX0ZYXzY0V09SRChuLCBiLCBpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChuKSA9ICgodWludDY0X3QpKGIpWyhpKV0gPDwgNTYpIHwgKCh1aW50NjRfdCkoYilbKGkpICsgMV0gPDwgNDgpIHwgICAgIFwKKyAgICAgICAgICAoKHVpbnQ2NF90KShiKVsoaSkgKyAyXSA8PCA0MCkgfCAoKHVpbnQ2NF90KShiKVsoaSkgKyAzXSA8PCAzMikgfCBcCisgICAgICAgICAgKCh1aW50NjRfdCkoYilbKGkpICsgNF0gPDwgMjQpIHwgKCh1aW50NjRfdCkoYilbKGkpICsgNV0gPDwgMTYpIHwgXAorICAgICAgICAgICgodWludDY0X3QpKGIpWyhpKSArIDZdIDw8IDgpIHwgKCh1aW50NjRfdCkoYilbKGkpICsgN10pOyAgICAgICAgIFwKKyAgfQorI2RlZmluZSBQVVRfRlhfNjREV09SRChuLCBiLCBpKSAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYilbKGkpXSA9ICh1aW50OF90KSgobikgPj4gNTYpOyAgICAgXAorICAgIChiKVsoaSkgKyAxXSA9ICh1aW50OF90KSgobikgPj4gNDgpOyBcCisgICAgKGIpWyhpKSArIDJdID0gKHVpbnQ4X3QpKChuKSA+PiA0MCk7IFwKKyAgICAoYilbKGkpICsgM10gPSAodWludDhfdCkoKG4pID4+IDMyKTsgXAorICAgIChiKVsoaSkgKyA0XSA9ICh1aW50OF90KSgobikgPj4gMjQpOyBcCisgICAgKGIpWyhpKSArIDVdID0gKHVpbnQ4X3QpKChuKSA+PiAxNik7IFwKKyAgICAoYilbKGkpICsgNl0gPSAodWludDhfdCkoKG4pID4+IDgpOyAgXAorICAgIChiKVsoaSkgKyA3XSA9ICh1aW50OF90KSgobikpOyAgICAgICBcCisgIH0KK3N0YXRpYyB2b2lkIHNoYTM4NF9wcm9jZXNzKHNoYTM4NF9jb250ZXh0KiBjdHgsIGNvbnN0IHVpbnQ4X3QgZGF0YVsxMjhdKSB7CisgIHVpbnQ2NF90IHRlbXAxLCB0ZW1wMjsKKyAgdWludDY0X3QgQSwgQiwgQywgRCwgRSwgRiwgRywgSDsKKyAgdWludDY0X3QgV1s4MF07CisgIEdFVF9GWF82NFdPUkQoV1swXSwgZGF0YSwgMCk7CisgIEdFVF9GWF82NFdPUkQoV1sxXSwgZGF0YSwgOCk7CisgIEdFVF9GWF82NFdPUkQoV1syXSwgZGF0YSwgMTYpOworICBHRVRfRlhfNjRXT1JEKFdbM10sIGRhdGEsIDI0KTsKKyAgR0VUX0ZYXzY0V09SRChXWzRdLCBkYXRhLCAzMik7CisgIEdFVF9GWF82NFdPUkQoV1s1XSwgZGF0YSwgNDApOworICBHRVRfRlhfNjRXT1JEKFdbNl0sIGRhdGEsIDQ4KTsKKyAgR0VUX0ZYXzY0V09SRChXWzddLCBkYXRhLCA1Nik7CisgIEdFVF9GWF82NFdPUkQoV1s4XSwgZGF0YSwgNjQpOworICBHRVRfRlhfNjRXT1JEKFdbOV0sIGRhdGEsIDcyKTsKKyAgR0VUX0ZYXzY0V09SRChXWzEwXSwgZGF0YSwgODApOworICBHRVRfRlhfNjRXT1JEKFdbMTFdLCBkYXRhLCA4OCk7CisgIEdFVF9GWF82NFdPUkQoV1sxMl0sIGRhdGEsIDk2KTsKKyAgR0VUX0ZYXzY0V09SRChXWzEzXSwgZGF0YSwgMTA0KTsKKyAgR0VUX0ZYXzY0V09SRChXWzE0XSwgZGF0YSwgMTEyKTsKKyAgR0VUX0ZYXzY0V09SRChXWzE1XSwgZGF0YSwgMTIwKTsKKyAgQSA9IGN0eC0+c3RhdGVbMF07CisgIEIgPSBjdHgtPnN0YXRlWzFdOworICBDID0gY3R4LT5zdGF0ZVsyXTsKKyAgRCA9IGN0eC0+c3RhdGVbM107CisgIEUgPSBjdHgtPnN0YXRlWzRdOworICBGID0gY3R4LT5zdGF0ZVs1XTsKKyAgRyA9IGN0eC0+c3RhdGVbNl07CisgIEggPSBjdHgtPnN0YXRlWzddOworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICB1aW50NjRfdCB0ZW1wWzhdOworICAgIGlmIChpIDwgMikgeworICAgICAgdGVtcFswXSA9IFdbaSAqIDhdOworICAgICAgdGVtcFsxXSA9IFdbaSAqIDggKyAxXTsKKyAgICAgIHRlbXBbMl0gPSBXW2kgKiA4ICsgMl07CisgICAgICB0ZW1wWzNdID0gV1tpICogOCArIDNdOworICAgICAgdGVtcFs0XSA9IFdbaSAqIDggKyA0XTsKKyAgICAgIHRlbXBbNV0gPSBXW2kgKiA4ICsgNV07CisgICAgICB0ZW1wWzZdID0gV1tpICogOCArIDZdOworICAgICAgdGVtcFs3XSA9IFdbaSAqIDggKyA3XTsKKyAgICB9IGVsc2UgeworICAgICAgdGVtcFswXSA9IFNIQTM4NF9SKGkgKiA4KTsKKyAgICAgIHRlbXBbMV0gPSBTSEEzODRfUihpICogOCArIDEpOworICAgICAgdGVtcFsyXSA9IFNIQTM4NF9SKGkgKiA4ICsgMik7CisgICAgICB0ZW1wWzNdID0gU0hBMzg0X1IoaSAqIDggKyAzKTsKKyAgICAgIHRlbXBbNF0gPSBTSEEzODRfUihpICogOCArIDQpOworICAgICAgdGVtcFs1XSA9IFNIQTM4NF9SKGkgKiA4ICsgNSk7CisgICAgICB0ZW1wWzZdID0gU0hBMzg0X1IoaSAqIDggKyA2KTsKKyAgICAgIHRlbXBbN10gPSBTSEEzODRfUihpICogOCArIDcpOwogICAgIH0KLSNkZWZpbmUgUFVUX0ZYXzY0RFdPUkQobixiLGkpICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoYilbKGkpICAgIF0gPSAoRlhfQllURSkgKCAobikgPj4gNTYgKTsgICAgICAgXAotICAgICAgICAoYilbKGkpICsgMV0gPSAoRlhfQllURSkgKCAobikgPj4gNDggKTsgICAgICAgXAotICAgICAgICAoYilbKGkpICsgMl0gPSAoRlhfQllURSkgKCAobikgPj4gNDAgKTsgICAgICAgXAotICAgICAgICAoYilbKGkpICsgM10gPSAoRlhfQllURSkgKCAobikgPj4gMzIgKTsgICAgICAgXAotICAgICAgICAoYilbKGkpICsgNF0gPSAoRlhfQllURSkgKCAobikgPj4gMjQgKTsgICAgICAgXAotICAgICAgICAoYilbKGkpICsgNV0gPSAoRlhfQllURSkgKCAobikgPj4gMTYgKTsgICAgICAgXAotICAgICAgICAoYilbKGkpICsgNl0gPSAoRlhfQllURSkgKCAobikgPj4gIDggKTsgICAgICAgXAotICAgICAgICAoYilbKGkpICsgN10gPSAoRlhfQllURSkgKCAobikgKTsgICAgICAgXAotICAgIH0KLXN0YXRpYyB2b2lkIHNoYTM4NF9wcm9jZXNzKCBzaGEzODRfY29udGV4dCAqY3R4LCBjb25zdCBGWF9CWVRFIGRhdGFbMTI4XSApCi17Ci0gICAgRlhfVUlOVDY0IHRlbXAxLCB0ZW1wMjsKLSAgICBGWF9VSU5UNjQgQSwgQiwgQywgRCwgRSwgRiwgRywgSDsKLSAgICBGWF9VSU5UNjQgV1s4MF07Ci0gICAgR0VUX0ZYXzY0V09SRChXWzBdLCBkYXRhLCAwKTsKLSAgICBHRVRfRlhfNjRXT1JEKFdbMV0sIGRhdGEsIDgpOwotICAgIEdFVF9GWF82NFdPUkQoV1syXSwgZGF0YSwgMTYpOwotICAgIEdFVF9GWF82NFdPUkQoV1szXSwgZGF0YSwgMjQpOwotICAgIEdFVF9GWF82NFdPUkQoV1s0XSwgZGF0YSwgMzIpOwotICAgIEdFVF9GWF82NFdPUkQoV1s1XSwgZGF0YSwgNDApOwotICAgIEdFVF9GWF82NFdPUkQoV1s2XSwgZGF0YSwgNDgpOwotICAgIEdFVF9GWF82NFdPUkQoV1s3XSwgZGF0YSwgNTYpOwotICAgIEdFVF9GWF82NFdPUkQoV1s4XSwgZGF0YSwgNjQpOwotICAgIEdFVF9GWF82NFdPUkQoV1s5XSwgZGF0YSwgNzIpOwotICAgIEdFVF9GWF82NFdPUkQoV1sxMF0sIGRhdGEsIDgwKTsKLSAgICBHRVRfRlhfNjRXT1JEKFdbMTFdLCBkYXRhLCA4OCk7Ci0gICAgR0VUX0ZYXzY0V09SRChXWzEyXSwgZGF0YSwgOTYpOwotICAgIEdFVF9GWF82NFdPUkQoV1sxM10sIGRhdGEsIDEwNCk7Ci0gICAgR0VUX0ZYXzY0V09SRChXWzE0XSwgZGF0YSwgMTEyKTsKLSAgICBHRVRfRlhfNjRXT1JEKFdbMTVdLCBkYXRhLCAxMjApOwotICAgIEEgPSBjdHgtPnN0YXRlWzBdOwotICAgIEIgPSBjdHgtPnN0YXRlWzFdOwotICAgIEMgPSBjdHgtPnN0YXRlWzJdOwotICAgIEQgPSBjdHgtPnN0YXRlWzNdOwotICAgIEUgPSBjdHgtPnN0YXRlWzRdOwotICAgIEYgPSBjdHgtPnN0YXRlWzVdOwotICAgIEcgPSBjdHgtPnN0YXRlWzZdOwotICAgIEggPSBjdHgtPnN0YXRlWzddOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkgewotICAgICAgICBGWF9VSU5UNjQgdGVtcFs4XTsKLSAgICAgICAgaWYgKGkgPCAyKSB7Ci0gICAgICAgICAgICB0ZW1wWzBdID0gV1tpICogOF07Ci0gICAgICAgICAgICB0ZW1wWzFdID0gV1tpICogOCArIDFdOwotICAgICAgICAgICAgdGVtcFsyXSA9IFdbaSAqIDggKyAyXTsKLSAgICAgICAgICAgIHRlbXBbM10gPSBXW2kgKiA4ICsgM107Ci0gICAgICAgICAgICB0ZW1wWzRdID0gV1tpICogOCArIDRdOwotICAgICAgICAgICAgdGVtcFs1XSA9IFdbaSAqIDggKyA1XTsKLSAgICAgICAgICAgIHRlbXBbNl0gPSBXW2kgKiA4ICsgNl07Ci0gICAgICAgICAgICB0ZW1wWzddID0gV1tpICogOCArIDddOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGVtcFswXSA9IFNIQTM4NF9SKGkgKiA4KTsKLSAgICAgICAgICAgIHRlbXBbMV0gPSBTSEEzODRfUihpICogOCArIDEpOwotICAgICAgICAgICAgdGVtcFsyXSA9IFNIQTM4NF9SKGkgKiA4ICsgMik7Ci0gICAgICAgICAgICB0ZW1wWzNdID0gU0hBMzg0X1IoaSAqIDggKyAzKTsKLSAgICAgICAgICAgIHRlbXBbNF0gPSBTSEEzODRfUihpICogOCArIDQpOwotICAgICAgICAgICAgdGVtcFs1XSA9IFNIQTM4NF9SKGkgKiA4ICsgNSk7Ci0gICAgICAgICAgICB0ZW1wWzZdID0gU0hBMzg0X1IoaSAqIDggKyA2KTsKLSAgICAgICAgICAgIHRlbXBbN10gPSBTSEEzODRfUihpICogOCArIDcpOwotICAgICAgICB9Ci0gICAgICAgIFNIQTM4NF9QKCBBLCBCLCBDLCBELCBFLCBGLCBHLCBILCB0ZW1wWyAwXSwgRlhfYXRvNjRpKGNvbnN0YW50c1tpICogOCAgICBdKSApOwotICAgICAgICBTSEEzODRfUCggSCwgQSwgQiwgQywgRCwgRSwgRiwgRywgdGVtcFsgMV0sIEZYX2F0bzY0aShjb25zdGFudHNbaSAqIDggKyAxXSkgKTsKLSAgICAgICAgU0hBMzg0X1AoIEcsIEgsIEEsIEIsIEMsIEQsIEUsIEYsIHRlbXBbIDJdLCBGWF9hdG82NGkoY29uc3RhbnRzW2kgKiA4ICsgMl0pICk7Ci0gICAgICAgIFNIQTM4NF9QKCBGLCBHLCBILCBBLCBCLCBDLCBELCBFLCB0ZW1wWyAzXSwgRlhfYXRvNjRpKGNvbnN0YW50c1tpICogOCArIDNdKSApOwotICAgICAgICBTSEEzODRfUCggRSwgRiwgRywgSCwgQSwgQiwgQywgRCwgdGVtcFsgNF0sIEZYX2F0bzY0aShjb25zdGFudHNbaSAqIDggKyA0XSkgKTsKLSAgICAgICAgU0hBMzg0X1AoIEQsIEUsIEYsIEcsIEgsIEEsIEIsIEMsIHRlbXBbIDVdLCBGWF9hdG82NGkoY29uc3RhbnRzW2kgKiA4ICsgNV0pICk7Ci0gICAgICAgIFNIQTM4NF9QKCBDLCBELCBFLCBGLCBHLCBILCBBLCBCLCB0ZW1wWyA2XSwgRlhfYXRvNjRpKGNvbnN0YW50c1tpICogOCArIDZdKSApOwotICAgICAgICBTSEEzODRfUCggQiwgQywgRCwgRSwgRiwgRywgSCwgQSwgdGVtcFsgN10sIEZYX2F0bzY0aShjb25zdGFudHNbaSAqIDggKyA3XSkgKTsKLSAgICB9Ci0gICAgY3R4LT5zdGF0ZVswXSArPSBBOwotICAgIGN0eC0+c3RhdGVbMV0gKz0gQjsKLSAgICBjdHgtPnN0YXRlWzJdICs9IEM7Ci0gICAgY3R4LT5zdGF0ZVszXSArPSBEOwotICAgIGN0eC0+c3RhdGVbNF0gKz0gRTsKLSAgICBjdHgtPnN0YXRlWzVdICs9IEY7Ci0gICAgY3R4LT5zdGF0ZVs2XSArPSBHOwotICAgIGN0eC0+c3RhdGVbN10gKz0gSDsKKyAgICBTSEEzODRfUChBLCBCLCBDLCBELCBFLCBGLCBHLCBILCB0ZW1wWzBdLCBGWF9hdG82NGkoY29uc3RhbnRzW2kgKiA4XSkpOworICAgIFNIQTM4NF9QKEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIHRlbXBbMV0sIEZYX2F0bzY0aShjb25zdGFudHNbaSAqIDggKyAxXSkpOworICAgIFNIQTM4NF9QKEcsIEgsIEEsIEIsIEMsIEQsIEUsIEYsIHRlbXBbMl0sIEZYX2F0bzY0aShjb25zdGFudHNbaSAqIDggKyAyXSkpOworICAgIFNIQTM4NF9QKEYsIEcsIEgsIEEsIEIsIEMsIEQsIEUsIHRlbXBbM10sIEZYX2F0bzY0aShjb25zdGFudHNbaSAqIDggKyAzXSkpOworICAgIFNIQTM4NF9QKEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIHRlbXBbNF0sIEZYX2F0bzY0aShjb25zdGFudHNbaSAqIDggKyA0XSkpOworICAgIFNIQTM4NF9QKEQsIEUsIEYsIEcsIEgsIEEsIEIsIEMsIHRlbXBbNV0sIEZYX2F0bzY0aShjb25zdGFudHNbaSAqIDggKyA1XSkpOworICAgIFNIQTM4NF9QKEMsIEQsIEUsIEYsIEcsIEgsIEEsIEIsIHRlbXBbNl0sIEZYX2F0bzY0aShjb25zdGFudHNbaSAqIDggKyA2XSkpOworICAgIFNIQTM4NF9QKEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIHRlbXBbN10sIEZYX2F0bzY0aShjb25zdGFudHNbaSAqIDggKyA3XSkpOworICB9CisgIGN0eC0+c3RhdGVbMF0gKz0gQTsKKyAgY3R4LT5zdGF0ZVsxXSArPSBCOworICBjdHgtPnN0YXRlWzJdICs9IEM7CisgIGN0eC0+c3RhdGVbM10gKz0gRDsKKyAgY3R4LT5zdGF0ZVs0XSArPSBFOworICBjdHgtPnN0YXRlWzVdICs9IEY7CisgIGN0eC0+c3RhdGVbNl0gKz0gRzsKKyAgY3R4LT5zdGF0ZVs3XSArPSBIOwogfQotdm9pZCBDUllQVF9TSEEzODRVcGRhdGUoRlhfTFBWT0lEIGNvbnRleHQsIEZYX0xQQ0JZVEUgaW5wdXQsIEZYX0RXT1JEIGxlbmd0aCkKLXsKLSAgICBzaGEzODRfY29udGV4dCAqY3R4ID0gKHNoYTM4NF9jb250ZXh0ICopY29udGV4dDsKLSAgICBGWF9EV09SRCBsZWZ0LCBmaWxsOwotICAgIGlmKCAhIGxlbmd0aCApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsZWZ0ID0gKEZYX0RXT1JEKWN0eC0+dG90YWxbMF0gJiAweDdGOwotICAgIGZpbGwgPSAxMjggLSBsZWZ0OwotICAgIGN0eC0+dG90YWxbMF0gKz0gbGVuZ3RoOwotICAgIGlmKCBjdHgtPnRvdGFsWzBdIDwgbGVuZ3RoICkgewotICAgICAgICBjdHgtPnRvdGFsWzFdKys7Ci0gICAgfQotICAgIGlmKCBsZWZ0ICYmIGxlbmd0aCA+PSBmaWxsICkgewotICAgICAgICBGWFNZU19tZW1jcHkzMiggKHZvaWQgKikgKGN0eC0+YnVmZmVyICsgbGVmdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSBpbnB1dCwgZmlsbCApOwotICAgICAgICBzaGEzODRfcHJvY2VzcyggY3R4LCBjdHgtPmJ1ZmZlciApOwotICAgICAgICBsZW5ndGggLT0gZmlsbDsKLSAgICAgICAgaW5wdXQgICs9IGZpbGw7Ci0gICAgICAgIGxlZnQgPSAwOwotICAgIH0KLSAgICB3aGlsZSggbGVuZ3RoID49IDEyOCApIHsKLSAgICAgICAgc2hhMzg0X3Byb2Nlc3MoIGN0eCwgaW5wdXQgKTsKLSAgICAgICAgbGVuZ3RoIC09IDEyODsKLSAgICAgICAgaW5wdXQgICs9IDEyODsKLSAgICB9Ci0gICAgaWYoIGxlbmd0aCApIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5MzIoICh2b2lkICopIChjdHgtPmJ1ZmZlciArIGxlZnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgaW5wdXQsIGxlbmd0aCApOwotICAgIH0KK3ZvaWQgQ1JZUFRfU0hBMzg0VXBkYXRlKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIGlucHV0LCBGWF9EV09SRCBsZW5ndGgpIHsKKyAgc2hhMzg0X2NvbnRleHQqIGN0eCA9IChzaGEzODRfY29udGV4dCopY29udGV4dDsKKyAgRlhfRFdPUkQgbGVmdCwgZmlsbDsKKyAgaWYgKCFsZW5ndGgpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbGVmdCA9IChGWF9EV09SRCljdHgtPnRvdGFsWzBdICYgMHg3RjsKKyAgZmlsbCA9IDEyOCAtIGxlZnQ7CisgIGN0eC0+dG90YWxbMF0gKz0gbGVuZ3RoOworICBpZiAoY3R4LT50b3RhbFswXSA8IGxlbmd0aCkgeworICAgIGN0eC0+dG90YWxbMV0rKzsKKyAgfQorICBpZiAobGVmdCAmJiBsZW5ndGggPj0gZmlsbCkgeworICAgIEZYU1lTX21lbWNweSgodm9pZCopKGN0eC0+YnVmZmVyICsgbGVmdCksICh2b2lkKilpbnB1dCwgZmlsbCk7CisgICAgc2hhMzg0X3Byb2Nlc3MoY3R4LCBjdHgtPmJ1ZmZlcik7CisgICAgbGVuZ3RoIC09IGZpbGw7CisgICAgaW5wdXQgKz0gZmlsbDsKKyAgICBsZWZ0ID0gMDsKKyAgfQorICB3aGlsZSAobGVuZ3RoID49IDEyOCkgeworICAgIHNoYTM4NF9wcm9jZXNzKGN0eCwgaW5wdXQpOworICAgIGxlbmd0aCAtPSAxMjg7CisgICAgaW5wdXQgKz0gMTI4OworICB9CisgIGlmIChsZW5ndGgpIHsKKyAgICBGWFNZU19tZW1jcHkoKHZvaWQqKShjdHgtPmJ1ZmZlciArIGxlZnQpLCAodm9pZCopaW5wdXQsIGxlbmd0aCk7CisgIH0KIH0KLXZvaWQgQ1JZUFRfU0hBMzg0RmluaXNoKEZYX0xQVk9JRCBjb250ZXh0LCBGWF9CWVRFIGRpZ2VzdFs0OF0pCi17Ci0gICAgc2hhMzg0X2NvbnRleHQgKmN0eCA9IChzaGEzODRfY29udGV4dCAqKWNvbnRleHQ7Ci0gICAgRlhfRFdPUkQgbGFzdCwgcGFkbjsKLSAgICBGWF9CWVRFIG1zZ2xlblsxNl07Ci0gICAgRlhTWVNfbWVtc2V0MzIobXNnbGVuLCAwLCAxNik7Ci0gICAgRlhfVUlOVDY0IGhpZ2gsIGxvdzsKLSAgICBoaWdoID0gKCBjdHgtPnRvdGFsWzBdID4+IDI5ICkKLSAgICAgICAgICAgfCAoIGN0eC0+dG90YWxbMV0gPDwgIDMgKTsKLSAgICBsb3cgID0gKCBjdHgtPnRvdGFsWzBdIDw8ICAzICk7Ci0gICAgUFVUX0ZYXzY0RFdPUkQoIGhpZ2gsIG1zZ2xlbiwgMCApOwotICAgIFBVVF9GWF82NERXT1JEKCBsb3csICBtc2dsZW4sIDggKTsKLSAgICBsYXN0ID0gKEZYX0RXT1JEKWN0eC0+dG90YWxbMF0gJiAweDdGOwotICAgIHBhZG4gPSAoIGxhc3QgPCAxMTIgKSA/ICggMTEyIC0gbGFzdCApIDogKCAyNDAgLSBsYXN0ICk7Ci0gICAgQ1JZUFRfU0hBMzg0VXBkYXRlKCBjdHgsIHNoYTM4NF9wYWRkaW5nLCBwYWRuICk7Ci0gICAgQ1JZUFRfU0hBMzg0VXBkYXRlKCBjdHgsIG1zZ2xlbiwgMTYgKTsKLSAgICBQVVRfRlhfNjREV09SRChjdHgtPnN0YXRlWzBdLCBkaWdlc3QsIDApOwotICAgIFBVVF9GWF82NERXT1JEKGN0eC0+c3RhdGVbMV0sIGRpZ2VzdCwgOCk7Ci0gICAgUFVUX0ZYXzY0RFdPUkQoY3R4LT5zdGF0ZVsyXSwgZGlnZXN0LCAxNik7Ci0gICAgUFVUX0ZYXzY0RFdPUkQoY3R4LT5zdGF0ZVszXSwgZGlnZXN0LCAyNCk7Ci0gICAgUFVUX0ZYXzY0RFdPUkQoY3R4LT5zdGF0ZVs0XSwgZGlnZXN0LCAzMik7Ci0gICAgUFVUX0ZYXzY0RFdPUkQoY3R4LT5zdGF0ZVs1XSwgZGlnZXN0LCA0MCk7Cit2b2lkIENSWVBUX1NIQTM4NEZpbmlzaCh2b2lkKiBjb250ZXh0LCB1aW50OF90IGRpZ2VzdFs0OF0pIHsKKyAgc2hhMzg0X2NvbnRleHQqIGN0eCA9IChzaGEzODRfY29udGV4dCopY29udGV4dDsKKyAgRlhfRFdPUkQgbGFzdCwgcGFkbjsKKyAgdWludDhfdCBtc2dsZW5bMTZdOworICBGWFNZU19tZW1zZXQobXNnbGVuLCAwLCAxNik7CisgIHVpbnQ2NF90IGhpZ2gsIGxvdzsKKyAgaGlnaCA9IChjdHgtPnRvdGFsWzBdID4+IDI5KSB8IChjdHgtPnRvdGFsWzFdIDw8IDMpOworICBsb3cgPSAoY3R4LT50b3RhbFswXSA8PCAzKTsKKyAgUFVUX0ZYXzY0RFdPUkQoaGlnaCwgbXNnbGVuLCAwKTsKKyAgUFVUX0ZYXzY0RFdPUkQobG93LCBtc2dsZW4sIDgpOworICBsYXN0ID0gKEZYX0RXT1JEKWN0eC0+dG90YWxbMF0gJiAweDdGOworICBwYWRuID0gKGxhc3QgPCAxMTIpID8gKDExMiAtIGxhc3QpIDogKDI0MCAtIGxhc3QpOworICBDUllQVF9TSEEzODRVcGRhdGUoY3R4LCBzaGEzODRfcGFkZGluZywgcGFkbik7CisgIENSWVBUX1NIQTM4NFVwZGF0ZShjdHgsIG1zZ2xlbiwgMTYpOworICBQVVRfRlhfNjREV09SRChjdHgtPnN0YXRlWzBdLCBkaWdlc3QsIDApOworICBQVVRfRlhfNjREV09SRChjdHgtPnN0YXRlWzFdLCBkaWdlc3QsIDgpOworICBQVVRfRlhfNjREV09SRChjdHgtPnN0YXRlWzJdLCBkaWdlc3QsIDE2KTsKKyAgUFVUX0ZYXzY0RFdPUkQoY3R4LT5zdGF0ZVszXSwgZGlnZXN0LCAyNCk7CisgIFBVVF9GWF82NERXT1JEKGN0eC0+c3RhdGVbNF0sIGRpZ2VzdCwgMzIpOworICBQVVRfRlhfNjREV09SRChjdHgtPnN0YXRlWzVdLCBkaWdlc3QsIDQwKTsKIH0KLXZvaWQgQ1JZUFRfU0hBMzg0R2VuZXJhdGUoRlhfTFBDQllURSBkYXRhLCBGWF9EV09SRCBzaXplLCBGWF9CWVRFIGRpZ2VzdFs2NF0pCi17Ci0gICAgc2hhMzg0X2NvbnRleHQgY29udGV4dDsKLSAgICBDUllQVF9TSEEzODRTdGFydCgmY29udGV4dCk7Ci0gICAgQ1JZUFRfU0hBMzg0VXBkYXRlKCZjb250ZXh0LCBkYXRhLCBzaXplKTsKLSAgICBDUllQVF9TSEEzODRGaW5pc2goJmNvbnRleHQsIGRpZ2VzdCk7Cit2b2lkIENSWVBUX1NIQTM4NEdlbmVyYXRlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGlnZXN0WzY0XSkgeworICBzaGEzODRfY29udGV4dCBjb250ZXh0OworICBDUllQVF9TSEEzODRTdGFydCgmY29udGV4dCk7CisgIENSWVBUX1NIQTM4NFVwZGF0ZSgmY29udGV4dCwgZGF0YSwgc2l6ZSk7CisgIENSWVBUX1NIQTM4NEZpbmlzaCgmY29udGV4dCwgZGlnZXN0KTsKIH0KLXZvaWQgQ1JZUFRfU0hBNTEyU3RhcnQoRlhfTFBWT0lEIGNvbnRleHQpCi17Ci0gICAgaWYgKGNvbnRleHQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHNoYTM4NF9jb250ZXh0ICpjdHggPSAoc2hhMzg0X2NvbnRleHQgKiljb250ZXh0OwotICAgIEZYU1lTX21lbXNldDMyKGN0eCwgMCwgc2l6ZW9mKHNoYTM4NF9jb250ZXh0KSk7Ci0gICAgY3R4LT5zdGF0ZVswXSA9IEZYX2F0bzY0aSgiNmEwOWU2NjdmM2JjYzkwOCIpOwotICAgIGN0eC0+c3RhdGVbMV0gPSBGWF9hdG82NGkoImJiNjdhZTg1ODRjYWE3M2IiKTsKLSAgICBjdHgtPnN0YXRlWzJdID0gRlhfYXRvNjRpKCIzYzZlZjM3MmZlOTRmODJiIik7Ci0gICAgY3R4LT5zdGF0ZVszXSA9IEZYX2F0bzY0aSgiYTU0ZmY1M2E1ZjFkMzZmMSIpOwotICAgIGN0eC0+c3RhdGVbNF0gPSBGWF9hdG82NGkoIjUxMGU1MjdmYWRlNjgyZDEiKTsKLSAgICBjdHgtPnN0YXRlWzVdID0gRlhfYXRvNjRpKCI5YjA1Njg4YzJiM2U2YzFmIik7Ci0gICAgY3R4LT5zdGF0ZVs2XSA9IEZYX2F0bzY0aSgiMWY4M2Q5YWJmYjQxYmQ2YiIpOwotICAgIGN0eC0+c3RhdGVbN10gPSBGWF9hdG82NGkoIjViZTBjZDE5MTM3ZTIxNzkiKTsKK3ZvaWQgQ1JZUFRfU0hBNTEyU3RhcnQodm9pZCogY29udGV4dCkgeworICBpZiAoIWNvbnRleHQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgc2hhMzg0X2NvbnRleHQqIGN0eCA9IChzaGEzODRfY29udGV4dCopY29udGV4dDsKKyAgRlhTWVNfbWVtc2V0KGN0eCwgMCwgc2l6ZW9mKHNoYTM4NF9jb250ZXh0KSk7CisgIGN0eC0+c3RhdGVbMF0gPSBGWF9hdG82NGkoIjZhMDllNjY3ZjNiY2M5MDgiKTsKKyAgY3R4LT5zdGF0ZVsxXSA9IEZYX2F0bzY0aSgiYmI2N2FlODU4NGNhYTczYiIpOworICBjdHgtPnN0YXRlWzJdID0gRlhfYXRvNjRpKCIzYzZlZjM3MmZlOTRmODJiIik7CisgIGN0eC0+c3RhdGVbM10gPSBGWF9hdG82NGkoImE1NGZmNTNhNWYxZDM2ZjEiKTsKKyAgY3R4LT5zdGF0ZVs0XSA9IEZYX2F0bzY0aSgiNTEwZTUyN2ZhZGU2ODJkMSIpOworICBjdHgtPnN0YXRlWzVdID0gRlhfYXRvNjRpKCI5YjA1Njg4YzJiM2U2YzFmIik7CisgIGN0eC0+c3RhdGVbNl0gPSBGWF9hdG82NGkoIjFmODNkOWFiZmI0MWJkNmIiKTsKKyAgY3R4LT5zdGF0ZVs3XSA9IEZYX2F0bzY0aSgiNWJlMGNkMTkxMzdlMjE3OSIpOwogfQotdm9pZCBDUllQVF9TSEE1MTJVcGRhdGUoRlhfTFBWT0lEIGNvbnRleHQsIEZYX0xQQ0JZVEUgZGF0YSwgRlhfRFdPUkQgc2l6ZSkKLXsKLSAgICBDUllQVF9TSEEzODRVcGRhdGUoY29udGV4dCwgZGF0YSwgc2l6ZSk7Cit2b2lkIENSWVBUX1NIQTUxMlVwZGF0ZSh2b2lkKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplKSB7CisgIENSWVBUX1NIQTM4NFVwZGF0ZShjb250ZXh0LCBkYXRhLCBzaXplKTsKIH0KLXZvaWQgQ1JZUFRfU0hBNTEyRmluaXNoKEZYX0xQVk9JRCBjb250ZXh0LCBGWF9CWVRFIGRpZ2VzdFs2NF0pCi17Ci0gICAgc2hhMzg0X2NvbnRleHQgKmN0eCA9IChzaGEzODRfY29udGV4dCAqKWNvbnRleHQ7Ci0gICAgRlhfRFdPUkQgbGFzdCwgcGFkbjsKLSAgICBGWF9CWVRFIG1zZ2xlblsxNl07Ci0gICAgRlhTWVNfbWVtc2V0MzIobXNnbGVuLCAwLCAxNik7Ci0gICAgRlhfVUlOVDY0IGhpZ2gsIGxvdzsKLSAgICBoaWdoID0gKCBjdHgtPnRvdGFsWzBdID4+IDI5ICkKLSAgICAgICAgICAgfCAoIGN0eC0+dG90YWxbMV0gPDwgIDMgKTsKLSAgICBsb3cgID0gKCBjdHgtPnRvdGFsWzBdIDw8ICAzICk7Ci0gICAgUFVUX0ZYXzY0RFdPUkQoIGhpZ2gsIG1zZ2xlbiwgMCApOwotICAgIFBVVF9GWF82NERXT1JEKCBsb3csICBtc2dsZW4sIDggKTsKLSAgICBsYXN0ID0gKEZYX0RXT1JEKWN0eC0+dG90YWxbMF0gJiAweDdGOwotICAgIHBhZG4gPSAoIGxhc3QgPCAxMTIgKSA/ICggMTEyIC0gbGFzdCApIDogKCAyNDAgLSBsYXN0ICk7Ci0gICAgQ1JZUFRfU0hBNTEyVXBkYXRlKCBjdHgsIHNoYTM4NF9wYWRkaW5nLCBwYWRuICk7Ci0gICAgQ1JZUFRfU0hBNTEyVXBkYXRlKCBjdHgsIG1zZ2xlbiwgMTYgKTsKLSAgICBQVVRfRlhfNjREV09SRChjdHgtPnN0YXRlWzBdLCBkaWdlc3QsIDApOwotICAgIFBVVF9GWF82NERXT1JEKGN0eC0+c3RhdGVbMV0sIGRpZ2VzdCwgOCk7Ci0gICAgUFVUX0ZYXzY0RFdPUkQoY3R4LT5zdGF0ZVsyXSwgZGlnZXN0LCAxNik7Ci0gICAgUFVUX0ZYXzY0RFdPUkQoY3R4LT5zdGF0ZVszXSwgZGlnZXN0LCAyNCk7Ci0gICAgUFVUX0ZYXzY0RFdPUkQoY3R4LT5zdGF0ZVs0XSwgZGlnZXN0LCAzMik7Ci0gICAgUFVUX0ZYXzY0RFdPUkQoY3R4LT5zdGF0ZVs1XSwgZGlnZXN0LCA0MCk7Ci0gICAgUFVUX0ZYXzY0RFdPUkQoY3R4LT5zdGF0ZVs2XSwgZGlnZXN0LCA0OCk7Ci0gICAgUFVUX0ZYXzY0RFdPUkQoY3R4LT5zdGF0ZVs3XSwgZGlnZXN0LCA1Nik7Cit2b2lkIENSWVBUX1NIQTUxMkZpbmlzaCh2b2lkKiBjb250ZXh0LCB1aW50OF90IGRpZ2VzdFs2NF0pIHsKKyAgc2hhMzg0X2NvbnRleHQqIGN0eCA9IChzaGEzODRfY29udGV4dCopY29udGV4dDsKKyAgRlhfRFdPUkQgbGFzdCwgcGFkbjsKKyAgdWludDhfdCBtc2dsZW5bMTZdOworICBGWFNZU19tZW1zZXQobXNnbGVuLCAwLCAxNik7CisgIHVpbnQ2NF90IGhpZ2gsIGxvdzsKKyAgaGlnaCA9IChjdHgtPnRvdGFsWzBdID4+IDI5KSB8IChjdHgtPnRvdGFsWzFdIDw8IDMpOworICBsb3cgPSAoY3R4LT50b3RhbFswXSA8PCAzKTsKKyAgUFVUX0ZYXzY0RFdPUkQoaGlnaCwgbXNnbGVuLCAwKTsKKyAgUFVUX0ZYXzY0RFdPUkQobG93LCBtc2dsZW4sIDgpOworICBsYXN0ID0gKEZYX0RXT1JEKWN0eC0+dG90YWxbMF0gJiAweDdGOworICBwYWRuID0gKGxhc3QgPCAxMTIpID8gKDExMiAtIGxhc3QpIDogKDI0MCAtIGxhc3QpOworICBDUllQVF9TSEE1MTJVcGRhdGUoY3R4LCBzaGEzODRfcGFkZGluZywgcGFkbik7CisgIENSWVBUX1NIQTUxMlVwZGF0ZShjdHgsIG1zZ2xlbiwgMTYpOworICBQVVRfRlhfNjREV09SRChjdHgtPnN0YXRlWzBdLCBkaWdlc3QsIDApOworICBQVVRfRlhfNjREV09SRChjdHgtPnN0YXRlWzFdLCBkaWdlc3QsIDgpOworICBQVVRfRlhfNjREV09SRChjdHgtPnN0YXRlWzJdLCBkaWdlc3QsIDE2KTsKKyAgUFVUX0ZYXzY0RFdPUkQoY3R4LT5zdGF0ZVszXSwgZGlnZXN0LCAyNCk7CisgIFBVVF9GWF82NERXT1JEKGN0eC0+c3RhdGVbNF0sIGRpZ2VzdCwgMzIpOworICBQVVRfRlhfNjREV09SRChjdHgtPnN0YXRlWzVdLCBkaWdlc3QsIDQwKTsKKyAgUFVUX0ZYXzY0RFdPUkQoY3R4LT5zdGF0ZVs2XSwgZGlnZXN0LCA0OCk7CisgIFBVVF9GWF82NERXT1JEKGN0eC0+c3RhdGVbN10sIGRpZ2VzdCwgNTYpOwogfQotdm9pZCBDUllQVF9TSEE1MTJHZW5lcmF0ZShGWF9MUENCWVRFIGRhdGEsIEZYX0RXT1JEIHNpemUsIEZYX0JZVEUgZGlnZXN0WzY0XSkKLXsKLSAgICBzaGEzODRfY29udGV4dCBjb250ZXh0OwotICAgIENSWVBUX1NIQTUxMlN0YXJ0KCZjb250ZXh0KTsKLSAgICBDUllQVF9TSEE1MTJVcGRhdGUoJmNvbnRleHQsIGRhdGEsIHNpemUpOwotICAgIENSWVBUX1NIQTUxMkZpbmlzaCgmY29udGV4dCwgZGlnZXN0KTsKK3ZvaWQgQ1JZUFRfU0hBNTEyR2VuZXJhdGUoY29uc3QgdWludDhfdCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkaWdlc3RbNjRdKSB7CisgIHNoYTM4NF9jb250ZXh0IGNvbnRleHQ7CisgIENSWVBUX1NIQTUxMlN0YXJ0KCZjb250ZXh0KTsKKyAgQ1JZUFRfU0hBNTEyVXBkYXRlKCZjb250ZXh0LCBkYXRhLCBzaXplKTsKKyAgQ1JZUFRfU0hBNTEyRmluaXNoKCZjb250ZXh0LCBkaWdlc3QpOwogfQogI2lmZGVmIF9fY3BsdXNwbHVzCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2Jhc2ljX21vZHVsZS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfYmFzaWNfbW9kdWxlLmNwcAppbmRleCBkNTY0YmRiLi5hMmE3ZTA5IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfYmFzaWNfbW9kdWxlLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfYmFzaWNfbW9kdWxlLmNwcApAQCAtMSwxMjcgKzEsNjIgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oIgotc3RhdGljIENQREZfTW9kdWxlTWdyKglnX0ZQREZBUElfcERlZmF1bHRNZ3IgPSBOVUxMOwotQ1BERl9Nb2R1bGVNZ3IqIENQREZfTW9kdWxlTWdyOjpHZXQoKQotewotICAgIHJldHVybiBnX0ZQREZBUElfcERlZmF1bHRNZ3I7CisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oIgorCituYW1lc3BhY2UgeworCitDUERGX01vZHVsZU1nciogZ19GUERGQVBJX3BEZWZhdWx0TWdyID0gbnVsbHB0cjsKKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworQ1BERl9Nb2R1bGVNZ3IqIENQREZfTW9kdWxlTWdyOjpHZXQoKSB7CisgIHJldHVybiBnX0ZQREZBUElfcERlZmF1bHRNZ3I7CiB9Ci12b2lkIENQREZfTW9kdWxlTWdyOjpDcmVhdGUoKQotewotICAgIGdfRlBERkFQSV9wRGVmYXVsdE1nciA9IG5ldyBDUERGX01vZHVsZU1ncjsKLSAgICBnX0ZQREZBUElfcERlZmF1bHRNZ3ItPkluaXRpYWxpemUoKTsKKworLy8gc3RhdGljCit2b2lkIENQREZfTW9kdWxlTWdyOjpDcmVhdGUoKSB7CisgIEFTU0VSVCghZ19GUERGQVBJX3BEZWZhdWx0TWdyKTsKKyAgZ19GUERGQVBJX3BEZWZhdWx0TWdyID0gbmV3IENQREZfTW9kdWxlTWdyOwogfQotdm9pZCBDUERGX01vZHVsZU1ncjo6RGVzdHJveSgpCi17Ci0gICAgaWYgKGdfRlBERkFQSV9wRGVmYXVsdE1ncikgewotICAgICAgICBkZWxldGUgZ19GUERGQVBJX3BEZWZhdWx0TWdyOwotICAgIH0KLSAgICBnX0ZQREZBUElfcERlZmF1bHRNZ3IgPSBOVUxMOworCisvLyBzdGF0aWMKK3ZvaWQgQ1BERl9Nb2R1bGVNZ3I6OkRlc3Ryb3koKSB7CisgIGRlbGV0ZSBnX0ZQREZBUElfcERlZmF1bHRNZ3I7CisgIGdfRlBERkFQSV9wRGVmYXVsdE1nciA9IG51bGxwdHI7CiB9Ci1DUERGX01vZHVsZU1ncjo6Q1BERl9Nb2R1bGVNZ3IoKQotewotICAgIG1fcENvZGVjTW9kdWxlID0gTlVMTDsKLSAgICBtX3BQYWdlTW9kdWxlID0gTlVMTDsKLSAgICBtX3BSZW5kZXJNb2R1bGUgPSBOVUxMOwotICAgIG1fRmlsZUJ1ZlNpemUgPSA1MTI7CisKK0NQREZfTW9kdWxlTWdyOjpDUERGX01vZHVsZU1ncigpIDogbV9wQ29kZWNNb2R1bGUobnVsbHB0cikge30KKworQ1BERl9Nb2R1bGVNZ3I6On5DUERGX01vZHVsZU1ncigpIHt9CisKK3ZvaWQgQ1BERl9Nb2R1bGVNZ3I6OlNldFByaXZhdGVEYXRhKHZvaWQqIG1vZHVsZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2spIHsKKyAgbV9wcml2YXRlRGF0YS5TZXRQcml2YXRlRGF0YShtb2R1bGVfaWQsIHBEYXRhLCBjYWxsYmFjayk7CiB9Ci12b2lkIENQREZfTW9kdWxlTWdyOjpJbml0aWFsaXplKCkKLXsKLSAgICBJbml0TW9kdWxlcygpOwotICAgIG1fRmlsZUJ1ZlNpemUgPSA1MTI7Cit2b2lkKiBDUERGX01vZHVsZU1ncjo6R2V0UHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkKSB7CisgIHJldHVybiBtX3ByaXZhdGVEYXRhLkdldFByaXZhdGVEYXRhKG1vZHVsZV9pZCk7CiB9Ci12b2lkIENQREZfTW9kdWxlTWdyOjpJbml0TW9kdWxlcygpCi17Ci0gICAgbV9wQ29kZWNNb2R1bGUgPSBOVUxMOwotICAgIG1fcFBhZ2VNb2R1bGUgPSBuZXcgQ1BERl9QYWdlTW9kdWxlRGVmOwotICAgIG1fcFJlbmRlck1vZHVsZSA9IG5ldyBDUERGX1JlbmRlck1vZHVsZURlZjsKK0lDb2RlY19GYXhNb2R1bGUqIENQREZfTW9kdWxlTWdyOjpHZXRGYXhNb2R1bGUoKSB7CisgIHJldHVybiBtX3BDb2RlY01vZHVsZSA/IG1fcENvZGVjTW9kdWxlLT5HZXRGYXhNb2R1bGUoKSA6IE5VTEw7CiB9Ci1DUERGX01vZHVsZU1ncjo6fkNQREZfTW9kdWxlTWdyKCkKLXsKLSAgICBpZiAobV9wUGFnZU1vZHVsZSkgewotICAgICAgICBkZWxldGUgbV9wUGFnZU1vZHVsZTsKLSAgICB9Ci0gICAgaWYgKG1fcFJlbmRlck1vZHVsZSkgewotICAgICAgICBkZWxldGUgbV9wUmVuZGVyTW9kdWxlOwotICAgIH0KK0lDb2RlY19KcGVnTW9kdWxlKiBDUERGX01vZHVsZU1ncjo6R2V0SnBlZ01vZHVsZSgpIHsKKyAgcmV0dXJuIG1fcENvZGVjTW9kdWxlID8gbV9wQ29kZWNNb2R1bGUtPkdldEpwZWdNb2R1bGUoKSA6IE5VTEw7CiB9Ci12b2lkIENQREZfTW9kdWxlTWdyOjpTZXREb3dubG9hZENhbGxiYWNrKEZYX0JPT0wgKCpjYWxsYmFjaykoRlhfTFBDU1RSIG1vZHVsZV9uYW1lKSkKLXsKLSAgICBtX3BEb3dubG9hZENhbGxiYWNrID0gY2FsbGJhY2s7CitJQ29kZWNfSnB4TW9kdWxlKiBDUERGX01vZHVsZU1ncjo6R2V0SnB4TW9kdWxlKCkgeworICByZXR1cm4gbV9wQ29kZWNNb2R1bGUgPyBtX3BDb2RlY01vZHVsZS0+R2V0SnB4TW9kdWxlKCkgOiBOVUxMOwogfQotRlhfQk9PTCBDUERGX01vZHVsZU1ncjo6RG93bmxvYWRNb2R1bGUoRlhfTFBDU1RSIG1vZHVsZV9uYW1lKQotewotICAgIGlmIChtX3BEb3dubG9hZENhbGxiYWNrID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gbV9wRG93bmxvYWRDYWxsYmFjayhtb2R1bGVfbmFtZSk7CitJQ29kZWNfSmJpZzJNb2R1bGUqIENQREZfTW9kdWxlTWdyOjpHZXRKYmlnMk1vZHVsZSgpIHsKKyAgcmV0dXJuIG1fcENvZGVjTW9kdWxlID8gbV9wQ29kZWNNb2R1bGUtPkdldEpiaWcyTW9kdWxlKCkgOiBOVUxMOwogfQotdm9pZCBDUERGX01vZHVsZU1ncjo6Tm90aWZ5TW9kdWxlQXZhaWxhYmxlKEZYX0xQQ1NUUiBtb2R1bGVfbmFtZSkKLXsKLSAgICBpZiAoRlhTWVNfc3RyY21wKG1vZHVsZV9uYW1lLCBBRERJTl9OQU1FX0NKSykgPT0gMCkgewotICAgICAgICBtX3BQYWdlTW9kdWxlLT5Ob3RpZnlDSktBdmFpbGFibGUoKTsKLSAgICB9IGVsc2UgaWYgKEZYU1lTX3N0cmNtcChtb2R1bGVfbmFtZSwgQURESU5fTkFNRV9ERUNPREVSKSA9PSAwKSB7Ci0gICAgICAgIG1fcFJlbmRlck1vZHVsZS0+Tm90aWZ5RGVjb2RlckF2YWlsYWJsZSgpOwotICAgIH0KK0lDb2RlY19JY2NNb2R1bGUqIENQREZfTW9kdWxlTWdyOjpHZXRJY2NNb2R1bGUoKSB7CisgIHJldHVybiBtX3BDb2RlY01vZHVsZSA/IG1fcENvZGVjTW9kdWxlLT5HZXRJY2NNb2R1bGUoKSA6IE5VTEw7CiB9Ci12b2lkIENQREZfTW9kdWxlTWdyOjpSZWdpc3RlclNlY3VyaXR5SGFuZGxlcihGWF9MUENTVFIgZmlsdGVyLCBDUERGX1NlY3VyaXR5SGFuZGxlciAqICgqQ3JlYXRlSGFuZGxlcikodm9pZCogcGFyYW0pLCB2b2lkKiBwYXJhbSkKLXsKLSAgICBpZiAoQ3JlYXRlSGFuZGxlciA9PSBOVUxMKSB7Ci0gICAgICAgIG1fU2VjdXJpdHlIYW5kbGVyTWFwLlJlbW92ZUtleShmaWx0ZXIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fU2VjdXJpdHlIYW5kbGVyTWFwLlNldEF0KGZpbHRlciwgKHZvaWQqKUNyZWF0ZUhhbmRsZXIpOwotICAgIH0KLSAgICBpZiAocGFyYW0pIHsKLSAgICAgICAgbV9TZWN1cml0eUhhbmRsZXJNYXAuU2V0QXQoRlhfQlNUUkMoIl9wYXJhbV8iKSArIGZpbHRlciwgcGFyYW0pOwotICAgIH0KLX0KLXZvaWQgQ1BERl9Nb2R1bGVNZ3I6OlNldFByaXZhdGVEYXRhKEZYX0xQVk9JRCBtb2R1bGVfaWQsIEZYX0xQVk9JRCBwRGF0YSwgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2spCi17Ci0gICAgbV9wcml2YXRlRGF0YS5TZXRQcml2YXRlRGF0YShtb2R1bGVfaWQsIHBEYXRhLCBjYWxsYmFjayk7Ci19Ci1GWF9MUFZPSUQgQ1BERl9Nb2R1bGVNZ3I6OkdldFByaXZhdGVEYXRhKEZYX0xQVk9JRCBtb2R1bGVfaWQpCi17Ci0gICAgcmV0dXJuIG1fcHJpdmF0ZURhdGEuR2V0UHJpdmF0ZURhdGEobW9kdWxlX2lkKTsKLX0KLUNQREZfU2VjdXJpdHlIYW5kbGVyKiBDUERGX01vZHVsZU1ncjo6Q3JlYXRlU2VjdXJpdHlIYW5kbGVyKEZYX0xQQ1NUUiBmaWx0ZXIpCi17Ci0gICAgQ1BERl9TZWN1cml0eUhhbmRsZXIqICgqQ3JlYXRlSGFuZGxlcikodm9pZCopID0gTlVMTDsKLSAgICBpZiAoIW1fU2VjdXJpdHlIYW5kbGVyTWFwLkxvb2t1cChmaWx0ZXIsICh2b2lkKiYpQ3JlYXRlSGFuZGxlcikpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChDcmVhdGVIYW5kbGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHZvaWQqIHBhcmFtID0gTlVMTDsKLSAgICBtX1NlY3VyaXR5SGFuZGxlck1hcC5Mb29rdXAoRlhfQlNUUkMoIl9wYXJhbV8iKSArIGZpbHRlciwgcGFyYW0pOwotICAgIHJldHVybiBDcmVhdGVIYW5kbGVyKHBhcmFtKTsKLX0KLUlDb2RlY19GYXhNb2R1bGUqIENQREZfTW9kdWxlTWdyOjpHZXRGYXhNb2R1bGUoKQotewotICAgIHJldHVybiBtX3BDb2RlY01vZHVsZSA/IG1fcENvZGVjTW9kdWxlLT5HZXRGYXhNb2R1bGUoKSA6IE5VTEw7Ci19Ci1JQ29kZWNfSnBlZ01vZHVsZSogQ1BERl9Nb2R1bGVNZ3I6OkdldEpwZWdNb2R1bGUoKQotewotICAgIHJldHVybiBtX3BDb2RlY01vZHVsZSA/IG1fcENvZGVjTW9kdWxlLT5HZXRKcGVnTW9kdWxlKCkgOiBOVUxMOwotfQotSUNvZGVjX0pweE1vZHVsZSogQ1BERl9Nb2R1bGVNZ3I6OkdldEpweE1vZHVsZSgpCi17Ci0gICAgcmV0dXJuIG1fcENvZGVjTW9kdWxlID8gbV9wQ29kZWNNb2R1bGUtPkdldEpweE1vZHVsZSgpIDogTlVMTDsKLX0KLUlDb2RlY19KYmlnMk1vZHVsZSogQ1BERl9Nb2R1bGVNZ3I6OkdldEpiaWcyTW9kdWxlKCkKLXsKLSAgICByZXR1cm4gbV9wQ29kZWNNb2R1bGUgPyBtX3BDb2RlY01vZHVsZS0+R2V0SmJpZzJNb2R1bGUoKSA6IE5VTEw7Ci19Ci1JQ29kZWNfSWNjTW9kdWxlKiBDUERGX01vZHVsZU1ncjo6R2V0SWNjTW9kdWxlKCkKLXsKLSAgICByZXR1cm4gbV9wQ29kZWNNb2R1bGUgPyBtX3BDb2RlY01vZHVsZS0+R2V0SWNjTW9kdWxlKCkgOiBOVUxMOwotfQotSUNvZGVjX0ZsYXRlTW9kdWxlKiBDUERGX01vZHVsZU1ncjo6R2V0RmxhdGVNb2R1bGUoKQotewotICAgIHJldHVybiBtX3BDb2RlY01vZHVsZSA/IG1fcENvZGVjTW9kdWxlLT5HZXRGbGF0ZU1vZHVsZSgpIDogTlVMTDsKK0lDb2RlY19GbGF0ZU1vZHVsZSogQ1BERl9Nb2R1bGVNZ3I6OkdldEZsYXRlTW9kdWxlKCkgeworICByZXR1cm4gbV9wQ29kZWNNb2R1bGUgPyBtX3BDb2RlY01vZHVsZS0+R2V0RmxhdGVNb2R1bGUoKSA6IE5VTEw7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9BZG9iZS1DTlMxLVVDUzJfNS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9BZG9iZS1DTlMxLVVDUzJfNS5jcHAKaW5kZXggNTg5OWUyOC4uODYyODlmMyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvQWRvYmUtQ05TMS1VQ1MyXzUuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0Fkb2JlLUNOUzEtVUNTMl81LmNwcApAQCAtMSwyMzk0ICsxLDIxMzEgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0IGdfRlhDTUFQX0NOUzFDSUQyVW5pY29kZV81WzE5MDg4XSA9IHsKLSAgICAweEZGRkQsIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwKLSAgICAweDAwMjcsIDB4MDAyOCwgMHgwMDI5LCAweDAwMkEsIDB4MDAyQiwgMHgwMDJDLCAweDAwMkQsIDB4MDAyRSwKLSAgICAweDAwMkYsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwKLSAgICAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLCAweDAwM0QsIDB4MDAzRSwKLSAgICAweDAwM0YsIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwKLSAgICAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwKLSAgICAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwKLSAgICAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MDA1QiwgMHgwMDVDLCAweDAwNUQsIDB4MDA1RSwKLSAgICAweDAwNUYsIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwKLSAgICAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsIDB4MDA2RSwKLSAgICAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwKLSAgICAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDA3QiwgMHgwMDdDLCAweDAwN0QsIDB4MDA3RSwKLSAgICAweDAwQTksIDB4MjEyMiwgMHgyMDI2LCAweDMwMDAsIDB4RkYwQywgMHgzMDAxLCAweDMwMDIsIDB4RkYwRSwKLSAgICAweDIwMjcsIDB4RkYxQiwgMHhGRjFBLCAweEZGMUYsIDB4RkYwMSwgMHhGRTMwLCAweDIyRUYsIDB4MjAyNSwKLSAgICAweEZFNTAsIDB4RkU1MSwgMHhGRTUyLCAweDAwQjcsIDB4RkU1NCwgMHhGRTU1LCAweEZFNTYsIDB4RkU1NywKLSAgICAweEZGNUMsIDB4MjAxMywgMHhGRTMxLCAweDIwMTQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwKLSAgICAweEZGMDgsIDB4RkYwOSwgMHhGRTM1LCAweEZFMzYsIDB4RkY1QiwgMHhGRjVELCAweEZFMzcsIDB4RkUzOCwKLSAgICAweDMwMTQsIDB4MzAxNSwgMHhGRTM5LCAweEZFM0EsIDB4MzAxMCwgMHgzMDExLCAweEZFM0IsIDB4RkUzQywKLSAgICAweDMwMEEsIDB4MzAwQiwgMHhGRTNELCAweEZFM0UsIDB4MzAwOCwgMHgzMDA5LCAweEZFM0YsIDB4RkU0MCwKLSAgICAweDMwMEMsIDB4MzAwRCwgMHhGRTQxLCAweEZFNDIsIDB4MzAwRSwgMHgzMDBGLCAweEZFNDMsIDB4RkU0NCwKLSAgICAweEZFNTksIDB4RkU1QSwgMHhGRTVCLCAweEZFNUMsIDB4RkU1RCwgMHhGRTVFLCAweDIwMTgsIDB4MjAxOSwKLSAgICAweDIwMUMsIDB4MjAxRCwgMHgzMDFELCAweDMwMUUsIDB4MjAzNSwgMHgyMDMyLCAweEZGMDMsIDB4RkYwNiwKLSAgICAweEZGMEEsIDB4MjAzQiwgMHgwMEE3LCAweDMwMDMsIDB4MjVDQiwgMHgyNUNGLCAweDI1QjMsIDB4MjVCMiwKLSAgICAweDI1Q0UsIDB4MjYwNiwgMHgyNjA1LCAweDI1QzcsIDB4MjVDNiwgMHgyNUExLCAweDI1QTAsIDB4MjVCRCwKLSAgICAweDI1QkMsIDB4MzJBMywgMHgyMTA1LCAweDIwM0UsIDB4RkZFMywgMHhGRjNGLCAweDAyQ0QsIDB4RkU0OSwKLSAgICAweEZFNEEsIDB4RkU0RCwgMHhGRTRFLCAweEZFNEIsIDB4RkU0QywgMHhGRTVGLCAweEZFNjAsIDB4RkU2MSwKLSAgICAweEZGMEIsIDB4RkYwRCwgMHgwMEQ3LCAweDAwRjcsIDB4MDBCMSwgMHgyMjFBLCAweEZGMUMsIDB4RkYxRSwKLSAgICAweEZGMUQsIDB4MjI2NiwgMHgyMjY3LCAweDIyNjAsIDB4MjIxRSwgMHgyMjUyLCAweDIyNjEsIDB4RkU2MiwKLSAgICAweEZFNjMsIDB4RkU2NCwgMHhGRTY1LCAweEZFNjYsIDB4MjIzQywgMHgyMjI5LCAweDIyMkEsIDB4MjJBNSwKLSAgICAweDIyMjAsIDB4MjIxRiwgMHgyMkJGLCAweDMzRDIsIDB4MzNEMSwgMHgyMjJCLCAweDIyMkUsIDB4MjIzNSwKLSAgICAweDIyMzQsIDB4MjY0MCwgMHgyNjQyLCAweDIyOTUsIDB4MjYwOSwgMHgyMTkxLCAweDIxOTMsIDB4MjE5MiwKLSAgICAweDIxOTAsIDB4MjE5NiwgMHgyMTk3LCAweDIxOTksIDB4MjE5OCwgMHgyMjI1LCAweDIyMjMsIDB4RkYwRiwKLSAgICAweEZGM0MsIDB4RkYwRiwgMHhGRjNDLCAweEZGMDQsIDB4MDBBNSwgMHgzMDEyLCAweDAwQTIsIDB4MDBBMywKLSAgICAweEZGMDUsIDB4RkYyMCwgMHgyMTAzLCAweDIxMDksIDB4RkU2OSwgMHhGRTZBLCAweEZFNkIsIDB4MzNENSwKLSAgICAweDMzOUMsIDB4MzM5RCwgMHgzMzlFLCAweDMzQ0UsIDB4MzNBMSwgMHgzMzhFLCAweDMzOEYsIDB4MzNDNCwKLSAgICAweDAwQjAsIDB4NTE1OSwgMHg1MTVCLCAweDUxNUUsIDB4NTE1RCwgMHg1MTYxLCAweDUxNjMsIDB4NTVFNywKLSAgICAweDc0RTksIDB4N0NDRSwgMHgyNTgxLCAweDI1ODIsIDB4MjU4MywgMHgyNTg0LCAweDI1ODUsIDB4MjU4NiwKLSAgICAweDI1ODcsIDB4MjU4OCwgMHgyNThGLCAweDI1OEUsIDB4MjU4RCwgMHgyNThDLCAweDI1OEIsIDB4MjU4QSwKLSAgICAweDI1ODksIDB4MjUzQywgMHgyNTM0LCAweDI1MkMsIDB4MjUyNCwgMHgyNTFDLCAweDI1OTQsIDB4MjUwMCwKLSAgICAweDI1MDIsIDB4MjU5NSwgMHgyNTBDLCAweDI1MTAsIDB4MjUxNCwgMHgyNTE4LCAweDI1NkQsIDB4MjU2RSwKLSAgICAweDI1NzAsIDB4MjU2RiwgMHgyNTUwLCAweDI1NUUsIDB4MjU2QSwgMHgyNTYxLCAweDI1RTIsIDB4MjVFMywKLSAgICAweDI1RTUsIDB4MjVFNCwgMHgyNTcxLCAweDI1NzIsIDB4MjU3MywgMHhGRjEwLCAweEZGMTEsIDB4RkYxMiwKLSAgICAweEZGMTMsIDB4RkYxNCwgMHhGRjE1LCAweEZGMTYsIDB4RkYxNywgMHhGRjE4LCAweEZGMTksIDB4MjE2MCwKLSAgICAweDIxNjEsIDB4MjE2MiwgMHgyMTYzLCAweDIxNjQsIDB4MjE2NSwgMHgyMTY2LCAweDIxNjcsIDB4MjE2OCwKLSAgICAweDIxNjksIDB4MzAyMSwgMHgzMDIyLCAweDMwMjMsIDB4MzAyNCwgMHgzMDI1LCAweDMwMjYsIDB4MzAyNywKLSAgICAweDMwMjgsIDB4MzAyOSwgMHgzMDM4LCAweDUzNDQsIDB4MzAzQSwgMHhGRjIxLCAweEZGMjIsIDB4RkYyMywKLSAgICAweEZGMjQsIDB4RkYyNSwgMHhGRjI2LCAweEZGMjcsIDB4RkYyOCwgMHhGRjI5LCAweEZGMkEsIDB4RkYyQiwKLSAgICAweEZGMkMsIDB4RkYyRCwgMHhGRjJFLCAweEZGMkYsIDB4RkYzMCwgMHhGRjMxLCAweEZGMzIsIDB4RkYzMywKLSAgICAweEZGMzQsIDB4RkYzNSwgMHhGRjM2LCAweEZGMzcsIDB4RkYzOCwgMHhGRjM5LCAweEZGM0EsIDB4RkY0MSwKLSAgICAweEZGNDIsIDB4RkY0MywgMHhGRjQ0LCAweEZGNDUsIDB4RkY0NiwgMHhGRjQ3LCAweEZGNDgsIDB4RkY0OSwKLSAgICAweEZGNEEsIDB4RkY0QiwgMHhGRjRDLCAweEZGNEQsIDB4RkY0RSwgMHhGRjRGLCAweEZGNTAsIDB4RkY1MSwKLSAgICAweEZGNTIsIDB4RkY1MywgMHhGRjU0LCAweEZGNTUsIDB4RkY1NiwgMHhGRjU3LCAweEZGNTgsIDB4RkY1OSwKLSAgICAweEZGNUEsIDB4MDM5MSwgMHgwMzkyLCAweDAzOTMsIDB4MDM5NCwgMHgwMzk1LCAweDAzOTYsIDB4MDM5NywKLSAgICAweDAzOTgsIDB4MDM5OSwgMHgwMzlBLCAweDAzOUIsIDB4MDM5QywgMHgwMzlELCAweDAzOUUsIDB4MDM5RiwKLSAgICAweDAzQTAsIDB4MDNBMSwgMHgwM0EzLCAweDAzQTQsIDB4MDNBNSwgMHgwM0E2LCAweDAzQTcsIDB4MDNBOCwKLSAgICAweDAzQTksIDB4MDNCMSwgMHgwM0IyLCAweDAzQjMsIDB4MDNCNCwgMHgwM0I1LCAweDAzQjYsIDB4MDNCNywKLSAgICAweDAzQjgsIDB4MDNCOSwgMHgwM0JBLCAweDAzQkIsIDB4MDNCQywgMHgwM0JELCAweDAzQkUsIDB4MDNCRiwKLSAgICAweDAzQzAsIDB4MDNDMSwgMHgwM0MzLCAweDAzQzQsIDB4MDNDNSwgMHgwM0M2LCAweDAzQzcsIDB4MDNDOCwKLSAgICAweDAzQzksIDB4MzEwNSwgMHgzMTA2LCAweDMxMDcsIDB4MzEwOCwgMHgzMTA5LCAweDMxMEEsIDB4MzEwQiwKLSAgICAweDMxMEMsIDB4MzEwRCwgMHgzMTBFLCAweDMxMEYsIDB4MzExMCwgMHgzMTExLCAweDMxMTIsIDB4MzExMywKLSAgICAweDMxMTQsIDB4MzExNSwgMHgzMTE2LCAweDMxMTcsIDB4MzExOCwgMHgzMTE5LCAweDMxMUEsIDB4MzExQiwKLSAgICAweDMxMUMsIDB4MzExRCwgMHgzMTFFLCAweDMxMUYsIDB4MzEyMCwgMHgzMTIxLCAweDMxMjIsIDB4MzEyMywKLSAgICAweDMxMjQsIDB4MzEyNSwgMHgzMTI2LCAweDMxMjcsIDB4MzEyOCwgMHgzMTI5LCAweDAyRDksIDB4MDJDQSwKLSAgICAweDAyQzcsIDB4MDJDQiwgMHgyNDYwLCAweDI0NjEsIDB4MjQ2MiwgMHgyNDYzLCAweDI0NjQsIDB4MjQ2NSwKLSAgICAweDI0NjYsIDB4MjQ2NywgMHgyNDY4LCAweDI0NjksIDB4MjQ3NCwgMHgyNDc1LCAweDI0NzYsIDB4MjQ3NywKLSAgICAweDI0NzgsIDB4MjQ3OSwgMHgyNDdBLCAweDI0N0IsIDB4MjQ3QywgMHgyNDdELCAweDIxNzAsIDB4MjE3MSwKLSAgICAweDIxNzIsIDB4MjE3MywgMHgyMTc0LCAweDIxNzUsIDB4MjE3NiwgMHgyMTc3LCAweDIxNzgsIDB4MjE3OSwKLSAgICAweDRFMjgsIDB4NEUzNiwgMHg0RTNGLCAweDRFODUsIDB4NEVBMCwgMHg1MTgyLCAweDUxOTYsIDB4NTFBQiwKLSAgICAweDUyRjksIDB4NTMzOCwgMHg1MzY5LCAweDUzQjYsIDB4NTkwMiwgMHg1QjgwLCAweDVEREIsIDB4NUU3QSwKLSAgICAweDVFN0YsIDB4NUVGNCwgMHg1RjUwLCAweDVGNjEsIDB4NjUzNCwgMHg2NUUwLCAweDc1OTIsIDB4NzY3NiwKLSAgICAweDhGQjUsIDB4OTZCNiwgMHgyNDAwLCAweDI0MDEsIDB4MjQwMiwgMHgyNDAzLCAweDI0MDQsIDB4MjQwNSwKLSAgICAweDI0MDYsIDB4MjQwNywgMHgyNDA4LCAweDI0MDksIDB4MjQwQSwgMHgyNDBCLCAweDI0MEMsIDB4MjQwRCwKLSAgICAweDI0MEUsIDB4MjQwRiwgMHgyNDEwLCAweDI0MTEsIDB4MjQxMiwgMHgyNDEzLCAweDI0MTQsIDB4MjQxNSwKLSAgICAweDI0MTYsIDB4MjQxNywgMHgyNDE4LCAweDI0MTksIDB4MjQxQSwgMHgyNDFCLCAweDI0MUMsIDB4MjQxRCwKLSAgICAweDI0MUUsIDB4MjQxRiwgMHgyNDIxLCAweDRFMDAsIDB4NEU1OSwgMHg0RTAxLCAweDRFMDMsIDB4NEU0MywKLSAgICAweDRFNUQsIDB4NEU4NiwgMHg0RThDLCAweDRFQkEsIDB4NTEzRiwgMHg1MTY1LCAweDUxNkIsIDB4NTFFMCwKLSAgICAweDUyMDAsIDB4NTIwMSwgMHg1MjlCLCAweDUzMTUsIDB4NTM0MSwgMHg1MzVDLCAweDUzQzgsIDB4NEUwOSwKLSAgICAweDRFMEIsIDB4NEUwOCwgMHg0RTBBLCAweDRFMkIsIDB4NEUzOCwgMHg1MUUxLCAweDRFNDUsIDB4NEU0OCwKLSAgICAweDRFNUYsIDB4NEU1RSwgMHg0RThFLCAweDRFQTEsIDB4NTE0MCwgMHg1MjAzLCAweDUyRkEsIDB4NTM0MywKLSAgICAweDUzQzksIDB4NTNFMywgMHg1NzFGLCAweDU4RUIsIDB4NTkxNSwgMHg1OTI3LCAweDU5NzMsIDB4NUI1MCwKLSAgICAweDVCNTEsIDB4NUI1MywgMHg1QkY4LCAweDVDMEYsIDB4NUMyMiwgMHg1QzM4LCAweDVDNzEsIDB4NURERCwKLSAgICAweDVERTUsIDB4NURGMSwgMHg1REYyLCAweDVERjMsIDB4NURGRSwgMHg1RTcyLCAweDVFRkUsIDB4NUYwQiwKLSAgICAweDVGMTMsIDB4NjI0RCwgMHg0RTExLCAweDRFMTAsIDB4NEUwRCwgMHg0RTJELCAweDRFMzAsIDB4NEUzOSwKLSAgICAweDRFNEIsIDB4NUMzOSwgMHg0RTg4LCAweDRFOTEsIDB4NEU5NSwgMHg0RTkyLCAweDRFOTQsIDB4NEVBMiwKLSAgICAweDRFQzEsIDB4NEVDMCwgMHg0RUMzLCAweDRFQzYsIDB4NEVDNywgMHg0RUNELCAweDRFQ0EsIDB4NEVDQiwKLSAgICAweDRFQzQsIDB4NTE0MywgMHg1MTQxLCAweDUxNjcsIDB4NTE2RCwgMHg1MTZFLCAweDUxNkMsIDB4NTE5NywKLSAgICAweDUxRjYsIDB4NTIwNiwgMHg1MjA3LCAweDUyMDgsIDB4NTJGQiwgMHg1MkZFLCAweDUyRkYsIDB4NTMxNiwKLSAgICAweDUzMzksIDB4NTM0OCwgMHg1MzQ3LCAweDUzNDUsIDB4NTM1RSwgMHg1Mzg0LCAweDUzQ0IsIDB4NTNDQSwKLSAgICAweDUzQ0QsIDB4NThFQywgMHg1OTI5LCAweDU5MkIsIDB4NTkyQSwgMHg1OTJELCAweDVCNTQsIDB4NUMxMSwKLSAgICAweDVDMjQsIDB4NUMzQSwgMHg1QzZGLCAweDVERjQsIDB4NUU3QiwgMHg1RUZGLCAweDVGMTQsIDB4NUYxNSwKLSAgICAweDVGQzMsIDB4NjIwOCwgMHg2MjM2LCAweDYyNEIsIDB4NjI0RSwgMHg2NTJGLCAweDY1ODcsIDB4NjU5NywKLSAgICAweDY1QTQsIDB4NjVCOSwgMHg2NUU1LCAweDY2RjAsIDB4NjcwOCwgMHg2NzI4LCAweDZCMjAsIDB4NkI2MiwKLSAgICAweDZCNzksIDB4NkJDQiwgMHg2QkQ0LCAweDZCREIsIDB4NkMwRiwgMHg2QzM0LCAweDcwNkIsIDB4NzIyQSwKLSAgICAweDcyMzYsIDB4NzIzQiwgMHg3MjQ3LCAweDcyNTksIDB4NzI1QiwgMHg3MkFDLCAweDczOEIsIDB4NEUxOSwKLSAgICAweDRFMTYsIDB4NEUxNSwgMHg0RTE0LCAweDRFMTgsIDB4NEUzQiwgMHg0RTRELCAweDRFNEYsIDB4NEU0RSwKLSAgICAweDRFRTUsIDB4NEVEOCwgMHg0RUQ0LCAweDRFRDUsIDB4NEVENiwgMHg0RUQ3LCAweDRFRTMsIDB4NEVFNCwKLSAgICAweDRFRDksIDB4NEVERSwgMHg1MTQ1LCAweDUxNDQsIDB4NTE4OSwgMHg1MThBLCAweDUxQUMsIDB4NTFGOSwKLSAgICAweDUxRkEsIDB4NTFGOCwgMHg1MjBBLCAweDUyQTAsIDB4NTI5RiwgMHg1MzA1LCAweDUzMDYsIDB4NTMxNywKLSAgICAweDUzMUQsIDB4NEVERiwgMHg1MzRBLCAweDUzNDksIDB4NTM2MSwgMHg1MzYwLCAweDUzNkYsIDB4NTM2RSwKLSAgICAweDUzQkIsIDB4NTNFRiwgMHg1M0U0LCAweDUzRjMsIDB4NTNFQywgMHg1M0VFLCAweDUzRTksIDB4NTNFOCwKLSAgICAweDUzRkMsIDB4NTNGOCwgMHg1M0Y1LCAweDUzRUIsIDB4NTNFNiwgMHg1M0VBLCAweDUzRjIsIDB4NTNGMSwKLSAgICAweDUzRjAsIDB4NTNFNSwgMHg1M0VELCAweDUzRkIsIDB4NTZEQiwgMHg1NkRBLCAweDU5MTYsIDB4NTkyRSwKLSAgICAweDU5MzEsIDB4NTk3NCwgMHg1OTc2LCAweDVCNTUsIDB4NUI4MywgMHg1QzNDLCAweDVERTgsIDB4NURFNywKLSAgICAweDVERTYsIDB4NUUwMiwgMHg1RTAzLCAweDVFNzMsIDB4NUU3QywgMHg1RjAxLCAweDVGMTgsIDB4NUYxNywKLSAgICAweDVGQzUsIDB4NjIwQSwgMHg2MjUzLCAweDYyNTQsIDB4NjI1MiwgMHg2MjUxLCAweDY1QTUsIDB4NjVFNiwKLSAgICAweDY3MkUsIDB4NjcyQywgMHg2NzJBLCAweDY3MkIsIDB4NjcyRCwgMHg2QjYzLCAweDZCQ0QsIDB4NkMxMSwKLSAgICAweDZDMTAsIDB4NkMzOCwgMHg2QzQxLCAweDZDNDAsIDB4NkMzRSwgMHg3MkFGLCAweDczODQsIDB4NzM4OSwKLSAgICAweDc0REMsIDB4NzRFNiwgMHg3NTE4LCAweDc1MUYsIDB4NzUyOCwgMHg3NTI5LCAweDc1MzAsIDB4NzUzMSwKLSAgICAweDc1MzIsIDB4NzUzMywgMHg3NThCLCAweDc2N0QsIDB4NzZBRSwgMHg3NkJGLCAweDc2RUUsIDB4NzdEQiwKLSAgICAweDc3RTIsIDB4NzdGMywgMHg3OTNBLCAweDc5QkUsIDB4N0E3NCwgMHg3QUNCLCAweDRFMUUsIDB4NEUxRiwKLSAgICAweDRFNTIsIDB4NEU1MywgMHg0RTY5LCAweDRFOTksIDB4NEVBNCwgMHg0RUE2LCAweDRFQTUsIDB4NEVGRiwKLSAgICAweDRGMDksIDB4NEYxOSwgMHg0RjBBLCAweDRGMTUsIDB4NEYwRCwgMHg0RjEwLCAweDRGMTEsIDB4NEYwRiwKLSAgICAweDRFRjIsIDB4NEVGNiwgMHg0RUZCLCAweDRFRjAsIDB4NEVGMywgMHg0RUZELCAweDRGMDEsIDB4NEYwQiwKLSAgICAweDUxNDksIDB4NTE0NywgMHg1MTQ2LCAweDUxNDgsIDB4NTE2OCwgMHg1MTcxLCAweDUxOEQsIDB4NTFCMCwKLSAgICAweDUyMTcsIDB4NTIxMSwgMHg1MjEyLCAweDUyMEUsIDB4NTIxNiwgMHg1MkEzLCAweDUzMDgsIDB4NTMyMSwKLSAgICAweDUzMjAsIDB4NTM3MCwgMHg1MzcxLCAweDU0MDksIDB4NTQwRiwgMHg1NDBDLCAweDU0MEEsIDB4NTQxMCwKLSAgICAweDU0MDEsIDB4NTQwQiwgMHg1NDA0LCAweDU0MTEsIDB4NTQwRCwgMHg1NDA4LCAweDU0MDMsIDB4NTQwRSwKLSAgICAweDU0MDYsIDB4NTQxMiwgMHg1NkUwLCAweDU2REUsIDB4NTZERCwgMHg1NzMzLCAweDU3MzAsIDB4NTcyOCwKLSAgICAweDU3MkQsIDB4NTcyQywgMHg1NzJGLCAweDU3MjksIDB4NTkxOSwgMHg1OTFBLCAweDU5MzcsIDB4NTkzOCwKLSAgICAweDU5ODQsIDB4NTk3OCwgMHg1OTgzLCAweDU5N0QsIDB4NTk3OSwgMHg1OTgyLCAweDU5ODEsIDB4NUI1NywKLSAgICAweDVCNTgsIDB4NUI4NywgMHg1Qjg4LCAweDVCODUsIDB4NUI4OSwgMHg1QkZBLCAweDVDMTYsIDB4NUM3OSwKLSAgICAweDVEREUsIDB4NUUwNiwgMHg1RTc2LCAweDVFNzQsIDB4NUYwRiwgMHg1RjFCLCAweDVGRDksIDB4NUZENiwKLSAgICAweDYyMEUsIDB4NjIwQywgMHg2MjBELCAweDYyMTAsIDB4NjI2MywgMHg2MjVCLCAweDYyNTgsIDB4NjUzNiwKLSAgICAweDY1RTksIDB4NjVFOCwgMHg2NUVDLCAweDY1RUQsIDB4NjZGMiwgMHg2NkYzLCAweDY3MDksIDB4NjczRCwKLSAgICAweDY3MzQsIDB4NjczMSwgMHg2NzM1LCAweDZCMjEsIDB4NkI2NCwgMHg2QjdCLCAweDZDMTYsIDB4NkM1RCwKLSAgICAweDZDNTcsIDB4NkM1OSwgMHg2QzVGLCAweDZDNjAsIDB4NkM1MCwgMHg2QzU1LCAweDZDNjEsIDB4NkM1QiwKLSAgICAweDZDNEQsIDB4NkM0RSwgMHg3MDcwLCAweDcyNUYsIDB4NzI1RCwgMHg3NjdFLCAweDdBRjksIDB4N0M3MywKLSAgICAweDdDRjgsIDB4N0YzNiwgMHg3RjhBLCAweDdGQkQsIDB4ODAwMSwgMHg4MDAzLCAweDgwMEMsIDB4ODAxMiwKLSAgICAweDgwMzMsIDB4ODA3RiwgMHg4MDg5LCAweDgwOEIsIDB4ODA4QywgMHg4MUUzLCAweDgxRUEsIDB4ODFGMywKLSAgICAweDgxRkMsIDB4ODIwQywgMHg4MjFCLCAweDgyMUYsIDB4ODI2RSwgMHg4MjcyLCAweDgyN0UsIDB4ODY2QiwKLSAgICAweDg4NDAsIDB4ODg0QywgMHg4ODYzLCAweDg5N0YsIDB4OTYyMSwgMHg0RTMyLCAweDRFQTgsIDB4NEY0RCwKLSAgICAweDRGNEYsIDB4NEY0NywgMHg0RjU3LCAweDRGNUUsIDB4NEYzNCwgMHg0RjVCLCAweDRGNTUsIDB4NEYzMCwKLSAgICAweDRGNTAsIDB4NEY1MSwgMHg0RjNELCAweDRGM0EsIDB4NEYzOCwgMHg0RjQzLCAweDRGNTQsIDB4NEYzQywKLSAgICAweDRGNDYsIDB4NEY2MywgMHg0RjVDLCAweDRGNjAsIDB4NEYyRiwgMHg0RjRFLCAweDRGMzYsIDB4NEY1OSwKLSAgICAweDRGNUQsIDB4NEY0OCwgMHg0RjVBLCAweDUxNEMsIDB4NTE0QiwgMHg1MTRELCAweDUxNzUsIDB4NTFCNiwKLSAgICAweDUxQjcsIDB4NTIyNSwgMHg1MjI0LCAweDUyMjksIDB4NTIyQSwgMHg1MjI4LCAweDUyQUIsIDB4NTJBOSwKLSAgICAweDUyQUEsIDB4NTJBQywgMHg1MzIzLCAweDUzNzMsIDB4NTM3NSwgMHg1NDFELCAweDU0MkQsIDB4NTQxRSwKLSAgICAweDU0M0UsIDB4NTQyNiwgMHg1NDRFLCAweDU0MjcsIDB4NTQ0NiwgMHg1NDQzLCAweDU0MzMsIDB4NTQ0OCwKLSAgICAweDU0NDIsIDB4NTQxQiwgMHg1NDI5LCAweDU0NEEsIDB4NTQzOSwgMHg1NDNCLCAweDU0MzgsIDB4NTQyRSwKLSAgICAweDU0MzUsIDB4NTQzNiwgMHg1NDIwLCAweDU0M0MsIDB4NTQ0MCwgMHg1NDMxLCAweDU0MkIsIDB4NTQxRiwKLSAgICAweDU0MkMsIDB4NTZFQSwgMHg1NkYwLCAweDU2RTQsIDB4NTZFQiwgMHg1NzRBLCAweDU3NTEsIDB4NTc0MCwKLSAgICAweDU3NEQsIDB4NTc0NywgMHg1NzRFLCAweDU3M0UsIDB4NTc1MCwgMHg1NzRGLCAweDU3M0IsIDB4NThFRiwKLSAgICAweDU5M0UsIDB4NTk5RCwgMHg1OTkyLCAweDU5QTgsIDB4NTk5RSwgMHg1OUEzLCAweDU5OTksIDB4NTk5NiwKLSAgICAweDU5OEQsIDB4NTlBNCwgMHg1OTkzLCAweDU5OEEsIDB4NTlBNSwgMHg1QjVELCAweDVCNUMsIDB4NUI1QSwKLSAgICAweDVCNUIsIDB4NUI4QywgMHg1QjhCLCAweDVCOEYsIDB4NUMyQywgMHg1QzQwLCAweDVDNDEsIDB4NUMzRiwKLSAgICAweDVDM0UsIDB4NUM5MCwgMHg1QzkxLCAweDVDOTQsIDB4NUM4QywgMHg1REVCLCAweDVFMEMsIDB4NUU4RiwKLSAgICAweDVFODcsIDB4NUU4QSwgMHg1RUY3LCAweDVGMDQsIDB4NUYxRiwgMHg1RjY0LCAweDVGNjIsIDB4NUY3NywKLSAgICAweDVGNzksIDB4NUZEOCwgMHg1RkNDLCAweDVGRDcsIDB4NUZDRCwgMHg1RkYxLCAweDVGRUIsIDB4NUZGOCwKLSAgICAweDVGRUEsIDB4NjIxMiwgMHg2MjExLCAweDYyODQsIDB4NjI5NywgMHg2Mjk2LCAweDYyODAsIDB4NjI3NiwKLSAgICAweDYyODksIDB4NjI2RCwgMHg2MjhBLCAweDYyN0MsIDB4NjI3RSwgMHg2Mjc5LCAweDYyNzMsIDB4NjI5MiwKLSAgICAweDYyNkYsIDB4NjI5OCwgMHg2MjZFLCAweDYyOTUsIDB4NjI5MywgMHg2MjkxLCAweDYyODYsIDB4NjUzOSwKLSAgICAweDY1M0IsIDB4NjUzOCwgMHg2NUYxLCAweDY2RjQsIDB4Njc1RiwgMHg2NzRFLCAweDY3NEYsIDB4Njc1MCwKLSAgICAweDY3NTEsIDB4Njc1QywgMHg2NzU2LCAweDY3NUUsIDB4Njc0OSwgMHg2NzQ2LCAweDY3NjAsIDB4Njc1MywKLSAgICAweDY3NTcsIDB4NkI2NSwgMHg2QkNGLCAweDZDNDIsIDB4NkM1RSwgMHg2Qzk5LCAweDZDODEsIDB4NkM4OCwKLSAgICAweDZDODksIDB4NkM4NSwgMHg2QzlCLCAweDZDNkEsIDB4NkM3QSwgMHg2QzkwLCAweDZDNzAsIDB4NkM4QywKLSAgICAweDZDNjgsIDB4NkM5NiwgMHg2QzkyLCAweDZDN0QsIDB4NkM4MywgMHg2QzcyLCAweDZDN0UsIDB4NkM3NCwKLSAgICAweDZDODYsIDB4NkM3NiwgMHg2QzhELCAweDZDOTQsIDB4NkM5OCwgMHg2QzgyLCAweDcwNzYsIDB4NzA3QywKLSAgICAweDcwN0QsIDB4NzA3OCwgMHg3MjYyLCAweDcyNjEsIDB4NzI2MCwgMHg3MkM0LCAweDcyQzIsIDB4NzM5NiwKLSAgICAweDc1MkMsIDB4NzUyQiwgMHg3NTM3LCAweDc1MzgsIDB4NzY4MiwgMHg3NkVGLCAweDc3RTMsIDB4NzlDMSwKLSAgICAweDc5QzAsIDB4NzlCRiwgMHg3QTc2LCAweDdDRkIsIDB4N0Y1NSwgMHg4MDk2LCAweDgwOTMsIDB4ODA5RCwKLSAgICAweDgwOTgsIDB4ODA5QiwgMHg4MDlBLCAweDgwQjIsIDB4ODI2RiwgMHg4MjkyLCAweDgyOEIsIDB4ODI4RCwKLSAgICAweDg5OEIsIDB4ODlEMiwgMHg4QTAwLCAweDhDMzcsIDB4OEM0NiwgMHg4QzU1LCAweDhDOUQsIDB4OEQ2NCwKLSAgICAweDhENzAsIDB4OERCMywgMHg4RUFCLCAweDhFQ0EsIDB4OEY5QiwgMHg4RkIwLCAweDhGQzIsIDB4OEZDNiwKLSAgICAweDhGQzUsIDB4OEZDNCwgMHg1REUxLCAweDkwOTEsIDB4OTBBMiwgMHg5MEFBLCAweDkwQTYsIDB4OTBBMywKLSAgICAweDkxNDksIDB4OTFDNiwgMHg5MUNDLCAweDk2MzIsIDB4OTYyRSwgMHg5NjMxLCAweDk2MkEsIDB4OTYyQywKLSAgICAweDRFMjYsIDB4NEU1NiwgMHg0RTczLCAweDRFOEIsIDB4NEU5QiwgMHg0RTlFLCAweDRFQUIsIDB4NEVBQywKLSAgICAweDRGNkYsIDB4NEY5RCwgMHg0RjhELCAweDRGNzMsIDB4NEY3RiwgMHg0RjZDLCAweDRGOUIsIDB4NEY4QiwKLSAgICAweDRGODYsIDB4NEY4MywgMHg0RjcwLCAweDRGNzUsIDB4NEY4OCwgMHg0RjY5LCAweDRGN0IsIDB4NEY5NiwKLSAgICAweDRGN0UsIDB4NEY4RiwgMHg0RjkxLCAweDRGN0EsIDB4NTE1NCwgMHg1MTUyLCAweDUxNTUsIDB4NTE2OSwKLSAgICAweDUxNzcsIDB4NTE3NiwgMHg1MTc4LCAweDUxQkQsIDB4NTFGRCwgMHg1MjNCLCAweDUyMzgsIDB4NTIzNywKLSAgICAweDUyM0EsIDB4NTIzMCwgMHg1MjJFLCAweDUyMzYsIDB4NTI0MSwgMHg1MkJFLCAweDUyQkIsIDB4NTM1MiwKLSAgICAweDUzNTQsIDB4NTM1MywgMHg1MzUxLCAweDUzNjYsIDB4NTM3NywgMHg1Mzc4LCAweDUzNzksIDB4NTNENiwKLSAgICAweDUzRDQsIDB4NTNENywgMHg1NDczLCAweDU0NzUsIDB4NTQ5NiwgMHg1NDc4LCAweDU0OTUsIDB4NTQ4MCwKLSAgICAweDU0N0IsIDB4NTQ3NywgMHg1NDg0LCAweDU0OTIsIDB4NTQ4NiwgMHg1NDdDLCAweDU0OTAsIDB4NTQ3MSwKLSAgICAweDU0NzYsIDB4NTQ4QywgMHg1NDlBLCAweDU0NjIsIDB4NTQ2OCwgMHg1NDhCLCAweDU0N0QsIDB4NTQ4RSwKLSAgICAweDU2RkEsIDB4NTc4MywgMHg1Nzc3LCAweDU3NkEsIDB4NTc2OSwgMHg1NzYxLCAweDU3NjYsIDB4NTc2NCwKLSAgICAweDU3N0MsIDB4NTkxQywgMHg1OTQ5LCAweDU5NDcsIDB4NTk0OCwgMHg1OTQ0LCAweDU5NTQsIDB4NTlCRSwKLSAgICAweDU5QkIsIDB4NTlENCwgMHg1OUI5LCAweDU5QUUsIDB4NTlEMSwgMHg1OUM2LCAweDU5RDAsIDB4NTlDRCwKLSAgICAweDU5Q0IsIDB4NTlEMywgMHg1OUNBLCAweDU5QUYsIDB4NTlCMywgMHg1OUQyLCAweDU5QzUsIDB4NUI1RiwKLSAgICAweDVCNjQsIDB4NUI2MywgMHg1Qjk3LCAweDVCOUEsIDB4NUI5OCwgMHg1QjlDLCAweDVCOTksIDB4NUI5QiwKLSAgICAweDVDMUEsIDB4NUM0OCwgMHg1QzQ1LCAweDVDNDYsIDB4NUNCNywgMHg1Q0ExLCAweDVDQjgsIDB4NUNBOSwKLSAgICAweDVDQUIsIDB4NUNCMSwgMHg1Q0IzLCAweDVFMTgsIDB4NUUxQSwgMHg1RTE2LCAweDVFMTUsIDB4NUUxQiwKLSAgICAweDVFMTEsIDB4NUU3OCwgMHg1RTlBLCAweDVFOTcsIDB4NUU5QywgMHg1RTk1LCAweDVFOTYsIDB4NUVGNiwKLSAgICAweDVGMjYsIDB4NUYyNywgMHg1RjI5LCAweDVGODAsIDB4NUY4MSwgMHg1RjdGLCAweDVGN0MsIDB4NUZERCwKLSAgICAweDVGRTAsIDB4NUZGRCwgMHg1RkY1LCAweDVGRkYsIDB4NjAwRiwgMHg2MDE0LCAweDYwMkYsIDB4NjAzNSwKLSAgICAweDYwMTYsIDB4NjAyQSwgMHg2MDE1LCAweDYwMjEsIDB4NjAyNywgMHg2MDI5LCAweDYwMkIsIDB4NjAxQiwKLSAgICAweDYyMTYsIDB4NjIxNSwgMHg2MjNGLCAweDYyM0UsIDB4NjI0MCwgMHg2MjdGLCAweDYyQzksIDB4NjJDQywKLSAgICAweDYyQzQsIDB4NjJCRiwgMHg2MkMyLCAweDYyQjksIDB4NjJEMiwgMHg2MkRCLCAweDYyQUIsIDB4NjJEMywKLSAgICAweDYyRDQsIDB4NjJDQiwgMHg2MkM4LCAweDYyQTgsIDB4NjJCRCwgMHg2MkJDLCAweDYyRDAsIDB4NjJEOSwKLSAgICAweDYyQzcsIDB4NjJDRCwgMHg2MkI1LCAweDYyREEsIDB4NjJCMSwgMHg2MkQ4LCAweDYyRDYsIDB4NjJENywKLSAgICAweDYyQzYsIDB4NjJBQywgMHg2MkNFLCAweDY1M0UsIDB4NjVBNywgMHg2NUJDLCAweDY1RkEsIDB4NjYxNCwKLSAgICAweDY2MTMsIDB4NjYwQywgMHg2NjA2LCAweDY2MDIsIDB4NjYwRSwgMHg2NjAwLCAweDY2MEYsIDB4NjYxNSwKLSAgICAweDY2MEEsIDB4NjYwNywgMHg2NzBELCAweDY3MEIsIDB4Njc2RCwgMHg2NzhCLCAweDY3OTUsIDB4Njc3MSwKLSAgICAweDY3OUMsIDB4Njc3MywgMHg2Nzc3LCAweDY3ODcsIDB4Njc5RCwgMHg2Nzk3LCAweDY3NkYsIDB4Njc3MCwKLSAgICAweDY3N0YsIDB4Njc4OSwgMHg2NzdFLCAweDY3OTAsIDB4Njc3NSwgMHg2NzlBLCAweDY3OTMsIDB4Njc3QywKLSAgICAweDY3NkEsIDB4Njc3MiwgMHg2QjIzLCAweDZCNjYsIDB4NkI2NywgMHg2QjdGLCAweDZDMTMsIDB4NkMxQiwKLSAgICAweDZDRTMsIDB4NkNFOCwgMHg2Q0YzLCAweDZDQjEsIDB4NkNDQywgMHg2Q0U1LCAweDZDQjMsIDB4NkNCRCwKLSAgICAweDZDQkUsIDB4NkNCQywgMHg2Q0UyLCAweDZDQUIsIDB4NkNENSwgMHg2Q0QzLCAweDZDQjgsIDB4NkNDNCwKLSAgICAweDZDQjksIDB4NkNDMSwgMHg2Q0FFLCAweDZDRDcsIDB4NkNDNSwgMHg2Q0YxLCAweDZDQkYsIDB4NkNCQiwKLSAgICAweDZDRTEsIDB4NkNEQiwgMHg2Q0NBLCAweDZDQUMsIDB4NkNFRiwgMHg2Q0RDLCAweDZDRDYsIDB4NkNFMCwKLSAgICAweDcwOTUsIDB4NzA4RSwgMHg3MDkyLCAweDcwOEEsIDB4NzA5OSwgMHg3MjJDLCAweDcyMkQsIDB4NzIzOCwKLSAgICAweDcyNDgsIDB4NzI2NywgMHg3MjY5LCAweDcyQzAsIDB4NzJDRSwgMHg3MkQ5LCAweDcyRDcsIDB4NzJEMCwKLSAgICAweDczQTksIDB4NzNBOCwgMHg3MzlGLCAweDczQUIsIDB4NzNBNSwgMHg3NTNELCAweDc1OUQsIDB4NzU5OSwKLSAgICAweDc1OUEsIDB4NzY4NCwgMHg3NkMyLCAweDc2RjIsIDB4NzZGNCwgMHg3N0U1LCAweDc3RkQsIDB4NzkzRSwKLSAgICAweDc5NDAsIDB4Nzk0MSwgMHg3OUM5LCAweDc5QzgsIDB4N0E3QSwgMHg3QTc5LCAweDdBRkEsIDB4N0NGRSwKLSAgICAweDdGNTQsIDB4N0Y4QywgMHg3RjhCLCAweDgwMDUsIDB4ODBCQSwgMHg4MEE1LCAweDgwQTIsIDB4ODBCMSwKLSAgICAweDgwQTEsIDB4ODBBQiwgMHg4MEE5LCAweDgwQjQsIDB4ODBBQSwgMHg4MEFGLCAweDgxRTUsIDB4ODFGRSwKLSAgICAweDgyMEQsIDB4ODJCMywgMHg4MjlELCAweDgyOTksIDB4ODJBRCwgMHg4MkJELCAweDgyOUYsIDB4ODJCOSwKLSAgICAweDgyQjEsIDB4ODJBQywgMHg4MkE1LCAweDgyQUYsIDB4ODJCOCwgMHg4MkEzLCAweDgyQjAsIDB4ODJCRSwKLSAgICAweDgyQjcsIDB4ODY0RSwgMHg4NjcxLCAweDUyMUQsIDB4ODg2OCwgMHg4RUNCLCAweDhGQ0UsIDB4OEZENCwKLSAgICAweDhGRDEsIDB4OTBCNSwgMHg5MEI4LCAweDkwQjEsIDB4OTBCNiwgMHg5MUM3LCAweDkxRDEsIDB4OTU3NywKLSAgICAweDk1ODAsIDB4OTYxQywgMHg5NjQwLCAweDk2M0YsIDB4OTYzQiwgMHg5NjQ0LCAweDk2NDIsIDB4OTZCOSwKLSAgICAweDk2RTgsIDB4OTc1MiwgMHg5NzVFLCAweDRFOUYsIDB4NEVBRCwgMHg0RUFFLCAweDRGRTEsIDB4NEZCNSwKLSAgICAweDRGQUYsIDB4NEZCRiwgMHg0RkUwLCAweDRGRDEsIDB4NEZDRiwgMHg0RkRELCAweDRGQzMsIDB4NEZCNiwKLSAgICAweDRGRDgsIDB4NEZERiwgMHg0RkNBLCAweDRGRDcsIDB4NEZBRSwgMHg0RkQwLCAweDRGQzQsIDB4NEZDMiwKLSAgICAweDRGREEsIDB4NEZDRSwgMHg0RkRFLCAweDRGQjcsIDB4NTE1NywgMHg1MTkyLCAweDUxOTEsIDB4NTFBMCwKLSAgICAweDUyNEUsIDB4NTI0MywgMHg1MjRBLCAweDUyNEQsIDB4NTI0QywgMHg1MjRCLCAweDUyNDcsIDB4NTJDNywKLSAgICAweDUyQzksIDB4NTJDMywgMHg1MkMxLCAweDUzMEQsIDB4NTM1NywgMHg1MzdCLCAweDUzOUEsIDB4NTNEQiwKLSAgICAweDU0QUMsIDB4NTRDMCwgMHg1NEE4LCAweDU0Q0UsIDB4NTRDOSwgMHg1NEI4LCAweDU0QTYsIDB4NTRCMywKLSAgICAweDU0QzcsIDB4NTRDMiwgMHg1NEJELCAweDU0QUEsIDB4NTRDMSwgMHg1NEM0LCAweDU0QzgsIDB4NTRBRiwKLSAgICAweDU0QUIsIDB4NTRCMSwgMHg1NEJCLCAweDU0QTksIDB4NTRBNywgMHg1NEJGLCAweDU2RkYsIDB4NTc4MiwKLSAgICAweDU3OEIsIDB4NTdBMCwgMHg1N0EzLCAweDU3QTIsIDB4NTdDRSwgMHg1N0FFLCAweDU3OTMsIDB4NTk1NSwKLSAgICAweDU5NTEsIDB4NTk0RiwgMHg1OTRFLCAweDU5NTAsIDB4NTlEQywgMHg1OUQ4LCAweDU5RkYsIDB4NTlFMywKLSAgICAweDU5RTgsIDB4NUEwMywgMHg1OUU1LCAweDU5RUEsIDB4NTlEQSwgMHg1OUU2LCAweDVBMDEsIDB4NTlGQiwKLSAgICAweDVCNjksIDB4NUJBMywgMHg1QkE2LCAweDVCQTQsIDB4NUJBMiwgMHg1QkE1LCAweDVDMDEsIDB4NUM0RSwKLSAgICAweDVDNEYsIDB4NUM0RCwgMHg1QzRCLCAweDVDRDksIDB4NUNEMiwgMHg1REY3LCAweDVFMUQsIDB4NUUyNSwKLSAgICAweDVFMUYsIDB4NUU3RCwgMHg1RUEwLCAweDVFQTYsIDB4NUVGQSwgMHg1RjA4LCAweDVGMkQsIDB4NUY2NSwKLSAgICAweDVGODgsIDB4NUY4NSwgMHg1RjhBLCAweDVGOEIsIDB4NUY4NywgMHg1RjhDLCAweDVGODksIDB4NjAxMiwKLSAgICAweDYwMUQsIDB4NjAyMCwgMHg2MDI1LCAweDYwMEUsIDB4NjAyOCwgMHg2MDRELCAweDYwNzAsIDB4NjA2OCwKLSAgICAweDYwNjIsIDB4NjA0NiwgMHg2MDQzLCAweDYwNkMsIDB4NjA2QiwgMHg2MDZBLCAweDYwNjQsIDB4NjI0MSwKLSAgICAweDYyREMsIDB4NjMxNiwgMHg2MzA5LCAweDYyRkMsIDB4NjJFRCwgMHg2MzAxLCAweDYyRUUsIDB4NjJGRCwKLSAgICAweDYzMDcsIDB4NjJGMSwgMHg2MkY3LCAweDYyRUYsIDB4NjJFQywgMHg2MkZFLCAweDYyRjQsIDB4NjMxMSwKLSAgICAweDYzMDIsIDB4NjUzRiwgMHg2NTQ1LCAweDY1QUIsIDB4NjVCRCwgMHg2NUUyLCAweDY2MjUsIDB4NjYyRCwKLSAgICAweDY2MjAsIDB4NjYyNywgMHg2NjJGLCAweDY2MUYsIDB4NjYyOCwgMHg2NjMxLCAweDY2MjQsIDB4NjZGNywKLSAgICAweDY3RkYsIDB4NjdEMywgMHg2N0YxLCAweDY3RDQsIDB4NjdEMCwgMHg2N0VDLCAweDY3QjYsIDB4NjdBRiwKLSAgICAweDY3RjUsIDB4NjdFOSwgMHg2N0VGLCAweDY3QzQsIDB4NjdEMSwgMHg2N0I0LCAweDY3REEsIDB4NjdFNSwKLSAgICAweDY3QjgsIDB4NjdDRiwgMHg2N0RFLCAweDY3RjMsIDB4NjdCMCwgMHg2N0Q5LCAweDY3RTIsIDB4NjdERCwKLSAgICAweDY3RDIsIDB4NkI2QSwgMHg2QjgzLCAweDZCODYsIDB4NkJCNSwgMHg2QkQyLCAweDZCRDcsIDB4NkMxRiwKLSAgICAweDZDQzksIDB4NkQwQiwgMHg2RDMyLCAweDZEMkEsIDB4NkQ0MSwgMHg2RDI1LCAweDZEMEMsIDB4NkQzMSwKLSAgICAweDZEMUUsIDB4NkQxNywgMHg2RDNCLCAweDZEM0QsIDB4NkQzRSwgMHg2RDM2LCAweDZEMUIsIDB4NkNGNSwKLSAgICAweDZEMzksIDB4NkQyNywgMHg2RDM4LCAweDZEMjksIDB4NkQyRSwgMHg2RDM1LCAweDZEMEUsIDB4NkQyQiwKLSAgICAweDcwQUIsIDB4NzBCQSwgMHg3MEIzLCAweDcwQUMsIDB4NzBBRiwgMHg3MEFELCAweDcwQjgsIDB4NzBBRSwKLSAgICAweDcwQTQsIDB4NzIzMCwgMHg3MjcyLCAweDcyNkYsIDB4NzI3NCwgMHg3MkU5LCAweDcyRTAsIDB4NzJFMSwKLSAgICAweDczQjcsIDB4NzNDQSwgMHg3M0JCLCAweDczQjIsIDB4NzNDRCwgMHg3M0MwLCAweDczQjMsIDB4NzUxQSwKLSAgICAweDc1MkQsIDB4NzU0RiwgMHg3NTRDLCAweDc1NEUsIDB4NzU0QiwgMHg3NUFCLCAweDc1QTQsIDB4NzVBNSwKLSAgICAweDc1QTIsIDB4NzVBMywgMHg3Njc4LCAweDc2ODYsIDB4NzY4NywgMHg3Njg4LCAweDc2QzgsIDB4NzZDNiwKLSAgICAweDc2QzMsIDB4NzZDNSwgMHg3NzAxLCAweDc2RjksIDB4NzZGOCwgMHg3NzA5LCAweDc3MEIsIDB4NzZGRSwKLSAgICAweDc2RkMsIDB4NzcwNywgMHg3N0RDLCAweDc4MDIsIDB4NzgxNCwgMHg3ODBDLCAweDc4MEQsIDB4Nzk0NiwKLSAgICAweDc5NDksIDB4Nzk0OCwgMHg3OTQ3LCAweDc5QjksIDB4NzlCQSwgMHg3OUQxLCAweDc5RDIsIDB4NzlDQiwKLSAgICAweDdBN0YsIDB4N0E4MSwgMHg3QUZGLCAweDdBRkQsIDB4N0M3RCwgMHg3RDAyLCAweDdEMDUsIDB4N0QwMCwKLSAgICAweDdEMDksIDB4N0QwNywgMHg3RDA0LCAweDdEMDYsIDB4N0YzOCwgMHg3RjhFLCAweDdGQkYsIDB4ODAxMCwKLSAgICAweDgwMEQsIDB4ODAxMSwgMHg4MDM2LCAweDgwRDYsIDB4ODBFNSwgMHg4MERBLCAweDgwQzMsIDB4ODBDNCwKLSAgICAweDgwQ0MsIDB4ODBFMSwgMHg4MERCLCAweDgwQ0UsIDB4ODBERSwgMHg4MEU0LCAweDgwREQsIDB4ODFGNCwKLSAgICAweDgyMjIsIDB4ODJFNywgMHg4MzAzLCAweDgzMDUsIDB4ODJFMywgMHg4MkRCLCAweDgyRTYsIDB4ODMwNCwKLSAgICAweDgyRTUsIDB4ODMwMiwgMHg4MzA5LCAweDgyRDIsIDB4ODJENywgMHg4MkYxLCAweDgzMDEsIDB4ODJEQywKLSAgICAweDgyRDQsIDB4ODJEMSwgMHg4MkRFLCAweDgyRDMsIDB4ODJERiwgMHg4MkVGLCAweDgzMDYsIDB4ODY1MCwKLSAgICAweDg2NzksIDB4ODY3QiwgMHg4NjdBLCAweDg4NEQsIDB4ODg2QiwgMHg4OTgxLCAweDg5RDQsIDB4OEEwOCwKLSAgICAweDhBMDIsIDB4OEEwMywgMHg4QzlFLCAweDhDQTAsIDB4OEQ3NCwgMHg4RDczLCAweDhEQjQsIDB4OEVDRCwKLSAgICAweDhFQ0MsIDB4OEZGMCwgMHg4RkU2LCAweDhGRTIsIDB4OEZFQSwgMHg4RkU1LCAweDhGRUQsIDB4OEZFQiwKLSAgICAweDhGRTQsIDB4OEZFOCwgMHg5MENBLCAweDkwQ0UsIDB4OTBDMSwgMHg5MEMzLCAweDkxNEIsIDB4OTE0QSwKLSAgICAweDkxQ0QsIDB4OTU4MiwgMHg5NjUwLCAweDk2NEIsIDB4OTY0QywgMHg5NjRELCAweDk3NjIsIDB4OTc2OSwKLSAgICAweDk3Q0IsIDB4OTdFRCwgMHg5N0YzLCAweDk4MDEsIDB4OThBOCwgMHg5OERCLCAweDk4REYsIDB4OTk5NiwKLSAgICAweDk5OTksIDB4NEU1OCwgMHg0RUIzLCAweDUwMEMsIDB4NTAwRCwgMHg1MDIzLCAweDRGRUYsIDB4NTAyNiwKLSAgICAweDUwMjUsIDB4NEZGOCwgMHg1MDI5LCAweDUwMTYsIDB4NTAwNiwgMHg1MDNDLCAweDUwMUYsIDB4NTAxQSwKLSAgICAweDUwMTIsIDB4NTAxMSwgMHg0RkZBLCAweDUwMDAsIDB4NTAxNCwgMHg1MDI4LCAweDRGRjEsIDB4NTAyMSwKLSAgICAweDUwMEIsIDB4NTAxOSwgMHg1MDE4LCAweDRGRjMsIDB4NEZFRSwgMHg1MDJELCAweDUwMkEsIDB4NEZGRSwKLSAgICAweDUwMkIsIDB4NTAwOSwgMHg1MTdDLCAweDUxQTQsIDB4NTFBNSwgMHg1MUEyLCAweDUxQ0QsIDB4NTFDQywKLSAgICAweDUxQzYsIDB4NTFDQiwgMHg1MjU2LCAweDUyNUMsIDB4NTI1NCwgMHg1MjVCLCAweDUyNUQsIDB4NTMyQSwKLSAgICAweDUzN0YsIDB4NTM5RiwgMHg1MzlELCAweDUzREYsIDB4NTRFOCwgMHg1NTEwLCAweDU1MDEsIDB4NTUzNywKLSAgICAweDU0RkMsIDB4NTRFNSwgMHg1NEYyLCAweDU1MDYsIDB4NTRGQSwgMHg1NTE0LCAweDU0RTksIDB4NTRFRCwKLSAgICAweDU0RTEsIDB4NTUwOSwgMHg1NEVFLCAweDU0RUEsIDB4NTRFNiwgMHg1NTI3LCAweDU1MDcsIDB4NTRGRCwKLSAgICAweDU1MEYsIDB4NTcwMywgMHg1NzA0LCAweDU3QzIsIDB4NTdENCwgMHg1N0NCLCAweDU3QzMsIDB4NTgwOSwKLSAgICAweDU5MEYsIDB4NTk1NywgMHg1OTU4LCAweDU5NUEsIDB4NUExMSwgMHg1QTE4LCAweDVBMUMsIDB4NUExRiwKLSAgICAweDVBMUIsIDB4NUExMywgMHg1OUVDLCAweDVBMjAsIDB4NUEyMywgMHg1QTI5LCAweDVBMjUsIDB4NUEwQywKLSAgICAweDVBMDksIDB4NUI2QiwgMHg1QzU4LCAweDVCQjAsIDB4NUJCMywgMHg1QkI2LCAweDVCQjQsIDB4NUJBRSwKLSAgICAweDVCQjUsIDB4NUJCOSwgMHg1QkI4LCAweDVDMDQsIDB4NUM1MSwgMHg1QzU1LCAweDVDNTAsIDB4NUNFRCwKLSAgICAweDVDRkQsIDB4NUNGQiwgMHg1Q0VBLCAweDVDRTgsIDB4NUNGMCwgMHg1Q0Y2LCAweDVEMDEsIDB4NUNGNCwKLSAgICAweDVERUUsIDB4NUUyRCwgMHg1RTJCLCAweDVFQUIsIDB4NUVBRCwgMHg1RUE3LCAweDVGMzEsIDB4NUY5MiwKLSAgICAweDVGOTEsIDB4NUY5MCwgMHg2MDU5LCAweDYwNjMsIDB4NjA2NSwgMHg2MDUwLCAweDYwNTUsIDB4NjA2RCwKLSAgICAweDYwNjksIDB4NjA2RiwgMHg2MDg0LCAweDYwOUYsIDB4NjA5QSwgMHg2MDhELCAweDYwOTQsIDB4NjA4QywKLSAgICAweDYwODUsIDB4NjA5NiwgMHg2MjQ3LCAweDYyRjMsIDB4NjMwOCwgMHg2MkZGLCAweDYzNEUsIDB4NjMzRSwKLSAgICAweDYzMkYsIDB4NjM1NSwgMHg2MzQyLCAweDYzNDYsIDB4NjM0RiwgMHg2MzQ5LCAweDYzM0EsIDB4NjM1MCwKLSAgICAweDYzM0QsIDB4NjMyQSwgMHg2MzJCLCAweDYzMjgsIDB4NjM0RCwgMHg2MzRDLCAweDY1NDgsIDB4NjU0OSwKLSAgICAweDY1OTksIDB4NjVDMSwgMHg2NUM1LCAweDY2NDIsIDB4NjY0OSwgMHg2NjRGLCAweDY2NDMsIDB4NjY1MiwKLSAgICAweDY2NEMsIDB4NjY0NSwgMHg2NjQxLCAweDY2RjgsIDB4NjcxNCwgMHg2NzE1LCAweDY3MTcsIDB4NjgyMSwKLSAgICAweDY4MzgsIDB4Njg0OCwgMHg2ODQ2LCAweDY4NTMsIDB4NjgzOSwgMHg2ODQyLCAweDY4NTQsIDB4NjgyOSwKLSAgICAweDY4QjMsIDB4NjgxNywgMHg2ODRDLCAweDY4NTEsIDB4NjgzRCwgMHg2N0Y0LCAweDY4NTAsIDB4Njg0MCwKLSAgICAweDY4M0MsIDB4Njg0MywgMHg2ODJBLCAweDY4NDUsIDB4NjgxMywgMHg2ODE4LCAweDY4NDEsIDB4NkI4QSwKLSAgICAweDZCODksIDB4NkJCNywgMHg2QzIzLCAweDZDMjcsIDB4NkMyOCwgMHg2QzI2LCAweDZDMjQsIDB4NkNGMCwKLSAgICAweDZENkEsIDB4NkQ5NSwgMHg2RDg4LCAweDZEODcsIDB4NkQ2NiwgMHg2RDc4LCAweDZENzcsIDB4NkQ1OSwKLSAgICAweDZEOTMsIDB4NkQ2QywgMHg2RDg5LCAweDZENkUsIDB4NkQ1QSwgMHg2RDc0LCAweDZENjksIDB4NkQ4QywKLSAgICAweDZEOEEsIDB4NkQ3OSwgMHg2RDg1LCAweDZENjUsIDB4NkQ5NCwgMHg3MENBLCAweDcwRDgsIDB4NzBFNCwKLSAgICAweDcwRDksIDB4NzBDOCwgMHg3MENGLCAweDcyMzksIDB4NzI3OSwgMHg3MkZDLCAweDcyRjksIDB4NzJGRCwKLSAgICAweDcyRjgsIDB4NzJGNywgMHg3Mzg2LCAweDczRUQsIDB4NzQwOSwgMHg3M0VFLCAweDczRTAsIDB4NzNFQSwKLSAgICAweDczREUsIDB4NzU1NCwgMHg3NTVELCAweDc1NUMsIDB4NzU1QSwgMHg3NTU5LCAweDc1QkUsIDB4NzVDNSwKLSAgICAweDc1QzcsIDB4NzVCMiwgMHg3NUIzLCAweDc1QkQsIDB4NzVCQywgMHg3NUI5LCAweDc1QzIsIDB4NzVCOCwKLSAgICAweDc2OEIsIDB4NzZCMCwgMHg3NkNBLCAweDc2Q0QsIDB4NzZDRSwgMHg3NzI5LCAweDc3MUYsIDB4NzcyMCwKLSAgICAweDc3MjgsIDB4NzdFOSwgMHg3ODMwLCAweDc4MjcsIDB4NzgzOCwgMHg3ODFELCAweDc4MzQsIDB4NzgzNywKLSAgICAweDc4MjUsIDB4NzgyRCwgMHg3ODIwLCAweDc4MUYsIDB4NzgzMiwgMHg3OTU1LCAweDc5NTAsIDB4Nzk2MCwKLSAgICAweDc5NUYsIDB4Nzk1NiwgMHg3OTVFLCAweDc5NUQsIDB4Nzk1NywgMHg3OTVBLCAweDc5RTQsIDB4NzlFMywKLSAgICAweDc5RTcsIDB4NzlERiwgMHg3OUU2LCAweDc5RTksIDB4NzlEOCwgMHg3QTg0LCAweDdBODgsIDB4N0FEOSwKLSAgICAweDdCMDYsIDB4N0IxMSwgMHg3Qzg5LCAweDdEMjEsIDB4N0QxNywgMHg3RDBCLCAweDdEMEEsIDB4N0QyMCwKLSAgICAweDdEMjIsIDB4N0QxNCwgMHg3RDEwLCAweDdEMTUsIDB4N0QxQSwgMHg3RDFDLCAweDdEMEQsIDB4N0QxOSwKLSAgICAweDdEMUIsIDB4N0YzQSwgMHg3RjVGLCAweDdGOTQsIDB4N0ZDNSwgMHg3RkMxLCAweDgwMDYsIDB4ODAwNCwKLSAgICAweDgwMTgsIDB4ODAxNSwgMHg4MDE5LCAweDgwMTcsIDB4ODAzRCwgMHg4MDNGLCAweDgwRjEsIDB4ODEwMiwKLSAgICAweDgwRjAsIDB4ODEwNSwgMHg4MEVELCAweDgwRjQsIDB4ODEwNiwgMHg4MEY4LCAweDgwRjMsIDB4ODEwOCwKLSAgICAweDgwRkQsIDB4ODEwQSwgMHg4MEZDLCAweDgwRUYsIDB4ODFFRCwgMHg4MUVDLCAweDgyMDAsIDB4ODIxMCwKLSAgICAweDgyMkEsIDB4ODIyQiwgMHg4MjI4LCAweDgyMkMsIDB4ODJCQiwgMHg4MzJCLCAweDgzNTIsIDB4ODM1NCwKLSAgICAweDgzNEEsIDB4ODMzOCwgMHg4MzUwLCAweDgzNDksIDB4ODMzNSwgMHg4MzM0LCAweDgzNEYsIDB4ODMzMiwKLSAgICAweDgzMzksIDB4ODMzNiwgMHg4MzE3LCAweDgzNDAsIDB4ODMzMSwgMHg4MzI4LCAweDgzNDMsIDB4ODY1NCwKLSAgICAweDg2OEEsIDB4ODZBQSwgMHg4NjkzLCAweDg2QTQsIDB4ODZBOSwgMHg4NjhDLCAweDg2QTMsIDB4ODY5QywKLSAgICAweDg4NzAsIDB4ODg3NywgMHg4ODgxLCAweDg4ODIsIDB4ODg3RCwgMHg4ODc5LCAweDhBMTgsIDB4OEExMCwKLSAgICAweDhBMEUsIDB4OEEwQywgMHg4QTE1LCAweDhBMEEsIDB4OEExNywgMHg4QTEzLCAweDhBMTYsIDB4OEEwRiwKLSAgICAweDhBMTEsIDB4OEM0OCwgMHg4QzdBLCAweDhDNzksIDB4OENBMSwgMHg4Q0EyLCAweDhENzcsIDB4OEVBQywKLSAgICAweDhFRDIsIDB4OEVENCwgMHg4RUNGLCAweDhGQjEsIDB4OTAwMSwgMHg5MDA2LCAweDhGRjcsIDB4OTAwMCwKLSAgICAweDhGRkEsIDB4OEZGNCwgMHg5MDAzLCAweDhGRkQsIDB4OTAwNSwgMHg4RkY4LCAweDkwOTUsIDB4OTBFMSwKLSAgICAweDkwREQsIDB4OTBFMiwgMHg5MTUyLCAweDkxNEQsIDB4OTE0QywgMHg5MUQ4LCAweDkxREQsIDB4OTFENywKLSAgICAweDkxREMsIDB4OTFEOSwgMHg5NTgzLCAweDk2NjIsIDB4OTY2MywgMHg5NjYxLCAweDk2NUIsIDB4OTY1RCwKLSAgICAweDk2NjQsIDB4OTY1OCwgMHg5NjVFLCAweDk2QkIsIDB4OThFMiwgMHg5OUFDLCAweDlBQTgsIDB4OUFEOCwKLSAgICAweDlCMjUsIDB4OUIzMiwgMHg5QjNDLCAweDRFN0UsIDB4NTA3QSwgMHg1MDdELCAweDUwNUMsIDB4NTA0NywKLSAgICAweDUwNDMsIDB4NTA0QywgMHg1MDVBLCAweDUwNDksIDB4NTA2NSwgMHg1MDc2LCAweDUwNEUsIDB4NTA1NSwKLSAgICAweDUwNzUsIDB4NTA3NCwgMHg1MDc3LCAweDUwNEYsIDB4NTAwRiwgMHg1MDZGLCAweDUwNkQsIDB4NTE1QywKLSAgICAweDUxOTUsIDB4NTFGMCwgMHg1MjZBLCAweDUyNkYsIDB4NTJEMiwgMHg1MkQ5LCAweDUyRDgsIDB4NTJENSwKLSAgICAweDUzMTAsIDB4NTMwRiwgMHg1MzE5LCAweDUzM0YsIDB4NTM0MCwgMHg1MzNFLCAweDUzQzMsIDB4NjZGQywKLSAgICAweDU1NDYsIDB4NTU2QSwgMHg1NTY2LCAweDU1NDQsIDB4NTU1RSwgMHg1NTYxLCAweDU1NDMsIDB4NTU0QSwKLSAgICAweDU1MzEsIDB4NTU1NiwgMHg1NTRGLCAweDU1NTUsIDB4NTUyRiwgMHg1NTY0LCAweDU1MzgsIDB4NTUyRSwKLSAgICAweDU1NUMsIDB4NTUyQywgMHg1NTYzLCAweDU1MzMsIDB4NTU0MSwgMHg1NTU3LCAweDU3MDgsIDB4NTcwQiwKLSAgICAweDU3MDksIDB4NTdERiwgMHg1ODA1LCAweDU4MEEsIDB4NTgwNiwgMHg1N0UwLCAweDU3RTQsIDB4NTdGQSwKLSAgICAweDU4MDIsIDB4NTgzNSwgMHg1N0Y3LCAweDU3RjksIDB4NTkyMCwgMHg1OTYyLCAweDVBMzYsIDB4NUE0MSwKLSAgICAweDVBNDksIDB4NUE2NiwgMHg1QTZBLCAweDVBNDAsIDB4NUEzQywgMHg1QTYyLCAweDVBNUEsIDB4NUE0NiwKLSAgICAweDVBNEEsIDB4NUI3MCwgMHg1QkM3LCAweDVCQzUsIDB4NUJDNCwgMHg1QkMyLCAweDVCQkYsIDB4NUJDNiwKLSAgICAweDVDMDksIDB4NUMwOCwgMHg1QzA3LCAweDVDNjAsIDB4NUM1QywgMHg1QzVELCAweDVEMDcsIDB4NUQwNiwKLSAgICAweDVEMEUsIDB4NUQxQiwgMHg1RDE2LCAweDVEMjIsIDB4NUQxMSwgMHg1RDI5LCAweDVEMTQsIDB4NUQxOSwKLSAgICAweDVEMjQsIDB4NUQyNywgMHg1RDE3LCAweDVERTIsIDB4NUUzOCwgMHg1RTM2LCAweDVFMzMsIDB4NUUzNywKLSAgICAweDVFQjcsIDB4NUVCOCwgMHg1RUI2LCAweDVFQjUsIDB4NUVCRSwgMHg1RjM1LCAweDVGMzcsIDB4NUY1NywKLSAgICAweDVGNkMsIDB4NUY2OSwgMHg1RjZCLCAweDVGOTcsIDB4NUY5OSwgMHg1RjlFLCAweDVGOTgsIDB4NUZBMSwKLSAgICAweDVGQTAsIDB4NUY5QywgMHg2MDdGLCAweDYwQTMsIDB4NjA4OSwgMHg2MEEwLCAweDYwQTgsIDB4NjBDQiwKLSAgICAweDYwQjQsIDB4NjBFNiwgMHg2MEJELCAweDYwQzUsIDB4NjBCQiwgMHg2MEI1LCAweDYwREMsIDB4NjBCQywKLSAgICAweDYwRDgsIDB4NjBENSwgMHg2MEM2LCAweDYwREYsIDB4NjBCOCwgMHg2MERBLCAweDYwQzcsIDB4NjIxQSwKLSAgICAweDYyMUIsIDB4NjI0OCwgMHg2M0EwLCAweDYzQTcsIDB4NjM3MiwgMHg2Mzk2LCAweDYzQTIsIDB4NjNBNSwKLSAgICAweDYzNzcsIDB4NjM2NywgMHg2Mzk4LCAweDYzQUEsIDB4NjM3MSwgMHg2M0E5LCAweDYzODksIDB4NjM4MywKLSAgICAweDYzOUIsIDB4NjM2QiwgMHg2M0E4LCAweDYzODQsIDB4NjM4OCwgMHg2Mzk5LCAweDYzQTEsIDB4NjNBQywKLSAgICAweDYzOTIsIDB4NjM4RiwgMHg2MzgwLCAweDYzN0IsIDB4NjM2OSwgMHg2MzY4LCAweDYzN0EsIDB4NjU1RCwKLSAgICAweDY1NTYsIDB4NjU1MSwgMHg2NTU5LCAweDY1NTcsIDB4NTU1RiwgMHg2NTRGLCAweDY1NTgsIDB4NjU1NSwKLSAgICAweDY1NTQsIDB4NjU5QywgMHg2NTlCLCAweDY1QUMsIDB4NjVDRiwgMHg2NUNCLCAweDY1Q0MsIDB4NjVDRSwKLSAgICAweDY2NUQsIDB4NjY1QSwgMHg2NjY0LCAweDY2NjgsIDB4NjY2NiwgMHg2NjVFLCAweDY2RjksIDB4NTJENywKLSAgICAweDY3MUIsIDB4Njg4MSwgMHg2OEFGLCAweDY4QTIsIDB4Njg5MywgMHg2OEI1LCAweDY4N0YsIDB4Njg3NiwKLSAgICAweDY4QjEsIDB4NjhBNywgMHg2ODk3LCAweDY4QjAsIDB4Njg4MywgMHg2OEM0LCAweDY4QUQsIDB4Njg4NiwKLSAgICAweDY4ODUsIDB4Njg5NCwgMHg2ODlELCAweDY4QTgsIDB4Njg5RiwgMHg2OEExLCAweDY4ODIsIDB4NkIzMiwKLSAgICAweDZCQkEsIDB4NkJFQiwgMHg2QkVDLCAweDZDMkIsIDB4NkQ4RSwgMHg2REJDLCAweDZERjMsIDB4NkREOSwKLSAgICAweDZEQjIsIDB4NkRFMSwgMHg2RENDLCAweDZERTQsIDB4NkRGQiwgMHg2REZBLCAweDZFMDUsIDB4NkRDNywKLSAgICAweDZEQ0IsIDB4NkRBRiwgMHg2REQxLCAweDZEQUUsIDB4NkRERSwgMHg2REY5LCAweDZEQjgsIDB4NkRGNywKLSAgICAweDZERjUsIDB4NkRDNSwgMHg2REQyLCAweDZFMUEsIDB4NkRCNSwgMHg2RERBLCAweDZERUIsIDB4NkREOCwKLSAgICAweDZERUEsIDB4NkRGMSwgMHg2REVFLCAweDZERTgsIDB4NkRDNiwgMHg2REM0LCAweDZEQUEsIDB4NkRFQywKLSAgICAweDZEQkYsIDB4NkRFNiwgMHg3MEY5LCAweDcxMDksIDB4NzEwQSwgMHg3MEZELCAweDcwRUYsIDB4NzIzRCwKLSAgICAweDcyN0QsIDB4NzI4MSwgMHg3MzFDLCAweDczMUIsIDB4NzMxNiwgMHg3MzEzLCAweDczMTksIDB4NzM4NywKLSAgICAweDc0MDUsIDB4NzQwQSwgMHg3NDAzLCAweDc0MDYsIDB4NzNGRSwgMHg3NDBELCAweDc0RTAsIDB4NzRGNiwKLSAgICAweDc0RjcsIDB4NzUxQywgMHg3NTIyLCAweDc1NjUsIDB4NzU2NiwgMHg3NTYyLCAweDc1NzAsIDB4NzU4RiwKLSAgICAweDc1RDQsIDB4NzVENSwgMHg3NUI1LCAweDc1Q0EsIDB4NzVDRCwgMHg3NjhFLCAweDc2RDQsIDB4NzZEMiwKLSAgICAweDc2REIsIDB4NzczNywgMHg3NzNFLCAweDc3M0MsIDB4NzczNiwgMHg3NzM4LCAweDc3M0EsIDB4Nzg2QiwKLSAgICAweDc4NDMsIDB4Nzg0RSwgMHg3OTY1LCAweDc5NjgsIDB4Nzk2RCwgMHg3OUZCLCAweDdBOTIsIDB4N0E5NSwKLSAgICAweDdCMjAsIDB4N0IyOCwgMHg3QjFCLCAweDdCMkMsIDB4N0IyNiwgMHg3QjE5LCAweDdCMUUsIDB4N0IyRSwKLSAgICAweDdDOTIsIDB4N0M5NywgMHg3Qzk1LCAweDdENDYsIDB4N0Q0MywgMHg3RDcxLCAweDdEMkUsIDB4N0QzOSwKLSAgICAweDdEM0MsIDB4N0Q0MCwgMHg3RDMwLCAweDdEMzMsIDB4N0Q0NCwgMHg3RDJGLCAweDdENDIsIDB4N0QzMiwKLSAgICAweDdEMzEsIDB4N0YzRCwgMHg3RjlFLCAweDdGOUEsIDB4N0ZDQywgMHg3RkNFLCAweDdGRDIsIDB4ODAxQywKLSAgICAweDgwNEEsIDB4ODA0NiwgMHg4MTJGLCAweDgxMTYsIDB4ODEyMywgMHg4MTJCLCAweDgxMjksIDB4ODEzMCwKLSAgICAweDgxMjQsIDB4ODIwMiwgMHg4MjM1LCAweDgyMzcsIDB4ODIzNiwgMHg4MjM5LCAweDgzOEUsIDB4ODM5RSwKLSAgICAweDgzOTgsIDB4ODM3OCwgMHg4M0EyLCAweDgzOTYsIDB4ODNCRCwgMHg4M0FCLCAweDgzOTIsIDB4ODM4QSwKLSAgICAweDgzOTMsIDB4ODM4OSwgMHg4M0EwLCAweDgzNzcsIDB4ODM3QiwgMHg4MzdDLCAweDgzODYsIDB4ODNBNywKLSAgICAweDg2NTUsIDB4NUY2QSwgMHg4NkM3LCAweDg2QzAsIDB4ODZCNiwgMHg4NkM0LCAweDg2QjUsIDB4ODZDNiwKLSAgICAweDg2Q0IsIDB4ODZCMSwgMHg4NkFGLCAweDg2QzksIDB4ODg1MywgMHg4ODlFLCAweDg4ODgsIDB4ODhBQiwKLSAgICAweDg4OTIsIDB4ODg5NiwgMHg4ODhELCAweDg4OEIsIDB4ODk5MywgMHg4OThGLCAweDhBMkEsIDB4OEExRCwKLSAgICAweDhBMjMsIDB4OEEyNSwgMHg4QTMxLCAweDhBMkQsIDB4OEExRiwgMHg4QTFCLCAweDhBMjIsIDB4OEM0OSwKLSAgICAweDhDNUEsIDB4OENBOSwgMHg4Q0FDLCAweDhDQUIsIDB4OENBOCwgMHg4Q0FBLCAweDhDQTcsIDB4OEQ2NywKLSAgICAweDhENjYsIDB4OERCRSwgMHg4REJBLCAweDhFREIsIDB4OEVERiwgMHg5MDE5LCAweDkwMEQsIDB4OTAxQSwKLSAgICAweDkwMTcsIDB4OTAyMywgMHg5MDFGLCAweDkwMUQsIDB4OTAxMCwgMHg5MDE1LCAweDkwMUUsIDB4OTAyMCwKLSAgICAweDkwMEYsIDB4OTAyMiwgMHg5MDE2LCAweDkwMUIsIDB4OTAxNCwgMHg5MEU4LCAweDkwRUQsIDB4OTBGRCwKLSAgICAweDkxNTcsIDB4OTFDRSwgMHg5MUY1LCAweDkxRTYsIDB4OTFFMywgMHg5MUU3LCAweDkxRUQsIDB4OTFFOSwKLSAgICAweDk1ODksIDB4OTY2QSwgMHg5Njc1LCAweDk2NzMsIDB4OTY3OCwgMHg5NjcwLCAweDk2NzQsIDB4OTY3NiwKLSAgICAweDk2NzcsIDB4OTY2QywgMHg5NkMwLCAweDk2RUEsIDB4OTZFOSwgMHg3QUUwLCAweDdBREYsIDB4OTgwMiwKLSAgICAweDk4MDMsIDB4OUI1QSwgMHg5Q0U1LCAweDlFNzUsIDB4OUU3RiwgMHg5RUE1LCAweDlFQkIsIDB4NTBBMiwKLSAgICAweDUwOEQsIDB4NTA4NSwgMHg1MDk5LCAweDUwOTEsIDB4NTA4MCwgMHg1MDk2LCAweDUwOTgsIDB4NTA5QSwKLSAgICAweDY3MDAsIDB4NTFGMSwgMHg1MjcyLCAweDUyNzQsIDB4NTI3NSwgMHg1MjY5LCAweDUyREUsIDB4NTJERCwKLSAgICAweDUyREIsIDB4NTM1QSwgMHg1M0E1LCAweDU1N0IsIDB4NTU4MCwgMHg1NUE3LCAweDU1N0MsIDB4NTU4QSwKLSAgICAweDU1OUQsIDB4NTU5OCwgMHg1NTgyLCAweDU1OUMsIDB4NTVBQSwgMHg1NTk0LCAweDU1ODcsIDB4NTU4QiwKLSAgICAweDU1ODMsIDB4NTVCMywgMHg1NUFFLCAweDU1OUYsIDB4NTUzRSwgMHg1NUIyLCAweDU1OUEsIDB4NTVCQiwKLSAgICAweDU1QUMsIDB4NTVCMSwgMHg1NTdFLCAweDU1ODksIDB4NTVBQiwgMHg1NTk5LCAweDU3MEQsIDB4NTgyRiwKLSAgICAweDU4MkEsIDB4NTgzNCwgMHg1ODI0LCAweDU4MzAsIDB4NTgzMSwgMHg1ODIxLCAweDU4MUQsIDB4NTgyMCwKLSAgICAweDU4RjksIDB4NThGQSwgMHg1OTYwLCAweDVBNzcsIDB4NUE5QSwgMHg1QTdGLCAweDVBOTIsIDB4NUE5QiwKLSAgICAweDVBQTcsIDB4NUI3MywgMHg1QjcxLCAweDVCRDIsIDB4NUJDQywgMHg1QkQzLCAweDVCRDAsIDB4NUMwQSwKLSAgICAweDVDMEIsIDB4NUMzMSwgMHg1RDRDLCAweDVENTAsIDB4NUQzNCwgMHg1RDQ3LCAweDVERkQsIDB4NUU0NSwKLSAgICAweDVFM0QsIDB4NUU0MCwgMHg1RTQzLCAweDVFN0UsIDB4NUVDQSwgMHg1RUMxLCAweDVFQzIsIDB4NUVDNCwKLSAgICAweDVGM0MsIDB4NUY2RCwgMHg1RkE5LCAweDVGQUEsIDB4NUZBOCwgMHg2MEQxLCAweDYwRTEsIDB4NjBCMiwKLSAgICAweDYwQjYsIDB4NjBFMCwgMHg2MTFDLCAweDYxMjMsIDB4NjBGQSwgMHg2MTE1LCAweDYwRjAsIDB4NjBGQiwKLSAgICAweDYwRjQsIDB4NjE2OCwgMHg2MEYxLCAweDYxMEUsIDB4NjBGNiwgMHg2MTA5LCAweDYxMDAsIDB4NjExMiwKLSAgICAweDYyMUYsIDB4NjI0OSwgMHg2M0EzLCAweDYzOEMsIDB4NjNDRiwgMHg2M0MwLCAweDYzRTksIDB4NjNDOSwKLSAgICAweDYzQzYsIDB4NjNDRCwgMHg2M0QyLCAweDYzRTMsIDB4NjNEMCwgMHg2M0UxLCAweDYzRDYsIDB4NjNFRCwKLSAgICAweDYzRUUsIDB4NjM3NiwgMHg2M0Y0LCAweDYzRUEsIDB4NjNEQiwgMHg2NDUyLCAweDYzREEsIDB4NjNGOSwKLSAgICAweDY1NUUsIDB4NjU2NiwgMHg2NTYyLCAweDY1NjMsIDB4NjU5MSwgMHg2NTkwLCAweDY1QUYsIDB4NjY2RSwKLSAgICAweDY2NzAsIDB4NjY3NCwgMHg2Njc2LCAweDY2NkYsIDB4NjY5MSwgMHg2NjdBLCAweDY2N0UsIDB4NjY3NywKLSAgICAweDY2RkUsIDB4NjZGRiwgMHg2NzFGLCAweDY3MUQsIDB4NjhGQSwgMHg2OEQ1LCAweDY4RTAsIDB4NjhEOCwKLSAgICAweDY4RDcsIDB4NjkwNSwgMHg2OERGLCAweDY4RjUsIDB4NjhFRSwgMHg2OEU3LCAweDY4RjksIDB4NjhEMiwKLSAgICAweDY4RjIsIDB4NjhFMywgMHg2OENCLCAweDY4Q0QsIDB4NjkwRCwgMHg2OTEyLCAweDY5MEUsIDB4NjhDOSwKLSAgICAweDY4REEsIDB4Njk2RSwgMHg2OEZCLCAweDZCM0UsIDB4NkIzQSwgMHg2QjNELCAweDZCOTgsIDB4NkI5NiwKLSAgICAweDZCQkMsIDB4NkJFRiwgMHg2QzJFLCAweDZDMkYsIDB4NkMyQywgMHg2RTJGLCAweDZFMzgsIDB4NkU1NCwKLSAgICAweDZFMjEsIDB4NkUzMiwgMHg2RTY3LCAweDZFNEEsIDB4NkUyMCwgMHg2RTI1LCAweDZFMjMsIDB4NkUxQiwKLSAgICAweDZFNUIsIDB4NkU1OCwgMHg2RTI0LCAweDZFNTYsIDB4NkU2RSwgMHg2RTJELCAweDZFMjYsIDB4NkU2RiwKLSAgICAweDZFMzQsIDB4NkU0RCwgMHg2RTNBLCAweDZFMkMsIDB4NkU0MywgMHg2RTFELCAweDZFM0UsIDB4NkVDQiwKLSAgICAweDZFODksIDB4NkUxOSwgMHg2RTRFLCAweDZFNjMsIDB4NkU0NCwgMHg2RTcyLCAweDZFNjksIDB4NkU1RiwKLSAgICAweDcxMTksIDB4NzExQSwgMHg3MTI2LCAweDcxMzAsIDB4NzEyMSwgMHg3MTM2LCAweDcxNkUsIDB4NzExQywKLSAgICAweDcyNEMsIDB4NzI4NCwgMHg3MjgwLCAweDczMzYsIDB4NzMyNSwgMHg3MzM0LCAweDczMjksIDB4NzQzQSwKLSAgICAweDc0MkEsIDB4NzQzMywgMHg3NDIyLCAweDc0MjUsIDB4NzQzNSwgMHg3NDM2LCAweDc0MzQsIDB4NzQyRiwKLSAgICAweDc0MUIsIDB4NzQyNiwgMHg3NDI4LCAweDc1MjUsIDB4NzUyNiwgMHg3NTZCLCAweDc1NkEsIDB4NzVFMiwKLSAgICAweDc1REIsIDB4NzVFMywgMHg3NUQ5LCAweDc1RDgsIDB4NzVERSwgMHg3NUUwLCAweDc2N0IsIDB4NzY3QywKLSAgICAweDc2OTYsIDB4NzY5MywgMHg3NkI0LCAweDc2REMsIDB4Nzc0RiwgMHg3N0VELCAweDc4NUQsIDB4Nzg2QywKLSAgICAweDc4NkYsIDB4N0EwRCwgMHg3QTA4LCAweDdBMEIsIDB4N0EwNSwgMHg3QTAwLCAweDdBOTgsIDB4N0E5NywKLSAgICAweDdBOTYsIDB4N0FFNSwgMHg3QUUzLCAweDdCNDksIDB4N0I1NiwgMHg3QjQ2LCAweDdCNTAsIDB4N0I1MiwKLSAgICAweDdCNTQsIDB4N0I0RCwgMHg3QjRCLCAweDdCNEYsIDB4N0I1MSwgMHg3QzlGLCAweDdDQTUsIDB4N0Q1RSwKLSAgICAweDdENTAsIDB4N0Q2OCwgMHg3RDU1LCAweDdEMkIsIDB4N0Q2RSwgMHg3RDcyLCAweDdENjEsIDB4N0Q2NiwKLSAgICAweDdENjIsIDB4N0Q3MCwgMHg3RDczLCAweDU1ODQsIDB4N0ZENCwgMHg3RkQ1LCAweDgwMEIsIDB4ODA1MiwKLSAgICAweDgwODUsIDB4ODE1NSwgMHg4MTU0LCAweDgxNEIsIDB4ODE1MSwgMHg4MTRFLCAweDgxMzksIDB4ODE0NiwKLSAgICAweDgxM0UsIDB4ODE0QywgMHg4MTUzLCAweDgxNzQsIDB4ODIxMiwgMHg4MjFDLCAweDgzRTksIDB4ODQwMywKLSAgICAweDgzRjgsIDB4ODQwRCwgMHg4M0UwLCAweDgzQzUsIDB4ODQwQiwgMHg4M0MxLCAweDgzRUYsIDB4ODNGMSwKLSAgICAweDgzRjQsIDB4ODQ1NywgMHg4NDBBLCAweDgzRjAsIDB4ODQwQywgMHg4M0NDLCAweDgzRkQsIDB4ODNGMiwKLSAgICAweDgzQ0EsIDB4ODQzOCwgMHg4NDBFLCAweDg0MDQsIDB4ODNEQywgMHg4NDA3LCAweDgzRDQsIDB4ODNERiwKLSAgICAweDg2NUIsIDB4ODZERiwgMHg4NkQ5LCAweDg2RUQsIDB4ODZENCwgMHg4NkRCLCAweDg2RTQsIDB4ODZEMCwKLSAgICAweDg2REUsIDB4ODg1NywgMHg4OEMxLCAweDg4QzIsIDB4ODhCMSwgMHg4OTgzLCAweDg5OTYsIDB4OEEzQiwKLSAgICAweDhBNjAsIDB4OEE1NSwgMHg4QTVFLCAweDhBM0MsIDB4OEE0MSwgMHg4QTU0LCAweDhBNUIsIDB4OEE1MCwKLSAgICAweDhBNDYsIDB4OEEzNCwgMHg4QTNBLCAweDhBMzYsIDB4OEE1NiwgMHg4QzYxLCAweDhDODIsIDB4OENBRiwKLSAgICAweDhDQkMsIDB4OENCMywgMHg4Q0JELCAweDhDQzEsIDB4OENCQiwgMHg4Q0MwLCAweDhDQjQsIDB4OENCNywKLSAgICAweDhDQjYsIDB4OENCRiwgMHg4Q0I4LCAweDhEOEEsIDB4OEQ4NSwgMHg4RDgxLCAweDhEQ0UsIDB4OERERCwKLSAgICAweDhEQ0IsIDB4OEREQSwgMHg4REQxLCAweDhEQ0MsIDB4OEREQiwgMHg4REM2LCAweDhFRkIsIDB4OEVGOCwKLSAgICAweDhFRkMsIDB4OEY5QywgMHg5MDJFLCAweDkwMzUsIDB4OTAzMSwgMHg5MDM4LCAweDkwMzIsIDB4OTAzNiwKLSAgICAweDkxMDIsIDB4OTBGNSwgMHg5MTA5LCAweDkwRkUsIDB4OTE2MywgMHg5MTY1LCAweDkxQ0YsIDB4OTIxNCwKLSAgICAweDkyMTUsIDB4OTIyMywgMHg5MjA5LCAweDkyMUUsIDB4OTIwRCwgMHg5MjEwLCAweDkyMDcsIDB4OTIxMSwKLSAgICAweDk1OTQsIDB4OTU4RiwgMHg5NThCLCAweDk1OTEsIDB4OTU5MywgMHg5NTkyLCAweDk1OEUsIDB4OTY4QSwKLSAgICAweDk2OEUsIDB4OTY4QiwgMHg5NjdELCAweDk2ODUsIDB4OTY4NiwgMHg5NjhELCAweDk2NzIsIDB4OTY4NCwKLSAgICAweDk2QzEsIDB4OTZDNSwgMHg5NkM0LCAweDk2QzYsIDB4OTZDNywgMHg5NkVGLCAweDk2RjIsIDB4OTdDQywKLSAgICAweDk4MDUsIDB4OTgwNiwgMHg5ODA4LCAweDk4RTcsIDB4OThFQSwgMHg5OEVGLCAweDk4RTksIDB4OThGMiwKLSAgICAweDk4RUQsIDB4OTlBRSwgMHg5OUFELCAweDlFQzMsIDB4OUVDRCwgMHg5RUQxLCAweDRFODIsIDB4NTBBRCwKLSAgICAweDUwQjUsIDB4NTBCMiwgMHg1MEIzLCAweDUwQzUsIDB4NTBCRSwgMHg1MEFDLCAweDUwQjcsIDB4NTBCQiwKLSAgICAweDUwQUYsIDB4NTBDNywgMHg1MjdGLCAweDUyNzcsIDB4NTI3RCwgMHg1MkRGLCAweDUyRTYsIDB4NTJFNCwKLSAgICAweDUyRTIsIDB4NTJFMywgMHg1MzJGLCAweDU1REYsIDB4NTVFOCwgMHg1NUQzLCAweDU1RTYsIDB4NTVDRSwKLSAgICAweDU1REMsIDB4NTVDNywgMHg1NUQxLCAweDU1RTMsIDB4NTVFNCwgMHg1NUVGLCAweDU1REEsIDB4NTVFMSwKLSAgICAweDU1QzUsIDB4NTVDNiwgMHg1NUU1LCAweDU1QzksIDB4NTcxMiwgMHg1NzEzLCAweDU4NUUsIDB4NTg1MSwKLSAgICAweDU4NTgsIDB4NTg1NywgMHg1ODVBLCAweDU4NTQsIDB4NTg2QiwgMHg1ODRDLCAweDU4NkQsIDB4NTg0QSwKLSAgICAweDU4NjIsIDB4NTg1MiwgMHg1ODRCLCAweDU5NjcsIDB4NUFDMSwgMHg1QUM5LCAweDVBQ0MsIDB4NUFCRSwKLSAgICAweDVBQkQsIDB4NUFCQywgMHg1QUIzLCAweDVBQzIsIDB4NUFCMiwgMHg1RDY5LCAweDVENkYsIDB4NUU0QywKLSAgICAweDVFNzksIDB4NUVDOSwgMHg1RUM4LCAweDVGMTIsIDB4NUY1OSwgMHg1RkFDLCAweDVGQUUsIDB4NjExQSwKLSAgICAweDYxMEYsIDB4NjE0OCwgMHg2MTFGLCAweDYwRjMsIDB4NjExQiwgMHg2MEY5LCAweDYxMDEsIDB4NjEwOCwKLSAgICAweDYxNEUsIDB4NjE0QywgMHg2MTQ0LCAweDYxNEQsIDB4NjEzRSwgMHg2MTM0LCAweDYxMjcsIDB4NjEwRCwKLSAgICAweDYxMDYsIDB4NjEzNywgMHg2MjIxLCAweDYyMjIsIDB4NjQxMywgMHg2NDNFLCAweDY0MUUsIDB4NjQyQSwKLSAgICAweDY0MkQsIDB4NjQzRCwgMHg2NDJDLCAweDY0MEYsIDB4NjQxQywgMHg2NDE0LCAweDY0MEQsIDB4NjQzNiwKLSAgICAweDY0MTYsIDB4NjQxNywgMHg2NDA2LCAweDY1NkMsIDB4NjU5RiwgMHg2NUIwLCAweDY2OTcsIDB4NjY4OSwKLSAgICAweDY2ODcsIDB4NjY4OCwgMHg2Njk2LCAweDY2ODQsIDB4NjY5OCwgMHg2NjhELCAweDY3MDMsIDB4Njk5NCwKLSAgICAweDY5NkQsIDB4Njk1QSwgMHg2OTc3LCAweDY5NjAsIDB4Njk1NCwgMHg2OTc1LCAweDY5MzAsIDB4Njk4MiwKLSAgICAweDY5NEEsIDB4Njk2OCwgMHg2OTZCLCAweDY5NUUsIDB4Njk1MywgMHg2OTc5LCAweDY5ODYsIDB4Njk1RCwKLSAgICAweDY5NjMsIDB4Njk1QiwgMHg2QjQ3LCAweDZCNzIsIDB4NkJDMCwgMHg2QkJGLCAweDZCRDMsIDB4NkJGRCwKLSAgICAweDZFQTIsIDB4NkVBRiwgMHg2RUQzLCAweDZFQjYsIDB4NkVDMiwgMHg2RTkwLCAweDZFOUQsIDB4NkVDNywKLSAgICAweDZFQzUsIDB4NkVBNSwgMHg2RTk4LCAweDZFQkMsIDB4NkVCQSwgMHg2RUFCLCAweDZFRDEsIDB4NkU5NiwKLSAgICAweDZFOUMsIDB4NkVDNCwgMHg2RUQ0LCAweDZFQUEsIDB4NkVBNywgMHg2RUI0LCAweDcxNEUsIDB4NzE1OSwKLSAgICAweDcxNjksIDB4NzE2NCwgMHg3MTQ5LCAweDcxNjcsIDB4NzE1QywgMHg3MTZDLCAweDcxNjYsIDB4NzE0QywKLSAgICAweDcxNjUsIDB4NzE1RSwgMHg3MTQ2LCAweDcxNjgsIDB4NzE1NiwgMHg3MjNBLCAweDcyNTIsIDB4NzMzNywKLSAgICAweDczNDUsIDB4NzMzRiwgMHg3MzNFLCAweDc0NkYsIDB4NzQ1QSwgMHg3NDU1LCAweDc0NUYsIDB4NzQ1RSwKLSAgICAweDc0NDEsIDB4NzQzRiwgMHg3NDU5LCAweDc0NUIsIDB4NzQ1QywgMHg3NTc2LCAweDc1NzgsIDB4NzYwMCwKLSAgICAweDc1RjAsIDB4NzYwMSwgMHg3NUYyLCAweDc1RjEsIDB4NzVGQSwgMHg3NUZGLCAweDc1RjQsIDB4NzVGMywKLSAgICAweDc2REUsIDB4NzZERiwgMHg3NzVCLCAweDc3NkIsIDB4Nzc2NiwgMHg3NzVFLCAweDc3NjMsIDB4Nzc3OSwKLSAgICAweDc3NkEsIDB4Nzc2QywgMHg3NzVDLCAweDc3NjUsIDB4Nzc2OCwgMHg3NzYyLCAweDc3RUUsIDB4Nzg4RSwKLSAgICAweDc4QjAsIDB4Nzg5NywgMHg3ODk4LCAweDc4OEMsIDB4Nzg4OSwgMHg3ODdDLCAweDc4OTEsIDB4Nzg5MywKLSAgICAweDc4N0YsIDB4Nzk3QSwgMHg3OTdGLCAweDc5ODEsIDB4ODQyQywgMHg3OUJELCAweDdBMUMsIDB4N0ExQSwKLSAgICAweDdBMjAsIDB4N0ExNCwgMHg3QTFGLCAweDdBMUUsIDB4N0E5RiwgMHg3QUEwLCAweDdCNzcsIDB4N0JDMCwKLSAgICAweDdCNjAsIDB4N0I2RSwgMHg3QjY3LCAweDdDQjEsIDB4N0NCMywgMHg3Q0I1LCAweDdEOTMsIDB4N0Q3OSwKLSAgICAweDdEOTEsIDB4N0Q4MSwgMHg3RDhGLCAweDdENUIsIDB4N0Y2RSwgMHg3RjY5LCAweDdGNkEsIDB4N0Y3MiwKLSAgICAweDdGQTksIDB4N0ZBOCwgMHg3RkE0LCAweDgwNTYsIDB4ODA1OCwgMHg4MDg2LCAweDgwODQsIDB4ODE3MSwKLSAgICAweDgxNzAsIDB4ODE3OCwgMHg4MTY1LCAweDgxNkUsIDB4ODE3MywgMHg4MTZCLCAweDgxNzksIDB4ODE3QSwKLSAgICAweDgxNjYsIDB4ODIwNSwgMHg4MjQ3LCAweDg0ODIsIDB4ODQ3NywgMHg4NDNELCAweDg0MzEsIDB4ODQ3NSwKLSAgICAweDg0NjYsIDB4ODQ2QiwgMHg4NDQ5LCAweDg0NkMsIDB4ODQ1QiwgMHg4NDNDLCAweDg0MzUsIDB4ODQ2MSwKLSAgICAweDg0NjMsIDB4ODQ2OSwgMHg4NDZELCAweDg0NDYsIDB4ODY1RSwgMHg4NjVDLCAweDg2NUYsIDB4ODZGOSwKLSAgICAweDg3MTMsIDB4ODcwOCwgMHg4NzA3LCAweDg3MDAsIDB4ODZGRSwgMHg4NkZCLCAweDg3MDIsIDB4ODcwMywKLSAgICAweDg3MDYsIDB4ODcwQSwgMHg4ODU5LCAweDg4REYsIDB4ODhENCwgMHg4OEQ5LCAweDg4REMsIDB4ODhEOCwKLSAgICAweDg4REQsIDB4ODhFMSwgMHg4OENBLCAweDg4RDUsIDB4ODhEMiwgMHg4OTlDLCAweDg5RTMsIDB4OEE2QiwKLSAgICAweDhBNzIsIDB4OEE3MywgMHg4QTY2LCAweDhBNjksIDB4OEE3MCwgMHg4QTg3LCAweDhBN0MsIDB4OEE2MywKLSAgICAweDhBQTAsIDB4OEE3MSwgMHg4QTg1LCAweDhBNkQsIDB4OEE2MiwgMHg4QTZFLCAweDhBNkMsIDB4OEE3OSwKLSAgICAweDhBN0IsIDB4OEEzRSwgMHg4QTY4LCAweDhDNjIsIDB4OEM4QSwgMHg4Qzg5LCAweDhDQ0EsIDB4OENDNywKLSAgICAweDhDQzgsIDB4OENDNCwgMHg4Q0IyLCAweDhDQzMsIDB4OENDMiwgMHg4Q0M1LCAweDhERTEsIDB4OERERiwKLSAgICAweDhERTgsIDB4OERFRiwgMHg4REYzLCAweDhERkEsIDB4OERFQSwgMHg4REU0LCAweDhERTYsIDB4OEVCMiwKLSAgICAweDhGMDMsIDB4OEYwOSwgMHg4RUZFLCAweDhGMEEsIDB4OEY5RiwgMHg4RkIyLCAweDkwNEIsIDB4OTA0QSwKLSAgICAweDkwNTMsIDB4OTA0MiwgMHg5MDU0LCAweDkwM0MsIDB4OTA1NSwgMHg5MDUwLCAweDkwNDcsIDB4OTA0RiwKLSAgICAweDkwNEUsIDB4OTA0RCwgMHg5MDUxLCAweDkwM0UsIDB4OTA0MSwgMHg5MTEyLCAweDkxMTcsIDB4OTE2QywKLSAgICAweDkxNkEsIDB4OTE2OSwgMHg5MUM5LCAweDkyMzcsIDB4OTI1NywgMHg5MjM4LCAweDkyM0QsIDB4OTI0MCwKLSAgICAweDkyM0UsIDB4OTI1QiwgMHg5MjRCLCAweDkyNjQsIDB4OTI1MSwgMHg5MjM0LCAweDkyNDksIDB4OTI0RCwKLSAgICAweDkyNDUsIDB4OTIzOSwgMHg5MjNGLCAweDkyNUEsIDB4OTU5OCwgMHg5Njk4LCAweDk2OTQsIDB4OTY5NSwKLSAgICAweDk2Q0QsIDB4OTZDQiwgMHg5NkM5LCAweDk2Q0EsIDB4OTZGNywgMHg5NkZCLCAweDk2RjksIDB4OTZGNiwKLSAgICAweDk3NTYsIDB4OTc3NCwgMHg5Nzc2LCAweDk4MTAsIDB4OTgxMSwgMHg5ODEzLCAweDk4MEEsIDB4OTgxMiwKLSAgICAweDk4MEMsIDB4OThGQywgMHg5OEY0LCAweDk4RkQsIDB4OThGRSwgMHg5OUIzLCAweDk5QjEsIDB4OTlCNCwKLSAgICAweDlBRTEsIDB4OUNFOSwgMHg5RTgyLCAweDlGMEUsIDB4OUYxMywgMHg5RjIwLCAweDUwRTcsIDB4NTBFRSwKLSAgICAweDUwRTUsIDB4NTBENiwgMHg1MEVELCAweDUwREEsIDB4NTBENSwgMHg1MENGLCAweDUwRDEsIDB4NTBGMSwKLSAgICAweDUwQ0UsIDB4NTBFOSwgMHg1MTYyLCAweDUxRjMsIDB4NTI4MywgMHg1MjgyLCAweDUzMzEsIDB4NTNBRCwKLSAgICAweDU1RkUsIDB4NTYwMCwgMHg1NjFCLCAweDU2MTcsIDB4NTVGRCwgMHg1NjE0LCAweDU2MDYsIDB4NTYwOSwKLSAgICAweDU2MEQsIDB4NTYwRSwgMHg1NUY3LCAweDU2MTYsIDB4NTYxRiwgMHg1NjA4LCAweDU2MTAsIDB4NTVGNiwKLSAgICAweDU3MTgsIDB4NTcxNiwgMHg1ODc1LCAweDU4N0UsIDB4NTg4MywgMHg1ODkzLCAweDU4OEEsIDB4NTg3OSwKLSAgICAweDU4ODUsIDB4NTg3RCwgMHg1OEZELCAweDU5MjUsIDB4NTkyMiwgMHg1OTI0LCAweDU5NkEsIDB4NTk2OSwKLSAgICAweDVBRTEsIDB4NUFFNiwgMHg1QUU5LCAweDVBRDcsIDB4NUFENiwgMHg1QUQ4LCAweDVBRTMsIDB4NUI3NSwKLSAgICAweDVCREUsIDB4NUJFNywgMHg1QkUxLCAweDVCRTUsIDB4NUJFNiwgMHg1QkU4LCAweDVCRTIsIDB4NUJFNCwKLSAgICAweDVCREYsIDB4NUMwRCwgMHg1QzYyLCAweDVEODQsIDB4NUQ4NywgMHg1RTVCLCAweDVFNjMsIDB4NUU1NSwKLSAgICAweDVFNTcsIDB4NUU1NCwgMHg1RUQzLCAweDVFRDYsIDB4NUYwQSwgMHg1RjQ2LCAweDVGNzAsIDB4NUZCOSwKLSAgICAweDYxNDcsIDB4NjEzRiwgMHg2MTRCLCAweDYxNzcsIDB4NjE2MiwgMHg2MTYzLCAweDYxNUYsIDB4NjE1QSwKLSAgICAweDYxNTgsIDB4NjE3NSwgMHg2MjJBLCAweDY0ODcsIDB4NjQ1OCwgMHg2NDU0LCAweDY0QTQsIDB4NjQ3OCwKLSAgICAweDY0NUYsIDB4NjQ3QSwgMHg2NDUxLCAweDY0NjcsIDB4NjQzNCwgMHg2NDZELCAweDY0N0IsIDB4NjU3MiwKLSAgICAweDY1QTEsIDB4NjVENywgMHg2NUQ2LCAweDY2QTIsIDB4NjZBOCwgMHg2NjlELCAweDY5OUMsIDB4NjlBOCwKLSAgICAweDY5OTUsIDB4NjlDMSwgMHg2OUFFLCAweDY5RDMsIDB4NjlDQiwgMHg2OTlCLCAweDY5QjcsIDB4NjlCQiwKLSAgICAweDY5QUIsIDB4NjlCNCwgMHg2OUQwLCAweDY5Q0QsIDB4NjlBRCwgMHg2OUNDLCAweDY5QTYsIDB4NjlDMywKLSAgICAweDY5QTMsIDB4NkI0OSwgMHg2QjRDLCAweDZDMzMsIDB4NkYzMywgMHg2RjE0LCAweDZFRkUsIDB4NkYxMywKLSAgICAweDZFRjQsIDB4NkYyOSwgMHg2RjNFLCAweDZGMjAsIDB4NkYyQywgMHg2RjBGLCAweDZGMDIsIDB4NkYyMiwKLSAgICAweDZFRkYsIDB4NkVFRiwgMHg2RjA2LCAweDZGMzEsIDB4NkYzOCwgMHg2RjMyLCAweDZGMjMsIDB4NkYxNSwKLSAgICAweDZGMkIsIDB4NkYyRiwgMHg2Rjg4LCAweDZGMkEsIDB4NkVFQywgMHg2RjAxLCAweDZFRjIsIDB4NkVDQywKLSAgICAweDZFRjcsIDB4NzE5NCwgMHg3MTk5LCAweDcxN0QsIDB4NzE4QSwgMHg3MTg0LCAweDcxOTIsIDB4NzIzRSwKLSAgICAweDcyOTIsIDB4NzI5NiwgMHg3MzQ0LCAweDczNTAsIDB4NzQ2NCwgMHg3NDYzLCAweDc0NkEsIDB4NzQ3MCwKLSAgICAweDc0NkQsIDB4NzUwNCwgMHg3NTkxLCAweDc2MjcsIDB4NzYwRCwgMHg3NjBCLCAweDc2MDksIDB4NzYxMywKLSAgICAweDc2RTEsIDB4NzZFMywgMHg3Nzg0LCAweDc3N0QsIDB4Nzc3RiwgMHg3NzYxLCAweDc4QzEsIDB4Nzg5RiwKLSAgICAweDc4QTcsIDB4NzhCMywgMHg3OEE5LCAweDc4QTMsIDB4Nzk4RSwgMHg3OThGLCAweDc5OEQsIDB4N0EyRSwKLSAgICAweDdBMzEsIDB4N0FBQSwgMHg3QUE5LCAweDdBRUQsIDB4N0FFRiwgMHg3QkExLCAweDdCOTUsIDB4N0I4QiwKLSAgICAweDdCNzUsIDB4N0I5NywgMHg3QjlELCAweDdCOTQsIDB4N0I4RiwgMHg3QkI4LCAweDdCODcsIDB4N0I4NCwKLSAgICAweDdDQjksIDB4N0NCRCwgMHg3Q0JFLCAweDdEQkIsIDB4N0RCMCwgMHg3RDlDLCAweDdEQkQsIDB4N0RCRSwKLSAgICAweDdEQTAsIDB4N0RDQSwgMHg3REI0LCAweDdEQjIsIDB4N0RCMSwgMHg3REJBLCAweDdEQTIsIDB4N0RCRiwKLSAgICAweDdEQjUsIDB4N0RCOCwgMHg3REFELCAweDdERDIsIDB4N0RDNywgMHg3REFDLCAweDdGNzAsIDB4N0ZFMCwKLSAgICAweDdGRTEsIDB4N0ZERiwgMHg4MDVFLCAweDgwNUEsIDB4ODA4NywgMHg4MTUwLCAweDgxODAsIDB4ODE4RiwKLSAgICAweDgxODgsIDB4ODE4QSwgMHg4MTdGLCAweDgxODIsIDB4ODFFNywgMHg4MUZBLCAweDgyMDcsIDB4ODIxNCwKLSAgICAweDgyMUUsIDB4ODI0QiwgMHg4NEM5LCAweDg0QkYsIDB4ODRDNiwgMHg4NEM0LCAweDg0OTksIDB4ODQ5RSwKLSAgICAweDg0QjIsIDB4ODQ5QywgMHg4NENCLCAweDg0QjgsIDB4ODRDMCwgMHg4NEQzLCAweDg0OTAsIDB4ODRCQywKLSAgICAweDg0RDEsIDB4ODRDQSwgMHg4NzNGLCAweDg3MUMsIDB4ODczQiwgMHg4NzIyLCAweDg3MjUsIDB4ODczNCwKLSAgICAweDg3MTgsIDB4ODc1NSwgMHg4NzM3LCAweDg3MjksIDB4ODhGMywgMHg4OTAyLCAweDg4RjQsIDB4ODhGOSwKLSAgICAweDg4RjgsIDB4ODhGRCwgMHg4OEU4LCAweDg5MUEsIDB4ODhFRiwgMHg4QUE2LCAweDhBOEMsIDB4OEE5RSwKLSAgICAweDhBQTMsIDB4OEE4RCwgMHg4QUExLCAweDhBOTMsIDB4OEFBNCwgMHg4QUFBLCAweDhBQTUsIDB4OEFBOCwKLSAgICAweDhBOTgsIDB4OEE5MSwgMHg4QTlBLCAweDhBQTcsIDB4OEM2QSwgMHg4QzhELCAweDhDOEMsIDB4OENEMywKLSAgICAweDhDRDEsIDB4OENEMiwgMHg4RDZCLCAweDhEOTksIDB4OEQ5NSwgMHg4REZDLCAweDhGMTQsIDB4OEYxMiwKLSAgICAweDhGMTUsIDB4OEYxMywgMHg4RkEzLCAweDkwNjAsIDB4OTA1OCwgMHg5MDVDLCAweDkwNjMsIDB4OTA1OSwKLSAgICAweDkwNUUsIDB4OTA2MiwgMHg5MDVELCAweDkwNUIsIDB4OTExOSwgMHg5MTE4LCAweDkxMUUsIDB4OTE3NSwKLSAgICAweDkxNzgsIDB4OTE3NywgMHg5MTc0LCAweDkyNzgsIDB4OTJBQywgMHg5MjgwLCAweDkyODUsIDB4OTI5OCwKLSAgICAweDkyOTYsIDB4OTI3QiwgMHg5MjkzLCAweDkyOUMsIDB4OTJBOCwgMHg5MjdDLCAweDkyOTEsIDB4OTVBMSwKLSAgICAweDk1QTgsIDB4OTVBOSwgMHg5NUEzLCAweDk1QTUsIDB4OTVBNCwgMHg5Njk5LCAweDk2OUMsIDB4OTY5QiwKLSAgICAweDk2Q0MsIDB4OTZEMiwgMHg5NzAwLCAweDk3N0MsIDB4OTc4NSwgMHg5N0Y2LCAweDk4MTcsIDB4OTgxOCwKLSAgICAweDk4QUYsIDB4OThCMSwgMHg5OTAzLCAweDk5MDUsIDB4OTkwQywgMHg5OTA5LCAweDk5QzEsIDB4OUFBRiwKLSAgICAweDlBQjAsIDB4OUFFNiwgMHg5QjQxLCAweDlCNDIsIDB4OUNGNCwgMHg5Q0Y2LCAweDlDRjMsIDB4OUVCQywKLSAgICAweDlGM0IsIDB4OUY0QSwgMHg1MTA0LCAweDUxMDAsIDB4NTBGQiwgMHg1MEY1LCAweDUwRjksIDB4NTEwMiwKLSAgICAweDUxMDgsIDB4NTEwOSwgMHg1MTA1LCAweDUxREMsIDB4NTI4NywgMHg1Mjg4LCAweDUyODksIDB4NTI4RCwKLSAgICAweDUyOEEsIDB4NTJGMCwgMHg1M0IyLCAweDU2MkUsIDB4NTYzQiwgMHg1NjM5LCAweDU2MzIsIDB4NTYzRiwKLSAgICAweDU2MzQsIDB4NTYyOSwgMHg1NjUzLCAweDU2NEUsIDB4NTY1NywgMHg1Njc0LCAweDU2MzYsIDB4NTYyRiwKLSAgICAweDU2MzAsIDB4NTg4MCwgMHg1ODlGLCAweDU4OUUsIDB4NThCMywgMHg1ODlDLCAweDU4QUUsIDB4NThBOSwKLSAgICAweDU4QTYsIDB4NTk2RCwgMHg1QjA5LCAweDVBRkIsIDB4NUIwQiwgMHg1QUY1LCAweDVCMEMsIDB4NUIwOCwKLSAgICAweDVCRUUsIDB4NUJFQywgMHg1QkU5LCAweDVCRUIsIDB4NUM2NCwgMHg1QzY1LCAweDVEOUQsIDB4NUQ5NCwKLSAgICAweDVFNjIsIDB4NUU1RiwgMHg1RTYxLCAweDVFRTIsIDB4NUVEQSwgMHg1RURGLCAweDVFREQsIDB4NUVFMywKLSAgICAweDVFRTAsIDB4NUY0OCwgMHg1RjcxLCAweDVGQjcsIDB4NUZCNSwgMHg2MTc2LCAweDYxNjcsIDB4NjE2RSwKLSAgICAweDYxNUQsIDB4NjE1NSwgMHg2MTgyLCAweDYxN0MsIDB4NjE3MCwgMHg2MTZCLCAweDYxN0UsIDB4NjFBNywKLSAgICAweDYxOTAsIDB4NjFBQiwgMHg2MThFLCAweDYxQUMsIDB4NjE5QSwgMHg2MUE0LCAweDYxOTQsIDB4NjFBRSwKLSAgICAweDYyMkUsIDB4NjQ2OSwgMHg2NDZGLCAweDY0NzksIDB4NjQ5RSwgMHg2NEIyLCAweDY0ODgsIDB4NjQ5MCwKLSAgICAweDY0QjAsIDB4NjRBNSwgMHg2NDkzLCAweDY0OTUsIDB4NjRBOSwgMHg2NDkyLCAweDY0QUUsIDB4NjRBRCwKLSAgICAweDY0QUIsIDB4NjQ5QSwgMHg2NEFDLCAweDY0OTksIDB4NjRBMiwgMHg2NEIzLCAweDY1NzUsIDB4NjU3NywKLSAgICAweDY1NzgsIDB4NjZBRSwgMHg2NkFCLCAweDY2QjQsIDB4NjZCMSwgMHg2QTIzLCAweDZBMUYsIDB4NjlFOCwKLSAgICAweDZBMDEsIDB4NkExRSwgMHg2QTE5LCAweDY5RkQsIDB4NkEyMSwgMHg2QTEzLCAweDZBMEEsIDB4NjlGMywKLSAgICAweDZBMDIsIDB4NkEwNSwgMHg2OUVELCAweDZBMTEsIDB4NkI1MCwgMHg2QjRFLCAweDZCQTQsIDB4NkJDNSwKLSAgICAweDZCQzYsIDB4NkYzRiwgMHg2RjdDLCAweDZGODQsIDB4NkY1MSwgMHg2RjY2LCAweDZGNTQsIDB4NkY4NiwKLSAgICAweDZGNkQsIDB4NkY1QiwgMHg2Rjc4LCAweDZGNkUsIDB4NkY4RSwgMHg2RjdBLCAweDZGNzAsIDB4NkY2NCwKLSAgICAweDZGOTcsIDB4NkY1OCwgMHg2RUQ1LCAweDZGNkYsIDB4NkY2MCwgMHg2RjVGLCAweDcxOUYsIDB4NzFBQywKLSAgICAweDcxQjEsIDB4NzFBOCwgMHg3MjU2LCAweDcyOUIsIDB4NzM0RSwgMHg3MzU3LCAweDc0NjksIDB4NzQ4QiwKLSAgICAweDc0ODMsIDB4NzQ3RSwgMHg3NDgwLCAweDc1N0YsIDB4NzYyMCwgMHg3NjI5LCAweDc2MUYsIDB4NzYyNCwKLSAgICAweDc2MjYsIDB4NzYyMSwgMHg3NjIyLCAweDc2OUEsIDB4NzZCQSwgMHg3NkU0LCAweDc3OEUsIDB4Nzc4NywKLSAgICAweDc3OEMsIDB4Nzc5MSwgMHg3NzhCLCAweDc4Q0IsIDB4NzhDNSwgMHg3OEJBLCAweDc4Q0EsIDB4NzhCRSwKLSAgICAweDc4RDUsIDB4NzhCQywgMHg3OEQwLCAweDdBM0YsIDB4N0EzQywgMHg3QTQwLCAweDdBM0QsIDB4N0EzNywKLSAgICAweDdBM0IsIDB4N0FBRiwgMHg3QUFFLCAweDdCQUQsIDB4N0JCMSwgMHg3QkM0LCAweDdCQjQsIDB4N0JDNiwKLSAgICAweDdCQzcsIDB4N0JDMSwgMHg3QkEwLCAweDdCQ0MsIDB4N0NDQSwgMHg3REUwLCAweDdERjQsIDB4N0RFRiwKLSAgICAweDdERkIsIDB4N0REOCwgMHg3REVDLCAweDdEREQsIDB4N0RFOCwgMHg3REUzLCAweDdEREEsIDB4N0RERSwKLSAgICAweDdERTksIDB4N0Q5RSwgMHg3REQ5LCAweDdERjIsIDB4N0RGOSwgMHg3Rjc1LCAweDdGNzcsIDB4N0ZBRiwKLSAgICAweDdGRTksIDB4ODAyNiwgMHg4MTlCLCAweDgxOUMsIDB4ODE5RCwgMHg4MUEwLCAweDgxOUEsIDB4ODE5OCwKLSAgICAweDg1MTcsIDB4ODUzRCwgMHg4NTFBLCAweDg0RUUsIDB4ODUyQywgMHg4NTJELCAweDg1MTMsIDB4ODUxMSwKLSAgICAweDg1MjMsIDB4ODUyMSwgMHg4NTE0LCAweDg0RUMsIDB4ODUyNSwgMHg4NEZGLCAweDg1MDYsIDB4ODc4MiwKLSAgICAweDg3NzQsIDB4ODc3NiwgMHg4NzYwLCAweDg3NjYsIDB4ODc3OCwgMHg4NzY4LCAweDg3NTksIDB4ODc1NywKLSAgICAweDg3NEMsIDB4ODc1MywgMHg4ODVCLCAweDg4NUQsIDB4ODkxMCwgMHg4OTA3LCAweDg5MTIsIDB4ODkxMywKLSAgICAweDg5MTUsIDB4ODkwQSwgMHg4QUJDLCAweDhBRDIsIDB4OEFDNywgMHg4QUM0LCAweDhBOTUsIDB4OEFDQiwKLSAgICAweDhBRjgsIDB4OEFCMiwgMHg4QUM5LCAweDhBQzIsIDB4OEFCRiwgMHg4QUIwLCAweDhBRDYsIDB4OEFDRCwKLSAgICAweDhBQjYsIDB4OEFCOSwgMHg4QURCLCAweDhDNEMsIDB4OEM0RSwgMHg4QzZDLCAweDhDRTAsIDB4OENERSwKLSAgICAweDhDRTYsIDB4OENFNCwgMHg4Q0VDLCAweDhDRUQsIDB4OENFMiwgMHg4Q0UzLCAweDhDREMsIDB4OENFQSwKLSAgICAweDhDRTEsIDB4OEQ2RCwgMHg4RDlGLCAweDhEQTMsIDB4OEUyQiwgMHg4RTEwLCAweDhFMUQsIDB4OEUyMiwKLSAgICAweDhFMEYsIDB4OEUyOSwgMHg4RTFGLCAweDhFMjEsIDB4OEUxRSwgMHg4RUJBLCAweDhGMUQsIDB4OEYxQiwKLSAgICAweDhGMUYsIDB4OEYyOSwgMHg4RjI2LCAweDhGMkEsIDB4OEYxQywgMHg4RjFFLCAweDhGMjUsIDB4OTA2OSwKLSAgICAweDkwNkUsIDB4OTA2OCwgMHg5MDZELCAweDkwNzcsIDB4OTEzMCwgMHg5MTJELCAweDkxMjcsIDB4OTEzMSwKLSAgICAweDkxODcsIDB4OTE4OSwgMHg5MThCLCAweDkxODMsIDB4OTJDNSwgMHg5MkJCLCAweDkyQjcsIDB4OTJFQSwKLSAgICAweDkyRTQsIDB4OTJDMSwgMHg5MkIzLCAweDkyQkMsIDB4OTJEMiwgMHg5MkM3LCAweDkyRjAsIDB4OTJCMiwKLSAgICAweDk1QUQsIDB4OTVCMSwgMHg5NzA0LCAweDk3MDYsIDB4OTcwNywgMHg5NzA5LCAweDk3NjAsIDB4OTc4RCwKLSAgICAweDk3OEIsIDB4OTc4RiwgMHg5ODIxLCAweDk4MkIsIDB4OTgxQywgMHg5OEIzLCAweDk5MEEsIDB4OTkxMywKLSAgICAweDk5MTIsIDB4OTkxOCwgMHg5OURELCAweDk5RDAsIDB4OTlERiwgMHg5OURCLCAweDk5RDEsIDB4OTlENSwKLSAgICAweDk5RDIsIDB4OTlEOSwgMHg5QUI3LCAweDlBRUUsIDB4OUFFRiwgMHg5QjI3LCAweDlCNDUsIDB4OUI0NCwKLSAgICAweDlCNzcsIDB4OUI2RiwgMHg5RDA2LCAweDlEMDksIDB4OUQwMywgMHg5RUE5LCAweDlFQkUsIDB4OUVDRSwKLSAgICAweDU4QTgsIDB4OUY1MiwgMHg1MTEyLCAweDUxMTgsIDB4NTExNCwgMHg1MTEwLCAweDUxMTUsIDB4NTE4MCwKLSAgICAweDUxQUEsIDB4NTFERCwgMHg1MjkxLCAweDUyOTMsIDB4NTJGMywgMHg1NjU5LCAweDU2NkIsIDB4NTY3OSwKLSAgICAweDU2NjksIDB4NTY2NCwgMHg1Njc4LCAweDU2NkEsIDB4NTY2OCwgMHg1NjY1LCAweDU2NzEsIDB4NTY2RiwKLSAgICAweDU2NkMsIDB4NTY2MiwgMHg1Njc2LCAweDU4QzEsIDB4NThCRSwgMHg1OEM3LCAweDU4QzUsIDB4NTk2RSwKLSAgICAweDVCMUQsIDB4NUIzNCwgMHg1Qjc4LCAweDVCRjAsIDB4NUMwRSwgMHg1RjRBLCAweDYxQjIsIDB4NjE5MSwKLSAgICAweDYxQTksIDB4NjE4QSwgMHg2MUNELCAweDYxQjYsIDB4NjFCRSwgMHg2MUNBLCAweDYxQzgsIDB4NjIzMCwKLSAgICAweDY0QzUsIDB4NjRDMSwgMHg2NENCLCAweDY0QkIsIDB4NjRCQywgMHg2NERBLCAweDY0QzQsIDB4NjRDNywKLSAgICAweDY0QzIsIDB4NjRDRCwgMHg2NEJGLCAweDY0RDIsIDB4NjRENCwgMHg2NEJFLCAweDY1NzQsIDB4NjZDNiwKLSAgICAweDY2QzksIDB4NjZCOSwgMHg2NkM0LCAweDY2QzcsIDB4NjZCOCwgMHg2QTNELCAweDZBMzgsIDB4NkEzQSwKLSAgICAweDZBNTksIDB4NkE2QiwgMHg2QTU4LCAweDZBMzksIDB4NkE0NCwgMHg2QTYyLCAweDZBNjEsIDB4NkE0QiwKLSAgICAweDZBNDcsIDB4NkEzNSwgMHg2QTVGLCAweDZBNDgsIDB4NkI1OSwgMHg2Qjc3LCAweDZDMDUsIDB4NkZDMiwKLSAgICAweDZGQjEsIDB4NkZBMSwgMHg2RkMzLCAweDZGQTQsIDB4NkZDMSwgMHg2RkE3LCAweDZGQjMsIDB4NkZDMCwKLSAgICAweDZGQjksIDB4NkZCNiwgMHg2RkE2LCAweDZGQTAsIDB4NkZCNCwgMHg3MUJFLCAweDcxQzksIDB4NzFEMCwKLSAgICAweDcxRDIsIDB4NzFDOCwgMHg3MUQ1LCAweDcxQjksIDB4NzFDRSwgMHg3MUQ5LCAweDcxREMsIDB4NzFDMywKLSAgICAweDcxQzQsIDB4NzM2OCwgMHg3NDlDLCAweDc0QTMsIDB4NzQ5OCwgMHg3NDlGLCAweDc0OUUsIDB4NzRFMiwKLSAgICAweDc1MEMsIDB4NzUwRCwgMHg3NjM0LCAweDc2MzgsIDB4NzYzQSwgMHg3NkU3LCAweDc2RTUsIDB4NzdBMCwKLSAgICAweDc3OUUsIDB4Nzc5RiwgMHg3N0E1LCAweDc4RTgsIDB4NzhEQSwgMHg3OEVDLCAweDc4RTcsIDB4NzlBNiwKLSAgICAweDdBNEQsIDB4N0E0RSwgMHg3QTQ2LCAweDdBNEMsIDB4N0E0QiwgMHg3QUJBLCAweDdCRDksIDB4N0MxMSwKLSAgICAweDdCQzksIDB4N0JFNCwgMHg3QkRCLCAweDdCRTEsIDB4N0JFOSwgMHg3QkU2LCAweDdDRDUsIDB4N0NENiwKLSAgICAweDdFMEEsIDB4N0UxMSwgMHg3RTA4LCAweDdFMUIsIDB4N0UyMywgMHg3RTFFLCAweDdFMUQsIDB4N0UwOSwKLSAgICAweDdFMTAsIDB4N0Y3OSwgMHg3RkIyLCAweDdGRjAsIDB4N0ZGMSwgMHg3RkVFLCAweDgwMjgsIDB4ODFCMywKLSAgICAweDgxQTksIDB4ODFBOCwgMHg4MUZCLCAweDgyMDgsIDB4ODI1OCwgMHg4MjU5LCAweDg1NEEsIDB4ODU1OSwKLSAgICAweDg1NDgsIDB4ODU2OCwgMHg4NTY5LCAweDg1NDMsIDB4ODU0OSwgMHg4NTZELCAweDg1NkEsIDB4ODU1RSwKLSAgICAweDg3ODMsIDB4ODc5RiwgMHg4NzlFLCAweDg3QTIsIDB4ODc4RCwgMHg4ODYxLCAweDg5MkEsIDB4ODkzMiwKLSAgICAweDg5MjUsIDB4ODkyQiwgMHg4OTIxLCAweDg5QUEsIDB4ODlBNiwgMHg4QUU2LCAweDhBRkEsIDB4OEFFQiwKLSAgICAweDhBRjEsIDB4OEIwMCwgMHg4QURDLCAweDhBRTcsIDB4OEFFRSwgMHg4QUZFLCAweDhCMDEsIDB4OEIwMiwKLSAgICAweDhBRjcsIDB4OEFFRCwgMHg4QUYzLCAweDhBRjYsIDB4OEFGQywgMHg4QzZCLCAweDhDNkQsIDB4OEM5MywKLSAgICAweDhDRjQsIDB4OEU0NCwgMHg4RTMxLCAweDhFMzQsIDB4OEU0MiwgMHg4RTM5LCAweDhFMzUsIDB4OEYzQiwKLSAgICAweDhGMkYsIDB4OEYzOCwgMHg4RjMzLCAweDhGQTgsIDB4OEZBNiwgMHg5MDc1LCAweDkwNzQsIDB4OTA3OCwKLSAgICAweDkwNzIsIDB4OTA3QywgMHg5MDdBLCAweDkxMzQsIDB4OTE5MiwgMHg5MzIwLCAweDkzMzYsIDB4OTJGOCwKLSAgICAweDkzMzMsIDB4OTMyRiwgMHg5MzIyLCAweDkyRkMsIDB4OTMyQiwgMHg5MzA0LCAweDkzMUEsIDB4OTMxMCwKLSAgICAweDkzMjYsIDB4OTMyMSwgMHg5MzE1LCAweDkzMkUsIDB4OTMxOSwgMHg5NUJCLCAweDk2QTcsIDB4OTZBOCwKLSAgICAweDk2QUEsIDB4OTZENSwgMHg5NzBFLCAweDk3MTEsIDB4OTcxNiwgMHg5NzBELCAweDk3MTMsIDB4OTcwRiwKLSAgICAweDk3NUIsIDB4OTc1QywgMHg5NzY2LCAweDk3OTgsIDB4OTgzMCwgMHg5ODM4LCAweDk4M0IsIDB4OTgzNywKLSAgICAweDk4MkQsIDB4OTgzOSwgMHg5ODI0LCAweDk5MTAsIDB4OTkyOCwgMHg5OTFFLCAweDk5MUIsIDB4OTkyMSwKLSAgICAweDk5MUEsIDB4OTlFRCwgMHg5OUUyLCAweDk5RjEsIDB4OUFCOCwgMHg5QUJDLCAweDlBRkIsIDB4OUFFRCwKLSAgICAweDlCMjgsIDB4OUI5MSwgMHg5RDE1LCAweDlEMjMsIDB4OUQyNiwgMHg5RDI4LCAweDlEMTIsIDB4OUQxQiwKLSAgICAweDlFRDgsIDB4OUVENCwgMHg5RjhELCAweDlGOUMsIDB4NTEyQSwgMHg1MTFGLCAweDUxMjEsIDB4NTEzMiwKLSAgICAweDUyRjUsIDB4NTY4RSwgMHg1NjgwLCAweDU2OTAsIDB4NTY4NSwgMHg1Njg3LCAweDU2OEYsIDB4NThENSwKLSAgICAweDU4RDMsIDB4NThEMSwgMHg1OENFLCAweDVCMzAsIDB4NUIyQSwgMHg1QjI0LCAweDVCN0EsIDB4NUMzNywKLSAgICAweDVDNjgsIDB4NURCQywgMHg1REJBLCAweDVEQkQsIDB4NURCOCwgMHg1RTZCLCAweDVGNEMsIDB4NUZCRCwKLSAgICAweDYxQzksIDB4NjFDMiwgMHg2MUM3LCAweDYxRTYsIDB4NjFDQiwgMHg2MjMyLCAweDYyMzQsIDB4NjRDRSwKLSAgICAweDY0Q0EsIDB4NjREOCwgMHg2NEUwLCAweDY0RjAsIDB4NjRFNiwgMHg2NEVDLCAweDY0RjEsIDB4NjRFMiwKLSAgICAweDY0RUQsIDB4NjU4MiwgMHg2NTgzLCAweDY2RDksIDB4NjZENiwgMHg2QTgwLCAweDZBOTQsIDB4NkE4NCwKLSAgICAweDZBQTIsIDB4NkE5QywgMHg2QURCLCAweDZBQTMsIDB4NkE3RSwgMHg2QTk3LCAweDZBOTAsIDB4NkFBMCwKLSAgICAweDZCNUMsIDB4NkJBRSwgMHg2QkRBLCAweDZDMDgsIDB4NkZEOCwgMHg2RkYxLCAweDZGREYsIDB4NkZFMCwKLSAgICAweDZGREIsIDB4NkZFNCwgMHg2RkVCLCAweDZGRUYsIDB4NkY4MCwgMHg2RkVDLCAweDZGRTEsIDB4NkZFOSwKLSAgICAweDZGRDUsIDB4NkZFRSwgMHg2RkYwLCAweDcxRTcsIDB4NzFERiwgMHg3MUVFLCAweDcxRTYsIDB4NzFFNSwKLSAgICAweDcxRUQsIDB4NzFFQywgMHg3MUY0LCAweDcxRTAsIDB4NzIzNSwgMHg3MjQ2LCAweDczNzAsIDB4NzM3MiwKLSAgICAweDc0QTksIDB4NzRCMCwgMHg3NEE2LCAweDc0QTgsIDB4NzY0NiwgMHg3NjQyLCAweDc2NEMsIDB4NzZFQSwKLSAgICAweDc3QjMsIDB4NzdBQSwgMHg3N0IwLCAweDc3QUMsIDB4NzdBNywgMHg3N0FELCAweDc3RUYsIDB4NzhGNywKLSAgICAweDc4RkEsIDB4NzhGNCwgMHg3OEVGLCAweDc5MDEsIDB4NzlBNywgMHg3OUFBLCAweDdBNTcsIDB4N0FCRiwKLSAgICAweDdDMDcsIDB4N0MwRCwgMHg3QkZFLCAweDdCRjcsIDB4N0MwQywgMHg3QkUwLCAweDdDRTAsIDB4N0NEQywKLSAgICAweDdDREUsIDB4N0NFMiwgMHg3Q0RGLCAweDdDRDksIDB4N0NERCwgMHg3RTJFLCAweDdFM0UsIDB4N0U0NiwKLSAgICAweDdFMzcsIDB4N0UzMiwgMHg3RTQzLCAweDdFMkIsIDB4N0UzRCwgMHg3RTMxLCAweDdFNDUsIDB4N0U0MSwKLSAgICAweDdFMzQsIDB4N0UzOSwgMHg3RTQ4LCAweDdFMzUsIDB4N0UzRiwgMHg3RTJGLCAweDdGNDQsIDB4N0ZGMywKLSAgICAweDdGRkMsIDB4ODA3MSwgMHg4MDcyLCAweDgwNzAsIDB4ODA2RiwgMHg4MDczLCAweDgxQzYsIDB4ODFDMywKLSAgICAweDgxQkEsIDB4ODFDMiwgMHg4MUMwLCAweDgxQkYsIDB4ODFCRCwgMHg4MUM5LCAweDgxQkUsIDB4ODFFOCwKLSAgICAweDgyMDksIDB4ODI3MSwgMHg4NUFBLCAweDg1ODQsIDB4ODU3RSwgMHg4NTlDLCAweDg1OTEsIDB4ODU5NCwKLSAgICAweDg1QUYsIDB4ODU5QiwgMHg4NTg3LCAweDg1QTgsIDB4ODU4QSwgMHg4NUE2LCAweDg2NjcsIDB4ODdDMCwKLSAgICAweDg3RDEsIDB4ODdCMywgMHg4N0QyLCAweDg3QzYsIDB4ODdBQiwgMHg4N0JCLCAweDg3QkEsIDB4ODdDOCwKLSAgICAweDg3Q0IsIDB4ODkzQiwgMHg4OTM2LCAweDg5NDQsIDB4ODkzOCwgMHg4OTNELCAweDg5QUMsIDB4OEIwRSwKLSAgICAweDhCMTcsIDB4OEIxOSwgMHg4QjFCLCAweDhCMEEsIDB4OEIyMCwgMHg4QjFELCAweDhCMDQsIDB4OEIxMCwKLSAgICAweDhDNDEsIDB4OEMzRiwgMHg4QzczLCAweDhDRkEsIDB4OENGRCwgMHg4Q0ZDLCAweDhDRjgsIDB4OENGQiwKLSAgICAweDhEQTgsIDB4OEU0OSwgMHg4RTRCLCAweDhFNDgsIDB4OEU0QSwgMHg4RjQ0LCAweDhGM0UsIDB4OEY0MiwKLSAgICAweDhGNDUsIDB4OEYzRiwgMHg5MDdGLCAweDkwN0QsIDB4OTA4NCwgMHg5MDgxLCAweDkwODIsIDB4OTA4MCwKLSAgICAweDkxMzksIDB4OTFBMywgMHg5MTlFLCAweDkxOUMsIDB4OTM0RCwgMHg5MzgyLCAweDkzMjgsIDB4OTM3NSwKLSAgICAweDkzNEEsIDB4OTM2NSwgMHg5MzRCLCAweDkzMTgsIDB4OTM3RSwgMHg5MzZDLCAweDkzNUIsIDB4OTM3MCwKLSAgICAweDkzNUEsIDB4OTM1NCwgMHg5NUNBLCAweDk1Q0IsIDB4OTVDQywgMHg5NUM4LCAweDk1QzYsIDB4OTZCMSwKLSAgICAweDk2QjgsIDB4OTZENiwgMHg5NzFDLCAweDk3MUUsIDB4OTdBMCwgMHg5N0QzLCAweDk4NDYsIDB4OThCNiwKLSAgICAweDk5MzUsIDB4OUEwMSwgMHg5OUZGLCAweDlCQUUsIDB4OUJBQiwgMHg5QkFBLCAweDlCQUQsIDB4OUQzQiwKLSAgICAweDlEM0YsIDB4OUU4QiwgMHg5RUNGLCAweDlFREUsIDB4OUVEQywgMHg5RURELCAweDlFREIsIDB4OUYzRSwKLSAgICAweDlGNEIsIDB4NTNFMiwgMHg1Njk1LCAweDU2QUUsIDB4NThEOSwgMHg1OEQ4LCAweDVCMzgsIDB4NUY1RCwKLSAgICAweDYxRTMsIDB4NjIzMywgMHg2NEY0LCAweDY0RjIsIDB4NjRGRSwgMHg2NTA2LCAweDY0RkEsIDB4NjRGQiwKLSAgICAweDY0RjcsIDB4NjVCNywgMHg2NkRDLCAweDY3MjYsIDB4NkFCMywgMHg2QUFDLCAweDZBQzMsIDB4NkFCQiwKLSAgICAweDZBQjgsIDB4NkFDMiwgMHg2QUFFLCAweDZBQUYsIDB4NkI1RiwgMHg2Qjc4LCAweDZCQUYsIDB4NzAwOSwKLSAgICAweDcwMEIsIDB4NkZGRSwgMHg3MDA2LCAweDZGRkEsIDB4NzAxMSwgMHg3MDBGLCAweDcxRkIsIDB4NzFGQywKLSAgICAweDcxRkUsIDB4NzFGOCwgMHg3Mzc3LCAweDczNzUsIDB4NzRBNywgMHg3NEJGLCAweDc1MTUsIDB4NzY1NiwKLSAgICAweDc2NTgsIDB4NzY1MiwgMHg3N0JELCAweDc3QkYsIDB4NzdCQiwgMHg3N0JDLCAweDc5MEUsIDB4NzlBRSwKLSAgICAweDdBNjEsIDB4N0E2MiwgMHg3QTYwLCAweDdBQzQsIDB4N0FDNSwgMHg3QzJCLCAweDdDMjcsIDB4N0MyQSwKLSAgICAweDdDMUUsIDB4N0MyMywgMHg3QzIxLCAweDdDRTcsIDB4N0U1NCwgMHg3RTU1LCAweDdFNUUsIDB4N0U1QSwKLSAgICAweDdFNjEsIDB4N0U1MiwgMHg3RTU5LCAweDdGNDgsIDB4N0ZGOSwgMHg3RkZCLCAweDgwNzcsIDB4ODA3NiwKLSAgICAweDgxQ0QsIDB4ODFDRiwgMHg4MjBBLCAweDg1Q0YsIDB4ODVBOSwgMHg4NUNELCAweDg1RDAsIDB4ODVDOSwKLSAgICAweDg1QjAsIDB4ODVCQSwgMHg4NUI5LCAweDg3RUYsIDB4ODdFQywgMHg4N0YyLCAweDg3RTAsIDB4ODk4NiwKLSAgICAweDg5QjIsIDB4ODlGNCwgMHg4QjI4LCAweDhCMzksIDB4OEIyQywgMHg4QjJCLCAweDhDNTAsIDB4OEQwNSwKLSAgICAweDhFNTksIDB4OEU2MywgMHg4RTY2LCAweDhFNjQsIDB4OEU1RiwgMHg4RTU1LCAweDhFQzAsIDB4OEY0OSwKLSAgICAweDhGNEQsIDB4OTA4NywgMHg5MDgzLCAweDkwODgsIDB4OTFBQiwgMHg5MUFDLCAweDkxRDAsIDB4OTM5NCwKLSAgICAweDkzOEEsIDB4OTM5NiwgMHg5M0EyLCAweDkzQjMsIDB4OTNBRSwgMHg5M0FDLCAweDkzQjAsIDB4OTM5OCwKLSAgICAweDkzOUEsIDB4OTM5NywgMHg5NUQ0LCAweDk1RDYsIDB4OTVEMCwgMHg5NUQ1LCAweDk2RTIsIDB4OTZEQywKLSAgICAweDk2RDksIDB4OTZEQiwgMHg5NkRFLCAweDk3MjQsIDB4OTdBMywgMHg5N0E2LCAweDk3QUQsIDB4OTdGOSwKLSAgICAweDk4NEQsIDB4OTg0RiwgMHg5ODRDLCAweDk4NEUsIDB4OTg1MywgMHg5OEJBLCAweDk5M0UsIDB4OTkzRiwKLSAgICAweDk5M0QsIDB4OTkyRSwgMHg5OUE1LCAweDlBMEUsIDB4OUFDMSwgMHg5QjAzLCAweDlCMDYsIDB4OUI0RiwKLSAgICAweDlCNEUsIDB4OUI0RCwgMHg5QkNBLCAweDlCQzksIDB4OUJGRCwgMHg5QkM4LCAweDlCQzAsIDB4OUQ1MSwKLSAgICAweDlENUQsIDB4OUQ2MCwgMHg5RUUwLCAweDlGMTUsIDB4OUYyQywgMHg1MTMzLCAweDU2QTUsIDB4NTZBOCwKLSAgICAweDU4REUsIDB4NThERiwgMHg1OEUyLCAweDVCRjUsIDB4OUY5MCwgMHg1RUVDLCAweDYxRjIsIDB4NjFGNywKLSAgICAweDYxRjYsIDB4NjFGNSwgMHg2NTAwLCAweDY1MEYsIDB4NjZFMCwgMHg2NkRELCAweDZBRTUsIDB4NkFERCwKLSAgICAweDZBREEsIDB4NkFEMywgMHg3MDFCLCAweDcwMUYsIDB4NzAyOCwgMHg3MDFBLCAweDcwMUQsIDB4NzAxNSwKLSAgICAweDcwMTgsIDB4NzIwNiwgMHg3MjBELCAweDcyNTgsIDB4NzJBMiwgMHg3Mzc4LCAweDczN0EsIDB4NzRCRCwKLSAgICAweDc0Q0EsIDB4NzRFMywgMHg3NTg3LCAweDc1ODYsIDB4NzY1RiwgMHg3NjYxLCAweDc3QzcsIDB4NzkxOSwKLSAgICAweDc5QjEsIDB4N0E2QiwgMHg3QTY5LCAweDdDM0UsIDB4N0MzRiwgMHg3QzM4LCAweDdDM0QsIDB4N0MzNywKLSAgICAweDdDNDAsIDB4N0U2QiwgMHg3RTZELCAweDdFNzksIDB4N0U2OSwgMHg3RTZBLCAweDdFNzMsIDB4N0Y4NSwKLSAgICAweDdGQjYsIDB4N0ZCOSwgMHg3RkI4LCAweDgxRDgsIDB4ODVFOSwgMHg4NURELCAweDg1RUEsIDB4ODVENSwKLSAgICAweDg1RTQsIDB4ODVFNSwgMHg4NUY3LCAweDg3RkIsIDB4ODgwNSwgMHg4ODBELCAweDg3RjksIDB4ODdGRSwKLSAgICAweDg5NjAsIDB4ODk1RiwgMHg4OTU2LCAweDg5NUUsIDB4OEI0MSwgMHg4QjVDLCAweDhCNTgsIDB4OEI0OSwKLSAgICAweDhCNUEsIDB4OEI0RSwgMHg4QjRGLCAweDhCNDYsIDB4OEI1OSwgMHg4RDA4LCAweDhEMEEsIDB4OEU3QywKLSAgICAweDhFNzIsIDB4OEU4NywgMHg4RTc2LCAweDhFNkMsIDB4OEU3QSwgMHg4RTc0LCAweDhGNTQsIDB4OEY0RSwKLSAgICAweDhGQUQsIDB4OTA4QSwgMHg5MDhCLCAweDkxQjEsIDB4OTFBRSwgMHg5M0UxLCAweDkzRDEsIDB4OTNERiwKLSAgICAweDkzQzMsIDB4OTNDOCwgMHg5M0RDLCAweDkzREQsIDB4OTNENiwgMHg5M0UyLCAweDkzQ0QsIDB4OTNEOCwKLSAgICAweDkzRTQsIDB4OTNENywgMHg5M0U4LCAweDk1REMsIDB4OTZCNCwgMHg5NkUzLCAweDk3MkEsIDB4OTcyNywKLSAgICAweDk3NjEsIDB4OTdEQywgMHg5N0ZCLCAweDk4NUUsIDB4OTg1OCwgMHg5ODVCLCAweDk4QkMsIDB4OTk0NSwKLSAgICAweDk5NDksIDB4OUExNiwgMHg5QTE5LCAweDlCMEQsIDB4OUJFOCwgMHg5QkU3LCAweDlCRDYsIDB4OUJEQiwKLSAgICAweDlEODksIDB4OUQ2MSwgMHg5RDcyLCAweDlENkEsIDB4OUQ2QywgMHg5RTkyLCAweDlFOTcsIDB4OUU5MywKLSAgICAweDlFQjQsIDB4NTJGOCwgMHg1NkI3LCAweDU2QjYsIDB4NTZCNCwgMHg1NkJDLCAweDU4RTQsIDB4NUI0MCwKLSAgICAweDVCNDMsIDB4NUI3RCwgMHg1QkY2LCAweDVEQzksIDB4NjFGOCwgMHg2MUZBLCAweDY1MTgsIDB4NjUxNCwKLSAgICAweDY1MTksIDB4NjZFNiwgMHg2NzI3LCAweDZBRUMsIDB4NzAzRSwgMHg3MDMwLCAweDcwMzIsIDB4NzIxMCwKLSAgICAweDczN0IsIDB4NzRDRiwgMHg3NjYyLCAweDc2NjUsIDB4NzkyNiwgMHg3OTJBLCAweDc5MkMsIDB4NzkyQiwKLSAgICAweDdBQzcsIDB4N0FGNiwgMHg3QzRDLCAweDdDNDMsIDB4N0M0RCwgMHg3Q0VGLCAweDdDRjAsIDB4OEZBRSwKLSAgICAweDdFN0QsIDB4N0U3QywgMHg3RTgyLCAweDdGNEMsIDB4ODAwMCwgMHg4MURBLCAweDgyNjYsIDB4ODVGQiwKLSAgICAweDg1RjksIDB4ODYxMSwgMHg4NUZBLCAweDg2MDYsIDB4ODYwQiwgMHg4NjA3LCAweDg2MEEsIDB4ODgxNCwKLSAgICAweDg4MTUsIDB4ODk2NCwgMHg4OUJBLCAweDg5RjgsIDB4OEI3MCwgMHg4QjZDLCAweDhCNjYsIDB4OEI2RiwKLSAgICAweDhCNUYsIDB4OEI2QiwgMHg4RDBGLCAweDhEMEQsIDB4OEU4OSwgMHg4RTgxLCAweDhFODUsIDB4OEU4MiwKLSAgICAweDkxQjQsIDB4OTFDQiwgMHg5NDE4LCAweDk0MDMsIDB4OTNGRCwgMHg5NUUxLCAweDk3MzAsIDB4OThDNCwKLSAgICAweDk5NTIsIDB4OTk1MSwgMHg5OUE4LCAweDlBMkIsIDB4OUEzMCwgMHg5QTM3LCAweDlBMzUsIDB4OUMxMywKLSAgICAweDlDMEQsIDB4OUU3OSwgMHg5RUI1LCAweDlFRTgsIDB4OUYyRiwgMHg5RjVGLCAweDlGNjMsIDB4OUY2MSwKLSAgICAweDUxMzcsIDB4NTEzOCwgMHg1NkMxLCAweDU2QzAsIDB4NTZDMiwgMHg1OTE0LCAweDVDNkMsIDB4NURDRCwKLSAgICAweDYxRkMsIDB4NjFGRSwgMHg2NTFELCAweDY1MUMsIDB4NjU5NSwgMHg2NkU5LCAweDZBRkIsIDB4NkIwNCwKLSAgICAweDZBRkEsIDB4NkJCMiwgMHg3MDRDLCAweDcyMUIsIDB4NzJBNywgMHg3NEQ2LCAweDc0RDQsIDB4NzY2OSwKLSAgICAweDc3RDMsIDB4N0M1MCwgMHg3RThGLCAweDdFOEMsIDB4N0ZCQywgMHg4NjE3LCAweDg2MkQsIDB4ODYxQSwKLSAgICAweDg4MjMsIDB4ODgyMiwgMHg4ODIxLCAweDg4MUYsIDB4ODk2QSwgMHg4OTZDLCAweDg5QkQsIDB4OEI3NCwKLSAgICAweDhCNzcsIDB4OEI3RCwgMHg4RDEzLCAweDhFOEEsIDB4OEU4RCwgMHg4RThCLCAweDhGNUYsIDB4OEZBRiwKLSAgICAweDkxQkEsIDB4OTQyRSwgMHg5NDMzLCAweDk0MzUsIDB4OTQzQSwgMHg5NDM4LCAweDk0MzIsIDB4OTQyQiwKLSAgICAweDk1RTIsIDB4OTczOCwgMHg5NzM5LCAweDk3MzIsIDB4OTdGRiwgMHg5ODY3LCAweDk4NjUsIDB4OTk1NywKLSAgICAweDlBNDUsIDB4OUE0MywgMHg5QTQwLCAweDlBM0UsIDB4OUFDRiwgMHg5QjU0LCAweDlCNTEsIDB4OUMyRCwKLSAgICAweDlDMjUsIDB4OURBRiwgMHg5REI0LCAweDlEQzIsIDB4OURCOCwgMHg5RTlELCAweDlFRUYsIDB4OUYxOSwKLSAgICAweDlGNUMsIDB4OUY2NiwgMHg5RjY3LCAweDUxM0MsIDB4NTEzQiwgMHg1NkM4LCAweDU2Q0EsIDB4NTZDOSwKLSAgICAweDVCN0YsIDB4NURENCwgMHg1REQyLCAweDVGNEUsIDB4NjFGRiwgMHg2NTI0LCAweDZCMEEsIDB4NkI2MSwKLSAgICAweDcwNTEsIDB4NzA1OCwgMHg3MzgwLCAweDc0RTQsIDB4NzU4QSwgMHg3NjZFLCAweDc2NkMsIDB4NzlCMywKLSAgICAweDdDNjAsIDB4N0M1RiwgMHg4MDdFLCAweDgwN0QsIDB4ODFERiwgMHg4OTcyLCAweDg5NkYsIDB4ODlGQywKLSAgICAweDhCODAsIDB4OEQxNiwgMHg4RDE3LCAweDhFOTEsIDB4OEU5MywgMHg4RjYxLCAweDkxNDgsIDB4OTQ0NCwKLSAgICAweDk0NTEsIDB4OTQ1MiwgMHg5NzNELCAweDk3M0UsIDB4OTdDMywgMHg5N0MxLCAweDk4NkIsIDB4OTk1NSwKLSAgICAweDlBNTUsIDB4OUE0RCwgMHg5QUQyLCAweDlCMUEsIDB4OUM0OSwgMHg5QzMxLCAweDlDM0UsIDB4OUMzQiwKLSAgICAweDlERDMsIDB4OURENywgMHg5RjM0LCAweDlGNkMsIDB4OUY2QSwgMHg5Rjk0LCAweDU2Q0MsIDB4NURENiwKLSAgICAweDYyMDAsIDB4NjUyMywgMHg2NTJCLCAweDY1MkEsIDB4NjZFQywgMHg2QjEwLCAweDc0REEsIDB4N0FDQSwKLSAgICAweDdDNjQsIDB4N0M2MywgMHg3QzY1LCAweDdFOTMsIDB4N0U5NiwgMHg3RTk0LCAweDgxRTIsIDB4ODYzOCwKLSAgICAweDg2M0YsIDB4ODgzMSwgMHg4QjhBLCAweDkwOTAsIDB4OTA4RiwgMHg5NDYzLCAweDk0NjAsIDB4OTQ2NCwKLSAgICAweDk3NjgsIDB4OTg2RiwgMHg5OTVDLCAweDlBNUEsIDB4OUE1QiwgMHg5QTU3LCAweDlBRDMsIDB4OUFENCwKLSAgICAweDlBRDEsIDB4OUM1NCwgMHg5QzU3LCAweDlDNTYsIDB4OURFNSwgMHg5RTlGLCAweDlFRjQsIDB4NTZEMSwKLSAgICAweDU4RTksIDB4NjUyQywgMHg3MDVFLCAweDc2NzEsIDB4NzY3MiwgMHg3N0Q3LCAweDdGNTAsIDB4N0Y4OCwKLSAgICAweDg4MzYsIDB4ODgzOSwgMHg4ODYyLCAweDhCOTMsIDB4OEI5MiwgMHg4Qjk2LCAweDgyNzcsIDB4OEQxQiwKLSAgICAweDkxQzAsIDB4OTQ2QSwgMHg5NzQyLCAweDk3NDgsIDB4OTc0NCwgMHg5N0M2LCAweDk4NzAsIDB4OUE1RiwKLSAgICAweDlCMjIsIDB4OUI1OCwgMHg5QzVGLCAweDlERjksIDB4OURGQSwgMHg5RTdDLCAweDlFN0QsIDB4OUYwNywKLSAgICAweDlGNzcsIDB4OUY3MiwgMHg1RUYzLCAweDZCMTYsIDB4NzA2MywgMHg3QzZDLCAweDdDNkUsIDB4ODgzQiwKLSAgICAweDg5QzAsIDB4OEVBMSwgMHg5MUMxLCAweDk0NzIsIDB4OTQ3MCwgMHg5ODcxLCAweDk5NUUsIDB4OUFENiwKLSAgICAweDlCMjMsIDB4OUVDQywgMHg3MDY0LCAweDc3REEsIDB4OEI5QSwgMHg5NDc3LCAweDk3QzksIDB4OUE2MiwKLSAgICAweDlBNjUsIDB4N0U5QywgMHg4QjlDLCAweDhFQUEsIDB4OTFDNSwgMHg5NDdELCAweDk0N0UsIDB4OTQ3QywKLSAgICAweDlDNzcsIDB4OUM3OCwgMHg5RUY3LCAweDhDNTQsIDB4OTQ3RiwgMHg5RTFBLCAweDcyMjgsIDB4OUE2QSwKLSAgICAweDlCMzEsIDB4OUUxQiwgMHg5RTFFLCAweDdDNzIsIDB4NEU0MiwgMHg0RTVDLCAweDUxRjUsIDB4NTMxQSwKLSAgICAweDUzODIsIDB4NEUwNywgMHg0RTBDLCAweDRFNDcsIDB4NEU4RCwgMHg1NkQ3LCAweDVDNkUsIDB4NUY3MywKLSAgICAweDRFMEYsIDB4NTE4NywgMHg0RTBFLCAweDRFMkUsIDB4NEU5MywgMHg0RUMyLCAweDRFQzksIDB4NEVDOCwKLSAgICAweDUxOTgsIDB4NTJGQywgMHg1MzZDLCAweDUzQjksIDB4NTcyMCwgMHg1OTAzLCAweDU5MkMsIDB4NUMxMCwKLSAgICAweDVERkYsIDB4NjVFMSwgMHg2QkIzLCAweDZCQ0MsIDB4NkMxNCwgMHg3MjNGLCAweDRFMzEsIDB4NEUzQywKLSAgICAweDRFRTgsIDB4NEVEQywgMHg0RUU5LCAweDRFRTEsIDB4NEVERCwgMHg0RURBLCAweDUyMEMsIDB4NTIwOSwKLSAgICAweDUzMUMsIDB4NTM0QywgMHg1NzIyLCAweDU3MjMsIDB4NTkxNywgMHg1OTJGLCAweDVCODEsIDB4NUI4NCwKLSAgICAweDVDMTIsIDB4NUMzQiwgMHg1Qzc0LCAweDVDNzMsIDB4NUUwNCwgMHg1RTgwLCAweDVFODIsIDB4NUZDOSwKLSAgICAweDYyMDksIDB4NjI1MCwgMHg2QzE1LCAweDZDMzYsIDB4NkM0MywgMHg2QzNGLCAweDZDM0IsIDB4NzJBRSwKLSAgICAweDcyQjAsIDB4NzM4QSwgMHg3OUI4LCAweDgwOEEsIDB4OTYxRSwgMHg0RjBFLCAweDRGMTgsIDB4NEYyQywKLSAgICAweDRFRjUsIDB4NEYxNCwgMHg0RUYxLCAweDRGMDAsIDB4NEVGNywgMHg0RjA4LCAweDRGMUQsIDB4NEYwMiwKLSAgICAweDRGMDUsIDB4NEYyMiwgMHg0RjEzLCAweDRGMDQsIDB4NEVGNCwgMHg0RjEyLCAweDUxQjEsIDB4NTIxMywKLSAgICAweDUyMTAsIDB4NTJBNiwgMHg1MzIyLCAweDUzMUYsIDB4NTM0RCwgMHg1MzhBLCAweDU0MDcsIDB4NTZFMSwKLSAgICAweDU2REYsIDB4NTcyRSwgMHg1NzJBLCAweDU3MzQsIDB4NTkzQywgMHg1OTgwLCAweDU5N0MsIDB4NTk4NSwKLSAgICAweDU5N0IsIDB4NTk3RSwgMHg1OTc3LCAweDU5N0YsIDB4NUI1NiwgMHg1QzE1LCAweDVDMjUsIDB4NUM3QywKLSAgICAweDVDN0EsIDB4NUM3QiwgMHg1QzdFLCAweDVEREYsIDB4NUU3NSwgMHg1RTg0LCAweDVGMDIsIDB4NUYxQSwKLSAgICAweDVGNzQsIDB4NUZENSwgMHg1RkQ0LCAweDVGQ0YsIDB4NjI1QywgMHg2MjVFLCAweDYyNjQsIDB4NjI2MSwKLSAgICAweDYyNjYsIDB4NjI2MiwgMHg2MjU5LCAweDYyNjAsIDB4NjI1QSwgMHg2MjY1LCAweDY1MzcsIDB4NjVFRiwKLSAgICAweDY1RUUsIDB4NjczRSwgMHg2NzM5LCAweDY3MzgsIDB4NjczQiwgMHg2NzNBLCAweDY3M0YsIDB4NjczQywKLSAgICAweDY3MzMsIDB4NkMxOCwgMHg2QzQ2LCAweDZDNTIsIDB4NkM1QywgMHg2QzRGLCAweDZDNEEsIDB4NkM1NCwKLSAgICAweDZDNEIsIDB4NkM0QywgMHg3MDcxLCAweDcyNUUsIDB4NzJCNCwgMHg3MkI1LCAweDczOEUsIDB4NzUyQSwKLSAgICAweDc2N0YsIDB4N0E3NSwgMHg3RjUxLCAweDgyNzgsIDB4ODI3QywgMHg4MjgwLCAweDgyN0QsIDB4ODI3RiwKLSAgICAweDg2NEQsIDB4ODk3RSwgMHg5MDk5LCAweDkwOTcsIDB4OTA5OCwgMHg5MDlCLCAweDkwOTQsIDB4OTYyMiwKLSAgICAweDk2MjQsIDB4OTYyMCwgMHg5NjIzLCAweDRGNTYsIDB4NEYzQiwgMHg0RjYyLCAweDRGNDksIDB4NEY1MywKLSAgICAweDRGNjQsIDB4NEYzRSwgMHg0RjY3LCAweDRGNTIsIDB4NEY1RiwgMHg0RjQxLCAweDRGNTgsIDB4NEYyRCwKLSAgICAweDRGMzMsIDB4NEYzRiwgMHg0RjYxLCAweDUxOEYsIDB4NTFCOSwgMHg1MjFDLCAweDUyMUUsIDB4NTIyMSwKLSAgICAweDUyQUQsIDB4NTJBRSwgMHg1MzA5LCAweDUzNjMsIDB4NTM3MiwgMHg1MzhFLCAweDUzOEYsIDB4NTQzMCwKLSAgICAweDU0MzcsIDB4NTQyQSwgMHg1NDU0LCAweDU0NDUsIDB4NTQxOSwgMHg1NDFDLCAweDU0MjUsIDB4NTQxOCwKLSAgICAweDU0M0QsIDB4NTQ0RiwgMHg1NDQxLCAweDU0MjgsIDB4NTQyNCwgMHg1NDQ3LCAweDU2RUUsIDB4NTZFNywKLSAgICAweDU2RTUsIDB4NTc0MSwgMHg1NzQ1LCAweDU3NEMsIDB4NTc0OSwgMHg1NzRCLCAweDU3NTIsIDB4NTkwNiwKLSAgICAweDU5NDAsIDB4NTlBNiwgMHg1OTk4LCAweDU5QTAsIDB4NTk5NywgMHg1OThFLCAweDU5QTIsIDB4NTk5MCwKLSAgICAweDU5OEYsIDB4NTlBNywgMHg1OUExLCAweDVCOEUsIDB4NUI5MiwgMHg1QzI4LCAweDVDMkEsIDB4NUM4RCwKLSAgICAweDVDOEYsIDB4NUM4OCwgMHg1QzhCLCAweDVDODksIDB4NUM5MiwgMHg1QzhBLCAweDVDODYsIDB4NUM5MywKLSAgICAweDVDOTUsIDB4NURFMCwgMHg1RTBBLCAweDVFMEUsIDB4NUU4QiwgMHg1RTg5LCAweDVFOEMsIDB4NUU4OCwKLSAgICAweDVFOEQsIDB4NUYwNSwgMHg1RjFELCAweDVGNzgsIDB4NUY3NiwgMHg1RkQyLCAweDVGRDEsIDB4NUZEMCwKLSAgICAweDVGRUQsIDB4NUZFOCwgMHg1RkVFLCAweDVGRjMsIDB4NUZFMSwgMHg1RkU0LCAweDVGRTMsIDB4NUZGQSwKLSAgICAweDVGRUYsIDB4NUZGNywgMHg1RkZCLCAweDYwMDAsIDB4NUZGNCwgMHg2MjNBLCAweDYyODMsIDB4NjI4QywKLSAgICAweDYyOEUsIDB4NjI4RiwgMHg2Mjk0LCAweDYyODcsIDB4NjI3MSwgMHg2MjdCLCAweDYyN0EsIDB4NjI3MCwKLSAgICAweDYyODEsIDB4NjI4OCwgMHg2Mjc3LCAweDYyN0QsIDB4NjI3MiwgMHg2Mjc0LCAweDY1RjAsIDB4NjVGNCwKLSAgICAweDY1RjMsIDB4NjVGMiwgMHg2NUY1LCAweDY3NDUsIDB4Njc0NywgMHg2NzU5LCAweDY3NTUsIDB4Njc0QywKLSAgICAweDY3NDgsIDB4Njc1RCwgMHg2NzRELCAweDY3NUEsIDB4Njc0QiwgMHg2QkQwLCAweDZDMTksIDB4NkMxQSwKLSAgICAweDZDNzgsIDB4NkM2NywgMHg2QzZCLCAweDZDODQsIDB4NkM4QiwgMHg2QzhGLCAweDZDNzEsIDB4NkM2RiwKLSAgICAweDZDNjksIDB4NkM5QSwgMHg2QzZELCAweDZDODcsIDB4NkM5NSwgMHg2QzlDLCAweDZDNjYsIDB4NkM3MywKLSAgICAweDZDNjUsIDB4NkM3QiwgMHg2QzhFLCAweDcwNzQsIDB4NzA3QSwgMHg3MjYzLCAweDcyQkYsIDB4NzJCRCwKLSAgICAweDcyQzMsIDB4NzJDNiwgMHg3MkMxLCAweDcyQkEsIDB4NzJDNSwgMHg3Mzk1LCAweDczOTcsIDB4NzM5MywKLSAgICAweDczOTQsIDB4NzM5MiwgMHg3NTNBLCAweDc1MzksIDB4NzU5NCwgMHg3NTk1LCAweDc2ODEsIDB4NzkzRCwKLSAgICAweDgwMzQsIDB4ODA5NSwgMHg4MDk5LCAweDgwOTAsIDB4ODA5MiwgMHg4MDlDLCAweDgyOTAsIDB4ODI4RiwKLSAgICAweDgyODUsIDB4ODI4RSwgMHg4MjkxLCAweDgyOTMsIDB4ODI4QSwgMHg4MjgzLCAweDgyODQsIDB4OEM3OCwKLSAgICAweDhGQzksIDB4OEZCRiwgMHg5MDlGLCAweDkwQTEsIDB4OTBBNSwgMHg5MDlFLCAweDkwQTcsIDB4OTBBMCwKLSAgICAweDk2MzAsIDB4OTYyOCwgMHg5NjJGLCAweDk2MkQsIDB4NEUzMywgMHg0Rjk4LCAweDRGN0MsIDB4NEY4NSwKLSAgICAweDRGN0QsIDB4NEY4MCwgMHg0Rjg3LCAweDRGNzYsIDB4NEY3NCwgMHg0Rjg5LCAweDRGODQsIDB4NEY3NywKLSAgICAweDRGNEMsIDB4NEY5NywgMHg0RjZBLCAweDRGOUEsIDB4NEY3OSwgMHg0RjgxLCAweDRGNzgsIDB4NEY5MCwKLSAgICAweDRGOUMsIDB4NEY5NCwgMHg0RjlFLCAweDRGOTIsIDB4NEY4MiwgMHg0Rjk1LCAweDRGNkIsIDB4NEY2RSwKLSAgICAweDUxOUUsIDB4NTFCQywgMHg1MUJFLCAweDUyMzUsIDB4NTIzMiwgMHg1MjMzLCAweDUyNDYsIDB4NTIzMSwKLSAgICAweDUyQkMsIDB4NTMwQSwgMHg1MzBCLCAweDUzM0MsIDB4NTM5MiwgMHg1Mzk0LCAweDU0ODcsIDB4NTQ3RiwKLSAgICAweDU0ODEsIDB4NTQ5MSwgMHg1NDgyLCAweDU0ODgsIDB4NTQ2QiwgMHg1NDdBLCAweDU0N0UsIDB4NTQ2NSwKLSAgICAweDU0NkMsIDB4NTQ3NCwgMHg1NDY2LCAweDU0OEQsIDB4NTQ2RiwgMHg1NDYxLCAweDU0NjAsIDB4NTQ5OCwKLSAgICAweDU0NjMsIDB4NTQ2NywgMHg1NDY0LCAweDU2RjcsIDB4NTZGOSwgMHg1NzZGLCAweDU3NzIsIDB4NTc2RCwKLSAgICAweDU3NkIsIDB4NTc3MSwgMHg1NzcwLCAweDU3NzYsIDB4NTc4MCwgMHg1Nzc1LCAweDU3N0IsIDB4NTc3MywKLSAgICAweDU3NzQsIDB4NTc2MiwgMHg1NzY4LCAweDU3N0QsIDB4NTkwQywgMHg1OTQ1LCAweDU5QjUsIDB4NTlCQSwKLSAgICAweDU5Q0YsIDB4NTlDRSwgMHg1OUIyLCAweDU5Q0MsIDB4NTlDMSwgMHg1OUI2LCAweDU5QkMsIDB4NTlDMywKLSAgICAweDU5RDYsIDB4NTlCMSwgMHg1OUJELCAweDU5QzAsIDB4NTlDOCwgMHg1OUI0LCAweDU5QzcsIDB4NUI2MiwKLSAgICAweDVCNjUsIDB4NUI5MywgMHg1Qjk1LCAweDVDNDQsIDB4NUM0NywgMHg1Q0FFLCAweDVDQTQsIDB4NUNBMCwKLSAgICAweDVDQjUsIDB4NUNBRiwgMHg1Q0E4LCAweDVDQUMsIDB4NUM5RiwgMHg1Q0EzLCAweDVDQUQsIDB4NUNBMiwKLSAgICAweDVDQUEsIDB4NUNBNywgMHg1QzlELCAweDVDQTUsIDB4NUNCNiwgMHg1Q0IwLCAweDVDQTYsIDB4NUUxNywKLSAgICAweDVFMTQsIDB4NUUxOSwgMHg1RjI4LCAweDVGMjIsIDB4NUYyMywgMHg1RjI0LCAweDVGNTQsIDB4NUY4MiwKLSAgICAweDVGN0UsIDB4NUY3RCwgMHg1RkRFLCAweDVGRTUsIDB4NjAyRCwgMHg2MDI2LCAweDYwMTksIDB4NjAzMiwKLSAgICAweDYwMEIsIDB4NjAzNCwgMHg2MDBBLCAweDYwMTcsIDB4NjAzMywgMHg2MDFBLCAweDYwMUUsIDB4NjAyQywKLSAgICAweDYwMjIsIDB4NjAwRCwgMHg2MDEwLCAweDYwMkUsIDB4NjAxMywgMHg2MDExLCAweDYwMEMsIDB4NjAwOSwKLSAgICAweDYwMUMsIDB4NjIxNCwgMHg2MjNELCAweDYyQUQsIDB4NjJCNCwgMHg2MkQxLCAweDYyQkUsIDB4NjJBQSwKLSAgICAweDYyQjYsIDB4NjJDQSwgMHg2MkFFLCAweDYyQjMsIDB4NjJBRiwgMHg2MkJCLCAweDYyQTksIDB4NjJCMCwKLSAgICAweDYyQjgsIDB4NjUzRCwgMHg2NUE4LCAweDY1QkIsIDB4NjYwOSwgMHg2NUZDLCAweDY2MDQsIDB4NjYxMiwKLSAgICAweDY2MDgsIDB4NjVGQiwgMHg2NjAzLCAweDY2MEIsIDB4NjYwRCwgMHg2NjA1LCAweDY1RkQsIDB4NjYxMSwKLSAgICAweDY2MTAsIDB4NjZGNiwgMHg2NzBBLCAweDY3ODUsIDB4Njc2QywgMHg2NzhFLCAweDY3OTIsIDB4Njc3NiwKLSAgICAweDY3N0IsIDB4Njc5OCwgMHg2Nzg2LCAweDY3ODQsIDB4Njc3NCwgMHg2NzhELCAweDY3OEMsIDB4Njc3QSwKLSAgICAweDY3OUYsIDB4Njc5MSwgMHg2Nzk5LCAweDY3ODMsIDB4Njc3RCwgMHg2NzgxLCAweDY3NzgsIDB4Njc3OSwKLSAgICAweDY3OTQsIDB4NkIyNSwgMHg2QjgwLCAweDZCN0UsIDB4NkJERSwgMHg2QzFELCAweDZDOTMsIDB4NkNFQywKLSAgICAweDZDRUIsIDB4NkNFRSwgMHg2Q0Q5LCAweDZDQjYsIDB4NkNENCwgMHg2Q0FELCAweDZDRTcsIDB4NkNCNywKLSAgICAweDZDRDAsIDB4NkNDMiwgMHg2Q0JBLCAweDZDQzMsIDB4NkNDNiwgMHg2Q0VELCAweDZDRjIsIDB4NkNEMiwKLSAgICAweDZDREQsIDB4NkNCNCwgMHg2QzhBLCAweDZDOUQsIDB4NkM4MCwgMHg2Q0RFLCAweDZDQzAsIDB4NkQzMCwKLSAgICAweDZDQ0QsIDB4NkNDNywgMHg2Q0IwLCAweDZDRjksIDB4NkNDRiwgMHg2Q0U5LCAweDZDRDEsIDB4NzA5NCwKLSAgICAweDcwOTgsIDB4NzA4NSwgMHg3MDkzLCAweDcwODYsIDB4NzA4NCwgMHg3MDkxLCAweDcwOTYsIDB4NzA4MiwKLSAgICAweDcwOUEsIDB4NzA4MywgMHg3MjZBLCAweDcyRDYsIDB4NzJDQiwgMHg3MkQ4LCAweDcyQzksIDB4NzJEQywKLSAgICAweDcyRDIsIDB4NzJENCwgMHg3MkRBLCAweDcyQ0MsIDB4NzJEMSwgMHg3M0E0LCAweDczQTEsIDB4NzNBRCwKLSAgICAweDczQTYsIDB4NzNBMiwgMHg3M0EwLCAweDczQUMsIDB4NzM5RCwgMHg3NERELCAweDc0RTgsIDB4NzUzRiwKLSAgICAweDc1NDAsIDB4NzUzRSwgMHg3NThDLCAweDc1OTgsIDB4NzZBRiwgMHg3NkYzLCAweDc2RjEsIDB4NzZGMCwKLSAgICAweDc2RjUsIDB4NzdGOCwgMHg3N0ZDLCAweDc3RjksIDB4NzdGQiwgMHg3N0ZBLCAweDc3RjcsIDB4Nzk0MiwKLSAgICAweDc5M0YsIDB4NzlDNSwgMHg3QTc4LCAweDdBN0IsIDB4N0FGQiwgMHg3Qzc1LCAweDdDRkQsIDB4ODAzNSwKLSAgICAweDgwOEYsIDB4ODBBRSwgMHg4MEEzLCAweDgwQjgsIDB4ODBCNSwgMHg4MEFELCAweDgyMjAsIDB4ODJBMCwKLSAgICAweDgyQzAsIDB4ODJBQiwgMHg4MjlBLCAweDgyOTgsIDB4ODI5QiwgMHg4MkI1LCAweDgyQTcsIDB4ODJBRSwKLSAgICAweDgyQkMsIDB4ODI5RSwgMHg4MkJBLCAweDgyQjQsIDB4ODJBOCwgMHg4MkExLCAweDgyQTksIDB4ODJDMiwKLSAgICAweDgyQTQsIDB4ODJDMywgMHg4MkI2LCAweDgyQTIsIDB4ODY3MCwgMHg4NjZGLCAweDg2NkQsIDB4ODY2RSwKLSAgICAweDhDNTYsIDB4OEZEMiwgMHg4RkNCLCAweDhGRDMsIDB4OEZDRCwgMHg4RkQ2LCAweDhGRDUsIDB4OEZENywKLSAgICAweDkwQjIsIDB4OTBCNCwgMHg5MEFGLCAweDkwQjMsIDB4OTBCMCwgMHg5NjM5LCAweDk2M0QsIDB4OTYzQywKLSAgICAweDk2M0EsIDB4OTY0MywgMHg0RkNELCAweDRGQzUsIDB4NEZEMywgMHg0RkIyLCAweDRGQzksIDB4NEZDQiwKLSAgICAweDRGQzEsIDB4NEZENCwgMHg0RkRDLCAweDRGRDksIDB4NEZCQiwgMHg0RkIzLCAweDRGREIsIDB4NEZDNywKLSAgICAweDRGRDYsIDB4NEZCQSwgMHg0RkMwLCAweDRGQjksIDB4NEZFQywgMHg1MjQ0LCAweDUyNDksIDB4NTJDMCwKLSAgICAweDUyQzIsIDB4NTMzRCwgMHg1MzdDLCAweDUzOTcsIDB4NTM5NiwgMHg1Mzk5LCAweDUzOTgsIDB4NTRCQSwKLSAgICAweDU0QTEsIDB4NTRBRCwgMHg1NEE1LCAweDU0Q0YsIDB4NTRDMywgMHg4MzBELCAweDU0QjcsIDB4NTRBRSwKLSAgICAweDU0RDYsIDB4NTRCNiwgMHg1NEM1LCAweDU0QzYsIDB4NTRBMCwgMHg1NDcwLCAweDU0QkMsIDB4NTRBMiwKLSAgICAweDU0QkUsIDB4NTQ3MiwgMHg1NERFLCAweDU0QjAsIDB4NTdCNSwgMHg1NzlFLCAweDU3OUYsIDB4NTdBNCwKLSAgICAweDU3OEMsIDB4NTc5NywgMHg1NzlELCAweDU3OUIsIDB4NTc5NCwgMHg1Nzk4LCAweDU3OEYsIDB4NTc5OSwKLSAgICAweDU3QTUsIDB4NTc5QSwgMHg1Nzk1LCAweDU4RjQsIDB4NTkwRCwgMHg1OTUzLCAweDU5RTEsIDB4NTlERSwKLSAgICAweDU5RUUsIDB4NUEwMCwgMHg1OUYxLCAweDU5REQsIDB4NTlGQSwgMHg1OUZELCAweDU5RkMsIDB4NTlGNiwKLSAgICAweDU5RTQsIDB4NTlGMiwgMHg1OUY3LCAweDU5REIsIDB4NTlFOSwgMHg1OUYzLCAweDU5RjUsIDB4NTlFMCwKLSAgICAweDU5RkUsIDB4NTlGNCwgMHg1OUVELCAweDVCQTgsIDB4NUM0QywgMHg1Q0QwLCAweDVDRDgsIDB4NUNDQywKLSAgICAweDVDRDcsIDB4NUNDQiwgMHg1Q0RCLCAweDVDREUsIDB4NUNEQSwgMHg1Q0M5LCAweDVDQzcsIDB4NUNDQSwKLSAgICAweDVDRDYsIDB4NUNEMywgMHg1Q0Q0LCAweDVDQ0YsIDB4NUNDOCwgMHg1Q0M2LCAweDVDQ0UsIDB4NUNERiwKLSAgICAweDVDRjgsIDB4NURGOSwgMHg1RTIxLCAweDVFMjIsIDB4NUUyMywgMHg1RTIwLCAweDVFMjQsIDB4NUVCMCwKLSAgICAweDVFQTQsIDB4NUVBMiwgMHg1RTlCLCAweDVFQTMsIDB4NUVBNSwgMHg1RjA3LCAweDVGMkUsIDB4NUY1NiwKLSAgICAweDVGODYsIDB4NjAzNywgMHg2MDM5LCAweDYwNTQsIDB4NjA3MiwgMHg2MDVFLCAweDYwNDUsIDB4NjA1MywKLSAgICAweDYwNDcsIDB4NjA0OSwgMHg2MDVCLCAweDYwNEMsIDB4NjA0MCwgMHg2MDQyLCAweDYwNUYsIDB4NjAyNCwKLSAgICAweDYwNDQsIDB4NjA1OCwgMHg2MDY2LCAweDYwNkUsIDB4NjI0MiwgMHg2MjQzLCAweDYyQ0YsIDB4NjMwRCwKLSAgICAweDYzMEIsIDB4NjJGNSwgMHg2MzBFLCAweDYzMDMsIDB4NjJFQiwgMHg2MkY5LCAweDYzMEYsIDB4NjMwQywKLSAgICAweDYyRjgsIDB4NjJGNiwgMHg2MzAwLCAweDYzMTMsIDB4NjMxNCwgMHg2MkZBLCAweDYzMTUsIDB4NjJGQiwKLSAgICAweDYyRjAsIDB4NjU0MSwgMHg2NTQzLCAweDY1QUEsIDB4NjVCRiwgMHg2NjM2LCAweDY2MjEsIDB4NjYzMiwKLSAgICAweDY2MzUsIDB4NjYxQywgMHg2NjI2LCAweDY2MjIsIDB4NjYzMywgMHg2NjJCLCAweDY2M0EsIDB4NjYxRCwKLSAgICAweDY2MzQsIDB4NjYzOSwgMHg2NjJFLCAweDY3MEYsIDB4NjcxMCwgMHg2N0MxLCAweDY3RjIsIDB4NjdDOCwKLSAgICAweDY3QkEsIDB4NjdEQywgMHg2N0JCLCAweDY3RjgsIDB4NjdEOCwgMHg2N0MwLCAweDY3QjcsIDB4NjdDNSwKLSAgICAweDY3RUIsIDB4NjdFNCwgMHg2N0RGLCAweDY3QjUsIDB4NjdDRCwgMHg2N0IzLCAweDY3RjcsIDB4NjdGNiwKLSAgICAweDY3RUUsIDB4NjdFMywgMHg2N0MyLCAweDY3QjksIDB4NjdDRSwgMHg2N0U3LCAweDY3RjAsIDB4NjdCMiwKLSAgICAweDY3RkMsIDB4NjdDNiwgMHg2N0VELCAweDY3Q0MsIDB4NjdBRSwgMHg2N0U2LCAweDY3REIsIDB4NjdGQSwKLSAgICAweDY3QzksIDB4NjdDQSwgMHg2N0MzLCAweDY3RUEsIDB4NjdDQiwgMHg2QjI4LCAweDZCODIsIDB4NkI4NCwKLSAgICAweDZCQjYsIDB4NkJENiwgMHg2QkQ4LCAweDZCRTAsIDB4NkMyMCwgMHg2QzIxLCAweDZEMjgsIDB4NkQzNCwKLSAgICAweDZEMkQsIDB4NkQxRiwgMHg2RDNDLCAweDZEM0YsIDB4NkQxMiwgMHg2RDBBLCAweDZDREEsIDB4NkQzMywKLSAgICAweDZEMDQsIDB4NkQxOSwgMHg2RDNBLCAweDZEMUEsIDB4NkQxMSwgMHg2RDAwLCAweDZEMUQsIDB4NkQ0MiwKLSAgICAweDZEMDEsIDB4NkQxOCwgMHg2RDM3LCAweDZEMDMsIDB4NkQwRiwgMHg2RDQwLCAweDZEMDcsIDB4NkQyMCwKLSAgICAweDZEMkMsIDB4NkQwOCwgMHg2RDIyLCAweDZEMDksIDB4NkQxMCwgMHg3MEI3LCAweDcwOUYsIDB4NzBCRSwKLSAgICAweDcwQjEsIDB4NzBCMCwgMHg3MEExLCAweDcwQjQsIDB4NzBCNSwgMHg3MEE5LCAweDcyNDEsIDB4NzI0OSwKLSAgICAweDcyNEEsIDB4NzI2QywgMHg3MjcwLCAweDcyNzMsIDB4NzI2RSwgMHg3MkNBLCAweDcyRTQsIDB4NzJFOCwKLSAgICAweDcyRUIsIDB4NzJERiwgMHg3MkVBLCAweDcyRTYsIDB4NzJFMywgMHg3Mzg1LCAweDczQ0MsIDB4NzNDMiwKLSAgICAweDczQzgsIDB4NzNDNSwgMHg3M0I5LCAweDczQjYsIDB4NzNCNSwgMHg3M0I0LCAweDczRUIsIDB4NzNCRiwKLSAgICAweDczQzcsIDB4NzNCRSwgMHg3M0MzLCAweDczQzYsIDB4NzNCOCwgMHg3M0NCLCAweDc0RUMsIDB4NzRFRSwKLSAgICAweDc1MkUsIDB4NzU0NywgMHg3NTQ4LCAweDc1QTcsIDB4NzVBQSwgMHg3Njc5LCAweDc2QzQsIDB4NzcwOCwKLSAgICAweDc3MDMsIDB4NzcwNCwgMHg3NzA1LCAweDc3MEEsIDB4NzZGNywgMHg3NkZCLCAweDc2RkEsIDB4NzdFNywKLSAgICAweDc3RTgsIDB4NzgwNiwgMHg3ODExLCAweDc4MTIsIDB4NzgwNSwgMHg3ODEwLCAweDc4MEYsIDB4NzgwRSwKLSAgICAweDc4MDksIDB4NzgwMywgMHg3ODEzLCAweDc5NEEsIDB4Nzk0QywgMHg3OTRCLCAweDc5NDUsIDB4Nzk0NCwKLSAgICAweDc5RDUsIDB4NzlDRCwgMHg3OUNGLCAweDc5RDYsIDB4NzlDRSwgMHg3QTgwLCAweDdBN0UsIDB4N0FEMSwKLSAgICAweDdCMDAsIDB4N0IwMSwgMHg3QzdBLCAweDdDNzgsIDB4N0M3OSwgMHg3QzdGLCAweDdDODAsIDB4N0M4MSwKLSAgICAweDdEMDMsIDB4N0QwOCwgMHg3RDAxLCAweDdGNTgsIDB4N0Y5MSwgMHg3RjhELCAweDdGQkUsIDB4ODAwNywKLSAgICAweDgwMEUsIDB4ODAwRiwgMHg4MDE0LCAweDgwMzcsIDB4ODBEOCwgMHg4MEM3LCAweDgwRTAsIDB4ODBEMSwKLSAgICAweDgwQzgsIDB4ODBDMiwgMHg4MEQwLCAweDgwQzUsIDB4ODBFMywgMHg4MEQ5LCAweDgwREMsIDB4ODBDQSwKLSAgICAweDgwRDUsIDB4ODBDOSwgMHg4MENGLCAweDgwRDcsIDB4ODBFNiwgMHg4MENELCAweDgxRkYsIDB4ODIyMSwKLSAgICAweDgyOTQsIDB4ODJEOSwgMHg4MkZFLCAweDgyRjksIDB4ODMwNywgMHg4MkU4LCAweDgzMDAsIDB4ODJENSwKLSAgICAweDgzM0EsIDB4ODJFQiwgMHg4MkQ2LCAweDgyRjQsIDB4ODJFQywgMHg4MkUxLCAweDgyRjIsIDB4ODJGNSwKLSAgICAweDgzMEMsIDB4ODJGQiwgMHg4MkY2LCAweDgyRjAsIDB4ODJFQSwgMHg4MkU0LCAweDgyRTAsIDB4ODJGQSwKLSAgICAweDgyRjMsIDB4ODJFRCwgMHg4Njc3LCAweDg2NzQsIDB4ODY3QywgMHg4NjczLCAweDg4NDEsIDB4ODg0RSwKLSAgICAweDg4NjcsIDB4ODg2QSwgMHg4ODY5LCAweDg5RDMsIDB4OEEwNCwgMHg4QTA3LCAweDhENzIsIDB4OEZFMywKLSAgICAweDhGRTEsIDB4OEZFRSwgMHg4RkUwLCAweDkwRjEsIDB4OTBCRCwgMHg5MEJGLCAweDkwRDUsIDB4OTBDNSwKLSAgICAweDkwQkUsIDB4OTBDNywgMHg5MENCLCAweDkwQzgsIDB4OTFENCwgMHg5MUQzLCAweDk2NTQsIDB4OTY0RiwKLSAgICAweDk2NTEsIDB4OTY1MywgMHg5NjRBLCAweDk2NEUsIDB4NTAxRSwgMHg1MDA1LCAweDUwMDcsIDB4NTAxMywKLSAgICAweDUwMjIsIDB4NTAzMCwgMHg1MDFCLCAweDRGRjUsIDB4NEZGNCwgMHg1MDMzLCAweDUwMzcsIDB4NTAyQywKLSAgICAweDRGRjYsIDB4NEZGNywgMHg1MDE3LCAweDUwMUMsIDB4NTAyMCwgMHg1MDI3LCAweDUwMzUsIDB4NTAyRiwKLSAgICAweDUwMzEsIDB4NTAwRSwgMHg1MTVBLCAweDUxOTQsIDB4NTE5MywgMHg1MUNBLCAweDUxQzQsIDB4NTFDNSwKLSAgICAweDUxQzgsIDB4NTFDRSwgMHg1MjYxLCAweDUyNUEsIDB4NTI1MiwgMHg1MjVFLCAweDUyNUYsIDB4NTI1NSwKLSAgICAweDUyNjIsIDB4NTJDRCwgMHg1MzBFLCAweDUzOUUsIDB4NTUyNiwgMHg1NEUyLCAweDU1MTcsIDB4NTUxMiwKLSAgICAweDU0RTcsIDB4NTRGMywgMHg1NEU0LCAweDU1MUEsIDB4NTRGRiwgMHg1NTA0LCAweDU1MDgsIDB4NTRFQiwKLSAgICAweDU1MTEsIDB4NTUwNSwgMHg1NEYxLCAweDU1MEEsIDB4NTRGQiwgMHg1NEY3LCAweDU0RjgsIDB4NTRFMCwKLSAgICAweDU1MEUsIDB4NTUwMywgMHg1NTBCLCAweDU3MDEsIDB4NTcwMiwgMHg1N0NDLCAweDU4MzIsIDB4NTdENSwKLSAgICAweDU3RDIsIDB4NTdCQSwgMHg1N0M2LCAweDU3QkQsIDB4NTdCQywgMHg1N0I4LCAweDU3QjYsIDB4NTdCRiwKLSAgICAweDU3QzcsIDB4NTdEMCwgMHg1N0I5LCAweDU3QzEsIDB4NTkwRSwgMHg1OTRBLCAweDVBMTksIDB4NUExNiwKLSAgICAweDVBMkQsIDB4NUEyRSwgMHg1QTE1LCAweDVBMEYsIDB4NUExNywgMHg1QTBBLCAweDVBMUUsIDB4NUEzMywKLSAgICAweDVCNkMsIDB4NUJBNywgMHg1QkFELCAweDVCQUMsIDB4NUMwMywgMHg1QzU2LCAweDVDNTQsIDB4NUNFQywKLSAgICAweDVDRkYsIDB4NUNFRSwgMHg1Q0YxLCAweDVDRjcsIDB4NUQwMCwgMHg1Q0Y5LCAweDVFMjksIDB4NUUyOCwKLSAgICAweDVFQTgsIDB4NUVBRSwgMHg1RUFBLCAweDVFQUMsIDB4NUYzMywgMHg1RjMwLCAweDVGNjcsIDB4NjA1RCwKLSAgICAweDYwNUEsIDB4NjA2NywgMHg2MDQxLCAweDYwQTIsIDB4NjA4OCwgMHg2MDgwLCAweDYwOTIsIDB4NjA4MSwKLSAgICAweDYwOUQsIDB4NjA4MywgMHg2MDk1LCAweDYwOUIsIDB4NjA5NywgMHg2MDg3LCAweDYwOUMsIDB4NjA4RSwKLSAgICAweDYyMTksIDB4NjI0NiwgMHg2MkYyLCAweDYzMTAsIDB4NjM1NiwgMHg2MzJDLCAweDYzNDQsIDB4NjM0NSwKLSAgICAweDYzMzYsIDB4NjM0MywgMHg2M0U0LCAweDYzMzksIDB4NjM0QiwgMHg2MzRBLCAweDYzM0MsIDB4NjMyOSwKLSAgICAweDYzNDEsIDB4NjMzNCwgMHg2MzU4LCAweDYzNTQsIDB4NjM1OSwgMHg2MzJELCAweDYzNDcsIDB4NjMzMywKLSAgICAweDYzNUEsIDB4NjM1MSwgMHg2MzM4LCAweDYzNTcsIDB4NjM0MCwgMHg2MzQ4LCAweDY1NEEsIDB4NjU0NiwKLSAgICAweDY1QzYsIDB4NjVDMywgMHg2NUM0LCAweDY1QzIsIDB4NjY0QSwgMHg2NjVGLCAweDY2NDcsIDB4NjY1MSwKLSAgICAweDY3MTIsIDB4NjcxMywgMHg2ODFGLCAweDY4MUEsIDB4Njg0OSwgMHg2ODMyLCAweDY4MzMsIDB4NjgzQiwKLSAgICAweDY4NEIsIDB4Njg0RiwgMHg2ODE2LCAweDY4MzEsIDB4NjgxQywgMHg2ODM1LCAweDY4MkIsIDB4NjgyRCwKLSAgICAweDY4MkYsIDB4Njg0RSwgMHg2ODQ0LCAweDY4MzQsIDB4NjgxRCwgMHg2ODEyLCAweDY4MTQsIDB4NjgyNiwKLSAgICAweDY4MjgsIDB4NjgyRSwgMHg2ODRELCAweDY4M0EsIDB4NjgyNSwgMHg2ODIwLCAweDZCMkMsIDB4NkIyRiwKLSAgICAweDZCMkQsIDB4NkIzMSwgMHg2QjM0LCAweDZCNkQsIDB4ODA4MiwgMHg2Qjg4LCAweDZCRTYsIDB4NkJFNCwKLSAgICAweDZCRTgsIDB4NkJFMywgMHg2QkUyLCAweDZCRTcsIDB4NkMyNSwgMHg2RDdBLCAweDZENjMsIDB4NkQ2NCwKLSAgICAweDZENzYsIDB4NkQwRCwgMHg2RDYxLCAweDZEOTIsIDB4NkQ1OCwgMHg2RDYyLCAweDZENkQsIDB4NkQ2RiwKLSAgICAweDZEOTEsIDB4NkQ4RCwgMHg2REVGLCAweDZEN0YsIDB4NkQ4NiwgMHg2RDVFLCAweDZENjcsIDB4NkQ2MCwKLSAgICAweDZEOTcsIDB4NkQ3MCwgMHg2RDdDLCAweDZENUYsIDB4NkQ4MiwgMHg2RDk4LCAweDZEMkYsIDB4NkQ2OCwKLSAgICAweDZEOEIsIDB4NkQ3RSwgMHg2RDgwLCAweDZEODQsIDB4NkQxNiwgMHg2RDgzLCAweDZEN0IsIDB4NkQ3RCwKLSAgICAweDZENzUsIDB4NkQ5MCwgMHg3MERDLCAweDcwRDMsIDB4NzBEMSwgMHg3MERELCAweDcwQ0IsIDB4N0YzOSwKLSAgICAweDcwRTIsIDB4NzBENywgMHg3MEQyLCAweDcwREUsIDB4NzBFMCwgMHg3MEQ0LCAweDcwQ0QsIDB4NzBDNSwKLSAgICAweDcwQzYsIDB4NzBDNywgMHg3MERBLCAweDcwQ0UsIDB4NzBFMSwgMHg3MjQyLCAweDcyNzgsIDB4NzI3NywKLSAgICAweDcyNzYsIDB4NzMwMCwgMHg3MkZBLCAweDcyRjQsIDB4NzJGRSwgMHg3MkY2LCAweDcyRjMsIDB4NzJGQiwKLSAgICAweDczMDEsIDB4NzNEMywgMHg3M0Q5LCAweDczRTUsIDB4NzNENiwgMHg3M0JDLCAweDczRTcsIDB4NzNFMywKLSAgICAweDczRTksIDB4NzNEQywgMHg3M0QyLCAweDczREIsIDB4NzNENCwgMHg3M0RELCAweDczREEsIDB4NzNENywKLSAgICAweDczRDgsIDB4NzNFOCwgMHg3NERFLCAweDc0REYsIDB4NzRGNCwgMHg3NEY1LCAweDc1MjEsIDB4NzU1QiwKLSAgICAweDc1NUYsIDB4NzVCMCwgMHg3NUMxLCAweDc1QkIsIDB4NzVDNCwgMHg3NUMwLCAweDc1QkYsIDB4NzVCNiwKLSAgICAweDc1QkEsIDB4NzY4QSwgMHg3NkM5LCAweDc3MUQsIDB4NzcxQiwgMHg3NzEwLCAweDc3MTMsIDB4NzcxMiwKLSAgICAweDc3MjMsIDB4NzcxMSwgMHg3NzE1LCAweDc3MTksIDB4NzcxQSwgMHg3NzIyLCAweDc3MjcsIDB4NzgyMywKLSAgICAweDc4MkMsIDB4NzgyMiwgMHg3ODM1LCAweDc4MkYsIDB4NzgyOCwgMHg3ODJFLCAweDc4MkIsIDB4NzgyMSwKLSAgICAweDc4MjksIDB4NzgzMywgMHg3ODJBLCAweDc4MzEsIDB4Nzk1NCwgMHg3OTVCLCAweDc5NEYsIDB4Nzk1QywKLSAgICAweDc5NTMsIDB4Nzk1MiwgMHg3OTUxLCAweDc5RUIsIDB4NzlFQywgMHg3OUUwLCAweDc5RUUsIDB4NzlFRCwKLSAgICAweDc5RUEsIDB4NzlEQywgMHg3OURFLCAweDc5REQsIDB4N0E4NiwgMHg3QTg5LCAweDdBODUsIDB4N0E4QiwKLSAgICAweDdBOEMsIDB4N0E4QSwgMHg3QTg3LCAweDdBRDgsIDB4N0IxMCwgMHg3QjA0LCAweDdCMTMsIDB4N0IwNSwKLSAgICAweDdCMEYsIDB4N0IwOCwgMHg3QjBBLCAweDdCMEUsIDB4N0IwOSwgMHg3QjEyLCAweDdDODQsIDB4N0M5MSwKLSAgICAweDdDOEEsIDB4N0M4QywgMHg3Qzg4LCAweDdDOEQsIDB4N0M4NSwgMHg3RDFFLCAweDdEMUQsIDB4N0QxMSwKLSAgICAweDdEMEUsIDB4N0QxOCwgMHg3RDE2LCAweDdEMTMsIDB4N0QxRiwgMHg3RDEyLCAweDdEMEYsIDB4N0QwQywKLSAgICAweDdGNUMsIDB4N0Y2MSwgMHg3RjVFLCAweDdGNjAsIDB4N0Y1RCwgMHg3RjVCLCAweDdGOTYsIDB4N0Y5MiwKLSAgICAweDdGQzMsIDB4N0ZDMiwgMHg3RkMwLCAweDgwMTYsIDB4ODAzRSwgMHg4MDM5LCAweDgwRkEsIDB4ODBGMiwKLSAgICAweDgwRjksIDB4ODBGNSwgMHg4MTAxLCAweDgwRkIsIDB4ODEwMCwgMHg4MjAxLCAweDgyMkYsIDB4ODIyNSwKLSAgICAweDgzMzMsIDB4ODMyRCwgMHg4MzQ0LCAweDgzMTksIDB4ODM1MSwgMHg4MzI1LCAweDgzNTYsIDB4ODMzRiwKLSAgICAweDgzNDEsIDB4ODMyNiwgMHg4MzFDLCAweDgzMjIsIDB4ODM0MiwgMHg4MzRFLCAweDgzMUIsIDB4ODMyQSwKLSAgICAweDgzMDgsIDB4ODMzQywgMHg4MzRELCAweDgzMTYsIDB4ODMyNCwgMHg4MzIwLCAweDgzMzcsIDB4ODMyRiwKLSAgICAweDgzMjksIDB4ODM0NywgMHg4MzQ1LCAweDgzNEMsIDB4ODM1MywgMHg4MzFFLCAweDgzMkMsIDB4ODM0QiwKLSAgICAweDgzMjcsIDB4ODM0OCwgMHg4NjUzLCAweDg2NTIsIDB4ODZBMiwgMHg4NkE4LCAweDg2OTYsIDB4ODY4RCwKLSAgICAweDg2OTEsIDB4ODY5RSwgMHg4Njg3LCAweDg2OTcsIDB4ODY4NiwgMHg4NjhCLCAweDg2OUEsIDB4ODY4NSwKLSAgICAweDg2QTUsIDB4ODY5OSwgMHg4NkExLCAweDg2QTcsIDB4ODY5NSwgMHg4Njk4LCAweDg2OEUsIDB4ODY5RCwKLSAgICAweDg2OTAsIDB4ODY5NCwgMHg4ODQzLCAweDg4NDQsIDB4ODg2RCwgMHg4ODc1LCAweDg4NzYsIDB4ODg3MiwKLSAgICAweDg4ODAsIDB4ODg3MSwgMHg4ODdGLCAweDg4NkYsIDB4ODg4MywgMHg4ODdFLCAweDg4NzQsIDB4ODg3QywKLSAgICAweDhBMTIsIDB4OEM0NywgMHg4QzU3LCAweDhDN0IsIDB4OENBNCwgMHg4Q0EzLCAweDhENzYsIDB4OEQ3OCwKLSAgICAweDhEQjUsIDB4OERCNywgMHg4REI2LCAweDhFRDEsIDB4OEVEMywgMHg4RkZFLCAweDhGRjUsIDB4OTAwMiwKLSAgICAweDhGRkYsIDB4OEZGQiwgMHg5MDA0LCAweDhGRkMsIDB4OEZGNiwgMHg5MEQ2LCAweDkwRTAsIDB4OTBEOSwKLSAgICAweDkwREEsIDB4OTBFMywgMHg5MERGLCAweDkwRTUsIDB4OTBEOCwgMHg5MERCLCAweDkwRDcsIDB4OTBEQywKLSAgICAweDkwRTQsIDB4OTE1MCwgMHg5MTRFLCAweDkxNEYsIDB4OTFENSwgMHg5MUUyLCAweDkxREEsIDB4OTY1QywKLSAgICAweDk2NUYsIDB4OTZCQywgMHg5OEUzLCAweDlBREYsIDB4OUIyRiwgMHg0RTdGLCAweDUwNzAsIDB4NTA2QSwKLSAgICAweDUwNjEsIDB4NTA1RSwgMHg1MDYwLCAweDUwNTMsIDB4NTA0QiwgMHg1MDVELCAweDUwNzIsIDB4NTA0OCwKLSAgICAweDUwNEQsIDB4NTA0MSwgMHg1MDVCLCAweDUwNEEsIDB4NTA2MiwgMHg1MDE1LCAweDUwNDUsIDB4NTA1RiwKLSAgICAweDUwNjksIDB4NTA2QiwgMHg1MDYzLCAweDUwNjQsIDB4NTA0NiwgMHg1MDQwLCAweDUwNkUsIDB4NTA3MywKLSAgICAweDUwNTcsIDB4NTA1MSwgMHg1MUQwLCAweDUyNkIsIDB4NTI2RCwgMHg1MjZDLCAweDUyNkUsIDB4NTJENiwKLSAgICAweDUyRDMsIDB4NTMyRCwgMHg1MzlDLCAweDU1NzUsIDB4NTU3NiwgMHg1NTNDLCAweDU1NEQsIDB4NTU1MCwKLSAgICAweDU1MzQsIDB4NTUyQSwgMHg1NTUxLCAweDU1NjIsIDB4NTUzNiwgMHg1NTM1LCAweDU1MzAsIDB4NTU1MiwKLSAgICAweDU1NDUsIDB4NTUwQywgMHg1NTMyLCAweDU1NjUsIDB4NTU0RSwgMHg1NTM5LCAweDU1NDgsIDB4NTUyRCwKLSAgICAweDU1M0IsIDB4NTU0MCwgMHg1NTRCLCAweDU3MEEsIDB4NTcwNywgMHg1N0ZCLCAweDU4MTQsIDB4NTdFMiwKLSAgICAweDU3RjYsIDB4NTdEQywgMHg1N0Y0LCAweDU4MDAsIDB4NTdFRCwgMHg1N0ZELCAweDU4MDgsIDB4NTdGOCwKLSAgICAweDU4MEIsIDB4NTdGMywgMHg1N0NGLCAweDU4MDcsIDB4NTdFRSwgMHg1N0UzLCAweDU3RjIsIDB4NTdFNSwKLSAgICAweDU3RUMsIDB4NTdFMSwgMHg1ODBFLCAweDU3RkMsIDB4NTgxMCwgMHg1N0U3LCAweDU4MDEsIDB4NTgwQywKLSAgICAweDU3RjEsIDB4NTdFOSwgMHg1N0YwLCAweDU4MEQsIDB4NTgwNCwgMHg1OTVDLCAweDVBNjAsIDB4NUE1OCwKLSAgICAweDVBNTUsIDB4NUE2NywgMHg1QTVFLCAweDVBMzgsIDB4NUEzNSwgMHg1QTZELCAweDVBNTAsIDB4NUE1RiwKLSAgICAweDVBNjUsIDB4NUE2QywgMHg1QTUzLCAweDVBNjQsIDB4NUE1NywgMHg1QTQzLCAweDVBNUQsIDB4NUE1MiwKLSAgICAweDVBNDQsIDB4NUE1QiwgMHg1QTQ4LCAweDVBOEUsIDB4NUEzRSwgMHg1QTRELCAweDVBMzksIDB4NUE0QywKLSAgICAweDVBNzAsIDB4NUE2OSwgMHg1QTQ3LCAweDVBNTEsIDB4NUE1NiwgMHg1QTQyLCAweDVBNUMsIDB4NUI3MiwKLSAgICAweDVCNkUsIDB4NUJDMSwgMHg1QkMwLCAweDVDNTksIDB4NUQxRSwgMHg1RDBCLCAweDVEMUQsIDB4NUQxQSwKLSAgICAweDVEMjAsIDB4NUQwQywgMHg1RDI4LCAweDVEMEQsIDB4NUQyNiwgMHg1RDI1LCAweDVEMEYsIDB4NUQzMCwKLSAgICAweDVEMTIsIDB4NUQyMywgMHg1RDFGLCAweDVEMkUsIDB4NUUzRSwgMHg1RTM0LCAweDVFQjEsIDB4NUVCNCwKLSAgICAweDVFQjksIDB4NUVCMiwgMHg1RUIzLCAweDVGMzYsIDB4NUYzOCwgMHg1RjlCLCAweDVGOTYsIDB4NUY5RiwKLSAgICAweDYwOEEsIDB4NjA5MCwgMHg2MDg2LCAweDYwQkUsIDB4NjBCMCwgMHg2MEJBLCAweDYwRDMsIDB4NjBENCwKLSAgICAweDYwQ0YsIDB4NjBFNCwgMHg2MEQ5LCAweDYwREQsIDB4NjBDOCwgMHg2MEIxLCAweDYwREIsIDB4NjBCNywKLSAgICAweDYwQ0EsIDB4NjBCRiwgMHg2MEMzLCAweDYwQ0QsIDB4NjBDMCwgMHg2MzMyLCAweDYzNjUsIDB4NjM4QSwKLSAgICAweDYzODIsIDB4NjM3RCwgMHg2M0JELCAweDYzOUUsIDB4NjNBRCwgMHg2MzlELCAweDYzOTcsIDB4NjNBQiwKLSAgICAweDYzOEUsIDB4NjM2RiwgMHg2Mzg3LCAweDYzOTAsIDB4NjM2RSwgMHg2M0FGLCAweDYzNzUsIDB4NjM5QywKLSAgICAweDYzNkQsIDB4NjNBRSwgMHg2MzdDLCAweDYzQTQsIDB4NjMzQiwgMHg2MzlGLCAweDYzNzgsIDB4NjM4NSwKLSAgICAweDYzODEsIDB4NjM5MSwgMHg2MzhELCAweDYzNzAsIDB4NjU1MywgMHg2NUNELCAweDY2NjUsIDB4NjY2MSwKLSAgICAweDY2NUIsIDB4NjY1OSwgMHg2NjVDLCAweDY2NjIsIDB4NjcxOCwgMHg2ODc5LCAweDY4ODcsIDB4Njg5MCwKLSAgICAweDY4OUMsIDB4Njg2RCwgMHg2ODZFLCAweDY4QUUsIDB4NjhBQiwgMHg2OTU2LCAweDY4NkYsIDB4NjhBMywKLSAgICAweDY4QUMsIDB4NjhBOSwgMHg2ODc1LCAweDY4NzQsIDB4NjhCMiwgMHg2ODhGLCAweDY4NzcsIDB4Njg5MiwKLSAgICAweDY4N0MsIDB4Njg2QiwgMHg2ODcyLCAweDY4QUEsIDB4Njg4MCwgMHg2ODcxLCAweDY4N0UsIDB4Njg5QiwKLSAgICAweDY4OTYsIDB4Njg4QiwgMHg2OEEwLCAweDY4ODksIDB4NjhBNCwgMHg2ODc4LCAweDY4N0IsIDB4Njg5MSwKLSAgICAweDY4OEMsIDB4Njg4QSwgMHg2ODdELCAweDZCMzYsIDB4NkIzMywgMHg2QjM3LCAweDZCMzgsIDB4NkI5MSwKLSAgICAweDZCOEYsIDB4NkI4RCwgMHg2QjhFLCAweDZCOEMsIDB4NkMyQSwgMHg2REMwLCAweDZEQUIsIDB4NkRCNCwKLSAgICAweDZEQjMsIDB4NkU3NCwgMHg2REFDLCAweDZERTksIDB4NkRFMiwgMHg2REI3LCAweDZERjYsIDB4NkRENCwKLSAgICAweDZFMDAsIDB4NkRDOCwgMHg2REUwLCAweDZEREYsIDB4NkRENiwgMHg2REJFLCAweDZERTUsIDB4NkREQywKLSAgICAweDZEREQsIDB4NkREQiwgMHg2REY0LCAweDZEQ0EsIDB4NkRCRCwgMHg2REVELCAweDZERjAsIDB4NkRCQSwKLSAgICAweDZERDUsIDB4NkRDMiwgMHg2RENGLCAweDZEQzksIDB4NkREMCwgMHg2REYyLCAweDZERDMsIDB4NkRGRCwKLSAgICAweDZERDcsIDB4NkRDRCwgMHg2REUzLCAweDZEQkIsIDB4NzBGQSwgMHg3MTBELCAweDcwRjcsIDB4NzExNywKLSAgICAweDcwRjQsIDB4NzEwQywgMHg3MEYwLCAweDcxMDQsIDB4NzBGMywgMHg3MTEwLCAweDcwRkMsIDB4NzBGRiwKLSAgICAweDcxMDYsIDB4NzExMywgMHg3MTAwLCAweDcwRjgsIDB4NzBGNiwgMHg3MTBCLCAweDcxMDIsIDB4NzEwRSwKLSAgICAweDcyN0UsIDB4NzI3QiwgMHg3MjdDLCAweDcyN0YsIDB4NzMxRCwgMHg3MzE3LCAweDczMDcsIDB4NzMxMSwKLSAgICAweDczMTgsIDB4NzMwQSwgMHg3MzA4LCAweDcyRkYsIDB4NzMwRiwgMHg3MzFFLCAweDczODgsIDB4NzNGNiwKLSAgICAweDczRjgsIDB4NzNGNSwgMHg3NDA0LCAweDc0MDEsIDB4NzNGRCwgMHg3NDA3LCAweDc0MDAsIDB4NzNGQSwKLSAgICAweDczRkMsIDB4NzNGRiwgMHg3NDBDLCAweDc0MEIsIDB4NzNGNCwgMHg3NDA4LCAweDc1NjQsIDB4NzU2MywKLSAgICAweDc1Q0UsIDB4NzVEMiwgMHg3NUNGLCAweDc1Q0IsIDB4NzVDQywgMHg3NUQxLCAweDc1RDAsIDB4NzY4RiwKLSAgICAweDc2ODksIDB4NzZEMywgMHg3NzM5LCAweDc3MkYsIDB4NzcyRCwgMHg3NzMxLCAweDc3MzIsIDB4NzczNCwKLSAgICAweDc3MzMsIDB4NzczRCwgMHg3NzI1LCAweDc3M0IsIDB4NzczNSwgMHg3ODQ4LCAweDc4NTIsIDB4Nzg0OSwKLSAgICAweDc4NEQsIDB4Nzg0QSwgMHg3ODRDLCAweDc4MjYsIDB4Nzg0NSwgMHg3ODUwLCAweDc5NjQsIDB4Nzk2NywKLSAgICAweDc5NjksIDB4Nzk2QSwgMHg3OTYzLCAweDc5NkIsIDB4Nzk2MSwgMHg3OUJCLCAweDc5RkEsIDB4NzlGOCwKLSAgICAweDc5RjYsIDB4NzlGNywgMHg3QThGLCAweDdBOTQsIDB4N0E5MCwgMHg3QjM1LCAweDdCM0IsIDB4N0IzNCwKLSAgICAweDdCMjUsIDB4N0IzMCwgMHg3QjIyLCAweDdCMjQsIDB4N0IzMywgMHg3QjE4LCAweDdCMkEsIDB4N0IxRCwKLSAgICAweDdCMzEsIDB4N0IyQiwgMHg3QjJELCAweDdCMkYsIDB4N0IzMiwgMHg3QjM4LCAweDdCMUEsIDB4N0IyMywKLSAgICAweDdDOTQsIDB4N0M5OCwgMHg3Qzk2LCAweDdDQTMsIDB4N0QzNSwgMHg3RDNELCAweDdEMzgsIDB4N0QzNiwKLSAgICAweDdEM0EsIDB4N0Q0NSwgMHg3RDJDLCAweDdEMjksIDB4N0Q0MSwgMHg3RDQ3LCAweDdEM0UsIDB4N0QzRiwKLSAgICAweDdENEEsIDB4N0QzQiwgMHg3RDI4LCAweDdGNjMsIDB4N0Y5NSwgMHg3RjlDLCAweDdGOUQsIDB4N0Y5QiwKLSAgICAweDdGQ0EsIDB4N0ZDQiwgMHg3RkNELCAweDdGRDAsIDB4N0ZEMSwgMHg3RkM3LCAweDdGQ0YsIDB4N0ZDOSwKLSAgICAweDgwMUYsIDB4ODAxRSwgMHg4MDFCLCAweDgwNDcsIDB4ODA0MywgMHg4MDQ4LCAweDgxMTgsIDB4ODEyNSwKLSAgICAweDgxMTksIDB4ODExQiwgMHg4MTJELCAweDgxMUYsIDB4ODEyQywgMHg4MTFFLCAweDgxMjEsIDB4ODExNSwKLSAgICAweDgxMjcsIDB4ODExRCwgMHg4MTIyLCAweDgyMTEsIDB4ODIzOCwgMHg4MjMzLCAweDgyM0EsIDB4ODIzNCwKLSAgICAweDgyMzIsIDB4ODI3NCwgMHg4MzkwLCAweDgzQTMsIDB4ODNBOCwgMHg4MzhELCAweDgzN0EsIDB4ODM3MywKLSAgICAweDgzQTQsIDB4ODM3NCwgMHg4MzhGLCAweDgzODEsIDB4ODM5NSwgMHg4Mzk5LCAweDgzNzUsIDB4ODM5NCwKLSAgICAweDgzQTksIDB4ODM3RCwgMHg4MzgzLCAweDgzOEMsIDB4ODM5RCwgMHg4MzlCLCAweDgzQUEsIDB4ODM4QiwKLSAgICAweDgzN0UsIDB4ODNBNSwgMHg4M0FGLCAweDgzODgsIDB4ODM5NywgMHg4M0IwLCAweDgzN0YsIDB4ODNBNiwKLSAgICAweDgzODcsIDB4ODNBRSwgMHg4Mzc2LCAweDg2NTksIDB4ODY1NiwgMHg4NkJGLCAweDg2QjcsIDB4ODZDMiwKLSAgICAweDg2QzEsIDB4ODZDNSwgMHg4NkJBLCAweDg2QjAsIDB4ODZDOCwgMHg4NkI5LCAweDg2QjMsIDB4ODZCOCwKLSAgICAweDg2Q0MsIDB4ODZCNCwgMHg4NkJCLCAweDg2QkMsIDB4ODZDMywgMHg4NkJELCAweDg2QkUsIDB4ODg1MiwKLSAgICAweDg4ODksIDB4ODg5NSwgMHg4OEE4LCAweDg4QTIsIDB4ODhBQSwgMHg4ODlBLCAweDg4OTEsIDB4ODhBMSwKLSAgICAweDg4OUYsIDB4ODg5OCwgMHg4OEE3LCAweDg4OTksIDB4ODg5QiwgMHg4ODk3LCAweDg4QTQsIDB4ODhBQywKLSAgICAweDg4OEMsIDB4ODg5MywgMHg4ODhFLCAweDg5ODIsIDB4ODlENiwgMHg4OUQ5LCAweDg5RDUsIDB4OEEzMCwKLSAgICAweDhBMjcsIDB4OEEyQywgMHg4QTFFLCAweDhDMzksIDB4OEMzQiwgMHg4QzVDLCAweDhDNUQsIDB4OEM3RCwKLSAgICAweDhDQTUsIDB4OEQ3RCwgMHg4RDdCLCAweDhENzksIDB4OERCQywgMHg4REMyLCAweDhEQjksIDB4OERCRiwKLSAgICAweDhEQzEsIDB4OEVEOCwgMHg4RURFLCAweDhFREQsIDB4OEVEQywgMHg4RUQ3LCAweDhFRTAsIDB4OEVFMSwKLSAgICAweDkwMjQsIDB4OTAwQiwgMHg5MDExLCAweDkwMUMsIDB4OTAwQywgMHg5MDIxLCAweDkwRUYsIDB4OTBFQSwKLSAgICAweDkwRjAsIDB4OTBGNCwgMHg5MEYyLCAweDkwRjMsIDB4OTBENCwgMHg5MEVCLCAweDkwRUMsIDB4OTBFOSwKLSAgICAweDkxNTYsIDB4OTE1OCwgMHg5MTVBLCAweDkxNTMsIDB4OTE1NSwgMHg5MUVDLCAweDkxRjQsIDB4OTFGMSwKLSAgICAweDkxRjMsIDB4OTFGOCwgMHg5MUU0LCAweDkxRjksIDB4OTFFQSwgMHg5MUVCLCAweDkxRjcsIDB4OTFFOCwKLSAgICAweDkxRUUsIDB4OTU3QSwgMHg5NTg2LCAweDk1ODgsIDB4OTY3QywgMHg5NjZELCAweDk2NkIsIDB4OTY3MSwKLSAgICAweDk2NkYsIDB4OTZCRiwgMHg5NzZBLCAweDk4MDQsIDB4OThFNSwgMHg5OTk3LCAweDUwOUIsIDB4NTA5NSwKLSAgICAweDUwOTQsIDB4NTA5RSwgMHg1MDhCLCAweDUwQTMsIDB4NTA4MywgMHg1MDhDLCAweDUwOEUsIDB4NTA5RCwKLSAgICAweDUwNjgsIDB4NTA5QywgMHg1MDkyLCAweDUwODIsIDB4NTA4NywgMHg1MTVGLCAweDUxRDQsIDB4NTMxMiwKLSAgICAweDUzMTEsIDB4NTNBNCwgMHg1M0E3LCAweDU1OTEsIDB4NTVBOCwgMHg1NUE1LCAweDU1QUQsIDB4NTU3NywKLSAgICAweDU2NDUsIDB4NTVBMiwgMHg1NTkzLCAweDU1ODgsIDB4NTU4RiwgMHg1NUI1LCAweDU1ODEsIDB4NTVBMywKLSAgICAweDU1OTIsIDB4NTVBNCwgMHg1NTdELCAweDU1OEMsIDB4NTVBNiwgMHg1NTdGLCAweDU1OTUsIDB4NTVBMSwKLSAgICAweDU1OEUsIDB4NTcwQywgMHg1ODI5LCAweDU4MzcsIDB4NTgxOSwgMHg1ODFFLCAweDU4MjcsIDB4NTgyMywKLSAgICAweDU4MjgsIDB4NTdGNSwgMHg1ODQ4LCAweDU4MjUsIDB4NTgxQywgMHg1ODFCLCAweDU4MzMsIDB4NTgzRiwKLSAgICAweDU4MzYsIDB4NTgyRSwgMHg1ODM5LCAweDU4MzgsIDB4NTgyRCwgMHg1ODJDLCAweDU4M0IsIDB4NTk2MSwKLSAgICAweDVBQUYsIDB4NUE5NCwgMHg1QTlGLCAweDVBN0EsIDB4NUFBMiwgMHg1QTlFLCAweDVBNzgsIDB4NUFBNiwKLSAgICAweDVBN0MsIDB4NUFBNSwgMHg1QUFDLCAweDVBOTUsIDB4NUFBRSwgMHg1QTM3LCAweDVBODQsIDB4NUE4QSwKLSAgICAweDVBOTcsIDB4NUE4MywgMHg1QThCLCAweDVBQTksIDB4NUE3QiwgMHg1QTdELCAweDVBOEMsIDB4NUE5QywKLSAgICAweDVBOEYsIDB4NUE5MywgMHg1QTlELCAweDVCRUEsIDB4NUJDRCwgMHg1QkNCLCAweDVCRDQsIDB4NUJEMSwKLSAgICAweDVCQ0EsIDB4NUJDRSwgMHg1QzBDLCAweDVDMzAsIDB4NUQzNywgMHg1RDQzLCAweDVENkIsIDB4NUQ0MSwKLSAgICAweDVENEIsIDB4NUQzRiwgMHg1RDM1LCAweDVENTEsIDB4NUQ0RSwgMHg1RDU1LCAweDVEMzMsIDB4NUQzQSwKLSAgICAweDVENTIsIDB4NUQzRCwgMHg1RDMxLCAweDVENTksIDB4NUQ0MiwgMHg1RDM5LCAweDVENDksIDB4NUQzOCwKLSAgICAweDVEM0MsIDB4NUQzMiwgMHg1RDM2LCAweDVENDAsIDB4NUQ0NSwgMHg1RTQ0LCAweDVFNDEsIDB4NUY1OCwKLSAgICAweDVGQTYsIDB4NUZBNSwgMHg1RkFCLCAweDYwQzksIDB4NjBCOSwgMHg2MENDLCAweDYwRTIsIDB4NjBDRSwKLSAgICAweDYwQzQsIDB4NjExNCwgMHg2MEYyLCAweDYxMEEsIDB4NjExNiwgMHg2MTA1LCAweDYwRjUsIDB4NjExMywKLSAgICAweDYwRjgsIDB4NjBGQywgMHg2MEZFLCAweDYwQzEsIDB4NjEwMywgMHg2MTE4LCAweDYxMUQsIDB4NjExMCwKLSAgICAweDYwRkYsIDB4NjEwNCwgMHg2MTBCLCAweDYyNEEsIDB4NjM5NCwgMHg2M0IxLCAweDYzQjAsIDB4NjNDRSwKLSAgICAweDYzRTUsIDB4NjNFOCwgMHg2M0VGLCAweDYzQzMsIDB4NjQ5RCwgMHg2M0YzLCAweDYzQ0EsIDB4NjNFMCwKLSAgICAweDYzRjYsIDB4NjNENSwgMHg2M0YyLCAweDYzRjUsIDB4NjQ2MSwgMHg2M0RGLCAweDYzQkUsIDB4NjNERCwKLSAgICAweDYzREMsIDB4NjNDNCwgMHg2M0Q4LCAweDYzRDMsIDB4NjNDMiwgMHg2M0M3LCAweDYzQ0MsIDB4NjNDQiwKLSAgICAweDYzQzgsIDB4NjNGMCwgMHg2M0Q3LCAweDYzRDksIDB4NjUzMiwgMHg2NTY3LCAweDY1NkEsIDB4NjU2NCwKLSAgICAweDY1NUMsIDB4NjU2OCwgMHg2NTY1LCAweDY1OEMsIDB4NjU5RCwgMHg2NTlFLCAweDY1QUUsIDB4NjVEMCwKLSAgICAweDY1RDIsIDB4NjY3QywgMHg2NjZDLCAweDY2N0IsIDB4NjY4MCwgMHg2NjcxLCAweDY2NzksIDB4NjY2QSwKLSAgICAweDY2NzIsIDB4NjcwMSwgMHg2OTBDLCAweDY4RDMsIDB4NjkwNCwgMHg2OERDLCAweDY5MkEsIDB4NjhFQywKLSAgICAweDY4RUEsIDB4NjhGMSwgMHg2OTBGLCAweDY4RDYsIDB4NjhGNywgMHg2OEVCLCAweDY4RTQsIDB4NjhGNiwKLSAgICAweDY5MTMsIDB4NjkxMCwgMHg2OEYzLCAweDY4RTEsIDB4NjkwNywgMHg2OENDLCAweDY5MDgsIDB4Njk3MCwKLSAgICAweDY4QjQsIDB4NjkxMSwgMHg2OEVGLCAweDY4QzYsIDB4NjkxNCwgMHg2OEY4LCAweDY4RDAsIDB4NjhGRCwKLSAgICAweDY4RkMsIDB4NjhFOCwgMHg2OTBCLCAweDY5MEEsIDB4NjkxNywgMHg2OENFLCAweDY4QzgsIDB4NjhERCwKLSAgICAweDY4REUsIDB4NjhFNiwgMHg2OEY0LCAweDY4RDEsIDB4NjkwNiwgMHg2OEQ0LCAweDY4RTksIDB4NjkxNSwKLSAgICAweDY5MjUsIDB4NjhDNywgMHg2QjM5LCAweDZCM0IsIDB4NkIzRiwgMHg2QjNDLCAweDZCOTQsIDB4NkI5NywKLSAgICAweDZCOTksIDB4NkI5NSwgMHg2QkJELCAweDZCRjAsIDB4NkJGMiwgMHg2QkYzLCAweDZDMzAsIDB4NkRGQywKLSAgICAweDZFNDYsIDB4NkU0NywgMHg2RTFGLCAweDZFNDksIDB4NkU4OCwgMHg2RTNDLCAweDZFM0QsIDB4NkU0NSwKLSAgICAweDZFNjIsIDB4NkUyQiwgMHg2RTNGLCAweDZFNDEsIDB4NkU1RCwgMHg2RTczLCAweDZFMUMsIDB4NkUzMywKLSAgICAweDZFNEIsIDB4NkU0MCwgMHg2RTUxLCAweDZFM0IsIDB4NkUwMywgMHg2RTJFLCAweDZFNUUsIDB4NkU2OCwKLSAgICAweDZFNUMsIDB4NkU2MSwgMHg2RTMxLCAweDZFMjgsIDB4NkU2MCwgMHg2RTcxLCAweDZFNkIsIDB4NkUzOSwKLSAgICAweDZFMjIsIDB4NkUzMCwgMHg2RTUzLCAweDZFNjUsIDB4NkUyNywgMHg2RTc4LCAweDZFNjQsIDB4NkU3NywKLSAgICAweDZFNTUsIDB4NkU3OSwgMHg2RTUyLCAweDZFNjYsIDB4NkUzNSwgMHg2RTM2LCAweDZFNUEsIDB4NzEyMCwKLSAgICAweDcxMUUsIDB4NzEyRiwgMHg3MEZCLCAweDcxMkUsIDB4NzEzMSwgMHg3MTIzLCAweDcxMjUsIDB4NzEyMiwKLSAgICAweDcxMzIsIDB4NzExRiwgMHg3MTI4LCAweDcxM0EsIDB4NzExQiwgMHg3MjRCLCAweDcyNUEsIDB4NzI4OCwKLSAgICAweDcyODksIDB4NzI4NiwgMHg3Mjg1LCAweDcyOEIsIDB4NzMxMiwgMHg3MzBCLCAweDczMzAsIDB4NzMyMiwKLSAgICAweDczMzEsIDB4NzMzMywgMHg3MzI3LCAweDczMzIsIDB4NzMyRCwgMHg3MzI2LCAweDczMjMsIDB4NzMzNSwKLSAgICAweDczMEMsIDB4NzQyRSwgMHg3NDJDLCAweDc0MzAsIDB4NzQyQiwgMHg3NDE2LCAweDc0MUEsIDB4NzQyMSwKLSAgICAweDc0MkQsIDB4NzQzMSwgMHg3NDI0LCAweDc0MjMsIDB4NzQxRCwgMHg3NDI5LCAweDc0MjAsIDB4NzQzMiwKLSAgICAweDc0RkIsIDB4NzUyRiwgMHg3NTZGLCAweDc1NkMsIDB4NzVFNywgMHg3NURBLCAweDc1RTEsIDB4NzVFNiwKLSAgICAweDc1REQsIDB4NzVERiwgMHg3NUU0LCAweDc1RDcsIDB4NzY5NSwgMHg3NjkyLCAweDc2REEsIDB4Nzc0NiwKLSAgICAweDc3NDcsIDB4Nzc0NCwgMHg3NzRELCAweDc3NDUsIDB4Nzc0QSwgMHg3NzRFLCAweDc3NEIsIDB4Nzc0QywKLSAgICAweDc3REUsIDB4NzdFQywgMHg3ODYwLCAweDc4NjQsIDB4Nzg2NSwgMHg3ODVDLCAweDc4NkQsIDB4Nzg3MSwKLSAgICAweDc4NkEsIDB4Nzg2RSwgMHg3ODcwLCAweDc4NjksIDB4Nzg2OCwgMHg3ODVFLCAweDc4NjIsIDB4Nzk3NCwKLSAgICAweDc5NzMsIDB4Nzk3MiwgMHg3OTcwLCAweDdBMDIsIDB4N0EwQSwgMHg3QTAzLCAweDdBMEMsIDB4N0EwNCwKLSAgICAweDdBOTksIDB4N0FFNiwgMHg3QUU0LCAweDdCNEEsIDB4N0I0NywgMHg3QjQ0LCAweDdCNDgsIDB4N0I0QywKLSAgICAweDdCNEUsIDB4N0I0MCwgMHg3QjU4LCAweDdCNDUsIDB4N0NBMiwgMHg3QzlFLCAweDdDQTgsIDB4N0NBMSwKLSAgICAweDdENTgsIDB4N0Q2RiwgMHg3RDYzLCAweDdENTMsIDB4N0Q1NiwgMHg3RDY3LCAweDdENkEsIDB4N0Q0RiwKLSAgICAweDdENkQsIDB4N0Q1QywgMHg3RDZCLCAweDdENTIsIDB4N0Q1NCwgMHg3RDY5LCAweDdENTEsIDB4N0Q1RiwKLSAgICAweDdENEUsIDB4N0YzRSwgMHg3RjNGLCAweDdGNjUsIDB4N0Y2NiwgMHg3RkEyLCAweDdGQTAsIDB4N0ZBMSwKLSAgICAweDdGRDcsIDB4ODA1MSwgMHg4MDRGLCAweDgwNTAsIDB4ODBGRSwgMHg4MEQ0LCAweDgxNDMsIDB4ODE0QSwKLSAgICAweDgxNTIsIDB4ODE0RiwgMHg4MTQ3LCAweDgxM0QsIDB4ODE0RCwgMHg4MTNBLCAweDgxRTYsIDB4ODFFRSwKLSAgICAweDgxRjcsIDB4ODFGOCwgMHg4MUY5LCAweDgyMDQsIDB4ODIzQywgMHg4MjNELCAweDgyM0YsIDB4ODI3NSwKLSAgICAweDgzM0IsIDB4ODNDRiwgMHg4M0Y5LCAweDg0MjMsIDB4ODNDMCwgMHg4M0U4LCAweDg0MTIsIDB4ODNFNywKLSAgICAweDgzRTQsIDB4ODNGQywgMHg4M0Y2LCAweDg0MTAsIDB4ODNDNiwgMHg4M0M4LCAweDgzRUIsIDB4ODNFMywKLSAgICAweDgzQkYsIDB4ODQwMSwgMHg4M0RELCAweDgzRTUsIDB4ODNEOCwgMHg4M0ZGLCAweDgzRTEsIDB4ODNDQiwKLSAgICAweDgzQ0UsIDB4ODNENiwgMHg4M0Y1LCAweDgzQzksIDB4ODQwOSwgMHg4NDBGLCAweDgzREUsIDB4ODQxMSwKLSAgICAweDg0MDYsIDB4ODNDMiwgMHg4M0YzLCAweDgzRDUsIDB4ODNGQSwgMHg4M0M3LCAweDgzRDEsIDB4ODNFQSwKLSAgICAweDg0MTMsIDB4ODM5QSwgMHg4M0MzLCAweDgzRUMsIDB4ODNFRSwgMHg4M0M0LCAweDgzRkIsIDB4ODNENywKLSAgICAweDgzRTIsIDB4ODQxQiwgMHg4M0RCLCAweDgzRkUsIDB4ODZEOCwgMHg4NkUyLCAweDg2RTYsIDB4ODZEMywKLSAgICAweDg2RTMsIDB4ODZEQSwgMHg4NkVBLCAweDg2REQsIDB4ODZFQiwgMHg4NkRDLCAweDg2RUMsIDB4ODZFOSwKLSAgICAweDg2RDcsIDB4ODZFOCwgMHg4NkQxLCAweDg4NDgsIDB4ODg1NiwgMHg4ODU1LCAweDg4QkEsIDB4ODhENywKLSAgICAweDg4QjksIDB4ODhCOCwgMHg4OEMwLCAweDg4QkUsIDB4ODhCNiwgMHg4OEJDLCAweDg4QjcsIDB4ODhCRCwKLSAgICAweDg4QjIsIDB4ODkwMSwgMHg4OEM5LCAweDg5OTUsIDB4ODk5OCwgMHg4OTk3LCAweDg5REQsIDB4ODlEQSwKLSAgICAweDg5REIsIDB4OEE0RSwgMHg4QTRELCAweDhBMzksIDB4OEE1OSwgMHg4QTQwLCAweDhBNTcsIDB4OEE1OCwKLSAgICAweDhBNDQsIDB4OEE0NSwgMHg4QTUyLCAweDhBNDgsIDB4OEE1MSwgMHg4QTRBLCAweDhBNEMsIDB4OEE0RiwKLSAgICAweDhDNUYsIDB4OEM4MSwgMHg4QzgwLCAweDhDQkEsIDB4OENCRSwgMHg4Q0IwLCAweDhDQjksIDB4OENCNSwKLSAgICAweDhEODQsIDB4OEQ4MCwgMHg4RDg5LCAweDhERDgsIDB4OEREMywgMHg4RENELCAweDhEQzcsIDB4OERENiwKLSAgICAweDhEREMsIDB4OERDRiwgMHg4REQ1LCAweDhERDksIDB4OERDOCwgMHg4REQ3LCAweDhEQzUsIDB4OEVFRiwKLSAgICAweDhFRjcsIDB4OEVGQSwgMHg4RUY5LCAweDhFRTYsIDB4OEVFRSwgMHg4RUU1LCAweDhFRjUsIDB4OEVFNywKLSAgICAweDhFRTgsIDB4OEVGNiwgMHg4RUVCLCAweDhFRjEsIDB4OEVFQywgMHg4RUY0LCAweDhFRTksIDB4OTAyRCwKLSAgICAweDkwMzQsIDB4OTAyRiwgMHg5MTA2LCAweDkxMkMsIDB4OTEwNCwgMHg5MEZGLCAweDkwRkMsIDB4OTEwOCwKLSAgICAweDkwRjksIDB4OTBGQiwgMHg5MTAxLCAweDkxMDAsIDB4OTEwNywgMHg5MTA1LCAweDkxMDMsIDB4OTE2MSwKLSAgICAweDkxNjQsIDB4OTE1RiwgMHg5MTYyLCAweDkxNjAsIDB4OTIwMSwgMHg5MjBBLCAweDkyMjUsIDB4OTIwMywKLSAgICAweDkyMUEsIDB4OTIyNiwgMHg5MjBGLCAweDkyMEMsIDB4OTIwMCwgMHg5MjEyLCAweDkxRkYsIDB4OTFGRCwKLSAgICAweDkyMDYsIDB4OTIwNCwgMHg5MjI3LCAweDkyMDIsIDB4OTIxQywgMHg5MjI0LCAweDkyMTksIDB4OTIxNywKLSAgICAweDkyMDUsIDB4OTIxNiwgMHg5NTdCLCAweDk1OEQsIDB4OTU4QywgMHg5NTkwLCAweDk2ODcsIDB4OTY3RSwKLSAgICAweDk2ODgsIDB4OTY4OSwgMHg5NjgzLCAweDk2ODAsIDB4OTZDMiwgMHg5NkM4LCAweDk2QzMsIDB4OTZGMSwKLSAgICAweDk2RjAsIDB4OTc2QywgMHg5NzcwLCAweDk3NkUsIDB4OTgwNywgMHg5OEE5LCAweDk4RUIsIDB4OUNFNiwKLSAgICAweDlFRjksIDB4NEU4MywgMHg0RTg0LCAweDRFQjYsIDB4NTBCRCwgMHg1MEJGLCAweDUwQzYsIDB4NTBBRSwKLSAgICAweDUwQzQsIDB4NTBDQSwgMHg1MEI0LCAweDUwQzgsIDB4NTBDMiwgMHg1MEIwLCAweDUwQzEsIDB4NTBCQSwKLSAgICAweDUwQjEsIDB4NTBDQiwgMHg1MEM5LCAweDUwQjYsIDB4NTBCOCwgMHg1MUQ3LCAweDUyN0EsIDB4NTI3OCwKLSAgICAweDUyN0IsIDB4NTI3QywgMHg1NUMzLCAweDU1REIsIDB4NTVDQywgMHg1NUQwLCAweDU1Q0IsIDB4NTVDQSwKLSAgICAweDU1REQsIDB4NTVDMCwgMHg1NUQ0LCAweDU1QzQsIDB4NTVFOSwgMHg1NUJGLCAweDU1RDIsIDB4NTU4RCwKLSAgICAweDU1Q0YsIDB4NTVENSwgMHg1NUUyLCAweDU1RDYsIDB4NTVDOCwgMHg1NUYyLCAweDU1Q0QsIDB4NTVEOSwKLSAgICAweDU1QzIsIDB4NTcxNCwgMHg1ODUzLCAweDU4NjgsIDB4NTg2NCwgMHg1ODRGLCAweDU4NEQsIDB4NTg0OSwKLSAgICAweDU4NkYsIDB4NTg1NSwgMHg1ODRFLCAweDU4NUQsIDB4NTg1OSwgMHg1ODY1LCAweDU4NUIsIDB4NTgzRCwKLSAgICAweDU4NjMsIDB4NTg3MSwgMHg1OEZDLCAweDVBQzcsIDB4NUFDNCwgMHg1QUNCLCAweDVBQkEsIDB4NUFCOCwKLSAgICAweDVBQjEsIDB4NUFCNSwgMHg1QUIwLCAweDVBQkYsIDB4NUFDOCwgMHg1QUJCLCAweDVBQzYsIDB4NUFCNywKLSAgICAweDVBQzAsIDB4NUFDQSwgMHg1QUI0LCAweDVBQjYsIDB4NUFDRCwgMHg1QUI5LCAweDVBOTAsIDB4NUJENiwKLSAgICAweDVCRDgsIDB4NUJEOSwgMHg1QzFGLCAweDVDMzMsIDB4NUQ3MSwgMHg1RDYzLCAweDVENEEsIDB4NUQ2NSwKLSAgICAweDVENzIsIDB4NUQ2QywgMHg1RDVFLCAweDVENjgsIDB4NUQ2NywgMHg1RDYyLCAweDVERjAsIDB4NUU0RiwKLSAgICAweDVFNEUsIDB4NUU0QSwgMHg1RTRELCAweDVFNEIsIDB4NUVDNSwgMHg1RUNDLCAweDVFQzYsIDB4NUVDQiwKLSAgICAweDVFQzcsIDB4NUY0MCwgMHg1RkFGLCAweDVGQUQsIDB4NjBGNywgMHg2MTQ5LCAweDYxNEEsIDB4NjEyQiwKLSAgICAweDYxNDUsIDB4NjEzNiwgMHg2MTMyLCAweDYxMkUsIDB4NjE0NiwgMHg2MTJGLCAweDYxNEYsIDB4NjEyOSwKLSAgICAweDYxNDAsIDB4NjIyMCwgMHg5MTY4LCAweDYyMjMsIDB4NjIyNSwgMHg2MjI0LCAweDYzQzUsIDB4NjNGMSwKLSAgICAweDYzRUIsIDB4NjQxMCwgMHg2NDEyLCAweDY0MDksIDB4NjQyMCwgMHg2NDI0LCAweDY0MzMsIDB4NjQ0MywKLSAgICAweDY0MUYsIDB4NjQxNSwgMHg2NDE4LCAweDY0MzksIDB4NjQzNywgMHg2NDIyLCAweDY0MjMsIDB4NjQwQywKLSAgICAweDY0MjYsIDB4NjQzMCwgMHg2NDI4LCAweDY0NDEsIDB4NjQzNSwgMHg2NDJGLCAweDY0MEEsIDB4NjQxQSwKLSAgICAweDY0NDAsIDB4NjQyNSwgMHg2NDI3LCAweDY0MEIsIDB4NjNFNywgMHg2NDFCLCAweDY0MkUsIDB4NjQyMSwKLSAgICAweDY0MEUsIDB4NjU2RiwgMHg2NTkyLCAweDY1RDMsIDB4NjY4NiwgMHg2NjhDLCAweDY2OTUsIDB4NjY5MCwKLSAgICAweDY2OEIsIDB4NjY4QSwgMHg2Njk5LCAweDY2OTQsIDB4NjY3OCwgMHg2NzIwLCAweDY5NjYsIDB4Njk1RiwKLSAgICAweDY5MzgsIDB4Njk0RSwgMHg2OTYyLCAweDY5NzEsIDB4NjkzRiwgMHg2OTQ1LCAweDY5NkEsIDB4NjkzOSwKLSAgICAweDY5NDIsIDB4Njk1NywgMHg2OTU5LCAweDY5N0EsIDB4Njk0OCwgMHg2OTQ5LCAweDY5MzUsIDB4Njk2QywKLSAgICAweDY5MzMsIDB4NjkzRCwgMHg2OTY1LCAweDY4RjAsIDB4Njk3OCwgMHg2OTM0LCAweDY5NjksIDB4Njk0MCwKLSAgICAweDY5NkYsIDB4Njk0NCwgMHg2OTc2LCAweDY5NTgsIDB4Njk0MSwgMHg2OTc0LCAweDY5NEMsIDB4NjkzQiwKLSAgICAweDY5NEIsIDB4NjkzNywgMHg2OTVDLCAweDY5NEYsIDB4Njk1MSwgMHg2OTMyLCAweDY5NTIsIDB4NjkyRiwKLSAgICAweDY5N0IsIDB4NjkzQywgMHg2QjQ2LCAweDZCNDUsIDB4NkI0MywgMHg2QjQyLCAweDZCNDgsIDB4NkI0MSwKLSAgICAweDZCOUIsIDB4NkJGQiwgMHg2QkZDLCAweDZCRjksIDB4NkJGNywgMHg2QkY4LCAweDZFOUIsIDB4NkVENiwKLSAgICAweDZFQzgsIDB4NkU4RiwgMHg2RUMwLCAweDZFOUYsIDB4NkU5MywgMHg2RTk0LCAweDZFQTAsIDB4NkVCMSwKLSAgICAweDZFQjksIDB4NkVDNiwgMHg2RUQyLCAweDZFQkQsIDB4NkVDMSwgMHg2RTlFLCAweDZFQzksIDB4NkVCNywKLSAgICAweDZFQjAsIDB4NkVDRCwgMHg2RUE2LCAweDZFQ0YsIDB4NkVCMiwgMHg2RUJFLCAweDZFQzMsIDB4NkVEQywKLSAgICAweDZFRDgsIDB4NkU5OSwgMHg2RTkyLCAweDZFOEUsIDB4NkU4RCwgMHg2RUE0LCAweDZFQTEsIDB4NkVCRiwKLSAgICAweDZFQjMsIDB4NkVEMCwgMHg2RUNBLCAweDZFOTcsIDB4NkVBRSwgMHg2RUEzLCAweDcxNDcsIDB4NzE1NCwKLSAgICAweDcxNTIsIDB4NzE2MywgMHg3MTYwLCAweDcxNDEsIDB4NzE1RCwgMHg3MTYyLCAweDcxNzIsIDB4NzE3OCwKLSAgICAweDcxNkEsIDB4NzE2MSwgMHg3MTQyLCAweDcxNTgsIDB4NzE0MywgMHg3MTRCLCAweDcxNzAsIDB4NzE1RiwKLSAgICAweDcxNTAsIDB4NzE1MywgMHg3MTQ0LCAweDcxNEQsIDB4NzE1QSwgMHg3MjRGLCAweDcyOEQsIDB4NzI4QywKLSAgICAweDcyOTEsIDB4NzI5MCwgMHg3MjhFLCAweDczM0MsIDB4NzM0MiwgMHg3MzNCLCAweDczM0EsIDB4NzM0MCwKLSAgICAweDczNEEsIDB4NzM0OSwgMHg3NDQ0LCAweDc0NEEsIDB4NzQ0QiwgMHg3NDUyLCAweDc0NTEsIDB4NzQ1NywKLSAgICAweDc0NDAsIDB4NzQ0RiwgMHg3NDUwLCAweDc0NEUsIDB4NzQ0MiwgMHg3NDQ2LCAweDc0NEQsIDB4NzQ1NCwKLSAgICAweDc0RTEsIDB4NzRGRiwgMHg3NEZFLCAweDc0RkQsIDB4NzUxRCwgMHg3NTc5LCAweDc1NzcsIDB4Njk4MywKLSAgICAweDc1RUYsIDB4NzYwRiwgMHg3NjAzLCAweDc1RjcsIDB4NzVGRSwgMHg3NUZDLCAweDc1RjksIDB4NzVGOCwKLSAgICAweDc2MTAsIDB4NzVGQiwgMHg3NUY2LCAweDc1RUQsIDB4NzVGNSwgMHg3NUZELCAweDc2OTksIDB4NzZCNSwKLSAgICAweDc2REQsIDB4Nzc1NSwgMHg3NzVGLCAweDc3NjAsIDB4Nzc1MiwgMHg3NzU2LCAweDc3NUEsIDB4Nzc2OSwKLSAgICAweDc3NjcsIDB4Nzc1NCwgMHg3NzU5LCAweDc3NkQsIDB4NzdFMCwgMHg3ODg3LCAweDc4OUEsIDB4Nzg5NCwKLSAgICAweDc4OEYsIDB4Nzg4NCwgMHg3ODk1LCAweDc4ODUsIDB4Nzg4NiwgMHg3OEExLCAweDc4ODMsIDB4Nzg3OSwKLSAgICAweDc4OTksIDB4Nzg4MCwgMHg3ODk2LCAweDc4N0IsIDB4Nzk3QywgMHg3OTgyLCAweDc5N0QsIDB4Nzk3OSwKLSAgICAweDdBMTEsIDB4N0ExOCwgMHg3QTE5LCAweDdBMTIsIDB4N0ExNywgMHg3QTE1LCAweDdBMjIsIDB4N0ExMywKLSAgICAweDdBMUIsIDB4N0ExMCwgMHg3QUEzLCAweDdBQTIsIDB4N0E5RSwgMHg3QUVCLCAweDdCNjYsIDB4N0I2NCwKLSAgICAweDdCNkQsIDB4N0I3NCwgMHg3QjY5LCAweDdCNzIsIDB4N0I2NSwgMHg3QjczLCAweDdCNzEsIDB4N0I3MCwKLSAgICAweDdCNjEsIDB4N0I3OCwgMHg3Qjc2LCAweDdCNjMsIDB4N0NCMiwgMHg3Q0I0LCAweDdDQUYsIDB4N0Q4OCwKLSAgICAweDdEODYsIDB4N0Q4MCwgMHg3RDhELCAweDdEN0YsIDB4N0Q4NSwgMHg3RDdBLCAweDdEOEUsIDB4N0Q3QiwKLSAgICAweDdEODMsIDB4N0Q3QywgMHg3RDhDLCAweDdEOTQsIDB4N0Q4NCwgMHg3RDdELCAweDdEOTIsIDB4N0Y2RCwKLSAgICAweDdGNkIsIDB4N0Y2NywgMHg3RjY4LCAweDdGNkMsIDB4N0ZBNiwgMHg3RkE1LCAweDdGQTcsIDB4N0ZEQiwKLSAgICAweDdGREMsIDB4ODAyMSwgMHg4MTY0LCAweDgxNjAsIDB4ODE3NywgMHg4MTVDLCAweDgxNjksIDB4ODE1QiwKLSAgICAweDgxNjIsIDB4ODE3MiwgMHg2NzIxLCAweDgxNUUsIDB4ODE3NiwgMHg4MTY3LCAweDgxNkYsIDB4ODE0NCwKLSAgICAweDgxNjEsIDB4ODIxRCwgMHg4MjQ5LCAweDgyNDQsIDB4ODI0MCwgMHg4MjQyLCAweDgyNDUsIDB4ODRGMSwKLSAgICAweDg0M0YsIDB4ODQ1NiwgMHg4NDc2LCAweDg0NzksIDB4ODQ4RiwgMHg4NDhELCAweDg0NjUsIDB4ODQ1MSwKLSAgICAweDg0NDAsIDB4ODQ4NiwgMHg4NDY3LCAweDg0MzAsIDB4ODQ0RCwgMHg4NDdELCAweDg0NUEsIDB4ODQ1OSwKLSAgICAweDg0NzQsIDB4ODQ3MywgMHg4NDVELCAweDg1MDcsIDB4ODQ1RSwgMHg4NDM3LCAweDg0M0EsIDB4ODQzNCwKLSAgICAweDg0N0EsIDB4ODQ0MywgMHg4NDc4LCAweDg0MzIsIDB4ODQ0NSwgMHg4NDI5LCAweDgzRDksIDB4ODQ0QiwKLSAgICAweDg0MkYsIDB4ODQ0MiwgMHg4NDJELCAweDg0NUYsIDB4ODQ3MCwgMHg4NDM5LCAweDg0NEUsIDB4ODQ0QywKLSAgICAweDg0NTIsIDB4ODQ2RiwgMHg4NEM1LCAweDg0OEUsIDB4ODQzQiwgMHg4NDQ3LCAweDg0MzYsIDB4ODQzMywKLSAgICAweDg0NjgsIDB4ODQ3RSwgMHg4NDQ0LCAweDg0MkIsIDB4ODQ2MCwgMHg4NDU0LCAweDg0NkUsIDB4ODQ1MCwKLSAgICAweDg3MEIsIDB4ODcwNCwgMHg4NkY3LCAweDg3MEMsIDB4ODZGQSwgMHg4NkQ2LCAweDg2RjUsIDB4ODc0RCwKLSAgICAweDg2RjgsIDB4ODcwRSwgMHg4NzA5LCAweDg3MDEsIDB4ODZGNiwgMHg4NzBELCAweDg3MDUsIDB4ODhENiwKLSAgICAweDg4Q0IsIDB4ODhDRCwgMHg4OENFLCAweDg4REUsIDB4ODhEQiwgMHg4OERBLCAweDg4Q0MsIDB4ODhEMCwKLSAgICAweDg5ODUsIDB4ODk5QiwgMHg4OURGLCAweDg5RTUsIDB4ODlFNCwgMHg4OUUxLCAweDg5RTAsIDB4ODlFMiwKLSAgICAweDg5REMsIDB4ODlFNiwgMHg4QTc2LCAweDhBODYsIDB4OEE3RiwgMHg4QTYxLCAweDhBM0YsIDB4OEE3NywKLSAgICAweDhBODIsIDB4OEE4NCwgMHg4QTc1LCAweDhBODMsIDB4OEE4MSwgMHg4QTc0LCAweDhBN0EsIDB4OEMzQywKLSAgICAweDhDNEIsIDB4OEM0QSwgMHg4QzY1LCAweDhDNjQsIDB4OEM2NiwgMHg4Qzg2LCAweDhDODQsIDB4OEM4NSwKLSAgICAweDhDQ0MsIDB4OEQ2OCwgMHg4RDY5LCAweDhEOTEsIDB4OEQ4QywgMHg4RDhFLCAweDhEOEYsIDB4OEQ4RCwKLSAgICAweDhEOTMsIDB4OEQ5NCwgMHg4RDkwLCAweDhEOTIsIDB4OERGMCwgMHg4REUwLCAweDhERUMsIDB4OERGMSwKLSAgICAweDhERUUsIDB4OEREMCwgMHg4REU5LCAweDhERTMsIDB4OERFMiwgMHg4REU3LCAweDhERjIsIDB4OERFQiwKLSAgICAweDhERjQsIDB4OEYwNiwgMHg4RUZGLCAweDhGMDEsIDB4OEYwMCwgMHg4RjA1LCAweDhGMDcsIDB4OEYwOCwKLSAgICAweDhGMDIsIDB4OEYwQiwgMHg5MDUyLCAweDkwM0YsIDB4OTA0NCwgMHg5MDQ5LCAweDkwM0QsIDB4OTExMCwKLSAgICAweDkxMEQsIDB4OTEwRiwgMHg5MTExLCAweDkxMTYsIDB4OTExNCwgMHg5MTBCLCAweDkxMEUsIDB4OTE2RSwKLSAgICAweDkxNkYsIDB4OTI0OCwgMHg5MjUyLCAweDkyMzAsIDB4OTIzQSwgMHg5MjY2LCAweDkyMzMsIDB4OTI2NSwKLSAgICAweDkyNUUsIDB4OTI4MywgMHg5MjJFLCAweDkyNEEsIDB4OTI0NiwgMHg5MjZELCAweDkyNkMsIDB4OTI0RiwKLSAgICAweDkyNjAsIDB4OTI2NywgMHg5MjZGLCAweDkyMzYsIDB4OTI2MSwgMHg5MjcwLCAweDkyMzEsIDB4OTI1NCwKLSAgICAweDkyNjMsIDB4OTI1MCwgMHg5MjcyLCAweDkyNEUsIDB4OTI1MywgMHg5MjRDLCAweDkyNTYsIDB4OTIzMiwKLSAgICAweDk1OUYsIDB4OTU5QywgMHg5NTlFLCAweDk1OUIsIDB4OTY5MiwgMHg5NjkzLCAweDk2OTEsIDB4OTY5NywKLSAgICAweDk2Q0UsIDB4OTZGQSwgMHg5NkZELCAweDk2RjgsIDB4OTZGNSwgMHg5NzczLCAweDk3NzcsIDB4OTc3OCwKLSAgICAweDk3NzIsIDB4OTgwRiwgMHg5ODBELCAweDk4MEUsIDB4OThBQywgMHg5OEY2LCAweDk4RjksIDB4OTlBRiwKLSAgICAweDk5QjIsIDB4OTlCMCwgMHg5OUI1LCAweDlBQUQsIDB4OUFBQiwgMHg5QjVCLCAweDlDRUEsIDB4OUNFRCwKLSAgICAweDlDRTcsIDB4OUU4MCwgMHg5RUZELCAweDUwRTYsIDB4NTBENCwgMHg1MEQ3LCAweDUwRTgsIDB4NTBGMywKLSAgICAweDUwREIsIDB4NTBFQSwgMHg1MERELCAweDUwRTQsIDB4NTBEMywgMHg1MEVDLCAweDUwRjAsIDB4NTBFRiwKLSAgICAweDUwRTMsIDB4NTBFMCwgMHg1MUQ4LCAweDUyODAsIDB4NTI4MSwgMHg1MkU5LCAweDUyRUIsIDB4NTMzMCwKLSAgICAweDUzQUMsIDB4NTYyNywgMHg1NjE1LCAweDU2MEMsIDB4NTYxMiwgMHg1NUZDLCAweDU2MEYsIDB4NTYxQywKLSAgICAweDU2MDEsIDB4NTYxMywgMHg1NjAyLCAweDU1RkEsIDB4NTYxRCwgMHg1NjA0LCAweDU1RkYsIDB4NTVGOSwKLSAgICAweDU4ODksIDB4NTg3QywgMHg1ODkwLCAweDU4OTgsIDB4NTg4NiwgMHg1ODgxLCAweDU4N0YsIDB4NTg3NCwKLSAgICAweDU4OEIsIDB4NTg3QSwgMHg1ODg3LCAweDU4OTEsIDB4NTg4RSwgMHg1ODc2LCAweDU4ODIsIDB4NTg4OCwKLSAgICAweDU4N0IsIDB4NTg5NCwgMHg1ODhGLCAweDU4RkUsIDB4NTk2QiwgMHg1QURDLCAweDVBRUUsIDB4NUFFNSwKLSAgICAweDVBRDUsIDB4NUFFQSwgMHg1QURBLCAweDVBRUQsIDB4NUFFQiwgMHg1QUYzLCAweDVBRTIsIDB4NUFFMCwKLSAgICAweDVBREIsIDB4NUFFQywgMHg1QURFLCAweDVBREQsIDB4NUFEOSwgMHg1QUU4LCAweDVBREYsIDB4NUI3NywKLSAgICAweDVCRTAsIDB4NUJFMywgMHg1QzYzLCAweDVEODIsIDB4NUQ4MCwgMHg1RDdELCAweDVEODYsIDB4NUQ3QSwKLSAgICAweDVEODEsIDB4NUQ3NywgMHg1RDhBLCAweDVEODksIDB4NUQ4OCwgMHg1RDdFLCAweDVEN0MsIDB4NUQ4RCwKLSAgICAweDVENzksIDB4NUQ3RiwgMHg1RTU4LCAweDVFNTksIDB4NUU1MywgMHg1RUQ4LCAweDVFRDEsIDB4NUVENywKLSAgICAweDVFQ0UsIDB4NUVEQywgMHg1RUQ1LCAweDVFRDksIDB4NUVEMiwgMHg1RUQ0LCAweDVGNDQsIDB4NUY0MywKLSAgICAweDVGNkYsIDB4NUZCNiwgMHg2MTJDLCAweDYxMjgsIDB4NjE0MSwgMHg2MTVFLCAweDYxNzEsIDB4NjE3MywKLSAgICAweDYxNTIsIDB4NjE1MywgMHg2MTcyLCAweDYxNkMsIDB4NjE4MCwgMHg2MTc0LCAweDYxNTQsIDB4NjE3QSwKLSAgICAweDYxNUIsIDB4NjE2NSwgMHg2MTNCLCAweDYxNkEsIDB4NjE2MSwgMHg2MTU2LCAweDYyMjksIDB4NjIyNywKLSAgICAweDYyMkIsIDB4NjQyQiwgMHg2NDRELCAweDY0NUIsIDB4NjQ1RCwgMHg2NDc0LCAweDY0NzYsIDB4NjQ3MiwKLSAgICAweDY0NzMsIDB4NjQ3RCwgMHg2NDc1LCAweDY0NjYsIDB4NjRBNiwgMHg2NDRFLCAweDY0ODIsIDB4NjQ1RSwKLSAgICAweDY0NUMsIDB4NjQ0QiwgMHg2NDUzLCAweDY0NjAsIDB4NjQ1MCwgMHg2NDdGLCAweDY0M0YsIDB4NjQ2QywKLSAgICAweDY0NkIsIDB4NjQ1OSwgMHg2NDY1LCAweDY0NzcsIDB4NjU3MywgMHg2NUEwLCAweDY2QTEsIDB4NjZBMCwKLSAgICAweDY2OUYsIDB4NjcwNSwgMHg2NzA0LCAweDY3MjIsIDB4NjlCMSwgMHg2OUI2LCAweDY5QzksIDB4NjlBMCwKLSAgICAweDY5Q0UsIDB4Njk5NiwgMHg2OUIwLCAweDY5QUMsIDB4NjlCQywgMHg2OTkxLCAweDY5OTksIDB4Njk4RSwKLSAgICAweDY5QTcsIDB4Njk4RCwgMHg2OUE5LCAweDY5QkUsIDB4NjlBRiwgMHg2OUJGLCAweDY5QzQsIDB4NjlCRCwKLSAgICAweDY5QTQsIDB4NjlENCwgMHg2OUI5LCAweDY5Q0EsIDB4Njk5QSwgMHg2OUNGLCAweDY5QjMsIDB4Njk5MywKLSAgICAweDY5QUEsIDB4NjlBMSwgMHg2OTlFLCAweDY5RDksIDB4Njk5NywgMHg2OTkwLCAweDY5QzIsIDB4NjlCNSwKLSAgICAweDY5QTUsIDB4NjlDNiwgMHg2QjRBLCAweDZCNEQsIDB4NkI0QiwgMHg2QjlFLCAweDZCOUYsIDB4NkJBMCwKLSAgICAweDZCQzMsIDB4NkJDNCwgMHg2QkZFLCAweDZFQ0UsIDB4NkVGNSwgMHg2RUYxLCAweDZGMDMsIDB4NkYyNSwKLSAgICAweDZFRjgsIDB4NkYzNywgMHg2RUZCLCAweDZGMkUsIDB4NkYwOSwgMHg2RjRFLCAweDZGMTksIDB4NkYxQSwKLSAgICAweDZGMjcsIDB4NkYxOCwgMHg2RjNCLCAweDZGMTIsIDB4NkVFRCwgMHg2RjBBLCAweDZGMzYsIDB4NkY3MywKLSAgICAweDZFRjksIDB4NkVFRSwgMHg2RjJELCAweDZGNDAsIDB4NkYzMCwgMHg2RjNDLCAweDZGMzUsIDB4NkVFQiwKLSAgICAweDZGMDcsIDB4NkYwRSwgMHg2RjQzLCAweDZGMDUsIDB4NkVGRCwgMHg2RUY2LCAweDZGMzksIDB4NkYxQywKLSAgICAweDZFRkMsIDB4NkYzQSwgMHg2RjFGLCAweDZGMEQsIDB4NkYxRSwgMHg2RjA4LCAweDZGMjEsIDB4NzE4NywKLSAgICAweDcxOTAsIDB4NzE4OSwgMHg3MTgwLCAweDcxODUsIDB4NzE4MiwgMHg3MThGLCAweDcxN0IsIDB4NzE4NiwKLSAgICAweDcxODEsIDB4NzE5NywgMHg3MjQ0LCAweDcyNTMsIDB4NzI5NywgMHg3Mjk1LCAweDcyOTMsIDB4NzM0MywKLSAgICAweDczNEQsIDB4NzM1MSwgMHg3MzRDLCAweDc0NjIsIDB4NzQ3MywgMHg3NDcxLCAweDc0NzUsIDB4NzQ3MiwKLSAgICAweDc0NjcsIDB4NzQ2RSwgMHg3NTAwLCAweDc1MDIsIDB4NzUwMywgMHg3NTdELCAweDc1OTAsIDB4NzYxNiwKLSAgICAweDc2MDgsIDB4NzYwQywgMHg3NjE1LCAweDc2MTEsIDB4NzYwQSwgMHg3NjE0LCAweDc2QjgsIDB4Nzc4MSwKLSAgICAweDc3N0MsIDB4Nzc4NSwgMHg3NzgyLCAweDc3NkUsIDB4Nzc4MCwgMHg3NzZGLCAweDc3N0UsIDB4Nzc4MywKLSAgICAweDc4QjIsIDB4NzhBQSwgMHg3OEI0LCAweDc4QUQsIDB4NzhBOCwgMHg3ODdFLCAweDc4QUIsIDB4Nzg5RSwKLSAgICAweDc4QTUsIDB4NzhBMCwgMHg3OEFDLCAweDc4QTIsIDB4NzhBNCwgMHg3OTk4LCAweDc5OEEsIDB4Nzk4QiwKLSAgICAweDc5OTYsIDB4Nzk5NSwgMHg3OTk0LCAweDc5OTMsIDB4Nzk5NywgMHg3OTg4LCAweDc5OTIsIDB4Nzk5MCwKLSAgICAweDdBMkIsIDB4N0E0QSwgMHg3QTMwLCAweDdBMkYsIDB4N0EyOCwgMHg3QTI2LCAweDdBQTgsIDB4N0FBQiwKLSAgICAweDdBQUMsIDB4N0FFRSwgMHg3Qjg4LCAweDdCOUMsIDB4N0I4QSwgMHg3QjkxLCAweDdCOTAsIDB4N0I5NiwKLSAgICAweDdCOEQsIDB4N0I4QywgMHg3QjlCLCAweDdCOEUsIDB4N0I4NSwgMHg3Qjk4LCAweDUyODQsIDB4N0I5OSwKLSAgICAweDdCQTQsIDB4N0I4MiwgMHg3Q0JCLCAweDdDQkYsIDB4N0NCQywgMHg3Q0JBLCAweDdEQTcsIDB4N0RCNywKLSAgICAweDdEQzIsIDB4N0RBMywgMHg3REFBLCAweDdEQzEsIDB4N0RDMCwgMHg3REM1LCAweDdEOUQsIDB4N0RDRSwKLSAgICAweDdEQzQsIDB4N0RDNiwgMHg3RENCLCAweDdEQ0MsIDB4N0RBRiwgMHg3REI5LCAweDdEOTYsIDB4N0RCQywKLSAgICAweDdEOUYsIDB4N0RBNiwgMHg3REFFLCAweDdEQTksIDB4N0RBMSwgMHg3REM5LCAweDdGNzMsIDB4N0ZFMiwKLSAgICAweDdGRTMsIDB4N0ZFNSwgMHg3RkRFLCAweDgwMjQsIDB4ODA1RCwgMHg4MDVDLCAweDgxODksIDB4ODE4NiwKLSAgICAweDgxODMsIDB4ODE4NywgMHg4MThELCAweDgxOEMsIDB4ODE4QiwgMHg4MjE1LCAweDg0OTcsIDB4ODRBNCwKLSAgICAweDg0QTEsIDB4ODQ5RiwgMHg4NEJBLCAweDg0Q0UsIDB4ODRDMiwgMHg4NEFDLCAweDg0QUUsIDB4ODRBQiwKLSAgICAweDg0QjksIDB4ODRCNCwgMHg4NEMxLCAweDg0Q0QsIDB4ODRBQSwgMHg4NDlBLCAweDg0QjEsIDB4ODREMCwKLSAgICAweDg0OUQsIDB4ODRBNywgMHg4NEJCLCAweDg0QTIsIDB4ODQ5NCwgMHg4NEM3LCAweDg0Q0MsIDB4ODQ5QiwKLSAgICAweDg0QTksIDB4ODRBRiwgMHg4NEE4LCAweDg0RDYsIDB4ODQ5OCwgMHg4NEI2LCAweDg0Q0YsIDB4ODRBMCwKLSAgICAweDg0RDcsIDB4ODRENCwgMHg4NEQyLCAweDg0REIsIDB4ODRCMCwgMHg4NDkxLCAweDg2NjEsIDB4ODczMywKLSAgICAweDg3MjMsIDB4ODcyOCwgMHg4NzZCLCAweDg3NDAsIDB4ODcyRSwgMHg4NzFFLCAweDg3MjEsIDB4ODcxOSwKLSAgICAweDg3MUIsIDB4ODc0MywgMHg4NzJDLCAweDg3NDEsIDB4ODczRSwgMHg4NzQ2LCAweDg3MjAsIDB4ODczMiwKLSAgICAweDg3MkEsIDB4ODcyRCwgMHg4NzNDLCAweDg3MTIsIDB4ODczQSwgMHg4NzMxLCAweDg3MzUsIDB4ODc0MiwKLSAgICAweDg3MjYsIDB4ODcyNywgMHg4NzM4LCAweDg3MjQsIDB4ODcxQSwgMHg4NzMwLCAweDg3MTEsIDB4ODhGNywKLSAgICAweDg4RTcsIDB4ODhGMSwgMHg4OEYyLCAweDg4RkEsIDB4ODhGRSwgMHg4OEVFLCAweDg4RkMsIDB4ODhGNiwKLSAgICAweDg4RkIsIDB4ODhGMCwgMHg4OEVDLCAweDg4RUIsIDB4ODk5RCwgMHg4OUExLCAweDg5OUYsIDB4ODk5RSwKLSAgICAweDg5RTksIDB4ODlFQiwgMHg4OUU4LCAweDhBQUIsIDB4OEE5OSwgMHg4QThCLCAweDhBOTIsIDB4OEE4RiwKLSAgICAweDhBOTYsIDB4OEMzRCwgMHg4QzY4LCAweDhDNjksIDB4OENENSwgMHg4Q0NGLCAweDhDRDcsIDB4OEQ5NiwKLSAgICAweDhFMDksIDB4OEUwMiwgMHg4REZGLCAweDhFMEQsIDB4OERGRCwgMHg4RTBBLCAweDhFMDMsIDB4OEUwNywKLSAgICAweDhFMDYsIDB4OEUwNSwgMHg4REZFLCAweDhFMDAsIDB4OEUwNCwgMHg4RjEwLCAweDhGMTEsIDB4OEYwRSwKLSAgICAweDhGMEQsIDB4OTEyMywgMHg5MTFDLCAweDkxMjAsIDB4OTEyMiwgMHg5MTFGLCAweDkxMUQsIDB4OTExQSwKLSAgICAweDkxMjQsIDB4OTEyMSwgMHg5MTFCLCAweDkxN0EsIDB4OTE3MiwgMHg5MTc5LCAweDkxNzMsIDB4OTJBNSwKLSAgICAweDkyQTQsIDB4OTI3NiwgMHg5MjlCLCAweDkyN0EsIDB4OTJBMCwgMHg5Mjk0LCAweDkyQUEsIDB4OTI4RCwKLSAgICAweDkyQTYsIDB4OTI5QSwgMHg5MkFCLCAweDkyNzksIDB4OTI5NywgMHg5MjdGLCAweDkyQTMsIDB4OTJFRSwKLSAgICAweDkyOEUsIDB4OTI4MiwgMHg5Mjk1LCAweDkyQTIsIDB4OTI3RCwgMHg5Mjg4LCAweDkyQTEsIDB4OTI4QSwKLSAgICAweDkyODYsIDB4OTI4QywgMHg5Mjk5LCAweDkyQTcsIDB4OTI3RSwgMHg5Mjg3LCAweDkyQTksIDB4OTI5RCwKLSAgICAweDkyOEIsIDB4OTIyRCwgMHg5NjlFLCAweDk2QTEsIDB4OTZGRiwgMHg5NzU4LCAweDk3N0QsIDB4OTc3QSwKLSAgICAweDk3N0UsIDB4OTc4MywgMHg5NzgwLCAweDk3ODIsIDB4OTc3QiwgMHg5Nzg0LCAweDk3ODEsIDB4OTc3RiwKLSAgICAweDk3Q0UsIDB4OTdDRCwgMHg5ODE2LCAweDk4QUQsIDB4OThBRSwgMHg5OTAyLCAweDk5MDAsIDB4OTkwNywKLSAgICAweDk5OUQsIDB4OTk5QywgMHg5OUMzLCAweDk5QjksIDB4OTlCQiwgMHg5OUJBLCAweDk5QzIsIDB4OTlCRCwKLSAgICAweDk5QzcsIDB4OUFCMSwgMHg5QUUzLCAweDlBRTcsIDB4OUIzRSwgMHg5QjNGLCAweDlCNjAsIDB4OUI2MSwKLSAgICAweDlCNUYsIDB4OUNGMSwgMHg5Q0YyLCAweDlDRjUsIDB4OUVBNywgMHg1MEZGLCAweDUxMDMsIDB4NTEzMCwKLSAgICAweDUwRjgsIDB4NTEwNiwgMHg1MTA3LCAweDUwRjYsIDB4NTBGRSwgMHg1MTBCLCAweDUxMEMsIDB4NTBGRCwKLSAgICAweDUxMEEsIDB4NTI4QiwgMHg1MjhDLCAweDUyRjEsIDB4NTJFRiwgMHg1NjQ4LCAweDU2NDIsIDB4NTY0QywKLSAgICAweDU2MzUsIDB4NTY0MSwgMHg1NjRBLCAweDU2NDksIDB4NTY0NiwgMHg1NjU4LCAweDU2NUEsIDB4NTY0MCwKLSAgICAweDU2MzMsIDB4NTYzRCwgMHg1NjJDLCAweDU2M0UsIDB4NTYzOCwgMHg1NjJBLCAweDU2M0EsIDB4NTcxQSwKLSAgICAweDU4QUIsIDB4NTg5RCwgMHg1OEIxLCAweDU4QTAsIDB4NThBMywgMHg1OEFGLCAweDU4QUMsIDB4NThBNSwKLSAgICAweDU4QTEsIDB4NThGRiwgMHg1QUZGLCAweDVBRjQsIDB4NUFGRCwgMHg1QUY3LCAweDVBRjYsIDB4NUIwMywKLSAgICAweDVBRjgsIDB4NUIwMiwgMHg1QUY5LCAweDVCMDEsIDB4NUIwNywgMHg1QjA1LCAweDVCMEYsIDB4NUM2NywKLSAgICAweDVEOTksIDB4NUQ5NywgMHg1RDlGLCAweDVEOTIsIDB4NURBMiwgMHg1RDkzLCAweDVEOTUsIDB4NURBMCwKLSAgICAweDVEOUMsIDB4NURBMSwgMHg1RDlBLCAweDVEOUUsIDB4NUU2OSwgMHg1RTVELCAweDVFNjAsIDB4NUU1QywKLSAgICAweDdERjMsIDB4NUVEQiwgMHg1RURFLCAweDVFRTEsIDB4NUY0OSwgMHg1RkIyLCAweDYxOEIsIDB4NjE4MywKLSAgICAweDYxNzksIDB4NjFCMSwgMHg2MUIwLCAweDYxQTIsIDB4NjE4OSwgMHg2MTlCLCAweDYxOTMsIDB4NjFBRiwKLSAgICAweDYxQUQsIDB4NjE5RiwgMHg2MTkyLCAweDYxQUEsIDB4NjFBMSwgMHg2MThELCAweDYxNjYsIDB4NjFCMywKLSAgICAweDYyMkQsIDB4NjQ2RSwgMHg2NDcwLCAweDY0OTYsIDB4NjRBMCwgMHg2NDg1LCAweDY0OTcsIDB4NjQ5QywKLSAgICAweDY0OEYsIDB4NjQ4QiwgMHg2NDhBLCAweDY0OEMsIDB4NjRBMywgMHg2NDlGLCAweDY0NjgsIDB4NjRCMSwKLSAgICAweDY0OTgsIDB4NjU3NiwgMHg2NTdBLCAweDY1NzksIDB4NjU3QiwgMHg2NUIyLCAweDY1QjMsIDB4NjZCNSwKLSAgICAweDY2QjAsIDB4NjZBOSwgMHg2NkIyLCAweDY2QjcsIDB4NjZBQSwgMHg2NkFGLCAweDZBMDAsIDB4NkEwNiwKLSAgICAweDZBMTcsIDB4NjlFNSwgMHg2OUY4LCAweDZBMTUsIDB4NjlGMSwgMHg2OUU0LCAweDZBMjAsIDB4NjlGRiwKLSAgICAweDY5RUMsIDB4NjlFMiwgMHg2QTFCLCAweDZBMUQsIDB4NjlGRSwgMHg2QTI3LCAweDY5RjIsIDB4NjlFRSwKLSAgICAweDZBMTQsIDB4NjlGNywgMHg2OUU3LCAweDZBNDAsIDB4NkEwOCwgMHg2OUU2LCAweDY5RkIsIDB4NkEwRCwKLSAgICAweDY5RkMsIDB4NjlFQiwgMHg2QTA5LCAweDZBMDQsIDB4NkExOCwgMHg2QTI1LCAweDZBMEYsIDB4NjlGNiwKLSAgICAweDZBMjYsIDB4NkEwNywgMHg2OUY0LCAweDZBMTYsIDB4NkI1MSwgMHg2QkE1LCAweDZCQTMsIDB4NkJBMiwKLSAgICAweDZCQTYsIDB4NkMwMSwgMHg2QzAwLCAweDZCRkYsIDB4NkMwMiwgMHg2RjQxLCAweDZGMjYsIDB4NkY3RSwKLSAgICAweDZGODcsIDB4NkZDNiwgMHg2RjkyLCAweDZGOEQsIDB4NkY4OSwgMHg2RjhDLCAweDZGNjIsIDB4NkY0RiwKLSAgICAweDZGODUsIDB4NkY1QSwgMHg2Rjk2LCAweDZGNzYsIDB4NkY2QywgMHg2RjgyLCAweDZGNTUsIDB4NkY3MiwKLSAgICAweDZGNTIsIDB4NkY1MCwgMHg2RjU3LCAweDZGOTQsIDB4NkY5MywgMHg2RjVELCAweDZGMDAsIDB4NkY2MSwKLSAgICAweDZGNkIsIDB4NkY3RCwgMHg2RjY3LCAweDZGOTAsIDB4NkY1MywgMHg2RjhCLCAweDZGNjksIDB4NkY3RiwKLSAgICAweDZGOTUsIDB4NkY2MywgMHg2Rjc3LCAweDZGNkEsIDB4NkY3QiwgMHg3MUIyLCAweDcxQUYsIDB4NzE5QiwKLSAgICAweDcxQjAsIDB4NzFBMCwgMHg3MTlBLCAweDcxQTksIDB4NzFCNSwgMHg3MTlELCAweDcxQTUsIDB4NzE5RSwKLSAgICAweDcxQTQsIDB4NzFBMSwgMHg3MUFBLCAweDcxOUMsIDB4NzFBNywgMHg3MUIzLCAweDcyOTgsIDB4NzI5QSwKLSAgICAweDczNTgsIDB4NzM1MiwgMHg3MzVFLCAweDczNUYsIDB4NzM2MCwgMHg3MzVELCAweDczNUIsIDB4NzM2MSwKLSAgICAweDczNUEsIDB4NzM1OSwgMHg3MzYyLCAweDc0ODcsIDB4NzQ4OSwgMHg3NDhBLCAweDc0ODYsIDB4NzQ4MSwKLSAgICAweDc0N0QsIDB4NzQ4NSwgMHg3NDg4LCAweDc0N0MsIDB4NzQ3OSwgMHg3NTA4LCAweDc1MDcsIDB4NzU3RSwKLSAgICAweDc2MjUsIDB4NzYxRSwgMHg3NjE5LCAweDc2MUQsIDB4NzYxQywgMHg3NjIzLCAweDc2MUEsIDB4NzYyOCwKLSAgICAweDc2MUIsIDB4NzY5QywgMHg3NjlELCAweDc2OUUsIDB4NzY5QiwgMHg3NzhELCAweDc3OEYsIDB4Nzc4OSwKLSAgICAweDc3ODgsIDB4NzhDRCwgMHg3OEJCLCAweDc4Q0YsIDB4NzhDQywgMHg3OEQxLCAweDc4Q0UsIDB4NzhENCwKLSAgICAweDc4QzgsIDB4NzhDMywgMHg3OEM0LCAweDc4QzksIDB4Nzk5QSwgMHg3OUExLCAweDc5QTAsIDB4Nzk5QywKLSAgICAweDc5QTIsIDB4Nzk5QiwgMHg2Qjc2LCAweDdBMzksIDB4N0FCMiwgMHg3QUI0LCAweDdBQjMsIDB4N0JCNywKLSAgICAweDdCQ0IsIDB4N0JCRSwgMHg3QkFDLCAweDdCQ0UsIDB4N0JBRiwgMHg3QkI5LCAweDdCQ0EsIDB4N0JCNSwKLSAgICAweDdDQzUsIDB4N0NDOCwgMHg3Q0NDLCAweDdDQ0IsIDB4N0RGNywgMHg3RERCLCAweDdERUEsIDB4N0RFNywKLSAgICAweDdERDcsIDB4N0RFMSwgMHg3RTAzLCAweDdERkEsIDB4N0RFNiwgMHg3REY2LCAweDdERjEsIDB4N0RGMCwKLSAgICAweDdERUUsIDB4N0RERiwgMHg3Rjc2LCAweDdGQUMsIDB4N0ZCMCwgMHg3RkFELCAweDdGRUQsIDB4N0ZFQiwKLSAgICAweDdGRUEsIDB4N0ZFQywgMHg3RkU2LCAweDdGRTgsIDB4ODA2NCwgMHg4MDY3LCAweDgxQTMsIDB4ODE5RiwKLSAgICAweDgxOUUsIDB4ODE5NSwgMHg4MUEyLCAweDgxOTksIDB4ODE5NywgMHg4MjE2LCAweDgyNEYsIDB4ODI1MywKLSAgICAweDgyNTIsIDB4ODI1MCwgMHg4MjRFLCAweDgyNTEsIDB4ODUyNCwgMHg4NTNCLCAweDg1MEYsIDB4ODUwMCwKLSAgICAweDg1MjksIDB4ODUwRSwgMHg4NTA5LCAweDg1MEQsIDB4ODUxRiwgMHg4NTBBLCAweDg1MjcsIDB4ODUxQywKLSAgICAweDg0RkIsIDB4ODUyQiwgMHg4NEZBLCAweDg1MDgsIDB4ODUwQywgMHg4NEY0LCAweDg1MkEsIDB4ODRGMiwKLSAgICAweDg1MTUsIDB4ODRGNywgMHg4NEVCLCAweDg0RjMsIDB4ODRGQywgMHg4NTEyLCAweDg0RUEsIDB4ODRFOSwKLSAgICAweDg1MTYsIDB4ODRGRSwgMHg4NTI4LCAweDg1MUQsIDB4ODUyRSwgMHg4NTAyLCAweDg0RkQsIDB4ODUxRSwKLSAgICAweDg0RjYsIDB4ODUzMSwgMHg4NTI2LCAweDg0RTcsIDB4ODRFOCwgMHg4NEYwLCAweDg0RUYsIDB4ODRGOSwKLSAgICAweDg1MTgsIDB4ODUyMCwgMHg4NTMwLCAweDg1MEIsIDB4ODUxOSwgMHg4NTJGLCAweDg2NjIsIDB4ODc1NiwKLSAgICAweDg3NjMsIDB4ODc2NCwgMHg4Nzc3LCAweDg3RTEsIDB4ODc3MywgMHg4NzU4LCAweDg3NTQsIDB4ODc1QiwKLSAgICAweDg3NTIsIDB4ODc2MSwgMHg4NzVBLCAweDg3NTEsIDB4ODc1RSwgMHg4NzZELCAweDg3NkEsIDB4ODc1MCwKLSAgICAweDg3NEUsIDB4ODc1RiwgMHg4NzVELCAweDg3NkYsIDB4ODc2QywgMHg4NzdBLCAweDg3NkUsIDB4ODc1QywKLSAgICAweDg3NjUsIDB4ODc0RiwgMHg4NzdCLCAweDg3NzUsIDB4ODc2MiwgMHg4NzY3LCAweDg3NjksIDB4ODg1QSwKLSAgICAweDg5MDUsIDB4ODkwQywgMHg4OTE0LCAweDg5MEIsIDB4ODkxNywgMHg4OTE4LCAweDg5MTksIDB4ODkwNiwKLSAgICAweDg5MTYsIDB4ODkxMSwgMHg4OTBFLCAweDg5MDksIDB4ODlBMiwgMHg4OUE0LCAweDg5QTMsIDB4ODlFRCwKLSAgICAweDg5RjAsIDB4ODlFQywgMHg4QUNGLCAweDhBQzYsIDB4OEFCOCwgMHg4QUQzLCAweDhBRDEsIDB4OEFENCwKLSAgICAweDhBRDUsIDB4OEFCQiwgMHg4QUQ3LCAweDhBQkUsIDB4OEFDMCwgMHg4QUM1LCAweDhBRDgsIDB4OEFDMywKLSAgICAweDhBQkEsIDB4OEFCRCwgMHg4QUQ5LCAweDhDM0UsIDB4OEM0RCwgMHg4QzhGLCAweDhDRTUsIDB4OENERiwKLSAgICAweDhDRDksIDB4OENFOCwgMHg4Q0RBLCAweDhDREQsIDB4OENFNywgMHg4REEwLCAweDhEOUMsIDB4OERBMSwKLSAgICAweDhEOUIsIDB4OEUyMCwgMHg4RTIzLCAweDhFMjUsIDB4OEUyNCwgMHg4RTJFLCAweDhFMTUsIDB4OEUxQiwKLSAgICAweDhFMTYsIDB4OEUxMSwgMHg4RTE5LCAweDhFMjYsIDB4OEUyNywgMHg4RTE0LCAweDhFMTIsIDB4OEUxOCwKLSAgICAweDhFMTMsIDB4OEUxQywgMHg4RTE3LCAweDhFMUEsIDB4OEYyQywgMHg4RjI0LCAweDhGMTgsIDB4OEYxQSwKLSAgICAweDhGMjAsIDB4OEYyMywgMHg4RjE2LCAweDhGMTcsIDB4OTA3MywgMHg5MDcwLCAweDkwNkYsIDB4OTA2NywKLSAgICAweDkwNkIsIDB4OTEyRiwgMHg5MTJCLCAweDkxMjksIDB4OTEyQSwgMHg5MTMyLCAweDkxMjYsIDB4OTEyRSwKLSAgICAweDkxODUsIDB4OTE4NiwgMHg5MThBLCAweDkxODEsIDB4OTE4MiwgMHg5MTg0LCAweDkxODAsIDB4OTJEMCwKLSAgICAweDkyQzMsIDB4OTJDNCwgMHg5MkMwLCAweDkyRDksIDB4OTJCNiwgMHg5MkNGLCAweDkyRjEsIDB4OTJERiwKLSAgICAweDkyRDgsIDB4OTJFOSwgMHg5MkQ3LCAweDkyREQsIDB4OTJDQywgMHg5MkVGLCAweDkyQzIsIDB4OTJFOCwKLSAgICAweDkyQ0EsIDB4OTJDOCwgMHg5MkNFLCAweDkyRTYsIDB4OTJDRCwgMHg5MkQ1LCAweDkyQzksIDB4OTJFMCwKLSAgICAweDkyREUsIDB4OTJFNywgMHg5MkQxLCAweDkyRDMsIDB4OTJCNSwgMHg5MkUxLCAweDkzMjUsIDB4OTJDNiwKLSAgICAweDkyQjQsIDB4OTU3QywgMHg5NUFDLCAweDk1QUIsIDB4OTVBRSwgMHg5NUIwLCAweDk2QTQsIDB4OTZBMiwKLSAgICAweDk2RDMsIDB4OTcwNSwgMHg5NzA4LCAweDk3MDIsIDB4OTc1QSwgMHg5NzhBLCAweDk3OEUsIDB4OTc4OCwKLSAgICAweDk3RDAsIDB4OTdDRiwgMHg5ODFFLCAweDk4MUQsIDB4OTgyNiwgMHg5ODI5LCAweDk4MjgsIDB4OTgyMCwKLSAgICAweDk4MUIsIDB4OTgyNywgMHg5OEIyLCAweDk5MDgsIDB4OThGQSwgMHg5OTExLCAweDk5MTQsIDB4OTkxNiwKLSAgICAweDk5MTcsIDB4OTkxNSwgMHg5OURDLCAweDk5Q0QsIDB4OTlDRiwgMHg5OUQzLCAweDk5RDQsIDB4OTlDRSwKLSAgICAweDk5QzksIDB4OTlENiwgMHg5OUQ4LCAweDk5Q0IsIDB4OTlENywgMHg5OUNDLCAweDlBQjMsIDB4OUFFQywKLSAgICAweDlBRUIsIDB4OUFGMywgMHg5QUYyLCAweDlBRjEsIDB4OUI0NiwgMHg5QjQzLCAweDlCNjcsIDB4OUI3NCwKLSAgICAweDlCNzEsIDB4OUI2NiwgMHg5Qjc2LCAweDlCNzUsIDB4OUI3MCwgMHg5QjY4LCAweDlCNjQsIDB4OUI2QywKLSAgICAweDlDRkMsIDB4OUNGQSwgMHg5Q0ZELCAweDlDRkYsIDB4OUNGNywgMHg5RDA3LCAweDlEMDAsIDB4OUNGOSwKLSAgICAweDlDRkIsIDB4OUQwOCwgMHg5RDA1LCAweDlEMDQsIDB4OUU4MywgMHg5RUQzLCAweDlGMEYsIDB4OUYxMCwKLSAgICAweDUxMUMsIDB4NTExMywgMHg1MTE3LCAweDUxMUEsIDB4NTExMSwgMHg1MURFLCAweDUzMzQsIDB4NTNFMSwKLSAgICAweDU2NzAsIDB4NTY2MCwgMHg1NjZFLCAweDU2NzMsIDB4NTY2NiwgMHg1NjYzLCAweDU2NkQsIDB4NTY3MiwKLSAgICAweDU2NUUsIDB4NTY3NywgMHg1NzFDLCAweDU3MUIsIDB4NThDOCwgMHg1OEJELCAweDU4QzksIDB4NThCRiwKLSAgICAweDU4QkEsIDB4NThDMiwgMHg1OEJDLCAweDU4QzYsIDB4NUIxNywgMHg1QjE5LCAweDVCMUIsIDB4NUIyMSwKLSAgICAweDVCMTQsIDB4NUIxMywgMHg1QjEwLCAweDVCMTYsIDB4NUIyOCwgMHg1QjFBLCAweDVCMjAsIDB4NUIxRSwKLSAgICAweDVCRUYsIDB4NURBQywgMHg1REIxLCAweDVEQTksIDB4NURBNywgMHg1REI1LCAweDVEQjAsIDB4NURBRSwKLSAgICAweDVEQUEsIDB4NURBOCwgMHg1REIyLCAweDVEQUQsIDB4NURBRiwgMHg1REI0LCAweDVFNjcsIDB4NUU2OCwKLSAgICAweDVFNjYsIDB4NUU2RiwgMHg1RUU5LCAweDVFRTcsIDB4NUVFNiwgMHg1RUU4LCAweDVFRTUsIDB4NUY0QiwKLSAgICAweDVGQkMsIDB4NUZCQiwgMHg2MTlELCAweDYxQTgsIDB4NjE5NiwgMHg2MUM1LCAweDYxQjQsIDB4NjFDNiwKLSAgICAweDYxQzEsIDB4NjFDQywgMHg2MUJBLCAweDYxQkYsIDB4NjFCOCwgMHg2MThDLCAweDY0RDcsIDB4NjRENiwKLSAgICAweDY0RDAsIDB4NjRDRiwgMHg2NEM5LCAweDY0QkQsIDB4NjQ4OSwgMHg2NEMzLCAweDY0REIsIDB4NjRGMywKLSAgICAweDY0RDksIDB4NjUzMywgMHg2NTdGLCAweDY1N0MsIDB4NjVBMiwgMHg2NkM4LCAweDY2QkUsIDB4NjZDMCwKLSAgICAweDY2Q0EsIDB4NjZDQiwgMHg2NkNGLCAweDY2QkQsIDB4NjZCQiwgMHg2NkJBLCAweDY2Q0MsIDB4NjcyMywKLSAgICAweDZBMzQsIDB4NkE2NiwgMHg2QTQ5LCAweDZBNjcsIDB4NkEzMiwgMHg2QTY4LCAweDZBM0UsIDB4NkE1RCwKLSAgICAweDZBNkQsIDB4NkE3NiwgMHg2QTVCLCAweDZBNTEsIDB4NkEyOCwgMHg2QTVBLCAweDZBM0IsIDB4NkEzRiwKLSAgICAweDZBNDEsIDB4NkE2QSwgMHg2QTY0LCAweDZBNTAsIDB4NkE0RiwgMHg2QTU0LCAweDZBNkYsIDB4NkE2OSwKLSAgICAweDZBNjAsIDB4NkEzQywgMHg2QTVFLCAweDZBNTYsIDB4NkE1NSwgMHg2QTRELCAweDZBNEUsIDB4NkE0NiwKLSAgICAweDZCNTUsIDB4NkI1NCwgMHg2QjU2LCAweDZCQTcsIDB4NkJBQSwgMHg2QkFCLCAweDZCQzgsIDB4NkJDNywKLSAgICAweDZDMDQsIDB4NkMwMywgMHg2QzA2LCAweDZGQUQsIDB4NkZDQiwgMHg2RkEzLCAweDZGQzcsIDB4NkZCQywKLSAgICAweDZGQ0UsIDB4NkZDOCwgMHg2RjVFLCAweDZGQzQsIDB4NkZCRCwgMHg2RjlFLCAweDZGQ0EsIDB4NkZBOCwKLSAgICAweDcwMDQsIDB4NkZBNSwgMHg2RkFFLCAweDZGQkEsIDB4NkZBQywgMHg2RkFBLCAweDZGQ0YsIDB4NkZCRiwKLSAgICAweDZGQjgsIDB4NkZBMiwgMHg2RkM5LCAweDZGQUIsIDB4NkZDRCwgMHg2RkFGLCAweDZGQjIsIDB4NkZCMCwKLSAgICAweDcxQzUsIDB4NzFDMiwgMHg3MUJGLCAweDcxQjgsIDB4NzFENiwgMHg3MUMwLCAweDcxQzEsIDB4NzFDQiwKLSAgICAweDcxRDQsIDB4NzFDQSwgMHg3MUM3LCAweDcxQ0YsIDB4NzFCRCwgMHg3MUQ4LCAweDcxQkMsIDB4NzFDNiwKLSAgICAweDcxREEsIDB4NzFEQiwgMHg3MjlELCAweDcyOUUsIDB4NzM2OSwgMHg3MzY2LCAweDczNjcsIDB4NzM2QywKLSAgICAweDczNjUsIDB4NzM2QiwgMHg3MzZBLCAweDc0N0YsIDB4NzQ5QSwgMHg3NEEwLCAweDc0OTQsIDB4NzQ5MiwKLSAgICAweDc0OTUsIDB4NzRBMSwgMHg3NTBCLCAweDc1ODAsIDB4NzYyRiwgMHg3NjJELCAweDc2MzEsIDB4NzYzRCwKLSAgICAweDc2MzMsIDB4NzYzQywgMHg3NjM1LCAweDc2MzIsIDB4NzYzMCwgMHg3NkJCLCAweDc2RTYsIDB4Nzc5QSwKLSAgICAweDc3OUQsIDB4NzdBMSwgMHg3NzlDLCAweDc3OUIsIDB4NzdBMiwgMHg3N0EzLCAweDc3OTUsIDB4Nzc5OSwKLSAgICAweDc3OTcsIDB4NzhERCwgMHg3OEU5LCAweDc4RTUsIDB4NzhFQSwgMHg3OERFLCAweDc4RTMsIDB4NzhEQiwKLSAgICAweDc4RTEsIDB4NzhFMiwgMHg3OEVELCAweDc4REYsIDB4NzhFMCwgMHg3OUE0LCAweDdBNDQsIDB4N0E0OCwKLSAgICAweDdBNDcsIDB4N0FCNiwgMHg3QUI4LCAweDdBQjUsIDB4N0FCMSwgMHg3QUI3LCAweDdCREUsIDB4N0JFMywKLSAgICAweDdCRTcsIDB4N0JERCwgMHg3QkQ1LCAweDdCRTUsIDB4N0JEQSwgMHg3QkU4LCAweDdCRjksIDB4N0JENCwKLSAgICAweDdCRUEsIDB4N0JFMiwgMHg3QkRDLCAweDdCRUIsIDB4N0JEOCwgMHg3QkRGLCAweDdDRDIsIDB4N0NENCwKLSAgICAweDdDRDcsIDB4N0NEMCwgMHg3Q0QxLCAweDdFMTIsIDB4N0UyMSwgMHg3RTE3LCAweDdFMEMsIDB4N0UxRiwKLSAgICAweDdFMjAsIDB4N0UxMywgMHg3RTBFLCAweDdFMUMsIDB4N0UxNSwgMHg3RTFBLCAweDdFMjIsIDB4N0UwQiwKLSAgICAweDdFMEYsIDB4N0UxNiwgMHg3RTBELCAweDdFMTQsIDB4N0UyNSwgMHg3RTI0LCAweDdGNDMsIDB4N0Y3QiwKLSAgICAweDdGN0MsIDB4N0Y3QSwgMHg3RkIxLCAweDdGRUYsIDB4ODAyQSwgMHg4MDI5LCAweDgwNkMsIDB4ODFCMSwKLSAgICAweDgxQTYsIDB4ODFBRSwgMHg4MUI5LCAweDgxQjUsIDB4ODFBQiwgMHg4MUIwLCAweDgxQUMsIDB4ODFCNCwKLSAgICAweDgxQjIsIDB4ODFCNywgMHg4MUE3LCAweDgxRjIsIDB4ODI1NSwgMHg4MjU2LCAweDgyNTcsIDB4ODU1NiwKLSAgICAweDg1NDUsIDB4ODU2QiwgMHg4NTRELCAweDg1NTMsIDB4ODU2MSwgMHg4NTU4LCAweDg1NDAsIDB4ODU0NiwKLSAgICAweDg1NjQsIDB4ODU0MSwgMHg4NTYyLCAweDg1NDQsIDB4ODU1MSwgMHg4NTQ3LCAweDg1NjMsIDB4ODUzRSwKLSAgICAweDg1NUIsIDB4ODU3MSwgMHg4NTRFLCAweDg1NkUsIDB4ODU3NSwgMHg4NTU1LCAweDg1NjcsIDB4ODU2MCwKLSAgICAweDg1OEMsIDB4ODU2NiwgMHg4NTVELCAweDg1NTQsIDB4ODU2NSwgMHg4NTZDLCAweDg2NjMsIDB4ODY2NSwKLSAgICAweDg2NjQsIDB4ODdBNCwgMHg4NzlCLCAweDg3OEYsIDB4ODc5NywgMHg4NzkzLCAweDg3OTIsIDB4ODc4OCwKLSAgICAweDg3ODEsIDB4ODc5NiwgMHg4Nzk4LCAweDg3NzksIDB4ODc4NywgMHg4N0EzLCAweDg3ODUsIDB4ODc5MCwKLSAgICAweDg3OTEsIDB4ODc5RCwgMHg4Nzg0LCAweDg3OTQsIDB4ODc5QywgMHg4NzlBLCAweDg3ODksIDB4ODkxRSwKLSAgICAweDg5MjYsIDB4ODkzMCwgMHg4OTJELCAweDg5MkUsIDB4ODkyNywgMHg4OTMxLCAweDg5MjIsIDB4ODkyOSwKLSAgICAweDg5MjMsIDB4ODkyRiwgMHg4OTJDLCAweDg5MUYsIDB4ODlGMSwgMHg4QUUwLCAweDhBRTIsIDB4OEFGMiwKLSAgICAweDhBRjQsIDB4OEFGNSwgMHg4QURELCAweDhCMTQsIDB4OEFFNCwgMHg4QURGLCAweDhBRjAsIDB4OEFDOCwKLSAgICAweDhBREUsIDB4OEFFMSwgMHg4QUU4LCAweDhBRkYsIDB4OEFFRiwgMHg4QUZCLCAweDhDOTEsIDB4OEM5MiwKLSAgICAweDhDOTAsIDB4OENGNSwgMHg4Q0VFLCAweDhDRjEsIDB4OENGMCwgMHg4Q0YzLCAweDhENkMsIDB4OEQ2RSwKLSAgICAweDhEQTUsIDB4OERBNywgMHg4RTMzLCAweDhFM0UsIDB4OEUzOCwgMHg4RTQwLCAweDhFNDUsIDB4OEUzNiwKLSAgICAweDhFM0MsIDB4OEUzRCwgMHg4RTQxLCAweDhFMzAsIDB4OEUzRiwgMHg4RUJELCAweDhGMzYsIDB4OEYyRSwKLSAgICAweDhGMzUsIDB4OEYzMiwgMHg4RjM5LCAweDhGMzcsIDB4OEYzNCwgMHg5MDc2LCAweDkwNzksIDB4OTA3QiwKLSAgICAweDkwODYsIDB4OTBGQSwgMHg5MTMzLCAweDkxMzUsIDB4OTEzNiwgMHg5MTkzLCAweDkxOTAsIDB4OTE5MSwKLSAgICAweDkxOEQsIDB4OTE4RiwgMHg5MzI3LCAweDkzMUUsIDB4OTMwOCwgMHg5MzFGLCAweDkzMDYsIDB4OTMwRiwKLSAgICAweDkzN0EsIDB4OTMzOCwgMHg5MzNDLCAweDkzMUIsIDB4OTMyMywgMHg5MzEyLCAweDkzMDEsIDB4OTM0NiwKLSAgICAweDkzMkQsIDB4OTMwRSwgMHg5MzBELCAweDkyQ0IsIDB4OTMxRCwgMHg5MkZBLCAweDkzMTMsIDB4OTJGOSwKLSAgICAweDkyRjcsIDB4OTMzNCwgMHg5MzAyLCAweDkzMjQsIDB4OTJGRiwgMHg5MzI5LCAweDkzMzksIDB4OTMzNSwKLSAgICAweDkzMkEsIDB4OTMxNCwgMHg5MzBDLCAweDkzMEIsIDB4OTJGRSwgMHg5MzA5LCAweDkzMDAsIDB4OTJGQiwKLSAgICAweDkzMTYsIDB4OTVCQywgMHg5NUNELCAweDk1QkUsIDB4OTVCOSwgMHg5NUJBLCAweDk1QjYsIDB4OTVCRiwKLSAgICAweDk1QjUsIDB4OTVCRCwgMHg5NkE5LCAweDk2RDQsIDB4OTcwQiwgMHg5NzEyLCAweDk3MTAsIDB4OTc5OSwKLSAgICAweDk3OTcsIDB4OTc5NCwgMHg5N0YwLCAweDk3RjgsIDB4OTgzNSwgMHg5ODJGLCAweDk4MzIsIDB4OTkyNCwKLSAgICAweDk5MUYsIDB4OTkyNywgMHg5OTI5LCAweDk5OUUsIDB4OTlFRSwgMHg5OUVDLCAweDk5RTUsIDB4OTlFNCwKLSAgICAweDk5RjAsIDB4OTlFMywgMHg5OUVBLCAweDk5RTksIDB4OTlFNywgMHg5QUI5LCAweDlBQkYsIDB4OUFCNCwKLSAgICAweDlBQkIsIDB4OUFGNiwgMHg5QUZBLCAweDlBRjksIDB4OUFGNywgMHg5QjMzLCAweDlCODAsIDB4OUI4NSwKLSAgICAweDlCODcsIDB4OUI3QywgMHg5QjdFLCAweDlCN0IsIDB4OUI4MiwgMHg5QjkzLCAweDlCOTIsIDB4OUI5MCwKLSAgICAweDlCN0EsIDB4OUI5NSwgMHg5QjdELCAweDlCODgsIDB4OUQyNSwgMHg5RDE3LCAweDlEMjAsIDB4OUQxRSwKLSAgICAweDlEMTQsIDB4OUQyOSwgMHg5RDFELCAweDlEMTgsIDB4OUQyMiwgMHg5RDEwLCAweDlEMTksIDB4OUQxRiwKLSAgICAweDlFODgsIDB4OUU4NiwgMHg5RTg3LCAweDlFQUUsIDB4OUVBRCwgMHg5RUQ1LCAweDlFRDYsIDB4OUVGQSwKLSAgICAweDlGMTIsIDB4OUYzRCwgMHg1MTI2LCAweDUxMjUsIDB4NTEyMiwgMHg1MTI0LCAweDUxMjAsIDB4NTEyOSwKLSAgICAweDUyRjQsIDB4NTY5MywgMHg1NjhDLCAweDU2OEQsIDB4NTY4NiwgMHg1Njg0LCAweDU2ODMsIDB4NTY3RSwKLSAgICAweDU2ODIsIDB4NTY3RiwgMHg1NjgxLCAweDU4RDYsIDB4NThENCwgMHg1OENGLCAweDU4RDIsIDB4NUIyRCwKLSAgICAweDVCMjUsIDB4NUIzMiwgMHg1QjIzLCAweDVCMkMsIDB4NUIyNywgMHg1QjI2LCAweDVCMkYsIDB4NUIyRSwKLSAgICAweDVCN0IsIDB4NUJGMSwgMHg1QkYyLCAweDVEQjcsIDB4NUU2QywgMHg1RTZBLCAweDVGQkUsIDB4NjFDMywKLSAgICAweDYxQjUsIDB4NjFCQywgMHg2MUU3LCAweDYxRTAsIDB4NjFFNSwgMHg2MUU0LCAweDYxRTgsIDB4NjFERSwKLSAgICAweDY0RUYsIDB4NjRFOSwgMHg2NEUzLCAweDY0RUIsIDB4NjRFNCwgMHg2NEU4LCAweDY1ODEsIDB4NjU4MCwKLSAgICAweDY1QjYsIDB4NjVEQSwgMHg2NkQyLCAweDZBOEQsIDB4NkE5NiwgMHg2QTgxLCAweDZBQTUsIDB4NkE4OSwKLSAgICAweDZBOUYsIDB4NkE5QiwgMHg2QUExLCAweDZBOUUsIDB4NkE4NywgMHg2QTkzLCAweDZBOEUsIDB4NkE5NSwKLSAgICAweDZBODMsIDB4NkFBOCwgMHg2QUE0LCAweDZBOTEsIDB4NkE3RiwgMHg2QUE2LCAweDZBOUEsIDB4NkE4NSwKLSAgICAweDZBOEMsIDB4NkE5MiwgMHg2QjVCLCAweDZCQUQsIDB4NkMwOSwgMHg2RkNDLCAweDZGQTksIDB4NkZGNCwKLSAgICAweDZGRDQsIDB4NkZFMywgMHg2RkRDLCAweDZGRUQsIDB4NkZFNywgMHg2RkU2LCAweDZGREUsIDB4NkZGMiwKLSAgICAweDZGREQsIDB4NkZFMiwgMHg2RkU4LCAweDcxRTEsIDB4NzFGMSwgMHg3MUU4LCAweDcxRjIsIDB4NzFFNCwKLSAgICAweDcxRjAsIDB4NzFFMiwgMHg3MzczLCAweDczNkUsIDB4NzM2RiwgMHg3NDk3LCAweDc0QjIsIDB4NzRBQiwKLSAgICAweDc0OTAsIDB4NzRBQSwgMHg3NEFELCAweDc0QjEsIDB4NzRBNSwgMHg3NEFGLCAweDc1MTAsIDB4NzUxMSwKLSAgICAweDc1MTIsIDB4NzUwRiwgMHg3NTg0LCAweDc2NDMsIDB4NzY0OCwgMHg3NjQ5LCAweDc2NDcsIDB4NzZBNCwKLSAgICAweDc2RTksIDB4NzdCNSwgMHg3N0FCLCAweDc3QjIsIDB4NzdCNywgMHg3N0I2LCAweDc3QjQsIDB4NzdCMSwKLSAgICAweDc3QTgsIDB4NzdGMCwgMHg3OEYzLCAweDc4RkQsIDB4NzkwMiwgMHg3OEZCLCAweDc4RkMsIDB4NzhGRiwKLSAgICAweDc4RjIsIDB4NzkwNSwgMHg3OEY5LCAweDc4RkUsIDB4NzkwNCwgMHg3OUFCLCAweDc5QTgsIDB4N0E1QywKLSAgICAweDdBNUIsIDB4N0E1NiwgMHg3QTU4LCAweDdBNTQsIDB4N0E1QSwgMHg3QUJFLCAweDdBQzAsIDB4N0FDMSwKLSAgICAweDdDMDUsIDB4N0MwRiwgMHg3QkYyLCAweDdDMDAsIDB4N0JGRiwgMHg3QkZCLCAweDdDMEUsIDB4N0JGNCwKLSAgICAweDdDMEIsIDB4N0JGMywgMHg3QzAyLCAweDdDMDksIDB4N0MwMywgMHg3QzAxLCAweDdCRjgsIDB4N0JGRCwKLSAgICAweDdDMDYsIDB4N0JGMCwgMHg3QkYxLCAweDdDMTAsIDB4N0MwQSwgMHg3Q0U4LCAweDdFMkQsIDB4N0UzQywKLSAgICAweDdFNDIsIDB4N0UzMywgMHg5ODQ4LCAweDdFMzgsIDB4N0UyQSwgMHg3RTQ5LCAweDdFNDAsIDB4N0U0NywKLSAgICAweDdFMjksIDB4N0U0QywgMHg3RTMwLCAweDdFM0IsIDB4N0UzNiwgMHg3RTQ0LCAweDdFM0EsIDB4N0Y0NSwKLSAgICAweDdGN0YsIDB4N0Y3RSwgMHg3RjdELCAweDdGRjQsIDB4N0ZGMiwgMHg4MDJDLCAweDgxQkIsIDB4ODFDNCwKLSAgICAweDgxQ0MsIDB4ODFDQSwgMHg4MUM1LCAweDgxQzcsIDB4ODFCQywgMHg4MUU5LCAweDgyNUIsIDB4ODI1QSwKLSAgICAweDgyNUMsIDB4ODU4MywgMHg4NTgwLCAweDg1OEYsIDB4ODVBNywgMHg4NTk1LCAweDg1QTAsIDB4ODU4QiwKLSAgICAweDg1QTMsIDB4ODU3QiwgMHg4NUE0LCAweDg1OUEsIDB4ODU5RSwgMHg4NTc3LCAweDg1N0MsIDB4ODU4OSwKLSAgICAweDg1QTEsIDB4ODU3QSwgMHg4NTc4LCAweDg1NTcsIDB4ODU4RSwgMHg4NTk2LCAweDg1ODYsIDB4ODU4RCwKLSAgICAweDg1OTksIDB4ODU5RCwgMHg4NTgxLCAweDg1QTIsIDB4ODU4MiwgMHg4NTg4LCAweDg1ODUsIDB4ODU3OSwKLSAgICAweDg1NzYsIDB4ODU5OCwgMHg4NTkwLCAweDg1OUYsIDB4ODY2OCwgMHg4N0JFLCAweDg3QUEsIDB4ODdBRCwKLSAgICAweDg3QzUsIDB4ODdCMCwgMHg4N0FDLCAweDg3QjksIDB4ODdCNSwgMHg4N0JDLCAweDg3QUUsIDB4ODdDOSwKLSAgICAweDg3QzMsIDB4ODdDMiwgMHg4N0NDLCAweDg3QjcsIDB4ODdBRiwgMHg4N0M0LCAweDg3Q0EsIDB4ODdCNCwKLSAgICAweDg3QjYsIDB4ODdCRiwgMHg4N0I4LCAweDg3QkQsIDB4ODdERSwgMHg4N0IyLCAweDg5MzUsIDB4ODkzMywKLSAgICAweDg5M0MsIDB4ODkzRSwgMHg4OTQxLCAweDg5NTIsIDB4ODkzNywgMHg4OTQyLCAweDg5QUQsIDB4ODlBRiwKLSAgICAweDg5QUUsIDB4ODlGMiwgMHg4OUYzLCAweDhCMUUsIDB4OEIxOCwgMHg4QjE2LCAweDhCMTEsIDB4OEIwNSwKLSAgICAweDhCMEIsIDB4OEIyMiwgMHg4QjBGLCAweDhCMTIsIDB4OEIxNSwgMHg4QjA3LCAweDhCMEQsIDB4OEIwOCwKLSAgICAweDhCMDYsIDB4OEIxQywgMHg4QjEzLCAweDhCMUEsIDB4OEM0RiwgMHg4QzcwLCAweDhDNzIsIDB4OEM3MSwKLSAgICAweDhDNkYsIDB4OEM5NSwgMHg4Qzk0LCAweDhDRjksIDB4OEQ2RiwgMHg4RTRFLCAweDhFNEQsIDB4OEU1MywKLSAgICAweDhFNTAsIDB4OEU0QywgMHg4RTQ3LCAweDhGNDMsIDB4OEY0MCwgMHg5MDg1LCAweDkwN0UsIDB4OTEzOCwKLSAgICAweDkxOUEsIDB4OTFBMiwgMHg5MTlCLCAweDkxOTksIDB4OTE5RiwgMHg5MUExLCAweDkxOUQsIDB4OTFBMCwKLSAgICAweDkzQTEsIDB4OTM4MywgMHg5M0FGLCAweDkzNjQsIDB4OTM1NiwgMHg5MzQ3LCAweDkzN0MsIDB4OTM1OCwKLSAgICAweDkzNUMsIDB4OTM3NiwgMHg5MzQ5LCAweDkzNTAsIDB4OTM1MSwgMHg5MzYwLCAweDkzNkQsIDB4OTM4RiwKLSAgICAweDkzNEMsIDB4OTM2QSwgMHg5Mzc5LCAweDkzNTcsIDB4OTM1NSwgMHg5MzUyLCAweDkzNEYsIDB4OTM3MSwKLSAgICAweDkzNzcsIDB4OTM3QiwgMHg5MzYxLCAweDkzNUUsIDB4OTM2MywgMHg5MzY3LCAweDkzNEUsIDB4OTM1OSwKLSAgICAweDk1QzcsIDB4OTVDMCwgMHg5NUM5LCAweDk1QzMsIDB4OTVDNSwgMHg5NUI3LCAweDk2QUUsIDB4OTZCMCwKLSAgICAweDk2QUMsIDB4OTcyMCwgMHg5NzFGLCAweDk3MTgsIDB4OTcxRCwgMHg5NzE5LCAweDk3OUEsIDB4OTdBMSwKLSAgICAweDk3OUMsIDB4OTc5RSwgMHg5NzlELCAweDk3RDUsIDB4OTdENCwgMHg5N0YxLCAweDk4NDEsIDB4OTg0NCwKLSAgICAweDk4NEEsIDB4OTg0OSwgMHg5ODQ1LCAweDk4NDMsIDB4OTkyNSwgMHg5OTJCLCAweDk5MkMsIDB4OTkyQSwKLSAgICAweDk5MzMsIDB4OTkzMiwgMHg5OTJGLCAweDk5MkQsIDB4OTkzMSwgMHg5OTMwLCAweDk5OTgsIDB4OTlBMywKLSAgICAweDk5QTEsIDB4OUEwMiwgMHg5OUZBLCAweDk5RjQsIDB4OTlGNywgMHg5OUY5LCAweDk5RjgsIDB4OTlGNiwKLSAgICAweDk5RkIsIDB4OTlGRCwgMHg5OUZFLCAweDk5RkMsIDB4OUEwMywgMHg5QUJFLCAweDlBRkUsIDB4OUFGRCwKLSAgICAweDlCMDEsIDB4OUFGQywgMHg5QjQ4LCAweDlCOUEsIDB4OUJBOCwgMHg5QjlFLCAweDlCOUIsIDB4OUJBNiwKLSAgICAweDlCQTEsIDB4OUJBNSwgMHg5QkE0LCAweDlCODYsIDB4OUJBMiwgMHg5QkEwLCAweDlCQUYsIDB4OUQzMywKLSAgICAweDlENDEsIDB4OUQ2NywgMHg5RDM2LCAweDlEMkUsIDB4OUQyRiwgMHg5RDMxLCAweDlEMzgsIDB4OUQzMCwKLSAgICAweDlENDUsIDB4OUQ0MiwgMHg5RDQzLCAweDlEM0UsIDB4OUQzNywgMHg5RDQwLCAweDlEM0QsIDB4N0ZGNSwKLSAgICAweDlEMkQsIDB4OUU4QSwgMHg5RTg5LCAweDlFOEQsIDB4OUVCMCwgMHg5RUM4LCAweDlFREEsIDB4OUVGQiwKLSAgICAweDlFRkYsIDB4OUYyNCwgMHg5RjIzLCAweDlGMjIsIDB4OUY1NCwgMHg5RkEwLCAweDUxMzEsIDB4NTEyRCwKLSAgICAweDUxMkUsIDB4NTY5OCwgMHg1NjlDLCAweDU2OTcsIDB4NTY5QSwgMHg1NjlELCAweDU2OTksIDB4NTk3MCwKLSAgICAweDVCM0MsIDB4NUM2OSwgMHg1QzZBLCAweDVEQzAsIDB4NUU2RCwgMHg1RTZFLCAweDYxRDgsIDB4NjFERiwKLSAgICAweDYxRUQsIDB4NjFFRSwgMHg2MUYxLCAweDYxRUEsIDB4NjFGMCwgMHg2MUVCLCAweDYxRDYsIDB4NjFFOSwKLSAgICAweDY0RkYsIDB4NjUwNCwgMHg2NEZELCAweDY0RjgsIDB4NjUwMSwgMHg2NTAzLCAweDY0RkMsIDB4NjU5NCwKLSAgICAweDY1REIsIDB4NjZEQSwgMHg2NkRCLCAweDY2RDgsIDB4NkFDNSwgMHg2QUI5LCAweDZBQkQsIDB4NkFFMSwKLSAgICAweDZBQzYsIDB4NkFCQSwgMHg2QUI2LCAweDZBQjcsIDB4NkFDNywgMHg2QUI0LCAweDZBQUQsIDB4NkI1RSwKLSAgICAweDZCQzksIDB4NkMwQiwgMHg3MDA3LCAweDcwMEMsIDB4NzAwRCwgMHg3MDAxLCAweDcwMDUsIDB4NzAxNCwKLSAgICAweDcwMEUsIDB4NkZGRiwgMHg3MDAwLCAweDZGRkIsIDB4NzAyNiwgMHg2RkZDLCAweDZGRjcsIDB4NzAwQSwKLSAgICAweDcyMDEsIDB4NzFGRiwgMHg3MUY5LCAweDcyMDMsIDB4NzFGRCwgMHg3Mzc2LCAweDc0QjgsIDB4NzRDMCwKLSAgICAweDc0QjUsIDB4NzRDMSwgMHg3NEJFLCAweDc0QjYsIDB4NzRCQiwgMHg3NEMyLCAweDc1MTQsIDB4NzUxMywKLSAgICAweDc2NUMsIDB4NzY2NCwgMHg3NjU5LCAweDc2NTAsIDB4NzY1MywgMHg3NjU3LCAweDc2NUEsIDB4NzZBNiwKLSAgICAweDc2QkQsIDB4NzZFQywgMHg3N0MyLCAweDc3QkEsIDB4NzkwQywgMHg3OTEzLCAweDc5MTQsIDB4NzkwOSwKLSAgICAweDc5MTAsIDB4NzkxMiwgMHg3OTExLCAweDc5QUQsIDB4NzlBQywgMHg3QTVGLCAweDdDMUMsIDB4N0MyOSwKLSAgICAweDdDMTksIDB4N0MyMCwgMHg3QzFGLCAweDdDMkQsIDB4N0MxRCwgMHg3QzI2LCAweDdDMjgsIDB4N0MyMiwKLSAgICAweDdDMjUsIDB4N0MzMCwgMHg3RTVDLCAweDdFNTAsIDB4N0U1NiwgMHg3RTYzLCAweDdFNTgsIDB4N0U2MiwKLSAgICAweDdFNUYsIDB4N0U1MSwgMHg3RTYwLCAweDdFNTcsIDB4N0U1MywgMHg3RkI1LCAweDdGQjMsIDB4N0ZGNywKLSAgICAweDdGRjgsIDB4ODA3NSwgMHg4MUQxLCAweDgxRDIsIDB4ODFEMCwgMHg4MjVGLCAweDgyNUUsIDB4ODVCNCwKLSAgICAweDg1QzYsIDB4ODVDMCwgMHg4NUMzLCAweDg1QzIsIDB4ODVCMywgMHg4NUI1LCAweDg1QkQsIDB4ODVDNywKLSAgICAweDg1QzQsIDB4ODVCRiwgMHg4NUNCLCAweDg1Q0UsIDB4ODVDOCwgMHg4NUM1LCAweDg1QjEsIDB4ODVCNiwKLSAgICAweDg1RDIsIDB4ODYyNCwgMHg4NUI4LCAweDg1QjcsIDB4ODVCRSwgMHg4NjY5LCAweDg3RTcsIDB4ODdFNiwKLSAgICAweDg3RTIsIDB4ODdEQiwgMHg4N0VCLCAweDg3RUEsIDB4ODdFNSwgMHg4N0RGLCAweDg3RjMsIDB4ODdFNCwKLSAgICAweDg3RDQsIDB4ODdEQywgMHg4N0QzLCAweDg3RUQsIDB4ODdEOCwgMHg4N0UzLCAweDg3RDcsIDB4ODdEOSwKLSAgICAweDg4MDEsIDB4ODdGNCwgMHg4N0U4LCAweDg3REQsIDB4ODk1MywgMHg4OTRCLCAweDg5NEYsIDB4ODk0QywKLSAgICAweDg5NDYsIDB4ODk1MCwgMHg4OTUxLCAweDg5NDksIDB4OEIyQSwgMHg4QjI3LCAweDhCMjMsIDB4OEIzMywKLSAgICAweDhCMzAsIDB4OEIzNSwgMHg4QjQ3LCAweDhCMkYsIDB4OEIzQywgMHg4QjNFLCAweDhCMzEsIDB4OEIyNSwKLSAgICAweDhCMzcsIDB4OEIyNiwgMHg4QjM2LCAweDhCMkUsIDB4OEIyNCwgMHg4QjNCLCAweDhCM0QsIDB4OEIzQSwKLSAgICAweDhDNDIsIDB4OEM3NSwgMHg4Qzk5LCAweDhDOTgsIDB4OEM5NywgMHg4Q0ZFLCAweDhEMDQsIDB4OEQwMiwKLSAgICAweDhEMDAsIDB4OEU1QywgMHg4RTYyLCAweDhFNjAsIDB4OEU1NywgMHg4RTU2LCAweDhFNUUsIDB4OEU2NSwKLSAgICAweDhFNjcsIDB4OEU1QiwgMHg4RTVBLCAweDhFNjEsIDB4OEU1RCwgMHg4RTY5LCAweDhFNTQsIDB4OEY0NiwKLSAgICAweDhGNDcsIDB4OEY0OCwgMHg4RjRCLCAweDkxMjgsIDB4OTEzQSwgMHg5MTNCLCAweDkxM0UsIDB4OTFBOCwKLSAgICAweDkxQTUsIDB4OTFBNywgMHg5MUFGLCAweDkxQUEsIDB4OTNCNSwgMHg5MzhDLCAweDkzOTIsIDB4OTNCNywKLSAgICAweDkzOUIsIDB4OTM5RCwgMHg5Mzg5LCAweDkzQTcsIDB4OTM4RSwgMHg5M0FBLCAweDkzOUUsIDB4OTNBNiwKLSAgICAweDkzOTUsIDB4OTM4OCwgMHg5Mzk5LCAweDkzOUYsIDB4OTM4MCwgMHg5MzhELCAweDkzQjEsIDB4OTM5MSwKLSAgICAweDkzQjIsIDB4OTNBNCwgMHg5M0E4LCAweDkzQjQsIDB4OTNBMywgMHg5NUQyLCAweDk1RDMsIDB4OTVEMSwKLSAgICAweDk2QjMsIDB4OTZENywgMHg5NkRBLCAweDVEQzIsIDB4OTZERiwgMHg5NkQ4LCAweDk2REQsIDB4OTcyMywKLSAgICAweDk3MjIsIDB4OTcyNSwgMHg5N0FDLCAweDk3QUUsIDB4OTdBOCwgMHg5N0FCLCAweDk3QTQsIDB4OTdBQSwKLSAgICAweDk3QTIsIDB4OTdBNSwgMHg5N0Q3LCAweDk3RDksIDB4OTdENiwgMHg5N0Q4LCAweDk3RkEsIDB4OTg1MCwKLSAgICAweDk4NTEsIDB4OTg1MiwgMHg5OEI4LCAweDk5NDEsIDB4OTkzQywgMHg5OTNBLCAweDlBMEYsIDB4OUEwQiwKLSAgICAweDlBMDksIDB4OUEwRCwgMHg5QTA0LCAweDlBMTEsIDB4OUEwQSwgMHg5QTA1LCAweDlBMDcsIDB4OUEwNiwKLSAgICAweDlBQzAsIDB4OUFEQywgMHg5QjA4LCAweDlCMDQsIDB4OUIwNSwgMHg5QjI5LCAweDlCMzUsIDB4OUI0QSwKLSAgICAweDlCNEMsIDB4OUI0QiwgMHg5QkM3LCAweDlCQzYsIDB4OUJDMywgMHg5QkJGLCAweDlCQzEsIDB4OUJCNSwKLSAgICAweDlCQjgsIDB4OUJEMywgMHg5QkI2LCAweDlCQzQsIDB4OUJCOSwgMHg5QkJELCAweDlENUMsIDB4OUQ1MywKLSAgICAweDlENEYsIDB4OUQ0QSwgMHg5RDVCLCAweDlENEIsIDB4OUQ1OSwgMHg5RDU2LCAweDlENEMsIDB4OUQ1NywKLSAgICAweDlENTIsIDB4OUQ1NCwgMHg5RDVGLCAweDlENTgsIDB4OUQ1QSwgMHg5RThFLCAweDlFOEMsIDB4OUVERiwKLSAgICAweDlGMDEsIDB4OUYwMCwgMHg5RjE2LCAweDlGMjUsIDB4OUYyQiwgMHg5RjJBLCAweDlGMjksIDB4OUYyOCwKLSAgICAweDlGNEMsIDB4OUY1NSwgMHg1MTM0LCAweDUxMzUsIDB4NTI5NiwgMHg1MkY3LCAweDUzQjQsIDB4NTZBQiwKLSAgICAweDU2QUQsIDB4NTZBNiwgMHg1NkE3LCAweDU2QUEsIDB4NTZBQywgMHg1OERBLCAweDU4REQsIDB4NThEQiwKLSAgICAweDU5MTIsIDB4NUIzRCwgMHg1QjNFLCAweDVCM0YsIDB4NURDMywgMHg1RTcwLCAweDVGQkYsIDB4NjFGQiwKLSAgICAweDY1MDcsIDB4NjUxMCwgMHg2NTBELCAweDY1MDksIDB4NjUwQywgMHg2NTBFLCAweDY1ODQsIDB4NjVERSwKLSAgICAweDY1REQsIDB4NjZERSwgMHg2QUU3LCAweDZBRTAsIDB4NkFDQywgMHg2QUQxLCAweDZBRDksIDB4NkFDQiwKLSAgICAweDZBREYsIDB4NkFEQywgMHg2QUQwLCAweDZBRUIsIDB4NkFDRiwgMHg2QUNELCAweDZBREUsIDB4NkI2MCwKLSAgICAweDZCQjAsIDB4NkMwQywgMHg3MDE5LCAweDcwMjcsIDB4NzAyMCwgMHg3MDE2LCAweDcwMkIsIDB4NzAyMSwKLSAgICAweDcwMjIsIDB4NzAyMywgMHg3MDI5LCAweDcwMTcsIDB4NzAyNCwgMHg3MDFDLCAweDcyMEMsIDB4NzIwQSwKLSAgICAweDcyMDcsIDB4NzIwMiwgMHg3MjA1LCAweDcyQTUsIDB4NzJBNiwgMHg3MkE0LCAweDcyQTMsIDB4NzJBMSwKLSAgICAweDc0Q0IsIDB4NzRDNSwgMHg3NEI3LCAweDc0QzMsIDB4NzUxNiwgMHg3NjYwLCAweDc3QzksIDB4NzdDQSwKLSAgICAweDc3QzQsIDB4NzdGMSwgMHg3OTFELCAweDc5MUIsIDB4NzkyMSwgMHg3OTFDLCAweDc5MTcsIDB4NzkxRSwKLSAgICAweDc5QjAsIDB4N0E2NywgMHg3QTY4LCAweDdDMzMsIDB4N0MzQywgMHg3QzM5LCAweDdDMkMsIDB4N0MzQiwKLSAgICAweDdDRUMsIDB4N0NFQSwgMHg3RTc2LCAweDdFNzUsIDB4N0U3OCwgMHg3RTcwLCAweDdFNzcsIDB4N0U2RiwKLSAgICAweDdFN0EsIDB4N0U3MiwgMHg3RTc0LCAweDdFNjgsIDB4N0Y0QiwgMHg3RjRBLCAweDdGODMsIDB4N0Y4NiwKLSAgICAweDdGQjcsIDB4N0ZGRCwgMHg3RkZFLCAweDgwNzgsIDB4ODFENywgMHg4MUQ1LCAweDgyMEIsIDB4ODI2NCwKLSAgICAweDgyNjEsIDB4ODI2MywgMHg4NUVCLCAweDg1RjEsIDB4ODVFRCwgMHg4NUQ5LCAweDg1RTEsIDB4ODVFOCwKLSAgICAweDg1REEsIDB4ODVENywgMHg4NUVDLCAweDg1RjIsIDB4ODVGOCwgMHg4NUQ4LCAweDg1REYsIDB4ODVFMywKLSAgICAweDg1REMsIDB4ODVEMSwgMHg4NUYwLCAweDg1RTYsIDB4ODVFRiwgMHg4NURFLCAweDg1RTIsIDB4ODgwMCwKLSAgICAweDg3RkEsIDB4ODgwMywgMHg4N0Y2LCAweDg3RjcsIDB4ODgwOSwgMHg4ODBDLCAweDg4MEIsIDB4ODgwNiwKLSAgICAweDg3RkMsIDB4ODgwOCwgMHg4N0ZGLCAweDg4MEEsIDB4ODgwMiwgMHg4OTYyLCAweDg5NUEsIDB4ODk1QiwKLSAgICAweDg5NTcsIDB4ODk2MSwgMHg4OTVDLCAweDg5NTgsIDB4ODk1RCwgMHg4OTU5LCAweDg5ODgsIDB4ODlCNywKLSAgICAweDg5QjYsIDB4ODlGNiwgMHg4QjUwLCAweDhCNDgsIDB4OEI0QSwgMHg4QjQwLCAweDhCNTMsIDB4OEI1NiwKLSAgICAweDhCNTQsIDB4OEI0QiwgMHg4QjU1LCAweDhCNTEsIDB4OEI0MiwgMHg4QjUyLCAweDhCNTcsIDB4OEM0MywKLSAgICAweDhDNzcsIDB4OEM3NiwgMHg4QzlBLCAweDhEMDYsIDB4OEQwNywgMHg4RDA5LCAweDhEQUMsIDB4OERBQSwKLSAgICAweDhEQUQsIDB4OERBQiwgMHg4RTZELCAweDhFNzgsIDB4OEU3MywgMHg4RTZBLCAweDhFNkYsIDB4OEU3QiwKLSAgICAweDhFQzIsIDB4OEY1MiwgMHg4RjUxLCAweDhGNEYsIDB4OEY1MCwgMHg4RjUzLCAweDhGQjQsIDB4OTE0MCwKLSAgICAweDkxM0YsIDB4OTFCMCwgMHg5MUFELCAweDkzREUsIDB4OTNDNywgMHg5M0NGLCAweDkzQzIsIDB4OTNEQSwKLSAgICAweDkzRDAsIDB4OTNGOSwgMHg5M0VDLCAweDkzQ0MsIDB4OTNEOSwgMHg5M0E5LCAweDkzRTYsIDB4OTNDQSwKLSAgICAweDkzRDQsIDB4OTNFRSwgMHg5M0UzLCAweDkzRDUsIDB4OTNDNCwgMHg5M0NFLCAweDkzQzAsIDB4OTNEMiwKLSAgICAweDkzQTUsIDB4OTNFNywgMHg5NTdELCAweDk1REEsIDB4OTVEQiwgMHg5NkUxLCAweDk3MjksIDB4OTcyQiwKLSAgICAweDk3MkMsIDB4OTcyOCwgMHg5NzI2LCAweDk3QjMsIDB4OTdCNywgMHg5N0I2LCAweDk3REQsIDB4OTdERSwKLSAgICAweDk3REYsIDB4OTg1QywgMHg5ODU5LCAweDk4NUQsIDB4OTg1NywgMHg5OEJGLCAweDk4QkQsIDB4OThCQiwKLSAgICAweDk4QkUsIDB4OTk0OCwgMHg5OTQ3LCAweDk5NDMsIDB4OTlBNiwgMHg5OUE3LCAweDlBMUEsIDB4OUExNSwKLSAgICAweDlBMjUsIDB4OUExRCwgMHg5QTI0LCAweDlBMUIsIDB4OUEyMiwgMHg5QTIwLCAweDlBMjcsIDB4OUEyMywKLSAgICAweDlBMUUsIDB4OUExQywgMHg5QTE0LCAweDlBQzIsIDB4OUIwQiwgMHg5QjBBLCAweDlCMEUsIDB4OUIwQywKLSAgICAweDlCMzcsIDB4OUJFQSwgMHg5QkVCLCAweDlCRTAsIDB4OUJERSwgMHg5QkU0LCAweDlCRTYsIDB4OUJFMiwKLSAgICAweDlCRjAsIDB4OUJENCwgMHg5QkQ3LCAweDlCRUMsIDB4OUJEQywgMHg5QkQ5LCAweDlCRTUsIDB4OUJENSwKLSAgICAweDlCRTEsIDB4OUJEQSwgMHg5RDc3LCAweDlEODEsIDB4OUQ4QSwgMHg5RDg0LCAweDlEODgsIDB4OUQ3MSwKLSAgICAweDlEODAsIDB4OUQ3OCwgMHg5RDg2LCAweDlEOEIsIDB4OUQ4QywgMHg5RDdELCAweDlENkIsIDB4OUQ3NCwKLSAgICAweDlENzUsIDB4OUQ3MCwgMHg5RDY5LCAweDlEODUsIDB4OUQ3MywgMHg5RDdCLCAweDlEODIsIDB4OUQ2RiwKLSAgICAweDlENzksIDB4OUQ3RiwgMHg5RDg3LCAweDlENjgsIDB4OUU5NCwgMHg5RTkxLCAweDlFQzAsIDB4OUVGQywKLSAgICAweDlGMkQsIDB4OUY0MCwgMHg5RjQxLCAweDlGNEQsIDB4OUY1NiwgMHg5RjU3LCAweDlGNTgsIDB4NTMzNywKLSAgICAweDU2QjIsIDB4NTZCNSwgMHg1NkIzLCAweDU4RTMsIDB4NUI0NSwgMHg1REM2LCAweDVEQzcsIDB4NUVFRSwKLSAgICAweDVFRUYsIDB4NUZDMCwgMHg1RkMxLCAweDYxRjksIDB4NjUxNywgMHg2NTE2LCAweDY1MTUsIDB4NjUxMywKLSAgICAweDY1REYsIDB4NjZFOCwgMHg2NkUzLCAweDY2RTQsIDB4NkFGMywgMHg2QUYwLCAweDZBRUEsIDB4NkFFOCwKLSAgICAweDZBRjksIDB4NkFGMSwgMHg2QUVFLCAweDZBRUYsIDB4NzAzQywgMHg3MDM1LCAweDcwMkYsIDB4NzAzNywKLSAgICAweDcwMzQsIDB4NzAzMSwgMHg3MDQyLCAweDcwMzgsIDB4NzAzRiwgMHg3MDNBLCAweDcwMzksIDB4NzAyQSwKLSAgICAweDcwNDAsIDB4NzAzQiwgMHg3MDMzLCAweDcwNDEsIDB4NzIxMywgMHg3MjE0LCAweDcyQTgsIDB4NzM3RCwKLSAgICAweDczN0MsIDB4NzRCQSwgMHg3NkFCLCAweDc2QUEsIDB4NzZCRSwgMHg3NkVELCAweDc3Q0MsIDB4NzdDRSwKLSAgICAweDc3Q0YsIDB4NzdDRCwgMHg3N0YyLCAweDc5MjUsIDB4NzkyMywgMHg3OTI3LCAweDc5MjgsIDB4NzkyNCwKLSAgICAweDc5MjksIDB4NzlCMiwgMHg3QTZFLCAweDdBNkMsIDB4N0E2RCwgMHg3QUY3LCAweDdDNDksIDB4N0M0OCwKLSAgICAweDdDNEEsIDB4N0M0NywgMHg3QzQ1LCAweDdDRUUsIDB4N0U3QiwgMHg3RTdFLCAweDdFODEsIDB4N0U4MCwKLSAgICAweDdGQkEsIDB4N0ZGRiwgMHg4MDc5LCAweDgxREIsIDB4ODFEOSwgMHg4MjY4LCAweDgyNjksIDB4ODYyMiwKLSAgICAweDg1RkYsIDB4ODYwMSwgMHg4NUZFLCAweDg2MUIsIDB4ODYwMCwgMHg4NUY2LCAweDg2MDQsIDB4ODYwOSwKLSAgICAweDg2MDUsIDB4ODYwQywgMHg4NUZELCAweDg4MTksIDB4ODgxMCwgMHg4ODExLCAweDg4MTcsIDB4ODgxMywKLSAgICAweDg4MTYsIDB4ODk2MywgMHg4OTY2LCAweDg5QjksIDB4ODlGNywgMHg4QjYwLCAweDhCNkEsIDB4OEI1RCwKLSAgICAweDhCNjgsIDB4OEI2MywgMHg4QjY1LCAweDhCNjcsIDB4OEI2RCwgMHg4REFFLCAweDhFODYsIDB4OEU4OCwKLSAgICAweDhFODQsIDB4OEY1OSwgMHg4RjU2LCAweDhGNTcsIDB4OEY1NSwgMHg4RjU4LCAweDhGNUEsIDB4OTA4RCwKLSAgICAweDkxNDMsIDB4OTE0MSwgMHg5MUI3LCAweDkxQjUsIDB4OTFCMiwgMHg5MUIzLCAweDk0MEIsIDB4OTQxMywKLSAgICAweDkzRkIsIDB4OTQyMCwgMHg5NDBGLCAweDk0MTQsIDB4OTNGRSwgMHg5NDE1LCAweDk0MTAsIDB4OTQyOCwKLSAgICAweDk0MTksIDB4OTQwRCwgMHg5M0Y1LCAweDk0MDAsIDB4OTNGNywgMHg5NDA3LCAweDk0MEUsIDB4OTQxNiwKLSAgICAweDk0MTIsIDB4OTNGQSwgMHg5NDA5LCAweDkzRjgsIDB4OTQzQywgMHg5NDBBLCAweDkzRkYsIDB4OTNGQywKLSAgICAweDk0MEMsIDB4OTNGNiwgMHg5NDExLCAweDk0MDYsIDB4OTVERSwgMHg5NUUwLCAweDk1REYsIDB4OTcyRSwKLSAgICAweDk3MkYsIDB4OTdCOSwgMHg5N0JCLCAweDk3RkQsIDB4OTdGRSwgMHg5ODYwLCAweDk4NjIsIDB4OTg2MywKLSAgICAweDk4NUYsIDB4OThDMSwgMHg5OEMyLCAweDk5NTAsIDB4OTk0RSwgMHg5OTU5LCAweDk5NEMsIDB4OTk0QiwKLSAgICAweDk5NTMsIDB4OUEzMiwgMHg5QTM0LCAweDlBMzEsIDB4OUEyQywgMHg5QTJBLCAweDlBMzYsIDB4OUEyOSwKLSAgICAweDlBMkUsIDB4OUEzOCwgMHg5QTJELCAweDlBQzcsIDB4OUFDQSwgMHg5QUM2LCAweDlCMTAsIDB4OUIxMiwKLSAgICAweDlCMTEsIDB4OUMwQiwgMHg5QzA4LCAweDlCRjcsIDB4OUMwNSwgMHg5QzEyLCAweDlCRjgsIDB4OUM0MCwKLSAgICAweDlDMDcsIDB4OUMwRSwgMHg5QzA2LCAweDlDMTcsIDB4OUMxNCwgMHg5QzA5LCAweDlEOUYsIDB4OUQ5OSwKLSAgICAweDlEQTQsIDB4OUQ5RCwgMHg5RDkyLCAweDlEOTgsIDB4OUQ5MCwgMHg5RDlCLCAweDlEQTAsIDB4OUQ5NCwKLSAgICAweDlEOUMsIDB4OURBQSwgMHg5RDk3LCAweDlEQTEsIDB4OUQ5QSwgMHg5REEyLCAweDlEQTgsIDB4OUQ5RSwKLSAgICAweDlEQTMsIDB4OURCRiwgMHg5REE5LCAweDlEOTYsIDB4OURBNiwgMHg5REE3LCAweDlFOTksIDB4OUU5QiwKLSAgICAweDlFOUEsIDB4OUVFNSwgMHg5RUU0LCAweDlFRTcsIDB4OUVFNiwgMHg5RjMwLCAweDlGMkUsIDB4OUY1QiwKLSAgICAweDlGNjAsIDB4OUY1RSwgMHg5RjVELCAweDlGNTksIDB4OUY5MSwgMHg1MTNBLCAweDUxMzksIDB4NTI5OCwKLSAgICAweDUyOTcsIDB4NTZDMywgMHg1NkJELCAweDU2QkUsIDB4NUI0OCwgMHg1QjQ3LCAweDVEQ0IsIDB4NURDRiwKLSAgICAweDVFRjEsIDB4NjFGRCwgMHg2NTFCLCAweDZCMDIsIDB4NkFGQywgMHg2QjAzLCAweDZBRjgsIDB4NkIwMCwKLSAgICAweDcwNDMsIDB4NzA0NCwgMHg3MDRBLCAweDcwNDgsIDB4NzA0OSwgMHg3MDQ1LCAweDcwNDYsIDB4NzIxRCwKLSAgICAweDcyMUEsIDB4NzIxOSwgMHg3MzdFLCAweDc1MTcsIDB4NzY2QSwgMHg3N0QwLCAweDc5MkQsIDB4NzkzMSwKLSAgICAweDc5MkYsIDB4N0M1NCwgMHg3QzUzLCAweDdDRjIsIDB4N0U4QSwgMHg3RTg3LCAweDdFODgsIDB4N0U4QiwKLSAgICAweDdFODYsIDB4N0U4RCwgMHg3RjRELCAweDdGQkIsIDB4ODAzMCwgMHg4MURELCAweDg2MTgsIDB4ODYyQSwKLSAgICAweDg2MjYsIDB4ODYxRiwgMHg4NjIzLCAweDg2MUMsIDB4ODYxOSwgMHg4NjI3LCAweDg2MkUsIDB4ODYyMSwKLSAgICAweDg2MjAsIDB4ODYyOSwgMHg4NjFFLCAweDg2MjUsIDB4ODgyOSwgMHg4ODFELCAweDg4MUIsIDB4ODgyMCwKLSAgICAweDg4MjQsIDB4ODgxQywgMHg4ODJCLCAweDg4NEEsIDB4ODk2RCwgMHg4OTY5LCAweDg5NkUsIDB4ODk2QiwKLSAgICAweDg5RkEsIDB4OEI3OSwgMHg4Qjc4LCAweDhCNDUsIDB4OEI3QSwgMHg4QjdCLCAweDhEMTAsIDB4OEQxNCwKLSAgICAweDhEQUYsIDB4OEU4RSwgMHg4RThDLCAweDhGNUUsIDB4OEY1QiwgMHg4RjVELCAweDkxNDYsIDB4OTE0NCwKLSAgICAweDkxNDUsIDB4OTFCOSwgMHg5NDNGLCAweDk0M0IsIDB4OTQzNiwgMHg5NDI5LCAweDk0M0QsIDB4OTQzMCwKLSAgICAweDk0MzksIDB4OTQyQSwgMHg5NDM3LCAweDk0MkMsIDB4OTQ0MCwgMHg5NDMxLCAweDk1RTUsIDB4OTVFNCwKLSAgICAweDk1RTMsIDB4OTczNSwgMHg5NzNBLCAweDk3QkYsIDB4OTdFMSwgMHg5ODY0LCAweDk4QzksIDB4OThDNiwKLSAgICAweDk4QzAsIDB4OTk1OCwgMHg5OTU2LCAweDlBMzksIDB4OUEzRCwgMHg5QTQ2LCAweDlBNDQsIDB4OUE0MiwKLSAgICAweDlBNDEsIDB4OUEzQSwgMHg5QTNGLCAweDlBQ0QsIDB4OUIxNSwgMHg5QjE3LCAweDlCMTgsIDB4OUIxNiwKLSAgICAweDlCM0EsIDB4OUI1MiwgMHg5QzJCLCAweDlDMUQsIDB4OUMxQywgMHg5QzJDLCAweDlDMjMsIDB4OUMyOCwKLSAgICAweDlDMjksIDB4OUMyNCwgMHg5QzIxLCAweDlEQjcsIDB4OURCNiwgMHg5REJDLCAweDlEQzEsIDB4OURDNywKLSAgICAweDlEQ0EsIDB4OURDRiwgMHg5REJFLCAweDlEQzUsIDB4OURDMywgMHg5REJCLCAweDlEQjUsIDB4OURDRSwKLSAgICAweDlEQjksIDB4OURCQSwgMHg5REFDLCAweDlEQzgsIDB4OURCMSwgMHg5REFELCAweDlEQ0MsIDB4OURCMywKLSAgICAweDlEQ0QsIDB4OURCMiwgMHg5RTdBLCAweDlFOUMsIDB4OUVFQiwgMHg5RUVFLCAweDlFRUQsIDB4OUYxQiwKLSAgICAweDlGMTgsIDB4OUYxQSwgMHg5RjMxLCAweDlGNEUsIDB4OUY2NSwgMHg5RjY0LCAweDlGOTIsIDB4NEVCOSwKLSAgICAweDU2QzYsIDB4NTZDNSwgMHg1NkNCLCAweDU5NzEsIDB4NUI0QiwgMHg1QjRDLCAweDVERDUsIDB4NUREMSwKLSAgICAweDVFRjIsIDB4NjUyMSwgMHg2NTIwLCAweDY1MjYsIDB4NjUyMiwgMHg2QjBCLCAweDZCMDgsIDB4NkIwOSwKLSAgICAweDZDMEQsIDB4NzA1NSwgMHg3MDU2LCAweDcwNTcsIDB4NzA1MiwgMHg3MjFFLCAweDcyMUYsIDB4NzJBOSwKLSAgICAweDczN0YsIDB4NzREOCwgMHg3NEQ1LCAweDc0RDksIDB4NzRENywgMHg3NjZELCAweDc2QUQsIDB4NzkzNSwKLSAgICAweDc5QjQsIDB4N0E3MCwgMHg3QTcxLCAweDdDNTcsIDB4N0M1QywgMHg3QzU5LCAweDdDNUIsIDB4N0M1QSwKLSAgICAweDdDRjQsIDB4N0NGMSwgMHg3RTkxLCAweDdGNEYsIDB4N0Y4NywgMHg4MURFLCAweDgyNkIsIDB4ODYzNCwKLSAgICAweDg2MzUsIDB4ODYzMywgMHg4NjJDLCAweDg2MzIsIDB4ODYzNiwgMHg4ODJDLCAweDg4MjgsIDB4ODgyNiwKLSAgICAweDg4MkEsIDB4ODgyNSwgMHg4OTcxLCAweDg5QkYsIDB4ODlCRSwgMHg4OUZCLCAweDhCN0UsIDB4OEI4NCwKLSAgICAweDhCODIsIDB4OEI4NiwgMHg4Qjg1LCAweDhCN0YsIDB4OEQxNSwgMHg4RTk1LCAweDhFOTQsIDB4OEU5QSwKLSAgICAweDhFOTIsIDB4OEU5MCwgMHg4RTk2LCAweDhFOTcsIDB4OEY2MCwgMHg4RjYyLCAweDkxNDcsIDB4OTQ0QywKLSAgICAweDk0NTAsIDB4OTQ0QSwgMHg5NDRCLCAweDk0NEYsIDB4OTQ0NywgMHg5NDQ1LCAweDk0NDgsIDB4OTQ0OSwKLSAgICAweDk0NDYsIDB4OTczRiwgMHg5N0UzLCAweDk4NkEsIDB4OTg2OSwgMHg5OENCLCAweDk5NTQsIDB4OTk1QiwKLSAgICAweDlBNEUsIDB4OUE1MywgMHg5QTU0LCAweDlBNEMsIDB4OUE0RiwgMHg5QTQ4LCAweDlBNEEsIDB4OUE0OSwKLSAgICAweDlBNTIsIDB4OUE1MCwgMHg5QUQwLCAweDlCMTksIDB4OUIyQiwgMHg5QjNCLCAweDlCNTYsIDB4OUI1NSwKLSAgICAweDlDNDYsIDB4OUM0OCwgMHg5QzNGLCAweDlDNDQsIDB4OUMzOSwgMHg5QzMzLCAweDlDNDEsIDB4OUMzQywKLSAgICAweDlDMzcsIDB4OUMzNCwgMHg5QzMyLCAweDlDM0QsIDB4OUMzNiwgMHg5RERCLCAweDlERDIsIDB4OURERSwKLSAgICAweDlEREEsIDB4OURDQiwgMHg5REQwLCAweDlEREMsIDB4OUREMSwgMHg5RERGLCAweDlERTksIDB4OUREOSwKLSAgICAweDlERDgsIDB4OURENiwgMHg5REY1LCAweDlERDUsIDB4OURERCwgMHg5RUI2LCAweDlFRjAsIDB4OUYzNSwKLSAgICAweDlGMzMsIDB4OUYzMiwgMHg5RjQyLCAweDlGNkIsIDB4OUY5NSwgMHg5RkEyLCAweDUxM0QsIDB4NTI5OSwKLSAgICAweDU4RTgsIDB4NThFNywgMHg1OTcyLCAweDVCNEQsIDB4NUREOCwgMHg4ODJGLCAweDVGNEYsIDB4NjIwMSwKLSAgICAweDYyMDMsIDB4NjIwNCwgMHg2NTI5LCAweDY1MjUsIDB4NjU5NiwgMHg2NkVCLCAweDZCMTEsIDB4NkIxMiwKLSAgICAweDZCMEYsIDB4NkJDQSwgMHg3MDVCLCAweDcwNUEsIDB4NzIyMiwgMHg3MzgyLCAweDczODEsIDB4NzM4MywKLSAgICAweDc2NzAsIDB4NzdENCwgMHg3QzY3LCAweDdDNjYsIDB4N0U5NSwgMHg4MjZDLCAweDg2M0EsIDB4ODY0MCwKLSAgICAweDg2MzksIDB4ODYzQywgMHg4NjMxLCAweDg2M0IsIDB4ODYzRSwgMHg4ODMwLCAweDg4MzIsIDB4ODgyRSwKLSAgICAweDg4MzMsIDB4ODk3NiwgMHg4OTc0LCAweDg5NzMsIDB4ODlGRSwgMHg4QjhDLCAweDhCOEUsIDB4OEI4QiwKLSAgICAweDhCODgsIDB4OEM0NSwgMHg4RDE5LCAweDhFOTgsIDB4OEY2NCwgMHg4RjYzLCAweDkxQkMsIDB4OTQ2MiwKLSAgICAweDk0NTUsIDB4OTQ1RCwgMHg5NDU3LCAweDk0NUUsIDB4OTdDNCwgMHg5N0M1LCAweDk4MDAsIDB4OUE1NiwKLSAgICAweDlBNTksIDB4OUIxRSwgMHg5QjFGLCAweDlCMjAsIDB4OUM1MiwgMHg5QzU4LCAweDlDNTAsIDB4OUM0QSwKLSAgICAweDlDNEQsIDB4OUM0QiwgMHg5QzU1LCAweDlDNTksIDB4OUM0QywgMHg5QzRFLCAweDlERkIsIDB4OURGNywKLSAgICAweDlERUYsIDB4OURFMywgMHg5REVCLCAweDlERjgsIDB4OURFNCwgMHg5REY2LCAweDlERTEsIDB4OURFRSwKLSAgICAweDlERTYsIDB4OURGMiwgMHg5REYwLCAweDlERTIsIDB4OURFQywgMHg5REY0LCAweDlERjMsIDB4OURFOCwKLSAgICAweDlERUQsIDB4OUVDMiwgMHg5RUQwLCAweDlFRjIsIDB4OUVGMywgMHg5RjA2LCAweDlGMUMsIDB4OUYzOCwKLSAgICAweDlGMzcsIDB4OUYzNiwgMHg5RjQzLCAweDlGNEYsIDB4OUY3MSwgMHg5RjcwLCAweDlGNkUsIDB4OUY2RiwKLSAgICAweDU2RDMsIDB4NTZDRCwgMHg1QjRFLCAweDVDNkQsIDB4NjUyRCwgMHg2NkVELCAweDY2RUUsIDB4NkIxMywKLSAgICAweDcwNUYsIDB4NzA2MSwgMHg3MDVELCAweDcwNjAsIDB4NzIyMywgMHg3NERCLCAweDc0RTUsIDB4NzdENSwKLSAgICAweDc5MzgsIDB4NzlCNywgMHg3OUI2LCAweDdDNkEsIDB4N0U5NywgMHg3Rjg5LCAweDgyNkQsIDB4ODY0MywKLSAgICAweDg4MzgsIDB4ODgzNywgMHg4ODM1LCAweDg4NEIsIDB4OEI5NCwgMHg4Qjk1LCAweDhFOUUsIDB4OEU5RiwKLSAgICAweDhFQTAsIDB4OEU5RCwgMHg5MUJFLCAweDkxQkQsIDB4OTFDMiwgMHg5NDZCLCAweDk0NjgsIDB4OTQ2OSwKLSAgICAweDk2RTUsIDB4OTc0NiwgMHg5NzQzLCAweDk3NDcsIDB4OTdDNywgMHg5N0U1LCAweDlBNUUsIDB4OUFENSwKLSAgICAweDlCNTksIDB4OUM2MywgMHg5QzY3LCAweDlDNjYsIDB4OUM2MiwgMHg5QzVFLCAweDlDNjAsIDB4OUUwMiwKLSAgICAweDlERkUsIDB4OUUwNywgMHg5RTAzLCAweDlFMDYsIDB4OUUwNSwgMHg5RTAwLCAweDlFMDEsIDB4OUUwOSwKLSAgICAweDlERkYsIDB4OURGRCwgMHg5RTA0LCAweDlFQTAsIDB4OUYxRSwgMHg5RjQ2LCAweDlGNzQsIDB4OUY3NSwKLSAgICAweDlGNzYsIDB4NTZENCwgMHg2NTJFLCAweDY1QjgsIDB4NkIxOCwgMHg2QjE5LCAweDZCMTcsIDB4NkIxQSwKLSAgICAweDcwNjIsIDB4NzIyNiwgMHg3MkFBLCAweDc3RDgsIDB4NzdEOSwgMHg3OTM5LCAweDdDNjksIDB4N0M2QiwKLSAgICAweDdDRjYsIDB4N0U5QSwgMHg3RTk4LCAweDdFOUIsIDB4N0U5OSwgMHg4MUUwLCAweDgxRTEsIDB4ODY0NiwKLSAgICAweDg2NDcsIDB4ODY0OCwgMHg4OTc5LCAweDg5N0EsIDB4ODk3QywgMHg4OTdCLCAweDg5RkYsIDB4OEI5OCwKLSAgICAweDhCOTksIDB4OEVBNSwgMHg4RUE0LCAweDhFQTMsIDB4OTQ2RSwgMHg5NDZELCAweDk0NkYsIDB4OTQ3MSwKLSAgICAweDk0NzMsIDB4OTc0OSwgMHg5ODcyLCAweDk5NUYsIDB4OUM2OCwgMHg5QzZFLCAweDlDNkQsIDB4OUUwQiwKLSAgICAweDlFMEQsIDB4OUUxMCwgMHg5RTBGLCAweDlFMTIsIDB4OUUxMSwgMHg5RUExLCAweDlFRjUsIDB4OUYwOSwKLSAgICAweDlGNDcsIDB4OUY3OCwgMHg5RjdCLCAweDlGN0EsIDB4OUY3OSwgMHg1NzFFLCAweDcwNjYsIDB4N0M2RiwKLSAgICAweDg4M0MsIDB4OERCMiwgMHg4RUE2LCAweDkxQzMsIDB4OTQ3NCwgMHg5NDc4LCAweDk0NzYsIDB4OTQ3NSwKLSAgICAweDlBNjAsIDB4OUIyRSwgMHg5Qzc0LCAweDlDNzMsIDB4OUM3MSwgMHg5Qzc1LCAweDlFMTQsIDB4OUUxMywKLSAgICAweDlFRjYsIDB4OUYwQSwgMHg5RkE0LCAweDcwNjgsIDB4NzA2NSwgMHg3Q0Y3LCAweDg2NkEsIDB4ODgzRSwKLSAgICAweDg4M0QsIDB4ODgzRiwgMHg4QjlFLCAweDhDOUMsIDB4OEVBOSwgMHg4RUM5LCAweDk3NEIsIDB4OTg3MywKLSAgICAweDk4NzQsIDB4OThDQywgMHg5OTYxLCAweDk5QUIsIDB4OUE2NCwgMHg5QTY2LCAweDlBNjcsIDB4OUIyNCwKLSAgICAweDlFMTUsIDB4OUUxNywgMHg5RjQ4LCAweDYyMDcsIDB4NkIxRSwgMHg3MjI3LCAweDg2NEMsIDB4OEVBOCwKLSAgICAweDk0ODIsIDB4OTQ4MCwgMHg5NDgxLCAweDlBNjksIDB4OUE2OCwgMHg5RTE5LCAweDg2NEIsIDB4OEI5RiwKLSAgICAweDk0ODMsIDB4OUM3OSwgMHg5RUI3LCAweDc2NzUsIDB4OUE2QiwgMHg5QzdBLCAweDlFMUQsIDB4NzA2OSwKLSAgICAweDcwNkEsIDB4NzIyOSwgMHg5RUE0LCAweDlGN0UsIDB4OUY0OSwgMHg5Rjk4LCAweEZFMTksIDB4MjIzQywKLSAgICAweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKLSAgICAweDAwMjgsIDB4MDAyOSwgMHgwMDJBLCAweDAwMkIsIDB4MDAyQywgMHgwMDJELCAweDAwMkUsIDB4MDAyRiwKLSAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKLSAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDNBLCAweDAwM0IsIDB4MDAzQywgMHgwMDNELCAweDAwM0UsIDB4MDAzRiwKLSAgICAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKLSAgICAweDAwNDgsIDB4MDA0OSwgMHgwMDRBLCAweDAwNEIsIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwKLSAgICAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKLSAgICAweDAwNTgsIDB4MDA1OSwgMHgwMDVBLCAweDAwNUIsIDB4MDA1QywgMHgwMDVELCAweDAwNUUsIDB4MDA1RiwKLSAgICAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKLSAgICAweDAwNjgsIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywgMHgwMDZELCAweDAwNkUsIDB4MDA2RiwKLSAgICAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKLSAgICAweDAwNzgsIDB4MDA3OSwgMHgwMDdBLCAweDAwN0IsIDB4MDA3QywgMHgwMDdELCAweDAwN0UsIDB4RkUzMywKLSAgICAweDI1NzQsIDB4RkUzNCwgMHhGRTRGLCAweDAzMDgsIDB4RkYzRSwgMHgzMEZELCAweDMwRkUsIDB4MzA5RCwKLSAgICAweDMwOUUsIDB4RkZGRCwgMHgzMDA1LCAweDMwMDYsIDB4MzAwNywgMHgzMEZDLCAweEZGM0IsIDB4RkYzRCwKLSAgICAweDI3M0QsIDB4MzA0MSwgMHgzMDQyLCAweDMwNDMsIDB4MzA0NCwgMHgzMDQ1LCAweDMwNDYsIDB4MzA0NywKLSAgICAweDMwNDgsIDB4MzA0OSwgMHgzMDRBLCAweDMwNEIsIDB4MzA0QywgMHgzMDRELCAweDMwNEUsIDB4MzA0RiwKLSAgICAweDMwNTAsIDB4MzA1MSwgMHgzMDUyLCAweDMwNTMsIDB4MzA1NCwgMHgzMDU1LCAweDMwNTYsIDB4MzA1NywKLSAgICAweDMwNTgsIDB4MzA1OSwgMHgzMDVBLCAweDMwNUIsIDB4MzA1QywgMHgzMDVELCAweDMwNUUsIDB4MzA1RiwKLSAgICAweDMwNjAsIDB4MzA2MSwgMHgzMDYyLCAweDMwNjMsIDB4MzA2NCwgMHgzMDY1LCAweDMwNjYsIDB4MzA2NywKLSAgICAweDMwNjgsIDB4MzA2OSwgMHgzMDZBLCAweDMwNkIsIDB4MzA2QywgMHgzMDZELCAweDMwNkUsIDB4MzA2RiwKLSAgICAweDMwNzAsIDB4MzA3MSwgMHgzMDcyLCAweDMwNzMsIDB4MzA3NCwgMHgzMDc1LCAweDMwNzYsIDB4MzA3NywKLSAgICAweDMwNzgsIDB4MzA3OSwgMHgzMDdBLCAweDMwN0IsIDB4MzA3QywgMHgzMDdELCAweDMwN0UsIDB4MzA3RiwKLSAgICAweDMwODAsIDB4MzA4MSwgMHgzMDgyLCAweDMwODMsIDB4MzA4NCwgMHgzMDg1LCAweDMwODYsIDB4MzA4NywKLSAgICAweDMwODgsIDB4MzA4OSwgMHgzMDhBLCAweDMwOEIsIDB4MzA4QywgMHgzMDhELCAweDMwOEUsIDB4MzA4RiwKLSAgICAweDMwOTAsIDB4MzA5MSwgMHgzMDkyLCAweDMwOTMsIDB4MzBBMSwgMHgzMEEyLCAweDMwQTMsIDB4MzBBNCwKLSAgICAweDMwQTUsIDB4MzBBNiwgMHgzMEE3LCAweDMwQTgsIDB4MzBBOSwgMHgzMEFBLCAweDMwQUIsIDB4MzBBQywKLSAgICAweDMwQUQsIDB4MzBBRSwgMHgzMEFGLCAweDMwQjAsIDB4MzBCMSwgMHgzMEIyLCAweDMwQjMsIDB4MzBCNCwKLSAgICAweDMwQjUsIDB4MzBCNiwgMHgzMEI3LCAweDMwQjgsIDB4MzBCOSwgMHgzMEJBLCAweDMwQkIsIDB4MzBCQywKLSAgICAweDMwQkQsIDB4MzBCRSwgMHgzMEJGLCAweDMwQzAsIDB4MzBDMSwgMHgzMEMyLCAweDMwQzMsIDB4MzBDNCwKLSAgICAweDMwQzUsIDB4MzBDNiwgMHgzMEM3LCAweDMwQzgsIDB4MzBDOSwgMHgzMENBLCAweDMwQ0IsIDB4MzBDQywKLSAgICAweDMwQ0QsIDB4MzBDRSwgMHgzMENGLCAweDMwRDAsIDB4MzBEMSwgMHgzMEQyLCAweDMwRDMsIDB4MzBENCwKLSAgICAweDMwRDUsIDB4MzBENiwgMHgzMEQ3LCAweDMwRDgsIDB4MzBEOSwgMHgzMERBLCAweDMwREIsIDB4MzBEQywKLSAgICAweDMwREQsIDB4MzBERSwgMHgzMERGLCAweDMwRTAsIDB4MzBFMSwgMHgzMEUyLCAweDMwRTMsIDB4MzBFNCwKLSAgICAweDMwRTUsIDB4MzBFNiwgMHgzMEU3LCAweDMwRTgsIDB4MzBFOSwgMHgzMEVBLCAweDMwRUIsIDB4MzBFQywKLSAgICAweDMwRUQsIDB4MzBFRSwgMHgzMEVGLCAweDMwRjAsIDB4MzBGMSwgMHgzMEYyLCAweDMwRjMsIDB4MzBGNCwKLSAgICAweDMwRjUsIDB4MzBGNiwgMHgwNDEwLCAweDA0MTEsIDB4MDQxMiwgMHgwNDEzLCAweDA0MTQsIDB4MDQxNSwKLSAgICAweDA0MDEsIDB4MDQxNiwgMHgwNDE3LCAweDA0MTgsIDB4MDQxOSwgMHgwNDFBLCAweDA0MUIsIDB4MDQxQywKLSAgICAweDA0MUQsIDB4MDQxRSwgMHgwNDFGLCAweDA0MjAsIDB4MDQyMSwgMHgwNDIyLCAweDA0MjMsIDB4MDQyNCwKLSAgICAweDA0MjUsIDB4MDQyNiwgMHgwNDI3LCAweDA0MjgsIDB4MDQyOSwgMHgwNDJBLCAweDA0MkIsIDB4MDQyQywKLSAgICAweDA0MkQsIDB4MDQyRSwgMHgwNDJGLCAweDA0MzAsIDB4MDQzMSwgMHgwNDMyLCAweDA0MzMsIDB4MDQzNCwKLSAgICAweDA0MzUsIDB4MDQ1MSwgMHgwNDM2LCAweDA0MzcsIDB4MDQzOCwgMHgwNDM5LCAweDA0M0EsIDB4MDQzQiwKLSAgICAweDA0M0MsIDB4MDQzRCwgMHgwNDNFLCAweDA0M0YsIDB4MDQ0MCwgMHgwNDQxLCAweDA0NDIsIDB4MDQ0MywKLSAgICAweDA0NDQsIDB4MDQ0NSwgMHgwNDQ2LCAweDA0NDcsIDB4MDQ0OCwgMHgwNDQ5LCAweDA0NEEsIDB4MDQ0QiwKLSAgICAweDA0NEMsIDB4MDQ0RCwgMHgwNDRFLCAweDA0NEYsIDB4MjFFNywgMHgyMUI4LCAweDIxQjksIDB4NEU0MSwKLSAgICAweDAwMDAsIDB4NEU1QSwgMHgwMDAwLCAweDUyMDIsIDB4NDQ5MSwgMHg5RkIwLCAweDUxODgsIDB4OUZCMSwKLSAgICAweDAwMDAsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwKLSAgICAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwKLSAgICAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwKLSAgICAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwKLSAgICAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwKLSAgICAweEZGRkQsIDB4MDBBQywgMHhGRkU0LCAweEZGMDcsIDB4RkYwMiwgMHgzMjMxLCAweDIxMTYsIDB4MjEyMSwKLSAgICAweDc4ODEsIDB4OTJCOSwgMHg4OENGLCAweDU4QkIsIDB4NjA1MiwgMHg3Q0E3LCAweDVBRkEsIDB4MjU1NCwKLSAgICAweDI1NjYsIDB4MjU1NywgMHgyNTYwLCAweDI1NkMsIDB4MjU2MywgMHgyNTVBLCAweDI1NjksIDB4MjU1RCwKLSAgICAweDI1NTIsIDB4MjU2NCwgMHgyNTU1LCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweDI1NTgsIDB4MjU2NywKLSAgICAweDI1NUIsIDB4MjU1MywgMHgyNTY1LCAweDI1NTYsIDB4MjU1RiwgMHgyNTZCLCAweDI1NjIsIDB4MjU1OSwKLSAgICAweDI1NjgsIDB4MjU1QywgMHgyNTUxLCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwKLSAgICAweDI1OTMsIDB4RkZGRCwgMHhGRkZELCAweEZFMTAsIDB4RkUxMSwgMHhGRTEyLCAweEZGRkQsIDB4RkUxNCwKLSAgICAweEZFMTMsIDB4RkUxNiwgMHhGRTE1LCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwKLSAgICAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwKLSAgICAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweDAwMDAsIDB4NTdCRSwgMHgwMDAwLCAweDcxM0UsIDB4MDAwMCwKLSAgICAweDY5QTIsIDB4MDAwMCwgMHg1Qjc0LCAweDdBNDksIDB4MDAwMCwgMHgwMDAwLCAweDdBNjUsIDB4N0E3RCwKLSAgICAweDAwMDAsIDB4N0FCQiwgMHg3QUIwLCAweDdBQzIsIDB4N0FDMywgMHg3MUQxLCAweDAwMDAsIDB4NDFDQSwKLSAgICAweDdBREEsIDB4N0FERCwgMHg3QUVBLCAweDQxRUYsIDB4NTRCMiwgMHgwMDAwLCAweDdCMEIsIDB4N0I1NSwKLSAgICAweDdCMjksIDB4MDAwMCwgMHgwMDAwLCAweDdCQTIsIDB4N0I2RiwgMHg4MzlDLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDdCRDAsIDB4ODQyMSwgMHg3QjkyLCAweEZGRkQsIDB4MDAwMCwgMHhGRkZELCAweDg0OTIsIDB4N0JGQSwKLSAgICAweEZGRkQsIDB4N0MzNSwgMHgwMDAwLCAweDdDNDQsIDB4N0M4MywgMHgwMDAwLCAweDdDQTYsIDB4MDAwMCwKLSAgICAweDdDQzksIDB4N0NDNywgMHg3Q0U2LCAweEZGRkQsIDB4N0NGMywgMHg3Q0Y1LCAweDdFNjcsIDB4NDUxRCwKLSAgICAweDAwMDAsIDB4N0Q1RCwgMHgwMDAwLCAweDdEODksIDB4N0RBQiwgMHg3MTM1LCAweDdEQjMsIDB4N0RENiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg3REU0LCAweDNEMTMsIDB4N0RGNSwgMHgwMDAwLCAweDdERTUsIDB4MDAwMCwKLSAgICAweEZGRkQsIDB4MDAwMCwgMHgwMDAwLCAweDdFNkUsIDB4RkZGRCwgMHg0MzJCLCAweDk0NkMsIDB4N0UyNywKLSAgICAweDdGNDAsIDB4N0Y0MSwgMHg3RjQ3LCAweDc5MzYsIDB4MDAwMCwgMHg5OUUxLCAweDdGOTcsIDB4MDAwMCwKLSAgICAweDdGQTMsIDB4MDAwMCwgMHgwMDAwLCAweDQ1NUMsIDB4MDAwMCwgMHgwMDAwLCAweDdGRkEsIDB4MDAwMCwKLSAgICAweEZBNUIsIDB4ODAwOCwgMHg4MDFELCAweEZGRkQsIDB4ODAyRiwgMHgwMDAwLCAweDAwMDAsIDB4ODAzQiwKLSAgICAweDgwM0MsIDB4ODA2MSwgMHgwMDAwLCAweDQ5ODksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NjcyNSwKLSAgICAweDgwQTcsIDB4MDAwMCwgMHg4MTA3LCAweDgxMUEsIDB4NThCMCwgMHgwMDAwLCAweDZDN0YsIDB4MDAwMCwKLSAgICAweDY0RTcsIDB4MDAwMCwgMHg4MjE4LCAweDAwMDAsIDB4NkE1MywgMHgwMDAwLCAweDAwMDAsIDB4NDQ3QSwKLSAgICAweDgyMjksIDB4MDAwMCwgMHgwMDAwLCAweDRGRjksIDB4MDAwMCwgMHg4NEUyLCAweDgzNjIsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODJBQSwgMHg2OTFCLCAweDAwMDAsIDB4NDFEQiwKLSAgICAweDg1NEIsIDB4ODJEMCwgMHg4MzFBLCAweDAwMDAsIDB4MDAwMCwgMHgzNkMxLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDgyN0IsIDB4ODJFMiwgMHg4MzE4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDNEQkYsIDB4ODMxRCwgMHg1NUVDLCAweDgzODUsIDB4NDUwQiwgMHgwMDAwLCAweDgzQUMsIDB4RkZGRCwKLSAgICAweDgzRDMsIDB4MDAwMCwgMHg2QTU3LCAweDg1NUEsIDB4MzQ5NiwgMHgwMDAwLCAweDg0NTgsIDB4MDAwMCwKLSAgICAweDg0NzEsIDB4M0REMywgMHg0NEU0LCAweDZBQTcsIDB4ODQ0QSwgMHg3OTU4LCAweEZGRkQsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4NERFLCAweEZGRkQsIDB4ODM5MSwgMHg0NEEwLCAweDg0OTMsIDB4ODRFNCwKLSAgICAweDAwMDAsIDB4NDI0MCwgMHgwMDAwLCAweDQ1NDMsIDB4ODUzNCwgMHg1QUYyLCAweDQ1MjMsIDB4NDUyNywKLSAgICAweDg1NzMsIDB4NDUxNiwgMHg2N0JGLCAweDg2MTYsIDB4MDAwMCwgMHgwMDAwLCAweDg1QzEsIDB4MDAwMCwKLSAgICAweDg2MDIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NDU2QSwgMHg4NjI4LCAweDM2NDgsIDB4MDAwMCwKLSAgICAweDUzRjcsIDB4MDAwMCwgMHg4NjdFLCAweEZGRkQsIDB4MDAwMCwgMHg4N0VFLCAweDAwMDAsIDB4ODdCMSwKLSAgICAweDg3REEsIDB4ODgwRiwgMHg1NjYxLCAweDg2NkMsIDB4Njg1NiwgMHg0NjBGLCAweDg4NDUsIDB4ODg0NiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NUUsIDB4ODg5QywgMHg0NjVCLCAweDg4QjQsIDB4ODhCNSwKLSAgICAweDg4QzUsIDB4MDAwMCwgMHg4OTg3LCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweDg5QTcsIDB4ODlCQywKLSAgICAweDAwMDAsIDB4ODlFNywgMHgwMDAwLCAweDAwMDAsIDB4OEE5QywgMHg3NzkzLCAweDkxRkUsIDB4OEE5MCwKLSAgICAweDAwMDAsIDB4N0FFOSwgMHgwMDAwLCAweDQ3MTMsIDB4MDAwMCwgMHg3MTdDLCAweDhCMEMsIDB4OEIxRiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4QjNGLCAweEZGRkQsIDB4OEI0RCwgMHg4QUE5LCAweDAwMDAsIDB4OEI5MCwKLSAgICAweDhCOUIsIDB4OEFBRiwgMHgwMDAwLCAweDQ2MTUsIDB4ODg0RiwgMHg4QzlCLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MzcyNSwgMHgwMDAwLCAweDhDRDYsIDB4MDAwMCwgMHgwMDAwLCAweDhEMTIsIDB4OEQwMywKLSAgICAweDAwMDAsIDB4OENEQiwgMHg3MDVDLCAweDhEMTEsIDB4M0VEMCwgMHgwMDAwLCAweDhEQTksIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgzQjdDLCAweDAwMDAsIDB4MDAwMCwgMHg3QUU3LCAweDhFQUQsIDB4OEVCNiwKLSAgICAweDhFQzMsIDB4OTJENCwgMHg4RjE5LCAweDhGMkQsIDB4MDAwMCwgMHgwMDAwLCAweDhGQTUsIDB4OTMwMywKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4RkIzLCAweEZGRkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NUVGOCwKLSAgICAweDAwMDAsIDB4OEZGOSwgMHhGRkZELCAweDAwMDAsIDB4Mzk4MCwgMHgwMDAwLCAweDkwMzcsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OTA2MSwgMHgwMDAwLCAweDAwMDAsIDB4OTBBOCwgMHgwMDAwLCAweDkwQzQsIDB4MDAwMCwKLSAgICAweDkwQUUsIDB4RkEyNiwgMHg5MTY3LCAweDkxQTksIDB4OTFDNCwgMHg3Q0FDLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDkyMEUsIDB4NkM5RiwgMHg5MjQxLCAweDkyNjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg5MzJDLCAweDkzNkIsIDB4MDAwMCwgMHgwMDAwLCAweDVBQzMsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4NDk2NSwgMHg5MjQ0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkzNzMsIDB4OTQ1QiwKLSAgICAweDhFQkMsIDB4OTU4NSwgMHg5NUE2LCAweDk0MjYsIDB4OTVBMCwgMHg2RkY2LCAweDQyQjksIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg0OURGLCAweDZDMUMsIDB4OTY3QiwgMHg5Njk2LCAweDQxNkMsIDB4OTZBMywKLSAgICAweDAwMDAsIDB4NjFEQSwgMHhFNEFELCAweDc4RjUsIDB4MDAwMCwgMHg5NkJELCAweDUzQ0MsIDB4NDlBMSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDk3MzEsIDB4ODY0MiwgMHg5NzM2LCAweDRBMEYsIDB4NDUzRCwgMHg0NTg1LCAweDAwMDAsIDB4NzA3NSwKLSAgICAweDVCNDEsIDB4OTcxQiwgMHhGRkZELCAweDAwMDAsIDB4OTc1NywgMHg1QjRBLCAweDAwMDAsIDB4OTc1RiwKLSAgICAweDk0MjUsIDB4NTBEMCwgMHgwMDAwLCAweDAwMDAsIDB4OTc4OSwgMHg5NzlGLCAweDk3QjEsIDB4OTdCRSwKLSAgICAweDk3QzAsIDB4OTdEMiwgMHg5N0UwLCAweDAwMDAsIDB4OTdFRSwgMHg3NDFDLCAweDAwMDAsIDB4RkZGRCwKLSAgICAweDk3RjUsIDB4MDAwMCwgMHgwMDAwLCAweDRBRDEsIDB4OTgzNCwgMHg5ODMzLCAweDk4NEIsIDB4OTg2NiwKLSAgICAweDNCMEUsIDB4MDAwMCwgMHgzRDUxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDk4Q0EsIDB4OThCNywKLSAgICAweDk4QzgsIDB4OThDNywgMHg0QUZGLCAweDAwMDAsIDB4MDAwMCwgMHg1NUIwLCAweDk4RTEsIDB4OThFNiwKLSAgICAweDk4RUMsIDB4OTM3OCwgMHg5OTM5LCAweDAwMDAsIDB4NEI3MiwgMHgwMDAwLCAweDAwMDAsIDB4OTlGNSwKLSAgICAweDlBMEMsIDB4OUEzQiwgMHg5QTEwLCAweDlBNTgsIDB4MDAwMCwgMHgzNkM0LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDlBRTAsIDB4OUFFMiwgMHgwMDAwLCAweDlBRjQsIDB4NEMwRSwgMHg5QjE0LCAweDlCMkQsIDB4MDAwMCwKLSAgICAweDUwMzQsIDB4OUIzNCwgMHgzOEMzLCAweDAwMDAsIDB4OUI1MCwgMHg5QjQwLCAweDAwMDAsIDB4NUE0NSwKLSAgICAweDAwMDAsIDB4OUI4RSwgMHg5QzAyLCAweDlCRkYsIDB4OUMwQywgMHgwMDAwLCAweDlERDQsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5RDdFLCAweDlEODMsIDB4MDAwMCwKLSAgICAweDlFMEUsIDB4OURDNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDlEMzksIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OUU5MCwgMHg5RTk1LCAweDlFOUUsIDB4OUVBMiwgMHg0RDM0LCAweDlFQUEsIDB4OUVBRiwKLSAgICAweDAwMDAsIDB4OUVDMSwgMHgzQjYwLCAweDM5RTUsIDB4M0QxRCwgMHg0RjMyLCAweDM3QkUsIDB4MDAwMCwKLSAgICAweDlGMDIsIDB4OUYwOCwgMHg0Qjk2LCAweDk0MjQsIDB4MDAwMCwgMHg5RjE3LCAweDAwMDAsIDB4OUYzOSwKLSAgICAweDU2OUYsIDB4NTY4QSwgMHg5RjQ1LCAweDk5QjgsIDB4MDAwMCwgMHg5N0YyLCAweDg0N0YsIDB4RkZGRCwKLSAgICAweDlGNjksIDB4N0FEQywgMHg5RjhFLCAweDcyMTYsIDB4NEJCRSwgMHgwMDAwLCAweDAwMDAsIDB4NzE3NywKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDczOUUsIDB4MDAwMCwgMHgwMDAwLCAweDc5OUYsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OTM2OSwgMHg5M0YzLCAweDAwMDAsIDB4OTJFQywgMHg5MzgxLCAweDkzQ0IsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4NzIxNywgMHgzRUVCLCAweDc3NzIsIDB4N0E0MywgMHg3MEQwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDcxN0UsIDB4MDAwMCwgMHg3MEEzLCAweDAwMDAsIDB4MDAwMCwgMHgzRUM3LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MzcyMiwgMHgwMDAwLCAweDAwMDAsIDB4MzZFMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDM3MjMsIDB4MDAwMCwgMHg1NzVCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDg1MDMsIDB4MDAwMCwgMHhGRkZELCAweDg0NTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg0NEY0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDY3RjksIDB4MzczMywKLSAgICAweDNDMTUsIDB4M0RFNywgMHg1ODZDLCAweDAwMDAsIDB4NjgxMCwgMHg0MDU3LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDU0Q0IsIDB4NTY5RSwgMHgwMDAwLCAweDU2OTIsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHhGRkZELCAweDAwMDAsIDB4OTM5QywgMHg0RUY4LCAweDUxMkIsIDB4MzgxOSwKLSAgICAweDAwMDAsIDB4NEVCQywgMHgwMDAwLCAweEZGRkQsIDB4NEY0QiwgMHg0RjhBLCAweDAwMDAsIDB4NUE2OCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgzOTk5LCAweDAwMDAsIDB4MDAwMCwgMHgzNDM1LCAweDRGMjksIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4QURBLCAweDAwMDAsIDB4NEU5OCwgMHg1MENELCAweDUxMEQsIDB4NEZBMiwKLSAgICAweDRGMDMsIDB4MDAwMCwgMHgwMDAwLCAweDRGNDIsIDB4NTAyRSwgMHg1MDZDLCAweDUwODEsIDB4NEZDQywKLSAgICAweDRGRTUsIDB4NTA1OCwgMHg1MEZDLCAweDZFNzYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NkQ3MiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg1MUE4LCAweDUxQzMsIDB4MDAwMCwgMHg0NERELCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEQ3QSwgMHgwMDAwLCAweDAwMDAsIDB4NTI1OSwgMHg1MkE0LCAweDAwMDAsIDB4NTJFMSwKLSAgICAweEZGRkQsIDB4NDY3QSwgMHg3MThDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NjlEMSwKLSAgICAweDAwMDAsIDB4RkZGRCwgMHgzRURFLCAweDc0OTksIDB4NzQxNCwgMHg3NDU2LCAweDczOTgsIDB4NEI4RSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg1M0QwLCAweDM1ODQsIDB4NzIwRiwgMHgwMDAwLCAweDU1QjQsIDB4MDAwMCwKLSAgICAweDU0Q0QsIDB4MDAwMCwgMHg1NzFELCAweDkyNUQsIDB4OTZGNCwgMHg1N0RELCAweDU3OEQsIDB4NTc3RiwKLSAgICAweDM2M0UsIDB4NThDQiwgMHg1QTk5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NUEyQywKLSAgICAweDU5QjgsIDB4NUE3RSwgMHg1QUNGLCAweDVBMTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDM2RjUsIDB4NkQwNSwgMHg3NDQzLCAweDVBMjEsIDB4MDAwMCwgMHg1QTgxLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDkzRTAsIDB4NzQ4QywgMHgwMDAwLCAweDcxMDUsIDB4NDk3MiwgMHg5NDA4LCAweDAwMDAsIDB4OTNCRCwKLSAgICAweDM3QTAsIDB4NUMxRSwgMHg1QzlFLCAweDVFNUUsIDB4NUU0OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDVFQ0QsIDB4NUI0RiwgMHgwMDAwLCAweDAwMDAsIDB4MzcwMSwgMHgwMDAwLCAweDM2REQsIDB4MDAwMCwKLSAgICAweDM2RDMsIDB4ODEyQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDVGMEMsIDB4NUYwRSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg1QTZCLCAweDAwMDAsIDB4NUI0NCwgMHgwMDAwLCAweDg4NjAsIDB4NjA3RSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg1RkRCLCAweDNFQjgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDYxQzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NjE5OSwgMHg2MTk4LCAweDYwNzUsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDY0NzEsIDB4MDAwMCwgMHgwMDAwLCAweDNBMjksIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDYzMzcsIDB4NjRCNiwgMHg2MzMxLCAweDYzRDEsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4NjJBNCwgMHgwMDAwLCAweDY0M0IsIDB4NjU2QiwgMHg2OTcyLCAweDNCRjQsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDU1MEQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NjZDRSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgzQUUwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4NzhFRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzNDY0LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4NjY4RSwgMHgwMDAwLCAweDY2NkIsIDB4NEI5MywgMHg2NjMwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDY2NjMsIDB4MDAwMCwgMHgwMDAwLCAweDY2MUUsIDB4MDAwMCwgMHgzOEQxLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDNCOTksIDB4MDAwMCwgMHgwMDAwLCAweDc0RDAsIDB4M0I5NiwgMHgwMDAwLCAweDY4QjYsIDB4RkZGRCwKLSAgICAweDNCQzQsIDB4NkFCRSwgMHgwMDAwLCAweDAwMDAsIDB4NkEzMywgMHg2QTUyLCAweDZBQzksIDB4NkIwNSwKLSAgICAweDAwMDAsIDB4NjUxMSwgMHg2ODk4LCAweDZBNEMsIDB4M0JENywgMHg2QTdBLCAweDZCNTcsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OTNBMCwgMHg5MkYyLCAweDAwMDAsIDB4MDAwMCwgMHg5Mjg5LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDk0NjcsIDB4NkRBNSwgMHg2RjBCLCAweEZGRkQsIDB4MDAwMCwgMHgzRDhGLCAweDZFMDQsIDB4MDAwMCwKLSAgICAweDVBM0QsIDB4NkUwQSwgMHg1ODQ3LCAweDZEMjQsIDB4Nzg0MiwgMHg3MTNCLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDcwRjEsIDB4NzI1MCwgMHg3Mjg3LCAweDcyOTQsIDB4MDAwMCwgMHgwMDAwLCAweDUxNzksIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4NzQ3QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4M0YwNiwKLSAgICAweDNFQjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NjBBNywgMHgzRUYzLCAweDc0Q0MsIDB4NzQzQywKLSAgICAweDkzODcsIDB4NzQzNywgMHg0NDlGLCAweDAwMDAsIDB4NDU1MSwgMHg3NTgzLCAweDNGNjMsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4M0Y1OCwgMHg3NTU1LCAweDc2NzMsIDB4MDAwMCwgMHhGRkZELCAweDc0NjgsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgzQUZCLCAweDNEQ0QsIDB4MDAwMCwgMHgzRUZGLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDkxRkEsIDB4NTczMiwgMHg5MzQyLCAweDAwMDAsIDB4MDAwMCwgMHg1MERGLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDc3NzgsIDB4MDAwMCwgMHg3NzBFLCAweDc3MEYsIDB4Nzc3QiwgMHgwMDAwLCAweDAwMDAsIDB4M0E1RSwKLSAgICAweDAwMDAsIDB4NzQzOCwgMHg3NDlCLCAweDNFQkYsIDB4MDAwMCwgMHgwMDAwLCAweDQwQzgsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OTMwNywgMHgwMDAwLCAweDc4MUUsIDB4Nzg4RCwgMHg3ODg4LCAweDc4RDIsIDB4NzNEMCwKLSAgICAweDc5NTksIDB4MDAwMCwgMHgwMDAwLCAweDQxMEUsIDB4RkZGRCwgMHhGRkZELCAweDc5QTUsIDB4NkEyRCwKLSAgICAweDAwMDAsIDB4N0EzQSwgMHg3OUY0LCAweDQxNkUsIDB4MDAwMCwgMHg0MTMyLCAweDkyMzUsIDB4NzlGMSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzNTk3LCAweDU1NkIsIDB4MzU3MCwKLSAgICAweDM2QUEsIDB4MDAwMCwgMHgwMDAwLCAweDdBRTIsIDB4NUE1OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDVBMEQsIDB4MDAwMCwgMHg3OEYwLCAweDVBMkEsIDB4MDAwMCwgMHg3QUZFLCAweDQxRjksIDB4N0M1RCwKLSAgICAweDdDNkQsIDB4NDIxMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg3Q0NELCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDdDOEUsIDB4N0M3QywgMHg3Q0FFLCAweDZBQjIsIDB4N0REQywgMHg3RTA3LCAweDdERDMsIDB4N0Y0RSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDdEOTcsIDB4MDAwMCwgMHg0MjZBLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDY3RDYsIDB4MDAwMCwgMHgwMDAwLCAweDU3QzQsIDB4MDAwMCwgMHgwMDAwLCAweDdGREQsIDB4N0IyNywKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDdCMEMsIDB4MDAwMCwgMHg5OUU2LCAweDg2NDUsIDB4OUE2MywKLSAgICAweDZBMUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OUExRiwgMHgwMDAwLCAweDg0OTUsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4NDRFQSwgMHg4MTM3LCAweDQ0MDIsIDB4ODBDNiwgMHg4MTA5LCAweDgxNDIsIDB4MDAwMCwKLSAgICAweDk4QzMsIDB4MDAwMCwgMHg4MjYyLCAweDgyNjUsIDB4MDAwMCwgMHg4NDUzLCAweDAwMDAsIDB4ODYxMCwKLSAgICAweDAwMDAsIDB4NUE4NiwgMHg0MTdGLCAweDAwMDAsIDB4NUIyQiwgMHgwMDAwLCAweDVBRTQsIDB4MDAwMCwKLSAgICAweDg2QTAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MkQsIDB4MDAwMCwgMHg1QTAyLCAweDg4NkUsIDB4NEY0NSwKLSAgICAweDg4ODcsIDB4ODhCRiwgMHg4OEU2LCAweDg5NjUsIDB4ODk0RCwgMHgwMDAwLCAweDg5NTQsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzRUFELCAweDg0QTMsIDB4NDZGNSwKLSAgICAweDQ2Q0YsIDB4MzdGMiwgMHg4QTNELCAweDhBMUMsIDB4MDAwMCwgMHg1RjRELCAweDkyMkIsIDB4MDAwMCwKLSAgICAweDY1RDQsIDB4NzEyOSwgMHg3MEM0LCAweDAwMDAsIDB4OUQ2RCwgMHg4QzlGLCAweDhDRTksIDB4MDAwMCwKLSAgICAweDU5OUEsIDB4NzdDMywgMHg1OUYwLCAweDM2RDQsIDB4OEUyQSwgMHg4RUE3LCAweDAwMDAsIDB4OEYzMCwKLSAgICAweDhGNEEsIDB4NDJGNCwgMHg2QzU4LCAweDZGQkIsIDB4MDAwMCwgMHg0ODlCLCAweDZGNzksIDB4NkU4QiwKLSAgICAweDAwMDAsIDB4OUJFOSwgMHgzNkI1LCAweDAwMDAsIDB4OTBCQiwgMHg0OEI0LCAweDU1NzEsIDB4NDkwNiwKLSAgICAweDkxQkIsIDB4OTQwNCwgMHgwMDAwLCAweDQwNjIsIDB4MDAwMCwgMHg5NDI3LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDg0RTUsIDB4OEEyQiwgMHg5NTk5LCAweDk1QTcsIDB4OTU5NywgMHg5NTk2LCAweDAwMDAsIDB4NzQ0NSwKLSAgICAweDNFQzIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4M0VFNywgMHgwMDAwLCAweDk2OEYsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgzRUNDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDc0MTIsIDB4NzQ2QiwKLSAgICAweDNFRkMsIDB4OTc0MSwgMHgwMDAwLCAweDY4NDcsIDB4NEExRCwgMHgwMDAwLCAweDAwMDAsIDB4RkZGRCwKLSAgICAweDkzNjgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MkJBLCAweDVCMTEsIDB4OEI2OSwKLSAgICAweDQ5M0MsIDB4NzNGOSwgMHgwMDAwLCAweDk3OUIsIDB4RkZGRCwgMHg5OTM4LCAweDAwMDAsIDB4NURDMSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg5ODFGLCAweDAwMDAsIDB4OTJGNiwgMHgwMDAwLCAweDkxRTUsIDB4NDRDMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDk4REMsIDB4MDAwMCwgMHgzRjAwLCAweDkyMkEsIDB4NDkyNSwKLSAgICAweDg0MTQsIDB4OTkzQiwgMHg5OTRELCAweDAwMDAsIDB4M0RGRCwgMHhGRkZELCAweDRCNkYsIDB4OTlBQSwKLSAgICAweDlBNUMsIDB4MDAwMCwgMHgwMDAwLCAweDZBOEYsIDB4OUEyMSwgMHg1QUZFLCAweDlBMkYsIDB4MDAwMCwKLSAgICAweDRCOTAsIDB4MDAwMCwgMHg5OUJDLCAweDRCQkQsIDB4NEI5NywgMHg5MzdELCAweDU4NzIsIDB4MDAwMCwKLSAgICAweDU4MjIsIDB4MDAwMCwgMHgwMDAwLCAweDc4NDQsIDB4MDAwMCwgMHgwMDAwLCAweDY4QzUsIDB4M0Q3RCwKLSAgICAweDk0NTgsIDB4MzkyNywgMHg2MTUwLCAweDAwMDAsIDB4MDAwMCwgMHg2MTA3LCAweDlDNEYsIDB4OUM1MywKLSAgICAweDlDN0IsIDB4OUMzNSwgMHg5QzEwLCAweDlCN0YsIDB4OUJDRiwgMHgwMDAwLCAweDlCOUYsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OUQyMSwgMHg0Q0FFLCAweDAwMDAsIDB4OUUxOCwgMHg0Q0IwLCAweDlEMEMsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDlEQTUsIDB4ODRCRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDg1RkMsIDB4NDUzMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NDIwLCAweDg1RUUsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg3OUUyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDNENjIsIDB4OTNEQiwKLSAgICAweDkyQkUsIDB4OTM0OCwgMHgwMDAwLCAweDc4QjksIDB4OTI3NywgMHg5NDRELCAweDRGRTQsIDB4MzQ0MCwKLSAgICAweDkwNjQsIDB4MDAwMCwgMHg3ODNELCAweDc4NTQsIDB4NzhCNiwgMHg3ODRCLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MzY5QSwgMHg0RjcyLCAweDZGREEsIDB4NkZEOSwgMHhGRkZELCAweDcwMUUsIDB4NTQxNCwKLSAgICAweDAwMDAsIDB4NTdCQiwgMHg1OEYzLCAweDU3OEEsIDB4OUQxNiwgMHg1N0Q3LCAweDcxMzQsIDB4MzRBRiwKLSAgICAweDAwMDAsIDB4NzFFQiwgMHgwMDAwLCAweDAwMDAsIDB4RkZGRCwgMHgwMDAwLCAweDAwMDAsIDB4NjEwQywKLSAgICAweDVBQ0UsIDB4NUEwQiwgMHg0MkJDLCAweDAwMDAsIDB4MzcyQywgMHg0QjdCLCAweDAwMDAsIDB4OTNCQiwKLSAgICAweDkzQjgsIDB4MDAwMCwgMHgwMDAwLCAweDg0NzIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4NTk5NCwgMHgwMDAwLCAweDAwMDAsIDB4N0RBOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg5MkU1LCAweDczRTIsIDB4M0VFOSwgMHg3NEI0LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDNFRTEsIDB4MDAwMCwgMHg2QUQ4LCAweDczRjMsIDB4NzNGQiwgMHgzRUQ2LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg3NDQ4LCAweDAwMDAsIDB4NzBBNSwKLSAgICAweDAwMDAsIDB4OTI4NCwgMHg3M0U2LCAweDkzNUYsIDB4MDAwMCwgMHg5MzMxLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDkzODYsIDB4MDAwMCwgMHgwMDAwLCAweDQ5MzUsIDB4MDAwMCwgMHg3MTZCLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDU2QTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NTUwMiwgMHg3OUM0LCAweDAwMDAsIDB4N0RGRSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDQ1MkUsIDB4OTQwMSwgMHgzNzBBLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDU5QjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NUFBMSwgMHgzNkUyLCAweDAwMDAsIDB4MzZCMCwKLSAgICAweDkyNUYsIDB4NUE3OSwgMHgwMDAwLCAweDAwMDAsIDB4OTM3NCwgMHgzQ0NELCAweDAwMDAsIDB4NEE5NiwKLSAgICAweDM5OEEsIDB4NTBGNCwgMHgzRDY5LCAweDNENEMsIDB4MDAwMCwgMHg3MTc1LCAweDQyRkIsIDB4MDAwMCwKLSAgICAweDZFMEYsIDB4MDAwMCwgMHg0NEVCLCAweDZENTcsIDB4MDAwMCwgMHg3MDY3LCAweDZDQUYsIDB4M0NENiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg2RTAyLCAweDZGMEMsIDB4M0Q2RiwgMHgwMDAwLCAweDc1NTEsIDB4MzZCQywKLSAgICAweDM0QzgsIDB4NDY4MCwgMHgzRURBLCAweDQ4NzEsIDB4NTlDNCwgMHg5MjZFLCAweDQ5M0UsIDB4OEY0MSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg1ODEyLCAweDU3QzgsIDB4MzZENiwgMHgwMDAwLCAweDcwRkUsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NjhCOSwgMHg2OTY3LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDZBMUEsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ODQzRSwgMHg0NERGLCAweDQ0Q0UsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweEZGRkQsIDB4RkZGRCwgMHg4MzNELCAweDAwMDAsIDB4ODNFRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDU5ODksIDB4NUE4MiwgMHgwMDAwLCAweDVBNjEsIDB4NUE3MSwgMHgwMDAwLCAweDAwMDAsIDB4MzcyRCwKLSAgICAweDU5RUYsIDB4MDAwMCwgMHgzNkM3LCAweDcxOEUsIDB4OTM5MCwgMHg2NjlBLCAweDAwMDAsIDB4NUE2RSwKLSAgICAweDVBMkIsIDB4MDAwMCwgMHg2QTJCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NzExRCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg0RkIwLCAweDAwMDAsIDB4NUNDMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDZBMEMsIDB4MDAwMCwgMHgwMDAwLCAweEZGRkQsIDB4NzEzMywgMHgwMDAwLCAweDNEQTUsIDB4NkNERiwKLSAgICAweDAwMDAsIDB4NTlFQiwgMHg1RjVDLCAweDAwMDAsIDB4N0NEMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDkwNkMsIDB4ODFGNiwgMHg3NzBDLCAweDZDQTIsIDB4NTZGRCwgMHg1ODY5LCAweDY3NjEsIDB4NUM1RSwKLSAgICAweDU4RjIsIDB4NzBCOSwgMHg2ODAzLCAweDhGQkIsIDB4OEZCQywgMHg0RTIxLCAweDdCMzksIDB4M0RDQywKLSAgICAweDczMkEsIDB4NzU2MCwgMHg1ODNBLCAweDgyQTYsIDB4Njk4QSwgMHg2MEUzLCAweDRFRUUsIDB4OTlDNCwKLSAgICAweDlFQkYsIDB4NTMwMSwgMHg2N0EwLCAweDYwRTgsIDB4NTFCNCwgMHg3QTgzLCAweDlDM0EsIDB4N0FDOCwKLSAgICAweDY5MUEsIDB4NTlBQywgMHg1ODQwLCAweDU0NkEsIDB4NjBFNywgMHg1NjdBLCAweDY5NTUsIDB4OUMyRiwKLSAgICAweDg3QTUsIDB4NUMyMCwgMHg1RTBCLCAweDY3MUUsIDB4ODRBRCwgMHg4QjgxLCAweDRFNzgsIDB4NjJDMywKLSAgICAweDY4NTUsIDB4RkZGRCwgMHg4MkZELCAweDg5QTUsIDB4OEZBMCwgMHg5N0I4LCAweDk4NDcsIDB4OUFCRCwKLSAgICAweDVGQjEsIDB4NjY0OCwgMHg2NkJGLCAweDAwMDAsIDB4RkZGRCwgMHgwMDAwLCAweEZGRkQsIDB4RkZGRCwKLSAgICAweDAwMDAsIDB4NjcwRSwgMHg2OTE4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NDhEMCwKLSAgICAweDRBQjgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg1MUQyLCAweDAwMDAsIDB4NTk5RiwKLSAgICAweDAwMDAsIDB4M0JCRSwgMHgwMDAwLCAweDM5OUIsIDB4MDAwMCwgMHgwMDAwLCAweDM3NjIsIDB4MDAwMCwKLSAgICAweDhCNUUsIDB4MDAwMCwgMHhGRkZELCAweDcyMDksIDB4MDAwMCwgMHgwMDAwLCAweDhFREEsIDB4NTI4RiwKLSAgICAweDcxNzEsIDB4MDAwMCwgMHgwMDAwLCAweDU1QkMsIDB4MDAwMCwgMHgzNDczLCAweDAwMDAsIDB4NDcxOCwKLSAgICAweDAwMDAsIDB4NTA2NiwgMHgzNEZCLCAweDAwMDAsIDB4RkZGRCwgMHg0NzdDLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweEZGRkQsIDB4MDAwMCwgMHg5MDU2LCAweDAwMDAsIDB4OEI2MiwgMHg1RDVCLCAweDAwMDAsIDB4RkZGRCwKLSAgICAweDAwMDAsIDB4OEFFQSwgMHgwMDAwLCAweDAwMDAsIDB4NEJDMCwgMHgwMDAwLCAweDk0NjUsIDB4MDAwMCwKLSAgICAweDYxOTUsIDB4NUEyNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg0RTZBLCAweDAwMDAsIDB4OTY1NiwKLSAgICAweDZEOEYsIDB4MDAwMCwgMHg4OTc3LCAweDAwMDAsIDB4RkZGRCwgMHg3QjQyLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweEZGRkQsIDB4N0E0NSwgMHg5QTI2LCAweDM2NUYsIDB4MDAwMCwgMHgwMDAwLCAweDc5ODMsIDB4NUQyQywKLSAgICAweDAwMDAsIDB4RkZGRCwgMHg0NkQwLCAweDc1M0IsIDB4ODg2NSwgMHg1OEI2LCAweDM3MUMsIDB4MDAwMCwKLSAgICAweDNDNTQsIDB4OTI4MSwgMHgwMDAwLCAweDkzMzAsIDB4MDAwMCwgMHg2QzM5LCAweDAwMDAsIDB4ODgyNywKLSAgICAweDg4RjUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NkVCOCwgMHgwMDAwLCAweDAwMDAsIDB4MzlBNCwKLSAgICAweEZGRkQsIDB4RkZGRCwgMHg0NTNGLCAweDY2QjYsIDB4MDAwMCwgMHgwMDAwLCAweDg5NDMsIDB4NDBERiwKLSAgICAweDAwMDAsIDB4MzlBMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg3MUFELCAweDgzNjYsIDB4MDAwMCwKLSAgICAweEZGRkQsIDB4NENCNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg3QjQzLCAweDc5N0UsIDB4NkZCNSwKLSAgICAweDAwMDAsIDB4NkEwMywgMHgwMDAwLCAweDUzQTIsIDB4MDAwMCwgMHg5M0JGLCAweDY4MzYsIDB4OTc1RCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NUQ4NSwgMHgwMDAwLCAweDU3MTUsIDB4OTgyMywKLSAgICAweDAwMDAsIDB4NURBQiwgMHgwMDAwLCAweDY1QkUsIDB4NjlENSwgMHg1M0QyLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDNDMTEsIDB4NjczNiwgMHgwMDAwLCAweDM1Q0EsIDB4NDhGQSwgMHhGRkZELCAweDc4MDgsIDB4OTI1NSwKLSAgICAweDQzRjIsIDB4NDNERiwgMHg1OUY4LCAweEZGRkQsIDB4NTY4QiwgMHgwMDAwLCAweDkwMTIsIDB4NTVDMSwKLSAgICAweDQ1MDksIDB4N0U3RiwgMHg2RjU2LCAweDZBQjEsIDB4MzRFNCwgMHgwMDAwLCAweDM3M0EsIDB4RkZGRCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgzREVCLCAweDAwMDAsIDB4MDAwMCwgMHg1NkJGLCAweDhFMEUsIDB4NUI2RCwKLSAgICAweDYzREUsIDB4RkZGRCwgMHg2NTMwLCAweDU2MkQsIDB4NTQxQSwgMHgwMDAwLCAweDRDN0QsIDB4NTYyMiwKLSAgICAweDU2MUUsIDB4N0Y0OSwgMHg1OTc1LCAweDAwMDAsIDB4ODc3MCwgMHg4MTE3LCAweDlENUUsIDB4OEQxOCwKLSAgICAweDc2M0IsIDB4OUM0NSwgMHg3NjRFLCAweDc3QjksIDB4OTM0NSwgMHg1NDMyLCAweDgxNDgsIDB4ODJGNywKLSAgICAweDU2MjUsIDB4ODEzMiwgMHg4NDE4LCAweDgwQkQsIDB4NTVFQSwgMHg3OTYyLCAweDU2NDMsIDB4NTQxNiwKLSAgICAweDAwMDAsIDB4MzVDRSwgMHg1NjA1LCAweDU1RjEsIDB4NjZGMSwgMHgwMDAwLCAweDM2MkQsIDB4NzUzNCwKLSAgICAweDU1RjAsIDB4NTVCQSwgMHg1NDk3LCAweDU1NzIsIDB4MDAwMCwgMHgwMDAwLCAweDVFRDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg5RUFCLCAweDdENUEsIDB4RkZGRCwgMHgwMDAwLCAweDYyOUQsIDB4OTc2RCwKLSAgICAweDU0OTQsIDB4OENDRCwgMHg3MUY2LCAweDkxNzYsIDB4NjNGQywgMHg2M0I5LCAweDYzRkUsIDB4NTU2OSwKLSAgICAweDAwMDAsIDB4OUM3MiwgMHgwMDAwLCAweDUxOUEsIDB4MzRERiwgMHgwMDAwLCAweDUxQTcsIDB4NTQ0RCwKLSAgICAweDU1MUUsIDB4NTUxMywgMHg3NjY2LCAweDhFMkQsIDB4MDAwMCwgMHg3NUIxLCAweDgwQjYsIDB4ODgwNCwKLSAgICAweEZGRkQsIDB4ODhDNywgMHg4MUI2LCAweDg0MUMsIDB4NDRFQywgMHg3MzA0LCAweDgzMEIsIDB4NTY3QiwKLSAgICAweDkxNzAsIDB4OTIwOCwgMHgwMDAwLCAweDcyNjYsIDB4NDc0RSwgMHgwMDAwLCAweDQwRkEsIDB4OUM1RCwKLSAgICAweDY1MUYsIDB4NDhGMywgMHgwMDAwLCAweDAwMDAsIDB4RkZGRCwgMHgwMDAwLCAweEVEMkIsIDB4MDAwMCwKLSAgICAweDcxQTMsIDB4N0U4RSwgMHg5RDUwLCAweDM1NzcsIDB4NkNCMiwgMHg1MzY3LCAweDM5REMsIDB4MDAwMCwKLSAgICAweDgyMkQsIDB4NTQ0QiwgMHhFRDQzLCAweDNBNTIsIDB4NzM3NCwgMHgwMDAwLCAweDREMDksIDB4OUJFRCwKLSAgICAweEZGRkQsIDB4NEM1QiwgMHgwMDAwLCAweDg0NUMsIDB4MDAwMCwgMHg2MzJFLCAweDdEMjUsIDB4M0EyQSwKLSAgICAweDkwMDgsIDB4NTJDQywgMHgzRTc0LCAweDM2N0EsIDB4NDVFOSwgMHgwMDAwLCAweDc2NDAsIDB4NUFGMCwKLSAgICAweDAwMDAsIDB4Nzg3QSwgMHgwMDAwLCAweDU4QTcsIDB4NDBCRiwgMHg1NjdDLCAweDlCOEIsIDB4NUQ3NCwKLSAgICAweDc2NTQsIDB4MDAwMCwgMHg5RTg1LCAweDRDRTEsIDB4RkZGRCwgMHgzN0ZCLCAweDYxMTksIDB4MDAwMCwKLSAgICAweEVENzMsIDB4NTY1RCwgMHgwMDAwLCAweDUyMzQsIDB4MzVBRCwgMHhGRkZELCAweDlEN0MsIDB4N0M1NiwKLSAgICAweDlCMzksIDB4NTdERSwgMHg1QzUzLCAweDY0RDMsIDB4MDAwMCwgMHgwMDAwLCAweDg2QUQsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4RUQ4QywgMHg1MUZFLCAweDAwMDAsIDB4NUQ4RSwgMHg5NzAzLCAweDAwMDAsIDB4OUU4MSwKLSAgICAweDkwNEMsIDB4N0IxRiwgMHg5QjAyLCAweDVDRDEsIDB4N0JBMywgMHg2MjY4LCAweDYzMzUsIDB4OUFGRiwKLSAgICAweDdCQ0YsIDB4OUIyQSwgMHg3QzdFLCAweEZGRkQsIDB4N0M0MiwgMHg3Qzg2LCAweDlDMTUsIDB4N0JGQywKLSAgICAweDlCMDksIDB4RkZGRCwgMHg5QzJFLCAweDlGNUEsIDB4NTU3MywgMHg1QkMzLCAweDRGRkQsIDB4OUU5OCwKLSAgICAweDRGRjIsIDB4NTI2MCwgMHg1MkQxLCAweDU3NjcsIDB4NTA1NiwgMHg1OUI3LCAweDVFMTIsIDB4OTdDOCwKLSAgICAweDlEQUIsIDB4OEY1QywgMHg1NDY5LCAweDk3QjQsIDB4OTk0MCwgMHg5N0JBLCAweDUzMkMsIDB4NjEzMCwKLSAgICAweDY5MkMsIDB4NTNEQSwgMHg5QzBBLCAweDlEMDIsIDB4NEMzQiwgMHg5NjQxLCAweDY5ODAsIDB4NTBBNiwKLSAgICAweDc1NDYsIDB4MDAwMCwgMHg5OURBLCAweDUyNzMsIDB4RURDOSwgMHg5MTU5LCAweDk2ODEsIDB4OTE1QywKLSAgICAweEVEQ0QsIDB4OTE1MSwgMHgwMDAwLCAweDYzN0YsIDB4NkFDQSwgMHg1NjExLCAweDkxOEUsIDB4NzU3QSwKLSAgICAweDYyODUsIDB4NzM0RiwgMHg3QzcwLCAweDAwMDAsIDB4RUREQywgMHg3NkQ2LCAweDlCOUQsIDB4NEUyQSwKLSAgICAweDAwMDAsIDB4ODNCRSwgMHg4ODQyLCAweEVERTQsIDB4NUM0QSwgMHg2OUMwLCAweEZGRkQsIDB4RkZGRCwKLSAgICAweDUyMUYsIDB4NURGNSwgMHg0RUNFLCAweDZDMzEsIDB4MDAwMCwgMHg0RjM5LCAweDU0OUMsIDB4RkZGRCwKLSAgICAweDUyOUEsIDB4OEQ4MiwgMHgzNUZFLCAweEZGRkQsIDB4MzVGMywgMHhFREY2LCAweDZCNTIsIDB4OTE3QywKLSAgICAweDlGQTUsIDB4OUI5NywgMHg5ODJFLCAweDk4QjQsIDB4OUFCQSwgMHg5RUE4LCAweDlFODQsIDB4N0IxNCwKLSAgICAweEVFMDIsIDB4NkJGQSwgMHg4ODE4LCAweDdGNzgsIDB4RUUwNiwgMHg1NjIwLCAweDAwMDAsIDB4OEU3NywKLSAgICAweDlGNTMsIDB4RUUwQiwgMHg4REQ0LCAweDhFNEYsIDB4OUUxQywgMHg4RTAxLCAweDYyODIsIDB4MDAwMCwKLSAgICAweDhFMjgsIDB4OEU3NSwgMHg3QUQzLCAweDdBM0UsIDB4NzhEOCwgMHg2Q0VBLCAweDhBNjcsIDB4NzYwNywKLSAgICAweDlGMjYsIDB4NkNDRSwgMHg4N0Q2LCAweDc1QzMsIDB4MDAwMCwgMHg3ODUzLCAweDhEMEMsIDB4NzJFMiwKLSAgICAweDczNzEsIDB4OEIyRCwgMHg3MzAyLCAweDc0RjEsIDB4OENFQiwgMHgwMDAwLCAweDg2MkYsIDB4NUZCQSwKLSAgICAweDg4QTAsIDB4NDRCNywgMHhFRTJGLCAweDAwMDAsIDB4RUUzMiwgMHg4QTdFLCAweDAwMDAsIDB4RUUzNSwKLSAgICAweDYwRkQsIDB4NzY2NywgMHg5QUQ3LCAweDlENDQsIDB4OTM2RSwgMHg5QjhGLCAweDg3RjUsIDB4RUUzRCwKLSAgICAweEZGRkQsIDB4OENGNywgMHg3MzJDLCAweDk3MjEsIDB4OUJCMCwgMHgzNUQ2LCAweDcyQjIsIDB4NEMwNywKLSAgICAweDdDNTEsIDB4OTk0QSwgMHg2MTU5LCAweDRDMDQsIDB4OUU5NiwgMHg2MTdELCAweEVFNEQsIDB4NTc1RiwKLSAgICAweDYxNkYsIDB4NjJBNiwgMHg2MjM5LCAweEZGRkQsIDB4M0E1QywgMHg2MUUyLCAweDUzQUEsIDB4NjM2NCwKLSAgICAweDY4MDIsIDB4MzVEMiwgMHg1RDU3LCAweDhGREEsIDB4MDAwMCwgMHhFRTVFLCAweDUwRDksIDB4NzkwNiwKLSAgICAweDUzMzIsIDB4OTYzOCwgMHgwMDAwLCAweDQwNjUsIDB4RUU2NiwgMHg3N0ZFLCAweEVFNjgsIDB4N0NDMiwKLSAgICAweDAwMDAsIDB4N0NEQSwgMHg3QTJELCAweDgwNjYsIDB4ODA2MywgMHg3RDRELCAweDc1MDUsIDB4NzRGMiwKLSAgICAweDg5OTQsIDB4ODIxQSwgMHg2NzBDLCAweDgwNjIsIDB4MDAwMCwgMHg4MDVCLCAweDc0RjAsIDB4ODEwMywKLSAgICAweDc3MjQsIDB4ODk4OSwgMHgwMDAwLCAweDc1NTMsIDB4ODdBOSwgMHg4N0NFLCAweDgxQzgsIDB4ODc4QywKLSAgICAweDhBNDksIDB4OENBRCwgMHg4QjQzLCAweDc3MkIsIDB4NzRGOCwgMHg4NERBLCAweDY5QjIsIDB4OERBNiwKLSAgICAweEVFOEMsIDB4ODlBOSwgMHhGRkZELCAweDZEQjksIDB4ODdDMSwgMHgwMDAwLCAweDc0RTcsIDB4M0REQiwKLSAgICAweDcxNzYsIDB4NjBBNCwgMHg2MTlDLCAweDNDRDEsIDB4RkZGRCwgMHg2MDc3LCAweEVFOUEsIDB4N0Y3MSwKLSAgICAweDAwMDAsIDB4NjBFOSwgMHg0QjdFLCAweDAwMDAsIDB4OTJEQiwgMHgwMDAwLCAweDAwMDAsIDB4ODU0QywKLSAgICAweDQyQjUsIDB4NzNFRiwgMHg1MUI1LCAweDM2NDksIDB4MDAwMCwgMHgwMDAwLCAweDkzNDQsIDB4MDAwMCwKLSAgICAweDgyRUUsIDB4MDAwMCwgMHg3ODNDLCAweDY3NDQsIDB4NjJERiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg0RkFCLCAweDAwMDAsIDB4NTAwOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHhGRkZELCAweDAwMDAsIDB4NUZBNCwgMHgwMDAwLCAweDAwMDAsIDB4NkVEQiwKLSAgICAweDAwMDAsIDB4NTBERSwgMHg1MTAxLCAweDM0N0EsIDB4NTEwRSwgMHg5ODZDLCAweDM3NDMsIDB4ODQxNiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg1MTYwLCAweDAwMDAsIDB4NTE2QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NUI4MiwgMHg4NzdELCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDUxQjIsIDB4NTFCOCwgMHg5RDM0LCAweDUxQzksIDB4NTFDRiwgMHg1MUQxLCAweDNDREMsIDB4NTFEMywKLSAgICAweDAwMDAsIDB4NTFCMywgMHhGRkZELCAweEZGRkQsIDB4NTFFRCwgMHg4M0NELCAweDY5M0UsIDB4MDAwMCwKLSAgICAweDVGN0IsIDB4NTIwQiwgMHg1MjI2LCAweDUyM0MsIDB4NTJCNSwgMHg1MjU3LCAweDUyOTQsIDB4NTJCOSwKLSAgICAweDUyQzUsIDB4N0MxNSwgMHg4NTQyLCAweDUyRTAsIDB4ODYwRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDU1NDksIDB4NkVEOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg1MzMzLCAweEZGRkQsIDB4MDAwMCwKLSAgICAweDZDQ0IsIDB4MDAwMCwgMHg2ODFCLCAweDczRDUsIDB4NjA0QSwgMHgzRUFBLCAweDM4Q0MsIDB4MDAwMCwKLSAgICAweDcxREQsIDB4NDRBMiwgMHg1MzZELCAweDUzNzQsIDB4MDAwMCwgMHg1MzdFLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4NzdFNiwgMHg1MzkzLCAweDAwMDAsIDB4NTNBMCwgMHg1M0FCLCAweDUzQUUsIDB4NzNBNywKLSAgICAweDAwMDAsIDB4M0Y1OSwgMHg3MzlDLCAweDUzQzEsIDB4NTNDNSwgMHg2QzQ5LCAweDRFNDksIDB4NTdGRSwKLSAgICAweDUzRDksIDB4M0FBQiwgMHgwMDAwLCAweDUzRTAsIDB4MDAwMCwgMHgwMDAwLCAweDUzRjYsIDB4MDAwMCwKLSAgICAweDU0MTMsIDB4NzA3OSwgMHg1NTJCLCAweDY2NTcsIDB4NkQ1QiwgMHg1NDZELCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDU1NUQsIDB4NTQ4RiwgMHg1NEE0LCAweDQ3QTYsIDB4MDAwMCwgMHgwMDAwLCAweDNEQjQsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg1NTQ3LCAweDRDRUQsIDB4NTQyRiwgMHg3NDE3LCAweDU1ODYsIDB4NTVBOSwKLSAgICAweEZGRkQsIDB4MDAwMCwgMHgwMDAwLCAweDQ1NTIsIDB4MDAwMCwgMHg2NkIzLCAweDAwMDAsIDB4NTYzNywKLSAgICAweDY2Q0QsIDB4MDAwMCwgMHg2NkE0LCAweEZGRkQsIDB4NTY0RCwgMHg1NjRGLCAweDc4RjEsIDB4NTZGMSwKLSAgICAweDk3ODcsIDB4NTNGRSwgMHg1NzAwLCAweDU2RUYsIDB4NTZFRCwgMHgwMDAwLCAweDM2MjMsIDB4MDAwMCwKLSAgICAweDU3NDYsIDB4MDAwMCwgMHg2QzZFLCAweDcwOEIsIDB4NTc0MiwgMHgzNkIxLCAweDAwMDAsIDB4NTdFNiwKLSAgICAweDAwMDAsIDB4NTgwMywgMHgwMDAwLCAweDAwMDAsIDB4NTgyNiwgMHgwMDAwLCAweDU4MUYsIDB4NThBQSwKLSAgICAweDM1NjEsIDB4NThFMCwgMHg1OERDLCAweDAwMDAsIDB4NThGQiwgMHg1QkZGLCAweDU3NDMsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OTNEMywgMHgzNUExLCAweDU5MUYsIDB4NjhBNiwgMHgzNkMzLCAweDZFNTksIDB4MDAwMCwKLSAgICAweDVBMjQsIDB4RkZGRCwgMHgwMDAwLCAweDg1MDUsIDB4NTlDOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4NTlEOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg2RDcxLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDU5RjksIDB4MDAwMCwgMHg1QUFCLCAweDVBNjMsIDB4MzZFNiwgMHgwMDAwLCAweEZGRkQsIDB4MzcwOCwKLSAgICAweDVBOTYsIDB4NzQ2NSwgMHg1QUQzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDM3MzIsIDB4MDAwMCwKLSAgICAweDVFODMsIDB4NTJEMCwgMHg1Qjc2LCAweDY1ODgsIDB4NUI3QywgMHgwMDAwLCAweDQwMDQsIDB4NDg1RCwKLSAgICAweDAwMDAsIDB4NUJENSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg1QkYzLCAweDVCOUQsIDB4NEQxMCwKLSAgICAweDVDMDUsIDB4MDAwMCwgMHg1QzEzLCAweDczQ0UsIDB4NUMxNCwgMHgwMDAwLCAweDAwMDAsIDB4NUM0OSwKLSAgICAweDQ4REQsIDB4NUM4NSwgMHg1Q0U5LCAweDVDRUYsIDB4NUQ4QiwgMHgwMDAwLCAweDAwMDAsIDB4NUQxMCwKLSAgICAweDVEMTgsIDB4NUQ0NiwgMHgwMDAwLCAweDVDQkEsIDB4NURENywgMHg4MkZDLCAweDM4MkQsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4Mjg3LCAweDM4MzYsIDB4M0JDMiwgMHg1RTJFLCAweDZBOEEsIDB4RkZGRCwKLSAgICAweEUxMkYsIDB4MDAwMCwgMHgwMDAwLCAweDUzQTYsIDB4NEVCNywgMHhGRkZELCAweDUzQTgsIDB4MDAwMCwKLSAgICAweDVFMDksIDB4RTEzOCwgMHgwMDAwLCAweDVFRjksIDB4NUVGQiwgMHgzOEEwLCAweDVFRkMsIDB4NjgzRSwKLSAgICAweDk0MUIsIDB4NUYwRCwgMHgwMDAwLCAweDAwMDAsIDB4M0FERSwgMHgwMDAwLCAweDVGM0EsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg1RjYzLCAweDAwMDAsIDB4NUY3MiwgMHg5MzQwLCAweDAwMDAsIDB4NUZBNywKLSAgICAweDVEQjYsIDB4M0Q1RiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkxRDYsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4NjAzMSwgMHg2Njg1LCAweDM5NjMsIDB4M0RDNywgMHgzNjM5LCAweDU3OTAsIDB4MDAwMCwKLSAgICAweDc5NzEsIDB4M0U0MCwgMHg2MDlFLCAweEZGRkQsIDB4NjBFQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDc0QTQsIDB4NTBFMSwgMHg1QUEwLCAweDYxNjQsIDB4NjE0MiwgMHgwMDAwLCAweDAwMDAsIDB4NjE4MSwKLSAgICAweDUxRjQsIDB4MDAwMCwgMHg2MTg3LCAweDVCQUEsIDB4MDAwMCwgMHgwMDAwLCAweDYxRDMsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4NjFEMCwgMHgzOTMyLCAweDAwMDAsIDB4MDAwMCwgMHg2MDIzLCAweDYxNUMsIDB4NjUxRSwKLSAgICAweDYzOEIsIDB4MDAwMCwgMHg2MkM1LCAweDAwMDAsIDB4NjJENSwgMHgwMDAwLCAweDYzNkMsIDB4MDAwMCwKLSAgICAweDNBMTcsIDB4NjQzOCwgMHg2M0Y4LCAweDAwMDAsIDB4MDAwMCwgMHg2RjhBLCAweDAwMDAsIDB4RkZGRCwKLSAgICAweDAwMDAsIDB4NjRFMSwgMHg2NEU1LCAweDk0N0IsIDB4M0E2NiwgMHg2NDNBLCAweDNBNTcsIDB4NjU0RCwKLSAgICAweDZGMTYsIDB4MDAwMCwgMHgwMDAwLCAweDY1ODUsIDB4NjU2RCwgMHg2NTVGLCAweEZGRkQsIDB4NjVCNSwKLSAgICAweDAwMDAsIDB4NEIzNywgMHg2NUQxLCAweDQwRDgsIDB4MDAwMCwgMHhFMUFCLCAweDY1RTMsIDB4NUZERiwKLSAgICAweDAwMDAsIDB4NjYxOCwgMHgwMDAwLCAweDAwMDAsIDB4NjY0NCwgMHgwMDAwLCAweDAwMDAsIDB4NjY0QiwKLSAgICAweDAwMDAsIDB4NjY2NywgMHgwMDAwLCAweDY2NzMsIDB4RkExMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4NzdDNSwgMHgwMDAwLCAweDk5QTQsIDB4NjcwMiwgMHgwMDAwLCAweDAwMDAsIDB4NjlGQSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg2NzY3LCAweDY3NjIsIDB4MDAwMCwgMHgwMDAwLCAweDY3RDcsIDB4NDRFOSwKLSAgICAweDY4MjIsIDB4NkU1MCwgMHg5MjNDLCAweDY4MDEsIDB4MDAwMCwgMHgwMDAwLCAweDY4NUQsIDB4MDAwMCwKLSAgICAweDY5RTEsIDB4NkEwQiwgMHgwMDAwLCAweDY5NzMsIDB4NjhDMywgMHgwMDAwLCAweDY5MDEsIDB4NjkwMCwKLSAgICAweDNBMDEsIDB4MDAwMCwgMHgzQjgwLCAweDY3QUMsIDB4Njk2MSwgMHgwMDAwLCAweDQyRkMsIDB4NjkzNiwKLSAgICAweDY5OTgsIDB4M0JBMSwgMHgwMDAwLCAweDgzNjMsIDB4NTA5MCwgMHg2OUY5LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDZBNDUsIDB4MDAwMCwgMHg2QTlELCAweDNCRjMsIDB4NjdCMSwgMHg2QUM4LCAweDAwMDAsIDB4M0MwRCwKLSAgICAweDZCMUQsIDB4MDAwMCwgMHg2MERFLCAweDZCMzUsIDB4NkI3NCwgMHgwMDAwLCAweDZFQjUsIDB4MDAwMCwKLSAgICAweEZGRkQsIDB4MDAwMCwgMHgzNzQwLCAweDU0MjEsIDB4MDAwMCwgMHg2QkUxLCAweDAwMDAsIDB4NkJEQywKLSAgICAweDZDMzcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NkM1QSwgMHg4MjI2LCAweDZDNzksIDB4MDAwMCwKLSAgICAweDQ0QzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDM2RTUsIDB4M0NFQiwKLSAgICAweDAwMDAsIDB4OUI4MywgMHgwMDAwLCAweDAwMDAsIDB4N0Y4RiwgMHg2ODM3LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4NkQ5NiwgMHg2RDVDLCAweDZFN0MsIDB4NkYwNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDg1MzMsIDB4MDAwMCwgMHg1MUM3LCAweEZGRkQsIDB4RkZGRCwgMHg4NDJFLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4NzQ1MywgMHgwMDAwLCAweDc5Q0MsIDB4NkU0RiwgMHg1QTkxLCAweDAwMDAsIDB4NkZGOCwKLSAgICAweDM3MEQsIDB4NkY5RCwgMHgwMDAwLCAweDZFRkEsIDB4MDAwMCwgMHgwMDAwLCAweDQ1NTUsIDB4OTNGMCwKLSAgICAweDZGNDQsIDB4NkY1QywgMHgzRDRFLCAweDZGNzQsIDB4MDAwMCwgMHgzRDNCLCAweDZGOUYsIDB4MDAwMCwKLSAgICAweDZGRDMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NTFERiwKLSAgICAweEUyNTEsIDB4RTI1MiwgMHgwMDAwLCAweDAwMDAsIDB4NzA0QiwgMHg3MDdFLCAweDcwQTcsIDB4RkZGRCwKLSAgICAweDcwQ0MsIDB4NzBENSwgMHg3MEQ2LCAweDcwREYsIDB4NDEwNCwgMHgzREU4LCAweDcxQjQsIDB4NzE5NiwKLSAgICAweDAwMDAsIDB4NzEyQiwgMHg3MTQ1LCAweDVBODgsIDB4NzE0QSwgMHhGQTQ4LCAweDAwMDAsIDB4NzE0RiwKLSAgICAweDkzNjIsIDB4MDAwMCwgMHg3MTJDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDcxQkEsIDB4MDAwMCwKLSAgICAweDcwQkQsIDB4NzIwRSwgMHg5NDQyLCAweDcyMTUsIDB4NTkxMSwgMHg5NDQzLCAweDcyMjQsIDB4OTM0MSwKLSAgICAweDAwMDAsIDB4NzIyRSwgMHg3MjQwLCAweDAwMDAsIDB4NjhCRCwgMHg3MjU1LCAweDcyNTcsIDB4M0U1NSwKLSAgICAweDAwMDAsIDB4NjgwRCwgMHg2RjNELCAweDcyODIsIDB4RkZGRCwgMHg3MzJCLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDQ4RUQsIDB4MDAwMCwgMHg3MzI4LCAweDczMkUsIDB4NzNDRiwgMHg3M0FBLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDczQzksIDB4NzQ0OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg2NjIzLCAweDM2QzUsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg3M0Y3LCAweDc0MTUsIDB4NjkwMywgMHgwMDAwLCAweDc0MzksIDB4M0VENywKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg3NDYwLCAweDAwMDAsIDB4NzQ0NywgMHg3M0U0LCAweDc0NzYsIDB4ODNCOSwKLSAgICAweDc0NkMsIDB4NzQ3NCwgMHg5M0YxLCAweDZBMkMsIDB4NzQ4MiwgMHg0OTUzLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg1QjQ2LCAweDAwMDAsIDB4MDAwMCwgMHg3NEM4LCAweDAwMDAsIDB4NzUwRSwKLSAgICAweDc1MUUsIDB4MDAwMCwgMHgwMDAwLCAweDVCRDcsIDB4MDAwMCwgMHg5Mzg1LCAweDc1NEQsIDB4NzU0QSwKLSAgICAweDc1NjcsIDB4NzU2RSwgMHgwMDAwLCAweDNGMDQsIDB4MDAwMCwgMHg3NThFLCAweDc0NUQsIDB4NzU5RSwKLSAgICAweDc1QjQsIDB4NzYwMiwgMHg3NjJDLCAweDc2NTEsIDB4NzY0RiwgMHg3NjZGLCAweEUyRDMsIDB4MDAwMCwKLSAgICAweDc2OTAsIDB4ODFFRiwgMHgzN0Y4LCAweDAwMDAsIDB4MDAwMCwgMHg3NkExLCAweDc2QTUsIDB4NzZCNywKLSAgICAweDc2Q0MsIDB4MDAwMCwgMHg4NDYyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDc3MUUsIDB4NzcyNiwKLSAgICAweDc3NDAsIDB4NjRBRiwgMHgwMDAwLCAweDc3NTgsIDB4MDAwMCwgMHg3N0FGLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4NzdGNCwgMHhGRkZELCAweDY4Q0EsIDB4NzhBRiwgMHg3OEM3LCAweDc4RDMsIDB4OTZBNSwKLSAgICAweDc5MkUsIDB4MDAwMCwgMHg3OEQ3LCAweDc5MzQsIDB4NzhCMSwgMHgwMDAwLCAweDhGQjgsIDB4ODg4NCwKLSAgICAweDAwMDAsIDB4Nzk4NiwgMHg4OTAwLCAweDY5MDIsIDB4Nzk4MCwgMHgwMDAwLCAweDc5OUQsIDB4MDAwMCwKLSAgICAweDc5M0MsIDB4NzlBOSwgMHg2RTJBLCAweDAwMDAsIDB4M0VBOCwgMHg3OUM2LCAweDAwMDAsIDB4NzlENCwKLSAgICAweEZGRkQsIDB4NTUyNSwgMHhGRkZELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDU1OTAsIDB4MDAwMCwKLSAgICAweDM5RUMsIDB4MDAwMCwgMHg4RTQ2LCAweDAwMDAsIDB4MDAwMCwgMHhGRkZELCAweDAwMDAsIDB4Nzc3QSwKLSAgICAweDAwMDAsIDB4M0EzNCwgMHg0N0Q1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDY0REQsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHhGRkZELCAweDY0OEQsIDB4OEU3RSwgMHgwMDAwLCAweEZGRkQsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweEZGRkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NDdGNCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg5QUIyLCAweDNBNjcsIDB4MDAwMCwgMHgzRkVELCAweDM1MDYsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4RkZGRCwgMHgwMDAwLCAweDlENkUsIDB4OTgxNSwgMHhGRkZELCAweDQzRDksIDB4RkZGRCwKLSAgICAweDY0QjQsIDB4NTRFMywgMHhGRkZELCAweDAwMDAsIDB4RkZGRCwgMHgzOUZCLCAweEZGRkQsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg2NEVBLCAweDAwMDAsIDB4MDAwMCwgMHg4RTY4LCAweEZGRkQsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4RkZGRCwgMHg0ODBCLCAweDAwMDAsIDB4M0ZGQSwgMHg1ODczLCAweDAwMDAsIDB4RkZGRCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4RkZGRCwgMHg1NTc5LCAweEZGRkQsIDB4NDNCQSwKLSAgICAweEZGRkQsIDB4NEFCNCwgMHgwMDAwLCAweDAwMDAsIDB4ODFBQSwgMHg5OEY1LCAweDAwMDAsIDB4NjM3OSwKLSAgICAweDM5RkUsIDB4MDAwMCwgMHg4REMwLCAweDU2QTEsIDB4NjQ3QywgMHgzRTQzLCAweEZGRkQsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHhGRkZELCAweEZGRkQsIDB4MDAwMCwgMHgwMDAwLCAweDM5OTIsIDB4M0EwNiwKLSAgICAweDAwMDAsIDB4MzU3OCwgMHgwMDAwLCAweDAwMDAsIDB4RkZGRCwgMHhGRkZELCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDM0QkMsIDB4NkMzRCwgMHgwMDAwLCAweEZGRkQsIDB4RkZGRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4M0ExOCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5NUFBLCAweEZGRkQsIDB4MDAwMCwKLSAgICAweDcxNDAsIDB4RkZGRCwgMHg1MTU2LCAweDRFRkUsIDB4NTA4OCwgMHhGRkZELCAweDM0OTMsIDB4NTE4NiwKLSAgICAweDVFNDIsIDB4NTIwNSwgMHg1MjI3LCAweDUyNzksIDB4MDAwMCwgMHgzNTUzLCAweDUzQzIsIDB4NTM1RiwKLSAgICAweEZGRkQsIDB4NTUzRiwgMHhGRkZELCAweDU1RDgsIDB4MzVERCwgMHg1NjIxLCAweEZGRkQsIDB4NTY1NCwKLSAgICAweDAwMDAsIDB4RkZGRCwgMHgwMDAwLCAweEZGRkQsIDB4MDAwMCwgMHhGRkZELCAweEZGRkQsIDB4MzdCOSwKLSAgICAweDVDQzEsIDB4NUQxNSwgMHg1RDU2LCAweDM4MzgsIDB4NEU4MSwgMHg1RUJELCAweDM5MTQsIDB4NjFCOSwKLSAgICAweDYyOTAsIDB4NjMxOCwgMHg2NDVBLCAweDY0OTEsIDB4ODE2RCwgMHg4MTg0LCAweDgxOTMsIDB4NjgwMCwKLSAgICAweDNCQkMsIDB4NzI4RiwgMHg3MkNELCAweDAwMDAsIDB4NzMzOSwgMHg3NTQyLCAweDc1REMsIDB4M0ZDMCwKLSAgICAweDAwMDAsIDB4M0ZENywgMHhGRkZELCAweDc2ODAsIDB4NzY4QywgMHg0MEE4LCAweDc4MzksIDB4NDEwMywKLSAgICAweDdBOTEsIDB4N0MxQiwgMHg3Q0VELCAweDdGOTMsIDB4N0ZBRSwgMHhGRkZELCAweDgyRkYsIDB4NTg1RiwKLSAgICAweDg2QjIsIDB4NDVBQywgMHg4NzhCLCAweDg5NDcsIDB4RkZGRCwgMHg4QTI5LCAweEZGRkQsIDB4OEU3MSwKLSAgICAweDAwMDAsIDB4OEVCMCwgMHhGRkZELCAweDkxNUUsIDB4OTE4QywgMHg5OTBFLCAweDk5MUMsIDB4RkZGRCwKLSAgICAweEZGRkQsIDB4OUI4MSwgMHg5REMwLCAweDlEOTMsIDB4OUVBQywgMHg0RDkxLCAweEZGRkQsIDB4OTNCQSwKLSAgICAweDlFN0IsIDB4NzA4OSwgMHg3MzQ4LCAweEZGRkQsIDB4Nzk5OSwgMHg4RkI3LCAweEZGRkQsIDB4OTk0MiwKLSAgICAweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKLSAgICAweDAwMjgsIDB4MDAyOSwgMHgwMDJBLCAweDAwMkIsIDB4MDAyQywgMHgwMDJELCAweDAwMkUsIDB4MDAyRiwKLSAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKLSAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDNBLCAweDAwM0IsIDB4MDAzQywgMHgwMDNELCAweDAwM0UsIDB4MDAzRiwKLSAgICAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKLSAgICAweDAwNDgsIDB4MDA0OSwgMHgwMDRBLCAweDAwNEIsIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwKLSAgICAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKLSAgICAweDAwNTgsIDB4MDA1OSwgMHgwMDVBLCAweDAwNUIsIDB4MDA1QywgMHgwMDVELCAweDAwNUUsIDB4MDA1RiwKLSAgICAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKLSAgICAweDAwNjgsIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywgMHgwMDZELCAweDAwNkUsIDB4MDA2RiwKLSAgICAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKLSAgICAweDAwNzgsIDB4MDA3OSwgMHgwMDdBLCAweDAwN0IsIDB4MDA3QywgMHgwMDdELCAweDAwN0UsIDB4MDBBOSwKLSAgICAweDIxMjIsIDB4MjAyNiwgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwKLSAgICAweDAwMjYsIDB4MDAyNywgMHgwMDI4LCAweDAwMjksIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwKLSAgICAweDAwMkUsIDB4MDAyRiwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwKLSAgICAweDAwMzYsIDB4MDAzNywgMHgwMDM4LCAweDAwMzksIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwKLSAgICAweDAwM0UsIDB4MDAzRiwgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwKLSAgICAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwKLSAgICAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwKLSAgICAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgwMDVCLCAweDAwNUMsIDB4MDA1RCwKLSAgICAweDAwNUUsIDB4MDA1RiwgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwKLSAgICAweDAwNjYsIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwKLSAgICAweDAwNkUsIDB4MDA2RiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwKLSAgICAweDAwNzYsIDB4MDA3NywgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDdCLCAweDAwN0MsIDB4MDA3RCwKLSAgICAweDAwN0UsIDB4MjBBQywgMHgyMEFDLCAweDIxMTAsIDB4MjBBQywgMHgyMEFDLCAweDMwOUIsIDB4MzA5QywKLSAgICAweDJFODAsIDB4MzFDMCwgMHgzMUMxLCAweDMxQzIsIDB4MzFDMywgMHgzMUM0LCAweDAwMDAsIDB4MzFDNSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgzMUM2LCAweDMxQzcsIDB4MDAwMCwgMHgwMDAwLCAweDMxQzgsIDB4MDAwMCwKLSAgICAweDMxQzksIDB4MzFDQSwgMHgzMUNCLCAweDMxQ0MsIDB4MDAwMCwgMHgzMUNELCAweDMxQ0UsIDB4RjUzOCwKLSAgICAweEY1MzksIDB4MDAwMCwgMHgwMDAwLCAweDk3NTEsIDB4MDAwMCwgMHg0RTVCLCAweDRFQkIsIDB4MzUzRSwKLSAgICAweDVDMjMsIDB4NUY1MSwgMHg1RkM0LCAweDM4RkEsIDB4NjI0QywgMHg2NTM1LCAweDZCN0EsIDB4NkMzNSwKLSAgICAweDZDM0EsIDB4NzA2QywgMHg3MjJCLCAweDRFMkMsIDB4NzJBRCwgMHgwMDAwLCAweDdGNTIsIDB4NzkzQiwKLSAgICAweDdDRjksIDB4N0Y1MywgMHgwMDAwLCAweDM0QzEsIDB4MDAwMCwgMHg4MDAyLCAweDgwODAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4NTM1RCwgMHg4ODY0LCAweDg5QzEsIDB4MDAwMCwgMHg4QkEwLCAweDhEMUQsIDB4OTQ4NSwKLSAgICAweDk1NzgsIDB4OTU3RiwgMHg5NUU4LCAweDAwMDAsIDB4OTdFNiwgMHg5ODc1LCAweDk4Q0UsIDB4OThERSwKLSAgICAweDk5NjMsIDB4MDAwMCwgMHg5QzdDLCAweDlFMUYsIDB4OUVDNCwgMHg2QjZGLCAweEY5MDcsIDB4NEUzNywKLSAgICAweDAwMDAsIDB4OTYxRCwgMHg2MjM3LCAweDk0QTIsIDB4MkU4NCwgMHgyRTg2LCAweDJFODcsIDB4MkU4OCwKLSAgICAweDJFOEEsIDB4MkU4QywgMHgyRThELCAweDJFOTUsIDB4MkU5QywgMHgyRUE1LCAweDJFQTcsIDB4MkVBQSwKLSAgICAweDJFQUMsIDB4MkVBRSwgMHgyRUI2LCAweDJFQkMsIDB4MkVCRSwgMHgyRUNBLCAweDJFQ0MsIDB4MkVDRCwKLSAgICAweDJFQ0YsIDB4MkVENiwgMHgyRUQ3LCAweDJFREUsIDB4MDAwMCwgMHgwMDAwLCAweDY1MEEsIDB4NEUzRCwKLSAgICAweDZFREQsIDB4OUQ0RSwgMHg5MURGLCAweDAwMDAsIDB4NEYxQSwgMHg0RjI4LCAweDRGQTgsIDB4NTE3NCwKLSAgICAweDUxOUMsIDB4NTFFNCwgMHg1MkExLCAweDUyQTgsIDB4NTMzQiwgMHg1MzRFLCAweDUzRDEsIDB4NTNEOCwKLSAgICAweDU2RTIsIDB4NThGMCwgMHg1OTA0LCAweDU5MDcsIDB4NTkzMiwgMHg1OTM0LCAweDVCNjYsIDB4NUI5RSwKLSAgICAweDVCOUYsIDB4NUM5QSwgMHg1RTg2LCAweDYwM0IsIDB4NjU4OSwgMHg2N0ZFLCAweDY4MDQsIDB4Njg2NSwKLSAgICAweDZENEUsIDB4NzBCQywgMHg3NTM1LCAweDdFQTQsIDB4N0VBQywgMHg3RUJBLCAweDdFQzcsIDB4N0VDRiwKLSAgICAweDdFREYsIDB4N0YwNiwgMHg3RjM3LCAweDgyN0EsIDB4ODJDRiwgMHg4MzZGLCAweDg5QzYsIDB4OEJCRSwKLSAgICAweDhCRTIsIDB4OEY2NiwgMHg4RjY3LCAweDhGNkUsIDB4NzQxMSwgMHg3Q0ZDLCAweDdEQ0QsIDB4Njk0NiwKLSAgICAweDdBQzksIDB4NzhCOCwgMHg4MEJDLCAweDhEMEIsIDB4ODBGNiwgMHgwMDAwLCAweDgwOUYsIDB4OUVDNywKLSAgICAweDRDQ0QsIDB4OURDOSwgMHg5RTBDLCAweDRDM0UsIDB4MDAwMCwgMHgwMDAwLCAweDlFMEEsIDB4MDAwMCwKLSAgICAweDM1QzEsIDB4NkU5QSwgMHg4MjNFLCAweDc1MTksIDB4NDkxMSwgMHg5QTZDLCAweDlBOEYsIDB4OUY5OSwKLSAgICAweDc5ODcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg0RTI0LCAweDRFODAsIDB4NEU4NywKLSAgICAweDRFQkYsIDB4NEVFQiwgMHg0RjM3LCAweDM0NEMsIDB4NEZCRCwgMHgzRTQ4LCAweDUwMDMsIDB4MzQ3RCwKLSAgICAweDM0QTUsIDB4NTkwNSwgMHg1MURCLCAweDUxRkMsIDB4NEU4OSwgMHg1MjkwLCAweDUzMjcsIDB4MzVDNywKLSAgICAweDUzQTksIDB4MzU1MSwgMHg1M0IwLCAweDU0MjMsIDB4MzU2RCwgMHgzNTcyLCAweDM2ODEsIDB4NTQ5MywKLSAgICAweDU0QTMsIDB4NTRCNCwgMHg1NEI5LCAweDU0RDAsIDB4NTRFRiwgMHg1NTE4LCAweDU1MjMsIDB4NTUyOCwKLSAgICAweDM1OTgsIDB4MzVBNSwgMHgzNUJGLCAweDU1RDcsIDB4MzVDNSwgMHgwMDAwLCAweDQwNTMsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDQwQkIsIDB4MDAwMCwgMHg1NjUyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDM1RkIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzRjkzLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4M0ZGOSwKLSAgICAweDAwMDAsIDB4NjQzMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg1NENDLCAweDgyQzQsIDB4NTVCOSwgMHgwMDAwLCAweDlDMjYsIDB4OUFCNiwKLSAgICAweDAwMDAsIDB4ODBFQywgMHg1QzFDLCAweDAwMDAsIDB4ODEzNCwgMHgzNzk3LCAweDAwMDAsIDB4OTFCNiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzNjA5LCAweDAwMDAsIDB4NTZBRiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDVBNTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDU3OUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MzcwMywKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDU4OTksIDB4NTI2OCwgMHgzNjFBLCAweDAwMDAsIDB4N0JCMiwgMHg1QjY4LCAweDQ4MDAsIDB4NEIyQywKLSAgICAweDlGMjcsIDB4NDlFNywgMHg5QzFGLCAweDlCOEQsIDB4MDAwMCwgMHgwMDAwLCAweDU1RkIsIDB4MzVGMiwKLSAgICAweDU2ODksIDB4NUQzRSwgMHg1RDQ4LCAweDNERkMsIDB4MzgwRiwgMHg1REE0LCAweDVEQjksIDB4MzgyMCwKLSAgICAweDVGMjUsIDB4NUY4MywgMHgzOTA4LCAweDM5M0YsIDB4Mzk0RCwgMHg2MEQ3LCAweDYxM0QsIDB4NUNFNSwKLSAgICAweDM5ODksIDB4NjFCNywgMHg2MUNGLCAweDM5QjgsIDB4NjIyQywgMHg2MkU1LCAweDM5RjgsIDB4NTZCMSwKLSAgICAweDNBMDMsIDB4NjNFMiwgMHg2M0ZCLCAweDY0MDcsIDB4M0E0QiwgMHg2NEMwLCAweDlGOUYsIDB4M0E5NywKLSAgICAweDY1ODYsIDB4M0FCRCwgMHg2NUZGLCAweDY2NTMsIDB4M0FGMiwgMHg2NjkyLCAweDNCMjIsIDB4NjcxNiwKLSAgICAweDNCNDIsIDB4NjdBNCwgMHgzQjU4LCAweDY4NEEsIDB4Njg4NCwgMHgzQjcyLCAweDNCNzEsIDB4M0I3QiwKLSAgICAweDY5MDksIDB4Njk0MywgMHg3MjVDLCAweDY5NjQsIDB4Njk5RiwgMHg2OTg1LCAweDY5RDYsIDB4M0JERCwKLSAgICAweDZBNjUsIDB4NkE3NCwgMHg2QTcxLCAweDZBODIsIDB4M0JFQywgMHg2QTk5LCAweDNCRjIsIDB4NkFBQiwKLSAgICAweDZBQjUsIDB4NkFENCwgMHg2QUY2LCAweDZCODEsIDB4NkJDMSwgMHg2QkVBLCAweDZDNzUsIDB4NkNBQSwKLSAgICAweDNDQ0IsIDB4NkQwMiwgMHg2RDA2LCAweDZEMjYsIDB4NkQ4MSwgMHgzQ0VGLCAweDZEQTQsIDB4NkRCMSwKLSAgICAweDZFMTUsIDB4NkUxOCwgMHg2RTI5LCAweDZFODYsIDB4MDAwMCwgMHg2RUJCLCAweDZFRTIsIDB4NkVEQSwKLSAgICAweDlGN0YsIDB4NkVFOCwgMHg2RUU5LCAweDZGMjQsIDB4NkYzNCwgMHgzRDQ2LCAweDAwMDAsIDB4NkY4MSwKLSAgICAweDZGQkUsIDB4M0Q2QSwgMHgzRDc1LCAweDcxQjcsIDB4NUM5OSwgMHgzRDhBLCAweDcwMkMsIDB4M0Q5MSwKLSAgICAweDcwNTAsIDB4NzA1NCwgMHg3MDZGLCAweDcwN0YsIDB4MDAwMCwgMHg0M0MxLCAweDM1RjEsIDB4MDAwMCwKLSAgICAweDM2NEUsIDB4M0RBRCwgMHgwMDAwLCAweDY2N0QsIDB4N0M3NCwgMHg3NDhELCAweDdFOTIsIDB4NDUwMywKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDM0N0UsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc3MSwKLSAgICAweDYzQzEsIDB4Nzc3NywgMHg4OThBLCAweDAwMDAsIDB4OEI0QywgMHgwMDAwLCAweDQ5MkEsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgzQUYwLCAweDcwOEYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4Njg4OCwKLSAgICAweDAwMDAsIDB4OUY2MiwgMHg5M0M2LCAweDAwMDAsIDB4OTM2NiwgMHg5MjhGLCAweDg2MTQsIDB4MDAwMCwKLSAgICAweDQxOTAsIDB4Njc4RiwgMHg2ODFFLCAweDM4NjMsIDB4MDAwMCwgMHgzQjE5LCAweDg0OTYsIDB4MDAwMCwKLSAgICAweDM5RTIsIDB4ODQ4MCwgMHg0MzZFLCAweDk3NzEsIDB4OTk5QiwgMHg0OTJELCAweDZGMTcsIDB4MDAwMCwKLSAgICAweDcwQTYsIDB4MDAwMCwgMHg3RTY1LCAweDVEMkYsIDB4M0RGMywgMHgwMDAwLCAweDAwMDAsIDB4N0RBNCwKLSAgICAweDg0MjYsIDB4NTQ4NSwgMHgwMDAwLCAweDAwMDAsIDB4NTc3RSwgMHgwMDAwLCAweDAwMDAsIDB4M0ZFNSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg3MDAzLCAweDAwMDAsIDB4NUQ3MCwgMHg3MzhGLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDRGQzgsIDB4N0ZFNywgMHg3MzEwLCAweDczMzgsIDB4NzM0MSwgMHgzRUE5LCAweDcxRjUsIDB4MDAwMCwKLSAgICAweDczRTEsIDB4M0VDQSwgMHgzRUQxLCAweDc0MTksIDB4NzQxRSwgMHg3NDFGLCAweDNFRTIsIDB4M0VGMCwKLSAgICAweDNFRjQsIDB4M0VGQSwgMHg3NEQzLCAweDNGMEUsIDB4M0Y1MywgMHg3NTZELCAweDc1NzIsIDB4NzU4RCwKLSAgICAweDNGN0MsIDB4NzVDOCwgMHg3NjRELCAweDc2NzQsIDB4M0ZEQywgMHg3NjdBLCAweDcxODgsIDB4NTYyMywKLSAgICAweDg5ODAsIDB4NDAxRCwgMHg3NzQzLCAweDQwMzksIDB4NDA0NSwgMHgzNURCLCAweDc3OTgsIDB4NDA2QSwKLSAgICAweDQwNkYsIDB4NzdCRSwgMHg3N0NCLCAweDc4MTgsIDB4NzgxQywgMHg3ODQ3LCAweDc4NTEsIDB4Nzg2NiwKLSAgICAweDg0NDgsIDB4MDAwMCwgMHg3OTMzLCAweDc5MzIsIDB4NDEwOSwgMHg3OTkxLCAweDdBMDYsIDB4NDE2NywKLSAgICAweDQxQjIsIDB4N0FCQywgMHg4Mjc5LCAweDQxQzQsIDB4N0FDRiwgMHg3QURCLCAweDQxQ0YsIDB4N0I2MiwKLSAgICAweDdCNkMsIDB4N0I3QiwgMHg3QzEyLCAweDQyNjAsIDB4NDI3QSwgMHg3QzdCLCAweDdDOUMsIDB4NDI4QywKLSAgICAweDdDQjgsIDB4NDI5NCwgMHg4RjkzLCAweDcwQzAsIDB4MDAwMCwgMHg3RENGLCAweDdERDQsIDB4N0REMCwKLSAgICAweDdERkQsIDB4N0ZCNCwgMHg3MjlGLCAweDQzOTcsIDB4ODAyMCwgMHg4MDI1LCAweDgwMkUsIDB4ODAzMSwKLSAgICAweDgwNTQsIDB4NTdCNCwgMHg3MEEwLCAweDgwQjcsIDB4ODBFOSwgMHg0M0VELCAweDgxMEMsIDB4ODEwRSwKLSAgICAweDgxMTIsIDB4ODExNCwgMHg0NDAxLCAweDNCMzksIDB4ODE1NiwgMHg4MTU5LCAweDgxNUEsIDB4NDQxMywKLSAgICAweDgxN0MsIDB4NDQyNSwgMHg0NDJELCAweDgxQTUsIDB4NTdFRiwgMHg4MUMxLCAweDgxRTQsIDB4ODI1NCwKLSAgICAweDQ0OEYsIDB4ODI3NiwgMHg4MkNBLCAweDgyRDgsIDB4NDRCMCwgMHg4MzU3LCAweDk2NjksIDB4ODQwNSwKLSAgICAweDcwRjUsIDB4ODQ2NCwgMHg4NDg4LCAweDQ1MDQsIDB4ODRCRSwgMHg4NEUxLCAweDg0RjgsIDB4ODUxMCwKLSAgICAweDg1MzgsIDB4ODU1MiwgMHg0NTNCLCAweDg1NkYsIDB4ODU3MCwgMHg4NUUwLCAweDQ1NzcsIDB4ODY3MiwKLSAgICAweDg2OTIsIDB4ODZFRiwgMHg5NjQ1LCAweDQ2MDYsIDB4NDYxNywgMHg4OEFFLCAweDg4RkYsIDB4ODkyNCwKLSAgICAweDg5OTEsIDB4MDAwMCwgMHg4QTM4LCAweDhBOTQsIDB4OEFCNCwgMHg4QzUxLCAweDhDRDQsIDB4OENGMiwKLSAgICAweDhEMUMsIDB4NDc5OCwgMHg4REMzLCAweDQ3RUQsIDB4OEUzQSwgMHg1NzU0LCAweDU1RjUsIDB4NDgzNywKLSAgICAweDhFQ0UsIDB4OEVFMiwgMHg4RUU0LCAweDhFRUQsIDB4OEVGMiwgMHg4RkMxLCAweDhGQ0EsIDB4OEZDQywKLSAgICAweDkwMzMsIDB4NDhBRCwgMHg5OEUwLCAweDkyMTMsIDB4NDkxRSwgMHg5MjI4LCAweDkyNTgsIDB4OTI2QiwKLSAgICAweDkyQjEsIDB4OTJBRSwgMHg5MkJGLCAweDkyRTMsIDB4OTJFQiwgMHg5MkYzLCAweDkyRjQsIDB4OTJGRCwKLSAgICAweDkzNDMsIDB4OTM4NCwgMHg5M0FELCAweDQ5NDUsIDB4NDk1MSwgMHg5NDE3LCAweDk0MUQsIDB4OTQyRCwKLSAgICAweDk0M0UsIDB4NDk2QSwgMHg5NDU0LCAweDk0NzksIDB4OTUyRCwgMHg5NUEyLCAweDQ5QTcsIDB4OTVGNCwKLSAgICAweDk2MzMsIDB4NDlFNSwgMHg0QTI0LCAweDk3NDAsIDB4NEEzNSwgMHg5N0IyLCAweDk3QzIsIDB4NEFFNCwKLSAgICAweDk4QjksIDB4NEIxOSwgMHg5OEYxLCAweDU4NDQsIDB4OTkxOSwgMHg5OTM3LCAweDk5NUQsIDB4OTk2MiwKLSAgICAweDRCNzAsIDB4OTlDNSwgMHg0QjlELCAweDlBM0MsIDB4OUIwRiwgMHg5QjY5LCAweDlCREQsIDB4OUJGMSwKLSAgICAweDlCRjQsIDB4NEM2RCwgMHg5QzIwLCAweDM3NkYsIDB4MDAwMCwgMHg5RDQ5LCAweDlFRkUsIDB4NTY1MCwKLSAgICAweDlEQkQsIDB4OURGQywgMHg5NEY2LCAweDhGQjYsIDB4OUVCMSwgMHg5RUJELCAweDlFQzYsIDB4OTREQywKLSAgICAweDlFRTIsIDB4OUVGMSwgMHg5RUY4LCAweDlGNDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTRDMywKLSAgICAweDAwMDAsIDB4OTRDMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDU3NTcsIDB4NzE3MywKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg1NDlFLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDM2NDcsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg1MzY0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg3MEJCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg3MTk4LCAweDAwMDAsIDB4NjlFOSwKLSAgICAweDM2QzgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDU4QjUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDU3ODgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg1OTY1LCAweDAwMDAsIDB4MDAwMCwgMHg1NzNGLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NTdBMSwgMHg3MTUxLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NTZCOSwKLSAgICAweDAwMDAsIDB4MzYxOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5NDlGLCAweDAwMDAsIDB4MzZCOSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg1NkQ2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NjNFNiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDNERjcsIDB4MDAwMCwgMHgwMDAwLCAweDhGRDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDdFOUYsIDB4MDAwMCwgMHgwMDAwLCAweDRDQTQsIDB4OTU0NywKLSAgICAweDAwMDAsIDB4NzFBMiwgMHgwMDAwLCAweDAwMDAsIDB4NEQ5QywgMHgwMDAwLCAweDhGQkUsIDB4OEZCQSwKLSAgICAweDAwMDAsIDB4OEZCOSwgMHgwMDAwLCAweDRFRUEsIDB4MDAwMCwgMHg4RTgwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg0RTlBLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDNEQzYsIDB4MDAwMCwKLSAgICAweDRFMUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg1NURFLCAweDg3ODYsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4NUI5MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg0RTFBLCAweDRFMDQsIDB4NUIwRCwKLSAgICAweDM2QUMsIDB4NTM3RCwgMHgzNkE1LCAweDU4OUEsIDB4MDAwMCwgMHg1N0FBLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NTdBNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDlDMUIsIDB4MDAwMCwgMHgzRTA2LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg1NzdBLCAweDU0REEsIDB4NzE3QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDM2MzUsIDB4MDAwMCwKLSAgICAweDUyMjAsIDB4M0MxOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDQ1NjIsIDB4NUIxRiwgMHgwMDAwLCAweDlGNTAsIDB4OUVBNiwgMHgwMDAwLCAweDUxRTIsIDB4NTM0MiwKLSAgICAweDY2QUQsIDB4NTg1QywgMHg1NTUzLCAweDNEODUsIDB4NjE2MCwgMHg0OEFFLCAweDk3QkQsIDB4MDAwMCwKLSAgICAweDYwQjMsIDB4ODQyNCwgMHg5ODE0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDNCMkIsIDB4M0QzMiwKLSAgICAweDAwMDAsIDB4NzA4MSwgMHg1QzlDLCAweDAwMDAsIDB4MzczMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDEwMCwgMHgwMEMxLCAweDAxQ0QsIDB4MDBDMCwgMHgwMTEyLCAweDAwQzksIDB4MDExQSwKLSAgICAweDAwQzgsIDB4MDE0QywgMHgwMEQzLCAweDAxRDEsIDB4MDBEMiwgMHhGMzI1LCAweDFFQkUsIDB4RjMyNywKLSAgICAweDFFQzAsIDB4MDBDQSwgMHgwMTAxLCAweDAwRTEsIDB4MDFDRSwgMHgwMEUwLCAweDAyNTEsIDB4MDExMywKLSAgICAweDAwRTksIDB4MDExQiwgMHgwMEU4LCAweDAxMkIsIDB4MDBFRCwgMHgwMUQwLCAweDAwRUMsIDB4MDE0RCwKLSAgICAweDAwRjMsIDB4MDFEMiwgMHgwMEYyLCAweDAxNkIsIDB4MDBGQSwgMHgwMUQ0LCAweDAwRjksIDB4MDFENiwKLSAgICAweDAxRDgsIDB4MDFEQSwgMHgwMURDLCAweDAwRkMsIDB4RjM0NCwgMHgxRUJGLCAweEYzNDYsIDB4MUVDMSwKLSAgICAweDAwRUEsIDB4MDI2MSwgMHgwMjgzLCAweDAyNTAsIDB4MDI1QiwgMHgwMjU0LCAweDAyNzUsIDB4MDE1MywKLSAgICAweDAwRjgsIDB4MDE0QiwgMHgwMjhBLCAweDAyNkEsIDB4MjNEQSwgMHgyM0RCLCAweDJFOUQsIDB4MkVDNiwKLSAgICAweDJFRTMsIDB4NTAzQiwgMHg2REZFLCAweDAwMDAsIDB4OUZBNiwgMHgzREM5LCAweDg4OEYsIDB4MDAwMCwKLSAgICAweDcwNzcsIDB4NUNGNSwgMHg0QjIwLCAweDAwMDAsIDB4MzU1OSwgMHgwMDAwLCAweDYxMjIsIDB4MDAwMCwKLSAgICAweDhGQTcsIDB4OTFGNiwgMHg3MTkxLCAweDY3MTksIDB4NzNCQSwgMHgwMDAwLCAweDAwMDAsIDB4M0M4QiwKLSAgICAweDAwMDAsIDB4NEIxMCwgMHg3OEU0LCAweDc0MDIsIDB4NTFBRSwgMHgwMDAwLCAweDQwMDksIDB4NkE2MywKLSAgICAweDAwMDAsIDB4NDIyMywgMHg4NjBGLCAweDdBMkEsIDB4MDAwMCwgMHgwMDAwLCAweDk3NTUsIDB4NzA0RCwKLSAgICAweDUzMjQsIDB4MDAwMCwgMHg5M0Y0LCAweDc2RDksIDB4MDAwMCwgMHg5RkE3LCAweDc3REQsIDB4NEVBMywKLSAgICAweDRGRjAsIDB4NTBCQywgMHg0RTJGLCAweDRGMTcsIDB4OUZBOCwgMHg1NDM0LCAweDdEOEIsIDB4NTg5MiwKLSAgICAweDU4RDAsIDB4MDAwMCwgMHg1RTkyLCAweDVFOTksIDB4NUZDMiwgMHgwMDAwLCAweDY1OEIsIDB4MDAwMCwKLSAgICAweDY5MTksIDB4NkE0MywgMHgwMDAwLCAweDZDRkYsIDB4NzIwMCwgMHgwMDAwLCAweDczOEMsIDB4M0VEQiwKLSAgICAweDAwMDAsIDB4NUIxNSwgMHg3NEI5LCAweDhCODMsIDB4MDAwMCwgMHgwMDAwLCAweDdBOTMsIDB4N0JFQywKLSAgICAweDdDQzMsIDB4N0U2QywgMHg4MkY4LCAweDg1OTcsIDB4OUZBOSwgMHg4ODkwLCAweDlGQUEsIDB4OEVCOSwKLSAgICAweDlGQUIsIDB4OEZDRiwgMHg4NTVGLCAweDk5RTAsIDB4OTIyMSwgMHg5RkFDLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDQwNzEsIDB4NDJBMiwgMHg1QTFBLCAweDk4NjgsIDB4Njc2QiwgMHg0Mjc2LCAweDU3M0QsIDB4ODVENiwKLSAgICAweDAwMDAsIDB4ODJCRiwgMHgwMDAwLCAweDRDODEsIDB4MDAwMCwgMHg1RDdCLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDlGQUQsIDB4OUZBRSwgMHg1Qjk2LCAweDlGQUYsIDB4N0U1QiwgMHg0M0YwLCAweDRDMzIsIDB4NDYwMywKLSAgICAweDQ1QTYsIDB4NDU3OCwgMHgwMDAwLCAweDRENzcsIDB4NDVCMywgMHgwMDAwLCAweDRDRTIsIDB4MDAwMCwKLSAgICAweDNCOTUsIDB4NDczNiwgMHg0NzQ0LCAweDRDNDcsIDB4NEM0MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg0QzU3LCAweDAwMDAsIDB4NDc0RiwgMHg0NURBLCAweDRDODUsIDB4MDAwMCwKLSAgICAweDREMDcsIDB4NEFBNCwgMHg0NkExLCAweDAwMDAsIDB4NzIyNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4NjY0RCwgMHg1NkZCLCAweDdEOTUsIDB4NTkxRCwgMHgwMDAwLCAweDNERjQsIDB4OTczNCwKLSAgICAweDAwMDAsIDB4NUJEQiwgMHgwMDAwLCAweDVBQTQsIDB4MzYyNSwgMHgwMDAwLCAweDVBRDEsIDB4NUJCNywKLSAgICAweDVDRkMsIDB4Njc2RSwgMHg4NTkzLCAweDAwMDAsIDB4NzQ2MSwgMHg3NDlELCAweDAwMDAsIDB4NjZFNywKLSAgICAweDZFNTcsIDB4NzlDQSwgMHgzRDg4LCAweDQ0QzMsIDB4MDAwMCwgMHgwMDAwLCAweDQzOUEsIDB4NDUzNiwKLSAgICAweDVDRDUsIDB4MDAwMCwgMHg4QUY5LCAweDVDNzgsIDB4M0QxMiwgMHgwMDAwLCAweDVENzgsIDB4OUZCMiwKLSAgICAweDcxNTcsIDB4NDU1OCwgMHgwMDAwLCAweDAwMDAsIDB4NEM3NywgMHgzOTc4LCAweDM0NEEsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEFDQywgMHg0RkI0LCAweDAwMDAsIDB4NTlCRiwgMHg4MTZDLCAweDk4NTYsIDB4MDAwMCwKLSAgICAweDVGM0IsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NDEwMiwgMHg0NkJCLCAweDAwMDAsIDB4M0YwNywKLSAgICAweDlGQjMsIDB4MDAwMCwgMHg0MEY4LCAweDM3RDYsIDB4NDZGNywgMHgwMDAwLCAweDQxN0MsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4NDU2RCwgMHgzOEQ0LCAweDAwMDAsIDB4NDU2MSwgMHg0NTFCLCAweDREODksIDB4NEM3QiwKKyNpbmNsdWRlICJjbWFwc19jbnMxLmgiCisKK2NvbnN0IEZYX1dPUkQgZ19GWENNQVBfQ05TMUNJRDJVbmljb2RlXzVbMTkwODhdID0geworICAgIDB4RkZGRCwgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisgICAgMHgwMDI4LCAweDAwMjksIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLCAweDAwMkYsIDB4MDAzMCwKKyAgICAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LAorICAgIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLCAweDAwM0YsIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsCisgICAgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwKKyAgICAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LAorICAgIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MDA1QiwgMHgwMDVDLCAweDAwNUQsCisgICAgMHgwMDVFLCAweDAwNUYsIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwKKyAgICAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsIDB4MDA2RSwgMHgwMDZGLAorICAgIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LCAweDAwNzgsCisgICAgMHgwMDc5LCAweDAwN0EsIDB4MDA3QiwgMHgwMDdDLCAweDAwN0QsIDB4MDA3RSwgMHgwMEE5LCAweDIxMjIsIDB4MjAyNiwKKyAgICAweDMwMDAsIDB4RkYwQywgMHgzMDAxLCAweDMwMDIsIDB4RkYwRSwgMHgyMDI3LCAweEZGMUIsIDB4RkYxQSwgMHhGRjFGLAorICAgIDB4RkYwMSwgMHhGRTMwLCAweDIyRUYsIDB4MjAyNSwgMHhGRTUwLCAweEZFNTEsIDB4RkU1MiwgMHgwMEI3LCAweEZFNTQsCisgICAgMHhGRTU1LCAweEZFNTYsIDB4RkU1NywgMHhGRjVDLCAweDIwMTMsIDB4RkUzMSwgMHgyMDE0LCAweEZGRkQsIDB4RkZGRCwKKyAgICAweEZGRkQsIDB4RkZGRCwgMHhGRjA4LCAweEZGMDksIDB4RkUzNSwgMHhGRTM2LCAweEZGNUIsIDB4RkY1RCwgMHhGRTM3LAorICAgIDB4RkUzOCwgMHgzMDE0LCAweDMwMTUsIDB4RkUzOSwgMHhGRTNBLCAweDMwMTAsIDB4MzAxMSwgMHhGRTNCLCAweEZFM0MsCisgICAgMHgzMDBBLCAweDMwMEIsIDB4RkUzRCwgMHhGRTNFLCAweDMwMDgsIDB4MzAwOSwgMHhGRTNGLCAweEZFNDAsIDB4MzAwQywKKyAgICAweDMwMEQsIDB4RkU0MSwgMHhGRTQyLCAweDMwMEUsIDB4MzAwRiwgMHhGRTQzLCAweEZFNDQsIDB4RkU1OSwgMHhGRTVBLAorICAgIDB4RkU1QiwgMHhGRTVDLCAweEZFNUQsIDB4RkU1RSwgMHgyMDE4LCAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDMwMUQsCisgICAgMHgzMDFFLCAweDIwMzUsIDB4MjAzMiwgMHhGRjAzLCAweEZGMDYsIDB4RkYwQSwgMHgyMDNCLCAweDAwQTcsIDB4MzAwMywKKyAgICAweDI1Q0IsIDB4MjVDRiwgMHgyNUIzLCAweDI1QjIsIDB4MjVDRSwgMHgyNjA2LCAweDI2MDUsIDB4MjVDNywgMHgyNUM2LAorICAgIDB4MjVBMSwgMHgyNUEwLCAweDI1QkQsIDB4MjVCQywgMHgzMkEzLCAweDIxMDUsIDB4MjAzRSwgMHhGRkUzLCAweEZGM0YsCisgICAgMHgwMkNELCAweEZFNDksIDB4RkU0QSwgMHhGRTRELCAweEZFNEUsIDB4RkU0QiwgMHhGRTRDLCAweEZFNUYsIDB4RkU2MCwKKyAgICAweEZFNjEsIDB4RkYwQiwgMHhGRjBELCAweDAwRDcsIDB4MDBGNywgMHgwMEIxLCAweDIyMUEsIDB4RkYxQywgMHhGRjFFLAorICAgIDB4RkYxRCwgMHgyMjY2LCAweDIyNjcsIDB4MjI2MCwgMHgyMjFFLCAweDIyNTIsIDB4MjI2MSwgMHhGRTYyLCAweEZFNjMsCisgICAgMHhGRTY0LCAweEZFNjUsIDB4RkU2NiwgMHgyMjNDLCAweDIyMjksIDB4MjIyQSwgMHgyMkE1LCAweDIyMjAsIDB4MjIxRiwKKyAgICAweDIyQkYsIDB4MzNEMiwgMHgzM0QxLCAweDIyMkIsIDB4MjIyRSwgMHgyMjM1LCAweDIyMzQsIDB4MjY0MCwgMHgyNjQyLAorICAgIDB4MjI5NSwgMHgyNjA5LCAweDIxOTEsIDB4MjE5MywgMHgyMTkyLCAweDIxOTAsIDB4MjE5NiwgMHgyMTk3LCAweDIxOTksCisgICAgMHgyMTk4LCAweDIyMjUsIDB4MjIyMywgMHhGRjBGLCAweEZGM0MsIDB4RkYwRiwgMHhGRjNDLCAweEZGMDQsIDB4MDBBNSwKKyAgICAweDMwMTIsIDB4MDBBMiwgMHgwMEEzLCAweEZGMDUsIDB4RkYyMCwgMHgyMTAzLCAweDIxMDksIDB4RkU2OSwgMHhGRTZBLAorICAgIDB4RkU2QiwgMHgzM0Q1LCAweDMzOUMsIDB4MzM5RCwgMHgzMzlFLCAweDMzQ0UsIDB4MzNBMSwgMHgzMzhFLCAweDMzOEYsCisgICAgMHgzM0M0LCAweDAwQjAsIDB4NTE1OSwgMHg1MTVCLCAweDUxNUUsIDB4NTE1RCwgMHg1MTYxLCAweDUxNjMsIDB4NTVFNywKKyAgICAweDc0RTksIDB4N0NDRSwgMHgyNTgxLCAweDI1ODIsIDB4MjU4MywgMHgyNTg0LCAweDI1ODUsIDB4MjU4NiwgMHgyNTg3LAorICAgIDB4MjU4OCwgMHgyNThGLCAweDI1OEUsIDB4MjU4RCwgMHgyNThDLCAweDI1OEIsIDB4MjU4QSwgMHgyNTg5LCAweDI1M0MsCisgICAgMHgyNTM0LCAweDI1MkMsIDB4MjUyNCwgMHgyNTFDLCAweDI1OTQsIDB4MjUwMCwgMHgyNTAyLCAweDI1OTUsIDB4MjUwQywKKyAgICAweDI1MTAsIDB4MjUxNCwgMHgyNTE4LCAweDI1NkQsIDB4MjU2RSwgMHgyNTcwLCAweDI1NkYsIDB4MjU1MCwgMHgyNTVFLAorICAgIDB4MjU2QSwgMHgyNTYxLCAweDI1RTIsIDB4MjVFMywgMHgyNUU1LCAweDI1RTQsIDB4MjU3MSwgMHgyNTcyLCAweDI1NzMsCisgICAgMHhGRjEwLCAweEZGMTEsIDB4RkYxMiwgMHhGRjEzLCAweEZGMTQsIDB4RkYxNSwgMHhGRjE2LCAweEZGMTcsIDB4RkYxOCwKKyAgICAweEZGMTksIDB4MjE2MCwgMHgyMTYxLCAweDIxNjIsIDB4MjE2MywgMHgyMTY0LCAweDIxNjUsIDB4MjE2NiwgMHgyMTY3LAorICAgIDB4MjE2OCwgMHgyMTY5LCAweDMwMjEsIDB4MzAyMiwgMHgzMDIzLCAweDMwMjQsIDB4MzAyNSwgMHgzMDI2LCAweDMwMjcsCisgICAgMHgzMDI4LCAweDMwMjksIDB4MzAzOCwgMHg1MzQ0LCAweDMwM0EsIDB4RkYyMSwgMHhGRjIyLCAweEZGMjMsIDB4RkYyNCwKKyAgICAweEZGMjUsIDB4RkYyNiwgMHhGRjI3LCAweEZGMjgsIDB4RkYyOSwgMHhGRjJBLCAweEZGMkIsIDB4RkYyQywgMHhGRjJELAorICAgIDB4RkYyRSwgMHhGRjJGLCAweEZGMzAsIDB4RkYzMSwgMHhGRjMyLCAweEZGMzMsIDB4RkYzNCwgMHhGRjM1LCAweEZGMzYsCisgICAgMHhGRjM3LCAweEZGMzgsIDB4RkYzOSwgMHhGRjNBLCAweEZGNDEsIDB4RkY0MiwgMHhGRjQzLCAweEZGNDQsIDB4RkY0NSwKKyAgICAweEZGNDYsIDB4RkY0NywgMHhGRjQ4LCAweEZGNDksIDB4RkY0QSwgMHhGRjRCLCAweEZGNEMsIDB4RkY0RCwgMHhGRjRFLAorICAgIDB4RkY0RiwgMHhGRjUwLCAweEZGNTEsIDB4RkY1MiwgMHhGRjUzLCAweEZGNTQsIDB4RkY1NSwgMHhGRjU2LCAweEZGNTcsCisgICAgMHhGRjU4LCAweEZGNTksIDB4RkY1QSwgMHgwMzkxLCAweDAzOTIsIDB4MDM5MywgMHgwMzk0LCAweDAzOTUsIDB4MDM5NiwKKyAgICAweDAzOTcsIDB4MDM5OCwgMHgwMzk5LCAweDAzOUEsIDB4MDM5QiwgMHgwMzlDLCAweDAzOUQsIDB4MDM5RSwgMHgwMzlGLAorICAgIDB4MDNBMCwgMHgwM0ExLCAweDAzQTMsIDB4MDNBNCwgMHgwM0E1LCAweDAzQTYsIDB4MDNBNywgMHgwM0E4LCAweDAzQTksCisgICAgMHgwM0IxLCAweDAzQjIsIDB4MDNCMywgMHgwM0I0LCAweDAzQjUsIDB4MDNCNiwgMHgwM0I3LCAweDAzQjgsIDB4MDNCOSwKKyAgICAweDAzQkEsIDB4MDNCQiwgMHgwM0JDLCAweDAzQkQsIDB4MDNCRSwgMHgwM0JGLCAweDAzQzAsIDB4MDNDMSwgMHgwM0MzLAorICAgIDB4MDNDNCwgMHgwM0M1LCAweDAzQzYsIDB4MDNDNywgMHgwM0M4LCAweDAzQzksIDB4MzEwNSwgMHgzMTA2LCAweDMxMDcsCisgICAgMHgzMTA4LCAweDMxMDksIDB4MzEwQSwgMHgzMTBCLCAweDMxMEMsIDB4MzEwRCwgMHgzMTBFLCAweDMxMEYsIDB4MzExMCwKKyAgICAweDMxMTEsIDB4MzExMiwgMHgzMTEzLCAweDMxMTQsIDB4MzExNSwgMHgzMTE2LCAweDMxMTcsIDB4MzExOCwgMHgzMTE5LAorICAgIDB4MzExQSwgMHgzMTFCLCAweDMxMUMsIDB4MzExRCwgMHgzMTFFLCAweDMxMUYsIDB4MzEyMCwgMHgzMTIxLCAweDMxMjIsCisgICAgMHgzMTIzLCAweDMxMjQsIDB4MzEyNSwgMHgzMTI2LCAweDMxMjcsIDB4MzEyOCwgMHgzMTI5LCAweDAyRDksIDB4MDJDQSwKKyAgICAweDAyQzcsIDB4MDJDQiwgMHgyNDYwLCAweDI0NjEsIDB4MjQ2MiwgMHgyNDYzLCAweDI0NjQsIDB4MjQ2NSwgMHgyNDY2LAorICAgIDB4MjQ2NywgMHgyNDY4LCAweDI0NjksIDB4MjQ3NCwgMHgyNDc1LCAweDI0NzYsIDB4MjQ3NywgMHgyNDc4LCAweDI0NzksCisgICAgMHgyNDdBLCAweDI0N0IsIDB4MjQ3QywgMHgyNDdELCAweDIxNzAsIDB4MjE3MSwgMHgyMTcyLCAweDIxNzMsIDB4MjE3NCwKKyAgICAweDIxNzUsIDB4MjE3NiwgMHgyMTc3LCAweDIxNzgsIDB4MjE3OSwgMHg0RTI4LCAweDRFMzYsIDB4NEUzRiwgMHg0RTg1LAorICAgIDB4NEVBMCwgMHg1MTgyLCAweDUxOTYsIDB4NTFBQiwgMHg1MkY5LCAweDUzMzgsIDB4NTM2OSwgMHg1M0I2LCAweDU5MDIsCisgICAgMHg1QjgwLCAweDVEREIsIDB4NUU3QSwgMHg1RTdGLCAweDVFRjQsIDB4NUY1MCwgMHg1RjYxLCAweDY1MzQsIDB4NjVFMCwKKyAgICAweDc1OTIsIDB4NzY3NiwgMHg4RkI1LCAweDk2QjYsIDB4MjQwMCwgMHgyNDAxLCAweDI0MDIsIDB4MjQwMywgMHgyNDA0LAorICAgIDB4MjQwNSwgMHgyNDA2LCAweDI0MDcsIDB4MjQwOCwgMHgyNDA5LCAweDI0MEEsIDB4MjQwQiwgMHgyNDBDLCAweDI0MEQsCisgICAgMHgyNDBFLCAweDI0MEYsIDB4MjQxMCwgMHgyNDExLCAweDI0MTIsIDB4MjQxMywgMHgyNDE0LCAweDI0MTUsIDB4MjQxNiwKKyAgICAweDI0MTcsIDB4MjQxOCwgMHgyNDE5LCAweDI0MUEsIDB4MjQxQiwgMHgyNDFDLCAweDI0MUQsIDB4MjQxRSwgMHgyNDFGLAorICAgIDB4MjQyMSwgMHg0RTAwLCAweDRFNTksIDB4NEUwMSwgMHg0RTAzLCAweDRFNDMsIDB4NEU1RCwgMHg0RTg2LCAweDRFOEMsCisgICAgMHg0RUJBLCAweDUxM0YsIDB4NTE2NSwgMHg1MTZCLCAweDUxRTAsIDB4NTIwMCwgMHg1MjAxLCAweDUyOUIsIDB4NTMxNSwKKyAgICAweDUzNDEsIDB4NTM1QywgMHg1M0M4LCAweDRFMDksIDB4NEUwQiwgMHg0RTA4LCAweDRFMEEsIDB4NEUyQiwgMHg0RTM4LAorICAgIDB4NTFFMSwgMHg0RTQ1LCAweDRFNDgsIDB4NEU1RiwgMHg0RTVFLCAweDRFOEUsIDB4NEVBMSwgMHg1MTQwLCAweDUyMDMsCisgICAgMHg1MkZBLCAweDUzNDMsIDB4NTNDOSwgMHg1M0UzLCAweDU3MUYsIDB4NThFQiwgMHg1OTE1LCAweDU5MjcsIDB4NTk3MywKKyAgICAweDVCNTAsIDB4NUI1MSwgMHg1QjUzLCAweDVCRjgsIDB4NUMwRiwgMHg1QzIyLCAweDVDMzgsIDB4NUM3MSwgMHg1RERELAorICAgIDB4NURFNSwgMHg1REYxLCAweDVERjIsIDB4NURGMywgMHg1REZFLCAweDVFNzIsIDB4NUVGRSwgMHg1RjBCLCAweDVGMTMsCisgICAgMHg2MjRELCAweDRFMTEsIDB4NEUxMCwgMHg0RTBELCAweDRFMkQsIDB4NEUzMCwgMHg0RTM5LCAweDRFNEIsIDB4NUMzOSwKKyAgICAweDRFODgsIDB4NEU5MSwgMHg0RTk1LCAweDRFOTIsIDB4NEU5NCwgMHg0RUEyLCAweDRFQzEsIDB4NEVDMCwgMHg0RUMzLAorICAgIDB4NEVDNiwgMHg0RUM3LCAweDRFQ0QsIDB4NEVDQSwgMHg0RUNCLCAweDRFQzQsIDB4NTE0MywgMHg1MTQxLCAweDUxNjcsCisgICAgMHg1MTZELCAweDUxNkUsIDB4NTE2QywgMHg1MTk3LCAweDUxRjYsIDB4NTIwNiwgMHg1MjA3LCAweDUyMDgsIDB4NTJGQiwKKyAgICAweDUyRkUsIDB4NTJGRiwgMHg1MzE2LCAweDUzMzksIDB4NTM0OCwgMHg1MzQ3LCAweDUzNDUsIDB4NTM1RSwgMHg1Mzg0LAorICAgIDB4NTNDQiwgMHg1M0NBLCAweDUzQ0QsIDB4NThFQywgMHg1OTI5LCAweDU5MkIsIDB4NTkyQSwgMHg1OTJELCAweDVCNTQsCisgICAgMHg1QzExLCAweDVDMjQsIDB4NUMzQSwgMHg1QzZGLCAweDVERjQsIDB4NUU3QiwgMHg1RUZGLCAweDVGMTQsIDB4NUYxNSwKKyAgICAweDVGQzMsIDB4NjIwOCwgMHg2MjM2LCAweDYyNEIsIDB4NjI0RSwgMHg2NTJGLCAweDY1ODcsIDB4NjU5NywgMHg2NUE0LAorICAgIDB4NjVCOSwgMHg2NUU1LCAweDY2RjAsIDB4NjcwOCwgMHg2NzI4LCAweDZCMjAsIDB4NkI2MiwgMHg2Qjc5LCAweDZCQ0IsCisgICAgMHg2QkQ0LCAweDZCREIsIDB4NkMwRiwgMHg2QzM0LCAweDcwNkIsIDB4NzIyQSwgMHg3MjM2LCAweDcyM0IsIDB4NzI0NywKKyAgICAweDcyNTksIDB4NzI1QiwgMHg3MkFDLCAweDczOEIsIDB4NEUxOSwgMHg0RTE2LCAweDRFMTUsIDB4NEUxNCwgMHg0RTE4LAorICAgIDB4NEUzQiwgMHg0RTRELCAweDRFNEYsIDB4NEU0RSwgMHg0RUU1LCAweDRFRDgsIDB4NEVENCwgMHg0RUQ1LCAweDRFRDYsCisgICAgMHg0RUQ3LCAweDRFRTMsIDB4NEVFNCwgMHg0RUQ5LCAweDRFREUsIDB4NTE0NSwgMHg1MTQ0LCAweDUxODksIDB4NTE4QSwKKyAgICAweDUxQUMsIDB4NTFGOSwgMHg1MUZBLCAweDUxRjgsIDB4NTIwQSwgMHg1MkEwLCAweDUyOUYsIDB4NTMwNSwgMHg1MzA2LAorICAgIDB4NTMxNywgMHg1MzFELCAweDRFREYsIDB4NTM0QSwgMHg1MzQ5LCAweDUzNjEsIDB4NTM2MCwgMHg1MzZGLCAweDUzNkUsCisgICAgMHg1M0JCLCAweDUzRUYsIDB4NTNFNCwgMHg1M0YzLCAweDUzRUMsIDB4NTNFRSwgMHg1M0U5LCAweDUzRTgsIDB4NTNGQywKKyAgICAweDUzRjgsIDB4NTNGNSwgMHg1M0VCLCAweDUzRTYsIDB4NTNFQSwgMHg1M0YyLCAweDUzRjEsIDB4NTNGMCwgMHg1M0U1LAorICAgIDB4NTNFRCwgMHg1M0ZCLCAweDU2REIsIDB4NTZEQSwgMHg1OTE2LCAweDU5MkUsIDB4NTkzMSwgMHg1OTc0LCAweDU5NzYsCisgICAgMHg1QjU1LCAweDVCODMsIDB4NUMzQywgMHg1REU4LCAweDVERTcsIDB4NURFNiwgMHg1RTAyLCAweDVFMDMsIDB4NUU3MywKKyAgICAweDVFN0MsIDB4NUYwMSwgMHg1RjE4LCAweDVGMTcsIDB4NUZDNSwgMHg2MjBBLCAweDYyNTMsIDB4NjI1NCwgMHg2MjUyLAorICAgIDB4NjI1MSwgMHg2NUE1LCAweDY1RTYsIDB4NjcyRSwgMHg2NzJDLCAweDY3MkEsIDB4NjcyQiwgMHg2NzJELCAweDZCNjMsCisgICAgMHg2QkNELCAweDZDMTEsIDB4NkMxMCwgMHg2QzM4LCAweDZDNDEsIDB4NkM0MCwgMHg2QzNFLCAweDcyQUYsIDB4NzM4NCwKKyAgICAweDczODksIDB4NzREQywgMHg3NEU2LCAweDc1MTgsIDB4NzUxRiwgMHg3NTI4LCAweDc1MjksIDB4NzUzMCwgMHg3NTMxLAorICAgIDB4NzUzMiwgMHg3NTMzLCAweDc1OEIsIDB4NzY3RCwgMHg3NkFFLCAweDc2QkYsIDB4NzZFRSwgMHg3N0RCLCAweDc3RTIsCisgICAgMHg3N0YzLCAweDc5M0EsIDB4NzlCRSwgMHg3QTc0LCAweDdBQ0IsIDB4NEUxRSwgMHg0RTFGLCAweDRFNTIsIDB4NEU1MywKKyAgICAweDRFNjksIDB4NEU5OSwgMHg0RUE0LCAweDRFQTYsIDB4NEVBNSwgMHg0RUZGLCAweDRGMDksIDB4NEYxOSwgMHg0RjBBLAorICAgIDB4NEYxNSwgMHg0RjBELCAweDRGMTAsIDB4NEYxMSwgMHg0RjBGLCAweDRFRjIsIDB4NEVGNiwgMHg0RUZCLCAweDRFRjAsCisgICAgMHg0RUYzLCAweDRFRkQsIDB4NEYwMSwgMHg0RjBCLCAweDUxNDksIDB4NTE0NywgMHg1MTQ2LCAweDUxNDgsIDB4NTE2OCwKKyAgICAweDUxNzEsIDB4NTE4RCwgMHg1MUIwLCAweDUyMTcsIDB4NTIxMSwgMHg1MjEyLCAweDUyMEUsIDB4NTIxNiwgMHg1MkEzLAorICAgIDB4NTMwOCwgMHg1MzIxLCAweDUzMjAsIDB4NTM3MCwgMHg1MzcxLCAweDU0MDksIDB4NTQwRiwgMHg1NDBDLCAweDU0MEEsCisgICAgMHg1NDEwLCAweDU0MDEsIDB4NTQwQiwgMHg1NDA0LCAweDU0MTEsIDB4NTQwRCwgMHg1NDA4LCAweDU0MDMsIDB4NTQwRSwKKyAgICAweDU0MDYsIDB4NTQxMiwgMHg1NkUwLCAweDU2REUsIDB4NTZERCwgMHg1NzMzLCAweDU3MzAsIDB4NTcyOCwgMHg1NzJELAorICAgIDB4NTcyQywgMHg1NzJGLCAweDU3MjksIDB4NTkxOSwgMHg1OTFBLCAweDU5MzcsIDB4NTkzOCwgMHg1OTg0LCAweDU5NzgsCisgICAgMHg1OTgzLCAweDU5N0QsIDB4NTk3OSwgMHg1OTgyLCAweDU5ODEsIDB4NUI1NywgMHg1QjU4LCAweDVCODcsIDB4NUI4OCwKKyAgICAweDVCODUsIDB4NUI4OSwgMHg1QkZBLCAweDVDMTYsIDB4NUM3OSwgMHg1RERFLCAweDVFMDYsIDB4NUU3NiwgMHg1RTc0LAorICAgIDB4NUYwRiwgMHg1RjFCLCAweDVGRDksIDB4NUZENiwgMHg2MjBFLCAweDYyMEMsIDB4NjIwRCwgMHg2MjEwLCAweDYyNjMsCisgICAgMHg2MjVCLCAweDYyNTgsIDB4NjUzNiwgMHg2NUU5LCAweDY1RTgsIDB4NjVFQywgMHg2NUVELCAweDY2RjIsIDB4NjZGMywKKyAgICAweDY3MDksIDB4NjczRCwgMHg2NzM0LCAweDY3MzEsIDB4NjczNSwgMHg2QjIxLCAweDZCNjQsIDB4NkI3QiwgMHg2QzE2LAorICAgIDB4NkM1RCwgMHg2QzU3LCAweDZDNTksIDB4NkM1RiwgMHg2QzYwLCAweDZDNTAsIDB4NkM1NSwgMHg2QzYxLCAweDZDNUIsCisgICAgMHg2QzRELCAweDZDNEUsIDB4NzA3MCwgMHg3MjVGLCAweDcyNUQsIDB4NzY3RSwgMHg3QUY5LCAweDdDNzMsIDB4N0NGOCwKKyAgICAweDdGMzYsIDB4N0Y4QSwgMHg3RkJELCAweDgwMDEsIDB4ODAwMywgMHg4MDBDLCAweDgwMTIsIDB4ODAzMywgMHg4MDdGLAorICAgIDB4ODA4OSwgMHg4MDhCLCAweDgwOEMsIDB4ODFFMywgMHg4MUVBLCAweDgxRjMsIDB4ODFGQywgMHg4MjBDLCAweDgyMUIsCisgICAgMHg4MjFGLCAweDgyNkUsIDB4ODI3MiwgMHg4MjdFLCAweDg2NkIsIDB4ODg0MCwgMHg4ODRDLCAweDg4NjMsIDB4ODk3RiwKKyAgICAweDk2MjEsIDB4NEUzMiwgMHg0RUE4LCAweDRGNEQsIDB4NEY0RiwgMHg0RjQ3LCAweDRGNTcsIDB4NEY1RSwgMHg0RjM0LAorICAgIDB4NEY1QiwgMHg0RjU1LCAweDRGMzAsIDB4NEY1MCwgMHg0RjUxLCAweDRGM0QsIDB4NEYzQSwgMHg0RjM4LCAweDRGNDMsCisgICAgMHg0RjU0LCAweDRGM0MsIDB4NEY0NiwgMHg0RjYzLCAweDRGNUMsIDB4NEY2MCwgMHg0RjJGLCAweDRGNEUsIDB4NEYzNiwKKyAgICAweDRGNTksIDB4NEY1RCwgMHg0RjQ4LCAweDRGNUEsIDB4NTE0QywgMHg1MTRCLCAweDUxNEQsIDB4NTE3NSwgMHg1MUI2LAorICAgIDB4NTFCNywgMHg1MjI1LCAweDUyMjQsIDB4NTIyOSwgMHg1MjJBLCAweDUyMjgsIDB4NTJBQiwgMHg1MkE5LCAweDUyQUEsCisgICAgMHg1MkFDLCAweDUzMjMsIDB4NTM3MywgMHg1Mzc1LCAweDU0MUQsIDB4NTQyRCwgMHg1NDFFLCAweDU0M0UsIDB4NTQyNiwKKyAgICAweDU0NEUsIDB4NTQyNywgMHg1NDQ2LCAweDU0NDMsIDB4NTQzMywgMHg1NDQ4LCAweDU0NDIsIDB4NTQxQiwgMHg1NDI5LAorICAgIDB4NTQ0QSwgMHg1NDM5LCAweDU0M0IsIDB4NTQzOCwgMHg1NDJFLCAweDU0MzUsIDB4NTQzNiwgMHg1NDIwLCAweDU0M0MsCisgICAgMHg1NDQwLCAweDU0MzEsIDB4NTQyQiwgMHg1NDFGLCAweDU0MkMsIDB4NTZFQSwgMHg1NkYwLCAweDU2RTQsIDB4NTZFQiwKKyAgICAweDU3NEEsIDB4NTc1MSwgMHg1NzQwLCAweDU3NEQsIDB4NTc0NywgMHg1NzRFLCAweDU3M0UsIDB4NTc1MCwgMHg1NzRGLAorICAgIDB4NTczQiwgMHg1OEVGLCAweDU5M0UsIDB4NTk5RCwgMHg1OTkyLCAweDU5QTgsIDB4NTk5RSwgMHg1OUEzLCAweDU5OTksCisgICAgMHg1OTk2LCAweDU5OEQsIDB4NTlBNCwgMHg1OTkzLCAweDU5OEEsIDB4NTlBNSwgMHg1QjVELCAweDVCNUMsIDB4NUI1QSwKKyAgICAweDVCNUIsIDB4NUI4QywgMHg1QjhCLCAweDVCOEYsIDB4NUMyQywgMHg1QzQwLCAweDVDNDEsIDB4NUMzRiwgMHg1QzNFLAorICAgIDB4NUM5MCwgMHg1QzkxLCAweDVDOTQsIDB4NUM4QywgMHg1REVCLCAweDVFMEMsIDB4NUU4RiwgMHg1RTg3LCAweDVFOEEsCisgICAgMHg1RUY3LCAweDVGMDQsIDB4NUYxRiwgMHg1RjY0LCAweDVGNjIsIDB4NUY3NywgMHg1Rjc5LCAweDVGRDgsIDB4NUZDQywKKyAgICAweDVGRDcsIDB4NUZDRCwgMHg1RkYxLCAweDVGRUIsIDB4NUZGOCwgMHg1RkVBLCAweDYyMTIsIDB4NjIxMSwgMHg2Mjg0LAorICAgIDB4NjI5NywgMHg2Mjk2LCAweDYyODAsIDB4NjI3NiwgMHg2Mjg5LCAweDYyNkQsIDB4NjI4QSwgMHg2MjdDLCAweDYyN0UsCisgICAgMHg2Mjc5LCAweDYyNzMsIDB4NjI5MiwgMHg2MjZGLCAweDYyOTgsIDB4NjI2RSwgMHg2Mjk1LCAweDYyOTMsIDB4NjI5MSwKKyAgICAweDYyODYsIDB4NjUzOSwgMHg2NTNCLCAweDY1MzgsIDB4NjVGMSwgMHg2NkY0LCAweDY3NUYsIDB4Njc0RSwgMHg2NzRGLAorICAgIDB4Njc1MCwgMHg2NzUxLCAweDY3NUMsIDB4Njc1NiwgMHg2NzVFLCAweDY3NDksIDB4Njc0NiwgMHg2NzYwLCAweDY3NTMsCisgICAgMHg2NzU3LCAweDZCNjUsIDB4NkJDRiwgMHg2QzQyLCAweDZDNUUsIDB4NkM5OSwgMHg2QzgxLCAweDZDODgsIDB4NkM4OSwKKyAgICAweDZDODUsIDB4NkM5QiwgMHg2QzZBLCAweDZDN0EsIDB4NkM5MCwgMHg2QzcwLCAweDZDOEMsIDB4NkM2OCwgMHg2Qzk2LAorICAgIDB4NkM5MiwgMHg2QzdELCAweDZDODMsIDB4NkM3MiwgMHg2QzdFLCAweDZDNzQsIDB4NkM4NiwgMHg2Qzc2LCAweDZDOEQsCisgICAgMHg2Qzk0LCAweDZDOTgsIDB4NkM4MiwgMHg3MDc2LCAweDcwN0MsIDB4NzA3RCwgMHg3MDc4LCAweDcyNjIsIDB4NzI2MSwKKyAgICAweDcyNjAsIDB4NzJDNCwgMHg3MkMyLCAweDczOTYsIDB4NzUyQywgMHg3NTJCLCAweDc1MzcsIDB4NzUzOCwgMHg3NjgyLAorICAgIDB4NzZFRiwgMHg3N0UzLCAweDc5QzEsIDB4NzlDMCwgMHg3OUJGLCAweDdBNzYsIDB4N0NGQiwgMHg3RjU1LCAweDgwOTYsCisgICAgMHg4MDkzLCAweDgwOUQsIDB4ODA5OCwgMHg4MDlCLCAweDgwOUEsIDB4ODBCMiwgMHg4MjZGLCAweDgyOTIsIDB4ODI4QiwKKyAgICAweDgyOEQsIDB4ODk4QiwgMHg4OUQyLCAweDhBMDAsIDB4OEMzNywgMHg4QzQ2LCAweDhDNTUsIDB4OEM5RCwgMHg4RDY0LAorICAgIDB4OEQ3MCwgMHg4REIzLCAweDhFQUIsIDB4OEVDQSwgMHg4RjlCLCAweDhGQjAsIDB4OEZDMiwgMHg4RkM2LCAweDhGQzUsCisgICAgMHg4RkM0LCAweDVERTEsIDB4OTA5MSwgMHg5MEEyLCAweDkwQUEsIDB4OTBBNiwgMHg5MEEzLCAweDkxNDksIDB4OTFDNiwKKyAgICAweDkxQ0MsIDB4OTYzMiwgMHg5NjJFLCAweDk2MzEsIDB4OTYyQSwgMHg5NjJDLCAweDRFMjYsIDB4NEU1NiwgMHg0RTczLAorICAgIDB4NEU4QiwgMHg0RTlCLCAweDRFOUUsIDB4NEVBQiwgMHg0RUFDLCAweDRGNkYsIDB4NEY5RCwgMHg0RjhELCAweDRGNzMsCisgICAgMHg0RjdGLCAweDRGNkMsIDB4NEY5QiwgMHg0RjhCLCAweDRGODYsIDB4NEY4MywgMHg0RjcwLCAweDRGNzUsIDB4NEY4OCwKKyAgICAweDRGNjksIDB4NEY3QiwgMHg0Rjk2LCAweDRGN0UsIDB4NEY4RiwgMHg0RjkxLCAweDRGN0EsIDB4NTE1NCwgMHg1MTUyLAorICAgIDB4NTE1NSwgMHg1MTY5LCAweDUxNzcsIDB4NTE3NiwgMHg1MTc4LCAweDUxQkQsIDB4NTFGRCwgMHg1MjNCLCAweDUyMzgsCisgICAgMHg1MjM3LCAweDUyM0EsIDB4NTIzMCwgMHg1MjJFLCAweDUyMzYsIDB4NTI0MSwgMHg1MkJFLCAweDUyQkIsIDB4NTM1MiwKKyAgICAweDUzNTQsIDB4NTM1MywgMHg1MzUxLCAweDUzNjYsIDB4NTM3NywgMHg1Mzc4LCAweDUzNzksIDB4NTNENiwgMHg1M0Q0LAorICAgIDB4NTNENywgMHg1NDczLCAweDU0NzUsIDB4NTQ5NiwgMHg1NDc4LCAweDU0OTUsIDB4NTQ4MCwgMHg1NDdCLCAweDU0NzcsCisgICAgMHg1NDg0LCAweDU0OTIsIDB4NTQ4NiwgMHg1NDdDLCAweDU0OTAsIDB4NTQ3MSwgMHg1NDc2LCAweDU0OEMsIDB4NTQ5QSwKKyAgICAweDU0NjIsIDB4NTQ2OCwgMHg1NDhCLCAweDU0N0QsIDB4NTQ4RSwgMHg1NkZBLCAweDU3ODMsIDB4NTc3NywgMHg1NzZBLAorICAgIDB4NTc2OSwgMHg1NzYxLCAweDU3NjYsIDB4NTc2NCwgMHg1NzdDLCAweDU5MUMsIDB4NTk0OSwgMHg1OTQ3LCAweDU5NDgsCisgICAgMHg1OTQ0LCAweDU5NTQsIDB4NTlCRSwgMHg1OUJCLCAweDU5RDQsIDB4NTlCOSwgMHg1OUFFLCAweDU5RDEsIDB4NTlDNiwKKyAgICAweDU5RDAsIDB4NTlDRCwgMHg1OUNCLCAweDU5RDMsIDB4NTlDQSwgMHg1OUFGLCAweDU5QjMsIDB4NTlEMiwgMHg1OUM1LAorICAgIDB4NUI1RiwgMHg1QjY0LCAweDVCNjMsIDB4NUI5NywgMHg1QjlBLCAweDVCOTgsIDB4NUI5QywgMHg1Qjk5LCAweDVCOUIsCisgICAgMHg1QzFBLCAweDVDNDgsIDB4NUM0NSwgMHg1QzQ2LCAweDVDQjcsIDB4NUNBMSwgMHg1Q0I4LCAweDVDQTksIDB4NUNBQiwKKyAgICAweDVDQjEsIDB4NUNCMywgMHg1RTE4LCAweDVFMUEsIDB4NUUxNiwgMHg1RTE1LCAweDVFMUIsIDB4NUUxMSwgMHg1RTc4LAorICAgIDB4NUU5QSwgMHg1RTk3LCAweDVFOUMsIDB4NUU5NSwgMHg1RTk2LCAweDVFRjYsIDB4NUYyNiwgMHg1RjI3LCAweDVGMjksCisgICAgMHg1RjgwLCAweDVGODEsIDB4NUY3RiwgMHg1RjdDLCAweDVGREQsIDB4NUZFMCwgMHg1RkZELCAweDVGRjUsIDB4NUZGRiwKKyAgICAweDYwMEYsIDB4NjAxNCwgMHg2MDJGLCAweDYwMzUsIDB4NjAxNiwgMHg2MDJBLCAweDYwMTUsIDB4NjAyMSwgMHg2MDI3LAorICAgIDB4NjAyOSwgMHg2MDJCLCAweDYwMUIsIDB4NjIxNiwgMHg2MjE1LCAweDYyM0YsIDB4NjIzRSwgMHg2MjQwLCAweDYyN0YsCisgICAgMHg2MkM5LCAweDYyQ0MsIDB4NjJDNCwgMHg2MkJGLCAweDYyQzIsIDB4NjJCOSwgMHg2MkQyLCAweDYyREIsIDB4NjJBQiwKKyAgICAweDYyRDMsIDB4NjJENCwgMHg2MkNCLCAweDYyQzgsIDB4NjJBOCwgMHg2MkJELCAweDYyQkMsIDB4NjJEMCwgMHg2MkQ5LAorICAgIDB4NjJDNywgMHg2MkNELCAweDYyQjUsIDB4NjJEQSwgMHg2MkIxLCAweDYyRDgsIDB4NjJENiwgMHg2MkQ3LCAweDYyQzYsCisgICAgMHg2MkFDLCAweDYyQ0UsIDB4NjUzRSwgMHg2NUE3LCAweDY1QkMsIDB4NjVGQSwgMHg2NjE0LCAweDY2MTMsIDB4NjYwQywKKyAgICAweDY2MDYsIDB4NjYwMiwgMHg2NjBFLCAweDY2MDAsIDB4NjYwRiwgMHg2NjE1LCAweDY2MEEsIDB4NjYwNywgMHg2NzBELAorICAgIDB4NjcwQiwgMHg2NzZELCAweDY3OEIsIDB4Njc5NSwgMHg2NzcxLCAweDY3OUMsIDB4Njc3MywgMHg2Nzc3LCAweDY3ODcsCisgICAgMHg2NzlELCAweDY3OTcsIDB4Njc2RiwgMHg2NzcwLCAweDY3N0YsIDB4Njc4OSwgMHg2NzdFLCAweDY3OTAsIDB4Njc3NSwKKyAgICAweDY3OUEsIDB4Njc5MywgMHg2NzdDLCAweDY3NkEsIDB4Njc3MiwgMHg2QjIzLCAweDZCNjYsIDB4NkI2NywgMHg2QjdGLAorICAgIDB4NkMxMywgMHg2QzFCLCAweDZDRTMsIDB4NkNFOCwgMHg2Q0YzLCAweDZDQjEsIDB4NkNDQywgMHg2Q0U1LCAweDZDQjMsCisgICAgMHg2Q0JELCAweDZDQkUsIDB4NkNCQywgMHg2Q0UyLCAweDZDQUIsIDB4NkNENSwgMHg2Q0QzLCAweDZDQjgsIDB4NkNDNCwKKyAgICAweDZDQjksIDB4NkNDMSwgMHg2Q0FFLCAweDZDRDcsIDB4NkNDNSwgMHg2Q0YxLCAweDZDQkYsIDB4NkNCQiwgMHg2Q0UxLAorICAgIDB4NkNEQiwgMHg2Q0NBLCAweDZDQUMsIDB4NkNFRiwgMHg2Q0RDLCAweDZDRDYsIDB4NkNFMCwgMHg3MDk1LCAweDcwOEUsCisgICAgMHg3MDkyLCAweDcwOEEsIDB4NzA5OSwgMHg3MjJDLCAweDcyMkQsIDB4NzIzOCwgMHg3MjQ4LCAweDcyNjcsIDB4NzI2OSwKKyAgICAweDcyQzAsIDB4NzJDRSwgMHg3MkQ5LCAweDcyRDcsIDB4NzJEMCwgMHg3M0E5LCAweDczQTgsIDB4NzM5RiwgMHg3M0FCLAorICAgIDB4NzNBNSwgMHg3NTNELCAweDc1OUQsIDB4NzU5OSwgMHg3NTlBLCAweDc2ODQsIDB4NzZDMiwgMHg3NkYyLCAweDc2RjQsCisgICAgMHg3N0U1LCAweDc3RkQsIDB4NzkzRSwgMHg3OTQwLCAweDc5NDEsIDB4NzlDOSwgMHg3OUM4LCAweDdBN0EsIDB4N0E3OSwKKyAgICAweDdBRkEsIDB4N0NGRSwgMHg3RjU0LCAweDdGOEMsIDB4N0Y4QiwgMHg4MDA1LCAweDgwQkEsIDB4ODBBNSwgMHg4MEEyLAorICAgIDB4ODBCMSwgMHg4MEExLCAweDgwQUIsIDB4ODBBOSwgMHg4MEI0LCAweDgwQUEsIDB4ODBBRiwgMHg4MUU1LCAweDgxRkUsCisgICAgMHg4MjBELCAweDgyQjMsIDB4ODI5RCwgMHg4Mjk5LCAweDgyQUQsIDB4ODJCRCwgMHg4MjlGLCAweDgyQjksIDB4ODJCMSwKKyAgICAweDgyQUMsIDB4ODJBNSwgMHg4MkFGLCAweDgyQjgsIDB4ODJBMywgMHg4MkIwLCAweDgyQkUsIDB4ODJCNywgMHg4NjRFLAorICAgIDB4ODY3MSwgMHg1MjFELCAweDg4NjgsIDB4OEVDQiwgMHg4RkNFLCAweDhGRDQsIDB4OEZEMSwgMHg5MEI1LCAweDkwQjgsCisgICAgMHg5MEIxLCAweDkwQjYsIDB4OTFDNywgMHg5MUQxLCAweDk1NzcsIDB4OTU4MCwgMHg5NjFDLCAweDk2NDAsIDB4OTYzRiwKKyAgICAweDk2M0IsIDB4OTY0NCwgMHg5NjQyLCAweDk2QjksIDB4OTZFOCwgMHg5NzUyLCAweDk3NUUsIDB4NEU5RiwgMHg0RUFELAorICAgIDB4NEVBRSwgMHg0RkUxLCAweDRGQjUsIDB4NEZBRiwgMHg0RkJGLCAweDRGRTAsIDB4NEZEMSwgMHg0RkNGLCAweDRGREQsCisgICAgMHg0RkMzLCAweDRGQjYsIDB4NEZEOCwgMHg0RkRGLCAweDRGQ0EsIDB4NEZENywgMHg0RkFFLCAweDRGRDAsIDB4NEZDNCwKKyAgICAweDRGQzIsIDB4NEZEQSwgMHg0RkNFLCAweDRGREUsIDB4NEZCNywgMHg1MTU3LCAweDUxOTIsIDB4NTE5MSwgMHg1MUEwLAorICAgIDB4NTI0RSwgMHg1MjQzLCAweDUyNEEsIDB4NTI0RCwgMHg1MjRDLCAweDUyNEIsIDB4NTI0NywgMHg1MkM3LCAweDUyQzksCisgICAgMHg1MkMzLCAweDUyQzEsIDB4NTMwRCwgMHg1MzU3LCAweDUzN0IsIDB4NTM5QSwgMHg1M0RCLCAweDU0QUMsIDB4NTRDMCwKKyAgICAweDU0QTgsIDB4NTRDRSwgMHg1NEM5LCAweDU0QjgsIDB4NTRBNiwgMHg1NEIzLCAweDU0QzcsIDB4NTRDMiwgMHg1NEJELAorICAgIDB4NTRBQSwgMHg1NEMxLCAweDU0QzQsIDB4NTRDOCwgMHg1NEFGLCAweDU0QUIsIDB4NTRCMSwgMHg1NEJCLCAweDU0QTksCisgICAgMHg1NEE3LCAweDU0QkYsIDB4NTZGRiwgMHg1NzgyLCAweDU3OEIsIDB4NTdBMCwgMHg1N0EzLCAweDU3QTIsIDB4NTdDRSwKKyAgICAweDU3QUUsIDB4NTc5MywgMHg1OTU1LCAweDU5NTEsIDB4NTk0RiwgMHg1OTRFLCAweDU5NTAsIDB4NTlEQywgMHg1OUQ4LAorICAgIDB4NTlGRiwgMHg1OUUzLCAweDU5RTgsIDB4NUEwMywgMHg1OUU1LCAweDU5RUEsIDB4NTlEQSwgMHg1OUU2LCAweDVBMDEsCisgICAgMHg1OUZCLCAweDVCNjksIDB4NUJBMywgMHg1QkE2LCAweDVCQTQsIDB4NUJBMiwgMHg1QkE1LCAweDVDMDEsIDB4NUM0RSwKKyAgICAweDVDNEYsIDB4NUM0RCwgMHg1QzRCLCAweDVDRDksIDB4NUNEMiwgMHg1REY3LCAweDVFMUQsIDB4NUUyNSwgMHg1RTFGLAorICAgIDB4NUU3RCwgMHg1RUEwLCAweDVFQTYsIDB4NUVGQSwgMHg1RjA4LCAweDVGMkQsIDB4NUY2NSwgMHg1Rjg4LCAweDVGODUsCisgICAgMHg1RjhBLCAweDVGOEIsIDB4NUY4NywgMHg1RjhDLCAweDVGODksIDB4NjAxMiwgMHg2MDFELCAweDYwMjAsIDB4NjAyNSwKKyAgICAweDYwMEUsIDB4NjAyOCwgMHg2MDRELCAweDYwNzAsIDB4NjA2OCwgMHg2MDYyLCAweDYwNDYsIDB4NjA0MywgMHg2MDZDLAorICAgIDB4NjA2QiwgMHg2MDZBLCAweDYwNjQsIDB4NjI0MSwgMHg2MkRDLCAweDYzMTYsIDB4NjMwOSwgMHg2MkZDLCAweDYyRUQsCisgICAgMHg2MzAxLCAweDYyRUUsIDB4NjJGRCwgMHg2MzA3LCAweDYyRjEsIDB4NjJGNywgMHg2MkVGLCAweDYyRUMsIDB4NjJGRSwKKyAgICAweDYyRjQsIDB4NjMxMSwgMHg2MzAyLCAweDY1M0YsIDB4NjU0NSwgMHg2NUFCLCAweDY1QkQsIDB4NjVFMiwgMHg2NjI1LAorICAgIDB4NjYyRCwgMHg2NjIwLCAweDY2MjcsIDB4NjYyRiwgMHg2NjFGLCAweDY2MjgsIDB4NjYzMSwgMHg2NjI0LCAweDY2RjcsCisgICAgMHg2N0ZGLCAweDY3RDMsIDB4NjdGMSwgMHg2N0Q0LCAweDY3RDAsIDB4NjdFQywgMHg2N0I2LCAweDY3QUYsIDB4NjdGNSwKKyAgICAweDY3RTksIDB4NjdFRiwgMHg2N0M0LCAweDY3RDEsIDB4NjdCNCwgMHg2N0RBLCAweDY3RTUsIDB4NjdCOCwgMHg2N0NGLAorICAgIDB4NjdERSwgMHg2N0YzLCAweDY3QjAsIDB4NjdEOSwgMHg2N0UyLCAweDY3REQsIDB4NjdEMiwgMHg2QjZBLCAweDZCODMsCisgICAgMHg2Qjg2LCAweDZCQjUsIDB4NkJEMiwgMHg2QkQ3LCAweDZDMUYsIDB4NkNDOSwgMHg2RDBCLCAweDZEMzIsIDB4NkQyQSwKKyAgICAweDZENDEsIDB4NkQyNSwgMHg2RDBDLCAweDZEMzEsIDB4NkQxRSwgMHg2RDE3LCAweDZEM0IsIDB4NkQzRCwgMHg2RDNFLAorICAgIDB4NkQzNiwgMHg2RDFCLCAweDZDRjUsIDB4NkQzOSwgMHg2RDI3LCAweDZEMzgsIDB4NkQyOSwgMHg2RDJFLCAweDZEMzUsCisgICAgMHg2RDBFLCAweDZEMkIsIDB4NzBBQiwgMHg3MEJBLCAweDcwQjMsIDB4NzBBQywgMHg3MEFGLCAweDcwQUQsIDB4NzBCOCwKKyAgICAweDcwQUUsIDB4NzBBNCwgMHg3MjMwLCAweDcyNzIsIDB4NzI2RiwgMHg3Mjc0LCAweDcyRTksIDB4NzJFMCwgMHg3MkUxLAorICAgIDB4NzNCNywgMHg3M0NBLCAweDczQkIsIDB4NzNCMiwgMHg3M0NELCAweDczQzAsIDB4NzNCMywgMHg3NTFBLCAweDc1MkQsCisgICAgMHg3NTRGLCAweDc1NEMsIDB4NzU0RSwgMHg3NTRCLCAweDc1QUIsIDB4NzVBNCwgMHg3NUE1LCAweDc1QTIsIDB4NzVBMywKKyAgICAweDc2NzgsIDB4NzY4NiwgMHg3Njg3LCAweDc2ODgsIDB4NzZDOCwgMHg3NkM2LCAweDc2QzMsIDB4NzZDNSwgMHg3NzAxLAorICAgIDB4NzZGOSwgMHg3NkY4LCAweDc3MDksIDB4NzcwQiwgMHg3NkZFLCAweDc2RkMsIDB4NzcwNywgMHg3N0RDLCAweDc4MDIsCisgICAgMHg3ODE0LCAweDc4MEMsIDB4NzgwRCwgMHg3OTQ2LCAweDc5NDksIDB4Nzk0OCwgMHg3OTQ3LCAweDc5QjksIDB4NzlCQSwKKyAgICAweDc5RDEsIDB4NzlEMiwgMHg3OUNCLCAweDdBN0YsIDB4N0E4MSwgMHg3QUZGLCAweDdBRkQsIDB4N0M3RCwgMHg3RDAyLAorICAgIDB4N0QwNSwgMHg3RDAwLCAweDdEMDksIDB4N0QwNywgMHg3RDA0LCAweDdEMDYsIDB4N0YzOCwgMHg3RjhFLCAweDdGQkYsCisgICAgMHg4MDEwLCAweDgwMEQsIDB4ODAxMSwgMHg4MDM2LCAweDgwRDYsIDB4ODBFNSwgMHg4MERBLCAweDgwQzMsIDB4ODBDNCwKKyAgICAweDgwQ0MsIDB4ODBFMSwgMHg4MERCLCAweDgwQ0UsIDB4ODBERSwgMHg4MEU0LCAweDgwREQsIDB4ODFGNCwgMHg4MjIyLAorICAgIDB4ODJFNywgMHg4MzAzLCAweDgzMDUsIDB4ODJFMywgMHg4MkRCLCAweDgyRTYsIDB4ODMwNCwgMHg4MkU1LCAweDgzMDIsCisgICAgMHg4MzA5LCAweDgyRDIsIDB4ODJENywgMHg4MkYxLCAweDgzMDEsIDB4ODJEQywgMHg4MkQ0LCAweDgyRDEsIDB4ODJERSwKKyAgICAweDgyRDMsIDB4ODJERiwgMHg4MkVGLCAweDgzMDYsIDB4ODY1MCwgMHg4Njc5LCAweDg2N0IsIDB4ODY3QSwgMHg4ODRELAorICAgIDB4ODg2QiwgMHg4OTgxLCAweDg5RDQsIDB4OEEwOCwgMHg4QTAyLCAweDhBMDMsIDB4OEM5RSwgMHg4Q0EwLCAweDhENzQsCisgICAgMHg4RDczLCAweDhEQjQsIDB4OEVDRCwgMHg4RUNDLCAweDhGRjAsIDB4OEZFNiwgMHg4RkUyLCAweDhGRUEsIDB4OEZFNSwKKyAgICAweDhGRUQsIDB4OEZFQiwgMHg4RkU0LCAweDhGRTgsIDB4OTBDQSwgMHg5MENFLCAweDkwQzEsIDB4OTBDMywgMHg5MTRCLAorICAgIDB4OTE0QSwgMHg5MUNELCAweDk1ODIsIDB4OTY1MCwgMHg5NjRCLCAweDk2NEMsIDB4OTY0RCwgMHg5NzYyLCAweDk3NjksCisgICAgMHg5N0NCLCAweDk3RUQsIDB4OTdGMywgMHg5ODAxLCAweDk4QTgsIDB4OThEQiwgMHg5OERGLCAweDk5OTYsIDB4OTk5OSwKKyAgICAweDRFNTgsIDB4NEVCMywgMHg1MDBDLCAweDUwMEQsIDB4NTAyMywgMHg0RkVGLCAweDUwMjYsIDB4NTAyNSwgMHg0RkY4LAorICAgIDB4NTAyOSwgMHg1MDE2LCAweDUwMDYsIDB4NTAzQywgMHg1MDFGLCAweDUwMUEsIDB4NTAxMiwgMHg1MDExLCAweDRGRkEsCisgICAgMHg1MDAwLCAweDUwMTQsIDB4NTAyOCwgMHg0RkYxLCAweDUwMjEsIDB4NTAwQiwgMHg1MDE5LCAweDUwMTgsIDB4NEZGMywKKyAgICAweDRGRUUsIDB4NTAyRCwgMHg1MDJBLCAweDRGRkUsIDB4NTAyQiwgMHg1MDA5LCAweDUxN0MsIDB4NTFBNCwgMHg1MUE1LAorICAgIDB4NTFBMiwgMHg1MUNELCAweDUxQ0MsIDB4NTFDNiwgMHg1MUNCLCAweDUyNTYsIDB4NTI1QywgMHg1MjU0LCAweDUyNUIsCisgICAgMHg1MjVELCAweDUzMkEsIDB4NTM3RiwgMHg1MzlGLCAweDUzOUQsIDB4NTNERiwgMHg1NEU4LCAweDU1MTAsIDB4NTUwMSwKKyAgICAweDU1MzcsIDB4NTRGQywgMHg1NEU1LCAweDU0RjIsIDB4NTUwNiwgMHg1NEZBLCAweDU1MTQsIDB4NTRFOSwgMHg1NEVELAorICAgIDB4NTRFMSwgMHg1NTA5LCAweDU0RUUsIDB4NTRFQSwgMHg1NEU2LCAweDU1MjcsIDB4NTUwNywgMHg1NEZELCAweDU1MEYsCisgICAgMHg1NzAzLCAweDU3MDQsIDB4NTdDMiwgMHg1N0Q0LCAweDU3Q0IsIDB4NTdDMywgMHg1ODA5LCAweDU5MEYsIDB4NTk1NywKKyAgICAweDU5NTgsIDB4NTk1QSwgMHg1QTExLCAweDVBMTgsIDB4NUExQywgMHg1QTFGLCAweDVBMUIsIDB4NUExMywgMHg1OUVDLAorICAgIDB4NUEyMCwgMHg1QTIzLCAweDVBMjksIDB4NUEyNSwgMHg1QTBDLCAweDVBMDksIDB4NUI2QiwgMHg1QzU4LCAweDVCQjAsCisgICAgMHg1QkIzLCAweDVCQjYsIDB4NUJCNCwgMHg1QkFFLCAweDVCQjUsIDB4NUJCOSwgMHg1QkI4LCAweDVDMDQsIDB4NUM1MSwKKyAgICAweDVDNTUsIDB4NUM1MCwgMHg1Q0VELCAweDVDRkQsIDB4NUNGQiwgMHg1Q0VBLCAweDVDRTgsIDB4NUNGMCwgMHg1Q0Y2LAorICAgIDB4NUQwMSwgMHg1Q0Y0LCAweDVERUUsIDB4NUUyRCwgMHg1RTJCLCAweDVFQUIsIDB4NUVBRCwgMHg1RUE3LCAweDVGMzEsCisgICAgMHg1RjkyLCAweDVGOTEsIDB4NUY5MCwgMHg2MDU5LCAweDYwNjMsIDB4NjA2NSwgMHg2MDUwLCAweDYwNTUsIDB4NjA2RCwKKyAgICAweDYwNjksIDB4NjA2RiwgMHg2MDg0LCAweDYwOUYsIDB4NjA5QSwgMHg2MDhELCAweDYwOTQsIDB4NjA4QywgMHg2MDg1LAorICAgIDB4NjA5NiwgMHg2MjQ3LCAweDYyRjMsIDB4NjMwOCwgMHg2MkZGLCAweDYzNEUsIDB4NjMzRSwgMHg2MzJGLCAweDYzNTUsCisgICAgMHg2MzQyLCAweDYzNDYsIDB4NjM0RiwgMHg2MzQ5LCAweDYzM0EsIDB4NjM1MCwgMHg2MzNELCAweDYzMkEsIDB4NjMyQiwKKyAgICAweDYzMjgsIDB4NjM0RCwgMHg2MzRDLCAweDY1NDgsIDB4NjU0OSwgMHg2NTk5LCAweDY1QzEsIDB4NjVDNSwgMHg2NjQyLAorICAgIDB4NjY0OSwgMHg2NjRGLCAweDY2NDMsIDB4NjY1MiwgMHg2NjRDLCAweDY2NDUsIDB4NjY0MSwgMHg2NkY4LCAweDY3MTQsCisgICAgMHg2NzE1LCAweDY3MTcsIDB4NjgyMSwgMHg2ODM4LCAweDY4NDgsIDB4Njg0NiwgMHg2ODUzLCAweDY4MzksIDB4Njg0MiwKKyAgICAweDY4NTQsIDB4NjgyOSwgMHg2OEIzLCAweDY4MTcsIDB4Njg0QywgMHg2ODUxLCAweDY4M0QsIDB4NjdGNCwgMHg2ODUwLAorICAgIDB4Njg0MCwgMHg2ODNDLCAweDY4NDMsIDB4NjgyQSwgMHg2ODQ1LCAweDY4MTMsIDB4NjgxOCwgMHg2ODQxLCAweDZCOEEsCisgICAgMHg2Qjg5LCAweDZCQjcsIDB4NkMyMywgMHg2QzI3LCAweDZDMjgsIDB4NkMyNiwgMHg2QzI0LCAweDZDRjAsIDB4NkQ2QSwKKyAgICAweDZEOTUsIDB4NkQ4OCwgMHg2RDg3LCAweDZENjYsIDB4NkQ3OCwgMHg2RDc3LCAweDZENTksIDB4NkQ5MywgMHg2RDZDLAorICAgIDB4NkQ4OSwgMHg2RDZFLCAweDZENUEsIDB4NkQ3NCwgMHg2RDY5LCAweDZEOEMsIDB4NkQ4QSwgMHg2RDc5LCAweDZEODUsCisgICAgMHg2RDY1LCAweDZEOTQsIDB4NzBDQSwgMHg3MEQ4LCAweDcwRTQsIDB4NzBEOSwgMHg3MEM4LCAweDcwQ0YsIDB4NzIzOSwKKyAgICAweDcyNzksIDB4NzJGQywgMHg3MkY5LCAweDcyRkQsIDB4NzJGOCwgMHg3MkY3LCAweDczODYsIDB4NzNFRCwgMHg3NDA5LAorICAgIDB4NzNFRSwgMHg3M0UwLCAweDczRUEsIDB4NzNERSwgMHg3NTU0LCAweDc1NUQsIDB4NzU1QywgMHg3NTVBLCAweDc1NTksCisgICAgMHg3NUJFLCAweDc1QzUsIDB4NzVDNywgMHg3NUIyLCAweDc1QjMsIDB4NzVCRCwgMHg3NUJDLCAweDc1QjksIDB4NzVDMiwKKyAgICAweDc1QjgsIDB4NzY4QiwgMHg3NkIwLCAweDc2Q0EsIDB4NzZDRCwgMHg3NkNFLCAweDc3MjksIDB4NzcxRiwgMHg3NzIwLAorICAgIDB4NzcyOCwgMHg3N0U5LCAweDc4MzAsIDB4NzgyNywgMHg3ODM4LCAweDc4MUQsIDB4NzgzNCwgMHg3ODM3LCAweDc4MjUsCisgICAgMHg3ODJELCAweDc4MjAsIDB4NzgxRiwgMHg3ODMyLCAweDc5NTUsIDB4Nzk1MCwgMHg3OTYwLCAweDc5NUYsIDB4Nzk1NiwKKyAgICAweDc5NUUsIDB4Nzk1RCwgMHg3OTU3LCAweDc5NUEsIDB4NzlFNCwgMHg3OUUzLCAweDc5RTcsIDB4NzlERiwgMHg3OUU2LAorICAgIDB4NzlFOSwgMHg3OUQ4LCAweDdBODQsIDB4N0E4OCwgMHg3QUQ5LCAweDdCMDYsIDB4N0IxMSwgMHg3Qzg5LCAweDdEMjEsCisgICAgMHg3RDE3LCAweDdEMEIsIDB4N0QwQSwgMHg3RDIwLCAweDdEMjIsIDB4N0QxNCwgMHg3RDEwLCAweDdEMTUsIDB4N0QxQSwKKyAgICAweDdEMUMsIDB4N0QwRCwgMHg3RDE5LCAweDdEMUIsIDB4N0YzQSwgMHg3RjVGLCAweDdGOTQsIDB4N0ZDNSwgMHg3RkMxLAorICAgIDB4ODAwNiwgMHg4MDA0LCAweDgwMTgsIDB4ODAxNSwgMHg4MDE5LCAweDgwMTcsIDB4ODAzRCwgMHg4MDNGLCAweDgwRjEsCisgICAgMHg4MTAyLCAweDgwRjAsIDB4ODEwNSwgMHg4MEVELCAweDgwRjQsIDB4ODEwNiwgMHg4MEY4LCAweDgwRjMsIDB4ODEwOCwKKyAgICAweDgwRkQsIDB4ODEwQSwgMHg4MEZDLCAweDgwRUYsIDB4ODFFRCwgMHg4MUVDLCAweDgyMDAsIDB4ODIxMCwgMHg4MjJBLAorICAgIDB4ODIyQiwgMHg4MjI4LCAweDgyMkMsIDB4ODJCQiwgMHg4MzJCLCAweDgzNTIsIDB4ODM1NCwgMHg4MzRBLCAweDgzMzgsCisgICAgMHg4MzUwLCAweDgzNDksIDB4ODMzNSwgMHg4MzM0LCAweDgzNEYsIDB4ODMzMiwgMHg4MzM5LCAweDgzMzYsIDB4ODMxNywKKyAgICAweDgzNDAsIDB4ODMzMSwgMHg4MzI4LCAweDgzNDMsIDB4ODY1NCwgMHg4NjhBLCAweDg2QUEsIDB4ODY5MywgMHg4NkE0LAorICAgIDB4ODZBOSwgMHg4NjhDLCAweDg2QTMsIDB4ODY5QywgMHg4ODcwLCAweDg4NzcsIDB4ODg4MSwgMHg4ODgyLCAweDg4N0QsCisgICAgMHg4ODc5LCAweDhBMTgsIDB4OEExMCwgMHg4QTBFLCAweDhBMEMsIDB4OEExNSwgMHg4QTBBLCAweDhBMTcsIDB4OEExMywKKyAgICAweDhBMTYsIDB4OEEwRiwgMHg4QTExLCAweDhDNDgsIDB4OEM3QSwgMHg4Qzc5LCAweDhDQTEsIDB4OENBMiwgMHg4RDc3LAorICAgIDB4OEVBQywgMHg4RUQyLCAweDhFRDQsIDB4OEVDRiwgMHg4RkIxLCAweDkwMDEsIDB4OTAwNiwgMHg4RkY3LCAweDkwMDAsCisgICAgMHg4RkZBLCAweDhGRjQsIDB4OTAwMywgMHg4RkZELCAweDkwMDUsIDB4OEZGOCwgMHg5MDk1LCAweDkwRTEsIDB4OTBERCwKKyAgICAweDkwRTIsIDB4OTE1MiwgMHg5MTRELCAweDkxNEMsIDB4OTFEOCwgMHg5MURELCAweDkxRDcsIDB4OTFEQywgMHg5MUQ5LAorICAgIDB4OTU4MywgMHg5NjYyLCAweDk2NjMsIDB4OTY2MSwgMHg5NjVCLCAweDk2NUQsIDB4OTY2NCwgMHg5NjU4LCAweDk2NUUsCisgICAgMHg5NkJCLCAweDk4RTIsIDB4OTlBQywgMHg5QUE4LCAweDlBRDgsIDB4OUIyNSwgMHg5QjMyLCAweDlCM0MsIDB4NEU3RSwKKyAgICAweDUwN0EsIDB4NTA3RCwgMHg1MDVDLCAweDUwNDcsIDB4NTA0MywgMHg1MDRDLCAweDUwNUEsIDB4NTA0OSwgMHg1MDY1LAorICAgIDB4NTA3NiwgMHg1MDRFLCAweDUwNTUsIDB4NTA3NSwgMHg1MDc0LCAweDUwNzcsIDB4NTA0RiwgMHg1MDBGLCAweDUwNkYsCisgICAgMHg1MDZELCAweDUxNUMsIDB4NTE5NSwgMHg1MUYwLCAweDUyNkEsIDB4NTI2RiwgMHg1MkQyLCAweDUyRDksIDB4NTJEOCwKKyAgICAweDUyRDUsIDB4NTMxMCwgMHg1MzBGLCAweDUzMTksIDB4NTMzRiwgMHg1MzQwLCAweDUzM0UsIDB4NTNDMywgMHg2NkZDLAorICAgIDB4NTU0NiwgMHg1NTZBLCAweDU1NjYsIDB4NTU0NCwgMHg1NTVFLCAweDU1NjEsIDB4NTU0MywgMHg1NTRBLCAweDU1MzEsCisgICAgMHg1NTU2LCAweDU1NEYsIDB4NTU1NSwgMHg1NTJGLCAweDU1NjQsIDB4NTUzOCwgMHg1NTJFLCAweDU1NUMsIDB4NTUyQywKKyAgICAweDU1NjMsIDB4NTUzMywgMHg1NTQxLCAweDU1NTcsIDB4NTcwOCwgMHg1NzBCLCAweDU3MDksIDB4NTdERiwgMHg1ODA1LAorICAgIDB4NTgwQSwgMHg1ODA2LCAweDU3RTAsIDB4NTdFNCwgMHg1N0ZBLCAweDU4MDIsIDB4NTgzNSwgMHg1N0Y3LCAweDU3RjksCisgICAgMHg1OTIwLCAweDU5NjIsIDB4NUEzNiwgMHg1QTQxLCAweDVBNDksIDB4NUE2NiwgMHg1QTZBLCAweDVBNDAsIDB4NUEzQywKKyAgICAweDVBNjIsIDB4NUE1QSwgMHg1QTQ2LCAweDVBNEEsIDB4NUI3MCwgMHg1QkM3LCAweDVCQzUsIDB4NUJDNCwgMHg1QkMyLAorICAgIDB4NUJCRiwgMHg1QkM2LCAweDVDMDksIDB4NUMwOCwgMHg1QzA3LCAweDVDNjAsIDB4NUM1QywgMHg1QzVELCAweDVEMDcsCisgICAgMHg1RDA2LCAweDVEMEUsIDB4NUQxQiwgMHg1RDE2LCAweDVEMjIsIDB4NUQxMSwgMHg1RDI5LCAweDVEMTQsIDB4NUQxOSwKKyAgICAweDVEMjQsIDB4NUQyNywgMHg1RDE3LCAweDVERTIsIDB4NUUzOCwgMHg1RTM2LCAweDVFMzMsIDB4NUUzNywgMHg1RUI3LAorICAgIDB4NUVCOCwgMHg1RUI2LCAweDVFQjUsIDB4NUVCRSwgMHg1RjM1LCAweDVGMzcsIDB4NUY1NywgMHg1RjZDLCAweDVGNjksCisgICAgMHg1RjZCLCAweDVGOTcsIDB4NUY5OSwgMHg1RjlFLCAweDVGOTgsIDB4NUZBMSwgMHg1RkEwLCAweDVGOUMsIDB4NjA3RiwKKyAgICAweDYwQTMsIDB4NjA4OSwgMHg2MEEwLCAweDYwQTgsIDB4NjBDQiwgMHg2MEI0LCAweDYwRTYsIDB4NjBCRCwgMHg2MEM1LAorICAgIDB4NjBCQiwgMHg2MEI1LCAweDYwREMsIDB4NjBCQywgMHg2MEQ4LCAweDYwRDUsIDB4NjBDNiwgMHg2MERGLCAweDYwQjgsCisgICAgMHg2MERBLCAweDYwQzcsIDB4NjIxQSwgMHg2MjFCLCAweDYyNDgsIDB4NjNBMCwgMHg2M0E3LCAweDYzNzIsIDB4NjM5NiwKKyAgICAweDYzQTIsIDB4NjNBNSwgMHg2Mzc3LCAweDYzNjcsIDB4NjM5OCwgMHg2M0FBLCAweDYzNzEsIDB4NjNBOSwgMHg2Mzg5LAorICAgIDB4NjM4MywgMHg2MzlCLCAweDYzNkIsIDB4NjNBOCwgMHg2Mzg0LCAweDYzODgsIDB4NjM5OSwgMHg2M0ExLCAweDYzQUMsCisgICAgMHg2MzkyLCAweDYzOEYsIDB4NjM4MCwgMHg2MzdCLCAweDYzNjksIDB4NjM2OCwgMHg2MzdBLCAweDY1NUQsIDB4NjU1NiwKKyAgICAweDY1NTEsIDB4NjU1OSwgMHg2NTU3LCAweDU1NUYsIDB4NjU0RiwgMHg2NTU4LCAweDY1NTUsIDB4NjU1NCwgMHg2NTlDLAorICAgIDB4NjU5QiwgMHg2NUFDLCAweDY1Q0YsIDB4NjVDQiwgMHg2NUNDLCAweDY1Q0UsIDB4NjY1RCwgMHg2NjVBLCAweDY2NjQsCisgICAgMHg2NjY4LCAweDY2NjYsIDB4NjY1RSwgMHg2NkY5LCAweDUyRDcsIDB4NjcxQiwgMHg2ODgxLCAweDY4QUYsIDB4NjhBMiwKKyAgICAweDY4OTMsIDB4NjhCNSwgMHg2ODdGLCAweDY4NzYsIDB4NjhCMSwgMHg2OEE3LCAweDY4OTcsIDB4NjhCMCwgMHg2ODgzLAorICAgIDB4NjhDNCwgMHg2OEFELCAweDY4ODYsIDB4Njg4NSwgMHg2ODk0LCAweDY4OUQsIDB4NjhBOCwgMHg2ODlGLCAweDY4QTEsCisgICAgMHg2ODgyLCAweDZCMzIsIDB4NkJCQSwgMHg2QkVCLCAweDZCRUMsIDB4NkMyQiwgMHg2RDhFLCAweDZEQkMsIDB4NkRGMywKKyAgICAweDZERDksIDB4NkRCMiwgMHg2REUxLCAweDZEQ0MsIDB4NkRFNCwgMHg2REZCLCAweDZERkEsIDB4NkUwNSwgMHg2REM3LAorICAgIDB4NkRDQiwgMHg2REFGLCAweDZERDEsIDB4NkRBRSwgMHg2RERFLCAweDZERjksIDB4NkRCOCwgMHg2REY3LCAweDZERjUsCisgICAgMHg2REM1LCAweDZERDIsIDB4NkUxQSwgMHg2REI1LCAweDZEREEsIDB4NkRFQiwgMHg2REQ4LCAweDZERUEsIDB4NkRGMSwKKyAgICAweDZERUUsIDB4NkRFOCwgMHg2REM2LCAweDZEQzQsIDB4NkRBQSwgMHg2REVDLCAweDZEQkYsIDB4NkRFNiwgMHg3MEY5LAorICAgIDB4NzEwOSwgMHg3MTBBLCAweDcwRkQsIDB4NzBFRiwgMHg3MjNELCAweDcyN0QsIDB4NzI4MSwgMHg3MzFDLCAweDczMUIsCisgICAgMHg3MzE2LCAweDczMTMsIDB4NzMxOSwgMHg3Mzg3LCAweDc0MDUsIDB4NzQwQSwgMHg3NDAzLCAweDc0MDYsIDB4NzNGRSwKKyAgICAweDc0MEQsIDB4NzRFMCwgMHg3NEY2LCAweDc0RjcsIDB4NzUxQywgMHg3NTIyLCAweDc1NjUsIDB4NzU2NiwgMHg3NTYyLAorICAgIDB4NzU3MCwgMHg3NThGLCAweDc1RDQsIDB4NzVENSwgMHg3NUI1LCAweDc1Q0EsIDB4NzVDRCwgMHg3NjhFLCAweDc2RDQsCisgICAgMHg3NkQyLCAweDc2REIsIDB4NzczNywgMHg3NzNFLCAweDc3M0MsIDB4NzczNiwgMHg3NzM4LCAweDc3M0EsIDB4Nzg2QiwKKyAgICAweDc4NDMsIDB4Nzg0RSwgMHg3OTY1LCAweDc5NjgsIDB4Nzk2RCwgMHg3OUZCLCAweDdBOTIsIDB4N0E5NSwgMHg3QjIwLAorICAgIDB4N0IyOCwgMHg3QjFCLCAweDdCMkMsIDB4N0IyNiwgMHg3QjE5LCAweDdCMUUsIDB4N0IyRSwgMHg3QzkyLCAweDdDOTcsCisgICAgMHg3Qzk1LCAweDdENDYsIDB4N0Q0MywgMHg3RDcxLCAweDdEMkUsIDB4N0QzOSwgMHg3RDNDLCAweDdENDAsIDB4N0QzMCwKKyAgICAweDdEMzMsIDB4N0Q0NCwgMHg3RDJGLCAweDdENDIsIDB4N0QzMiwgMHg3RDMxLCAweDdGM0QsIDB4N0Y5RSwgMHg3RjlBLAorICAgIDB4N0ZDQywgMHg3RkNFLCAweDdGRDIsIDB4ODAxQywgMHg4MDRBLCAweDgwNDYsIDB4ODEyRiwgMHg4MTE2LCAweDgxMjMsCisgICAgMHg4MTJCLCAweDgxMjksIDB4ODEzMCwgMHg4MTI0LCAweDgyMDIsIDB4ODIzNSwgMHg4MjM3LCAweDgyMzYsIDB4ODIzOSwKKyAgICAweDgzOEUsIDB4ODM5RSwgMHg4Mzk4LCAweDgzNzgsIDB4ODNBMiwgMHg4Mzk2LCAweDgzQkQsIDB4ODNBQiwgMHg4MzkyLAorICAgIDB4ODM4QSwgMHg4MzkzLCAweDgzODksIDB4ODNBMCwgMHg4Mzc3LCAweDgzN0IsIDB4ODM3QywgMHg4Mzg2LCAweDgzQTcsCisgICAgMHg4NjU1LCAweDVGNkEsIDB4ODZDNywgMHg4NkMwLCAweDg2QjYsIDB4ODZDNCwgMHg4NkI1LCAweDg2QzYsIDB4ODZDQiwKKyAgICAweDg2QjEsIDB4ODZBRiwgMHg4NkM5LCAweDg4NTMsIDB4ODg5RSwgMHg4ODg4LCAweDg4QUIsIDB4ODg5MiwgMHg4ODk2LAorICAgIDB4ODg4RCwgMHg4ODhCLCAweDg5OTMsIDB4ODk4RiwgMHg4QTJBLCAweDhBMUQsIDB4OEEyMywgMHg4QTI1LCAweDhBMzEsCisgICAgMHg4QTJELCAweDhBMUYsIDB4OEExQiwgMHg4QTIyLCAweDhDNDksIDB4OEM1QSwgMHg4Q0E5LCAweDhDQUMsIDB4OENBQiwKKyAgICAweDhDQTgsIDB4OENBQSwgMHg4Q0E3LCAweDhENjcsIDB4OEQ2NiwgMHg4REJFLCAweDhEQkEsIDB4OEVEQiwgMHg4RURGLAorICAgIDB4OTAxOSwgMHg5MDBELCAweDkwMUEsIDB4OTAxNywgMHg5MDIzLCAweDkwMUYsIDB4OTAxRCwgMHg5MDEwLCAweDkwMTUsCisgICAgMHg5MDFFLCAweDkwMjAsIDB4OTAwRiwgMHg5MDIyLCAweDkwMTYsIDB4OTAxQiwgMHg5MDE0LCAweDkwRTgsIDB4OTBFRCwKKyAgICAweDkwRkQsIDB4OTE1NywgMHg5MUNFLCAweDkxRjUsIDB4OTFFNiwgMHg5MUUzLCAweDkxRTcsIDB4OTFFRCwgMHg5MUU5LAorICAgIDB4OTU4OSwgMHg5NjZBLCAweDk2NzUsIDB4OTY3MywgMHg5Njc4LCAweDk2NzAsIDB4OTY3NCwgMHg5Njc2LCAweDk2NzcsCisgICAgMHg5NjZDLCAweDk2QzAsIDB4OTZFQSwgMHg5NkU5LCAweDdBRTAsIDB4N0FERiwgMHg5ODAyLCAweDk4MDMsIDB4OUI1QSwKKyAgICAweDlDRTUsIDB4OUU3NSwgMHg5RTdGLCAweDlFQTUsIDB4OUVCQiwgMHg1MEEyLCAweDUwOEQsIDB4NTA4NSwgMHg1MDk5LAorICAgIDB4NTA5MSwgMHg1MDgwLCAweDUwOTYsIDB4NTA5OCwgMHg1MDlBLCAweDY3MDAsIDB4NTFGMSwgMHg1MjcyLCAweDUyNzQsCisgICAgMHg1Mjc1LCAweDUyNjksIDB4NTJERSwgMHg1MkRELCAweDUyREIsIDB4NTM1QSwgMHg1M0E1LCAweDU1N0IsIDB4NTU4MCwKKyAgICAweDU1QTcsIDB4NTU3QywgMHg1NThBLCAweDU1OUQsIDB4NTU5OCwgMHg1NTgyLCAweDU1OUMsIDB4NTVBQSwgMHg1NTk0LAorICAgIDB4NTU4NywgMHg1NThCLCAweDU1ODMsIDB4NTVCMywgMHg1NUFFLCAweDU1OUYsIDB4NTUzRSwgMHg1NUIyLCAweDU1OUEsCisgICAgMHg1NUJCLCAweDU1QUMsIDB4NTVCMSwgMHg1NTdFLCAweDU1ODksIDB4NTVBQiwgMHg1NTk5LCAweDU3MEQsIDB4NTgyRiwKKyAgICAweDU4MkEsIDB4NTgzNCwgMHg1ODI0LCAweDU4MzAsIDB4NTgzMSwgMHg1ODIxLCAweDU4MUQsIDB4NTgyMCwgMHg1OEY5LAorICAgIDB4NThGQSwgMHg1OTYwLCAweDVBNzcsIDB4NUE5QSwgMHg1QTdGLCAweDVBOTIsIDB4NUE5QiwgMHg1QUE3LCAweDVCNzMsCisgICAgMHg1QjcxLCAweDVCRDIsIDB4NUJDQywgMHg1QkQzLCAweDVCRDAsIDB4NUMwQSwgMHg1QzBCLCAweDVDMzEsIDB4NUQ0QywKKyAgICAweDVENTAsIDB4NUQzNCwgMHg1RDQ3LCAweDVERkQsIDB4NUU0NSwgMHg1RTNELCAweDVFNDAsIDB4NUU0MywgMHg1RTdFLAorICAgIDB4NUVDQSwgMHg1RUMxLCAweDVFQzIsIDB4NUVDNCwgMHg1RjNDLCAweDVGNkQsIDB4NUZBOSwgMHg1RkFBLCAweDVGQTgsCisgICAgMHg2MEQxLCAweDYwRTEsIDB4NjBCMiwgMHg2MEI2LCAweDYwRTAsIDB4NjExQywgMHg2MTIzLCAweDYwRkEsIDB4NjExNSwKKyAgICAweDYwRjAsIDB4NjBGQiwgMHg2MEY0LCAweDYxNjgsIDB4NjBGMSwgMHg2MTBFLCAweDYwRjYsIDB4NjEwOSwgMHg2MTAwLAorICAgIDB4NjExMiwgMHg2MjFGLCAweDYyNDksIDB4NjNBMywgMHg2MzhDLCAweDYzQ0YsIDB4NjNDMCwgMHg2M0U5LCAweDYzQzksCisgICAgMHg2M0M2LCAweDYzQ0QsIDB4NjNEMiwgMHg2M0UzLCAweDYzRDAsIDB4NjNFMSwgMHg2M0Q2LCAweDYzRUQsIDB4NjNFRSwKKyAgICAweDYzNzYsIDB4NjNGNCwgMHg2M0VBLCAweDYzREIsIDB4NjQ1MiwgMHg2M0RBLCAweDYzRjksIDB4NjU1RSwgMHg2NTY2LAorICAgIDB4NjU2MiwgMHg2NTYzLCAweDY1OTEsIDB4NjU5MCwgMHg2NUFGLCAweDY2NkUsIDB4NjY3MCwgMHg2Njc0LCAweDY2NzYsCisgICAgMHg2NjZGLCAweDY2OTEsIDB4NjY3QSwgMHg2NjdFLCAweDY2NzcsIDB4NjZGRSwgMHg2NkZGLCAweDY3MUYsIDB4NjcxRCwKKyAgICAweDY4RkEsIDB4NjhENSwgMHg2OEUwLCAweDY4RDgsIDB4NjhENywgMHg2OTA1LCAweDY4REYsIDB4NjhGNSwgMHg2OEVFLAorICAgIDB4NjhFNywgMHg2OEY5LCAweDY4RDIsIDB4NjhGMiwgMHg2OEUzLCAweDY4Q0IsIDB4NjhDRCwgMHg2OTBELCAweDY5MTIsCisgICAgMHg2OTBFLCAweDY4QzksIDB4NjhEQSwgMHg2OTZFLCAweDY4RkIsIDB4NkIzRSwgMHg2QjNBLCAweDZCM0QsIDB4NkI5OCwKKyAgICAweDZCOTYsIDB4NkJCQywgMHg2QkVGLCAweDZDMkUsIDB4NkMyRiwgMHg2QzJDLCAweDZFMkYsIDB4NkUzOCwgMHg2RTU0LAorICAgIDB4NkUyMSwgMHg2RTMyLCAweDZFNjcsIDB4NkU0QSwgMHg2RTIwLCAweDZFMjUsIDB4NkUyMywgMHg2RTFCLCAweDZFNUIsCisgICAgMHg2RTU4LCAweDZFMjQsIDB4NkU1NiwgMHg2RTZFLCAweDZFMkQsIDB4NkUyNiwgMHg2RTZGLCAweDZFMzQsIDB4NkU0RCwKKyAgICAweDZFM0EsIDB4NkUyQywgMHg2RTQzLCAweDZFMUQsIDB4NkUzRSwgMHg2RUNCLCAweDZFODksIDB4NkUxOSwgMHg2RTRFLAorICAgIDB4NkU2MywgMHg2RTQ0LCAweDZFNzIsIDB4NkU2OSwgMHg2RTVGLCAweDcxMTksIDB4NzExQSwgMHg3MTI2LCAweDcxMzAsCisgICAgMHg3MTIxLCAweDcxMzYsIDB4NzE2RSwgMHg3MTFDLCAweDcyNEMsIDB4NzI4NCwgMHg3MjgwLCAweDczMzYsIDB4NzMyNSwKKyAgICAweDczMzQsIDB4NzMyOSwgMHg3NDNBLCAweDc0MkEsIDB4NzQzMywgMHg3NDIyLCAweDc0MjUsIDB4NzQzNSwgMHg3NDM2LAorICAgIDB4NzQzNCwgMHg3NDJGLCAweDc0MUIsIDB4NzQyNiwgMHg3NDI4LCAweDc1MjUsIDB4NzUyNiwgMHg3NTZCLCAweDc1NkEsCisgICAgMHg3NUUyLCAweDc1REIsIDB4NzVFMywgMHg3NUQ5LCAweDc1RDgsIDB4NzVERSwgMHg3NUUwLCAweDc2N0IsIDB4NzY3QywKKyAgICAweDc2OTYsIDB4NzY5MywgMHg3NkI0LCAweDc2REMsIDB4Nzc0RiwgMHg3N0VELCAweDc4NUQsIDB4Nzg2QywgMHg3ODZGLAorICAgIDB4N0EwRCwgMHg3QTA4LCAweDdBMEIsIDB4N0EwNSwgMHg3QTAwLCAweDdBOTgsIDB4N0E5NywgMHg3QTk2LCAweDdBRTUsCisgICAgMHg3QUUzLCAweDdCNDksIDB4N0I1NiwgMHg3QjQ2LCAweDdCNTAsIDB4N0I1MiwgMHg3QjU0LCAweDdCNEQsIDB4N0I0QiwKKyAgICAweDdCNEYsIDB4N0I1MSwgMHg3QzlGLCAweDdDQTUsIDB4N0Q1RSwgMHg3RDUwLCAweDdENjgsIDB4N0Q1NSwgMHg3RDJCLAorICAgIDB4N0Q2RSwgMHg3RDcyLCAweDdENjEsIDB4N0Q2NiwgMHg3RDYyLCAweDdENzAsIDB4N0Q3MywgMHg1NTg0LCAweDdGRDQsCisgICAgMHg3RkQ1LCAweDgwMEIsIDB4ODA1MiwgMHg4MDg1LCAweDgxNTUsIDB4ODE1NCwgMHg4MTRCLCAweDgxNTEsIDB4ODE0RSwKKyAgICAweDgxMzksIDB4ODE0NiwgMHg4MTNFLCAweDgxNEMsIDB4ODE1MywgMHg4MTc0LCAweDgyMTIsIDB4ODIxQywgMHg4M0U5LAorICAgIDB4ODQwMywgMHg4M0Y4LCAweDg0MEQsIDB4ODNFMCwgMHg4M0M1LCAweDg0MEIsIDB4ODNDMSwgMHg4M0VGLCAweDgzRjEsCisgICAgMHg4M0Y0LCAweDg0NTcsIDB4ODQwQSwgMHg4M0YwLCAweDg0MEMsIDB4ODNDQywgMHg4M0ZELCAweDgzRjIsIDB4ODNDQSwKKyAgICAweDg0MzgsIDB4ODQwRSwgMHg4NDA0LCAweDgzREMsIDB4ODQwNywgMHg4M0Q0LCAweDgzREYsIDB4ODY1QiwgMHg4NkRGLAorICAgIDB4ODZEOSwgMHg4NkVELCAweDg2RDQsIDB4ODZEQiwgMHg4NkU0LCAweDg2RDAsIDB4ODZERSwgMHg4ODU3LCAweDg4QzEsCisgICAgMHg4OEMyLCAweDg4QjEsIDB4ODk4MywgMHg4OTk2LCAweDhBM0IsIDB4OEE2MCwgMHg4QTU1LCAweDhBNUUsIDB4OEEzQywKKyAgICAweDhBNDEsIDB4OEE1NCwgMHg4QTVCLCAweDhBNTAsIDB4OEE0NiwgMHg4QTM0LCAweDhBM0EsIDB4OEEzNiwgMHg4QTU2LAorICAgIDB4OEM2MSwgMHg4QzgyLCAweDhDQUYsIDB4OENCQywgMHg4Q0IzLCAweDhDQkQsIDB4OENDMSwgMHg4Q0JCLCAweDhDQzAsCisgICAgMHg4Q0I0LCAweDhDQjcsIDB4OENCNiwgMHg4Q0JGLCAweDhDQjgsIDB4OEQ4QSwgMHg4RDg1LCAweDhEODEsIDB4OERDRSwKKyAgICAweDhEREQsIDB4OERDQiwgMHg4RERBLCAweDhERDEsIDB4OERDQywgMHg4RERCLCAweDhEQzYsIDB4OEVGQiwgMHg4RUY4LAorICAgIDB4OEVGQywgMHg4RjlDLCAweDkwMkUsIDB4OTAzNSwgMHg5MDMxLCAweDkwMzgsIDB4OTAzMiwgMHg5MDM2LCAweDkxMDIsCisgICAgMHg5MEY1LCAweDkxMDksIDB4OTBGRSwgMHg5MTYzLCAweDkxNjUsIDB4OTFDRiwgMHg5MjE0LCAweDkyMTUsIDB4OTIyMywKKyAgICAweDkyMDksIDB4OTIxRSwgMHg5MjBELCAweDkyMTAsIDB4OTIwNywgMHg5MjExLCAweDk1OTQsIDB4OTU4RiwgMHg5NThCLAorICAgIDB4OTU5MSwgMHg5NTkzLCAweDk1OTIsIDB4OTU4RSwgMHg5NjhBLCAweDk2OEUsIDB4OTY4QiwgMHg5NjdELCAweDk2ODUsCisgICAgMHg5Njg2LCAweDk2OEQsIDB4OTY3MiwgMHg5Njg0LCAweDk2QzEsIDB4OTZDNSwgMHg5NkM0LCAweDk2QzYsIDB4OTZDNywKKyAgICAweDk2RUYsIDB4OTZGMiwgMHg5N0NDLCAweDk4MDUsIDB4OTgwNiwgMHg5ODA4LCAweDk4RTcsIDB4OThFQSwgMHg5OEVGLAorICAgIDB4OThFOSwgMHg5OEYyLCAweDk4RUQsIDB4OTlBRSwgMHg5OUFELCAweDlFQzMsIDB4OUVDRCwgMHg5RUQxLCAweDRFODIsCisgICAgMHg1MEFELCAweDUwQjUsIDB4NTBCMiwgMHg1MEIzLCAweDUwQzUsIDB4NTBCRSwgMHg1MEFDLCAweDUwQjcsIDB4NTBCQiwKKyAgICAweDUwQUYsIDB4NTBDNywgMHg1MjdGLCAweDUyNzcsIDB4NTI3RCwgMHg1MkRGLCAweDUyRTYsIDB4NTJFNCwgMHg1MkUyLAorICAgIDB4NTJFMywgMHg1MzJGLCAweDU1REYsIDB4NTVFOCwgMHg1NUQzLCAweDU1RTYsIDB4NTVDRSwgMHg1NURDLCAweDU1QzcsCisgICAgMHg1NUQxLCAweDU1RTMsIDB4NTVFNCwgMHg1NUVGLCAweDU1REEsIDB4NTVFMSwgMHg1NUM1LCAweDU1QzYsIDB4NTVFNSwKKyAgICAweDU1QzksIDB4NTcxMiwgMHg1NzEzLCAweDU4NUUsIDB4NTg1MSwgMHg1ODU4LCAweDU4NTcsIDB4NTg1QSwgMHg1ODU0LAorICAgIDB4NTg2QiwgMHg1ODRDLCAweDU4NkQsIDB4NTg0QSwgMHg1ODYyLCAweDU4NTIsIDB4NTg0QiwgMHg1OTY3LCAweDVBQzEsCisgICAgMHg1QUM5LCAweDVBQ0MsIDB4NUFCRSwgMHg1QUJELCAweDVBQkMsIDB4NUFCMywgMHg1QUMyLCAweDVBQjIsIDB4NUQ2OSwKKyAgICAweDVENkYsIDB4NUU0QywgMHg1RTc5LCAweDVFQzksIDB4NUVDOCwgMHg1RjEyLCAweDVGNTksIDB4NUZBQywgMHg1RkFFLAorICAgIDB4NjExQSwgMHg2MTBGLCAweDYxNDgsIDB4NjExRiwgMHg2MEYzLCAweDYxMUIsIDB4NjBGOSwgMHg2MTAxLCAweDYxMDgsCisgICAgMHg2MTRFLCAweDYxNEMsIDB4NjE0NCwgMHg2MTRELCAweDYxM0UsIDB4NjEzNCwgMHg2MTI3LCAweDYxMEQsIDB4NjEwNiwKKyAgICAweDYxMzcsIDB4NjIyMSwgMHg2MjIyLCAweDY0MTMsIDB4NjQzRSwgMHg2NDFFLCAweDY0MkEsIDB4NjQyRCwgMHg2NDNELAorICAgIDB4NjQyQywgMHg2NDBGLCAweDY0MUMsIDB4NjQxNCwgMHg2NDBELCAweDY0MzYsIDB4NjQxNiwgMHg2NDE3LCAweDY0MDYsCisgICAgMHg2NTZDLCAweDY1OUYsIDB4NjVCMCwgMHg2Njk3LCAweDY2ODksIDB4NjY4NywgMHg2Njg4LCAweDY2OTYsIDB4NjY4NCwKKyAgICAweDY2OTgsIDB4NjY4RCwgMHg2NzAzLCAweDY5OTQsIDB4Njk2RCwgMHg2OTVBLCAweDY5NzcsIDB4Njk2MCwgMHg2OTU0LAorICAgIDB4Njk3NSwgMHg2OTMwLCAweDY5ODIsIDB4Njk0QSwgMHg2OTY4LCAweDY5NkIsIDB4Njk1RSwgMHg2OTUzLCAweDY5NzksCisgICAgMHg2OTg2LCAweDY5NUQsIDB4Njk2MywgMHg2OTVCLCAweDZCNDcsIDB4NkI3MiwgMHg2QkMwLCAweDZCQkYsIDB4NkJEMywKKyAgICAweDZCRkQsIDB4NkVBMiwgMHg2RUFGLCAweDZFRDMsIDB4NkVCNiwgMHg2RUMyLCAweDZFOTAsIDB4NkU5RCwgMHg2RUM3LAorICAgIDB4NkVDNSwgMHg2RUE1LCAweDZFOTgsIDB4NkVCQywgMHg2RUJBLCAweDZFQUIsIDB4NkVEMSwgMHg2RTk2LCAweDZFOUMsCisgICAgMHg2RUM0LCAweDZFRDQsIDB4NkVBQSwgMHg2RUE3LCAweDZFQjQsIDB4NzE0RSwgMHg3MTU5LCAweDcxNjksIDB4NzE2NCwKKyAgICAweDcxNDksIDB4NzE2NywgMHg3MTVDLCAweDcxNkMsIDB4NzE2NiwgMHg3MTRDLCAweDcxNjUsIDB4NzE1RSwgMHg3MTQ2LAorICAgIDB4NzE2OCwgMHg3MTU2LCAweDcyM0EsIDB4NzI1MiwgMHg3MzM3LCAweDczNDUsIDB4NzMzRiwgMHg3MzNFLCAweDc0NkYsCisgICAgMHg3NDVBLCAweDc0NTUsIDB4NzQ1RiwgMHg3NDVFLCAweDc0NDEsIDB4NzQzRiwgMHg3NDU5LCAweDc0NUIsIDB4NzQ1QywKKyAgICAweDc1NzYsIDB4NzU3OCwgMHg3NjAwLCAweDc1RjAsIDB4NzYwMSwgMHg3NUYyLCAweDc1RjEsIDB4NzVGQSwgMHg3NUZGLAorICAgIDB4NzVGNCwgMHg3NUYzLCAweDc2REUsIDB4NzZERiwgMHg3NzVCLCAweDc3NkIsIDB4Nzc2NiwgMHg3NzVFLCAweDc3NjMsCisgICAgMHg3Nzc5LCAweDc3NkEsIDB4Nzc2QywgMHg3NzVDLCAweDc3NjUsIDB4Nzc2OCwgMHg3NzYyLCAweDc3RUUsIDB4Nzg4RSwKKyAgICAweDc4QjAsIDB4Nzg5NywgMHg3ODk4LCAweDc4OEMsIDB4Nzg4OSwgMHg3ODdDLCAweDc4OTEsIDB4Nzg5MywgMHg3ODdGLAorICAgIDB4Nzk3QSwgMHg3OTdGLCAweDc5ODEsIDB4ODQyQywgMHg3OUJELCAweDdBMUMsIDB4N0ExQSwgMHg3QTIwLCAweDdBMTQsCisgICAgMHg3QTFGLCAweDdBMUUsIDB4N0E5RiwgMHg3QUEwLCAweDdCNzcsIDB4N0JDMCwgMHg3QjYwLCAweDdCNkUsIDB4N0I2NywKKyAgICAweDdDQjEsIDB4N0NCMywgMHg3Q0I1LCAweDdEOTMsIDB4N0Q3OSwgMHg3RDkxLCAweDdEODEsIDB4N0Q4RiwgMHg3RDVCLAorICAgIDB4N0Y2RSwgMHg3RjY5LCAweDdGNkEsIDB4N0Y3MiwgMHg3RkE5LCAweDdGQTgsIDB4N0ZBNCwgMHg4MDU2LCAweDgwNTgsCisgICAgMHg4MDg2LCAweDgwODQsIDB4ODE3MSwgMHg4MTcwLCAweDgxNzgsIDB4ODE2NSwgMHg4MTZFLCAweDgxNzMsIDB4ODE2QiwKKyAgICAweDgxNzksIDB4ODE3QSwgMHg4MTY2LCAweDgyMDUsIDB4ODI0NywgMHg4NDgyLCAweDg0NzcsIDB4ODQzRCwgMHg4NDMxLAorICAgIDB4ODQ3NSwgMHg4NDY2LCAweDg0NkIsIDB4ODQ0OSwgMHg4NDZDLCAweDg0NUIsIDB4ODQzQywgMHg4NDM1LCAweDg0NjEsCisgICAgMHg4NDYzLCAweDg0NjksIDB4ODQ2RCwgMHg4NDQ2LCAweDg2NUUsIDB4ODY1QywgMHg4NjVGLCAweDg2RjksIDB4ODcxMywKKyAgICAweDg3MDgsIDB4ODcwNywgMHg4NzAwLCAweDg2RkUsIDB4ODZGQiwgMHg4NzAyLCAweDg3MDMsIDB4ODcwNiwgMHg4NzBBLAorICAgIDB4ODg1OSwgMHg4OERGLCAweDg4RDQsIDB4ODhEOSwgMHg4OERDLCAweDg4RDgsIDB4ODhERCwgMHg4OEUxLCAweDg4Q0EsCisgICAgMHg4OEQ1LCAweDg4RDIsIDB4ODk5QywgMHg4OUUzLCAweDhBNkIsIDB4OEE3MiwgMHg4QTczLCAweDhBNjYsIDB4OEE2OSwKKyAgICAweDhBNzAsIDB4OEE4NywgMHg4QTdDLCAweDhBNjMsIDB4OEFBMCwgMHg4QTcxLCAweDhBODUsIDB4OEE2RCwgMHg4QTYyLAorICAgIDB4OEE2RSwgMHg4QTZDLCAweDhBNzksIDB4OEE3QiwgMHg4QTNFLCAweDhBNjgsIDB4OEM2MiwgMHg4QzhBLCAweDhDODksCisgICAgMHg4Q0NBLCAweDhDQzcsIDB4OENDOCwgMHg4Q0M0LCAweDhDQjIsIDB4OENDMywgMHg4Q0MyLCAweDhDQzUsIDB4OERFMSwKKyAgICAweDhEREYsIDB4OERFOCwgMHg4REVGLCAweDhERjMsIDB4OERGQSwgMHg4REVBLCAweDhERTQsIDB4OERFNiwgMHg4RUIyLAorICAgIDB4OEYwMywgMHg4RjA5LCAweDhFRkUsIDB4OEYwQSwgMHg4RjlGLCAweDhGQjIsIDB4OTA0QiwgMHg5MDRBLCAweDkwNTMsCisgICAgMHg5MDQyLCAweDkwNTQsIDB4OTAzQywgMHg5MDU1LCAweDkwNTAsIDB4OTA0NywgMHg5MDRGLCAweDkwNEUsIDB4OTA0RCwKKyAgICAweDkwNTEsIDB4OTAzRSwgMHg5MDQxLCAweDkxMTIsIDB4OTExNywgMHg5MTZDLCAweDkxNkEsIDB4OTE2OSwgMHg5MUM5LAorICAgIDB4OTIzNywgMHg5MjU3LCAweDkyMzgsIDB4OTIzRCwgMHg5MjQwLCAweDkyM0UsIDB4OTI1QiwgMHg5MjRCLCAweDkyNjQsCisgICAgMHg5MjUxLCAweDkyMzQsIDB4OTI0OSwgMHg5MjRELCAweDkyNDUsIDB4OTIzOSwgMHg5MjNGLCAweDkyNUEsIDB4OTU5OCwKKyAgICAweDk2OTgsIDB4OTY5NCwgMHg5Njk1LCAweDk2Q0QsIDB4OTZDQiwgMHg5NkM5LCAweDk2Q0EsIDB4OTZGNywgMHg5NkZCLAorICAgIDB4OTZGOSwgMHg5NkY2LCAweDk3NTYsIDB4OTc3NCwgMHg5Nzc2LCAweDk4MTAsIDB4OTgxMSwgMHg5ODEzLCAweDk4MEEsCisgICAgMHg5ODEyLCAweDk4MEMsIDB4OThGQywgMHg5OEY0LCAweDk4RkQsIDB4OThGRSwgMHg5OUIzLCAweDk5QjEsIDB4OTlCNCwKKyAgICAweDlBRTEsIDB4OUNFOSwgMHg5RTgyLCAweDlGMEUsIDB4OUYxMywgMHg5RjIwLCAweDUwRTcsIDB4NTBFRSwgMHg1MEU1LAorICAgIDB4NTBENiwgMHg1MEVELCAweDUwREEsIDB4NTBENSwgMHg1MENGLCAweDUwRDEsIDB4NTBGMSwgMHg1MENFLCAweDUwRTksCisgICAgMHg1MTYyLCAweDUxRjMsIDB4NTI4MywgMHg1MjgyLCAweDUzMzEsIDB4NTNBRCwgMHg1NUZFLCAweDU2MDAsIDB4NTYxQiwKKyAgICAweDU2MTcsIDB4NTVGRCwgMHg1NjE0LCAweDU2MDYsIDB4NTYwOSwgMHg1NjBELCAweDU2MEUsIDB4NTVGNywgMHg1NjE2LAorICAgIDB4NTYxRiwgMHg1NjA4LCAweDU2MTAsIDB4NTVGNiwgMHg1NzE4LCAweDU3MTYsIDB4NTg3NSwgMHg1ODdFLCAweDU4ODMsCisgICAgMHg1ODkzLCAweDU4OEEsIDB4NTg3OSwgMHg1ODg1LCAweDU4N0QsIDB4NThGRCwgMHg1OTI1LCAweDU5MjIsIDB4NTkyNCwKKyAgICAweDU5NkEsIDB4NTk2OSwgMHg1QUUxLCAweDVBRTYsIDB4NUFFOSwgMHg1QUQ3LCAweDVBRDYsIDB4NUFEOCwgMHg1QUUzLAorICAgIDB4NUI3NSwgMHg1QkRFLCAweDVCRTcsIDB4NUJFMSwgMHg1QkU1LCAweDVCRTYsIDB4NUJFOCwgMHg1QkUyLCAweDVCRTQsCisgICAgMHg1QkRGLCAweDVDMEQsIDB4NUM2MiwgMHg1RDg0LCAweDVEODcsIDB4NUU1QiwgMHg1RTYzLCAweDVFNTUsIDB4NUU1NywKKyAgICAweDVFNTQsIDB4NUVEMywgMHg1RUQ2LCAweDVGMEEsIDB4NUY0NiwgMHg1RjcwLCAweDVGQjksIDB4NjE0NywgMHg2MTNGLAorICAgIDB4NjE0QiwgMHg2MTc3LCAweDYxNjIsIDB4NjE2MywgMHg2MTVGLCAweDYxNUEsIDB4NjE1OCwgMHg2MTc1LCAweDYyMkEsCisgICAgMHg2NDg3LCAweDY0NTgsIDB4NjQ1NCwgMHg2NEE0LCAweDY0NzgsIDB4NjQ1RiwgMHg2NDdBLCAweDY0NTEsIDB4NjQ2NywKKyAgICAweDY0MzQsIDB4NjQ2RCwgMHg2NDdCLCAweDY1NzIsIDB4NjVBMSwgMHg2NUQ3LCAweDY1RDYsIDB4NjZBMiwgMHg2NkE4LAorICAgIDB4NjY5RCwgMHg2OTlDLCAweDY5QTgsIDB4Njk5NSwgMHg2OUMxLCAweDY5QUUsIDB4NjlEMywgMHg2OUNCLCAweDY5OUIsCisgICAgMHg2OUI3LCAweDY5QkIsIDB4NjlBQiwgMHg2OUI0LCAweDY5RDAsIDB4NjlDRCwgMHg2OUFELCAweDY5Q0MsIDB4NjlBNiwKKyAgICAweDY5QzMsIDB4NjlBMywgMHg2QjQ5LCAweDZCNEMsIDB4NkMzMywgMHg2RjMzLCAweDZGMTQsIDB4NkVGRSwgMHg2RjEzLAorICAgIDB4NkVGNCwgMHg2RjI5LCAweDZGM0UsIDB4NkYyMCwgMHg2RjJDLCAweDZGMEYsIDB4NkYwMiwgMHg2RjIyLCAweDZFRkYsCisgICAgMHg2RUVGLCAweDZGMDYsIDB4NkYzMSwgMHg2RjM4LCAweDZGMzIsIDB4NkYyMywgMHg2RjE1LCAweDZGMkIsIDB4NkYyRiwKKyAgICAweDZGODgsIDB4NkYyQSwgMHg2RUVDLCAweDZGMDEsIDB4NkVGMiwgMHg2RUNDLCAweDZFRjcsIDB4NzE5NCwgMHg3MTk5LAorICAgIDB4NzE3RCwgMHg3MThBLCAweDcxODQsIDB4NzE5MiwgMHg3MjNFLCAweDcyOTIsIDB4NzI5NiwgMHg3MzQ0LCAweDczNTAsCisgICAgMHg3NDY0LCAweDc0NjMsIDB4NzQ2QSwgMHg3NDcwLCAweDc0NkQsIDB4NzUwNCwgMHg3NTkxLCAweDc2MjcsIDB4NzYwRCwKKyAgICAweDc2MEIsIDB4NzYwOSwgMHg3NjEzLCAweDc2RTEsIDB4NzZFMywgMHg3Nzg0LCAweDc3N0QsIDB4Nzc3RiwgMHg3NzYxLAorICAgIDB4NzhDMSwgMHg3ODlGLCAweDc4QTcsIDB4NzhCMywgMHg3OEE5LCAweDc4QTMsIDB4Nzk4RSwgMHg3OThGLCAweDc5OEQsCisgICAgMHg3QTJFLCAweDdBMzEsIDB4N0FBQSwgMHg3QUE5LCAweDdBRUQsIDB4N0FFRiwgMHg3QkExLCAweDdCOTUsIDB4N0I4QiwKKyAgICAweDdCNzUsIDB4N0I5NywgMHg3QjlELCAweDdCOTQsIDB4N0I4RiwgMHg3QkI4LCAweDdCODcsIDB4N0I4NCwgMHg3Q0I5LAorICAgIDB4N0NCRCwgMHg3Q0JFLCAweDdEQkIsIDB4N0RCMCwgMHg3RDlDLCAweDdEQkQsIDB4N0RCRSwgMHg3REEwLCAweDdEQ0EsCisgICAgMHg3REI0LCAweDdEQjIsIDB4N0RCMSwgMHg3REJBLCAweDdEQTIsIDB4N0RCRiwgMHg3REI1LCAweDdEQjgsIDB4N0RBRCwKKyAgICAweDdERDIsIDB4N0RDNywgMHg3REFDLCAweDdGNzAsIDB4N0ZFMCwgMHg3RkUxLCAweDdGREYsIDB4ODA1RSwgMHg4MDVBLAorICAgIDB4ODA4NywgMHg4MTUwLCAweDgxODAsIDB4ODE4RiwgMHg4MTg4LCAweDgxOEEsIDB4ODE3RiwgMHg4MTgyLCAweDgxRTcsCisgICAgMHg4MUZBLCAweDgyMDcsIDB4ODIxNCwgMHg4MjFFLCAweDgyNEIsIDB4ODRDOSwgMHg4NEJGLCAweDg0QzYsIDB4ODRDNCwKKyAgICAweDg0OTksIDB4ODQ5RSwgMHg4NEIyLCAweDg0OUMsIDB4ODRDQiwgMHg4NEI4LCAweDg0QzAsIDB4ODREMywgMHg4NDkwLAorICAgIDB4ODRCQywgMHg4NEQxLCAweDg0Q0EsIDB4ODczRiwgMHg4NzFDLCAweDg3M0IsIDB4ODcyMiwgMHg4NzI1LCAweDg3MzQsCisgICAgMHg4NzE4LCAweDg3NTUsIDB4ODczNywgMHg4NzI5LCAweDg4RjMsIDB4ODkwMiwgMHg4OEY0LCAweDg4RjksIDB4ODhGOCwKKyAgICAweDg4RkQsIDB4ODhFOCwgMHg4OTFBLCAweDg4RUYsIDB4OEFBNiwgMHg4QThDLCAweDhBOUUsIDB4OEFBMywgMHg4QThELAorICAgIDB4OEFBMSwgMHg4QTkzLCAweDhBQTQsIDB4OEFBQSwgMHg4QUE1LCAweDhBQTgsIDB4OEE5OCwgMHg4QTkxLCAweDhBOUEsCisgICAgMHg4QUE3LCAweDhDNkEsIDB4OEM4RCwgMHg4QzhDLCAweDhDRDMsIDB4OENEMSwgMHg4Q0QyLCAweDhENkIsIDB4OEQ5OSwKKyAgICAweDhEOTUsIDB4OERGQywgMHg4RjE0LCAweDhGMTIsIDB4OEYxNSwgMHg4RjEzLCAweDhGQTMsIDB4OTA2MCwgMHg5MDU4LAorICAgIDB4OTA1QywgMHg5MDYzLCAweDkwNTksIDB4OTA1RSwgMHg5MDYyLCAweDkwNUQsIDB4OTA1QiwgMHg5MTE5LCAweDkxMTgsCisgICAgMHg5MTFFLCAweDkxNzUsIDB4OTE3OCwgMHg5MTc3LCAweDkxNzQsIDB4OTI3OCwgMHg5MkFDLCAweDkyODAsIDB4OTI4NSwKKyAgICAweDkyOTgsIDB4OTI5NiwgMHg5MjdCLCAweDkyOTMsIDB4OTI5QywgMHg5MkE4LCAweDkyN0MsIDB4OTI5MSwgMHg5NUExLAorICAgIDB4OTVBOCwgMHg5NUE5LCAweDk1QTMsIDB4OTVBNSwgMHg5NUE0LCAweDk2OTksIDB4OTY5QywgMHg5NjlCLCAweDk2Q0MsCisgICAgMHg5NkQyLCAweDk3MDAsIDB4OTc3QywgMHg5Nzg1LCAweDk3RjYsIDB4OTgxNywgMHg5ODE4LCAweDk4QUYsIDB4OThCMSwKKyAgICAweDk5MDMsIDB4OTkwNSwgMHg5OTBDLCAweDk5MDksIDB4OTlDMSwgMHg5QUFGLCAweDlBQjAsIDB4OUFFNiwgMHg5QjQxLAorICAgIDB4OUI0MiwgMHg5Q0Y0LCAweDlDRjYsIDB4OUNGMywgMHg5RUJDLCAweDlGM0IsIDB4OUY0QSwgMHg1MTA0LCAweDUxMDAsCisgICAgMHg1MEZCLCAweDUwRjUsIDB4NTBGOSwgMHg1MTAyLCAweDUxMDgsIDB4NTEwOSwgMHg1MTA1LCAweDUxREMsIDB4NTI4NywKKyAgICAweDUyODgsIDB4NTI4OSwgMHg1MjhELCAweDUyOEEsIDB4NTJGMCwgMHg1M0IyLCAweDU2MkUsIDB4NTYzQiwgMHg1NjM5LAorICAgIDB4NTYzMiwgMHg1NjNGLCAweDU2MzQsIDB4NTYyOSwgMHg1NjUzLCAweDU2NEUsIDB4NTY1NywgMHg1Njc0LCAweDU2MzYsCisgICAgMHg1NjJGLCAweDU2MzAsIDB4NTg4MCwgMHg1ODlGLCAweDU4OUUsIDB4NThCMywgMHg1ODlDLCAweDU4QUUsIDB4NThBOSwKKyAgICAweDU4QTYsIDB4NTk2RCwgMHg1QjA5LCAweDVBRkIsIDB4NUIwQiwgMHg1QUY1LCAweDVCMEMsIDB4NUIwOCwgMHg1QkVFLAorICAgIDB4NUJFQywgMHg1QkU5LCAweDVCRUIsIDB4NUM2NCwgMHg1QzY1LCAweDVEOUQsIDB4NUQ5NCwgMHg1RTYyLCAweDVFNUYsCisgICAgMHg1RTYxLCAweDVFRTIsIDB4NUVEQSwgMHg1RURGLCAweDVFREQsIDB4NUVFMywgMHg1RUUwLCAweDVGNDgsIDB4NUY3MSwKKyAgICAweDVGQjcsIDB4NUZCNSwgMHg2MTc2LCAweDYxNjcsIDB4NjE2RSwgMHg2MTVELCAweDYxNTUsIDB4NjE4MiwgMHg2MTdDLAorICAgIDB4NjE3MCwgMHg2MTZCLCAweDYxN0UsIDB4NjFBNywgMHg2MTkwLCAweDYxQUIsIDB4NjE4RSwgMHg2MUFDLCAweDYxOUEsCisgICAgMHg2MUE0LCAweDYxOTQsIDB4NjFBRSwgMHg2MjJFLCAweDY0NjksIDB4NjQ2RiwgMHg2NDc5LCAweDY0OUUsIDB4NjRCMiwKKyAgICAweDY0ODgsIDB4NjQ5MCwgMHg2NEIwLCAweDY0QTUsIDB4NjQ5MywgMHg2NDk1LCAweDY0QTksIDB4NjQ5MiwgMHg2NEFFLAorICAgIDB4NjRBRCwgMHg2NEFCLCAweDY0OUEsIDB4NjRBQywgMHg2NDk5LCAweDY0QTIsIDB4NjRCMywgMHg2NTc1LCAweDY1NzcsCisgICAgMHg2NTc4LCAweDY2QUUsIDB4NjZBQiwgMHg2NkI0LCAweDY2QjEsIDB4NkEyMywgMHg2QTFGLCAweDY5RTgsIDB4NkEwMSwKKyAgICAweDZBMUUsIDB4NkExOSwgMHg2OUZELCAweDZBMjEsIDB4NkExMywgMHg2QTBBLCAweDY5RjMsIDB4NkEwMiwgMHg2QTA1LAorICAgIDB4NjlFRCwgMHg2QTExLCAweDZCNTAsIDB4NkI0RSwgMHg2QkE0LCAweDZCQzUsIDB4NkJDNiwgMHg2RjNGLCAweDZGN0MsCisgICAgMHg2Rjg0LCAweDZGNTEsIDB4NkY2NiwgMHg2RjU0LCAweDZGODYsIDB4NkY2RCwgMHg2RjVCLCAweDZGNzgsIDB4NkY2RSwKKyAgICAweDZGOEUsIDB4NkY3QSwgMHg2RjcwLCAweDZGNjQsIDB4NkY5NywgMHg2RjU4LCAweDZFRDUsIDB4NkY2RiwgMHg2RjYwLAorICAgIDB4NkY1RiwgMHg3MTlGLCAweDcxQUMsIDB4NzFCMSwgMHg3MUE4LCAweDcyNTYsIDB4NzI5QiwgMHg3MzRFLCAweDczNTcsCisgICAgMHg3NDY5LCAweDc0OEIsIDB4NzQ4MywgMHg3NDdFLCAweDc0ODAsIDB4NzU3RiwgMHg3NjIwLCAweDc2MjksIDB4NzYxRiwKKyAgICAweDc2MjQsIDB4NzYyNiwgMHg3NjIxLCAweDc2MjIsIDB4NzY5QSwgMHg3NkJBLCAweDc2RTQsIDB4Nzc4RSwgMHg3Nzg3LAorICAgIDB4Nzc4QywgMHg3NzkxLCAweDc3OEIsIDB4NzhDQiwgMHg3OEM1LCAweDc4QkEsIDB4NzhDQSwgMHg3OEJFLCAweDc4RDUsCisgICAgMHg3OEJDLCAweDc4RDAsIDB4N0EzRiwgMHg3QTNDLCAweDdBNDAsIDB4N0EzRCwgMHg3QTM3LCAweDdBM0IsIDB4N0FBRiwKKyAgICAweDdBQUUsIDB4N0JBRCwgMHg3QkIxLCAweDdCQzQsIDB4N0JCNCwgMHg3QkM2LCAweDdCQzcsIDB4N0JDMSwgMHg3QkEwLAorICAgIDB4N0JDQywgMHg3Q0NBLCAweDdERTAsIDB4N0RGNCwgMHg3REVGLCAweDdERkIsIDB4N0REOCwgMHg3REVDLCAweDdEREQsCisgICAgMHg3REU4LCAweDdERTMsIDB4N0REQSwgMHg3RERFLCAweDdERTksIDB4N0Q5RSwgMHg3REQ5LCAweDdERjIsIDB4N0RGOSwKKyAgICAweDdGNzUsIDB4N0Y3NywgMHg3RkFGLCAweDdGRTksIDB4ODAyNiwgMHg4MTlCLCAweDgxOUMsIDB4ODE5RCwgMHg4MUEwLAorICAgIDB4ODE5QSwgMHg4MTk4LCAweDg1MTcsIDB4ODUzRCwgMHg4NTFBLCAweDg0RUUsIDB4ODUyQywgMHg4NTJELCAweDg1MTMsCisgICAgMHg4NTExLCAweDg1MjMsIDB4ODUyMSwgMHg4NTE0LCAweDg0RUMsIDB4ODUyNSwgMHg4NEZGLCAweDg1MDYsIDB4ODc4MiwKKyAgICAweDg3NzQsIDB4ODc3NiwgMHg4NzYwLCAweDg3NjYsIDB4ODc3OCwgMHg4NzY4LCAweDg3NTksIDB4ODc1NywgMHg4NzRDLAorICAgIDB4ODc1MywgMHg4ODVCLCAweDg4NUQsIDB4ODkxMCwgMHg4OTA3LCAweDg5MTIsIDB4ODkxMywgMHg4OTE1LCAweDg5MEEsCisgICAgMHg4QUJDLCAweDhBRDIsIDB4OEFDNywgMHg4QUM0LCAweDhBOTUsIDB4OEFDQiwgMHg4QUY4LCAweDhBQjIsIDB4OEFDOSwKKyAgICAweDhBQzIsIDB4OEFCRiwgMHg4QUIwLCAweDhBRDYsIDB4OEFDRCwgMHg4QUI2LCAweDhBQjksIDB4OEFEQiwgMHg4QzRDLAorICAgIDB4OEM0RSwgMHg4QzZDLCAweDhDRTAsIDB4OENERSwgMHg4Q0U2LCAweDhDRTQsIDB4OENFQywgMHg4Q0VELCAweDhDRTIsCisgICAgMHg4Q0UzLCAweDhDREMsIDB4OENFQSwgMHg4Q0UxLCAweDhENkQsIDB4OEQ5RiwgMHg4REEzLCAweDhFMkIsIDB4OEUxMCwKKyAgICAweDhFMUQsIDB4OEUyMiwgMHg4RTBGLCAweDhFMjksIDB4OEUxRiwgMHg4RTIxLCAweDhFMUUsIDB4OEVCQSwgMHg4RjFELAorICAgIDB4OEYxQiwgMHg4RjFGLCAweDhGMjksIDB4OEYyNiwgMHg4RjJBLCAweDhGMUMsIDB4OEYxRSwgMHg4RjI1LCAweDkwNjksCisgICAgMHg5MDZFLCAweDkwNjgsIDB4OTA2RCwgMHg5MDc3LCAweDkxMzAsIDB4OTEyRCwgMHg5MTI3LCAweDkxMzEsIDB4OTE4NywKKyAgICAweDkxODksIDB4OTE4QiwgMHg5MTgzLCAweDkyQzUsIDB4OTJCQiwgMHg5MkI3LCAweDkyRUEsIDB4OTJFNCwgMHg5MkMxLAorICAgIDB4OTJCMywgMHg5MkJDLCAweDkyRDIsIDB4OTJDNywgMHg5MkYwLCAweDkyQjIsIDB4OTVBRCwgMHg5NUIxLCAweDk3MDQsCisgICAgMHg5NzA2LCAweDk3MDcsIDB4OTcwOSwgMHg5NzYwLCAweDk3OEQsIDB4OTc4QiwgMHg5NzhGLCAweDk4MjEsIDB4OTgyQiwKKyAgICAweDk4MUMsIDB4OThCMywgMHg5OTBBLCAweDk5MTMsIDB4OTkxMiwgMHg5OTE4LCAweDk5REQsIDB4OTlEMCwgMHg5OURGLAorICAgIDB4OTlEQiwgMHg5OUQxLCAweDk5RDUsIDB4OTlEMiwgMHg5OUQ5LCAweDlBQjcsIDB4OUFFRSwgMHg5QUVGLCAweDlCMjcsCisgICAgMHg5QjQ1LCAweDlCNDQsIDB4OUI3NywgMHg5QjZGLCAweDlEMDYsIDB4OUQwOSwgMHg5RDAzLCAweDlFQTksIDB4OUVCRSwKKyAgICAweDlFQ0UsIDB4NThBOCwgMHg5RjUyLCAweDUxMTIsIDB4NTExOCwgMHg1MTE0LCAweDUxMTAsIDB4NTExNSwgMHg1MTgwLAorICAgIDB4NTFBQSwgMHg1MURELCAweDUyOTEsIDB4NTI5MywgMHg1MkYzLCAweDU2NTksIDB4NTY2QiwgMHg1Njc5LCAweDU2NjksCisgICAgMHg1NjY0LCAweDU2NzgsIDB4NTY2QSwgMHg1NjY4LCAweDU2NjUsIDB4NTY3MSwgMHg1NjZGLCAweDU2NkMsIDB4NTY2MiwKKyAgICAweDU2NzYsIDB4NThDMSwgMHg1OEJFLCAweDU4QzcsIDB4NThDNSwgMHg1OTZFLCAweDVCMUQsIDB4NUIzNCwgMHg1Qjc4LAorICAgIDB4NUJGMCwgMHg1QzBFLCAweDVGNEEsIDB4NjFCMiwgMHg2MTkxLCAweDYxQTksIDB4NjE4QSwgMHg2MUNELCAweDYxQjYsCisgICAgMHg2MUJFLCAweDYxQ0EsIDB4NjFDOCwgMHg2MjMwLCAweDY0QzUsIDB4NjRDMSwgMHg2NENCLCAweDY0QkIsIDB4NjRCQywKKyAgICAweDY0REEsIDB4NjRDNCwgMHg2NEM3LCAweDY0QzIsIDB4NjRDRCwgMHg2NEJGLCAweDY0RDIsIDB4NjRENCwgMHg2NEJFLAorICAgIDB4NjU3NCwgMHg2NkM2LCAweDY2QzksIDB4NjZCOSwgMHg2NkM0LCAweDY2QzcsIDB4NjZCOCwgMHg2QTNELCAweDZBMzgsCisgICAgMHg2QTNBLCAweDZBNTksIDB4NkE2QiwgMHg2QTU4LCAweDZBMzksIDB4NkE0NCwgMHg2QTYyLCAweDZBNjEsIDB4NkE0QiwKKyAgICAweDZBNDcsIDB4NkEzNSwgMHg2QTVGLCAweDZBNDgsIDB4NkI1OSwgMHg2Qjc3LCAweDZDMDUsIDB4NkZDMiwgMHg2RkIxLAorICAgIDB4NkZBMSwgMHg2RkMzLCAweDZGQTQsIDB4NkZDMSwgMHg2RkE3LCAweDZGQjMsIDB4NkZDMCwgMHg2RkI5LCAweDZGQjYsCisgICAgMHg2RkE2LCAweDZGQTAsIDB4NkZCNCwgMHg3MUJFLCAweDcxQzksIDB4NzFEMCwgMHg3MUQyLCAweDcxQzgsIDB4NzFENSwKKyAgICAweDcxQjksIDB4NzFDRSwgMHg3MUQ5LCAweDcxREMsIDB4NzFDMywgMHg3MUM0LCAweDczNjgsIDB4NzQ5QywgMHg3NEEzLAorICAgIDB4NzQ5OCwgMHg3NDlGLCAweDc0OUUsIDB4NzRFMiwgMHg3NTBDLCAweDc1MEQsIDB4NzYzNCwgMHg3NjM4LCAweDc2M0EsCisgICAgMHg3NkU3LCAweDc2RTUsIDB4NzdBMCwgMHg3NzlFLCAweDc3OUYsIDB4NzdBNSwgMHg3OEU4LCAweDc4REEsIDB4NzhFQywKKyAgICAweDc4RTcsIDB4NzlBNiwgMHg3QTRELCAweDdBNEUsIDB4N0E0NiwgMHg3QTRDLCAweDdBNEIsIDB4N0FCQSwgMHg3QkQ5LAorICAgIDB4N0MxMSwgMHg3QkM5LCAweDdCRTQsIDB4N0JEQiwgMHg3QkUxLCAweDdCRTksIDB4N0JFNiwgMHg3Q0Q1LCAweDdDRDYsCisgICAgMHg3RTBBLCAweDdFMTEsIDB4N0UwOCwgMHg3RTFCLCAweDdFMjMsIDB4N0UxRSwgMHg3RTFELCAweDdFMDksIDB4N0UxMCwKKyAgICAweDdGNzksIDB4N0ZCMiwgMHg3RkYwLCAweDdGRjEsIDB4N0ZFRSwgMHg4MDI4LCAweDgxQjMsIDB4ODFBOSwgMHg4MUE4LAorICAgIDB4ODFGQiwgMHg4MjA4LCAweDgyNTgsIDB4ODI1OSwgMHg4NTRBLCAweDg1NTksIDB4ODU0OCwgMHg4NTY4LCAweDg1NjksCisgICAgMHg4NTQzLCAweDg1NDksIDB4ODU2RCwgMHg4NTZBLCAweDg1NUUsIDB4ODc4MywgMHg4NzlGLCAweDg3OUUsIDB4ODdBMiwKKyAgICAweDg3OEQsIDB4ODg2MSwgMHg4OTJBLCAweDg5MzIsIDB4ODkyNSwgMHg4OTJCLCAweDg5MjEsIDB4ODlBQSwgMHg4OUE2LAorICAgIDB4OEFFNiwgMHg4QUZBLCAweDhBRUIsIDB4OEFGMSwgMHg4QjAwLCAweDhBREMsIDB4OEFFNywgMHg4QUVFLCAweDhBRkUsCisgICAgMHg4QjAxLCAweDhCMDIsIDB4OEFGNywgMHg4QUVELCAweDhBRjMsIDB4OEFGNiwgMHg4QUZDLCAweDhDNkIsIDB4OEM2RCwKKyAgICAweDhDOTMsIDB4OENGNCwgMHg4RTQ0LCAweDhFMzEsIDB4OEUzNCwgMHg4RTQyLCAweDhFMzksIDB4OEUzNSwgMHg4RjNCLAorICAgIDB4OEYyRiwgMHg4RjM4LCAweDhGMzMsIDB4OEZBOCwgMHg4RkE2LCAweDkwNzUsIDB4OTA3NCwgMHg5MDc4LCAweDkwNzIsCisgICAgMHg5MDdDLCAweDkwN0EsIDB4OTEzNCwgMHg5MTkyLCAweDkzMjAsIDB4OTMzNiwgMHg5MkY4LCAweDkzMzMsIDB4OTMyRiwKKyAgICAweDkzMjIsIDB4OTJGQywgMHg5MzJCLCAweDkzMDQsIDB4OTMxQSwgMHg5MzEwLCAweDkzMjYsIDB4OTMyMSwgMHg5MzE1LAorICAgIDB4OTMyRSwgMHg5MzE5LCAweDk1QkIsIDB4OTZBNywgMHg5NkE4LCAweDk2QUEsIDB4OTZENSwgMHg5NzBFLCAweDk3MTEsCisgICAgMHg5NzE2LCAweDk3MEQsIDB4OTcxMywgMHg5NzBGLCAweDk3NUIsIDB4OTc1QywgMHg5NzY2LCAweDk3OTgsIDB4OTgzMCwKKyAgICAweDk4MzgsIDB4OTgzQiwgMHg5ODM3LCAweDk4MkQsIDB4OTgzOSwgMHg5ODI0LCAweDk5MTAsIDB4OTkyOCwgMHg5OTFFLAorICAgIDB4OTkxQiwgMHg5OTIxLCAweDk5MUEsIDB4OTlFRCwgMHg5OUUyLCAweDk5RjEsIDB4OUFCOCwgMHg5QUJDLCAweDlBRkIsCisgICAgMHg5QUVELCAweDlCMjgsIDB4OUI5MSwgMHg5RDE1LCAweDlEMjMsIDB4OUQyNiwgMHg5RDI4LCAweDlEMTIsIDB4OUQxQiwKKyAgICAweDlFRDgsIDB4OUVENCwgMHg5RjhELCAweDlGOUMsIDB4NTEyQSwgMHg1MTFGLCAweDUxMjEsIDB4NTEzMiwgMHg1MkY1LAorICAgIDB4NTY4RSwgMHg1NjgwLCAweDU2OTAsIDB4NTY4NSwgMHg1Njg3LCAweDU2OEYsIDB4NThENSwgMHg1OEQzLCAweDU4RDEsCisgICAgMHg1OENFLCAweDVCMzAsIDB4NUIyQSwgMHg1QjI0LCAweDVCN0EsIDB4NUMzNywgMHg1QzY4LCAweDVEQkMsIDB4NURCQSwKKyAgICAweDVEQkQsIDB4NURCOCwgMHg1RTZCLCAweDVGNEMsIDB4NUZCRCwgMHg2MUM5LCAweDYxQzIsIDB4NjFDNywgMHg2MUU2LAorICAgIDB4NjFDQiwgMHg2MjMyLCAweDYyMzQsIDB4NjRDRSwgMHg2NENBLCAweDY0RDgsIDB4NjRFMCwgMHg2NEYwLCAweDY0RTYsCisgICAgMHg2NEVDLCAweDY0RjEsIDB4NjRFMiwgMHg2NEVELCAweDY1ODIsIDB4NjU4MywgMHg2NkQ5LCAweDY2RDYsIDB4NkE4MCwKKyAgICAweDZBOTQsIDB4NkE4NCwgMHg2QUEyLCAweDZBOUMsIDB4NkFEQiwgMHg2QUEzLCAweDZBN0UsIDB4NkE5NywgMHg2QTkwLAorICAgIDB4NkFBMCwgMHg2QjVDLCAweDZCQUUsIDB4NkJEQSwgMHg2QzA4LCAweDZGRDgsIDB4NkZGMSwgMHg2RkRGLCAweDZGRTAsCisgICAgMHg2RkRCLCAweDZGRTQsIDB4NkZFQiwgMHg2RkVGLCAweDZGODAsIDB4NkZFQywgMHg2RkUxLCAweDZGRTksIDB4NkZENSwKKyAgICAweDZGRUUsIDB4NkZGMCwgMHg3MUU3LCAweDcxREYsIDB4NzFFRSwgMHg3MUU2LCAweDcxRTUsIDB4NzFFRCwgMHg3MUVDLAorICAgIDB4NzFGNCwgMHg3MUUwLCAweDcyMzUsIDB4NzI0NiwgMHg3MzcwLCAweDczNzIsIDB4NzRBOSwgMHg3NEIwLCAweDc0QTYsCisgICAgMHg3NEE4LCAweDc2NDYsIDB4NzY0MiwgMHg3NjRDLCAweDc2RUEsIDB4NzdCMywgMHg3N0FBLCAweDc3QjAsIDB4NzdBQywKKyAgICAweDc3QTcsIDB4NzdBRCwgMHg3N0VGLCAweDc4RjcsIDB4NzhGQSwgMHg3OEY0LCAweDc4RUYsIDB4NzkwMSwgMHg3OUE3LAorICAgIDB4NzlBQSwgMHg3QTU3LCAweDdBQkYsIDB4N0MwNywgMHg3QzBELCAweDdCRkUsIDB4N0JGNywgMHg3QzBDLCAweDdCRTAsCisgICAgMHg3Q0UwLCAweDdDREMsIDB4N0NERSwgMHg3Q0UyLCAweDdDREYsIDB4N0NEOSwgMHg3Q0RELCAweDdFMkUsIDB4N0UzRSwKKyAgICAweDdFNDYsIDB4N0UzNywgMHg3RTMyLCAweDdFNDMsIDB4N0UyQiwgMHg3RTNELCAweDdFMzEsIDB4N0U0NSwgMHg3RTQxLAorICAgIDB4N0UzNCwgMHg3RTM5LCAweDdFNDgsIDB4N0UzNSwgMHg3RTNGLCAweDdFMkYsIDB4N0Y0NCwgMHg3RkYzLCAweDdGRkMsCisgICAgMHg4MDcxLCAweDgwNzIsIDB4ODA3MCwgMHg4MDZGLCAweDgwNzMsIDB4ODFDNiwgMHg4MUMzLCAweDgxQkEsIDB4ODFDMiwKKyAgICAweDgxQzAsIDB4ODFCRiwgMHg4MUJELCAweDgxQzksIDB4ODFCRSwgMHg4MUU4LCAweDgyMDksIDB4ODI3MSwgMHg4NUFBLAorICAgIDB4ODU4NCwgMHg4NTdFLCAweDg1OUMsIDB4ODU5MSwgMHg4NTk0LCAweDg1QUYsIDB4ODU5QiwgMHg4NTg3LCAweDg1QTgsCisgICAgMHg4NThBLCAweDg1QTYsIDB4ODY2NywgMHg4N0MwLCAweDg3RDEsIDB4ODdCMywgMHg4N0QyLCAweDg3QzYsIDB4ODdBQiwKKyAgICAweDg3QkIsIDB4ODdCQSwgMHg4N0M4LCAweDg3Q0IsIDB4ODkzQiwgMHg4OTM2LCAweDg5NDQsIDB4ODkzOCwgMHg4OTNELAorICAgIDB4ODlBQywgMHg4QjBFLCAweDhCMTcsIDB4OEIxOSwgMHg4QjFCLCAweDhCMEEsIDB4OEIyMCwgMHg4QjFELCAweDhCMDQsCisgICAgMHg4QjEwLCAweDhDNDEsIDB4OEMzRiwgMHg4QzczLCAweDhDRkEsIDB4OENGRCwgMHg4Q0ZDLCAweDhDRjgsIDB4OENGQiwKKyAgICAweDhEQTgsIDB4OEU0OSwgMHg4RTRCLCAweDhFNDgsIDB4OEU0QSwgMHg4RjQ0LCAweDhGM0UsIDB4OEY0MiwgMHg4RjQ1LAorICAgIDB4OEYzRiwgMHg5MDdGLCAweDkwN0QsIDB4OTA4NCwgMHg5MDgxLCAweDkwODIsIDB4OTA4MCwgMHg5MTM5LCAweDkxQTMsCisgICAgMHg5MTlFLCAweDkxOUMsIDB4OTM0RCwgMHg5MzgyLCAweDkzMjgsIDB4OTM3NSwgMHg5MzRBLCAweDkzNjUsIDB4OTM0QiwKKyAgICAweDkzMTgsIDB4OTM3RSwgMHg5MzZDLCAweDkzNUIsIDB4OTM3MCwgMHg5MzVBLCAweDkzNTQsIDB4OTVDQSwgMHg5NUNCLAorICAgIDB4OTVDQywgMHg5NUM4LCAweDk1QzYsIDB4OTZCMSwgMHg5NkI4LCAweDk2RDYsIDB4OTcxQywgMHg5NzFFLCAweDk3QTAsCisgICAgMHg5N0QzLCAweDk4NDYsIDB4OThCNiwgMHg5OTM1LCAweDlBMDEsIDB4OTlGRiwgMHg5QkFFLCAweDlCQUIsIDB4OUJBQSwKKyAgICAweDlCQUQsIDB4OUQzQiwgMHg5RDNGLCAweDlFOEIsIDB4OUVDRiwgMHg5RURFLCAweDlFREMsIDB4OUVERCwgMHg5RURCLAorICAgIDB4OUYzRSwgMHg5RjRCLCAweDUzRTIsIDB4NTY5NSwgMHg1NkFFLCAweDU4RDksIDB4NThEOCwgMHg1QjM4LCAweDVGNUQsCisgICAgMHg2MUUzLCAweDYyMzMsIDB4NjRGNCwgMHg2NEYyLCAweDY0RkUsIDB4NjUwNiwgMHg2NEZBLCAweDY0RkIsIDB4NjRGNywKKyAgICAweDY1QjcsIDB4NjZEQywgMHg2NzI2LCAweDZBQjMsIDB4NkFBQywgMHg2QUMzLCAweDZBQkIsIDB4NkFCOCwgMHg2QUMyLAorICAgIDB4NkFBRSwgMHg2QUFGLCAweDZCNUYsIDB4NkI3OCwgMHg2QkFGLCAweDcwMDksIDB4NzAwQiwgMHg2RkZFLCAweDcwMDYsCisgICAgMHg2RkZBLCAweDcwMTEsIDB4NzAwRiwgMHg3MUZCLCAweDcxRkMsIDB4NzFGRSwgMHg3MUY4LCAweDczNzcsIDB4NzM3NSwKKyAgICAweDc0QTcsIDB4NzRCRiwgMHg3NTE1LCAweDc2NTYsIDB4NzY1OCwgMHg3NjUyLCAweDc3QkQsIDB4NzdCRiwgMHg3N0JCLAorICAgIDB4NzdCQywgMHg3OTBFLCAweDc5QUUsIDB4N0E2MSwgMHg3QTYyLCAweDdBNjAsIDB4N0FDNCwgMHg3QUM1LCAweDdDMkIsCisgICAgMHg3QzI3LCAweDdDMkEsIDB4N0MxRSwgMHg3QzIzLCAweDdDMjEsIDB4N0NFNywgMHg3RTU0LCAweDdFNTUsIDB4N0U1RSwKKyAgICAweDdFNUEsIDB4N0U2MSwgMHg3RTUyLCAweDdFNTksIDB4N0Y0OCwgMHg3RkY5LCAweDdGRkIsIDB4ODA3NywgMHg4MDc2LAorICAgIDB4ODFDRCwgMHg4MUNGLCAweDgyMEEsIDB4ODVDRiwgMHg4NUE5LCAweDg1Q0QsIDB4ODVEMCwgMHg4NUM5LCAweDg1QjAsCisgICAgMHg4NUJBLCAweDg1QjksIDB4ODdFRiwgMHg4N0VDLCAweDg3RjIsIDB4ODdFMCwgMHg4OTg2LCAweDg5QjIsIDB4ODlGNCwKKyAgICAweDhCMjgsIDB4OEIzOSwgMHg4QjJDLCAweDhCMkIsIDB4OEM1MCwgMHg4RDA1LCAweDhFNTksIDB4OEU2MywgMHg4RTY2LAorICAgIDB4OEU2NCwgMHg4RTVGLCAweDhFNTUsIDB4OEVDMCwgMHg4RjQ5LCAweDhGNEQsIDB4OTA4NywgMHg5MDgzLCAweDkwODgsCisgICAgMHg5MUFCLCAweDkxQUMsIDB4OTFEMCwgMHg5Mzk0LCAweDkzOEEsIDB4OTM5NiwgMHg5M0EyLCAweDkzQjMsIDB4OTNBRSwKKyAgICAweDkzQUMsIDB4OTNCMCwgMHg5Mzk4LCAweDkzOUEsIDB4OTM5NywgMHg5NUQ0LCAweDk1RDYsIDB4OTVEMCwgMHg5NUQ1LAorICAgIDB4OTZFMiwgMHg5NkRDLCAweDk2RDksIDB4OTZEQiwgMHg5NkRFLCAweDk3MjQsIDB4OTdBMywgMHg5N0E2LCAweDk3QUQsCisgICAgMHg5N0Y5LCAweDk4NEQsIDB4OTg0RiwgMHg5ODRDLCAweDk4NEUsIDB4OTg1MywgMHg5OEJBLCAweDk5M0UsIDB4OTkzRiwKKyAgICAweDk5M0QsIDB4OTkyRSwgMHg5OUE1LCAweDlBMEUsIDB4OUFDMSwgMHg5QjAzLCAweDlCMDYsIDB4OUI0RiwgMHg5QjRFLAorICAgIDB4OUI0RCwgMHg5QkNBLCAweDlCQzksIDB4OUJGRCwgMHg5QkM4LCAweDlCQzAsIDB4OUQ1MSwgMHg5RDVELCAweDlENjAsCisgICAgMHg5RUUwLCAweDlGMTUsIDB4OUYyQywgMHg1MTMzLCAweDU2QTUsIDB4NTZBOCwgMHg1OERFLCAweDU4REYsIDB4NThFMiwKKyAgICAweDVCRjUsIDB4OUY5MCwgMHg1RUVDLCAweDYxRjIsIDB4NjFGNywgMHg2MUY2LCAweDYxRjUsIDB4NjUwMCwgMHg2NTBGLAorICAgIDB4NjZFMCwgMHg2NkRELCAweDZBRTUsIDB4NkFERCwgMHg2QURBLCAweDZBRDMsIDB4NzAxQiwgMHg3MDFGLCAweDcwMjgsCisgICAgMHg3MDFBLCAweDcwMUQsIDB4NzAxNSwgMHg3MDE4LCAweDcyMDYsIDB4NzIwRCwgMHg3MjU4LCAweDcyQTIsIDB4NzM3OCwKKyAgICAweDczN0EsIDB4NzRCRCwgMHg3NENBLCAweDc0RTMsIDB4NzU4NywgMHg3NTg2LCAweDc2NUYsIDB4NzY2MSwgMHg3N0M3LAorICAgIDB4NzkxOSwgMHg3OUIxLCAweDdBNkIsIDB4N0E2OSwgMHg3QzNFLCAweDdDM0YsIDB4N0MzOCwgMHg3QzNELCAweDdDMzcsCisgICAgMHg3QzQwLCAweDdFNkIsIDB4N0U2RCwgMHg3RTc5LCAweDdFNjksIDB4N0U2QSwgMHg3RTczLCAweDdGODUsIDB4N0ZCNiwKKyAgICAweDdGQjksIDB4N0ZCOCwgMHg4MUQ4LCAweDg1RTksIDB4ODVERCwgMHg4NUVBLCAweDg1RDUsIDB4ODVFNCwgMHg4NUU1LAorICAgIDB4ODVGNywgMHg4N0ZCLCAweDg4MDUsIDB4ODgwRCwgMHg4N0Y5LCAweDg3RkUsIDB4ODk2MCwgMHg4OTVGLCAweDg5NTYsCisgICAgMHg4OTVFLCAweDhCNDEsIDB4OEI1QywgMHg4QjU4LCAweDhCNDksIDB4OEI1QSwgMHg4QjRFLCAweDhCNEYsIDB4OEI0NiwKKyAgICAweDhCNTksIDB4OEQwOCwgMHg4RDBBLCAweDhFN0MsIDB4OEU3MiwgMHg4RTg3LCAweDhFNzYsIDB4OEU2QywgMHg4RTdBLAorICAgIDB4OEU3NCwgMHg4RjU0LCAweDhGNEUsIDB4OEZBRCwgMHg5MDhBLCAweDkwOEIsIDB4OTFCMSwgMHg5MUFFLCAweDkzRTEsCisgICAgMHg5M0QxLCAweDkzREYsIDB4OTNDMywgMHg5M0M4LCAweDkzREMsIDB4OTNERCwgMHg5M0Q2LCAweDkzRTIsIDB4OTNDRCwKKyAgICAweDkzRDgsIDB4OTNFNCwgMHg5M0Q3LCAweDkzRTgsIDB4OTVEQywgMHg5NkI0LCAweDk2RTMsIDB4OTcyQSwgMHg5NzI3LAorICAgIDB4OTc2MSwgMHg5N0RDLCAweDk3RkIsIDB4OTg1RSwgMHg5ODU4LCAweDk4NUIsIDB4OThCQywgMHg5OTQ1LCAweDk5NDksCisgICAgMHg5QTE2LCAweDlBMTksIDB4OUIwRCwgMHg5QkU4LCAweDlCRTcsIDB4OUJENiwgMHg5QkRCLCAweDlEODksIDB4OUQ2MSwKKyAgICAweDlENzIsIDB4OUQ2QSwgMHg5RDZDLCAweDlFOTIsIDB4OUU5NywgMHg5RTkzLCAweDlFQjQsIDB4NTJGOCwgMHg1NkI3LAorICAgIDB4NTZCNiwgMHg1NkI0LCAweDU2QkMsIDB4NThFNCwgMHg1QjQwLCAweDVCNDMsIDB4NUI3RCwgMHg1QkY2LCAweDVEQzksCisgICAgMHg2MUY4LCAweDYxRkEsIDB4NjUxOCwgMHg2NTE0LCAweDY1MTksIDB4NjZFNiwgMHg2NzI3LCAweDZBRUMsIDB4NzAzRSwKKyAgICAweDcwMzAsIDB4NzAzMiwgMHg3MjEwLCAweDczN0IsIDB4NzRDRiwgMHg3NjYyLCAweDc2NjUsIDB4NzkyNiwgMHg3OTJBLAorICAgIDB4NzkyQywgMHg3OTJCLCAweDdBQzcsIDB4N0FGNiwgMHg3QzRDLCAweDdDNDMsIDB4N0M0RCwgMHg3Q0VGLCAweDdDRjAsCisgICAgMHg4RkFFLCAweDdFN0QsIDB4N0U3QywgMHg3RTgyLCAweDdGNEMsIDB4ODAwMCwgMHg4MURBLCAweDgyNjYsIDB4ODVGQiwKKyAgICAweDg1RjksIDB4ODYxMSwgMHg4NUZBLCAweDg2MDYsIDB4ODYwQiwgMHg4NjA3LCAweDg2MEEsIDB4ODgxNCwgMHg4ODE1LAorICAgIDB4ODk2NCwgMHg4OUJBLCAweDg5RjgsIDB4OEI3MCwgMHg4QjZDLCAweDhCNjYsIDB4OEI2RiwgMHg4QjVGLCAweDhCNkIsCisgICAgMHg4RDBGLCAweDhEMEQsIDB4OEU4OSwgMHg4RTgxLCAweDhFODUsIDB4OEU4MiwgMHg5MUI0LCAweDkxQ0IsIDB4OTQxOCwKKyAgICAweDk0MDMsIDB4OTNGRCwgMHg5NUUxLCAweDk3MzAsIDB4OThDNCwgMHg5OTUyLCAweDk5NTEsIDB4OTlBOCwgMHg5QTJCLAorICAgIDB4OUEzMCwgMHg5QTM3LCAweDlBMzUsIDB4OUMxMywgMHg5QzBELCAweDlFNzksIDB4OUVCNSwgMHg5RUU4LCAweDlGMkYsCisgICAgMHg5RjVGLCAweDlGNjMsIDB4OUY2MSwgMHg1MTM3LCAweDUxMzgsIDB4NTZDMSwgMHg1NkMwLCAweDU2QzIsIDB4NTkxNCwKKyAgICAweDVDNkMsIDB4NURDRCwgMHg2MUZDLCAweDYxRkUsIDB4NjUxRCwgMHg2NTFDLCAweDY1OTUsIDB4NjZFOSwgMHg2QUZCLAorICAgIDB4NkIwNCwgMHg2QUZBLCAweDZCQjIsIDB4NzA0QywgMHg3MjFCLCAweDcyQTcsIDB4NzRENiwgMHg3NEQ0LCAweDc2NjksCisgICAgMHg3N0QzLCAweDdDNTAsIDB4N0U4RiwgMHg3RThDLCAweDdGQkMsIDB4ODYxNywgMHg4NjJELCAweDg2MUEsIDB4ODgyMywKKyAgICAweDg4MjIsIDB4ODgyMSwgMHg4ODFGLCAweDg5NkEsIDB4ODk2QywgMHg4OUJELCAweDhCNzQsIDB4OEI3NywgMHg4QjdELAorICAgIDB4OEQxMywgMHg4RThBLCAweDhFOEQsIDB4OEU4QiwgMHg4RjVGLCAweDhGQUYsIDB4OTFCQSwgMHg5NDJFLCAweDk0MzMsCisgICAgMHg5NDM1LCAweDk0M0EsIDB4OTQzOCwgMHg5NDMyLCAweDk0MkIsIDB4OTVFMiwgMHg5NzM4LCAweDk3MzksIDB4OTczMiwKKyAgICAweDk3RkYsIDB4OTg2NywgMHg5ODY1LCAweDk5NTcsIDB4OUE0NSwgMHg5QTQzLCAweDlBNDAsIDB4OUEzRSwgMHg5QUNGLAorICAgIDB4OUI1NCwgMHg5QjUxLCAweDlDMkQsIDB4OUMyNSwgMHg5REFGLCAweDlEQjQsIDB4OURDMiwgMHg5REI4LCAweDlFOUQsCisgICAgMHg5RUVGLCAweDlGMTksIDB4OUY1QywgMHg5RjY2LCAweDlGNjcsIDB4NTEzQywgMHg1MTNCLCAweDU2QzgsIDB4NTZDQSwKKyAgICAweDU2QzksIDB4NUI3RiwgMHg1REQ0LCAweDVERDIsIDB4NUY0RSwgMHg2MUZGLCAweDY1MjQsIDB4NkIwQSwgMHg2QjYxLAorICAgIDB4NzA1MSwgMHg3MDU4LCAweDczODAsIDB4NzRFNCwgMHg3NThBLCAweDc2NkUsIDB4NzY2QywgMHg3OUIzLCAweDdDNjAsCisgICAgMHg3QzVGLCAweDgwN0UsIDB4ODA3RCwgMHg4MURGLCAweDg5NzIsIDB4ODk2RiwgMHg4OUZDLCAweDhCODAsIDB4OEQxNiwKKyAgICAweDhEMTcsIDB4OEU5MSwgMHg4RTkzLCAweDhGNjEsIDB4OTE0OCwgMHg5NDQ0LCAweDk0NTEsIDB4OTQ1MiwgMHg5NzNELAorICAgIDB4OTczRSwgMHg5N0MzLCAweDk3QzEsIDB4OTg2QiwgMHg5OTU1LCAweDlBNTUsIDB4OUE0RCwgMHg5QUQyLCAweDlCMUEsCisgICAgMHg5QzQ5LCAweDlDMzEsIDB4OUMzRSwgMHg5QzNCLCAweDlERDMsIDB4OURENywgMHg5RjM0LCAweDlGNkMsIDB4OUY2QSwKKyAgICAweDlGOTQsIDB4NTZDQywgMHg1REQ2LCAweDYyMDAsIDB4NjUyMywgMHg2NTJCLCAweDY1MkEsIDB4NjZFQywgMHg2QjEwLAorICAgIDB4NzREQSwgMHg3QUNBLCAweDdDNjQsIDB4N0M2MywgMHg3QzY1LCAweDdFOTMsIDB4N0U5NiwgMHg3RTk0LCAweDgxRTIsCisgICAgMHg4NjM4LCAweDg2M0YsIDB4ODgzMSwgMHg4QjhBLCAweDkwOTAsIDB4OTA4RiwgMHg5NDYzLCAweDk0NjAsIDB4OTQ2NCwKKyAgICAweDk3NjgsIDB4OTg2RiwgMHg5OTVDLCAweDlBNUEsIDB4OUE1QiwgMHg5QTU3LCAweDlBRDMsIDB4OUFENCwgMHg5QUQxLAorICAgIDB4OUM1NCwgMHg5QzU3LCAweDlDNTYsIDB4OURFNSwgMHg5RTlGLCAweDlFRjQsIDB4NTZEMSwgMHg1OEU5LCAweDY1MkMsCisgICAgMHg3MDVFLCAweDc2NzEsIDB4NzY3MiwgMHg3N0Q3LCAweDdGNTAsIDB4N0Y4OCwgMHg4ODM2LCAweDg4MzksIDB4ODg2MiwKKyAgICAweDhCOTMsIDB4OEI5MiwgMHg4Qjk2LCAweDgyNzcsIDB4OEQxQiwgMHg5MUMwLCAweDk0NkEsIDB4OTc0MiwgMHg5NzQ4LAorICAgIDB4OTc0NCwgMHg5N0M2LCAweDk4NzAsIDB4OUE1RiwgMHg5QjIyLCAweDlCNTgsIDB4OUM1RiwgMHg5REY5LCAweDlERkEsCisgICAgMHg5RTdDLCAweDlFN0QsIDB4OUYwNywgMHg5Rjc3LCAweDlGNzIsIDB4NUVGMywgMHg2QjE2LCAweDcwNjMsIDB4N0M2QywKKyAgICAweDdDNkUsIDB4ODgzQiwgMHg4OUMwLCAweDhFQTEsIDB4OTFDMSwgMHg5NDcyLCAweDk0NzAsIDB4OTg3MSwgMHg5OTVFLAorICAgIDB4OUFENiwgMHg5QjIzLCAweDlFQ0MsIDB4NzA2NCwgMHg3N0RBLCAweDhCOUEsIDB4OTQ3NywgMHg5N0M5LCAweDlBNjIsCisgICAgMHg5QTY1LCAweDdFOUMsIDB4OEI5QywgMHg4RUFBLCAweDkxQzUsIDB4OTQ3RCwgMHg5NDdFLCAweDk0N0MsIDB4OUM3NywKKyAgICAweDlDNzgsIDB4OUVGNywgMHg4QzU0LCAweDk0N0YsIDB4OUUxQSwgMHg3MjI4LCAweDlBNkEsIDB4OUIzMSwgMHg5RTFCLAorICAgIDB4OUUxRSwgMHg3QzcyLCAweDRFNDIsIDB4NEU1QywgMHg1MUY1LCAweDUzMUEsIDB4NTM4MiwgMHg0RTA3LCAweDRFMEMsCisgICAgMHg0RTQ3LCAweDRFOEQsIDB4NTZENywgMHg1QzZFLCAweDVGNzMsIDB4NEUwRiwgMHg1MTg3LCAweDRFMEUsIDB4NEUyRSwKKyAgICAweDRFOTMsIDB4NEVDMiwgMHg0RUM5LCAweDRFQzgsIDB4NTE5OCwgMHg1MkZDLCAweDUzNkMsIDB4NTNCOSwgMHg1NzIwLAorICAgIDB4NTkwMywgMHg1OTJDLCAweDVDMTAsIDB4NURGRiwgMHg2NUUxLCAweDZCQjMsIDB4NkJDQywgMHg2QzE0LCAweDcyM0YsCisgICAgMHg0RTMxLCAweDRFM0MsIDB4NEVFOCwgMHg0RURDLCAweDRFRTksIDB4NEVFMSwgMHg0RURELCAweDRFREEsIDB4NTIwQywKKyAgICAweDUyMDksIDB4NTMxQywgMHg1MzRDLCAweDU3MjIsIDB4NTcyMywgMHg1OTE3LCAweDU5MkYsIDB4NUI4MSwgMHg1Qjg0LAorICAgIDB4NUMxMiwgMHg1QzNCLCAweDVDNzQsIDB4NUM3MywgMHg1RTA0LCAweDVFODAsIDB4NUU4MiwgMHg1RkM5LCAweDYyMDksCisgICAgMHg2MjUwLCAweDZDMTUsIDB4NkMzNiwgMHg2QzQzLCAweDZDM0YsIDB4NkMzQiwgMHg3MkFFLCAweDcyQjAsIDB4NzM4QSwKKyAgICAweDc5QjgsIDB4ODA4QSwgMHg5NjFFLCAweDRGMEUsIDB4NEYxOCwgMHg0RjJDLCAweDRFRjUsIDB4NEYxNCwgMHg0RUYxLAorICAgIDB4NEYwMCwgMHg0RUY3LCAweDRGMDgsIDB4NEYxRCwgMHg0RjAyLCAweDRGMDUsIDB4NEYyMiwgMHg0RjEzLCAweDRGMDQsCisgICAgMHg0RUY0LCAweDRGMTIsIDB4NTFCMSwgMHg1MjEzLCAweDUyMTAsIDB4NTJBNiwgMHg1MzIyLCAweDUzMUYsIDB4NTM0RCwKKyAgICAweDUzOEEsIDB4NTQwNywgMHg1NkUxLCAweDU2REYsIDB4NTcyRSwgMHg1NzJBLCAweDU3MzQsIDB4NTkzQywgMHg1OTgwLAorICAgIDB4NTk3QywgMHg1OTg1LCAweDU5N0IsIDB4NTk3RSwgMHg1OTc3LCAweDU5N0YsIDB4NUI1NiwgMHg1QzE1LCAweDVDMjUsCisgICAgMHg1QzdDLCAweDVDN0EsIDB4NUM3QiwgMHg1QzdFLCAweDVEREYsIDB4NUU3NSwgMHg1RTg0LCAweDVGMDIsIDB4NUYxQSwKKyAgICAweDVGNzQsIDB4NUZENSwgMHg1RkQ0LCAweDVGQ0YsIDB4NjI1QywgMHg2MjVFLCAweDYyNjQsIDB4NjI2MSwgMHg2MjY2LAorICAgIDB4NjI2MiwgMHg2MjU5LCAweDYyNjAsIDB4NjI1QSwgMHg2MjY1LCAweDY1MzcsIDB4NjVFRiwgMHg2NUVFLCAweDY3M0UsCisgICAgMHg2NzM5LCAweDY3MzgsIDB4NjczQiwgMHg2NzNBLCAweDY3M0YsIDB4NjczQywgMHg2NzMzLCAweDZDMTgsIDB4NkM0NiwKKyAgICAweDZDNTIsIDB4NkM1QywgMHg2QzRGLCAweDZDNEEsIDB4NkM1NCwgMHg2QzRCLCAweDZDNEMsIDB4NzA3MSwgMHg3MjVFLAorICAgIDB4NzJCNCwgMHg3MkI1LCAweDczOEUsIDB4NzUyQSwgMHg3NjdGLCAweDdBNzUsIDB4N0Y1MSwgMHg4Mjc4LCAweDgyN0MsCisgICAgMHg4MjgwLCAweDgyN0QsIDB4ODI3RiwgMHg4NjRELCAweDg5N0UsIDB4OTA5OSwgMHg5MDk3LCAweDkwOTgsIDB4OTA5QiwKKyAgICAweDkwOTQsIDB4OTYyMiwgMHg5NjI0LCAweDk2MjAsIDB4OTYyMywgMHg0RjU2LCAweDRGM0IsIDB4NEY2MiwgMHg0RjQ5LAorICAgIDB4NEY1MywgMHg0RjY0LCAweDRGM0UsIDB4NEY2NywgMHg0RjUyLCAweDRGNUYsIDB4NEY0MSwgMHg0RjU4LCAweDRGMkQsCisgICAgMHg0RjMzLCAweDRGM0YsIDB4NEY2MSwgMHg1MThGLCAweDUxQjksIDB4NTIxQywgMHg1MjFFLCAweDUyMjEsIDB4NTJBRCwKKyAgICAweDUyQUUsIDB4NTMwOSwgMHg1MzYzLCAweDUzNzIsIDB4NTM4RSwgMHg1MzhGLCAweDU0MzAsIDB4NTQzNywgMHg1NDJBLAorICAgIDB4NTQ1NCwgMHg1NDQ1LCAweDU0MTksIDB4NTQxQywgMHg1NDI1LCAweDU0MTgsIDB4NTQzRCwgMHg1NDRGLCAweDU0NDEsCisgICAgMHg1NDI4LCAweDU0MjQsIDB4NTQ0NywgMHg1NkVFLCAweDU2RTcsIDB4NTZFNSwgMHg1NzQxLCAweDU3NDUsIDB4NTc0QywKKyAgICAweDU3NDksIDB4NTc0QiwgMHg1NzUyLCAweDU5MDYsIDB4NTk0MCwgMHg1OUE2LCAweDU5OTgsIDB4NTlBMCwgMHg1OTk3LAorICAgIDB4NTk4RSwgMHg1OUEyLCAweDU5OTAsIDB4NTk4RiwgMHg1OUE3LCAweDU5QTEsIDB4NUI4RSwgMHg1QjkyLCAweDVDMjgsCisgICAgMHg1QzJBLCAweDVDOEQsIDB4NUM4RiwgMHg1Qzg4LCAweDVDOEIsIDB4NUM4OSwgMHg1QzkyLCAweDVDOEEsIDB4NUM4NiwKKyAgICAweDVDOTMsIDB4NUM5NSwgMHg1REUwLCAweDVFMEEsIDB4NUUwRSwgMHg1RThCLCAweDVFODksIDB4NUU4QywgMHg1RTg4LAorICAgIDB4NUU4RCwgMHg1RjA1LCAweDVGMUQsIDB4NUY3OCwgMHg1Rjc2LCAweDVGRDIsIDB4NUZEMSwgMHg1RkQwLCAweDVGRUQsCisgICAgMHg1RkU4LCAweDVGRUUsIDB4NUZGMywgMHg1RkUxLCAweDVGRTQsIDB4NUZFMywgMHg1RkZBLCAweDVGRUYsIDB4NUZGNywKKyAgICAweDVGRkIsIDB4NjAwMCwgMHg1RkY0LCAweDYyM0EsIDB4NjI4MywgMHg2MjhDLCAweDYyOEUsIDB4NjI4RiwgMHg2Mjk0LAorICAgIDB4NjI4NywgMHg2MjcxLCAweDYyN0IsIDB4NjI3QSwgMHg2MjcwLCAweDYyODEsIDB4NjI4OCwgMHg2Mjc3LCAweDYyN0QsCisgICAgMHg2MjcyLCAweDYyNzQsIDB4NjVGMCwgMHg2NUY0LCAweDY1RjMsIDB4NjVGMiwgMHg2NUY1LCAweDY3NDUsIDB4Njc0NywKKyAgICAweDY3NTksIDB4Njc1NSwgMHg2NzRDLCAweDY3NDgsIDB4Njc1RCwgMHg2NzRELCAweDY3NUEsIDB4Njc0QiwgMHg2QkQwLAorICAgIDB4NkMxOSwgMHg2QzFBLCAweDZDNzgsIDB4NkM2NywgMHg2QzZCLCAweDZDODQsIDB4NkM4QiwgMHg2QzhGLCAweDZDNzEsCisgICAgMHg2QzZGLCAweDZDNjksIDB4NkM5QSwgMHg2QzZELCAweDZDODcsIDB4NkM5NSwgMHg2QzlDLCAweDZDNjYsIDB4NkM3MywKKyAgICAweDZDNjUsIDB4NkM3QiwgMHg2QzhFLCAweDcwNzQsIDB4NzA3QSwgMHg3MjYzLCAweDcyQkYsIDB4NzJCRCwgMHg3MkMzLAorICAgIDB4NzJDNiwgMHg3MkMxLCAweDcyQkEsIDB4NzJDNSwgMHg3Mzk1LCAweDczOTcsIDB4NzM5MywgMHg3Mzk0LCAweDczOTIsCisgICAgMHg3NTNBLCAweDc1MzksIDB4NzU5NCwgMHg3NTk1LCAweDc2ODEsIDB4NzkzRCwgMHg4MDM0LCAweDgwOTUsIDB4ODA5OSwKKyAgICAweDgwOTAsIDB4ODA5MiwgMHg4MDlDLCAweDgyOTAsIDB4ODI4RiwgMHg4Mjg1LCAweDgyOEUsIDB4ODI5MSwgMHg4MjkzLAorICAgIDB4ODI4QSwgMHg4MjgzLCAweDgyODQsIDB4OEM3OCwgMHg4RkM5LCAweDhGQkYsIDB4OTA5RiwgMHg5MEExLCAweDkwQTUsCisgICAgMHg5MDlFLCAweDkwQTcsIDB4OTBBMCwgMHg5NjMwLCAweDk2MjgsIDB4OTYyRiwgMHg5NjJELCAweDRFMzMsIDB4NEY5OCwKKyAgICAweDRGN0MsIDB4NEY4NSwgMHg0RjdELCAweDRGODAsIDB4NEY4NywgMHg0Rjc2LCAweDRGNzQsIDB4NEY4OSwgMHg0Rjg0LAorICAgIDB4NEY3NywgMHg0RjRDLCAweDRGOTcsIDB4NEY2QSwgMHg0RjlBLCAweDRGNzksIDB4NEY4MSwgMHg0Rjc4LCAweDRGOTAsCisgICAgMHg0RjlDLCAweDRGOTQsIDB4NEY5RSwgMHg0RjkyLCAweDRGODIsIDB4NEY5NSwgMHg0RjZCLCAweDRGNkUsIDB4NTE5RSwKKyAgICAweDUxQkMsIDB4NTFCRSwgMHg1MjM1LCAweDUyMzIsIDB4NTIzMywgMHg1MjQ2LCAweDUyMzEsIDB4NTJCQywgMHg1MzBBLAorICAgIDB4NTMwQiwgMHg1MzNDLCAweDUzOTIsIDB4NTM5NCwgMHg1NDg3LCAweDU0N0YsIDB4NTQ4MSwgMHg1NDkxLCAweDU0ODIsCisgICAgMHg1NDg4LCAweDU0NkIsIDB4NTQ3QSwgMHg1NDdFLCAweDU0NjUsIDB4NTQ2QywgMHg1NDc0LCAweDU0NjYsIDB4NTQ4RCwKKyAgICAweDU0NkYsIDB4NTQ2MSwgMHg1NDYwLCAweDU0OTgsIDB4NTQ2MywgMHg1NDY3LCAweDU0NjQsIDB4NTZGNywgMHg1NkY5LAorICAgIDB4NTc2RiwgMHg1NzcyLCAweDU3NkQsIDB4NTc2QiwgMHg1NzcxLCAweDU3NzAsIDB4NTc3NiwgMHg1NzgwLCAweDU3NzUsCisgICAgMHg1NzdCLCAweDU3NzMsIDB4NTc3NCwgMHg1NzYyLCAweDU3NjgsIDB4NTc3RCwgMHg1OTBDLCAweDU5NDUsIDB4NTlCNSwKKyAgICAweDU5QkEsIDB4NTlDRiwgMHg1OUNFLCAweDU5QjIsIDB4NTlDQywgMHg1OUMxLCAweDU5QjYsIDB4NTlCQywgMHg1OUMzLAorICAgIDB4NTlENiwgMHg1OUIxLCAweDU5QkQsIDB4NTlDMCwgMHg1OUM4LCAweDU5QjQsIDB4NTlDNywgMHg1QjYyLCAweDVCNjUsCisgICAgMHg1QjkzLCAweDVCOTUsIDB4NUM0NCwgMHg1QzQ3LCAweDVDQUUsIDB4NUNBNCwgMHg1Q0EwLCAweDVDQjUsIDB4NUNBRiwKKyAgICAweDVDQTgsIDB4NUNBQywgMHg1QzlGLCAweDVDQTMsIDB4NUNBRCwgMHg1Q0EyLCAweDVDQUEsIDB4NUNBNywgMHg1QzlELAorICAgIDB4NUNBNSwgMHg1Q0I2LCAweDVDQjAsIDB4NUNBNiwgMHg1RTE3LCAweDVFMTQsIDB4NUUxOSwgMHg1RjI4LCAweDVGMjIsCisgICAgMHg1RjIzLCAweDVGMjQsIDB4NUY1NCwgMHg1RjgyLCAweDVGN0UsIDB4NUY3RCwgMHg1RkRFLCAweDVGRTUsIDB4NjAyRCwKKyAgICAweDYwMjYsIDB4NjAxOSwgMHg2MDMyLCAweDYwMEIsIDB4NjAzNCwgMHg2MDBBLCAweDYwMTcsIDB4NjAzMywgMHg2MDFBLAorICAgIDB4NjAxRSwgMHg2MDJDLCAweDYwMjIsIDB4NjAwRCwgMHg2MDEwLCAweDYwMkUsIDB4NjAxMywgMHg2MDExLCAweDYwMEMsCisgICAgMHg2MDA5LCAweDYwMUMsIDB4NjIxNCwgMHg2MjNELCAweDYyQUQsIDB4NjJCNCwgMHg2MkQxLCAweDYyQkUsIDB4NjJBQSwKKyAgICAweDYyQjYsIDB4NjJDQSwgMHg2MkFFLCAweDYyQjMsIDB4NjJBRiwgMHg2MkJCLCAweDYyQTksIDB4NjJCMCwgMHg2MkI4LAorICAgIDB4NjUzRCwgMHg2NUE4LCAweDY1QkIsIDB4NjYwOSwgMHg2NUZDLCAweDY2MDQsIDB4NjYxMiwgMHg2NjA4LCAweDY1RkIsCisgICAgMHg2NjAzLCAweDY2MEIsIDB4NjYwRCwgMHg2NjA1LCAweDY1RkQsIDB4NjYxMSwgMHg2NjEwLCAweDY2RjYsIDB4NjcwQSwKKyAgICAweDY3ODUsIDB4Njc2QywgMHg2NzhFLCAweDY3OTIsIDB4Njc3NiwgMHg2NzdCLCAweDY3OTgsIDB4Njc4NiwgMHg2Nzg0LAorICAgIDB4Njc3NCwgMHg2NzhELCAweDY3OEMsIDB4Njc3QSwgMHg2NzlGLCAweDY3OTEsIDB4Njc5OSwgMHg2NzgzLCAweDY3N0QsCisgICAgMHg2NzgxLCAweDY3NzgsIDB4Njc3OSwgMHg2Nzk0LCAweDZCMjUsIDB4NkI4MCwgMHg2QjdFLCAweDZCREUsIDB4NkMxRCwKKyAgICAweDZDOTMsIDB4NkNFQywgMHg2Q0VCLCAweDZDRUUsIDB4NkNEOSwgMHg2Q0I2LCAweDZDRDQsIDB4NkNBRCwgMHg2Q0U3LAorICAgIDB4NkNCNywgMHg2Q0QwLCAweDZDQzIsIDB4NkNCQSwgMHg2Q0MzLCAweDZDQzYsIDB4NkNFRCwgMHg2Q0YyLCAweDZDRDIsCisgICAgMHg2Q0RELCAweDZDQjQsIDB4NkM4QSwgMHg2QzlELCAweDZDODAsIDB4NkNERSwgMHg2Q0MwLCAweDZEMzAsIDB4NkNDRCwKKyAgICAweDZDQzcsIDB4NkNCMCwgMHg2Q0Y5LCAweDZDQ0YsIDB4NkNFOSwgMHg2Q0QxLCAweDcwOTQsIDB4NzA5OCwgMHg3MDg1LAorICAgIDB4NzA5MywgMHg3MDg2LCAweDcwODQsIDB4NzA5MSwgMHg3MDk2LCAweDcwODIsIDB4NzA5QSwgMHg3MDgzLCAweDcyNkEsCisgICAgMHg3MkQ2LCAweDcyQ0IsIDB4NzJEOCwgMHg3MkM5LCAweDcyREMsIDB4NzJEMiwgMHg3MkQ0LCAweDcyREEsIDB4NzJDQywKKyAgICAweDcyRDEsIDB4NzNBNCwgMHg3M0ExLCAweDczQUQsIDB4NzNBNiwgMHg3M0EyLCAweDczQTAsIDB4NzNBQywgMHg3MzlELAorICAgIDB4NzRERCwgMHg3NEU4LCAweDc1M0YsIDB4NzU0MCwgMHg3NTNFLCAweDc1OEMsIDB4NzU5OCwgMHg3NkFGLCAweDc2RjMsCisgICAgMHg3NkYxLCAweDc2RjAsIDB4NzZGNSwgMHg3N0Y4LCAweDc3RkMsIDB4NzdGOSwgMHg3N0ZCLCAweDc3RkEsIDB4NzdGNywKKyAgICAweDc5NDIsIDB4NzkzRiwgMHg3OUM1LCAweDdBNzgsIDB4N0E3QiwgMHg3QUZCLCAweDdDNzUsIDB4N0NGRCwgMHg4MDM1LAorICAgIDB4ODA4RiwgMHg4MEFFLCAweDgwQTMsIDB4ODBCOCwgMHg4MEI1LCAweDgwQUQsIDB4ODIyMCwgMHg4MkEwLCAweDgyQzAsCisgICAgMHg4MkFCLCAweDgyOUEsIDB4ODI5OCwgMHg4MjlCLCAweDgyQjUsIDB4ODJBNywgMHg4MkFFLCAweDgyQkMsIDB4ODI5RSwKKyAgICAweDgyQkEsIDB4ODJCNCwgMHg4MkE4LCAweDgyQTEsIDB4ODJBOSwgMHg4MkMyLCAweDgyQTQsIDB4ODJDMywgMHg4MkI2LAorICAgIDB4ODJBMiwgMHg4NjcwLCAweDg2NkYsIDB4ODY2RCwgMHg4NjZFLCAweDhDNTYsIDB4OEZEMiwgMHg4RkNCLCAweDhGRDMsCisgICAgMHg4RkNELCAweDhGRDYsIDB4OEZENSwgMHg4RkQ3LCAweDkwQjIsIDB4OTBCNCwgMHg5MEFGLCAweDkwQjMsIDB4OTBCMCwKKyAgICAweDk2MzksIDB4OTYzRCwgMHg5NjNDLCAweDk2M0EsIDB4OTY0MywgMHg0RkNELCAweDRGQzUsIDB4NEZEMywgMHg0RkIyLAorICAgIDB4NEZDOSwgMHg0RkNCLCAweDRGQzEsIDB4NEZENCwgMHg0RkRDLCAweDRGRDksIDB4NEZCQiwgMHg0RkIzLCAweDRGREIsCisgICAgMHg0RkM3LCAweDRGRDYsIDB4NEZCQSwgMHg0RkMwLCAweDRGQjksIDB4NEZFQywgMHg1MjQ0LCAweDUyNDksIDB4NTJDMCwKKyAgICAweDUyQzIsIDB4NTMzRCwgMHg1MzdDLCAweDUzOTcsIDB4NTM5NiwgMHg1Mzk5LCAweDUzOTgsIDB4NTRCQSwgMHg1NEExLAorICAgIDB4NTRBRCwgMHg1NEE1LCAweDU0Q0YsIDB4NTRDMywgMHg4MzBELCAweDU0QjcsIDB4NTRBRSwgMHg1NEQ2LCAweDU0QjYsCisgICAgMHg1NEM1LCAweDU0QzYsIDB4NTRBMCwgMHg1NDcwLCAweDU0QkMsIDB4NTRBMiwgMHg1NEJFLCAweDU0NzIsIDB4NTRERSwKKyAgICAweDU0QjAsIDB4NTdCNSwgMHg1NzlFLCAweDU3OUYsIDB4NTdBNCwgMHg1NzhDLCAweDU3OTcsIDB4NTc5RCwgMHg1NzlCLAorICAgIDB4NTc5NCwgMHg1Nzk4LCAweDU3OEYsIDB4NTc5OSwgMHg1N0E1LCAweDU3OUEsIDB4NTc5NSwgMHg1OEY0LCAweDU5MEQsCisgICAgMHg1OTUzLCAweDU5RTEsIDB4NTlERSwgMHg1OUVFLCAweDVBMDAsIDB4NTlGMSwgMHg1OURELCAweDU5RkEsIDB4NTlGRCwKKyAgICAweDU5RkMsIDB4NTlGNiwgMHg1OUU0LCAweDU5RjIsIDB4NTlGNywgMHg1OURCLCAweDU5RTksIDB4NTlGMywgMHg1OUY1LAorICAgIDB4NTlFMCwgMHg1OUZFLCAweDU5RjQsIDB4NTlFRCwgMHg1QkE4LCAweDVDNEMsIDB4NUNEMCwgMHg1Q0Q4LCAweDVDQ0MsCisgICAgMHg1Q0Q3LCAweDVDQ0IsIDB4NUNEQiwgMHg1Q0RFLCAweDVDREEsIDB4NUNDOSwgMHg1Q0M3LCAweDVDQ0EsIDB4NUNENiwKKyAgICAweDVDRDMsIDB4NUNENCwgMHg1Q0NGLCAweDVDQzgsIDB4NUNDNiwgMHg1Q0NFLCAweDVDREYsIDB4NUNGOCwgMHg1REY5LAorICAgIDB4NUUyMSwgMHg1RTIyLCAweDVFMjMsIDB4NUUyMCwgMHg1RTI0LCAweDVFQjAsIDB4NUVBNCwgMHg1RUEyLCAweDVFOUIsCisgICAgMHg1RUEzLCAweDVFQTUsIDB4NUYwNywgMHg1RjJFLCAweDVGNTYsIDB4NUY4NiwgMHg2MDM3LCAweDYwMzksIDB4NjA1NCwKKyAgICAweDYwNzIsIDB4NjA1RSwgMHg2MDQ1LCAweDYwNTMsIDB4NjA0NywgMHg2MDQ5LCAweDYwNUIsIDB4NjA0QywgMHg2MDQwLAorICAgIDB4NjA0MiwgMHg2MDVGLCAweDYwMjQsIDB4NjA0NCwgMHg2MDU4LCAweDYwNjYsIDB4NjA2RSwgMHg2MjQyLCAweDYyNDMsCisgICAgMHg2MkNGLCAweDYzMEQsIDB4NjMwQiwgMHg2MkY1LCAweDYzMEUsIDB4NjMwMywgMHg2MkVCLCAweDYyRjksIDB4NjMwRiwKKyAgICAweDYzMEMsIDB4NjJGOCwgMHg2MkY2LCAweDYzMDAsIDB4NjMxMywgMHg2MzE0LCAweDYyRkEsIDB4NjMxNSwgMHg2MkZCLAorICAgIDB4NjJGMCwgMHg2NTQxLCAweDY1NDMsIDB4NjVBQSwgMHg2NUJGLCAweDY2MzYsIDB4NjYyMSwgMHg2NjMyLCAweDY2MzUsCisgICAgMHg2NjFDLCAweDY2MjYsIDB4NjYyMiwgMHg2NjMzLCAweDY2MkIsIDB4NjYzQSwgMHg2NjFELCAweDY2MzQsIDB4NjYzOSwKKyAgICAweDY2MkUsIDB4NjcwRiwgMHg2NzEwLCAweDY3QzEsIDB4NjdGMiwgMHg2N0M4LCAweDY3QkEsIDB4NjdEQywgMHg2N0JCLAorICAgIDB4NjdGOCwgMHg2N0Q4LCAweDY3QzAsIDB4NjdCNywgMHg2N0M1LCAweDY3RUIsIDB4NjdFNCwgMHg2N0RGLCAweDY3QjUsCisgICAgMHg2N0NELCAweDY3QjMsIDB4NjdGNywgMHg2N0Y2LCAweDY3RUUsIDB4NjdFMywgMHg2N0MyLCAweDY3QjksIDB4NjdDRSwKKyAgICAweDY3RTcsIDB4NjdGMCwgMHg2N0IyLCAweDY3RkMsIDB4NjdDNiwgMHg2N0VELCAweDY3Q0MsIDB4NjdBRSwgMHg2N0U2LAorICAgIDB4NjdEQiwgMHg2N0ZBLCAweDY3QzksIDB4NjdDQSwgMHg2N0MzLCAweDY3RUEsIDB4NjdDQiwgMHg2QjI4LCAweDZCODIsCisgICAgMHg2Qjg0LCAweDZCQjYsIDB4NkJENiwgMHg2QkQ4LCAweDZCRTAsIDB4NkMyMCwgMHg2QzIxLCAweDZEMjgsIDB4NkQzNCwKKyAgICAweDZEMkQsIDB4NkQxRiwgMHg2RDNDLCAweDZEM0YsIDB4NkQxMiwgMHg2RDBBLCAweDZDREEsIDB4NkQzMywgMHg2RDA0LAorICAgIDB4NkQxOSwgMHg2RDNBLCAweDZEMUEsIDB4NkQxMSwgMHg2RDAwLCAweDZEMUQsIDB4NkQ0MiwgMHg2RDAxLCAweDZEMTgsCisgICAgMHg2RDM3LCAweDZEMDMsIDB4NkQwRiwgMHg2RDQwLCAweDZEMDcsIDB4NkQyMCwgMHg2RDJDLCAweDZEMDgsIDB4NkQyMiwKKyAgICAweDZEMDksIDB4NkQxMCwgMHg3MEI3LCAweDcwOUYsIDB4NzBCRSwgMHg3MEIxLCAweDcwQjAsIDB4NzBBMSwgMHg3MEI0LAorICAgIDB4NzBCNSwgMHg3MEE5LCAweDcyNDEsIDB4NzI0OSwgMHg3MjRBLCAweDcyNkMsIDB4NzI3MCwgMHg3MjczLCAweDcyNkUsCisgICAgMHg3MkNBLCAweDcyRTQsIDB4NzJFOCwgMHg3MkVCLCAweDcyREYsIDB4NzJFQSwgMHg3MkU2LCAweDcyRTMsIDB4NzM4NSwKKyAgICAweDczQ0MsIDB4NzNDMiwgMHg3M0M4LCAweDczQzUsIDB4NzNCOSwgMHg3M0I2LCAweDczQjUsIDB4NzNCNCwgMHg3M0VCLAorICAgIDB4NzNCRiwgMHg3M0M3LCAweDczQkUsIDB4NzNDMywgMHg3M0M2LCAweDczQjgsIDB4NzNDQiwgMHg3NEVDLCAweDc0RUUsCisgICAgMHg3NTJFLCAweDc1NDcsIDB4NzU0OCwgMHg3NUE3LCAweDc1QUEsIDB4NzY3OSwgMHg3NkM0LCAweDc3MDgsIDB4NzcwMywKKyAgICAweDc3MDQsIDB4NzcwNSwgMHg3NzBBLCAweDc2RjcsIDB4NzZGQiwgMHg3NkZBLCAweDc3RTcsIDB4NzdFOCwgMHg3ODA2LAorICAgIDB4NzgxMSwgMHg3ODEyLCAweDc4MDUsIDB4NzgxMCwgMHg3ODBGLCAweDc4MEUsIDB4NzgwOSwgMHg3ODAzLCAweDc4MTMsCisgICAgMHg3OTRBLCAweDc5NEMsIDB4Nzk0QiwgMHg3OTQ1LCAweDc5NDQsIDB4NzlENSwgMHg3OUNELCAweDc5Q0YsIDB4NzlENiwKKyAgICAweDc5Q0UsIDB4N0E4MCwgMHg3QTdFLCAweDdBRDEsIDB4N0IwMCwgMHg3QjAxLCAweDdDN0EsIDB4N0M3OCwgMHg3Qzc5LAorICAgIDB4N0M3RiwgMHg3QzgwLCAweDdDODEsIDB4N0QwMywgMHg3RDA4LCAweDdEMDEsIDB4N0Y1OCwgMHg3RjkxLCAweDdGOEQsCisgICAgMHg3RkJFLCAweDgwMDcsIDB4ODAwRSwgMHg4MDBGLCAweDgwMTQsIDB4ODAzNywgMHg4MEQ4LCAweDgwQzcsIDB4ODBFMCwKKyAgICAweDgwRDEsIDB4ODBDOCwgMHg4MEMyLCAweDgwRDAsIDB4ODBDNSwgMHg4MEUzLCAweDgwRDksIDB4ODBEQywgMHg4MENBLAorICAgIDB4ODBENSwgMHg4MEM5LCAweDgwQ0YsIDB4ODBENywgMHg4MEU2LCAweDgwQ0QsIDB4ODFGRiwgMHg4MjIxLCAweDgyOTQsCisgICAgMHg4MkQ5LCAweDgyRkUsIDB4ODJGOSwgMHg4MzA3LCAweDgyRTgsIDB4ODMwMCwgMHg4MkQ1LCAweDgzM0EsIDB4ODJFQiwKKyAgICAweDgyRDYsIDB4ODJGNCwgMHg4MkVDLCAweDgyRTEsIDB4ODJGMiwgMHg4MkY1LCAweDgzMEMsIDB4ODJGQiwgMHg4MkY2LAorICAgIDB4ODJGMCwgMHg4MkVBLCAweDgyRTQsIDB4ODJFMCwgMHg4MkZBLCAweDgyRjMsIDB4ODJFRCwgMHg4Njc3LCAweDg2NzQsCisgICAgMHg4NjdDLCAweDg2NzMsIDB4ODg0MSwgMHg4ODRFLCAweDg4NjcsIDB4ODg2QSwgMHg4ODY5LCAweDg5RDMsIDB4OEEwNCwKKyAgICAweDhBMDcsIDB4OEQ3MiwgMHg4RkUzLCAweDhGRTEsIDB4OEZFRSwgMHg4RkUwLCAweDkwRjEsIDB4OTBCRCwgMHg5MEJGLAorICAgIDB4OTBENSwgMHg5MEM1LCAweDkwQkUsIDB4OTBDNywgMHg5MENCLCAweDkwQzgsIDB4OTFENCwgMHg5MUQzLCAweDk2NTQsCisgICAgMHg5NjRGLCAweDk2NTEsIDB4OTY1MywgMHg5NjRBLCAweDk2NEUsIDB4NTAxRSwgMHg1MDA1LCAweDUwMDcsIDB4NTAxMywKKyAgICAweDUwMjIsIDB4NTAzMCwgMHg1MDFCLCAweDRGRjUsIDB4NEZGNCwgMHg1MDMzLCAweDUwMzcsIDB4NTAyQywgMHg0RkY2LAorICAgIDB4NEZGNywgMHg1MDE3LCAweDUwMUMsIDB4NTAyMCwgMHg1MDI3LCAweDUwMzUsIDB4NTAyRiwgMHg1MDMxLCAweDUwMEUsCisgICAgMHg1MTVBLCAweDUxOTQsIDB4NTE5MywgMHg1MUNBLCAweDUxQzQsIDB4NTFDNSwgMHg1MUM4LCAweDUxQ0UsIDB4NTI2MSwKKyAgICAweDUyNUEsIDB4NTI1MiwgMHg1MjVFLCAweDUyNUYsIDB4NTI1NSwgMHg1MjYyLCAweDUyQ0QsIDB4NTMwRSwgMHg1MzlFLAorICAgIDB4NTUyNiwgMHg1NEUyLCAweDU1MTcsIDB4NTUxMiwgMHg1NEU3LCAweDU0RjMsIDB4NTRFNCwgMHg1NTFBLCAweDU0RkYsCisgICAgMHg1NTA0LCAweDU1MDgsIDB4NTRFQiwgMHg1NTExLCAweDU1MDUsIDB4NTRGMSwgMHg1NTBBLCAweDU0RkIsIDB4NTRGNywKKyAgICAweDU0RjgsIDB4NTRFMCwgMHg1NTBFLCAweDU1MDMsIDB4NTUwQiwgMHg1NzAxLCAweDU3MDIsIDB4NTdDQywgMHg1ODMyLAorICAgIDB4NTdENSwgMHg1N0QyLCAweDU3QkEsIDB4NTdDNiwgMHg1N0JELCAweDU3QkMsIDB4NTdCOCwgMHg1N0I2LCAweDU3QkYsCisgICAgMHg1N0M3LCAweDU3RDAsIDB4NTdCOSwgMHg1N0MxLCAweDU5MEUsIDB4NTk0QSwgMHg1QTE5LCAweDVBMTYsIDB4NUEyRCwKKyAgICAweDVBMkUsIDB4NUExNSwgMHg1QTBGLCAweDVBMTcsIDB4NUEwQSwgMHg1QTFFLCAweDVBMzMsIDB4NUI2QywgMHg1QkE3LAorICAgIDB4NUJBRCwgMHg1QkFDLCAweDVDMDMsIDB4NUM1NiwgMHg1QzU0LCAweDVDRUMsIDB4NUNGRiwgMHg1Q0VFLCAweDVDRjEsCisgICAgMHg1Q0Y3LCAweDVEMDAsIDB4NUNGOSwgMHg1RTI5LCAweDVFMjgsIDB4NUVBOCwgMHg1RUFFLCAweDVFQUEsIDB4NUVBQywKKyAgICAweDVGMzMsIDB4NUYzMCwgMHg1RjY3LCAweDYwNUQsIDB4NjA1QSwgMHg2MDY3LCAweDYwNDEsIDB4NjBBMiwgMHg2MDg4LAorICAgIDB4NjA4MCwgMHg2MDkyLCAweDYwODEsIDB4NjA5RCwgMHg2MDgzLCAweDYwOTUsIDB4NjA5QiwgMHg2MDk3LCAweDYwODcsCisgICAgMHg2MDlDLCAweDYwOEUsIDB4NjIxOSwgMHg2MjQ2LCAweDYyRjIsIDB4NjMxMCwgMHg2MzU2LCAweDYzMkMsIDB4NjM0NCwKKyAgICAweDYzNDUsIDB4NjMzNiwgMHg2MzQzLCAweDYzRTQsIDB4NjMzOSwgMHg2MzRCLCAweDYzNEEsIDB4NjMzQywgMHg2MzI5LAorICAgIDB4NjM0MSwgMHg2MzM0LCAweDYzNTgsIDB4NjM1NCwgMHg2MzU5LCAweDYzMkQsIDB4NjM0NywgMHg2MzMzLCAweDYzNUEsCisgICAgMHg2MzUxLCAweDYzMzgsIDB4NjM1NywgMHg2MzQwLCAweDYzNDgsIDB4NjU0QSwgMHg2NTQ2LCAweDY1QzYsIDB4NjVDMywKKyAgICAweDY1QzQsIDB4NjVDMiwgMHg2NjRBLCAweDY2NUYsIDB4NjY0NywgMHg2NjUxLCAweDY3MTIsIDB4NjcxMywgMHg2ODFGLAorICAgIDB4NjgxQSwgMHg2ODQ5LCAweDY4MzIsIDB4NjgzMywgMHg2ODNCLCAweDY4NEIsIDB4Njg0RiwgMHg2ODE2LCAweDY4MzEsCisgICAgMHg2ODFDLCAweDY4MzUsIDB4NjgyQiwgMHg2ODJELCAweDY4MkYsIDB4Njg0RSwgMHg2ODQ0LCAweDY4MzQsIDB4NjgxRCwKKyAgICAweDY4MTIsIDB4NjgxNCwgMHg2ODI2LCAweDY4MjgsIDB4NjgyRSwgMHg2ODRELCAweDY4M0EsIDB4NjgyNSwgMHg2ODIwLAorICAgIDB4NkIyQywgMHg2QjJGLCAweDZCMkQsIDB4NkIzMSwgMHg2QjM0LCAweDZCNkQsIDB4ODA4MiwgMHg2Qjg4LCAweDZCRTYsCisgICAgMHg2QkU0LCAweDZCRTgsIDB4NkJFMywgMHg2QkUyLCAweDZCRTcsIDB4NkMyNSwgMHg2RDdBLCAweDZENjMsIDB4NkQ2NCwKKyAgICAweDZENzYsIDB4NkQwRCwgMHg2RDYxLCAweDZEOTIsIDB4NkQ1OCwgMHg2RDYyLCAweDZENkQsIDB4NkQ2RiwgMHg2RDkxLAorICAgIDB4NkQ4RCwgMHg2REVGLCAweDZEN0YsIDB4NkQ4NiwgMHg2RDVFLCAweDZENjcsIDB4NkQ2MCwgMHg2RDk3LCAweDZENzAsCisgICAgMHg2RDdDLCAweDZENUYsIDB4NkQ4MiwgMHg2RDk4LCAweDZEMkYsIDB4NkQ2OCwgMHg2RDhCLCAweDZEN0UsIDB4NkQ4MCwKKyAgICAweDZEODQsIDB4NkQxNiwgMHg2RDgzLCAweDZEN0IsIDB4NkQ3RCwgMHg2RDc1LCAweDZEOTAsIDB4NzBEQywgMHg3MEQzLAorICAgIDB4NzBEMSwgMHg3MERELCAweDcwQ0IsIDB4N0YzOSwgMHg3MEUyLCAweDcwRDcsIDB4NzBEMiwgMHg3MERFLCAweDcwRTAsCisgICAgMHg3MEQ0LCAweDcwQ0QsIDB4NzBDNSwgMHg3MEM2LCAweDcwQzcsIDB4NzBEQSwgMHg3MENFLCAweDcwRTEsIDB4NzI0MiwKKyAgICAweDcyNzgsIDB4NzI3NywgMHg3Mjc2LCAweDczMDAsIDB4NzJGQSwgMHg3MkY0LCAweDcyRkUsIDB4NzJGNiwgMHg3MkYzLAorICAgIDB4NzJGQiwgMHg3MzAxLCAweDczRDMsIDB4NzNEOSwgMHg3M0U1LCAweDczRDYsIDB4NzNCQywgMHg3M0U3LCAweDczRTMsCisgICAgMHg3M0U5LCAweDczREMsIDB4NzNEMiwgMHg3M0RCLCAweDczRDQsIDB4NzNERCwgMHg3M0RBLCAweDczRDcsIDB4NzNEOCwKKyAgICAweDczRTgsIDB4NzRERSwgMHg3NERGLCAweDc0RjQsIDB4NzRGNSwgMHg3NTIxLCAweDc1NUIsIDB4NzU1RiwgMHg3NUIwLAorICAgIDB4NzVDMSwgMHg3NUJCLCAweDc1QzQsIDB4NzVDMCwgMHg3NUJGLCAweDc1QjYsIDB4NzVCQSwgMHg3NjhBLCAweDc2QzksCisgICAgMHg3NzFELCAweDc3MUIsIDB4NzcxMCwgMHg3NzEzLCAweDc3MTIsIDB4NzcyMywgMHg3NzExLCAweDc3MTUsIDB4NzcxOSwKKyAgICAweDc3MUEsIDB4NzcyMiwgMHg3NzI3LCAweDc4MjMsIDB4NzgyQywgMHg3ODIyLCAweDc4MzUsIDB4NzgyRiwgMHg3ODI4LAorICAgIDB4NzgyRSwgMHg3ODJCLCAweDc4MjEsIDB4NzgyOSwgMHg3ODMzLCAweDc4MkEsIDB4NzgzMSwgMHg3OTU0LCAweDc5NUIsCisgICAgMHg3OTRGLCAweDc5NUMsIDB4Nzk1MywgMHg3OTUyLCAweDc5NTEsIDB4NzlFQiwgMHg3OUVDLCAweDc5RTAsIDB4NzlFRSwKKyAgICAweDc5RUQsIDB4NzlFQSwgMHg3OURDLCAweDc5REUsIDB4NzlERCwgMHg3QTg2LCAweDdBODksIDB4N0E4NSwgMHg3QThCLAorICAgIDB4N0E4QywgMHg3QThBLCAweDdBODcsIDB4N0FEOCwgMHg3QjEwLCAweDdCMDQsIDB4N0IxMywgMHg3QjA1LCAweDdCMEYsCisgICAgMHg3QjA4LCAweDdCMEEsIDB4N0IwRSwgMHg3QjA5LCAweDdCMTIsIDB4N0M4NCwgMHg3QzkxLCAweDdDOEEsIDB4N0M4QywKKyAgICAweDdDODgsIDB4N0M4RCwgMHg3Qzg1LCAweDdEMUUsIDB4N0QxRCwgMHg3RDExLCAweDdEMEUsIDB4N0QxOCwgMHg3RDE2LAorICAgIDB4N0QxMywgMHg3RDFGLCAweDdEMTIsIDB4N0QwRiwgMHg3RDBDLCAweDdGNUMsIDB4N0Y2MSwgMHg3RjVFLCAweDdGNjAsCisgICAgMHg3RjVELCAweDdGNUIsIDB4N0Y5NiwgMHg3RjkyLCAweDdGQzMsIDB4N0ZDMiwgMHg3RkMwLCAweDgwMTYsIDB4ODAzRSwKKyAgICAweDgwMzksIDB4ODBGQSwgMHg4MEYyLCAweDgwRjksIDB4ODBGNSwgMHg4MTAxLCAweDgwRkIsIDB4ODEwMCwgMHg4MjAxLAorICAgIDB4ODIyRiwgMHg4MjI1LCAweDgzMzMsIDB4ODMyRCwgMHg4MzQ0LCAweDgzMTksIDB4ODM1MSwgMHg4MzI1LCAweDgzNTYsCisgICAgMHg4MzNGLCAweDgzNDEsIDB4ODMyNiwgMHg4MzFDLCAweDgzMjIsIDB4ODM0MiwgMHg4MzRFLCAweDgzMUIsIDB4ODMyQSwKKyAgICAweDgzMDgsIDB4ODMzQywgMHg4MzRELCAweDgzMTYsIDB4ODMyNCwgMHg4MzIwLCAweDgzMzcsIDB4ODMyRiwgMHg4MzI5LAorICAgIDB4ODM0NywgMHg4MzQ1LCAweDgzNEMsIDB4ODM1MywgMHg4MzFFLCAweDgzMkMsIDB4ODM0QiwgMHg4MzI3LCAweDgzNDgsCisgICAgMHg4NjUzLCAweDg2NTIsIDB4ODZBMiwgMHg4NkE4LCAweDg2OTYsIDB4ODY4RCwgMHg4NjkxLCAweDg2OUUsIDB4ODY4NywKKyAgICAweDg2OTcsIDB4ODY4NiwgMHg4NjhCLCAweDg2OUEsIDB4ODY4NSwgMHg4NkE1LCAweDg2OTksIDB4ODZBMSwgMHg4NkE3LAorICAgIDB4ODY5NSwgMHg4Njk4LCAweDg2OEUsIDB4ODY5RCwgMHg4NjkwLCAweDg2OTQsIDB4ODg0MywgMHg4ODQ0LCAweDg4NkQsCisgICAgMHg4ODc1LCAweDg4NzYsIDB4ODg3MiwgMHg4ODgwLCAweDg4NzEsIDB4ODg3RiwgMHg4ODZGLCAweDg4ODMsIDB4ODg3RSwKKyAgICAweDg4NzQsIDB4ODg3QywgMHg4QTEyLCAweDhDNDcsIDB4OEM1NywgMHg4QzdCLCAweDhDQTQsIDB4OENBMywgMHg4RDc2LAorICAgIDB4OEQ3OCwgMHg4REI1LCAweDhEQjcsIDB4OERCNiwgMHg4RUQxLCAweDhFRDMsIDB4OEZGRSwgMHg4RkY1LCAweDkwMDIsCisgICAgMHg4RkZGLCAweDhGRkIsIDB4OTAwNCwgMHg4RkZDLCAweDhGRjYsIDB4OTBENiwgMHg5MEUwLCAweDkwRDksIDB4OTBEQSwKKyAgICAweDkwRTMsIDB4OTBERiwgMHg5MEU1LCAweDkwRDgsIDB4OTBEQiwgMHg5MEQ3LCAweDkwREMsIDB4OTBFNCwgMHg5MTUwLAorICAgIDB4OTE0RSwgMHg5MTRGLCAweDkxRDUsIDB4OTFFMiwgMHg5MURBLCAweDk2NUMsIDB4OTY1RiwgMHg5NkJDLCAweDk4RTMsCisgICAgMHg5QURGLCAweDlCMkYsIDB4NEU3RiwgMHg1MDcwLCAweDUwNkEsIDB4NTA2MSwgMHg1MDVFLCAweDUwNjAsIDB4NTA1MywKKyAgICAweDUwNEIsIDB4NTA1RCwgMHg1MDcyLCAweDUwNDgsIDB4NTA0RCwgMHg1MDQxLCAweDUwNUIsIDB4NTA0QSwgMHg1MDYyLAorICAgIDB4NTAxNSwgMHg1MDQ1LCAweDUwNUYsIDB4NTA2OSwgMHg1MDZCLCAweDUwNjMsIDB4NTA2NCwgMHg1MDQ2LCAweDUwNDAsCisgICAgMHg1MDZFLCAweDUwNzMsIDB4NTA1NywgMHg1MDUxLCAweDUxRDAsIDB4NTI2QiwgMHg1MjZELCAweDUyNkMsIDB4NTI2RSwKKyAgICAweDUyRDYsIDB4NTJEMywgMHg1MzJELCAweDUzOUMsIDB4NTU3NSwgMHg1NTc2LCAweDU1M0MsIDB4NTU0RCwgMHg1NTUwLAorICAgIDB4NTUzNCwgMHg1NTJBLCAweDU1NTEsIDB4NTU2MiwgMHg1NTM2LCAweDU1MzUsIDB4NTUzMCwgMHg1NTUyLCAweDU1NDUsCisgICAgMHg1NTBDLCAweDU1MzIsIDB4NTU2NSwgMHg1NTRFLCAweDU1MzksIDB4NTU0OCwgMHg1NTJELCAweDU1M0IsIDB4NTU0MCwKKyAgICAweDU1NEIsIDB4NTcwQSwgMHg1NzA3LCAweDU3RkIsIDB4NTgxNCwgMHg1N0UyLCAweDU3RjYsIDB4NTdEQywgMHg1N0Y0LAorICAgIDB4NTgwMCwgMHg1N0VELCAweDU3RkQsIDB4NTgwOCwgMHg1N0Y4LCAweDU4MEIsIDB4NTdGMywgMHg1N0NGLCAweDU4MDcsCisgICAgMHg1N0VFLCAweDU3RTMsIDB4NTdGMiwgMHg1N0U1LCAweDU3RUMsIDB4NTdFMSwgMHg1ODBFLCAweDU3RkMsIDB4NTgxMCwKKyAgICAweDU3RTcsIDB4NTgwMSwgMHg1ODBDLCAweDU3RjEsIDB4NTdFOSwgMHg1N0YwLCAweDU4MEQsIDB4NTgwNCwgMHg1OTVDLAorICAgIDB4NUE2MCwgMHg1QTU4LCAweDVBNTUsIDB4NUE2NywgMHg1QTVFLCAweDVBMzgsIDB4NUEzNSwgMHg1QTZELCAweDVBNTAsCisgICAgMHg1QTVGLCAweDVBNjUsIDB4NUE2QywgMHg1QTUzLCAweDVBNjQsIDB4NUE1NywgMHg1QTQzLCAweDVBNUQsIDB4NUE1MiwKKyAgICAweDVBNDQsIDB4NUE1QiwgMHg1QTQ4LCAweDVBOEUsIDB4NUEzRSwgMHg1QTRELCAweDVBMzksIDB4NUE0QywgMHg1QTcwLAorICAgIDB4NUE2OSwgMHg1QTQ3LCAweDVBNTEsIDB4NUE1NiwgMHg1QTQyLCAweDVBNUMsIDB4NUI3MiwgMHg1QjZFLCAweDVCQzEsCisgICAgMHg1QkMwLCAweDVDNTksIDB4NUQxRSwgMHg1RDBCLCAweDVEMUQsIDB4NUQxQSwgMHg1RDIwLCAweDVEMEMsIDB4NUQyOCwKKyAgICAweDVEMEQsIDB4NUQyNiwgMHg1RDI1LCAweDVEMEYsIDB4NUQzMCwgMHg1RDEyLCAweDVEMjMsIDB4NUQxRiwgMHg1RDJFLAorICAgIDB4NUUzRSwgMHg1RTM0LCAweDVFQjEsIDB4NUVCNCwgMHg1RUI5LCAweDVFQjIsIDB4NUVCMywgMHg1RjM2LCAweDVGMzgsCisgICAgMHg1RjlCLCAweDVGOTYsIDB4NUY5RiwgMHg2MDhBLCAweDYwOTAsIDB4NjA4NiwgMHg2MEJFLCAweDYwQjAsIDB4NjBCQSwKKyAgICAweDYwRDMsIDB4NjBENCwgMHg2MENGLCAweDYwRTQsIDB4NjBEOSwgMHg2MERELCAweDYwQzgsIDB4NjBCMSwgMHg2MERCLAorICAgIDB4NjBCNywgMHg2MENBLCAweDYwQkYsIDB4NjBDMywgMHg2MENELCAweDYwQzAsIDB4NjMzMiwgMHg2MzY1LCAweDYzOEEsCisgICAgMHg2MzgyLCAweDYzN0QsIDB4NjNCRCwgMHg2MzlFLCAweDYzQUQsIDB4NjM5RCwgMHg2Mzk3LCAweDYzQUIsIDB4NjM4RSwKKyAgICAweDYzNkYsIDB4NjM4NywgMHg2MzkwLCAweDYzNkUsIDB4NjNBRiwgMHg2Mzc1LCAweDYzOUMsIDB4NjM2RCwgMHg2M0FFLAorICAgIDB4NjM3QywgMHg2M0E0LCAweDYzM0IsIDB4NjM5RiwgMHg2Mzc4LCAweDYzODUsIDB4NjM4MSwgMHg2MzkxLCAweDYzOEQsCisgICAgMHg2MzcwLCAweDY1NTMsIDB4NjVDRCwgMHg2NjY1LCAweDY2NjEsIDB4NjY1QiwgMHg2NjU5LCAweDY2NUMsIDB4NjY2MiwKKyAgICAweDY3MTgsIDB4Njg3OSwgMHg2ODg3LCAweDY4OTAsIDB4Njg5QywgMHg2ODZELCAweDY4NkUsIDB4NjhBRSwgMHg2OEFCLAorICAgIDB4Njk1NiwgMHg2ODZGLCAweDY4QTMsIDB4NjhBQywgMHg2OEE5LCAweDY4NzUsIDB4Njg3NCwgMHg2OEIyLCAweDY4OEYsCisgICAgMHg2ODc3LCAweDY4OTIsIDB4Njg3QywgMHg2ODZCLCAweDY4NzIsIDB4NjhBQSwgMHg2ODgwLCAweDY4NzEsIDB4Njg3RSwKKyAgICAweDY4OUIsIDB4Njg5NiwgMHg2ODhCLCAweDY4QTAsIDB4Njg4OSwgMHg2OEE0LCAweDY4NzgsIDB4Njg3QiwgMHg2ODkxLAorICAgIDB4Njg4QywgMHg2ODhBLCAweDY4N0QsIDB4NkIzNiwgMHg2QjMzLCAweDZCMzcsIDB4NkIzOCwgMHg2QjkxLCAweDZCOEYsCisgICAgMHg2QjhELCAweDZCOEUsIDB4NkI4QywgMHg2QzJBLCAweDZEQzAsIDB4NkRBQiwgMHg2REI0LCAweDZEQjMsIDB4NkU3NCwKKyAgICAweDZEQUMsIDB4NkRFOSwgMHg2REUyLCAweDZEQjcsIDB4NkRGNiwgMHg2REQ0LCAweDZFMDAsIDB4NkRDOCwgMHg2REUwLAorICAgIDB4NkRERiwgMHg2REQ2LCAweDZEQkUsIDB4NkRFNSwgMHg2RERDLCAweDZEREQsIDB4NkREQiwgMHg2REY0LCAweDZEQ0EsCisgICAgMHg2REJELCAweDZERUQsIDB4NkRGMCwgMHg2REJBLCAweDZERDUsIDB4NkRDMiwgMHg2RENGLCAweDZEQzksIDB4NkREMCwKKyAgICAweDZERjIsIDB4NkREMywgMHg2REZELCAweDZERDcsIDB4NkRDRCwgMHg2REUzLCAweDZEQkIsIDB4NzBGQSwgMHg3MTBELAorICAgIDB4NzBGNywgMHg3MTE3LCAweDcwRjQsIDB4NzEwQywgMHg3MEYwLCAweDcxMDQsIDB4NzBGMywgMHg3MTEwLCAweDcwRkMsCisgICAgMHg3MEZGLCAweDcxMDYsIDB4NzExMywgMHg3MTAwLCAweDcwRjgsIDB4NzBGNiwgMHg3MTBCLCAweDcxMDIsIDB4NzEwRSwKKyAgICAweDcyN0UsIDB4NzI3QiwgMHg3MjdDLCAweDcyN0YsIDB4NzMxRCwgMHg3MzE3LCAweDczMDcsIDB4NzMxMSwgMHg3MzE4LAorICAgIDB4NzMwQSwgMHg3MzA4LCAweDcyRkYsIDB4NzMwRiwgMHg3MzFFLCAweDczODgsIDB4NzNGNiwgMHg3M0Y4LCAweDczRjUsCisgICAgMHg3NDA0LCAweDc0MDEsIDB4NzNGRCwgMHg3NDA3LCAweDc0MDAsIDB4NzNGQSwgMHg3M0ZDLCAweDczRkYsIDB4NzQwQywKKyAgICAweDc0MEIsIDB4NzNGNCwgMHg3NDA4LCAweDc1NjQsIDB4NzU2MywgMHg3NUNFLCAweDc1RDIsIDB4NzVDRiwgMHg3NUNCLAorICAgIDB4NzVDQywgMHg3NUQxLCAweDc1RDAsIDB4NzY4RiwgMHg3Njg5LCAweDc2RDMsIDB4NzczOSwgMHg3NzJGLCAweDc3MkQsCisgICAgMHg3NzMxLCAweDc3MzIsIDB4NzczNCwgMHg3NzMzLCAweDc3M0QsIDB4NzcyNSwgMHg3NzNCLCAweDc3MzUsIDB4Nzg0OCwKKyAgICAweDc4NTIsIDB4Nzg0OSwgMHg3ODRELCAweDc4NEEsIDB4Nzg0QywgMHg3ODI2LCAweDc4NDUsIDB4Nzg1MCwgMHg3OTY0LAorICAgIDB4Nzk2NywgMHg3OTY5LCAweDc5NkEsIDB4Nzk2MywgMHg3OTZCLCAweDc5NjEsIDB4NzlCQiwgMHg3OUZBLCAweDc5RjgsCisgICAgMHg3OUY2LCAweDc5RjcsIDB4N0E4RiwgMHg3QTk0LCAweDdBOTAsIDB4N0IzNSwgMHg3QjNCLCAweDdCMzQsIDB4N0IyNSwKKyAgICAweDdCMzAsIDB4N0IyMiwgMHg3QjI0LCAweDdCMzMsIDB4N0IxOCwgMHg3QjJBLCAweDdCMUQsIDB4N0IzMSwgMHg3QjJCLAorICAgIDB4N0IyRCwgMHg3QjJGLCAweDdCMzIsIDB4N0IzOCwgMHg3QjFBLCAweDdCMjMsIDB4N0M5NCwgMHg3Qzk4LCAweDdDOTYsCisgICAgMHg3Q0EzLCAweDdEMzUsIDB4N0QzRCwgMHg3RDM4LCAweDdEMzYsIDB4N0QzQSwgMHg3RDQ1LCAweDdEMkMsIDB4N0QyOSwKKyAgICAweDdENDEsIDB4N0Q0NywgMHg3RDNFLCAweDdEM0YsIDB4N0Q0QSwgMHg3RDNCLCAweDdEMjgsIDB4N0Y2MywgMHg3Rjk1LAorICAgIDB4N0Y5QywgMHg3RjlELCAweDdGOUIsIDB4N0ZDQSwgMHg3RkNCLCAweDdGQ0QsIDB4N0ZEMCwgMHg3RkQxLCAweDdGQzcsCisgICAgMHg3RkNGLCAweDdGQzksIDB4ODAxRiwgMHg4MDFFLCAweDgwMUIsIDB4ODA0NywgMHg4MDQzLCAweDgwNDgsIDB4ODExOCwKKyAgICAweDgxMjUsIDB4ODExOSwgMHg4MTFCLCAweDgxMkQsIDB4ODExRiwgMHg4MTJDLCAweDgxMUUsIDB4ODEyMSwgMHg4MTE1LAorICAgIDB4ODEyNywgMHg4MTFELCAweDgxMjIsIDB4ODIxMSwgMHg4MjM4LCAweDgyMzMsIDB4ODIzQSwgMHg4MjM0LCAweDgyMzIsCisgICAgMHg4Mjc0LCAweDgzOTAsIDB4ODNBMywgMHg4M0E4LCAweDgzOEQsIDB4ODM3QSwgMHg4MzczLCAweDgzQTQsIDB4ODM3NCwKKyAgICAweDgzOEYsIDB4ODM4MSwgMHg4Mzk1LCAweDgzOTksIDB4ODM3NSwgMHg4Mzk0LCAweDgzQTksIDB4ODM3RCwgMHg4MzgzLAorICAgIDB4ODM4QywgMHg4MzlELCAweDgzOUIsIDB4ODNBQSwgMHg4MzhCLCAweDgzN0UsIDB4ODNBNSwgMHg4M0FGLCAweDgzODgsCisgICAgMHg4Mzk3LCAweDgzQjAsIDB4ODM3RiwgMHg4M0E2LCAweDgzODcsIDB4ODNBRSwgMHg4Mzc2LCAweDg2NTksIDB4ODY1NiwKKyAgICAweDg2QkYsIDB4ODZCNywgMHg4NkMyLCAweDg2QzEsIDB4ODZDNSwgMHg4NkJBLCAweDg2QjAsIDB4ODZDOCwgMHg4NkI5LAorICAgIDB4ODZCMywgMHg4NkI4LCAweDg2Q0MsIDB4ODZCNCwgMHg4NkJCLCAweDg2QkMsIDB4ODZDMywgMHg4NkJELCAweDg2QkUsCisgICAgMHg4ODUyLCAweDg4ODksIDB4ODg5NSwgMHg4OEE4LCAweDg4QTIsIDB4ODhBQSwgMHg4ODlBLCAweDg4OTEsIDB4ODhBMSwKKyAgICAweDg4OUYsIDB4ODg5OCwgMHg4OEE3LCAweDg4OTksIDB4ODg5QiwgMHg4ODk3LCAweDg4QTQsIDB4ODhBQywgMHg4ODhDLAorICAgIDB4ODg5MywgMHg4ODhFLCAweDg5ODIsIDB4ODlENiwgMHg4OUQ5LCAweDg5RDUsIDB4OEEzMCwgMHg4QTI3LCAweDhBMkMsCisgICAgMHg4QTFFLCAweDhDMzksIDB4OEMzQiwgMHg4QzVDLCAweDhDNUQsIDB4OEM3RCwgMHg4Q0E1LCAweDhEN0QsIDB4OEQ3QiwKKyAgICAweDhENzksIDB4OERCQywgMHg4REMyLCAweDhEQjksIDB4OERCRiwgMHg4REMxLCAweDhFRDgsIDB4OEVERSwgMHg4RURELAorICAgIDB4OEVEQywgMHg4RUQ3LCAweDhFRTAsIDB4OEVFMSwgMHg5MDI0LCAweDkwMEIsIDB4OTAxMSwgMHg5MDFDLCAweDkwMEMsCisgICAgMHg5MDIxLCAweDkwRUYsIDB4OTBFQSwgMHg5MEYwLCAweDkwRjQsIDB4OTBGMiwgMHg5MEYzLCAweDkwRDQsIDB4OTBFQiwKKyAgICAweDkwRUMsIDB4OTBFOSwgMHg5MTU2LCAweDkxNTgsIDB4OTE1QSwgMHg5MTUzLCAweDkxNTUsIDB4OTFFQywgMHg5MUY0LAorICAgIDB4OTFGMSwgMHg5MUYzLCAweDkxRjgsIDB4OTFFNCwgMHg5MUY5LCAweDkxRUEsIDB4OTFFQiwgMHg5MUY3LCAweDkxRTgsCisgICAgMHg5MUVFLCAweDk1N0EsIDB4OTU4NiwgMHg5NTg4LCAweDk2N0MsIDB4OTY2RCwgMHg5NjZCLCAweDk2NzEsIDB4OTY2RiwKKyAgICAweDk2QkYsIDB4OTc2QSwgMHg5ODA0LCAweDk4RTUsIDB4OTk5NywgMHg1MDlCLCAweDUwOTUsIDB4NTA5NCwgMHg1MDlFLAorICAgIDB4NTA4QiwgMHg1MEEzLCAweDUwODMsIDB4NTA4QywgMHg1MDhFLCAweDUwOUQsIDB4NTA2OCwgMHg1MDlDLCAweDUwOTIsCisgICAgMHg1MDgyLCAweDUwODcsIDB4NTE1RiwgMHg1MUQ0LCAweDUzMTIsIDB4NTMxMSwgMHg1M0E0LCAweDUzQTcsIDB4NTU5MSwKKyAgICAweDU1QTgsIDB4NTVBNSwgMHg1NUFELCAweDU1NzcsIDB4NTY0NSwgMHg1NUEyLCAweDU1OTMsIDB4NTU4OCwgMHg1NThGLAorICAgIDB4NTVCNSwgMHg1NTgxLCAweDU1QTMsIDB4NTU5MiwgMHg1NUE0LCAweDU1N0QsIDB4NTU4QywgMHg1NUE2LCAweDU1N0YsCisgICAgMHg1NTk1LCAweDU1QTEsIDB4NTU4RSwgMHg1NzBDLCAweDU4MjksIDB4NTgzNywgMHg1ODE5LCAweDU4MUUsIDB4NTgyNywKKyAgICAweDU4MjMsIDB4NTgyOCwgMHg1N0Y1LCAweDU4NDgsIDB4NTgyNSwgMHg1ODFDLCAweDU4MUIsIDB4NTgzMywgMHg1ODNGLAorICAgIDB4NTgzNiwgMHg1ODJFLCAweDU4MzksIDB4NTgzOCwgMHg1ODJELCAweDU4MkMsIDB4NTgzQiwgMHg1OTYxLCAweDVBQUYsCisgICAgMHg1QTk0LCAweDVBOUYsIDB4NUE3QSwgMHg1QUEyLCAweDVBOUUsIDB4NUE3OCwgMHg1QUE2LCAweDVBN0MsIDB4NUFBNSwKKyAgICAweDVBQUMsIDB4NUE5NSwgMHg1QUFFLCAweDVBMzcsIDB4NUE4NCwgMHg1QThBLCAweDVBOTcsIDB4NUE4MywgMHg1QThCLAorICAgIDB4NUFBOSwgMHg1QTdCLCAweDVBN0QsIDB4NUE4QywgMHg1QTlDLCAweDVBOEYsIDB4NUE5MywgMHg1QTlELCAweDVCRUEsCisgICAgMHg1QkNELCAweDVCQ0IsIDB4NUJENCwgMHg1QkQxLCAweDVCQ0EsIDB4NUJDRSwgMHg1QzBDLCAweDVDMzAsIDB4NUQzNywKKyAgICAweDVENDMsIDB4NUQ2QiwgMHg1RDQxLCAweDVENEIsIDB4NUQzRiwgMHg1RDM1LCAweDVENTEsIDB4NUQ0RSwgMHg1RDU1LAorICAgIDB4NUQzMywgMHg1RDNBLCAweDVENTIsIDB4NUQzRCwgMHg1RDMxLCAweDVENTksIDB4NUQ0MiwgMHg1RDM5LCAweDVENDksCisgICAgMHg1RDM4LCAweDVEM0MsIDB4NUQzMiwgMHg1RDM2LCAweDVENDAsIDB4NUQ0NSwgMHg1RTQ0LCAweDVFNDEsIDB4NUY1OCwKKyAgICAweDVGQTYsIDB4NUZBNSwgMHg1RkFCLCAweDYwQzksIDB4NjBCOSwgMHg2MENDLCAweDYwRTIsIDB4NjBDRSwgMHg2MEM0LAorICAgIDB4NjExNCwgMHg2MEYyLCAweDYxMEEsIDB4NjExNiwgMHg2MTA1LCAweDYwRjUsIDB4NjExMywgMHg2MEY4LCAweDYwRkMsCisgICAgMHg2MEZFLCAweDYwQzEsIDB4NjEwMywgMHg2MTE4LCAweDYxMUQsIDB4NjExMCwgMHg2MEZGLCAweDYxMDQsIDB4NjEwQiwKKyAgICAweDYyNEEsIDB4NjM5NCwgMHg2M0IxLCAweDYzQjAsIDB4NjNDRSwgMHg2M0U1LCAweDYzRTgsIDB4NjNFRiwgMHg2M0MzLAorICAgIDB4NjQ5RCwgMHg2M0YzLCAweDYzQ0EsIDB4NjNFMCwgMHg2M0Y2LCAweDYzRDUsIDB4NjNGMiwgMHg2M0Y1LCAweDY0NjEsCisgICAgMHg2M0RGLCAweDYzQkUsIDB4NjNERCwgMHg2M0RDLCAweDYzQzQsIDB4NjNEOCwgMHg2M0QzLCAweDYzQzIsIDB4NjNDNywKKyAgICAweDYzQ0MsIDB4NjNDQiwgMHg2M0M4LCAweDYzRjAsIDB4NjNENywgMHg2M0Q5LCAweDY1MzIsIDB4NjU2NywgMHg2NTZBLAorICAgIDB4NjU2NCwgMHg2NTVDLCAweDY1NjgsIDB4NjU2NSwgMHg2NThDLCAweDY1OUQsIDB4NjU5RSwgMHg2NUFFLCAweDY1RDAsCisgICAgMHg2NUQyLCAweDY2N0MsIDB4NjY2QywgMHg2NjdCLCAweDY2ODAsIDB4NjY3MSwgMHg2Njc5LCAweDY2NkEsIDB4NjY3MiwKKyAgICAweDY3MDEsIDB4NjkwQywgMHg2OEQzLCAweDY5MDQsIDB4NjhEQywgMHg2OTJBLCAweDY4RUMsIDB4NjhFQSwgMHg2OEYxLAorICAgIDB4NjkwRiwgMHg2OEQ2LCAweDY4RjcsIDB4NjhFQiwgMHg2OEU0LCAweDY4RjYsIDB4NjkxMywgMHg2OTEwLCAweDY4RjMsCisgICAgMHg2OEUxLCAweDY5MDcsIDB4NjhDQywgMHg2OTA4LCAweDY5NzAsIDB4NjhCNCwgMHg2OTExLCAweDY4RUYsIDB4NjhDNiwKKyAgICAweDY5MTQsIDB4NjhGOCwgMHg2OEQwLCAweDY4RkQsIDB4NjhGQywgMHg2OEU4LCAweDY5MEIsIDB4NjkwQSwgMHg2OTE3LAorICAgIDB4NjhDRSwgMHg2OEM4LCAweDY4REQsIDB4NjhERSwgMHg2OEU2LCAweDY4RjQsIDB4NjhEMSwgMHg2OTA2LCAweDY4RDQsCisgICAgMHg2OEU5LCAweDY5MTUsIDB4NjkyNSwgMHg2OEM3LCAweDZCMzksIDB4NkIzQiwgMHg2QjNGLCAweDZCM0MsIDB4NkI5NCwKKyAgICAweDZCOTcsIDB4NkI5OSwgMHg2Qjk1LCAweDZCQkQsIDB4NkJGMCwgMHg2QkYyLCAweDZCRjMsIDB4NkMzMCwgMHg2REZDLAorICAgIDB4NkU0NiwgMHg2RTQ3LCAweDZFMUYsIDB4NkU0OSwgMHg2RTg4LCAweDZFM0MsIDB4NkUzRCwgMHg2RTQ1LCAweDZFNjIsCisgICAgMHg2RTJCLCAweDZFM0YsIDB4NkU0MSwgMHg2RTVELCAweDZFNzMsIDB4NkUxQywgMHg2RTMzLCAweDZFNEIsIDB4NkU0MCwKKyAgICAweDZFNTEsIDB4NkUzQiwgMHg2RTAzLCAweDZFMkUsIDB4NkU1RSwgMHg2RTY4LCAweDZFNUMsIDB4NkU2MSwgMHg2RTMxLAorICAgIDB4NkUyOCwgMHg2RTYwLCAweDZFNzEsIDB4NkU2QiwgMHg2RTM5LCAweDZFMjIsIDB4NkUzMCwgMHg2RTUzLCAweDZFNjUsCisgICAgMHg2RTI3LCAweDZFNzgsIDB4NkU2NCwgMHg2RTc3LCAweDZFNTUsIDB4NkU3OSwgMHg2RTUyLCAweDZFNjYsIDB4NkUzNSwKKyAgICAweDZFMzYsIDB4NkU1QSwgMHg3MTIwLCAweDcxMUUsIDB4NzEyRiwgMHg3MEZCLCAweDcxMkUsIDB4NzEzMSwgMHg3MTIzLAorICAgIDB4NzEyNSwgMHg3MTIyLCAweDcxMzIsIDB4NzExRiwgMHg3MTI4LCAweDcxM0EsIDB4NzExQiwgMHg3MjRCLCAweDcyNUEsCisgICAgMHg3Mjg4LCAweDcyODksIDB4NzI4NiwgMHg3Mjg1LCAweDcyOEIsIDB4NzMxMiwgMHg3MzBCLCAweDczMzAsIDB4NzMyMiwKKyAgICAweDczMzEsIDB4NzMzMywgMHg3MzI3LCAweDczMzIsIDB4NzMyRCwgMHg3MzI2LCAweDczMjMsIDB4NzMzNSwgMHg3MzBDLAorICAgIDB4NzQyRSwgMHg3NDJDLCAweDc0MzAsIDB4NzQyQiwgMHg3NDE2LCAweDc0MUEsIDB4NzQyMSwgMHg3NDJELCAweDc0MzEsCisgICAgMHg3NDI0LCAweDc0MjMsIDB4NzQxRCwgMHg3NDI5LCAweDc0MjAsIDB4NzQzMiwgMHg3NEZCLCAweDc1MkYsIDB4NzU2RiwKKyAgICAweDc1NkMsIDB4NzVFNywgMHg3NURBLCAweDc1RTEsIDB4NzVFNiwgMHg3NURELCAweDc1REYsIDB4NzVFNCwgMHg3NUQ3LAorICAgIDB4NzY5NSwgMHg3NjkyLCAweDc2REEsIDB4Nzc0NiwgMHg3NzQ3LCAweDc3NDQsIDB4Nzc0RCwgMHg3NzQ1LCAweDc3NEEsCisgICAgMHg3NzRFLCAweDc3NEIsIDB4Nzc0QywgMHg3N0RFLCAweDc3RUMsIDB4Nzg2MCwgMHg3ODY0LCAweDc4NjUsIDB4Nzg1QywKKyAgICAweDc4NkQsIDB4Nzg3MSwgMHg3ODZBLCAweDc4NkUsIDB4Nzg3MCwgMHg3ODY5LCAweDc4NjgsIDB4Nzg1RSwgMHg3ODYyLAorICAgIDB4Nzk3NCwgMHg3OTczLCAweDc5NzIsIDB4Nzk3MCwgMHg3QTAyLCAweDdBMEEsIDB4N0EwMywgMHg3QTBDLCAweDdBMDQsCisgICAgMHg3QTk5LCAweDdBRTYsIDB4N0FFNCwgMHg3QjRBLCAweDdCNDcsIDB4N0I0NCwgMHg3QjQ4LCAweDdCNEMsIDB4N0I0RSwKKyAgICAweDdCNDAsIDB4N0I1OCwgMHg3QjQ1LCAweDdDQTIsIDB4N0M5RSwgMHg3Q0E4LCAweDdDQTEsIDB4N0Q1OCwgMHg3RDZGLAorICAgIDB4N0Q2MywgMHg3RDUzLCAweDdENTYsIDB4N0Q2NywgMHg3RDZBLCAweDdENEYsIDB4N0Q2RCwgMHg3RDVDLCAweDdENkIsCisgICAgMHg3RDUyLCAweDdENTQsIDB4N0Q2OSwgMHg3RDUxLCAweDdENUYsIDB4N0Q0RSwgMHg3RjNFLCAweDdGM0YsIDB4N0Y2NSwKKyAgICAweDdGNjYsIDB4N0ZBMiwgMHg3RkEwLCAweDdGQTEsIDB4N0ZENywgMHg4MDUxLCAweDgwNEYsIDB4ODA1MCwgMHg4MEZFLAorICAgIDB4ODBENCwgMHg4MTQzLCAweDgxNEEsIDB4ODE1MiwgMHg4MTRGLCAweDgxNDcsIDB4ODEzRCwgMHg4MTRELCAweDgxM0EsCisgICAgMHg4MUU2LCAweDgxRUUsIDB4ODFGNywgMHg4MUY4LCAweDgxRjksIDB4ODIwNCwgMHg4MjNDLCAweDgyM0QsIDB4ODIzRiwKKyAgICAweDgyNzUsIDB4ODMzQiwgMHg4M0NGLCAweDgzRjksIDB4ODQyMywgMHg4M0MwLCAweDgzRTgsIDB4ODQxMiwgMHg4M0U3LAorICAgIDB4ODNFNCwgMHg4M0ZDLCAweDgzRjYsIDB4ODQxMCwgMHg4M0M2LCAweDgzQzgsIDB4ODNFQiwgMHg4M0UzLCAweDgzQkYsCisgICAgMHg4NDAxLCAweDgzREQsIDB4ODNFNSwgMHg4M0Q4LCAweDgzRkYsIDB4ODNFMSwgMHg4M0NCLCAweDgzQ0UsIDB4ODNENiwKKyAgICAweDgzRjUsIDB4ODNDOSwgMHg4NDA5LCAweDg0MEYsIDB4ODNERSwgMHg4NDExLCAweDg0MDYsIDB4ODNDMiwgMHg4M0YzLAorICAgIDB4ODNENSwgMHg4M0ZBLCAweDgzQzcsIDB4ODNEMSwgMHg4M0VBLCAweDg0MTMsIDB4ODM5QSwgMHg4M0MzLCAweDgzRUMsCisgICAgMHg4M0VFLCAweDgzQzQsIDB4ODNGQiwgMHg4M0Q3LCAweDgzRTIsIDB4ODQxQiwgMHg4M0RCLCAweDgzRkUsIDB4ODZEOCwKKyAgICAweDg2RTIsIDB4ODZFNiwgMHg4NkQzLCAweDg2RTMsIDB4ODZEQSwgMHg4NkVBLCAweDg2REQsIDB4ODZFQiwgMHg4NkRDLAorICAgIDB4ODZFQywgMHg4NkU5LCAweDg2RDcsIDB4ODZFOCwgMHg4NkQxLCAweDg4NDgsIDB4ODg1NiwgMHg4ODU1LCAweDg4QkEsCisgICAgMHg4OEQ3LCAweDg4QjksIDB4ODhCOCwgMHg4OEMwLCAweDg4QkUsIDB4ODhCNiwgMHg4OEJDLCAweDg4QjcsIDB4ODhCRCwKKyAgICAweDg4QjIsIDB4ODkwMSwgMHg4OEM5LCAweDg5OTUsIDB4ODk5OCwgMHg4OTk3LCAweDg5REQsIDB4ODlEQSwgMHg4OURCLAorICAgIDB4OEE0RSwgMHg4QTRELCAweDhBMzksIDB4OEE1OSwgMHg4QTQwLCAweDhBNTcsIDB4OEE1OCwgMHg4QTQ0LCAweDhBNDUsCisgICAgMHg4QTUyLCAweDhBNDgsIDB4OEE1MSwgMHg4QTRBLCAweDhBNEMsIDB4OEE0RiwgMHg4QzVGLCAweDhDODEsIDB4OEM4MCwKKyAgICAweDhDQkEsIDB4OENCRSwgMHg4Q0IwLCAweDhDQjksIDB4OENCNSwgMHg4RDg0LCAweDhEODAsIDB4OEQ4OSwgMHg4REQ4LAorICAgIDB4OEREMywgMHg4RENELCAweDhEQzcsIDB4OERENiwgMHg4RERDLCAweDhEQ0YsIDB4OERENSwgMHg4REQ5LCAweDhEQzgsCisgICAgMHg4REQ3LCAweDhEQzUsIDB4OEVFRiwgMHg4RUY3LCAweDhFRkEsIDB4OEVGOSwgMHg4RUU2LCAweDhFRUUsIDB4OEVFNSwKKyAgICAweDhFRjUsIDB4OEVFNywgMHg4RUU4LCAweDhFRjYsIDB4OEVFQiwgMHg4RUYxLCAweDhFRUMsIDB4OEVGNCwgMHg4RUU5LAorICAgIDB4OTAyRCwgMHg5MDM0LCAweDkwMkYsIDB4OTEwNiwgMHg5MTJDLCAweDkxMDQsIDB4OTBGRiwgMHg5MEZDLCAweDkxMDgsCisgICAgMHg5MEY5LCAweDkwRkIsIDB4OTEwMSwgMHg5MTAwLCAweDkxMDcsIDB4OTEwNSwgMHg5MTAzLCAweDkxNjEsIDB4OTE2NCwKKyAgICAweDkxNUYsIDB4OTE2MiwgMHg5MTYwLCAweDkyMDEsIDB4OTIwQSwgMHg5MjI1LCAweDkyMDMsIDB4OTIxQSwgMHg5MjI2LAorICAgIDB4OTIwRiwgMHg5MjBDLCAweDkyMDAsIDB4OTIxMiwgMHg5MUZGLCAweDkxRkQsIDB4OTIwNiwgMHg5MjA0LCAweDkyMjcsCisgICAgMHg5MjAyLCAweDkyMUMsIDB4OTIyNCwgMHg5MjE5LCAweDkyMTcsIDB4OTIwNSwgMHg5MjE2LCAweDk1N0IsIDB4OTU4RCwKKyAgICAweDk1OEMsIDB4OTU5MCwgMHg5Njg3LCAweDk2N0UsIDB4OTY4OCwgMHg5Njg5LCAweDk2ODMsIDB4OTY4MCwgMHg5NkMyLAorICAgIDB4OTZDOCwgMHg5NkMzLCAweDk2RjEsIDB4OTZGMCwgMHg5NzZDLCAweDk3NzAsIDB4OTc2RSwgMHg5ODA3LCAweDk4QTksCisgICAgMHg5OEVCLCAweDlDRTYsIDB4OUVGOSwgMHg0RTgzLCAweDRFODQsIDB4NEVCNiwgMHg1MEJELCAweDUwQkYsIDB4NTBDNiwKKyAgICAweDUwQUUsIDB4NTBDNCwgMHg1MENBLCAweDUwQjQsIDB4NTBDOCwgMHg1MEMyLCAweDUwQjAsIDB4NTBDMSwgMHg1MEJBLAorICAgIDB4NTBCMSwgMHg1MENCLCAweDUwQzksIDB4NTBCNiwgMHg1MEI4LCAweDUxRDcsIDB4NTI3QSwgMHg1Mjc4LCAweDUyN0IsCisgICAgMHg1MjdDLCAweDU1QzMsIDB4NTVEQiwgMHg1NUNDLCAweDU1RDAsIDB4NTVDQiwgMHg1NUNBLCAweDU1REQsIDB4NTVDMCwKKyAgICAweDU1RDQsIDB4NTVDNCwgMHg1NUU5LCAweDU1QkYsIDB4NTVEMiwgMHg1NThELCAweDU1Q0YsIDB4NTVENSwgMHg1NUUyLAorICAgIDB4NTVENiwgMHg1NUM4LCAweDU1RjIsIDB4NTVDRCwgMHg1NUQ5LCAweDU1QzIsIDB4NTcxNCwgMHg1ODUzLCAweDU4NjgsCisgICAgMHg1ODY0LCAweDU4NEYsIDB4NTg0RCwgMHg1ODQ5LCAweDU4NkYsIDB4NTg1NSwgMHg1ODRFLCAweDU4NUQsIDB4NTg1OSwKKyAgICAweDU4NjUsIDB4NTg1QiwgMHg1ODNELCAweDU4NjMsIDB4NTg3MSwgMHg1OEZDLCAweDVBQzcsIDB4NUFDNCwgMHg1QUNCLAorICAgIDB4NUFCQSwgMHg1QUI4LCAweDVBQjEsIDB4NUFCNSwgMHg1QUIwLCAweDVBQkYsIDB4NUFDOCwgMHg1QUJCLCAweDVBQzYsCisgICAgMHg1QUI3LCAweDVBQzAsIDB4NUFDQSwgMHg1QUI0LCAweDVBQjYsIDB4NUFDRCwgMHg1QUI5LCAweDVBOTAsIDB4NUJENiwKKyAgICAweDVCRDgsIDB4NUJEOSwgMHg1QzFGLCAweDVDMzMsIDB4NUQ3MSwgMHg1RDYzLCAweDVENEEsIDB4NUQ2NSwgMHg1RDcyLAorICAgIDB4NUQ2QywgMHg1RDVFLCAweDVENjgsIDB4NUQ2NywgMHg1RDYyLCAweDVERjAsIDB4NUU0RiwgMHg1RTRFLCAweDVFNEEsCisgICAgMHg1RTRELCAweDVFNEIsIDB4NUVDNSwgMHg1RUNDLCAweDVFQzYsIDB4NUVDQiwgMHg1RUM3LCAweDVGNDAsIDB4NUZBRiwKKyAgICAweDVGQUQsIDB4NjBGNywgMHg2MTQ5LCAweDYxNEEsIDB4NjEyQiwgMHg2MTQ1LCAweDYxMzYsIDB4NjEzMiwgMHg2MTJFLAorICAgIDB4NjE0NiwgMHg2MTJGLCAweDYxNEYsIDB4NjEyOSwgMHg2MTQwLCAweDYyMjAsIDB4OTE2OCwgMHg2MjIzLCAweDYyMjUsCisgICAgMHg2MjI0LCAweDYzQzUsIDB4NjNGMSwgMHg2M0VCLCAweDY0MTAsIDB4NjQxMiwgMHg2NDA5LCAweDY0MjAsIDB4NjQyNCwKKyAgICAweDY0MzMsIDB4NjQ0MywgMHg2NDFGLCAweDY0MTUsIDB4NjQxOCwgMHg2NDM5LCAweDY0MzcsIDB4NjQyMiwgMHg2NDIzLAorICAgIDB4NjQwQywgMHg2NDI2LCAweDY0MzAsIDB4NjQyOCwgMHg2NDQxLCAweDY0MzUsIDB4NjQyRiwgMHg2NDBBLCAweDY0MUEsCisgICAgMHg2NDQwLCAweDY0MjUsIDB4NjQyNywgMHg2NDBCLCAweDYzRTcsIDB4NjQxQiwgMHg2NDJFLCAweDY0MjEsIDB4NjQwRSwKKyAgICAweDY1NkYsIDB4NjU5MiwgMHg2NUQzLCAweDY2ODYsIDB4NjY4QywgMHg2Njk1LCAweDY2OTAsIDB4NjY4QiwgMHg2NjhBLAorICAgIDB4NjY5OSwgMHg2Njk0LCAweDY2NzgsIDB4NjcyMCwgMHg2OTY2LCAweDY5NUYsIDB4NjkzOCwgMHg2OTRFLCAweDY5NjIsCisgICAgMHg2OTcxLCAweDY5M0YsIDB4Njk0NSwgMHg2OTZBLCAweDY5MzksIDB4Njk0MiwgMHg2OTU3LCAweDY5NTksIDB4Njk3QSwKKyAgICAweDY5NDgsIDB4Njk0OSwgMHg2OTM1LCAweDY5NkMsIDB4NjkzMywgMHg2OTNELCAweDY5NjUsIDB4NjhGMCwgMHg2OTc4LAorICAgIDB4NjkzNCwgMHg2OTY5LCAweDY5NDAsIDB4Njk2RiwgMHg2OTQ0LCAweDY5NzYsIDB4Njk1OCwgMHg2OTQxLCAweDY5NzQsCisgICAgMHg2OTRDLCAweDY5M0IsIDB4Njk0QiwgMHg2OTM3LCAweDY5NUMsIDB4Njk0RiwgMHg2OTUxLCAweDY5MzIsIDB4Njk1MiwKKyAgICAweDY5MkYsIDB4Njk3QiwgMHg2OTNDLCAweDZCNDYsIDB4NkI0NSwgMHg2QjQzLCAweDZCNDIsIDB4NkI0OCwgMHg2QjQxLAorICAgIDB4NkI5QiwgMHg2QkZCLCAweDZCRkMsIDB4NkJGOSwgMHg2QkY3LCAweDZCRjgsIDB4NkU5QiwgMHg2RUQ2LCAweDZFQzgsCisgICAgMHg2RThGLCAweDZFQzAsIDB4NkU5RiwgMHg2RTkzLCAweDZFOTQsIDB4NkVBMCwgMHg2RUIxLCAweDZFQjksIDB4NkVDNiwKKyAgICAweDZFRDIsIDB4NkVCRCwgMHg2RUMxLCAweDZFOUUsIDB4NkVDOSwgMHg2RUI3LCAweDZFQjAsIDB4NkVDRCwgMHg2RUE2LAorICAgIDB4NkVDRiwgMHg2RUIyLCAweDZFQkUsIDB4NkVDMywgMHg2RURDLCAweDZFRDgsIDB4NkU5OSwgMHg2RTkyLCAweDZFOEUsCisgICAgMHg2RThELCAweDZFQTQsIDB4NkVBMSwgMHg2RUJGLCAweDZFQjMsIDB4NkVEMCwgMHg2RUNBLCAweDZFOTcsIDB4NkVBRSwKKyAgICAweDZFQTMsIDB4NzE0NywgMHg3MTU0LCAweDcxNTIsIDB4NzE2MywgMHg3MTYwLCAweDcxNDEsIDB4NzE1RCwgMHg3MTYyLAorICAgIDB4NzE3MiwgMHg3MTc4LCAweDcxNkEsIDB4NzE2MSwgMHg3MTQyLCAweDcxNTgsIDB4NzE0MywgMHg3MTRCLCAweDcxNzAsCisgICAgMHg3MTVGLCAweDcxNTAsIDB4NzE1MywgMHg3MTQ0LCAweDcxNEQsIDB4NzE1QSwgMHg3MjRGLCAweDcyOEQsIDB4NzI4QywKKyAgICAweDcyOTEsIDB4NzI5MCwgMHg3MjhFLCAweDczM0MsIDB4NzM0MiwgMHg3MzNCLCAweDczM0EsIDB4NzM0MCwgMHg3MzRBLAorICAgIDB4NzM0OSwgMHg3NDQ0LCAweDc0NEEsIDB4NzQ0QiwgMHg3NDUyLCAweDc0NTEsIDB4NzQ1NywgMHg3NDQwLCAweDc0NEYsCisgICAgMHg3NDUwLCAweDc0NEUsIDB4NzQ0MiwgMHg3NDQ2LCAweDc0NEQsIDB4NzQ1NCwgMHg3NEUxLCAweDc0RkYsIDB4NzRGRSwKKyAgICAweDc0RkQsIDB4NzUxRCwgMHg3NTc5LCAweDc1NzcsIDB4Njk4MywgMHg3NUVGLCAweDc2MEYsIDB4NzYwMywgMHg3NUY3LAorICAgIDB4NzVGRSwgMHg3NUZDLCAweDc1RjksIDB4NzVGOCwgMHg3NjEwLCAweDc1RkIsIDB4NzVGNiwgMHg3NUVELCAweDc1RjUsCisgICAgMHg3NUZELCAweDc2OTksIDB4NzZCNSwgMHg3NkRELCAweDc3NTUsIDB4Nzc1RiwgMHg3NzYwLCAweDc3NTIsIDB4Nzc1NiwKKyAgICAweDc3NUEsIDB4Nzc2OSwgMHg3NzY3LCAweDc3NTQsIDB4Nzc1OSwgMHg3NzZELCAweDc3RTAsIDB4Nzg4NywgMHg3ODlBLAorICAgIDB4Nzg5NCwgMHg3ODhGLCAweDc4ODQsIDB4Nzg5NSwgMHg3ODg1LCAweDc4ODYsIDB4NzhBMSwgMHg3ODgzLCAweDc4NzksCisgICAgMHg3ODk5LCAweDc4ODAsIDB4Nzg5NiwgMHg3ODdCLCAweDc5N0MsIDB4Nzk4MiwgMHg3OTdELCAweDc5NzksIDB4N0ExMSwKKyAgICAweDdBMTgsIDB4N0ExOSwgMHg3QTEyLCAweDdBMTcsIDB4N0ExNSwgMHg3QTIyLCAweDdBMTMsIDB4N0ExQiwgMHg3QTEwLAorICAgIDB4N0FBMywgMHg3QUEyLCAweDdBOUUsIDB4N0FFQiwgMHg3QjY2LCAweDdCNjQsIDB4N0I2RCwgMHg3Qjc0LCAweDdCNjksCisgICAgMHg3QjcyLCAweDdCNjUsIDB4N0I3MywgMHg3QjcxLCAweDdCNzAsIDB4N0I2MSwgMHg3Qjc4LCAweDdCNzYsIDB4N0I2MywKKyAgICAweDdDQjIsIDB4N0NCNCwgMHg3Q0FGLCAweDdEODgsIDB4N0Q4NiwgMHg3RDgwLCAweDdEOEQsIDB4N0Q3RiwgMHg3RDg1LAorICAgIDB4N0Q3QSwgMHg3RDhFLCAweDdEN0IsIDB4N0Q4MywgMHg3RDdDLCAweDdEOEMsIDB4N0Q5NCwgMHg3RDg0LCAweDdEN0QsCisgICAgMHg3RDkyLCAweDdGNkQsIDB4N0Y2QiwgMHg3RjY3LCAweDdGNjgsIDB4N0Y2QywgMHg3RkE2LCAweDdGQTUsIDB4N0ZBNywKKyAgICAweDdGREIsIDB4N0ZEQywgMHg4MDIxLCAweDgxNjQsIDB4ODE2MCwgMHg4MTc3LCAweDgxNUMsIDB4ODE2OSwgMHg4MTVCLAorICAgIDB4ODE2MiwgMHg4MTcyLCAweDY3MjEsIDB4ODE1RSwgMHg4MTc2LCAweDgxNjcsIDB4ODE2RiwgMHg4MTQ0LCAweDgxNjEsCisgICAgMHg4MjFELCAweDgyNDksIDB4ODI0NCwgMHg4MjQwLCAweDgyNDIsIDB4ODI0NSwgMHg4NEYxLCAweDg0M0YsIDB4ODQ1NiwKKyAgICAweDg0NzYsIDB4ODQ3OSwgMHg4NDhGLCAweDg0OEQsIDB4ODQ2NSwgMHg4NDUxLCAweDg0NDAsIDB4ODQ4NiwgMHg4NDY3LAorICAgIDB4ODQzMCwgMHg4NDRELCAweDg0N0QsIDB4ODQ1QSwgMHg4NDU5LCAweDg0NzQsIDB4ODQ3MywgMHg4NDVELCAweDg1MDcsCisgICAgMHg4NDVFLCAweDg0MzcsIDB4ODQzQSwgMHg4NDM0LCAweDg0N0EsIDB4ODQ0MywgMHg4NDc4LCAweDg0MzIsIDB4ODQ0NSwKKyAgICAweDg0MjksIDB4ODNEOSwgMHg4NDRCLCAweDg0MkYsIDB4ODQ0MiwgMHg4NDJELCAweDg0NUYsIDB4ODQ3MCwgMHg4NDM5LAorICAgIDB4ODQ0RSwgMHg4NDRDLCAweDg0NTIsIDB4ODQ2RiwgMHg4NEM1LCAweDg0OEUsIDB4ODQzQiwgMHg4NDQ3LCAweDg0MzYsCisgICAgMHg4NDMzLCAweDg0NjgsIDB4ODQ3RSwgMHg4NDQ0LCAweDg0MkIsIDB4ODQ2MCwgMHg4NDU0LCAweDg0NkUsIDB4ODQ1MCwKKyAgICAweDg3MEIsIDB4ODcwNCwgMHg4NkY3LCAweDg3MEMsIDB4ODZGQSwgMHg4NkQ2LCAweDg2RjUsIDB4ODc0RCwgMHg4NkY4LAorICAgIDB4ODcwRSwgMHg4NzA5LCAweDg3MDEsIDB4ODZGNiwgMHg4NzBELCAweDg3MDUsIDB4ODhENiwgMHg4OENCLCAweDg4Q0QsCisgICAgMHg4OENFLCAweDg4REUsIDB4ODhEQiwgMHg4OERBLCAweDg4Q0MsIDB4ODhEMCwgMHg4OTg1LCAweDg5OUIsIDB4ODlERiwKKyAgICAweDg5RTUsIDB4ODlFNCwgMHg4OUUxLCAweDg5RTAsIDB4ODlFMiwgMHg4OURDLCAweDg5RTYsIDB4OEE3NiwgMHg4QTg2LAorICAgIDB4OEE3RiwgMHg4QTYxLCAweDhBM0YsIDB4OEE3NywgMHg4QTgyLCAweDhBODQsIDB4OEE3NSwgMHg4QTgzLCAweDhBODEsCisgICAgMHg4QTc0LCAweDhBN0EsIDB4OEMzQywgMHg4QzRCLCAweDhDNEEsIDB4OEM2NSwgMHg4QzY0LCAweDhDNjYsIDB4OEM4NiwKKyAgICAweDhDODQsIDB4OEM4NSwgMHg4Q0NDLCAweDhENjgsIDB4OEQ2OSwgMHg4RDkxLCAweDhEOEMsIDB4OEQ4RSwgMHg4RDhGLAorICAgIDB4OEQ4RCwgMHg4RDkzLCAweDhEOTQsIDB4OEQ5MCwgMHg4RDkyLCAweDhERjAsIDB4OERFMCwgMHg4REVDLCAweDhERjEsCisgICAgMHg4REVFLCAweDhERDAsIDB4OERFOSwgMHg4REUzLCAweDhERTIsIDB4OERFNywgMHg4REYyLCAweDhERUIsIDB4OERGNCwKKyAgICAweDhGMDYsIDB4OEVGRiwgMHg4RjAxLCAweDhGMDAsIDB4OEYwNSwgMHg4RjA3LCAweDhGMDgsIDB4OEYwMiwgMHg4RjBCLAorICAgIDB4OTA1MiwgMHg5MDNGLCAweDkwNDQsIDB4OTA0OSwgMHg5MDNELCAweDkxMTAsIDB4OTEwRCwgMHg5MTBGLCAweDkxMTEsCisgICAgMHg5MTE2LCAweDkxMTQsIDB4OTEwQiwgMHg5MTBFLCAweDkxNkUsIDB4OTE2RiwgMHg5MjQ4LCAweDkyNTIsIDB4OTIzMCwKKyAgICAweDkyM0EsIDB4OTI2NiwgMHg5MjMzLCAweDkyNjUsIDB4OTI1RSwgMHg5MjgzLCAweDkyMkUsIDB4OTI0QSwgMHg5MjQ2LAorICAgIDB4OTI2RCwgMHg5MjZDLCAweDkyNEYsIDB4OTI2MCwgMHg5MjY3LCAweDkyNkYsIDB4OTIzNiwgMHg5MjYxLCAweDkyNzAsCisgICAgMHg5MjMxLCAweDkyNTQsIDB4OTI2MywgMHg5MjUwLCAweDkyNzIsIDB4OTI0RSwgMHg5MjUzLCAweDkyNEMsIDB4OTI1NiwKKyAgICAweDkyMzIsIDB4OTU5RiwgMHg5NTlDLCAweDk1OUUsIDB4OTU5QiwgMHg5NjkyLCAweDk2OTMsIDB4OTY5MSwgMHg5Njk3LAorICAgIDB4OTZDRSwgMHg5NkZBLCAweDk2RkQsIDB4OTZGOCwgMHg5NkY1LCAweDk3NzMsIDB4OTc3NywgMHg5Nzc4LCAweDk3NzIsCisgICAgMHg5ODBGLCAweDk4MEQsIDB4OTgwRSwgMHg5OEFDLCAweDk4RjYsIDB4OThGOSwgMHg5OUFGLCAweDk5QjIsIDB4OTlCMCwKKyAgICAweDk5QjUsIDB4OUFBRCwgMHg5QUFCLCAweDlCNUIsIDB4OUNFQSwgMHg5Q0VELCAweDlDRTcsIDB4OUU4MCwgMHg5RUZELAorICAgIDB4NTBFNiwgMHg1MEQ0LCAweDUwRDcsIDB4NTBFOCwgMHg1MEYzLCAweDUwREIsIDB4NTBFQSwgMHg1MERELCAweDUwRTQsCisgICAgMHg1MEQzLCAweDUwRUMsIDB4NTBGMCwgMHg1MEVGLCAweDUwRTMsIDB4NTBFMCwgMHg1MUQ4LCAweDUyODAsIDB4NTI4MSwKKyAgICAweDUyRTksIDB4NTJFQiwgMHg1MzMwLCAweDUzQUMsIDB4NTYyNywgMHg1NjE1LCAweDU2MEMsIDB4NTYxMiwgMHg1NUZDLAorICAgIDB4NTYwRiwgMHg1NjFDLCAweDU2MDEsIDB4NTYxMywgMHg1NjAyLCAweDU1RkEsIDB4NTYxRCwgMHg1NjA0LCAweDU1RkYsCisgICAgMHg1NUY5LCAweDU4ODksIDB4NTg3QywgMHg1ODkwLCAweDU4OTgsIDB4NTg4NiwgMHg1ODgxLCAweDU4N0YsIDB4NTg3NCwKKyAgICAweDU4OEIsIDB4NTg3QSwgMHg1ODg3LCAweDU4OTEsIDB4NTg4RSwgMHg1ODc2LCAweDU4ODIsIDB4NTg4OCwgMHg1ODdCLAorICAgIDB4NTg5NCwgMHg1ODhGLCAweDU4RkUsIDB4NTk2QiwgMHg1QURDLCAweDVBRUUsIDB4NUFFNSwgMHg1QUQ1LCAweDVBRUEsCisgICAgMHg1QURBLCAweDVBRUQsIDB4NUFFQiwgMHg1QUYzLCAweDVBRTIsIDB4NUFFMCwgMHg1QURCLCAweDVBRUMsIDB4NUFERSwKKyAgICAweDVBREQsIDB4NUFEOSwgMHg1QUU4LCAweDVBREYsIDB4NUI3NywgMHg1QkUwLCAweDVCRTMsIDB4NUM2MywgMHg1RDgyLAorICAgIDB4NUQ4MCwgMHg1RDdELCAweDVEODYsIDB4NUQ3QSwgMHg1RDgxLCAweDVENzcsIDB4NUQ4QSwgMHg1RDg5LCAweDVEODgsCisgICAgMHg1RDdFLCAweDVEN0MsIDB4NUQ4RCwgMHg1RDc5LCAweDVEN0YsIDB4NUU1OCwgMHg1RTU5LCAweDVFNTMsIDB4NUVEOCwKKyAgICAweDVFRDEsIDB4NUVENywgMHg1RUNFLCAweDVFREMsIDB4NUVENSwgMHg1RUQ5LCAweDVFRDIsIDB4NUVENCwgMHg1RjQ0LAorICAgIDB4NUY0MywgMHg1RjZGLCAweDVGQjYsIDB4NjEyQywgMHg2MTI4LCAweDYxNDEsIDB4NjE1RSwgMHg2MTcxLCAweDYxNzMsCisgICAgMHg2MTUyLCAweDYxNTMsIDB4NjE3MiwgMHg2MTZDLCAweDYxODAsIDB4NjE3NCwgMHg2MTU0LCAweDYxN0EsIDB4NjE1QiwKKyAgICAweDYxNjUsIDB4NjEzQiwgMHg2MTZBLCAweDYxNjEsIDB4NjE1NiwgMHg2MjI5LCAweDYyMjcsIDB4NjIyQiwgMHg2NDJCLAorICAgIDB4NjQ0RCwgMHg2NDVCLCAweDY0NUQsIDB4NjQ3NCwgMHg2NDc2LCAweDY0NzIsIDB4NjQ3MywgMHg2NDdELCAweDY0NzUsCisgICAgMHg2NDY2LCAweDY0QTYsIDB4NjQ0RSwgMHg2NDgyLCAweDY0NUUsIDB4NjQ1QywgMHg2NDRCLCAweDY0NTMsIDB4NjQ2MCwKKyAgICAweDY0NTAsIDB4NjQ3RiwgMHg2NDNGLCAweDY0NkMsIDB4NjQ2QiwgMHg2NDU5LCAweDY0NjUsIDB4NjQ3NywgMHg2NTczLAorICAgIDB4NjVBMCwgMHg2NkExLCAweDY2QTAsIDB4NjY5RiwgMHg2NzA1LCAweDY3MDQsIDB4NjcyMiwgMHg2OUIxLCAweDY5QjYsCisgICAgMHg2OUM5LCAweDY5QTAsIDB4NjlDRSwgMHg2OTk2LCAweDY5QjAsIDB4NjlBQywgMHg2OUJDLCAweDY5OTEsIDB4Njk5OSwKKyAgICAweDY5OEUsIDB4NjlBNywgMHg2OThELCAweDY5QTksIDB4NjlCRSwgMHg2OUFGLCAweDY5QkYsIDB4NjlDNCwgMHg2OUJELAorICAgIDB4NjlBNCwgMHg2OUQ0LCAweDY5QjksIDB4NjlDQSwgMHg2OTlBLCAweDY5Q0YsIDB4NjlCMywgMHg2OTkzLCAweDY5QUEsCisgICAgMHg2OUExLCAweDY5OUUsIDB4NjlEOSwgMHg2OTk3LCAweDY5OTAsIDB4NjlDMiwgMHg2OUI1LCAweDY5QTUsIDB4NjlDNiwKKyAgICAweDZCNEEsIDB4NkI0RCwgMHg2QjRCLCAweDZCOUUsIDB4NkI5RiwgMHg2QkEwLCAweDZCQzMsIDB4NkJDNCwgMHg2QkZFLAorICAgIDB4NkVDRSwgMHg2RUY1LCAweDZFRjEsIDB4NkYwMywgMHg2RjI1LCAweDZFRjgsIDB4NkYzNywgMHg2RUZCLCAweDZGMkUsCisgICAgMHg2RjA5LCAweDZGNEUsIDB4NkYxOSwgMHg2RjFBLCAweDZGMjcsIDB4NkYxOCwgMHg2RjNCLCAweDZGMTIsIDB4NkVFRCwKKyAgICAweDZGMEEsIDB4NkYzNiwgMHg2RjczLCAweDZFRjksIDB4NkVFRSwgMHg2RjJELCAweDZGNDAsIDB4NkYzMCwgMHg2RjNDLAorICAgIDB4NkYzNSwgMHg2RUVCLCAweDZGMDcsIDB4NkYwRSwgMHg2RjQzLCAweDZGMDUsIDB4NkVGRCwgMHg2RUY2LCAweDZGMzksCisgICAgMHg2RjFDLCAweDZFRkMsIDB4NkYzQSwgMHg2RjFGLCAweDZGMEQsIDB4NkYxRSwgMHg2RjA4LCAweDZGMjEsIDB4NzE4NywKKyAgICAweDcxOTAsIDB4NzE4OSwgMHg3MTgwLCAweDcxODUsIDB4NzE4MiwgMHg3MThGLCAweDcxN0IsIDB4NzE4NiwgMHg3MTgxLAorICAgIDB4NzE5NywgMHg3MjQ0LCAweDcyNTMsIDB4NzI5NywgMHg3Mjk1LCAweDcyOTMsIDB4NzM0MywgMHg3MzRELCAweDczNTEsCisgICAgMHg3MzRDLCAweDc0NjIsIDB4NzQ3MywgMHg3NDcxLCAweDc0NzUsIDB4NzQ3MiwgMHg3NDY3LCAweDc0NkUsIDB4NzUwMCwKKyAgICAweDc1MDIsIDB4NzUwMywgMHg3NTdELCAweDc1OTAsIDB4NzYxNiwgMHg3NjA4LCAweDc2MEMsIDB4NzYxNSwgMHg3NjExLAorICAgIDB4NzYwQSwgMHg3NjE0LCAweDc2QjgsIDB4Nzc4MSwgMHg3NzdDLCAweDc3ODUsIDB4Nzc4MiwgMHg3NzZFLCAweDc3ODAsCisgICAgMHg3NzZGLCAweDc3N0UsIDB4Nzc4MywgMHg3OEIyLCAweDc4QUEsIDB4NzhCNCwgMHg3OEFELCAweDc4QTgsIDB4Nzg3RSwKKyAgICAweDc4QUIsIDB4Nzg5RSwgMHg3OEE1LCAweDc4QTAsIDB4NzhBQywgMHg3OEEyLCAweDc4QTQsIDB4Nzk5OCwgMHg3OThBLAorICAgIDB4Nzk4QiwgMHg3OTk2LCAweDc5OTUsIDB4Nzk5NCwgMHg3OTkzLCAweDc5OTcsIDB4Nzk4OCwgMHg3OTkyLCAweDc5OTAsCisgICAgMHg3QTJCLCAweDdBNEEsIDB4N0EzMCwgMHg3QTJGLCAweDdBMjgsIDB4N0EyNiwgMHg3QUE4LCAweDdBQUIsIDB4N0FBQywKKyAgICAweDdBRUUsIDB4N0I4OCwgMHg3QjlDLCAweDdCOEEsIDB4N0I5MSwgMHg3QjkwLCAweDdCOTYsIDB4N0I4RCwgMHg3QjhDLAorICAgIDB4N0I5QiwgMHg3QjhFLCAweDdCODUsIDB4N0I5OCwgMHg1Mjg0LCAweDdCOTksIDB4N0JBNCwgMHg3QjgyLCAweDdDQkIsCisgICAgMHg3Q0JGLCAweDdDQkMsIDB4N0NCQSwgMHg3REE3LCAweDdEQjcsIDB4N0RDMiwgMHg3REEzLCAweDdEQUEsIDB4N0RDMSwKKyAgICAweDdEQzAsIDB4N0RDNSwgMHg3RDlELCAweDdEQ0UsIDB4N0RDNCwgMHg3REM2LCAweDdEQ0IsIDB4N0RDQywgMHg3REFGLAorICAgIDB4N0RCOSwgMHg3RDk2LCAweDdEQkMsIDB4N0Q5RiwgMHg3REE2LCAweDdEQUUsIDB4N0RBOSwgMHg3REExLCAweDdEQzksCisgICAgMHg3RjczLCAweDdGRTIsIDB4N0ZFMywgMHg3RkU1LCAweDdGREUsIDB4ODAyNCwgMHg4MDVELCAweDgwNUMsIDB4ODE4OSwKKyAgICAweDgxODYsIDB4ODE4MywgMHg4MTg3LCAweDgxOEQsIDB4ODE4QywgMHg4MThCLCAweDgyMTUsIDB4ODQ5NywgMHg4NEE0LAorICAgIDB4ODRBMSwgMHg4NDlGLCAweDg0QkEsIDB4ODRDRSwgMHg4NEMyLCAweDg0QUMsIDB4ODRBRSwgMHg4NEFCLCAweDg0QjksCisgICAgMHg4NEI0LCAweDg0QzEsIDB4ODRDRCwgMHg4NEFBLCAweDg0OUEsIDB4ODRCMSwgMHg4NEQwLCAweDg0OUQsIDB4ODRBNywKKyAgICAweDg0QkIsIDB4ODRBMiwgMHg4NDk0LCAweDg0QzcsIDB4ODRDQywgMHg4NDlCLCAweDg0QTksIDB4ODRBRiwgMHg4NEE4LAorICAgIDB4ODRENiwgMHg4NDk4LCAweDg0QjYsIDB4ODRDRiwgMHg4NEEwLCAweDg0RDcsIDB4ODRENCwgMHg4NEQyLCAweDg0REIsCisgICAgMHg4NEIwLCAweDg0OTEsIDB4ODY2MSwgMHg4NzMzLCAweDg3MjMsIDB4ODcyOCwgMHg4NzZCLCAweDg3NDAsIDB4ODcyRSwKKyAgICAweDg3MUUsIDB4ODcyMSwgMHg4NzE5LCAweDg3MUIsIDB4ODc0MywgMHg4NzJDLCAweDg3NDEsIDB4ODczRSwgMHg4NzQ2LAorICAgIDB4ODcyMCwgMHg4NzMyLCAweDg3MkEsIDB4ODcyRCwgMHg4NzNDLCAweDg3MTIsIDB4ODczQSwgMHg4NzMxLCAweDg3MzUsCisgICAgMHg4NzQyLCAweDg3MjYsIDB4ODcyNywgMHg4NzM4LCAweDg3MjQsIDB4ODcxQSwgMHg4NzMwLCAweDg3MTEsIDB4ODhGNywKKyAgICAweDg4RTcsIDB4ODhGMSwgMHg4OEYyLCAweDg4RkEsIDB4ODhGRSwgMHg4OEVFLCAweDg4RkMsIDB4ODhGNiwgMHg4OEZCLAorICAgIDB4ODhGMCwgMHg4OEVDLCAweDg4RUIsIDB4ODk5RCwgMHg4OUExLCAweDg5OUYsIDB4ODk5RSwgMHg4OUU5LCAweDg5RUIsCisgICAgMHg4OUU4LCAweDhBQUIsIDB4OEE5OSwgMHg4QThCLCAweDhBOTIsIDB4OEE4RiwgMHg4QTk2LCAweDhDM0QsIDB4OEM2OCwKKyAgICAweDhDNjksIDB4OENENSwgMHg4Q0NGLCAweDhDRDcsIDB4OEQ5NiwgMHg4RTA5LCAweDhFMDIsIDB4OERGRiwgMHg4RTBELAorICAgIDB4OERGRCwgMHg4RTBBLCAweDhFMDMsIDB4OEUwNywgMHg4RTA2LCAweDhFMDUsIDB4OERGRSwgMHg4RTAwLCAweDhFMDQsCisgICAgMHg4RjEwLCAweDhGMTEsIDB4OEYwRSwgMHg4RjBELCAweDkxMjMsIDB4OTExQywgMHg5MTIwLCAweDkxMjIsIDB4OTExRiwKKyAgICAweDkxMUQsIDB4OTExQSwgMHg5MTI0LCAweDkxMjEsIDB4OTExQiwgMHg5MTdBLCAweDkxNzIsIDB4OTE3OSwgMHg5MTczLAorICAgIDB4OTJBNSwgMHg5MkE0LCAweDkyNzYsIDB4OTI5QiwgMHg5MjdBLCAweDkyQTAsIDB4OTI5NCwgMHg5MkFBLCAweDkyOEQsCisgICAgMHg5MkE2LCAweDkyOUEsIDB4OTJBQiwgMHg5Mjc5LCAweDkyOTcsIDB4OTI3RiwgMHg5MkEzLCAweDkyRUUsIDB4OTI4RSwKKyAgICAweDkyODIsIDB4OTI5NSwgMHg5MkEyLCAweDkyN0QsIDB4OTI4OCwgMHg5MkExLCAweDkyOEEsIDB4OTI4NiwgMHg5MjhDLAorICAgIDB4OTI5OSwgMHg5MkE3LCAweDkyN0UsIDB4OTI4NywgMHg5MkE5LCAweDkyOUQsIDB4OTI4QiwgMHg5MjJELCAweDk2OUUsCisgICAgMHg5NkExLCAweDk2RkYsIDB4OTc1OCwgMHg5NzdELCAweDk3N0EsIDB4OTc3RSwgMHg5NzgzLCAweDk3ODAsIDB4OTc4MiwKKyAgICAweDk3N0IsIDB4OTc4NCwgMHg5NzgxLCAweDk3N0YsIDB4OTdDRSwgMHg5N0NELCAweDk4MTYsIDB4OThBRCwgMHg5OEFFLAorICAgIDB4OTkwMiwgMHg5OTAwLCAweDk5MDcsIDB4OTk5RCwgMHg5OTlDLCAweDk5QzMsIDB4OTlCOSwgMHg5OUJCLCAweDk5QkEsCisgICAgMHg5OUMyLCAweDk5QkQsIDB4OTlDNywgMHg5QUIxLCAweDlBRTMsIDB4OUFFNywgMHg5QjNFLCAweDlCM0YsIDB4OUI2MCwKKyAgICAweDlCNjEsIDB4OUI1RiwgMHg5Q0YxLCAweDlDRjIsIDB4OUNGNSwgMHg5RUE3LCAweDUwRkYsIDB4NTEwMywgMHg1MTMwLAorICAgIDB4NTBGOCwgMHg1MTA2LCAweDUxMDcsIDB4NTBGNiwgMHg1MEZFLCAweDUxMEIsIDB4NTEwQywgMHg1MEZELCAweDUxMEEsCisgICAgMHg1MjhCLCAweDUyOEMsIDB4NTJGMSwgMHg1MkVGLCAweDU2NDgsIDB4NTY0MiwgMHg1NjRDLCAweDU2MzUsIDB4NTY0MSwKKyAgICAweDU2NEEsIDB4NTY0OSwgMHg1NjQ2LCAweDU2NTgsIDB4NTY1QSwgMHg1NjQwLCAweDU2MzMsIDB4NTYzRCwgMHg1NjJDLAorICAgIDB4NTYzRSwgMHg1NjM4LCAweDU2MkEsIDB4NTYzQSwgMHg1NzFBLCAweDU4QUIsIDB4NTg5RCwgMHg1OEIxLCAweDU4QTAsCisgICAgMHg1OEEzLCAweDU4QUYsIDB4NThBQywgMHg1OEE1LCAweDU4QTEsIDB4NThGRiwgMHg1QUZGLCAweDVBRjQsIDB4NUFGRCwKKyAgICAweDVBRjcsIDB4NUFGNiwgMHg1QjAzLCAweDVBRjgsIDB4NUIwMiwgMHg1QUY5LCAweDVCMDEsIDB4NUIwNywgMHg1QjA1LAorICAgIDB4NUIwRiwgMHg1QzY3LCAweDVEOTksIDB4NUQ5NywgMHg1RDlGLCAweDVEOTIsIDB4NURBMiwgMHg1RDkzLCAweDVEOTUsCisgICAgMHg1REEwLCAweDVEOUMsIDB4NURBMSwgMHg1RDlBLCAweDVEOUUsIDB4NUU2OSwgMHg1RTVELCAweDVFNjAsIDB4NUU1QywKKyAgICAweDdERjMsIDB4NUVEQiwgMHg1RURFLCAweDVFRTEsIDB4NUY0OSwgMHg1RkIyLCAweDYxOEIsIDB4NjE4MywgMHg2MTc5LAorICAgIDB4NjFCMSwgMHg2MUIwLCAweDYxQTIsIDB4NjE4OSwgMHg2MTlCLCAweDYxOTMsIDB4NjFBRiwgMHg2MUFELCAweDYxOUYsCisgICAgMHg2MTkyLCAweDYxQUEsIDB4NjFBMSwgMHg2MThELCAweDYxNjYsIDB4NjFCMywgMHg2MjJELCAweDY0NkUsIDB4NjQ3MCwKKyAgICAweDY0OTYsIDB4NjRBMCwgMHg2NDg1LCAweDY0OTcsIDB4NjQ5QywgMHg2NDhGLCAweDY0OEIsIDB4NjQ4QSwgMHg2NDhDLAorICAgIDB4NjRBMywgMHg2NDlGLCAweDY0NjgsIDB4NjRCMSwgMHg2NDk4LCAweDY1NzYsIDB4NjU3QSwgMHg2NTc5LCAweDY1N0IsCisgICAgMHg2NUIyLCAweDY1QjMsIDB4NjZCNSwgMHg2NkIwLCAweDY2QTksIDB4NjZCMiwgMHg2NkI3LCAweDY2QUEsIDB4NjZBRiwKKyAgICAweDZBMDAsIDB4NkEwNiwgMHg2QTE3LCAweDY5RTUsIDB4NjlGOCwgMHg2QTE1LCAweDY5RjEsIDB4NjlFNCwgMHg2QTIwLAorICAgIDB4NjlGRiwgMHg2OUVDLCAweDY5RTIsIDB4NkExQiwgMHg2QTFELCAweDY5RkUsIDB4NkEyNywgMHg2OUYyLCAweDY5RUUsCisgICAgMHg2QTE0LCAweDY5RjcsIDB4NjlFNywgMHg2QTQwLCAweDZBMDgsIDB4NjlFNiwgMHg2OUZCLCAweDZBMEQsIDB4NjlGQywKKyAgICAweDY5RUIsIDB4NkEwOSwgMHg2QTA0LCAweDZBMTgsIDB4NkEyNSwgMHg2QTBGLCAweDY5RjYsIDB4NkEyNiwgMHg2QTA3LAorICAgIDB4NjlGNCwgMHg2QTE2LCAweDZCNTEsIDB4NkJBNSwgMHg2QkEzLCAweDZCQTIsIDB4NkJBNiwgMHg2QzAxLCAweDZDMDAsCisgICAgMHg2QkZGLCAweDZDMDIsIDB4NkY0MSwgMHg2RjI2LCAweDZGN0UsIDB4NkY4NywgMHg2RkM2LCAweDZGOTIsIDB4NkY4RCwKKyAgICAweDZGODksIDB4NkY4QywgMHg2RjYyLCAweDZGNEYsIDB4NkY4NSwgMHg2RjVBLCAweDZGOTYsIDB4NkY3NiwgMHg2RjZDLAorICAgIDB4NkY4MiwgMHg2RjU1LCAweDZGNzIsIDB4NkY1MiwgMHg2RjUwLCAweDZGNTcsIDB4NkY5NCwgMHg2RjkzLCAweDZGNUQsCisgICAgMHg2RjAwLCAweDZGNjEsIDB4NkY2QiwgMHg2RjdELCAweDZGNjcsIDB4NkY5MCwgMHg2RjUzLCAweDZGOEIsIDB4NkY2OSwKKyAgICAweDZGN0YsIDB4NkY5NSwgMHg2RjYzLCAweDZGNzcsIDB4NkY2QSwgMHg2RjdCLCAweDcxQjIsIDB4NzFBRiwgMHg3MTlCLAorICAgIDB4NzFCMCwgMHg3MUEwLCAweDcxOUEsIDB4NzFBOSwgMHg3MUI1LCAweDcxOUQsIDB4NzFBNSwgMHg3MTlFLCAweDcxQTQsCisgICAgMHg3MUExLCAweDcxQUEsIDB4NzE5QywgMHg3MUE3LCAweDcxQjMsIDB4NzI5OCwgMHg3MjlBLCAweDczNTgsIDB4NzM1MiwKKyAgICAweDczNUUsIDB4NzM1RiwgMHg3MzYwLCAweDczNUQsIDB4NzM1QiwgMHg3MzYxLCAweDczNUEsIDB4NzM1OSwgMHg3MzYyLAorICAgIDB4NzQ4NywgMHg3NDg5LCAweDc0OEEsIDB4NzQ4NiwgMHg3NDgxLCAweDc0N0QsIDB4NzQ4NSwgMHg3NDg4LCAweDc0N0MsCisgICAgMHg3NDc5LCAweDc1MDgsIDB4NzUwNywgMHg3NTdFLCAweDc2MjUsIDB4NzYxRSwgMHg3NjE5LCAweDc2MUQsIDB4NzYxQywKKyAgICAweDc2MjMsIDB4NzYxQSwgMHg3NjI4LCAweDc2MUIsIDB4NzY5QywgMHg3NjlELCAweDc2OUUsIDB4NzY5QiwgMHg3NzhELAorICAgIDB4Nzc4RiwgMHg3Nzg5LCAweDc3ODgsIDB4NzhDRCwgMHg3OEJCLCAweDc4Q0YsIDB4NzhDQywgMHg3OEQxLCAweDc4Q0UsCisgICAgMHg3OEQ0LCAweDc4QzgsIDB4NzhDMywgMHg3OEM0LCAweDc4QzksIDB4Nzk5QSwgMHg3OUExLCAweDc5QTAsIDB4Nzk5QywKKyAgICAweDc5QTIsIDB4Nzk5QiwgMHg2Qjc2LCAweDdBMzksIDB4N0FCMiwgMHg3QUI0LCAweDdBQjMsIDB4N0JCNywgMHg3QkNCLAorICAgIDB4N0JCRSwgMHg3QkFDLCAweDdCQ0UsIDB4N0JBRiwgMHg3QkI5LCAweDdCQ0EsIDB4N0JCNSwgMHg3Q0M1LCAweDdDQzgsCisgICAgMHg3Q0NDLCAweDdDQ0IsIDB4N0RGNywgMHg3RERCLCAweDdERUEsIDB4N0RFNywgMHg3REQ3LCAweDdERTEsIDB4N0UwMywKKyAgICAweDdERkEsIDB4N0RFNiwgMHg3REY2LCAweDdERjEsIDB4N0RGMCwgMHg3REVFLCAweDdEREYsIDB4N0Y3NiwgMHg3RkFDLAorICAgIDB4N0ZCMCwgMHg3RkFELCAweDdGRUQsIDB4N0ZFQiwgMHg3RkVBLCAweDdGRUMsIDB4N0ZFNiwgMHg3RkU4LCAweDgwNjQsCisgICAgMHg4MDY3LCAweDgxQTMsIDB4ODE5RiwgMHg4MTlFLCAweDgxOTUsIDB4ODFBMiwgMHg4MTk5LCAweDgxOTcsIDB4ODIxNiwKKyAgICAweDgyNEYsIDB4ODI1MywgMHg4MjUyLCAweDgyNTAsIDB4ODI0RSwgMHg4MjUxLCAweDg1MjQsIDB4ODUzQiwgMHg4NTBGLAorICAgIDB4ODUwMCwgMHg4NTI5LCAweDg1MEUsIDB4ODUwOSwgMHg4NTBELCAweDg1MUYsIDB4ODUwQSwgMHg4NTI3LCAweDg1MUMsCisgICAgMHg4NEZCLCAweDg1MkIsIDB4ODRGQSwgMHg4NTA4LCAweDg1MEMsIDB4ODRGNCwgMHg4NTJBLCAweDg0RjIsIDB4ODUxNSwKKyAgICAweDg0RjcsIDB4ODRFQiwgMHg4NEYzLCAweDg0RkMsIDB4ODUxMiwgMHg4NEVBLCAweDg0RTksIDB4ODUxNiwgMHg4NEZFLAorICAgIDB4ODUyOCwgMHg4NTFELCAweDg1MkUsIDB4ODUwMiwgMHg4NEZELCAweDg1MUUsIDB4ODRGNiwgMHg4NTMxLCAweDg1MjYsCisgICAgMHg4NEU3LCAweDg0RTgsIDB4ODRGMCwgMHg4NEVGLCAweDg0RjksIDB4ODUxOCwgMHg4NTIwLCAweDg1MzAsIDB4ODUwQiwKKyAgICAweDg1MTksIDB4ODUyRiwgMHg4NjYyLCAweDg3NTYsIDB4ODc2MywgMHg4NzY0LCAweDg3NzcsIDB4ODdFMSwgMHg4NzczLAorICAgIDB4ODc1OCwgMHg4NzU0LCAweDg3NUIsIDB4ODc1MiwgMHg4NzYxLCAweDg3NUEsIDB4ODc1MSwgMHg4NzVFLCAweDg3NkQsCisgICAgMHg4NzZBLCAweDg3NTAsIDB4ODc0RSwgMHg4NzVGLCAweDg3NUQsIDB4ODc2RiwgMHg4NzZDLCAweDg3N0EsIDB4ODc2RSwKKyAgICAweDg3NUMsIDB4ODc2NSwgMHg4NzRGLCAweDg3N0IsIDB4ODc3NSwgMHg4NzYyLCAweDg3NjcsIDB4ODc2OSwgMHg4ODVBLAorICAgIDB4ODkwNSwgMHg4OTBDLCAweDg5MTQsIDB4ODkwQiwgMHg4OTE3LCAweDg5MTgsIDB4ODkxOSwgMHg4OTA2LCAweDg5MTYsCisgICAgMHg4OTExLCAweDg5MEUsIDB4ODkwOSwgMHg4OUEyLCAweDg5QTQsIDB4ODlBMywgMHg4OUVELCAweDg5RjAsIDB4ODlFQywKKyAgICAweDhBQ0YsIDB4OEFDNiwgMHg4QUI4LCAweDhBRDMsIDB4OEFEMSwgMHg4QUQ0LCAweDhBRDUsIDB4OEFCQiwgMHg4QUQ3LAorICAgIDB4OEFCRSwgMHg4QUMwLCAweDhBQzUsIDB4OEFEOCwgMHg4QUMzLCAweDhBQkEsIDB4OEFCRCwgMHg4QUQ5LCAweDhDM0UsCisgICAgMHg4QzRELCAweDhDOEYsIDB4OENFNSwgMHg4Q0RGLCAweDhDRDksIDB4OENFOCwgMHg4Q0RBLCAweDhDREQsIDB4OENFNywKKyAgICAweDhEQTAsIDB4OEQ5QywgMHg4REExLCAweDhEOUIsIDB4OEUyMCwgMHg4RTIzLCAweDhFMjUsIDB4OEUyNCwgMHg4RTJFLAorICAgIDB4OEUxNSwgMHg4RTFCLCAweDhFMTYsIDB4OEUxMSwgMHg4RTE5LCAweDhFMjYsIDB4OEUyNywgMHg4RTE0LCAweDhFMTIsCisgICAgMHg4RTE4LCAweDhFMTMsIDB4OEUxQywgMHg4RTE3LCAweDhFMUEsIDB4OEYyQywgMHg4RjI0LCAweDhGMTgsIDB4OEYxQSwKKyAgICAweDhGMjAsIDB4OEYyMywgMHg4RjE2LCAweDhGMTcsIDB4OTA3MywgMHg5MDcwLCAweDkwNkYsIDB4OTA2NywgMHg5MDZCLAorICAgIDB4OTEyRiwgMHg5MTJCLCAweDkxMjksIDB4OTEyQSwgMHg5MTMyLCAweDkxMjYsIDB4OTEyRSwgMHg5MTg1LCAweDkxODYsCisgICAgMHg5MThBLCAweDkxODEsIDB4OTE4MiwgMHg5MTg0LCAweDkxODAsIDB4OTJEMCwgMHg5MkMzLCAweDkyQzQsIDB4OTJDMCwKKyAgICAweDkyRDksIDB4OTJCNiwgMHg5MkNGLCAweDkyRjEsIDB4OTJERiwgMHg5MkQ4LCAweDkyRTksIDB4OTJENywgMHg5MkRELAorICAgIDB4OTJDQywgMHg5MkVGLCAweDkyQzIsIDB4OTJFOCwgMHg5MkNBLCAweDkyQzgsIDB4OTJDRSwgMHg5MkU2LCAweDkyQ0QsCisgICAgMHg5MkQ1LCAweDkyQzksIDB4OTJFMCwgMHg5MkRFLCAweDkyRTcsIDB4OTJEMSwgMHg5MkQzLCAweDkyQjUsIDB4OTJFMSwKKyAgICAweDkzMjUsIDB4OTJDNiwgMHg5MkI0LCAweDk1N0MsIDB4OTVBQywgMHg5NUFCLCAweDk1QUUsIDB4OTVCMCwgMHg5NkE0LAorICAgIDB4OTZBMiwgMHg5NkQzLCAweDk3MDUsIDB4OTcwOCwgMHg5NzAyLCAweDk3NUEsIDB4OTc4QSwgMHg5NzhFLCAweDk3ODgsCisgICAgMHg5N0QwLCAweDk3Q0YsIDB4OTgxRSwgMHg5ODFELCAweDk4MjYsIDB4OTgyOSwgMHg5ODI4LCAweDk4MjAsIDB4OTgxQiwKKyAgICAweDk4MjcsIDB4OThCMiwgMHg5OTA4LCAweDk4RkEsIDB4OTkxMSwgMHg5OTE0LCAweDk5MTYsIDB4OTkxNywgMHg5OTE1LAorICAgIDB4OTlEQywgMHg5OUNELCAweDk5Q0YsIDB4OTlEMywgMHg5OUQ0LCAweDk5Q0UsIDB4OTlDOSwgMHg5OUQ2LCAweDk5RDgsCisgICAgMHg5OUNCLCAweDk5RDcsIDB4OTlDQywgMHg5QUIzLCAweDlBRUMsIDB4OUFFQiwgMHg5QUYzLCAweDlBRjIsIDB4OUFGMSwKKyAgICAweDlCNDYsIDB4OUI0MywgMHg5QjY3LCAweDlCNzQsIDB4OUI3MSwgMHg5QjY2LCAweDlCNzYsIDB4OUI3NSwgMHg5QjcwLAorICAgIDB4OUI2OCwgMHg5QjY0LCAweDlCNkMsIDB4OUNGQywgMHg5Q0ZBLCAweDlDRkQsIDB4OUNGRiwgMHg5Q0Y3LCAweDlEMDcsCisgICAgMHg5RDAwLCAweDlDRjksIDB4OUNGQiwgMHg5RDA4LCAweDlEMDUsIDB4OUQwNCwgMHg5RTgzLCAweDlFRDMsIDB4OUYwRiwKKyAgICAweDlGMTAsIDB4NTExQywgMHg1MTEzLCAweDUxMTcsIDB4NTExQSwgMHg1MTExLCAweDUxREUsIDB4NTMzNCwgMHg1M0UxLAorICAgIDB4NTY3MCwgMHg1NjYwLCAweDU2NkUsIDB4NTY3MywgMHg1NjY2LCAweDU2NjMsIDB4NTY2RCwgMHg1NjcyLCAweDU2NUUsCisgICAgMHg1Njc3LCAweDU3MUMsIDB4NTcxQiwgMHg1OEM4LCAweDU4QkQsIDB4NThDOSwgMHg1OEJGLCAweDU4QkEsIDB4NThDMiwKKyAgICAweDU4QkMsIDB4NThDNiwgMHg1QjE3LCAweDVCMTksIDB4NUIxQiwgMHg1QjIxLCAweDVCMTQsIDB4NUIxMywgMHg1QjEwLAorICAgIDB4NUIxNiwgMHg1QjI4LCAweDVCMUEsIDB4NUIyMCwgMHg1QjFFLCAweDVCRUYsIDB4NURBQywgMHg1REIxLCAweDVEQTksCisgICAgMHg1REE3LCAweDVEQjUsIDB4NURCMCwgMHg1REFFLCAweDVEQUEsIDB4NURBOCwgMHg1REIyLCAweDVEQUQsIDB4NURBRiwKKyAgICAweDVEQjQsIDB4NUU2NywgMHg1RTY4LCAweDVFNjYsIDB4NUU2RiwgMHg1RUU5LCAweDVFRTcsIDB4NUVFNiwgMHg1RUU4LAorICAgIDB4NUVFNSwgMHg1RjRCLCAweDVGQkMsIDB4NUZCQiwgMHg2MTlELCAweDYxQTgsIDB4NjE5NiwgMHg2MUM1LCAweDYxQjQsCisgICAgMHg2MUM2LCAweDYxQzEsIDB4NjFDQywgMHg2MUJBLCAweDYxQkYsIDB4NjFCOCwgMHg2MThDLCAweDY0RDcsIDB4NjRENiwKKyAgICAweDY0RDAsIDB4NjRDRiwgMHg2NEM5LCAweDY0QkQsIDB4NjQ4OSwgMHg2NEMzLCAweDY0REIsIDB4NjRGMywgMHg2NEQ5LAorICAgIDB4NjUzMywgMHg2NTdGLCAweDY1N0MsIDB4NjVBMiwgMHg2NkM4LCAweDY2QkUsIDB4NjZDMCwgMHg2NkNBLCAweDY2Q0IsCisgICAgMHg2NkNGLCAweDY2QkQsIDB4NjZCQiwgMHg2NkJBLCAweDY2Q0MsIDB4NjcyMywgMHg2QTM0LCAweDZBNjYsIDB4NkE0OSwKKyAgICAweDZBNjcsIDB4NkEzMiwgMHg2QTY4LCAweDZBM0UsIDB4NkE1RCwgMHg2QTZELCAweDZBNzYsIDB4NkE1QiwgMHg2QTUxLAorICAgIDB4NkEyOCwgMHg2QTVBLCAweDZBM0IsIDB4NkEzRiwgMHg2QTQxLCAweDZBNkEsIDB4NkE2NCwgMHg2QTUwLCAweDZBNEYsCisgICAgMHg2QTU0LCAweDZBNkYsIDB4NkE2OSwgMHg2QTYwLCAweDZBM0MsIDB4NkE1RSwgMHg2QTU2LCAweDZBNTUsIDB4NkE0RCwKKyAgICAweDZBNEUsIDB4NkE0NiwgMHg2QjU1LCAweDZCNTQsIDB4NkI1NiwgMHg2QkE3LCAweDZCQUEsIDB4NkJBQiwgMHg2QkM4LAorICAgIDB4NkJDNywgMHg2QzA0LCAweDZDMDMsIDB4NkMwNiwgMHg2RkFELCAweDZGQ0IsIDB4NkZBMywgMHg2RkM3LCAweDZGQkMsCisgICAgMHg2RkNFLCAweDZGQzgsIDB4NkY1RSwgMHg2RkM0LCAweDZGQkQsIDB4NkY5RSwgMHg2RkNBLCAweDZGQTgsIDB4NzAwNCwKKyAgICAweDZGQTUsIDB4NkZBRSwgMHg2RkJBLCAweDZGQUMsIDB4NkZBQSwgMHg2RkNGLCAweDZGQkYsIDB4NkZCOCwgMHg2RkEyLAorICAgIDB4NkZDOSwgMHg2RkFCLCAweDZGQ0QsIDB4NkZBRiwgMHg2RkIyLCAweDZGQjAsIDB4NzFDNSwgMHg3MUMyLCAweDcxQkYsCisgICAgMHg3MUI4LCAweDcxRDYsIDB4NzFDMCwgMHg3MUMxLCAweDcxQ0IsIDB4NzFENCwgMHg3MUNBLCAweDcxQzcsIDB4NzFDRiwKKyAgICAweDcxQkQsIDB4NzFEOCwgMHg3MUJDLCAweDcxQzYsIDB4NzFEQSwgMHg3MURCLCAweDcyOUQsIDB4NzI5RSwgMHg3MzY5LAorICAgIDB4NzM2NiwgMHg3MzY3LCAweDczNkMsIDB4NzM2NSwgMHg3MzZCLCAweDczNkEsIDB4NzQ3RiwgMHg3NDlBLCAweDc0QTAsCisgICAgMHg3NDk0LCAweDc0OTIsIDB4NzQ5NSwgMHg3NEExLCAweDc1MEIsIDB4NzU4MCwgMHg3NjJGLCAweDc2MkQsIDB4NzYzMSwKKyAgICAweDc2M0QsIDB4NzYzMywgMHg3NjNDLCAweDc2MzUsIDB4NzYzMiwgMHg3NjMwLCAweDc2QkIsIDB4NzZFNiwgMHg3NzlBLAorICAgIDB4Nzc5RCwgMHg3N0ExLCAweDc3OUMsIDB4Nzc5QiwgMHg3N0EyLCAweDc3QTMsIDB4Nzc5NSwgMHg3Nzk5LCAweDc3OTcsCisgICAgMHg3OERELCAweDc4RTksIDB4NzhFNSwgMHg3OEVBLCAweDc4REUsIDB4NzhFMywgMHg3OERCLCAweDc4RTEsIDB4NzhFMiwKKyAgICAweDc4RUQsIDB4NzhERiwgMHg3OEUwLCAweDc5QTQsIDB4N0E0NCwgMHg3QTQ4LCAweDdBNDcsIDB4N0FCNiwgMHg3QUI4LAorICAgIDB4N0FCNSwgMHg3QUIxLCAweDdBQjcsIDB4N0JERSwgMHg3QkUzLCAweDdCRTcsIDB4N0JERCwgMHg3QkQ1LCAweDdCRTUsCisgICAgMHg3QkRBLCAweDdCRTgsIDB4N0JGOSwgMHg3QkQ0LCAweDdCRUEsIDB4N0JFMiwgMHg3QkRDLCAweDdCRUIsIDB4N0JEOCwKKyAgICAweDdCREYsIDB4N0NEMiwgMHg3Q0Q0LCAweDdDRDcsIDB4N0NEMCwgMHg3Q0QxLCAweDdFMTIsIDB4N0UyMSwgMHg3RTE3LAorICAgIDB4N0UwQywgMHg3RTFGLCAweDdFMjAsIDB4N0UxMywgMHg3RTBFLCAweDdFMUMsIDB4N0UxNSwgMHg3RTFBLCAweDdFMjIsCisgICAgMHg3RTBCLCAweDdFMEYsIDB4N0UxNiwgMHg3RTBELCAweDdFMTQsIDB4N0UyNSwgMHg3RTI0LCAweDdGNDMsIDB4N0Y3QiwKKyAgICAweDdGN0MsIDB4N0Y3QSwgMHg3RkIxLCAweDdGRUYsIDB4ODAyQSwgMHg4MDI5LCAweDgwNkMsIDB4ODFCMSwgMHg4MUE2LAorICAgIDB4ODFBRSwgMHg4MUI5LCAweDgxQjUsIDB4ODFBQiwgMHg4MUIwLCAweDgxQUMsIDB4ODFCNCwgMHg4MUIyLCAweDgxQjcsCisgICAgMHg4MUE3LCAweDgxRjIsIDB4ODI1NSwgMHg4MjU2LCAweDgyNTcsIDB4ODU1NiwgMHg4NTQ1LCAweDg1NkIsIDB4ODU0RCwKKyAgICAweDg1NTMsIDB4ODU2MSwgMHg4NTU4LCAweDg1NDAsIDB4ODU0NiwgMHg4NTY0LCAweDg1NDEsIDB4ODU2MiwgMHg4NTQ0LAorICAgIDB4ODU1MSwgMHg4NTQ3LCAweDg1NjMsIDB4ODUzRSwgMHg4NTVCLCAweDg1NzEsIDB4ODU0RSwgMHg4NTZFLCAweDg1NzUsCisgICAgMHg4NTU1LCAweDg1NjcsIDB4ODU2MCwgMHg4NThDLCAweDg1NjYsIDB4ODU1RCwgMHg4NTU0LCAweDg1NjUsIDB4ODU2QywKKyAgICAweDg2NjMsIDB4ODY2NSwgMHg4NjY0LCAweDg3QTQsIDB4ODc5QiwgMHg4NzhGLCAweDg3OTcsIDB4ODc5MywgMHg4NzkyLAorICAgIDB4ODc4OCwgMHg4NzgxLCAweDg3OTYsIDB4ODc5OCwgMHg4Nzc5LCAweDg3ODcsIDB4ODdBMywgMHg4Nzg1LCAweDg3OTAsCisgICAgMHg4NzkxLCAweDg3OUQsIDB4ODc4NCwgMHg4Nzk0LCAweDg3OUMsIDB4ODc5QSwgMHg4Nzg5LCAweDg5MUUsIDB4ODkyNiwKKyAgICAweDg5MzAsIDB4ODkyRCwgMHg4OTJFLCAweDg5MjcsIDB4ODkzMSwgMHg4OTIyLCAweDg5MjksIDB4ODkyMywgMHg4OTJGLAorICAgIDB4ODkyQywgMHg4OTFGLCAweDg5RjEsIDB4OEFFMCwgMHg4QUUyLCAweDhBRjIsIDB4OEFGNCwgMHg4QUY1LCAweDhBREQsCisgICAgMHg4QjE0LCAweDhBRTQsIDB4OEFERiwgMHg4QUYwLCAweDhBQzgsIDB4OEFERSwgMHg4QUUxLCAweDhBRTgsIDB4OEFGRiwKKyAgICAweDhBRUYsIDB4OEFGQiwgMHg4QzkxLCAweDhDOTIsIDB4OEM5MCwgMHg4Q0Y1LCAweDhDRUUsIDB4OENGMSwgMHg4Q0YwLAorICAgIDB4OENGMywgMHg4RDZDLCAweDhENkUsIDB4OERBNSwgMHg4REE3LCAweDhFMzMsIDB4OEUzRSwgMHg4RTM4LCAweDhFNDAsCisgICAgMHg4RTQ1LCAweDhFMzYsIDB4OEUzQywgMHg4RTNELCAweDhFNDEsIDB4OEUzMCwgMHg4RTNGLCAweDhFQkQsIDB4OEYzNiwKKyAgICAweDhGMkUsIDB4OEYzNSwgMHg4RjMyLCAweDhGMzksIDB4OEYzNywgMHg4RjM0LCAweDkwNzYsIDB4OTA3OSwgMHg5MDdCLAorICAgIDB4OTA4NiwgMHg5MEZBLCAweDkxMzMsIDB4OTEzNSwgMHg5MTM2LCAweDkxOTMsIDB4OTE5MCwgMHg5MTkxLCAweDkxOEQsCisgICAgMHg5MThGLCAweDkzMjcsIDB4OTMxRSwgMHg5MzA4LCAweDkzMUYsIDB4OTMwNiwgMHg5MzBGLCAweDkzN0EsIDB4OTMzOCwKKyAgICAweDkzM0MsIDB4OTMxQiwgMHg5MzIzLCAweDkzMTIsIDB4OTMwMSwgMHg5MzQ2LCAweDkzMkQsIDB4OTMwRSwgMHg5MzBELAorICAgIDB4OTJDQiwgMHg5MzFELCAweDkyRkEsIDB4OTMxMywgMHg5MkY5LCAweDkyRjcsIDB4OTMzNCwgMHg5MzAyLCAweDkzMjQsCisgICAgMHg5MkZGLCAweDkzMjksIDB4OTMzOSwgMHg5MzM1LCAweDkzMkEsIDB4OTMxNCwgMHg5MzBDLCAweDkzMEIsIDB4OTJGRSwKKyAgICAweDkzMDksIDB4OTMwMCwgMHg5MkZCLCAweDkzMTYsIDB4OTVCQywgMHg5NUNELCAweDk1QkUsIDB4OTVCOSwgMHg5NUJBLAorICAgIDB4OTVCNiwgMHg5NUJGLCAweDk1QjUsIDB4OTVCRCwgMHg5NkE5LCAweDk2RDQsIDB4OTcwQiwgMHg5NzEyLCAweDk3MTAsCisgICAgMHg5Nzk5LCAweDk3OTcsIDB4OTc5NCwgMHg5N0YwLCAweDk3RjgsIDB4OTgzNSwgMHg5ODJGLCAweDk4MzIsIDB4OTkyNCwKKyAgICAweDk5MUYsIDB4OTkyNywgMHg5OTI5LCAweDk5OUUsIDB4OTlFRSwgMHg5OUVDLCAweDk5RTUsIDB4OTlFNCwgMHg5OUYwLAorICAgIDB4OTlFMywgMHg5OUVBLCAweDk5RTksIDB4OTlFNywgMHg5QUI5LCAweDlBQkYsIDB4OUFCNCwgMHg5QUJCLCAweDlBRjYsCisgICAgMHg5QUZBLCAweDlBRjksIDB4OUFGNywgMHg5QjMzLCAweDlCODAsIDB4OUI4NSwgMHg5Qjg3LCAweDlCN0MsIDB4OUI3RSwKKyAgICAweDlCN0IsIDB4OUI4MiwgMHg5QjkzLCAweDlCOTIsIDB4OUI5MCwgMHg5QjdBLCAweDlCOTUsIDB4OUI3RCwgMHg5Qjg4LAorICAgIDB4OUQyNSwgMHg5RDE3LCAweDlEMjAsIDB4OUQxRSwgMHg5RDE0LCAweDlEMjksIDB4OUQxRCwgMHg5RDE4LCAweDlEMjIsCisgICAgMHg5RDEwLCAweDlEMTksIDB4OUQxRiwgMHg5RTg4LCAweDlFODYsIDB4OUU4NywgMHg5RUFFLCAweDlFQUQsIDB4OUVENSwKKyAgICAweDlFRDYsIDB4OUVGQSwgMHg5RjEyLCAweDlGM0QsIDB4NTEyNiwgMHg1MTI1LCAweDUxMjIsIDB4NTEyNCwgMHg1MTIwLAorICAgIDB4NTEyOSwgMHg1MkY0LCAweDU2OTMsIDB4NTY4QywgMHg1NjhELCAweDU2ODYsIDB4NTY4NCwgMHg1NjgzLCAweDU2N0UsCisgICAgMHg1NjgyLCAweDU2N0YsIDB4NTY4MSwgMHg1OEQ2LCAweDU4RDQsIDB4NThDRiwgMHg1OEQyLCAweDVCMkQsIDB4NUIyNSwKKyAgICAweDVCMzIsIDB4NUIyMywgMHg1QjJDLCAweDVCMjcsIDB4NUIyNiwgMHg1QjJGLCAweDVCMkUsIDB4NUI3QiwgMHg1QkYxLAorICAgIDB4NUJGMiwgMHg1REI3LCAweDVFNkMsIDB4NUU2QSwgMHg1RkJFLCAweDYxQzMsIDB4NjFCNSwgMHg2MUJDLCAweDYxRTcsCisgICAgMHg2MUUwLCAweDYxRTUsIDB4NjFFNCwgMHg2MUU4LCAweDYxREUsIDB4NjRFRiwgMHg2NEU5LCAweDY0RTMsIDB4NjRFQiwKKyAgICAweDY0RTQsIDB4NjRFOCwgMHg2NTgxLCAweDY1ODAsIDB4NjVCNiwgMHg2NURBLCAweDY2RDIsIDB4NkE4RCwgMHg2QTk2LAorICAgIDB4NkE4MSwgMHg2QUE1LCAweDZBODksIDB4NkE5RiwgMHg2QTlCLCAweDZBQTEsIDB4NkE5RSwgMHg2QTg3LCAweDZBOTMsCisgICAgMHg2QThFLCAweDZBOTUsIDB4NkE4MywgMHg2QUE4LCAweDZBQTQsIDB4NkE5MSwgMHg2QTdGLCAweDZBQTYsIDB4NkE5QSwKKyAgICAweDZBODUsIDB4NkE4QywgMHg2QTkyLCAweDZCNUIsIDB4NkJBRCwgMHg2QzA5LCAweDZGQ0MsIDB4NkZBOSwgMHg2RkY0LAorICAgIDB4NkZENCwgMHg2RkUzLCAweDZGREMsIDB4NkZFRCwgMHg2RkU3LCAweDZGRTYsIDB4NkZERSwgMHg2RkYyLCAweDZGREQsCisgICAgMHg2RkUyLCAweDZGRTgsIDB4NzFFMSwgMHg3MUYxLCAweDcxRTgsIDB4NzFGMiwgMHg3MUU0LCAweDcxRjAsIDB4NzFFMiwKKyAgICAweDczNzMsIDB4NzM2RSwgMHg3MzZGLCAweDc0OTcsIDB4NzRCMiwgMHg3NEFCLCAweDc0OTAsIDB4NzRBQSwgMHg3NEFELAorICAgIDB4NzRCMSwgMHg3NEE1LCAweDc0QUYsIDB4NzUxMCwgMHg3NTExLCAweDc1MTIsIDB4NzUwRiwgMHg3NTg0LCAweDc2NDMsCisgICAgMHg3NjQ4LCAweDc2NDksIDB4NzY0NywgMHg3NkE0LCAweDc2RTksIDB4NzdCNSwgMHg3N0FCLCAweDc3QjIsIDB4NzdCNywKKyAgICAweDc3QjYsIDB4NzdCNCwgMHg3N0IxLCAweDc3QTgsIDB4NzdGMCwgMHg3OEYzLCAweDc4RkQsIDB4NzkwMiwgMHg3OEZCLAorICAgIDB4NzhGQywgMHg3OEZGLCAweDc4RjIsIDB4NzkwNSwgMHg3OEY5LCAweDc4RkUsIDB4NzkwNCwgMHg3OUFCLCAweDc5QTgsCisgICAgMHg3QTVDLCAweDdBNUIsIDB4N0E1NiwgMHg3QTU4LCAweDdBNTQsIDB4N0E1QSwgMHg3QUJFLCAweDdBQzAsIDB4N0FDMSwKKyAgICAweDdDMDUsIDB4N0MwRiwgMHg3QkYyLCAweDdDMDAsIDB4N0JGRiwgMHg3QkZCLCAweDdDMEUsIDB4N0JGNCwgMHg3QzBCLAorICAgIDB4N0JGMywgMHg3QzAyLCAweDdDMDksIDB4N0MwMywgMHg3QzAxLCAweDdCRjgsIDB4N0JGRCwgMHg3QzA2LCAweDdCRjAsCisgICAgMHg3QkYxLCAweDdDMTAsIDB4N0MwQSwgMHg3Q0U4LCAweDdFMkQsIDB4N0UzQywgMHg3RTQyLCAweDdFMzMsIDB4OTg0OCwKKyAgICAweDdFMzgsIDB4N0UyQSwgMHg3RTQ5LCAweDdFNDAsIDB4N0U0NywgMHg3RTI5LCAweDdFNEMsIDB4N0UzMCwgMHg3RTNCLAorICAgIDB4N0UzNiwgMHg3RTQ0LCAweDdFM0EsIDB4N0Y0NSwgMHg3RjdGLCAweDdGN0UsIDB4N0Y3RCwgMHg3RkY0LCAweDdGRjIsCisgICAgMHg4MDJDLCAweDgxQkIsIDB4ODFDNCwgMHg4MUNDLCAweDgxQ0EsIDB4ODFDNSwgMHg4MUM3LCAweDgxQkMsIDB4ODFFOSwKKyAgICAweDgyNUIsIDB4ODI1QSwgMHg4MjVDLCAweDg1ODMsIDB4ODU4MCwgMHg4NThGLCAweDg1QTcsIDB4ODU5NSwgMHg4NUEwLAorICAgIDB4ODU4QiwgMHg4NUEzLCAweDg1N0IsIDB4ODVBNCwgMHg4NTlBLCAweDg1OUUsIDB4ODU3NywgMHg4NTdDLCAweDg1ODksCisgICAgMHg4NUExLCAweDg1N0EsIDB4ODU3OCwgMHg4NTU3LCAweDg1OEUsIDB4ODU5NiwgMHg4NTg2LCAweDg1OEQsIDB4ODU5OSwKKyAgICAweDg1OUQsIDB4ODU4MSwgMHg4NUEyLCAweDg1ODIsIDB4ODU4OCwgMHg4NTg1LCAweDg1NzksIDB4ODU3NiwgMHg4NTk4LAorICAgIDB4ODU5MCwgMHg4NTlGLCAweDg2NjgsIDB4ODdCRSwgMHg4N0FBLCAweDg3QUQsIDB4ODdDNSwgMHg4N0IwLCAweDg3QUMsCisgICAgMHg4N0I5LCAweDg3QjUsIDB4ODdCQywgMHg4N0FFLCAweDg3QzksIDB4ODdDMywgMHg4N0MyLCAweDg3Q0MsIDB4ODdCNywKKyAgICAweDg3QUYsIDB4ODdDNCwgMHg4N0NBLCAweDg3QjQsIDB4ODdCNiwgMHg4N0JGLCAweDg3QjgsIDB4ODdCRCwgMHg4N0RFLAorICAgIDB4ODdCMiwgMHg4OTM1LCAweDg5MzMsIDB4ODkzQywgMHg4OTNFLCAweDg5NDEsIDB4ODk1MiwgMHg4OTM3LCAweDg5NDIsCisgICAgMHg4OUFELCAweDg5QUYsIDB4ODlBRSwgMHg4OUYyLCAweDg5RjMsIDB4OEIxRSwgMHg4QjE4LCAweDhCMTYsIDB4OEIxMSwKKyAgICAweDhCMDUsIDB4OEIwQiwgMHg4QjIyLCAweDhCMEYsIDB4OEIxMiwgMHg4QjE1LCAweDhCMDcsIDB4OEIwRCwgMHg4QjA4LAorICAgIDB4OEIwNiwgMHg4QjFDLCAweDhCMTMsIDB4OEIxQSwgMHg4QzRGLCAweDhDNzAsIDB4OEM3MiwgMHg4QzcxLCAweDhDNkYsCisgICAgMHg4Qzk1LCAweDhDOTQsIDB4OENGOSwgMHg4RDZGLCAweDhFNEUsIDB4OEU0RCwgMHg4RTUzLCAweDhFNTAsIDB4OEU0QywKKyAgICAweDhFNDcsIDB4OEY0MywgMHg4RjQwLCAweDkwODUsIDB4OTA3RSwgMHg5MTM4LCAweDkxOUEsIDB4OTFBMiwgMHg5MTlCLAorICAgIDB4OTE5OSwgMHg5MTlGLCAweDkxQTEsIDB4OTE5RCwgMHg5MUEwLCAweDkzQTEsIDB4OTM4MywgMHg5M0FGLCAweDkzNjQsCisgICAgMHg5MzU2LCAweDkzNDcsIDB4OTM3QywgMHg5MzU4LCAweDkzNUMsIDB4OTM3NiwgMHg5MzQ5LCAweDkzNTAsIDB4OTM1MSwKKyAgICAweDkzNjAsIDB4OTM2RCwgMHg5MzhGLCAweDkzNEMsIDB4OTM2QSwgMHg5Mzc5LCAweDkzNTcsIDB4OTM1NSwgMHg5MzUyLAorICAgIDB4OTM0RiwgMHg5MzcxLCAweDkzNzcsIDB4OTM3QiwgMHg5MzYxLCAweDkzNUUsIDB4OTM2MywgMHg5MzY3LCAweDkzNEUsCisgICAgMHg5MzU5LCAweDk1QzcsIDB4OTVDMCwgMHg5NUM5LCAweDk1QzMsIDB4OTVDNSwgMHg5NUI3LCAweDk2QUUsIDB4OTZCMCwKKyAgICAweDk2QUMsIDB4OTcyMCwgMHg5NzFGLCAweDk3MTgsIDB4OTcxRCwgMHg5NzE5LCAweDk3OUEsIDB4OTdBMSwgMHg5NzlDLAorICAgIDB4OTc5RSwgMHg5NzlELCAweDk3RDUsIDB4OTdENCwgMHg5N0YxLCAweDk4NDEsIDB4OTg0NCwgMHg5ODRBLCAweDk4NDksCisgICAgMHg5ODQ1LCAweDk4NDMsIDB4OTkyNSwgMHg5OTJCLCAweDk5MkMsIDB4OTkyQSwgMHg5OTMzLCAweDk5MzIsIDB4OTkyRiwKKyAgICAweDk5MkQsIDB4OTkzMSwgMHg5OTMwLCAweDk5OTgsIDB4OTlBMywgMHg5OUExLCAweDlBMDIsIDB4OTlGQSwgMHg5OUY0LAorICAgIDB4OTlGNywgMHg5OUY5LCAweDk5RjgsIDB4OTlGNiwgMHg5OUZCLCAweDk5RkQsIDB4OTlGRSwgMHg5OUZDLCAweDlBMDMsCisgICAgMHg5QUJFLCAweDlBRkUsIDB4OUFGRCwgMHg5QjAxLCAweDlBRkMsIDB4OUI0OCwgMHg5QjlBLCAweDlCQTgsIDB4OUI5RSwKKyAgICAweDlCOUIsIDB4OUJBNiwgMHg5QkExLCAweDlCQTUsIDB4OUJBNCwgMHg5Qjg2LCAweDlCQTIsIDB4OUJBMCwgMHg5QkFGLAorICAgIDB4OUQzMywgMHg5RDQxLCAweDlENjcsIDB4OUQzNiwgMHg5RDJFLCAweDlEMkYsIDB4OUQzMSwgMHg5RDM4LCAweDlEMzAsCisgICAgMHg5RDQ1LCAweDlENDIsIDB4OUQ0MywgMHg5RDNFLCAweDlEMzcsIDB4OUQ0MCwgMHg5RDNELCAweDdGRjUsIDB4OUQyRCwKKyAgICAweDlFOEEsIDB4OUU4OSwgMHg5RThELCAweDlFQjAsIDB4OUVDOCwgMHg5RURBLCAweDlFRkIsIDB4OUVGRiwgMHg5RjI0LAorICAgIDB4OUYyMywgMHg5RjIyLCAweDlGNTQsIDB4OUZBMCwgMHg1MTMxLCAweDUxMkQsIDB4NTEyRSwgMHg1Njk4LCAweDU2OUMsCisgICAgMHg1Njk3LCAweDU2OUEsIDB4NTY5RCwgMHg1Njk5LCAweDU5NzAsIDB4NUIzQywgMHg1QzY5LCAweDVDNkEsIDB4NURDMCwKKyAgICAweDVFNkQsIDB4NUU2RSwgMHg2MUQ4LCAweDYxREYsIDB4NjFFRCwgMHg2MUVFLCAweDYxRjEsIDB4NjFFQSwgMHg2MUYwLAorICAgIDB4NjFFQiwgMHg2MUQ2LCAweDYxRTksIDB4NjRGRiwgMHg2NTA0LCAweDY0RkQsIDB4NjRGOCwgMHg2NTAxLCAweDY1MDMsCisgICAgMHg2NEZDLCAweDY1OTQsIDB4NjVEQiwgMHg2NkRBLCAweDY2REIsIDB4NjZEOCwgMHg2QUM1LCAweDZBQjksIDB4NkFCRCwKKyAgICAweDZBRTEsIDB4NkFDNiwgMHg2QUJBLCAweDZBQjYsIDB4NkFCNywgMHg2QUM3LCAweDZBQjQsIDB4NkFBRCwgMHg2QjVFLAorICAgIDB4NkJDOSwgMHg2QzBCLCAweDcwMDcsIDB4NzAwQywgMHg3MDBELCAweDcwMDEsIDB4NzAwNSwgMHg3MDE0LCAweDcwMEUsCisgICAgMHg2RkZGLCAweDcwMDAsIDB4NkZGQiwgMHg3MDI2LCAweDZGRkMsIDB4NkZGNywgMHg3MDBBLCAweDcyMDEsIDB4NzFGRiwKKyAgICAweDcxRjksIDB4NzIwMywgMHg3MUZELCAweDczNzYsIDB4NzRCOCwgMHg3NEMwLCAweDc0QjUsIDB4NzRDMSwgMHg3NEJFLAorICAgIDB4NzRCNiwgMHg3NEJCLCAweDc0QzIsIDB4NzUxNCwgMHg3NTEzLCAweDc2NUMsIDB4NzY2NCwgMHg3NjU5LCAweDc2NTAsCisgICAgMHg3NjUzLCAweDc2NTcsIDB4NzY1QSwgMHg3NkE2LCAweDc2QkQsIDB4NzZFQywgMHg3N0MyLCAweDc3QkEsIDB4NzkwQywKKyAgICAweDc5MTMsIDB4NzkxNCwgMHg3OTA5LCAweDc5MTAsIDB4NzkxMiwgMHg3OTExLCAweDc5QUQsIDB4NzlBQywgMHg3QTVGLAorICAgIDB4N0MxQywgMHg3QzI5LCAweDdDMTksIDB4N0MyMCwgMHg3QzFGLCAweDdDMkQsIDB4N0MxRCwgMHg3QzI2LCAweDdDMjgsCisgICAgMHg3QzIyLCAweDdDMjUsIDB4N0MzMCwgMHg3RTVDLCAweDdFNTAsIDB4N0U1NiwgMHg3RTYzLCAweDdFNTgsIDB4N0U2MiwKKyAgICAweDdFNUYsIDB4N0U1MSwgMHg3RTYwLCAweDdFNTcsIDB4N0U1MywgMHg3RkI1LCAweDdGQjMsIDB4N0ZGNywgMHg3RkY4LAorICAgIDB4ODA3NSwgMHg4MUQxLCAweDgxRDIsIDB4ODFEMCwgMHg4MjVGLCAweDgyNUUsIDB4ODVCNCwgMHg4NUM2LCAweDg1QzAsCisgICAgMHg4NUMzLCAweDg1QzIsIDB4ODVCMywgMHg4NUI1LCAweDg1QkQsIDB4ODVDNywgMHg4NUM0LCAweDg1QkYsIDB4ODVDQiwKKyAgICAweDg1Q0UsIDB4ODVDOCwgMHg4NUM1LCAweDg1QjEsIDB4ODVCNiwgMHg4NUQyLCAweDg2MjQsIDB4ODVCOCwgMHg4NUI3LAorICAgIDB4ODVCRSwgMHg4NjY5LCAweDg3RTcsIDB4ODdFNiwgMHg4N0UyLCAweDg3REIsIDB4ODdFQiwgMHg4N0VBLCAweDg3RTUsCisgICAgMHg4N0RGLCAweDg3RjMsIDB4ODdFNCwgMHg4N0Q0LCAweDg3REMsIDB4ODdEMywgMHg4N0VELCAweDg3RDgsIDB4ODdFMywKKyAgICAweDg3RDcsIDB4ODdEOSwgMHg4ODAxLCAweDg3RjQsIDB4ODdFOCwgMHg4N0RELCAweDg5NTMsIDB4ODk0QiwgMHg4OTRGLAorICAgIDB4ODk0QywgMHg4OTQ2LCAweDg5NTAsIDB4ODk1MSwgMHg4OTQ5LCAweDhCMkEsIDB4OEIyNywgMHg4QjIzLCAweDhCMzMsCisgICAgMHg4QjMwLCAweDhCMzUsIDB4OEI0NywgMHg4QjJGLCAweDhCM0MsIDB4OEIzRSwgMHg4QjMxLCAweDhCMjUsIDB4OEIzNywKKyAgICAweDhCMjYsIDB4OEIzNiwgMHg4QjJFLCAweDhCMjQsIDB4OEIzQiwgMHg4QjNELCAweDhCM0EsIDB4OEM0MiwgMHg4Qzc1LAorICAgIDB4OEM5OSwgMHg4Qzk4LCAweDhDOTcsIDB4OENGRSwgMHg4RDA0LCAweDhEMDIsIDB4OEQwMCwgMHg4RTVDLCAweDhFNjIsCisgICAgMHg4RTYwLCAweDhFNTcsIDB4OEU1NiwgMHg4RTVFLCAweDhFNjUsIDB4OEU2NywgMHg4RTVCLCAweDhFNUEsIDB4OEU2MSwKKyAgICAweDhFNUQsIDB4OEU2OSwgMHg4RTU0LCAweDhGNDYsIDB4OEY0NywgMHg4RjQ4LCAweDhGNEIsIDB4OTEyOCwgMHg5MTNBLAorICAgIDB4OTEzQiwgMHg5MTNFLCAweDkxQTgsIDB4OTFBNSwgMHg5MUE3LCAweDkxQUYsIDB4OTFBQSwgMHg5M0I1LCAweDkzOEMsCisgICAgMHg5MzkyLCAweDkzQjcsIDB4OTM5QiwgMHg5MzlELCAweDkzODksIDB4OTNBNywgMHg5MzhFLCAweDkzQUEsIDB4OTM5RSwKKyAgICAweDkzQTYsIDB4OTM5NSwgMHg5Mzg4LCAweDkzOTksIDB4OTM5RiwgMHg5MzgwLCAweDkzOEQsIDB4OTNCMSwgMHg5MzkxLAorICAgIDB4OTNCMiwgMHg5M0E0LCAweDkzQTgsIDB4OTNCNCwgMHg5M0EzLCAweDk1RDIsIDB4OTVEMywgMHg5NUQxLCAweDk2QjMsCisgICAgMHg5NkQ3LCAweDk2REEsIDB4NURDMiwgMHg5NkRGLCAweDk2RDgsIDB4OTZERCwgMHg5NzIzLCAweDk3MjIsIDB4OTcyNSwKKyAgICAweDk3QUMsIDB4OTdBRSwgMHg5N0E4LCAweDk3QUIsIDB4OTdBNCwgMHg5N0FBLCAweDk3QTIsIDB4OTdBNSwgMHg5N0Q3LAorICAgIDB4OTdEOSwgMHg5N0Q2LCAweDk3RDgsIDB4OTdGQSwgMHg5ODUwLCAweDk4NTEsIDB4OTg1MiwgMHg5OEI4LCAweDk5NDEsCisgICAgMHg5OTNDLCAweDk5M0EsIDB4OUEwRiwgMHg5QTBCLCAweDlBMDksIDB4OUEwRCwgMHg5QTA0LCAweDlBMTEsIDB4OUEwQSwKKyAgICAweDlBMDUsIDB4OUEwNywgMHg5QTA2LCAweDlBQzAsIDB4OUFEQywgMHg5QjA4LCAweDlCMDQsIDB4OUIwNSwgMHg5QjI5LAorICAgIDB4OUIzNSwgMHg5QjRBLCAweDlCNEMsIDB4OUI0QiwgMHg5QkM3LCAweDlCQzYsIDB4OUJDMywgMHg5QkJGLCAweDlCQzEsCisgICAgMHg5QkI1LCAweDlCQjgsIDB4OUJEMywgMHg5QkI2LCAweDlCQzQsIDB4OUJCOSwgMHg5QkJELCAweDlENUMsIDB4OUQ1MywKKyAgICAweDlENEYsIDB4OUQ0QSwgMHg5RDVCLCAweDlENEIsIDB4OUQ1OSwgMHg5RDU2LCAweDlENEMsIDB4OUQ1NywgMHg5RDUyLAorICAgIDB4OUQ1NCwgMHg5RDVGLCAweDlENTgsIDB4OUQ1QSwgMHg5RThFLCAweDlFOEMsIDB4OUVERiwgMHg5RjAxLCAweDlGMDAsCisgICAgMHg5RjE2LCAweDlGMjUsIDB4OUYyQiwgMHg5RjJBLCAweDlGMjksIDB4OUYyOCwgMHg5RjRDLCAweDlGNTUsIDB4NTEzNCwKKyAgICAweDUxMzUsIDB4NTI5NiwgMHg1MkY3LCAweDUzQjQsIDB4NTZBQiwgMHg1NkFELCAweDU2QTYsIDB4NTZBNywgMHg1NkFBLAorICAgIDB4NTZBQywgMHg1OERBLCAweDU4REQsIDB4NThEQiwgMHg1OTEyLCAweDVCM0QsIDB4NUIzRSwgMHg1QjNGLCAweDVEQzMsCisgICAgMHg1RTcwLCAweDVGQkYsIDB4NjFGQiwgMHg2NTA3LCAweDY1MTAsIDB4NjUwRCwgMHg2NTA5LCAweDY1MEMsIDB4NjUwRSwKKyAgICAweDY1ODQsIDB4NjVERSwgMHg2NURELCAweDY2REUsIDB4NkFFNywgMHg2QUUwLCAweDZBQ0MsIDB4NkFEMSwgMHg2QUQ5LAorICAgIDB4NkFDQiwgMHg2QURGLCAweDZBREMsIDB4NkFEMCwgMHg2QUVCLCAweDZBQ0YsIDB4NkFDRCwgMHg2QURFLCAweDZCNjAsCisgICAgMHg2QkIwLCAweDZDMEMsIDB4NzAxOSwgMHg3MDI3LCAweDcwMjAsIDB4NzAxNiwgMHg3MDJCLCAweDcwMjEsIDB4NzAyMiwKKyAgICAweDcwMjMsIDB4NzAyOSwgMHg3MDE3LCAweDcwMjQsIDB4NzAxQywgMHg3MjBDLCAweDcyMEEsIDB4NzIwNywgMHg3MjAyLAorICAgIDB4NzIwNSwgMHg3MkE1LCAweDcyQTYsIDB4NzJBNCwgMHg3MkEzLCAweDcyQTEsIDB4NzRDQiwgMHg3NEM1LCAweDc0QjcsCisgICAgMHg3NEMzLCAweDc1MTYsIDB4NzY2MCwgMHg3N0M5LCAweDc3Q0EsIDB4NzdDNCwgMHg3N0YxLCAweDc5MUQsIDB4NzkxQiwKKyAgICAweDc5MjEsIDB4NzkxQywgMHg3OTE3LCAweDc5MUUsIDB4NzlCMCwgMHg3QTY3LCAweDdBNjgsIDB4N0MzMywgMHg3QzNDLAorICAgIDB4N0MzOSwgMHg3QzJDLCAweDdDM0IsIDB4N0NFQywgMHg3Q0VBLCAweDdFNzYsIDB4N0U3NSwgMHg3RTc4LCAweDdFNzAsCisgICAgMHg3RTc3LCAweDdFNkYsIDB4N0U3QSwgMHg3RTcyLCAweDdFNzQsIDB4N0U2OCwgMHg3RjRCLCAweDdGNEEsIDB4N0Y4MywKKyAgICAweDdGODYsIDB4N0ZCNywgMHg3RkZELCAweDdGRkUsIDB4ODA3OCwgMHg4MUQ3LCAweDgxRDUsIDB4ODIwQiwgMHg4MjY0LAorICAgIDB4ODI2MSwgMHg4MjYzLCAweDg1RUIsIDB4ODVGMSwgMHg4NUVELCAweDg1RDksIDB4ODVFMSwgMHg4NUU4LCAweDg1REEsCisgICAgMHg4NUQ3LCAweDg1RUMsIDB4ODVGMiwgMHg4NUY4LCAweDg1RDgsIDB4ODVERiwgMHg4NUUzLCAweDg1REMsIDB4ODVEMSwKKyAgICAweDg1RjAsIDB4ODVFNiwgMHg4NUVGLCAweDg1REUsIDB4ODVFMiwgMHg4ODAwLCAweDg3RkEsIDB4ODgwMywgMHg4N0Y2LAorICAgIDB4ODdGNywgMHg4ODA5LCAweDg4MEMsIDB4ODgwQiwgMHg4ODA2LCAweDg3RkMsIDB4ODgwOCwgMHg4N0ZGLCAweDg4MEEsCisgICAgMHg4ODAyLCAweDg5NjIsIDB4ODk1QSwgMHg4OTVCLCAweDg5NTcsIDB4ODk2MSwgMHg4OTVDLCAweDg5NTgsIDB4ODk1RCwKKyAgICAweDg5NTksIDB4ODk4OCwgMHg4OUI3LCAweDg5QjYsIDB4ODlGNiwgMHg4QjUwLCAweDhCNDgsIDB4OEI0QSwgMHg4QjQwLAorICAgIDB4OEI1MywgMHg4QjU2LCAweDhCNTQsIDB4OEI0QiwgMHg4QjU1LCAweDhCNTEsIDB4OEI0MiwgMHg4QjUyLCAweDhCNTcsCisgICAgMHg4QzQzLCAweDhDNzcsIDB4OEM3NiwgMHg4QzlBLCAweDhEMDYsIDB4OEQwNywgMHg4RDA5LCAweDhEQUMsIDB4OERBQSwKKyAgICAweDhEQUQsIDB4OERBQiwgMHg4RTZELCAweDhFNzgsIDB4OEU3MywgMHg4RTZBLCAweDhFNkYsIDB4OEU3QiwgMHg4RUMyLAorICAgIDB4OEY1MiwgMHg4RjUxLCAweDhGNEYsIDB4OEY1MCwgMHg4RjUzLCAweDhGQjQsIDB4OTE0MCwgMHg5MTNGLCAweDkxQjAsCisgICAgMHg5MUFELCAweDkzREUsIDB4OTNDNywgMHg5M0NGLCAweDkzQzIsIDB4OTNEQSwgMHg5M0QwLCAweDkzRjksIDB4OTNFQywKKyAgICAweDkzQ0MsIDB4OTNEOSwgMHg5M0E5LCAweDkzRTYsIDB4OTNDQSwgMHg5M0Q0LCAweDkzRUUsIDB4OTNFMywgMHg5M0Q1LAorICAgIDB4OTNDNCwgMHg5M0NFLCAweDkzQzAsIDB4OTNEMiwgMHg5M0E1LCAweDkzRTcsIDB4OTU3RCwgMHg5NURBLCAweDk1REIsCisgICAgMHg5NkUxLCAweDk3MjksIDB4OTcyQiwgMHg5NzJDLCAweDk3MjgsIDB4OTcyNiwgMHg5N0IzLCAweDk3QjcsIDB4OTdCNiwKKyAgICAweDk3REQsIDB4OTdERSwgMHg5N0RGLCAweDk4NUMsIDB4OTg1OSwgMHg5ODVELCAweDk4NTcsIDB4OThCRiwgMHg5OEJELAorICAgIDB4OThCQiwgMHg5OEJFLCAweDk5NDgsIDB4OTk0NywgMHg5OTQzLCAweDk5QTYsIDB4OTlBNywgMHg5QTFBLCAweDlBMTUsCisgICAgMHg5QTI1LCAweDlBMUQsIDB4OUEyNCwgMHg5QTFCLCAweDlBMjIsIDB4OUEyMCwgMHg5QTI3LCAweDlBMjMsIDB4OUExRSwKKyAgICAweDlBMUMsIDB4OUExNCwgMHg5QUMyLCAweDlCMEIsIDB4OUIwQSwgMHg5QjBFLCAweDlCMEMsIDB4OUIzNywgMHg5QkVBLAorICAgIDB4OUJFQiwgMHg5QkUwLCAweDlCREUsIDB4OUJFNCwgMHg5QkU2LCAweDlCRTIsIDB4OUJGMCwgMHg5QkQ0LCAweDlCRDcsCisgICAgMHg5QkVDLCAweDlCREMsIDB4OUJEOSwgMHg5QkU1LCAweDlCRDUsIDB4OUJFMSwgMHg5QkRBLCAweDlENzcsIDB4OUQ4MSwKKyAgICAweDlEOEEsIDB4OUQ4NCwgMHg5RDg4LCAweDlENzEsIDB4OUQ4MCwgMHg5RDc4LCAweDlEODYsIDB4OUQ4QiwgMHg5RDhDLAorICAgIDB4OUQ3RCwgMHg5RDZCLCAweDlENzQsIDB4OUQ3NSwgMHg5RDcwLCAweDlENjksIDB4OUQ4NSwgMHg5RDczLCAweDlEN0IsCisgICAgMHg5RDgyLCAweDlENkYsIDB4OUQ3OSwgMHg5RDdGLCAweDlEODcsIDB4OUQ2OCwgMHg5RTk0LCAweDlFOTEsIDB4OUVDMCwKKyAgICAweDlFRkMsIDB4OUYyRCwgMHg5RjQwLCAweDlGNDEsIDB4OUY0RCwgMHg5RjU2LCAweDlGNTcsIDB4OUY1OCwgMHg1MzM3LAorICAgIDB4NTZCMiwgMHg1NkI1LCAweDU2QjMsIDB4NThFMywgMHg1QjQ1LCAweDVEQzYsIDB4NURDNywgMHg1RUVFLCAweDVFRUYsCisgICAgMHg1RkMwLCAweDVGQzEsIDB4NjFGOSwgMHg2NTE3LCAweDY1MTYsIDB4NjUxNSwgMHg2NTEzLCAweDY1REYsIDB4NjZFOCwKKyAgICAweDY2RTMsIDB4NjZFNCwgMHg2QUYzLCAweDZBRjAsIDB4NkFFQSwgMHg2QUU4LCAweDZBRjksIDB4NkFGMSwgMHg2QUVFLAorICAgIDB4NkFFRiwgMHg3MDNDLCAweDcwMzUsIDB4NzAyRiwgMHg3MDM3LCAweDcwMzQsIDB4NzAzMSwgMHg3MDQyLCAweDcwMzgsCisgICAgMHg3MDNGLCAweDcwM0EsIDB4NzAzOSwgMHg3MDJBLCAweDcwNDAsIDB4NzAzQiwgMHg3MDMzLCAweDcwNDEsIDB4NzIxMywKKyAgICAweDcyMTQsIDB4NzJBOCwgMHg3MzdELCAweDczN0MsIDB4NzRCQSwgMHg3NkFCLCAweDc2QUEsIDB4NzZCRSwgMHg3NkVELAorICAgIDB4NzdDQywgMHg3N0NFLCAweDc3Q0YsIDB4NzdDRCwgMHg3N0YyLCAweDc5MjUsIDB4NzkyMywgMHg3OTI3LCAweDc5MjgsCisgICAgMHg3OTI0LCAweDc5MjksIDB4NzlCMiwgMHg3QTZFLCAweDdBNkMsIDB4N0E2RCwgMHg3QUY3LCAweDdDNDksIDB4N0M0OCwKKyAgICAweDdDNEEsIDB4N0M0NywgMHg3QzQ1LCAweDdDRUUsIDB4N0U3QiwgMHg3RTdFLCAweDdFODEsIDB4N0U4MCwgMHg3RkJBLAorICAgIDB4N0ZGRiwgMHg4MDc5LCAweDgxREIsIDB4ODFEOSwgMHg4MjY4LCAweDgyNjksIDB4ODYyMiwgMHg4NUZGLCAweDg2MDEsCisgICAgMHg4NUZFLCAweDg2MUIsIDB4ODYwMCwgMHg4NUY2LCAweDg2MDQsIDB4ODYwOSwgMHg4NjA1LCAweDg2MEMsIDB4ODVGRCwKKyAgICAweDg4MTksIDB4ODgxMCwgMHg4ODExLCAweDg4MTcsIDB4ODgxMywgMHg4ODE2LCAweDg5NjMsIDB4ODk2NiwgMHg4OUI5LAorICAgIDB4ODlGNywgMHg4QjYwLCAweDhCNkEsIDB4OEI1RCwgMHg4QjY4LCAweDhCNjMsIDB4OEI2NSwgMHg4QjY3LCAweDhCNkQsCisgICAgMHg4REFFLCAweDhFODYsIDB4OEU4OCwgMHg4RTg0LCAweDhGNTksIDB4OEY1NiwgMHg4RjU3LCAweDhGNTUsIDB4OEY1OCwKKyAgICAweDhGNUEsIDB4OTA4RCwgMHg5MTQzLCAweDkxNDEsIDB4OTFCNywgMHg5MUI1LCAweDkxQjIsIDB4OTFCMywgMHg5NDBCLAorICAgIDB4OTQxMywgMHg5M0ZCLCAweDk0MjAsIDB4OTQwRiwgMHg5NDE0LCAweDkzRkUsIDB4OTQxNSwgMHg5NDEwLCAweDk0MjgsCisgICAgMHg5NDE5LCAweDk0MEQsIDB4OTNGNSwgMHg5NDAwLCAweDkzRjcsIDB4OTQwNywgMHg5NDBFLCAweDk0MTYsIDB4OTQxMiwKKyAgICAweDkzRkEsIDB4OTQwOSwgMHg5M0Y4LCAweDk0M0MsIDB4OTQwQSwgMHg5M0ZGLCAweDkzRkMsIDB4OTQwQywgMHg5M0Y2LAorICAgIDB4OTQxMSwgMHg5NDA2LCAweDk1REUsIDB4OTVFMCwgMHg5NURGLCAweDk3MkUsIDB4OTcyRiwgMHg5N0I5LCAweDk3QkIsCisgICAgMHg5N0ZELCAweDk3RkUsIDB4OTg2MCwgMHg5ODYyLCAweDk4NjMsIDB4OTg1RiwgMHg5OEMxLCAweDk4QzIsIDB4OTk1MCwKKyAgICAweDk5NEUsIDB4OTk1OSwgMHg5OTRDLCAweDk5NEIsIDB4OTk1MywgMHg5QTMyLCAweDlBMzQsIDB4OUEzMSwgMHg5QTJDLAorICAgIDB4OUEyQSwgMHg5QTM2LCAweDlBMjksIDB4OUEyRSwgMHg5QTM4LCAweDlBMkQsIDB4OUFDNywgMHg5QUNBLCAweDlBQzYsCisgICAgMHg5QjEwLCAweDlCMTIsIDB4OUIxMSwgMHg5QzBCLCAweDlDMDgsIDB4OUJGNywgMHg5QzA1LCAweDlDMTIsIDB4OUJGOCwKKyAgICAweDlDNDAsIDB4OUMwNywgMHg5QzBFLCAweDlDMDYsIDB4OUMxNywgMHg5QzE0LCAweDlDMDksIDB4OUQ5RiwgMHg5RDk5LAorICAgIDB4OURBNCwgMHg5RDlELCAweDlEOTIsIDB4OUQ5OCwgMHg5RDkwLCAweDlEOUIsIDB4OURBMCwgMHg5RDk0LCAweDlEOUMsCisgICAgMHg5REFBLCAweDlEOTcsIDB4OURBMSwgMHg5RDlBLCAweDlEQTIsIDB4OURBOCwgMHg5RDlFLCAweDlEQTMsIDB4OURCRiwKKyAgICAweDlEQTksIDB4OUQ5NiwgMHg5REE2LCAweDlEQTcsIDB4OUU5OSwgMHg5RTlCLCAweDlFOUEsIDB4OUVFNSwgMHg5RUU0LAorICAgIDB4OUVFNywgMHg5RUU2LCAweDlGMzAsIDB4OUYyRSwgMHg5RjVCLCAweDlGNjAsIDB4OUY1RSwgMHg5RjVELCAweDlGNTksCisgICAgMHg5RjkxLCAweDUxM0EsIDB4NTEzOSwgMHg1Mjk4LCAweDUyOTcsIDB4NTZDMywgMHg1NkJELCAweDU2QkUsIDB4NUI0OCwKKyAgICAweDVCNDcsIDB4NURDQiwgMHg1RENGLCAweDVFRjEsIDB4NjFGRCwgMHg2NTFCLCAweDZCMDIsIDB4NkFGQywgMHg2QjAzLAorICAgIDB4NkFGOCwgMHg2QjAwLCAweDcwNDMsIDB4NzA0NCwgMHg3MDRBLCAweDcwNDgsIDB4NzA0OSwgMHg3MDQ1LCAweDcwNDYsCisgICAgMHg3MjFELCAweDcyMUEsIDB4NzIxOSwgMHg3MzdFLCAweDc1MTcsIDB4NzY2QSwgMHg3N0QwLCAweDc5MkQsIDB4NzkzMSwKKyAgICAweDc5MkYsIDB4N0M1NCwgMHg3QzUzLCAweDdDRjIsIDB4N0U4QSwgMHg3RTg3LCAweDdFODgsIDB4N0U4QiwgMHg3RTg2LAorICAgIDB4N0U4RCwgMHg3RjRELCAweDdGQkIsIDB4ODAzMCwgMHg4MURELCAweDg2MTgsIDB4ODYyQSwgMHg4NjI2LCAweDg2MUYsCisgICAgMHg4NjIzLCAweDg2MUMsIDB4ODYxOSwgMHg4NjI3LCAweDg2MkUsIDB4ODYyMSwgMHg4NjIwLCAweDg2MjksIDB4ODYxRSwKKyAgICAweDg2MjUsIDB4ODgyOSwgMHg4ODFELCAweDg4MUIsIDB4ODgyMCwgMHg4ODI0LCAweDg4MUMsIDB4ODgyQiwgMHg4ODRBLAorICAgIDB4ODk2RCwgMHg4OTY5LCAweDg5NkUsIDB4ODk2QiwgMHg4OUZBLCAweDhCNzksIDB4OEI3OCwgMHg4QjQ1LCAweDhCN0EsCisgICAgMHg4QjdCLCAweDhEMTAsIDB4OEQxNCwgMHg4REFGLCAweDhFOEUsIDB4OEU4QywgMHg4RjVFLCAweDhGNUIsIDB4OEY1RCwKKyAgICAweDkxNDYsIDB4OTE0NCwgMHg5MTQ1LCAweDkxQjksIDB4OTQzRiwgMHg5NDNCLCAweDk0MzYsIDB4OTQyOSwgMHg5NDNELAorICAgIDB4OTQzMCwgMHg5NDM5LCAweDk0MkEsIDB4OTQzNywgMHg5NDJDLCAweDk0NDAsIDB4OTQzMSwgMHg5NUU1LCAweDk1RTQsCisgICAgMHg5NUUzLCAweDk3MzUsIDB4OTczQSwgMHg5N0JGLCAweDk3RTEsIDB4OTg2NCwgMHg5OEM5LCAweDk4QzYsIDB4OThDMCwKKyAgICAweDk5NTgsIDB4OTk1NiwgMHg5QTM5LCAweDlBM0QsIDB4OUE0NiwgMHg5QTQ0LCAweDlBNDIsIDB4OUE0MSwgMHg5QTNBLAorICAgIDB4OUEzRiwgMHg5QUNELCAweDlCMTUsIDB4OUIxNywgMHg5QjE4LCAweDlCMTYsIDB4OUIzQSwgMHg5QjUyLCAweDlDMkIsCisgICAgMHg5QzFELCAweDlDMUMsIDB4OUMyQywgMHg5QzIzLCAweDlDMjgsIDB4OUMyOSwgMHg5QzI0LCAweDlDMjEsIDB4OURCNywKKyAgICAweDlEQjYsIDB4OURCQywgMHg5REMxLCAweDlEQzcsIDB4OURDQSwgMHg5RENGLCAweDlEQkUsIDB4OURDNSwgMHg5REMzLAorICAgIDB4OURCQiwgMHg5REI1LCAweDlEQ0UsIDB4OURCOSwgMHg5REJBLCAweDlEQUMsIDB4OURDOCwgMHg5REIxLCAweDlEQUQsCisgICAgMHg5RENDLCAweDlEQjMsIDB4OURDRCwgMHg5REIyLCAweDlFN0EsIDB4OUU5QywgMHg5RUVCLCAweDlFRUUsIDB4OUVFRCwKKyAgICAweDlGMUIsIDB4OUYxOCwgMHg5RjFBLCAweDlGMzEsIDB4OUY0RSwgMHg5RjY1LCAweDlGNjQsIDB4OUY5MiwgMHg0RUI5LAorICAgIDB4NTZDNiwgMHg1NkM1LCAweDU2Q0IsIDB4NTk3MSwgMHg1QjRCLCAweDVCNEMsIDB4NURENSwgMHg1REQxLCAweDVFRjIsCisgICAgMHg2NTIxLCAweDY1MjAsIDB4NjUyNiwgMHg2NTIyLCAweDZCMEIsIDB4NkIwOCwgMHg2QjA5LCAweDZDMEQsIDB4NzA1NSwKKyAgICAweDcwNTYsIDB4NzA1NywgMHg3MDUyLCAweDcyMUUsIDB4NzIxRiwgMHg3MkE5LCAweDczN0YsIDB4NzREOCwgMHg3NEQ1LAorICAgIDB4NzREOSwgMHg3NEQ3LCAweDc2NkQsIDB4NzZBRCwgMHg3OTM1LCAweDc5QjQsIDB4N0E3MCwgMHg3QTcxLCAweDdDNTcsCisgICAgMHg3QzVDLCAweDdDNTksIDB4N0M1QiwgMHg3QzVBLCAweDdDRjQsIDB4N0NGMSwgMHg3RTkxLCAweDdGNEYsIDB4N0Y4NywKKyAgICAweDgxREUsIDB4ODI2QiwgMHg4NjM0LCAweDg2MzUsIDB4ODYzMywgMHg4NjJDLCAweDg2MzIsIDB4ODYzNiwgMHg4ODJDLAorICAgIDB4ODgyOCwgMHg4ODI2LCAweDg4MkEsIDB4ODgyNSwgMHg4OTcxLCAweDg5QkYsIDB4ODlCRSwgMHg4OUZCLCAweDhCN0UsCisgICAgMHg4Qjg0LCAweDhCODIsIDB4OEI4NiwgMHg4Qjg1LCAweDhCN0YsIDB4OEQxNSwgMHg4RTk1LCAweDhFOTQsIDB4OEU5QSwKKyAgICAweDhFOTIsIDB4OEU5MCwgMHg4RTk2LCAweDhFOTcsIDB4OEY2MCwgMHg4RjYyLCAweDkxNDcsIDB4OTQ0QywgMHg5NDUwLAorICAgIDB4OTQ0QSwgMHg5NDRCLCAweDk0NEYsIDB4OTQ0NywgMHg5NDQ1LCAweDk0NDgsIDB4OTQ0OSwgMHg5NDQ2LCAweDk3M0YsCisgICAgMHg5N0UzLCAweDk4NkEsIDB4OTg2OSwgMHg5OENCLCAweDk5NTQsIDB4OTk1QiwgMHg5QTRFLCAweDlBNTMsIDB4OUE1NCwKKyAgICAweDlBNEMsIDB4OUE0RiwgMHg5QTQ4LCAweDlBNEEsIDB4OUE0OSwgMHg5QTUyLCAweDlBNTAsIDB4OUFEMCwgMHg5QjE5LAorICAgIDB4OUIyQiwgMHg5QjNCLCAweDlCNTYsIDB4OUI1NSwgMHg5QzQ2LCAweDlDNDgsIDB4OUMzRiwgMHg5QzQ0LCAweDlDMzksCisgICAgMHg5QzMzLCAweDlDNDEsIDB4OUMzQywgMHg5QzM3LCAweDlDMzQsIDB4OUMzMiwgMHg5QzNELCAweDlDMzYsIDB4OUREQiwKKyAgICAweDlERDIsIDB4OURERSwgMHg5RERBLCAweDlEQ0IsIDB4OUREMCwgMHg5RERDLCAweDlERDEsIDB4OURERiwgMHg5REU5LAorICAgIDB4OUREOSwgMHg5REQ4LCAweDlERDYsIDB4OURGNSwgMHg5REQ1LCAweDlEREQsIDB4OUVCNiwgMHg5RUYwLCAweDlGMzUsCisgICAgMHg5RjMzLCAweDlGMzIsIDB4OUY0MiwgMHg5RjZCLCAweDlGOTUsIDB4OUZBMiwgMHg1MTNELCAweDUyOTksIDB4NThFOCwKKyAgICAweDU4RTcsIDB4NTk3MiwgMHg1QjRELCAweDVERDgsIDB4ODgyRiwgMHg1RjRGLCAweDYyMDEsIDB4NjIwMywgMHg2MjA0LAorICAgIDB4NjUyOSwgMHg2NTI1LCAweDY1OTYsIDB4NjZFQiwgMHg2QjExLCAweDZCMTIsIDB4NkIwRiwgMHg2QkNBLCAweDcwNUIsCisgICAgMHg3MDVBLCAweDcyMjIsIDB4NzM4MiwgMHg3MzgxLCAweDczODMsIDB4NzY3MCwgMHg3N0Q0LCAweDdDNjcsIDB4N0M2NiwKKyAgICAweDdFOTUsIDB4ODI2QywgMHg4NjNBLCAweDg2NDAsIDB4ODYzOSwgMHg4NjNDLCAweDg2MzEsIDB4ODYzQiwgMHg4NjNFLAorICAgIDB4ODgzMCwgMHg4ODMyLCAweDg4MkUsIDB4ODgzMywgMHg4OTc2LCAweDg5NzQsIDB4ODk3MywgMHg4OUZFLCAweDhCOEMsCisgICAgMHg4QjhFLCAweDhCOEIsIDB4OEI4OCwgMHg4QzQ1LCAweDhEMTksIDB4OEU5OCwgMHg4RjY0LCAweDhGNjMsIDB4OTFCQywKKyAgICAweDk0NjIsIDB4OTQ1NSwgMHg5NDVELCAweDk0NTcsIDB4OTQ1RSwgMHg5N0M0LCAweDk3QzUsIDB4OTgwMCwgMHg5QTU2LAorICAgIDB4OUE1OSwgMHg5QjFFLCAweDlCMUYsIDB4OUIyMCwgMHg5QzUyLCAweDlDNTgsIDB4OUM1MCwgMHg5QzRBLCAweDlDNEQsCisgICAgMHg5QzRCLCAweDlDNTUsIDB4OUM1OSwgMHg5QzRDLCAweDlDNEUsIDB4OURGQiwgMHg5REY3LCAweDlERUYsIDB4OURFMywKKyAgICAweDlERUIsIDB4OURGOCwgMHg5REU0LCAweDlERjYsIDB4OURFMSwgMHg5REVFLCAweDlERTYsIDB4OURGMiwgMHg5REYwLAorICAgIDB4OURFMiwgMHg5REVDLCAweDlERjQsIDB4OURGMywgMHg5REU4LCAweDlERUQsIDB4OUVDMiwgMHg5RUQwLCAweDlFRjIsCisgICAgMHg5RUYzLCAweDlGMDYsIDB4OUYxQywgMHg5RjM4LCAweDlGMzcsIDB4OUYzNiwgMHg5RjQzLCAweDlGNEYsIDB4OUY3MSwKKyAgICAweDlGNzAsIDB4OUY2RSwgMHg5RjZGLCAweDU2RDMsIDB4NTZDRCwgMHg1QjRFLCAweDVDNkQsIDB4NjUyRCwgMHg2NkVELAorICAgIDB4NjZFRSwgMHg2QjEzLCAweDcwNUYsIDB4NzA2MSwgMHg3MDVELCAweDcwNjAsIDB4NzIyMywgMHg3NERCLCAweDc0RTUsCisgICAgMHg3N0Q1LCAweDc5MzgsIDB4NzlCNywgMHg3OUI2LCAweDdDNkEsIDB4N0U5NywgMHg3Rjg5LCAweDgyNkQsIDB4ODY0MywKKyAgICAweDg4MzgsIDB4ODgzNywgMHg4ODM1LCAweDg4NEIsIDB4OEI5NCwgMHg4Qjk1LCAweDhFOUUsIDB4OEU5RiwgMHg4RUEwLAorICAgIDB4OEU5RCwgMHg5MUJFLCAweDkxQkQsIDB4OTFDMiwgMHg5NDZCLCAweDk0NjgsIDB4OTQ2OSwgMHg5NkU1LCAweDk3NDYsCisgICAgMHg5NzQzLCAweDk3NDcsIDB4OTdDNywgMHg5N0U1LCAweDlBNUUsIDB4OUFENSwgMHg5QjU5LCAweDlDNjMsIDB4OUM2NywKKyAgICAweDlDNjYsIDB4OUM2MiwgMHg5QzVFLCAweDlDNjAsIDB4OUUwMiwgMHg5REZFLCAweDlFMDcsIDB4OUUwMywgMHg5RTA2LAorICAgIDB4OUUwNSwgMHg5RTAwLCAweDlFMDEsIDB4OUUwOSwgMHg5REZGLCAweDlERkQsIDB4OUUwNCwgMHg5RUEwLCAweDlGMUUsCisgICAgMHg5RjQ2LCAweDlGNzQsIDB4OUY3NSwgMHg5Rjc2LCAweDU2RDQsIDB4NjUyRSwgMHg2NUI4LCAweDZCMTgsIDB4NkIxOSwKKyAgICAweDZCMTcsIDB4NkIxQSwgMHg3MDYyLCAweDcyMjYsIDB4NzJBQSwgMHg3N0Q4LCAweDc3RDksIDB4NzkzOSwgMHg3QzY5LAorICAgIDB4N0M2QiwgMHg3Q0Y2LCAweDdFOUEsIDB4N0U5OCwgMHg3RTlCLCAweDdFOTksIDB4ODFFMCwgMHg4MUUxLCAweDg2NDYsCisgICAgMHg4NjQ3LCAweDg2NDgsIDB4ODk3OSwgMHg4OTdBLCAweDg5N0MsIDB4ODk3QiwgMHg4OUZGLCAweDhCOTgsIDB4OEI5OSwKKyAgICAweDhFQTUsIDB4OEVBNCwgMHg4RUEzLCAweDk0NkUsIDB4OTQ2RCwgMHg5NDZGLCAweDk0NzEsIDB4OTQ3MywgMHg5NzQ5LAorICAgIDB4OTg3MiwgMHg5OTVGLCAweDlDNjgsIDB4OUM2RSwgMHg5QzZELCAweDlFMEIsIDB4OUUwRCwgMHg5RTEwLCAweDlFMEYsCisgICAgMHg5RTEyLCAweDlFMTEsIDB4OUVBMSwgMHg5RUY1LCAweDlGMDksIDB4OUY0NywgMHg5Rjc4LCAweDlGN0IsIDB4OUY3QSwKKyAgICAweDlGNzksIDB4NTcxRSwgMHg3MDY2LCAweDdDNkYsIDB4ODgzQywgMHg4REIyLCAweDhFQTYsIDB4OTFDMywgMHg5NDc0LAorICAgIDB4OTQ3OCwgMHg5NDc2LCAweDk0NzUsIDB4OUE2MCwgMHg5QjJFLCAweDlDNzQsIDB4OUM3MywgMHg5QzcxLCAweDlDNzUsCisgICAgMHg5RTE0LCAweDlFMTMsIDB4OUVGNiwgMHg5RjBBLCAweDlGQTQsIDB4NzA2OCwgMHg3MDY1LCAweDdDRjcsIDB4ODY2QSwKKyAgICAweDg4M0UsIDB4ODgzRCwgMHg4ODNGLCAweDhCOUUsIDB4OEM5QywgMHg4RUE5LCAweDhFQzksIDB4OTc0QiwgMHg5ODczLAorICAgIDB4OTg3NCwgMHg5OENDLCAweDk5NjEsIDB4OTlBQiwgMHg5QTY0LCAweDlBNjYsIDB4OUE2NywgMHg5QjI0LCAweDlFMTUsCisgICAgMHg5RTE3LCAweDlGNDgsIDB4NjIwNywgMHg2QjFFLCAweDcyMjcsIDB4ODY0QywgMHg4RUE4LCAweDk0ODIsIDB4OTQ4MCwKKyAgICAweDk0ODEsIDB4OUE2OSwgMHg5QTY4LCAweDlFMTksIDB4ODY0QiwgMHg4QjlGLCAweDk0ODMsIDB4OUM3OSwgMHg5RUI3LAorICAgIDB4NzY3NSwgMHg5QTZCLCAweDlDN0EsIDB4OUUxRCwgMHg3MDY5LCAweDcwNkEsIDB4NzIyOSwgMHg5RUE0LCAweDlGN0UsCisgICAgMHg5RjQ5LCAweDlGOTgsIDB4RkUxOSwgMHgyMjNDLCAweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwKKyAgICAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LCAweDAwMjgsIDB4MDAyOSwgMHgwMDJBLCAweDAwMkIsIDB4MDAyQywgMHgwMDJELAorICAgIDB4MDAyRSwgMHgwMDJGLCAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsCisgICAgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgwMDNBLCAweDAwM0IsIDB4MDAzQywgMHgwMDNELCAweDAwM0UsIDB4MDAzRiwKKyAgICAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LAorICAgIDB4MDA0OSwgMHgwMDRBLCAweDAwNEIsIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsCisgICAgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwKKyAgICAweDAwNUIsIDB4MDA1QywgMHgwMDVELCAweDAwNUUsIDB4MDA1RiwgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLAorICAgIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsCisgICAgMHgwMDZELCAweDAwNkUsIDB4MDA2RiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwKKyAgICAweDAwNzYsIDB4MDA3NywgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDdCLCAweDAwN0MsIDB4MDA3RCwgMHgwMDdFLAorICAgIDB4RkUzMywgMHgyNTc0LCAweEZFMzQsIDB4RkU0RiwgMHgwMzA4LCAweEZGM0UsIDB4MzBGRCwgMHgzMEZFLCAweDMwOUQsCisgICAgMHgzMDlFLCAweEZGRkQsIDB4MzAwNSwgMHgzMDA2LCAweDMwMDcsIDB4MzBGQywgMHhGRjNCLCAweEZGM0QsIDB4MjczRCwKKyAgICAweDMwNDEsIDB4MzA0MiwgMHgzMDQzLCAweDMwNDQsIDB4MzA0NSwgMHgzMDQ2LCAweDMwNDcsIDB4MzA0OCwgMHgzMDQ5LAorICAgIDB4MzA0QSwgMHgzMDRCLCAweDMwNEMsIDB4MzA0RCwgMHgzMDRFLCAweDMwNEYsIDB4MzA1MCwgMHgzMDUxLCAweDMwNTIsCisgICAgMHgzMDUzLCAweDMwNTQsIDB4MzA1NSwgMHgzMDU2LCAweDMwNTcsIDB4MzA1OCwgMHgzMDU5LCAweDMwNUEsIDB4MzA1QiwKKyAgICAweDMwNUMsIDB4MzA1RCwgMHgzMDVFLCAweDMwNUYsIDB4MzA2MCwgMHgzMDYxLCAweDMwNjIsIDB4MzA2MywgMHgzMDY0LAorICAgIDB4MzA2NSwgMHgzMDY2LCAweDMwNjcsIDB4MzA2OCwgMHgzMDY5LCAweDMwNkEsIDB4MzA2QiwgMHgzMDZDLCAweDMwNkQsCisgICAgMHgzMDZFLCAweDMwNkYsIDB4MzA3MCwgMHgzMDcxLCAweDMwNzIsIDB4MzA3MywgMHgzMDc0LCAweDMwNzUsIDB4MzA3NiwKKyAgICAweDMwNzcsIDB4MzA3OCwgMHgzMDc5LCAweDMwN0EsIDB4MzA3QiwgMHgzMDdDLCAweDMwN0QsIDB4MzA3RSwgMHgzMDdGLAorICAgIDB4MzA4MCwgMHgzMDgxLCAweDMwODIsIDB4MzA4MywgMHgzMDg0LCAweDMwODUsIDB4MzA4NiwgMHgzMDg3LCAweDMwODgsCisgICAgMHgzMDg5LCAweDMwOEEsIDB4MzA4QiwgMHgzMDhDLCAweDMwOEQsIDB4MzA4RSwgMHgzMDhGLCAweDMwOTAsIDB4MzA5MSwKKyAgICAweDMwOTIsIDB4MzA5MywgMHgzMEExLCAweDMwQTIsIDB4MzBBMywgMHgzMEE0LCAweDMwQTUsIDB4MzBBNiwgMHgzMEE3LAorICAgIDB4MzBBOCwgMHgzMEE5LCAweDMwQUEsIDB4MzBBQiwgMHgzMEFDLCAweDMwQUQsIDB4MzBBRSwgMHgzMEFGLCAweDMwQjAsCisgICAgMHgzMEIxLCAweDMwQjIsIDB4MzBCMywgMHgzMEI0LCAweDMwQjUsIDB4MzBCNiwgMHgzMEI3LCAweDMwQjgsIDB4MzBCOSwKKyAgICAweDMwQkEsIDB4MzBCQiwgMHgzMEJDLCAweDMwQkQsIDB4MzBCRSwgMHgzMEJGLCAweDMwQzAsIDB4MzBDMSwgMHgzMEMyLAorICAgIDB4MzBDMywgMHgzMEM0LCAweDMwQzUsIDB4MzBDNiwgMHgzMEM3LCAweDMwQzgsIDB4MzBDOSwgMHgzMENBLCAweDMwQ0IsCisgICAgMHgzMENDLCAweDMwQ0QsIDB4MzBDRSwgMHgzMENGLCAweDMwRDAsIDB4MzBEMSwgMHgzMEQyLCAweDMwRDMsIDB4MzBENCwKKyAgICAweDMwRDUsIDB4MzBENiwgMHgzMEQ3LCAweDMwRDgsIDB4MzBEOSwgMHgzMERBLCAweDMwREIsIDB4MzBEQywgMHgzMERELAorICAgIDB4MzBERSwgMHgzMERGLCAweDMwRTAsIDB4MzBFMSwgMHgzMEUyLCAweDMwRTMsIDB4MzBFNCwgMHgzMEU1LCAweDMwRTYsCisgICAgMHgzMEU3LCAweDMwRTgsIDB4MzBFOSwgMHgzMEVBLCAweDMwRUIsIDB4MzBFQywgMHgzMEVELCAweDMwRUUsIDB4MzBFRiwKKyAgICAweDMwRjAsIDB4MzBGMSwgMHgzMEYyLCAweDMwRjMsIDB4MzBGNCwgMHgzMEY1LCAweDMwRjYsIDB4MDQxMCwgMHgwNDExLAorICAgIDB4MDQxMiwgMHgwNDEzLCAweDA0MTQsIDB4MDQxNSwgMHgwNDAxLCAweDA0MTYsIDB4MDQxNywgMHgwNDE4LCAweDA0MTksCisgICAgMHgwNDFBLCAweDA0MUIsIDB4MDQxQywgMHgwNDFELCAweDA0MUUsIDB4MDQxRiwgMHgwNDIwLCAweDA0MjEsIDB4MDQyMiwKKyAgICAweDA0MjMsIDB4MDQyNCwgMHgwNDI1LCAweDA0MjYsIDB4MDQyNywgMHgwNDI4LCAweDA0MjksIDB4MDQyQSwgMHgwNDJCLAorICAgIDB4MDQyQywgMHgwNDJELCAweDA0MkUsIDB4MDQyRiwgMHgwNDMwLCAweDA0MzEsIDB4MDQzMiwgMHgwNDMzLCAweDA0MzQsCisgICAgMHgwNDM1LCAweDA0NTEsIDB4MDQzNiwgMHgwNDM3LCAweDA0MzgsIDB4MDQzOSwgMHgwNDNBLCAweDA0M0IsIDB4MDQzQywKKyAgICAweDA0M0QsIDB4MDQzRSwgMHgwNDNGLCAweDA0NDAsIDB4MDQ0MSwgMHgwNDQyLCAweDA0NDMsIDB4MDQ0NCwgMHgwNDQ1LAorICAgIDB4MDQ0NiwgMHgwNDQ3LCAweDA0NDgsIDB4MDQ0OSwgMHgwNDRBLCAweDA0NEIsIDB4MDQ0QywgMHgwNDRELCAweDA0NEUsCisgICAgMHgwNDRGLCAweDIxRTcsIDB4MjFCOCwgMHgyMUI5LCAweDRFNDEsIDB4MDAwMCwgMHg0RTVBLCAweDAwMDAsIDB4NTIwMiwKKyAgICAweDQ0OTEsIDB4OUZCMCwgMHg1MTg4LCAweDlGQjEsIDB4MDAwMCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELAorICAgIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsCisgICAgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwKKyAgICAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELAorICAgIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsCisgICAgMHgwMEFDLCAweEZGRTQsIDB4RkYwNywgMHhGRjAyLCAweDMyMzEsIDB4MjExNiwgMHgyMTIxLCAweDc4ODEsIDB4OTJCOSwKKyAgICAweDg4Q0YsIDB4NThCQiwgMHg2MDUyLCAweDdDQTcsIDB4NUFGQSwgMHgyNTU0LCAweDI1NjYsIDB4MjU1NywgMHgyNTYwLAorICAgIDB4MjU2QywgMHgyNTYzLCAweDI1NUEsIDB4MjU2OSwgMHgyNTVELCAweDI1NTIsIDB4MjU2NCwgMHgyNTU1LCAweEZGRkQsCisgICAgMHhGRkZELCAweEZGRkQsIDB4MjU1OCwgMHgyNTY3LCAweDI1NUIsIDB4MjU1MywgMHgyNTY1LCAweDI1NTYsIDB4MjU1RiwKKyAgICAweDI1NkIsIDB4MjU2MiwgMHgyNTU5LCAweDI1NjgsIDB4MjU1QywgMHgyNTUxLCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELAorICAgIDB4RkZGRCwgMHhGRkZELCAweDI1OTMsIDB4RkZGRCwgMHhGRkZELCAweEZFMTAsIDB4RkUxMSwgMHhGRTEyLCAweEZGRkQsCisgICAgMHhGRTE0LCAweEZFMTMsIDB4RkUxNiwgMHhGRTE1LCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwKKyAgICAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELCAweEZGRkQsIDB4RkZGRCwgMHhGRkZELAorICAgIDB4RkZGRCwgMHhGRkZELCAweDAwMDAsIDB4NTdCRSwgMHgwMDAwLCAweDcxM0UsIDB4MDAwMCwgMHg2OUEyLCAweDAwMDAsCisgICAgMHg1Qjc0LCAweDdBNDksIDB4MDAwMCwgMHgwMDAwLCAweDdBNjUsIDB4N0E3RCwgMHgwMDAwLCAweDdBQkIsIDB4N0FCMCwKKyAgICAweDdBQzIsIDB4N0FDMywgMHg3MUQxLCAweDAwMDAsIDB4NDFDQSwgMHg3QURBLCAweDdBREQsIDB4N0FFQSwgMHg0MUVGLAorICAgIDB4NTRCMiwgMHgwMDAwLCAweDdCMEIsIDB4N0I1NSwgMHg3QjI5LCAweDAwMDAsIDB4MDAwMCwgMHg3QkEyLCAweDdCNkYsCisgICAgMHg4MzlDLCAweDAwMDAsIDB4MDAwMCwgMHg3QkQwLCAweDg0MjEsIDB4N0I5MiwgMHhGRkZELCAweDAwMDAsIDB4RkZGRCwKKyAgICAweDg0OTIsIDB4N0JGQSwgMHhGRkZELCAweDdDMzUsIDB4MDAwMCwgMHg3QzQ0LCAweDdDODMsIDB4MDAwMCwgMHg3Q0E2LAorICAgIDB4MDAwMCwgMHg3Q0M5LCAweDdDQzcsIDB4N0NFNiwgMHhGRkZELCAweDdDRjMsIDB4N0NGNSwgMHg3RTY3LCAweDQ1MUQsCisgICAgMHgwMDAwLCAweDdENUQsIDB4MDAwMCwgMHg3RDg5LCAweDdEQUIsIDB4NzEzNSwgMHg3REIzLCAweDdERDYsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4N0RFNCwgMHgzRDEzLCAweDdERjUsIDB4MDAwMCwgMHg3REU1LCAweDAwMDAsIDB4RkZGRCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg3RTZFLCAweEZGRkQsIDB4NDMyQiwgMHg5NDZDLCAweDdFMjcsIDB4N0Y0MCwgMHg3RjQxLCAweDdGNDcsCisgICAgMHg3OTM2LCAweDAwMDAsIDB4OTlFMSwgMHg3Rjk3LCAweDAwMDAsIDB4N0ZBMywgMHgwMDAwLCAweDAwMDAsIDB4NDU1QywKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg3RkZBLCAweDAwMDAsIDB4RkE1QiwgMHg4MDA4LCAweDgwMUQsIDB4RkZGRCwgMHg4MDJGLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDgwM0IsIDB4ODAzQywgMHg4MDYxLCAweDAwMDAsIDB4NDk4OSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDY3MjUsIDB4ODBBNywgMHgwMDAwLCAweDgxMDcsIDB4ODExQSwgMHg1OEIwLCAweDAwMDAsIDB4NkM3RiwKKyAgICAweDAwMDAsIDB4NjRFNywgMHgwMDAwLCAweDgyMTgsIDB4MDAwMCwgMHg2QTUzLCAweDAwMDAsIDB4MDAwMCwgMHg0NDdBLAorICAgIDB4ODIyOSwgMHgwMDAwLCAweDAwMDAsIDB4NEZGOSwgMHgwMDAwLCAweDg0RTIsIDB4ODM2MiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MkFBLCAweDY5MUIsIDB4MDAwMCwgMHg0MURCLCAweDg1NEIsIDB4ODJEMCwKKyAgICAweDgzMUEsIDB4MDAwMCwgMHgwMDAwLCAweDM2QzEsIDB4MDAwMCwgMHgwMDAwLCAweDgyN0IsIDB4ODJFMiwgMHg4MzE4LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDNEQkYsIDB4ODMxRCwgMHg1NUVDLCAweDgzODUsCisgICAgMHg0NTBCLCAweDAwMDAsIDB4ODNBQywgMHhGRkZELCAweDgzRDMsIDB4MDAwMCwgMHg2QTU3LCAweDg1NUEsIDB4MzQ5NiwKKyAgICAweDAwMDAsIDB4ODQ1OCwgMHgwMDAwLCAweDg0NzEsIDB4M0REMywgMHg0NEU0LCAweDZBQTcsIDB4ODQ0QSwgMHg3OTU4LAorICAgIDB4RkZGRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NERFLCAweEZGRkQsIDB4ODM5MSwgMHg0NEEwLCAweDg0OTMsCisgICAgMHg4NEU0LCAweDAwMDAsIDB4NDI0MCwgMHgwMDAwLCAweDQ1NDMsIDB4ODUzNCwgMHg1QUYyLCAweDQ1MjMsIDB4NDUyNywKKyAgICAweDg1NzMsIDB4NDUxNiwgMHg2N0JGLCAweDg2MTYsIDB4MDAwMCwgMHgwMDAwLCAweDg1QzEsIDB4MDAwMCwgMHg4NjAyLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NDU2QSwgMHg4NjI4LCAweDM2NDgsIDB4MDAwMCwgMHg1M0Y3LCAweDAwMDAsCisgICAgMHg4NjdFLCAweEZGRkQsIDB4MDAwMCwgMHg4N0VFLCAweDAwMDAsIDB4ODdCMSwgMHg4N0RBLCAweDg4MEYsIDB4NTY2MSwKKyAgICAweDg2NkMsIDB4Njg1NiwgMHg0NjBGLCAweDg4NDUsIDB4ODg0NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODVFLAorICAgIDB4ODg5QywgMHg0NjVCLCAweDg4QjQsIDB4ODhCNSwgMHg4OEM1LCAweDAwMDAsIDB4ODk4NywgMHhGRkZELCAweEZGRkQsCisgICAgMHhGRkZELCAweDg5QTcsIDB4ODlCQywgMHgwMDAwLCAweDg5RTcsIDB4MDAwMCwgMHgwMDAwLCAweDhBOUMsIDB4Nzc5MywKKyAgICAweDkxRkUsIDB4OEE5MCwgMHgwMDAwLCAweDdBRTksIDB4MDAwMCwgMHg0NzEzLCAweDAwMDAsIDB4NzE3QywgMHg4QjBDLAorICAgIDB4OEIxRiwgMHgwMDAwLCAweDAwMDAsIDB4OEIzRiwgMHhGRkZELCAweDhCNEQsIDB4OEFBOSwgMHgwMDAwLCAweDhCOTAsCisgICAgMHg4QjlCLCAweDhBQUYsIDB4MDAwMCwgMHg0NjE1LCAweDg4NEYsIDB4OEM5QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDM3MjUsIDB4MDAwMCwgMHg4Q0Q2LCAweDAwMDAsIDB4MDAwMCwgMHg4RDEyLCAweDhEMDMsIDB4MDAwMCwgMHg4Q0RCLAorICAgIDB4NzA1QywgMHg4RDExLCAweDNFRDAsIDB4MDAwMCwgMHg4REE5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDNCN0MsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4N0FFNywgMHg4RUFELCAweDhFQjYsIDB4OEVDMywgMHg5MkQ0LCAweDhGMTksIDB4OEYyRCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4RkE1LCAweDkzMDMsIDB4MDAwMCwgMHgwMDAwLCAweDhGQjMsIDB4RkZGRCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDVFRjgsIDB4MDAwMCwgMHg4RkY5LCAweEZGRkQsIDB4MDAwMCwgMHgzOTgwLCAweDAwMDAsCisgICAgMHg5MDM3LCAweDAwMDAsIDB4MDAwMCwgMHg5MDYxLCAweDAwMDAsIDB4MDAwMCwgMHg5MEE4LCAweDAwMDAsIDB4OTBDNCwKKyAgICAweDAwMDAsIDB4OTBBRSwgMHhGQTI2LCAweDkxNjcsIDB4OTFBOSwgMHg5MUM0LCAweDdDQUMsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OTIwRSwgMHg2QzlGLCAweDkyNDEsIDB4OTI2MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDkzMkMsIDB4OTM2QiwgMHgwMDAwLCAweDAwMDAsIDB4NUFDMywgMHgwMDAwLCAweDAwMDAsIDB4NDk2NSwKKyAgICAweDkyNDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTM3MywgMHg5NDVCLCAweDhFQkMsIDB4OTU4NSwgMHg5NUE2LAorICAgIDB4OTQyNiwgMHg5NUEwLCAweDZGRjYsIDB4NDJCOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg0OURGLCAweDZDMUMsCisgICAgMHg5NjdCLCAweDk2OTYsIDB4NDE2QywgMHg5NkEzLCAweDAwMDAsIDB4NjFEQSwgMHhFNEFELCAweDc4RjUsIDB4MDAwMCwKKyAgICAweDk2QkQsIDB4NTNDQywgMHg0OUExLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDk3MzEsIDB4ODY0MiwgMHg5NzM2LCAweDRBMEYsIDB4NDUzRCwgMHg0NTg1LCAweDAwMDAsCisgICAgMHg3MDc1LCAweDVCNDEsIDB4OTcxQiwgMHhGRkZELCAweDAwMDAsIDB4OTc1NywgMHg1QjRBLCAweDAwMDAsIDB4OTc1RiwKKyAgICAweDk0MjUsIDB4NTBEMCwgMHgwMDAwLCAweDAwMDAsIDB4OTc4OSwgMHg5NzlGLCAweDk3QjEsIDB4OTdCRSwgMHg5N0MwLAorICAgIDB4OTdEMiwgMHg5N0UwLCAweDAwMDAsIDB4OTdFRSwgMHg3NDFDLCAweDAwMDAsIDB4RkZGRCwgMHg5N0Y1LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDRBRDEsIDB4OTgzNCwgMHg5ODMzLCAweDk4NEIsIDB4OTg2NiwgMHgzQjBFLCAweDAwMDAsIDB4M0Q1MSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDk4Q0EsIDB4OThCNywgMHg5OEM4LCAweDk4QzcsIDB4NEFGRiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg1NUIwLCAweDk4RTEsIDB4OThFNiwgMHg5OEVDLCAweDkzNzgsIDB4OTkzOSwgMHgwMDAwLCAweDRCNzIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OTlGNSwgMHg5QTBDLCAweDlBM0IsIDB4OUExMCwgMHg5QTU4LCAweDAwMDAsIDB4MzZDNCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg5QUUwLCAweDlBRTIsIDB4MDAwMCwgMHg5QUY0LCAweDRDMEUsIDB4OUIxNCwgMHg5QjJELAorICAgIDB4MDAwMCwgMHg1MDM0LCAweDlCMzQsIDB4MzhDMywgMHgwMDAwLCAweDlCNTAsIDB4OUI0MCwgMHgwMDAwLCAweDVBNDUsCisgICAgMHgwMDAwLCAweDlCOEUsIDB4OUMwMiwgMHg5QkZGLCAweDlDMEMsIDB4MDAwMCwgMHg5REQ0LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OUQ3RSwgMHg5RDgzLCAweDAwMDAsIDB4OUUwRSwgMHg5REM0LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5RDM5LCAweDAwMDAsIDB4MDAwMCwgMHg5RTkwLCAweDlFOTUsCisgICAgMHg5RTlFLCAweDlFQTIsIDB4NEQzNCwgMHg5RUFBLCAweDlFQUYsIDB4MDAwMCwgMHg5RUMxLCAweDNCNjAsIDB4MzlFNSwKKyAgICAweDNEMUQsIDB4NEYzMiwgMHgzN0JFLCAweDAwMDAsIDB4OUYwMiwgMHg5RjA4LCAweDRCOTYsIDB4OTQyNCwgMHgwMDAwLAorICAgIDB4OUYxNywgMHgwMDAwLCAweDlGMzksIDB4NTY5RiwgMHg1NjhBLCAweDlGNDUsIDB4OTlCOCwgMHgwMDAwLCAweDk3RjIsCisgICAgMHg4NDdGLCAweEZGRkQsIDB4OUY2OSwgMHg3QURDLCAweDlGOEUsIDB4NzIxNiwgMHg0QkJFLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDcxNzcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NzM5RSwgMHgwMDAwLCAweDAwMDAsIDB4Nzk5RiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg5MzY5LCAweDkzRjMsIDB4MDAwMCwgMHg5MkVDLCAweDkzODEsIDB4OTNDQiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg3MjE3LCAweDNFRUIsIDB4Nzc3MiwgMHg3QTQzLCAweDcwRDAsIDB4MDAwMCwgMHgwMDAwLCAweDcxN0UsIDB4MDAwMCwKKyAgICAweDcwQTMsIDB4MDAwMCwgMHgwMDAwLCAweDNFQzcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MzcyMiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgzNkUxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDM3MjMsIDB4MDAwMCwgMHg1NzVCLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg1MDMsIDB4MDAwMCwgMHhGRkZELCAweDg0NTUsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg0NEY0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4NjdGOSwgMHgzNzMzLCAweDNDMTUsIDB4M0RFNywgMHg1ODZDLCAweDAwMDAsIDB4NjgxMCwgMHg0MDU3LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDU0Q0IsIDB4NTY5RSwgMHgwMDAwLCAweDU2OTIsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHhGRkZELCAweDAwMDAsIDB4OTM5QywgMHg0RUY4LCAweDUxMkIsIDB4MzgxOSwgMHgwMDAwLAorICAgIDB4NEVCQywgMHgwMDAwLCAweEZGRkQsIDB4NEY0QiwgMHg0RjhBLCAweDAwMDAsIDB4NUE2OCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgzOTk5LCAweDAwMDAsIDB4MDAwMCwgMHgzNDM1LCAweDRGMjksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFEQSwKKyAgICAweDAwMDAsIDB4NEU5OCwgMHg1MENELCAweDUxMEQsIDB4NEZBMiwgMHg0RjAzLCAweDAwMDAsIDB4MDAwMCwgMHg0RjQyLAorICAgIDB4NTAyRSwgMHg1MDZDLCAweDUwODEsIDB4NEZDQywgMHg0RkU1LCAweDUwNTgsIDB4NTBGQywgMHg2RTc2LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4NkQ3MiwgMHgwMDAwLCAweDAwMDAsIDB4NTFBOCwgMHg1MUMzLCAweDAwMDAsIDB4NDRERCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEN0EsIDB4MDAwMCwgMHgwMDAwLCAweDUyNTksIDB4NTJBNCwgMHgwMDAwLAorICAgIDB4NTJFMSwgMHhGRkZELCAweDQ2N0EsIDB4NzE4QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDY5RDEsCisgICAgMHgwMDAwLCAweEZGRkQsIDB4M0VERSwgMHg3NDk5LCAweDc0MTQsIDB4NzQ1NiwgMHg3Mzk4LCAweDRCOEUsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4NTNEMCwgMHgzNTg0LCAweDcyMEYsIDB4MDAwMCwgMHg1NUI0LCAweDAwMDAsIDB4NTRDRCwgMHgwMDAwLAorICAgIDB4NTcxRCwgMHg5MjVELCAweDk2RjQsIDB4NTdERCwgMHg1NzhELCAweDU3N0YsIDB4MzYzRSwgMHg1OENCLCAweDVBOTksCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDVBMkMsIDB4NTlCOCwgMHg1QTdFLCAweDVBQ0YsIDB4NUExMiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MzZGNSwgMHg2RDA1LCAweDc0NDMsIDB4NUEyMSwgMHgwMDAwLAorICAgIDB4NUE4MSwgMHgwMDAwLCAweDAwMDAsIDB4OTNFMCwgMHg3NDhDLCAweDAwMDAsIDB4NzEwNSwgMHg0OTcyLCAweDk0MDgsCisgICAgMHgwMDAwLCAweDkzQkQsIDB4MzdBMCwgMHg1QzFFLCAweDVDOUUsIDB4NUU1RSwgMHg1RTQ4LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4NUVDRCwgMHg1QjRGLCAweDAwMDAsIDB4MDAwMCwgMHgzNzAxLCAweDAwMDAsIDB4MzZERCwgMHgwMDAwLAorICAgIDB4MzZEMywgMHg4MTJBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NUYwQywgMHg1RjBFLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDVBNkIsIDB4MDAwMCwgMHg1QjQ0LCAweDAwMDAsIDB4ODg2MCwgMHg2MDdFLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDVGREIsIDB4M0VCOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDYxQzAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg2MTk5LCAweDYxOTgsIDB4NjA3NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDY0NzEsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4M0EyOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDYzMzcsIDB4NjRCNiwKKyAgICAweDYzMzEsIDB4NjNEMSwgMHgwMDAwLCAweDAwMDAsIDB4NjJBNCwgMHgwMDAwLCAweDY0M0IsIDB4NjU2QiwgMHg2OTcyLAorICAgIDB4M0JGNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDU1MEQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg2NkNFLCAweDAwMDAsIDB4MDAwMCwgMHgzQUUwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4NzhFRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzNDY0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4NjY4RSwgMHgwMDAwLCAweDY2NkIsIDB4NEI5MywgMHg2NjMwLCAweDAwMDAsIDB4MDAwMCwgMHg2NjYzLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDY2MUUsIDB4MDAwMCwgMHgzOEQxLCAweDAwMDAsIDB4MDAwMCwgMHgzQjk5LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDc0RDAsIDB4M0I5NiwgMHgwMDAwLCAweDY4QjYsIDB4RkZGRCwgMHgzQkM0LCAweDZBQkUsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4NkEzMywgMHg2QTUyLCAweDZBQzksIDB4NkIwNSwgMHgwMDAwLCAweDY1MTEsIDB4Njg5OCwgMHg2QTRDLCAweDNCRDcsCisgICAgMHg2QTdBLCAweDZCNTcsIDB4MDAwMCwgMHgwMDAwLCAweDkzQTAsIDB4OTJGMiwgMHgwMDAwLCAweDAwMDAsIDB4OTI4OSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg5NDY3LCAweDZEQTUsIDB4NkYwQiwgMHhGRkZELCAweDAwMDAsIDB4M0Q4RiwgMHg2RTA0LAorICAgIDB4MDAwMCwgMHg1QTNELCAweDZFMEEsIDB4NTg0NywgMHg2RDI0LCAweDc4NDIsIDB4NzEzQiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg3MEYxLCAweDcyNTAsIDB4NzI4NywgMHg3Mjk0LCAweDAwMDAsIDB4MDAwMCwgMHg1MTc5LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDc0N0EsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDNGMDYsIDB4M0VCMSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDYwQTcsIDB4M0VGMywgMHg3NENDLCAweDc0M0MsIDB4OTM4NywgMHg3NDM3LCAweDQ0OUYsCisgICAgMHgwMDAwLCAweDQ1NTEsIDB4NzU4MywgMHgzRjYzLCAweDAwMDAsIDB4MDAwMCwgMHgzRjU4LCAweDc1NTUsIDB4NzY3MywKKyAgICAweDAwMDAsIDB4RkZGRCwgMHg3NDY4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDNBRkIsIDB4M0RDRCwgMHgwMDAwLAorICAgIDB4M0VGRiwgMHgwMDAwLCAweDAwMDAsIDB4OTFGQSwgMHg1NzMyLCAweDkzNDIsIDB4MDAwMCwgMHgwMDAwLCAweDUwREYsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4Nzc3OCwgMHgwMDAwLCAweDc3MEUsIDB4NzcwRiwgMHg3NzdCLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDNBNUUsIDB4MDAwMCwgMHg3NDM4LCAweDc0OUIsIDB4M0VCRiwgMHgwMDAwLCAweDAwMDAsIDB4NDBDOCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg5MzA3LCAweDAwMDAsIDB4NzgxRSwgMHg3ODhELCAweDc4ODgsIDB4NzhEMiwgMHg3M0QwLCAweDc5NTksCisgICAgMHgwMDAwLCAweDAwMDAsIDB4NDEwRSwgMHhGRkZELCAweEZGRkQsIDB4NzlBNSwgMHg2QTJELCAweDAwMDAsIDB4N0EzQSwKKyAgICAweDc5RjQsIDB4NDE2RSwgMHgwMDAwLCAweDQxMzIsIDB4OTIzNSwgMHg3OUYxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDM1OTcsIDB4NTU2QiwgMHgzNTcwLCAweDM2QUEsIDB4MDAwMCwgMHgwMDAwLCAweDdBRTIsCisgICAgMHg1QTU5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDVBMEQsIDB4MDAwMCwgMHg3OEYwLCAweDVBMkEsIDB4MDAwMCwKKyAgICAweDdBRkUsIDB4NDFGOSwgMHg3QzVELCAweDdDNkQsIDB4NDIxMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg3Q0NELAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDdDOEUsIDB4N0M3QywgMHg3Q0FFLCAweDZBQjIsIDB4N0REQywgMHg3RTA3LCAweDdERDMsCisgICAgMHg3RjRFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDdEOTcsIDB4MDAwMCwgMHg0MjZBLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDY3RDYsIDB4MDAwMCwgMHgwMDAwLCAweDU3QzQsIDB4MDAwMCwgMHgwMDAwLCAweDdGREQsIDB4N0IyNywgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDdCMEMsIDB4MDAwMCwgMHg5OUU2LCAweDg2NDUsIDB4OUE2MywgMHg2QTFDLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OUExRiwgMHgwMDAwLCAweDg0OTUsIDB4MDAwMCwgMHgwMDAwLCAweDQ0RUEsIDB4ODEzNywKKyAgICAweDQ0MDIsIDB4ODBDNiwgMHg4MTA5LCAweDgxNDIsIDB4MDAwMCwgMHg5OEMzLCAweDAwMDAsIDB4ODI2MiwgMHg4MjY1LAorICAgIDB4MDAwMCwgMHg4NDUzLCAweDAwMDAsIDB4ODYxMCwgMHgwMDAwLCAweDVBODYsIDB4NDE3RiwgMHgwMDAwLCAweDVCMkIsCisgICAgMHgwMDAwLCAweDVBRTQsIDB4MDAwMCwgMHg4NkEwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODJELCAweDAwMDAsIDB4NUEwMiwKKyAgICAweDg4NkUsIDB4NEY0NSwgMHg4ODg3LCAweDg4QkYsIDB4ODhFNiwgMHg4OTY1LCAweDg5NEQsIDB4MDAwMCwgMHg4OTU0LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4M0VBRCwgMHg4NEEzLCAweDQ2RjUsCisgICAgMHg0NkNGLCAweDM3RjIsIDB4OEEzRCwgMHg4QTFDLCAweDAwMDAsIDB4NUY0RCwgMHg5MjJCLCAweDAwMDAsIDB4NjVENCwKKyAgICAweDcxMjksIDB4NzBDNCwgMHgwMDAwLCAweDlENkQsIDB4OEM5RiwgMHg4Q0U5LCAweDAwMDAsIDB4NTk5QSwgMHg3N0MzLAorICAgIDB4NTlGMCwgMHgzNkQ0LCAweDhFMkEsIDB4OEVBNywgMHgwMDAwLCAweDhGMzAsIDB4OEY0QSwgMHg0MkY0LCAweDZDNTgsCisgICAgMHg2RkJCLCAweDAwMDAsIDB4NDg5QiwgMHg2Rjc5LCAweDZFOEIsIDB4MDAwMCwgMHg5QkU5LCAweDM2QjUsIDB4MDAwMCwKKyAgICAweDkwQkIsIDB4NDhCNCwgMHg1NTcxLCAweDQ5MDYsIDB4OTFCQiwgMHg5NDA0LCAweDAwMDAsIDB4NDA2MiwgMHgwMDAwLAorICAgIDB4OTQyNywgMHgwMDAwLCAweDAwMDAsIDB4ODRFNSwgMHg4QTJCLCAweDk1OTksIDB4OTVBNywgMHg5NTk3LCAweDk1OTYsCisgICAgMHgwMDAwLCAweDc0NDUsIDB4M0VDMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzRUU3LCAweDAwMDAsIDB4OTY4RiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDNFQ0MsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NzQxMiwgMHg3NDZCLAorICAgIDB4M0VGQywgMHg5NzQxLCAweDAwMDAsIDB4Njg0NywgMHg0QTFELCAweDAwMDAsIDB4MDAwMCwgMHhGRkZELCAweDkzNjgsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkyQkEsIDB4NUIxMSwgMHg4QjY5LCAweDQ5M0MsIDB4NzNGOSwKKyAgICAweDAwMDAsIDB4OTc5QiwgMHhGRkZELCAweDk5MzgsIDB4MDAwMCwgMHg1REMxLCAweDAwMDAsIDB4MDAwMCwgMHg5ODFGLAorICAgIDB4MDAwMCwgMHg5MkY2LCAweDAwMDAsIDB4OTFFNSwgMHg0NEMwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDk4REMsCisgICAgMHgwMDAwLCAweDNGMDAsIDB4OTIyQSwgMHg0OTI1LCAweDg0MTQsIDB4OTkzQiwgMHg5OTRELCAweDAwMDAsIDB4M0RGRCwKKyAgICAweEZGRkQsIDB4NEI2RiwgMHg5OUFBLCAweDlBNUMsIDB4MDAwMCwgMHgwMDAwLCAweDZBOEYsIDB4OUEyMSwgMHg1QUZFLAorICAgIDB4OUEyRiwgMHgwMDAwLCAweDRCOTAsIDB4MDAwMCwgMHg5OUJDLCAweDRCQkQsIDB4NEI5NywgMHg5MzdELCAweDU4NzIsCisgICAgMHgwMDAwLCAweDU4MjIsIDB4MDAwMCwgMHgwMDAwLCAweDc4NDQsIDB4MDAwMCwgMHgwMDAwLCAweDY4QzUsIDB4M0Q3RCwKKyAgICAweDk0NTgsIDB4MzkyNywgMHg2MTUwLCAweDAwMDAsIDB4MDAwMCwgMHg2MTA3LCAweDlDNEYsIDB4OUM1MywgMHg5QzdCLAorICAgIDB4OUMzNSwgMHg5QzEwLCAweDlCN0YsIDB4OUJDRiwgMHgwMDAwLCAweDlCOUYsIDB4MDAwMCwgMHgwMDAwLCAweDlEMjEsCisgICAgMHg0Q0FFLCAweDAwMDAsIDB4OUUxOCwgMHg0Q0IwLCAweDlEMEMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDlEQTUsIDB4ODRCRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NUZDLCAweDQ1MzMsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4NDIwLCAweDg1RUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NzlFMiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDNENjIsIDB4OTNEQiwgMHg5MkJFLCAweDkzNDgsIDB4MDAwMCwgMHg3OEI5LCAweDkyNzcsIDB4OTQ0RCwKKyAgICAweDRGRTQsIDB4MzQ0MCwgMHg5MDY0LCAweDAwMDAsIDB4NzgzRCwgMHg3ODU0LCAweDc4QjYsIDB4Nzg0QiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDM2OUEsIDB4NEY3MiwgMHg2RkRBLCAweDZGRDksIDB4RkZGRCwgMHg3MDFFLCAweDU0MTQsCisgICAgMHgwMDAwLCAweDU3QkIsIDB4NThGMywgMHg1NzhBLCAweDlEMTYsIDB4NTdENywgMHg3MTM0LCAweDM0QUYsIDB4MDAwMCwKKyAgICAweDcxRUIsIDB4MDAwMCwgMHgwMDAwLCAweEZGRkQsIDB4MDAwMCwgMHgwMDAwLCAweDYxMEMsIDB4NUFDRSwgMHg1QTBCLAorICAgIDB4NDJCQywgMHgwMDAwLCAweDM3MkMsIDB4NEI3QiwgMHgwMDAwLCAweDkzQkIsIDB4OTNCOCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4NDcyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg1OTk0LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDdEQTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkyRTUsIDB4NzNFMiwgMHgzRUU5LAorICAgIDB4NzRCNCwgMHgwMDAwLCAweDAwMDAsIDB4M0VFMSwgMHgwMDAwLCAweDZBRDgsIDB4NzNGMywgMHg3M0ZCLCAweDNFRDYsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDc0NDgsIDB4MDAwMCwKKyAgICAweDcwQTUsIDB4MDAwMCwgMHg5Mjg0LCAweDczRTYsIDB4OTM1RiwgMHgwMDAwLCAweDkzMzEsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OTM4NiwgMHgwMDAwLCAweDAwMDAsIDB4NDkzNSwgMHgwMDAwLCAweDcxNkIsIDB4MDAwMCwgMHgwMDAwLCAweDU2QTQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg1NTAyLCAweDc5QzQsIDB4MDAwMCwgMHg3REZFLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4NDUyRSwgMHg5NDAxLCAweDM3MEEsIDB4MDAwMCwgMHgwMDAwLCAweDU5QjAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg1QUExLCAweDM2RTIsIDB4MDAwMCwgMHgzNkIwLCAweDkyNUYsIDB4NUE3OSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg5Mzc0LCAweDNDQ0QsIDB4MDAwMCwgMHg0QTk2LCAweDM5OEEsIDB4NTBGNCwgMHgzRDY5LCAweDNENEMsIDB4MDAwMCwKKyAgICAweDcxNzUsIDB4NDJGQiwgMHgwMDAwLCAweDZFMEYsIDB4MDAwMCwgMHg0NEVCLCAweDZENTcsIDB4MDAwMCwgMHg3MDY3LAorICAgIDB4NkNBRiwgMHgzQ0Q2LCAweDAwMDAsIDB4MDAwMCwgMHg2RTAyLCAweDZGMEMsIDB4M0Q2RiwgMHgwMDAwLCAweDc1NTEsCisgICAgMHgzNkJDLCAweDM0QzgsIDB4NDY4MCwgMHgzRURBLCAweDQ4NzEsIDB4NTlDNCwgMHg5MjZFLCAweDQ5M0UsIDB4OEY0MSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg1ODEyLCAweDU3QzgsIDB4MzZENiwgMHgwMDAwLCAweDcwRkUsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NjhCOSwgMHg2OTY3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDZBMUEsIDB4MDAwMCwgMHgwMDAwLCAweDg0M0UsIDB4NDRERiwKKyAgICAweDQ0Q0UsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHhGRkZELCAweEZGRkQsIDB4ODMzRCwgMHgwMDAwLAorICAgIDB4ODNFRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg1OTg5LCAweDVBODIsIDB4MDAwMCwgMHg1QTYxLCAweDVBNzEsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MzcyRCwgMHg1OUVGLCAweDAwMDAsIDB4MzZDNywgMHg3MThFLCAweDkzOTAsIDB4NjY5QSwKKyAgICAweDAwMDAsIDB4NUE2RSwgMHg1QTJCLCAweDAwMDAsIDB4NkEyQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4NzExRCwgMHgwMDAwLCAweDAwMDAsIDB4NEZCMCwgMHgwMDAwLCAweDVDQzIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg2QTBDLCAweDAwMDAsIDB4MDAwMCwgMHhGRkZELCAweDcxMzMsIDB4MDAwMCwgMHgzREE1LCAweDZDREYsIDB4MDAwMCwKKyAgICAweDU5RUIsIDB4NUY1QywgMHgwMDAwLCAweDdDRDMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA2QywgMHg4MUY2LAorICAgIDB4NzcwQywgMHg2Q0EyLCAweDU2RkQsIDB4NTg2OSwgMHg2NzYxLCAweDVDNUUsIDB4NThGMiwgMHg3MEI5LCAweDY4MDMsCisgICAgMHg4RkJCLCAweDhGQkMsIDB4NEUyMSwgMHg3QjM5LCAweDNEQ0MsIDB4NzMyQSwgMHg3NTYwLCAweDU4M0EsIDB4ODJBNiwKKyAgICAweDY5OEEsIDB4NjBFMywgMHg0RUVFLCAweDk5QzQsIDB4OUVCRiwgMHg1MzAxLCAweDY3QTAsIDB4NjBFOCwgMHg1MUI0LAorICAgIDB4N0E4MywgMHg5QzNBLCAweDdBQzgsIDB4NjkxQSwgMHg1OUFDLCAweDU4NDAsIDB4NTQ2QSwgMHg2MEU3LCAweDU2N0EsCisgICAgMHg2OTU1LCAweDlDMkYsIDB4ODdBNSwgMHg1QzIwLCAweDVFMEIsIDB4NjcxRSwgMHg4NEFELCAweDhCODEsIDB4NEU3OCwKKyAgICAweDYyQzMsIDB4Njg1NSwgMHhGRkZELCAweDgyRkQsIDB4ODlBNSwgMHg4RkEwLCAweDk3QjgsIDB4OTg0NywgMHg5QUJELAorICAgIDB4NUZCMSwgMHg2NjQ4LCAweDY2QkYsIDB4MDAwMCwgMHhGRkZELCAweDAwMDAsIDB4RkZGRCwgMHhGRkZELCAweDAwMDAsCisgICAgMHg2NzBFLCAweDY5MTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg0OEQwLCAweDRBQjgsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDUxRDIsIDB4MDAwMCwgMHg1OTlGLCAweDAwMDAsIDB4M0JCRSwgMHgwMDAwLAorICAgIDB4Mzk5QiwgMHgwMDAwLCAweDAwMDAsIDB4Mzc2MiwgMHgwMDAwLCAweDhCNUUsIDB4MDAwMCwgMHhGRkZELCAweDcyMDksCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEVEQSwgMHg1MjhGLCAweDcxNzEsIDB4MDAwMCwgMHgwMDAwLCAweDU1QkMsIDB4MDAwMCwKKyAgICAweDM0NzMsIDB4MDAwMCwgMHg0NzE4LCAweDAwMDAsIDB4NTA2NiwgMHgzNEZCLCAweDAwMDAsIDB4RkZGRCwgMHg0NzdDLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweEZGRkQsIDB4MDAwMCwgMHg5MDU2LCAweDAwMDAsIDB4OEI2MiwgMHg1RDVCLCAweDAwMDAsCisgICAgMHhGRkZELCAweDAwMDAsIDB4OEFFQSwgMHgwMDAwLCAweDAwMDAsIDB4NEJDMCwgMHgwMDAwLCAweDk0NjUsIDB4MDAwMCwKKyAgICAweDYxOTUsIDB4NUEyNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg0RTZBLCAweDAwMDAsIDB4OTY1NiwgMHg2RDhGLAorICAgIDB4MDAwMCwgMHg4OTc3LCAweDAwMDAsIDB4RkZGRCwgMHg3QjQyLCAweDAwMDAsIDB4MDAwMCwgMHhGRkZELCAweDdBNDUsCisgICAgMHg5QTI2LCAweDM2NUYsIDB4MDAwMCwgMHgwMDAwLCAweDc5ODMsIDB4NUQyQywgMHgwMDAwLCAweEZGRkQsIDB4NDZEMCwKKyAgICAweDc1M0IsIDB4ODg2NSwgMHg1OEI2LCAweDM3MUMsIDB4MDAwMCwgMHgzQzU0LCAweDkyODEsIDB4MDAwMCwgMHg5MzMwLAorICAgIDB4MDAwMCwgMHg2QzM5LCAweDAwMDAsIDB4ODgyNywgMHg4OEY1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDZFQjgsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MzlBNCwgMHhGRkZELCAweEZGRkQsIDB4NDUzRiwgMHg2NkI2LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg5NDMsIDB4NDBERiwgMHgwMDAwLCAweDM5QTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NzFBRCwgMHg4MzY2LAorICAgIDB4MDAwMCwgMHhGRkZELCAweDRDQjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4N0I0MywgMHg3OTdFLCAweDZGQjUsCisgICAgMHgwMDAwLCAweDZBMDMsIDB4MDAwMCwgMHg1M0EyLCAweDAwMDAsIDB4OTNCRiwgMHg2ODM2LCAweDk3NUQsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDVEODUsIDB4MDAwMCwgMHg1NzE1LCAweDk4MjMsIDB4MDAwMCwgMHg1REFCLAorICAgIDB4MDAwMCwgMHg2NUJFLCAweDY5RDUsIDB4NTNEMiwgMHgwMDAwLCAweDAwMDAsIDB4M0MxMSwgMHg2NzM2LCAweDAwMDAsCisgICAgMHgzNUNBLCAweDQ4RkEsIDB4RkZGRCwgMHg3ODA4LCAweDkyNTUsIDB4NDNGMiwgMHg0M0RGLCAweDU5RjgsIDB4RkZGRCwKKyAgICAweDU2OEIsIDB4MDAwMCwgMHg5MDEyLCAweDU1QzEsIDB4NDUwOSwgMHg3RTdGLCAweDZGNTYsIDB4NkFCMSwgMHgzNEU0LAorICAgIDB4MDAwMCwgMHgzNzNBLCAweEZGRkQsIDB4MDAwMCwgMHgwMDAwLCAweDNERUIsIDB4MDAwMCwgMHgwMDAwLCAweDU2QkYsCisgICAgMHg4RTBFLCAweDVCNkQsIDB4NjNERSwgMHhGRkZELCAweDY1MzAsIDB4NTYyRCwgMHg1NDFBLCAweDAwMDAsIDB4NEM3RCwKKyAgICAweDU2MjIsIDB4NTYxRSwgMHg3RjQ5LCAweDU5NzUsIDB4MDAwMCwgMHg4NzcwLCAweDgxMTcsIDB4OUQ1RSwgMHg4RDE4LAorICAgIDB4NzYzQiwgMHg5QzQ1LCAweDc2NEUsIDB4NzdCOSwgMHg5MzQ1LCAweDU0MzIsIDB4ODE0OCwgMHg4MkY3LCAweDU2MjUsCisgICAgMHg4MTMyLCAweDg0MTgsIDB4ODBCRCwgMHg1NUVBLCAweDc5NjIsIDB4NTY0MywgMHg1NDE2LCAweDAwMDAsIDB4MzVDRSwKKyAgICAweDU2MDUsIDB4NTVGMSwgMHg2NkYxLCAweDAwMDAsIDB4MzYyRCwgMHg3NTM0LCAweDU1RjAsIDB4NTVCQSwgMHg1NDk3LAorICAgIDB4NTU3MiwgMHgwMDAwLCAweDAwMDAsIDB4NUVEMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5RUFCLCAweDdENUEsCisgICAgMHhGRkZELCAweDAwMDAsIDB4NjI5RCwgMHg5NzZELCAweDU0OTQsIDB4OENDRCwgMHg3MUY2LCAweDkxNzYsIDB4NjNGQywKKyAgICAweDYzQjksIDB4NjNGRSwgMHg1NTY5LCAweDAwMDAsIDB4OUM3MiwgMHgwMDAwLCAweDUxOUEsIDB4MzRERiwgMHgwMDAwLAorICAgIDB4NTFBNywgMHg1NDRELCAweDU1MUUsIDB4NTUxMywgMHg3NjY2LCAweDhFMkQsIDB4MDAwMCwgMHg3NUIxLCAweDgwQjYsCisgICAgMHg4ODA0LCAweEZGRkQsIDB4ODhDNywgMHg4MUI2LCAweDg0MUMsIDB4NDRFQywgMHg3MzA0LCAweDgzMEIsIDB4NTY3QiwKKyAgICAweDkxNzAsIDB4OTIwOCwgMHgwMDAwLCAweDcyNjYsIDB4NDc0RSwgMHgwMDAwLCAweDQwRkEsIDB4OUM1RCwgMHg2NTFGLAorICAgIDB4NDhGMywgMHgwMDAwLCAweDAwMDAsIDB4RkZGRCwgMHgwMDAwLCAweEVEMkIsIDB4MDAwMCwgMHg3MUEzLCAweDdFOEUsCisgICAgMHg5RDUwLCAweDM1NzcsIDB4NkNCMiwgMHg1MzY3LCAweDM5REMsIDB4MDAwMCwgMHg4MjJELCAweDU0NEIsIDB4RUQ0MywKKyAgICAweDNBNTIsIDB4NzM3NCwgMHgwMDAwLCAweDREMDksIDB4OUJFRCwgMHhGRkZELCAweDRDNUIsIDB4MDAwMCwgMHg4NDVDLAorICAgIDB4MDAwMCwgMHg2MzJFLCAweDdEMjUsIDB4M0EyQSwgMHg5MDA4LCAweDUyQ0MsIDB4M0U3NCwgMHgzNjdBLCAweDQ1RTksCisgICAgMHgwMDAwLCAweDc2NDAsIDB4NUFGMCwgMHgwMDAwLCAweDc4N0EsIDB4MDAwMCwgMHg1OEE3LCAweDQwQkYsIDB4NTY3QywKKyAgICAweDlCOEIsIDB4NUQ3NCwgMHg3NjU0LCAweDAwMDAsIDB4OUU4NSwgMHg0Q0UxLCAweEZGRkQsIDB4MzdGQiwgMHg2MTE5LAorICAgIDB4MDAwMCwgMHhFRDczLCAweDU2NUQsIDB4MDAwMCwgMHg1MjM0LCAweDM1QUQsIDB4RkZGRCwgMHg5RDdDLCAweDdDNTYsCisgICAgMHg5QjM5LCAweDU3REUsIDB4NUM1MywgMHg2NEQzLCAweDAwMDAsIDB4MDAwMCwgMHg4NkFELCAweDAwMDAsIDB4MDAwMCwKKyAgICAweEVEOEMsIDB4NTFGRSwgMHgwMDAwLCAweDVEOEUsIDB4OTcwMywgMHgwMDAwLCAweDlFODEsIDB4OTA0QywgMHg3QjFGLAorICAgIDB4OUIwMiwgMHg1Q0QxLCAweDdCQTMsIDB4NjI2OCwgMHg2MzM1LCAweDlBRkYsIDB4N0JDRiwgMHg5QjJBLCAweDdDN0UsCisgICAgMHhGRkZELCAweDdDNDIsIDB4N0M4NiwgMHg5QzE1LCAweDdCRkMsIDB4OUIwOSwgMHhGRkZELCAweDlDMkUsIDB4OUY1QSwKKyAgICAweDU1NzMsIDB4NUJDMywgMHg0RkZELCAweDlFOTgsIDB4NEZGMiwgMHg1MjYwLCAweDUyRDEsIDB4NTc2NywgMHg1MDU2LAorICAgIDB4NTlCNywgMHg1RTEyLCAweDk3QzgsIDB4OURBQiwgMHg4RjVDLCAweDU0NjksIDB4OTdCNCwgMHg5OTQwLCAweDk3QkEsCisgICAgMHg1MzJDLCAweDYxMzAsIDB4NjkyQywgMHg1M0RBLCAweDlDMEEsIDB4OUQwMiwgMHg0QzNCLCAweDk2NDEsIDB4Njk4MCwKKyAgICAweDUwQTYsIDB4NzU0NiwgMHgwMDAwLCAweDk5REEsIDB4NTI3MywgMHhFREM5LCAweDkxNTksIDB4OTY4MSwgMHg5MTVDLAorICAgIDB4RURDRCwgMHg5MTUxLCAweDAwMDAsIDB4NjM3RiwgMHg2QUNBLCAweDU2MTEsIDB4OTE4RSwgMHg3NTdBLCAweDYyODUsCisgICAgMHg3MzRGLCAweDdDNzAsIDB4MDAwMCwgMHhFRERDLCAweDc2RDYsIDB4OUI5RCwgMHg0RTJBLCAweDAwMDAsIDB4ODNCRSwKKyAgICAweDg4NDIsIDB4RURFNCwgMHg1QzRBLCAweDY5QzAsIDB4RkZGRCwgMHhGRkZELCAweDUyMUYsIDB4NURGNSwgMHg0RUNFLAorICAgIDB4NkMzMSwgMHgwMDAwLCAweDRGMzksIDB4NTQ5QywgMHhGRkZELCAweDUyOUEsIDB4OEQ4MiwgMHgzNUZFLCAweEZGRkQsCisgICAgMHgzNUYzLCAweEVERjYsIDB4NkI1MiwgMHg5MTdDLCAweDlGQTUsIDB4OUI5NywgMHg5ODJFLCAweDk4QjQsIDB4OUFCQSwKKyAgICAweDlFQTgsIDB4OUU4NCwgMHg3QjE0LCAweEVFMDIsIDB4NkJGQSwgMHg4ODE4LCAweDdGNzgsIDB4RUUwNiwgMHg1NjIwLAorICAgIDB4MDAwMCwgMHg4RTc3LCAweDlGNTMsIDB4RUUwQiwgMHg4REQ0LCAweDhFNEYsIDB4OUUxQywgMHg4RTAxLCAweDYyODIsCisgICAgMHgwMDAwLCAweDhFMjgsIDB4OEU3NSwgMHg3QUQzLCAweDdBM0UsIDB4NzhEOCwgMHg2Q0VBLCAweDhBNjcsIDB4NzYwNywKKyAgICAweDlGMjYsIDB4NkNDRSwgMHg4N0Q2LCAweDc1QzMsIDB4MDAwMCwgMHg3ODUzLCAweDhEMEMsIDB4NzJFMiwgMHg3MzcxLAorICAgIDB4OEIyRCwgMHg3MzAyLCAweDc0RjEsIDB4OENFQiwgMHgwMDAwLCAweDg2MkYsIDB4NUZCQSwgMHg4OEEwLCAweDQ0QjcsCisgICAgMHhFRTJGLCAweDAwMDAsIDB4RUUzMiwgMHg4QTdFLCAweDAwMDAsIDB4RUUzNSwgMHg2MEZELCAweDc2NjcsIDB4OUFENywKKyAgICAweDlENDQsIDB4OTM2RSwgMHg5QjhGLCAweDg3RjUsIDB4RUUzRCwgMHhGRkZELCAweDhDRjcsIDB4NzMyQywgMHg5NzIxLAorICAgIDB4OUJCMCwgMHgzNUQ2LCAweDcyQjIsIDB4NEMwNywgMHg3QzUxLCAweDk5NEEsIDB4NjE1OSwgMHg0QzA0LCAweDlFOTYsCisgICAgMHg2MTdELCAweEVFNEQsIDB4NTc1RiwgMHg2MTZGLCAweDYyQTYsIDB4NjIzOSwgMHhGRkZELCAweDNBNUMsIDB4NjFFMiwKKyAgICAweDUzQUEsIDB4NjM2NCwgMHg2ODAyLCAweDM1RDIsIDB4NUQ1NywgMHg4RkRBLCAweDAwMDAsIDB4RUU1RSwgMHg1MEQ5LAorICAgIDB4NzkwNiwgMHg1MzMyLCAweDk2MzgsIDB4MDAwMCwgMHg0MDY1LCAweEVFNjYsIDB4NzdGRSwgMHhFRTY4LCAweDdDQzIsCisgICAgMHgwMDAwLCAweDdDREEsIDB4N0EyRCwgMHg4MDY2LCAweDgwNjMsIDB4N0Q0RCwgMHg3NTA1LCAweDc0RjIsIDB4ODk5NCwKKyAgICAweDgyMUEsIDB4NjcwQywgMHg4MDYyLCAweDAwMDAsIDB4ODA1QiwgMHg3NEYwLCAweDgxMDMsIDB4NzcyNCwgMHg4OTg5LAorICAgIDB4MDAwMCwgMHg3NTUzLCAweDg3QTksIDB4ODdDRSwgMHg4MUM4LCAweDg3OEMsIDB4OEE0OSwgMHg4Q0FELCAweDhCNDMsCisgICAgMHg3NzJCLCAweDc0RjgsIDB4ODREQSwgMHg2OUIyLCAweDhEQTYsIDB4RUU4QywgMHg4OUE5LCAweEZGRkQsIDB4NkRCOSwKKyAgICAweDg3QzEsIDB4MDAwMCwgMHg3NEU3LCAweDNEREIsIDB4NzE3NiwgMHg2MEE0LCAweDYxOUMsIDB4M0NEMSwgMHhGRkZELAorICAgIDB4NjA3NywgMHhFRTlBLCAweDdGNzEsIDB4MDAwMCwgMHg2MEU5LCAweDRCN0UsIDB4MDAwMCwgMHg5MkRCLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg1NEMsIDB4NDJCNSwgMHg3M0VGLCAweDUxQjUsIDB4MzY0OSwgMHgwMDAwLCAweDAwMDAsIDB4OTM0NCwKKyAgICAweDAwMDAsIDB4ODJFRSwgMHgwMDAwLCAweDc4M0MsIDB4Njc0NCwgMHg2MkRGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDRGQUIsIDB4MDAwMCwgMHg1MDA4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweEZGRkQsIDB4MDAwMCwgMHg1RkE0LCAweDAwMDAsIDB4MDAwMCwgMHg2RURCLCAweDAwMDAsIDB4NTBERSwKKyAgICAweDUxMDEsIDB4MzQ3QSwgMHg1MTBFLCAweDk4NkMsIDB4Mzc0MywgMHg4NDE2LCAweDAwMDAsIDB4MDAwMCwgMHg1MTYwLAorICAgIDB4MDAwMCwgMHg1MTZBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg1QjgyLCAweDg3N0QsIDB4MDAwMCwgMHgwMDAwLCAweDUxQjIsIDB4NTFCOCwgMHg5RDM0LCAweDUxQzksIDB4NTFDRiwKKyAgICAweDUxRDEsIDB4M0NEQywgMHg1MUQzLCAweDAwMDAsIDB4NTFCMywgMHhGRkZELCAweEZGRkQsIDB4NTFFRCwgMHg4M0NELAorICAgIDB4NjkzRSwgMHgwMDAwLCAweDVGN0IsIDB4NTIwQiwgMHg1MjI2LCAweDUyM0MsIDB4NTJCNSwgMHg1MjU3LCAweDUyOTQsCisgICAgMHg1MkI5LCAweDUyQzUsIDB4N0MxNSwgMHg4NTQyLCAweDUyRTAsIDB4ODYwRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDU1NDksIDB4NkVEOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg1MzMzLCAweEZGRkQsIDB4MDAwMCwgMHg2Q0NCLAorICAgIDB4MDAwMCwgMHg2ODFCLCAweDczRDUsIDB4NjA0QSwgMHgzRUFBLCAweDM4Q0MsIDB4MDAwMCwgMHg3MURELCAweDQ0QTIsCisgICAgMHg1MzZELCAweDUzNzQsIDB4MDAwMCwgMHg1MzdFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDc3RTYsIDB4NTM5MywKKyAgICAweDAwMDAsIDB4NTNBMCwgMHg1M0FCLCAweDUzQUUsIDB4NzNBNywgMHgwMDAwLCAweDNGNTksIDB4NzM5QywgMHg1M0MxLAorICAgIDB4NTNDNSwgMHg2QzQ5LCAweDRFNDksIDB4NTdGRSwgMHg1M0Q5LCAweDNBQUIsIDB4MDAwMCwgMHg1M0UwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDUzRjYsIDB4MDAwMCwgMHg1NDEzLCAweDcwNzksIDB4NTUyQiwgMHg2NjU3LCAweDZENUIsIDB4NTQ2RCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg1NTVELCAweDU0OEYsIDB4NTRBNCwgMHg0N0E2LCAweDAwMDAsIDB4MDAwMCwgMHgzREI0LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NTU0NywgMHg0Q0VELCAweDU0MkYsIDB4NzQxNywgMHg1NTg2LCAweDU1QTksCisgICAgMHhGRkZELCAweDAwMDAsIDB4MDAwMCwgMHg0NTUyLCAweDAwMDAsIDB4NjZCMywgMHgwMDAwLCAweDU2MzcsIDB4NjZDRCwKKyAgICAweDAwMDAsIDB4NjZBNCwgMHhGRkZELCAweDU2NEQsIDB4NTY0RiwgMHg3OEYxLCAweDU2RjEsIDB4OTc4NywgMHg1M0ZFLAorICAgIDB4NTcwMCwgMHg1NkVGLCAweDU2RUQsIDB4MDAwMCwgMHgzNjIzLCAweDAwMDAsIDB4NTc0NiwgMHgwMDAwLCAweDZDNkUsCisgICAgMHg3MDhCLCAweDU3NDIsIDB4MzZCMSwgMHgwMDAwLCAweDU3RTYsIDB4MDAwMCwgMHg1ODAzLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDU4MjYsIDB4MDAwMCwgMHg1ODFGLCAweDU4QUEsIDB4MzU2MSwgMHg1OEUwLCAweDU4REMsIDB4MDAwMCwgMHg1OEZCLAorICAgIDB4NUJGRiwgMHg1NzQzLCAweDAwMDAsIDB4MDAwMCwgMHg5M0QzLCAweDM1QTEsIDB4NTkxRiwgMHg2OEE2LCAweDM2QzMsCisgICAgMHg2RTU5LCAweDAwMDAsIDB4NUEyNCwgMHhGRkZELCAweDAwMDAsIDB4ODUwNSwgMHg1OUM5LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg1OUQ5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDZENzEsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4NTlGOSwgMHgwMDAwLCAweDVBQUIsIDB4NUE2MywgMHgzNkU2LCAweDAwMDAsIDB4RkZGRCwgMHgzNzA4LCAweDVBOTYsCisgICAgMHg3NDY1LCAweDVBRDMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MzczMiwgMHgwMDAwLCAweDVFODMsIDB4NTJEMCwKKyAgICAweDVCNzYsIDB4NjU4OCwgMHg1QjdDLCAweDAwMDAsIDB4NDAwNCwgMHg0ODVELCAweDAwMDAsIDB4NUJENSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDVCRjMsIDB4NUI5RCwgMHg0RDEwLCAweDVDMDUsIDB4MDAwMCwgMHg1QzEzLCAweDczQ0UsCisgICAgMHg1QzE0LCAweDAwMDAsIDB4MDAwMCwgMHg1QzQ5LCAweDQ4REQsIDB4NUM4NSwgMHg1Q0U5LCAweDVDRUYsIDB4NUQ4QiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg1RDEwLCAweDVEMTgsIDB4NUQ0NiwgMHgwMDAwLCAweDVDQkEsIDB4NURENywgMHg4MkZDLAorICAgIDB4MzgyRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Mjg3LCAweDM4MzYsIDB4M0JDMiwgMHg1RTJFLCAweDZBOEEsCisgICAgMHhGRkZELCAweEUxMkYsIDB4MDAwMCwgMHgwMDAwLCAweDUzQTYsIDB4NEVCNywgMHhGRkZELCAweDUzQTgsIDB4MDAwMCwKKyAgICAweDVFMDksIDB4RTEzOCwgMHgwMDAwLCAweDVFRjksIDB4NUVGQiwgMHgzOEEwLCAweDVFRkMsIDB4NjgzRSwgMHg5NDFCLAorICAgIDB4NUYwRCwgMHgwMDAwLCAweDAwMDAsIDB4M0FERSwgMHgwMDAwLCAweDVGM0EsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg1RjYzLCAweDAwMDAsIDB4NUY3MiwgMHg5MzQwLCAweDAwMDAsIDB4NUZBNywgMHg1REI2LCAweDNENUYsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkxRDYsIDB4MDAwMCwgMHgwMDAwLCAweDYwMzEsIDB4NjY4NSwgMHgzOTYzLAorICAgIDB4M0RDNywgMHgzNjM5LCAweDU3OTAsIDB4MDAwMCwgMHg3OTcxLCAweDNFNDAsIDB4NjA5RSwgMHhGRkZELCAweDYwRUEsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg3NEE0LCAweDUwRTEsIDB4NUFBMCwgMHg2MTY0LCAweDYxNDIsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4NjE4MSwgMHg1MUY0LCAweDAwMDAsIDB4NjE4NywgMHg1QkFBLCAweDAwMDAsIDB4MDAwMCwgMHg2MUQzLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDYxRDAsIDB4MzkzMiwgMHgwMDAwLCAweDAwMDAsIDB4NjAyMywgMHg2MTVDLCAweDY1MUUsCisgICAgMHg2MzhCLCAweDAwMDAsIDB4NjJDNSwgMHgwMDAwLCAweDYyRDUsIDB4MDAwMCwgMHg2MzZDLCAweDAwMDAsIDB4M0ExNywKKyAgICAweDY0MzgsIDB4NjNGOCwgMHgwMDAwLCAweDAwMDAsIDB4NkY4QSwgMHgwMDAwLCAweEZGRkQsIDB4MDAwMCwgMHg2NEUxLAorICAgIDB4NjRFNSwgMHg5NDdCLCAweDNBNjYsIDB4NjQzQSwgMHgzQTU3LCAweDY1NEQsIDB4NkYxNiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg2NTg1LCAweDY1NkQsIDB4NjU1RiwgMHhGRkZELCAweDY1QjUsIDB4MDAwMCwgMHg0QjM3LCAweDY1RDEsIDB4NDBEOCwKKyAgICAweDAwMDAsIDB4RTFBQiwgMHg2NUUzLCAweDVGREYsIDB4MDAwMCwgMHg2NjE4LCAweDAwMDAsIDB4MDAwMCwgMHg2NjQ0LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDY2NEIsIDB4MDAwMCwgMHg2NjY3LCAweDAwMDAsIDB4NjY3MywgMHhGQTEyLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg3N0M1LCAweDAwMDAsIDB4OTlBNCwgMHg2NzAyLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDY5RkEsIDB4MDAwMCwgMHgwMDAwLCAweDY3NjcsIDB4Njc2MiwgMHgwMDAwLCAweDAwMDAsIDB4NjdENywgMHg0NEU5LAorICAgIDB4NjgyMiwgMHg2RTUwLCAweDkyM0MsIDB4NjgwMSwgMHgwMDAwLCAweDAwMDAsIDB4Njg1RCwgMHgwMDAwLCAweDY5RTEsCisgICAgMHg2QTBCLCAweDAwMDAsIDB4Njk3MywgMHg2OEMzLCAweDAwMDAsIDB4NjkwMSwgMHg2OTAwLCAweDNBMDEsIDB4MDAwMCwKKyAgICAweDNCODAsIDB4NjdBQywgMHg2OTYxLCAweDAwMDAsIDB4NDJGQywgMHg2OTM2LCAweDY5OTgsIDB4M0JBMSwgMHgwMDAwLAorICAgIDB4ODM2MywgMHg1MDkwLCAweDY5RjksIDB4MDAwMCwgMHgwMDAwLCAweDZBNDUsIDB4MDAwMCwgMHg2QTlELCAweDNCRjMsCisgICAgMHg2N0IxLCAweDZBQzgsIDB4MDAwMCwgMHgzQzBELCAweDZCMUQsIDB4MDAwMCwgMHg2MERFLCAweDZCMzUsIDB4NkI3NCwKKyAgICAweDAwMDAsIDB4NkVCNSwgMHgwMDAwLCAweEZGRkQsIDB4MDAwMCwgMHgzNzQwLCAweDU0MjEsIDB4MDAwMCwgMHg2QkUxLAorICAgIDB4MDAwMCwgMHg2QkRDLCAweDZDMzcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NkM1QSwgMHg4MjI2LCAweDZDNzksCisgICAgMHgwMDAwLCAweDQ0QzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDM2RTUsIDB4M0NFQiwKKyAgICAweDAwMDAsIDB4OUI4MywgMHgwMDAwLCAweDAwMDAsIDB4N0Y4RiwgMHg2ODM3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4NkQ5NiwgMHg2RDVDLCAweDZFN0MsIDB4NkYwNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NTMzLCAweDAwMDAsCisgICAgMHg1MUM3LCAweEZGRkQsIDB4RkZGRCwgMHg4NDJFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDc0NTMsIDB4MDAwMCwKKyAgICAweDc5Q0MsIDB4NkU0RiwgMHg1QTkxLCAweDAwMDAsIDB4NkZGOCwgMHgzNzBELCAweDZGOUQsIDB4MDAwMCwgMHg2RUZBLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDQ1NTUsIDB4OTNGMCwgMHg2RjQ0LCAweDZGNUMsIDB4M0Q0RSwgMHg2Rjc0LCAweDAwMDAsCisgICAgMHgzRDNCLCAweDZGOUYsIDB4MDAwMCwgMHg2RkQzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4NTFERiwgMHhFMjUxLCAweEUyNTIsIDB4MDAwMCwgMHgwMDAwLCAweDcwNEIsIDB4NzA3RSwgMHg3MEE3LAorICAgIDB4RkZGRCwgMHg3MENDLCAweDcwRDUsIDB4NzBENiwgMHg3MERGLCAweDQxMDQsIDB4M0RFOCwgMHg3MUI0LCAweDcxOTYsCisgICAgMHgwMDAwLCAweDcxMkIsIDB4NzE0NSwgMHg1QTg4LCAweDcxNEEsIDB4RkE0OCwgMHgwMDAwLCAweDcxNEYsIDB4OTM2MiwKKyAgICAweDAwMDAsIDB4NzEyQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg3MUJBLCAweDAwMDAsIDB4NzBCRCwgMHg3MjBFLAorICAgIDB4OTQ0MiwgMHg3MjE1LCAweDU5MTEsIDB4OTQ0MywgMHg3MjI0LCAweDkzNDEsIDB4MDAwMCwgMHg3MjJFLCAweDcyNDAsCisgICAgMHgwMDAwLCAweDY4QkQsIDB4NzI1NSwgMHg3MjU3LCAweDNFNTUsIDB4MDAwMCwgMHg2ODBELCAweDZGM0QsIDB4NzI4MiwKKyAgICAweEZGRkQsIDB4NzMyQiwgMHgwMDAwLCAweDAwMDAsIDB4NDhFRCwgMHgwMDAwLCAweDczMjgsIDB4NzMyRSwgMHg3M0NGLAorICAgIDB4NzNBQSwgMHgwMDAwLCAweDAwMDAsIDB4NzNDOSwgMHg3NDQ5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDY2MjMsCisgICAgMHgzNkM1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDczRjcsIDB4NzQxNSwgMHg2OTAzLCAweDAwMDAsIDB4NzQzOSwKKyAgICAweDNFRDcsIDB4MDAwMCwgMHgwMDAwLCAweDc0NjAsIDB4MDAwMCwgMHg3NDQ3LCAweDczRTQsIDB4NzQ3NiwgMHg4M0I5LAorICAgIDB4NzQ2QywgMHg3NDc0LCAweDkzRjEsIDB4NkEyQywgMHg3NDgyLCAweDQ5NTMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDVCNDYsIDB4MDAwMCwgMHgwMDAwLCAweDc0QzgsIDB4MDAwMCwgMHg3NTBFLCAweDc1MUUsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4NUJENywgMHgwMDAwLCAweDkzODUsIDB4NzU0RCwgMHg3NTRBLCAweDc1NjcsIDB4NzU2RSwgMHgwMDAwLAorICAgIDB4M0YwNCwgMHgwMDAwLCAweDc1OEUsIDB4NzQ1RCwgMHg3NTlFLCAweDc1QjQsIDB4NzYwMiwgMHg3NjJDLCAweDc2NTEsCisgICAgMHg3NjRGLCAweDc2NkYsIDB4RTJEMywgMHgwMDAwLCAweDc2OTAsIDB4ODFFRiwgMHgzN0Y4LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDc2QTEsIDB4NzZBNSwgMHg3NkI3LCAweDc2Q0MsIDB4MDAwMCwgMHg4NDYyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4NzcxRSwgMHg3NzI2LCAweDc3NDAsIDB4NjRBRiwgMHgwMDAwLCAweDc3NTgsIDB4MDAwMCwgMHg3N0FGLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4NzdGNCwgMHhGRkZELCAweDY4Q0EsIDB4NzhBRiwgMHg3OEM3LCAweDc4RDMsIDB4OTZBNSwKKyAgICAweDc5MkUsIDB4MDAwMCwgMHg3OEQ3LCAweDc5MzQsIDB4NzhCMSwgMHgwMDAwLCAweDhGQjgsIDB4ODg4NCwgMHgwMDAwLAorICAgIDB4Nzk4NiwgMHg4OTAwLCAweDY5MDIsIDB4Nzk4MCwgMHgwMDAwLCAweDc5OUQsIDB4MDAwMCwgMHg3OTNDLCAweDc5QTksCisgICAgMHg2RTJBLCAweDAwMDAsIDB4M0VBOCwgMHg3OUM2LCAweDAwMDAsIDB4NzlENCwgMHhGRkZELCAweDU1MjUsIDB4RkZGRCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDU1OTAsIDB4MDAwMCwgMHgzOUVDLCAweDAwMDAsIDB4OEU0NiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHhGRkZELCAweDAwMDAsIDB4Nzc3QSwgMHgwMDAwLCAweDNBMzQsIDB4NDdENSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDY0REQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4RkZGRCwgMHg2NDhELCAweDhFN0UsIDB4MDAwMCwKKyAgICAweEZGRkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHhGRkZELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4NDdGNCwgMHgwMDAwLCAweDAwMDAsIDB4OUFCMiwgMHgzQTY3LCAweDAwMDAsIDB4M0ZFRCwgMHgzNTA2LCAweDAwMDAsCisgICAgMHgwMDAwLCAweEZGRkQsIDB4MDAwMCwgMHg5RDZFLCAweDk4MTUsIDB4RkZGRCwgMHg0M0Q5LCAweEZGRkQsIDB4NjRCNCwKKyAgICAweDU0RTMsIDB4RkZGRCwgMHgwMDAwLCAweEZGRkQsIDB4MzlGQiwgMHhGRkZELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4NjRFQSwgMHgwMDAwLCAweDAwMDAsIDB4OEU2OCwgMHhGRkZELCAweDAwMDAsIDB4MDAwMCwgMHhGRkZELCAweDQ4MEIsCisgICAgMHgwMDAwLCAweDNGRkEsIDB4NTg3MywgMHgwMDAwLCAweEZGRkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweEZGRkQsIDB4NTU3OSwgMHhGRkZELCAweDQzQkEsIDB4RkZGRCwgMHg0QUI0LCAweDAwMDAsIDB4MDAwMCwgMHg4MUFBLAorICAgIDB4OThGNSwgMHgwMDAwLCAweDYzNzksIDB4MzlGRSwgMHgwMDAwLCAweDhEQzAsIDB4NTZBMSwgMHg2NDdDLCAweDNFNDMsCisgICAgMHhGRkZELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweEZGRkQsIDB4RkZGRCwgMHgwMDAwLCAweDAwMDAsIDB4Mzk5MiwKKyAgICAweDNBMDYsIDB4MDAwMCwgMHgzNTc4LCAweDAwMDAsIDB4MDAwMCwgMHhGRkZELCAweEZGRkQsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MzRCQywgMHg2QzNELCAweDAwMDAsIDB4RkZGRCwgMHhGRkZELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzQTE4LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDk1QUEsIDB4RkZGRCwgMHgwMDAwLCAweDcxNDAsIDB4RkZGRCwgMHg1MTU2LAorICAgIDB4NEVGRSwgMHg1MDg4LCAweEZGRkQsIDB4MzQ5MywgMHg1MTg2LCAweDVFNDIsIDB4NTIwNSwgMHg1MjI3LCAweDUyNzksCisgICAgMHgwMDAwLCAweDM1NTMsIDB4NTNDMiwgMHg1MzVGLCAweEZGRkQsIDB4NTUzRiwgMHhGRkZELCAweDU1RDgsIDB4MzVERCwKKyAgICAweDU2MjEsIDB4RkZGRCwgMHg1NjU0LCAweDAwMDAsIDB4RkZGRCwgMHgwMDAwLCAweEZGRkQsIDB4MDAwMCwgMHhGRkZELAorICAgIDB4RkZGRCwgMHgzN0I5LCAweDVDQzEsIDB4NUQxNSwgMHg1RDU2LCAweDM4MzgsIDB4NEU4MSwgMHg1RUJELCAweDM5MTQsCisgICAgMHg2MUI5LCAweDYyOTAsIDB4NjMxOCwgMHg2NDVBLCAweDY0OTEsIDB4ODE2RCwgMHg4MTg0LCAweDgxOTMsIDB4NjgwMCwKKyAgICAweDNCQkMsIDB4NzI4RiwgMHg3MkNELCAweDAwMDAsIDB4NzMzOSwgMHg3NTQyLCAweDc1REMsIDB4M0ZDMCwgMHgwMDAwLAorICAgIDB4M0ZENywgMHhGRkZELCAweDc2ODAsIDB4NzY4QywgMHg0MEE4LCAweDc4MzksIDB4NDEwMywgMHg3QTkxLCAweDdDMUIsCisgICAgMHg3Q0VELCAweDdGOTMsIDB4N0ZBRSwgMHhGRkZELCAweDgyRkYsIDB4NTg1RiwgMHg4NkIyLCAweDQ1QUMsIDB4ODc4QiwKKyAgICAweDg5NDcsIDB4RkZGRCwgMHg4QTI5LCAweEZGRkQsIDB4OEU3MSwgMHgwMDAwLCAweDhFQjAsIDB4RkZGRCwgMHg5MTVFLAorICAgIDB4OTE4QywgMHg5OTBFLCAweDk5MUMsIDB4RkZGRCwgMHhGRkZELCAweDlCODEsIDB4OURDMCwgMHg5RDkzLCAweDlFQUMsCisgICAgMHg0RDkxLCAweEZGRkQsIDB4OTNCQSwgMHg5RTdCLCAweDcwODksIDB4NzM0OCwgMHhGRkZELCAweDc5OTksIDB4OEZCNywKKyAgICAweEZGRkQsIDB4OTk0MiwgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LAorICAgIDB4MDAyNywgMHgwMDI4LCAweDAwMjksIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLCAweDAwMkYsCisgICAgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwKKyAgICAweDAwMzksIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLCAweDAwM0YsIDB4MDA0MCwgMHgwMDQxLAorICAgIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsCisgICAgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywKKyAgICAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MDA1QiwgMHgwMDVDLAorICAgIDB4MDA1RCwgMHgwMDVFLCAweDAwNUYsIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsCisgICAgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsIDB4MDA2RSwKKyAgICAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorICAgIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDA3QiwgMHgwMDdDLCAweDAwN0QsIDB4MDA3RSwgMHgwMEE5LCAweDIxMjIsCisgICAgMHgyMDI2LCAweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKyAgICAweDAwMjgsIDB4MDAyOSwgMHgwMDJBLCAweDAwMkIsIDB4MDAyQywgMHgwMDJELCAweDAwMkUsIDB4MDAyRiwgMHgwMDMwLAorICAgIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgMHgwMDM4LCAweDAwMzksCisgICAgMHgwMDNBLCAweDAwM0IsIDB4MDAzQywgMHgwMDNELCAweDAwM0UsIDB4MDAzRiwgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwKKyAgICAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLAorICAgIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsCisgICAgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgwMDVCLCAweDAwNUMsIDB4MDA1RCwKKyAgICAweDAwNUUsIDB4MDA1RiwgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LAorICAgIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsCisgICAgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwKKyAgICAweDAwNzksIDB4MDA3QSwgMHgwMDdCLCAweDAwN0MsIDB4MDA3RCwgMHgwMDdFLCAweDIwQUMsIDB4MjBBQywgMHgyMTEwLAorICAgIDB4MjBBQywgMHgyMEFDLCAweDMwOUIsIDB4MzA5QywgMHgyRTgwLCAweDMxQzAsIDB4MzFDMSwgMHgzMUMyLCAweDMxQzMsCisgICAgMHgzMUM0LCAweDAwMDAsIDB4MzFDNSwgMHgwMDAwLCAweDAwMDAsIDB4MzFDNiwgMHgzMUM3LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDMxQzgsIDB4MDAwMCwgMHgzMUM5LCAweDMxQ0EsIDB4MzFDQiwgMHgzMUNDLCAweDAwMDAsIDB4MzFDRCwgMHgzMUNFLAorICAgIDB4RjUzOCwgMHhGNTM5LCAweDAwMDAsIDB4MDAwMCwgMHg5NzUxLCAweDAwMDAsIDB4NEU1QiwgMHg0RUJCLCAweDM1M0UsCisgICAgMHg1QzIzLCAweDVGNTEsIDB4NUZDNCwgMHgzOEZBLCAweDYyNEMsIDB4NjUzNSwgMHg2QjdBLCAweDZDMzUsIDB4NkMzQSwKKyAgICAweDcwNkMsIDB4NzIyQiwgMHg0RTJDLCAweDcyQUQsIDB4MDAwMCwgMHg3RjUyLCAweDc5M0IsIDB4N0NGOSwgMHg3RjUzLAorICAgIDB4MDAwMCwgMHgzNEMxLCAweDAwMDAsIDB4ODAwMiwgMHg4MDgwLCAweDAwMDAsIDB4MDAwMCwgMHg1MzVELCAweDg4NjQsCisgICAgMHg4OUMxLCAweDAwMDAsIDB4OEJBMCwgMHg4RDFELCAweDk0ODUsIDB4OTU3OCwgMHg5NTdGLCAweDk1RTgsIDB4MDAwMCwKKyAgICAweDk3RTYsIDB4OTg3NSwgMHg5OENFLCAweDk4REUsIDB4OTk2MywgMHgwMDAwLCAweDlDN0MsIDB4OUUxRiwgMHg5RUM0LAorICAgIDB4NkI2RiwgMHhGOTA3LCAweDRFMzcsIDB4MDAwMCwgMHg5NjFELCAweDYyMzcsIDB4OTRBMiwgMHgyRTg0LCAweDJFODYsCisgICAgMHgyRTg3LCAweDJFODgsIDB4MkU4QSwgMHgyRThDLCAweDJFOEQsIDB4MkU5NSwgMHgyRTlDLCAweDJFQTUsIDB4MkVBNywKKyAgICAweDJFQUEsIDB4MkVBQywgMHgyRUFFLCAweDJFQjYsIDB4MkVCQywgMHgyRUJFLCAweDJFQ0EsIDB4MkVDQywgMHgyRUNELAorICAgIDB4MkVDRiwgMHgyRUQ2LCAweDJFRDcsIDB4MkVERSwgMHgwMDAwLCAweDAwMDAsIDB4NjUwQSwgMHg0RTNELCAweDZFREQsCisgICAgMHg5RDRFLCAweDkxREYsIDB4MDAwMCwgMHg0RjFBLCAweDRGMjgsIDB4NEZBOCwgMHg1MTc0LCAweDUxOUMsIDB4NTFFNCwKKyAgICAweDUyQTEsIDB4NTJBOCwgMHg1MzNCLCAweDUzNEUsIDB4NTNEMSwgMHg1M0Q4LCAweDU2RTIsIDB4NThGMCwgMHg1OTA0LAorICAgIDB4NTkwNywgMHg1OTMyLCAweDU5MzQsIDB4NUI2NiwgMHg1QjlFLCAweDVCOUYsIDB4NUM5QSwgMHg1RTg2LCAweDYwM0IsCisgICAgMHg2NTg5LCAweDY3RkUsIDB4NjgwNCwgMHg2ODY1LCAweDZENEUsIDB4NzBCQywgMHg3NTM1LCAweDdFQTQsIDB4N0VBQywKKyAgICAweDdFQkEsIDB4N0VDNywgMHg3RUNGLCAweDdFREYsIDB4N0YwNiwgMHg3RjM3LCAweDgyN0EsIDB4ODJDRiwgMHg4MzZGLAorICAgIDB4ODlDNiwgMHg4QkJFLCAweDhCRTIsIDB4OEY2NiwgMHg4RjY3LCAweDhGNkUsIDB4NzQxMSwgMHg3Q0ZDLCAweDdEQ0QsCisgICAgMHg2OTQ2LCAweDdBQzksIDB4NzhCOCwgMHg4MEJDLCAweDhEMEIsIDB4ODBGNiwgMHgwMDAwLCAweDgwOUYsIDB4OUVDNywKKyAgICAweDRDQ0QsIDB4OURDOSwgMHg5RTBDLCAweDRDM0UsIDB4MDAwMCwgMHgwMDAwLCAweDlFMEEsIDB4MDAwMCwgMHgzNUMxLAorICAgIDB4NkU5QSwgMHg4MjNFLCAweDc1MTksIDB4NDkxMSwgMHg5QTZDLCAweDlBOEYsIDB4OUY5OSwgMHg3OTg3LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg0RTI0LCAweDRFODAsIDB4NEU4NywgMHg0RUJGLCAweDRFRUIsIDB4NEYzNywKKyAgICAweDM0NEMsIDB4NEZCRCwgMHgzRTQ4LCAweDUwMDMsIDB4MzQ3RCwgMHgzNEE1LCAweDU5MDUsIDB4NTFEQiwgMHg1MUZDLAorICAgIDB4NEU4OSwgMHg1MjkwLCAweDUzMjcsIDB4MzVDNywgMHg1M0E5LCAweDM1NTEsIDB4NTNCMCwgMHg1NDIzLCAweDM1NkQsCisgICAgMHgzNTcyLCAweDM2ODEsIDB4NTQ5MywgMHg1NEEzLCAweDU0QjQsIDB4NTRCOSwgMHg1NEQwLCAweDU0RUYsIDB4NTUxOCwKKyAgICAweDU1MjMsIDB4NTUyOCwgMHgzNTk4LCAweDM1QTUsIDB4MzVCRiwgMHg1NUQ3LCAweDM1QzUsIDB4MDAwMCwgMHg0MDUzLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg0MEJCLCAweDAwMDAsIDB4NTY1MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MzVGQiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4M0Y5MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDNGRjksIDB4MDAwMCwgMHg2NDMyLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDU0Q0MsIDB4ODJDNCwKKyAgICAweDU1QjksIDB4MDAwMCwgMHg5QzI2LCAweDlBQjYsIDB4MDAwMCwgMHg4MEVDLCAweDVDMUMsIDB4MDAwMCwgMHg4MTM0LAorICAgIDB4Mzc5NywgMHgwMDAwLCAweDkxQjYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDM2MDksCisgICAgMHgwMDAwLCAweDU2QUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NUE1NCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4NTc5QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzNzAzLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDU4OTksIDB4NTI2OCwKKyAgICAweDM2MUEsIDB4MDAwMCwgMHg3QkIyLCAweDVCNjgsIDB4NDgwMCwgMHg0QjJDLCAweDlGMjcsIDB4NDlFNywgMHg5QzFGLAorICAgIDB4OUI4RCwgMHgwMDAwLCAweDAwMDAsIDB4NTVGQiwgMHgzNUYyLCAweDU2ODksIDB4NUQzRSwgMHg1RDQ4LCAweDNERkMsCisgICAgMHgzODBGLCAweDVEQTQsIDB4NURCOSwgMHgzODIwLCAweDVGMjUsIDB4NUY4MywgMHgzOTA4LCAweDM5M0YsIDB4Mzk0RCwKKyAgICAweDYwRDcsIDB4NjEzRCwgMHg1Q0U1LCAweDM5ODksIDB4NjFCNywgMHg2MUNGLCAweDM5QjgsIDB4NjIyQywgMHg2MkU1LAorICAgIDB4MzlGOCwgMHg1NkIxLCAweDNBMDMsIDB4NjNFMiwgMHg2M0ZCLCAweDY0MDcsIDB4M0E0QiwgMHg2NEMwLCAweDlGOUYsCisgICAgMHgzQTk3LCAweDY1ODYsIDB4M0FCRCwgMHg2NUZGLCAweDY2NTMsIDB4M0FGMiwgMHg2NjkyLCAweDNCMjIsIDB4NjcxNiwKKyAgICAweDNCNDIsIDB4NjdBNCwgMHgzQjU4LCAweDY4NEEsIDB4Njg4NCwgMHgzQjcyLCAweDNCNzEsIDB4M0I3QiwgMHg2OTA5LAorICAgIDB4Njk0MywgMHg3MjVDLCAweDY5NjQsIDB4Njk5RiwgMHg2OTg1LCAweDY5RDYsIDB4M0JERCwgMHg2QTY1LCAweDZBNzQsCisgICAgMHg2QTcxLCAweDZBODIsIDB4M0JFQywgMHg2QTk5LCAweDNCRjIsIDB4NkFBQiwgMHg2QUI1LCAweDZBRDQsIDB4NkFGNiwKKyAgICAweDZCODEsIDB4NkJDMSwgMHg2QkVBLCAweDZDNzUsIDB4NkNBQSwgMHgzQ0NCLCAweDZEMDIsIDB4NkQwNiwgMHg2RDI2LAorICAgIDB4NkQ4MSwgMHgzQ0VGLCAweDZEQTQsIDB4NkRCMSwgMHg2RTE1LCAweDZFMTgsIDB4NkUyOSwgMHg2RTg2LCAweDAwMDAsCisgICAgMHg2RUJCLCAweDZFRTIsIDB4NkVEQSwgMHg5RjdGLCAweDZFRTgsIDB4NkVFOSwgMHg2RjI0LCAweDZGMzQsIDB4M0Q0NiwKKyAgICAweDAwMDAsIDB4NkY4MSwgMHg2RkJFLCAweDNENkEsIDB4M0Q3NSwgMHg3MUI3LCAweDVDOTksIDB4M0Q4QSwgMHg3MDJDLAorICAgIDB4M0Q5MSwgMHg3MDUwLCAweDcwNTQsIDB4NzA2RiwgMHg3MDdGLCAweDAwMDAsIDB4NDNDMSwgMHgzNUYxLCAweDAwMDAsCisgICAgMHgzNjRFLCAweDNEQUQsIDB4MDAwMCwgMHg2NjdELCAweDdDNzQsIDB4NzQ4RCwgMHg3RTkyLCAweDQ1MDMsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgzNDdFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3NzEsIDB4NjNDMSwgMHg3Nzc3LAorICAgIDB4ODk4QSwgMHgwMDAwLCAweDhCNEMsIDB4MDAwMCwgMHg0OTJBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDNBRjAsCisgICAgMHg3MDhGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDY4ODgsIDB4MDAwMCwgMHg5RjYyLCAweDkzQzYsIDB4MDAwMCwKKyAgICAweDkzNjYsIDB4OTI4RiwgMHg4NjE0LCAweDAwMDAsIDB4NDE5MCwgMHg2NzhGLCAweDY4MUUsIDB4Mzg2MywgMHgwMDAwLAorICAgIDB4M0IxOSwgMHg4NDk2LCAweDAwMDAsIDB4MzlFMiwgMHg4NDgwLCAweDQzNkUsIDB4OTc3MSwgMHg5OTlCLCAweDQ5MkQsCisgICAgMHg2RjE3LCAweDAwMDAsIDB4NzBBNiwgMHgwMDAwLCAweDdFNjUsIDB4NUQyRiwgMHgzREYzLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDdEQTQsIDB4ODQyNiwgMHg1NDg1LCAweDAwMDAsIDB4MDAwMCwgMHg1NzdFLCAweDAwMDAsIDB4MDAwMCwgMHgzRkU1LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDcwMDMsIDB4MDAwMCwgMHg1RDcwLCAweDczOEYsIDB4MDAwMCwgMHgwMDAwLCAweDRGQzgsCisgICAgMHg3RkU3LCAweDczMTAsIDB4NzMzOCwgMHg3MzQxLCAweDNFQTksIDB4NzFGNSwgMHgwMDAwLCAweDczRTEsIDB4M0VDQSwKKyAgICAweDNFRDEsIDB4NzQxOSwgMHg3NDFFLCAweDc0MUYsIDB4M0VFMiwgMHgzRUYwLCAweDNFRjQsIDB4M0VGQSwgMHg3NEQzLAorICAgIDB4M0YwRSwgMHgzRjUzLCAweDc1NkQsIDB4NzU3MiwgMHg3NThELCAweDNGN0MsIDB4NzVDOCwgMHg3NjRELCAweDc2NzQsCisgICAgMHgzRkRDLCAweDc2N0EsIDB4NzE4OCwgMHg1NjIzLCAweDg5ODAsIDB4NDAxRCwgMHg3NzQzLCAweDQwMzksIDB4NDA0NSwKKyAgICAweDM1REIsIDB4Nzc5OCwgMHg0MDZBLCAweDQwNkYsIDB4NzdCRSwgMHg3N0NCLCAweDc4MTgsIDB4NzgxQywgMHg3ODQ3LAorICAgIDB4Nzg1MSwgMHg3ODY2LCAweDg0NDgsIDB4MDAwMCwgMHg3OTMzLCAweDc5MzIsIDB4NDEwOSwgMHg3OTkxLCAweDdBMDYsCisgICAgMHg0MTY3LCAweDQxQjIsIDB4N0FCQywgMHg4Mjc5LCAweDQxQzQsIDB4N0FDRiwgMHg3QURCLCAweDQxQ0YsIDB4N0I2MiwKKyAgICAweDdCNkMsIDB4N0I3QiwgMHg3QzEyLCAweDQyNjAsIDB4NDI3QSwgMHg3QzdCLCAweDdDOUMsIDB4NDI4QywgMHg3Q0I4LAorICAgIDB4NDI5NCwgMHg4RjkzLCAweDcwQzAsIDB4MDAwMCwgMHg3RENGLCAweDdERDQsIDB4N0REMCwgMHg3REZELCAweDdGQjQsCisgICAgMHg3MjlGLCAweDQzOTcsIDB4ODAyMCwgMHg4MDI1LCAweDgwMkUsIDB4ODAzMSwgMHg4MDU0LCAweDU3QjQsIDB4NzBBMCwKKyAgICAweDgwQjcsIDB4ODBFOSwgMHg0M0VELCAweDgxMEMsIDB4ODEwRSwgMHg4MTEyLCAweDgxMTQsIDB4NDQwMSwgMHgzQjM5LAorICAgIDB4ODE1NiwgMHg4MTU5LCAweDgxNUEsIDB4NDQxMywgMHg4MTdDLCAweDQ0MjUsIDB4NDQyRCwgMHg4MUE1LCAweDU3RUYsCisgICAgMHg4MUMxLCAweDgxRTQsIDB4ODI1NCwgMHg0NDhGLCAweDgyNzYsIDB4ODJDQSwgMHg4MkQ4LCAweDQ0QjAsIDB4ODM1NywKKyAgICAweDk2NjksIDB4ODQwNSwgMHg3MEY1LCAweDg0NjQsIDB4ODQ4OCwgMHg0NTA0LCAweDg0QkUsIDB4ODRFMSwgMHg4NEY4LAorICAgIDB4ODUxMCwgMHg4NTM4LCAweDg1NTIsIDB4NDUzQiwgMHg4NTZGLCAweDg1NzAsIDB4ODVFMCwgMHg0NTc3LCAweDg2NzIsCisgICAgMHg4NjkyLCAweDg2RUYsIDB4OTY0NSwgMHg0NjA2LCAweDQ2MTcsIDB4ODhBRSwgMHg4OEZGLCAweDg5MjQsIDB4ODk5MSwKKyAgICAweDAwMDAsIDB4OEEzOCwgMHg4QTk0LCAweDhBQjQsIDB4OEM1MSwgMHg4Q0Q0LCAweDhDRjIsIDB4OEQxQywgMHg0Nzk4LAorICAgIDB4OERDMywgMHg0N0VELCAweDhFM0EsIDB4NTc1NCwgMHg1NUY1LCAweDQ4MzcsIDB4OEVDRSwgMHg4RUUyLCAweDhFRTQsCisgICAgMHg4RUVELCAweDhFRjIsIDB4OEZDMSwgMHg4RkNBLCAweDhGQ0MsIDB4OTAzMywgMHg0OEFELCAweDk4RTAsIDB4OTIxMywKKyAgICAweDQ5MUUsIDB4OTIyOCwgMHg5MjU4LCAweDkyNkIsIDB4OTJCMSwgMHg5MkFFLCAweDkyQkYsIDB4OTJFMywgMHg5MkVCLAorICAgIDB4OTJGMywgMHg5MkY0LCAweDkyRkQsIDB4OTM0MywgMHg5Mzg0LCAweDkzQUQsIDB4NDk0NSwgMHg0OTUxLCAweDk0MTcsCisgICAgMHg5NDFELCAweDk0MkQsIDB4OTQzRSwgMHg0OTZBLCAweDk0NTQsIDB4OTQ3OSwgMHg5NTJELCAweDk1QTIsIDB4NDlBNywKKyAgICAweDk1RjQsIDB4OTYzMywgMHg0OUU1LCAweDRBMjQsIDB4OTc0MCwgMHg0QTM1LCAweDk3QjIsIDB4OTdDMiwgMHg0QUU0LAorICAgIDB4OThCOSwgMHg0QjE5LCAweDk4RjEsIDB4NTg0NCwgMHg5OTE5LCAweDk5MzcsIDB4OTk1RCwgMHg5OTYyLCAweDRCNzAsCisgICAgMHg5OUM1LCAweDRCOUQsIDB4OUEzQywgMHg5QjBGLCAweDlCNjksIDB4OUJERCwgMHg5QkYxLCAweDlCRjQsIDB4NEM2RCwKKyAgICAweDlDMjAsIDB4Mzc2RiwgMHgwMDAwLCAweDlENDksIDB4OUVGRSwgMHg1NjUwLCAweDlEQkQsIDB4OURGQywgMHg5NEY2LAorICAgIDB4OEZCNiwgMHg5RUIxLCAweDlFQkQsIDB4OUVDNiwgMHg5NERDLCAweDlFRTIsIDB4OUVGMSwgMHg5RUY4LCAweDlGNDQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5NEMzLCAweDAwMDAsIDB4OTRDMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4NTc1NywgMHg3MTczLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg1NDlFLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDM2NDcsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg1MzY0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg3MEJCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg3MTk4LCAweDAwMDAsIDB4NjlFOSwgMHgzNkM4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg1OEI1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg1Nzg4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4NTk2NSwgMHgwMDAwLCAweDAwMDAsIDB4NTczRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDU3QTEsIDB4NzE1MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDU2QjksIDB4MDAwMCwgMHgzNjE4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDk0OUYsIDB4MDAwMCwKKyAgICAweDM2QjksIDB4MDAwMCwgMHgwMDAwLCAweDU2RDYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg2M0U2LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4M0RGNywgMHgwMDAwLCAweDAwMDAsIDB4OEZEMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDdFOUYsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4NENBNCwgMHg5NTQ3LCAweDAwMDAsIDB4NzFBMiwgMHgwMDAwLCAweDAwMDAsIDB4NEQ5QywgMHgwMDAwLAorICAgIDB4OEZCRSwgMHg4RkJBLCAweDAwMDAsIDB4OEZCOSwgMHgwMDAwLCAweDRFRUEsIDB4MDAwMCwgMHg4RTgwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg0RTlBLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDNEQzYsIDB4MDAwMCwgMHg0RTFDLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg1NURFLCAweDg3ODYsIDB4MDAwMCwgMHgwMDAwLCAweDVCOTAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg0RTFBLCAweDRFMDQsIDB4NUIwRCwgMHgzNkFDLCAweDUzN0QsIDB4MzZBNSwgMHg1ODlBLCAweDAwMDAsCisgICAgMHg1N0FBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDU3QTcsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5QzFCLCAweDAwMDAsIDB4M0UwNiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4NTc3QSwgMHg1NERBLCAweDcxN0EsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzNjM1LCAweDAwMDAsIDB4NTIyMCwgMHgzQzE4LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NDU2MiwgMHg1QjFGLCAweDAwMDAsIDB4OUY1MCwKKyAgICAweDlFQTYsIDB4MDAwMCwgMHg1MUUyLCAweDUzNDIsIDB4NjZBRCwgMHg1ODVDLCAweDU1NTMsIDB4M0Q4NSwgMHg2MTYwLAorICAgIDB4NDhBRSwgMHg5N0JELCAweDAwMDAsIDB4NjBCMywgMHg4NDI0LCAweDk4MTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgzQjJCLCAweDNEMzIsIDB4MDAwMCwgMHg3MDgxLCAweDVDOUMsIDB4MDAwMCwgMHgzNzMwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMTAwLCAweDAwQzEsIDB4MDFDRCwgMHgwMEMwLCAweDAxMTIsIDB4MDBDOSwgMHgwMTFBLAorICAgIDB4MDBDOCwgMHgwMTRDLCAweDAwRDMsIDB4MDFEMSwgMHgwMEQyLCAweEYzMjUsIDB4MUVCRSwgMHhGMzI3LCAweDFFQzAsCisgICAgMHgwMENBLCAweDAxMDEsIDB4MDBFMSwgMHgwMUNFLCAweDAwRTAsIDB4MDI1MSwgMHgwMTEzLCAweDAwRTksIDB4MDExQiwKKyAgICAweDAwRTgsIDB4MDEyQiwgMHgwMEVELCAweDAxRDAsIDB4MDBFQywgMHgwMTRELCAweDAwRjMsIDB4MDFEMiwgMHgwMEYyLAorICAgIDB4MDE2QiwgMHgwMEZBLCAweDAxRDQsIDB4MDBGOSwgMHgwMUQ2LCAweDAxRDgsIDB4MDFEQSwgMHgwMURDLCAweDAwRkMsCisgICAgMHhGMzQ0LCAweDFFQkYsIDB4RjM0NiwgMHgxRUMxLCAweDAwRUEsIDB4MDI2MSwgMHgwMjgzLCAweDAyNTAsIDB4MDI1QiwKKyAgICAweDAyNTQsIDB4MDI3NSwgMHgwMTUzLCAweDAwRjgsIDB4MDE0QiwgMHgwMjhBLCAweDAyNkEsIDB4MjNEQSwgMHgyM0RCLAorICAgIDB4MkU5RCwgMHgyRUM2LCAweDJFRTMsIDB4NTAzQiwgMHg2REZFLCAweDAwMDAsIDB4OUZBNiwgMHgzREM5LCAweDg4OEYsCisgICAgMHgwMDAwLCAweDcwNzcsIDB4NUNGNSwgMHg0QjIwLCAweDAwMDAsIDB4MzU1OSwgMHgwMDAwLCAweDYxMjIsIDB4MDAwMCwKKyAgICAweDhGQTcsIDB4OTFGNiwgMHg3MTkxLCAweDY3MTksIDB4NzNCQSwgMHgwMDAwLCAweDAwMDAsIDB4M0M4QiwgMHgwMDAwLAorICAgIDB4NEIxMCwgMHg3OEU0LCAweDc0MDIsIDB4NTFBRSwgMHgwMDAwLCAweDQwMDksIDB4NkE2MywgMHgwMDAwLCAweDQyMjMsCisgICAgMHg4NjBGLCAweDdBMkEsIDB4MDAwMCwgMHgwMDAwLCAweDk3NTUsIDB4NzA0RCwgMHg1MzI0LCAweDAwMDAsIDB4OTNGNCwKKyAgICAweDc2RDksIDB4MDAwMCwgMHg5RkE3LCAweDc3REQsIDB4NEVBMywgMHg0RkYwLCAweDUwQkMsIDB4NEUyRiwgMHg0RjE3LAorICAgIDB4OUZBOCwgMHg1NDM0LCAweDdEOEIsIDB4NTg5MiwgMHg1OEQwLCAweDAwMDAsIDB4NUU5MiwgMHg1RTk5LCAweDVGQzIsCisgICAgMHgwMDAwLCAweDY1OEIsIDB4MDAwMCwgMHg2OTE5LCAweDZBNDMsIDB4MDAwMCwgMHg2Q0ZGLCAweDcyMDAsIDB4MDAwMCwKKyAgICAweDczOEMsIDB4M0VEQiwgMHgwMDAwLCAweDVCMTUsIDB4NzRCOSwgMHg4QjgzLCAweDAwMDAsIDB4MDAwMCwgMHg3QTkzLAorICAgIDB4N0JFQywgMHg3Q0MzLCAweDdFNkMsIDB4ODJGOCwgMHg4NTk3LCAweDlGQTksIDB4ODg5MCwgMHg5RkFBLCAweDhFQjksCisgICAgMHg5RkFCLCAweDhGQ0YsIDB4ODU1RiwgMHg5OUUwLCAweDkyMjEsIDB4OUZBQywgMHgwMDAwLCAweDAwMDAsIDB4NDA3MSwKKyAgICAweDQyQTIsIDB4NUExQSwgMHg5ODY4LCAweDY3NkIsIDB4NDI3NiwgMHg1NzNELCAweDg1RDYsIDB4MDAwMCwgMHg4MkJGLAorICAgIDB4MDAwMCwgMHg0QzgxLCAweDAwMDAsIDB4NUQ3QiwgMHgwMDAwLCAweDAwMDAsIDB4OUZBRCwgMHg5RkFFLCAweDVCOTYsCisgICAgMHg5RkFGLCAweDdFNUIsIDB4NDNGMCwgMHg0QzMyLCAweDQ2MDMsIDB4NDVBNiwgMHg0NTc4LCAweDAwMDAsIDB4NEQ3NywKKyAgICAweDQ1QjMsIDB4MDAwMCwgMHg0Q0UyLCAweDAwMDAsIDB4M0I5NSwgMHg0NzM2LCAweDQ3NDQsIDB4NEM0NywgMHg0QzQwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDRDNTcsIDB4MDAwMCwgMHg0NzRGLCAweDQ1REEsCisgICAgMHg0Qzg1LCAweDAwMDAsIDB4NEQwNywgMHg0QUE0LCAweDQ2QTEsIDB4MDAwMCwgMHg3MjI1LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg2NjRELCAweDU2RkIsIDB4N0Q5NSwgMHg1OTFELCAweDAwMDAsIDB4M0RGNCwgMHg5NzM0LAorICAgIDB4MDAwMCwgMHg1QkRCLCAweDAwMDAsIDB4NUFBNCwgMHgzNjI1LCAweDAwMDAsIDB4NUFEMSwgMHg1QkI3LCAweDVDRkMsCisgICAgMHg2NzZFLCAweDg1OTMsIDB4MDAwMCwgMHg3NDYxLCAweDc0OUQsIDB4MDAwMCwgMHg2NkU3LCAweDZFNTcsIDB4NzlDQSwKKyAgICAweDNEODgsIDB4NDRDMywgMHgwMDAwLCAweDAwMDAsIDB4NDM5QSwgMHg0NTM2LCAweDVDRDUsIDB4MDAwMCwgMHg4QUY5LAorICAgIDB4NUM3OCwgMHgzRDEyLCAweDAwMDAsIDB4NUQ3OCwgMHg5RkIyLCAweDcxNTcsIDB4NDU1OCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg0Qzc3LCAweDM5NzgsIDB4MzQ0QSwgMHgwMDAwLCAweDAwMDAsIDB4OEFDQywgMHg0RkI0LCAweDAwMDAsIDB4NTlCRiwKKyAgICAweDgxNkMsIDB4OTg1NiwgMHgwMDAwLCAweDVGM0IsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NDEwMiwgMHg0NkJCLAorICAgIDB4MDAwMCwgMHgzRjA3LCAweDlGQjMsIDB4MDAwMCwgMHg0MEY4LCAweDM3RDYsIDB4NDZGNywgMHgwMDAwLCAweDQxN0MsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4NDU2RCwgMHgzOEQ0LCAweDAwMDAsIDB4NDU2MSwgMHg0NTFCLCAweDREODksIDB4NEM3QiwKICAgICAweDRENzYsIDB4NDVFQSwgMHgzRkM4LCAweDAwMDAsIDB4MzY2MSwgMHg0NERFLCAweDQ0QkQsIDB4NDFFRCwKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9CNXBjLUhfMC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9CNXBjLUhfMC5jcHAKaW5kZXggZDcwZTM2MS4uOGJmODgwOCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvQjVwYy1IXzAuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0I1cGMtSF8wLmNwcApAQCAtMSwxMCArMSwxMiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi1leHRlcm4gY29uc3QgdW5zaWduZWQgc2hvcnQgZ19GWENNQVBfQjVwY19IXzBbMjQ3ICogM10gPSB7CisjaW5jbHVkZSAiY21hcHNfY25zMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0I1cGNfSF8wWzI0NyAqIDNdID0gewogICAgIDB4MDAyMCwgMHgwMDdFLCAweDAwMDEsIDB4MDA4MCwgMHgwMDgwLCAweDAwM0QsIDB4MDBGRCwgMHgwMEZGLCAweDAwNjAsCiAgICAgMHhBMTQwLCAweEExNTgsIDB4MDA2MywgMHhBMTU5LCAweEExNUMsIDB4MzVBRiwgMHhBMTVELCAweEExN0UsIDB4MDA4MCwKICAgICAweEExQTEsIDB4QTFGNSwgMHgwMEEyLCAweEExRjYsIDB4QTFGNiwgMHgwMEY4LCAweEExRjcsIDB4QTFGNywgMHgwMEY3LApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvQjVwYy1WXzAuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvQjVwYy1WXzAuY3BwCmluZGV4IDY1YTAxNmUuLjRkNjg0MzcgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0I1cGMtVl8wLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9CNXBjLVZfMC5jcHAKQEAgLTEsMTAgKzEsMTIgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0IGdfRlhDTUFQX0I1cGNfVl8wWzEyICogM10gPSB7CisjaW5jbHVkZSAiY21hcHNfY25zMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0I1cGNfVl8wWzEyICogM10gPSB7CiAgICAgMHhBMTRCLCAweEExNEIsIDB4MzU0RSwgMHhBMTVBLCAweEExNUEsIDB4MzVBRiwgMHhBMTVDLCAweEExNUMsIDB4MzVCMSwKICAgICAweEExNUQsIDB4QTE1RSwgMHgwMDgyLCAweEExNjEsIDB4QTE2MiwgMHgwMDg2LCAweEExNjUsIDB4QTE2NiwgMHgwMDhBLAogICAgIDB4QTE2OSwgMHhBMTZBLCAweDAwOEUsIDB4QTE2RCwgMHhBMTZFLCAweDAwOTIsIDB4QTE3MSwgMHhBMTcyLCAweDAwOTYsCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9DTlMtRVVDLUhfMC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9DTlMtRVVDLUhfMC5jcHAKaW5kZXggNjA0MWYzNC4uODg4MWM5MSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvQ05TLUVVQy1IXzAuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0NOUy1FVUMtSF8wLmNwcApAQCAtMSwxMCArMSwxMiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi1leHRlcm4gY29uc3QgdW5zaWduZWQgc2hvcnQgZ19GWENNQVBfQ05TX0VVQ19IXzBbMTU3ICogM10gPSB7CisjaW5jbHVkZSAiY21hcHNfY25zMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0NOU19FVUNfSF8wWzE1NyAqIDNdID0gewogICAgIDB4MDAyMCwgMHgwMDdFLCAweDM1NTAsIDB4QTFBMSwgMHhBMUZFLCAweDAwNjMsIDB4QTJBMSwgMHhBMkZFLCAweDAwQzEsCiAgICAgMHhBM0ExLCAweEEzQ0UsIDB4MDExRiwgMHhBNEExLCAweEE0RkUsIDB4MDE0RCwgMHhBNUExLCAweEE1RUMsIDB4MDFBQiwKICAgICAweEE1RUUsIDB4QTVGMCwgMHgwMUY3LCAweEE2QTEsIDB4QTZCRSwgMHgwMUZBLCAweEE3QTEsIDB4QTdBMSwgMHgwMjUzLApAQCAtNTksMTI0ICs2MSwxMTIgQEAKICAgICAweEZBQTEsIDB4RkFGRSwgMHgxNjI3LCAweEZCQTEsIDB4RkJGRSwgMHgxNjg1LCAweEZDQTEsIDB4RkNGRSwgMHgxNkUzLAogICAgIDB4RkRBMSwgMHhGRENCLCAweDE3NDEsCiB9OwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0IGdfRlhDTUFQX0NOU19FVUNfSF8wX0RXb3JkWzIzOCAqIDRdID0gewotICAgIDB4OEVBMSwgMHhBMUExLCAweEExRkUsIDB4MDA2MywgMHg4RUExLCAweEEyQTEsIDB4QTJGRSwgMHgwMEMxLAotICAgIDB4OEVBMSwgMHhBM0ExLCAweEEzQ0UsIDB4MDExRiwgMHg4RUExLCAweEE0QTEsIDB4QTRGRSwgMHgwMTRELAotICAgIDB4OEVBMSwgMHhBNUExLCAweEE1RUMsIDB4MDFBQiwgMHg4RUExLCAweEE1RUUsIDB4QTVGMCwgMHgwMUY3LAotICAgIDB4OEVBMSwgMHhBNkExLCAweEE2QkUsIDB4MDFGQSwgMHg4RUExLCAweEE3QTEsIDB4QTdBMSwgMHgwMjUzLAotICAgIDB4OEVBMSwgMHhBN0EyLCAweEE3QTQsIDB4MDIxOCwgMHg4RUExLCAweEE3QTUsIDB4QTdBNSwgMHgwMjU0LAotICAgIDB4OEVBMSwgMHhBN0E2LCAweEE3QTYsIDB4MDIxQiwgMHg4RUExLCAweEE3QTcsIDB4QTdBNywgMHgwMjVBLAotICAgIDB4OEVBMSwgMHhBN0E4LCAweEE3QTgsIDB4MDIxQywgMHg4RUExLCAweEE3QTksIDB4QTdBQywgMHgwMjVCLAotICAgIDB4OEVBMSwgMHhBN0FELCAweEE3QUYsIDB4MDIxRCwgMHg4RUExLCAweEE3QjAsIDB4QTdCMCwgMHgwMjVGLAotICAgIDB4OEVBMSwgMHhBN0IxLCAweEE3QjEsIDB4MTc2RSwgMHg4RUExLCAweEE3QjIsIDB4QTdCMiwgMHgwMjYwLAotICAgIDB4OEVBMSwgMHhBN0IzLCAweEE3QjMsIDB4MDI2MiwgMHg4RUExLCAweEE3QjQsIDB4QTdCNCwgMHgwMjIwLAotICAgIDB4OEVBMSwgMHhBN0I1LCAweEE3QjUsIDB4MDI2MywgMHg4RUExLCAweEE3QjYsIDB4QTdCNiwgMHgxNzZGLAotICAgIDB4OEVBMSwgMHhBN0I3LCAweEE3QjcsIDB4MDIyMSwgMHg4RUExLCAweEE3QjgsIDB4QTdCOSwgMHgwMjY0LAotICAgIDB4OEVBMSwgMHhBN0JBLCAweEE3QkEsIDB4MDIyMiwgMHg4RUExLCAweEE3QkIsIDB4QTdCQiwgMHgxNzcwLAotICAgIDB4OEVBMSwgMHhBN0JDLCAweEE3QkMsIDB4MDIyMywgMHg4RUExLCAweEE3QkQsIDB4QTdCRCwgMHgwMjY2LAotICAgIDB4OEVBMSwgMHhBN0JFLCAweEE3QkUsIDB4MDI3OSwgMHg4RUExLCAweEE3QkYsIDB4QTdCRiwgMHgxNzc1LAotICAgIDB4OEVBMSwgMHhBN0MwLCAweEE3QzEsIDB4MDI3QSwgMHg4RUExLCAweEE3QzIsIDB4QTdDMiwgMHgwMjI0LAotICAgIDB4OEVBMSwgMHhBN0MzLCAweEE3QzYsIDB4MDI3QywgMHg4RUExLCAweEE3QzcsIDB4QTdDNywgMHgwMjI1LAotICAgIDB4OEVBMSwgMHhBN0M4LCAweEE3Q0IsIDB4MDI4MiwgMHg4RUExLCAweEE3Q0MsIDB4QTdDQywgMHgxNzc2LAotICAgIDB4OEVBMSwgMHhBN0NELCAweEE3Q0QsIDB4MDI4NiwgMHg4RUExLCAweEE3Q0UsIDB4QTdDRSwgMHgwMjI2LAotICAgIDB4OEVBMSwgMHhBN0NGLCAweEE3RDAsIDB4MDI4OCwgMHg4RUExLCAweEE3RDEsIDB4QTdEMiwgMHgwMjhDLAotICAgIDB4OEVBMSwgMHhBN0QzLCAweEE3RDUsIDB4MDIyNywgMHg4RUExLCAweEE3RDYsIDB4QTdEOCwgMHgwMjhFLAotICAgIDB4OEVBMSwgMHhBN0Q5LCAweEE3REEsIDB4MDIyQSwgMHg4RUExLCAweEE3REIsIDB4QTdEQiwgMHgxNzc3LAotICAgIDB4OEVBMSwgMHhBN0RDLCAweEE3REYsIDB4MDJEMCwgMHg4RUExLCAweEE3RTAsIDB4QTdFMCwgMHgwMkQ1LAotICAgIDB4OEVBMSwgMHhBN0UxLCAweEE3RTEsIDB4MDIyQywgMHg4RUExLCAweEE3RTIsIDB4QTdFNSwgMHgwMkQ2LAotICAgIDB4OEVBMSwgMHhBN0U2LCAweEE3RTYsIDB4MDIyRCwgMHg4RUExLCAweEE3RTcsIDB4QTdFRCwgMHgwMkRBLAotICAgIDB4OEVBMSwgMHhBN0VFLCAweEE3RUUsIDB4MTc4QSwgMHg4RUExLCAweEE3RUYsIDB4QTdGMiwgMHgwMkUxLAotICAgIDB4OEVBMSwgMHhBN0YzLCAweEE3RjMsIDB4MTc4QywgMHg4RUExLCAweEE3RjQsIDB4QTdGOCwgMHgwMkU1LAotICAgIDB4OEVBMSwgMHhBN0Y5LCAweEE3RjksIDB4MTc4RCwgMHg4RUExLCAweEE3RkEsIDB4QTdGRCwgMHgwMkVBLAotICAgIDB4OEVBMSwgMHhBN0ZFLCAweEE3RkUsIDB4MDM1NiwgMHg4RUExLCAweEE4QTEsIDB4QThBNiwgMHgwMzU3LAotICAgIDB4OEVBMSwgMHhBOEE3LCAweEE4QTcsIDB4MDM1RSwgMHg4RUExLCAweEE4QTgsIDB4QThBOCwgMHgwMzYyLAotICAgIDB4OEVBMSwgMHhBOEE5LCAweEE4QUEsIDB4MDIyRSwgMHg4RUExLCAweEE4QUIsIDB4QThCMiwgMHgwMzYzLAotICAgIDB4OEVBMSwgMHhBOEIzLCAweEE4QjMsIDB4MTdCMiwgMHg4RUExLCAweEE4QjQsIDB4QThCNiwgMHgwMzZCLAotICAgIDB4OEVBMSwgMHhBOEI3LCAweEE4QkEsIDB4MDNGNiwgMHg4RUExLCAweEE4QkIsIDB4QThCQiwgMHgxODEyLAotICAgIDB4OEVBMSwgMHhBOEJDLCAweEE4QkUsIDB4MDNGQSwgMHg4RUExLCAweEE4QkYsIDB4QThDMywgMHgwM0ZFLAotICAgIDB4OEVBMSwgMHhBOEM0LCAweEE4Q0MsIDB4MDQwNSwgMHg4RUExLCAweEE4Q0QsIDB4QThDRCwgMHgxODEzLAotICAgIDB4OEVBMSwgMHhBOENFLCAweEE4Q0UsIDB4MTgxOCwgMHg4RUExLCAweEE4Q0YsIDB4QThEMiwgMHgwNDBGLAotICAgIDB4OEVBMSwgMHhBOEQzLCAweEE4RDMsIDB4MTgxOSwgMHg4RUExLCAweEE4RDQsIDB4QThEOSwgMHgwNTA4LAotICAgIDB4OEVBMSwgMHhBOERBLCAweEE4REEsIDB4MThFNywgMHg4RUExLCAweEE4REIsIDB4QThFMiwgMHgwNTBFLAotICAgIDB4OEVBMSwgMHhBOEUzLCAweEE4RTMsIDB4MDIzMCwgMHg4RUExLCAweEE4RTQsIDB4QThFNCwgMHgwNTFCLAotICAgIDB4OEVBMSwgMHhBOEU1LCAweEE4RTcsIDB4MDUyMCwgMHg4RUExLCAweEE4RTgsIDB4QThFQiwgMHgwNjk2LAotICAgIDB4OEVBMSwgMHhBOEVDLCAweEE4RUMsIDB4MDIzMSwgMHg4RUExLCAweEE4RUQsIDB4QThGMCwgMHgwNjlGLAotICAgIDB4OEVBMSwgMHhBOEYxLCAweEE4RkIsIDB4MDgyNiwgMHg4RUExLCAweEE4RkMsIDB4QThGRSwgMHgwOUY1LAotICAgIDB4OEVBMSwgMHhBOUExLCAweEE5QTEsIDB4MUUzMywgMHg4RUExLCAweEE5QTIsIDB4QTlBMiwgMHgwOUY4LAotICAgIDB4OEVBMSwgMHhBOUEzLCAweEE5QTMsIDB4MUUzNCwgMHg4RUExLCAweEE5QTQsIDB4QTlBNSwgMHgwOUY5LAotICAgIDB4OEVBMSwgMHhBOUE2LCAweEE5QUIsIDB4MEJFMSwgMHg4RUExLCAweEE5QUMsIDB4QTlBRSwgMHgwREJCLAotICAgIDB4OEVBMSwgMHhBOUFGLCAweEE5QUYsIDB4MjM2MCwgMHg4RUExLCAweEE5QjAsIDB4QTlCMCwgMHgyNjEyLAotICAgIDB4OEVBMSwgMHhBOUIxLCAweEE5QjMsIDB4MEY3QiwgMHg4RUExLCAweEE5QjQsIDB4QTlCNSwgMHgxMTAwLAotICAgIDB4OEVBMSwgMHhBOUI2LCAweEE5QjYsIDB4MTI4OSwgMHg4RUExLCAweEE5QjcsIDB4QTlCOCwgMHgxM0IyLAotICAgIDB4OEVBMSwgMHhBOUI5LCAweEE5QjksIDB4MkYwRCwgMHg4RUExLCAweEMyQTEsIDB4QzJDMSwgMHgwMjMyLAotICAgIDB4OEVBMSwgMHhDNEExLCAweEM0RkUsIDB4MDI1MywgMHg4RUExLCAweEM1QTEsIDB4QzVGRSwgMHgwMkIxLAotICAgIDB4OEVBMSwgMHhDNkExLCAweEM2RkUsIDB4MDMwRiwgMHg4RUExLCAweEM3QTEsIDB4QzdGRSwgMHgwMzZELAotICAgIDB4OEVBMSwgMHhDOEExLCAweEM4RkUsIDB4MDNDQiwgMHg4RUExLCAweEM5QTEsIDB4QzlGRSwgMHgwNDI5LAotICAgIDB4OEVBMSwgMHhDQUExLCAweENBRkUsIDB4MDQ4NywgMHg4RUExLCAweENCQTEsIDB4Q0JGRSwgMHgwNEU1LAotICAgIDB4OEVBMSwgMHhDQ0ExLCAweENDRkUsIDB4MDU0MywgMHg4RUExLCAweENEQTEsIDB4Q0RGRSwgMHgwNUExLAotICAgIDB4OEVBMSwgMHhDRUExLCAweENFRkUsIDB4MDVGRiwgMHg4RUExLCAweENGQTEsIDB4Q0ZGRSwgMHgwNjVELAotICAgIDB4OEVBMSwgMHhEMEExLCAweEQwRkUsIDB4MDZCQiwgMHg4RUExLCAweEQxQTEsIDB4RDFGRSwgMHgwNzE5LAotICAgIDB4OEVBMSwgMHhEMkExLCAweEQyRkUsIDB4MDc3NywgMHg4RUExLCAweEQzQTEsIDB4RDNGRSwgMHgwN0Q1LAotICAgIDB4OEVBMSwgMHhENEExLCAweEQ0RkUsIDB4MDgzMywgMHg4RUExLCAweEQ1QTEsIDB4RDVGRSwgMHgwODkxLAotICAgIDB4OEVBMSwgMHhENkExLCAweEQ2RkUsIDB4MDhFRiwgMHg4RUExLCAweEQ3QTEsIDB4RDdGRSwgMHgwOTRELAotICAgIDB4OEVBMSwgMHhEOEExLCAweEQ4RkUsIDB4MDlBQiwgMHg4RUExLCAweEQ5QTEsIDB4RDlGRSwgMHgwQTA5LAotICAgIDB4OEVBMSwgMHhEQUExLCAweERBRkUsIDB4MEE2NywgMHg4RUExLCAweERCQTEsIDB4REJGRSwgMHgwQUM1LAotICAgIDB4OEVBMSwgMHhEQ0ExLCAweERDRkUsIDB4MEIyMywgMHg4RUExLCAweEREQTEsIDB4RERGRSwgMHgwQjgxLAotICAgIDB4OEVBMSwgMHhERUExLCAweERFRkUsIDB4MEJERiwgMHg4RUExLCAweERGQTEsIDB4REZGRSwgMHgwQzNELAotICAgIDB4OEVBMSwgMHhFMEExLCAweEUwRkUsIDB4MEM5QiwgMHg4RUExLCAweEUxQTEsIDB4RTFGRSwgMHgwQ0Y5LAotICAgIDB4OEVBMSwgMHhFMkExLCAweEUyRkUsIDB4MEQ1NywgMHg4RUExLCAweEUzQTEsIDB4RTNGRSwgMHgwREI1LAotICAgIDB4OEVBMSwgMHhFNEExLCAweEU0RkUsIDB4MEUxMywgMHg4RUExLCAweEU1QTEsIDB4RTVGRSwgMHgwRTcxLAotICAgIDB4OEVBMSwgMHhFNkExLCAweEU2RkUsIDB4MEVDRiwgMHg4RUExLCAweEU3QTEsIDB4RTdGRSwgMHgwRjJELAotICAgIDB4OEVBMSwgMHhFOEExLCAweEU4RkUsIDB4MEY4QiwgMHg4RUExLCAweEU5QTEsIDB4RTlGRSwgMHgwRkU5LAotICAgIDB4OEVBMSwgMHhFQUExLCAweEVBRkUsIDB4MTA0NywgMHg4RUExLCAweEVCQTEsIDB4RUJGRSwgMHgxMEE1LAotICAgIDB4OEVBMSwgMHhFQ0ExLCAweEVDRkUsIDB4MTEwMywgMHg4RUExLCAweEVEQTEsIDB4RURGRSwgMHgxMTYxLAotICAgIDB4OEVBMSwgMHhFRUExLCAweEVFRkUsIDB4MTFCRiwgMHg4RUExLCAweEVGQTEsIDB4RUZGRSwgMHgxMjFELAotICAgIDB4OEVBMSwgMHhGMEExLCAweEYwRkUsIDB4MTI3QiwgMHg4RUExLCAweEYxQTEsIDB4RjFGRSwgMHgxMkQ5LAotICAgIDB4OEVBMSwgMHhGMkExLCAweEYyRkUsIDB4MTMzNywgMHg4RUExLCAweEYzQTEsIDB4RjNGRSwgMHgxMzk1LAotICAgIDB4OEVBMSwgMHhGNEExLCAweEY0RkUsIDB4MTNGMywgMHg4RUExLCAweEY1QTEsIDB4RjVGRSwgMHgxNDUxLAotICAgIDB4OEVBMSwgMHhGNkExLCAweEY2RkUsIDB4MTRBRiwgMHg4RUExLCAweEY3QTEsIDB4RjdGRSwgMHgxNTBELAotICAgIDB4OEVBMSwgMHhGOEExLCAweEY4RkUsIDB4MTU2QiwgMHg4RUExLCAweEY5QTEsIDB4RjlGRSwgMHgxNUM5LAotICAgIDB4OEVBMSwgMHhGQUExLCAweEZBRkUsIDB4MTYyNywgMHg4RUExLCAweEZCQTEsIDB4RkJGRSwgMHgxNjg1LAotICAgIDB4OEVBMSwgMHhGQ0ExLCAweEZDRkUsIDB4MTZFMywgMHg4RUExLCAweEZEQTEsIDB4RkRDQiwgMHgxNzQxLAotICAgIDB4OEVBMiwgMHhBMUExLCAweEExRkUsIDB4MTc2QywgMHg4RUEyLCAweEEyQTEsIDB4QTJGRSwgMHgxN0NBLAotICAgIDB4OEVBMiwgMHhBM0ExLCAweEEzRkUsIDB4MTgyOCwgMHg4RUEyLCAweEE0QTEsIDB4QTRGRSwgMHgxODg2LAotICAgIDB4OEVBMiwgMHhBNUExLCAweEE1RkUsIDB4MThFNCwgMHg4RUEyLCAweEE2QTEsIDB4QTZGRSwgMHgxOTQyLAotICAgIDB4OEVBMiwgMHhBN0ExLCAweEE3RkUsIDB4MTlBMCwgMHg4RUEyLCAweEE4QTEsIDB4QThGRSwgMHgxOUZFLAotICAgIDB4OEVBMiwgMHhBOUExLCAweEE5RkUsIDB4MUE1QywgMHg4RUEyLCAweEFBQTEsIDB4QUFGRSwgMHgxQUJBLAotICAgIDB4OEVBMiwgMHhBQkExLCAweEFCRkUsIDB4MUIxOCwgMHg4RUEyLCAweEFDQTEsIDB4QUNGRSwgMHgxQjc2LAotICAgIDB4OEVBMiwgMHhBREExLCAweEFERkUsIDB4MUJENCwgMHg4RUEyLCAweEFFQTEsIDB4QUVGRSwgMHgxQzMyLAotICAgIDB4OEVBMiwgMHhBRkExLCAweEFGRkUsIDB4MUM5MCwgMHg4RUEyLCAweEIwQTEsIDB4QjBGRSwgMHgxQ0VFLAotICAgIDB4OEVBMiwgMHhCMUExLCAweEIxRkUsIDB4MUQ0QywgMHg4RUEyLCAweEIyQTEsIDB4QjJGRSwgMHgxREFBLAotICAgIDB4OEVBMiwgMHhCM0ExLCAweEIzRkUsIDB4MUUwOCwgMHg4RUEyLCAweEI0QTEsIDB4QjRGRSwgMHgxRTY2LAotICAgIDB4OEVBMiwgMHhCNUExLCAweEI1RkUsIDB4MUVDNCwgMHg4RUEyLCAweEI2QTEsIDB4QjZGRSwgMHgxRjIyLAotICAgIDB4OEVBMiwgMHhCN0ExLCAweEI3RkUsIDB4MUY4MCwgMHg4RUEyLCAweEI4QTEsIDB4QjhGRSwgMHgxRkRFLAotICAgIDB4OEVBMiwgMHhCOUExLCAweEI5RkUsIDB4MjAzQywgMHg4RUEyLCAweEJBQTEsIDB4QkFGRSwgMHgyMDlBLAotICAgIDB4OEVBMiwgMHhCQkExLCAweEJCRkUsIDB4MjBGOCwgMHg4RUEyLCAweEJDQTEsIDB4QkNGRSwgMHgyMTU2LAotICAgIDB4OEVBMiwgMHhCREExLCAweEJERkUsIDB4MjFCNCwgMHg4RUEyLCAweEJFQTEsIDB4QkVGRSwgMHgyMjEyLAotICAgIDB4OEVBMiwgMHhCRkExLCAweEJGRkUsIDB4MjI3MCwgMHg4RUEyLCAweEMwQTEsIDB4QzBGRSwgMHgyMkNFLAotICAgIDB4OEVBMiwgMHhDMUExLCAweEMxRkUsIDB4MjMyQywgMHg4RUEyLCAweEMyQTEsIDB4QzJGRSwgMHgyMzhBLAotICAgIDB4OEVBMiwgMHhDM0ExLCAweEMzRkUsIDB4MjNFOCwgMHg4RUEyLCAweEM0QTEsIDB4QzRGRSwgMHgyNDQ2LAotICAgIDB4OEVBMiwgMHhDNUExLCAweEM1RkUsIDB4MjRBNCwgMHg4RUEyLCAweEM2QTEsIDB4QzZGRSwgMHgyNTAyLAotICAgIDB4OEVBMiwgMHhDN0ExLCAweEM3RkUsIDB4MjU2MCwgMHg4RUEyLCAweEM4QTEsIDB4QzhGRSwgMHgyNUJFLAotICAgIDB4OEVBMiwgMHhDOUExLCAweEM5RkUsIDB4MjYxQywgMHg4RUEyLCAweENBQTEsIDB4Q0FGRSwgMHgyNjdBLAotICAgIDB4OEVBMiwgMHhDQkExLCAweENCRkUsIDB4MjZEOCwgMHg4RUEyLCAweENDQTEsIDB4Q0NGRSwgMHgyNzM2LAotICAgIDB4OEVBMiwgMHhDREExLCAweENERkUsIDB4Mjc5NCwgMHg4RUEyLCAweENFQTEsIDB4Q0VGRSwgMHgyN0YyLAotICAgIDB4OEVBMiwgMHhDRkExLCAweENGRkUsIDB4Mjg1MCwgMHg4RUEyLCAweEQwQTEsIDB4RDBGRSwgMHgyOEFFLAotICAgIDB4OEVBMiwgMHhEMUExLCAweEQxRkUsIDB4MjkwQywgMHg4RUEyLCAweEQyQTEsIDB4RDJGRSwgMHgyOTZBLAotICAgIDB4OEVBMiwgMHhEM0ExLCAweEQzRkUsIDB4MjlDOCwgMHg4RUEyLCAweEQ0QTEsIDB4RDRGRSwgMHgyQTI2LAotICAgIDB4OEVBMiwgMHhENUExLCAweEQ1RkUsIDB4MkE4NCwgMHg4RUEyLCAweEQ2QTEsIDB4RDZGRSwgMHgyQUUyLAotICAgIDB4OEVBMiwgMHhEN0ExLCAweEQ3RkUsIDB4MkI0MCwgMHg4RUEyLCAweEQ4QTEsIDB4RDhGRSwgMHgyQjlFLAotICAgIDB4OEVBMiwgMHhEOUExLCAweEQ5RkUsIDB4MkJGQywgMHg4RUEyLCAweERBQTEsIDB4REFGRSwgMHgyQzVBLAotICAgIDB4OEVBMiwgMHhEQkExLCAweERCRkUsIDB4MkNCOCwgMHg4RUEyLCAweERDQTEsIDB4RENGRSwgMHgyRDE2LAotICAgIDB4OEVBMiwgMHhEREExLCAweERERkUsIDB4MkQ3NCwgMHg4RUEyLCAweERFQTEsIDB4REVGRSwgMHgyREQyLAotICAgIDB4OEVBMiwgMHhERkExLCAweERGRkUsIDB4MkUzMCwgMHg4RUEyLCAweEUwQTEsIDB4RTBGRSwgMHgyRThFLAotICAgIDB4OEVBMiwgMHhFMUExLCAweEUxRkUsIDB4MkVFQywgMHg4RUEyLCAweEUyQTEsIDB4RTJGRSwgMHgyRjRBLAotICAgIDB4OEVBMiwgMHhFM0ExLCAweEUzRkUsIDB4MkZBOCwgMHg4RUEyLCAweEU0QTEsIDB4RTRGRSwgMHgzMDA2LAotICAgIDB4OEVBMiwgMHhFNUExLCAweEU1RkUsIDB4MzA2NCwgMHg4RUEyLCAweEU2QTEsIDB4RTZGRSwgMHgzMEMyLAotICAgIDB4OEVBMiwgMHhFN0ExLCAweEU3RkUsIDB4MzEyMCwgMHg4RUEyLCAweEU4QTEsIDB4RThGRSwgMHgzMTdFLAotICAgIDB4OEVBMiwgMHhFOUExLCAweEU5RkUsIDB4MzFEQywgMHg4RUEyLCAweEVBQTEsIDB4RUFGRSwgMHgzMjNBLAotICAgIDB4OEVBMiwgMHhFQkExLCAweEVCRkUsIDB4MzI5OCwgMHg4RUEyLCAweEVDQTEsIDB4RUNGRSwgMHgzMkY2LAotICAgIDB4OEVBMiwgMHhFREExLCAweEVERkUsIDB4MzM1NCwgMHg4RUEyLCAweEVFQTEsIDB4RUVGRSwgMHgzM0IyLAotICAgIDB4OEVBMiwgMHhFRkExLCAweEVGRkUsIDB4MzQxMCwgMHg4RUEyLCAweEYwQTEsIDB4RjBGRSwgMHgzNDZFLAotICAgIDB4OEVBMiwgMHhGMUExLCAweEYxRkUsIDB4MzRDQywgMHg4RUEyLCAweEYyQTEsIDB4RjJDNCwgMHgzNTJBLAorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0NOU19FVUNfSF8wX0RXb3JkWzIzOCAqIDRdID0geworICAgIDB4OEVBMSwgMHhBMUExLCAweEExRkUsIDB4MDA2MywgMHg4RUExLCAweEEyQTEsIDB4QTJGRSwgMHgwMEMxLCAweDhFQTEsCisgICAgMHhBM0ExLCAweEEzQ0UsIDB4MDExRiwgMHg4RUExLCAweEE0QTEsIDB4QTRGRSwgMHgwMTRELCAweDhFQTEsIDB4QTVBMSwKKyAgICAweEE1RUMsIDB4MDFBQiwgMHg4RUExLCAweEE1RUUsIDB4QTVGMCwgMHgwMUY3LCAweDhFQTEsIDB4QTZBMSwgMHhBNkJFLAorICAgIDB4MDFGQSwgMHg4RUExLCAweEE3QTEsIDB4QTdBMSwgMHgwMjUzLCAweDhFQTEsIDB4QTdBMiwgMHhBN0E0LCAweDAyMTgsCisgICAgMHg4RUExLCAweEE3QTUsIDB4QTdBNSwgMHgwMjU0LCAweDhFQTEsIDB4QTdBNiwgMHhBN0E2LCAweDAyMUIsIDB4OEVBMSwKKyAgICAweEE3QTcsIDB4QTdBNywgMHgwMjVBLCAweDhFQTEsIDB4QTdBOCwgMHhBN0E4LCAweDAyMUMsIDB4OEVBMSwgMHhBN0E5LAorICAgIDB4QTdBQywgMHgwMjVCLCAweDhFQTEsIDB4QTdBRCwgMHhBN0FGLCAweDAyMUQsIDB4OEVBMSwgMHhBN0IwLCAweEE3QjAsCisgICAgMHgwMjVGLCAweDhFQTEsIDB4QTdCMSwgMHhBN0IxLCAweDE3NkUsIDB4OEVBMSwgMHhBN0IyLCAweEE3QjIsIDB4MDI2MCwKKyAgICAweDhFQTEsIDB4QTdCMywgMHhBN0IzLCAweDAyNjIsIDB4OEVBMSwgMHhBN0I0LCAweEE3QjQsIDB4MDIyMCwgMHg4RUExLAorICAgIDB4QTdCNSwgMHhBN0I1LCAweDAyNjMsIDB4OEVBMSwgMHhBN0I2LCAweEE3QjYsIDB4MTc2RiwgMHg4RUExLCAweEE3QjcsCisgICAgMHhBN0I3LCAweDAyMjEsIDB4OEVBMSwgMHhBN0I4LCAweEE3QjksIDB4MDI2NCwgMHg4RUExLCAweEE3QkEsIDB4QTdCQSwKKyAgICAweDAyMjIsIDB4OEVBMSwgMHhBN0JCLCAweEE3QkIsIDB4MTc3MCwgMHg4RUExLCAweEE3QkMsIDB4QTdCQywgMHgwMjIzLAorICAgIDB4OEVBMSwgMHhBN0JELCAweEE3QkQsIDB4MDI2NiwgMHg4RUExLCAweEE3QkUsIDB4QTdCRSwgMHgwMjc5LCAweDhFQTEsCisgICAgMHhBN0JGLCAweEE3QkYsIDB4MTc3NSwgMHg4RUExLCAweEE3QzAsIDB4QTdDMSwgMHgwMjdBLCAweDhFQTEsIDB4QTdDMiwKKyAgICAweEE3QzIsIDB4MDIyNCwgMHg4RUExLCAweEE3QzMsIDB4QTdDNiwgMHgwMjdDLCAweDhFQTEsIDB4QTdDNywgMHhBN0M3LAorICAgIDB4MDIyNSwgMHg4RUExLCAweEE3QzgsIDB4QTdDQiwgMHgwMjgyLCAweDhFQTEsIDB4QTdDQywgMHhBN0NDLCAweDE3NzYsCisgICAgMHg4RUExLCAweEE3Q0QsIDB4QTdDRCwgMHgwMjg2LCAweDhFQTEsIDB4QTdDRSwgMHhBN0NFLCAweDAyMjYsIDB4OEVBMSwKKyAgICAweEE3Q0YsIDB4QTdEMCwgMHgwMjg4LCAweDhFQTEsIDB4QTdEMSwgMHhBN0QyLCAweDAyOEMsIDB4OEVBMSwgMHhBN0QzLAorICAgIDB4QTdENSwgMHgwMjI3LCAweDhFQTEsIDB4QTdENiwgMHhBN0Q4LCAweDAyOEUsIDB4OEVBMSwgMHhBN0Q5LCAweEE3REEsCisgICAgMHgwMjJBLCAweDhFQTEsIDB4QTdEQiwgMHhBN0RCLCAweDE3NzcsIDB4OEVBMSwgMHhBN0RDLCAweEE3REYsIDB4MDJEMCwKKyAgICAweDhFQTEsIDB4QTdFMCwgMHhBN0UwLCAweDAyRDUsIDB4OEVBMSwgMHhBN0UxLCAweEE3RTEsIDB4MDIyQywgMHg4RUExLAorICAgIDB4QTdFMiwgMHhBN0U1LCAweDAyRDYsIDB4OEVBMSwgMHhBN0U2LCAweEE3RTYsIDB4MDIyRCwgMHg4RUExLCAweEE3RTcsCisgICAgMHhBN0VELCAweDAyREEsIDB4OEVBMSwgMHhBN0VFLCAweEE3RUUsIDB4MTc4QSwgMHg4RUExLCAweEE3RUYsIDB4QTdGMiwKKyAgICAweDAyRTEsIDB4OEVBMSwgMHhBN0YzLCAweEE3RjMsIDB4MTc4QywgMHg4RUExLCAweEE3RjQsIDB4QTdGOCwgMHgwMkU1LAorICAgIDB4OEVBMSwgMHhBN0Y5LCAweEE3RjksIDB4MTc4RCwgMHg4RUExLCAweEE3RkEsIDB4QTdGRCwgMHgwMkVBLCAweDhFQTEsCisgICAgMHhBN0ZFLCAweEE3RkUsIDB4MDM1NiwgMHg4RUExLCAweEE4QTEsIDB4QThBNiwgMHgwMzU3LCAweDhFQTEsIDB4QThBNywKKyAgICAweEE4QTcsIDB4MDM1RSwgMHg4RUExLCAweEE4QTgsIDB4QThBOCwgMHgwMzYyLCAweDhFQTEsIDB4QThBOSwgMHhBOEFBLAorICAgIDB4MDIyRSwgMHg4RUExLCAweEE4QUIsIDB4QThCMiwgMHgwMzYzLCAweDhFQTEsIDB4QThCMywgMHhBOEIzLCAweDE3QjIsCisgICAgMHg4RUExLCAweEE4QjQsIDB4QThCNiwgMHgwMzZCLCAweDhFQTEsIDB4QThCNywgMHhBOEJBLCAweDAzRjYsIDB4OEVBMSwKKyAgICAweEE4QkIsIDB4QThCQiwgMHgxODEyLCAweDhFQTEsIDB4QThCQywgMHhBOEJFLCAweDAzRkEsIDB4OEVBMSwgMHhBOEJGLAorICAgIDB4QThDMywgMHgwM0ZFLCAweDhFQTEsIDB4QThDNCwgMHhBOENDLCAweDA0MDUsIDB4OEVBMSwgMHhBOENELCAweEE4Q0QsCisgICAgMHgxODEzLCAweDhFQTEsIDB4QThDRSwgMHhBOENFLCAweDE4MTgsIDB4OEVBMSwgMHhBOENGLCAweEE4RDIsIDB4MDQwRiwKKyAgICAweDhFQTEsIDB4QThEMywgMHhBOEQzLCAweDE4MTksIDB4OEVBMSwgMHhBOEQ0LCAweEE4RDksIDB4MDUwOCwgMHg4RUExLAorICAgIDB4QThEQSwgMHhBOERBLCAweDE4RTcsIDB4OEVBMSwgMHhBOERCLCAweEE4RTIsIDB4MDUwRSwgMHg4RUExLCAweEE4RTMsCisgICAgMHhBOEUzLCAweDAyMzAsIDB4OEVBMSwgMHhBOEU0LCAweEE4RTQsIDB4MDUxQiwgMHg4RUExLCAweEE4RTUsIDB4QThFNywKKyAgICAweDA1MjAsIDB4OEVBMSwgMHhBOEU4LCAweEE4RUIsIDB4MDY5NiwgMHg4RUExLCAweEE4RUMsIDB4QThFQywgMHgwMjMxLAorICAgIDB4OEVBMSwgMHhBOEVELCAweEE4RjAsIDB4MDY5RiwgMHg4RUExLCAweEE4RjEsIDB4QThGQiwgMHgwODI2LCAweDhFQTEsCisgICAgMHhBOEZDLCAweEE4RkUsIDB4MDlGNSwgMHg4RUExLCAweEE5QTEsIDB4QTlBMSwgMHgxRTMzLCAweDhFQTEsIDB4QTlBMiwKKyAgICAweEE5QTIsIDB4MDlGOCwgMHg4RUExLCAweEE5QTMsIDB4QTlBMywgMHgxRTM0LCAweDhFQTEsIDB4QTlBNCwgMHhBOUE1LAorICAgIDB4MDlGOSwgMHg4RUExLCAweEE5QTYsIDB4QTlBQiwgMHgwQkUxLCAweDhFQTEsIDB4QTlBQywgMHhBOUFFLCAweDBEQkIsCisgICAgMHg4RUExLCAweEE5QUYsIDB4QTlBRiwgMHgyMzYwLCAweDhFQTEsIDB4QTlCMCwgMHhBOUIwLCAweDI2MTIsIDB4OEVBMSwKKyAgICAweEE5QjEsIDB4QTlCMywgMHgwRjdCLCAweDhFQTEsIDB4QTlCNCwgMHhBOUI1LCAweDExMDAsIDB4OEVBMSwgMHhBOUI2LAorICAgIDB4QTlCNiwgMHgxMjg5LCAweDhFQTEsIDB4QTlCNywgMHhBOUI4LCAweDEzQjIsIDB4OEVBMSwgMHhBOUI5LCAweEE5QjksCisgICAgMHgyRjBELCAweDhFQTEsIDB4QzJBMSwgMHhDMkMxLCAweDAyMzIsIDB4OEVBMSwgMHhDNEExLCAweEM0RkUsIDB4MDI1MywKKyAgICAweDhFQTEsIDB4QzVBMSwgMHhDNUZFLCAweDAyQjEsIDB4OEVBMSwgMHhDNkExLCAweEM2RkUsIDB4MDMwRiwgMHg4RUExLAorICAgIDB4QzdBMSwgMHhDN0ZFLCAweDAzNkQsIDB4OEVBMSwgMHhDOEExLCAweEM4RkUsIDB4MDNDQiwgMHg4RUExLCAweEM5QTEsCisgICAgMHhDOUZFLCAweDA0MjksIDB4OEVBMSwgMHhDQUExLCAweENBRkUsIDB4MDQ4NywgMHg4RUExLCAweENCQTEsIDB4Q0JGRSwKKyAgICAweDA0RTUsIDB4OEVBMSwgMHhDQ0ExLCAweENDRkUsIDB4MDU0MywgMHg4RUExLCAweENEQTEsIDB4Q0RGRSwgMHgwNUExLAorICAgIDB4OEVBMSwgMHhDRUExLCAweENFRkUsIDB4MDVGRiwgMHg4RUExLCAweENGQTEsIDB4Q0ZGRSwgMHgwNjVELCAweDhFQTEsCisgICAgMHhEMEExLCAweEQwRkUsIDB4MDZCQiwgMHg4RUExLCAweEQxQTEsIDB4RDFGRSwgMHgwNzE5LCAweDhFQTEsIDB4RDJBMSwKKyAgICAweEQyRkUsIDB4MDc3NywgMHg4RUExLCAweEQzQTEsIDB4RDNGRSwgMHgwN0Q1LCAweDhFQTEsIDB4RDRBMSwgMHhENEZFLAorICAgIDB4MDgzMywgMHg4RUExLCAweEQ1QTEsIDB4RDVGRSwgMHgwODkxLCAweDhFQTEsIDB4RDZBMSwgMHhENkZFLCAweDA4RUYsCisgICAgMHg4RUExLCAweEQ3QTEsIDB4RDdGRSwgMHgwOTRELCAweDhFQTEsIDB4RDhBMSwgMHhEOEZFLCAweDA5QUIsIDB4OEVBMSwKKyAgICAweEQ5QTEsIDB4RDlGRSwgMHgwQTA5LCAweDhFQTEsIDB4REFBMSwgMHhEQUZFLCAweDBBNjcsIDB4OEVBMSwgMHhEQkExLAorICAgIDB4REJGRSwgMHgwQUM1LCAweDhFQTEsIDB4RENBMSwgMHhEQ0ZFLCAweDBCMjMsIDB4OEVBMSwgMHhEREExLCAweERERkUsCisgICAgMHgwQjgxLCAweDhFQTEsIDB4REVBMSwgMHhERUZFLCAweDBCREYsIDB4OEVBMSwgMHhERkExLCAweERGRkUsIDB4MEMzRCwKKyAgICAweDhFQTEsIDB4RTBBMSwgMHhFMEZFLCAweDBDOUIsIDB4OEVBMSwgMHhFMUExLCAweEUxRkUsIDB4MENGOSwgMHg4RUExLAorICAgIDB4RTJBMSwgMHhFMkZFLCAweDBENTcsIDB4OEVBMSwgMHhFM0ExLCAweEUzRkUsIDB4MERCNSwgMHg4RUExLCAweEU0QTEsCisgICAgMHhFNEZFLCAweDBFMTMsIDB4OEVBMSwgMHhFNUExLCAweEU1RkUsIDB4MEU3MSwgMHg4RUExLCAweEU2QTEsIDB4RTZGRSwKKyAgICAweDBFQ0YsIDB4OEVBMSwgMHhFN0ExLCAweEU3RkUsIDB4MEYyRCwgMHg4RUExLCAweEU4QTEsIDB4RThGRSwgMHgwRjhCLAorICAgIDB4OEVBMSwgMHhFOUExLCAweEU5RkUsIDB4MEZFOSwgMHg4RUExLCAweEVBQTEsIDB4RUFGRSwgMHgxMDQ3LCAweDhFQTEsCisgICAgMHhFQkExLCAweEVCRkUsIDB4MTBBNSwgMHg4RUExLCAweEVDQTEsIDB4RUNGRSwgMHgxMTAzLCAweDhFQTEsIDB4RURBMSwKKyAgICAweEVERkUsIDB4MTE2MSwgMHg4RUExLCAweEVFQTEsIDB4RUVGRSwgMHgxMUJGLCAweDhFQTEsIDB4RUZBMSwgMHhFRkZFLAorICAgIDB4MTIxRCwgMHg4RUExLCAweEYwQTEsIDB4RjBGRSwgMHgxMjdCLCAweDhFQTEsIDB4RjFBMSwgMHhGMUZFLCAweDEyRDksCisgICAgMHg4RUExLCAweEYyQTEsIDB4RjJGRSwgMHgxMzM3LCAweDhFQTEsIDB4RjNBMSwgMHhGM0ZFLCAweDEzOTUsIDB4OEVBMSwKKyAgICAweEY0QTEsIDB4RjRGRSwgMHgxM0YzLCAweDhFQTEsIDB4RjVBMSwgMHhGNUZFLCAweDE0NTEsIDB4OEVBMSwgMHhGNkExLAorICAgIDB4RjZGRSwgMHgxNEFGLCAweDhFQTEsIDB4RjdBMSwgMHhGN0ZFLCAweDE1MEQsIDB4OEVBMSwgMHhGOEExLCAweEY4RkUsCisgICAgMHgxNTZCLCAweDhFQTEsIDB4RjlBMSwgMHhGOUZFLCAweDE1QzksIDB4OEVBMSwgMHhGQUExLCAweEZBRkUsIDB4MTYyNywKKyAgICAweDhFQTEsIDB4RkJBMSwgMHhGQkZFLCAweDE2ODUsIDB4OEVBMSwgMHhGQ0ExLCAweEZDRkUsIDB4MTZFMywgMHg4RUExLAorICAgIDB4RkRBMSwgMHhGRENCLCAweDE3NDEsIDB4OEVBMiwgMHhBMUExLCAweEExRkUsIDB4MTc2QywgMHg4RUEyLCAweEEyQTEsCisgICAgMHhBMkZFLCAweDE3Q0EsIDB4OEVBMiwgMHhBM0ExLCAweEEzRkUsIDB4MTgyOCwgMHg4RUEyLCAweEE0QTEsIDB4QTRGRSwKKyAgICAweDE4ODYsIDB4OEVBMiwgMHhBNUExLCAweEE1RkUsIDB4MThFNCwgMHg4RUEyLCAweEE2QTEsIDB4QTZGRSwgMHgxOTQyLAorICAgIDB4OEVBMiwgMHhBN0ExLCAweEE3RkUsIDB4MTlBMCwgMHg4RUEyLCAweEE4QTEsIDB4QThGRSwgMHgxOUZFLCAweDhFQTIsCisgICAgMHhBOUExLCAweEE5RkUsIDB4MUE1QywgMHg4RUEyLCAweEFBQTEsIDB4QUFGRSwgMHgxQUJBLCAweDhFQTIsIDB4QUJBMSwKKyAgICAweEFCRkUsIDB4MUIxOCwgMHg4RUEyLCAweEFDQTEsIDB4QUNGRSwgMHgxQjc2LCAweDhFQTIsIDB4QURBMSwgMHhBREZFLAorICAgIDB4MUJENCwgMHg4RUEyLCAweEFFQTEsIDB4QUVGRSwgMHgxQzMyLCAweDhFQTIsIDB4QUZBMSwgMHhBRkZFLCAweDFDOTAsCisgICAgMHg4RUEyLCAweEIwQTEsIDB4QjBGRSwgMHgxQ0VFLCAweDhFQTIsIDB4QjFBMSwgMHhCMUZFLCAweDFENEMsIDB4OEVBMiwKKyAgICAweEIyQTEsIDB4QjJGRSwgMHgxREFBLCAweDhFQTIsIDB4QjNBMSwgMHhCM0ZFLCAweDFFMDgsIDB4OEVBMiwgMHhCNEExLAorICAgIDB4QjRGRSwgMHgxRTY2LCAweDhFQTIsIDB4QjVBMSwgMHhCNUZFLCAweDFFQzQsIDB4OEVBMiwgMHhCNkExLCAweEI2RkUsCisgICAgMHgxRjIyLCAweDhFQTIsIDB4QjdBMSwgMHhCN0ZFLCAweDFGODAsIDB4OEVBMiwgMHhCOEExLCAweEI4RkUsIDB4MUZERSwKKyAgICAweDhFQTIsIDB4QjlBMSwgMHhCOUZFLCAweDIwM0MsIDB4OEVBMiwgMHhCQUExLCAweEJBRkUsIDB4MjA5QSwgMHg4RUEyLAorICAgIDB4QkJBMSwgMHhCQkZFLCAweDIwRjgsIDB4OEVBMiwgMHhCQ0ExLCAweEJDRkUsIDB4MjE1NiwgMHg4RUEyLCAweEJEQTEsCisgICAgMHhCREZFLCAweDIxQjQsIDB4OEVBMiwgMHhCRUExLCAweEJFRkUsIDB4MjIxMiwgMHg4RUEyLCAweEJGQTEsIDB4QkZGRSwKKyAgICAweDIyNzAsIDB4OEVBMiwgMHhDMEExLCAweEMwRkUsIDB4MjJDRSwgMHg4RUEyLCAweEMxQTEsIDB4QzFGRSwgMHgyMzJDLAorICAgIDB4OEVBMiwgMHhDMkExLCAweEMyRkUsIDB4MjM4QSwgMHg4RUEyLCAweEMzQTEsIDB4QzNGRSwgMHgyM0U4LCAweDhFQTIsCisgICAgMHhDNEExLCAweEM0RkUsIDB4MjQ0NiwgMHg4RUEyLCAweEM1QTEsIDB4QzVGRSwgMHgyNEE0LCAweDhFQTIsIDB4QzZBMSwKKyAgICAweEM2RkUsIDB4MjUwMiwgMHg4RUEyLCAweEM3QTEsIDB4QzdGRSwgMHgyNTYwLCAweDhFQTIsIDB4QzhBMSwgMHhDOEZFLAorICAgIDB4MjVCRSwgMHg4RUEyLCAweEM5QTEsIDB4QzlGRSwgMHgyNjFDLCAweDhFQTIsIDB4Q0FBMSwgMHhDQUZFLCAweDI2N0EsCisgICAgMHg4RUEyLCAweENCQTEsIDB4Q0JGRSwgMHgyNkQ4LCAweDhFQTIsIDB4Q0NBMSwgMHhDQ0ZFLCAweDI3MzYsIDB4OEVBMiwKKyAgICAweENEQTEsIDB4Q0RGRSwgMHgyNzk0LCAweDhFQTIsIDB4Q0VBMSwgMHhDRUZFLCAweDI3RjIsIDB4OEVBMiwgMHhDRkExLAorICAgIDB4Q0ZGRSwgMHgyODUwLCAweDhFQTIsIDB4RDBBMSwgMHhEMEZFLCAweDI4QUUsIDB4OEVBMiwgMHhEMUExLCAweEQxRkUsCisgICAgMHgyOTBDLCAweDhFQTIsIDB4RDJBMSwgMHhEMkZFLCAweDI5NkEsIDB4OEVBMiwgMHhEM0ExLCAweEQzRkUsIDB4MjlDOCwKKyAgICAweDhFQTIsIDB4RDRBMSwgMHhENEZFLCAweDJBMjYsIDB4OEVBMiwgMHhENUExLCAweEQ1RkUsIDB4MkE4NCwgMHg4RUEyLAorICAgIDB4RDZBMSwgMHhENkZFLCAweDJBRTIsIDB4OEVBMiwgMHhEN0ExLCAweEQ3RkUsIDB4MkI0MCwgMHg4RUEyLCAweEQ4QTEsCisgICAgMHhEOEZFLCAweDJCOUUsIDB4OEVBMiwgMHhEOUExLCAweEQ5RkUsIDB4MkJGQywgMHg4RUEyLCAweERBQTEsIDB4REFGRSwKKyAgICAweDJDNUEsIDB4OEVBMiwgMHhEQkExLCAweERCRkUsIDB4MkNCOCwgMHg4RUEyLCAweERDQTEsIDB4RENGRSwgMHgyRDE2LAorICAgIDB4OEVBMiwgMHhEREExLCAweERERkUsIDB4MkQ3NCwgMHg4RUEyLCAweERFQTEsIDB4REVGRSwgMHgyREQyLCAweDhFQTIsCisgICAgMHhERkExLCAweERGRkUsIDB4MkUzMCwgMHg4RUEyLCAweEUwQTEsIDB4RTBGRSwgMHgyRThFLCAweDhFQTIsIDB4RTFBMSwKKyAgICAweEUxRkUsIDB4MkVFQywgMHg4RUEyLCAweEUyQTEsIDB4RTJGRSwgMHgyRjRBLCAweDhFQTIsIDB4RTNBMSwgMHhFM0ZFLAorICAgIDB4MkZBOCwgMHg4RUEyLCAweEU0QTEsIDB4RTRGRSwgMHgzMDA2LCAweDhFQTIsIDB4RTVBMSwgMHhFNUZFLCAweDMwNjQsCisgICAgMHg4RUEyLCAweEU2QTEsIDB4RTZGRSwgMHgzMEMyLCAweDhFQTIsIDB4RTdBMSwgMHhFN0ZFLCAweDMxMjAsIDB4OEVBMiwKKyAgICAweEU4QTEsIDB4RThGRSwgMHgzMTdFLCAweDhFQTIsIDB4RTlBMSwgMHhFOUZFLCAweDMxREMsIDB4OEVBMiwgMHhFQUExLAorICAgIDB4RUFGRSwgMHgzMjNBLCAweDhFQTIsIDB4RUJBMSwgMHhFQkZFLCAweDMyOTgsIDB4OEVBMiwgMHhFQ0ExLCAweEVDRkUsCisgICAgMHgzMkY2LCAweDhFQTIsIDB4RURBMSwgMHhFREZFLCAweDMzNTQsIDB4OEVBMiwgMHhFRUExLCAweEVFRkUsIDB4MzNCMiwKKyAgICAweDhFQTIsIDB4RUZBMSwgMHhFRkZFLCAweDM0MTAsIDB4OEVBMiwgMHhGMEExLCAweEYwRkUsIDB4MzQ2RSwgMHg4RUEyLAorICAgIDB4RjFBMSwgMHhGMUZFLCAweDM0Q0MsIDB4OEVBMiwgMHhGMkExLCAweEYyQzQsIDB4MzUyQSwKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9DTlMtRVVDLVZfMC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9DTlMtRVVDLVZfMC5jcHAKaW5kZXggZWI3NzNhNy4uMzhhZDZhYiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvQ05TLUVVQy1WXzAuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0NOUy1FVUMtVl8wLmNwcApAQCAtMSwxMCArMSwxMiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi1leHRlcm4gY29uc3QgdW5zaWduZWQgc2hvcnQgZ19GWENNQVBfQ05TX0VVQ19WXzBbMTgwICogM10gPSB7CisjaW5jbHVkZSAiY21hcHNfY25zMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0NOU19FVUNfVl8wWzE4MCAqIDNdID0gewogICAgIDB4MDAyMCwgMHgwMDdFLCAweDM1NTAsIDB4QTFBMSwgMHhBMUFCLCAweDAwNjMsIDB4QTFBQywgMHhBMUFDLCAweDM1NEUsCiAgICAgMHhBMUFELCAweEExQkEsIDB4MDA2RiwgMHhBMUJCLCAweEExQkIsIDB4MDA3QywgMHhBMUJDLCAweEExQkMsIDB4MDA3RSwKICAgICAweEExQkQsIDB4QTFCRCwgMHgwMDdFLCAweEExQkUsIDB4QTFCRiwgMHgwMDgyLCAweEExQzAsIDB4QTFDMSwgMHgwMDgyLApAQCAtNjYsMTM2ICs2OCwxMjIgQEAKICAgICAweEY4QTEsIDB4RjhGRSwgMHgxNTZCLCAweEY5QTEsIDB4RjlGRSwgMHgxNUM5LCAweEZBQTEsIDB4RkFGRSwgMHgxNjI3LAogICAgIDB4RkJBMSwgMHhGQkZFLCAweDE2ODUsIDB4RkNBMSwgMHhGQ0ZFLCAweDE2RTMsIDB4RkRBMSwgMHhGRENCLCAweDE3NDEsCiB9OwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0IGdfRlhDTUFQX0NOU19FVUNfVl8wX0RXb3JkWzI2MSAqIDRdID0gewotICAgIDB4OEVBMSwgMHhBMUExLCAweEExQUIsIDB4MDA2MywgMHg4RUExLCAweEExQUMsIDB4QTFBQywgMHgzNTRFLAotICAgIDB4OEVBMSwgMHhBMUFELCAweEExQkEsIDB4MDA2RiwgMHg4RUExLCAweEExQkIsIDB4QTFCQiwgMHgwMDdDLAotICAgIDB4OEVBMSwgMHhBMUJDLCAweEExQkMsIDB4MDA3RSwgMHg4RUExLCAweEExQkQsIDB4QTFCRCwgMHgwMDdFLAotICAgIDB4OEVBMSwgMHhBMUJFLCAweEExQkYsIDB4MDA4MiwgMHg4RUExLCAweEExQzAsIDB4QTFDMSwgMHgwMDgyLAotICAgIDB4OEVBMSwgMHhBMUMyLCAweEExQzMsIDB4MDA4NiwgMHg4RUExLCAweEExQzQsIDB4QTFDNSwgMHgwMDg2LAotICAgIDB4OEVBMSwgMHhBMUM2LCAweEExQzcsIDB4MDA4QSwgMHg4RUExLCAweEExQzgsIDB4QTFDOSwgMHgwMDhBLAotICAgIDB4OEVBMSwgMHhBMUNBLCAweEExQ0IsIDB4MDA4RSwgMHg4RUExLCAweEExQ0MsIDB4QTFDRCwgMHgwMDhFLAotICAgIDB4OEVBMSwgMHhBMUNFLCAweEExQ0YsIDB4MDA5MiwgMHg4RUExLCAweEExRDAsIDB4QTFEMSwgMHgwMDkyLAotICAgIDB4OEVBMSwgMHhBMUQyLCAweEExRDMsIDB4MDA5NiwgMHg4RUExLCAweEExRDQsIDB4QTFENSwgMHgwMDk2LAotICAgIDB4OEVBMSwgMHhBMUQ2LCAweEExRDcsIDB4MDA5QSwgMHg4RUExLCAweEExRDgsIDB4QTFEOSwgMHgwMDlBLAotICAgIDB4OEVBMSwgMHhBMURBLCAweEExREIsIDB4MDA5RSwgMHg4RUExLCAweEExREMsIDB4QTFGRSwgMHgwMDlFLAotICAgIDB4OEVBMSwgMHhBMkExLCAweEEyQzMsIDB4MDBDMSwgMHg4RUExLCAweEEyQzQsIDB4QTJDNCwgMHgzNTRGLAotICAgIDB4OEVBMSwgMHhBMkM1LCAweEEyRkUsIDB4MDBFNSwgMHg4RUExLCAweEEzQTEsIDB4QTNDRSwgMHgwMTFGLAotICAgIDB4OEVBMSwgMHhBNEExLCAweEE0RkUsIDB4MDE0RCwgMHg4RUExLCAweEE1QTEsIDB4QTVFQywgMHgwMUFCLAotICAgIDB4OEVBMSwgMHhBNUVFLCAweEE1RjAsIDB4MDFGNywgMHg4RUExLCAweEE2QTEsIDB4QTZCRSwgMHgwMUZBLAotICAgIDB4OEVBMSwgMHhBN0ExLCAweEE3QTEsIDB4MDI1MywgMHg4RUExLCAweEE3QTIsIDB4QTdBNCwgMHgwMjE4LAotICAgIDB4OEVBMSwgMHhBN0E1LCAweEE3QTUsIDB4MDI1NCwgMHg4RUExLCAweEE3QTYsIDB4QTdBNiwgMHgwMjFCLAotICAgIDB4OEVBMSwgMHhBN0E3LCAweEE3QTcsIDB4MDI1QSwgMHg4RUExLCAweEE3QTgsIDB4QTdBOCwgMHgwMjFDLAotICAgIDB4OEVBMSwgMHhBN0E5LCAweEE3QUMsIDB4MDI1QiwgMHg4RUExLCAweEE3QUQsIDB4QTdBRiwgMHgwMjFELAotICAgIDB4OEVBMSwgMHhBN0IwLCAweEE3QjAsIDB4MDI1RiwgMHg4RUExLCAweEE3QjEsIDB4QTdCMSwgMHgxNzZFLAotICAgIDB4OEVBMSwgMHhBN0IyLCAweEE3QjIsIDB4MDI2MCwgMHg4RUExLCAweEE3QjMsIDB4QTdCMywgMHgwMjYyLAotICAgIDB4OEVBMSwgMHhBN0I0LCAweEE3QjQsIDB4MDIyMCwgMHg4RUExLCAweEE3QjUsIDB4QTdCNSwgMHgwMjYzLAotICAgIDB4OEVBMSwgMHhBN0I2LCAweEE3QjYsIDB4MTc2RiwgMHg4RUExLCAweEE3QjcsIDB4QTdCNywgMHgwMjIxLAotICAgIDB4OEVBMSwgMHhBN0I4LCAweEE3QjksIDB4MDI2NCwgMHg4RUExLCAweEE3QkEsIDB4QTdCQSwgMHgwMjIyLAotICAgIDB4OEVBMSwgMHhBN0JCLCAweEE3QkIsIDB4MTc3MCwgMHg4RUExLCAweEE3QkMsIDB4QTdCQywgMHgwMjIzLAotICAgIDB4OEVBMSwgMHhBN0JELCAweEE3QkQsIDB4MDI2NiwgMHg4RUExLCAweEE3QkUsIDB4QTdCRSwgMHgwMjc5LAotICAgIDB4OEVBMSwgMHhBN0JGLCAweEE3QkYsIDB4MTc3NSwgMHg4RUExLCAweEE3QzAsIDB4QTdDMSwgMHgwMjdBLAotICAgIDB4OEVBMSwgMHhBN0MyLCAweEE3QzIsIDB4MDIyNCwgMHg4RUExLCAweEE3QzMsIDB4QTdDNiwgMHgwMjdDLAotICAgIDB4OEVBMSwgMHhBN0M3LCAweEE3QzcsIDB4MDIyNSwgMHg4RUExLCAweEE3QzgsIDB4QTdDQiwgMHgwMjgyLAotICAgIDB4OEVBMSwgMHhBN0NDLCAweEE3Q0MsIDB4MTc3NiwgMHg4RUExLCAweEE3Q0QsIDB4QTdDRCwgMHgwMjg2LAotICAgIDB4OEVBMSwgMHhBN0NFLCAweEE3Q0UsIDB4MDIyNiwgMHg4RUExLCAweEE3Q0YsIDB4QTdEMCwgMHgwMjg4LAotICAgIDB4OEVBMSwgMHhBN0QxLCAweEE3RDIsIDB4MDI4QywgMHg4RUExLCAweEE3RDMsIDB4QTdENSwgMHgwMjI3LAotICAgIDB4OEVBMSwgMHhBN0Q2LCAweEE3RDgsIDB4MDI4RSwgMHg4RUExLCAweEE3RDksIDB4QTdEQSwgMHgwMjJBLAotICAgIDB4OEVBMSwgMHhBN0RCLCAweEE3REIsIDB4MTc3NywgMHg4RUExLCAweEE3REMsIDB4QTdERiwgMHgwMkQwLAotICAgIDB4OEVBMSwgMHhBN0UwLCAweEE3RTAsIDB4MDJENSwgMHg4RUExLCAweEE3RTEsIDB4QTdFMSwgMHgwMjJDLAotICAgIDB4OEVBMSwgMHhBN0UyLCAweEE3RTUsIDB4MDJENiwgMHg4RUExLCAweEE3RTYsIDB4QTdFNiwgMHgwMjJELAotICAgIDB4OEVBMSwgMHhBN0U3LCAweEE3RUQsIDB4MDJEQSwgMHg4RUExLCAweEE3RUUsIDB4QTdFRSwgMHgxNzhBLAotICAgIDB4OEVBMSwgMHhBN0VGLCAweEE3RjIsIDB4MDJFMSwgMHg4RUExLCAweEE3RjMsIDB4QTdGMywgMHgxNzhDLAotICAgIDB4OEVBMSwgMHhBN0Y0LCAweEE3RjgsIDB4MDJFNSwgMHg4RUExLCAweEE3RjksIDB4QTdGOSwgMHgxNzhELAotICAgIDB4OEVBMSwgMHhBN0ZBLCAweEE3RkQsIDB4MDJFQSwgMHg4RUExLCAweEE3RkUsIDB4QTdGRSwgMHgwMzU2LAotICAgIDB4OEVBMSwgMHhBOEExLCAweEE4QTYsIDB4MDM1NywgMHg4RUExLCAweEE4QTcsIDB4QThBNywgMHgwMzVFLAotICAgIDB4OEVBMSwgMHhBOEE4LCAweEE4QTgsIDB4MDM2MiwgMHg4RUExLCAweEE4QTksIDB4QThBQSwgMHgwMjJFLAotICAgIDB4OEVBMSwgMHhBOEFCLCAweEE4QjIsIDB4MDM2MywgMHg4RUExLCAweEE4QjMsIDB4QThCMywgMHgxN0IyLAotICAgIDB4OEVBMSwgMHhBOEI0LCAweEE4QjYsIDB4MDM2QiwgMHg4RUExLCAweEE4QjcsIDB4QThCQSwgMHgwM0Y2LAotICAgIDB4OEVBMSwgMHhBOEJCLCAweEE4QkIsIDB4MTgxMiwgMHg4RUExLCAweEE4QkMsIDB4QThCRSwgMHgwM0ZBLAotICAgIDB4OEVBMSwgMHhBOEJGLCAweEE4QzMsIDB4MDNGRSwgMHg4RUExLCAweEE4QzQsIDB4QThDQywgMHgwNDA1LAotICAgIDB4OEVBMSwgMHhBOENELCAweEE4Q0QsIDB4MTgxMywgMHg4RUExLCAweEE4Q0UsIDB4QThDRSwgMHgxODE4LAotICAgIDB4OEVBMSwgMHhBOENGLCAweEE4RDIsIDB4MDQwRiwgMHg4RUExLCAweEE4RDMsIDB4QThEMywgMHgxODE5LAotICAgIDB4OEVBMSwgMHhBOEQ0LCAweEE4RDksIDB4MDUwOCwgMHg4RUExLCAweEE4REEsIDB4QThEQSwgMHgxOEU3LAotICAgIDB4OEVBMSwgMHhBOERCLCAweEE4RTIsIDB4MDUwRSwgMHg4RUExLCAweEE4RTMsIDB4QThFMywgMHgwMjMwLAotICAgIDB4OEVBMSwgMHhBOEU0LCAweEE4RTQsIDB4MDUxQiwgMHg4RUExLCAweEE4RTUsIDB4QThFNywgMHgwNTIwLAotICAgIDB4OEVBMSwgMHhBOEU4LCAweEE4RUIsIDB4MDY5NiwgMHg4RUExLCAweEE4RUMsIDB4QThFQywgMHgwMjMxLAotICAgIDB4OEVBMSwgMHhBOEVELCAweEE4RjAsIDB4MDY5RiwgMHg4RUExLCAweEE4RjEsIDB4QThGQiwgMHgwODI2LAotICAgIDB4OEVBMSwgMHhBOEZDLCAweEE4RkUsIDB4MDlGNSwgMHg4RUExLCAweEE5QTEsIDB4QTlBMSwgMHgxRTMzLAotICAgIDB4OEVBMSwgMHhBOUEyLCAweEE5QTIsIDB4MDlGOCwgMHg4RUExLCAweEE5QTMsIDB4QTlBMywgMHgxRTM0LAotICAgIDB4OEVBMSwgMHhBOUE0LCAweEE5QTUsIDB4MDlGOSwgMHg4RUExLCAweEE5QTYsIDB4QTlBQiwgMHgwQkUxLAotICAgIDB4OEVBMSwgMHhBOUFDLCAweEE5QUUsIDB4MERCQiwgMHg4RUExLCAweEE5QUYsIDB4QTlBRiwgMHgyMzYwLAotICAgIDB4OEVBMSwgMHhBOUIwLCAweEE5QjAsIDB4MjYxMiwgMHg4RUExLCAweEE5QjEsIDB4QTlCMywgMHgwRjdCLAotICAgIDB4OEVBMSwgMHhBOUI0LCAweEE5QjUsIDB4MTEwMCwgMHg4RUExLCAweEE5QjYsIDB4QTlCNiwgMHgxMjg5LAotICAgIDB4OEVBMSwgMHhBOUI3LCAweEE5QjgsIDB4MTNCMiwgMHg4RUExLCAweEE5QjksIDB4QTlCOSwgMHgyRjBELAotICAgIDB4OEVBMSwgMHhDMkExLCAweEMyQzEsIDB4MDIzMiwgMHg4RUExLCAweEM0QTEsIDB4QzRGRSwgMHgwMjUzLAotICAgIDB4OEVBMSwgMHhDNUExLCAweEM1RkUsIDB4MDJCMSwgMHg4RUExLCAweEM2QTEsIDB4QzZGRSwgMHgwMzBGLAotICAgIDB4OEVBMSwgMHhDN0ExLCAweEM3RkUsIDB4MDM2RCwgMHg4RUExLCAweEM4QTEsIDB4QzhGRSwgMHgwM0NCLAotICAgIDB4OEVBMSwgMHhDOUExLCAweEM5RkUsIDB4MDQyOSwgMHg4RUExLCAweENBQTEsIDB4Q0FGRSwgMHgwNDg3LAotICAgIDB4OEVBMSwgMHhDQkExLCAweENCRkUsIDB4MDRFNSwgMHg4RUExLCAweENDQTEsIDB4Q0NGRSwgMHgwNTQzLAotICAgIDB4OEVBMSwgMHhDREExLCAweENERkUsIDB4MDVBMSwgMHg4RUExLCAweENFQTEsIDB4Q0VGRSwgMHgwNUZGLAotICAgIDB4OEVBMSwgMHhDRkExLCAweENGRkUsIDB4MDY1RCwgMHg4RUExLCAweEQwQTEsIDB4RDBGRSwgMHgwNkJCLAotICAgIDB4OEVBMSwgMHhEMUExLCAweEQxRkUsIDB4MDcxOSwgMHg4RUExLCAweEQyQTEsIDB4RDJGRSwgMHgwNzc3LAotICAgIDB4OEVBMSwgMHhEM0ExLCAweEQzRkUsIDB4MDdENSwgMHg4RUExLCAweEQ0QTEsIDB4RDRGRSwgMHgwODMzLAotICAgIDB4OEVBMSwgMHhENUExLCAweEQ1RkUsIDB4MDg5MSwgMHg4RUExLCAweEQ2QTEsIDB4RDZGRSwgMHgwOEVGLAotICAgIDB4OEVBMSwgMHhEN0ExLCAweEQ3RkUsIDB4MDk0RCwgMHg4RUExLCAweEQ4QTEsIDB4RDhGRSwgMHgwOUFCLAotICAgIDB4OEVBMSwgMHhEOUExLCAweEQ5RkUsIDB4MEEwOSwgMHg4RUExLCAweERBQTEsIDB4REFGRSwgMHgwQTY3LAotICAgIDB4OEVBMSwgMHhEQkExLCAweERCRkUsIDB4MEFDNSwgMHg4RUExLCAweERDQTEsIDB4RENGRSwgMHgwQjIzLAotICAgIDB4OEVBMSwgMHhEREExLCAweERERkUsIDB4MEI4MSwgMHg4RUExLCAweERFQTEsIDB4REVGRSwgMHgwQkRGLAotICAgIDB4OEVBMSwgMHhERkExLCAweERGRkUsIDB4MEMzRCwgMHg4RUExLCAweEUwQTEsIDB4RTBGRSwgMHgwQzlCLAotICAgIDB4OEVBMSwgMHhFMUExLCAweEUxRkUsIDB4MENGOSwgMHg4RUExLCAweEUyQTEsIDB4RTJGRSwgMHgwRDU3LAotICAgIDB4OEVBMSwgMHhFM0ExLCAweEUzRkUsIDB4MERCNSwgMHg4RUExLCAweEU0QTEsIDB4RTRGRSwgMHgwRTEzLAotICAgIDB4OEVBMSwgMHhFNUExLCAweEU1RkUsIDB4MEU3MSwgMHg4RUExLCAweEU2QTEsIDB4RTZGRSwgMHgwRUNGLAotICAgIDB4OEVBMSwgMHhFN0ExLCAweEU3RkUsIDB4MEYyRCwgMHg4RUExLCAweEU4QTEsIDB4RThGRSwgMHgwRjhCLAotICAgIDB4OEVBMSwgMHhFOUExLCAweEU5RkUsIDB4MEZFOSwgMHg4RUExLCAweEVBQTEsIDB4RUFGRSwgMHgxMDQ3LAotICAgIDB4OEVBMSwgMHhFQkExLCAweEVCRkUsIDB4MTBBNSwgMHg4RUExLCAweEVDQTEsIDB4RUNGRSwgMHgxMTAzLAotICAgIDB4OEVBMSwgMHhFREExLCAweEVERkUsIDB4MTE2MSwgMHg4RUExLCAweEVFQTEsIDB4RUVGRSwgMHgxMUJGLAotICAgIDB4OEVBMSwgMHhFRkExLCAweEVGRkUsIDB4MTIxRCwgMHg4RUExLCAweEYwQTEsIDB4RjBGRSwgMHgxMjdCLAotICAgIDB4OEVBMSwgMHhGMUExLCAweEYxRkUsIDB4MTJEOSwgMHg4RUExLCAweEYyQTEsIDB4RjJGRSwgMHgxMzM3LAotICAgIDB4OEVBMSwgMHhGM0ExLCAweEYzRkUsIDB4MTM5NSwgMHg4RUExLCAweEY0QTEsIDB4RjRGRSwgMHgxM0YzLAotICAgIDB4OEVBMSwgMHhGNUExLCAweEY1RkUsIDB4MTQ1MSwgMHg4RUExLCAweEY2QTEsIDB4RjZGRSwgMHgxNEFGLAotICAgIDB4OEVBMSwgMHhGN0ExLCAweEY3RkUsIDB4MTUwRCwgMHg4RUExLCAweEY4QTEsIDB4RjhGRSwgMHgxNTZCLAotICAgIDB4OEVBMSwgMHhGOUExLCAweEY5RkUsIDB4MTVDOSwgMHg4RUExLCAweEZBQTEsIDB4RkFGRSwgMHgxNjI3LAotICAgIDB4OEVBMSwgMHhGQkExLCAweEZCRkUsIDB4MTY4NSwgMHg4RUExLCAweEZDQTEsIDB4RkNGRSwgMHgxNkUzLAotICAgIDB4OEVBMSwgMHhGREExLCAweEZEQ0IsIDB4MTc0MSwgMHg4RUEyLCAweEExQTEsIDB4QTFGRSwgMHgxNzZDLAotICAgIDB4OEVBMiwgMHhBMkExLCAweEEyRkUsIDB4MTdDQSwgMHg4RUEyLCAweEEzQTEsIDB4QTNGRSwgMHgxODI4LAotICAgIDB4OEVBMiwgMHhBNEExLCAweEE0RkUsIDB4MTg4NiwgMHg4RUEyLCAweEE1QTEsIDB4QTVGRSwgMHgxOEU0LAotICAgIDB4OEVBMiwgMHhBNkExLCAweEE2RkUsIDB4MTk0MiwgMHg4RUEyLCAweEE3QTEsIDB4QTdGRSwgMHgxOUEwLAotICAgIDB4OEVBMiwgMHhBOEExLCAweEE4RkUsIDB4MTlGRSwgMHg4RUEyLCAweEE5QTEsIDB4QTlGRSwgMHgxQTVDLAotICAgIDB4OEVBMiwgMHhBQUExLCAweEFBRkUsIDB4MUFCQSwgMHg4RUEyLCAweEFCQTEsIDB4QUJGRSwgMHgxQjE4LAotICAgIDB4OEVBMiwgMHhBQ0ExLCAweEFDRkUsIDB4MUI3NiwgMHg4RUEyLCAweEFEQTEsIDB4QURGRSwgMHgxQkQ0LAotICAgIDB4OEVBMiwgMHhBRUExLCAweEFFRkUsIDB4MUMzMiwgMHg4RUEyLCAweEFGQTEsIDB4QUZGRSwgMHgxQzkwLAotICAgIDB4OEVBMiwgMHhCMEExLCAweEIwRkUsIDB4MUNFRSwgMHg4RUEyLCAweEIxQTEsIDB4QjFGRSwgMHgxRDRDLAotICAgIDB4OEVBMiwgMHhCMkExLCAweEIyRkUsIDB4MURBQSwgMHg4RUEyLCAweEIzQTEsIDB4QjNGRSwgMHgxRTA4LAotICAgIDB4OEVBMiwgMHhCNEExLCAweEI0RkUsIDB4MUU2NiwgMHg4RUEyLCAweEI1QTEsIDB4QjVGRSwgMHgxRUM0LAotICAgIDB4OEVBMiwgMHhCNkExLCAweEI2RkUsIDB4MUYyMiwgMHg4RUEyLCAweEI3QTEsIDB4QjdGRSwgMHgxRjgwLAotICAgIDB4OEVBMiwgMHhCOEExLCAweEI4RkUsIDB4MUZERSwgMHg4RUEyLCAweEI5QTEsIDB4QjlGRSwgMHgyMDNDLAotICAgIDB4OEVBMiwgMHhCQUExLCAweEJBRkUsIDB4MjA5QSwgMHg4RUEyLCAweEJCQTEsIDB4QkJGRSwgMHgyMEY4LAotICAgIDB4OEVBMiwgMHhCQ0ExLCAweEJDRkUsIDB4MjE1NiwgMHg4RUEyLCAweEJEQTEsIDB4QkRGRSwgMHgyMUI0LAotICAgIDB4OEVBMiwgMHhCRUExLCAweEJFRkUsIDB4MjIxMiwgMHg4RUEyLCAweEJGQTEsIDB4QkZGRSwgMHgyMjcwLAotICAgIDB4OEVBMiwgMHhDMEExLCAweEMwRkUsIDB4MjJDRSwgMHg4RUEyLCAweEMxQTEsIDB4QzFGRSwgMHgyMzJDLAotICAgIDB4OEVBMiwgMHhDMkExLCAweEMyRkUsIDB4MjM4QSwgMHg4RUEyLCAweEMzQTEsIDB4QzNGRSwgMHgyM0U4LAotICAgIDB4OEVBMiwgMHhDNEExLCAweEM0RkUsIDB4MjQ0NiwgMHg4RUEyLCAweEM1QTEsIDB4QzVGRSwgMHgyNEE0LAotICAgIDB4OEVBMiwgMHhDNkExLCAweEM2RkUsIDB4MjUwMiwgMHg4RUEyLCAweEM3QTEsIDB4QzdGRSwgMHgyNTYwLAotICAgIDB4OEVBMiwgMHhDOEExLCAweEM4RkUsIDB4MjVCRSwgMHg4RUEyLCAweEM5QTEsIDB4QzlGRSwgMHgyNjFDLAotICAgIDB4OEVBMiwgMHhDQUExLCAweENBRkUsIDB4MjY3QSwgMHg4RUEyLCAweENCQTEsIDB4Q0JGRSwgMHgyNkQ4LAotICAgIDB4OEVBMiwgMHhDQ0ExLCAweENDRkUsIDB4MjczNiwgMHg4RUEyLCAweENEQTEsIDB4Q0RGRSwgMHgyNzk0LAotICAgIDB4OEVBMiwgMHhDRUExLCAweENFRkUsIDB4MjdGMiwgMHg4RUEyLCAweENGQTEsIDB4Q0ZGRSwgMHgyODUwLAotICAgIDB4OEVBMiwgMHhEMEExLCAweEQwRkUsIDB4MjhBRSwgMHg4RUEyLCAweEQxQTEsIDB4RDFGRSwgMHgyOTBDLAotICAgIDB4OEVBMiwgMHhEMkExLCAweEQyRkUsIDB4Mjk2QSwgMHg4RUEyLCAweEQzQTEsIDB4RDNGRSwgMHgyOUM4LAotICAgIDB4OEVBMiwgMHhENEExLCAweEQ0RkUsIDB4MkEyNiwgMHg4RUEyLCAweEQ1QTEsIDB4RDVGRSwgMHgyQTg0LAotICAgIDB4OEVBMiwgMHhENkExLCAweEQ2RkUsIDB4MkFFMiwgMHg4RUEyLCAweEQ3QTEsIDB4RDdGRSwgMHgyQjQwLAotICAgIDB4OEVBMiwgMHhEOEExLCAweEQ4RkUsIDB4MkI5RSwgMHg4RUEyLCAweEQ5QTEsIDB4RDlGRSwgMHgyQkZDLAotICAgIDB4OEVBMiwgMHhEQUExLCAweERBRkUsIDB4MkM1QSwgMHg4RUEyLCAweERCQTEsIDB4REJGRSwgMHgyQ0I4LAotICAgIDB4OEVBMiwgMHhEQ0ExLCAweERDRkUsIDB4MkQxNiwgMHg4RUEyLCAweEREQTEsIDB4RERGRSwgMHgyRDc0LAotICAgIDB4OEVBMiwgMHhERUExLCAweERFRkUsIDB4MkREMiwgMHg4RUEyLCAweERGQTEsIDB4REZGRSwgMHgyRTMwLAotICAgIDB4OEVBMiwgMHhFMEExLCAweEUwRkUsIDB4MkU4RSwgMHg4RUEyLCAweEUxQTEsIDB4RTFGRSwgMHgyRUVDLAotICAgIDB4OEVBMiwgMHhFMkExLCAweEUyRkUsIDB4MkY0QSwgMHg4RUEyLCAweEUzQTEsIDB4RTNGRSwgMHgyRkE4LAotICAgIDB4OEVBMiwgMHhFNEExLCAweEU0RkUsIDB4MzAwNiwgMHg4RUEyLCAweEU1QTEsIDB4RTVGRSwgMHgzMDY0LAotICAgIDB4OEVBMiwgMHhFNkExLCAweEU2RkUsIDB4MzBDMiwgMHg4RUEyLCAweEU3QTEsIDB4RTdGRSwgMHgzMTIwLAotICAgIDB4OEVBMiwgMHhFOEExLCAweEU4RkUsIDB4MzE3RSwgMHg4RUEyLCAweEU5QTEsIDB4RTlGRSwgMHgzMURDLAotICAgIDB4OEVBMiwgMHhFQUExLCAweEVBRkUsIDB4MzIzQSwgMHg4RUEyLCAweEVCQTEsIDB4RUJGRSwgMHgzMjk4LAotICAgIDB4OEVBMiwgMHhFQ0ExLCAweEVDRkUsIDB4MzJGNiwgMHg4RUEyLCAweEVEQTEsIDB4RURGRSwgMHgzMzU0LAotICAgIDB4OEVBMiwgMHhFRUExLCAweEVFRkUsIDB4MzNCMiwgMHg4RUEyLCAweEVGQTEsIDB4RUZGRSwgMHgzNDEwLAotICAgIDB4OEVBMiwgMHhGMEExLCAweEYwRkUsIDB4MzQ2RSwgMHg4RUEyLCAweEYxQTEsIDB4RjFGRSwgMHgzNENDLAotICAgIDB4OEVBMiwgMHhGMkExLCAweEYyQzQsIDB4MzUyQSwKKworY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9DTlNfRVVDX1ZfMF9EV29yZFsyNjEgKiA0XSA9IHsKKyAgICAweDhFQTEsIDB4QTFBMSwgMHhBMUFCLCAweDAwNjMsIDB4OEVBMSwgMHhBMUFDLCAweEExQUMsIDB4MzU0RSwgMHg4RUExLAorICAgIDB4QTFBRCwgMHhBMUJBLCAweDAwNkYsIDB4OEVBMSwgMHhBMUJCLCAweEExQkIsIDB4MDA3QywgMHg4RUExLCAweEExQkMsCisgICAgMHhBMUJDLCAweDAwN0UsIDB4OEVBMSwgMHhBMUJELCAweEExQkQsIDB4MDA3RSwgMHg4RUExLCAweEExQkUsIDB4QTFCRiwKKyAgICAweDAwODIsIDB4OEVBMSwgMHhBMUMwLCAweEExQzEsIDB4MDA4MiwgMHg4RUExLCAweEExQzIsIDB4QTFDMywgMHgwMDg2LAorICAgIDB4OEVBMSwgMHhBMUM0LCAweEExQzUsIDB4MDA4NiwgMHg4RUExLCAweEExQzYsIDB4QTFDNywgMHgwMDhBLCAweDhFQTEsCisgICAgMHhBMUM4LCAweEExQzksIDB4MDA4QSwgMHg4RUExLCAweEExQ0EsIDB4QTFDQiwgMHgwMDhFLCAweDhFQTEsIDB4QTFDQywKKyAgICAweEExQ0QsIDB4MDA4RSwgMHg4RUExLCAweEExQ0UsIDB4QTFDRiwgMHgwMDkyLCAweDhFQTEsIDB4QTFEMCwgMHhBMUQxLAorICAgIDB4MDA5MiwgMHg4RUExLCAweEExRDIsIDB4QTFEMywgMHgwMDk2LCAweDhFQTEsIDB4QTFENCwgMHhBMUQ1LCAweDAwOTYsCisgICAgMHg4RUExLCAweEExRDYsIDB4QTFENywgMHgwMDlBLCAweDhFQTEsIDB4QTFEOCwgMHhBMUQ5LCAweDAwOUEsIDB4OEVBMSwKKyAgICAweEExREEsIDB4QTFEQiwgMHgwMDlFLCAweDhFQTEsIDB4QTFEQywgMHhBMUZFLCAweDAwOUUsIDB4OEVBMSwgMHhBMkExLAorICAgIDB4QTJDMywgMHgwMEMxLCAweDhFQTEsIDB4QTJDNCwgMHhBMkM0LCAweDM1NEYsIDB4OEVBMSwgMHhBMkM1LCAweEEyRkUsCisgICAgMHgwMEU1LCAweDhFQTEsIDB4QTNBMSwgMHhBM0NFLCAweDAxMUYsIDB4OEVBMSwgMHhBNEExLCAweEE0RkUsIDB4MDE0RCwKKyAgICAweDhFQTEsIDB4QTVBMSwgMHhBNUVDLCAweDAxQUIsIDB4OEVBMSwgMHhBNUVFLCAweEE1RjAsIDB4MDFGNywgMHg4RUExLAorICAgIDB4QTZBMSwgMHhBNkJFLCAweDAxRkEsIDB4OEVBMSwgMHhBN0ExLCAweEE3QTEsIDB4MDI1MywgMHg4RUExLCAweEE3QTIsCisgICAgMHhBN0E0LCAweDAyMTgsIDB4OEVBMSwgMHhBN0E1LCAweEE3QTUsIDB4MDI1NCwgMHg4RUExLCAweEE3QTYsIDB4QTdBNiwKKyAgICAweDAyMUIsIDB4OEVBMSwgMHhBN0E3LCAweEE3QTcsIDB4MDI1QSwgMHg4RUExLCAweEE3QTgsIDB4QTdBOCwgMHgwMjFDLAorICAgIDB4OEVBMSwgMHhBN0E5LCAweEE3QUMsIDB4MDI1QiwgMHg4RUExLCAweEE3QUQsIDB4QTdBRiwgMHgwMjFELCAweDhFQTEsCisgICAgMHhBN0IwLCAweEE3QjAsIDB4MDI1RiwgMHg4RUExLCAweEE3QjEsIDB4QTdCMSwgMHgxNzZFLCAweDhFQTEsIDB4QTdCMiwKKyAgICAweEE3QjIsIDB4MDI2MCwgMHg4RUExLCAweEE3QjMsIDB4QTdCMywgMHgwMjYyLCAweDhFQTEsIDB4QTdCNCwgMHhBN0I0LAorICAgIDB4MDIyMCwgMHg4RUExLCAweEE3QjUsIDB4QTdCNSwgMHgwMjYzLCAweDhFQTEsIDB4QTdCNiwgMHhBN0I2LCAweDE3NkYsCisgICAgMHg4RUExLCAweEE3QjcsIDB4QTdCNywgMHgwMjIxLCAweDhFQTEsIDB4QTdCOCwgMHhBN0I5LCAweDAyNjQsIDB4OEVBMSwKKyAgICAweEE3QkEsIDB4QTdCQSwgMHgwMjIyLCAweDhFQTEsIDB4QTdCQiwgMHhBN0JCLCAweDE3NzAsIDB4OEVBMSwgMHhBN0JDLAorICAgIDB4QTdCQywgMHgwMjIzLCAweDhFQTEsIDB4QTdCRCwgMHhBN0JELCAweDAyNjYsIDB4OEVBMSwgMHhBN0JFLCAweEE3QkUsCisgICAgMHgwMjc5LCAweDhFQTEsIDB4QTdCRiwgMHhBN0JGLCAweDE3NzUsIDB4OEVBMSwgMHhBN0MwLCAweEE3QzEsIDB4MDI3QSwKKyAgICAweDhFQTEsIDB4QTdDMiwgMHhBN0MyLCAweDAyMjQsIDB4OEVBMSwgMHhBN0MzLCAweEE3QzYsIDB4MDI3QywgMHg4RUExLAorICAgIDB4QTdDNywgMHhBN0M3LCAweDAyMjUsIDB4OEVBMSwgMHhBN0M4LCAweEE3Q0IsIDB4MDI4MiwgMHg4RUExLCAweEE3Q0MsCisgICAgMHhBN0NDLCAweDE3NzYsIDB4OEVBMSwgMHhBN0NELCAweEE3Q0QsIDB4MDI4NiwgMHg4RUExLCAweEE3Q0UsIDB4QTdDRSwKKyAgICAweDAyMjYsIDB4OEVBMSwgMHhBN0NGLCAweEE3RDAsIDB4MDI4OCwgMHg4RUExLCAweEE3RDEsIDB4QTdEMiwgMHgwMjhDLAorICAgIDB4OEVBMSwgMHhBN0QzLCAweEE3RDUsIDB4MDIyNywgMHg4RUExLCAweEE3RDYsIDB4QTdEOCwgMHgwMjhFLCAweDhFQTEsCisgICAgMHhBN0Q5LCAweEE3REEsIDB4MDIyQSwgMHg4RUExLCAweEE3REIsIDB4QTdEQiwgMHgxNzc3LCAweDhFQTEsIDB4QTdEQywKKyAgICAweEE3REYsIDB4MDJEMCwgMHg4RUExLCAweEE3RTAsIDB4QTdFMCwgMHgwMkQ1LCAweDhFQTEsIDB4QTdFMSwgMHhBN0UxLAorICAgIDB4MDIyQywgMHg4RUExLCAweEE3RTIsIDB4QTdFNSwgMHgwMkQ2LCAweDhFQTEsIDB4QTdFNiwgMHhBN0U2LCAweDAyMkQsCisgICAgMHg4RUExLCAweEE3RTcsIDB4QTdFRCwgMHgwMkRBLCAweDhFQTEsIDB4QTdFRSwgMHhBN0VFLCAweDE3OEEsIDB4OEVBMSwKKyAgICAweEE3RUYsIDB4QTdGMiwgMHgwMkUxLCAweDhFQTEsIDB4QTdGMywgMHhBN0YzLCAweDE3OEMsIDB4OEVBMSwgMHhBN0Y0LAorICAgIDB4QTdGOCwgMHgwMkU1LCAweDhFQTEsIDB4QTdGOSwgMHhBN0Y5LCAweDE3OEQsIDB4OEVBMSwgMHhBN0ZBLCAweEE3RkQsCisgICAgMHgwMkVBLCAweDhFQTEsIDB4QTdGRSwgMHhBN0ZFLCAweDAzNTYsIDB4OEVBMSwgMHhBOEExLCAweEE4QTYsIDB4MDM1NywKKyAgICAweDhFQTEsIDB4QThBNywgMHhBOEE3LCAweDAzNUUsIDB4OEVBMSwgMHhBOEE4LCAweEE4QTgsIDB4MDM2MiwgMHg4RUExLAorICAgIDB4QThBOSwgMHhBOEFBLCAweDAyMkUsIDB4OEVBMSwgMHhBOEFCLCAweEE4QjIsIDB4MDM2MywgMHg4RUExLCAweEE4QjMsCisgICAgMHhBOEIzLCAweDE3QjIsIDB4OEVBMSwgMHhBOEI0LCAweEE4QjYsIDB4MDM2QiwgMHg4RUExLCAweEE4QjcsIDB4QThCQSwKKyAgICAweDAzRjYsIDB4OEVBMSwgMHhBOEJCLCAweEE4QkIsIDB4MTgxMiwgMHg4RUExLCAweEE4QkMsIDB4QThCRSwgMHgwM0ZBLAorICAgIDB4OEVBMSwgMHhBOEJGLCAweEE4QzMsIDB4MDNGRSwgMHg4RUExLCAweEE4QzQsIDB4QThDQywgMHgwNDA1LCAweDhFQTEsCisgICAgMHhBOENELCAweEE4Q0QsIDB4MTgxMywgMHg4RUExLCAweEE4Q0UsIDB4QThDRSwgMHgxODE4LCAweDhFQTEsIDB4QThDRiwKKyAgICAweEE4RDIsIDB4MDQwRiwgMHg4RUExLCAweEE4RDMsIDB4QThEMywgMHgxODE5LCAweDhFQTEsIDB4QThENCwgMHhBOEQ5LAorICAgIDB4MDUwOCwgMHg4RUExLCAweEE4REEsIDB4QThEQSwgMHgxOEU3LCAweDhFQTEsIDB4QThEQiwgMHhBOEUyLCAweDA1MEUsCisgICAgMHg4RUExLCAweEE4RTMsIDB4QThFMywgMHgwMjMwLCAweDhFQTEsIDB4QThFNCwgMHhBOEU0LCAweDA1MUIsIDB4OEVBMSwKKyAgICAweEE4RTUsIDB4QThFNywgMHgwNTIwLCAweDhFQTEsIDB4QThFOCwgMHhBOEVCLCAweDA2OTYsIDB4OEVBMSwgMHhBOEVDLAorICAgIDB4QThFQywgMHgwMjMxLCAweDhFQTEsIDB4QThFRCwgMHhBOEYwLCAweDA2OUYsIDB4OEVBMSwgMHhBOEYxLCAweEE4RkIsCisgICAgMHgwODI2LCAweDhFQTEsIDB4QThGQywgMHhBOEZFLCAweDA5RjUsIDB4OEVBMSwgMHhBOUExLCAweEE5QTEsIDB4MUUzMywKKyAgICAweDhFQTEsIDB4QTlBMiwgMHhBOUEyLCAweDA5RjgsIDB4OEVBMSwgMHhBOUEzLCAweEE5QTMsIDB4MUUzNCwgMHg4RUExLAorICAgIDB4QTlBNCwgMHhBOUE1LCAweDA5RjksIDB4OEVBMSwgMHhBOUE2LCAweEE5QUIsIDB4MEJFMSwgMHg4RUExLCAweEE5QUMsCisgICAgMHhBOUFFLCAweDBEQkIsIDB4OEVBMSwgMHhBOUFGLCAweEE5QUYsIDB4MjM2MCwgMHg4RUExLCAweEE5QjAsIDB4QTlCMCwKKyAgICAweDI2MTIsIDB4OEVBMSwgMHhBOUIxLCAweEE5QjMsIDB4MEY3QiwgMHg4RUExLCAweEE5QjQsIDB4QTlCNSwgMHgxMTAwLAorICAgIDB4OEVBMSwgMHhBOUI2LCAweEE5QjYsIDB4MTI4OSwgMHg4RUExLCAweEE5QjcsIDB4QTlCOCwgMHgxM0IyLCAweDhFQTEsCisgICAgMHhBOUI5LCAweEE5QjksIDB4MkYwRCwgMHg4RUExLCAweEMyQTEsIDB4QzJDMSwgMHgwMjMyLCAweDhFQTEsIDB4QzRBMSwKKyAgICAweEM0RkUsIDB4MDI1MywgMHg4RUExLCAweEM1QTEsIDB4QzVGRSwgMHgwMkIxLCAweDhFQTEsIDB4QzZBMSwgMHhDNkZFLAorICAgIDB4MDMwRiwgMHg4RUExLCAweEM3QTEsIDB4QzdGRSwgMHgwMzZELCAweDhFQTEsIDB4QzhBMSwgMHhDOEZFLCAweDAzQ0IsCisgICAgMHg4RUExLCAweEM5QTEsIDB4QzlGRSwgMHgwNDI5LCAweDhFQTEsIDB4Q0FBMSwgMHhDQUZFLCAweDA0ODcsIDB4OEVBMSwKKyAgICAweENCQTEsIDB4Q0JGRSwgMHgwNEU1LCAweDhFQTEsIDB4Q0NBMSwgMHhDQ0ZFLCAweDA1NDMsIDB4OEVBMSwgMHhDREExLAorICAgIDB4Q0RGRSwgMHgwNUExLCAweDhFQTEsIDB4Q0VBMSwgMHhDRUZFLCAweDA1RkYsIDB4OEVBMSwgMHhDRkExLCAweENGRkUsCisgICAgMHgwNjVELCAweDhFQTEsIDB4RDBBMSwgMHhEMEZFLCAweDA2QkIsIDB4OEVBMSwgMHhEMUExLCAweEQxRkUsIDB4MDcxOSwKKyAgICAweDhFQTEsIDB4RDJBMSwgMHhEMkZFLCAweDA3NzcsIDB4OEVBMSwgMHhEM0ExLCAweEQzRkUsIDB4MDdENSwgMHg4RUExLAorICAgIDB4RDRBMSwgMHhENEZFLCAweDA4MzMsIDB4OEVBMSwgMHhENUExLCAweEQ1RkUsIDB4MDg5MSwgMHg4RUExLCAweEQ2QTEsCisgICAgMHhENkZFLCAweDA4RUYsIDB4OEVBMSwgMHhEN0ExLCAweEQ3RkUsIDB4MDk0RCwgMHg4RUExLCAweEQ4QTEsIDB4RDhGRSwKKyAgICAweDA5QUIsIDB4OEVBMSwgMHhEOUExLCAweEQ5RkUsIDB4MEEwOSwgMHg4RUExLCAweERBQTEsIDB4REFGRSwgMHgwQTY3LAorICAgIDB4OEVBMSwgMHhEQkExLCAweERCRkUsIDB4MEFDNSwgMHg4RUExLCAweERDQTEsIDB4RENGRSwgMHgwQjIzLCAweDhFQTEsCisgICAgMHhEREExLCAweERERkUsIDB4MEI4MSwgMHg4RUExLCAweERFQTEsIDB4REVGRSwgMHgwQkRGLCAweDhFQTEsIDB4REZBMSwKKyAgICAweERGRkUsIDB4MEMzRCwgMHg4RUExLCAweEUwQTEsIDB4RTBGRSwgMHgwQzlCLCAweDhFQTEsIDB4RTFBMSwgMHhFMUZFLAorICAgIDB4MENGOSwgMHg4RUExLCAweEUyQTEsIDB4RTJGRSwgMHgwRDU3LCAweDhFQTEsIDB4RTNBMSwgMHhFM0ZFLCAweDBEQjUsCisgICAgMHg4RUExLCAweEU0QTEsIDB4RTRGRSwgMHgwRTEzLCAweDhFQTEsIDB4RTVBMSwgMHhFNUZFLCAweDBFNzEsIDB4OEVBMSwKKyAgICAweEU2QTEsIDB4RTZGRSwgMHgwRUNGLCAweDhFQTEsIDB4RTdBMSwgMHhFN0ZFLCAweDBGMkQsIDB4OEVBMSwgMHhFOEExLAorICAgIDB4RThGRSwgMHgwRjhCLCAweDhFQTEsIDB4RTlBMSwgMHhFOUZFLCAweDBGRTksIDB4OEVBMSwgMHhFQUExLCAweEVBRkUsCisgICAgMHgxMDQ3LCAweDhFQTEsIDB4RUJBMSwgMHhFQkZFLCAweDEwQTUsIDB4OEVBMSwgMHhFQ0ExLCAweEVDRkUsIDB4MTEwMywKKyAgICAweDhFQTEsIDB4RURBMSwgMHhFREZFLCAweDExNjEsIDB4OEVBMSwgMHhFRUExLCAweEVFRkUsIDB4MTFCRiwgMHg4RUExLAorICAgIDB4RUZBMSwgMHhFRkZFLCAweDEyMUQsIDB4OEVBMSwgMHhGMEExLCAweEYwRkUsIDB4MTI3QiwgMHg4RUExLCAweEYxQTEsCisgICAgMHhGMUZFLCAweDEyRDksIDB4OEVBMSwgMHhGMkExLCAweEYyRkUsIDB4MTMzNywgMHg4RUExLCAweEYzQTEsIDB4RjNGRSwKKyAgICAweDEzOTUsIDB4OEVBMSwgMHhGNEExLCAweEY0RkUsIDB4MTNGMywgMHg4RUExLCAweEY1QTEsIDB4RjVGRSwgMHgxNDUxLAorICAgIDB4OEVBMSwgMHhGNkExLCAweEY2RkUsIDB4MTRBRiwgMHg4RUExLCAweEY3QTEsIDB4RjdGRSwgMHgxNTBELCAweDhFQTEsCisgICAgMHhGOEExLCAweEY4RkUsIDB4MTU2QiwgMHg4RUExLCAweEY5QTEsIDB4RjlGRSwgMHgxNUM5LCAweDhFQTEsIDB4RkFBMSwKKyAgICAweEZBRkUsIDB4MTYyNywgMHg4RUExLCAweEZCQTEsIDB4RkJGRSwgMHgxNjg1LCAweDhFQTEsIDB4RkNBMSwgMHhGQ0ZFLAorICAgIDB4MTZFMywgMHg4RUExLCAweEZEQTEsIDB4RkRDQiwgMHgxNzQxLCAweDhFQTIsIDB4QTFBMSwgMHhBMUZFLCAweDE3NkMsCisgICAgMHg4RUEyLCAweEEyQTEsIDB4QTJGRSwgMHgxN0NBLCAweDhFQTIsIDB4QTNBMSwgMHhBM0ZFLCAweDE4MjgsIDB4OEVBMiwKKyAgICAweEE0QTEsIDB4QTRGRSwgMHgxODg2LCAweDhFQTIsIDB4QTVBMSwgMHhBNUZFLCAweDE4RTQsIDB4OEVBMiwgMHhBNkExLAorICAgIDB4QTZGRSwgMHgxOTQyLCAweDhFQTIsIDB4QTdBMSwgMHhBN0ZFLCAweDE5QTAsIDB4OEVBMiwgMHhBOEExLCAweEE4RkUsCisgICAgMHgxOUZFLCAweDhFQTIsIDB4QTlBMSwgMHhBOUZFLCAweDFBNUMsIDB4OEVBMiwgMHhBQUExLCAweEFBRkUsIDB4MUFCQSwKKyAgICAweDhFQTIsIDB4QUJBMSwgMHhBQkZFLCAweDFCMTgsIDB4OEVBMiwgMHhBQ0ExLCAweEFDRkUsIDB4MUI3NiwgMHg4RUEyLAorICAgIDB4QURBMSwgMHhBREZFLCAweDFCRDQsIDB4OEVBMiwgMHhBRUExLCAweEFFRkUsIDB4MUMzMiwgMHg4RUEyLCAweEFGQTEsCisgICAgMHhBRkZFLCAweDFDOTAsIDB4OEVBMiwgMHhCMEExLCAweEIwRkUsIDB4MUNFRSwgMHg4RUEyLCAweEIxQTEsIDB4QjFGRSwKKyAgICAweDFENEMsIDB4OEVBMiwgMHhCMkExLCAweEIyRkUsIDB4MURBQSwgMHg4RUEyLCAweEIzQTEsIDB4QjNGRSwgMHgxRTA4LAorICAgIDB4OEVBMiwgMHhCNEExLCAweEI0RkUsIDB4MUU2NiwgMHg4RUEyLCAweEI1QTEsIDB4QjVGRSwgMHgxRUM0LCAweDhFQTIsCisgICAgMHhCNkExLCAweEI2RkUsIDB4MUYyMiwgMHg4RUEyLCAweEI3QTEsIDB4QjdGRSwgMHgxRjgwLCAweDhFQTIsIDB4QjhBMSwKKyAgICAweEI4RkUsIDB4MUZERSwgMHg4RUEyLCAweEI5QTEsIDB4QjlGRSwgMHgyMDNDLCAweDhFQTIsIDB4QkFBMSwgMHhCQUZFLAorICAgIDB4MjA5QSwgMHg4RUEyLCAweEJCQTEsIDB4QkJGRSwgMHgyMEY4LCAweDhFQTIsIDB4QkNBMSwgMHhCQ0ZFLCAweDIxNTYsCisgICAgMHg4RUEyLCAweEJEQTEsIDB4QkRGRSwgMHgyMUI0LCAweDhFQTIsIDB4QkVBMSwgMHhCRUZFLCAweDIyMTIsIDB4OEVBMiwKKyAgICAweEJGQTEsIDB4QkZGRSwgMHgyMjcwLCAweDhFQTIsIDB4QzBBMSwgMHhDMEZFLCAweDIyQ0UsIDB4OEVBMiwgMHhDMUExLAorICAgIDB4QzFGRSwgMHgyMzJDLCAweDhFQTIsIDB4QzJBMSwgMHhDMkZFLCAweDIzOEEsIDB4OEVBMiwgMHhDM0ExLCAweEMzRkUsCisgICAgMHgyM0U4LCAweDhFQTIsIDB4QzRBMSwgMHhDNEZFLCAweDI0NDYsIDB4OEVBMiwgMHhDNUExLCAweEM1RkUsIDB4MjRBNCwKKyAgICAweDhFQTIsIDB4QzZBMSwgMHhDNkZFLCAweDI1MDIsIDB4OEVBMiwgMHhDN0ExLCAweEM3RkUsIDB4MjU2MCwgMHg4RUEyLAorICAgIDB4QzhBMSwgMHhDOEZFLCAweDI1QkUsIDB4OEVBMiwgMHhDOUExLCAweEM5RkUsIDB4MjYxQywgMHg4RUEyLCAweENBQTEsCisgICAgMHhDQUZFLCAweDI2N0EsIDB4OEVBMiwgMHhDQkExLCAweENCRkUsIDB4MjZEOCwgMHg4RUEyLCAweENDQTEsIDB4Q0NGRSwKKyAgICAweDI3MzYsIDB4OEVBMiwgMHhDREExLCAweENERkUsIDB4Mjc5NCwgMHg4RUEyLCAweENFQTEsIDB4Q0VGRSwgMHgyN0YyLAorICAgIDB4OEVBMiwgMHhDRkExLCAweENGRkUsIDB4Mjg1MCwgMHg4RUEyLCAweEQwQTEsIDB4RDBGRSwgMHgyOEFFLCAweDhFQTIsCisgICAgMHhEMUExLCAweEQxRkUsIDB4MjkwQywgMHg4RUEyLCAweEQyQTEsIDB4RDJGRSwgMHgyOTZBLCAweDhFQTIsIDB4RDNBMSwKKyAgICAweEQzRkUsIDB4MjlDOCwgMHg4RUEyLCAweEQ0QTEsIDB4RDRGRSwgMHgyQTI2LCAweDhFQTIsIDB4RDVBMSwgMHhENUZFLAorICAgIDB4MkE4NCwgMHg4RUEyLCAweEQ2QTEsIDB4RDZGRSwgMHgyQUUyLCAweDhFQTIsIDB4RDdBMSwgMHhEN0ZFLCAweDJCNDAsCisgICAgMHg4RUEyLCAweEQ4QTEsIDB4RDhGRSwgMHgyQjlFLCAweDhFQTIsIDB4RDlBMSwgMHhEOUZFLCAweDJCRkMsIDB4OEVBMiwKKyAgICAweERBQTEsIDB4REFGRSwgMHgyQzVBLCAweDhFQTIsIDB4REJBMSwgMHhEQkZFLCAweDJDQjgsIDB4OEVBMiwgMHhEQ0ExLAorICAgIDB4RENGRSwgMHgyRDE2LCAweDhFQTIsIDB4RERBMSwgMHhEREZFLCAweDJENzQsIDB4OEVBMiwgMHhERUExLCAweERFRkUsCisgICAgMHgyREQyLCAweDhFQTIsIDB4REZBMSwgMHhERkZFLCAweDJFMzAsIDB4OEVBMiwgMHhFMEExLCAweEUwRkUsIDB4MkU4RSwKKyAgICAweDhFQTIsIDB4RTFBMSwgMHhFMUZFLCAweDJFRUMsIDB4OEVBMiwgMHhFMkExLCAweEUyRkUsIDB4MkY0QSwgMHg4RUEyLAorICAgIDB4RTNBMSwgMHhFM0ZFLCAweDJGQTgsIDB4OEVBMiwgMHhFNEExLCAweEU0RkUsIDB4MzAwNiwgMHg4RUEyLCAweEU1QTEsCisgICAgMHhFNUZFLCAweDMwNjQsIDB4OEVBMiwgMHhFNkExLCAweEU2RkUsIDB4MzBDMiwgMHg4RUEyLCAweEU3QTEsIDB4RTdGRSwKKyAgICAweDMxMjAsIDB4OEVBMiwgMHhFOEExLCAweEU4RkUsIDB4MzE3RSwgMHg4RUEyLCAweEU5QTEsIDB4RTlGRSwgMHgzMURDLAorICAgIDB4OEVBMiwgMHhFQUExLCAweEVBRkUsIDB4MzIzQSwgMHg4RUEyLCAweEVCQTEsIDB4RUJGRSwgMHgzMjk4LCAweDhFQTIsCisgICAgMHhFQ0ExLCAweEVDRkUsIDB4MzJGNiwgMHg4RUEyLCAweEVEQTEsIDB4RURGRSwgMHgzMzU0LCAweDhFQTIsIDB4RUVBMSwKKyAgICAweEVFRkUsIDB4MzNCMiwgMHg4RUEyLCAweEVGQTEsIDB4RUZGRSwgMHgzNDEwLCAweDhFQTIsIDB4RjBBMSwgMHhGMEZFLAorICAgIDB4MzQ2RSwgMHg4RUEyLCAweEYxQTEsIDB4RjFGRSwgMHgzNENDLCAweDhFQTIsIDB4RjJBMSwgMHhGMkM0LCAweDM1MkEsCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvRVRlbi1CNS1IXzAuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvRVRlbi1CNS1IXzAuY3BwCmluZGV4IDJlMDlhNTAuLmQ2NzIxMjAgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0VUZW4tQjUtSF8wLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9FVGVuLUI1LUhfMC5jcHAKQEAgLTEsMTAgKzEsMTIgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0IGdfRlhDTUFQX0VUZW5fQjVfSF8wWzI1NCAqIDNdID0geworI2luY2x1ZGUgImNtYXBzX2NuczEuaCIKKworY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9FVGVuX0I1X0hfMFsyNTQgKiAzXSA9IHsKICAgICAweDAwMjAsIDB4MDA3RSwgMHgzNTUwLCAweEExNDAsIDB4QTE1OCwgMHgwMDYzLCAweEExNTksIDB4QTE1QywgMHgzNUFGLAogICAgIDB4QTE1RCwgMHhBMTdFLCAweDAwODAsIDB4QTFBMSwgMHhBMUY1LCAweDAwQTIsIDB4QTFGNiwgMHhBMUY2LCAweDAwRjgsCiAgICAgMHhBMUY3LCAweEExRjcsIDB4MDBGNywgMHhBMUY4LCAweEExRkUsIDB4MDBGOSwgMHhBMjQwLCAweEEyN0UsIDB4MDEwMCwKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0VUZW4tQjUtVl8wLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0VUZW4tQjUtVl8wLmNwcAppbmRleCA5NDFjMWYyLi5mMDk4YjE4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9FVGVuLUI1LVZfMC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvRVRlbi1CNS1WXzAuY3BwCkBAIC0xLDEzICsxLDE1IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCBnX0ZYQ01BUF9FVGVuX0I1X1ZfMFsxMyAqIDNdID0gewotICAgIDB4QTE0QiwgMHhBMTRCLCAweDM1NEUsIDB4QTE1QSwgMHhBMTVBLCAweDM1QUYsIDB4QTE1QywgMHhBMTVDLCAweDM1QjEsCi0gICAgMHhBMTVELCAweEExNUUsIDB4MDA4MiwgMHhBMTYxLCAweEExNjIsIDB4MDA4NiwgMHhBMTY1LCAweEExNjYsIDB4MDA4QSwKLSAgICAweEExNjksIDB4QTE2QSwgMHgwMDhFLCAweEExNkQsIDB4QTE2RSwgMHgwMDkyLCAweEExNzEsIDB4QTE3MiwgMHgwMDk2LAotICAgIDB4QTE3NSwgMHhBMTc2LCAweDAwOUEsIDB4QTE3OSwgMHhBMTdBLCAweDAwOUUsIDB4QTFFMywgMHhBMUUzLCAweDM1NEYsCi0gICAgMHhDNkU0LCAweEM2RTUsIDB4MzcxMSwKKyNpbmNsdWRlICJjbWFwc19jbnMxLmgiCisKK2NvbnN0IEZYX1dPUkQgZ19GWENNQVBfRVRlbl9CNV9WXzBbMTMgKiAzXSA9IHsKKyAgICAweEExNEIsIDB4QTE0QiwgMHgzNTRFLCAweEExNUEsIDB4QTE1QSwgMHgzNUFGLCAweEExNUMsIDB4QTE1QywKKyAgICAweDM1QjEsIDB4QTE1RCwgMHhBMTVFLCAweDAwODIsIDB4QTE2MSwgMHhBMTYyLCAweDAwODYsIDB4QTE2NSwKKyAgICAweEExNjYsIDB4MDA4QSwgMHhBMTY5LCAweEExNkEsIDB4MDA4RSwgMHhBMTZELCAweEExNkUsIDB4MDA5MiwKKyAgICAweEExNzEsIDB4QTE3MiwgMHgwMDk2LCAweEExNzUsIDB4QTE3NiwgMHgwMDlBLCAweEExNzksIDB4QTE3QSwKKyAgICAweDAwOUUsIDB4QTFFMywgMHhBMUUzLCAweDM1NEYsIDB4QzZFNCwgMHhDNkU1LCAweDM3MTEsCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvRVRlbm1zLUI1LUhfMC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9FVGVubXMtQjUtSF8wLmNwcAppbmRleCBmYWUyNjMzLi40ZDJjOTJmIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9FVGVubXMtQjUtSF8wLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9FVGVubXMtQjUtSF8wLmNwcApAQCAtMSw5ICsxLDExIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCBnX0ZYQ01BUF9FVGVubXNfQjVfSF8wWzEgKiAzXSA9IHsKKyNpbmNsdWRlICJjbWFwc19jbnMxLmgiCisKK2NvbnN0IEZYX1dPUkQgZ19GWENNQVBfRVRlbm1zX0I1X0hfMFsxICogM10gPSB7CiAgICAgMHgwMDIwLCAweDAwN0UsIDB4MDAwMSwKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9FVGVubXMtQjUtVl8wLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0VUZW5tcy1CNS1WXzAuY3BwCmluZGV4IDc5YjhhMzQuLjgwNjQxZTcgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0VUZW5tcy1CNS1WXzAuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0VUZW5tcy1CNS1WXzAuY3BwCkBAIC0xLDEwICsxLDEyIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCBnX0ZYQ01BUF9FVGVubXNfQjVfVl8wWzE4ICogM10gPSB7CisjaW5jbHVkZSAiY21hcHNfY25zMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0VUZW5tc19CNV9WXzBbMTggKiAzXSA9IHsKICAgICAweEExNEIsIDB4QTE0QiwgMHgzNTRFLCAweEExNEMsIDB4QTE0QywgMHgwMDZELCAweEExNTYsIDB4QTE1NiwgMHgwMTM4LAogICAgIDB4QTE1OCwgMHhBMTU4LCAweDAwN0EsIDB4QTE1QSwgMHhBMTVBLCAweDM1QUYsIDB4QTE1QywgMHhBMTVDLCAweDM1QjEsCiAgICAgMHhBMTVELCAweEExNUUsIDB4MDA4MiwgMHhBMTYxLCAweEExNjIsIDB4MDA4NiwgMHhBMTY1LCAweEExNjYsIDB4MDA4QSwKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0hLc2NzLUI1LUhfNS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9IS3Njcy1CNS1IXzUuY3BwCmluZGV4IDI4N2MxMGUuLmZjMTNiODYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0hLc2NzLUI1LUhfNS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvSEtzY3MtQjUtSF81LmNwcApAQCAtMSwxMCArMSwxMiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi1leHRlcm4gY29uc3QgdW5zaWduZWQgc2hvcnQgZ19GWENNQVBfSEtzY3NfQjVfSF81WzEyMTAgKiAzXSA9IHsKKyNpbmNsdWRlICJjbWFwc19jbnMxLmgiCisKK2NvbnN0IEZYX1dPUkQgZ19GWENNQVBfSEtzY3NfQjVfSF81WzEyMTAgKiAzXSA9IHsKICAgICAweDAwMjAsIDB4MDA3RSwgMHgwMDAxLCAweDg3NDAsIDB4ODc2NSwgMHg0QTE1LCAweDg3NjcsIDB4ODc3OSwgMHg0QTNCLAogICAgIDB4ODg0MCwgMHg4ODU1LCAweDQ0QzksIDB4ODg1NiwgMHg4ODdFLCAweDQ5NjEsIDB4ODhBMSwgMHg4OEE4LCAweDQ5OEEsCiAgICAgMHg4OEE5LCAweDg4QUEsIDB4NDk5QywgMHg4OTQwLCAweDg5NDEsIDB4NDUzNCwgMHg4OTQzLCAweDg5NDMsIDB4NDUzNiwKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0hLc2NzLUI1LVZfNS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9IS3Njcy1CNS1WXzUuY3BwCmluZGV4IDA1YzUyZTQuLjRkYmNjMzggMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL0hLc2NzLUI1LVZfNS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvSEtzY3MtQjUtVl81LmNwcApAQCAtMSwxMyArMSwxNSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi1leHRlcm4gY29uc3QgdW5zaWduZWQgc2hvcnQgZ19GWENNQVBfSEtzY3NfQjVfVl81WzEzICogM10gPSB7Ci0gICAgMHhBMTRCLCAweEExNEIsIDB4MzU0RSwgMHhBMTVBLCAweEExNUEsIDB4MzVBRiwgMHhBMTVDLCAweEExNUMsIDB4MzVCMSwKLSAgICAweEExNUQsIDB4QTE1RSwgMHgwMDgyLCAweEExNjEsIDB4QTE2MiwgMHgwMDg2LCAweEExNjUsIDB4QTE2NiwgMHgwMDhBLAotICAgIDB4QTE2OSwgMHhBMTZBLCAweDAwOEUsIDB4QTE2RCwgMHhBMTZFLCAweDAwOTIsIDB4QTE3MSwgMHhBMTcyLCAweDAwOTYsCi0gICAgMHhBMTc1LCAweEExNzYsIDB4MDA5QSwgMHhBMTc5LCAweEExN0EsIDB4MDA5RSwgMHhBMUUzLCAweEExRTMsIDB4MzU0RiwKLSAgICAweEM2RTQsIDB4QzZFNSwgMHgzNzExLAorI2luY2x1ZGUgImNtYXBzX2NuczEuaCIKKworY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9IS3Njc19CNV9WXzVbMTMgKiAzXSA9IHsKKyAgICAweEExNEIsIDB4QTE0QiwgMHgzNTRFLCAweEExNUEsIDB4QTE1QSwgMHgzNUFGLCAweEExNUMsIDB4QTE1QywKKyAgICAweDM1QjEsIDB4QTE1RCwgMHhBMTVFLCAweDAwODIsIDB4QTE2MSwgMHhBMTYyLCAweDAwODYsIDB4QTE2NSwKKyAgICAweEExNjYsIDB4MDA4QSwgMHhBMTY5LCAweEExNkEsIDB4MDA4RSwgMHhBMTZELCAweEExNkUsIDB4MDA5MiwKKyAgICAweEExNzEsIDB4QTE3MiwgMHgwMDk2LCAweEExNzUsIDB4QTE3NiwgMHgwMDlBLCAweEExNzksIDB4QTE3QSwKKyAgICAweDAwOUUsIDB4QTFFMywgMHhBMUUzLCAweDM1NEYsIDB4QzZFNCwgMHhDNkU1LCAweDM3MTEsCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvVW5pQ05TLVVDUzItSF8zLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL1VuaUNOUy1VQ1MyLUhfMy5jcHAKaW5kZXggZDU4YjVhMy4uNjU1MzdhYyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvVW5pQ05TLVVDUzItSF8zLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9VbmlDTlMtVUNTMi1IXzMuY3BwCkBAIC0xLDEwICsxLDEyIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCBnX0ZYQ01BUF9VbmlDTlNfVUNTMl9IXzNbMTY0MTggKiAzXSA9IHsKKyNpbmNsdWRlICJjbWFwc19jbnMxLmgiCisKK2NvbnN0IEZYX1dPUkQgZ19GWENNQVBfVW5pQ05TX1VDUzJfSF8zWzE2NDE4ICogM10gPSB7CiAgICAgMHgwMDIwLCAweDAwN0UsIDB4MDAwMSwgMHgwMEEyLCAweDAwQTMsIDB4MDEwNiwgMHgwMEE1LCAweDAwQTUsIDB4MDEwNCwKICAgICAweDAwQTcsIDB4MDBBNywgMHgwMEIyLCAweDAwQTgsIDB4MDBBOCwgMHgzNUIzLCAweDAwQUMsIDB4MDBBQywgMHgzNkUxLAogICAgIDB4MDBCMCwgMHgwMEIwLCAweDAxMTgsIDB4MDBCMSwgMHgwMEIxLCAweDAwRDQsIDB4MDBCNywgMHgwMEI3LCAweDAwNzMsCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9VbmlDTlMtVUNTMi1WXzMuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvVW5pQ05TLVVDUzItVl8zLmNwcAppbmRleCBlZWQ1ZTFmLi4yZWM3ODhlIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9VbmlDTlMtVUNTMi1WXzMuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL1VuaUNOUy1VQ1MyLVZfMy5jcHAKQEAgLTEsMTMgKzEsMTUgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0IGdfRlhDTUFQX1VuaUNOU19VQ1MyX1ZfM1sxMyAqIDNdID0gewotICAgIDB4MjAxMywgMHgyMDEzLCAweDAwNzgsIDB4MjAxNCwgMHgyMDE0LCAweDAwN0EsIDB4MjAyNSwgMHgyMDI1LCAweDAwNkQsCi0gICAgMHgzMDA4LCAweDMwMDksIDB4MDA5NiwgMHgzMDBBLCAweDMwMEIsIDB4MDA5MiwgMHgzMDBDLCAweDMwMEQsIDB4MDA5QSwKLSAgICAweDMwMEUsIDB4MzAwRiwgMHgwMDlFLCAweDMwMTAsIDB4MzAxMSwgMHgwMDhFLCAweDMwMTQsIDB4MzAxNSwgMHgwMDhBLAotICAgIDB4RkU0RiwgMHhGRTRGLCAweDM1QjEsIDB4RkYwOCwgMHhGRjA5LCAweDAwODIsIDB4RkY1QiwgMHhGRjVCLCAweDAwODYsCi0gICAgMHhGRjVELCAweEZGNUQsIDB4MDA4NywKKyNpbmNsdWRlICJjbWFwc19jbnMxLmgiCisKK2NvbnN0IEZYX1dPUkQgZ19GWENNQVBfVW5pQ05TX1VDUzJfVl8zWzEzICogM10gPSB7CisgICAgMHgyMDEzLCAweDIwMTMsIDB4MDA3OCwgMHgyMDE0LCAweDIwMTQsIDB4MDA3QSwgMHgyMDI1LCAweDIwMjUsCisgICAgMHgwMDZELCAweDMwMDgsIDB4MzAwOSwgMHgwMDk2LCAweDMwMEEsIDB4MzAwQiwgMHgwMDkyLCAweDMwMEMsCisgICAgMHgzMDBELCAweDAwOUEsIDB4MzAwRSwgMHgzMDBGLCAweDAwOUUsIDB4MzAxMCwgMHgzMDExLCAweDAwOEUsCisgICAgMHgzMDE0LCAweDMwMTUsIDB4MDA4QSwgMHhGRTRGLCAweEZFNEYsIDB4MzVCMSwgMHhGRjA4LCAweEZGMDksCisgICAgMHgwMDgyLCAweEZGNUIsIDB4RkY1QiwgMHgwMDg2LCAweEZGNUQsIDB4RkY1RCwgMHgwMDg3LAogfTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL1VuaUNOUy1VVEYxNi1IXzAuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvVW5pQ05TLVVURjE2LUhfMC5jcHAKaW5kZXggZWE3ZjExOC4uYTM5MjYwYiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvVW5pQ05TLVVURjE2LUhfMC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvVW5pQ05TLVVURjE2LUhfMC5jcHAKQEAgLTEsMzY1MSArMSwzMjQ1IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCBnX0ZYQ01BUF9VbmlDTlNfVVRGMTZfSF8wWzE0NTU3ICogMl0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMDEsIDB4MDAyMSwgMHgwMDAyLCAweDAwMjIsIDB4MDAwMywgMHgwMDIzLCAweDAwMDQsCi0gICAgMHgwMDI0LCAweDAwMDUsIDB4MDAyNSwgMHgwMDA2LCAweDAwMjYsIDB4MDAwNywgMHgwMDI3LCAweDAwMDgsCi0gICAgMHgwMDI4LCAweDAwMDksIDB4MDAyOSwgMHgwMDBBLCAweDAwMkEsIDB4MDAwQiwgMHgwMDJCLCAweDAwMEMsCi0gICAgMHgwMDJDLCAweDAwMEQsIDB4MDAyRCwgMHgwMDBFLCAweDAwMkUsIDB4MDAwRiwgMHgwMDJGLCAweDAwMTAsCi0gICAgMHgwMDMwLCAweDAwMTEsIDB4MDAzMSwgMHgwMDEyLCAweDAwMzIsIDB4MDAxMywgMHgwMDMzLCAweDAwMTQsCi0gICAgMHgwMDM0LCAweDAwMTUsIDB4MDAzNSwgMHgwMDE2LCAweDAwMzYsIDB4MDAxNywgMHgwMDM3LCAweDAwMTgsCi0gICAgMHgwMDM4LCAweDAwMTksIDB4MDAzOSwgMHgwMDFBLCAweDAwM0EsIDB4MDAxQiwgMHgwMDNCLCAweDAwMUMsCi0gICAgMHgwMDNDLCAweDAwMUQsIDB4MDAzRCwgMHgwMDFFLCAweDAwM0UsIDB4MDAxRiwgMHgwMDNGLCAweDAwMjAsCi0gICAgMHgwMDQwLCAweDAwMjEsIDB4MDA0MSwgMHgwMDIyLCAweDAwNDIsIDB4MDAyMywgMHgwMDQzLCAweDAwMjQsCi0gICAgMHgwMDQ0LCAweDAwMjUsIDB4MDA0NSwgMHgwMDI2LCAweDAwNDYsIDB4MDAyNywgMHgwMDQ3LCAweDAwMjgsCi0gICAgMHgwMDQ4LCAweDAwMjksIDB4MDA0OSwgMHgwMDJBLCAweDAwNEEsIDB4MDAyQiwgMHgwMDRCLCAweDAwMkMsCi0gICAgMHgwMDRDLCAweDAwMkQsIDB4MDA0RCwgMHgwMDJFLCAweDAwNEUsIDB4MDAyRiwgMHgwMDRGLCAweDAwMzAsCi0gICAgMHgwMDUwLCAweDAwMzEsIDB4MDA1MSwgMHgwMDMyLCAweDAwNTIsIDB4MDAzMywgMHgwMDUzLCAweDAwMzQsCi0gICAgMHgwMDU0LCAweDAwMzUsIDB4MDA1NSwgMHgwMDM2LCAweDAwNTYsIDB4MDAzNywgMHgwMDU3LCAweDAwMzgsCi0gICAgMHgwMDU4LCAweDAwMzksIDB4MDA1OSwgMHgwMDNBLCAweDAwNUEsIDB4MDAzQiwgMHgwMDVCLCAweDAwM0MsCi0gICAgMHgwMDVDLCAweDAwM0QsIDB4MDA1RCwgMHgwMDNFLCAweDAwNUUsIDB4MDAzRiwgMHgwMDVGLCAweDAwNDAsCi0gICAgMHgwMDYwLCAweDAwNDEsIDB4MDA2MSwgMHgwMDQyLCAweDAwNjIsIDB4MDA0MywgMHgwMDYzLCAweDAwNDQsCi0gICAgMHgwMDY0LCAweDAwNDUsIDB4MDA2NSwgMHgwMDQ2LCAweDAwNjYsIDB4MDA0NywgMHgwMDY3LCAweDAwNDgsCi0gICAgMHgwMDY4LCAweDAwNDksIDB4MDA2OSwgMHgwMDRBLCAweDAwNkEsIDB4MDA0QiwgMHgwMDZCLCAweDAwNEMsCi0gICAgMHgwMDZDLCAweDAwNEQsIDB4MDA2RCwgMHgwMDRFLCAweDAwNkUsIDB4MDA0RiwgMHgwMDZGLCAweDAwNTAsCi0gICAgMHgwMDcwLCAweDAwNTEsIDB4MDA3MSwgMHgwMDUyLCAweDAwNzIsIDB4MDA1MywgMHgwMDczLCAweDAwNTQsCi0gICAgMHgwMDc0LCAweDAwNTUsIDB4MDA3NSwgMHgwMDU2LCAweDAwNzYsIDB4MDA1NywgMHgwMDc3LCAweDAwNTgsCi0gICAgMHgwMDc4LCAweDAwNTksIDB4MDA3OSwgMHgwMDVBLCAweDAwN0EsIDB4MDA1QiwgMHgwMDdCLCAweDAwNUMsCi0gICAgMHgwMDdDLCAweDAwNUQsIDB4MDA3RCwgMHgwMDVFLCAweDAwN0UsIDB4MDA1RiwgMHgwMEEyLCAweDAxMDYsCi0gICAgMHgwMEEzLCAweDAxMDcsIDB4MDBBNSwgMHgwMTA0LCAweDAwQTcsIDB4MDBCMiwgMHgwMEE4LCAweDM1QjMsCi0gICAgMHgwMEFDLCAweDM2RTEsIDB4MDBBRiwgMHgwMEMzLCAweDAwQjAsIDB4MDExOCwgMHgwMEIxLCAweDAwRDQsCi0gICAgMHgwMEI3LCAweDAwNzMsIDB4MDBENywgMHgwMEQyLCAweDAwRjcsIDB4MDBEMywgMHgwMkM2LCAweDM1QjQsCi0gICAgMHgwMkM3LCAweDAxRjgsIDB4MDJDQSwgMHgwMUY3LCAweDAyQ0IsIDB4MDFGOSwgMHgwMkNELCAweDAwQzYsCi0gICAgMHgwMkQ5LCAweDAxRjYsIDB4MDMwOCwgMHgzNUIzLCAweDAzOTEsIDB4MDFBMSwgMHgwMzkyLCAweDAxQTIsCi0gICAgMHgwMzkzLCAweDAxQTMsIDB4MDM5NCwgMHgwMUE0LCAweDAzOTUsIDB4MDFBNSwgMHgwMzk2LCAweDAxQTYsCi0gICAgMHgwMzk3LCAweDAxQTcsIDB4MDM5OCwgMHgwMUE4LCAweDAzOTksIDB4MDFBOSwgMHgwMzlBLCAweDAxQUEsCi0gICAgMHgwMzlCLCAweDAxQUIsIDB4MDM5QywgMHgwMUFDLCAweDAzOUQsIDB4MDFBRCwgMHgwMzlFLCAweDAxQUUsCi0gICAgMHgwMzlGLCAweDAxQUYsIDB4MDNBMCwgMHgwMUIwLCAweDAzQTEsIDB4MDFCMSwgMHgwM0EzLCAweDAxQjIsCi0gICAgMHgwM0E0LCAweDAxQjMsIDB4MDNBNSwgMHgwMUI0LCAweDAzQTYsIDB4MDFCNSwgMHgwM0E3LCAweDAxQjYsCi0gICAgMHgwM0E4LCAweDAxQjcsIDB4MDNBOSwgMHgwMUI4LCAweDAzQjEsIDB4MDFCOSwgMHgwM0IyLCAweDAxQkEsCi0gICAgMHgwM0IzLCAweDAxQkIsIDB4MDNCNCwgMHgwMUJDLCAweDAzQjUsIDB4MDFCRCwgMHgwM0I2LCAweDAxQkUsCi0gICAgMHgwM0I3LCAweDAxQkYsIDB4MDNCOCwgMHgwMUMwLCAweDAzQjksIDB4MDFDMSwgMHgwM0JBLCAweDAxQzIsCi0gICAgMHgwM0JCLCAweDAxQzMsIDB4MDNCQywgMHgwMUM0LCAweDAzQkQsIDB4MDFDNSwgMHgwM0JFLCAweDAxQzYsCi0gICAgMHgwM0JGLCAweDAxQzcsIDB4MDNDMCwgMHgwMUM4LCAweDAzQzEsIDB4MDFDOSwgMHgwM0MzLCAweDAxQ0EsCi0gICAgMHgwM0M0LCAweDAxQ0IsIDB4MDNDNSwgMHgwMUNDLCAweDAzQzYsIDB4MDFDRCwgMHgwM0M3LCAweDAxQ0UsCi0gICAgMHgwM0M4LCAweDAxQ0YsIDB4MDNDOSwgMHgwMUQwLCAweDA0MDEsIDB4MzY3MCwgMHgwNDEwLCAweDM2NkEsCi0gICAgMHgwNDExLCAweDM2NkIsIDB4MDQxMiwgMHgzNjZDLCAweDA0MTMsIDB4MzY2RCwgMHgwNDE0LCAweDM2NkUsCi0gICAgMHgwNDE1LCAweDM2NkYsIDB4MDQxNiwgMHgzNjcxLCAweDA0MTcsIDB4MzY3MiwgMHgwNDE4LCAweDM2NzMsCi0gICAgMHgwNDE5LCAweDM2NzQsIDB4MDQxQSwgMHgzNjc1LCAweDA0MUIsIDB4MzY3NiwgMHgwNDFDLCAweDM2NzcsCi0gICAgMHgwNDFELCAweDM2NzgsIDB4MDQxRSwgMHgzNjc5LCAweDA0MUYsIDB4MzY3QSwgMHgwNDIwLCAweDM2N0IsCi0gICAgMHgwNDIxLCAweDM2N0MsIDB4MDQyMiwgMHgzNjdELCAweDA0MjMsIDB4MzY3RSwgMHgwNDI0LCAweDM2N0YsCi0gICAgMHgwNDI1LCAweDM2ODAsIDB4MDQyNiwgMHgzNjgxLCAweDA0MjcsIDB4MzY4MiwgMHgwNDI4LCAweDM2ODMsCi0gICAgMHgwNDI5LCAweDM2ODQsIDB4MDQyQSwgMHgzNjg1LCAweDA0MkIsIDB4MzY4NiwgMHgwNDJDLCAweDM2ODcsCi0gICAgMHgwNDJELCAweDM2ODgsIDB4MDQyRSwgMHgzNjg5LCAweDA0MkYsIDB4MzY4QSwgMHgwNDMwLCAweDM2OEIsCi0gICAgMHgwNDMxLCAweDM2OEMsIDB4MDQzMiwgMHgzNjhELCAweDA0MzMsIDB4MzY4RSwgMHgwNDM0LCAweDM2OEYsCi0gICAgMHgwNDM1LCAweDM2OTAsIDB4MDQzNiwgMHgzNjkyLCAweDA0MzcsIDB4MzY5MywgMHgwNDM4LCAweDM2OTQsCi0gICAgMHgwNDM5LCAweDM2OTUsIDB4MDQzQSwgMHgzNjk2LCAweDA0M0IsIDB4MzY5NywgMHgwNDNDLCAweDM2OTgsCi0gICAgMHgwNDNELCAweDM2OTksIDB4MDQzRSwgMHgzNjlBLCAweDA0M0YsIDB4MzY5QiwgMHgwNDQwLCAweDM2OUMsCi0gICAgMHgwNDQxLCAweDM2OUQsIDB4MDQ0MiwgMHgzNjlFLCAweDA0NDMsIDB4MzY5RiwgMHgwNDQ0LCAweDM2QTAsCi0gICAgMHgwNDQ1LCAweDM2QTEsIDB4MDQ0NiwgMHgzNkEyLCAweDA0NDcsIDB4MzZBMywgMHgwNDQ4LCAweDM2QTQsCi0gICAgMHgwNDQ5LCAweDM2QTUsIDB4MDQ0QSwgMHgzNkE2LCAweDA0NEIsIDB4MzZBNywgMHgwNDRDLCAweDM2QTgsCi0gICAgMHgwNDRELCAweDM2QTksIDB4MDQ0RSwgMHgzNkFBLCAweDA0NEYsIDB4MzZBQiwgMHgwNDUxLCAweDM2OTEsCi0gICAgMHgyMDEzLCAweDAwNzksIDB4MjAxNCwgMHgwMDdCLCAweDIwMTgsIDB4MDBBNiwgMHgyMDE5LCAweDAwQTcsCi0gICAgMHgyMDFDLCAweDAwQTgsIDB4MjAxRCwgMHgwMEE5LCAweDIwMjIsIDB4MDA2OCwgMHgyMDI1LCAweDAwNkYsCi0gICAgMHgyMDI2LCAweDAwNkUsIDB4MjAyNywgMHgwMDY4LCAweDIwMzIsIDB4MDBBRCwgMHgyMDM1LCAweDAwQUMsCi0gICAgMHgyMDNCLCAweDAwQjEsIDB4MjAzRSwgMHgwMEMzLCAweDIxMDMsIDB4MDEwQSwgMHgyMTA1LCAweDAwQzIsCi0gICAgMHgyMTA5LCAweDAxMEIsIDB4MjExNiwgMHgzNkU2LCAweDIxMjEsIDB4MzZFNywgMHgyMTYwLCAweDAxNTcsCi0gICAgMHgyMTYxLCAweDAxNTgsIDB4MjE2MiwgMHgwMTU5LCAweDIxNjMsIDB4MDE1QSwgMHgyMTY0LCAweDAxNUIsCi0gICAgMHgyMTY1LCAweDAxNUMsIDB4MjE2NiwgMHgwMTVELCAweDIxNjcsIDB4MDE1RSwgMHgyMTY4LCAweDAxNUYsCi0gICAgMHgyMTY5LCAweDAxNjAsIDB4MjE3MCwgMHgwMjBFLCAweDIxNzEsIDB4MDIwRiwgMHgyMTcyLCAweDAyMTAsCi0gICAgMHgyMTczLCAweDAyMTEsIDB4MjE3NCwgMHgwMjEyLCAweDIxNzUsIDB4MDIxMywgMHgyMTc2LCAweDAyMTQsCi0gICAgMHgyMTc3LCAweDAyMTUsIDB4MjE3OCwgMHgwMjE2LCAweDIxNzksIDB4MDIxNywgMHgyMTkwLCAweDAwRjgsCi0gICAgMHgyMTkxLCAweDAwRjUsIDB4MjE5MiwgMHgwMEY3LCAweDIxOTMsIDB4MDBGNiwgMHgyMTk2LCAweDAwRjksCi0gICAgMHgyMTk3LCAweDAwRkEsIDB4MjE5OCwgMHgwMEZDLCAweDIxOTksIDB4MDBGQiwgMHgyMUI4LCAweDM2QUQsCi0gICAgMHgyMUI5LCAweDM2QUUsIDB4MjFFNywgMHgzNkFDLCAweDIyMTUsIDB4MDEwMSwgMHgyMjFBLCAweDAwRDUsCi0gICAgMHgyMjFFLCAweDAwREMsIDB4MjIxRiwgMHgwMEU5LCAweDIyMjAsIDB4MDBFOCwgMHgyMjIzLCAweDAwRkUsCi0gICAgMHgyMjI1LCAweDAwRkQsIDB4MjIyOSwgMHgwMEU1LCAweDIyMkEsIDB4MDBFNiwgMHgyMjJCLCAweDAwRUQsCi0gICAgMHgyMjJFLCAweDAwRUUsIDB4MjIzNCwgMHgwMEYwLCAweDIyMzUsIDB4MDBFRiwgMHgyMjNDLCAweDAwRTQsCi0gICAgMHgyMjUyLCAweDAwREQsIDB4MjI2MCwgMHgwMERCLCAweDIyNjEsIDB4MDBERSwgMHgyMjY2LCAweDAwRDksCi0gICAgMHgyMjY3LCAweDAwREEsIDB4MjI5NSwgMHgwMEYzLCAweDIyOTksIDB4MDBGNCwgMHgyMkE1LCAweDAwRTcsCi0gICAgMHgyMkJGLCAweDAwRUEsIDB4MjJFRiwgMHgwMDZFLCAweDI0MDAsIDB4MDIzMiwgMHgyNDAxLCAweDAyMzMsCi0gICAgMHgyNDAyLCAweDAyMzQsIDB4MjQwMywgMHgwMjM1LCAweDI0MDQsIDB4MDIzNiwgMHgyNDA1LCAweDAyMzcsCi0gICAgMHgyNDA2LCAweDAyMzgsIDB4MjQwNywgMHgwMjM5LCAweDI0MDgsIDB4MDIzQSwgMHgyNDA5LCAweDAyM0IsCi0gICAgMHgyNDBBLCAweDAyM0MsIDB4MjQwQiwgMHgwMjNELCAweDI0MEMsIDB4MDIzRSwgMHgyNDBELCAweDAyM0YsCi0gICAgMHgyNDBFLCAweDAyNDAsIDB4MjQwRiwgMHgwMjQxLCAweDI0MTAsIDB4MDI0MiwgMHgyNDExLCAweDAyNDMsCi0gICAgMHgyNDEyLCAweDAyNDQsIDB4MjQxMywgMHgwMjQ1LCAweDI0MTQsIDB4MDI0NiwgMHgyNDE1LCAweDAyNDcsCi0gICAgMHgyNDE2LCAweDAyNDgsIDB4MjQxNywgMHgwMjQ5LCAweDI0MTgsIDB4MDI0QSwgMHgyNDE5LCAweDAyNEIsCi0gICAgMHgyNDFBLCAweDAyNEMsIDB4MjQxQiwgMHgwMjRELCAweDI0MUMsIDB4MDI0RSwgMHgyNDFELCAweDAyNEYsCi0gICAgMHgyNDFFLCAweDAyNTAsIDB4MjQxRiwgMHgwMjUxLCAweDI0MjEsIDB4MDI1MiwgMHgyNDYwLCAweDAxRkEsCi0gICAgMHgyNDYxLCAweDAxRkIsIDB4MjQ2MiwgMHgwMUZDLCAweDI0NjMsIDB4MDFGRCwgMHgyNDY0LCAweDAxRkUsCi0gICAgMHgyNDY1LCAweDAxRkYsIDB4MjQ2NiwgMHgwMjAwLCAweDI0NjcsIDB4MDIwMSwgMHgyNDY4LCAweDAyMDIsCi0gICAgMHgyNDY5LCAweDAyMDMsIDB4MjQ3NCwgMHgwMjA0LCAweDI0NzUsIDB4MDIwNSwgMHgyNDc2LCAweDAyMDYsCi0gICAgMHgyNDc3LCAweDAyMDcsIDB4MjQ3OCwgMHgwMjA4LCAweDI0NzksIDB4MDIwOSwgMHgyNDdBLCAweDAyMEEsCi0gICAgMHgyNDdCLCAweDAyMEIsIDB4MjQ3QywgMHgwMjBDLCAweDI0N0QsIDB4MDIwRCwgMHgyNTAwLCAweDAxMzcsCi0gICAgMHgyNTAyLCAweDAxMzgsIDB4MjUwQywgMHgwMTNBLCAweDI1MTAsIDB4MDEzQiwgMHgyNTE0LCAweDAxM0MsCi0gICAgMHgyNTE4LCAweDAxM0QsIDB4MjUxQywgMHgwMTM1LCAweDI1MjQsIDB4MDEzNCwgMHgyNTJDLCAweDAxMzMsCi0gICAgMHgyNTM0LCAweDAxMzIsIDB4MjUzQywgMHgwMTMxLCAweDI1NTAsIDB4MDE0MiwgMHgyNTUxLCAweDM3MEEsCi0gICAgMHgyNTUyLCAweDM2RjgsIDB4MjU1MywgMHgzNzAxLCAweDI1NTQsIDB4MzZFRiwgMHgyNTU1LCAweDM2RkEsCi0gICAgMHgyNTU2LCAweDM3MDMsIDB4MjU1NywgMHgzNkYxLCAweDI1NTgsIDB4MzZGRSwgMHgyNTU5LCAweDM3MDcsCi0gICAgMHgyNTVBLCAweDM2RjUsIDB4MjU1QiwgMHgzNzAwLCAweDI1NUMsIDB4MzcwOSwgMHgyNTVELCAweDM2RjcsCi0gICAgMHgyNTVFLCAweDAxNDMsIDB4MjU1RiwgMHgzNzA0LCAweDI1NjAsIDB4MzZGMiwgMHgyNTYxLCAweDAxNDUsCi0gICAgMHgyNTYyLCAweDM3MDYsIDB4MjU2MywgMHgzNkY0LCAweDI1NjQsIDB4MzZGOSwgMHgyNTY1LCAweDM3MDIsCi0gICAgMHgyNTY2LCAweDM2RjAsIDB4MjU2NywgMHgzNkZGLCAweDI1NjgsIDB4MzcwOCwgMHgyNTY5LCAweDM2RjYsCi0gICAgMHgyNTZBLCAweDAxNDQsIDB4MjU2QiwgMHgzNzA1LCAweDI1NkMsIDB4MzZGMywgMHgyNTZELCAweDAxM0UsCi0gICAgMHgyNTZFLCAweDAxM0YsIDB4MjU2RiwgMHgwMTQxLCAweDI1NzAsIDB4MDE0MCwgMHgyNTcxLCAweDAxNEEsCi0gICAgMHgyNTcyLCAweDAxNEIsIDB4MjU3MywgMHgwMTRDLCAweDI1NzQsIDB4MzVCMCwgMHgyNTgxLCAweDAxMjIsCi0gICAgMHgyNTgyLCAweDAxMjMsIDB4MjU4MywgMHgwMTI0LCAweDI1ODQsIDB4MDEyNSwgMHgyNTg1LCAweDAxMjYsCi0gICAgMHgyNTg2LCAweDAxMjcsIDB4MjU4NywgMHgwMTI4LCAweDI1ODgsIDB4MDEyOSwgMHgyNTg5LCAweDAxMzAsCi0gICAgMHgyNThBLCAweDAxMkYsIDB4MjU4QiwgMHgwMTJFLCAweDI1OEMsIDB4MDEyRCwgMHgyNThELCAweDAxMkMsCi0gICAgMHgyNThFLCAweDAxMkIsIDB4MjU4RiwgMHgwMTJBLCAweDI1OTMsIDB4MzcxMCwgMHgyNTk0LCAweDAxMzYsCi0gICAgMHgyNTk1LCAweDAxMzksIDB4MjVBMCwgMHgwMEJFLCAweDI1QTEsIDB4MDBCRCwgMHgyNUIyLCAweDAwQjcsCi0gICAgMHgyNUIzLCAweDAwQjYsIDB4MjVCQywgMHgwMEMwLCAweDI1QkQsIDB4MDBCRiwgMHgyNUM2LCAweDAwQkMsCi0gICAgMHgyNUM3LCAweDAwQkIsIDB4MjVDQiwgMHgwMEI0LCAweDI1Q0UsIDB4MDBCOCwgMHgyNUNGLCAweDAwQjUsCi0gICAgMHgyNUUyLCAweDAxNDYsIDB4MjVFMywgMHgwMTQ3LCAweDI1RTQsIDB4MDE0OSwgMHgyNUU1LCAweDAxNDgsCi0gICAgMHgyNjA1LCAweDAwQkEsIDB4MjYwNiwgMHgwMEI5LCAweDI2MDksIDB4MDBGNCwgMHgyNjQwLCAweDAwRjEsCi0gICAgMHgyNjQxLCAweDAwRjMsIDB4MjY0MiwgMHgwMEYyLCAweDI3M0QsIDB4MzVDMCwgMHgyRjAwLCAweDAyNTMsCi0gICAgMHgyRjAxLCAweDAyMTgsIDB4MkYwMiwgMHgwMjE5LCAweDJGMDMsIDB4MDIxQSwgMHgyRjA0LCAweDAyNTQsCi0gICAgMHgyRjA1LCAweDAyMUIsIDB4MkYwNiwgMHgwMjVBLCAweDJGMDcsIDB4MDIxQywgMHgyRjA4LCAweDAyNUIsCi0gICAgMHgyRjA5LCAweDAyNUMsIDB4MkYwQSwgMHgwMjVELCAweDJGMEIsIDB4MDI1RSwgMHgyRjBDLCAweDAyMUQsCi0gICAgMHgyRjBELCAweDAyMUUsIDB4MkYwRSwgMHgwMjFGLCAweDJGMEYsIDB4MDI1RiwgMHgyRjEwLCAweDE3NkUsCi0gICAgMHgyRjExLCAweDAyNjAsIDB4MkYxMiwgMHgwMjYyLCAweDJGMTMsIDB4MDIyMCwgMHgyRjE0LCAweDAyNjMsCi0gICAgMHgyRjE1LCAweDE3NkYsIDB4MkYxNiwgMHgwMjIxLCAweDJGMTcsIDB4MDI2NCwgMHgyRjE4LCAweDAyNjUsCi0gICAgMHgyRjE5LCAweDAyMjIsIDB4MkYxQSwgMHgxNzcwLCAweDJGMUIsIDB4MDIyMywgMHgyRjFDLCAweDAyNjYsCi0gICAgMHgyRjFELCAweDAyNzksIDB4MkYxRSwgMHgxNzc1LCAweDJGMUYsIDB4MDI3QSwgMHgyRjIwLCAweDAyN0IsCi0gICAgMHgyRjIxLCAweDAyMjQsIDB4MkYyMiwgMHgwMjI0LCAweDJGMjMsIDB4MDI3QywgMHgyRjI0LCAweDAyN0QsCi0gICAgMHgyRjI1LCAweDAyN0UsIDB4MkYyNiwgMHgwMjdGLCAweDJGMjcsIDB4MDIyNSwgMHgyRjI4LCAweDAyODIsCi0gICAgMHgyRjI5LCAweDAyODMsIDB4MkYyQSwgMHgwMjg0LCAweDJGMkIsIDB4MDI4NSwgMHgyRjJDLCAweDE3NzYsCi0gICAgMHgyRjJELCAweDAyODYsIDB4MkYyRSwgMHgwMjI2LCAweDJGMkYsIDB4MDI4OCwgMHgyRjMwLCAweDAyODksCi0gICAgMHgyRjMxLCAweDAyOEMsIDB4MkYzMiwgMHgwMjhELCAweDJGMzMsIDB4MDIyNywgMHgyRjM0LCAweDAyMjgsCi0gICAgMHgyRjM1LCAweDAyMjksIDB4MkYzNiwgMHgwMjhFLCAweDJGMzcsIDB4MDI4RiwgMHgyRjM4LCAweDAyOTAsCi0gICAgMHgyRjM5LCAweDAyMkEsIDB4MkYzQSwgMHgwMjJCLCAweDJGM0IsIDB4MTc3NywgMHgyRjNDLCAweDAyRDAsCi0gICAgMHgyRjNELCAweDAyRDEsIDB4MkYzRSwgMHgwMkQyLCAweDJGM0YsIDB4MDJEMywgMHgyRjQwLCAweDAyRDUsCi0gICAgMHgyRjQxLCAweDAyMkMsIDB4MkY0MiwgMHgwMkQ2LCAweDJGNDMsIDB4MDJENywgMHgyRjQ0LCAweDAyRDgsCi0gICAgMHgyRjQ1LCAweDAyRDksIDB4MkY0NiwgMHgwMjJELCAweDJGNDcsIDB4MDJEQSwgMHgyRjQ4LCAweDAyREIsCi0gICAgMHgyRjQ5LCAweDAyREMsIDB4MkY0QSwgMHgwMkRELCAweDJGNEIsIDB4MDJERSwgMHgyRjRDLCAweDAyREYsCi0gICAgMHgyRjRELCAweDAyRTAsIDB4MkY0RSwgMHgxNzhBLCAweDJGNEYsIDB4MDJFMSwgMHgyRjUwLCAweDAyRTIsCi0gICAgMHgyRjUxLCAweDAyRTMsIDB4MkY1MiwgMHgwMkU0LCAweDJGNTMsIDB4MTc4QywgMHgyRjU0LCAweDAyRTUsCi0gICAgMHgyRjU1LCAweDAyRTYsIDB4MkY1NiwgMHgwMkU3LCAweDJGNTcsIDB4MDJFOCwgMHgyRjU4LCAweDAyRTksCi0gICAgMHgyRjU5LCAweDE3OEQsIDB4MkY1QSwgMHgwMkVBLCAweDJGNUIsIDB4MDJFQiwgMHgyRjVDLCAweDAyRUMsCi0gICAgMHgyRjVELCAweDAyRUQsIDB4MkY1RSwgMHgwMzU2LCAweDJGNUYsIDB4MDM1NywgMHgyRjYwLCAweDAzNTgsCi0gICAgMHgyRjYxLCAweDAzNTksIDB4MkY2MiwgMHgwMzVBLCAweDJGNjMsIDB4MDM1QiwgMHgyRjY0LCAweDAzNUMsCi0gICAgMHgyRjY1LCAweDAzNUUsIDB4MkY2NiwgMHgwMzYyLCAweDJGNjcsIDB4MDIyRSwgMHgyRjY4LCAweDAyMkYsCi0gICAgMHgyRjY5LCAweDAzNjMsIDB4MkY2QSwgMHgwMzY0LCAweDJGNkIsIDB4MDM2NSwgMHgyRjZDLCAweDAzNjYsCi0gICAgMHgyRjZELCAweDAzNjcsIDB4MkY2RSwgMHgwMzY4LCAweDJGNkYsIDB4MDM2OSwgMHgyRjcwLCAweDAzNkEsCi0gICAgMHgyRjcxLCAweDE3QjIsIDB4MkY3MiwgMHgwMzZCLCAweDJGNzMsIDB4MDM2QywgMHgyRjc0LCAweDAzNkQsCi0gICAgMHgyRjc1LCAweDAzRjYsIDB4MkY3NiwgMHgwM0Y3LCAweDJGNzcsIDB4MDNGOCwgMHgyRjc4LCAweDAzRjksCi0gICAgMHgyRjc5LCAweDE4MTIsIDB4MkY3QSwgMHgwM0ZBLCAweDJGN0IsIDB4MDNGQiwgMHgyRjdDLCAweDAzRkMsCi0gICAgMHgyRjdELCAweDAzRkUsIDB4MkY3RSwgMHgwM0ZGLCAweDJGN0YsIDB4MDQwMCwgMHgyRjgwLCAweDA0MDEsCi0gICAgMHgyRjgxLCAweDA0MDIsIDB4MkY4MiwgMHgwNDA1LCAweDJGODMsIDB4MDQwNiwgMHgyRjg0LCAweDA0MDcsCi0gICAgMHgyRjg1LCAweDA0MDgsIDB4MkY4NiwgMHgwNDA5LCAweDJGODcsIDB4MDQwQSwgMHgyRjg4LCAweDA0MEIsCi0gICAgMHgyRjg5LCAweDA0MEMsIDB4MkY4QSwgMHgwNDBELCAweDJGOEIsIDB4MTgxMywgMHgyRjhDLCAweDE4MTgsCi0gICAgMHgyRjhELCAweDA0MEYsIDB4MkY4RSwgMHgwNDEwLCAweDJGOEYsIDB4MDQxMSwgMHgyRjkwLCAweDA0MTIsCi0gICAgMHgyRjkxLCAweDE4MTksIDB4MkY5MiwgMHgwNTA4LCAweDJGOTMsIDB4MDUwOSwgMHgyRjk0LCAweDA1MEEsCi0gICAgMHgyRjk1LCAweDA1MEIsIDB4MkY5NiwgMHgwNTBDLCAweDJGOTcsIDB4MDUwRCwgMHgyRjk4LCAweDE4RTcsCi0gICAgMHgyRjk5LCAweDA1MEUsIDB4MkY5QSwgMHgwNTBGLCAweDJGOUIsIDB4MDUxMCwgMHgyRjlDLCAweDA1MTEsCi0gICAgMHgyRjlELCAweDA1MTIsIDB4MkY5RSwgMHgwNTEzLCAweDJGOUYsIDB4MDUxNCwgMHgyRkEwLCAweDA1MTUsCi0gICAgMHgyRkExLCAweDAyMzAsIDB4MkZBMiwgMHgwNTFCLCAweDJGQTMsIDB4MDUyMCwgMHgyRkE0LCAweDA1MjEsCi0gICAgMHgyRkE1LCAweDA1MjIsIDB4MkZBNiwgMHgwNjk2LCAweDJGQTcsIDB4MDY5NywgMHgyRkE4LCAweDA2OTgsCi0gICAgMHgyRkE5LCAweDA2OTksIDB4MkZBQSwgMHgwMjMxLCAweDJGQUIsIDB4MDY5RiwgMHgyRkFDLCAweDA2QTAsCi0gICAgMHgyRkFFLCAweDA2QTIsIDB4MkZBRiwgMHgwODI2LCAweDJGQjAsIDB4MDgyNywgMHgyRkIxLCAweDA4MjgsCi0gICAgMHgyRkIyLCAweDA4MjksIDB4MkZCMywgMHgwODJBLCAweDJGQjQsIDB4MDgyQiwgMHgyRkI1LCAweDA4MkMsCi0gICAgMHgyRkI2LCAweDA4MkQsIDB4MkZCNywgMHgwODJFLCAweDJGQjgsIDB4MDgyRiwgMHgyRkI5LCAweDA4MzAsCi0gICAgMHgyRkJBLCAweDA5RjUsIDB4MkZCQiwgMHgwOUY2LCAweDJGQkMsIDB4MDlGNywgMHgyRkJELCAweDFFMzMsCi0gICAgMHgyRkJFLCAweDA5RjgsIDB4MkZCRiwgMHgxRTM0LCAweDJGQzAsIDB4MDlGOSwgMHgyRkMxLCAweDA5RkEsCi0gICAgMHgyRkMyLCAweDBCRTEsIDB4MkZDMywgMHgwQkUyLCAweDJGQzQsIDB4MEJFMywgMHgyRkM1LCAweDBCRTQsCi0gICAgMHgyRkM2LCAweDBCRTUsIDB4MkZDNywgMHgwQkU2LCAweDJGQzgsIDB4MERCQiwgMHgyRkM5LCAweDBEQkMsCi0gICAgMHgyRkNBLCAweDBEQkQsIDB4MkZDQiwgMHgyMzYwLCAweDJGQ0MsIDB4MjYxMiwgMHgyRkNELCAweDBGN0IsCi0gICAgMHgyRkNFLCAweDBGN0MsIDB4MkZDRiwgMHgwRjdELCAweDJGRDAsIDB4MTEwMCwgMHgyRkQxLCAweDExMDEsCi0gICAgMHgyRkQyLCAweDEyODksIDB4MkZEMywgMHgxM0IyLCAweDJGRDQsIDB4MTNCMywgMHgyRkQ1LCAweDJGMEQsCi0gICAgMHgzMDAwLCAweDAwNjMsIDB4MzAwMSwgMHgwMDY1LCAweDMwMDIsIDB4MDA2NiwgMHgzMDAzLCAweDAwQjMsCi0gICAgMHgzMDA1LCAweDM1QkEsIDB4MzAwNiwgMHgzNUJCLCAweDMwMDcsIDB4MzVCQywgMHgzMDA4LCAweDAwOTQsCi0gICAgMHgzMDA5LCAweDAwOTUsIDB4MzAwQSwgMHgwMDkwLCAweDMwMEIsIDB4MDA5MSwgMHgzMDBDLCAweDAwOTgsCi0gICAgMHgzMDBELCAweDAwOTksIDB4MzAwRSwgMHgwMDlDLCAweDMwMEYsIDB4MDA5RCwgMHgzMDEwLCAweDAwOEMsCi0gICAgMHgzMDExLCAweDAwOEQsIDB4MzAxMiwgMHgwMTA1LCAweDMwMTQsIDB4MDA4OCwgMHgzMDE1LCAweDAwODksCi0gICAgMHgzMDFELCAweDAwQUEsIDB4MzAxRSwgMHgwMEFCLCAweDMwMjEsIDB4MDE2MSwgMHgzMDIyLCAweDAxNjIsCi0gICAgMHgzMDIzLCAweDAxNjMsIDB4MzAyNCwgMHgwMTY0LCAweDMwMjUsIDB4MDE2NSwgMHgzMDI2LCAweDAxNjYsCi0gICAgMHgzMDI3LCAweDAxNjcsIDB4MzAyOCwgMHgwMTY4LCAweDMwMjksIDB4MDE2OSwgMHgzMDM4LCAweDAxNkEsCi0gICAgMHgzMDM5LCAweDAxNkIsIDB4MzAzQSwgMHgwMTZDLCAweDMwNDEsIDB4MzVDMSwgMHgzMDQyLCAweDM1QzIsCi0gICAgMHgzMDQzLCAweDM1QzMsIDB4MzA0NCwgMHgzNUM0LCAweDMwNDUsIDB4MzVDNSwgMHgzMDQ2LCAweDM1QzYsCi0gICAgMHgzMDQ3LCAweDM1QzcsIDB4MzA0OCwgMHgzNUM4LCAweDMwNDksIDB4MzVDOSwgMHgzMDRBLCAweDM1Q0EsCi0gICAgMHgzMDRCLCAweDM1Q0IsIDB4MzA0QywgMHgzNUNDLCAweDMwNEQsIDB4MzVDRCwgMHgzMDRFLCAweDM1Q0UsCi0gICAgMHgzMDRGLCAweDM1Q0YsIDB4MzA1MCwgMHgzNUQwLCAweDMwNTEsIDB4MzVEMSwgMHgzMDUyLCAweDM1RDIsCi0gICAgMHgzMDUzLCAweDM1RDMsIDB4MzA1NCwgMHgzNUQ0LCAweDMwNTUsIDB4MzVENSwgMHgzMDU2LCAweDM1RDYsCi0gICAgMHgzMDU3LCAweDM1RDcsIDB4MzA1OCwgMHgzNUQ4LCAweDMwNTksIDB4MzVEOSwgMHgzMDVBLCAweDM1REEsCi0gICAgMHgzMDVCLCAweDM1REIsIDB4MzA1QywgMHgzNURDLCAweDMwNUQsIDB4MzVERCwgMHgzMDVFLCAweDM1REUsCi0gICAgMHgzMDVGLCAweDM1REYsIDB4MzA2MCwgMHgzNUUwLCAweDMwNjEsIDB4MzVFMSwgMHgzMDYyLCAweDM1RTIsCi0gICAgMHgzMDYzLCAweDM1RTMsIDB4MzA2NCwgMHgzNUU0LCAweDMwNjUsIDB4MzVFNSwgMHgzMDY2LCAweDM1RTYsCi0gICAgMHgzMDY3LCAweDM1RTcsIDB4MzA2OCwgMHgzNUU4LCAweDMwNjksIDB4MzVFOSwgMHgzMDZBLCAweDM1RUEsCi0gICAgMHgzMDZCLCAweDM1RUIsIDB4MzA2QywgMHgzNUVDLCAweDMwNkQsIDB4MzVFRCwgMHgzMDZFLCAweDM1RUUsCi0gICAgMHgzMDZGLCAweDM1RUYsIDB4MzA3MCwgMHgzNUYwLCAweDMwNzEsIDB4MzVGMSwgMHgzMDcyLCAweDM1RjIsCi0gICAgMHgzMDczLCAweDM1RjMsIDB4MzA3NCwgMHgzNUY0LCAweDMwNzUsIDB4MzVGNSwgMHgzMDc2LCAweDM1RjYsCi0gICAgMHgzMDc3LCAweDM1RjcsIDB4MzA3OCwgMHgzNUY4LCAweDMwNzksIDB4MzVGOSwgMHgzMDdBLCAweDM1RkEsCi0gICAgMHgzMDdCLCAweDM1RkIsIDB4MzA3QywgMHgzNUZDLCAweDMwN0QsIDB4MzVGRCwgMHgzMDdFLCAweDM1RkUsCi0gICAgMHgzMDdGLCAweDM1RkYsIDB4MzA4MCwgMHgzNjAwLCAweDMwODEsIDB4MzYwMSwgMHgzMDgyLCAweDM2MDIsCi0gICAgMHgzMDgzLCAweDM2MDMsIDB4MzA4NCwgMHgzNjA0LCAweDMwODUsIDB4MzYwNSwgMHgzMDg2LCAweDM2MDYsCi0gICAgMHgzMDg3LCAweDM2MDcsIDB4MzA4OCwgMHgzNjA4LCAweDMwODksIDB4MzYwOSwgMHgzMDhBLCAweDM2MEEsCi0gICAgMHgzMDhCLCAweDM2MEIsIDB4MzA4QywgMHgzNjBDLCAweDMwOEQsIDB4MzYwRCwgMHgzMDhFLCAweDM2MEUsCi0gICAgMHgzMDhGLCAweDM2MEYsIDB4MzA5MCwgMHgzNjEwLCAweDMwOTEsIDB4MzYxMSwgMHgzMDkyLCAweDM2MTIsCi0gICAgMHgzMDkzLCAweDM2MTMsIDB4MzA5RCwgMHgzNUI3LCAweDMwOUUsIDB4MzVCOCwgMHgzMEExLCAweDM2MTQsCi0gICAgMHgzMEEyLCAweDM2MTUsIDB4MzBBMywgMHgzNjE2LCAweDMwQTQsIDB4MzYxNywgMHgzMEE1LCAweDM2MTgsCi0gICAgMHgzMEE2LCAweDM2MTksIDB4MzBBNywgMHgzNjFBLCAweDMwQTgsIDB4MzYxQiwgMHgzMEE5LCAweDM2MUMsCi0gICAgMHgzMEFBLCAweDM2MUQsIDB4MzBBQiwgMHgzNjFFLCAweDMwQUMsIDB4MzYxRiwgMHgzMEFELCAweDM2MjAsCi0gICAgMHgzMEFFLCAweDM2MjEsIDB4MzBBRiwgMHgzNjIyLCAweDMwQjAsIDB4MzYyMywgMHgzMEIxLCAweDM2MjQsCi0gICAgMHgzMEIyLCAweDM2MjUsIDB4MzBCMywgMHgzNjI2LCAweDMwQjQsIDB4MzYyNywgMHgzMEI1LCAweDM2MjgsCi0gICAgMHgzMEI2LCAweDM2MjksIDB4MzBCNywgMHgzNjJBLCAweDMwQjgsIDB4MzYyQiwgMHgzMEI5LCAweDM2MkMsCi0gICAgMHgzMEJBLCAweDM2MkQsIDB4MzBCQiwgMHgzNjJFLCAweDMwQkMsIDB4MzYyRiwgMHgzMEJELCAweDM2MzAsCi0gICAgMHgzMEJFLCAweDM2MzEsIDB4MzBCRiwgMHgzNjMyLCAweDMwQzAsIDB4MzYzMywgMHgzMEMxLCAweDM2MzQsCi0gICAgMHgzMEMyLCAweDM2MzUsIDB4MzBDMywgMHgzNjM2LCAweDMwQzQsIDB4MzYzNywgMHgzMEM1LCAweDM2MzgsCi0gICAgMHgzMEM2LCAweDM2MzksIDB4MzBDNywgMHgzNjNBLCAweDMwQzgsIDB4MzYzQiwgMHgzMEM5LCAweDM2M0MsCi0gICAgMHgzMENBLCAweDM2M0QsIDB4MzBDQiwgMHgzNjNFLCAweDMwQ0MsIDB4MzYzRiwgMHgzMENELCAweDM2NDAsCi0gICAgMHgzMENFLCAweDM2NDEsIDB4MzBDRiwgMHgzNjQyLCAweDMwRDAsIDB4MzY0MywgMHgzMEQxLCAweDM2NDQsCi0gICAgMHgzMEQyLCAweDM2NDUsIDB4MzBEMywgMHgzNjQ2LCAweDMwRDQsIDB4MzY0NywgMHgzMEQ1LCAweDM2NDgsCi0gICAgMHgzMEQ2LCAweDM2NDksIDB4MzBENywgMHgzNjRBLCAweDMwRDgsIDB4MzY0QiwgMHgzMEQ5LCAweDM2NEMsCi0gICAgMHgzMERBLCAweDM2NEQsIDB4MzBEQiwgMHgzNjRFLCAweDMwREMsIDB4MzY0RiwgMHgzMERELCAweDM2NTAsCi0gICAgMHgzMERFLCAweDM2NTEsIDB4MzBERiwgMHgzNjUyLCAweDMwRTAsIDB4MzY1MywgMHgzMEUxLCAweDM2NTQsCi0gICAgMHgzMEUyLCAweDM2NTUsIDB4MzBFMywgMHgzNjU2LCAweDMwRTQsIDB4MzY1NywgMHgzMEU1LCAweDM2NTgsCi0gICAgMHgzMEU2LCAweDM2NTksIDB4MzBFNywgMHgzNjVBLCAweDMwRTgsIDB4MzY1QiwgMHgzMEU5LCAweDM2NUMsCi0gICAgMHgzMEVBLCAweDM2NUQsIDB4MzBFQiwgMHgzNjVFLCAweDMwRUMsIDB4MzY1RiwgMHgzMEVELCAweDM2NjAsCi0gICAgMHgzMEVFLCAweDM2NjEsIDB4MzBFRiwgMHgzNjYyLCAweDMwRjAsIDB4MzY2MywgMHgzMEYxLCAweDM2NjQsCi0gICAgMHgzMEYyLCAweDM2NjUsIDB4MzBGMywgMHgzNjY2LCAweDMwRjQsIDB4MzY2NywgMHgzMEY1LCAweDM2NjgsCi0gICAgMHgzMEY2LCAweDM2NjksIDB4MzBGQywgMHgzNUJELCAweDMwRkQsIDB4MzVCNSwgMHgzMEZFLCAweDM1QjYsCi0gICAgMHgzMTA1LCAweDAxRDEsIDB4MzEwNiwgMHgwMUQyLCAweDMxMDcsIDB4MDFEMywgMHgzMTA4LCAweDAxRDQsCi0gICAgMHgzMTA5LCAweDAxRDUsIDB4MzEwQSwgMHgwMUQ2LCAweDMxMEIsIDB4MDFENywgMHgzMTBDLCAweDAxRDgsCi0gICAgMHgzMTBELCAweDAxRDksIDB4MzEwRSwgMHgwMURBLCAweDMxMEYsIDB4MDFEQiwgMHgzMTEwLCAweDAxREMsCi0gICAgMHgzMTExLCAweDAxREQsIDB4MzExMiwgMHgwMURFLCAweDMxMTMsIDB4MDFERiwgMHgzMTE0LCAweDAxRTAsCi0gICAgMHgzMTE1LCAweDAxRTEsIDB4MzExNiwgMHgwMUUyLCAweDMxMTcsIDB4MDFFMywgMHgzMTE4LCAweDAxRTQsCi0gICAgMHgzMTE5LCAweDAxRTUsIDB4MzExQSwgMHgwMUU2LCAweDMxMUIsIDB4MDFFNywgMHgzMTFDLCAweDAxRTgsCi0gICAgMHgzMTFELCAweDAxRTksIDB4MzExRSwgMHgwMUVBLCAweDMxMUYsIDB4MDFFQiwgMHgzMTIwLCAweDAxRUMsCi0gICAgMHgzMTIxLCAweDAxRUQsIDB4MzEyMiwgMHgwMUVFLCAweDMxMjMsIDB4MDFFRiwgMHgzMTI0LCAweDAxRjAsCi0gICAgMHgzMTI1LCAweDAxRjEsIDB4MzEyNiwgMHgwMUYyLCAweDMxMjcsIDB4MDFGMywgMHgzMTI4LCAweDAxRjQsCi0gICAgMHgzMTI5LCAweDAxRjUsIDB4MzIzMSwgMHgzNkU1LCAweDMyQTMsIDB4MDBDMSwgMHgzMzhFLCAweDAxMTUsCi0gICAgMHgzMzhGLCAweDAxMTYsIDB4MzM5QywgMHgwMTEwLCAweDMzOUQsIDB4MDExMSwgMHgzMzlFLCAweDAxMTIsCi0gICAgMHgzM0ExLCAweDAxMTQsIDB4MzNDNCwgMHgwMTE3LCAweDMzQ0UsIDB4MDExMywgMHgzM0QxLCAweDAwRUMsCi0gICAgMHgzM0QyLCAweDAwRUIsIDB4MzNENSwgMHgwMTBGLCAweDM2MUQsIDB4MzZCNywgMHg0NDkxLCAweDM2QjQsCi0gICAgMHg0RTAwLCAweDAyNTMsIDB4NEUwMSwgMHgwMjU1LCAweDRFMDMsIDB4MDI1NiwgMHg0RTA3LCAweDE3NzEsCi0gICAgMHg0RTA4LCAweDAyNjksIDB4NEUwOSwgMHgwMjY3LCAweDRFMEEsIDB4MDI2QSwgMHg0RTBCLCAweDAyNjgsCi0gICAgMHg0RTBDLCAweDE3NzIsIDB4NEUwRCwgMHgwMjk0LCAweDRFMEUsIDB4MTc3QSwgMHg0RTBGLCAweDE3NzgsCi0gICAgMHg0RTEwLCAweDAyOTMsIDB4NEUxMSwgMHgwMjkyLCAweDRFMTQsIDB4MDJGMiwgMHg0RTE1LCAweDAyRjEsCi0gICAgMHg0RTE2LCAweDAyRjAsIDB4NEUxOCwgMHgwMkYzLCAweDRFMTksIDB4MDJFRiwgMHg0RTFFLCAweDAzNkUsCi0gICAgMHg0RTFGLCAweDAzNkYsIDB4NEUyNiwgMHgwNTI4LCAweDRFMjgsIDB4MDIxOCwgMHg0RTJCLCAweDAyNkIsCi0gICAgMHg0RTJELCAweDAyOTUsIDB4NEUyRSwgMHgxNzdCLCAweDRFMzAsIDB4MDI5NiwgMHg0RTMxLCAweDE3OEUsCi0gICAgMHg0RTMyLCAweDA0MTUsIDB4NEUzMywgMHgxOEY0LCAweDRFMzYsIDB4MDIxOSwgMHg0RTM4LCAweDAyNkMsCi0gICAgMHg0RTM5LCAweDAyOTcsIDB4NEUzQiwgMHgwMkY0LCAweDRFM0MsIDB4MTc4RiwgMHg0RTNGLCAweDAyMUEsCi0gICAgMHg0RTQxLCAweDM2QUYsIDB4NEU0MiwgMHgxNzZDLCAweDRFNDMsIDB4MDI1NywgMHg0RTQ1LCAweDAyNkUsCi0gICAgMHg0RTQ3LCAweDE3NzMsIDB4NEU0OCwgMHgwMjZGLCAweDRFNEIsIDB4MDI5OCwgMHg0RTRELCAweDAyRjUsCi0gICAgMHg0RTRFLCAweDAyRjcsIDB4NEU0RiwgMHgwMkY2LCAweDRFNTIsIDB4MDM3MCwgMHg0RTUzLCAweDAzNzEsCi0gICAgMHg0RTU2LCAweDA1MjksIDB4NEU1OCwgMHgwODMxLCAweDRFNTksIDB4MDI1NCwgMHg0RTVBLCAweDM2QjEsCi0gICAgMHg0RTVDLCAweDE3NkQsIDB4NEU1RCwgMHgwMjU4LCAweDRFNUUsIDB4MDI3MSwgMHg0RTVGLCAweDAyNzAsCi0gICAgMHg0RTY5LCAweDAzNzIsIDB4NEU3MywgMHgwNTJBLCAweDRFN0UsIDB4MDlGQiwgMHg0RTdGLCAweDFFMzUsCi0gICAgMHg0RTgyLCAweDBEQkUsIDB4NEU4MywgMHgyMzYxLCAweDRFODQsIDB4MjM2MiwgMHg0RTg1LCAweDAyMUIsCi0gICAgMHg0RTg2LCAweDAyNTksIDB4NEU4OCwgMHgwMjlBLCAweDRFOEIsIDB4MDUyQiwgMHg0RThDLCAweDAyNUEsCi0gICAgMHg0RThELCAweDE3NzQsIDB4NEU4RSwgMHgwMjcyLCAweDRFOTEsIDB4MDI5QiwgMHg0RTkyLCAweDAyOUQsCi0gICAgMHg0RTkzLCAweDE3N0MsIDB4NEU5NCwgMHgwMjlFLCAweDRFOTUsIDB4MDI5QywgMHg0RTk5LCAweDAzNzMsCi0gICAgMHg0RTlCLCAweDA1MkMsIDB4NEU5RSwgMHgwNTJELCAweDRFOUYsIDB4MDZBMywgMHg0RUEwLCAweDAyMUMsCi0gICAgMHg0RUExLCAweDAyNzMsIDB4NEVBMiwgMHgwMjlGLCAweDRFQTQsIDB4MDM3NCwgMHg0RUE1LCAweDAzNzYsCi0gICAgMHg0RUE2LCAweDAzNzUsIDB4NEVBOCwgMHgwNDE2LCAweDRFQUIsIDB4MDUyRSwgMHg0RUFDLCAweDA1MkYsCi0gICAgMHg0RUFELCAweDA2QTQsIDB4NEVBRSwgMHgwNkE1LCAweDRFQjMsIDB4MDgzMiwgMHg0RUI2LCAweDIzNjMsCi0gICAgMHg0RUI5LCAweDMzNzcsIDB4NEVCQSwgMHgwMjVCLCAweDRFQzAsIDB4MDJBMSwgMHg0RUMxLCAweDAyQTAsCi0gICAgMHg0RUMyLCAweDE3N0QsIDB4NEVDMywgMHgwMkEyLCAweDRFQzQsIDB4MDJBOCwgMHg0RUM2LCAweDAyQTMsCi0gICAgMHg0RUM3LCAweDAyQTQsIDB4NEVDOCwgMHgxNzdGLCAweDRFQzksIDB4MTc3RSwgMHg0RUNBLCAweDAyQTYsCi0gICAgMHg0RUNCLCAweDAyQTcsIDB4NEVDRCwgMHgwMkE1LCAweDRFRDQsIDB4MDJGQSwgMHg0RUQ1LCAweDAyRkIsCi0gICAgMHg0RUQ2LCAweDAyRkMsIDB4NEVENywgMHgwMkZELCAweDRFRDgsIDB4MDJGOSwgMHg0RUQ5LCAweDAzMDAsCi0gICAgMHg0RURBLCAweDE3OTUsIDB4NEVEQywgMHgxNzkxLCAweDRFREQsIDB4MTc5NCwgMHg0RURFLCAweDAzMDEsCi0gICAgMHg0RURGLCAweDAzMTEsIDB4NEVFMSwgMHgxNzkzLCAweDRFRTMsIDB4MDJGRSwgMHg0RUU0LCAweDAyRkYsCi0gICAgMHg0RUU1LCAweDAyRjgsIDB4NEVFOCwgMHgxNzkwLCAweDRFRTksIDB4MTc5MiwgMHg0RUYwLCAweDAzODMsCi0gICAgMHg0RUYxLCAweDE3QkEsIDB4NEVGMiwgMHgwMzgwLCAweDRFRjMsIDB4MDM4NCwgMHg0RUY0LCAweDE3QzQsCi0gICAgMHg0RUY1LCAweDE3QjgsIDB4NEVGNiwgMHgwMzgxLCAweDRFRjcsIDB4MTdCQywgMHg0RUZCLCAweDAzODIsCi0gICAgMHg0RUZELCAweDAzODUsIDB4NEVGRiwgMHgwMzc3LCAweDRGMDAsIDB4MTdCQiwgMHg0RjAxLCAweDAzODYsCi0gICAgMHg0RjAyLCAweDE3QkYsIDB4NEYwNCwgMHgxN0MzLCAweDRGMDUsIDB4MTdDMCwgMHg0RjA4LCAweDE3QkQsCi0gICAgMHg0RjA5LCAweDAzNzgsIDB4NEYwQSwgMHgwMzdBLCAweDRGMEIsIDB4MDM4NywgMHg0RjBELCAweDAzN0MsCi0gICAgMHg0RjBFLCAweDE3QjUsIDB4NEYwRiwgMHgwMzdGLCAweDRGMTAsIDB4MDM3RCwgMHg0RjExLCAweDAzN0UsCi0gICAgMHg0RjEyLCAweDE3QzUsIDB4NEYxMywgMHgxN0MyLCAweDRGMTQsIDB4MTdCOSwgMHg0RjE1LCAweDAzN0IsCi0gICAgMHg0RjE4LCAweDE3QjYsIDB4NEYxOSwgMHgwMzc5LCAweDRGMUQsIDB4MTdCRSwgMHg0RjIyLCAweDE3QzEsCi0gICAgMHg0RjJDLCAweDE3QjcsIDB4NEYyRCwgMHgxODJGLCAweDRGMkYsIDB4MDQyQywgMHg0RjMwLCAweDA0MUYsCi0gICAgMHg0RjMzLCAweDE4MzAsIDB4NEYzNCwgMHgwNDFDLCAweDRGMzYsIDB4MDQyRSwgMHg0RjM4LCAweDA0MjQsCi0gICAgMHg0RjNBLCAweDA0MjMsIDB4NEYzQiwgMHgxODI0LCAweDRGM0MsIDB4MDQyNywgMHg0RjNELCAweDA0MjIsCi0gICAgMHg0RjNFLCAweDE4MjksIDB4NEYzRiwgMHgxODMxLCAweDRGNDEsIDB4MTgyRCwgMHg0RjQzLCAweDA0MjUsCi0gICAgMHg0RjQ2LCAweDA0MjgsIDB4NEY0NywgMHgwNDE5LCAweDRGNDgsIDB4MDQzMSwgMHg0RjQ5LCAweDE4MjYsCi0gICAgMHg0RjRDLCAweDE5MDAsIDB4NEY0RCwgMHgwNDE3LCAweDRGNEUsIDB4MDQyRCwgMHg0RjRGLCAweDA0MTgsCi0gICAgMHg0RjUwLCAweDA0MjAsIDB4NEY1MSwgMHgwNDIxLCAweDRGNTIsIDB4MTgyQiwgMHg0RjUzLCAweDE4MjcsCi0gICAgMHg0RjU0LCAweDA0MjYsIDB4NEY1NSwgMHgwNDFFLCAweDRGNTYsIDB4MTgyMywgMHg0RjU3LCAweDA0MUEsCi0gICAgMHg0RjU4LCAweDE4MkUsIDB4NEY1OSwgMHgwNDJGLCAweDRGNUEsIDB4MDQzMiwgMHg0RjVCLCAweDA0MUQsCi0gICAgMHg0RjVDLCAweDA0MkEsIDB4NEY1RCwgMHgwNDMwLCAweDRGNUUsIDB4MDQxQiwgMHg0RjVGLCAweDE4MkMsCi0gICAgMHg0RjYwLCAweDA0MkIsIDB4NEY2MSwgMHgxODMyLCAweDRGNjIsIDB4MTgyNSwgMHg0RjYzLCAweDA0MjksCi0gICAgMHg0RjY0LCAweDE4MjgsIDB4NEY2NywgMHgxODJBLCAweDRGNjksIDB4MDUzRCwgMHg0RjZBLCAweDE5MDIsCi0gICAgMHg0RjZCLCAweDE5MEUsIDB4NEY2QywgMHgwNTM1LCAweDRGNkUsIDB4MTkwRiwgMHg0RjZGLCAweDA1MzAsCi0gICAgMHg0RjcwLCAweDA1M0EsIDB4NEY3MywgMHgwNTMzLCAweDRGNzQsIDB4MThGQywgMHg0Rjc1LCAweDA1M0IsCi0gICAgMHg0Rjc2LCAweDE4RkIsIDB4NEY3NywgMHgxOEZGLCAweDRGNzgsIDB4MTkwNiwgMHg0Rjc5LCAweDE5MDQsCi0gICAgMHg0RjdBLCAweDA1NDMsIDB4NEY3QiwgMHgwNTNFLCAweDRGN0MsIDB4MThGNiwgMHg0RjdELCAweDE4RjgsCi0gICAgMHg0RjdFLCAweDA1NDAsIDB4NEY3RiwgMHgwNTM0LCAweDRGODAsIDB4MThGOSwgMHg0RjgxLCAweDE5MDUsCi0gICAgMHg0RjgyLCAweDE5MEMsIDB4NEY4MywgMHgwNTM5LCAweDRGODQsIDB4MThGRSwgMHg0Rjg1LCAweDE4RjcsCi0gICAgMHg0Rjg2LCAweDA1MzgsIDB4NEY4NywgMHgxOEZBLCAweDRGODgsIDB4MDUzQywgMHg0Rjg5LCAweDE4RkQsCi0gICAgMHg0RjhCLCAweDA1MzcsIDB4NEY4RCwgMHgwNTMyLCAweDRGOEYsIDB4MDU0MSwgMHg0RjkwLCAweDE5MDcsCi0gICAgMHg0RjkxLCAweDA1NDIsIDB4NEY5MiwgMHgxOTBCLCAweDRGOTQsIDB4MTkwOSwgMHg0Rjk1LCAweDE5MEQsCi0gICAgMHg0Rjk2LCAweDA1M0YsIDB4NEY5NywgMHgxOTAxLCAweDRGOTgsIDB4MThGNSwgMHg0RjlBLCAweDE5MDMsCi0gICAgMHg0RjlCLCAweDA1MzYsIDB4NEY5QywgMHgxOTA4LCAweDRGOUQsIDB4MDUzMSwgMHg0RjlFLCAweDE5MEEsCi0gICAgMHg0RkFFLCAweDA2QjQsIDB4NEZBRiwgMHgwNkE4LCAweDRGQjIsIDB4MUE1RCwgMHg0RkIzLCAweDFBNjUsCi0gICAgMHg0RkI1LCAweDA2QTcsIDB4NEZCNiwgMHgwNkFGLCAweDRGQjcsIDB4MDZCQiwgMHg0RkI5LCAweDFBNkIsCi0gICAgMHg0RkJBLCAweDFBNjksIDB4NEZCQiwgMHgxQTY0LCAweDRGQkYsIDB4MDZBOSwgMHg0RkMwLCAweDFBNkEsCi0gICAgMHg0RkMxLCAweDFBNjAsIDB4NEZDMiwgMHgwNkI3LCAweDRGQzMsIDB4MDZBRSwgMHg0RkM0LCAweDA2QjYsCi0gICAgMHg0RkM1LCAweDFBNUIsIDB4NEZDNywgMHgxQTY3LCAweDRGQzksIDB4MUE1RSwgMHg0RkNBLCAweDA2QjIsCi0gICAgMHg0RkNCLCAweDFBNUYsIDB4NEZDRCwgMHgxQTVBLCAweDRGQ0UsIDB4MDZCOSwgMHg0RkNGLCAweDA2QUMsCi0gICAgMHg0RkQwLCAweDA2QjUsIDB4NEZEMSwgMHgwNkFCLCAweDRGRDMsIDB4MUE1QywgMHg0RkQ0LCAweDFBNjEsCi0gICAgMHg0RkQ2LCAweDFBNjgsIDB4NEZENywgMHgwNkIzLCAweDRGRDgsIDB4MDZCMCwgMHg0RkQ5LCAweDFBNjMsCi0gICAgMHg0RkRBLCAweDA2QjgsIDB4NEZEQiwgMHgxQTY2LCAweDRGREMsIDB4MUE2MiwgMHg0RkRELCAweDA2QUQsCi0gICAgMHg0RkRFLCAweDA2QkEsIDB4NEZERiwgMHgwNkIxLCAweDRGRTAsIDB4MDZBQSwgMHg0RkUxLCAweDA2QTYsCi0gICAgMHg0RkVDLCAweDFBNkMsIDB4NEZFRSwgMHgwODRDLCAweDRGRUYsIDB4MDgzNiwgMHg0RkYxLCAweDA4NDYsCi0gICAgMHg0RkYzLCAweDA4NEIsIDB4NEZGNCwgMHgxQzI0LCAweDRGRjUsIDB4MUMyMywgMHg0RkY2LCAweDFDMjgsCi0gICAgMHg0RkY3LCAweDFDMjksIDB4NEZGOCwgMHgwODM5LCAweDRGRkEsIDB4MDg0MiwgMHg0RkZFLCAweDA4NEYsCi0gICAgMHg1MDAwLCAweDA4NDMsIDB4NTAwNSwgMHgxQzFELCAweDUwMDYsIDB4MDgzQywgMHg1MDA3LCAweDFDMUUsCi0gICAgMHg1MDA5LCAweDA4NTEsIDB4NTAwQiwgMHgwODQ4LCAweDUwMEMsIDB4MDgzMywgMHg1MDBELCAweDA4MzQsCi0gICAgMHg1MDBFLCAweDFDMzEsIDB4NTAwRiwgMHgwQTBDLCAweDUwMTEsIDB4MDg0MSwgMHg1MDEyLCAweDA4NDAsCi0gICAgMHg1MDEzLCAweDFDMUYsIDB4NTAxNCwgMHgwODQ0LCAweDUwMTUsIDB4MUU0NSwgMHg1MDE2LCAweDA4M0IsCi0gICAgMHg1MDE3LCAweDFDMkEsIDB4NTAxOCwgMHgwODRBLCAweDUwMTksIDB4MDg0OSwgMHg1MDFBLCAweDA4M0YsCi0gICAgMHg1MDFCLCAweDFDMjIsIDB4NTAxQywgMHgxQzJCLCAweDUwMUUsIDB4MUMxQywgMHg1MDFGLCAweDA4M0UsCi0gICAgMHg1MDIwLCAweDFDMkMsIDB4NTAyMSwgMHgwODQ3LCAweDUwMjIsIDB4MUMyMCwgMHg1MDIzLCAweDA4MzUsCi0gICAgMHg1MDI1LCAweDA4MzgsIDB4NTAyNiwgMHgwODM3LCAweDUwMjcsIDB4MUMyRCwgMHg1MDI4LCAweDA4NDUsCi0gICAgMHg1MDI5LCAweDA4M0EsIDB4NTAyQSwgMHgwODRFLCAweDUwMkIsIDB4MDg1MCwgMHg1MDJDLCAweDFDMjcsCi0gICAgMHg1MDJELCAweDA4NEQsIDB4NTAyRiwgMHgxQzJGLCAweDUwMzAsIDB4MUMyMSwgMHg1MDMxLCAweDFDMzAsCi0gICAgMHg1MDMzLCAweDFDMjUsIDB4NTAzNSwgMHgxQzJFLCAweDUwMzcsIDB4MUMyNiwgMHg1MDNDLCAweDA4M0QsCi0gICAgMHg1MDQwLCAweDFFNEQsIDB4NTA0MSwgMHgxRTQxLCAweDUwNDMsIDB4MEEwMCwgMHg1MDQ1LCAweDFFNDYsCi0gICAgMHg1MDQ2LCAweDFFNEMsIDB4NTA0NywgMHgwOUZGLCAweDUwNDgsIDB4MUUzRiwgMHg1MDQ5LCAweDBBMDMsCi0gICAgMHg1MDRBLCAweDFFNDMsIDB4NTA0QiwgMHgxRTNDLCAweDUwNEMsIDB4MEEwMSwgMHg1MDRELCAweDFFNDAsCi0gICAgMHg1MDRFLCAweDBBMDYsIDB4NTA0RiwgMHgwQTBCLCAweDUwNTEsIDB4MUU1MSwgMHg1MDUzLCAweDFFM0IsCi0gICAgMHg1MDU1LCAweDBBMDcsIDB4NTA1NywgMHgxRTUwLCAweDUwNUEsIDB4MEEwMiwgMHg1MDVCLCAweDFFNDIsCi0gICAgMHg1MDVDLCAweDA5RkUsIDB4NTA1RCwgMHgxRTNELCAweDUwNUUsIDB4MUUzOSwgMHg1MDVGLCAweDFFNDcsCi0gICAgMHg1MDYwLCAweDFFM0EsIDB4NTA2MSwgMHgxRTM4LCAweDUwNjIsIDB4MUU0NCwgMHg1MDYzLCAweDFFNEEsCi0gICAgMHg1MDY0LCAweDFFNEIsIDB4NTA2NSwgMHgwQTA0LCAweDUwNjgsIDB4MjBCOCwgMHg1MDY5LCAweDFFNDgsCi0gICAgMHg1MDZBLCAweDFFMzcsIDB4NTA2QiwgMHgxRTQ5LCAweDUwNkQsIDB4MEEwRSwgMHg1MDZFLCAweDFFNEUsCi0gICAgMHg1MDZGLCAweDBBMEQsIDB4NTA3MCwgMHgxRTM2LCAweDUwNzIsIDB4MUUzRSwgMHg1MDczLCAweDFFNEYsCi0gICAgMHg1MDc0LCAweDBBMDksIDB4NTA3NSwgMHgwQTA4LCAweDUwNzYsIDB4MEEwNSwgMHg1MDc3LCAweDBBMEEsCi0gICAgMHg1MDdBLCAweDA5RkMsIDB4NTA3RCwgMHgwOUZELCAweDUwODAsIDB4MEJFQywgMHg1MDgyLCAweDIwQkIsCi0gICAgMHg1MDgzLCAweDIwQjQsIDB4NTA4NSwgMHgwQkU5LCAweDUwODcsIDB4MjBCQywgMHg1MDhCLCAweDIwQjIsCi0gICAgMHg1MDhDLCAweDIwQjUsIDB4NTA4RCwgMHgwQkU4LCAweDUwOEUsIDB4MjBCNiwgMHg1MDkxLCAweDBCRUIsCi0gICAgMHg1MDkyLCAweDIwQkEsIDB4NTA5NCwgMHgyMEIwLCAweDUwOTUsIDB4MjBBRiwgMHg1MDk2LCAweDBCRUQsCi0gICAgMHg1MDk4LCAweDBCRUUsIDB4NTA5OSwgMHgwQkVBLCAweDUwOUEsIDB4MEJFRiwgMHg1MDlCLCAweDIwQUUsCi0gICAgMHg1MDlDLCAweDIwQjksIDB4NTA5RCwgMHgyMEI3LCAweDUwOUUsIDB4MjBCMSwgMHg1MEEyLCAweDBCRTcsCi0gICAgMHg1MEEzLCAweDIwQjMsIDB4NTBBQywgMHgwREM1LCAweDUwQUQsIDB4MERCRiwgMHg1MEFFLCAweDIzNjcsCi0gICAgMHg1MEFGLCAweDBEQzgsIDB4NTBCMCwgMHgyMzZELCAweDUwQjEsIDB4MjM3MCwgMHg1MEIyLCAweDBEQzEsCi0gICAgMHg1MEIzLCAweDBEQzIsIDB4NTBCNCwgMHgyMzZBLCAweDUwQjUsIDB4MERDMCwgMHg1MEI2LCAweDIzNzMsCi0gICAgMHg1MEI3LCAweDBEQzYsIDB4NTBCOCwgMHgyMzc0LCAweDUwQkEsIDB4MjM2RiwgMHg1MEJCLCAweDBEQzcsCi0gICAgMHg1MEJELCAweDIzNjQsIDB4NTBCRSwgMHgwREM0LCAweDUwQkYsIDB4MjM2NSwgMHg1MEMxLCAweDIzNkUsCi0gICAgMHg1MEMyLCAweDIzNkMsIDB4NTBDNCwgMHgyMzY4LCAweDUwQzUsIDB4MERDMywgMHg1MEM2LCAweDIzNjYsCi0gICAgMHg1MEM3LCAweDBEQzksIDB4NTBDOCwgMHgyMzZCLCAweDUwQzksIDB4MjM3MiwgMHg1MENBLCAweDIzNjksCi0gICAgMHg1MENCLCAweDIzNzEsIDB4NTBDRSwgMHgwRjg4LCAweDUwQ0YsIDB4MEY4NSwgMHg1MEQxLCAweDBGODYsCi0gICAgMHg1MEQzLCAweDI2MUMsIDB4NTBENCwgMHgyNjE0LCAweDUwRDUsIDB4MEY4NCwgMHg1MEQ2LCAweDBGODEsCi0gICAgMHg1MEQ3LCAweDI2MTUsIDB4NTBEQSwgMHgwRjgzLCAweDUwREIsIDB4MjYxOCwgMHg1MERELCAweDI2MUEsCi0gICAgMHg1MEUwLCAweDI2MjEsIDB4NTBFMywgMHgyNjIwLCAweDUwRTQsIDB4MjYxQiwgMHg1MEU1LCAweDBGODAsCi0gICAgMHg1MEU2LCAweDI2MTMsIDB4NTBFNywgMHgwRjdFLCAweDUwRTgsIDB4MjYxNiwgMHg1MEU5LCAweDBGODksCi0gICAgMHg1MEVBLCAweDI2MTksIDB4NTBFQywgMHgyNjFELCAweDUwRUQsIDB4MEY4MiwgMHg1MEVFLCAweDBGN0YsCi0gICAgMHg1MEVGLCAweDI2MUYsIDB4NTBGMCwgMHgyNjFFLCAweDUwRjEsIDB4MEY4NywgMHg1MEYzLCAweDI2MTcsCi0gICAgMHg1MEY1LCAweDExMDUsIDB4NTBGNiwgMHgyODgzLCAweDUwRjgsIDB4Mjg4MCwgMHg1MEY5LCAweDExMDYsCi0gICAgMHg1MEZCLCAweDExMDQsIDB4NTBGRCwgMHgyODg3LCAweDUwRkUsIDB4Mjg4NCwgMHg1MEZGLCAweDI4N0QsCi0gICAgMHg1MTAwLCAweDExMDMsIDB4NTEwMiwgMHgxMTA3LCAweDUxMDMsIDB4Mjg3RSwgMHg1MTA0LCAweDExMDIsCi0gICAgMHg1MTA1LCAweDExMEEsIDB4NTEwNiwgMHgyODgxLCAweDUxMDcsIDB4Mjg4MiwgMHg1MTA4LCAweDExMDgsCi0gICAgMHg1MTA5LCAweDExMDksIDB4NTEwQSwgMHgyODg4LCAweDUxMEIsIDB4Mjg4NSwgMHg1MTBDLCAweDI4ODYsCi0gICAgMHg1MTEwLCAweDEyOEQsIDB4NTExMSwgMHgyQjA0LCAweDUxMTIsIDB4MTI4QSwgMHg1MTEzLCAweDJCMDEsCi0gICAgMHg1MTE0LCAweDEyOEMsIDB4NTExNSwgMHgxMjhFLCAweDUxMTcsIDB4MkIwMiwgMHg1MTE4LCAweDEyOEIsCi0gICAgMHg1MTFBLCAweDJCMDMsIDB4NTExQywgMHgyQjAwLCAweDUxMUYsIDB4MTNCNSwgMHg1MTIwLCAweDJEM0UsCi0gICAgMHg1MTIxLCAweDEzQjYsIDB4NTEyMiwgMHgyRDNDLCAweDUxMjQsIDB4MkQzRCwgMHg1MTI1LCAweDJEM0IsCi0gICAgMHg1MTI2LCAweDJEM0EsIDB4NTEyOSwgMHgyRDNGLCAweDUxMkEsIDB4MTNCNCwgMHg1MTJELCAweDJGMEYsCi0gICAgMHg1MTJFLCAweDJGMTAsIDB4NTEzMCwgMHgyODdGLCAweDUxMzEsIDB4MkYwRSwgMHg1MTMyLCAweDEzQjcsCi0gICAgMHg1MTMzLCAweDE1NzUsIDB4NTEzNCwgMHgzMDdBLCAweDUxMzUsIDB4MzA3QiwgMHg1MTM3LCAweDE2NjgsCi0gICAgMHg1MTM4LCAweDE2NjksIDB4NTEzOSwgMHgzMkM2LCAweDUxM0EsIDB4MzJDNSwgMHg1MTNCLCAweDE2QkMsCi0gICAgMHg1MTNDLCAweDE2QkIsIDB4NTEzRCwgMHgzNDBFLCAweDUxM0YsIDB4MDI1QywgMHg1MTQwLCAweDAyNzQsCi0gICAgMHg1MTQxLCAweDAyQUEsIDB4NTE0MywgMHgwMkE5LCAweDUxNDQsIDB4MDMwMywgMHg1MTQ1LCAweDAzMDIsCi0gICAgMHg1MTQ2LCAweDAzOEEsIDB4NTE0NywgMHgwMzg5LCAweDUxNDgsIDB4MDM4QiwgMHg1MTQ5LCAweDAzODgsCi0gICAgMHg1MTRCLCAweDA0MzQsIDB4NTE0QywgMHgwNDMzLCAweDUxNEQsIDB4MDQzNSwgMHg1MTUyLCAweDA1NDUsCi0gICAgMHg1MTU0LCAweDA1NDQsIDB4NTE1NSwgMHgwNTQ2LCAweDUxNTcsIDB4MDZCQywgMHg1MTU5LCAweDAxMTksCi0gICAgMHg1MTVBLCAweDFDMzIsIDB4NTE1QiwgMHgwMTFBLCAweDUxNUMsIDB4MEEwRiwgMHg1MTVELCAweDAxMUMsCi0gICAgMHg1MTVFLCAweDAxMUIsIDB4NTE1RiwgMHgyMEJELCAweDUxNjEsIDB4MDExRCwgMHg1MTYyLCAweDBGOEEsCi0gICAgMHg1MTYzLCAweDAxMUUsIDB4NTE2NSwgMHgwMjVELCAweDUxNjcsIDB4MDJBQiwgMHg1MTY4LCAweDAzOEMsCi0gICAgMHg1MTY5LCAweDA1NDcsIDB4NTE2QiwgMHgwMjVFLCAweDUxNkMsIDB4MDJBRSwgMHg1MTZELCAweDAyQUMsCi0gICAgMHg1MTZFLCAweDAyQUQsIDB4NTE3MSwgMHgwMzhELCAweDUxNzUsIDB4MDQzNiwgMHg1MTc2LCAweDA1NDksCi0gICAgMHg1MTc3LCAweDA1NDgsIDB4NTE3OCwgMHgwNTRBLCAweDUxN0MsIDB4MDg1MiwgMHg1MTgwLCAweDEyOEYsCi0gICAgMHg1MTgyLCAweDAyMUQsIDB4NTE4NywgMHgxNzc5LCAweDUxODgsIDB4MzZCNiwgMHg1MTg5LCAweDAzMDQsCi0gICAgMHg1MThBLCAweDAzMDUsIDB4NTE4RCwgMHgwMzhFLCAweDUxOEYsIDB4MTgzMywgMHg1MTkxLCAweDA2QkUsCi0gICAgMHg1MTkyLCAweDA2QkQsIDB4NTE5MywgMHgxQzM0LCAweDUxOTQsIDB4MUMzMywgMHg1MTk1LCAweDBBMTAsCi0gICAgMHg1MTk2LCAweDAyMUUsIDB4NTE5NywgMHgwMkFGLCAweDUxOTgsIDB4MTc4MCwgMHg1MTlFLCAweDE5MTAsCi0gICAgMHg1MUEwLCAweDA2QkYsIDB4NTFBMiwgMHgwODU1LCAweDUxQTQsIDB4MDg1MywgMHg1MUE1LCAweDA4NTQsCi0gICAgMHg1MUFBLCAweDEyOTAsIDB4NTFBQiwgMHgwMjFGLCAweDUxQUMsIDB4MDMwNiwgMHg1MUIwLCAweDAzOEYsCi0gICAgMHg1MUIxLCAweDE3QzYsIDB4NTFCNiwgMHgwNDM3LCAweDUxQjcsIDB4MDQzOCwgMHg1MUI5LCAweDE4MzQsCi0gICAgMHg1MUJDLCAweDE5MTEsIDB4NTFCRCwgMHgwNTRCLCAweDUxQkUsIDB4MTkxMiwgMHg1MUM0LCAweDFDMzYsCi0gICAgMHg1MUM1LCAweDFDMzcsIDB4NTFDNiwgMHgwODU4LCAweDUxQzgsIDB4MUMzOCwgMHg1MUNBLCAweDFDMzUsCi0gICAgMHg1MUNCLCAweDA4NTksIDB4NTFDQywgMHgwODU3LCAweDUxQ0QsIDB4MDg1NiwgMHg1MUNFLCAweDFDMzksCi0gICAgMHg1MUQwLCAweDFFNTIsIDB4NTFENCwgMHgyMEJFLCAweDUxRDcsIDB4MjM3NSwgMHg1MUQ4LCAweDI2MjIsCi0gICAgMHg1MURDLCAweDExMEIsIDB4NTFERCwgMHgxMjkxLCAweDUxREUsIDB4MkIwNSwgMHg1MUUwLCAweDAyNUYsCi0gICAgMHg1MUUxLCAweDAyNkQsIDB4NTFGMCwgMHgwQTExLCAweDUxRjEsIDB4MEJGMSwgMHg1MUYzLCAweDBGOEIsCi0gICAgMHg1MUY1LCAweDE3NkUsIDB4NTFGNiwgMHgwMkIwLCAweDUxRjgsIDB4MDMwOSwgMHg1MUY5LCAweDAzMDcsCi0gICAgMHg1MUZBLCAweDAzMDgsIDB4NTFGRCwgMHgwNTRDLCAweDUyMDAsIDB4MDI2MCwgMHg1MjAxLCAweDAyNjEsCi0gICAgMHg1MjAyLCAweDM2QjMsIDB4NTIwMywgMHgwMjc1LCAweDUyMDYsIDB4MDJCMSwgMHg1MjA3LCAweDAyQjIsCi0gICAgMHg1MjA4LCAweDAyQjMsIDB4NTIwOSwgMHgxNzk3LCAweDUyMEEsIDB4MDMwQSwgMHg1MjBDLCAweDE3OTYsCi0gICAgMHg1MjBFLCAweDAzOTMsIDB4NTIxMCwgMHgxN0M4LCAweDUyMTEsIDB4MDM5MSwgMHg1MjEyLCAweDAzOTIsCi0gICAgMHg1MjEzLCAweDE3QzcsIDB4NTIxNiwgMHgwMzk0LCAweDUyMTcsIDB4MDM5MCwgMHg1MjFDLCAweDE4MzUsCi0gICAgMHg1MjFELCAweDA2OEIsIDB4NTIxRSwgMHgxODM2LCAweDUyMjEsIDB4MTgzNywgMHg1MjI0LCAweDA0M0EsCi0gICAgMHg1MjI1LCAweDA0MzksIDB4NTIyOCwgMHgwNDNELCAweDUyMjksIDB4MDQzQiwgMHg1MjJBLCAweDA0M0MsCi0gICAgMHg1MjJFLCAweDA1NTIsIDB4NTIzMCwgMHgwNTUxLCAweDUyMzEsIDB4MTkxNywgMHg1MjMyLCAweDE5MTQsCi0gICAgMHg1MjMzLCAweDE5MTUsIDB4NTIzNSwgMHgxOTEzLCAweDUyMzYsIDB4MDU1MywgMHg1MjM3LCAweDA1NEYsCi0gICAgMHg1MjM4LCAweDA1NEUsIDB4NTIzQSwgMHgwNTUwLCAweDUyM0IsIDB4MDU0RCwgMHg1MjQxLCAweDA1NTQsCi0gICAgMHg1MjQzLCAweDA2QzEsIDB4NTI0NCwgMHgxQTZELCAweDUyNDYsIDB4MTkxNiwgMHg1MjQ3LCAweDA2QzYsCi0gICAgMHg1MjQ5LCAweDFBNkUsIDB4NTI0QSwgMHgwNkMyLCAweDUyNEIsIDB4MDZDNSwgMHg1MjRDLCAweDA2QzQsCi0gICAgMHg1MjRELCAweDA2QzMsIDB4NTI0RSwgMHgwNkMwLCAweDUyNTIsIDB4MUMzQywgMHg1MjU0LCAweDA4NUMsCi0gICAgMHg1MjU1LCAweDFDM0YsIDB4NTI1NiwgMHgwODVBLCAweDUyNUEsIDB4MUMzQiwgMHg1MjVCLCAweDA4NUQsCi0gICAgMHg1MjVDLCAweDA4NUIsIDB4NTI1RCwgMHgwODVFLCAweDUyNUUsIDB4MUMzRCwgMHg1MjVGLCAweDFDM0UsCi0gICAgMHg1MjYxLCAweDFDM0EsIDB4NTI2MiwgMHgxQzQwLCAweDUyNjksIDB4MEJGNSwgMHg1MjZBLCAweDBBMTIsCi0gICAgMHg1MjZCLCAweDFFNTMsIDB4NTI2QywgMHgxRTU1LCAweDUyNkQsIDB4MUU1NCwgMHg1MjZFLCAweDFFNTYsCi0gICAgMHg1MjZGLCAweDBBMTMsIDB4NTI3MiwgMHgwQkYyLCAweDUyNzQsIDB4MEJGMywgMHg1Mjc1LCAweDBCRjQsCi0gICAgMHg1Mjc3LCAweDBEQ0IsIDB4NTI3OCwgMHgyMzc3LCAweDUyN0EsIDB4MjM3NiwgMHg1MjdCLCAweDIzNzgsCi0gICAgMHg1MjdDLCAweDIzNzksIDB4NTI3RCwgMHgwRENDLCAweDUyN0YsIDB4MERDQSwgMHg1MjgwLCAweDI2MjMsCi0gICAgMHg1MjgxLCAweDI2MjQsIDB4NTI4MiwgMHgwRjhELCAweDUyODMsIDB4MEY4QywgMHg1Mjg0LCAweDI3NzYsCi0gICAgMHg1Mjg3LCAweDExMEMsIDB4NTI4OCwgMHgxMTBELCAweDUyODksIDB4MTEwRSwgMHg1MjhBLCAweDExMTAsCi0gICAgMHg1MjhCLCAweDI4ODksIDB4NTI4QywgMHgyODhBLCAweDUyOEQsIDB4MTEwRiwgMHg1MjkxLCAweDEyOTIsCi0gICAgMHg1MjkzLCAweDEyOTMsIDB4NTI5NiwgMHgzMDdDLCAweDUyOTcsIDB4MzJDOCwgMHg1Mjk4LCAweDMyQzcsCi0gICAgMHg1Mjk5LCAweDM0MEYsIDB4NTI5QiwgMHgwMjYyLCAweDUyOUYsIDB4MDMwQywgMHg1MkEwLCAweDAzMEIsCi0gICAgMHg1MkEzLCAweDAzOTUsIDB4NTJBNiwgMHgxN0M5LCAweDUyQTksIDB4MDQzRiwgMHg1MkFBLCAweDA0NDAsCi0gICAgMHg1MkFCLCAweDA0M0UsIDB4NTJBQywgMHgwNDQxLCAweDUyQUQsIDB4MTgzOCwgMHg1MkFFLCAweDE4MzksCi0gICAgMHg1MkJCLCAweDA1NTYsIDB4NTJCQywgMHgxOTE4LCAweDUyQkUsIDB4MDU1NSwgMHg1MkMwLCAweDFBNkYsCi0gICAgMHg1MkMxLCAweDA2Q0EsIDB4NTJDMiwgMHgxQTcwLCAweDUyQzMsIDB4MDZDOSwgMHg1MkM3LCAweDA2QzcsCi0gICAgMHg1MkM5LCAweDA2QzgsIDB4NTJDRCwgMHgxQzQxLCAweDUyRDIsIDB4MEExNCwgMHg1MkQzLCAweDFFNTgsCi0gICAgMHg1MkQ1LCAweDBBMTcsIDB4NTJENiwgMHgxRTU3LCAweDUyRDcsIDB4MEFDRiwgMHg1MkQ4LCAweDBBMTYsCi0gICAgMHg1MkQ5LCAweDBBMTUsIDB4NTJEQiwgMHgwQkY4LCAweDUyREQsIDB4MEJGNywgMHg1MkRFLCAweDBCRjYsCi0gICAgMHg1MkRGLCAweDBEQ0QsIDB4NTJFMiwgMHgwREQwLCAweDUyRTMsIDB4MEREMSwgMHg1MkU0LCAweDBEQ0YsCi0gICAgMHg1MkU2LCAweDBEQ0UsIDB4NTJFOSwgMHgyNjI1LCAweDUyRUIsIDB4MjYyNiwgMHg1MkVGLCAweDI4OEMsCi0gICAgMHg1MkYwLCAweDExMTEsIDB4NTJGMSwgMHgyODhCLCAweDUyRjMsIDB4MTI5NCwgMHg1MkY0LCAweDJENDAsCi0gICAgMHg1MkY1LCAweDEzQjgsIDB4NTJGNywgMHgzMDdELCAweDUyRjgsIDB4MTYwOSwgMHg1MkY5LCAweDAyMjAsCi0gICAgMHg1MkZBLCAweDAyNzYsIDB4NTJGQiwgMHgwMkI0LCAweDUyRkMsIDB4MTc4MSwgMHg1MkZFLCAweDAyQjUsCi0gICAgMHg1MkZGLCAweDAyQjYsIDB4NTMwNSwgMHgwMzBELCAweDUzMDYsIDB4MDMwRSwgMHg1MzA4LCAweDAzOTYsCi0gICAgMHg1MzA5LCAweDE4M0EsIDB4NTMwQSwgMHgxOTE5LCAweDUzMEIsIDB4MTkxQSwgMHg1MzBELCAweDA2Q0IsCi0gICAgMHg1MzBFLCAweDFDNDIsIDB4NTMwRiwgMHgwQTE5LCAweDUzMTAsIDB4MEExOCwgMHg1MzExLCAweDIwQzAsCi0gICAgMHg1MzEyLCAweDIwQkYsIDB4NTMxNSwgMHgwMjYzLCAweDUzMTYsIDB4MDJCNywgMHg1MzE3LCAweDAzMEYsCi0gICAgMHg1MzE5LCAweDBBMUEsIDB4NTMxQSwgMHgxNzZGLCAweDUzMUMsIDB4MTc5OCwgMHg1MzFELCAweDAzMTAsCi0gICAgMHg1MzFGLCAweDE3Q0IsIDB4NTMyMCwgMHgwMzk4LCAweDUzMjEsIDB4MDM5NywgMHg1MzIyLCAweDE3Q0EsCi0gICAgMHg1MzIzLCAweDA0NDIsIDB4NTMyQSwgMHgwODVGLCAweDUzMkQsIDB4MUU1OSwgMHg1MzJGLCAweDBERDIsCi0gICAgMHg1MzMwLCAweDI2MjcsIDB4NTMzMSwgMHgwRjhFLCAweDUzMzQsIDB4MkIwNiwgMHg1MzM3LCAweDMxQzcsCi0gICAgMHg1MzM4LCAweDAyMjEsIDB4NTMzOSwgMHgwMkI4LCAweDUzM0MsIDB4MTkxQiwgMHg1MzNELCAweDFBNzEsCi0gICAgMHg1MzNFLCAweDBBMUQsIDB4NTMzRiwgMHgwQTFCLCAweDUzNDAsIDB4MEExQywgMHg1MzQxLCAweDAyNjQsCi0gICAgMHg1MzQzLCAweDAyNzcsIDB4NTM0NCwgMHgwMTZCLCAweDUzNDUsIDB4MDJCQiwgMHg1MzQ3LCAweDAyQkEsCi0gICAgMHg1MzQ4LCAweDAyQjksIDB4NTM0OSwgMHgwMzEzLCAweDUzNEEsIDB4MDMxMiwgMHg1MzRDLCAweDE3OTksCi0gICAgMHg1MzRELCAweDE3Q0MsIDB4NTM1MSwgMHgwNTVBLCAweDUzNTIsIDB4MDU1NywgMHg1MzUzLCAweDA1NTksCi0gICAgMHg1MzU0LCAweDA1NTgsIDB4NTM1NywgMHgwNkNDLCAweDUzNUEsIDB4MEJGOSwgMHg1MzVDLCAweDAyNjUsCi0gICAgMHg1MzVFLCAweDAyQkMsIDB4NTM2MCwgMHgwMzE1LCAweDUzNjEsIDB4MDMxNCwgMHg1MzYzLCAweDE4M0IsCi0gICAgMHg1MzY2LCAweDA1NUIsIDB4NTM2OSwgMHgwMjIyLCAweDUzNkMsIDB4MTc4MiwgMHg1MzZFLCAweDAzMTcsCi0gICAgMHg1MzZGLCAweDAzMTYsIDB4NTM3MCwgMHgwMzk5LCAweDUzNzEsIDB4MDM5QSwgMHg1MzcyLCAweDE4M0MsCi0gICAgMHg1MzczLCAweDA0NDMsIDB4NTM3NSwgMHgwNDQ0LCAweDUzNzcsIDB4MDU1QywgMHg1Mzc4LCAweDA1NUQsCi0gICAgMHg1Mzc5LCAweDA1NUUsIDB4NTM3QiwgMHgwNkNELCAweDUzN0MsIDB4MUE3MiwgMHg1MzdGLCAweDA4NjAsCi0gICAgMHg1MzgyLCAweDE3NzAsIDB4NTM4NCwgMHgwMkJELCAweDUzOEEsIDB4MTdDRCwgMHg1MzhFLCAweDE4M0QsCi0gICAgMHg1MzhGLCAweDE4M0UsIDB4NTM5MiwgMHgxOTFDLCAweDUzOTQsIDB4MTkxRCwgMHg1Mzk2LCAweDFBNzQsCi0gICAgMHg1Mzk3LCAweDFBNzMsIDB4NTM5OCwgMHgxQTc2LCAweDUzOTksIDB4MUE3NSwgMHg1MzlBLCAweDA2Q0UsCi0gICAgMHg1MzlDLCAweDFFNUEsIDB4NTM5RCwgMHgwODYyLCAweDUzOUUsIDB4MUM0MywgMHg1MzlGLCAweDA4NjEsCi0gICAgMHg1M0E0LCAweDIwQzEsIDB4NTNBNSwgMHgwQkZBLCAweDUzQTcsIDB4MjBDMiwgMHg1M0FDLCAweDI2MjgsCi0gICAgMHg1M0FELCAweDBGOEYsIDB4NTNCMiwgMHgxMTEyLCAweDUzQjQsIDB4MzA3RSwgMHg1M0I2LCAweDAyMjMsCi0gICAgMHg1M0I5LCAweDE3ODMsIDB4NTNCQiwgMHgwMzE4LCAweDUzQzMsIDB4MEExRSwgMHg1M0M4LCAweDAyNjYsCi0gICAgMHg1M0M5LCAweDAyNzgsIDB4NTNDQSwgMHgwMkJGLCAweDUzQ0IsIDB4MDJCRSwgMHg1M0NELCAweDAyQzAsCi0gICAgMHg1M0Q0LCAweDA1NjAsIDB4NTNENiwgMHgwNTVGLCAweDUzRDcsIDB4MDU2MSwgMHg1M0RCLCAweDA2Q0YsCi0gICAgMHg1M0RGLCAweDA4NjMsIDB4NTNFMSwgMHgyQjA3LCAweDUzRTIsIDB4MTRDOSwgMHg1M0UzLCAweDAyNzksCi0gICAgMHg1M0U0LCAweDAzMUEsIDB4NTNFNSwgMHgwMzI5LCAweDUzRTYsIDB4MDMyNCwgMHg1M0U4LCAweDAzMUYsCi0gICAgMHg1M0U5LCAweDAzMUUsIDB4NTNFQSwgMHgwMzI1LCAweDUzRUIsIDB4MDMyMywgMHg1M0VDLCAweDAzMUMsCi0gICAgMHg1M0VELCAweDAzMkEsIDB4NTNFRSwgMHgwMzFELCAweDUzRUYsIDB4MDMxOSwgMHg1M0YwLCAweDAzMjgsCi0gICAgMHg1M0YxLCAweDAzMjcsIDB4NTNGMiwgMHgwMzI2LCAweDUzRjMsIDB4MDMxQiwgMHg1M0Y1LCAweDAzMjIsCi0gICAgMHg1M0Y4LCAweDAzMjEsIDB4NTNGQiwgMHgwMzJCLCAweDUzRkMsIDB4MDMyMCwgMHg1NDAxLCAweDAzQTAsCi0gICAgMHg1NDAzLCAweDAzQTYsIDB4NTQwNCwgMHgwM0EyLCAweDU0MDYsIDB4MDNBOCwgMHg1NDA3LCAweDE3Q0UsCi0gICAgMHg1NDA4LCAweDAzQTUsIDB4NTQwOSwgMHgwMzlCLCAweDU0MEEsIDB4MDM5RSwgMHg1NDBCLCAweDAzQTEsCi0gICAgMHg1NDBDLCAweDAzOUQsIDB4NTQwRCwgMHgwM0E0LCAweDU0MEUsIDB4MDNBNywgMHg1NDBGLCAweDAzOUMsCi0gICAgMHg1NDEwLCAweDAzOUYsIDB4NTQxMSwgMHgwM0EzLCAweDU0MTIsIDB4MDNBOSwgMHg1NDE4LCAweDE4NDcsCi0gICAgMHg1NDE5LCAweDE4NDQsIDB4NTQxQiwgMHgwNDUxLCAweDU0MUMsIDB4MTg0NSwgMHg1NDFELCAweDA0NDUsCi0gICAgMHg1NDFFLCAweDA0NDcsIDB4NTQxRiwgMHgwNDVGLCAweDU0MjAsIDB4MDQ1QSwgMHg1NDI0LCAweDE4NEMsCi0gICAgMHg1NDI1LCAweDE4NDYsIDB4NTQyNiwgMHgwNDQ5LCAweDU0MjcsIDB4MDQ0QiwgMHg1NDI4LCAweDE4NEIsCi0gICAgMHg1NDI5LCAweDA0NTIsIDB4NTQyQSwgMHgxODQxLCAweDU0MkIsIDB4MDQ1RSwgMHg1NDJDLCAweDA0NjAsCi0gICAgMHg1NDJELCAweDA0NDYsIDB4NTQyRSwgMHgwNDU3LCAweDU0MzAsIDB4MTgzRiwgMHg1NDMxLCAweDA0NUQsCi0gICAgMHg1NDMzLCAweDA0NEUsIDB4NTQzNSwgMHgwNDU4LCAweDU0MzYsIDB4MDQ1OSwgMHg1NDM3LCAweDE4NDAsCi0gICAgMHg1NDM4LCAweDA0NTYsIDB4NTQzOSwgMHgwNDU0LCAweDU0M0IsIDB4MDQ1NSwgMHg1NDNDLCAweDA0NUIsCi0gICAgMHg1NDNELCAweDE4NDgsIDB4NTQzRSwgMHgwNDQ4LCAweDU0NDAsIDB4MDQ1QywgMHg1NDQxLCAweDE4NEEsCi0gICAgMHg1NDQyLCAweDA0NTAsIDB4NTQ0MywgMHgwNDRELCAweDU0NDUsIDB4MTg0MywgMHg1NDQ2LCAweDA0NEMsCi0gICAgMHg1NDQ3LCAweDE4NEQsIDB4NTQ0OCwgMHgwNDRGLCAweDU0NEEsIDB4MDQ1MywgMHg1NDRFLCAweDA0NEEsCi0gICAgMHg1NDRGLCAweDE4NDksIDB4NTQ1NCwgMHgxODQyLCAweDU0NjAsIDB4MTkyRSwgMHg1NDYxLCAweDE5MkQsCi0gICAgMHg1NDYyLCAweDA1NzMsIDB4NTQ2MywgMHgxOTMwLCAweDU0NjQsIDB4MTkzMiwgMHg1NDY1LCAweDE5MjcsCi0gICAgMHg1NDY2LCAweDE5MkEsIDB4NTQ2NywgMHgxOTMxLCAweDU0NjgsIDB4MDU3NCwgMHg1NDZCLCAweDE5MjQsCi0gICAgMHg1NDZDLCAweDE5MjgsIDB4NTQ2RiwgMHgxOTJDLCAweDU0NzAsIDB4MUE4NSwgMHg1NDcxLCAweDA1NkYsCi0gICAgMHg1NDcyLCAweDFBODksIDB4NTQ3MywgMHgwNTYyLCAweDU0NzQsIDB4MTkyOSwgMHg1NDc1LCAweDA1NjMsCi0gICAgMHg1NDc2LCAweDA1NzAsIDB4NTQ3NywgMHgwNTY5LCAweDU0NzgsIDB4MDU2NSwgMHg1NDdBLCAweDE5MjUsCi0gICAgMHg1NDdCLCAweDA1NjgsIDB4NTQ3QywgMHgwNTZELCAweDU0N0QsIDB4MDU3NiwgMHg1NDdFLCAweDE5MjYsCi0gICAgMHg1NDdGLCAweDE5MUYsIDB4NTQ4MCwgMHgwNTY3LCAweDU0ODEsIDB4MTkyMCwgMHg1NDgyLCAweDE5MjIsCi0gICAgMHg1NDg0LCAweDA1NkEsIDB4NTQ4NiwgMHgwNTZDLCAweDU0ODcsIDB4MTkxRSwgMHg1NDg4LCAweDE5MjMsCi0gICAgMHg1NDhCLCAweDA1NzUsIDB4NTQ4QywgMHgwNTcxLCAweDU0OEQsIDB4MTkyQiwgMHg1NDhFLCAweDA1NzcsCi0gICAgMHg1NDkwLCAweDA1NkUsIDB4NTQ5MSwgMHgxOTIxLCAweDU0OTIsIDB4MDU2QiwgMHg1NDk1LCAweDA1NjYsCi0gICAgMHg1NDk2LCAweDA1NjQsIDB4NTQ5OCwgMHgxOTJGLCAweDU0OUEsIDB4MDU3MiwgMHg1NEEwLCAweDFBODQsCi0gICAgMHg1NEExLCAweDFBNzgsIDB4NTRBMiwgMHgxQTg3LCAweDU0QTUsIDB4MUE3QSwgMHg1NEE2LCAweDA2RDYsCi0gICAgMHg1NEE3LCAweDA2RTQsIDB4NTRBOCwgMHgwNkQyLCAweDU0QTksIDB4MDZFMywgMHg1NEFBLCAweDA2REIsCi0gICAgMHg1NEFCLCAweDA2RTAsIDB4NTRBQywgMHgwNkQwLCAweDU0QUQsIDB4MUE3OSwgMHg1NEFFLCAweDFBN0YsCi0gICAgMHg1NEFGLCAweDA2REYsIDB4NTRCMCwgMHgxQThCLCAweDU0QjEsIDB4MDZFMSwgMHg1NEIzLCAweDA2RDcsCi0gICAgMHg1NEI2LCAweDFBODEsIDB4NTRCNywgMHgxQTdFLCAweDU0QjgsIDB4MDZENSwgMHg1NEJBLCAweDFBNzcsCi0gICAgMHg1NEJCLCAweDA2RTIsIDB4NTRCQywgMHgxQTg2LCAweDU0QkQsIDB4MDZEQSwgMHg1NEJFLCAweDFBODgsCi0gICAgMHg1NEJGLCAweDA2RTUsIDB4NTRDMCwgMHgwNkQxLCAweDU0QzEsIDB4MDZEQywgMHg1NEMyLCAweDA2RDksCi0gICAgMHg1NEMzLCAweDFBN0MsIDB4NTRDNCwgMHgwNkRELCAweDU0QzUsIDB4MUE4MiwgMHg1NEM2LCAweDFBODMsCi0gICAgMHg1NEM3LCAweDA2RDgsIDB4NTRDOCwgMHgwNkRFLCAweDU0QzksIDB4MDZENCwgMHg1NENFLCAweDA2RDMsCi0gICAgMHg1NENGLCAweDFBN0IsIDB4NTRENiwgMHgxQTgwLCAweDU0REUsIDB4MUE4QSwgMHg1NEUwLCAweDFDNTcsCi0gICAgMHg1NEUxLCAweDA4NzAsIDB4NTRFMiwgMHgxQzQ1LCAweDU0RTQsIDB4MUM0QSwgMHg1NEU1LCAweDA4NjksCi0gICAgMHg1NEU2LCAweDA4NzQsIDB4NTRFNywgMHgxQzQ4LCAweDU0RTgsIDB4MDg2NCwgMHg1NEU5LCAweDA4NkUsCi0gICAgMHg1NEVBLCAweDA4NzMsIDB4NTRFQiwgMHgxQzRGLCAweDU0RUQsIDB4MDg2RiwgMHg1NEVFLCAweDA4NzIsCi0gICAgMHg1NEYxLCAweDFDNTIsIDB4NTRGMiwgMHgwODZBLCAweDU0RjMsIDB4MUM0OSwgMHg1NEY3LCAweDFDNTUsCi0gICAgMHg1NEY4LCAweDFDNTYsIDB4NTRGQSwgMHgwODZDLCAweDU0RkIsIDB4MUM1NCwgMHg1NEZDLCAweDA4NjgsCi0gICAgMHg1NEZELCAweDA4NzcsIDB4NTRGRiwgMHgxQzRDLCAweDU1MDEsIDB4MDg2NiwgMHg1NTAzLCAweDFDNTksCi0gICAgMHg1NTA0LCAweDFDNEQsIDB4NTUwNSwgMHgxQzUxLCAweDU1MDYsIDB4MDg2QiwgMHg1NTA3LCAweDA4NzYsCi0gICAgMHg1NTA4LCAweDFDNEUsIDB4NTUwOSwgMHgwODcxLCAweDU1MEEsIDB4MUM1MywgMHg1NTBCLCAweDFDNUEsCi0gICAgMHg1NTBDLCAweDFFNjksIDB4NTUwRSwgMHgxQzU4LCAweDU1MEYsIDB4MDg3OCwgMHg1NTEwLCAweDA4NjUsCi0gICAgMHg1NTExLCAweDFDNTAsIDB4NTUxMiwgMHgxQzQ3LCAweDU1MTQsIDB4MDg2RCwgMHg1NTE3LCAweDFDNDYsCi0gICAgMHg1NTFBLCAweDFDNEIsIDB4NTUyNiwgMHgxQzQ0LCAweDU1MjcsIDB4MDg3NSwgMHg1NTJBLCAweDFFNjEsCi0gICAgMHg1NTJDLCAweDBBMzEsIDB4NTUyRCwgMHgxRTZGLCAweDU1MkUsIDB4MEEyRiwgMHg1NTJGLCAweDBBMkMsCi0gICAgMHg1NTMwLCAweDFFNjYsIDB4NTUzMSwgMHgwQTI4LCAweDU1MzIsIDB4MUU2QSwgMHg1NTMzLCAweDBBMzMsCi0gICAgMHg1NTM0LCAweDFFNjAsIDB4NTUzNSwgMHgxRTY1LCAweDU1MzYsIDB4MUU2NCwgMHg1NTM3LCAweDA4NjcsCi0gICAgMHg1NTM4LCAweDBBMkUsIDB4NTUzOSwgMHgxRTZELCAweDU1M0IsIDB4MUU3MCwgMHg1NTNDLCAweDFFNUQsCi0gICAgMHg1NTNFLCAweDBDMEMsIDB4NTU0MCwgMHgxRTcxLCAweDU1NDEsIDB4MEEzNCwgMHg1NTQzLCAweDBBMjYsCi0gICAgMHg1NTQ0LCAweDBBMjMsIDB4NTU0NSwgMHgxRTY4LCAweDU1NDYsIDB4MEEyMCwgMHg1NTQ4LCAweDFFNkUsCi0gICAgMHg1NTRBLCAweDBBMjcsIDB4NTU0QiwgMHgxRTcyLCAweDU1NEQsIDB4MUU1RSwgMHg1NTRFLCAweDFFNkMsCi0gICAgMHg1NTRGLCAweDBBMkEsIDB4NTU1MCwgMHgxRTVGLCAweDU1NTEsIDB4MUU2MiwgMHg1NTUyLCAweDFFNjcsCi0gICAgMHg1NTU1LCAweDBBMkIsIDB4NTU1NiwgMHgwQTI5LCAweDU1NTcsIDB4MEEzNSwgMHg1NTVDLCAweDBBMzAsCi0gICAgMHg1NTVFLCAweDBBMjQsIDB4NTU1RiwgMHgwQUJDLCAweDU1NjEsIDB4MEEyNSwgMHg1NTYyLCAweDFFNjMsCi0gICAgMHg1NTYzLCAweDBBMzIsIDB4NTU2NCwgMHgwQTJELCAweDU1NjUsIDB4MUU2QiwgMHg1NTY2LCAweDBBMjIsCi0gICAgMHg1NTZBLCAweDBBMjEsIDB4NTU3NSwgMHgxRTVCLCAweDU1NzYsIDB4MUU1QywgMHg1NTc3LCAweDIwQzcsCi0gICAgMHg1NTdCLCAweDBCRkIsIDB4NTU3QywgMHgwQkZFLCAweDU1N0QsIDB4MjBEMiwgMHg1NTdFLCAweDBDMTIsCi0gICAgMHg1NTdGLCAweDIwRDUsIDB4NTU4MCwgMHgwQkZDLCAweDU1ODEsIDB4MjBDRSwgMHg1NTgyLCAweDBDMDIsCi0gICAgMHg1NTgzLCAweDBDMDgsIDB4NTU4NCwgMHgwRDFCLCAweDU1ODcsIDB4MEMwNiwgMHg1NTg4LCAweDIwQ0IsCi0gICAgMHg1NTg5LCAweDBDMTMsIDB4NTU4QSwgMHgwQkZGLCAweDU1OEIsIDB4MEMwNywgMHg1NThDLCAweDIwRDMsCi0gICAgMHg1NThELCAweDIzODcsIDB4NTU4RSwgMHgyMEQ4LCAweDU1OEYsIDB4MjBDQywgMHg1NTkxLCAweDIwQzMsCi0gICAgMHg1NTkyLCAweDIwRDAsIDB4NTU5MywgMHgyMENBLCAweDU1OTQsIDB4MEMwNSwgMHg1NTk1LCAweDIwRDYsCi0gICAgMHg1NTk4LCAweDBDMDEsIDB4NTU5OSwgMHgwQzE1LCAweDU1OUEsIDB4MEMwRSwgMHg1NTlDLCAweDBDMDMsCi0gICAgMHg1NTlELCAweDBDMDAsIDB4NTU5RiwgMHgwQzBCLCAweDU1QTEsIDB4MjBENywgMHg1NUEyLCAweDIwQzksCi0gICAgMHg1NUEzLCAweDIwQ0YsIDB4NTVBNCwgMHgyMEQxLCAweDU1QTUsIDB4MjBDNSwgMHg1NUE2LCAweDIwRDQsCi0gICAgMHg1NUE3LCAweDBCRkQsIDB4NTVBOCwgMHgyMEM0LCAweDU1QUEsIDB4MEMwNCwgMHg1NUFCLCAweDBDMTQsCi0gICAgMHg1NUFDLCAweDBDMTAsIDB4NTVBRCwgMHgyMEM2LCAweDU1QUUsIDB4MEMwQSwgMHg1NUIxLCAweDBDMTEsCi0gICAgMHg1NUIyLCAweDBDMEQsIDB4NTVCMywgMHgwQzA5LCAweDU1QjUsIDB4MjBDRCwgMHg1NUJCLCAweDBDMEYsCi0gICAgMHg1NUJGLCAweDIzODUsIDB4NTVDMCwgMHgyMzgxLCAweDU1QzIsIDB4MjM5MCwgMHg1NUMzLCAweDIzN0EsCi0gICAgMHg1NUM0LCAweDIzODMsIDB4NTVDNSwgMHgwREUwLCAweDU1QzYsIDB4MERFMSwgMHg1NUM3LCAweDBERDksCi0gICAgMHg1NUM4LCAweDIzOEMsIDB4NTVDOSwgMHgwREUzLCAweDU1Q0EsIDB4MjM3RiwgMHg1NUNCLCAweDIzN0UsCi0gICAgMHg1NUNDLCAweDIzN0MsIDB4NTVDRCwgMHgyMzhFLCAweDU1Q0UsIDB4MERENywgMHg1NUNGLCAweDIzODgsCi0gICAgMHg1NUQwLCAweDIzN0QsIDB4NTVEMSwgMHgwRERBLCAweDU1RDIsIDB4MjM4NiwgMHg1NUQzLCAweDBERDUsCi0gICAgMHg1NUQ0LCAweDIzODIsIDB4NTVENSwgMHgyMzg5LCAweDU1RDYsIDB4MjM4QiwgMHg1NUQ5LCAweDIzOEYsCi0gICAgMHg1NURBLCAweDBEREUsIDB4NTVEQiwgMHgyMzdCLCAweDU1REMsIDB4MEREOCwgMHg1NURELCAweDIzODAsCi0gICAgMHg1NURGLCAweDBERDMsIDB4NTVFMSwgMHgwRERGLCAweDU1RTIsIDB4MjM4QSwgMHg1NUUzLCAweDBEREIsCi0gICAgMHg1NUU0LCAweDBEREMsIDB4NTVFNSwgMHgwREUyLCAweDU1RTYsIDB4MERENiwgMHg1NUU3LCAweDAxMUYsCi0gICAgMHg1NUU4LCAweDBERDQsIDB4NTVFOSwgMHgyMzg0LCAweDU1RUYsIDB4MERERCwgMHg1NUYyLCAweDIzOEQsCi0gICAgMHg1NUY2LCAweDBGOUYsIDB4NTVGNywgMHgwRjlBLCAweDU1RjksIDB4MjYzNywgMHg1NUZBLCAweDI2MzMsCi0gICAgMHg1NUZDLCAweDI2MkQsIDB4NTVGRCwgMHgwRjk0LCAweDU1RkUsIDB4MEY5MCwgMHg1NUZGLCAweDI2MzYsCi0gICAgMHg1NjAwLCAweDBGOTEsIDB4NTYwMSwgMHgyNjMwLCAweDU2MDIsIDB4MjYzMiwgMHg1NjA0LCAweDI2MzUsCi0gICAgMHg1NjA2LCAweDBGOTYsIDB4NTYwOCwgMHgwRjlELCAweDU2MDksIDB4MEY5NywgMHg1NjBDLCAweDI2MkIsCi0gICAgMHg1NjBELCAweDBGOTgsIDB4NTYwRSwgMHgwRjk5LCAweDU2MEYsIDB4MjYyRSwgMHg1NjEwLCAweDBGOUUsCi0gICAgMHg1NjEyLCAweDI2MkMsIDB4NTYxMywgMHgyNjMxLCAweDU2MTQsIDB4MEY5NSwgMHg1NjE1LCAweDI2MkEsCi0gICAgMHg1NjE2LCAweDBGOUIsIDB4NTYxNywgMHgwRjkzLCAweDU2MUIsIDB4MEY5MiwgMHg1NjFDLCAweDI2MkYsCi0gICAgMHg1NjFELCAweDI2MzQsIDB4NTYxRiwgMHgwRjlDLCAweDU2MjcsIDB4MjYyOSwgMHg1NjI5LCAweDExMTksCi0gICAgMHg1NjJBLCAweDI4OUQsIDB4NTYyQywgMHgyODlBLCAweDU2MkUsIDB4MTExMywgMHg1NjJGLCAweDExMUYsCi0gICAgMHg1NjMwLCAweDExMjAsIDB4NTYzMiwgMHgxMTE2LCAweDU2MzMsIDB4Mjg5OCwgMHg1NjM0LCAweDExMTgsCi0gICAgMHg1NjM1LCAweDI4OTAsIDB4NTYzNiwgMHgxMTFFLCAweDU2MzgsIDB4Mjg5QywgMHg1NjM5LCAweDExMTUsCi0gICAgMHg1NjNBLCAweDI4OUUsIDB4NTYzQiwgMHgxMTE0LCAweDU2M0QsIDB4Mjg5OSwgMHg1NjNFLCAweDI4OUIsCi0gICAgMHg1NjNGLCAweDExMTcsIDB4NTY0MCwgMHgyODk3LCAweDU2NDEsIDB4Mjg5MSwgMHg1NjQyLCAweDI4OEUsCi0gICAgMHg1NjQ1LCAweDIwQzgsIDB4NTY0NiwgMHgyODk0LCAweDU2NDgsIDB4Mjg4RCwgMHg1NjQ5LCAweDI4OTMsCi0gICAgMHg1NjRBLCAweDI4OTIsIDB4NTY0QywgMHgyODhGLCAweDU2NEUsIDB4MTExQiwgMHg1NjUzLCAweDExMUEsCi0gICAgMHg1NjU3LCAweDExMUMsIDB4NTY1OCwgMHgyODk1LCAweDU2NTksIDB4MTI5NSwgMHg1NjVBLCAweDI4OTYsCi0gICAgMHg1NjVFLCAweDJCMTAsIDB4NTY2MCwgMHgyQjA5LCAweDU2NjIsIDB4MTJBMSwgMHg1NjYzLCAweDJCMEQsCi0gICAgMHg1NjY0LCAweDEyOTksIDB4NTY2NSwgMHgxMjlELCAweDU2NjYsIDB4MkIwQywgMHg1NjY4LCAweDEyOUMsCi0gICAgMHg1NjY5LCAweDEyOTgsIDB4NTY2QSwgMHgxMjlCLCAweDU2NkIsIDB4MTI5NiwgMHg1NjZDLCAweDEyQTAsCi0gICAgMHg1NjZELCAweDJCMEUsIDB4NTY2RSwgMHgyQjBBLCAweDU2NkYsIDB4MTI5RiwgMHg1NjcwLCAweDJCMDgsCi0gICAgMHg1NjcxLCAweDEyOUUsIDB4NTY3MiwgMHgyQjBGLCAweDU2NzMsIDB4MkIwQiwgMHg1Njc0LCAweDExMUQsCi0gICAgMHg1Njc2LCAweDEyQTIsIDB4NTY3NywgMHgyQjExLCAweDU2NzgsIDB4MTI5QSwgMHg1Njc5LCAweDEyOTcsCi0gICAgMHg1NjdFLCAweDJENDcsIDB4NTY3RiwgMHgyRDQ5LCAweDU2ODAsIDB4MTNCQSwgMHg1NjgxLCAweDJENEEsCi0gICAgMHg1NjgyLCAweDJENDgsIDB4NTY4MywgMHgyRDQ2LCAweDU2ODQsIDB4MkQ0NSwgMHg1Njg1LCAweDEzQkMsCi0gICAgMHg1Njg2LCAweDJENDQsIDB4NTY4NywgMHgxM0JELCAweDU2OEMsIDB4MkQ0MiwgMHg1NjhELCAweDJENDMsCi0gICAgMHg1NjhFLCAweDEzQjksIDB4NTY4RiwgMHgxM0JFLCAweDU2OTAsIDB4MTNCQiwgMHg1NjkzLCAweDJENDEsCi0gICAgMHg1Njk1LCAweDE0Q0EsIDB4NTY5NywgMHgyRjEzLCAweDU2OTgsIDB4MkYxMSwgMHg1Njk5LCAweDJGMTYsCi0gICAgMHg1NjlBLCAweDJGMTQsIDB4NTY5QywgMHgyRjEyLCAweDU2OUQsIDB4MkYxNSwgMHg1NkE1LCAweDE1NzYsCi0gICAgMHg1NkE2LCAweDMwODEsIDB4NTZBNywgMHgzMDgyLCAweDU2QTgsIDB4MTU3NywgMHg1NkFBLCAweDMwODMsCi0gICAgMHg1NkFCLCAweDMwN0YsIDB4NTZBQywgMHgzMDg0LCAweDU2QUQsIDB4MzA4MCwgMHg1NkFFLCAweDE0Q0IsCi0gICAgMHg1NkIyLCAweDMxQzgsIDB4NTZCMywgMHgzMUNBLCAweDU2QjQsIDB4MTYwQywgMHg1NkI1LCAweDMxQzksCi0gICAgMHg1NkI2LCAweDE2MEIsIDB4NTZCNywgMHgxNjBBLCAweDU2QkMsIDB4MTYwRCwgMHg1NkJELCAweDMyQ0EsCi0gICAgMHg1NkJFLCAweDMyQ0IsIDB4NTZDMCwgMHgxNjZCLCAweDU2QzEsIDB4MTY2QSwgMHg1NkMyLCAweDE2NkMsCi0gICAgMHg1NkMzLCAweDMyQzksIDB4NTZDNSwgMHgzMzc5LCAweDU2QzYsIDB4MzM3OCwgMHg1NkM4LCAweDE2QkQsCi0gICAgMHg1NkM5LCAweDE2QkYsIDB4NTZDQSwgMHgxNkJFLCAweDU2Q0IsIDB4MzM3QSwgMHg1NkNDLCAweDE2RjYsCi0gICAgMHg1NkNELCAweDM0ODEsIDB4NTZEMSwgMHgxNzFGLCAweDU2RDMsIDB4MzQ4MCwgMHg1NkQ0LCAweDM0QzksCi0gICAgMHg1NkQ3LCAweDE3NzUsIDB4NTZEQSwgMHgwMzJELCAweDU2REIsIDB4MDMyQywgMHg1NkRELCAweDAzQUMsCi0gICAgMHg1NkRFLCAweDAzQUIsIDB4NTZERiwgMHgxN0QwLCAweDU2RTAsIDB4MDNBQSwgMHg1NkUxLCAweDE3Q0YsCi0gICAgMHg1NkU0LCAweDA0NjMsIDB4NTZFNSwgMHgxODUwLCAweDU2RTcsIDB4MTg0RiwgMHg1NkVBLCAweDA0NjEsCi0gICAgMHg1NkVCLCAweDA0NjQsIDB4NTZFRSwgMHgxODRFLCAweDU2RjAsIDB4MDQ2MiwgMHg1NkY3LCAweDE5MzMsCi0gICAgMHg1NkY5LCAweDE5MzQsIDB4NTZGQSwgMHgwNTc4LCAweDU2RkYsIDB4MDZFNiwgMHg1NzAxLCAweDFDNUIsCi0gICAgMHg1NzAyLCAweDFDNUMsIDB4NTcwMywgMHgwODc5LCAweDU3MDQsIDB4MDg3QSwgMHg1NzA3LCAweDFFNzQsCi0gICAgMHg1NzA4LCAweDBBMzYsIDB4NTcwOSwgMHgwQTM4LCAweDU3MEEsIDB4MUU3MywgMHg1NzBCLCAweDBBMzcsCi0gICAgMHg1NzBDLCAweDIwRDksIDB4NTcwRCwgMHgwQzE2LCAweDU3MTIsIDB4MERFNCwgMHg1NzEzLCAweDBERTUsCi0gICAgMHg1NzE0LCAweDIzOTEsIDB4NTcxNiwgMHgwRkExLCAweDU3MTgsIDB4MEZBMCwgMHg1NzFBLCAweDI4OUYsCi0gICAgMHg1NzFCLCAweDJCMTMsIDB4NTcxQywgMHgyQjEyLCAweDU3MUUsIDB4MzUwNSwgMHg1NzFGLCAweDAyN0EsCi0gICAgMHg1NzIwLCAweDE3ODQsIDB4NTcyMiwgMHgxNzlBLCAweDU3MjMsIDB4MTc5QiwgMHg1NzI4LCAweDAzQUYsCi0gICAgMHg1NzI5LCAweDAzQjMsIDB4NTcyQSwgMHgxN0QyLCAweDU3MkMsIDB4MDNCMSwgMHg1NzJELCAweDAzQjAsCi0gICAgMHg1NzJFLCAweDE3RDEsIDB4NTcyRiwgMHgwM0IyLCAweDU3MzAsIDB4MDNBRSwgMHg1NzMzLCAweDAzQUQsCi0gICAgMHg1NzM0LCAweDE3RDMsIDB4NTczQiwgMHgwNDZFLCAweDU3M0UsIDB4MDQ2QiwgMHg1NzQwLCAweDA0NjcsCi0gICAgMHg1NzQxLCAweDE4NTEsIDB4NTc0NSwgMHgxODUyLCAweDU3NDcsIDB4MDQ2OSwgMHg1NzQ5LCAweDE4NTQsCi0gICAgMHg1NzRBLCAweDA0NjUsIDB4NTc0QiwgMHgxODU1LCAweDU3NEMsIDB4MTg1MywgMHg1NzRELCAweDA0NjgsCi0gICAgMHg1NzRFLCAweDA0NkEsIDB4NTc0RiwgMHgwNDZELCAweDU3NTAsIDB4MDQ2QywgMHg1NzUxLCAweDA0NjYsCi0gICAgMHg1NzUyLCAweDE4NTYsIDB4NTc2MSwgMHgwNTdELCAweDU3NjIsIDB4MTk0MSwgMHg1NzY0LCAweDA1N0YsCi0gICAgMHg1NzY2LCAweDA1N0UsIDB4NTc2OCwgMHgxOTQyLCAweDU3NjksIDB4MDU3QywgMHg1NzZBLCAweDA1N0IsCi0gICAgMHg1NzZCLCAweDE5MzgsIDB4NTc2RCwgMHgxOTM3LCAweDU3NkYsIDB4MTkzNSwgMHg1NzcwLCAweDE5M0EsCi0gICAgMHg1NzcxLCAweDE5MzksIDB4NTc3MiwgMHgxOTM2LCAweDU3NzMsIDB4MTkzRiwgMHg1Nzc0LCAweDE5NDAsCi0gICAgMHg1Nzc1LCAweDE5M0QsIDB4NTc3NiwgMHgxOTNCLCAweDU3NzcsIDB4MDU3QSwgMHg1NzdCLCAweDE5M0UsCi0gICAgMHg1NzdDLCAweDA1ODAsIDB4NTc3RCwgMHgxOTQzLCAweDU3ODAsIDB4MTkzQywgMHg1NzgyLCAweDA2RTcsCi0gICAgMHg1NzgzLCAweDA1NzksIDB4NTc4QiwgMHgwNkU4LCAweDU3OEMsIDB4MUE5MCwgMHg1NzhGLCAweDFBOTYsCi0gICAgMHg1NzkzLCAweDA2RUUsIDB4NTc5NCwgMHgxQTk0LCAweDU3OTUsIDB4MUE5QSwgMHg1Nzk3LCAweDFBOTEsCi0gICAgMHg1Nzk4LCAweDFBOTUsIDB4NTc5OSwgMHgxQTk3LCAweDU3OUEsIDB4MUE5OSwgMHg1NzlCLCAweDFBOTMsCi0gICAgMHg1NzlELCAweDFBOTIsIDB4NTc5RSwgMHgxQThELCAweDU3OUYsIDB4MUE4RSwgMHg1N0EwLCAweDA2RTksCi0gICAgMHg1N0EyLCAweDA2RUIsIDB4NTdBMywgMHgwNkVBLCAweDU3QTQsIDB4MUE4RiwgMHg1N0E1LCAweDFBOTgsCi0gICAgMHg1N0FFLCAweDA2RUQsIDB4NTdCNSwgMHgxQThDLCAweDU3QjYsIDB4MUM2NiwgMHg1N0I4LCAweDFDNjUsCi0gICAgMHg1N0I5LCAweDFDNkEsIDB4NTdCQSwgMHgxQzYxLCAweDU3QkMsIDB4MUM2NCwgMHg1N0JELCAweDFDNjMsCi0gICAgMHg1N0JGLCAweDFDNjcsIDB4NTdDMSwgMHgxQzZCLCAweDU3QzIsIDB4MDg3QiwgMHg1N0MzLCAweDA4N0UsCi0gICAgMHg1N0M2LCAweDFDNjIsIDB4NTdDNywgMHgxQzY4LCAweDU3Q0IsIDB4MDg3RCwgMHg1N0NDLCAweDFDNUQsCi0gICAgMHg1N0NFLCAweDA2RUMsIDB4NTdDRiwgMHgxRTgyLCAweDU3RDAsIDB4MUM2OSwgMHg1N0QyLCAweDFDNjAsCi0gICAgMHg1N0Q0LCAweDA4N0MsIDB4NTdENSwgMHgxQzVGLCAweDU3REMsIDB4MUU3OSwgMHg1N0RGLCAweDBBMzksCi0gICAgMHg1N0UwLCAweDBBM0QsIDB4NTdFMSwgMHgxRTg5LCAweDU3RTIsIDB4MUU3NywgMHg1N0UzLCAweDFFODUsCi0gICAgMHg1N0U0LCAweDBBM0UsIDB4NTdFNSwgMHgxRTg3LCAweDU3RTcsIDB4MUU4RCwgMHg1N0U5LCAweDFFOTEsCi0gICAgMHg1N0VDLCAweDFFODgsIDB4NTdFRCwgMHgxRTdDLCAweDU3RUUsIDB4MUU4NCwgMHg1N0YwLCAweDFFOTIsCi0gICAgMHg1N0YxLCAweDFFOTAsIDB4NTdGMiwgMHgxRTg2LCAweDU3RjMsIDB4MUU4MSwgMHg1N0Y0LCAweDFFN0EsCi0gICAgMHg1N0Y1LCAweDIwRTEsIDB4NTdGNiwgMHgxRTc4LCAweDU3RjcsIDB4MEE0MiwgMHg1N0Y4LCAweDFFN0YsCi0gICAgMHg1N0Y5LCAweDBBNDMsIDB4NTdGQSwgMHgwQTNGLCAweDU3RkIsIDB4MUU3NSwgMHg1N0ZDLCAweDFFOEIsCi0gICAgMHg1N0ZELCAweDFFN0QsIDB4NTgwMCwgMHgxRTdCLCAweDU4MDEsIDB4MUU4RSwgMHg1ODAyLCAweDBBNDAsCi0gICAgMHg1ODA0LCAweDFFOTQsIDB4NTgwNSwgMHgwQTNBLCAweDU4MDYsIDB4MEEzQywgMHg1ODA3LCAweDFFODMsCi0gICAgMHg1ODA4LCAweDFFN0UsIDB4NTgwOSwgMHgwODdGLCAweDU4MEEsIDB4MEEzQiwgMHg1ODBCLCAweDFFODAsCi0gICAgMHg1ODBDLCAweDFFOEYsIDB4NTgwRCwgMHgxRTkzLCAweDU4MEUsIDB4MUU4QSwgMHg1ODEwLCAweDFFOEMsCi0gICAgMHg1ODE0LCAweDFFNzYsIDB4NTgxOSwgMHgyMERDLCAweDU4MUIsIDB4MjBFNSwgMHg1ODFDLCAweDIwRTQsCi0gICAgMHg1ODFELCAweDBDMUUsIDB4NTgxRSwgMHgyMERELCAweDU4MjAsIDB4MEMxRiwgMHg1ODIxLCAweDBDMUQsCi0gICAgMHg1ODIzLCAweDIwREYsIDB4NTgyNCwgMHgwQzFBLCAweDU4MjUsIDB4MjBFMywgMHg1ODI3LCAweDIwREUsCi0gICAgMHg1ODI4LCAweDIwRTAsIDB4NTgyOSwgMHgyMERBLCAweDU4MkEsIDB4MEMxOCwgMHg1ODJDLCAweDIwRUQsCi0gICAgMHg1ODJELCAweDIwRUMsIDB4NTgyRSwgMHgyMEU5LCAweDU4MkYsIDB4MEMxNywgMHg1ODMwLCAweDBDMUIsCi0gICAgMHg1ODMxLCAweDBDMUMsIDB4NTgzMiwgMHgxQzVFLCAweDU4MzMsIDB4MjBFNiwgMHg1ODM0LCAweDBDMTksCi0gICAgMHg1ODM1LCAweDBBNDEsIDB4NTgzNiwgMHgyMEU4LCAweDU4MzcsIDB4MjBEQiwgMHg1ODM4LCAweDIwRUIsCi0gICAgMHg1ODM5LCAweDIwRUEsIDB4NTgzQiwgMHgyMEVFLCAweDU4M0QsIDB4MjM5RiwgMHg1ODNGLCAweDIwRTcsCi0gICAgMHg1ODQ4LCAweDIwRTIsIDB4NTg0OSwgMHgyMzk3LCAweDU4NEEsIDB4MERFRiwgMHg1ODRCLCAweDBERjIsCi0gICAgMHg1ODRDLCAweDBERUQsIDB4NTg0RCwgMHgyMzk2LCAweDU4NEUsIDB4MjM5QSwgMHg1ODRGLCAweDIzOTUsCi0gICAgMHg1ODUxLCAweDBERTcsIDB4NTg1MiwgMHgwREYxLCAweDU4NTMsIDB4MjM5MiwgMHg1ODU0LCAweDBERUIsCi0gICAgMHg1ODU1LCAweDIzOTksIDB4NTg1NywgMHgwREU5LCAweDU4NTgsIDB4MERFOCwgMHg1ODU5LCAweDIzOUMsCi0gICAgMHg1ODVBLCAweDBERUEsIDB4NTg1QiwgMHgyMzlFLCAweDU4NUQsIDB4MjM5QiwgMHg1ODVFLCAweDBERTYsCi0gICAgMHg1ODYyLCAweDBERjAsIDB4NTg2MywgMHgyM0EwLCAweDU4NjQsIDB4MjM5NCwgMHg1ODY1LCAweDIzOUQsCi0gICAgMHg1ODY4LCAweDIzOTMsIDB4NTg2QiwgMHgwREVDLCAweDU4NkQsIDB4MERFRSwgMHg1ODZGLCAweDIzOTgsCi0gICAgMHg1ODcxLCAweDIzQTEsIDB4NTg3NCwgMHgyNjNGLCAweDU4NzUsIDB4MEZBMiwgMHg1ODc2LCAweDI2NDUsCi0gICAgMHg1ODc5LCAweDBGQTcsIDB4NTg3QSwgMHgyNjQxLCAweDU4N0IsIDB4MjY0OCwgMHg1ODdDLCAweDI2MzksCi0gICAgMHg1ODdELCAweDBGQTksIDB4NTg3RSwgMHgwRkEzLCAweDU4N0YsIDB4MjYzRSwgMHg1ODgwLCAweDExMjEsCi0gICAgMHg1ODgxLCAweDI2M0QsIDB4NTg4MiwgMHgyNjQ2LCAweDU4ODMsIDB4MEZBNCwgMHg1ODg1LCAweDBGQTgsCi0gICAgMHg1ODg2LCAweDI2M0MsIDB4NTg4NywgMHgyNjQyLCAweDU4ODgsIDB4MjY0NywgMHg1ODg5LCAweDI2MzgsCi0gICAgMHg1ODhBLCAweDBGQTYsIDB4NTg4QiwgMHgyNjQwLCAweDU4OEUsIDB4MjY0NCwgMHg1ODhGLCAweDI2NEEsCi0gICAgMHg1ODkwLCAweDI2M0EsIDB4NTg5MSwgMHgyNjQzLCAweDU4OTMsIDB4MEZBNSwgMHg1ODk0LCAweDI2NDksCi0gICAgMHg1ODk4LCAweDI2M0IsIDB4NTg5QywgMHgxMTI1LCAweDU4OUQsIDB4MjhBMSwgMHg1ODlFLCAweDExMjMsCi0gICAgMHg1ODlGLCAweDExMjIsIDB4NThBMCwgMHgyOEEzLCAweDU4QTEsIDB4MjhBOCwgMHg1OEEzLCAweDI4QTQsCi0gICAgMHg1OEE1LCAweDI4QTcsIDB4NThBNiwgMHgxMTI4LCAweDU4QTgsIDB4MTI4OCwgMHg1OEE5LCAweDExMjcsCi0gICAgMHg1OEFCLCAweDI4QTAsIDB4NThBQywgMHgyOEE2LCAweDU4QUUsIDB4MTEyNiwgMHg1OEFGLCAweDI4QTUsCi0gICAgMHg1OEIxLCAweDI4QTIsIDB4NThCMywgMHgxMTI0LCAweDU4QkEsIDB4MkIxOCwgMHg1OEJCLCAweDM2RUIsCi0gICAgMHg1OEJDLCAweDJCMUEsIDB4NThCRCwgMHgyQjE1LCAweDU4QkUsIDB4MTJBNCwgMHg1OEJGLCAweDJCMTcsCi0gICAgMHg1OEMxLCAweDEyQTMsIDB4NThDMiwgMHgyQjE5LCAweDU4QzUsIDB4MTJBNiwgMHg1OEM2LCAweDJCMUIsCi0gICAgMHg1OEM3LCAweDEyQTUsIDB4NThDOCwgMHgyQjE0LCAweDU4QzksIDB4MkIxNiwgMHg1OENFLCAweDEzQzIsCi0gICAgMHg1OENGLCAweDJENEQsIDB4NThEMSwgMHgxM0MxLCAweDU4RDIsIDB4MkQ0RSwgMHg1OEQzLCAweDEzQzAsCi0gICAgMHg1OEQ0LCAweDJENEMsIDB4NThENSwgMHgxM0JGLCAweDU4RDYsIDB4MkQ0QiwgMHg1OEQ4LCAweDE0Q0QsCi0gICAgMHg1OEQ5LCAweDE0Q0MsIDB4NThEQSwgMHgzMDg1LCAweDU4REIsIDB4MzA4NywgMHg1OERELCAweDMwODYsCi0gICAgMHg1OERFLCAweDE1NzgsIDB4NThERiwgMHgxNTc5LCAweDU4RTIsIDB4MTU3QSwgMHg1OEUzLCAweDMxQ0IsCi0gICAgMHg1OEU0LCAweDE2MEUsIDB4NThFNywgMHgzNDExLCAweDU4RTgsIDB4MzQxMCwgMHg1OEU5LCAweDE3MjAsCi0gICAgMHg1OEVCLCAweDAyN0IsIDB4NThFQywgMHgwMkMxLCAweDU4RUYsIDB4MDQ2RiwgMHg1OEY0LCAweDFBOUIsCi0gICAgMHg1OEY5LCAweDBDMjAsIDB4NThGQSwgMHgwQzIxLCAweDU4RkMsIDB4MjNBMiwgMHg1OEZELCAweDBGQUEsCi0gICAgMHg1OEZFLCAweDI2NEIsIDB4NThGRiwgMHgyOEE5LCAweDU5MDIsIDB4MDIyNCwgMHg1OTAzLCAweDE3ODUsCi0gICAgMHg1OTA2LCAweDE4NTcsIDB4NTkwQSwgMHgwMjI0LCAweDU5MEMsIDB4MTk0NCwgMHg1OTBELCAweDFBOUMsCi0gICAgMHg1OTBFLCAweDFDNkMsIDB4NTkwRiwgMHgwODgwLCAweDU5MTIsIDB4MzA4OCwgMHg1OTE0LCAweDE2NkQsCi0gICAgMHg1OTE1LCAweDAyN0MsIDB4NTkxNiwgMHgwMzJFLCAweDU5MTcsIDB4MTc5QywgMHg1OTE5LCAweDAzQjQsCi0gICAgMHg1OTFBLCAweDAzQjUsIDB4NTkxQywgMHgwNTgxLCAweDU5MjAsIDB4MEE0NCwgMHg1OTIyLCAweDBGQUMsCi0gICAgMHg1OTI0LCAweDBGQUQsIDB4NTkyNSwgMHgwRkFCLCAweDU5MjcsIDB4MDI3RCwgMHg1OTI5LCAweDAyQzIsCi0gICAgMHg1OTJBLCAweDAyQzQsIDB4NTkyQiwgMHgwMkMzLCAweDU5MkMsIDB4MTc4NiwgMHg1OTJELCAweDAyQzUsCi0gICAgMHg1OTJFLCAweDAzMkYsIDB4NTkyRiwgMHgxNzlELCAweDU5MzEsIDB4MDMzMCwgMHg1OTM3LCAweDAzQjYsCi0gICAgMHg1OTM4LCAweDAzQjcsIDB4NTkzQywgMHgxN0Q0LCAweDU5M0UsIDB4MDQ3MCwgMHg1OTQwLCAweDE4NTgsCi0gICAgMHg1OTQ0LCAweDA1ODUsIDB4NTk0NSwgMHgxOTQ1LCAweDU5NDcsIDB4MDU4MywgMHg1OTQ4LCAweDA1ODQsCi0gICAgMHg1OTQ5LCAweDA1ODIsIDB4NTk0QSwgMHgxQzZELCAweDU5NEUsIDB4MDZGMiwgMHg1OTRGLCAweDA2RjEsCi0gICAgMHg1OTUwLCAweDA2RjMsIDB4NTk1MSwgMHgwNkYwLCAweDU5NTMsIDB4MUE5RCwgMHg1OTU0LCAweDA1ODYsCi0gICAgMHg1OTU1LCAweDA2RUYsIDB4NTk1NywgMHgwODgxLCAweDU5NTgsIDB4MDg4MiwgMHg1OTVBLCAweDA4ODMsCi0gICAgMHg1OTVDLCAweDFFOTUsIDB4NTk2MCwgMHgwQzIyLCAweDU5NjEsIDB4MjBFRiwgMHg1OTYyLCAweDBBNDUsCi0gICAgMHg1OTY3LCAweDBERjMsIDB4NTk2OSwgMHgwRkFGLCAweDU5NkEsIDB4MEZBRSwgMHg1OTZCLCAweDI2NEMsCi0gICAgMHg1OTZELCAweDExMjksIDB4NTk2RSwgMHgxMkE3LCAweDU5NzAsIDB4MkYxNywgMHg1OTcxLCAweDMzN0IsCi0gICAgMHg1OTcyLCAweDM0MTIsIDB4NTk3MywgMHgwMjdFLCAweDU5NzQsIDB4MDMzMSwgMHg1OTc2LCAweDAzMzIsCi0gICAgMHg1OTc3LCAweDE3REEsIDB4NTk3OCwgMHgwM0I5LCAweDU5NzksIDB4MDNCQywgMHg1OTdCLCAweDE3RDgsCi0gICAgMHg1OTdDLCAweDE3RDYsIDB4NTk3RCwgMHgwM0JCLCAweDU5N0UsIDB4MTdEOSwgMHg1OTdGLCAweDE3REIsCi0gICAgMHg1OTgwLCAweDE3RDUsIDB4NTk4MSwgMHgwM0JFLCAweDU5ODIsIDB4MDNCRCwgMHg1OTgzLCAweDAzQkEsCi0gICAgMHg1OTg0LCAweDAzQjgsIDB4NTk4NSwgMHgxN0Q3LCAweDU5OEEsIDB4MDQ3QiwgMHg1OThELCAweDA0NzgsCi0gICAgMHg1OThFLCAweDE4NUQsIDB4NTk4RiwgMHgxODYwLCAweDU5OTAsIDB4MTg1RiwgMHg1OTkyLCAweDA0NzIsCi0gICAgMHg1OTkzLCAweDA0N0EsIDB4NTk5NiwgMHgwNDc3LCAweDU5OTcsIDB4MTg1QywgMHg1OTk4LCAweDE4NUEsCi0gICAgMHg1OTk5LCAweDA0NzYsIDB4NTk5RCwgMHgwNDcxLCAweDU5OUUsIDB4MDQ3NCwgMHg1OUEwLCAweDE4NUIsCi0gICAgMHg1OUExLCAweDE4NjIsIDB4NTlBMiwgMHgxODVFLCAweDU5QTMsIDB4MDQ3NSwgMHg1OUE0LCAweDA0NzksCi0gICAgMHg1OUE1LCAweDA0N0MsIDB4NTlBNiwgMHgxODU5LCAweDU5QTcsIDB4MTg2MSwgMHg1OUE4LCAweDA0NzMsCi0gICAgMHg1OUFFLCAweDA1OEIsIDB4NTlBRiwgMHgwNTkzLCAweDU5QjEsIDB4MTk1MSwgMHg1OUIyLCAweDE5NEEsCi0gICAgMHg1OUIzLCAweDA1OTQsIDB4NTlCNCwgMHgxOTU1LCAweDU5QjUsIDB4MTk0NiwgMHg1OUI2LCAweDE5NEQsCi0gICAgMHg1OUI5LCAweDA1OEEsIDB4NTlCQSwgMHgxOTQ3LCAweDU5QkIsIDB4MDU4OCwgMHg1OUJDLCAweDE5NEUsCi0gICAgMHg1OUJELCAweDE5NTIsIDB4NTlCRSwgMHgwNTg3LCAweDU5QzAsIDB4MTk1MywgMHg1OUMxLCAweDE5NEMsCi0gICAgMHg1OUMzLCAweDE5NEYsIDB4NTlDNSwgMHgwNTk2LCAweDU5QzYsIDB4MDU4RCwgMHg1OUM3LCAweDE5NTYsCi0gICAgMHg1OUM4LCAweDE5NTQsIDB4NTlDQSwgMHgwNTkyLCAweDU5Q0IsIDB4MDU5MCwgMHg1OUNDLCAweDE5NEIsCi0gICAgMHg1OUNELCAweDA1OEYsIDB4NTlDRSwgMHgxOTQ5LCAweDU5Q0YsIDB4MTk0OCwgMHg1OUQwLCAweDA1OEUsCi0gICAgMHg1OUQxLCAweDA1OEMsIDB4NTlEMiwgMHgwNTk1LCAweDU5RDMsIDB4MDU5MSwgMHg1OUQ0LCAweDA1ODksCi0gICAgMHg1OUQ2LCAweDE5NTAsIDB4NTlEOCwgMHgwNkY1LCAweDU5REEsIDB4MDZGQywgMHg1OURCLCAweDFBQUIsCi0gICAgMHg1OURDLCAweDA2RjQsIDB4NTlERCwgMHgxQUEzLCAweDU5REUsIDB4MUE5RiwgMHg1OUUwLCAweDFBQUYsCi0gICAgMHg1OUUxLCAweDFBOUUsIDB4NTlFMywgMHgwNkY3LCAweDU5RTQsIDB4MUFBOCwgMHg1OUU1LCAweDA2RkEsCi0gICAgMHg1OUU2LCAweDA2RkQsIDB4NTlFOCwgMHgwNkY4LCAweDU5RTksIDB4MUFBQywgMHg1OUVBLCAweDA2RkIsCi0gICAgMHg1OUVDLCAweDA4OEEsIDB4NTlFRCwgMHgxQUIyLCAweDU5RUUsIDB4MUFBMCwgMHg1OUYxLCAweDFBQTIsCi0gICAgMHg1OUYyLCAweDFBQTksIDB4NTlGMywgMHgxQUFELCAweDU5RjQsIDB4MUFCMSwgMHg1OUY1LCAweDFBQUUsCi0gICAgMHg1OUY2LCAweDFBQTcsIDB4NTlGNywgMHgxQUFBLCAweDU5RkEsIDB4MUFBNCwgMHg1OUZCLCAweDA2RkYsCi0gICAgMHg1OUZDLCAweDFBQTYsIDB4NTlGRCwgMHgxQUE1LCAweDU5RkUsIDB4MUFCMCwgMHg1OUZGLCAweDA2RjYsCi0gICAgMHg1QTAwLCAweDFBQTEsIDB4NUEwMSwgMHgwNkZFLCAweDVBMDMsIDB4MDZGOSwgMHg1QTA5LCAweDA4OTAsCi0gICAgMHg1QTBBLCAweDFDNzUsIDB4NUEwQywgMHgwODhGLCAweDVBMEYsIDB4MUM3MywgMHg1QTExLCAweDA4ODQsCi0gICAgMHg1QTEzLCAweDA4ODksIDB4NUExNSwgMHgxQzcyLCAweDVBMTYsIDB4MUM2RiwgMHg1QTE3LCAweDFDNzQsCi0gICAgMHg1QTE4LCAweDA4ODUsIDB4NUExOSwgMHgxQzZFLCAweDVBMUIsIDB4MDg4OCwgMHg1QTFDLCAweDA4ODYsCi0gICAgMHg1QTFFLCAweDFDNzYsIDB4NUExRiwgMHgwODg3LCAweDVBMjAsIDB4MDg4QiwgMHg1QTIzLCAweDA4OEMsCi0gICAgMHg1QTI1LCAweDA4OEUsIDB4NUEyOSwgMHgwODhELCAweDVBMkQsIDB4MUM3MCwgMHg1QTJFLCAweDFDNzEsCi0gICAgMHg1QTMzLCAweDFDNzcsIDB4NUEzNSwgMHgxRTlDLCAweDVBMzYsIDB4MEE0NiwgMHg1QTM3LCAweDIwRkQsCi0gICAgMHg1QTM4LCAweDFFOUIsIDB4NUEzOSwgMHgxRUFFLCAweDVBM0MsIDB4MEE0QywgMHg1QTNFLCAweDFFQUMsCi0gICAgMHg1QTQwLCAweDBBNEIsIDB4NUE0MSwgMHgwQTQ3LCAweDVBNDIsIDB4MUVCNSwgMHg1QTQzLCAweDFFQTUsCi0gICAgMHg1QTQ0LCAweDFFQTgsIDB4NUE0NiwgMHgwQTRGLCAweDVBNDcsIDB4MUVCMiwgMHg1QTQ4LCAweDFFQUEsCi0gICAgMHg1QTQ5LCAweDBBNDgsIDB4NUE0QSwgMHgwQTUwLCAweDVBNEMsIDB4MUVBRiwgMHg1QTRELCAweDFFQUQsCi0gICAgMHg1QTUwLCAweDFFOUUsIDB4NUE1MSwgMHgxRUIzLCAweDVBNTIsIDB4MUVBNywgMHg1QTUzLCAweDFFQTIsCi0gICAgMHg1QTU1LCAweDFFOTgsIDB4NUE1NiwgMHgxRUI0LCAweDVBNTcsIDB4MUVBNCwgMHg1QTU4LCAweDFFOTcsCi0gICAgMHg1QTVBLCAweDBBNEUsIDB4NUE1QiwgMHgxRUE5LCAweDVBNUMsIDB4MUVCNiwgMHg1QTVELCAweDFFQTYsCi0gICAgMHg1QTVFLCAweDFFOUEsIDB4NUE1RiwgMHgxRTlGLCAweDVBNjAsIDB4MUU5NiwgMHg1QTYyLCAweDBBNEQsCi0gICAgMHg1QTY0LCAweDFFQTMsIDB4NUE2NSwgMHgxRUEwLCAweDVBNjYsIDB4MEE0OSwgMHg1QTY3LCAweDFFOTksCi0gICAgMHg1QTY5LCAweDFFQjEsIDB4NUE2QSwgMHgwQTRBLCAweDVBNkMsIDB4MUVBMSwgMHg1QTZELCAweDFFOUQsCi0gICAgMHg1QTcwLCAweDFFQjAsIDB4NUE3NywgMHgwQzIzLCAweDVBNzgsIDB4MjBGNiwgMHg1QTdBLCAweDIwRjMsCi0gICAgMHg1QTdCLCAweDIxMDQsIDB4NUE3QywgMHgyMEY4LCAweDVBN0QsIDB4MjEwNSwgMHg1QTdGLCAweDBDMjUsCi0gICAgMHg1QTgzLCAweDIxMDEsIDB4NUE4NCwgMHgyMEZFLCAweDVBOEEsIDB4MjBGRiwgMHg1QThCLCAweDIxMDIsCi0gICAgMHg1QThDLCAweDIxMDYsIDB4NUE4RSwgMHgxRUFCLCAweDVBOEYsIDB4MjEwOCwgMHg1QTkwLCAweDIzQjYsCi0gICAgMHg1QTkyLCAweDBDMjYsIDB4NUE5MywgMHgyMTA5LCAweDVBOTQsIDB4MjBGMSwgMHg1QTk1LCAweDIwRkIsCi0gICAgMHg1QTk3LCAweDIxMDAsIDB4NUE5QSwgMHgwQzI0LCAweDVBOUIsIDB4MEMyNywgMHg1QTlDLCAweDIxMDcsCi0gICAgMHg1QTlELCAweDIxMEEsIDB4NUE5RSwgMHgyMEY1LCAweDVBOUYsIDB4MjBGMiwgMHg1QUEyLCAweDIwRjQsCi0gICAgMHg1QUE1LCAweDIwRjksIDB4NUFBNiwgMHgyMEY3LCAweDVBQTcsIDB4MEMyOCwgMHg1QUE5LCAweDIxMDMsCi0gICAgMHg1QUFDLCAweDIwRkEsIDB4NUFBRSwgMHgyMEZDLCAweDVBQUYsIDB4MjBGMCwgMHg1QUIwLCAweDIzQUEsCi0gICAgMHg1QUIxLCAweDIzQTgsIDB4NUFCMiwgMHgwREZDLCAweDVBQjMsIDB4MERGQSwgMHg1QUI0LCAweDIzQjIsCi0gICAgMHg1QUI1LCAweDIzQTksIDB4NUFCNiwgMHgyM0IzLCAweDVBQjcsIDB4MjNBRiwgMHg1QUI4LCAweDIzQTcsCi0gICAgMHg1QUI5LCAweDIzQjUsIDB4NUFCQSwgMHgyM0E2LCAweDVBQkIsIDB4MjNBRCwgMHg1QUJDLCAweDBERjksCi0gICAgMHg1QUJELCAweDBERjgsIDB4NUFCRSwgMHgwREY3LCAweDVBQkYsIDB4MjNBQiwgMHg1QUMwLCAweDIzQjAsCi0gICAgMHg1QUMxLCAweDBERjQsIDB4NUFDMiwgMHgwREZCLCAweDVBQzQsIDB4MjNBNCwgMHg1QUM2LCAweDIzQUUsCi0gICAgMHg1QUM3LCAweDIzQTMsIDB4NUFDOCwgMHgyM0FDLCAweDVBQzksIDB4MERGNSwgMHg1QUNBLCAweDIzQjEsCi0gICAgMHg1QUNCLCAweDIzQTUsIDB4NUFDQywgMHgwREY2LCAweDVBQ0QsIDB4MjNCNCwgMHg1QUQ1LCAweDI2NTAsCi0gICAgMHg1QUQ2LCAweDBGQjQsIDB4NUFENywgMHgwRkIzLCAweDVBRDgsIDB4MEZCNSwgMHg1QUQ5LCAweDI2NUMsCi0gICAgMHg1QURBLCAweDI2NTIsIDB4NUFEQiwgMHgyNjU4LCAweDVBREMsIDB4MjY0RCwgMHg1QURELCAweDI2NUIsCi0gICAgMHg1QURFLCAweDI2NUEsIDB4NUFERiwgMHgyNjVFLCAweDVBRTAsIDB4MjY1NywgMHg1QUUxLCAweDBGQjAsCi0gICAgMHg1QUUyLCAweDI2NTYsIDB4NUFFMywgMHgwRkI2LCAweDVBRTUsIDB4MjY0RiwgMHg1QUU2LCAweDBGQjEsCi0gICAgMHg1QUU4LCAweDI2NUQsIDB4NUFFOSwgMHgwRkIyLCAweDVBRUEsIDB4MjY1MSwgMHg1QUVCLCAweDI2NTQsCi0gICAgMHg1QUVDLCAweDI2NTksIDB4NUFFRCwgMHgyNjUzLCAweDVBRUUsIDB4MjY0RSwgMHg1QUYzLCAweDI2NTUsCi0gICAgMHg1QUY0LCAweDI4QUIsIDB4NUFGNSwgMHgxMTJELCAweDVBRjYsIDB4MjhBRSwgMHg1QUY3LCAweDI4QUQsCi0gICAgMHg1QUY4LCAweDI4QjAsIDB4NUFGOSwgMHgyOEIyLCAweDVBRkEsIDB4MzZFRSwgMHg1QUZCLCAweDExMkIsCi0gICAgMHg1QUZELCAweDI4QUMsIDB4NUFGRiwgMHgyOEFBLCAweDVCMDEsIDB4MjhCMywgMHg1QjAyLCAweDI4QjEsCi0gICAgMHg1QjAzLCAweDI4QUYsIDB4NUIwNSwgMHgyOEI1LCAweDVCMDcsIDB4MjhCNCwgMHg1QjA4LCAweDExMkYsCi0gICAgMHg1QjA5LCAweDExMkEsIDB4NUIwQiwgMHgxMTJDLCAweDVCMEMsIDB4MTEyRSwgMHg1QjBGLCAweDI4QjYsCi0gICAgMHg1QjEwLCAweDJCMjIsIDB4NUIxMywgMHgyQjIxLCAweDVCMTQsIDB4MkIyMCwgMHg1QjE2LCAweDJCMjMsCi0gICAgMHg1QjE3LCAweDJCMUMsIDB4NUIxOSwgMHgyQjFELCAweDVCMUEsIDB4MkIyNSwgMHg1QjFCLCAweDJCMUUsCi0gICAgMHg1QjFELCAweDEyQTgsIDB4NUIxRSwgMHgyQjI3LCAweDVCMjAsIDB4MkIyNiwgMHg1QjIxLCAweDJCMUYsCi0gICAgMHg1QjIzLCAweDJENTIsIDB4NUIyNCwgMHgxM0M1LCAweDVCMjUsIDB4MkQ1MCwgMHg1QjI2LCAweDJENTUsCi0gICAgMHg1QjI3LCAweDJENTQsIDB4NUIyOCwgMHgyQjI0LCAweDVCMkEsIDB4MTNDNCwgMHg1QjJDLCAweDJENTMsCi0gICAgMHg1QjJELCAweDJENEYsIDB4NUIyRSwgMHgyRDU3LCAweDVCMkYsIDB4MkQ1NiwgMHg1QjMwLCAweDEzQzMsCi0gICAgMHg1QjMyLCAweDJENTEsIDB4NUIzNCwgMHgxMkE5LCAweDVCMzgsIDB4MTRDRSwgMHg1QjNDLCAweDJGMTgsCi0gICAgMHg1QjNELCAweDMwODksIDB4NUIzRSwgMHgzMDhBLCAweDVCM0YsIDB4MzA4QiwgMHg1QjQwLCAweDE2MEYsCi0gICAgMHg1QjQzLCAweDE2MTAsIDB4NUI0NSwgMHgzMUNDLCAweDVCNDcsIDB4MzJDRCwgMHg1QjQ4LCAweDMyQ0MsCi0gICAgMHg1QjRCLCAweDMzN0MsIDB4NUI0QywgMHgzMzdELCAweDVCNEQsIDB4MzQxMywgMHg1QjRFLCAweDM0ODIsCi0gICAgMHg1QjUwLCAweDAyN0YsIDB4NUI1MSwgMHgwMjgwLCAweDVCNTMsIDB4MDI4MSwgMHg1QjU0LCAweDAyQzYsCi0gICAgMHg1QjU1LCAweDAzMzMsIDB4NUI1NiwgMHgxN0RDLCAweDVCNTcsIDB4MDNCRiwgMHg1QjU4LCAweDAzQzAsCi0gICAgMHg1QjVBLCAweDA0N0YsIDB4NUI1QiwgMHgwNDgwLCAweDVCNUMsIDB4MDQ3RSwgMHg1QjVELCAweDA0N0QsCi0gICAgMHg1QjVGLCAweDA1OTcsIDB4NUI2MiwgMHgxOTU3LCAweDVCNjMsIDB4MDU5OSwgMHg1QjY0LCAweDA1OTgsCi0gICAgMHg1QjY1LCAweDE5NTgsIDB4NUI2OSwgMHgwNzAwLCAweDVCNkIsIDB4MDg5MSwgMHg1QjZDLCAweDFDNzgsCi0gICAgMHg1QjZFLCAweDFFQjgsIDB4NUI3MCwgMHgwQTUxLCAweDVCNzEsIDB4MEMyQSwgMHg1QjcyLCAweDFFQjcsCi0gICAgMHg1QjczLCAweDBDMjksIDB4NUI3NSwgMHgwRkI3LCAweDVCNzcsIDB4MjY1RiwgMHg1Qjc4LCAweDEyQUEsCi0gICAgMHg1QjdBLCAweDEzQzYsIDB4NUI3QiwgMHgyRDU4LCAweDVCN0QsIDB4MTYxMSwgMHg1QjdGLCAweDE2QzAsCi0gICAgMHg1QjgwLCAweDAyMjUsIDB4NUI4MSwgMHgxNzlFLCAweDVCODMsIDB4MDMzNCwgMHg1Qjg0LCAweDE3OUYsCi0gICAgMHg1Qjg1LCAweDAzQzMsIDB4NUI4NywgMHgwM0MxLCAweDVCODgsIDB4MDNDMiwgMHg1Qjg5LCAweDAzQzQsCi0gICAgMHg1QjhCLCAweDA0ODIsIDB4NUI4QywgMHgwNDgxLCAweDVCOEUsIDB4MTg2MywgMHg1QjhGLCAweDA0ODMsCi0gICAgMHg1QjkyLCAweDE4NjQsIDB4NUI5MywgMHgxOTU5LCAweDVCOTUsIDB4MTk1QSwgMHg1Qjk3LCAweDA1OUEsCi0gICAgMHg1Qjk4LCAweDA1OUMsIDB4NUI5OSwgMHgwNTlFLCAweDVCOUEsIDB4MDU5QiwgMHg1QjlCLCAweDA1OUYsCi0gICAgMHg1QjlDLCAweDA1OUQsIDB4NUJBMiwgMHgwNzA0LCAweDVCQTMsIDB4MDcwMSwgMHg1QkE0LCAweDA3MDMsCi0gICAgMHg1QkE1LCAweDA3MDUsIDB4NUJBNiwgMHgwNzAyLCAweDVCQTcsIDB4MUM3OSwgMHg1QkE4LCAweDFBQjMsCi0gICAgMHg1QkFDLCAweDFDN0IsIDB4NUJBRCwgMHgxQzdBLCAweDVCQUUsIDB4MDg5NywgMHg1QkIwLCAweDA4OTMsCi0gICAgMHg1QkIzLCAweDA4OTQsIDB4NUJCNCwgMHgwODk2LCAweDVCQjUsIDB4MDg5OCwgMHg1QkI2LCAweDA4OTUsCi0gICAgMHg1QkI4LCAweDA4OUEsIDB4NUJCOSwgMHgwODk5LCAweDVCQkYsIDB4MEE1NiwgMHg1QkMwLCAweDFFQkEsCi0gICAgMHg1QkMxLCAweDFFQjksIDB4NUJDMiwgMHgwQTU1LCAweDVCQzQsIDB4MEE1NCwgMHg1QkM1LCAweDBBNTMsCi0gICAgMHg1QkM2LCAweDBBNTcsIDB4NUJDNywgMHgwQTUyLCAweDVCQ0EsIDB4MjExMCwgMHg1QkNCLCAweDIxMEQsCi0gICAgMHg1QkNDLCAweDBDMkMsIDB4NUJDRCwgMHgyMTBDLCAweDVCQ0UsIDB4MjExMSwgMHg1QkQwLCAweDBDMkUsCi0gICAgMHg1QkQxLCAweDIxMEYsIDB4NUJEMiwgMHgwQzJCLCAweDVCRDMsIDB4MEMyRCwgMHg1QkQ0LCAweDIxMEUsCi0gICAgMHg1QkQ2LCAweDIzQjcsIDB4NUJEOCwgMHgyM0I4LCAweDVCRDksIDB4MjNCOSwgMHg1QkRFLCAweDBGQjgsCi0gICAgMHg1QkRGLCAweDBGQzAsIDB4NUJFMCwgMHgyNjYwLCAweDVCRTEsIDB4MEZCQSwgMHg1QkUyLCAweDBGQkUsCi0gICAgMHg1QkUzLCAweDI2NjEsIDB4NUJFNCwgMHgwRkJGLCAweDVCRTUsIDB4MEZCQiwgMHg1QkU2LCAweDBGQkMsCi0gICAgMHg1QkU3LCAweDBGQjksIDB4NUJFOCwgMHgwRkJELCAweDVCRTksIDB4MTEzMiwgMHg1QkVBLCAweDIxMEIsCi0gICAgMHg1QkVCLCAweDExMzMsIDB4NUJFQywgMHgxMTMxLCAweDVCRUUsIDB4MTEzMCwgMHg1QkVGLCAweDJCMjgsCi0gICAgMHg1QkYwLCAweDEyQUIsIDB4NUJGMSwgMHgyRDU5LCAweDVCRjIsIDB4MkQ1QSwgMHg1QkY1LCAweDE1N0IsCi0gICAgMHg1QkY2LCAweDE2MTIsIDB4NUJGOCwgMHgwMjgyLCAweDVCRkEsIDB4MDNDNSwgMHg1QzAxLCAweDA3MDYsCi0gICAgMHg1QzAzLCAweDFDN0MsIDB4NUMwNCwgMHgwODlCLCAweDVDMDcsIDB4MEE1QSwgMHg1QzA4LCAweDBBNTksCi0gICAgMHg1QzA5LCAweDBBNTgsIDB4NUMwQSwgMHgwQzJGLCAweDVDMEIsIDB4MEMzMCwgMHg1QzBDLCAweDIxMTIsCi0gICAgMHg1QzBELCAweDBGQzEsIDB4NUMwRSwgMHgxMkFDLCAweDVDMEYsIDB4MDI4MywgMHg1QzEwLCAweDE3ODcsCi0gICAgMHg1QzExLCAweDAyQzcsIDB4NUMxMiwgMHgxN0EwLCAweDVDMTUsIDB4MTdERCwgMHg1QzE2LCAweDAzQzYsCi0gICAgMHg1QzFBLCAweDA1QTAsIDB4NUMxRiwgMHgyM0JBLCAweDVDMjIsIDB4MDI4NCwgMHg1QzI0LCAweDAyQzgsCi0gICAgMHg1QzI1LCAweDE3REUsIDB4NUMyOCwgMHgxODY1LCAweDVDMkEsIDB4MTg2NiwgMHg1QzJDLCAweDA0ODQsCi0gICAgMHg1QzMwLCAweDIxMTMsIDB4NUMzMSwgMHgwQzMxLCAweDVDMzMsIDB4MjNCQiwgMHg1QzM3LCAweDEzQzcsCi0gICAgMHg1QzM4LCAweDAyODUsIDB4NUMzOSwgMHgwMjk5LCAweDVDM0EsIDB4MDJDOSwgMHg1QzNCLCAweDE3QTEsCi0gICAgMHg1QzNDLCAweDAzMzUsIDB4NUMzRSwgMHgwNDg4LCAweDVDM0YsIDB4MDQ4NywgMHg1QzQwLCAweDA0ODUsCi0gICAgMHg1QzQxLCAweDA0ODYsIDB4NUM0NCwgMHgxOTVCLCAweDVDNDUsIDB4MDVBMiwgMHg1QzQ2LCAweDA1QTMsCi0gICAgMHg1QzQ3LCAweDE5NUMsIDB4NUM0OCwgMHgwNUExLCAweDVDNEIsIDB4MDcwQSwgMHg1QzRDLCAweDFBQjQsCi0gICAgMHg1QzRELCAweDA3MDksIDB4NUM0RSwgMHgwNzA3LCAweDVDNEYsIDB4MDcwOCwgMHg1QzUwLCAweDA4OUUsCi0gICAgMHg1QzUxLCAweDA4OUMsIDB4NUM1NCwgMHgxQzdFLCAweDVDNTUsIDB4MDg5RCwgMHg1QzU2LCAweDFDN0QsCi0gICAgMHg1QzU4LCAweDA4OTIsIDB4NUM1OSwgMHgxRUJCLCAweDVDNUMsIDB4MEE1QywgMHg1QzVELCAweDBBNUQsCi0gICAgMHg1QzYwLCAweDBBNUIsIDB4NUM2MiwgMHgwRkMyLCAweDVDNjMsIDB4MjY2MiwgMHg1QzY0LCAweDExMzQsCi0gICAgMHg1QzY1LCAweDExMzUsIDB4NUM2NywgMHgyOEI3LCAweDVDNjgsIDB4MTNDOCwgMHg1QzY5LCAweDJGMTksCi0gICAgMHg1QzZBLCAweDJGMUEsIDB4NUM2QywgMHgxNjZFLCAweDVDNkQsIDB4MzQ4MywgMHg1QzZFLCAweDE3NzYsCi0gICAgMHg1QzZGLCAweDAyQ0EsIDB4NUM3MSwgMHgwMjg2LCAweDVDNzMsIDB4MTdBMywgMHg1Qzc0LCAweDE3QTIsCi0gICAgMHg1Qzc5LCAweDAzQzcsIDB4NUM3QSwgMHgxN0UwLCAweDVDN0IsIDB4MTdFMSwgMHg1QzdDLCAweDE3REYsCi0gICAgMHg1QzdFLCAweDE3RTIsIDB4NUM4NiwgMHgxODZFLCAweDVDODgsIDB4MTg2OSwgMHg1Qzg5LCAweDE4NkIsCi0gICAgMHg1QzhBLCAweDE4NkQsIDB4NUM4QiwgMHgxODZBLCAweDVDOEMsIDB4MDQ4QywgMHg1QzhELCAweDE4NjcsCi0gICAgMHg1QzhGLCAweDE4NjgsIDB4NUM5MCwgMHgwNDg5LCAweDVDOTEsIDB4MDQ4QSwgMHg1QzkyLCAweDE4NkMsCi0gICAgMHg1QzkzLCAweDE4NkYsIDB4NUM5NCwgMHgwNDhCLCAweDVDOTUsIDB4MTg3MCwgMHg1QzlELCAweDE5NkEsCi0gICAgMHg1QzlGLCAweDE5NjQsIDB4NUNBMCwgMHgxOTVGLCAweDVDQTEsIDB4MDVBNSwgMHg1Q0EyLCAweDE5NjcsCi0gICAgMHg1Q0EzLCAweDE5NjUsIDB4NUNBNCwgMHgxOTVFLCAweDVDQTUsIDB4MTk2QiwgMHg1Q0E2LCAweDE5NkUsCi0gICAgMHg1Q0E3LCAweDE5NjksIDB4NUNBOCwgMHgxOTYyLCAweDVDQTksIDB4MDVBNywgMHg1Q0FBLCAweDE5NjgsCi0gICAgMHg1Q0FCLCAweDA1QTgsIDB4NUNBQywgMHgxOTYzLCAweDVDQUQsIDB4MTk2NiwgMHg1Q0FFLCAweDE5NUQsCi0gICAgMHg1Q0FGLCAweDE5NjEsIDB4NUNCMCwgMHgxOTZELCAweDVDQjEsIDB4MDVBOSwgMHg1Q0IzLCAweDA1QUEsCi0gICAgMHg1Q0I1LCAweDE5NjAsIDB4NUNCNiwgMHgxOTZDLCAweDVDQjcsIDB4MDVBNCwgMHg1Q0I4LCAweDA1QTYsCi0gICAgMHg1Q0M2LCAweDFBQzUsIDB4NUNDNywgMHgxQUJFLCAweDVDQzgsIDB4MUFDNCwgMHg1Q0M5LCAweDFBQkQsCi0gICAgMHg1Q0NBLCAweDFBQkYsIDB4NUNDQiwgMHgxQUI5LCAweDVDQ0MsIDB4MUFCNywgMHg1Q0NFLCAweDFBQzYsCi0gICAgMHg1Q0NGLCAweDFBQzMsIDB4NUNEMCwgMHgxQUI1LCAweDVDRDIsIDB4MDcwQywgMHg1Q0QzLCAweDFBQzEsCi0gICAgMHg1Q0Q0LCAweDFBQzIsIDB4NUNENiwgMHgxQUMwLCAweDVDRDcsIDB4MUFCOCwgMHg1Q0Q4LCAweDFBQjYsCi0gICAgMHg1Q0Q5LCAweDA3MEIsIDB4NUNEQSwgMHgxQUJDLCAweDVDREIsIDB4MUFCQSwgMHg1Q0RFLCAweDFBQkIsCi0gICAgMHg1Q0RGLCAweDFBQzcsIDB4NUNFOCwgMHgwOEEzLCAweDVDRUEsIDB4MDhBMiwgMHg1Q0VDLCAweDFDN0YsCi0gICAgMHg1Q0VELCAweDA4OUYsIDB4NUNFRSwgMHgxQzgxLCAweDVDRjAsIDB4MDhBNCwgMHg1Q0YxLCAweDFDODIsCi0gICAgMHg1Q0Y0LCAweDA4QTcsIDB4NUNGNiwgMHgwOEE1LCAweDVDRjcsIDB4MUM4MywgMHg1Q0Y4LCAweDFBQzgsCi0gICAgMHg1Q0Y5LCAweDFDODUsIDB4NUNGQiwgMHgwOEExLCAweDVDRkQsIDB4MDhBMCwgMHg1Q0ZGLCAweDFDODAsCi0gICAgMHg1RDAwLCAweDFDODQsIDB4NUQwMSwgMHgwOEE2LCAweDVEMDYsIDB4MEE1RiwgMHg1RDA3LCAweDBBNUUsCi0gICAgMHg1RDBCLCAweDFFQkQsIDB4NUQwQywgMHgxRUMxLCAweDVEMEQsIDB4MUVDMywgMHg1RDBFLCAweDBBNjAsCi0gICAgMHg1RDBGLCAweDFFQzYsIDB4NUQxMSwgMHgwQTY0LCAweDVEMTIsIDB4MUVDOCwgMHg1RDE0LCAweDBBNjYsCi0gICAgMHg1RDE2LCAweDBBNjIsIDB4NUQxNywgMHgwQTZBLCAweDVEMTksIDB4MEE2NywgMHg1RDFBLCAweDFFQkYsCi0gICAgMHg1RDFCLCAweDBBNjEsIDB4NUQxRCwgMHgxRUJFLCAweDVEMUUsIDB4MUVCQywgMHg1RDFGLCAweDFFQ0EsCi0gICAgMHg1RDIwLCAweDFFQzAsIDB4NUQyMiwgMHgwQTYzLCAweDVEMjMsIDB4MUVDOSwgMHg1RDI0LCAweDBBNjgsCi0gICAgMHg1RDI1LCAweDFFQzUsIDB4NUQyNiwgMHgxRUM0LCAweDVEMjcsIDB4MEE2OSwgMHg1RDI4LCAweDFFQzIsCi0gICAgMHg1RDI5LCAweDBBNjUsIDB4NUQyRSwgMHgxRUNCLCAweDVEMzAsIDB4MUVDNywgMHg1RDMxLCAweDIxMjIsCi0gICAgMHg1RDMyLCAweDIxMjksIDB4NUQzMywgMHgyMTFFLCAweDVEMzQsIDB4MEMzNCwgMHg1RDM1LCAweDIxMUEsCi0gICAgMHg1RDM2LCAweDIxMkEsIDB4NUQzNywgMHgyMTE0LCAweDVEMzgsIDB4MjEyNywgMHg1RDM5LCAweDIxMjUsCi0gICAgMHg1RDNBLCAweDIxMUYsIDB4NUQzQywgMHgyMTI4LCAweDVEM0QsIDB4MjEyMSwgMHg1RDNGLCAweDIxMTksCi0gICAgMHg1RDQwLCAweDIxMkIsIDB4NUQ0MSwgMHgyMTE3LCAweDVENDIsIDB4MjEyNCwgMHg1RDQzLCAweDIxMTUsCi0gICAgMHg1RDQ1LCAweDIxMkMsIDB4NUQ0NywgMHgwQzM1LCAweDVENDksIDB4MjEyNiwgMHg1RDRBLCAweDIzQkUsCi0gICAgMHg1RDRCLCAweDIxMTgsIDB4NUQ0QywgMHgwQzMyLCAweDVENEUsIDB4MjExQywgMHg1RDUwLCAweDBDMzMsCi0gICAgMHg1RDUxLCAweDIxMUIsIDB4NUQ1MiwgMHgyMTIwLCAweDVENTUsIDB4MjExRCwgMHg1RDU5LCAweDIxMjMsCi0gICAgMHg1RDVFLCAweDIzQzIsIDB4NUQ2MiwgMHgyM0M1LCAweDVENjMsIDB4MjNCRCwgMHg1RDY1LCAweDIzQkYsCi0gICAgMHg1RDY3LCAweDIzQzQsIDB4NUQ2OCwgMHgyM0MzLCAweDVENjksIDB4MERGRCwgMHg1RDZCLCAweDIxMTYsCi0gICAgMHg1RDZDLCAweDIzQzEsIDB4NUQ2RiwgMHgwREZFLCAweDVENzEsIDB4MjNCQywgMHg1RDcyLCAweDIzQzAsCi0gICAgMHg1RDc3LCAweDI2NjksIDB4NUQ3OSwgMHgyNjcwLCAweDVEN0EsIDB4MjY2NywgMHg1RDdDLCAweDI2NkUsCi0gICAgMHg1RDdELCAweDI2NjUsIDB4NUQ3RSwgMHgyNjZELCAweDVEN0YsIDB4MjY3MSwgMHg1RDgwLCAweDI2NjQsCi0gICAgMHg1RDgxLCAweDI2NjgsIDB4NUQ4MiwgMHgyNjYzLCAweDVEODQsIDB4MEZDMywgMHg1RDg2LCAweDI2NjYsCi0gICAgMHg1RDg3LCAweDBGQzQsIDB4NUQ4OCwgMHgyNjZDLCAweDVEODksIDB4MjY2QiwgMHg1RDhBLCAweDI2NkEsCi0gICAgMHg1RDhELCAweDI2NkYsIDB4NUQ5MiwgMHgyOEJCLCAweDVEOTMsIDB4MjhCRCwgMHg1RDk0LCAweDExMzcsCi0gICAgMHg1RDk1LCAweDI4QkUsIDB4NUQ5NywgMHgyOEI5LCAweDVEOTksIDB4MjhCOCwgMHg1RDlBLCAweDI4QzIsCi0gICAgMHg1RDlDLCAweDI4QzAsIDB4NUQ5RCwgMHgxMTM2LCAweDVEOUUsIDB4MjhDMywgMHg1RDlGLCAweDI4QkEsCi0gICAgMHg1REEwLCAweDI4QkYsIDB4NURBMSwgMHgyOEMxLCAweDVEQTIsIDB4MjhCQywgMHg1REE3LCAweDJCMkMsCi0gICAgMHg1REE4LCAweDJCMzEsIDB4NURBOSwgMHgyQjJCLCAweDVEQUEsIDB4MkIzMCwgMHg1REFDLCAweDJCMjksCi0gICAgMHg1REFELCAweDJCMzMsIDB4NURBRSwgMHgyQjJGLCAweDVEQUYsIDB4MkIzNCwgMHg1REIwLCAweDJCMkUsCi0gICAgMHg1REIxLCAweDJCMkEsIDB4NURCMiwgMHgyQjMyLCAweDVEQjQsIDB4MkIzNSwgMHg1REI1LCAweDJCMkQsCi0gICAgMHg1REI3LCAweDJENUIsIDB4NURCOCwgMHgxM0NDLCAweDVEQkEsIDB4MTNDQSwgMHg1REJDLCAweDEzQzksCi0gICAgMHg1REJELCAweDEzQ0IsIDB4NURDMCwgMHgyRjFCLCAweDVEQzIsIDB4MzAyMywgMHg1REMzLCAweDMwOEMsCi0gICAgMHg1REM2LCAweDMxQ0QsIDB4NURDNywgMHgzMUNFLCAweDVEQzksIDB4MTYxMywgMHg1RENCLCAweDMyQ0UsCi0gICAgMHg1RENELCAweDE2NkYsIDB4NURDRiwgMHgzMkNGLCAweDVERDEsIDB4MzM3RiwgMHg1REQyLCAweDE2QzIsCi0gICAgMHg1REQ0LCAweDE2QzEsIDB4NURENSwgMHgzMzdFLCAweDVERDYsIDB4MTZGNywgMHg1REQ4LCAweDM0MTQsCi0gICAgMHg1RERCLCAweDAyMjYsIDB4NURERCwgMHgwMjg3LCAweDVEREUsIDB4MDNDOCwgMHg1RERGLCAweDE3RTMsCi0gICAgMHg1REUwLCAweDE4NzEsIDB4NURFMSwgMHgwNTFBLCAweDVERTIsIDB4MEE2QiwgMHg1REU1LCAweDAyODgsCi0gICAgMHg1REU2LCAweDAzMzgsIDB4NURFNywgMHgwMzM3LCAweDVERTgsIDB4MDMzNiwgMHg1REVCLCAweDA0OEQsCi0gICAgMHg1REVFLCAweDA4QTgsIDB4NURGMCwgMHgyM0M2LCAweDVERjEsIDB4MDI4OSwgMHg1REYyLCAweDAyOEEsCi0gICAgMHg1REYzLCAweDAyOEIsIDB4NURGNCwgMHgwMkNCLCAweDVERjcsIDB4MDcwRCwgMHg1REY5LCAweDFBQzksCi0gICAgMHg1REZELCAweDBDMzYsIDB4NURGRSwgMHgwMjhDLCAweDVERkYsIDB4MTc4OCwgMHg1RTAyLCAweDAzMzksCi0gICAgMHg1RTAzLCAweDAzM0EsIDB4NUUwNCwgMHgxN0E0LCAweDVFMDYsIDB4MDNDOSwgMHg1RTBBLCAweDE4NzIsCi0gICAgMHg1RTBDLCAweDA0OEUsIDB4NUUwRSwgMHgxODczLCAweDVFMTEsIDB4MDVCMCwgMHg1RTE0LCAweDE5NzAsCi0gICAgMHg1RTE1LCAweDA1QUUsIDB4NUUxNiwgMHgwNUFELCAweDVFMTcsIDB4MTk2RiwgMHg1RTE4LCAweDA1QUIsCi0gICAgMHg1RTE5LCAweDE5NzEsIDB4NUUxQSwgMHgwNUFDLCAweDVFMUIsIDB4MDVBRiwgMHg1RTFELCAweDA3MEUsCi0gICAgMHg1RTFGLCAweDA3MTAsIDB4NUUyMCwgMHgxQUNELCAweDVFMjEsIDB4MUFDQSwgMHg1RTIyLCAweDFBQ0IsCi0gICAgMHg1RTIzLCAweDFBQ0MsIDB4NUUyNCwgMHgxQUNFLCAweDVFMjUsIDB4MDcwRiwgMHg1RTI4LCAweDFDODcsCi0gICAgMHg1RTI5LCAweDFDODYsIDB4NUUyQiwgMHgwOEFBLCAweDVFMkQsIDB4MDhBOSwgMHg1RTMzLCAweDBBNkUsCi0gICAgMHg1RTM0LCAweDFFQ0QsIDB4NUUzNiwgMHgwQTZELCAweDVFMzcsIDB4MEE2RiwgMHg1RTM4LCAweDBBNkMsCi0gICAgMHg1RTNELCAweDBDMzgsIDB4NUUzRSwgMHgxRUNDLCAweDVFNDAsIDB4MEMzOSwgMHg1RTQxLCAweDIxMkUsCi0gICAgMHg1RTQzLCAweDBDM0EsIDB4NUU0NCwgMHgyMTJELCAweDVFNDUsIDB4MEMzNywgMHg1RTRBLCAweDIzQzksCi0gICAgMHg1RTRCLCAweDIzQ0IsIDB4NUU0QywgMHgwREZGLCAweDVFNEQsIDB4MjNDQSwgMHg1RTRFLCAweDIzQzgsCi0gICAgMHg1RTRGLCAweDIzQzcsIDB4NUU1MywgMHgyNjc0LCAweDVFNTQsIDB4MEZDOSwgMHg1RTU1LCAweDBGQzcsCi0gICAgMHg1RTU3LCAweDBGQzgsIDB4NUU1OCwgMHgyNjcyLCAweDVFNTksIDB4MjY3MywgMHg1RTVCLCAweDBGQzUsCi0gICAgMHg1RTVDLCAweDI4QzcsIDB4NUU1RCwgMHgyOEM1LCAweDVFNUYsIDB4MTEzOSwgMHg1RTYwLCAweDI4QzYsCi0gICAgMHg1RTYxLCAweDExM0EsIDB4NUU2MiwgMHgxMTM4LCAweDVFNjMsIDB4MEZDNiwgMHg1RTY2LCAweDJCMzgsCi0gICAgMHg1RTY3LCAweDJCMzYsIDB4NUU2OCwgMHgyQjM3LCAweDVFNjksIDB4MjhDNCwgMHg1RTZBLCAweDJENUQsCi0gICAgMHg1RTZCLCAweDEzQ0QsIDB4NUU2QywgMHgyRDVDLCAweDVFNkQsIDB4MkYxQywgMHg1RTZFLCAweDJGMUQsCi0gICAgMHg1RTZGLCAweDJCMzksIDB4NUU3MCwgMHgzMDhELCAweDVFNzIsIDB4MDI4RCwgMHg1RTczLCAweDAzM0IsCi0gICAgMHg1RTc0LCAweDAzQ0IsIDB4NUU3NSwgMHgxN0U0LCAweDVFNzYsIDB4MDNDQSwgMHg1RTc4LCAweDA1QjEsCi0gICAgMHg1RTc5LCAweDBFMDAsIDB4NUU3QSwgMHgwMjI3LCAweDVFN0IsIDB4MDJDQywgMHg1RTdDLCAweDAzM0MsCi0gICAgMHg1RTdELCAweDA3MTEsIDB4NUU3RSwgMHgwQzNCLCAweDVFN0YsIDB4MDIyOCwgMHg1RTgwLCAweDE3QTUsCi0gICAgMHg1RTgyLCAweDE3QTYsIDB4NUU4NCwgMHgxN0U1LCAweDVFODcsIDB4MDQ5MCwgMHg1RTg4LCAweDE4NzcsCi0gICAgMHg1RTg5LCAweDE4NzUsIDB4NUU4QSwgMHgwNDkxLCAweDVFOEIsIDB4MTg3NCwgMHg1RThDLCAweDE4NzYsCi0gICAgMHg1RThELCAweDE4NzgsIDB4NUU4RiwgMHgwNDhGLCAweDVFOTUsIDB4MDVCNSwgMHg1RTk2LCAweDA1QjYsCi0gICAgMHg1RTk3LCAweDA1QjMsIDB4NUU5QSwgMHgwNUIyLCAweDVFOUIsIDB4MUFEMiwgMHg1RTlDLCAweDA1QjQsCi0gICAgMHg1RUEwLCAweDA3MTIsIDB4NUVBMiwgMHgxQUQxLCAweDVFQTMsIDB4MUFEMywgMHg1RUE0LCAweDFBRDAsCi0gICAgMHg1RUE1LCAweDFBRDQsIDB4NUVBNiwgMHgwNzEzLCAweDVFQTcsIDB4MDhBRCwgMHg1RUE4LCAweDFDODgsCi0gICAgMHg1RUFBLCAweDFDOEEsIDB4NUVBQiwgMHgwOEFCLCAweDVFQUMsIDB4MUM4QiwgMHg1RUFELCAweDA4QUMsCi0gICAgMHg1RUFFLCAweDFDODksIDB4NUVCMCwgMHgxQUNGLCAweDVFQjEsIDB4MUVDRSwgMHg1RUIyLCAweDFFRDEsCi0gICAgMHg1RUIzLCAweDFFRDIsIDB4NUVCNCwgMHgxRUNGLCAweDVFQjUsIDB4MEE3MywgMHg1RUI2LCAweDBBNzIsCi0gICAgMHg1RUI3LCAweDBBNzAsIDB4NUVCOCwgMHgwQTcxLCAweDVFQjksIDB4MUVEMCwgMHg1RUJFLCAweDBBNzQsCi0gICAgMHg1RUMxLCAweDBDM0QsIDB4NUVDMiwgMHgwQzNFLCAweDVFQzQsIDB4MEMzRiwgMHg1RUM1LCAweDIzQ0MsCi0gICAgMHg1RUM2LCAweDIzQ0UsIDB4NUVDNywgMHgyM0QwLCAweDVFQzgsIDB4MEUwMiwgMHg1RUM5LCAweDBFMDEsCi0gICAgMHg1RUNBLCAweDBDM0MsIDB4NUVDQiwgMHgyM0NGLCAweDVFQ0MsIDB4MjNDRCwgMHg1RUNFLCAweDI2NzgsCi0gICAgMHg1RUQxLCAweDI2NzYsIDB4NUVEMiwgMHgyNjdDLCAweDVFRDMsIDB4MEZDQSwgMHg1RUQ0LCAweDI2N0QsCi0gICAgMHg1RUQ1LCAweDI2N0EsIDB4NUVENiwgMHgwRkNCLCAweDVFRDcsIDB4MjY3NywgMHg1RUQ4LCAweDI2NzUsCi0gICAgMHg1RUQ5LCAweDI2N0IsIDB4NUVEQSwgMHgxMTNDLCAweDVFREIsIDB4MjhDOSwgMHg1RURDLCAweDI2NzksCi0gICAgMHg1RURELCAweDExM0UsIDB4NUVERSwgMHgyOENBLCAweDVFREYsIDB4MTEzRCwgMHg1RUUwLCAweDExNDAsCi0gICAgMHg1RUUxLCAweDI4Q0IsIDB4NUVFMiwgMHgxMTNCLCAweDVFRTMsIDB4MTEzRiwgMHg1RUU1LCAweDJCM0UsCi0gICAgMHg1RUU2LCAweDJCM0MsIDB4NUVFNywgMHgyQjNCLCAweDVFRTgsIDB4MkIzRCwgMHg1RUU5LCAweDJCM0EsCi0gICAgMHg1RUVDLCAweDE1N0QsIDB4NUVFRSwgMHgzMUNGLCAweDVFRUYsIDB4MzFEMCwgMHg1RUYxLCAweDMyRDAsCi0gICAgMHg1RUYyLCAweDMzODAsIDB4NUVGMywgMHgxNzQyLCAweDVFRjQsIDB4MDIyOSwgMHg1RUY2LCAweDA1QjcsCi0gICAgMHg1RUY3LCAweDA0OTIsIDB4NUVGQSwgMHgwNzE0LCAweDVFRkUsIDB4MDI4RSwgMHg1RUZGLCAweDAyQ0QsCi0gICAgMHg1RjAxLCAweDAzM0QsIDB4NUYwMiwgMHgxN0U2LCAweDVGMDQsIDB4MDQ5MywgMHg1RjA1LCAweDE4NzksCi0gICAgMHg1RjA3LCAweDFBRDUsIDB4NUYwOCwgMHgwNzE1LCAweDVGMEEsIDB4MEZDQywgMHg1RjBCLCAweDAyOEYsCi0gICAgMHg1RjBGLCAweDAzQ0MsIDB4NUYxMiwgMHgwRTAzLCAweDVGMTMsIDB4MDI5MCwgMHg1RjE0LCAweDAyQ0UsCi0gICAgMHg1RjE1LCAweDAyQ0YsIDB4NUYxNywgMHgwMzNGLCAweDVGMTgsIDB4MDMzRSwgMHg1RjFBLCAweDE3RTcsCi0gICAgMHg1RjFCLCAweDAzQ0QsIDB4NUYxRCwgMHgxODdBLCAweDVGMUYsIDB4MDQ5NCwgMHg1RjIyLCAweDE5NzMsCi0gICAgMHg1RjIzLCAweDE5NzQsIDB4NUYyNCwgMHgxOTc1LCAweDVGMjYsIDB4MDVCOCwgMHg1RjI3LCAweDA1QjksCi0gICAgMHg1RjI4LCAweDE5NzIsIDB4NUYyOSwgMHgwNUJBLCAweDVGMkQsIDB4MDcxNiwgMHg1RjJFLCAweDFBRDYsCi0gICAgMHg1RjMwLCAweDFDOEQsIDB4NUYzMSwgMHgwOEFFLCAweDVGMzMsIDB4MUM4QywgMHg1RjM1LCAweDBBNzUsCi0gICAgMHg1RjM2LCAweDFFRDMsIDB4NUYzNywgMHgwQTc2LCAweDVGMzgsIDB4MUVENCwgMHg1RjNDLCAweDBDNDAsCi0gICAgMHg1RjQwLCAweDIzRDEsIDB4NUY0MywgMHgyNjdGLCAweDVGNDQsIDB4MjY3RSwgMHg1RjQ2LCAweDBGQ0QsCi0gICAgMHg1RjQ4LCAweDExNDEsIDB4NUY0OSwgMHgyOENDLCAweDVGNEEsIDB4MTJBRCwgMHg1RjRCLCAweDJCM0YsCi0gICAgMHg1RjRDLCAweDEzQ0UsIDB4NUY0RSwgMHgxNkMzLCAweDVGNEYsIDB4MzQxNiwgMHg1RjUwLCAweDAyMkEsCi0gICAgMHg1RjU0LCAweDE5NzYsIDB4NUY1NiwgMHgxQUQ3LCAweDVGNTcsIDB4MEE3NywgMHg1RjU4LCAweDIxMkYsCi0gICAgMHg1RjU5LCAweDBFMDQsIDB4NUY1RCwgMHgxNENGLCAweDVGNjEsIDB4MDIyQiwgMHg1RjYyLCAweDA0OTYsCi0gICAgMHg1RjY0LCAweDA0OTUsIDB4NUY2NSwgMHgwNzE3LCAweDVGNjcsIDB4MUM4RSwgMHg1RjY5LCAweDBBNzksCi0gICAgMHg1RjZBLCAweDBCODksIDB4NUY2QiwgMHgwQTdBLCAweDVGNkMsIDB4MEE3OCwgMHg1RjZELCAweDBDNDEsCi0gICAgMHg1RjZGLCAweDI2ODAsIDB4NUY3MCwgMHgwRkNFLCAweDVGNzEsIDB4MTE0MiwgMHg1RjczLCAweDE3NzcsCi0gICAgMHg1Rjc0LCAweDE3RTgsIDB4NUY3NiwgMHgxODdDLCAweDVGNzcsIDB4MDQ5NywgMHg1Rjc4LCAweDE4N0IsCi0gICAgMHg1Rjc5LCAweDA0OTgsIDB4NUY3QywgMHgwNUJFLCAweDVGN0QsIDB4MTk3OSwgMHg1RjdFLCAweDE5NzgsCi0gICAgMHg1RjdGLCAweDA1QkQsIDB4NUY4MCwgMHgwNUJCLCAweDVGODEsIDB4MDVCQywgMHg1RjgyLCAweDE5NzcsCi0gICAgMHg1Rjg1LCAweDA3MTksIDB4NUY4NiwgMHgxQUQ4LCAweDVGODcsIDB4MDcxQywgMHg1Rjg4LCAweDA3MTgsCi0gICAgMHg1Rjg5LCAweDA3MUUsIDB4NUY4QSwgMHgwNzFBLCAweDVGOEIsIDB4MDcxQiwgMHg1RjhDLCAweDA3MUQsCi0gICAgMHg1RjkwLCAweDA4QjEsIDB4NUY5MSwgMHgwOEIwLCAweDVGOTIsIDB4MDhBRiwgMHg1Rjk2LCAweDFFRDYsCi0gICAgMHg1Rjk3LCAweDBBN0IsIDB4NUY5OCwgMHgwQTdFLCAweDVGOTksIDB4MEE3QywgMHg1RjlCLCAweDFFRDUsCi0gICAgMHg1RjlDLCAweDBBODEsIDB4NUY5RSwgMHgwQTdELCAweDVGOUYsIDB4MUVENywgMHg1RkEwLCAweDBBODAsCi0gICAgMHg1RkExLCAweDBBN0YsIDB4NUZBNSwgMHgyMTMxLCAweDVGQTYsIDB4MjEzMCwgMHg1RkE4LCAweDBDNDQsCi0gICAgMHg1RkE5LCAweDBDNDIsIDB4NUZBQSwgMHgwQzQzLCAweDVGQUIsIDB4MjEzMiwgMHg1RkFDLCAweDBFMDUsCi0gICAgMHg1RkFELCAweDIzRDMsIDB4NUZBRSwgMHgwRTA2LCAweDVGQUYsIDB4MjNEMiwgMHg1RkIyLCAweDI4Q0QsCi0gICAgMHg1RkI1LCAweDExNDQsIDB4NUZCNiwgMHgyNjgxLCAweDVGQjcsIDB4MTE0MywgMHg1RkI5LCAweDBGQ0YsCi0gICAgMHg1RkJCLCAweDJCNDEsIDB4NUZCQywgMHgyQjQwLCAweDVGQkQsIDB4MTNDRiwgMHg1RkJFLCAweDJENUUsCi0gICAgMHg1RkJGLCAweDMwOEUsIDB4NUZDMCwgMHgzMUQxLCAweDVGQzEsIDB4MzFEMiwgMHg1RkMzLCAweDAyRDAsCi0gICAgMHg1RkM1LCAweDAzNDAsIDB4NUZDOSwgMHgxN0E3LCAweDVGQ0MsIDB4MDQ5QSwgMHg1RkNELCAweDA0OUMsCi0gICAgMHg1RkNGLCAweDE3RUIsIDB4NUZEMCwgMHgxODdGLCAweDVGRDEsIDB4MTg3RSwgMHg1RkQyLCAweDE4N0QsCi0gICAgMHg1RkQ0LCAweDE3RUEsIDB4NUZENSwgMHgxN0U5LCAweDVGRDYsIDB4MDNDRiwgMHg1RkQ3LCAweDA0OUIsCi0gICAgMHg1RkQ4LCAweDA0OTksIDB4NUZEOSwgMHgwM0NFLCAweDVGREQsIDB4MDVCRiwgMHg1RkRFLCAweDE5N0EsCi0gICAgMHg1RkUwLCAweDA1QzAsIDB4NUZFMSwgMHgxODg0LCAweDVGRTMsIDB4MTg4NiwgMHg1RkU0LCAweDE4ODUsCi0gICAgMHg1RkU1LCAweDE5N0IsIDB4NUZFOCwgMHgxODgxLCAweDVGRUEsIDB4MDRBMCwgMHg1RkVCLCAweDA0OUUsCi0gICAgMHg1RkVELCAweDE4ODAsIDB4NUZFRSwgMHgxODgyLCAweDVGRUYsIDB4MTg4OCwgMHg1RkYxLCAweDA0OUQsCi0gICAgMHg1RkYzLCAweDE4ODMsIDB4NUZGNCwgMHgxODhDLCAweDVGRjUsIDB4MDVDMiwgMHg1RkY3LCAweDE4ODksCi0gICAgMHg1RkY4LCAweDA0OUYsIDB4NUZGQSwgMHgxODg3LCAweDVGRkIsIDB4MTg4QSwgMHg1RkZELCAweDA1QzEsCi0gICAgMHg1RkZGLCAweDA1QzMsIDB4NjAwMCwgMHgxODhCLCAweDYwMDksIDB4MTk4RiwgMHg2MDBBLCAweDE5ODIsCi0gICAgMHg2MDBCLCAweDE5ODAsIDB4NjAwQywgMHgxOThFLCAweDYwMEQsIDB4MTk4OSwgMHg2MDBFLCAweDA3MjMsCi0gICAgMHg2MDBGLCAweDA1QzQsIDB4NjAxMCwgMHgxOThBLCAweDYwMTEsIDB4MTk4RCwgMHg2MDEyLCAweDA3MUYsCi0gICAgMHg2MDEzLCAweDE5OEMsIDB4NjAxNCwgMHgwNUM1LCAweDYwMTUsIDB4MDVDQSwgMHg2MDE2LCAweDA1QzgsCi0gICAgMHg2MDE3LCAweDE5ODMsIDB4NjAxOSwgMHgxOTdFLCAweDYwMUEsIDB4MTk4NSwgMHg2MDFCLCAweDA1Q0YsCi0gICAgMHg2MDFDLCAweDE5OTAsIDB4NjAxRCwgMHgwNzIwLCAweDYwMUUsIDB4MTk4NiwgMHg2MDIwLCAweDA3MjEsCi0gICAgMHg2MDIxLCAweDA1Q0IsIDB4NjAyMiwgMHgxOTg4LCAweDYwMjQsIDB4MUFFNywgMHg2MDI1LCAweDA3MjIsCi0gICAgMHg2MDI2LCAweDE5N0QsIDB4NjAyNywgMHgwNUNDLCAweDYwMjgsIDB4MDcyNCwgMHg2MDI5LCAweDA1Q0QsCi0gICAgMHg2MDJBLCAweDA1QzksIDB4NjAyQiwgMHgwNUNFLCAweDYwMkMsIDB4MTk4NywgMHg2MDJELCAweDE5N0MsCi0gICAgMHg2MDJFLCAweDE5OEIsIDB4NjAyRiwgMHgwNUM2LCAweDYwMzIsIDB4MTk3RiwgMHg2MDMzLCAweDE5ODQsCi0gICAgMHg2MDM0LCAweDE5ODEsIDB4NjAzNSwgMHgwNUM3LCAweDYwMzcsIDB4MUFEOSwgMHg2MDM5LCAweDFBREEsCi0gICAgMHg2MDQwLCAweDFBRTQsIDB4NjA0MSwgMHgxQzkyLCAweDYwNDIsIDB4MUFFNSwgMHg2MDQzLCAweDA3MkEsCi0gICAgMHg2MDQ0LCAweDFBRTgsIDB4NjA0NSwgMHgxQURFLCAweDYwNDYsIDB4MDcyOSwgMHg2MDQ3LCAweDFBRTAsCi0gICAgMHg2MDQ5LCAweDFBRTEsIDB4NjA0QywgMHgxQUUzLCAweDYwNEQsIDB4MDcyNSwgMHg2MDUwLCAweDA4QjUsCi0gICAgMHg2MDUyLCAweDM2RUMsIDB4NjA1MywgMHgxQURGLCAweDYwNTQsIDB4MUFEQiwgMHg2MDU1LCAweDA4QjYsCi0gICAgMHg2MDU4LCAweDFBRTksIDB4NjA1OSwgMHgwOEIyLCAweDYwNUEsIDB4MUM5MCwgMHg2MDVCLCAweDFBRTIsCi0gICAgMHg2MDVELCAweDFDOEYsIDB4NjA1RSwgMHgxQURELCAweDYwNUYsIDB4MUFFNiwgMHg2MDYyLCAweDA3MjgsCi0gICAgMHg2MDYzLCAweDA4QjMsIDB4NjA2NCwgMHgwNzJFLCAweDYwNjUsIDB4MDhCNCwgMHg2MDY2LCAweDFBRUEsCi0gICAgMHg2MDY3LCAweDFDOTEsIDB4NjA2OCwgMHgwNzI3LCAweDYwNjksIDB4MDhCOCwgMHg2MDZBLCAweDA3MkQsCi0gICAgMHg2MDZCLCAweDA3MkMsIDB4NjA2QywgMHgwNzJCLCAweDYwNkQsIDB4MDhCNywgMHg2MDZFLCAweDFBRUIsCi0gICAgMHg2MDZGLCAweDA4QjksIDB4NjA3MCwgMHgwNzI2LCAweDYwNzIsIDB4MUFEQywgMHg2MDdGLCAweDBBODIsCi0gICAgMHg2MDgwLCAweDFDOTUsIDB4NjA4MSwgMHgxQzk3LCAweDYwODMsIDB4MUM5OSwgMHg2MDg0LCAweDA4QkEsCi0gICAgMHg2MDg1LCAweDA4QzAsIDB4NjA4NiwgMHgxRURBLCAweDYwODcsIDB4MUM5RCwgMHg2MDg4LCAweDFDOTQsCi0gICAgMHg2MDg5LCAweDBBODQsIDB4NjA4QSwgMHgxRUQ4LCAweDYwOEMsIDB4MDhCRiwgMHg2MDhELCAweDA4QkQsCi0gICAgMHg2MDhFLCAweDFDOUYsIDB4NjA5MCwgMHgxRUQ5LCAweDYwOTIsIDB4MUM5NiwgMHg2MDk0LCAweDA4QkUsCi0gICAgMHg2MDk1LCAweDFDOUEsIDB4NjA5NiwgMHgwOEMxLCAweDYwOTcsIDB4MUM5QywgMHg2MDlBLCAweDA4QkMsCi0gICAgMHg2MDlCLCAweDFDOUIsIDB4NjA5QywgMHgxQzlFLCAweDYwOUQsIDB4MUM5OCwgMHg2MDlGLCAweDA4QkIsCi0gICAgMHg2MEEwLCAweDBBODUsIDB4NjBBMiwgMHgxQzkzLCAweDYwQTMsIDB4MEE4MywgMHg2MEE4LCAweDBBODYsCi0gICAgMHg2MEIwLCAweDFFREMsIDB4NjBCMSwgMHgxRUU1LCAweDYwQjIsIDB4MEM0NywgMHg2MEI0LCAweDBBODgsCi0gICAgMHg2MEI1LCAweDBBOEQsIDB4NjBCNiwgMHgwQzQ4LCAweDYwQjcsIDB4MUVFNywgMHg2MEI4LCAweDBBOTQsCi0gICAgMHg2MEI5LCAweDIxMzQsIDB4NjBCQSwgMHgxRURELCAweDYwQkIsIDB4MEE4QywgMHg2MEJDLCAweDBBOEYsCi0gICAgMHg2MEJELCAweDBBOEEsIDB4NjBCRSwgMHgxRURCLCAweDYwQkYsIDB4MUVFOSwgMHg2MEMwLCAweDFFRUMsCi0gICAgMHg2MEMxLCAweDIxNDMsIDB4NjBDMywgMHgxRUVBLCAweDYwQzQsIDB4MjEzOCwgMHg2MEM1LCAweDBBOEIsCi0gICAgMHg2MEM2LCAweDBBOTIsIDB4NjBDNywgMHgwQTk2LCAweDYwQzgsIDB4MUVFNCwgMHg2MEM5LCAweDIxMzMsCi0gICAgMHg2MENBLCAweDFFRTgsIDB4NjBDQiwgMHgwQTg3LCAweDYwQ0MsIDB4MjEzNSwgMHg2MENELCAweDFFRUIsCi0gICAgMHg2MENFLCAweDIxMzcsIDB4NjBDRiwgMHgxRUUwLCAweDYwRDEsIDB4MEM0NSwgMHg2MEQzLCAweDFFREUsCi0gICAgMHg2MEQ0LCAweDFFREYsIDB4NjBENSwgMHgwQTkxLCAweDYwRDgsIDB4MEE5MCwgMHg2MEQ5LCAweDFFRTIsCi0gICAgMHg2MERBLCAweDBBOTUsIDB4NjBEQiwgMHgxRUU2LCAweDYwREMsIDB4MEE4RSwgMHg2MERELCAweDFFRTMsCi0gICAgMHg2MERGLCAweDBBOTMsIDB4NjBFMCwgMHgwQzQ5LCAweDYwRTEsIDB4MEM0NiwgMHg2MEUyLCAweDIxMzYsCi0gICAgMHg2MEU0LCAweDFFRTEsIDB4NjBFNiwgMHgwQTg5LCAweDYwRjAsIDB4MEM0RSwgMHg2MEYxLCAweDBDNTIsCi0gICAgMHg2MEYyLCAweDIxM0EsIDB4NjBGMywgMHgwRTBCLCAweDYwRjQsIDB4MEM1MCwgMHg2MEY1LCAweDIxM0UsCi0gICAgMHg2MEY2LCAweDBDNTQsIDB4NjBGNywgMHgyM0Q0LCAweDYwRjgsIDB4MjE0MCwgMHg2MEY5LCAweDBFMEQsCi0gICAgMHg2MEZBLCAweDBDNEMsIDB4NjBGQiwgMHgwQzRGLCAweDYwRkMsIDB4MjE0MSwgMHg2MEZFLCAweDIxNDIsCi0gICAgMHg2MEZGLCAweDIxNDgsIDB4NjEwMCwgMHgwQzU2LCAweDYxMDEsIDB4MEUwRSwgMHg2MTAzLCAweDIxNDQsCi0gICAgMHg2MTA0LCAweDIxNDksIDB4NjEwNSwgMHgyMTNELCAweDYxMDYsIDB4MEUxOCwgMHg2MTA4LCAweDBFMEYsCi0gICAgMHg2MTA5LCAweDBDNTUsIDB4NjEwQSwgMHgyMTNCLCAweDYxMEIsIDB4MjE0QSwgMHg2MTBELCAweDBFMTcsCi0gICAgMHg2MTBFLCAweDBDNTMsIDB4NjEwRiwgMHgwRTA4LCAweDYxMTAsIDB4MjE0NywgMHg2MTEyLCAweDBDNTcsCi0gICAgMHg2MTEzLCAweDIxM0YsIDB4NjExNCwgMHgyMTM5LCAweDYxMTUsIDB4MEM0RCwgMHg2MTE2LCAweDIxM0MsCi0gICAgMHg2MTE4LCAweDIxNDUsIDB4NjExQSwgMHgwRTA3LCAweDYxMUIsIDB4MEUwQywgMHg2MTFDLCAweDBDNEEsCi0gICAgMHg2MTFELCAweDIxNDYsIDB4NjExRiwgMHgwRTBBLCAweDYxMjMsIDB4MEM0QiwgMHg2MTI3LCAweDBFMTYsCi0gICAgMHg2MTI4LCAweDI2ODMsIDB4NjEyOSwgMHgyM0RGLCAweDYxMkIsIDB4MjNENywgMHg2MTJDLCAweDI2ODIsCi0gICAgMHg2MTJFLCAweDIzREIsIDB4NjEyRiwgMHgyM0RELCAweDYxMzIsIDB4MjNEQSwgMHg2MTM0LCAweDBFMTUsCi0gICAgMHg2MTM2LCAweDIzRDksIDB4NjEzNywgMHgwRTE5LCAweDYxM0IsIDB4MjY5MiwgMHg2MTNFLCAweDBFMTQsCi0gICAgMHg2MTNGLCAweDBGRDEsIDB4NjE0MCwgMHgyM0UwLCAweDYxNDEsIDB4MjY4NCwgMHg2MTQ0LCAweDBFMTIsCi0gICAgMHg2MTQ1LCAweDIzRDgsIDB4NjE0NiwgMHgyM0RDLCAweDYxNDcsIDB4MEZEMCwgMHg2MTQ4LCAweDBFMDksCi0gICAgMHg2MTQ5LCAweDIzRDUsIDB4NjE0QSwgMHgyM0Q2LCAweDYxNEIsIDB4MEZEMiwgMHg2MTRDLCAweDBFMTEsCi0gICAgMHg2MTRELCAweDBFMTMsIDB4NjE0RSwgMHgwRTEwLCAweDYxNEYsIDB4MjNERSwgMHg2MTUyLCAweDI2ODgsCi0gICAgMHg2MTUzLCAweDI2ODksIDB4NjE1NCwgMHgyNjhFLCAweDYxNTUsIDB4MTE0OSwgMHg2MTU2LCAweDI2OTUsCi0gICAgMHg2MTU4LCAweDBGRDgsIDB4NjE1QSwgMHgwRkQ3LCAweDYxNUIsIDB4MjY5MCwgMHg2MTVELCAweDExNDgsCi0gICAgMHg2MTVFLCAweDI2ODUsIDB4NjE1RiwgMHgwRkQ2LCAweDYxNjEsIDB4MjY5NCwgMHg2MTYyLCAweDBGRDQsCi0gICAgMHg2MTYzLCAweDBGRDUsIDB4NjE2NSwgMHgyNjkxLCAweDYxNjYsIDB4MjhERSwgMHg2MTY3LCAweDExNDYsCi0gICAgMHg2MTY4LCAweDBDNTEsIDB4NjE2QSwgMHgyNjkzLCAweDYxNkIsIDB4MTE0RCwgMHg2MTZDLCAweDI2OEIsCi0gICAgMHg2MTZFLCAweDExNDcsIDB4NjE3MCwgMHgxMTRDLCAweDYxNzEsIDB4MjY4NiwgMHg2MTcyLCAweDI2OEEsCi0gICAgMHg2MTczLCAweDI2ODcsIDB4NjE3NCwgMHgyNjhELCAweDYxNzUsIDB4MEZEOSwgMHg2MTc2LCAweDExNDUsCi0gICAgMHg2MTc3LCAweDBGRDMsIDB4NjE3OSwgMHgyOEQwLCAweDYxN0EsIDB4MjY4RiwgMHg2MTdDLCAweDExNEIsCi0gICAgMHg2MTdFLCAweDExNEUsIDB4NjE4MCwgMHgyNjhDLCAweDYxODIsIDB4MTE0QSwgMHg2MTgzLCAweDI4Q0YsCi0gICAgMHg2MTg5LCAweDI4RDQsIDB4NjE4QSwgMHgxMkIxLCAweDYxOEIsIDB4MjhDRSwgMHg2MThDLCAweDJCNEQsCi0gICAgMHg2MThELCAweDI4REQsIDB4NjE4RSwgMHgxMTUyLCAweDYxOTAsIDB4MTE1MCwgMHg2MTkxLCAweDEyQUYsCi0gICAgMHg2MTkyLCAweDI4REEsIDB4NjE5MywgMHgyOEQ2LCAweDYxOTQsIDB4MTE1NiwgMHg2MTk2LCAweDJCNDQsCi0gICAgMHg2MTlBLCAweDExNTQsIDB4NjE5QiwgMHgyOEQ1LCAweDYxOUQsIDB4MkI0MiwgMHg2MTlGLCAweDI4RDksCi0gICAgMHg2MUExLCAweDI4REMsIDB4NjFBMiwgMHgyOEQzLCAweDYxQTQsIDB4MTE1NSwgMHg2MUE3LCAweDExNEYsCi0gICAgMHg2MUE4LCAweDJCNDMsIDB4NjFBOSwgMHgxMkIwLCAweDYxQUEsIDB4MjhEQiwgMHg2MUFCLCAweDExNTEsCi0gICAgMHg2MUFDLCAweDExNTMsIDB4NjFBRCwgMHgyOEQ4LCAweDYxQUUsIDB4MTE1NywgMHg2MUFGLCAweDI4RDcsCi0gICAgMHg2MUIwLCAweDI4RDIsIDB4NjFCMSwgMHgyOEQxLCAweDYxQjIsIDB4MTJBRSwgMHg2MUIzLCAweDI4REYsCi0gICAgMHg2MUI0LCAweDJCNDYsIDB4NjFCNSwgMHgyRDYwLCAweDYxQjYsIDB4MTJCMywgMHg2MUI4LCAweDJCNEMsCi0gICAgMHg2MUJBLCAweDJCNEEsIDB4NjFCQywgMHgyRDYxLCAweDYxQkUsIDB4MTJCNCwgMHg2MUJGLCAweDJCNEIsCi0gICAgMHg2MUMxLCAweDJCNDgsIDB4NjFDMiwgMHgxM0QxLCAweDYxQzMsIDB4MkQ1RiwgMHg2MUM1LCAweDJCNDUsCi0gICAgMHg2MUM2LCAweDJCNDcsIDB4NjFDNywgMHgxM0QyLCAweDYxQzgsIDB4MTJCNiwgMHg2MUM5LCAweDEzRDAsCi0gICAgMHg2MUNBLCAweDEyQjUsIDB4NjFDQiwgMHgxM0Q0LCAweDYxQ0MsIDB4MkI0OSwgMHg2MUNELCAweDEyQjIsCi0gICAgMHg2MUQ2LCAweDJGMjYsIDB4NjFEOCwgMHgyRjFFLCAweDYxREUsIDB4MkQ2NywgMHg2MURGLCAweDJGMUYsCi0gICAgMHg2MUUwLCAweDJENjMsIDB4NjFFMywgMHgxNEQwLCAweDYxRTQsIDB4MkQ2NSwgMHg2MUU1LCAweDJENjQsCi0gICAgMHg2MUU2LCAweDEzRDMsIDB4NjFFNywgMHgyRDYyLCAweDYxRTgsIDB4MkQ2NiwgMHg2MUU5LCAweDJGMjcsCi0gICAgMHg2MUVBLCAweDJGMjMsIDB4NjFFQiwgMHgyRjI1LCAweDYxRUQsIDB4MkYyMCwgMHg2MUVFLCAweDJGMjEsCi0gICAgMHg2MUYwLCAweDJGMjQsIDB4NjFGMSwgMHgyRjIyLCAweDYxRjIsIDB4MTU3RSwgMHg2MUY1LCAweDE1ODEsCi0gICAgMHg2MUY2LCAweDE1ODAsIDB4NjFGNywgMHgxNTdGLCAweDYxRjgsIDB4MTYxNCwgMHg2MUY5LCAweDMxRDMsCi0gICAgMHg2MUZBLCAweDE2MTUsIDB4NjFGQiwgMHgzMDhGLCAweDYxRkMsIDB4MTY3MCwgMHg2MUZELCAweDMyRDEsCi0gICAgMHg2MUZFLCAweDE2NzEsIDB4NjFGRiwgMHgxNkM0LCAweDYyMDAsIDB4MTZGOCwgMHg2MjAxLCAweDM0MTcsCi0gICAgMHg2MjAzLCAweDM0MTgsIDB4NjIwNCwgMHgzNDE5LCAweDYyMDcsIDB4MzUzMywgMHg2MjA4LCAweDAyRDEsCi0gICAgMHg2MjA5LCAweDE3QTgsIDB4NjIwQSwgMHgwMzQxLCAweDYyMEMsIDB4MDNEMSwgMHg2MjBELCAweDAzRDIsCi0gICAgMHg2MjBFLCAweDAzRDAsIDB4NjIxMCwgMHgwM0QzLCAweDYyMTEsIDB4MDRBMiwgMHg2MjEyLCAweDA0QTEsCi0gICAgMHg2MjE0LCAweDE5OTEsIDB4NjIxNSwgMHgwNUQxLCAweDYyMTYsIDB4MDVEMCwgMHg2MjE5LCAweDFDQTAsCi0gICAgMHg2MjFBLCAweDBBOTcsIDB4NjIxQiwgMHgwQTk4LCAweDYyMUYsIDB4MEM1OCwgMHg2MjIwLCAweDIzRTEsCi0gICAgMHg2MjIxLCAweDBFMUEsIDB4NjIyMiwgMHgwRTFCLCAweDYyMjMsIDB4MjNFMywgMHg2MjI0LCAweDIzRTUsCi0gICAgMHg2MjI1LCAweDIzRTQsIDB4NjIyNywgMHgyNjk3LCAweDYyMjksIDB4MjY5NiwgMHg2MjJBLCAweDBGREEsCi0gICAgMHg2MjJCLCAweDI2OTgsIDB4NjIyRCwgMHgyOEUwLCAweDYyMkUsIDB4MTE1OCwgMHg2MjMwLCAweDEyQjcsCi0gICAgMHg2MjMyLCAweDEzRDUsIDB4NjIzMywgMHgxNEQxLCAweDYyMzQsIDB4MTNENiwgMHg2MjM2LCAweDAyRDIsCi0gICAgMHg2MjNBLCAweDE4OEQsIDB4NjIzRCwgMHgxOTkyLCAweDYyM0UsIDB4MDVEMywgMHg2MjNGLCAweDA1RDIsCi0gICAgMHg2MjQwLCAweDA1RDQsIDB4NjI0MSwgMHgwNzJGLCAweDYyNDIsIDB4MUFFQywgMHg2MjQzLCAweDFBRUQsCi0gICAgMHg2MjQ2LCAweDFDQTEsIDB4NjI0NywgMHgwOEMyLCAweDYyNDgsIDB4MEE5OSwgMHg2MjQ5LCAweDBDNTksCi0gICAgMHg2MjRBLCAweDIxNEIsIDB4NjI0QiwgMHgwMkQzLCAweDYyNEQsIDB4MDI5MSwgMHg2MjRFLCAweDAyRDQsCi0gICAgMHg2MjUwLCAweDE3QTksIDB4NjI1MSwgMHgwMzQ1LCAweDYyNTIsIDB4MDM0NCwgMHg2MjUzLCAweDAzNDIsCi0gICAgMHg2MjU0LCAweDAzNDMsIDB4NjI1OCwgMHgwM0Q2LCAweDYyNTksIDB4MTdGMiwgMHg2MjVBLCAweDE3RjQsCi0gICAgMHg2MjVCLCAweDAzRDUsIDB4NjI1QywgMHgxN0VDLCAweDYyNUUsIDB4MTdFRCwgMHg2MjYwLCAweDE3RjMsCi0gICAgMHg2MjYxLCAweDE3RUYsIDB4NjI2MiwgMHgxN0YxLCAweDYyNjMsIDB4MDNENCwgMHg2MjY0LCAweDE3RUUsCi0gICAgMHg2MjY1LCAweDE3RjUsIDB4NjI2NiwgMHgxN0YwLCAweDYyNkQsIDB4MDRBOSwgMHg2MjZFLCAweDA0QjIsCi0gICAgMHg2MjZGLCAweDA0QjAsIDB4NjI3MCwgMHgxODk3LCAweDYyNzEsIDB4MTg5NCwgMHg2MjcyLCAweDE4OUMsCi0gICAgMHg2MjczLCAweDA0QUUsIDB4NjI3NCwgMHgxODlELCAweDYyNzYsIDB4MDRBNywgMHg2Mjc3LCAweDE4OUEsCi0gICAgMHg2Mjc5LCAweDA0QUQsIDB4NjI3QSwgMHgxODk2LCAweDYyN0IsIDB4MTg5NSwgMHg2MjdDLCAweDA0QUIsCi0gICAgMHg2MjdELCAweDE4OUIsIDB4NjI3RSwgMHgwNEFDLCAweDYyN0YsIDB4MDVENSwgMHg2MjgwLCAweDA0QTYsCi0gICAgMHg2MjgxLCAweDE4OTgsIDB4NjI4MywgMHgxODhFLCAweDYyODQsIDB4MDRBMywgMHg2Mjg2LCAweDA0QjYsCi0gICAgMHg2Mjg3LCAweDE4OTMsIDB4NjI4OCwgMHgxODk5LCAweDYyODksIDB4MDRBOCwgMHg2MjhBLCAweDA0QUEsCi0gICAgMHg2MjhDLCAweDE4OEYsIDB4NjI4RSwgMHgxODkwLCAweDYyOEYsIDB4MTg5MSwgMHg2MjkxLCAweDA0QjUsCi0gICAgMHg2MjkyLCAweDA0QUYsIDB4NjI5MywgMHgwNEI0LCAweDYyOTQsIDB4MTg5MiwgMHg2Mjk1LCAweDA0QjMsCi0gICAgMHg2Mjk2LCAweDA0QTUsIDB4NjI5NywgMHgwNEE0LCAweDYyOTgsIDB4MDRCMSwgMHg2MkE4LCAweDA1RTMsCi0gICAgMHg2MkE5LCAweDE5OUUsIDB4NjJBQSwgMHgxOTk3LCAweDYyQUIsIDB4MDVERSwgMHg2MkFDLCAweDA1RjEsCi0gICAgMHg2MkFELCAweDE5OTMsIDB4NjJBRSwgMHgxOTlBLCAweDYyQUYsIDB4MTk5QywgMHg2MkIwLCAweDE5OUYsCi0gICAgMHg2MkIxLCAweDA1RUMsIDB4NjJCMywgMHgxOTlCLCAweDYyQjQsIDB4MTk5NCwgMHg2MkI1LCAweDA1RUEsCi0gICAgMHg2MkI2LCAweDE5OTgsIDB4NjJCOCwgMHgxOUEwLCAweDYyQjksIDB4MDVEQiwgMHg2MkJCLCAweDE5OUQsCi0gICAgMHg2MkJDLCAweDA1RTUsIDB4NjJCRCwgMHgwNUU0LCAweDYyQkUsIDB4MTk5NiwgMHg2MkJGLCAweDA1RDksCi0gICAgMHg2MkMyLCAweDA1REEsIDB4NjJDNCwgMHgwNUQ4LCAweDYyQzYsIDB4MDVGMCwgMHg2MkM3LCAweDA1RTgsCi0gICAgMHg2MkM4LCAweDA1RTIsIDB4NjJDOSwgMHgwNUQ2LCAweDYyQ0EsIDB4MTk5OSwgMHg2MkNCLCAweDA1RTEsCi0gICAgMHg2MkNDLCAweDA1RDcsIDB4NjJDRCwgMHgwNUU5LCAweDYyQ0UsIDB4MDVGMiwgMHg2MkNGLCAweDFBRUUsCi0gICAgMHg2MkQwLCAweDA1RTYsIDB4NjJEMSwgMHgxOTk1LCAweDYyRDIsIDB4MDVEQywgMHg2MkQzLCAweDA1REYsCi0gICAgMHg2MkQ0LCAweDA1RTAsIDB4NjJENiwgMHgwNUVFLCAweDYyRDcsIDB4MDVFRiwgMHg2MkQ4LCAweDA1RUQsCi0gICAgMHg2MkQ5LCAweDA1RTcsIDB4NjJEQSwgMHgwNUVCLCAweDYyREIsIDB4MDVERCwgMHg2MkRDLCAweDA3MzAsCi0gICAgMHg2MkVCLCAweDFBRjQsIDB4NjJFQywgMHgwNzNDLCAweDYyRUQsIDB4MDczNCwgMHg2MkVFLCAweDA3MzYsCi0gICAgMHg2MkVGLCAweDA3M0IsIDB4NjJGMCwgMHgxQjAwLCAweDYyRjEsIDB4MDczOSwgMHg2MkYyLCAweDFDQTIsCi0gICAgMHg2MkYzLCAweDA4QzMsIDB4NjJGNCwgMHgwNzNFLCAweDYyRjUsIDB4MUFGMSwgMHg2MkY2LCAweDFBRjksCi0gICAgMHg2MkY3LCAweDA3M0EsIDB4NjJGOCwgMHgxQUY4LCAweDYyRjksIDB4MUFGNSwgMHg2MkZBLCAweDFBRkQsCi0gICAgMHg2MkZCLCAweDFBRkYsIDB4NjJGQywgMHgwNzMzLCAweDYyRkQsIDB4MDczNywgMHg2MkZFLCAweDA3M0QsCi0gICAgMHg2MkZGLCAweDA4QzUsIDB4NjMwMCwgMHgxQUZBLCAweDYzMDEsIDB4MDczNSwgMHg2MzAyLCAweDA3NDAsCi0gICAgMHg2MzAzLCAweDFBRjMsIDB4NjMwNywgMHgwNzM4LCAweDYzMDgsIDB4MDhDNCwgMHg2MzA5LCAweDA3MzIsCi0gICAgMHg2MzBCLCAweDFBRjAsIDB4NjMwQywgMHgxQUY3LCAweDYzMEQsIDB4MUFFRiwgMHg2MzBFLCAweDFBRjIsCi0gICAgMHg2MzBGLCAweDFBRjYsIDB4NjMxMCwgMHgxQ0EzLCAweDYzMTEsIDB4MDczRiwgMHg2MzEzLCAweDFBRkIsCi0gICAgMHg2MzE0LCAweDFBRkMsIDB4NjMxNSwgMHgxQUZFLCAweDYzMTYsIDB4MDczMSwgMHg2MzI4LCAweDA4RDMsCi0gICAgMHg2MzI5LCAweDFDQUYsIDB4NjMyQSwgMHgwOEQxLCAweDYzMkIsIDB4MDhEMiwgMHg2MzJDLCAweDFDQTUsCi0gICAgMHg2MzJELCAweDFDQjUsIDB4NjMyRiwgMHgwOEM4LCAweDYzMzIsIDB4MUVFRCwgMHg2MzMzLCAweDFDQjcsCi0gICAgMHg2MzM0LCAweDFDQjEsIDB4NjMzNiwgMHgxQ0E4LCAweDYzMzgsIDB4MUNCQSwgMHg2MzM5LCAweDFDQUIsCi0gICAgMHg2MzNBLCAweDA4Q0UsIDB4NjMzQiwgMHgxRjA0LCAweDYzM0MsIDB4MUNBRSwgMHg2MzNELCAweDA4RDAsCi0gICAgMHg2MzNFLCAweDA4QzcsIDB4NjM0MCwgMHgxQ0JDLCAweDYzNDEsIDB4MUNCMCwgMHg2MzQyLCAweDA4Q0EsCi0gICAgMHg2MzQzLCAweDFDQTksIDB4NjM0NCwgMHgxQ0E2LCAweDYzNDUsIDB4MUNBNywgMHg2MzQ2LCAweDA4Q0IsCi0gICAgMHg2MzQ3LCAweDFDQjYsIDB4NjM0OCwgMHgxQ0JELCAweDYzNDksIDB4MDhDRCwgMHg2MzRBLCAweDFDQUQsCi0gICAgMHg2MzRCLCAweDFDQUMsIDB4NjM0QywgMHgwOEQ1LCAweDYzNEQsIDB4MDhENCwgMHg2MzRFLCAweDA4QzYsCi0gICAgMHg2MzRGLCAweDA4Q0MsIDB4NjM1MCwgMHgwOENGLCAweDYzNTEsIDB4MUNCOSwgMHg2MzU0LCAweDFDQjMsCi0gICAgMHg2MzU1LCAweDA4QzksIDB4NjM1NiwgMHgxQ0E0LCAweDYzNTcsIDB4MUNCQiwgMHg2MzU4LCAweDFDQjIsCi0gICAgMHg2MzU5LCAweDFDQjQsIDB4NjM1QSwgMHgxQ0I4LCAweDYzNjUsIDB4MUVFRSwgMHg2MzY3LCAweDBBQTEsCi0gICAgMHg2MzY4LCAweDBBQjUsIDB4NjM2OSwgMHgwQUI0LCAweDYzNkIsIDB4MEFBOSwgMHg2MzZELCAweDFGMDAsCi0gICAgMHg2MzZFLCAweDFFRkMsIDB4NjM2RiwgMHgxRUY5LCAweDYzNzAsIDB4MUYwQiwgMHg2MzcxLCAweDBBQTQsCi0gICAgMHg2MzcyLCAweDBBOUMsIDB4NjM3NSwgMHgxRUZFLCAweDYzNzYsIDB4MEM2OSwgMHg2Mzc3LCAweDBBQTAsCi0gICAgMHg2Mzc4LCAweDFGMDYsIDB4NjM3QSwgMHgwQUI2LCAweDYzN0IsIDB4MEFCMywgMHg2MzdDLCAweDFGMDIsCi0gICAgMHg2MzdELCAweDFFRjEsIDB4NjM4MCwgMHgwQUIyLCAweDYzODEsIDB4MUYwOCwgMHg2MzgyLCAweDFFRjAsCi0gICAgMHg2MzgzLCAweDBBQTcsIDB4NjM4NCwgMHgwQUFCLCAweDYzODUsIDB4MUYwNywgMHg2Mzg3LCAweDFFRkEsCi0gICAgMHg2Mzg4LCAweDBBQUMsIDB4NjM4OSwgMHgwQUE2LCAweDYzOEEsIDB4MUVFRiwgMHg2MzhDLCAweDBDNUIsCi0gICAgMHg2MzhELCAweDFGMEEsIDB4NjM4RSwgMHgxRUY4LCAweDYzOEYsIDB4MEFCMSwgMHg2MzkwLCAweDFFRkIsCi0gICAgMHg2MzkxLCAweDFGMDksIDB4NjM5MiwgMHgwQUIwLCAweDYzOTQsIDB4MjE0QywgMHg2Mzk2LCAweDBBOUQsCi0gICAgMHg2Mzk3LCAweDFFRjYsIDB4NjM5OCwgMHgwQUEyLCAweDYzOTksIDB4MEFBRCwgMHg2MzlCLCAweDBBQTgsCi0gICAgMHg2MzlDLCAweDFFRkYsIDB4NjM5RCwgMHgxRUY1LCAweDYzOUUsIDB4MUVGMywgMHg2MzlGLCAweDFGMDUsCi0gICAgMHg2M0EwLCAweDBBOUEsIDB4NjNBMSwgMHgwQUFFLCAweDYzQTIsIDB4MEE5RSwgMHg2M0EzLCAweDBDNUEsCi0gICAgMHg2M0E0LCAweDFGMDMsIDB4NjNBNSwgMHgwQTlGLCAweDYzQTcsIDB4MEE5QiwgMHg2M0E4LCAweDBBQUEsCi0gICAgMHg2M0E5LCAweDBBQTUsIDB4NjNBQSwgMHgwQUEzLCAweDYzQUIsIDB4MUVGNywgMHg2M0FDLCAweDBBQUYsCi0gICAgMHg2M0FELCAweDFFRjQsIDB4NjNBRSwgMHgxRjAxLCAweDYzQUYsIDB4MUVGRCwgMHg2M0IwLCAweDIxNEUsCi0gICAgMHg2M0IxLCAweDIxNEQsIDB4NjNCRCwgMHgxRUYyLCAweDYzQkUsIDB4MjE1RSwgMHg2M0MwLCAweDBDNUQsCi0gICAgMHg2M0MyLCAweDIxNjQsIDB4NjNDMywgMHgyMTUzLCAweDYzQzQsIDB4MjE2MSwgMHg2M0M1LCAweDIzRTYsCi0gICAgMHg2M0M2LCAweDBDNjAsIDB4NjNDNywgMHgyMTY1LCAweDYzQzgsIDB4MjE2OCwgMHg2M0M5LCAweDBDNUYsCi0gICAgMHg2M0NBLCAweDIxNTYsIDB4NjNDQiwgMHgyMTY3LCAweDYzQ0MsIDB4MjE2NiwgMHg2M0NELCAweDBDNjEsCi0gICAgMHg2M0NFLCAweDIxNEYsIDB4NjNDRiwgMHgwQzVDLCAweDYzRDAsIDB4MEM2NCwgMHg2M0QyLCAweDBDNjIsCi0gICAgMHg2M0QzLCAweDIxNjMsIDB4NjNENSwgMHgyMTU5LCAweDYzRDYsIDB4MEM2NiwgMHg2M0Q3LCAweDIxNkEsCi0gICAgMHg2M0Q4LCAweDIxNjIsIDB4NjNEOSwgMHgyMTZCLCAweDYzREEsIDB4MEM2RSwgMHg2M0RCLCAweDBDNkMsCi0gICAgMHg2M0RDLCAweDIxNjAsIDB4NjNERCwgMHgyMTVGLCAweDYzREYsIDB4MjE1RCwgMHg2M0UwLCAweDIxNTcsCi0gICAgMHg2M0UxLCAweDBDNjUsIDB4NjNFMywgMHgwQzYzLCAweDYzRTQsIDB4MUNBQSwgMHg2M0U1LCAweDIxNTAsCi0gICAgMHg2M0U3LCAweDI0MDQsIDB4NjNFOCwgMHgyMTUxLCAweDYzRTksIDB4MEM1RSwgMHg2M0VBLCAweDBDNkIsCi0gICAgMHg2M0VCLCAweDIzRTgsIDB4NjNFRCwgMHgwQzY3LCAweDYzRUUsIDB4MEM2OCwgMHg2M0VGLCAweDIxNTIsCi0gICAgMHg2M0YwLCAweDIxNjksIDB4NjNGMSwgMHgyM0U3LCAweDYzRjIsIDB4MjE1QSwgMHg2M0YzLCAweDIxNTUsCi0gICAgMHg2M0Y0LCAweDBDNkEsIDB4NjNGNSwgMHgyMTVCLCAweDYzRjYsIDB4MjE1OCwgMHg2M0Y5LCAweDBDNkYsCi0gICAgMHg2NDA2LCAweDBFMkEsIDB4NjQwOSwgMHgyM0VCLCAweDY0MEEsIDB4MjNGRSwgMHg2NDBCLCAweDI0MDMsCi0gICAgMHg2NDBDLCAweDIzRjcsIDB4NjQwRCwgMHgwRTI2LCAweDY0MEUsIDB4MjQwOCwgMHg2NDBGLCAweDBFMjMsCi0gICAgMHg2NDEwLCAweDIzRTksIDB4NjQxMiwgMHgyM0VBLCAweDY0MTMsIDB4MEUxQywgMHg2NDE0LCAweDBFMjUsCi0gICAgMHg2NDE1LCAweDIzRjEsIDB4NjQxNiwgMHgwRTI4LCAweDY0MTcsIDB4MEUyOSwgMHg2NDE4LCAweDIzRjIsCi0gICAgMHg2NDFBLCAweDIzRkYsIDB4NjQxQiwgMHgyNDA1LCAweDY0MUMsIDB4MEUyNCwgMHg2NDFFLCAweDBFMUUsCi0gICAgMHg2NDFGLCAweDIzRjAsIDB4NjQyMCwgMHgyM0VDLCAweDY0MjEsIDB4MjQwNywgMHg2NDIyLCAweDIzRjUsCi0gICAgMHg2NDIzLCAweDIzRjYsIDB4NjQyNCwgMHgyM0VELCAweDY0MjUsIDB4MjQwMSwgMHg2NDI2LCAweDIzRjgsCi0gICAgMHg2NDI3LCAweDI0MDIsIDB4NjQyOCwgMHgyM0ZBLCAweDY0MkEsIDB4MEUxRiwgMHg2NDJCLCAweDI2OTksCi0gICAgMHg2NDJDLCAweDBFMjIsIDB4NjQyRCwgMHgwRTIwLCAweDY0MkUsIDB4MjQwNiwgMHg2NDJGLCAweDIzRkQsCi0gICAgMHg2NDMwLCAweDIzRjksIDB4NjQzMywgMHgyM0VFLCAweDY0MzQsIDB4MEZFNCwgMHg2NDM1LCAweDIzRkMsCi0gICAgMHg2NDM2LCAweDBFMjcsIDB4NjQzNywgMHgyM0Y0LCAweDY0MzksIDB4MjNGMywgMHg2NDNELCAweDBFMjEsCi0gICAgMHg2NDNFLCAweDBFMUQsIDB4NjQzRiwgMHgyNkFFLCAweDY0NDAsIDB4MjQwMCwgMHg2NDQxLCAweDIzRkIsCi0gICAgMHg2NDQzLCAweDIzRUYsIDB4NjQ0QiwgMHgyNkE5LCAweDY0NEQsIDB4MjY5QSwgMHg2NDRFLCAweDI2QTUsCi0gICAgMHg2NDUwLCAweDI2QUMsIDB4NjQ1MSwgMHgwRkUyLCAweDY0NTIsIDB4MEM2RCwgMHg2NDUzLCAweDI2QUEsCi0gICAgMHg2NDU0LCAweDBGREQsIDB4NjQ1OCwgMHgwRkRDLCAweDY0NTksIDB4MjZCMSwgMHg2NDVCLCAweDI2OUIsCi0gICAgMHg2NDVDLCAweDI2QTgsIDB4NjQ1RCwgMHgyNjlDLCAweDY0NUUsIDB4MjZBNywgMHg2NDVGLCAweDBGRTAsCi0gICAgMHg2NDYwLCAweDI2QUIsIDB4NjQ2MSwgMHgyMTVDLCAweDY0NjUsIDB4MjZCMiwgMHg2NDY2LCAweDI2QTMsCi0gICAgMHg2NDY3LCAweDBGRTMsIDB4NjQ2OCwgMHgyOEVFLCAweDY0NjksIDB4MTE1OSwgMHg2NDZCLCAweDI2QjAsCi0gICAgMHg2NDZDLCAweDI2QUYsIDB4NjQ2RCwgMHgwRkU1LCAweDY0NkUsIDB4MjhFMSwgMHg2NDZGLCAweDExNUEsCi0gICAgMHg2NDcwLCAweDI4RTIsIDB4NjQ3MiwgMHgyNjlGLCAweDY0NzMsIDB4MjZBMCwgMHg2NDc0LCAweDI2OUQsCi0gICAgMHg2NDc1LCAweDI2QTIsIDB4NjQ3NiwgMHgyNjlFLCAweDY0NzcsIDB4MjZCMywgMHg2NDc4LCAweDBGREYsCi0gICAgMHg2NDc5LCAweDExNUIsIDB4NjQ3QSwgMHgwRkUxLCAweDY0N0IsIDB4MEZFNiwgMHg2NDdELCAweDI2QTEsCi0gICAgMHg2NDdGLCAweDI2QUQsIDB4NjQ4MiwgMHgyNkE2LCAweDY0ODUsIDB4MjhFNSwgMHg2NDg3LCAweDBGREIsCi0gICAgMHg2NDg4LCAweDExNUUsIDB4NjQ4OSwgMHgyQjU0LCAweDY0OEEsIDB4MjhFQSwgMHg2NDhCLCAweDI4RTksCi0gICAgMHg2NDhDLCAweDI4RUIsIDB4NjQ4RiwgMHgyOEU4LCAweDY0OTAsIDB4MTE1RiwgMHg2NDkyLCAweDExNjUsCi0gICAgMHg2NDkzLCAweDExNjIsIDB4NjQ5NSwgMHgxMTYzLCAweDY0OTYsIDB4MjhFMywgMHg2NDk3LCAweDI4RTYsCi0gICAgMHg2NDk4LCAweDI4RjAsIDB4NjQ5OSwgMHgxMTZCLCAweDY0OUEsIDB4MTE2OSwgMHg2NDlDLCAweDI4RTcsCi0gICAgMHg2NDlELCAweDIxNTQsIDB4NjQ5RSwgMHgxMTVDLCAweDY0OUYsIDB4MjhFRCwgMHg2NEEwLCAweDI4RTQsCi0gICAgMHg2NEEyLCAweDExNkMsIDB4NjRBMywgMHgyOEVDLCAweDY0QTQsIDB4MEZERSwgMHg2NEE1LCAweDExNjEsCi0gICAgMHg2NEE2LCAweDI2QTQsIDB4NjRBOSwgMHgxMTY0LCAweDY0QUIsIDB4MTE2OCwgMHg2NEFDLCAweDExNkEsCi0gICAgMHg2NEFELCAweDExNjcsIDB4NjRBRSwgMHgxMTY2LCAweDY0QjAsIDB4MTE2MCwgMHg2NEIxLCAweDI4RUYsCi0gICAgMHg2NEIyLCAweDExNUQsIDB4NjRCMywgMHgxMTZELCAweDY0QkIsIDB4MTJCQiwgMHg2NEJDLCAweDEyQkMsCi0gICAgMHg2NEJELCAweDJCNTMsIDB4NjRCRSwgMHgxMkM1LCAweDY0QkYsIDB4MTJDMiwgMHg2NEMxLCAweDEyQjksCi0gICAgMHg2NEMyLCAweDEyQzAsIDB4NjRDMywgMHgyQjU1LCAweDY0QzQsIDB4MTJCRSwgMHg2NEM1LCAweDEyQjgsCi0gICAgMHg2NEM3LCAweDEyQkYsIDB4NjRDOSwgMHgyQjUyLCAweDY0Q0EsIDB4MTNEOCwgMHg2NENCLCAweDEyQkEsCi0gICAgMHg2NENELCAweDEyQzEsIDB4NjRDRSwgMHgxM0Q3LCAweDY0Q0YsIDB4MkI1MSwgMHg2NEQwLCAweDJCNTAsCi0gICAgMHg2NEQyLCAweDEyQzMsIDB4NjRENCwgMHgxMkM0LCAweDY0RDYsIDB4MkI0RiwgMHg2NEQ3LCAweDJCNEUsCi0gICAgMHg2NEQ4LCAweDEzRDksIDB4NjREOSwgMHgyQjU4LCAweDY0REEsIDB4MTJCRCwgMHg2NERCLCAweDJCNTYsCi0gICAgMHg2NEUwLCAweDEzREEsIDB4NjRFMiwgMHgxM0RGLCAweDY0RTMsIDB4MkQ2QSwgMHg2NEU0LCAweDJENkMsCi0gICAgMHg2NEU2LCAweDEzREMsIDB4NjRFOCwgMHgyRDZELCAweDY0RTksIDB4MkQ2OSwgMHg2NEVCLCAweDJENkIsCi0gICAgMHg2NEVDLCAweDEzREQsIDB4NjRFRCwgMHgxM0UwLCAweDY0RUYsIDB4MkQ2OCwgMHg2NEYwLCAweDEzREIsCi0gICAgMHg2NEYxLCAweDEzREUsIDB4NjRGMiwgMHgxNEQzLCAweDY0RjMsIDB4MkI1NywgMHg2NEY0LCAweDE0RDIsCi0gICAgMHg2NEY3LCAweDE0RDgsIDB4NjRGOCwgMHgyRjJCLCAweDY0RkEsIDB4MTRENiwgMHg2NEZCLCAweDE0RDcsCi0gICAgMHg2NEZDLCAweDJGMkUsIDB4NjRGRCwgMHgyRjJBLCAweDY0RkUsIDB4MTRENCwgMHg2NEZGLCAweDJGMjgsCi0gICAgMHg2NTAwLCAweDE1ODIsIDB4NjUwMSwgMHgyRjJDLCAweDY1MDMsIDB4MkYyRCwgMHg2NTA0LCAweDJGMjksCi0gICAgMHg2NTA2LCAweDE0RDUsIDB4NjUwNywgMHgzMDkwLCAweDY1MDksIDB4MzA5MywgMHg2NTBDLCAweDMwOTQsCi0gICAgMHg2NTBELCAweDMwOTIsIDB4NjUwRSwgMHgzMDk1LCAweDY1MEYsIDB4MTU4MywgMHg2NTEwLCAweDMwOTEsCi0gICAgMHg2NTEzLCAweDMxRDcsIDB4NjUxNCwgMHgxNjE3LCAweDY1MTUsIDB4MzFENiwgMHg2NTE2LCAweDMxRDUsCi0gICAgMHg2NTE3LCAweDMxRDQsIDB4NjUxOCwgMHgxNjE2LCAweDY1MTksIDB4MTYxOCwgMHg2NTFCLCAweDMyRDIsCi0gICAgMHg2NTFDLCAweDE2NzMsIDB4NjUxRCwgMHgxNjcyLCAweDY1MjAsIDB4MzM4MiwgMHg2NTIxLCAweDMzODEsCi0gICAgMHg2NTIyLCAweDMzODQsIDB4NjUyMywgMHgxNkY5LCAweDY1MjQsIDB4MTZDNSwgMHg2NTI1LCAweDM0MUIsCi0gICAgMHg2NTI2LCAweDMzODMsIDB4NjUyOSwgMHgzNDFBLCAweDY1MkEsIDB4MTZGQiwgMHg2NTJCLCAweDE2RkEsCi0gICAgMHg2NTJDLCAweDE3MjEsIDB4NjUyRCwgMHgzNDg0LCAweDY1MkUsIDB4MzRDQSwgMHg2NTJGLCAweDAyRDUsCi0gICAgMHg2NTMyLCAweDIxNkMsIDB4NjUzMywgMHgyQjU5LCAweDY1MzQsIDB4MDIyQywgMHg2NTM2LCAweDAzRDcsCi0gICAgMHg2NTM3LCAweDE3RjYsIDB4NjUzOCwgMHgwNEI5LCAweDY1MzksIDB4MDRCNywgMHg2NTNCLCAweDA0QjgsCi0gICAgMHg2NTNELCAweDE5QTEsIDB4NjUzRSwgMHgwNUYzLCAweDY1M0YsIDB4MDc0MSwgMHg2NTQxLCAweDFCMDEsCi0gICAgMHg2NTQzLCAweDFCMDIsIDB4NjU0NSwgMHgwNzQyLCAweDY1NDYsIDB4MUNCRiwgMHg2NTQ4LCAweDA4RDYsCi0gICAgMHg2NTQ5LCAweDA4RDcsIDB4NjU0QSwgMHgxQ0JFLCAweDY1NEYsIDB4MEFCRCwgMHg2NTUxLCAweDBBQjksCi0gICAgMHg2NTUzLCAweDFGMEMsIDB4NjU1NCwgMHgwQUMwLCAweDY1NTUsIDB4MEFCRiwgMHg2NTU2LCAweDBBQjgsCi0gICAgMHg2NTU3LCAweDBBQkIsIDB4NjU1OCwgMHgwQUJFLCAweDY1NTksIDB4MEFCQSwgMHg2NTVDLCAweDIxNzAsCi0gICAgMHg2NTVELCAweDBBQjcsIDB4NjU1RSwgMHgwQzcwLCAweDY1NjIsIDB4MEM3MiwgMHg2NTYzLCAweDBDNzMsCi0gICAgMHg2NTY0LCAweDIxNkYsIDB4NjU2NSwgMHgyMTcyLCAweDY1NjYsIDB4MEM3MSwgMHg2NTY3LCAweDIxNkQsCi0gICAgMHg2NTY4LCAweDIxNzEsIDB4NjU2QSwgMHgyMTZFLCAweDY1NkMsIDB4MEUyQiwgMHg2NTZGLCAweDI0MDksCi0gICAgMHg2NTcyLCAweDBGRTcsIDB4NjU3MywgMHgyNkI0LCAweDY1NzQsIDB4MTJDNiwgMHg2NTc1LCAweDExNkUsCi0gICAgMHg2NTc2LCAweDI4RjEsIDB4NjU3NywgMHgxMTZGLCAweDY1NzgsIDB4MTE3MCwgMHg2NTc5LCAweDI4RjMsCi0gICAgMHg2NTdBLCAweDI4RjIsIDB4NjU3QiwgMHgyOEY0LCAweDY1N0MsIDB4MkI1QiwgMHg2NTdGLCAweDJCNUEsCi0gICAgMHg2NTgwLCAweDJENkYsIDB4NjU4MSwgMHgyRDZFLCAweDY1ODIsIDB4MTNFMSwgMHg2NTgzLCAweDEzRTIsCi0gICAgMHg2NTg0LCAweDMwOTYsIDB4NjU4NywgMHgwMkQ2LCAweDY1OEMsIDB4MjE3MywgMHg2NTkwLCAweDBDNzUsCi0gICAgMHg2NTkxLCAweDBDNzQsIDB4NjU5MiwgMHgyNDBBLCAweDY1OTQsIDB4MkYyRiwgMHg2NTk1LCAweDE2NzQsCi0gICAgMHg2NTk2LCAweDM0MUMsIDB4NjU5NywgMHgwMkQ3LCAweDY1OTksIDB4MDhEOCwgMHg2NTlCLCAweDBBQzIsCi0gICAgMHg2NTlDLCAweDBBQzEsIDB4NjU5RCwgMHgyMTc0LCAweDY1OUUsIDB4MjE3NSwgMHg2NTlGLCAweDBFMkMsCi0gICAgMHg2NUEwLCAweDI2QjUsIDB4NjVBMSwgMHgwRkU4LCAweDY1QTIsIDB4MkI1QywgMHg2NUE0LCAweDAyRDgsCi0gICAgMHg2NUE1LCAweDAzNDYsIDB4NjVBNywgMHgwNUY0LCAweDY1QTgsIDB4MTlBMiwgMHg2NUFBLCAweDFCMDMsCi0gICAgMHg2NUFCLCAweDA3NDMsIDB4NjVBQywgMHgwQUMzLCAweDY1QUUsIDB4MjE3NiwgMHg2NUFGLCAweDBDNzYsCi0gICAgMHg2NUIwLCAweDBFMkQsIDB4NjVCMiwgMHgyOEY1LCAweDY1QjMsIDB4MjhGNiwgMHg2NUI2LCAweDJENzAsCi0gICAgMHg2NUI3LCAweDE0RDksIDB4NjVCOCwgMHgzNENCLCAweDY1QjksIDB4MDJEOSwgMHg2NUJCLCAweDE5QTMsCi0gICAgMHg2NUJDLCAweDA1RjUsIDB4NjVCRCwgMHgwNzQ0LCAweDY1QkYsIDB4MUIwNCwgMHg2NUMxLCAweDA4RDksCi0gICAgMHg2NUMyLCAweDFDQzMsIDB4NjVDMywgMHgxQ0MxLCAweDY1QzQsIDB4MUNDMiwgMHg2NUM1LCAweDA4REEsCi0gICAgMHg2NUM2LCAweDFDQzAsIDB4NjVDQiwgMHgwQUM1LCAweDY1Q0MsIDB4MEFDNiwgMHg2NUNELCAweDFGMEQsCi0gICAgMHg2NUNFLCAweDBBQzcsIDB4NjVDRiwgMHgwQUM0LCAweDY1RDAsIDB4MjE3NywgMHg2NUQyLCAweDIxNzgsCi0gICAgMHg2NUQzLCAweDI0MEIsIDB4NjVENiwgMHgwRkVBLCAweDY1RDcsIDB4MEZFOSwgMHg2NURBLCAweDJENzEsCi0gICAgMHg2NURCLCAweDJGMzAsIDB4NjVERCwgMHgzMDk4LCAweDY1REUsIDB4MzA5NywgMHg2NURGLCAweDMxRDgsCi0gICAgMHg2NUUwLCAweDAyMkQsIDB4NjVFMSwgMHgxNzg5LCAweDY1RTIsIDB4MDc0NSwgMHg2NUU1LCAweDAyREEsCi0gICAgMHg2NUU2LCAweDAzNDcsIDB4NjVFOCwgMHgwM0Q5LCAweDY1RTksIDB4MDNEOCwgMHg2NUVDLCAweDAzREEsCi0gICAgMHg2NUVELCAweDAzREIsIDB4NjVFRSwgMHgxN0Y4LCAweDY1RUYsIDB4MTdGNywgMHg2NUYwLCAweDE4OUUsCi0gICAgMHg2NUYxLCAweDA0QkEsIDB4NjVGMiwgMHgxOEExLCAweDY1RjMsIDB4MThBMCwgMHg2NUY0LCAweDE4OUYsCi0gICAgMHg2NUY1LCAweDE4QTIsIDB4NjVGQSwgMHgwNUY2LCAweDY1RkIsIDB4MTlBOSwgMHg2NUZDLCAweDE5QTUsCi0gICAgMHg2NUZELCAweDE5QUUsIDB4NjYwMCwgMHgwNUZELCAweDY2MDIsIDB4MDVGQiwgMHg2NjAzLCAweDE5QUEsCi0gICAgMHg2NjA0LCAweDE5QTYsIDB4NjYwNSwgMHgxOUFELCAweDY2MDYsIDB4MDVGQSwgMHg2NjA3LCAweDA2MDEsCi0gICAgMHg2NjA4LCAweDE5QTgsIDB4NjYwOSwgMHgxOUE0LCAweDY2MEEsIDB4MDYwMCwgMHg2NjBCLCAweDE5QUIsCi0gICAgMHg2NjBDLCAweDA1RjksIDB4NjYwRCwgMHgxOUFDLCAweDY2MEUsIDB4MDVGQywgMHg2NjBGLCAweDA1RkUsCi0gICAgMHg2NjEwLCAweDE5QjAsIDB4NjYxMSwgMHgxOUFGLCAweDY2MTIsIDB4MTlBNywgMHg2NjEzLCAweDA1RjgsCi0gICAgMHg2NjE0LCAweDA1RjcsIDB4NjYxNSwgMHgwNUZGLCAweDY2MUMsIDB4MUIwOSwgMHg2NjFELCAweDFCMEYsCi0gICAgMHg2NjFGLCAweDA3NEIsIDB4NjYyMCwgMHgwNzQ4LCAweDY2MjEsIDB4MUIwNiwgMHg2NjIyLCAweDFCMEIsCi0gICAgMHg2NjI0LCAweDA3NEUsIDB4NjYyNSwgMHgwNzQ2LCAweDY2MjYsIDB4MUIwQSwgMHg2NjI3LCAweDA3NDksCi0gICAgMHg2NjI4LCAweDA3NEMsIDB4NjYyQiwgMHgxQjBELCAweDY2MkQsIDB4MDc0NywgMHg2NjJFLCAweDFCMTIsCi0gICAgMHg2NjJGLCAweDA3NEEsIDB4NjYzMSwgMHgwNzRELCAweDY2MzIsIDB4MUIwNywgMHg2NjMzLCAweDFCMEMsCi0gICAgMHg2NjM0LCAweDFCMTAsIDB4NjYzNSwgMHgxQjA4LCAweDY2MzYsIDB4MUIwNSwgMHg2NjM5LCAweDFCMTEsCi0gICAgMHg2NjNBLCAweDFCMEUsIDB4NjY0MSwgMHgwOEUyLCAweDY2NDIsIDB4MDhEQiwgMHg2NjQzLCAweDA4REUsCi0gICAgMHg2NjQ1LCAweDA4RTEsIDB4NjY0NywgMHgxQ0M2LCAweDY2NDksIDB4MDhEQywgMHg2NjRBLCAweDFDQzQsCi0gICAgMHg2NjRDLCAweDA4RTAsIDB4NjY0RiwgMHgwOERELCAweDY2NTEsIDB4MUNDNywgMHg2NjUyLCAweDA4REYsCi0gICAgMHg2NjU5LCAweDFGMTEsIDB4NjY1QSwgMHgwQUM5LCAweDY2NUIsIDB4MUYxMCwgMHg2NjVDLCAweDFGMTIsCi0gICAgMHg2NjVELCAweDBBQzgsIDB4NjY1RSwgMHgwQUNELCAweDY2NUYsIDB4MUNDNSwgMHg2NjYxLCAweDFGMEYsCi0gICAgMHg2NjYyLCAweDFGMTMsIDB4NjY2NCwgMHgwQUNBLCAweDY2NjUsIDB4MUYwRSwgMHg2NjY2LCAweDBBQ0MsCi0gICAgMHg2NjY4LCAweDBBQ0IsIDB4NjY2QSwgMHgyMTdGLCAweDY2NkMsIDB4MjE3QSwgMHg2NjZFLCAweDBDNzcsCi0gICAgMHg2NjZGLCAweDBDN0IsIDB4NjY3MCwgMHgwQzc4LCAweDY2NzEsIDB4MjE3RCwgMHg2NjcyLCAweDIxODAsCi0gICAgMHg2Njc0LCAweDBDNzksIDB4NjY3NiwgMHgwQzdBLCAweDY2NzcsIDB4MEM3RiwgMHg2Njc4LCAweDI0MTQsCi0gICAgMHg2Njc5LCAweDIxN0UsIDB4NjY3QSwgMHgwQzdELCAweDY2N0IsIDB4MjE3QiwgMHg2NjdDLCAweDIxNzksCi0gICAgMHg2NjdFLCAweDBDN0UsIDB4NjY4MCwgMHgyMTdDLCAweDY2ODQsIDB4MEUzMywgMHg2Njg2LCAweDI0MEMsCi0gICAgMHg2Njg3LCAweDBFMzAsIDB4NjY4OCwgMHgwRTMxLCAweDY2ODksIDB4MEUyRiwgMHg2NjhBLCAweDI0MTEsCi0gICAgMHg2NjhCLCAweDI0MTAsIDB4NjY4QywgMHgyNDBELCAweDY2OEQsIDB4MEUzNSwgMHg2NjkwLCAweDI0MEYsCi0gICAgMHg2NjkxLCAweDBDN0MsIDB4NjY5NCwgMHgyNDEzLCAweDY2OTUsIDB4MjQwRSwgMHg2Njk2LCAweDBFMzIsCi0gICAgMHg2Njk3LCAweDBFMkUsIDB4NjY5OCwgMHgwRTM0LCAweDY2OTksIDB4MjQxMiwgMHg2NjlELCAweDBGRUQsCi0gICAgMHg2NjlGLCAweDI2QjgsIDB4NjZBMCwgMHgyNkI3LCAweDY2QTEsIDB4MjZCNiwgMHg2NkEyLCAweDBGRUIsCi0gICAgMHg2NkE4LCAweDBGRUMsIDB4NjZBOSwgMHgyOEY5LCAweDY2QUEsIDB4MjhGQywgMHg2NkFCLCAweDExNzIsCi0gICAgMHg2NkFFLCAweDExNzEsIDB4NjZBRiwgMHgyOEZELCAweDY2QjAsIDB4MjhGOCwgMHg2NkIxLCAweDExNzQsCi0gICAgMHg2NkIyLCAweDI4RkEsIDB4NjZCNCwgMHgxMTczLCAweDY2QjUsIDB4MjhGNywgMHg2NkI3LCAweDI4RkIsCi0gICAgMHg2NkI4LCAweDEyQ0MsIDB4NjZCOSwgMHgxMkM5LCAweDY2QkEsIDB4MkI2NSwgMHg2NkJCLCAweDJCNjQsCi0gICAgMHg2NkJELCAweDJCNjMsIDB4NjZCRSwgMHgyQjVFLCAweDY2QzAsIDB4MkI1RiwgMHg2NkM0LCAweDEyQ0EsCi0gICAgMHg2NkM2LCAweDEyQzcsIDB4NjZDNywgMHgxMkNCLCAweDY2QzgsIDB4MkI1RCwgMHg2NkM5LCAweDEyQzgsCi0gICAgMHg2NkNBLCAweDJCNjAsIDB4NjZDQiwgMHgyQjYxLCAweDY2Q0MsIDB4MkI2NiwgMHg2NkNGLCAweDJCNjIsCi0gICAgMHg2NkQyLCAweDJENzIsIDB4NjZENiwgMHgxM0U0LCAweDY2RDgsIDB4MkYzMywgMHg2NkQ5LCAweDEzRTMsCi0gICAgMHg2NkRBLCAweDJGMzEsIDB4NjZEQiwgMHgyRjMyLCAweDY2REMsIDB4MTREQSwgMHg2NkRELCAweDE1ODUsCi0gICAgMHg2NkRFLCAweDMwOTksIDB4NjZFMCwgMHgxNTg0LCAweDY2RTMsIDB4MzFEQSwgMHg2NkU0LCAweDMxREIsCi0gICAgMHg2NkU2LCAweDE2MTksIDB4NjZFOCwgMHgzMUQ5LCAweDY2RTksIDB4MTY3NSwgMHg2NkVCLCAweDM0MUQsCi0gICAgMHg2NkVDLCAweDE2RkMsIDB4NjZFRCwgMHgzNDg1LCAweDY2RUUsIDB4MzQ4NiwgMHg2NkYwLCAweDAyREIsCi0gICAgMHg2NkYyLCAweDAzREMsIDB4NjZGMywgMHgwM0RELCAweDY2RjQsIDB4MDRCQiwgMHg2NkY2LCAweDE5QjEsCi0gICAgMHg2NkY3LCAweDA3NEYsIDB4NjZGOCwgMHgwOEUzLCAweDY2RjksIDB4MEFDRSwgMHg2NkZDLCAweDBBMUYsCi0gICAgMHg2NkZFLCAweDBDODAsIDB4NjZGRiwgMHgwQzgxLCAweDY3MDAsIDB4MEJGMCwgMHg2NzAxLCAweDIxODEsCi0gICAgMHg2NzAzLCAweDBFMzYsIDB4NjcwNCwgMHgyNkJBLCAweDY3MDUsIDB4MjZCOSwgMHg2NzA4LCAweDAyREMsCi0gICAgMHg2NzA5LCAweDAzREUsIDB4NjcwQSwgMHgxOUIyLCAweDY3MEIsIDB4MDYwMywgMHg2NzBELCAweDA2MDIsCi0gICAgMHg2NzBGLCAweDFCMTMsIDB4NjcxMCwgMHgxQjE0LCAweDY3MTIsIDB4MUNDOCwgMHg2NzEzLCAweDFDQzksCi0gICAgMHg2NzE0LCAweDA4RTQsIDB4NjcxNSwgMHgwOEU1LCAweDY3MTcsIDB4MDhFNiwgMHg2NzE4LCAweDFGMTQsCi0gICAgMHg2NzFCLCAweDBBRDAsIDB4NjcxRCwgMHgwQzgzLCAweDY3MUYsIDB4MEM4MiwgMHg2NzIwLCAweDI0MTUsCi0gICAgMHg2NzIxLCAweDI1MjIsIDB4NjcyMiwgMHgyNkJCLCAweDY3MjMsIDB4MkI2NywgMHg2NzI2LCAweDE0REIsCi0gICAgMHg2NzI3LCAweDE2MUEsIDB4NjcyOCwgMHgwMkRELCAweDY3MkEsIDB4MDM0QSwgMHg2NzJCLCAweDAzNEIsCi0gICAgMHg2NzJDLCAweDAzNDksIDB4NjcyRCwgMHgwMzRDLCAweDY3MkUsIDB4MDM0OCwgMHg2NzMxLCAweDAzRTEsCi0gICAgMHg2NzMzLCAweDE4MDAsIDB4NjczNCwgMHgwM0UwLCAweDY3MzUsIDB4MDNFMiwgMHg2NzM4LCAweDE3RkIsCi0gICAgMHg2NzM5LCAweDE3RkEsIDB4NjczQSwgMHgxN0ZELCAweDY3M0IsIDB4MTdGQywgMHg2NzNDLCAweDE3RkYsCi0gICAgMHg2NzNELCAweDAzREYsIDB4NjczRSwgMHgxN0Y5LCAweDY3M0YsIDB4MTdGRSwgMHg2NzQ1LCAweDE4QTMsCi0gICAgMHg2NzQ2LCAweDA0QzUsIDB4Njc0NywgMHgxOEE0LCAweDY3NDgsIDB4MThBOCwgMHg2NzQ5LCAweDA0QzQsCi0gICAgMHg2NzRCLCAweDE4QUMsIDB4Njc0QywgMHgxOEE3LCAweDY3NEQsIDB4MThBQSwgMHg2NzRFLCAweDA0QkQsCi0gICAgMHg2NzRGLCAweDA0QkUsIDB4Njc1MCwgMHgwNEJGLCAweDY3NTEsIDB4MDRDMCwgMHg2NzUzLCAweDA0QzcsCi0gICAgMHg2NzU1LCAweDE4QTYsIDB4Njc1NiwgMHgwNEMyLCAweDY3NTcsIDB4MDRDOCwgMHg2NzU5LCAweDE4QTUsCi0gICAgMHg2NzVBLCAweDE4QUIsIDB4Njc1QywgMHgwNEMxLCAweDY3NUQsIDB4MThBOSwgMHg2NzVFLCAweDA0QzMsCi0gICAgMHg2NzVGLCAweDA0QkMsIDB4Njc2MCwgMHgwNEM2LCAweDY3NkEsIDB4MDYxOCwgMHg2NzZDLCAweDE5QjQsCi0gICAgMHg2NzZELCAweDA2MDQsIDB4Njc2RiwgMHgwNjBFLCAweDY3NzAsIDB4MDYwRiwgMHg2NzcxLCAweDA2MDcsCi0gICAgMHg2NzcyLCAweDA2MTksIDB4Njc3MywgMHgwNjA5LCAweDY3NzQsIDB4MTlCQywgMHg2Nzc1LCAweDA2MTQsCi0gICAgMHg2Nzc2LCAweDE5QjcsIDB4Njc3NywgMHgwNjBBLCAweDY3NzgsIDB4MTlDNiwgMHg2Nzc5LCAweDE5QzcsCi0gICAgMHg2NzdBLCAweDE5QkYsIDB4Njc3QiwgMHgxOUI4LCAweDY3N0MsIDB4MDYxNywgMHg2NzdELCAweDE5QzQsCi0gICAgMHg2NzdFLCAweDA2MTIsIDB4Njc3RiwgMHgwNjEwLCAweDY3ODEsIDB4MTlDNSwgMHg2NzgzLCAweDE5QzMsCi0gICAgMHg2Nzg0LCAweDE5QkIsIDB4Njc4NSwgMHgxOUIzLCAweDY3ODYsIDB4MTlCQSwgMHg2Nzg3LCAweDA2MEIsCi0gICAgMHg2Nzg5LCAweDA2MTEsIDB4Njc4QiwgMHgwNjA1LCAweDY3OEMsIDB4MTlCRSwgMHg2NzhELCAweDE5QkQsCi0gICAgMHg2NzhFLCAweDE5QjUsIDB4Njc5MCwgMHgwNjEzLCAweDY3OTEsIDB4MTlDMSwgMHg2NzkyLCAweDE5QjYsCi0gICAgMHg2NzkzLCAweDA2MTYsIDB4Njc5NCwgMHgxOUM4LCAweDY3OTUsIDB4MDYwNiwgMHg2Nzk3LCAweDA2MEQsCi0gICAgMHg2Nzk4LCAweDE5QjksIDB4Njc5OSwgMHgxOUMyLCAweDY3OUEsIDB4MDYxNSwgMHg2NzlDLCAweDA2MDgsCi0gICAgMHg2NzlELCAweDA2MEMsIDB4Njc5RiwgMHgxOUMwLCAweDY3QUUsIDB4MUIzNCwgMHg2N0FGLCAweDA3NTcsCi0gICAgMHg2N0IwLCAweDA3NjQsIDB4NjdCMiwgMHgxQjJGLCAweDY3QjMsIDB4MUIyNSwgMHg2N0I0LCAweDA3NUQsCi0gICAgMHg2N0I1LCAweDFCMjMsIDB4NjdCNiwgMHgwNzU2LCAweDY3QjcsIDB4MUIxRSwgMHg2N0I4LCAweDA3NjAsCi0gICAgMHg2N0I5LCAweDFCMkIsIDB4NjdCQSwgMHgxQjE4LCAweDY3QkIsIDB4MUIxQSwgMHg2N0MwLCAweDFCMUQsCi0gICAgMHg2N0MxLCAweDFCMTUsIDB4NjdDMiwgMHgxQjJBLCAweDY3QzMsIDB4MUIzQSwgMHg2N0M0LCAweDA3NUIsCi0gICAgMHg2N0M1LCAweDFCMUYsIDB4NjdDNiwgMHgxQjMxLCAweDY3QzgsIDB4MUIxNywgMHg2N0M5LCAweDFCMzgsCi0gICAgMHg2N0NBLCAweDFCMzksIDB4NjdDQiwgMHgxQjNDLCAweDY3Q0MsIDB4MUIzMywgMHg2N0NELCAweDFCMjQsCi0gICAgMHg2N0NFLCAweDFCMkMsIDB4NjdDRiwgMHgwNzYxLCAweDY3RDAsIDB4MDc1NCwgMHg2N0QxLCAweDA3NUMsCi0gICAgMHg2N0QyLCAweDA3NjgsIDB4NjdEMywgMHgwNzUxLCAweDY3RDQsIDB4MDc1MywgMHg2N0Q4LCAweDFCMUMsCi0gICAgMHg2N0Q5LCAweDA3NjUsIDB4NjdEQSwgMHgwNzVFLCAweDY3REIsIDB4MUIzNiwgMHg2N0RDLCAweDFCMTksCi0gICAgMHg2N0RELCAweDA3NjcsIDB4NjdERSwgMHgwNzYyLCAweDY3REYsIDB4MUIyMiwgMHg2N0UyLCAweDA3NjYsCi0gICAgMHg2N0UzLCAweDFCMjksIDB4NjdFNCwgMHgxQjIxLCAweDY3RTUsIDB4MDc1RiwgMHg2N0U2LCAweDFCMzUsCi0gICAgMHg2N0U3LCAweDFCMkQsIDB4NjdFOSwgMHgwNzU5LCAweDY3RUEsIDB4MUIzQiwgMHg2N0VCLCAweDFCMjAsCi0gICAgMHg2N0VDLCAweDA3NTUsIDB4NjdFRCwgMHgxQjMyLCAweDY3RUUsIDB4MUIyOCwgMHg2N0VGLCAweDA3NUEsCi0gICAgMHg2N0YwLCAweDFCMkUsIDB4NjdGMSwgMHgwNzUyLCAweDY3RjIsIDB4MUIxNiwgMHg2N0YzLCAweDA3NjMsCi0gICAgMHg2N0Y0LCAweDA4RjUsIDB4NjdGNSwgMHgwNzU4LCAweDY3RjYsIDB4MUIyNywgMHg2N0Y3LCAweDFCMjYsCi0gICAgMHg2N0Y4LCAweDFCMUIsIDB4NjdGQSwgMHgxQjM3LCAweDY3RkMsIDB4MUIzMCwgMHg2N0ZGLCAweDA3NTAsCi0gICAgMHg2ODEyLCAweDFDREQsIDB4NjgxMywgMHgwOEZDLCAweDY4MTQsIDB4MUNERSwgMHg2ODE2LCAweDFDRDIsCi0gICAgMHg2ODE3LCAweDA4RjEsIDB4NjgxOCwgMHgwOEZELCAweDY4MUEsIDB4MUNDQiwgMHg2ODFDLCAweDFDRDQsCi0gICAgMHg2ODFELCAweDFDREMsIDB4NjgxRiwgMHgxQ0NBLCAweDY4MjAsIDB4MUNFNSwgMHg2ODIxLCAweDA4RTcsCi0gICAgMHg2ODI1LCAweDFDRTQsIDB4NjgyNiwgMHgxQ0RGLCAweDY4MjgsIDB4MUNFMCwgMHg2ODI5LCAweDA4RUYsCi0gICAgMHg2ODJBLCAweDA4RkEsIDB4NjgyQiwgMHgxQ0Q2LCAweDY4MkQsIDB4MUNENywgMHg2ODJFLCAweDFDRTEsCi0gICAgMHg2ODJGLCAweDFDRDgsIDB4NjgzMSwgMHgxQ0QzLCAweDY4MzIsIDB4MUNDRCwgMHg2ODMzLCAweDFDQ0UsCi0gICAgMHg2ODM0LCAweDFDREIsIDB4NjgzNSwgMHgxQ0Q1LCAweDY4MzgsIDB4MDhFOCwgMHg2ODM5LCAweDA4RUMsCi0gICAgMHg2ODNBLCAweDFDRTMsIDB4NjgzQiwgMHgxQ0NGLCAweDY4M0MsIDB4MDhGOCwgMHg2ODNELCAweDA4RjQsCi0gICAgMHg2ODQwLCAweDA4RjcsIDB4Njg0MSwgMHgwOEZFLCAweDY4NDIsIDB4MDhFRCwgMHg2ODQzLCAweDA4RjksCi0gICAgMHg2ODQ0LCAweDFDREEsIDB4Njg0NSwgMHgwOEZCLCAweDY4NDYsIDB4MDhFQSwgMHg2ODQ4LCAweDA4RTksCi0gICAgMHg2ODQ5LCAweDFDQ0MsIDB4Njg0QiwgMHgxQ0QwLCAweDY4NEMsIDB4MDhGMiwgMHg2ODRELCAweDFDRTIsCi0gICAgMHg2ODRFLCAweDFDRDksIDB4Njg0RiwgMHgxQ0QxLCAweDY4NTAsIDB4MDhGNiwgMHg2ODUxLCAweDA4RjMsCi0gICAgMHg2ODUzLCAweDA4RUIsIDB4Njg1NCwgMHgwOEVFLCAweDY4NkIsIDB4MUYyOSwgMHg2ODZELCAweDFGMTksCi0gICAgMHg2ODZFLCAweDFGMUEsIDB4Njg2RiwgMHgxRjFFLCAweDY4NzEsIDB4MUYyRCwgMHg2ODcyLCAweDFGMkEsCi0gICAgMHg2ODc0LCAweDFGMjMsIDB4Njg3NSwgMHgxRjIyLCAweDY4NzYsIDB4MEFENywgMHg2ODc3LCAweDFGMjYsCi0gICAgMHg2ODc4LCAweDFGMzUsIDB4Njg3OSwgMHgxRjE1LCAweDY4N0IsIDB4MUYzNiwgMHg2ODdDLCAweDFGMjgsCi0gICAgMHg2ODdELCAweDFGM0EsIDB4Njg3RSwgMHgxRjJFLCAweDY4N0YsIDB4MEFENiwgMHg2ODgwLCAweDFGMkMsCi0gICAgMHg2ODgxLCAweDBBRDEsIDB4Njg4MiwgMHgwQUU2LCAweDY4ODMsIDB4MEFEQywgMHg2ODg1LCAweDBBRTAsCi0gICAgMHg2ODg2LCAweDBBREYsIDB4Njg4NywgMHgxRjE2LCAweDY4ODksIDB4MUYzMywgMHg2ODhBLCAweDFGMzksCi0gICAgMHg2ODhCLCAweDFGMzEsIDB4Njg4QywgMHgxRjM4LCAweDY4OEYsIDB4MUYyNSwgMHg2ODkwLCAweDFGMTcsCi0gICAgMHg2ODkxLCAweDFGMzcsIDB4Njg5MiwgMHgxRjI3LCAweDY4OTMsIDB4MEFENCwgMHg2ODk0LCAweDBBRTEsCi0gICAgMHg2ODk2LCAweDFGMzAsIDB4Njg5NywgMHgwQURBLCAweDY4OUIsIDB4MUYyRiwgMHg2ODlDLCAweDFGMTgsCi0gICAgMHg2ODlELCAweDBBRTIsIDB4Njg5RiwgMHgwQUU0LCAweDY4QTAsIDB4MUYzMiwgMHg2OEExLCAweDBBRTUsCi0gICAgMHg2OEEyLCAweDBBRDMsIDB4NjhBMywgMHgxRjFGLCAweDY4QTQsIDB4MUYzNCwgMHg2OEE3LCAweDBBRDksCi0gICAgMHg2OEE4LCAweDBBRTMsIDB4NjhBOSwgMHgxRjIxLCAweDY4QUEsIDB4MUYyQiwgMHg2OEFCLCAweDFGMUMsCi0gICAgMHg2OEFDLCAweDFGMjAsIDB4NjhBRCwgMHgwQURFLCAweDY4QUUsIDB4MUYxQiwgMHg2OEFGLCAweDBBRDIsCi0gICAgMHg2OEIwLCAweDBBREIsIDB4NjhCMSwgMHgwQUQ4LCAweDY4QjIsIDB4MUYyNCwgMHg2OEIzLCAweDA4RjAsCi0gICAgMHg2OEI0LCAweDIxOTgsIDB4NjhCNSwgMHgwQUQ1LCAweDY4QzQsIDB4MEFERCwgMHg2OEM2LCAweDIxOUIsCi0gICAgMHg2OEM3LCAweDIxQjEsIDB4NjhDOCwgMHgyMUE2LCAweDY4QzksIDB4MEM5NywgMHg2OENCLCAweDBDOTIsCi0gICAgMHg2OENDLCAweDIxOTUsIDB4NjhDRCwgMHgwQzkzLCAweDY4Q0UsIDB4MjFBNSwgMHg2OEQwLCAweDIxOUUsCi0gICAgMHg2OEQxLCAweDIxQUIsIDB4NjhEMiwgMHgwQzhGLCAweDY4RDMsIDB4MjE4MywgMHg2OEQ0LCAweDIxQUQsCi0gICAgMHg2OEQ1LCAweDBDODUsIDB4NjhENiwgMHgyMThCLCAweDY4RDcsIDB4MEM4OCwgMHg2OEQ4LCAweDBDODcsCi0gICAgMHg2OERBLCAweDBDOTgsIDB4NjhEQywgMHgyMTg1LCAweDY4REQsIDB4MjFBNywgMHg2OERFLCAweDIxQTgsCi0gICAgMHg2OERGLCAweDBDOEEsIDB4NjhFMCwgMHgwQzg2LCAweDY4RTEsIDB4MjE5MywgMHg2OEUzLCAweDBDOTEsCi0gICAgMHg2OEU0LCAweDIxOEUsIDB4NjhFNiwgMHgyMUE5LCAweDY4RTcsIDB4MEM4RCwgMHg2OEU4LCAweDIxQTEsCi0gICAgMHg2OEU5LCAweDIxQUUsIDB4NjhFQSwgMHgyMTg4LCAweDY4RUIsIDB4MjE4RCwgMHg2OEVDLCAweDIxODcsCi0gICAgMHg2OEVFLCAweDBDOEMsIDB4NjhFRiwgMHgyMTlBLCAweDY4RjAsIDB4MjQyQiwgMHg2OEYxLCAweDIxODksCi0gICAgMHg2OEYyLCAweDBDOTAsIDB4NjhGMywgMHgyMTkyLCAweDY4RjQsIDB4MjFBQSwgMHg2OEY1LCAweDBDOEIsCi0gICAgMHg2OEY2LCAweDIxOEYsIDB4NjhGNywgMHgyMThDLCAweDY4RjgsIDB4MjE5RCwgMHg2OEY5LCAweDBDOEUsCi0gICAgMHg2OEZBLCAweDBDODQsIDB4NjhGQiwgMHgwQzlBLCAweDY4RkMsIDB4MjFBMCwgMHg2OEZELCAweDIxOUYsCi0gICAgMHg2OTA0LCAweDIxODQsIDB4NjkwNSwgMHgwQzg5LCAweDY5MDYsIDB4MjFBQywgMHg2OTA3LCAweDIxOTQsCi0gICAgMHg2OTA4LCAweDIxOTYsIDB4NjkwQSwgMHgyMUEzLCAweDY5MEIsIDB4MjFBMiwgMHg2OTBDLCAweDIxODIsCi0gICAgMHg2OTBELCAweDBDOTQsIDB4NjkwRSwgMHgwQzk2LCAweDY5MEYsIDB4MjE4QSwgMHg2OTEwLCAweDIxOTEsCi0gICAgMHg2OTExLCAweDIxOTksIDB4NjkxMiwgMHgwQzk1LCAweDY5MTMsIDB4MjE5MCwgMHg2OTE0LCAweDIxOUMsCi0gICAgMHg2OTE1LCAweDIxQUYsIDB4NjkxNywgMHgyMUE0LCAweDY5MjUsIDB4MjFCMCwgMHg2OTJBLCAweDIxODYsCi0gICAgMHg2OTJGLCAweDI0M0YsIDB4NjkzMCwgMHgwRTNFLCAweDY5MzIsIDB4MjQzRCwgMHg2OTMzLCAweDI0MjgsCi0gICAgMHg2OTM0LCAweDI0MkQsIDB4NjkzNSwgMHgyNDI2LCAweDY5MzcsIDB4MjQzOSwgMHg2OTM4LCAweDI0MTgsCi0gICAgMHg2OTM5LCAweDI0MUYsIDB4NjkzQiwgMHgyNDM3LCAweDY5M0MsIDB4MjQ0MSwgMHg2OTNELCAweDI0MjksCi0gICAgMHg2OTNGLCAweDI0MUMsIDB4Njk0MCwgMHgyNDJGLCAweDY5NDEsIDB4MjQzNCwgMHg2OTQyLCAweDI0MjAsCi0gICAgMHg2OTQ0LCAweDI0MzEsIDB4Njk0NSwgMHgyNDFELCAweDY5NDgsIDB4MjQyNCwgMHg2OTQ5LCAweDI0MjUsCi0gICAgMHg2OTRBLCAweDBFNDAsIDB4Njk0QiwgMHgyNDM4LCAweDY5NEMsIDB4MjQzNiwgMHg2OTRFLCAweDI0MTksCi0gICAgMHg2OTRGLCAweDI0M0IsIDB4Njk1MSwgMHgyNDNDLCAweDY5NTIsIDB4MjQzRSwgMHg2OTUzLCAweDBFNDQsCi0gICAgMHg2OTU0LCAweDBFM0MsIDB4Njk1NiwgMHgxRjFELCAweDY5NTcsIDB4MjQyMSwgMHg2OTU4LCAweDI0MzMsCi0gICAgMHg2OTU5LCAweDI0MjIsIDB4Njk1QSwgMHgwRTM5LCAweDY5NUIsIDB4MEU0OSwgMHg2OTVDLCAweDI0M0EsCi0gICAgMHg2OTVELCAweDBFNDcsIDB4Njk1RSwgMHgwRTQzLCAweDY5NUYsIDB4MjQxNywgMHg2OTYwLCAweDBFM0IsCi0gICAgMHg2OTYyLCAweDI0MUEsIDB4Njk2MywgMHgwRTQ4LCAweDY5NjUsIDB4MjQyQSwgMHg2OTY2LCAweDI0MTYsCi0gICAgMHg2OTY4LCAweDBFNDEsIDB4Njk2OSwgMHgyNDJFLCAweDY5NkEsIDB4MjQxRSwgMHg2OTZCLCAweDBFNDIsCi0gICAgMHg2OTZDLCAweDI0MjcsIDB4Njk2RCwgMHgwRTM4LCAweDY5NkUsIDB4MEM5OSwgMHg2OTZGLCAweDI0MzAsCi0gICAgMHg2OTcwLCAweDIxOTcsIDB4Njk3MSwgMHgyNDFCLCAweDY5NzQsIDB4MjQzNSwgMHg2OTc1LCAweDBFM0QsCi0gICAgMHg2OTc2LCAweDI0MzIsIDB4Njk3NywgMHgwRTNBLCAweDY5NzgsIDB4MjQyQywgMHg2OTc5LCAweDBFNDUsCi0gICAgMHg2OTdBLCAweDI0MjMsIDB4Njk3QiwgMHgyNDQwLCAweDY5ODIsIDB4MEUzRiwgMHg2OTgzLCAweDI0QUYsCi0gICAgMHg2OTg2LCAweDBFNDYsIDB4Njk4RCwgMHgyNkM5LCAweDY5OEUsIDB4MjZDNywgMHg2OTkwLCAweDI2REQsCi0gICAgMHg2OTkxLCAweDI2QzUsIDB4Njk5MywgMHgyNkQ3LCAweDY5OTQsIDB4MEUzNywgMHg2OTk1LCAweDBGRjAsCi0gICAgMHg2OTk2LCAweDI2QzEsIDB4Njk5NywgMHgyNkRDLCAweDY5OTksIDB4MjZDNiwgMHg2OTlBLCAweDI2RDQsCi0gICAgMHg2OTlCLCAweDBGRjUsIDB4Njk5QywgMHgwRkVFLCAweDY5OUUsIDB4MjZEQSwgMHg2OUEwLCAweDI2QkYsCi0gICAgMHg2OUExLCAweDI2RDksIDB4NjlBMywgMHgxMDAwLCAweDY5QTQsIDB4MjZEMCwgMHg2OUE1LCAweDI2RTAsCi0gICAgMHg2OUE2LCAweDBGRkUsIDB4NjlBNywgMHgyNkM4LCAweDY5QTgsIDB4MEZFRiwgMHg2OUE5LCAweDI2Q0EsCi0gICAgMHg2OUFBLCAweDI2RDgsIDB4NjlBQiwgMHgwRkY4LCAweDY5QUMsIDB4MjZDMywgMHg2OUFELCAweDBGRkMsCi0gICAgMHg2OUFFLCAweDBGRjIsIDB4NjlBRiwgMHgyNkNDLCAweDY5QjAsIDB4MjZDMiwgMHg2OUIxLCAweDI2QkMsCi0gICAgMHg2OUIzLCAweDI2RDYsIDB4NjlCNCwgMHgwRkY5LCAweDY5QjUsIDB4MjZERiwgMHg2OUI2LCAweDI2QkQsCi0gICAgMHg2OUI3LCAweDBGRjYsIDB4NjlCOSwgMHgyNkQyLCAweDY5QkIsIDB4MEZGNywgMHg2OUJDLCAweDI2QzQsCi0gICAgMHg2OUJELCAweDI2Q0YsIDB4NjlCRSwgMHgyNkNCLCAweDY5QkYsIDB4MjZDRCwgMHg2OUMxLCAweDBGRjEsCi0gICAgMHg2OUMyLCAweDI2REUsIDB4NjlDMywgMHgwRkZGLCAweDY5QzQsIDB4MjZDRSwgMHg2OUM2LCAweDI2RTEsCi0gICAgMHg2OUM5LCAweDI2QkUsIDB4NjlDQSwgMHgyNkQzLCAweDY5Q0IsIDB4MEZGNCwgMHg2OUNDLCAweDBGRkQsCi0gICAgMHg2OUNELCAweDBGRkIsIDB4NjlDRSwgMHgyNkMwLCAweDY5Q0YsIDB4MjZENSwgMHg2OUQwLCAweDBGRkEsCi0gICAgMHg2OUQzLCAweDBGRjMsIDB4NjlENCwgMHgyNkQxLCAweDY5RDksIDB4MjZEQiwgMHg2OUUyLCAweDI5MDksCi0gICAgMHg2OUU0LCAweDI5MDUsIDB4NjlFNSwgMHgyOTAxLCAweDY5RTYsIDB4MjkxNSwgMHg2OUU3LCAweDI5MTIsCi0gICAgMHg2OUU4LCAweDExNzcsIDB4NjlFQiwgMHgyOTE5LCAweDY5RUMsIDB4MjkwOCwgMHg2OUVELCAweDExODIsCi0gICAgMHg2OUVFLCAweDI5MEYsIDB4NjlGMSwgMHgyOTA0LCAweDY5RjIsIDB4MjkwRSwgMHg2OUYzLCAweDExN0YsCi0gICAgMHg2OUY0LCAweDI5MjIsIDB4NjlGNiwgMHgyOTFGLCAweDY5RjcsIDB4MjkxMSwgMHg2OUY4LCAweDI5MDIsCi0gICAgMHg2OUZCLCAweDI5MTYsIDB4NjlGQywgMHgyOTE4LCAweDY5RkQsIDB4MTE3QiwgMHg2OUZFLCAweDI5MEMsCi0gICAgMHg2OUZGLCAweDI5MDcsIDB4NkEwMCwgMHgyOEZFLCAweDZBMDEsIDB4MTE3OCwgMHg2QTAyLCAweDExODAsCi0gICAgMHg2QTA0LCAweDI5MUIsIDB4NkEwNSwgMHgxMTgxLCAweDZBMDYsIDB4MjhGRiwgMHg2QTA3LCAweDI5MjEsCi0gICAgMHg2QTA4LCAweDI5MTQsIDB4NkEwOSwgMHgyOTFBLCAweDZBMEEsIDB4MTE3RSwgMHg2QTBELCAweDI5MTcsCi0gICAgMHg2QTBGLCAweDI5MUUsIDB4NkExMSwgMHgxMTgzLCAweDZBMTMsIDB4MTE3RCwgMHg2QTE0LCAweDI5MTAsCi0gICAgMHg2QTE1LCAweDI5MDMsIDB4NkExNiwgMHgyOTIzLCAweDZBMTcsIDB4MjkwMCwgMHg2QTE4LCAweDI5MUMsCi0gICAgMHg2QTE5LCAweDExN0EsIDB4NkExQiwgMHgyOTBBLCAweDZBMUQsIDB4MjkwQiwgMHg2QTFFLCAweDExNzksCi0gICAgMHg2QTFGLCAweDExNzYsIDB4NkEyMCwgMHgyOTA2LCAweDZBMjEsIDB4MTE3QywgMHg2QTIzLCAweDExNzUsCi0gICAgMHg2QTI1LCAweDI5MUQsIDB4NkEyNiwgMHgyOTIwLCAweDZBMjcsIDB4MjkwRCwgMHg2QTI4LCAweDJCNzQsCi0gICAgMHg2QTMyLCAweDJCNkMsIDB4NkEzNCwgMHgyQjY4LCAweDZBMzUsIDB4MTJEOSwgMHg2QTM4LCAweDEyQ0UsCi0gICAgMHg2QTM5LCAweDEyRDMsIDB4NkEzQSwgMHgxMkNGLCAweDZBM0IsIDB4MkI3NiwgMHg2QTNDLCAweDJCODEsCi0gICAgMHg2QTNELCAweDEyQ0QsIDB4NkEzRSwgMHgyQjZFLCAweDZBM0YsIDB4MkI3NywgMHg2QTQwLCAweDI5MTMsCi0gICAgMHg2QTQxLCAweDJCNzgsIDB4NkE0NCwgMHgxMkQ0LCAweDZBNDYsIDB4MkI4NywgMHg2QTQ3LCAweDEyRDgsCi0gICAgMHg2QTQ4LCAweDEyREIsIDB4NkE0OSwgMHgyQjZBLCAweDZBNEIsIDB4MTJENywgMHg2QTRELCAweDJCODUsCi0gICAgMHg2QTRFLCAweDJCODYsIDB4NkE0RiwgMHgyQjdDLCAweDZBNTAsIDB4MkI3QiwgMHg2QTUxLCAweDJCNzMsCi0gICAgMHg2QTU0LCAweDJCN0QsIDB4NkE1NSwgMHgyQjg0LCAweDZBNTYsIDB4MkI4MywgMHg2QTU4LCAweDEyRDIsCi0gICAgMHg2QTU5LCAweDEyRDAsIDB4NkE1QSwgMHgyQjc1LCAweDZBNUIsIDB4MkI3MiwgMHg2QTVELCAweDJCNkYsCi0gICAgMHg2QTVFLCAweDJCODIsIDB4NkE1RiwgMHgxMkRBLCAweDZBNjAsIDB4MkI4MCwgMHg2QTYxLCAweDEyRDYsCi0gICAgMHg2QTYyLCAweDEyRDUsIDB4NkE2NCwgMHgyQjdBLCAweDZBNjYsIDB4MkI2OSwgMHg2QTY3LCAweDJCNkIsCi0gICAgMHg2QTY4LCAweDJCNkQsIDB4NkE2OSwgMHgyQjdGLCAweDZBNkEsIDB4MkI3OSwgMHg2QTZCLCAweDEyRDEsCi0gICAgMHg2QTZELCAweDJCNzAsIDB4NkE2RiwgMHgyQjdFLCAweDZBNzYsIDB4MkI3MSwgMHg2QTdFLCAweDEzRUMsCi0gICAgMHg2QTdGLCAweDJEODQsIDB4NkE4MCwgMHgxM0U1LCAweDZBODEsIDB4MkQ3NSwgMHg2QTgzLCAweDJEODAsCi0gICAgMHg2QTg0LCAweDEzRTcsIDB4NkE4NSwgMHgyRDg3LCAweDZBODcsIDB4MkQ3QywgMHg2QTg5LCAweDJENzcsCi0gICAgMHg2QThDLCAweDJEODgsIDB4NkE4RCwgMHgyRDczLCAweDZBOEUsIDB4MkQ3RSwgMHg2QTkwLCAweDEzRUUsCi0gICAgMHg2QTkxLCAweDJEODMsIDB4NkE5MiwgMHgyRDg5LCAweDZBOTMsIDB4MkQ3RCwgMHg2QTk0LCAweDEzRTYsCi0gICAgMHg2QTk1LCAweDJEN0YsIDB4NkE5NiwgMHgyRDc0LCAweDZBOTcsIDB4MTNFRCwgMHg2QTlBLCAweDJEODYsCi0gICAgMHg2QTlCLCAweDJENzksIDB4NkE5QywgMHgxM0U5LCAweDZBOUUsIDB4MkQ3QiwgMHg2QTlGLCAweDJENzgsCi0gICAgMHg2QUEwLCAweDEzRUYsIDB4NkFBMSwgMHgyRDdBLCAweDZBQTIsIDB4MTNFOCwgMHg2QUEzLCAweDEzRUIsCi0gICAgMHg2QUE0LCAweDJEODIsIDB4NkFBNSwgMHgyRDc2LCAweDZBQTYsIDB4MkQ4NSwgMHg2QUE4LCAweDJEODEsCi0gICAgMHg2QUFDLCAweDE0REQsIDB4NkFBRCwgMHgyRjNFLCAweDZBQUUsIDB4MTRFMiwgMHg2QUFGLCAweDE0RTMsCi0gICAgMHg2QUIzLCAweDE0REMsIDB4NkFCNCwgMHgyRjNELCAweDZBQjYsIDB4MkYzQSwgMHg2QUI3LCAweDJGM0IsCi0gICAgMHg2QUI4LCAweDE0RTAsIDB4NkFCOSwgMHgyRjM1LCAweDZBQkEsIDB4MkYzOSwgMHg2QUJCLCAweDE0REYsCi0gICAgMHg2QUJELCAweDJGMzYsIDB4NkFDMiwgMHgxNEUxLCAweDZBQzMsIDB4MTRERSwgMHg2QUM1LCAweDJGMzQsCi0gICAgMHg2QUM2LCAweDJGMzgsIDB4NkFDNywgMHgyRjNDLCAweDZBQ0IsIDB4MzA5RiwgMHg2QUNDLCAweDMwOUMsCi0gICAgMHg2QUNELCAweDMwQTUsIDB4NkFDRiwgMHgzMEE0LCAweDZBRDAsIDB4MzBBMiwgMHg2QUQxLCAweDMwOUQsCi0gICAgMHg2QUQzLCAweDE1ODksIDB4NkFEOSwgMHgzMDlFLCAweDZBREEsIDB4MTU4OCwgMHg2QURCLCAweDEzRUEsCi0gICAgMHg2QURDLCAweDMwQTEsIDB4NkFERCwgMHgxNTg3LCAweDZBREUsIDB4MzBBNiwgMHg2QURGLCAweDMwQTAsCi0gICAgMHg2QUUwLCAweDMwOUIsIDB4NkFFMSwgMHgyRjM3LCAweDZBRTUsIDB4MTU4NiwgMHg2QUU3LCAweDMwOUEsCi0gICAgMHg2QUU4LCAweDMxREYsIDB4NkFFQSwgMHgzMURFLCAweDZBRUIsIDB4MzBBMywgMHg2QUVDLCAweDE2MUIsCi0gICAgMHg2QUVFLCAweDMxRTIsIDB4NkFFRiwgMHgzMUUzLCAweDZBRjAsIDB4MzFERCwgMHg2QUYxLCAweDMxRTEsCi0gICAgMHg2QUYzLCAweDMxREMsIDB4NkFGOCwgMHgzMkQ2LCAweDZBRjksIDB4MzFFMCwgMHg2QUZBLCAweDE2NzgsCi0gICAgMHg2QUZCLCAweDE2NzYsIDB4NkFGQywgMHgzMkQ0LCAweDZCMDAsIDB4MzJENywgMHg2QjAyLCAweDMyRDMsCi0gICAgMHg2QjAzLCAweDMyRDUsIDB4NkIwNCwgMHgxNjc3LCAweDZCMDgsIDB4MzM4NiwgMHg2QjA5LCAweDMzODcsCi0gICAgMHg2QjBBLCAweDE2QzYsIDB4NkIwQiwgMHgzMzg1LCAweDZCMEYsIDB4MzQyMCwgMHg2QjEwLCAweDE2RkQsCi0gICAgMHg2QjExLCAweDM0MUUsIDB4NkIxMiwgMHgzNDFGLCAweDZCMTMsIDB4MzQ4NywgMHg2QjE2LCAweDE3NDMsCi0gICAgMHg2QjE3LCAweDM0Q0UsIDB4NkIxOCwgMHgzNENDLCAweDZCMTksIDB4MzRDRCwgMHg2QjFBLCAweDM0Q0YsCi0gICAgMHg2QjFFLCAweDM1MzQsIDB4NkIyMCwgMHgwMkRFLCAweDZCMjEsIDB4MDNFMywgMHg2QjIzLCAweDA2MUEsCi0gICAgMHg2QjI1LCAweDE5QzksIDB4NkIyOCwgMHgxQjNELCAweDZCMkMsIDB4MUNFNiwgMHg2QjJELCAweDFDRTgsCi0gICAgMHg2QjJGLCAweDFDRTcsIDB4NkIzMSwgMHgxQ0U5LCAweDZCMzIsIDB4MEFFNywgMHg2QjMzLCAweDFGM0MsCi0gICAgMHg2QjM0LCAweDFDRUEsIDB4NkIzNiwgMHgxRjNCLCAweDZCMzcsIDB4MUYzRCwgMHg2QjM4LCAweDFGM0UsCi0gICAgMHg2QjM5LCAweDIxQjIsIDB4NkIzQSwgMHgwQzlDLCAweDZCM0IsIDB4MjFCMywgMHg2QjNDLCAweDIxQjUsCi0gICAgMHg2QjNELCAweDBDOUQsIDB4NkIzRSwgMHgwQzlCLCAweDZCM0YsIDB4MjFCNCwgMHg2QjQxLCAweDI0NDcsCi0gICAgMHg2QjQyLCAweDI0NDUsIDB4NkI0MywgMHgyNDQ0LCAweDZCNDUsIDB4MjQ0MywgMHg2QjQ2LCAweDI0NDIsCi0gICAgMHg2QjQ3LCAweDBFNEEsIDB4NkI0OCwgMHgyNDQ2LCAweDZCNDksIDB4MTAwMSwgMHg2QjRBLCAweDI2RTIsCi0gICAgMHg2QjRCLCAweDI2RTQsIDB4NkI0QywgMHgxMDAyLCAweDZCNEQsIDB4MjZFMywgMHg2QjRFLCAweDExODUsCi0gICAgMHg2QjUwLCAweDExODQsIDB4NkI1MSwgMHgyOTI0LCAweDZCNTQsIDB4MkI4OSwgMHg2QjU1LCAweDJCODgsCi0gICAgMHg2QjU2LCAweDJCOEEsIDB4NkI1OSwgMHgxMkRDLCAweDZCNUIsIDB4MkQ4QSwgMHg2QjVDLCAweDEzRjAsCi0gICAgMHg2QjVFLCAweDJGM0YsIDB4NkI1RiwgMHgxNEU0LCAweDZCNjAsIDB4MzBBNywgMHg2QjYxLCAweDE2QzcsCi0gICAgMHg2QjYyLCAweDAyREYsIDB4NkI2MywgMHgwMzRELCAweDZCNjQsIDB4MDNFNCwgMHg2QjY1LCAweDA0QzksCi0gICAgMHg2QjY2LCAweDA2MUIsIDB4NkI2NywgMHgwNjFDLCAweDZCNkEsIDB4MDc2OSwgMHg2QjZELCAweDFDRUIsCi0gICAgMHg2QjcyLCAweDBFNEIsIDB4NkI3NiwgMHgyOUEyLCAweDZCNzcsIDB4MTJERCwgMHg2Qjc4LCAweDE0RTUsCi0gICAgMHg2Qjc5LCAweDAyRTAsIDB4NkI3QiwgMHgwM0U1LCAweDZCN0UsIDB4MTlDQiwgMHg2QjdGLCAweDA2MUQsCi0gICAgMHg2QjgwLCAweDE5Q0EsIDB4NkI4MiwgMHgxQjNFLCAweDZCODMsIDB4MDc2QSwgMHg2Qjg0LCAweDFCM0YsCi0gICAgMHg2Qjg2LCAweDA3NkIsIDB4NkI4OCwgMHgxQ0VELCAweDZCODksIDB4MDkwMCwgMHg2QjhBLCAweDA4RkYsCi0gICAgMHg2QjhDLCAweDFGNDMsIDB4NkI4RCwgMHgxRjQxLCAweDZCOEUsIDB4MUY0MiwgMHg2QjhGLCAweDFGNDAsCi0gICAgMHg2QjkxLCAweDFGM0YsIDB4NkI5NCwgMHgyMUI2LCAweDZCOTUsIDB4MjFCOSwgMHg2Qjk2LCAweDBDOUYsCi0gICAgMHg2Qjk3LCAweDIxQjcsIDB4NkI5OCwgMHgwQzlFLCAweDZCOTksIDB4MjFCOCwgMHg2QjlCLCAweDI0NDgsCi0gICAgMHg2QjlFLCAweDI2RTUsIDB4NkI5RiwgMHgyNkU2LCAweDZCQTAsIDB4MjZFNywgMHg2QkEyLCAweDI5MjcsCi0gICAgMHg2QkEzLCAweDI5MjYsIDB4NkJBNCwgMHgxMTg2LCAweDZCQTUsIDB4MjkyNSwgMHg2QkE2LCAweDI5MjgsCi0gICAgMHg2QkE3LCAweDJCOEIsIDB4NkJBQSwgMHgyQjhDLCAweDZCQUIsIDB4MkI4RCwgMHg2QkFELCAweDJEOEIsCi0gICAgMHg2QkFFLCAweDEzRjEsIDB4NkJBRiwgMHgxNEU2LCAweDZCQjAsIDB4MzBBOCwgMHg2QkIyLCAweDE2NzksCi0gICAgMHg2QkIzLCAweDE3OEEsIDB4NkJCNSwgMHgwNzZDLCAweDZCQjYsIDB4MUI0MCwgMHg2QkI3LCAweDA5MDEsCi0gICAgMHg2QkJBLCAweDBBRTgsIDB4NkJCQywgMHgwQ0EwLCAweDZCQkQsIDB4MjFCQSwgMHg2QkJGLCAweDBFNEQsCi0gICAgMHg2QkMwLCAweDBFNEMsIDB4NkJDMywgMHgyNkU4LCAweDZCQzQsIDB4MjZFOSwgMHg2QkM1LCAweDExODcsCi0gICAgMHg2QkM2LCAweDExODgsIDB4NkJDNywgMHgyQjhGLCAweDZCQzgsIDB4MkI4RSwgMHg2QkM5LCAweDJGNDAsCi0gICAgMHg2QkNBLCAweDM0MjEsIDB4NkJDQiwgMHgwMkUxLCAweDZCQ0MsIDB4MTc4QiwgMHg2QkNELCAweDAzNEUsCi0gICAgMHg2QkNGLCAweDA0Q0EsIDB4NkJEMCwgMHgxOEFELCAweDZCRDIsIDB4MDc2RCwgMHg2QkQzLCAweDBFNEUsCi0gICAgMHg2QkQ0LCAweDAyRTIsIDB4NkJENiwgMHgxQjQxLCAweDZCRDcsIDB4MDc2RSwgMHg2QkQ4LCAweDFCNDIsCi0gICAgMHg2QkRBLCAweDEzRjIsIDB4NkJEQiwgMHgwMkUzLCAweDZCREUsIDB4MTlDQywgMHg2QkUwLCAweDFCNDMsCi0gICAgMHg2QkUyLCAweDFDRjIsIDB4NkJFMywgMHgxQ0YxLCAweDZCRTQsIDB4MUNFRiwgMHg2QkU2LCAweDFDRUUsCi0gICAgMHg2QkU3LCAweDFDRjMsIDB4NkJFOCwgMHgxQ0YwLCAweDZCRUIsIDB4MEFFOSwgMHg2QkVDLCAweDBBRUEsCi0gICAgMHg2QkVGLCAweDBDQTEsIDB4NkJGMCwgMHgyMUJCLCAweDZCRjIsIDB4MjFCQywgMHg2QkYzLCAweDIxQkQsCi0gICAgMHg2QkY3LCAweDI0NEMsIDB4NkJGOCwgMHgyNDRELCAweDZCRjksIDB4MjQ0QiwgMHg2QkZCLCAweDI0NDksCi0gICAgMHg2QkZDLCAweDI0NEEsIDB4NkJGRCwgMHgwRTRGLCAweDZCRkUsIDB4MjZFQSwgMHg2QkZGLCAweDI5MkIsCi0gICAgMHg2QzAwLCAweDI5MkEsIDB4NkMwMSwgMHgyOTI5LCAweDZDMDIsIDB4MjkyQywgMHg2QzAzLCAweDJCOTEsCi0gICAgMHg2QzA0LCAweDJCOTAsIDB4NkMwNSwgMHgxMkRFLCAweDZDMDYsIDB4MkI5MiwgMHg2QzA4LCAweDEzRjMsCi0gICAgMHg2QzA5LCAweDJEOEMsIDB4NkMwQiwgMHgyRjQxLCAweDZDMEMsIDB4MzBBOSwgMHg2QzBELCAweDMzODgsCi0gICAgMHg2QzBGLCAweDAyRTQsIDB4NkMxMCwgMHgwMzUwLCAweDZDMTEsIDB4MDM0RiwgMHg2QzEzLCAweDA2MUUsCi0gICAgMHg2QzE0LCAweDE3OEMsIDB4NkMxNSwgMHgxN0FBLCAweDZDMTYsIDB4MDNFNiwgMHg2QzE4LCAweDE4MDEsCi0gICAgMHg2QzE5LCAweDE4QUUsIDB4NkMxQSwgMHgxOEFGLCAweDZDMUIsIDB4MDYxRiwgMHg2QzFELCAweDE5Q0QsCi0gICAgMHg2QzFGLCAweDA3NkYsIDB4NkMyMCwgMHgxQjQ0LCAweDZDMjEsIDB4MUI0NSwgMHg2QzIzLCAweDA5MDIsCi0gICAgMHg2QzI0LCAweDA5MDYsIDB4NkMyNSwgMHgxQ0Y0LCAweDZDMjYsIDB4MDkwNSwgMHg2QzI3LCAweDA5MDMsCi0gICAgMHg2QzI4LCAweDA5MDQsIDB4NkMyQSwgMHgxRjQ0LCAweDZDMkIsIDB4MEFFQiwgMHg2QzJDLCAweDBDQTQsCi0gICAgMHg2QzJFLCAweDBDQTIsIDB4NkMyRiwgMHgwQ0EzLCAweDZDMzAsIDB4MjFCRSwgMHg2QzMzLCAweDEwMDMsCi0gICAgMHg2QzM0LCAweDAyRTUsIDB4NkMzNiwgMHgxN0FCLCAweDZDMzgsIDB4MDM1MSwgMHg2QzNCLCAweDE3QUUsCi0gICAgMHg2QzNFLCAweDAzNTQsIDB4NkMzRiwgMHgxN0FELCAweDZDNDAsIDB4MDM1MywgMHg2QzQxLCAweDAzNTIsCi0gICAgMHg2QzQyLCAweDA0Q0IsIDB4NkM0MywgMHgxN0FDLCAweDZDNDYsIDB4MTgwMiwgMHg2QzRBLCAweDE4MDYsCi0gICAgMHg2QzRCLCAweDE4MDgsIDB4NkM0QywgMHgxODA5LCAweDZDNEQsIDB4MDNGMCwgMHg2QzRFLCAweDAzRjEsCi0gICAgMHg2QzRGLCAweDE4MDUsIDB4NkM1MCwgMHgwM0VDLCAweDZDNTIsIDB4MTgwMywgMHg2QzU0LCAweDE4MDcsCi0gICAgMHg2QzU1LCAweDAzRUQsIDB4NkM1NywgMHgwM0U4LCAweDZDNTksIDB4MDNFOSwgMHg2QzVCLCAweDAzRUYsCi0gICAgMHg2QzVDLCAweDE4MDQsIDB4NkM1RCwgMHgwM0U3LCAweDZDNUUsIDB4MDRDQywgMHg2QzVGLCAweDAzRUEsCi0gICAgMHg2QzYwLCAweDAzRUIsIDB4NkM2MSwgMHgwM0VFLCAweDZDNjUsIDB4MThDMCwgMHg2QzY2LCAweDE4QkUsCi0gICAgMHg2QzY3LCAweDE4QjEsIDB4NkM2OCwgMHgwNEQ4LCAweDZDNjksIDB4MThCOCwgMHg2QzZBLCAweDA0RDMsCi0gICAgMHg2QzZCLCAweDE4QjIsIDB4NkM2RCwgMHgxOEJBLCAweDZDNkYsIDB4MThCNywgMHg2QzcwLCAweDA0RDYsCi0gICAgMHg2QzcxLCAweDE4QjYsIDB4NkM3MiwgMHgwNERELCAweDZDNzMsIDB4MThCRiwgMHg2Qzc0LCAweDA0REYsCi0gICAgMHg2Qzc2LCAweDA0RTEsIDB4NkM3OCwgMHgxOEIwLCAweDZDN0EsIDB4MDRENCwgMHg2QzdCLCAweDE4QzEsCi0gICAgMHg2QzdELCAweDA0REIsIDB4NkM3RSwgMHgwNERFLCAweDZDODAsIDB4MTlFNCwgMHg2QzgxLCAweDA0Q0UsCi0gICAgMHg2QzgyLCAweDA0RTUsIDB4NkM4MywgMHgwNERDLCAweDZDODQsIDB4MThCMywgMHg2Qzg1LCAweDA0RDEsCi0gICAgMHg2Qzg2LCAweDA0RTAsIDB4NkM4NywgMHgxOEJCLCAweDZDODgsIDB4MDRDRiwgMHg2Qzg5LCAweDA0RDAsCi0gICAgMHg2QzhBLCAweDE5RTIsIDB4NkM4QiwgMHgxOEI0LCAweDZDOEMsIDB4MDRENywgMHg2QzhELCAweDA0RTIsCi0gICAgMHg2QzhFLCAweDE4QzIsIDB4NkM4RiwgMHgxOEI1LCAweDZDOTAsIDB4MDRENSwgMHg2QzkyLCAweDA0REEsCi0gICAgMHg2QzkzLCAweDE5Q0UsIDB4NkM5NCwgMHgwNEUzLCAweDZDOTUsIDB4MThCQywgMHg2Qzk2LCAweDA0RDksCi0gICAgMHg2Qzk4LCAweDA0RTQsIDB4NkM5OSwgMHgwNENELCAweDZDOUEsIDB4MThCOSwgMHg2QzlCLCAweDA0RDIsCi0gICAgMHg2QzlDLCAweDE4QkQsIDB4NkM5RCwgMHgxOUUzLCAweDZDQUIsIDB4MDYyQiwgMHg2Q0FDLCAweDA2M0IsCi0gICAgMHg2Q0FELCAweDE5RDUsIDB4NkNBRSwgMHgwNjMyLCAweDZDQjAsIDB4MTlFQSwgMHg2Q0IxLCAweDA2MjMsCi0gICAgMHg2Q0IzLCAweDA2MjYsIDB4NkNCNCwgMHgxOUUxLCAweDZDQjYsIDB4MTlEMywgMHg2Q0I3LCAweDE5RDcsCi0gICAgMHg2Q0I4LCAweDA2MkUsIDB4NkNCOSwgMHgwNjMwLCAweDZDQkEsIDB4MTlEQSwgMHg2Q0JCLCAweDA2MzcsCi0gICAgMHg2Q0JDLCAweDA2MjksIDB4NkNCRCwgMHgwNjI3LCAweDZDQkUsIDB4MDYyOCwgMHg2Q0JGLCAweDA2MzYsCi0gICAgMHg2Q0MwLCAweDE5RTYsIDB4NkNDMSwgMHgwNjMxLCAweDZDQzIsIDB4MTlEOSwgMHg2Q0MzLCAweDE5REIsCi0gICAgMHg2Q0M0LCAweDA2MkYsIDB4NkNDNSwgMHgwNjM0LCAweDZDQzYsIDB4MTlEQywgMHg2Q0M3LCAweDE5RTksCi0gICAgMHg2Q0M5LCAweDA3NzAsIDB4NkNDQSwgMHgwNjNBLCAweDZDQ0MsIDB4MDYyNCwgMHg2Q0NELCAweDE5RTgsCi0gICAgMHg2Q0NGLCAweDE5RUMsIDB4NkNEMCwgMHgxOUQ4LCAweDZDRDEsIDB4MTlFRSwgMHg2Q0QyLCAweDE5REYsCi0gICAgMHg2Q0QzLCAweDA2MkQsIDB4NkNENCwgMHgxOUQ0LCAweDZDRDUsIDB4MDYyQywgMHg2Q0Q2LCAweDA2M0UsCi0gICAgMHg2Q0Q3LCAweDA2MzMsIDB4NkNEOSwgMHgxOUQyLCAweDZDREEsIDB4MUI0RSwgMHg2Q0RCLCAweDA2MzksCi0gICAgMHg2Q0RDLCAweDA2M0QsIDB4NkNERCwgMHgxOUUwLCAweDZDREUsIDB4MTlFNSwgMHg2Q0UwLCAweDA2M0YsCi0gICAgMHg2Q0UxLCAweDA2MzgsIDB4NkNFMiwgMHgwNjJBLCAweDZDRTMsIDB4MDYyMCwgMHg2Q0U1LCAweDA2MjUsCi0gICAgMHg2Q0U3LCAweDE5RDYsIDB4NkNFOCwgMHgwNjIxLCAweDZDRTksIDB4MTlFRCwgMHg2Q0VCLCAweDE5RDAsCi0gICAgMHg2Q0VDLCAweDE5Q0YsIDB4NkNFRCwgMHgxOURELCAweDZDRUUsIDB4MTlEMSwgMHg2Q0VGLCAweDA2M0MsCi0gICAgMHg2Q0YwLCAweDA5MDcsIDB4NkNGMSwgMHgwNjM1LCAweDZDRjIsIDB4MTlERSwgMHg2Q0YzLCAweDA2MjIsCi0gICAgMHg2Q0Y1LCAweDA3N0YsIDB4NkNGOSwgMHgxOUVCLCAweDZEMDAsIDB4MUI1NSwgMHg2RDAxLCAweDFCNTgsCi0gICAgMHg2RDAzLCAweDFCNUIsIDB4NkQwNCwgMHgxQjUwLCAweDZEMDcsIDB4MUI1RSwgMHg2RDA4LCAweDFCNjEsCi0gICAgMHg2RDA5LCAweDFCNjMsIDB4NkQwQSwgMHgxQjRELCAweDZEMEIsIDB4MDc3MSwgMHg2RDBDLCAweDA3NzYsCi0gICAgMHg2RDBELCAweDFDRjksIDB4NkQwRSwgMHgwNzg2LCAweDZEMEYsIDB4MUI1QywgMHg2RDEwLCAweDFCNjQsCi0gICAgMHg2RDExLCAweDFCNTQsIDB4NkQxMiwgMHgxQjRDLCAweDZEMTYsIDB4MUQxNCwgMHg2RDE3LCAweDA3NzksCi0gICAgMHg2RDE4LCAweDFCNTksIDB4NkQxOSwgMHgxQjUxLCAweDZEMUEsIDB4MUI1MywgMHg2RDFCLCAweDA3N0UsCi0gICAgMHg2RDFELCAweDFCNTYsIDB4NkQxRSwgMHgwNzc4LCAweDZEMUYsIDB4MUI0OSwgMHg2RDIwLCAweDFCNUYsCi0gICAgMHg2RDIyLCAweDFCNjIsIDB4NkQyNSwgMHgwNzc1LCAweDZEMjcsIDB4MDc4MSwgMHg2RDI4LCAweDFCNDYsCi0gICAgMHg2RDI5LCAweDA3ODMsIDB4NkQyQSwgMHgwNzczLCAweDZEMkIsIDB4MDc4NywgMHg2RDJDLCAweDFCNjAsCi0gICAgMHg2RDJELCAweDFCNDgsIDB4NkQyRSwgMHgwNzg0LCAweDZEMkYsIDB4MUQwRSwgMHg2RDMwLCAweDE5RTcsCi0gICAgMHg2RDMxLCAweDA3NzcsIDB4NkQzMiwgMHgwNzcyLCAweDZEMzMsIDB4MUI0RiwgMHg2RDM0LCAweDFCNDcsCi0gICAgMHg2RDM1LCAweDA3ODUsIDB4NkQzNiwgMHgwNzdELCAweDZEMzcsIDB4MUI1QSwgMHg2RDM4LCAweDA3ODIsCi0gICAgMHg2RDM5LCAweDA3ODAsIDB4NkQzQSwgMHgxQjUyLCAweDZEM0IsIDB4MDc3QSwgMHg2RDNDLCAweDFCNEEsCi0gICAgMHg2RDNELCAweDA3N0IsIDB4NkQzRSwgMHgwNzdDLCAweDZEM0YsIDB4MUI0QiwgMHg2RDQwLCAweDFCNUQsCi0gICAgMHg2RDQxLCAweDA3NzQsIDB4NkQ0MiwgMHgxQjU3LCAweDZENTgsIDB4MUNGQywgMHg2RDU5LCAweDA5MEYsCi0gICAgMHg2RDVBLCAweDA5MTQsIDB4NkQ1RSwgMHgxRDA1LCAweDZENUYsIDB4MUQwQiwgMHg2RDYwLCAweDFEMDcsCi0gICAgMHg2RDYxLCAweDFDRkEsIDB4NkQ2MiwgMHgxQ0ZELCAweDZENjMsIDB4MUNGNiwgMHg2RDY0LCAweDFDRjcsCi0gICAgMHg2RDY1LCAweDA5MUIsIDB4NkQ2NiwgMHgwOTBDLCAweDZENjcsIDB4MUQwNiwgMHg2RDY4LCAweDFEMEYsCi0gICAgMHg2RDY5LCAweDA5MTYsIDB4NkQ2QSwgMHgwOTA4LCAweDZENkMsIDB4MDkxMSwgMHg2RDZELCAweDFDRkUsCi0gICAgMHg2RDZFLCAweDA5MTMsIDB4NkQ2RiwgMHgxQ0ZGLCAweDZENzAsIDB4MUQwOSwgMHg2RDc0LCAweDA5MTUsCi0gICAgMHg2RDc1LCAweDFEMTgsIDB4NkQ3NiwgMHgxQ0Y4LCAweDZENzcsIDB4MDkwRSwgMHg2RDc4LCAweDA5MEQsCi0gICAgMHg2RDc5LCAweDA5MTksIDB4NkQ3QSwgMHgxQ0Y1LCAweDZEN0IsIDB4MUQxNiwgMHg2RDdDLCAweDFEMEEsCi0gICAgMHg2RDdELCAweDFEMTcsIDB4NkQ3RSwgMHgxRDExLCAweDZEN0YsIDB4MUQwMywgMHg2RDgwLCAweDFEMTIsCi0gICAgMHg2RDgyLCAweDFEMEMsIDB4NkQ4MywgMHgxRDE1LCAweDZEODQsIDB4MUQxMywgMHg2RDg1LCAweDA5MUEsCi0gICAgMHg2RDg2LCAweDFEMDQsIDB4NkQ4NywgMHgwOTBCLCAweDZEODgsIDB4MDkwQSwgMHg2RDg5LCAweDA5MTIsCi0gICAgMHg2RDhBLCAweDA5MTgsIDB4NkQ4QiwgMHgxRDEwLCAweDZEOEMsIDB4MDkxNywgMHg2RDhELCAweDFEMDEsCi0gICAgMHg2RDhFLCAweDBBRUMsIDB4NkQ5MCwgMHgxRDE5LCAweDZEOTEsIDB4MUQwMCwgMHg2RDkyLCAweDFDRkIsCi0gICAgMHg2RDkzLCAweDA5MTAsIDB4NkQ5NCwgMHgwOTFDLCAweDZEOTUsIDB4MDkwOSwgMHg2RDk3LCAweDFEMDgsCi0gICAgMHg2RDk4LCAweDFEMEQsIDB4NkRBQSwgMHgwQjBFLCAweDZEQUIsIDB4MUY0NiwgMHg2REFDLCAweDFGNEEsCi0gICAgMHg2REFFLCAweDBBRkIsIDB4NkRBRiwgMHgwQUY5LCAweDZEQjIsIDB4MEFGMCwgMHg2REIzLCAweDFGNDgsCi0gICAgMHg2REI0LCAweDFGNDcsIDB4NkRCNSwgMHgwQjA0LCAweDZEQjcsIDB4MUY0RCwgMHg2REI4LCAweDBBRkUsCi0gICAgMHg2REJBLCAweDFGNUYsIDB4NkRCQiwgMHgxRjZCLCAweDZEQkMsIDB4MEFFRCwgMHg2REJELCAweDFGNUMsCi0gICAgMHg2REJFLCAweDFGNTUsIDB4NkRCRiwgMHgwQjEwLCAweDZEQzAsIDB4MUY0NSwgMHg2REMyLCAweDFGNjEsCi0gICAgMHg2REM0LCAweDBCMEQsIDB4NkRDNSwgMHgwQjAxLCAweDZEQzYsIDB4MEIwQywgMHg2REM3LCAweDBBRjcsCi0gICAgMHg2REM4LCAweDFGNTEsIDB4NkRDOSwgMHgxRjYzLCAweDZEQ0EsIDB4MUY1QiwgMHg2RENCLCAweDBBRjgsCi0gICAgMHg2RENDLCAweDBBRjIsIDB4NkRDRCwgMHgxRjY5LCAweDZEQ0YsIDB4MUY2MiwgMHg2REQwLCAweDFGNjQsCi0gICAgMHg2REQxLCAweDBBRkEsIDB4NkREMiwgMHgwQjAyLCAweDZERDMsIDB4MUY2NiwgMHg2REQ0LCAweDFGNEYsCi0gICAgMHg2REQ1LCAweDFGNjAsIDB4NkRENiwgMHgxRjU0LCAweDZERDcsIDB4MUY2OCwgMHg2REQ4LCAweDBCMDcsCi0gICAgMHg2REQ5LCAweDBBRUYsIDB4NkREQSwgMHgwQjA1LCAweDZEREIsIDB4MUY1OSwgMHg2RERDLCAweDFGNTcsCi0gICAgMHg2RERELCAweDFGNTgsIDB4NkRERSwgMHgwQUZDLCAweDZEREYsIDB4MUY1MywgMHg2REUwLCAweDFGNTIsCi0gICAgMHg2REUxLCAweDBBRjEsIDB4NkRFMiwgMHgxRjRDLCAweDZERTMsIDB4MUY2QSwgMHg2REU0LCAweDBBRjMsCi0gICAgMHg2REU1LCAweDFGNTYsIDB4NkRFNiwgMHgwQjExLCAweDZERTgsIDB4MEIwQiwgMHg2REU5LCAweDFGNEIsCi0gICAgMHg2REVBLCAweDBCMDgsIDB4NkRFQiwgMHgwQjA2LCAweDZERUMsIDB4MEIwRiwgMHg2REVELCAweDFGNUQsCi0gICAgMHg2REVFLCAweDBCMEEsIDB4NkRFRiwgMHgxRDAyLCAweDZERjAsIDB4MUY1RSwgMHg2REYxLCAweDBCMDksCi0gICAgMHg2REYyLCAweDFGNjUsIDB4NkRGMywgMHgwQUVFLCAweDZERjQsIDB4MUY1QSwgMHg2REY1LCAweDBCMDAsCi0gICAgMHg2REY2LCAweDFGNEUsIDB4NkRGNywgMHgwQUZGLCAweDZERjksIDB4MEFGRCwgMHg2REZBLCAweDBBRjUsCi0gICAgMHg2REZCLCAweDBBRjQsIDB4NkRGQywgMHgyMUJGLCAweDZERkQsIDB4MUY2NywgMHg2RTAwLCAweDFGNTAsCi0gICAgMHg2RTAzLCAweDIxRDQsIDB4NkUwNSwgMHgwQUY2LCAweDZFMTksIDB4MENDMSwgMHg2RTFBLCAweDBCMDMsCi0gICAgMHg2RTFCLCAweDBDQUYsIDB4NkUxQywgMHgyMUNFLCAweDZFMUQsIDB4MENCRCwgMHg2RTFGLCAweDIxQzIsCi0gICAgMHg2RTIwLCAweDBDQUMsIDB4NkUyMSwgMHgwQ0E4LCAweDZFMjIsIDB4MjFFMCwgMHg2RTIzLCAweDBDQUUsCi0gICAgMHg2RTI0LCAweDBDQjIsIDB4NkUyNSwgMHgwQ0FELCAweDZFMjYsIDB4MENCNiwgMHg2RTI3LCAweDIxRTQsCi0gICAgMHg2RTI4LCAweDIxREIsIDB4NkUyQiwgMHgyMUM5LCAweDZFMkMsIDB4MENCQiwgMHg2RTJELCAweDBDQjUsCi0gICAgMHg2RTJFLCAweDIxRDUsIDB4NkUyRiwgMHgwQ0E1LCAweDZFMzAsIDB4MjFFMSwgMHg2RTMxLCAweDIxREEsCi0gICAgMHg2RTMyLCAweDBDQTksIDB4NkUzMywgMHgyMUNGLCAweDZFMzQsIDB4MENCOCwgMHg2RTM1LCAweDIxRUMsCi0gICAgMHg2RTM2LCAweDIxRUQsIDB4NkUzOCwgMHgwQ0E2LCAweDZFMzksIDB4MjFERiwgMHg2RTNBLCAweDBDQkEsCi0gICAgMHg2RTNCLCAweDIxRDMsIDB4NkUzQywgMHgyMUM1LCAweDZFM0QsIDB4MjFDNiwgMHg2RTNFLCAweDBDQkUsCi0gICAgMHg2RTNGLCAweDIxQ0EsIDB4NkU0MCwgMHgyMUQxLCAweDZFNDEsIDB4MjFDQiwgMHg2RTQzLCAweDBDQkMsCi0gICAgMHg2RTQ0LCAweDBDQzQsIDB4NkU0NSwgMHgyMUM3LCAweDZFNDYsIDB4MjFDMCwgMHg2RTQ3LCAweDIxQzEsCi0gICAgMHg2RTQ5LCAweDIxQzMsIDB4NkU0QSwgMHgwQ0FCLCAweDZFNEIsIDB4MjFEMCwgMHg2RTRELCAweDBDQjksCi0gICAgMHg2RTRFLCAweDBDQzIsIDB4NkU1MSwgMHgyMUQyLCAweDZFNTIsIDB4MjFFQSwgMHg2RTUzLCAweDIxRTIsCi0gICAgMHg2RTU0LCAweDBDQTcsIDB4NkU1NSwgMHgyMUU4LCAweDZFNTYsIDB4MENCMywgMHg2RTU4LCAweDBDQjEsCi0gICAgMHg2RTVBLCAweDIxRUUsIDB4NkU1QiwgMHgwQ0IwLCAweDZFNUMsIDB4MjFEOCwgMHg2RTVELCAweDIxQ0MsCi0gICAgMHg2RTVFLCAweDIxRDYsIDB4NkU1RiwgMHgwQ0M3LCAweDZFNjAsIDB4MjFEQywgMHg2RTYxLCAweDIxRDksCi0gICAgMHg2RTYyLCAweDIxQzgsIDB4NkU2MywgMHgwQ0MzLCAweDZFNjQsIDB4MjFFNiwgMHg2RTY1LCAweDIxRTMsCi0gICAgMHg2RTY2LCAweDIxRUIsIDB4NkU2NywgMHgwQ0FBLCAweDZFNjgsIDB4MjFENywgMHg2RTY5LCAweDBDQzYsCi0gICAgMHg2RTZCLCAweDIxREUsIDB4NkU2RSwgMHgwQ0I0LCAweDZFNkYsIDB4MENCNywgMHg2RTcxLCAweDIxREQsCi0gICAgMHg2RTcyLCAweDBDQzUsIDB4NkU3MywgMHgyMUNELCAweDZFNzQsIDB4MUY0OSwgMHg2RTc3LCAweDIxRTcsCi0gICAgMHg2RTc4LCAweDIxRTUsIDB4NkU3OSwgMHgyMUU5LCAweDZFODgsIDB4MjFDNCwgMHg2RTg5LCAweDBDQzAsCi0gICAgMHg2RThELCAweDI0NkMsIDB4NkU4RSwgMHgyNDZCLCAweDZFOEYsIDB4MjQ1MSwgMHg2RTkwLCAweDBFNTUsCi0gICAgMHg2RTkyLCAweDI0NkEsIDB4NkU5MywgMHgyNDU0LCAweDZFOTQsIDB4MjQ1NSwgMHg2RTk2LCAweDBFNUYsCi0gICAgMHg2RTk3LCAweDI0NzMsIDB4NkU5OCwgMHgwRTVBLCAweDZFOTksIDB4MjQ2OSwgMHg2RTlCLCAweDI0NEUsCi0gICAgMHg2RTlDLCAweDBFNjAsIDB4NkU5RCwgMHgwRTU2LCAweDZFOUUsIDB4MjQ1RCwgMHg2RTlGLCAweDI0NTMsCi0gICAgMHg2RUEwLCAweDI0NTYsIDB4NkVBMSwgMHgyNDZFLCAweDZFQTIsIDB4MEU1MCwgMHg2RUEzLCAweDI0NzUsCi0gICAgMHg2RUE0LCAweDI0NkQsIDB4NkVBNSwgMHgwRTU5LCAweDZFQTYsIDB4MjQ2MiwgMHg2RUE3LCAweDBFNjQsCi0gICAgMHg2RUFBLCAweDBFNjMsIDB4NkVBQiwgMHgwRTVELCAweDZFQUUsIDB4MjQ3NCwgMHg2RUFGLCAweDBFNTEsCi0gICAgMHg2RUIwLCAweDI0NjAsIDB4NkVCMSwgMHgyNDU3LCAweDZFQjIsIDB4MjQ2NCwgMHg2RUIzLCAweDI0NzAsCi0gICAgMHg2RUI0LCAweDBFNjUsIDB4NkVCNiwgMHgwRTUzLCAweDZFQjcsIDB4MjQ1RiwgMHg2RUI5LCAweDI0NTgsCi0gICAgMHg2RUJBLCAweDBFNUMsIDB4NkVCQywgMHgwRTVCLCAweDZFQkQsIDB4MjQ1QiwgMHg2RUJFLCAweDI0NjUsCi0gICAgMHg2RUJGLCAweDI0NkYsIDB4NkVDMCwgMHgyNDUyLCAweDZFQzEsIDB4MjQ1QywgMHg2RUMyLCAweDBFNTQsCi0gICAgMHg2RUMzLCAweDI0NjYsIDB4NkVDNCwgMHgwRTYxLCAweDZFQzUsIDB4MEU1OCwgMHg2RUM2LCAweDI0NTksCi0gICAgMHg2RUM3LCAweDBFNTcsIDB4NkVDOCwgMHgyNDUwLCAweDZFQzksIDB4MjQ1RSwgMHg2RUNBLCAweDI0NzIsCi0gICAgMHg2RUNCLCAweDBDQkYsIDB4NkVDQywgMHgxMDFGLCAweDZFQ0QsIDB4MjQ2MSwgMHg2RUNFLCAweDI2RUIsCi0gICAgMHg2RUNGLCAweDI0NjMsIDB4NkVEMCwgMHgyNDcxLCAweDZFRDEsIDB4MEU1RSwgMHg2RUQyLCAweDI0NUEsCi0gICAgMHg2RUQzLCAweDBFNTIsIDB4NkVENCwgMHgwRTYyLCAweDZFRDUsIDB4MTE5QSwgMHg2RUQ2LCAweDI0NEYsCi0gICAgMHg2RUQ4LCAweDI0NjgsIDB4NkVEQywgMHgyNDY3LCAweDZFRUIsIDB4MjcwNywgMHg2RUVDLCAweDEwMUMsCi0gICAgMHg2RUVELCAweDI2RkMsIDB4NkVFRSwgMHgyNzAxLCAweDZFRUYsIDB4MTAxMSwgMHg2RUYxLCAweDI2RUQsCi0gICAgMHg2RUYyLCAweDEwMUUsIDB4NkVGNCwgMHgxMDA4LCAweDZFRjUsIDB4MjZFQywgMHg2RUY2LCAweDI3MEQsCi0gICAgMHg2RUY3LCAweDEwMjAsIDB4NkVGOCwgMHgyNkYwLCAweDZFRjksIDB4MjcwMCwgMHg2RUZCLCAweDI2RjIsCi0gICAgMHg2RUZDLCAweDI3MTAsIDB4NkVGRCwgMHgyNzBDLCAweDZFRkUsIDB4MTAwNiwgMHg2RUZGLCAweDEwMTAsCi0gICAgMHg2RjAwLCAweDI5NDYsIDB4NkYwMSwgMHgxMDFELCAweDZGMDIsIDB4MTAwRSwgMHg2RjAzLCAweDI2RUUsCi0gICAgMHg2RjA1LCAweDI3MEIsIDB4NkYwNiwgMHgxMDEyLCAweDZGMDcsIDB4MjcwOCwgMHg2RjA4LCAweDI3MTUsCi0gICAgMHg2RjA5LCAweDI2RjQsIDB4NkYwQSwgMHgyNkZELCAweDZGMEQsIDB4MjcxMywgMHg2RjBFLCAweDI3MDksCi0gICAgMHg2RjBGLCAweDEwMEQsIDB4NkYxMiwgMHgyNkZCLCAweDZGMTMsIDB4MTAwNywgMHg2RjE0LCAweDEwMDUsCi0gICAgMHg2RjE1LCAweDEwMTcsIDB4NkYxOCwgMHgyNkY5LCAweDZGMTksIDB4MjZGNiwgMHg2RjFBLCAweDI2RjcsCi0gICAgMHg2RjFDLCAweDI3MEYsIDB4NkYxRSwgMHgyNzE0LCAweDZGMUYsIDB4MjcxMiwgMHg2RjIwLCAweDEwMEIsCi0gICAgMHg2RjIxLCAweDI3MTYsIDB4NkYyMiwgMHgxMDBGLCAweDZGMjMsIDB4MTAxNiwgMHg2RjI1LCAweDI2RUYsCi0gICAgMHg2RjI2LCAweDI5MkUsIDB4NkYyNywgMHgyNkY4LCAweDZGMjksIDB4MTAwOSwgMHg2RjJBLCAweDEwMUIsCi0gICAgMHg2RjJCLCAweDEwMTgsIDB4NkYyQywgMHgxMDBDLCAweDZGMkQsIDB4MjcwMiwgMHg2RjJFLCAweDI2RjMsCi0gICAgMHg2RjJGLCAweDEwMTksIDB4NkYzMCwgMHgyNzA0LCAweDZGMzEsIDB4MTAxMywgMHg2RjMyLCAweDEwMTUsCi0gICAgMHg2RjMzLCAweDEwMDQsIDB4NkYzNSwgMHgyNzA2LCAweDZGMzYsIDB4MjZGRSwgMHg2RjM3LCAweDI2RjEsCi0gICAgMHg2RjM4LCAweDEwMTQsIDB4NkYzOSwgMHgyNzBFLCAweDZGM0EsIDB4MjcxMSwgMHg2RjNCLCAweDI2RkEsCi0gICAgMHg2RjNDLCAweDI3MDUsIDB4NkYzRSwgMHgxMDBBLCAweDZGM0YsIDB4MTE4OSwgMHg2RjQwLCAweDI3MDMsCi0gICAgMHg2RjQxLCAweDI5MkQsIDB4NkY0MywgMHgyNzBBLCAweDZGNEUsIDB4MjZGNSwgMHg2RjRGLCAweDI5MzcsCi0gICAgMHg2RjUwLCAweDI5NDEsIDB4NkY1MSwgMHgxMThDLCAweDZGNTIsIDB4Mjk0MCwgMHg2RjUzLCAweDI5NEMsCi0gICAgMHg2RjU0LCAweDExOEUsIDB4NkY1NSwgMHgyOTNFLCAweDZGNTcsIDB4Mjk0MiwgMHg2RjU4LCAweDExOTksCi0gICAgMHg2RjVBLCAweDI5MzksIDB4NkY1QiwgMHgxMTkxLCAweDZGNUQsIDB4Mjk0NSwgMHg2RjVFLCAweDJCOUEsCi0gICAgMHg2RjVGLCAweDExOUQsIDB4NkY2MCwgMHgxMTlDLCAweDZGNjEsIDB4Mjk0NywgMHg2RjYyLCAweDI5MzYsCi0gICAgMHg2RjYzLCAweDI5NTEsIDB4NkY2NCwgMHgxMTk3LCAweDZGNjYsIDB4MTE4RCwgMHg2RjY3LCAweDI5NEEsCi0gICAgMHg2RjY5LCAweDI5NEUsIDB4NkY2QSwgMHgyOTUzLCAweDZGNkIsIDB4Mjk0OCwgMHg2RjZDLCAweDI5M0MsCi0gICAgMHg2RjZELCAweDExOTAsIDB4NkY2RSwgMHgxMTkzLCAweDZGNkYsIDB4MTE5QiwgMHg2RjcwLCAweDExOTYsCi0gICAgMHg2RjcyLCAweDI5M0YsIDB4NkY3MywgMHgyNkZGLCAweDZGNzYsIDB4MjkzQiwgMHg2Rjc3LCAweDI5NTIsCi0gICAgMHg2Rjc4LCAweDExOTIsIDB4NkY3QSwgMHgxMTk1LCAweDZGN0IsIDB4Mjk1NCwgMHg2RjdDLCAweDExOEEsCi0gICAgMHg2RjdELCAweDI5NDksIDB4NkY3RSwgMHgyOTJGLCAweDZGN0YsIDB4Mjk0RiwgMHg2RjgwLCAweDEzRkMsCi0gICAgMHg2RjgyLCAweDI5M0QsIDB4NkY4NCwgMHgxMThCLCAweDZGODUsIDB4MjkzOCwgMHg2Rjg2LCAweDExOEYsCi0gICAgMHg2Rjg3LCAweDI5MzAsIDB4NkY4OCwgMHgxMDFBLCAweDZGODksIDB4MjkzNCwgMHg2RjhCLCAweDI5NEQsCi0gICAgMHg2RjhDLCAweDI5MzUsIDB4NkY4RCwgMHgyOTMzLCAweDZGOEUsIDB4MTE5NCwgMHg2RjkwLCAweDI5NEIsCi0gICAgMHg2RjkyLCAweDI5MzIsIDB4NkY5MywgMHgyOTQ0LCAweDZGOTQsIDB4Mjk0MywgMHg2Rjk1LCAweDI5NTAsCi0gICAgMHg2Rjk2LCAweDI5M0EsIDB4NkY5NywgMHgxMTk4LCAweDZGOUUsIDB4MkI5RCwgMHg2RkEwLCAweDEyRUIsCi0gICAgMHg2RkExLCAweDEyRTEsIDB4NkZBMiwgMHgyQkE5LCAweDZGQTMsIDB4MkI5NSwgMHg2RkE0LCAweDEyRTMsCi0gICAgMHg2RkE1LCAweDJCQTEsIDB4NkZBNiwgMHgxMkVBLCAweDZGQTcsIDB4MTJFNSwgMHg2RkE4LCAweDJCOUYsCi0gICAgMHg2RkE5LCAweDJEOEUsIDB4NkZBQSwgMHgyQkE1LCAweDZGQUIsIDB4MkJBQiwgMHg2RkFDLCAweDJCQTQsCi0gICAgMHg2RkFELCAweDJCOTMsIDB4NkZBRSwgMHgyQkEyLCAweDZGQUYsIDB4MkJBRCwgMHg2RkIwLCAweDJCQUYsCi0gICAgMHg2RkIxLCAweDEyRTAsIDB4NkZCMiwgMHgyQkFFLCAweDZGQjMsIDB4MTJFNiwgMHg2RkI0LCAweDEyRUMsCi0gICAgMHg2RkI2LCAweDEyRTksIDB4NkZCOCwgMHgyQkE4LCAweDZGQjksIDB4MTJFOCwgMHg2RkJBLCAweDJCQTMsCi0gICAgMHg2RkJDLCAweDJCOTcsIDB4NkZCRCwgMHgyQjlDLCAweDZGQkYsIDB4MkJBNywgMHg2RkMwLCAweDEyRTcsCi0gICAgMHg2RkMxLCAweDEyRTQsIDB4NkZDMiwgMHgxMkRGLCAweDZGQzMsIDB4MTJFMiwgMHg2RkM0LCAweDJCOUIsCi0gICAgMHg2RkM2LCAweDI5MzEsIDB4NkZDNywgMHgyQjk2LCAweDZGQzgsIDB4MkI5OSwgMHg2RkM5LCAweDJCQUEsCi0gICAgMHg2RkNBLCAweDJCOUUsIDB4NkZDQiwgMHgyQjk0LCAweDZGQ0MsIDB4MkQ4RCwgMHg2RkNELCAweDJCQUMsCi0gICAgMHg2RkNFLCAweDJCOTgsIDB4NkZDRiwgMHgyQkE2LCAweDZGRDQsIDB4MkQ5MCwgMHg2RkQ1LCAweDE0MDAsCi0gICAgMHg2RkQ4LCAweDEzRjQsIDB4NkZEQiwgMHgxM0Y4LCAweDZGREMsIDB4MkQ5MiwgMHg2RkRELCAweDJEOTgsCi0gICAgMHg2RkRFLCAweDJEOTYsIDB4NkZERiwgMHgxM0Y2LCAweDZGRTAsIDB4MTNGNywgMHg2RkUxLCAweDEzRkUsCi0gICAgMHg2RkUyLCAweDJEOTksIDB4NkZFMywgMHgyRDkxLCAweDZGRTQsIDB4MTNGOSwgMHg2RkU2LCAweDJEOTUsCi0gICAgMHg2RkU3LCAweDJEOTQsIDB4NkZFOCwgMHgyRDlBLCAweDZGRTksIDB4MTNGRiwgMHg2RkVCLCAweDEzRkEsCi0gICAgMHg2RkVDLCAweDEzRkQsIDB4NkZFRCwgMHgyRDkzLCAweDZGRUUsIDB4MTQwMSwgMHg2RkVGLCAweDEzRkIsCi0gICAgMHg2RkYwLCAweDE0MDIsIDB4NkZGMSwgMHgxM0Y1LCAweDZGRjIsIDB4MkQ5NywgMHg2RkY0LCAweDJEOEYsCi0gICAgMHg2RkY3LCAweDJGNEUsIDB4NkZGQSwgMHgxNEVCLCAweDZGRkIsIDB4MkY0QiwgMHg2RkZDLCAweDJGNEQsCi0gICAgMHg2RkZFLCAweDE0RTksIDB4NkZGRiwgMHgyRjQ5LCAweDcwMDAsIDB4MkY0QSwgMHg3MDAxLCAweDJGNDUsCi0gICAgMHg3MDA0LCAweDJCQTAsIDB4NzAwNSwgMHgyRjQ2LCAweDcwMDYsIDB4MTRFQSwgMHg3MDA3LCAweDJGNDIsCi0gICAgMHg3MDA5LCAweDE0RTcsIDB4NzAwQSwgMHgyRjRGLCAweDcwMEIsIDB4MTRFOCwgMHg3MDBDLCAweDJGNDMsCi0gICAgMHg3MDBELCAweDJGNDQsIDB4NzAwRSwgMHgyRjQ4LCAweDcwMEYsIDB4MTRFRCwgMHg3MDExLCAweDE0RUMsCi0gICAgMHg3MDE0LCAweDJGNDcsIDB4NzAxNSwgMHgxNThGLCAweDcwMTYsIDB4MzBBRCwgMHg3MDE3LCAweDMwQjMsCi0gICAgMHg3MDE4LCAweDE1OTAsIDB4NzAxOSwgMHgzMEFBLCAweDcwMUEsIDB4MTU4RCwgMHg3MDFCLCAweDE1OEEsCi0gICAgMHg3MDFDLCAweDMwQjUsIDB4NzAxRCwgMHgxNThFLCAweDcwMUYsIDB4MTU4QiwgMHg3MDIwLCAweDMwQUMsCi0gICAgMHg3MDIxLCAweDMwQUYsIDB4NzAyMiwgMHgzMEIwLCAweDcwMjMsIDB4MzBCMSwgMHg3MDI0LCAweDMwQjQsCi0gICAgMHg3MDI2LCAweDJGNEMsIDB4NzAyNywgMHgzMEFCLCAweDcwMjgsIDB4MTU4QywgMHg3MDI5LCAweDMwQjIsCi0gICAgMHg3MDJBLCAweDMxRUYsIDB4NzAyQiwgMHgzMEFFLCAweDcwMkYsIDB4MzFFNiwgMHg3MDMwLCAweDE2MUQsCi0gICAgMHg3MDMxLCAweDMxRTksIDB4NzAzMiwgMHgxNjFFLCAweDcwMzMsIDB4MzFGMiwgMHg3MDM0LCAweDMxRTgsCi0gICAgMHg3MDM1LCAweDMxRTUsIDB4NzAzNywgMHgzMUU3LCAweDcwMzgsIDB4MzFFQiwgMHg3MDM5LCAweDMxRUUsCi0gICAgMHg3MDNBLCAweDMxRUQsIDB4NzAzQiwgMHgzMUYxLCAweDcwM0MsIDB4MzFFNCwgMHg3MDNFLCAweDE2MUMsCi0gICAgMHg3MDNGLCAweDMxRUMsIDB4NzA0MCwgMHgzMUYwLCAweDcwNDEsIDB4MzFGMywgMHg3MDQyLCAweDMxRUEsCi0gICAgMHg3MDQzLCAweDMyRDgsIDB4NzA0NCwgMHgzMkQ5LCAweDcwNDUsIDB4MzJERCwgMHg3MDQ2LCAweDMyREUsCi0gICAgMHg3MDQ4LCAweDMyREIsIDB4NzA0OSwgMHgzMkRDLCAweDcwNEEsIDB4MzJEQSwgMHg3MDRDLCAweDE2N0EsCi0gICAgMHg3MDUxLCAweDE2QzgsIDB4NzA1MiwgMHgzMzhDLCAweDcwNTUsIDB4MzM4OSwgMHg3MDU2LCAweDMzOEEsCi0gICAgMHg3MDU3LCAweDMzOEIsIDB4NzA1OCwgMHgxNkM5LCAweDcwNUEsIDB4MzQyMywgMHg3MDVCLCAweDM0MjIsCi0gICAgMHg3MDVELCAweDM0OEEsIDB4NzA1RSwgMHgxNzIyLCAweDcwNUYsIDB4MzQ4OCwgMHg3MDYwLCAweDM0OEIsCi0gICAgMHg3MDYxLCAweDM0ODksIDB4NzA2MiwgMHgzNEQwLCAweDcwNjMsIDB4MTc0NCwgMHg3MDY0LCAweDE3NTIsCi0gICAgMHg3MDY1LCAweDM1MUMsIDB4NzA2NiwgMHgzNTA2LCAweDcwNjgsIDB4MzUxQiwgMHg3MDY5LCAweDM1NDcsCi0gICAgMHg3MDZBLCAweDM1NDgsIDB4NzA2QiwgMHgwMkU2LCAweDcwNzAsIDB4MDNGMiwgMHg3MDcxLCAweDE4MEEsCi0gICAgMHg3MDc0LCAweDE4QzMsIDB4NzA3NiwgMHgwNEU2LCAweDcwNzgsIDB4MDRFOSwgMHg3MDdBLCAweDE4QzQsCi0gICAgMHg3MDdDLCAweDA0RTcsIDB4NzA3RCwgMHgwNEU4LCAweDcwODIsIDB4MTlGNywgMHg3MDgzLCAweDE5RjksCi0gICAgMHg3MDg0LCAweDE5RjQsIDB4NzA4NSwgMHgxOUYxLCAweDcwODYsIDB4MTlGMywgMHg3MDhBLCAweDA2NDMsCi0gICAgMHg3MDhFLCAweDA2NDEsIDB4NzA5MSwgMHgxOUY1LCAweDcwOTIsIDB4MDY0MiwgMHg3MDkzLCAweDE5RjIsCi0gICAgMHg3MDk0LCAweDE5RUYsIDB4NzA5NSwgMHgwNjQwLCAweDcwOTYsIDB4MTlGNiwgMHg3MDk4LCAweDE5RjAsCi0gICAgMHg3MDk5LCAweDA2NDQsIDB4NzA5QSwgMHgxOUY4LCAweDcwOUYsIDB4MUI2NiwgMHg3MEExLCAweDFCNkEsCi0gICAgMHg3MEE0LCAweDA3OTAsIDB4NzBBOSwgMHgxQjZELCAweDcwQUIsIDB4MDc4OCwgMHg3MEFDLCAweDA3OEIsCi0gICAgMHg3MEFELCAweDA3OEQsIDB4NzBBRSwgMHgwNzhGLCAweDcwQUYsIDB4MDc4QywgMHg3MEIwLCAweDFCNjksCi0gICAgMHg3MEIxLCAweDFCNjgsIDB4NzBCMywgMHgwNzhBLCAweDcwQjQsIDB4MUI2QiwgMHg3MEI1LCAweDFCNkMsCi0gICAgMHg3MEI3LCAweDFCNjUsIDB4NzBCOCwgMHgwNzhFLCAweDcwQkEsIDB4MDc4OSwgMHg3MEJFLCAweDFCNjcsCi0gICAgMHg3MEM1LCAweDFEMjcsIDB4NzBDNiwgMHgxRDI4LCAweDcwQzcsIDB4MUQyOSwgMHg3MEM4LCAweDA5MjEsCi0gICAgMHg3MENBLCAweDA5MUQsIDB4NzBDQiwgMHgxRDFFLCAweDcwQ0QsIDB4MUQyNiwgMHg3MENFLCAweDFEMkIsCi0gICAgMHg3MENGLCAweDA5MjIsIDB4NzBEMSwgMHgxRDFDLCAweDcwRDIsIDB4MUQyMiwgMHg3MEQzLCAweDFEMUIsCi0gICAgMHg3MEQ0LCAweDFEMjUsIDB4NzBENywgMHgxRDIxLCAweDcwRDgsIDB4MDkxRSwgMHg3MEQ5LCAweDA5MjAsCi0gICAgMHg3MERBLCAweDFEMkEsIDB4NzBEQywgMHgxRDFBLCAweDcwREQsIDB4MUQxRCwgMHg3MERFLCAweDFEMjMsCi0gICAgMHg3MEUwLCAweDFEMjQsIDB4NzBFMSwgMHgxRDJDLCAweDcwRTIsIDB4MUQyMCwgMHg3MEU0LCAweDA5MUYsCi0gICAgMHg3MEVGLCAweDBCMTYsIDB4NzBGMCwgMHgxRjcyLCAweDcwRjMsIDB4MUY3NCwgMHg3MEY0LCAweDFGNzAsCi0gICAgMHg3MEY2LCAweDFGN0MsIDB4NzBGNywgMHgxRjZFLCAweDcwRjgsIDB4MUY3QiwgMHg3MEY5LCAweDBCMTIsCi0gICAgMHg3MEZBLCAweDFGNkMsIDB4NzBGQiwgMHgyMUYyLCAweDcwRkMsIDB4MUY3NiwgMHg3MEZELCAweDBCMTUsCi0gICAgMHg3MEZGLCAweDFGNzcsIDB4NzEwMCwgMHgxRjdBLCAweDcxMDIsIDB4MUY3RSwgMHg3MTA0LCAweDFGNzMsCi0gICAgMHg3MTA2LCAweDFGNzgsIDB4NzEwOSwgMHgwQjEzLCAweDcxMEEsIDB4MEIxNCwgMHg3MTBCLCAweDFGN0QsCi0gICAgMHg3MTBDLCAweDFGNzEsIDB4NzEwRCwgMHgxRjZELCAweDcxMEUsIDB4MUY3RiwgMHg3MTEwLCAweDFGNzUsCi0gICAgMHg3MTEzLCAweDFGNzksIDB4NzExNywgMHgxRjZGLCAweDcxMTksIDB4MENDOCwgMHg3MTFBLCAweDBDQzksCi0gICAgMHg3MTFCLCAweDIxRkMsIDB4NzExQywgMHgwQ0NGLCAweDcxMUUsIDB4MjFGMCwgMHg3MTFGLCAweDIxRjksCi0gICAgMHg3MTIwLCAweDIxRUYsIDB4NzEyMSwgMHgwQ0NDLCAweDcxMjIsIDB4MjFGNywgMHg3MTIzLCAweDIxRjUsCi0gICAgMHg3MTI1LCAweDIxRjYsIDB4NzEyNiwgMHgwQ0NBLCAweDcxMjgsIDB4MjFGQSwgMHg3MTJFLCAweDIxRjMsCi0gICAgMHg3MTJGLCAweDIxRjEsIDB4NzEzMCwgMHgwQ0NCLCAweDcxMzEsIDB4MjFGNCwgMHg3MTMyLCAweDIxRjgsCi0gICAgMHg3MTM2LCAweDBDQ0QsIDB4NzEzQSwgMHgyMUZCLCAweDcxNDEsIDB4MjQ3QiwgMHg3MTQyLCAweDI0ODIsCi0gICAgMHg3MTQzLCAweDI0ODQsIDB4NzE0NCwgMHgyNDhBLCAweDcxNDYsIDB4MEU3MiwgMHg3MTQ3LCAweDI0NzYsCi0gICAgMHg3MTQ5LCAweDBFNkEsIDB4NzE0QiwgMHgyNDg1LCAweDcxNEMsIDB4MEU2RiwgMHg3MTRELCAweDI0OEIsCi0gICAgMHg3MTRFLCAweDBFNjYsIDB4NzE1MCwgMHgyNDg4LCAweDcxNTIsIDB4MjQ3OCwgMHg3MTUzLCAweDI0ODksCi0gICAgMHg3MTU0LCAweDI0NzcsIDB4NzE1NiwgMHgwRTc0LCAweDcxNTgsIDB4MjQ4MywgMHg3MTU5LCAweDBFNjcsCi0gICAgMHg3MTVBLCAweDI0OEMsIDB4NzE1QywgMHgwRTZDLCAweDcxNUQsIDB4MjQ3QywgMHg3MTVFLCAweDBFNzEsCi0gICAgMHg3MTVGLCAweDI0ODcsIDB4NzE2MCwgMHgyNDdBLCAweDcxNjEsIDB4MjQ4MSwgMHg3MTYyLCAweDI0N0QsCi0gICAgMHg3MTYzLCAweDI0NzksIDB4NzE2NCwgMHgwRTY5LCAweDcxNjUsIDB4MEU3MCwgMHg3MTY2LCAweDBFNkUsCi0gICAgMHg3MTY3LCAweDBFNkIsIDB4NzE2OCwgMHgwRTczLCAweDcxNjksIDB4MEU2OCwgMHg3MTZBLCAweDI0ODAsCi0gICAgMHg3MTZDLCAweDBFNkQsIDB4NzE2RSwgMHgwQ0NFLCAweDcxNzAsIDB4MjQ4NiwgMHg3MTcyLCAweDI0N0UsCi0gICAgMHg3MTc4LCAweDI0N0YsIDB4NzE3QiwgMHgyNzFFLCAweDcxN0QsIDB4MTAyMywgMHg3MTgwLCAweDI3MUEsCi0gICAgMHg3MTgxLCAweDI3MjAsIDB4NzE4MiwgMHgyNzFDLCAweDcxODQsIDB4MTAyNSwgMHg3MTg1LCAweDI3MUIsCi0gICAgMHg3MTg2LCAweDI3MUYsIDB4NzE4NywgMHgyNzE3LCAweDcxODksIDB4MjcxOSwgMHg3MThBLCAweDEwMjQsCi0gICAgMHg3MThGLCAweDI3MUQsIDB4NzE5MCwgMHgyNzE4LCAweDcxOTIsIDB4MTAyNiwgMHg3MTk0LCAweDEwMjEsCi0gICAgMHg3MTk3LCAweDI3MjEsIDB4NzE5OSwgMHgxMDIyLCAweDcxOUEsIDB4Mjk1QSwgMHg3MTlCLCAweDI5NTcsCi0gICAgMHg3MTlDLCAweDI5NjMsIDB4NzE5RCwgMHgyOTVELCAweDcxOUUsIDB4Mjk1RiwgMHg3MTlGLCAweDExOUUsCi0gICAgMHg3MUEwLCAweDI5NTksIDB4NzFBMSwgMHgyOTYxLCAweDcxQTQsIDB4Mjk2MCwgMHg3MUE1LCAweDI5NUUsCi0gICAgMHg3MUE3LCAweDI5NjQsIDB4NzFBOCwgMHgxMUExLCAweDcxQTksIDB4Mjk1QiwgMHg3MUFBLCAweDI5NjIsCi0gICAgMHg3MUFDLCAweDExOUYsIDB4NzFBRiwgMHgyOTU2LCAweDcxQjAsIDB4Mjk1OCwgMHg3MUIxLCAweDExQTAsCi0gICAgMHg3MUIyLCAweDI5NTUsIDB4NzFCMywgMHgyOTY1LCAweDcxQjUsIDB4Mjk1QywgMHg3MUI4LCAweDJCQjMsCi0gICAgMHg3MUI5LCAweDEyRjMsIDB4NzFCQywgMHgyQkJFLCAweDcxQkQsIDB4MkJCQywgMHg3MUJFLCAweDEyRUQsCi0gICAgMHg3MUJGLCAweDJCQjIsIDB4NzFDMCwgMHgyQkI1LCAweDcxQzEsIDB4MkJCNiwgMHg3MUMyLCAweDJCQjEsCi0gICAgMHg3MUMzLCAweDEyRjcsIDB4NzFDNCwgMHgxMkY4LCAweDcxQzUsIDB4MkJCMCwgMHg3MUM2LCAweDJCQkYsCi0gICAgMHg3MUM3LCAweDJCQkEsIDB4NzFDOCwgMHgxMkYxLCAweDcxQzksIDB4MTJFRSwgMHg3MUNBLCAweDJCQjksCi0gICAgMHg3MUNCLCAweDJCQjcsIDB4NzFDRSwgMHgxMkY0LCAweDcxQ0YsIDB4MkJCQiwgMHg3MUQwLCAweDEyRUYsCi0gICAgMHg3MUQyLCAweDEyRjAsIDB4NzFENCwgMHgyQkI4LCAweDcxRDUsIDB4MTJGMiwgMHg3MUQ2LCAweDJCQjQsCi0gICAgMHg3MUQ4LCAweDJCQkQsIDB4NzFEOSwgMHgxMkY1LCAweDcxREEsIDB4MkJDMCwgMHg3MURCLCAweDJCQzEsCi0gICAgMHg3MURDLCAweDEyRjYsIDB4NzFERiwgMHgxNDA0LCAweDcxRTAsIDB4MTQwQiwgMHg3MUUxLCAweDJEOUIsCi0gICAgMHg3MUUyLCAweDJEQTEsIDB4NzFFNCwgMHgyRDlGLCAweDcxRTUsIDB4MTQwNywgMHg3MUU2LCAweDE0MDYsCi0gICAgMHg3MUU3LCAweDE0MDMsIDB4NzFFOCwgMHgyRDlELCAweDcxRUMsIDB4MTQwOSwgMHg3MUVELCAweDE0MDgsCi0gICAgMHg3MUVFLCAweDE0MDUsIDB4NzFGMCwgMHgyREEwLCAweDcxRjEsIDB4MkQ5QywgMHg3MUYyLCAweDJEOUUsCi0gICAgMHg3MUY0LCAweDE0MEEsIDB4NzFGOCwgMHgxNEYxLCAweDcxRjksIDB4MkY1MiwgMHg3MUZCLCAweDE0RUUsCi0gICAgMHg3MUZDLCAweDE0RUYsIDB4NzFGRCwgMHgyRjU0LCAweDcxRkUsIDB4MTRGMCwgMHg3MUZGLCAweDJGNTEsCi0gICAgMHg3MjAxLCAweDJGNTAsIDB4NzIwMiwgMHgzMEI5LCAweDcyMDMsIDB4MkY1MywgMHg3MjA1LCAweDMwQkEsCi0gICAgMHg3MjA2LCAweDE1OTEsIDB4NzIwNywgMHgzMEI4LCAweDcyMEEsIDB4MzBCNywgMHg3MjBDLCAweDMwQjYsCi0gICAgMHg3MjBELCAweDE1OTIsIDB4NzIxMCwgMHgxNjFGLCAweDcyMTMsIDB4MzFGNCwgMHg3MjE0LCAweDMxRjUsCi0gICAgMHg3MjE5LCAweDMyRTEsIDB4NzIxQSwgMHgzMkUwLCAweDcyMUIsIDB4MTY3QiwgMHg3MjFELCAweDMyREYsCi0gICAgMHg3MjFFLCAweDMzOEQsIDB4NzIxRiwgMHgzMzhFLCAweDcyMjIsIDB4MzQyNCwgMHg3MjIzLCAweDM0OEMsCi0gICAgMHg3MjI2LCAweDM0RDEsIDB4NzIyNywgMHgzNTM1LCAweDcyMjgsIDB4MTc2NiwgMHg3MjI5LCAweDM1NDksCi0gICAgMHg3MjJBLCAweDAyRTcsIDB4NzIyQywgMHgwNjQ1LCAweDcyMkQsIDB4MDY0NiwgMHg3MjMwLCAweDA3OTEsCi0gICAgMHg3MjM1LCAweDE0MEMsIDB4NzIzNiwgMHgwMkU4LCAweDcyMzgsIDB4MDY0NywgMHg3MjM5LCAweDA5MjMsCi0gICAgMHg3MjNBLCAweDBFNzUsIDB4NzIzQiwgMHgwMkU5LCAweDcyM0QsIDB4MEIxNywgMHg3MjNFLCAweDEwMjcsCi0gICAgMHg3MjNGLCAweDE3OEQsIDB4NzI0MSwgMHgxQjZFLCAweDcyNDIsIDB4MUQyRCwgMHg3MjQ0LCAweDI3MjIsCi0gICAgMHg3MjQ2LCAweDE0MEQsIDB4NzI0NywgMHgwMkVBLCAweDcyNDgsIDB4MDY0OCwgMHg3MjQ5LCAweDFCNkYsCi0gICAgMHg3MjRBLCAweDFCNzAsIDB4NzI0QiwgMHgyMUZELCAweDcyNEMsIDB4MENEMCwgMHg3MjRGLCAweDI0OEQsCi0gICAgMHg3MjUyLCAweDBFNzYsIDB4NzI1MywgMHgyNzIzLCAweDcyNTYsIDB4MTFBMiwgMHg3MjU4LCAweDE1OTMsCi0gICAgMHg3MjU5LCAweDAyRUIsIDB4NzI1QSwgMHgyMUZFLCAweDcyNUIsIDB4MDJFQywgMHg3MjVELCAweDAzRjQsCi0gICAgMHg3MjVFLCAweDE4MEIsIDB4NzI1RiwgMHgwM0YzLCAweDcyNjAsIDB4MDRFQywgMHg3MjYxLCAweDA0RUIsCi0gICAgMHg3MjYyLCAweDA0RUEsIDB4NzI2MywgMHgxOEM1LCAweDcyNjcsIDB4MDY0OSwgMHg3MjY5LCAweDA2NEEsCi0gICAgMHg3MjZBLCAweDE5RkEsIDB4NzI2QywgMHgxQjcxLCAweDcyNkUsIDB4MUI3NCwgMHg3MjZGLCAweDA3OTMsCi0gICAgMHg3MjcwLCAweDFCNzIsIDB4NzI3MiwgMHgwNzkyLCAweDcyNzMsIDB4MUI3MywgMHg3Mjc0LCAweDA3OTQsCi0gICAgMHg3Mjc2LCAweDFEMzAsIDB4NzI3NywgMHgxRDJGLCAweDcyNzgsIDB4MUQyRSwgMHg3Mjc5LCAweDA5MjQsCi0gICAgMHg3MjdCLCAweDFGODEsIDB4NzI3QywgMHgxRjgyLCAweDcyN0QsIDB4MEIxOCwgMHg3MjdFLCAweDFGODAsCi0gICAgMHg3MjdGLCAweDFGODMsIDB4NzI4MCwgMHgwQ0QyLCAweDcyODEsIDB4MEIxOSwgMHg3Mjg0LCAweDBDRDEsCi0gICAgMHg3Mjg1LCAweDIyMDIsIDB4NzI4NiwgMHgyMjAxLCAweDcyODgsIDB4MjFGRiwgMHg3Mjg5LCAweDIyMDAsCi0gICAgMHg3MjhCLCAweDIyMDMsIDB4NzI4QywgMHgyNDhGLCAweDcyOEQsIDB4MjQ4RSwgMHg3MjhFLCAweDI0OTIsCi0gICAgMHg3MjkwLCAweDI0OTEsIDB4NzI5MSwgMHgyNDkwLCAweDcyOTIsIDB4MTAyOCwgMHg3MjkzLCAweDI3MjYsCi0gICAgMHg3Mjk1LCAweDI3MjUsIDB4NzI5NiwgMHgxMDI5LCAweDcyOTcsIDB4MjcyNCwgMHg3Mjk4LCAweDI5NjYsCi0gICAgMHg3MjlBLCAweDI5NjcsIDB4NzI5QiwgMHgxMUEzLCAweDcyOUQsIDB4MkJDMiwgMHg3MjlFLCAweDJCQzMsCi0gICAgMHg3MkExLCAweDMwQkYsIDB4NzJBMiwgMHgxNTk0LCAweDcyQTMsIDB4MzBCRSwgMHg3MkE0LCAweDMwQkQsCi0gICAgMHg3MkE1LCAweDMwQkIsIDB4NzJBNiwgMHgzMEJDLCAweDcyQTcsIDB4MTY3QywgMHg3MkE4LCAweDMxRjYsCi0gICAgMHg3MkE5LCAweDMzOEYsIDB4NzJBQSwgMHgzNEQyLCAweDcyQUMsIDB4MDJFRCwgMHg3MkFFLCAweDE3QUYsCi0gICAgMHg3MkFGLCAweDAzNTUsIDB4NzJCMCwgMHgxN0IwLCAweDcyQjQsIDB4MTgwQywgMHg3MkI1LCAweDE4MEQsCi0gICAgMHg3MkJBLCAweDE4Q0IsIDB4NzJCRCwgMHgxOEM3LCAweDcyQkYsIDB4MThDNiwgMHg3MkMwLCAweDA2NEIsCi0gICAgMHg3MkMxLCAweDE4Q0EsIDB4NzJDMiwgMHgwNEVFLCAweDcyQzMsIDB4MThDOCwgMHg3MkM0LCAweDA0RUQsCi0gICAgMHg3MkM1LCAweDE4Q0MsIDB4NzJDNiwgMHgxOEM5LCAweDcyQzksIDB4MTlGRSwgMHg3MkNBLCAweDFCNzUsCi0gICAgMHg3MkNCLCAweDE5RkMsIDB4NzJDQywgMHgxQTAzLCAweDcyQ0UsIDB4MDY0QywgMHg3MkQwLCAweDA2NEYsCi0gICAgMHg3MkQxLCAweDFBMDQsIDB4NzJEMiwgMHgxQTAwLCAweDcyRDQsIDB4MUEwMSwgMHg3MkQ2LCAweDE5RkIsCi0gICAgMHg3MkQ3LCAweDA2NEUsIDB4NzJEOCwgMHgxOUZELCAweDcyRDksIDB4MDY0RCwgMHg3MkRBLCAweDFBMDIsCi0gICAgMHg3MkRDLCAweDE5RkYsIDB4NzJERiwgMHgxQjc5LCAweDcyRTAsIDB4MDc5NiwgMHg3MkUxLCAweDA3OTcsCi0gICAgMHg3MkUzLCAweDFCN0MsIDB4NzJFNCwgMHgxQjc2LCAweDcyRTYsIDB4MUI3QiwgMHg3MkU4LCAweDFCNzcsCi0gICAgMHg3MkU5LCAweDA3OTUsIDB4NzJFQSwgMHgxQjdBLCAweDcyRUIsIDB4MUI3OCwgMHg3MkYzLCAweDFEMzYsCi0gICAgMHg3MkY0LCAweDFEMzMsIDB4NzJGNiwgMHgxRDM1LCAweDcyRjcsIDB4MDkyOSwgMHg3MkY4LCAweDA5MjgsCi0gICAgMHg3MkY5LCAweDA5MjYsIDB4NzJGQSwgMHgxRDMyLCAweDcyRkIsIDB4MUQzNywgMHg3MkZDLCAweDA5MjUsCi0gICAgMHg3MkZELCAweDA5MjcsIDB4NzJGRSwgMHgxRDM0LCAweDcyRkYsIDB4MUY4QiwgMHg3MzAwLCAweDFEMzEsCi0gICAgMHg3MzAxLCAweDFEMzgsIDB4NzMwNywgMHgxRjg2LCAweDczMDgsIDB4MUY4QSwgMHg3MzBBLCAweDFGODksCi0gICAgMHg3MzBCLCAweDIyMDUsIDB4NzMwQywgMHgyMjEwLCAweDczMEYsIDB4MUY4QywgMHg3MzExLCAweDFGODcsCi0gICAgMHg3MzEyLCAweDIyMDQsIDB4NzMxMywgMHgwQjFELCAweDczMTYsIDB4MEIxQywgMHg3MzE3LCAweDFGODUsCi0gICAgMHg3MzE4LCAweDFGODgsIDB4NzMxOSwgMHgwQjFFLCAweDczMUIsIDB4MEIxQiwgMHg3MzFDLCAweDBCMUEsCi0gICAgMHg3MzFELCAweDFGODQsIDB4NzMxRSwgMHgxRjhELCAweDczMjIsIDB4MjIwNywgMHg3MzIzLCAweDIyMEUsCi0gICAgMHg3MzI1LCAweDBDRDQsIDB4NzMyNiwgMHgyMjBELCAweDczMjcsIDB4MjIwQSwgMHg3MzI5LCAweDBDRDYsCi0gICAgMHg3MzJELCAweDIyMEMsIDB4NzMzMCwgMHgyMjA2LCAweDczMzEsIDB4MjIwOCwgMHg3MzMyLCAweDIyMEIsCi0gICAgMHg3MzMzLCAweDIyMDksIDB4NzMzNCwgMHgwQ0Q1LCAweDczMzUsIDB4MjIwRiwgMHg3MzM2LCAweDBDRDMsCi0gICAgMHg3MzM3LCAweDBFNzcsIDB4NzMzQSwgMHgyNDk2LCAweDczM0IsIDB4MjQ5NSwgMHg3MzNDLCAweDI0OTMsCi0gICAgMHg3MzNFLCAweDBFN0EsIDB4NzMzRiwgMHgwRTc5LCAweDczNDAsIDB4MjQ5NywgMHg3MzQyLCAweDI0OTQsCi0gICAgMHg3MzQzLCAweDI3MjcsIDB4NzM0NCwgMHgxMDJBLCAweDczNDUsIDB4MEU3OCwgMHg3MzQ5LCAweDI0OTksCi0gICAgMHg3MzRBLCAweDI0OTgsIDB4NzM0QywgMHgyNzJBLCAweDczNEQsIDB4MjcyOCwgMHg3MzRFLCAweDExQTQsCi0gICAgMHg3MzUwLCAweDEwMkIsIDB4NzM1MSwgMHgyNzI5LCAweDczNTIsIDB4Mjk2OSwgMHg3MzU3LCAweDExQTUsCi0gICAgMHg3MzU4LCAweDI5NjgsIDB4NzM1OSwgMHgyOTcxLCAweDczNUEsIDB4Mjk3MCwgMHg3MzVCLCAweDI5NkUsCi0gICAgMHg3MzVELCAweDI5NkQsIDB4NzM1RSwgMHgyOTZBLCAweDczNUYsIDB4Mjk2QiwgMHg3MzYwLCAweDI5NkMsCi0gICAgMHg3MzYxLCAweDI5NkYsIDB4NzM2MiwgMHgyOTcyLCAweDczNjUsIDB4MkJDOCwgMHg3MzY2LCAweDJCQzUsCi0gICAgMHg3MzY3LCAweDJCQzYsIDB4NzM2OCwgMHgxMkY5LCAweDczNjksIDB4MkJDNCwgMHg3MzZBLCAweDJCQ0EsCi0gICAgMHg3MzZCLCAweDJCQzksIDB4NzM2QywgMHgyQkM3LCAweDczNkUsIDB4MkRBMywgMHg3MzZGLCAweDJEQTQsCi0gICAgMHg3MzcwLCAweDE0MEUsIDB4NzM3MiwgMHgxNDBGLCAweDczNzMsIDB4MkRBMiwgMHg3Mzc1LCAweDE0RjMsCi0gICAgMHg3Mzc2LCAweDJGNTUsIDB4NzM3NywgMHgxNEYyLCAweDczNzgsIDB4MTU5NSwgMHg3MzdBLCAweDE1OTYsCi0gICAgMHg3MzdCLCAweDE2MjAsIDB4NzM3QywgMHgzMUY4LCAweDczN0QsIDB4MzFGNywgMHg3MzdFLCAweDMyRTIsCi0gICAgMHg3MzdGLCAweDMzOTAsIDB4NzM4MCwgMHgxNkNBLCAweDczODEsIDB4MzQyNiwgMHg3MzgyLCAweDM0MjUsCi0gICAgMHg3MzgzLCAweDM0MjcsIDB4NzM4NCwgMHgwMzU2LCAweDczODUsIDB4MUI3RCwgMHg3Mzg2LCAweDA5MkEsCi0gICAgMHg3Mzg3LCAweDBCMUYsIDB4NzM4OCwgMHgxRjhFLCAweDczODksIDB4MDM1NywgMHg3MzhBLCAweDE3QjEsCi0gICAgMHg3MzhCLCAweDAyRUUsIDB4NzM4RSwgMHgxODBFLCAweDczOTIsIDB4MThEMSwgMHg3MzkzLCAweDE4Q0YsCi0gICAgMHg3Mzk0LCAweDE4RDAsIDB4NzM5NSwgMHgxOENELCAweDczOTYsIDB4MDRFRiwgMHg3Mzk3LCAweDE4Q0UsCi0gICAgMHg3MzlELCAweDFBMEMsIDB4NzM5RiwgMHgwNjUyLCAweDczQTAsIDB4MUEwQSwgMHg3M0ExLCAweDFBMDYsCi0gICAgMHg3M0EyLCAweDFBMDksIDB4NzNBNCwgMHgxQTA1LCAweDczQTUsIDB4MDY1NCwgMHg3M0E2LCAweDFBMDgsCi0gICAgMHg3M0E4LCAweDA2NTEsIDB4NzNBOSwgMHgwNjUwLCAweDczQUIsIDB4MDY1MywgMHg3M0FDLCAweDFBMEIsCi0gICAgMHg3M0FELCAweDFBMDcsIDB4NzNCMiwgMHgwNzlCLCAweDczQjMsIDB4MDc5RSwgMHg3M0I0LCAweDFCODUsCi0gICAgMHg3M0I1LCAweDFCODQsIDB4NzNCNiwgMHgxQjgzLCAweDczQjcsIDB4MDc5OCwgMHg3M0I4LCAweDFCOEMsCi0gICAgMHg3M0I5LCAweDFCODIsIDB4NzNCQiwgMHgwNzlBLCAweDczQkMsIDB4MUQzRCwgMHg3M0JFLCAweDFCODksCi0gICAgMHg3M0JGLCAweDFCODcsIDB4NzNDMCwgMHgwNzlELCAweDczQzIsIDB4MUI3RiwgMHg3M0MzLCAweDFCOEEsCi0gICAgMHg3M0M1LCAweDFCODEsIDB4NzNDNiwgMHgxQjhCLCAweDczQzcsIDB4MUI4OCwgMHg3M0M4LCAweDFCODAsCi0gICAgMHg3M0NBLCAweDA3OTksIDB4NzNDQiwgMHgxQjhELCAweDczQ0MsIDB4MUI3RSwgMHg3M0NELCAweDA3OUMsCi0gICAgMHg3M0QyLCAweDFENDIsIDB4NzNEMywgMHgxRDM5LCAweDczRDQsIDB4MUQ0NCwgMHg3M0Q2LCAweDFEM0MsCi0gICAgMHg3M0Q3LCAweDFENDcsIDB4NzNEOCwgMHgxRDQ4LCAweDczRDksIDB4MUQzQSwgMHg3M0RBLCAweDFENDYsCi0gICAgMHg3M0RCLCAweDFENDMsIDB4NzNEQywgMHgxRDQxLCAweDczREQsIDB4MUQ0NSwgMHg3M0RFLCAweDA5MzAsCi0gICAgMHg3M0UwLCAweDA5MkUsIDB4NzNFMywgMHgxRDNGLCAweDczRTUsIDB4MUQzQiwgMHg3M0U3LCAweDFEM0UsCi0gICAgMHg3M0U4LCAweDFENDksIDB4NzNFOSwgMHgxRDQwLCAweDczRUEsIDB4MDkyRiwgMHg3M0VCLCAweDFCODYsCi0gICAgMHg3M0VELCAweDA5MkIsIDB4NzNFRSwgMHgwOTJELCAweDczRjQsIDB4MUY5QywgMHg3M0Y1LCAweDFGOTEsCi0gICAgMHg3M0Y2LCAweDFGOEYsIDB4NzNGOCwgMHgxRjkwLCAweDczRkEsIDB4MUY5NywgMHg3M0ZDLCAweDFGOTgsCi0gICAgMHg3M0ZELCAweDFGOTQsIDB4NzNGRSwgMHgwQjI0LCAweDczRkYsIDB4MUY5OSwgMHg3NDAwLCAweDFGOTYsCi0gICAgMHg3NDAxLCAweDFGOTMsIDB4NzQwMywgMHgwQjIyLCAweDc0MDQsIDB4MUY5MiwgMHg3NDA1LCAweDBCMjAsCi0gICAgMHg3NDA2LCAweDBCMjMsIDB4NzQwNywgMHgxRjk1LCAweDc0MDgsIDB4MUY5RCwgMHg3NDA5LCAweDA5MkMsCi0gICAgMHg3NDBBLCAweDBCMjEsIDB4NzQwQiwgMHgxRjlCLCAweDc0MEMsIDB4MUY5QSwgMHg3NDBELCAweDBCMjUsCi0gICAgMHg3NDE2LCAweDIyMTUsIDB4NzQxQSwgMHgyMjE2LCAweDc0MUIsIDB4MENFMCwgMHg3NDFELCAweDIyMUMsCi0gICAgMHg3NDIwLCAweDIyMUUsIDB4NzQyMSwgMHgyMjE3LCAweDc0MjIsIDB4MENEQSwgMHg3NDIzLCAweDIyMUIsCi0gICAgMHg3NDI0LCAweDIyMUEsIDB4NzQyNSwgMHgwQ0RCLCAweDc0MjYsIDB4MENFMSwgMHg3NDI4LCAweDBDRTIsCi0gICAgMHg3NDI5LCAweDIyMUQsIDB4NzQyQSwgMHgwQ0Q4LCAweDc0MkIsIDB4MjIxNCwgMHg3NDJDLCAweDIyMTIsCi0gICAgMHg3NDJELCAweDIyMTgsIDB4NzQyRSwgMHgyMjExLCAweDc0MkYsIDB4MENERiwgMHg3NDMwLCAweDIyMTMsCi0gICAgMHg3NDMxLCAweDIyMTksIDB4NzQzMiwgMHgyMjFGLCAweDc0MzMsIDB4MENEOSwgMHg3NDM0LCAweDBDREUsCi0gICAgMHg3NDM1LCAweDBDREMsIDB4NzQzNiwgMHgwQ0RELCAweDc0M0EsIDB4MENENywgMHg3NDNGLCAweDBFODEsCi0gICAgMHg3NDQwLCAweDI0QTAsIDB4NzQ0MSwgMHgwRTgwLCAweDc0NDIsIDB4MjRBNCwgMHg3NDQ0LCAweDI0OUEsCi0gICAgMHg3NDQ2LCAweDI0QTUsIDB4NzQ0QSwgMHgyNDlCLCAweDc0NEIsIDB4MjQ5QywgMHg3NDRELCAweDI0QTYsCi0gICAgMHg3NDRFLCAweDI0QTMsIDB4NzQ0RiwgMHgyNEExLCAweDc0NTAsIDB4MjRBMiwgMHg3NDUxLCAweDI0OUUsCi0gICAgMHg3NDUyLCAweDI0OUQsIDB4NzQ1NCwgMHgyNEE3LCAweDc0NTUsIDB4MEU3RCwgMHg3NDU3LCAweDI0OUYsCi0gICAgMHg3NDU5LCAweDBFODIsIDB4NzQ1QSwgMHgwRTdDLCAweDc0NUIsIDB4MEU4MywgMHg3NDVDLCAweDBFODQsCi0gICAgMHg3NDVFLCAweDBFN0YsIDB4NzQ1RiwgMHgwRTdFLCAweDc0NjIsIDB4MjcyQiwgMHg3NDYzLCAweDEwMkQsCi0gICAgMHg3NDY0LCAweDEwMkMsIDB4NzQ2NywgMHgyNzMwLCAweDc0NjksIDB4MTFBNiwgMHg3NDZBLCAweDEwMkUsCi0gICAgMHg3NDZELCAweDEwMzAsIDB4NzQ2RSwgMHgyNzMxLCAweDc0NkYsIDB4MEU3QiwgMHg3NDcwLCAweDEwMkYsCi0gICAgMHg3NDcxLCAweDI3MkQsIDB4NzQ3MiwgMHgyNzJGLCAweDc0NzMsIDB4MjcyQywgMHg3NDc1LCAweDI3MkUsCi0gICAgMHg3NDc5LCAweDI5N0MsIDB4NzQ3QywgMHgyOTdCLCAweDc0N0QsIDB4Mjk3OCwgMHg3NDdFLCAweDExQTksCi0gICAgMHg3NDdGLCAweDJCQ0IsIDB4NzQ4MCwgMHgxMUFBLCAweDc0ODEsIDB4Mjk3NywgMHg3NDgzLCAweDExQTgsCi0gICAgMHg3NDg1LCAweDI5NzksIDB4NzQ4NiwgMHgyOTc2LCAweDc0ODcsIDB4Mjk3MywgMHg3NDg4LCAweDI5N0EsCi0gICAgMHg3NDg5LCAweDI5NzQsIDB4NzQ4QSwgMHgyOTc1LCAweDc0OEIsIDB4MTFBNywgMHg3NDkwLCAweDJEQTgsCi0gICAgMHg3NDkyLCAweDJCQ0YsIDB4NzQ5NCwgMHgyQkNFLCAweDc0OTUsIDB4MkJEMCwgMHg3NDk3LCAweDJEQTUsCi0gICAgMHg3NDk4LCAweDEyRkMsIDB4NzQ5QSwgMHgyQkNDLCAweDc0OUMsIDB4MTJGQSwgMHg3NDlFLCAweDEyRkUsCi0gICAgMHg3NDlGLCAweDEyRkQsIDB4NzRBMCwgMHgyQkNELCAweDc0QTEsIDB4MkJEMSwgMHg3NEEzLCAweDEyRkIsCi0gICAgMHg3NEE1LCAweDJEQUMsIDB4NzRBNiwgMHgxNDEyLCAweDc0QTcsIDB4MTRGNCwgMHg3NEE4LCAweDE0MTMsCi0gICAgMHg3NEE5LCAweDE0MTAsIDB4NzRBQSwgMHgyREE5LCAweDc0QUIsIDB4MkRBNywgMHg3NEFELCAweDJEQUEsCi0gICAgMHg3NEFGLCAweDJEQUQsIDB4NzRCMCwgMHgxNDExLCAweDc0QjEsIDB4MkRBQiwgMHg3NEIyLCAweDJEQTYsCi0gICAgMHg3NEI1LCAweDJGNTgsIDB4NzRCNiwgMHgyRjVCLCAweDc0QjcsIDB4MzBDMiwgMHg3NEI4LCAweDJGNTYsCi0gICAgMHg3NEJBLCAweDMxRjksIDB4NzRCQiwgMHgyRjVDLCAweDc0QkQsIDB4MTU5NywgMHg3NEJFLCAweDJGNUEsCi0gICAgMHg3NEJGLCAweDE0RjUsIDB4NzRDMCwgMHgyRjU3LCAweDc0QzEsIDB4MkY1OSwgMHg3NEMyLCAweDJGNUQsCi0gICAgMHg3NEMzLCAweDMwQzMsIDB4NzRDNSwgMHgzMEMxLCAweDc0Q0EsIDB4MTU5OCwgMHg3NENCLCAweDMwQzAsCi0gICAgMHg3NENGLCAweDE2MjEsIDB4NzRENCwgMHgxNjdFLCAweDc0RDUsIDB4MzM5MiwgMHg3NEQ2LCAweDE2N0QsCi0gICAgMHg3NEQ3LCAweDMzOTQsIDB4NzREOCwgMHgzMzkxLCAweDc0RDksIDB4MzM5MywgMHg3NERBLCAweDE2RkUsCi0gICAgMHg3NERCLCAweDM0OEQsIDB4NzREQywgMHgwMzU4LCAweDc0REQsIDB4MUEwRCwgMHg3NERFLCAweDFENEEsCi0gICAgMHg3NERGLCAweDFENEIsIDB4NzRFMCwgMHgwQjI2LCAweDc0RTEsIDB4MjRBOCwgMHg3NEUyLCAweDEyRkYsCi0gICAgMHg3NEUzLCAweDE1OTksIDB4NzRFNCwgMHgxNkNCLCAweDc0RTUsIDB4MzQ4RSwgMHg3NEU2LCAweDAzNTksCi0gICAgMHg3NEU4LCAweDFBMEUsIDB4NzRFOSwgMHgwMTIwLCAweDc0RUMsIDB4MUI4RSwgMHg3NEVFLCAweDFCOEYsCi0gICAgMHg3NEY0LCAweDFENEMsIDB4NzRGNSwgMHgxRDRELCAweDc0RjYsIDB4MEIyNywgMHg3NEY3LCAweDBCMjgsCi0gICAgMHg3NEZCLCAweDIyMjAsIDB4NzRGRCwgMHgyNEFCLCAweDc0RkUsIDB4MjRBQSwgMHg3NEZGLCAweDI0QTksCi0gICAgMHg3NTAwLCAweDI3MzIsIDB4NzUwMiwgMHgyNzMzLCAweDc1MDMsIDB4MjczNCwgMHg3NTA0LCAweDEwMzEsCi0gICAgMHg3NTA3LCAweDI5N0UsIDB4NzUwOCwgMHgyOTdELCAweDc1MEIsIDB4MkJEMiwgMHg3NTBDLCAweDEzMDAsCi0gICAgMHg3NTBELCAweDEzMDEsIDB4NzUwRiwgMHgyREIxLCAweDc1MTAsIDB4MkRBRSwgMHg3NTExLCAweDJEQUYsCi0gICAgMHg3NTEyLCAweDJEQjAsIDB4NzUxMywgMHgyRjVGLCAweDc1MTQsIDB4MkY1RSwgMHg3NTE1LCAweDE0RjYsCi0gICAgMHg3NTE2LCAweDMwQzQsIDB4NzUxNywgMHgzMkUzLCAweDc1MTgsIDB4MDM1QSwgMHg3NTFBLCAweDA3OUYsCi0gICAgMHg3NTFDLCAweDBCMjksIDB4NzUxRCwgMHgyNEFDLCAweDc1MUYsIDB4MDM1QiwgMHg3NTIxLCAweDFENEUsCi0gICAgMHg3NTIyLCAweDBCMkEsIDB4NzUyNSwgMHgwQ0UzLCAweDc1MjYsIDB4MENFNCwgMHg3NTI4LCAweDAzNUMsCi0gICAgMHg3NTI5LCAweDAzNUQsIDB4NzUyQSwgMHgxODBGLCAweDc1MkIsIDB4MDRGMSwgMHg3NTJDLCAweDA0RjAsCi0gICAgMHg3NTJELCAweDA3QTAsIDB4NzUyRSwgMHgxQjkwLCAweDc1MkYsIDB4MjIyMSwgMHg3NTMwLCAweDAzNUUsCi0gICAgMHg3NTMxLCAweDAzNUYsIDB4NzUzMiwgMHgwMzYwLCAweDc1MzMsIDB4MDM2MSwgMHg3NTM3LCAweDA0RjIsCi0gICAgMHg3NTM4LCAweDA0RjMsIDB4NzUzOSwgMHgxOEQzLCAweDc1M0EsIDB4MThEMiwgMHg3NTNELCAweDA2NTUsCi0gICAgMHg3NTNFLCAweDFBMTEsIDB4NzUzRiwgMHgxQTBGLCAweDc1NDAsIDB4MUExMCwgMHg3NTQ3LCAweDFCOTEsCi0gICAgMHg3NTQ4LCAweDFCOTIsIDB4NzU0QiwgMHgwN0E0LCAweDc1NEMsIDB4MDdBMiwgMHg3NTRFLCAweDA3QTMsCi0gICAgMHg3NTRGLCAweDA3QTEsIDB4NzU1NCwgMHgwOTMxLCAweDc1NTksIDB4MDkzNSwgMHg3NTVBLCAweDA5MzQsCi0gICAgMHg3NTVCLCAweDFENEYsIDB4NzU1QywgMHgwOTMzLCAweDc1NUQsIDB4MDkzMiwgMHg3NTVGLCAweDFENTAsCi0gICAgMHg3NTYyLCAweDBCMkQsIDB4NzU2MywgMHgxRjlGLCAweDc1NjQsIDB4MUY5RSwgMHg3NTY1LCAweDBCMkIsCi0gICAgMHg3NTY2LCAweDBCMkMsIDB4NzU2QSwgMHgwQ0U2LCAweDc1NkIsIDB4MENFNSwgMHg3NTZDLCAweDIyMjMsCi0gICAgMHg3NTZGLCAweDIyMjIsIDB4NzU3MCwgMHgwQjJFLCAweDc1NzYsIDB4MEU4NSwgMHg3NTc3LCAweDI0QUUsCi0gICAgMHg3NTc4LCAweDBFODYsIDB4NzU3OSwgMHgyNEFELCAweDc1N0QsIDB4MjczNSwgMHg3NTdFLCAweDI5N0YsCi0gICAgMHg3NTdGLCAweDExQUIsIDB4NzU4MCwgMHgyQkQzLCAweDc1ODQsIDB4MkRCMiwgMHg3NTg2LCAweDE1OUIsCi0gICAgMHg3NTg3LCAweDE1OUEsIDB4NzU4QSwgMHgxNkNDLCAweDc1OEIsIDB4MDM2MiwgMHg3NThDLCAweDFBMTIsCi0gICAgMHg3NThGLCAweDBCMkYsIDB4NzU5MCwgMHgyNzM2LCAweDc1OTEsIDB4MTAzMiwgMHg3NTkyLCAweDAyMkUsCi0gICAgMHg3NTk0LCAweDE4RDQsIDB4NzU5NSwgMHgxOEQ1LCAweDc1OTgsIDB4MUExMywgMHg3NTk5LCAweDA2NTcsCi0gICAgMHg3NTlBLCAweDA2NTgsIDB4NzU5RCwgMHgwNjU2LCAweDc1QTIsIDB4MDdBOCwgMHg3NUEzLCAweDA3QTksCi0gICAgMHg3NUE0LCAweDA3QTYsIDB4NzVBNSwgMHgwN0E3LCAweDc1QTcsIDB4MUI5MywgMHg3NUFBLCAweDFCOTQsCi0gICAgMHg3NUFCLCAweDA3QTUsIDB4NzVCMCwgMHgxRDUxLCAweDc1QjIsIDB4MDkzOSwgMHg3NUIzLCAweDA5M0EsCi0gICAgMHg3NUI1LCAweDBCMzIsIDB4NzVCNiwgMHgxRDU3LCAweDc1QjgsIDB4MDkzRiwgMHg3NUI5LCAweDA5M0QsCi0gICAgMHg3NUJBLCAweDFENTgsIDB4NzVCQiwgMHgxRDUzLCAweDc1QkMsIDB4MDkzQywgMHg3NUJELCAweDA5M0IsCi0gICAgMHg3NUJFLCAweDA5MzYsIDB4NzVCRiwgMHgxRDU2LCAweDc1QzAsIDB4MUQ1NSwgMHg3NUMxLCAweDFENTIsCi0gICAgMHg3NUMyLCAweDA5M0UsIDB4NzVDNCwgMHgxRDU0LCAweDc1QzUsIDB4MDkzNywgMHg3NUM3LCAweDA5MzgsCi0gICAgMHg3NUNBLCAweDBCMzMsIDB4NzVDQiwgMHgxRkEzLCAweDc1Q0MsIDB4MUZBNCwgMHg3NUNELCAweDBCMzQsCi0gICAgMHg3NUNFLCAweDFGQTAsIDB4NzVDRiwgMHgxRkEyLCAweDc1RDAsIDB4MUZBNiwgMHg3NUQxLCAweDFGQTUsCi0gICAgMHg3NUQyLCAweDFGQTEsIDB4NzVENCwgMHgwQjMwLCAweDc1RDUsIDB4MEIzMSwgMHg3NUQ3LCAweDIyMkIsCi0gICAgMHg3NUQ4LCAweDBDRUIsIDB4NzVEOSwgMHgwQ0VBLCAweDc1REEsIDB4MjIyNSwgMHg3NURCLCAweDBDRTgsCi0gICAgMHg3NURELCAweDIyMjgsIDB4NzVERSwgMHgwQ0VDLCAweDc1REYsIDB4MjIyOSwgMHg3NUUwLCAweDBDRUQsCi0gICAgMHg3NUUxLCAweDIyMjYsIDB4NzVFMiwgMHgwQ0U3LCAweDc1RTMsIDB4MENFOSwgMHg3NUU0LCAweDIyMkEsCi0gICAgMHg3NUU2LCAweDIyMjcsIDB4NzVFNywgMHgyMjI0LCAweDc1RUQsIDB4MjRCQiwgMHg3NUVGLCAweDI0QjAsCi0gICAgMHg3NUYwLCAweDBFODgsIDB4NzVGMSwgMHgwRThCLCAweDc1RjIsIDB4MEU4QSwgMHg3NUYzLCAweDBFOEYsCi0gICAgMHg3NUY0LCAweDBFOEUsIDB4NzVGNSwgMHgyNEJDLCAweDc1RjYsIDB4MjRCQSwgMHg3NUY3LCAweDI0QjMsCi0gICAgMHg3NUY4LCAweDI0QjcsIDB4NzVGOSwgMHgyNEI2LCAweDc1RkEsIDB4MEU4QywgMHg3NUZCLCAweDI0QjksCi0gICAgMHg3NUZDLCAweDI0QjUsIDB4NzVGRCwgMHgyNEJELCAweDc1RkUsIDB4MjRCNCwgMHg3NUZGLCAweDBFOEQsCi0gICAgMHg3NjAwLCAweDBFODcsIDB4NzYwMSwgMHgwRTg5LCAweDc2MDMsIDB4MjRCMiwgMHg3NjA4LCAweDI3MzgsCi0gICAgMHg3NjA5LCAweDEwMzYsIDB4NzYwQSwgMHgyNzNDLCAweDc2MEIsIDB4MTAzNSwgMHg3NjBDLCAweDI3MzksCi0gICAgMHg3NjBELCAweDEwMzQsIDB4NzYwRiwgMHgyNEIxLCAweDc2MTAsIDB4MjRCOCwgMHg3NjExLCAweDI3M0IsCi0gICAgMHg3NjEzLCAweDEwMzcsIDB4NzYxNCwgMHgyNzNELCAweDc2MTUsIDB4MjczQSwgMHg3NjE2LCAweDI3MzcsCi0gICAgMHg3NjE5LCAweDI5ODIsIDB4NzYxQSwgMHgyOTg2LCAweDc2MUIsIDB4Mjk4OCwgMHg3NjFDLCAweDI5ODQsCi0gICAgMHg3NjFELCAweDI5ODMsIDB4NzYxRSwgMHgyOTgxLCAweDc2MUYsIDB4MTFBRSwgMHg3NjIwLCAweDExQUMsCi0gICAgMHg3NjIxLCAweDExQjEsIDB4NzYyMiwgMHgxMUIyLCAweDc2MjMsIDB4Mjk4NSwgMHg3NjI0LCAweDExQUYsCi0gICAgMHg3NjI1LCAweDI5ODAsIDB4NzYyNiwgMHgxMUIwLCAweDc2MjcsIDB4MTAzMywgMHg3NjI4LCAweDI5ODcsCi0gICAgMHg3NjI5LCAweDExQUQsIDB4NzYyRCwgMHgyQkQ1LCAweDc2MkYsIDB4MkJENCwgMHg3NjMwLCAweDJCREMsCi0gICAgMHg3NjMxLCAweDJCRDYsIDB4NzYzMiwgMHgyQkRCLCAweDc2MzMsIDB4MkJEOCwgMHg3NjM0LCAweDEzMDIsCi0gICAgMHg3NjM1LCAweDJCREEsIDB4NzYzOCwgMHgxMzAzLCAweDc2M0EsIDB4MTMwNCwgMHg3NjNDLCAweDJCRDksCi0gICAgMHg3NjNELCAweDJCRDcsIDB4NzY0MiwgMHgxNDE1LCAweDc2NDMsIDB4MkRCMywgMHg3NjQ2LCAweDE0MTQsCi0gICAgMHg3NjQ3LCAweDJEQjYsIDB4NzY0OCwgMHgyREI0LCAweDc2NDksIDB4MkRCNSwgMHg3NjRDLCAweDE0MTYsCi0gICAgMHg3NjUwLCAweDJGNjMsIDB4NzY1MiwgMHgxNEY5LCAweDc2NTMsIDB4MkY2NCwgMHg3NjU2LCAweDE0RjcsCi0gICAgMHg3NjU3LCAweDJGNjUsIDB4NzY1OCwgMHgxNEY4LCAweDc2NTksIDB4MkY2MiwgMHg3NjVBLCAweDJGNjYsCi0gICAgMHg3NjVDLCAweDJGNjAsIDB4NzY1RiwgMHgxNTlDLCAweDc2NjAsIDB4MzBDNSwgMHg3NjYxLCAweDE1OUQsCi0gICAgMHg3NjYyLCAweDE2MjIsIDB4NzY2NCwgMHgyRjYxLCAweDc2NjUsIDB4MTYyMywgMHg3NjY5LCAweDE2N0YsCi0gICAgMHg3NjZBLCAweDMyRTQsIDB4NzY2QywgMHgxNkNFLCAweDc2NkQsIDB4MzM5NSwgMHg3NjZFLCAweDE2Q0QsCi0gICAgMHg3NjcwLCAweDM0MjgsIDB4NzY3MSwgMHgxNzIzLCAweDc2NzIsIDB4MTcyNCwgMHg3Njc1LCAweDM1NDMsCi0gICAgMHg3Njc2LCAweDAyMkYsIDB4NzY3OCwgMHgwN0FBLCAweDc2NzksIDB4MUI5NSwgMHg3NjdCLCAweDBDRUUsCi0gICAgMHg3NjdDLCAweDBDRUYsIDB4NzY3RCwgMHgwMzYzLCAweDc2N0UsIDB4MDNGNSwgMHg3NjdGLCAweDE4MTAsCi0gICAgMHg3NjgxLCAweDE4RDYsIDB4NzY4MiwgMHgwNEY0LCAweDc2ODQsIDB4MDY1OSwgMHg3Njg2LCAweDA3QUIsCi0gICAgMHg3Njg3LCAweDA3QUMsIDB4NzY4OCwgMHgwN0FELCAweDc2ODksIDB4MUZBOCwgMHg3NjhBLCAweDFENTksCi0gICAgMHg3NjhCLCAweDA5NDAsIDB4NzY4RSwgMHgwQjM1LCAweDc2OEYsIDB4MUZBNywgMHg3NjkyLCAweDIyMkQsCi0gICAgMHg3NjkzLCAweDBDRjEsIDB4NzY5NSwgMHgyMjJDLCAweDc2OTYsIDB4MENGMCwgMHg3Njk5LCAweDI0QkUsCi0gICAgMHg3NjlBLCAweDExQjMsIDB4NzY5QiwgMHgyOThDLCAweDc2OUMsIDB4Mjk4OSwgMHg3NjlELCAweDI5OEEsCi0gICAgMHg3NjlFLCAweDI5OEIsIDB4NzZBNCwgMHgyREI3LCAweDc2QTYsIDB4MkY2NywgMHg3NkFBLCAweDMxRkIsCi0gICAgMHg3NkFCLCAweDMxRkEsIDB4NzZBRCwgMHgzMzk2LCAweDc2QUUsIDB4MDM2NCwgMHg3NkFGLCAweDFBMTQsCi0gICAgMHg3NkIwLCAweDA5NDEsIDB4NzZCNCwgMHgwQ0YyLCAweDc2QjUsIDB4MjRCRiwgMHg3NkI4LCAweDI3M0UsCi0gICAgMHg3NkJBLCAweDExQjQsIDB4NzZCQiwgMHgyQkRELCAweDc2QkQsIDB4MkY2OCwgMHg3NkJFLCAweDMxRkMsCi0gICAgMHg3NkJGLCAweDAzNjUsIDB4NzZDMiwgMHgwNjVBLCAweDc2QzMsIDB4MDdCMCwgMHg3NkM0LCAweDFCOTYsCi0gICAgMHg3NkM1LCAweDA3QjEsIDB4NzZDNiwgMHgwN0FGLCAweDc2QzgsIDB4MDdBRSwgMHg3NkM5LCAweDFENUEsCi0gICAgMHg3NkNBLCAweDA5NDIsIDB4NzZDRCwgMHgwOTQzLCAweDc2Q0UsIDB4MDk0NCwgMHg3NkQyLCAweDBCMzcsCi0gICAgMHg3NkQzLCAweDFGQTksIDB4NzZENCwgMHgwQjM2LCAweDc2REEsIDB4MjIyRSwgMHg3NkRCLCAweDBCMzgsCi0gICAgMHg3NkRDLCAweDBDRjMsIDB4NzZERCwgMHgyNEMwLCAweDc2REUsIDB4MEU5MCwgMHg3NkRGLCAweDBFOTEsCi0gICAgMHg3NkUxLCAweDEwMzgsIDB4NzZFMywgMHgxMDM5LCAweDc2RTQsIDB4MTFCNSwgMHg3NkU1LCAweDEzMDYsCi0gICAgMHg3NkU2LCAweDJCREUsIDB4NzZFNywgMHgxMzA1LCAweDc2RTksIDB4MkRCOCwgMHg3NkVBLCAweDE0MTcsCi0gICAgMHg3NkVDLCAweDJGNjksIDB4NzZFRCwgMHgzMUZELCAweDc2RUUsIDB4MDM2NiwgMHg3NkVGLCAweDA0RjUsCi0gICAgMHg3NkYwLCAweDFBMTcsIDB4NzZGMSwgMHgxQTE2LCAweDc2RjIsIDB4MDY1QiwgMHg3NkYzLCAweDFBMTUsCi0gICAgMHg3NkY0LCAweDA2NUMsIDB4NzZGNSwgMHgxQTE4LCAweDc2RjcsIDB4MUI5QywgMHg3NkY4LCAweDA3QjQsCi0gICAgMHg3NkY5LCAweDA3QjMsIDB4NzZGQSwgMHgxQjlFLCAweDc2RkIsIDB4MUI5RCwgMHg3NkZDLCAweDA3QjgsCi0gICAgMHg3NkZFLCAweDA3QjcsIDB4NzcwMSwgMHgwN0IyLCAweDc3MDMsIDB4MUI5OCwgMHg3NzA0LCAweDFCOTksCi0gICAgMHg3NzA1LCAweDFCOUEsIDB4NzcwNywgMHgwN0I5LCAweDc3MDgsIDB4MUI5NywgMHg3NzA5LCAweDA3QjUsCi0gICAgMHg3NzBBLCAweDFCOUIsIDB4NzcwQiwgMHgwN0I2LCAweDc3MTAsIDB4MUQ1RCwgMHg3NzExLCAweDFENjEsCi0gICAgMHg3NzEyLCAweDFENUYsIDB4NzcxMywgMHgxRDVFLCAweDc3MTUsIDB4MUQ2MiwgMHg3NzE5LCAweDFENjMsCi0gICAgMHg3NzFBLCAweDFENjQsIDB4NzcxQiwgMHgxRDVDLCAweDc3MUQsIDB4MUQ1QiwgMHg3NzFGLCAweDA5NDYsCi0gICAgMHg3NzIwLCAweDA5NDcsIDB4NzcyMiwgMHgxRDY1LCAweDc3MjMsIDB4MUQ2MCwgMHg3NzI1LCAweDFGQjIsCi0gICAgMHg3NzI3LCAweDFENjYsIDB4NzcyOCwgMHgwOTQ4LCAweDc3MjksIDB4MDk0NSwgMHg3NzJELCAweDFGQUMsCi0gICAgMHg3NzJGLCAweDFGQUIsIDB4NzczMSwgMHgxRkFELCAweDc3MzIsIDB4MUZBRSwgMHg3NzMzLCAweDFGQjAsCi0gICAgMHg3NzM0LCAweDFGQUYsIDB4NzczNSwgMHgxRkI0LCAweDc3MzYsIDB4MEIzQywgMHg3NzM3LCAweDBCMzksCi0gICAgMHg3NzM4LCAweDBCM0QsIDB4NzczOSwgMHgxRkFBLCAweDc3M0EsIDB4MEIzRSwgMHg3NzNCLCAweDFGQjMsCi0gICAgMHg3NzNDLCAweDBCM0IsIDB4NzczRCwgMHgxRkIxLCAweDc3M0UsIDB4MEIzQSwgMHg3NzQ0LCAweDIyMzEsCi0gICAgMHg3NzQ1LCAweDIyMzMsIDB4Nzc0NiwgMHgyMjJGLCAweDc3NDcsIDB4MjIzMCwgMHg3NzRBLCAweDIyMzQsCi0gICAgMHg3NzRCLCAweDIyMzYsIDB4Nzc0QywgMHgyMjM3LCAweDc3NEQsIDB4MjIzMiwgMHg3NzRFLCAweDIyMzUsCi0gICAgMHg3NzRGLCAweDBDRjQsIDB4Nzc1MiwgMHgyNEM0LCAweDc3NTQsIDB4MjRDOSwgMHg3NzU1LCAweDI0QzEsCi0gICAgMHg3NzU2LCAweDI0QzUsIDB4Nzc1OSwgMHgyNENBLCAweDc3NUEsIDB4MjRDNiwgMHg3NzVCLCAweDBFOTIsCi0gICAgMHg3NzVDLCAweDBFOUEsIDB4Nzc1RSwgMHgwRTk1LCAweDc3NUYsIDB4MjRDMiwgMHg3NzYwLCAweDI0QzMsCi0gICAgMHg3NzYxLCAweDEwM0QsIDB4Nzc2MiwgMHgwRTlELCAweDc3NjMsIDB4MEU5NiwgMHg3NzY1LCAweDBFOUIsCi0gICAgMHg3NzY2LCAweDBFOTQsIDB4Nzc2NywgMHgyNEM4LCAweDc3NjgsIDB4MEU5QywgMHg3NzY5LCAweDI0QzcsCi0gICAgMHg3NzZBLCAweDBFOTgsIDB4Nzc2QiwgMHgwRTkzLCAweDc3NkMsIDB4MEU5OSwgMHg3NzZELCAweDI0Q0IsCi0gICAgMHg3NzZFLCAweDI3NDMsIDB4Nzc2RiwgMHgyNzQ1LCAweDc3NzksIDB4MEU5NywgMHg3NzdDLCAweDI3NDAsCi0gICAgMHg3NzdELCAweDEwM0IsIDB4Nzc3RSwgMHgyNzQ2LCAweDc3N0YsIDB4MTAzQywgMHg3NzgwLCAweDI3NDQsCi0gICAgMHg3NzgxLCAweDI3M0YsIDB4Nzc4MiwgMHgyNzQyLCAweDc3ODMsIDB4Mjc0NywgMHg3Nzg0LCAweDEwM0EsCi0gICAgMHg3Nzg1LCAweDI3NDEsIDB4Nzc4NywgMHgxMUI3LCAweDc3ODgsIDB4Mjk5MCwgMHg3Nzg5LCAweDI5OEYsCi0gICAgMHg3NzhCLCAweDExQkEsIDB4Nzc4QywgMHgxMUI4LCAweDc3OEQsIDB4Mjk4RCwgMHg3NzhFLCAweDExQjYsCi0gICAgMHg3NzhGLCAweDI5OEUsIDB4Nzc5MSwgMHgxMUI5LCAweDc3OTUsIDB4MkJFNiwgMHg3Nzk3LCAweDJCRTgsCi0gICAgMHg3Nzk5LCAweDJCRTcsIDB4Nzc5QSwgMHgyQkRGLCAweDc3OUIsIDB4MkJFMywgMHg3NzlDLCAweDJCRTIsCi0gICAgMHg3NzlELCAweDJCRTAsIDB4Nzc5RSwgMHgxMzA4LCAweDc3OUYsIDB4MTMwOSwgMHg3N0EwLCAweDEzMDcsCi0gICAgMHg3N0ExLCAweDJCRTEsIDB4NzdBMiwgMHgyQkU0LCAweDc3QTMsIDB4MkJFNSwgMHg3N0E1LCAweDEzMEEsCi0gICAgMHg3N0E3LCAweDE0MUMsIDB4NzdBOCwgMHgyREMwLCAweDc3QUEsIDB4MTQxOSwgMHg3N0FCLCAweDJEQkEsCi0gICAgMHg3N0FDLCAweDE0MUIsIDB4NzdBRCwgMHgxNDFELCAweDc3QjAsIDB4MTQxQSwgMHg3N0IxLCAweDJEQkYsCi0gICAgMHg3N0IyLCAweDJEQkIsIDB4NzdCMywgMHgxNDE4LCAweDc3QjQsIDB4MkRCRSwgMHg3N0I1LCAweDJEQjksCi0gICAgMHg3N0I2LCAweDJEQkQsIDB4NzdCNywgMHgyREJDLCAweDc3QkEsIDB4MkY2QiwgMHg3N0JCLCAweDE0RkMsCi0gICAgMHg3N0JDLCAweDE0RkQsIDB4NzdCRCwgMHgxNEZBLCAweDc3QkYsIDB4MTRGQiwgMHg3N0MyLCAweDJGNkEsCi0gICAgMHg3N0M0LCAweDMwQzgsIDB4NzdDNywgMHgxNTlFLCAweDc3QzksIDB4MzBDNiwgMHg3N0NBLCAweDMwQzcsCi0gICAgMHg3N0NDLCAweDMxRkUsIDB4NzdDRCwgMHgzMjAxLCAweDc3Q0UsIDB4MzFGRiwgMHg3N0NGLCAweDMyMDAsCi0gICAgMHg3N0QwLCAweDMyRTUsIDB4NzdEMywgMHgxNjgwLCAweDc3RDQsIDB4MzQyOSwgMHg3N0Q1LCAweDM0OEYsCi0gICAgMHg3N0Q3LCAweDE3MjUsIDB4NzdEOCwgMHgzNEQzLCAweDc3RDksIDB4MzRENCwgMHg3N0RBLCAweDE3NTMsCi0gICAgMHg3N0RCLCAweDAzNjcsIDB4NzdEQywgMHgwN0JBLCAweDc3REUsIDB4MjIzOCwgMHg3N0UwLCAweDI0Q0MsCi0gICAgMHg3N0UyLCAweDAzNjgsIDB4NzdFMywgMHgwNEY2LCAweDc3RTUsIDB4MDY1RCwgMHg3N0U3LCAweDFCOUYsCi0gICAgMHg3N0U4LCAweDFCQTAsIDB4NzdFOSwgMHgwOTQ5LCAweDc3RUMsIDB4MjIzOSwgMHg3N0VELCAweDBDRjUsCi0gICAgMHg3N0VFLCAweDBFOUUsIDB4NzdFRiwgMHgxNDFFLCAweDc3RjAsIDB4MkRDMSwgMHg3N0YxLCAweDMwQzksCi0gICAgMHg3N0YyLCAweDMyMDIsIDB4NzdGMywgMHgwMzY5LCAweDc3RjcsIDB4MUExRSwgMHg3N0Y4LCAweDFBMTksCi0gICAgMHg3N0Y5LCAweDFBMUIsIDB4NzdGQSwgMHgxQTFELCAweDc3RkIsIDB4MUExQywgMHg3N0ZDLCAweDFBMUEsCi0gICAgMHg3N0ZELCAweDA2NUUsIDB4NzgwMiwgMHgwN0JCLCAweDc4MDMsIDB4MUJBOSwgMHg3ODA1LCAweDFCQTQsCi0gICAgMHg3ODA2LCAweDFCQTEsIDB4NzgwOSwgMHgxQkE4LCAweDc4MEMsIDB4MDdCRCwgMHg3ODBELCAweDA3QkUsCi0gICAgMHg3ODBFLCAweDFCQTcsIDB4NzgwRiwgMHgxQkE2LCAweDc4MTAsIDB4MUJBNSwgMHg3ODExLCAweDFCQTIsCi0gICAgMHg3ODEyLCAweDFCQTMsIDB4NzgxMywgMHgxQkFBLCAweDc4MTQsIDB4MDdCQywgMHg3ODFELCAweDA5NEQsCi0gICAgMHg3ODFGLCAweDA5NTMsIDB4NzgyMCwgMHgwOTUyLCAweDc4MjEsIDB4MUQ2RiwgMHg3ODIyLCAweDFENjksCi0gICAgMHg3ODIzLCAweDFENjcsIDB4NzgyNSwgMHgwOTUwLCAweDc4MjYsIDB4MUZCQiwgMHg3ODI3LCAweDA5NEIsCi0gICAgMHg3ODI4LCAweDFENkMsIDB4NzgyOSwgMHgxRDcwLCAweDc4MkEsIDB4MUQ3MiwgMHg3ODJCLCAweDFENkUsCi0gICAgMHg3ODJDLCAweDFENjgsIDB4NzgyRCwgMHgwOTUxLCAweDc4MkUsIDB4MUQ2RCwgMHg3ODJGLCAweDFENkIsCi0gICAgMHg3ODMwLCAweDA5NEEsIDB4NzgzMSwgMHgxRDczLCAweDc4MzIsIDB4MDk1NCwgMHg3ODMzLCAweDFENzEsCi0gICAgMHg3ODM0LCAweDA5NEUsIDB4NzgzNSwgMHgxRDZBLCAweDc4MzcsIDB4MDk0RiwgMHg3ODM4LCAweDA5NEMsCi0gICAgMHg3ODQzLCAweDBCNDAsIDB4Nzg0NSwgMHgxRkJDLCAweDc4NDgsIDB4MUZCNSwgMHg3ODQ5LCAweDFGQjcsCi0gICAgMHg3ODRBLCAweDFGQjksIDB4Nzg0QywgMHgxRkJBLCAweDc4NEQsIDB4MUZCOCwgMHg3ODRFLCAweDBCNDEsCi0gICAgMHg3ODUwLCAweDFGQkQsIDB4Nzg1MiwgMHgxRkI2LCAweDc4NUMsIDB4MjIzRCwgMHg3ODVELCAweDBDRjYsCi0gICAgMHg3ODVFLCAweDIyNDUsIDB4Nzg2MCwgMHgyMjNBLCAweDc4NjIsIDB4MjI0NiwgMHg3ODY0LCAweDIyM0IsCi0gICAgMHg3ODY1LCAweDIyM0MsIDB4Nzg2OCwgMHgyMjQ0LCAweDc4NjksIDB4MjI0MywgMHg3ODZBLCAweDIyNDAsCi0gICAgMHg3ODZCLCAweDBCM0YsIDB4Nzg2QywgMHgwQ0Y3LCAweDc4NkQsIDB4MjIzRSwgMHg3ODZFLCAweDIyNDEsCi0gICAgMHg3ODZGLCAweDBDRjgsIDB4Nzg3MCwgMHgyMjQyLCAweDc4NzEsIDB4MjIzRiwgMHg3ODc5LCAweDI0RDcsCi0gICAgMHg3ODdCLCAweDI0REIsIDB4Nzg3QywgMHgwRUE1LCAweDc4N0UsIDB4Mjc0RCwgMHg3ODdGLCAweDBFQTgsCi0gICAgMHg3ODgwLCAweDI0RDksIDB4Nzg4MSwgMHgzNkU4LCAweDc4ODMsIDB4MjRENiwgMHg3ODg0LCAweDI0RDEsCi0gICAgMHg3ODg1LCAweDI0RDMsIDB4Nzg4NiwgMHgyNEQ0LCAweDc4ODcsIDB4MjRDRCwgMHg3ODg5LCAweDBFQTQsCi0gICAgMHg3ODhDLCAweDBFQTMsIDB4Nzg4RSwgMHgwRTlGLCAweDc4OEYsIDB4MjREMCwgMHg3ODkxLCAweDBFQTYsCi0gICAgMHg3ODkzLCAweDBFQTcsIDB4Nzg5NCwgMHgyNENGLCAweDc4OTUsIDB4MjREMiwgMHg3ODk2LCAweDI0REEsCi0gICAgMHg3ODk3LCAweDBFQTEsIDB4Nzg5OCwgMHgwRUEyLCAweDc4OTksIDB4MjREOCwgMHg3ODlBLCAweDI0Q0UsCi0gICAgMHg3ODlFLCAweDI3NEYsIDB4Nzg5RiwgMHgxMDNGLCAweDc4QTAsIDB4Mjc1MSwgMHg3OEExLCAweDI0RDUsCi0gICAgMHg3OEEyLCAweDI3NTMsIDB4NzhBMywgMHgxMDQzLCAweDc4QTQsIDB4Mjc1NCwgMHg3OEE1LCAweDI3NTAsCi0gICAgMHg3OEE3LCAweDEwNDAsIDB4NzhBOCwgMHgyNzRDLCAweDc4QTksIDB4MTA0MiwgMHg3OEFBLCAweDI3NDksCi0gICAgMHg3OEFCLCAweDI3NEUsIDB4NzhBQywgMHgyNzUyLCAweDc4QUQsIDB4Mjc0QiwgMHg3OEIwLCAweDBFQTAsCi0gICAgMHg3OEIyLCAweDI3NDgsIDB4NzhCMywgMHgxMDQxLCAweDc4QjQsIDB4Mjc0QSwgMHg3OEJBLCAweDExQkQsCi0gICAgMHg3OEJCLCAweDI5OTIsIDB4NzhCQywgMHgxMUMxLCAweDc4QkUsIDB4MTFCRiwgMHg3OEMxLCAweDEwM0UsCi0gICAgMHg3OEMzLCAweDI5OTksIDB4NzhDNCwgMHgyOTlBLCAweDc4QzUsIDB4MTFCQywgMHg3OEM4LCAweDI5OTgsCi0gICAgMHg3OEM5LCAweDI5OUIsIDB4NzhDQSwgMHgxMUJFLCAweDc4Q0IsIDB4MTFCQiwgMHg3OENDLCAweDI5OTQsCi0gICAgMHg3OENELCAweDI5OTEsIDB4NzhDRSwgMHgyOTk2LCAweDc4Q0YsIDB4Mjk5MywgMHg3OEQwLCAweDExQzIsCi0gICAgMHg3OEQxLCAweDI5OTUsIDB4NzhENCwgMHgyOTk3LCAweDc4RDUsIDB4MTFDMCwgMHg3OERBLCAweDEzMEMsCi0gICAgMHg3OERCLCAweDJCRUYsIDB4NzhERCwgMHgyQkU5LCAweDc4REUsIDB4MkJFRCwgMHg3OERGLCAweDJCRjMsCi0gICAgMHg3OEUwLCAweDJCRjQsIDB4NzhFMSwgMHgyQkYwLCAweDc4RTIsIDB4MkJGMSwgMHg3OEUzLCAweDJCRUUsCi0gICAgMHg3OEU1LCAweDJCRUIsIDB4NzhFNywgMHgxMzBFLCAweDc4RTgsIDB4MTMwQiwgMHg3OEU5LCAweDJCRUEsCi0gICAgMHg3OEVBLCAweDJCRUMsIDB4NzhFQywgMHgxMzBELCAweDc4RUQsIDB4MkJGMiwgMHg3OEVGLCAweDE0MjIsCi0gICAgMHg3OEYyLCAweDJEQzgsIDB4NzhGMywgMHgyREMyLCAweDc4RjQsIDB4MTQyMSwgMHg3OEY3LCAweDE0MUYsCi0gICAgMHg3OEY5LCAweDJEQ0EsIDB4NzhGQSwgMHgxNDIwLCAweDc4RkIsIDB4MkRDNSwgMHg3OEZDLCAweDJEQzYsCi0gICAgMHg3OEZELCAweDJEQzMsIDB4NzhGRSwgMHgyRENCLCAweDc4RkYsIDB4MkRDNywgMHg3OTAxLCAweDE0MjMsCi0gICAgMHg3OTAyLCAweDJEQzQsIDB4NzkwNCwgMHgyRENDLCAweDc5MDUsIDB4MkRDOSwgMHg3OTA5LCAweDJGNkYsCi0gICAgMHg3OTBDLCAweDJGNkMsIDB4NzkwRSwgMHgxNEZFLCAweDc5MTAsIDB4MkY3MCwgMHg3OTExLCAweDJGNzIsCi0gICAgMHg3OTEyLCAweDJGNzEsIDB4NzkxMywgMHgyRjZELCAweDc5MTQsIDB4MkY2RSwgMHg3OTE3LCAweDMwQ0UsCi0gICAgMHg3OTE5LCAweDE1OUYsIDB4NzkxQiwgMHgzMENCLCAweDc5MUMsIDB4MzBDRCwgMHg3OTFELCAweDMwQ0EsCi0gICAgMHg3OTFFLCAweDMwQ0YsIDB4NzkyMSwgMHgzMENDLCAweDc5MjMsIDB4MzIwNCwgMHg3OTI0LCAweDMyMDcsCi0gICAgMHg3OTI1LCAweDMyMDMsIDB4NzkyNiwgMHgxNjI0LCAweDc5MjcsIDB4MzIwNSwgMHg3OTI4LCAweDMyMDYsCi0gICAgMHg3OTI5LCAweDMyMDgsIDB4NzkyQSwgMHgxNjI1LCAweDc5MkIsIDB4MTYyNywgMHg3OTJDLCAweDE2MjYsCi0gICAgMHg3OTJELCAweDMyRTYsIDB4NzkyRiwgMHgzMkU4LCAweDc5MzEsIDB4MzJFNywgMHg3OTM1LCAweDMzOTcsCi0gICAgMHg3OTM4LCAweDM0OTAsIDB4NzkzOSwgMHgzNEQ1LCAweDc5M0EsIDB4MDM2QSwgMHg3OTNELCAweDE4RDcsCi0gICAgMHg3OTNFLCAweDA2NUYsIDB4NzkzRiwgMHgxQTIwLCAweDc5NDAsIDB4MDY2MCwgMHg3OTQxLCAweDA2NjEsCi0gICAgMHg3OTQyLCAweDFBMUYsIDB4Nzk0NCwgMHgxQkFGLCAweDc5NDUsIDB4MUJBRSwgMHg3OTQ2LCAweDA3QkYsCi0gICAgMHg3OTQ3LCAweDA3QzIsIDB4Nzk0OCwgMHgwN0MxLCAweDc5NDksIDB4MDdDMCwgMHg3OTRBLCAweDFCQUIsCi0gICAgMHg3OTRCLCAweDFCQUQsIDB4Nzk0QywgMHgxQkFDLCAweDc5NEYsIDB4MUQ3NiwgMHg3OTUwLCAweDA5NTYsCi0gICAgMHg3OTUxLCAweDFEN0EsIDB4Nzk1MiwgMHgxRDc5LCAweDc5NTMsIDB4MUQ3OCwgMHg3OTU0LCAweDFENzQsCi0gICAgMHg3OTU1LCAweDA5NTUsIDB4Nzk1NiwgMHgwOTU5LCAweDc5NTcsIDB4MDk1QywgMHg3OTVBLCAweDA5NUQsCi0gICAgMHg3OTVCLCAweDFENzUsIDB4Nzk1QywgMHgxRDc3LCAweDc5NUQsIDB4MDk1QiwgMHg3OTVFLCAweDA5NUEsCi0gICAgMHg3OTVGLCAweDA5NTgsIDB4Nzk2MCwgMHgwOTU3LCAweDc5NjEsIDB4MUZDNCwgMHg3OTYzLCAweDFGQzIsCi0gICAgMHg3OTY0LCAweDFGQkUsIDB4Nzk2NSwgMHgwQjQyLCAweDc5NjcsIDB4MUZCRiwgMHg3OTY4LCAweDBCNDMsCi0gICAgMHg3OTY5LCAweDFGQzAsIDB4Nzk2QSwgMHgxRkMxLCAweDc5NkIsIDB4MUZDMywgMHg3OTZELCAweDBCNDQsCi0gICAgMHg3OTcwLCAweDIyNEEsIDB4Nzk3MiwgMHgyMjQ5LCAweDc5NzMsIDB4MjI0OCwgMHg3OTc0LCAweDIyNDcsCi0gICAgMHg3OTc5LCAweDI0REYsIDB4Nzk3QSwgMHgwRUE5LCAweDc5N0MsIDB4MjREQywgMHg3OTdELCAweDI0REUsCi0gICAgMHg3OTdGLCAweDBFQUEsIDB4Nzk4MSwgMHgwRUFCLCAweDc5ODIsIDB4MjRERCwgMHg3OTg4LCAweDI3NUQsCi0gICAgMHg3OThBLCAweDI3NTYsIDB4Nzk4QiwgMHgyNzU3LCAweDc5OEQsIDB4MTA0NiwgMHg3OThFLCAweDEwNDQsCi0gICAgMHg3OThGLCAweDEwNDUsIDB4Nzk5MCwgMHgyNzVGLCAweDc5OTIsIDB4Mjc1RSwgMHg3OTkzLCAweDI3NUIsCi0gICAgMHg3OTk0LCAweDI3NUEsIDB4Nzk5NSwgMHgyNzU5LCAweDc5OTYsIDB4Mjc1OCwgMHg3OTk3LCAweDI3NUMsCi0gICAgMHg3OTk4LCAweDI3NTUsIDB4Nzk5QSwgMHgyOTlDLCAweDc5OUIsIDB4MjlBMSwgMHg3OTlDLCAweDI5OUYsCi0gICAgMHg3OUEwLCAweDI5OUUsIDB4NzlBMSwgMHgyOTlELCAweDc5QTIsIDB4MjlBMCwgMHg3OUE0LCAweDJCRjUsCi0gICAgMHg3OUE2LCAweDEzMEYsIDB4NzlBNywgMHgxNDI0LCAweDc5QTgsIDB4MkRDRSwgMHg3OUFBLCAweDE0MjUsCi0gICAgMHg3OUFCLCAweDJEQ0QsIDB4NzlBQywgMHgyRjc0LCAweDc5QUQsIDB4MkY3MywgMHg3OUFFLCAweDE0RkYsCi0gICAgMHg3OUIwLCAweDMwRDAsIDB4NzlCMSwgMHgxNUEwLCAweDc5QjIsIDB4MzIwOSwgMHg3OUIzLCAweDE2Q0YsCi0gICAgMHg3OUI0LCAweDMzOTgsIDB4NzlCNiwgMHgzNDkyLCAweDc5QjcsIDB4MzQ5MSwgMHg3OUI4LCAweDE3QjIsCi0gICAgMHg3OUI5LCAweDA3QzMsIDB4NzlCQSwgMHgwN0M0LCAweDc5QkIsIDB4MUZDNSwgMHg3OUJELCAweDBFQUQsCi0gICAgMHg3OUJFLCAweDAzNkIsIDB4NzlCRiwgMHgwNEY5LCAweDc5QzAsIDB4MDRGOCwgMHg3OUMxLCAweDA0RjcsCi0gICAgMHg3OUM1LCAweDFBMjEsIDB4NzlDOCwgMHgwNjYzLCAweDc5QzksIDB4MDY2MiwgMHg3OUNCLCAweDA3QzcsCi0gICAgMHg3OUNELCAweDFCQjEsIDB4NzlDRSwgMHgxQkI0LCAweDc5Q0YsIDB4MUJCMiwgMHg3OUQxLCAweDA3QzUsCi0gICAgMHg3OUQyLCAweDA3QzYsIDB4NzlENSwgMHgxQkIwLCAweDc5RDYsIDB4MUJCMywgMHg3OUQ4LCAweDA5NjQsCi0gICAgMHg3OURDLCAweDFEODEsIDB4NzlERCwgMHgxRDgzLCAweDc5REUsIDB4MUQ4MiwgMHg3OURGLCAweDA5NjEsCi0gICAgMHg3OUUwLCAweDFEN0QsIDB4NzlFMywgMHgwOTVGLCAweDc5RTQsIDB4MDk1RSwgMHg3OUU2LCAweDA5NjIsCi0gICAgMHg3OUU3LCAweDA5NjAsIDB4NzlFOSwgMHgwOTYzLCAweDc5RUEsIDB4MUQ4MCwgMHg3OUVCLCAweDFEN0IsCi0gICAgMHg3OUVDLCAweDFEN0MsIDB4NzlFRCwgMHgxRDdGLCAweDc5RUUsIDB4MUQ3RSwgMHg3OUY2LCAweDFGQzgsCi0gICAgMHg3OUY3LCAweDFGQzksIDB4NzlGOCwgMHgxRkM3LCAweDc5RkEsIDB4MUZDNiwgMHg3OUZCLCAweDBCNDUsCi0gICAgMHg3QTAwLCAweDBDRkQsIDB4N0EwMiwgMHgyMjRCLCAweDdBMDMsIDB4MjI0RCwgMHg3QTA0LCAweDIyNEYsCi0gICAgMHg3QTA1LCAweDBDRkMsIDB4N0EwOCwgMHgwQ0ZBLCAweDdBMEEsIDB4MjI0QywgMHg3QTBCLCAweDBDRkIsCi0gICAgMHg3QTBDLCAweDIyNEUsIDB4N0EwRCwgMHgwQ0Y5LCAweDdBMTAsIDB4MjRFOSwgMHg3QTExLCAweDI0RTAsCi0gICAgMHg3QTEyLCAweDI0RTMsIDB4N0ExMywgMHgyNEU3LCAweDdBMTQsIDB4MEVCMSwgMHg3QTE1LCAweDI0RTUsCi0gICAgMHg3QTE3LCAweDI0RTQsIDB4N0ExOCwgMHgyNEUxLCAweDdBMTksIDB4MjRFMiwgMHg3QTFBLCAweDBFQUYsCi0gICAgMHg3QTFCLCAweDI0RTgsIDB4N0ExQywgMHgwRUFFLCAweDdBMUUsIDB4MEVCMywgMHg3QTFGLCAweDBFQjIsCi0gICAgMHg3QTIwLCAweDBFQjAsIDB4N0EyMiwgMHgyNEU2LCAweDdBMjYsIDB4Mjc2NSwgMHg3QTI4LCAweDI3NjQsCi0gICAgMHg3QTJCLCAweDI3NjAsIDB4N0EyRSwgMHgxMDQ3LCAweDdBMkYsIDB4Mjc2MywgMHg3QTMwLCAweDI3NjIsCi0gICAgMHg3QTMxLCAweDEwNDgsIDB4N0EzNywgMHgxMUM3LCAweDdBMzksIDB4MjlBMywgMHg3QTNCLCAweDExQzgsCi0gICAgMHg3QTNDLCAweDExQzQsIDB4N0EzRCwgMHgxMUM2LCAweDdBM0YsIDB4MTFDMywgMHg3QTQwLCAweDExQzUsCi0gICAgMHg3QTQ0LCAweDJCRjYsIDB4N0E0NiwgMHgxMzEyLCAweDdBNDcsIDB4MkJGOCwgMHg3QTQ4LCAweDJCRjcsCi0gICAgMHg3QTRBLCAweDI3NjEsIDB4N0E0QiwgMHgxMzE0LCAweDdBNEMsIDB4MTMxMywgMHg3QTRELCAweDEzMTAsCi0gICAgMHg3QTRFLCAweDEzMTEsIDB4N0E1NCwgMHgyREQzLCAweDdBNTYsIDB4MkREMSwgMHg3QTU3LCAweDE0MjYsCi0gICAgMHg3QTU4LCAweDJERDIsIDB4N0E1QSwgMHgyREQ0LCAweDdBNUIsIDB4MkREMCwgMHg3QTVDLCAweDJEQ0YsCi0gICAgMHg3QTVGLCAweDJGNzUsIDB4N0E2MCwgMHgxNTAyLCAweDdBNjEsIDB4MTUwMCwgMHg3QTYyLCAweDE1MDEsCi0gICAgMHg3QTY3LCAweDMwRDEsIDB4N0E2OCwgMHgzMEQyLCAweDdBNjksIDB4MTVBMiwgMHg3QTZCLCAweDE1QTEsCi0gICAgMHg3QTZDLCAweDMyMEIsIDB4N0E2RCwgMHgzMjBDLCAweDdBNkUsIDB4MzIwQSwgMHg3QTcwLCAweDMzOTksCi0gICAgMHg3QTcxLCAweDMzOUEsIDB4N0E3NCwgMHgwMzZDLCAweDdBNzUsIDB4MTgxMSwgMHg3QTc2LCAweDA0RkEsCi0gICAgMHg3QTc4LCAweDFBMjIsIDB4N0E3OSwgMHgwNjY1LCAweDdBN0EsIDB4MDY2NCwgMHg3QTdCLCAweDFBMjMsCi0gICAgMHg3QTdFLCAweDFCQjYsIDB4N0E3RiwgMHgwN0M4LCAweDdBODAsIDB4MUJCNSwgMHg3QTgxLCAweDA3QzksCi0gICAgMHg3QTg0LCAweDA5NjUsIDB4N0E4NSwgMHgxRDg2LCAweDdBODYsIDB4MUQ4NCwgMHg3QTg3LCAweDFEOEEsCi0gICAgMHg3QTg4LCAweDA5NjYsIDB4N0E4OSwgMHgxRDg1LCAweDdBOEEsIDB4MUQ4OSwgMHg3QThCLCAweDFEODcsCi0gICAgMHg3QThDLCAweDFEODgsIDB4N0E4RiwgMHgxRkNBLCAweDdBOTAsIDB4MUZDQywgMHg3QTkyLCAweDBCNDYsCi0gICAgMHg3QTk0LCAweDFGQ0IsIDB4N0E5NSwgMHgwQjQ3LCAweDdBOTYsIDB4MEQwMCwgMHg3QTk3LCAweDBDRkYsCi0gICAgMHg3QTk4LCAweDBDRkUsIDB4N0E5OSwgMHgyMjUwLCAweDdBOUUsIDB4MjRFQywgMHg3QTlGLCAweDBFQjQsCi0gICAgMHg3QUEwLCAweDBFQjUsIDB4N0FBMiwgMHgyNEVCLCAweDdBQTMsIDB4MjRFQSwgMHg3QUE4LCAweDI3NjYsCi0gICAgMHg3QUE5LCAweDEwNEEsIDB4N0FBQSwgMHgxMDQ5LCAweDdBQUIsIDB4Mjc2NywgMHg3QUFDLCAweDI3NjgsCi0gICAgMHg3QUFFLCAweDExQ0EsIDB4N0FBRiwgMHgxMUM5LCAweDdBQjEsIDB4MkJGQywgMHg3QUIyLCAweDI5QTQsCi0gICAgMHg3QUIzLCAweDI5QTYsIDB4N0FCNCwgMHgyOUE1LCAweDdBQjUsIDB4MkJGQiwgMHg3QUI2LCAweDJCRjksCi0gICAgMHg3QUI3LCAweDJCRkQsIDB4N0FCOCwgMHgyQkZBLCAweDdBQkEsIDB4MTMxNSwgMHg3QUJFLCAweDJERDUsCi0gICAgMHg3QUJGLCAweDE0MjcsIDB4N0FDMCwgMHgyREQ2LCAweDdBQzEsIDB4MkRENywgMHg3QUM0LCAweDE1MDMsCi0gICAgMHg3QUM1LCAweDE1MDQsIDB4N0FDNywgMHgxNjI4LCAweDdBQ0EsIDB4MTZGRiwgMHg3QUNCLCAweDAzNkQsCi0gICAgMHg3QUQxLCAweDFCQjcsIDB4N0FEOCwgMHgxRDhCLCAweDdBRDksIDB4MDk2NywgMHg3QURGLCAweDBCREUsCi0gICAgMHg3QUUwLCAweDBCREQsIDB4N0FFMywgMHgwRDAyLCAweDdBRTQsIDB4MjI1MiwgMHg3QUU1LCAweDBEMDEsCi0gICAgMHg3QUU2LCAweDIyNTEsIDB4N0FFQiwgMHgyNEVELCAweDdBRUQsIDB4MTA0QiwgMHg3QUVFLCAweDI3NjksCi0gICAgMHg3QUVGLCAweDEwNEMsIDB4N0FGNiwgMHgxNjI5LCAweDdBRjcsIDB4MzIwRCwgMHg3QUY5LCAweDAzRjYsCi0gICAgMHg3QUZBLCAweDA2NjYsIDB4N0FGQiwgMHgxQTI0LCAweDdBRkQsIDB4MDdDQiwgMHg3QUZGLCAweDA3Q0EsCi0gICAgMHg3QjAwLCAweDFCQjgsIDB4N0IwMSwgMHgxQkI5LCAweDdCMDQsIDB4MUQ4RCwgMHg3QjA1LCAweDFEOEYsCi0gICAgMHg3QjA2LCAweDA5NjgsIDB4N0IwOCwgMHgxRDkxLCAweDdCMDksIDB4MUQ5NCwgMHg3QjBBLCAweDFEOTIsCi0gICAgMHg3QjBFLCAweDFEOTMsIDB4N0IwRiwgMHgxRDkwLCAweDdCMTAsIDB4MUQ4QywgMHg3QjExLCAweDA5NjksCi0gICAgMHg3QjEyLCAweDFEOTUsIDB4N0IxMywgMHgxRDhFLCAweDdCMTgsIDB4MUZENSwgMHg3QjE5LCAweDBCNEQsCi0gICAgMHg3QjFBLCAweDFGREUsIDB4N0IxQiwgMHgwQjRBLCAweDdCMUQsIDB4MUZENywgMHg3QjFFLCAweDBCNEUsCi0gICAgMHg3QjIwLCAweDBCNDgsIDB4N0IyMiwgMHgxRkQyLCAweDdCMjMsIDB4MUZERiwgMHg3QjI0LCAweDFGRDMsCi0gICAgMHg3QjI1LCAweDFGRDAsIDB4N0IyNiwgMHgwQjRDLCAweDdCMjgsIDB4MEI0OSwgMHg3QjJBLCAweDFGRDYsCi0gICAgMHg3QjJCLCAweDFGRDksIDB4N0IyQywgMHgwQjRCLCAweDdCMkQsIDB4MUZEQSwgMHg3QjJFLCAweDBCNEYsCi0gICAgMHg3QjJGLCAweDFGREIsIDB4N0IzMCwgMHgxRkQxLCAweDdCMzEsIDB4MUZEOCwgMHg3QjMyLCAweDFGREMsCi0gICAgMHg3QjMzLCAweDFGRDQsIDB4N0IzNCwgMHgxRkNGLCAweDdCMzUsIDB4MUZDRCwgMHg3QjM4LCAweDFGREQsCi0gICAgMHg3QjNCLCAweDFGQ0UsIDB4N0I0MCwgMHgyMjU5LCAweDdCNDQsIDB4MjI1NSwgMHg3QjQ1LCAweDIyNUIsCi0gICAgMHg3QjQ2LCAweDBEMDUsIDB4N0I0NywgMHgyMjU0LCAweDdCNDgsIDB4MjI1NiwgMHg3QjQ5LCAweDBEMDMsCi0gICAgMHg3QjRBLCAweDIyNTMsIDB4N0I0QiwgMHgwRDBBLCAweDdCNEMsIDB4MjI1NywgMHg3QjRELCAweDBEMDksCi0gICAgMHg3QjRFLCAweDIyNTgsIDB4N0I0RiwgMHgwRDBCLCAweDdCNTAsIDB4MEQwNiwgMHg3QjUxLCAweDBEMEMsCi0gICAgMHg3QjUyLCAweDBEMDcsIDB4N0I1NCwgMHgwRDA4LCAweDdCNTYsIDB4MEQwNCwgMHg3QjU4LCAweDIyNUEsCi0gICAgMHg3QjYwLCAweDBFQjgsIDB4N0I2MSwgMHgyNEY4LCAweDdCNjMsIDB4MjRGQiwgMHg3QjY0LCAweDI0RUYsCi0gICAgMHg3QjY1LCAweDI0RjQsIDB4N0I2NiwgMHgyNEVFLCAweDdCNjcsIDB4MEVCQSwgMHg3QjY5LCAweDI0RjIsCi0gICAgMHg3QjZELCAweDI0RjAsIDB4N0I2RSwgMHgwRUI5LCAweDdCNzAsIDB4MjRGNywgMHg3QjcxLCAweDI0RjYsCi0gICAgMHg3QjcyLCAweDI0RjMsIDB4N0I3MywgMHgyNEY1LCAweDdCNzQsIDB4MjRGMSwgMHg3Qjc1LCAweDEwNTAsCi0gICAgMHg3Qjc2LCAweDI0RkEsIDB4N0I3NywgMHgwRUI2LCAweDdCNzgsIDB4MjRGOSwgMHg3QjgyLCAweDI3NzksCi0gICAgMHg3Qjg0LCAweDEwNTcsIDB4N0I4NSwgMHgyNzc0LCAweDdCODcsIDB4MTA1NiwgMHg3Qjg4LCAweDI3NkEsCi0gICAgMHg3QjhBLCAweDI3NkMsIDB4N0I4QiwgMHgxMDRGLCAweDdCOEMsIDB4Mjc3MSwgMHg3QjhELCAweDI3NzAsCi0gICAgMHg3QjhFLCAweDI3NzMsIDB4N0I4RiwgMHgxMDU0LCAweDdCOTAsIDB4Mjc2RSwgMHg3QjkxLCAweDI3NkQsCi0gICAgMHg3Qjk0LCAweDEwNTMsIDB4N0I5NSwgMHgxMDRFLCAweDdCOTYsIDB4Mjc2RiwgMHg3Qjk3LCAweDEwNTEsCi0gICAgMHg3Qjk4LCAweDI3NzUsIDB4N0I5OSwgMHgyNzc3LCAweDdCOUIsIDB4Mjc3MiwgMHg3QjlDLCAweDI3NkIsCi0gICAgMHg3QjlELCAweDEwNTIsIDB4N0JBMCwgMHgxMUQyLCAweDdCQTEsIDB4MTA0RCwgMHg3QkE0LCAweDI3NzgsCi0gICAgMHg3QkFDLCAweDI5QUEsIDB4N0JBRCwgMHgxMUNCLCAweDdCQUYsIDB4MjlBQywgMHg3QkIxLCAweDExQ0MsCi0gICAgMHg3QkI0LCAweDExQ0UsIDB4N0JCNSwgMHgyOUFGLCAweDdCQjcsIDB4MjlBNywgMHg3QkI4LCAweDEwNTUsCi0gICAgMHg3QkI5LCAweDI5QUQsIDB4N0JCRSwgMHgyOUE5LCAweDdCQzAsIDB4MEVCNywgMHg3QkMxLCAweDExRDEsCi0gICAgMHg3QkM0LCAweDExQ0QsIDB4N0JDNiwgMHgxMUNGLCAweDdCQzcsIDB4MTFEMCwgMHg3QkM5LCAweDEzMTgsCi0gICAgMHg3QkNBLCAweDI5QUUsIDB4N0JDQiwgMHgyOUE4LCAweDdCQ0MsIDB4MTFEMywgMHg3QkNFLCAweDI5QUIsCi0gICAgMHg3QkQ0LCAweDJDMDcsIDB4N0JENSwgMHgyQzAyLCAweDdCRDgsIDB4MkMwQywgMHg3QkQ5LCAweDEzMTYsCi0gICAgMHg3QkRBLCAweDJDMDQsIDB4N0JEQiwgMHgxMzFBLCAweDdCREMsIDB4MkMwQSwgMHg3QkRELCAweDJDMDEsCi0gICAgMHg3QkRFLCAweDJCRkUsIDB4N0JERiwgMHgyQzBELCAweDdCRTAsIDB4MTQyRCwgMHg3QkUxLCAweDEzMUIsCi0gICAgMHg3QkUyLCAweDJDMDksIDB4N0JFMywgMHgyQkZGLCAweDdCRTQsIDB4MTMxOSwgMHg3QkU1LCAweDJDMDMsCi0gICAgMHg3QkU2LCAweDEzMUQsIDB4N0JFNywgMHgyQzAwLCAweDdCRTgsIDB4MkMwNSwgMHg3QkU5LCAweDEzMUMsCi0gICAgMHg3QkVBLCAweDJDMDgsIDB4N0JFQiwgMHgyQzBCLCAweDdCRjAsIDB4MkRFOSwgMHg3QkYxLCAweDJERUEsCi0gICAgMHg3QkYyLCAweDJEREEsIDB4N0JGMywgMHgyREUxLCAweDdCRjQsIDB4MkRERiwgMHg3QkY3LCAweDE0MkIsCi0gICAgMHg3QkY4LCAweDJERTYsIDB4N0JGOSwgMHgyQzA2LCAweDdCRkIsIDB4MkRERCwgMHg3QkZELCAweDJERTcsCi0gICAgMHg3QkZFLCAweDE0MkEsIDB4N0JGRiwgMHgyRERDLCAweDdDMDAsIDB4MkREQiwgMHg3QzAxLCAweDJERTUsCi0gICAgMHg3QzAyLCAweDJERTIsIDB4N0MwMywgMHgyREU0LCAweDdDMDUsIDB4MkREOCwgMHg3QzA2LCAweDJERTgsCi0gICAgMHg3QzA3LCAweDE0MjgsIDB4N0MwOSwgMHgyREUzLCAweDdDMEEsIDB4MkRFQywgMHg3QzBCLCAweDJERTAsCi0gICAgMHg3QzBDLCAweDE0MkMsIDB4N0MwRCwgMHgxNDI5LCAweDdDMEUsIDB4MkRERSwgMHg3QzBGLCAweDJERDksCi0gICAgMHg3QzEwLCAweDJERUIsIDB4N0MxMSwgMHgxMzE3LCAweDdDMTksIDB4MkY3OCwgMHg3QzFDLCAweDJGNzYsCi0gICAgMHg3QzFELCAweDJGN0MsIDB4N0MxRSwgMHgxNTA4LCAweDdDMUYsIDB4MkY3QSwgMHg3QzIwLCAweDJGNzksCi0gICAgMHg3QzIxLCAweDE1MEEsIDB4N0MyMiwgMHgyRjdGLCAweDdDMjMsIDB4MTUwOSwgMHg3QzI1LCAweDJGODAsCi0gICAgMHg3QzI2LCAweDJGN0QsIDB4N0MyNywgMHgxNTA2LCAweDdDMjgsIDB4MkY3RSwgMHg3QzI5LCAweDJGNzcsCi0gICAgMHg3QzJBLCAweDE1MDcsIDB4N0MyQiwgMHgxNTA1LCAweDdDMkMsIDB4MzBENiwgMHg3QzJELCAweDJGN0IsCi0gICAgMHg3QzMwLCAweDJGODEsIDB4N0MzMywgMHgzMEQzLCAweDdDMzcsIDB4MTVBNywgMHg3QzM4LCAweDE1QTUsCi0gICAgMHg3QzM5LCAweDMwRDUsIDB4N0MzQiwgMHgzMEQ3LCAweDdDM0MsIDB4MzBENCwgMHg3QzNELCAweDE1QTYsCi0gICAgMHg3QzNFLCAweDE1QTMsIDB4N0MzRiwgMHgxNUE0LCAweDdDNDAsIDB4MTVBOCwgMHg3QzQzLCAweDE2MkIsCi0gICAgMHg3QzQ1LCAweDMyMTIsIDB4N0M0NywgMHgzMjExLCAweDdDNDgsIDB4MzIwRiwgMHg3QzQ5LCAweDMyMEUsCi0gICAgMHg3QzRBLCAweDMyMTAsIDB4N0M0QywgMHgxNjJBLCAweDdDNEQsIDB4MTYyQywgMHg3QzUwLCAweDE2ODEsCi0gICAgMHg3QzUzLCAweDMyRUEsIDB4N0M1NCwgMHgzMkU5LCAweDdDNTcsIDB4MzM5QiwgMHg3QzU5LCAweDMzOUQsCi0gICAgMHg3QzVBLCAweDMzOUYsIDB4N0M1QiwgMHgzMzlFLCAweDdDNUMsIDB4MzM5QywgMHg3QzVGLCAweDE2RDEsCi0gICAgMHg3QzYwLCAweDE2RDAsIDB4N0M2MywgMHgxNzAxLCAweDdDNjQsIDB4MTcwMCwgMHg3QzY1LCAweDE3MDIsCi0gICAgMHg3QzY2LCAweDM0MkIsIDB4N0M2NywgMHgzNDJBLCAweDdDNjksIDB4MzRENiwgMHg3QzZBLCAweDM0OTMsCi0gICAgMHg3QzZCLCAweDM0RDcsIDB4N0M2QywgMHgxNzQ1LCAweDdDNkUsIDB4MTc0NiwgMHg3QzZGLCAweDM1MDcsCi0gICAgMHg3QzcyLCAweDE3NkIsIDB4N0M3MywgMHgwM0Y3LCAweDdDNzUsIDB4MUEyNSwgMHg3Qzc4LCAweDFCQkIsCi0gICAgMHg3Qzc5LCAweDFCQkMsIDB4N0M3QSwgMHgxQkJBLCAweDdDN0QsIDB4MDdDQywgMHg3QzdGLCAweDFCQkQsCi0gICAgMHg3QzgwLCAweDFCQkUsIDB4N0M4MSwgMHgxQkJGLCAweDdDODQsIDB4MUQ5NiwgMHg3Qzg1LCAweDFEOUMsCi0gICAgMHg3Qzg4LCAweDFEOUEsIDB4N0M4OSwgMHgwOTZBLCAweDdDOEEsIDB4MUQ5OCwgMHg3QzhDLCAweDFEOTksCi0gICAgMHg3QzhELCAweDFEOUIsIDB4N0M5MSwgMHgxRDk3LCAweDdDOTIsIDB4MEI1MCwgMHg3Qzk0LCAweDFGRTAsCi0gICAgMHg3Qzk1LCAweDBCNTIsIDB4N0M5NiwgMHgxRkUyLCAweDdDOTcsIDB4MEI1MSwgMHg3Qzk4LCAweDFGRTEsCi0gICAgMHg3QzlFLCAweDIyNUQsIDB4N0M5RiwgMHgwRDBELCAweDdDQTEsIDB4MjI1RiwgMHg3Q0EyLCAweDIyNUMsCi0gICAgMHg3Q0EzLCAweDFGRTMsIDB4N0NBNSwgMHgwRDBFLCAweDdDQTcsIDB4MzZFRCwgMHg3Q0E4LCAweDIyNUUsCi0gICAgMHg3Q0FGLCAweDI0RkUsIDB4N0NCMSwgMHgwRUJCLCAweDdDQjIsIDB4MjRGQywgMHg3Q0IzLCAweDBFQkMsCi0gICAgMHg3Q0I0LCAweDI0RkQsIDB4N0NCNSwgMHgwRUJELCAweDdDQjksIDB4MTA1OCwgMHg3Q0JBLCAweDI3N0QsCi0gICAgMHg3Q0JCLCAweDI3N0EsIDB4N0NCQywgMHgyNzdDLCAweDdDQkQsIDB4MTA1OSwgMHg3Q0JFLCAweDEwNUEsCi0gICAgMHg3Q0JGLCAweDI3N0IsIDB4N0NDNSwgMHgyOUIwLCAweDdDQzgsIDB4MjlCMSwgMHg3Q0NBLCAweDExRDQsCi0gICAgMHg3Q0NCLCAweDI5QjMsIDB4N0NDQywgMHgyOUIyLCAweDdDQ0UsIDB4MDEyMSwgMHg3Q0QwLCAweDJDMTEsCi0gICAgMHg3Q0QxLCAweDJDMTIsIDB4N0NEMiwgMHgyQzBFLCAweDdDRDQsIDB4MkMwRiwgMHg3Q0Q1LCAweDEzMUUsCi0gICAgMHg3Q0Q2LCAweDEzMUYsIDB4N0NENywgMHgyQzEwLCAweDdDRDksIDB4MTQzMywgMHg3Q0RDLCAweDE0MkYsCi0gICAgMHg3Q0RELCAweDE0MzQsIDB4N0NERSwgMHgxNDMwLCAweDdDREYsIDB4MTQzMiwgMHg3Q0UwLCAweDE0MkUsCi0gICAgMHg3Q0UyLCAweDE0MzEsIDB4N0NFNywgMHgxNTBCLCAweDdDRTgsIDB4MkRFRCwgMHg3Q0VBLCAweDMwRDksCi0gICAgMHg3Q0VDLCAweDMwRDgsIDB4N0NFRSwgMHgzMjEzLCAweDdDRUYsIDB4MTYyRCwgMHg3Q0YwLCAweDE2MkUsCi0gICAgMHg3Q0YxLCAweDMzQTEsIDB4N0NGMiwgMHgzMkVCLCAweDdDRjQsIDB4MzNBMCwgMHg3Q0Y2LCAweDM0RDgsCi0gICAgMHg3Q0Y3LCAweDM1MUQsIDB4N0NGOCwgMHgwM0Y4LCAweDdDRkIsIDB4MDRGQiwgMHg3Q0ZELCAweDFBMjYsCi0gICAgMHg3Q0ZFLCAweDA2NjcsIDB4N0QwMCwgMHgwN0NGLCAweDdEMDEsIDB4MUJDMiwgMHg3RDAyLCAweDA3Q0QsCi0gICAgMHg3RDAzLCAweDFCQzAsIDB4N0QwNCwgMHgwN0QyLCAweDdEMDUsIDB4MDdDRSwgMHg3RDA2LCAweDA3RDMsCi0gICAgMHg3RDA3LCAweDA3RDEsIDB4N0QwOCwgMHgxQkMxLCAweDdEMDksIDB4MDdEMCwgMHg3RDBBLCAweDA5NkUsCi0gICAgMHg3RDBCLCAweDA5NkQsIDB4N0QwQywgMHgxREE3LCAweDdEMEQsIDB4MDk3NiwgMHg3RDBFLCAweDFEQTAsCi0gICAgMHg3RDBGLCAweDFEQTYsIDB4N0QxMCwgMHgwOTcyLCAweDdEMTEsIDB4MUQ5RiwgMHg3RDEyLCAweDFEQTUsCi0gICAgMHg3RDEzLCAweDFEQTMsIDB4N0QxNCwgMHgwOTcxLCAweDdEMTUsIDB4MDk3MywgMHg3RDE2LCAweDFEQTIsCi0gICAgMHg3RDE3LCAweDA5NkMsIDB4N0QxOCwgMHgxREExLCAweDdEMTksIDB4MDk3NywgMHg3RDFBLCAweDA5NzQsCi0gICAgMHg3RDFCLCAweDA5NzgsIDB4N0QxQywgMHgwOTc1LCAweDdEMUQsIDB4MUQ5RSwgMHg3RDFFLCAweDFEOUQsCi0gICAgMHg3RDFGLCAweDFEQTQsIDB4N0QyMCwgMHgwOTZGLCAweDdEMjEsIDB4MDk2QiwgMHg3RDIyLCAweDA5NzAsCi0gICAgMHg3RDI4LCAweDFGRjIsIDB4N0QyOSwgMHgxRkVCLCAweDdEMkIsIDB4MEQxMywgMHg3RDJDLCAweDFGRUEsCi0gICAgMHg3RDJFLCAweDBCNTYsIDB4N0QyRiwgMHgwQjVELCAweDdEMzAsIDB4MEI1QSwgMHg3RDMxLCAweDBCNjAsCi0gICAgMHg3RDMyLCAweDBCNUYsIDB4N0QzMywgMHgwQjVCLCAweDdEMzUsIDB4MUZFNCwgMHg3RDM2LCAweDFGRTcsCi0gICAgMHg3RDM4LCAweDFGRTYsIDB4N0QzOSwgMHgwQjU3LCAweDdEM0EsIDB4MUZFOCwgMHg3RDNCLCAweDFGRjEsCi0gICAgMHg3RDNDLCAweDBCNTgsIDB4N0QzRCwgMHgxRkU1LCAweDdEM0UsIDB4MUZFRSwgMHg3RDNGLCAweDFGRUYsCi0gICAgMHg3RDQwLCAweDBCNTksIDB4N0Q0MSwgMHgxRkVDLCAweDdENDIsIDB4MEI1RSwgMHg3RDQzLCAweDBCNTQsCi0gICAgMHg3RDQ0LCAweDBCNUMsIDB4N0Q0NSwgMHgxRkU5LCAweDdENDYsIDB4MEI1MywgMHg3RDQ3LCAweDFGRUQsCi0gICAgMHg3RDRBLCAweDFGRjAsIDB4N0Q0RSwgMHgyMjcwLCAweDdENEYsIDB4MjI2NywgMHg3RDUwLCAweDBEMTAsCi0gICAgMHg3RDUxLCAweDIyNkUsIDB4N0Q1MiwgMHgyMjZCLCAweDdENTMsIDB4MjI2MywgMHg3RDU0LCAweDIyNkMsCi0gICAgMHg3RDU1LCAweDBEMTIsIDB4N0Q1NiwgMHgyMjY0LCAweDdENTgsIDB4MjI2MCwgMHg3RDVCLCAweDBFQzMsCi0gICAgMHg3RDVDLCAweDIyNjksIDB4N0Q1RSwgMHgwRDBGLCAweDdENUYsIDB4MjI2RiwgMHg3RDYxLCAweDBEMTYsCi0gICAgMHg3RDYyLCAweDBEMTgsIDB4N0Q2MywgMHgyMjYyLCAweDdENjYsIDB4MEQxNywgMHg3RDY3LCAweDIyNjUsCi0gICAgMHg3RDY4LCAweDBEMTEsIDB4N0Q2OSwgMHgyMjZELCAweDdENkEsIDB4MjI2NiwgMHg3RDZCLCAweDIyNkEsCi0gICAgMHg3RDZELCAweDIyNjgsIDB4N0Q2RSwgMHgwRDE0LCAweDdENkYsIDB4MjI2MSwgMHg3RDcwLCAweDBEMTksCi0gICAgMHg3RDcxLCAweDBCNTUsIDB4N0Q3MiwgMHgwRDE1LCAweDdENzMsIDB4MEQxQSwgMHg3RDc5LCAweDBFQkYsCi0gICAgMHg3RDdBLCAweDI1MDUsIDB4N0Q3QiwgMHgyNTA3LCAweDdEN0MsIDB4MjUwOSwgMHg3RDdELCAweDI1MEQsCi0gICAgMHg3RDdGLCAweDI1MDMsIDB4N0Q4MCwgMHgyNTAxLCAweDdEODEsIDB4MEVDMSwgMHg3RDgzLCAweDI1MDgsCi0gICAgMHg3RDg0LCAweDI1MEMsIDB4N0Q4NSwgMHgyNTA0LCAweDdEODYsIDB4MjUwMCwgMHg3RDg4LCAweDI0RkYsCi0gICAgMHg3RDhDLCAweDI1MEEsIDB4N0Q4RCwgMHgyNTAyLCAweDdEOEUsIDB4MjUwNiwgMHg3RDhGLCAweDBFQzIsCi0gICAgMHg3RDkxLCAweDBFQzAsIDB4N0Q5MiwgMHgyNTBFLCAweDdEOTMsIDB4MEVCRSwgMHg3RDk0LCAweDI1MEIsCi0gICAgMHg3RDk2LCAweDI3OEUsIDB4N0Q5QywgMHgxMDVELCAweDdEOUQsIDB4Mjc4NiwgMHg3RDlFLCAweDExRTEsCi0gICAgMHg3RDlGLCAweDI3OTAsIDB4N0RBMCwgMHgxMDYwLCAweDdEQTEsIDB4Mjc5NCwgMHg3REEyLCAweDEwNjYsCi0gICAgMHg3REEzLCAweDI3ODEsIDB4N0RBNiwgMHgyNzkxLCAweDdEQTcsIDB4Mjc3RSwgMHg3REE5LCAweDI3OTMsCi0gICAgMHg3REFBLCAweDI3ODIsIDB4N0RBQywgMHgxMDZELCAweDdEQUQsIDB4MTA2QSwgMHg3REFFLCAweDI3OTIsCi0gICAgMHg3REFGLCAweDI3OEMsIDB4N0RCMCwgMHgxMDVDLCAweDdEQjEsIDB4MTA2NCwgMHg3REIyLCAweDEwNjMsCi0gICAgMHg3REI0LCAweDEwNjIsIDB4N0RCNSwgMHgxMDY4LCAweDdEQjcsIDB4Mjc3RiwgMHg3REI4LCAweDEwNjksCi0gICAgMHg3REI5LCAweDI3OEQsIDB4N0RCQSwgMHgxMDY1LCAweDdEQkIsIDB4MTA1QiwgMHg3REJDLCAweDI3OEYsCi0gICAgMHg3REJELCAweDEwNUUsIDB4N0RCRSwgMHgxMDVGLCAweDdEQkYsIDB4MTA2NywgMHg3REMwLCAweDI3ODQsCi0gICAgMHg3REMxLCAweDI3ODMsIDB4N0RDMiwgMHgyNzgwLCAweDdEQzQsIDB4Mjc4OCwgMHg3REM1LCAweDI3ODUsCi0gICAgMHg3REM2LCAweDI3ODksIDB4N0RDNywgMHgxMDZDLCAweDdEQzksIDB4Mjc5NSwgMHg3RENBLCAweDEwNjEsCi0gICAgMHg3RENCLCAweDI3OEEsIDB4N0RDQywgMHgyNzhCLCAweDdEQ0UsIDB4Mjc4NywgMHg3REQyLCAweDEwNkIsCi0gICAgMHg3REQ3LCAweDI5QjgsIDB4N0REOCwgMHgxMUQ5LCAweDdERDksIDB4MTFFMiwgMHg3RERBLCAweDExREUsCi0gICAgMHg3RERCLCAweDI5QjUsIDB4N0RERCwgMHgxMURCLCAweDdEREUsIDB4MTFERiwgMHg3RERGLCAweDI5QzEsCi0gICAgMHg3REUwLCAweDExRDUsIDB4N0RFMSwgMHgyOUI5LCAweDdERTMsIDB4MTFERCwgMHg3REU2LCAweDI5QkMsCi0gICAgMHg3REU3LCAweDI5QjcsIDB4N0RFOCwgMHgxMURDLCAweDdERTksIDB4MTFFMCwgMHg3REVBLCAweDI5QjYsCi0gICAgMHg3REVDLCAweDExREEsIDB4N0RFRSwgMHgyOUMwLCAweDdERUYsIDB4MTFENywgMHg3REYwLCAweDI5QkYsCi0gICAgMHg3REYxLCAweDI5QkUsIDB4N0RGMiwgMHgxMUUzLCAweDdERjMsIDB4MjhDOCwgMHg3REY0LCAweDExRDYsCi0gICAgMHg3REY2LCAweDI5QkQsIDB4N0RGNywgMHgyOUI0LCAweDdERjksIDB4MTFFNCwgMHg3REZBLCAweDI5QkIsCi0gICAgMHg3REZCLCAweDExRDgsIDB4N0UwMywgMHgyOUJBLCAweDdFMDgsIDB4MTMyMiwgMHg3RTA5LCAweDEzMjcsCi0gICAgMHg3RTBBLCAweDEzMjAsIDB4N0UwQiwgMHgyQzFGLCAweDdFMEMsIDB4MkMxNiwgMHg3RTBELCAweDJDMjIsCi0gICAgMHg3RTBFLCAweDJDMUEsIDB4N0UwRiwgMHgyQzIwLCAweDdFMTAsIDB4MTMyOCwgMHg3RTExLCAweDEzMjEsCi0gICAgMHg3RTEyLCAweDJDMTMsIDB4N0UxMywgMHgyQzE5LCAweDdFMTQsIDB4MkMyMywgMHg3RTE1LCAweDJDMUMsCi0gICAgMHg3RTE2LCAweDJDMjEsIDB4N0UxNywgMHgyQzE1LCAweDdFMUEsIDB4MkMxRCwgMHg3RTFCLCAweDEzMjMsCi0gICAgMHg3RTFDLCAweDJDMUIsIDB4N0UxRCwgMHgxMzI2LCAweDdFMUUsIDB4MTMyNSwgMHg3RTFGLCAweDJDMTcsCi0gICAgMHg3RTIwLCAweDJDMTgsIDB4N0UyMSwgMHgyQzE0LCAweDdFMjIsIDB4MkMxRSwgMHg3RTIzLCAweDEzMjQsCi0gICAgMHg3RTI0LCAweDJDMjUsIDB4N0UyNSwgMHgyQzI0LCAweDdFMjksIDB4MkRGOCwgMHg3RTJBLCAweDJERjQsCi0gICAgMHg3RTJCLCAweDE0M0IsIDB4N0UyRCwgMHgyREVFLCAweDdFMkUsIDB4MTQzNSwgMHg3RTJGLCAweDE0NDUsCi0gICAgMHg3RTMwLCAweDJERkEsIDB4N0UzMSwgMHgxNDNELCAweDdFMzIsIDB4MTQzOSwgMHg3RTMzLCAweDJERjEsCi0gICAgMHg3RTM0LCAweDE0NDAsIDB4N0UzNSwgMHgxNDQzLCAweDdFMzYsIDB4MkRGQywgMHg3RTM3LCAweDE0MzgsCi0gICAgMHg3RTM4LCAweDJERjMsIDB4N0UzOSwgMHgxNDQxLCAweDdFM0EsIDB4MkRGRSwgMHg3RTNCLCAweDJERkIsCi0gICAgMHg3RTNDLCAweDJERUYsIDB4N0UzRCwgMHgxNDNDLCAweDdFM0UsIDB4MTQzNiwgMHg3RTNGLCAweDE0NDQsCi0gICAgMHg3RTQwLCAweDJERjYsIDB4N0U0MSwgMHgxNDNGLCAweDdFNDIsIDB4MkRGMCwgMHg3RTQzLCAweDE0M0EsCi0gICAgMHg3RTQ0LCAweDJERkQsIDB4N0U0NSwgMHgxNDNFLCAweDdFNDYsIDB4MTQzNywgMHg3RTQ3LCAweDJERjcsCi0gICAgMHg3RTQ4LCAweDE0NDIsIDB4N0U0OSwgMHgyREY1LCAweDdFNEMsIDB4MkRGOSwgMHg3RTUwLCAweDJGODMsCi0gICAgMHg3RTUxLCAweDJGODksIDB4N0U1MiwgMHgxNTExLCAweDdFNTMsIDB4MkY4QywgMHg3RTU0LCAweDE1MEMsCi0gICAgMHg3RTU1LCAweDE1MEQsIDB4N0U1NiwgMHgyRjg0LCAweDdFNTcsIDB4MkY4QiwgMHg3RTU4LCAweDJGODYsCi0gICAgMHg3RTU5LCAweDE1MTIsIDB4N0U1QSwgMHgxNTBGLCAweDdFNUMsIDB4MkY4MiwgMHg3RTVFLCAweDE1MEUsCi0gICAgMHg3RTVGLCAweDJGODgsIDB4N0U2MCwgMHgyRjhBLCAweDdFNjEsIDB4MTUxMCwgMHg3RTYyLCAweDJGODcsCi0gICAgMHg3RTYzLCAweDJGODUsIDB4N0U2OCwgMHgzMEUzLCAweDdFNjksIDB4MTVBQywgMHg3RTZBLCAweDE1QUQsCi0gICAgMHg3RTZCLCAweDE1QTksIDB4N0U2RCwgMHgxNUFBLCAweDdFNkYsIDB4MzBERiwgMHg3RTcwLCAweDMwREQsCi0gICAgMHg3RTcyLCAweDMwRTEsIDB4N0U3MywgMHgxNUFFLCAweDdFNzQsIDB4MzBFMiwgMHg3RTc1LCAweDMwREIsCi0gICAgMHg3RTc2LCAweDMwREEsIDB4N0U3NywgMHgzMERFLCAweDdFNzgsIDB4MzBEQywgMHg3RTc5LCAweDE1QUIsCi0gICAgMHg3RTdBLCAweDMwRTAsIDB4N0U3QiwgMHgzMjE0LCAweDdFN0MsIDB4MTYzMSwgMHg3RTdELCAweDE2MzAsCi0gICAgMHg3RTdFLCAweDMyMTUsIDB4N0U4MCwgMHgzMjE3LCAweDdFODEsIDB4MzIxNiwgMHg3RTgyLCAweDE2MzIsCi0gICAgMHg3RTg2LCAweDMyRjAsIDB4N0U4NywgMHgzMkVELCAweDdFODgsIDB4MzJFRSwgMHg3RThBLCAweDMyRUMsCi0gICAgMHg3RThCLCAweDMyRUYsIDB4N0U4QywgMHgxNjgzLCAweDdFOEQsIDB4MzJGMSwgMHg3RThGLCAweDE2ODIsCi0gICAgMHg3RTkxLCAweDMzQTIsIDB4N0U5MywgMHgxNzAzLCAweDdFOTQsIDB4MTcwNSwgMHg3RTk1LCAweDM0MkMsCi0gICAgMHg3RTk2LCAweDE3MDQsIDB4N0U5NywgMHgzNDk0LCAweDdFOTgsIDB4MzREQSwgMHg3RTk5LCAweDM0REMsCi0gICAgMHg3RTlBLCAweDM0RDksIDB4N0U5QiwgMHgzNERCLCAweDdFOUMsIDB4MTc1OSwgMHg3RjM2LCAweDAzRjksCi0gICAgMHg3RjM4LCAweDA3RDQsIDB4N0YzOSwgMHgxRDFGLCAweDdGM0EsIDB4MDk3OSwgMHg3RjNELCAweDBCNjEsCi0gICAgMHg3RjNFLCAweDIyNzEsIDB4N0YzRiwgMHgyMjcyLCAweDdGNDMsIDB4MkMyNiwgMHg3RjQ0LCAweDE0NDYsCi0gICAgMHg3RjQ1LCAweDJERkYsIDB4N0Y0OCwgMHgxNTEzLCAweDdGNEEsIDB4MzBFNSwgMHg3RjRCLCAweDMwRTQsCi0gICAgMHg3RjRDLCAweDE2MzMsIDB4N0Y0RCwgMHgzMkYyLCAweDdGNEYsIDB4MzNBMywgMHg3RjUwLCAweDE3MjYsCi0gICAgMHg3RjUxLCAweDE4MTIsIDB4N0Y1NCwgMHgwNjY4LCAweDdGNTUsIDB4MDRGQywgMHg3RjU4LCAweDFCQzMsCi0gICAgMHg3RjVCLCAweDFEQUQsIDB4N0Y1QywgMHgxREE4LCAweDdGNUQsIDB4MURBQywgMHg3RjVFLCAweDFEQUEsCi0gICAgMHg3RjVGLCAweDA5N0EsIDB4N0Y2MCwgMHgxREFCLCAweDdGNjEsIDB4MURBOSwgMHg3RjYzLCAweDFGRjMsCi0gICAgMHg3RjY1LCAweDIyNzMsIDB4N0Y2NiwgMHgyMjc0LCAweDdGNjcsIDB4MjUxMSwgMHg3RjY4LCAweDI1MTIsCi0gICAgMHg3RjY5LCAweDBFQzUsIDB4N0Y2QSwgMHgwRUM2LCAweDdGNkIsIDB4MjUxMCwgMHg3RjZDLCAweDI1MTMsCi0gICAgMHg3RjZELCAweDI1MEYsIDB4N0Y2RSwgMHgwRUM0LCAweDdGNzAsIDB4MTA2RSwgMHg3RjcyLCAweDBFQzcsCi0gICAgMHg3RjczLCAweDI3OTYsIDB4N0Y3NSwgMHgxMUU1LCAweDdGNzYsIDB4MjlDMiwgMHg3Rjc3LCAweDExRTYsCi0gICAgMHg3Rjc5LCAweDEzMjksIDB4N0Y3QSwgMHgyQzI5LCAweDdGN0IsIDB4MkMyNywgMHg3RjdDLCAweDJDMjgsCi0gICAgMHg3RjdELCAweDJFMDIsIDB4N0Y3RSwgMHgyRTAxLCAweDdGN0YsIDB4MkUwMCwgMHg3RjgzLCAweDMwRTYsCi0gICAgMHg3Rjg1LCAweDE1QUYsIDB4N0Y4NiwgMHgzMEU3LCAweDdGODcsIDB4MzNBNCwgMHg3Rjg4LCAweDE3MjcsCi0gICAgMHg3Rjg5LCAweDM0OTUsIDB4N0Y4QSwgMHgwM0ZBLCAweDdGOEIsIDB4MDY2QSwgMHg3RjhDLCAweDA2NjksCi0gICAgMHg3RjhELCAweDFCQzUsIDB4N0Y4RSwgMHgwN0Q1LCAweDdGOTEsIDB4MUJDNCwgMHg3RjkyLCAweDFEQUYsCi0gICAgMHg3Rjk0LCAweDA5N0IsIDB4N0Y5NSwgMHgxRkY0LCAweDdGOTYsIDB4MURBRSwgMHg3RjlBLCAweDBCNjMsCi0gICAgMHg3RjlCLCAweDFGRjcsIDB4N0Y5QywgMHgxRkY1LCAweDdGOUQsIDB4MUZGNiwgMHg3RjlFLCAweDBCNjIsCi0gICAgMHg3RkEwLCAweDIyNzYsIDB4N0ZBMSwgMHgyMjc3LCAweDdGQTIsIDB4MjI3NSwgMHg3RkE0LCAweDBFQ0EsCi0gICAgMHg3RkE1LCAweDI1MTUsIDB4N0ZBNiwgMHgyNTE0LCAweDdGQTcsIDB4MjUxNiwgMHg3RkE4LCAweDBFQzksCi0gICAgMHg3RkE5LCAweDBFQzgsIDB4N0ZBQywgMHgyOUMzLCAweDdGQUQsIDB4MjlDNSwgMHg3RkFGLCAweDExRTcsCi0gICAgMHg3RkIwLCAweDI5QzQsIDB4N0ZCMSwgMHgyQzJBLCAweDdGQjIsIDB4MTMyQSwgMHg3RkIzLCAweDJGOEUsCi0gICAgMHg3RkI1LCAweDJGOEQsIDB4N0ZCNiwgMHgxNUIwLCAweDdGQjcsIDB4MzBFOCwgMHg3RkI4LCAweDE1QjIsCi0gICAgMHg3RkI5LCAweDE1QjEsIDB4N0ZCQSwgMHgzMjE4LCAweDdGQkIsIDB4MzJGMywgMHg3RkJDLCAweDE2ODQsCi0gICAgMHg3RkJELCAweDAzRkIsIDB4N0ZCRSwgMHgxQkM2LCAweDdGQkYsIDB4MDdENiwgMHg3RkMwLCAweDFEQjIsCi0gICAgMHg3RkMxLCAweDA5N0QsIDB4N0ZDMiwgMHgxREIxLCAweDdGQzMsIDB4MURCMCwgMHg3RkM1LCAweDA5N0MsCi0gICAgMHg3RkM3LCAweDFGRkQsIDB4N0ZDOSwgMHgxRkZGLCAweDdGQ0EsIDB4MUZGOCwgMHg3RkNCLCAweDFGRjksCi0gICAgMHg3RkNDLCAweDBCNjQsIDB4N0ZDRCwgMHgxRkZBLCAweDdGQ0UsIDB4MEI2NSwgMHg3RkNGLCAweDFGRkUsCi0gICAgMHg3RkQwLCAweDFGRkIsIDB4N0ZEMSwgMHgxRkZDLCAweDdGRDIsIDB4MEI2NiwgMHg3RkQ0LCAweDBEMUMsCi0gICAgMHg3RkQ1LCAweDBEMUQsIDB4N0ZENywgMHgyMjc4LCAweDdGREIsIDB4MjUxNywgMHg3RkRDLCAweDI1MTgsCi0gICAgMHg3RkRFLCAweDI3OUEsIDB4N0ZERiwgMHgxMDcxLCAweDdGRTAsIDB4MTA2RiwgMHg3RkUxLCAweDEwNzAsCi0gICAgMHg3RkUyLCAweDI3OTcsIDB4N0ZFMywgMHgyNzk4LCAweDdGRTUsIDB4Mjc5OSwgMHg3RkU2LCAweDI5Q0EsCi0gICAgMHg3RkU4LCAweDI5Q0IsIDB4N0ZFOSwgMHgxMUU4LCAweDdGRUEsIDB4MjlDOCwgMHg3RkVCLCAweDI5QzcsCi0gICAgMHg3RkVDLCAweDI5QzksIDB4N0ZFRCwgMHgyOUM2LCAweDdGRUUsIDB4MTMyRCwgMHg3RkVGLCAweDJDMkIsCi0gICAgMHg3RkYwLCAweDEzMkIsIDB4N0ZGMSwgMHgxMzJDLCAweDdGRjIsIDB4MkUwNCwgMHg3RkYzLCAweDE0NDcsCi0gICAgMHg3RkY0LCAweDJFMDMsIDB4N0ZGNSwgMHgyRUZGLCAweDdGRjcsIDB4MkY4RiwgMHg3RkY4LCAweDJGOTAsCi0gICAgMHg3RkY5LCAweDE1MTQsIDB4N0ZGQiwgMHgxNTE1LCAweDdGRkMsIDB4MTQ0OCwgMHg3RkZELCAweDMwRTksCi0gICAgMHg3RkZFLCAweDMwRUEsIDB4N0ZGRiwgMHgzMjE5LCAweDgwMDAsIDB4MTYzNCwgMHg4MDAxLCAweDAzRkMsCi0gICAgMHg4MDAzLCAweDAzRkQsIDB4ODAwNCwgMHgwOTdGLCAweDgwMDUsIDB4MDY2QiwgMHg4MDA2LCAweDA5N0UsCi0gICAgMHg4MDA3LCAweDFCQzcsIDB4ODAwQiwgMHgwRDFFLCAweDgwMEMsIDB4MDNGRSwgMHg4MDBELCAweDA3RDgsCi0gICAgMHg4MDBFLCAweDFCQzgsIDB4ODAwRiwgMHgxQkM5LCAweDgwMTAsIDB4MDdENywgMHg4MDExLCAweDA3RDksCi0gICAgMHg4MDEyLCAweDAzRkYsIDB4ODAxNCwgMHgxQkNBLCAweDgwMTUsIDB4MDk4MSwgMHg4MDE2LCAweDFEQjMsCi0gICAgMHg4MDE3LCAweDA5ODMsIDB4ODAxOCwgMHgwOTgwLCAweDgwMTksIDB4MDk4MiwgMHg4MDFCLCAweDIwMDIsCi0gICAgMHg4MDFDLCAweDBCNjcsIDB4ODAxRSwgMHgyMDAxLCAweDgwMUYsIDB4MjAwMCwgMHg4MDIxLCAweDI1MTksCi0gICAgMHg4MDI0LCAweDI3OUIsIDB4ODAyNiwgMHgxMUU5LCAweDgwMjgsIDB4MTMyRSwgMHg4MDI5LCAweDJDMkQsCi0gICAgMHg4MDJBLCAweDJDMkMsIDB4ODAyQywgMHgyRTA1LCAweDgwMzAsIDB4MzJGNCwgMHg4MDMzLCAweDA0MDAsCi0gICAgMHg4MDM0LCAweDE4RDgsIDB4ODAzNSwgMHgxQTI3LCAweDgwMzYsIDB4MDdEQSwgMHg4MDM3LCAweDFCQ0IsCi0gICAgMHg4MDM5LCAweDFEQjUsIDB4ODAzRCwgMHgwOTg0LCAweDgwM0UsIDB4MURCNCwgMHg4MDNGLCAweDA5ODUsCi0gICAgMHg4MDQzLCAweDIwMDQsIDB4ODA0NiwgMHgwQjY5LCAweDgwNDcsIDB4MjAwMywgMHg4MDQ4LCAweDIwMDUsCi0gICAgMHg4MDRBLCAweDBCNjgsIDB4ODA0RiwgMHgyMjdBLCAweDgwNTAsIDB4MjI3QiwgMHg4MDUxLCAweDIyNzksCi0gICAgMHg4MDUyLCAweDBEMUYsIDB4ODA1NiwgMHgwRUNCLCAweDgwNTgsIDB4MEVDQywgMHg4MDVBLCAweDEwNzMsCi0gICAgMHg4MDVDLCAweDI3OUQsIDB4ODA1RCwgMHgyNzlDLCAweDgwNUUsIDB4MTA3MiwgMHg4MDY0LCAweDI5Q0MsCi0gICAgMHg4MDY3LCAweDI5Q0QsIDB4ODA2QywgMHgyQzJFLCAweDgwNkYsIDB4MTQ0QywgMHg4MDcwLCAweDE0NEIsCi0gICAgMHg4MDcxLCAweDE0NDksIDB4ODA3MiwgMHgxNDRBLCAweDgwNzMsIDB4MTQ0RCwgMHg4MDc1LCAweDJGOTEsCi0gICAgMHg4MDc2LCAweDE1MTcsIDB4ODA3NywgMHgxNTE2LCAweDgwNzgsIDB4MzBFQiwgMHg4MDc5LCAweDMyMUEsCi0gICAgMHg4MDdELCAweDE2RDMsIDB4ODA3RSwgMHgxNkQyLCAweDgwN0YsIDB4MDQwMSwgMHg4MDgyLCAweDFDRUMsCi0gICAgMHg4MDg0LCAweDBFQ0UsIDB4ODA4NSwgMHgwRDIwLCAweDgwODYsIDB4MEVDRCwgMHg4MDg3LCAweDEwNzQsCi0gICAgMHg4MDg5LCAweDA0MDIsIDB4ODA4QSwgMHgxN0IzLCAweDgwOEIsIDB4MDQwMywgMHg4MDhDLCAweDA0MDQsCi0gICAgMHg4MDhGLCAweDFBMjgsIDB4ODA5MCwgMHgxOERCLCAweDgwOTIsIDB4MThEQywgMHg4MDkzLCAweDA0RkUsCi0gICAgMHg4MDk1LCAweDE4RDksIDB4ODA5NiwgMHgwNEZELCAweDgwOTgsIDB4MDUwMCwgMHg4MDk5LCAweDE4REEsCi0gICAgMHg4MDlBLCAweDA1MDIsIDB4ODA5QiwgMHgwNTAxLCAweDgwOUMsIDB4MThERCwgMHg4MDlELCAweDA0RkYsCi0gICAgMHg4MEExLCAweDA2NzAsIDB4ODBBMiwgMHgwNjZFLCAweDgwQTMsIDB4MUEyQSwgMHg4MEE1LCAweDA2NkQsCi0gICAgMHg4MEE5LCAweDA2NzIsIDB4ODBBQSwgMHgwNjc0LCAweDgwQUIsIDB4MDY3MSwgMHg4MEFELCAweDFBMkQsCi0gICAgMHg4MEFFLCAweDFBMjksIDB4ODBBRiwgMHgwNjc1LCAweDgwQjEsIDB4MDY2RiwgMHg4MEIyLCAweDA1MDMsCi0gICAgMHg4MEI0LCAweDA2NzMsIDB4ODBCNSwgMHgxQTJDLCAweDgwQjgsIDB4MUEyQiwgMHg4MEJBLCAweDA2NkMsCi0gICAgMHg4MEMyLCAweDFCRDEsIDB4ODBDMywgMHgwN0RFLCAweDgwQzQsIDB4MDdERiwgMHg4MEM1LCAweDFCRDMsCi0gICAgMHg4MEM3LCAweDFCQ0QsIDB4ODBDOCwgMHgxQkQwLCAweDgwQzksIDB4MUJEOSwgMHg4MENBLCAweDFCRDcsCi0gICAgMHg4MENDLCAweDA3RTAsIDB4ODBDRCwgMHgxQkRELCAweDgwQ0UsIDB4MDdFMywgMHg4MENGLCAweDFCREEsCi0gICAgMHg4MEQwLCAweDFCRDIsIDB4ODBEMSwgMHgxQkNGLCAweDgwRDQsIDB4MjI3RCwgMHg4MEQ1LCAweDFCRDgsCi0gICAgMHg4MEQ2LCAweDA3REIsIDB4ODBENywgMHgxQkRCLCAweDgwRDgsIDB4MUJDQywgMHg4MEQ5LCAweDFCRDUsCi0gICAgMHg4MERBLCAweDA3REQsIDB4ODBEQiwgMHgwN0UyLCAweDgwREMsIDB4MUJENiwgMHg4MERELCAweDA3RTYsCi0gICAgMHg4MERFLCAweDA3RTQsIDB4ODBFMCwgMHgxQkNFLCAweDgwRTEsIDB4MDdFMSwgMHg4MEUzLCAweDFCRDQsCi0gICAgMHg4MEU0LCAweDA3RTUsIDB4ODBFNSwgMHgwN0RDLCAweDgwRTYsIDB4MUJEQywgMHg4MEVELCAweDA5OEEsCi0gICAgMHg4MEVGLCAweDA5OTMsIDB4ODBGMCwgMHgwOTg4LCAweDgwRjEsIDB4MDk4NiwgMHg4MEYyLCAweDFEQjcsCi0gICAgMHg4MEYzLCAweDA5OEUsIDB4ODBGNCwgMHgwOThCLCAweDgwRjUsIDB4MURCOSwgMHg4MEY4LCAweDA5OEQsCi0gICAgMHg4MEY5LCAweDFEQjgsIDB4ODBGQSwgMHgxREI2LCAweDgwRkIsIDB4MURCQiwgMHg4MEZDLCAweDA5OTIsCi0gICAgMHg4MEZELCAweDA5OTAsIDB4ODBGRSwgMHgyMjdDLCAweDgxMDAsIDB4MURCQywgMHg4MTAxLCAweDFEQkEsCi0gICAgMHg4MTAyLCAweDA5ODcsIDB4ODEwNSwgMHgwOTg5LCAweDgxMDYsIDB4MDk4QywgMHg4MTA4LCAweDA5OEYsCi0gICAgMHg4MTBBLCAweDA5OTEsIDB4ODExNSwgMHgyMDBGLCAweDgxMTYsIDB4MEI2QiwgMHg4MTE4LCAweDIwMDYsCi0gICAgMHg4MTE5LCAweDIwMDgsIDB4ODExQiwgMHgyMDA5LCAweDgxMUQsIDB4MjAxMSwgMHg4MTFFLCAweDIwMEQsCi0gICAgMHg4MTFGLCAweDIwMEIsIDB4ODEyMSwgMHgyMDBFLCAweDgxMjIsIDB4MjAxMiwgMHg4MTIzLCAweDBCNkMsCi0gICAgMHg4MTI0LCAweDBCNzAsIDB4ODEyNSwgMHgyMDA3LCAweDgxMjcsIDB4MjAxMCwgMHg4MTI5LCAweDBCNkUsCi0gICAgMHg4MTJCLCAweDBCNkQsIDB4ODEyQywgMHgyMDBDLCAweDgxMkQsIDB4MjAwQSwgMHg4MTJGLCAweDBCNkEsCi0gICAgMHg4MTMwLCAweDBCNkYsIDB4ODEzOSwgMHgwRDI2LCAweDgxM0EsIDB4MjI4NSwgMHg4MTNELCAweDIyODMsCi0gICAgMHg4MTNFLCAweDBEMjgsIDB4ODE0MywgMHgyMjdFLCAweDgxNDQsIDB4MjUyNywgMHg4MTQ2LCAweDBEMjcsCi0gICAgMHg4MTQ3LCAweDIyODIsIDB4ODE0QSwgMHgyMjdGLCAweDgxNEIsIDB4MEQyMywgMHg4MTRDLCAweDBEMjksCi0gICAgMHg4MTRELCAweDIyODQsIDB4ODE0RSwgMHgwRDI1LCAweDgxNEYsIDB4MjI4MSwgMHg4MTUwLCAweDEwNzUsCi0gICAgMHg4MTUxLCAweDBEMjQsIDB4ODE1MiwgMHgyMjgwLCAweDgxNTMsIDB4MEQyQSwgMHg4MTU0LCAweDBEMjIsCi0gICAgMHg4MTU1LCAweDBEMjEsIDB4ODE1QiwgMHgyNTFGLCAweDgxNUMsIDB4MjUxRCwgMHg4MTVFLCAweDI1MjMsCi0gICAgMHg4MTYwLCAweDI1MUIsIDB4ODE2MSwgMHgyNTI4LCAweDgxNjIsIDB4MjUyMCwgMHg4MTY0LCAweDI1MUEsCi0gICAgMHg4MTY1LCAweDBFRDIsIDB4ODE2NiwgMHgwRUQ4LCAweDgxNjcsIDB4MjUyNSwgMHg4MTY5LCAweDI1MUUsCi0gICAgMHg4MTZCLCAweDBFRDUsIDB4ODE2RSwgMHgwRUQzLCAweDgxNkYsIDB4MjUyNiwgMHg4MTcwLCAweDBFRDAsCi0gICAgMHg4MTcxLCAweDBFQ0YsIDB4ODE3MiwgMHgyNTIxLCAweDgxNzMsIDB4MEVENCwgMHg4MTc0LCAweDBEMkIsCi0gICAgMHg4MTc2LCAweDI1MjQsIDB4ODE3NywgMHgyNTFDLCAweDgxNzgsIDB4MEVEMSwgMHg4MTc5LCAweDBFRDYsCi0gICAgMHg4MTdBLCAweDBFRDcsIDB4ODE3RiwgMHgxMDdBLCAweDgxODAsIDB4MTA3NiwgMHg4MTgyLCAweDEwN0IsCi0gICAgMHg4MTgzLCAweDI3QTAsIDB4ODE4NiwgMHgyNzlGLCAweDgxODcsIDB4MjdBMSwgMHg4MTg4LCAweDEwNzgsCi0gICAgMHg4MTg5LCAweDI3OUUsIDB4ODE4QSwgMHgxMDc5LCAweDgxOEIsIDB4MjdBNCwgMHg4MThDLCAweDI3QTMsCi0gICAgMHg4MThELCAweDI3QTIsIDB4ODE4RiwgMHgxMDc3LCAweDgxOTUsIDB4MjlEMSwgMHg4MTk3LCAweDI5RDQsCi0gICAgMHg4MTk4LCAweDExRUYsIDB4ODE5OSwgMHgyOUQzLCAweDgxOUEsIDB4MTFFRSwgMHg4MTlCLCAweDExRUEsCi0gICAgMHg4MTlDLCAweDExRUIsIDB4ODE5RCwgMHgxMUVDLCAweDgxOUUsIDB4MjlEMCwgMHg4MTlGLCAweDI5Q0YsCi0gICAgMHg4MUEwLCAweDExRUQsIDB4ODFBMiwgMHgyOUQyLCAweDgxQTMsIDB4MjlDRSwgMHg4MUE2LCAweDJDMzAsCi0gICAgMHg4MUE3LCAweDJDM0EsIDB4ODFBOCwgMHgxMzMxLCAweDgxQTksIDB4MTMzMCwgMHg4MUFCLCAweDJDMzQsCi0gICAgMHg4MUFDLCAweDJDMzYsIDB4ODFBRSwgMHgyQzMxLCAweDgxQjAsIDB4MkMzNSwgMHg4MUIxLCAweDJDMkYsCi0gICAgMHg4MUIyLCAweDJDMzgsIDB4ODFCMywgMHgxMzJGLCAweDgxQjQsIDB4MkMzNywgMHg4MUI1LCAweDJDMzMsCi0gICAgMHg4MUI3LCAweDJDMzksIDB4ODFCOSwgMHgyQzMyLCAweDgxQkEsIDB4MTQ1MCwgMHg4MUJCLCAweDJFMDYsCi0gICAgMHg4MUJDLCAweDJFMEMsIDB4ODFCRCwgMHgxNDU0LCAweDgxQkUsIDB4MTQ1NiwgMHg4MUJGLCAweDE0NTMsCi0gICAgMHg4MUMwLCAweDE0NTIsIDB4ODFDMiwgMHgxNDUxLCAweDgxQzMsIDB4MTQ0RiwgMHg4MUM0LCAweDJFMDcsCi0gICAgMHg4MUM1LCAweDJFMEEsIDB4ODFDNiwgMHgxNDRFLCAweDgxQzcsIDB4MkUwQiwgMHg4MUM5LCAweDE0NTUsCi0gICAgMHg4MUNBLCAweDJFMDksIDB4ODFDQywgMHgyRTA4LCAweDgxQ0QsIDB4MTUxOCwgMHg4MUNGLCAweDE1MTksCi0gICAgMHg4MUQwLCAweDJGOTQsIDB4ODFEMSwgMHgyRjkyLCAweDgxRDIsIDB4MkY5MywgMHg4MUQ1LCAweDMwRUQsCi0gICAgMHg4MUQ3LCAweDMwRUMsIDB4ODFEOCwgMHgxNUIzLCAweDgxRDksIDB4MzIxQywgMHg4MURBLCAweDE2MzUsCi0gICAgMHg4MURCLCAweDMyMUIsIDB4ODFERCwgMHgzMkY1LCAweDgxREUsIDB4MzNBNSwgMHg4MURGLCAweDE2RDQsCi0gICAgMHg4MUUwLCAweDM0REQsIDB4ODFFMSwgMHgzNERFLCAweDgxRTIsIDB4MTcwNiwgMHg4MUUzLCAweDA0MDUsCi0gICAgMHg4MUU1LCAweDA2NzYsIDB4ODFFNiwgMHgyMjg2LCAweDgxRTcsIDB4MTA3QywgMHg4MUU4LCAweDE0NTcsCi0gICAgMHg4MUU5LCAweDJFMEQsIDB4ODFFQSwgMHgwNDA2LCAweDgxRUMsIDB4MDk5NSwgMHg4MUVELCAweDA5OTQsCi0gICAgMHg4MUVFLCAweDIyODcsIDB4ODFGMiwgMHgyQzNCLCAweDgxRjMsIDB4MDQwNywgMHg4MUY0LCAweDA3RTcsCi0gICAgMHg4MUY3LCAweDIyODgsIDB4ODFGOCwgMHgyMjg5LCAweDgxRjksIDB4MjI4QSwgMHg4MUZBLCAweDEwN0QsCi0gICAgMHg4MUZCLCAweDEzMzIsIDB4ODFGQywgMHgwNDA4LCAweDgxRkUsIDB4MDY3NywgMHg4MUZGLCAweDFCREUsCi0gICAgMHg4MjAwLCAweDA5OTYsIDB4ODIwMSwgMHgxREJELCAweDgyMDIsIDB4MEI3MSwgMHg4MjA0LCAweDIyOEIsCi0gICAgMHg4MjA1LCAweDBFRDksIDB4ODIwNywgMHgxMDdFLCAweDgyMDgsIDB4MTMzMywgMHg4MjA5LCAweDE0NTgsCi0gICAgMHg4MjBBLCAweDE1MUEsIDB4ODIwQiwgMHgzMEVFLCAweDgyMEMsIDB4MDQwOSwgMHg4MjBELCAweDA2NzgsCi0gICAgMHg4MjEwLCAweDA5OTcsIDB4ODIxMSwgMHgyMDEzLCAweDgyMTIsIDB4MEQyQywgMHg4MjE0LCAweDEwN0YsCi0gICAgMHg4MjE1LCAweDI3QTUsIDB4ODIxNiwgMHgyOUQ1LCAweDgyMUIsIDB4MDQwQSwgMHg4MjFDLCAweDBEMkQsCi0gICAgMHg4MjFELCAweDI1MjksIDB4ODIxRSwgMHgxMDgwLCAweDgyMUYsIDB4MDQwQiwgMHg4MjIwLCAweDFBMkUsCi0gICAgMHg4MjIxLCAweDFCREYsIDB4ODIyMiwgMHgwN0U4LCAweDgyMjUsIDB4MURCRiwgMHg4MjI4LCAweDA5OUEsCi0gICAgMHg4MjJBLCAweDA5OTgsIDB4ODIyQiwgMHgwOTk5LCAweDgyMkMsIDB4MDk5QiwgMHg4MjJGLCAweDFEQkUsCi0gICAgMHg4MjMyLCAweDIwMTgsIDB4ODIzMywgMHgyMDE1LCAweDgyMzQsIDB4MjAxNywgMHg4MjM1LCAweDBCNzIsCi0gICAgMHg4MjM2LCAweDBCNzQsIDB4ODIzNywgMHgwQjczLCAweDgyMzgsIDB4MjAxNCwgMHg4MjM5LCAweDBCNzUsCi0gICAgMHg4MjNBLCAweDIwMTYsIDB4ODIzQywgMHgyMjhDLCAweDgyM0QsIDB4MjI4RCwgMHg4MjNGLCAweDIyOEUsCi0gICAgMHg4MjQwLCAweDI1MkMsIDB4ODI0MiwgMHgyNTJELCAweDgyNDQsIDB4MjUyQiwgMHg4MjQ1LCAweDI1MkUsCi0gICAgMHg4MjQ3LCAweDBFREEsIDB4ODI0OSwgMHgyNTJBLCAweDgyNEIsIDB4MTA4MSwgMHg4MjRFLCAweDI5REEsCi0gICAgMHg4MjRGLCAweDI5RDYsIDB4ODI1MCwgMHgyOUQ5LCAweDgyNTEsIDB4MjlEQiwgMHg4MjUyLCAweDI5RDgsCi0gICAgMHg4MjUzLCAweDI5RDcsIDB4ODI1NSwgMHgyQzNDLCAweDgyNTYsIDB4MkMzRCwgMHg4MjU3LCAweDJDM0UsCi0gICAgMHg4MjU4LCAweDEzMzQsIDB4ODI1OSwgMHgxMzM1LCAweDgyNUEsIDB4MkUwRiwgMHg4MjVCLCAweDJFMEUsCi0gICAgMHg4MjVDLCAweDJFMTAsIDB4ODI1RSwgMHgyRjk2LCAweDgyNUYsIDB4MkY5NSwgMHg4MjYxLCAweDMwRjAsCi0gICAgMHg4MjYzLCAweDMwRjEsIDB4ODI2NCwgMHgzMEVGLCAweDgyNjYsIDB4MTYzNiwgMHg4MjY4LCAweDMyMUQsCi0gICAgMHg4MjY5LCAweDMyMUUsIDB4ODI2QiwgMHgzM0E2LCAweDgyNkMsIDB4MzQyRCwgMHg4MjZELCAweDM0OTYsCi0gICAgMHg4MjZFLCAweDA0MEMsIDB4ODI2RiwgMHgwNTA0LCAweDgyNzEsIDB4MTQ1OSwgMHg4MjcyLCAweDA0MEQsCi0gICAgMHg4Mjc0LCAweDIwMTksIDB4ODI3NSwgMHgyMjhGLCAweDgyNzcsIDB4MTcyRSwgMHg4Mjc4LCAweDE4MTMsCi0gICAgMHg4MjdDLCAweDE4MTQsIDB4ODI3RCwgMHgxODE2LCAweDgyN0UsIDB4MDQwRSwgMHg4MjdGLCAweDE4MTcsCi0gICAgMHg4MjgwLCAweDE4MTUsIDB4ODI4MywgMHgxOEU1LCAweDgyODQsIDB4MThFNiwgMHg4Mjg1LCAweDE4RTAsCi0gICAgMHg4MjhBLCAweDE4RTQsIDB4ODI4QiwgMHgwNTA2LCAweDgyOEQsIDB4MDUwNywgMHg4MjhFLCAweDE4RTEsCi0gICAgMHg4MjhGLCAweDE4REYsIDB4ODI5MCwgMHgxOERFLCAweDgyOTEsIDB4MThFMiwgMHg4MjkyLCAweDA1MDUsCi0gICAgMHg4MjkzLCAweDE4RTMsIDB4ODI5NCwgMHgxQkUwLCAweDgyOTgsIDB4MUEzMywgMHg4Mjk5LCAweDA2N0IsCi0gICAgMHg4MjlBLCAweDFBMzIsIDB4ODI5QiwgMHgxQTM0LCAweDgyOUQsIDB4MDY3QSwgMHg4MjlFLCAweDFBMzksCi0gICAgMHg4MjlGLCAweDA2N0UsIDB4ODJBMCwgMHgxQTJGLCAweDgyQTEsIDB4MUEzRCwgMHg4MkEyLCAweDFBNDMsCi0gICAgMHg4MkEzLCAweDA2ODUsIDB4ODJBNCwgMHgxQTQwLCAweDgyQTUsIDB4MDY4MiwgMHg4MkE3LCAweDFBMzYsCi0gICAgMHg4MkE4LCAweDFBM0MsIDB4ODJBOSwgMHgxQTNFLCAweDgyQUIsIDB4MUEzMSwgMHg4MkFDLCAweDA2ODEsCi0gICAgMHg4MkFELCAweDA2N0MsIDB4ODJBRSwgMHgxQTM3LCAweDgyQUYsIDB4MDY4MywgMHg4MkIwLCAweDA2ODYsCi0gICAgMHg4MkIxLCAweDA2ODAsIDB4ODJCMywgMHgwNjc5LCAweDgyQjQsIDB4MUEzQiwgMHg4MkI1LCAweDFBMzUsCi0gICAgMHg4MkI2LCAweDFBNDIsIDB4ODJCNywgMHgwNjg4LCAweDgyQjgsIDB4MDY4NCwgMHg4MkI5LCAweDA2N0YsCi0gICAgMHg4MkJBLCAweDFBM0EsIDB4ODJCQiwgMHgwOTlDLCAweDgyQkMsIDB4MUEzOCwgMHg4MkJELCAweDA2N0QsCi0gICAgMHg4MkJFLCAweDA2ODcsIDB4ODJDMCwgMHgxQTMwLCAweDgyQzIsIDB4MUEzRiwgMHg4MkMzLCAweDFBNDEsCi0gICAgMHg4MkQxLCAweDA3RjksIDB4ODJEMiwgMHgwN0YzLCAweDgyRDMsIDB4MDdGQiwgMHg4MkQ0LCAweDA3RjgsCi0gICAgMHg4MkQ1LCAweDFCRTcsIDB4ODJENiwgMHgxQkVBLCAweDgyRDcsIDB4MDdGNCwgMHg4MkQ5LCAweDFCRTEsCi0gICAgMHg4MkRCLCAweDA3RUQsIDB4ODJEQywgMHgwN0Y3LCAweDgyREUsIDB4MDdGQSwgMHg4MkRGLCAweDA3RkMsCi0gICAgMHg4MkUwLCAweDFCRjYsIDB4ODJFMSwgMHgxQkVELCAweDgyRTMsIDB4MDdFQywgMHg4MkU0LCAweDFCRjUsCi0gICAgMHg4MkU1LCAweDA3RjAsIDB4ODJFNiwgMHgwN0VFLCAweDgyRTcsIDB4MDdFOSwgMHg4MkU4LCAweDFCRTUsCi0gICAgMHg4MkVBLCAweDFCRjQsIDB4ODJFQiwgMHgxQkU5LCAweDgyRUMsIDB4MUJFQywgMHg4MkVELCAweDFCRjksCi0gICAgMHg4MkVGLCAweDA3RkQsIDB4ODJGMCwgMHgxQkYzLCAweDgyRjEsIDB4MDdGNSwgMHg4MkYyLCAweDFCRUUsCi0gICAgMHg4MkYzLCAweDFCRjgsIDB4ODJGNCwgMHgxQkVCLCAweDgyRjUsIDB4MUJFRiwgMHg4MkY2LCAweDFCRjIsCi0gICAgMHg4MkY5LCAweDFCRTMsIDB4ODJGQSwgMHgxQkY3LCAweDgyRkIsIDB4MUJGMSwgMHg4MkZFLCAweDFCRTIsCi0gICAgMHg4MzAwLCAweDFCRTYsIDB4ODMwMSwgMHgwN0Y2LCAweDgzMDIsIDB4MDdGMSwgMHg4MzAzLCAweDA3RUEsCi0gICAgMHg4MzA0LCAweDA3RUYsIDB4ODMwNSwgMHgwN0VCLCAweDgzMDYsIDB4MDdGRSwgMHg4MzA3LCAweDFCRTQsCi0gICAgMHg4MzA4LCAweDFERDAsIDB4ODMwOSwgMHgwN0YyLCAweDgzMEMsIDB4MUJGMCwgMHg4MzBELCAweDFBN0QsCi0gICAgMHg4MzE2LCAweDFERDMsIDB4ODMxNywgMHgwOUFBLCAweDgzMTksIDB4MURDMywgMHg4MzFCLCAweDFEQ0UsCi0gICAgMHg4MzFDLCAweDFEQ0EsIDB4ODMxRSwgMHgxRERELCAweDgzMjAsIDB4MURENSwgMHg4MzIyLCAweDFEQ0IsCi0gICAgMHg4MzI0LCAweDFERDQsIDB4ODMyNSwgMHgxREM1LCAweDgzMjYsIDB4MURDOSwgMHg4MzI3LCAweDFERTAsCi0gICAgMHg4MzI4LCAweDA5QUQsIDB4ODMyOSwgMHgxREQ4LCAweDgzMkEsIDB4MURDRiwgMHg4MzJCLCAweDA5OUQsCi0gICAgMHg4MzJDLCAweDFEREUsIDB4ODMyRCwgMHgxREMxLCAweDgzMkYsIDB4MURENywgMHg4MzMxLCAweDA5QUMsCi0gICAgMHg4MzMyLCAweDA5QTcsIDB4ODMzMywgMHgxREMwLCAweDgzMzQsIDB4MDlBNSwgMHg4MzM1LCAweDA5QTQsCi0gICAgMHg4MzM2LCAweDA5QTksIDB4ODMzNywgMHgxREQ2LCAweDgzMzgsIDB4MDlBMSwgMHg4MzM5LCAweDA5QTgsCi0gICAgMHg4MzNBLCAweDFCRTgsIDB4ODMzQiwgMHgyMjkwLCAweDgzM0MsIDB4MUREMSwgMHg4MzNGLCAweDFEQzcsCi0gICAgMHg4MzQwLCAweDA5QUIsIDB4ODM0MSwgMHgxREM4LCAweDgzNDIsIDB4MURDQywgMHg4MzQzLCAweDA5QUUsCi0gICAgMHg4MzQ0LCAweDFEQzIsIDB4ODM0NSwgMHgxRERBLCAweDgzNDcsIDB4MUREOSwgMHg4MzQ4LCAweDFERTEsCi0gICAgMHg4MzQ5LCAweDA5QTMsIDB4ODM0QSwgMHgwOUEwLCAweDgzNEIsIDB4MURERiwgMHg4MzRDLCAweDFEREIsCi0gICAgMHg4MzRELCAweDFERDIsIDB4ODM0RSwgMHgxRENELCAweDgzNEYsIDB4MDlBNiwgMHg4MzUwLCAweDA5QTIsCi0gICAgMHg4MzUxLCAweDFEQzQsIDB4ODM1MiwgMHgwOTlFLCAweDgzNTMsIDB4MUREQywgMHg4MzU0LCAweDA5OUYsCi0gICAgMHg4MzU2LCAweDFEQzYsIDB4ODM3MywgMHgyMDFGLCAweDgzNzQsIDB4MjAyMSwgMHg4Mzc1LCAweDIwMjYsCi0gICAgMHg4Mzc2LCAweDIwM0EsIDB4ODM3NywgMHgwQjgzLCAweDgzNzgsIDB4MEI3OSwgMHg4MzdBLCAweDIwMUUsCi0gICAgMHg4MzdCLCAweDBCODQsIDB4ODM3QywgMHgwQjg1LCAweDgzN0QsIDB4MjAyOSwgMHg4MzdFLCAweDIwMzAsCi0gICAgMHg4MzdGLCAweDIwMzYsIDB4ODM4MSwgMHgyMDIzLCAweDgzODMsIDB4MjAyQSwgMHg4Mzg2LCAweDBCODYsCi0gICAgMHg4Mzg3LCAweDIwMzgsIDB4ODM4OCwgMHgyMDMzLCAweDgzODksIDB4MEI4MSwgMHg4MzhBLCAweDBCN0YsCi0gICAgMHg4MzhCLCAweDIwMkYsIDB4ODM4QywgMHgyMDJCLCAweDgzOEQsIDB4MjAxRCwgMHg4MzhFLCAweDBCNzYsCi0gICAgMHg4MzhGLCAweDIwMjIsIDB4ODM5MCwgMHgyMDFBLCAweDgzOTIsIDB4MEI3RSwgMHg4MzkzLCAweDBCODAsCi0gICAgMHg4Mzk0LCAweDIwMjcsIDB4ODM5NSwgMHgyMDI0LCAweDgzOTYsIDB4MEI3QiwgMHg4Mzk3LCAweDIwMzQsCi0gICAgMHg4Mzk4LCAweDBCNzgsIDB4ODM5OSwgMHgyMDI1LCAweDgzOUEsIDB4MjJCOSwgMHg4MzlCLCAweDIwMkQsCi0gICAgMHg4MzlELCAweDIwMkMsIDB4ODM5RSwgMHgwQjc3LCAweDgzQTAsIDB4MEI4MiwgMHg4M0EyLCAweDBCN0EsCi0gICAgMHg4M0EzLCAweDIwMUIsIDB4ODNBNCwgMHgyMDIwLCAweDgzQTUsIDB4MjAzMSwgMHg4M0E2LCAweDIwMzcsCi0gICAgMHg4M0E3LCAweDBCODcsIDB4ODNBOCwgMHgyMDFDLCAweDgzQTksIDB4MjAyOCwgMHg4M0FBLCAweDIwMkUsCi0gICAgMHg4M0FCLCAweDBCN0QsIDB4ODNBRSwgMHgyMDM5LCAweDgzQUYsIDB4MjAzMiwgMHg4M0IwLCAweDIwMzUsCi0gICAgMHg4M0JELCAweDBCN0MsIDB4ODNCRiwgMHgyMkEwLCAweDgzQzAsIDB4MjI5NCwgMHg4M0MxLCAweDBEMzUsCi0gICAgMHg4M0MyLCAweDIyQjEsIDB4ODNDMywgMHgyMkJBLCAweDgzQzQsIDB4MjJCRCwgMHg4M0M1LCAweDBEMzMsCi0gICAgMHg4M0M2LCAweDIyOUMsIDB4ODNDNywgMHgyMkI1LCAweDgzQzgsIDB4MjI5RCwgMHg4M0M5LCAweDIyQUIsCi0gICAgMHg4M0NBLCAweDBENDAsIDB4ODNDQiwgMHgyMkE3LCAweDgzQ0MsIDB4MEQzRCwgMHg4M0NFLCAweDIyQTgsCi0gICAgMHg4M0NGLCAweDIyOTEsIDB4ODNEMSwgMHgyMkI2LCAweDgzRDQsIDB4MEQ0NiwgMHg4M0Q1LCAweDIyQjMsCi0gICAgMHg4M0Q2LCAweDIyQTksIDB4ODNENywgMHgyMkJGLCAweDgzRDgsIDB4MjJBNCwgMHg4M0Q5LCAweDI1NEUsCi0gICAgMHg4M0RCLCAweDIyQzIsIDB4ODNEQywgMHgwRDQ0LCAweDgzREQsIDB4MjJBMiwgMHg4M0RFLCAweDIyQUUsCi0gICAgMHg4M0RGLCAweDBENDcsIDB4ODNFMCwgMHgwRDMyLCAweDgzRTEsIDB4MjJBNiwgMHg4M0UyLCAweDIyQzAsCi0gICAgMHg4M0UzLCAweDIyOUYsIDB4ODNFNCwgMHgyMjk4LCAweDgzRTUsIDB4MjJBMywgMHg4M0U3LCAweDIyOTcsCi0gICAgMHg4M0U4LCAweDIyOTUsIDB4ODNFOSwgMHgwRDJFLCAweDgzRUEsIDB4MjJCNywgMHg4M0VCLCAweDIyOUUsCi0gICAgMHg4M0VDLCAweDIyQkIsIDB4ODNFRSwgMHgyMkJDLCAweDgzRUYsIDB4MEQzNiwgMHg4M0YwLCAweDBEM0IsCi0gICAgMHg4M0YxLCAweDBEMzcsIDB4ODNGMiwgMHgwRDNGLCAweDgzRjMsIDB4MjJCMiwgMHg4M0Y0LCAweDBEMzgsCi0gICAgMHg4M0Y1LCAweDIyQUEsIDB4ODNGNiwgMHgyMjlBLCAweDgzRjgsIDB4MEQzMCwgMHg4M0Y5LCAweDIyOTIsCi0gICAgMHg4M0ZBLCAweDIyQjQsIDB4ODNGQiwgMHgyMkJFLCAweDgzRkMsIDB4MjI5OSwgMHg4M0ZELCAweDBEM0UsCi0gICAgMHg4M0ZFLCAweDIyQzMsIDB4ODNGRiwgMHgyMkE1LCAweDg0MDEsIDB4MjJBMSwgMHg4NDAzLCAweDBEMkYsCi0gICAgMHg4NDA0LCAweDBENDMsIDB4ODQwNiwgMHgyMkIwLCAweDg0MDcsIDB4MEQ0NSwgMHg4NDA5LCAweDIyQUMsCi0gICAgMHg4NDBBLCAweDBEM0EsIDB4ODQwQiwgMHgwRDM0LCAweDg0MEMsIDB4MEQzQywgMHg4NDBELCAweDBEMzEsCi0gICAgMHg4NDBFLCAweDBENDIsIDB4ODQwRiwgMHgyMkFELCAweDg0MTAsIDB4MjI5QiwgMHg4NDExLCAweDIyQUYsCi0gICAgMHg4NDEyLCAweDIyOTYsIDB4ODQxMywgMHgyMkI4LCAweDg0MUIsIDB4MjJDMSwgMHg4NDIzLCAweDIyOTMsCi0gICAgMHg4NDI5LCAweDI1NEQsIDB4ODQyQiwgMHgyNTYzLCAweDg0MkMsIDB4MEVBQywgMHg4NDJELCAweDI1NTIsCi0gICAgMHg4NDJGLCAweDI1NTAsIDB4ODQzMCwgMHgyNTNCLCAweDg0MzEsIDB4MEVERSwgMHg4NDMyLCAweDI1NEIsCi0gICAgMHg4NDMzLCAweDI1NUYsIDB4ODQzNCwgMHgyNTQ3LCAweDg0MzUsIDB4MEVFNiwgMHg4NDM2LCAweDI1NUUsCi0gICAgMHg4NDM3LCAweDI1NDUsIDB4ODQzOCwgMHgwRDQxLCAweDg0MzksIDB4MjU1NSwgMHg4NDNBLCAweDI1NDYsCi0gICAgMHg4NDNCLCAweDI1NUMsIDB4ODQzQywgMHgwRUU1LCAweDg0M0QsIDB4MEVERCwgMHg4NDNGLCAweDI1MzAsCi0gICAgMHg4NDQwLCAweDI1MzgsIDB4ODQ0MiwgMHgyNTUxLCAweDg0NDMsIDB4MjU0OSwgMHg4NDQ0LCAweDI1NjIsCi0gICAgMHg4NDQ1LCAweDI1NEMsIDB4ODQ0NiwgMHgwRUVCLCAweDg0NDcsIDB4MjU1RCwgMHg4NDQ5LCAweDBFRTIsCi0gICAgMHg4NDRCLCAweDI1NEYsIDB4ODQ0QywgMHgyNTU3LCAweDg0NEQsIDB4MjUzQywgMHg4NDRFLCAweDI1NTYsCi0gICAgMHg4NDUwLCAweDI1NjcsIDB4ODQ1MSwgMHgyNTM3LCAweDg0NTIsIDB4MjU1OCwgMHg4NDU0LCAweDI1NjUsCi0gICAgMHg4NDU2LCAweDI1MzEsIDB4ODQ1NywgMHgwRDM5LCAweDg0NTksIDB4MjUzRiwgMHg4NDVBLCAweDI1M0UsCi0gICAgMHg4NDVCLCAweDBFRTQsIDB4ODQ1RCwgMHgyNTQyLCAweDg0NUUsIDB4MjU0NCwgMHg4NDVGLCAweDI1NTMsCi0gICAgMHg4NDYwLCAweDI1NjQsIDB4ODQ2MSwgMHgwRUU3LCAweDg0NjMsIDB4MEVFOCwgMHg4NDY1LCAweDI1MzYsCi0gICAgMHg4NDY2LCAweDBFRTAsIDB4ODQ2NywgMHgyNTNBLCAweDg0NjgsIDB4MjU2MCwgMHg4NDY5LCAweDBFRTksCi0gICAgMHg4NDZCLCAweDBFRTEsIDB4ODQ2QywgMHgwRUUzLCAweDg0NkQsIDB4MEVFQSwgMHg4NDZFLCAweDI1NjYsCi0gICAgMHg4NDZGLCAweDI1NTksIDB4ODQ3MCwgMHgyNTU0LCAweDg0NzMsIDB4MjU0MSwgMHg4NDc0LCAweDI1NDAsCi0gICAgMHg4NDc1LCAweDBFREYsIDB4ODQ3NiwgMHgyNTMyLCAweDg0NzcsIDB4MEVEQywgMHg4NDc4LCAweDI1NEEsCi0gICAgMHg4NDc5LCAweDI1MzMsIDB4ODQ3QSwgMHgyNTQ4LCAweDg0N0QsIDB4MjUzRCwgMHg4NDdFLCAweDI1NjEsCi0gICAgMHg4NDgyLCAweDBFREIsIDB4ODQ4NiwgMHgyNTM5LCAweDg0OEQsIDB4MjUzNSwgMHg4NDhFLCAweDI1NUIsCi0gICAgMHg4NDhGLCAweDI1MzQsIDB4ODQ5MCwgMHgxMDhFLCAweDg0OTEsIDB4MjdDRCwgMHg4NDk0LCAweDI3QkMsCi0gICAgMHg4NDk3LCAweDI3QTYsIDB4ODQ5OCwgMHgyN0M0LCAweDg0OTksIDB4MTA4NiwgMHg4NDlBLCAweDI3QjUsCi0gICAgMHg4NDlCLCAweDI3QkYsIDB4ODQ5QywgMHgxMDg5LCAweDg0OUQsIDB4MjdCOCwgMHg4NDlFLCAweDEwODcsCi0gICAgMHg4NDlGLCAweDI3QTksIDB4ODRBMCwgMHgyN0M3LCAweDg0QTEsIDB4MjdBOCwgMHg4NEEyLCAweDI3QkIsCi0gICAgMHg4NEE0LCAweDI3QTcsIDB4ODRBNywgMHgyN0I5LCAweDg0QTgsIDB4MjdDMiwgMHg4NEE5LCAweDI3QzAsCi0gICAgMHg4NEFBLCAweDI3QjQsIDB4ODRBQiwgMHgyN0FGLCAweDg0QUMsIDB4MjdBRCwgMHg4NEFFLCAweDI3QUUsCi0gICAgMHg4NEFGLCAweDI3QzEsIDB4ODRCMCwgMHgyN0NDLCAweDg0QjEsIDB4MjdCNiwgMHg4NEIyLCAweDEwODgsCi0gICAgMHg4NEI0LCAweDI3QjEsIDB4ODRCNiwgMHgyN0M1LCAweDg0QjgsIDB4MTA4QiwgMHg4NEI5LCAweDI3QjAsCi0gICAgMHg4NEJBLCAweDI3QUEsIDB4ODRCQiwgMHgyN0JBLCAweDg0QkMsIDB4MTA4RiwgMHg4NEJGLCAweDEwODMsCi0gICAgMHg4NEMwLCAweDEwOEMsIDB4ODRDMSwgMHgyN0IyLCAweDg0QzIsIDB4MjdBQywgMHg4NEM0LCAweDEwODUsCi0gICAgMHg4NEM1LCAweDI1NUEsIDB4ODRDNiwgMHgxMDg0LCAweDg0QzcsIDB4MjdCRCwgMHg4NEM5LCAweDEwODIsCi0gICAgMHg4NENBLCAweDEwOTEsIDB4ODRDQiwgMHgxMDhBLCAweDg0Q0MsIDB4MjdCRSwgMHg4NENELCAweDI3QjMsCi0gICAgMHg4NENFLCAweDI3QUIsIDB4ODRDRiwgMHgyN0M2LCAweDg0RDAsIDB4MjdCNywgMHg4NEQxLCAweDEwOTAsCi0gICAgMHg4NEQyLCAweDI3Q0EsIDB4ODREMywgMHgxMDhELCAweDg0RDQsIDB4MjdDOSwgMHg4NEQ2LCAweDI3QzMsCi0gICAgMHg4NEQ3LCAweDI3QzgsIDB4ODREQiwgMHgyN0NCLCAweDg0RTcsIDB4MkEwMywgMHg4NEU4LCAweDJBMDQsCi0gICAgMHg4NEU5LCAweDI5RjcsIDB4ODRFQSwgMHgyOUY2LCAweDg0RUIsIDB4MjlGMiwgMHg4NEVDLCAweDExRkIsCi0gICAgMHg4NEVFLCAweDExRjMsIDB4ODRFRiwgMHgyQTA2LCAweDg0RjAsIDB4MkEwNSwgMHg4NEYxLCAweDI1MkYsCi0gICAgMHg4NEYyLCAweDI5RUYsIDB4ODRGMywgMHgyOUYzLCAweDg0RjQsIDB4MjlFRCwgMHg4NEY2LCAweDJBMDAsCi0gICAgMHg4NEY3LCAweDI5RjEsIDB4ODRGOSwgMHgyQTA3LCAweDg0RkEsIDB4MjlFQSwgMHg4NEZCLCAweDI5RTgsCi0gICAgMHg4NEZDLCAweDI5RjQsIDB4ODRGRCwgMHgyOUZFLCAweDg0RkUsIDB4MjlGOSwgMHg4NEZGLCAweDExRkQsCi0gICAgMHg4NTAwLCAweDI5REYsIDB4ODUwMiwgMHgyOUZELCAweDg1MDYsIDB4MTFGRSwgMHg4NTA3LCAweDI1NDMsCi0gICAgMHg4NTA4LCAweDI5RUIsIDB4ODUwOSwgMHgyOUUyLCAweDg1MEEsIDB4MjlFNSwgMHg4NTBCLCAweDJBMEIsCi0gICAgMHg4NTBDLCAweDI5RUMsIDB4ODUwRCwgMHgyOUUzLCAweDg1MEUsIDB4MjlFMSwgMHg4NTBGLCAweDI5REUsCi0gICAgMHg4NTExLCAweDExRjcsIDB4ODUxMiwgMHgyOUY1LCAweDg1MTMsIDB4MTFGNiwgMHg4NTE0LCAweDExRkEsCi0gICAgMHg4NTE1LCAweDI5RjAsIDB4ODUxNiwgMHgyOUY4LCAweDg1MTcsIDB4MTFGMCwgMHg4NTE4LCAweDJBMDgsCi0gICAgMHg4NTE5LCAweDJBMEMsIDB4ODUxQSwgMHgxMUYyLCAweDg1MUMsIDB4MjlFNywgMHg4NTFELCAweDI5RkIsCi0gICAgMHg4NTFFLCAweDI5RkYsIDB4ODUxRiwgMHgyOUU0LCAweDg1MjAsIDB4MkEwOSwgMHg4NTIxLCAweDExRjksCi0gICAgMHg4NTIzLCAweDExRjgsIDB4ODUyNCwgMHgyOURDLCAweDg1MjUsIDB4MTFGQywgMHg4NTI2LCAweDJBMDIsCi0gICAgMHg4NTI3LCAweDI5RTYsIDB4ODUyOCwgMHgyOUZBLCAweDg1MjksIDB4MjlFMCwgMHg4NTJBLCAweDI5RUUsCi0gICAgMHg4NTJCLCAweDI5RTksIDB4ODUyQywgMHgxMUY0LCAweDg1MkQsIDB4MTFGNSwgMHg4NTJFLCAweDI5RkMsCi0gICAgMHg4NTJGLCAweDJBMEQsIDB4ODUzMCwgMHgyQTBBLCAweDg1MzEsIDB4MkEwMSwgMHg4NTNCLCAweDI5REQsCi0gICAgMHg4NTNELCAweDExRjEsIDB4ODUzRSwgMHgyQzRGLCAweDg1NDAsIDB4MkM0NiwgMHg4NTQxLCAweDJDNDksCi0gICAgMHg4NTQzLCAweDEzM0IsIDB4ODU0NCwgMHgyQzRCLCAweDg1NDUsIDB4MkM0MCwgMHg4NTQ2LCAweDJDNDcsCi0gICAgMHg4NTQ3LCAweDJDNEQsIDB4ODU0OCwgMHgxMzM4LCAweDg1NDksIDB4MTMzQywgMHg4NTRBLCAweDEzMzYsCi0gICAgMHg4NTRELCAweDJDNDIsIDB4ODU0RSwgMHgyQzUyLCAweDg1NTEsIDB4MkM0QywgMHg4NTUzLCAweDJDNDMsCi0gICAgMHg4NTU0LCAweDJDNUIsIDB4ODU1NSwgMHgyQzU1LCAweDg1NTYsIDB4MkMzRiwgMHg4NTU3LCAweDJFMjMsCi0gICAgMHg4NTU4LCAweDJDNDUsIDB4ODU1OSwgMHgxMzM3LCAweDg1NUIsIDB4MkM1MCwgMHg4NTVELCAweDJDNUEsCi0gICAgMHg4NTVFLCAweDEzM0YsIDB4ODU2MCwgMHgyQzU3LCAweDg1NjEsIDB4MkM0NCwgMHg4NTYyLCAweDJDNEEsCi0gICAgMHg4NTYzLCAweDJDNEUsIDB4ODU2NCwgMHgyQzQ4LCAweDg1NjUsIDB4MkM1QywgMHg4NTY2LCAweDJDNTksCi0gICAgMHg4NTY3LCAweDJDNTYsIDB4ODU2OCwgMHgxMzM5LCAweDg1NjksIDB4MTMzQSwgMHg4NTZBLCAweDEzM0UsCi0gICAgMHg4NTZCLCAweDJDNDEsIDB4ODU2QywgMHgyQzVELCAweDg1NkQsIDB4MTMzRCwgMHg4NTZFLCAweDJDNTMsCi0gICAgMHg4NTcxLCAweDJDNTEsIDB4ODU3NSwgMHgyQzU0LCAweDg1NzYsIDB4MkUzMCwgMHg4NTc3LCAweDJFMUQsCi0gICAgMHg4NTc4LCAweDJFMjIsIDB4ODU3OSwgMHgyRTJGLCAweDg1N0EsIDB4MkUyMSwgMHg4NTdCLCAweDJFMTksCi0gICAgMHg4NTdDLCAweDJFMUUsIDB4ODU3RSwgMHgxNDVDLCAweDg1ODAsIDB4MkUxMiwgMHg4NTgxLCAweDJFMkEsCi0gICAgMHg4NTgyLCAweDJFMkMsIDB4ODU4MywgMHgyRTExLCAweDg1ODQsIDB4MTQ1QiwgMHg4NTg1LCAweDJFMkUsCi0gICAgMHg4NTg2LCAweDJFMjYsIDB4ODU4NywgMHgxNDYyLCAweDg1ODgsIDB4MkUyRCwgMHg4NTg5LCAweDJFMUYsCi0gICAgMHg4NThBLCAweDE0NjQsIDB4ODU4QiwgMHgyRTE3LCAweDg1OEMsIDB4MkM1OCwgMHg4NThELCAweDJFMjcsCi0gICAgMHg4NThFLCAweDJFMjQsIDB4ODU4RiwgMHgyRTEzLCAweDg1OTAsIDB4MkUzMiwgMHg4NTkxLCAweDE0NUUsCi0gICAgMHg4NTk0LCAweDE0NUYsIDB4ODU5NSwgMHgyRTE1LCAweDg1OTYsIDB4MkUyNSwgMHg4NTk4LCAweDJFMzEsCi0gICAgMHg4NTk5LCAweDJFMjgsIDB4ODU5QSwgMHgyRTFCLCAweDg1OUIsIDB4MTQ2MSwgMHg4NTlDLCAweDE0NUQsCi0gICAgMHg4NTlELCAweDJFMjksIDB4ODU5RSwgMHgyRTFDLCAweDg1OUYsIDB4MkUzMywgMHg4NUEwLCAweDJFMTYsCi0gICAgMHg4NUExLCAweDJFMjAsIDB4ODVBMiwgMHgyRTJCLCAweDg1QTMsIDB4MkUxOCwgMHg4NUE0LCAweDJFMUEsCi0gICAgMHg4NUE2LCAweDE0NjUsIDB4ODVBNywgMHgyRTE0LCAweDg1QTgsIDB4MTQ2MywgMHg4NUE5LCAweDE1MUMsCi0gICAgMHg4NUFBLCAweDE0NUEsIDB4ODVBRiwgMHgxNDYwLCAweDg1QjAsIDB4MTUyMCwgMHg4NUIxLCAweDJGQTYsCi0gICAgMHg4NUIzLCAweDJGOUMsIDB4ODVCNCwgMHgyRjk3LCAweDg1QjUsIDB4MkY5RCwgMHg4NUI2LCAweDJGQTcsCi0gICAgMHg4NUI3LCAweDJGQUIsIDB4ODVCOCwgMHgyRkFBLCAweDg1QjksIDB4MTUyMiwgMHg4NUJBLCAweDE1MjEsCi0gICAgMHg4NUJELCAweDJGOUUsIDB4ODVCRSwgMHgyRkFDLCAweDg1QkYsIDB4MkZBMSwgMHg4NUMwLCAweDJGOTksCi0gICAgMHg4NUMyLCAweDJGOUIsIDB4ODVDMywgMHgyRjlBLCAweDg1QzQsIDB4MkZBMCwgMHg4NUM1LCAweDJGQTUsCi0gICAgMHg4NUM2LCAweDJGOTgsIDB4ODVDNywgMHgyRjlGLCAweDg1QzgsIDB4MkZBNCwgMHg4NUM5LCAweDE1MUYsCi0gICAgMHg4NUNCLCAweDJGQTIsIDB4ODVDRCwgMHgxNTFELCAweDg1Q0UsIDB4MkZBMywgMHg4NUNGLCAweDE1MUIsCi0gICAgMHg4NUQwLCAweDE1MUUsIDB4ODVEMSwgMHgzMTAxLCAweDg1RDIsIDB4MkZBOCwgMHg4NUQ1LCAweDE1QjcsCi0gICAgMHg4NUQ3LCAweDMwRjksIDB4ODVEOCwgMHgzMEZELCAweDg1RDksIDB4MzBGNSwgMHg4NURBLCAweDMwRjgsCi0gICAgMHg4NURDLCAweDMxMDAsIDB4ODVERCwgMHgxNUI1LCAweDg1REUsIDB4MzEwNSwgMHg4NURGLCAweDMwRkUsCi0gICAgMHg4NUUxLCAweDMwRjYsIDB4ODVFMiwgMHgzMTA2LCAweDg1RTMsIDB4MzBGRiwgMHg4NUU0LCAweDE1QjgsCi0gICAgMHg4NUU1LCAweDE1QjksIDB4ODVFNiwgMHgzMTAzLCAweDg1RTgsIDB4MzBGNywgMHg4NUU5LCAweDE1QjQsCi0gICAgMHg4NUVBLCAweDE1QjYsIDB4ODVFQiwgMHgzMEYyLCAweDg1RUMsIDB4MzBGQSwgMHg4NUVELCAweDMwRjQsCi0gICAgMHg4NUVGLCAweDMxMDQsIDB4ODVGMCwgMHgzMTAyLCAweDg1RjEsIDB4MzBGMywgMHg4NUYyLCAweDMwRkIsCi0gICAgMHg4NUY2LCAweDMyMjUsIDB4ODVGNywgMHgxNUJBLCAweDg1RjgsIDB4MzBGQywgMHg4NUY5LCAweDE2MzgsCi0gICAgMHg4NUZBLCAweDE2M0EsIDB4ODVGQiwgMHgxNjM3LCAweDg1RkQsIDB4MzIyQSwgMHg4NUZFLCAweDMyMjIsCi0gICAgMHg4NUZGLCAweDMyMjAsIDB4ODYwMCwgMHgzMjI0LCAweDg2MDEsIDB4MzIyMSwgMHg4NjA0LCAweDMyMjYsCi0gICAgMHg4NjA1LCAweDMyMjgsIDB4ODYwNiwgMHgxNjNCLCAweDg2MDcsIDB4MTYzRCwgMHg4NjA5LCAweDMyMjcsCi0gICAgMHg4NjBBLCAweDE2M0UsIDB4ODYwQiwgMHgxNjNDLCAweDg2MEMsIDB4MzIyOSwgMHg4NjExLCAweDE2MzksCi0gICAgMHg4NjE3LCAweDE2ODUsIDB4ODYxOCwgMHgzMkY2LCAweDg2MTksIDB4MzJGQywgMHg4NjFBLCAweDE2ODcsCi0gICAgMHg4NjFCLCAweDMyMjMsIDB4ODYxQywgMHgzMkZCLCAweDg2MUUsIDB4MzMwMiwgMHg4NjFGLCAweDMyRjksCi0gICAgMHg4NjIwLCAweDMzMDAsIDB4ODYyMSwgMHgzMkZGLCAweDg2MjIsIDB4MzIxRiwgMHg4NjIzLCAweDMyRkEsCi0gICAgMHg4NjI0LCAweDJGQTksIDB4ODYyNSwgMHgzMzAzLCAweDg2MjYsIDB4MzJGOCwgMHg4NjI3LCAweDMyRkQsCi0gICAgMHg4NjI5LCAweDMzMDEsIDB4ODYyQSwgMHgzMkY3LCAweDg2MkMsIDB4MzNBQSwgMHg4NjJELCAweDE2ODYsCi0gICAgMHg4NjJFLCAweDMyRkUsIDB4ODYzMSwgMHgzNDMyLCAweDg2MzIsIDB4MzNBQiwgMHg4NjMzLCAweDMzQTksCi0gICAgMHg4NjM0LCAweDMzQTcsIDB4ODYzNSwgMHgzM0E4LCAweDg2MzYsIDB4MzNBQywgMHg4NjM4LCAweDE3MDcsCi0gICAgMHg4NjM5LCAweDM0MzAsIDB4ODYzQSwgMHgzNDJFLCAweDg2M0IsIDB4MzQzMywgMHg4NjNDLCAweDM0MzEsCi0gICAgMHg4NjNFLCAweDM0MzQsIDB4ODYzRiwgMHgxNzA4LCAweDg2NDAsIDB4MzQyRiwgMHg4NjQzLCAweDM0OTcsCi0gICAgMHg4NjQ2LCAweDM0REYsIDB4ODY0NywgMHgzNEUwLCAweDg2NDgsIDB4MzRFMSwgMHg4NjRCLCAweDM1M0UsCi0gICAgMHg4NjRDLCAweDM1MzYsIDB4ODY0RCwgMHgxODE4LCAweDg2NEUsIDB4MDY4OSwgMHg4NjUwLCAweDA3RkYsCi0gICAgMHg4NjUyLCAweDFERTMsIDB4ODY1MywgMHgxREUyLCAweDg2NTQsIDB4MDlBRiwgMHg4NjU1LCAweDBCODgsCi0gICAgMHg4NjU2LCAweDIwM0MsIDB4ODY1OSwgMHgyMDNCLCAweDg2NUIsIDB4MEQ0OCwgMHg4NjVDLCAweDBFRUQsCi0gICAgMHg4NjVFLCAweDBFRUMsIDB4ODY1RiwgMHgwRUVFLCAweDg2NjEsIDB4MjdDRSwgMHg4NjYyLCAweDJBMEUsCi0gICAgMHg4NjYzLCAweDJDNUUsIDB4ODY2NCwgMHgyQzYwLCAweDg2NjUsIDB4MkM1RiwgMHg4NjY3LCAweDE0NjYsCi0gICAgMHg4NjY4LCAweDJFMzQsIDB4ODY2OSwgMHgyRkFELCAweDg2NkEsIDB4MzUxRSwgMHg4NjZCLCAweDA0MEYsCi0gICAgMHg4NjZELCAweDFBNDYsIDB4ODY2RSwgMHgxQTQ3LCAweDg2NkYsIDB4MUE0NSwgMHg4NjcwLCAweDFBNDQsCi0gICAgMHg4NjcxLCAweDA2OEEsIDB4ODY3MywgMHgxQkZELCAweDg2NzQsIDB4MUJGQiwgMHg4Njc3LCAweDFCRkEsCi0gICAgMHg4Njc5LCAweDA4MDAsIDB4ODY3QSwgMHgwODAyLCAweDg2N0IsIDB4MDgwMSwgMHg4NjdDLCAweDFCRkMsCi0gICAgMHg4Njg1LCAweDFERUYsIDB4ODY4NiwgMHgxREVDLCAweDg2ODcsIDB4MURFQSwgMHg4NjhBLCAweDA5QjAsCi0gICAgMHg4NjhCLCAweDFERUQsIDB4ODY4QywgMHgwOUI1LCAweDg2OEQsIDB4MURFNywgMHg4NjhFLCAweDFERjYsCi0gICAgMHg4NjkwLCAweDFERjgsIDB4ODY5MSwgMHgxREU4LCAweDg2OTMsIDB4MDlCMiwgMHg4Njk0LCAweDFERjksCi0gICAgMHg4Njk1LCAweDFERjQsIDB4ODY5NiwgMHgxREU2LCAweDg2OTcsIDB4MURFQiwgMHg4Njk4LCAweDFERjUsCi0gICAgMHg4Njk5LCAweDFERjEsIDB4ODY5QSwgMHgxREVFLCAweDg2OUMsIDB4MDlCNywgMHg4NjlELCAweDFERjcsCi0gICAgMHg4NjlFLCAweDFERTksIDB4ODZBMSwgMHgxREYyLCAweDg2QTIsIDB4MURFNCwgMHg4NkEzLCAweDA5QjYsCi0gICAgMHg4NkE0LCAweDA5QjMsIDB4ODZBNSwgMHgxREYwLCAweDg2QTcsIDB4MURGMywgMHg4NkE4LCAweDFERTUsCi0gICAgMHg4NkE5LCAweDA5QjQsIDB4ODZBQSwgMHgwOUIxLCAweDg2QUYsIDB4MEI5MiwgMHg4NkIwLCAweDIwNDMsCi0gICAgMHg4NkIxLCAweDBCOTEsIDB4ODZCMywgMHgyMDQ2LCAweDg2QjQsIDB4MjA0OSwgMHg4NkI1LCAweDBCOEUsCi0gICAgMHg4NkI2LCAweDBCOEMsIDB4ODZCNywgMHgyMDNFLCAweDg2QjgsIDB4MjA0NywgMHg4NkI5LCAweDIwNDUsCi0gICAgMHg4NkJBLCAweDIwNDIsIDB4ODZCQiwgMHgyMDRBLCAweDg2QkMsIDB4MjA0QiwgMHg4NkJELCAweDIwNEQsCi0gICAgMHg4NkJFLCAweDIwNEUsIDB4ODZCRiwgMHgyMDNELCAweDg2QzAsIDB4MEI4QiwgMHg4NkMxLCAweDIwNDAsCi0gICAgMHg4NkMyLCAweDIwM0YsIDB4ODZDMywgMHgyMDRDLCAweDg2QzQsIDB4MEI4RCwgMHg4NkM1LCAweDIwNDEsCi0gICAgMHg4NkM2LCAweDBCOEYsIDB4ODZDNywgMHgwQjhBLCAweDg2QzgsIDB4MjA0NCwgMHg4NkM5LCAweDBCOTMsCi0gICAgMHg4NkNCLCAweDBCOTAsIDB4ODZDQywgMHgyMDQ4LCAweDg2RDAsIDB4MEQ0RiwgMHg4NkQxLCAweDIyRDIsCi0gICAgMHg4NkQzLCAweDIyQzcsIDB4ODZENCwgMHgwRDRDLCAweDg2RDYsIDB4MjU2RCwgMHg4NkQ3LCAweDIyRDAsCi0gICAgMHg4NkQ4LCAweDIyQzQsIDB4ODZEOSwgMHgwRDRBLCAweDg2REEsIDB4MjJDOSwgMHg4NkRCLCAweDBENEQsCi0gICAgMHg4NkRDLCAweDIyQ0QsIDB4ODZERCwgMHgyMkNCLCAweDg2REUsIDB4MEQ1MCwgMHg4NkRGLCAweDBENDksCi0gICAgMHg4NkUyLCAweDIyQzUsIDB4ODZFMywgMHgyMkM4LCAweDg2RTQsIDB4MEQ0RSwgMHg4NkU2LCAweDIyQzYsCi0gICAgMHg4NkU4LCAweDIyRDEsIDB4ODZFOSwgMHgyMkNGLCAweDg2RUEsIDB4MjJDQSwgMHg4NkVCLCAweDIyQ0MsCi0gICAgMHg4NkVDLCAweDIyQ0UsIDB4ODZFRCwgMHgwRDRCLCAweDg2RjUsIDB4MjU2RSwgMHg4NkY2LCAweDI1NzQsCi0gICAgMHg4NkY3LCAweDI1NkEsIDB4ODZGOCwgMHgyNTcwLCAweDg2RjksIDB4MEVFRiwgMHg4NkZBLCAweDI1NkMsCi0gICAgMHg4NkZCLCAweDBFRjUsIDB4ODZGRSwgMHgwRUY0LCAweDg3MDAsIDB4MEVGMywgMHg4NzAxLCAweDI1NzMsCi0gICAgMHg4NzAyLCAweDBFRjYsIDB4ODcwMywgMHgwRUY3LCAweDg3MDQsIDB4MjU2OSwgMHg4NzA1LCAweDI1NzYsCi0gICAgMHg4NzA2LCAweDBFRjgsIDB4ODcwNywgMHgwRUYyLCAweDg3MDgsIDB4MEVGMSwgMHg4NzA5LCAweDI1NzIsCi0gICAgMHg4NzBBLCAweDBFRjksIDB4ODcwQiwgMHgyNTY4LCAweDg3MEMsIDB4MjU2QiwgMHg4NzBELCAweDI1NzUsCi0gICAgMHg4NzBFLCAweDI1NzEsIDB4ODcxMSwgMHgyN0VFLCAweDg3MTIsIDB4MjdFMywgMHg4NzEzLCAweDBFRjAsCi0gICAgMHg4NzE4LCAweDEwOTgsIDB4ODcxOSwgMHgyN0Q3LCAweDg3MUEsIDB4MjdFQywgMHg4NzFCLCAweDI3RDgsCi0gICAgMHg4NzFDLCAweDEwOTMsIDB4ODcxRSwgMHgyN0Q1LCAweDg3MjAsIDB4MjdERSwgMHg4NzIxLCAweDI3RDYsCi0gICAgMHg4NzIyLCAweDEwOTUsIDB4ODcyMywgMHgyN0QwLCAweDg3MjQsIDB4MjdFQiwgMHg4NzI1LCAweDEwOTYsCi0gICAgMHg4NzI2LCAweDI3RTgsIDB4ODcyNywgMHgyN0U5LCAweDg3MjgsIDB4MjdEMSwgMHg4NzI5LCAweDEwOUIsCi0gICAgMHg4NzJBLCAweDI3RTAsIDB4ODcyQywgMHgyN0RBLCAweDg3MkQsIDB4MjdFMSwgMHg4NzJFLCAweDI3RDQsCi0gICAgMHg4NzMwLCAweDI3RUQsIDB4ODczMSwgMHgyN0U1LCAweDg3MzIsIDB4MjdERiwgMHg4NzMzLCAweDI3Q0YsCi0gICAgMHg4NzM0LCAweDEwOTcsIDB4ODczNSwgMHgyN0U2LCAweDg3MzcsIDB4MTA5QSwgMHg4NzM4LCAweDI3RUEsCi0gICAgMHg4NzNBLCAweDI3RTQsIDB4ODczQiwgMHgxMDk0LCAweDg3M0MsIDB4MjdFMiwgMHg4NzNFLCAweDI3REMsCi0gICAgMHg4NzNGLCAweDEwOTIsIDB4ODc0MCwgMHgyN0QzLCAweDg3NDEsIDB4MjdEQiwgMHg4NzQyLCAweDI3RTcsCi0gICAgMHg4NzQzLCAweDI3RDksIDB4ODc0NiwgMHgyN0RELCAweDg3NEMsIDB4MTIwOCwgMHg4NzRELCAweDI1NkYsCi0gICAgMHg4NzRFLCAweDJBMjAsIDB4ODc0RiwgMHgyQTI5LCAweDg3NTAsIDB4MkExRiwgMHg4NzUxLCAweDJBMUIsCi0gICAgMHg4NzUyLCAweDJBMTgsIDB4ODc1MywgMHgxMjA5LCAweDg3NTQsIDB4MkExNiwgMHg4NzU1LCAweDEwOTksCi0gICAgMHg4NzU2LCAweDJBMEYsIDB4ODc1NywgMHgxMjA3LCAweDg3NTgsIDB4MkExNSwgMHg4NzU5LCAweDEyMDYsCi0gICAgMHg4NzVBLCAweDJBMUEsIDB4ODc1QiwgMHgyQTE3LCAweDg3NUMsIDB4MkEyNywgMHg4NzVELCAweDJBMjIsCi0gICAgMHg4NzVFLCAweDJBMUMsIDB4ODc1RiwgMHgyQTIxLCAweDg3NjAsIDB4MTIwMiwgMHg4NzYxLCAweDJBMTksCi0gICAgMHg4NzYyLCAweDJBMkMsIDB4ODc2MywgMHgyQTEwLCAweDg3NjQsIDB4MkExMSwgMHg4NzY1LCAweDJBMjgsCi0gICAgMHg4NzY2LCAweDEyMDMsIDB4ODc2NywgMHgyQTJELCAweDg3NjgsIDB4MTIwNSwgMHg4NzY5LCAweDJBMkUsCi0gICAgMHg4NzZBLCAweDJBMUUsIDB4ODc2QiwgMHgyN0QyLCAweDg3NkMsIDB4MkEyNCwgMHg4NzZELCAweDJBMUQsCi0gICAgMHg4NzZFLCAweDJBMjYsIDB4ODc2RiwgMHgyQTIzLCAweDg3NzMsIDB4MkExNCwgMHg4Nzc0LCAweDEyMDAsCi0gICAgMHg4Nzc1LCAweDJBMkIsIDB4ODc3NiwgMHgxMjAxLCAweDg3NzcsIDB4MkExMiwgMHg4Nzc4LCAweDEyMDQsCi0gICAgMHg4Nzc5LCAweDJDNkIsIDB4ODc3QSwgMHgyQTI1LCAweDg3N0IsIDB4MkEyQSwgMHg4NzgxLCAweDJDNjgsCi0gICAgMHg4NzgyLCAweDExRkYsIDB4ODc4MywgMHgxMzQwLCAweDg3ODQsIDB4MkM3MiwgMHg4Nzg1LCAweDJDNkUsCi0gICAgMHg4Nzg3LCAweDJDNkMsIDB4ODc4OCwgMHgyQzY3LCAweDg3ODksIDB4MkM3NiwgMHg4NzhELCAweDEzNDQsCi0gICAgMHg4NzhGLCAweDJDNjMsIDB4ODc5MCwgMHgyQzZGLCAweDg3OTEsIDB4MkM3MCwgMHg4NzkyLCAweDJDNjYsCi0gICAgMHg4NzkzLCAweDJDNjUsIDB4ODc5NCwgMHgyQzczLCAweDg3OTYsIDB4MkM2OSwgMHg4Nzk3LCAweDJDNjQsCi0gICAgMHg4Nzk4LCAweDJDNkEsIDB4ODc5QSwgMHgyQzc1LCAweDg3OUIsIDB4MkM2MiwgMHg4NzlDLCAweDJDNzQsCi0gICAgMHg4NzlELCAweDJDNzEsIDB4ODc5RSwgMHgxMzQyLCAweDg3OUYsIDB4MTM0MSwgMHg4N0EyLCAweDEzNDMsCi0gICAgMHg4N0EzLCAweDJDNkQsIDB4ODdBNCwgMHgyQzYxLCAweDg3QUEsIDB4MkUzNiwgMHg4N0FCLCAweDE0NkMsCi0gICAgMHg4N0FDLCAweDJFM0EsIDB4ODdBRCwgMHgyRTM3LCAweDg3QUUsIDB4MkUzRSwgMHg4N0FGLCAweDJFNDQsCi0gICAgMHg4N0IwLCAweDJFMzksIDB4ODdCMiwgMHgyRTRELCAweDg3QjMsIDB4MTQ2OSwgMHg4N0I0LCAweDJFNDcsCi0gICAgMHg4N0I1LCAweDJFM0MsIDB4ODdCNiwgMHgyRTQ4LCAweDg3QjcsIDB4MkU0MywgMHg4N0I4LCAweDJFNEEsCi0gICAgMHg4N0I5LCAweDJFM0IsIDB4ODdCQSwgMHgxNDZFLCAweDg3QkIsIDB4MTQ2RCwgMHg4N0JDLCAweDJFM0QsCi0gICAgMHg4N0JELCAweDJFNEIsIDB4ODdCRSwgMHgyRTM1LCAweDg3QkYsIDB4MkU0OSwgMHg4N0MwLCAweDE0NjcsCi0gICAgMHg4N0MyLCAweDJFNDEsIDB4ODdDMywgMHgyRTQwLCAweDg3QzQsIDB4MkU0NSwgMHg4N0M1LCAweDJFMzgsCi0gICAgMHg4N0M2LCAweDE0NkIsIDB4ODdDOCwgMHgxNDZGLCAweDg3QzksIDB4MkUzRiwgMHg4N0NBLCAweDJFNDYsCi0gICAgMHg4N0NCLCAweDE0NzAsIDB4ODdDQywgMHgyRTQyLCAweDg3RDEsIDB4MTQ2OCwgMHg4N0QyLCAweDE0NkEsCi0gICAgMHg4N0QzLCAweDJGQkEsIDB4ODdENCwgMHgyRkI4LCAweDg3RDcsIDB4MkZCRSwgMHg4N0Q4LCAweDJGQkMsCi0gICAgMHg4N0Q5LCAweDJGQkYsIDB4ODdEQiwgMHgyRkIxLCAweDg3REMsIDB4MkZCOSwgMHg4N0RELCAweDJGQzMsCi0gICAgMHg4N0RFLCAweDJFNEMsIDB4ODdERiwgMHgyRkI1LCAweDg3RTAsIDB4MTUyNiwgMHg4N0UxLCAweDJBMTMsCi0gICAgMHg4N0UyLCAweDJGQjAsIDB4ODdFMywgMHgyRkJELCAweDg3RTQsIDB4MkZCNywgMHg4N0U1LCAweDJGQjQsCi0gICAgMHg4N0U2LCAweDJGQUYsIDB4ODdFNywgMHgyRkFFLCAweDg3RTgsIDB4MkZDMiwgMHg4N0VBLCAweDJGQjMsCi0gICAgMHg4N0VCLCAweDJGQjIsIDB4ODdFQywgMHgxNTI0LCAweDg3RUQsIDB4MkZCQiwgMHg4N0VGLCAweDE1MjMsCi0gICAgMHg4N0YyLCAweDE1MjUsIDB4ODdGMywgMHgyRkI2LCAweDg3RjQsIDB4MkZDMSwgMHg4N0Y2LCAweDMxMEEsCi0gICAgMHg4N0Y3LCAweDMxMEIsIDB4ODdGOSwgMHgxNUJFLCAweDg3RkEsIDB4MzEwOCwgMHg4N0ZCLCAweDE1QkIsCi0gICAgMHg4N0ZDLCAweDMxMTAsIDB4ODdGRSwgMHgxNUJGLCAweDg3RkYsIDB4MzExMiwgMHg4ODAwLCAweDMxMDcsCi0gICAgMHg4ODAxLCAweDJGQzAsIDB4ODgwMiwgMHgzMTE0LCAweDg4MDMsIDB4MzEwOSwgMHg4ODA1LCAweDE1QkMsCi0gICAgMHg4ODA2LCAweDMxMEYsIDB4ODgwOCwgMHgzMTExLCAweDg4MDksIDB4MzEwQywgMHg4ODBBLCAweDMxMTMsCi0gICAgMHg4ODBCLCAweDMxMEUsIDB4ODgwQywgMHgzMTBELCAweDg4MEQsIDB4MTVCRCwgMHg4ODEwLCAweDMyMkMsCi0gICAgMHg4ODExLCAweDMyMkQsIDB4ODgxMywgMHgzMjJGLCAweDg4MTQsIDB4MTYzRiwgMHg4ODE1LCAweDE2NDAsCi0gICAgMHg4ODE2LCAweDMyMzAsIDB4ODgxNywgMHgzMjJFLCAweDg4MTksIDB4MzIyQiwgMHg4ODFCLCAweDMzMDYsCi0gICAgMHg4ODFDLCAweDMzMDksIDB4ODgxRCwgMHgzMzA1LCAweDg4MUYsIDB4MTY4QiwgMHg4ODIwLCAweDMzMDcsCi0gICAgMHg4ODIxLCAweDE2OEEsIDB4ODgyMiwgMHgxNjg5LCAweDg4MjMsIDB4MTY4OCwgMHg4ODI0LCAweDMzMDgsCi0gICAgMHg4ODI1LCAweDMzQjEsIDB4ODgyNiwgMHgzM0FGLCAweDg4MjgsIDB4MzNBRSwgMHg4ODI5LCAweDMzMDQsCi0gICAgMHg4ODJBLCAweDMzQjAsIDB4ODgyQiwgMHgzMzBBLCAweDg4MkMsIDB4MzNBRCwgMHg4ODJFLCAweDM0MzcsCi0gICAgMHg4ODJGLCAweDM0MTUsIDB4ODgzMCwgMHgzNDM1LCAweDg4MzEsIDB4MTcwOSwgMHg4ODMyLCAweDM0MzYsCi0gICAgMHg4ODMzLCAweDM0MzgsIDB4ODgzNSwgMHgzNDlBLCAweDg4MzYsIDB4MTcyOCwgMHg4ODM3LCAweDM0OTksCi0gICAgMHg4ODM4LCAweDM0OTgsIDB4ODgzOSwgMHgxNzI5LCAweDg4M0IsIDB4MTc0NywgMHg4ODNDLCAweDM1MDgsCi0gICAgMHg4ODNELCAweDM1MjAsIDB4ODgzRSwgMHgzNTFGLCAweDg4M0YsIDB4MzUyMSwgMHg4ODQwLCAweDA0MTAsCi0gICAgMHg4ODQxLCAweDFCRkUsIDB4ODg0MywgMHgxREZBLCAweDg4NDQsIDB4MURGQiwgMHg4ODQ4LCAweDIyRDMsCi0gICAgMHg4ODRBLCAweDMzMEIsIDB4ODg0QiwgMHgzNDlCLCAweDg4NEMsIDB4MDQxMSwgMHg4ODRELCAweDA4MDMsCi0gICAgMHg4ODRFLCAweDFCRkYsIDB4ODg1MiwgMHgyMDRGLCAweDg4NTMsIDB4MEI5NCwgMHg4ODU1LCAweDIyRDUsCi0gICAgMHg4ODU2LCAweDIyRDQsIDB4ODg1NywgMHgwRDUxLCAweDg4NTksIDB4MEVGQSwgMHg4ODVBLCAweDJBMkYsCi0gICAgMHg4ODVCLCAweDEyMEEsIDB4ODg1RCwgMHgxMjBCLCAweDg4NjEsIDB4MTM0NSwgMHg4ODYyLCAweDE3MkEsCi0gICAgMHg4ODYzLCAweDA0MTIsIDB4ODg2NywgMHgxQzAwLCAweDg4NjgsIDB4MDY4QywgMHg4ODY5LCAweDFDMDIsCi0gICAgMHg4ODZBLCAweDFDMDEsIDB4ODg2QiwgMHgwODA0LCAweDg4NkQsIDB4MURGQywgMHg4ODZGLCAweDFFMDMsCi0gICAgMHg4ODcwLCAweDA5QjgsIDB4ODg3MSwgMHgxRTAxLCAweDg4NzIsIDB4MURGRiwgMHg4ODc0LCAweDFFMDYsCi0gICAgMHg4ODc1LCAweDFERkQsIDB4ODg3NiwgMHgxREZFLCAweDg4NzcsIDB4MDlCOSwgMHg4ODc5LCAweDA5QkQsCi0gICAgMHg4ODdDLCAweDFFMDcsIDB4ODg3RCwgMHgwOUJDLCAweDg4N0UsIDB4MUUwNSwgMHg4ODdGLCAweDFFMDIsCi0gICAgMHg4ODgwLCAweDFFMDAsIDB4ODg4MSwgMHgwOUJBLCAweDg4ODIsIDB4MDlCQiwgMHg4ODgzLCAweDFFMDQsCi0gICAgMHg4ODg4LCAweDBCOTYsIDB4ODg4OSwgMHgyMDUwLCAweDg4OEIsIDB4MEI5QiwgMHg4ODhDLCAweDIwNjAsCi0gICAgMHg4ODhELCAweDBCOUEsIDB4ODg4RSwgMHgyMDYyLCAweDg4OTEsIDB4MjA1NiwgMHg4ODkyLCAweDBCOTgsCi0gICAgMHg4ODkzLCAweDIwNjEsIDB4ODg5NSwgMHgyMDUxLCAweDg4OTYsIDB4MEI5OSwgMHg4ODk3LCAweDIwNUQsCi0gICAgMHg4ODk4LCAweDIwNTksIDB4ODg5OSwgMHgyMDVCLCAweDg4OUEsIDB4MjA1NSwgMHg4ODlCLCAweDIwNUMsCi0gICAgMHg4ODlFLCAweDBCOTUsIDB4ODg5RiwgMHgyMDU4LCAweDg4QTEsIDB4MjA1NywgMHg4OEEyLCAweDIwNTMsCi0gICAgMHg4OEE0LCAweDIwNUUsIDB4ODhBNywgMHgyMDVBLCAweDg4QTgsIDB4MjA1MiwgMHg4OEFBLCAweDIwNTQsCi0gICAgMHg4OEFCLCAweDBCOTcsIDB4ODhBQywgMHgyMDVGLCAweDg4QjEsIDB4MEQ1NCwgMHg4OEIyLCAweDIyRTAsCi0gICAgMHg4OEI2LCAweDIyREMsIDB4ODhCNywgMHgyMkRFLCAweDg4QjgsIDB4MjJEOSwgMHg4OEI5LCAweDIyRDgsCi0gICAgMHg4OEJBLCAweDIyRDYsIDB4ODhCQywgMHgyMkRELCAweDg4QkQsIDB4MjJERiwgMHg4OEJFLCAweDIyREIsCi0gICAgMHg4OEMwLCAweDIyREEsIDB4ODhDMSwgMHgwRDUyLCAweDg4QzIsIDB4MEQ1MywgMHg4OEM5LCAweDIyRTIsCi0gICAgMHg4OENBLCAweDBGMDIsIDB4ODhDQiwgMHgyNTc4LCAweDg4Q0MsIDB4MjU3RSwgMHg4OENELCAweDI1NzksCi0gICAgMHg4OENFLCAweDI1N0EsIDB4ODhDRiwgMHgzNkVBLCAweDg4RDAsIDB4MjU3RiwgMHg4OEQyLCAweDBGMDQsCi0gICAgMHg4OEQ0LCAweDBFRkMsIDB4ODhENSwgMHgwRjAzLCAweDg4RDYsIDB4MjU3NywgMHg4OEQ3LCAweDIyRDcsCi0gICAgMHg4OEQ4LCAweDBFRkYsIDB4ODhEOSwgMHgwRUZELCAweDg4REEsIDB4MjU3RCwgMHg4OERCLCAweDI1N0MsCi0gICAgMHg4OERDLCAweDBFRkUsIDB4ODhERCwgMHgwRjAwLCAweDg4REUsIDB4MjU3QiwgMHg4OERGLCAweDBFRkIsCi0gICAgMHg4OEUxLCAweDBGMDEsIDB4ODhFNywgMHgyN0YwLCAweDg4RTgsIDB4MTBBMiwgMHg4OEVCLCAweDI3RkIsCi0gICAgMHg4OEVDLCAweDI3RkEsIDB4ODhFRSwgMHgyN0Y1LCAweDg4RUYsIDB4MTBBNCwgMHg4OEYwLCAweDI3RjksCi0gICAgMHg4OEYxLCAweDI3RjEsIDB4ODhGMiwgMHgyN0YyLCAweDg4RjMsIDB4MTA5QywgMHg4OEY0LCAweDEwOUUsCi0gICAgMHg4OEY2LCAweDI3RjcsIDB4ODhGNywgMHgyN0VGLCAweDg4RjgsIDB4MTBBMCwgMHg4OEY5LCAweDEwOUYsCi0gICAgMHg4OEZBLCAweDI3RjMsIDB4ODhGQiwgMHgyN0Y4LCAweDg4RkMsIDB4MjdGNiwgMHg4OEZELCAweDEwQTEsCi0gICAgMHg4OEZFLCAweDI3RjQsIDB4ODkwMSwgMHgyMkUxLCAweDg5MDIsIDB4MTA5RCwgMHg4OTA1LCAweDJBMzAsCi0gICAgMHg4OTA2LCAweDJBMzcsIDB4ODkwNywgMHgxMjBELCAweDg5MDksIDB4MkEzQiwgMHg4OTBBLCAweDEyMTEsCi0gICAgMHg4OTBCLCAweDJBMzMsIDB4ODkwQywgMHgyQTMxLCAweDg5MEUsIDB4MkEzQSwgMHg4OTEwLCAweDEyMEMsCi0gICAgMHg4OTExLCAweDJBMzksIDB4ODkxMiwgMHgxMjBFLCAweDg5MTMsIDB4MTIwRiwgMHg4OTE0LCAweDJBMzIsCi0gICAgMHg4OTE1LCAweDEyMTAsIDB4ODkxNiwgMHgyQTM4LCAweDg5MTcsIDB4MkEzNCwgMHg4OTE4LCAweDJBMzUsCi0gICAgMHg4OTE5LCAweDJBMzYsIDB4ODkxQSwgMHgxMEEzLCAweDg5MUUsIDB4MkM3NywgMHg4OTFGLCAweDJDODMsCi0gICAgMHg4OTIxLCAweDEzNEEsIDB4ODkyMiwgMHgyQzdFLCAweDg5MjMsIDB4MkM4MCwgMHg4OTI1LCAweDEzNDgsCi0gICAgMHg4OTI2LCAweDJDNzgsIDB4ODkyNywgMHgyQzdDLCAweDg5MjksIDB4MkM3RiwgMHg4OTJBLCAweDEzNDYsCi0gICAgMHg4OTJCLCAweDEzNDksIDB4ODkyQywgMHgyQzgyLCAweDg5MkQsIDB4MkM3QSwgMHg4OTJFLCAweDJDN0IsCi0gICAgMHg4OTJGLCAweDJDODEsIDB4ODkzMCwgMHgyQzc5LCAweDg5MzEsIDB4MkM3RCwgMHg4OTMyLCAweDEzNDcsCi0gICAgMHg4OTMzLCAweDJFNEYsIDB4ODkzNSwgMHgyRTRFLCAweDg5MzYsIDB4MTQ3MiwgMHg4OTM3LCAweDJFNTQsCi0gICAgMHg4OTM4LCAweDE0NzQsIDB4ODkzQiwgMHgxNDcxLCAweDg5M0MsIDB4MkU1MCwgMHg4OTNELCAweDE0NzUsCi0gICAgMHg4OTNFLCAweDJFNTEsIDB4ODk0MSwgMHgyRTUyLCAweDg5NDIsIDB4MkU1NSwgMHg4OTQ0LCAweDE0NzMsCi0gICAgMHg4OTQ2LCAweDJGQzgsIDB4ODk0OSwgMHgyRkNCLCAweDg5NEIsIDB4MkZDNSwgMHg4OTRDLCAweDJGQzcsCi0gICAgMHg4OTRGLCAweDJGQzYsIDB4ODk1MCwgMHgyRkM5LCAweDg5NTEsIDB4MkZDQSwgMHg4OTUyLCAweDJFNTMsCi0gICAgMHg4OTUzLCAweDJGQzQsIDB4ODk1NiwgMHgxNUMyLCAweDg5NTcsIDB4MzExOCwgMHg4OTU4LCAweDMxMUIsCi0gICAgMHg4OTU5LCAweDMxMUQsIDB4ODk1QSwgMHgzMTE2LCAweDg5NUIsIDB4MzExNywgMHg4OTVDLCAweDMxMUEsCi0gICAgMHg4OTVELCAweDMxMUMsIDB4ODk1RSwgMHgxNUMzLCAweDg5NUYsIDB4MTVDMSwgMHg4OTYwLCAweDE1QzAsCi0gICAgMHg4OTYxLCAweDMxMTksIDB4ODk2MiwgMHgzMTE1LCAweDg5NjMsIDB4MzIzMSwgMHg4OTY0LCAweDE2NDEsCi0gICAgMHg4OTY2LCAweDMyMzIsIDB4ODk2OSwgMHgzMzBELCAweDg5NkEsIDB4MTY4QywgMHg4OTZCLCAweDMzMEYsCi0gICAgMHg4OTZDLCAweDE2OEQsIDB4ODk2RCwgMHgzMzBDLCAweDg5NkUsIDB4MzMwRSwgMHg4OTZGLCAweDE2RDYsCi0gICAgMHg4OTcxLCAweDMzQjIsIDB4ODk3MiwgMHgxNkQ1LCAweDg5NzMsIDB4MzQzQiwgMHg4OTc0LCAweDM0M0EsCi0gICAgMHg4OTc2LCAweDM0MzksIDB4ODk3OSwgMHgzNEUyLCAweDg5N0EsIDB4MzRFMywgMHg4OTdCLCAweDM0RTUsCi0gICAgMHg4OTdDLCAweDM0RTQsIDB4ODk3RSwgMHgxODE5LCAweDg5N0YsIDB4MDQxMywgMHg4OTgxLCAweDA4MDUsCi0gICAgMHg4OTgyLCAweDIwNjMsIDB4ODk4MywgMHgwRDU1LCAweDg5ODUsIDB4MjU4MCwgMHg4OTg2LCAweDE1MjcsCi0gICAgMHg4OTg4LCAweDMxMUUsIDB4ODk4QiwgMHgwNTA4LCAweDg5OEYsIDB4MEI5RCwgMHg4OTkzLCAweDBCOUMsCi0gICAgMHg4OTk1LCAweDIyRTMsIDB4ODk5NiwgMHgwRDU2LCAweDg5OTcsIDB4MjJFNSwgMHg4OTk4LCAweDIyRTQsCi0gICAgMHg4OTlCLCAweDI1ODEsIDB4ODk5QywgMHgwRjA1LCAweDg5OUQsIDB4MjdGQywgMHg4OTlFLCAweDI3RkYsCi0gICAgMHg4OTlGLCAweDI3RkUsIDB4ODlBMSwgMHgyN0ZELCAweDg5QTIsIDB4MkEzQywgMHg4OUEzLCAweDJBM0UsCi0gICAgMHg4OUE0LCAweDJBM0QsIDB4ODlBNiwgMHgxMzRDLCAweDg5QUEsIDB4MTM0QiwgMHg4OUFDLCAweDE0NzYsCi0gICAgMHg4OUFELCAweDJFNTYsIDB4ODlBRSwgMHgyRTU4LCAweDg5QUYsIDB4MkU1NywgMHg4OUIyLCAweDE1MjgsCi0gICAgMHg4OUI2LCAweDMxMjAsIDB4ODlCNywgMHgzMTFGLCAweDg5QjksIDB4MzIzMywgMHg4OUJBLCAweDE2NDIsCi0gICAgMHg4OUJELCAweDE2OEUsIDB4ODlCRSwgMHgzM0I0LCAweDg5QkYsIDB4MzNCMywgMHg4OUMwLCAweDE3NDgsCi0gICAgMHg4OUQyLCAweDA1MDksIDB4ODlEMywgMHgxQzAzLCAweDg5RDQsIDB4MDgwNiwgMHg4OUQ1LCAweDIwNjYsCi0gICAgMHg4OUQ2LCAweDIwNjQsIDB4ODlEOSwgMHgyMDY1LCAweDg5REEsIDB4MjJFNywgMHg4OURCLCAweDIyRTgsCi0gICAgMHg4OURDLCAweDI1ODgsIDB4ODlERCwgMHgyMkU2LCAweDg5REYsIDB4MjU4MiwgMHg4OUUwLCAweDI1ODYsCi0gICAgMHg4OUUxLCAweDI1ODUsIDB4ODlFMiwgMHgyNTg3LCAweDg5RTMsIDB4MEYwNiwgMHg4OUU0LCAweDI1ODQsCi0gICAgMHg4OUU1LCAweDI1ODMsIDB4ODlFNiwgMHgyNTg5LCAweDg5RTgsIDB4MjgwMiwgMHg4OUU5LCAweDI4MDAsCi0gICAgMHg4OUVCLCAweDI4MDEsIDB4ODlFQywgMHgyQTQxLCAweDg5RUQsIDB4MkEzRiwgMHg4OUYwLCAweDJBNDAsCi0gICAgMHg4OUYxLCAweDJDODQsIDB4ODlGMiwgMHgyRTU5LCAweDg5RjMsIDB4MkU1QSwgMHg4OUY0LCAweDE1MjksCi0gICAgMHg4OUY2LCAweDMxMjEsIDB4ODlGNywgMHgzMjM0LCAweDg5RjgsIDB4MTY0MywgMHg4OUZBLCAweDMzMTAsCi0gICAgMHg4OUZCLCAweDMzQjUsIDB4ODlGQywgMHgxNkQ3LCAweDg5RkUsIDB4MzQzQywgMHg4OUZGLCAweDM0RTYsCi0gICAgMHg4QTAwLCAweDA1MEEsIDB4OEEwMiwgMHgwODA4LCAweDhBMDMsIDB4MDgwOSwgMHg4QTA0LCAweDFDMDQsCi0gICAgMHg4QTA3LCAweDFDMDUsIDB4OEEwOCwgMHgwODA3LCAweDhBMEEsIDB4MDlDMywgMHg4QTBDLCAweDA5QzEsCi0gICAgMHg4QTBFLCAweDA5QzAsIDB4OEEwRiwgMHgwOUM3LCAweDhBMTAsIDB4MDlCRiwgMHg4QTExLCAweDA5QzgsCi0gICAgMHg4QTEyLCAweDFFMDgsIDB4OEExMywgMHgwOUM1LCAweDhBMTUsIDB4MDlDMiwgMHg4QTE2LCAweDA5QzYsCi0gICAgMHg4QTE3LCAweDA5QzQsIDB4OEExOCwgMHgwOUJFLCAweDhBMUIsIDB4MEJBNSwgMHg4QTFELCAweDBCOUYsCi0gICAgMHg4QTFFLCAweDIwNkEsIDB4OEExRiwgMHgwQkE0LCAweDhBMjIsIDB4MEJBNiwgMHg4QTIzLCAweDBCQTAsCi0gICAgMHg4QTI1LCAweDBCQTEsIDB4OEEyNywgMHgyMDY4LCAweDhBMkEsIDB4MEI5RSwgMHg4QTJDLCAweDIwNjksCi0gICAgMHg4QTJELCAweDBCQTMsIDB4OEEzMCwgMHgyMDY3LCAweDhBMzEsIDB4MEJBMiwgMHg4QTM0LCAweDBENjEsCi0gICAgMHg4QTM2LCAweDBENjMsIDB4OEEzOSwgMHgyMkVCLCAweDhBM0EsIDB4MEQ2MiwgMHg4QTNCLCAweDBENTcsCi0gICAgMHg4QTNDLCAweDBENUIsIDB4OEEzRSwgMHgwRjE5LCAweDhBM0YsIDB4MjU4RSwgMHg4QTQwLCAweDIyRUQsCi0gICAgMHg4QTQxLCAweDBENUMsIDB4OEE0NCwgMHgyMkYwLCAweDhBNDUsIDB4MjJGMSwgMHg4QTQ2LCAweDBENjAsCi0gICAgMHg4QTQ4LCAweDIyRjMsIDB4OEE0QSwgMHgyMkY1LCAweDhBNEMsIDB4MjJGNiwgMHg4QTRELCAweDIyRUEsCi0gICAgMHg4QTRFLCAweDIyRTksIDB4OEE0RiwgMHgyMkY3LCAweDhBNTAsIDB4MEQ1RiwgMHg4QTUxLCAweDIyRjQsCi0gICAgMHg4QTUyLCAweDIyRjIsIDB4OEE1NCwgMHgwRDVELCAweDhBNTUsIDB4MEQ1OSwgMHg4QTU2LCAweDBENjQsCi0gICAgMHg4QTU3LCAweDIyRUUsIDB4OEE1OCwgMHgyMkVGLCAweDhBNTksIDB4MjJFQywgMHg4QTVCLCAweDBENUUsCi0gICAgMHg4QTVFLCAweDBENUEsIDB4OEE2MCwgMHgwRDU4LCAweDhBNjEsIDB4MjU4RCwgMHg4QTYyLCAweDBGMTQsCi0gICAgMHg4QTYzLCAweDBGMEYsIDB4OEE2NiwgMHgwRjBBLCAweDhBNjgsIDB4MEYxQSwgMHg4QTY5LCAweDBGMEIsCi0gICAgMHg4QTZCLCAweDBGMDcsIDB4OEE2QywgMHgwRjE2LCAweDhBNkQsIDB4MEYxMywgMHg4QTZFLCAweDBGMTUsCi0gICAgMHg4QTcwLCAweDBGMEMsIDB4OEE3MSwgMHgwRjExLCAweDhBNzIsIDB4MEYwOCwgMHg4QTczLCAweDBGMDksCi0gICAgMHg4QTc0LCAweDI1OTUsIDB4OEE3NSwgMHgyNTkyLCAweDhBNzYsIDB4MjU4QSwgMHg4QTc3LCAweDI1OEYsCi0gICAgMHg4QTc5LCAweDBGMTcsIDB4OEE3QSwgMHgyNTk2LCAweDhBN0IsIDB4MEYxOCwgMHg4QTdDLCAweDBGMEUsCi0gICAgMHg4QTdGLCAweDI1OEMsIDB4OEE4MSwgMHgyNTk0LCAweDhBODIsIDB4MjU5MCwgMHg4QTgzLCAweDI1OTMsCi0gICAgMHg4QTg0LCAweDI1OTEsIDB4OEE4NSwgMHgwRjEyLCAweDhBODYsIDB4MjU4QiwgMHg4QTg3LCAweDBGMEQsCi0gICAgMHg4QThCLCAweDI4MDUsIDB4OEE4QywgMHgxMEE2LCAweDhBOEQsIDB4MTBBOSwgMHg4QThGLCAweDI4MDcsCi0gICAgMHg4QTkxLCAweDEwQjEsIDB4OEE5MiwgMHgyODA2LCAweDhBOTMsIDB4MTBBQiwgMHg4QTk1LCAweDEyMTYsCi0gICAgMHg4QTk2LCAweDI4MDgsIDB4OEE5OCwgMHgxMEIwLCAweDhBOTksIDB4MjgwNCwgMHg4QTlBLCAweDEwQjIsCi0gICAgMHg4QTlFLCAweDEwQTcsIDB4OEFBMCwgMHgwRjEwLCAweDhBQTEsIDB4MTBBQSwgMHg4QUEzLCAweDEwQTgsCi0gICAgMHg4QUE0LCAweDEwQUMsIDB4OEFBNSwgMHgxMEFFLCAweDhBQTYsIDB4MTBBNSwgMHg4QUE3LCAweDEwQjMsCi0gICAgMHg4QUE4LCAweDEwQUYsIDB4OEFBQSwgMHgxMEFELCAweDhBQUIsIDB4MjgwMywgMHg4QUIwLCAweDEyMUQsCi0gICAgMHg4QUIyLCAweDEyMTksIDB4OEFCNiwgMHgxMjIwLCAweDhBQjgsIDB4MkE0NCwgMHg4QUI5LCAweDEyMjEsCi0gICAgMHg4QUJBLCAweDJBNTAsIDB4OEFCQiwgMHgyQTQ5LCAweDhBQkMsIDB4MTIxMiwgMHg4QUJELCAweDJBNTEsCi0gICAgMHg4QUJFLCAweDJBNEIsIDB4OEFCRiwgMHgxMjFDLCAweDhBQzAsIDB4MkE0QywgMHg4QUMyLCAweDEyMUIsCi0gICAgMHg4QUMzLCAweDJBNEYsIDB4OEFDNCwgMHgxMjE1LCAweDhBQzUsIDB4MkE0RCwgMHg4QUM2LCAweDJBNDMsCi0gICAgMHg4QUM3LCAweDEyMTQsIDB4OEFDOCwgMHgyQzhGLCAweDhBQzksIDB4MTIxQSwgMHg4QUNCLCAweDEyMTcsCi0gICAgMHg4QUNELCAweDEyMUYsIDB4OEFDRiwgMHgyQTQyLCAweDhBRDEsIDB4MkE0NiwgMHg4QUQyLCAweDEyMTMsCi0gICAgMHg4QUQzLCAweDJBNDUsIDB4OEFENCwgMHgyQTQ3LCAweDhBRDUsIDB4MkE0OCwgMHg4QUQ2LCAweDEyMUUsCi0gICAgMHg4QUQ3LCAweDJBNEEsIDB4OEFEOCwgMHgyQTRFLCAweDhBRDksIDB4MkE1MiwgMHg4QURCLCAweDEyMjIsCi0gICAgMHg4QURDLCAweDEzNTIsIDB4OEFERCwgMHgyQzhBLCAweDhBREUsIDB4MkM5MCwgMHg4QURGLCAweDJDOEQsCi0gICAgMHg4QUUwLCAweDJDODUsIDB4OEFFMSwgMHgyQzkxLCAweDhBRTIsIDB4MkM4NiwgMHg4QUU0LCAweDJDOEMsCi0gICAgMHg4QUU2LCAweDEzNEQsIDB4OEFFNywgMHgxMzUzLCAweDhBRTgsIDB4MkM5MiwgMHg4QUVCLCAweDEzNEYsCi0gICAgMHg4QUVELCAweDEzNTksIDB4OEFFRSwgMHgxMzU0LCAweDhBRUYsIDB4MkM5NCwgMHg4QUYwLCAweDJDOEUsCi0gICAgMHg4QUYxLCAweDEzNTAsIDB4OEFGMiwgMHgyQzg3LCAweDhBRjMsIDB4MTM1QSwgMHg4QUY0LCAweDJDODgsCi0gICAgMHg4QUY1LCAweDJDODksIDB4OEFGNiwgMHgxMzVCLCAweDhBRjcsIDB4MTM1OCwgMHg4QUY4LCAweDEyMTgsCi0gICAgMHg4QUZBLCAweDEzNEUsIDB4OEFGQiwgMHgyQzk1LCAweDhBRkMsIDB4MTM1QywgMHg4QUZFLCAweDEzNTUsCi0gICAgMHg4QUZGLCAweDJDOTMsIDB4OEIwMCwgMHgxMzUxLCAweDhCMDEsIDB4MTM1NiwgMHg4QjAyLCAweDEzNTcsCi0gICAgMHg4QjA0LCAweDE0N0UsIDB4OEIwNSwgMHgyRTVGLCAweDhCMDYsIDB4MkU2OCwgMHg4QjA3LCAweDJFNjUsCi0gICAgMHg4QjA4LCAweDJFNjcsIDB4OEIwQSwgMHgxNDdCLCAweDhCMEIsIDB4MkU2MCwgMHg4QjBELCAweDJFNjYsCi0gICAgMHg4QjBFLCAweDE0NzcsIDB4OEIwRiwgMHgyRTYyLCAweDhCMTAsIDB4MTQ3RiwgMHg4QjExLCAweDJFNUUsCi0gICAgMHg4QjEyLCAweDJFNjMsIDB4OEIxMywgMHgyRTZBLCAweDhCMTQsIDB4MkM4QiwgMHg4QjE1LCAweDJFNjQsCi0gICAgMHg4QjE2LCAweDJFNUQsIDB4OEIxNywgMHgxNDc4LCAweDhCMTgsIDB4MkU1QywgMHg4QjE5LCAweDE0NzksCi0gICAgMHg4QjFBLCAweDJFNkIsIDB4OEIxQiwgMHgxNDdBLCAweDhCMUMsIDB4MkU2OSwgMHg4QjFELCAweDE0N0QsCi0gICAgMHg4QjFFLCAweDJFNUIsIDB4OEIyMCwgMHgxNDdDLCAweDhCMjIsIDB4MkU2MSwgMHg4QjIzLCAweDJGQ0UsCi0gICAgMHg4QjI0LCAweDJGREMsIDB4OEIyNSwgMHgyRkQ3LCAweDhCMjYsIDB4MkZEOSwgMHg4QjI3LCAweDJGQ0QsCi0gICAgMHg4QjI4LCAweDE1MkEsIDB4OEIyQSwgMHgyRkNDLCAweDhCMkIsIDB4MTUyRCwgMHg4QjJDLCAweDE1MkMsCi0gICAgMHg4QjJFLCAweDJGREIsIDB4OEIyRiwgMHgyRkQzLCAweDhCMzAsIDB4MkZEMCwgMHg4QjMxLCAweDJGRDYsCi0gICAgMHg4QjMzLCAweDJGQ0YsIDB4OEIzNSwgMHgyRkQxLCAweDhCMzYsIDB4MkZEQSwgMHg4QjM3LCAweDJGRDgsCi0gICAgMHg4QjM5LCAweDE1MkIsIDB4OEIzQSwgMHgyRkRGLCAweDhCM0IsIDB4MkZERCwgMHg4QjNDLCAweDJGRDQsCi0gICAgMHg4QjNELCAweDJGREUsIDB4OEIzRSwgMHgyRkQ1LCAweDhCNDAsIDB4MzEyNSwgMHg4QjQxLCAweDE1QzQsCi0gICAgMHg4QjQyLCAweDMxMkMsIDB4OEI0NSwgMHgzMzEzLCAweDhCNDYsIDB4MTVDQiwgMHg4QjQ3LCAweDJGRDIsCi0gICAgMHg4QjQ4LCAweDMxMjMsIDB4OEI0OSwgMHgxNUM3LCAweDhCNEEsIDB4MzEyNCwgMHg4QjRCLCAweDMxMjksCi0gICAgMHg4QjRFLCAweDE1QzksIDB4OEI0RiwgMHgxNUNBLCAweDhCNTAsIDB4MzEyMiwgMHg4QjUxLCAweDMxMkIsCi0gICAgMHg4QjUyLCAweDMxMkQsIDB4OEI1MywgMHgzMTI2LCAweDhCNTQsIDB4MzEyOCwgMHg4QjU1LCAweDMxMkEsCi0gICAgMHg4QjU2LCAweDMxMjcsIDB4OEI1NywgMHgzMTJFLCAweDhCNTgsIDB4MTVDNiwgMHg4QjU5LCAweDE1Q0MsCi0gICAgMHg4QjVBLCAweDE1QzgsIDB4OEI1QywgMHgxNUM1LCAweDhCNUQsIDB4MzIzNywgMHg4QjVGLCAweDE2NDgsCi0gICAgMHg4QjYwLCAweDMyMzUsIDB4OEI2MywgMHgzMjM5LCAweDhCNjUsIDB4MzIzQSwgMHg4QjY2LCAweDE2NDYsCi0gICAgMHg4QjY3LCAweDMyM0IsIDB4OEI2OCwgMHgzMjM4LCAweDhCNkEsIDB4MzIzNiwgMHg4QjZCLCAweDE2NDksCi0gICAgMHg4QjZDLCAweDE2NDUsIDB4OEI2RCwgMHgzMjNDLCAweDhCNkYsIDB4MTY0NywgMHg4QjcwLCAweDE2NDQsCi0gICAgMHg4Qjc0LCAweDE2OEYsIDB4OEI3NywgMHgxNjkwLCAweDhCNzgsIDB4MzMxMiwgMHg4Qjc5LCAweDMzMTEsCi0gICAgMHg4QjdBLCAweDMzMTQsIDB4OEI3QiwgMHgzMzE1LCAweDhCN0QsIDB4MTY5MSwgMHg4QjdFLCAweDMzQjYsCi0gICAgMHg4QjdGLCAweDMzQkIsIDB4OEI4MCwgMHgxNkQ4LCAweDhCODIsIDB4MzNCOCwgMHg4Qjg0LCAweDMzQjcsCi0gICAgMHg4Qjg1LCAweDMzQkEsIDB4OEI4NiwgMHgzM0I5LCAweDhCODgsIDB4MzQ0MCwgMHg4QjhBLCAweDE3MEEsCi0gICAgMHg4QjhCLCAweDM0M0YsIDB4OEI4QywgMHgzNDNELCAweDhCOEUsIDB4MzQzRSwgMHg4QjkyLCAweDE3MkMsCi0gICAgMHg4QjkzLCAweDE3MkIsIDB4OEI5NCwgMHgzNDlDLCAweDhCOTUsIDB4MzQ5RCwgMHg4Qjk2LCAweDE3MkQsCi0gICAgMHg4Qjk4LCAweDM0RTcsIDB4OEI5OSwgMHgzNEU4LCAweDhCOUEsIDB4MTc1NCwgMHg4QjlDLCAweDE3NUEsCi0gICAgMHg4QjlFLCAweDM1MjIsIDB4OEI5RiwgMHgzNTNGLCAweDhDMzcsIDB4MDUwQiwgMHg4QzM5LCAweDIwNkIsCi0gICAgMHg4QzNCLCAweDIwNkMsIDB4OEMzQywgMHgyNTk3LCAweDhDM0QsIDB4MjgwOSwgMHg4QzNFLCAweDJBNTMsCi0gICAgMHg4QzNGLCAweDE0ODEsIDB4OEM0MSwgMHgxNDgwLCAweDhDNDIsIDB4MkZFMCwgMHg4QzQzLCAweDMxMkYsCi0gICAgMHg4QzQ1LCAweDM0NDEsIDB4OEM0NiwgMHgwNTBDLCAweDhDNDcsIDB4MUUwOSwgMHg4QzQ4LCAweDA5QzksCi0gICAgMHg4QzQ5LCAweDBCQTcsIDB4OEM0QSwgMHgyNTk5LCAweDhDNEIsIDB4MjU5OCwgMHg4QzRDLCAweDEyMjMsCi0gICAgMHg4QzRELCAweDJBNTQsIDB4OEM0RSwgMHgxMjI0LCAweDhDNEYsIDB4MkU2QywgMHg4QzUwLCAweDE1MkUsCi0gICAgMHg4QzU0LCAweDE3NjMsIDB4OEM1NSwgMHgwNTBELCAweDhDNTYsIDB4MUE0OCwgMHg4QzU3LCAweDFFMEEsCi0gICAgMHg4QzVBLCAweDBCQTgsIDB4OEM1QywgMHgyMDZELCAweDhDNUQsIDB4MjA2RSwgMHg4QzVGLCAweDIyRjgsCi0gICAgMHg4QzYxLCAweDBENjUsIDB4OEM2MiwgMHgwRjFCLCAweDhDNjQsIDB4MjU5QiwgMHg4QzY1LCAweDI1OUEsCi0gICAgMHg4QzY2LCAweDI1OUMsIDB4OEM2OCwgMHgyODBBLCAweDhDNjksIDB4MjgwQiwgMHg4QzZBLCAweDEwQjQsCi0gICAgMHg4QzZCLCAweDEzNUQsIDB4OEM2QywgMHgxMjI1LCAweDhDNkQsIDB4MTM1RSwgMHg4QzZGLCAweDJFNzAsCi0gICAgMHg4QzcwLCAweDJFNkQsIDB4OEM3MSwgMHgyRTZGLCAweDhDNzIsIDB4MkU2RSwgMHg4QzczLCAweDE0ODIsCi0gICAgMHg4Qzc1LCAweDJGRTEsIDB4OEM3NiwgMHgzMTMxLCAweDhDNzcsIDB4MzEzMCwgMHg4Qzc4LCAweDE4RTcsCi0gICAgMHg4Qzc5LCAweDA5Q0IsIDB4OEM3QSwgMHgwOUNBLCAweDhDN0IsIDB4MUUwQiwgMHg4QzdELCAweDIwNkYsCi0gICAgMHg4QzgwLCAweDIyRkEsIDB4OEM4MSwgMHgyMkY5LCAweDhDODIsIDB4MEQ2NiwgMHg4Qzg0LCAweDI1OUUsCi0gICAgMHg4Qzg1LCAweDI1OUYsIDB4OEM4NiwgMHgyNTlELCAweDhDODksIDB4MEYxRCwgMHg4QzhBLCAweDBGMUMsCi0gICAgMHg4QzhDLCAweDEwQjYsIDB4OEM4RCwgMHgxMEI1LCAweDhDOEYsIDB4MkE1NSwgMHg4QzkwLCAweDJDOTgsCi0gICAgMHg4QzkxLCAweDJDOTYsIDB4OEM5MiwgMHgyQzk3LCAweDhDOTMsIDB4MTM1RiwgMHg4Qzk0LCAweDJFNzIsCi0gICAgMHg4Qzk1LCAweDJFNzEsIDB4OEM5NywgMHgyRkU0LCAweDhDOTgsIDB4MkZFMywgMHg4Qzk5LCAweDJGRTIsCi0gICAgMHg4QzlBLCAweDMxMzIsIDB4OEM5QywgMHgzNTIzLCAweDhDOUQsIDB4MDUwRSwgMHg4QzlFLCAweDA4MEEsCi0gICAgMHg4Q0EwLCAweDA4MEIsIDB4OENBMSwgMHgwOUNDLCAweDhDQTIsIDB4MDlDRCwgMHg4Q0EzLCAweDFFMEQsCi0gICAgMHg4Q0E0LCAweDFFMEMsIDB4OENBNSwgMHgyMDcwLCAweDhDQTcsIDB4MEJBRSwgMHg4Q0E4LCAweDBCQUMsCi0gICAgMHg4Q0E5LCAweDBCQTksIDB4OENBQSwgMHgwQkFELCAweDhDQUIsIDB4MEJBQiwgMHg4Q0FDLCAweDBCQUEsCi0gICAgMHg4Q0FGLCAweDBENjcsIDB4OENCMCwgMHgyMkZELCAweDhDQjIsIDB4MEYyMiwgMHg4Q0IzLCAweDBENjksCi0gICAgMHg4Q0I0LCAweDBENkUsIDB4OENCNSwgMHgyMkZGLCAweDhDQjYsIDB4MEQ3MCwgMHg4Q0I3LCAweDBENkYsCi0gICAgMHg4Q0I4LCAweDBENzIsIDB4OENCOSwgMHgyMkZFLCAweDhDQkEsIDB4MjJGQiwgMHg4Q0JCLCAweDBENkMsCi0gICAgMHg4Q0JDLCAweDBENjgsIDB4OENCRCwgMHgwRDZBLCAweDhDQkUsIDB4MjJGQywgMHg4Q0JGLCAweDBENzEsCi0gICAgMHg4Q0MwLCAweDBENkQsIDB4OENDMSwgMHgwRDZCLCAweDhDQzIsIDB4MEYyNCwgMHg4Q0MzLCAweDBGMjMsCi0gICAgMHg4Q0M0LCAweDBGMjEsIDB4OENDNSwgMHgwRjI1LCAweDhDQzcsIDB4MEYxRiwgMHg4Q0M4LCAweDBGMjAsCi0gICAgMHg4Q0NBLCAweDBGMUUsIDB4OENDQywgMHgyNUEwLCAweDhDQ0YsIDB4MjgwRCwgMHg4Q0QxLCAweDEwQjgsCi0gICAgMHg4Q0QyLCAweDEwQjksIDB4OENEMywgMHgxMEI3LCAweDhDRDUsIDB4MjgwQywgMHg4Q0Q3LCAweDI4MEUsCi0gICAgMHg4Q0Q5LCAweDJBNTgsIDB4OENEQSwgMHgyQTVBLCAweDhDREMsIDB4MTIyRSwgMHg4Q0RELCAweDJBNUIsCi0gICAgMHg4Q0RFLCAweDEyMjcsIDB4OENERiwgMHgyQTU3LCAweDhDRTAsIDB4MTIyNiwgMHg4Q0UxLCAweDEyMzAsCi0gICAgMHg4Q0UyLCAweDEyMkMsIDB4OENFMywgMHgxMjJELCAweDhDRTQsIDB4MTIyOSwgMHg4Q0U1LCAweDJBNTYsCi0gICAgMHg4Q0U2LCAweDEyMjgsIDB4OENFNywgMHgyQTVDLCAweDhDRTgsIDB4MkE1OSwgMHg4Q0VBLCAweDEyMkYsCi0gICAgMHg4Q0VDLCAweDEyMkEsIDB4OENFRCwgMHgxMjJCLCAweDhDRUUsIDB4MkM5QSwgMHg4Q0YwLCAweDJDOUMsCi0gICAgMHg4Q0YxLCAweDJDOUIsIDB4OENGMywgMHgyQzlELCAweDhDRjQsIDB4MTM2MCwgMHg4Q0Y1LCAweDJDOTksCi0gICAgMHg4Q0Y4LCAweDE0ODYsIDB4OENGOSwgMHgyRTczLCAweDhDRkEsIDB4MTQ4MywgMHg4Q0ZCLCAweDE0ODcsCi0gICAgMHg4Q0ZDLCAweDE0ODUsIDB4OENGRCwgMHgxNDg0LCAweDhDRkUsIDB4MkZFNSwgMHg4RDAwLCAweDJGRTgsCi0gICAgMHg4RDAyLCAweDJGRTcsIDB4OEQwNCwgMHgyRkU2LCAweDhEMDUsIDB4MTUyRiwgMHg4RDA2LCAweDMxMzMsCi0gICAgMHg4RDA3LCAweDMxMzQsIDB4OEQwOCwgMHgxNUNELCAweDhEMDksIDB4MzEzNSwgMHg4RDBBLCAweDE1Q0UsCi0gICAgMHg4RDBELCAweDE2NEIsIDB4OEQwRiwgMHgxNjRBLCAweDhEMTAsIDB4MzMxNiwgMHg4RDEzLCAweDE2OTIsCi0gICAgMHg4RDE0LCAweDMzMTcsIDB4OEQxNSwgMHgzM0JDLCAweDhEMTYsIDB4MTZEOSwgMHg4RDE3LCAweDE2REEsCi0gICAgMHg4RDE5LCAweDM0NDIsIDB4OEQxQiwgMHgxNzJGLCAweDhENjQsIDB4MDUwRiwgMHg4RDY2LCAweDBCQjAsCi0gICAgMHg4RDY3LCAweDBCQUYsIDB4OEQ2OCwgMHgyNUExLCAweDhENjksIDB4MjVBMiwgMHg4RDZCLCAweDEwQkEsCi0gICAgMHg4RDZDLCAweDJDOUUsIDB4OEQ2RCwgMHgxMjMxLCAweDhENkUsIDB4MkM5RiwgMHg4RDZGLCAweDJFNzQsCi0gICAgMHg4RDcwLCAweDA1MTAsIDB4OEQ3MiwgMHgxQzA2LCAweDhENzMsIDB4MDgwRCwgMHg4RDc0LCAweDA4MEMsCi0gICAgMHg4RDc2LCAweDFFMEUsIDB4OEQ3NywgMHgwOUNFLCAweDhENzgsIDB4MUUwRiwgMHg4RDc5LCAweDIwNzMsCi0gICAgMHg4RDdCLCAweDIwNzIsIDB4OEQ3RCwgMHgyMDcxLCAweDhEODAsIDB4MjMwMSwgMHg4RDgxLCAweDBENzUsCi0gICAgMHg4RDg0LCAweDIzMDAsIDB4OEQ4NSwgMHgwRDc0LCAweDhEODksIDB4MjMwMiwgMHg4RDhBLCAweDBENzMsCi0gICAgMHg4RDhDLCAweDI1QTQsIDB4OEQ4RCwgMHgyNUE3LCAweDhEOEUsIDB4MjVBNSwgMHg4RDhGLCAweDI1QTYsCi0gICAgMHg4RDkwLCAweDI1QUEsIDB4OEQ5MSwgMHgyNUEzLCAweDhEOTIsIDB4MjVBQiwgMHg4RDkzLCAweDI1QTgsCi0gICAgMHg4RDk0LCAweDI1QTksIDB4OEQ5NSwgMHgxMEJDLCAweDhEOTYsIDB4MjgwRiwgMHg4RDk5LCAweDEwQkIsCi0gICAgMHg4RDlCLCAweDJBNjAsIDB4OEQ5QywgMHgyQTVFLCAweDhEOUYsIDB4MTIzMiwgMHg4REEwLCAweDJBNUQsCi0gICAgMHg4REExLCAweDJBNUYsIDB4OERBMywgMHgxMjMzLCAweDhEQTUsIDB4MkNBMCwgMHg4REE3LCAweDJDQTEsCi0gICAgMHg4REE4LCAweDE0ODgsIDB4OERBQSwgMHgzMTM3LCAweDhEQUIsIDB4MzEzOSwgMHg4REFDLCAweDMxMzYsCi0gICAgMHg4REFELCAweDMxMzgsIDB4OERBRSwgMHgzMjNELCAweDhEQUYsIDB4MzMxOCwgMHg4REIyLCAweDM1MDksCi0gICAgMHg4REIzLCAweDA1MTEsIDB4OERCNCwgMHgwODBFLCAweDhEQjUsIDB4MUUxMCwgMHg4REI2LCAweDFFMTIsCi0gICAgMHg4REI3LCAweDFFMTEsIDB4OERCOSwgMHgyMDc2LCAweDhEQkEsIDB4MEJCMiwgMHg4REJDLCAweDIwNzQsCi0gICAgMHg4REJFLCAweDBCQjEsIDB4OERCRiwgMHgyMDc3LCAweDhEQzEsIDB4MjA3OCwgMHg4REMyLCAweDIwNzUsCi0gICAgMHg4REM1LCAweDIzMEUsIDB4OERDNiwgMHgwRDdELCAweDhEQzcsIDB4MjMwNiwgMHg4REM4LCAweDIzMEMsCi0gICAgMHg4RENCLCAweDBENzgsIDB4OERDQywgMHgwRDdCLCAweDhEQ0QsIDB4MjMwNSwgMHg4RENFLCAweDBENzYsCi0gICAgMHg4RENGLCAweDIzMDksIDB4OEREMCwgMHgyNUIxLCAweDhERDEsIDB4MEQ3QSwgMHg4REQzLCAweDIzMDQsCi0gICAgMHg4REQ1LCAweDIzMEEsIDB4OERENiwgMHgyMzA3LCAweDhERDcsIDB4MjMwRCwgMHg4REQ4LCAweDIzMDMsCi0gICAgMHg4REQ5LCAweDIzMEIsIDB4OEREQSwgMHgwRDc5LCAweDhEREIsIDB4MEQ3QywgMHg4RERDLCAweDIzMDgsCi0gICAgMHg4RERELCAweDBENzcsIDB4OERERiwgMHgwRjI3LCAweDhERTAsIDB4MjVBRCwgMHg4REUxLCAweDBGMjYsCi0gICAgMHg4REUyLCAweDI1QjQsIDB4OERFMywgMHgyNUIzLCAweDhERTQsIDB4MEYyRCwgMHg4REU2LCAweDBGMkUsCi0gICAgMHg4REU3LCAweDI1QjUsIDB4OERFOCwgMHgwRjI4LCAweDhERTksIDB4MjVCMiwgMHg4REVBLCAweDBGMkMsCi0gICAgMHg4REVCLCAweDI1QjcsIDB4OERFQywgMHgyNUFFLCAweDhERUUsIDB4MjVCMCwgMHg4REVGLCAweDBGMjksCi0gICAgMHg4REYwLCAweDI1QUMsIDB4OERGMSwgMHgyNUFGLCAweDhERjIsIDB4MjVCNiwgMHg4REYzLCAweDBGMkEsCi0gICAgMHg4REY0LCAweDI1QjgsIDB4OERGQSwgMHgwRjJCLCAweDhERkMsIDB4MTBCRCwgMHg4REZELCAweDI4MTQsCi0gICAgMHg4REZFLCAweDI4MUEsIDB4OERGRiwgMHgyODEyLCAweDhFMDAsIDB4MjgxQiwgMHg4RTAyLCAweDI4MTEsCi0gICAgMHg4RTAzLCAweDI4MTYsIDB4OEUwNCwgMHgyODFDLCAweDhFMDUsIDB4MjgxOSwgMHg4RTA2LCAweDI4MTgsCi0gICAgMHg4RTA3LCAweDI4MTcsIDB4OEUwOSwgMHgyODEwLCAweDhFMEEsIDB4MjgxNSwgMHg4RTBELCAweDI4MTMsCi0gICAgMHg4RTBGLCAweDEyMzgsIDB4OEUxMCwgMHgxMjM1LCAweDhFMTEsIDB4MkE2OSwgMHg4RTEyLCAweDJBNkUsCi0gICAgMHg4RTEzLCAweDJBNzAsIDB4OEUxNCwgMHgyQTZELCAweDhFMTUsIDB4MkE2NiwgMHg4RTE2LCAweDJBNjgsCi0gICAgMHg4RTE3LCAweDJBNzIsIDB4OEUxOCwgMHgyQTZGLCAweDhFMTksIDB4MkE2QSwgMHg4RTFBLCAweDJBNzMsCi0gICAgMHg4RTFCLCAweDJBNjcsIDB4OEUxQywgMHgyQTcxLCAweDhFMUQsIDB4MTIzNiwgMHg4RTFFLCAweDEyM0MsCi0gICAgMHg4RTFGLCAweDEyM0EsIDB4OEUyMCwgMHgyQTYxLCAweDhFMjEsIDB4MTIzQiwgMHg4RTIyLCAweDEyMzcsCi0gICAgMHg4RTIzLCAweDJBNjIsIDB4OEUyNCwgMHgyQTY0LCAweDhFMjUsIDB4MkE2MywgMHg4RTI2LCAweDJBNkIsCi0gICAgMHg4RTI3LCAweDJBNkMsIDB4OEUyOSwgMHgxMjM5LCAweDhFMkIsIDB4MTIzNCwgMHg4RTJFLCAweDJBNjUsCi0gICAgMHg4RTMwLCAweDJDQUIsIDB4OEUzMSwgMHgxMzYyLCAweDhFMzMsIDB4MkNBMiwgMHg4RTM0LCAweDEzNjMsCi0gICAgMHg4RTM1LCAweDEzNjYsIDB4OEUzNiwgMHgyQ0E3LCAweDhFMzgsIDB4MkNBNCwgMHg4RTM5LCAweDEzNjUsCi0gICAgMHg4RTNDLCAweDJDQTgsIDB4OEUzRCwgMHgyQ0E5LCAweDhFM0UsIDB4MkNBMywgMHg4RTNGLCAweDJDQUMsCi0gICAgMHg4RTQwLCAweDJDQTUsIDB4OEU0MSwgMHgyQ0FBLCAweDhFNDIsIDB4MTM2NCwgMHg4RTQ0LCAweDEzNjEsCi0gICAgMHg4RTQ1LCAweDJDQTYsIDB4OEU0NywgMHgyRTdBLCAweDhFNDgsIDB4MTQ4QiwgMHg4RTQ5LCAweDE0ODksCi0gICAgMHg4RTRBLCAweDE0OEMsIDB4OEU0QiwgMHgxNDhBLCAweDhFNEMsIDB4MkU3OSwgMHg4RTRELCAweDJFNzYsCi0gICAgMHg4RTRFLCAweDJFNzUsIDB4OEU1MCwgMHgyRTc4LCAweDhFNTMsIDB4MkU3NywgMHg4RTU0LCAweDJGRjYsCi0gICAgMHg4RTU1LCAweDE1MzUsIDB4OEU1NiwgMHgyRkVELCAweDhFNTcsIDB4MkZFQywgMHg4RTU5LCAweDE1MzAsCi0gICAgMHg4RTVBLCAweDJGRjIsIDB4OEU1QiwgMHgyRkYxLCAweDhFNUMsIDB4MkZFOSwgMHg4RTVELCAweDJGRjQsCi0gICAgMHg4RTVFLCAweDJGRUUsIDB4OEU1RiwgMHgxNTM0LCAweDhFNjAsIDB4MkZFQiwgMHg4RTYxLCAweDJGRjMsCi0gICAgMHg4RTYyLCAweDJGRUEsIDB4OEU2MywgMHgxNTMxLCAweDhFNjQsIDB4MTUzMywgMHg4RTY1LCAweDJGRUYsCi0gICAgMHg4RTY2LCAweDE1MzIsIDB4OEU2NywgMHgyRkYwLCAweDhFNjksIDB4MkZGNSwgMHg4RTZBLCAweDMxM0QsCi0gICAgMHg4RTZDLCAweDE1RDMsIDB4OEU2RCwgMHgzMTNBLCAweDhFNkYsIDB4MzEzRSwgMHg4RTcyLCAweDE1RDAsCi0gICAgMHg4RTczLCAweDMxM0MsIDB4OEU3NCwgMHgxNUQ1LCAweDhFNzYsIDB4MTVEMiwgMHg4RTc4LCAweDMxM0IsCi0gICAgMHg4RTdBLCAweDE1RDQsIDB4OEU3QiwgMHgzMTNGLCAweDhFN0MsIDB4MTVDRiwgMHg4RTgxLCAweDE2NEQsCi0gICAgMHg4RTgyLCAweDE2NEYsIDB4OEU4NCwgMHgzMjQwLCAweDhFODUsIDB4MTY0RSwgMHg4RTg2LCAweDMyM0UsCi0gICAgMHg4RTg3LCAweDE1RDEsIDB4OEU4OCwgMHgzMjNGLCAweDhFODksIDB4MTY0QywgMHg4RThBLCAweDE2OTMsCi0gICAgMHg4RThCLCAweDE2OTUsIDB4OEU4QywgMHgzMzFBLCAweDhFOEQsIDB4MTY5NCwgMHg4RThFLCAweDMzMTksCi0gICAgMHg4RTkwLCAweDMzQzEsIDB4OEU5MSwgMHgxNkRCLCAweDhFOTIsIDB4MzNDMCwgMHg4RTkzLCAweDE2REMsCi0gICAgMHg4RTk0LCAweDMzQkUsIDB4OEU5NSwgMHgzM0JELCAweDhFOTYsIDB4MzNDMiwgMHg4RTk3LCAweDMzQzMsCi0gICAgMHg4RTk4LCAweDM0NDMsIDB4OEU5QSwgMHgzM0JGLCAweDhFOUQsIDB4MzRBMSwgMHg4RTlFLCAweDM0OUUsCi0gICAgMHg4RTlGLCAweDM0OUYsIDB4OEVBMCwgMHgzNEEwLCAweDhFQTEsIDB4MTc0OSwgMHg4RUEzLCAweDM0RUIsCi0gICAgMHg4RUE0LCAweDM0RUEsIDB4OEVBNSwgMHgzNEU5LCAweDhFQTYsIDB4MzUwQSwgMHg4RUE4LCAweDM1MzcsCi0gICAgMHg4RUE5LCAweDM1MjQsIDB4OEVBQSwgMHgxNzVCLCAweDhFQUIsIDB4MDUxMiwgMHg4RUFDLCAweDA5Q0YsCi0gICAgMHg4RUIyLCAweDBGMkYsIDB4OEVCQSwgMHgxMjNELCAweDhFQkQsIDB4MkNBRCwgMHg4RUMwLCAweDE1MzYsCi0gICAgMHg4RUMyLCAweDMxNDAsIDB4OEVDOSwgMHgzNTI1LCAweDhFQ0EsIDB4MDUxMywgMHg4RUNCLCAweDA2OEQsCi0gICAgMHg4RUNDLCAweDA4MTAsIDB4OEVDRCwgMHgwODBGLCAweDhFQ0YsIDB4MDlEMiwgMHg4RUQxLCAweDFFMTMsCi0gICAgMHg4RUQyLCAweDA5RDAsIDB4OEVEMywgMHgxRTE0LCAweDhFRDQsIDB4MDlEMSwgMHg4RUQ3LCAweDIwN0QsCi0gICAgMHg4RUQ4LCAweDIwNzksIDB4OEVEQiwgMHgwQkIzLCAweDhFREMsIDB4MjA3QywgMHg4RURELCAweDIwN0IsCi0gICAgMHg4RURFLCAweDIwN0EsIDB4OEVERiwgMHgwQkI0LCAweDhFRTAsIDB4MjA3RSwgMHg4RUUxLCAweDIwN0YsCi0gICAgMHg4RUU1LCAweDIzMTUsIDB4OEVFNiwgMHgyMzEzLCAweDhFRTcsIDB4MjMxNywgMHg4RUU4LCAweDIzMTgsCi0gICAgMHg4RUU5LCAweDIzMUUsIDB4OEVFQiwgMHgyMzFBLCAweDhFRUMsIDB4MjMxQywgMHg4RUVFLCAweDIzMTQsCi0gICAgMHg4RUVGLCAweDIzMEYsIDB4OEVGMSwgMHgyMzFCLCAweDhFRjQsIDB4MjMxRCwgMHg4RUY1LCAweDIzMTYsCi0gICAgMHg4RUY2LCAweDIzMTksIDB4OEVGNywgMHgyMzEwLCAweDhFRjgsIDB4MEQ3RiwgMHg4RUY5LCAweDIzMTIsCi0gICAgMHg4RUZBLCAweDIzMTEsIDB4OEVGQiwgMHgwRDdFLCAweDhFRkMsIDB4MEQ4MCwgMHg4RUZFLCAweDBGMzIsCi0gICAgMHg4RUZGLCAweDI1QkEsIDB4OEYwMCwgMHgyNUJDLCAweDhGMDEsIDB4MjVCQiwgMHg4RjAyLCAweDI1QzAsCi0gICAgMHg4RjAzLCAweDBGMzAsIDB4OEYwNSwgMHgyNUJELCAweDhGMDYsIDB4MjVCOSwgMHg4RjA3LCAweDI1QkUsCi0gICAgMHg4RjA4LCAweDI1QkYsIDB4OEYwOSwgMHgwRjMxLCAweDhGMEEsIDB4MEYzMywgMHg4RjBCLCAweDI1QzEsCi0gICAgMHg4RjBELCAweDI4MjAsIDB4OEYwRSwgMHgyODFGLCAweDhGMTAsIDB4MjgxRCwgMHg4RjExLCAweDI4MUUsCi0gICAgMHg4RjEyLCAweDEwQkYsIDB4OEYxMywgMHgxMEMxLCAweDhGMTQsIDB4MTBCRSwgMHg4RjE1LCAweDEwQzAsCi0gICAgMHg4RjE2LCAweDJBN0EsIDB4OEYxNywgMHgyQTdCLCAweDhGMTgsIDB4MkE3NiwgMHg4RjFBLCAweDJBNzcsCi0gICAgMHg4RjFCLCAweDEyM0YsIDB4OEYxQywgMHgxMjQ0LCAweDhGMUQsIDB4MTIzRSwgMHg4RjFFLCAweDEyNDUsCi0gICAgMHg4RjFGLCAweDEyNDAsIDB4OEYyMCwgMHgyQTc4LCAweDhGMjMsIDB4MkE3OSwgMHg4RjI0LCAweDJBNzUsCi0gICAgMHg4RjI1LCAweDEyNDYsIDB4OEYyNiwgMHgxMjQyLCAweDhGMjksIDB4MTI0MSwgMHg4RjJBLCAweDEyNDMsCi0gICAgMHg4RjJDLCAweDJBNzQsIDB4OEYyRSwgMHgyQ0FGLCAweDhGMkYsIDB4MTM2OCwgMHg4RjMyLCAweDJDQjEsCi0gICAgMHg4RjMzLCAweDEzNkEsIDB4OEYzNCwgMHgyQ0I0LCAweDhGMzUsIDB4MkNCMCwgMHg4RjM2LCAweDJDQUUsCi0gICAgMHg4RjM3LCAweDJDQjMsIDB4OEYzOCwgMHgxMzY5LCAweDhGMzksIDB4MkNCMiwgMHg4RjNCLCAweDEzNjcsCi0gICAgMHg4RjNFLCAweDE0OEUsIDB4OEYzRiwgMHgxNDkxLCAweDhGNDAsIDB4MkU3QywgMHg4RjQyLCAweDE0OEYsCi0gICAgMHg4RjQzLCAweDJFN0IsIDB4OEY0NCwgMHgxNDhELCAweDhGNDUsIDB4MTQ5MCwgMHg4RjQ2LCAweDJGRjcsCi0gICAgMHg4RjQ3LCAweDJGRjgsIDB4OEY0OCwgMHgyRkY5LCAweDhGNDksIDB4MTUzNywgMHg4RjRCLCAweDJGRkEsCi0gICAgMHg4RjRELCAweDE1MzgsIDB4OEY0RSwgMHgxNUQ3LCAweDhGNEYsIDB4MzE0MywgMHg4RjUwLCAweDMxNDQsCi0gICAgMHg4RjUxLCAweDMxNDIsIDB4OEY1MiwgMHgzMTQxLCAweDhGNTMsIDB4MzE0NSwgMHg4RjU0LCAweDE1RDYsCi0gICAgMHg4RjU1LCAweDMyNDQsIDB4OEY1NiwgMHgzMjQyLCAweDhGNTcsIDB4MzI0MywgMHg4RjU4LCAweDMyNDUsCi0gICAgMHg4RjU5LCAweDMyNDEsIDB4OEY1QSwgMHgzMjQ2LCAweDhGNUIsIDB4MzMxQywgMHg4RjVELCAweDMzMUQsCi0gICAgMHg4RjVFLCAweDMzMUIsIDB4OEY1RiwgMHgxNjk2LCAweDhGNjAsIDB4MzNDNCwgMHg4RjYxLCAweDE2REQsCi0gICAgMHg4RjYyLCAweDMzQzUsIDB4OEY2MywgMHgzNDQ1LCAweDhGNjQsIDB4MzQ0NCwgMHg4RjlCLCAweDA1MTQsCi0gICAgMHg4RjlDLCAweDBEODEsIDB4OEY5RiwgMHgwRjM0LCAweDhGQTMsIDB4MTBDMiwgMHg4RkE2LCAweDEzNkMsCi0gICAgMHg4RkE4LCAweDEzNkIsIDB4OEZBRCwgMHgxNUQ4LCAweDhGQUUsIDB4MTYyRiwgMHg4RkFGLCAweDE2OTcsCi0gICAgMHg4RkIwLCAweDA1MTUsIDB4OEZCMSwgMHgwOUQzLCAweDhGQjIsIDB4MEYzNSwgMHg4RkI0LCAweDMxNDYsCi0gICAgMHg4RkI1LCAweDAyMzAsIDB4OEZCRiwgMHgxOEU5LCAweDhGQzIsIDB4MDUxNiwgMHg4RkM0LCAweDA1MTksCi0gICAgMHg4RkM1LCAweDA1MTgsIDB4OEZDNiwgMHgwNTE3LCAweDhGQzksIDB4MThFOCwgMHg4RkNCLCAweDFBNEEsCi0gICAgMHg4RkNELCAweDFBNEMsIDB4OEZDRSwgMHgwNjhFLCAweDhGRDEsIDB4MDY5MCwgMHg4RkQyLCAweDFBNDksCi0gICAgMHg4RkQzLCAweDFBNEIsIDB4OEZENCwgMHgwNjhGLCAweDhGRDUsIDB4MUE0RSwgMHg4RkQ2LCAweDFBNEQsCi0gICAgMHg4RkQ3LCAweDFBNEYsIDB4OEZFMCwgMHgxQzBBLCAweDhGRTEsIDB4MUMwOCwgMHg4RkUyLCAweDA4MTMsCi0gICAgMHg4RkUzLCAweDFDMDcsIDB4OEZFNCwgMHgwODE4LCAweDhGRTUsIDB4MDgxNSwgMHg4RkU2LCAweDA4MTIsCi0gICAgMHg4RkU4LCAweDA4MTksIDB4OEZFQSwgMHgwODE0LCAweDhGRUIsIDB4MDgxNywgMHg4RkVELCAweDA4MTYsCi0gICAgMHg4RkVFLCAweDFDMDksIDB4OEZGMCwgMHgwODExLCAweDhGRjQsIDB4MDlEOSwgMHg4RkY1LCAweDFFMTYsCi0gICAgMHg4RkY2LCAweDFFMUMsIDB4OEZGNywgMHgwOUQ2LCAweDhGRjgsIDB4MDlERCwgMHg4RkZBLCAweDA5RDgsCi0gICAgMHg4RkZCLCAweDFFMTksIDB4OEZGQywgMHgxRTFCLCAweDhGRkQsIDB4MDlEQiwgMHg4RkZFLCAweDFFMTUsCi0gICAgMHg4RkZGLCAweDFFMTgsIDB4OTAwMCwgMHgwOUQ3LCAweDkwMDEsIDB4MDlENCwgMHg5MDAyLCAweDFFMTcsCi0gICAgMHg5MDAzLCAweDA5REEsIDB4OTAwNCwgMHgxRTFBLCAweDkwMDUsIDB4MDlEQywgMHg5MDA2LCAweDA5RDUsCi0gICAgMHg5MDBCLCAweDIwODEsIDB4OTAwQywgMHgyMDg0LCAweDkwMEQsIDB4MEJCNiwgMHg5MDBGLCAweDBCQzAsCi0gICAgMHg5MDEwLCAweDBCQkMsIDB4OTAxMSwgMHgyMDgyLCAweDkwMTQsIDB4MEJDNCwgMHg5MDE1LCAweDBCQkQsCi0gICAgMHg5MDE2LCAweDBCQzIsIDB4OTAxNywgMHgwQkI4LCAweDkwMTksIDB4MEJCNSwgMHg5MDFBLCAweDBCQjcsCi0gICAgMHg5MDFCLCAweDBCQzMsIDB4OTAxQywgMHgyMDgzLCAweDkwMUQsIDB4MEJCQiwgMHg5MDFFLCAweDBCQkUsCi0gICAgMHg5MDFGLCAweDBCQkEsIDB4OTAyMCwgMHgwQkJGLCAweDkwMjEsIDB4MjA4NSwgMHg5MDIyLCAweDBCQzEsCi0gICAgMHg5MDIzLCAweDBCQjksIDB4OTAyNCwgMHgyMDgwLCAweDkwMkQsIDB4MjMxRiwgMHg5MDJFLCAweDBEODIsCi0gICAgMHg5MDJGLCAweDIzMjEsIDB4OTAzMSwgMHgwRDg0LCAweDkwMzIsIDB4MEQ4NiwgMHg5MDM0LCAweDIzMjAsCi0gICAgMHg5MDM1LCAweDBEODMsIDB4OTAzNiwgMHgwRDg3LCAweDkwMzgsIDB4MEQ4NSwgMHg5MDNDLCAweDBGM0IsCi0gICAgMHg5MDNELCAweDI1QzYsIDB4OTAzRSwgMHgwRjQzLCAweDkwM0YsIDB4MjVDMywgMHg5MDQxLCAweDBGNDQsCi0gICAgMHg5MDQyLCAweDBGMzksIDB4OTA0NCwgMHgyNUM0LCAweDkwNDcsIDB4MEYzRSwgMHg5MDQ5LCAweDI1QzUsCi0gICAgMHg5MDRBLCAweDBGMzcsIDB4OTA0QiwgMHgwRjM2LCAweDkwNEQsIDB4MEY0MSwgMHg5MDRFLCAweDBGNDAsCi0gICAgMHg5MDRGLCAweDBGM0YsIDB4OTA1MCwgMHgwRjNELCAweDkwNTEsIDB4MEY0MiwgMHg5MDUyLCAweDI1QzIsCi0gICAgMHg5MDUzLCAweDBGMzgsIDB4OTA1NCwgMHgwRjNBLCAweDkwNTUsIDB4MEYzQywgMHg5MDU4LCAweDEwQzQsCi0gICAgMHg5MDU5LCAweDEwQzcsIDB4OTA1QiwgMHgxMENCLCAweDkwNUMsIDB4MTBDNSwgMHg5MDVELCAweDEwQ0EsCi0gICAgMHg5MDVFLCAweDEwQzgsIDB4OTA2MCwgMHgxMEMzLCAweDkwNjIsIDB4MTBDOSwgMHg5MDYzLCAweDEwQzYsCi0gICAgMHg5MDY3LCAweDJBN0YsIDB4OTA2OCwgMHgxMjQ5LCAweDkwNjksIDB4MTI0NywgMHg5MDZCLCAweDJBODAsCi0gICAgMHg5MDZELCAweDEyNEEsIDB4OTA2RSwgMHgxMjQ4LCAweDkwNkYsIDB4MkE3RSwgMHg5MDcwLCAweDJBN0QsCi0gICAgMHg5MDcyLCAweDEzNzAsIDB4OTA3MywgMHgyQTdDLCAweDkwNzQsIDB4MTM2RSwgMHg5MDc1LCAweDEzNkQsCi0gICAgMHg5MDc2LCAweDJDQjUsIDB4OTA3NywgMHgxMjRCLCAweDkwNzgsIDB4MTM2RiwgMHg5MDc5LCAweDJDQjYsCi0gICAgMHg5MDdBLCAweDEzNzIsIDB4OTA3QiwgMHgyQ0I3LCAweDkwN0MsIDB4MTM3MSwgMHg5MDdELCAweDE0OTMsCi0gICAgMHg5MDdFLCAweDJFN0UsIDB4OTA3RiwgMHgxNDkyLCAweDkwODAsIDB4MTQ5NywgMHg5MDgxLCAweDE0OTUsCi0gICAgMHg5MDgyLCAweDE0OTYsIDB4OTA4MywgMHgxNTNBLCAweDkwODQsIDB4MTQ5NCwgMHg5MDg1LCAweDJFN0QsCi0gICAgMHg5MDg2LCAweDJDQjgsIDB4OTA4NywgMHgxNTM5LCAweDkwODgsIDB4MTUzQiwgMHg5MDhBLCAweDE1RDksCi0gICAgMHg5MDhCLCAweDE1REEsIDB4OTA4RCwgMHgzMjQ3LCAweDkwOEYsIDB4MTcwQywgMHg5MDkwLCAweDE3MEIsCi0gICAgMHg5MDkxLCAweDA1MUIsIDB4OTA5NCwgMHgxODFFLCAweDkwOTUsIDB4MDlERSwgMHg5MDk3LCAweDE4MUIsCi0gICAgMHg5MDk4LCAweDE4MUMsIDB4OTA5OSwgMHgxODFBLCAweDkwOUIsIDB4MTgxRCwgMHg5MDlFLCAweDE4RUQsCi0gICAgMHg5MDlGLCAweDE4RUEsIDB4OTBBMCwgMHgxOEVGLCAweDkwQTEsIDB4MThFQiwgMHg5MEEyLCAweDA1MUMsCi0gICAgMHg5MEEzLCAweDA1MUYsIDB4OTBBNSwgMHgxOEVDLCAweDkwQTYsIDB4MDUxRSwgMHg5MEE3LCAweDE4RUUsCi0gICAgMHg5MEFBLCAweDA1MUQsIDB4OTBBRiwgMHgxQTUyLCAweDkwQjAsIDB4MUE1NCwgMHg5MEIxLCAweDA2OTMsCi0gICAgMHg5MEIyLCAweDFBNTAsIDB4OTBCMywgMHgxQTUzLCAweDkwQjQsIDB4MUE1MSwgMHg5MEI1LCAweDA2OTEsCi0gICAgMHg5MEI2LCAweDA2OTQsIDB4OTBCOCwgMHgwNjkyLCAweDkwQkQsIDB4MUMwQywgMHg5MEJFLCAweDFDMTAsCi0gICAgMHg5MEJGLCAweDFDMEQsIDB4OTBDMSwgMHgwODFDLCAweDkwQzMsIDB4MDgxRCwgMHg5MEM1LCAweDFDMEYsCi0gICAgMHg5MEM3LCAweDFDMTEsIDB4OTBDOCwgMHgxQzEzLCAweDkwQ0EsIDB4MDgxQSwgMHg5MENCLCAweDFDMTIsCi0gICAgMHg5MENFLCAweDA4MUIsIDB4OTBENCwgMHgyMDhDLCAweDkwRDUsIDB4MUMwRSwgMHg5MEQ2LCAweDFFMUQsCi0gICAgMHg5MEQ3LCAweDFFMjYsIDB4OTBEOCwgMHgxRTI0LCAweDkwRDksIDB4MUUxRiwgMHg5MERBLCAweDFFMjAsCi0gICAgMHg5MERCLCAweDFFMjUsIDB4OTBEQywgMHgxRTI3LCAweDkwREQsIDB4MDlFMCwgMHg5MERGLCAweDFFMjIsCi0gICAgMHg5MEUwLCAweDFFMUUsIDB4OTBFMSwgMHgwOURGLCAweDkwRTIsIDB4MDlFMSwgMHg5MEUzLCAweDFFMjEsCi0gICAgMHg5MEU0LCAweDFFMjgsIDB4OTBFNSwgMHgxRTIzLCAweDkwRTgsIDB4MEJDNSwgMHg5MEU5LCAweDIwOEYsCi0gICAgMHg5MEVBLCAweDIwODcsIDB4OTBFQiwgMHgyMDhELCAweDkwRUMsIDB4MjA4RSwgMHg5MEVELCAweDBCQzYsCi0gICAgMHg5MEVGLCAweDIwODYsIDB4OTBGMCwgMHgyMDg4LCAweDkwRjEsIDB4MUMwQiwgMHg5MEYyLCAweDIwOEEsCi0gICAgMHg5MEYzLCAweDIwOEIsIDB4OTBGNCwgMHgyMDg5LCAweDkwRjUsIDB4MEQ4OSwgMHg5MEY5LCAweDIzMjgsCi0gICAgMHg5MEZBLCAweDJDQjksIDB4OTBGQiwgMHgyMzI5LCAweDkwRkMsIDB4MjMyNiwgMHg5MEZELCAweDBCQzcsCi0gICAgMHg5MEZFLCAweDBEOEIsIDB4OTBGRiwgMHgyMzI1LCAweDkxMDAsIDB4MjMyQiwgMHg5MTAxLCAweDIzMkEsCi0gICAgMHg5MTAyLCAweDBEODgsIDB4OTEwMywgMHgyMzJFLCAweDkxMDQsIDB4MjMyNCwgMHg5MTA1LCAweDIzMkQsCi0gICAgMHg5MTA2LCAweDIzMjIsIDB4OTEwNywgMHgyMzJDLCAweDkxMDgsIDB4MjMyNywgMHg5MTA5LCAweDBEOEEsCi0gICAgMHg5MTBCLCAweDI1Q0QsIDB4OTEwRCwgMHgyNUM4LCAweDkxMEUsIDB4MjVDRSwgMHg5MTBGLCAweDI1QzksCi0gICAgMHg5MTEwLCAweDI1QzcsIDB4OTExMSwgMHgyNUNBLCAweDkxMTIsIDB4MEY0NSwgMHg5MTE0LCAweDI1Q0MsCi0gICAgMHg5MTE2LCAweDI1Q0IsIDB4OTExNywgMHgwRjQ2LCAweDkxMTgsIDB4MTBDRCwgMHg5MTE5LCAweDEwQ0MsCi0gICAgMHg5MTFBLCAweDI4MjcsIDB4OTExQiwgMHgyODJBLCAweDkxMUMsIDB4MjgyMiwgMHg5MTFELCAweDI4MjYsCi0gICAgMHg5MTFFLCAweDEwQ0UsIDB4OTExRiwgMHgyODI1LCAweDkxMjAsIDB4MjgyMywgMHg5MTIxLCAweDI4MjksCi0gICAgMHg5MTIyLCAweDI4MjQsIDB4OTEyMywgMHgyODIxLCAweDkxMjQsIDB4MjgyOCwgMHg5MTI2LCAweDJBODYsCi0gICAgMHg5MTI3LCAweDEyNEUsIDB4OTEyOCwgMHgyRkZCLCAweDkxMjksIDB4MkE4MywgMHg5MTJBLCAweDJBODQsCi0gICAgMHg5MTJCLCAweDJBODIsIDB4OTEyQywgMHgyMzIzLCAweDkxMkQsIDB4MTI0RCwgMHg5MTJFLCAweDJBODcsCi0gICAgMHg5MTJGLCAweDJBODEsIDB4OTEzMCwgMHgxMjRDLCAweDkxMzEsIDB4MTI0RiwgMHg5MTMyLCAweDJBODUsCi0gICAgMHg5MTMzLCAweDJDQkEsIDB4OTEzNCwgMHgxMzczLCAweDkxMzUsIDB4MkNCQiwgMHg5MTM2LCAweDJDQkMsCi0gICAgMHg5MTM4LCAweDJFN0YsIDB4OTEzOSwgMHgxNDk4LCAweDkxM0EsIDB4MkZGQywgMHg5MTNCLCAweDJGRkQsCi0gICAgMHg5MTNFLCAweDJGRkUsIDB4OTEzRiwgMHgzMTQ4LCAweDkxNDAsIDB4MzE0NywgMHg5MTQxLCAweDMyNDksCi0gICAgMHg5MTQzLCAweDMyNDgsIDB4OTE0NCwgMHgzMzFGLCAweDkxNDUsIDB4MzMyMCwgMHg5MTQ2LCAweDMzMUUsCi0gICAgMHg5MTQ3LCAweDMzQzYsIDB4OTE0OCwgMHgxNkRFLCAweDkxNDksIDB4MDUyMCwgMHg5MTRBLCAweDA4MUYsCi0gICAgMHg5MTRCLCAweDA4MUUsIDB4OTE0QywgMHgwOUU0LCAweDkxNEQsIDB4MDlFMywgMHg5MTRFLCAweDFFMkEsCi0gICAgMHg5MTRGLCAweDFFMkIsIDB4OTE1MCwgMHgxRTI5LCAweDkxNTIsIDB4MDlFMiwgMHg5MTUzLCAweDIwOTMsCi0gICAgMHg5MTU1LCAweDIwOTQsIDB4OTE1NiwgMHgyMDkwLCAweDkxNTcsIDB4MEJDOCwgMHg5MTU4LCAweDIwOTEsCi0gICAgMHg5MTVBLCAweDIwOTIsIDB4OTE1RiwgMHgyMzMxLCAweDkxNjAsIDB4MjMzMywgMHg5MTYxLCAweDIzMkYsCi0gICAgMHg5MTYyLCAweDIzMzIsIDB4OTE2MywgMHgwRDhDLCAweDkxNjQsIDB4MjMzMCwgMHg5MTY1LCAweDBEOEQsCi0gICAgMHg5MTY4LCAweDIzRTIsIDB4OTE2OSwgMHgwRjQ5LCAweDkxNkEsIDB4MEY0OCwgMHg5MTZDLCAweDBGNDcsCi0gICAgMHg5MTZFLCAweDI1Q0YsIDB4OTE2RiwgMHgyNUQwLCAweDkxNzIsIDB4MjgyQywgMHg5MTczLCAweDI4MkUsCi0gICAgMHg5MTc0LCAweDEwRDIsIDB4OTE3NSwgMHgxMENGLCAweDkxNzcsIDB4MTBEMSwgMHg5MTc4LCAweDEwRDAsCi0gICAgMHg5MTc5LCAweDI4MkQsIDB4OTE3QSwgMHgyODJCLCAweDkxODAsIDB4MkE4RSwgMHg5MTgxLCAweDJBOEIsCi0gICAgMHg5MTgyLCAweDJBOEMsIDB4OTE4MywgMHgxMjUzLCAweDkxODQsIDB4MkE4RCwgMHg5MTg1LCAweDJBODgsCi0gICAgMHg5MTg2LCAweDJBODksIDB4OTE4NywgMHgxMjUwLCAweDkxODksIDB4MTI1MSwgMHg5MThBLCAweDJBOEEsCi0gICAgMHg5MThCLCAweDEyNTIsIDB4OTE4RCwgMHgyQ0MwLCAweDkxOEYsIDB4MkNDMSwgMHg5MTkwLCAweDJDQkUsCi0gICAgMHg5MTkxLCAweDJDQkYsIDB4OTE5MiwgMHgxMzc0LCAweDkxOTMsIDB4MkNCRCwgMHg5MTk5LCAweDJFODMsCi0gICAgMHg5MTlBLCAweDJFODAsIDB4OTE5QiwgMHgyRTgyLCAweDkxOUMsIDB4MTQ5QiwgMHg5MTlELCAweDJFODYsCi0gICAgMHg5MTlFLCAweDE0OUEsIDB4OTE5RiwgMHgyRTg0LCAweDkxQTAsIDB4MkU4NywgMHg5MUExLCAweDJFODUsCi0gICAgMHg5MUEyLCAweDJFODEsIDB4OTFBMywgMHgxNDk5LCAweDkxQTUsIDB4MzAwMCwgMHg5MUE3LCAweDMwMDEsCi0gICAgMHg5MUE4LCAweDJGRkYsIDB4OTFBQSwgMHgzMDAzLCAweDkxQUIsIDB4MTUzQywgMHg5MUFDLCAweDE1M0QsCi0gICAgMHg5MUFELCAweDMxNEEsIDB4OTFBRSwgMHgxNURDLCAweDkxQUYsIDB4MzAwMiwgMHg5MUIwLCAweDMxNDksCi0gICAgMHg5MUIxLCAweDE1REIsIDB4OTFCMiwgMHgzMjRDLCAweDkxQjMsIDB4MzI0RCwgMHg5MUI0LCAweDE2NTAsCi0gICAgMHg5MUI1LCAweDMyNEIsIDB4OTFCNywgMHgzMjRBLCAweDkxQjksIDB4MzMyMSwgMHg5MUJBLCAweDE2OTgsCi0gICAgMHg5MUJDLCAweDM0NDYsIDB4OTFCRCwgMHgzNEEzLCAweDkxQkUsIDB4MzRBMiwgMHg5MUMwLCAweDE3MzAsCi0gICAgMHg5MUMxLCAweDE3NEEsIDB4OTFDMiwgMHgzNEE0LCAweDkxQzMsIDB4MzUwQiwgMHg5MUM1LCAweDE3NUMsCi0gICAgMHg5MUM2LCAweDA1MjEsIDB4OTFDNywgMHgwNjk1LCAweDkxQzksIDB4MEY0QSwgMHg5MUNCLCAweDE2NTEsCi0gICAgMHg5MUNDLCAweDA1MjIsIDB4OTFDRCwgMHgwODIwLCAweDkxQ0UsIDB4MEJDOSwgMHg5MUNGLCAweDBEOEUsCi0gICAgMHg5MUQwLCAweDE1M0UsIDB4OTFEMSwgMHgwNjk2LCAweDkxRDMsIDB4MUMxNSwgMHg5MUQ0LCAweDFDMTQsCi0gICAgMHg5MUQ1LCAweDFFMkMsIDB4OTFENywgMHgwOUU3LCAweDkxRDgsIDB4MDlFNSwgMHg5MUQ5LCAweDA5RTksCi0gICAgMHg5MURBLCAweDFFMkUsIDB4OTFEQywgMHgwOUU4LCAweDkxREQsIDB4MDlFNiwgMHg5MUUyLCAweDFFMkQsCi0gICAgMHg5MUUzLCAweDBCQ0MsIDB4OTFFNCwgMHgyMDlBLCAweDkxRTYsIDB4MEJDQiwgMHg5MUU3LCAweDBCQ0QsCi0gICAgMHg5MUU4LCAweDIwOUYsIDB4OTFFOSwgMHgwQkNGLCAweDkxRUEsIDB4MjA5QywgMHg5MUVCLCAweDIwOUQsCi0gICAgMHg5MUVDLCAweDIwOTUsIDB4OTFFRCwgMHgwQkNFLCAweDkxRUUsIDB4MjBBMCwgMHg5MUYxLCAweDIwOTcsCi0gICAgMHg5MUYzLCAweDIwOTgsIDB4OTFGNCwgMHgyMDk2LCAweDkxRjUsIDB4MEJDQSwgMHg5MUY3LCAweDIwOUUsCi0gICAgMHg5MUY4LCAweDIwOTksIDB4OTFGOSwgMHgyMDlCLCAweDkxRkQsIDB4MjMzRiwgMHg5MUZGLCAweDIzM0UsCi0gICAgMHg5MjAwLCAweDIzM0MsIDB4OTIwMSwgMHgyMzM0LCAweDkyMDIsIDB4MjM0MywgMHg5MjAzLCAweDIzMzcsCi0gICAgMHg5MjA0LCAweDIzNDEsIDB4OTIwNSwgMHgyMzQ4LCAweDkyMDYsIDB4MjM0MCwgMHg5MjA3LCAweDBEOTYsCi0gICAgMHg5MjA5LCAweDBEOTIsIDB4OTIwQSwgMHgyMzM1LCAweDkyMEMsIDB4MjMzQiwgMHg5MjBELCAweDBEOTQsCi0gICAgMHg5MjBGLCAweDIzM0EsIDB4OTIxMCwgMHgwRDk1LCAweDkyMTEsIDB4MEQ5NywgMHg5MjEyLCAweDIzM0QsCi0gICAgMHg5MjE0LCAweDBEOEYsIDB4OTIxNSwgMHgwRDkwLCAweDkyMTYsIDB4MjM0OSwgMHg5MjE3LCAweDIzNDcsCi0gICAgMHg5MjE5LCAweDIzNDYsIDB4OTIxQSwgMHgyMzM4LCAweDkyMUMsIDB4MjM0NCwgMHg5MjFFLCAweDBEOTMsCi0gICAgMHg5MjIzLCAweDBEOTEsIDB4OTIyNCwgMHgyMzQ1LCAweDkyMjUsIDB4MjMzNiwgMHg5MjI2LCAweDIzMzksCi0gICAgMHg5MjI3LCAweDIzNDIsIDB4OTIyRCwgMHgyODUxLCAweDkyMkUsIDB4MjVEQSwgMHg5MjMwLCAweDI1RDMsCi0gICAgMHg5MjMxLCAweDI1RTYsIDB4OTIzMiwgMHgyNUVGLCAweDkyMzMsIDB4MjVENiwgMHg5MjM0LCAweDBGNTUsCi0gICAgMHg5MjM2LCAweDI1RTMsIDB4OTIzNywgMHgwRjRCLCAweDkyMzgsIDB4MEY0RCwgMHg5MjM5LCAweDBGNTksCi0gICAgMHg5MjNBLCAweDI1RDQsIDB4OTIzRCwgMHgwRjRFLCAweDkyM0UsIDB4MEY1MCwgMHg5MjNGLCAweDBGNUEsCi0gICAgMHg5MjQwLCAweDBGNEYsIDB4OTI0NSwgMHgwRjU4LCAweDkyNDYsIDB4MjVEQywgMHg5MjQ4LCAweDI1RDEsCi0gICAgMHg5MjQ5LCAweDBGNTYsIDB4OTI0QSwgMHgyNURCLCAweDkyNEIsIDB4MEY1MiwgMHg5MjRDLCAweDI1RUQsCi0gICAgMHg5MjRELCAweDBGNTcsIDB4OTI0RSwgMHgyNUVCLCAweDkyNEYsIDB4MjVERiwgMHg5MjUwLCAweDI1RTksCi0gICAgMHg5MjUxLCAweDBGNTQsIDB4OTI1MiwgMHgyNUQyLCAweDkyNTMsIDB4MjVFQywgMHg5MjU0LCAweDI1RTcsCi0gICAgMHg5MjU2LCAweDI1RUUsIDB4OTI1NywgMHgwRjRDLCAweDkyNUEsIDB4MEY1QiwgMHg5MjVCLCAweDBGNTEsCi0gICAgMHg5MjVFLCAweDI1RDgsIDB4OTI2MCwgMHgyNUUwLCAweDkyNjEsIDB4MjVFNCwgMHg5MjYzLCAweDI1RTgsCi0gICAgMHg5MjY0LCAweDBGNTMsIDB4OTI2NSwgMHgyNUQ3LCAweDkyNjYsIDB4MjVENSwgMHg5MjY3LCAweDI1RTEsCi0gICAgMHg5MjZDLCAweDI1REUsIDB4OTI2RCwgMHgyNURELCAweDkyNkYsIDB4MjVFMiwgMHg5MjcwLCAweDI1RTUsCi0gICAgMHg5MjcyLCAweDI1RUEsIDB4OTI3NiwgMHgyODMxLCAweDkyNzgsIDB4MTBEMywgMHg5Mjc5LCAweDI4M0IsCi0gICAgMHg5MjdBLCAweDI4MzMsIDB4OTI3QiwgMHgxMEQ5LCAweDkyN0MsIDB4MTBERCwgMHg5MjdELCAweDI4NDQsCi0gICAgMHg5MjdFLCAweDI4NEMsIDB4OTI3RiwgMHgyODNELCAweDkyODAsIDB4MTBENSwgMHg5MjgyLCAweDI4NDEsCi0gICAgMHg5MjgzLCAweDI1RDksIDB4OTI4NSwgMHgxMEQ2LCAweDkyODYsIDB4Mjg0OCwgMHg5Mjg3LCAweDI4NEQsCi0gICAgMHg5Mjg4LCAweDI4NDUsIDB4OTI4QSwgMHgyODQ3LCAweDkyOEIsIDB4Mjg1MCwgMHg5MjhDLCAweDI4NDksCi0gICAgMHg5MjhELCAweDI4MzcsIDB4OTI4RSwgMHgyODQwLCAweDkyOTEsIDB4MTBERSwgMHg5MjkzLCAweDEwREEsCi0gICAgMHg5Mjk0LCAweDI4MzUsIDB4OTI5NSwgMHgyODQyLCAweDkyOTYsIDB4MTBEOCwgMHg5Mjk3LCAweDI4M0MsCi0gICAgMHg5Mjk4LCAweDEwRDcsIDB4OTI5OSwgMHgyODRBLCAweDkyOUEsIDB4MjgzOSwgMHg5MjlCLCAweDI4MzIsCi0gICAgMHg5MjlDLCAweDEwREIsIDB4OTI5RCwgMHgyODRGLCAweDkyQTAsIDB4MjgzNCwgMHg5MkExLCAweDI4NDYsCi0gICAgMHg5MkEyLCAweDI4NDMsIDB4OTJBMywgMHgyODNFLCAweDkyQTQsIDB4MjgzMCwgMHg5MkE1LCAweDI4MkYsCi0gICAgMHg5MkE2LCAweDI4MzgsIDB4OTJBNywgMHgyODRCLCAweDkyQTgsIDB4MTBEQywgMHg5MkE5LCAweDI4NEUsCi0gICAgMHg5MkFBLCAweDI4MzYsIDB4OTJBQiwgMHgyODNBLCAweDkyQUMsIDB4MTBENCwgMHg5MkIyLCAweDEyNUYsCi0gICAgMHg5MkIzLCAweDEyNUEsIDB4OTJCNCwgMHgyQUIwLCAweDkyQjUsIDB4MkFBQywgMHg5MkI2LCAweDJBOTQsCi0gICAgMHg5MkI3LCAweDEyNTYsIDB4OTJCOSwgMHgzNkU5LCAweDkyQkIsIDB4MTI1NSwgMHg5MkJDLCAweDEyNUIsCi0gICAgMHg5MkMwLCAweDJBOTIsIDB4OTJDMSwgMHgxMjU5LCAweDkyQzIsIDB4MkE5RSwgMHg5MkMzLCAweDJBOTAsCi0gICAgMHg5MkM0LCAweDJBOTEsIDB4OTJDNSwgMHgxMjU0LCAweDkyQzYsIDB4MkFBRiwgMHg5MkM3LCAweDEyNUQsCi0gICAgMHg5MkM4LCAweDJBQTEsIDB4OTJDOSwgMHgyQUE2LCAweDkyQ0EsIDB4MkFBMCwgMHg5MkNCLCAweDJDRDMsCi0gICAgMHg5MkNDLCAweDJBOUMsIDB4OTJDRCwgMHgyQUE0LCAweDkyQ0UsIDB4MkFBMiwgMHg5MkNGLCAweDJBOTUsCi0gICAgMHg5MkQwLCAweDJBOEYsIDB4OTJEMSwgMHgyQUFBLCAweDkyRDIsIDB4MTI1QywgMHg5MkQzLCAweDJBQUIsCi0gICAgMHg5MkQ1LCAweDJBQTUsIDB4OTJENywgMHgyQTlBLCAweDkyRDgsIDB4MkE5OCwgMHg5MkQ5LCAweDJBOTMsCi0gICAgMHg5MkRELCAweDJBOUIsIDB4OTJERSwgMHgyQUE4LCAweDkyREYsIDB4MkE5NywgMHg5MkUwLCAweDJBQTcsCi0gICAgMHg5MkUxLCAweDJBQUQsIDB4OTJFNCwgMHgxMjU4LCAweDkyRTYsIDB4MkFBMywgMHg5MkU3LCAweDJBQTksCi0gICAgMHg5MkU4LCAweDJBOUYsIDB4OTJFOSwgMHgyQTk5LCAweDkyRUEsIDB4MTI1NywgMHg5MkVFLCAweDI4M0YsCi0gICAgMHg5MkVGLCAweDJBOUQsIDB4OTJGMCwgMHgxMjVFLCAweDkyRjEsIDB4MkE5NiwgMHg5MkY3LCAweDJDRDgsCi0gICAgMHg5MkY4LCAweDEzNzcsIDB4OTJGOSwgMHgyQ0Q3LCAweDkyRkEsIDB4MkNENSwgMHg5MkZCLCAweDJDRTcsCi0gICAgMHg5MkZDLCAweDEzN0IsIDB4OTJGRSwgMHgyQ0U0LCAweDkyRkYsIDB4MkNEQywgMHg5MzAwLCAweDJDRTYsCi0gICAgMHg5MzAxLCAweDJDQ0UsIDB4OTMwMiwgMHgyQ0RBLCAweDkzMDQsIDB4MTM3RCwgMHg5MzA2LCAweDJDQzYsCi0gICAgMHg5MzA4LCAweDJDQzQsIDB4OTMwOSwgMHgyQ0U1LCAweDkzMEIsIDB4MkNFMywgMHg5MzBDLCAweDJDRTIsCi0gICAgMHg5MzBELCAweDJDRDIsIDB4OTMwRSwgMHgyQ0QxLCAweDkzMEYsIDB4MkNDNywgMHg5MzEwLCAweDEzN0YsCi0gICAgMHg5MzEyLCAweDJDQ0QsIDB4OTMxMywgMHgyQ0Q2LCAweDkzMTQsIDB4MkNFMSwgMHg5MzE1LCAweDEzODIsCi0gICAgMHg5MzE2LCAweDJDRTgsIDB4OTMxOCwgMHgxNEEzLCAweDkzMTksIDB4MTM4NCwgMHg5MzFBLCAweDEzN0UsCi0gICAgMHg5MzFCLCAweDJDQ0IsIDB4OTMxRCwgMHgyQ0Q0LCAweDkzMUUsIDB4MkNDMywgMHg5MzFGLCAweDJDQzUsCi0gICAgMHg5MzIwLCAweDEzNzUsIDB4OTMyMSwgMHgxMzgxLCAweDkzMjIsIDB4MTM3QSwgMHg5MzIzLCAweDJDQ0MsCi0gICAgMHg5MzI0LCAweDJDREIsIDB4OTMyNSwgMHgyQUFFLCAweDkzMjYsIDB4MTM4MCwgMHg5MzI3LCAweDJDQzIsCi0gICAgMHg5MzI4LCAweDE0OUUsIDB4OTMyOSwgMHgyQ0RELCAweDkzMkEsIDB4MkNFMCwgMHg5MzJCLCAweDEzN0MsCi0gICAgMHg5MzJELCAweDJDRDAsIDB4OTMyRSwgMHgxMzgzLCAweDkzMkYsIDB4MTM3OSwgMHg5MzMzLCAweDEzNzgsCi0gICAgMHg5MzM0LCAweDJDRDksIDB4OTMzNSwgMHgyQ0RGLCAweDkzMzYsIDB4MTM3NiwgMHg5MzM4LCAweDJDQzksCi0gICAgMHg5MzM5LCAweDJDREUsIDB4OTMzQywgMHgyQ0NBLCAweDkzNDYsIDB4MkNDRiwgMHg5MzQ3LCAweDJFOEQsCi0gICAgMHg5MzQ5LCAweDJFOTIsIDB4OTM0QSwgMHgxNEEwLCAweDkzNEIsIDB4MTRBMiwgMHg5MzRDLCAweDJFOTgsCi0gICAgMHg5MzRELCAweDE0OUMsIDB4OTM0RSwgMHgyRUE2LCAweDkzNEYsIDB4MkU5RSwgMHg5MzUwLCAweDJFOTMsCi0gICAgMHg5MzUxLCAweDJFOTQsIDB4OTM1MiwgMHgyRTlELCAweDkzNTQsIDB4MTRBOSwgMHg5MzU1LCAweDJFOUMsCi0gICAgMHg5MzU2LCAweDJFOEMsIDB4OTM1NywgMHgyRTlCLCAweDkzNTgsIDB4MkU4RiwgMHg5MzU5LCAweDJFQTcsCi0gICAgMHg5MzVBLCAweDE0QTgsIDB4OTM1QiwgMHgxNEE2LCAweDkzNUMsIDB4MkU5MCwgMHg5MzVFLCAweDJFQTMsCi0gICAgMHg5MzYwLCAweDJFOTUsIDB4OTM2MSwgMHgyRUEyLCAweDkzNjMsIDB4MkVBNCwgMHg5MzY0LCAweDJFOEIsCi0gICAgMHg5MzY1LCAweDE0QTEsIDB4OTM2NywgMHgyRUE1LCAweDkzNkEsIDB4MkU5OSwgMHg5MzZDLCAweDE0QTUsCi0gICAgMHg5MzZELCAweDJFOTYsIDB4OTM3MCwgMHgxNEE3LCAweDkzNzEsIDB4MkU5RiwgMHg5Mzc1LCAweDE0OUYsCi0gICAgMHg5Mzc2LCAweDJFOTEsIDB4OTM3NywgMHgyRUEwLCAweDkzNzksIDB4MkU5QSwgMHg5MzdBLCAweDJDQzgsCi0gICAgMHg5MzdCLCAweDJFQTEsIDB4OTM3QywgMHgyRThFLCAweDkzN0UsIDB4MTRBNCwgMHg5MzgwLCAweDMwMTQsCi0gICAgMHg5MzgyLCAweDE0OUQsIDB4OTM4MywgMHgyRTg5LCAweDkzODgsIDB4MzAxMSwgMHg5Mzg5LCAweDMwMEEsCi0gICAgMHg5MzhBLCAweDE1NDAsIDB4OTM4QywgMHgzMDA1LCAweDkzOEQsIDB4MzAxNSwgMHg5MzhFLCAweDMwMEMsCi0gICAgMHg5MzhGLCAweDJFOTcsIDB4OTM5MSwgMHgzMDE3LCAweDkzOTIsIDB4MzAwNiwgMHg5Mzk0LCAweDE1M0YsCi0gICAgMHg5Mzk1LCAweDMwMTAsIDB4OTM5NiwgMHgxNTQxLCAweDkzOTcsIDB4MTU0OSwgMHg5Mzk4LCAweDE1NDcsCi0gICAgMHg5Mzk5LCAweDMwMTIsIDB4OTM5QSwgMHgxNTQ4LCAweDkzOUIsIDB4MzAwOCwgMHg5MzlELCAweDMwMDksCi0gICAgMHg5MzlFLCAweDMwMEUsIDB4OTM5RiwgMHgzMDEzLCAweDkzQTEsIDB4MkU4OCwgMHg5M0EyLCAweDE1NDIsCi0gICAgMHg5M0EzLCAweDMwMUMsIDB4OTNBNCwgMHgzMDE5LCAweDkzQTUsIDB4MzE2MCwgMHg5M0E2LCAweDMwMEYsCi0gICAgMHg5M0E3LCAweDMwMEIsIDB4OTNBOCwgMHgzMDFBLCAweDkzQTksIDB4MzE1NSwgMHg5M0FBLCAweDMwMEQsCi0gICAgMHg5M0FDLCAweDE1NDUsIDB4OTNBRSwgMHgxNTQ0LCAweDkzQUYsIDB4MkU4QSwgMHg5M0IwLCAweDE1NDYsCi0gICAgMHg5M0IxLCAweDMwMTYsIDB4OTNCMiwgMHgzMDE4LCAweDkzQjMsIDB4MTU0MywgMHg5M0I0LCAweDMwMUIsCi0gICAgMHg5M0I1LCAweDMwMDQsIDB4OTNCNywgMHgzMDA3LCAweDkzQzAsIDB4MzE1RSwgMHg5M0MyLCAweDMxNEUsCi0gICAgMHg5M0MzLCAweDE1RTAsIDB4OTNDNCwgMHgzMTVDLCAweDkzQzcsIDB4MzE0QywgMHg5M0M4LCAweDE1RTEsCi0gICAgMHg5M0NBLCAweDMxNTcsIDB4OTNDQywgMHgzMTUzLCAweDkzQ0QsIDB4MTVFNiwgMHg5M0NFLCAweDMxNUQsCi0gICAgMHg5M0NGLCAweDMxNEQsIDB4OTNEMCwgMHgzMTUwLCAweDkzRDEsIDB4MTVERSwgMHg5M0QyLCAweDMxNUYsCi0gICAgMHg5M0Q0LCAweDMxNTgsIDB4OTNENSwgMHgzMTVCLCAweDkzRDYsIDB4MTVFNCwgMHg5M0Q3LCAweDE1RTksCi0gICAgMHg5M0Q4LCAweDE1RTcsIDB4OTNEOSwgMHgzMTU0LCAweDkzREEsIDB4MzE0RiwgMHg5M0RDLCAweDE1RTIsCi0gICAgMHg5M0RELCAweDE1RTMsIDB4OTNERSwgMHgzMTRCLCAweDkzREYsIDB4MTVERiwgMHg5M0UxLCAweDE1REQsCi0gICAgMHg5M0UyLCAweDE1RTUsIDB4OTNFMywgMHgzMTVBLCAweDkzRTQsIDB4MTVFOCwgMHg5M0U2LCAweDMxNTYsCi0gICAgMHg5M0U3LCAweDMxNjEsIDB4OTNFOCwgMHgxNUVBLCAweDkzRUMsIDB4MzE1MiwgMHg5M0VFLCAweDMxNTksCi0gICAgMHg5M0Y1LCAweDMyNUEsIDB4OTNGNiwgMHgzMjY5LCAweDkzRjcsIDB4MzI1QywgMHg5M0Y4LCAweDMyNjMsCi0gICAgMHg5M0Y5LCAweDMxNTEsIDB4OTNGQSwgMHgzMjYxLCAweDkzRkIsIDB4MzI1MCwgMHg5M0ZDLCAweDMyNjcsCi0gICAgMHg5M0ZELCAweDE2NTQsIDB4OTNGRSwgMHgzMjU0LCAweDkzRkYsIDB4MzI2NiwgMHg5NDAwLCAweDMyNUIsCi0gICAgMHg5NDAzLCAweDE2NTMsIDB4OTQwNiwgMHgzMjZCLCAweDk0MDcsIDB4MzI1RCwgMHg5NDA5LCAweDMyNjIsCi0gICAgMHg5NDBBLCAweDMyNjUsIDB4OTQwQiwgMHgzMjRFLCAweDk0MEMsIDB4MzI2OCwgMHg5NDBELCAweDMyNTksCi0gICAgMHg5NDBFLCAweDMyNUUsIDB4OTQwRiwgMHgzMjUyLCAweDk0MTAsIDB4MzI1NiwgMHg5NDExLCAweDMyNkEsCi0gICAgMHg5NDEyLCAweDMyNjAsIDB4OTQxMywgMHgzMjRGLCAweDk0MTQsIDB4MzI1MywgMHg5NDE1LCAweDMyNTUsCi0gICAgMHg5NDE2LCAweDMyNUYsIDB4OTQxOCwgMHgxNjUyLCAweDk0MTksIDB4MzI1OCwgMHg5NDIwLCAweDMyNTEsCi0gICAgMHg5NDI4LCAweDMyNTcsIDB4OTQyOSwgMHgzMzI1LCAweDk0MkEsIDB4MzMyOSwgMHg5NDJCLCAweDE2OUYsCi0gICAgMHg5NDJDLCAweDMzMkIsIDB4OTQyRSwgMHgxNjk5LCAweDk0MzAsIDB4MzMyNywgMHg5NDMxLCAweDMzMkQsCi0gICAgMHg5NDMyLCAweDE2OUUsIDB4OTQzMywgMHgxNjlBLCAweDk0MzUsIDB4MTY5QiwgMHg5NDM2LCAweDMzMjQsCi0gICAgMHg5NDM3LCAweDMzMkEsIDB4OTQzOCwgMHgxNjlELCAweDk0MzksIDB4MzMyOCwgMHg5NDNBLCAweDE2OUMsCi0gICAgMHg5NDNCLCAweDMzMjMsIDB4OTQzQywgMHgzMjY0LCAweDk0M0QsIDB4MzMyNiwgMHg5NDNGLCAweDMzMjIsCi0gICAgMHg5NDQwLCAweDMzMkMsIDB4OTQ0NCwgMHgxNkRGLCAweDk0NDUsIDB4MzNDRCwgMHg5NDQ2LCAweDMzRDAsCi0gICAgMHg5NDQ3LCAweDMzQ0MsIDB4OTQ0OCwgMHgzM0NFLCAweDk0NDksIDB4MzNDRiwgMHg5NDRBLCAweDMzQzksCi0gICAgMHg5NDRCLCAweDMzQ0EsIDB4OTQ0QywgMHgzM0M3LCAweDk0NEYsIDB4MzNDQiwgMHg5NDUwLCAweDMzQzgsCi0gICAgMHg5NDUxLCAweDE2RTAsIDB4OTQ1MiwgMHgxNkUxLCAweDk0NTUsIDB4MzQ0OCwgMHg5NDU3LCAweDM0NEEsCi0gICAgMHg5NDVELCAweDM0NDksIDB4OTQ1RSwgMHgzNDRCLCAweDk0NjAsIDB4MTcwRSwgMHg5NDYyLCAweDM0NDcsCi0gICAgMHg5NDYzLCAweDE3MEQsIDB4OTQ2NCwgMHgxNzBGLCAweDk0NjgsIDB4MzRBNiwgMHg5NDY5LCAweDM0QTcsCi0gICAgMHg5NDZBLCAweDE3MzEsIDB4OTQ2QiwgMHgzNEE1LCAweDk0NkQsIDB4MzRFRCwgMHg5NDZFLCAweDM0RUMsCi0gICAgMHg5NDZGLCAweDM0RUUsIDB4OTQ3MCwgMHgxNzRDLCAweDk0NzEsIDB4MzRFRiwgMHg5NDcyLCAweDE3NEIsCi0gICAgMHg5NDczLCAweDM0RjAsIDB4OTQ3NCwgMHgzNTBDLCAweDk0NzUsIDB4MzUwRiwgMHg5NDc2LCAweDM1MEUsCi0gICAgMHg5NDc3LCAweDE3NTUsIDB4OTQ3OCwgMHgzNTBELCAweDk0N0MsIDB4MTc1RiwgMHg5NDdELCAweDE3NUQsCi0gICAgMHg5NDdFLCAweDE3NUUsIDB4OTQ3RiwgMHgxNzY0LCAweDk0ODAsIDB4MzUzOSwgMHg5NDgxLCAweDM1M0EsCi0gICAgMHg5NDgyLCAweDM1MzgsIDB4OTQ4MywgMHgzNTQwLCAweDk1NzcsIDB4MDY5NywgMHg5NTdBLCAweDIwQTEsCi0gICAgMHg5NTdCLCAweDIzNEEsIDB4OTU3QywgMHgyQUIxLCAweDk1N0QsIDB4MzE2MiwgMHg5NTgwLCAweDA2OTgsCi0gICAgMHg5NTgyLCAweDA4MjEsIDB4OTU4MywgMHgwOUVBLCAweDk1ODYsIDB4MjBBMiwgMHg5NTg4LCAweDIwQTMsCi0gICAgMHg5NTg5LCAweDBCRDAsIDB4OTU4QiwgMHgwRDlBLCAweDk1OEMsIDB4MjM0QywgMHg5NThELCAweDIzNEIsCi0gICAgMHg5NThFLCAweDBEOUUsIDB4OTU4RiwgMHgwRDk5LCAweDk1OTAsIDB4MjM0RCwgMHg5NTkxLCAweDBEOUIsCi0gICAgMHg5NTkyLCAweDBEOUQsIDB4OTU5MywgMHgwRDlDLCAweDk1OTQsIDB4MEQ5OCwgMHg5NTk4LCAweDBGNUMsCi0gICAgMHg5NTlCLCAweDI1RjMsIDB4OTU5QywgMHgyNUYxLCAweDk1OUUsIDB4MjVGMiwgMHg5NTlGLCAweDI1RjAsCi0gICAgMHg5NUExLCAweDEwREYsIDB4OTVBMywgMHgxMEUyLCAweDk1QTQsIDB4MTBFNCwgMHg5NUE1LCAweDEwRTMsCi0gICAgMHg5NUE4LCAweDEwRTAsIDB4OTVBOSwgMHgxMEUxLCAweDk1QUIsIDB4MkFCMywgMHg5NUFDLCAweDJBQjIsCi0gICAgMHg5NUFELCAweDEyNjAsIDB4OTVBRSwgMHgyQUI0LCAweDk1QjAsIDB4MkFCNSwgMHg5NUIxLCAweDEyNjEsCi0gICAgMHg5NUI1LCAweDJDRjAsIDB4OTVCNiwgMHgyQ0VFLCAweDk1QjcsIDB4MkVBRCwgMHg5NUI5LCAweDJDRUMsCi0gICAgMHg5NUJBLCAweDJDRUQsIDB4OTVCQiwgMHgxMzg1LCAweDk1QkMsIDB4MkNFOSwgMHg5NUJELCAweDJDRjEsCi0gICAgMHg5NUJFLCAweDJDRUIsIDB4OTVCRiwgMHgyQ0VGLCAweDk1QzAsIDB4MkVBOSwgMHg5NUMzLCAweDJFQUIsCi0gICAgMHg5NUM1LCAweDJFQUMsIDB4OTVDNiwgMHgxNEFFLCAweDk1QzcsIDB4MkVBOCwgMHg5NUM4LCAweDE0QUQsCi0gICAgMHg5NUM5LCAweDJFQUEsIDB4OTVDQSwgMHgxNEFBLCAweDk1Q0IsIDB4MTRBQiwgMHg5NUNDLCAweDE0QUMsCi0gICAgMHg5NUNELCAweDJDRUEsIDB4OTVEMCwgMHgxNTRDLCAweDk1RDEsIDB4MzAxRiwgMHg5NUQyLCAweDMwMUQsCi0gICAgMHg5NUQzLCAweDMwMUUsIDB4OTVENCwgMHgxNTRBLCAweDk1RDUsIDB4MTU0RCwgMHg5NUQ2LCAweDE1NEIsCi0gICAgMHg5NURBLCAweDMxNjMsIDB4OTVEQiwgMHgzMTY0LCAweDk1REMsIDB4MTVFQiwgMHg5NURFLCAweDMyNkMsCi0gICAgMHg5NURGLCAweDMyNkUsIDB4OTVFMCwgMHgzMjZELCAweDk1RTEsIDB4MTY1NSwgMHg5NUUyLCAweDE2QTAsCi0gICAgMHg5NUUzLCAweDMzMzAsIDB4OTVFNCwgMHgzMzJGLCAweDk1RTUsIDB4MzMyRSwgMHg5NjFDLCAweDA2OTksCi0gICAgMHg5NjFFLCAweDE3QjQsIDB4OTYyMCwgMHgxODIxLCAweDk2MjEsIDB4MDQxNCwgMHg5NjIyLCAweDE4MUYsCi0gICAgMHg5NjIzLCAweDE4MjIsIDB4OTYyNCwgMHgxODIwLCAweDk2MjgsIDB4MThGMSwgMHg5NjJBLCAweDA1MjYsCi0gICAgMHg5NjJDLCAweDA1MjcsIDB4OTYyRCwgMHgxOEYzLCAweDk2MkUsIDB4MDUyNCwgMHg5NjJGLCAweDE4RjIsCi0gICAgMHg5NjMwLCAweDE4RjAsIDB4OTYzMSwgMHgwNTI1LCAweDk2MzIsIDB4MDUyMywgMHg5NjM5LCAweDFBNTUsCi0gICAgMHg5NjNBLCAweDFBNTgsIDB4OTYzQiwgMHgwNjlDLCAweDk2M0MsIDB4MUE1NywgMHg5NjNELCAweDFBNTYsCi0gICAgMHg5NjNGLCAweDA2OUIsIDB4OTY0MCwgMHgwNjlBLCAweDk2NDIsIDB4MDY5RSwgMHg5NjQzLCAweDFBNTksCi0gICAgMHg5NjQ0LCAweDA2OUQsIDB4OTY0QSwgMHgxQzFBLCAweDk2NEIsIDB4MDgyMywgMHg5NjRDLCAweDA4MjQsCi0gICAgMHg5NjRELCAweDA4MjUsIDB4OTY0RSwgMHgxQzFCLCAweDk2NEYsIDB4MUMxNywgMHg5NjUwLCAweDA4MjIsCi0gICAgMHg5NjUxLCAweDFDMTgsIDB4OTY1MywgMHgxQzE5LCAweDk2NTQsIDB4MUMxNiwgMHg5NjU4LCAweDA5RjEsCi0gICAgMHg5NjVCLCAweDA5RUUsIDB4OTY1QywgMHgxRTJGLCAweDk2NUQsIDB4MDlFRiwgMHg5NjVFLCAweDA5RjIsCi0gICAgMHg5NjVGLCAweDFFMzAsIDB4OTY2MSwgMHgwOUVELCAweDk2NjIsIDB4MDlFQiwgMHg5NjYzLCAweDA5RUMsCi0gICAgMHg5NjY0LCAweDA5RjAsIDB4OTY2QSwgMHgwQkQxLCAweDk2NkIsIDB4MjBBNiwgMHg5NjZDLCAweDBCRDksCi0gICAgMHg5NjZELCAweDIwQTUsIDB4OTY2RiwgMHgyMEE4LCAweDk2NzAsIDB4MEJENSwgMHg5NjcxLCAweDIwQTcsCi0gICAgMHg5NjcyLCAweDBEQTYsIDB4OTY3MywgMHgwQkQzLCAweDk2NzQsIDB4MEJENiwgMHg5Njc1LCAweDBCRDIsCi0gICAgMHg5Njc2LCAweDBCRDcsIDB4OTY3NywgMHgwQkQ4LCAweDk2NzgsIDB4MEJENCwgMHg5NjdDLCAweDIwQTQsCi0gICAgMHg5NjdELCAweDBEQTIsIDB4OTY3RSwgMHgyMzRGLCAweDk2ODAsIDB4MjM1MywgMHg5NjgzLCAweDIzNTIsCi0gICAgMHg5Njg0LCAweDBEQTcsIDB4OTY4NSwgMHgwREEzLCAweDk2ODYsIDB4MERBNCwgMHg5Njg3LCAweDIzNEUsCi0gICAgMHg5Njg4LCAweDIzNTAsIDB4OTY4OSwgMHgyMzUxLCAweDk2OEEsIDB4MEQ5RiwgMHg5NjhCLCAweDBEQTEsCi0gICAgMHg5NjhELCAweDBEQTUsIDB4OTY4RSwgMHgwREEwLCAweDk2OTEsIDB4MjVGNiwgMHg5NjkyLCAweDI1RjQsCi0gICAgMHg5NjkzLCAweDI1RjUsIDB4OTY5NCwgMHgwRjVFLCAweDk2OTUsIDB4MEY1RiwgMHg5Njk3LCAweDI1RjcsCi0gICAgMHg5Njk4LCAweDBGNUQsIDB4OTY5OSwgMHgxMEU1LCAweDk2OUIsIDB4MTBFNywgMHg5NjlDLCAweDEwRTYsCi0gICAgMHg5NjlFLCAweDI4NTIsIDB4OTZBMSwgMHgyODUzLCAweDk2QTIsIDB4MkFCNywgMHg5NkE0LCAweDJBQjYsCi0gICAgMHg5NkE3LCAweDEzODYsIDB4OTZBOCwgMHgxMzg3LCAweDk2QTksIDB4MkNGMiwgMHg5NkFBLCAweDEzODgsCi0gICAgMHg5NkFDLCAweDJFQjAsIDB4OTZBRSwgMHgyRUFFLCAweDk2QjAsIDB4MkVBRiwgMHg5NkIxLCAweDE0QUYsCi0gICAgMHg5NkIzLCAweDMwMjAsIDB4OTZCNCwgMHgxNUVDLCAweDk2QjYsIDB4MDIzMSwgMHg5NkI4LCAweDE0QjAsCi0gICAgMHg5NkI5LCAweDA2OUYsIDB4OTZCQiwgMHgwOUYzLCAweDk2QkMsIDB4MUUzMSwgMHg5NkJGLCAweDIwQTksCi0gICAgMHg5NkMwLCAweDBCREEsIDB4OTZDMSwgMHgwREE4LCAweDk2QzIsIDB4MjM1NCwgMHg5NkMzLCAweDIzNTYsCi0gICAgMHg5NkM0LCAweDBEQUEsIDB4OTZDNSwgMHgwREE5LCAweDk2QzYsIDB4MERBQiwgMHg5NkM3LCAweDBEQUMsCi0gICAgMHg5NkM4LCAweDIzNTUsIDB4OTZDOSwgMHgwRjYyLCAweDk2Q0EsIDB4MEY2MywgMHg5NkNCLCAweDBGNjEsCi0gICAgMHg5NkNDLCAweDEwRTgsIDB4OTZDRCwgMHgwRjYwLCAweDk2Q0UsIDB4MjVGOCwgMHg5NkQyLCAweDEwRTksCi0gICAgMHg5NkQzLCAweDJBQjgsIDB4OTZENCwgMHgyQ0YzLCAweDk2RDUsIDB4MTM4OSwgMHg5NkQ2LCAweDE0QjEsCi0gICAgMHg5NkQ3LCAweDMwMjEsIDB4OTZEOCwgMHgzMDI1LCAweDk2RDksIDB4MTU1MCwgMHg5NkRBLCAweDMwMjIsCi0gICAgMHg5NkRCLCAweDE1NTEsIDB4OTZEQywgMHgxNTRGLCAweDk2REQsIDB4MzAyNiwgMHg5NkRFLCAweDE1NTIsCi0gICAgMHg5NkRGLCAweDMwMjQsIDB4OTZFMSwgMHgzMTY1LCAweDk2RTIsIDB4MTU0RSwgMHg5NkUzLCAweDE1RUQsCi0gICAgMHg5NkU1LCAweDM0QTgsIDB4OTZFOCwgMHgwNkEwLCAweDk2RTksIDB4MEJEQywgMHg5NkVBLCAweDBCREIsCi0gICAgMHg5NkVGLCAweDBEQUQsIDB4OTZGMCwgMHgyMzU4LCAweDk2RjEsIDB4MjM1NywgMHg5NkYyLCAweDBEQUUsCi0gICAgMHg5NkY1LCAweDI1RkMsIDB4OTZGNiwgMHgwRjY3LCAweDk2RjcsIDB4MEY2NCwgMHg5NkY4LCAweDI1RkIsCi0gICAgMHg5NkY5LCAweDBGNjYsIDB4OTZGQSwgMHgyNUY5LCAweDk2RkIsIDB4MEY2NSwgMHg5NkZELCAweDI1RkEsCi0gICAgMHg5NkZGLCAweDI4NTQsIDB4OTcwMCwgMHgxMEVBLCAweDk3MDIsIDB4MkFCQiwgMHg5NzA0LCAweDEyNjIsCi0gICAgMHg5NzA1LCAweDJBQjksIDB4OTcwNiwgMHgxMjYzLCAweDk3MDcsIDB4MTI2NCwgMHg5NzA4LCAweDJBQkEsCi0gICAgMHg5NzA5LCAweDEyNjUsIDB4OTcwQiwgMHgyQ0Y0LCAweDk3MEQsIDB4MTM4RCwgMHg5NzBFLCAweDEzOEEsCi0gICAgMHg5NzBGLCAweDEzOEYsIDB4OTcxMCwgMHgyQ0Y2LCAweDk3MTEsIDB4MTM4QiwgMHg5NzEyLCAweDJDRjUsCi0gICAgMHg5NzEzLCAweDEzOEUsIDB4OTcxNiwgMHgxMzhDLCAweDk3MTgsIDB4MkVCMywgMHg5NzE5LCAweDJFQjUsCi0gICAgMHg5NzFDLCAweDE0QjIsIDB4OTcxRCwgMHgyRUI0LCAweDk3MUUsIDB4MTRCMywgMHg5NzFGLCAweDJFQjIsCi0gICAgMHg5NzIwLCAweDJFQjEsIDB4OTcyMiwgMHgzMDI4LCAweDk3MjMsIDB4MzAyNywgMHg5NzI0LCAweDE1NTMsCi0gICAgMHg5NzI1LCAweDMwMjksIDB4OTcyNiwgMHgzMTZBLCAweDk3MjcsIDB4MTVFRiwgMHg5NzI4LCAweDMxNjksCi0gICAgMHg5NzI5LCAweDMxNjYsIDB4OTcyQSwgMHgxNUVFLCAweDk3MkIsIDB4MzE2NywgMHg5NzJDLCAweDMxNjgsCi0gICAgMHg5NzJFLCAweDMyNkYsIDB4OTcyRiwgMHgzMjcwLCAweDk3MzAsIDB4MTY1NiwgMHg5NzMyLCAweDE2QTMsCi0gICAgMHg5NzM1LCAweDMzMzEsIDB4OTczOCwgMHgxNkExLCAweDk3MzksIDB4MTZBMiwgMHg5NzNBLCAweDMzMzIsCi0gICAgMHg5NzNELCAweDE2RTIsIDB4OTczRSwgMHgxNkUzLCAweDk3M0YsIDB4MzNEMSwgMHg5NzQyLCAweDE3MzIsCi0gICAgMHg5NzQzLCAweDM0QUEsIDB4OTc0NCwgMHgxNzM0LCAweDk3NDYsIDB4MzRBOSwgMHg5NzQ3LCAweDM0QUIsCi0gICAgMHg5NzQ4LCAweDE3MzMsIDB4OTc0OSwgMHgzNEYxLCAweDk3NEIsIDB4MzUyNiwgMHg5NzUyLCAweDA2QTEsCi0gICAgMHg5NzU2LCAweDBGNjgsIDB4OTc1OCwgMHgyODU1LCAweDk3NUEsIDB4MkFCQywgMHg5NzVCLCAweDEzOTAsCi0gICAgMHg5NzVDLCAweDEzOTEsIDB4OTc1RSwgMHgwNkEyLCAweDk3NjAsIDB4MTI2NiwgMHg5NzYxLCAweDE1RjAsCi0gICAgMHg5NzYyLCAweDA4MjYsIDB4OTc2NiwgMHgxMzkyLCAweDk3NjgsIDB4MTcxMCwgMHg5NzY5LCAweDA4MjcsCi0gICAgMHg5NzZBLCAweDIwQUEsIDB4OTc2QywgMHgyMzU5LCAweDk3NkUsIDB4MjM1QiwgMHg5NzcwLCAweDIzNUEsCi0gICAgMHg5NzcyLCAweDI2MDAsIDB4OTc3MywgMHgyNUZELCAweDk3NzQsIDB4MEY2OSwgMHg5Nzc2LCAweDBGNkEsCi0gICAgMHg5Nzc3LCAweDI1RkUsIDB4OTc3OCwgMHgyNUZGLCAweDk3N0EsIDB4Mjg1NywgMHg5NzdCLCAweDI4NUMsCi0gICAgMHg5NzdDLCAweDEwRUIsIDB4OTc3RCwgMHgyODU2LCAweDk3N0UsIDB4Mjg1OCwgMHg5NzdGLCAweDI4NUYsCi0gICAgMHg5NzgwLCAweDI4NUEsIDB4OTc4MSwgMHgyODVFLCAweDk3ODIsIDB4Mjg1QiwgMHg5NzgzLCAweDI4NTksCi0gICAgMHg5Nzg0LCAweDI4NUQsIDB4OTc4NSwgMHgxMEVDLCAweDk3ODgsIDB4MkFCRiwgMHg5NzhBLCAweDJBQkQsCi0gICAgMHg5NzhCLCAweDEyNjgsIDB4OTc4RCwgMHgxMjY3LCAweDk3OEUsIDB4MkFCRSwgMHg5NzhGLCAweDEyNjksCi0gICAgMHg5Nzk0LCAweDJDRjksIDB4OTc5NywgMHgyQ0Y4LCAweDk3OTgsIDB4MTM5MywgMHg5Nzk5LCAweDJDRjcsCi0gICAgMHg5NzlBLCAweDJFQjYsIDB4OTc5QywgMHgyRUI4LCAweDk3OUQsIDB4MkVCQSwgMHg5NzlFLCAweDJFQjksCi0gICAgMHg5N0EwLCAweDE0QjQsIDB4OTdBMSwgMHgyRUI3LCAweDk3QTIsIDB4MzAzMCwgMHg5N0EzLCAweDE1NTQsCi0gICAgMHg5N0E0LCAweDMwMkUsIDB4OTdBNSwgMHgzMDMxLCAweDk3QTYsIDB4MTU1NSwgMHg5N0E4LCAweDMwMkMsCi0gICAgMHg5N0FBLCAweDMwMkYsIDB4OTdBQiwgMHgzMDJELCAweDk3QUMsIDB4MzAyQSwgMHg5N0FELCAweDE1NTYsCi0gICAgMHg5N0FFLCAweDMwMkIsIDB4OTdCMywgMHgzMTZCLCAweDk3QjYsIDB4MzE2RCwgMHg5N0I3LCAweDMxNkMsCi0gICAgMHg5N0I5LCAweDMyNzEsIDB4OTdCQiwgMHgzMjcyLCAweDk3QkYsIDB4MzMzMywgMHg5N0MxLCAweDE2RTUsCi0gICAgMHg5N0MzLCAweDE2RTQsIDB4OTdDNCwgMHgzNDRDLCAweDk3QzUsIDB4MzQ0RCwgMHg5N0M2LCAweDE3MzUsCi0gICAgMHg5N0M3LCAweDM0QUMsIDB4OTdDOSwgMHgxNzU2LCAweDk3Q0IsIDB4MDgyOCwgMHg5N0NDLCAweDBEQUYsCi0gICAgMHg5N0NELCAweDI4NjEsIDB4OTdDRSwgMHgyODYwLCAweDk3Q0YsIDB4MkFDMSwgMHg5N0QwLCAweDJBQzAsCi0gICAgMHg5N0QzLCAweDE0QjUsIDB4OTdENCwgMHgyRUJDLCAweDk3RDUsIDB4MkVCQiwgMHg5N0Q2LCAweDMwMzQsCi0gICAgMHg5N0Q3LCAweDMwMzIsIDB4OTdEOCwgMHgzMDM1LCAweDk3RDksIDB4MzAzMywgMHg5N0RDLCAweDE1RjEsCi0gICAgMHg5N0RELCAweDMxNkUsIDB4OTdERSwgMHgzMTZGLCAweDk3REYsIDB4MzE3MCwgMHg5N0UxLCAweDMzMzQsCi0gICAgMHg5N0UzLCAweDMzRDIsIDB4OTdFNSwgMHgzNEFELCAweDk3RUQsIDB4MDgyOSwgMHg5N0YwLCAweDJDRkEsCi0gICAgMHg5N0YxLCAweDJFQkQsIDB4OTdGMywgMHgwODJBLCAweDk3RjYsIDB4MTBFRCwgMHg5N0Y4LCAweDJDRkIsCi0gICAgMHg5N0Y5LCAweDE1NTcsIDB4OTdGQSwgMHgzMDM2LCAweDk3RkIsIDB4MTVGMiwgMHg5N0ZELCAweDMyNzMsCi0gICAgMHg5N0ZFLCAweDMyNzQsIDB4OTdGRiwgMHgxNkE0LCAweDk4MDAsIDB4MzQ0RSwgMHg5ODAxLCAweDA4MkIsCi0gICAgMHg5ODAyLCAweDBCREYsIDB4OTgwMywgMHgwQkUwLCAweDk4MDQsIDB4MjBBQiwgMHg5ODA1LCAweDBEQjAsCi0gICAgMHg5ODA2LCAweDBEQjEsIDB4OTgwNywgMHgyMzVDLCAweDk4MDgsIDB4MERCMiwgMHg5ODBBLCAweDBGNkUsCi0gICAgMHg5ODBDLCAweDBGNzAsIDB4OTgwRCwgMHgyNjAyLCAweDk4MEUsIDB4MjYwMywgMHg5ODBGLCAweDI2MDEsCi0gICAgMHg5ODEwLCAweDBGNkIsIDB4OTgxMSwgMHgwRjZDLCAweDk4MTIsIDB4MEY2RiwgMHg5ODEzLCAweDBGNkQsCi0gICAgMHg5ODE2LCAweDI4NjIsIDB4OTgxNywgMHgxMEVFLCAweDk4MTgsIDB4MTBFRiwgMHg5ODFCLCAweDJBQzgsCi0gICAgMHg5ODFDLCAweDEyNkMsIDB4OTgxRCwgMHgyQUMzLCAweDk4MUUsIDB4MkFDMiwgMHg5ODIwLCAweDJBQzcsCi0gICAgMHg5ODIxLCAweDEyNkEsIDB4OTgyNCwgMHgxMzlBLCAweDk4MjYsIDB4MkFDNCwgMHg5ODI3LCAweDJBQzksCi0gICAgMHg5ODI4LCAweDJBQzYsIDB4OTgyOSwgMHgyQUM1LCAweDk4MkIsIDB4MTI2QiwgMHg5ODJELCAweDEzOTgsCi0gICAgMHg5ODJGLCAweDJDRkQsIDB4OTgzMCwgMHgxMzk0LCAweDk4MzIsIDB4MkNGRSwgMHg5ODM1LCAweDJDRkMsCi0gICAgMHg5ODM3LCAweDEzOTcsIDB4OTgzOCwgMHgxMzk1LCAweDk4MzksIDB4MTM5OSwgMHg5ODNCLCAweDEzOTYsCi0gICAgMHg5ODQxLCAweDJFQkUsIDB4OTg0MywgMHgyRUMzLCAweDk4NDQsIDB4MkVCRiwgMHg5ODQ1LCAweDJFQzIsCi0gICAgMHg5ODQ2LCAweDE0QjYsIDB4OTg0OCwgMHgyREYyLCAweDk4NDksIDB4MkVDMSwgMHg5ODRBLCAweDJFQzAsCi0gICAgMHg5ODRDLCAweDE1NUEsIDB4OTg0RCwgMHgxNTU4LCAweDk4NEUsIDB4MTU1QiwgMHg5ODRGLCAweDE1NTksCi0gICAgMHg5ODUwLCAweDMwMzcsIDB4OTg1MSwgMHgzMDM4LCAweDk4NTIsIDB4MzAzOSwgMHg5ODUzLCAweDE1NUMsCi0gICAgMHg5ODU3LCAweDMxNzQsIDB4OTg1OCwgMHgxNUY0LCAweDk4NTksIDB4MzE3MiwgMHg5ODVCLCAweDE1RjUsCi0gICAgMHg5ODVDLCAweDMxNzEsIDB4OTg1RCwgMHgzMTczLCAweDk4NUUsIDB4MTVGMywgMHg5ODVGLCAweDMyNzgsCi0gICAgMHg5ODYwLCAweDMyNzUsIDB4OTg2MiwgMHgzMjc2LCAweDk4NjMsIDB4MzI3NywgMHg5ODY0LCAweDMzMzUsCi0gICAgMHg5ODY1LCAweDE2QTYsIDB4OTg2NywgMHgxNkE1LCAweDk4NjksIDB4MzNENCwgMHg5ODZBLCAweDMzRDMsCi0gICAgMHg5ODZCLCAweDE2RTYsIDB4OTg2RiwgMHgxNzExLCAweDk4NzAsIDB4MTczNiwgMHg5ODcxLCAweDE3NEQsCi0gICAgMHg5ODcyLCAweDM0RjIsIDB4OTg3MywgMHgzNTI3LCAweDk4NzQsIDB4MzUyOCwgMHg5OEE4LCAweDA4MkMsCi0gICAgMHg5OEE5LCAweDIzNUQsIDB4OThBQywgMHgyNjA0LCAweDk4QUQsIDB4Mjg2MywgMHg5OEFFLCAweDI4NjQsCi0gICAgMHg5OEFGLCAweDEwRjAsIDB4OThCMSwgMHgxMEYxLCAweDk4QjIsIDB4MkFDQSwgMHg5OEIzLCAweDEyNkQsCi0gICAgMHg5OEI2LCAweDE0QjcsIDB4OThCOCwgMHgzMDNBLCAweDk4QkEsIDB4MTU1RCwgMHg5OEJCLCAweDMxNzcsCi0gICAgMHg5OEJDLCAweDE1RjYsIDB4OThCRCwgMHgzMTc2LCAweDk4QkUsIDB4MzE3OCwgMHg5OEJGLCAweDMxNzUsCi0gICAgMHg5OEMwLCAweDMzMzgsIDB4OThDMSwgMHgzMjc5LCAweDk4QzIsIDB4MzI3QSwgMHg5OEM0LCAweDE2NTcsCi0gICAgMHg5OEM2LCAweDMzMzcsIDB4OThDOSwgMHgzMzM2LCAweDk4Q0IsIDB4MzNENSwgMHg5OENDLCAweDM1MjksCi0gICAgMHg5OERCLCAweDA4MkQsIDB4OThERiwgMHgwODJFLCAweDk4RTIsIDB4MDlGNCwgMHg5OEUzLCAweDFFMzIsCi0gICAgMHg5OEU1LCAweDIwQUMsIDB4OThFNywgMHgwREIzLCAweDk4RTksIDB4MERCNiwgMHg5OEVBLCAweDBEQjQsCi0gICAgMHg5OEVCLCAweDIzNUUsIDB4OThFRCwgMHgwREI4LCAweDk4RUYsIDB4MERCNSwgMHg5OEYyLCAweDBEQjcsCi0gICAgMHg5OEY0LCAweDBGNzIsIDB4OThGNiwgMHgyNjA1LCAweDk4RjksIDB4MjYwNiwgMHg5OEZBLCAweDJBQ0MsCi0gICAgMHg5OEZDLCAweDBGNzEsIDB4OThGRCwgMHgwRjczLCAweDk4RkUsIDB4MEY3NCwgMHg5OTAwLCAweDI4NjYsCi0gICAgMHg5OTAyLCAweDI4NjUsIDB4OTkwMywgMHgxMEYyLCAweDk5MDUsIDB4MTBGMywgMHg5OTA3LCAweDI4NjcsCi0gICAgMHg5OTA4LCAweDJBQ0IsIDB4OTkwOSwgMHgxMEY1LCAweDk5MEEsIDB4MTI2RSwgMHg5OTBDLCAweDEwRjQsCi0gICAgMHg5OTEwLCAweDEzOUIsIDB4OTkxMSwgMHgyQUNELCAweDk5MTIsIDB4MTI3MCwgMHg5OTEzLCAweDEyNkYsCi0gICAgMHg5OTE0LCAweDJBQ0UsIDB4OTkxNSwgMHgyQUQxLCAweDk5MTYsIDB4MkFDRiwgMHg5OTE3LCAweDJBRDAsCi0gICAgMHg5OTE4LCAweDEyNzEsIDB4OTkxQSwgMHgxM0EwLCAweDk5MUIsIDB4MTM5RSwgMHg5OTFFLCAweDEzOUQsCi0gICAgMHg5OTFGLCAweDJEMDAsIDB4OTkyMSwgMHgxMzlGLCAweDk5MjQsIDB4MkNGRiwgMHg5OTI1LCAweDJFQzQsCi0gICAgMHg5OTI3LCAweDJEMDEsIDB4OTkyOCwgMHgxMzlDLCAweDk5MjksIDB4MkQwMiwgMHg5OTJBLCAweDJFQzcsCi0gICAgMHg5OTJCLCAweDJFQzUsIDB4OTkyQywgMHgyRUM2LCAweDk5MkQsIDB4MkVDQiwgMHg5OTJFLCAweDE1NjEsCi0gICAgMHg5OTJGLCAweDJFQ0EsIDB4OTkzMCwgMHgyRUNELCAweDk5MzEsIDB4MkVDQywgMHg5OTMyLCAweDJFQzksCi0gICAgMHg5OTMzLCAweDJFQzgsIDB4OTkzNSwgMHgxNEI4LCAweDk5M0EsIDB4MzAzRCwgMHg5OTNDLCAweDMwM0MsCi0gICAgMHg5OTNELCAweDE1NjAsIDB4OTkzRSwgMHgxNTVFLCAweDk5M0YsIDB4MTU1RiwgMHg5OTQxLCAweDMwM0IsCi0gICAgMHg5OTQzLCAweDMxN0IsIDB4OTk0NSwgMHgxNUY3LCAweDk5NDcsIDB4MzE3QSwgMHg5OTQ4LCAweDMxNzksCi0gICAgMHg5OTQ5LCAweDE1RjgsIDB4OTk0QiwgMHgzMjdGLCAweDk5NEMsIDB4MzI3RSwgMHg5OTRFLCAweDMyN0MsCi0gICAgMHg5OTUwLCAweDMyN0IsIDB4OTk1MSwgMHgxNjU5LCAweDk5NTIsIDB4MTY1OCwgMHg5OTUzLCAweDMyODAsCi0gICAgMHg5OTU0LCAweDMzRDYsIDB4OTk1NSwgMHgxNkU3LCAweDk5NTYsIDB4MzMzQSwgMHg5OTU3LCAweDE2QTcsCi0gICAgMHg5OTU4LCAweDMzMzksIDB4OTk1OSwgMHgzMjdELCAweDk5NUIsIDB4MzNENywgMHg5OTVDLCAweDE3MTIsCi0gICAgMHg5OTVFLCAweDE3NEUsIDB4OTk1RiwgMHgzNEYzLCAweDk5NjEsIDB4MzUyQSwgMHg5OTk2LCAweDA4MkYsCi0gICAgMHg5OTk3LCAweDIwQUQsIDB4OTk5OCwgMHgyRUNFLCAweDk5OTksIDB4MDgzMCwgMHg5OTlDLCAweDI4NjksCi0gICAgMHg5OTlELCAweDI4NjgsIDB4OTk5RSwgMHgyRDAzLCAweDk5QTEsIDB4MkVEMCwgMHg5OUEzLCAweDJFQ0YsCi0gICAgMHg5OUE1LCAweDE1NjIsIDB4OTlBNiwgMHgzMTdDLCAweDk5QTcsIDB4MzE3RCwgMHg5OUE4LCAweDE2NUEsCi0gICAgMHg5OUFCLCAweDM1MkIsIDB4OTlBQywgMHgwOUY1LCAweDk5QUQsIDB4MERCQSwgMHg5OUFFLCAweDBEQjksCi0gICAgMHg5OUFGLCAweDI2MDcsIDB4OTlCMCwgMHgyNjA5LCAweDk5QjEsIDB4MEY3NiwgMHg5OUIyLCAweDI2MDgsCi0gICAgMHg5OUIzLCAweDBGNzUsIDB4OTlCNCwgMHgwRjc3LCAweDk5QjUsIDB4MjYwQSwgMHg5OUI5LCAweDI4NkIsCi0gICAgMHg5OUJBLCAweDI4NkQsIDB4OTlCQiwgMHgyODZDLCAweDk5QkQsIDB4Mjg2RiwgMHg5OUMxLCAweDEwRjYsCi0gICAgMHg5OUMyLCAweDI4NkUsIDB4OTlDMywgMHgyODZBLCAweDk5QzcsIDB4Mjg3MCwgMHg5OUM5LCAweDJBRDgsCi0gICAgMHg5OUNCLCAweDJBREIsIDB4OTlDQywgMHgyQURELCAweDk5Q0QsIDB4MkFEMywgMHg5OUNFLCAweDJBRDcsCi0gICAgMHg5OUNGLCAweDJBRDQsIDB4OTlEMCwgMHgxMjczLCAweDk5RDEsIDB4MTI3NiwgMHg5OUQyLCAweDEyNzgsCi0gICAgMHg5OUQzLCAweDJBRDUsIDB4OTlENCwgMHgyQUQ2LCAweDk5RDUsIDB4MTI3NywgMHg5OUQ2LCAweDJBRDksCi0gICAgMHg5OUQ3LCAweDJBREMsIDB4OTlEOCwgMHgyQURBLCAweDk5RDksIDB4MTI3OSwgMHg5OURCLCAweDEyNzUsCi0gICAgMHg5OURDLCAweDJBRDIsIDB4OTlERCwgMHgxMjcyLCAweDk5REYsIDB4MTI3NCwgMHg5OUUyLCAweDEzQTIsCi0gICAgMHg5OUUzLCAweDJEMDksIDB4OTlFNCwgMHgyRDA3LCAweDk5RTUsIDB4MkQwNiwgMHg5OUU3LCAweDJEMEMsCi0gICAgMHg5OUU5LCAweDJEMEIsIDB4OTlFQSwgMHgyRDBBLCAweDk5RUMsIDB4MkQwNSwgMHg5OUVELCAweDEzQTEsCi0gICAgMHg5OUVFLCAweDJEMDQsIDB4OTlGMCwgMHgyRDA4LCAweDk5RjEsIDB4MTNBMywgMHg5OUY0LCAweDJFRDMsCi0gICAgMHg5OUY2LCAweDJFRDcsIDB4OTlGNywgMHgyRUQ0LCAweDk5RjgsIDB4MkVENiwgMHg5OUY5LCAweDJFRDUsCi0gICAgMHg5OUZBLCAweDJFRDIsIDB4OTlGQiwgMHgyRUQ4LCAweDk5RkMsIDB4MkVEQiwgMHg5OUZELCAweDJFRDksCi0gICAgMHg5OUZFLCAweDJFREEsIDB4OTlGRiwgMHgxNEJBLCAweDlBMDEsIDB4MTRCOSwgMHg5QTAyLCAweDJFRDEsCi0gICAgMHg5QTAzLCAweDJFREMsIDB4OUEwNCwgMHgzMDQyLCAweDlBMDUsIDB4MzA0NSwgMHg5QTA2LCAweDMwNDcsCi0gICAgMHg5QTA3LCAweDMwNDYsIDB4OUEwOSwgMHgzMDQwLCAweDlBMEEsIDB4MzA0NCwgMHg5QTBCLCAweDMwM0YsCi0gICAgMHg5QTBELCAweDMwNDEsIDB4OUEwRSwgMHgxNTYzLCAweDlBMEYsIDB4MzAzRSwgMHg5QTExLCAweDMwNDMsCi0gICAgMHg5QTE0LCAweDMxOEEsIDB4OUExNSwgMHgzMTdGLCAweDlBMTYsIDB4MTVGOSwgMHg5QTE5LCAweDE1RkEsCi0gICAgMHg5QTFBLCAweDMxN0UsIDB4OUExQiwgMHgzMTgzLCAweDlBMUMsIDB4MzE4OSwgMHg5QTFELCAweDMxODEsCi0gICAgMHg5QTFFLCAweDMxODgsIDB4OUEyMCwgMHgzMTg1LCAweDlBMjIsIDB4MzE4NCwgMHg5QTIzLCAweDMxODcsCi0gICAgMHg5QTI0LCAweDMxODIsIDB4OUEyNSwgMHgzMTgwLCAweDlBMjcsIDB4MzE4NiwgMHg5QTI5LCAweDMyODcsCi0gICAgMHg5QTJBLCAweDMyODUsIDB4OUEyQiwgMHgxNjVCLCAweDlBMkMsIDB4MzI4NCwgMHg5QTJELCAweDMyOEEsCi0gICAgMHg5QTJFLCAweDMyODgsIDB4OUEzMCwgMHgxNjVDLCAweDlBMzEsIDB4MzI4MywgMHg5QTMyLCAweDMyODEsCi0gICAgMHg5QTM0LCAweDMyODIsIDB4OUEzNSwgMHgxNjVFLCAweDlBMzYsIDB4MzI4NiwgMHg5QTM3LCAweDE2NUQsCi0gICAgMHg5QTM4LCAweDMyODksIDB4OUEzOSwgMHgzMzNCLCAweDlBM0EsIDB4MzM0MSwgMHg5QTNELCAweDMzM0MsCi0gICAgMHg5QTNFLCAweDE2QUIsIDB4OUEzRiwgMHgzMzQyLCAweDlBNDAsIDB4MTZBQSwgMHg5QTQxLCAweDMzNDAsCi0gICAgMHg5QTQyLCAweDMzM0YsIDB4OUE0MywgMHgxNkE5LCAweDlBNDQsIDB4MzMzRSwgMHg5QTQ1LCAweDE2QTgsCi0gICAgMHg5QTQ2LCAweDMzM0QsIDB4OUE0OCwgMHgzM0RELCAweDlBNDksIDB4MzNERiwgMHg5QTRBLCAweDMzREUsCi0gICAgMHg5QTRDLCAweDMzREIsIDB4OUE0RCwgMHgxNkU5LCAweDlBNEUsIDB4MzNEOCwgMHg5QTRGLCAweDMzREMsCi0gICAgMHg5QTUwLCAweDMzRTEsIDB4OUE1MiwgMHgzM0UwLCAweDlBNTMsIDB4MzNEOSwgMHg5QTU0LCAweDMzREEsCi0gICAgMHg5QTU1LCAweDE2RTgsIDB4OUE1NiwgMHgzNDRGLCAweDlBNTcsIDB4MTcxNSwgMHg5QTU5LCAweDM0NTAsCi0gICAgMHg5QTVBLCAweDE3MTMsIDB4OUE1QiwgMHgxNzE0LCAweDlBNUUsIDB4MzRBRSwgMHg5QTVGLCAweDE3MzcsCi0gICAgMHg5QTYwLCAweDM1MTAsIDB4OUE2MiwgMHgxNzU3LCAweDlBNjQsIDB4MzUyQywgMHg5QTY1LCAweDE3NTgsCi0gICAgMHg5QTY2LCAweDM1MkQsIDB4OUE2NywgMHgzNTJFLCAweDlBNjgsIDB4MzUzQywgMHg5QTY5LCAweDM1M0IsCi0gICAgMHg5QTZBLCAweDE3NjcsIDB4OUE2QiwgMHgzNTQ0LCAweDlBQTgsIDB4MDlGNiwgMHg5QUFCLCAweDI2MEMsCi0gICAgMHg5QUFELCAweDI2MEIsIDB4OUFBRiwgMHgxMEY3LCAweDlBQjAsIDB4MTBGOCwgMHg5QUIxLCAweDI4NzEsCi0gICAgMHg5QUIzLCAweDJBREUsIDB4OUFCNCwgMHgyRDBGLCAweDlBQjcsIDB4MTI3QSwgMHg5QUI4LCAweDEzQTQsCi0gICAgMHg5QUI5LCAweDJEMEQsIDB4OUFCQiwgMHgyRDEwLCAweDlBQkMsIDB4MTNBNSwgMHg5QUJFLCAweDJFREQsCi0gICAgMHg5QUJGLCAweDJEMEUsIDB4OUFDMCwgMHgzMDQ4LCAweDlBQzEsIDB4MTU2NCwgMHg5QUMyLCAweDMxOEIsCi0gICAgMHg5QUM2LCAweDMyOEQsIDB4OUFDNywgMHgzMjhCLCAweDlBQ0EsIDB4MzI4QywgMHg5QUNELCAweDMzNDMsCi0gICAgMHg5QUNGLCAweDE2QUMsIDB4OUFEMCwgMHgzM0UyLCAweDlBRDEsIDB4MTcxOCwgMHg5QUQyLCAweDE2RUEsCi0gICAgMHg5QUQzLCAweDE3MTYsIDB4OUFENCwgMHgxNzE3LCAweDlBRDUsIDB4MzRBRiwgMHg5QUQ2LCAweDE3NEYsCi0gICAgMHg5QUQ4LCAweDA5RjcsIDB4OUFEQywgMHgzMDQ5LCAweDlBREYsIDB4MUUzMywgMHg5QUUxLCAweDBGNzgsCi0gICAgMHg5QUUzLCAweDI4NzIsIDB4OUFFNiwgMHgxMEY5LCAweDlBRTcsIDB4Mjg3MywgMHg5QUVCLCAweDJBRTAsCi0gICAgMHg5QUVDLCAweDJBREYsIDB4OUFFRCwgMHgxM0E3LCAweDlBRUUsIDB4MTI3QiwgMHg5QUVGLCAweDEyN0MsCi0gICAgMHg5QUYxLCAweDJBRTMsIDB4OUFGMiwgMHgyQUUyLCAweDlBRjMsIDB4MkFFMSwgMHg5QUY2LCAweDJEMTEsCi0gICAgMHg5QUY3LCAweDJEMTQsIDB4OUFGOSwgMHgyRDEzLCAweDlBRkEsIDB4MkQxMiwgMHg5QUZCLCAweDEzQTYsCi0gICAgMHg5QUZDLCAweDJFRTEsIDB4OUFGRCwgMHgyRURGLCAweDlBRkUsIDB4MkVERSwgMHg5QjAxLCAweDJFRTAsCi0gICAgMHg5QjAzLCAweDE1NjUsIDB4OUIwNCwgMHgzMDRCLCAweDlCMDUsIDB4MzA0QywgMHg5QjA2LCAweDE1NjYsCi0gICAgMHg5QjA4LCAweDMwNEEsIDB4OUIwQSwgMHgzMThELCAweDlCMEIsIDB4MzE4QywgMHg5QjBDLCAweDMxOEYsCi0gICAgMHg5QjBELCAweDE1RkIsIDB4OUIwRSwgMHgzMThFLCAweDlCMTAsIDB4MzI4RSwgMHg5QjExLCAweDMyOTAsCi0gICAgMHg5QjEyLCAweDMyOEYsIDB4OUIxNSwgMHgzMzQ0LCAweDlCMTYsIDB4MzM0NywgMHg5QjE3LCAweDMzNDUsCi0gICAgMHg5QjE4LCAweDMzNDYsIDB4OUIxOSwgMHgzM0UzLCAweDlCMUEsIDB4MTZFQiwgMHg5QjFFLCAweDM0NTEsCi0gICAgMHg5QjFGLCAweDM0NTIsIDB4OUIyMCwgMHgzNDUzLCAweDlCMjIsIDB4MTczOCwgMHg5QjIzLCAweDE3NTAsCi0gICAgMHg5QjI0LCAweDM1MkYsIDB4OUIyNSwgMHgwOUY4LCAweDlCMjcsIDB4MTI3RCwgMHg5QjI4LCAweDEzQTgsCi0gICAgMHg5QjI5LCAweDMwNEQsIDB4OUIyQiwgMHgzM0U0LCAweDlCMkUsIDB4MzUxMSwgMHg5QjJGLCAweDFFMzQsCi0gICAgMHg5QjMxLCAweDE3NjgsIDB4OUIzMiwgMHgwOUY5LCAweDlCMzMsIDB4MkQxNSwgMHg5QjM1LCAweDMwNEUsCi0gICAgMHg5QjM3LCAweDMxOTAsIDB4OUIzQSwgMHgzMzQ4LCAweDlCM0IsIDB4MzNFNSwgMHg5QjNDLCAweDA5RkEsCi0gICAgMHg5QjNFLCAweDI4NzQsIDB4OUIzRiwgMHgyODc1LCAweDlCNDEsIDB4MTBGQSwgMHg5QjQyLCAweDEwRkIsCi0gICAgMHg5QjQzLCAweDJBRTUsIDB4OUI0NCwgMHgxMjdGLCAweDlCNDUsIDB4MTI3RSwgMHg5QjQ2LCAweDJBRTQsCi0gICAgMHg5QjQ4LCAweDJFRTIsIDB4OUI0QSwgMHgzMDRGLCAweDlCNEIsIDB4MzA1MSwgMHg5QjRDLCAweDMwNTAsCi0gICAgMHg5QjRELCAweDE1NjksIDB4OUI0RSwgMHgxNTY4LCAweDlCNEYsIDB4MTU2NywgMHg5QjUxLCAweDE2QUUsCi0gICAgMHg5QjUyLCAweDMzNDksIDB4OUI1NCwgMHgxNkFELCAweDlCNTUsIDB4MzNFNywgMHg5QjU2LCAweDMzRTYsCi0gICAgMHg5QjU4LCAweDE3MzksIDB4OUI1OSwgMHgzNEIwLCAweDlCNUEsIDB4MEJFMSwgMHg5QjVCLCAweDI2MEQsCi0gICAgMHg5QjVGLCAweDI4NzgsIDB4OUI2MCwgMHgyODc2LCAweDlCNjEsIDB4Mjg3NywgMHg5QjY0LCAweDJBRUUsCi0gICAgMHg5QjY2LCAweDJBRTksIDB4OUI2NywgMHgyQUU2LCAweDlCNjgsIDB4MkFFRCwgMHg5QjZDLCAweDJBRUYsCi0gICAgMHg5QjZGLCAweDEyODEsIDB4OUI3MCwgMHgyQUVDLCAweDlCNzEsIDB4MkFFOCwgMHg5Qjc0LCAweDJBRTcsCi0gICAgMHg5Qjc1LCAweDJBRUIsIDB4OUI3NiwgMHgyQUVBLCAweDlCNzcsIDB4MTI4MCwgMHg5QjdBLCAweDJEMjAsCi0gICAgMHg5QjdCLCAweDJEMUIsIDB4OUI3QywgMHgyRDE5LCAweDlCN0QsIDB4MkQyMiwgMHg5QjdFLCAweDJEMUEsCi0gICAgMHg5QjgwLCAweDJEMTYsIDB4OUI4MiwgMHgyRDFDLCAweDlCODUsIDB4MkQxNywgMHg5Qjg2LCAweDJFRUIsCi0gICAgMHg5Qjg3LCAweDJEMTgsIDB4OUI4OCwgMHgyRDIzLCAweDlCOTAsIDB4MkQxRiwgMHg5QjkxLCAweDEzQTksCi0gICAgMHg5QjkyLCAweDJEMUUsIDB4OUI5MywgMHgyRDFELCAweDlCOTUsIDB4MkQyMSwgMHg5QjlBLCAweDJFRTMsCi0gICAgMHg5QjlCLCAweDJFRTYsIDB4OUI5RSwgMHgyRUU1LCAweDlCQTAsIDB4MkVFRCwgMHg5QkExLCAweDJFRTgsCi0gICAgMHg5QkEyLCAweDJFRUMsIDB4OUJBNCwgMHgyRUVBLCAweDlCQTUsIDB4MkVFOSwgMHg5QkE2LCAweDJFRTcsCi0gICAgMHg5QkE4LCAweDJFRTQsIDB4OUJBQSwgMHgxNEJELCAweDlCQUIsIDB4MTRCQywgMHg5QkFELCAweDE0QkUsCi0gICAgMHg5QkFFLCAweDE0QkIsIDB4OUJBRiwgMHgyRUVFLCAweDlCQjUsIDB4MzA1NywgMHg5QkI2LCAweDMwNUEsCi0gICAgMHg5QkI4LCAweDMwNTgsIDB4OUJCOSwgMHgzMDVDLCAweDlCQkQsIDB4MzA1RCwgMHg5QkJGLCAweDMwNTUsCi0gICAgMHg5QkMwLCAweDE1NkUsIDB4OUJDMSwgMHgzMDU2LCAweDlCQzMsIDB4MzA1NCwgMHg5QkM0LCAweDMwNUIsCi0gICAgMHg5QkM2LCAweDMwNTMsIDB4OUJDNywgMHgzMDUyLCAweDlCQzgsIDB4MTU2RCwgMHg5QkM5LCAweDE1NkIsCi0gICAgMHg5QkNBLCAweDE1NkEsIDB4OUJEMywgMHgzMDU5LCAweDlCRDQsIDB4MzE5OSwgMHg5QkQ1LCAweDMxOUYsCi0gICAgMHg5QkQ2LCAweDE1RkUsIDB4OUJENywgMHgzMTlBLCAweDlCRDksIDB4MzE5RCwgMHg5QkRBLCAweDMxQTEsCi0gICAgMHg5QkRCLCAweDE1RkYsIDB4OUJEQywgMHgzMTlDLCAweDlCREUsIDB4MzE5NCwgMHg5QkUwLCAweDMxOTMsCi0gICAgMHg5QkUxLCAweDMxQTAsIDB4OUJFMiwgMHgzMTk3LCAweDlCRTQsIDB4MzE5NSwgMHg5QkU1LCAweDMxOUUsCi0gICAgMHg5QkU2LCAweDMxOTYsIDB4OUJFNywgMHgxNUZELCAweDlCRTgsIDB4MTVGQywgMHg5QkVBLCAweDMxOTEsCi0gICAgMHg5QkVCLCAweDMxOTIsIDB4OUJFQywgMHgzMTlCLCAweDlCRjAsIDB4MzE5OCwgMHg5QkY3LCAweDMyOTMsCi0gICAgMHg5QkY4LCAweDMyOTYsIDB4OUJGRCwgMHgxNTZDLCAweDlDMDUsIDB4MzI5NCwgMHg5QzA2LCAweDMyOUEsCi0gICAgMHg5QzA3LCAweDMyOTgsIDB4OUMwOCwgMHgzMjkyLCAweDlDMDksIDB4MzI5RCwgMHg5QzBCLCAweDMyOTEsCi0gICAgMHg5QzBELCAweDE2NjAsIDB4OUMwRSwgMHgzMjk5LCAweDlDMTIsIDB4MzI5NSwgMHg5QzEzLCAweDE2NUYsCi0gICAgMHg5QzE0LCAweDMyOUMsIDB4OUMxNywgMHgzMjlCLCAweDlDMUMsIDB4MzM0QywgMHg5QzFELCAweDMzNEIsCi0gICAgMHg5QzIxLCAweDMzNTIsIDB4OUMyMywgMHgzMzRFLCAweDlDMjQsIDB4MzM1MSwgMHg5QzI1LCAweDE2QjAsCi0gICAgMHg5QzI4LCAweDMzNEYsIDB4OUMyOSwgMHgzMzUwLCAweDlDMkIsIDB4MzM0QSwgMHg5QzJDLCAweDMzNEQsCi0gICAgMHg5QzJELCAweDE2QUYsIDB4OUMzMSwgMHgxNkVELCAweDlDMzIsIDB4MzNGMiwgMHg5QzMzLCAweDMzRUQsCi0gICAgMHg5QzM0LCAweDMzRjEsIDB4OUMzNiwgMHgzM0Y0LCAweDlDMzcsIDB4MzNGMCwgMHg5QzM5LCAweDMzRUMsCi0gICAgMHg5QzNCLCAweDE2RUYsIDB4OUMzQywgMHgzM0VGLCAweDlDM0QsIDB4MzNGMywgMHg5QzNFLCAweDE2RUUsCi0gICAgMHg5QzNGLCAweDMzRUEsIDB4OUM0MCwgMHgzMjk3LCAweDlDNDEsIDB4MzNFRSwgMHg5QzQ0LCAweDMzRUIsCi0gICAgMHg5QzQ2LCAweDMzRTgsIDB4OUM0OCwgMHgzM0U5LCAweDlDNDksIDB4MTZFQywgMHg5QzRBLCAweDM0NTcsCi0gICAgMHg5QzRCLCAweDM0NTksIDB4OUM0QywgMHgzNDVDLCAweDlDNEQsIDB4MzQ1OCwgMHg5QzRFLCAweDM0NUQsCi0gICAgMHg5QzUwLCAweDM0NTYsIDB4OUM1MiwgMHgzNDU0LCAweDlDNTQsIDB4MTcxOSwgMHg5QzU1LCAweDM0NUEsCi0gICAgMHg5QzU2LCAweDE3MUIsIDB4OUM1NywgMHgxNzFBLCAweDlDNTgsIDB4MzQ1NSwgMHg5QzU5LCAweDM0NUIsCi0gICAgMHg5QzVFLCAweDM0QjUsIDB4OUM1RiwgMHgxNzNBLCAweDlDNjAsIDB4MzRCNiwgMHg5QzYyLCAweDM0QjQsCi0gICAgMHg5QzYzLCAweDM0QjEsIDB4OUM2NiwgMHgzNEIzLCAweDlDNjcsIDB4MzRCMiwgMHg5QzY4LCAweDM0RjQsCi0gICAgMHg5QzZELCAweDM0RjYsIDB4OUM2RSwgMHgzNEY1LCAweDlDNzEsIDB4MzUxNCwgMHg5QzczLCAweDM1MTMsCi0gICAgMHg5Qzc0LCAweDM1MTIsIDB4OUM3NSwgMHgzNTE1LCAweDlDNzcsIDB4MTc2MCwgMHg5Qzc4LCAweDE3NjEsCi0gICAgMHg5Qzc5LCAweDM1NDEsIDB4OUM3QSwgMHgzNTQ1LCAweDlDRTUsIDB4MEJFMiwgMHg5Q0U2LCAweDIzNUYsCi0gICAgMHg5Q0U3LCAweDI2MTAsIDB4OUNFOSwgMHgwRjc5LCAweDlDRUEsIDB4MjYwRSwgMHg5Q0VELCAweDI2MEYsCi0gICAgMHg5Q0YxLCAweDI4NzksIDB4OUNGMiwgMHgyODdBLCAweDlDRjMsIDB4MTBGRSwgMHg5Q0Y0LCAweDEwRkMsCi0gICAgMHg5Q0Y1LCAweDI4N0IsIDB4OUNGNiwgMHgxMEZELCAweDlDRjcsIDB4MkFGNCwgMHg5Q0Y5LCAweDJBRjcsCi0gICAgMHg5Q0ZBLCAweDJBRjEsIDB4OUNGQiwgMHgyQUY4LCAweDlDRkMsIDB4MkFGMCwgMHg5Q0ZELCAweDJBRjIsCi0gICAgMHg5Q0ZGLCAweDJBRjMsIDB4OUQwMCwgMHgyQUY2LCAweDlEMDMsIDB4MTI4NCwgMHg5RDA0LCAweDJBRkIsCi0gICAgMHg5RDA1LCAweDJBRkEsIDB4OUQwNiwgMHgxMjgyLCAweDlEMDcsIDB4MkFGNSwgMHg5RDA4LCAweDJBRjksCi0gICAgMHg5RDA5LCAweDEyODMsIDB4OUQxMCwgMHgyRDJELCAweDlEMTIsIDB4MTNBRSwgMHg5RDE0LCAweDJEMjgsCi0gICAgMHg5RDE1LCAweDEzQUEsIDB4OUQxNywgMHgyRDI1LCAweDlEMTgsIDB4MkQyQiwgMHg5RDE5LCAweDJEMkUsCi0gICAgMHg5RDFCLCAweDEzQUYsIDB4OUQxRCwgMHgyRDJBLCAweDlEMUUsIDB4MkQyNywgMHg5RDFGLCAweDJEMkYsCi0gICAgMHg5RDIwLCAweDJEMjYsIDB4OUQyMiwgMHgyRDJDLCAweDlEMjMsIDB4MTNBQiwgMHg5RDI1LCAweDJEMjQsCi0gICAgMHg5RDI2LCAweDEzQUMsIDB4OUQyOCwgMHgxM0FELCAweDlEMjksIDB4MkQyOSwgMHg5RDJELCAweDJGMDAsCi0gICAgMHg5RDJFLCAweDJFRjMsIDB4OUQyRiwgMHgyRUY0LCAweDlEMzAsIDB4MkVGNywgMHg5RDMxLCAweDJFRjUsCi0gICAgMHg5RDMzLCAweDJFRUYsIDB4OUQzNiwgMHgyRUYyLCAweDlEMzcsIDB4MkVGQywgMHg5RDM4LCAweDJFRjYsCi0gICAgMHg5RDNCLCAweDE0QkYsIDB4OUQzRCwgMHgyRUZFLCAweDlEM0UsIDB4MkVGQiwgMHg5RDNGLCAweDE0QzAsCi0gICAgMHg5RDQwLCAweDJFRkQsIDB4OUQ0MSwgMHgyRUYwLCAweDlENDIsIDB4MkVGOSwgMHg5RDQzLCAweDJFRkEsCi0gICAgMHg5RDQ1LCAweDJFRjgsIDB4OUQ0QSwgMHgzMDYxLCAweDlENEIsIDB4MzA2MywgMHg5RDRDLCAweDMwNjYsCi0gICAgMHg5RDRGLCAweDMwNjAsIDB4OUQ1MSwgMHgxNTZGLCAweDlENTIsIDB4MzA2OCwgMHg5RDUzLCAweDMwNUYsCi0gICAgMHg5RDU0LCAweDMwNjksIDB4OUQ1NiwgMHgzMDY1LCAweDlENTcsIDB4MzA2NywgMHg5RDU4LCAweDMwNkIsCi0gICAgMHg5RDU5LCAweDMwNjQsIDB4OUQ1QSwgMHgzMDZDLCAweDlENUIsIDB4MzA2MiwgMHg5RDVDLCAweDMwNUUsCi0gICAgMHg5RDVELCAweDE1NzAsIDB4OUQ1RiwgMHgzMDZBLCAweDlENjAsIDB4MTU3MSwgMHg5RDYxLCAweDE2MDEsCi0gICAgMHg5RDY3LCAweDJFRjEsIDB4OUQ2OCwgMHgzMUJCLCAweDlENjksIDB4MzFCMiwgMHg5RDZBLCAweDE2MDMsCi0gICAgMHg5RDZCLCAweDMxQUUsIDB4OUQ2QywgMHgxNjA0LCAweDlENkYsIDB4MzFCNywgMHg5RDcwLCAweDMxQjEsCi0gICAgMHg5RDcxLCAweDMxQTcsIDB4OUQ3MiwgMHgxNjAyLCAweDlENzMsIDB4MzFCNCwgMHg5RDc0LCAweDMxQUYsCi0gICAgMHg5RDc1LCAweDMxQjAsIDB4OUQ3NywgMHgzMUEyLCAweDlENzgsIDB4MzFBOSwgMHg5RDc5LCAweDMxQjgsCi0gICAgMHg5RDdCLCAweDMxQjUsIDB4OUQ3RCwgMHgzMUFELCAweDlEN0YsIDB4MzFCOSwgMHg5RDgwLCAweDMxQTgsCi0gICAgMHg5RDgxLCAweDMxQTMsIDB4OUQ4MiwgMHgzMUI2LCAweDlEODQsIDB4MzFBNSwgMHg5RDg1LCAweDMxQjMsCi0gICAgMHg5RDg2LCAweDMxQUEsIDB4OUQ4NywgMHgzMUJBLCAweDlEODgsIDB4MzFBNiwgMHg5RDg5LCAweDE2MDAsCi0gICAgMHg5RDhBLCAweDMxQTQsIDB4OUQ4QiwgMHgzMUFCLCAweDlEOEMsIDB4MzFBQywgMHg5RDkwLCAweDMyQTQsCi0gICAgMHg5RDkyLCAweDMyQTIsIDB4OUQ5NCwgMHgzMkE3LCAweDlEOTYsIDB4MzJCMywgMHg5RDk3LCAweDMyQUEsCi0gICAgMHg5RDk4LCAweDMyQTMsIDB4OUQ5OSwgMHgzMjlGLCAweDlEOUEsIDB4MzJBQywgMHg5RDlCLCAweDMyQTUsCi0gICAgMHg5RDlDLCAweDMyQTgsIDB4OUQ5RCwgMHgzMkExLCAweDlEOUUsIDB4MzJBRiwgMHg5RDlGLCAweDMyOUUsCi0gICAgMHg5REEwLCAweDMyQTYsIDB4OURBMSwgMHgzMkFCLCAweDlEQTIsIDB4MzJBRCwgMHg5REEzLCAweDMyQjAsCi0gICAgMHg5REE0LCAweDMyQTAsIDB4OURBNiwgMHgzMkI0LCAweDlEQTcsIDB4MzJCNSwgMHg5REE4LCAweDMyQUUsCi0gICAgMHg5REE5LCAweDMyQjIsIDB4OURBQSwgMHgzMkE5LCAweDlEQUMsIDB4MzM2MiwgMHg5REFELCAweDMzNjUsCi0gICAgMHg5REFGLCAweDE2QjEsIDB4OURCMSwgMHgzMzY0LCAweDlEQjIsIDB4MzM2OSwgMHg5REIzLCAweDMzNjcsCi0gICAgMHg5REI0LCAweDE2QjIsIDB4OURCNSwgMHgzMzVFLCAweDlEQjYsIDB4MzM1NCwgMHg5REI3LCAweDMzNTMsCi0gICAgMHg5REI4LCAweDE2QjQsIDB4OURCOSwgMHgzMzYwLCAweDlEQkEsIDB4MzM2MSwgMHg5REJCLCAweDMzNUQsCi0gICAgMHg5REJDLCAweDMzNTUsIDB4OURCRSwgMHgzMzVBLCAweDlEQkYsIDB4MzJCMSwgMHg5REMxLCAweDMzNTYsCi0gICAgMHg5REMyLCAweDE2QjMsIDB4OURDMywgMHgzMzVDLCAweDlEQzUsIDB4MzM1QiwgMHg5REM3LCAweDMzNTcsCi0gICAgMHg5REM4LCAweDMzNjMsIDB4OURDQSwgMHgzMzU4LCAweDlEQ0IsIDB4MzNGOSwgMHg5RENDLCAweDMzNjYsCi0gICAgMHg5RENELCAweDMzNjgsIDB4OURDRSwgMHgzMzVGLCAweDlEQ0YsIDB4MzM1OSwgMHg5REQwLCAweDMzRkEsCi0gICAgMHg5REQxLCAweDMzRkMsIDB4OUREMiwgMHgzM0Y2LCAweDlERDMsIDB4MTZGMCwgMHg5REQ1LCAweDM0MDMsCi0gICAgMHg5REQ2LCAweDM0MDEsIDB4OURENywgMHgxNkYxLCAweDlERDgsIDB4MzQwMCwgMHg5REQ5LCAweDMzRkYsCi0gICAgMHg5RERBLCAweDMzRjgsIDB4OUREQiwgMHgzM0Y1LCAweDlEREMsIDB4MzNGQiwgMHg5RERELCAweDM0MDQsCi0gICAgMHg5RERFLCAweDMzRjcsIDB4OURERiwgMHgzM0ZELCAweDlERTEsIDB4MzQ2NiwgMHg5REUyLCAweDM0NkIsCi0gICAgMHg5REUzLCAweDM0NjEsIDB4OURFNCwgMHgzNDY0LCAweDlERTUsIDB4MTcxQywgMHg5REU2LCAweDM0NjgsCi0gICAgMHg5REU4LCAweDM0NkYsIDB4OURFOSwgMHgzM0ZFLCAweDlERUIsIDB4MzQ2MiwgMHg5REVDLCAweDM0NkMsCi0gICAgMHg5REVELCAweDM0NzAsIDB4OURFRSwgMHgzNDY3LCAweDlERUYsIDB4MzQ2MCwgMHg5REYwLCAweDM0NkEsCi0gICAgMHg5REYyLCAweDM0NjksIDB4OURGMywgMHgzNDZFLCAweDlERjQsIDB4MzQ2RCwgMHg5REY1LCAweDM0MDIsCi0gICAgMHg5REY2LCAweDM0NjUsIDB4OURGNywgMHgzNDVGLCAweDlERjgsIDB4MzQ2MywgMHg5REY5LCAweDE3M0IsCi0gICAgMHg5REZBLCAweDE3M0MsIDB4OURGQiwgMHgzNDVFLCAweDlERkQsIDB4MzRDMSwgMHg5REZFLCAweDM0QjgsCi0gICAgMHg5REZGLCAweDM0QzAsIDB4OUUwMCwgMHgzNEJELCAweDlFMDEsIDB4MzRCRSwgMHg5RTAyLCAweDM0QjcsCi0gICAgMHg5RTAzLCAweDM0QkEsIDB4OUUwNCwgMHgzNEMyLCAweDlFMDUsIDB4MzRCQywgMHg5RTA2LCAweDM0QkIsCi0gICAgMHg5RTA3LCAweDM0QjksIDB4OUUwOSwgMHgzNEJGLCAweDlFMEIsIDB4MzRGNywgMHg5RTBELCAweDM0RjgsCi0gICAgMHg5RTBGLCAweDM0RkEsIDB4OUUxMCwgMHgzNEY5LCAweDlFMTEsIDB4MzRGQywgMHg5RTEyLCAweDM0RkIsCi0gICAgMHg5RTEzLCAweDM1MTcsIDB4OUUxNCwgMHgzNTE2LCAweDlFMTUsIDB4MzUzMCwgMHg5RTE3LCAweDM1MzEsCi0gICAgMHg5RTE5LCAweDM1M0QsIDB4OUUxQSwgMHgxNzY1LCAweDlFMUIsIDB4MTc2OSwgMHg5RTFELCAweDM1NDYsCi0gICAgMHg5RTFFLCAweDE3NkEsIDB4OUU3NSwgMHgwQkUzLCAweDlFNzksIDB4MTY2MSwgMHg5RTdBLCAweDMzNkEsCi0gICAgMHg5RTdDLCAweDE3M0QsIDB4OUU3RCwgMHgxNzNFLCAweDlFN0YsIDB4MEJFNCwgMHg5RTgwLCAweDI2MTEsCi0gICAgMHg5RTgyLCAweDBGN0EsIDB4OUU4MywgMHgyQUZDLCAweDlFODYsIDB4MkQzMSwgMHg5RTg3LCAweDJEMzIsCi0gICAgMHg5RTg4LCAweDJEMzAsIDB4OUU4OSwgMHgyRjAyLCAweDlFOEEsIDB4MkYwMSwgMHg5RThCLCAweDE0QzEsCi0gICAgMHg5RThDLCAweDMwNkUsIDB4OUU4RCwgMHgyRjAzLCAweDlFOEUsIDB4MzA2RCwgMHg5RTkxLCAweDMxQkQsCi0gICAgMHg5RTkyLCAweDE2MDUsIDB4OUU5MywgMHgxNjA3LCAweDlFOTQsIDB4MzFCQywgMHg5RTk3LCAweDE2MDYsCi0gICAgMHg5RTk5LCAweDMyQjYsIDB4OUU5QSwgMHgzMkI4LCAweDlFOUIsIDB4MzJCNywgMHg5RTlDLCAweDMzNkIsCi0gICAgMHg5RTlELCAweDE2QjUsIDB4OUU5RiwgMHgxNzFELCAweDlFQTAsIDB4MzRDMywgMHg5RUExLCAweDM0RkQsCi0gICAgMHg5RUE0LCAweDM1NEEsIDB4OUVBNSwgMHgwQkU1LCAweDlFQTcsIDB4Mjg3QywgMHg5RUE5LCAweDEyODUsCi0gICAgMHg5RUFELCAweDJEMzQsIDB4OUVBRSwgMHgyRDMzLCAweDlFQjAsIDB4MkYwNCwgMHg5RUI0LCAweDE2MDgsCi0gICAgMHg5RUI1LCAweDE2NjIsIDB4OUVCNiwgMHgzNDA1LCAweDlFQjcsIDB4MzU0MiwgMHg5RUJCLCAweDBCRTYsCi0gICAgMHg5RUJDLCAweDEwRkYsIDB4OUVCRSwgMHgxMjg2LCAweDlFQzAsIDB4MzFCRSwgMHg5RUMyLCAweDM0NzEsCi0gICAgMHg5RUMzLCAweDBEQkIsIDB4OUVDOCwgMHgyRjA1LCAweDlFQ0MsIDB4MTc1MSwgMHg5RUNELCAweDBEQkMsCi0gICAgMHg5RUNFLCAweDEyODcsIDB4OUVDRiwgMHgxNEMyLCAweDlFRDAsIDB4MzQ3MiwgMHg5RUQxLCAweDBEQkQsCi0gICAgMHg5RUQzLCAweDJBRkQsIDB4OUVENCwgMHgxM0IxLCAweDlFRDUsIDB4MkQzNSwgMHg5RUQ2LCAweDJEMzYsCi0gICAgMHg5RUQ4LCAweDEzQjAsIDB4OUVEQSwgMHgyRjA2LCAweDlFREIsIDB4MTRDNiwgMHg5RURDLCAweDE0QzQsCi0gICAgMHg5RURELCAweDE0QzUsIDB4OUVERSwgMHgxNEMzLCAweDlFREYsIDB4MzA2RiwgMHg5RUUwLCAweDE1NzIsCi0gICAgMHg5RUU0LCAweDMyQkEsIDB4OUVFNSwgMHgzMkI5LCAweDlFRTYsIDB4MzJCQywgMHg5RUU3LCAweDMyQkIsCi0gICAgMHg5RUU4LCAweDE2NjMsIDB4OUVFQiwgMHgzMzZDLCAweDlFRUQsIDB4MzM2RSwgMHg5RUVFLCAweDMzNkQsCi0gICAgMHg5RUVGLCAweDE2QjYsIDB4OUVGMCwgMHgzNDA2LCAweDlFRjIsIDB4MzQ3MywgMHg5RUYzLCAweDM0NzQsCi0gICAgMHg5RUY0LCAweDE3MUUsIDB4OUVGNSwgMHgzNEZFLCAweDlFRjYsIDB4MzUxOCwgMHg5RUY3LCAweDE3NjIsCi0gICAgMHg5RUY5LCAweDIzNjAsIDB4OUVGQSwgMHgyRDM3LCAweDlFRkIsIDB4MkYwNywgMHg5RUZDLCAweDMxQkYsCi0gICAgMHg5RUZELCAweDI2MTIsIDB4OUVGRiwgMHgyRjA4LCAweDlGMDAsIDB4MzA3MSwgMHg5RjAxLCAweDMwNzAsCi0gICAgMHg5RjA2LCAweDM0NzUsIDB4OUYwNywgMHgxNzNGLCAweDlGMDksIDB4MzRGRiwgMHg5RjBBLCAweDM1MTksCi0gICAgMHg5RjBFLCAweDBGN0IsIDB4OUYwRiwgMHgyQUZFLCAweDlGMTAsIDB4MkFGRiwgMHg5RjEyLCAweDJEMzgsCi0gICAgMHg5RjEzLCAweDBGN0MsIDB4OUYxNSwgMHgxNTczLCAweDlGMTYsIDB4MzA3MiwgMHg5RjE4LCAweDMzNzAsCi0gICAgMHg5RjE5LCAweDE2QjcsIDB4OUYxQSwgMHgzMzcxLCAweDlGMUIsIDB4MzM2RiwgMHg5RjFDLCAweDM0NzYsCi0gICAgMHg5RjFFLCAweDM0QzQsIDB4OUYyMCwgMHgwRjdELCAweDlGMjIsIDB4MkYwQiwgMHg5RjIzLCAweDJGMEEsCi0gICAgMHg5RjI0LCAweDJGMDksIDB4OUYyNSwgMHgzMDczLCAweDlGMjgsIDB4MzA3NywgMHg5RjI5LCAweDMwNzYsCi0gICAgMHg5RjJBLCAweDMwNzUsIDB4OUYyQiwgMHgzMDc0LCAweDlGMkMsIDB4MTU3NCwgMHg5RjJELCAweDMxQzAsCi0gICAgMHg5RjJFLCAweDMyQkUsIDB4OUYyRiwgMHgxNjY0LCAweDlGMzAsIDB4MzJCRCwgMHg5RjMxLCAweDMzNzIsCi0gICAgMHg5RjMyLCAweDM0MDksIDB4OUYzMywgMHgzNDA4LCAweDlGMzQsIDB4MTZGMiwgMHg5RjM1LCAweDM0MDcsCi0gICAgMHg5RjM2LCAweDM0NzksIDB4OUYzNywgMHgzNDc4LCAweDlGMzgsIDB4MzQ3NywgMHg5RjNCLCAweDExMDAsCi0gICAgMHg5RjNELCAweDJEMzksIDB4OUYzRSwgMHgxNEM3LCAweDlGNDAsIDB4MzFDMSwgMHg5RjQxLCAweDMxQzIsCi0gICAgMHg5RjQyLCAweDM0MEEsIDB4OUY0MywgMHgzNDdBLCAweDlGNDYsIDB4MzRDNSwgMHg5RjQ3LCAweDM1MDAsCi0gICAgMHg5RjQ4LCAweDM1MzIsIDB4OUY0OSwgMHgzNTRDLCAweDlGNEEsIDB4MTEwMSwgMHg5RjRCLCAweDE0QzgsCi0gICAgMHg5RjRDLCAweDMwNzgsIDB4OUY0RCwgMHgzMUMzLCAweDlGNEUsIDB4MzM3MywgMHg5RjRGLCAweDM0N0IsCi0gICAgMHg5RjUyLCAweDEyODksIDB4OUY1NCwgMHgyRjBDLCAweDlGNTUsIDB4MzA3OSwgMHg5RjU2LCAweDMxQzQsCi0gICAgMHg5RjU3LCAweDMxQzUsIDB4OUY1OCwgMHgzMUM2LCAweDlGNTksIDB4MzJDMywgMHg5RjVCLCAweDMyQkYsCi0gICAgMHg5RjVDLCAweDE2QjgsIDB4OUY1RCwgMHgzMkMyLCAweDlGNUUsIDB4MzJDMSwgMHg5RjVGLCAweDE2NjUsCi0gICAgMHg5RjYwLCAweDMyQzAsIDB4OUY2MSwgMHgxNjY3LCAweDlGNjMsIDB4MTY2NiwgMHg5RjY0LCAweDMzNzUsCi0gICAgMHg5RjY1LCAweDMzNzQsIDB4OUY2NiwgMHgxNkI5LCAweDlGNjcsIDB4MTZCQSwgMHg5RjZBLCAweDE2RjQsCi0gICAgMHg5RjZCLCAweDM0MEIsIDB4OUY2QywgMHgxNkYzLCAweDlGNkUsIDB4MzQ3RSwgMHg5RjZGLCAweDM0N0YsCi0gICAgMHg5RjcwLCAweDM0N0QsIDB4OUY3MSwgMHgzNDdDLCAweDlGNzIsIDB4MTc0MSwgMHg5Rjc0LCAweDM0QzYsCi0gICAgMHg5Rjc1LCAweDM0QzcsIDB4OUY3NiwgMHgzNEM4LCAweDlGNzcsIDB4MTc0MCwgMHg5Rjc4LCAweDM1MDEsCi0gICAgMHg5Rjc5LCAweDM1MDQsIDB4OUY3QSwgMHgzNTAzLCAweDlGN0IsIDB4MzUwMiwgMHg5RjdFLCAweDM1NEIsCi0gICAgMHg5RjhELCAweDEzQjIsIDB4OUY5MCwgMHgxNTdDLCAweDlGOTEsIDB4MzJDNCwgMHg5RjkyLCAweDMzNzYsCi0gICAgMHg5Rjk0LCAweDE2RjUsIDB4OUY5NSwgMHgzNDBDLCAweDlGOTgsIDB4MzU0RCwgMHg5RjlDLCAweDEzQjMsCi0gICAgMHg5RkEwLCAweDJGMEQsIDB4OUZBMiwgMHgzNDBELCAweDlGQTQsIDB4MzUxQSwgMHhFMDFGLCAweDA4M0EsCi0gICAgMHhFMDI2LCAweDA5RkQsIDB4RTA1QiwgMHgwMzBELCAweEUwNjMsIDB4MDE2QiwgMHhFMDczLCAweDA4NjAsCi0gICAgMHhFMEYzLCAweDBDMjMsIDB4RTEyRSwgMHgxN0U0LCAweEUxNDksIDB4MjEyRiwgMHhFMTkxLCAweDExNUYsCi0gICAgMHhFMUJBLCAweDBDNzksIDB4RTFDOSwgMHgwNEMzLCAweEUyMkMsIDB4MThCRCwgMHhFMjJELCAweDBDQkQsCi0gICAgMHhFMjMwLCAweDBDQTUsIDB4RTI2NiwgMHgwQ0NFLCAweEUyQTMsIDB4MEU4NCwgMHhFMkJDLCAweDAxMjAsCi0gICAgMHhFMkVGLCAweDFCQTgsIDB4RTMzQSwgMHgxMDU1LCAweEUzNDAsIDB4MkRFOCwgMHhFMzRGLCAweDAxMjEsCi0gICAgMHhFMzVBLCAweDEwNkIsIDB4RTM2MywgMHgxMzI2LCAweEUzN0MsIDB4MDY2QiwgMHhFMzdGLCAweDEzMkUsCi0gICAgMHhFM0M1LCAweDBEMzUsIDB4RTNENywgMHgyN0MyLCAweEUzREMsIDB4MjJBRCwgMHhFNDE3LCAweDEzNEMsCi0gICAgMHhFNDRBLCAweDA5Q0UsIDB4RTQ3OCwgMHgwQkM3LCAweEU0ODUsIDB4MzZFOSwgMHhFNEM1LCAweDEzOTEsCi0gICAgMHhFNERBLCAweDE2QTQsIDB4RTU0NSwgMHgzMDcyLCAweEU1RDIsIDB4MDExOSwgMHhFNUQzLCAweDAxMUEsCi0gICAgMHhFNUQ0LCAweDAxMUMsIDB4RTVENSwgMHgwMTFCLCAweEU1RjQsIDB4Mjk3QywgMHhFNkM2LCAweDFEMDYsCi0gICAgMHhFNzI3LCAweDI5QTEsIDB4RTdEMywgMHgxODFCLCAweEU4OTMsIDB4MkIyNCwgMHhFQjQwLCAweDJGNTAsCi0gICAgMHhFQjQyLCAweDE3MjUsIDB4RUI0NSwgMHgzMkVELCAweEVCNkUsIDB4MkFEOSwgMHhFQjg2LCAweDFDMTQsCi0gICAgMHhFQjlFLCAweDEyRTksIDB4RUJBOSwgMHgyQ0FFLCAweEVCQkEsIDB4MUE2NCwgMHhFQkM5LCAweDE0MDQsCi0gICAgMHhFQkNGLCAweDIzMjQsIDB4RUJEMiwgMHgzNDZBLCAweEVCREUsIDB4MjI5MSwgMHhFQzAxLCAweDE3ODcsCi0gICAgMHhFQzAyLCAweDA5NUYsIDB4RUMxNSwgMHgxRTk5LCAweEVDNUIsIDB4MjVDMSwgMHhFQzVFLCAweDBEMEMsCi0gICAgMHhFQ0E2LCAweDA1RTYsIDB4RUQyOCwgMHgwNzI4LCAweEVENkUsIDB4MjRCNiwgMHhFRDdDLCAweDE4MDYsCi0gICAgMHhFRDlFLCAweDM1MTEsIDB4RURFNywgMHgwRjgyLCAweEVFNTIsIDB4MDVGMiwgMHhFRTk4LCAweDI0N0QsCi0gICAgMHhGNkIxLCAweDAxRkEsIDB4RjZCMiwgMHgwMUZCLCAweEY2QjMsIDB4MDFGQywgMHhGNkI0LCAweDAxRkQsCi0gICAgMHhGNkI1LCAweDAxRkUsIDB4RjZCNiwgMHgwMUZGLCAweEY2QjcsIDB4MDIwMCwgMHhGNkI4LCAweDAyMDEsCi0gICAgMHhGNkI5LCAweDAyMDIsIDB4RjZCQSwgMHgwMjAzLCAweEY2QkIsIDB4MDIwNCwgMHhGNkJDLCAweDAyMDUsCi0gICAgMHhGNkJELCAweDAyMDYsIDB4RjZCRSwgMHgwMjA3LCAweEY2QkYsIDB4MDIwOCwgMHhGNkMwLCAweDAyMDksCi0gICAgMHhGNkMxLCAweDAyMEEsIDB4RjZDMiwgMHgwMjBCLCAweEY2QzMsIDB4MDIwQywgMHhGNkM0LCAweDAyMEQsCi0gICAgMHhGNkM1LCAweDAyMEUsIDB4RjZDNiwgMHgwMjBGLCAweEY2QzcsIDB4MDIxMCwgMHhGNkM4LCAweDAyMTEsCi0gICAgMHhGNkM5LCAweDAyMTIsIDB4RjZDQSwgMHgwMjEzLCAweEY2Q0IsIDB4MDIxNCwgMHhGNkNDLCAweDAyMTUsCi0gICAgMHhGNkNELCAweDAyMTYsIDB4RjZDRSwgMHgwMjE3LCAweEY2Q0YsIDB4MDIxOSwgMHhGNkQwLCAweDAyMUEsCi0gICAgMHhGNkQxLCAweDAyMUIsIDB4RjZEMiwgMHgwMjFDLCAweEY2RDMsIDB4MDIxRCwgMHhGNkQ0LCAweDAyMUUsCi0gICAgMHhGNkQ1LCAweDAyMUYsIDB4RjZENiwgMHgwMjIwLCAweEY2RDcsIDB4MDIyMSwgMHhGNkQ4LCAweDAyMjIsCi0gICAgMHhGNkQ5LCAweDAyMjMsIDB4RjZEQSwgMHgwMjI0LCAweEY2REIsIDB4MDIyNSwgMHhGNkRDLCAweDAyMjYsCi0gICAgMHhGNkRELCAweDAyMjcsIDB4RjZERSwgMHgwMjI4LCAweEY2RTAsIDB4MDIyQSwgMHhGNkUxLCAweDAyMkIsCi0gICAgMHhGNkUyLCAweDAyMkMsIDB4RjZFNCwgMHgwMjJFLCAweEY2RTYsIDB4MDIzMCwgMHhGNkU4LCAweDM1QjMsCi0gICAgMHhGNkU5LCAweDM1QjQsIDB4RjZFQSwgMHgzNUI1LCAweEY2RUIsIDB4MzVCNiwgMHhGNkVDLCAweDM1QjcsCi0gICAgMHhGNkVELCAweDM1QjgsIDB4RjZGMCwgMHgzNUJBLCAweEY2RjEsIDB4MzVCQiwgMHhGNkYyLCAweDM1QkMsCi0gICAgMHhGNkYzLCAweDM1QkQsIDB4RjZGNCwgMHgzNUJFLCAweEY2RjUsIDB4MzVCRiwgMHhGNkY2LCAweDM1QzAsCi0gICAgMHhGNkY3LCAweDM1QzEsIDB4RjZGOCwgMHgzNUMyLCAweEY2RjksIDB4MzVDMywgMHhGNkZBLCAweDM1QzQsCi0gICAgMHhGNkZCLCAweDM1QzUsIDB4RjZGQywgMHgzNUM2LCAweEY2RkQsIDB4MzVDNywgMHhGNkZFLCAweDM1QzgsCi0gICAgMHhGNkZGLCAweDM1QzksIDB4RjcwMCwgMHgzNUNBLCAweEY3MDEsIDB4MzVDQiwgMHhGNzAyLCAweDM1Q0MsCi0gICAgMHhGNzAzLCAweDM1Q0QsIDB4RjcwNCwgMHgzNUNFLCAweEY3MDUsIDB4MzVDRiwgMHhGNzA2LCAweDM1RDAsCi0gICAgMHhGNzA3LCAweDM1RDEsIDB4RjcwOCwgMHgzNUQyLCAweEY3MDksIDB4MzVEMywgMHhGNzBBLCAweDM1RDQsCi0gICAgMHhGNzBCLCAweDM1RDUsIDB4RjcwQywgMHgzNUQ2LCAweEY3MEQsIDB4MzVENywgMHhGNzBFLCAweDM1RDgsCi0gICAgMHhGNzBGLCAweDM1RDksIDB4RjcxMCwgMHgzNURBLCAweEY3MTEsIDB4MzVEQiwgMHhGNzEyLCAweDM1REMsCi0gICAgMHhGNzEzLCAweDM1REQsIDB4RjcxNCwgMHgzNURFLCAweEY3MTUsIDB4MzVERiwgMHhGNzE2LCAweDM1RTAsCi0gICAgMHhGNzE3LCAweDM1RTEsIDB4RjcxOCwgMHgzNUUyLCAweEY3MTksIDB4MzVFMywgMHhGNzFBLCAweDM1RTQsCi0gICAgMHhGNzFCLCAweDM1RTUsIDB4RjcxQywgMHgzNUU2LCAweEY3MUQsIDB4MzVFNywgMHhGNzFFLCAweDM1RTgsCi0gICAgMHhGNzFGLCAweDM1RTksIDB4RjcyMCwgMHgzNUVBLCAweEY3MjEsIDB4MzVFQiwgMHhGNzIyLCAweDM1RUMsCi0gICAgMHhGNzIzLCAweDM1RUQsIDB4RjcyNCwgMHgzNUVFLCAweEY3MjUsIDB4MzVFRiwgMHhGNzI2LCAweDM1RjAsCi0gICAgMHhGNzI3LCAweDM1RjEsIDB4RjcyOCwgMHgzNUYyLCAweEY3MjksIDB4MzVGMywgMHhGNzJBLCAweDM1RjQsCi0gICAgMHhGNzJCLCAweDM1RjUsIDB4RjcyQywgMHgzNUY2LCAweEY3MkQsIDB4MzVGNywgMHhGNzJFLCAweDM1RjgsCi0gICAgMHhGNzJGLCAweDM1RjksIDB4RjczMCwgMHgzNUZBLCAweEY3MzEsIDB4MzVGQiwgMHhGNzMyLCAweDM1RkMsCi0gICAgMHhGNzMzLCAweDM1RkQsIDB4RjczNCwgMHgzNUZFLCAweEY3MzUsIDB4MzVGRiwgMHhGNzM2LCAweDM2MDAsCi0gICAgMHhGNzM3LCAweDM2MDEsIDB4RjczOCwgMHgzNjAyLCAweEY3MzksIDB4MzYwMywgMHhGNzNBLCAweDM2MDQsCi0gICAgMHhGNzNCLCAweDM2MDUsIDB4RjczQywgMHgzNjA2LCAweEY3M0QsIDB4MzYwNywgMHhGNzNFLCAweDM2MDgsCi0gICAgMHhGNzNGLCAweDM2MDksIDB4Rjc0MCwgMHgzNjBBLCAweEY3NDEsIDB4MzYwQiwgMHhGNzQyLCAweDM2MEMsCi0gICAgMHhGNzQzLCAweDM2MEQsIDB4Rjc0NCwgMHgzNjBFLCAweEY3NDUsIDB4MzYwRiwgMHhGNzQ2LCAweDM2MTAsCi0gICAgMHhGNzQ3LCAweDM2MTEsIDB4Rjc0OCwgMHgzNjEyLCAweEY3NDksIDB4MzYxMywgMHhGNzRBLCAweDM2MTQsCi0gICAgMHhGNzRCLCAweDM2MTUsIDB4Rjc0QywgMHgzNjE2LCAweEY3NEQsIDB4MzYxNywgMHhGNzRFLCAweDM2MTgsCi0gICAgMHhGNzRGLCAweDM2MTksIDB4Rjc1MCwgMHgzNjFBLCAweEY3NTEsIDB4MzYxQiwgMHhGNzUyLCAweDM2MUMsCi0gICAgMHhGNzUzLCAweDM2MUQsIDB4Rjc1NCwgMHgzNjFFLCAweEY3NTUsIDB4MzYxRiwgMHhGNzU2LCAweDM2MjAsCi0gICAgMHhGNzU3LCAweDM2MjEsIDB4Rjc1OCwgMHgzNjIyLCAweEY3NTksIDB4MzYyMywgMHhGNzVBLCAweDM2MjQsCi0gICAgMHhGNzVCLCAweDM2MjUsIDB4Rjc1QywgMHgzNjI2LCAweEY3NUQsIDB4MzYyNywgMHhGNzVFLCAweDM2MjgsCi0gICAgMHhGNzVGLCAweDM2MjksIDB4Rjc2MCwgMHgzNjJBLCAweEY3NjEsIDB4MzYyQiwgMHhGNzYyLCAweDM2MkMsCi0gICAgMHhGNzYzLCAweDM2MkQsIDB4Rjc2NCwgMHgzNjJFLCAweEY3NjUsIDB4MzYyRiwgMHhGNzY2LCAweDM2MzAsCi0gICAgMHhGNzY3LCAweDM2MzEsIDB4Rjc2OCwgMHgzNjMyLCAweEY3NjksIDB4MzYzMywgMHhGNzZBLCAweDM2MzQsCi0gICAgMHhGNzZCLCAweDM2MzUsIDB4Rjc2QywgMHgzNjM2LCAweEY3NkQsIDB4MzYzNywgMHhGNzZFLCAweDM2MzgsCi0gICAgMHhGNzZGLCAweDM2MzksIDB4Rjc3MCwgMHgzNjNBLCAweEY3NzEsIDB4MzYzQiwgMHhGNzcyLCAweDM2M0MsCi0gICAgMHhGNzczLCAweDM2M0QsIDB4Rjc3NCwgMHgzNjNFLCAweEY3NzUsIDB4MzYzRiwgMHhGNzc2LCAweDM2NDAsCi0gICAgMHhGNzc3LCAweDM2NDEsIDB4Rjc3OCwgMHgzNjQyLCAweEY3NzksIDB4MzY0MywgMHhGNzdBLCAweDM2NDQsCi0gICAgMHhGNzdCLCAweDM2NDUsIDB4Rjc3QywgMHgzNjQ2LCAweEY3N0QsIDB4MzY0NywgMHhGNzdFLCAweDM2NDgsCi0gICAgMHhGNzdGLCAweDM2NDksIDB4Rjc4MCwgMHgzNjRBLCAweEY3ODEsIDB4MzY0QiwgMHhGNzgyLCAweDM2NEMsCi0gICAgMHhGNzgzLCAweDM2NEQsIDB4Rjc4NCwgMHgzNjRFLCAweEY3ODUsIDB4MzY0RiwgMHhGNzg2LCAweDM2NTAsCi0gICAgMHhGNzg3LCAweDM2NTEsIDB4Rjc4OCwgMHgzNjUyLCAweEY3ODksIDB4MzY1MywgMHhGNzhBLCAweDM2NTQsCi0gICAgMHhGNzhCLCAweDM2NTUsIDB4Rjc4QywgMHgzNjU2LCAweEY3OEQsIDB4MzY1NywgMHhGNzhFLCAweDM2NTgsCi0gICAgMHhGNzhGLCAweDM2NTksIDB4Rjc5MCwgMHgzNjVBLCAweEY3OTEsIDB4MzY1QiwgMHhGNzkyLCAweDM2NUMsCi0gICAgMHhGNzkzLCAweDM2NUQsIDB4Rjc5NCwgMHgzNjVFLCAweEY3OTUsIDB4MzY1RiwgMHhGNzk2LCAweDM2NjAsCi0gICAgMHhGNzk3LCAweDM2NjEsIDB4Rjc5OCwgMHgzNjYyLCAweEY3OTksIDB4MzY2MywgMHhGNzlBLCAweDM2NjQsCi0gICAgMHhGNzlCLCAweDM2NjUsIDB4Rjc5QywgMHgzNjY2LCAweEY3OUQsIDB4MzY2NywgMHhGNzlFLCAweDM2NjgsCi0gICAgMHhGNzlGLCAweDM2NjksIDB4RjdBMCwgMHgzNjZBLCAweEY3QTEsIDB4MzY2QiwgMHhGN0EyLCAweDM2NkMsCi0gICAgMHhGN0EzLCAweDM2NkQsIDB4RjdBNCwgMHgzNjZFLCAweEY3QTUsIDB4MzY2RiwgMHhGN0E2LCAweDM2NzAsCi0gICAgMHhGN0E3LCAweDM2NzEsIDB4RjdBOCwgMHgzNjcyLCAweEY3QTksIDB4MzY3MywgMHhGN0FBLCAweDM2NzQsCi0gICAgMHhGN0FCLCAweDM2NzUsIDB4RjdBQywgMHgzNjc2LCAweEY3QUQsIDB4MzY3NywgMHhGN0FFLCAweDM2NzgsCi0gICAgMHhGN0FGLCAweDM2NzksIDB4RjdCMCwgMHgzNjdBLCAweEY3QjEsIDB4MzY3QiwgMHhGN0IyLCAweDM2N0MsCi0gICAgMHhGN0IzLCAweDM2N0QsIDB4RjdCNCwgMHgzNjdFLCAweEY3QjUsIDB4MzY3RiwgMHhGN0I2LCAweDM2ODAsCi0gICAgMHhGN0I3LCAweDM2ODEsIDB4RjdCOCwgMHgzNjgyLCAweEY3QjksIDB4MzY4MywgMHhGN0JBLCAweDM2ODQsCi0gICAgMHhGN0JCLCAweDM2ODUsIDB4RjdCQywgMHgzNjg2LCAweEY3QkQsIDB4MzY4NywgMHhGN0JFLCAweDM2ODgsCi0gICAgMHhGN0JGLCAweDM2ODksIDB4RjdDMCwgMHgzNjhBLCAweEY3QzEsIDB4MzY4QiwgMHhGN0MyLCAweDM2OEMsCi0gICAgMHhGN0MzLCAweDM2OEQsIDB4RjdDNCwgMHgzNjhFLCAweEY3QzUsIDB4MzY4RiwgMHhGN0M2LCAweDM2OTAsCi0gICAgMHhGN0M3LCAweDM2OTEsIDB4RjdDOCwgMHgzNjkyLCAweEY3QzksIDB4MzY5MywgMHhGN0NBLCAweDM2OTQsCi0gICAgMHhGN0NCLCAweDM2OTUsIDB4RjdDQywgMHgzNjk2LCAweEY3Q0QsIDB4MzY5NywgMHhGN0NFLCAweDM2OTgsCi0gICAgMHhGN0NGLCAweDM2OTksIDB4RjdEMCwgMHgzNjlBLCAweEY3RDEsIDB4MzY5QiwgMHhGN0QyLCAweDM2OUMsCi0gICAgMHhGN0QzLCAweDM2OUQsIDB4RjdENCwgMHgzNjlFLCAweEY3RDUsIDB4MzY5RiwgMHhGN0Q2LCAweDM2QTAsCi0gICAgMHhGN0Q3LCAweDM2QTEsIDB4RjdEOCwgMHgzNkEyLCAweEY3RDksIDB4MzZBMywgMHhGN0RBLCAweDM2QTQsCi0gICAgMHhGN0RCLCAweDM2QTUsIDB4RjdEQywgMHgzNkE2LCAweEY3REQsIDB4MzZBNywgMHhGN0RFLCAweDM2QTgsCi0gICAgMHhGN0RGLCAweDM2QTksIDB4RjdFMCwgMHgzNkFBLCAweEY3RTEsIDB4MzZBQiwgMHhGN0UyLCAweDM2QUMsCi0gICAgMHhGN0UzLCAweDM2QUQsIDB4RjdFNCwgMHgzNkFFLCAweEY3RTUsIDB4MzZBRiwgMHhGN0U2LCAweDM2QjAsCi0gICAgMHhGN0U3LCAweDM2QjEsIDB4RjdFOCwgMHgzNkIyLCAweEY3RTksIDB4MzZCMywgMHhGN0VBLCAweDM2QjQsCi0gICAgMHhGN0VCLCAweDM2QjUsIDB4RjdFQywgMHgzNkI2LCAweEY3RUQsIDB4MzZCNywgMHhGN0VFLCAweDM2QjgsCi0gICAgMHhGODE3LCAweDM2RTEsIDB4RjgxOCwgMHgzNkUyLCAweEY4MTksIDB4MzZFMywgMHhGODFBLCAweDM2RTQsCi0gICAgMHhGODFCLCAweDM2RTUsIDB4RjgxQywgMHgzNkU2LCAweEY4MUQsIDB4MzZFNywgMHhGQTBDLCAweDAyNzQsCi0gICAgMHhGQTBELCAweDIzODEsIDB4RkUzMCwgMHgwMDZELCAweEZFMzEsIDB4MDA3QSwgMHhGRTMzLCAweDM1QUYsCi0gICAgMHhGRTM0LCAweDM1QjEsIDB4RkUzNSwgMHgwMDgyLCAweEZFMzYsIDB4MDA4MywgMHhGRTM3LCAweDAwODYsCi0gICAgMHhGRTM4LCAweDAwODcsIDB4RkUzOSwgMHgwMDhBLCAweEZFM0EsIDB4MDA4QiwgMHhGRTNCLCAweDAwOEUsCi0gICAgMHhGRTNDLCAweDAwOEYsIDB4RkUzRCwgMHgwMDkyLCAweEZFM0UsIDB4MDA5MywgMHhGRTNGLCAweDAwOTYsCi0gICAgMHhGRTQwLCAweDAwOTcsIDB4RkU0MSwgMHgwMDlBLCAweEZFNDIsIDB4MDA5QiwgMHhGRTQzLCAweDAwOUUsCi0gICAgMHhGRTQ0LCAweDAwOUYsIDB4RkU0OSwgMHgwMEM3LCAweEZFNEEsIDB4MDBDOCwgMHhGRTRCLCAweDAwQ0IsCi0gICAgMHhGRTRDLCAweDAwQ0MsIDB4RkU0RCwgMHgwMEM5LCAweEZFNEUsIDB4MDBDQSwgMHhGRTRGLCAweDM1QjIsCi0gICAgMHhGRTUwLCAweDAwNzAsIDB4RkU1MSwgMHgwMDcxLCAweEZFNTIsIDB4MDA3MiwgMHhGRTU0LCAweDAwNzQsCi0gICAgMHhGRTU1LCAweDAwNzUsIDB4RkU1NiwgMHgwMDc2LCAweEZFNTcsIDB4MDA3NywgMHhGRTU5LCAweDAwQTAsCi0gICAgMHhGRTVBLCAweDAwQTEsIDB4RkU1QiwgMHgwMEEyLCAweEZFNUMsIDB4MDBBMywgMHhGRTVELCAweDAwQTQsCi0gICAgMHhGRTVFLCAweDAwQTUsIDB4RkU1RiwgMHgwMENELCAweEZFNjAsIDB4MDBDRSwgMHhGRTYxLCAweDAwQ0YsCi0gICAgMHhGRTYyLCAweDAwREYsIDB4RkU2MywgMHgwMEUwLCAweEZFNjQsIDB4MDBFMSwgMHhGRTY1LCAweDAwRTIsCi0gICAgMHhGRTY2LCAweDAwRTMsIDB4RkU2OCwgMHgwMTAyLCAweEZFNjksIDB4MDEwQywgMHhGRTZBLCAweDAxMEQsCi0gICAgMHhGRTZCLCAweDAxMEUsIDB4RkYwMSwgMHgwMDZDLCAweEZGMDIsIDB4MzZFNCwgMHhGRjAzLCAweDAwQUUsCi0gICAgMHhGRjA0LCAweDAxMDMsIDB4RkYwNSwgMHgwMTA4LCAweEZGMDYsIDB4MDBBRiwgMHhGRjA3LCAweDM2RTMsCi0gICAgMHhGRjA4LCAweDAwODAsIDB4RkYwOSwgMHgwMDgxLCAweEZGMEEsIDB4MDBCMCwgMHhGRjBCLCAweDAwRDAsCi0gICAgMHhGRjBDLCAweDAwNjQsIDB4RkYwRCwgMHgwMEQxLCAweEZGMEUsIDB4MDA2NywgMHhGRjBGLCAweDAxMDEsCi0gICAgMHhGRjEwLCAweDAxNEQsIDB4RkYxMSwgMHgwMTRFLCAweEZGMTIsIDB4MDE0RiwgMHhGRjEzLCAweDAxNTAsCi0gICAgMHhGRjE0LCAweDAxNTEsIDB4RkYxNSwgMHgwMTUyLCAweEZGMTYsIDB4MDE1MywgMHhGRjE3LCAweDAxNTQsCi0gICAgMHhGRjE4LCAweDAxNTUsIDB4RkYxOSwgMHgwMTU2LCAweEZGMUEsIDB4MDA2QSwgMHhGRjFCLCAweDAwNjksCi0gICAgMHhGRjFDLCAweDAwRDYsIDB4RkYxRCwgMHgwMEQ4LCAweEZGMUUsIDB4MDBENywgMHhGRjFGLCAweDAwNkIsCi0gICAgMHhGRjIwLCAweDAxMDksIDB4RkYyMSwgMHgwMTZELCAweEZGMjIsIDB4MDE2RSwgMHhGRjIzLCAweDAxNkYsCi0gICAgMHhGRjI0LCAweDAxNzAsIDB4RkYyNSwgMHgwMTcxLCAweEZGMjYsIDB4MDE3MiwgMHhGRjI3LCAweDAxNzMsCi0gICAgMHhGRjI4LCAweDAxNzQsIDB4RkYyOSwgMHgwMTc1LCAweEZGMkEsIDB4MDE3NiwgMHhGRjJCLCAweDAxNzcsCi0gICAgMHhGRjJDLCAweDAxNzgsIDB4RkYyRCwgMHgwMTc5LCAweEZGMkUsIDB4MDE3QSwgMHhGRjJGLCAweDAxN0IsCi0gICAgMHhGRjMwLCAweDAxN0MsIDB4RkYzMSwgMHgwMTdELCAweEZGMzIsIDB4MDE3RSwgMHhGRjMzLCAweDAxN0YsCi0gICAgMHhGRjM0LCAweDAxODAsIDB4RkYzNSwgMHgwMTgxLCAweEZGMzYsIDB4MDE4MiwgMHhGRjM3LCAweDAxODMsCi0gICAgMHhGRjM4LCAweDAxODQsIDB4RkYzOSwgMHgwMTg1LCAweEZGM0EsIDB4MDE4NiwgMHhGRjNCLCAweDM1QkUsCi0gICAgMHhGRjNDLCAweDAxMDIsIDB4RkYzRCwgMHgzNUJGLCAweEZGM0UsIDB4MzVCNCwgMHhGRjNGLCAweDAwQzUsCi0gICAgMHhGRjQxLCAweDAxODcsIDB4RkY0MiwgMHgwMTg4LCAweEZGNDMsIDB4MDE4OSwgMHhGRjQ0LCAweDAxOEEsCi0gICAgMHhGRjQ1LCAweDAxOEIsIDB4RkY0NiwgMHgwMThDLCAweEZGNDcsIDB4MDE4RCwgMHhGRjQ4LCAweDAxOEUsCi0gICAgMHhGRjQ5LCAweDAxOEYsIDB4RkY0QSwgMHgwMTkwLCAweEZGNEIsIDB4MDE5MSwgMHhGRjRDLCAweDAxOTIsCi0gICAgMHhGRjRELCAweDAxOTMsIDB4RkY0RSwgMHgwMTk0LCAweEZGNEYsIDB4MDE5NSwgMHhGRjUwLCAweDAxOTYsCi0gICAgMHhGRjUxLCAweDAxOTcsIDB4RkY1MiwgMHgwMTk4LCAweEZGNTMsIDB4MDE5OSwgMHhGRjU0LCAweDAxOUEsCi0gICAgMHhGRjU1LCAweDAxOUIsIDB4RkY1NiwgMHgwMTlDLCAweEZGNTcsIDB4MDE5RCwgMHhGRjU4LCAweDAxOUUsCi0gICAgMHhGRjU5LCAweDAxOUYsIDB4RkY1QSwgMHgwMUEwLCAweEZGNUIsIDB4MDA4NCwgMHhGRjVDLCAweDAwNzgsCi0gICAgMHhGRjVELCAweDAwODUsIDB4RkY1RSwgMHgwMEU0LCAweEZGNjQsIDB4MDA3MSwgMHhGRkUwLCAweDAxMDYsCi0gICAgMHhGRkUxLCAweDAxMDcsIDB4RkZFMiwgMHgzNkUxLCAweEZGRTMsIDB4MDBDNCwgMHhGRkU0LCAweDM2RTIsCi0gICAgMHhGRkU1LCAweDAxMDQsCi19OwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0IGdfRlhDTUFQX1VuaUNOU19VVEYxNl9IXzBfRFdvcmRbMyAqIDNdID0gewotICAgIDB4RDg0MCwgMHhEQzhBLCAweDM2QjIsIDB4RDg0MCwgMHhEQ0NDLCAweDM2QjAsIDB4RDg1RCwgMHhERTA3LCAweDM2QjgsCisjaW5jbHVkZSAiY21hcHNfY25zMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQX1VuaUNOU19VVEYxNl9IXzBbMTQ1NTcgKiAyXSA9IHsKKyAgICAweDAwMjAsIDB4MDAwMSwgMHgwMDIxLCAweDAwMDIsIDB4MDAyMiwgMHgwMDAzLCAweDAwMjMsIDB4MDAwNCwgMHgwMDI0LAorICAgIDB4MDAwNSwgMHgwMDI1LCAweDAwMDYsIDB4MDAyNiwgMHgwMDA3LCAweDAwMjcsIDB4MDAwOCwgMHgwMDI4LCAweDAwMDksCisgICAgMHgwMDI5LCAweDAwMEEsIDB4MDAyQSwgMHgwMDBCLCAweDAwMkIsIDB4MDAwQywgMHgwMDJDLCAweDAwMEQsIDB4MDAyRCwKKyAgICAweDAwMEUsIDB4MDAyRSwgMHgwMDBGLCAweDAwMkYsIDB4MDAxMCwgMHgwMDMwLCAweDAwMTEsIDB4MDAzMSwgMHgwMDEyLAorICAgIDB4MDAzMiwgMHgwMDEzLCAweDAwMzMsIDB4MDAxNCwgMHgwMDM0LCAweDAwMTUsIDB4MDAzNSwgMHgwMDE2LCAweDAwMzYsCisgICAgMHgwMDE3LCAweDAwMzcsIDB4MDAxOCwgMHgwMDM4LCAweDAwMTksIDB4MDAzOSwgMHgwMDFBLCAweDAwM0EsIDB4MDAxQiwKKyAgICAweDAwM0IsIDB4MDAxQywgMHgwMDNDLCAweDAwMUQsIDB4MDAzRCwgMHgwMDFFLCAweDAwM0UsIDB4MDAxRiwgMHgwMDNGLAorICAgIDB4MDAyMCwgMHgwMDQwLCAweDAwMjEsIDB4MDA0MSwgMHgwMDIyLCAweDAwNDIsIDB4MDAyMywgMHgwMDQzLCAweDAwMjQsCisgICAgMHgwMDQ0LCAweDAwMjUsIDB4MDA0NSwgMHgwMDI2LCAweDAwNDYsIDB4MDAyNywgMHgwMDQ3LCAweDAwMjgsIDB4MDA0OCwKKyAgICAweDAwMjksIDB4MDA0OSwgMHgwMDJBLCAweDAwNEEsIDB4MDAyQiwgMHgwMDRCLCAweDAwMkMsIDB4MDA0QywgMHgwMDJELAorICAgIDB4MDA0RCwgMHgwMDJFLCAweDAwNEUsIDB4MDAyRiwgMHgwMDRGLCAweDAwMzAsIDB4MDA1MCwgMHgwMDMxLCAweDAwNTEsCisgICAgMHgwMDMyLCAweDAwNTIsIDB4MDAzMywgMHgwMDUzLCAweDAwMzQsIDB4MDA1NCwgMHgwMDM1LCAweDAwNTUsIDB4MDAzNiwKKyAgICAweDAwNTYsIDB4MDAzNywgMHgwMDU3LCAweDAwMzgsIDB4MDA1OCwgMHgwMDM5LCAweDAwNTksIDB4MDAzQSwgMHgwMDVBLAorICAgIDB4MDAzQiwgMHgwMDVCLCAweDAwM0MsIDB4MDA1QywgMHgwMDNELCAweDAwNUQsIDB4MDAzRSwgMHgwMDVFLCAweDAwM0YsCisgICAgMHgwMDVGLCAweDAwNDAsIDB4MDA2MCwgMHgwMDQxLCAweDAwNjEsIDB4MDA0MiwgMHgwMDYyLCAweDAwNDMsIDB4MDA2MywKKyAgICAweDAwNDQsIDB4MDA2NCwgMHgwMDQ1LCAweDAwNjUsIDB4MDA0NiwgMHgwMDY2LCAweDAwNDcsIDB4MDA2NywgMHgwMDQ4LAorICAgIDB4MDA2OCwgMHgwMDQ5LCAweDAwNjksIDB4MDA0QSwgMHgwMDZBLCAweDAwNEIsIDB4MDA2QiwgMHgwMDRDLCAweDAwNkMsCisgICAgMHgwMDRELCAweDAwNkQsIDB4MDA0RSwgMHgwMDZFLCAweDAwNEYsIDB4MDA2RiwgMHgwMDUwLCAweDAwNzAsIDB4MDA1MSwKKyAgICAweDAwNzEsIDB4MDA1MiwgMHgwMDcyLCAweDAwNTMsIDB4MDA3MywgMHgwMDU0LCAweDAwNzQsIDB4MDA1NSwgMHgwMDc1LAorICAgIDB4MDA1NiwgMHgwMDc2LCAweDAwNTcsIDB4MDA3NywgMHgwMDU4LCAweDAwNzgsIDB4MDA1OSwgMHgwMDc5LCAweDAwNUEsCisgICAgMHgwMDdBLCAweDAwNUIsIDB4MDA3QiwgMHgwMDVDLCAweDAwN0MsIDB4MDA1RCwgMHgwMDdELCAweDAwNUUsIDB4MDA3RSwKKyAgICAweDAwNUYsIDB4MDBBMiwgMHgwMTA2LCAweDAwQTMsIDB4MDEwNywgMHgwMEE1LCAweDAxMDQsIDB4MDBBNywgMHgwMEIyLAorICAgIDB4MDBBOCwgMHgzNUIzLCAweDAwQUMsIDB4MzZFMSwgMHgwMEFGLCAweDAwQzMsIDB4MDBCMCwgMHgwMTE4LCAweDAwQjEsCisgICAgMHgwMEQ0LCAweDAwQjcsIDB4MDA3MywgMHgwMEQ3LCAweDAwRDIsIDB4MDBGNywgMHgwMEQzLCAweDAyQzYsIDB4MzVCNCwKKyAgICAweDAyQzcsIDB4MDFGOCwgMHgwMkNBLCAweDAxRjcsIDB4MDJDQiwgMHgwMUY5LCAweDAyQ0QsIDB4MDBDNiwgMHgwMkQ5LAorICAgIDB4MDFGNiwgMHgwMzA4LCAweDM1QjMsIDB4MDM5MSwgMHgwMUExLCAweDAzOTIsIDB4MDFBMiwgMHgwMzkzLCAweDAxQTMsCisgICAgMHgwMzk0LCAweDAxQTQsIDB4MDM5NSwgMHgwMUE1LCAweDAzOTYsIDB4MDFBNiwgMHgwMzk3LCAweDAxQTcsIDB4MDM5OCwKKyAgICAweDAxQTgsIDB4MDM5OSwgMHgwMUE5LCAweDAzOUEsIDB4MDFBQSwgMHgwMzlCLCAweDAxQUIsIDB4MDM5QywgMHgwMUFDLAorICAgIDB4MDM5RCwgMHgwMUFELCAweDAzOUUsIDB4MDFBRSwgMHgwMzlGLCAweDAxQUYsIDB4MDNBMCwgMHgwMUIwLCAweDAzQTEsCisgICAgMHgwMUIxLCAweDAzQTMsIDB4MDFCMiwgMHgwM0E0LCAweDAxQjMsIDB4MDNBNSwgMHgwMUI0LCAweDAzQTYsIDB4MDFCNSwKKyAgICAweDAzQTcsIDB4MDFCNiwgMHgwM0E4LCAweDAxQjcsIDB4MDNBOSwgMHgwMUI4LCAweDAzQjEsIDB4MDFCOSwgMHgwM0IyLAorICAgIDB4MDFCQSwgMHgwM0IzLCAweDAxQkIsIDB4MDNCNCwgMHgwMUJDLCAweDAzQjUsIDB4MDFCRCwgMHgwM0I2LCAweDAxQkUsCisgICAgMHgwM0I3LCAweDAxQkYsIDB4MDNCOCwgMHgwMUMwLCAweDAzQjksIDB4MDFDMSwgMHgwM0JBLCAweDAxQzIsIDB4MDNCQiwKKyAgICAweDAxQzMsIDB4MDNCQywgMHgwMUM0LCAweDAzQkQsIDB4MDFDNSwgMHgwM0JFLCAweDAxQzYsIDB4MDNCRiwgMHgwMUM3LAorICAgIDB4MDNDMCwgMHgwMUM4LCAweDAzQzEsIDB4MDFDOSwgMHgwM0MzLCAweDAxQ0EsIDB4MDNDNCwgMHgwMUNCLCAweDAzQzUsCisgICAgMHgwMUNDLCAweDAzQzYsIDB4MDFDRCwgMHgwM0M3LCAweDAxQ0UsIDB4MDNDOCwgMHgwMUNGLCAweDAzQzksIDB4MDFEMCwKKyAgICAweDA0MDEsIDB4MzY3MCwgMHgwNDEwLCAweDM2NkEsIDB4MDQxMSwgMHgzNjZCLCAweDA0MTIsIDB4MzY2QywgMHgwNDEzLAorICAgIDB4MzY2RCwgMHgwNDE0LCAweDM2NkUsIDB4MDQxNSwgMHgzNjZGLCAweDA0MTYsIDB4MzY3MSwgMHgwNDE3LCAweDM2NzIsCisgICAgMHgwNDE4LCAweDM2NzMsIDB4MDQxOSwgMHgzNjc0LCAweDA0MUEsIDB4MzY3NSwgMHgwNDFCLCAweDM2NzYsIDB4MDQxQywKKyAgICAweDM2NzcsIDB4MDQxRCwgMHgzNjc4LCAweDA0MUUsIDB4MzY3OSwgMHgwNDFGLCAweDM2N0EsIDB4MDQyMCwgMHgzNjdCLAorICAgIDB4MDQyMSwgMHgzNjdDLCAweDA0MjIsIDB4MzY3RCwgMHgwNDIzLCAweDM2N0UsIDB4MDQyNCwgMHgzNjdGLCAweDA0MjUsCisgICAgMHgzNjgwLCAweDA0MjYsIDB4MzY4MSwgMHgwNDI3LCAweDM2ODIsIDB4MDQyOCwgMHgzNjgzLCAweDA0MjksIDB4MzY4NCwKKyAgICAweDA0MkEsIDB4MzY4NSwgMHgwNDJCLCAweDM2ODYsIDB4MDQyQywgMHgzNjg3LCAweDA0MkQsIDB4MzY4OCwgMHgwNDJFLAorICAgIDB4MzY4OSwgMHgwNDJGLCAweDM2OEEsIDB4MDQzMCwgMHgzNjhCLCAweDA0MzEsIDB4MzY4QywgMHgwNDMyLCAweDM2OEQsCisgICAgMHgwNDMzLCAweDM2OEUsIDB4MDQzNCwgMHgzNjhGLCAweDA0MzUsIDB4MzY5MCwgMHgwNDM2LCAweDM2OTIsIDB4MDQzNywKKyAgICAweDM2OTMsIDB4MDQzOCwgMHgzNjk0LCAweDA0MzksIDB4MzY5NSwgMHgwNDNBLCAweDM2OTYsIDB4MDQzQiwgMHgzNjk3LAorICAgIDB4MDQzQywgMHgzNjk4LCAweDA0M0QsIDB4MzY5OSwgMHgwNDNFLCAweDM2OUEsIDB4MDQzRiwgMHgzNjlCLCAweDA0NDAsCisgICAgMHgzNjlDLCAweDA0NDEsIDB4MzY5RCwgMHgwNDQyLCAweDM2OUUsIDB4MDQ0MywgMHgzNjlGLCAweDA0NDQsIDB4MzZBMCwKKyAgICAweDA0NDUsIDB4MzZBMSwgMHgwNDQ2LCAweDM2QTIsIDB4MDQ0NywgMHgzNkEzLCAweDA0NDgsIDB4MzZBNCwgMHgwNDQ5LAorICAgIDB4MzZBNSwgMHgwNDRBLCAweDM2QTYsIDB4MDQ0QiwgMHgzNkE3LCAweDA0NEMsIDB4MzZBOCwgMHgwNDRELCAweDM2QTksCisgICAgMHgwNDRFLCAweDM2QUEsIDB4MDQ0RiwgMHgzNkFCLCAweDA0NTEsIDB4MzY5MSwgMHgyMDEzLCAweDAwNzksIDB4MjAxNCwKKyAgICAweDAwN0IsIDB4MjAxOCwgMHgwMEE2LCAweDIwMTksIDB4MDBBNywgMHgyMDFDLCAweDAwQTgsIDB4MjAxRCwgMHgwMEE5LAorICAgIDB4MjAyMiwgMHgwMDY4LCAweDIwMjUsIDB4MDA2RiwgMHgyMDI2LCAweDAwNkUsIDB4MjAyNywgMHgwMDY4LCAweDIwMzIsCisgICAgMHgwMEFELCAweDIwMzUsIDB4MDBBQywgMHgyMDNCLCAweDAwQjEsIDB4MjAzRSwgMHgwMEMzLCAweDIxMDMsIDB4MDEwQSwKKyAgICAweDIxMDUsIDB4MDBDMiwgMHgyMTA5LCAweDAxMEIsIDB4MjExNiwgMHgzNkU2LCAweDIxMjEsIDB4MzZFNywgMHgyMTYwLAorICAgIDB4MDE1NywgMHgyMTYxLCAweDAxNTgsIDB4MjE2MiwgMHgwMTU5LCAweDIxNjMsIDB4MDE1QSwgMHgyMTY0LCAweDAxNUIsCisgICAgMHgyMTY1LCAweDAxNUMsIDB4MjE2NiwgMHgwMTVELCAweDIxNjcsIDB4MDE1RSwgMHgyMTY4LCAweDAxNUYsIDB4MjE2OSwKKyAgICAweDAxNjAsIDB4MjE3MCwgMHgwMjBFLCAweDIxNzEsIDB4MDIwRiwgMHgyMTcyLCAweDAyMTAsIDB4MjE3MywgMHgwMjExLAorICAgIDB4MjE3NCwgMHgwMjEyLCAweDIxNzUsIDB4MDIxMywgMHgyMTc2LCAweDAyMTQsIDB4MjE3NywgMHgwMjE1LCAweDIxNzgsCisgICAgMHgwMjE2LCAweDIxNzksIDB4MDIxNywgMHgyMTkwLCAweDAwRjgsIDB4MjE5MSwgMHgwMEY1LCAweDIxOTIsIDB4MDBGNywKKyAgICAweDIxOTMsIDB4MDBGNiwgMHgyMTk2LCAweDAwRjksIDB4MjE5NywgMHgwMEZBLCAweDIxOTgsIDB4MDBGQywgMHgyMTk5LAorICAgIDB4MDBGQiwgMHgyMUI4LCAweDM2QUQsIDB4MjFCOSwgMHgzNkFFLCAweDIxRTcsIDB4MzZBQywgMHgyMjE1LCAweDAxMDEsCisgICAgMHgyMjFBLCAweDAwRDUsIDB4MjIxRSwgMHgwMERDLCAweDIyMUYsIDB4MDBFOSwgMHgyMjIwLCAweDAwRTgsIDB4MjIyMywKKyAgICAweDAwRkUsIDB4MjIyNSwgMHgwMEZELCAweDIyMjksIDB4MDBFNSwgMHgyMjJBLCAweDAwRTYsIDB4MjIyQiwgMHgwMEVELAorICAgIDB4MjIyRSwgMHgwMEVFLCAweDIyMzQsIDB4MDBGMCwgMHgyMjM1LCAweDAwRUYsIDB4MjIzQywgMHgwMEU0LCAweDIyNTIsCisgICAgMHgwMERELCAweDIyNjAsIDB4MDBEQiwgMHgyMjYxLCAweDAwREUsIDB4MjI2NiwgMHgwMEQ5LCAweDIyNjcsIDB4MDBEQSwKKyAgICAweDIyOTUsIDB4MDBGMywgMHgyMjk5LCAweDAwRjQsIDB4MjJBNSwgMHgwMEU3LCAweDIyQkYsIDB4MDBFQSwgMHgyMkVGLAorICAgIDB4MDA2RSwgMHgyNDAwLCAweDAyMzIsIDB4MjQwMSwgMHgwMjMzLCAweDI0MDIsIDB4MDIzNCwgMHgyNDAzLCAweDAyMzUsCisgICAgMHgyNDA0LCAweDAyMzYsIDB4MjQwNSwgMHgwMjM3LCAweDI0MDYsIDB4MDIzOCwgMHgyNDA3LCAweDAyMzksIDB4MjQwOCwKKyAgICAweDAyM0EsIDB4MjQwOSwgMHgwMjNCLCAweDI0MEEsIDB4MDIzQywgMHgyNDBCLCAweDAyM0QsIDB4MjQwQywgMHgwMjNFLAorICAgIDB4MjQwRCwgMHgwMjNGLCAweDI0MEUsIDB4MDI0MCwgMHgyNDBGLCAweDAyNDEsIDB4MjQxMCwgMHgwMjQyLCAweDI0MTEsCisgICAgMHgwMjQzLCAweDI0MTIsIDB4MDI0NCwgMHgyNDEzLCAweDAyNDUsIDB4MjQxNCwgMHgwMjQ2LCAweDI0MTUsIDB4MDI0NywKKyAgICAweDI0MTYsIDB4MDI0OCwgMHgyNDE3LCAweDAyNDksIDB4MjQxOCwgMHgwMjRBLCAweDI0MTksIDB4MDI0QiwgMHgyNDFBLAorICAgIDB4MDI0QywgMHgyNDFCLCAweDAyNEQsIDB4MjQxQywgMHgwMjRFLCAweDI0MUQsIDB4MDI0RiwgMHgyNDFFLCAweDAyNTAsCisgICAgMHgyNDFGLCAweDAyNTEsIDB4MjQyMSwgMHgwMjUyLCAweDI0NjAsIDB4MDFGQSwgMHgyNDYxLCAweDAxRkIsIDB4MjQ2MiwKKyAgICAweDAxRkMsIDB4MjQ2MywgMHgwMUZELCAweDI0NjQsIDB4MDFGRSwgMHgyNDY1LCAweDAxRkYsIDB4MjQ2NiwgMHgwMjAwLAorICAgIDB4MjQ2NywgMHgwMjAxLCAweDI0NjgsIDB4MDIwMiwgMHgyNDY5LCAweDAyMDMsIDB4MjQ3NCwgMHgwMjA0LCAweDI0NzUsCisgICAgMHgwMjA1LCAweDI0NzYsIDB4MDIwNiwgMHgyNDc3LCAweDAyMDcsIDB4MjQ3OCwgMHgwMjA4LCAweDI0NzksIDB4MDIwOSwKKyAgICAweDI0N0EsIDB4MDIwQSwgMHgyNDdCLCAweDAyMEIsIDB4MjQ3QywgMHgwMjBDLCAweDI0N0QsIDB4MDIwRCwgMHgyNTAwLAorICAgIDB4MDEzNywgMHgyNTAyLCAweDAxMzgsIDB4MjUwQywgMHgwMTNBLCAweDI1MTAsIDB4MDEzQiwgMHgyNTE0LCAweDAxM0MsCisgICAgMHgyNTE4LCAweDAxM0QsIDB4MjUxQywgMHgwMTM1LCAweDI1MjQsIDB4MDEzNCwgMHgyNTJDLCAweDAxMzMsIDB4MjUzNCwKKyAgICAweDAxMzIsIDB4MjUzQywgMHgwMTMxLCAweDI1NTAsIDB4MDE0MiwgMHgyNTUxLCAweDM3MEEsIDB4MjU1MiwgMHgzNkY4LAorICAgIDB4MjU1MywgMHgzNzAxLCAweDI1NTQsIDB4MzZFRiwgMHgyNTU1LCAweDM2RkEsIDB4MjU1NiwgMHgzNzAzLCAweDI1NTcsCisgICAgMHgzNkYxLCAweDI1NTgsIDB4MzZGRSwgMHgyNTU5LCAweDM3MDcsIDB4MjU1QSwgMHgzNkY1LCAweDI1NUIsIDB4MzcwMCwKKyAgICAweDI1NUMsIDB4MzcwOSwgMHgyNTVELCAweDM2RjcsIDB4MjU1RSwgMHgwMTQzLCAweDI1NUYsIDB4MzcwNCwgMHgyNTYwLAorICAgIDB4MzZGMiwgMHgyNTYxLCAweDAxNDUsIDB4MjU2MiwgMHgzNzA2LCAweDI1NjMsIDB4MzZGNCwgMHgyNTY0LCAweDM2RjksCisgICAgMHgyNTY1LCAweDM3MDIsIDB4MjU2NiwgMHgzNkYwLCAweDI1NjcsIDB4MzZGRiwgMHgyNTY4LCAweDM3MDgsIDB4MjU2OSwKKyAgICAweDM2RjYsIDB4MjU2QSwgMHgwMTQ0LCAweDI1NkIsIDB4MzcwNSwgMHgyNTZDLCAweDM2RjMsIDB4MjU2RCwgMHgwMTNFLAorICAgIDB4MjU2RSwgMHgwMTNGLCAweDI1NkYsIDB4MDE0MSwgMHgyNTcwLCAweDAxNDAsIDB4MjU3MSwgMHgwMTRBLCAweDI1NzIsCisgICAgMHgwMTRCLCAweDI1NzMsIDB4MDE0QywgMHgyNTc0LCAweDM1QjAsIDB4MjU4MSwgMHgwMTIyLCAweDI1ODIsIDB4MDEyMywKKyAgICAweDI1ODMsIDB4MDEyNCwgMHgyNTg0LCAweDAxMjUsIDB4MjU4NSwgMHgwMTI2LCAweDI1ODYsIDB4MDEyNywgMHgyNTg3LAorICAgIDB4MDEyOCwgMHgyNTg4LCAweDAxMjksIDB4MjU4OSwgMHgwMTMwLCAweDI1OEEsIDB4MDEyRiwgMHgyNThCLCAweDAxMkUsCisgICAgMHgyNThDLCAweDAxMkQsIDB4MjU4RCwgMHgwMTJDLCAweDI1OEUsIDB4MDEyQiwgMHgyNThGLCAweDAxMkEsIDB4MjU5MywKKyAgICAweDM3MTAsIDB4MjU5NCwgMHgwMTM2LCAweDI1OTUsIDB4MDEzOSwgMHgyNUEwLCAweDAwQkUsIDB4MjVBMSwgMHgwMEJELAorICAgIDB4MjVCMiwgMHgwMEI3LCAweDI1QjMsIDB4MDBCNiwgMHgyNUJDLCAweDAwQzAsIDB4MjVCRCwgMHgwMEJGLCAweDI1QzYsCisgICAgMHgwMEJDLCAweDI1QzcsIDB4MDBCQiwgMHgyNUNCLCAweDAwQjQsIDB4MjVDRSwgMHgwMEI4LCAweDI1Q0YsIDB4MDBCNSwKKyAgICAweDI1RTIsIDB4MDE0NiwgMHgyNUUzLCAweDAxNDcsIDB4MjVFNCwgMHgwMTQ5LCAweDI1RTUsIDB4MDE0OCwgMHgyNjA1LAorICAgIDB4MDBCQSwgMHgyNjA2LCAweDAwQjksIDB4MjYwOSwgMHgwMEY0LCAweDI2NDAsIDB4MDBGMSwgMHgyNjQxLCAweDAwRjMsCisgICAgMHgyNjQyLCAweDAwRjIsIDB4MjczRCwgMHgzNUMwLCAweDJGMDAsIDB4MDI1MywgMHgyRjAxLCAweDAyMTgsIDB4MkYwMiwKKyAgICAweDAyMTksIDB4MkYwMywgMHgwMjFBLCAweDJGMDQsIDB4MDI1NCwgMHgyRjA1LCAweDAyMUIsIDB4MkYwNiwgMHgwMjVBLAorICAgIDB4MkYwNywgMHgwMjFDLCAweDJGMDgsIDB4MDI1QiwgMHgyRjA5LCAweDAyNUMsIDB4MkYwQSwgMHgwMjVELCAweDJGMEIsCisgICAgMHgwMjVFLCAweDJGMEMsIDB4MDIxRCwgMHgyRjBELCAweDAyMUUsIDB4MkYwRSwgMHgwMjFGLCAweDJGMEYsIDB4MDI1RiwKKyAgICAweDJGMTAsIDB4MTc2RSwgMHgyRjExLCAweDAyNjAsIDB4MkYxMiwgMHgwMjYyLCAweDJGMTMsIDB4MDIyMCwgMHgyRjE0LAorICAgIDB4MDI2MywgMHgyRjE1LCAweDE3NkYsIDB4MkYxNiwgMHgwMjIxLCAweDJGMTcsIDB4MDI2NCwgMHgyRjE4LCAweDAyNjUsCisgICAgMHgyRjE5LCAweDAyMjIsIDB4MkYxQSwgMHgxNzcwLCAweDJGMUIsIDB4MDIyMywgMHgyRjFDLCAweDAyNjYsIDB4MkYxRCwKKyAgICAweDAyNzksIDB4MkYxRSwgMHgxNzc1LCAweDJGMUYsIDB4MDI3QSwgMHgyRjIwLCAweDAyN0IsIDB4MkYyMSwgMHgwMjI0LAorICAgIDB4MkYyMiwgMHgwMjI0LCAweDJGMjMsIDB4MDI3QywgMHgyRjI0LCAweDAyN0QsIDB4MkYyNSwgMHgwMjdFLCAweDJGMjYsCisgICAgMHgwMjdGLCAweDJGMjcsIDB4MDIyNSwgMHgyRjI4LCAweDAyODIsIDB4MkYyOSwgMHgwMjgzLCAweDJGMkEsIDB4MDI4NCwKKyAgICAweDJGMkIsIDB4MDI4NSwgMHgyRjJDLCAweDE3NzYsIDB4MkYyRCwgMHgwMjg2LCAweDJGMkUsIDB4MDIyNiwgMHgyRjJGLAorICAgIDB4MDI4OCwgMHgyRjMwLCAweDAyODksIDB4MkYzMSwgMHgwMjhDLCAweDJGMzIsIDB4MDI4RCwgMHgyRjMzLCAweDAyMjcsCisgICAgMHgyRjM0LCAweDAyMjgsIDB4MkYzNSwgMHgwMjI5LCAweDJGMzYsIDB4MDI4RSwgMHgyRjM3LCAweDAyOEYsIDB4MkYzOCwKKyAgICAweDAyOTAsIDB4MkYzOSwgMHgwMjJBLCAweDJGM0EsIDB4MDIyQiwgMHgyRjNCLCAweDE3NzcsIDB4MkYzQywgMHgwMkQwLAorICAgIDB4MkYzRCwgMHgwMkQxLCAweDJGM0UsIDB4MDJEMiwgMHgyRjNGLCAweDAyRDMsIDB4MkY0MCwgMHgwMkQ1LCAweDJGNDEsCisgICAgMHgwMjJDLCAweDJGNDIsIDB4MDJENiwgMHgyRjQzLCAweDAyRDcsIDB4MkY0NCwgMHgwMkQ4LCAweDJGNDUsIDB4MDJEOSwKKyAgICAweDJGNDYsIDB4MDIyRCwgMHgyRjQ3LCAweDAyREEsIDB4MkY0OCwgMHgwMkRCLCAweDJGNDksIDB4MDJEQywgMHgyRjRBLAorICAgIDB4MDJERCwgMHgyRjRCLCAweDAyREUsIDB4MkY0QywgMHgwMkRGLCAweDJGNEQsIDB4MDJFMCwgMHgyRjRFLCAweDE3OEEsCisgICAgMHgyRjRGLCAweDAyRTEsIDB4MkY1MCwgMHgwMkUyLCAweDJGNTEsIDB4MDJFMywgMHgyRjUyLCAweDAyRTQsIDB4MkY1MywKKyAgICAweDE3OEMsIDB4MkY1NCwgMHgwMkU1LCAweDJGNTUsIDB4MDJFNiwgMHgyRjU2LCAweDAyRTcsIDB4MkY1NywgMHgwMkU4LAorICAgIDB4MkY1OCwgMHgwMkU5LCAweDJGNTksIDB4MTc4RCwgMHgyRjVBLCAweDAyRUEsIDB4MkY1QiwgMHgwMkVCLCAweDJGNUMsCisgICAgMHgwMkVDLCAweDJGNUQsIDB4MDJFRCwgMHgyRjVFLCAweDAzNTYsIDB4MkY1RiwgMHgwMzU3LCAweDJGNjAsIDB4MDM1OCwKKyAgICAweDJGNjEsIDB4MDM1OSwgMHgyRjYyLCAweDAzNUEsIDB4MkY2MywgMHgwMzVCLCAweDJGNjQsIDB4MDM1QywgMHgyRjY1LAorICAgIDB4MDM1RSwgMHgyRjY2LCAweDAzNjIsIDB4MkY2NywgMHgwMjJFLCAweDJGNjgsIDB4MDIyRiwgMHgyRjY5LCAweDAzNjMsCisgICAgMHgyRjZBLCAweDAzNjQsIDB4MkY2QiwgMHgwMzY1LCAweDJGNkMsIDB4MDM2NiwgMHgyRjZELCAweDAzNjcsIDB4MkY2RSwKKyAgICAweDAzNjgsIDB4MkY2RiwgMHgwMzY5LCAweDJGNzAsIDB4MDM2QSwgMHgyRjcxLCAweDE3QjIsIDB4MkY3MiwgMHgwMzZCLAorICAgIDB4MkY3MywgMHgwMzZDLCAweDJGNzQsIDB4MDM2RCwgMHgyRjc1LCAweDAzRjYsIDB4MkY3NiwgMHgwM0Y3LCAweDJGNzcsCisgICAgMHgwM0Y4LCAweDJGNzgsIDB4MDNGOSwgMHgyRjc5LCAweDE4MTIsIDB4MkY3QSwgMHgwM0ZBLCAweDJGN0IsIDB4MDNGQiwKKyAgICAweDJGN0MsIDB4MDNGQywgMHgyRjdELCAweDAzRkUsIDB4MkY3RSwgMHgwM0ZGLCAweDJGN0YsIDB4MDQwMCwgMHgyRjgwLAorICAgIDB4MDQwMSwgMHgyRjgxLCAweDA0MDIsIDB4MkY4MiwgMHgwNDA1LCAweDJGODMsIDB4MDQwNiwgMHgyRjg0LCAweDA0MDcsCisgICAgMHgyRjg1LCAweDA0MDgsIDB4MkY4NiwgMHgwNDA5LCAweDJGODcsIDB4MDQwQSwgMHgyRjg4LCAweDA0MEIsIDB4MkY4OSwKKyAgICAweDA0MEMsIDB4MkY4QSwgMHgwNDBELCAweDJGOEIsIDB4MTgxMywgMHgyRjhDLCAweDE4MTgsIDB4MkY4RCwgMHgwNDBGLAorICAgIDB4MkY4RSwgMHgwNDEwLCAweDJGOEYsIDB4MDQxMSwgMHgyRjkwLCAweDA0MTIsIDB4MkY5MSwgMHgxODE5LCAweDJGOTIsCisgICAgMHgwNTA4LCAweDJGOTMsIDB4MDUwOSwgMHgyRjk0LCAweDA1MEEsIDB4MkY5NSwgMHgwNTBCLCAweDJGOTYsIDB4MDUwQywKKyAgICAweDJGOTcsIDB4MDUwRCwgMHgyRjk4LCAweDE4RTcsIDB4MkY5OSwgMHgwNTBFLCAweDJGOUEsIDB4MDUwRiwgMHgyRjlCLAorICAgIDB4MDUxMCwgMHgyRjlDLCAweDA1MTEsIDB4MkY5RCwgMHgwNTEyLCAweDJGOUUsIDB4MDUxMywgMHgyRjlGLCAweDA1MTQsCisgICAgMHgyRkEwLCAweDA1MTUsIDB4MkZBMSwgMHgwMjMwLCAweDJGQTIsIDB4MDUxQiwgMHgyRkEzLCAweDA1MjAsIDB4MkZBNCwKKyAgICAweDA1MjEsIDB4MkZBNSwgMHgwNTIyLCAweDJGQTYsIDB4MDY5NiwgMHgyRkE3LCAweDA2OTcsIDB4MkZBOCwgMHgwNjk4LAorICAgIDB4MkZBOSwgMHgwNjk5LCAweDJGQUEsIDB4MDIzMSwgMHgyRkFCLCAweDA2OUYsIDB4MkZBQywgMHgwNkEwLCAweDJGQUUsCisgICAgMHgwNkEyLCAweDJGQUYsIDB4MDgyNiwgMHgyRkIwLCAweDA4MjcsIDB4MkZCMSwgMHgwODI4LCAweDJGQjIsIDB4MDgyOSwKKyAgICAweDJGQjMsIDB4MDgyQSwgMHgyRkI0LCAweDA4MkIsIDB4MkZCNSwgMHgwODJDLCAweDJGQjYsIDB4MDgyRCwgMHgyRkI3LAorICAgIDB4MDgyRSwgMHgyRkI4LCAweDA4MkYsIDB4MkZCOSwgMHgwODMwLCAweDJGQkEsIDB4MDlGNSwgMHgyRkJCLCAweDA5RjYsCisgICAgMHgyRkJDLCAweDA5RjcsIDB4MkZCRCwgMHgxRTMzLCAweDJGQkUsIDB4MDlGOCwgMHgyRkJGLCAweDFFMzQsIDB4MkZDMCwKKyAgICAweDA5RjksIDB4MkZDMSwgMHgwOUZBLCAweDJGQzIsIDB4MEJFMSwgMHgyRkMzLCAweDBCRTIsIDB4MkZDNCwgMHgwQkUzLAorICAgIDB4MkZDNSwgMHgwQkU0LCAweDJGQzYsIDB4MEJFNSwgMHgyRkM3LCAweDBCRTYsIDB4MkZDOCwgMHgwREJCLCAweDJGQzksCisgICAgMHgwREJDLCAweDJGQ0EsIDB4MERCRCwgMHgyRkNCLCAweDIzNjAsIDB4MkZDQywgMHgyNjEyLCAweDJGQ0QsIDB4MEY3QiwKKyAgICAweDJGQ0UsIDB4MEY3QywgMHgyRkNGLCAweDBGN0QsIDB4MkZEMCwgMHgxMTAwLCAweDJGRDEsIDB4MTEwMSwgMHgyRkQyLAorICAgIDB4MTI4OSwgMHgyRkQzLCAweDEzQjIsIDB4MkZENCwgMHgxM0IzLCAweDJGRDUsIDB4MkYwRCwgMHgzMDAwLCAweDAwNjMsCisgICAgMHgzMDAxLCAweDAwNjUsIDB4MzAwMiwgMHgwMDY2LCAweDMwMDMsIDB4MDBCMywgMHgzMDA1LCAweDM1QkEsIDB4MzAwNiwKKyAgICAweDM1QkIsIDB4MzAwNywgMHgzNUJDLCAweDMwMDgsIDB4MDA5NCwgMHgzMDA5LCAweDAwOTUsIDB4MzAwQSwgMHgwMDkwLAorICAgIDB4MzAwQiwgMHgwMDkxLCAweDMwMEMsIDB4MDA5OCwgMHgzMDBELCAweDAwOTksIDB4MzAwRSwgMHgwMDlDLCAweDMwMEYsCisgICAgMHgwMDlELCAweDMwMTAsIDB4MDA4QywgMHgzMDExLCAweDAwOEQsIDB4MzAxMiwgMHgwMTA1LCAweDMwMTQsIDB4MDA4OCwKKyAgICAweDMwMTUsIDB4MDA4OSwgMHgzMDFELCAweDAwQUEsIDB4MzAxRSwgMHgwMEFCLCAweDMwMjEsIDB4MDE2MSwgMHgzMDIyLAorICAgIDB4MDE2MiwgMHgzMDIzLCAweDAxNjMsIDB4MzAyNCwgMHgwMTY0LCAweDMwMjUsIDB4MDE2NSwgMHgzMDI2LCAweDAxNjYsCisgICAgMHgzMDI3LCAweDAxNjcsIDB4MzAyOCwgMHgwMTY4LCAweDMwMjksIDB4MDE2OSwgMHgzMDM4LCAweDAxNkEsIDB4MzAzOSwKKyAgICAweDAxNkIsIDB4MzAzQSwgMHgwMTZDLCAweDMwNDEsIDB4MzVDMSwgMHgzMDQyLCAweDM1QzIsIDB4MzA0MywgMHgzNUMzLAorICAgIDB4MzA0NCwgMHgzNUM0LCAweDMwNDUsIDB4MzVDNSwgMHgzMDQ2LCAweDM1QzYsIDB4MzA0NywgMHgzNUM3LCAweDMwNDgsCisgICAgMHgzNUM4LCAweDMwNDksIDB4MzVDOSwgMHgzMDRBLCAweDM1Q0EsIDB4MzA0QiwgMHgzNUNCLCAweDMwNEMsIDB4MzVDQywKKyAgICAweDMwNEQsIDB4MzVDRCwgMHgzMDRFLCAweDM1Q0UsIDB4MzA0RiwgMHgzNUNGLCAweDMwNTAsIDB4MzVEMCwgMHgzMDUxLAorICAgIDB4MzVEMSwgMHgzMDUyLCAweDM1RDIsIDB4MzA1MywgMHgzNUQzLCAweDMwNTQsIDB4MzVENCwgMHgzMDU1LCAweDM1RDUsCisgICAgMHgzMDU2LCAweDM1RDYsIDB4MzA1NywgMHgzNUQ3LCAweDMwNTgsIDB4MzVEOCwgMHgzMDU5LCAweDM1RDksIDB4MzA1QSwKKyAgICAweDM1REEsIDB4MzA1QiwgMHgzNURCLCAweDMwNUMsIDB4MzVEQywgMHgzMDVELCAweDM1REQsIDB4MzA1RSwgMHgzNURFLAorICAgIDB4MzA1RiwgMHgzNURGLCAweDMwNjAsIDB4MzVFMCwgMHgzMDYxLCAweDM1RTEsIDB4MzA2MiwgMHgzNUUyLCAweDMwNjMsCisgICAgMHgzNUUzLCAweDMwNjQsIDB4MzVFNCwgMHgzMDY1LCAweDM1RTUsIDB4MzA2NiwgMHgzNUU2LCAweDMwNjcsIDB4MzVFNywKKyAgICAweDMwNjgsIDB4MzVFOCwgMHgzMDY5LCAweDM1RTksIDB4MzA2QSwgMHgzNUVBLCAweDMwNkIsIDB4MzVFQiwgMHgzMDZDLAorICAgIDB4MzVFQywgMHgzMDZELCAweDM1RUQsIDB4MzA2RSwgMHgzNUVFLCAweDMwNkYsIDB4MzVFRiwgMHgzMDcwLCAweDM1RjAsCisgICAgMHgzMDcxLCAweDM1RjEsIDB4MzA3MiwgMHgzNUYyLCAweDMwNzMsIDB4MzVGMywgMHgzMDc0LCAweDM1RjQsIDB4MzA3NSwKKyAgICAweDM1RjUsIDB4MzA3NiwgMHgzNUY2LCAweDMwNzcsIDB4MzVGNywgMHgzMDc4LCAweDM1RjgsIDB4MzA3OSwgMHgzNUY5LAorICAgIDB4MzA3QSwgMHgzNUZBLCAweDMwN0IsIDB4MzVGQiwgMHgzMDdDLCAweDM1RkMsIDB4MzA3RCwgMHgzNUZELCAweDMwN0UsCisgICAgMHgzNUZFLCAweDMwN0YsIDB4MzVGRiwgMHgzMDgwLCAweDM2MDAsIDB4MzA4MSwgMHgzNjAxLCAweDMwODIsIDB4MzYwMiwKKyAgICAweDMwODMsIDB4MzYwMywgMHgzMDg0LCAweDM2MDQsIDB4MzA4NSwgMHgzNjA1LCAweDMwODYsIDB4MzYwNiwgMHgzMDg3LAorICAgIDB4MzYwNywgMHgzMDg4LCAweDM2MDgsIDB4MzA4OSwgMHgzNjA5LCAweDMwOEEsIDB4MzYwQSwgMHgzMDhCLCAweDM2MEIsCisgICAgMHgzMDhDLCAweDM2MEMsIDB4MzA4RCwgMHgzNjBELCAweDMwOEUsIDB4MzYwRSwgMHgzMDhGLCAweDM2MEYsIDB4MzA5MCwKKyAgICAweDM2MTAsIDB4MzA5MSwgMHgzNjExLCAweDMwOTIsIDB4MzYxMiwgMHgzMDkzLCAweDM2MTMsIDB4MzA5RCwgMHgzNUI3LAorICAgIDB4MzA5RSwgMHgzNUI4LCAweDMwQTEsIDB4MzYxNCwgMHgzMEEyLCAweDM2MTUsIDB4MzBBMywgMHgzNjE2LCAweDMwQTQsCisgICAgMHgzNjE3LCAweDMwQTUsIDB4MzYxOCwgMHgzMEE2LCAweDM2MTksIDB4MzBBNywgMHgzNjFBLCAweDMwQTgsIDB4MzYxQiwKKyAgICAweDMwQTksIDB4MzYxQywgMHgzMEFBLCAweDM2MUQsIDB4MzBBQiwgMHgzNjFFLCAweDMwQUMsIDB4MzYxRiwgMHgzMEFELAorICAgIDB4MzYyMCwgMHgzMEFFLCAweDM2MjEsIDB4MzBBRiwgMHgzNjIyLCAweDMwQjAsIDB4MzYyMywgMHgzMEIxLCAweDM2MjQsCisgICAgMHgzMEIyLCAweDM2MjUsIDB4MzBCMywgMHgzNjI2LCAweDMwQjQsIDB4MzYyNywgMHgzMEI1LCAweDM2MjgsIDB4MzBCNiwKKyAgICAweDM2MjksIDB4MzBCNywgMHgzNjJBLCAweDMwQjgsIDB4MzYyQiwgMHgzMEI5LCAweDM2MkMsIDB4MzBCQSwgMHgzNjJELAorICAgIDB4MzBCQiwgMHgzNjJFLCAweDMwQkMsIDB4MzYyRiwgMHgzMEJELCAweDM2MzAsIDB4MzBCRSwgMHgzNjMxLCAweDMwQkYsCisgICAgMHgzNjMyLCAweDMwQzAsIDB4MzYzMywgMHgzMEMxLCAweDM2MzQsIDB4MzBDMiwgMHgzNjM1LCAweDMwQzMsIDB4MzYzNiwKKyAgICAweDMwQzQsIDB4MzYzNywgMHgzMEM1LCAweDM2MzgsIDB4MzBDNiwgMHgzNjM5LCAweDMwQzcsIDB4MzYzQSwgMHgzMEM4LAorICAgIDB4MzYzQiwgMHgzMEM5LCAweDM2M0MsIDB4MzBDQSwgMHgzNjNELCAweDMwQ0IsIDB4MzYzRSwgMHgzMENDLCAweDM2M0YsCisgICAgMHgzMENELCAweDM2NDAsIDB4MzBDRSwgMHgzNjQxLCAweDMwQ0YsIDB4MzY0MiwgMHgzMEQwLCAweDM2NDMsIDB4MzBEMSwKKyAgICAweDM2NDQsIDB4MzBEMiwgMHgzNjQ1LCAweDMwRDMsIDB4MzY0NiwgMHgzMEQ0LCAweDM2NDcsIDB4MzBENSwgMHgzNjQ4LAorICAgIDB4MzBENiwgMHgzNjQ5LCAweDMwRDcsIDB4MzY0QSwgMHgzMEQ4LCAweDM2NEIsIDB4MzBEOSwgMHgzNjRDLCAweDMwREEsCisgICAgMHgzNjRELCAweDMwREIsIDB4MzY0RSwgMHgzMERDLCAweDM2NEYsIDB4MzBERCwgMHgzNjUwLCAweDMwREUsIDB4MzY1MSwKKyAgICAweDMwREYsIDB4MzY1MiwgMHgzMEUwLCAweDM2NTMsIDB4MzBFMSwgMHgzNjU0LCAweDMwRTIsIDB4MzY1NSwgMHgzMEUzLAorICAgIDB4MzY1NiwgMHgzMEU0LCAweDM2NTcsIDB4MzBFNSwgMHgzNjU4LCAweDMwRTYsIDB4MzY1OSwgMHgzMEU3LCAweDM2NUEsCisgICAgMHgzMEU4LCAweDM2NUIsIDB4MzBFOSwgMHgzNjVDLCAweDMwRUEsIDB4MzY1RCwgMHgzMEVCLCAweDM2NUUsIDB4MzBFQywKKyAgICAweDM2NUYsIDB4MzBFRCwgMHgzNjYwLCAweDMwRUUsIDB4MzY2MSwgMHgzMEVGLCAweDM2NjIsIDB4MzBGMCwgMHgzNjYzLAorICAgIDB4MzBGMSwgMHgzNjY0LCAweDMwRjIsIDB4MzY2NSwgMHgzMEYzLCAweDM2NjYsIDB4MzBGNCwgMHgzNjY3LCAweDMwRjUsCisgICAgMHgzNjY4LCAweDMwRjYsIDB4MzY2OSwgMHgzMEZDLCAweDM1QkQsIDB4MzBGRCwgMHgzNUI1LCAweDMwRkUsIDB4MzVCNiwKKyAgICAweDMxMDUsIDB4MDFEMSwgMHgzMTA2LCAweDAxRDIsIDB4MzEwNywgMHgwMUQzLCAweDMxMDgsIDB4MDFENCwgMHgzMTA5LAorICAgIDB4MDFENSwgMHgzMTBBLCAweDAxRDYsIDB4MzEwQiwgMHgwMUQ3LCAweDMxMEMsIDB4MDFEOCwgMHgzMTBELCAweDAxRDksCisgICAgMHgzMTBFLCAweDAxREEsIDB4MzEwRiwgMHgwMURCLCAweDMxMTAsIDB4MDFEQywgMHgzMTExLCAweDAxREQsIDB4MzExMiwKKyAgICAweDAxREUsIDB4MzExMywgMHgwMURGLCAweDMxMTQsIDB4MDFFMCwgMHgzMTE1LCAweDAxRTEsIDB4MzExNiwgMHgwMUUyLAorICAgIDB4MzExNywgMHgwMUUzLCAweDMxMTgsIDB4MDFFNCwgMHgzMTE5LCAweDAxRTUsIDB4MzExQSwgMHgwMUU2LCAweDMxMUIsCisgICAgMHgwMUU3LCAweDMxMUMsIDB4MDFFOCwgMHgzMTFELCAweDAxRTksIDB4MzExRSwgMHgwMUVBLCAweDMxMUYsIDB4MDFFQiwKKyAgICAweDMxMjAsIDB4MDFFQywgMHgzMTIxLCAweDAxRUQsIDB4MzEyMiwgMHgwMUVFLCAweDMxMjMsIDB4MDFFRiwgMHgzMTI0LAorICAgIDB4MDFGMCwgMHgzMTI1LCAweDAxRjEsIDB4MzEyNiwgMHgwMUYyLCAweDMxMjcsIDB4MDFGMywgMHgzMTI4LCAweDAxRjQsCisgICAgMHgzMTI5LCAweDAxRjUsIDB4MzIzMSwgMHgzNkU1LCAweDMyQTMsIDB4MDBDMSwgMHgzMzhFLCAweDAxMTUsIDB4MzM4RiwKKyAgICAweDAxMTYsIDB4MzM5QywgMHgwMTEwLCAweDMzOUQsIDB4MDExMSwgMHgzMzlFLCAweDAxMTIsIDB4MzNBMSwgMHgwMTE0LAorICAgIDB4MzNDNCwgMHgwMTE3LCAweDMzQ0UsIDB4MDExMywgMHgzM0QxLCAweDAwRUMsIDB4MzNEMiwgMHgwMEVCLCAweDMzRDUsCisgICAgMHgwMTBGLCAweDM2MUQsIDB4MzZCNywgMHg0NDkxLCAweDM2QjQsIDB4NEUwMCwgMHgwMjUzLCAweDRFMDEsIDB4MDI1NSwKKyAgICAweDRFMDMsIDB4MDI1NiwgMHg0RTA3LCAweDE3NzEsIDB4NEUwOCwgMHgwMjY5LCAweDRFMDksIDB4MDI2NywgMHg0RTBBLAorICAgIDB4MDI2QSwgMHg0RTBCLCAweDAyNjgsIDB4NEUwQywgMHgxNzcyLCAweDRFMEQsIDB4MDI5NCwgMHg0RTBFLCAweDE3N0EsCisgICAgMHg0RTBGLCAweDE3NzgsIDB4NEUxMCwgMHgwMjkzLCAweDRFMTEsIDB4MDI5MiwgMHg0RTE0LCAweDAyRjIsIDB4NEUxNSwKKyAgICAweDAyRjEsIDB4NEUxNiwgMHgwMkYwLCAweDRFMTgsIDB4MDJGMywgMHg0RTE5LCAweDAyRUYsIDB4NEUxRSwgMHgwMzZFLAorICAgIDB4NEUxRiwgMHgwMzZGLCAweDRFMjYsIDB4MDUyOCwgMHg0RTI4LCAweDAyMTgsIDB4NEUyQiwgMHgwMjZCLCAweDRFMkQsCisgICAgMHgwMjk1LCAweDRFMkUsIDB4MTc3QiwgMHg0RTMwLCAweDAyOTYsIDB4NEUzMSwgMHgxNzhFLCAweDRFMzIsIDB4MDQxNSwKKyAgICAweDRFMzMsIDB4MThGNCwgMHg0RTM2LCAweDAyMTksIDB4NEUzOCwgMHgwMjZDLCAweDRFMzksIDB4MDI5NywgMHg0RTNCLAorICAgIDB4MDJGNCwgMHg0RTNDLCAweDE3OEYsIDB4NEUzRiwgMHgwMjFBLCAweDRFNDEsIDB4MzZBRiwgMHg0RTQyLCAweDE3NkMsCisgICAgMHg0RTQzLCAweDAyNTcsIDB4NEU0NSwgMHgwMjZFLCAweDRFNDcsIDB4MTc3MywgMHg0RTQ4LCAweDAyNkYsIDB4NEU0QiwKKyAgICAweDAyOTgsIDB4NEU0RCwgMHgwMkY1LCAweDRFNEUsIDB4MDJGNywgMHg0RTRGLCAweDAyRjYsIDB4NEU1MiwgMHgwMzcwLAorICAgIDB4NEU1MywgMHgwMzcxLCAweDRFNTYsIDB4MDUyOSwgMHg0RTU4LCAweDA4MzEsIDB4NEU1OSwgMHgwMjU0LCAweDRFNUEsCisgICAgMHgzNkIxLCAweDRFNUMsIDB4MTc2RCwgMHg0RTVELCAweDAyNTgsIDB4NEU1RSwgMHgwMjcxLCAweDRFNUYsIDB4MDI3MCwKKyAgICAweDRFNjksIDB4MDM3MiwgMHg0RTczLCAweDA1MkEsIDB4NEU3RSwgMHgwOUZCLCAweDRFN0YsIDB4MUUzNSwgMHg0RTgyLAorICAgIDB4MERCRSwgMHg0RTgzLCAweDIzNjEsIDB4NEU4NCwgMHgyMzYyLCAweDRFODUsIDB4MDIxQiwgMHg0RTg2LCAweDAyNTksCisgICAgMHg0RTg4LCAweDAyOUEsIDB4NEU4QiwgMHgwNTJCLCAweDRFOEMsIDB4MDI1QSwgMHg0RThELCAweDE3NzQsIDB4NEU4RSwKKyAgICAweDAyNzIsIDB4NEU5MSwgMHgwMjlCLCAweDRFOTIsIDB4MDI5RCwgMHg0RTkzLCAweDE3N0MsIDB4NEU5NCwgMHgwMjlFLAorICAgIDB4NEU5NSwgMHgwMjlDLCAweDRFOTksIDB4MDM3MywgMHg0RTlCLCAweDA1MkMsIDB4NEU5RSwgMHgwNTJELCAweDRFOUYsCisgICAgMHgwNkEzLCAweDRFQTAsIDB4MDIxQywgMHg0RUExLCAweDAyNzMsIDB4NEVBMiwgMHgwMjlGLCAweDRFQTQsIDB4MDM3NCwKKyAgICAweDRFQTUsIDB4MDM3NiwgMHg0RUE2LCAweDAzNzUsIDB4NEVBOCwgMHgwNDE2LCAweDRFQUIsIDB4MDUyRSwgMHg0RUFDLAorICAgIDB4MDUyRiwgMHg0RUFELCAweDA2QTQsIDB4NEVBRSwgMHgwNkE1LCAweDRFQjMsIDB4MDgzMiwgMHg0RUI2LCAweDIzNjMsCisgICAgMHg0RUI5LCAweDMzNzcsIDB4NEVCQSwgMHgwMjVCLCAweDRFQzAsIDB4MDJBMSwgMHg0RUMxLCAweDAyQTAsIDB4NEVDMiwKKyAgICAweDE3N0QsIDB4NEVDMywgMHgwMkEyLCAweDRFQzQsIDB4MDJBOCwgMHg0RUM2LCAweDAyQTMsIDB4NEVDNywgMHgwMkE0LAorICAgIDB4NEVDOCwgMHgxNzdGLCAweDRFQzksIDB4MTc3RSwgMHg0RUNBLCAweDAyQTYsIDB4NEVDQiwgMHgwMkE3LCAweDRFQ0QsCisgICAgMHgwMkE1LCAweDRFRDQsIDB4MDJGQSwgMHg0RUQ1LCAweDAyRkIsIDB4NEVENiwgMHgwMkZDLCAweDRFRDcsIDB4MDJGRCwKKyAgICAweDRFRDgsIDB4MDJGOSwgMHg0RUQ5LCAweDAzMDAsIDB4NEVEQSwgMHgxNzk1LCAweDRFREMsIDB4MTc5MSwgMHg0RURELAorICAgIDB4MTc5NCwgMHg0RURFLCAweDAzMDEsIDB4NEVERiwgMHgwMzExLCAweDRFRTEsIDB4MTc5MywgMHg0RUUzLCAweDAyRkUsCisgICAgMHg0RUU0LCAweDAyRkYsIDB4NEVFNSwgMHgwMkY4LCAweDRFRTgsIDB4MTc5MCwgMHg0RUU5LCAweDE3OTIsIDB4NEVGMCwKKyAgICAweDAzODMsIDB4NEVGMSwgMHgxN0JBLCAweDRFRjIsIDB4MDM4MCwgMHg0RUYzLCAweDAzODQsIDB4NEVGNCwgMHgxN0M0LAorICAgIDB4NEVGNSwgMHgxN0I4LCAweDRFRjYsIDB4MDM4MSwgMHg0RUY3LCAweDE3QkMsIDB4NEVGQiwgMHgwMzgyLCAweDRFRkQsCisgICAgMHgwMzg1LCAweDRFRkYsIDB4MDM3NywgMHg0RjAwLCAweDE3QkIsIDB4NEYwMSwgMHgwMzg2LCAweDRGMDIsIDB4MTdCRiwKKyAgICAweDRGMDQsIDB4MTdDMywgMHg0RjA1LCAweDE3QzAsIDB4NEYwOCwgMHgxN0JELCAweDRGMDksIDB4MDM3OCwgMHg0RjBBLAorICAgIDB4MDM3QSwgMHg0RjBCLCAweDAzODcsIDB4NEYwRCwgMHgwMzdDLCAweDRGMEUsIDB4MTdCNSwgMHg0RjBGLCAweDAzN0YsCisgICAgMHg0RjEwLCAweDAzN0QsIDB4NEYxMSwgMHgwMzdFLCAweDRGMTIsIDB4MTdDNSwgMHg0RjEzLCAweDE3QzIsIDB4NEYxNCwKKyAgICAweDE3QjksIDB4NEYxNSwgMHgwMzdCLCAweDRGMTgsIDB4MTdCNiwgMHg0RjE5LCAweDAzNzksIDB4NEYxRCwgMHgxN0JFLAorICAgIDB4NEYyMiwgMHgxN0MxLCAweDRGMkMsIDB4MTdCNywgMHg0RjJELCAweDE4MkYsIDB4NEYyRiwgMHgwNDJDLCAweDRGMzAsCisgICAgMHgwNDFGLCAweDRGMzMsIDB4MTgzMCwgMHg0RjM0LCAweDA0MUMsIDB4NEYzNiwgMHgwNDJFLCAweDRGMzgsIDB4MDQyNCwKKyAgICAweDRGM0EsIDB4MDQyMywgMHg0RjNCLCAweDE4MjQsIDB4NEYzQywgMHgwNDI3LCAweDRGM0QsIDB4MDQyMiwgMHg0RjNFLAorICAgIDB4MTgyOSwgMHg0RjNGLCAweDE4MzEsIDB4NEY0MSwgMHgxODJELCAweDRGNDMsIDB4MDQyNSwgMHg0RjQ2LCAweDA0MjgsCisgICAgMHg0RjQ3LCAweDA0MTksIDB4NEY0OCwgMHgwNDMxLCAweDRGNDksIDB4MTgyNiwgMHg0RjRDLCAweDE5MDAsIDB4NEY0RCwKKyAgICAweDA0MTcsIDB4NEY0RSwgMHgwNDJELCAweDRGNEYsIDB4MDQxOCwgMHg0RjUwLCAweDA0MjAsIDB4NEY1MSwgMHgwNDIxLAorICAgIDB4NEY1MiwgMHgxODJCLCAweDRGNTMsIDB4MTgyNywgMHg0RjU0LCAweDA0MjYsIDB4NEY1NSwgMHgwNDFFLCAweDRGNTYsCisgICAgMHgxODIzLCAweDRGNTcsIDB4MDQxQSwgMHg0RjU4LCAweDE4MkUsIDB4NEY1OSwgMHgwNDJGLCAweDRGNUEsIDB4MDQzMiwKKyAgICAweDRGNUIsIDB4MDQxRCwgMHg0RjVDLCAweDA0MkEsIDB4NEY1RCwgMHgwNDMwLCAweDRGNUUsIDB4MDQxQiwgMHg0RjVGLAorICAgIDB4MTgyQywgMHg0RjYwLCAweDA0MkIsIDB4NEY2MSwgMHgxODMyLCAweDRGNjIsIDB4MTgyNSwgMHg0RjYzLCAweDA0MjksCisgICAgMHg0RjY0LCAweDE4MjgsIDB4NEY2NywgMHgxODJBLCAweDRGNjksIDB4MDUzRCwgMHg0RjZBLCAweDE5MDIsIDB4NEY2QiwKKyAgICAweDE5MEUsIDB4NEY2QywgMHgwNTM1LCAweDRGNkUsIDB4MTkwRiwgMHg0RjZGLCAweDA1MzAsIDB4NEY3MCwgMHgwNTNBLAorICAgIDB4NEY3MywgMHgwNTMzLCAweDRGNzQsIDB4MThGQywgMHg0Rjc1LCAweDA1M0IsIDB4NEY3NiwgMHgxOEZCLCAweDRGNzcsCisgICAgMHgxOEZGLCAweDRGNzgsIDB4MTkwNiwgMHg0Rjc5LCAweDE5MDQsIDB4NEY3QSwgMHgwNTQzLCAweDRGN0IsIDB4MDUzRSwKKyAgICAweDRGN0MsIDB4MThGNiwgMHg0RjdELCAweDE4RjgsIDB4NEY3RSwgMHgwNTQwLCAweDRGN0YsIDB4MDUzNCwgMHg0RjgwLAorICAgIDB4MThGOSwgMHg0RjgxLCAweDE5MDUsIDB4NEY4MiwgMHgxOTBDLCAweDRGODMsIDB4MDUzOSwgMHg0Rjg0LCAweDE4RkUsCisgICAgMHg0Rjg1LCAweDE4RjcsIDB4NEY4NiwgMHgwNTM4LCAweDRGODcsIDB4MThGQSwgMHg0Rjg4LCAweDA1M0MsIDB4NEY4OSwKKyAgICAweDE4RkQsIDB4NEY4QiwgMHgwNTM3LCAweDRGOEQsIDB4MDUzMiwgMHg0RjhGLCAweDA1NDEsIDB4NEY5MCwgMHgxOTA3LAorICAgIDB4NEY5MSwgMHgwNTQyLCAweDRGOTIsIDB4MTkwQiwgMHg0Rjk0LCAweDE5MDksIDB4NEY5NSwgMHgxOTBELCAweDRGOTYsCisgICAgMHgwNTNGLCAweDRGOTcsIDB4MTkwMSwgMHg0Rjk4LCAweDE4RjUsIDB4NEY5QSwgMHgxOTAzLCAweDRGOUIsIDB4MDUzNiwKKyAgICAweDRGOUMsIDB4MTkwOCwgMHg0RjlELCAweDA1MzEsIDB4NEY5RSwgMHgxOTBBLCAweDRGQUUsIDB4MDZCNCwgMHg0RkFGLAorICAgIDB4MDZBOCwgMHg0RkIyLCAweDFBNUQsIDB4NEZCMywgMHgxQTY1LCAweDRGQjUsIDB4MDZBNywgMHg0RkI2LCAweDA2QUYsCisgICAgMHg0RkI3LCAweDA2QkIsIDB4NEZCOSwgMHgxQTZCLCAweDRGQkEsIDB4MUE2OSwgMHg0RkJCLCAweDFBNjQsIDB4NEZCRiwKKyAgICAweDA2QTksIDB4NEZDMCwgMHgxQTZBLCAweDRGQzEsIDB4MUE2MCwgMHg0RkMyLCAweDA2QjcsIDB4NEZDMywgMHgwNkFFLAorICAgIDB4NEZDNCwgMHgwNkI2LCAweDRGQzUsIDB4MUE1QiwgMHg0RkM3LCAweDFBNjcsIDB4NEZDOSwgMHgxQTVFLCAweDRGQ0EsCisgICAgMHgwNkIyLCAweDRGQ0IsIDB4MUE1RiwgMHg0RkNELCAweDFBNUEsIDB4NEZDRSwgMHgwNkI5LCAweDRGQ0YsIDB4MDZBQywKKyAgICAweDRGRDAsIDB4MDZCNSwgMHg0RkQxLCAweDA2QUIsIDB4NEZEMywgMHgxQTVDLCAweDRGRDQsIDB4MUE2MSwgMHg0RkQ2LAorICAgIDB4MUE2OCwgMHg0RkQ3LCAweDA2QjMsIDB4NEZEOCwgMHgwNkIwLCAweDRGRDksIDB4MUE2MywgMHg0RkRBLCAweDA2QjgsCisgICAgMHg0RkRCLCAweDFBNjYsIDB4NEZEQywgMHgxQTYyLCAweDRGREQsIDB4MDZBRCwgMHg0RkRFLCAweDA2QkEsIDB4NEZERiwKKyAgICAweDA2QjEsIDB4NEZFMCwgMHgwNkFBLCAweDRGRTEsIDB4MDZBNiwgMHg0RkVDLCAweDFBNkMsIDB4NEZFRSwgMHgwODRDLAorICAgIDB4NEZFRiwgMHgwODM2LCAweDRGRjEsIDB4MDg0NiwgMHg0RkYzLCAweDA4NEIsIDB4NEZGNCwgMHgxQzI0LCAweDRGRjUsCisgICAgMHgxQzIzLCAweDRGRjYsIDB4MUMyOCwgMHg0RkY3LCAweDFDMjksIDB4NEZGOCwgMHgwODM5LCAweDRGRkEsIDB4MDg0MiwKKyAgICAweDRGRkUsIDB4MDg0RiwgMHg1MDAwLCAweDA4NDMsIDB4NTAwNSwgMHgxQzFELCAweDUwMDYsIDB4MDgzQywgMHg1MDA3LAorICAgIDB4MUMxRSwgMHg1MDA5LCAweDA4NTEsIDB4NTAwQiwgMHgwODQ4LCAweDUwMEMsIDB4MDgzMywgMHg1MDBELCAweDA4MzQsCisgICAgMHg1MDBFLCAweDFDMzEsIDB4NTAwRiwgMHgwQTBDLCAweDUwMTEsIDB4MDg0MSwgMHg1MDEyLCAweDA4NDAsIDB4NTAxMywKKyAgICAweDFDMUYsIDB4NTAxNCwgMHgwODQ0LCAweDUwMTUsIDB4MUU0NSwgMHg1MDE2LCAweDA4M0IsIDB4NTAxNywgMHgxQzJBLAorICAgIDB4NTAxOCwgMHgwODRBLCAweDUwMTksIDB4MDg0OSwgMHg1MDFBLCAweDA4M0YsIDB4NTAxQiwgMHgxQzIyLCAweDUwMUMsCisgICAgMHgxQzJCLCAweDUwMUUsIDB4MUMxQywgMHg1MDFGLCAweDA4M0UsIDB4NTAyMCwgMHgxQzJDLCAweDUwMjEsIDB4MDg0NywKKyAgICAweDUwMjIsIDB4MUMyMCwgMHg1MDIzLCAweDA4MzUsIDB4NTAyNSwgMHgwODM4LCAweDUwMjYsIDB4MDgzNywgMHg1MDI3LAorICAgIDB4MUMyRCwgMHg1MDI4LCAweDA4NDUsIDB4NTAyOSwgMHgwODNBLCAweDUwMkEsIDB4MDg0RSwgMHg1MDJCLCAweDA4NTAsCisgICAgMHg1MDJDLCAweDFDMjcsIDB4NTAyRCwgMHgwODRELCAweDUwMkYsIDB4MUMyRiwgMHg1MDMwLCAweDFDMjEsIDB4NTAzMSwKKyAgICAweDFDMzAsIDB4NTAzMywgMHgxQzI1LCAweDUwMzUsIDB4MUMyRSwgMHg1MDM3LCAweDFDMjYsIDB4NTAzQywgMHgwODNELAorICAgIDB4NTA0MCwgMHgxRTRELCAweDUwNDEsIDB4MUU0MSwgMHg1MDQzLCAweDBBMDAsIDB4NTA0NSwgMHgxRTQ2LCAweDUwNDYsCisgICAgMHgxRTRDLCAweDUwNDcsIDB4MDlGRiwgMHg1MDQ4LCAweDFFM0YsIDB4NTA0OSwgMHgwQTAzLCAweDUwNEEsIDB4MUU0MywKKyAgICAweDUwNEIsIDB4MUUzQywgMHg1MDRDLCAweDBBMDEsIDB4NTA0RCwgMHgxRTQwLCAweDUwNEUsIDB4MEEwNiwgMHg1MDRGLAorICAgIDB4MEEwQiwgMHg1MDUxLCAweDFFNTEsIDB4NTA1MywgMHgxRTNCLCAweDUwNTUsIDB4MEEwNywgMHg1MDU3LCAweDFFNTAsCisgICAgMHg1MDVBLCAweDBBMDIsIDB4NTA1QiwgMHgxRTQyLCAweDUwNUMsIDB4MDlGRSwgMHg1MDVELCAweDFFM0QsIDB4NTA1RSwKKyAgICAweDFFMzksIDB4NTA1RiwgMHgxRTQ3LCAweDUwNjAsIDB4MUUzQSwgMHg1MDYxLCAweDFFMzgsIDB4NTA2MiwgMHgxRTQ0LAorICAgIDB4NTA2MywgMHgxRTRBLCAweDUwNjQsIDB4MUU0QiwgMHg1MDY1LCAweDBBMDQsIDB4NTA2OCwgMHgyMEI4LCAweDUwNjksCisgICAgMHgxRTQ4LCAweDUwNkEsIDB4MUUzNywgMHg1MDZCLCAweDFFNDksIDB4NTA2RCwgMHgwQTBFLCAweDUwNkUsIDB4MUU0RSwKKyAgICAweDUwNkYsIDB4MEEwRCwgMHg1MDcwLCAweDFFMzYsIDB4NTA3MiwgMHgxRTNFLCAweDUwNzMsIDB4MUU0RiwgMHg1MDc0LAorICAgIDB4MEEwOSwgMHg1MDc1LCAweDBBMDgsIDB4NTA3NiwgMHgwQTA1LCAweDUwNzcsIDB4MEEwQSwgMHg1MDdBLCAweDA5RkMsCisgICAgMHg1MDdELCAweDA5RkQsIDB4NTA4MCwgMHgwQkVDLCAweDUwODIsIDB4MjBCQiwgMHg1MDgzLCAweDIwQjQsIDB4NTA4NSwKKyAgICAweDBCRTksIDB4NTA4NywgMHgyMEJDLCAweDUwOEIsIDB4MjBCMiwgMHg1MDhDLCAweDIwQjUsIDB4NTA4RCwgMHgwQkU4LAorICAgIDB4NTA4RSwgMHgyMEI2LCAweDUwOTEsIDB4MEJFQiwgMHg1MDkyLCAweDIwQkEsIDB4NTA5NCwgMHgyMEIwLCAweDUwOTUsCisgICAgMHgyMEFGLCAweDUwOTYsIDB4MEJFRCwgMHg1MDk4LCAweDBCRUUsIDB4NTA5OSwgMHgwQkVBLCAweDUwOUEsIDB4MEJFRiwKKyAgICAweDUwOUIsIDB4MjBBRSwgMHg1MDlDLCAweDIwQjksIDB4NTA5RCwgMHgyMEI3LCAweDUwOUUsIDB4MjBCMSwgMHg1MEEyLAorICAgIDB4MEJFNywgMHg1MEEzLCAweDIwQjMsIDB4NTBBQywgMHgwREM1LCAweDUwQUQsIDB4MERCRiwgMHg1MEFFLCAweDIzNjcsCisgICAgMHg1MEFGLCAweDBEQzgsIDB4NTBCMCwgMHgyMzZELCAweDUwQjEsIDB4MjM3MCwgMHg1MEIyLCAweDBEQzEsIDB4NTBCMywKKyAgICAweDBEQzIsIDB4NTBCNCwgMHgyMzZBLCAweDUwQjUsIDB4MERDMCwgMHg1MEI2LCAweDIzNzMsIDB4NTBCNywgMHgwREM2LAorICAgIDB4NTBCOCwgMHgyMzc0LCAweDUwQkEsIDB4MjM2RiwgMHg1MEJCLCAweDBEQzcsIDB4NTBCRCwgMHgyMzY0LCAweDUwQkUsCisgICAgMHgwREM0LCAweDUwQkYsIDB4MjM2NSwgMHg1MEMxLCAweDIzNkUsIDB4NTBDMiwgMHgyMzZDLCAweDUwQzQsIDB4MjM2OCwKKyAgICAweDUwQzUsIDB4MERDMywgMHg1MEM2LCAweDIzNjYsIDB4NTBDNywgMHgwREM5LCAweDUwQzgsIDB4MjM2QiwgMHg1MEM5LAorICAgIDB4MjM3MiwgMHg1MENBLCAweDIzNjksIDB4NTBDQiwgMHgyMzcxLCAweDUwQ0UsIDB4MEY4OCwgMHg1MENGLCAweDBGODUsCisgICAgMHg1MEQxLCAweDBGODYsIDB4NTBEMywgMHgyNjFDLCAweDUwRDQsIDB4MjYxNCwgMHg1MEQ1LCAweDBGODQsIDB4NTBENiwKKyAgICAweDBGODEsIDB4NTBENywgMHgyNjE1LCAweDUwREEsIDB4MEY4MywgMHg1MERCLCAweDI2MTgsIDB4NTBERCwgMHgyNjFBLAorICAgIDB4NTBFMCwgMHgyNjIxLCAweDUwRTMsIDB4MjYyMCwgMHg1MEU0LCAweDI2MUIsIDB4NTBFNSwgMHgwRjgwLCAweDUwRTYsCisgICAgMHgyNjEzLCAweDUwRTcsIDB4MEY3RSwgMHg1MEU4LCAweDI2MTYsIDB4NTBFOSwgMHgwRjg5LCAweDUwRUEsIDB4MjYxOSwKKyAgICAweDUwRUMsIDB4MjYxRCwgMHg1MEVELCAweDBGODIsIDB4NTBFRSwgMHgwRjdGLCAweDUwRUYsIDB4MjYxRiwgMHg1MEYwLAorICAgIDB4MjYxRSwgMHg1MEYxLCAweDBGODcsIDB4NTBGMywgMHgyNjE3LCAweDUwRjUsIDB4MTEwNSwgMHg1MEY2LCAweDI4ODMsCisgICAgMHg1MEY4LCAweDI4ODAsIDB4NTBGOSwgMHgxMTA2LCAweDUwRkIsIDB4MTEwNCwgMHg1MEZELCAweDI4ODcsIDB4NTBGRSwKKyAgICAweDI4ODQsIDB4NTBGRiwgMHgyODdELCAweDUxMDAsIDB4MTEwMywgMHg1MTAyLCAweDExMDcsIDB4NTEwMywgMHgyODdFLAorICAgIDB4NTEwNCwgMHgxMTAyLCAweDUxMDUsIDB4MTEwQSwgMHg1MTA2LCAweDI4ODEsIDB4NTEwNywgMHgyODgyLCAweDUxMDgsCisgICAgMHgxMTA4LCAweDUxMDksIDB4MTEwOSwgMHg1MTBBLCAweDI4ODgsIDB4NTEwQiwgMHgyODg1LCAweDUxMEMsIDB4Mjg4NiwKKyAgICAweDUxMTAsIDB4MTI4RCwgMHg1MTExLCAweDJCMDQsIDB4NTExMiwgMHgxMjhBLCAweDUxMTMsIDB4MkIwMSwgMHg1MTE0LAorICAgIDB4MTI4QywgMHg1MTE1LCAweDEyOEUsIDB4NTExNywgMHgyQjAyLCAweDUxMTgsIDB4MTI4QiwgMHg1MTFBLCAweDJCMDMsCisgICAgMHg1MTFDLCAweDJCMDAsIDB4NTExRiwgMHgxM0I1LCAweDUxMjAsIDB4MkQzRSwgMHg1MTIxLCAweDEzQjYsIDB4NTEyMiwKKyAgICAweDJEM0MsIDB4NTEyNCwgMHgyRDNELCAweDUxMjUsIDB4MkQzQiwgMHg1MTI2LCAweDJEM0EsIDB4NTEyOSwgMHgyRDNGLAorICAgIDB4NTEyQSwgMHgxM0I0LCAweDUxMkQsIDB4MkYwRiwgMHg1MTJFLCAweDJGMTAsIDB4NTEzMCwgMHgyODdGLCAweDUxMzEsCisgICAgMHgyRjBFLCAweDUxMzIsIDB4MTNCNywgMHg1MTMzLCAweDE1NzUsIDB4NTEzNCwgMHgzMDdBLCAweDUxMzUsIDB4MzA3QiwKKyAgICAweDUxMzcsIDB4MTY2OCwgMHg1MTM4LCAweDE2NjksIDB4NTEzOSwgMHgzMkM2LCAweDUxM0EsIDB4MzJDNSwgMHg1MTNCLAorICAgIDB4MTZCQywgMHg1MTNDLCAweDE2QkIsIDB4NTEzRCwgMHgzNDBFLCAweDUxM0YsIDB4MDI1QywgMHg1MTQwLCAweDAyNzQsCisgICAgMHg1MTQxLCAweDAyQUEsIDB4NTE0MywgMHgwMkE5LCAweDUxNDQsIDB4MDMwMywgMHg1MTQ1LCAweDAzMDIsIDB4NTE0NiwKKyAgICAweDAzOEEsIDB4NTE0NywgMHgwMzg5LCAweDUxNDgsIDB4MDM4QiwgMHg1MTQ5LCAweDAzODgsIDB4NTE0QiwgMHgwNDM0LAorICAgIDB4NTE0QywgMHgwNDMzLCAweDUxNEQsIDB4MDQzNSwgMHg1MTUyLCAweDA1NDUsIDB4NTE1NCwgMHgwNTQ0LCAweDUxNTUsCisgICAgMHgwNTQ2LCAweDUxNTcsIDB4MDZCQywgMHg1MTU5LCAweDAxMTksIDB4NTE1QSwgMHgxQzMyLCAweDUxNUIsIDB4MDExQSwKKyAgICAweDUxNUMsIDB4MEEwRiwgMHg1MTVELCAweDAxMUMsIDB4NTE1RSwgMHgwMTFCLCAweDUxNUYsIDB4MjBCRCwgMHg1MTYxLAorICAgIDB4MDExRCwgMHg1MTYyLCAweDBGOEEsIDB4NTE2MywgMHgwMTFFLCAweDUxNjUsIDB4MDI1RCwgMHg1MTY3LCAweDAyQUIsCisgICAgMHg1MTY4LCAweDAzOEMsIDB4NTE2OSwgMHgwNTQ3LCAweDUxNkIsIDB4MDI1RSwgMHg1MTZDLCAweDAyQUUsIDB4NTE2RCwKKyAgICAweDAyQUMsIDB4NTE2RSwgMHgwMkFELCAweDUxNzEsIDB4MDM4RCwgMHg1MTc1LCAweDA0MzYsIDB4NTE3NiwgMHgwNTQ5LAorICAgIDB4NTE3NywgMHgwNTQ4LCAweDUxNzgsIDB4MDU0QSwgMHg1MTdDLCAweDA4NTIsIDB4NTE4MCwgMHgxMjhGLCAweDUxODIsCisgICAgMHgwMjFELCAweDUxODcsIDB4MTc3OSwgMHg1MTg4LCAweDM2QjYsIDB4NTE4OSwgMHgwMzA0LCAweDUxOEEsIDB4MDMwNSwKKyAgICAweDUxOEQsIDB4MDM4RSwgMHg1MThGLCAweDE4MzMsIDB4NTE5MSwgMHgwNkJFLCAweDUxOTIsIDB4MDZCRCwgMHg1MTkzLAorICAgIDB4MUMzNCwgMHg1MTk0LCAweDFDMzMsIDB4NTE5NSwgMHgwQTEwLCAweDUxOTYsIDB4MDIxRSwgMHg1MTk3LCAweDAyQUYsCisgICAgMHg1MTk4LCAweDE3ODAsIDB4NTE5RSwgMHgxOTEwLCAweDUxQTAsIDB4MDZCRiwgMHg1MUEyLCAweDA4NTUsIDB4NTFBNCwKKyAgICAweDA4NTMsIDB4NTFBNSwgMHgwODU0LCAweDUxQUEsIDB4MTI5MCwgMHg1MUFCLCAweDAyMUYsIDB4NTFBQywgMHgwMzA2LAorICAgIDB4NTFCMCwgMHgwMzhGLCAweDUxQjEsIDB4MTdDNiwgMHg1MUI2LCAweDA0MzcsIDB4NTFCNywgMHgwNDM4LCAweDUxQjksCisgICAgMHgxODM0LCAweDUxQkMsIDB4MTkxMSwgMHg1MUJELCAweDA1NEIsIDB4NTFCRSwgMHgxOTEyLCAweDUxQzQsIDB4MUMzNiwKKyAgICAweDUxQzUsIDB4MUMzNywgMHg1MUM2LCAweDA4NTgsIDB4NTFDOCwgMHgxQzM4LCAweDUxQ0EsIDB4MUMzNSwgMHg1MUNCLAorICAgIDB4MDg1OSwgMHg1MUNDLCAweDA4NTcsIDB4NTFDRCwgMHgwODU2LCAweDUxQ0UsIDB4MUMzOSwgMHg1MUQwLCAweDFFNTIsCisgICAgMHg1MUQ0LCAweDIwQkUsIDB4NTFENywgMHgyMzc1LCAweDUxRDgsIDB4MjYyMiwgMHg1MURDLCAweDExMEIsIDB4NTFERCwKKyAgICAweDEyOTEsIDB4NTFERSwgMHgyQjA1LCAweDUxRTAsIDB4MDI1RiwgMHg1MUUxLCAweDAyNkQsIDB4NTFGMCwgMHgwQTExLAorICAgIDB4NTFGMSwgMHgwQkYxLCAweDUxRjMsIDB4MEY4QiwgMHg1MUY1LCAweDE3NkUsIDB4NTFGNiwgMHgwMkIwLCAweDUxRjgsCisgICAgMHgwMzA5LCAweDUxRjksIDB4MDMwNywgMHg1MUZBLCAweDAzMDgsIDB4NTFGRCwgMHgwNTRDLCAweDUyMDAsIDB4MDI2MCwKKyAgICAweDUyMDEsIDB4MDI2MSwgMHg1MjAyLCAweDM2QjMsIDB4NTIwMywgMHgwMjc1LCAweDUyMDYsIDB4MDJCMSwgMHg1MjA3LAorICAgIDB4MDJCMiwgMHg1MjA4LCAweDAyQjMsIDB4NTIwOSwgMHgxNzk3LCAweDUyMEEsIDB4MDMwQSwgMHg1MjBDLCAweDE3OTYsCisgICAgMHg1MjBFLCAweDAzOTMsIDB4NTIxMCwgMHgxN0M4LCAweDUyMTEsIDB4MDM5MSwgMHg1MjEyLCAweDAzOTIsIDB4NTIxMywKKyAgICAweDE3QzcsIDB4NTIxNiwgMHgwMzk0LCAweDUyMTcsIDB4MDM5MCwgMHg1MjFDLCAweDE4MzUsIDB4NTIxRCwgMHgwNjhCLAorICAgIDB4NTIxRSwgMHgxODM2LCAweDUyMjEsIDB4MTgzNywgMHg1MjI0LCAweDA0M0EsIDB4NTIyNSwgMHgwNDM5LCAweDUyMjgsCisgICAgMHgwNDNELCAweDUyMjksIDB4MDQzQiwgMHg1MjJBLCAweDA0M0MsIDB4NTIyRSwgMHgwNTUyLCAweDUyMzAsIDB4MDU1MSwKKyAgICAweDUyMzEsIDB4MTkxNywgMHg1MjMyLCAweDE5MTQsIDB4NTIzMywgMHgxOTE1LCAweDUyMzUsIDB4MTkxMywgMHg1MjM2LAorICAgIDB4MDU1MywgMHg1MjM3LCAweDA1NEYsIDB4NTIzOCwgMHgwNTRFLCAweDUyM0EsIDB4MDU1MCwgMHg1MjNCLCAweDA1NEQsCisgICAgMHg1MjQxLCAweDA1NTQsIDB4NTI0MywgMHgwNkMxLCAweDUyNDQsIDB4MUE2RCwgMHg1MjQ2LCAweDE5MTYsIDB4NTI0NywKKyAgICAweDA2QzYsIDB4NTI0OSwgMHgxQTZFLCAweDUyNEEsIDB4MDZDMiwgMHg1MjRCLCAweDA2QzUsIDB4NTI0QywgMHgwNkM0LAorICAgIDB4NTI0RCwgMHgwNkMzLCAweDUyNEUsIDB4MDZDMCwgMHg1MjUyLCAweDFDM0MsIDB4NTI1NCwgMHgwODVDLCAweDUyNTUsCisgICAgMHgxQzNGLCAweDUyNTYsIDB4MDg1QSwgMHg1MjVBLCAweDFDM0IsIDB4NTI1QiwgMHgwODVELCAweDUyNUMsIDB4MDg1QiwKKyAgICAweDUyNUQsIDB4MDg1RSwgMHg1MjVFLCAweDFDM0QsIDB4NTI1RiwgMHgxQzNFLCAweDUyNjEsIDB4MUMzQSwgMHg1MjYyLAorICAgIDB4MUM0MCwgMHg1MjY5LCAweDBCRjUsIDB4NTI2QSwgMHgwQTEyLCAweDUyNkIsIDB4MUU1MywgMHg1MjZDLCAweDFFNTUsCisgICAgMHg1MjZELCAweDFFNTQsIDB4NTI2RSwgMHgxRTU2LCAweDUyNkYsIDB4MEExMywgMHg1MjcyLCAweDBCRjIsIDB4NTI3NCwKKyAgICAweDBCRjMsIDB4NTI3NSwgMHgwQkY0LCAweDUyNzcsIDB4MERDQiwgMHg1Mjc4LCAweDIzNzcsIDB4NTI3QSwgMHgyMzc2LAorICAgIDB4NTI3QiwgMHgyMzc4LCAweDUyN0MsIDB4MjM3OSwgMHg1MjdELCAweDBEQ0MsIDB4NTI3RiwgMHgwRENBLCAweDUyODAsCisgICAgMHgyNjIzLCAweDUyODEsIDB4MjYyNCwgMHg1MjgyLCAweDBGOEQsIDB4NTI4MywgMHgwRjhDLCAweDUyODQsIDB4Mjc3NiwKKyAgICAweDUyODcsIDB4MTEwQywgMHg1Mjg4LCAweDExMEQsIDB4NTI4OSwgMHgxMTBFLCAweDUyOEEsIDB4MTExMCwgMHg1MjhCLAorICAgIDB4Mjg4OSwgMHg1MjhDLCAweDI4OEEsIDB4NTI4RCwgMHgxMTBGLCAweDUyOTEsIDB4MTI5MiwgMHg1MjkzLCAweDEyOTMsCisgICAgMHg1Mjk2LCAweDMwN0MsIDB4NTI5NywgMHgzMkM4LCAweDUyOTgsIDB4MzJDNywgMHg1Mjk5LCAweDM0MEYsIDB4NTI5QiwKKyAgICAweDAyNjIsIDB4NTI5RiwgMHgwMzBDLCAweDUyQTAsIDB4MDMwQiwgMHg1MkEzLCAweDAzOTUsIDB4NTJBNiwgMHgxN0M5LAorICAgIDB4NTJBOSwgMHgwNDNGLCAweDUyQUEsIDB4MDQ0MCwgMHg1MkFCLCAweDA0M0UsIDB4NTJBQywgMHgwNDQxLCAweDUyQUQsCisgICAgMHgxODM4LCAweDUyQUUsIDB4MTgzOSwgMHg1MkJCLCAweDA1NTYsIDB4NTJCQywgMHgxOTE4LCAweDUyQkUsIDB4MDU1NSwKKyAgICAweDUyQzAsIDB4MUE2RiwgMHg1MkMxLCAweDA2Q0EsIDB4NTJDMiwgMHgxQTcwLCAweDUyQzMsIDB4MDZDOSwgMHg1MkM3LAorICAgIDB4MDZDNywgMHg1MkM5LCAweDA2QzgsIDB4NTJDRCwgMHgxQzQxLCAweDUyRDIsIDB4MEExNCwgMHg1MkQzLCAweDFFNTgsCisgICAgMHg1MkQ1LCAweDBBMTcsIDB4NTJENiwgMHgxRTU3LCAweDUyRDcsIDB4MEFDRiwgMHg1MkQ4LCAweDBBMTYsIDB4NTJEOSwKKyAgICAweDBBMTUsIDB4NTJEQiwgMHgwQkY4LCAweDUyREQsIDB4MEJGNywgMHg1MkRFLCAweDBCRjYsIDB4NTJERiwgMHgwRENELAorICAgIDB4NTJFMiwgMHgwREQwLCAweDUyRTMsIDB4MEREMSwgMHg1MkU0LCAweDBEQ0YsIDB4NTJFNiwgMHgwRENFLCAweDUyRTksCisgICAgMHgyNjI1LCAweDUyRUIsIDB4MjYyNiwgMHg1MkVGLCAweDI4OEMsIDB4NTJGMCwgMHgxMTExLCAweDUyRjEsIDB4Mjg4QiwKKyAgICAweDUyRjMsIDB4MTI5NCwgMHg1MkY0LCAweDJENDAsIDB4NTJGNSwgMHgxM0I4LCAweDUyRjcsIDB4MzA3RCwgMHg1MkY4LAorICAgIDB4MTYwOSwgMHg1MkY5LCAweDAyMjAsIDB4NTJGQSwgMHgwMjc2LCAweDUyRkIsIDB4MDJCNCwgMHg1MkZDLCAweDE3ODEsCisgICAgMHg1MkZFLCAweDAyQjUsIDB4NTJGRiwgMHgwMkI2LCAweDUzMDUsIDB4MDMwRCwgMHg1MzA2LCAweDAzMEUsIDB4NTMwOCwKKyAgICAweDAzOTYsIDB4NTMwOSwgMHgxODNBLCAweDUzMEEsIDB4MTkxOSwgMHg1MzBCLCAweDE5MUEsIDB4NTMwRCwgMHgwNkNCLAorICAgIDB4NTMwRSwgMHgxQzQyLCAweDUzMEYsIDB4MEExOSwgMHg1MzEwLCAweDBBMTgsIDB4NTMxMSwgMHgyMEMwLCAweDUzMTIsCisgICAgMHgyMEJGLCAweDUzMTUsIDB4MDI2MywgMHg1MzE2LCAweDAyQjcsIDB4NTMxNywgMHgwMzBGLCAweDUzMTksIDB4MEExQSwKKyAgICAweDUzMUEsIDB4MTc2RiwgMHg1MzFDLCAweDE3OTgsIDB4NTMxRCwgMHgwMzEwLCAweDUzMUYsIDB4MTdDQiwgMHg1MzIwLAorICAgIDB4MDM5OCwgMHg1MzIxLCAweDAzOTcsIDB4NTMyMiwgMHgxN0NBLCAweDUzMjMsIDB4MDQ0MiwgMHg1MzJBLCAweDA4NUYsCisgICAgMHg1MzJELCAweDFFNTksIDB4NTMyRiwgMHgwREQyLCAweDUzMzAsIDB4MjYyNywgMHg1MzMxLCAweDBGOEUsIDB4NTMzNCwKKyAgICAweDJCMDYsIDB4NTMzNywgMHgzMUM3LCAweDUzMzgsIDB4MDIyMSwgMHg1MzM5LCAweDAyQjgsIDB4NTMzQywgMHgxOTFCLAorICAgIDB4NTMzRCwgMHgxQTcxLCAweDUzM0UsIDB4MEExRCwgMHg1MzNGLCAweDBBMUIsIDB4NTM0MCwgMHgwQTFDLCAweDUzNDEsCisgICAgMHgwMjY0LCAweDUzNDMsIDB4MDI3NywgMHg1MzQ0LCAweDAxNkIsIDB4NTM0NSwgMHgwMkJCLCAweDUzNDcsIDB4MDJCQSwKKyAgICAweDUzNDgsIDB4MDJCOSwgMHg1MzQ5LCAweDAzMTMsIDB4NTM0QSwgMHgwMzEyLCAweDUzNEMsIDB4MTc5OSwgMHg1MzRELAorICAgIDB4MTdDQywgMHg1MzUxLCAweDA1NUEsIDB4NTM1MiwgMHgwNTU3LCAweDUzNTMsIDB4MDU1OSwgMHg1MzU0LCAweDA1NTgsCisgICAgMHg1MzU3LCAweDA2Q0MsIDB4NTM1QSwgMHgwQkY5LCAweDUzNUMsIDB4MDI2NSwgMHg1MzVFLCAweDAyQkMsIDB4NTM2MCwKKyAgICAweDAzMTUsIDB4NTM2MSwgMHgwMzE0LCAweDUzNjMsIDB4MTgzQiwgMHg1MzY2LCAweDA1NUIsIDB4NTM2OSwgMHgwMjIyLAorICAgIDB4NTM2QywgMHgxNzgyLCAweDUzNkUsIDB4MDMxNywgMHg1MzZGLCAweDAzMTYsIDB4NTM3MCwgMHgwMzk5LCAweDUzNzEsCisgICAgMHgwMzlBLCAweDUzNzIsIDB4MTgzQywgMHg1MzczLCAweDA0NDMsIDB4NTM3NSwgMHgwNDQ0LCAweDUzNzcsIDB4MDU1QywKKyAgICAweDUzNzgsIDB4MDU1RCwgMHg1Mzc5LCAweDA1NUUsIDB4NTM3QiwgMHgwNkNELCAweDUzN0MsIDB4MUE3MiwgMHg1MzdGLAorICAgIDB4MDg2MCwgMHg1MzgyLCAweDE3NzAsIDB4NTM4NCwgMHgwMkJELCAweDUzOEEsIDB4MTdDRCwgMHg1MzhFLCAweDE4M0QsCisgICAgMHg1MzhGLCAweDE4M0UsIDB4NTM5MiwgMHgxOTFDLCAweDUzOTQsIDB4MTkxRCwgMHg1Mzk2LCAweDFBNzQsIDB4NTM5NywKKyAgICAweDFBNzMsIDB4NTM5OCwgMHgxQTc2LCAweDUzOTksIDB4MUE3NSwgMHg1MzlBLCAweDA2Q0UsIDB4NTM5QywgMHgxRTVBLAorICAgIDB4NTM5RCwgMHgwODYyLCAweDUzOUUsIDB4MUM0MywgMHg1MzlGLCAweDA4NjEsIDB4NTNBNCwgMHgyMEMxLCAweDUzQTUsCisgICAgMHgwQkZBLCAweDUzQTcsIDB4MjBDMiwgMHg1M0FDLCAweDI2MjgsIDB4NTNBRCwgMHgwRjhGLCAweDUzQjIsIDB4MTExMiwKKyAgICAweDUzQjQsIDB4MzA3RSwgMHg1M0I2LCAweDAyMjMsIDB4NTNCOSwgMHgxNzgzLCAweDUzQkIsIDB4MDMxOCwgMHg1M0MzLAorICAgIDB4MEExRSwgMHg1M0M4LCAweDAyNjYsIDB4NTNDOSwgMHgwMjc4LCAweDUzQ0EsIDB4MDJCRiwgMHg1M0NCLCAweDAyQkUsCisgICAgMHg1M0NELCAweDAyQzAsIDB4NTNENCwgMHgwNTYwLCAweDUzRDYsIDB4MDU1RiwgMHg1M0Q3LCAweDA1NjEsIDB4NTNEQiwKKyAgICAweDA2Q0YsIDB4NTNERiwgMHgwODYzLCAweDUzRTEsIDB4MkIwNywgMHg1M0UyLCAweDE0QzksIDB4NTNFMywgMHgwMjc5LAorICAgIDB4NTNFNCwgMHgwMzFBLCAweDUzRTUsIDB4MDMyOSwgMHg1M0U2LCAweDAzMjQsIDB4NTNFOCwgMHgwMzFGLCAweDUzRTksCisgICAgMHgwMzFFLCAweDUzRUEsIDB4MDMyNSwgMHg1M0VCLCAweDAzMjMsIDB4NTNFQywgMHgwMzFDLCAweDUzRUQsIDB4MDMyQSwKKyAgICAweDUzRUUsIDB4MDMxRCwgMHg1M0VGLCAweDAzMTksIDB4NTNGMCwgMHgwMzI4LCAweDUzRjEsIDB4MDMyNywgMHg1M0YyLAorICAgIDB4MDMyNiwgMHg1M0YzLCAweDAzMUIsIDB4NTNGNSwgMHgwMzIyLCAweDUzRjgsIDB4MDMyMSwgMHg1M0ZCLCAweDAzMkIsCisgICAgMHg1M0ZDLCAweDAzMjAsIDB4NTQwMSwgMHgwM0EwLCAweDU0MDMsIDB4MDNBNiwgMHg1NDA0LCAweDAzQTIsIDB4NTQwNiwKKyAgICAweDAzQTgsIDB4NTQwNywgMHgxN0NFLCAweDU0MDgsIDB4MDNBNSwgMHg1NDA5LCAweDAzOUIsIDB4NTQwQSwgMHgwMzlFLAorICAgIDB4NTQwQiwgMHgwM0ExLCAweDU0MEMsIDB4MDM5RCwgMHg1NDBELCAweDAzQTQsIDB4NTQwRSwgMHgwM0E3LCAweDU0MEYsCisgICAgMHgwMzlDLCAweDU0MTAsIDB4MDM5RiwgMHg1NDExLCAweDAzQTMsIDB4NTQxMiwgMHgwM0E5LCAweDU0MTgsIDB4MTg0NywKKyAgICAweDU0MTksIDB4MTg0NCwgMHg1NDFCLCAweDA0NTEsIDB4NTQxQywgMHgxODQ1LCAweDU0MUQsIDB4MDQ0NSwgMHg1NDFFLAorICAgIDB4MDQ0NywgMHg1NDFGLCAweDA0NUYsIDB4NTQyMCwgMHgwNDVBLCAweDU0MjQsIDB4MTg0QywgMHg1NDI1LCAweDE4NDYsCisgICAgMHg1NDI2LCAweDA0NDksIDB4NTQyNywgMHgwNDRCLCAweDU0MjgsIDB4MTg0QiwgMHg1NDI5LCAweDA0NTIsIDB4NTQyQSwKKyAgICAweDE4NDEsIDB4NTQyQiwgMHgwNDVFLCAweDU0MkMsIDB4MDQ2MCwgMHg1NDJELCAweDA0NDYsIDB4NTQyRSwgMHgwNDU3LAorICAgIDB4NTQzMCwgMHgxODNGLCAweDU0MzEsIDB4MDQ1RCwgMHg1NDMzLCAweDA0NEUsIDB4NTQzNSwgMHgwNDU4LCAweDU0MzYsCisgICAgMHgwNDU5LCAweDU0MzcsIDB4MTg0MCwgMHg1NDM4LCAweDA0NTYsIDB4NTQzOSwgMHgwNDU0LCAweDU0M0IsIDB4MDQ1NSwKKyAgICAweDU0M0MsIDB4MDQ1QiwgMHg1NDNELCAweDE4NDgsIDB4NTQzRSwgMHgwNDQ4LCAweDU0NDAsIDB4MDQ1QywgMHg1NDQxLAorICAgIDB4MTg0QSwgMHg1NDQyLCAweDA0NTAsIDB4NTQ0MywgMHgwNDRELCAweDU0NDUsIDB4MTg0MywgMHg1NDQ2LCAweDA0NEMsCisgICAgMHg1NDQ3LCAweDE4NEQsIDB4NTQ0OCwgMHgwNDRGLCAweDU0NEEsIDB4MDQ1MywgMHg1NDRFLCAweDA0NEEsIDB4NTQ0RiwKKyAgICAweDE4NDksIDB4NTQ1NCwgMHgxODQyLCAweDU0NjAsIDB4MTkyRSwgMHg1NDYxLCAweDE5MkQsIDB4NTQ2MiwgMHgwNTczLAorICAgIDB4NTQ2MywgMHgxOTMwLCAweDU0NjQsIDB4MTkzMiwgMHg1NDY1LCAweDE5MjcsIDB4NTQ2NiwgMHgxOTJBLCAweDU0NjcsCisgICAgMHgxOTMxLCAweDU0NjgsIDB4MDU3NCwgMHg1NDZCLCAweDE5MjQsIDB4NTQ2QywgMHgxOTI4LCAweDU0NkYsIDB4MTkyQywKKyAgICAweDU0NzAsIDB4MUE4NSwgMHg1NDcxLCAweDA1NkYsIDB4NTQ3MiwgMHgxQTg5LCAweDU0NzMsIDB4MDU2MiwgMHg1NDc0LAorICAgIDB4MTkyOSwgMHg1NDc1LCAweDA1NjMsIDB4NTQ3NiwgMHgwNTcwLCAweDU0NzcsIDB4MDU2OSwgMHg1NDc4LCAweDA1NjUsCisgICAgMHg1NDdBLCAweDE5MjUsIDB4NTQ3QiwgMHgwNTY4LCAweDU0N0MsIDB4MDU2RCwgMHg1NDdELCAweDA1NzYsIDB4NTQ3RSwKKyAgICAweDE5MjYsIDB4NTQ3RiwgMHgxOTFGLCAweDU0ODAsIDB4MDU2NywgMHg1NDgxLCAweDE5MjAsIDB4NTQ4MiwgMHgxOTIyLAorICAgIDB4NTQ4NCwgMHgwNTZBLCAweDU0ODYsIDB4MDU2QywgMHg1NDg3LCAweDE5MUUsIDB4NTQ4OCwgMHgxOTIzLCAweDU0OEIsCisgICAgMHgwNTc1LCAweDU0OEMsIDB4MDU3MSwgMHg1NDhELCAweDE5MkIsIDB4NTQ4RSwgMHgwNTc3LCAweDU0OTAsIDB4MDU2RSwKKyAgICAweDU0OTEsIDB4MTkyMSwgMHg1NDkyLCAweDA1NkIsIDB4NTQ5NSwgMHgwNTY2LCAweDU0OTYsIDB4MDU2NCwgMHg1NDk4LAorICAgIDB4MTkyRiwgMHg1NDlBLCAweDA1NzIsIDB4NTRBMCwgMHgxQTg0LCAweDU0QTEsIDB4MUE3OCwgMHg1NEEyLCAweDFBODcsCisgICAgMHg1NEE1LCAweDFBN0EsIDB4NTRBNiwgMHgwNkQ2LCAweDU0QTcsIDB4MDZFNCwgMHg1NEE4LCAweDA2RDIsIDB4NTRBOSwKKyAgICAweDA2RTMsIDB4NTRBQSwgMHgwNkRCLCAweDU0QUIsIDB4MDZFMCwgMHg1NEFDLCAweDA2RDAsIDB4NTRBRCwgMHgxQTc5LAorICAgIDB4NTRBRSwgMHgxQTdGLCAweDU0QUYsIDB4MDZERiwgMHg1NEIwLCAweDFBOEIsIDB4NTRCMSwgMHgwNkUxLCAweDU0QjMsCisgICAgMHgwNkQ3LCAweDU0QjYsIDB4MUE4MSwgMHg1NEI3LCAweDFBN0UsIDB4NTRCOCwgMHgwNkQ1LCAweDU0QkEsIDB4MUE3NywKKyAgICAweDU0QkIsIDB4MDZFMiwgMHg1NEJDLCAweDFBODYsIDB4NTRCRCwgMHgwNkRBLCAweDU0QkUsIDB4MUE4OCwgMHg1NEJGLAorICAgIDB4MDZFNSwgMHg1NEMwLCAweDA2RDEsIDB4NTRDMSwgMHgwNkRDLCAweDU0QzIsIDB4MDZEOSwgMHg1NEMzLCAweDFBN0MsCisgICAgMHg1NEM0LCAweDA2REQsIDB4NTRDNSwgMHgxQTgyLCAweDU0QzYsIDB4MUE4MywgMHg1NEM3LCAweDA2RDgsIDB4NTRDOCwKKyAgICAweDA2REUsIDB4NTRDOSwgMHgwNkQ0LCAweDU0Q0UsIDB4MDZEMywgMHg1NENGLCAweDFBN0IsIDB4NTRENiwgMHgxQTgwLAorICAgIDB4NTRERSwgMHgxQThBLCAweDU0RTAsIDB4MUM1NywgMHg1NEUxLCAweDA4NzAsIDB4NTRFMiwgMHgxQzQ1LCAweDU0RTQsCisgICAgMHgxQzRBLCAweDU0RTUsIDB4MDg2OSwgMHg1NEU2LCAweDA4NzQsIDB4NTRFNywgMHgxQzQ4LCAweDU0RTgsIDB4MDg2NCwKKyAgICAweDU0RTksIDB4MDg2RSwgMHg1NEVBLCAweDA4NzMsIDB4NTRFQiwgMHgxQzRGLCAweDU0RUQsIDB4MDg2RiwgMHg1NEVFLAorICAgIDB4MDg3MiwgMHg1NEYxLCAweDFDNTIsIDB4NTRGMiwgMHgwODZBLCAweDU0RjMsIDB4MUM0OSwgMHg1NEY3LCAweDFDNTUsCisgICAgMHg1NEY4LCAweDFDNTYsIDB4NTRGQSwgMHgwODZDLCAweDU0RkIsIDB4MUM1NCwgMHg1NEZDLCAweDA4NjgsIDB4NTRGRCwKKyAgICAweDA4NzcsIDB4NTRGRiwgMHgxQzRDLCAweDU1MDEsIDB4MDg2NiwgMHg1NTAzLCAweDFDNTksIDB4NTUwNCwgMHgxQzRELAorICAgIDB4NTUwNSwgMHgxQzUxLCAweDU1MDYsIDB4MDg2QiwgMHg1NTA3LCAweDA4NzYsIDB4NTUwOCwgMHgxQzRFLCAweDU1MDksCisgICAgMHgwODcxLCAweDU1MEEsIDB4MUM1MywgMHg1NTBCLCAweDFDNUEsIDB4NTUwQywgMHgxRTY5LCAweDU1MEUsIDB4MUM1OCwKKyAgICAweDU1MEYsIDB4MDg3OCwgMHg1NTEwLCAweDA4NjUsIDB4NTUxMSwgMHgxQzUwLCAweDU1MTIsIDB4MUM0NywgMHg1NTE0LAorICAgIDB4MDg2RCwgMHg1NTE3LCAweDFDNDYsIDB4NTUxQSwgMHgxQzRCLCAweDU1MjYsIDB4MUM0NCwgMHg1NTI3LCAweDA4NzUsCisgICAgMHg1NTJBLCAweDFFNjEsIDB4NTUyQywgMHgwQTMxLCAweDU1MkQsIDB4MUU2RiwgMHg1NTJFLCAweDBBMkYsIDB4NTUyRiwKKyAgICAweDBBMkMsIDB4NTUzMCwgMHgxRTY2LCAweDU1MzEsIDB4MEEyOCwgMHg1NTMyLCAweDFFNkEsIDB4NTUzMywgMHgwQTMzLAorICAgIDB4NTUzNCwgMHgxRTYwLCAweDU1MzUsIDB4MUU2NSwgMHg1NTM2LCAweDFFNjQsIDB4NTUzNywgMHgwODY3LCAweDU1MzgsCisgICAgMHgwQTJFLCAweDU1MzksIDB4MUU2RCwgMHg1NTNCLCAweDFFNzAsIDB4NTUzQywgMHgxRTVELCAweDU1M0UsIDB4MEMwQywKKyAgICAweDU1NDAsIDB4MUU3MSwgMHg1NTQxLCAweDBBMzQsIDB4NTU0MywgMHgwQTI2LCAweDU1NDQsIDB4MEEyMywgMHg1NTQ1LAorICAgIDB4MUU2OCwgMHg1NTQ2LCAweDBBMjAsIDB4NTU0OCwgMHgxRTZFLCAweDU1NEEsIDB4MEEyNywgMHg1NTRCLCAweDFFNzIsCisgICAgMHg1NTRELCAweDFFNUUsIDB4NTU0RSwgMHgxRTZDLCAweDU1NEYsIDB4MEEyQSwgMHg1NTUwLCAweDFFNUYsIDB4NTU1MSwKKyAgICAweDFFNjIsIDB4NTU1MiwgMHgxRTY3LCAweDU1NTUsIDB4MEEyQiwgMHg1NTU2LCAweDBBMjksIDB4NTU1NywgMHgwQTM1LAorICAgIDB4NTU1QywgMHgwQTMwLCAweDU1NUUsIDB4MEEyNCwgMHg1NTVGLCAweDBBQkMsIDB4NTU2MSwgMHgwQTI1LCAweDU1NjIsCisgICAgMHgxRTYzLCAweDU1NjMsIDB4MEEzMiwgMHg1NTY0LCAweDBBMkQsIDB4NTU2NSwgMHgxRTZCLCAweDU1NjYsIDB4MEEyMiwKKyAgICAweDU1NkEsIDB4MEEyMSwgMHg1NTc1LCAweDFFNUIsIDB4NTU3NiwgMHgxRTVDLCAweDU1NzcsIDB4MjBDNywgMHg1NTdCLAorICAgIDB4MEJGQiwgMHg1NTdDLCAweDBCRkUsIDB4NTU3RCwgMHgyMEQyLCAweDU1N0UsIDB4MEMxMiwgMHg1NTdGLCAweDIwRDUsCisgICAgMHg1NTgwLCAweDBCRkMsIDB4NTU4MSwgMHgyMENFLCAweDU1ODIsIDB4MEMwMiwgMHg1NTgzLCAweDBDMDgsIDB4NTU4NCwKKyAgICAweDBEMUIsIDB4NTU4NywgMHgwQzA2LCAweDU1ODgsIDB4MjBDQiwgMHg1NTg5LCAweDBDMTMsIDB4NTU4QSwgMHgwQkZGLAorICAgIDB4NTU4QiwgMHgwQzA3LCAweDU1OEMsIDB4MjBEMywgMHg1NThELCAweDIzODcsIDB4NTU4RSwgMHgyMEQ4LCAweDU1OEYsCisgICAgMHgyMENDLCAweDU1OTEsIDB4MjBDMywgMHg1NTkyLCAweDIwRDAsIDB4NTU5MywgMHgyMENBLCAweDU1OTQsIDB4MEMwNSwKKyAgICAweDU1OTUsIDB4MjBENiwgMHg1NTk4LCAweDBDMDEsIDB4NTU5OSwgMHgwQzE1LCAweDU1OUEsIDB4MEMwRSwgMHg1NTlDLAorICAgIDB4MEMwMywgMHg1NTlELCAweDBDMDAsIDB4NTU5RiwgMHgwQzBCLCAweDU1QTEsIDB4MjBENywgMHg1NUEyLCAweDIwQzksCisgICAgMHg1NUEzLCAweDIwQ0YsIDB4NTVBNCwgMHgyMEQxLCAweDU1QTUsIDB4MjBDNSwgMHg1NUE2LCAweDIwRDQsIDB4NTVBNywKKyAgICAweDBCRkQsIDB4NTVBOCwgMHgyMEM0LCAweDU1QUEsIDB4MEMwNCwgMHg1NUFCLCAweDBDMTQsIDB4NTVBQywgMHgwQzEwLAorICAgIDB4NTVBRCwgMHgyMEM2LCAweDU1QUUsIDB4MEMwQSwgMHg1NUIxLCAweDBDMTEsIDB4NTVCMiwgMHgwQzBELCAweDU1QjMsCisgICAgMHgwQzA5LCAweDU1QjUsIDB4MjBDRCwgMHg1NUJCLCAweDBDMEYsIDB4NTVCRiwgMHgyMzg1LCAweDU1QzAsIDB4MjM4MSwKKyAgICAweDU1QzIsIDB4MjM5MCwgMHg1NUMzLCAweDIzN0EsIDB4NTVDNCwgMHgyMzgzLCAweDU1QzUsIDB4MERFMCwgMHg1NUM2LAorICAgIDB4MERFMSwgMHg1NUM3LCAweDBERDksIDB4NTVDOCwgMHgyMzhDLCAweDU1QzksIDB4MERFMywgMHg1NUNBLCAweDIzN0YsCisgICAgMHg1NUNCLCAweDIzN0UsIDB4NTVDQywgMHgyMzdDLCAweDU1Q0QsIDB4MjM4RSwgMHg1NUNFLCAweDBERDcsIDB4NTVDRiwKKyAgICAweDIzODgsIDB4NTVEMCwgMHgyMzdELCAweDU1RDEsIDB4MEREQSwgMHg1NUQyLCAweDIzODYsIDB4NTVEMywgMHgwREQ1LAorICAgIDB4NTVENCwgMHgyMzgyLCAweDU1RDUsIDB4MjM4OSwgMHg1NUQ2LCAweDIzOEIsIDB4NTVEOSwgMHgyMzhGLCAweDU1REEsCisgICAgMHgwRERFLCAweDU1REIsIDB4MjM3QiwgMHg1NURDLCAweDBERDgsIDB4NTVERCwgMHgyMzgwLCAweDU1REYsIDB4MEREMywKKyAgICAweDU1RTEsIDB4MERERiwgMHg1NUUyLCAweDIzOEEsIDB4NTVFMywgMHgwRERCLCAweDU1RTQsIDB4MEREQywgMHg1NUU1LAorICAgIDB4MERFMiwgMHg1NUU2LCAweDBERDYsIDB4NTVFNywgMHgwMTFGLCAweDU1RTgsIDB4MERENCwgMHg1NUU5LCAweDIzODQsCisgICAgMHg1NUVGLCAweDBEREQsIDB4NTVGMiwgMHgyMzhELCAweDU1RjYsIDB4MEY5RiwgMHg1NUY3LCAweDBGOUEsIDB4NTVGOSwKKyAgICAweDI2MzcsIDB4NTVGQSwgMHgyNjMzLCAweDU1RkMsIDB4MjYyRCwgMHg1NUZELCAweDBGOTQsIDB4NTVGRSwgMHgwRjkwLAorICAgIDB4NTVGRiwgMHgyNjM2LCAweDU2MDAsIDB4MEY5MSwgMHg1NjAxLCAweDI2MzAsIDB4NTYwMiwgMHgyNjMyLCAweDU2MDQsCisgICAgMHgyNjM1LCAweDU2MDYsIDB4MEY5NiwgMHg1NjA4LCAweDBGOUQsIDB4NTYwOSwgMHgwRjk3LCAweDU2MEMsIDB4MjYyQiwKKyAgICAweDU2MEQsIDB4MEY5OCwgMHg1NjBFLCAweDBGOTksIDB4NTYwRiwgMHgyNjJFLCAweDU2MTAsIDB4MEY5RSwgMHg1NjEyLAorICAgIDB4MjYyQywgMHg1NjEzLCAweDI2MzEsIDB4NTYxNCwgMHgwRjk1LCAweDU2MTUsIDB4MjYyQSwgMHg1NjE2LCAweDBGOUIsCisgICAgMHg1NjE3LCAweDBGOTMsIDB4NTYxQiwgMHgwRjkyLCAweDU2MUMsIDB4MjYyRiwgMHg1NjFELCAweDI2MzQsIDB4NTYxRiwKKyAgICAweDBGOUMsIDB4NTYyNywgMHgyNjI5LCAweDU2MjksIDB4MTExOSwgMHg1NjJBLCAweDI4OUQsIDB4NTYyQywgMHgyODlBLAorICAgIDB4NTYyRSwgMHgxMTEzLCAweDU2MkYsIDB4MTExRiwgMHg1NjMwLCAweDExMjAsIDB4NTYzMiwgMHgxMTE2LCAweDU2MzMsCisgICAgMHgyODk4LCAweDU2MzQsIDB4MTExOCwgMHg1NjM1LCAweDI4OTAsIDB4NTYzNiwgMHgxMTFFLCAweDU2MzgsIDB4Mjg5QywKKyAgICAweDU2MzksIDB4MTExNSwgMHg1NjNBLCAweDI4OUUsIDB4NTYzQiwgMHgxMTE0LCAweDU2M0QsIDB4Mjg5OSwgMHg1NjNFLAorICAgIDB4Mjg5QiwgMHg1NjNGLCAweDExMTcsIDB4NTY0MCwgMHgyODk3LCAweDU2NDEsIDB4Mjg5MSwgMHg1NjQyLCAweDI4OEUsCisgICAgMHg1NjQ1LCAweDIwQzgsIDB4NTY0NiwgMHgyODk0LCAweDU2NDgsIDB4Mjg4RCwgMHg1NjQ5LCAweDI4OTMsIDB4NTY0QSwKKyAgICAweDI4OTIsIDB4NTY0QywgMHgyODhGLCAweDU2NEUsIDB4MTExQiwgMHg1NjUzLCAweDExMUEsIDB4NTY1NywgMHgxMTFDLAorICAgIDB4NTY1OCwgMHgyODk1LCAweDU2NTksIDB4MTI5NSwgMHg1NjVBLCAweDI4OTYsIDB4NTY1RSwgMHgyQjEwLCAweDU2NjAsCisgICAgMHgyQjA5LCAweDU2NjIsIDB4MTJBMSwgMHg1NjYzLCAweDJCMEQsIDB4NTY2NCwgMHgxMjk5LCAweDU2NjUsIDB4MTI5RCwKKyAgICAweDU2NjYsIDB4MkIwQywgMHg1NjY4LCAweDEyOUMsIDB4NTY2OSwgMHgxMjk4LCAweDU2NkEsIDB4MTI5QiwgMHg1NjZCLAorICAgIDB4MTI5NiwgMHg1NjZDLCAweDEyQTAsIDB4NTY2RCwgMHgyQjBFLCAweDU2NkUsIDB4MkIwQSwgMHg1NjZGLCAweDEyOUYsCisgICAgMHg1NjcwLCAweDJCMDgsIDB4NTY3MSwgMHgxMjlFLCAweDU2NzIsIDB4MkIwRiwgMHg1NjczLCAweDJCMEIsIDB4NTY3NCwKKyAgICAweDExMUQsIDB4NTY3NiwgMHgxMkEyLCAweDU2NzcsIDB4MkIxMSwgMHg1Njc4LCAweDEyOUEsIDB4NTY3OSwgMHgxMjk3LAorICAgIDB4NTY3RSwgMHgyRDQ3LCAweDU2N0YsIDB4MkQ0OSwgMHg1NjgwLCAweDEzQkEsIDB4NTY4MSwgMHgyRDRBLCAweDU2ODIsCisgICAgMHgyRDQ4LCAweDU2ODMsIDB4MkQ0NiwgMHg1Njg0LCAweDJENDUsIDB4NTY4NSwgMHgxM0JDLCAweDU2ODYsIDB4MkQ0NCwKKyAgICAweDU2ODcsIDB4MTNCRCwgMHg1NjhDLCAweDJENDIsIDB4NTY4RCwgMHgyRDQzLCAweDU2OEUsIDB4MTNCOSwgMHg1NjhGLAorICAgIDB4MTNCRSwgMHg1NjkwLCAweDEzQkIsIDB4NTY5MywgMHgyRDQxLCAweDU2OTUsIDB4MTRDQSwgMHg1Njk3LCAweDJGMTMsCisgICAgMHg1Njk4LCAweDJGMTEsIDB4NTY5OSwgMHgyRjE2LCAweDU2OUEsIDB4MkYxNCwgMHg1NjlDLCAweDJGMTIsIDB4NTY5RCwKKyAgICAweDJGMTUsIDB4NTZBNSwgMHgxNTc2LCAweDU2QTYsIDB4MzA4MSwgMHg1NkE3LCAweDMwODIsIDB4NTZBOCwgMHgxNTc3LAorICAgIDB4NTZBQSwgMHgzMDgzLCAweDU2QUIsIDB4MzA3RiwgMHg1NkFDLCAweDMwODQsIDB4NTZBRCwgMHgzMDgwLCAweDU2QUUsCisgICAgMHgxNENCLCAweDU2QjIsIDB4MzFDOCwgMHg1NkIzLCAweDMxQ0EsIDB4NTZCNCwgMHgxNjBDLCAweDU2QjUsIDB4MzFDOSwKKyAgICAweDU2QjYsIDB4MTYwQiwgMHg1NkI3LCAweDE2MEEsIDB4NTZCQywgMHgxNjBELCAweDU2QkQsIDB4MzJDQSwgMHg1NkJFLAorICAgIDB4MzJDQiwgMHg1NkMwLCAweDE2NkIsIDB4NTZDMSwgMHgxNjZBLCAweDU2QzIsIDB4MTY2QywgMHg1NkMzLCAweDMyQzksCisgICAgMHg1NkM1LCAweDMzNzksIDB4NTZDNiwgMHgzMzc4LCAweDU2QzgsIDB4MTZCRCwgMHg1NkM5LCAweDE2QkYsIDB4NTZDQSwKKyAgICAweDE2QkUsIDB4NTZDQiwgMHgzMzdBLCAweDU2Q0MsIDB4MTZGNiwgMHg1NkNELCAweDM0ODEsIDB4NTZEMSwgMHgxNzFGLAorICAgIDB4NTZEMywgMHgzNDgwLCAweDU2RDQsIDB4MzRDOSwgMHg1NkQ3LCAweDE3NzUsIDB4NTZEQSwgMHgwMzJELCAweDU2REIsCisgICAgMHgwMzJDLCAweDU2REQsIDB4MDNBQywgMHg1NkRFLCAweDAzQUIsIDB4NTZERiwgMHgxN0QwLCAweDU2RTAsIDB4MDNBQSwKKyAgICAweDU2RTEsIDB4MTdDRiwgMHg1NkU0LCAweDA0NjMsIDB4NTZFNSwgMHgxODUwLCAweDU2RTcsIDB4MTg0RiwgMHg1NkVBLAorICAgIDB4MDQ2MSwgMHg1NkVCLCAweDA0NjQsIDB4NTZFRSwgMHgxODRFLCAweDU2RjAsIDB4MDQ2MiwgMHg1NkY3LCAweDE5MzMsCisgICAgMHg1NkY5LCAweDE5MzQsIDB4NTZGQSwgMHgwNTc4LCAweDU2RkYsIDB4MDZFNiwgMHg1NzAxLCAweDFDNUIsIDB4NTcwMiwKKyAgICAweDFDNUMsIDB4NTcwMywgMHgwODc5LCAweDU3MDQsIDB4MDg3QSwgMHg1NzA3LCAweDFFNzQsIDB4NTcwOCwgMHgwQTM2LAorICAgIDB4NTcwOSwgMHgwQTM4LCAweDU3MEEsIDB4MUU3MywgMHg1NzBCLCAweDBBMzcsIDB4NTcwQywgMHgyMEQ5LCAweDU3MEQsCisgICAgMHgwQzE2LCAweDU3MTIsIDB4MERFNCwgMHg1NzEzLCAweDBERTUsIDB4NTcxNCwgMHgyMzkxLCAweDU3MTYsIDB4MEZBMSwKKyAgICAweDU3MTgsIDB4MEZBMCwgMHg1NzFBLCAweDI4OUYsIDB4NTcxQiwgMHgyQjEzLCAweDU3MUMsIDB4MkIxMiwgMHg1NzFFLAorICAgIDB4MzUwNSwgMHg1NzFGLCAweDAyN0EsIDB4NTcyMCwgMHgxNzg0LCAweDU3MjIsIDB4MTc5QSwgMHg1NzIzLCAweDE3OUIsCisgICAgMHg1NzI4LCAweDAzQUYsIDB4NTcyOSwgMHgwM0IzLCAweDU3MkEsIDB4MTdEMiwgMHg1NzJDLCAweDAzQjEsIDB4NTcyRCwKKyAgICAweDAzQjAsIDB4NTcyRSwgMHgxN0QxLCAweDU3MkYsIDB4MDNCMiwgMHg1NzMwLCAweDAzQUUsIDB4NTczMywgMHgwM0FELAorICAgIDB4NTczNCwgMHgxN0QzLCAweDU3M0IsIDB4MDQ2RSwgMHg1NzNFLCAweDA0NkIsIDB4NTc0MCwgMHgwNDY3LCAweDU3NDEsCisgICAgMHgxODUxLCAweDU3NDUsIDB4MTg1MiwgMHg1NzQ3LCAweDA0NjksIDB4NTc0OSwgMHgxODU0LCAweDU3NEEsIDB4MDQ2NSwKKyAgICAweDU3NEIsIDB4MTg1NSwgMHg1NzRDLCAweDE4NTMsIDB4NTc0RCwgMHgwNDY4LCAweDU3NEUsIDB4MDQ2QSwgMHg1NzRGLAorICAgIDB4MDQ2RCwgMHg1NzUwLCAweDA0NkMsIDB4NTc1MSwgMHgwNDY2LCAweDU3NTIsIDB4MTg1NiwgMHg1NzYxLCAweDA1N0QsCisgICAgMHg1NzYyLCAweDE5NDEsIDB4NTc2NCwgMHgwNTdGLCAweDU3NjYsIDB4MDU3RSwgMHg1NzY4LCAweDE5NDIsIDB4NTc2OSwKKyAgICAweDA1N0MsIDB4NTc2QSwgMHgwNTdCLCAweDU3NkIsIDB4MTkzOCwgMHg1NzZELCAweDE5MzcsIDB4NTc2RiwgMHgxOTM1LAorICAgIDB4NTc3MCwgMHgxOTNBLCAweDU3NzEsIDB4MTkzOSwgMHg1NzcyLCAweDE5MzYsIDB4NTc3MywgMHgxOTNGLCAweDU3NzQsCisgICAgMHgxOTQwLCAweDU3NzUsIDB4MTkzRCwgMHg1Nzc2LCAweDE5M0IsIDB4NTc3NywgMHgwNTdBLCAweDU3N0IsIDB4MTkzRSwKKyAgICAweDU3N0MsIDB4MDU4MCwgMHg1NzdELCAweDE5NDMsIDB4NTc4MCwgMHgxOTNDLCAweDU3ODIsIDB4MDZFNywgMHg1NzgzLAorICAgIDB4MDU3OSwgMHg1NzhCLCAweDA2RTgsIDB4NTc4QywgMHgxQTkwLCAweDU3OEYsIDB4MUE5NiwgMHg1NzkzLCAweDA2RUUsCisgICAgMHg1Nzk0LCAweDFBOTQsIDB4NTc5NSwgMHgxQTlBLCAweDU3OTcsIDB4MUE5MSwgMHg1Nzk4LCAweDFBOTUsIDB4NTc5OSwKKyAgICAweDFBOTcsIDB4NTc5QSwgMHgxQTk5LCAweDU3OUIsIDB4MUE5MywgMHg1NzlELCAweDFBOTIsIDB4NTc5RSwgMHgxQThELAorICAgIDB4NTc5RiwgMHgxQThFLCAweDU3QTAsIDB4MDZFOSwgMHg1N0EyLCAweDA2RUIsIDB4NTdBMywgMHgwNkVBLCAweDU3QTQsCisgICAgMHgxQThGLCAweDU3QTUsIDB4MUE5OCwgMHg1N0FFLCAweDA2RUQsIDB4NTdCNSwgMHgxQThDLCAweDU3QjYsIDB4MUM2NiwKKyAgICAweDU3QjgsIDB4MUM2NSwgMHg1N0I5LCAweDFDNkEsIDB4NTdCQSwgMHgxQzYxLCAweDU3QkMsIDB4MUM2NCwgMHg1N0JELAorICAgIDB4MUM2MywgMHg1N0JGLCAweDFDNjcsIDB4NTdDMSwgMHgxQzZCLCAweDU3QzIsIDB4MDg3QiwgMHg1N0MzLCAweDA4N0UsCisgICAgMHg1N0M2LCAweDFDNjIsIDB4NTdDNywgMHgxQzY4LCAweDU3Q0IsIDB4MDg3RCwgMHg1N0NDLCAweDFDNUQsIDB4NTdDRSwKKyAgICAweDA2RUMsIDB4NTdDRiwgMHgxRTgyLCAweDU3RDAsIDB4MUM2OSwgMHg1N0QyLCAweDFDNjAsIDB4NTdENCwgMHgwODdDLAorICAgIDB4NTdENSwgMHgxQzVGLCAweDU3REMsIDB4MUU3OSwgMHg1N0RGLCAweDBBMzksIDB4NTdFMCwgMHgwQTNELCAweDU3RTEsCisgICAgMHgxRTg5LCAweDU3RTIsIDB4MUU3NywgMHg1N0UzLCAweDFFODUsIDB4NTdFNCwgMHgwQTNFLCAweDU3RTUsIDB4MUU4NywKKyAgICAweDU3RTcsIDB4MUU4RCwgMHg1N0U5LCAweDFFOTEsIDB4NTdFQywgMHgxRTg4LCAweDU3RUQsIDB4MUU3QywgMHg1N0VFLAorICAgIDB4MUU4NCwgMHg1N0YwLCAweDFFOTIsIDB4NTdGMSwgMHgxRTkwLCAweDU3RjIsIDB4MUU4NiwgMHg1N0YzLCAweDFFODEsCisgICAgMHg1N0Y0LCAweDFFN0EsIDB4NTdGNSwgMHgyMEUxLCAweDU3RjYsIDB4MUU3OCwgMHg1N0Y3LCAweDBBNDIsIDB4NTdGOCwKKyAgICAweDFFN0YsIDB4NTdGOSwgMHgwQTQzLCAweDU3RkEsIDB4MEEzRiwgMHg1N0ZCLCAweDFFNzUsIDB4NTdGQywgMHgxRThCLAorICAgIDB4NTdGRCwgMHgxRTdELCAweDU4MDAsIDB4MUU3QiwgMHg1ODAxLCAweDFFOEUsIDB4NTgwMiwgMHgwQTQwLCAweDU4MDQsCisgICAgMHgxRTk0LCAweDU4MDUsIDB4MEEzQSwgMHg1ODA2LCAweDBBM0MsIDB4NTgwNywgMHgxRTgzLCAweDU4MDgsIDB4MUU3RSwKKyAgICAweDU4MDksIDB4MDg3RiwgMHg1ODBBLCAweDBBM0IsIDB4NTgwQiwgMHgxRTgwLCAweDU4MEMsIDB4MUU4RiwgMHg1ODBELAorICAgIDB4MUU5MywgMHg1ODBFLCAweDFFOEEsIDB4NTgxMCwgMHgxRThDLCAweDU4MTQsIDB4MUU3NiwgMHg1ODE5LCAweDIwREMsCisgICAgMHg1ODFCLCAweDIwRTUsIDB4NTgxQywgMHgyMEU0LCAweDU4MUQsIDB4MEMxRSwgMHg1ODFFLCAweDIwREQsIDB4NTgyMCwKKyAgICAweDBDMUYsIDB4NTgyMSwgMHgwQzFELCAweDU4MjMsIDB4MjBERiwgMHg1ODI0LCAweDBDMUEsIDB4NTgyNSwgMHgyMEUzLAorICAgIDB4NTgyNywgMHgyMERFLCAweDU4MjgsIDB4MjBFMCwgMHg1ODI5LCAweDIwREEsIDB4NTgyQSwgMHgwQzE4LCAweDU4MkMsCisgICAgMHgyMEVELCAweDU4MkQsIDB4MjBFQywgMHg1ODJFLCAweDIwRTksIDB4NTgyRiwgMHgwQzE3LCAweDU4MzAsIDB4MEMxQiwKKyAgICAweDU4MzEsIDB4MEMxQywgMHg1ODMyLCAweDFDNUUsIDB4NTgzMywgMHgyMEU2LCAweDU4MzQsIDB4MEMxOSwgMHg1ODM1LAorICAgIDB4MEE0MSwgMHg1ODM2LCAweDIwRTgsIDB4NTgzNywgMHgyMERCLCAweDU4MzgsIDB4MjBFQiwgMHg1ODM5LCAweDIwRUEsCisgICAgMHg1ODNCLCAweDIwRUUsIDB4NTgzRCwgMHgyMzlGLCAweDU4M0YsIDB4MjBFNywgMHg1ODQ4LCAweDIwRTIsIDB4NTg0OSwKKyAgICAweDIzOTcsIDB4NTg0QSwgMHgwREVGLCAweDU4NEIsIDB4MERGMiwgMHg1ODRDLCAweDBERUQsIDB4NTg0RCwgMHgyMzk2LAorICAgIDB4NTg0RSwgMHgyMzlBLCAweDU4NEYsIDB4MjM5NSwgMHg1ODUxLCAweDBERTcsIDB4NTg1MiwgMHgwREYxLCAweDU4NTMsCisgICAgMHgyMzkyLCAweDU4NTQsIDB4MERFQiwgMHg1ODU1LCAweDIzOTksIDB4NTg1NywgMHgwREU5LCAweDU4NTgsIDB4MERFOCwKKyAgICAweDU4NTksIDB4MjM5QywgMHg1ODVBLCAweDBERUEsIDB4NTg1QiwgMHgyMzlFLCAweDU4NUQsIDB4MjM5QiwgMHg1ODVFLAorICAgIDB4MERFNiwgMHg1ODYyLCAweDBERjAsIDB4NTg2MywgMHgyM0EwLCAweDU4NjQsIDB4MjM5NCwgMHg1ODY1LCAweDIzOUQsCisgICAgMHg1ODY4LCAweDIzOTMsIDB4NTg2QiwgMHgwREVDLCAweDU4NkQsIDB4MERFRSwgMHg1ODZGLCAweDIzOTgsIDB4NTg3MSwKKyAgICAweDIzQTEsIDB4NTg3NCwgMHgyNjNGLCAweDU4NzUsIDB4MEZBMiwgMHg1ODc2LCAweDI2NDUsIDB4NTg3OSwgMHgwRkE3LAorICAgIDB4NTg3QSwgMHgyNjQxLCAweDU4N0IsIDB4MjY0OCwgMHg1ODdDLCAweDI2MzksIDB4NTg3RCwgMHgwRkE5LCAweDU4N0UsCisgICAgMHgwRkEzLCAweDU4N0YsIDB4MjYzRSwgMHg1ODgwLCAweDExMjEsIDB4NTg4MSwgMHgyNjNELCAweDU4ODIsIDB4MjY0NiwKKyAgICAweDU4ODMsIDB4MEZBNCwgMHg1ODg1LCAweDBGQTgsIDB4NTg4NiwgMHgyNjNDLCAweDU4ODcsIDB4MjY0MiwgMHg1ODg4LAorICAgIDB4MjY0NywgMHg1ODg5LCAweDI2MzgsIDB4NTg4QSwgMHgwRkE2LCAweDU4OEIsIDB4MjY0MCwgMHg1ODhFLCAweDI2NDQsCisgICAgMHg1ODhGLCAweDI2NEEsIDB4NTg5MCwgMHgyNjNBLCAweDU4OTEsIDB4MjY0MywgMHg1ODkzLCAweDBGQTUsIDB4NTg5NCwKKyAgICAweDI2NDksIDB4NTg5OCwgMHgyNjNCLCAweDU4OUMsIDB4MTEyNSwgMHg1ODlELCAweDI4QTEsIDB4NTg5RSwgMHgxMTIzLAorICAgIDB4NTg5RiwgMHgxMTIyLCAweDU4QTAsIDB4MjhBMywgMHg1OEExLCAweDI4QTgsIDB4NThBMywgMHgyOEE0LCAweDU4QTUsCisgICAgMHgyOEE3LCAweDU4QTYsIDB4MTEyOCwgMHg1OEE4LCAweDEyODgsIDB4NThBOSwgMHgxMTI3LCAweDU4QUIsIDB4MjhBMCwKKyAgICAweDU4QUMsIDB4MjhBNiwgMHg1OEFFLCAweDExMjYsIDB4NThBRiwgMHgyOEE1LCAweDU4QjEsIDB4MjhBMiwgMHg1OEIzLAorICAgIDB4MTEyNCwgMHg1OEJBLCAweDJCMTgsIDB4NThCQiwgMHgzNkVCLCAweDU4QkMsIDB4MkIxQSwgMHg1OEJELCAweDJCMTUsCisgICAgMHg1OEJFLCAweDEyQTQsIDB4NThCRiwgMHgyQjE3LCAweDU4QzEsIDB4MTJBMywgMHg1OEMyLCAweDJCMTksIDB4NThDNSwKKyAgICAweDEyQTYsIDB4NThDNiwgMHgyQjFCLCAweDU4QzcsIDB4MTJBNSwgMHg1OEM4LCAweDJCMTQsIDB4NThDOSwgMHgyQjE2LAorICAgIDB4NThDRSwgMHgxM0MyLCAweDU4Q0YsIDB4MkQ0RCwgMHg1OEQxLCAweDEzQzEsIDB4NThEMiwgMHgyRDRFLCAweDU4RDMsCisgICAgMHgxM0MwLCAweDU4RDQsIDB4MkQ0QywgMHg1OEQ1LCAweDEzQkYsIDB4NThENiwgMHgyRDRCLCAweDU4RDgsIDB4MTRDRCwKKyAgICAweDU4RDksIDB4MTRDQywgMHg1OERBLCAweDMwODUsIDB4NThEQiwgMHgzMDg3LCAweDU4REQsIDB4MzA4NiwgMHg1OERFLAorICAgIDB4MTU3OCwgMHg1OERGLCAweDE1NzksIDB4NThFMiwgMHgxNTdBLCAweDU4RTMsIDB4MzFDQiwgMHg1OEU0LCAweDE2MEUsCisgICAgMHg1OEU3LCAweDM0MTEsIDB4NThFOCwgMHgzNDEwLCAweDU4RTksIDB4MTcyMCwgMHg1OEVCLCAweDAyN0IsIDB4NThFQywKKyAgICAweDAyQzEsIDB4NThFRiwgMHgwNDZGLCAweDU4RjQsIDB4MUE5QiwgMHg1OEY5LCAweDBDMjAsIDB4NThGQSwgMHgwQzIxLAorICAgIDB4NThGQywgMHgyM0EyLCAweDU4RkQsIDB4MEZBQSwgMHg1OEZFLCAweDI2NEIsIDB4NThGRiwgMHgyOEE5LCAweDU5MDIsCisgICAgMHgwMjI0LCAweDU5MDMsIDB4MTc4NSwgMHg1OTA2LCAweDE4NTcsIDB4NTkwQSwgMHgwMjI0LCAweDU5MEMsIDB4MTk0NCwKKyAgICAweDU5MEQsIDB4MUE5QywgMHg1OTBFLCAweDFDNkMsIDB4NTkwRiwgMHgwODgwLCAweDU5MTIsIDB4MzA4OCwgMHg1OTE0LAorICAgIDB4MTY2RCwgMHg1OTE1LCAweDAyN0MsIDB4NTkxNiwgMHgwMzJFLCAweDU5MTcsIDB4MTc5QywgMHg1OTE5LCAweDAzQjQsCisgICAgMHg1OTFBLCAweDAzQjUsIDB4NTkxQywgMHgwNTgxLCAweDU5MjAsIDB4MEE0NCwgMHg1OTIyLCAweDBGQUMsIDB4NTkyNCwKKyAgICAweDBGQUQsIDB4NTkyNSwgMHgwRkFCLCAweDU5MjcsIDB4MDI3RCwgMHg1OTI5LCAweDAyQzIsIDB4NTkyQSwgMHgwMkM0LAorICAgIDB4NTkyQiwgMHgwMkMzLCAweDU5MkMsIDB4MTc4NiwgMHg1OTJELCAweDAyQzUsIDB4NTkyRSwgMHgwMzJGLCAweDU5MkYsCisgICAgMHgxNzlELCAweDU5MzEsIDB4MDMzMCwgMHg1OTM3LCAweDAzQjYsIDB4NTkzOCwgMHgwM0I3LCAweDU5M0MsIDB4MTdENCwKKyAgICAweDU5M0UsIDB4MDQ3MCwgMHg1OTQwLCAweDE4NTgsIDB4NTk0NCwgMHgwNTg1LCAweDU5NDUsIDB4MTk0NSwgMHg1OTQ3LAorICAgIDB4MDU4MywgMHg1OTQ4LCAweDA1ODQsIDB4NTk0OSwgMHgwNTgyLCAweDU5NEEsIDB4MUM2RCwgMHg1OTRFLCAweDA2RjIsCisgICAgMHg1OTRGLCAweDA2RjEsIDB4NTk1MCwgMHgwNkYzLCAweDU5NTEsIDB4MDZGMCwgMHg1OTUzLCAweDFBOUQsIDB4NTk1NCwKKyAgICAweDA1ODYsIDB4NTk1NSwgMHgwNkVGLCAweDU5NTcsIDB4MDg4MSwgMHg1OTU4LCAweDA4ODIsIDB4NTk1QSwgMHgwODgzLAorICAgIDB4NTk1QywgMHgxRTk1LCAweDU5NjAsIDB4MEMyMiwgMHg1OTYxLCAweDIwRUYsIDB4NTk2MiwgMHgwQTQ1LCAweDU5NjcsCisgICAgMHgwREYzLCAweDU5NjksIDB4MEZBRiwgMHg1OTZBLCAweDBGQUUsIDB4NTk2QiwgMHgyNjRDLCAweDU5NkQsIDB4MTEyOSwKKyAgICAweDU5NkUsIDB4MTJBNywgMHg1OTcwLCAweDJGMTcsIDB4NTk3MSwgMHgzMzdCLCAweDU5NzIsIDB4MzQxMiwgMHg1OTczLAorICAgIDB4MDI3RSwgMHg1OTc0LCAweDAzMzEsIDB4NTk3NiwgMHgwMzMyLCAweDU5NzcsIDB4MTdEQSwgMHg1OTc4LCAweDAzQjksCisgICAgMHg1OTc5LCAweDAzQkMsIDB4NTk3QiwgMHgxN0Q4LCAweDU5N0MsIDB4MTdENiwgMHg1OTdELCAweDAzQkIsIDB4NTk3RSwKKyAgICAweDE3RDksIDB4NTk3RiwgMHgxN0RCLCAweDU5ODAsIDB4MTdENSwgMHg1OTgxLCAweDAzQkUsIDB4NTk4MiwgMHgwM0JELAorICAgIDB4NTk4MywgMHgwM0JBLCAweDU5ODQsIDB4MDNCOCwgMHg1OTg1LCAweDE3RDcsIDB4NTk4QSwgMHgwNDdCLCAweDU5OEQsCisgICAgMHgwNDc4LCAweDU5OEUsIDB4MTg1RCwgMHg1OThGLCAweDE4NjAsIDB4NTk5MCwgMHgxODVGLCAweDU5OTIsIDB4MDQ3MiwKKyAgICAweDU5OTMsIDB4MDQ3QSwgMHg1OTk2LCAweDA0NzcsIDB4NTk5NywgMHgxODVDLCAweDU5OTgsIDB4MTg1QSwgMHg1OTk5LAorICAgIDB4MDQ3NiwgMHg1OTlELCAweDA0NzEsIDB4NTk5RSwgMHgwNDc0LCAweDU5QTAsIDB4MTg1QiwgMHg1OUExLCAweDE4NjIsCisgICAgMHg1OUEyLCAweDE4NUUsIDB4NTlBMywgMHgwNDc1LCAweDU5QTQsIDB4MDQ3OSwgMHg1OUE1LCAweDA0N0MsIDB4NTlBNiwKKyAgICAweDE4NTksIDB4NTlBNywgMHgxODYxLCAweDU5QTgsIDB4MDQ3MywgMHg1OUFFLCAweDA1OEIsIDB4NTlBRiwgMHgwNTkzLAorICAgIDB4NTlCMSwgMHgxOTUxLCAweDU5QjIsIDB4MTk0QSwgMHg1OUIzLCAweDA1OTQsIDB4NTlCNCwgMHgxOTU1LCAweDU5QjUsCisgICAgMHgxOTQ2LCAweDU5QjYsIDB4MTk0RCwgMHg1OUI5LCAweDA1OEEsIDB4NTlCQSwgMHgxOTQ3LCAweDU5QkIsIDB4MDU4OCwKKyAgICAweDU5QkMsIDB4MTk0RSwgMHg1OUJELCAweDE5NTIsIDB4NTlCRSwgMHgwNTg3LCAweDU5QzAsIDB4MTk1MywgMHg1OUMxLAorICAgIDB4MTk0QywgMHg1OUMzLCAweDE5NEYsIDB4NTlDNSwgMHgwNTk2LCAweDU5QzYsIDB4MDU4RCwgMHg1OUM3LCAweDE5NTYsCisgICAgMHg1OUM4LCAweDE5NTQsIDB4NTlDQSwgMHgwNTkyLCAweDU5Q0IsIDB4MDU5MCwgMHg1OUNDLCAweDE5NEIsIDB4NTlDRCwKKyAgICAweDA1OEYsIDB4NTlDRSwgMHgxOTQ5LCAweDU5Q0YsIDB4MTk0OCwgMHg1OUQwLCAweDA1OEUsIDB4NTlEMSwgMHgwNThDLAorICAgIDB4NTlEMiwgMHgwNTk1LCAweDU5RDMsIDB4MDU5MSwgMHg1OUQ0LCAweDA1ODksIDB4NTlENiwgMHgxOTUwLCAweDU5RDgsCisgICAgMHgwNkY1LCAweDU5REEsIDB4MDZGQywgMHg1OURCLCAweDFBQUIsIDB4NTlEQywgMHgwNkY0LCAweDU5REQsIDB4MUFBMywKKyAgICAweDU5REUsIDB4MUE5RiwgMHg1OUUwLCAweDFBQUYsIDB4NTlFMSwgMHgxQTlFLCAweDU5RTMsIDB4MDZGNywgMHg1OUU0LAorICAgIDB4MUFBOCwgMHg1OUU1LCAweDA2RkEsIDB4NTlFNiwgMHgwNkZELCAweDU5RTgsIDB4MDZGOCwgMHg1OUU5LCAweDFBQUMsCisgICAgMHg1OUVBLCAweDA2RkIsIDB4NTlFQywgMHgwODhBLCAweDU5RUQsIDB4MUFCMiwgMHg1OUVFLCAweDFBQTAsIDB4NTlGMSwKKyAgICAweDFBQTIsIDB4NTlGMiwgMHgxQUE5LCAweDU5RjMsIDB4MUFBRCwgMHg1OUY0LCAweDFBQjEsIDB4NTlGNSwgMHgxQUFFLAorICAgIDB4NTlGNiwgMHgxQUE3LCAweDU5RjcsIDB4MUFBQSwgMHg1OUZBLCAweDFBQTQsIDB4NTlGQiwgMHgwNkZGLCAweDU5RkMsCisgICAgMHgxQUE2LCAweDU5RkQsIDB4MUFBNSwgMHg1OUZFLCAweDFBQjAsIDB4NTlGRiwgMHgwNkY2LCAweDVBMDAsIDB4MUFBMSwKKyAgICAweDVBMDEsIDB4MDZGRSwgMHg1QTAzLCAweDA2RjksIDB4NUEwOSwgMHgwODkwLCAweDVBMEEsIDB4MUM3NSwgMHg1QTBDLAorICAgIDB4MDg4RiwgMHg1QTBGLCAweDFDNzMsIDB4NUExMSwgMHgwODg0LCAweDVBMTMsIDB4MDg4OSwgMHg1QTE1LCAweDFDNzIsCisgICAgMHg1QTE2LCAweDFDNkYsIDB4NUExNywgMHgxQzc0LCAweDVBMTgsIDB4MDg4NSwgMHg1QTE5LCAweDFDNkUsIDB4NUExQiwKKyAgICAweDA4ODgsIDB4NUExQywgMHgwODg2LCAweDVBMUUsIDB4MUM3NiwgMHg1QTFGLCAweDA4ODcsIDB4NUEyMCwgMHgwODhCLAorICAgIDB4NUEyMywgMHgwODhDLCAweDVBMjUsIDB4MDg4RSwgMHg1QTI5LCAweDA4OEQsIDB4NUEyRCwgMHgxQzcwLCAweDVBMkUsCisgICAgMHgxQzcxLCAweDVBMzMsIDB4MUM3NywgMHg1QTM1LCAweDFFOUMsIDB4NUEzNiwgMHgwQTQ2LCAweDVBMzcsIDB4MjBGRCwKKyAgICAweDVBMzgsIDB4MUU5QiwgMHg1QTM5LCAweDFFQUUsIDB4NUEzQywgMHgwQTRDLCAweDVBM0UsIDB4MUVBQywgMHg1QTQwLAorICAgIDB4MEE0QiwgMHg1QTQxLCAweDBBNDcsIDB4NUE0MiwgMHgxRUI1LCAweDVBNDMsIDB4MUVBNSwgMHg1QTQ0LCAweDFFQTgsCisgICAgMHg1QTQ2LCAweDBBNEYsIDB4NUE0NywgMHgxRUIyLCAweDVBNDgsIDB4MUVBQSwgMHg1QTQ5LCAweDBBNDgsIDB4NUE0QSwKKyAgICAweDBBNTAsIDB4NUE0QywgMHgxRUFGLCAweDVBNEQsIDB4MUVBRCwgMHg1QTUwLCAweDFFOUUsIDB4NUE1MSwgMHgxRUIzLAorICAgIDB4NUE1MiwgMHgxRUE3LCAweDVBNTMsIDB4MUVBMiwgMHg1QTU1LCAweDFFOTgsIDB4NUE1NiwgMHgxRUI0LCAweDVBNTcsCisgICAgMHgxRUE0LCAweDVBNTgsIDB4MUU5NywgMHg1QTVBLCAweDBBNEUsIDB4NUE1QiwgMHgxRUE5LCAweDVBNUMsIDB4MUVCNiwKKyAgICAweDVBNUQsIDB4MUVBNiwgMHg1QTVFLCAweDFFOUEsIDB4NUE1RiwgMHgxRTlGLCAweDVBNjAsIDB4MUU5NiwgMHg1QTYyLAorICAgIDB4MEE0RCwgMHg1QTY0LCAweDFFQTMsIDB4NUE2NSwgMHgxRUEwLCAweDVBNjYsIDB4MEE0OSwgMHg1QTY3LCAweDFFOTksCisgICAgMHg1QTY5LCAweDFFQjEsIDB4NUE2QSwgMHgwQTRBLCAweDVBNkMsIDB4MUVBMSwgMHg1QTZELCAweDFFOUQsIDB4NUE3MCwKKyAgICAweDFFQjAsIDB4NUE3NywgMHgwQzIzLCAweDVBNzgsIDB4MjBGNiwgMHg1QTdBLCAweDIwRjMsIDB4NUE3QiwgMHgyMTA0LAorICAgIDB4NUE3QywgMHgyMEY4LCAweDVBN0QsIDB4MjEwNSwgMHg1QTdGLCAweDBDMjUsIDB4NUE4MywgMHgyMTAxLCAweDVBODQsCisgICAgMHgyMEZFLCAweDVBOEEsIDB4MjBGRiwgMHg1QThCLCAweDIxMDIsIDB4NUE4QywgMHgyMTA2LCAweDVBOEUsIDB4MUVBQiwKKyAgICAweDVBOEYsIDB4MjEwOCwgMHg1QTkwLCAweDIzQjYsIDB4NUE5MiwgMHgwQzI2LCAweDVBOTMsIDB4MjEwOSwgMHg1QTk0LAorICAgIDB4MjBGMSwgMHg1QTk1LCAweDIwRkIsIDB4NUE5NywgMHgyMTAwLCAweDVBOUEsIDB4MEMyNCwgMHg1QTlCLCAweDBDMjcsCisgICAgMHg1QTlDLCAweDIxMDcsIDB4NUE5RCwgMHgyMTBBLCAweDVBOUUsIDB4MjBGNSwgMHg1QTlGLCAweDIwRjIsIDB4NUFBMiwKKyAgICAweDIwRjQsIDB4NUFBNSwgMHgyMEY5LCAweDVBQTYsIDB4MjBGNywgMHg1QUE3LCAweDBDMjgsIDB4NUFBOSwgMHgyMTAzLAorICAgIDB4NUFBQywgMHgyMEZBLCAweDVBQUUsIDB4MjBGQywgMHg1QUFGLCAweDIwRjAsIDB4NUFCMCwgMHgyM0FBLCAweDVBQjEsCisgICAgMHgyM0E4LCAweDVBQjIsIDB4MERGQywgMHg1QUIzLCAweDBERkEsIDB4NUFCNCwgMHgyM0IyLCAweDVBQjUsIDB4MjNBOSwKKyAgICAweDVBQjYsIDB4MjNCMywgMHg1QUI3LCAweDIzQUYsIDB4NUFCOCwgMHgyM0E3LCAweDVBQjksIDB4MjNCNSwgMHg1QUJBLAorICAgIDB4MjNBNiwgMHg1QUJCLCAweDIzQUQsIDB4NUFCQywgMHgwREY5LCAweDVBQkQsIDB4MERGOCwgMHg1QUJFLCAweDBERjcsCisgICAgMHg1QUJGLCAweDIzQUIsIDB4NUFDMCwgMHgyM0IwLCAweDVBQzEsIDB4MERGNCwgMHg1QUMyLCAweDBERkIsIDB4NUFDNCwKKyAgICAweDIzQTQsIDB4NUFDNiwgMHgyM0FFLCAweDVBQzcsIDB4MjNBMywgMHg1QUM4LCAweDIzQUMsIDB4NUFDOSwgMHgwREY1LAorICAgIDB4NUFDQSwgMHgyM0IxLCAweDVBQ0IsIDB4MjNBNSwgMHg1QUNDLCAweDBERjYsIDB4NUFDRCwgMHgyM0I0LCAweDVBRDUsCisgICAgMHgyNjUwLCAweDVBRDYsIDB4MEZCNCwgMHg1QUQ3LCAweDBGQjMsIDB4NUFEOCwgMHgwRkI1LCAweDVBRDksIDB4MjY1QywKKyAgICAweDVBREEsIDB4MjY1MiwgMHg1QURCLCAweDI2NTgsIDB4NUFEQywgMHgyNjRELCAweDVBREQsIDB4MjY1QiwgMHg1QURFLAorICAgIDB4MjY1QSwgMHg1QURGLCAweDI2NUUsIDB4NUFFMCwgMHgyNjU3LCAweDVBRTEsIDB4MEZCMCwgMHg1QUUyLCAweDI2NTYsCisgICAgMHg1QUUzLCAweDBGQjYsIDB4NUFFNSwgMHgyNjRGLCAweDVBRTYsIDB4MEZCMSwgMHg1QUU4LCAweDI2NUQsIDB4NUFFOSwKKyAgICAweDBGQjIsIDB4NUFFQSwgMHgyNjUxLCAweDVBRUIsIDB4MjY1NCwgMHg1QUVDLCAweDI2NTksIDB4NUFFRCwgMHgyNjUzLAorICAgIDB4NUFFRSwgMHgyNjRFLCAweDVBRjMsIDB4MjY1NSwgMHg1QUY0LCAweDI4QUIsIDB4NUFGNSwgMHgxMTJELCAweDVBRjYsCisgICAgMHgyOEFFLCAweDVBRjcsIDB4MjhBRCwgMHg1QUY4LCAweDI4QjAsIDB4NUFGOSwgMHgyOEIyLCAweDVBRkEsIDB4MzZFRSwKKyAgICAweDVBRkIsIDB4MTEyQiwgMHg1QUZELCAweDI4QUMsIDB4NUFGRiwgMHgyOEFBLCAweDVCMDEsIDB4MjhCMywgMHg1QjAyLAorICAgIDB4MjhCMSwgMHg1QjAzLCAweDI4QUYsIDB4NUIwNSwgMHgyOEI1LCAweDVCMDcsIDB4MjhCNCwgMHg1QjA4LCAweDExMkYsCisgICAgMHg1QjA5LCAweDExMkEsIDB4NUIwQiwgMHgxMTJDLCAweDVCMEMsIDB4MTEyRSwgMHg1QjBGLCAweDI4QjYsIDB4NUIxMCwKKyAgICAweDJCMjIsIDB4NUIxMywgMHgyQjIxLCAweDVCMTQsIDB4MkIyMCwgMHg1QjE2LCAweDJCMjMsIDB4NUIxNywgMHgyQjFDLAorICAgIDB4NUIxOSwgMHgyQjFELCAweDVCMUEsIDB4MkIyNSwgMHg1QjFCLCAweDJCMUUsIDB4NUIxRCwgMHgxMkE4LCAweDVCMUUsCisgICAgMHgyQjI3LCAweDVCMjAsIDB4MkIyNiwgMHg1QjIxLCAweDJCMUYsIDB4NUIyMywgMHgyRDUyLCAweDVCMjQsIDB4MTNDNSwKKyAgICAweDVCMjUsIDB4MkQ1MCwgMHg1QjI2LCAweDJENTUsIDB4NUIyNywgMHgyRDU0LCAweDVCMjgsIDB4MkIyNCwgMHg1QjJBLAorICAgIDB4MTNDNCwgMHg1QjJDLCAweDJENTMsIDB4NUIyRCwgMHgyRDRGLCAweDVCMkUsIDB4MkQ1NywgMHg1QjJGLCAweDJENTYsCisgICAgMHg1QjMwLCAweDEzQzMsIDB4NUIzMiwgMHgyRDUxLCAweDVCMzQsIDB4MTJBOSwgMHg1QjM4LCAweDE0Q0UsIDB4NUIzQywKKyAgICAweDJGMTgsIDB4NUIzRCwgMHgzMDg5LCAweDVCM0UsIDB4MzA4QSwgMHg1QjNGLCAweDMwOEIsIDB4NUI0MCwgMHgxNjBGLAorICAgIDB4NUI0MywgMHgxNjEwLCAweDVCNDUsIDB4MzFDQywgMHg1QjQ3LCAweDMyQ0QsIDB4NUI0OCwgMHgzMkNDLCAweDVCNEIsCisgICAgMHgzMzdDLCAweDVCNEMsIDB4MzM3RCwgMHg1QjRELCAweDM0MTMsIDB4NUI0RSwgMHgzNDgyLCAweDVCNTAsIDB4MDI3RiwKKyAgICAweDVCNTEsIDB4MDI4MCwgMHg1QjUzLCAweDAyODEsIDB4NUI1NCwgMHgwMkM2LCAweDVCNTUsIDB4MDMzMywgMHg1QjU2LAorICAgIDB4MTdEQywgMHg1QjU3LCAweDAzQkYsIDB4NUI1OCwgMHgwM0MwLCAweDVCNUEsIDB4MDQ3RiwgMHg1QjVCLCAweDA0ODAsCisgICAgMHg1QjVDLCAweDA0N0UsIDB4NUI1RCwgMHgwNDdELCAweDVCNUYsIDB4MDU5NywgMHg1QjYyLCAweDE5NTcsIDB4NUI2MywKKyAgICAweDA1OTksIDB4NUI2NCwgMHgwNTk4LCAweDVCNjUsIDB4MTk1OCwgMHg1QjY5LCAweDA3MDAsIDB4NUI2QiwgMHgwODkxLAorICAgIDB4NUI2QywgMHgxQzc4LCAweDVCNkUsIDB4MUVCOCwgMHg1QjcwLCAweDBBNTEsIDB4NUI3MSwgMHgwQzJBLCAweDVCNzIsCisgICAgMHgxRUI3LCAweDVCNzMsIDB4MEMyOSwgMHg1Qjc1LCAweDBGQjcsIDB4NUI3NywgMHgyNjVGLCAweDVCNzgsIDB4MTJBQSwKKyAgICAweDVCN0EsIDB4MTNDNiwgMHg1QjdCLCAweDJENTgsIDB4NUI3RCwgMHgxNjExLCAweDVCN0YsIDB4MTZDMCwgMHg1QjgwLAorICAgIDB4MDIyNSwgMHg1QjgxLCAweDE3OUUsIDB4NUI4MywgMHgwMzM0LCAweDVCODQsIDB4MTc5RiwgMHg1Qjg1LCAweDAzQzMsCisgICAgMHg1Qjg3LCAweDAzQzEsIDB4NUI4OCwgMHgwM0MyLCAweDVCODksIDB4MDNDNCwgMHg1QjhCLCAweDA0ODIsIDB4NUI4QywKKyAgICAweDA0ODEsIDB4NUI4RSwgMHgxODYzLCAweDVCOEYsIDB4MDQ4MywgMHg1QjkyLCAweDE4NjQsIDB4NUI5MywgMHgxOTU5LAorICAgIDB4NUI5NSwgMHgxOTVBLCAweDVCOTcsIDB4MDU5QSwgMHg1Qjk4LCAweDA1OUMsIDB4NUI5OSwgMHgwNTlFLCAweDVCOUEsCisgICAgMHgwNTlCLCAweDVCOUIsIDB4MDU5RiwgMHg1QjlDLCAweDA1OUQsIDB4NUJBMiwgMHgwNzA0LCAweDVCQTMsIDB4MDcwMSwKKyAgICAweDVCQTQsIDB4MDcwMywgMHg1QkE1LCAweDA3MDUsIDB4NUJBNiwgMHgwNzAyLCAweDVCQTcsIDB4MUM3OSwgMHg1QkE4LAorICAgIDB4MUFCMywgMHg1QkFDLCAweDFDN0IsIDB4NUJBRCwgMHgxQzdBLCAweDVCQUUsIDB4MDg5NywgMHg1QkIwLCAweDA4OTMsCisgICAgMHg1QkIzLCAweDA4OTQsIDB4NUJCNCwgMHgwODk2LCAweDVCQjUsIDB4MDg5OCwgMHg1QkI2LCAweDA4OTUsIDB4NUJCOCwKKyAgICAweDA4OUEsIDB4NUJCOSwgMHgwODk5LCAweDVCQkYsIDB4MEE1NiwgMHg1QkMwLCAweDFFQkEsIDB4NUJDMSwgMHgxRUI5LAorICAgIDB4NUJDMiwgMHgwQTU1LCAweDVCQzQsIDB4MEE1NCwgMHg1QkM1LCAweDBBNTMsIDB4NUJDNiwgMHgwQTU3LCAweDVCQzcsCisgICAgMHgwQTUyLCAweDVCQ0EsIDB4MjExMCwgMHg1QkNCLCAweDIxMEQsIDB4NUJDQywgMHgwQzJDLCAweDVCQ0QsIDB4MjEwQywKKyAgICAweDVCQ0UsIDB4MjExMSwgMHg1QkQwLCAweDBDMkUsIDB4NUJEMSwgMHgyMTBGLCAweDVCRDIsIDB4MEMyQiwgMHg1QkQzLAorICAgIDB4MEMyRCwgMHg1QkQ0LCAweDIxMEUsIDB4NUJENiwgMHgyM0I3LCAweDVCRDgsIDB4MjNCOCwgMHg1QkQ5LCAweDIzQjksCisgICAgMHg1QkRFLCAweDBGQjgsIDB4NUJERiwgMHgwRkMwLCAweDVCRTAsIDB4MjY2MCwgMHg1QkUxLCAweDBGQkEsIDB4NUJFMiwKKyAgICAweDBGQkUsIDB4NUJFMywgMHgyNjYxLCAweDVCRTQsIDB4MEZCRiwgMHg1QkU1LCAweDBGQkIsIDB4NUJFNiwgMHgwRkJDLAorICAgIDB4NUJFNywgMHgwRkI5LCAweDVCRTgsIDB4MEZCRCwgMHg1QkU5LCAweDExMzIsIDB4NUJFQSwgMHgyMTBCLCAweDVCRUIsCisgICAgMHgxMTMzLCAweDVCRUMsIDB4MTEzMSwgMHg1QkVFLCAweDExMzAsIDB4NUJFRiwgMHgyQjI4LCAweDVCRjAsIDB4MTJBQiwKKyAgICAweDVCRjEsIDB4MkQ1OSwgMHg1QkYyLCAweDJENUEsIDB4NUJGNSwgMHgxNTdCLCAweDVCRjYsIDB4MTYxMiwgMHg1QkY4LAorICAgIDB4MDI4MiwgMHg1QkZBLCAweDAzQzUsIDB4NUMwMSwgMHgwNzA2LCAweDVDMDMsIDB4MUM3QywgMHg1QzA0LCAweDA4OUIsCisgICAgMHg1QzA3LCAweDBBNUEsIDB4NUMwOCwgMHgwQTU5LCAweDVDMDksIDB4MEE1OCwgMHg1QzBBLCAweDBDMkYsIDB4NUMwQiwKKyAgICAweDBDMzAsIDB4NUMwQywgMHgyMTEyLCAweDVDMEQsIDB4MEZDMSwgMHg1QzBFLCAweDEyQUMsIDB4NUMwRiwgMHgwMjgzLAorICAgIDB4NUMxMCwgMHgxNzg3LCAweDVDMTEsIDB4MDJDNywgMHg1QzEyLCAweDE3QTAsIDB4NUMxNSwgMHgxN0RELCAweDVDMTYsCisgICAgMHgwM0M2LCAweDVDMUEsIDB4MDVBMCwgMHg1QzFGLCAweDIzQkEsIDB4NUMyMiwgMHgwMjg0LCAweDVDMjQsIDB4MDJDOCwKKyAgICAweDVDMjUsIDB4MTdERSwgMHg1QzI4LCAweDE4NjUsIDB4NUMyQSwgMHgxODY2LCAweDVDMkMsIDB4MDQ4NCwgMHg1QzMwLAorICAgIDB4MjExMywgMHg1QzMxLCAweDBDMzEsIDB4NUMzMywgMHgyM0JCLCAweDVDMzcsIDB4MTNDNywgMHg1QzM4LCAweDAyODUsCisgICAgMHg1QzM5LCAweDAyOTksIDB4NUMzQSwgMHgwMkM5LCAweDVDM0IsIDB4MTdBMSwgMHg1QzNDLCAweDAzMzUsIDB4NUMzRSwKKyAgICAweDA0ODgsIDB4NUMzRiwgMHgwNDg3LCAweDVDNDAsIDB4MDQ4NSwgMHg1QzQxLCAweDA0ODYsIDB4NUM0NCwgMHgxOTVCLAorICAgIDB4NUM0NSwgMHgwNUEyLCAweDVDNDYsIDB4MDVBMywgMHg1QzQ3LCAweDE5NUMsIDB4NUM0OCwgMHgwNUExLCAweDVDNEIsCisgICAgMHgwNzBBLCAweDVDNEMsIDB4MUFCNCwgMHg1QzRELCAweDA3MDksIDB4NUM0RSwgMHgwNzA3LCAweDVDNEYsIDB4MDcwOCwKKyAgICAweDVDNTAsIDB4MDg5RSwgMHg1QzUxLCAweDA4OUMsIDB4NUM1NCwgMHgxQzdFLCAweDVDNTUsIDB4MDg5RCwgMHg1QzU2LAorICAgIDB4MUM3RCwgMHg1QzU4LCAweDA4OTIsIDB4NUM1OSwgMHgxRUJCLCAweDVDNUMsIDB4MEE1QywgMHg1QzVELCAweDBBNUQsCisgICAgMHg1QzYwLCAweDBBNUIsIDB4NUM2MiwgMHgwRkMyLCAweDVDNjMsIDB4MjY2MiwgMHg1QzY0LCAweDExMzQsIDB4NUM2NSwKKyAgICAweDExMzUsIDB4NUM2NywgMHgyOEI3LCAweDVDNjgsIDB4MTNDOCwgMHg1QzY5LCAweDJGMTksIDB4NUM2QSwgMHgyRjFBLAorICAgIDB4NUM2QywgMHgxNjZFLCAweDVDNkQsIDB4MzQ4MywgMHg1QzZFLCAweDE3NzYsIDB4NUM2RiwgMHgwMkNBLCAweDVDNzEsCisgICAgMHgwMjg2LCAweDVDNzMsIDB4MTdBMywgMHg1Qzc0LCAweDE3QTIsIDB4NUM3OSwgMHgwM0M3LCAweDVDN0EsIDB4MTdFMCwKKyAgICAweDVDN0IsIDB4MTdFMSwgMHg1QzdDLCAweDE3REYsIDB4NUM3RSwgMHgxN0UyLCAweDVDODYsIDB4MTg2RSwgMHg1Qzg4LAorICAgIDB4MTg2OSwgMHg1Qzg5LCAweDE4NkIsIDB4NUM4QSwgMHgxODZELCAweDVDOEIsIDB4MTg2QSwgMHg1QzhDLCAweDA0OEMsCisgICAgMHg1QzhELCAweDE4NjcsIDB4NUM4RiwgMHgxODY4LCAweDVDOTAsIDB4MDQ4OSwgMHg1QzkxLCAweDA0OEEsIDB4NUM5MiwKKyAgICAweDE4NkMsIDB4NUM5MywgMHgxODZGLCAweDVDOTQsIDB4MDQ4QiwgMHg1Qzk1LCAweDE4NzAsIDB4NUM5RCwgMHgxOTZBLAorICAgIDB4NUM5RiwgMHgxOTY0LCAweDVDQTAsIDB4MTk1RiwgMHg1Q0ExLCAweDA1QTUsIDB4NUNBMiwgMHgxOTY3LCAweDVDQTMsCisgICAgMHgxOTY1LCAweDVDQTQsIDB4MTk1RSwgMHg1Q0E1LCAweDE5NkIsIDB4NUNBNiwgMHgxOTZFLCAweDVDQTcsIDB4MTk2OSwKKyAgICAweDVDQTgsIDB4MTk2MiwgMHg1Q0E5LCAweDA1QTcsIDB4NUNBQSwgMHgxOTY4LCAweDVDQUIsIDB4MDVBOCwgMHg1Q0FDLAorICAgIDB4MTk2MywgMHg1Q0FELCAweDE5NjYsIDB4NUNBRSwgMHgxOTVELCAweDVDQUYsIDB4MTk2MSwgMHg1Q0IwLCAweDE5NkQsCisgICAgMHg1Q0IxLCAweDA1QTksIDB4NUNCMywgMHgwNUFBLCAweDVDQjUsIDB4MTk2MCwgMHg1Q0I2LCAweDE5NkMsIDB4NUNCNywKKyAgICAweDA1QTQsIDB4NUNCOCwgMHgwNUE2LCAweDVDQzYsIDB4MUFDNSwgMHg1Q0M3LCAweDFBQkUsIDB4NUNDOCwgMHgxQUM0LAorICAgIDB4NUNDOSwgMHgxQUJELCAweDVDQ0EsIDB4MUFCRiwgMHg1Q0NCLCAweDFBQjksIDB4NUNDQywgMHgxQUI3LCAweDVDQ0UsCisgICAgMHgxQUM2LCAweDVDQ0YsIDB4MUFDMywgMHg1Q0QwLCAweDFBQjUsIDB4NUNEMiwgMHgwNzBDLCAweDVDRDMsIDB4MUFDMSwKKyAgICAweDVDRDQsIDB4MUFDMiwgMHg1Q0Q2LCAweDFBQzAsIDB4NUNENywgMHgxQUI4LCAweDVDRDgsIDB4MUFCNiwgMHg1Q0Q5LAorICAgIDB4MDcwQiwgMHg1Q0RBLCAweDFBQkMsIDB4NUNEQiwgMHgxQUJBLCAweDVDREUsIDB4MUFCQiwgMHg1Q0RGLCAweDFBQzcsCisgICAgMHg1Q0U4LCAweDA4QTMsIDB4NUNFQSwgMHgwOEEyLCAweDVDRUMsIDB4MUM3RiwgMHg1Q0VELCAweDA4OUYsIDB4NUNFRSwKKyAgICAweDFDODEsIDB4NUNGMCwgMHgwOEE0LCAweDVDRjEsIDB4MUM4MiwgMHg1Q0Y0LCAweDA4QTcsIDB4NUNGNiwgMHgwOEE1LAorICAgIDB4NUNGNywgMHgxQzgzLCAweDVDRjgsIDB4MUFDOCwgMHg1Q0Y5LCAweDFDODUsIDB4NUNGQiwgMHgwOEExLCAweDVDRkQsCisgICAgMHgwOEEwLCAweDVDRkYsIDB4MUM4MCwgMHg1RDAwLCAweDFDODQsIDB4NUQwMSwgMHgwOEE2LCAweDVEMDYsIDB4MEE1RiwKKyAgICAweDVEMDcsIDB4MEE1RSwgMHg1RDBCLCAweDFFQkQsIDB4NUQwQywgMHgxRUMxLCAweDVEMEQsIDB4MUVDMywgMHg1RDBFLAorICAgIDB4MEE2MCwgMHg1RDBGLCAweDFFQzYsIDB4NUQxMSwgMHgwQTY0LCAweDVEMTIsIDB4MUVDOCwgMHg1RDE0LCAweDBBNjYsCisgICAgMHg1RDE2LCAweDBBNjIsIDB4NUQxNywgMHgwQTZBLCAweDVEMTksIDB4MEE2NywgMHg1RDFBLCAweDFFQkYsIDB4NUQxQiwKKyAgICAweDBBNjEsIDB4NUQxRCwgMHgxRUJFLCAweDVEMUUsIDB4MUVCQywgMHg1RDFGLCAweDFFQ0EsIDB4NUQyMCwgMHgxRUMwLAorICAgIDB4NUQyMiwgMHgwQTYzLCAweDVEMjMsIDB4MUVDOSwgMHg1RDI0LCAweDBBNjgsIDB4NUQyNSwgMHgxRUM1LCAweDVEMjYsCisgICAgMHgxRUM0LCAweDVEMjcsIDB4MEE2OSwgMHg1RDI4LCAweDFFQzIsIDB4NUQyOSwgMHgwQTY1LCAweDVEMkUsIDB4MUVDQiwKKyAgICAweDVEMzAsIDB4MUVDNywgMHg1RDMxLCAweDIxMjIsIDB4NUQzMiwgMHgyMTI5LCAweDVEMzMsIDB4MjExRSwgMHg1RDM0LAorICAgIDB4MEMzNCwgMHg1RDM1LCAweDIxMUEsIDB4NUQzNiwgMHgyMTJBLCAweDVEMzcsIDB4MjExNCwgMHg1RDM4LCAweDIxMjcsCisgICAgMHg1RDM5LCAweDIxMjUsIDB4NUQzQSwgMHgyMTFGLCAweDVEM0MsIDB4MjEyOCwgMHg1RDNELCAweDIxMjEsIDB4NUQzRiwKKyAgICAweDIxMTksIDB4NUQ0MCwgMHgyMTJCLCAweDVENDEsIDB4MjExNywgMHg1RDQyLCAweDIxMjQsIDB4NUQ0MywgMHgyMTE1LAorICAgIDB4NUQ0NSwgMHgyMTJDLCAweDVENDcsIDB4MEMzNSwgMHg1RDQ5LCAweDIxMjYsIDB4NUQ0QSwgMHgyM0JFLCAweDVENEIsCisgICAgMHgyMTE4LCAweDVENEMsIDB4MEMzMiwgMHg1RDRFLCAweDIxMUMsIDB4NUQ1MCwgMHgwQzMzLCAweDVENTEsIDB4MjExQiwKKyAgICAweDVENTIsIDB4MjEyMCwgMHg1RDU1LCAweDIxMUQsIDB4NUQ1OSwgMHgyMTIzLCAweDVENUUsIDB4MjNDMiwgMHg1RDYyLAorICAgIDB4MjNDNSwgMHg1RDYzLCAweDIzQkQsIDB4NUQ2NSwgMHgyM0JGLCAweDVENjcsIDB4MjNDNCwgMHg1RDY4LCAweDIzQzMsCisgICAgMHg1RDY5LCAweDBERkQsIDB4NUQ2QiwgMHgyMTE2LCAweDVENkMsIDB4MjNDMSwgMHg1RDZGLCAweDBERkUsIDB4NUQ3MSwKKyAgICAweDIzQkMsIDB4NUQ3MiwgMHgyM0MwLCAweDVENzcsIDB4MjY2OSwgMHg1RDc5LCAweDI2NzAsIDB4NUQ3QSwgMHgyNjY3LAorICAgIDB4NUQ3QywgMHgyNjZFLCAweDVEN0QsIDB4MjY2NSwgMHg1RDdFLCAweDI2NkQsIDB4NUQ3RiwgMHgyNjcxLCAweDVEODAsCisgICAgMHgyNjY0LCAweDVEODEsIDB4MjY2OCwgMHg1RDgyLCAweDI2NjMsIDB4NUQ4NCwgMHgwRkMzLCAweDVEODYsIDB4MjY2NiwKKyAgICAweDVEODcsIDB4MEZDNCwgMHg1RDg4LCAweDI2NkMsIDB4NUQ4OSwgMHgyNjZCLCAweDVEOEEsIDB4MjY2QSwgMHg1RDhELAorICAgIDB4MjY2RiwgMHg1RDkyLCAweDI4QkIsIDB4NUQ5MywgMHgyOEJELCAweDVEOTQsIDB4MTEzNywgMHg1RDk1LCAweDI4QkUsCisgICAgMHg1RDk3LCAweDI4QjksIDB4NUQ5OSwgMHgyOEI4LCAweDVEOUEsIDB4MjhDMiwgMHg1RDlDLCAweDI4QzAsIDB4NUQ5RCwKKyAgICAweDExMzYsIDB4NUQ5RSwgMHgyOEMzLCAweDVEOUYsIDB4MjhCQSwgMHg1REEwLCAweDI4QkYsIDB4NURBMSwgMHgyOEMxLAorICAgIDB4NURBMiwgMHgyOEJDLCAweDVEQTcsIDB4MkIyQywgMHg1REE4LCAweDJCMzEsIDB4NURBOSwgMHgyQjJCLCAweDVEQUEsCisgICAgMHgyQjMwLCAweDVEQUMsIDB4MkIyOSwgMHg1REFELCAweDJCMzMsIDB4NURBRSwgMHgyQjJGLCAweDVEQUYsIDB4MkIzNCwKKyAgICAweDVEQjAsIDB4MkIyRSwgMHg1REIxLCAweDJCMkEsIDB4NURCMiwgMHgyQjMyLCAweDVEQjQsIDB4MkIzNSwgMHg1REI1LAorICAgIDB4MkIyRCwgMHg1REI3LCAweDJENUIsIDB4NURCOCwgMHgxM0NDLCAweDVEQkEsIDB4MTNDQSwgMHg1REJDLCAweDEzQzksCisgICAgMHg1REJELCAweDEzQ0IsIDB4NURDMCwgMHgyRjFCLCAweDVEQzIsIDB4MzAyMywgMHg1REMzLCAweDMwOEMsIDB4NURDNiwKKyAgICAweDMxQ0QsIDB4NURDNywgMHgzMUNFLCAweDVEQzksIDB4MTYxMywgMHg1RENCLCAweDMyQ0UsIDB4NURDRCwgMHgxNjZGLAorICAgIDB4NURDRiwgMHgzMkNGLCAweDVERDEsIDB4MzM3RiwgMHg1REQyLCAweDE2QzIsIDB4NURENCwgMHgxNkMxLCAweDVERDUsCisgICAgMHgzMzdFLCAweDVERDYsIDB4MTZGNywgMHg1REQ4LCAweDM0MTQsIDB4NUREQiwgMHgwMjI2LCAweDVEREQsIDB4MDI4NywKKyAgICAweDVEREUsIDB4MDNDOCwgMHg1RERGLCAweDE3RTMsIDB4NURFMCwgMHgxODcxLCAweDVERTEsIDB4MDUxQSwgMHg1REUyLAorICAgIDB4MEE2QiwgMHg1REU1LCAweDAyODgsIDB4NURFNiwgMHgwMzM4LCAweDVERTcsIDB4MDMzNywgMHg1REU4LCAweDAzMzYsCisgICAgMHg1REVCLCAweDA0OEQsIDB4NURFRSwgMHgwOEE4LCAweDVERjAsIDB4MjNDNiwgMHg1REYxLCAweDAyODksIDB4NURGMiwKKyAgICAweDAyOEEsIDB4NURGMywgMHgwMjhCLCAweDVERjQsIDB4MDJDQiwgMHg1REY3LCAweDA3MEQsIDB4NURGOSwgMHgxQUM5LAorICAgIDB4NURGRCwgMHgwQzM2LCAweDVERkUsIDB4MDI4QywgMHg1REZGLCAweDE3ODgsIDB4NUUwMiwgMHgwMzM5LCAweDVFMDMsCisgICAgMHgwMzNBLCAweDVFMDQsIDB4MTdBNCwgMHg1RTA2LCAweDAzQzksIDB4NUUwQSwgMHgxODcyLCAweDVFMEMsIDB4MDQ4RSwKKyAgICAweDVFMEUsIDB4MTg3MywgMHg1RTExLCAweDA1QjAsIDB4NUUxNCwgMHgxOTcwLCAweDVFMTUsIDB4MDVBRSwgMHg1RTE2LAorICAgIDB4MDVBRCwgMHg1RTE3LCAweDE5NkYsIDB4NUUxOCwgMHgwNUFCLCAweDVFMTksIDB4MTk3MSwgMHg1RTFBLCAweDA1QUMsCisgICAgMHg1RTFCLCAweDA1QUYsIDB4NUUxRCwgMHgwNzBFLCAweDVFMUYsIDB4MDcxMCwgMHg1RTIwLCAweDFBQ0QsIDB4NUUyMSwKKyAgICAweDFBQ0EsIDB4NUUyMiwgMHgxQUNCLCAweDVFMjMsIDB4MUFDQywgMHg1RTI0LCAweDFBQ0UsIDB4NUUyNSwgMHgwNzBGLAorICAgIDB4NUUyOCwgMHgxQzg3LCAweDVFMjksIDB4MUM4NiwgMHg1RTJCLCAweDA4QUEsIDB4NUUyRCwgMHgwOEE5LCAweDVFMzMsCisgICAgMHgwQTZFLCAweDVFMzQsIDB4MUVDRCwgMHg1RTM2LCAweDBBNkQsIDB4NUUzNywgMHgwQTZGLCAweDVFMzgsIDB4MEE2QywKKyAgICAweDVFM0QsIDB4MEMzOCwgMHg1RTNFLCAweDFFQ0MsIDB4NUU0MCwgMHgwQzM5LCAweDVFNDEsIDB4MjEyRSwgMHg1RTQzLAorICAgIDB4MEMzQSwgMHg1RTQ0LCAweDIxMkQsIDB4NUU0NSwgMHgwQzM3LCAweDVFNEEsIDB4MjNDOSwgMHg1RTRCLCAweDIzQ0IsCisgICAgMHg1RTRDLCAweDBERkYsIDB4NUU0RCwgMHgyM0NBLCAweDVFNEUsIDB4MjNDOCwgMHg1RTRGLCAweDIzQzcsIDB4NUU1MywKKyAgICAweDI2NzQsIDB4NUU1NCwgMHgwRkM5LCAweDVFNTUsIDB4MEZDNywgMHg1RTU3LCAweDBGQzgsIDB4NUU1OCwgMHgyNjcyLAorICAgIDB4NUU1OSwgMHgyNjczLCAweDVFNUIsIDB4MEZDNSwgMHg1RTVDLCAweDI4QzcsIDB4NUU1RCwgMHgyOEM1LCAweDVFNUYsCisgICAgMHgxMTM5LCAweDVFNjAsIDB4MjhDNiwgMHg1RTYxLCAweDExM0EsIDB4NUU2MiwgMHgxMTM4LCAweDVFNjMsIDB4MEZDNiwKKyAgICAweDVFNjYsIDB4MkIzOCwgMHg1RTY3LCAweDJCMzYsIDB4NUU2OCwgMHgyQjM3LCAweDVFNjksIDB4MjhDNCwgMHg1RTZBLAorICAgIDB4MkQ1RCwgMHg1RTZCLCAweDEzQ0QsIDB4NUU2QywgMHgyRDVDLCAweDVFNkQsIDB4MkYxQywgMHg1RTZFLCAweDJGMUQsCisgICAgMHg1RTZGLCAweDJCMzksIDB4NUU3MCwgMHgzMDhELCAweDVFNzIsIDB4MDI4RCwgMHg1RTczLCAweDAzM0IsIDB4NUU3NCwKKyAgICAweDAzQ0IsIDB4NUU3NSwgMHgxN0U0LCAweDVFNzYsIDB4MDNDQSwgMHg1RTc4LCAweDA1QjEsIDB4NUU3OSwgMHgwRTAwLAorICAgIDB4NUU3QSwgMHgwMjI3LCAweDVFN0IsIDB4MDJDQywgMHg1RTdDLCAweDAzM0MsIDB4NUU3RCwgMHgwNzExLCAweDVFN0UsCisgICAgMHgwQzNCLCAweDVFN0YsIDB4MDIyOCwgMHg1RTgwLCAweDE3QTUsIDB4NUU4MiwgMHgxN0E2LCAweDVFODQsIDB4MTdFNSwKKyAgICAweDVFODcsIDB4MDQ5MCwgMHg1RTg4LCAweDE4NzcsIDB4NUU4OSwgMHgxODc1LCAweDVFOEEsIDB4MDQ5MSwgMHg1RThCLAorICAgIDB4MTg3NCwgMHg1RThDLCAweDE4NzYsIDB4NUU4RCwgMHgxODc4LCAweDVFOEYsIDB4MDQ4RiwgMHg1RTk1LCAweDA1QjUsCisgICAgMHg1RTk2LCAweDA1QjYsIDB4NUU5NywgMHgwNUIzLCAweDVFOUEsIDB4MDVCMiwgMHg1RTlCLCAweDFBRDIsIDB4NUU5QywKKyAgICAweDA1QjQsIDB4NUVBMCwgMHgwNzEyLCAweDVFQTIsIDB4MUFEMSwgMHg1RUEzLCAweDFBRDMsIDB4NUVBNCwgMHgxQUQwLAorICAgIDB4NUVBNSwgMHgxQUQ0LCAweDVFQTYsIDB4MDcxMywgMHg1RUE3LCAweDA4QUQsIDB4NUVBOCwgMHgxQzg4LCAweDVFQUEsCisgICAgMHgxQzhBLCAweDVFQUIsIDB4MDhBQiwgMHg1RUFDLCAweDFDOEIsIDB4NUVBRCwgMHgwOEFDLCAweDVFQUUsIDB4MUM4OSwKKyAgICAweDVFQjAsIDB4MUFDRiwgMHg1RUIxLCAweDFFQ0UsIDB4NUVCMiwgMHgxRUQxLCAweDVFQjMsIDB4MUVEMiwgMHg1RUI0LAorICAgIDB4MUVDRiwgMHg1RUI1LCAweDBBNzMsIDB4NUVCNiwgMHgwQTcyLCAweDVFQjcsIDB4MEE3MCwgMHg1RUI4LCAweDBBNzEsCisgICAgMHg1RUI5LCAweDFFRDAsIDB4NUVCRSwgMHgwQTc0LCAweDVFQzEsIDB4MEMzRCwgMHg1RUMyLCAweDBDM0UsIDB4NUVDNCwKKyAgICAweDBDM0YsIDB4NUVDNSwgMHgyM0NDLCAweDVFQzYsIDB4MjNDRSwgMHg1RUM3LCAweDIzRDAsIDB4NUVDOCwgMHgwRTAyLAorICAgIDB4NUVDOSwgMHgwRTAxLCAweDVFQ0EsIDB4MEMzQywgMHg1RUNCLCAweDIzQ0YsIDB4NUVDQywgMHgyM0NELCAweDVFQ0UsCisgICAgMHgyNjc4LCAweDVFRDEsIDB4MjY3NiwgMHg1RUQyLCAweDI2N0MsIDB4NUVEMywgMHgwRkNBLCAweDVFRDQsIDB4MjY3RCwKKyAgICAweDVFRDUsIDB4MjY3QSwgMHg1RUQ2LCAweDBGQ0IsIDB4NUVENywgMHgyNjc3LCAweDVFRDgsIDB4MjY3NSwgMHg1RUQ5LAorICAgIDB4MjY3QiwgMHg1RURBLCAweDExM0MsIDB4NUVEQiwgMHgyOEM5LCAweDVFREMsIDB4MjY3OSwgMHg1RURELCAweDExM0UsCisgICAgMHg1RURFLCAweDI4Q0EsIDB4NUVERiwgMHgxMTNELCAweDVFRTAsIDB4MTE0MCwgMHg1RUUxLCAweDI4Q0IsIDB4NUVFMiwKKyAgICAweDExM0IsIDB4NUVFMywgMHgxMTNGLCAweDVFRTUsIDB4MkIzRSwgMHg1RUU2LCAweDJCM0MsIDB4NUVFNywgMHgyQjNCLAorICAgIDB4NUVFOCwgMHgyQjNELCAweDVFRTksIDB4MkIzQSwgMHg1RUVDLCAweDE1N0QsIDB4NUVFRSwgMHgzMUNGLCAweDVFRUYsCisgICAgMHgzMUQwLCAweDVFRjEsIDB4MzJEMCwgMHg1RUYyLCAweDMzODAsIDB4NUVGMywgMHgxNzQyLCAweDVFRjQsIDB4MDIyOSwKKyAgICAweDVFRjYsIDB4MDVCNywgMHg1RUY3LCAweDA0OTIsIDB4NUVGQSwgMHgwNzE0LCAweDVFRkUsIDB4MDI4RSwgMHg1RUZGLAorICAgIDB4MDJDRCwgMHg1RjAxLCAweDAzM0QsIDB4NUYwMiwgMHgxN0U2LCAweDVGMDQsIDB4MDQ5MywgMHg1RjA1LCAweDE4NzksCisgICAgMHg1RjA3LCAweDFBRDUsIDB4NUYwOCwgMHgwNzE1LCAweDVGMEEsIDB4MEZDQywgMHg1RjBCLCAweDAyOEYsIDB4NUYwRiwKKyAgICAweDAzQ0MsIDB4NUYxMiwgMHgwRTAzLCAweDVGMTMsIDB4MDI5MCwgMHg1RjE0LCAweDAyQ0UsIDB4NUYxNSwgMHgwMkNGLAorICAgIDB4NUYxNywgMHgwMzNGLCAweDVGMTgsIDB4MDMzRSwgMHg1RjFBLCAweDE3RTcsIDB4NUYxQiwgMHgwM0NELCAweDVGMUQsCisgICAgMHgxODdBLCAweDVGMUYsIDB4MDQ5NCwgMHg1RjIyLCAweDE5NzMsIDB4NUYyMywgMHgxOTc0LCAweDVGMjQsIDB4MTk3NSwKKyAgICAweDVGMjYsIDB4MDVCOCwgMHg1RjI3LCAweDA1QjksIDB4NUYyOCwgMHgxOTcyLCAweDVGMjksIDB4MDVCQSwgMHg1RjJELAorICAgIDB4MDcxNiwgMHg1RjJFLCAweDFBRDYsIDB4NUYzMCwgMHgxQzhELCAweDVGMzEsIDB4MDhBRSwgMHg1RjMzLCAweDFDOEMsCisgICAgMHg1RjM1LCAweDBBNzUsIDB4NUYzNiwgMHgxRUQzLCAweDVGMzcsIDB4MEE3NiwgMHg1RjM4LCAweDFFRDQsIDB4NUYzQywKKyAgICAweDBDNDAsIDB4NUY0MCwgMHgyM0QxLCAweDVGNDMsIDB4MjY3RiwgMHg1RjQ0LCAweDI2N0UsIDB4NUY0NiwgMHgwRkNELAorICAgIDB4NUY0OCwgMHgxMTQxLCAweDVGNDksIDB4MjhDQywgMHg1RjRBLCAweDEyQUQsIDB4NUY0QiwgMHgyQjNGLCAweDVGNEMsCisgICAgMHgxM0NFLCAweDVGNEUsIDB4MTZDMywgMHg1RjRGLCAweDM0MTYsIDB4NUY1MCwgMHgwMjJBLCAweDVGNTQsIDB4MTk3NiwKKyAgICAweDVGNTYsIDB4MUFENywgMHg1RjU3LCAweDBBNzcsIDB4NUY1OCwgMHgyMTJGLCAweDVGNTksIDB4MEUwNCwgMHg1RjVELAorICAgIDB4MTRDRiwgMHg1RjYxLCAweDAyMkIsIDB4NUY2MiwgMHgwNDk2LCAweDVGNjQsIDB4MDQ5NSwgMHg1RjY1LCAweDA3MTcsCisgICAgMHg1RjY3LCAweDFDOEUsIDB4NUY2OSwgMHgwQTc5LCAweDVGNkEsIDB4MEI4OSwgMHg1RjZCLCAweDBBN0EsIDB4NUY2QywKKyAgICAweDBBNzgsIDB4NUY2RCwgMHgwQzQxLCAweDVGNkYsIDB4MjY4MCwgMHg1RjcwLCAweDBGQ0UsIDB4NUY3MSwgMHgxMTQyLAorICAgIDB4NUY3MywgMHgxNzc3LCAweDVGNzQsIDB4MTdFOCwgMHg1Rjc2LCAweDE4N0MsIDB4NUY3NywgMHgwNDk3LCAweDVGNzgsCisgICAgMHgxODdCLCAweDVGNzksIDB4MDQ5OCwgMHg1RjdDLCAweDA1QkUsIDB4NUY3RCwgMHgxOTc5LCAweDVGN0UsIDB4MTk3OCwKKyAgICAweDVGN0YsIDB4MDVCRCwgMHg1RjgwLCAweDA1QkIsIDB4NUY4MSwgMHgwNUJDLCAweDVGODIsIDB4MTk3NywgMHg1Rjg1LAorICAgIDB4MDcxOSwgMHg1Rjg2LCAweDFBRDgsIDB4NUY4NywgMHgwNzFDLCAweDVGODgsIDB4MDcxOCwgMHg1Rjg5LCAweDA3MUUsCisgICAgMHg1RjhBLCAweDA3MUEsIDB4NUY4QiwgMHgwNzFCLCAweDVGOEMsIDB4MDcxRCwgMHg1RjkwLCAweDA4QjEsIDB4NUY5MSwKKyAgICAweDA4QjAsIDB4NUY5MiwgMHgwOEFGLCAweDVGOTYsIDB4MUVENiwgMHg1Rjk3LCAweDBBN0IsIDB4NUY5OCwgMHgwQTdFLAorICAgIDB4NUY5OSwgMHgwQTdDLCAweDVGOUIsIDB4MUVENSwgMHg1RjlDLCAweDBBODEsIDB4NUY5RSwgMHgwQTdELCAweDVGOUYsCisgICAgMHgxRUQ3LCAweDVGQTAsIDB4MEE4MCwgMHg1RkExLCAweDBBN0YsIDB4NUZBNSwgMHgyMTMxLCAweDVGQTYsIDB4MjEzMCwKKyAgICAweDVGQTgsIDB4MEM0NCwgMHg1RkE5LCAweDBDNDIsIDB4NUZBQSwgMHgwQzQzLCAweDVGQUIsIDB4MjEzMiwgMHg1RkFDLAorICAgIDB4MEUwNSwgMHg1RkFELCAweDIzRDMsIDB4NUZBRSwgMHgwRTA2LCAweDVGQUYsIDB4MjNEMiwgMHg1RkIyLCAweDI4Q0QsCisgICAgMHg1RkI1LCAweDExNDQsIDB4NUZCNiwgMHgyNjgxLCAweDVGQjcsIDB4MTE0MywgMHg1RkI5LCAweDBGQ0YsIDB4NUZCQiwKKyAgICAweDJCNDEsIDB4NUZCQywgMHgyQjQwLCAweDVGQkQsIDB4MTNDRiwgMHg1RkJFLCAweDJENUUsIDB4NUZCRiwgMHgzMDhFLAorICAgIDB4NUZDMCwgMHgzMUQxLCAweDVGQzEsIDB4MzFEMiwgMHg1RkMzLCAweDAyRDAsIDB4NUZDNSwgMHgwMzQwLCAweDVGQzksCisgICAgMHgxN0E3LCAweDVGQ0MsIDB4MDQ5QSwgMHg1RkNELCAweDA0OUMsIDB4NUZDRiwgMHgxN0VCLCAweDVGRDAsIDB4MTg3RiwKKyAgICAweDVGRDEsIDB4MTg3RSwgMHg1RkQyLCAweDE4N0QsIDB4NUZENCwgMHgxN0VBLCAweDVGRDUsIDB4MTdFOSwgMHg1RkQ2LAorICAgIDB4MDNDRiwgMHg1RkQ3LCAweDA0OUIsIDB4NUZEOCwgMHgwNDk5LCAweDVGRDksIDB4MDNDRSwgMHg1RkRELCAweDA1QkYsCisgICAgMHg1RkRFLCAweDE5N0EsIDB4NUZFMCwgMHgwNUMwLCAweDVGRTEsIDB4MTg4NCwgMHg1RkUzLCAweDE4ODYsIDB4NUZFNCwKKyAgICAweDE4ODUsIDB4NUZFNSwgMHgxOTdCLCAweDVGRTgsIDB4MTg4MSwgMHg1RkVBLCAweDA0QTAsIDB4NUZFQiwgMHgwNDlFLAorICAgIDB4NUZFRCwgMHgxODgwLCAweDVGRUUsIDB4MTg4MiwgMHg1RkVGLCAweDE4ODgsIDB4NUZGMSwgMHgwNDlELCAweDVGRjMsCisgICAgMHgxODgzLCAweDVGRjQsIDB4MTg4QywgMHg1RkY1LCAweDA1QzIsIDB4NUZGNywgMHgxODg5LCAweDVGRjgsIDB4MDQ5RiwKKyAgICAweDVGRkEsIDB4MTg4NywgMHg1RkZCLCAweDE4OEEsIDB4NUZGRCwgMHgwNUMxLCAweDVGRkYsIDB4MDVDMywgMHg2MDAwLAorICAgIDB4MTg4QiwgMHg2MDA5LCAweDE5OEYsIDB4NjAwQSwgMHgxOTgyLCAweDYwMEIsIDB4MTk4MCwgMHg2MDBDLCAweDE5OEUsCisgICAgMHg2MDBELCAweDE5ODksIDB4NjAwRSwgMHgwNzIzLCAweDYwMEYsIDB4MDVDNCwgMHg2MDEwLCAweDE5OEEsIDB4NjAxMSwKKyAgICAweDE5OEQsIDB4NjAxMiwgMHgwNzFGLCAweDYwMTMsIDB4MTk4QywgMHg2MDE0LCAweDA1QzUsIDB4NjAxNSwgMHgwNUNBLAorICAgIDB4NjAxNiwgMHgwNUM4LCAweDYwMTcsIDB4MTk4MywgMHg2MDE5LCAweDE5N0UsIDB4NjAxQSwgMHgxOTg1LCAweDYwMUIsCisgICAgMHgwNUNGLCAweDYwMUMsIDB4MTk5MCwgMHg2MDFELCAweDA3MjAsIDB4NjAxRSwgMHgxOTg2LCAweDYwMjAsIDB4MDcyMSwKKyAgICAweDYwMjEsIDB4MDVDQiwgMHg2MDIyLCAweDE5ODgsIDB4NjAyNCwgMHgxQUU3LCAweDYwMjUsIDB4MDcyMiwgMHg2MDI2LAorICAgIDB4MTk3RCwgMHg2MDI3LCAweDA1Q0MsIDB4NjAyOCwgMHgwNzI0LCAweDYwMjksIDB4MDVDRCwgMHg2MDJBLCAweDA1QzksCisgICAgMHg2MDJCLCAweDA1Q0UsIDB4NjAyQywgMHgxOTg3LCAweDYwMkQsIDB4MTk3QywgMHg2MDJFLCAweDE5OEIsIDB4NjAyRiwKKyAgICAweDA1QzYsIDB4NjAzMiwgMHgxOTdGLCAweDYwMzMsIDB4MTk4NCwgMHg2MDM0LCAweDE5ODEsIDB4NjAzNSwgMHgwNUM3LAorICAgIDB4NjAzNywgMHgxQUQ5LCAweDYwMzksIDB4MUFEQSwgMHg2MDQwLCAweDFBRTQsIDB4NjA0MSwgMHgxQzkyLCAweDYwNDIsCisgICAgMHgxQUU1LCAweDYwNDMsIDB4MDcyQSwgMHg2MDQ0LCAweDFBRTgsIDB4NjA0NSwgMHgxQURFLCAweDYwNDYsIDB4MDcyOSwKKyAgICAweDYwNDcsIDB4MUFFMCwgMHg2MDQ5LCAweDFBRTEsIDB4NjA0QywgMHgxQUUzLCAweDYwNEQsIDB4MDcyNSwgMHg2MDUwLAorICAgIDB4MDhCNSwgMHg2MDUyLCAweDM2RUMsIDB4NjA1MywgMHgxQURGLCAweDYwNTQsIDB4MUFEQiwgMHg2MDU1LCAweDA4QjYsCisgICAgMHg2MDU4LCAweDFBRTksIDB4NjA1OSwgMHgwOEIyLCAweDYwNUEsIDB4MUM5MCwgMHg2MDVCLCAweDFBRTIsIDB4NjA1RCwKKyAgICAweDFDOEYsIDB4NjA1RSwgMHgxQURELCAweDYwNUYsIDB4MUFFNiwgMHg2MDYyLCAweDA3MjgsIDB4NjA2MywgMHgwOEIzLAorICAgIDB4NjA2NCwgMHgwNzJFLCAweDYwNjUsIDB4MDhCNCwgMHg2MDY2LCAweDFBRUEsIDB4NjA2NywgMHgxQzkxLCAweDYwNjgsCisgICAgMHgwNzI3LCAweDYwNjksIDB4MDhCOCwgMHg2MDZBLCAweDA3MkQsIDB4NjA2QiwgMHgwNzJDLCAweDYwNkMsIDB4MDcyQiwKKyAgICAweDYwNkQsIDB4MDhCNywgMHg2MDZFLCAweDFBRUIsIDB4NjA2RiwgMHgwOEI5LCAweDYwNzAsIDB4MDcyNiwgMHg2MDcyLAorICAgIDB4MUFEQywgMHg2MDdGLCAweDBBODIsIDB4NjA4MCwgMHgxQzk1LCAweDYwODEsIDB4MUM5NywgMHg2MDgzLCAweDFDOTksCisgICAgMHg2MDg0LCAweDA4QkEsIDB4NjA4NSwgMHgwOEMwLCAweDYwODYsIDB4MUVEQSwgMHg2MDg3LCAweDFDOUQsIDB4NjA4OCwKKyAgICAweDFDOTQsIDB4NjA4OSwgMHgwQTg0LCAweDYwOEEsIDB4MUVEOCwgMHg2MDhDLCAweDA4QkYsIDB4NjA4RCwgMHgwOEJELAorICAgIDB4NjA4RSwgMHgxQzlGLCAweDYwOTAsIDB4MUVEOSwgMHg2MDkyLCAweDFDOTYsIDB4NjA5NCwgMHgwOEJFLCAweDYwOTUsCisgICAgMHgxQzlBLCAweDYwOTYsIDB4MDhDMSwgMHg2MDk3LCAweDFDOUMsIDB4NjA5QSwgMHgwOEJDLCAweDYwOUIsIDB4MUM5QiwKKyAgICAweDYwOUMsIDB4MUM5RSwgMHg2MDlELCAweDFDOTgsIDB4NjA5RiwgMHgwOEJCLCAweDYwQTAsIDB4MEE4NSwgMHg2MEEyLAorICAgIDB4MUM5MywgMHg2MEEzLCAweDBBODMsIDB4NjBBOCwgMHgwQTg2LCAweDYwQjAsIDB4MUVEQywgMHg2MEIxLCAweDFFRTUsCisgICAgMHg2MEIyLCAweDBDNDcsIDB4NjBCNCwgMHgwQTg4LCAweDYwQjUsIDB4MEE4RCwgMHg2MEI2LCAweDBDNDgsIDB4NjBCNywKKyAgICAweDFFRTcsIDB4NjBCOCwgMHgwQTk0LCAweDYwQjksIDB4MjEzNCwgMHg2MEJBLCAweDFFREQsIDB4NjBCQiwgMHgwQThDLAorICAgIDB4NjBCQywgMHgwQThGLCAweDYwQkQsIDB4MEE4QSwgMHg2MEJFLCAweDFFREIsIDB4NjBCRiwgMHgxRUU5LCAweDYwQzAsCisgICAgMHgxRUVDLCAweDYwQzEsIDB4MjE0MywgMHg2MEMzLCAweDFFRUEsIDB4NjBDNCwgMHgyMTM4LCAweDYwQzUsIDB4MEE4QiwKKyAgICAweDYwQzYsIDB4MEE5MiwgMHg2MEM3LCAweDBBOTYsIDB4NjBDOCwgMHgxRUU0LCAweDYwQzksIDB4MjEzMywgMHg2MENBLAorICAgIDB4MUVFOCwgMHg2MENCLCAweDBBODcsIDB4NjBDQywgMHgyMTM1LCAweDYwQ0QsIDB4MUVFQiwgMHg2MENFLCAweDIxMzcsCisgICAgMHg2MENGLCAweDFFRTAsIDB4NjBEMSwgMHgwQzQ1LCAweDYwRDMsIDB4MUVERSwgMHg2MEQ0LCAweDFFREYsIDB4NjBENSwKKyAgICAweDBBOTEsIDB4NjBEOCwgMHgwQTkwLCAweDYwRDksIDB4MUVFMiwgMHg2MERBLCAweDBBOTUsIDB4NjBEQiwgMHgxRUU2LAorICAgIDB4NjBEQywgMHgwQThFLCAweDYwREQsIDB4MUVFMywgMHg2MERGLCAweDBBOTMsIDB4NjBFMCwgMHgwQzQ5LCAweDYwRTEsCisgICAgMHgwQzQ2LCAweDYwRTIsIDB4MjEzNiwgMHg2MEU0LCAweDFFRTEsIDB4NjBFNiwgMHgwQTg5LCAweDYwRjAsIDB4MEM0RSwKKyAgICAweDYwRjEsIDB4MEM1MiwgMHg2MEYyLCAweDIxM0EsIDB4NjBGMywgMHgwRTBCLCAweDYwRjQsIDB4MEM1MCwgMHg2MEY1LAorICAgIDB4MjEzRSwgMHg2MEY2LCAweDBDNTQsIDB4NjBGNywgMHgyM0Q0LCAweDYwRjgsIDB4MjE0MCwgMHg2MEY5LCAweDBFMEQsCisgICAgMHg2MEZBLCAweDBDNEMsIDB4NjBGQiwgMHgwQzRGLCAweDYwRkMsIDB4MjE0MSwgMHg2MEZFLCAweDIxNDIsIDB4NjBGRiwKKyAgICAweDIxNDgsIDB4NjEwMCwgMHgwQzU2LCAweDYxMDEsIDB4MEUwRSwgMHg2MTAzLCAweDIxNDQsIDB4NjEwNCwgMHgyMTQ5LAorICAgIDB4NjEwNSwgMHgyMTNELCAweDYxMDYsIDB4MEUxOCwgMHg2MTA4LCAweDBFMEYsIDB4NjEwOSwgMHgwQzU1LCAweDYxMEEsCisgICAgMHgyMTNCLCAweDYxMEIsIDB4MjE0QSwgMHg2MTBELCAweDBFMTcsIDB4NjEwRSwgMHgwQzUzLCAweDYxMEYsIDB4MEUwOCwKKyAgICAweDYxMTAsIDB4MjE0NywgMHg2MTEyLCAweDBDNTcsIDB4NjExMywgMHgyMTNGLCAweDYxMTQsIDB4MjEzOSwgMHg2MTE1LAorICAgIDB4MEM0RCwgMHg2MTE2LCAweDIxM0MsIDB4NjExOCwgMHgyMTQ1LCAweDYxMUEsIDB4MEUwNywgMHg2MTFCLCAweDBFMEMsCisgICAgMHg2MTFDLCAweDBDNEEsIDB4NjExRCwgMHgyMTQ2LCAweDYxMUYsIDB4MEUwQSwgMHg2MTIzLCAweDBDNEIsIDB4NjEyNywKKyAgICAweDBFMTYsIDB4NjEyOCwgMHgyNjgzLCAweDYxMjksIDB4MjNERiwgMHg2MTJCLCAweDIzRDcsIDB4NjEyQywgMHgyNjgyLAorICAgIDB4NjEyRSwgMHgyM0RCLCAweDYxMkYsIDB4MjNERCwgMHg2MTMyLCAweDIzREEsIDB4NjEzNCwgMHgwRTE1LCAweDYxMzYsCisgICAgMHgyM0Q5LCAweDYxMzcsIDB4MEUxOSwgMHg2MTNCLCAweDI2OTIsIDB4NjEzRSwgMHgwRTE0LCAweDYxM0YsIDB4MEZEMSwKKyAgICAweDYxNDAsIDB4MjNFMCwgMHg2MTQxLCAweDI2ODQsIDB4NjE0NCwgMHgwRTEyLCAweDYxNDUsIDB4MjNEOCwgMHg2MTQ2LAorICAgIDB4MjNEQywgMHg2MTQ3LCAweDBGRDAsIDB4NjE0OCwgMHgwRTA5LCAweDYxNDksIDB4MjNENSwgMHg2MTRBLCAweDIzRDYsCisgICAgMHg2MTRCLCAweDBGRDIsIDB4NjE0QywgMHgwRTExLCAweDYxNEQsIDB4MEUxMywgMHg2MTRFLCAweDBFMTAsIDB4NjE0RiwKKyAgICAweDIzREUsIDB4NjE1MiwgMHgyNjg4LCAweDYxNTMsIDB4MjY4OSwgMHg2MTU0LCAweDI2OEUsIDB4NjE1NSwgMHgxMTQ5LAorICAgIDB4NjE1NiwgMHgyNjk1LCAweDYxNTgsIDB4MEZEOCwgMHg2MTVBLCAweDBGRDcsIDB4NjE1QiwgMHgyNjkwLCAweDYxNUQsCisgICAgMHgxMTQ4LCAweDYxNUUsIDB4MjY4NSwgMHg2MTVGLCAweDBGRDYsIDB4NjE2MSwgMHgyNjk0LCAweDYxNjIsIDB4MEZENCwKKyAgICAweDYxNjMsIDB4MEZENSwgMHg2MTY1LCAweDI2OTEsIDB4NjE2NiwgMHgyOERFLCAweDYxNjcsIDB4MTE0NiwgMHg2MTY4LAorICAgIDB4MEM1MSwgMHg2MTZBLCAweDI2OTMsIDB4NjE2QiwgMHgxMTRELCAweDYxNkMsIDB4MjY4QiwgMHg2MTZFLCAweDExNDcsCisgICAgMHg2MTcwLCAweDExNEMsIDB4NjE3MSwgMHgyNjg2LCAweDYxNzIsIDB4MjY4QSwgMHg2MTczLCAweDI2ODcsIDB4NjE3NCwKKyAgICAweDI2OEQsIDB4NjE3NSwgMHgwRkQ5LCAweDYxNzYsIDB4MTE0NSwgMHg2MTc3LCAweDBGRDMsIDB4NjE3OSwgMHgyOEQwLAorICAgIDB4NjE3QSwgMHgyNjhGLCAweDYxN0MsIDB4MTE0QiwgMHg2MTdFLCAweDExNEUsIDB4NjE4MCwgMHgyNjhDLCAweDYxODIsCisgICAgMHgxMTRBLCAweDYxODMsIDB4MjhDRiwgMHg2MTg5LCAweDI4RDQsIDB4NjE4QSwgMHgxMkIxLCAweDYxOEIsIDB4MjhDRSwKKyAgICAweDYxOEMsIDB4MkI0RCwgMHg2MThELCAweDI4REQsIDB4NjE4RSwgMHgxMTUyLCAweDYxOTAsIDB4MTE1MCwgMHg2MTkxLAorICAgIDB4MTJBRiwgMHg2MTkyLCAweDI4REEsIDB4NjE5MywgMHgyOEQ2LCAweDYxOTQsIDB4MTE1NiwgMHg2MTk2LCAweDJCNDQsCisgICAgMHg2MTlBLCAweDExNTQsIDB4NjE5QiwgMHgyOEQ1LCAweDYxOUQsIDB4MkI0MiwgMHg2MTlGLCAweDI4RDksIDB4NjFBMSwKKyAgICAweDI4REMsIDB4NjFBMiwgMHgyOEQzLCAweDYxQTQsIDB4MTE1NSwgMHg2MUE3LCAweDExNEYsIDB4NjFBOCwgMHgyQjQzLAorICAgIDB4NjFBOSwgMHgxMkIwLCAweDYxQUEsIDB4MjhEQiwgMHg2MUFCLCAweDExNTEsIDB4NjFBQywgMHgxMTUzLCAweDYxQUQsCisgICAgMHgyOEQ4LCAweDYxQUUsIDB4MTE1NywgMHg2MUFGLCAweDI4RDcsIDB4NjFCMCwgMHgyOEQyLCAweDYxQjEsIDB4MjhEMSwKKyAgICAweDYxQjIsIDB4MTJBRSwgMHg2MUIzLCAweDI4REYsIDB4NjFCNCwgMHgyQjQ2LCAweDYxQjUsIDB4MkQ2MCwgMHg2MUI2LAorICAgIDB4MTJCMywgMHg2MUI4LCAweDJCNEMsIDB4NjFCQSwgMHgyQjRBLCAweDYxQkMsIDB4MkQ2MSwgMHg2MUJFLCAweDEyQjQsCisgICAgMHg2MUJGLCAweDJCNEIsIDB4NjFDMSwgMHgyQjQ4LCAweDYxQzIsIDB4MTNEMSwgMHg2MUMzLCAweDJENUYsIDB4NjFDNSwKKyAgICAweDJCNDUsIDB4NjFDNiwgMHgyQjQ3LCAweDYxQzcsIDB4MTNEMiwgMHg2MUM4LCAweDEyQjYsIDB4NjFDOSwgMHgxM0QwLAorICAgIDB4NjFDQSwgMHgxMkI1LCAweDYxQ0IsIDB4MTNENCwgMHg2MUNDLCAweDJCNDksIDB4NjFDRCwgMHgxMkIyLCAweDYxRDYsCisgICAgMHgyRjI2LCAweDYxRDgsIDB4MkYxRSwgMHg2MURFLCAweDJENjcsIDB4NjFERiwgMHgyRjFGLCAweDYxRTAsIDB4MkQ2MywKKyAgICAweDYxRTMsIDB4MTREMCwgMHg2MUU0LCAweDJENjUsIDB4NjFFNSwgMHgyRDY0LCAweDYxRTYsIDB4MTNEMywgMHg2MUU3LAorICAgIDB4MkQ2MiwgMHg2MUU4LCAweDJENjYsIDB4NjFFOSwgMHgyRjI3LCAweDYxRUEsIDB4MkYyMywgMHg2MUVCLCAweDJGMjUsCisgICAgMHg2MUVELCAweDJGMjAsIDB4NjFFRSwgMHgyRjIxLCAweDYxRjAsIDB4MkYyNCwgMHg2MUYxLCAweDJGMjIsIDB4NjFGMiwKKyAgICAweDE1N0UsIDB4NjFGNSwgMHgxNTgxLCAweDYxRjYsIDB4MTU4MCwgMHg2MUY3LCAweDE1N0YsIDB4NjFGOCwgMHgxNjE0LAorICAgIDB4NjFGOSwgMHgzMUQzLCAweDYxRkEsIDB4MTYxNSwgMHg2MUZCLCAweDMwOEYsIDB4NjFGQywgMHgxNjcwLCAweDYxRkQsCisgICAgMHgzMkQxLCAweDYxRkUsIDB4MTY3MSwgMHg2MUZGLCAweDE2QzQsIDB4NjIwMCwgMHgxNkY4LCAweDYyMDEsIDB4MzQxNywKKyAgICAweDYyMDMsIDB4MzQxOCwgMHg2MjA0LCAweDM0MTksIDB4NjIwNywgMHgzNTMzLCAweDYyMDgsIDB4MDJEMSwgMHg2MjA5LAorICAgIDB4MTdBOCwgMHg2MjBBLCAweDAzNDEsIDB4NjIwQywgMHgwM0QxLCAweDYyMEQsIDB4MDNEMiwgMHg2MjBFLCAweDAzRDAsCisgICAgMHg2MjEwLCAweDAzRDMsIDB4NjIxMSwgMHgwNEEyLCAweDYyMTIsIDB4MDRBMSwgMHg2MjE0LCAweDE5OTEsIDB4NjIxNSwKKyAgICAweDA1RDEsIDB4NjIxNiwgMHgwNUQwLCAweDYyMTksIDB4MUNBMCwgMHg2MjFBLCAweDBBOTcsIDB4NjIxQiwgMHgwQTk4LAorICAgIDB4NjIxRiwgMHgwQzU4LCAweDYyMjAsIDB4MjNFMSwgMHg2MjIxLCAweDBFMUEsIDB4NjIyMiwgMHgwRTFCLCAweDYyMjMsCisgICAgMHgyM0UzLCAweDYyMjQsIDB4MjNFNSwgMHg2MjI1LCAweDIzRTQsIDB4NjIyNywgMHgyNjk3LCAweDYyMjksIDB4MjY5NiwKKyAgICAweDYyMkEsIDB4MEZEQSwgMHg2MjJCLCAweDI2OTgsIDB4NjIyRCwgMHgyOEUwLCAweDYyMkUsIDB4MTE1OCwgMHg2MjMwLAorICAgIDB4MTJCNywgMHg2MjMyLCAweDEzRDUsIDB4NjIzMywgMHgxNEQxLCAweDYyMzQsIDB4MTNENiwgMHg2MjM2LCAweDAyRDIsCisgICAgMHg2MjNBLCAweDE4OEQsIDB4NjIzRCwgMHgxOTkyLCAweDYyM0UsIDB4MDVEMywgMHg2MjNGLCAweDA1RDIsIDB4NjI0MCwKKyAgICAweDA1RDQsIDB4NjI0MSwgMHgwNzJGLCAweDYyNDIsIDB4MUFFQywgMHg2MjQzLCAweDFBRUQsIDB4NjI0NiwgMHgxQ0ExLAorICAgIDB4NjI0NywgMHgwOEMyLCAweDYyNDgsIDB4MEE5OSwgMHg2MjQ5LCAweDBDNTksIDB4NjI0QSwgMHgyMTRCLCAweDYyNEIsCisgICAgMHgwMkQzLCAweDYyNEQsIDB4MDI5MSwgMHg2MjRFLCAweDAyRDQsIDB4NjI1MCwgMHgxN0E5LCAweDYyNTEsIDB4MDM0NSwKKyAgICAweDYyNTIsIDB4MDM0NCwgMHg2MjUzLCAweDAzNDIsIDB4NjI1NCwgMHgwMzQzLCAweDYyNTgsIDB4MDNENiwgMHg2MjU5LAorICAgIDB4MTdGMiwgMHg2MjVBLCAweDE3RjQsIDB4NjI1QiwgMHgwM0Q1LCAweDYyNUMsIDB4MTdFQywgMHg2MjVFLCAweDE3RUQsCisgICAgMHg2MjYwLCAweDE3RjMsIDB4NjI2MSwgMHgxN0VGLCAweDYyNjIsIDB4MTdGMSwgMHg2MjYzLCAweDAzRDQsIDB4NjI2NCwKKyAgICAweDE3RUUsIDB4NjI2NSwgMHgxN0Y1LCAweDYyNjYsIDB4MTdGMCwgMHg2MjZELCAweDA0QTksIDB4NjI2RSwgMHgwNEIyLAorICAgIDB4NjI2RiwgMHgwNEIwLCAweDYyNzAsIDB4MTg5NywgMHg2MjcxLCAweDE4OTQsIDB4NjI3MiwgMHgxODlDLCAweDYyNzMsCisgICAgMHgwNEFFLCAweDYyNzQsIDB4MTg5RCwgMHg2Mjc2LCAweDA0QTcsIDB4NjI3NywgMHgxODlBLCAweDYyNzksIDB4MDRBRCwKKyAgICAweDYyN0EsIDB4MTg5NiwgMHg2MjdCLCAweDE4OTUsIDB4NjI3QywgMHgwNEFCLCAweDYyN0QsIDB4MTg5QiwgMHg2MjdFLAorICAgIDB4MDRBQywgMHg2MjdGLCAweDA1RDUsIDB4NjI4MCwgMHgwNEE2LCAweDYyODEsIDB4MTg5OCwgMHg2MjgzLCAweDE4OEUsCisgICAgMHg2Mjg0LCAweDA0QTMsIDB4NjI4NiwgMHgwNEI2LCAweDYyODcsIDB4MTg5MywgMHg2Mjg4LCAweDE4OTksIDB4NjI4OSwKKyAgICAweDA0QTgsIDB4NjI4QSwgMHgwNEFBLCAweDYyOEMsIDB4MTg4RiwgMHg2MjhFLCAweDE4OTAsIDB4NjI4RiwgMHgxODkxLAorICAgIDB4NjI5MSwgMHgwNEI1LCAweDYyOTIsIDB4MDRBRiwgMHg2MjkzLCAweDA0QjQsIDB4NjI5NCwgMHgxODkyLCAweDYyOTUsCisgICAgMHgwNEIzLCAweDYyOTYsIDB4MDRBNSwgMHg2Mjk3LCAweDA0QTQsIDB4NjI5OCwgMHgwNEIxLCAweDYyQTgsIDB4MDVFMywKKyAgICAweDYyQTksIDB4MTk5RSwgMHg2MkFBLCAweDE5OTcsIDB4NjJBQiwgMHgwNURFLCAweDYyQUMsIDB4MDVGMSwgMHg2MkFELAorICAgIDB4MTk5MywgMHg2MkFFLCAweDE5OUEsIDB4NjJBRiwgMHgxOTlDLCAweDYyQjAsIDB4MTk5RiwgMHg2MkIxLCAweDA1RUMsCisgICAgMHg2MkIzLCAweDE5OUIsIDB4NjJCNCwgMHgxOTk0LCAweDYyQjUsIDB4MDVFQSwgMHg2MkI2LCAweDE5OTgsIDB4NjJCOCwKKyAgICAweDE5QTAsIDB4NjJCOSwgMHgwNURCLCAweDYyQkIsIDB4MTk5RCwgMHg2MkJDLCAweDA1RTUsIDB4NjJCRCwgMHgwNUU0LAorICAgIDB4NjJCRSwgMHgxOTk2LCAweDYyQkYsIDB4MDVEOSwgMHg2MkMyLCAweDA1REEsIDB4NjJDNCwgMHgwNUQ4LCAweDYyQzYsCisgICAgMHgwNUYwLCAweDYyQzcsIDB4MDVFOCwgMHg2MkM4LCAweDA1RTIsIDB4NjJDOSwgMHgwNUQ2LCAweDYyQ0EsIDB4MTk5OSwKKyAgICAweDYyQ0IsIDB4MDVFMSwgMHg2MkNDLCAweDA1RDcsIDB4NjJDRCwgMHgwNUU5LCAweDYyQ0UsIDB4MDVGMiwgMHg2MkNGLAorICAgIDB4MUFFRSwgMHg2MkQwLCAweDA1RTYsIDB4NjJEMSwgMHgxOTk1LCAweDYyRDIsIDB4MDVEQywgMHg2MkQzLCAweDA1REYsCisgICAgMHg2MkQ0LCAweDA1RTAsIDB4NjJENiwgMHgwNUVFLCAweDYyRDcsIDB4MDVFRiwgMHg2MkQ4LCAweDA1RUQsIDB4NjJEOSwKKyAgICAweDA1RTcsIDB4NjJEQSwgMHgwNUVCLCAweDYyREIsIDB4MDVERCwgMHg2MkRDLCAweDA3MzAsIDB4NjJFQiwgMHgxQUY0LAorICAgIDB4NjJFQywgMHgwNzNDLCAweDYyRUQsIDB4MDczNCwgMHg2MkVFLCAweDA3MzYsIDB4NjJFRiwgMHgwNzNCLCAweDYyRjAsCisgICAgMHgxQjAwLCAweDYyRjEsIDB4MDczOSwgMHg2MkYyLCAweDFDQTIsIDB4NjJGMywgMHgwOEMzLCAweDYyRjQsIDB4MDczRSwKKyAgICAweDYyRjUsIDB4MUFGMSwgMHg2MkY2LCAweDFBRjksIDB4NjJGNywgMHgwNzNBLCAweDYyRjgsIDB4MUFGOCwgMHg2MkY5LAorICAgIDB4MUFGNSwgMHg2MkZBLCAweDFBRkQsIDB4NjJGQiwgMHgxQUZGLCAweDYyRkMsIDB4MDczMywgMHg2MkZELCAweDA3MzcsCisgICAgMHg2MkZFLCAweDA3M0QsIDB4NjJGRiwgMHgwOEM1LCAweDYzMDAsIDB4MUFGQSwgMHg2MzAxLCAweDA3MzUsIDB4NjMwMiwKKyAgICAweDA3NDAsIDB4NjMwMywgMHgxQUYzLCAweDYzMDcsIDB4MDczOCwgMHg2MzA4LCAweDA4QzQsIDB4NjMwOSwgMHgwNzMyLAorICAgIDB4NjMwQiwgMHgxQUYwLCAweDYzMEMsIDB4MUFGNywgMHg2MzBELCAweDFBRUYsIDB4NjMwRSwgMHgxQUYyLCAweDYzMEYsCisgICAgMHgxQUY2LCAweDYzMTAsIDB4MUNBMywgMHg2MzExLCAweDA3M0YsIDB4NjMxMywgMHgxQUZCLCAweDYzMTQsIDB4MUFGQywKKyAgICAweDYzMTUsIDB4MUFGRSwgMHg2MzE2LCAweDA3MzEsIDB4NjMyOCwgMHgwOEQzLCAweDYzMjksIDB4MUNBRiwgMHg2MzJBLAorICAgIDB4MDhEMSwgMHg2MzJCLCAweDA4RDIsIDB4NjMyQywgMHgxQ0E1LCAweDYzMkQsIDB4MUNCNSwgMHg2MzJGLCAweDA4QzgsCisgICAgMHg2MzMyLCAweDFFRUQsIDB4NjMzMywgMHgxQ0I3LCAweDYzMzQsIDB4MUNCMSwgMHg2MzM2LCAweDFDQTgsIDB4NjMzOCwKKyAgICAweDFDQkEsIDB4NjMzOSwgMHgxQ0FCLCAweDYzM0EsIDB4MDhDRSwgMHg2MzNCLCAweDFGMDQsIDB4NjMzQywgMHgxQ0FFLAorICAgIDB4NjMzRCwgMHgwOEQwLCAweDYzM0UsIDB4MDhDNywgMHg2MzQwLCAweDFDQkMsIDB4NjM0MSwgMHgxQ0IwLCAweDYzNDIsCisgICAgMHgwOENBLCAweDYzNDMsIDB4MUNBOSwgMHg2MzQ0LCAweDFDQTYsIDB4NjM0NSwgMHgxQ0E3LCAweDYzNDYsIDB4MDhDQiwKKyAgICAweDYzNDcsIDB4MUNCNiwgMHg2MzQ4LCAweDFDQkQsIDB4NjM0OSwgMHgwOENELCAweDYzNEEsIDB4MUNBRCwgMHg2MzRCLAorICAgIDB4MUNBQywgMHg2MzRDLCAweDA4RDUsIDB4NjM0RCwgMHgwOEQ0LCAweDYzNEUsIDB4MDhDNiwgMHg2MzRGLCAweDA4Q0MsCisgICAgMHg2MzUwLCAweDA4Q0YsIDB4NjM1MSwgMHgxQ0I5LCAweDYzNTQsIDB4MUNCMywgMHg2MzU1LCAweDA4QzksIDB4NjM1NiwKKyAgICAweDFDQTQsIDB4NjM1NywgMHgxQ0JCLCAweDYzNTgsIDB4MUNCMiwgMHg2MzU5LCAweDFDQjQsIDB4NjM1QSwgMHgxQ0I4LAorICAgIDB4NjM2NSwgMHgxRUVFLCAweDYzNjcsIDB4MEFBMSwgMHg2MzY4LCAweDBBQjUsIDB4NjM2OSwgMHgwQUI0LCAweDYzNkIsCisgICAgMHgwQUE5LCAweDYzNkQsIDB4MUYwMCwgMHg2MzZFLCAweDFFRkMsIDB4NjM2RiwgMHgxRUY5LCAweDYzNzAsIDB4MUYwQiwKKyAgICAweDYzNzEsIDB4MEFBNCwgMHg2MzcyLCAweDBBOUMsIDB4NjM3NSwgMHgxRUZFLCAweDYzNzYsIDB4MEM2OSwgMHg2Mzc3LAorICAgIDB4MEFBMCwgMHg2Mzc4LCAweDFGMDYsIDB4NjM3QSwgMHgwQUI2LCAweDYzN0IsIDB4MEFCMywgMHg2MzdDLCAweDFGMDIsCisgICAgMHg2MzdELCAweDFFRjEsIDB4NjM4MCwgMHgwQUIyLCAweDYzODEsIDB4MUYwOCwgMHg2MzgyLCAweDFFRjAsIDB4NjM4MywKKyAgICAweDBBQTcsIDB4NjM4NCwgMHgwQUFCLCAweDYzODUsIDB4MUYwNywgMHg2Mzg3LCAweDFFRkEsIDB4NjM4OCwgMHgwQUFDLAorICAgIDB4NjM4OSwgMHgwQUE2LCAweDYzOEEsIDB4MUVFRiwgMHg2MzhDLCAweDBDNUIsIDB4NjM4RCwgMHgxRjBBLCAweDYzOEUsCisgICAgMHgxRUY4LCAweDYzOEYsIDB4MEFCMSwgMHg2MzkwLCAweDFFRkIsIDB4NjM5MSwgMHgxRjA5LCAweDYzOTIsIDB4MEFCMCwKKyAgICAweDYzOTQsIDB4MjE0QywgMHg2Mzk2LCAweDBBOUQsIDB4NjM5NywgMHgxRUY2LCAweDYzOTgsIDB4MEFBMiwgMHg2Mzk5LAorICAgIDB4MEFBRCwgMHg2MzlCLCAweDBBQTgsIDB4NjM5QywgMHgxRUZGLCAweDYzOUQsIDB4MUVGNSwgMHg2MzlFLCAweDFFRjMsCisgICAgMHg2MzlGLCAweDFGMDUsIDB4NjNBMCwgMHgwQTlBLCAweDYzQTEsIDB4MEFBRSwgMHg2M0EyLCAweDBBOUUsIDB4NjNBMywKKyAgICAweDBDNUEsIDB4NjNBNCwgMHgxRjAzLCAweDYzQTUsIDB4MEE5RiwgMHg2M0E3LCAweDBBOUIsIDB4NjNBOCwgMHgwQUFBLAorICAgIDB4NjNBOSwgMHgwQUE1LCAweDYzQUEsIDB4MEFBMywgMHg2M0FCLCAweDFFRjcsIDB4NjNBQywgMHgwQUFGLCAweDYzQUQsCisgICAgMHgxRUY0LCAweDYzQUUsIDB4MUYwMSwgMHg2M0FGLCAweDFFRkQsIDB4NjNCMCwgMHgyMTRFLCAweDYzQjEsIDB4MjE0RCwKKyAgICAweDYzQkQsIDB4MUVGMiwgMHg2M0JFLCAweDIxNUUsIDB4NjNDMCwgMHgwQzVELCAweDYzQzIsIDB4MjE2NCwgMHg2M0MzLAorICAgIDB4MjE1MywgMHg2M0M0LCAweDIxNjEsIDB4NjNDNSwgMHgyM0U2LCAweDYzQzYsIDB4MEM2MCwgMHg2M0M3LCAweDIxNjUsCisgICAgMHg2M0M4LCAweDIxNjgsIDB4NjNDOSwgMHgwQzVGLCAweDYzQ0EsIDB4MjE1NiwgMHg2M0NCLCAweDIxNjcsIDB4NjNDQywKKyAgICAweDIxNjYsIDB4NjNDRCwgMHgwQzYxLCAweDYzQ0UsIDB4MjE0RiwgMHg2M0NGLCAweDBDNUMsIDB4NjNEMCwgMHgwQzY0LAorICAgIDB4NjNEMiwgMHgwQzYyLCAweDYzRDMsIDB4MjE2MywgMHg2M0Q1LCAweDIxNTksIDB4NjNENiwgMHgwQzY2LCAweDYzRDcsCisgICAgMHgyMTZBLCAweDYzRDgsIDB4MjE2MiwgMHg2M0Q5LCAweDIxNkIsIDB4NjNEQSwgMHgwQzZFLCAweDYzREIsIDB4MEM2QywKKyAgICAweDYzREMsIDB4MjE2MCwgMHg2M0RELCAweDIxNUYsIDB4NjNERiwgMHgyMTVELCAweDYzRTAsIDB4MjE1NywgMHg2M0UxLAorICAgIDB4MEM2NSwgMHg2M0UzLCAweDBDNjMsIDB4NjNFNCwgMHgxQ0FBLCAweDYzRTUsIDB4MjE1MCwgMHg2M0U3LCAweDI0MDQsCisgICAgMHg2M0U4LCAweDIxNTEsIDB4NjNFOSwgMHgwQzVFLCAweDYzRUEsIDB4MEM2QiwgMHg2M0VCLCAweDIzRTgsIDB4NjNFRCwKKyAgICAweDBDNjcsIDB4NjNFRSwgMHgwQzY4LCAweDYzRUYsIDB4MjE1MiwgMHg2M0YwLCAweDIxNjksIDB4NjNGMSwgMHgyM0U3LAorICAgIDB4NjNGMiwgMHgyMTVBLCAweDYzRjMsIDB4MjE1NSwgMHg2M0Y0LCAweDBDNkEsIDB4NjNGNSwgMHgyMTVCLCAweDYzRjYsCisgICAgMHgyMTU4LCAweDYzRjksIDB4MEM2RiwgMHg2NDA2LCAweDBFMkEsIDB4NjQwOSwgMHgyM0VCLCAweDY0MEEsIDB4MjNGRSwKKyAgICAweDY0MEIsIDB4MjQwMywgMHg2NDBDLCAweDIzRjcsIDB4NjQwRCwgMHgwRTI2LCAweDY0MEUsIDB4MjQwOCwgMHg2NDBGLAorICAgIDB4MEUyMywgMHg2NDEwLCAweDIzRTksIDB4NjQxMiwgMHgyM0VBLCAweDY0MTMsIDB4MEUxQywgMHg2NDE0LCAweDBFMjUsCisgICAgMHg2NDE1LCAweDIzRjEsIDB4NjQxNiwgMHgwRTI4LCAweDY0MTcsIDB4MEUyOSwgMHg2NDE4LCAweDIzRjIsIDB4NjQxQSwKKyAgICAweDIzRkYsIDB4NjQxQiwgMHgyNDA1LCAweDY0MUMsIDB4MEUyNCwgMHg2NDFFLCAweDBFMUUsIDB4NjQxRiwgMHgyM0YwLAorICAgIDB4NjQyMCwgMHgyM0VDLCAweDY0MjEsIDB4MjQwNywgMHg2NDIyLCAweDIzRjUsIDB4NjQyMywgMHgyM0Y2LCAweDY0MjQsCisgICAgMHgyM0VELCAweDY0MjUsIDB4MjQwMSwgMHg2NDI2LCAweDIzRjgsIDB4NjQyNywgMHgyNDAyLCAweDY0MjgsIDB4MjNGQSwKKyAgICAweDY0MkEsIDB4MEUxRiwgMHg2NDJCLCAweDI2OTksIDB4NjQyQywgMHgwRTIyLCAweDY0MkQsIDB4MEUyMCwgMHg2NDJFLAorICAgIDB4MjQwNiwgMHg2NDJGLCAweDIzRkQsIDB4NjQzMCwgMHgyM0Y5LCAweDY0MzMsIDB4MjNFRSwgMHg2NDM0LCAweDBGRTQsCisgICAgMHg2NDM1LCAweDIzRkMsIDB4NjQzNiwgMHgwRTI3LCAweDY0MzcsIDB4MjNGNCwgMHg2NDM5LCAweDIzRjMsIDB4NjQzRCwKKyAgICAweDBFMjEsIDB4NjQzRSwgMHgwRTFELCAweDY0M0YsIDB4MjZBRSwgMHg2NDQwLCAweDI0MDAsIDB4NjQ0MSwgMHgyM0ZCLAorICAgIDB4NjQ0MywgMHgyM0VGLCAweDY0NEIsIDB4MjZBOSwgMHg2NDRELCAweDI2OUEsIDB4NjQ0RSwgMHgyNkE1LCAweDY0NTAsCisgICAgMHgyNkFDLCAweDY0NTEsIDB4MEZFMiwgMHg2NDUyLCAweDBDNkQsIDB4NjQ1MywgMHgyNkFBLCAweDY0NTQsIDB4MEZERCwKKyAgICAweDY0NTgsIDB4MEZEQywgMHg2NDU5LCAweDI2QjEsIDB4NjQ1QiwgMHgyNjlCLCAweDY0NUMsIDB4MjZBOCwgMHg2NDVELAorICAgIDB4MjY5QywgMHg2NDVFLCAweDI2QTcsIDB4NjQ1RiwgMHgwRkUwLCAweDY0NjAsIDB4MjZBQiwgMHg2NDYxLCAweDIxNUMsCisgICAgMHg2NDY1LCAweDI2QjIsIDB4NjQ2NiwgMHgyNkEzLCAweDY0NjcsIDB4MEZFMywgMHg2NDY4LCAweDI4RUUsIDB4NjQ2OSwKKyAgICAweDExNTksIDB4NjQ2QiwgMHgyNkIwLCAweDY0NkMsIDB4MjZBRiwgMHg2NDZELCAweDBGRTUsIDB4NjQ2RSwgMHgyOEUxLAorICAgIDB4NjQ2RiwgMHgxMTVBLCAweDY0NzAsIDB4MjhFMiwgMHg2NDcyLCAweDI2OUYsIDB4NjQ3MywgMHgyNkEwLCAweDY0NzQsCisgICAgMHgyNjlELCAweDY0NzUsIDB4MjZBMiwgMHg2NDc2LCAweDI2OUUsIDB4NjQ3NywgMHgyNkIzLCAweDY0NzgsIDB4MEZERiwKKyAgICAweDY0NzksIDB4MTE1QiwgMHg2NDdBLCAweDBGRTEsIDB4NjQ3QiwgMHgwRkU2LCAweDY0N0QsIDB4MjZBMSwgMHg2NDdGLAorICAgIDB4MjZBRCwgMHg2NDgyLCAweDI2QTYsIDB4NjQ4NSwgMHgyOEU1LCAweDY0ODcsIDB4MEZEQiwgMHg2NDg4LCAweDExNUUsCisgICAgMHg2NDg5LCAweDJCNTQsIDB4NjQ4QSwgMHgyOEVBLCAweDY0OEIsIDB4MjhFOSwgMHg2NDhDLCAweDI4RUIsIDB4NjQ4RiwKKyAgICAweDI4RTgsIDB4NjQ5MCwgMHgxMTVGLCAweDY0OTIsIDB4MTE2NSwgMHg2NDkzLCAweDExNjIsIDB4NjQ5NSwgMHgxMTYzLAorICAgIDB4NjQ5NiwgMHgyOEUzLCAweDY0OTcsIDB4MjhFNiwgMHg2NDk4LCAweDI4RjAsIDB4NjQ5OSwgMHgxMTZCLCAweDY0OUEsCisgICAgMHgxMTY5LCAweDY0OUMsIDB4MjhFNywgMHg2NDlELCAweDIxNTQsIDB4NjQ5RSwgMHgxMTVDLCAweDY0OUYsIDB4MjhFRCwKKyAgICAweDY0QTAsIDB4MjhFNCwgMHg2NEEyLCAweDExNkMsIDB4NjRBMywgMHgyOEVDLCAweDY0QTQsIDB4MEZERSwgMHg2NEE1LAorICAgIDB4MTE2MSwgMHg2NEE2LCAweDI2QTQsIDB4NjRBOSwgMHgxMTY0LCAweDY0QUIsIDB4MTE2OCwgMHg2NEFDLCAweDExNkEsCisgICAgMHg2NEFELCAweDExNjcsIDB4NjRBRSwgMHgxMTY2LCAweDY0QjAsIDB4MTE2MCwgMHg2NEIxLCAweDI4RUYsIDB4NjRCMiwKKyAgICAweDExNUQsIDB4NjRCMywgMHgxMTZELCAweDY0QkIsIDB4MTJCQiwgMHg2NEJDLCAweDEyQkMsIDB4NjRCRCwgMHgyQjUzLAorICAgIDB4NjRCRSwgMHgxMkM1LCAweDY0QkYsIDB4MTJDMiwgMHg2NEMxLCAweDEyQjksIDB4NjRDMiwgMHgxMkMwLCAweDY0QzMsCisgICAgMHgyQjU1LCAweDY0QzQsIDB4MTJCRSwgMHg2NEM1LCAweDEyQjgsIDB4NjRDNywgMHgxMkJGLCAweDY0QzksIDB4MkI1MiwKKyAgICAweDY0Q0EsIDB4MTNEOCwgMHg2NENCLCAweDEyQkEsIDB4NjRDRCwgMHgxMkMxLCAweDY0Q0UsIDB4MTNENywgMHg2NENGLAorICAgIDB4MkI1MSwgMHg2NEQwLCAweDJCNTAsIDB4NjREMiwgMHgxMkMzLCAweDY0RDQsIDB4MTJDNCwgMHg2NEQ2LCAweDJCNEYsCisgICAgMHg2NEQ3LCAweDJCNEUsIDB4NjREOCwgMHgxM0Q5LCAweDY0RDksIDB4MkI1OCwgMHg2NERBLCAweDEyQkQsIDB4NjREQiwKKyAgICAweDJCNTYsIDB4NjRFMCwgMHgxM0RBLCAweDY0RTIsIDB4MTNERiwgMHg2NEUzLCAweDJENkEsIDB4NjRFNCwgMHgyRDZDLAorICAgIDB4NjRFNiwgMHgxM0RDLCAweDY0RTgsIDB4MkQ2RCwgMHg2NEU5LCAweDJENjksIDB4NjRFQiwgMHgyRDZCLCAweDY0RUMsCisgICAgMHgxM0RELCAweDY0RUQsIDB4MTNFMCwgMHg2NEVGLCAweDJENjgsIDB4NjRGMCwgMHgxM0RCLCAweDY0RjEsIDB4MTNERSwKKyAgICAweDY0RjIsIDB4MTREMywgMHg2NEYzLCAweDJCNTcsIDB4NjRGNCwgMHgxNEQyLCAweDY0RjcsIDB4MTREOCwgMHg2NEY4LAorICAgIDB4MkYyQiwgMHg2NEZBLCAweDE0RDYsIDB4NjRGQiwgMHgxNEQ3LCAweDY0RkMsIDB4MkYyRSwgMHg2NEZELCAweDJGMkEsCisgICAgMHg2NEZFLCAweDE0RDQsIDB4NjRGRiwgMHgyRjI4LCAweDY1MDAsIDB4MTU4MiwgMHg2NTAxLCAweDJGMkMsIDB4NjUwMywKKyAgICAweDJGMkQsIDB4NjUwNCwgMHgyRjI5LCAweDY1MDYsIDB4MTRENSwgMHg2NTA3LCAweDMwOTAsIDB4NjUwOSwgMHgzMDkzLAorICAgIDB4NjUwQywgMHgzMDk0LCAweDY1MEQsIDB4MzA5MiwgMHg2NTBFLCAweDMwOTUsIDB4NjUwRiwgMHgxNTgzLCAweDY1MTAsCisgICAgMHgzMDkxLCAweDY1MTMsIDB4MzFENywgMHg2NTE0LCAweDE2MTcsIDB4NjUxNSwgMHgzMUQ2LCAweDY1MTYsIDB4MzFENSwKKyAgICAweDY1MTcsIDB4MzFENCwgMHg2NTE4LCAweDE2MTYsIDB4NjUxOSwgMHgxNjE4LCAweDY1MUIsIDB4MzJEMiwgMHg2NTFDLAorICAgIDB4MTY3MywgMHg2NTFELCAweDE2NzIsIDB4NjUyMCwgMHgzMzgyLCAweDY1MjEsIDB4MzM4MSwgMHg2NTIyLCAweDMzODQsCisgICAgMHg2NTIzLCAweDE2RjksIDB4NjUyNCwgMHgxNkM1LCAweDY1MjUsIDB4MzQxQiwgMHg2NTI2LCAweDMzODMsIDB4NjUyOSwKKyAgICAweDM0MUEsIDB4NjUyQSwgMHgxNkZCLCAweDY1MkIsIDB4MTZGQSwgMHg2NTJDLCAweDE3MjEsIDB4NjUyRCwgMHgzNDg0LAorICAgIDB4NjUyRSwgMHgzNENBLCAweDY1MkYsIDB4MDJENSwgMHg2NTMyLCAweDIxNkMsIDB4NjUzMywgMHgyQjU5LCAweDY1MzQsCisgICAgMHgwMjJDLCAweDY1MzYsIDB4MDNENywgMHg2NTM3LCAweDE3RjYsIDB4NjUzOCwgMHgwNEI5LCAweDY1MzksIDB4MDRCNywKKyAgICAweDY1M0IsIDB4MDRCOCwgMHg2NTNELCAweDE5QTEsIDB4NjUzRSwgMHgwNUYzLCAweDY1M0YsIDB4MDc0MSwgMHg2NTQxLAorICAgIDB4MUIwMSwgMHg2NTQzLCAweDFCMDIsIDB4NjU0NSwgMHgwNzQyLCAweDY1NDYsIDB4MUNCRiwgMHg2NTQ4LCAweDA4RDYsCisgICAgMHg2NTQ5LCAweDA4RDcsIDB4NjU0QSwgMHgxQ0JFLCAweDY1NEYsIDB4MEFCRCwgMHg2NTUxLCAweDBBQjksIDB4NjU1MywKKyAgICAweDFGMEMsIDB4NjU1NCwgMHgwQUMwLCAweDY1NTUsIDB4MEFCRiwgMHg2NTU2LCAweDBBQjgsIDB4NjU1NywgMHgwQUJCLAorICAgIDB4NjU1OCwgMHgwQUJFLCAweDY1NTksIDB4MEFCQSwgMHg2NTVDLCAweDIxNzAsIDB4NjU1RCwgMHgwQUI3LCAweDY1NUUsCisgICAgMHgwQzcwLCAweDY1NjIsIDB4MEM3MiwgMHg2NTYzLCAweDBDNzMsIDB4NjU2NCwgMHgyMTZGLCAweDY1NjUsIDB4MjE3MiwKKyAgICAweDY1NjYsIDB4MEM3MSwgMHg2NTY3LCAweDIxNkQsIDB4NjU2OCwgMHgyMTcxLCAweDY1NkEsIDB4MjE2RSwgMHg2NTZDLAorICAgIDB4MEUyQiwgMHg2NTZGLCAweDI0MDksIDB4NjU3MiwgMHgwRkU3LCAweDY1NzMsIDB4MjZCNCwgMHg2NTc0LCAweDEyQzYsCisgICAgMHg2NTc1LCAweDExNkUsIDB4NjU3NiwgMHgyOEYxLCAweDY1NzcsIDB4MTE2RiwgMHg2NTc4LCAweDExNzAsIDB4NjU3OSwKKyAgICAweDI4RjMsIDB4NjU3QSwgMHgyOEYyLCAweDY1N0IsIDB4MjhGNCwgMHg2NTdDLCAweDJCNUIsIDB4NjU3RiwgMHgyQjVBLAorICAgIDB4NjU4MCwgMHgyRDZGLCAweDY1ODEsIDB4MkQ2RSwgMHg2NTgyLCAweDEzRTEsIDB4NjU4MywgMHgxM0UyLCAweDY1ODQsCisgICAgMHgzMDk2LCAweDY1ODcsIDB4MDJENiwgMHg2NThDLCAweDIxNzMsIDB4NjU5MCwgMHgwQzc1LCAweDY1OTEsIDB4MEM3NCwKKyAgICAweDY1OTIsIDB4MjQwQSwgMHg2NTk0LCAweDJGMkYsIDB4NjU5NSwgMHgxNjc0LCAweDY1OTYsIDB4MzQxQywgMHg2NTk3LAorICAgIDB4MDJENywgMHg2NTk5LCAweDA4RDgsIDB4NjU5QiwgMHgwQUMyLCAweDY1OUMsIDB4MEFDMSwgMHg2NTlELCAweDIxNzQsCisgICAgMHg2NTlFLCAweDIxNzUsIDB4NjU5RiwgMHgwRTJDLCAweDY1QTAsIDB4MjZCNSwgMHg2NUExLCAweDBGRTgsIDB4NjVBMiwKKyAgICAweDJCNUMsIDB4NjVBNCwgMHgwMkQ4LCAweDY1QTUsIDB4MDM0NiwgMHg2NUE3LCAweDA1RjQsIDB4NjVBOCwgMHgxOUEyLAorICAgIDB4NjVBQSwgMHgxQjAzLCAweDY1QUIsIDB4MDc0MywgMHg2NUFDLCAweDBBQzMsIDB4NjVBRSwgMHgyMTc2LCAweDY1QUYsCisgICAgMHgwQzc2LCAweDY1QjAsIDB4MEUyRCwgMHg2NUIyLCAweDI4RjUsIDB4NjVCMywgMHgyOEY2LCAweDY1QjYsIDB4MkQ3MCwKKyAgICAweDY1QjcsIDB4MTREOSwgMHg2NUI4LCAweDM0Q0IsIDB4NjVCOSwgMHgwMkQ5LCAweDY1QkIsIDB4MTlBMywgMHg2NUJDLAorICAgIDB4MDVGNSwgMHg2NUJELCAweDA3NDQsIDB4NjVCRiwgMHgxQjA0LCAweDY1QzEsIDB4MDhEOSwgMHg2NUMyLCAweDFDQzMsCisgICAgMHg2NUMzLCAweDFDQzEsIDB4NjVDNCwgMHgxQ0MyLCAweDY1QzUsIDB4MDhEQSwgMHg2NUM2LCAweDFDQzAsIDB4NjVDQiwKKyAgICAweDBBQzUsIDB4NjVDQywgMHgwQUM2LCAweDY1Q0QsIDB4MUYwRCwgMHg2NUNFLCAweDBBQzcsIDB4NjVDRiwgMHgwQUM0LAorICAgIDB4NjVEMCwgMHgyMTc3LCAweDY1RDIsIDB4MjE3OCwgMHg2NUQzLCAweDI0MEIsIDB4NjVENiwgMHgwRkVBLCAweDY1RDcsCisgICAgMHgwRkU5LCAweDY1REEsIDB4MkQ3MSwgMHg2NURCLCAweDJGMzAsIDB4NjVERCwgMHgzMDk4LCAweDY1REUsIDB4MzA5NywKKyAgICAweDY1REYsIDB4MzFEOCwgMHg2NUUwLCAweDAyMkQsIDB4NjVFMSwgMHgxNzg5LCAweDY1RTIsIDB4MDc0NSwgMHg2NUU1LAorICAgIDB4MDJEQSwgMHg2NUU2LCAweDAzNDcsIDB4NjVFOCwgMHgwM0Q5LCAweDY1RTksIDB4MDNEOCwgMHg2NUVDLCAweDAzREEsCisgICAgMHg2NUVELCAweDAzREIsIDB4NjVFRSwgMHgxN0Y4LCAweDY1RUYsIDB4MTdGNywgMHg2NUYwLCAweDE4OUUsIDB4NjVGMSwKKyAgICAweDA0QkEsIDB4NjVGMiwgMHgxOEExLCAweDY1RjMsIDB4MThBMCwgMHg2NUY0LCAweDE4OUYsIDB4NjVGNSwgMHgxOEEyLAorICAgIDB4NjVGQSwgMHgwNUY2LCAweDY1RkIsIDB4MTlBOSwgMHg2NUZDLCAweDE5QTUsIDB4NjVGRCwgMHgxOUFFLCAweDY2MDAsCisgICAgMHgwNUZELCAweDY2MDIsIDB4MDVGQiwgMHg2NjAzLCAweDE5QUEsIDB4NjYwNCwgMHgxOUE2LCAweDY2MDUsIDB4MTlBRCwKKyAgICAweDY2MDYsIDB4MDVGQSwgMHg2NjA3LCAweDA2MDEsIDB4NjYwOCwgMHgxOUE4LCAweDY2MDksIDB4MTlBNCwgMHg2NjBBLAorICAgIDB4MDYwMCwgMHg2NjBCLCAweDE5QUIsIDB4NjYwQywgMHgwNUY5LCAweDY2MEQsIDB4MTlBQywgMHg2NjBFLCAweDA1RkMsCisgICAgMHg2NjBGLCAweDA1RkUsIDB4NjYxMCwgMHgxOUIwLCAweDY2MTEsIDB4MTlBRiwgMHg2NjEyLCAweDE5QTcsIDB4NjYxMywKKyAgICAweDA1RjgsIDB4NjYxNCwgMHgwNUY3LCAweDY2MTUsIDB4MDVGRiwgMHg2NjFDLCAweDFCMDksIDB4NjYxRCwgMHgxQjBGLAorICAgIDB4NjYxRiwgMHgwNzRCLCAweDY2MjAsIDB4MDc0OCwgMHg2NjIxLCAweDFCMDYsIDB4NjYyMiwgMHgxQjBCLCAweDY2MjQsCisgICAgMHgwNzRFLCAweDY2MjUsIDB4MDc0NiwgMHg2NjI2LCAweDFCMEEsIDB4NjYyNywgMHgwNzQ5LCAweDY2MjgsIDB4MDc0QywKKyAgICAweDY2MkIsIDB4MUIwRCwgMHg2NjJELCAweDA3NDcsIDB4NjYyRSwgMHgxQjEyLCAweDY2MkYsIDB4MDc0QSwgMHg2NjMxLAorICAgIDB4MDc0RCwgMHg2NjMyLCAweDFCMDcsIDB4NjYzMywgMHgxQjBDLCAweDY2MzQsIDB4MUIxMCwgMHg2NjM1LCAweDFCMDgsCisgICAgMHg2NjM2LCAweDFCMDUsIDB4NjYzOSwgMHgxQjExLCAweDY2M0EsIDB4MUIwRSwgMHg2NjQxLCAweDA4RTIsIDB4NjY0MiwKKyAgICAweDA4REIsIDB4NjY0MywgMHgwOERFLCAweDY2NDUsIDB4MDhFMSwgMHg2NjQ3LCAweDFDQzYsIDB4NjY0OSwgMHgwOERDLAorICAgIDB4NjY0QSwgMHgxQ0M0LCAweDY2NEMsIDB4MDhFMCwgMHg2NjRGLCAweDA4REQsIDB4NjY1MSwgMHgxQ0M3LCAweDY2NTIsCisgICAgMHgwOERGLCAweDY2NTksIDB4MUYxMSwgMHg2NjVBLCAweDBBQzksIDB4NjY1QiwgMHgxRjEwLCAweDY2NUMsIDB4MUYxMiwKKyAgICAweDY2NUQsIDB4MEFDOCwgMHg2NjVFLCAweDBBQ0QsIDB4NjY1RiwgMHgxQ0M1LCAweDY2NjEsIDB4MUYwRiwgMHg2NjYyLAorICAgIDB4MUYxMywgMHg2NjY0LCAweDBBQ0EsIDB4NjY2NSwgMHgxRjBFLCAweDY2NjYsIDB4MEFDQywgMHg2NjY4LCAweDBBQ0IsCisgICAgMHg2NjZBLCAweDIxN0YsIDB4NjY2QywgMHgyMTdBLCAweDY2NkUsIDB4MEM3NywgMHg2NjZGLCAweDBDN0IsIDB4NjY3MCwKKyAgICAweDBDNzgsIDB4NjY3MSwgMHgyMTdELCAweDY2NzIsIDB4MjE4MCwgMHg2Njc0LCAweDBDNzksIDB4NjY3NiwgMHgwQzdBLAorICAgIDB4NjY3NywgMHgwQzdGLCAweDY2NzgsIDB4MjQxNCwgMHg2Njc5LCAweDIxN0UsIDB4NjY3QSwgMHgwQzdELCAweDY2N0IsCisgICAgMHgyMTdCLCAweDY2N0MsIDB4MjE3OSwgMHg2NjdFLCAweDBDN0UsIDB4NjY4MCwgMHgyMTdDLCAweDY2ODQsIDB4MEUzMywKKyAgICAweDY2ODYsIDB4MjQwQywgMHg2Njg3LCAweDBFMzAsIDB4NjY4OCwgMHgwRTMxLCAweDY2ODksIDB4MEUyRiwgMHg2NjhBLAorICAgIDB4MjQxMSwgMHg2NjhCLCAweDI0MTAsIDB4NjY4QywgMHgyNDBELCAweDY2OEQsIDB4MEUzNSwgMHg2NjkwLCAweDI0MEYsCisgICAgMHg2NjkxLCAweDBDN0MsIDB4NjY5NCwgMHgyNDEzLCAweDY2OTUsIDB4MjQwRSwgMHg2Njk2LCAweDBFMzIsIDB4NjY5NywKKyAgICAweDBFMkUsIDB4NjY5OCwgMHgwRTM0LCAweDY2OTksIDB4MjQxMiwgMHg2NjlELCAweDBGRUQsIDB4NjY5RiwgMHgyNkI4LAorICAgIDB4NjZBMCwgMHgyNkI3LCAweDY2QTEsIDB4MjZCNiwgMHg2NkEyLCAweDBGRUIsIDB4NjZBOCwgMHgwRkVDLCAweDY2QTksCisgICAgMHgyOEY5LCAweDY2QUEsIDB4MjhGQywgMHg2NkFCLCAweDExNzIsIDB4NjZBRSwgMHgxMTcxLCAweDY2QUYsIDB4MjhGRCwKKyAgICAweDY2QjAsIDB4MjhGOCwgMHg2NkIxLCAweDExNzQsIDB4NjZCMiwgMHgyOEZBLCAweDY2QjQsIDB4MTE3MywgMHg2NkI1LAorICAgIDB4MjhGNywgMHg2NkI3LCAweDI4RkIsIDB4NjZCOCwgMHgxMkNDLCAweDY2QjksIDB4MTJDOSwgMHg2NkJBLCAweDJCNjUsCisgICAgMHg2NkJCLCAweDJCNjQsIDB4NjZCRCwgMHgyQjYzLCAweDY2QkUsIDB4MkI1RSwgMHg2NkMwLCAweDJCNUYsIDB4NjZDNCwKKyAgICAweDEyQ0EsIDB4NjZDNiwgMHgxMkM3LCAweDY2QzcsIDB4MTJDQiwgMHg2NkM4LCAweDJCNUQsIDB4NjZDOSwgMHgxMkM4LAorICAgIDB4NjZDQSwgMHgyQjYwLCAweDY2Q0IsIDB4MkI2MSwgMHg2NkNDLCAweDJCNjYsIDB4NjZDRiwgMHgyQjYyLCAweDY2RDIsCisgICAgMHgyRDcyLCAweDY2RDYsIDB4MTNFNCwgMHg2NkQ4LCAweDJGMzMsIDB4NjZEOSwgMHgxM0UzLCAweDY2REEsIDB4MkYzMSwKKyAgICAweDY2REIsIDB4MkYzMiwgMHg2NkRDLCAweDE0REEsIDB4NjZERCwgMHgxNTg1LCAweDY2REUsIDB4MzA5OSwgMHg2NkUwLAorICAgIDB4MTU4NCwgMHg2NkUzLCAweDMxREEsIDB4NjZFNCwgMHgzMURCLCAweDY2RTYsIDB4MTYxOSwgMHg2NkU4LCAweDMxRDksCisgICAgMHg2NkU5LCAweDE2NzUsIDB4NjZFQiwgMHgzNDFELCAweDY2RUMsIDB4MTZGQywgMHg2NkVELCAweDM0ODUsIDB4NjZFRSwKKyAgICAweDM0ODYsIDB4NjZGMCwgMHgwMkRCLCAweDY2RjIsIDB4MDNEQywgMHg2NkYzLCAweDAzREQsIDB4NjZGNCwgMHgwNEJCLAorICAgIDB4NjZGNiwgMHgxOUIxLCAweDY2RjcsIDB4MDc0RiwgMHg2NkY4LCAweDA4RTMsIDB4NjZGOSwgMHgwQUNFLCAweDY2RkMsCisgICAgMHgwQTFGLCAweDY2RkUsIDB4MEM4MCwgMHg2NkZGLCAweDBDODEsIDB4NjcwMCwgMHgwQkYwLCAweDY3MDEsIDB4MjE4MSwKKyAgICAweDY3MDMsIDB4MEUzNiwgMHg2NzA0LCAweDI2QkEsIDB4NjcwNSwgMHgyNkI5LCAweDY3MDgsIDB4MDJEQywgMHg2NzA5LAorICAgIDB4MDNERSwgMHg2NzBBLCAweDE5QjIsIDB4NjcwQiwgMHgwNjAzLCAweDY3MEQsIDB4MDYwMiwgMHg2NzBGLCAweDFCMTMsCisgICAgMHg2NzEwLCAweDFCMTQsIDB4NjcxMiwgMHgxQ0M4LCAweDY3MTMsIDB4MUNDOSwgMHg2NzE0LCAweDA4RTQsIDB4NjcxNSwKKyAgICAweDA4RTUsIDB4NjcxNywgMHgwOEU2LCAweDY3MTgsIDB4MUYxNCwgMHg2NzFCLCAweDBBRDAsIDB4NjcxRCwgMHgwQzgzLAorICAgIDB4NjcxRiwgMHgwQzgyLCAweDY3MjAsIDB4MjQxNSwgMHg2NzIxLCAweDI1MjIsIDB4NjcyMiwgMHgyNkJCLCAweDY3MjMsCisgICAgMHgyQjY3LCAweDY3MjYsIDB4MTREQiwgMHg2NzI3LCAweDE2MUEsIDB4NjcyOCwgMHgwMkRELCAweDY3MkEsIDB4MDM0QSwKKyAgICAweDY3MkIsIDB4MDM0QiwgMHg2NzJDLCAweDAzNDksIDB4NjcyRCwgMHgwMzRDLCAweDY3MkUsIDB4MDM0OCwgMHg2NzMxLAorICAgIDB4MDNFMSwgMHg2NzMzLCAweDE4MDAsIDB4NjczNCwgMHgwM0UwLCAweDY3MzUsIDB4MDNFMiwgMHg2NzM4LCAweDE3RkIsCisgICAgMHg2NzM5LCAweDE3RkEsIDB4NjczQSwgMHgxN0ZELCAweDY3M0IsIDB4MTdGQywgMHg2NzNDLCAweDE3RkYsIDB4NjczRCwKKyAgICAweDAzREYsIDB4NjczRSwgMHgxN0Y5LCAweDY3M0YsIDB4MTdGRSwgMHg2NzQ1LCAweDE4QTMsIDB4Njc0NiwgMHgwNEM1LAorICAgIDB4Njc0NywgMHgxOEE0LCAweDY3NDgsIDB4MThBOCwgMHg2NzQ5LCAweDA0QzQsIDB4Njc0QiwgMHgxOEFDLCAweDY3NEMsCisgICAgMHgxOEE3LCAweDY3NEQsIDB4MThBQSwgMHg2NzRFLCAweDA0QkQsIDB4Njc0RiwgMHgwNEJFLCAweDY3NTAsIDB4MDRCRiwKKyAgICAweDY3NTEsIDB4MDRDMCwgMHg2NzUzLCAweDA0QzcsIDB4Njc1NSwgMHgxOEE2LCAweDY3NTYsIDB4MDRDMiwgMHg2NzU3LAorICAgIDB4MDRDOCwgMHg2NzU5LCAweDE4QTUsIDB4Njc1QSwgMHgxOEFCLCAweDY3NUMsIDB4MDRDMSwgMHg2NzVELCAweDE4QTksCisgICAgMHg2NzVFLCAweDA0QzMsIDB4Njc1RiwgMHgwNEJDLCAweDY3NjAsIDB4MDRDNiwgMHg2NzZBLCAweDA2MTgsIDB4Njc2QywKKyAgICAweDE5QjQsIDB4Njc2RCwgMHgwNjA0LCAweDY3NkYsIDB4MDYwRSwgMHg2NzcwLCAweDA2MEYsIDB4Njc3MSwgMHgwNjA3LAorICAgIDB4Njc3MiwgMHgwNjE5LCAweDY3NzMsIDB4MDYwOSwgMHg2Nzc0LCAweDE5QkMsIDB4Njc3NSwgMHgwNjE0LCAweDY3NzYsCisgICAgMHgxOUI3LCAweDY3NzcsIDB4MDYwQSwgMHg2Nzc4LCAweDE5QzYsIDB4Njc3OSwgMHgxOUM3LCAweDY3N0EsIDB4MTlCRiwKKyAgICAweDY3N0IsIDB4MTlCOCwgMHg2NzdDLCAweDA2MTcsIDB4Njc3RCwgMHgxOUM0LCAweDY3N0UsIDB4MDYxMiwgMHg2NzdGLAorICAgIDB4MDYxMCwgMHg2NzgxLCAweDE5QzUsIDB4Njc4MywgMHgxOUMzLCAweDY3ODQsIDB4MTlCQiwgMHg2Nzg1LCAweDE5QjMsCisgICAgMHg2Nzg2LCAweDE5QkEsIDB4Njc4NywgMHgwNjBCLCAweDY3ODksIDB4MDYxMSwgMHg2NzhCLCAweDA2MDUsIDB4Njc4QywKKyAgICAweDE5QkUsIDB4Njc4RCwgMHgxOUJELCAweDY3OEUsIDB4MTlCNSwgMHg2NzkwLCAweDA2MTMsIDB4Njc5MSwgMHgxOUMxLAorICAgIDB4Njc5MiwgMHgxOUI2LCAweDY3OTMsIDB4MDYxNiwgMHg2Nzk0LCAweDE5QzgsIDB4Njc5NSwgMHgwNjA2LCAweDY3OTcsCisgICAgMHgwNjBELCAweDY3OTgsIDB4MTlCOSwgMHg2Nzk5LCAweDE5QzIsIDB4Njc5QSwgMHgwNjE1LCAweDY3OUMsIDB4MDYwOCwKKyAgICAweDY3OUQsIDB4MDYwQywgMHg2NzlGLCAweDE5QzAsIDB4NjdBRSwgMHgxQjM0LCAweDY3QUYsIDB4MDc1NywgMHg2N0IwLAorICAgIDB4MDc2NCwgMHg2N0IyLCAweDFCMkYsIDB4NjdCMywgMHgxQjI1LCAweDY3QjQsIDB4MDc1RCwgMHg2N0I1LCAweDFCMjMsCisgICAgMHg2N0I2LCAweDA3NTYsIDB4NjdCNywgMHgxQjFFLCAweDY3QjgsIDB4MDc2MCwgMHg2N0I5LCAweDFCMkIsIDB4NjdCQSwKKyAgICAweDFCMTgsIDB4NjdCQiwgMHgxQjFBLCAweDY3QzAsIDB4MUIxRCwgMHg2N0MxLCAweDFCMTUsIDB4NjdDMiwgMHgxQjJBLAorICAgIDB4NjdDMywgMHgxQjNBLCAweDY3QzQsIDB4MDc1QiwgMHg2N0M1LCAweDFCMUYsIDB4NjdDNiwgMHgxQjMxLCAweDY3QzgsCisgICAgMHgxQjE3LCAweDY3QzksIDB4MUIzOCwgMHg2N0NBLCAweDFCMzksIDB4NjdDQiwgMHgxQjNDLCAweDY3Q0MsIDB4MUIzMywKKyAgICAweDY3Q0QsIDB4MUIyNCwgMHg2N0NFLCAweDFCMkMsIDB4NjdDRiwgMHgwNzYxLCAweDY3RDAsIDB4MDc1NCwgMHg2N0QxLAorICAgIDB4MDc1QywgMHg2N0QyLCAweDA3NjgsIDB4NjdEMywgMHgwNzUxLCAweDY3RDQsIDB4MDc1MywgMHg2N0Q4LCAweDFCMUMsCisgICAgMHg2N0Q5LCAweDA3NjUsIDB4NjdEQSwgMHgwNzVFLCAweDY3REIsIDB4MUIzNiwgMHg2N0RDLCAweDFCMTksIDB4NjdERCwKKyAgICAweDA3NjcsIDB4NjdERSwgMHgwNzYyLCAweDY3REYsIDB4MUIyMiwgMHg2N0UyLCAweDA3NjYsIDB4NjdFMywgMHgxQjI5LAorICAgIDB4NjdFNCwgMHgxQjIxLCAweDY3RTUsIDB4MDc1RiwgMHg2N0U2LCAweDFCMzUsIDB4NjdFNywgMHgxQjJELCAweDY3RTksCisgICAgMHgwNzU5LCAweDY3RUEsIDB4MUIzQiwgMHg2N0VCLCAweDFCMjAsIDB4NjdFQywgMHgwNzU1LCAweDY3RUQsIDB4MUIzMiwKKyAgICAweDY3RUUsIDB4MUIyOCwgMHg2N0VGLCAweDA3NUEsIDB4NjdGMCwgMHgxQjJFLCAweDY3RjEsIDB4MDc1MiwgMHg2N0YyLAorICAgIDB4MUIxNiwgMHg2N0YzLCAweDA3NjMsIDB4NjdGNCwgMHgwOEY1LCAweDY3RjUsIDB4MDc1OCwgMHg2N0Y2LCAweDFCMjcsCisgICAgMHg2N0Y3LCAweDFCMjYsIDB4NjdGOCwgMHgxQjFCLCAweDY3RkEsIDB4MUIzNywgMHg2N0ZDLCAweDFCMzAsIDB4NjdGRiwKKyAgICAweDA3NTAsIDB4NjgxMiwgMHgxQ0RELCAweDY4MTMsIDB4MDhGQywgMHg2ODE0LCAweDFDREUsIDB4NjgxNiwgMHgxQ0QyLAorICAgIDB4NjgxNywgMHgwOEYxLCAweDY4MTgsIDB4MDhGRCwgMHg2ODFBLCAweDFDQ0IsIDB4NjgxQywgMHgxQ0Q0LCAweDY4MUQsCisgICAgMHgxQ0RDLCAweDY4MUYsIDB4MUNDQSwgMHg2ODIwLCAweDFDRTUsIDB4NjgyMSwgMHgwOEU3LCAweDY4MjUsIDB4MUNFNCwKKyAgICAweDY4MjYsIDB4MUNERiwgMHg2ODI4LCAweDFDRTAsIDB4NjgyOSwgMHgwOEVGLCAweDY4MkEsIDB4MDhGQSwgMHg2ODJCLAorICAgIDB4MUNENiwgMHg2ODJELCAweDFDRDcsIDB4NjgyRSwgMHgxQ0UxLCAweDY4MkYsIDB4MUNEOCwgMHg2ODMxLCAweDFDRDMsCisgICAgMHg2ODMyLCAweDFDQ0QsIDB4NjgzMywgMHgxQ0NFLCAweDY4MzQsIDB4MUNEQiwgMHg2ODM1LCAweDFDRDUsIDB4NjgzOCwKKyAgICAweDA4RTgsIDB4NjgzOSwgMHgwOEVDLCAweDY4M0EsIDB4MUNFMywgMHg2ODNCLCAweDFDQ0YsIDB4NjgzQywgMHgwOEY4LAorICAgIDB4NjgzRCwgMHgwOEY0LCAweDY4NDAsIDB4MDhGNywgMHg2ODQxLCAweDA4RkUsIDB4Njg0MiwgMHgwOEVELCAweDY4NDMsCisgICAgMHgwOEY5LCAweDY4NDQsIDB4MUNEQSwgMHg2ODQ1LCAweDA4RkIsIDB4Njg0NiwgMHgwOEVBLCAweDY4NDgsIDB4MDhFOSwKKyAgICAweDY4NDksIDB4MUNDQywgMHg2ODRCLCAweDFDRDAsIDB4Njg0QywgMHgwOEYyLCAweDY4NEQsIDB4MUNFMiwgMHg2ODRFLAorICAgIDB4MUNEOSwgMHg2ODRGLCAweDFDRDEsIDB4Njg1MCwgMHgwOEY2LCAweDY4NTEsIDB4MDhGMywgMHg2ODUzLCAweDA4RUIsCisgICAgMHg2ODU0LCAweDA4RUUsIDB4Njg2QiwgMHgxRjI5LCAweDY4NkQsIDB4MUYxOSwgMHg2ODZFLCAweDFGMUEsIDB4Njg2RiwKKyAgICAweDFGMUUsIDB4Njg3MSwgMHgxRjJELCAweDY4NzIsIDB4MUYyQSwgMHg2ODc0LCAweDFGMjMsIDB4Njg3NSwgMHgxRjIyLAorICAgIDB4Njg3NiwgMHgwQUQ3LCAweDY4NzcsIDB4MUYyNiwgMHg2ODc4LCAweDFGMzUsIDB4Njg3OSwgMHgxRjE1LCAweDY4N0IsCisgICAgMHgxRjM2LCAweDY4N0MsIDB4MUYyOCwgMHg2ODdELCAweDFGM0EsIDB4Njg3RSwgMHgxRjJFLCAweDY4N0YsIDB4MEFENiwKKyAgICAweDY4ODAsIDB4MUYyQywgMHg2ODgxLCAweDBBRDEsIDB4Njg4MiwgMHgwQUU2LCAweDY4ODMsIDB4MEFEQywgMHg2ODg1LAorICAgIDB4MEFFMCwgMHg2ODg2LCAweDBBREYsIDB4Njg4NywgMHgxRjE2LCAweDY4ODksIDB4MUYzMywgMHg2ODhBLCAweDFGMzksCisgICAgMHg2ODhCLCAweDFGMzEsIDB4Njg4QywgMHgxRjM4LCAweDY4OEYsIDB4MUYyNSwgMHg2ODkwLCAweDFGMTcsIDB4Njg5MSwKKyAgICAweDFGMzcsIDB4Njg5MiwgMHgxRjI3LCAweDY4OTMsIDB4MEFENCwgMHg2ODk0LCAweDBBRTEsIDB4Njg5NiwgMHgxRjMwLAorICAgIDB4Njg5NywgMHgwQURBLCAweDY4OUIsIDB4MUYyRiwgMHg2ODlDLCAweDFGMTgsIDB4Njg5RCwgMHgwQUUyLCAweDY4OUYsCisgICAgMHgwQUU0LCAweDY4QTAsIDB4MUYzMiwgMHg2OEExLCAweDBBRTUsIDB4NjhBMiwgMHgwQUQzLCAweDY4QTMsIDB4MUYxRiwKKyAgICAweDY4QTQsIDB4MUYzNCwgMHg2OEE3LCAweDBBRDksIDB4NjhBOCwgMHgwQUUzLCAweDY4QTksIDB4MUYyMSwgMHg2OEFBLAorICAgIDB4MUYyQiwgMHg2OEFCLCAweDFGMUMsIDB4NjhBQywgMHgxRjIwLCAweDY4QUQsIDB4MEFERSwgMHg2OEFFLCAweDFGMUIsCisgICAgMHg2OEFGLCAweDBBRDIsIDB4NjhCMCwgMHgwQURCLCAweDY4QjEsIDB4MEFEOCwgMHg2OEIyLCAweDFGMjQsIDB4NjhCMywKKyAgICAweDA4RjAsIDB4NjhCNCwgMHgyMTk4LCAweDY4QjUsIDB4MEFENSwgMHg2OEM0LCAweDBBREQsIDB4NjhDNiwgMHgyMTlCLAorICAgIDB4NjhDNywgMHgyMUIxLCAweDY4QzgsIDB4MjFBNiwgMHg2OEM5LCAweDBDOTcsIDB4NjhDQiwgMHgwQzkyLCAweDY4Q0MsCisgICAgMHgyMTk1LCAweDY4Q0QsIDB4MEM5MywgMHg2OENFLCAweDIxQTUsIDB4NjhEMCwgMHgyMTlFLCAweDY4RDEsIDB4MjFBQiwKKyAgICAweDY4RDIsIDB4MEM4RiwgMHg2OEQzLCAweDIxODMsIDB4NjhENCwgMHgyMUFELCAweDY4RDUsIDB4MEM4NSwgMHg2OEQ2LAorICAgIDB4MjE4QiwgMHg2OEQ3LCAweDBDODgsIDB4NjhEOCwgMHgwQzg3LCAweDY4REEsIDB4MEM5OCwgMHg2OERDLCAweDIxODUsCisgICAgMHg2OERELCAweDIxQTcsIDB4NjhERSwgMHgyMUE4LCAweDY4REYsIDB4MEM4QSwgMHg2OEUwLCAweDBDODYsIDB4NjhFMSwKKyAgICAweDIxOTMsIDB4NjhFMywgMHgwQzkxLCAweDY4RTQsIDB4MjE4RSwgMHg2OEU2LCAweDIxQTksIDB4NjhFNywgMHgwQzhELAorICAgIDB4NjhFOCwgMHgyMUExLCAweDY4RTksIDB4MjFBRSwgMHg2OEVBLCAweDIxODgsIDB4NjhFQiwgMHgyMThELCAweDY4RUMsCisgICAgMHgyMTg3LCAweDY4RUUsIDB4MEM4QywgMHg2OEVGLCAweDIxOUEsIDB4NjhGMCwgMHgyNDJCLCAweDY4RjEsIDB4MjE4OSwKKyAgICAweDY4RjIsIDB4MEM5MCwgMHg2OEYzLCAweDIxOTIsIDB4NjhGNCwgMHgyMUFBLCAweDY4RjUsIDB4MEM4QiwgMHg2OEY2LAorICAgIDB4MjE4RiwgMHg2OEY3LCAweDIxOEMsIDB4NjhGOCwgMHgyMTlELCAweDY4RjksIDB4MEM4RSwgMHg2OEZBLCAweDBDODQsCisgICAgMHg2OEZCLCAweDBDOUEsIDB4NjhGQywgMHgyMUEwLCAweDY4RkQsIDB4MjE5RiwgMHg2OTA0LCAweDIxODQsIDB4NjkwNSwKKyAgICAweDBDODksIDB4NjkwNiwgMHgyMUFDLCAweDY5MDcsIDB4MjE5NCwgMHg2OTA4LCAweDIxOTYsIDB4NjkwQSwgMHgyMUEzLAorICAgIDB4NjkwQiwgMHgyMUEyLCAweDY5MEMsIDB4MjE4MiwgMHg2OTBELCAweDBDOTQsIDB4NjkwRSwgMHgwQzk2LCAweDY5MEYsCisgICAgMHgyMThBLCAweDY5MTAsIDB4MjE5MSwgMHg2OTExLCAweDIxOTksIDB4NjkxMiwgMHgwQzk1LCAweDY5MTMsIDB4MjE5MCwKKyAgICAweDY5MTQsIDB4MjE5QywgMHg2OTE1LCAweDIxQUYsIDB4NjkxNywgMHgyMUE0LCAweDY5MjUsIDB4MjFCMCwgMHg2OTJBLAorICAgIDB4MjE4NiwgMHg2OTJGLCAweDI0M0YsIDB4NjkzMCwgMHgwRTNFLCAweDY5MzIsIDB4MjQzRCwgMHg2OTMzLCAweDI0MjgsCisgICAgMHg2OTM0LCAweDI0MkQsIDB4NjkzNSwgMHgyNDI2LCAweDY5MzcsIDB4MjQzOSwgMHg2OTM4LCAweDI0MTgsIDB4NjkzOSwKKyAgICAweDI0MUYsIDB4NjkzQiwgMHgyNDM3LCAweDY5M0MsIDB4MjQ0MSwgMHg2OTNELCAweDI0MjksIDB4NjkzRiwgMHgyNDFDLAorICAgIDB4Njk0MCwgMHgyNDJGLCAweDY5NDEsIDB4MjQzNCwgMHg2OTQyLCAweDI0MjAsIDB4Njk0NCwgMHgyNDMxLCAweDY5NDUsCisgICAgMHgyNDFELCAweDY5NDgsIDB4MjQyNCwgMHg2OTQ5LCAweDI0MjUsIDB4Njk0QSwgMHgwRTQwLCAweDY5NEIsIDB4MjQzOCwKKyAgICAweDY5NEMsIDB4MjQzNiwgMHg2OTRFLCAweDI0MTksIDB4Njk0RiwgMHgyNDNCLCAweDY5NTEsIDB4MjQzQywgMHg2OTUyLAorICAgIDB4MjQzRSwgMHg2OTUzLCAweDBFNDQsIDB4Njk1NCwgMHgwRTNDLCAweDY5NTYsIDB4MUYxRCwgMHg2OTU3LCAweDI0MjEsCisgICAgMHg2OTU4LCAweDI0MzMsIDB4Njk1OSwgMHgyNDIyLCAweDY5NUEsIDB4MEUzOSwgMHg2OTVCLCAweDBFNDksIDB4Njk1QywKKyAgICAweDI0M0EsIDB4Njk1RCwgMHgwRTQ3LCAweDY5NUUsIDB4MEU0MywgMHg2OTVGLCAweDI0MTcsIDB4Njk2MCwgMHgwRTNCLAorICAgIDB4Njk2MiwgMHgyNDFBLCAweDY5NjMsIDB4MEU0OCwgMHg2OTY1LCAweDI0MkEsIDB4Njk2NiwgMHgyNDE2LCAweDY5NjgsCisgICAgMHgwRTQxLCAweDY5NjksIDB4MjQyRSwgMHg2OTZBLCAweDI0MUUsIDB4Njk2QiwgMHgwRTQyLCAweDY5NkMsIDB4MjQyNywKKyAgICAweDY5NkQsIDB4MEUzOCwgMHg2OTZFLCAweDBDOTksIDB4Njk2RiwgMHgyNDMwLCAweDY5NzAsIDB4MjE5NywgMHg2OTcxLAorICAgIDB4MjQxQiwgMHg2OTc0LCAweDI0MzUsIDB4Njk3NSwgMHgwRTNELCAweDY5NzYsIDB4MjQzMiwgMHg2OTc3LCAweDBFM0EsCisgICAgMHg2OTc4LCAweDI0MkMsIDB4Njk3OSwgMHgwRTQ1LCAweDY5N0EsIDB4MjQyMywgMHg2OTdCLCAweDI0NDAsIDB4Njk4MiwKKyAgICAweDBFM0YsIDB4Njk4MywgMHgyNEFGLCAweDY5ODYsIDB4MEU0NiwgMHg2OThELCAweDI2QzksIDB4Njk4RSwgMHgyNkM3LAorICAgIDB4Njk5MCwgMHgyNkRELCAweDY5OTEsIDB4MjZDNSwgMHg2OTkzLCAweDI2RDcsIDB4Njk5NCwgMHgwRTM3LCAweDY5OTUsCisgICAgMHgwRkYwLCAweDY5OTYsIDB4MjZDMSwgMHg2OTk3LCAweDI2REMsIDB4Njk5OSwgMHgyNkM2LCAweDY5OUEsIDB4MjZENCwKKyAgICAweDY5OUIsIDB4MEZGNSwgMHg2OTlDLCAweDBGRUUsIDB4Njk5RSwgMHgyNkRBLCAweDY5QTAsIDB4MjZCRiwgMHg2OUExLAorICAgIDB4MjZEOSwgMHg2OUEzLCAweDEwMDAsIDB4NjlBNCwgMHgyNkQwLCAweDY5QTUsIDB4MjZFMCwgMHg2OUE2LCAweDBGRkUsCisgICAgMHg2OUE3LCAweDI2QzgsIDB4NjlBOCwgMHgwRkVGLCAweDY5QTksIDB4MjZDQSwgMHg2OUFBLCAweDI2RDgsIDB4NjlBQiwKKyAgICAweDBGRjgsIDB4NjlBQywgMHgyNkMzLCAweDY5QUQsIDB4MEZGQywgMHg2OUFFLCAweDBGRjIsIDB4NjlBRiwgMHgyNkNDLAorICAgIDB4NjlCMCwgMHgyNkMyLCAweDY5QjEsIDB4MjZCQywgMHg2OUIzLCAweDI2RDYsIDB4NjlCNCwgMHgwRkY5LCAweDY5QjUsCisgICAgMHgyNkRGLCAweDY5QjYsIDB4MjZCRCwgMHg2OUI3LCAweDBGRjYsIDB4NjlCOSwgMHgyNkQyLCAweDY5QkIsIDB4MEZGNywKKyAgICAweDY5QkMsIDB4MjZDNCwgMHg2OUJELCAweDI2Q0YsIDB4NjlCRSwgMHgyNkNCLCAweDY5QkYsIDB4MjZDRCwgMHg2OUMxLAorICAgIDB4MEZGMSwgMHg2OUMyLCAweDI2REUsIDB4NjlDMywgMHgwRkZGLCAweDY5QzQsIDB4MjZDRSwgMHg2OUM2LCAweDI2RTEsCisgICAgMHg2OUM5LCAweDI2QkUsIDB4NjlDQSwgMHgyNkQzLCAweDY5Q0IsIDB4MEZGNCwgMHg2OUNDLCAweDBGRkQsIDB4NjlDRCwKKyAgICAweDBGRkIsIDB4NjlDRSwgMHgyNkMwLCAweDY5Q0YsIDB4MjZENSwgMHg2OUQwLCAweDBGRkEsIDB4NjlEMywgMHgwRkYzLAorICAgIDB4NjlENCwgMHgyNkQxLCAweDY5RDksIDB4MjZEQiwgMHg2OUUyLCAweDI5MDksIDB4NjlFNCwgMHgyOTA1LCAweDY5RTUsCisgICAgMHgyOTAxLCAweDY5RTYsIDB4MjkxNSwgMHg2OUU3LCAweDI5MTIsIDB4NjlFOCwgMHgxMTc3LCAweDY5RUIsIDB4MjkxOSwKKyAgICAweDY5RUMsIDB4MjkwOCwgMHg2OUVELCAweDExODIsIDB4NjlFRSwgMHgyOTBGLCAweDY5RjEsIDB4MjkwNCwgMHg2OUYyLAorICAgIDB4MjkwRSwgMHg2OUYzLCAweDExN0YsIDB4NjlGNCwgMHgyOTIyLCAweDY5RjYsIDB4MjkxRiwgMHg2OUY3LCAweDI5MTEsCisgICAgMHg2OUY4LCAweDI5MDIsIDB4NjlGQiwgMHgyOTE2LCAweDY5RkMsIDB4MjkxOCwgMHg2OUZELCAweDExN0IsIDB4NjlGRSwKKyAgICAweDI5MEMsIDB4NjlGRiwgMHgyOTA3LCAweDZBMDAsIDB4MjhGRSwgMHg2QTAxLCAweDExNzgsIDB4NkEwMiwgMHgxMTgwLAorICAgIDB4NkEwNCwgMHgyOTFCLCAweDZBMDUsIDB4MTE4MSwgMHg2QTA2LCAweDI4RkYsIDB4NkEwNywgMHgyOTIxLCAweDZBMDgsCisgICAgMHgyOTE0LCAweDZBMDksIDB4MjkxQSwgMHg2QTBBLCAweDExN0UsIDB4NkEwRCwgMHgyOTE3LCAweDZBMEYsIDB4MjkxRSwKKyAgICAweDZBMTEsIDB4MTE4MywgMHg2QTEzLCAweDExN0QsIDB4NkExNCwgMHgyOTEwLCAweDZBMTUsIDB4MjkwMywgMHg2QTE2LAorICAgIDB4MjkyMywgMHg2QTE3LCAweDI5MDAsIDB4NkExOCwgMHgyOTFDLCAweDZBMTksIDB4MTE3QSwgMHg2QTFCLCAweDI5MEEsCisgICAgMHg2QTFELCAweDI5MEIsIDB4NkExRSwgMHgxMTc5LCAweDZBMUYsIDB4MTE3NiwgMHg2QTIwLCAweDI5MDYsIDB4NkEyMSwKKyAgICAweDExN0MsIDB4NkEyMywgMHgxMTc1LCAweDZBMjUsIDB4MjkxRCwgMHg2QTI2LCAweDI5MjAsIDB4NkEyNywgMHgyOTBELAorICAgIDB4NkEyOCwgMHgyQjc0LCAweDZBMzIsIDB4MkI2QywgMHg2QTM0LCAweDJCNjgsIDB4NkEzNSwgMHgxMkQ5LCAweDZBMzgsCisgICAgMHgxMkNFLCAweDZBMzksIDB4MTJEMywgMHg2QTNBLCAweDEyQ0YsIDB4NkEzQiwgMHgyQjc2LCAweDZBM0MsIDB4MkI4MSwKKyAgICAweDZBM0QsIDB4MTJDRCwgMHg2QTNFLCAweDJCNkUsIDB4NkEzRiwgMHgyQjc3LCAweDZBNDAsIDB4MjkxMywgMHg2QTQxLAorICAgIDB4MkI3OCwgMHg2QTQ0LCAweDEyRDQsIDB4NkE0NiwgMHgyQjg3LCAweDZBNDcsIDB4MTJEOCwgMHg2QTQ4LCAweDEyREIsCisgICAgMHg2QTQ5LCAweDJCNkEsIDB4NkE0QiwgMHgxMkQ3LCAweDZBNEQsIDB4MkI4NSwgMHg2QTRFLCAweDJCODYsIDB4NkE0RiwKKyAgICAweDJCN0MsIDB4NkE1MCwgMHgyQjdCLCAweDZBNTEsIDB4MkI3MywgMHg2QTU0LCAweDJCN0QsIDB4NkE1NSwgMHgyQjg0LAorICAgIDB4NkE1NiwgMHgyQjgzLCAweDZBNTgsIDB4MTJEMiwgMHg2QTU5LCAweDEyRDAsIDB4NkE1QSwgMHgyQjc1LCAweDZBNUIsCisgICAgMHgyQjcyLCAweDZBNUQsIDB4MkI2RiwgMHg2QTVFLCAweDJCODIsIDB4NkE1RiwgMHgxMkRBLCAweDZBNjAsIDB4MkI4MCwKKyAgICAweDZBNjEsIDB4MTJENiwgMHg2QTYyLCAweDEyRDUsIDB4NkE2NCwgMHgyQjdBLCAweDZBNjYsIDB4MkI2OSwgMHg2QTY3LAorICAgIDB4MkI2QiwgMHg2QTY4LCAweDJCNkQsIDB4NkE2OSwgMHgyQjdGLCAweDZBNkEsIDB4MkI3OSwgMHg2QTZCLCAweDEyRDEsCisgICAgMHg2QTZELCAweDJCNzAsIDB4NkE2RiwgMHgyQjdFLCAweDZBNzYsIDB4MkI3MSwgMHg2QTdFLCAweDEzRUMsIDB4NkE3RiwKKyAgICAweDJEODQsIDB4NkE4MCwgMHgxM0U1LCAweDZBODEsIDB4MkQ3NSwgMHg2QTgzLCAweDJEODAsIDB4NkE4NCwgMHgxM0U3LAorICAgIDB4NkE4NSwgMHgyRDg3LCAweDZBODcsIDB4MkQ3QywgMHg2QTg5LCAweDJENzcsIDB4NkE4QywgMHgyRDg4LCAweDZBOEQsCisgICAgMHgyRDczLCAweDZBOEUsIDB4MkQ3RSwgMHg2QTkwLCAweDEzRUUsIDB4NkE5MSwgMHgyRDgzLCAweDZBOTIsIDB4MkQ4OSwKKyAgICAweDZBOTMsIDB4MkQ3RCwgMHg2QTk0LCAweDEzRTYsIDB4NkE5NSwgMHgyRDdGLCAweDZBOTYsIDB4MkQ3NCwgMHg2QTk3LAorICAgIDB4MTNFRCwgMHg2QTlBLCAweDJEODYsIDB4NkE5QiwgMHgyRDc5LCAweDZBOUMsIDB4MTNFOSwgMHg2QTlFLCAweDJEN0IsCisgICAgMHg2QTlGLCAweDJENzgsIDB4NkFBMCwgMHgxM0VGLCAweDZBQTEsIDB4MkQ3QSwgMHg2QUEyLCAweDEzRTgsIDB4NkFBMywKKyAgICAweDEzRUIsIDB4NkFBNCwgMHgyRDgyLCAweDZBQTUsIDB4MkQ3NiwgMHg2QUE2LCAweDJEODUsIDB4NkFBOCwgMHgyRDgxLAorICAgIDB4NkFBQywgMHgxNERELCAweDZBQUQsIDB4MkYzRSwgMHg2QUFFLCAweDE0RTIsIDB4NkFBRiwgMHgxNEUzLCAweDZBQjMsCisgICAgMHgxNERDLCAweDZBQjQsIDB4MkYzRCwgMHg2QUI2LCAweDJGM0EsIDB4NkFCNywgMHgyRjNCLCAweDZBQjgsIDB4MTRFMCwKKyAgICAweDZBQjksIDB4MkYzNSwgMHg2QUJBLCAweDJGMzksIDB4NkFCQiwgMHgxNERGLCAweDZBQkQsIDB4MkYzNiwgMHg2QUMyLAorICAgIDB4MTRFMSwgMHg2QUMzLCAweDE0REUsIDB4NkFDNSwgMHgyRjM0LCAweDZBQzYsIDB4MkYzOCwgMHg2QUM3LCAweDJGM0MsCisgICAgMHg2QUNCLCAweDMwOUYsIDB4NkFDQywgMHgzMDlDLCAweDZBQ0QsIDB4MzBBNSwgMHg2QUNGLCAweDMwQTQsIDB4NkFEMCwKKyAgICAweDMwQTIsIDB4NkFEMSwgMHgzMDlELCAweDZBRDMsIDB4MTU4OSwgMHg2QUQ5LCAweDMwOUUsIDB4NkFEQSwgMHgxNTg4LAorICAgIDB4NkFEQiwgMHgxM0VBLCAweDZBREMsIDB4MzBBMSwgMHg2QURELCAweDE1ODcsIDB4NkFERSwgMHgzMEE2LCAweDZBREYsCisgICAgMHgzMEEwLCAweDZBRTAsIDB4MzA5QiwgMHg2QUUxLCAweDJGMzcsIDB4NkFFNSwgMHgxNTg2LCAweDZBRTcsIDB4MzA5QSwKKyAgICAweDZBRTgsIDB4MzFERiwgMHg2QUVBLCAweDMxREUsIDB4NkFFQiwgMHgzMEEzLCAweDZBRUMsIDB4MTYxQiwgMHg2QUVFLAorICAgIDB4MzFFMiwgMHg2QUVGLCAweDMxRTMsIDB4NkFGMCwgMHgzMURELCAweDZBRjEsIDB4MzFFMSwgMHg2QUYzLCAweDMxREMsCisgICAgMHg2QUY4LCAweDMyRDYsIDB4NkFGOSwgMHgzMUUwLCAweDZBRkEsIDB4MTY3OCwgMHg2QUZCLCAweDE2NzYsIDB4NkFGQywKKyAgICAweDMyRDQsIDB4NkIwMCwgMHgzMkQ3LCAweDZCMDIsIDB4MzJEMywgMHg2QjAzLCAweDMyRDUsIDB4NkIwNCwgMHgxNjc3LAorICAgIDB4NkIwOCwgMHgzMzg2LCAweDZCMDksIDB4MzM4NywgMHg2QjBBLCAweDE2QzYsIDB4NkIwQiwgMHgzMzg1LCAweDZCMEYsCisgICAgMHgzNDIwLCAweDZCMTAsIDB4MTZGRCwgMHg2QjExLCAweDM0MUUsIDB4NkIxMiwgMHgzNDFGLCAweDZCMTMsIDB4MzQ4NywKKyAgICAweDZCMTYsIDB4MTc0MywgMHg2QjE3LCAweDM0Q0UsIDB4NkIxOCwgMHgzNENDLCAweDZCMTksIDB4MzRDRCwgMHg2QjFBLAorICAgIDB4MzRDRiwgMHg2QjFFLCAweDM1MzQsIDB4NkIyMCwgMHgwMkRFLCAweDZCMjEsIDB4MDNFMywgMHg2QjIzLCAweDA2MUEsCisgICAgMHg2QjI1LCAweDE5QzksIDB4NkIyOCwgMHgxQjNELCAweDZCMkMsIDB4MUNFNiwgMHg2QjJELCAweDFDRTgsIDB4NkIyRiwKKyAgICAweDFDRTcsIDB4NkIzMSwgMHgxQ0U5LCAweDZCMzIsIDB4MEFFNywgMHg2QjMzLCAweDFGM0MsIDB4NkIzNCwgMHgxQ0VBLAorICAgIDB4NkIzNiwgMHgxRjNCLCAweDZCMzcsIDB4MUYzRCwgMHg2QjM4LCAweDFGM0UsIDB4NkIzOSwgMHgyMUIyLCAweDZCM0EsCisgICAgMHgwQzlDLCAweDZCM0IsIDB4MjFCMywgMHg2QjNDLCAweDIxQjUsIDB4NkIzRCwgMHgwQzlELCAweDZCM0UsIDB4MEM5QiwKKyAgICAweDZCM0YsIDB4MjFCNCwgMHg2QjQxLCAweDI0NDcsIDB4NkI0MiwgMHgyNDQ1LCAweDZCNDMsIDB4MjQ0NCwgMHg2QjQ1LAorICAgIDB4MjQ0MywgMHg2QjQ2LCAweDI0NDIsIDB4NkI0NywgMHgwRTRBLCAweDZCNDgsIDB4MjQ0NiwgMHg2QjQ5LCAweDEwMDEsCisgICAgMHg2QjRBLCAweDI2RTIsIDB4NkI0QiwgMHgyNkU0LCAweDZCNEMsIDB4MTAwMiwgMHg2QjRELCAweDI2RTMsIDB4NkI0RSwKKyAgICAweDExODUsIDB4NkI1MCwgMHgxMTg0LCAweDZCNTEsIDB4MjkyNCwgMHg2QjU0LCAweDJCODksIDB4NkI1NSwgMHgyQjg4LAorICAgIDB4NkI1NiwgMHgyQjhBLCAweDZCNTksIDB4MTJEQywgMHg2QjVCLCAweDJEOEEsIDB4NkI1QywgMHgxM0YwLCAweDZCNUUsCisgICAgMHgyRjNGLCAweDZCNUYsIDB4MTRFNCwgMHg2QjYwLCAweDMwQTcsIDB4NkI2MSwgMHgxNkM3LCAweDZCNjIsIDB4MDJERiwKKyAgICAweDZCNjMsIDB4MDM0RCwgMHg2QjY0LCAweDAzRTQsIDB4NkI2NSwgMHgwNEM5LCAweDZCNjYsIDB4MDYxQiwgMHg2QjY3LAorICAgIDB4MDYxQywgMHg2QjZBLCAweDA3NjksIDB4NkI2RCwgMHgxQ0VCLCAweDZCNzIsIDB4MEU0QiwgMHg2Qjc2LCAweDI5QTIsCisgICAgMHg2Qjc3LCAweDEyREQsIDB4NkI3OCwgMHgxNEU1LCAweDZCNzksIDB4MDJFMCwgMHg2QjdCLCAweDAzRTUsIDB4NkI3RSwKKyAgICAweDE5Q0IsIDB4NkI3RiwgMHgwNjFELCAweDZCODAsIDB4MTlDQSwgMHg2QjgyLCAweDFCM0UsIDB4NkI4MywgMHgwNzZBLAorICAgIDB4NkI4NCwgMHgxQjNGLCAweDZCODYsIDB4MDc2QiwgMHg2Qjg4LCAweDFDRUQsIDB4NkI4OSwgMHgwOTAwLCAweDZCOEEsCisgICAgMHgwOEZGLCAweDZCOEMsIDB4MUY0MywgMHg2QjhELCAweDFGNDEsIDB4NkI4RSwgMHgxRjQyLCAweDZCOEYsIDB4MUY0MCwKKyAgICAweDZCOTEsIDB4MUYzRiwgMHg2Qjk0LCAweDIxQjYsIDB4NkI5NSwgMHgyMUI5LCAweDZCOTYsIDB4MEM5RiwgMHg2Qjk3LAorICAgIDB4MjFCNywgMHg2Qjk4LCAweDBDOUUsIDB4NkI5OSwgMHgyMUI4LCAweDZCOUIsIDB4MjQ0OCwgMHg2QjlFLCAweDI2RTUsCisgICAgMHg2QjlGLCAweDI2RTYsIDB4NkJBMCwgMHgyNkU3LCAweDZCQTIsIDB4MjkyNywgMHg2QkEzLCAweDI5MjYsIDB4NkJBNCwKKyAgICAweDExODYsIDB4NkJBNSwgMHgyOTI1LCAweDZCQTYsIDB4MjkyOCwgMHg2QkE3LCAweDJCOEIsIDB4NkJBQSwgMHgyQjhDLAorICAgIDB4NkJBQiwgMHgyQjhELCAweDZCQUQsIDB4MkQ4QiwgMHg2QkFFLCAweDEzRjEsIDB4NkJBRiwgMHgxNEU2LCAweDZCQjAsCisgICAgMHgzMEE4LCAweDZCQjIsIDB4MTY3OSwgMHg2QkIzLCAweDE3OEEsIDB4NkJCNSwgMHgwNzZDLCAweDZCQjYsIDB4MUI0MCwKKyAgICAweDZCQjcsIDB4MDkwMSwgMHg2QkJBLCAweDBBRTgsIDB4NkJCQywgMHgwQ0EwLCAweDZCQkQsIDB4MjFCQSwgMHg2QkJGLAorICAgIDB4MEU0RCwgMHg2QkMwLCAweDBFNEMsIDB4NkJDMywgMHgyNkU4LCAweDZCQzQsIDB4MjZFOSwgMHg2QkM1LCAweDExODcsCisgICAgMHg2QkM2LCAweDExODgsIDB4NkJDNywgMHgyQjhGLCAweDZCQzgsIDB4MkI4RSwgMHg2QkM5LCAweDJGNDAsIDB4NkJDQSwKKyAgICAweDM0MjEsIDB4NkJDQiwgMHgwMkUxLCAweDZCQ0MsIDB4MTc4QiwgMHg2QkNELCAweDAzNEUsIDB4NkJDRiwgMHgwNENBLAorICAgIDB4NkJEMCwgMHgxOEFELCAweDZCRDIsIDB4MDc2RCwgMHg2QkQzLCAweDBFNEUsIDB4NkJENCwgMHgwMkUyLCAweDZCRDYsCisgICAgMHgxQjQxLCAweDZCRDcsIDB4MDc2RSwgMHg2QkQ4LCAweDFCNDIsIDB4NkJEQSwgMHgxM0YyLCAweDZCREIsIDB4MDJFMywKKyAgICAweDZCREUsIDB4MTlDQywgMHg2QkUwLCAweDFCNDMsIDB4NkJFMiwgMHgxQ0YyLCAweDZCRTMsIDB4MUNGMSwgMHg2QkU0LAorICAgIDB4MUNFRiwgMHg2QkU2LCAweDFDRUUsIDB4NkJFNywgMHgxQ0YzLCAweDZCRTgsIDB4MUNGMCwgMHg2QkVCLCAweDBBRTksCisgICAgMHg2QkVDLCAweDBBRUEsIDB4NkJFRiwgMHgwQ0ExLCAweDZCRjAsIDB4MjFCQiwgMHg2QkYyLCAweDIxQkMsIDB4NkJGMywKKyAgICAweDIxQkQsIDB4NkJGNywgMHgyNDRDLCAweDZCRjgsIDB4MjQ0RCwgMHg2QkY5LCAweDI0NEIsIDB4NkJGQiwgMHgyNDQ5LAorICAgIDB4NkJGQywgMHgyNDRBLCAweDZCRkQsIDB4MEU0RiwgMHg2QkZFLCAweDI2RUEsIDB4NkJGRiwgMHgyOTJCLCAweDZDMDAsCisgICAgMHgyOTJBLCAweDZDMDEsIDB4MjkyOSwgMHg2QzAyLCAweDI5MkMsIDB4NkMwMywgMHgyQjkxLCAweDZDMDQsIDB4MkI5MCwKKyAgICAweDZDMDUsIDB4MTJERSwgMHg2QzA2LCAweDJCOTIsIDB4NkMwOCwgMHgxM0YzLCAweDZDMDksIDB4MkQ4QywgMHg2QzBCLAorICAgIDB4MkY0MSwgMHg2QzBDLCAweDMwQTksIDB4NkMwRCwgMHgzMzg4LCAweDZDMEYsIDB4MDJFNCwgMHg2QzEwLCAweDAzNTAsCisgICAgMHg2QzExLCAweDAzNEYsIDB4NkMxMywgMHgwNjFFLCAweDZDMTQsIDB4MTc4QywgMHg2QzE1LCAweDE3QUEsIDB4NkMxNiwKKyAgICAweDAzRTYsIDB4NkMxOCwgMHgxODAxLCAweDZDMTksIDB4MThBRSwgMHg2QzFBLCAweDE4QUYsIDB4NkMxQiwgMHgwNjFGLAorICAgIDB4NkMxRCwgMHgxOUNELCAweDZDMUYsIDB4MDc2RiwgMHg2QzIwLCAweDFCNDQsIDB4NkMyMSwgMHgxQjQ1LCAweDZDMjMsCisgICAgMHgwOTAyLCAweDZDMjQsIDB4MDkwNiwgMHg2QzI1LCAweDFDRjQsIDB4NkMyNiwgMHgwOTA1LCAweDZDMjcsIDB4MDkwMywKKyAgICAweDZDMjgsIDB4MDkwNCwgMHg2QzJBLCAweDFGNDQsIDB4NkMyQiwgMHgwQUVCLCAweDZDMkMsIDB4MENBNCwgMHg2QzJFLAorICAgIDB4MENBMiwgMHg2QzJGLCAweDBDQTMsIDB4NkMzMCwgMHgyMUJFLCAweDZDMzMsIDB4MTAwMywgMHg2QzM0LCAweDAyRTUsCisgICAgMHg2QzM2LCAweDE3QUIsIDB4NkMzOCwgMHgwMzUxLCAweDZDM0IsIDB4MTdBRSwgMHg2QzNFLCAweDAzNTQsIDB4NkMzRiwKKyAgICAweDE3QUQsIDB4NkM0MCwgMHgwMzUzLCAweDZDNDEsIDB4MDM1MiwgMHg2QzQyLCAweDA0Q0IsIDB4NkM0MywgMHgxN0FDLAorICAgIDB4NkM0NiwgMHgxODAyLCAweDZDNEEsIDB4MTgwNiwgMHg2QzRCLCAweDE4MDgsIDB4NkM0QywgMHgxODA5LCAweDZDNEQsCisgICAgMHgwM0YwLCAweDZDNEUsIDB4MDNGMSwgMHg2QzRGLCAweDE4MDUsIDB4NkM1MCwgMHgwM0VDLCAweDZDNTIsIDB4MTgwMywKKyAgICAweDZDNTQsIDB4MTgwNywgMHg2QzU1LCAweDAzRUQsIDB4NkM1NywgMHgwM0U4LCAweDZDNTksIDB4MDNFOSwgMHg2QzVCLAorICAgIDB4MDNFRiwgMHg2QzVDLCAweDE4MDQsIDB4NkM1RCwgMHgwM0U3LCAweDZDNUUsIDB4MDRDQywgMHg2QzVGLCAweDAzRUEsCisgICAgMHg2QzYwLCAweDAzRUIsIDB4NkM2MSwgMHgwM0VFLCAweDZDNjUsIDB4MThDMCwgMHg2QzY2LCAweDE4QkUsIDB4NkM2NywKKyAgICAweDE4QjEsIDB4NkM2OCwgMHgwNEQ4LCAweDZDNjksIDB4MThCOCwgMHg2QzZBLCAweDA0RDMsIDB4NkM2QiwgMHgxOEIyLAorICAgIDB4NkM2RCwgMHgxOEJBLCAweDZDNkYsIDB4MThCNywgMHg2QzcwLCAweDA0RDYsIDB4NkM3MSwgMHgxOEI2LCAweDZDNzIsCisgICAgMHgwNERELCAweDZDNzMsIDB4MThCRiwgMHg2Qzc0LCAweDA0REYsIDB4NkM3NiwgMHgwNEUxLCAweDZDNzgsIDB4MThCMCwKKyAgICAweDZDN0EsIDB4MDRENCwgMHg2QzdCLCAweDE4QzEsIDB4NkM3RCwgMHgwNERCLCAweDZDN0UsIDB4MDRERSwgMHg2QzgwLAorICAgIDB4MTlFNCwgMHg2QzgxLCAweDA0Q0UsIDB4NkM4MiwgMHgwNEU1LCAweDZDODMsIDB4MDREQywgMHg2Qzg0LCAweDE4QjMsCisgICAgMHg2Qzg1LCAweDA0RDEsIDB4NkM4NiwgMHgwNEUwLCAweDZDODcsIDB4MThCQiwgMHg2Qzg4LCAweDA0Q0YsIDB4NkM4OSwKKyAgICAweDA0RDAsIDB4NkM4QSwgMHgxOUUyLCAweDZDOEIsIDB4MThCNCwgMHg2QzhDLCAweDA0RDcsIDB4NkM4RCwgMHgwNEUyLAorICAgIDB4NkM4RSwgMHgxOEMyLCAweDZDOEYsIDB4MThCNSwgMHg2QzkwLCAweDA0RDUsIDB4NkM5MiwgMHgwNERBLCAweDZDOTMsCisgICAgMHgxOUNFLCAweDZDOTQsIDB4MDRFMywgMHg2Qzk1LCAweDE4QkMsIDB4NkM5NiwgMHgwNEQ5LCAweDZDOTgsIDB4MDRFNCwKKyAgICAweDZDOTksIDB4MDRDRCwgMHg2QzlBLCAweDE4QjksIDB4NkM5QiwgMHgwNEQyLCAweDZDOUMsIDB4MThCRCwgMHg2QzlELAorICAgIDB4MTlFMywgMHg2Q0FCLCAweDA2MkIsIDB4NkNBQywgMHgwNjNCLCAweDZDQUQsIDB4MTlENSwgMHg2Q0FFLCAweDA2MzIsCisgICAgMHg2Q0IwLCAweDE5RUEsIDB4NkNCMSwgMHgwNjIzLCAweDZDQjMsIDB4MDYyNiwgMHg2Q0I0LCAweDE5RTEsIDB4NkNCNiwKKyAgICAweDE5RDMsIDB4NkNCNywgMHgxOUQ3LCAweDZDQjgsIDB4MDYyRSwgMHg2Q0I5LCAweDA2MzAsIDB4NkNCQSwgMHgxOURBLAorICAgIDB4NkNCQiwgMHgwNjM3LCAweDZDQkMsIDB4MDYyOSwgMHg2Q0JELCAweDA2MjcsIDB4NkNCRSwgMHgwNjI4LCAweDZDQkYsCisgICAgMHgwNjM2LCAweDZDQzAsIDB4MTlFNiwgMHg2Q0MxLCAweDA2MzEsIDB4NkNDMiwgMHgxOUQ5LCAweDZDQzMsIDB4MTlEQiwKKyAgICAweDZDQzQsIDB4MDYyRiwgMHg2Q0M1LCAweDA2MzQsIDB4NkNDNiwgMHgxOURDLCAweDZDQzcsIDB4MTlFOSwgMHg2Q0M5LAorICAgIDB4MDc3MCwgMHg2Q0NBLCAweDA2M0EsIDB4NkNDQywgMHgwNjI0LCAweDZDQ0QsIDB4MTlFOCwgMHg2Q0NGLCAweDE5RUMsCisgICAgMHg2Q0QwLCAweDE5RDgsIDB4NkNEMSwgMHgxOUVFLCAweDZDRDIsIDB4MTlERiwgMHg2Q0QzLCAweDA2MkQsIDB4NkNENCwKKyAgICAweDE5RDQsIDB4NkNENSwgMHgwNjJDLCAweDZDRDYsIDB4MDYzRSwgMHg2Q0Q3LCAweDA2MzMsIDB4NkNEOSwgMHgxOUQyLAorICAgIDB4NkNEQSwgMHgxQjRFLCAweDZDREIsIDB4MDYzOSwgMHg2Q0RDLCAweDA2M0QsIDB4NkNERCwgMHgxOUUwLCAweDZDREUsCisgICAgMHgxOUU1LCAweDZDRTAsIDB4MDYzRiwgMHg2Q0UxLCAweDA2MzgsIDB4NkNFMiwgMHgwNjJBLCAweDZDRTMsIDB4MDYyMCwKKyAgICAweDZDRTUsIDB4MDYyNSwgMHg2Q0U3LCAweDE5RDYsIDB4NkNFOCwgMHgwNjIxLCAweDZDRTksIDB4MTlFRCwgMHg2Q0VCLAorICAgIDB4MTlEMCwgMHg2Q0VDLCAweDE5Q0YsIDB4NkNFRCwgMHgxOURELCAweDZDRUUsIDB4MTlEMSwgMHg2Q0VGLCAweDA2M0MsCisgICAgMHg2Q0YwLCAweDA5MDcsIDB4NkNGMSwgMHgwNjM1LCAweDZDRjIsIDB4MTlERSwgMHg2Q0YzLCAweDA2MjIsIDB4NkNGNSwKKyAgICAweDA3N0YsIDB4NkNGOSwgMHgxOUVCLCAweDZEMDAsIDB4MUI1NSwgMHg2RDAxLCAweDFCNTgsIDB4NkQwMywgMHgxQjVCLAorICAgIDB4NkQwNCwgMHgxQjUwLCAweDZEMDcsIDB4MUI1RSwgMHg2RDA4LCAweDFCNjEsIDB4NkQwOSwgMHgxQjYzLCAweDZEMEEsCisgICAgMHgxQjRELCAweDZEMEIsIDB4MDc3MSwgMHg2RDBDLCAweDA3NzYsIDB4NkQwRCwgMHgxQ0Y5LCAweDZEMEUsIDB4MDc4NiwKKyAgICAweDZEMEYsIDB4MUI1QywgMHg2RDEwLCAweDFCNjQsIDB4NkQxMSwgMHgxQjU0LCAweDZEMTIsIDB4MUI0QywgMHg2RDE2LAorICAgIDB4MUQxNCwgMHg2RDE3LCAweDA3NzksIDB4NkQxOCwgMHgxQjU5LCAweDZEMTksIDB4MUI1MSwgMHg2RDFBLCAweDFCNTMsCisgICAgMHg2RDFCLCAweDA3N0UsIDB4NkQxRCwgMHgxQjU2LCAweDZEMUUsIDB4MDc3OCwgMHg2RDFGLCAweDFCNDksIDB4NkQyMCwKKyAgICAweDFCNUYsIDB4NkQyMiwgMHgxQjYyLCAweDZEMjUsIDB4MDc3NSwgMHg2RDI3LCAweDA3ODEsIDB4NkQyOCwgMHgxQjQ2LAorICAgIDB4NkQyOSwgMHgwNzgzLCAweDZEMkEsIDB4MDc3MywgMHg2RDJCLCAweDA3ODcsIDB4NkQyQywgMHgxQjYwLCAweDZEMkQsCisgICAgMHgxQjQ4LCAweDZEMkUsIDB4MDc4NCwgMHg2RDJGLCAweDFEMEUsIDB4NkQzMCwgMHgxOUU3LCAweDZEMzEsIDB4MDc3NywKKyAgICAweDZEMzIsIDB4MDc3MiwgMHg2RDMzLCAweDFCNEYsIDB4NkQzNCwgMHgxQjQ3LCAweDZEMzUsIDB4MDc4NSwgMHg2RDM2LAorICAgIDB4MDc3RCwgMHg2RDM3LCAweDFCNUEsIDB4NkQzOCwgMHgwNzgyLCAweDZEMzksIDB4MDc4MCwgMHg2RDNBLCAweDFCNTIsCisgICAgMHg2RDNCLCAweDA3N0EsIDB4NkQzQywgMHgxQjRBLCAweDZEM0QsIDB4MDc3QiwgMHg2RDNFLCAweDA3N0MsIDB4NkQzRiwKKyAgICAweDFCNEIsIDB4NkQ0MCwgMHgxQjVELCAweDZENDEsIDB4MDc3NCwgMHg2RDQyLCAweDFCNTcsIDB4NkQ1OCwgMHgxQ0ZDLAorICAgIDB4NkQ1OSwgMHgwOTBGLCAweDZENUEsIDB4MDkxNCwgMHg2RDVFLCAweDFEMDUsIDB4NkQ1RiwgMHgxRDBCLCAweDZENjAsCisgICAgMHgxRDA3LCAweDZENjEsIDB4MUNGQSwgMHg2RDYyLCAweDFDRkQsIDB4NkQ2MywgMHgxQ0Y2LCAweDZENjQsIDB4MUNGNywKKyAgICAweDZENjUsIDB4MDkxQiwgMHg2RDY2LCAweDA5MEMsIDB4NkQ2NywgMHgxRDA2LCAweDZENjgsIDB4MUQwRiwgMHg2RDY5LAorICAgIDB4MDkxNiwgMHg2RDZBLCAweDA5MDgsIDB4NkQ2QywgMHgwOTExLCAweDZENkQsIDB4MUNGRSwgMHg2RDZFLCAweDA5MTMsCisgICAgMHg2RDZGLCAweDFDRkYsIDB4NkQ3MCwgMHgxRDA5LCAweDZENzQsIDB4MDkxNSwgMHg2RDc1LCAweDFEMTgsIDB4NkQ3NiwKKyAgICAweDFDRjgsIDB4NkQ3NywgMHgwOTBFLCAweDZENzgsIDB4MDkwRCwgMHg2RDc5LCAweDA5MTksIDB4NkQ3QSwgMHgxQ0Y1LAorICAgIDB4NkQ3QiwgMHgxRDE2LCAweDZEN0MsIDB4MUQwQSwgMHg2RDdELCAweDFEMTcsIDB4NkQ3RSwgMHgxRDExLCAweDZEN0YsCisgICAgMHgxRDAzLCAweDZEODAsIDB4MUQxMiwgMHg2RDgyLCAweDFEMEMsIDB4NkQ4MywgMHgxRDE1LCAweDZEODQsIDB4MUQxMywKKyAgICAweDZEODUsIDB4MDkxQSwgMHg2RDg2LCAweDFEMDQsIDB4NkQ4NywgMHgwOTBCLCAweDZEODgsIDB4MDkwQSwgMHg2RDg5LAorICAgIDB4MDkxMiwgMHg2RDhBLCAweDA5MTgsIDB4NkQ4QiwgMHgxRDEwLCAweDZEOEMsIDB4MDkxNywgMHg2RDhELCAweDFEMDEsCisgICAgMHg2RDhFLCAweDBBRUMsIDB4NkQ5MCwgMHgxRDE5LCAweDZEOTEsIDB4MUQwMCwgMHg2RDkyLCAweDFDRkIsIDB4NkQ5MywKKyAgICAweDA5MTAsIDB4NkQ5NCwgMHgwOTFDLCAweDZEOTUsIDB4MDkwOSwgMHg2RDk3LCAweDFEMDgsIDB4NkQ5OCwgMHgxRDBELAorICAgIDB4NkRBQSwgMHgwQjBFLCAweDZEQUIsIDB4MUY0NiwgMHg2REFDLCAweDFGNEEsIDB4NkRBRSwgMHgwQUZCLCAweDZEQUYsCisgICAgMHgwQUY5LCAweDZEQjIsIDB4MEFGMCwgMHg2REIzLCAweDFGNDgsIDB4NkRCNCwgMHgxRjQ3LCAweDZEQjUsIDB4MEIwNCwKKyAgICAweDZEQjcsIDB4MUY0RCwgMHg2REI4LCAweDBBRkUsIDB4NkRCQSwgMHgxRjVGLCAweDZEQkIsIDB4MUY2QiwgMHg2REJDLAorICAgIDB4MEFFRCwgMHg2REJELCAweDFGNUMsIDB4NkRCRSwgMHgxRjU1LCAweDZEQkYsIDB4MEIxMCwgMHg2REMwLCAweDFGNDUsCisgICAgMHg2REMyLCAweDFGNjEsIDB4NkRDNCwgMHgwQjBELCAweDZEQzUsIDB4MEIwMSwgMHg2REM2LCAweDBCMEMsIDB4NkRDNywKKyAgICAweDBBRjcsIDB4NkRDOCwgMHgxRjUxLCAweDZEQzksIDB4MUY2MywgMHg2RENBLCAweDFGNUIsIDB4NkRDQiwgMHgwQUY4LAorICAgIDB4NkRDQywgMHgwQUYyLCAweDZEQ0QsIDB4MUY2OSwgMHg2RENGLCAweDFGNjIsIDB4NkREMCwgMHgxRjY0LCAweDZERDEsCisgICAgMHgwQUZBLCAweDZERDIsIDB4MEIwMiwgMHg2REQzLCAweDFGNjYsIDB4NkRENCwgMHgxRjRGLCAweDZERDUsIDB4MUY2MCwKKyAgICAweDZERDYsIDB4MUY1NCwgMHg2REQ3LCAweDFGNjgsIDB4NkREOCwgMHgwQjA3LCAweDZERDksIDB4MEFFRiwgMHg2RERBLAorICAgIDB4MEIwNSwgMHg2RERCLCAweDFGNTksIDB4NkREQywgMHgxRjU3LCAweDZEREQsIDB4MUY1OCwgMHg2RERFLCAweDBBRkMsCisgICAgMHg2RERGLCAweDFGNTMsIDB4NkRFMCwgMHgxRjUyLCAweDZERTEsIDB4MEFGMSwgMHg2REUyLCAweDFGNEMsIDB4NkRFMywKKyAgICAweDFGNkEsIDB4NkRFNCwgMHgwQUYzLCAweDZERTUsIDB4MUY1NiwgMHg2REU2LCAweDBCMTEsIDB4NkRFOCwgMHgwQjBCLAorICAgIDB4NkRFOSwgMHgxRjRCLCAweDZERUEsIDB4MEIwOCwgMHg2REVCLCAweDBCMDYsIDB4NkRFQywgMHgwQjBGLCAweDZERUQsCisgICAgMHgxRjVELCAweDZERUUsIDB4MEIwQSwgMHg2REVGLCAweDFEMDIsIDB4NkRGMCwgMHgxRjVFLCAweDZERjEsIDB4MEIwOSwKKyAgICAweDZERjIsIDB4MUY2NSwgMHg2REYzLCAweDBBRUUsIDB4NkRGNCwgMHgxRjVBLCAweDZERjUsIDB4MEIwMCwgMHg2REY2LAorICAgIDB4MUY0RSwgMHg2REY3LCAweDBBRkYsIDB4NkRGOSwgMHgwQUZELCAweDZERkEsIDB4MEFGNSwgMHg2REZCLCAweDBBRjQsCisgICAgMHg2REZDLCAweDIxQkYsIDB4NkRGRCwgMHgxRjY3LCAweDZFMDAsIDB4MUY1MCwgMHg2RTAzLCAweDIxRDQsIDB4NkUwNSwKKyAgICAweDBBRjYsIDB4NkUxOSwgMHgwQ0MxLCAweDZFMUEsIDB4MEIwMywgMHg2RTFCLCAweDBDQUYsIDB4NkUxQywgMHgyMUNFLAorICAgIDB4NkUxRCwgMHgwQ0JELCAweDZFMUYsIDB4MjFDMiwgMHg2RTIwLCAweDBDQUMsIDB4NkUyMSwgMHgwQ0E4LCAweDZFMjIsCisgICAgMHgyMUUwLCAweDZFMjMsIDB4MENBRSwgMHg2RTI0LCAweDBDQjIsIDB4NkUyNSwgMHgwQ0FELCAweDZFMjYsIDB4MENCNiwKKyAgICAweDZFMjcsIDB4MjFFNCwgMHg2RTI4LCAweDIxREIsIDB4NkUyQiwgMHgyMUM5LCAweDZFMkMsIDB4MENCQiwgMHg2RTJELAorICAgIDB4MENCNSwgMHg2RTJFLCAweDIxRDUsIDB4NkUyRiwgMHgwQ0E1LCAweDZFMzAsIDB4MjFFMSwgMHg2RTMxLCAweDIxREEsCisgICAgMHg2RTMyLCAweDBDQTksIDB4NkUzMywgMHgyMUNGLCAweDZFMzQsIDB4MENCOCwgMHg2RTM1LCAweDIxRUMsIDB4NkUzNiwKKyAgICAweDIxRUQsIDB4NkUzOCwgMHgwQ0E2LCAweDZFMzksIDB4MjFERiwgMHg2RTNBLCAweDBDQkEsIDB4NkUzQiwgMHgyMUQzLAorICAgIDB4NkUzQywgMHgyMUM1LCAweDZFM0QsIDB4MjFDNiwgMHg2RTNFLCAweDBDQkUsIDB4NkUzRiwgMHgyMUNBLCAweDZFNDAsCisgICAgMHgyMUQxLCAweDZFNDEsIDB4MjFDQiwgMHg2RTQzLCAweDBDQkMsIDB4NkU0NCwgMHgwQ0M0LCAweDZFNDUsIDB4MjFDNywKKyAgICAweDZFNDYsIDB4MjFDMCwgMHg2RTQ3LCAweDIxQzEsIDB4NkU0OSwgMHgyMUMzLCAweDZFNEEsIDB4MENBQiwgMHg2RTRCLAorICAgIDB4MjFEMCwgMHg2RTRELCAweDBDQjksIDB4NkU0RSwgMHgwQ0MyLCAweDZFNTEsIDB4MjFEMiwgMHg2RTUyLCAweDIxRUEsCisgICAgMHg2RTUzLCAweDIxRTIsIDB4NkU1NCwgMHgwQ0E3LCAweDZFNTUsIDB4MjFFOCwgMHg2RTU2LCAweDBDQjMsIDB4NkU1OCwKKyAgICAweDBDQjEsIDB4NkU1QSwgMHgyMUVFLCAweDZFNUIsIDB4MENCMCwgMHg2RTVDLCAweDIxRDgsIDB4NkU1RCwgMHgyMUNDLAorICAgIDB4NkU1RSwgMHgyMUQ2LCAweDZFNUYsIDB4MENDNywgMHg2RTYwLCAweDIxREMsIDB4NkU2MSwgMHgyMUQ5LCAweDZFNjIsCisgICAgMHgyMUM4LCAweDZFNjMsIDB4MENDMywgMHg2RTY0LCAweDIxRTYsIDB4NkU2NSwgMHgyMUUzLCAweDZFNjYsIDB4MjFFQiwKKyAgICAweDZFNjcsIDB4MENBQSwgMHg2RTY4LCAweDIxRDcsIDB4NkU2OSwgMHgwQ0M2LCAweDZFNkIsIDB4MjFERSwgMHg2RTZFLAorICAgIDB4MENCNCwgMHg2RTZGLCAweDBDQjcsIDB4NkU3MSwgMHgyMURELCAweDZFNzIsIDB4MENDNSwgMHg2RTczLCAweDIxQ0QsCisgICAgMHg2RTc0LCAweDFGNDksIDB4NkU3NywgMHgyMUU3LCAweDZFNzgsIDB4MjFFNSwgMHg2RTc5LCAweDIxRTksIDB4NkU4OCwKKyAgICAweDIxQzQsIDB4NkU4OSwgMHgwQ0MwLCAweDZFOEQsIDB4MjQ2QywgMHg2RThFLCAweDI0NkIsIDB4NkU4RiwgMHgyNDUxLAorICAgIDB4NkU5MCwgMHgwRTU1LCAweDZFOTIsIDB4MjQ2QSwgMHg2RTkzLCAweDI0NTQsIDB4NkU5NCwgMHgyNDU1LCAweDZFOTYsCisgICAgMHgwRTVGLCAweDZFOTcsIDB4MjQ3MywgMHg2RTk4LCAweDBFNUEsIDB4NkU5OSwgMHgyNDY5LCAweDZFOUIsIDB4MjQ0RSwKKyAgICAweDZFOUMsIDB4MEU2MCwgMHg2RTlELCAweDBFNTYsIDB4NkU5RSwgMHgyNDVELCAweDZFOUYsIDB4MjQ1MywgMHg2RUEwLAorICAgIDB4MjQ1NiwgMHg2RUExLCAweDI0NkUsIDB4NkVBMiwgMHgwRTUwLCAweDZFQTMsIDB4MjQ3NSwgMHg2RUE0LCAweDI0NkQsCisgICAgMHg2RUE1LCAweDBFNTksIDB4NkVBNiwgMHgyNDYyLCAweDZFQTcsIDB4MEU2NCwgMHg2RUFBLCAweDBFNjMsIDB4NkVBQiwKKyAgICAweDBFNUQsIDB4NkVBRSwgMHgyNDc0LCAweDZFQUYsIDB4MEU1MSwgMHg2RUIwLCAweDI0NjAsIDB4NkVCMSwgMHgyNDU3LAorICAgIDB4NkVCMiwgMHgyNDY0LCAweDZFQjMsIDB4MjQ3MCwgMHg2RUI0LCAweDBFNjUsIDB4NkVCNiwgMHgwRTUzLCAweDZFQjcsCisgICAgMHgyNDVGLCAweDZFQjksIDB4MjQ1OCwgMHg2RUJBLCAweDBFNUMsIDB4NkVCQywgMHgwRTVCLCAweDZFQkQsIDB4MjQ1QiwKKyAgICAweDZFQkUsIDB4MjQ2NSwgMHg2RUJGLCAweDI0NkYsIDB4NkVDMCwgMHgyNDUyLCAweDZFQzEsIDB4MjQ1QywgMHg2RUMyLAorICAgIDB4MEU1NCwgMHg2RUMzLCAweDI0NjYsIDB4NkVDNCwgMHgwRTYxLCAweDZFQzUsIDB4MEU1OCwgMHg2RUM2LCAweDI0NTksCisgICAgMHg2RUM3LCAweDBFNTcsIDB4NkVDOCwgMHgyNDUwLCAweDZFQzksIDB4MjQ1RSwgMHg2RUNBLCAweDI0NzIsIDB4NkVDQiwKKyAgICAweDBDQkYsIDB4NkVDQywgMHgxMDFGLCAweDZFQ0QsIDB4MjQ2MSwgMHg2RUNFLCAweDI2RUIsIDB4NkVDRiwgMHgyNDYzLAorICAgIDB4NkVEMCwgMHgyNDcxLCAweDZFRDEsIDB4MEU1RSwgMHg2RUQyLCAweDI0NUEsIDB4NkVEMywgMHgwRTUyLCAweDZFRDQsCisgICAgMHgwRTYyLCAweDZFRDUsIDB4MTE5QSwgMHg2RUQ2LCAweDI0NEYsIDB4NkVEOCwgMHgyNDY4LCAweDZFREMsIDB4MjQ2NywKKyAgICAweDZFRUIsIDB4MjcwNywgMHg2RUVDLCAweDEwMUMsIDB4NkVFRCwgMHgyNkZDLCAweDZFRUUsIDB4MjcwMSwgMHg2RUVGLAorICAgIDB4MTAxMSwgMHg2RUYxLCAweDI2RUQsIDB4NkVGMiwgMHgxMDFFLCAweDZFRjQsIDB4MTAwOCwgMHg2RUY1LCAweDI2RUMsCisgICAgMHg2RUY2LCAweDI3MEQsIDB4NkVGNywgMHgxMDIwLCAweDZFRjgsIDB4MjZGMCwgMHg2RUY5LCAweDI3MDAsIDB4NkVGQiwKKyAgICAweDI2RjIsIDB4NkVGQywgMHgyNzEwLCAweDZFRkQsIDB4MjcwQywgMHg2RUZFLCAweDEwMDYsIDB4NkVGRiwgMHgxMDEwLAorICAgIDB4NkYwMCwgMHgyOTQ2LCAweDZGMDEsIDB4MTAxRCwgMHg2RjAyLCAweDEwMEUsIDB4NkYwMywgMHgyNkVFLCAweDZGMDUsCisgICAgMHgyNzBCLCAweDZGMDYsIDB4MTAxMiwgMHg2RjA3LCAweDI3MDgsIDB4NkYwOCwgMHgyNzE1LCAweDZGMDksIDB4MjZGNCwKKyAgICAweDZGMEEsIDB4MjZGRCwgMHg2RjBELCAweDI3MTMsIDB4NkYwRSwgMHgyNzA5LCAweDZGMEYsIDB4MTAwRCwgMHg2RjEyLAorICAgIDB4MjZGQiwgMHg2RjEzLCAweDEwMDcsIDB4NkYxNCwgMHgxMDA1LCAweDZGMTUsIDB4MTAxNywgMHg2RjE4LCAweDI2RjksCisgICAgMHg2RjE5LCAweDI2RjYsIDB4NkYxQSwgMHgyNkY3LCAweDZGMUMsIDB4MjcwRiwgMHg2RjFFLCAweDI3MTQsIDB4NkYxRiwKKyAgICAweDI3MTIsIDB4NkYyMCwgMHgxMDBCLCAweDZGMjEsIDB4MjcxNiwgMHg2RjIyLCAweDEwMEYsIDB4NkYyMywgMHgxMDE2LAorICAgIDB4NkYyNSwgMHgyNkVGLCAweDZGMjYsIDB4MjkyRSwgMHg2RjI3LCAweDI2RjgsIDB4NkYyOSwgMHgxMDA5LCAweDZGMkEsCisgICAgMHgxMDFCLCAweDZGMkIsIDB4MTAxOCwgMHg2RjJDLCAweDEwMEMsIDB4NkYyRCwgMHgyNzAyLCAweDZGMkUsIDB4MjZGMywKKyAgICAweDZGMkYsIDB4MTAxOSwgMHg2RjMwLCAweDI3MDQsIDB4NkYzMSwgMHgxMDEzLCAweDZGMzIsIDB4MTAxNSwgMHg2RjMzLAorICAgIDB4MTAwNCwgMHg2RjM1LCAweDI3MDYsIDB4NkYzNiwgMHgyNkZFLCAweDZGMzcsIDB4MjZGMSwgMHg2RjM4LCAweDEwMTQsCisgICAgMHg2RjM5LCAweDI3MEUsIDB4NkYzQSwgMHgyNzExLCAweDZGM0IsIDB4MjZGQSwgMHg2RjNDLCAweDI3MDUsIDB4NkYzRSwKKyAgICAweDEwMEEsIDB4NkYzRiwgMHgxMTg5LCAweDZGNDAsIDB4MjcwMywgMHg2RjQxLCAweDI5MkQsIDB4NkY0MywgMHgyNzBBLAorICAgIDB4NkY0RSwgMHgyNkY1LCAweDZGNEYsIDB4MjkzNywgMHg2RjUwLCAweDI5NDEsIDB4NkY1MSwgMHgxMThDLCAweDZGNTIsCisgICAgMHgyOTQwLCAweDZGNTMsIDB4Mjk0QywgMHg2RjU0LCAweDExOEUsIDB4NkY1NSwgMHgyOTNFLCAweDZGNTcsIDB4Mjk0MiwKKyAgICAweDZGNTgsIDB4MTE5OSwgMHg2RjVBLCAweDI5MzksIDB4NkY1QiwgMHgxMTkxLCAweDZGNUQsIDB4Mjk0NSwgMHg2RjVFLAorICAgIDB4MkI5QSwgMHg2RjVGLCAweDExOUQsIDB4NkY2MCwgMHgxMTlDLCAweDZGNjEsIDB4Mjk0NywgMHg2RjYyLCAweDI5MzYsCisgICAgMHg2RjYzLCAweDI5NTEsIDB4NkY2NCwgMHgxMTk3LCAweDZGNjYsIDB4MTE4RCwgMHg2RjY3LCAweDI5NEEsIDB4NkY2OSwKKyAgICAweDI5NEUsIDB4NkY2QSwgMHgyOTUzLCAweDZGNkIsIDB4Mjk0OCwgMHg2RjZDLCAweDI5M0MsIDB4NkY2RCwgMHgxMTkwLAorICAgIDB4NkY2RSwgMHgxMTkzLCAweDZGNkYsIDB4MTE5QiwgMHg2RjcwLCAweDExOTYsIDB4NkY3MiwgMHgyOTNGLCAweDZGNzMsCisgICAgMHgyNkZGLCAweDZGNzYsIDB4MjkzQiwgMHg2Rjc3LCAweDI5NTIsIDB4NkY3OCwgMHgxMTkyLCAweDZGN0EsIDB4MTE5NSwKKyAgICAweDZGN0IsIDB4Mjk1NCwgMHg2RjdDLCAweDExOEEsIDB4NkY3RCwgMHgyOTQ5LCAweDZGN0UsIDB4MjkyRiwgMHg2RjdGLAorICAgIDB4Mjk0RiwgMHg2RjgwLCAweDEzRkMsIDB4NkY4MiwgMHgyOTNELCAweDZGODQsIDB4MTE4QiwgMHg2Rjg1LCAweDI5MzgsCisgICAgMHg2Rjg2LCAweDExOEYsIDB4NkY4NywgMHgyOTMwLCAweDZGODgsIDB4MTAxQSwgMHg2Rjg5LCAweDI5MzQsIDB4NkY4QiwKKyAgICAweDI5NEQsIDB4NkY4QywgMHgyOTM1LCAweDZGOEQsIDB4MjkzMywgMHg2RjhFLCAweDExOTQsIDB4NkY5MCwgMHgyOTRCLAorICAgIDB4NkY5MiwgMHgyOTMyLCAweDZGOTMsIDB4Mjk0NCwgMHg2Rjk0LCAweDI5NDMsIDB4NkY5NSwgMHgyOTUwLCAweDZGOTYsCisgICAgMHgyOTNBLCAweDZGOTcsIDB4MTE5OCwgMHg2RjlFLCAweDJCOUQsIDB4NkZBMCwgMHgxMkVCLCAweDZGQTEsIDB4MTJFMSwKKyAgICAweDZGQTIsIDB4MkJBOSwgMHg2RkEzLCAweDJCOTUsIDB4NkZBNCwgMHgxMkUzLCAweDZGQTUsIDB4MkJBMSwgMHg2RkE2LAorICAgIDB4MTJFQSwgMHg2RkE3LCAweDEyRTUsIDB4NkZBOCwgMHgyQjlGLCAweDZGQTksIDB4MkQ4RSwgMHg2RkFBLCAweDJCQTUsCisgICAgMHg2RkFCLCAweDJCQUIsIDB4NkZBQywgMHgyQkE0LCAweDZGQUQsIDB4MkI5MywgMHg2RkFFLCAweDJCQTIsIDB4NkZBRiwKKyAgICAweDJCQUQsIDB4NkZCMCwgMHgyQkFGLCAweDZGQjEsIDB4MTJFMCwgMHg2RkIyLCAweDJCQUUsIDB4NkZCMywgMHgxMkU2LAorICAgIDB4NkZCNCwgMHgxMkVDLCAweDZGQjYsIDB4MTJFOSwgMHg2RkI4LCAweDJCQTgsIDB4NkZCOSwgMHgxMkU4LCAweDZGQkEsCisgICAgMHgyQkEzLCAweDZGQkMsIDB4MkI5NywgMHg2RkJELCAweDJCOUMsIDB4NkZCRiwgMHgyQkE3LCAweDZGQzAsIDB4MTJFNywKKyAgICAweDZGQzEsIDB4MTJFNCwgMHg2RkMyLCAweDEyREYsIDB4NkZDMywgMHgxMkUyLCAweDZGQzQsIDB4MkI5QiwgMHg2RkM2LAorICAgIDB4MjkzMSwgMHg2RkM3LCAweDJCOTYsIDB4NkZDOCwgMHgyQjk5LCAweDZGQzksIDB4MkJBQSwgMHg2RkNBLCAweDJCOUUsCisgICAgMHg2RkNCLCAweDJCOTQsIDB4NkZDQywgMHgyRDhELCAweDZGQ0QsIDB4MkJBQywgMHg2RkNFLCAweDJCOTgsIDB4NkZDRiwKKyAgICAweDJCQTYsIDB4NkZENCwgMHgyRDkwLCAweDZGRDUsIDB4MTQwMCwgMHg2RkQ4LCAweDEzRjQsIDB4NkZEQiwgMHgxM0Y4LAorICAgIDB4NkZEQywgMHgyRDkyLCAweDZGREQsIDB4MkQ5OCwgMHg2RkRFLCAweDJEOTYsIDB4NkZERiwgMHgxM0Y2LCAweDZGRTAsCisgICAgMHgxM0Y3LCAweDZGRTEsIDB4MTNGRSwgMHg2RkUyLCAweDJEOTksIDB4NkZFMywgMHgyRDkxLCAweDZGRTQsIDB4MTNGOSwKKyAgICAweDZGRTYsIDB4MkQ5NSwgMHg2RkU3LCAweDJEOTQsIDB4NkZFOCwgMHgyRDlBLCAweDZGRTksIDB4MTNGRiwgMHg2RkVCLAorICAgIDB4MTNGQSwgMHg2RkVDLCAweDEzRkQsIDB4NkZFRCwgMHgyRDkzLCAweDZGRUUsIDB4MTQwMSwgMHg2RkVGLCAweDEzRkIsCisgICAgMHg2RkYwLCAweDE0MDIsIDB4NkZGMSwgMHgxM0Y1LCAweDZGRjIsIDB4MkQ5NywgMHg2RkY0LCAweDJEOEYsIDB4NkZGNywKKyAgICAweDJGNEUsIDB4NkZGQSwgMHgxNEVCLCAweDZGRkIsIDB4MkY0QiwgMHg2RkZDLCAweDJGNEQsIDB4NkZGRSwgMHgxNEU5LAorICAgIDB4NkZGRiwgMHgyRjQ5LCAweDcwMDAsIDB4MkY0QSwgMHg3MDAxLCAweDJGNDUsIDB4NzAwNCwgMHgyQkEwLCAweDcwMDUsCisgICAgMHgyRjQ2LCAweDcwMDYsIDB4MTRFQSwgMHg3MDA3LCAweDJGNDIsIDB4NzAwOSwgMHgxNEU3LCAweDcwMEEsIDB4MkY0RiwKKyAgICAweDcwMEIsIDB4MTRFOCwgMHg3MDBDLCAweDJGNDMsIDB4NzAwRCwgMHgyRjQ0LCAweDcwMEUsIDB4MkY0OCwgMHg3MDBGLAorICAgIDB4MTRFRCwgMHg3MDExLCAweDE0RUMsIDB4NzAxNCwgMHgyRjQ3LCAweDcwMTUsIDB4MTU4RiwgMHg3MDE2LCAweDMwQUQsCisgICAgMHg3MDE3LCAweDMwQjMsIDB4NzAxOCwgMHgxNTkwLCAweDcwMTksIDB4MzBBQSwgMHg3MDFBLCAweDE1OEQsIDB4NzAxQiwKKyAgICAweDE1OEEsIDB4NzAxQywgMHgzMEI1LCAweDcwMUQsIDB4MTU4RSwgMHg3MDFGLCAweDE1OEIsIDB4NzAyMCwgMHgzMEFDLAorICAgIDB4NzAyMSwgMHgzMEFGLCAweDcwMjIsIDB4MzBCMCwgMHg3MDIzLCAweDMwQjEsIDB4NzAyNCwgMHgzMEI0LCAweDcwMjYsCisgICAgMHgyRjRDLCAweDcwMjcsIDB4MzBBQiwgMHg3MDI4LCAweDE1OEMsIDB4NzAyOSwgMHgzMEIyLCAweDcwMkEsIDB4MzFFRiwKKyAgICAweDcwMkIsIDB4MzBBRSwgMHg3MDJGLCAweDMxRTYsIDB4NzAzMCwgMHgxNjFELCAweDcwMzEsIDB4MzFFOSwgMHg3MDMyLAorICAgIDB4MTYxRSwgMHg3MDMzLCAweDMxRjIsIDB4NzAzNCwgMHgzMUU4LCAweDcwMzUsIDB4MzFFNSwgMHg3MDM3LCAweDMxRTcsCisgICAgMHg3MDM4LCAweDMxRUIsIDB4NzAzOSwgMHgzMUVFLCAweDcwM0EsIDB4MzFFRCwgMHg3MDNCLCAweDMxRjEsIDB4NzAzQywKKyAgICAweDMxRTQsIDB4NzAzRSwgMHgxNjFDLCAweDcwM0YsIDB4MzFFQywgMHg3MDQwLCAweDMxRjAsIDB4NzA0MSwgMHgzMUYzLAorICAgIDB4NzA0MiwgMHgzMUVBLCAweDcwNDMsIDB4MzJEOCwgMHg3MDQ0LCAweDMyRDksIDB4NzA0NSwgMHgzMkRELCAweDcwNDYsCisgICAgMHgzMkRFLCAweDcwNDgsIDB4MzJEQiwgMHg3MDQ5LCAweDMyREMsIDB4NzA0QSwgMHgzMkRBLCAweDcwNEMsIDB4MTY3QSwKKyAgICAweDcwNTEsIDB4MTZDOCwgMHg3MDUyLCAweDMzOEMsIDB4NzA1NSwgMHgzMzg5LCAweDcwNTYsIDB4MzM4QSwgMHg3MDU3LAorICAgIDB4MzM4QiwgMHg3MDU4LCAweDE2QzksIDB4NzA1QSwgMHgzNDIzLCAweDcwNUIsIDB4MzQyMiwgMHg3MDVELCAweDM0OEEsCisgICAgMHg3MDVFLCAweDE3MjIsIDB4NzA1RiwgMHgzNDg4LCAweDcwNjAsIDB4MzQ4QiwgMHg3MDYxLCAweDM0ODksIDB4NzA2MiwKKyAgICAweDM0RDAsIDB4NzA2MywgMHgxNzQ0LCAweDcwNjQsIDB4MTc1MiwgMHg3MDY1LCAweDM1MUMsIDB4NzA2NiwgMHgzNTA2LAorICAgIDB4NzA2OCwgMHgzNTFCLCAweDcwNjksIDB4MzU0NywgMHg3MDZBLCAweDM1NDgsIDB4NzA2QiwgMHgwMkU2LCAweDcwNzAsCisgICAgMHgwM0YyLCAweDcwNzEsIDB4MTgwQSwgMHg3MDc0LCAweDE4QzMsIDB4NzA3NiwgMHgwNEU2LCAweDcwNzgsIDB4MDRFOSwKKyAgICAweDcwN0EsIDB4MThDNCwgMHg3MDdDLCAweDA0RTcsIDB4NzA3RCwgMHgwNEU4LCAweDcwODIsIDB4MTlGNywgMHg3MDgzLAorICAgIDB4MTlGOSwgMHg3MDg0LCAweDE5RjQsIDB4NzA4NSwgMHgxOUYxLCAweDcwODYsIDB4MTlGMywgMHg3MDhBLCAweDA2NDMsCisgICAgMHg3MDhFLCAweDA2NDEsIDB4NzA5MSwgMHgxOUY1LCAweDcwOTIsIDB4MDY0MiwgMHg3MDkzLCAweDE5RjIsIDB4NzA5NCwKKyAgICAweDE5RUYsIDB4NzA5NSwgMHgwNjQwLCAweDcwOTYsIDB4MTlGNiwgMHg3MDk4LCAweDE5RjAsIDB4NzA5OSwgMHgwNjQ0LAorICAgIDB4NzA5QSwgMHgxOUY4LCAweDcwOUYsIDB4MUI2NiwgMHg3MEExLCAweDFCNkEsIDB4NzBBNCwgMHgwNzkwLCAweDcwQTksCisgICAgMHgxQjZELCAweDcwQUIsIDB4MDc4OCwgMHg3MEFDLCAweDA3OEIsIDB4NzBBRCwgMHgwNzhELCAweDcwQUUsIDB4MDc4RiwKKyAgICAweDcwQUYsIDB4MDc4QywgMHg3MEIwLCAweDFCNjksIDB4NzBCMSwgMHgxQjY4LCAweDcwQjMsIDB4MDc4QSwgMHg3MEI0LAorICAgIDB4MUI2QiwgMHg3MEI1LCAweDFCNkMsIDB4NzBCNywgMHgxQjY1LCAweDcwQjgsIDB4MDc4RSwgMHg3MEJBLCAweDA3ODksCisgICAgMHg3MEJFLCAweDFCNjcsIDB4NzBDNSwgMHgxRDI3LCAweDcwQzYsIDB4MUQyOCwgMHg3MEM3LCAweDFEMjksIDB4NzBDOCwKKyAgICAweDA5MjEsIDB4NzBDQSwgMHgwOTFELCAweDcwQ0IsIDB4MUQxRSwgMHg3MENELCAweDFEMjYsIDB4NzBDRSwgMHgxRDJCLAorICAgIDB4NzBDRiwgMHgwOTIyLCAweDcwRDEsIDB4MUQxQywgMHg3MEQyLCAweDFEMjIsIDB4NzBEMywgMHgxRDFCLCAweDcwRDQsCisgICAgMHgxRDI1LCAweDcwRDcsIDB4MUQyMSwgMHg3MEQ4LCAweDA5MUUsIDB4NzBEOSwgMHgwOTIwLCAweDcwREEsIDB4MUQyQSwKKyAgICAweDcwREMsIDB4MUQxQSwgMHg3MERELCAweDFEMUQsIDB4NzBERSwgMHgxRDIzLCAweDcwRTAsIDB4MUQyNCwgMHg3MEUxLAorICAgIDB4MUQyQywgMHg3MEUyLCAweDFEMjAsIDB4NzBFNCwgMHgwOTFGLCAweDcwRUYsIDB4MEIxNiwgMHg3MEYwLCAweDFGNzIsCisgICAgMHg3MEYzLCAweDFGNzQsIDB4NzBGNCwgMHgxRjcwLCAweDcwRjYsIDB4MUY3QywgMHg3MEY3LCAweDFGNkUsIDB4NzBGOCwKKyAgICAweDFGN0IsIDB4NzBGOSwgMHgwQjEyLCAweDcwRkEsIDB4MUY2QywgMHg3MEZCLCAweDIxRjIsIDB4NzBGQywgMHgxRjc2LAorICAgIDB4NzBGRCwgMHgwQjE1LCAweDcwRkYsIDB4MUY3NywgMHg3MTAwLCAweDFGN0EsIDB4NzEwMiwgMHgxRjdFLCAweDcxMDQsCisgICAgMHgxRjczLCAweDcxMDYsIDB4MUY3OCwgMHg3MTA5LCAweDBCMTMsIDB4NzEwQSwgMHgwQjE0LCAweDcxMEIsIDB4MUY3RCwKKyAgICAweDcxMEMsIDB4MUY3MSwgMHg3MTBELCAweDFGNkQsIDB4NzEwRSwgMHgxRjdGLCAweDcxMTAsIDB4MUY3NSwgMHg3MTEzLAorICAgIDB4MUY3OSwgMHg3MTE3LCAweDFGNkYsIDB4NzExOSwgMHgwQ0M4LCAweDcxMUEsIDB4MENDOSwgMHg3MTFCLCAweDIxRkMsCisgICAgMHg3MTFDLCAweDBDQ0YsIDB4NzExRSwgMHgyMUYwLCAweDcxMUYsIDB4MjFGOSwgMHg3MTIwLCAweDIxRUYsIDB4NzEyMSwKKyAgICAweDBDQ0MsIDB4NzEyMiwgMHgyMUY3LCAweDcxMjMsIDB4MjFGNSwgMHg3MTI1LCAweDIxRjYsIDB4NzEyNiwgMHgwQ0NBLAorICAgIDB4NzEyOCwgMHgyMUZBLCAweDcxMkUsIDB4MjFGMywgMHg3MTJGLCAweDIxRjEsIDB4NzEzMCwgMHgwQ0NCLCAweDcxMzEsCisgICAgMHgyMUY0LCAweDcxMzIsIDB4MjFGOCwgMHg3MTM2LCAweDBDQ0QsIDB4NzEzQSwgMHgyMUZCLCAweDcxNDEsIDB4MjQ3QiwKKyAgICAweDcxNDIsIDB4MjQ4MiwgMHg3MTQzLCAweDI0ODQsIDB4NzE0NCwgMHgyNDhBLCAweDcxNDYsIDB4MEU3MiwgMHg3MTQ3LAorICAgIDB4MjQ3NiwgMHg3MTQ5LCAweDBFNkEsIDB4NzE0QiwgMHgyNDg1LCAweDcxNEMsIDB4MEU2RiwgMHg3MTRELCAweDI0OEIsCisgICAgMHg3MTRFLCAweDBFNjYsIDB4NzE1MCwgMHgyNDg4LCAweDcxNTIsIDB4MjQ3OCwgMHg3MTUzLCAweDI0ODksIDB4NzE1NCwKKyAgICAweDI0NzcsIDB4NzE1NiwgMHgwRTc0LCAweDcxNTgsIDB4MjQ4MywgMHg3MTU5LCAweDBFNjcsIDB4NzE1QSwgMHgyNDhDLAorICAgIDB4NzE1QywgMHgwRTZDLCAweDcxNUQsIDB4MjQ3QywgMHg3MTVFLCAweDBFNzEsIDB4NzE1RiwgMHgyNDg3LCAweDcxNjAsCisgICAgMHgyNDdBLCAweDcxNjEsIDB4MjQ4MSwgMHg3MTYyLCAweDI0N0QsIDB4NzE2MywgMHgyNDc5LCAweDcxNjQsIDB4MEU2OSwKKyAgICAweDcxNjUsIDB4MEU3MCwgMHg3MTY2LCAweDBFNkUsIDB4NzE2NywgMHgwRTZCLCAweDcxNjgsIDB4MEU3MywgMHg3MTY5LAorICAgIDB4MEU2OCwgMHg3MTZBLCAweDI0ODAsIDB4NzE2QywgMHgwRTZELCAweDcxNkUsIDB4MENDRSwgMHg3MTcwLCAweDI0ODYsCisgICAgMHg3MTcyLCAweDI0N0UsIDB4NzE3OCwgMHgyNDdGLCAweDcxN0IsIDB4MjcxRSwgMHg3MTdELCAweDEwMjMsIDB4NzE4MCwKKyAgICAweDI3MUEsIDB4NzE4MSwgMHgyNzIwLCAweDcxODIsIDB4MjcxQywgMHg3MTg0LCAweDEwMjUsIDB4NzE4NSwgMHgyNzFCLAorICAgIDB4NzE4NiwgMHgyNzFGLCAweDcxODcsIDB4MjcxNywgMHg3MTg5LCAweDI3MTksIDB4NzE4QSwgMHgxMDI0LCAweDcxOEYsCisgICAgMHgyNzFELCAweDcxOTAsIDB4MjcxOCwgMHg3MTkyLCAweDEwMjYsIDB4NzE5NCwgMHgxMDIxLCAweDcxOTcsIDB4MjcyMSwKKyAgICAweDcxOTksIDB4MTAyMiwgMHg3MTlBLCAweDI5NUEsIDB4NzE5QiwgMHgyOTU3LCAweDcxOUMsIDB4Mjk2MywgMHg3MTlELAorICAgIDB4Mjk1RCwgMHg3MTlFLCAweDI5NUYsIDB4NzE5RiwgMHgxMTlFLCAweDcxQTAsIDB4Mjk1OSwgMHg3MUExLCAweDI5NjEsCisgICAgMHg3MUE0LCAweDI5NjAsIDB4NzFBNSwgMHgyOTVFLCAweDcxQTcsIDB4Mjk2NCwgMHg3MUE4LCAweDExQTEsIDB4NzFBOSwKKyAgICAweDI5NUIsIDB4NzFBQSwgMHgyOTYyLCAweDcxQUMsIDB4MTE5RiwgMHg3MUFGLCAweDI5NTYsIDB4NzFCMCwgMHgyOTU4LAorICAgIDB4NzFCMSwgMHgxMUEwLCAweDcxQjIsIDB4Mjk1NSwgMHg3MUIzLCAweDI5NjUsIDB4NzFCNSwgMHgyOTVDLCAweDcxQjgsCisgICAgMHgyQkIzLCAweDcxQjksIDB4MTJGMywgMHg3MUJDLCAweDJCQkUsIDB4NzFCRCwgMHgyQkJDLCAweDcxQkUsIDB4MTJFRCwKKyAgICAweDcxQkYsIDB4MkJCMiwgMHg3MUMwLCAweDJCQjUsIDB4NzFDMSwgMHgyQkI2LCAweDcxQzIsIDB4MkJCMSwgMHg3MUMzLAorICAgIDB4MTJGNywgMHg3MUM0LCAweDEyRjgsIDB4NzFDNSwgMHgyQkIwLCAweDcxQzYsIDB4MkJCRiwgMHg3MUM3LCAweDJCQkEsCisgICAgMHg3MUM4LCAweDEyRjEsIDB4NzFDOSwgMHgxMkVFLCAweDcxQ0EsIDB4MkJCOSwgMHg3MUNCLCAweDJCQjcsIDB4NzFDRSwKKyAgICAweDEyRjQsIDB4NzFDRiwgMHgyQkJCLCAweDcxRDAsIDB4MTJFRiwgMHg3MUQyLCAweDEyRjAsIDB4NzFENCwgMHgyQkI4LAorICAgIDB4NzFENSwgMHgxMkYyLCAweDcxRDYsIDB4MkJCNCwgMHg3MUQ4LCAweDJCQkQsIDB4NzFEOSwgMHgxMkY1LCAweDcxREEsCisgICAgMHgyQkMwLCAweDcxREIsIDB4MkJDMSwgMHg3MURDLCAweDEyRjYsIDB4NzFERiwgMHgxNDA0LCAweDcxRTAsIDB4MTQwQiwKKyAgICAweDcxRTEsIDB4MkQ5QiwgMHg3MUUyLCAweDJEQTEsIDB4NzFFNCwgMHgyRDlGLCAweDcxRTUsIDB4MTQwNywgMHg3MUU2LAorICAgIDB4MTQwNiwgMHg3MUU3LCAweDE0MDMsIDB4NzFFOCwgMHgyRDlELCAweDcxRUMsIDB4MTQwOSwgMHg3MUVELCAweDE0MDgsCisgICAgMHg3MUVFLCAweDE0MDUsIDB4NzFGMCwgMHgyREEwLCAweDcxRjEsIDB4MkQ5QywgMHg3MUYyLCAweDJEOUUsIDB4NzFGNCwKKyAgICAweDE0MEEsIDB4NzFGOCwgMHgxNEYxLCAweDcxRjksIDB4MkY1MiwgMHg3MUZCLCAweDE0RUUsIDB4NzFGQywgMHgxNEVGLAorICAgIDB4NzFGRCwgMHgyRjU0LCAweDcxRkUsIDB4MTRGMCwgMHg3MUZGLCAweDJGNTEsIDB4NzIwMSwgMHgyRjUwLCAweDcyMDIsCisgICAgMHgzMEI5LCAweDcyMDMsIDB4MkY1MywgMHg3MjA1LCAweDMwQkEsIDB4NzIwNiwgMHgxNTkxLCAweDcyMDcsIDB4MzBCOCwKKyAgICAweDcyMEEsIDB4MzBCNywgMHg3MjBDLCAweDMwQjYsIDB4NzIwRCwgMHgxNTkyLCAweDcyMTAsIDB4MTYxRiwgMHg3MjEzLAorICAgIDB4MzFGNCwgMHg3MjE0LCAweDMxRjUsIDB4NzIxOSwgMHgzMkUxLCAweDcyMUEsIDB4MzJFMCwgMHg3MjFCLCAweDE2N0IsCisgICAgMHg3MjFELCAweDMyREYsIDB4NzIxRSwgMHgzMzhELCAweDcyMUYsIDB4MzM4RSwgMHg3MjIyLCAweDM0MjQsIDB4NzIyMywKKyAgICAweDM0OEMsIDB4NzIyNiwgMHgzNEQxLCAweDcyMjcsIDB4MzUzNSwgMHg3MjI4LCAweDE3NjYsIDB4NzIyOSwgMHgzNTQ5LAorICAgIDB4NzIyQSwgMHgwMkU3LCAweDcyMkMsIDB4MDY0NSwgMHg3MjJELCAweDA2NDYsIDB4NzIzMCwgMHgwNzkxLCAweDcyMzUsCisgICAgMHgxNDBDLCAweDcyMzYsIDB4MDJFOCwgMHg3MjM4LCAweDA2NDcsIDB4NzIzOSwgMHgwOTIzLCAweDcyM0EsIDB4MEU3NSwKKyAgICAweDcyM0IsIDB4MDJFOSwgMHg3MjNELCAweDBCMTcsIDB4NzIzRSwgMHgxMDI3LCAweDcyM0YsIDB4MTc4RCwgMHg3MjQxLAorICAgIDB4MUI2RSwgMHg3MjQyLCAweDFEMkQsIDB4NzI0NCwgMHgyNzIyLCAweDcyNDYsIDB4MTQwRCwgMHg3MjQ3LCAweDAyRUEsCisgICAgMHg3MjQ4LCAweDA2NDgsIDB4NzI0OSwgMHgxQjZGLCAweDcyNEEsIDB4MUI3MCwgMHg3MjRCLCAweDIxRkQsIDB4NzI0QywKKyAgICAweDBDRDAsIDB4NzI0RiwgMHgyNDhELCAweDcyNTIsIDB4MEU3NiwgMHg3MjUzLCAweDI3MjMsIDB4NzI1NiwgMHgxMUEyLAorICAgIDB4NzI1OCwgMHgxNTkzLCAweDcyNTksIDB4MDJFQiwgMHg3MjVBLCAweDIxRkUsIDB4NzI1QiwgMHgwMkVDLCAweDcyNUQsCisgICAgMHgwM0Y0LCAweDcyNUUsIDB4MTgwQiwgMHg3MjVGLCAweDAzRjMsIDB4NzI2MCwgMHgwNEVDLCAweDcyNjEsIDB4MDRFQiwKKyAgICAweDcyNjIsIDB4MDRFQSwgMHg3MjYzLCAweDE4QzUsIDB4NzI2NywgMHgwNjQ5LCAweDcyNjksIDB4MDY0QSwgMHg3MjZBLAorICAgIDB4MTlGQSwgMHg3MjZDLCAweDFCNzEsIDB4NzI2RSwgMHgxQjc0LCAweDcyNkYsIDB4MDc5MywgMHg3MjcwLCAweDFCNzIsCisgICAgMHg3MjcyLCAweDA3OTIsIDB4NzI3MywgMHgxQjczLCAweDcyNzQsIDB4MDc5NCwgMHg3Mjc2LCAweDFEMzAsIDB4NzI3NywKKyAgICAweDFEMkYsIDB4NzI3OCwgMHgxRDJFLCAweDcyNzksIDB4MDkyNCwgMHg3MjdCLCAweDFGODEsIDB4NzI3QywgMHgxRjgyLAorICAgIDB4NzI3RCwgMHgwQjE4LCAweDcyN0UsIDB4MUY4MCwgMHg3MjdGLCAweDFGODMsIDB4NzI4MCwgMHgwQ0QyLCAweDcyODEsCisgICAgMHgwQjE5LCAweDcyODQsIDB4MENEMSwgMHg3Mjg1LCAweDIyMDIsIDB4NzI4NiwgMHgyMjAxLCAweDcyODgsIDB4MjFGRiwKKyAgICAweDcyODksIDB4MjIwMCwgMHg3MjhCLCAweDIyMDMsIDB4NzI4QywgMHgyNDhGLCAweDcyOEQsIDB4MjQ4RSwgMHg3MjhFLAorICAgIDB4MjQ5MiwgMHg3MjkwLCAweDI0OTEsIDB4NzI5MSwgMHgyNDkwLCAweDcyOTIsIDB4MTAyOCwgMHg3MjkzLCAweDI3MjYsCisgICAgMHg3Mjk1LCAweDI3MjUsIDB4NzI5NiwgMHgxMDI5LCAweDcyOTcsIDB4MjcyNCwgMHg3Mjk4LCAweDI5NjYsIDB4NzI5QSwKKyAgICAweDI5NjcsIDB4NzI5QiwgMHgxMUEzLCAweDcyOUQsIDB4MkJDMiwgMHg3MjlFLCAweDJCQzMsIDB4NzJBMSwgMHgzMEJGLAorICAgIDB4NzJBMiwgMHgxNTk0LCAweDcyQTMsIDB4MzBCRSwgMHg3MkE0LCAweDMwQkQsIDB4NzJBNSwgMHgzMEJCLCAweDcyQTYsCisgICAgMHgzMEJDLCAweDcyQTcsIDB4MTY3QywgMHg3MkE4LCAweDMxRjYsIDB4NzJBOSwgMHgzMzhGLCAweDcyQUEsIDB4MzREMiwKKyAgICAweDcyQUMsIDB4MDJFRCwgMHg3MkFFLCAweDE3QUYsIDB4NzJBRiwgMHgwMzU1LCAweDcyQjAsIDB4MTdCMCwgMHg3MkI0LAorICAgIDB4MTgwQywgMHg3MkI1LCAweDE4MEQsIDB4NzJCQSwgMHgxOENCLCAweDcyQkQsIDB4MThDNywgMHg3MkJGLCAweDE4QzYsCisgICAgMHg3MkMwLCAweDA2NEIsIDB4NzJDMSwgMHgxOENBLCAweDcyQzIsIDB4MDRFRSwgMHg3MkMzLCAweDE4QzgsIDB4NzJDNCwKKyAgICAweDA0RUQsIDB4NzJDNSwgMHgxOENDLCAweDcyQzYsIDB4MThDOSwgMHg3MkM5LCAweDE5RkUsIDB4NzJDQSwgMHgxQjc1LAorICAgIDB4NzJDQiwgMHgxOUZDLCAweDcyQ0MsIDB4MUEwMywgMHg3MkNFLCAweDA2NEMsIDB4NzJEMCwgMHgwNjRGLCAweDcyRDEsCisgICAgMHgxQTA0LCAweDcyRDIsIDB4MUEwMCwgMHg3MkQ0LCAweDFBMDEsIDB4NzJENiwgMHgxOUZCLCAweDcyRDcsIDB4MDY0RSwKKyAgICAweDcyRDgsIDB4MTlGRCwgMHg3MkQ5LCAweDA2NEQsIDB4NzJEQSwgMHgxQTAyLCAweDcyREMsIDB4MTlGRiwgMHg3MkRGLAorICAgIDB4MUI3OSwgMHg3MkUwLCAweDA3OTYsIDB4NzJFMSwgMHgwNzk3LCAweDcyRTMsIDB4MUI3QywgMHg3MkU0LCAweDFCNzYsCisgICAgMHg3MkU2LCAweDFCN0IsIDB4NzJFOCwgMHgxQjc3LCAweDcyRTksIDB4MDc5NSwgMHg3MkVBLCAweDFCN0EsIDB4NzJFQiwKKyAgICAweDFCNzgsIDB4NzJGMywgMHgxRDM2LCAweDcyRjQsIDB4MUQzMywgMHg3MkY2LCAweDFEMzUsIDB4NzJGNywgMHgwOTI5LAorICAgIDB4NzJGOCwgMHgwOTI4LCAweDcyRjksIDB4MDkyNiwgMHg3MkZBLCAweDFEMzIsIDB4NzJGQiwgMHgxRDM3LCAweDcyRkMsCisgICAgMHgwOTI1LCAweDcyRkQsIDB4MDkyNywgMHg3MkZFLCAweDFEMzQsIDB4NzJGRiwgMHgxRjhCLCAweDczMDAsIDB4MUQzMSwKKyAgICAweDczMDEsIDB4MUQzOCwgMHg3MzA3LCAweDFGODYsIDB4NzMwOCwgMHgxRjhBLCAweDczMEEsIDB4MUY4OSwgMHg3MzBCLAorICAgIDB4MjIwNSwgMHg3MzBDLCAweDIyMTAsIDB4NzMwRiwgMHgxRjhDLCAweDczMTEsIDB4MUY4NywgMHg3MzEyLCAweDIyMDQsCisgICAgMHg3MzEzLCAweDBCMUQsIDB4NzMxNiwgMHgwQjFDLCAweDczMTcsIDB4MUY4NSwgMHg3MzE4LCAweDFGODgsIDB4NzMxOSwKKyAgICAweDBCMUUsIDB4NzMxQiwgMHgwQjFCLCAweDczMUMsIDB4MEIxQSwgMHg3MzFELCAweDFGODQsIDB4NzMxRSwgMHgxRjhELAorICAgIDB4NzMyMiwgMHgyMjA3LCAweDczMjMsIDB4MjIwRSwgMHg3MzI1LCAweDBDRDQsIDB4NzMyNiwgMHgyMjBELCAweDczMjcsCisgICAgMHgyMjBBLCAweDczMjksIDB4MENENiwgMHg3MzJELCAweDIyMEMsIDB4NzMzMCwgMHgyMjA2LCAweDczMzEsIDB4MjIwOCwKKyAgICAweDczMzIsIDB4MjIwQiwgMHg3MzMzLCAweDIyMDksIDB4NzMzNCwgMHgwQ0Q1LCAweDczMzUsIDB4MjIwRiwgMHg3MzM2LAorICAgIDB4MENEMywgMHg3MzM3LCAweDBFNzcsIDB4NzMzQSwgMHgyNDk2LCAweDczM0IsIDB4MjQ5NSwgMHg3MzNDLCAweDI0OTMsCisgICAgMHg3MzNFLCAweDBFN0EsIDB4NzMzRiwgMHgwRTc5LCAweDczNDAsIDB4MjQ5NywgMHg3MzQyLCAweDI0OTQsIDB4NzM0MywKKyAgICAweDI3MjcsIDB4NzM0NCwgMHgxMDJBLCAweDczNDUsIDB4MEU3OCwgMHg3MzQ5LCAweDI0OTksIDB4NzM0QSwgMHgyNDk4LAorICAgIDB4NzM0QywgMHgyNzJBLCAweDczNEQsIDB4MjcyOCwgMHg3MzRFLCAweDExQTQsIDB4NzM1MCwgMHgxMDJCLCAweDczNTEsCisgICAgMHgyNzI5LCAweDczNTIsIDB4Mjk2OSwgMHg3MzU3LCAweDExQTUsIDB4NzM1OCwgMHgyOTY4LCAweDczNTksIDB4Mjk3MSwKKyAgICAweDczNUEsIDB4Mjk3MCwgMHg3MzVCLCAweDI5NkUsIDB4NzM1RCwgMHgyOTZELCAweDczNUUsIDB4Mjk2QSwgMHg3MzVGLAorICAgIDB4Mjk2QiwgMHg3MzYwLCAweDI5NkMsIDB4NzM2MSwgMHgyOTZGLCAweDczNjIsIDB4Mjk3MiwgMHg3MzY1LCAweDJCQzgsCisgICAgMHg3MzY2LCAweDJCQzUsIDB4NzM2NywgMHgyQkM2LCAweDczNjgsIDB4MTJGOSwgMHg3MzY5LCAweDJCQzQsIDB4NzM2QSwKKyAgICAweDJCQ0EsIDB4NzM2QiwgMHgyQkM5LCAweDczNkMsIDB4MkJDNywgMHg3MzZFLCAweDJEQTMsIDB4NzM2RiwgMHgyREE0LAorICAgIDB4NzM3MCwgMHgxNDBFLCAweDczNzIsIDB4MTQwRiwgMHg3MzczLCAweDJEQTIsIDB4NzM3NSwgMHgxNEYzLCAweDczNzYsCisgICAgMHgyRjU1LCAweDczNzcsIDB4MTRGMiwgMHg3Mzc4LCAweDE1OTUsIDB4NzM3QSwgMHgxNTk2LCAweDczN0IsIDB4MTYyMCwKKyAgICAweDczN0MsIDB4MzFGOCwgMHg3MzdELCAweDMxRjcsIDB4NzM3RSwgMHgzMkUyLCAweDczN0YsIDB4MzM5MCwgMHg3MzgwLAorICAgIDB4MTZDQSwgMHg3MzgxLCAweDM0MjYsIDB4NzM4MiwgMHgzNDI1LCAweDczODMsIDB4MzQyNywgMHg3Mzg0LCAweDAzNTYsCisgICAgMHg3Mzg1LCAweDFCN0QsIDB4NzM4NiwgMHgwOTJBLCAweDczODcsIDB4MEIxRiwgMHg3Mzg4LCAweDFGOEUsIDB4NzM4OSwKKyAgICAweDAzNTcsIDB4NzM4QSwgMHgxN0IxLCAweDczOEIsIDB4MDJFRSwgMHg3MzhFLCAweDE4MEUsIDB4NzM5MiwgMHgxOEQxLAorICAgIDB4NzM5MywgMHgxOENGLCAweDczOTQsIDB4MThEMCwgMHg3Mzk1LCAweDE4Q0QsIDB4NzM5NiwgMHgwNEVGLCAweDczOTcsCisgICAgMHgxOENFLCAweDczOUQsIDB4MUEwQywgMHg3MzlGLCAweDA2NTIsIDB4NzNBMCwgMHgxQTBBLCAweDczQTEsIDB4MUEwNiwKKyAgICAweDczQTIsIDB4MUEwOSwgMHg3M0E0LCAweDFBMDUsIDB4NzNBNSwgMHgwNjU0LCAweDczQTYsIDB4MUEwOCwgMHg3M0E4LAorICAgIDB4MDY1MSwgMHg3M0E5LCAweDA2NTAsIDB4NzNBQiwgMHgwNjUzLCAweDczQUMsIDB4MUEwQiwgMHg3M0FELCAweDFBMDcsCisgICAgMHg3M0IyLCAweDA3OUIsIDB4NzNCMywgMHgwNzlFLCAweDczQjQsIDB4MUI4NSwgMHg3M0I1LCAweDFCODQsIDB4NzNCNiwKKyAgICAweDFCODMsIDB4NzNCNywgMHgwNzk4LCAweDczQjgsIDB4MUI4QywgMHg3M0I5LCAweDFCODIsIDB4NzNCQiwgMHgwNzlBLAorICAgIDB4NzNCQywgMHgxRDNELCAweDczQkUsIDB4MUI4OSwgMHg3M0JGLCAweDFCODcsIDB4NzNDMCwgMHgwNzlELCAweDczQzIsCisgICAgMHgxQjdGLCAweDczQzMsIDB4MUI4QSwgMHg3M0M1LCAweDFCODEsIDB4NzNDNiwgMHgxQjhCLCAweDczQzcsIDB4MUI4OCwKKyAgICAweDczQzgsIDB4MUI4MCwgMHg3M0NBLCAweDA3OTksIDB4NzNDQiwgMHgxQjhELCAweDczQ0MsIDB4MUI3RSwgMHg3M0NELAorICAgIDB4MDc5QywgMHg3M0QyLCAweDFENDIsIDB4NzNEMywgMHgxRDM5LCAweDczRDQsIDB4MUQ0NCwgMHg3M0Q2LCAweDFEM0MsCisgICAgMHg3M0Q3LCAweDFENDcsIDB4NzNEOCwgMHgxRDQ4LCAweDczRDksIDB4MUQzQSwgMHg3M0RBLCAweDFENDYsIDB4NzNEQiwKKyAgICAweDFENDMsIDB4NzNEQywgMHgxRDQxLCAweDczREQsIDB4MUQ0NSwgMHg3M0RFLCAweDA5MzAsIDB4NzNFMCwgMHgwOTJFLAorICAgIDB4NzNFMywgMHgxRDNGLCAweDczRTUsIDB4MUQzQiwgMHg3M0U3LCAweDFEM0UsIDB4NzNFOCwgMHgxRDQ5LCAweDczRTksCisgICAgMHgxRDQwLCAweDczRUEsIDB4MDkyRiwgMHg3M0VCLCAweDFCODYsIDB4NzNFRCwgMHgwOTJCLCAweDczRUUsIDB4MDkyRCwKKyAgICAweDczRjQsIDB4MUY5QywgMHg3M0Y1LCAweDFGOTEsIDB4NzNGNiwgMHgxRjhGLCAweDczRjgsIDB4MUY5MCwgMHg3M0ZBLAorICAgIDB4MUY5NywgMHg3M0ZDLCAweDFGOTgsIDB4NzNGRCwgMHgxRjk0LCAweDczRkUsIDB4MEIyNCwgMHg3M0ZGLCAweDFGOTksCisgICAgMHg3NDAwLCAweDFGOTYsIDB4NzQwMSwgMHgxRjkzLCAweDc0MDMsIDB4MEIyMiwgMHg3NDA0LCAweDFGOTIsIDB4NzQwNSwKKyAgICAweDBCMjAsIDB4NzQwNiwgMHgwQjIzLCAweDc0MDcsIDB4MUY5NSwgMHg3NDA4LCAweDFGOUQsIDB4NzQwOSwgMHgwOTJDLAorICAgIDB4NzQwQSwgMHgwQjIxLCAweDc0MEIsIDB4MUY5QiwgMHg3NDBDLCAweDFGOUEsIDB4NzQwRCwgMHgwQjI1LCAweDc0MTYsCisgICAgMHgyMjE1LCAweDc0MUEsIDB4MjIxNiwgMHg3NDFCLCAweDBDRTAsIDB4NzQxRCwgMHgyMjFDLCAweDc0MjAsIDB4MjIxRSwKKyAgICAweDc0MjEsIDB4MjIxNywgMHg3NDIyLCAweDBDREEsIDB4NzQyMywgMHgyMjFCLCAweDc0MjQsIDB4MjIxQSwgMHg3NDI1LAorICAgIDB4MENEQiwgMHg3NDI2LCAweDBDRTEsIDB4NzQyOCwgMHgwQ0UyLCAweDc0MjksIDB4MjIxRCwgMHg3NDJBLCAweDBDRDgsCisgICAgMHg3NDJCLCAweDIyMTQsIDB4NzQyQywgMHgyMjEyLCAweDc0MkQsIDB4MjIxOCwgMHg3NDJFLCAweDIyMTEsIDB4NzQyRiwKKyAgICAweDBDREYsIDB4NzQzMCwgMHgyMjEzLCAweDc0MzEsIDB4MjIxOSwgMHg3NDMyLCAweDIyMUYsIDB4NzQzMywgMHgwQ0Q5LAorICAgIDB4NzQzNCwgMHgwQ0RFLCAweDc0MzUsIDB4MENEQywgMHg3NDM2LCAweDBDREQsIDB4NzQzQSwgMHgwQ0Q3LCAweDc0M0YsCisgICAgMHgwRTgxLCAweDc0NDAsIDB4MjRBMCwgMHg3NDQxLCAweDBFODAsIDB4NzQ0MiwgMHgyNEE0LCAweDc0NDQsIDB4MjQ5QSwKKyAgICAweDc0NDYsIDB4MjRBNSwgMHg3NDRBLCAweDI0OUIsIDB4NzQ0QiwgMHgyNDlDLCAweDc0NEQsIDB4MjRBNiwgMHg3NDRFLAorICAgIDB4MjRBMywgMHg3NDRGLCAweDI0QTEsIDB4NzQ1MCwgMHgyNEEyLCAweDc0NTEsIDB4MjQ5RSwgMHg3NDUyLCAweDI0OUQsCisgICAgMHg3NDU0LCAweDI0QTcsIDB4NzQ1NSwgMHgwRTdELCAweDc0NTcsIDB4MjQ5RiwgMHg3NDU5LCAweDBFODIsIDB4NzQ1QSwKKyAgICAweDBFN0MsIDB4NzQ1QiwgMHgwRTgzLCAweDc0NUMsIDB4MEU4NCwgMHg3NDVFLCAweDBFN0YsIDB4NzQ1RiwgMHgwRTdFLAorICAgIDB4NzQ2MiwgMHgyNzJCLCAweDc0NjMsIDB4MTAyRCwgMHg3NDY0LCAweDEwMkMsIDB4NzQ2NywgMHgyNzMwLCAweDc0NjksCisgICAgMHgxMUE2LCAweDc0NkEsIDB4MTAyRSwgMHg3NDZELCAweDEwMzAsIDB4NzQ2RSwgMHgyNzMxLCAweDc0NkYsIDB4MEU3QiwKKyAgICAweDc0NzAsIDB4MTAyRiwgMHg3NDcxLCAweDI3MkQsIDB4NzQ3MiwgMHgyNzJGLCAweDc0NzMsIDB4MjcyQywgMHg3NDc1LAorICAgIDB4MjcyRSwgMHg3NDc5LCAweDI5N0MsIDB4NzQ3QywgMHgyOTdCLCAweDc0N0QsIDB4Mjk3OCwgMHg3NDdFLCAweDExQTksCisgICAgMHg3NDdGLCAweDJCQ0IsIDB4NzQ4MCwgMHgxMUFBLCAweDc0ODEsIDB4Mjk3NywgMHg3NDgzLCAweDExQTgsIDB4NzQ4NSwKKyAgICAweDI5NzksIDB4NzQ4NiwgMHgyOTc2LCAweDc0ODcsIDB4Mjk3MywgMHg3NDg4LCAweDI5N0EsIDB4NzQ4OSwgMHgyOTc0LAorICAgIDB4NzQ4QSwgMHgyOTc1LCAweDc0OEIsIDB4MTFBNywgMHg3NDkwLCAweDJEQTgsIDB4NzQ5MiwgMHgyQkNGLCAweDc0OTQsCisgICAgMHgyQkNFLCAweDc0OTUsIDB4MkJEMCwgMHg3NDk3LCAweDJEQTUsIDB4NzQ5OCwgMHgxMkZDLCAweDc0OUEsIDB4MkJDQywKKyAgICAweDc0OUMsIDB4MTJGQSwgMHg3NDlFLCAweDEyRkUsIDB4NzQ5RiwgMHgxMkZELCAweDc0QTAsIDB4MkJDRCwgMHg3NEExLAorICAgIDB4MkJEMSwgMHg3NEEzLCAweDEyRkIsIDB4NzRBNSwgMHgyREFDLCAweDc0QTYsIDB4MTQxMiwgMHg3NEE3LCAweDE0RjQsCisgICAgMHg3NEE4LCAweDE0MTMsIDB4NzRBOSwgMHgxNDEwLCAweDc0QUEsIDB4MkRBOSwgMHg3NEFCLCAweDJEQTcsIDB4NzRBRCwKKyAgICAweDJEQUEsIDB4NzRBRiwgMHgyREFELCAweDc0QjAsIDB4MTQxMSwgMHg3NEIxLCAweDJEQUIsIDB4NzRCMiwgMHgyREE2LAorICAgIDB4NzRCNSwgMHgyRjU4LCAweDc0QjYsIDB4MkY1QiwgMHg3NEI3LCAweDMwQzIsIDB4NzRCOCwgMHgyRjU2LCAweDc0QkEsCisgICAgMHgzMUY5LCAweDc0QkIsIDB4MkY1QywgMHg3NEJELCAweDE1OTcsIDB4NzRCRSwgMHgyRjVBLCAweDc0QkYsIDB4MTRGNSwKKyAgICAweDc0QzAsIDB4MkY1NywgMHg3NEMxLCAweDJGNTksIDB4NzRDMiwgMHgyRjVELCAweDc0QzMsIDB4MzBDMywgMHg3NEM1LAorICAgIDB4MzBDMSwgMHg3NENBLCAweDE1OTgsIDB4NzRDQiwgMHgzMEMwLCAweDc0Q0YsIDB4MTYyMSwgMHg3NEQ0LCAweDE2N0UsCisgICAgMHg3NEQ1LCAweDMzOTIsIDB4NzRENiwgMHgxNjdELCAweDc0RDcsIDB4MzM5NCwgMHg3NEQ4LCAweDMzOTEsIDB4NzREOSwKKyAgICAweDMzOTMsIDB4NzREQSwgMHgxNkZFLCAweDc0REIsIDB4MzQ4RCwgMHg3NERDLCAweDAzNTgsIDB4NzRERCwgMHgxQTBELAorICAgIDB4NzRERSwgMHgxRDRBLCAweDc0REYsIDB4MUQ0QiwgMHg3NEUwLCAweDBCMjYsIDB4NzRFMSwgMHgyNEE4LCAweDc0RTIsCisgICAgMHgxMkZGLCAweDc0RTMsIDB4MTU5OSwgMHg3NEU0LCAweDE2Q0IsIDB4NzRFNSwgMHgzNDhFLCAweDc0RTYsIDB4MDM1OSwKKyAgICAweDc0RTgsIDB4MUEwRSwgMHg3NEU5LCAweDAxMjAsIDB4NzRFQywgMHgxQjhFLCAweDc0RUUsIDB4MUI4RiwgMHg3NEY0LAorICAgIDB4MUQ0QywgMHg3NEY1LCAweDFENEQsIDB4NzRGNiwgMHgwQjI3LCAweDc0RjcsIDB4MEIyOCwgMHg3NEZCLCAweDIyMjAsCisgICAgMHg3NEZELCAweDI0QUIsIDB4NzRGRSwgMHgyNEFBLCAweDc0RkYsIDB4MjRBOSwgMHg3NTAwLCAweDI3MzIsIDB4NzUwMiwKKyAgICAweDI3MzMsIDB4NzUwMywgMHgyNzM0LCAweDc1MDQsIDB4MTAzMSwgMHg3NTA3LCAweDI5N0UsIDB4NzUwOCwgMHgyOTdELAorICAgIDB4NzUwQiwgMHgyQkQyLCAweDc1MEMsIDB4MTMwMCwgMHg3NTBELCAweDEzMDEsIDB4NzUwRiwgMHgyREIxLCAweDc1MTAsCisgICAgMHgyREFFLCAweDc1MTEsIDB4MkRBRiwgMHg3NTEyLCAweDJEQjAsIDB4NzUxMywgMHgyRjVGLCAweDc1MTQsIDB4MkY1RSwKKyAgICAweDc1MTUsIDB4MTRGNiwgMHg3NTE2LCAweDMwQzQsIDB4NzUxNywgMHgzMkUzLCAweDc1MTgsIDB4MDM1QSwgMHg3NTFBLAorICAgIDB4MDc5RiwgMHg3NTFDLCAweDBCMjksIDB4NzUxRCwgMHgyNEFDLCAweDc1MUYsIDB4MDM1QiwgMHg3NTIxLCAweDFENEUsCisgICAgMHg3NTIyLCAweDBCMkEsIDB4NzUyNSwgMHgwQ0UzLCAweDc1MjYsIDB4MENFNCwgMHg3NTI4LCAweDAzNUMsIDB4NzUyOSwKKyAgICAweDAzNUQsIDB4NzUyQSwgMHgxODBGLCAweDc1MkIsIDB4MDRGMSwgMHg3NTJDLCAweDA0RjAsIDB4NzUyRCwgMHgwN0EwLAorICAgIDB4NzUyRSwgMHgxQjkwLCAweDc1MkYsIDB4MjIyMSwgMHg3NTMwLCAweDAzNUUsIDB4NzUzMSwgMHgwMzVGLCAweDc1MzIsCisgICAgMHgwMzYwLCAweDc1MzMsIDB4MDM2MSwgMHg3NTM3LCAweDA0RjIsIDB4NzUzOCwgMHgwNEYzLCAweDc1MzksIDB4MThEMywKKyAgICAweDc1M0EsIDB4MThEMiwgMHg3NTNELCAweDA2NTUsIDB4NzUzRSwgMHgxQTExLCAweDc1M0YsIDB4MUEwRiwgMHg3NTQwLAorICAgIDB4MUExMCwgMHg3NTQ3LCAweDFCOTEsIDB4NzU0OCwgMHgxQjkyLCAweDc1NEIsIDB4MDdBNCwgMHg3NTRDLCAweDA3QTIsCisgICAgMHg3NTRFLCAweDA3QTMsIDB4NzU0RiwgMHgwN0ExLCAweDc1NTQsIDB4MDkzMSwgMHg3NTU5LCAweDA5MzUsIDB4NzU1QSwKKyAgICAweDA5MzQsIDB4NzU1QiwgMHgxRDRGLCAweDc1NUMsIDB4MDkzMywgMHg3NTVELCAweDA5MzIsIDB4NzU1RiwgMHgxRDUwLAorICAgIDB4NzU2MiwgMHgwQjJELCAweDc1NjMsIDB4MUY5RiwgMHg3NTY0LCAweDFGOUUsIDB4NzU2NSwgMHgwQjJCLCAweDc1NjYsCisgICAgMHgwQjJDLCAweDc1NkEsIDB4MENFNiwgMHg3NTZCLCAweDBDRTUsIDB4NzU2QywgMHgyMjIzLCAweDc1NkYsIDB4MjIyMiwKKyAgICAweDc1NzAsIDB4MEIyRSwgMHg3NTc2LCAweDBFODUsIDB4NzU3NywgMHgyNEFFLCAweDc1NzgsIDB4MEU4NiwgMHg3NTc5LAorICAgIDB4MjRBRCwgMHg3NTdELCAweDI3MzUsIDB4NzU3RSwgMHgyOTdGLCAweDc1N0YsIDB4MTFBQiwgMHg3NTgwLCAweDJCRDMsCisgICAgMHg3NTg0LCAweDJEQjIsIDB4NzU4NiwgMHgxNTlCLCAweDc1ODcsIDB4MTU5QSwgMHg3NThBLCAweDE2Q0MsIDB4NzU4QiwKKyAgICAweDAzNjIsIDB4NzU4QywgMHgxQTEyLCAweDc1OEYsIDB4MEIyRiwgMHg3NTkwLCAweDI3MzYsIDB4NzU5MSwgMHgxMDMyLAorICAgIDB4NzU5MiwgMHgwMjJFLCAweDc1OTQsIDB4MThENCwgMHg3NTk1LCAweDE4RDUsIDB4NzU5OCwgMHgxQTEzLCAweDc1OTksCisgICAgMHgwNjU3LCAweDc1OUEsIDB4MDY1OCwgMHg3NTlELCAweDA2NTYsIDB4NzVBMiwgMHgwN0E4LCAweDc1QTMsIDB4MDdBOSwKKyAgICAweDc1QTQsIDB4MDdBNiwgMHg3NUE1LCAweDA3QTcsIDB4NzVBNywgMHgxQjkzLCAweDc1QUEsIDB4MUI5NCwgMHg3NUFCLAorICAgIDB4MDdBNSwgMHg3NUIwLCAweDFENTEsIDB4NzVCMiwgMHgwOTM5LCAweDc1QjMsIDB4MDkzQSwgMHg3NUI1LCAweDBCMzIsCisgICAgMHg3NUI2LCAweDFENTcsIDB4NzVCOCwgMHgwOTNGLCAweDc1QjksIDB4MDkzRCwgMHg3NUJBLCAweDFENTgsIDB4NzVCQiwKKyAgICAweDFENTMsIDB4NzVCQywgMHgwOTNDLCAweDc1QkQsIDB4MDkzQiwgMHg3NUJFLCAweDA5MzYsIDB4NzVCRiwgMHgxRDU2LAorICAgIDB4NzVDMCwgMHgxRDU1LCAweDc1QzEsIDB4MUQ1MiwgMHg3NUMyLCAweDA5M0UsIDB4NzVDNCwgMHgxRDU0LCAweDc1QzUsCisgICAgMHgwOTM3LCAweDc1QzcsIDB4MDkzOCwgMHg3NUNBLCAweDBCMzMsIDB4NzVDQiwgMHgxRkEzLCAweDc1Q0MsIDB4MUZBNCwKKyAgICAweDc1Q0QsIDB4MEIzNCwgMHg3NUNFLCAweDFGQTAsIDB4NzVDRiwgMHgxRkEyLCAweDc1RDAsIDB4MUZBNiwgMHg3NUQxLAorICAgIDB4MUZBNSwgMHg3NUQyLCAweDFGQTEsIDB4NzVENCwgMHgwQjMwLCAweDc1RDUsIDB4MEIzMSwgMHg3NUQ3LCAweDIyMkIsCisgICAgMHg3NUQ4LCAweDBDRUIsIDB4NzVEOSwgMHgwQ0VBLCAweDc1REEsIDB4MjIyNSwgMHg3NURCLCAweDBDRTgsIDB4NzVERCwKKyAgICAweDIyMjgsIDB4NzVERSwgMHgwQ0VDLCAweDc1REYsIDB4MjIyOSwgMHg3NUUwLCAweDBDRUQsIDB4NzVFMSwgMHgyMjI2LAorICAgIDB4NzVFMiwgMHgwQ0U3LCAweDc1RTMsIDB4MENFOSwgMHg3NUU0LCAweDIyMkEsIDB4NzVFNiwgMHgyMjI3LCAweDc1RTcsCisgICAgMHgyMjI0LCAweDc1RUQsIDB4MjRCQiwgMHg3NUVGLCAweDI0QjAsIDB4NzVGMCwgMHgwRTg4LCAweDc1RjEsIDB4MEU4QiwKKyAgICAweDc1RjIsIDB4MEU4QSwgMHg3NUYzLCAweDBFOEYsIDB4NzVGNCwgMHgwRThFLCAweDc1RjUsIDB4MjRCQywgMHg3NUY2LAorICAgIDB4MjRCQSwgMHg3NUY3LCAweDI0QjMsIDB4NzVGOCwgMHgyNEI3LCAweDc1RjksIDB4MjRCNiwgMHg3NUZBLCAweDBFOEMsCisgICAgMHg3NUZCLCAweDI0QjksIDB4NzVGQywgMHgyNEI1LCAweDc1RkQsIDB4MjRCRCwgMHg3NUZFLCAweDI0QjQsIDB4NzVGRiwKKyAgICAweDBFOEQsIDB4NzYwMCwgMHgwRTg3LCAweDc2MDEsIDB4MEU4OSwgMHg3NjAzLCAweDI0QjIsIDB4NzYwOCwgMHgyNzM4LAorICAgIDB4NzYwOSwgMHgxMDM2LCAweDc2MEEsIDB4MjczQywgMHg3NjBCLCAweDEwMzUsIDB4NzYwQywgMHgyNzM5LCAweDc2MEQsCisgICAgMHgxMDM0LCAweDc2MEYsIDB4MjRCMSwgMHg3NjEwLCAweDI0QjgsIDB4NzYxMSwgMHgyNzNCLCAweDc2MTMsIDB4MTAzNywKKyAgICAweDc2MTQsIDB4MjczRCwgMHg3NjE1LCAweDI3M0EsIDB4NzYxNiwgMHgyNzM3LCAweDc2MTksIDB4Mjk4MiwgMHg3NjFBLAorICAgIDB4Mjk4NiwgMHg3NjFCLCAweDI5ODgsIDB4NzYxQywgMHgyOTg0LCAweDc2MUQsIDB4Mjk4MywgMHg3NjFFLCAweDI5ODEsCisgICAgMHg3NjFGLCAweDExQUUsIDB4NzYyMCwgMHgxMUFDLCAweDc2MjEsIDB4MTFCMSwgMHg3NjIyLCAweDExQjIsIDB4NzYyMywKKyAgICAweDI5ODUsIDB4NzYyNCwgMHgxMUFGLCAweDc2MjUsIDB4Mjk4MCwgMHg3NjI2LCAweDExQjAsIDB4NzYyNywgMHgxMDMzLAorICAgIDB4NzYyOCwgMHgyOTg3LCAweDc2MjksIDB4MTFBRCwgMHg3NjJELCAweDJCRDUsIDB4NzYyRiwgMHgyQkQ0LCAweDc2MzAsCisgICAgMHgyQkRDLCAweDc2MzEsIDB4MkJENiwgMHg3NjMyLCAweDJCREIsIDB4NzYzMywgMHgyQkQ4LCAweDc2MzQsIDB4MTMwMiwKKyAgICAweDc2MzUsIDB4MkJEQSwgMHg3NjM4LCAweDEzMDMsIDB4NzYzQSwgMHgxMzA0LCAweDc2M0MsIDB4MkJEOSwgMHg3NjNELAorICAgIDB4MkJENywgMHg3NjQyLCAweDE0MTUsIDB4NzY0MywgMHgyREIzLCAweDc2NDYsIDB4MTQxNCwgMHg3NjQ3LCAweDJEQjYsCisgICAgMHg3NjQ4LCAweDJEQjQsIDB4NzY0OSwgMHgyREI1LCAweDc2NEMsIDB4MTQxNiwgMHg3NjUwLCAweDJGNjMsIDB4NzY1MiwKKyAgICAweDE0RjksIDB4NzY1MywgMHgyRjY0LCAweDc2NTYsIDB4MTRGNywgMHg3NjU3LCAweDJGNjUsIDB4NzY1OCwgMHgxNEY4LAorICAgIDB4NzY1OSwgMHgyRjYyLCAweDc2NUEsIDB4MkY2NiwgMHg3NjVDLCAweDJGNjAsIDB4NzY1RiwgMHgxNTlDLCAweDc2NjAsCisgICAgMHgzMEM1LCAweDc2NjEsIDB4MTU5RCwgMHg3NjYyLCAweDE2MjIsIDB4NzY2NCwgMHgyRjYxLCAweDc2NjUsIDB4MTYyMywKKyAgICAweDc2NjksIDB4MTY3RiwgMHg3NjZBLCAweDMyRTQsIDB4NzY2QywgMHgxNkNFLCAweDc2NkQsIDB4MzM5NSwgMHg3NjZFLAorICAgIDB4MTZDRCwgMHg3NjcwLCAweDM0MjgsIDB4NzY3MSwgMHgxNzIzLCAweDc2NzIsIDB4MTcyNCwgMHg3Njc1LCAweDM1NDMsCisgICAgMHg3Njc2LCAweDAyMkYsIDB4NzY3OCwgMHgwN0FBLCAweDc2NzksIDB4MUI5NSwgMHg3NjdCLCAweDBDRUUsIDB4NzY3QywKKyAgICAweDBDRUYsIDB4NzY3RCwgMHgwMzYzLCAweDc2N0UsIDB4MDNGNSwgMHg3NjdGLCAweDE4MTAsIDB4NzY4MSwgMHgxOEQ2LAorICAgIDB4NzY4MiwgMHgwNEY0LCAweDc2ODQsIDB4MDY1OSwgMHg3Njg2LCAweDA3QUIsIDB4NzY4NywgMHgwN0FDLCAweDc2ODgsCisgICAgMHgwN0FELCAweDc2ODksIDB4MUZBOCwgMHg3NjhBLCAweDFENTksIDB4NzY4QiwgMHgwOTQwLCAweDc2OEUsIDB4MEIzNSwKKyAgICAweDc2OEYsIDB4MUZBNywgMHg3NjkyLCAweDIyMkQsIDB4NzY5MywgMHgwQ0YxLCAweDc2OTUsIDB4MjIyQywgMHg3Njk2LAorICAgIDB4MENGMCwgMHg3Njk5LCAweDI0QkUsIDB4NzY5QSwgMHgxMUIzLCAweDc2OUIsIDB4Mjk4QywgMHg3NjlDLCAweDI5ODksCisgICAgMHg3NjlELCAweDI5OEEsIDB4NzY5RSwgMHgyOThCLCAweDc2QTQsIDB4MkRCNywgMHg3NkE2LCAweDJGNjcsIDB4NzZBQSwKKyAgICAweDMxRkIsIDB4NzZBQiwgMHgzMUZBLCAweDc2QUQsIDB4MzM5NiwgMHg3NkFFLCAweDAzNjQsIDB4NzZBRiwgMHgxQTE0LAorICAgIDB4NzZCMCwgMHgwOTQxLCAweDc2QjQsIDB4MENGMiwgMHg3NkI1LCAweDI0QkYsIDB4NzZCOCwgMHgyNzNFLCAweDc2QkEsCisgICAgMHgxMUI0LCAweDc2QkIsIDB4MkJERCwgMHg3NkJELCAweDJGNjgsIDB4NzZCRSwgMHgzMUZDLCAweDc2QkYsIDB4MDM2NSwKKyAgICAweDc2QzIsIDB4MDY1QSwgMHg3NkMzLCAweDA3QjAsIDB4NzZDNCwgMHgxQjk2LCAweDc2QzUsIDB4MDdCMSwgMHg3NkM2LAorICAgIDB4MDdBRiwgMHg3NkM4LCAweDA3QUUsIDB4NzZDOSwgMHgxRDVBLCAweDc2Q0EsIDB4MDk0MiwgMHg3NkNELCAweDA5NDMsCisgICAgMHg3NkNFLCAweDA5NDQsIDB4NzZEMiwgMHgwQjM3LCAweDc2RDMsIDB4MUZBOSwgMHg3NkQ0LCAweDBCMzYsIDB4NzZEQSwKKyAgICAweDIyMkUsIDB4NzZEQiwgMHgwQjM4LCAweDc2REMsIDB4MENGMywgMHg3NkRELCAweDI0QzAsIDB4NzZERSwgMHgwRTkwLAorICAgIDB4NzZERiwgMHgwRTkxLCAweDc2RTEsIDB4MTAzOCwgMHg3NkUzLCAweDEwMzksIDB4NzZFNCwgMHgxMUI1LCAweDc2RTUsCisgICAgMHgxMzA2LCAweDc2RTYsIDB4MkJERSwgMHg3NkU3LCAweDEzMDUsIDB4NzZFOSwgMHgyREI4LCAweDc2RUEsIDB4MTQxNywKKyAgICAweDc2RUMsIDB4MkY2OSwgMHg3NkVELCAweDMxRkQsIDB4NzZFRSwgMHgwMzY2LCAweDc2RUYsIDB4MDRGNSwgMHg3NkYwLAorICAgIDB4MUExNywgMHg3NkYxLCAweDFBMTYsIDB4NzZGMiwgMHgwNjVCLCAweDc2RjMsIDB4MUExNSwgMHg3NkY0LCAweDA2NUMsCisgICAgMHg3NkY1LCAweDFBMTgsIDB4NzZGNywgMHgxQjlDLCAweDc2RjgsIDB4MDdCNCwgMHg3NkY5LCAweDA3QjMsIDB4NzZGQSwKKyAgICAweDFCOUUsIDB4NzZGQiwgMHgxQjlELCAweDc2RkMsIDB4MDdCOCwgMHg3NkZFLCAweDA3QjcsIDB4NzcwMSwgMHgwN0IyLAorICAgIDB4NzcwMywgMHgxQjk4LCAweDc3MDQsIDB4MUI5OSwgMHg3NzA1LCAweDFCOUEsIDB4NzcwNywgMHgwN0I5LCAweDc3MDgsCisgICAgMHgxQjk3LCAweDc3MDksIDB4MDdCNSwgMHg3NzBBLCAweDFCOUIsIDB4NzcwQiwgMHgwN0I2LCAweDc3MTAsIDB4MUQ1RCwKKyAgICAweDc3MTEsIDB4MUQ2MSwgMHg3NzEyLCAweDFENUYsIDB4NzcxMywgMHgxRDVFLCAweDc3MTUsIDB4MUQ2MiwgMHg3NzE5LAorICAgIDB4MUQ2MywgMHg3NzFBLCAweDFENjQsIDB4NzcxQiwgMHgxRDVDLCAweDc3MUQsIDB4MUQ1QiwgMHg3NzFGLCAweDA5NDYsCisgICAgMHg3NzIwLCAweDA5NDcsIDB4NzcyMiwgMHgxRDY1LCAweDc3MjMsIDB4MUQ2MCwgMHg3NzI1LCAweDFGQjIsIDB4NzcyNywKKyAgICAweDFENjYsIDB4NzcyOCwgMHgwOTQ4LCAweDc3MjksIDB4MDk0NSwgMHg3NzJELCAweDFGQUMsIDB4NzcyRiwgMHgxRkFCLAorICAgIDB4NzczMSwgMHgxRkFELCAweDc3MzIsIDB4MUZBRSwgMHg3NzMzLCAweDFGQjAsIDB4NzczNCwgMHgxRkFGLCAweDc3MzUsCisgICAgMHgxRkI0LCAweDc3MzYsIDB4MEIzQywgMHg3NzM3LCAweDBCMzksIDB4NzczOCwgMHgwQjNELCAweDc3MzksIDB4MUZBQSwKKyAgICAweDc3M0EsIDB4MEIzRSwgMHg3NzNCLCAweDFGQjMsIDB4NzczQywgMHgwQjNCLCAweDc3M0QsIDB4MUZCMSwgMHg3NzNFLAorICAgIDB4MEIzQSwgMHg3NzQ0LCAweDIyMzEsIDB4Nzc0NSwgMHgyMjMzLCAweDc3NDYsIDB4MjIyRiwgMHg3NzQ3LCAweDIyMzAsCisgICAgMHg3NzRBLCAweDIyMzQsIDB4Nzc0QiwgMHgyMjM2LCAweDc3NEMsIDB4MjIzNywgMHg3NzRELCAweDIyMzIsIDB4Nzc0RSwKKyAgICAweDIyMzUsIDB4Nzc0RiwgMHgwQ0Y0LCAweDc3NTIsIDB4MjRDNCwgMHg3NzU0LCAweDI0QzksIDB4Nzc1NSwgMHgyNEMxLAorICAgIDB4Nzc1NiwgMHgyNEM1LCAweDc3NTksIDB4MjRDQSwgMHg3NzVBLCAweDI0QzYsIDB4Nzc1QiwgMHgwRTkyLCAweDc3NUMsCisgICAgMHgwRTlBLCAweDc3NUUsIDB4MEU5NSwgMHg3NzVGLCAweDI0QzIsIDB4Nzc2MCwgMHgyNEMzLCAweDc3NjEsIDB4MTAzRCwKKyAgICAweDc3NjIsIDB4MEU5RCwgMHg3NzYzLCAweDBFOTYsIDB4Nzc2NSwgMHgwRTlCLCAweDc3NjYsIDB4MEU5NCwgMHg3NzY3LAorICAgIDB4MjRDOCwgMHg3NzY4LCAweDBFOUMsIDB4Nzc2OSwgMHgyNEM3LCAweDc3NkEsIDB4MEU5OCwgMHg3NzZCLCAweDBFOTMsCisgICAgMHg3NzZDLCAweDBFOTksIDB4Nzc2RCwgMHgyNENCLCAweDc3NkUsIDB4Mjc0MywgMHg3NzZGLCAweDI3NDUsIDB4Nzc3OSwKKyAgICAweDBFOTcsIDB4Nzc3QywgMHgyNzQwLCAweDc3N0QsIDB4MTAzQiwgMHg3NzdFLCAweDI3NDYsIDB4Nzc3RiwgMHgxMDNDLAorICAgIDB4Nzc4MCwgMHgyNzQ0LCAweDc3ODEsIDB4MjczRiwgMHg3NzgyLCAweDI3NDIsIDB4Nzc4MywgMHgyNzQ3LCAweDc3ODQsCisgICAgMHgxMDNBLCAweDc3ODUsIDB4Mjc0MSwgMHg3Nzg3LCAweDExQjcsIDB4Nzc4OCwgMHgyOTkwLCAweDc3ODksIDB4Mjk4RiwKKyAgICAweDc3OEIsIDB4MTFCQSwgMHg3NzhDLCAweDExQjgsIDB4Nzc4RCwgMHgyOThELCAweDc3OEUsIDB4MTFCNiwgMHg3NzhGLAorICAgIDB4Mjk4RSwgMHg3NzkxLCAweDExQjksIDB4Nzc5NSwgMHgyQkU2LCAweDc3OTcsIDB4MkJFOCwgMHg3Nzk5LCAweDJCRTcsCisgICAgMHg3NzlBLCAweDJCREYsIDB4Nzc5QiwgMHgyQkUzLCAweDc3OUMsIDB4MkJFMiwgMHg3NzlELCAweDJCRTAsIDB4Nzc5RSwKKyAgICAweDEzMDgsIDB4Nzc5RiwgMHgxMzA5LCAweDc3QTAsIDB4MTMwNywgMHg3N0ExLCAweDJCRTEsIDB4NzdBMiwgMHgyQkU0LAorICAgIDB4NzdBMywgMHgyQkU1LCAweDc3QTUsIDB4MTMwQSwgMHg3N0E3LCAweDE0MUMsIDB4NzdBOCwgMHgyREMwLCAweDc3QUEsCisgICAgMHgxNDE5LCAweDc3QUIsIDB4MkRCQSwgMHg3N0FDLCAweDE0MUIsIDB4NzdBRCwgMHgxNDFELCAweDc3QjAsIDB4MTQxQSwKKyAgICAweDc3QjEsIDB4MkRCRiwgMHg3N0IyLCAweDJEQkIsIDB4NzdCMywgMHgxNDE4LCAweDc3QjQsIDB4MkRCRSwgMHg3N0I1LAorICAgIDB4MkRCOSwgMHg3N0I2LCAweDJEQkQsIDB4NzdCNywgMHgyREJDLCAweDc3QkEsIDB4MkY2QiwgMHg3N0JCLCAweDE0RkMsCisgICAgMHg3N0JDLCAweDE0RkQsIDB4NzdCRCwgMHgxNEZBLCAweDc3QkYsIDB4MTRGQiwgMHg3N0MyLCAweDJGNkEsIDB4NzdDNCwKKyAgICAweDMwQzgsIDB4NzdDNywgMHgxNTlFLCAweDc3QzksIDB4MzBDNiwgMHg3N0NBLCAweDMwQzcsIDB4NzdDQywgMHgzMUZFLAorICAgIDB4NzdDRCwgMHgzMjAxLCAweDc3Q0UsIDB4MzFGRiwgMHg3N0NGLCAweDMyMDAsIDB4NzdEMCwgMHgzMkU1LCAweDc3RDMsCisgICAgMHgxNjgwLCAweDc3RDQsIDB4MzQyOSwgMHg3N0Q1LCAweDM0OEYsIDB4NzdENywgMHgxNzI1LCAweDc3RDgsIDB4MzREMywKKyAgICAweDc3RDksIDB4MzRENCwgMHg3N0RBLCAweDE3NTMsIDB4NzdEQiwgMHgwMzY3LCAweDc3REMsIDB4MDdCQSwgMHg3N0RFLAorICAgIDB4MjIzOCwgMHg3N0UwLCAweDI0Q0MsIDB4NzdFMiwgMHgwMzY4LCAweDc3RTMsIDB4MDRGNiwgMHg3N0U1LCAweDA2NUQsCisgICAgMHg3N0U3LCAweDFCOUYsIDB4NzdFOCwgMHgxQkEwLCAweDc3RTksIDB4MDk0OSwgMHg3N0VDLCAweDIyMzksIDB4NzdFRCwKKyAgICAweDBDRjUsIDB4NzdFRSwgMHgwRTlFLCAweDc3RUYsIDB4MTQxRSwgMHg3N0YwLCAweDJEQzEsIDB4NzdGMSwgMHgzMEM5LAorICAgIDB4NzdGMiwgMHgzMjAyLCAweDc3RjMsIDB4MDM2OSwgMHg3N0Y3LCAweDFBMUUsIDB4NzdGOCwgMHgxQTE5LCAweDc3RjksCisgICAgMHgxQTFCLCAweDc3RkEsIDB4MUExRCwgMHg3N0ZCLCAweDFBMUMsIDB4NzdGQywgMHgxQTFBLCAweDc3RkQsIDB4MDY1RSwKKyAgICAweDc4MDIsIDB4MDdCQiwgMHg3ODAzLCAweDFCQTksIDB4NzgwNSwgMHgxQkE0LCAweDc4MDYsIDB4MUJBMSwgMHg3ODA5LAorICAgIDB4MUJBOCwgMHg3ODBDLCAweDA3QkQsIDB4NzgwRCwgMHgwN0JFLCAweDc4MEUsIDB4MUJBNywgMHg3ODBGLCAweDFCQTYsCisgICAgMHg3ODEwLCAweDFCQTUsIDB4NzgxMSwgMHgxQkEyLCAweDc4MTIsIDB4MUJBMywgMHg3ODEzLCAweDFCQUEsIDB4NzgxNCwKKyAgICAweDA3QkMsIDB4NzgxRCwgMHgwOTRELCAweDc4MUYsIDB4MDk1MywgMHg3ODIwLCAweDA5NTIsIDB4NzgyMSwgMHgxRDZGLAorICAgIDB4NzgyMiwgMHgxRDY5LCAweDc4MjMsIDB4MUQ2NywgMHg3ODI1LCAweDA5NTAsIDB4NzgyNiwgMHgxRkJCLCAweDc4MjcsCisgICAgMHgwOTRCLCAweDc4MjgsIDB4MUQ2QywgMHg3ODI5LCAweDFENzAsIDB4NzgyQSwgMHgxRDcyLCAweDc4MkIsIDB4MUQ2RSwKKyAgICAweDc4MkMsIDB4MUQ2OCwgMHg3ODJELCAweDA5NTEsIDB4NzgyRSwgMHgxRDZELCAweDc4MkYsIDB4MUQ2QiwgMHg3ODMwLAorICAgIDB4MDk0QSwgMHg3ODMxLCAweDFENzMsIDB4NzgzMiwgMHgwOTU0LCAweDc4MzMsIDB4MUQ3MSwgMHg3ODM0LCAweDA5NEUsCisgICAgMHg3ODM1LCAweDFENkEsIDB4NzgzNywgMHgwOTRGLCAweDc4MzgsIDB4MDk0QywgMHg3ODQzLCAweDBCNDAsIDB4Nzg0NSwKKyAgICAweDFGQkMsIDB4Nzg0OCwgMHgxRkI1LCAweDc4NDksIDB4MUZCNywgMHg3ODRBLCAweDFGQjksIDB4Nzg0QywgMHgxRkJBLAorICAgIDB4Nzg0RCwgMHgxRkI4LCAweDc4NEUsIDB4MEI0MSwgMHg3ODUwLCAweDFGQkQsIDB4Nzg1MiwgMHgxRkI2LCAweDc4NUMsCisgICAgMHgyMjNELCAweDc4NUQsIDB4MENGNiwgMHg3ODVFLCAweDIyNDUsIDB4Nzg2MCwgMHgyMjNBLCAweDc4NjIsIDB4MjI0NiwKKyAgICAweDc4NjQsIDB4MjIzQiwgMHg3ODY1LCAweDIyM0MsIDB4Nzg2OCwgMHgyMjQ0LCAweDc4NjksIDB4MjI0MywgMHg3ODZBLAorICAgIDB4MjI0MCwgMHg3ODZCLCAweDBCM0YsIDB4Nzg2QywgMHgwQ0Y3LCAweDc4NkQsIDB4MjIzRSwgMHg3ODZFLCAweDIyNDEsCisgICAgMHg3ODZGLCAweDBDRjgsIDB4Nzg3MCwgMHgyMjQyLCAweDc4NzEsIDB4MjIzRiwgMHg3ODc5LCAweDI0RDcsIDB4Nzg3QiwKKyAgICAweDI0REIsIDB4Nzg3QywgMHgwRUE1LCAweDc4N0UsIDB4Mjc0RCwgMHg3ODdGLCAweDBFQTgsIDB4Nzg4MCwgMHgyNEQ5LAorICAgIDB4Nzg4MSwgMHgzNkU4LCAweDc4ODMsIDB4MjRENiwgMHg3ODg0LCAweDI0RDEsIDB4Nzg4NSwgMHgyNEQzLCAweDc4ODYsCisgICAgMHgyNEQ0LCAweDc4ODcsIDB4MjRDRCwgMHg3ODg5LCAweDBFQTQsIDB4Nzg4QywgMHgwRUEzLCAweDc4OEUsIDB4MEU5RiwKKyAgICAweDc4OEYsIDB4MjREMCwgMHg3ODkxLCAweDBFQTYsIDB4Nzg5MywgMHgwRUE3LCAweDc4OTQsIDB4MjRDRiwgMHg3ODk1LAorICAgIDB4MjREMiwgMHg3ODk2LCAweDI0REEsIDB4Nzg5NywgMHgwRUExLCAweDc4OTgsIDB4MEVBMiwgMHg3ODk5LCAweDI0RDgsCisgICAgMHg3ODlBLCAweDI0Q0UsIDB4Nzg5RSwgMHgyNzRGLCAweDc4OUYsIDB4MTAzRiwgMHg3OEEwLCAweDI3NTEsIDB4NzhBMSwKKyAgICAweDI0RDUsIDB4NzhBMiwgMHgyNzUzLCAweDc4QTMsIDB4MTA0MywgMHg3OEE0LCAweDI3NTQsIDB4NzhBNSwgMHgyNzUwLAorICAgIDB4NzhBNywgMHgxMDQwLCAweDc4QTgsIDB4Mjc0QywgMHg3OEE5LCAweDEwNDIsIDB4NzhBQSwgMHgyNzQ5LCAweDc4QUIsCisgICAgMHgyNzRFLCAweDc4QUMsIDB4Mjc1MiwgMHg3OEFELCAweDI3NEIsIDB4NzhCMCwgMHgwRUEwLCAweDc4QjIsIDB4Mjc0OCwKKyAgICAweDc4QjMsIDB4MTA0MSwgMHg3OEI0LCAweDI3NEEsIDB4NzhCQSwgMHgxMUJELCAweDc4QkIsIDB4Mjk5MiwgMHg3OEJDLAorICAgIDB4MTFDMSwgMHg3OEJFLCAweDExQkYsIDB4NzhDMSwgMHgxMDNFLCAweDc4QzMsIDB4Mjk5OSwgMHg3OEM0LCAweDI5OUEsCisgICAgMHg3OEM1LCAweDExQkMsIDB4NzhDOCwgMHgyOTk4LCAweDc4QzksIDB4Mjk5QiwgMHg3OENBLCAweDExQkUsIDB4NzhDQiwKKyAgICAweDExQkIsIDB4NzhDQywgMHgyOTk0LCAweDc4Q0QsIDB4Mjk5MSwgMHg3OENFLCAweDI5OTYsIDB4NzhDRiwgMHgyOTkzLAorICAgIDB4NzhEMCwgMHgxMUMyLCAweDc4RDEsIDB4Mjk5NSwgMHg3OEQ0LCAweDI5OTcsIDB4NzhENSwgMHgxMUMwLCAweDc4REEsCisgICAgMHgxMzBDLCAweDc4REIsIDB4MkJFRiwgMHg3OERELCAweDJCRTksIDB4NzhERSwgMHgyQkVELCAweDc4REYsIDB4MkJGMywKKyAgICAweDc4RTAsIDB4MkJGNCwgMHg3OEUxLCAweDJCRjAsIDB4NzhFMiwgMHgyQkYxLCAweDc4RTMsIDB4MkJFRSwgMHg3OEU1LAorICAgIDB4MkJFQiwgMHg3OEU3LCAweDEzMEUsIDB4NzhFOCwgMHgxMzBCLCAweDc4RTksIDB4MkJFQSwgMHg3OEVBLCAweDJCRUMsCisgICAgMHg3OEVDLCAweDEzMEQsIDB4NzhFRCwgMHgyQkYyLCAweDc4RUYsIDB4MTQyMiwgMHg3OEYyLCAweDJEQzgsIDB4NzhGMywKKyAgICAweDJEQzIsIDB4NzhGNCwgMHgxNDIxLCAweDc4RjcsIDB4MTQxRiwgMHg3OEY5LCAweDJEQ0EsIDB4NzhGQSwgMHgxNDIwLAorICAgIDB4NzhGQiwgMHgyREM1LCAweDc4RkMsIDB4MkRDNiwgMHg3OEZELCAweDJEQzMsIDB4NzhGRSwgMHgyRENCLCAweDc4RkYsCisgICAgMHgyREM3LCAweDc5MDEsIDB4MTQyMywgMHg3OTAyLCAweDJEQzQsIDB4NzkwNCwgMHgyRENDLCAweDc5MDUsIDB4MkRDOSwKKyAgICAweDc5MDksIDB4MkY2RiwgMHg3OTBDLCAweDJGNkMsIDB4NzkwRSwgMHgxNEZFLCAweDc5MTAsIDB4MkY3MCwgMHg3OTExLAorICAgIDB4MkY3MiwgMHg3OTEyLCAweDJGNzEsIDB4NzkxMywgMHgyRjZELCAweDc5MTQsIDB4MkY2RSwgMHg3OTE3LCAweDMwQ0UsCisgICAgMHg3OTE5LCAweDE1OUYsIDB4NzkxQiwgMHgzMENCLCAweDc5MUMsIDB4MzBDRCwgMHg3OTFELCAweDMwQ0EsIDB4NzkxRSwKKyAgICAweDMwQ0YsIDB4NzkyMSwgMHgzMENDLCAweDc5MjMsIDB4MzIwNCwgMHg3OTI0LCAweDMyMDcsIDB4NzkyNSwgMHgzMjAzLAorICAgIDB4NzkyNiwgMHgxNjI0LCAweDc5MjcsIDB4MzIwNSwgMHg3OTI4LCAweDMyMDYsIDB4NzkyOSwgMHgzMjA4LCAweDc5MkEsCisgICAgMHgxNjI1LCAweDc5MkIsIDB4MTYyNywgMHg3OTJDLCAweDE2MjYsIDB4NzkyRCwgMHgzMkU2LCAweDc5MkYsIDB4MzJFOCwKKyAgICAweDc5MzEsIDB4MzJFNywgMHg3OTM1LCAweDMzOTcsIDB4NzkzOCwgMHgzNDkwLCAweDc5MzksIDB4MzRENSwgMHg3OTNBLAorICAgIDB4MDM2QSwgMHg3OTNELCAweDE4RDcsIDB4NzkzRSwgMHgwNjVGLCAweDc5M0YsIDB4MUEyMCwgMHg3OTQwLCAweDA2NjAsCisgICAgMHg3OTQxLCAweDA2NjEsIDB4Nzk0MiwgMHgxQTFGLCAweDc5NDQsIDB4MUJBRiwgMHg3OTQ1LCAweDFCQUUsIDB4Nzk0NiwKKyAgICAweDA3QkYsIDB4Nzk0NywgMHgwN0MyLCAweDc5NDgsIDB4MDdDMSwgMHg3OTQ5LCAweDA3QzAsIDB4Nzk0QSwgMHgxQkFCLAorICAgIDB4Nzk0QiwgMHgxQkFELCAweDc5NEMsIDB4MUJBQywgMHg3OTRGLCAweDFENzYsIDB4Nzk1MCwgMHgwOTU2LCAweDc5NTEsCisgICAgMHgxRDdBLCAweDc5NTIsIDB4MUQ3OSwgMHg3OTUzLCAweDFENzgsIDB4Nzk1NCwgMHgxRDc0LCAweDc5NTUsIDB4MDk1NSwKKyAgICAweDc5NTYsIDB4MDk1OSwgMHg3OTU3LCAweDA5NUMsIDB4Nzk1QSwgMHgwOTVELCAweDc5NUIsIDB4MUQ3NSwgMHg3OTVDLAorICAgIDB4MUQ3NywgMHg3OTVELCAweDA5NUIsIDB4Nzk1RSwgMHgwOTVBLCAweDc5NUYsIDB4MDk1OCwgMHg3OTYwLCAweDA5NTcsCisgICAgMHg3OTYxLCAweDFGQzQsIDB4Nzk2MywgMHgxRkMyLCAweDc5NjQsIDB4MUZCRSwgMHg3OTY1LCAweDBCNDIsIDB4Nzk2NywKKyAgICAweDFGQkYsIDB4Nzk2OCwgMHgwQjQzLCAweDc5NjksIDB4MUZDMCwgMHg3OTZBLCAweDFGQzEsIDB4Nzk2QiwgMHgxRkMzLAorICAgIDB4Nzk2RCwgMHgwQjQ0LCAweDc5NzAsIDB4MjI0QSwgMHg3OTcyLCAweDIyNDksIDB4Nzk3MywgMHgyMjQ4LCAweDc5NzQsCisgICAgMHgyMjQ3LCAweDc5NzksIDB4MjRERiwgMHg3OTdBLCAweDBFQTksIDB4Nzk3QywgMHgyNERDLCAweDc5N0QsIDB4MjRERSwKKyAgICAweDc5N0YsIDB4MEVBQSwgMHg3OTgxLCAweDBFQUIsIDB4Nzk4MiwgMHgyNERELCAweDc5ODgsIDB4Mjc1RCwgMHg3OThBLAorICAgIDB4Mjc1NiwgMHg3OThCLCAweDI3NTcsIDB4Nzk4RCwgMHgxMDQ2LCAweDc5OEUsIDB4MTA0NCwgMHg3OThGLCAweDEwNDUsCisgICAgMHg3OTkwLCAweDI3NUYsIDB4Nzk5MiwgMHgyNzVFLCAweDc5OTMsIDB4Mjc1QiwgMHg3OTk0LCAweDI3NUEsIDB4Nzk5NSwKKyAgICAweDI3NTksIDB4Nzk5NiwgMHgyNzU4LCAweDc5OTcsIDB4Mjc1QywgMHg3OTk4LCAweDI3NTUsIDB4Nzk5QSwgMHgyOTlDLAorICAgIDB4Nzk5QiwgMHgyOUExLCAweDc5OUMsIDB4Mjk5RiwgMHg3OUEwLCAweDI5OUUsIDB4NzlBMSwgMHgyOTlELCAweDc5QTIsCisgICAgMHgyOUEwLCAweDc5QTQsIDB4MkJGNSwgMHg3OUE2LCAweDEzMEYsIDB4NzlBNywgMHgxNDI0LCAweDc5QTgsIDB4MkRDRSwKKyAgICAweDc5QUEsIDB4MTQyNSwgMHg3OUFCLCAweDJEQ0QsIDB4NzlBQywgMHgyRjc0LCAweDc5QUQsIDB4MkY3MywgMHg3OUFFLAorICAgIDB4MTRGRiwgMHg3OUIwLCAweDMwRDAsIDB4NzlCMSwgMHgxNUEwLCAweDc5QjIsIDB4MzIwOSwgMHg3OUIzLCAweDE2Q0YsCisgICAgMHg3OUI0LCAweDMzOTgsIDB4NzlCNiwgMHgzNDkyLCAweDc5QjcsIDB4MzQ5MSwgMHg3OUI4LCAweDE3QjIsIDB4NzlCOSwKKyAgICAweDA3QzMsIDB4NzlCQSwgMHgwN0M0LCAweDc5QkIsIDB4MUZDNSwgMHg3OUJELCAweDBFQUQsIDB4NzlCRSwgMHgwMzZCLAorICAgIDB4NzlCRiwgMHgwNEY5LCAweDc5QzAsIDB4MDRGOCwgMHg3OUMxLCAweDA0RjcsIDB4NzlDNSwgMHgxQTIxLCAweDc5QzgsCisgICAgMHgwNjYzLCAweDc5QzksIDB4MDY2MiwgMHg3OUNCLCAweDA3QzcsIDB4NzlDRCwgMHgxQkIxLCAweDc5Q0UsIDB4MUJCNCwKKyAgICAweDc5Q0YsIDB4MUJCMiwgMHg3OUQxLCAweDA3QzUsIDB4NzlEMiwgMHgwN0M2LCAweDc5RDUsIDB4MUJCMCwgMHg3OUQ2LAorICAgIDB4MUJCMywgMHg3OUQ4LCAweDA5NjQsIDB4NzlEQywgMHgxRDgxLCAweDc5REQsIDB4MUQ4MywgMHg3OURFLCAweDFEODIsCisgICAgMHg3OURGLCAweDA5NjEsIDB4NzlFMCwgMHgxRDdELCAweDc5RTMsIDB4MDk1RiwgMHg3OUU0LCAweDA5NUUsIDB4NzlFNiwKKyAgICAweDA5NjIsIDB4NzlFNywgMHgwOTYwLCAweDc5RTksIDB4MDk2MywgMHg3OUVBLCAweDFEODAsIDB4NzlFQiwgMHgxRDdCLAorICAgIDB4NzlFQywgMHgxRDdDLCAweDc5RUQsIDB4MUQ3RiwgMHg3OUVFLCAweDFEN0UsIDB4NzlGNiwgMHgxRkM4LCAweDc5RjcsCisgICAgMHgxRkM5LCAweDc5RjgsIDB4MUZDNywgMHg3OUZBLCAweDFGQzYsIDB4NzlGQiwgMHgwQjQ1LCAweDdBMDAsIDB4MENGRCwKKyAgICAweDdBMDIsIDB4MjI0QiwgMHg3QTAzLCAweDIyNEQsIDB4N0EwNCwgMHgyMjRGLCAweDdBMDUsIDB4MENGQywgMHg3QTA4LAorICAgIDB4MENGQSwgMHg3QTBBLCAweDIyNEMsIDB4N0EwQiwgMHgwQ0ZCLCAweDdBMEMsIDB4MjI0RSwgMHg3QTBELCAweDBDRjksCisgICAgMHg3QTEwLCAweDI0RTksIDB4N0ExMSwgMHgyNEUwLCAweDdBMTIsIDB4MjRFMywgMHg3QTEzLCAweDI0RTcsIDB4N0ExNCwKKyAgICAweDBFQjEsIDB4N0ExNSwgMHgyNEU1LCAweDdBMTcsIDB4MjRFNCwgMHg3QTE4LCAweDI0RTEsIDB4N0ExOSwgMHgyNEUyLAorICAgIDB4N0ExQSwgMHgwRUFGLCAweDdBMUIsIDB4MjRFOCwgMHg3QTFDLCAweDBFQUUsIDB4N0ExRSwgMHgwRUIzLCAweDdBMUYsCisgICAgMHgwRUIyLCAweDdBMjAsIDB4MEVCMCwgMHg3QTIyLCAweDI0RTYsIDB4N0EyNiwgMHgyNzY1LCAweDdBMjgsIDB4Mjc2NCwKKyAgICAweDdBMkIsIDB4Mjc2MCwgMHg3QTJFLCAweDEwNDcsIDB4N0EyRiwgMHgyNzYzLCAweDdBMzAsIDB4Mjc2MiwgMHg3QTMxLAorICAgIDB4MTA0OCwgMHg3QTM3LCAweDExQzcsIDB4N0EzOSwgMHgyOUEzLCAweDdBM0IsIDB4MTFDOCwgMHg3QTNDLCAweDExQzQsCisgICAgMHg3QTNELCAweDExQzYsIDB4N0EzRiwgMHgxMUMzLCAweDdBNDAsIDB4MTFDNSwgMHg3QTQ0LCAweDJCRjYsIDB4N0E0NiwKKyAgICAweDEzMTIsIDB4N0E0NywgMHgyQkY4LCAweDdBNDgsIDB4MkJGNywgMHg3QTRBLCAweDI3NjEsIDB4N0E0QiwgMHgxMzE0LAorICAgIDB4N0E0QywgMHgxMzEzLCAweDdBNEQsIDB4MTMxMCwgMHg3QTRFLCAweDEzMTEsIDB4N0E1NCwgMHgyREQzLCAweDdBNTYsCisgICAgMHgyREQxLCAweDdBNTcsIDB4MTQyNiwgMHg3QTU4LCAweDJERDIsIDB4N0E1QSwgMHgyREQ0LCAweDdBNUIsIDB4MkREMCwKKyAgICAweDdBNUMsIDB4MkRDRiwgMHg3QTVGLCAweDJGNzUsIDB4N0E2MCwgMHgxNTAyLCAweDdBNjEsIDB4MTUwMCwgMHg3QTYyLAorICAgIDB4MTUwMSwgMHg3QTY3LCAweDMwRDEsIDB4N0E2OCwgMHgzMEQyLCAweDdBNjksIDB4MTVBMiwgMHg3QTZCLCAweDE1QTEsCisgICAgMHg3QTZDLCAweDMyMEIsIDB4N0E2RCwgMHgzMjBDLCAweDdBNkUsIDB4MzIwQSwgMHg3QTcwLCAweDMzOTksIDB4N0E3MSwKKyAgICAweDMzOUEsIDB4N0E3NCwgMHgwMzZDLCAweDdBNzUsIDB4MTgxMSwgMHg3QTc2LCAweDA0RkEsIDB4N0E3OCwgMHgxQTIyLAorICAgIDB4N0E3OSwgMHgwNjY1LCAweDdBN0EsIDB4MDY2NCwgMHg3QTdCLCAweDFBMjMsIDB4N0E3RSwgMHgxQkI2LCAweDdBN0YsCisgICAgMHgwN0M4LCAweDdBODAsIDB4MUJCNSwgMHg3QTgxLCAweDA3QzksIDB4N0E4NCwgMHgwOTY1LCAweDdBODUsIDB4MUQ4NiwKKyAgICAweDdBODYsIDB4MUQ4NCwgMHg3QTg3LCAweDFEOEEsIDB4N0E4OCwgMHgwOTY2LCAweDdBODksIDB4MUQ4NSwgMHg3QThBLAorICAgIDB4MUQ4OSwgMHg3QThCLCAweDFEODcsIDB4N0E4QywgMHgxRDg4LCAweDdBOEYsIDB4MUZDQSwgMHg3QTkwLCAweDFGQ0MsCisgICAgMHg3QTkyLCAweDBCNDYsIDB4N0E5NCwgMHgxRkNCLCAweDdBOTUsIDB4MEI0NywgMHg3QTk2LCAweDBEMDAsIDB4N0E5NywKKyAgICAweDBDRkYsIDB4N0E5OCwgMHgwQ0ZFLCAweDdBOTksIDB4MjI1MCwgMHg3QTlFLCAweDI0RUMsIDB4N0E5RiwgMHgwRUI0LAorICAgIDB4N0FBMCwgMHgwRUI1LCAweDdBQTIsIDB4MjRFQiwgMHg3QUEzLCAweDI0RUEsIDB4N0FBOCwgMHgyNzY2LCAweDdBQTksCisgICAgMHgxMDRBLCAweDdBQUEsIDB4MTA0OSwgMHg3QUFCLCAweDI3NjcsIDB4N0FBQywgMHgyNzY4LCAweDdBQUUsIDB4MTFDQSwKKyAgICAweDdBQUYsIDB4MTFDOSwgMHg3QUIxLCAweDJCRkMsIDB4N0FCMiwgMHgyOUE0LCAweDdBQjMsIDB4MjlBNiwgMHg3QUI0LAorICAgIDB4MjlBNSwgMHg3QUI1LCAweDJCRkIsIDB4N0FCNiwgMHgyQkY5LCAweDdBQjcsIDB4MkJGRCwgMHg3QUI4LCAweDJCRkEsCisgICAgMHg3QUJBLCAweDEzMTUsIDB4N0FCRSwgMHgyREQ1LCAweDdBQkYsIDB4MTQyNywgMHg3QUMwLCAweDJERDYsIDB4N0FDMSwKKyAgICAweDJERDcsIDB4N0FDNCwgMHgxNTAzLCAweDdBQzUsIDB4MTUwNCwgMHg3QUM3LCAweDE2MjgsIDB4N0FDQSwgMHgxNkZGLAorICAgIDB4N0FDQiwgMHgwMzZELCAweDdBRDEsIDB4MUJCNywgMHg3QUQ4LCAweDFEOEIsIDB4N0FEOSwgMHgwOTY3LCAweDdBREYsCisgICAgMHgwQkRFLCAweDdBRTAsIDB4MEJERCwgMHg3QUUzLCAweDBEMDIsIDB4N0FFNCwgMHgyMjUyLCAweDdBRTUsIDB4MEQwMSwKKyAgICAweDdBRTYsIDB4MjI1MSwgMHg3QUVCLCAweDI0RUQsIDB4N0FFRCwgMHgxMDRCLCAweDdBRUUsIDB4Mjc2OSwgMHg3QUVGLAorICAgIDB4MTA0QywgMHg3QUY2LCAweDE2MjksIDB4N0FGNywgMHgzMjBELCAweDdBRjksIDB4MDNGNiwgMHg3QUZBLCAweDA2NjYsCisgICAgMHg3QUZCLCAweDFBMjQsIDB4N0FGRCwgMHgwN0NCLCAweDdBRkYsIDB4MDdDQSwgMHg3QjAwLCAweDFCQjgsIDB4N0IwMSwKKyAgICAweDFCQjksIDB4N0IwNCwgMHgxRDhELCAweDdCMDUsIDB4MUQ4RiwgMHg3QjA2LCAweDA5NjgsIDB4N0IwOCwgMHgxRDkxLAorICAgIDB4N0IwOSwgMHgxRDk0LCAweDdCMEEsIDB4MUQ5MiwgMHg3QjBFLCAweDFEOTMsIDB4N0IwRiwgMHgxRDkwLCAweDdCMTAsCisgICAgMHgxRDhDLCAweDdCMTEsIDB4MDk2OSwgMHg3QjEyLCAweDFEOTUsIDB4N0IxMywgMHgxRDhFLCAweDdCMTgsIDB4MUZENSwKKyAgICAweDdCMTksIDB4MEI0RCwgMHg3QjFBLCAweDFGREUsIDB4N0IxQiwgMHgwQjRBLCAweDdCMUQsIDB4MUZENywgMHg3QjFFLAorICAgIDB4MEI0RSwgMHg3QjIwLCAweDBCNDgsIDB4N0IyMiwgMHgxRkQyLCAweDdCMjMsIDB4MUZERiwgMHg3QjI0LCAweDFGRDMsCisgICAgMHg3QjI1LCAweDFGRDAsIDB4N0IyNiwgMHgwQjRDLCAweDdCMjgsIDB4MEI0OSwgMHg3QjJBLCAweDFGRDYsIDB4N0IyQiwKKyAgICAweDFGRDksIDB4N0IyQywgMHgwQjRCLCAweDdCMkQsIDB4MUZEQSwgMHg3QjJFLCAweDBCNEYsIDB4N0IyRiwgMHgxRkRCLAorICAgIDB4N0IzMCwgMHgxRkQxLCAweDdCMzEsIDB4MUZEOCwgMHg3QjMyLCAweDFGREMsIDB4N0IzMywgMHgxRkQ0LCAweDdCMzQsCisgICAgMHgxRkNGLCAweDdCMzUsIDB4MUZDRCwgMHg3QjM4LCAweDFGREQsIDB4N0IzQiwgMHgxRkNFLCAweDdCNDAsIDB4MjI1OSwKKyAgICAweDdCNDQsIDB4MjI1NSwgMHg3QjQ1LCAweDIyNUIsIDB4N0I0NiwgMHgwRDA1LCAweDdCNDcsIDB4MjI1NCwgMHg3QjQ4LAorICAgIDB4MjI1NiwgMHg3QjQ5LCAweDBEMDMsIDB4N0I0QSwgMHgyMjUzLCAweDdCNEIsIDB4MEQwQSwgMHg3QjRDLCAweDIyNTcsCisgICAgMHg3QjRELCAweDBEMDksIDB4N0I0RSwgMHgyMjU4LCAweDdCNEYsIDB4MEQwQiwgMHg3QjUwLCAweDBEMDYsIDB4N0I1MSwKKyAgICAweDBEMEMsIDB4N0I1MiwgMHgwRDA3LCAweDdCNTQsIDB4MEQwOCwgMHg3QjU2LCAweDBEMDQsIDB4N0I1OCwgMHgyMjVBLAorICAgIDB4N0I2MCwgMHgwRUI4LCAweDdCNjEsIDB4MjRGOCwgMHg3QjYzLCAweDI0RkIsIDB4N0I2NCwgMHgyNEVGLCAweDdCNjUsCisgICAgMHgyNEY0LCAweDdCNjYsIDB4MjRFRSwgMHg3QjY3LCAweDBFQkEsIDB4N0I2OSwgMHgyNEYyLCAweDdCNkQsIDB4MjRGMCwKKyAgICAweDdCNkUsIDB4MEVCOSwgMHg3QjcwLCAweDI0RjcsIDB4N0I3MSwgMHgyNEY2LCAweDdCNzIsIDB4MjRGMywgMHg3QjczLAorICAgIDB4MjRGNSwgMHg3Qjc0LCAweDI0RjEsIDB4N0I3NSwgMHgxMDUwLCAweDdCNzYsIDB4MjRGQSwgMHg3Qjc3LCAweDBFQjYsCisgICAgMHg3Qjc4LCAweDI0RjksIDB4N0I4MiwgMHgyNzc5LCAweDdCODQsIDB4MTA1NywgMHg3Qjg1LCAweDI3NzQsIDB4N0I4NywKKyAgICAweDEwNTYsIDB4N0I4OCwgMHgyNzZBLCAweDdCOEEsIDB4Mjc2QywgMHg3QjhCLCAweDEwNEYsIDB4N0I4QywgMHgyNzcxLAorICAgIDB4N0I4RCwgMHgyNzcwLCAweDdCOEUsIDB4Mjc3MywgMHg3QjhGLCAweDEwNTQsIDB4N0I5MCwgMHgyNzZFLCAweDdCOTEsCisgICAgMHgyNzZELCAweDdCOTQsIDB4MTA1MywgMHg3Qjk1LCAweDEwNEUsIDB4N0I5NiwgMHgyNzZGLCAweDdCOTcsIDB4MTA1MSwKKyAgICAweDdCOTgsIDB4Mjc3NSwgMHg3Qjk5LCAweDI3NzcsIDB4N0I5QiwgMHgyNzcyLCAweDdCOUMsIDB4Mjc2QiwgMHg3QjlELAorICAgIDB4MTA1MiwgMHg3QkEwLCAweDExRDIsIDB4N0JBMSwgMHgxMDRELCAweDdCQTQsIDB4Mjc3OCwgMHg3QkFDLCAweDI5QUEsCisgICAgMHg3QkFELCAweDExQ0IsIDB4N0JBRiwgMHgyOUFDLCAweDdCQjEsIDB4MTFDQywgMHg3QkI0LCAweDExQ0UsIDB4N0JCNSwKKyAgICAweDI5QUYsIDB4N0JCNywgMHgyOUE3LCAweDdCQjgsIDB4MTA1NSwgMHg3QkI5LCAweDI5QUQsIDB4N0JCRSwgMHgyOUE5LAorICAgIDB4N0JDMCwgMHgwRUI3LCAweDdCQzEsIDB4MTFEMSwgMHg3QkM0LCAweDExQ0QsIDB4N0JDNiwgMHgxMUNGLCAweDdCQzcsCisgICAgMHgxMUQwLCAweDdCQzksIDB4MTMxOCwgMHg3QkNBLCAweDI5QUUsIDB4N0JDQiwgMHgyOUE4LCAweDdCQ0MsIDB4MTFEMywKKyAgICAweDdCQ0UsIDB4MjlBQiwgMHg3QkQ0LCAweDJDMDcsIDB4N0JENSwgMHgyQzAyLCAweDdCRDgsIDB4MkMwQywgMHg3QkQ5LAorICAgIDB4MTMxNiwgMHg3QkRBLCAweDJDMDQsIDB4N0JEQiwgMHgxMzFBLCAweDdCREMsIDB4MkMwQSwgMHg3QkRELCAweDJDMDEsCisgICAgMHg3QkRFLCAweDJCRkUsIDB4N0JERiwgMHgyQzBELCAweDdCRTAsIDB4MTQyRCwgMHg3QkUxLCAweDEzMUIsIDB4N0JFMiwKKyAgICAweDJDMDksIDB4N0JFMywgMHgyQkZGLCAweDdCRTQsIDB4MTMxOSwgMHg3QkU1LCAweDJDMDMsIDB4N0JFNiwgMHgxMzFELAorICAgIDB4N0JFNywgMHgyQzAwLCAweDdCRTgsIDB4MkMwNSwgMHg3QkU5LCAweDEzMUMsIDB4N0JFQSwgMHgyQzA4LCAweDdCRUIsCisgICAgMHgyQzBCLCAweDdCRjAsIDB4MkRFOSwgMHg3QkYxLCAweDJERUEsIDB4N0JGMiwgMHgyRERBLCAweDdCRjMsIDB4MkRFMSwKKyAgICAweDdCRjQsIDB4MkRERiwgMHg3QkY3LCAweDE0MkIsIDB4N0JGOCwgMHgyREU2LCAweDdCRjksIDB4MkMwNiwgMHg3QkZCLAorICAgIDB4MkRERCwgMHg3QkZELCAweDJERTcsIDB4N0JGRSwgMHgxNDJBLCAweDdCRkYsIDB4MkREQywgMHg3QzAwLCAweDJEREIsCisgICAgMHg3QzAxLCAweDJERTUsIDB4N0MwMiwgMHgyREUyLCAweDdDMDMsIDB4MkRFNCwgMHg3QzA1LCAweDJERDgsIDB4N0MwNiwKKyAgICAweDJERTgsIDB4N0MwNywgMHgxNDI4LCAweDdDMDksIDB4MkRFMywgMHg3QzBBLCAweDJERUMsIDB4N0MwQiwgMHgyREUwLAorICAgIDB4N0MwQywgMHgxNDJDLCAweDdDMEQsIDB4MTQyOSwgMHg3QzBFLCAweDJEREUsIDB4N0MwRiwgMHgyREQ5LCAweDdDMTAsCisgICAgMHgyREVCLCAweDdDMTEsIDB4MTMxNywgMHg3QzE5LCAweDJGNzgsIDB4N0MxQywgMHgyRjc2LCAweDdDMUQsIDB4MkY3QywKKyAgICAweDdDMUUsIDB4MTUwOCwgMHg3QzFGLCAweDJGN0EsIDB4N0MyMCwgMHgyRjc5LCAweDdDMjEsIDB4MTUwQSwgMHg3QzIyLAorICAgIDB4MkY3RiwgMHg3QzIzLCAweDE1MDksIDB4N0MyNSwgMHgyRjgwLCAweDdDMjYsIDB4MkY3RCwgMHg3QzI3LCAweDE1MDYsCisgICAgMHg3QzI4LCAweDJGN0UsIDB4N0MyOSwgMHgyRjc3LCAweDdDMkEsIDB4MTUwNywgMHg3QzJCLCAweDE1MDUsIDB4N0MyQywKKyAgICAweDMwRDYsIDB4N0MyRCwgMHgyRjdCLCAweDdDMzAsIDB4MkY4MSwgMHg3QzMzLCAweDMwRDMsIDB4N0MzNywgMHgxNUE3LAorICAgIDB4N0MzOCwgMHgxNUE1LCAweDdDMzksIDB4MzBENSwgMHg3QzNCLCAweDMwRDcsIDB4N0MzQywgMHgzMEQ0LCAweDdDM0QsCisgICAgMHgxNUE2LCAweDdDM0UsIDB4MTVBMywgMHg3QzNGLCAweDE1QTQsIDB4N0M0MCwgMHgxNUE4LCAweDdDNDMsIDB4MTYyQiwKKyAgICAweDdDNDUsIDB4MzIxMiwgMHg3QzQ3LCAweDMyMTEsIDB4N0M0OCwgMHgzMjBGLCAweDdDNDksIDB4MzIwRSwgMHg3QzRBLAorICAgIDB4MzIxMCwgMHg3QzRDLCAweDE2MkEsIDB4N0M0RCwgMHgxNjJDLCAweDdDNTAsIDB4MTY4MSwgMHg3QzUzLCAweDMyRUEsCisgICAgMHg3QzU0LCAweDMyRTksIDB4N0M1NywgMHgzMzlCLCAweDdDNTksIDB4MzM5RCwgMHg3QzVBLCAweDMzOUYsIDB4N0M1QiwKKyAgICAweDMzOUUsIDB4N0M1QywgMHgzMzlDLCAweDdDNUYsIDB4MTZEMSwgMHg3QzYwLCAweDE2RDAsIDB4N0M2MywgMHgxNzAxLAorICAgIDB4N0M2NCwgMHgxNzAwLCAweDdDNjUsIDB4MTcwMiwgMHg3QzY2LCAweDM0MkIsIDB4N0M2NywgMHgzNDJBLCAweDdDNjksCisgICAgMHgzNEQ2LCAweDdDNkEsIDB4MzQ5MywgMHg3QzZCLCAweDM0RDcsIDB4N0M2QywgMHgxNzQ1LCAweDdDNkUsIDB4MTc0NiwKKyAgICAweDdDNkYsIDB4MzUwNywgMHg3QzcyLCAweDE3NkIsIDB4N0M3MywgMHgwM0Y3LCAweDdDNzUsIDB4MUEyNSwgMHg3Qzc4LAorICAgIDB4MUJCQiwgMHg3Qzc5LCAweDFCQkMsIDB4N0M3QSwgMHgxQkJBLCAweDdDN0QsIDB4MDdDQywgMHg3QzdGLCAweDFCQkQsCisgICAgMHg3QzgwLCAweDFCQkUsIDB4N0M4MSwgMHgxQkJGLCAweDdDODQsIDB4MUQ5NiwgMHg3Qzg1LCAweDFEOUMsIDB4N0M4OCwKKyAgICAweDFEOUEsIDB4N0M4OSwgMHgwOTZBLCAweDdDOEEsIDB4MUQ5OCwgMHg3QzhDLCAweDFEOTksIDB4N0M4RCwgMHgxRDlCLAorICAgIDB4N0M5MSwgMHgxRDk3LCAweDdDOTIsIDB4MEI1MCwgMHg3Qzk0LCAweDFGRTAsIDB4N0M5NSwgMHgwQjUyLCAweDdDOTYsCisgICAgMHgxRkUyLCAweDdDOTcsIDB4MEI1MSwgMHg3Qzk4LCAweDFGRTEsIDB4N0M5RSwgMHgyMjVELCAweDdDOUYsIDB4MEQwRCwKKyAgICAweDdDQTEsIDB4MjI1RiwgMHg3Q0EyLCAweDIyNUMsIDB4N0NBMywgMHgxRkUzLCAweDdDQTUsIDB4MEQwRSwgMHg3Q0E3LAorICAgIDB4MzZFRCwgMHg3Q0E4LCAweDIyNUUsIDB4N0NBRiwgMHgyNEZFLCAweDdDQjEsIDB4MEVCQiwgMHg3Q0IyLCAweDI0RkMsCisgICAgMHg3Q0IzLCAweDBFQkMsIDB4N0NCNCwgMHgyNEZELCAweDdDQjUsIDB4MEVCRCwgMHg3Q0I5LCAweDEwNTgsIDB4N0NCQSwKKyAgICAweDI3N0QsIDB4N0NCQiwgMHgyNzdBLCAweDdDQkMsIDB4Mjc3QywgMHg3Q0JELCAweDEwNTksIDB4N0NCRSwgMHgxMDVBLAorICAgIDB4N0NCRiwgMHgyNzdCLCAweDdDQzUsIDB4MjlCMCwgMHg3Q0M4LCAweDI5QjEsIDB4N0NDQSwgMHgxMUQ0LCAweDdDQ0IsCisgICAgMHgyOUIzLCAweDdDQ0MsIDB4MjlCMiwgMHg3Q0NFLCAweDAxMjEsIDB4N0NEMCwgMHgyQzExLCAweDdDRDEsIDB4MkMxMiwKKyAgICAweDdDRDIsIDB4MkMwRSwgMHg3Q0Q0LCAweDJDMEYsIDB4N0NENSwgMHgxMzFFLCAweDdDRDYsIDB4MTMxRiwgMHg3Q0Q3LAorICAgIDB4MkMxMCwgMHg3Q0Q5LCAweDE0MzMsIDB4N0NEQywgMHgxNDJGLCAweDdDREQsIDB4MTQzNCwgMHg3Q0RFLCAweDE0MzAsCisgICAgMHg3Q0RGLCAweDE0MzIsIDB4N0NFMCwgMHgxNDJFLCAweDdDRTIsIDB4MTQzMSwgMHg3Q0U3LCAweDE1MEIsIDB4N0NFOCwKKyAgICAweDJERUQsIDB4N0NFQSwgMHgzMEQ5LCAweDdDRUMsIDB4MzBEOCwgMHg3Q0VFLCAweDMyMTMsIDB4N0NFRiwgMHgxNjJELAorICAgIDB4N0NGMCwgMHgxNjJFLCAweDdDRjEsIDB4MzNBMSwgMHg3Q0YyLCAweDMyRUIsIDB4N0NGNCwgMHgzM0EwLCAweDdDRjYsCisgICAgMHgzNEQ4LCAweDdDRjcsIDB4MzUxRCwgMHg3Q0Y4LCAweDAzRjgsIDB4N0NGQiwgMHgwNEZCLCAweDdDRkQsIDB4MUEyNiwKKyAgICAweDdDRkUsIDB4MDY2NywgMHg3RDAwLCAweDA3Q0YsIDB4N0QwMSwgMHgxQkMyLCAweDdEMDIsIDB4MDdDRCwgMHg3RDAzLAorICAgIDB4MUJDMCwgMHg3RDA0LCAweDA3RDIsIDB4N0QwNSwgMHgwN0NFLCAweDdEMDYsIDB4MDdEMywgMHg3RDA3LCAweDA3RDEsCisgICAgMHg3RDA4LCAweDFCQzEsIDB4N0QwOSwgMHgwN0QwLCAweDdEMEEsIDB4MDk2RSwgMHg3RDBCLCAweDA5NkQsIDB4N0QwQywKKyAgICAweDFEQTcsIDB4N0QwRCwgMHgwOTc2LCAweDdEMEUsIDB4MURBMCwgMHg3RDBGLCAweDFEQTYsIDB4N0QxMCwgMHgwOTcyLAorICAgIDB4N0QxMSwgMHgxRDlGLCAweDdEMTIsIDB4MURBNSwgMHg3RDEzLCAweDFEQTMsIDB4N0QxNCwgMHgwOTcxLCAweDdEMTUsCisgICAgMHgwOTczLCAweDdEMTYsIDB4MURBMiwgMHg3RDE3LCAweDA5NkMsIDB4N0QxOCwgMHgxREExLCAweDdEMTksIDB4MDk3NywKKyAgICAweDdEMUEsIDB4MDk3NCwgMHg3RDFCLCAweDA5NzgsIDB4N0QxQywgMHgwOTc1LCAweDdEMUQsIDB4MUQ5RSwgMHg3RDFFLAorICAgIDB4MUQ5RCwgMHg3RDFGLCAweDFEQTQsIDB4N0QyMCwgMHgwOTZGLCAweDdEMjEsIDB4MDk2QiwgMHg3RDIyLCAweDA5NzAsCisgICAgMHg3RDI4LCAweDFGRjIsIDB4N0QyOSwgMHgxRkVCLCAweDdEMkIsIDB4MEQxMywgMHg3RDJDLCAweDFGRUEsIDB4N0QyRSwKKyAgICAweDBCNTYsIDB4N0QyRiwgMHgwQjVELCAweDdEMzAsIDB4MEI1QSwgMHg3RDMxLCAweDBCNjAsIDB4N0QzMiwgMHgwQjVGLAorICAgIDB4N0QzMywgMHgwQjVCLCAweDdEMzUsIDB4MUZFNCwgMHg3RDM2LCAweDFGRTcsIDB4N0QzOCwgMHgxRkU2LCAweDdEMzksCisgICAgMHgwQjU3LCAweDdEM0EsIDB4MUZFOCwgMHg3RDNCLCAweDFGRjEsIDB4N0QzQywgMHgwQjU4LCAweDdEM0QsIDB4MUZFNSwKKyAgICAweDdEM0UsIDB4MUZFRSwgMHg3RDNGLCAweDFGRUYsIDB4N0Q0MCwgMHgwQjU5LCAweDdENDEsIDB4MUZFQywgMHg3RDQyLAorICAgIDB4MEI1RSwgMHg3RDQzLCAweDBCNTQsIDB4N0Q0NCwgMHgwQjVDLCAweDdENDUsIDB4MUZFOSwgMHg3RDQ2LCAweDBCNTMsCisgICAgMHg3RDQ3LCAweDFGRUQsIDB4N0Q0QSwgMHgxRkYwLCAweDdENEUsIDB4MjI3MCwgMHg3RDRGLCAweDIyNjcsIDB4N0Q1MCwKKyAgICAweDBEMTAsIDB4N0Q1MSwgMHgyMjZFLCAweDdENTIsIDB4MjI2QiwgMHg3RDUzLCAweDIyNjMsIDB4N0Q1NCwgMHgyMjZDLAorICAgIDB4N0Q1NSwgMHgwRDEyLCAweDdENTYsIDB4MjI2NCwgMHg3RDU4LCAweDIyNjAsIDB4N0Q1QiwgMHgwRUMzLCAweDdENUMsCisgICAgMHgyMjY5LCAweDdENUUsIDB4MEQwRiwgMHg3RDVGLCAweDIyNkYsIDB4N0Q2MSwgMHgwRDE2LCAweDdENjIsIDB4MEQxOCwKKyAgICAweDdENjMsIDB4MjI2MiwgMHg3RDY2LCAweDBEMTcsIDB4N0Q2NywgMHgyMjY1LCAweDdENjgsIDB4MEQxMSwgMHg3RDY5LAorICAgIDB4MjI2RCwgMHg3RDZBLCAweDIyNjYsIDB4N0Q2QiwgMHgyMjZBLCAweDdENkQsIDB4MjI2OCwgMHg3RDZFLCAweDBEMTQsCisgICAgMHg3RDZGLCAweDIyNjEsIDB4N0Q3MCwgMHgwRDE5LCAweDdENzEsIDB4MEI1NSwgMHg3RDcyLCAweDBEMTUsIDB4N0Q3MywKKyAgICAweDBEMUEsIDB4N0Q3OSwgMHgwRUJGLCAweDdEN0EsIDB4MjUwNSwgMHg3RDdCLCAweDI1MDcsIDB4N0Q3QywgMHgyNTA5LAorICAgIDB4N0Q3RCwgMHgyNTBELCAweDdEN0YsIDB4MjUwMywgMHg3RDgwLCAweDI1MDEsIDB4N0Q4MSwgMHgwRUMxLCAweDdEODMsCisgICAgMHgyNTA4LCAweDdEODQsIDB4MjUwQywgMHg3RDg1LCAweDI1MDQsIDB4N0Q4NiwgMHgyNTAwLCAweDdEODgsIDB4MjRGRiwKKyAgICAweDdEOEMsIDB4MjUwQSwgMHg3RDhELCAweDI1MDIsIDB4N0Q4RSwgMHgyNTA2LCAweDdEOEYsIDB4MEVDMiwgMHg3RDkxLAorICAgIDB4MEVDMCwgMHg3RDkyLCAweDI1MEUsIDB4N0Q5MywgMHgwRUJFLCAweDdEOTQsIDB4MjUwQiwgMHg3RDk2LCAweDI3OEUsCisgICAgMHg3RDlDLCAweDEwNUQsIDB4N0Q5RCwgMHgyNzg2LCAweDdEOUUsIDB4MTFFMSwgMHg3RDlGLCAweDI3OTAsIDB4N0RBMCwKKyAgICAweDEwNjAsIDB4N0RBMSwgMHgyNzk0LCAweDdEQTIsIDB4MTA2NiwgMHg3REEzLCAweDI3ODEsIDB4N0RBNiwgMHgyNzkxLAorICAgIDB4N0RBNywgMHgyNzdFLCAweDdEQTksIDB4Mjc5MywgMHg3REFBLCAweDI3ODIsIDB4N0RBQywgMHgxMDZELCAweDdEQUQsCisgICAgMHgxMDZBLCAweDdEQUUsIDB4Mjc5MiwgMHg3REFGLCAweDI3OEMsIDB4N0RCMCwgMHgxMDVDLCAweDdEQjEsIDB4MTA2NCwKKyAgICAweDdEQjIsIDB4MTA2MywgMHg3REI0LCAweDEwNjIsIDB4N0RCNSwgMHgxMDY4LCAweDdEQjcsIDB4Mjc3RiwgMHg3REI4LAorICAgIDB4MTA2OSwgMHg3REI5LCAweDI3OEQsIDB4N0RCQSwgMHgxMDY1LCAweDdEQkIsIDB4MTA1QiwgMHg3REJDLCAweDI3OEYsCisgICAgMHg3REJELCAweDEwNUUsIDB4N0RCRSwgMHgxMDVGLCAweDdEQkYsIDB4MTA2NywgMHg3REMwLCAweDI3ODQsIDB4N0RDMSwKKyAgICAweDI3ODMsIDB4N0RDMiwgMHgyNzgwLCAweDdEQzQsIDB4Mjc4OCwgMHg3REM1LCAweDI3ODUsIDB4N0RDNiwgMHgyNzg5LAorICAgIDB4N0RDNywgMHgxMDZDLCAweDdEQzksIDB4Mjc5NSwgMHg3RENBLCAweDEwNjEsIDB4N0RDQiwgMHgyNzhBLCAweDdEQ0MsCisgICAgMHgyNzhCLCAweDdEQ0UsIDB4Mjc4NywgMHg3REQyLCAweDEwNkIsIDB4N0RENywgMHgyOUI4LCAweDdERDgsIDB4MTFEOSwKKyAgICAweDdERDksIDB4MTFFMiwgMHg3RERBLCAweDExREUsIDB4N0REQiwgMHgyOUI1LCAweDdEREQsIDB4MTFEQiwgMHg3RERFLAorICAgIDB4MTFERiwgMHg3RERGLCAweDI5QzEsIDB4N0RFMCwgMHgxMUQ1LCAweDdERTEsIDB4MjlCOSwgMHg3REUzLCAweDExREQsCisgICAgMHg3REU2LCAweDI5QkMsIDB4N0RFNywgMHgyOUI3LCAweDdERTgsIDB4MTFEQywgMHg3REU5LCAweDExRTAsIDB4N0RFQSwKKyAgICAweDI5QjYsIDB4N0RFQywgMHgxMURBLCAweDdERUUsIDB4MjlDMCwgMHg3REVGLCAweDExRDcsIDB4N0RGMCwgMHgyOUJGLAorICAgIDB4N0RGMSwgMHgyOUJFLCAweDdERjIsIDB4MTFFMywgMHg3REYzLCAweDI4QzgsIDB4N0RGNCwgMHgxMUQ2LCAweDdERjYsCisgICAgMHgyOUJELCAweDdERjcsIDB4MjlCNCwgMHg3REY5LCAweDExRTQsIDB4N0RGQSwgMHgyOUJCLCAweDdERkIsIDB4MTFEOCwKKyAgICAweDdFMDMsIDB4MjlCQSwgMHg3RTA4LCAweDEzMjIsIDB4N0UwOSwgMHgxMzI3LCAweDdFMEEsIDB4MTMyMCwgMHg3RTBCLAorICAgIDB4MkMxRiwgMHg3RTBDLCAweDJDMTYsIDB4N0UwRCwgMHgyQzIyLCAweDdFMEUsIDB4MkMxQSwgMHg3RTBGLCAweDJDMjAsCisgICAgMHg3RTEwLCAweDEzMjgsIDB4N0UxMSwgMHgxMzIxLCAweDdFMTIsIDB4MkMxMywgMHg3RTEzLCAweDJDMTksIDB4N0UxNCwKKyAgICAweDJDMjMsIDB4N0UxNSwgMHgyQzFDLCAweDdFMTYsIDB4MkMyMSwgMHg3RTE3LCAweDJDMTUsIDB4N0UxQSwgMHgyQzFELAorICAgIDB4N0UxQiwgMHgxMzIzLCAweDdFMUMsIDB4MkMxQiwgMHg3RTFELCAweDEzMjYsIDB4N0UxRSwgMHgxMzI1LCAweDdFMUYsCisgICAgMHgyQzE3LCAweDdFMjAsIDB4MkMxOCwgMHg3RTIxLCAweDJDMTQsIDB4N0UyMiwgMHgyQzFFLCAweDdFMjMsIDB4MTMyNCwKKyAgICAweDdFMjQsIDB4MkMyNSwgMHg3RTI1LCAweDJDMjQsIDB4N0UyOSwgMHgyREY4LCAweDdFMkEsIDB4MkRGNCwgMHg3RTJCLAorICAgIDB4MTQzQiwgMHg3RTJELCAweDJERUUsIDB4N0UyRSwgMHgxNDM1LCAweDdFMkYsIDB4MTQ0NSwgMHg3RTMwLCAweDJERkEsCisgICAgMHg3RTMxLCAweDE0M0QsIDB4N0UzMiwgMHgxNDM5LCAweDdFMzMsIDB4MkRGMSwgMHg3RTM0LCAweDE0NDAsIDB4N0UzNSwKKyAgICAweDE0NDMsIDB4N0UzNiwgMHgyREZDLCAweDdFMzcsIDB4MTQzOCwgMHg3RTM4LCAweDJERjMsIDB4N0UzOSwgMHgxNDQxLAorICAgIDB4N0UzQSwgMHgyREZFLCAweDdFM0IsIDB4MkRGQiwgMHg3RTNDLCAweDJERUYsIDB4N0UzRCwgMHgxNDNDLCAweDdFM0UsCisgICAgMHgxNDM2LCAweDdFM0YsIDB4MTQ0NCwgMHg3RTQwLCAweDJERjYsIDB4N0U0MSwgMHgxNDNGLCAweDdFNDIsIDB4MkRGMCwKKyAgICAweDdFNDMsIDB4MTQzQSwgMHg3RTQ0LCAweDJERkQsIDB4N0U0NSwgMHgxNDNFLCAweDdFNDYsIDB4MTQzNywgMHg3RTQ3LAorICAgIDB4MkRGNywgMHg3RTQ4LCAweDE0NDIsIDB4N0U0OSwgMHgyREY1LCAweDdFNEMsIDB4MkRGOSwgMHg3RTUwLCAweDJGODMsCisgICAgMHg3RTUxLCAweDJGODksIDB4N0U1MiwgMHgxNTExLCAweDdFNTMsIDB4MkY4QywgMHg3RTU0LCAweDE1MEMsIDB4N0U1NSwKKyAgICAweDE1MEQsIDB4N0U1NiwgMHgyRjg0LCAweDdFNTcsIDB4MkY4QiwgMHg3RTU4LCAweDJGODYsIDB4N0U1OSwgMHgxNTEyLAorICAgIDB4N0U1QSwgMHgxNTBGLCAweDdFNUMsIDB4MkY4MiwgMHg3RTVFLCAweDE1MEUsIDB4N0U1RiwgMHgyRjg4LCAweDdFNjAsCisgICAgMHgyRjhBLCAweDdFNjEsIDB4MTUxMCwgMHg3RTYyLCAweDJGODcsIDB4N0U2MywgMHgyRjg1LCAweDdFNjgsIDB4MzBFMywKKyAgICAweDdFNjksIDB4MTVBQywgMHg3RTZBLCAweDE1QUQsIDB4N0U2QiwgMHgxNUE5LCAweDdFNkQsIDB4MTVBQSwgMHg3RTZGLAorICAgIDB4MzBERiwgMHg3RTcwLCAweDMwREQsIDB4N0U3MiwgMHgzMEUxLCAweDdFNzMsIDB4MTVBRSwgMHg3RTc0LCAweDMwRTIsCisgICAgMHg3RTc1LCAweDMwREIsIDB4N0U3NiwgMHgzMERBLCAweDdFNzcsIDB4MzBERSwgMHg3RTc4LCAweDMwREMsIDB4N0U3OSwKKyAgICAweDE1QUIsIDB4N0U3QSwgMHgzMEUwLCAweDdFN0IsIDB4MzIxNCwgMHg3RTdDLCAweDE2MzEsIDB4N0U3RCwgMHgxNjMwLAorICAgIDB4N0U3RSwgMHgzMjE1LCAweDdFODAsIDB4MzIxNywgMHg3RTgxLCAweDMyMTYsIDB4N0U4MiwgMHgxNjMyLCAweDdFODYsCisgICAgMHgzMkYwLCAweDdFODcsIDB4MzJFRCwgMHg3RTg4LCAweDMyRUUsIDB4N0U4QSwgMHgzMkVDLCAweDdFOEIsIDB4MzJFRiwKKyAgICAweDdFOEMsIDB4MTY4MywgMHg3RThELCAweDMyRjEsIDB4N0U4RiwgMHgxNjgyLCAweDdFOTEsIDB4MzNBMiwgMHg3RTkzLAorICAgIDB4MTcwMywgMHg3RTk0LCAweDE3MDUsIDB4N0U5NSwgMHgzNDJDLCAweDdFOTYsIDB4MTcwNCwgMHg3RTk3LCAweDM0OTQsCisgICAgMHg3RTk4LCAweDM0REEsIDB4N0U5OSwgMHgzNERDLCAweDdFOUEsIDB4MzREOSwgMHg3RTlCLCAweDM0REIsIDB4N0U5QywKKyAgICAweDE3NTksIDB4N0YzNiwgMHgwM0Y5LCAweDdGMzgsIDB4MDdENCwgMHg3RjM5LCAweDFEMUYsIDB4N0YzQSwgMHgwOTc5LAorICAgIDB4N0YzRCwgMHgwQjYxLCAweDdGM0UsIDB4MjI3MSwgMHg3RjNGLCAweDIyNzIsIDB4N0Y0MywgMHgyQzI2LCAweDdGNDQsCisgICAgMHgxNDQ2LCAweDdGNDUsIDB4MkRGRiwgMHg3RjQ4LCAweDE1MTMsIDB4N0Y0QSwgMHgzMEU1LCAweDdGNEIsIDB4MzBFNCwKKyAgICAweDdGNEMsIDB4MTYzMywgMHg3RjRELCAweDMyRjIsIDB4N0Y0RiwgMHgzM0EzLCAweDdGNTAsIDB4MTcyNiwgMHg3RjUxLAorICAgIDB4MTgxMiwgMHg3RjU0LCAweDA2NjgsIDB4N0Y1NSwgMHgwNEZDLCAweDdGNTgsIDB4MUJDMywgMHg3RjVCLCAweDFEQUQsCisgICAgMHg3RjVDLCAweDFEQTgsIDB4N0Y1RCwgMHgxREFDLCAweDdGNUUsIDB4MURBQSwgMHg3RjVGLCAweDA5N0EsIDB4N0Y2MCwKKyAgICAweDFEQUIsIDB4N0Y2MSwgMHgxREE5LCAweDdGNjMsIDB4MUZGMywgMHg3RjY1LCAweDIyNzMsIDB4N0Y2NiwgMHgyMjc0LAorICAgIDB4N0Y2NywgMHgyNTExLCAweDdGNjgsIDB4MjUxMiwgMHg3RjY5LCAweDBFQzUsIDB4N0Y2QSwgMHgwRUM2LCAweDdGNkIsCisgICAgMHgyNTEwLCAweDdGNkMsIDB4MjUxMywgMHg3RjZELCAweDI1MEYsIDB4N0Y2RSwgMHgwRUM0LCAweDdGNzAsIDB4MTA2RSwKKyAgICAweDdGNzIsIDB4MEVDNywgMHg3RjczLCAweDI3OTYsIDB4N0Y3NSwgMHgxMUU1LCAweDdGNzYsIDB4MjlDMiwgMHg3Rjc3LAorICAgIDB4MTFFNiwgMHg3Rjc5LCAweDEzMjksIDB4N0Y3QSwgMHgyQzI5LCAweDdGN0IsIDB4MkMyNywgMHg3RjdDLCAweDJDMjgsCisgICAgMHg3RjdELCAweDJFMDIsIDB4N0Y3RSwgMHgyRTAxLCAweDdGN0YsIDB4MkUwMCwgMHg3RjgzLCAweDMwRTYsIDB4N0Y4NSwKKyAgICAweDE1QUYsIDB4N0Y4NiwgMHgzMEU3LCAweDdGODcsIDB4MzNBNCwgMHg3Rjg4LCAweDE3MjcsIDB4N0Y4OSwgMHgzNDk1LAorICAgIDB4N0Y4QSwgMHgwM0ZBLCAweDdGOEIsIDB4MDY2QSwgMHg3RjhDLCAweDA2NjksIDB4N0Y4RCwgMHgxQkM1LCAweDdGOEUsCisgICAgMHgwN0Q1LCAweDdGOTEsIDB4MUJDNCwgMHg3RjkyLCAweDFEQUYsIDB4N0Y5NCwgMHgwOTdCLCAweDdGOTUsIDB4MUZGNCwKKyAgICAweDdGOTYsIDB4MURBRSwgMHg3RjlBLCAweDBCNjMsIDB4N0Y5QiwgMHgxRkY3LCAweDdGOUMsIDB4MUZGNSwgMHg3RjlELAorICAgIDB4MUZGNiwgMHg3RjlFLCAweDBCNjIsIDB4N0ZBMCwgMHgyMjc2LCAweDdGQTEsIDB4MjI3NywgMHg3RkEyLCAweDIyNzUsCisgICAgMHg3RkE0LCAweDBFQ0EsIDB4N0ZBNSwgMHgyNTE1LCAweDdGQTYsIDB4MjUxNCwgMHg3RkE3LCAweDI1MTYsIDB4N0ZBOCwKKyAgICAweDBFQzksIDB4N0ZBOSwgMHgwRUM4LCAweDdGQUMsIDB4MjlDMywgMHg3RkFELCAweDI5QzUsIDB4N0ZBRiwgMHgxMUU3LAorICAgIDB4N0ZCMCwgMHgyOUM0LCAweDdGQjEsIDB4MkMyQSwgMHg3RkIyLCAweDEzMkEsIDB4N0ZCMywgMHgyRjhFLCAweDdGQjUsCisgICAgMHgyRjhELCAweDdGQjYsIDB4MTVCMCwgMHg3RkI3LCAweDMwRTgsIDB4N0ZCOCwgMHgxNUIyLCAweDdGQjksIDB4MTVCMSwKKyAgICAweDdGQkEsIDB4MzIxOCwgMHg3RkJCLCAweDMyRjMsIDB4N0ZCQywgMHgxNjg0LCAweDdGQkQsIDB4MDNGQiwgMHg3RkJFLAorICAgIDB4MUJDNiwgMHg3RkJGLCAweDA3RDYsIDB4N0ZDMCwgMHgxREIyLCAweDdGQzEsIDB4MDk3RCwgMHg3RkMyLCAweDFEQjEsCisgICAgMHg3RkMzLCAweDFEQjAsIDB4N0ZDNSwgMHgwOTdDLCAweDdGQzcsIDB4MUZGRCwgMHg3RkM5LCAweDFGRkYsIDB4N0ZDQSwKKyAgICAweDFGRjgsIDB4N0ZDQiwgMHgxRkY5LCAweDdGQ0MsIDB4MEI2NCwgMHg3RkNELCAweDFGRkEsIDB4N0ZDRSwgMHgwQjY1LAorICAgIDB4N0ZDRiwgMHgxRkZFLCAweDdGRDAsIDB4MUZGQiwgMHg3RkQxLCAweDFGRkMsIDB4N0ZEMiwgMHgwQjY2LCAweDdGRDQsCisgICAgMHgwRDFDLCAweDdGRDUsIDB4MEQxRCwgMHg3RkQ3LCAweDIyNzgsIDB4N0ZEQiwgMHgyNTE3LCAweDdGREMsIDB4MjUxOCwKKyAgICAweDdGREUsIDB4Mjc5QSwgMHg3RkRGLCAweDEwNzEsIDB4N0ZFMCwgMHgxMDZGLCAweDdGRTEsIDB4MTA3MCwgMHg3RkUyLAorICAgIDB4Mjc5NywgMHg3RkUzLCAweDI3OTgsIDB4N0ZFNSwgMHgyNzk5LCAweDdGRTYsIDB4MjlDQSwgMHg3RkU4LCAweDI5Q0IsCisgICAgMHg3RkU5LCAweDExRTgsIDB4N0ZFQSwgMHgyOUM4LCAweDdGRUIsIDB4MjlDNywgMHg3RkVDLCAweDI5QzksIDB4N0ZFRCwKKyAgICAweDI5QzYsIDB4N0ZFRSwgMHgxMzJELCAweDdGRUYsIDB4MkMyQiwgMHg3RkYwLCAweDEzMkIsIDB4N0ZGMSwgMHgxMzJDLAorICAgIDB4N0ZGMiwgMHgyRTA0LCAweDdGRjMsIDB4MTQ0NywgMHg3RkY0LCAweDJFMDMsIDB4N0ZGNSwgMHgyRUZGLCAweDdGRjcsCisgICAgMHgyRjhGLCAweDdGRjgsIDB4MkY5MCwgMHg3RkY5LCAweDE1MTQsIDB4N0ZGQiwgMHgxNTE1LCAweDdGRkMsIDB4MTQ0OCwKKyAgICAweDdGRkQsIDB4MzBFOSwgMHg3RkZFLCAweDMwRUEsIDB4N0ZGRiwgMHgzMjE5LCAweDgwMDAsIDB4MTYzNCwgMHg4MDAxLAorICAgIDB4MDNGQywgMHg4MDAzLCAweDAzRkQsIDB4ODAwNCwgMHgwOTdGLCAweDgwMDUsIDB4MDY2QiwgMHg4MDA2LCAweDA5N0UsCisgICAgMHg4MDA3LCAweDFCQzcsIDB4ODAwQiwgMHgwRDFFLCAweDgwMEMsIDB4MDNGRSwgMHg4MDBELCAweDA3RDgsIDB4ODAwRSwKKyAgICAweDFCQzgsIDB4ODAwRiwgMHgxQkM5LCAweDgwMTAsIDB4MDdENywgMHg4MDExLCAweDA3RDksIDB4ODAxMiwgMHgwM0ZGLAorICAgIDB4ODAxNCwgMHgxQkNBLCAweDgwMTUsIDB4MDk4MSwgMHg4MDE2LCAweDFEQjMsIDB4ODAxNywgMHgwOTgzLCAweDgwMTgsCisgICAgMHgwOTgwLCAweDgwMTksIDB4MDk4MiwgMHg4MDFCLCAweDIwMDIsIDB4ODAxQywgMHgwQjY3LCAweDgwMUUsIDB4MjAwMSwKKyAgICAweDgwMUYsIDB4MjAwMCwgMHg4MDIxLCAweDI1MTksIDB4ODAyNCwgMHgyNzlCLCAweDgwMjYsIDB4MTFFOSwgMHg4MDI4LAorICAgIDB4MTMyRSwgMHg4MDI5LCAweDJDMkQsIDB4ODAyQSwgMHgyQzJDLCAweDgwMkMsIDB4MkUwNSwgMHg4MDMwLCAweDMyRjQsCisgICAgMHg4MDMzLCAweDA0MDAsIDB4ODAzNCwgMHgxOEQ4LCAweDgwMzUsIDB4MUEyNywgMHg4MDM2LCAweDA3REEsIDB4ODAzNywKKyAgICAweDFCQ0IsIDB4ODAzOSwgMHgxREI1LCAweDgwM0QsIDB4MDk4NCwgMHg4MDNFLCAweDFEQjQsIDB4ODAzRiwgMHgwOTg1LAorICAgIDB4ODA0MywgMHgyMDA0LCAweDgwNDYsIDB4MEI2OSwgMHg4MDQ3LCAweDIwMDMsIDB4ODA0OCwgMHgyMDA1LCAweDgwNEEsCisgICAgMHgwQjY4LCAweDgwNEYsIDB4MjI3QSwgMHg4MDUwLCAweDIyN0IsIDB4ODA1MSwgMHgyMjc5LCAweDgwNTIsIDB4MEQxRiwKKyAgICAweDgwNTYsIDB4MEVDQiwgMHg4MDU4LCAweDBFQ0MsIDB4ODA1QSwgMHgxMDczLCAweDgwNUMsIDB4Mjc5RCwgMHg4MDVELAorICAgIDB4Mjc5QywgMHg4MDVFLCAweDEwNzIsIDB4ODA2NCwgMHgyOUNDLCAweDgwNjcsIDB4MjlDRCwgMHg4MDZDLCAweDJDMkUsCisgICAgMHg4MDZGLCAweDE0NEMsIDB4ODA3MCwgMHgxNDRCLCAweDgwNzEsIDB4MTQ0OSwgMHg4MDcyLCAweDE0NEEsIDB4ODA3MywKKyAgICAweDE0NEQsIDB4ODA3NSwgMHgyRjkxLCAweDgwNzYsIDB4MTUxNywgMHg4MDc3LCAweDE1MTYsIDB4ODA3OCwgMHgzMEVCLAorICAgIDB4ODA3OSwgMHgzMjFBLCAweDgwN0QsIDB4MTZEMywgMHg4MDdFLCAweDE2RDIsIDB4ODA3RiwgMHgwNDAxLCAweDgwODIsCisgICAgMHgxQ0VDLCAweDgwODQsIDB4MEVDRSwgMHg4MDg1LCAweDBEMjAsIDB4ODA4NiwgMHgwRUNELCAweDgwODcsIDB4MTA3NCwKKyAgICAweDgwODksIDB4MDQwMiwgMHg4MDhBLCAweDE3QjMsIDB4ODA4QiwgMHgwNDAzLCAweDgwOEMsIDB4MDQwNCwgMHg4MDhGLAorICAgIDB4MUEyOCwgMHg4MDkwLCAweDE4REIsIDB4ODA5MiwgMHgxOERDLCAweDgwOTMsIDB4MDRGRSwgMHg4MDk1LCAweDE4RDksCisgICAgMHg4MDk2LCAweDA0RkQsIDB4ODA5OCwgMHgwNTAwLCAweDgwOTksIDB4MThEQSwgMHg4MDlBLCAweDA1MDIsIDB4ODA5QiwKKyAgICAweDA1MDEsIDB4ODA5QywgMHgxOERELCAweDgwOUQsIDB4MDRGRiwgMHg4MEExLCAweDA2NzAsIDB4ODBBMiwgMHgwNjZFLAorICAgIDB4ODBBMywgMHgxQTJBLCAweDgwQTUsIDB4MDY2RCwgMHg4MEE5LCAweDA2NzIsIDB4ODBBQSwgMHgwNjc0LCAweDgwQUIsCisgICAgMHgwNjcxLCAweDgwQUQsIDB4MUEyRCwgMHg4MEFFLCAweDFBMjksIDB4ODBBRiwgMHgwNjc1LCAweDgwQjEsIDB4MDY2RiwKKyAgICAweDgwQjIsIDB4MDUwMywgMHg4MEI0LCAweDA2NzMsIDB4ODBCNSwgMHgxQTJDLCAweDgwQjgsIDB4MUEyQiwgMHg4MEJBLAorICAgIDB4MDY2QywgMHg4MEMyLCAweDFCRDEsIDB4ODBDMywgMHgwN0RFLCAweDgwQzQsIDB4MDdERiwgMHg4MEM1LCAweDFCRDMsCisgICAgMHg4MEM3LCAweDFCQ0QsIDB4ODBDOCwgMHgxQkQwLCAweDgwQzksIDB4MUJEOSwgMHg4MENBLCAweDFCRDcsIDB4ODBDQywKKyAgICAweDA3RTAsIDB4ODBDRCwgMHgxQkRELCAweDgwQ0UsIDB4MDdFMywgMHg4MENGLCAweDFCREEsIDB4ODBEMCwgMHgxQkQyLAorICAgIDB4ODBEMSwgMHgxQkNGLCAweDgwRDQsIDB4MjI3RCwgMHg4MEQ1LCAweDFCRDgsIDB4ODBENiwgMHgwN0RCLCAweDgwRDcsCisgICAgMHgxQkRCLCAweDgwRDgsIDB4MUJDQywgMHg4MEQ5LCAweDFCRDUsIDB4ODBEQSwgMHgwN0RELCAweDgwREIsIDB4MDdFMiwKKyAgICAweDgwREMsIDB4MUJENiwgMHg4MERELCAweDA3RTYsIDB4ODBERSwgMHgwN0U0LCAweDgwRTAsIDB4MUJDRSwgMHg4MEUxLAorICAgIDB4MDdFMSwgMHg4MEUzLCAweDFCRDQsIDB4ODBFNCwgMHgwN0U1LCAweDgwRTUsIDB4MDdEQywgMHg4MEU2LCAweDFCREMsCisgICAgMHg4MEVELCAweDA5OEEsIDB4ODBFRiwgMHgwOTkzLCAweDgwRjAsIDB4MDk4OCwgMHg4MEYxLCAweDA5ODYsIDB4ODBGMiwKKyAgICAweDFEQjcsIDB4ODBGMywgMHgwOThFLCAweDgwRjQsIDB4MDk4QiwgMHg4MEY1LCAweDFEQjksIDB4ODBGOCwgMHgwOThELAorICAgIDB4ODBGOSwgMHgxREI4LCAweDgwRkEsIDB4MURCNiwgMHg4MEZCLCAweDFEQkIsIDB4ODBGQywgMHgwOTkyLCAweDgwRkQsCisgICAgMHgwOTkwLCAweDgwRkUsIDB4MjI3QywgMHg4MTAwLCAweDFEQkMsIDB4ODEwMSwgMHgxREJBLCAweDgxMDIsIDB4MDk4NywKKyAgICAweDgxMDUsIDB4MDk4OSwgMHg4MTA2LCAweDA5OEMsIDB4ODEwOCwgMHgwOThGLCAweDgxMEEsIDB4MDk5MSwgMHg4MTE1LAorICAgIDB4MjAwRiwgMHg4MTE2LCAweDBCNkIsIDB4ODExOCwgMHgyMDA2LCAweDgxMTksIDB4MjAwOCwgMHg4MTFCLCAweDIwMDksCisgICAgMHg4MTFELCAweDIwMTEsIDB4ODExRSwgMHgyMDBELCAweDgxMUYsIDB4MjAwQiwgMHg4MTIxLCAweDIwMEUsIDB4ODEyMiwKKyAgICAweDIwMTIsIDB4ODEyMywgMHgwQjZDLCAweDgxMjQsIDB4MEI3MCwgMHg4MTI1LCAweDIwMDcsIDB4ODEyNywgMHgyMDEwLAorICAgIDB4ODEyOSwgMHgwQjZFLCAweDgxMkIsIDB4MEI2RCwgMHg4MTJDLCAweDIwMEMsIDB4ODEyRCwgMHgyMDBBLCAweDgxMkYsCisgICAgMHgwQjZBLCAweDgxMzAsIDB4MEI2RiwgMHg4MTM5LCAweDBEMjYsIDB4ODEzQSwgMHgyMjg1LCAweDgxM0QsIDB4MjI4MywKKyAgICAweDgxM0UsIDB4MEQyOCwgMHg4MTQzLCAweDIyN0UsIDB4ODE0NCwgMHgyNTI3LCAweDgxNDYsIDB4MEQyNywgMHg4MTQ3LAorICAgIDB4MjI4MiwgMHg4MTRBLCAweDIyN0YsIDB4ODE0QiwgMHgwRDIzLCAweDgxNEMsIDB4MEQyOSwgMHg4MTRELCAweDIyODQsCisgICAgMHg4MTRFLCAweDBEMjUsIDB4ODE0RiwgMHgyMjgxLCAweDgxNTAsIDB4MTA3NSwgMHg4MTUxLCAweDBEMjQsIDB4ODE1MiwKKyAgICAweDIyODAsIDB4ODE1MywgMHgwRDJBLCAweDgxNTQsIDB4MEQyMiwgMHg4MTU1LCAweDBEMjEsIDB4ODE1QiwgMHgyNTFGLAorICAgIDB4ODE1QywgMHgyNTFELCAweDgxNUUsIDB4MjUyMywgMHg4MTYwLCAweDI1MUIsIDB4ODE2MSwgMHgyNTI4LCAweDgxNjIsCisgICAgMHgyNTIwLCAweDgxNjQsIDB4MjUxQSwgMHg4MTY1LCAweDBFRDIsIDB4ODE2NiwgMHgwRUQ4LCAweDgxNjcsIDB4MjUyNSwKKyAgICAweDgxNjksIDB4MjUxRSwgMHg4MTZCLCAweDBFRDUsIDB4ODE2RSwgMHgwRUQzLCAweDgxNkYsIDB4MjUyNiwgMHg4MTcwLAorICAgIDB4MEVEMCwgMHg4MTcxLCAweDBFQ0YsIDB4ODE3MiwgMHgyNTIxLCAweDgxNzMsIDB4MEVENCwgMHg4MTc0LCAweDBEMkIsCisgICAgMHg4MTc2LCAweDI1MjQsIDB4ODE3NywgMHgyNTFDLCAweDgxNzgsIDB4MEVEMSwgMHg4MTc5LCAweDBFRDYsIDB4ODE3QSwKKyAgICAweDBFRDcsIDB4ODE3RiwgMHgxMDdBLCAweDgxODAsIDB4MTA3NiwgMHg4MTgyLCAweDEwN0IsIDB4ODE4MywgMHgyN0EwLAorICAgIDB4ODE4NiwgMHgyNzlGLCAweDgxODcsIDB4MjdBMSwgMHg4MTg4LCAweDEwNzgsIDB4ODE4OSwgMHgyNzlFLCAweDgxOEEsCisgICAgMHgxMDc5LCAweDgxOEIsIDB4MjdBNCwgMHg4MThDLCAweDI3QTMsIDB4ODE4RCwgMHgyN0EyLCAweDgxOEYsIDB4MTA3NywKKyAgICAweDgxOTUsIDB4MjlEMSwgMHg4MTk3LCAweDI5RDQsIDB4ODE5OCwgMHgxMUVGLCAweDgxOTksIDB4MjlEMywgMHg4MTlBLAorICAgIDB4MTFFRSwgMHg4MTlCLCAweDExRUEsIDB4ODE5QywgMHgxMUVCLCAweDgxOUQsIDB4MTFFQywgMHg4MTlFLCAweDI5RDAsCisgICAgMHg4MTlGLCAweDI5Q0YsIDB4ODFBMCwgMHgxMUVELCAweDgxQTIsIDB4MjlEMiwgMHg4MUEzLCAweDI5Q0UsIDB4ODFBNiwKKyAgICAweDJDMzAsIDB4ODFBNywgMHgyQzNBLCAweDgxQTgsIDB4MTMzMSwgMHg4MUE5LCAweDEzMzAsIDB4ODFBQiwgMHgyQzM0LAorICAgIDB4ODFBQywgMHgyQzM2LCAweDgxQUUsIDB4MkMzMSwgMHg4MUIwLCAweDJDMzUsIDB4ODFCMSwgMHgyQzJGLCAweDgxQjIsCisgICAgMHgyQzM4LCAweDgxQjMsIDB4MTMyRiwgMHg4MUI0LCAweDJDMzcsIDB4ODFCNSwgMHgyQzMzLCAweDgxQjcsIDB4MkMzOSwKKyAgICAweDgxQjksIDB4MkMzMiwgMHg4MUJBLCAweDE0NTAsIDB4ODFCQiwgMHgyRTA2LCAweDgxQkMsIDB4MkUwQywgMHg4MUJELAorICAgIDB4MTQ1NCwgMHg4MUJFLCAweDE0NTYsIDB4ODFCRiwgMHgxNDUzLCAweDgxQzAsIDB4MTQ1MiwgMHg4MUMyLCAweDE0NTEsCisgICAgMHg4MUMzLCAweDE0NEYsIDB4ODFDNCwgMHgyRTA3LCAweDgxQzUsIDB4MkUwQSwgMHg4MUM2LCAweDE0NEUsIDB4ODFDNywKKyAgICAweDJFMEIsIDB4ODFDOSwgMHgxNDU1LCAweDgxQ0EsIDB4MkUwOSwgMHg4MUNDLCAweDJFMDgsIDB4ODFDRCwgMHgxNTE4LAorICAgIDB4ODFDRiwgMHgxNTE5LCAweDgxRDAsIDB4MkY5NCwgMHg4MUQxLCAweDJGOTIsIDB4ODFEMiwgMHgyRjkzLCAweDgxRDUsCisgICAgMHgzMEVELCAweDgxRDcsIDB4MzBFQywgMHg4MUQ4LCAweDE1QjMsIDB4ODFEOSwgMHgzMjFDLCAweDgxREEsIDB4MTYzNSwKKyAgICAweDgxREIsIDB4MzIxQiwgMHg4MURELCAweDMyRjUsIDB4ODFERSwgMHgzM0E1LCAweDgxREYsIDB4MTZENCwgMHg4MUUwLAorICAgIDB4MzRERCwgMHg4MUUxLCAweDM0REUsIDB4ODFFMiwgMHgxNzA2LCAweDgxRTMsIDB4MDQwNSwgMHg4MUU1LCAweDA2NzYsCisgICAgMHg4MUU2LCAweDIyODYsIDB4ODFFNywgMHgxMDdDLCAweDgxRTgsIDB4MTQ1NywgMHg4MUU5LCAweDJFMEQsIDB4ODFFQSwKKyAgICAweDA0MDYsIDB4ODFFQywgMHgwOTk1LCAweDgxRUQsIDB4MDk5NCwgMHg4MUVFLCAweDIyODcsIDB4ODFGMiwgMHgyQzNCLAorICAgIDB4ODFGMywgMHgwNDA3LCAweDgxRjQsIDB4MDdFNywgMHg4MUY3LCAweDIyODgsIDB4ODFGOCwgMHgyMjg5LCAweDgxRjksCisgICAgMHgyMjhBLCAweDgxRkEsIDB4MTA3RCwgMHg4MUZCLCAweDEzMzIsIDB4ODFGQywgMHgwNDA4LCAweDgxRkUsIDB4MDY3NywKKyAgICAweDgxRkYsIDB4MUJERSwgMHg4MjAwLCAweDA5OTYsIDB4ODIwMSwgMHgxREJELCAweDgyMDIsIDB4MEI3MSwgMHg4MjA0LAorICAgIDB4MjI4QiwgMHg4MjA1LCAweDBFRDksIDB4ODIwNywgMHgxMDdFLCAweDgyMDgsIDB4MTMzMywgMHg4MjA5LCAweDE0NTgsCisgICAgMHg4MjBBLCAweDE1MUEsIDB4ODIwQiwgMHgzMEVFLCAweDgyMEMsIDB4MDQwOSwgMHg4MjBELCAweDA2NzgsIDB4ODIxMCwKKyAgICAweDA5OTcsIDB4ODIxMSwgMHgyMDEzLCAweDgyMTIsIDB4MEQyQywgMHg4MjE0LCAweDEwN0YsIDB4ODIxNSwgMHgyN0E1LAorICAgIDB4ODIxNiwgMHgyOUQ1LCAweDgyMUIsIDB4MDQwQSwgMHg4MjFDLCAweDBEMkQsIDB4ODIxRCwgMHgyNTI5LCAweDgyMUUsCisgICAgMHgxMDgwLCAweDgyMUYsIDB4MDQwQiwgMHg4MjIwLCAweDFBMkUsIDB4ODIyMSwgMHgxQkRGLCAweDgyMjIsIDB4MDdFOCwKKyAgICAweDgyMjUsIDB4MURCRiwgMHg4MjI4LCAweDA5OUEsIDB4ODIyQSwgMHgwOTk4LCAweDgyMkIsIDB4MDk5OSwgMHg4MjJDLAorICAgIDB4MDk5QiwgMHg4MjJGLCAweDFEQkUsIDB4ODIzMiwgMHgyMDE4LCAweDgyMzMsIDB4MjAxNSwgMHg4MjM0LCAweDIwMTcsCisgICAgMHg4MjM1LCAweDBCNzIsIDB4ODIzNiwgMHgwQjc0LCAweDgyMzcsIDB4MEI3MywgMHg4MjM4LCAweDIwMTQsIDB4ODIzOSwKKyAgICAweDBCNzUsIDB4ODIzQSwgMHgyMDE2LCAweDgyM0MsIDB4MjI4QywgMHg4MjNELCAweDIyOEQsIDB4ODIzRiwgMHgyMjhFLAorICAgIDB4ODI0MCwgMHgyNTJDLCAweDgyNDIsIDB4MjUyRCwgMHg4MjQ0LCAweDI1MkIsIDB4ODI0NSwgMHgyNTJFLCAweDgyNDcsCisgICAgMHgwRURBLCAweDgyNDksIDB4MjUyQSwgMHg4MjRCLCAweDEwODEsIDB4ODI0RSwgMHgyOURBLCAweDgyNEYsIDB4MjlENiwKKyAgICAweDgyNTAsIDB4MjlEOSwgMHg4MjUxLCAweDI5REIsIDB4ODI1MiwgMHgyOUQ4LCAweDgyNTMsIDB4MjlENywgMHg4MjU1LAorICAgIDB4MkMzQywgMHg4MjU2LCAweDJDM0QsIDB4ODI1NywgMHgyQzNFLCAweDgyNTgsIDB4MTMzNCwgMHg4MjU5LCAweDEzMzUsCisgICAgMHg4MjVBLCAweDJFMEYsIDB4ODI1QiwgMHgyRTBFLCAweDgyNUMsIDB4MkUxMCwgMHg4MjVFLCAweDJGOTYsIDB4ODI1RiwKKyAgICAweDJGOTUsIDB4ODI2MSwgMHgzMEYwLCAweDgyNjMsIDB4MzBGMSwgMHg4MjY0LCAweDMwRUYsIDB4ODI2NiwgMHgxNjM2LAorICAgIDB4ODI2OCwgMHgzMjFELCAweDgyNjksIDB4MzIxRSwgMHg4MjZCLCAweDMzQTYsIDB4ODI2QywgMHgzNDJELCAweDgyNkQsCisgICAgMHgzNDk2LCAweDgyNkUsIDB4MDQwQywgMHg4MjZGLCAweDA1MDQsIDB4ODI3MSwgMHgxNDU5LCAweDgyNzIsIDB4MDQwRCwKKyAgICAweDgyNzQsIDB4MjAxOSwgMHg4Mjc1LCAweDIyOEYsIDB4ODI3NywgMHgxNzJFLCAweDgyNzgsIDB4MTgxMywgMHg4MjdDLAorICAgIDB4MTgxNCwgMHg4MjdELCAweDE4MTYsIDB4ODI3RSwgMHgwNDBFLCAweDgyN0YsIDB4MTgxNywgMHg4MjgwLCAweDE4MTUsCisgICAgMHg4MjgzLCAweDE4RTUsIDB4ODI4NCwgMHgxOEU2LCAweDgyODUsIDB4MThFMCwgMHg4MjhBLCAweDE4RTQsIDB4ODI4QiwKKyAgICAweDA1MDYsIDB4ODI4RCwgMHgwNTA3LCAweDgyOEUsIDB4MThFMSwgMHg4MjhGLCAweDE4REYsIDB4ODI5MCwgMHgxOERFLAorICAgIDB4ODI5MSwgMHgxOEUyLCAweDgyOTIsIDB4MDUwNSwgMHg4MjkzLCAweDE4RTMsIDB4ODI5NCwgMHgxQkUwLCAweDgyOTgsCisgICAgMHgxQTMzLCAweDgyOTksIDB4MDY3QiwgMHg4MjlBLCAweDFBMzIsIDB4ODI5QiwgMHgxQTM0LCAweDgyOUQsIDB4MDY3QSwKKyAgICAweDgyOUUsIDB4MUEzOSwgMHg4MjlGLCAweDA2N0UsIDB4ODJBMCwgMHgxQTJGLCAweDgyQTEsIDB4MUEzRCwgMHg4MkEyLAorICAgIDB4MUE0MywgMHg4MkEzLCAweDA2ODUsIDB4ODJBNCwgMHgxQTQwLCAweDgyQTUsIDB4MDY4MiwgMHg4MkE3LCAweDFBMzYsCisgICAgMHg4MkE4LCAweDFBM0MsIDB4ODJBOSwgMHgxQTNFLCAweDgyQUIsIDB4MUEzMSwgMHg4MkFDLCAweDA2ODEsIDB4ODJBRCwKKyAgICAweDA2N0MsIDB4ODJBRSwgMHgxQTM3LCAweDgyQUYsIDB4MDY4MywgMHg4MkIwLCAweDA2ODYsIDB4ODJCMSwgMHgwNjgwLAorICAgIDB4ODJCMywgMHgwNjc5LCAweDgyQjQsIDB4MUEzQiwgMHg4MkI1LCAweDFBMzUsIDB4ODJCNiwgMHgxQTQyLCAweDgyQjcsCisgICAgMHgwNjg4LCAweDgyQjgsIDB4MDY4NCwgMHg4MkI5LCAweDA2N0YsIDB4ODJCQSwgMHgxQTNBLCAweDgyQkIsIDB4MDk5QywKKyAgICAweDgyQkMsIDB4MUEzOCwgMHg4MkJELCAweDA2N0QsIDB4ODJCRSwgMHgwNjg3LCAweDgyQzAsIDB4MUEzMCwgMHg4MkMyLAorICAgIDB4MUEzRiwgMHg4MkMzLCAweDFBNDEsIDB4ODJEMSwgMHgwN0Y5LCAweDgyRDIsIDB4MDdGMywgMHg4MkQzLCAweDA3RkIsCisgICAgMHg4MkQ0LCAweDA3RjgsIDB4ODJENSwgMHgxQkU3LCAweDgyRDYsIDB4MUJFQSwgMHg4MkQ3LCAweDA3RjQsIDB4ODJEOSwKKyAgICAweDFCRTEsIDB4ODJEQiwgMHgwN0VELCAweDgyREMsIDB4MDdGNywgMHg4MkRFLCAweDA3RkEsIDB4ODJERiwgMHgwN0ZDLAorICAgIDB4ODJFMCwgMHgxQkY2LCAweDgyRTEsIDB4MUJFRCwgMHg4MkUzLCAweDA3RUMsIDB4ODJFNCwgMHgxQkY1LCAweDgyRTUsCisgICAgMHgwN0YwLCAweDgyRTYsIDB4MDdFRSwgMHg4MkU3LCAweDA3RTksIDB4ODJFOCwgMHgxQkU1LCAweDgyRUEsIDB4MUJGNCwKKyAgICAweDgyRUIsIDB4MUJFOSwgMHg4MkVDLCAweDFCRUMsIDB4ODJFRCwgMHgxQkY5LCAweDgyRUYsIDB4MDdGRCwgMHg4MkYwLAorICAgIDB4MUJGMywgMHg4MkYxLCAweDA3RjUsIDB4ODJGMiwgMHgxQkVFLCAweDgyRjMsIDB4MUJGOCwgMHg4MkY0LCAweDFCRUIsCisgICAgMHg4MkY1LCAweDFCRUYsIDB4ODJGNiwgMHgxQkYyLCAweDgyRjksIDB4MUJFMywgMHg4MkZBLCAweDFCRjcsIDB4ODJGQiwKKyAgICAweDFCRjEsIDB4ODJGRSwgMHgxQkUyLCAweDgzMDAsIDB4MUJFNiwgMHg4MzAxLCAweDA3RjYsIDB4ODMwMiwgMHgwN0YxLAorICAgIDB4ODMwMywgMHgwN0VBLCAweDgzMDQsIDB4MDdFRiwgMHg4MzA1LCAweDA3RUIsIDB4ODMwNiwgMHgwN0ZFLCAweDgzMDcsCisgICAgMHgxQkU0LCAweDgzMDgsIDB4MUREMCwgMHg4MzA5LCAweDA3RjIsIDB4ODMwQywgMHgxQkYwLCAweDgzMEQsIDB4MUE3RCwKKyAgICAweDgzMTYsIDB4MUREMywgMHg4MzE3LCAweDA5QUEsIDB4ODMxOSwgMHgxREMzLCAweDgzMUIsIDB4MURDRSwgMHg4MzFDLAorICAgIDB4MURDQSwgMHg4MzFFLCAweDFEREQsIDB4ODMyMCwgMHgxREQ1LCAweDgzMjIsIDB4MURDQiwgMHg4MzI0LCAweDFERDQsCisgICAgMHg4MzI1LCAweDFEQzUsIDB4ODMyNiwgMHgxREM5LCAweDgzMjcsIDB4MURFMCwgMHg4MzI4LCAweDA5QUQsIDB4ODMyOSwKKyAgICAweDFERDgsIDB4ODMyQSwgMHgxRENGLCAweDgzMkIsIDB4MDk5RCwgMHg4MzJDLCAweDFEREUsIDB4ODMyRCwgMHgxREMxLAorICAgIDB4ODMyRiwgMHgxREQ3LCAweDgzMzEsIDB4MDlBQywgMHg4MzMyLCAweDA5QTcsIDB4ODMzMywgMHgxREMwLCAweDgzMzQsCisgICAgMHgwOUE1LCAweDgzMzUsIDB4MDlBNCwgMHg4MzM2LCAweDA5QTksIDB4ODMzNywgMHgxREQ2LCAweDgzMzgsIDB4MDlBMSwKKyAgICAweDgzMzksIDB4MDlBOCwgMHg4MzNBLCAweDFCRTgsIDB4ODMzQiwgMHgyMjkwLCAweDgzM0MsIDB4MUREMSwgMHg4MzNGLAorICAgIDB4MURDNywgMHg4MzQwLCAweDA5QUIsIDB4ODM0MSwgMHgxREM4LCAweDgzNDIsIDB4MURDQywgMHg4MzQzLCAweDA5QUUsCisgICAgMHg4MzQ0LCAweDFEQzIsIDB4ODM0NSwgMHgxRERBLCAweDgzNDcsIDB4MUREOSwgMHg4MzQ4LCAweDFERTEsIDB4ODM0OSwKKyAgICAweDA5QTMsIDB4ODM0QSwgMHgwOUEwLCAweDgzNEIsIDB4MURERiwgMHg4MzRDLCAweDFEREIsIDB4ODM0RCwgMHgxREQyLAorICAgIDB4ODM0RSwgMHgxRENELCAweDgzNEYsIDB4MDlBNiwgMHg4MzUwLCAweDA5QTIsIDB4ODM1MSwgMHgxREM0LCAweDgzNTIsCisgICAgMHgwOTlFLCAweDgzNTMsIDB4MUREQywgMHg4MzU0LCAweDA5OUYsIDB4ODM1NiwgMHgxREM2LCAweDgzNzMsIDB4MjAxRiwKKyAgICAweDgzNzQsIDB4MjAyMSwgMHg4Mzc1LCAweDIwMjYsIDB4ODM3NiwgMHgyMDNBLCAweDgzNzcsIDB4MEI4MywgMHg4Mzc4LAorICAgIDB4MEI3OSwgMHg4MzdBLCAweDIwMUUsIDB4ODM3QiwgMHgwQjg0LCAweDgzN0MsIDB4MEI4NSwgMHg4MzdELCAweDIwMjksCisgICAgMHg4MzdFLCAweDIwMzAsIDB4ODM3RiwgMHgyMDM2LCAweDgzODEsIDB4MjAyMywgMHg4MzgzLCAweDIwMkEsIDB4ODM4NiwKKyAgICAweDBCODYsIDB4ODM4NywgMHgyMDM4LCAweDgzODgsIDB4MjAzMywgMHg4Mzg5LCAweDBCODEsIDB4ODM4QSwgMHgwQjdGLAorICAgIDB4ODM4QiwgMHgyMDJGLCAweDgzOEMsIDB4MjAyQiwgMHg4MzhELCAweDIwMUQsIDB4ODM4RSwgMHgwQjc2LCAweDgzOEYsCisgICAgMHgyMDIyLCAweDgzOTAsIDB4MjAxQSwgMHg4MzkyLCAweDBCN0UsIDB4ODM5MywgMHgwQjgwLCAweDgzOTQsIDB4MjAyNywKKyAgICAweDgzOTUsIDB4MjAyNCwgMHg4Mzk2LCAweDBCN0IsIDB4ODM5NywgMHgyMDM0LCAweDgzOTgsIDB4MEI3OCwgMHg4Mzk5LAorICAgIDB4MjAyNSwgMHg4MzlBLCAweDIyQjksIDB4ODM5QiwgMHgyMDJELCAweDgzOUQsIDB4MjAyQywgMHg4MzlFLCAweDBCNzcsCisgICAgMHg4M0EwLCAweDBCODIsIDB4ODNBMiwgMHgwQjdBLCAweDgzQTMsIDB4MjAxQiwgMHg4M0E0LCAweDIwMjAsIDB4ODNBNSwKKyAgICAweDIwMzEsIDB4ODNBNiwgMHgyMDM3LCAweDgzQTcsIDB4MEI4NywgMHg4M0E4LCAweDIwMUMsIDB4ODNBOSwgMHgyMDI4LAorICAgIDB4ODNBQSwgMHgyMDJFLCAweDgzQUIsIDB4MEI3RCwgMHg4M0FFLCAweDIwMzksIDB4ODNBRiwgMHgyMDMyLCAweDgzQjAsCisgICAgMHgyMDM1LCAweDgzQkQsIDB4MEI3QywgMHg4M0JGLCAweDIyQTAsIDB4ODNDMCwgMHgyMjk0LCAweDgzQzEsIDB4MEQzNSwKKyAgICAweDgzQzIsIDB4MjJCMSwgMHg4M0MzLCAweDIyQkEsIDB4ODNDNCwgMHgyMkJELCAweDgzQzUsIDB4MEQzMywgMHg4M0M2LAorICAgIDB4MjI5QywgMHg4M0M3LCAweDIyQjUsIDB4ODNDOCwgMHgyMjlELCAweDgzQzksIDB4MjJBQiwgMHg4M0NBLCAweDBENDAsCisgICAgMHg4M0NCLCAweDIyQTcsIDB4ODNDQywgMHgwRDNELCAweDgzQ0UsIDB4MjJBOCwgMHg4M0NGLCAweDIyOTEsIDB4ODNEMSwKKyAgICAweDIyQjYsIDB4ODNENCwgMHgwRDQ2LCAweDgzRDUsIDB4MjJCMywgMHg4M0Q2LCAweDIyQTksIDB4ODNENywgMHgyMkJGLAorICAgIDB4ODNEOCwgMHgyMkE0LCAweDgzRDksIDB4MjU0RSwgMHg4M0RCLCAweDIyQzIsIDB4ODNEQywgMHgwRDQ0LCAweDgzREQsCisgICAgMHgyMkEyLCAweDgzREUsIDB4MjJBRSwgMHg4M0RGLCAweDBENDcsIDB4ODNFMCwgMHgwRDMyLCAweDgzRTEsIDB4MjJBNiwKKyAgICAweDgzRTIsIDB4MjJDMCwgMHg4M0UzLCAweDIyOUYsIDB4ODNFNCwgMHgyMjk4LCAweDgzRTUsIDB4MjJBMywgMHg4M0U3LAorICAgIDB4MjI5NywgMHg4M0U4LCAweDIyOTUsIDB4ODNFOSwgMHgwRDJFLCAweDgzRUEsIDB4MjJCNywgMHg4M0VCLCAweDIyOUUsCisgICAgMHg4M0VDLCAweDIyQkIsIDB4ODNFRSwgMHgyMkJDLCAweDgzRUYsIDB4MEQzNiwgMHg4M0YwLCAweDBEM0IsIDB4ODNGMSwKKyAgICAweDBEMzcsIDB4ODNGMiwgMHgwRDNGLCAweDgzRjMsIDB4MjJCMiwgMHg4M0Y0LCAweDBEMzgsIDB4ODNGNSwgMHgyMkFBLAorICAgIDB4ODNGNiwgMHgyMjlBLCAweDgzRjgsIDB4MEQzMCwgMHg4M0Y5LCAweDIyOTIsIDB4ODNGQSwgMHgyMkI0LCAweDgzRkIsCisgICAgMHgyMkJFLCAweDgzRkMsIDB4MjI5OSwgMHg4M0ZELCAweDBEM0UsIDB4ODNGRSwgMHgyMkMzLCAweDgzRkYsIDB4MjJBNSwKKyAgICAweDg0MDEsIDB4MjJBMSwgMHg4NDAzLCAweDBEMkYsIDB4ODQwNCwgMHgwRDQzLCAweDg0MDYsIDB4MjJCMCwgMHg4NDA3LAorICAgIDB4MEQ0NSwgMHg4NDA5LCAweDIyQUMsIDB4ODQwQSwgMHgwRDNBLCAweDg0MEIsIDB4MEQzNCwgMHg4NDBDLCAweDBEM0MsCisgICAgMHg4NDBELCAweDBEMzEsIDB4ODQwRSwgMHgwRDQyLCAweDg0MEYsIDB4MjJBRCwgMHg4NDEwLCAweDIyOUIsIDB4ODQxMSwKKyAgICAweDIyQUYsIDB4ODQxMiwgMHgyMjk2LCAweDg0MTMsIDB4MjJCOCwgMHg4NDFCLCAweDIyQzEsIDB4ODQyMywgMHgyMjkzLAorICAgIDB4ODQyOSwgMHgyNTRELCAweDg0MkIsIDB4MjU2MywgMHg4NDJDLCAweDBFQUMsIDB4ODQyRCwgMHgyNTUyLCAweDg0MkYsCisgICAgMHgyNTUwLCAweDg0MzAsIDB4MjUzQiwgMHg4NDMxLCAweDBFREUsIDB4ODQzMiwgMHgyNTRCLCAweDg0MzMsIDB4MjU1RiwKKyAgICAweDg0MzQsIDB4MjU0NywgMHg4NDM1LCAweDBFRTYsIDB4ODQzNiwgMHgyNTVFLCAweDg0MzcsIDB4MjU0NSwgMHg4NDM4LAorICAgIDB4MEQ0MSwgMHg4NDM5LCAweDI1NTUsIDB4ODQzQSwgMHgyNTQ2LCAweDg0M0IsIDB4MjU1QywgMHg4NDNDLCAweDBFRTUsCisgICAgMHg4NDNELCAweDBFREQsIDB4ODQzRiwgMHgyNTMwLCAweDg0NDAsIDB4MjUzOCwgMHg4NDQyLCAweDI1NTEsIDB4ODQ0MywKKyAgICAweDI1NDksIDB4ODQ0NCwgMHgyNTYyLCAweDg0NDUsIDB4MjU0QywgMHg4NDQ2LCAweDBFRUIsIDB4ODQ0NywgMHgyNTVELAorICAgIDB4ODQ0OSwgMHgwRUUyLCAweDg0NEIsIDB4MjU0RiwgMHg4NDRDLCAweDI1NTcsIDB4ODQ0RCwgMHgyNTNDLCAweDg0NEUsCisgICAgMHgyNTU2LCAweDg0NTAsIDB4MjU2NywgMHg4NDUxLCAweDI1MzcsIDB4ODQ1MiwgMHgyNTU4LCAweDg0NTQsIDB4MjU2NSwKKyAgICAweDg0NTYsIDB4MjUzMSwgMHg4NDU3LCAweDBEMzksIDB4ODQ1OSwgMHgyNTNGLCAweDg0NUEsIDB4MjUzRSwgMHg4NDVCLAorICAgIDB4MEVFNCwgMHg4NDVELCAweDI1NDIsIDB4ODQ1RSwgMHgyNTQ0LCAweDg0NUYsIDB4MjU1MywgMHg4NDYwLCAweDI1NjQsCisgICAgMHg4NDYxLCAweDBFRTcsIDB4ODQ2MywgMHgwRUU4LCAweDg0NjUsIDB4MjUzNiwgMHg4NDY2LCAweDBFRTAsIDB4ODQ2NywKKyAgICAweDI1M0EsIDB4ODQ2OCwgMHgyNTYwLCAweDg0NjksIDB4MEVFOSwgMHg4NDZCLCAweDBFRTEsIDB4ODQ2QywgMHgwRUUzLAorICAgIDB4ODQ2RCwgMHgwRUVBLCAweDg0NkUsIDB4MjU2NiwgMHg4NDZGLCAweDI1NTksIDB4ODQ3MCwgMHgyNTU0LCAweDg0NzMsCisgICAgMHgyNTQxLCAweDg0NzQsIDB4MjU0MCwgMHg4NDc1LCAweDBFREYsIDB4ODQ3NiwgMHgyNTMyLCAweDg0NzcsIDB4MEVEQywKKyAgICAweDg0NzgsIDB4MjU0QSwgMHg4NDc5LCAweDI1MzMsIDB4ODQ3QSwgMHgyNTQ4LCAweDg0N0QsIDB4MjUzRCwgMHg4NDdFLAorICAgIDB4MjU2MSwgMHg4NDgyLCAweDBFREIsIDB4ODQ4NiwgMHgyNTM5LCAweDg0OEQsIDB4MjUzNSwgMHg4NDhFLCAweDI1NUIsCisgICAgMHg4NDhGLCAweDI1MzQsIDB4ODQ5MCwgMHgxMDhFLCAweDg0OTEsIDB4MjdDRCwgMHg4NDk0LCAweDI3QkMsIDB4ODQ5NywKKyAgICAweDI3QTYsIDB4ODQ5OCwgMHgyN0M0LCAweDg0OTksIDB4MTA4NiwgMHg4NDlBLCAweDI3QjUsIDB4ODQ5QiwgMHgyN0JGLAorICAgIDB4ODQ5QywgMHgxMDg5LCAweDg0OUQsIDB4MjdCOCwgMHg4NDlFLCAweDEwODcsIDB4ODQ5RiwgMHgyN0E5LCAweDg0QTAsCisgICAgMHgyN0M3LCAweDg0QTEsIDB4MjdBOCwgMHg4NEEyLCAweDI3QkIsIDB4ODRBNCwgMHgyN0E3LCAweDg0QTcsIDB4MjdCOSwKKyAgICAweDg0QTgsIDB4MjdDMiwgMHg4NEE5LCAweDI3QzAsIDB4ODRBQSwgMHgyN0I0LCAweDg0QUIsIDB4MjdBRiwgMHg4NEFDLAorICAgIDB4MjdBRCwgMHg4NEFFLCAweDI3QUUsIDB4ODRBRiwgMHgyN0MxLCAweDg0QjAsIDB4MjdDQywgMHg4NEIxLCAweDI3QjYsCisgICAgMHg4NEIyLCAweDEwODgsIDB4ODRCNCwgMHgyN0IxLCAweDg0QjYsIDB4MjdDNSwgMHg4NEI4LCAweDEwOEIsIDB4ODRCOSwKKyAgICAweDI3QjAsIDB4ODRCQSwgMHgyN0FBLCAweDg0QkIsIDB4MjdCQSwgMHg4NEJDLCAweDEwOEYsIDB4ODRCRiwgMHgxMDgzLAorICAgIDB4ODRDMCwgMHgxMDhDLCAweDg0QzEsIDB4MjdCMiwgMHg4NEMyLCAweDI3QUMsIDB4ODRDNCwgMHgxMDg1LCAweDg0QzUsCisgICAgMHgyNTVBLCAweDg0QzYsIDB4MTA4NCwgMHg4NEM3LCAweDI3QkQsIDB4ODRDOSwgMHgxMDgyLCAweDg0Q0EsIDB4MTA5MSwKKyAgICAweDg0Q0IsIDB4MTA4QSwgMHg4NENDLCAweDI3QkUsIDB4ODRDRCwgMHgyN0IzLCAweDg0Q0UsIDB4MjdBQiwgMHg4NENGLAorICAgIDB4MjdDNiwgMHg4NEQwLCAweDI3QjcsIDB4ODREMSwgMHgxMDkwLCAweDg0RDIsIDB4MjdDQSwgMHg4NEQzLCAweDEwOEQsCisgICAgMHg4NEQ0LCAweDI3QzksIDB4ODRENiwgMHgyN0MzLCAweDg0RDcsIDB4MjdDOCwgMHg4NERCLCAweDI3Q0IsIDB4ODRFNywKKyAgICAweDJBMDMsIDB4ODRFOCwgMHgyQTA0LCAweDg0RTksIDB4MjlGNywgMHg4NEVBLCAweDI5RjYsIDB4ODRFQiwgMHgyOUYyLAorICAgIDB4ODRFQywgMHgxMUZCLCAweDg0RUUsIDB4MTFGMywgMHg4NEVGLCAweDJBMDYsIDB4ODRGMCwgMHgyQTA1LCAweDg0RjEsCisgICAgMHgyNTJGLCAweDg0RjIsIDB4MjlFRiwgMHg4NEYzLCAweDI5RjMsIDB4ODRGNCwgMHgyOUVELCAweDg0RjYsIDB4MkEwMCwKKyAgICAweDg0RjcsIDB4MjlGMSwgMHg4NEY5LCAweDJBMDcsIDB4ODRGQSwgMHgyOUVBLCAweDg0RkIsIDB4MjlFOCwgMHg4NEZDLAorICAgIDB4MjlGNCwgMHg4NEZELCAweDI5RkUsIDB4ODRGRSwgMHgyOUY5LCAweDg0RkYsIDB4MTFGRCwgMHg4NTAwLCAweDI5REYsCisgICAgMHg4NTAyLCAweDI5RkQsIDB4ODUwNiwgMHgxMUZFLCAweDg1MDcsIDB4MjU0MywgMHg4NTA4LCAweDI5RUIsIDB4ODUwOSwKKyAgICAweDI5RTIsIDB4ODUwQSwgMHgyOUU1LCAweDg1MEIsIDB4MkEwQiwgMHg4NTBDLCAweDI5RUMsIDB4ODUwRCwgMHgyOUUzLAorICAgIDB4ODUwRSwgMHgyOUUxLCAweDg1MEYsIDB4MjlERSwgMHg4NTExLCAweDExRjcsIDB4ODUxMiwgMHgyOUY1LCAweDg1MTMsCisgICAgMHgxMUY2LCAweDg1MTQsIDB4MTFGQSwgMHg4NTE1LCAweDI5RjAsIDB4ODUxNiwgMHgyOUY4LCAweDg1MTcsIDB4MTFGMCwKKyAgICAweDg1MTgsIDB4MkEwOCwgMHg4NTE5LCAweDJBMEMsIDB4ODUxQSwgMHgxMUYyLCAweDg1MUMsIDB4MjlFNywgMHg4NTFELAorICAgIDB4MjlGQiwgMHg4NTFFLCAweDI5RkYsIDB4ODUxRiwgMHgyOUU0LCAweDg1MjAsIDB4MkEwOSwgMHg4NTIxLCAweDExRjksCisgICAgMHg4NTIzLCAweDExRjgsIDB4ODUyNCwgMHgyOURDLCAweDg1MjUsIDB4MTFGQywgMHg4NTI2LCAweDJBMDIsIDB4ODUyNywKKyAgICAweDI5RTYsIDB4ODUyOCwgMHgyOUZBLCAweDg1MjksIDB4MjlFMCwgMHg4NTJBLCAweDI5RUUsIDB4ODUyQiwgMHgyOUU5LAorICAgIDB4ODUyQywgMHgxMUY0LCAweDg1MkQsIDB4MTFGNSwgMHg4NTJFLCAweDI5RkMsIDB4ODUyRiwgMHgyQTBELCAweDg1MzAsCisgICAgMHgyQTBBLCAweDg1MzEsIDB4MkEwMSwgMHg4NTNCLCAweDI5REQsIDB4ODUzRCwgMHgxMUYxLCAweDg1M0UsIDB4MkM0RiwKKyAgICAweDg1NDAsIDB4MkM0NiwgMHg4NTQxLCAweDJDNDksIDB4ODU0MywgMHgxMzNCLCAweDg1NDQsIDB4MkM0QiwgMHg4NTQ1LAorICAgIDB4MkM0MCwgMHg4NTQ2LCAweDJDNDcsIDB4ODU0NywgMHgyQzRELCAweDg1NDgsIDB4MTMzOCwgMHg4NTQ5LCAweDEzM0MsCisgICAgMHg4NTRBLCAweDEzMzYsIDB4ODU0RCwgMHgyQzQyLCAweDg1NEUsIDB4MkM1MiwgMHg4NTUxLCAweDJDNEMsIDB4ODU1MywKKyAgICAweDJDNDMsIDB4ODU1NCwgMHgyQzVCLCAweDg1NTUsIDB4MkM1NSwgMHg4NTU2LCAweDJDM0YsIDB4ODU1NywgMHgyRTIzLAorICAgIDB4ODU1OCwgMHgyQzQ1LCAweDg1NTksIDB4MTMzNywgMHg4NTVCLCAweDJDNTAsIDB4ODU1RCwgMHgyQzVBLCAweDg1NUUsCisgICAgMHgxMzNGLCAweDg1NjAsIDB4MkM1NywgMHg4NTYxLCAweDJDNDQsIDB4ODU2MiwgMHgyQzRBLCAweDg1NjMsIDB4MkM0RSwKKyAgICAweDg1NjQsIDB4MkM0OCwgMHg4NTY1LCAweDJDNUMsIDB4ODU2NiwgMHgyQzU5LCAweDg1NjcsIDB4MkM1NiwgMHg4NTY4LAorICAgIDB4MTMzOSwgMHg4NTY5LCAweDEzM0EsIDB4ODU2QSwgMHgxMzNFLCAweDg1NkIsIDB4MkM0MSwgMHg4NTZDLCAweDJDNUQsCisgICAgMHg4NTZELCAweDEzM0QsIDB4ODU2RSwgMHgyQzUzLCAweDg1NzEsIDB4MkM1MSwgMHg4NTc1LCAweDJDNTQsIDB4ODU3NiwKKyAgICAweDJFMzAsIDB4ODU3NywgMHgyRTFELCAweDg1NzgsIDB4MkUyMiwgMHg4NTc5LCAweDJFMkYsIDB4ODU3QSwgMHgyRTIxLAorICAgIDB4ODU3QiwgMHgyRTE5LCAweDg1N0MsIDB4MkUxRSwgMHg4NTdFLCAweDE0NUMsIDB4ODU4MCwgMHgyRTEyLCAweDg1ODEsCisgICAgMHgyRTJBLCAweDg1ODIsIDB4MkUyQywgMHg4NTgzLCAweDJFMTEsIDB4ODU4NCwgMHgxNDVCLCAweDg1ODUsIDB4MkUyRSwKKyAgICAweDg1ODYsIDB4MkUyNiwgMHg4NTg3LCAweDE0NjIsIDB4ODU4OCwgMHgyRTJELCAweDg1ODksIDB4MkUxRiwgMHg4NThBLAorICAgIDB4MTQ2NCwgMHg4NThCLCAweDJFMTcsIDB4ODU4QywgMHgyQzU4LCAweDg1OEQsIDB4MkUyNywgMHg4NThFLCAweDJFMjQsCisgICAgMHg4NThGLCAweDJFMTMsIDB4ODU5MCwgMHgyRTMyLCAweDg1OTEsIDB4MTQ1RSwgMHg4NTk0LCAweDE0NUYsIDB4ODU5NSwKKyAgICAweDJFMTUsIDB4ODU5NiwgMHgyRTI1LCAweDg1OTgsIDB4MkUzMSwgMHg4NTk5LCAweDJFMjgsIDB4ODU5QSwgMHgyRTFCLAorICAgIDB4ODU5QiwgMHgxNDYxLCAweDg1OUMsIDB4MTQ1RCwgMHg4NTlELCAweDJFMjksIDB4ODU5RSwgMHgyRTFDLCAweDg1OUYsCisgICAgMHgyRTMzLCAweDg1QTAsIDB4MkUxNiwgMHg4NUExLCAweDJFMjAsIDB4ODVBMiwgMHgyRTJCLCAweDg1QTMsIDB4MkUxOCwKKyAgICAweDg1QTQsIDB4MkUxQSwgMHg4NUE2LCAweDE0NjUsIDB4ODVBNywgMHgyRTE0LCAweDg1QTgsIDB4MTQ2MywgMHg4NUE5LAorICAgIDB4MTUxQywgMHg4NUFBLCAweDE0NUEsIDB4ODVBRiwgMHgxNDYwLCAweDg1QjAsIDB4MTUyMCwgMHg4NUIxLCAweDJGQTYsCisgICAgMHg4NUIzLCAweDJGOUMsIDB4ODVCNCwgMHgyRjk3LCAweDg1QjUsIDB4MkY5RCwgMHg4NUI2LCAweDJGQTcsIDB4ODVCNywKKyAgICAweDJGQUIsIDB4ODVCOCwgMHgyRkFBLCAweDg1QjksIDB4MTUyMiwgMHg4NUJBLCAweDE1MjEsIDB4ODVCRCwgMHgyRjlFLAorICAgIDB4ODVCRSwgMHgyRkFDLCAweDg1QkYsIDB4MkZBMSwgMHg4NUMwLCAweDJGOTksIDB4ODVDMiwgMHgyRjlCLCAweDg1QzMsCisgICAgMHgyRjlBLCAweDg1QzQsIDB4MkZBMCwgMHg4NUM1LCAweDJGQTUsIDB4ODVDNiwgMHgyRjk4LCAweDg1QzcsIDB4MkY5RiwKKyAgICAweDg1QzgsIDB4MkZBNCwgMHg4NUM5LCAweDE1MUYsIDB4ODVDQiwgMHgyRkEyLCAweDg1Q0QsIDB4MTUxRCwgMHg4NUNFLAorICAgIDB4MkZBMywgMHg4NUNGLCAweDE1MUIsIDB4ODVEMCwgMHgxNTFFLCAweDg1RDEsIDB4MzEwMSwgMHg4NUQyLCAweDJGQTgsCisgICAgMHg4NUQ1LCAweDE1QjcsIDB4ODVENywgMHgzMEY5LCAweDg1RDgsIDB4MzBGRCwgMHg4NUQ5LCAweDMwRjUsIDB4ODVEQSwKKyAgICAweDMwRjgsIDB4ODVEQywgMHgzMTAwLCAweDg1REQsIDB4MTVCNSwgMHg4NURFLCAweDMxMDUsIDB4ODVERiwgMHgzMEZFLAorICAgIDB4ODVFMSwgMHgzMEY2LCAweDg1RTIsIDB4MzEwNiwgMHg4NUUzLCAweDMwRkYsIDB4ODVFNCwgMHgxNUI4LCAweDg1RTUsCisgICAgMHgxNUI5LCAweDg1RTYsIDB4MzEwMywgMHg4NUU4LCAweDMwRjcsIDB4ODVFOSwgMHgxNUI0LCAweDg1RUEsIDB4MTVCNiwKKyAgICAweDg1RUIsIDB4MzBGMiwgMHg4NUVDLCAweDMwRkEsIDB4ODVFRCwgMHgzMEY0LCAweDg1RUYsIDB4MzEwNCwgMHg4NUYwLAorICAgIDB4MzEwMiwgMHg4NUYxLCAweDMwRjMsIDB4ODVGMiwgMHgzMEZCLCAweDg1RjYsIDB4MzIyNSwgMHg4NUY3LCAweDE1QkEsCisgICAgMHg4NUY4LCAweDMwRkMsIDB4ODVGOSwgMHgxNjM4LCAweDg1RkEsIDB4MTYzQSwgMHg4NUZCLCAweDE2MzcsIDB4ODVGRCwKKyAgICAweDMyMkEsIDB4ODVGRSwgMHgzMjIyLCAweDg1RkYsIDB4MzIyMCwgMHg4NjAwLCAweDMyMjQsIDB4ODYwMSwgMHgzMjIxLAorICAgIDB4ODYwNCwgMHgzMjI2LCAweDg2MDUsIDB4MzIyOCwgMHg4NjA2LCAweDE2M0IsIDB4ODYwNywgMHgxNjNELCAweDg2MDksCisgICAgMHgzMjI3LCAweDg2MEEsIDB4MTYzRSwgMHg4NjBCLCAweDE2M0MsIDB4ODYwQywgMHgzMjI5LCAweDg2MTEsIDB4MTYzOSwKKyAgICAweDg2MTcsIDB4MTY4NSwgMHg4NjE4LCAweDMyRjYsIDB4ODYxOSwgMHgzMkZDLCAweDg2MUEsIDB4MTY4NywgMHg4NjFCLAorICAgIDB4MzIyMywgMHg4NjFDLCAweDMyRkIsIDB4ODYxRSwgMHgzMzAyLCAweDg2MUYsIDB4MzJGOSwgMHg4NjIwLCAweDMzMDAsCisgICAgMHg4NjIxLCAweDMyRkYsIDB4ODYyMiwgMHgzMjFGLCAweDg2MjMsIDB4MzJGQSwgMHg4NjI0LCAweDJGQTksIDB4ODYyNSwKKyAgICAweDMzMDMsIDB4ODYyNiwgMHgzMkY4LCAweDg2MjcsIDB4MzJGRCwgMHg4NjI5LCAweDMzMDEsIDB4ODYyQSwgMHgzMkY3LAorICAgIDB4ODYyQywgMHgzM0FBLCAweDg2MkQsIDB4MTY4NiwgMHg4NjJFLCAweDMyRkUsIDB4ODYzMSwgMHgzNDMyLCAweDg2MzIsCisgICAgMHgzM0FCLCAweDg2MzMsIDB4MzNBOSwgMHg4NjM0LCAweDMzQTcsIDB4ODYzNSwgMHgzM0E4LCAweDg2MzYsIDB4MzNBQywKKyAgICAweDg2MzgsIDB4MTcwNywgMHg4NjM5LCAweDM0MzAsIDB4ODYzQSwgMHgzNDJFLCAweDg2M0IsIDB4MzQzMywgMHg4NjNDLAorICAgIDB4MzQzMSwgMHg4NjNFLCAweDM0MzQsIDB4ODYzRiwgMHgxNzA4LCAweDg2NDAsIDB4MzQyRiwgMHg4NjQzLCAweDM0OTcsCisgICAgMHg4NjQ2LCAweDM0REYsIDB4ODY0NywgMHgzNEUwLCAweDg2NDgsIDB4MzRFMSwgMHg4NjRCLCAweDM1M0UsIDB4ODY0QywKKyAgICAweDM1MzYsIDB4ODY0RCwgMHgxODE4LCAweDg2NEUsIDB4MDY4OSwgMHg4NjUwLCAweDA3RkYsIDB4ODY1MiwgMHgxREUzLAorICAgIDB4ODY1MywgMHgxREUyLCAweDg2NTQsIDB4MDlBRiwgMHg4NjU1LCAweDBCODgsIDB4ODY1NiwgMHgyMDNDLCAweDg2NTksCisgICAgMHgyMDNCLCAweDg2NUIsIDB4MEQ0OCwgMHg4NjVDLCAweDBFRUQsIDB4ODY1RSwgMHgwRUVDLCAweDg2NUYsIDB4MEVFRSwKKyAgICAweDg2NjEsIDB4MjdDRSwgMHg4NjYyLCAweDJBMEUsIDB4ODY2MywgMHgyQzVFLCAweDg2NjQsIDB4MkM2MCwgMHg4NjY1LAorICAgIDB4MkM1RiwgMHg4NjY3LCAweDE0NjYsIDB4ODY2OCwgMHgyRTM0LCAweDg2NjksIDB4MkZBRCwgMHg4NjZBLCAweDM1MUUsCisgICAgMHg4NjZCLCAweDA0MEYsIDB4ODY2RCwgMHgxQTQ2LCAweDg2NkUsIDB4MUE0NywgMHg4NjZGLCAweDFBNDUsIDB4ODY3MCwKKyAgICAweDFBNDQsIDB4ODY3MSwgMHgwNjhBLCAweDg2NzMsIDB4MUJGRCwgMHg4Njc0LCAweDFCRkIsIDB4ODY3NywgMHgxQkZBLAorICAgIDB4ODY3OSwgMHgwODAwLCAweDg2N0EsIDB4MDgwMiwgMHg4NjdCLCAweDA4MDEsIDB4ODY3QywgMHgxQkZDLCAweDg2ODUsCisgICAgMHgxREVGLCAweDg2ODYsIDB4MURFQywgMHg4Njg3LCAweDFERUEsIDB4ODY4QSwgMHgwOUIwLCAweDg2OEIsIDB4MURFRCwKKyAgICAweDg2OEMsIDB4MDlCNSwgMHg4NjhELCAweDFERTcsIDB4ODY4RSwgMHgxREY2LCAweDg2OTAsIDB4MURGOCwgMHg4NjkxLAorICAgIDB4MURFOCwgMHg4NjkzLCAweDA5QjIsIDB4ODY5NCwgMHgxREY5LCAweDg2OTUsIDB4MURGNCwgMHg4Njk2LCAweDFERTYsCisgICAgMHg4Njk3LCAweDFERUIsIDB4ODY5OCwgMHgxREY1LCAweDg2OTksIDB4MURGMSwgMHg4NjlBLCAweDFERUUsIDB4ODY5QywKKyAgICAweDA5QjcsIDB4ODY5RCwgMHgxREY3LCAweDg2OUUsIDB4MURFOSwgMHg4NkExLCAweDFERjIsIDB4ODZBMiwgMHgxREU0LAorICAgIDB4ODZBMywgMHgwOUI2LCAweDg2QTQsIDB4MDlCMywgMHg4NkE1LCAweDFERjAsIDB4ODZBNywgMHgxREYzLCAweDg2QTgsCisgICAgMHgxREU1LCAweDg2QTksIDB4MDlCNCwgMHg4NkFBLCAweDA5QjEsIDB4ODZBRiwgMHgwQjkyLCAweDg2QjAsIDB4MjA0MywKKyAgICAweDg2QjEsIDB4MEI5MSwgMHg4NkIzLCAweDIwNDYsIDB4ODZCNCwgMHgyMDQ5LCAweDg2QjUsIDB4MEI4RSwgMHg4NkI2LAorICAgIDB4MEI4QywgMHg4NkI3LCAweDIwM0UsIDB4ODZCOCwgMHgyMDQ3LCAweDg2QjksIDB4MjA0NSwgMHg4NkJBLCAweDIwNDIsCisgICAgMHg4NkJCLCAweDIwNEEsIDB4ODZCQywgMHgyMDRCLCAweDg2QkQsIDB4MjA0RCwgMHg4NkJFLCAweDIwNEUsIDB4ODZCRiwKKyAgICAweDIwM0QsIDB4ODZDMCwgMHgwQjhCLCAweDg2QzEsIDB4MjA0MCwgMHg4NkMyLCAweDIwM0YsIDB4ODZDMywgMHgyMDRDLAorICAgIDB4ODZDNCwgMHgwQjhELCAweDg2QzUsIDB4MjA0MSwgMHg4NkM2LCAweDBCOEYsIDB4ODZDNywgMHgwQjhBLCAweDg2QzgsCisgICAgMHgyMDQ0LCAweDg2QzksIDB4MEI5MywgMHg4NkNCLCAweDBCOTAsIDB4ODZDQywgMHgyMDQ4LCAweDg2RDAsIDB4MEQ0RiwKKyAgICAweDg2RDEsIDB4MjJEMiwgMHg4NkQzLCAweDIyQzcsIDB4ODZENCwgMHgwRDRDLCAweDg2RDYsIDB4MjU2RCwgMHg4NkQ3LAorICAgIDB4MjJEMCwgMHg4NkQ4LCAweDIyQzQsIDB4ODZEOSwgMHgwRDRBLCAweDg2REEsIDB4MjJDOSwgMHg4NkRCLCAweDBENEQsCisgICAgMHg4NkRDLCAweDIyQ0QsIDB4ODZERCwgMHgyMkNCLCAweDg2REUsIDB4MEQ1MCwgMHg4NkRGLCAweDBENDksIDB4ODZFMiwKKyAgICAweDIyQzUsIDB4ODZFMywgMHgyMkM4LCAweDg2RTQsIDB4MEQ0RSwgMHg4NkU2LCAweDIyQzYsIDB4ODZFOCwgMHgyMkQxLAorICAgIDB4ODZFOSwgMHgyMkNGLCAweDg2RUEsIDB4MjJDQSwgMHg4NkVCLCAweDIyQ0MsIDB4ODZFQywgMHgyMkNFLCAweDg2RUQsCisgICAgMHgwRDRCLCAweDg2RjUsIDB4MjU2RSwgMHg4NkY2LCAweDI1NzQsIDB4ODZGNywgMHgyNTZBLCAweDg2RjgsIDB4MjU3MCwKKyAgICAweDg2RjksIDB4MEVFRiwgMHg4NkZBLCAweDI1NkMsIDB4ODZGQiwgMHgwRUY1LCAweDg2RkUsIDB4MEVGNCwgMHg4NzAwLAorICAgIDB4MEVGMywgMHg4NzAxLCAweDI1NzMsIDB4ODcwMiwgMHgwRUY2LCAweDg3MDMsIDB4MEVGNywgMHg4NzA0LCAweDI1NjksCisgICAgMHg4NzA1LCAweDI1NzYsIDB4ODcwNiwgMHgwRUY4LCAweDg3MDcsIDB4MEVGMiwgMHg4NzA4LCAweDBFRjEsIDB4ODcwOSwKKyAgICAweDI1NzIsIDB4ODcwQSwgMHgwRUY5LCAweDg3MEIsIDB4MjU2OCwgMHg4NzBDLCAweDI1NkIsIDB4ODcwRCwgMHgyNTc1LAorICAgIDB4ODcwRSwgMHgyNTcxLCAweDg3MTEsIDB4MjdFRSwgMHg4NzEyLCAweDI3RTMsIDB4ODcxMywgMHgwRUYwLCAweDg3MTgsCisgICAgMHgxMDk4LCAweDg3MTksIDB4MjdENywgMHg4NzFBLCAweDI3RUMsIDB4ODcxQiwgMHgyN0Q4LCAweDg3MUMsIDB4MTA5MywKKyAgICAweDg3MUUsIDB4MjdENSwgMHg4NzIwLCAweDI3REUsIDB4ODcyMSwgMHgyN0Q2LCAweDg3MjIsIDB4MTA5NSwgMHg4NzIzLAorICAgIDB4MjdEMCwgMHg4NzI0LCAweDI3RUIsIDB4ODcyNSwgMHgxMDk2LCAweDg3MjYsIDB4MjdFOCwgMHg4NzI3LCAweDI3RTksCisgICAgMHg4NzI4LCAweDI3RDEsIDB4ODcyOSwgMHgxMDlCLCAweDg3MkEsIDB4MjdFMCwgMHg4NzJDLCAweDI3REEsIDB4ODcyRCwKKyAgICAweDI3RTEsIDB4ODcyRSwgMHgyN0Q0LCAweDg3MzAsIDB4MjdFRCwgMHg4NzMxLCAweDI3RTUsIDB4ODczMiwgMHgyN0RGLAorICAgIDB4ODczMywgMHgyN0NGLCAweDg3MzQsIDB4MTA5NywgMHg4NzM1LCAweDI3RTYsIDB4ODczNywgMHgxMDlBLCAweDg3MzgsCisgICAgMHgyN0VBLCAweDg3M0EsIDB4MjdFNCwgMHg4NzNCLCAweDEwOTQsIDB4ODczQywgMHgyN0UyLCAweDg3M0UsIDB4MjdEQywKKyAgICAweDg3M0YsIDB4MTA5MiwgMHg4NzQwLCAweDI3RDMsIDB4ODc0MSwgMHgyN0RCLCAweDg3NDIsIDB4MjdFNywgMHg4NzQzLAorICAgIDB4MjdEOSwgMHg4NzQ2LCAweDI3REQsIDB4ODc0QywgMHgxMjA4LCAweDg3NEQsIDB4MjU2RiwgMHg4NzRFLCAweDJBMjAsCisgICAgMHg4NzRGLCAweDJBMjksIDB4ODc1MCwgMHgyQTFGLCAweDg3NTEsIDB4MkExQiwgMHg4NzUyLCAweDJBMTgsIDB4ODc1MywKKyAgICAweDEyMDksIDB4ODc1NCwgMHgyQTE2LCAweDg3NTUsIDB4MTA5OSwgMHg4NzU2LCAweDJBMEYsIDB4ODc1NywgMHgxMjA3LAorICAgIDB4ODc1OCwgMHgyQTE1LCAweDg3NTksIDB4MTIwNiwgMHg4NzVBLCAweDJBMUEsIDB4ODc1QiwgMHgyQTE3LCAweDg3NUMsCisgICAgMHgyQTI3LCAweDg3NUQsIDB4MkEyMiwgMHg4NzVFLCAweDJBMUMsIDB4ODc1RiwgMHgyQTIxLCAweDg3NjAsIDB4MTIwMiwKKyAgICAweDg3NjEsIDB4MkExOSwgMHg4NzYyLCAweDJBMkMsIDB4ODc2MywgMHgyQTEwLCAweDg3NjQsIDB4MkExMSwgMHg4NzY1LAorICAgIDB4MkEyOCwgMHg4NzY2LCAweDEyMDMsIDB4ODc2NywgMHgyQTJELCAweDg3NjgsIDB4MTIwNSwgMHg4NzY5LCAweDJBMkUsCisgICAgMHg4NzZBLCAweDJBMUUsIDB4ODc2QiwgMHgyN0QyLCAweDg3NkMsIDB4MkEyNCwgMHg4NzZELCAweDJBMUQsIDB4ODc2RSwKKyAgICAweDJBMjYsIDB4ODc2RiwgMHgyQTIzLCAweDg3NzMsIDB4MkExNCwgMHg4Nzc0LCAweDEyMDAsIDB4ODc3NSwgMHgyQTJCLAorICAgIDB4ODc3NiwgMHgxMjAxLCAweDg3NzcsIDB4MkExMiwgMHg4Nzc4LCAweDEyMDQsIDB4ODc3OSwgMHgyQzZCLCAweDg3N0EsCisgICAgMHgyQTI1LCAweDg3N0IsIDB4MkEyQSwgMHg4NzgxLCAweDJDNjgsIDB4ODc4MiwgMHgxMUZGLCAweDg3ODMsIDB4MTM0MCwKKyAgICAweDg3ODQsIDB4MkM3MiwgMHg4Nzg1LCAweDJDNkUsIDB4ODc4NywgMHgyQzZDLCAweDg3ODgsIDB4MkM2NywgMHg4Nzg5LAorICAgIDB4MkM3NiwgMHg4NzhELCAweDEzNDQsIDB4ODc4RiwgMHgyQzYzLCAweDg3OTAsIDB4MkM2RiwgMHg4NzkxLCAweDJDNzAsCisgICAgMHg4NzkyLCAweDJDNjYsIDB4ODc5MywgMHgyQzY1LCAweDg3OTQsIDB4MkM3MywgMHg4Nzk2LCAweDJDNjksIDB4ODc5NywKKyAgICAweDJDNjQsIDB4ODc5OCwgMHgyQzZBLCAweDg3OUEsIDB4MkM3NSwgMHg4NzlCLCAweDJDNjIsIDB4ODc5QywgMHgyQzc0LAorICAgIDB4ODc5RCwgMHgyQzcxLCAweDg3OUUsIDB4MTM0MiwgMHg4NzlGLCAweDEzNDEsIDB4ODdBMiwgMHgxMzQzLCAweDg3QTMsCisgICAgMHgyQzZELCAweDg3QTQsIDB4MkM2MSwgMHg4N0FBLCAweDJFMzYsIDB4ODdBQiwgMHgxNDZDLCAweDg3QUMsIDB4MkUzQSwKKyAgICAweDg3QUQsIDB4MkUzNywgMHg4N0FFLCAweDJFM0UsIDB4ODdBRiwgMHgyRTQ0LCAweDg3QjAsIDB4MkUzOSwgMHg4N0IyLAorICAgIDB4MkU0RCwgMHg4N0IzLCAweDE0NjksIDB4ODdCNCwgMHgyRTQ3LCAweDg3QjUsIDB4MkUzQywgMHg4N0I2LCAweDJFNDgsCisgICAgMHg4N0I3LCAweDJFNDMsIDB4ODdCOCwgMHgyRTRBLCAweDg3QjksIDB4MkUzQiwgMHg4N0JBLCAweDE0NkUsIDB4ODdCQiwKKyAgICAweDE0NkQsIDB4ODdCQywgMHgyRTNELCAweDg3QkQsIDB4MkU0QiwgMHg4N0JFLCAweDJFMzUsIDB4ODdCRiwgMHgyRTQ5LAorICAgIDB4ODdDMCwgMHgxNDY3LCAweDg3QzIsIDB4MkU0MSwgMHg4N0MzLCAweDJFNDAsIDB4ODdDNCwgMHgyRTQ1LCAweDg3QzUsCisgICAgMHgyRTM4LCAweDg3QzYsIDB4MTQ2QiwgMHg4N0M4LCAweDE0NkYsIDB4ODdDOSwgMHgyRTNGLCAweDg3Q0EsIDB4MkU0NiwKKyAgICAweDg3Q0IsIDB4MTQ3MCwgMHg4N0NDLCAweDJFNDIsIDB4ODdEMSwgMHgxNDY4LCAweDg3RDIsIDB4MTQ2QSwgMHg4N0QzLAorICAgIDB4MkZCQSwgMHg4N0Q0LCAweDJGQjgsIDB4ODdENywgMHgyRkJFLCAweDg3RDgsIDB4MkZCQywgMHg4N0Q5LCAweDJGQkYsCisgICAgMHg4N0RCLCAweDJGQjEsIDB4ODdEQywgMHgyRkI5LCAweDg3REQsIDB4MkZDMywgMHg4N0RFLCAweDJFNEMsIDB4ODdERiwKKyAgICAweDJGQjUsIDB4ODdFMCwgMHgxNTI2LCAweDg3RTEsIDB4MkExMywgMHg4N0UyLCAweDJGQjAsIDB4ODdFMywgMHgyRkJELAorICAgIDB4ODdFNCwgMHgyRkI3LCAweDg3RTUsIDB4MkZCNCwgMHg4N0U2LCAweDJGQUYsIDB4ODdFNywgMHgyRkFFLCAweDg3RTgsCisgICAgMHgyRkMyLCAweDg3RUEsIDB4MkZCMywgMHg4N0VCLCAweDJGQjIsIDB4ODdFQywgMHgxNTI0LCAweDg3RUQsIDB4MkZCQiwKKyAgICAweDg3RUYsIDB4MTUyMywgMHg4N0YyLCAweDE1MjUsIDB4ODdGMywgMHgyRkI2LCAweDg3RjQsIDB4MkZDMSwgMHg4N0Y2LAorICAgIDB4MzEwQSwgMHg4N0Y3LCAweDMxMEIsIDB4ODdGOSwgMHgxNUJFLCAweDg3RkEsIDB4MzEwOCwgMHg4N0ZCLCAweDE1QkIsCisgICAgMHg4N0ZDLCAweDMxMTAsIDB4ODdGRSwgMHgxNUJGLCAweDg3RkYsIDB4MzExMiwgMHg4ODAwLCAweDMxMDcsIDB4ODgwMSwKKyAgICAweDJGQzAsIDB4ODgwMiwgMHgzMTE0LCAweDg4MDMsIDB4MzEwOSwgMHg4ODA1LCAweDE1QkMsIDB4ODgwNiwgMHgzMTBGLAorICAgIDB4ODgwOCwgMHgzMTExLCAweDg4MDksIDB4MzEwQywgMHg4ODBBLCAweDMxMTMsIDB4ODgwQiwgMHgzMTBFLCAweDg4MEMsCisgICAgMHgzMTBELCAweDg4MEQsIDB4MTVCRCwgMHg4ODEwLCAweDMyMkMsIDB4ODgxMSwgMHgzMjJELCAweDg4MTMsIDB4MzIyRiwKKyAgICAweDg4MTQsIDB4MTYzRiwgMHg4ODE1LCAweDE2NDAsIDB4ODgxNiwgMHgzMjMwLCAweDg4MTcsIDB4MzIyRSwgMHg4ODE5LAorICAgIDB4MzIyQiwgMHg4ODFCLCAweDMzMDYsIDB4ODgxQywgMHgzMzA5LCAweDg4MUQsIDB4MzMwNSwgMHg4ODFGLCAweDE2OEIsCisgICAgMHg4ODIwLCAweDMzMDcsIDB4ODgyMSwgMHgxNjhBLCAweDg4MjIsIDB4MTY4OSwgMHg4ODIzLCAweDE2ODgsIDB4ODgyNCwKKyAgICAweDMzMDgsIDB4ODgyNSwgMHgzM0IxLCAweDg4MjYsIDB4MzNBRiwgMHg4ODI4LCAweDMzQUUsIDB4ODgyOSwgMHgzMzA0LAorICAgIDB4ODgyQSwgMHgzM0IwLCAweDg4MkIsIDB4MzMwQSwgMHg4ODJDLCAweDMzQUQsIDB4ODgyRSwgMHgzNDM3LCAweDg4MkYsCisgICAgMHgzNDE1LCAweDg4MzAsIDB4MzQzNSwgMHg4ODMxLCAweDE3MDksIDB4ODgzMiwgMHgzNDM2LCAweDg4MzMsIDB4MzQzOCwKKyAgICAweDg4MzUsIDB4MzQ5QSwgMHg4ODM2LCAweDE3MjgsIDB4ODgzNywgMHgzNDk5LCAweDg4MzgsIDB4MzQ5OCwgMHg4ODM5LAorICAgIDB4MTcyOSwgMHg4ODNCLCAweDE3NDcsIDB4ODgzQywgMHgzNTA4LCAweDg4M0QsIDB4MzUyMCwgMHg4ODNFLCAweDM1MUYsCisgICAgMHg4ODNGLCAweDM1MjEsIDB4ODg0MCwgMHgwNDEwLCAweDg4NDEsIDB4MUJGRSwgMHg4ODQzLCAweDFERkEsIDB4ODg0NCwKKyAgICAweDFERkIsIDB4ODg0OCwgMHgyMkQzLCAweDg4NEEsIDB4MzMwQiwgMHg4ODRCLCAweDM0OUIsIDB4ODg0QywgMHgwNDExLAorICAgIDB4ODg0RCwgMHgwODAzLCAweDg4NEUsIDB4MUJGRiwgMHg4ODUyLCAweDIwNEYsIDB4ODg1MywgMHgwQjk0LCAweDg4NTUsCisgICAgMHgyMkQ1LCAweDg4NTYsIDB4MjJENCwgMHg4ODU3LCAweDBENTEsIDB4ODg1OSwgMHgwRUZBLCAweDg4NUEsIDB4MkEyRiwKKyAgICAweDg4NUIsIDB4MTIwQSwgMHg4ODVELCAweDEyMEIsIDB4ODg2MSwgMHgxMzQ1LCAweDg4NjIsIDB4MTcyQSwgMHg4ODYzLAorICAgIDB4MDQxMiwgMHg4ODY3LCAweDFDMDAsIDB4ODg2OCwgMHgwNjhDLCAweDg4NjksIDB4MUMwMiwgMHg4ODZBLCAweDFDMDEsCisgICAgMHg4ODZCLCAweDA4MDQsIDB4ODg2RCwgMHgxREZDLCAweDg4NkYsIDB4MUUwMywgMHg4ODcwLCAweDA5QjgsIDB4ODg3MSwKKyAgICAweDFFMDEsIDB4ODg3MiwgMHgxREZGLCAweDg4NzQsIDB4MUUwNiwgMHg4ODc1LCAweDFERkQsIDB4ODg3NiwgMHgxREZFLAorICAgIDB4ODg3NywgMHgwOUI5LCAweDg4NzksIDB4MDlCRCwgMHg4ODdDLCAweDFFMDcsIDB4ODg3RCwgMHgwOUJDLCAweDg4N0UsCisgICAgMHgxRTA1LCAweDg4N0YsIDB4MUUwMiwgMHg4ODgwLCAweDFFMDAsIDB4ODg4MSwgMHgwOUJBLCAweDg4ODIsIDB4MDlCQiwKKyAgICAweDg4ODMsIDB4MUUwNCwgMHg4ODg4LCAweDBCOTYsIDB4ODg4OSwgMHgyMDUwLCAweDg4OEIsIDB4MEI5QiwgMHg4ODhDLAorICAgIDB4MjA2MCwgMHg4ODhELCAweDBCOUEsIDB4ODg4RSwgMHgyMDYyLCAweDg4OTEsIDB4MjA1NiwgMHg4ODkyLCAweDBCOTgsCisgICAgMHg4ODkzLCAweDIwNjEsIDB4ODg5NSwgMHgyMDUxLCAweDg4OTYsIDB4MEI5OSwgMHg4ODk3LCAweDIwNUQsIDB4ODg5OCwKKyAgICAweDIwNTksIDB4ODg5OSwgMHgyMDVCLCAweDg4OUEsIDB4MjA1NSwgMHg4ODlCLCAweDIwNUMsIDB4ODg5RSwgMHgwQjk1LAorICAgIDB4ODg5RiwgMHgyMDU4LCAweDg4QTEsIDB4MjA1NywgMHg4OEEyLCAweDIwNTMsIDB4ODhBNCwgMHgyMDVFLCAweDg4QTcsCisgICAgMHgyMDVBLCAweDg4QTgsIDB4MjA1MiwgMHg4OEFBLCAweDIwNTQsIDB4ODhBQiwgMHgwQjk3LCAweDg4QUMsIDB4MjA1RiwKKyAgICAweDg4QjEsIDB4MEQ1NCwgMHg4OEIyLCAweDIyRTAsIDB4ODhCNiwgMHgyMkRDLCAweDg4QjcsIDB4MjJERSwgMHg4OEI4LAorICAgIDB4MjJEOSwgMHg4OEI5LCAweDIyRDgsIDB4ODhCQSwgMHgyMkQ2LCAweDg4QkMsIDB4MjJERCwgMHg4OEJELCAweDIyREYsCisgICAgMHg4OEJFLCAweDIyREIsIDB4ODhDMCwgMHgyMkRBLCAweDg4QzEsIDB4MEQ1MiwgMHg4OEMyLCAweDBENTMsIDB4ODhDOSwKKyAgICAweDIyRTIsIDB4ODhDQSwgMHgwRjAyLCAweDg4Q0IsIDB4MjU3OCwgMHg4OENDLCAweDI1N0UsIDB4ODhDRCwgMHgyNTc5LAorICAgIDB4ODhDRSwgMHgyNTdBLCAweDg4Q0YsIDB4MzZFQSwgMHg4OEQwLCAweDI1N0YsIDB4ODhEMiwgMHgwRjA0LCAweDg4RDQsCisgICAgMHgwRUZDLCAweDg4RDUsIDB4MEYwMywgMHg4OEQ2LCAweDI1NzcsIDB4ODhENywgMHgyMkQ3LCAweDg4RDgsIDB4MEVGRiwKKyAgICAweDg4RDksIDB4MEVGRCwgMHg4OERBLCAweDI1N0QsIDB4ODhEQiwgMHgyNTdDLCAweDg4REMsIDB4MEVGRSwgMHg4OERELAorICAgIDB4MEYwMCwgMHg4OERFLCAweDI1N0IsIDB4ODhERiwgMHgwRUZCLCAweDg4RTEsIDB4MEYwMSwgMHg4OEU3LCAweDI3RjAsCisgICAgMHg4OEU4LCAweDEwQTIsIDB4ODhFQiwgMHgyN0ZCLCAweDg4RUMsIDB4MjdGQSwgMHg4OEVFLCAweDI3RjUsIDB4ODhFRiwKKyAgICAweDEwQTQsIDB4ODhGMCwgMHgyN0Y5LCAweDg4RjEsIDB4MjdGMSwgMHg4OEYyLCAweDI3RjIsIDB4ODhGMywgMHgxMDlDLAorICAgIDB4ODhGNCwgMHgxMDlFLCAweDg4RjYsIDB4MjdGNywgMHg4OEY3LCAweDI3RUYsIDB4ODhGOCwgMHgxMEEwLCAweDg4RjksCisgICAgMHgxMDlGLCAweDg4RkEsIDB4MjdGMywgMHg4OEZCLCAweDI3RjgsIDB4ODhGQywgMHgyN0Y2LCAweDg4RkQsIDB4MTBBMSwKKyAgICAweDg4RkUsIDB4MjdGNCwgMHg4OTAxLCAweDIyRTEsIDB4ODkwMiwgMHgxMDlELCAweDg5MDUsIDB4MkEzMCwgMHg4OTA2LAorICAgIDB4MkEzNywgMHg4OTA3LCAweDEyMEQsIDB4ODkwOSwgMHgyQTNCLCAweDg5MEEsIDB4MTIxMSwgMHg4OTBCLCAweDJBMzMsCisgICAgMHg4OTBDLCAweDJBMzEsIDB4ODkwRSwgMHgyQTNBLCAweDg5MTAsIDB4MTIwQywgMHg4OTExLCAweDJBMzksIDB4ODkxMiwKKyAgICAweDEyMEUsIDB4ODkxMywgMHgxMjBGLCAweDg5MTQsIDB4MkEzMiwgMHg4OTE1LCAweDEyMTAsIDB4ODkxNiwgMHgyQTM4LAorICAgIDB4ODkxNywgMHgyQTM0LCAweDg5MTgsIDB4MkEzNSwgMHg4OTE5LCAweDJBMzYsIDB4ODkxQSwgMHgxMEEzLCAweDg5MUUsCisgICAgMHgyQzc3LCAweDg5MUYsIDB4MkM4MywgMHg4OTIxLCAweDEzNEEsIDB4ODkyMiwgMHgyQzdFLCAweDg5MjMsIDB4MkM4MCwKKyAgICAweDg5MjUsIDB4MTM0OCwgMHg4OTI2LCAweDJDNzgsIDB4ODkyNywgMHgyQzdDLCAweDg5MjksIDB4MkM3RiwgMHg4OTJBLAorICAgIDB4MTM0NiwgMHg4OTJCLCAweDEzNDksIDB4ODkyQywgMHgyQzgyLCAweDg5MkQsIDB4MkM3QSwgMHg4OTJFLCAweDJDN0IsCisgICAgMHg4OTJGLCAweDJDODEsIDB4ODkzMCwgMHgyQzc5LCAweDg5MzEsIDB4MkM3RCwgMHg4OTMyLCAweDEzNDcsIDB4ODkzMywKKyAgICAweDJFNEYsIDB4ODkzNSwgMHgyRTRFLCAweDg5MzYsIDB4MTQ3MiwgMHg4OTM3LCAweDJFNTQsIDB4ODkzOCwgMHgxNDc0LAorICAgIDB4ODkzQiwgMHgxNDcxLCAweDg5M0MsIDB4MkU1MCwgMHg4OTNELCAweDE0NzUsIDB4ODkzRSwgMHgyRTUxLCAweDg5NDEsCisgICAgMHgyRTUyLCAweDg5NDIsIDB4MkU1NSwgMHg4OTQ0LCAweDE0NzMsIDB4ODk0NiwgMHgyRkM4LCAweDg5NDksIDB4MkZDQiwKKyAgICAweDg5NEIsIDB4MkZDNSwgMHg4OTRDLCAweDJGQzcsIDB4ODk0RiwgMHgyRkM2LCAweDg5NTAsIDB4MkZDOSwgMHg4OTUxLAorICAgIDB4MkZDQSwgMHg4OTUyLCAweDJFNTMsIDB4ODk1MywgMHgyRkM0LCAweDg5NTYsIDB4MTVDMiwgMHg4OTU3LCAweDMxMTgsCisgICAgMHg4OTU4LCAweDMxMUIsIDB4ODk1OSwgMHgzMTFELCAweDg5NUEsIDB4MzExNiwgMHg4OTVCLCAweDMxMTcsIDB4ODk1QywKKyAgICAweDMxMUEsIDB4ODk1RCwgMHgzMTFDLCAweDg5NUUsIDB4MTVDMywgMHg4OTVGLCAweDE1QzEsIDB4ODk2MCwgMHgxNUMwLAorICAgIDB4ODk2MSwgMHgzMTE5LCAweDg5NjIsIDB4MzExNSwgMHg4OTYzLCAweDMyMzEsIDB4ODk2NCwgMHgxNjQxLCAweDg5NjYsCisgICAgMHgzMjMyLCAweDg5NjksIDB4MzMwRCwgMHg4OTZBLCAweDE2OEMsIDB4ODk2QiwgMHgzMzBGLCAweDg5NkMsIDB4MTY4RCwKKyAgICAweDg5NkQsIDB4MzMwQywgMHg4OTZFLCAweDMzMEUsIDB4ODk2RiwgMHgxNkQ2LCAweDg5NzEsIDB4MzNCMiwgMHg4OTcyLAorICAgIDB4MTZENSwgMHg4OTczLCAweDM0M0IsIDB4ODk3NCwgMHgzNDNBLCAweDg5NzYsIDB4MzQzOSwgMHg4OTc5LCAweDM0RTIsCisgICAgMHg4OTdBLCAweDM0RTMsIDB4ODk3QiwgMHgzNEU1LCAweDg5N0MsIDB4MzRFNCwgMHg4OTdFLCAweDE4MTksIDB4ODk3RiwKKyAgICAweDA0MTMsIDB4ODk4MSwgMHgwODA1LCAweDg5ODIsIDB4MjA2MywgMHg4OTgzLCAweDBENTUsIDB4ODk4NSwgMHgyNTgwLAorICAgIDB4ODk4NiwgMHgxNTI3LCAweDg5ODgsIDB4MzExRSwgMHg4OThCLCAweDA1MDgsIDB4ODk4RiwgMHgwQjlELCAweDg5OTMsCisgICAgMHgwQjlDLCAweDg5OTUsIDB4MjJFMywgMHg4OTk2LCAweDBENTYsIDB4ODk5NywgMHgyMkU1LCAweDg5OTgsIDB4MjJFNCwKKyAgICAweDg5OUIsIDB4MjU4MSwgMHg4OTlDLCAweDBGMDUsIDB4ODk5RCwgMHgyN0ZDLCAweDg5OUUsIDB4MjdGRiwgMHg4OTlGLAorICAgIDB4MjdGRSwgMHg4OUExLCAweDI3RkQsIDB4ODlBMiwgMHgyQTNDLCAweDg5QTMsIDB4MkEzRSwgMHg4OUE0LCAweDJBM0QsCisgICAgMHg4OUE2LCAweDEzNEMsIDB4ODlBQSwgMHgxMzRCLCAweDg5QUMsIDB4MTQ3NiwgMHg4OUFELCAweDJFNTYsIDB4ODlBRSwKKyAgICAweDJFNTgsIDB4ODlBRiwgMHgyRTU3LCAweDg5QjIsIDB4MTUyOCwgMHg4OUI2LCAweDMxMjAsIDB4ODlCNywgMHgzMTFGLAorICAgIDB4ODlCOSwgMHgzMjMzLCAweDg5QkEsIDB4MTY0MiwgMHg4OUJELCAweDE2OEUsIDB4ODlCRSwgMHgzM0I0LCAweDg5QkYsCisgICAgMHgzM0IzLCAweDg5QzAsIDB4MTc0OCwgMHg4OUQyLCAweDA1MDksIDB4ODlEMywgMHgxQzAzLCAweDg5RDQsIDB4MDgwNiwKKyAgICAweDg5RDUsIDB4MjA2NiwgMHg4OUQ2LCAweDIwNjQsIDB4ODlEOSwgMHgyMDY1LCAweDg5REEsIDB4MjJFNywgMHg4OURCLAorICAgIDB4MjJFOCwgMHg4OURDLCAweDI1ODgsIDB4ODlERCwgMHgyMkU2LCAweDg5REYsIDB4MjU4MiwgMHg4OUUwLCAweDI1ODYsCisgICAgMHg4OUUxLCAweDI1ODUsIDB4ODlFMiwgMHgyNTg3LCAweDg5RTMsIDB4MEYwNiwgMHg4OUU0LCAweDI1ODQsIDB4ODlFNSwKKyAgICAweDI1ODMsIDB4ODlFNiwgMHgyNTg5LCAweDg5RTgsIDB4MjgwMiwgMHg4OUU5LCAweDI4MDAsIDB4ODlFQiwgMHgyODAxLAorICAgIDB4ODlFQywgMHgyQTQxLCAweDg5RUQsIDB4MkEzRiwgMHg4OUYwLCAweDJBNDAsIDB4ODlGMSwgMHgyQzg0LCAweDg5RjIsCisgICAgMHgyRTU5LCAweDg5RjMsIDB4MkU1QSwgMHg4OUY0LCAweDE1MjksIDB4ODlGNiwgMHgzMTIxLCAweDg5RjcsIDB4MzIzNCwKKyAgICAweDg5RjgsIDB4MTY0MywgMHg4OUZBLCAweDMzMTAsIDB4ODlGQiwgMHgzM0I1LCAweDg5RkMsIDB4MTZENywgMHg4OUZFLAorICAgIDB4MzQzQywgMHg4OUZGLCAweDM0RTYsIDB4OEEwMCwgMHgwNTBBLCAweDhBMDIsIDB4MDgwOCwgMHg4QTAzLCAweDA4MDksCisgICAgMHg4QTA0LCAweDFDMDQsIDB4OEEwNywgMHgxQzA1LCAweDhBMDgsIDB4MDgwNywgMHg4QTBBLCAweDA5QzMsIDB4OEEwQywKKyAgICAweDA5QzEsIDB4OEEwRSwgMHgwOUMwLCAweDhBMEYsIDB4MDlDNywgMHg4QTEwLCAweDA5QkYsIDB4OEExMSwgMHgwOUM4LAorICAgIDB4OEExMiwgMHgxRTA4LCAweDhBMTMsIDB4MDlDNSwgMHg4QTE1LCAweDA5QzIsIDB4OEExNiwgMHgwOUM2LCAweDhBMTcsCisgICAgMHgwOUM0LCAweDhBMTgsIDB4MDlCRSwgMHg4QTFCLCAweDBCQTUsIDB4OEExRCwgMHgwQjlGLCAweDhBMUUsIDB4MjA2QSwKKyAgICAweDhBMUYsIDB4MEJBNCwgMHg4QTIyLCAweDBCQTYsIDB4OEEyMywgMHgwQkEwLCAweDhBMjUsIDB4MEJBMSwgMHg4QTI3LAorICAgIDB4MjA2OCwgMHg4QTJBLCAweDBCOUUsIDB4OEEyQywgMHgyMDY5LCAweDhBMkQsIDB4MEJBMywgMHg4QTMwLCAweDIwNjcsCisgICAgMHg4QTMxLCAweDBCQTIsIDB4OEEzNCwgMHgwRDYxLCAweDhBMzYsIDB4MEQ2MywgMHg4QTM5LCAweDIyRUIsIDB4OEEzQSwKKyAgICAweDBENjIsIDB4OEEzQiwgMHgwRDU3LCAweDhBM0MsIDB4MEQ1QiwgMHg4QTNFLCAweDBGMTksIDB4OEEzRiwgMHgyNThFLAorICAgIDB4OEE0MCwgMHgyMkVELCAweDhBNDEsIDB4MEQ1QywgMHg4QTQ0LCAweDIyRjAsIDB4OEE0NSwgMHgyMkYxLCAweDhBNDYsCisgICAgMHgwRDYwLCAweDhBNDgsIDB4MjJGMywgMHg4QTRBLCAweDIyRjUsIDB4OEE0QywgMHgyMkY2LCAweDhBNEQsIDB4MjJFQSwKKyAgICAweDhBNEUsIDB4MjJFOSwgMHg4QTRGLCAweDIyRjcsIDB4OEE1MCwgMHgwRDVGLCAweDhBNTEsIDB4MjJGNCwgMHg4QTUyLAorICAgIDB4MjJGMiwgMHg4QTU0LCAweDBENUQsIDB4OEE1NSwgMHgwRDU5LCAweDhBNTYsIDB4MEQ2NCwgMHg4QTU3LCAweDIyRUUsCisgICAgMHg4QTU4LCAweDIyRUYsIDB4OEE1OSwgMHgyMkVDLCAweDhBNUIsIDB4MEQ1RSwgMHg4QTVFLCAweDBENUEsIDB4OEE2MCwKKyAgICAweDBENTgsIDB4OEE2MSwgMHgyNThELCAweDhBNjIsIDB4MEYxNCwgMHg4QTYzLCAweDBGMEYsIDB4OEE2NiwgMHgwRjBBLAorICAgIDB4OEE2OCwgMHgwRjFBLCAweDhBNjksIDB4MEYwQiwgMHg4QTZCLCAweDBGMDcsIDB4OEE2QywgMHgwRjE2LCAweDhBNkQsCisgICAgMHgwRjEzLCAweDhBNkUsIDB4MEYxNSwgMHg4QTcwLCAweDBGMEMsIDB4OEE3MSwgMHgwRjExLCAweDhBNzIsIDB4MEYwOCwKKyAgICAweDhBNzMsIDB4MEYwOSwgMHg4QTc0LCAweDI1OTUsIDB4OEE3NSwgMHgyNTkyLCAweDhBNzYsIDB4MjU4QSwgMHg4QTc3LAorICAgIDB4MjU4RiwgMHg4QTc5LCAweDBGMTcsIDB4OEE3QSwgMHgyNTk2LCAweDhBN0IsIDB4MEYxOCwgMHg4QTdDLCAweDBGMEUsCisgICAgMHg4QTdGLCAweDI1OEMsIDB4OEE4MSwgMHgyNTk0LCAweDhBODIsIDB4MjU5MCwgMHg4QTgzLCAweDI1OTMsIDB4OEE4NCwKKyAgICAweDI1OTEsIDB4OEE4NSwgMHgwRjEyLCAweDhBODYsIDB4MjU4QiwgMHg4QTg3LCAweDBGMEQsIDB4OEE4QiwgMHgyODA1LAorICAgIDB4OEE4QywgMHgxMEE2LCAweDhBOEQsIDB4MTBBOSwgMHg4QThGLCAweDI4MDcsIDB4OEE5MSwgMHgxMEIxLCAweDhBOTIsCisgICAgMHgyODA2LCAweDhBOTMsIDB4MTBBQiwgMHg4QTk1LCAweDEyMTYsIDB4OEE5NiwgMHgyODA4LCAweDhBOTgsIDB4MTBCMCwKKyAgICAweDhBOTksIDB4MjgwNCwgMHg4QTlBLCAweDEwQjIsIDB4OEE5RSwgMHgxMEE3LCAweDhBQTAsIDB4MEYxMCwgMHg4QUExLAorICAgIDB4MTBBQSwgMHg4QUEzLCAweDEwQTgsIDB4OEFBNCwgMHgxMEFDLCAweDhBQTUsIDB4MTBBRSwgMHg4QUE2LCAweDEwQTUsCisgICAgMHg4QUE3LCAweDEwQjMsIDB4OEFBOCwgMHgxMEFGLCAweDhBQUEsIDB4MTBBRCwgMHg4QUFCLCAweDI4MDMsIDB4OEFCMCwKKyAgICAweDEyMUQsIDB4OEFCMiwgMHgxMjE5LCAweDhBQjYsIDB4MTIyMCwgMHg4QUI4LCAweDJBNDQsIDB4OEFCOSwgMHgxMjIxLAorICAgIDB4OEFCQSwgMHgyQTUwLCAweDhBQkIsIDB4MkE0OSwgMHg4QUJDLCAweDEyMTIsIDB4OEFCRCwgMHgyQTUxLCAweDhBQkUsCisgICAgMHgyQTRCLCAweDhBQkYsIDB4MTIxQywgMHg4QUMwLCAweDJBNEMsIDB4OEFDMiwgMHgxMjFCLCAweDhBQzMsIDB4MkE0RiwKKyAgICAweDhBQzQsIDB4MTIxNSwgMHg4QUM1LCAweDJBNEQsIDB4OEFDNiwgMHgyQTQzLCAweDhBQzcsIDB4MTIxNCwgMHg4QUM4LAorICAgIDB4MkM4RiwgMHg4QUM5LCAweDEyMUEsIDB4OEFDQiwgMHgxMjE3LCAweDhBQ0QsIDB4MTIxRiwgMHg4QUNGLCAweDJBNDIsCisgICAgMHg4QUQxLCAweDJBNDYsIDB4OEFEMiwgMHgxMjEzLCAweDhBRDMsIDB4MkE0NSwgMHg4QUQ0LCAweDJBNDcsIDB4OEFENSwKKyAgICAweDJBNDgsIDB4OEFENiwgMHgxMjFFLCAweDhBRDcsIDB4MkE0QSwgMHg4QUQ4LCAweDJBNEUsIDB4OEFEOSwgMHgyQTUyLAorICAgIDB4OEFEQiwgMHgxMjIyLCAweDhBREMsIDB4MTM1MiwgMHg4QURELCAweDJDOEEsIDB4OEFERSwgMHgyQzkwLCAweDhBREYsCisgICAgMHgyQzhELCAweDhBRTAsIDB4MkM4NSwgMHg4QUUxLCAweDJDOTEsIDB4OEFFMiwgMHgyQzg2LCAweDhBRTQsIDB4MkM4QywKKyAgICAweDhBRTYsIDB4MTM0RCwgMHg4QUU3LCAweDEzNTMsIDB4OEFFOCwgMHgyQzkyLCAweDhBRUIsIDB4MTM0RiwgMHg4QUVELAorICAgIDB4MTM1OSwgMHg4QUVFLCAweDEzNTQsIDB4OEFFRiwgMHgyQzk0LCAweDhBRjAsIDB4MkM4RSwgMHg4QUYxLCAweDEzNTAsCisgICAgMHg4QUYyLCAweDJDODcsIDB4OEFGMywgMHgxMzVBLCAweDhBRjQsIDB4MkM4OCwgMHg4QUY1LCAweDJDODksIDB4OEFGNiwKKyAgICAweDEzNUIsIDB4OEFGNywgMHgxMzU4LCAweDhBRjgsIDB4MTIxOCwgMHg4QUZBLCAweDEzNEUsIDB4OEFGQiwgMHgyQzk1LAorICAgIDB4OEFGQywgMHgxMzVDLCAweDhBRkUsIDB4MTM1NSwgMHg4QUZGLCAweDJDOTMsIDB4OEIwMCwgMHgxMzUxLCAweDhCMDEsCisgICAgMHgxMzU2LCAweDhCMDIsIDB4MTM1NywgMHg4QjA0LCAweDE0N0UsIDB4OEIwNSwgMHgyRTVGLCAweDhCMDYsIDB4MkU2OCwKKyAgICAweDhCMDcsIDB4MkU2NSwgMHg4QjA4LCAweDJFNjcsIDB4OEIwQSwgMHgxNDdCLCAweDhCMEIsIDB4MkU2MCwgMHg4QjBELAorICAgIDB4MkU2NiwgMHg4QjBFLCAweDE0NzcsIDB4OEIwRiwgMHgyRTYyLCAweDhCMTAsIDB4MTQ3RiwgMHg4QjExLCAweDJFNUUsCisgICAgMHg4QjEyLCAweDJFNjMsIDB4OEIxMywgMHgyRTZBLCAweDhCMTQsIDB4MkM4QiwgMHg4QjE1LCAweDJFNjQsIDB4OEIxNiwKKyAgICAweDJFNUQsIDB4OEIxNywgMHgxNDc4LCAweDhCMTgsIDB4MkU1QywgMHg4QjE5LCAweDE0NzksIDB4OEIxQSwgMHgyRTZCLAorICAgIDB4OEIxQiwgMHgxNDdBLCAweDhCMUMsIDB4MkU2OSwgMHg4QjFELCAweDE0N0QsIDB4OEIxRSwgMHgyRTVCLCAweDhCMjAsCisgICAgMHgxNDdDLCAweDhCMjIsIDB4MkU2MSwgMHg4QjIzLCAweDJGQ0UsIDB4OEIyNCwgMHgyRkRDLCAweDhCMjUsIDB4MkZENywKKyAgICAweDhCMjYsIDB4MkZEOSwgMHg4QjI3LCAweDJGQ0QsIDB4OEIyOCwgMHgxNTJBLCAweDhCMkEsIDB4MkZDQywgMHg4QjJCLAorICAgIDB4MTUyRCwgMHg4QjJDLCAweDE1MkMsIDB4OEIyRSwgMHgyRkRCLCAweDhCMkYsIDB4MkZEMywgMHg4QjMwLCAweDJGRDAsCisgICAgMHg4QjMxLCAweDJGRDYsIDB4OEIzMywgMHgyRkNGLCAweDhCMzUsIDB4MkZEMSwgMHg4QjM2LCAweDJGREEsIDB4OEIzNywKKyAgICAweDJGRDgsIDB4OEIzOSwgMHgxNTJCLCAweDhCM0EsIDB4MkZERiwgMHg4QjNCLCAweDJGREQsIDB4OEIzQywgMHgyRkQ0LAorICAgIDB4OEIzRCwgMHgyRkRFLCAweDhCM0UsIDB4MkZENSwgMHg4QjQwLCAweDMxMjUsIDB4OEI0MSwgMHgxNUM0LCAweDhCNDIsCisgICAgMHgzMTJDLCAweDhCNDUsIDB4MzMxMywgMHg4QjQ2LCAweDE1Q0IsIDB4OEI0NywgMHgyRkQyLCAweDhCNDgsIDB4MzEyMywKKyAgICAweDhCNDksIDB4MTVDNywgMHg4QjRBLCAweDMxMjQsIDB4OEI0QiwgMHgzMTI5LCAweDhCNEUsIDB4MTVDOSwgMHg4QjRGLAorICAgIDB4MTVDQSwgMHg4QjUwLCAweDMxMjIsIDB4OEI1MSwgMHgzMTJCLCAweDhCNTIsIDB4MzEyRCwgMHg4QjUzLCAweDMxMjYsCisgICAgMHg4QjU0LCAweDMxMjgsIDB4OEI1NSwgMHgzMTJBLCAweDhCNTYsIDB4MzEyNywgMHg4QjU3LCAweDMxMkUsIDB4OEI1OCwKKyAgICAweDE1QzYsIDB4OEI1OSwgMHgxNUNDLCAweDhCNUEsIDB4MTVDOCwgMHg4QjVDLCAweDE1QzUsIDB4OEI1RCwgMHgzMjM3LAorICAgIDB4OEI1RiwgMHgxNjQ4LCAweDhCNjAsIDB4MzIzNSwgMHg4QjYzLCAweDMyMzksIDB4OEI2NSwgMHgzMjNBLCAweDhCNjYsCisgICAgMHgxNjQ2LCAweDhCNjcsIDB4MzIzQiwgMHg4QjY4LCAweDMyMzgsIDB4OEI2QSwgMHgzMjM2LCAweDhCNkIsIDB4MTY0OSwKKyAgICAweDhCNkMsIDB4MTY0NSwgMHg4QjZELCAweDMyM0MsIDB4OEI2RiwgMHgxNjQ3LCAweDhCNzAsIDB4MTY0NCwgMHg4Qjc0LAorICAgIDB4MTY4RiwgMHg4Qjc3LCAweDE2OTAsIDB4OEI3OCwgMHgzMzEyLCAweDhCNzksIDB4MzMxMSwgMHg4QjdBLCAweDMzMTQsCisgICAgMHg4QjdCLCAweDMzMTUsIDB4OEI3RCwgMHgxNjkxLCAweDhCN0UsIDB4MzNCNiwgMHg4QjdGLCAweDMzQkIsIDB4OEI4MCwKKyAgICAweDE2RDgsIDB4OEI4MiwgMHgzM0I4LCAweDhCODQsIDB4MzNCNywgMHg4Qjg1LCAweDMzQkEsIDB4OEI4NiwgMHgzM0I5LAorICAgIDB4OEI4OCwgMHgzNDQwLCAweDhCOEEsIDB4MTcwQSwgMHg4QjhCLCAweDM0M0YsIDB4OEI4QywgMHgzNDNELCAweDhCOEUsCisgICAgMHgzNDNFLCAweDhCOTIsIDB4MTcyQywgMHg4QjkzLCAweDE3MkIsIDB4OEI5NCwgMHgzNDlDLCAweDhCOTUsIDB4MzQ5RCwKKyAgICAweDhCOTYsIDB4MTcyRCwgMHg4Qjk4LCAweDM0RTcsIDB4OEI5OSwgMHgzNEU4LCAweDhCOUEsIDB4MTc1NCwgMHg4QjlDLAorICAgIDB4MTc1QSwgMHg4QjlFLCAweDM1MjIsIDB4OEI5RiwgMHgzNTNGLCAweDhDMzcsIDB4MDUwQiwgMHg4QzM5LCAweDIwNkIsCisgICAgMHg4QzNCLCAweDIwNkMsIDB4OEMzQywgMHgyNTk3LCAweDhDM0QsIDB4MjgwOSwgMHg4QzNFLCAweDJBNTMsIDB4OEMzRiwKKyAgICAweDE0ODEsIDB4OEM0MSwgMHgxNDgwLCAweDhDNDIsIDB4MkZFMCwgMHg4QzQzLCAweDMxMkYsIDB4OEM0NSwgMHgzNDQxLAorICAgIDB4OEM0NiwgMHgwNTBDLCAweDhDNDcsIDB4MUUwOSwgMHg4QzQ4LCAweDA5QzksIDB4OEM0OSwgMHgwQkE3LCAweDhDNEEsCisgICAgMHgyNTk5LCAweDhDNEIsIDB4MjU5OCwgMHg4QzRDLCAweDEyMjMsIDB4OEM0RCwgMHgyQTU0LCAweDhDNEUsIDB4MTIyNCwKKyAgICAweDhDNEYsIDB4MkU2QywgMHg4QzUwLCAweDE1MkUsIDB4OEM1NCwgMHgxNzYzLCAweDhDNTUsIDB4MDUwRCwgMHg4QzU2LAorICAgIDB4MUE0OCwgMHg4QzU3LCAweDFFMEEsIDB4OEM1QSwgMHgwQkE4LCAweDhDNUMsIDB4MjA2RCwgMHg4QzVELCAweDIwNkUsCisgICAgMHg4QzVGLCAweDIyRjgsIDB4OEM2MSwgMHgwRDY1LCAweDhDNjIsIDB4MEYxQiwgMHg4QzY0LCAweDI1OUIsIDB4OEM2NSwKKyAgICAweDI1OUEsIDB4OEM2NiwgMHgyNTlDLCAweDhDNjgsIDB4MjgwQSwgMHg4QzY5LCAweDI4MEIsIDB4OEM2QSwgMHgxMEI0LAorICAgIDB4OEM2QiwgMHgxMzVELCAweDhDNkMsIDB4MTIyNSwgMHg4QzZELCAweDEzNUUsIDB4OEM2RiwgMHgyRTcwLCAweDhDNzAsCisgICAgMHgyRTZELCAweDhDNzEsIDB4MkU2RiwgMHg4QzcyLCAweDJFNkUsIDB4OEM3MywgMHgxNDgyLCAweDhDNzUsIDB4MkZFMSwKKyAgICAweDhDNzYsIDB4MzEzMSwgMHg4Qzc3LCAweDMxMzAsIDB4OEM3OCwgMHgxOEU3LCAweDhDNzksIDB4MDlDQiwgMHg4QzdBLAorICAgIDB4MDlDQSwgMHg4QzdCLCAweDFFMEIsIDB4OEM3RCwgMHgyMDZGLCAweDhDODAsIDB4MjJGQSwgMHg4QzgxLCAweDIyRjksCisgICAgMHg4QzgyLCAweDBENjYsIDB4OEM4NCwgMHgyNTlFLCAweDhDODUsIDB4MjU5RiwgMHg4Qzg2LCAweDI1OUQsIDB4OEM4OSwKKyAgICAweDBGMUQsIDB4OEM4QSwgMHgwRjFDLCAweDhDOEMsIDB4MTBCNiwgMHg4QzhELCAweDEwQjUsIDB4OEM4RiwgMHgyQTU1LAorICAgIDB4OEM5MCwgMHgyQzk4LCAweDhDOTEsIDB4MkM5NiwgMHg4QzkyLCAweDJDOTcsIDB4OEM5MywgMHgxMzVGLCAweDhDOTQsCisgICAgMHgyRTcyLCAweDhDOTUsIDB4MkU3MSwgMHg4Qzk3LCAweDJGRTQsIDB4OEM5OCwgMHgyRkUzLCAweDhDOTksIDB4MkZFMiwKKyAgICAweDhDOUEsIDB4MzEzMiwgMHg4QzlDLCAweDM1MjMsIDB4OEM5RCwgMHgwNTBFLCAweDhDOUUsIDB4MDgwQSwgMHg4Q0EwLAorICAgIDB4MDgwQiwgMHg4Q0ExLCAweDA5Q0MsIDB4OENBMiwgMHgwOUNELCAweDhDQTMsIDB4MUUwRCwgMHg4Q0E0LCAweDFFMEMsCisgICAgMHg4Q0E1LCAweDIwNzAsIDB4OENBNywgMHgwQkFFLCAweDhDQTgsIDB4MEJBQywgMHg4Q0E5LCAweDBCQTksIDB4OENBQSwKKyAgICAweDBCQUQsIDB4OENBQiwgMHgwQkFCLCAweDhDQUMsIDB4MEJBQSwgMHg4Q0FGLCAweDBENjcsIDB4OENCMCwgMHgyMkZELAorICAgIDB4OENCMiwgMHgwRjIyLCAweDhDQjMsIDB4MEQ2OSwgMHg4Q0I0LCAweDBENkUsIDB4OENCNSwgMHgyMkZGLCAweDhDQjYsCisgICAgMHgwRDcwLCAweDhDQjcsIDB4MEQ2RiwgMHg4Q0I4LCAweDBENzIsIDB4OENCOSwgMHgyMkZFLCAweDhDQkEsIDB4MjJGQiwKKyAgICAweDhDQkIsIDB4MEQ2QywgMHg4Q0JDLCAweDBENjgsIDB4OENCRCwgMHgwRDZBLCAweDhDQkUsIDB4MjJGQywgMHg4Q0JGLAorICAgIDB4MEQ3MSwgMHg4Q0MwLCAweDBENkQsIDB4OENDMSwgMHgwRDZCLCAweDhDQzIsIDB4MEYyNCwgMHg4Q0MzLCAweDBGMjMsCisgICAgMHg4Q0M0LCAweDBGMjEsIDB4OENDNSwgMHgwRjI1LCAweDhDQzcsIDB4MEYxRiwgMHg4Q0M4LCAweDBGMjAsIDB4OENDQSwKKyAgICAweDBGMUUsIDB4OENDQywgMHgyNUEwLCAweDhDQ0YsIDB4MjgwRCwgMHg4Q0QxLCAweDEwQjgsIDB4OENEMiwgMHgxMEI5LAorICAgIDB4OENEMywgMHgxMEI3LCAweDhDRDUsIDB4MjgwQywgMHg4Q0Q3LCAweDI4MEUsIDB4OENEOSwgMHgyQTU4LCAweDhDREEsCisgICAgMHgyQTVBLCAweDhDREMsIDB4MTIyRSwgMHg4Q0RELCAweDJBNUIsIDB4OENERSwgMHgxMjI3LCAweDhDREYsIDB4MkE1NywKKyAgICAweDhDRTAsIDB4MTIyNiwgMHg4Q0UxLCAweDEyMzAsIDB4OENFMiwgMHgxMjJDLCAweDhDRTMsIDB4MTIyRCwgMHg4Q0U0LAorICAgIDB4MTIyOSwgMHg4Q0U1LCAweDJBNTYsIDB4OENFNiwgMHgxMjI4LCAweDhDRTcsIDB4MkE1QywgMHg4Q0U4LCAweDJBNTksCisgICAgMHg4Q0VBLCAweDEyMkYsIDB4OENFQywgMHgxMjJBLCAweDhDRUQsIDB4MTIyQiwgMHg4Q0VFLCAweDJDOUEsIDB4OENGMCwKKyAgICAweDJDOUMsIDB4OENGMSwgMHgyQzlCLCAweDhDRjMsIDB4MkM5RCwgMHg4Q0Y0LCAweDEzNjAsIDB4OENGNSwgMHgyQzk5LAorICAgIDB4OENGOCwgMHgxNDg2LCAweDhDRjksIDB4MkU3MywgMHg4Q0ZBLCAweDE0ODMsIDB4OENGQiwgMHgxNDg3LCAweDhDRkMsCisgICAgMHgxNDg1LCAweDhDRkQsIDB4MTQ4NCwgMHg4Q0ZFLCAweDJGRTUsIDB4OEQwMCwgMHgyRkU4LCAweDhEMDIsIDB4MkZFNywKKyAgICAweDhEMDQsIDB4MkZFNiwgMHg4RDA1LCAweDE1MkYsIDB4OEQwNiwgMHgzMTMzLCAweDhEMDcsIDB4MzEzNCwgMHg4RDA4LAorICAgIDB4MTVDRCwgMHg4RDA5LCAweDMxMzUsIDB4OEQwQSwgMHgxNUNFLCAweDhEMEQsIDB4MTY0QiwgMHg4RDBGLCAweDE2NEEsCisgICAgMHg4RDEwLCAweDMzMTYsIDB4OEQxMywgMHgxNjkyLCAweDhEMTQsIDB4MzMxNywgMHg4RDE1LCAweDMzQkMsIDB4OEQxNiwKKyAgICAweDE2RDksIDB4OEQxNywgMHgxNkRBLCAweDhEMTksIDB4MzQ0MiwgMHg4RDFCLCAweDE3MkYsIDB4OEQ2NCwgMHgwNTBGLAorICAgIDB4OEQ2NiwgMHgwQkIwLCAweDhENjcsIDB4MEJBRiwgMHg4RDY4LCAweDI1QTEsIDB4OEQ2OSwgMHgyNUEyLCAweDhENkIsCisgICAgMHgxMEJBLCAweDhENkMsIDB4MkM5RSwgMHg4RDZELCAweDEyMzEsIDB4OEQ2RSwgMHgyQzlGLCAweDhENkYsIDB4MkU3NCwKKyAgICAweDhENzAsIDB4MDUxMCwgMHg4RDcyLCAweDFDMDYsIDB4OEQ3MywgMHgwODBELCAweDhENzQsIDB4MDgwQywgMHg4RDc2LAorICAgIDB4MUUwRSwgMHg4RDc3LCAweDA5Q0UsIDB4OEQ3OCwgMHgxRTBGLCAweDhENzksIDB4MjA3MywgMHg4RDdCLCAweDIwNzIsCisgICAgMHg4RDdELCAweDIwNzEsIDB4OEQ4MCwgMHgyMzAxLCAweDhEODEsIDB4MEQ3NSwgMHg4RDg0LCAweDIzMDAsIDB4OEQ4NSwKKyAgICAweDBENzQsIDB4OEQ4OSwgMHgyMzAyLCAweDhEOEEsIDB4MEQ3MywgMHg4RDhDLCAweDI1QTQsIDB4OEQ4RCwgMHgyNUE3LAorICAgIDB4OEQ4RSwgMHgyNUE1LCAweDhEOEYsIDB4MjVBNiwgMHg4RDkwLCAweDI1QUEsIDB4OEQ5MSwgMHgyNUEzLCAweDhEOTIsCisgICAgMHgyNUFCLCAweDhEOTMsIDB4MjVBOCwgMHg4RDk0LCAweDI1QTksIDB4OEQ5NSwgMHgxMEJDLCAweDhEOTYsIDB4MjgwRiwKKyAgICAweDhEOTksIDB4MTBCQiwgMHg4RDlCLCAweDJBNjAsIDB4OEQ5QywgMHgyQTVFLCAweDhEOUYsIDB4MTIzMiwgMHg4REEwLAorICAgIDB4MkE1RCwgMHg4REExLCAweDJBNUYsIDB4OERBMywgMHgxMjMzLCAweDhEQTUsIDB4MkNBMCwgMHg4REE3LCAweDJDQTEsCisgICAgMHg4REE4LCAweDE0ODgsIDB4OERBQSwgMHgzMTM3LCAweDhEQUIsIDB4MzEzOSwgMHg4REFDLCAweDMxMzYsIDB4OERBRCwKKyAgICAweDMxMzgsIDB4OERBRSwgMHgzMjNELCAweDhEQUYsIDB4MzMxOCwgMHg4REIyLCAweDM1MDksIDB4OERCMywgMHgwNTExLAorICAgIDB4OERCNCwgMHgwODBFLCAweDhEQjUsIDB4MUUxMCwgMHg4REI2LCAweDFFMTIsIDB4OERCNywgMHgxRTExLCAweDhEQjksCisgICAgMHgyMDc2LCAweDhEQkEsIDB4MEJCMiwgMHg4REJDLCAweDIwNzQsIDB4OERCRSwgMHgwQkIxLCAweDhEQkYsIDB4MjA3NywKKyAgICAweDhEQzEsIDB4MjA3OCwgMHg4REMyLCAweDIwNzUsIDB4OERDNSwgMHgyMzBFLCAweDhEQzYsIDB4MEQ3RCwgMHg4REM3LAorICAgIDB4MjMwNiwgMHg4REM4LCAweDIzMEMsIDB4OERDQiwgMHgwRDc4LCAweDhEQ0MsIDB4MEQ3QiwgMHg4RENELCAweDIzMDUsCisgICAgMHg4RENFLCAweDBENzYsIDB4OERDRiwgMHgyMzA5LCAweDhERDAsIDB4MjVCMSwgMHg4REQxLCAweDBEN0EsIDB4OEREMywKKyAgICAweDIzMDQsIDB4OERENSwgMHgyMzBBLCAweDhERDYsIDB4MjMwNywgMHg4REQ3LCAweDIzMEQsIDB4OEREOCwgMHgyMzAzLAorICAgIDB4OEREOSwgMHgyMzBCLCAweDhEREEsIDB4MEQ3OSwgMHg4RERCLCAweDBEN0MsIDB4OEREQywgMHgyMzA4LCAweDhEREQsCisgICAgMHgwRDc3LCAweDhEREYsIDB4MEYyNywgMHg4REUwLCAweDI1QUQsIDB4OERFMSwgMHgwRjI2LCAweDhERTIsIDB4MjVCNCwKKyAgICAweDhERTMsIDB4MjVCMywgMHg4REU0LCAweDBGMkQsIDB4OERFNiwgMHgwRjJFLCAweDhERTcsIDB4MjVCNSwgMHg4REU4LAorICAgIDB4MEYyOCwgMHg4REU5LCAweDI1QjIsIDB4OERFQSwgMHgwRjJDLCAweDhERUIsIDB4MjVCNywgMHg4REVDLCAweDI1QUUsCisgICAgMHg4REVFLCAweDI1QjAsIDB4OERFRiwgMHgwRjI5LCAweDhERjAsIDB4MjVBQywgMHg4REYxLCAweDI1QUYsIDB4OERGMiwKKyAgICAweDI1QjYsIDB4OERGMywgMHgwRjJBLCAweDhERjQsIDB4MjVCOCwgMHg4REZBLCAweDBGMkIsIDB4OERGQywgMHgxMEJELAorICAgIDB4OERGRCwgMHgyODE0LCAweDhERkUsIDB4MjgxQSwgMHg4REZGLCAweDI4MTIsIDB4OEUwMCwgMHgyODFCLCAweDhFMDIsCisgICAgMHgyODExLCAweDhFMDMsIDB4MjgxNiwgMHg4RTA0LCAweDI4MUMsIDB4OEUwNSwgMHgyODE5LCAweDhFMDYsIDB4MjgxOCwKKyAgICAweDhFMDcsIDB4MjgxNywgMHg4RTA5LCAweDI4MTAsIDB4OEUwQSwgMHgyODE1LCAweDhFMEQsIDB4MjgxMywgMHg4RTBGLAorICAgIDB4MTIzOCwgMHg4RTEwLCAweDEyMzUsIDB4OEUxMSwgMHgyQTY5LCAweDhFMTIsIDB4MkE2RSwgMHg4RTEzLCAweDJBNzAsCisgICAgMHg4RTE0LCAweDJBNkQsIDB4OEUxNSwgMHgyQTY2LCAweDhFMTYsIDB4MkE2OCwgMHg4RTE3LCAweDJBNzIsIDB4OEUxOCwKKyAgICAweDJBNkYsIDB4OEUxOSwgMHgyQTZBLCAweDhFMUEsIDB4MkE3MywgMHg4RTFCLCAweDJBNjcsIDB4OEUxQywgMHgyQTcxLAorICAgIDB4OEUxRCwgMHgxMjM2LCAweDhFMUUsIDB4MTIzQywgMHg4RTFGLCAweDEyM0EsIDB4OEUyMCwgMHgyQTYxLCAweDhFMjEsCisgICAgMHgxMjNCLCAweDhFMjIsIDB4MTIzNywgMHg4RTIzLCAweDJBNjIsIDB4OEUyNCwgMHgyQTY0LCAweDhFMjUsIDB4MkE2MywKKyAgICAweDhFMjYsIDB4MkE2QiwgMHg4RTI3LCAweDJBNkMsIDB4OEUyOSwgMHgxMjM5LCAweDhFMkIsIDB4MTIzNCwgMHg4RTJFLAorICAgIDB4MkE2NSwgMHg4RTMwLCAweDJDQUIsIDB4OEUzMSwgMHgxMzYyLCAweDhFMzMsIDB4MkNBMiwgMHg4RTM0LCAweDEzNjMsCisgICAgMHg4RTM1LCAweDEzNjYsIDB4OEUzNiwgMHgyQ0E3LCAweDhFMzgsIDB4MkNBNCwgMHg4RTM5LCAweDEzNjUsIDB4OEUzQywKKyAgICAweDJDQTgsIDB4OEUzRCwgMHgyQ0E5LCAweDhFM0UsIDB4MkNBMywgMHg4RTNGLCAweDJDQUMsIDB4OEU0MCwgMHgyQ0E1LAorICAgIDB4OEU0MSwgMHgyQ0FBLCAweDhFNDIsIDB4MTM2NCwgMHg4RTQ0LCAweDEzNjEsIDB4OEU0NSwgMHgyQ0E2LCAweDhFNDcsCisgICAgMHgyRTdBLCAweDhFNDgsIDB4MTQ4QiwgMHg4RTQ5LCAweDE0ODksIDB4OEU0QSwgMHgxNDhDLCAweDhFNEIsIDB4MTQ4QSwKKyAgICAweDhFNEMsIDB4MkU3OSwgMHg4RTRELCAweDJFNzYsIDB4OEU0RSwgMHgyRTc1LCAweDhFNTAsIDB4MkU3OCwgMHg4RTUzLAorICAgIDB4MkU3NywgMHg4RTU0LCAweDJGRjYsIDB4OEU1NSwgMHgxNTM1LCAweDhFNTYsIDB4MkZFRCwgMHg4RTU3LCAweDJGRUMsCisgICAgMHg4RTU5LCAweDE1MzAsIDB4OEU1QSwgMHgyRkYyLCAweDhFNUIsIDB4MkZGMSwgMHg4RTVDLCAweDJGRTksIDB4OEU1RCwKKyAgICAweDJGRjQsIDB4OEU1RSwgMHgyRkVFLCAweDhFNUYsIDB4MTUzNCwgMHg4RTYwLCAweDJGRUIsIDB4OEU2MSwgMHgyRkYzLAorICAgIDB4OEU2MiwgMHgyRkVBLCAweDhFNjMsIDB4MTUzMSwgMHg4RTY0LCAweDE1MzMsIDB4OEU2NSwgMHgyRkVGLCAweDhFNjYsCisgICAgMHgxNTMyLCAweDhFNjcsIDB4MkZGMCwgMHg4RTY5LCAweDJGRjUsIDB4OEU2QSwgMHgzMTNELCAweDhFNkMsIDB4MTVEMywKKyAgICAweDhFNkQsIDB4MzEzQSwgMHg4RTZGLCAweDMxM0UsIDB4OEU3MiwgMHgxNUQwLCAweDhFNzMsIDB4MzEzQywgMHg4RTc0LAorICAgIDB4MTVENSwgMHg4RTc2LCAweDE1RDIsIDB4OEU3OCwgMHgzMTNCLCAweDhFN0EsIDB4MTVENCwgMHg4RTdCLCAweDMxM0YsCisgICAgMHg4RTdDLCAweDE1Q0YsIDB4OEU4MSwgMHgxNjRELCAweDhFODIsIDB4MTY0RiwgMHg4RTg0LCAweDMyNDAsIDB4OEU4NSwKKyAgICAweDE2NEUsIDB4OEU4NiwgMHgzMjNFLCAweDhFODcsIDB4MTVEMSwgMHg4RTg4LCAweDMyM0YsIDB4OEU4OSwgMHgxNjRDLAorICAgIDB4OEU4QSwgMHgxNjkzLCAweDhFOEIsIDB4MTY5NSwgMHg4RThDLCAweDMzMUEsIDB4OEU4RCwgMHgxNjk0LCAweDhFOEUsCisgICAgMHgzMzE5LCAweDhFOTAsIDB4MzNDMSwgMHg4RTkxLCAweDE2REIsIDB4OEU5MiwgMHgzM0MwLCAweDhFOTMsIDB4MTZEQywKKyAgICAweDhFOTQsIDB4MzNCRSwgMHg4RTk1LCAweDMzQkQsIDB4OEU5NiwgMHgzM0MyLCAweDhFOTcsIDB4MzNDMywgMHg4RTk4LAorICAgIDB4MzQ0MywgMHg4RTlBLCAweDMzQkYsIDB4OEU5RCwgMHgzNEExLCAweDhFOUUsIDB4MzQ5RSwgMHg4RTlGLCAweDM0OUYsCisgICAgMHg4RUEwLCAweDM0QTAsIDB4OEVBMSwgMHgxNzQ5LCAweDhFQTMsIDB4MzRFQiwgMHg4RUE0LCAweDM0RUEsIDB4OEVBNSwKKyAgICAweDM0RTksIDB4OEVBNiwgMHgzNTBBLCAweDhFQTgsIDB4MzUzNywgMHg4RUE5LCAweDM1MjQsIDB4OEVBQSwgMHgxNzVCLAorICAgIDB4OEVBQiwgMHgwNTEyLCAweDhFQUMsIDB4MDlDRiwgMHg4RUIyLCAweDBGMkYsIDB4OEVCQSwgMHgxMjNELCAweDhFQkQsCisgICAgMHgyQ0FELCAweDhFQzAsIDB4MTUzNiwgMHg4RUMyLCAweDMxNDAsIDB4OEVDOSwgMHgzNTI1LCAweDhFQ0EsIDB4MDUxMywKKyAgICAweDhFQ0IsIDB4MDY4RCwgMHg4RUNDLCAweDA4MTAsIDB4OEVDRCwgMHgwODBGLCAweDhFQ0YsIDB4MDlEMiwgMHg4RUQxLAorICAgIDB4MUUxMywgMHg4RUQyLCAweDA5RDAsIDB4OEVEMywgMHgxRTE0LCAweDhFRDQsIDB4MDlEMSwgMHg4RUQ3LCAweDIwN0QsCisgICAgMHg4RUQ4LCAweDIwNzksIDB4OEVEQiwgMHgwQkIzLCAweDhFREMsIDB4MjA3QywgMHg4RURELCAweDIwN0IsIDB4OEVERSwKKyAgICAweDIwN0EsIDB4OEVERiwgMHgwQkI0LCAweDhFRTAsIDB4MjA3RSwgMHg4RUUxLCAweDIwN0YsIDB4OEVFNSwgMHgyMzE1LAorICAgIDB4OEVFNiwgMHgyMzEzLCAweDhFRTcsIDB4MjMxNywgMHg4RUU4LCAweDIzMTgsIDB4OEVFOSwgMHgyMzFFLCAweDhFRUIsCisgICAgMHgyMzFBLCAweDhFRUMsIDB4MjMxQywgMHg4RUVFLCAweDIzMTQsIDB4OEVFRiwgMHgyMzBGLCAweDhFRjEsIDB4MjMxQiwKKyAgICAweDhFRjQsIDB4MjMxRCwgMHg4RUY1LCAweDIzMTYsIDB4OEVGNiwgMHgyMzE5LCAweDhFRjcsIDB4MjMxMCwgMHg4RUY4LAorICAgIDB4MEQ3RiwgMHg4RUY5LCAweDIzMTIsIDB4OEVGQSwgMHgyMzExLCAweDhFRkIsIDB4MEQ3RSwgMHg4RUZDLCAweDBEODAsCisgICAgMHg4RUZFLCAweDBGMzIsIDB4OEVGRiwgMHgyNUJBLCAweDhGMDAsIDB4MjVCQywgMHg4RjAxLCAweDI1QkIsIDB4OEYwMiwKKyAgICAweDI1QzAsIDB4OEYwMywgMHgwRjMwLCAweDhGMDUsIDB4MjVCRCwgMHg4RjA2LCAweDI1QjksIDB4OEYwNywgMHgyNUJFLAorICAgIDB4OEYwOCwgMHgyNUJGLCAweDhGMDksIDB4MEYzMSwgMHg4RjBBLCAweDBGMzMsIDB4OEYwQiwgMHgyNUMxLCAweDhGMEQsCisgICAgMHgyODIwLCAweDhGMEUsIDB4MjgxRiwgMHg4RjEwLCAweDI4MUQsIDB4OEYxMSwgMHgyODFFLCAweDhGMTIsIDB4MTBCRiwKKyAgICAweDhGMTMsIDB4MTBDMSwgMHg4RjE0LCAweDEwQkUsIDB4OEYxNSwgMHgxMEMwLCAweDhGMTYsIDB4MkE3QSwgMHg4RjE3LAorICAgIDB4MkE3QiwgMHg4RjE4LCAweDJBNzYsIDB4OEYxQSwgMHgyQTc3LCAweDhGMUIsIDB4MTIzRiwgMHg4RjFDLCAweDEyNDQsCisgICAgMHg4RjFELCAweDEyM0UsIDB4OEYxRSwgMHgxMjQ1LCAweDhGMUYsIDB4MTI0MCwgMHg4RjIwLCAweDJBNzgsIDB4OEYyMywKKyAgICAweDJBNzksIDB4OEYyNCwgMHgyQTc1LCAweDhGMjUsIDB4MTI0NiwgMHg4RjI2LCAweDEyNDIsIDB4OEYyOSwgMHgxMjQxLAorICAgIDB4OEYyQSwgMHgxMjQzLCAweDhGMkMsIDB4MkE3NCwgMHg4RjJFLCAweDJDQUYsIDB4OEYyRiwgMHgxMzY4LCAweDhGMzIsCisgICAgMHgyQ0IxLCAweDhGMzMsIDB4MTM2QSwgMHg4RjM0LCAweDJDQjQsIDB4OEYzNSwgMHgyQ0IwLCAweDhGMzYsIDB4MkNBRSwKKyAgICAweDhGMzcsIDB4MkNCMywgMHg4RjM4LCAweDEzNjksIDB4OEYzOSwgMHgyQ0IyLCAweDhGM0IsIDB4MTM2NywgMHg4RjNFLAorICAgIDB4MTQ4RSwgMHg4RjNGLCAweDE0OTEsIDB4OEY0MCwgMHgyRTdDLCAweDhGNDIsIDB4MTQ4RiwgMHg4RjQzLCAweDJFN0IsCisgICAgMHg4RjQ0LCAweDE0OEQsIDB4OEY0NSwgMHgxNDkwLCAweDhGNDYsIDB4MkZGNywgMHg4RjQ3LCAweDJGRjgsIDB4OEY0OCwKKyAgICAweDJGRjksIDB4OEY0OSwgMHgxNTM3LCAweDhGNEIsIDB4MkZGQSwgMHg4RjRELCAweDE1MzgsIDB4OEY0RSwgMHgxNUQ3LAorICAgIDB4OEY0RiwgMHgzMTQzLCAweDhGNTAsIDB4MzE0NCwgMHg4RjUxLCAweDMxNDIsIDB4OEY1MiwgMHgzMTQxLCAweDhGNTMsCisgICAgMHgzMTQ1LCAweDhGNTQsIDB4MTVENiwgMHg4RjU1LCAweDMyNDQsIDB4OEY1NiwgMHgzMjQyLCAweDhGNTcsIDB4MzI0MywKKyAgICAweDhGNTgsIDB4MzI0NSwgMHg4RjU5LCAweDMyNDEsIDB4OEY1QSwgMHgzMjQ2LCAweDhGNUIsIDB4MzMxQywgMHg4RjVELAorICAgIDB4MzMxRCwgMHg4RjVFLCAweDMzMUIsIDB4OEY1RiwgMHgxNjk2LCAweDhGNjAsIDB4MzNDNCwgMHg4RjYxLCAweDE2REQsCisgICAgMHg4RjYyLCAweDMzQzUsIDB4OEY2MywgMHgzNDQ1LCAweDhGNjQsIDB4MzQ0NCwgMHg4RjlCLCAweDA1MTQsIDB4OEY5QywKKyAgICAweDBEODEsIDB4OEY5RiwgMHgwRjM0LCAweDhGQTMsIDB4MTBDMiwgMHg4RkE2LCAweDEzNkMsIDB4OEZBOCwgMHgxMzZCLAorICAgIDB4OEZBRCwgMHgxNUQ4LCAweDhGQUUsIDB4MTYyRiwgMHg4RkFGLCAweDE2OTcsIDB4OEZCMCwgMHgwNTE1LCAweDhGQjEsCisgICAgMHgwOUQzLCAweDhGQjIsIDB4MEYzNSwgMHg4RkI0LCAweDMxNDYsIDB4OEZCNSwgMHgwMjMwLCAweDhGQkYsIDB4MThFOSwKKyAgICAweDhGQzIsIDB4MDUxNiwgMHg4RkM0LCAweDA1MTksIDB4OEZDNSwgMHgwNTE4LCAweDhGQzYsIDB4MDUxNywgMHg4RkM5LAorICAgIDB4MThFOCwgMHg4RkNCLCAweDFBNEEsIDB4OEZDRCwgMHgxQTRDLCAweDhGQ0UsIDB4MDY4RSwgMHg4RkQxLCAweDA2OTAsCisgICAgMHg4RkQyLCAweDFBNDksIDB4OEZEMywgMHgxQTRCLCAweDhGRDQsIDB4MDY4RiwgMHg4RkQ1LCAweDFBNEUsIDB4OEZENiwKKyAgICAweDFBNEQsIDB4OEZENywgMHgxQTRGLCAweDhGRTAsIDB4MUMwQSwgMHg4RkUxLCAweDFDMDgsIDB4OEZFMiwgMHgwODEzLAorICAgIDB4OEZFMywgMHgxQzA3LCAweDhGRTQsIDB4MDgxOCwgMHg4RkU1LCAweDA4MTUsIDB4OEZFNiwgMHgwODEyLCAweDhGRTgsCisgICAgMHgwODE5LCAweDhGRUEsIDB4MDgxNCwgMHg4RkVCLCAweDA4MTcsIDB4OEZFRCwgMHgwODE2LCAweDhGRUUsIDB4MUMwOSwKKyAgICAweDhGRjAsIDB4MDgxMSwgMHg4RkY0LCAweDA5RDksIDB4OEZGNSwgMHgxRTE2LCAweDhGRjYsIDB4MUUxQywgMHg4RkY3LAorICAgIDB4MDlENiwgMHg4RkY4LCAweDA5REQsIDB4OEZGQSwgMHgwOUQ4LCAweDhGRkIsIDB4MUUxOSwgMHg4RkZDLCAweDFFMUIsCisgICAgMHg4RkZELCAweDA5REIsIDB4OEZGRSwgMHgxRTE1LCAweDhGRkYsIDB4MUUxOCwgMHg5MDAwLCAweDA5RDcsIDB4OTAwMSwKKyAgICAweDA5RDQsIDB4OTAwMiwgMHgxRTE3LCAweDkwMDMsIDB4MDlEQSwgMHg5MDA0LCAweDFFMUEsIDB4OTAwNSwgMHgwOURDLAorICAgIDB4OTAwNiwgMHgwOUQ1LCAweDkwMEIsIDB4MjA4MSwgMHg5MDBDLCAweDIwODQsIDB4OTAwRCwgMHgwQkI2LCAweDkwMEYsCisgICAgMHgwQkMwLCAweDkwMTAsIDB4MEJCQywgMHg5MDExLCAweDIwODIsIDB4OTAxNCwgMHgwQkM0LCAweDkwMTUsIDB4MEJCRCwKKyAgICAweDkwMTYsIDB4MEJDMiwgMHg5MDE3LCAweDBCQjgsIDB4OTAxOSwgMHgwQkI1LCAweDkwMUEsIDB4MEJCNywgMHg5MDFCLAorICAgIDB4MEJDMywgMHg5MDFDLCAweDIwODMsIDB4OTAxRCwgMHgwQkJCLCAweDkwMUUsIDB4MEJCRSwgMHg5MDFGLCAweDBCQkEsCisgICAgMHg5MDIwLCAweDBCQkYsIDB4OTAyMSwgMHgyMDg1LCAweDkwMjIsIDB4MEJDMSwgMHg5MDIzLCAweDBCQjksIDB4OTAyNCwKKyAgICAweDIwODAsIDB4OTAyRCwgMHgyMzFGLCAweDkwMkUsIDB4MEQ4MiwgMHg5MDJGLCAweDIzMjEsIDB4OTAzMSwgMHgwRDg0LAorICAgIDB4OTAzMiwgMHgwRDg2LCAweDkwMzQsIDB4MjMyMCwgMHg5MDM1LCAweDBEODMsIDB4OTAzNiwgMHgwRDg3LCAweDkwMzgsCisgICAgMHgwRDg1LCAweDkwM0MsIDB4MEYzQiwgMHg5MDNELCAweDI1QzYsIDB4OTAzRSwgMHgwRjQzLCAweDkwM0YsIDB4MjVDMywKKyAgICAweDkwNDEsIDB4MEY0NCwgMHg5MDQyLCAweDBGMzksIDB4OTA0NCwgMHgyNUM0LCAweDkwNDcsIDB4MEYzRSwgMHg5MDQ5LAorICAgIDB4MjVDNSwgMHg5MDRBLCAweDBGMzcsIDB4OTA0QiwgMHgwRjM2LCAweDkwNEQsIDB4MEY0MSwgMHg5MDRFLCAweDBGNDAsCisgICAgMHg5MDRGLCAweDBGM0YsIDB4OTA1MCwgMHgwRjNELCAweDkwNTEsIDB4MEY0MiwgMHg5MDUyLCAweDI1QzIsIDB4OTA1MywKKyAgICAweDBGMzgsIDB4OTA1NCwgMHgwRjNBLCAweDkwNTUsIDB4MEYzQywgMHg5MDU4LCAweDEwQzQsIDB4OTA1OSwgMHgxMEM3LAorICAgIDB4OTA1QiwgMHgxMENCLCAweDkwNUMsIDB4MTBDNSwgMHg5MDVELCAweDEwQ0EsIDB4OTA1RSwgMHgxMEM4LCAweDkwNjAsCisgICAgMHgxMEMzLCAweDkwNjIsIDB4MTBDOSwgMHg5MDYzLCAweDEwQzYsIDB4OTA2NywgMHgyQTdGLCAweDkwNjgsIDB4MTI0OSwKKyAgICAweDkwNjksIDB4MTI0NywgMHg5MDZCLCAweDJBODAsIDB4OTA2RCwgMHgxMjRBLCAweDkwNkUsIDB4MTI0OCwgMHg5MDZGLAorICAgIDB4MkE3RSwgMHg5MDcwLCAweDJBN0QsIDB4OTA3MiwgMHgxMzcwLCAweDkwNzMsIDB4MkE3QywgMHg5MDc0LCAweDEzNkUsCisgICAgMHg5MDc1LCAweDEzNkQsIDB4OTA3NiwgMHgyQ0I1LCAweDkwNzcsIDB4MTI0QiwgMHg5MDc4LCAweDEzNkYsIDB4OTA3OSwKKyAgICAweDJDQjYsIDB4OTA3QSwgMHgxMzcyLCAweDkwN0IsIDB4MkNCNywgMHg5MDdDLCAweDEzNzEsIDB4OTA3RCwgMHgxNDkzLAorICAgIDB4OTA3RSwgMHgyRTdFLCAweDkwN0YsIDB4MTQ5MiwgMHg5MDgwLCAweDE0OTcsIDB4OTA4MSwgMHgxNDk1LCAweDkwODIsCisgICAgMHgxNDk2LCAweDkwODMsIDB4MTUzQSwgMHg5MDg0LCAweDE0OTQsIDB4OTA4NSwgMHgyRTdELCAweDkwODYsIDB4MkNCOCwKKyAgICAweDkwODcsIDB4MTUzOSwgMHg5MDg4LCAweDE1M0IsIDB4OTA4QSwgMHgxNUQ5LCAweDkwOEIsIDB4MTVEQSwgMHg5MDhELAorICAgIDB4MzI0NywgMHg5MDhGLCAweDE3MEMsIDB4OTA5MCwgMHgxNzBCLCAweDkwOTEsIDB4MDUxQiwgMHg5MDk0LCAweDE4MUUsCisgICAgMHg5MDk1LCAweDA5REUsIDB4OTA5NywgMHgxODFCLCAweDkwOTgsIDB4MTgxQywgMHg5MDk5LCAweDE4MUEsIDB4OTA5QiwKKyAgICAweDE4MUQsIDB4OTA5RSwgMHgxOEVELCAweDkwOUYsIDB4MThFQSwgMHg5MEEwLCAweDE4RUYsIDB4OTBBMSwgMHgxOEVCLAorICAgIDB4OTBBMiwgMHgwNTFDLCAweDkwQTMsIDB4MDUxRiwgMHg5MEE1LCAweDE4RUMsIDB4OTBBNiwgMHgwNTFFLCAweDkwQTcsCisgICAgMHgxOEVFLCAweDkwQUEsIDB4MDUxRCwgMHg5MEFGLCAweDFBNTIsIDB4OTBCMCwgMHgxQTU0LCAweDkwQjEsIDB4MDY5MywKKyAgICAweDkwQjIsIDB4MUE1MCwgMHg5MEIzLCAweDFBNTMsIDB4OTBCNCwgMHgxQTUxLCAweDkwQjUsIDB4MDY5MSwgMHg5MEI2LAorICAgIDB4MDY5NCwgMHg5MEI4LCAweDA2OTIsIDB4OTBCRCwgMHgxQzBDLCAweDkwQkUsIDB4MUMxMCwgMHg5MEJGLCAweDFDMEQsCisgICAgMHg5MEMxLCAweDA4MUMsIDB4OTBDMywgMHgwODFELCAweDkwQzUsIDB4MUMwRiwgMHg5MEM3LCAweDFDMTEsIDB4OTBDOCwKKyAgICAweDFDMTMsIDB4OTBDQSwgMHgwODFBLCAweDkwQ0IsIDB4MUMxMiwgMHg5MENFLCAweDA4MUIsIDB4OTBENCwgMHgyMDhDLAorICAgIDB4OTBENSwgMHgxQzBFLCAweDkwRDYsIDB4MUUxRCwgMHg5MEQ3LCAweDFFMjYsIDB4OTBEOCwgMHgxRTI0LCAweDkwRDksCisgICAgMHgxRTFGLCAweDkwREEsIDB4MUUyMCwgMHg5MERCLCAweDFFMjUsIDB4OTBEQywgMHgxRTI3LCAweDkwREQsIDB4MDlFMCwKKyAgICAweDkwREYsIDB4MUUyMiwgMHg5MEUwLCAweDFFMUUsIDB4OTBFMSwgMHgwOURGLCAweDkwRTIsIDB4MDlFMSwgMHg5MEUzLAorICAgIDB4MUUyMSwgMHg5MEU0LCAweDFFMjgsIDB4OTBFNSwgMHgxRTIzLCAweDkwRTgsIDB4MEJDNSwgMHg5MEU5LCAweDIwOEYsCisgICAgMHg5MEVBLCAweDIwODcsIDB4OTBFQiwgMHgyMDhELCAweDkwRUMsIDB4MjA4RSwgMHg5MEVELCAweDBCQzYsIDB4OTBFRiwKKyAgICAweDIwODYsIDB4OTBGMCwgMHgyMDg4LCAweDkwRjEsIDB4MUMwQiwgMHg5MEYyLCAweDIwOEEsIDB4OTBGMywgMHgyMDhCLAorICAgIDB4OTBGNCwgMHgyMDg5LCAweDkwRjUsIDB4MEQ4OSwgMHg5MEY5LCAweDIzMjgsIDB4OTBGQSwgMHgyQ0I5LCAweDkwRkIsCisgICAgMHgyMzI5LCAweDkwRkMsIDB4MjMyNiwgMHg5MEZELCAweDBCQzcsIDB4OTBGRSwgMHgwRDhCLCAweDkwRkYsIDB4MjMyNSwKKyAgICAweDkxMDAsIDB4MjMyQiwgMHg5MTAxLCAweDIzMkEsIDB4OTEwMiwgMHgwRDg4LCAweDkxMDMsIDB4MjMyRSwgMHg5MTA0LAorICAgIDB4MjMyNCwgMHg5MTA1LCAweDIzMkQsIDB4OTEwNiwgMHgyMzIyLCAweDkxMDcsIDB4MjMyQywgMHg5MTA4LCAweDIzMjcsCisgICAgMHg5MTA5LCAweDBEOEEsIDB4OTEwQiwgMHgyNUNELCAweDkxMEQsIDB4MjVDOCwgMHg5MTBFLCAweDI1Q0UsIDB4OTEwRiwKKyAgICAweDI1QzksIDB4OTExMCwgMHgyNUM3LCAweDkxMTEsIDB4MjVDQSwgMHg5MTEyLCAweDBGNDUsIDB4OTExNCwgMHgyNUNDLAorICAgIDB4OTExNiwgMHgyNUNCLCAweDkxMTcsIDB4MEY0NiwgMHg5MTE4LCAweDEwQ0QsIDB4OTExOSwgMHgxMENDLCAweDkxMUEsCisgICAgMHgyODI3LCAweDkxMUIsIDB4MjgyQSwgMHg5MTFDLCAweDI4MjIsIDB4OTExRCwgMHgyODI2LCAweDkxMUUsIDB4MTBDRSwKKyAgICAweDkxMUYsIDB4MjgyNSwgMHg5MTIwLCAweDI4MjMsIDB4OTEyMSwgMHgyODI5LCAweDkxMjIsIDB4MjgyNCwgMHg5MTIzLAorICAgIDB4MjgyMSwgMHg5MTI0LCAweDI4MjgsIDB4OTEyNiwgMHgyQTg2LCAweDkxMjcsIDB4MTI0RSwgMHg5MTI4LCAweDJGRkIsCisgICAgMHg5MTI5LCAweDJBODMsIDB4OTEyQSwgMHgyQTg0LCAweDkxMkIsIDB4MkE4MiwgMHg5MTJDLCAweDIzMjMsIDB4OTEyRCwKKyAgICAweDEyNEQsIDB4OTEyRSwgMHgyQTg3LCAweDkxMkYsIDB4MkE4MSwgMHg5MTMwLCAweDEyNEMsIDB4OTEzMSwgMHgxMjRGLAorICAgIDB4OTEzMiwgMHgyQTg1LCAweDkxMzMsIDB4MkNCQSwgMHg5MTM0LCAweDEzNzMsIDB4OTEzNSwgMHgyQ0JCLCAweDkxMzYsCisgICAgMHgyQ0JDLCAweDkxMzgsIDB4MkU3RiwgMHg5MTM5LCAweDE0OTgsIDB4OTEzQSwgMHgyRkZDLCAweDkxM0IsIDB4MkZGRCwKKyAgICAweDkxM0UsIDB4MkZGRSwgMHg5MTNGLCAweDMxNDgsIDB4OTE0MCwgMHgzMTQ3LCAweDkxNDEsIDB4MzI0OSwgMHg5MTQzLAorICAgIDB4MzI0OCwgMHg5MTQ0LCAweDMzMUYsIDB4OTE0NSwgMHgzMzIwLCAweDkxNDYsIDB4MzMxRSwgMHg5MTQ3LCAweDMzQzYsCisgICAgMHg5MTQ4LCAweDE2REUsIDB4OTE0OSwgMHgwNTIwLCAweDkxNEEsIDB4MDgxRiwgMHg5MTRCLCAweDA4MUUsIDB4OTE0QywKKyAgICAweDA5RTQsIDB4OTE0RCwgMHgwOUUzLCAweDkxNEUsIDB4MUUyQSwgMHg5MTRGLCAweDFFMkIsIDB4OTE1MCwgMHgxRTI5LAorICAgIDB4OTE1MiwgMHgwOUUyLCAweDkxNTMsIDB4MjA5MywgMHg5MTU1LCAweDIwOTQsIDB4OTE1NiwgMHgyMDkwLCAweDkxNTcsCisgICAgMHgwQkM4LCAweDkxNTgsIDB4MjA5MSwgMHg5MTVBLCAweDIwOTIsIDB4OTE1RiwgMHgyMzMxLCAweDkxNjAsIDB4MjMzMywKKyAgICAweDkxNjEsIDB4MjMyRiwgMHg5MTYyLCAweDIzMzIsIDB4OTE2MywgMHgwRDhDLCAweDkxNjQsIDB4MjMzMCwgMHg5MTY1LAorICAgIDB4MEQ4RCwgMHg5MTY4LCAweDIzRTIsIDB4OTE2OSwgMHgwRjQ5LCAweDkxNkEsIDB4MEY0OCwgMHg5MTZDLCAweDBGNDcsCisgICAgMHg5MTZFLCAweDI1Q0YsIDB4OTE2RiwgMHgyNUQwLCAweDkxNzIsIDB4MjgyQywgMHg5MTczLCAweDI4MkUsIDB4OTE3NCwKKyAgICAweDEwRDIsIDB4OTE3NSwgMHgxMENGLCAweDkxNzcsIDB4MTBEMSwgMHg5MTc4LCAweDEwRDAsIDB4OTE3OSwgMHgyODJELAorICAgIDB4OTE3QSwgMHgyODJCLCAweDkxODAsIDB4MkE4RSwgMHg5MTgxLCAweDJBOEIsIDB4OTE4MiwgMHgyQThDLCAweDkxODMsCisgICAgMHgxMjUzLCAweDkxODQsIDB4MkE4RCwgMHg5MTg1LCAweDJBODgsIDB4OTE4NiwgMHgyQTg5LCAweDkxODcsIDB4MTI1MCwKKyAgICAweDkxODksIDB4MTI1MSwgMHg5MThBLCAweDJBOEEsIDB4OTE4QiwgMHgxMjUyLCAweDkxOEQsIDB4MkNDMCwgMHg5MThGLAorICAgIDB4MkNDMSwgMHg5MTkwLCAweDJDQkUsIDB4OTE5MSwgMHgyQ0JGLCAweDkxOTIsIDB4MTM3NCwgMHg5MTkzLCAweDJDQkQsCisgICAgMHg5MTk5LCAweDJFODMsIDB4OTE5QSwgMHgyRTgwLCAweDkxOUIsIDB4MkU4MiwgMHg5MTlDLCAweDE0OUIsIDB4OTE5RCwKKyAgICAweDJFODYsIDB4OTE5RSwgMHgxNDlBLCAweDkxOUYsIDB4MkU4NCwgMHg5MUEwLCAweDJFODcsIDB4OTFBMSwgMHgyRTg1LAorICAgIDB4OTFBMiwgMHgyRTgxLCAweDkxQTMsIDB4MTQ5OSwgMHg5MUE1LCAweDMwMDAsIDB4OTFBNywgMHgzMDAxLCAweDkxQTgsCisgICAgMHgyRkZGLCAweDkxQUEsIDB4MzAwMywgMHg5MUFCLCAweDE1M0MsIDB4OTFBQywgMHgxNTNELCAweDkxQUQsIDB4MzE0QSwKKyAgICAweDkxQUUsIDB4MTVEQywgMHg5MUFGLCAweDMwMDIsIDB4OTFCMCwgMHgzMTQ5LCAweDkxQjEsIDB4MTVEQiwgMHg5MUIyLAorICAgIDB4MzI0QywgMHg5MUIzLCAweDMyNEQsIDB4OTFCNCwgMHgxNjUwLCAweDkxQjUsIDB4MzI0QiwgMHg5MUI3LCAweDMyNEEsCisgICAgMHg5MUI5LCAweDMzMjEsIDB4OTFCQSwgMHgxNjk4LCAweDkxQkMsIDB4MzQ0NiwgMHg5MUJELCAweDM0QTMsIDB4OTFCRSwKKyAgICAweDM0QTIsIDB4OTFDMCwgMHgxNzMwLCAweDkxQzEsIDB4MTc0QSwgMHg5MUMyLCAweDM0QTQsIDB4OTFDMywgMHgzNTBCLAorICAgIDB4OTFDNSwgMHgxNzVDLCAweDkxQzYsIDB4MDUyMSwgMHg5MUM3LCAweDA2OTUsIDB4OTFDOSwgMHgwRjRBLCAweDkxQ0IsCisgICAgMHgxNjUxLCAweDkxQ0MsIDB4MDUyMiwgMHg5MUNELCAweDA4MjAsIDB4OTFDRSwgMHgwQkM5LCAweDkxQ0YsIDB4MEQ4RSwKKyAgICAweDkxRDAsIDB4MTUzRSwgMHg5MUQxLCAweDA2OTYsIDB4OTFEMywgMHgxQzE1LCAweDkxRDQsIDB4MUMxNCwgMHg5MUQ1LAorICAgIDB4MUUyQywgMHg5MUQ3LCAweDA5RTcsIDB4OTFEOCwgMHgwOUU1LCAweDkxRDksIDB4MDlFOSwgMHg5MURBLCAweDFFMkUsCisgICAgMHg5MURDLCAweDA5RTgsIDB4OTFERCwgMHgwOUU2LCAweDkxRTIsIDB4MUUyRCwgMHg5MUUzLCAweDBCQ0MsIDB4OTFFNCwKKyAgICAweDIwOUEsIDB4OTFFNiwgMHgwQkNCLCAweDkxRTcsIDB4MEJDRCwgMHg5MUU4LCAweDIwOUYsIDB4OTFFOSwgMHgwQkNGLAorICAgIDB4OTFFQSwgMHgyMDlDLCAweDkxRUIsIDB4MjA5RCwgMHg5MUVDLCAweDIwOTUsIDB4OTFFRCwgMHgwQkNFLCAweDkxRUUsCisgICAgMHgyMEEwLCAweDkxRjEsIDB4MjA5NywgMHg5MUYzLCAweDIwOTgsIDB4OTFGNCwgMHgyMDk2LCAweDkxRjUsIDB4MEJDQSwKKyAgICAweDkxRjcsIDB4MjA5RSwgMHg5MUY4LCAweDIwOTksIDB4OTFGOSwgMHgyMDlCLCAweDkxRkQsIDB4MjMzRiwgMHg5MUZGLAorICAgIDB4MjMzRSwgMHg5MjAwLCAweDIzM0MsIDB4OTIwMSwgMHgyMzM0LCAweDkyMDIsIDB4MjM0MywgMHg5MjAzLCAweDIzMzcsCisgICAgMHg5MjA0LCAweDIzNDEsIDB4OTIwNSwgMHgyMzQ4LCAweDkyMDYsIDB4MjM0MCwgMHg5MjA3LCAweDBEOTYsIDB4OTIwOSwKKyAgICAweDBEOTIsIDB4OTIwQSwgMHgyMzM1LCAweDkyMEMsIDB4MjMzQiwgMHg5MjBELCAweDBEOTQsIDB4OTIwRiwgMHgyMzNBLAorICAgIDB4OTIxMCwgMHgwRDk1LCAweDkyMTEsIDB4MEQ5NywgMHg5MjEyLCAweDIzM0QsIDB4OTIxNCwgMHgwRDhGLCAweDkyMTUsCisgICAgMHgwRDkwLCAweDkyMTYsIDB4MjM0OSwgMHg5MjE3LCAweDIzNDcsIDB4OTIxOSwgMHgyMzQ2LCAweDkyMUEsIDB4MjMzOCwKKyAgICAweDkyMUMsIDB4MjM0NCwgMHg5MjFFLCAweDBEOTMsIDB4OTIyMywgMHgwRDkxLCAweDkyMjQsIDB4MjM0NSwgMHg5MjI1LAorICAgIDB4MjMzNiwgMHg5MjI2LCAweDIzMzksIDB4OTIyNywgMHgyMzQyLCAweDkyMkQsIDB4Mjg1MSwgMHg5MjJFLCAweDI1REEsCisgICAgMHg5MjMwLCAweDI1RDMsIDB4OTIzMSwgMHgyNUU2LCAweDkyMzIsIDB4MjVFRiwgMHg5MjMzLCAweDI1RDYsIDB4OTIzNCwKKyAgICAweDBGNTUsIDB4OTIzNiwgMHgyNUUzLCAweDkyMzcsIDB4MEY0QiwgMHg5MjM4LCAweDBGNEQsIDB4OTIzOSwgMHgwRjU5LAorICAgIDB4OTIzQSwgMHgyNUQ0LCAweDkyM0QsIDB4MEY0RSwgMHg5MjNFLCAweDBGNTAsIDB4OTIzRiwgMHgwRjVBLCAweDkyNDAsCisgICAgMHgwRjRGLCAweDkyNDUsIDB4MEY1OCwgMHg5MjQ2LCAweDI1REMsIDB4OTI0OCwgMHgyNUQxLCAweDkyNDksIDB4MEY1NiwKKyAgICAweDkyNEEsIDB4MjVEQiwgMHg5MjRCLCAweDBGNTIsIDB4OTI0QywgMHgyNUVELCAweDkyNEQsIDB4MEY1NywgMHg5MjRFLAorICAgIDB4MjVFQiwgMHg5MjRGLCAweDI1REYsIDB4OTI1MCwgMHgyNUU5LCAweDkyNTEsIDB4MEY1NCwgMHg5MjUyLCAweDI1RDIsCisgICAgMHg5MjUzLCAweDI1RUMsIDB4OTI1NCwgMHgyNUU3LCAweDkyNTYsIDB4MjVFRSwgMHg5MjU3LCAweDBGNEMsIDB4OTI1QSwKKyAgICAweDBGNUIsIDB4OTI1QiwgMHgwRjUxLCAweDkyNUUsIDB4MjVEOCwgMHg5MjYwLCAweDI1RTAsIDB4OTI2MSwgMHgyNUU0LAorICAgIDB4OTI2MywgMHgyNUU4LCAweDkyNjQsIDB4MEY1MywgMHg5MjY1LCAweDI1RDcsIDB4OTI2NiwgMHgyNUQ1LCAweDkyNjcsCisgICAgMHgyNUUxLCAweDkyNkMsIDB4MjVERSwgMHg5MjZELCAweDI1REQsIDB4OTI2RiwgMHgyNUUyLCAweDkyNzAsIDB4MjVFNSwKKyAgICAweDkyNzIsIDB4MjVFQSwgMHg5Mjc2LCAweDI4MzEsIDB4OTI3OCwgMHgxMEQzLCAweDkyNzksIDB4MjgzQiwgMHg5MjdBLAorICAgIDB4MjgzMywgMHg5MjdCLCAweDEwRDksIDB4OTI3QywgMHgxMERELCAweDkyN0QsIDB4Mjg0NCwgMHg5MjdFLCAweDI4NEMsCisgICAgMHg5MjdGLCAweDI4M0QsIDB4OTI4MCwgMHgxMEQ1LCAweDkyODIsIDB4Mjg0MSwgMHg5MjgzLCAweDI1RDksIDB4OTI4NSwKKyAgICAweDEwRDYsIDB4OTI4NiwgMHgyODQ4LCAweDkyODcsIDB4Mjg0RCwgMHg5Mjg4LCAweDI4NDUsIDB4OTI4QSwgMHgyODQ3LAorICAgIDB4OTI4QiwgMHgyODUwLCAweDkyOEMsIDB4Mjg0OSwgMHg5MjhELCAweDI4MzcsIDB4OTI4RSwgMHgyODQwLCAweDkyOTEsCisgICAgMHgxMERFLCAweDkyOTMsIDB4MTBEQSwgMHg5Mjk0LCAweDI4MzUsIDB4OTI5NSwgMHgyODQyLCAweDkyOTYsIDB4MTBEOCwKKyAgICAweDkyOTcsIDB4MjgzQywgMHg5Mjk4LCAweDEwRDcsIDB4OTI5OSwgMHgyODRBLCAweDkyOUEsIDB4MjgzOSwgMHg5MjlCLAorICAgIDB4MjgzMiwgMHg5MjlDLCAweDEwREIsIDB4OTI5RCwgMHgyODRGLCAweDkyQTAsIDB4MjgzNCwgMHg5MkExLCAweDI4NDYsCisgICAgMHg5MkEyLCAweDI4NDMsIDB4OTJBMywgMHgyODNFLCAweDkyQTQsIDB4MjgzMCwgMHg5MkE1LCAweDI4MkYsIDB4OTJBNiwKKyAgICAweDI4MzgsIDB4OTJBNywgMHgyODRCLCAweDkyQTgsIDB4MTBEQywgMHg5MkE5LCAweDI4NEUsIDB4OTJBQSwgMHgyODM2LAorICAgIDB4OTJBQiwgMHgyODNBLCAweDkyQUMsIDB4MTBENCwgMHg5MkIyLCAweDEyNUYsIDB4OTJCMywgMHgxMjVBLCAweDkyQjQsCisgICAgMHgyQUIwLCAweDkyQjUsIDB4MkFBQywgMHg5MkI2LCAweDJBOTQsIDB4OTJCNywgMHgxMjU2LCAweDkyQjksIDB4MzZFOSwKKyAgICAweDkyQkIsIDB4MTI1NSwgMHg5MkJDLCAweDEyNUIsIDB4OTJDMCwgMHgyQTkyLCAweDkyQzEsIDB4MTI1OSwgMHg5MkMyLAorICAgIDB4MkE5RSwgMHg5MkMzLCAweDJBOTAsIDB4OTJDNCwgMHgyQTkxLCAweDkyQzUsIDB4MTI1NCwgMHg5MkM2LCAweDJBQUYsCisgICAgMHg5MkM3LCAweDEyNUQsIDB4OTJDOCwgMHgyQUExLCAweDkyQzksIDB4MkFBNiwgMHg5MkNBLCAweDJBQTAsIDB4OTJDQiwKKyAgICAweDJDRDMsIDB4OTJDQywgMHgyQTlDLCAweDkyQ0QsIDB4MkFBNCwgMHg5MkNFLCAweDJBQTIsIDB4OTJDRiwgMHgyQTk1LAorICAgIDB4OTJEMCwgMHgyQThGLCAweDkyRDEsIDB4MkFBQSwgMHg5MkQyLCAweDEyNUMsIDB4OTJEMywgMHgyQUFCLCAweDkyRDUsCisgICAgMHgyQUE1LCAweDkyRDcsIDB4MkE5QSwgMHg5MkQ4LCAweDJBOTgsIDB4OTJEOSwgMHgyQTkzLCAweDkyREQsIDB4MkE5QiwKKyAgICAweDkyREUsIDB4MkFBOCwgMHg5MkRGLCAweDJBOTcsIDB4OTJFMCwgMHgyQUE3LCAweDkyRTEsIDB4MkFBRCwgMHg5MkU0LAorICAgIDB4MTI1OCwgMHg5MkU2LCAweDJBQTMsIDB4OTJFNywgMHgyQUE5LCAweDkyRTgsIDB4MkE5RiwgMHg5MkU5LCAweDJBOTksCisgICAgMHg5MkVBLCAweDEyNTcsIDB4OTJFRSwgMHgyODNGLCAweDkyRUYsIDB4MkE5RCwgMHg5MkYwLCAweDEyNUUsIDB4OTJGMSwKKyAgICAweDJBOTYsIDB4OTJGNywgMHgyQ0Q4LCAweDkyRjgsIDB4MTM3NywgMHg5MkY5LCAweDJDRDcsIDB4OTJGQSwgMHgyQ0Q1LAorICAgIDB4OTJGQiwgMHgyQ0U3LCAweDkyRkMsIDB4MTM3QiwgMHg5MkZFLCAweDJDRTQsIDB4OTJGRiwgMHgyQ0RDLCAweDkzMDAsCisgICAgMHgyQ0U2LCAweDkzMDEsIDB4MkNDRSwgMHg5MzAyLCAweDJDREEsIDB4OTMwNCwgMHgxMzdELCAweDkzMDYsIDB4MkNDNiwKKyAgICAweDkzMDgsIDB4MkNDNCwgMHg5MzA5LCAweDJDRTUsIDB4OTMwQiwgMHgyQ0UzLCAweDkzMEMsIDB4MkNFMiwgMHg5MzBELAorICAgIDB4MkNEMiwgMHg5MzBFLCAweDJDRDEsIDB4OTMwRiwgMHgyQ0M3LCAweDkzMTAsIDB4MTM3RiwgMHg5MzEyLCAweDJDQ0QsCisgICAgMHg5MzEzLCAweDJDRDYsIDB4OTMxNCwgMHgyQ0UxLCAweDkzMTUsIDB4MTM4MiwgMHg5MzE2LCAweDJDRTgsIDB4OTMxOCwKKyAgICAweDE0QTMsIDB4OTMxOSwgMHgxMzg0LCAweDkzMUEsIDB4MTM3RSwgMHg5MzFCLCAweDJDQ0IsIDB4OTMxRCwgMHgyQ0Q0LAorICAgIDB4OTMxRSwgMHgyQ0MzLCAweDkzMUYsIDB4MkNDNSwgMHg5MzIwLCAweDEzNzUsIDB4OTMyMSwgMHgxMzgxLCAweDkzMjIsCisgICAgMHgxMzdBLCAweDkzMjMsIDB4MkNDQywgMHg5MzI0LCAweDJDREIsIDB4OTMyNSwgMHgyQUFFLCAweDkzMjYsIDB4MTM4MCwKKyAgICAweDkzMjcsIDB4MkNDMiwgMHg5MzI4LCAweDE0OUUsIDB4OTMyOSwgMHgyQ0RELCAweDkzMkEsIDB4MkNFMCwgMHg5MzJCLAorICAgIDB4MTM3QywgMHg5MzJELCAweDJDRDAsIDB4OTMyRSwgMHgxMzgzLCAweDkzMkYsIDB4MTM3OSwgMHg5MzMzLCAweDEzNzgsCisgICAgMHg5MzM0LCAweDJDRDksIDB4OTMzNSwgMHgyQ0RGLCAweDkzMzYsIDB4MTM3NiwgMHg5MzM4LCAweDJDQzksIDB4OTMzOSwKKyAgICAweDJDREUsIDB4OTMzQywgMHgyQ0NBLCAweDkzNDYsIDB4MkNDRiwgMHg5MzQ3LCAweDJFOEQsIDB4OTM0OSwgMHgyRTkyLAorICAgIDB4OTM0QSwgMHgxNEEwLCAweDkzNEIsIDB4MTRBMiwgMHg5MzRDLCAweDJFOTgsIDB4OTM0RCwgMHgxNDlDLCAweDkzNEUsCisgICAgMHgyRUE2LCAweDkzNEYsIDB4MkU5RSwgMHg5MzUwLCAweDJFOTMsIDB4OTM1MSwgMHgyRTk0LCAweDkzNTIsIDB4MkU5RCwKKyAgICAweDkzNTQsIDB4MTRBOSwgMHg5MzU1LCAweDJFOUMsIDB4OTM1NiwgMHgyRThDLCAweDkzNTcsIDB4MkU5QiwgMHg5MzU4LAorICAgIDB4MkU4RiwgMHg5MzU5LCAweDJFQTcsIDB4OTM1QSwgMHgxNEE4LCAweDkzNUIsIDB4MTRBNiwgMHg5MzVDLCAweDJFOTAsCisgICAgMHg5MzVFLCAweDJFQTMsIDB4OTM2MCwgMHgyRTk1LCAweDkzNjEsIDB4MkVBMiwgMHg5MzYzLCAweDJFQTQsIDB4OTM2NCwKKyAgICAweDJFOEIsIDB4OTM2NSwgMHgxNEExLCAweDkzNjcsIDB4MkVBNSwgMHg5MzZBLCAweDJFOTksIDB4OTM2QywgMHgxNEE1LAorICAgIDB4OTM2RCwgMHgyRTk2LCAweDkzNzAsIDB4MTRBNywgMHg5MzcxLCAweDJFOUYsIDB4OTM3NSwgMHgxNDlGLCAweDkzNzYsCisgICAgMHgyRTkxLCAweDkzNzcsIDB4MkVBMCwgMHg5Mzc5LCAweDJFOUEsIDB4OTM3QSwgMHgyQ0M4LCAweDkzN0IsIDB4MkVBMSwKKyAgICAweDkzN0MsIDB4MkU4RSwgMHg5MzdFLCAweDE0QTQsIDB4OTM4MCwgMHgzMDE0LCAweDkzODIsIDB4MTQ5RCwgMHg5MzgzLAorICAgIDB4MkU4OSwgMHg5Mzg4LCAweDMwMTEsIDB4OTM4OSwgMHgzMDBBLCAweDkzOEEsIDB4MTU0MCwgMHg5MzhDLCAweDMwMDUsCisgICAgMHg5MzhELCAweDMwMTUsIDB4OTM4RSwgMHgzMDBDLCAweDkzOEYsIDB4MkU5NywgMHg5MzkxLCAweDMwMTcsIDB4OTM5MiwKKyAgICAweDMwMDYsIDB4OTM5NCwgMHgxNTNGLCAweDkzOTUsIDB4MzAxMCwgMHg5Mzk2LCAweDE1NDEsIDB4OTM5NywgMHgxNTQ5LAorICAgIDB4OTM5OCwgMHgxNTQ3LCAweDkzOTksIDB4MzAxMiwgMHg5MzlBLCAweDE1NDgsIDB4OTM5QiwgMHgzMDA4LCAweDkzOUQsCisgICAgMHgzMDA5LCAweDkzOUUsIDB4MzAwRSwgMHg5MzlGLCAweDMwMTMsIDB4OTNBMSwgMHgyRTg4LCAweDkzQTIsIDB4MTU0MiwKKyAgICAweDkzQTMsIDB4MzAxQywgMHg5M0E0LCAweDMwMTksIDB4OTNBNSwgMHgzMTYwLCAweDkzQTYsIDB4MzAwRiwgMHg5M0E3LAorICAgIDB4MzAwQiwgMHg5M0E4LCAweDMwMUEsIDB4OTNBOSwgMHgzMTU1LCAweDkzQUEsIDB4MzAwRCwgMHg5M0FDLCAweDE1NDUsCisgICAgMHg5M0FFLCAweDE1NDQsIDB4OTNBRiwgMHgyRThBLCAweDkzQjAsIDB4MTU0NiwgMHg5M0IxLCAweDMwMTYsIDB4OTNCMiwKKyAgICAweDMwMTgsIDB4OTNCMywgMHgxNTQzLCAweDkzQjQsIDB4MzAxQiwgMHg5M0I1LCAweDMwMDQsIDB4OTNCNywgMHgzMDA3LAorICAgIDB4OTNDMCwgMHgzMTVFLCAweDkzQzIsIDB4MzE0RSwgMHg5M0MzLCAweDE1RTAsIDB4OTNDNCwgMHgzMTVDLCAweDkzQzcsCisgICAgMHgzMTRDLCAweDkzQzgsIDB4MTVFMSwgMHg5M0NBLCAweDMxNTcsIDB4OTNDQywgMHgzMTUzLCAweDkzQ0QsIDB4MTVFNiwKKyAgICAweDkzQ0UsIDB4MzE1RCwgMHg5M0NGLCAweDMxNEQsIDB4OTNEMCwgMHgzMTUwLCAweDkzRDEsIDB4MTVERSwgMHg5M0QyLAorICAgIDB4MzE1RiwgMHg5M0Q0LCAweDMxNTgsIDB4OTNENSwgMHgzMTVCLCAweDkzRDYsIDB4MTVFNCwgMHg5M0Q3LCAweDE1RTksCisgICAgMHg5M0Q4LCAweDE1RTcsIDB4OTNEOSwgMHgzMTU0LCAweDkzREEsIDB4MzE0RiwgMHg5M0RDLCAweDE1RTIsIDB4OTNERCwKKyAgICAweDE1RTMsIDB4OTNERSwgMHgzMTRCLCAweDkzREYsIDB4MTVERiwgMHg5M0UxLCAweDE1REQsIDB4OTNFMiwgMHgxNUU1LAorICAgIDB4OTNFMywgMHgzMTVBLCAweDkzRTQsIDB4MTVFOCwgMHg5M0U2LCAweDMxNTYsIDB4OTNFNywgMHgzMTYxLCAweDkzRTgsCisgICAgMHgxNUVBLCAweDkzRUMsIDB4MzE1MiwgMHg5M0VFLCAweDMxNTksIDB4OTNGNSwgMHgzMjVBLCAweDkzRjYsIDB4MzI2OSwKKyAgICAweDkzRjcsIDB4MzI1QywgMHg5M0Y4LCAweDMyNjMsIDB4OTNGOSwgMHgzMTUxLCAweDkzRkEsIDB4MzI2MSwgMHg5M0ZCLAorICAgIDB4MzI1MCwgMHg5M0ZDLCAweDMyNjcsIDB4OTNGRCwgMHgxNjU0LCAweDkzRkUsIDB4MzI1NCwgMHg5M0ZGLCAweDMyNjYsCisgICAgMHg5NDAwLCAweDMyNUIsIDB4OTQwMywgMHgxNjUzLCAweDk0MDYsIDB4MzI2QiwgMHg5NDA3LCAweDMyNUQsIDB4OTQwOSwKKyAgICAweDMyNjIsIDB4OTQwQSwgMHgzMjY1LCAweDk0MEIsIDB4MzI0RSwgMHg5NDBDLCAweDMyNjgsIDB4OTQwRCwgMHgzMjU5LAorICAgIDB4OTQwRSwgMHgzMjVFLCAweDk0MEYsIDB4MzI1MiwgMHg5NDEwLCAweDMyNTYsIDB4OTQxMSwgMHgzMjZBLCAweDk0MTIsCisgICAgMHgzMjYwLCAweDk0MTMsIDB4MzI0RiwgMHg5NDE0LCAweDMyNTMsIDB4OTQxNSwgMHgzMjU1LCAweDk0MTYsIDB4MzI1RiwKKyAgICAweDk0MTgsIDB4MTY1MiwgMHg5NDE5LCAweDMyNTgsIDB4OTQyMCwgMHgzMjUxLCAweDk0MjgsIDB4MzI1NywgMHg5NDI5LAorICAgIDB4MzMyNSwgMHg5NDJBLCAweDMzMjksIDB4OTQyQiwgMHgxNjlGLCAweDk0MkMsIDB4MzMyQiwgMHg5NDJFLCAweDE2OTksCisgICAgMHg5NDMwLCAweDMzMjcsIDB4OTQzMSwgMHgzMzJELCAweDk0MzIsIDB4MTY5RSwgMHg5NDMzLCAweDE2OUEsIDB4OTQzNSwKKyAgICAweDE2OUIsIDB4OTQzNiwgMHgzMzI0LCAweDk0MzcsIDB4MzMyQSwgMHg5NDM4LCAweDE2OUQsIDB4OTQzOSwgMHgzMzI4LAorICAgIDB4OTQzQSwgMHgxNjlDLCAweDk0M0IsIDB4MzMyMywgMHg5NDNDLCAweDMyNjQsIDB4OTQzRCwgMHgzMzI2LCAweDk0M0YsCisgICAgMHgzMzIyLCAweDk0NDAsIDB4MzMyQywgMHg5NDQ0LCAweDE2REYsIDB4OTQ0NSwgMHgzM0NELCAweDk0NDYsIDB4MzNEMCwKKyAgICAweDk0NDcsIDB4MzNDQywgMHg5NDQ4LCAweDMzQ0UsIDB4OTQ0OSwgMHgzM0NGLCAweDk0NEEsIDB4MzNDOSwgMHg5NDRCLAorICAgIDB4MzNDQSwgMHg5NDRDLCAweDMzQzcsIDB4OTQ0RiwgMHgzM0NCLCAweDk0NTAsIDB4MzNDOCwgMHg5NDUxLCAweDE2RTAsCisgICAgMHg5NDUyLCAweDE2RTEsIDB4OTQ1NSwgMHgzNDQ4LCAweDk0NTcsIDB4MzQ0QSwgMHg5NDVELCAweDM0NDksIDB4OTQ1RSwKKyAgICAweDM0NEIsIDB4OTQ2MCwgMHgxNzBFLCAweDk0NjIsIDB4MzQ0NywgMHg5NDYzLCAweDE3MEQsIDB4OTQ2NCwgMHgxNzBGLAorICAgIDB4OTQ2OCwgMHgzNEE2LCAweDk0NjksIDB4MzRBNywgMHg5NDZBLCAweDE3MzEsIDB4OTQ2QiwgMHgzNEE1LCAweDk0NkQsCisgICAgMHgzNEVELCAweDk0NkUsIDB4MzRFQywgMHg5NDZGLCAweDM0RUUsIDB4OTQ3MCwgMHgxNzRDLCAweDk0NzEsIDB4MzRFRiwKKyAgICAweDk0NzIsIDB4MTc0QiwgMHg5NDczLCAweDM0RjAsIDB4OTQ3NCwgMHgzNTBDLCAweDk0NzUsIDB4MzUwRiwgMHg5NDc2LAorICAgIDB4MzUwRSwgMHg5NDc3LCAweDE3NTUsIDB4OTQ3OCwgMHgzNTBELCAweDk0N0MsIDB4MTc1RiwgMHg5NDdELCAweDE3NUQsCisgICAgMHg5NDdFLCAweDE3NUUsIDB4OTQ3RiwgMHgxNzY0LCAweDk0ODAsIDB4MzUzOSwgMHg5NDgxLCAweDM1M0EsIDB4OTQ4MiwKKyAgICAweDM1MzgsIDB4OTQ4MywgMHgzNTQwLCAweDk1NzcsIDB4MDY5NywgMHg5NTdBLCAweDIwQTEsIDB4OTU3QiwgMHgyMzRBLAorICAgIDB4OTU3QywgMHgyQUIxLCAweDk1N0QsIDB4MzE2MiwgMHg5NTgwLCAweDA2OTgsIDB4OTU4MiwgMHgwODIxLCAweDk1ODMsCisgICAgMHgwOUVBLCAweDk1ODYsIDB4MjBBMiwgMHg5NTg4LCAweDIwQTMsIDB4OTU4OSwgMHgwQkQwLCAweDk1OEIsIDB4MEQ5QSwKKyAgICAweDk1OEMsIDB4MjM0QywgMHg5NThELCAweDIzNEIsIDB4OTU4RSwgMHgwRDlFLCAweDk1OEYsIDB4MEQ5OSwgMHg5NTkwLAorICAgIDB4MjM0RCwgMHg5NTkxLCAweDBEOUIsIDB4OTU5MiwgMHgwRDlELCAweDk1OTMsIDB4MEQ5QywgMHg5NTk0LCAweDBEOTgsCisgICAgMHg5NTk4LCAweDBGNUMsIDB4OTU5QiwgMHgyNUYzLCAweDk1OUMsIDB4MjVGMSwgMHg5NTlFLCAweDI1RjIsIDB4OTU5RiwKKyAgICAweDI1RjAsIDB4OTVBMSwgMHgxMERGLCAweDk1QTMsIDB4MTBFMiwgMHg5NUE0LCAweDEwRTQsIDB4OTVBNSwgMHgxMEUzLAorICAgIDB4OTVBOCwgMHgxMEUwLCAweDk1QTksIDB4MTBFMSwgMHg5NUFCLCAweDJBQjMsIDB4OTVBQywgMHgyQUIyLCAweDk1QUQsCisgICAgMHgxMjYwLCAweDk1QUUsIDB4MkFCNCwgMHg5NUIwLCAweDJBQjUsIDB4OTVCMSwgMHgxMjYxLCAweDk1QjUsIDB4MkNGMCwKKyAgICAweDk1QjYsIDB4MkNFRSwgMHg5NUI3LCAweDJFQUQsIDB4OTVCOSwgMHgyQ0VDLCAweDk1QkEsIDB4MkNFRCwgMHg5NUJCLAorICAgIDB4MTM4NSwgMHg5NUJDLCAweDJDRTksIDB4OTVCRCwgMHgyQ0YxLCAweDk1QkUsIDB4MkNFQiwgMHg5NUJGLCAweDJDRUYsCisgICAgMHg5NUMwLCAweDJFQTksIDB4OTVDMywgMHgyRUFCLCAweDk1QzUsIDB4MkVBQywgMHg5NUM2LCAweDE0QUUsIDB4OTVDNywKKyAgICAweDJFQTgsIDB4OTVDOCwgMHgxNEFELCAweDk1QzksIDB4MkVBQSwgMHg5NUNBLCAweDE0QUEsIDB4OTVDQiwgMHgxNEFCLAorICAgIDB4OTVDQywgMHgxNEFDLCAweDk1Q0QsIDB4MkNFQSwgMHg5NUQwLCAweDE1NEMsIDB4OTVEMSwgMHgzMDFGLCAweDk1RDIsCisgICAgMHgzMDFELCAweDk1RDMsIDB4MzAxRSwgMHg5NUQ0LCAweDE1NEEsIDB4OTVENSwgMHgxNTRELCAweDk1RDYsIDB4MTU0QiwKKyAgICAweDk1REEsIDB4MzE2MywgMHg5NURCLCAweDMxNjQsIDB4OTVEQywgMHgxNUVCLCAweDk1REUsIDB4MzI2QywgMHg5NURGLAorICAgIDB4MzI2RSwgMHg5NUUwLCAweDMyNkQsIDB4OTVFMSwgMHgxNjU1LCAweDk1RTIsIDB4MTZBMCwgMHg5NUUzLCAweDMzMzAsCisgICAgMHg5NUU0LCAweDMzMkYsIDB4OTVFNSwgMHgzMzJFLCAweDk2MUMsIDB4MDY5OSwgMHg5NjFFLCAweDE3QjQsIDB4OTYyMCwKKyAgICAweDE4MjEsIDB4OTYyMSwgMHgwNDE0LCAweDk2MjIsIDB4MTgxRiwgMHg5NjIzLCAweDE4MjIsIDB4OTYyNCwgMHgxODIwLAorICAgIDB4OTYyOCwgMHgxOEYxLCAweDk2MkEsIDB4MDUyNiwgMHg5NjJDLCAweDA1MjcsIDB4OTYyRCwgMHgxOEYzLCAweDk2MkUsCisgICAgMHgwNTI0LCAweDk2MkYsIDB4MThGMiwgMHg5NjMwLCAweDE4RjAsIDB4OTYzMSwgMHgwNTI1LCAweDk2MzIsIDB4MDUyMywKKyAgICAweDk2MzksIDB4MUE1NSwgMHg5NjNBLCAweDFBNTgsIDB4OTYzQiwgMHgwNjlDLCAweDk2M0MsIDB4MUE1NywgMHg5NjNELAorICAgIDB4MUE1NiwgMHg5NjNGLCAweDA2OUIsIDB4OTY0MCwgMHgwNjlBLCAweDk2NDIsIDB4MDY5RSwgMHg5NjQzLCAweDFBNTksCisgICAgMHg5NjQ0LCAweDA2OUQsIDB4OTY0QSwgMHgxQzFBLCAweDk2NEIsIDB4MDgyMywgMHg5NjRDLCAweDA4MjQsIDB4OTY0RCwKKyAgICAweDA4MjUsIDB4OTY0RSwgMHgxQzFCLCAweDk2NEYsIDB4MUMxNywgMHg5NjUwLCAweDA4MjIsIDB4OTY1MSwgMHgxQzE4LAorICAgIDB4OTY1MywgMHgxQzE5LCAweDk2NTQsIDB4MUMxNiwgMHg5NjU4LCAweDA5RjEsIDB4OTY1QiwgMHgwOUVFLCAweDk2NUMsCisgICAgMHgxRTJGLCAweDk2NUQsIDB4MDlFRiwgMHg5NjVFLCAweDA5RjIsIDB4OTY1RiwgMHgxRTMwLCAweDk2NjEsIDB4MDlFRCwKKyAgICAweDk2NjIsIDB4MDlFQiwgMHg5NjYzLCAweDA5RUMsIDB4OTY2NCwgMHgwOUYwLCAweDk2NkEsIDB4MEJEMSwgMHg5NjZCLAorICAgIDB4MjBBNiwgMHg5NjZDLCAweDBCRDksIDB4OTY2RCwgMHgyMEE1LCAweDk2NkYsIDB4MjBBOCwgMHg5NjcwLCAweDBCRDUsCisgICAgMHg5NjcxLCAweDIwQTcsIDB4OTY3MiwgMHgwREE2LCAweDk2NzMsIDB4MEJEMywgMHg5Njc0LCAweDBCRDYsIDB4OTY3NSwKKyAgICAweDBCRDIsIDB4OTY3NiwgMHgwQkQ3LCAweDk2NzcsIDB4MEJEOCwgMHg5Njc4LCAweDBCRDQsIDB4OTY3QywgMHgyMEE0LAorICAgIDB4OTY3RCwgMHgwREEyLCAweDk2N0UsIDB4MjM0RiwgMHg5NjgwLCAweDIzNTMsIDB4OTY4MywgMHgyMzUyLCAweDk2ODQsCisgICAgMHgwREE3LCAweDk2ODUsIDB4MERBMywgMHg5Njg2LCAweDBEQTQsIDB4OTY4NywgMHgyMzRFLCAweDk2ODgsIDB4MjM1MCwKKyAgICAweDk2ODksIDB4MjM1MSwgMHg5NjhBLCAweDBEOUYsIDB4OTY4QiwgMHgwREExLCAweDk2OEQsIDB4MERBNSwgMHg5NjhFLAorICAgIDB4MERBMCwgMHg5NjkxLCAweDI1RjYsIDB4OTY5MiwgMHgyNUY0LCAweDk2OTMsIDB4MjVGNSwgMHg5Njk0LCAweDBGNUUsCisgICAgMHg5Njk1LCAweDBGNUYsIDB4OTY5NywgMHgyNUY3LCAweDk2OTgsIDB4MEY1RCwgMHg5Njk5LCAweDEwRTUsIDB4OTY5QiwKKyAgICAweDEwRTcsIDB4OTY5QywgMHgxMEU2LCAweDk2OUUsIDB4Mjg1MiwgMHg5NkExLCAweDI4NTMsIDB4OTZBMiwgMHgyQUI3LAorICAgIDB4OTZBNCwgMHgyQUI2LCAweDk2QTcsIDB4MTM4NiwgMHg5NkE4LCAweDEzODcsIDB4OTZBOSwgMHgyQ0YyLCAweDk2QUEsCisgICAgMHgxMzg4LCAweDk2QUMsIDB4MkVCMCwgMHg5NkFFLCAweDJFQUUsIDB4OTZCMCwgMHgyRUFGLCAweDk2QjEsIDB4MTRBRiwKKyAgICAweDk2QjMsIDB4MzAyMCwgMHg5NkI0LCAweDE1RUMsIDB4OTZCNiwgMHgwMjMxLCAweDk2QjgsIDB4MTRCMCwgMHg5NkI5LAorICAgIDB4MDY5RiwgMHg5NkJCLCAweDA5RjMsIDB4OTZCQywgMHgxRTMxLCAweDk2QkYsIDB4MjBBOSwgMHg5NkMwLCAweDBCREEsCisgICAgMHg5NkMxLCAweDBEQTgsIDB4OTZDMiwgMHgyMzU0LCAweDk2QzMsIDB4MjM1NiwgMHg5NkM0LCAweDBEQUEsIDB4OTZDNSwKKyAgICAweDBEQTksIDB4OTZDNiwgMHgwREFCLCAweDk2QzcsIDB4MERBQywgMHg5NkM4LCAweDIzNTUsIDB4OTZDOSwgMHgwRjYyLAorICAgIDB4OTZDQSwgMHgwRjYzLCAweDk2Q0IsIDB4MEY2MSwgMHg5NkNDLCAweDEwRTgsIDB4OTZDRCwgMHgwRjYwLCAweDk2Q0UsCisgICAgMHgyNUY4LCAweDk2RDIsIDB4MTBFOSwgMHg5NkQzLCAweDJBQjgsIDB4OTZENCwgMHgyQ0YzLCAweDk2RDUsIDB4MTM4OSwKKyAgICAweDk2RDYsIDB4MTRCMSwgMHg5NkQ3LCAweDMwMjEsIDB4OTZEOCwgMHgzMDI1LCAweDk2RDksIDB4MTU1MCwgMHg5NkRBLAorICAgIDB4MzAyMiwgMHg5NkRCLCAweDE1NTEsIDB4OTZEQywgMHgxNTRGLCAweDk2REQsIDB4MzAyNiwgMHg5NkRFLCAweDE1NTIsCisgICAgMHg5NkRGLCAweDMwMjQsIDB4OTZFMSwgMHgzMTY1LCAweDk2RTIsIDB4MTU0RSwgMHg5NkUzLCAweDE1RUQsIDB4OTZFNSwKKyAgICAweDM0QTgsIDB4OTZFOCwgMHgwNkEwLCAweDk2RTksIDB4MEJEQywgMHg5NkVBLCAweDBCREIsIDB4OTZFRiwgMHgwREFELAorICAgIDB4OTZGMCwgMHgyMzU4LCAweDk2RjEsIDB4MjM1NywgMHg5NkYyLCAweDBEQUUsIDB4OTZGNSwgMHgyNUZDLCAweDk2RjYsCisgICAgMHgwRjY3LCAweDk2RjcsIDB4MEY2NCwgMHg5NkY4LCAweDI1RkIsIDB4OTZGOSwgMHgwRjY2LCAweDk2RkEsIDB4MjVGOSwKKyAgICAweDk2RkIsIDB4MEY2NSwgMHg5NkZELCAweDI1RkEsIDB4OTZGRiwgMHgyODU0LCAweDk3MDAsIDB4MTBFQSwgMHg5NzAyLAorICAgIDB4MkFCQiwgMHg5NzA0LCAweDEyNjIsIDB4OTcwNSwgMHgyQUI5LCAweDk3MDYsIDB4MTI2MywgMHg5NzA3LCAweDEyNjQsCisgICAgMHg5NzA4LCAweDJBQkEsIDB4OTcwOSwgMHgxMjY1LCAweDk3MEIsIDB4MkNGNCwgMHg5NzBELCAweDEzOEQsIDB4OTcwRSwKKyAgICAweDEzOEEsIDB4OTcwRiwgMHgxMzhGLCAweDk3MTAsIDB4MkNGNiwgMHg5NzExLCAweDEzOEIsIDB4OTcxMiwgMHgyQ0Y1LAorICAgIDB4OTcxMywgMHgxMzhFLCAweDk3MTYsIDB4MTM4QywgMHg5NzE4LCAweDJFQjMsIDB4OTcxOSwgMHgyRUI1LCAweDk3MUMsCisgICAgMHgxNEIyLCAweDk3MUQsIDB4MkVCNCwgMHg5NzFFLCAweDE0QjMsIDB4OTcxRiwgMHgyRUIyLCAweDk3MjAsIDB4MkVCMSwKKyAgICAweDk3MjIsIDB4MzAyOCwgMHg5NzIzLCAweDMwMjcsIDB4OTcyNCwgMHgxNTUzLCAweDk3MjUsIDB4MzAyOSwgMHg5NzI2LAorICAgIDB4MzE2QSwgMHg5NzI3LCAweDE1RUYsIDB4OTcyOCwgMHgzMTY5LCAweDk3MjksIDB4MzE2NiwgMHg5NzJBLCAweDE1RUUsCisgICAgMHg5NzJCLCAweDMxNjcsIDB4OTcyQywgMHgzMTY4LCAweDk3MkUsIDB4MzI2RiwgMHg5NzJGLCAweDMyNzAsIDB4OTczMCwKKyAgICAweDE2NTYsIDB4OTczMiwgMHgxNkEzLCAweDk3MzUsIDB4MzMzMSwgMHg5NzM4LCAweDE2QTEsIDB4OTczOSwgMHgxNkEyLAorICAgIDB4OTczQSwgMHgzMzMyLCAweDk3M0QsIDB4MTZFMiwgMHg5NzNFLCAweDE2RTMsIDB4OTczRiwgMHgzM0QxLCAweDk3NDIsCisgICAgMHgxNzMyLCAweDk3NDMsIDB4MzRBQSwgMHg5NzQ0LCAweDE3MzQsIDB4OTc0NiwgMHgzNEE5LCAweDk3NDcsIDB4MzRBQiwKKyAgICAweDk3NDgsIDB4MTczMywgMHg5NzQ5LCAweDM0RjEsIDB4OTc0QiwgMHgzNTI2LCAweDk3NTIsIDB4MDZBMSwgMHg5NzU2LAorICAgIDB4MEY2OCwgMHg5NzU4LCAweDI4NTUsIDB4OTc1QSwgMHgyQUJDLCAweDk3NUIsIDB4MTM5MCwgMHg5NzVDLCAweDEzOTEsCisgICAgMHg5NzVFLCAweDA2QTIsIDB4OTc2MCwgMHgxMjY2LCAweDk3NjEsIDB4MTVGMCwgMHg5NzYyLCAweDA4MjYsIDB4OTc2NiwKKyAgICAweDEzOTIsIDB4OTc2OCwgMHgxNzEwLCAweDk3NjksIDB4MDgyNywgMHg5NzZBLCAweDIwQUEsIDB4OTc2QywgMHgyMzU5LAorICAgIDB4OTc2RSwgMHgyMzVCLCAweDk3NzAsIDB4MjM1QSwgMHg5NzcyLCAweDI2MDAsIDB4OTc3MywgMHgyNUZELCAweDk3NzQsCisgICAgMHgwRjY5LCAweDk3NzYsIDB4MEY2QSwgMHg5Nzc3LCAweDI1RkUsIDB4OTc3OCwgMHgyNUZGLCAweDk3N0EsIDB4Mjg1NywKKyAgICAweDk3N0IsIDB4Mjg1QywgMHg5NzdDLCAweDEwRUIsIDB4OTc3RCwgMHgyODU2LCAweDk3N0UsIDB4Mjg1OCwgMHg5NzdGLAorICAgIDB4Mjg1RiwgMHg5NzgwLCAweDI4NUEsIDB4OTc4MSwgMHgyODVFLCAweDk3ODIsIDB4Mjg1QiwgMHg5NzgzLCAweDI4NTksCisgICAgMHg5Nzg0LCAweDI4NUQsIDB4OTc4NSwgMHgxMEVDLCAweDk3ODgsIDB4MkFCRiwgMHg5NzhBLCAweDJBQkQsIDB4OTc4QiwKKyAgICAweDEyNjgsIDB4OTc4RCwgMHgxMjY3LCAweDk3OEUsIDB4MkFCRSwgMHg5NzhGLCAweDEyNjksIDB4OTc5NCwgMHgyQ0Y5LAorICAgIDB4OTc5NywgMHgyQ0Y4LCAweDk3OTgsIDB4MTM5MywgMHg5Nzk5LCAweDJDRjcsIDB4OTc5QSwgMHgyRUI2LCAweDk3OUMsCisgICAgMHgyRUI4LCAweDk3OUQsIDB4MkVCQSwgMHg5NzlFLCAweDJFQjksIDB4OTdBMCwgMHgxNEI0LCAweDk3QTEsIDB4MkVCNywKKyAgICAweDk3QTIsIDB4MzAzMCwgMHg5N0EzLCAweDE1NTQsIDB4OTdBNCwgMHgzMDJFLCAweDk3QTUsIDB4MzAzMSwgMHg5N0E2LAorICAgIDB4MTU1NSwgMHg5N0E4LCAweDMwMkMsIDB4OTdBQSwgMHgzMDJGLCAweDk3QUIsIDB4MzAyRCwgMHg5N0FDLCAweDMwMkEsCisgICAgMHg5N0FELCAweDE1NTYsIDB4OTdBRSwgMHgzMDJCLCAweDk3QjMsIDB4MzE2QiwgMHg5N0I2LCAweDMxNkQsIDB4OTdCNywKKyAgICAweDMxNkMsIDB4OTdCOSwgMHgzMjcxLCAweDk3QkIsIDB4MzI3MiwgMHg5N0JGLCAweDMzMzMsIDB4OTdDMSwgMHgxNkU1LAorICAgIDB4OTdDMywgMHgxNkU0LCAweDk3QzQsIDB4MzQ0QywgMHg5N0M1LCAweDM0NEQsIDB4OTdDNiwgMHgxNzM1LCAweDk3QzcsCisgICAgMHgzNEFDLCAweDk3QzksIDB4MTc1NiwgMHg5N0NCLCAweDA4MjgsIDB4OTdDQywgMHgwREFGLCAweDk3Q0QsIDB4Mjg2MSwKKyAgICAweDk3Q0UsIDB4Mjg2MCwgMHg5N0NGLCAweDJBQzEsIDB4OTdEMCwgMHgyQUMwLCAweDk3RDMsIDB4MTRCNSwgMHg5N0Q0LAorICAgIDB4MkVCQywgMHg5N0Q1LCAweDJFQkIsIDB4OTdENiwgMHgzMDM0LCAweDk3RDcsIDB4MzAzMiwgMHg5N0Q4LCAweDMwMzUsCisgICAgMHg5N0Q5LCAweDMwMzMsIDB4OTdEQywgMHgxNUYxLCAweDk3REQsIDB4MzE2RSwgMHg5N0RFLCAweDMxNkYsIDB4OTdERiwKKyAgICAweDMxNzAsIDB4OTdFMSwgMHgzMzM0LCAweDk3RTMsIDB4MzNEMiwgMHg5N0U1LCAweDM0QUQsIDB4OTdFRCwgMHgwODI5LAorICAgIDB4OTdGMCwgMHgyQ0ZBLCAweDk3RjEsIDB4MkVCRCwgMHg5N0YzLCAweDA4MkEsIDB4OTdGNiwgMHgxMEVELCAweDk3RjgsCisgICAgMHgyQ0ZCLCAweDk3RjksIDB4MTU1NywgMHg5N0ZBLCAweDMwMzYsIDB4OTdGQiwgMHgxNUYyLCAweDk3RkQsIDB4MzI3MywKKyAgICAweDk3RkUsIDB4MzI3NCwgMHg5N0ZGLCAweDE2QTQsIDB4OTgwMCwgMHgzNDRFLCAweDk4MDEsIDB4MDgyQiwgMHg5ODAyLAorICAgIDB4MEJERiwgMHg5ODAzLCAweDBCRTAsIDB4OTgwNCwgMHgyMEFCLCAweDk4MDUsIDB4MERCMCwgMHg5ODA2LCAweDBEQjEsCisgICAgMHg5ODA3LCAweDIzNUMsIDB4OTgwOCwgMHgwREIyLCAweDk4MEEsIDB4MEY2RSwgMHg5ODBDLCAweDBGNzAsIDB4OTgwRCwKKyAgICAweDI2MDIsIDB4OTgwRSwgMHgyNjAzLCAweDk4MEYsIDB4MjYwMSwgMHg5ODEwLCAweDBGNkIsIDB4OTgxMSwgMHgwRjZDLAorICAgIDB4OTgxMiwgMHgwRjZGLCAweDk4MTMsIDB4MEY2RCwgMHg5ODE2LCAweDI4NjIsIDB4OTgxNywgMHgxMEVFLCAweDk4MTgsCisgICAgMHgxMEVGLCAweDk4MUIsIDB4MkFDOCwgMHg5ODFDLCAweDEyNkMsIDB4OTgxRCwgMHgyQUMzLCAweDk4MUUsIDB4MkFDMiwKKyAgICAweDk4MjAsIDB4MkFDNywgMHg5ODIxLCAweDEyNkEsIDB4OTgyNCwgMHgxMzlBLCAweDk4MjYsIDB4MkFDNCwgMHg5ODI3LAorICAgIDB4MkFDOSwgMHg5ODI4LCAweDJBQzYsIDB4OTgyOSwgMHgyQUM1LCAweDk4MkIsIDB4MTI2QiwgMHg5ODJELCAweDEzOTgsCisgICAgMHg5ODJGLCAweDJDRkQsIDB4OTgzMCwgMHgxMzk0LCAweDk4MzIsIDB4MkNGRSwgMHg5ODM1LCAweDJDRkMsIDB4OTgzNywKKyAgICAweDEzOTcsIDB4OTgzOCwgMHgxMzk1LCAweDk4MzksIDB4MTM5OSwgMHg5ODNCLCAweDEzOTYsIDB4OTg0MSwgMHgyRUJFLAorICAgIDB4OTg0MywgMHgyRUMzLCAweDk4NDQsIDB4MkVCRiwgMHg5ODQ1LCAweDJFQzIsIDB4OTg0NiwgMHgxNEI2LCAweDk4NDgsCisgICAgMHgyREYyLCAweDk4NDksIDB4MkVDMSwgMHg5ODRBLCAweDJFQzAsIDB4OTg0QywgMHgxNTVBLCAweDk4NEQsIDB4MTU1OCwKKyAgICAweDk4NEUsIDB4MTU1QiwgMHg5ODRGLCAweDE1NTksIDB4OTg1MCwgMHgzMDM3LCAweDk4NTEsIDB4MzAzOCwgMHg5ODUyLAorICAgIDB4MzAzOSwgMHg5ODUzLCAweDE1NUMsIDB4OTg1NywgMHgzMTc0LCAweDk4NTgsIDB4MTVGNCwgMHg5ODU5LCAweDMxNzIsCisgICAgMHg5ODVCLCAweDE1RjUsIDB4OTg1QywgMHgzMTcxLCAweDk4NUQsIDB4MzE3MywgMHg5ODVFLCAweDE1RjMsIDB4OTg1RiwKKyAgICAweDMyNzgsIDB4OTg2MCwgMHgzMjc1LCAweDk4NjIsIDB4MzI3NiwgMHg5ODYzLCAweDMyNzcsIDB4OTg2NCwgMHgzMzM1LAorICAgIDB4OTg2NSwgMHgxNkE2LCAweDk4NjcsIDB4MTZBNSwgMHg5ODY5LCAweDMzRDQsIDB4OTg2QSwgMHgzM0QzLCAweDk4NkIsCisgICAgMHgxNkU2LCAweDk4NkYsIDB4MTcxMSwgMHg5ODcwLCAweDE3MzYsIDB4OTg3MSwgMHgxNzRELCAweDk4NzIsIDB4MzRGMiwKKyAgICAweDk4NzMsIDB4MzUyNywgMHg5ODc0LCAweDM1MjgsIDB4OThBOCwgMHgwODJDLCAweDk4QTksIDB4MjM1RCwgMHg5OEFDLAorICAgIDB4MjYwNCwgMHg5OEFELCAweDI4NjMsIDB4OThBRSwgMHgyODY0LCAweDk4QUYsIDB4MTBGMCwgMHg5OEIxLCAweDEwRjEsCisgICAgMHg5OEIyLCAweDJBQ0EsIDB4OThCMywgMHgxMjZELCAweDk4QjYsIDB4MTRCNywgMHg5OEI4LCAweDMwM0EsIDB4OThCQSwKKyAgICAweDE1NUQsIDB4OThCQiwgMHgzMTc3LCAweDk4QkMsIDB4MTVGNiwgMHg5OEJELCAweDMxNzYsIDB4OThCRSwgMHgzMTc4LAorICAgIDB4OThCRiwgMHgzMTc1LCAweDk4QzAsIDB4MzMzOCwgMHg5OEMxLCAweDMyNzksIDB4OThDMiwgMHgzMjdBLCAweDk4QzQsCisgICAgMHgxNjU3LCAweDk4QzYsIDB4MzMzNywgMHg5OEM5LCAweDMzMzYsIDB4OThDQiwgMHgzM0Q1LCAweDk4Q0MsIDB4MzUyOSwKKyAgICAweDk4REIsIDB4MDgyRCwgMHg5OERGLCAweDA4MkUsIDB4OThFMiwgMHgwOUY0LCAweDk4RTMsIDB4MUUzMiwgMHg5OEU1LAorICAgIDB4MjBBQywgMHg5OEU3LCAweDBEQjMsIDB4OThFOSwgMHgwREI2LCAweDk4RUEsIDB4MERCNCwgMHg5OEVCLCAweDIzNUUsCisgICAgMHg5OEVELCAweDBEQjgsIDB4OThFRiwgMHgwREI1LCAweDk4RjIsIDB4MERCNywgMHg5OEY0LCAweDBGNzIsIDB4OThGNiwKKyAgICAweDI2MDUsIDB4OThGOSwgMHgyNjA2LCAweDk4RkEsIDB4MkFDQywgMHg5OEZDLCAweDBGNzEsIDB4OThGRCwgMHgwRjczLAorICAgIDB4OThGRSwgMHgwRjc0LCAweDk5MDAsIDB4Mjg2NiwgMHg5OTAyLCAweDI4NjUsIDB4OTkwMywgMHgxMEYyLCAweDk5MDUsCisgICAgMHgxMEYzLCAweDk5MDcsIDB4Mjg2NywgMHg5OTA4LCAweDJBQ0IsIDB4OTkwOSwgMHgxMEY1LCAweDk5MEEsIDB4MTI2RSwKKyAgICAweDk5MEMsIDB4MTBGNCwgMHg5OTEwLCAweDEzOUIsIDB4OTkxMSwgMHgyQUNELCAweDk5MTIsIDB4MTI3MCwgMHg5OTEzLAorICAgIDB4MTI2RiwgMHg5OTE0LCAweDJBQ0UsIDB4OTkxNSwgMHgyQUQxLCAweDk5MTYsIDB4MkFDRiwgMHg5OTE3LCAweDJBRDAsCisgICAgMHg5OTE4LCAweDEyNzEsIDB4OTkxQSwgMHgxM0EwLCAweDk5MUIsIDB4MTM5RSwgMHg5OTFFLCAweDEzOUQsIDB4OTkxRiwKKyAgICAweDJEMDAsIDB4OTkyMSwgMHgxMzlGLCAweDk5MjQsIDB4MkNGRiwgMHg5OTI1LCAweDJFQzQsIDB4OTkyNywgMHgyRDAxLAorICAgIDB4OTkyOCwgMHgxMzlDLCAweDk5MjksIDB4MkQwMiwgMHg5OTJBLCAweDJFQzcsIDB4OTkyQiwgMHgyRUM1LCAweDk5MkMsCisgICAgMHgyRUM2LCAweDk5MkQsIDB4MkVDQiwgMHg5OTJFLCAweDE1NjEsIDB4OTkyRiwgMHgyRUNBLCAweDk5MzAsIDB4MkVDRCwKKyAgICAweDk5MzEsIDB4MkVDQywgMHg5OTMyLCAweDJFQzksIDB4OTkzMywgMHgyRUM4LCAweDk5MzUsIDB4MTRCOCwgMHg5OTNBLAorICAgIDB4MzAzRCwgMHg5OTNDLCAweDMwM0MsIDB4OTkzRCwgMHgxNTYwLCAweDk5M0UsIDB4MTU1RSwgMHg5OTNGLCAweDE1NUYsCisgICAgMHg5OTQxLCAweDMwM0IsIDB4OTk0MywgMHgzMTdCLCAweDk5NDUsIDB4MTVGNywgMHg5OTQ3LCAweDMxN0EsIDB4OTk0OCwKKyAgICAweDMxNzksIDB4OTk0OSwgMHgxNUY4LCAweDk5NEIsIDB4MzI3RiwgMHg5OTRDLCAweDMyN0UsIDB4OTk0RSwgMHgzMjdDLAorICAgIDB4OTk1MCwgMHgzMjdCLCAweDk5NTEsIDB4MTY1OSwgMHg5OTUyLCAweDE2NTgsIDB4OTk1MywgMHgzMjgwLCAweDk5NTQsCisgICAgMHgzM0Q2LCAweDk5NTUsIDB4MTZFNywgMHg5OTU2LCAweDMzM0EsIDB4OTk1NywgMHgxNkE3LCAweDk5NTgsIDB4MzMzOSwKKyAgICAweDk5NTksIDB4MzI3RCwgMHg5OTVCLCAweDMzRDcsIDB4OTk1QywgMHgxNzEyLCAweDk5NUUsIDB4MTc0RSwgMHg5OTVGLAorICAgIDB4MzRGMywgMHg5OTYxLCAweDM1MkEsIDB4OTk5NiwgMHgwODJGLCAweDk5OTcsIDB4MjBBRCwgMHg5OTk4LCAweDJFQ0UsCisgICAgMHg5OTk5LCAweDA4MzAsIDB4OTk5QywgMHgyODY5LCAweDk5OUQsIDB4Mjg2OCwgMHg5OTlFLCAweDJEMDMsIDB4OTlBMSwKKyAgICAweDJFRDAsIDB4OTlBMywgMHgyRUNGLCAweDk5QTUsIDB4MTU2MiwgMHg5OUE2LCAweDMxN0MsIDB4OTlBNywgMHgzMTdELAorICAgIDB4OTlBOCwgMHgxNjVBLCAweDk5QUIsIDB4MzUyQiwgMHg5OUFDLCAweDA5RjUsIDB4OTlBRCwgMHgwREJBLCAweDk5QUUsCisgICAgMHgwREI5LCAweDk5QUYsIDB4MjYwNywgMHg5OUIwLCAweDI2MDksIDB4OTlCMSwgMHgwRjc2LCAweDk5QjIsIDB4MjYwOCwKKyAgICAweDk5QjMsIDB4MEY3NSwgMHg5OUI0LCAweDBGNzcsIDB4OTlCNSwgMHgyNjBBLCAweDk5QjksIDB4Mjg2QiwgMHg5OUJBLAorICAgIDB4Mjg2RCwgMHg5OUJCLCAweDI4NkMsIDB4OTlCRCwgMHgyODZGLCAweDk5QzEsIDB4MTBGNiwgMHg5OUMyLCAweDI4NkUsCisgICAgMHg5OUMzLCAweDI4NkEsIDB4OTlDNywgMHgyODcwLCAweDk5QzksIDB4MkFEOCwgMHg5OUNCLCAweDJBREIsIDB4OTlDQywKKyAgICAweDJBREQsIDB4OTlDRCwgMHgyQUQzLCAweDk5Q0UsIDB4MkFENywgMHg5OUNGLCAweDJBRDQsIDB4OTlEMCwgMHgxMjczLAorICAgIDB4OTlEMSwgMHgxMjc2LCAweDk5RDIsIDB4MTI3OCwgMHg5OUQzLCAweDJBRDUsIDB4OTlENCwgMHgyQUQ2LCAweDk5RDUsCisgICAgMHgxMjc3LCAweDk5RDYsIDB4MkFEOSwgMHg5OUQ3LCAweDJBREMsIDB4OTlEOCwgMHgyQURBLCAweDk5RDksIDB4MTI3OSwKKyAgICAweDk5REIsIDB4MTI3NSwgMHg5OURDLCAweDJBRDIsIDB4OTlERCwgMHgxMjcyLCAweDk5REYsIDB4MTI3NCwgMHg5OUUyLAorICAgIDB4MTNBMiwgMHg5OUUzLCAweDJEMDksIDB4OTlFNCwgMHgyRDA3LCAweDk5RTUsIDB4MkQwNiwgMHg5OUU3LCAweDJEMEMsCisgICAgMHg5OUU5LCAweDJEMEIsIDB4OTlFQSwgMHgyRDBBLCAweDk5RUMsIDB4MkQwNSwgMHg5OUVELCAweDEzQTEsIDB4OTlFRSwKKyAgICAweDJEMDQsIDB4OTlGMCwgMHgyRDA4LCAweDk5RjEsIDB4MTNBMywgMHg5OUY0LCAweDJFRDMsIDB4OTlGNiwgMHgyRUQ3LAorICAgIDB4OTlGNywgMHgyRUQ0LCAweDk5RjgsIDB4MkVENiwgMHg5OUY5LCAweDJFRDUsIDB4OTlGQSwgMHgyRUQyLCAweDk5RkIsCisgICAgMHgyRUQ4LCAweDk5RkMsIDB4MkVEQiwgMHg5OUZELCAweDJFRDksIDB4OTlGRSwgMHgyRURBLCAweDk5RkYsIDB4MTRCQSwKKyAgICAweDlBMDEsIDB4MTRCOSwgMHg5QTAyLCAweDJFRDEsIDB4OUEwMywgMHgyRURDLCAweDlBMDQsIDB4MzA0MiwgMHg5QTA1LAorICAgIDB4MzA0NSwgMHg5QTA2LCAweDMwNDcsIDB4OUEwNywgMHgzMDQ2LCAweDlBMDksIDB4MzA0MCwgMHg5QTBBLCAweDMwNDQsCisgICAgMHg5QTBCLCAweDMwM0YsIDB4OUEwRCwgMHgzMDQxLCAweDlBMEUsIDB4MTU2MywgMHg5QTBGLCAweDMwM0UsIDB4OUExMSwKKyAgICAweDMwNDMsIDB4OUExNCwgMHgzMThBLCAweDlBMTUsIDB4MzE3RiwgMHg5QTE2LCAweDE1RjksIDB4OUExOSwgMHgxNUZBLAorICAgIDB4OUExQSwgMHgzMTdFLCAweDlBMUIsIDB4MzE4MywgMHg5QTFDLCAweDMxODksIDB4OUExRCwgMHgzMTgxLCAweDlBMUUsCisgICAgMHgzMTg4LCAweDlBMjAsIDB4MzE4NSwgMHg5QTIyLCAweDMxODQsIDB4OUEyMywgMHgzMTg3LCAweDlBMjQsIDB4MzE4MiwKKyAgICAweDlBMjUsIDB4MzE4MCwgMHg5QTI3LCAweDMxODYsIDB4OUEyOSwgMHgzMjg3LCAweDlBMkEsIDB4MzI4NSwgMHg5QTJCLAorICAgIDB4MTY1QiwgMHg5QTJDLCAweDMyODQsIDB4OUEyRCwgMHgzMjhBLCAweDlBMkUsIDB4MzI4OCwgMHg5QTMwLCAweDE2NUMsCisgICAgMHg5QTMxLCAweDMyODMsIDB4OUEzMiwgMHgzMjgxLCAweDlBMzQsIDB4MzI4MiwgMHg5QTM1LCAweDE2NUUsIDB4OUEzNiwKKyAgICAweDMyODYsIDB4OUEzNywgMHgxNjVELCAweDlBMzgsIDB4MzI4OSwgMHg5QTM5LCAweDMzM0IsIDB4OUEzQSwgMHgzMzQxLAorICAgIDB4OUEzRCwgMHgzMzNDLCAweDlBM0UsIDB4MTZBQiwgMHg5QTNGLCAweDMzNDIsIDB4OUE0MCwgMHgxNkFBLCAweDlBNDEsCisgICAgMHgzMzQwLCAweDlBNDIsIDB4MzMzRiwgMHg5QTQzLCAweDE2QTksIDB4OUE0NCwgMHgzMzNFLCAweDlBNDUsIDB4MTZBOCwKKyAgICAweDlBNDYsIDB4MzMzRCwgMHg5QTQ4LCAweDMzREQsIDB4OUE0OSwgMHgzM0RGLCAweDlBNEEsIDB4MzNERSwgMHg5QTRDLAorICAgIDB4MzNEQiwgMHg5QTRELCAweDE2RTksIDB4OUE0RSwgMHgzM0Q4LCAweDlBNEYsIDB4MzNEQywgMHg5QTUwLCAweDMzRTEsCisgICAgMHg5QTUyLCAweDMzRTAsIDB4OUE1MywgMHgzM0Q5LCAweDlBNTQsIDB4MzNEQSwgMHg5QTU1LCAweDE2RTgsIDB4OUE1NiwKKyAgICAweDM0NEYsIDB4OUE1NywgMHgxNzE1LCAweDlBNTksIDB4MzQ1MCwgMHg5QTVBLCAweDE3MTMsIDB4OUE1QiwgMHgxNzE0LAorICAgIDB4OUE1RSwgMHgzNEFFLCAweDlBNUYsIDB4MTczNywgMHg5QTYwLCAweDM1MTAsIDB4OUE2MiwgMHgxNzU3LCAweDlBNjQsCisgICAgMHgzNTJDLCAweDlBNjUsIDB4MTc1OCwgMHg5QTY2LCAweDM1MkQsIDB4OUE2NywgMHgzNTJFLCAweDlBNjgsIDB4MzUzQywKKyAgICAweDlBNjksIDB4MzUzQiwgMHg5QTZBLCAweDE3NjcsIDB4OUE2QiwgMHgzNTQ0LCAweDlBQTgsIDB4MDlGNiwgMHg5QUFCLAorICAgIDB4MjYwQywgMHg5QUFELCAweDI2MEIsIDB4OUFBRiwgMHgxMEY3LCAweDlBQjAsIDB4MTBGOCwgMHg5QUIxLCAweDI4NzEsCisgICAgMHg5QUIzLCAweDJBREUsIDB4OUFCNCwgMHgyRDBGLCAweDlBQjcsIDB4MTI3QSwgMHg5QUI4LCAweDEzQTQsIDB4OUFCOSwKKyAgICAweDJEMEQsIDB4OUFCQiwgMHgyRDEwLCAweDlBQkMsIDB4MTNBNSwgMHg5QUJFLCAweDJFREQsIDB4OUFCRiwgMHgyRDBFLAorICAgIDB4OUFDMCwgMHgzMDQ4LCAweDlBQzEsIDB4MTU2NCwgMHg5QUMyLCAweDMxOEIsIDB4OUFDNiwgMHgzMjhELCAweDlBQzcsCisgICAgMHgzMjhCLCAweDlBQ0EsIDB4MzI4QywgMHg5QUNELCAweDMzNDMsIDB4OUFDRiwgMHgxNkFDLCAweDlBRDAsIDB4MzNFMiwKKyAgICAweDlBRDEsIDB4MTcxOCwgMHg5QUQyLCAweDE2RUEsIDB4OUFEMywgMHgxNzE2LCAweDlBRDQsIDB4MTcxNywgMHg5QUQ1LAorICAgIDB4MzRBRiwgMHg5QUQ2LCAweDE3NEYsIDB4OUFEOCwgMHgwOUY3LCAweDlBREMsIDB4MzA0OSwgMHg5QURGLCAweDFFMzMsCisgICAgMHg5QUUxLCAweDBGNzgsIDB4OUFFMywgMHgyODcyLCAweDlBRTYsIDB4MTBGOSwgMHg5QUU3LCAweDI4NzMsIDB4OUFFQiwKKyAgICAweDJBRTAsIDB4OUFFQywgMHgyQURGLCAweDlBRUQsIDB4MTNBNywgMHg5QUVFLCAweDEyN0IsIDB4OUFFRiwgMHgxMjdDLAorICAgIDB4OUFGMSwgMHgyQUUzLCAweDlBRjIsIDB4MkFFMiwgMHg5QUYzLCAweDJBRTEsIDB4OUFGNiwgMHgyRDExLCAweDlBRjcsCisgICAgMHgyRDE0LCAweDlBRjksIDB4MkQxMywgMHg5QUZBLCAweDJEMTIsIDB4OUFGQiwgMHgxM0E2LCAweDlBRkMsIDB4MkVFMSwKKyAgICAweDlBRkQsIDB4MkVERiwgMHg5QUZFLCAweDJFREUsIDB4OUIwMSwgMHgyRUUwLCAweDlCMDMsIDB4MTU2NSwgMHg5QjA0LAorICAgIDB4MzA0QiwgMHg5QjA1LCAweDMwNEMsIDB4OUIwNiwgMHgxNTY2LCAweDlCMDgsIDB4MzA0QSwgMHg5QjBBLCAweDMxOEQsCisgICAgMHg5QjBCLCAweDMxOEMsIDB4OUIwQywgMHgzMThGLCAweDlCMEQsIDB4MTVGQiwgMHg5QjBFLCAweDMxOEUsIDB4OUIxMCwKKyAgICAweDMyOEUsIDB4OUIxMSwgMHgzMjkwLCAweDlCMTIsIDB4MzI4RiwgMHg5QjE1LCAweDMzNDQsIDB4OUIxNiwgMHgzMzQ3LAorICAgIDB4OUIxNywgMHgzMzQ1LCAweDlCMTgsIDB4MzM0NiwgMHg5QjE5LCAweDMzRTMsIDB4OUIxQSwgMHgxNkVCLCAweDlCMUUsCisgICAgMHgzNDUxLCAweDlCMUYsIDB4MzQ1MiwgMHg5QjIwLCAweDM0NTMsIDB4OUIyMiwgMHgxNzM4LCAweDlCMjMsIDB4MTc1MCwKKyAgICAweDlCMjQsIDB4MzUyRiwgMHg5QjI1LCAweDA5RjgsIDB4OUIyNywgMHgxMjdELCAweDlCMjgsIDB4MTNBOCwgMHg5QjI5LAorICAgIDB4MzA0RCwgMHg5QjJCLCAweDMzRTQsIDB4OUIyRSwgMHgzNTExLCAweDlCMkYsIDB4MUUzNCwgMHg5QjMxLCAweDE3NjgsCisgICAgMHg5QjMyLCAweDA5RjksIDB4OUIzMywgMHgyRDE1LCAweDlCMzUsIDB4MzA0RSwgMHg5QjM3LCAweDMxOTAsIDB4OUIzQSwKKyAgICAweDMzNDgsIDB4OUIzQiwgMHgzM0U1LCAweDlCM0MsIDB4MDlGQSwgMHg5QjNFLCAweDI4NzQsIDB4OUIzRiwgMHgyODc1LAorICAgIDB4OUI0MSwgMHgxMEZBLCAweDlCNDIsIDB4MTBGQiwgMHg5QjQzLCAweDJBRTUsIDB4OUI0NCwgMHgxMjdGLCAweDlCNDUsCisgICAgMHgxMjdFLCAweDlCNDYsIDB4MkFFNCwgMHg5QjQ4LCAweDJFRTIsIDB4OUI0QSwgMHgzMDRGLCAweDlCNEIsIDB4MzA1MSwKKyAgICAweDlCNEMsIDB4MzA1MCwgMHg5QjRELCAweDE1NjksIDB4OUI0RSwgMHgxNTY4LCAweDlCNEYsIDB4MTU2NywgMHg5QjUxLAorICAgIDB4MTZBRSwgMHg5QjUyLCAweDMzNDksIDB4OUI1NCwgMHgxNkFELCAweDlCNTUsIDB4MzNFNywgMHg5QjU2LCAweDMzRTYsCisgICAgMHg5QjU4LCAweDE3MzksIDB4OUI1OSwgMHgzNEIwLCAweDlCNUEsIDB4MEJFMSwgMHg5QjVCLCAweDI2MEQsIDB4OUI1RiwKKyAgICAweDI4NzgsIDB4OUI2MCwgMHgyODc2LCAweDlCNjEsIDB4Mjg3NywgMHg5QjY0LCAweDJBRUUsIDB4OUI2NiwgMHgyQUU5LAorICAgIDB4OUI2NywgMHgyQUU2LCAweDlCNjgsIDB4MkFFRCwgMHg5QjZDLCAweDJBRUYsIDB4OUI2RiwgMHgxMjgxLCAweDlCNzAsCisgICAgMHgyQUVDLCAweDlCNzEsIDB4MkFFOCwgMHg5Qjc0LCAweDJBRTcsIDB4OUI3NSwgMHgyQUVCLCAweDlCNzYsIDB4MkFFQSwKKyAgICAweDlCNzcsIDB4MTI4MCwgMHg5QjdBLCAweDJEMjAsIDB4OUI3QiwgMHgyRDFCLCAweDlCN0MsIDB4MkQxOSwgMHg5QjdELAorICAgIDB4MkQyMiwgMHg5QjdFLCAweDJEMUEsIDB4OUI4MCwgMHgyRDE2LCAweDlCODIsIDB4MkQxQywgMHg5Qjg1LCAweDJEMTcsCisgICAgMHg5Qjg2LCAweDJFRUIsIDB4OUI4NywgMHgyRDE4LCAweDlCODgsIDB4MkQyMywgMHg5QjkwLCAweDJEMUYsIDB4OUI5MSwKKyAgICAweDEzQTksIDB4OUI5MiwgMHgyRDFFLCAweDlCOTMsIDB4MkQxRCwgMHg5Qjk1LCAweDJEMjEsIDB4OUI5QSwgMHgyRUUzLAorICAgIDB4OUI5QiwgMHgyRUU2LCAweDlCOUUsIDB4MkVFNSwgMHg5QkEwLCAweDJFRUQsIDB4OUJBMSwgMHgyRUU4LCAweDlCQTIsCisgICAgMHgyRUVDLCAweDlCQTQsIDB4MkVFQSwgMHg5QkE1LCAweDJFRTksIDB4OUJBNiwgMHgyRUU3LCAweDlCQTgsIDB4MkVFNCwKKyAgICAweDlCQUEsIDB4MTRCRCwgMHg5QkFCLCAweDE0QkMsIDB4OUJBRCwgMHgxNEJFLCAweDlCQUUsIDB4MTRCQiwgMHg5QkFGLAorICAgIDB4MkVFRSwgMHg5QkI1LCAweDMwNTcsIDB4OUJCNiwgMHgzMDVBLCAweDlCQjgsIDB4MzA1OCwgMHg5QkI5LCAweDMwNUMsCisgICAgMHg5QkJELCAweDMwNUQsIDB4OUJCRiwgMHgzMDU1LCAweDlCQzAsIDB4MTU2RSwgMHg5QkMxLCAweDMwNTYsIDB4OUJDMywKKyAgICAweDMwNTQsIDB4OUJDNCwgMHgzMDVCLCAweDlCQzYsIDB4MzA1MywgMHg5QkM3LCAweDMwNTIsIDB4OUJDOCwgMHgxNTZELAorICAgIDB4OUJDOSwgMHgxNTZCLCAweDlCQ0EsIDB4MTU2QSwgMHg5QkQzLCAweDMwNTksIDB4OUJENCwgMHgzMTk5LCAweDlCRDUsCisgICAgMHgzMTlGLCAweDlCRDYsIDB4MTVGRSwgMHg5QkQ3LCAweDMxOUEsIDB4OUJEOSwgMHgzMTlELCAweDlCREEsIDB4MzFBMSwKKyAgICAweDlCREIsIDB4MTVGRiwgMHg5QkRDLCAweDMxOUMsIDB4OUJERSwgMHgzMTk0LCAweDlCRTAsIDB4MzE5MywgMHg5QkUxLAorICAgIDB4MzFBMCwgMHg5QkUyLCAweDMxOTcsIDB4OUJFNCwgMHgzMTk1LCAweDlCRTUsIDB4MzE5RSwgMHg5QkU2LCAweDMxOTYsCisgICAgMHg5QkU3LCAweDE1RkQsIDB4OUJFOCwgMHgxNUZDLCAweDlCRUEsIDB4MzE5MSwgMHg5QkVCLCAweDMxOTIsIDB4OUJFQywKKyAgICAweDMxOUIsIDB4OUJGMCwgMHgzMTk4LCAweDlCRjcsIDB4MzI5MywgMHg5QkY4LCAweDMyOTYsIDB4OUJGRCwgMHgxNTZDLAorICAgIDB4OUMwNSwgMHgzMjk0LCAweDlDMDYsIDB4MzI5QSwgMHg5QzA3LCAweDMyOTgsIDB4OUMwOCwgMHgzMjkyLCAweDlDMDksCisgICAgMHgzMjlELCAweDlDMEIsIDB4MzI5MSwgMHg5QzBELCAweDE2NjAsIDB4OUMwRSwgMHgzMjk5LCAweDlDMTIsIDB4MzI5NSwKKyAgICAweDlDMTMsIDB4MTY1RiwgMHg5QzE0LCAweDMyOUMsIDB4OUMxNywgMHgzMjlCLCAweDlDMUMsIDB4MzM0QywgMHg5QzFELAorICAgIDB4MzM0QiwgMHg5QzIxLCAweDMzNTIsIDB4OUMyMywgMHgzMzRFLCAweDlDMjQsIDB4MzM1MSwgMHg5QzI1LCAweDE2QjAsCisgICAgMHg5QzI4LCAweDMzNEYsIDB4OUMyOSwgMHgzMzUwLCAweDlDMkIsIDB4MzM0QSwgMHg5QzJDLCAweDMzNEQsIDB4OUMyRCwKKyAgICAweDE2QUYsIDB4OUMzMSwgMHgxNkVELCAweDlDMzIsIDB4MzNGMiwgMHg5QzMzLCAweDMzRUQsIDB4OUMzNCwgMHgzM0YxLAorICAgIDB4OUMzNiwgMHgzM0Y0LCAweDlDMzcsIDB4MzNGMCwgMHg5QzM5LCAweDMzRUMsIDB4OUMzQiwgMHgxNkVGLCAweDlDM0MsCisgICAgMHgzM0VGLCAweDlDM0QsIDB4MzNGMywgMHg5QzNFLCAweDE2RUUsIDB4OUMzRiwgMHgzM0VBLCAweDlDNDAsIDB4MzI5NywKKyAgICAweDlDNDEsIDB4MzNFRSwgMHg5QzQ0LCAweDMzRUIsIDB4OUM0NiwgMHgzM0U4LCAweDlDNDgsIDB4MzNFOSwgMHg5QzQ5LAorICAgIDB4MTZFQywgMHg5QzRBLCAweDM0NTcsIDB4OUM0QiwgMHgzNDU5LCAweDlDNEMsIDB4MzQ1QywgMHg5QzRELCAweDM0NTgsCisgICAgMHg5QzRFLCAweDM0NUQsIDB4OUM1MCwgMHgzNDU2LCAweDlDNTIsIDB4MzQ1NCwgMHg5QzU0LCAweDE3MTksIDB4OUM1NSwKKyAgICAweDM0NUEsIDB4OUM1NiwgMHgxNzFCLCAweDlDNTcsIDB4MTcxQSwgMHg5QzU4LCAweDM0NTUsIDB4OUM1OSwgMHgzNDVCLAorICAgIDB4OUM1RSwgMHgzNEI1LCAweDlDNUYsIDB4MTczQSwgMHg5QzYwLCAweDM0QjYsIDB4OUM2MiwgMHgzNEI0LCAweDlDNjMsCisgICAgMHgzNEIxLCAweDlDNjYsIDB4MzRCMywgMHg5QzY3LCAweDM0QjIsIDB4OUM2OCwgMHgzNEY0LCAweDlDNkQsIDB4MzRGNiwKKyAgICAweDlDNkUsIDB4MzRGNSwgMHg5QzcxLCAweDM1MTQsIDB4OUM3MywgMHgzNTEzLCAweDlDNzQsIDB4MzUxMiwgMHg5Qzc1LAorICAgIDB4MzUxNSwgMHg5Qzc3LCAweDE3NjAsIDB4OUM3OCwgMHgxNzYxLCAweDlDNzksIDB4MzU0MSwgMHg5QzdBLCAweDM1NDUsCisgICAgMHg5Q0U1LCAweDBCRTIsIDB4OUNFNiwgMHgyMzVGLCAweDlDRTcsIDB4MjYxMCwgMHg5Q0U5LCAweDBGNzksIDB4OUNFQSwKKyAgICAweDI2MEUsIDB4OUNFRCwgMHgyNjBGLCAweDlDRjEsIDB4Mjg3OSwgMHg5Q0YyLCAweDI4N0EsIDB4OUNGMywgMHgxMEZFLAorICAgIDB4OUNGNCwgMHgxMEZDLCAweDlDRjUsIDB4Mjg3QiwgMHg5Q0Y2LCAweDEwRkQsIDB4OUNGNywgMHgyQUY0LCAweDlDRjksCisgICAgMHgyQUY3LCAweDlDRkEsIDB4MkFGMSwgMHg5Q0ZCLCAweDJBRjgsIDB4OUNGQywgMHgyQUYwLCAweDlDRkQsIDB4MkFGMiwKKyAgICAweDlDRkYsIDB4MkFGMywgMHg5RDAwLCAweDJBRjYsIDB4OUQwMywgMHgxMjg0LCAweDlEMDQsIDB4MkFGQiwgMHg5RDA1LAorICAgIDB4MkFGQSwgMHg5RDA2LCAweDEyODIsIDB4OUQwNywgMHgyQUY1LCAweDlEMDgsIDB4MkFGOSwgMHg5RDA5LCAweDEyODMsCisgICAgMHg5RDEwLCAweDJEMkQsIDB4OUQxMiwgMHgxM0FFLCAweDlEMTQsIDB4MkQyOCwgMHg5RDE1LCAweDEzQUEsIDB4OUQxNywKKyAgICAweDJEMjUsIDB4OUQxOCwgMHgyRDJCLCAweDlEMTksIDB4MkQyRSwgMHg5RDFCLCAweDEzQUYsIDB4OUQxRCwgMHgyRDJBLAorICAgIDB4OUQxRSwgMHgyRDI3LCAweDlEMUYsIDB4MkQyRiwgMHg5RDIwLCAweDJEMjYsIDB4OUQyMiwgMHgyRDJDLCAweDlEMjMsCisgICAgMHgxM0FCLCAweDlEMjUsIDB4MkQyNCwgMHg5RDI2LCAweDEzQUMsIDB4OUQyOCwgMHgxM0FELCAweDlEMjksIDB4MkQyOSwKKyAgICAweDlEMkQsIDB4MkYwMCwgMHg5RDJFLCAweDJFRjMsIDB4OUQyRiwgMHgyRUY0LCAweDlEMzAsIDB4MkVGNywgMHg5RDMxLAorICAgIDB4MkVGNSwgMHg5RDMzLCAweDJFRUYsIDB4OUQzNiwgMHgyRUYyLCAweDlEMzcsIDB4MkVGQywgMHg5RDM4LCAweDJFRjYsCisgICAgMHg5RDNCLCAweDE0QkYsIDB4OUQzRCwgMHgyRUZFLCAweDlEM0UsIDB4MkVGQiwgMHg5RDNGLCAweDE0QzAsIDB4OUQ0MCwKKyAgICAweDJFRkQsIDB4OUQ0MSwgMHgyRUYwLCAweDlENDIsIDB4MkVGOSwgMHg5RDQzLCAweDJFRkEsIDB4OUQ0NSwgMHgyRUY4LAorICAgIDB4OUQ0QSwgMHgzMDYxLCAweDlENEIsIDB4MzA2MywgMHg5RDRDLCAweDMwNjYsIDB4OUQ0RiwgMHgzMDYwLCAweDlENTEsCisgICAgMHgxNTZGLCAweDlENTIsIDB4MzA2OCwgMHg5RDUzLCAweDMwNUYsIDB4OUQ1NCwgMHgzMDY5LCAweDlENTYsIDB4MzA2NSwKKyAgICAweDlENTcsIDB4MzA2NywgMHg5RDU4LCAweDMwNkIsIDB4OUQ1OSwgMHgzMDY0LCAweDlENUEsIDB4MzA2QywgMHg5RDVCLAorICAgIDB4MzA2MiwgMHg5RDVDLCAweDMwNUUsIDB4OUQ1RCwgMHgxNTcwLCAweDlENUYsIDB4MzA2QSwgMHg5RDYwLCAweDE1NzEsCisgICAgMHg5RDYxLCAweDE2MDEsIDB4OUQ2NywgMHgyRUYxLCAweDlENjgsIDB4MzFCQiwgMHg5RDY5LCAweDMxQjIsIDB4OUQ2QSwKKyAgICAweDE2MDMsIDB4OUQ2QiwgMHgzMUFFLCAweDlENkMsIDB4MTYwNCwgMHg5RDZGLCAweDMxQjcsIDB4OUQ3MCwgMHgzMUIxLAorICAgIDB4OUQ3MSwgMHgzMUE3LCAweDlENzIsIDB4MTYwMiwgMHg5RDczLCAweDMxQjQsIDB4OUQ3NCwgMHgzMUFGLCAweDlENzUsCisgICAgMHgzMUIwLCAweDlENzcsIDB4MzFBMiwgMHg5RDc4LCAweDMxQTksIDB4OUQ3OSwgMHgzMUI4LCAweDlEN0IsIDB4MzFCNSwKKyAgICAweDlEN0QsIDB4MzFBRCwgMHg5RDdGLCAweDMxQjksIDB4OUQ4MCwgMHgzMUE4LCAweDlEODEsIDB4MzFBMywgMHg5RDgyLAorICAgIDB4MzFCNiwgMHg5RDg0LCAweDMxQTUsIDB4OUQ4NSwgMHgzMUIzLCAweDlEODYsIDB4MzFBQSwgMHg5RDg3LCAweDMxQkEsCisgICAgMHg5RDg4LCAweDMxQTYsIDB4OUQ4OSwgMHgxNjAwLCAweDlEOEEsIDB4MzFBNCwgMHg5RDhCLCAweDMxQUIsIDB4OUQ4QywKKyAgICAweDMxQUMsIDB4OUQ5MCwgMHgzMkE0LCAweDlEOTIsIDB4MzJBMiwgMHg5RDk0LCAweDMyQTcsIDB4OUQ5NiwgMHgzMkIzLAorICAgIDB4OUQ5NywgMHgzMkFBLCAweDlEOTgsIDB4MzJBMywgMHg5RDk5LCAweDMyOUYsIDB4OUQ5QSwgMHgzMkFDLCAweDlEOUIsCisgICAgMHgzMkE1LCAweDlEOUMsIDB4MzJBOCwgMHg5RDlELCAweDMyQTEsIDB4OUQ5RSwgMHgzMkFGLCAweDlEOUYsIDB4MzI5RSwKKyAgICAweDlEQTAsIDB4MzJBNiwgMHg5REExLCAweDMyQUIsIDB4OURBMiwgMHgzMkFELCAweDlEQTMsIDB4MzJCMCwgMHg5REE0LAorICAgIDB4MzJBMCwgMHg5REE2LCAweDMyQjQsIDB4OURBNywgMHgzMkI1LCAweDlEQTgsIDB4MzJBRSwgMHg5REE5LCAweDMyQjIsCisgICAgMHg5REFBLCAweDMyQTksIDB4OURBQywgMHgzMzYyLCAweDlEQUQsIDB4MzM2NSwgMHg5REFGLCAweDE2QjEsIDB4OURCMSwKKyAgICAweDMzNjQsIDB4OURCMiwgMHgzMzY5LCAweDlEQjMsIDB4MzM2NywgMHg5REI0LCAweDE2QjIsIDB4OURCNSwgMHgzMzVFLAorICAgIDB4OURCNiwgMHgzMzU0LCAweDlEQjcsIDB4MzM1MywgMHg5REI4LCAweDE2QjQsIDB4OURCOSwgMHgzMzYwLCAweDlEQkEsCisgICAgMHgzMzYxLCAweDlEQkIsIDB4MzM1RCwgMHg5REJDLCAweDMzNTUsIDB4OURCRSwgMHgzMzVBLCAweDlEQkYsIDB4MzJCMSwKKyAgICAweDlEQzEsIDB4MzM1NiwgMHg5REMyLCAweDE2QjMsIDB4OURDMywgMHgzMzVDLCAweDlEQzUsIDB4MzM1QiwgMHg5REM3LAorICAgIDB4MzM1NywgMHg5REM4LCAweDMzNjMsIDB4OURDQSwgMHgzMzU4LCAweDlEQ0IsIDB4MzNGOSwgMHg5RENDLCAweDMzNjYsCisgICAgMHg5RENELCAweDMzNjgsIDB4OURDRSwgMHgzMzVGLCAweDlEQ0YsIDB4MzM1OSwgMHg5REQwLCAweDMzRkEsIDB4OUREMSwKKyAgICAweDMzRkMsIDB4OUREMiwgMHgzM0Y2LCAweDlERDMsIDB4MTZGMCwgMHg5REQ1LCAweDM0MDMsIDB4OURENiwgMHgzNDAxLAorICAgIDB4OURENywgMHgxNkYxLCAweDlERDgsIDB4MzQwMCwgMHg5REQ5LCAweDMzRkYsIDB4OUREQSwgMHgzM0Y4LCAweDlEREIsCisgICAgMHgzM0Y1LCAweDlEREMsIDB4MzNGQiwgMHg5RERELCAweDM0MDQsIDB4OURERSwgMHgzM0Y3LCAweDlEREYsIDB4MzNGRCwKKyAgICAweDlERTEsIDB4MzQ2NiwgMHg5REUyLCAweDM0NkIsIDB4OURFMywgMHgzNDYxLCAweDlERTQsIDB4MzQ2NCwgMHg5REU1LAorICAgIDB4MTcxQywgMHg5REU2LCAweDM0NjgsIDB4OURFOCwgMHgzNDZGLCAweDlERTksIDB4MzNGRSwgMHg5REVCLCAweDM0NjIsCisgICAgMHg5REVDLCAweDM0NkMsIDB4OURFRCwgMHgzNDcwLCAweDlERUUsIDB4MzQ2NywgMHg5REVGLCAweDM0NjAsIDB4OURGMCwKKyAgICAweDM0NkEsIDB4OURGMiwgMHgzNDY5LCAweDlERjMsIDB4MzQ2RSwgMHg5REY0LCAweDM0NkQsIDB4OURGNSwgMHgzNDAyLAorICAgIDB4OURGNiwgMHgzNDY1LCAweDlERjcsIDB4MzQ1RiwgMHg5REY4LCAweDM0NjMsIDB4OURGOSwgMHgxNzNCLCAweDlERkEsCisgICAgMHgxNzNDLCAweDlERkIsIDB4MzQ1RSwgMHg5REZELCAweDM0QzEsIDB4OURGRSwgMHgzNEI4LCAweDlERkYsIDB4MzRDMCwKKyAgICAweDlFMDAsIDB4MzRCRCwgMHg5RTAxLCAweDM0QkUsIDB4OUUwMiwgMHgzNEI3LCAweDlFMDMsIDB4MzRCQSwgMHg5RTA0LAorICAgIDB4MzRDMiwgMHg5RTA1LCAweDM0QkMsIDB4OUUwNiwgMHgzNEJCLCAweDlFMDcsIDB4MzRCOSwgMHg5RTA5LCAweDM0QkYsCisgICAgMHg5RTBCLCAweDM0RjcsIDB4OUUwRCwgMHgzNEY4LCAweDlFMEYsIDB4MzRGQSwgMHg5RTEwLCAweDM0RjksIDB4OUUxMSwKKyAgICAweDM0RkMsIDB4OUUxMiwgMHgzNEZCLCAweDlFMTMsIDB4MzUxNywgMHg5RTE0LCAweDM1MTYsIDB4OUUxNSwgMHgzNTMwLAorICAgIDB4OUUxNywgMHgzNTMxLCAweDlFMTksIDB4MzUzRCwgMHg5RTFBLCAweDE3NjUsIDB4OUUxQiwgMHgxNzY5LCAweDlFMUQsCisgICAgMHgzNTQ2LCAweDlFMUUsIDB4MTc2QSwgMHg5RTc1LCAweDBCRTMsIDB4OUU3OSwgMHgxNjYxLCAweDlFN0EsIDB4MzM2QSwKKyAgICAweDlFN0MsIDB4MTczRCwgMHg5RTdELCAweDE3M0UsIDB4OUU3RiwgMHgwQkU0LCAweDlFODAsIDB4MjYxMSwgMHg5RTgyLAorICAgIDB4MEY3QSwgMHg5RTgzLCAweDJBRkMsIDB4OUU4NiwgMHgyRDMxLCAweDlFODcsIDB4MkQzMiwgMHg5RTg4LCAweDJEMzAsCisgICAgMHg5RTg5LCAweDJGMDIsIDB4OUU4QSwgMHgyRjAxLCAweDlFOEIsIDB4MTRDMSwgMHg5RThDLCAweDMwNkUsIDB4OUU4RCwKKyAgICAweDJGMDMsIDB4OUU4RSwgMHgzMDZELCAweDlFOTEsIDB4MzFCRCwgMHg5RTkyLCAweDE2MDUsIDB4OUU5MywgMHgxNjA3LAorICAgIDB4OUU5NCwgMHgzMUJDLCAweDlFOTcsIDB4MTYwNiwgMHg5RTk5LCAweDMyQjYsIDB4OUU5QSwgMHgzMkI4LCAweDlFOUIsCisgICAgMHgzMkI3LCAweDlFOUMsIDB4MzM2QiwgMHg5RTlELCAweDE2QjUsIDB4OUU5RiwgMHgxNzFELCAweDlFQTAsIDB4MzRDMywKKyAgICAweDlFQTEsIDB4MzRGRCwgMHg5RUE0LCAweDM1NEEsIDB4OUVBNSwgMHgwQkU1LCAweDlFQTcsIDB4Mjg3QywgMHg5RUE5LAorICAgIDB4MTI4NSwgMHg5RUFELCAweDJEMzQsIDB4OUVBRSwgMHgyRDMzLCAweDlFQjAsIDB4MkYwNCwgMHg5RUI0LCAweDE2MDgsCisgICAgMHg5RUI1LCAweDE2NjIsIDB4OUVCNiwgMHgzNDA1LCAweDlFQjcsIDB4MzU0MiwgMHg5RUJCLCAweDBCRTYsIDB4OUVCQywKKyAgICAweDEwRkYsIDB4OUVCRSwgMHgxMjg2LCAweDlFQzAsIDB4MzFCRSwgMHg5RUMyLCAweDM0NzEsIDB4OUVDMywgMHgwREJCLAorICAgIDB4OUVDOCwgMHgyRjA1LCAweDlFQ0MsIDB4MTc1MSwgMHg5RUNELCAweDBEQkMsIDB4OUVDRSwgMHgxMjg3LCAweDlFQ0YsCisgICAgMHgxNEMyLCAweDlFRDAsIDB4MzQ3MiwgMHg5RUQxLCAweDBEQkQsIDB4OUVEMywgMHgyQUZELCAweDlFRDQsIDB4MTNCMSwKKyAgICAweDlFRDUsIDB4MkQzNSwgMHg5RUQ2LCAweDJEMzYsIDB4OUVEOCwgMHgxM0IwLCAweDlFREEsIDB4MkYwNiwgMHg5RURCLAorICAgIDB4MTRDNiwgMHg5RURDLCAweDE0QzQsIDB4OUVERCwgMHgxNEM1LCAweDlFREUsIDB4MTRDMywgMHg5RURGLCAweDMwNkYsCisgICAgMHg5RUUwLCAweDE1NzIsIDB4OUVFNCwgMHgzMkJBLCAweDlFRTUsIDB4MzJCOSwgMHg5RUU2LCAweDMyQkMsIDB4OUVFNywKKyAgICAweDMyQkIsIDB4OUVFOCwgMHgxNjYzLCAweDlFRUIsIDB4MzM2QywgMHg5RUVELCAweDMzNkUsIDB4OUVFRSwgMHgzMzZELAorICAgIDB4OUVFRiwgMHgxNkI2LCAweDlFRjAsIDB4MzQwNiwgMHg5RUYyLCAweDM0NzMsIDB4OUVGMywgMHgzNDc0LCAweDlFRjQsCisgICAgMHgxNzFFLCAweDlFRjUsIDB4MzRGRSwgMHg5RUY2LCAweDM1MTgsIDB4OUVGNywgMHgxNzYyLCAweDlFRjksIDB4MjM2MCwKKyAgICAweDlFRkEsIDB4MkQzNywgMHg5RUZCLCAweDJGMDcsIDB4OUVGQywgMHgzMUJGLCAweDlFRkQsIDB4MjYxMiwgMHg5RUZGLAorICAgIDB4MkYwOCwgMHg5RjAwLCAweDMwNzEsIDB4OUYwMSwgMHgzMDcwLCAweDlGMDYsIDB4MzQ3NSwgMHg5RjA3LCAweDE3M0YsCisgICAgMHg5RjA5LCAweDM0RkYsIDB4OUYwQSwgMHgzNTE5LCAweDlGMEUsIDB4MEY3QiwgMHg5RjBGLCAweDJBRkUsIDB4OUYxMCwKKyAgICAweDJBRkYsIDB4OUYxMiwgMHgyRDM4LCAweDlGMTMsIDB4MEY3QywgMHg5RjE1LCAweDE1NzMsIDB4OUYxNiwgMHgzMDcyLAorICAgIDB4OUYxOCwgMHgzMzcwLCAweDlGMTksIDB4MTZCNywgMHg5RjFBLCAweDMzNzEsIDB4OUYxQiwgMHgzMzZGLCAweDlGMUMsCisgICAgMHgzNDc2LCAweDlGMUUsIDB4MzRDNCwgMHg5RjIwLCAweDBGN0QsIDB4OUYyMiwgMHgyRjBCLCAweDlGMjMsIDB4MkYwQSwKKyAgICAweDlGMjQsIDB4MkYwOSwgMHg5RjI1LCAweDMwNzMsIDB4OUYyOCwgMHgzMDc3LCAweDlGMjksIDB4MzA3NiwgMHg5RjJBLAorICAgIDB4MzA3NSwgMHg5RjJCLCAweDMwNzQsIDB4OUYyQywgMHgxNTc0LCAweDlGMkQsIDB4MzFDMCwgMHg5RjJFLCAweDMyQkUsCisgICAgMHg5RjJGLCAweDE2NjQsIDB4OUYzMCwgMHgzMkJELCAweDlGMzEsIDB4MzM3MiwgMHg5RjMyLCAweDM0MDksIDB4OUYzMywKKyAgICAweDM0MDgsIDB4OUYzNCwgMHgxNkYyLCAweDlGMzUsIDB4MzQwNywgMHg5RjM2LCAweDM0NzksIDB4OUYzNywgMHgzNDc4LAorICAgIDB4OUYzOCwgMHgzNDc3LCAweDlGM0IsIDB4MTEwMCwgMHg5RjNELCAweDJEMzksIDB4OUYzRSwgMHgxNEM3LCAweDlGNDAsCisgICAgMHgzMUMxLCAweDlGNDEsIDB4MzFDMiwgMHg5RjQyLCAweDM0MEEsIDB4OUY0MywgMHgzNDdBLCAweDlGNDYsIDB4MzRDNSwKKyAgICAweDlGNDcsIDB4MzUwMCwgMHg5RjQ4LCAweDM1MzIsIDB4OUY0OSwgMHgzNTRDLCAweDlGNEEsIDB4MTEwMSwgMHg5RjRCLAorICAgIDB4MTRDOCwgMHg5RjRDLCAweDMwNzgsIDB4OUY0RCwgMHgzMUMzLCAweDlGNEUsIDB4MzM3MywgMHg5RjRGLCAweDM0N0IsCisgICAgMHg5RjUyLCAweDEyODksIDB4OUY1NCwgMHgyRjBDLCAweDlGNTUsIDB4MzA3OSwgMHg5RjU2LCAweDMxQzQsIDB4OUY1NywKKyAgICAweDMxQzUsIDB4OUY1OCwgMHgzMUM2LCAweDlGNTksIDB4MzJDMywgMHg5RjVCLCAweDMyQkYsIDB4OUY1QywgMHgxNkI4LAorICAgIDB4OUY1RCwgMHgzMkMyLCAweDlGNUUsIDB4MzJDMSwgMHg5RjVGLCAweDE2NjUsIDB4OUY2MCwgMHgzMkMwLCAweDlGNjEsCisgICAgMHgxNjY3LCAweDlGNjMsIDB4MTY2NiwgMHg5RjY0LCAweDMzNzUsIDB4OUY2NSwgMHgzMzc0LCAweDlGNjYsIDB4MTZCOSwKKyAgICAweDlGNjcsIDB4MTZCQSwgMHg5RjZBLCAweDE2RjQsIDB4OUY2QiwgMHgzNDBCLCAweDlGNkMsIDB4MTZGMywgMHg5RjZFLAorICAgIDB4MzQ3RSwgMHg5RjZGLCAweDM0N0YsIDB4OUY3MCwgMHgzNDdELCAweDlGNzEsIDB4MzQ3QywgMHg5RjcyLCAweDE3NDEsCisgICAgMHg5Rjc0LCAweDM0QzYsIDB4OUY3NSwgMHgzNEM3LCAweDlGNzYsIDB4MzRDOCwgMHg5Rjc3LCAweDE3NDAsIDB4OUY3OCwKKyAgICAweDM1MDEsIDB4OUY3OSwgMHgzNTA0LCAweDlGN0EsIDB4MzUwMywgMHg5RjdCLCAweDM1MDIsIDB4OUY3RSwgMHgzNTRCLAorICAgIDB4OUY4RCwgMHgxM0IyLCAweDlGOTAsIDB4MTU3QywgMHg5RjkxLCAweDMyQzQsIDB4OUY5MiwgMHgzMzc2LCAweDlGOTQsCisgICAgMHgxNkY1LCAweDlGOTUsIDB4MzQwQywgMHg5Rjk4LCAweDM1NEQsIDB4OUY5QywgMHgxM0IzLCAweDlGQTAsIDB4MkYwRCwKKyAgICAweDlGQTIsIDB4MzQwRCwgMHg5RkE0LCAweDM1MUEsIDB4RTAxRiwgMHgwODNBLCAweEUwMjYsIDB4MDlGRCwgMHhFMDVCLAorICAgIDB4MDMwRCwgMHhFMDYzLCAweDAxNkIsIDB4RTA3MywgMHgwODYwLCAweEUwRjMsIDB4MEMyMywgMHhFMTJFLCAweDE3RTQsCisgICAgMHhFMTQ5LCAweDIxMkYsIDB4RTE5MSwgMHgxMTVGLCAweEUxQkEsIDB4MEM3OSwgMHhFMUM5LCAweDA0QzMsIDB4RTIyQywKKyAgICAweDE4QkQsIDB4RTIyRCwgMHgwQ0JELCAweEUyMzAsIDB4MENBNSwgMHhFMjY2LCAweDBDQ0UsIDB4RTJBMywgMHgwRTg0LAorICAgIDB4RTJCQywgMHgwMTIwLCAweEUyRUYsIDB4MUJBOCwgMHhFMzNBLCAweDEwNTUsIDB4RTM0MCwgMHgyREU4LCAweEUzNEYsCisgICAgMHgwMTIxLCAweEUzNUEsIDB4MTA2QiwgMHhFMzYzLCAweDEzMjYsIDB4RTM3QywgMHgwNjZCLCAweEUzN0YsIDB4MTMyRSwKKyAgICAweEUzQzUsIDB4MEQzNSwgMHhFM0Q3LCAweDI3QzIsIDB4RTNEQywgMHgyMkFELCAweEU0MTcsIDB4MTM0QywgMHhFNDRBLAorICAgIDB4MDlDRSwgMHhFNDc4LCAweDBCQzcsIDB4RTQ4NSwgMHgzNkU5LCAweEU0QzUsIDB4MTM5MSwgMHhFNERBLCAweDE2QTQsCisgICAgMHhFNTQ1LCAweDMwNzIsIDB4RTVEMiwgMHgwMTE5LCAweEU1RDMsIDB4MDExQSwgMHhFNUQ0LCAweDAxMUMsIDB4RTVENSwKKyAgICAweDAxMUIsIDB4RTVGNCwgMHgyOTdDLCAweEU2QzYsIDB4MUQwNiwgMHhFNzI3LCAweDI5QTEsIDB4RTdEMywgMHgxODFCLAorICAgIDB4RTg5MywgMHgyQjI0LCAweEVCNDAsIDB4MkY1MCwgMHhFQjQyLCAweDE3MjUsIDB4RUI0NSwgMHgzMkVELCAweEVCNkUsCisgICAgMHgyQUQ5LCAweEVCODYsIDB4MUMxNCwgMHhFQjlFLCAweDEyRTksIDB4RUJBOSwgMHgyQ0FFLCAweEVCQkEsIDB4MUE2NCwKKyAgICAweEVCQzksIDB4MTQwNCwgMHhFQkNGLCAweDIzMjQsIDB4RUJEMiwgMHgzNDZBLCAweEVCREUsIDB4MjI5MSwgMHhFQzAxLAorICAgIDB4MTc4NywgMHhFQzAyLCAweDA5NUYsIDB4RUMxNSwgMHgxRTk5LCAweEVDNUIsIDB4MjVDMSwgMHhFQzVFLCAweDBEMEMsCisgICAgMHhFQ0E2LCAweDA1RTYsIDB4RUQyOCwgMHgwNzI4LCAweEVENkUsIDB4MjRCNiwgMHhFRDdDLCAweDE4MDYsIDB4RUQ5RSwKKyAgICAweDM1MTEsIDB4RURFNywgMHgwRjgyLCAweEVFNTIsIDB4MDVGMiwgMHhFRTk4LCAweDI0N0QsIDB4RjZCMSwgMHgwMUZBLAorICAgIDB4RjZCMiwgMHgwMUZCLCAweEY2QjMsIDB4MDFGQywgMHhGNkI0LCAweDAxRkQsIDB4RjZCNSwgMHgwMUZFLCAweEY2QjYsCisgICAgMHgwMUZGLCAweEY2QjcsIDB4MDIwMCwgMHhGNkI4LCAweDAyMDEsIDB4RjZCOSwgMHgwMjAyLCAweEY2QkEsIDB4MDIwMywKKyAgICAweEY2QkIsIDB4MDIwNCwgMHhGNkJDLCAweDAyMDUsIDB4RjZCRCwgMHgwMjA2LCAweEY2QkUsIDB4MDIwNywgMHhGNkJGLAorICAgIDB4MDIwOCwgMHhGNkMwLCAweDAyMDksIDB4RjZDMSwgMHgwMjBBLCAweEY2QzIsIDB4MDIwQiwgMHhGNkMzLCAweDAyMEMsCisgICAgMHhGNkM0LCAweDAyMEQsIDB4RjZDNSwgMHgwMjBFLCAweEY2QzYsIDB4MDIwRiwgMHhGNkM3LCAweDAyMTAsIDB4RjZDOCwKKyAgICAweDAyMTEsIDB4RjZDOSwgMHgwMjEyLCAweEY2Q0EsIDB4MDIxMywgMHhGNkNCLCAweDAyMTQsIDB4RjZDQywgMHgwMjE1LAorICAgIDB4RjZDRCwgMHgwMjE2LCAweEY2Q0UsIDB4MDIxNywgMHhGNkNGLCAweDAyMTksIDB4RjZEMCwgMHgwMjFBLCAweEY2RDEsCisgICAgMHgwMjFCLCAweEY2RDIsIDB4MDIxQywgMHhGNkQzLCAweDAyMUQsIDB4RjZENCwgMHgwMjFFLCAweEY2RDUsIDB4MDIxRiwKKyAgICAweEY2RDYsIDB4MDIyMCwgMHhGNkQ3LCAweDAyMjEsIDB4RjZEOCwgMHgwMjIyLCAweEY2RDksIDB4MDIyMywgMHhGNkRBLAorICAgIDB4MDIyNCwgMHhGNkRCLCAweDAyMjUsIDB4RjZEQywgMHgwMjI2LCAweEY2REQsIDB4MDIyNywgMHhGNkRFLCAweDAyMjgsCisgICAgMHhGNkUwLCAweDAyMkEsIDB4RjZFMSwgMHgwMjJCLCAweEY2RTIsIDB4MDIyQywgMHhGNkU0LCAweDAyMkUsIDB4RjZFNiwKKyAgICAweDAyMzAsIDB4RjZFOCwgMHgzNUIzLCAweEY2RTksIDB4MzVCNCwgMHhGNkVBLCAweDM1QjUsIDB4RjZFQiwgMHgzNUI2LAorICAgIDB4RjZFQywgMHgzNUI3LCAweEY2RUQsIDB4MzVCOCwgMHhGNkYwLCAweDM1QkEsIDB4RjZGMSwgMHgzNUJCLCAweEY2RjIsCisgICAgMHgzNUJDLCAweEY2RjMsIDB4MzVCRCwgMHhGNkY0LCAweDM1QkUsIDB4RjZGNSwgMHgzNUJGLCAweEY2RjYsIDB4MzVDMCwKKyAgICAweEY2RjcsIDB4MzVDMSwgMHhGNkY4LCAweDM1QzIsIDB4RjZGOSwgMHgzNUMzLCAweEY2RkEsIDB4MzVDNCwgMHhGNkZCLAorICAgIDB4MzVDNSwgMHhGNkZDLCAweDM1QzYsIDB4RjZGRCwgMHgzNUM3LCAweEY2RkUsIDB4MzVDOCwgMHhGNkZGLCAweDM1QzksCisgICAgMHhGNzAwLCAweDM1Q0EsIDB4RjcwMSwgMHgzNUNCLCAweEY3MDIsIDB4MzVDQywgMHhGNzAzLCAweDM1Q0QsIDB4RjcwNCwKKyAgICAweDM1Q0UsIDB4RjcwNSwgMHgzNUNGLCAweEY3MDYsIDB4MzVEMCwgMHhGNzA3LCAweDM1RDEsIDB4RjcwOCwgMHgzNUQyLAorICAgIDB4RjcwOSwgMHgzNUQzLCAweEY3MEEsIDB4MzVENCwgMHhGNzBCLCAweDM1RDUsIDB4RjcwQywgMHgzNUQ2LCAweEY3MEQsCisgICAgMHgzNUQ3LCAweEY3MEUsIDB4MzVEOCwgMHhGNzBGLCAweDM1RDksIDB4RjcxMCwgMHgzNURBLCAweEY3MTEsIDB4MzVEQiwKKyAgICAweEY3MTIsIDB4MzVEQywgMHhGNzEzLCAweDM1REQsIDB4RjcxNCwgMHgzNURFLCAweEY3MTUsIDB4MzVERiwgMHhGNzE2LAorICAgIDB4MzVFMCwgMHhGNzE3LCAweDM1RTEsIDB4RjcxOCwgMHgzNUUyLCAweEY3MTksIDB4MzVFMywgMHhGNzFBLCAweDM1RTQsCisgICAgMHhGNzFCLCAweDM1RTUsIDB4RjcxQywgMHgzNUU2LCAweEY3MUQsIDB4MzVFNywgMHhGNzFFLCAweDM1RTgsIDB4RjcxRiwKKyAgICAweDM1RTksIDB4RjcyMCwgMHgzNUVBLCAweEY3MjEsIDB4MzVFQiwgMHhGNzIyLCAweDM1RUMsIDB4RjcyMywgMHgzNUVELAorICAgIDB4RjcyNCwgMHgzNUVFLCAweEY3MjUsIDB4MzVFRiwgMHhGNzI2LCAweDM1RjAsIDB4RjcyNywgMHgzNUYxLCAweEY3MjgsCisgICAgMHgzNUYyLCAweEY3MjksIDB4MzVGMywgMHhGNzJBLCAweDM1RjQsIDB4RjcyQiwgMHgzNUY1LCAweEY3MkMsIDB4MzVGNiwKKyAgICAweEY3MkQsIDB4MzVGNywgMHhGNzJFLCAweDM1RjgsIDB4RjcyRiwgMHgzNUY5LCAweEY3MzAsIDB4MzVGQSwgMHhGNzMxLAorICAgIDB4MzVGQiwgMHhGNzMyLCAweDM1RkMsIDB4RjczMywgMHgzNUZELCAweEY3MzQsIDB4MzVGRSwgMHhGNzM1LCAweDM1RkYsCisgICAgMHhGNzM2LCAweDM2MDAsIDB4RjczNywgMHgzNjAxLCAweEY3MzgsIDB4MzYwMiwgMHhGNzM5LCAweDM2MDMsIDB4RjczQSwKKyAgICAweDM2MDQsIDB4RjczQiwgMHgzNjA1LCAweEY3M0MsIDB4MzYwNiwgMHhGNzNELCAweDM2MDcsIDB4RjczRSwgMHgzNjA4LAorICAgIDB4RjczRiwgMHgzNjA5LCAweEY3NDAsIDB4MzYwQSwgMHhGNzQxLCAweDM2MEIsIDB4Rjc0MiwgMHgzNjBDLCAweEY3NDMsCisgICAgMHgzNjBELCAweEY3NDQsIDB4MzYwRSwgMHhGNzQ1LCAweDM2MEYsIDB4Rjc0NiwgMHgzNjEwLCAweEY3NDcsIDB4MzYxMSwKKyAgICAweEY3NDgsIDB4MzYxMiwgMHhGNzQ5LCAweDM2MTMsIDB4Rjc0QSwgMHgzNjE0LCAweEY3NEIsIDB4MzYxNSwgMHhGNzRDLAorICAgIDB4MzYxNiwgMHhGNzRELCAweDM2MTcsIDB4Rjc0RSwgMHgzNjE4LCAweEY3NEYsIDB4MzYxOSwgMHhGNzUwLCAweDM2MUEsCisgICAgMHhGNzUxLCAweDM2MUIsIDB4Rjc1MiwgMHgzNjFDLCAweEY3NTMsIDB4MzYxRCwgMHhGNzU0LCAweDM2MUUsIDB4Rjc1NSwKKyAgICAweDM2MUYsIDB4Rjc1NiwgMHgzNjIwLCAweEY3NTcsIDB4MzYyMSwgMHhGNzU4LCAweDM2MjIsIDB4Rjc1OSwgMHgzNjIzLAorICAgIDB4Rjc1QSwgMHgzNjI0LCAweEY3NUIsIDB4MzYyNSwgMHhGNzVDLCAweDM2MjYsIDB4Rjc1RCwgMHgzNjI3LCAweEY3NUUsCisgICAgMHgzNjI4LCAweEY3NUYsIDB4MzYyOSwgMHhGNzYwLCAweDM2MkEsIDB4Rjc2MSwgMHgzNjJCLCAweEY3NjIsIDB4MzYyQywKKyAgICAweEY3NjMsIDB4MzYyRCwgMHhGNzY0LCAweDM2MkUsIDB4Rjc2NSwgMHgzNjJGLCAweEY3NjYsIDB4MzYzMCwgMHhGNzY3LAorICAgIDB4MzYzMSwgMHhGNzY4LCAweDM2MzIsIDB4Rjc2OSwgMHgzNjMzLCAweEY3NkEsIDB4MzYzNCwgMHhGNzZCLCAweDM2MzUsCisgICAgMHhGNzZDLCAweDM2MzYsIDB4Rjc2RCwgMHgzNjM3LCAweEY3NkUsIDB4MzYzOCwgMHhGNzZGLCAweDM2MzksIDB4Rjc3MCwKKyAgICAweDM2M0EsIDB4Rjc3MSwgMHgzNjNCLCAweEY3NzIsIDB4MzYzQywgMHhGNzczLCAweDM2M0QsIDB4Rjc3NCwgMHgzNjNFLAorICAgIDB4Rjc3NSwgMHgzNjNGLCAweEY3NzYsIDB4MzY0MCwgMHhGNzc3LCAweDM2NDEsIDB4Rjc3OCwgMHgzNjQyLCAweEY3NzksCisgICAgMHgzNjQzLCAweEY3N0EsIDB4MzY0NCwgMHhGNzdCLCAweDM2NDUsIDB4Rjc3QywgMHgzNjQ2LCAweEY3N0QsIDB4MzY0NywKKyAgICAweEY3N0UsIDB4MzY0OCwgMHhGNzdGLCAweDM2NDksIDB4Rjc4MCwgMHgzNjRBLCAweEY3ODEsIDB4MzY0QiwgMHhGNzgyLAorICAgIDB4MzY0QywgMHhGNzgzLCAweDM2NEQsIDB4Rjc4NCwgMHgzNjRFLCAweEY3ODUsIDB4MzY0RiwgMHhGNzg2LCAweDM2NTAsCisgICAgMHhGNzg3LCAweDM2NTEsIDB4Rjc4OCwgMHgzNjUyLCAweEY3ODksIDB4MzY1MywgMHhGNzhBLCAweDM2NTQsIDB4Rjc4QiwKKyAgICAweDM2NTUsIDB4Rjc4QywgMHgzNjU2LCAweEY3OEQsIDB4MzY1NywgMHhGNzhFLCAweDM2NTgsIDB4Rjc4RiwgMHgzNjU5LAorICAgIDB4Rjc5MCwgMHgzNjVBLCAweEY3OTEsIDB4MzY1QiwgMHhGNzkyLCAweDM2NUMsIDB4Rjc5MywgMHgzNjVELCAweEY3OTQsCisgICAgMHgzNjVFLCAweEY3OTUsIDB4MzY1RiwgMHhGNzk2LCAweDM2NjAsIDB4Rjc5NywgMHgzNjYxLCAweEY3OTgsIDB4MzY2MiwKKyAgICAweEY3OTksIDB4MzY2MywgMHhGNzlBLCAweDM2NjQsIDB4Rjc5QiwgMHgzNjY1LCAweEY3OUMsIDB4MzY2NiwgMHhGNzlELAorICAgIDB4MzY2NywgMHhGNzlFLCAweDM2NjgsIDB4Rjc5RiwgMHgzNjY5LCAweEY3QTAsIDB4MzY2QSwgMHhGN0ExLCAweDM2NkIsCisgICAgMHhGN0EyLCAweDM2NkMsIDB4RjdBMywgMHgzNjZELCAweEY3QTQsIDB4MzY2RSwgMHhGN0E1LCAweDM2NkYsIDB4RjdBNiwKKyAgICAweDM2NzAsIDB4RjdBNywgMHgzNjcxLCAweEY3QTgsIDB4MzY3MiwgMHhGN0E5LCAweDM2NzMsIDB4RjdBQSwgMHgzNjc0LAorICAgIDB4RjdBQiwgMHgzNjc1LCAweEY3QUMsIDB4MzY3NiwgMHhGN0FELCAweDM2NzcsIDB4RjdBRSwgMHgzNjc4LCAweEY3QUYsCisgICAgMHgzNjc5LCAweEY3QjAsIDB4MzY3QSwgMHhGN0IxLCAweDM2N0IsIDB4RjdCMiwgMHgzNjdDLCAweEY3QjMsIDB4MzY3RCwKKyAgICAweEY3QjQsIDB4MzY3RSwgMHhGN0I1LCAweDM2N0YsIDB4RjdCNiwgMHgzNjgwLCAweEY3QjcsIDB4MzY4MSwgMHhGN0I4LAorICAgIDB4MzY4MiwgMHhGN0I5LCAweDM2ODMsIDB4RjdCQSwgMHgzNjg0LCAweEY3QkIsIDB4MzY4NSwgMHhGN0JDLCAweDM2ODYsCisgICAgMHhGN0JELCAweDM2ODcsIDB4RjdCRSwgMHgzNjg4LCAweEY3QkYsIDB4MzY4OSwgMHhGN0MwLCAweDM2OEEsIDB4RjdDMSwKKyAgICAweDM2OEIsIDB4RjdDMiwgMHgzNjhDLCAweEY3QzMsIDB4MzY4RCwgMHhGN0M0LCAweDM2OEUsIDB4RjdDNSwgMHgzNjhGLAorICAgIDB4RjdDNiwgMHgzNjkwLCAweEY3QzcsIDB4MzY5MSwgMHhGN0M4LCAweDM2OTIsIDB4RjdDOSwgMHgzNjkzLCAweEY3Q0EsCisgICAgMHgzNjk0LCAweEY3Q0IsIDB4MzY5NSwgMHhGN0NDLCAweDM2OTYsIDB4RjdDRCwgMHgzNjk3LCAweEY3Q0UsIDB4MzY5OCwKKyAgICAweEY3Q0YsIDB4MzY5OSwgMHhGN0QwLCAweDM2OUEsIDB4RjdEMSwgMHgzNjlCLCAweEY3RDIsIDB4MzY5QywgMHhGN0QzLAorICAgIDB4MzY5RCwgMHhGN0Q0LCAweDM2OUUsIDB4RjdENSwgMHgzNjlGLCAweEY3RDYsIDB4MzZBMCwgMHhGN0Q3LCAweDM2QTEsCisgICAgMHhGN0Q4LCAweDM2QTIsIDB4RjdEOSwgMHgzNkEzLCAweEY3REEsIDB4MzZBNCwgMHhGN0RCLCAweDM2QTUsIDB4RjdEQywKKyAgICAweDM2QTYsIDB4RjdERCwgMHgzNkE3LCAweEY3REUsIDB4MzZBOCwgMHhGN0RGLCAweDM2QTksIDB4RjdFMCwgMHgzNkFBLAorICAgIDB4RjdFMSwgMHgzNkFCLCAweEY3RTIsIDB4MzZBQywgMHhGN0UzLCAweDM2QUQsIDB4RjdFNCwgMHgzNkFFLCAweEY3RTUsCisgICAgMHgzNkFGLCAweEY3RTYsIDB4MzZCMCwgMHhGN0U3LCAweDM2QjEsIDB4RjdFOCwgMHgzNkIyLCAweEY3RTksIDB4MzZCMywKKyAgICAweEY3RUEsIDB4MzZCNCwgMHhGN0VCLCAweDM2QjUsIDB4RjdFQywgMHgzNkI2LCAweEY3RUQsIDB4MzZCNywgMHhGN0VFLAorICAgIDB4MzZCOCwgMHhGODE3LCAweDM2RTEsIDB4RjgxOCwgMHgzNkUyLCAweEY4MTksIDB4MzZFMywgMHhGODFBLCAweDM2RTQsCisgICAgMHhGODFCLCAweDM2RTUsIDB4RjgxQywgMHgzNkU2LCAweEY4MUQsIDB4MzZFNywgMHhGQTBDLCAweDAyNzQsIDB4RkEwRCwKKyAgICAweDIzODEsIDB4RkUzMCwgMHgwMDZELCAweEZFMzEsIDB4MDA3QSwgMHhGRTMzLCAweDM1QUYsIDB4RkUzNCwgMHgzNUIxLAorICAgIDB4RkUzNSwgMHgwMDgyLCAweEZFMzYsIDB4MDA4MywgMHhGRTM3LCAweDAwODYsIDB4RkUzOCwgMHgwMDg3LCAweEZFMzksCisgICAgMHgwMDhBLCAweEZFM0EsIDB4MDA4QiwgMHhGRTNCLCAweDAwOEUsIDB4RkUzQywgMHgwMDhGLCAweEZFM0QsIDB4MDA5MiwKKyAgICAweEZFM0UsIDB4MDA5MywgMHhGRTNGLCAweDAwOTYsIDB4RkU0MCwgMHgwMDk3LCAweEZFNDEsIDB4MDA5QSwgMHhGRTQyLAorICAgIDB4MDA5QiwgMHhGRTQzLCAweDAwOUUsIDB4RkU0NCwgMHgwMDlGLCAweEZFNDksIDB4MDBDNywgMHhGRTRBLCAweDAwQzgsCisgICAgMHhGRTRCLCAweDAwQ0IsIDB4RkU0QywgMHgwMENDLCAweEZFNEQsIDB4MDBDOSwgMHhGRTRFLCAweDAwQ0EsIDB4RkU0RiwKKyAgICAweDM1QjIsIDB4RkU1MCwgMHgwMDcwLCAweEZFNTEsIDB4MDA3MSwgMHhGRTUyLCAweDAwNzIsIDB4RkU1NCwgMHgwMDc0LAorICAgIDB4RkU1NSwgMHgwMDc1LCAweEZFNTYsIDB4MDA3NiwgMHhGRTU3LCAweDAwNzcsIDB4RkU1OSwgMHgwMEEwLCAweEZFNUEsCisgICAgMHgwMEExLCAweEZFNUIsIDB4MDBBMiwgMHhGRTVDLCAweDAwQTMsIDB4RkU1RCwgMHgwMEE0LCAweEZFNUUsIDB4MDBBNSwKKyAgICAweEZFNUYsIDB4MDBDRCwgMHhGRTYwLCAweDAwQ0UsIDB4RkU2MSwgMHgwMENGLCAweEZFNjIsIDB4MDBERiwgMHhGRTYzLAorICAgIDB4MDBFMCwgMHhGRTY0LCAweDAwRTEsIDB4RkU2NSwgMHgwMEUyLCAweEZFNjYsIDB4MDBFMywgMHhGRTY4LCAweDAxMDIsCisgICAgMHhGRTY5LCAweDAxMEMsIDB4RkU2QSwgMHgwMTBELCAweEZFNkIsIDB4MDEwRSwgMHhGRjAxLCAweDAwNkMsIDB4RkYwMiwKKyAgICAweDM2RTQsIDB4RkYwMywgMHgwMEFFLCAweEZGMDQsIDB4MDEwMywgMHhGRjA1LCAweDAxMDgsIDB4RkYwNiwgMHgwMEFGLAorICAgIDB4RkYwNywgMHgzNkUzLCAweEZGMDgsIDB4MDA4MCwgMHhGRjA5LCAweDAwODEsIDB4RkYwQSwgMHgwMEIwLCAweEZGMEIsCisgICAgMHgwMEQwLCAweEZGMEMsIDB4MDA2NCwgMHhGRjBELCAweDAwRDEsIDB4RkYwRSwgMHgwMDY3LCAweEZGMEYsIDB4MDEwMSwKKyAgICAweEZGMTAsIDB4MDE0RCwgMHhGRjExLCAweDAxNEUsIDB4RkYxMiwgMHgwMTRGLCAweEZGMTMsIDB4MDE1MCwgMHhGRjE0LAorICAgIDB4MDE1MSwgMHhGRjE1LCAweDAxNTIsIDB4RkYxNiwgMHgwMTUzLCAweEZGMTcsIDB4MDE1NCwgMHhGRjE4LCAweDAxNTUsCisgICAgMHhGRjE5LCAweDAxNTYsIDB4RkYxQSwgMHgwMDZBLCAweEZGMUIsIDB4MDA2OSwgMHhGRjFDLCAweDAwRDYsIDB4RkYxRCwKKyAgICAweDAwRDgsIDB4RkYxRSwgMHgwMEQ3LCAweEZGMUYsIDB4MDA2QiwgMHhGRjIwLCAweDAxMDksIDB4RkYyMSwgMHgwMTZELAorICAgIDB4RkYyMiwgMHgwMTZFLCAweEZGMjMsIDB4MDE2RiwgMHhGRjI0LCAweDAxNzAsIDB4RkYyNSwgMHgwMTcxLCAweEZGMjYsCisgICAgMHgwMTcyLCAweEZGMjcsIDB4MDE3MywgMHhGRjI4LCAweDAxNzQsIDB4RkYyOSwgMHgwMTc1LCAweEZGMkEsIDB4MDE3NiwKKyAgICAweEZGMkIsIDB4MDE3NywgMHhGRjJDLCAweDAxNzgsIDB4RkYyRCwgMHgwMTc5LCAweEZGMkUsIDB4MDE3QSwgMHhGRjJGLAorICAgIDB4MDE3QiwgMHhGRjMwLCAweDAxN0MsIDB4RkYzMSwgMHgwMTdELCAweEZGMzIsIDB4MDE3RSwgMHhGRjMzLCAweDAxN0YsCisgICAgMHhGRjM0LCAweDAxODAsIDB4RkYzNSwgMHgwMTgxLCAweEZGMzYsIDB4MDE4MiwgMHhGRjM3LCAweDAxODMsIDB4RkYzOCwKKyAgICAweDAxODQsIDB4RkYzOSwgMHgwMTg1LCAweEZGM0EsIDB4MDE4NiwgMHhGRjNCLCAweDM1QkUsIDB4RkYzQywgMHgwMTAyLAorICAgIDB4RkYzRCwgMHgzNUJGLCAweEZGM0UsIDB4MzVCNCwgMHhGRjNGLCAweDAwQzUsIDB4RkY0MSwgMHgwMTg3LCAweEZGNDIsCisgICAgMHgwMTg4LCAweEZGNDMsIDB4MDE4OSwgMHhGRjQ0LCAweDAxOEEsIDB4RkY0NSwgMHgwMThCLCAweEZGNDYsIDB4MDE4QywKKyAgICAweEZGNDcsIDB4MDE4RCwgMHhGRjQ4LCAweDAxOEUsIDB4RkY0OSwgMHgwMThGLCAweEZGNEEsIDB4MDE5MCwgMHhGRjRCLAorICAgIDB4MDE5MSwgMHhGRjRDLCAweDAxOTIsIDB4RkY0RCwgMHgwMTkzLCAweEZGNEUsIDB4MDE5NCwgMHhGRjRGLCAweDAxOTUsCisgICAgMHhGRjUwLCAweDAxOTYsIDB4RkY1MSwgMHgwMTk3LCAweEZGNTIsIDB4MDE5OCwgMHhGRjUzLCAweDAxOTksIDB4RkY1NCwKKyAgICAweDAxOUEsIDB4RkY1NSwgMHgwMTlCLCAweEZGNTYsIDB4MDE5QywgMHhGRjU3LCAweDAxOUQsIDB4RkY1OCwgMHgwMTlFLAorICAgIDB4RkY1OSwgMHgwMTlGLCAweEZGNUEsIDB4MDFBMCwgMHhGRjVCLCAweDAwODQsIDB4RkY1QywgMHgwMDc4LCAweEZGNUQsCisgICAgMHgwMDg1LCAweEZGNUUsIDB4MDBFNCwgMHhGRjY0LCAweDAwNzEsIDB4RkZFMCwgMHgwMTA2LCAweEZGRTEsIDB4MDEwNywKKyAgICAweEZGRTIsIDB4MzZFMSwgMHhGRkUzLCAweDAwQzQsIDB4RkZFNCwgMHgzNkUyLCAweEZGRTUsIDB4MDEwNCwKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9jbWFwc19jbnMxLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL2NtYXBzX2NuczEuY3BwCmluZGV4IDVmYTVhNGIuLmUxMDU0MDIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL2NtYXBzX2NuczEuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9DTlMxL2NtYXBzX2NuczEuY3BwCkBAIC0xLDUwICsxLDU2IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZXNvdXJjZS5oIgotI2luY2x1ZGUgIi4uLy4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oIgotI2luY2x1ZGUgIi4uLy4uL2ZwZGZfZm9udC9mb250X2ludC5oIgotI2luY2x1ZGUgIi4uL2NtYXBfaW50LmgiCi1leHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9CNXBjX0hfMFtdOwotZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfQjVwY19WXzBbXTsKLWV4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0hLc2NzX0I1X0hfNVtdOwotZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfSEtzY3NfQjVfVl81W107Ci1leHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9FVGVuX0I1X0hfMFtdOwotZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfRVRlbl9CNV9WXzBbXTsKLWV4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0VUZW5tc19CNV9IXzBbXTsKLWV4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0VUZW5tc19CNV9WXzBbXTsKLWV4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0NOU19FVUNfSF8wW107Ci1leHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9DTlNfRVVDX0hfMF9EV29yZFtdOwotZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfQ05TX0VVQ19WXzBbXTsKLWV4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0NOU19FVUNfVl8wX0RXb3JkW107Ci1leHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9VbmlDTlNfVUNTMl9IXzNbXTsKLWV4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX1VuaUNOU19VQ1MyX1ZfM1tdOwotZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfVW5pQ05TX1VURjE2X0hfMFtdOwotZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfQ05TMUNJRDJVbmljb2RlXzVbXTsKLWNvbnN0IEZYQ01BUF9DTWFwIGdfRlhDTUFQX0NOUzFfY21hcHNbXSA9IHsKLSAgICB7ICJCNXBjLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0I1cGNfSF8wLCAyNDcsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwIH0sCi0gICAgeyAiQjVwYy1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9CNXBjX1ZfMCwgMTIsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMSB9LAotICAgIHsgIkhLc2NzLUI1LUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0hLc2NzX0I1X0hfNSwgMTIxMCwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDAgfSwKLSAgICB7ICJIS3Njcy1CNS1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9IS3Njc19CNV9WXzUsIDEzLCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTEgfSwKLSAgICB7ICJFVGVuLUI1LUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0VUZW5fQjVfSF8wLCAyNTQsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwIH0sCi0gICAgeyAiRVRlbi1CNS1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9FVGVuX0I1X1ZfMCwgMTMsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMSB9LAotICAgIHsgIkVUZW5tcy1CNS1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9FVGVubXNfQjVfSF8wLCAxLCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTIgfSwKLSAgICB7ICJFVGVubXMtQjUtViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfRVRlbm1zX0I1X1ZfMCwgMTgsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMSB9LAotICAgIHsgIkNOUy1FVUMtSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfQ05TX0VVQ19IXzAsIDE1NywgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9DTlNfRVVDX0hfMF9EV29yZCwgMjM4LCAwIH0sCi0gICAgeyAiQ05TLUVVQy1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9DTlNfRVVDX1ZfMCwgMTgwLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0NOU19FVUNfVl8wX0RXb3JkLCAyNjEsIDAgfSwKLSAgICB7ICJVbmlDTlMtVUNTMi1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9VbmlDTlNfVUNTMl9IXzMsIDE2NDE4LCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgMCB9LAotICAgIHsgIlVuaUNOUy1VQ1MyLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX1VuaUNOU19VQ1MyX1ZfMywgMTMsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMSB9LAotICAgIHsgIlVuaUNOUy1VVEYxNi1IIiwgRlhDTUFQX0NNYXA6OlNpbmdsZSwgZ19GWENNQVBfVW5pQ05TX1VURjE2X0hfMCwgMTQ1NTcsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwIH0sCi0gICAgeyAiVW5pQ05TLVVURjE2LVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX1VuaUNOU19VQ1MyX1ZfMywgMTMsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMSB9LAorI2luY2x1ZGUgImNtYXBzX2NuczEuaCIKKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZXNvdXJjZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIiAgLy8gRm9yIEZYX0FycmF5U2l6ZSgpLgorI2luY2x1ZGUgImNvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9jbWFwX2ludC5oIgorI2luY2x1ZGUgImNvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZvbnRfaW50LmgiCisKK3N0YXRpYyBjb25zdCBGWENNQVBfQ01hcCBnX0ZYQ01BUF9DTlMxX2NtYXBzW10gPSB7CisgICAgeyJCNXBjLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0I1cGNfSF8wLCAyNDcsIEZYQ01BUF9DTWFwOjpOb25lLAorICAgICBOVUxMLCAwLCAwfSwKKyAgICB7IkI1cGMtViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfQjVwY19WXzAsIDEyLCBGWENNQVBfQ01hcDo6Tm9uZSwKKyAgICAgTlVMTCwgMCwgLTF9LAorICAgIHsiSEtzY3MtQjUtSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfSEtzY3NfQjVfSF81LCAxMjEwLAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgMH0sCisgICAgeyJIS3Njcy1CNS1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9IS3Njc19CNV9WXzUsIDEzLAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTF9LAorICAgIHsiRVRlbi1CNS1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9FVGVuX0I1X0hfMCwgMjU0LAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgMH0sCisgICAgeyJFVGVuLUI1LVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0VUZW5fQjVfVl8wLCAxMywKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xfSwKKyAgICB7IkVUZW5tcy1CNS1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9FVGVubXNfQjVfSF8wLCAxLAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTJ9LAorICAgIHsiRVRlbm1zLUI1LVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0VUZW5tc19CNV9WXzAsIDE4LAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTF9LAorICAgIHsiQ05TLUVVQy1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9DTlNfRVVDX0hfMCwgMTU3LAorICAgICBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0NOU19FVUNfSF8wX0RXb3JkLCAyMzgsIDB9LAorICAgIHsiQ05TLUVVQy1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9DTlNfRVVDX1ZfMCwgMTgwLAorICAgICBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0NOU19FVUNfVl8wX0RXb3JkLCAyNjEsIDB9LAorICAgIHsiVW5pQ05TLVVDUzItSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfVW5pQ05TX1VDUzJfSF8zLCAxNjQxOCwKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDB9LAorICAgIHsiVW5pQ05TLVVDUzItViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfVW5pQ05TX1VDUzJfVl8zLCAxMywKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xfSwKKyAgICB7IlVuaUNOUy1VVEYxNi1IIiwgRlhDTUFQX0NNYXA6OlNpbmdsZSwgZ19GWENNQVBfVW5pQ05TX1VURjE2X0hfMCwgMTQ1NTcsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwfSwKKyAgICB7IlVuaUNOUy1VVEYxNi1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9VbmlDTlNfVUNTMl9WXzMsIDEzLAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTF9LAogfTsKLXZvaWQgQ1BERl9Nb2R1bGVNZ3I6OkxvYWRFbWJlZGRlZENOUzFDTWFwcygpCi17Ci0gICAgQ1BERl9Gb250R2xvYmFscyogcEZvbnRHbG9iYWxzID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCk7Ci0gICAgcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkQ2hhcnNldHNbQ0lEU0VUX0NOUzFdLm1fcE1hcExpc3QgPSBnX0ZYQ01BUF9DTlMxX2NtYXBzOwotICAgIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZENoYXJzZXRzW0NJRFNFVF9DTlMxXS5tX0NvdW50ID0gc2l6ZW9mIGdfRlhDTUFQX0NOUzFfY21hcHMgLyBzaXplb2YgKEZYQ01BUF9DTWFwKTsKLSAgICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRUb1VuaWNvZGVzW0NJRFNFVF9DTlMxXS5tX3BNYXAgPSBnX0ZYQ01BUF9DTlMxQ0lEMlVuaWNvZGVfNTsKLSAgICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRUb1VuaWNvZGVzW0NJRFNFVF9DTlMxXS5tX0NvdW50ID0gMTkwODg7CisKK3ZvaWQgQ1BERl9Nb2R1bGVNZ3I6OkxvYWRFbWJlZGRlZENOUzFDTWFwcygpIHsKKyAgQ1BERl9Gb250R2xvYmFscyogcEZvbnRHbG9iYWxzID0KKyAgICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRGb250R2xvYmFscygpOworICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRDaGFyc2V0c1tDSURTRVRfQ05TMV0ubV9wTWFwTGlzdCA9CisgICAgICBnX0ZYQ01BUF9DTlMxX2NtYXBzOworICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRDaGFyc2V0c1tDSURTRVRfQ05TMV0ubV9Db3VudCA9CisgICAgICBGWF9BcnJheVNpemUoZ19GWENNQVBfQ05TMV9jbWFwcyk7CisgIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbQ0lEU0VUX0NOUzFdLm1fcE1hcCA9CisgICAgICBnX0ZYQ01BUF9DTlMxQ0lEMlVuaWNvZGVfNTsKKyAgcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkVG9Vbmljb2Rlc1tDSURTRVRfQ05TMV0ubV9Db3VudCA9IDE5MDg4OwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvY21hcHNfY25zMS5oIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0NOUzEvY21hcHNfY25zMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZGQ4NWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvQ05TMS9jbWFwc19jbnMxLmgKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfU1JDX0ZQREZBUElfRlBERl9DTUFQU19DTlMxX0NNQVBTX0NOUzFfSF8KKyNkZWZpbmUgQ09SRV9TUkNfRlBERkFQSV9GUERGX0NNQVBTX0NOUzFfQ01BUFNfQ05TMV9IXworCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oIiAgLy8gRm9yIEZYX1dPUkQuCisKK2V4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0I1cGNfSF8wW107CitleHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9CNXBjX1ZfMFtdOworZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfSEtzY3NfQjVfSF81W107CitleHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9IS3Njc19CNV9WXzVbXTsKK2V4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0VUZW5fQjVfSF8wW107CitleHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9FVGVuX0I1X1ZfMFtdOworZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfRVRlbm1zX0I1X0hfMFtdOworZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfRVRlbm1zX0I1X1ZfMFtdOworZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfQ05TX0VVQ19IXzBbXTsKK2V4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0NOU19FVUNfSF8wX0RXb3JkW107CitleHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9DTlNfRVVDX1ZfMFtdOworZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfQ05TX0VVQ19WXzBfRFdvcmRbXTsKK2V4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX1VuaUNOU19VQ1MyX0hfM1tdOworZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfVW5pQ05TX1VDUzJfVl8zW107CitleHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9VbmlDTlNfVVRGMTZfSF8wW107CitleHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9DTlMxQ0lEMlVuaWNvZGVfNVtdOworCisjZW5kaWYgIC8vIENPUkVfU1JDX0ZQREZBUElfRlBERl9DTUFQU19DTlMxX0NNQVBTX0NOUzFfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvQWRvYmUtR0IxLVVDUzJfNS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL0Fkb2JlLUdCMS1VQ1MyXzUuY3BwCmluZGV4IGY3NWU2NmUuLmMzZDY3ZWEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvQWRvYmUtR0IxLVVDUzJfNS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9BZG9iZS1HQjEtVUNTMl81LmNwcApAQCAtMSwzNzk0ICsxLDMzNzUgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0IGdfRlhDTUFQX0dCMUNJRDJVbmljb2RlXzVbMzAyODRdID0gewotICAgIDB4RkZGRCwgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LAotICAgIDB4MDAyNywgMHgwMDI4LCAweDAwMjksIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLAotICAgIDB4MDAyRiwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LAotICAgIDB4MDAzNywgMHgwMDM4LCAweDAwMzksIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLAotICAgIDB4MDAzRiwgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LAotICAgIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLAotICAgIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LAotICAgIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgwMDVCLCAweDAwNUMsIDB4MDA1RCwgMHgwMDVFLAotICAgIDB4MDA1RiwgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LAotICAgIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLAotICAgIDB4MDA2RiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LAotICAgIDB4MDA3NywgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDdCLCAweDAwN0MsIDB4MDA3RCwgMHgwMDdFLAotICAgIDB4MzAwMCwgMHgzMDAxLCAweDMwMDIsIDB4MDBCNywgMHgwMkM5LCAweDAyQzcsIDB4MDBBOCwgMHgzMDAzLAotICAgIDB4MzAwNSwgMHgyMDE0LCAweEZGNUUsIDB4MjAxNiwgMHgyMDI2LCAweDIwMTgsIDB4MjAxOSwgMHgyMDFDLAotICAgIDB4MjAxRCwgMHgzMDE0LCAweDMwMTUsIDB4MzAwOCwgMHgzMDA5LCAweDMwMEEsIDB4MzAwQiwgMHgzMDBDLAotICAgIDB4MzAwRCwgMHgzMDBFLCAweDMwMEYsIDB4MzAxNiwgMHgzMDE3LCAweDMwMTAsIDB4MzAxMSwgMHgwMEIxLAotICAgIDB4MDBENywgMHgwMEY3LCAweDIyMzYsIDB4MjIyNywgMHgyMjI4LCAweDIyMTEsIDB4MjIwRiwgMHgyMjJBLAotICAgIDB4MjIyOSwgMHgyMjA4LCAweDIyMzcsIDB4MjIxQSwgMHgyMkE1LCAweDIyMjUsIDB4MjIyMCwgMHgyMzEyLAotICAgIDB4MjI5OSwgMHgyMjJCLCAweDIyMkUsIDB4MjI2MSwgMHgyMjRDLCAweDIyNDgsIDB4MjIzRCwgMHgyMjFELAotICAgIDB4MjI2MCwgMHgyMjZFLCAweDIyNkYsIDB4MjI2NCwgMHgyMjY1LCAweDIyMUUsIDB4MjIzNSwgMHgyMjM0LAotICAgIDB4MjY0MiwgMHgyNjQwLCAweDAwQjAsIDB4MjAzMiwgMHgyMDMzLCAweDIxMDMsIDB4RkYwNCwgMHgwMEE0LAotICAgIDB4RkZFMCwgMHhGRkUxLCAweDIwMzAsIDB4MDBBNywgMHgyMTE2LCAweDI2MDYsIDB4MjYwNSwgMHgyNUNCLAotICAgIDB4MjVDRiwgMHgyNUNFLCAweDI1QzcsIDB4MjVDNiwgMHgyNUExLCAweDI1QTAsIDB4MjVCMywgMHgyNUIyLAotICAgIDB4MjAzQiwgMHgyMTkyLCAweDIxOTAsIDB4MjE5MSwgMHgyMTkzLCAweDMwMTMsIDB4MjQ4OCwgMHgyNDg5LAotICAgIDB4MjQ4QSwgMHgyNDhCLCAweDI0OEMsIDB4MjQ4RCwgMHgyNDhFLCAweDI0OEYsIDB4MjQ5MCwgMHgyNDkxLAotICAgIDB4MjQ5MiwgMHgyNDkzLCAweDI0OTQsIDB4MjQ5NSwgMHgyNDk2LCAweDI0OTcsIDB4MjQ5OCwgMHgyNDk5LAotICAgIDB4MjQ5QSwgMHgyNDlCLCAweDI0NzQsIDB4MjQ3NSwgMHgyNDc2LCAweDI0NzcsIDB4MjQ3OCwgMHgyNDc5LAotICAgIDB4MjQ3QSwgMHgyNDdCLCAweDI0N0MsIDB4MjQ3RCwgMHgyNDdFLCAweDI0N0YsIDB4MjQ4MCwgMHgyNDgxLAotICAgIDB4MjQ4MiwgMHgyNDgzLCAweDI0ODQsIDB4MjQ4NSwgMHgyNDg2LCAweDI0ODcsIDB4MjQ2MCwgMHgyNDYxLAotICAgIDB4MjQ2MiwgMHgyNDYzLCAweDI0NjQsIDB4MjQ2NSwgMHgyNDY2LCAweDI0NjcsIDB4MjQ2OCwgMHgyNDY5LAotICAgIDB4MzIyMCwgMHgzMjIxLCAweDMyMjIsIDB4MzIyMywgMHgzMjI0LCAweDMyMjUsIDB4MzIyNiwgMHgzMjI3LAotICAgIDB4MzIyOCwgMHgzMjI5LCAweDIxNjAsIDB4MjE2MSwgMHgyMTYyLCAweDIxNjMsIDB4MjE2NCwgMHgyMTY1LAotICAgIDB4MjE2NiwgMHgyMTY3LCAweDIxNjgsIDB4MjE2OSwgMHgyMTZBLCAweDIxNkIsIDB4RkYwMSwgMHhGRjAyLAotICAgIDB4RkYwMywgMHhGRkU1LCAweEZGMDUsIDB4RkYwNiwgMHhGRjA3LCAweEZGMDgsIDB4RkYwOSwgMHhGRjBBLAotICAgIDB4RkYwQiwgMHhGRjBDLCAweEZGMEQsIDB4RkYwRSwgMHhGRjBGLCAweEZGMTAsIDB4RkYxMSwgMHhGRjEyLAotICAgIDB4RkYxMywgMHhGRjE0LCAweEZGMTUsIDB4RkYxNiwgMHhGRjE3LCAweEZGMTgsIDB4RkYxOSwgMHhGRjFBLAotICAgIDB4RkYxQiwgMHhGRjFDLCAweEZGMUQsIDB4RkYxRSwgMHhGRjFGLCAweEZGMjAsIDB4RkYyMSwgMHhGRjIyLAotICAgIDB4RkYyMywgMHhGRjI0LCAweEZGMjUsIDB4RkYyNiwgMHhGRjI3LCAweEZGMjgsIDB4RkYyOSwgMHhGRjJBLAotICAgIDB4RkYyQiwgMHhGRjJDLCAweEZGMkQsIDB4RkYyRSwgMHhGRjJGLCAweEZGMzAsIDB4RkYzMSwgMHhGRjMyLAotICAgIDB4RkYzMywgMHhGRjM0LCAweEZGMzUsIDB4RkYzNiwgMHhGRjM3LCAweEZGMzgsIDB4RkYzOSwgMHhGRjNBLAotICAgIDB4RkYzQiwgMHhGRjNDLCAweEZGM0QsIDB4RkYzRSwgMHhGRjNGLCAweEZGNDAsIDB4RkY0MSwgMHhGRjQyLAotICAgIDB4RkY0MywgMHhGRjQ0LCAweEZGNDUsIDB4RkY0NiwgMHhGRjQ3LCAweEZGNDgsIDB4RkY0OSwgMHhGRjRBLAotICAgIDB4RkY0QiwgMHhGRjRDLCAweEZGNEQsIDB4RkY0RSwgMHhGRjRGLCAweEZGNTAsIDB4RkY1MSwgMHhGRjUyLAotICAgIDB4RkY1MywgMHhGRjU0LCAweEZGNTUsIDB4RkY1NiwgMHhGRjU3LCAweEZGNTgsIDB4RkY1OSwgMHhGRjVBLAotICAgIDB4RkY1QiwgMHhGRjVDLCAweEZGNUQsIDB4RkZFMywgMHgzMDQxLCAweDMwNDIsIDB4MzA0MywgMHgzMDQ0LAotICAgIDB4MzA0NSwgMHgzMDQ2LCAweDMwNDcsIDB4MzA0OCwgMHgzMDQ5LCAweDMwNEEsIDB4MzA0QiwgMHgzMDRDLAotICAgIDB4MzA0RCwgMHgzMDRFLCAweDMwNEYsIDB4MzA1MCwgMHgzMDUxLCAweDMwNTIsIDB4MzA1MywgMHgzMDU0LAotICAgIDB4MzA1NSwgMHgzMDU2LCAweDMwNTcsIDB4MzA1OCwgMHgzMDU5LCAweDMwNUEsIDB4MzA1QiwgMHgzMDVDLAotICAgIDB4MzA1RCwgMHgzMDVFLCAweDMwNUYsIDB4MzA2MCwgMHgzMDYxLCAweDMwNjIsIDB4MzA2MywgMHgzMDY0LAotICAgIDB4MzA2NSwgMHgzMDY2LCAweDMwNjcsIDB4MzA2OCwgMHgzMDY5LCAweDMwNkEsIDB4MzA2QiwgMHgzMDZDLAotICAgIDB4MzA2RCwgMHgzMDZFLCAweDMwNkYsIDB4MzA3MCwgMHgzMDcxLCAweDMwNzIsIDB4MzA3MywgMHgzMDc0LAotICAgIDB4MzA3NSwgMHgzMDc2LCAweDMwNzcsIDB4MzA3OCwgMHgzMDc5LCAweDMwN0EsIDB4MzA3QiwgMHgzMDdDLAotICAgIDB4MzA3RCwgMHgzMDdFLCAweDMwN0YsIDB4MzA4MCwgMHgzMDgxLCAweDMwODIsIDB4MzA4MywgMHgzMDg0LAotICAgIDB4MzA4NSwgMHgzMDg2LCAweDMwODcsIDB4MzA4OCwgMHgzMDg5LCAweDMwOEEsIDB4MzA4QiwgMHgzMDhDLAotICAgIDB4MzA4RCwgMHgzMDhFLCAweDMwOEYsIDB4MzA5MCwgMHgzMDkxLCAweDMwOTIsIDB4MzA5MywgMHgzMEExLAotICAgIDB4MzBBMiwgMHgzMEEzLCAweDMwQTQsIDB4MzBBNSwgMHgzMEE2LCAweDMwQTcsIDB4MzBBOCwgMHgzMEE5LAotICAgIDB4MzBBQSwgMHgzMEFCLCAweDMwQUMsIDB4MzBBRCwgMHgzMEFFLCAweDMwQUYsIDB4MzBCMCwgMHgzMEIxLAotICAgIDB4MzBCMiwgMHgzMEIzLCAweDMwQjQsIDB4MzBCNSwgMHgzMEI2LCAweDMwQjcsIDB4MzBCOCwgMHgzMEI5LAotICAgIDB4MzBCQSwgMHgzMEJCLCAweDMwQkMsIDB4MzBCRCwgMHgzMEJFLCAweDMwQkYsIDB4MzBDMCwgMHgzMEMxLAotICAgIDB4MzBDMiwgMHgzMEMzLCAweDMwQzQsIDB4MzBDNSwgMHgzMEM2LCAweDMwQzcsIDB4MzBDOCwgMHgzMEM5LAotICAgIDB4MzBDQSwgMHgzMENCLCAweDMwQ0MsIDB4MzBDRCwgMHgzMENFLCAweDMwQ0YsIDB4MzBEMCwgMHgzMEQxLAotICAgIDB4MzBEMiwgMHgzMEQzLCAweDMwRDQsIDB4MzBENSwgMHgzMEQ2LCAweDMwRDcsIDB4MzBEOCwgMHgzMEQ5LAotICAgIDB4MzBEQSwgMHgzMERCLCAweDMwREMsIDB4MzBERCwgMHgzMERFLCAweDMwREYsIDB4MzBFMCwgMHgzMEUxLAotICAgIDB4MzBFMiwgMHgzMEUzLCAweDMwRTQsIDB4MzBFNSwgMHgzMEU2LCAweDMwRTcsIDB4MzBFOCwgMHgzMEU5LAotICAgIDB4MzBFQSwgMHgzMEVCLCAweDMwRUMsIDB4MzBFRCwgMHgzMEVFLCAweDMwRUYsIDB4MzBGMCwgMHgzMEYxLAotICAgIDB4MzBGMiwgMHgzMEYzLCAweDMwRjQsIDB4MzBGNSwgMHgzMEY2LCAweDAzOTEsIDB4MDM5MiwgMHgwMzkzLAotICAgIDB4MDM5NCwgMHgwMzk1LCAweDAzOTYsIDB4MDM5NywgMHgwMzk4LCAweDAzOTksIDB4MDM5QSwgMHgwMzlCLAotICAgIDB4MDM5QywgMHgwMzlELCAweDAzOUUsIDB4MDM5RiwgMHgwM0EwLCAweDAzQTEsIDB4MDNBMywgMHgwM0E0LAotICAgIDB4MDNBNSwgMHgwM0E2LCAweDAzQTcsIDB4MDNBOCwgMHgwM0E5LCAweDAzQjEsIDB4MDNCMiwgMHgwM0IzLAotICAgIDB4MDNCNCwgMHgwM0I1LCAweDAzQjYsIDB4MDNCNywgMHgwM0I4LCAweDAzQjksIDB4MDNCQSwgMHgwM0JCLAotICAgIDB4MDNCQywgMHgwM0JELCAweDAzQkUsIDB4MDNCRiwgMHgwM0MwLCAweDAzQzEsIDB4MDNDMywgMHgwM0M0LAotICAgIDB4MDNDNSwgMHgwM0M2LCAweDAzQzcsIDB4MDNDOCwgMHgwM0M5LCAweEZGMEMsIDB4MzAwMiwgMHgzMDAxLAotICAgIDB4RkYxQSwgMHhGRjFCLCAweEZGMDEsIDB4RkYxRiwgMHhGRTM1LCAweEZFMzYsIDB4RkUzOSwgMHhGRTNBLAotICAgIDB4RkUzRiwgMHhGRTQwLCAweEZFM0QsIDB4RkUzRSwgMHhGRTQxLCAweEZFNDIsIDB4RkU0MywgMHhGRTQ0LAotICAgIDB4MzAxNiwgMHgzMDE3LCAweEZFM0IsIDB4RkUzQywgMHhGRTM3LCAweEZFMzgsIDB4RkUzMSwgMHgyMDI2LAotICAgIDB4RkUzMywgMHhGRTM0LCAweDA0MTAsIDB4MDQxMSwgMHgwNDEyLCAweDA0MTMsIDB4MDQxNCwgMHgwNDE1LAotICAgIDB4MDQwMSwgMHgwNDE2LCAweDA0MTcsIDB4MDQxOCwgMHgwNDE5LCAweDA0MUEsIDB4MDQxQiwgMHgwNDFDLAotICAgIDB4MDQxRCwgMHgwNDFFLCAweDA0MUYsIDB4MDQyMCwgMHgwNDIxLCAweDA0MjIsIDB4MDQyMywgMHgwNDI0LAotICAgIDB4MDQyNSwgMHgwNDI2LCAweDA0MjcsIDB4MDQyOCwgMHgwNDI5LCAweDA0MkEsIDB4MDQyQiwgMHgwNDJDLAotICAgIDB4MDQyRCwgMHgwNDJFLCAweDA0MkYsIDB4MDQzMCwgMHgwNDMxLCAweDA0MzIsIDB4MDQzMywgMHgwNDM0LAotICAgIDB4MDQzNSwgMHgwNDUxLCAweDA0MzYsIDB4MDQzNywgMHgwNDM4LCAweDA0MzksIDB4MDQzQSwgMHgwNDNCLAotICAgIDB4MDQzQywgMHgwNDNELCAweDA0M0UsIDB4MDQzRiwgMHgwNDQwLCAweDA0NDEsIDB4MDQ0MiwgMHgwNDQzLAotICAgIDB4MDQ0NCwgMHgwNDQ1LCAweDA0NDYsIDB4MDQ0NywgMHgwNDQ4LCAweDA0NDksIDB4MDQ0QSwgMHgwNDRCLAotICAgIDB4MDQ0QywgMHgwNDRELCAweDA0NEUsIDB4MDQ0RiwgMHgwMTAxLCAweDAwRTEsIDB4MDFDRSwgMHgwMEUwLAotICAgIDB4MDExMywgMHgwMEU5LCAweDAxMUIsIDB4MDBFOCwgMHgwMTJCLCAweDAwRUQsIDB4MDFEMCwgMHgwMEVDLAotICAgIDB4MDE0RCwgMHgwMEYzLCAweDAxRDIsIDB4MDBGMiwgMHgwMTZCLCAweDAwRkEsIDB4MDFENCwgMHgwMEY5LAotICAgIDB4MDFENiwgMHgwMUQ4LCAweDAxREEsIDB4MDFEQywgMHgwMEZDLCAweDAwRUEsIDB4MDI1MSwgMHgxRTNGLAotICAgIDB4MDE0NCwgMHgwMTQ4LCAweDAxRjksIDB4MDI2MSwgMHgzMTA1LCAweDMxMDYsIDB4MzEwNywgMHgzMTA4LAotICAgIDB4MzEwOSwgMHgzMTBBLCAweDMxMEIsIDB4MzEwQywgMHgzMTBELCAweDMxMEUsIDB4MzEwRiwgMHgzMTEwLAotICAgIDB4MzExMSwgMHgzMTEyLCAweDMxMTMsIDB4MzExNCwgMHgzMTE1LCAweDMxMTYsIDB4MzExNywgMHgzMTE4LAotICAgIDB4MzExOSwgMHgzMTFBLCAweDMxMUIsIDB4MzExQywgMHgzMTFELCAweDMxMUUsIDB4MzExRiwgMHgzMTIwLAotICAgIDB4MzEyMSwgMHgzMTIyLCAweDMxMjMsIDB4MzEyNCwgMHgzMTI1LCAweDMxMjYsIDB4MzEyNywgMHgzMTI4LAotICAgIDB4MzEyOSwgMHhFN0NELCAweDI1MDAsIDB4MjUwMSwgMHgyNTAyLCAweDI1MDMsIDB4MjUwNCwgMHgyNTA1LAotICAgIDB4MjUwNiwgMHgyNTA3LCAweDI1MDgsIDB4MjUwOSwgMHgyNTBBLCAweDI1MEIsIDB4MjUwQywgMHgyNTBELAotICAgIDB4MjUwRSwgMHgyNTBGLCAweDI1MTAsIDB4MjUxMSwgMHgyNTEyLCAweDI1MTMsIDB4MjUxNCwgMHgyNTE1LAotICAgIDB4MjUxNiwgMHgyNTE3LCAweDI1MTgsIDB4MjUxOSwgMHgyNTFBLCAweDI1MUIsIDB4MjUxQywgMHgyNTFELAotICAgIDB4MjUxRSwgMHgyNTFGLCAweDI1MjAsIDB4MjUyMSwgMHgyNTIyLCAweDI1MjMsIDB4MjUyNCwgMHgyNTI1LAotICAgIDB4MjUyNiwgMHgyNTI3LCAweDI1MjgsIDB4MjUyOSwgMHgyNTJBLCAweDI1MkIsIDB4MjUyQywgMHgyNTJELAotICAgIDB4MjUyRSwgMHgyNTJGLCAweDI1MzAsIDB4MjUzMSwgMHgyNTMyLCAweDI1MzMsIDB4MjUzNCwgMHgyNTM1LAotICAgIDB4MjUzNiwgMHgyNTM3LCAweDI1MzgsIDB4MjUzOSwgMHgyNTNBLCAweDI1M0IsIDB4MjUzQywgMHgyNTNELAotICAgIDB4MjUzRSwgMHgyNTNGLCAweDI1NDAsIDB4MjU0MSwgMHgyNTQyLCAweDI1NDMsIDB4MjU0NCwgMHgyNTQ1LAotICAgIDB4MjU0NiwgMHgyNTQ3LCAweDI1NDgsIDB4MjU0OSwgMHgyNTRBLCAweDI1NEIsIDB4MDAyMSwgMHgwMDIyLAotICAgIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LCAweDAwMjgsIDB4MDAyOSwgMHgwMDJBLAotICAgIDB4MDAyQiwgMHgwMDJDLCAweDAwMkQsIDB4MDAyRSwgMHgwMDJGLCAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLAotICAgIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgwMDNBLAotICAgIDB4MDAzQiwgMHgwMDNDLCAweDAwM0QsIDB4MDAzRSwgMHgwMDNGLCAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLAotICAgIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LCAweDAwNDgsIDB4MDA0OSwgMHgwMDRBLAotICAgIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLCAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLAotICAgIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwgMHgwMDVBLAotICAgIDB4MDA1QiwgMHgwMDVDLCAweDAwNUQsIDB4MDA1RSwgMHgwMDVGLCAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLAotICAgIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZBLAotICAgIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsIDB4MDA2RSwgMHgwMDZGLCAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLAotICAgIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LCAweDAwNzgsIDB4MDA3OSwgMHgwMDdBLAotICAgIDB4MDA3QiwgMHgwMDdDLCAweDAwN0QsIDB4MDA3RSwgMHgwMTAxLCAweDAwRTEsIDB4MDFDRSwgMHgwMEUwLAotICAgIDB4MDExMywgMHgwMEU5LCAweDAxMUIsIDB4MDBFOCwgMHgwMTJCLCAweDAwRUQsIDB4MDFEMCwgMHgwMEVDLAotICAgIDB4MDE0RCwgMHgwMEYzLCAweDAxRDIsIDB4MDBGMiwgMHgwMTZCLCAweDAwRkEsIDB4MDFENCwgMHgwMEY5LAotICAgIDB4MDFENiwgMHgwMUQ4LCAweDAxREEsIDB4MDFEQywgMHgwMEZDLCAweDAwRUEsIDB4MDI1MSwgMHgxRTNGLAotICAgIDB4MDE0NCwgMHgwMTQ4LCAweDAxRjksIDB4MDI2MSwgMHg1NTRBLCAweDk2M0YsIDB4NTdDMywgMHg2MzI4LAotICAgIDB4NTRDRSwgMHg1NTA5LCAweDU0QzAsIDB4NzY5MSwgMHg3NjRDLCAweDg1M0MsIDB4NzdFRSwgMHg4MjdFLAotICAgIDB4Nzg4RCwgMHg3MjMxLCAweDk2OTgsIDB4OTc4RCwgMHg2QzI4LCAweDVCODksIDB4NEZGQSwgMHg2MzA5LAotICAgIDB4NjY5NywgMHg1Q0I4LCAweDgwRkEsIDB4Njg0OCwgMHg4MEFFLCAweDY2MDIsIDB4NzZDRSwgMHg1MUY5LAotICAgIDB4NjU1NiwgMHg3MUFDLCAweDdGRjEsIDB4ODg4NCwgMHg1MEIyLCAweDU5NjUsIDB4NjFDQSwgMHg2RkIzLAotICAgIDB4ODJBRCwgMHg2MzRDLCAweDYyNTIsIDB4NTNFRCwgMHg1NDI3LCAweDdCMDYsIDB4NTE2QiwgMHg3NUE0LAotICAgIDB4NURGNCwgMHg2MkQ0LCAweDhEQ0IsIDB4OTc3NiwgMHg2MjhBLCAweDgwMTksIDB4NTc1RCwgMHg5NzM4LAotICAgIDB4N0Y2MiwgMHg3MjM4LCAweDc2N0QsIDB4NjdDRiwgMHg3NjdFLCAweDY0NDYsIDB4NEY3MCwgMHg4RDI1LAotICAgIDB4NjJEQywgMHg3QTE3LCAweDY1OTEsIDB4NzNFRCwgMHg2NDJDLCAweDYyNzMsIDB4ODIyQywgMHg5ODgxLAotICAgIDB4Njc3RiwgMHg3MjQ4LCAweDYyNkUsIDB4NjJDQywgMHg0RjM0LCAweDc0RTMsIDB4NTM0QSwgMHg1MjlFLAotICAgIDB4N0VDQSwgMHg5MEE2LCAweDVFMkUsIDB4Njg4NiwgMHg2OTlDLCAweDgxODAsIDB4N0VEMSwgMHg2OEQyLAotICAgIDB4NzhDNSwgMHg4NjhDLCAweDk1NTEsIDB4NTA4RCwgMHg4QzI0LCAweDgyREUsIDB4ODBERSwgMHg1MzA1LAotICAgIDB4ODkxMiwgMHg1MjY1LCAweDg1ODQsIDB4OTZGOSwgMHg0RkRELCAweDU4MjEsIDB4OTk3MSwgMHg1QjlELAotICAgIDB4NjJCMSwgMHg2MkE1LCAweDY2QjQsIDB4OEM3OSwgMHg5QzhELCAweDcyMDYsIDB4Njc2RiwgMHg3ODkxLAotICAgIDB4NjBCMiwgMHg1MzUxLCAweDUzMTcsIDB4OEY4OCwgMHg4MENDLCAweDhEMUQsIDB4OTRBMSwgMHg1MDBELAotICAgIDB4NzJDOCwgMHg1OTA3LCAweDYwRUIsIDB4NzExOSwgMHg4OEFCLCAweDU5NTQsIDB4ODJFRiwgMHg2NzJDLAotICAgIDB4N0IyOCwgMHg1RDI5LCAweDdFRjcsIDB4NzUyRCwgMHg2Q0Y1LCAweDhFNjYsIDB4OEZGOCwgMHg5MDNDLAotICAgIDB4OUYzQiwgMHg2QkQ0LCAweDkxMTksIDB4N0IxNCwgMHg1RjdDLCAweDc4QTcsIDB4ODRENiwgMHg4NTNELAotICAgIDB4NkJENSwgMHg2QkQ5LCAweDZCRDYsIDB4NUUwMSwgMHg1RTg3LCAweDc1RjksIDB4OTVFRCwgMHg2NTVELAotICAgIDB4NUYwQSwgMHg1RkM1LCAweDhGOUYsIDB4NThDMSwgMHg4MUMyLCAweDkwN0YsIDB4OTY1QiwgMHg5N0FELAotICAgIDB4OEZCOSwgMHg3RjE2LCAweDhEMkMsIDB4NjI0MSwgMHg0RkJGLCAweDUzRDgsIDB4NTM1RSwgMHg4RkE4LAotICAgIDB4OEZBOSwgMHg4RkFCLCAweDkwNEQsIDB4NjgwNywgMHg1RjZBLCAweDgxOTgsIDB4ODg2OCwgMHg5Q0Q2LAotICAgIDB4NjE4QiwgMHg1MjJCLCAweDc2MkEsIDB4NUY2QywgMHg2NThDLCAweDZGRDIsIDB4NkVFOCwgMHg1QkJFLAotICAgIDB4NjQ0OCwgMHg1MTc1LCAweDUxQjAsIDB4NjdDNCwgMHg0RTE5LCAweDc5QzksIDB4OTk3QywgMHg3MEIzLAotICAgIDB4NzVDNSwgMHg1RTc2LCAweDczQkIsIDB4ODNFMCwgMHg2NEFELCAweDYyRTgsIDB4OTRCNSwgMHg2Q0UyLAotICAgIDB4NTM1QSwgMHg1MkMzLCAweDY0MEYsIDB4OTRDMiwgMHg3Qjk0LCAweDRGMkYsIDB4NUUxQiwgMHg4MjM2LAotICAgIDB4ODExNiwgMHg4MThBLCAweDZFMjQsIDB4NkNDQSwgMHg5QTczLCAweDYzNTUsIDB4NTM1QywgMHg1NEZBLAotICAgIDB4ODg2NSwgMHg1N0UwLCAweDRFMEQsIDB4NUUwMywgMHg2QjY1LCAweDdDM0YsIDB4OTBFOCwgMHg2MDE2LAotICAgIDB4NjRFNiwgMHg3MzFDLCAweDg4QzEsIDB4Njc1MCwgMHg2MjRELCAweDhEMjIsIDB4Nzc2QywgMHg4RTI5LAotICAgIDB4OTFDNywgMHg1RjY5LCAweDgzREMsIDB4ODUyMSwgMHg5OTEwLCAweDUzQzIsIDB4ODY5NSwgMHg2QjhCLAotICAgIDB4NjBFRCwgMHg2MEU4LCAweDcwN0YsIDB4ODJDRCwgMHg4MjMxLCAweDRFRDMsIDB4NkNBNywgMHg4NUNGLAotICAgIDB4NjRDRCwgMHg3Q0Q5LCAweDY5RkQsIDB4NjZGOSwgMHg4MzQ5LCAweDUzOTUsIDB4N0I1NiwgMHg0RkE3LAotICAgIDB4NTE4QywgMHg2RDRCLCAweDVDNDIsIDB4OEU2RCwgMHg2M0QyLCAweDUzQzksIDB4ODMyQywgMHg4MzM2LAotICAgIDB4NjdFNSwgMHg3OEI0LCAweDY0M0QsIDB4NUJERiwgMHg1Qzk0LCAweDVERUUsIDB4OEJFNywgMHg2MkM2LAotICAgIDB4NjdGNCwgMHg4QzdBLCAweDY0MDAsIDB4NjNCQSwgMHg4NzQ5LCAweDk5OEIsIDB4OEMxNywgMHg3RjIwLAotICAgIDB4OTRGMiwgMHg0RUE3LCAweDk2MTAsIDB4OThBNCwgMHg2NjBDLCAweDczMTYsIDB4NTczQSwgMHg1QzFELAotICAgIDB4NUUzOCwgMHg5NTdGLCAweDUwN0YsIDB4ODBBMCwgMHg1MzgyLCAweDY1NUUsIDB4NzU0NSwgMHg1NTMxLAotICAgIDB4NTAyMSwgMHg4RDg1LCAweDYyODQsIDB4OTQ5RSwgMHg2NzFELCAweDU2MzIsIDB4NkY2RSwgMHg1REUyLAotICAgIDB4NTQzNSwgMHg3MDkyLCAweDhGNjYsIDB4NjI2RiwgMHg2NEE0LCAweDYzQTMsIDB4NUY3QiwgMHg2Rjg4LAotICAgIDB4OTBGNCwgMHg4MUUzLCAweDhGQjAsIDB4NUMxOCwgMHg2NjY4LCAweDVGRjEsIDB4NkM4OSwgMHg5NjQ4LAotICAgIDB4OEQ4MSwgMHg4ODZDLCAweDY0OTEsIDB4NzlGMCwgMHg1N0NFLCAweDZBNTksIDB4NjIxMCwgMHg1NDQ4LAotICAgIDB4NEU1OCwgMHg3QTBCLCAweDYwRTksIDB4NkY4NCwgMHg4QkRBLCAweDYyN0YsIDB4OTAxRSwgMHg5QThCLAotICAgIDB4NzlFNCwgMHg1NDAzLCAweDc1RjQsIDB4NjMwMSwgMHg1MzE5LCAweDZDNjAsIDB4OEZERiwgMHg1RjFCLAotICAgIDB4OUE3MCwgMHg4MDNCLCAweDlGN0YsIDB4NEY4OCwgMHg1QzNBLCAweDhENjQsIDB4N0ZDNSwgMHg2NUE1LAotICAgIDB4NzBCRCwgMHg1MTQ1LCAweDUxQjIsIDB4ODY2QiwgMHg1RDA3LCAweDVCQTAsIDB4NjJCRCwgMHg5MTZDLAotICAgIDB4NzU3NCwgMHg4RTBDLCAweDdBMjAsIDB4NjEwMSwgMHg3Qjc5LCAweDRFQzcsIDB4N0VGOCwgMHg3Nzg1LAotICAgIDB4NEUxMSwgMHg4MUVELCAweDUyMUQsIDB4NTFGQSwgMHg2QTcxLCAweDUzQTgsIDB4OEU4NywgMHg5NTA0LAotICAgIDB4OTZDRiwgMHg2RUMxLCAweDk2NjQsIDB4Njk1QSwgMHg3ODQwLCAweDUwQTgsIDB4NzdENywgMHg2NDEwLAotICAgIDB4ODlFNiwgMHg1OTA0LCAweDYzRTMsIDB4NURERCwgMHg3QTdGLCAweDY5M0QsIDB4NEYyMCwgMHg4MjM5LAotICAgIDB4NTU5OCwgMHg0RTMyLCAweDc1QUUsIDB4N0E5NywgMHg1RTYyLCAweDVFOEEsIDB4OTVFRiwgMHg1MjFCLAotICAgIDB4NTQzOSwgMHg3MDhBLCAweDYzNzYsIDB4OTUyNCwgMHg1NzgyLCAweDY2MjUsIDB4NjkzRiwgMHg5MTg3LAotICAgIDB4NTUwNywgMHg2REYzLCAweDdFQUYsIDB4ODgyMiwgMHg2MjMzLCAweDdFRjAsIDB4NzVCNSwgMHg4MzI4LAotICAgIDB4NzhDMSwgMHg5NkNDLCAweDhGOUUsIDB4NjE0OCwgMHg3NEY3LCAweDhCQ0QsIDB4NkI2NCwgMHg1MjNBLAotICAgIDB4OEQ1MCwgMHg2QjIxLCAweDgwNkEsIDB4ODQ3MSwgMHg1NkYxLCAweDUzMDYsIDB4NEVDRSwgMHg0RTFCLAotICAgIDB4NTFEMSwgMHg3Qzk3LCAweDkxOEIsIDB4N0MwNywgMHg0RkMzLCAweDhFN0YsIDB4N0JFMSwgMHg3QTlDLAotICAgIDB4NjQ2NywgMHg1RDE0LCAweDUwQUMsIDB4ODEwNiwgMHg3NjAxLCAweDdDQjksIDB4NkRFQywgMHg3RkUwLAotICAgIDB4Njc1MSwgMHg1QjU4LCAweDVCRjgsIDB4NzhDQiwgMHg2NEFFLCAweDY0MTMsIDB4NjNBQSwgMHg2MzJCLAotICAgIDB4OTUxOSwgMHg2NDJELCAweDhGQkUsIDB4N0I1NCwgMHg3NjI5LCAweDYyNTMsIDB4NTkyNywgMHg1NDQ2LAotICAgIDB4NkI3OSwgMHg1MEEzLCAweDYyMzQsIDB4NUUyNiwgMHg2Qjg2LCAweDRFRTMsIDB4OEQzNywgMHg4ODhCLAotICAgIDB4NUY4NSwgMHg5MDJFLCAweDYwMjAsIDB4ODAzRCwgMHg2MkM1LCAweDRFMzksIDB4NTM1NSwgMHg5MEY4LAotICAgIDB4NjNCOCwgMHg4MEM2LCAweDY1RTYsIDB4NkMyRSwgMHg0RjQ2LCAweDYwRUUsIDB4NkRFMSwgMHg4QkRFLAotICAgIDB4NUYzOSwgMHg4NkNCLCAweDVGNTMsIDB4NjMyMSwgMHg1MTVBLCAweDgzNjEsIDB4Njg2MywgMHg1MjAwLAotICAgIDB4NjM2MywgMHg4RTQ4LCAweDUwMTIsIDB4NUM5QiwgMHg3OTc3LCAweDVCRkMsIDB4NTIzMCwgMHg3QTNCLAotICAgIDB4NjBCQywgMHg5MDUzLCAweDc2RDcsIDB4NUZCNywgMHg1Rjk3LCAweDc2ODQsIDB4OEU2QywgMHg3MDZGLAotICAgIDB4NzY3QiwgMHg3QjQ5LCAweDc3QUEsIDB4NTFGMywgMHg5MDkzLCAweDU4MjQsIDB4NEY0RSwgMHg2RUY0LAotICAgIDB4OEZFQSwgMHg2NTRDLCAweDdCMUIsIDB4NzJDNCwgMHg2REE0LCAweDdGREYsIDB4NUFFMSwgMHg2MkI1LAotICAgIDB4NUU5NSwgMHg1NzMwLCAweDg0ODIsIDB4N0IyQywgMHg1RTFELCAweDVGMUYsIDB4OTAxMiwgMHg3RjE0LAotICAgIDB4OThBMCwgMHg2MzgyLCAweDZFQzcsIDB4Nzg5OCwgMHg3MEI5LCAweDUxNzgsIDB4OTc1QiwgMHg1N0FCLAotICAgIDB4NzUzNSwgMHg0RjQzLCAweDc1MzgsIDB4NUU5NywgMHg2MEU2LCAweDU5NjAsIDB4NkRDMCwgMHg2QkJGLAotICAgIDB4Nzg4OSwgMHg1M0ZDLCAweDk2RDUsIDB4NTFDQiwgMHg1MjAxLCAweDYzODksIDB4NTQwQSwgMHg5NDkzLAotICAgIDB4OEMwMywgMHg4RENDLCAweDcyMzksIDB4Nzg5RiwgMHg4Nzc2LCAweDhGRUQsIDB4OEMwRCwgMHg1M0UwLAotICAgIDB4NEUwMSwgMHg3NkVGLCAweDUzRUUsIDB4OTQ4OSwgMHg5ODc2LCAweDlGMEUsIDB4OTUyRCwgMHg1QjlBLAotICAgIDB4OEJBMiwgMHg0RTIyLCAweDRFMUMsIDB4NTFBQywgMHg4NDYzLCAweDYxQzIsIDB4NTJBOCwgMHg2ODBCLAotICAgIDB4NEY5NywgMHg2MDZCLCAweDUxQkIsIDB4NkQxRSwgMHg1MTVDLCAweDYyOTYsIDB4NjU5NywgMHg5NjYxLAotICAgIDB4OEM0NiwgMHg5MDE3LCAweDc1RDgsIDB4OTBGRCwgMHg3NzYzLCAweDZCRDIsIDB4NzI4QSwgMHg3MkVDLAotICAgIDB4OEJGQiwgMHg1ODM1LCAweDc3NzksIDB4OEQ0QywgMHg2NzVDLCAweDk1NDAsIDB4ODA5QSwgMHg1RUE2LAotICAgIDB4NkUyMSwgMHg1OTkyLCAweDdBRUYsIDB4NzdFRCwgMHg5NTNCLCAweDZCQjUsIDB4NjVBRCwgMHg3RjBFLAotICAgIDB4NTgwNiwgMHg1MTUxLCAweDk2MUYsIDB4NUJGOSwgMHg1OEE5LCAweDU0MjgsIDB4OEU3MiwgMHg2NTY2LAotICAgIDB4OTg3RiwgMHg1NkU0LCAweDk0OUQsIDB4NzZGRSwgMHg5MDQxLCAweDYzODcsIDB4NTRDNiwgMHg1OTFBLAotICAgIDB4NTkzQSwgMHg1NzlCLCAweDhFQjIsIDB4NjczNSwgMHg4REZBLCAweDgyMzUsIDB4NTI0MSwgMHg2MEYwLAotICAgIDB4NTgxNSwgMHg4NkZFLCAweDVDRTgsIDB4OUU0NSwgMHg0RkM0LCAweDk4OUQsIDB4OEJCOSwgMHg1QTI1LAotICAgIDB4NjA3NiwgMHg1Mzg0LCAweDYyN0MsIDB4OTA0RiwgMHg5MTAyLCAweDk5N0YsIDB4NjA2OSwgMHg4MDBDLAotICAgIDB4NTEzRiwgMHg4MDMzLCAweDVDMTQsIDB4OTk3NSwgMHg2RDMxLCAweDRFOEMsIDB4OEQzMCwgMHg1M0QxLAotICAgIDB4N0Y1QSwgMHg3QjRGLCAweDRGMTAsIDB4NEU0RiwgMHg5NjAwLCAweDZDRDUsIDB4NzNEMCwgMHg4NUU5LAotICAgIDB4NUUwNiwgMHg3NTZBLCAweDdGRkIsIDB4NkEwQSwgMHg3N0ZFLCAweDk0OTIsIDB4N0U0MSwgMHg1MUUxLAotICAgIDB4NzBFNiwgMHg1M0NELCAweDhGRDQsIDB4ODMwMywgMHg4RDI5LCAweDcyQUYsIDB4OTk2RCwgMHg2Q0RCLAotICAgIDB4NTc0QSwgMHg4MkIzLCAweDY1QjksIDB4ODBBQSwgMHg2MjNGLCAweDk2MzIsIDB4NTlBOCwgMHg0RUZGLAotICAgIDB4OEJCRiwgMHg3RUJBLCAweDY1M0UsIDB4ODNGMiwgMHg5NzVFLCAweDU1NjEsIDB4OThERSwgMHg4MEE1LAotICAgIDB4NTMyQSwgMHg4QkZELCAweDU0MjAsIDB4ODBCQSwgMHg1RTlGLCAweDZDQjgsIDB4OEQzOSwgMHg4MkFDLAotICAgIDB4OTE1QSwgMHg1NDI5LCAweDZDMUIsIDB4NTIwNiwgMHg3RUI3LCAweDU3NUYsIDB4NzExQSwgMHg2QzdFLAotICAgIDB4N0M4OSwgMHg1OTRCLCAweDRFRkQsIDB4NUZGRiwgMHg2MTI0LCAweDdDQUEsIDB4NEUzMCwgMHg1QzAxLAotICAgIDB4NjdBQiwgMHg4NzAyLCAweDVDRjAsIDB4OTUwQiwgMHg5OENFLCAweDc1QUYsIDB4NzBGRCwgMHg5MDIyLAotICAgIDB4NTFBRiwgMHg3RjFELCAweDhCQkQsIDB4NTk0OSwgMHg1MUU0LCAweDRGNUIsIDB4NTQyNiwgMHg1OTJCLAotICAgIDB4NjU3NywgMHg4MEE0LCAweDVCNzUsIDB4NjI3NiwgMHg2MkMyLCAweDhGOTAsIDB4NUU0NSwgMHg2QzFGLAotICAgIDB4N0IyNiwgMHg0RjBGLCAweDRGRDgsIDB4NjcwRCwgMHg2RDZFLCAweDZEQUEsIDB4Nzk4RiwgMHg4OEIxLAotICAgIDB4NUYxNywgMHg3NTJCLCAweDYyOUEsIDB4OEY4NSwgMHg0RkVGLCAweDkxREMsIDB4NjVBNywgMHg4MTJGLAotICAgIDB4ODE1MSwgMHg1RTlDLCAweDgxNTAsIDB4OEQ3NCwgMHg1MjZGLCAweDg5ODYsIDB4OEQ0QiwgMHg1OTBELAotICAgIDB4NTA4NSwgMHg0RUQ4LCAweDk2MUMsIDB4NzIzNiwgMHg4MTc5LCAweDhEMUYsIDB4NUJDQywgMHg4QkEzLAotICAgIDB4OTY0NCwgMHg1OTg3LCAweDdGMUEsIDB4NTQ5MCwgMHg1Njc2LCAweDU2MEUsIDB4OEJFNSwgMHg2NTM5LAotICAgIDB4Njk4MiwgMHg5NDk5LCAweDc2RDYsIDB4NkU4OSwgMHg1RTcyLCAweDc1MTgsIDB4Njc0NiwgMHg2N0QxLAotICAgIDB4N0FGRiwgMHg4MDlELCAweDhENzYsIDB4NjExRiwgMHg3OUM2LCAweDY1NjIsIDB4OEQ2MywgMHg1MTg4LAotICAgIDB4NTIxQSwgMHg5NEEyLCAweDdGMzgsIDB4ODA5QiwgMHg3RUIyLCAweDVDOTcsIDB4NkUyRiwgMHg2NzYwLAotICAgIDB4N0JEOSwgMHg3NjhCLCAweDlBRDgsIDB4ODE4RiwgMHg3Rjk0LCAweDdDRDUsIDB4NjQxRSwgMHg5NTUwLAotICAgIDB4N0EzRiwgMHg1NDRBLCAweDU0RTUsIDB4NkI0QywgMHg2NDAxLCAweDYyMDgsIDB4OUUzRCwgMHg4MEYzLAotICAgIDB4NzU5OSwgMHg1MjcyLCAweDk3NjksIDB4ODQ1QiwgMHg2ODNDLCAweDg2RTQsIDB4OTYwMSwgMHg5Njk0LAotICAgIDB4OTRFQywgMHg0RTJBLCAweDU0MDQsIDB4N0VEOSwgMHg2ODM5LCAweDhEREYsIDB4ODAxNSwgMHg2NkY0LAotICAgIDB4NUU5QSwgMHg3RkI5LCAweDU3QzIsIDB4ODAzRiwgMHg2ODk3LCAweDVERTUsIDB4NjUzQiwgMHg1MjlGLAotICAgIDB4NjA2RCwgMHg5RjlBLCAweDRGOUIsIDB4OEVBQywgMHg1MTZDLCAweDVCQUIsIDB4NUYxMywgMHg1REU5LAotICAgIDB4NkM1RSwgMHg2MkYxLCAweDhEMjEsIDB4NTE3MSwgMHg5NEE5LCAweDUyRkUsIDB4NkM5RiwgMHg4MkRGLAotICAgIDB4NzJENywgMHg1N0EyLCAweDY3ODQsIDB4OEQyRCwgMHg1OTFGLCAweDhGOUMsIDB4ODNDNywgMHg1NDk1LAotICAgIDB4N0I4RCwgMHg0RjMwLCAweDZDQkQsIDB4NUI2NCwgMHg1OUQxLCAweDlGMTMsIDB4NTNFNCwgMHg4NkNBLAotICAgIDB4OUFBOCwgMHg4QzM3LCAweDgwQTEsIDB4NjU0NSwgMHg5ODdFLCAweDU2RkEsIDB4OTZDNywgMHg1MjJFLAotICAgIDB4NzREQywgMHg1MjUwLCAweDVCRTEsIDB4NjMwMiwgMHg4OTAyLCAweDRFNTYsIDB4NjJEMCwgMHg2MDJBLAotICAgIDB4NjhGQSwgMHg1MTczLCAweDVCOTgsIDB4NTFBMCwgMHg4OUMyLCAweDdCQTEsIDB4OTk4NiwgMHg3RjUwLAotICAgIDB4NjBFRiwgMHg3MDRDLCAweDhEMkYsIDB4NTE0OSwgMHg1RTdGLCAweDkwMUIsIDB4NzQ3MCwgMHg4OUM0LAotICAgIDB4NTcyRCwgMHg3ODQ1LCAweDVGNTIsIDB4OUY5RiwgMHg5NUZBLCAweDhGNjgsIDB4OUIzQywgMHg4QkUxLAotICAgIDB4NzY3OCwgMHg2ODQyLCAweDY3REMsIDB4OERFQSwgMHg4RDM1LCAweDUyM0QsIDB4OEY4QSwgMHg2RURBLAotICAgIDB4NjhDRCwgMHg5NTA1LCAweDkwRUQsIDB4NTZGRCwgMHg2NzlDLCAweDg4RjksIDB4OEZDNywgMHg1NEM4LAotICAgIDB4OUFCOCwgMHg1QjY5LCAweDZENzcsIDB4NkMyNiwgMHg0RUE1LCAweDVCQjMsIDB4OUE4NywgMHg5MTYzLAotICAgIDB4NjFBOCwgMHg5MEFGLCAweDk3RTksIDB4NTQyQiwgMHg2REI1LCAweDVCRDIsIDB4NTFGRCwgMHg1NThBLAotICAgIDB4N0Y1NSwgMHg3RkYwLCAweDY0QkMsIDB4NjM0RCwgMHg2NUYxLCAweDYxQkUsIDB4NjA4RCwgMHg3MTBBLAotICAgIDB4NkM1NywgMHg2QzQ5LCAweDU5MkYsIDB4Njc2RCwgMHg4MjJBLCAweDU4RDUsIDB4NTY4RSwgMHg4QzZBLAotICAgIDB4NkJFQiwgMHg5MERELCAweDU5N0QsIDB4ODAxNywgMHg1M0Y3LCAweDZENjksIDB4NTQ3NSwgMHg1NTlELAotICAgIDB4ODM3NywgMHg4M0NGLCAweDY4MzgsIDB4NzlCRSwgMHg1NDhDLCAweDRGNTUsIDB4NTQwOCwgMHg3NkQyLAotICAgIDB4OEM4OSwgMHg5NjAyLCAweDZDQjMsIDB4NkRCOCwgMHg4RDZCLCAweDg5MTAsIDB4OUU2NCwgMHg4RDNBLAotICAgIDB4NTYzRiwgMHg5RUQxLCAweDc1RDUsIDB4NUY4OCwgMHg3MkUwLCAweDYwNjgsIDB4NTRGQywgMHg0RUE4LAotICAgIDB4NkEyQSwgMHg4ODYxLCAweDYwNTIsIDB4OEY3MCwgMHg1NEM0LCAweDcwRDgsIDB4ODY3OSwgMHg5RTNGLAotICAgIDB4NkQyQSwgMHg1QjhGLCAweDVGMTgsIDB4N0VBMiwgMHg1NTg5LCAweDRGQUYsIDB4NzMzNCwgMHg1NDNDLAotICAgIDB4NTM5QSwgMHg1MDE5LCAweDU0MEUsIDB4NTQ3QywgMHg0RTRFLCAweDVGRkQsIDB4NzQ1QSwgMHg1OEY2LAotICAgIDB4ODQ2QiwgMHg4MEUxLCAweDg3NzQsIDB4NzJEMCwgMHg3Q0NBLCAweDZFNTYsIDB4NUYyNywgMHg4NjRFLAotICAgIDB4NTUyQywgMHg2MkE0LCAweDRFOTIsIDB4NkNBQSwgMHg2MjM3LCAweDgyQjEsIDB4NTRENywgMHg1MzRFLAotICAgIDB4NzMzRSwgMHg2RUQxLCAweDc1M0IsIDB4NTIxMiwgMHg1MzE2LCAweDhCREQsIDB4NjlEMCwgMHg1RjhBLAotICAgIDB4NjAwMCwgMHg2REVFLCAweDU3NEYsIDB4NkIyMiwgMHg3M0FGLCAweDY4NTMsIDB4OEZEOCwgMHg3RjEzLAotICAgIDB4NjM2MiwgMHg2MEEzLCAweDU1MjQsIDB4NzVFQSwgMHg4QzYyLCAweDcxMTUsIDB4NkRBMywgMHg1QkE2LAotICAgIDB4NUU3QiwgMHg4MzUyLCAweDYxNEMsIDB4OUVDNCwgMHg3OEZBLCAweDg3NTcsIDB4N0MyNywgMHg3Njg3LAotICAgIDB4NTFGMCwgMHg2MEY2LCAweDcxNEMsIDB4NjY0MywgMHg1RTRDLCAweDYwNEQsIDB4OEMwRSwgMHg3MDcwLAotICAgIDB4NjMyNSwgMHg4Rjg5LCAweDVGQkQsIDB4NjA2MiwgMHg4NkQ0LCAweDU2REUsIDB4NkJDMSwgMHg2MDk0LAotICAgIDB4NjE2NywgMHg1MzQ5LCAweDYwRTAsIDB4NjY2NiwgMHg4RDNGLCAweDc5RkQsIDB4NEYxQSwgMHg3MEU5LAotICAgIDB4NkM0NywgMHg4QkIzLCAweDhCRjIsIDB4N0VEOCwgMHg4MzY0LCAweDY2MEYsIDB4NUE1QSwgMHg5QjQyLAotICAgIDB4NkQ1MSwgMHg2REY3LCAweDhDNDEsIDB4NkQzQiwgMHg0RjE5LCAweDcwNkIsIDB4ODNCNywgMHg2MjE2LAotICAgIDB4NjBEMSwgMHg5NzBELCAweDhEMjcsIDB4Nzk3OCwgMHg1MUZCLCAweDU3M0UsIDB4NTdGQSwgMHg2NzNBLAotICAgIDB4NzU3OCwgMHg3QTNELCAweDc5RUYsIDB4N0I5NSwgMHg4MDhDLCAweDk5NjUsIDB4OEZGOSwgMHg2RkMwLAotICAgIDB4OEJBNSwgMHg5RTIxLCAweDU5RUMsIDB4N0VFOSwgMHg3RjA5LCAweDU0MDksIDB4Njc4MSwgMHg2OEQ4LAotICAgIDB4OEY5MSwgMHg3QzRELCAweDk2QzYsIDB4NTNDQSwgMHg2MDI1LCAweDc1QkUsIDB4NkM3MiwgMHg1MzczLAotICAgIDB4NUFDOSwgMHg3RUE3LCAweDYzMjQsIDB4NTFFMCwgMHg4MTBBLCAweDVERjEsIDB4ODRERiwgMHg2MjgwLAotICAgIDB4NTE4MCwgMHg1QjYzLCAweDRGMEUsIDB4Nzk2RCwgMHg1MjQyLCAweDYwQjgsIDB4NkQ0RSwgMHg1QkM0LAotICAgIDB4NUJDMiwgMHg4QkExLCAweDhCQjAsIDB4NjVFMiwgMHg1RkNDLCAweDk2NDUsIDB4NTk5MywgMHg3RUU3LAotICAgIDB4N0VBQSwgMHg1NjA5LCAweDY3QjcsIDB4NTkzOSwgMHg0RjczLCAweDVCQjYsIDB4NTJBMCwgMHg4MzVBLAotICAgIDB4OTg4QSwgMHg4RDNFLCAweDc1MzIsIDB4OTRCRSwgMHg1MDQ3LCAweDdBM0MsIDB4NEVGNywgMHg2N0I2LAotICAgIDB4OUE3RSwgMHg1QUMxLCAweDZCN0MsIDB4NzZEMSwgMHg1NzVBLCAweDVDMTYsIDB4N0IzQSwgMHg5NUY0LAotICAgIDB4NzE0RSwgMHg1MTdDLCAweDgwQTksIDB4ODI3MCwgMHg1OTc4LCAweDdGMDQsIDB4ODMyNywgMHg2OEMwLAotICAgIDB4NjdFQywgMHg3OEIxLCAweDc4NzcsIDB4NjJFMywgMHg2MzYxLCAweDdCODAsIDB4NEZFRCwgMHg1MjZBLAotICAgIDB4NTFDRiwgMHg4MzUwLCAweDY5REIsIDB4OTI3NCwgMHg4REY1LCAweDhEMzEsIDB4ODlDMSwgMHg5NTJFLAotICAgIDB4N0JBRCwgMHg0RUY2LCAweDUwNjUsIDB4ODIzMCwgMHg1MjUxLCAweDk5NkYsIDB4NkUxMCwgMHg2RTg1LAotICAgIDB4NkRBNywgMHg1RUZBLCAweDUwRjUsIDB4NTlEQywgMHg1QzA2LCAweDZENDYsIDB4NkM1RiwgMHg3NTg2LAotICAgIDB4ODQ4QiwgMHg2ODY4LCAweDU5NTYsIDB4OEJCMiwgMHg1MzIwLCAweDkxNzEsIDB4OTY0RCwgMHg4NTQ5LAotICAgIDB4NjkxMiwgMHg3OTAxLCAweDcxMjYsIDB4ODBGNiwgMHg0RUE0LCAweDkwQ0EsIDB4NkQ0NywgMHg5QTg0LAotICAgIDB4NUEwNywgMHg1NkJDLCAweDY0MDUsIDB4OTRGMCwgMHg3N0VCLCAweDRGQTUsIDB4ODExQSwgMHg3MkUxLAotICAgIDB4ODlEMiwgMHg5OTdBLCAweDdGMzQsIDB4N0VERSwgMHg1MjdGLCAweDY1NTksIDB4OTE3NSwgMHg4RjdGLAotICAgIDB4OEY4MywgMHg1M0VCLCAweDdBOTYsIDB4NjNFRCwgMHg2M0E1LCAweDc2ODYsIDB4NzlGOCwgMHg4ODU3LAotICAgIDB4OTYzNiwgMHg2MjJBLCAweDUyQUIsIDB4ODI4MiwgMHg2ODU0LCAweDY3NzAsIDB4NjM3NywgMHg3NzZCLAotICAgIDB4N0FFRCwgMHg2RDAxLCAweDdFRDMsIDB4ODlFMywgMHg1OUQwLCAweDYyMTIsIDB4ODVDOSwgMHg4MkE1LAotICAgIDB4NzU0QywgMHg1MDFGLCAweDRFQ0IsIDB4NzVBNSwgMHg4QkVCLCAweDVDNEEsIDB4NURGRSwgMHg3QjRCLAotICAgIDB4NjVBNCwgMHg5MUQxLCAweDRFQ0EsIDB4NkQyNSwgMHg4OTVGLCAweDdEMjcsIDB4OTUyNiwgMHg0RUM1LAotICAgIDB4OEMyOCwgMHg4RkRCLCAweDk3NzMsIDB4NjY0QiwgMHg3OTgxLCAweDhGRDEsIDB4NzBFQywgMHg2RDc4LAotICAgIDB4NUMzRCwgMHg1MkIyLCAweDgzNDYsIDB4NTE2MiwgMHg4MzBFLCAweDc3NUIsIDB4NjY3NiwgMHg5Q0I4LAotICAgIDB4NEVBQywgMHg2MENBLCAweDdDQkUsIDB4N0NCMywgMHg3RUNGLCAweDRFOTUsIDB4OEI2NiwgMHg2NjZGLAotICAgIDB4OTg4OCwgMHg5NzU5LCAweDU4ODMsIDB4NjU2QywgMHg5NTVDLCAweDVGODQsIDB4NzVDOSwgMHg5NzU2LAotICAgIDB4N0FERiwgMHg3QURFLCAweDUxQzAsIDB4NzBBRiwgMHg3QTk4LCAweDYzRUEsIDB4N0E3NiwgMHg3RUEwLAotICAgIDB4NzM5NiwgMHg5N0VELCAweDRFNDUsIDB4NzA3OCwgMHg0RTVELCAweDkxNTIsIDB4NTNBOSwgMHg2NTUxLAotICAgIDB4NjVFNywgMHg4MUZDLCAweDgyMDUsIDB4NTQ4RSwgMHg1QzMxLCAweDc1OUEsIDB4OTdBMCwgMHg2MkQ4LAotICAgIDB4NzJEOSwgMHg3NUJELCAweDVDNDUsIDB4OUE3OSwgMHg4M0NBLCAweDVDNDAsIDB4NTQ4MCwgMHg3N0U5LAotICAgIDB4NEUzRSwgMHg2Q0FFLCAweDgwNUEsIDB4NjJEMiwgMHg2MzZFLCAweDVERTgsIDB4NTE3NywgMHg4RERELAotICAgIDB4OEUxRSwgMHg5NTJGLCAweDRGRjEsIDB4NTNFNSwgMHg2MEU3LCAweDcwQUMsIDB4NTI2NywgMHg2MzUwLAotICAgIDB4OUU0MywgMHg1QTFGLCAweDUwMjYsIDB4NzczNywgMHg1Mzc3LCAweDdFRTIsIDB4NjQ4NSwgMHg2NTJCLAotICAgIDB4NjI4OSwgMHg2Mzk4LCAweDUwMTQsIDB4NzIzNSwgMHg4OUM5LCAweDUxQjMsIDB4OEJDMCwgMHg3RURELAotICAgIDB4NTc0NywgMHg4M0NDLCAweDk0QTcsIDB4NTE5QiwgMHg1NDFCLCAweDVDRkIsIDB4NEZDQSwgMHg3QUUzLAotICAgIDB4NkQ1QSwgMHg5MEUxLCAweDlBOEYsIDB4NTU4MCwgMHg1NDk2LCAweDUzNjEsIDB4NTRBRiwgMHg1RjAwLAotICAgIDB4NjNFOSwgMHg2OTc3LCAweDUxRUYsIDB4NjE2OCwgMHg1MjBBLCAweDU4MkEsIDB4NTJEOCwgMHg1NzRFLAotICAgIDB4NzgwRCwgMHg3NzBCLCAweDVFQjcsIDB4NjE3NywgMHg3Q0UwLCAweDYyNUIsIDB4NjI5NywgMHg0RUEyLAotICAgIDB4NzA5NSwgMHg4MDAzLCAweDYyRjcsIDB4NzBFNCwgMHg5NzYwLCAweDU3NzcsIDB4ODJEQiwgMHg2N0VGLAotICAgIDB4NjhGNSwgMHg3OEQ1LCAweDk4OTcsIDB4NzlEMSwgMHg1OEYzLCAweDU0QjMsIDB4NTNFRiwgMHg2RTM0LAotICAgIDB4NTE0QiwgMHg1MjNCLCAweDVCQTIsIDB4OEJGRSwgMHg4MEFGLCAweDU1NDMsIDB4NTdBNiwgMHg2MDczLAotICAgIDB4NTc1MSwgMHg1NDJELCAweDdBN0EsIDB4NjA1MCwgMHg1QjU0LCAweDYzQTcsIDB4NjJBMCwgMHg1M0UzLAotICAgIDB4NjI2MywgMHg1QkM3LCAweDY3QUYsIDB4NTRFRCwgMHg3QTlGLCAweDgyRTYsIDB4OTE3NywgMHg1RTkzLAotICAgIDB4ODhFNCwgMHg1OTM4LCAweDU3QUUsIDB4NjMwRSwgMHg4REU4LCAweDgwRUYsIDB4NTc1NywgMHg3Qjc3LAotICAgIDB4NEZBOSwgMHg1RkVCLCAweDVCQkQsIDB4NkIzRSwgMHg1MzIxLCAweDdCNTAsIDB4NzJDMiwgMHg2ODQ2LAotICAgIDB4NzdGRiwgMHg3NzM2LCAweDY1RjcsIDB4NTFCNSwgMHg0RThGLCAweDc2RDQsIDB4NUNCRiwgMHg3QUE1LAotICAgIDB4ODQ3NSwgMHg1OTRFLCAweDlCNDEsIDB4NTA4MCwgMHg5OTg4LCAweDYxMjcsIDB4NkU4MywgMHg1NzY0LAotICAgIDB4NjYwNiwgMHg2MzQ2LCAweDU2RjAsIDB4NjJFQywgMHg2MjY5LCAweDVFRDMsIDB4OTYxNCwgMHg1NzgzLAotICAgIDB4NjJDOSwgMHg1NTg3LCAweDg3MjEsIDB4ODE0QSwgMHg4RkEzLCAweDU1NjYsIDB4ODNCMSwgMHg2NzY1LAotICAgIDB4OEQ1NiwgMHg4NERELCAweDVBNkEsIDB4NjgwRiwgMHg2MkU2LCAweDdCRUUsIDB4OTYxMSwgMHg1MTcwLAotICAgIDB4NkY5QywgMHg4QzMwLCAweDYzRkQsIDB4ODlDOCwgMHg2MUQyLCAweDdGMDYsIDB4NzBDMiwgMHg2RUU1LAotICAgIDB4NzQwNSwgMHg2OTk0LCAweDcyRkMsIDB4NUVDQSwgMHg5MENFLCAweDY3MTcsIDB4NkQ2QSwgMHg2MzVFLAotICAgIDB4NTJCMywgMHg3MjYyLCAweDgwMDEsIDB4NEY2QywgMHg1OUU1LCAweDkxNkEsIDB4NzBEOSwgMHg2RDlELAotICAgIDB4NTJEMiwgMHg0RTUwLCAweDk2RjcsIDB4OTU2RCwgMHg4NTdFLCAweDc4Q0EsIDB4N0QyRiwgMHg1MTIxLAotICAgIDB4NTc5MiwgMHg2NEMyLCAweDgwOEIsIDB4N0M3QiwgMHg2Q0VBLCAweDY4RjEsIDB4Njk1RSwgMHg1MUI3LAotICAgIDB4NTM5OCwgMHg2OEE4LCAweDcyODEsIDB4OUVDRSwgMHg3QkYxLCAweDcyRjgsIDB4NzlCQiwgMHg2RjEzLAotICAgIDB4NzQwNiwgMHg2NzRFLCAweDkxQ0MsIDB4OUNBNCwgMHg3OTNDLCAweDgzODksIDB4ODM1NCwgMHg1NDBGLAotICAgIDB4NjgxNywgMHg0RTNELCAweDUzODksIDB4NTJCMSwgMHg3ODNFLCAweDUzODYsIDB4NTIyOSwgMHg1MDg4LAotICAgIDB4NEY4QiwgMHg0RkQwLCAweDc1RTIsIDB4N0FDQiwgMHg3QzkyLCAweDZDQTUsIDB4OTZCNiwgMHg1MjlCLAotICAgIDB4NzQ4MywgMHg1NEU5LCAweDRGRTksIDB4ODA1NCwgMHg4M0IyLCAweDhGREUsIDB4OTU3MCwgMHg1RUM5LAotICAgIDB4NjAxQywgMHg2RDlGLCAweDVFMTgsIDB4NjU1QiwgMHg4MTM4LCAweDk0RkUsIDB4NjA0QiwgMHg3MEJDLAotICAgIDB4N0VDMywgMHg3Q0FFLCAweDUxQzksIDB4Njg4MSwgMHg3Q0IxLCAweDgyNkYsIDB4NEUyNCwgMHg4Rjg2LAotICAgIDB4OTFDRiwgMHg2NjdFLCAweDRFQUUsIDB4OEMwNSwgMHg2NEE5LCAweDgwNEEsIDB4NTBEQSwgMHg3NTk3LAotICAgIDB4NzFDRSwgMHg1QkU1LCAweDhGQkQsIDB4NkY2NiwgMHg0RTg2LCAweDY0ODIsIDB4OTU2MywgMHg1RUQ2LAotICAgIDB4NjU5OSwgMHg1MjE3LCAweDg4QzIsIDB4NzBDOCwgMHg1MkEzLCAweDczMEUsIDB4NzQzMywgMHg2Nzk3LAotICAgIDB4NzhGNywgMHg5NzE2LCAweDRFMzQsIDB4OTBCQiwgMHg5Q0RFLCAweDZEQ0IsIDB4NTFEQiwgMHg4RDQxLAotICAgIDB4NTQxRCwgMHg2MkNFLCAweDczQjIsIDB4ODNGMSwgMHg5NkY2LCAweDlGODQsIDB4OTRDMywgMHg0RjM2LAotICAgIDB4N0Y5QSwgMHg1MUNDLCAweDcwNzUsIDB4OTY3NSwgMHg1Q0FELCAweDk4ODYsIDB4NTNFNiwgMHg0RUU0LAotICAgIDB4NkU5QywgMHg3NDA5LCAweDY5QjQsIDB4Nzg2QiwgMHg5OThGLCAweDc1NTksIDB4NTIxOCwgMHg3NjI0LAotICAgIDB4NkQ0MSwgMHg2N0YzLCAweDUxNkQsIDB4OUY5OSwgMHg4MDRCLCAweDU0OTksIDB4N0IzQywgMHg3QUJGLAotICAgIDB4OTY4NiwgMHg1Nzg0LCAweDYyRTIsIDB4OTY0NywgMHg2OTdDLCAweDVBMDQsIDB4NjQwMiwgMHg3QkQzLAotICAgIDB4NkYwRiwgMHg5NjRCLCAweDgyQTYsIDB4NTM2MiwgMHg5ODg1LCAweDVFOTAsIDB4NzA4OSwgMHg2M0IzLAotICAgIDB4NTM2NCwgMHg4NjRGLCAweDlDODEsIDB4OUU5MywgMHg3ODhDLCAweDk3MzIsIDB4OERFRiwgMHg4RDQyLAotICAgIDB4OUU3RiwgMHg2RjVFLCAweDc5ODQsIDB4NUY1NSwgMHg5NjQ2LCAweDYyMkUsIDB4OUE3NCwgMHg1NDE1LAotICAgIDB4OTRERCwgMHg0RkEzLCAweDY1QzUsIDB4NUM2NSwgMHg1QzYxLCAweDdGMTUsIDB4ODY1MSwgMHg2QzJGLAotICAgIDB4NUY4QiwgMHg3Mzg3LCAweDZFRTQsIDB4N0VGRiwgMHg1Q0U2LCAweDYzMUIsIDB4NUI2QSwgMHg2RUU2LAotICAgIDB4NTM3NSwgMHg0RTcxLCAweDYzQTAsIDB4NzU2NSwgMHg2MkExLCAweDhGNkUsIDB4NEYyNiwgMHg0RUQxLAotICAgIDB4NkNBNiwgMHg3RUI2LCAweDhCQkEsIDB4ODQxRCwgMHg4N0JBLCAweDdGNTcsIDB4OTAzQiwgMHg5NTIzLAotICAgIDB4N0JBOSwgMHg5QUExLCAweDg4RjgsIDB4ODQzRCwgMHg2RDFCLCAweDlBODYsIDB4N0VEQywgMHg1OTg4LAotICAgIDB4OUVCQiwgMHg3MzlCLCAweDc4MDEsIDB4ODY4MiwgMHg5QTZDLCAweDlBODIsIDB4NTYxQiwgMHg1NDE3LAotICAgIDB4NTdDQiwgMHg0RTcwLCAweDlFQTYsIDB4NTM1NiwgMHg4RkM4LCAweDgxMDksIDB4Nzc5MiwgMHg5OTkyLAotICAgIDB4ODZFRSwgMHg2RUUxLCAweDg1MTMsIDB4NjZGQywgMHg2MTYyLCAweDZGMkIsIDB4OEMyOSwgMHg4MjkyLAotICAgIDB4ODMyQiwgMHg3NkYyLCAweDZDMTMsIDB4NUZEOSwgMHg4M0JELCAweDczMkIsIDB4ODMwNSwgMHg5NTFBLAotICAgIDB4NkJEQiwgMHg3N0RCLCAweDk0QzYsIDB4NTM2RiwgMHg4MzAyLCAweDUxOTIsIDB4NUUzRCwgMHg4QzhDLAotICAgIDB4OEQzOCwgMHg0RTQ4LCAweDczQUIsIDB4Njc5QSwgMHg2ODg1LCAweDkxNzYsIDB4OTcwOSwgMHg3MTY0LAotICAgIDB4NkNBMSwgMHg3NzA5LCAweDVBOTIsIDB4OTU0MSwgMHg2QkNGLCAweDdGOEUsIDB4NjYyNywgMHg1QkQwLAotICAgIDB4NTlCOSwgMHg1QTlBLCAweDk1RTgsIDB4OTVGNywgMHg0RUVDLCAweDg0MEMsIDB4ODQ5OSwgMHg2QUFDLAotICAgIDB4NzZERiwgMHg5NTMwLCAweDczMUIsIDB4NjhBNiwgMHg1QjVGLCAweDc3MkYsIDB4OTE5QSwgMHg5NzYxLAotICAgIDB4N0NEQywgMHg4RkY3LCAweDhDMUMsIDB4NUYyNSwgMHg3QzczLCAweDc5RDgsIDB4ODlDNSwgMHg2Q0NDLAotICAgIDB4ODcxQywgMHg1QkM2LCAweDVFNDIsIDB4NjhDOSwgMHg3NzIwLCAweDdFRjUsIDB4NTE5NSwgMHg1MTRELAotICAgIDB4NTJDOSwgMHg1QTI5LCAweDdGMDUsIDB4OTc2MiwgMHg4MkQ3LCAweDYzQ0YsIDB4Nzc4NCwgMHg4NUQwLAotICAgIDB4NzlEMiwgMHg2RTNBLCAweDVFOTksIDB4NTk5OSwgMHg4NTExLCAweDcwNkQsIDB4NkMxMSwgMHg2MkJGLAotICAgIDB4NzZCRiwgMHg2NTRGLCAweDYwQUYsIDB4OTVGRCwgMHg2NjBFLCAweDg3OUYsIDB4OUUyMywgMHg5NEVELAotICAgIDB4NTQwRCwgMHg1NDdELCAweDhDMkMsIDB4NjQ3OCwgMHg2NDc5LCAweDg2MTEsIDB4NkEyMSwgMHg4MTlDLAotICAgIDB4NzhFOCwgMHg2NDY5LCAweDlCNTQsIDB4NjJCOSwgMHg2NzJCLCAweDgzQUIsIDB4NThBOCwgMHg5RUQ4LAotICAgIDB4NkNBQiwgMHg2RjIwLCAweDVCREUsIDB4OTY0QywgMHg4QzBCLCAweDcyNUYsIDB4NjdEMCwgMHg2MkM3LAotICAgIDB4NzI2MSwgMHg0RUE5LCAweDU5QzYsIDB4NkJDRCwgMHg1ODkzLCAweDY2QUUsIDB4NUU1NSwgMHg1MkRGLAotICAgIDB4NjE1NSwgMHg2NzI4LCAweDc2RUUsIDB4Nzc2NiwgMHg3MjY3LCAweDdBNDYsIDB4NjJGRiwgMHg1NEVBLAotICAgIDB4NTQ1MCwgMHg5NEEwLCAweDkwQTMsIDB4NUExQywgMHg3RUIzLCAweDZDMTYsIDB4NEU0MywgMHg1OTc2LAotICAgIDB4ODAxMCwgMHg1OTQ4LCAweDUzNTcsIDB4NzUzNywgMHg5NkJFLCAweDU2Q0EsIDB4NjMyMCwgMHg4MTExLAotICAgIDB4NjA3QywgMHg5NUY5LCAweDZERDYsIDB4NTQ2MiwgMHg5OTgxLCAweDUxODUsIDB4NUFFOSwgMHg4MEZELAotICAgIDB4NTlBRSwgMHg5NzEzLCAweDUwMkEsIDB4NkNFNSwgMHg1QzNDLCAweDYyREYsIDB4NEY2MCwgMHg1MzNGLAotICAgIDB4ODE3QiwgMHg5MDA2LCAweDZFQkEsIDB4ODUyQiwgMHg2MkM4LCAweDVFNzQsIDB4NzhCRSwgMHg2NEI1LAotICAgIDB4NjM3QiwgMHg1RkY1LCAweDVBMTgsIDB4OTE3RiwgMHg5RTFGLCAweDVDM0YsIDB4NjM0RiwgMHg4MDQyLAotICAgIDB4NUI3RCwgMHg1NTZFLCAweDk1NEEsIDB4OTU0RCwgMHg2RDg1LCAweDYwQTgsIDB4NjdFMCwgMHg3MkRFLAotICAgIDB4NTFERCwgMHg1QjgxLCAweDYyRTcsIDB4NkNERSwgMHg3MjVCLCAweDYyNkQsIDB4OTRBRSwgMHg3RUJELAotICAgIDB4ODExMywgMHg2RDUzLCAweDUxOUMsIDB4NUYwNCwgMHg1OTc0LCAweDUyQUEsIDB4NjAxMiwgMHg1OTczLAotICAgIDB4NjY5NiwgMHg4NjUwLCAweDc1OUYsIDB4NjMyQSwgMHg2MUU2LCAweDdDRUYsIDB4OEJGQSwgMHg1NEU2LAotICAgIDB4NkIyNywgMHg5RTI1LCAweDZCQjQsIDB4ODVENSwgMHg1NDU1LCAweDUwNzYsIDB4NkNBNCwgMHg1NTZBLAotICAgIDB4OERCNCwgMHg3MjJDLCAweDVFMTUsIDB4NjAxNSwgMHg3NDM2LCAweDYyQ0QsIDB4NjM5MiwgMHg3MjRDLAotICAgIDB4NUY5OCwgMHg2RTQzLCAweDZEM0UsIDB4NjUwMCwgMHg2RjU4LCAweDc2RDgsIDB4NzhEMCwgMHg3NkZDLAotICAgIDB4NzU1NCwgMHg1MjI0LCAweDUzREIsIDB4NEU1MywgMHg1RTlFLCAweDY1QzEsIDB4ODAyQSwgMHg4MEQ2LAotICAgIDB4NjI5QiwgMHg1NDg2LCAweDUyMjgsIDB4NzBBRSwgMHg4ODhELCAweDhERDEsIDB4NkNFMSwgMHg1NDc4LAotICAgIDB4ODBEQSwgMHg1N0Y5LCAweDg4RjQsIDB4OEQ1NCwgMHg5NjZBLCAweDkxNEQsIDB4NEY2OSwgMHg2QzlCLAotICAgIDB4NTVCNywgMHg3NkM2LCAweDc4MzAsIDB4NjJBOCwgMHg3MEY5LCAweDZGOEUsIDB4NUY2RCwgMHg4NEVDLAotICAgIDB4NjhEQSwgMHg3ODdDLCAweDdCRjcsIDB4ODFBOCwgMHg2NzBCLCAweDlFNEYsIDB4NjM2NywgMHg3OEIwLAotICAgIDB4NTc2RiwgMHg3ODEyLCAweDk3MzksIDB4NjI3OSwgMHg2MkFCLCAweDUyODgsIDB4NzQzNSwgMHg2QkQ3LAotICAgIDB4NTU2NCwgMHg4MTNFLCAweDc1QjIsIDB4NzZBRSwgMHg1MzM5LCAweDc1REUsIDB4NTBGQiwgMHg1QzQxLAotICAgIDB4OEI2QywgMHg3QkM3LCAweDUwNEYsIDB4NzI0NywgMHg5QTk3LCAweDk4RDgsIDB4NkYwMiwgMHg3NEUyLAotICAgIDB4Nzk2OCwgMHg2NDg3LCAweDc3QTUsIDB4NjJGQywgMHg5ODkxLCAweDhEMkIsIDB4NTRDMSwgMHg4MDU4LAotICAgIDB4NEU1MiwgMHg1NzZBLCAweDgyRjksIDB4ODQwRCwgMHg1RTczLCAweDUxRUQsIDB4NzRGNiwgMHg4QkM0LAotICAgIDB4NUM0RiwgMHg1NzYxLCAweDZDRkMsIDB4OTg4NywgMHg1QTQ2LCAweDc4MzQsIDB4OUI0NCwgMHg4RkVCLAotICAgIDB4N0M5NSwgMHg1MjU2LCAweDYyNTEsIDB4OTRGQSwgMHg0RUM2LCAweDgzODYsIDB4ODQ2MSwgMHg4M0U5LAotICAgIDB4ODRCMiwgMHg1N0Q0LCAweDY3MzQsIDB4NTcwMywgMHg2NjZFLCAweDZENjYsIDB4OEMzMSwgMHg2NkRELAotICAgIDB4NzAxMSwgMHg2NzFGLCAweDZCM0EsIDB4NjgxNiwgMHg2MjFBLCAweDU5QkIsIDB4NEUwMywgMHg1MUM0LAotICAgIDB4NkYwNiwgMHg2N0QyLCAweDZDOEYsIDB4NTE3NiwgMHg2OENCLCAweDU5NDcsIDB4NkI2NywgMHg3NTY2LAotICAgIDB4NUQwRSwgMHg4MTEwLCAweDlGNTAsIDB4NjVENywgMHg3OTQ4LCAweDc5NDEsIDB4OUE5MSwgMHg4RDc3LAotICAgIDB4NUM4MiwgMHg0RTVFLCAweDRGMDEsIDB4NTQyRiwgMHg1OTUxLCAweDc4MEMsIDB4NTY2OCwgMHg2QzE0LAotICAgIDB4OEZDNCwgMHg1RjAzLCAweDZDN0QsIDB4NkNFMywgMHg4QkFCLCAweDYzOTAsIDB4NjA3MCwgMHg2RDNELAotICAgIDB4NzI3NSwgMHg2MjY2LCAweDk0OEUsIDB4OTRDNSwgMHg1MzQzLCAweDhGQzEsIDB4N0I3RSwgMHg0RURGLAotICAgIDB4OEMyNiwgMHg0RTdFLCAweDlFRDQsIDB4OTRCMSwgMHg5NEIzLCAweDUyNEQsIDB4NkY1QywgMHg5MDYzLAotICAgIDB4NkQ0NSwgMHg4QzM0LCAweDU4MTEsIDB4NUQ0QywgMHg2QjIwLCAweDZCNDksIDB4NjdBQSwgMHg1NDVCLAotICAgIDB4ODE1NCwgMHg3RjhDLCAweDU4OTksIDB4ODUzNywgMHg1RjNBLCAweDYyQTIsIDB4NkE0NywgMHg5NTM5LAotICAgIDB4NjU3MiwgMHg2MDg0LCAweDY4NjUsIDB4NzdBNywgMHg0RTU0LCAweDRGQTgsIDB4NURFNywgMHg5Nzk4LAotICAgIDB4NjRBQywgMHg3RkQ4LCAweDVDRUQsIDB4NEZDRiwgMHg3QThELCAweDUyMDcsIDB4ODMwNCwgMHg0RTE0LAotICAgIDB4NjAyRiwgMHg3QTgzLCAweDk0QTYsIDB4NEZCNSwgMHg0RUIyLCAweDc5RTYsIDB4NzQzNCwgMHg1MkU0LAotICAgIDB4ODJCOSwgMHg2NEQyLCAweDc5QkQsIDB4NUJERCwgMHg2QzgxLCAweDk3NTIsIDB4OEY3QiwgMHg2QzIyLAotICAgIDB4NTAzRSwgMHg1MzdGLCAweDZFMDUsIDB4NjRDRSwgMHg2Njc0LCAweDZDMzAsIDB4NjBDNSwgMHg5ODc3LAotICAgIDB4OEJGNywgMHg1RTg2LCAweDc0M0MsIDB4N0E3NywgMHg3OUNCLCAweDRFMTgsIDB4OTBCMSwgMHg3NDAzLAotICAgIDB4NkM0MiwgMHg1NkRBLCAweDkxNEIsIDB4NkNDNSwgMHg4RDhCLCAweDUzM0EsIDB4ODZDNiwgMHg2NkYyLAotICAgIDB4OEVBRiwgMHg1QzQ4LCAweDlBNzEsIDB4NkUyMCwgMHg1M0Q2LCAweDVBMzYsIDB4OUY4QiwgMHg4REEzLAotICAgIDB4NTNCQiwgMHg1NzA4LCAweDk4QTcsIDB4Njc0MywgMHg5MTlCLCAweDZDQzksIDB4NTE2OCwgMHg3NUNBLAotICAgIDB4NjJGMywgMHg3MkFDLCAweDUyMzgsIDB4NTI5RCwgMHg3RjNBLCAweDcwOTQsIDB4NzYzOCwgMHg1Mzc0LAotICAgIDB4OUU0QSwgMHg2OUI3LCAweDc4NkUsIDB4OTZDMCwgMHg4OEQ5LCAweDdGQTQsIDB4NzEzNiwgMHg3MUMzLAotICAgIDB4NTE4OSwgMHg2N0QzLCAweDc0RTQsIDB4NThFNCwgMHg2NTE4LCAweDU2QjcsIDB4OEJBOSwgMHg5OTc2LAotICAgIDB4NjI3MCwgMHg3RUQ1LCAweDYwRjksIDB4NzBFRCwgMHg1OEVDLCAweDRFQzEsIDB4NEVCQSwgMHg1RkNELAotICAgIDB4OTdFNywgMHg0RUZCLCAweDhCQTQsIDB4NTIwMywgMHg1OThBLCAweDdFQUIsIDB4NjI1NCwgMHg0RUNELAotICAgIDB4NjVFNSwgMHg2MjBFLCAweDgzMzgsIDB4ODRDOSwgMHg4MzYzLCAweDg3OEQsIDB4NzE5NCwgMHg2RUI2LAotICAgIDB4NUJCOSwgMHg3RUQyLCAweDUxOTcsIDB4NjNDOSwgMHg2N0Q0LCAweDgwODksIDB4ODMzOSwgMHg4ODE1LAotICAgIDB4NTExMiwgMHg1QjdBLCAweDU5ODIsIDB4OEZCMSwgMHg0RTczLCAweDZDNUQsIDB4NTE2NSwgMHg4OTI1LAotICAgIDB4OEY2RiwgMHg5NjJFLCAweDg1NEEsIDB4NzQ1RSwgMHg5NTEwLCAweDk1RjAsIDB4NkRBNiwgMHg4MkU1LAotICAgIDB4NUYzMSwgMHg2NDkyLCAweDZEMTIsIDB4ODQyOCwgMHg4MTZFLCAweDlDQzMsIDB4NTg1RSwgMHg4RDVCLAotICAgIDB4NEUwOSwgMHg1M0MxLCAweDRGMUUsIDB4NjU2MywgMHg2ODUxLCAweDU1RDMsIDB4NEUyNywgMHg2NDE0LAotICAgIDB4OUE5QSwgMHg2MjZCLCAweDVBQzIsIDB4NzQ1RiwgMHg4MjcyLCAweDZEQTksIDB4NjhFRSwgMHg1MEU3LAotICAgIDB4ODM4RSwgMHg3ODAyLCAweDY3NDAsIDB4NTIzOSwgMHg2Qzk5LCAweDdFQjEsIDB4NTBCQiwgMHg1NTY1LAotICAgIDB4NzE1RSwgMHg3QjVCLCAweDY2NTIsIDB4NzNDQSwgMHg4MkVCLCAweDY3NDksIDB4NUM3MSwgMHg1MjIwLAotICAgIDB4NzE3RCwgMHg4ODZCLCAweDk1RUEsIDB4OTY1NSwgMHg2NEM1LCAweDhENjEsIDB4ODFCMywgMHg1NTg0LAotICAgIDB4NkM1NSwgMHg2MjQ3LCAweDdGMkUsIDB4NTg5MiwgMHg0RjI0LCAweDU1NDYsIDB4OEQ0RiwgMHg2NjRDLAotICAgIDB4NEUwQSwgMHg1QzFBLCAweDg4RjMsIDB4NjhBMiwgMHg2MzRFLCAweDdBMEQsIDB4NzBFNywgMHg4MjhELAotICAgIDB4NTJGQSwgMHg5N0Y2LCAweDVDMTEsIDB4NTRFOCwgMHg5MEI1LCAweDdFQ0QsIDB4NTk2MiwgMHg4RDRBLAotICAgIDB4ODZDNywgMHg4MjBDLCAweDgyMEQsIDB4OEQ2NiwgMHg2NDQ0LCAweDVDMDQsIDB4NjE1MSwgMHg2RDg5LAotICAgIDB4NzkzRSwgMHg4QkJFLCAweDc4MzcsIDB4NzUzMywgMHg1NDdCLCAweDRGMzgsIDB4OEVBQiwgMHg2REYxLAotICAgIDB4NUEyMCwgMHg3RUM1LCAweDc5NUUsIDB4NkM4OCwgMHg1QkExLCAweDVBNzYsIDB4NzUxQSwgMHg4MEJFLAotICAgIDB4NjE0RSwgMHg2RTE3LCAweDU4RjAsIDB4NzUxRiwgMHg3NTI1LCAweDcyNzIsIDB4NTM0NywgMHg3RUYzLAotICAgIDB4NzcwMSwgMHg3NkRCLCAweDUyNjksIDB4ODBEQywgMHg1NzIzLCAweDVFMDgsIDB4NTkzMSwgMHg3MkVFLAotICAgIDB4NjVCRCwgMHg2RTdGLCAweDhCRDcsIDB4NUMzOCwgMHg4NjcxLCAweDUzNDEsIDB4NzdGMywgMHg2MkZFLAotICAgIDB4NjVGNiwgMHg0RUMwLCAweDk4REYsIDB4ODY4MCwgMHg1QjlFLCAweDhCQzYsIDB4NTNGMiwgMHg3N0UyLAotICAgIDB4NEY3RiwgMHg1QzRFLCAweDlBNzYsIDB4NTlDQiwgMHg1RjBGLCAweDc5M0EsIDB4NThFQiwgMHg0RTE2LAotICAgIDB4NjdGRiwgMHg0RThCLCAweDYyRUQsIDB4OEE5MywgMHg5MDFELCAweDUyQkYsIDB4NjYyRiwgMHg1NURDLAotICAgIDB4NTY2QywgMHg5MDAyLCAweDRFRDUsIDB4NEY4RCwgMHg5MUNBLCAweDk5NzAsIDB4NkMwRiwgMHg1RTAyLAotICAgIDB4NjA0MywgMHg1QkE0LCAweDg5QzYsIDB4OEJENSwgMHg2NTM2LCAweDYyNEIsIDB4OTk5NiwgMHg1Qjg4LAotICAgIDB4NUJGRiwgMHg2Mzg4LCAweDU1MkUsIDB4NTNENywgMHg3NjI2LCAweDUxN0QsIDB4ODUyQywgMHg2N0EyLAotICAgIDB4NjhCMywgMHg2QjhBLCAweDYyOTIsIDB4OEY5MywgMHg1M0Q0LCAweDgyMTIsIDB4NkREMSwgMHg3NThGLAotICAgIDB4NEU2NiwgMHg4RDRFLCAweDVCNzAsIDB4NzE5RiwgMHg4NUFGLCAweDY2OTEsIDB4NjZEOSwgMHg3RjcyLAotICAgIDB4ODcwMCwgMHg5RUNELCAweDlGMjAsIDB4NUM1RSwgMHg2NzJGLCAweDhGRjAsIDB4NjgxMSwgMHg2NzVGLAotICAgIDB4NjIwRCwgMHg3QUQ2LCAweDU4ODUsIDB4NUVCNiwgMHg2NTcwLCAweDZGMzEsIDB4NjA1NSwgMHg1MjM3LAotICAgIDB4ODAwRCwgMHg2NDU0LCAweDg4NzAsIDB4NzUyOSwgMHg1RTA1LCAweDY4MTMsIDB4NjJGNCwgMHg5NzFDLAotICAgIDB4NTNDQywgMHg3MjNELCAweDhDMDEsIDB4NkMzNCwgMHg3NzYxLCAweDdBMEUsIDB4NTQyRSwgMHg3N0FDLAotICAgIDB4OTg3QSwgMHg4MjFDLCAweDhCRjQsIDB4Nzg1NSwgMHg2NzE0LCAweDcwQzEsIDB4NjVBRiwgMHg2NDk1LAotICAgIDB4NTYzNiwgMHg2MDFELCAweDc5QzEsIDB4NTNGOCwgMHg0RTFELCAweDZCN0IsIDB4ODA4NiwgMHg1QkZBLAotICAgIDB4NTVFMywgMHg1NkRCLCAweDRGM0EsIDB4NEYzQywgMHg5OTcyLCAweDVERjMsIDB4Njc3RSwgMHg4MDM4LAotICAgIDB4NjAwMiwgMHg5ODgyLCAweDkwMDEsIDB4NUI4QiwgMHg4QkJDLCAweDhCRjUsIDB4NjQxQywgMHg4MjU4LAotICAgIDB4NjRERSwgMHg1NUZELCAweDgyQ0YsIDB4OTE2NSwgMHg0RkQ3LCAweDdEMjAsIDB4OTAxRiwgMHg3QzlGLAotICAgIDB4NTBGMywgMHg1ODUxLCAweDZFQUYsIDB4NUJCRiwgMHg4QkM5LCAweDgwODMsIDB4OTE3OCwgMHg4NDlDLAotICAgIDB4N0I5NywgMHg4NjdELCAweDk2OEIsIDB4OTY4RiwgMHg3RUU1LCAweDlBRDMsIDB4Nzg4RSwgMHg1QzgxLAotICAgIDB4N0E1NywgMHg5MDQyLCAweDk2QTcsIDB4Nzk1RiwgMHg1QjU5LCAweDYzNUYsIDB4N0IwQiwgMHg4NEQxLAotICAgIDB4NjhBRCwgMHg1NTA2LCAweDdGMjksIDB4NzQxMCwgMHg3RDIyLCAweDk1MDEsIDB4NjI0MCwgMHg1ODRDLAotICAgIDB4NEVENiwgMHg1QjgzLCAweDU5NzksIDB4NTg1NCwgMHg3MzZELCAweDYzMUUsIDB4OEU0QiwgMHg4RTBGLAotICAgIDB4ODBDRSwgMHg4MkQ0LCAweDYyQUMsIDB4NTNGMCwgMHg2Q0YwLCAweDkxNUUsIDB4NTkyQSwgMHg2MDAxLAotICAgIDB4NkM3MCwgMHg1NzRELCAweDY0NEEsIDB4OEQyQSwgMHg3NjJCLCAweDZFRTksIDB4NTc1QiwgMHg2QTgwLAotICAgIDB4NzVGMCwgMHg2RjZELCAweDhDMkQsIDB4OEMwOCwgMHg1NzY2LCAweDZCRUYsIDB4ODg5MiwgMHg3OEIzLAotICAgIDB4NjNBMiwgMHg1M0Y5LCAweDcwQUQsIDB4NkM2NCwgMHg1ODU4LCAweDY0MkEsIDB4NTgwMiwgMHg2OEUwLAotICAgIDB4ODE5QiwgMHg1NTEwLCAweDdDRDYsIDB4NTAxOCwgMHg4RUJBLCAweDZEQ0MsIDB4OEQ5RiwgMHg3MEVCLAotICAgIDB4NjM4RiwgMHg2RDlCLCAweDZFRDQsIDB4N0VFNiwgMHg4NDA0LCAweDY4NDMsIDB4OTAwMywgMHg2REQ4LAotICAgIDB4OTY3NiwgMHg4QkE4LCAweDU5NTcsIDB4NzI3OSwgMHg4NUU0LCAweDgxN0UsIDB4NzVCQywgMHg4QThBLAotICAgIDB4NjhBRiwgMHg1MjU0LCAweDhFMjIsIDB4OTUxMSwgMHg2M0QwLCAweDk4OTgsIDB4OEU0NCwgMHg1NTdDLAotICAgIDB4NEY1MywgMHg2NkZGLCAweDU2OEYsIDB4NjBENSwgMHg2RDk1LCAweDUyNDMsIDB4NUM0OSwgMHg1OTI5LAotICAgIDB4NkRGQiwgMHg1ODZCLCAweDc1MzAsIDB4NzUxQywgMHg2MDZDLCAweDgyMTQsIDB4ODE0NiwgMHg2MzExLAotICAgIDB4Njc2MSwgMHg4RkUyLCAweDc3M0EsIDB4OERGMywgMHg4RDM0LCAweDk0QzEsIDB4NUUxNiwgMHg1Mzg1LAotICAgIDB4NTQyQywgMHg3MEMzLCAweDZDNDAsIDB4NUVGNywgMHg1MDVDLCAweDRFQUQsIDB4NUVBRCwgMHg2MzNBLAotICAgIDB4ODI0NywgMHg5MDFBLCAweDY4NTAsIDB4OTE2RSwgMHg3N0IzLCAweDU0MEMsIDB4OTREQywgMHg1RjY0LAotICAgIDB4N0FFNSwgMHg2ODc2LCAweDYzNDUsIDB4N0I1MiwgMHg3RURGLCAweDc1REIsIDB4NTA3NywgMHg2Mjk1LAotICAgIDB4NTkzNCwgMHg5MDBGLCAweDUxRjgsIDB4NzlDMywgMHg3QTgxLCAweDU2RkUsIDB4NUY5MiwgMHg5MDE0LAotICAgIDB4NkQ4MiwgMHg1QzYwLCAweDU3MUYsIDB4NTQxMCwgMHg1MTU0LCAweDZFNEQsIDB4NTZFMiwgMHg2M0E4LAotICAgIDB4OTg5MywgMHg4MTdGLCAweDg3MTUsIDB4ODkyQSwgMHg5MDAwLCAweDU0MUUsIDB4NUM2RiwgMHg4MUMwLAotICAgIDB4NjJENiwgMHg2MjU4LCAweDgxMzEsIDB4OUUzNSwgMHg5NjQwLCAweDlBNkUsIDB4OUE3QywgMHg2OTJELAotICAgIDB4NTlBNSwgMHg2MkQzLCAweDU1M0UsIDB4NjMxNiwgMHg1NEM3LCAweDg2RDksIDB4NkQzQywgMHg1QTAzLAotICAgIDB4NzRFNiwgMHg4ODlDLCAweDZCNkEsIDB4NTkxNiwgMHg4QzRDLCAweDVGMkYsIDB4NkU3RSwgMHg3M0E5LAotICAgIDB4OTg3RCwgMHg0RTM4LCAweDcwRjcsIDB4NUI4QywgMHg3ODk3LCAweDYzM0QsIDB4NjY1QSwgMHg3Njk2LAotICAgIDB4NjBDQiwgMHg1QjlCLCAweDVBNDksIDB4NEUwNywgMHg4MTU1LCAweDZDNkEsIDB4NzM4QiwgMHg0RUExLAotICAgIDB4Njc4OSwgMHg3RjUxLCAweDVGODAsIDB4NjVGQSwgMHg2NzFCLCAweDVGRDgsIDB4NTk4NCwgMHg1QTAxLAotICAgIDB4NURDRCwgMHg1RkFFLCAweDUzNzEsIDB4OTdFNiwgMHg4RkRELCAweDY4NDUsIDB4NTZGNCwgMHg1NTJGLAotICAgIDB4NjBERiwgMHg0RTNBLCAweDZGNEQsIDB4N0VGNCwgMHg4MkM3LCAweDg0MEUsIDB4NTlENCwgMHg0RjFGLAotICAgIDB4NEYyQSwgMHg1QzNFLCAweDdFQUMsIDB4NjcyQSwgMHg4NTFBLCAweDU0NzMsIDB4NzU0RiwgMHg4MEMzLAotICAgIDB4NTU4MiwgMHg5QjRGLCAweDRGNEQsIDB4NkUyRCwgMHg4QzEzLCAweDVDMDksIDB4NjE3MCwgMHg1MzZCLAotICAgIDB4NzYxRiwgMHg2RTI5LCAweDg2OEEsIDB4NjU4NywgMHg5NUZCLCAweDdFQjksIDB4NTQzQiwgMHg3QTMzLAotICAgIDB4N0QwQSwgMHg5NUVFLCAweDU1RTEsIDB4N0ZDMSwgMHg3NEVFLCAweDYzMUQsIDB4ODcxNywgMHg2REExLAotICAgIDB4N0E5RCwgMHg2MjExLCAweDY1QTEsIDB4NTM2NywgMHg2M0UxLCAweDZDODMsIDB4NURFQiwgMHg1NDVDLAotICAgIDB4OTRBOCwgMHg0RTRDLCAweDZDNjEsIDB4OEJFQywgMHg1QzRCLCAweDY1RTAsIDB4ODI5QywgMHg2OEE3LAotICAgIDB4NTQzRSwgMHg1NDM0LCAweDZCQ0IsIDB4NkI2NiwgMHg0RTk0LCAweDYzNDIsIDB4NTM0OCwgMHg4MjFFLAotICAgIDB4NEYwRCwgMHg0RkFFLCAweDU3NUUsIDB4NjIwQSwgMHg5NkZFLCAweDY2NjQsIDB4NzI2OSwgMHg1MkZGLAotICAgIDB4NTJBMSwgMHg2MDlGLCAweDhCRUYsIDB4NjYxNCwgMHg3MTk5LCAweDY3OTAsIDB4ODk3RiwgMHg3ODUyLAotICAgIDB4NzdGRCwgMHg2NjcwLCAweDU2M0IsIDB4NTQzOCwgMHg5NTIxLCAweDcyN0EsIDB4N0EwMCwgMHg2MDZGLAotICAgIDB4NUUwQywgMHg2MDg5LCAweDgxOUQsIDB4NTkxNSwgMHg2MERDLCAweDcxODQsIDB4NzBFRiwgMHg2RUFBLAotICAgIDB4NkM1MCwgMHg3MjgwLCAweDZBODQsIDB4ODhBRCwgMHg1RTJELCAweDRFNjAsIDB4NUFCMywgMHg1NTlDLAotICAgIDB4OTRFMywgMHg2RDE3LCAweDdDRkIsIDB4OTY5OSwgMHg2MjBGLCAweDdFQzYsIDB4Nzc4RSwgMHg4NjdFLAotICAgIDB4NTMyMywgMHg5NzFFLCAweDhGOTYsIDB4NjY4NywgMHg1Q0UxLCAweDRGQTAsIDB4NzJFRCwgMHg0RTBCLAotICAgIDB4NTNBNiwgMHg1OTBGLCAweDU0MTMsIDB4NjM4MCwgMHg5NTI4LCAweDUxNDgsIDB4NEVEOSwgMHg5QzlDLAotICAgIDB4N0VBNCwgMHg1NEI4LCAweDhEMjQsIDB4ODg1NCwgMHg4MjM3LCAweDk1RjIsIDB4NkQ4RSwgMHg1RjI2LAotICAgIDB4NUFDQywgMHg2NjNFLCAweDk2NjksIDB4NzNCMCwgMHg3MzJFLCAweDUzQkYsIDB4ODE3QSwgMHg5OTg1LAotICAgIDB4N0ZBMSwgMHg1QkFBLCAweDk2NzcsIDB4OTY1MCwgMHg3RUJGLCAweDc2RjgsIDB4NTNBMiwgMHg5NTc2LAotICAgIDB4OTk5OSwgMHg3QkIxLCAweDg5NDQsIDB4NkU1OCwgMHg0RTYxLCAweDdGRDQsIDB4Nzk2NSwgMHg4QkU2LAotICAgIDB4NjBGMywgMHg1NENELCAweDRFQUIsIDB4OTg3OSwgMHg1REY3LCAweDZBNjEsIDB4NTBDRiwgMHg1NDExLAotICAgIDB4OEM2MSwgMHg4NDI3LCAweDc4NUQsIDB4OTcwNCwgMHg1MjRBLCAweDU0RUUsIDB4NTZBMywgMHg5NTAwLAotICAgIDB4NkQ4OCwgMHg1QkI1LCAweDZEQzYsIDB4NjY1MywgMHg1QzBGLCAweDVCNUQsIDB4NjgyMSwgMHg4MDk2LAotICAgIDB4NTU3OCwgMHg3QjExLCAweDY1NDgsIDB4Njk1NCwgMHg0RTlCLCAweDZCNDcsIDB4ODc0RSwgMHg5NzhCLAotICAgIDB4NTM0RiwgMHg2MzFGLCAweDY0M0EsIDB4OTBBQSwgMHg2NTlDLCAweDgwQzEsIDB4OEMxMCwgMHg1MTk5LAotICAgIDB4NjhCMCwgMHg1Mzc4LCAweDg3RjksIDB4NjFDOCwgMHg2Q0M0LCAweDZDRkIsIDB4OEMyMiwgMHg1QzUxLAotICAgIDB4ODVBQSwgMHg4MkFGLCAweDk1MEMsIDB4NkIyMywgMHg4RjlCLCAweDY1QjAsIDB4NUZGQiwgMHg1RkMzLAotICAgIDB4NEZFMSwgMHg4ODQ1LCAweDY2MUYsIDB4ODE2NSwgMHg3MzI5LCAweDYwRkEsIDB4NTE3NCwgMHg1MjExLAotICAgIDB4NTc4QiwgMHg1RjYyLCAweDkwQTIsIDB4ODg0QywgMHg5MTkyLCAweDVFNzgsIDB4Njc0RiwgMHg2MDI3LAotICAgIDB4NTlEMywgMHg1MTQ0LCAweDUxRjYsIDB4ODBGOCwgMHg1MzA4LCAweDZDNzksIDB4OTZDNCwgMHg3MThBLAotICAgIDB4NEYxMSwgMHg0RkVFLCAweDdGOUUsIDB4NjczRCwgMHg1NUM1LCAweDk1MDgsIDB4NzlDMCwgMHg4ODk2LAotICAgIDB4N0VFMywgMHg1ODlGLCAweDYyMEMsIDB4OTcwMCwgMHg4NjVBLCAweDU2MTgsIDB4OTg3QiwgMHg1RjkwLAotICAgIDB4OEJCOCwgMHg4NEM0LCAweDkxNTcsIDB4NTNEOSwgMHg2NUVELCAweDVFOEYsIDB4NzU1QywgMHg2MDY0LAotICAgIDB4N0Q2RSwgMHg1QTdGLCAweDdFRUEsIDB4N0VFRCwgMHg4RjY5LCAweDU1QTcsIDB4NUJBMywgMHg2MEFDLAotICAgIDB4NjVDQiwgMHg3Mzg0LCAweDkwMDksIDB4NzY2MywgMHg3NzI5LCAweDdFREEsIDB4OTc3NCwgMHg4NTlCLAotICAgIDB4NUI2NiwgMHg3QTc0LCAweDk2RUEsIDB4ODg0MCwgMHg1MkNCLCAweDcxOEYsIDB4NUZBQSwgMHg2NUVDLAotICAgIDB4OEJFMiwgMHg1QkZCLCAweDlBNkYsIDB4NURFMSwgMHg2Qjg5LCAweDZDNUIsIDB4OEJBRCwgMHg4QkFGLAotICAgIDB4OTAwQSwgMHg4RkM1LCAweDUzOEIsIDB4NjJCQywgMHg5RTI2LCAweDlFMkQsIDB4NTQ0MCwgMHg0RTJCLAotICAgIDB4ODJCRCwgMHg3MjU5LCAweDg2OUMsIDB4NUQxNiwgMHg4ODU5LCAweDZEQUYsIDB4OTZDNSwgMHg1NEQxLAotICAgIDB4NEU5QSwgMHg4QkI2LCAweDcxMDksIDB4NTRCRCwgMHg5NjA5LCAweDcwREYsIDB4NkRGOSwgMHg3NkQwLAotICAgIDB4NEUyNSwgMHg3ODE0LCAweDg3MTIsIDB4NUNBOSwgMHg1RUY2LCAweDhBMDAsIDB4OTg5QywgMHg5NjBFLAotICAgIDB4NzA4RSwgMHg2Q0JGLCAweDU5NDQsIDB4NjNBOSwgMHg3NzNDLCAweDg4NEQsIDB4NkYxNCwgMHg4MjczLAotICAgIDB4NTgzMCwgMHg3MUQ1LCAweDUzOEMsIDB4NzgxQSwgMHg5NkMxLCAweDU1MDEsIDB4NUY2NiwgMHg3MTMwLAotICAgIDB4NUJCNCwgMHg4QzFBLCAweDlBOEMsIDB4NkI4MywgMHg1OTJFLCAweDlFMkYsIDB4NzlFNywgMHg2NzY4LAotICAgIDB4NjI2QywgMHg0RjZGLCAweDc1QTEsIDB4N0Y4QSwgMHg2RDBCLCAweDk2MzMsIDB4NkMyNywgMHg0RUYwLAotICAgIDB4NzVEMiwgMHg1MTdCLCAweDY4MzcsIDB4NkYzRSwgMHg5MDgwLCAweDgxNzAsIDB4NTk5NiwgMHg3NDc2LAotICAgIDB4NjQ0NywgMHg1QzI3LCAweDkwNjUsIDB4N0E5MSwgMHg4QzIzLCAweDU5REEsIDB4NTRBQywgMHg4MjAwLAotICAgIDB4ODM2RiwgMHg4OTgxLCAweDgwMDAsIDB4NjkzMCwgMHg1NjRFLCAweDgwMzYsIDB4NzIzNywgMHg5MUNFLAotICAgIDB4NTFCNiwgMHg0RTVGLCAweDk4NzUsIDB4NjM5NiwgMHg0RTFBLCAweDUzRjYsIDB4NjZGMywgMHg4MTRCLAotICAgIDB4NTkxQywgMHg2REIyLCAweDRFMDAsIDB4NThGOSwgMHg1MzNCLCAweDYzRDYsIDB4OTRGMSwgMHg0RjlELAotICAgIDB4NEYwQSwgMHg4ODYzLCAweDk4OTAsIDB4NTkzNywgMHg5MDU3LCAweDc5RkIsIDB4NEVFQSwgMHg4MEYwLAotICAgIDB4NzU5MSwgMHg2QzgyLCAweDVCOUMsIDB4NTlFOCwgMHg1RjVELCAweDY5MDUsIDB4ODY4MSwgMHg1MDFBLAotICAgIDB4NURGMiwgMHg0RTU5LCAweDc3RTMsIDB4NEVFNSwgMHg4MjdBLCAweDYyOTEsIDB4NjYxMywgMHg5MDkxLAotICAgIDB4NUM3OSwgMHg0RUJGLCAweDVGNzksIDB4ODFDNiwgMHg5MDM4LCAweDgwODQsIDB4NzVBQiwgMHg0RUE2LAotICAgIDB4ODhENCwgMHg2MTBGLCAweDZCQzUsIDB4NUZDNiwgMHg0RTQ5LCAweDc2Q0EsIDB4NkVBMiwgMHg4QkUzLAotICAgIDB4OEJBRSwgMHg4QzBBLCAweDhCRDEsIDB4NUYwMiwgMHg3RkZDLCAweDdGQ0MsIDB4N0VDRSwgMHg4MzM1LAotICAgIDB4ODM2QiwgMHg1NkUwLCAweDZCQjcsIDB4OTdGMywgMHg5NjM0LCAweDU5RkIsIDB4NTQxRiwgMHg5NEY2LAotICAgIDB4NkRFQiwgMHg1QkM1LCAweDk5NkUsIDB4NUMzOSwgMHg1RjE1LCAweDk2OTAsIDB4NTM3MCwgMHg4MkYxLAotICAgIDB4NkEzMSwgMHg1QTc0LCAweDlFNzAsIDB4NUU5NCwgMHg3RjI4LCAweDgzQjksIDB4ODQyNCwgMHg4NDI1LAotICAgIDB4ODM2NywgMHg4NzQ3LCAweDhGQ0UsIDB4OEQ2MiwgMHg3NkM4LCAweDVGNzEsIDB4OTg5NiwgMHg3ODZDLAotICAgIDB4NjYyMCwgMHg1NERGLCAweDYyRTUsIDB4NEY2MywgMHg4MUMzLCAweDc1QzgsIDB4NUVCOCwgMHg5NkNELAotICAgIDB4OEUwQSwgMHg4NkY5LCAweDU0OEYsIDB4NkNGMywgMHg2RDhDLCAweDZDMzgsIDB4NjA3RiwgMHg1MkM3LAotICAgIDB4NzUyOCwgMHg1RTdELCAweDRGMTgsIDB4NjBBMCwgMHg1RkU3LCAweDVDMjQsIDB4NzUzMSwgMHg5MEFFLAotICAgIDB4OTRDMCwgMHg3MkI5LCAweDZDQjksIDB4NkUzOCwgMHg5MTQ5LCAweDY3MDksIDB4NTNDQiwgMHg1M0YzLAotICAgIDB4NEY1MSwgMHg5MUM5LCAweDhCRjEsIDB4NTNDOCwgMHg1RTdDLCAweDhGQzIsIDB4NkRFNCwgMHg0RThFLAotICAgIDB4NzZDMiwgMHg2OTg2LCAweDg2NUUsIDB4NjExQSwgMHg4MjA2LCAweDRGNTksIDB4NEZERSwgMHg5MDNFLAotICAgIDB4OUM3QywgMHg2MTA5LCAweDZFMUQsIDB4NkUxNCwgMHg5Njg1LCAweDRFODgsIDB4NUEzMSwgMHg5NkU4LAotICAgIDB4NEUwRSwgMHg1QzdGLCAweDc5QjksIDB4NUI4NywgMHg4QkVELCAweDdGQkQsIDB4NzM4OSwgMHg1N0RGLAotICAgIDB4ODI4QiwgMHg5MEMxLCAweDU0MDEsIDB4OTA0NywgMHg1NUJCLCAweDVDRUEsIDB4NUZBMSwgMHg2MTA4LAotICAgIDB4NkIzMiwgMHg3MkYxLCAweDgwQjIsIDB4OEE4OSwgMHg2RDc0LCAweDVCRDMsIDB4ODhENSwgMHg5ODg0LAotICAgIDB4OEM2QiwgMHg5QTZELCAweDlFMzMsIDB4NkUwQSwgMHg1MUE0LCAweDUxNDMsIDB4NTdBMywgMHg4ODgxLAotICAgIDB4NTM5RiwgMHg2M0Y0LCAweDhGOTUsIDB4NTZFRCwgMHg1NDU4LCAweDU3MDYsIDB4NzMzRiwgMHg2RTkwLAotICAgIDB4N0YxOCwgMHg4RkRDLCAweDgyRDEsIDB4NjEzRiwgMHg2MDI4LCAweDk2NjIsIDB4NjZGMCwgMHg3RUE2LAotICAgIDB4OEQ4QSwgMHg4REMzLCAweDk0QTUsIDB4NUNCMywgMHg3Q0E0LCAweDY3MDgsIDB4NjBBNiwgMHg5NjA1LAotICAgIDB4ODAxOCwgMHg0RTkxLCAweDkwRTcsIDB4NTMwMCwgMHg5NjY4LCAweDUxNDEsIDB4OEZEMCwgMHg4NTc0LAotICAgIDB4OTE1RCwgMHg2NjU1LCAweDk3RjUsIDB4NUI1NSwgMHg1MzFELCAweDc4MzgsIDB4Njc0MiwgMHg2ODNELAotICAgIDB4NTRDOSwgMHg3MDdFLCAweDVCQjAsIDB4OEY3RCwgMHg1MThELCAweDU3MjgsIDB4NTRCMSwgMHg2NTEyLAotICAgIDB4NjY4MiwgMHg4RDVFLCAweDhENDMsIDB4ODEwRiwgMHg4NDZDLCAweDkwNkQsIDB4N0NERiwgMHg1MUZGLAotICAgIDB4ODVGQiwgMHg2N0EzLCAweDY1RTksIDB4NkZBMSwgMHg4NkE0LCAweDhFODEsIDB4NTY2QSwgMHg5MDIwLAotICAgIDB4NzY4MiwgMHg3MDc2LCAweDcxRTUsIDB4OEQyMywgMHg2MkU5LCAweDUyMTksIDB4NkNGRCwgMHg4RDNDLAotICAgIDB4NjAwRSwgMHg1ODlFLCAweDYxOEUsIDB4NjZGRSwgMHg4RDYwLCAweDYyNEUsIDB4NTVCMywgMHg2RTIzLAotICAgIDB4NjcyRCwgMHg4RjY3LCAweDk0RTEsIDB4OTVGOCwgMHg3NzI4LCAweDY4MDUsIDB4NjlBOCwgMHg1NDhCLAotICAgIDB4NEU0RCwgMHg3MEI4LCAweDhCQzgsIDB4NjQ1OCwgMHg2NThCLCAweDVCODUsIDB4N0E4NCwgMHg1MDNBLAotICAgIDB4NUJFOCwgMHg3N0JCLCAweDZCRTEsIDB4OEE3OSwgMHg3Qzk4LCAweDZDQkUsIDB4NzZDRiwgMHg2NUE5LAotICAgIDB4OEY5NywgMHg1RDJELCAweDVDNTUsIDB4ODYzOCwgMHg2ODA4LCAweDUzNjAsIDB4NjIxOCwgMHg3QUQ5LAotICAgIDB4NkU1QiwgMHg3RUZELCAweDZBMUYsIDB4N0FFMCwgMHg1RjcwLCAweDZGMzMsIDB4NUYyMCwgMHg2MzhDLAotICAgIDB4NkRBOCwgMHg2NzU2LCAweDRFMDgsIDB4NUUxMCwgMHg4RDI2LCAweDRFRDcsIDB4ODBDMCwgMHg3NjM0LAotICAgIDB4OTY5QywgMHg2MkRCLCAweDY2MkQsIDB4NjI3RSwgMHg2Q0JDLCAweDhENzUsIDB4NzE2NywgMHg3RjY5LAotICAgIDB4NTE0NiwgMHg4MDg3LCAweDUzRUMsIDB4OTA2RSwgMHg2Mjk4LCAweDU0RjIsIDB4ODZGMCwgMHg4Rjk5LAotICAgIDB4ODAwNSwgMHg5NTE3LCAweDg1MTcsIDB4OEZEOSwgMHg2RDU5LCAweDczQ0QsIDB4NjU5RiwgMHg3NzFGLAotICAgIDB4NzUwNCwgMHg3ODI3LCAweDgxRkIsIDB4OEQxRSwgMHg5NDg4LCAweDRGQTYsIDB4Njc5NSwgMHg3NUI5LAotICAgIDB4OEJDQSwgMHg5NzA3LCAweDYzMkYsIDB4OTU0NywgMHg5NjM1LCAweDg0QjgsIDB4NjMyMywgMHg3NzQxLAotICAgIDB4NUY4MSwgMHg3MkYwLCAweDRFODksIDB4NjAxNCwgMHg2NTc0LCAweDYyRUYsIDB4NkI2MywgMHg2NTNGLAotICAgIDB4NUUyNywgMHg3NUM3LCAweDkwRDEsIDB4OEJDMSwgMHg4MjlELCAweDY3OUQsIDB4NjUyRiwgMHg1NDMxLAotICAgIDB4ODcxOCwgMHg3N0U1LCAweDgwQTIsIDB4ODEwMiwgMHg2QzQxLCAweDRFNEIsIDB4N0VDNywgMHg4MDRDLAotICAgIDB4NzZGNCwgMHg2OTBELCAweDZCOTYsIDB4NjI2NywgMHg1MDNDLCAweDRGODQsIDB4NTc0MCwgMHg2MzA3LAotICAgIDB4NkI2MiwgMHg4REJFLCAweDUzRUEsIDB4NjVFOCwgMHg3RUI4LCAweDVGRDcsIDB4NjMxQSwgMHg2M0I3LAotICAgIDB4ODFGMywgMHg4MUY0LCAweDdGNkUsIDB4NUUxQywgMHg1Q0Q5LCAweDUyMzYsIDB4NjY3QSwgMHg3OUU5LAotICAgIDB4N0ExQSwgMHg4RDI4LCAweDcwOTksIDB4NzVENCwgMHg2RURFLCAweDZDQkIsIDB4N0E5MiwgMHg0RTJELAotICAgIDB4NzZDNSwgMHg1RkUwLCAweDk0OUYsIDB4ODg3NywgMHg3RUM4LCAweDc5Q0QsIDB4ODBCRiwgMHg5MUNELAotICAgIDB4NEVGMiwgMHg0RjE3LCAweDgyMUYsIDB4NTQ2OCwgMHg1RERFLCAweDZEMzIsIDB4OEJDQywgMHg3Q0E1LAotICAgIDB4OEY3NCwgMHg4MDk4LCAweDVFMUEsIDB4NTQ5MiwgMHg3NkIxLCAweDVCOTksIDB4NjYzQywgMHg5QUE0LAotICAgIDB4NzNFMCwgMHg2ODJBLCAweDg2REIsIDB4NjczMSwgMHg3MzJBLCAweDhCRjgsIDB4OEJEQiwgMHg5MDEwLAotICAgIDB4N0FGOSwgMHg3MERCLCAweDcxNkUsIDB4NjJDNCwgMHg3N0E5LCAweDU2MzEsIDB4NEUzQiwgMHg4NDU3LAotICAgIDB4NjdGMSwgMHg1MkE5LCAweDg2QzAsIDB4OEQyRSwgMHg5NEY4LCAweDdCNTEsIDB4NEY0RiwgMHg2Q0U4LAotICAgIDB4Nzk1RCwgMHg5QTdCLCAweDYyOTMsIDB4NzIyQSwgMHg2MkZELCAweDRFMTMsIDB4NzgxNiwgMHg4RjZDLAotICAgIDB4NjRCMCwgMHg4RDVBLCAweDdCQzYsIDB4Njg2OSwgMHg1RTg0LCAweDg4QzUsIDB4NTk4NiwgMHg2NDlFLAotICAgIDB4NThFRSwgMHg3MkI2LCAweDY5MEUsIDB4OTUyNSwgMHg4RkZELCAweDhENTgsIDB4NTc2MCwgMHg3RjAwLAotICAgIDB4OEMwNiwgMHg1MUM2LCAweDYzNDksIDB4NjJEOSwgMHg1MzUzLCAweDY4NEMsIDB4NzQyMiwgMHg4MzAxLAotICAgIDB4OTE0QywgMHg1NTQ0LCAweDc3NDAsIDB4NzA3QywgMHg2RDRBLCAweDUxNzksIDB4NTRBOCwgMHg4RDQ0LAotICAgIDB4NTlGRiwgMHg2RUNCLCAweDZEQzQsIDB4NUI1QywgMHg3RDJCLCAweDRFRDQsIDB4N0M3RCwgMHg2RUQzLAotICAgIDB4NUI1MCwgMHg4MUVBLCAweDZFMEQsIDB4NUI1NywgMHg5QjAzLCAweDY4RDUsIDB4OEUyQSwgMHg1Qjk3LAotICAgIDB4N0VGQywgMHg2MDNCLCAweDdFQjUsIDB4OTBCOSwgMHg4RDcwLCAweDU5NEYsIDB4NjNDRCwgMHg3OURGLAotICAgIDB4OERCMywgMHg1MzUyLCAweDY1Q0YsIDB4Nzk1NiwgMHg4QkM1LCAweDk2M0IsIDB4N0VDNCwgMHg5NEJCLAotICAgIDB4N0U4MiwgMHg1NjM0LCAweDkxODksIDB4NjcwMCwgMHg3RjZBLCAweDVDMEEsIDB4OTA3NSwgMHg2NjI4LAotICAgIDB4NURFNiwgMHg0RjUwLCAweDY3REUsIDB4NTA1QSwgMHg0RjVDLCAweDU3NTAsIDB4NUVBNywgMHg0RThELAotICAgIDB4NEUwQywgMHg1MTQwLCAweDRFMTAsIDB4NUVGRiwgMHg1MzQ1LCAweDRFMTUsIDB4NEU5OCwgMHg0RTFFLAotICAgIDB4OUIzMiwgMHg1QjZDLCAweDU2NjksIDB4NEUyOCwgMHg3OUJBLCAweDRFM0YsIDB4NTMxNSwgMHg0RTQ3LAotICAgIDB4NTkyRCwgMHg3MjNCLCAweDUzNkUsIDB4NkMxMCwgMHg1NkRGLCAweDgwRTQsIDB4OTk5NywgMHg2QkQzLAotICAgIDB4Nzc3RSwgMHg5RjE3LCAweDRFMzYsIDB4NEU5RiwgMHg5RjEwLCAweDRFNUMsIDB4NEU2OSwgMHg0RTkzLAotICAgIDB4ODI4OCwgMHg1QjVCLCAweDU1NkMsIDB4NTYwRiwgMHg0RUM0LCAweDUzOEQsIDB4NTM5RCwgMHg1M0EzLAotICAgIDB4NTNBNSwgMHg1M0FFLCAweDk3NjUsIDB4OEQ1RCwgMHg1MzFBLCAweDUzRjUsIDB4NTMyNiwgMHg1MzJFLAotICAgIDB4NTMzRSwgMHg4RDVDLCAweDUzNjYsIDB4NTM2MywgMHg1MjAyLCAweDUyMDgsIDB4NTIwRSwgMHg1MjJELAotICAgIDB4NTIzMywgMHg1MjNGLCAweDUyNDAsIDB4NTI0QywgMHg1MjVFLCAweDUyNjEsIDB4NTI1QywgMHg4NEFGLAotICAgIDB4NTI3RCwgMHg1MjgyLCAweDUyODEsIDB4NTI5MCwgMHg1MjkzLCAweDUxODIsIDB4N0Y1NCwgMHg0RUJCLAotICAgIDB4NEVDMywgMHg0RUM5LCAweDRFQzIsIDB4NEVFOCwgMHg0RUUxLCAweDRFRUIsIDB4NEVERSwgMHg0RjFCLAotICAgIDB4NEVGMywgMHg0RjIyLCAweDRGNjQsIDB4NEVGNSwgMHg0RjI1LCAweDRGMjcsIDB4NEYwOSwgMHg0RjJCLAotICAgIDB4NEY1RSwgMHg0RjY3LCAweDY1MzgsIDB4NEY1QSwgMHg0RjVELCAweDRGNUYsIDB4NEY1NywgMHg0RjMyLAotICAgIDB4NEYzRCwgMHg0Rjc2LCAweDRGNzQsIDB4NEY5MSwgMHg0Rjg5LCAweDRGODMsIDB4NEY4RiwgMHg0RjdFLAotICAgIDB4NEY3QiwgMHg0RkFBLCAweDRGN0MsIDB4NEZBQywgMHg0Rjk0LCAweDRGRTYsIDB4NEZFOCwgMHg0RkVBLAotICAgIDB4NEZDNSwgMHg0RkRBLCAweDRGRTMsIDB4NEZEQywgMHg0RkQxLCAweDRGREYsIDB4NEZGOCwgMHg1MDI5LAotICAgIDB4NTA0QywgMHg0RkYzLCAweDUwMkMsIDB4NTAwRiwgMHg1MDJFLCAweDUwMkQsIDB4NEZGRSwgMHg1MDFDLAotICAgIDB4NTAwQywgMHg1MDI1LCAweDUwMjgsIDB4NTA3RSwgMHg1MDQzLCAweDUwNTUsIDB4NTA0OCwgMHg1MDRFLAotICAgIDB4NTA2QywgMHg1MDdCLCAweDUwQTUsIDB4NTBBNywgMHg1MEE5LCAweDUwQkEsIDB4NTBENiwgMHg1MTA2LAotICAgIDB4NTBFRCwgMHg1MEVDLCAweDUwRTYsIDB4NTBFRSwgMHg1MTA3LCAweDUxMEIsIDB4NEVERCwgMHg2QzNELAotICAgIDB4NEY1OCwgMHg0RjY1LCAweDRGQ0UsIDB4OUZBMCwgMHg2QzQ2LCAweDdDNzQsIDB4NTE2RSwgMHg1REZELAotICAgIDB4OUVDOSwgMHg5OTk4LCAweDUxODEsIDB4NTkxNCwgMHg1MkY5LCAweDUzMEQsIDB4OEEwNywgMHg1MzEwLAotICAgIDB4NTFFQiwgMHg1OTE5LCAweDUxNTUsIDB4NEVBMCwgMHg1MTU2LCAweDRFQjMsIDB4ODg2RSwgMHg4OEE0LAotICAgIDB4NEVCNSwgMHg4MTE0LCAweDg4RDIsIDB4Nzk4MCwgMHg1QjM0LCAweDg4MDMsIDB4N0ZCOCwgMHg1MUFCLAotICAgIDB4NTFCMSwgMHg1MUJELCAweDUxQkMsIDB4NTFDNywgMHg1MTk2LCAweDUxQTIsIDB4NTFBNSwgMHg4QkEwLAotICAgIDB4OEJBNiwgMHg4QkE3LCAweDhCQUEsIDB4OEJCNCwgMHg4QkI1LCAweDhCQjcsIDB4OEJDMiwgMHg4QkMzLAotICAgIDB4OEJDQiwgMHg4QkNGLCAweDhCQ0UsIDB4OEJEMiwgMHg4QkQzLCAweDhCRDQsIDB4OEJENiwgMHg4QkQ4LAotICAgIDB4OEJEOSwgMHg4QkRDLCAweDhCREYsIDB4OEJFMCwgMHg4QkU0LCAweDhCRTgsIDB4OEJFOSwgMHg4QkVFLAotICAgIDB4OEJGMCwgMHg4QkYzLCAweDhCRjYsIDB4OEJGOSwgMHg4QkZDLCAweDhCRkYsIDB4OEMwMCwgMHg4QzAyLAotICAgIDB4OEMwNCwgMHg4QzA3LCAweDhDMEMsIDB4OEMwRiwgMHg4QzExLCAweDhDMTIsIDB4OEMxNCwgMHg4QzE1LAotICAgIDB4OEMxNiwgMHg4QzE5LCAweDhDMUIsIDB4OEMxOCwgMHg4QzFELCAweDhDMUYsIDB4OEMyMCwgMHg4QzIxLAotICAgIDB4OEMyNSwgMHg4QzI3LCAweDhDMkEsIDB4OEMyQiwgMHg4QzJFLCAweDhDMkYsIDB4OEMzMiwgMHg4QzMzLAotICAgIDB4OEMzNSwgMHg4QzM2LCAweDUzNjksIDB4NTM3QSwgMHg5NjFELCAweDk2MjIsIDB4OTYyMSwgMHg5NjMxLAotICAgIDB4OTYyQSwgMHg5NjNELCAweDk2M0MsIDB4OTY0MiwgMHg5NjQ5LCAweDk2NTQsIDB4OTY1RiwgMHg5NjY3LAotICAgIDB4OTY2QywgMHg5NjcyLCAweDk2NzQsIDB4OTY4OCwgMHg5NjhELCAweDk2OTcsIDB4OTZCMCwgMHg5MDk3LAotICAgIDB4OTA5QiwgMHg5MDlELCAweDkwOTksIDB4OTBBQywgMHg5MEExLCAweDkwQjQsIDB4OTBCMywgMHg5MEI2LAotICAgIDB4OTBCQSwgMHg5MEI4LCAweDkwQjAsIDB4OTBDRiwgMHg5MEM1LCAweDkwQkUsIDB4OTBEMCwgMHg5MEM0LAotICAgIDB4OTBDNywgMHg5MEQzLCAweDkwRTYsIDB4OTBFMiwgMHg5MERDLCAweDkwRDcsIDB4OTBEQiwgMHg5MEVCLAotICAgIDB4OTBFRiwgMHg5MEZFLCAweDkxMDQsIDB4OTEyMiwgMHg5MTFFLCAweDkxMjMsIDB4OTEzMSwgMHg5MTJGLAotICAgIDB4OTEzOSwgMHg5MTQzLCAweDkxNDYsIDB4NTIwRCwgMHg1OTQyLCAweDUyQTIsIDB4NTJBQywgMHg1MkFELAotICAgIDB4NTJCRSwgMHg1NEZGLCAweDUyRDAsIDB4NTJENiwgMHg1MkYwLCAweDUzREYsIDB4NzFFRSwgMHg3N0NELAotICAgIDB4NUVGNCwgMHg1MUY1LCAweDUxRkMsIDB4OUIyRiwgMHg1M0I2LCAweDVGMDEsIDB4NzU1QSwgMHg1REVGLAotICAgIDB4NTc0QywgMHg1N0E5LCAweDU3QTEsIDB4NTg3RSwgMHg1OEJDLCAweDU4QzUsIDB4NThEMSwgMHg1NzI5LAotICAgIDB4NTcyQywgMHg1NzJBLCAweDU3MzMsIDB4NTczOSwgMHg1NzJFLCAweDU3MkYsIDB4NTc1QywgMHg1NzNCLAotICAgIDB4NTc0MiwgMHg1NzY5LCAweDU3ODUsIDB4NTc2QiwgMHg1Nzg2LCAweDU3N0MsIDB4NTc3QiwgMHg1NzY4LAotICAgIDB4NTc2RCwgMHg1Nzc2LCAweDU3NzMsIDB4NTdBRCwgMHg1N0E0LCAweDU3OEMsIDB4NTdCMiwgMHg1N0NGLAotICAgIDB4NTdBNywgMHg1N0I0LCAweDU3OTMsIDB4NTdBMCwgMHg1N0Q1LCAweDU3RDgsIDB4NTdEQSwgMHg1N0Q5LAotICAgIDB4NTdEMiwgMHg1N0I4LCAweDU3RjQsIDB4NTdFRiwgMHg1N0Y4LCAweDU3RTQsIDB4NTdERCwgMHg1ODBCLAotICAgIDB4NTgwRCwgMHg1N0ZELCAweDU3RUQsIDB4NTgwMCwgMHg1ODFFLCAweDU4MTksIDB4NTg0NCwgMHg1ODIwLAotICAgIDB4NTg2NSwgMHg1ODZDLCAweDU4ODEsIDB4NTg4OSwgMHg1ODlBLCAweDU4ODAsIDB4OTlBOCwgMHg5RjE5LAotICAgIDB4NjFGRiwgMHg4Mjc5LCAweDgyN0QsIDB4ODI3RiwgMHg4MjhGLCAweDgyOEEsIDB4ODJBOCwgMHg4Mjg0LAotICAgIDB4ODI4RSwgMHg4MjkxLCAweDgyOTcsIDB4ODI5OSwgMHg4MkFCLCAweDgyQjgsIDB4ODJCRSwgMHg4MkIwLAotICAgIDB4ODJDOCwgMHg4MkNBLCAweDgyRTMsIDB4ODI5OCwgMHg4MkI3LCAweDgyQUUsIDB4ODJDQiwgMHg4MkNDLAotICAgIDB4ODJDMSwgMHg4MkE5LCAweDgyQjQsIDB4ODJBMSwgMHg4MkFBLCAweDgyOUYsIDB4ODJDNCwgMHg4MkNFLAotICAgIDB4ODJBNCwgMHg4MkUxLCAweDgzMDksIDB4ODJGNywgMHg4MkU0LCAweDgzMEYsIDB4ODMwNywgMHg4MkRDLAotICAgIDB4ODJGNCwgMHg4MkQyLCAweDgyRDgsIDB4ODMwQywgMHg4MkZCLCAweDgyRDMsIDB4ODMxMSwgMHg4MzFBLAotICAgIDB4ODMwNiwgMHg4MzE0LCAweDgzMTUsIDB4ODJFMCwgMHg4MkQ1LCAweDgzMUMsIDB4ODM1MSwgMHg4MzVCLAotICAgIDB4ODM1QywgMHg4MzA4LCAweDgzOTIsIDB4ODMzQywgMHg4MzM0LCAweDgzMzEsIDB4ODM5QiwgMHg4MzVFLAotICAgIDB4ODMyRiwgMHg4MzRGLCAweDgzNDcsIDB4ODM0MywgMHg4MzVGLCAweDgzNDAsIDB4ODMxNywgMHg4MzYwLAotICAgIDB4ODMyRCwgMHg4MzNBLCAweDgzMzMsIDB4ODM2NiwgMHg4MzY1LCAweDgzNjgsIDB4ODMxQiwgMHg4MzY5LAotICAgIDB4ODM2QywgMHg4MzZBLCAweDgzNkQsIDB4ODM2RSwgMHg4M0IwLCAweDgzNzgsIDB4ODNCMywgMHg4M0I0LAotICAgIDB4ODNBMCwgMHg4M0FBLCAweDgzOTMsIDB4ODM5QywgMHg4Mzg1LCAweDgzN0MsIDB4ODNCNiwgMHg4M0E5LAotICAgIDB4ODM3RCwgMHg4M0I4LCAweDgzN0IsIDB4ODM5OCwgMHg4MzlFLCAweDgzQTgsIDB4ODNCQSwgMHg4M0JDLAotICAgIDB4ODNDMSwgMHg4NDAxLCAweDgzRTUsIDB4ODNEOCwgMHg1ODA3LCAweDg0MTgsIDB4ODQwQiwgMHg4M0RELAotICAgIDB4ODNGRCwgMHg4M0Q2LCAweDg0MUMsIDB4ODQzOCwgMHg4NDExLCAweDg0MDYsIDB4ODNENCwgMHg4M0RGLAotICAgIDB4ODQwRiwgMHg4NDAzLCAweDgzRjgsIDB4ODNGOSwgMHg4M0VBLCAweDgzQzUsIDB4ODNDMCwgMHg4NDI2LAotICAgIDB4ODNGMCwgMHg4M0UxLCAweDg0NUMsIDB4ODQ1MSwgMHg4NDVBLCAweDg0NTksIDB4ODQ3MywgMHg4NDg3LAotICAgIDB4ODQ4OCwgMHg4NDdBLCAweDg0ODksIDB4ODQ3OCwgMHg4NDNDLCAweDg0NDYsIDB4ODQ2OSwgMHg4NDc2LAotICAgIDB4ODQ4QywgMHg4NDhFLCAweDg0MzEsIDB4ODQ2RCwgMHg4NEMxLCAweDg0Q0QsIDB4ODREMCwgMHg4NEU2LAotICAgIDB4ODRCRCwgMHg4NEQzLCAweDg0Q0EsIDB4ODRCRiwgMHg4NEJBLCAweDg0RTAsIDB4ODRBMSwgMHg4NEI5LAotICAgIDB4ODRCNCwgMHg4NDk3LCAweDg0RTUsIDB4ODRFMywgMHg4NTBDLCAweDc1MEQsIDB4ODUzOCwgMHg4NEYwLAotICAgIDB4ODUzOSwgMHg4NTFGLCAweDg1M0EsIDB4ODU1NiwgMHg4NTNCLCAweDg0RkYsIDB4ODRGQywgMHg4NTU5LAotICAgIDB4ODU0OCwgMHg4NTY4LCAweDg1NjQsIDB4ODU1RSwgMHg4NTdBLCAweDc3QTIsIDB4ODU0MywgMHg4NTcyLAotICAgIDB4ODU3QiwgMHg4NUE0LCAweDg1QTgsIDB4ODU4NywgMHg4NThGLCAweDg1NzksIDB4ODVBRSwgMHg4NTlDLAotICAgIDB4ODU4NSwgMHg4NUI5LCAweDg1QjcsIDB4ODVCMCwgMHg4NUQzLCAweDg1QzEsIDB4ODVEQywgMHg4NUZGLAotICAgIDB4ODYyNywgMHg4NjA1LCAweDg2MjksIDB4ODYxNiwgMHg4NjNDLCAweDVFRkUsIDB4NUYwOCwgMHg1OTNDLAotICAgIDB4NTk0MSwgMHg4MDM3LCAweDU5NTUsIDB4NTk1QSwgMHg1OTU4LCAweDUzMEYsIDB4NUMyMiwgMHg1QzI1LAotICAgIDB4NUMyQywgMHg1QzM0LCAweDYyNEMsIDB4NjI2QSwgMHg2MjlGLCAweDYyQkIsIDB4NjJDQSwgMHg2MkRBLAotICAgIDB4NjJENywgMHg2MkVFLCAweDYzMjIsIDB4NjJGNiwgMHg2MzM5LCAweDYzNEIsIDB4NjM0MywgMHg2M0FELAotICAgIDB4NjNGNiwgMHg2MzcxLCAweDYzN0EsIDB4NjM4RSwgMHg2M0I0LCAweDYzNkQsIDB4NjNBQywgMHg2MzhBLAotICAgIDB4NjM2OSwgMHg2M0FFLCAweDYzQkMsIDB4NjNGMiwgMHg2M0Y4LCAweDYzRTAsIDB4NjNGRiwgMHg2M0M0LAotICAgIDB4NjNERSwgMHg2M0NFLCAweDY0NTIsIDB4NjNDNiwgMHg2M0JFLCAweDY0NDUsIDB4NjQ0MSwgMHg2NDBCLAotICAgIDB4NjQxQiwgMHg2NDIwLCAweDY0MEMsIDB4NjQyNiwgMHg2NDIxLCAweDY0NUUsIDB4NjQ4NCwgMHg2NDZELAotICAgIDB4NjQ5NiwgMHg2NDdBLCAweDY0QjcsIDB4NjRCOCwgMHg2NDk5LCAweDY0QkEsIDB4NjRDMCwgMHg2NEQwLAotICAgIDB4NjRENywgMHg2NEU0LCAweDY0RTIsIDB4NjUwOSwgMHg2NTI1LCAweDY1MkUsIDB4NUYwQiwgMHg1RkQyLAotICAgIDB4NzUxOSwgMHg1RjExLCAweDUzNUYsIDB4NTNGMSwgMHg1M0ZELCAweDUzRTksIDB4NTNFOCwgMHg1M0ZCLAotICAgIDB4NTQxMiwgMHg1NDE2LCAweDU0MDYsIDB4NTQ0QiwgMHg1NDUyLCAweDU0NTMsIDB4NTQ1NCwgMHg1NDU2LAotICAgIDB4NTQ0MywgMHg1NDIxLCAweDU0NTcsIDB4NTQ1OSwgMHg1NDIzLCAweDU0MzIsIDB4NTQ4MiwgMHg1NDk0LAotICAgIDB4NTQ3NywgMHg1NDcxLCAweDU0NjQsIDB4NTQ5QSwgMHg1NDlCLCAweDU0ODQsIDB4NTQ3NiwgMHg1NDY2LAotICAgIDB4NTQ5RCwgMHg1NEQwLCAweDU0QUQsIDB4NTRDMiwgMHg1NEI0LCAweDU0RDIsIDB4NTRBNywgMHg1NEE2LAotICAgIDB4NTREMywgMHg1NEQ0LCAweDU0NzIsIDB4NTRBMywgMHg1NEQ1LCAweDU0QkIsIDB4NTRCRiwgMHg1NENDLAotICAgIDB4NTREOSwgMHg1NERBLCAweDU0REMsIDB4NTRBOSwgMHg1NEFBLCAweDU0QTQsIDB4NTRERCwgMHg1NENGLAotICAgIDB4NTRERSwgMHg1NTFCLCAweDU0RTcsIDB4NTUyMCwgMHg1NEZELCAweDU1MTQsIDB4NTRGMywgMHg1NTIyLAotICAgIDB4NTUyMywgMHg1NTBGLCAweDU1MTEsIDB4NTUyNywgMHg1NTJBLCAweDU1NjcsIDB4NTU4RiwgMHg1NUI1LAotICAgIDB4NTU0OSwgMHg1NTZELCAweDU1NDEsIDB4NTU1NSwgMHg1NTNGLCAweDU1NTAsIDB4NTUzQywgMHg1NTM3LAotICAgIDB4NTU1NiwgMHg1NTc1LCAweDU1NzYsIDB4NTU3NywgMHg1NTMzLCAweDU1MzAsIDB4NTU1QywgMHg1NThCLAotICAgIDB4NTVEMiwgMHg1NTgzLCAweDU1QjEsIDB4NTVCOSwgMHg1NTg4LCAweDU1ODEsIDB4NTU5RiwgMHg1NTdFLAotICAgIDB4NTVENiwgMHg1NTkxLCAweDU1N0IsIDB4NTVERiwgMHg1NUJELCAweDU1QkUsIDB4NTU5NCwgMHg1NTk5LAotICAgIDB4NTVFQSwgMHg1NUY3LCAweDU1QzksIDB4NTYxRiwgMHg1NUQxLCAweDU1RUIsIDB4NTVFQywgMHg1NUQ0LAotICAgIDB4NTVFNiwgMHg1NURELCAweDU1QzQsIDB4NTVFRiwgMHg1NUU1LCAweDU1RjIsIDB4NTVGMywgMHg1NUNDLAotICAgIDB4NTVDRCwgMHg1NUU4LCAweDU1RjUsIDB4NTVFNCwgMHg4Rjk0LCAweDU2MUUsIDB4NTYwOCwgMHg1NjBDLAotICAgIDB4NTYwMSwgMHg1NjI0LCAweDU2MjMsIDB4NTVGRSwgMHg1NjAwLCAweDU2MjcsIDB4NTYyRCwgMHg1NjU4LAotICAgIDB4NTYzOSwgMHg1NjU3LCAweDU2MkMsIDB4NTY0RCwgMHg1NjYyLCAweDU2NTksIDB4NTY1QywgMHg1NjRDLAotICAgIDB4NTY1NCwgMHg1Njg2LCAweDU2NjQsIDB4NTY3MSwgMHg1NjZCLCAweDU2N0IsIDB4NTY3QywgMHg1Njg1LAotICAgIDB4NTY5MywgMHg1NkFGLCAweDU2RDQsIDB4NTZENywgMHg1NkRELCAweDU2RTEsIDB4NTZGNSwgMHg1NkVCLAotICAgIDB4NTZGOSwgMHg1NkZGLCAweDU3MDQsIDB4NTcwQSwgMHg1NzA5LCAweDU3MUMsIDB4NUUwRiwgMHg1RTE5LAotICAgIDB4NUUxNCwgMHg1RTExLCAweDVFMzEsIDB4NUUzQiwgMHg1RTNDLCAweDVFMzcsIDB4NUU0NCwgMHg1RTU0LAotICAgIDB4NUU1QiwgMHg1RTVFLCAweDVFNjEsIDB4NUM4QywgMHg1QzdBLCAweDVDOEQsIDB4NUM5MCwgMHg1Qzk2LAotICAgIDB4NUM4OCwgMHg1Qzk4LCAweDVDOTksIDB4NUM5MSwgMHg1QzlBLCAweDVDOUMsIDB4NUNCNSwgMHg1Q0EyLAotICAgIDB4NUNCRCwgMHg1Q0FDLCAweDVDQUIsIDB4NUNCMSwgMHg1Q0EzLCAweDVDQzEsIDB4NUNCNywgMHg1Q0M0LAotICAgIDB4NUNEMiwgMHg1Q0U0LCAweDVDQ0IsIDB4NUNFNSwgMHg1RDAyLCAweDVEMDMsIDB4NUQyNywgMHg1RDI2LAotICAgIDB4NUQyRSwgMHg1RDI0LCAweDVEMUUsIDB4NUQwNiwgMHg1RDFCLCAweDVENTgsIDB4NUQzRSwgMHg1RDM0LAotICAgIDB4NUQzRCwgMHg1RDZDLCAweDVENUIsIDB4NUQ2RiwgMHg1RDVELCAweDVENkIsIDB4NUQ0QiwgMHg1RDRBLAotICAgIDB4NUQ2OSwgMHg1RDc0LCAweDVEODIsIDB4NUQ5OSwgMHg1RDlELCAweDhDNzMsIDB4NURCNywgMHg1REM1LAotICAgIDB4NUY3MywgMHg1Rjc3LCAweDVGODIsIDB4NUY4NywgMHg1Rjg5LCAweDVGOEMsIDB4NUY5NSwgMHg1Rjk5LAotICAgIDB4NUY5QywgMHg1RkE4LCAweDVGQUQsIDB4NUZCNSwgMHg1RkJDLCAweDg4NjIsIDB4NUY2MSwgMHg3MkFELAotICAgIDB4NzJCMCwgMHg3MkI0LCAweDcyQjcsIDB4NzJCOCwgMHg3MkMzLCAweDcyQzEsIDB4NzJDRSwgMHg3MkNELAotICAgIDB4NzJEMiwgMHg3MkU4LCAweDcyRUYsIDB4NzJFOSwgMHg3MkYyLCAweDcyRjQsIDB4NzJGNywgMHg3MzAxLAotICAgIDB4NzJGMywgMHg3MzAzLCAweDcyRkEsIDB4NzJGQiwgMHg3MzE3LCAweDczMTMsIDB4NzMyMSwgMHg3MzBBLAotICAgIDB4NzMxRSwgMHg3MzFELCAweDczMTUsIDB4NzMyMiwgMHg3MzM5LCAweDczMjUsIDB4NzMyQywgMHg3MzM4LAotICAgIDB4NzMzMSwgMHg3MzUwLCAweDczNEQsIDB4NzM1NywgMHg3MzYwLCAweDczNkMsIDB4NzM2RiwgMHg3MzdFLAotICAgIDB4ODIxQiwgMHg1OTI1LCAweDk4RTcsIDB4NTkyNCwgMHg1OTAyLCAweDk5NjMsIDB4OTk2NywgMHg5OTY4LAotICAgIDB4OTk2OSwgMHg5OTZBLCAweDk5NkIsIDB4OTk2QywgMHg5OTc0LCAweDk5NzcsIDB4OTk3RCwgMHg5OTgwLAotICAgIDB4OTk4NCwgMHg5OTg3LCAweDk5OEEsIDB4OTk4RCwgMHg5OTkwLCAweDk5OTEsIDB4OTk5MywgMHg5OTk0LAotICAgIDB4OTk5NSwgMHg1RTgwLCAweDVFOTEsIDB4NUU4QiwgMHg1RTk2LCAweDVFQTUsIDB4NUVBMCwgMHg1RUI5LAotICAgIDB4NUVCNSwgMHg1RUJFLCAweDVFQjMsIDB4OEQ1MywgMHg1RUQyLCAweDVFRDEsIDB4NUVEQiwgMHg1RUU4LAotICAgIDB4NUVFQSwgMHg4MUJBLCAweDVGQzQsIDB4NUZDOSwgMHg1RkQ2LCAweDVGQ0YsIDB4NjAwMywgMHg1RkVFLAotICAgIDB4NjAwNCwgMHg1RkUxLCAweDVGRTQsIDB4NUZGRSwgMHg2MDA1LCAweDYwMDYsIDB4NUZFQSwgMHg1RkVELAotICAgIDB4NUZGOCwgMHg2MDE5LCAweDYwMzUsIDB4NjAyNiwgMHg2MDFCLCAweDYwMEYsIDB4NjAwRCwgMHg2MDI5LAotICAgIDB4NjAyQiwgMHg2MDBBLCAweDYwM0YsIDB4NjAyMSwgMHg2MDc4LCAweDYwNzksIDB4NjA3QiwgMHg2MDdBLAotICAgIDB4NjA0MiwgMHg2MDZBLCAweDYwN0QsIDB4NjA5NiwgMHg2MDlBLCAweDYwQUQsIDB4NjA5RCwgMHg2MDgzLAotICAgIDB4NjA5MiwgMHg2MDhDLCAweDYwOUIsIDB4NjBFQywgMHg2MEJCLCAweDYwQjEsIDB4NjBERCwgMHg2MEQ4LAotICAgIDB4NjBDNiwgMHg2MERBLCAweDYwQjQsIDB4NjEyMCwgMHg2MTI2LCAweDYxMTUsIDB4NjEyMywgMHg2MEY0LAotICAgIDB4NjEwMCwgMHg2MTBFLCAweDYxMkIsIDB4NjE0QSwgMHg2MTc1LCAweDYxQUMsIDB4NjE5NCwgMHg2MUE3LAotICAgIDB4NjFCNywgMHg2MUQ0LCAweDYxRjUsIDB4NUZERCwgMHg5NkIzLCAweDk1RTksIDB4OTVFQiwgMHg5NUYxLAotICAgIDB4OTVGMywgMHg5NUY1LCAweDk1RjYsIDB4OTVGQywgMHg5NUZFLCAweDk2MDMsIDB4OTYwNCwgMHg5NjA2LAotICAgIDB4OTYwOCwgMHg5NjBBLCAweDk2MEIsIDB4OTYwQywgMHg5NjBELCAweDk2MEYsIDB4OTYxMiwgMHg5NjE1LAotICAgIDB4OTYxNiwgMHg5NjE3LCAweDk2MTksIDB4OTYxQSwgMHg0RTJDLCAweDcyM0YsIDB4NjIxNSwgMHg2QzM1LAotICAgIDB4NkM1NCwgMHg2QzVDLCAweDZDNEEsIDB4NkNBMywgMHg2Qzg1LCAweDZDOTAsIDB4NkM5NCwgMHg2QzhDLAotICAgIDB4NkM2OCwgMHg2QzY5LCAweDZDNzQsIDB4NkM3NiwgMHg2Qzg2LCAweDZDQTksIDB4NkNEMCwgMHg2Q0Q0LAotICAgIDB4NkNBRCwgMHg2Q0Y3LCAweDZDRjgsIDB4NkNGMSwgMHg2Q0Q3LCAweDZDQjIsIDB4NkNFMCwgMHg2Q0Q2LAotICAgIDB4NkNGQSwgMHg2Q0VCLCAweDZDRUUsIDB4NkNCMSwgMHg2Q0QzLCAweDZDRUYsIDB4NkNGRSwgMHg2RDM5LAotICAgIDB4NkQyNywgMHg2RDBDLCAweDZENDMsIDB4NkQ0OCwgMHg2RDA3LCAweDZEMDQsIDB4NkQxOSwgMHg2RDBFLAotICAgIDB4NkQyQiwgMHg2RDRELCAweDZEMkUsIDB4NkQzNSwgMHg2RDFBLCAweDZENEYsIDB4NkQ1MiwgMHg2RDU0LAotICAgIDB4NkQzMywgMHg2RDkxLCAweDZENkYsIDB4NkQ5RSwgMHg2REEwLCAweDZENUUsIDB4NkQ5MywgMHg2RDk0LAotICAgIDB4NkQ1QywgMHg2RDYwLCAweDZEN0MsIDB4NkQ2MywgMHg2RTFBLCAweDZEQzcsIDB4NkRDNSwgMHg2RERFLAotICAgIDB4NkUwRSwgMHg2REJGLCAweDZERTAsIDB4NkUxMSwgMHg2REU2LCAweDZEREQsIDB4NkREOSwgMHg2RTE2LAotICAgIDB4NkRBQiwgMHg2RTBDLCAweDZEQUUsIDB4NkUyQiwgMHg2RTZFLCAweDZFNEUsIDB4NkU2QiwgMHg2RUIyLAotICAgIDB4NkU1RiwgMHg2RTg2LCAweDZFNTMsIDB4NkU1NCwgMHg2RTMyLCAweDZFMjUsIDB4NkU0NCwgMHg2RURGLAotICAgIDB4NkVCMSwgMHg2RTk4LCAweDZFRTAsIDB4NkYyRCwgMHg2RUUyLCAweDZFQTUsIDB4NkVBNywgMHg2RUJELAotICAgIDB4NkVCQiwgMHg2RUI3LCAweDZFRDcsIDB4NkVCNCwgMHg2RUNGLCAweDZFOEYsIDB4NkVDMiwgMHg2RTlGLAotICAgIDB4NkY2MiwgMHg2RjQ2LCAweDZGNDcsIDB4NkYyNCwgMHg2RjE1LCAweDZFRjksIDB4NkYyRiwgMHg2RjM2LAotICAgIDB4NkY0QiwgMHg2Rjc0LCAweDZGMkEsIDB4NkYwOSwgMHg2RjI5LCAweDZGODksIDB4NkY4RCwgMHg2RjhDLAotICAgIDB4NkY3OCwgMHg2RjcyLCAweDZGN0MsIDB4NkY3QSwgMHg2RkQxLCAweDZGQzksIDB4NkZBNywgMHg2RkI5LAotICAgIDB4NkZCNiwgMHg2RkMyLCAweDZGRTEsIDB4NkZFRSwgMHg2RkRFLCAweDZGRTAsIDB4NkZFRiwgMHg3MDFBLAotICAgIDB4NzAyMywgMHg3MDFCLCAweDcwMzksIDB4NzAzNSwgMHg3MDRGLCAweDcwNUUsIDB4NUI4MCwgMHg1Qjg0LAotICAgIDB4NUI5NSwgMHg1QjkzLCAweDVCQTUsIDB4NUJCOCwgMHg3NTJGLCAweDlBOUUsIDB4NjQzNCwgMHg1QkU0LAotICAgIDB4NUJFRSwgMHg4OTMwLCAweDVCRjAsIDB4OEU0NywgMHg4QjA3LCAweDhGQjYsIDB4OEZEMywgMHg4RkQ1LAotICAgIDB4OEZFNSwgMHg4RkVFLCAweDhGRTQsIDB4OEZFOSwgMHg4RkU2LCAweDhGRjMsIDB4OEZFOCwgMHg5MDA1LAotICAgIDB4OTAwNCwgMHg5MDBCLCAweDkwMjYsIDB4OTAxMSwgMHg5MDBELCAweDkwMTYsIDB4OTAyMSwgMHg5MDM1LAotICAgIDB4OTAzNiwgMHg5MDJELCAweDkwMkYsIDB4OTA0NCwgMHg5MDUxLCAweDkwNTIsIDB4OTA1MCwgMHg5MDY4LAotICAgIDB4OTA1OCwgMHg5MDYyLCAweDkwNUIsIDB4NjZCOSwgMHg5MDc0LCAweDkwN0QsIDB4OTA4MiwgMHg5MDg4LAotICAgIDB4OTA4MywgMHg5MDhCLCAweDVGNTAsIDB4NUY1NywgMHg1RjU2LCAweDVGNTgsIDB4NUMzQiwgMHg1NEFCLAotICAgIDB4NUM1MCwgMHg1QzU5LCAweDVCNzEsIDB4NUM2MywgMHg1QzY2LCAweDdGQkMsIDB4NUYyQSwgMHg1RjI5LAotICAgIDB4NUYyRCwgMHg4Mjc0LCAweDVGM0MsIDB4OUIzQiwgMHg1QzZFLCAweDU5ODEsIDB4NTk4MywgMHg1OThELAotICAgIDB4NTlBOSwgMHg1OUFBLCAweDU5QTMsIDB4NTk5NywgMHg1OUNBLCAweDU5QUIsIDB4NTk5RSwgMHg1OUE0LAotICAgIDB4NTlEMiwgMHg1OUIyLCAweDU5QUYsIDB4NTlENywgMHg1OUJFLCAweDVBMDUsIDB4NUEwNiwgMHg1OURELAotICAgIDB4NUEwOCwgMHg1OUUzLCAweDU5RDgsIDB4NTlGOSwgMHg1QTBDLCAweDVBMDksIDB4NUEzMiwgMHg1QTM0LAotICAgIDB4NUExMSwgMHg1QTIzLCAweDVBMTMsIDB4NUE0MCwgMHg1QTY3LCAweDVBNEEsIDB4NUE1NSwgMHg1QTNDLAotICAgIDB4NUE2MiwgMHg1QTc1LCAweDgwRUMsIDB4NUFBQSwgMHg1QTlCLCAweDVBNzcsIDB4NUE3QSwgMHg1QUJFLAotICAgIDB4NUFFQiwgMHg1QUIyLCAweDVBRDIsIDB4NUFENCwgMHg1QUI4LCAweDVBRTAsIDB4NUFFMywgMHg1QUYxLAotICAgIDB4NUFENiwgMHg1QUU2LCAweDVBRDgsIDB4NUFEQywgMHg1QjA5LCAweDVCMTcsIDB4NUIxNiwgMHg1QjMyLAotICAgIDB4NUIzNywgMHg1QjQwLCAweDVDMTUsIDB4NUMxQywgMHg1QjVBLCAweDVCNjUsIDB4NUI3MywgMHg1QjUxLAotICAgIDB4NUI1MywgMHg1QjYyLCAweDlBNzUsIDB4OUE3NywgMHg5QTc4LCAweDlBN0EsIDB4OUE3RiwgMHg5QTdELAotICAgIDB4OUE4MCwgMHg5QTgxLCAweDlBODUsIDB4OUE4OCwgMHg5QThBLCAweDlBOTAsIDB4OUE5MiwgMHg5QTkzLAotICAgIDB4OUE5NiwgMHg5QTk4LCAweDlBOUIsIDB4OUE5QywgMHg5QTlELCAweDlBOUYsIDB4OUFBMCwgMHg5QUEyLAotICAgIDB4OUFBMywgMHg5QUE1LCAweDlBQTcsIDB4N0U5RiwgMHg3RUExLCAweDdFQTMsIDB4N0VBNSwgMHg3RUE4LAotICAgIDB4N0VBOSwgMHg3RUFELCAweDdFQjAsIDB4N0VCRSwgMHg3RUMwLCAweDdFQzEsIDB4N0VDMiwgMHg3RUM5LAotICAgIDB4N0VDQiwgMHg3RUNDLCAweDdFRDAsIDB4N0VENCwgMHg3RUQ3LCAweDdFREIsIDB4N0VFMCwgMHg3RUUxLAotICAgIDB4N0VFOCwgMHg3RUVCLCAweDdFRUUsIDB4N0VFRiwgMHg3RUYxLCAweDdFRjIsIDB4N0YwRCwgMHg3RUY2LAotICAgIDB4N0VGQSwgMHg3RUZCLCAweDdFRkUsIDB4N0YwMSwgMHg3RjAyLCAweDdGMDMsIDB4N0YwNywgMHg3RjA4LAotICAgIDB4N0YwQiwgMHg3RjBDLCAweDdGMEYsIDB4N0YxMSwgMHg3RjEyLCAweDdGMTcsIDB4N0YxOSwgMHg3RjFDLAotICAgIDB4N0YxQiwgMHg3RjFGLCAweDdGMjEsIDB4N0YyMiwgMHg3RjIzLCAweDdGMjQsIDB4N0YyNSwgMHg3RjI2LAotICAgIDB4N0YyNywgMHg3RjJBLCAweDdGMkIsIDB4N0YyQywgMHg3RjJELCAweDdGMkYsIDB4N0YzMCwgMHg3RjMxLAotICAgIDB4N0YzMiwgMHg3RjMzLCAweDdGMzUsIDB4NUU3QSwgMHg3NTdGLCAweDVEREIsIDB4NzUzRSwgMHg5MDk1LAotICAgIDB4NzM4RSwgMHg3MzkxLCAweDczQUUsIDB4NzNBMiwgMHg3MzlGLCAweDczQ0YsIDB4NzNDMiwgMHg3M0QxLAotICAgIDB4NzNCNywgMHg3M0IzLCAweDczQzAsIDB4NzNDOSwgMHg3M0M4LCAweDczRTUsIDB4NzNEOSwgMHg5ODdDLAotICAgIDB4NzQwQSwgMHg3M0U5LCAweDczRTcsIDB4NzNERSwgMHg3M0JBLCAweDczRjIsIDB4NzQwRiwgMHg3NDJBLAotICAgIDB4NzQ1QiwgMHg3NDI2LCAweDc0MjUsIDB4NzQyOCwgMHg3NDMwLCAweDc0MkUsIDB4NzQyQywgMHg3NDFCLAotICAgIDB4NzQxQSwgMHg3NDQxLCAweDc0NUMsIDB4NzQ1NywgMHg3NDU1LCAweDc0NTksIDB4NzQ3NywgMHg3NDZELAotICAgIDB4NzQ3RSwgMHg3NDlDLCAweDc0OEUsIDB4NzQ4MCwgMHg3NDgxLCAweDc0ODcsIDB4NzQ4QiwgMHg3NDlFLAotICAgIDB4NzRBOCwgMHg3NEE5LCAweDc0OTAsIDB4NzRBNywgMHg3NEQyLCAweDc0QkEsIDB4OTdFQSwgMHg5N0VCLAotICAgIDB4OTdFQywgMHg2NzRDLCAweDY3NTMsIDB4Njc1RSwgMHg2NzQ4LCAweDY3NjksIDB4NjdBNSwgMHg2Nzg3LAotICAgIDB4Njc2QSwgMHg2NzczLCAweDY3OTgsIDB4NjdBNywgMHg2Nzc1LCAweDY3QTgsIDB4Njc5RSwgMHg2N0FELAotICAgIDB4Njc4QiwgMHg2Nzc3LCAweDY3N0MsIDB4NjdGMCwgMHg2ODA5LCAweDY3RDgsIDB4NjgwQSwgMHg2N0U5LAotICAgIDB4NjdCMCwgMHg2ODBDLCAweDY3RDksIDB4NjdCNSwgMHg2N0RBLCAweDY3QjMsIDB4NjdERCwgMHg2ODAwLAotICAgIDB4NjdDMywgMHg2N0I4LCAweDY3RTIsIDB4NjgwRSwgMHg2N0MxLCAweDY3RkQsIDB4NjgzMiwgMHg2ODMzLAotICAgIDB4Njg2MCwgMHg2ODYxLCAweDY4NEUsIDB4Njg2MiwgMHg2ODQ0LCAweDY4NjQsIDB4Njg4MywgMHg2ODFELAotICAgIDB4Njg1NSwgMHg2ODY2LCAweDY4NDEsIDB4Njg2NywgMHg2ODQwLCAweDY4M0UsIDB4Njg0QSwgMHg2ODQ5LAotICAgIDB4NjgyOSwgMHg2OEI1LCAweDY4OEYsIDB4Njg3NCwgMHg2ODc3LCAweDY4OTMsIDB4Njg2QiwgMHg2OEMyLAotICAgIDB4Njk2RSwgMHg2OEZDLCAweDY5MUYsIDB4NjkyMCwgMHg2OEY5LCAweDY5MjQsIDB4NjhGMCwgMHg2OTBCLAotICAgIDB4NjkwMSwgMHg2OTU3LCAweDY4RTMsIDB4NjkxMCwgMHg2OTcxLCAweDY5MzksIDB4Njk2MCwgMHg2OTQyLAotICAgIDB4Njk1RCwgMHg2OTg0LCAweDY5NkIsIDB4Njk4MCwgMHg2OTk4LCAweDY5NzgsIDB4NjkzNCwgMHg2OUNDLAotICAgIDB4Njk4NywgMHg2OTg4LCAweDY5Q0UsIDB4Njk4OSwgMHg2OTY2LCAweDY5NjMsIDB4Njk3OSwgMHg2OTlCLAotICAgIDB4NjlBNywgMHg2OUJCLCAweDY5QUIsIDB4NjlBRCwgMHg2OUQ0LCAweDY5QjEsIDB4NjlDMSwgMHg2OUNBLAotICAgIDB4NjlERiwgMHg2OTk1LCAweDY5RTAsIDB4Njk4RCwgMHg2OUZGLCAweDZBMkYsIDB4NjlFRCwgMHg2QTE3LAotICAgIDB4NkExOCwgMHg2QTY1LCAweDY5RjIsIDB4NkE0NCwgMHg2QTNFLCAweDZBQTAsIDB4NkE1MCwgMHg2QTVCLAotICAgIDB4NkEzNSwgMHg2QThFLCAweDZBNzksIDB4NkEzRCwgMHg2QTI4LCAweDZBNTgsIDB4NkE3QywgMHg2QTkxLAotICAgIDB4NkE5MCwgMHg2QUE5LCAweDZBOTcsIDB4NkFBQiwgMHg3MzM3LCAweDczNTIsIDB4NkI4MSwgMHg2QjgyLAotICAgIDB4NkI4NywgMHg2Qjg0LCAweDZCOTIsIDB4NkI5MywgMHg2QjhELCAweDZCOUEsIDB4NkI5QiwgMHg2QkExLAotICAgIDB4NkJBQSwgMHg4RjZCLCAweDhGNkQsIDB4OEY3MSwgMHg4RjcyLCAweDhGNzMsIDB4OEY3NSwgMHg4Rjc2LAotICAgIDB4OEY3OCwgMHg4Rjc3LCAweDhGNzksIDB4OEY3QSwgMHg4RjdDLCAweDhGN0UsIDB4OEY4MSwgMHg4RjgyLAotICAgIDB4OEY4NCwgMHg4Rjg3LCAweDhGOEIsIDB4OEY4RCwgMHg4RjhFLCAweDhGOEYsIDB4OEY5OCwgMHg4RjlBLAotICAgIDB4OEVDRSwgMHg2MjBCLCAweDYyMTcsIDB4NjIxQiwgMHg2MjFGLCAweDYyMjIsIDB4NjIyMSwgMHg2MjI1LAotICAgIDB4NjIyNCwgMHg2MjJDLCAweDgxRTcsIDB4NzRFRiwgMHg3NEY0LCAweDc0RkYsIDB4NzUwRiwgMHg3NTExLAotICAgIDB4NzUxMywgMHg2NTM0LCAweDY1RUUsIDB4NjVFRiwgMHg2NUYwLCAweDY2MEEsIDB4NjYxOSwgMHg2NzcyLAotICAgIDB4NjYwMywgMHg2NjE1LCAweDY2MDAsIDB4NzA4NSwgMHg2NkY3LCAweDY2MUQsIDB4NjYzNCwgMHg2NjMxLAotICAgIDB4NjYzNiwgMHg2NjM1LCAweDgwMDYsIDB4NjY1RiwgMHg2NjU0LCAweDY2NDEsIDB4NjY0RiwgMHg2NjU2LAotICAgIDB4NjY2MSwgMHg2NjU3LCAweDY2NzcsIDB4NjY4NCwgMHg2NjhDLCAweDY2QTcsIDB4NjY5RCwgMHg2NkJFLAotICAgIDB4NjZEQiwgMHg2NkRDLCAweDY2RTYsIDB4NjZFOSwgMHg4RDMyLCAweDhEMzMsIDB4OEQzNiwgMHg4RDNCLAotICAgIDB4OEQzRCwgMHg4RDQwLCAweDhENDUsIDB4OEQ0NiwgMHg4RDQ4LCAweDhENDksIDB4OEQ0NywgMHg4RDRELAotICAgIDB4OEQ1NSwgMHg4RDU5LCAweDg5QzcsIDB4ODlDQSwgMHg4OUNCLCAweDg5Q0MsIDB4ODlDRSwgMHg4OUNGLAotICAgIDB4ODlEMCwgMHg4OUQxLCAweDcyNkUsIDB4NzI5RiwgMHg3MjVELCAweDcyNjYsIDB4NzI2RiwgMHg3MjdFLAotICAgIDB4NzI3RiwgMHg3Mjg0LCAweDcyOEIsIDB4NzI4RCwgMHg3MjhGLCAweDcyOTIsIDB4NjMwOCwgMHg2MzMyLAotICAgIDB4NjNCMCwgMHg2NDNGLCAweDY0RDgsIDB4ODAwNCwgMHg2QkVBLCAweDZCRjMsIDB4NkJGRCwgMHg2QkY1LAotICAgIDB4NkJGOSwgMHg2QzA1LCAweDZDMDcsIDB4NkMwNiwgMHg2QzBELCAweDZDMTUsIDB4NkMxOCwgMHg2QzE5LAotICAgIDB4NkMxQSwgMHg2QzIxLCAweDZDMjksIDB4NkMyNCwgMHg2QzJBLCAweDZDMzIsIDB4NjUzNSwgMHg2NTU1LAotICAgIDB4NjU2QiwgMHg3MjRELCAweDcyNTIsIDB4NzI1NiwgMHg3MjMwLCAweDg2NjIsIDB4NTIxNiwgMHg4MDlGLAotICAgIDB4ODA5QywgMHg4MDkzLCAweDgwQkMsIDB4NjcwQSwgMHg4MEJELCAweDgwQjEsIDB4ODBBQiwgMHg4MEFELAotICAgIDB4ODBCNCwgMHg4MEI3LCAweDgwRTcsIDB4ODBFOCwgMHg4MEU5LCAweDgwRUEsIDB4ODBEQiwgMHg4MEMyLAotICAgIDB4ODBDNCwgMHg4MEQ5LCAweDgwQ0QsIDB4ODBENywgMHg2NzEwLCAweDgwREQsIDB4ODBFQiwgMHg4MEYxLAotICAgIDB4ODBGNCwgMHg4MEVELCAweDgxMEQsIDB4ODEwRSwgMHg4MEYyLCAweDgwRkMsIDB4NjcxNSwgMHg4MTEyLAotICAgIDB4OEM1QSwgMHg4MTM2LCAweDgxMUUsIDB4ODEyQywgMHg4MTE4LCAweDgxMzIsIDB4ODE0OCwgMHg4MTRDLAotICAgIDB4ODE1MywgMHg4MTc0LCAweDgxNTksIDB4ODE1QSwgMHg4MTcxLCAweDgxNjAsIDB4ODE2OSwgMHg4MTdDLAotICAgIDB4ODE3RCwgMHg4MTZELCAweDgxNjcsIDB4NTg0RCwgMHg1QUI1LCAweDgxODgsIDB4ODE4MiwgMHg4MTkxLAotICAgIDB4NkVENSwgMHg4MUEzLCAweDgxQUEsIDB4ODFDQywgMHg2NzI2LCAweDgxQ0EsIDB4ODFCQiwgMHg4MUMxLAotICAgIDB4ODFBNiwgMHg2QjI0LCAweDZCMzcsIDB4NkIzOSwgMHg2QjQzLCAweDZCNDYsIDB4NkI1OSwgMHg5OEQxLAotICAgIDB4OThEMiwgMHg5OEQzLCAweDk4RDUsIDB4OThEOSwgMHg5OERBLCAweDZCQjMsIDB4NUY0MCwgMHg2QkMyLAotICAgIDB4ODlGMywgMHg2NTkwLCAweDlGNTEsIDB4NjU5MywgMHg2NUJDLCAweDY1QzYsIDB4NjVDNCwgMHg2NUMzLAotICAgIDB4NjVDQywgMHg2NUNFLCAweDY1RDIsIDB4NjVENiwgMHg3MDgwLCAweDcwOUMsIDB4NzA5NiwgMHg3MDlELAotICAgIDB4NzBCQiwgMHg3MEMwLCAweDcwQjcsIDB4NzBBQiwgMHg3MEIxLCAweDcwRTgsIDB4NzBDQSwgMHg3MTEwLAotICAgIDB4NzExMywgMHg3MTE2LCAweDcxMkYsIDB4NzEzMSwgMHg3MTczLCAweDcxNUMsIDB4NzE2OCwgMHg3MTQ1LAotICAgIDB4NzE3MiwgMHg3MTRBLCAweDcxNzgsIDB4NzE3QSwgMHg3MTk4LCAweDcxQjMsIDB4NzFCNSwgMHg3MUE4LAotICAgIDB4NzFBMCwgMHg3MUUwLCAweDcxRDQsIDB4NzFFNywgMHg3MUY5LCAweDcyMUQsIDB4NzIyOCwgMHg3MDZDLAotICAgIDB4NzExOCwgMHg3MTY2LCAweDcxQjksIDB4NjIzRSwgMHg2MjNELCAweDYyNDMsIDB4NjI0OCwgMHg2MjQ5LAotICAgIDB4NzkzQiwgMHg3OTQwLCAweDc5NDYsIDB4Nzk0OSwgMHg3OTVCLCAweDc5NUMsIDB4Nzk1MywgMHg3OTVBLAotICAgIDB4Nzk2MiwgMHg3OTU3LCAweDc5NjAsIDB4Nzk2RiwgMHg3OTY3LCAweDc5N0EsIDB4Nzk4NSwgMHg3OThBLAotICAgIDB4Nzk5QSwgMHg3OUE3LCAweDc5QjMsIDB4NUZEMSwgMHg1RkQwLCAweDYwM0MsIDB4NjA1RCwgMHg2MDVBLAotICAgIDB4NjA2NywgMHg2MDQxLCAweDYwNTksIDB4NjA2MywgMHg2MEFCLCAweDYxMDYsIDB4NjEwRCwgMHg2MTVELAotICAgIDB4NjFBOSwgMHg2MTlELCAweDYxQ0IsIDB4NjFEMSwgMHg2MjA2LCAweDgwODAsIDB4ODA3RiwgMHg2QzkzLAotICAgIDB4NkNGNiwgMHg2REZDLCAweDc3RjYsIDB4NzdGOCwgMHg3ODAwLCAweDc4MDksIDB4NzgxNywgMHg3ODE4LAotICAgIDB4NzgxMSwgMHg2NUFCLCAweDc4MkQsIDB4NzgxQywgMHg3ODFELCAweDc4MzksIDB4NzgzQSwgMHg3ODNCLAotICAgIDB4NzgxRiwgMHg3ODNDLCAweDc4MjUsIDB4NzgyQywgMHg3ODIzLCAweDc4MjksIDB4Nzg0RSwgMHg3ODZELAotICAgIDB4Nzg1NiwgMHg3ODU3LCAweDc4MjYsIDB4Nzg1MCwgMHg3ODQ3LCAweDc4NEMsIDB4Nzg2QSwgMHg3ODlCLAotICAgIDB4Nzg5MywgMHg3ODlBLCAweDc4ODcsIDB4Nzg5QywgMHg3OEExLCAweDc4QTMsIDB4NzhCMiwgMHg3OEI5LAotICAgIDB4NzhBNSwgMHg3OEQ0LCAweDc4RDksIDB4NzhDOSwgMHg3OEVDLCAweDc4RjIsIDB4NzkwNSwgMHg3OEY0LAotICAgIDB4NzkxMywgMHg3OTI0LCAweDc5MUUsIDB4NzkzNCwgMHg5RjlCLCAweDlFRjksIDB4OUVGQiwgMHg5RUZDLAotICAgIDB4NzZGMSwgMHg3NzA0LCAweDc3MEQsIDB4NzZGOSwgMHg3NzA3LCAweDc3MDgsIDB4NzcxQSwgMHg3NzIyLAotICAgIDB4NzcxOSwgMHg3NzJELCAweDc3MjYsIDB4NzczNSwgMHg3NzM4LCAweDc3NTAsIDB4Nzc1MSwgMHg3NzQ3LAotICAgIDB4Nzc0MywgMHg3NzVBLCAweDc3NjgsIDB4Nzc2MiwgMHg3NzY1LCAweDc3N0YsIDB4Nzc4RCwgMHg3NzdELAotICAgIDB4Nzc4MCwgMHg3NzhDLCAweDc3OTEsIDB4Nzc5RiwgMHg3N0EwLCAweDc3QjAsIDB4NzdCNSwgMHg3N0JELAotICAgIDB4NzUzQSwgMHg3NTQwLCAweDc1NEUsIDB4NzU0QiwgMHg3NTQ4LCAweDc1NUIsIDB4NzU3MiwgMHg3NTc5LAotICAgIDB4NzU4MywgMHg3RjU4LCAweDdGNjEsIDB4N0Y1RiwgMHg4QTQ4LCAweDdGNjgsIDB4N0Y3NCwgMHg3RjcxLAotICAgIDB4N0Y3OSwgMHg3RjgxLCAweDdGN0UsIDB4NzZDRCwgMHg3NkU1LCAweDg4MzIsIDB4OTQ4NSwgMHg5NDg2LAotICAgIDB4OTQ4NywgMHg5NDhCLCAweDk0OEEsIDB4OTQ4QywgMHg5NDhELCAweDk0OEYsIDB4OTQ5MCwgMHg5NDk0LAotICAgIDB4OTQ5NywgMHg5NDk1LCAweDk0OUEsIDB4OTQ5QiwgMHg5NDlDLCAweDk0QTMsIDB4OTRBNCwgMHg5NEFCLAotICAgIDB4OTRBQSwgMHg5NEFELCAweDk0QUMsIDB4OTRBRiwgMHg5NEIwLCAweDk0QjIsIDB4OTRCNCwgMHg5NEI2LAotICAgIDB4OTRCNywgMHg5NEI4LCAweDk0QjksIDB4OTRCQSwgMHg5NEJDLCAweDk0QkQsIDB4OTRCRiwgMHg5NEM0LAotICAgIDB4OTRDOCwgMHg5NEM5LCAweDk0Q0EsIDB4OTRDQiwgMHg5NENDLCAweDk0Q0QsIDB4OTRDRSwgMHg5NEQwLAotICAgIDB4OTREMSwgMHg5NEQyLCAweDk0RDUsIDB4OTRENiwgMHg5NEQ3LCAweDk0RDksIDB4OTREOCwgMHg5NERCLAotICAgIDB4OTRERSwgMHg5NERGLCAweDk0RTAsIDB4OTRFMiwgMHg5NEU0LCAweDk0RTUsIDB4OTRFNywgMHg5NEU4LAotICAgIDB4OTRFQSwgMHg5NEU5LCAweDk0RUIsIDB4OTRFRSwgMHg5NEVGLCAweDk0RjMsIDB4OTRGNCwgMHg5NEY1LAotICAgIDB4OTRGNywgMHg5NEY5LCAweDk0RkMsIDB4OTRGRCwgMHg5NEZGLCAweDk1MDMsIDB4OTUwMiwgMHg5NTA2LAotICAgIDB4OTUwNywgMHg5NTA5LCAweDk1MEEsIDB4OTUwRCwgMHg5NTBFLCAweDk1MEYsIDB4OTUxMiwgMHg5NTEzLAotICAgIDB4OTUxNCwgMHg5NTE1LCAweDk1MTYsIDB4OTUxOCwgMHg5NTFCLCAweDk1MUQsIDB4OTUxRSwgMHg5NTFGLAotICAgIDB4OTUyMiwgMHg5NTJBLCAweDk1MkIsIDB4OTUyOSwgMHg5NTJDLCAweDk1MzEsIDB4OTUzMiwgMHg5NTM0LAotICAgIDB4OTUzNiwgMHg5NTM3LCAweDk1MzgsIDB4OTUzQywgMHg5NTNFLCAweDk1M0YsIDB4OTU0MiwgMHg5NTM1LAotICAgIDB4OTU0NCwgMHg5NTQ1LCAweDk1NDYsIDB4OTU0OSwgMHg5NTRDLCAweDk1NEUsIDB4OTU0RiwgMHg5NTUyLAotICAgIDB4OTU1MywgMHg5NTU0LCAweDk1NTYsIDB4OTU1NywgMHg5NTU4LCAweDk1NTksIDB4OTU1QiwgMHg5NTVFLAotICAgIDB4OTU1RiwgMHg5NTVELCAweDk1NjEsIDB4OTU2MiwgMHg5NTY0LCAweDk1NjUsIDB4OTU2NiwgMHg5NTY3LAotICAgIDB4OTU2OCwgMHg5NTY5LCAweDk1NkEsIDB4OTU2QiwgMHg5NTZDLCAweDk1NkYsIDB4OTU3MSwgMHg5NTcyLAotICAgIDB4OTU3MywgMHg5NTNBLCAweDc3RTcsIDB4NzdFQywgMHg5NkM5LCAweDc5RDUsIDB4NzlFRCwgMHg3OUUzLAotICAgIDB4NzlFQiwgMHg3QTA2LCAweDVENDcsIDB4N0EwMywgMHg3QTAyLCAweDdBMUUsIDB4N0ExNCwgMHg3QTM5LAotICAgIDB4N0EzNywgMHg3QTUxLCAweDlFQ0YsIDB4OTlBNSwgMHg3QTcwLCAweDc2ODgsIDB4NzY4RSwgMHg3NjkzLAotICAgIDB4NzY5OSwgMHg3NkE0LCAweDc0REUsIDB4NzRFMCwgMHg3NTJDLCAweDlFMjAsIDB4OUUyMiwgMHg5RTI4LAotICAgIDB4OUUyOSwgMHg5RTJBLCAweDlFMkIsIDB4OUUyQywgMHg5RTMyLCAweDlFMzEsIDB4OUUzNiwgMHg5RTM4LAotICAgIDB4OUUzNywgMHg5RTM5LCAweDlFM0EsIDB4OUUzRSwgMHg5RTQxLCAweDlFNDIsIDB4OUU0NCwgMHg5RTQ2LAotICAgIDB4OUU0NywgMHg5RTQ4LCAweDlFNDksIDB4OUU0QiwgMHg5RTRDLCAweDlFNEUsIDB4OUU1MSwgMHg5RTU1LAotICAgIDB4OUU1NywgMHg5RTVBLCAweDlFNUIsIDB4OUU1QywgMHg5RTVFLCAweDlFNjMsIDB4OUU2NiwgMHg5RTY3LAotICAgIDB4OUU2OCwgMHg5RTY5LCAweDlFNkEsIDB4OUU2QiwgMHg5RTZDLCAweDlFNzEsIDB4OUU2RCwgMHg5RTczLAotICAgIDB4NzU5MiwgMHg3NTk0LCAweDc1OTYsIDB4NzVBMCwgMHg3NTlELCAweDc1QUMsIDB4NzVBMywgMHg3NUIzLAotICAgIDB4NzVCNCwgMHg3NUI4LCAweDc1QzQsIDB4NzVCMSwgMHg3NUIwLCAweDc1QzMsIDB4NzVDMiwgMHg3NUQ2LAotICAgIDB4NzVDRCwgMHg3NUUzLCAweDc1RTgsIDB4NzVFNiwgMHg3NUU0LCAweDc1RUIsIDB4NzVFNywgMHg3NjAzLAotICAgIDB4NzVGMSwgMHg3NUZDLCAweDc1RkYsIDB4NzYxMCwgMHg3NjAwLCAweDc2MDUsIDB4NzYwQywgMHg3NjE3LAotICAgIDB4NzYwQSwgMHg3NjI1LCAweDc2MTgsIDB4NzYxNSwgMHg3NjE5LCAweDc2MUIsIDB4NzYzQywgMHg3NjIyLAotICAgIDB4NzYyMCwgMHg3NjQwLCAweDc2MkQsIDB4NzYzMCwgMHg3NjNGLCAweDc2MzUsIDB4NzY0MywgMHg3NjNFLAotICAgIDB4NzYzMywgMHg3NjRELCAweDc2NUUsIDB4NzY1NCwgMHg3NjVDLCAweDc2NTYsIDB4NzY2QiwgMHg3NjZGLAotICAgIDB4N0ZDQSwgMHg3QUU2LCAweDdBNzgsIDB4N0E3OSwgMHg3QTgwLCAweDdBODYsIDB4N0E4OCwgMHg3QTk1LAotICAgIDB4N0FBNiwgMHg3QUEwLCAweDdBQUMsIDB4N0FBOCwgMHg3QUFELCAweDdBQjMsIDB4ODg2NCwgMHg4ODY5LAotICAgIDB4ODg3MiwgMHg4ODdELCAweDg4N0YsIDB4ODg4MiwgMHg4OEEyLCAweDg4QzYsIDB4ODhCNywgMHg4OEJDLAotICAgIDB4ODhDOSwgMHg4OEUyLCAweDg4Q0UsIDB4ODhFMywgMHg4OEU1LCAweDg4RjEsIDB4ODkxQSwgMHg4OEZDLAotICAgIDB4ODhFOCwgMHg4OEZFLCAweDg4RjAsIDB4ODkyMSwgMHg4OTE5LCAweDg5MTMsIDB4ODkxQiwgMHg4OTBBLAotICAgIDB4ODkzNCwgMHg4OTJCLCAweDg5MzYsIDB4ODk0MSwgMHg4OTY2LCAweDg5N0IsIDB4NzU4QiwgMHg4MEU1LAotICAgIDB4NzZCMiwgMHg3NkI0LCAweDc3REMsIDB4ODAxMiwgMHg4MDE0LCAweDgwMTYsIDB4ODAxQywgMHg4MDIwLAotICAgIDB4ODAyMiwgMHg4MDI1LCAweDgwMjYsIDB4ODAyNywgMHg4MDI5LCAweDgwMjgsIDB4ODAzMSwgMHg4MDBCLAotICAgIDB4ODAzNSwgMHg4MDQzLCAweDgwNDYsIDB4ODA0RCwgMHg4MDUyLCAweDgwNjksIDB4ODA3MSwgMHg4OTgzLAotICAgIDB4OTg3OCwgMHg5ODgwLCAweDk4ODMsIDB4OTg4OSwgMHg5ODhDLCAweDk4OEQsIDB4OTg4RiwgMHg5ODk0LAotICAgIDB4OTg5QSwgMHg5ODlCLCAweDk4OUUsIDB4OTg5RiwgMHg5OEExLCAweDk4QTIsIDB4OThBNSwgMHg5OEE2LAotICAgIDB4ODY0RCwgMHg4NjU0LCAweDg2NkMsIDB4ODY2RSwgMHg4NjdGLCAweDg2N0EsIDB4ODY3QywgMHg4NjdCLAotICAgIDB4ODZBOCwgMHg4NjhELCAweDg2OEIsIDB4ODZBQywgMHg4NjlELCAweDg2QTcsIDB4ODZBMywgMHg4NkFBLAotICAgIDB4ODY5MywgMHg4NkE5LCAweDg2QjYsIDB4ODZDNCwgMHg4NkI1LCAweDg2Q0UsIDB4ODZCMCwgMHg4NkJBLAotICAgIDB4ODZCMSwgMHg4NkFGLCAweDg2QzksIDB4ODZDRiwgMHg4NkI0LCAweDg2RTksIDB4ODZGMSwgMHg4NkYyLAotICAgIDB4ODZFRCwgMHg4NkYzLCAweDg2RDAsIDB4ODcxMywgMHg4NkRFLCAweDg2RjQsIDB4ODZERiwgMHg4NkQ4LAotICAgIDB4ODZEMSwgMHg4NzAzLCAweDg3MDcsIDB4ODZGOCwgMHg4NzA4LCAweDg3MEEsIDB4ODcwRCwgMHg4NzA5LAotICAgIDB4ODcyMywgMHg4NzNCLCAweDg3MUUsIDB4ODcyNSwgMHg4NzJFLCAweDg3MUEsIDB4ODczRSwgMHg4NzQ4LAotICAgIDB4ODczNCwgMHg4NzMxLCAweDg3MjksIDB4ODczNywgMHg4NzNGLCAweDg3ODIsIDB4ODcyMiwgMHg4NzdELAotICAgIDB4ODc3RSwgMHg4NzdCLCAweDg3NjAsIDB4ODc3MCwgMHg4NzRDLCAweDg3NkUsIDB4ODc4QiwgMHg4NzUzLAotICAgIDB4ODc2MywgMHg4NzdDLCAweDg3NjQsIDB4ODc1OSwgMHg4NzY1LCAweDg3OTMsIDB4ODdBRiwgMHg4N0E4LAotICAgIDB4ODdEMiwgMHg4N0M2LCAweDg3ODgsIDB4ODc4NSwgMHg4N0FELCAweDg3OTcsIDB4ODc4MywgMHg4N0FCLAotICAgIDB4ODdFNSwgMHg4N0FDLCAweDg3QjUsIDB4ODdCMywgMHg4N0NCLCAweDg3RDMsIDB4ODdCRCwgMHg4N0QxLAotICAgIDB4ODdDMCwgMHg4N0NBLCAweDg3REIsIDB4ODdFQSwgMHg4N0UwLCAweDg3RUUsIDB4ODgxNiwgMHg4ODEzLAotICAgIDB4ODdGRSwgMHg4ODBBLCAweDg4MUIsIDB4ODgyMSwgMHg4ODM5LCAweDg4M0MsIDB4N0YzNiwgMHg3RjQyLAotICAgIDB4N0Y0NCwgMHg3RjQ1LCAweDgyMTAsIDB4N0FGQSwgMHg3QUZELCAweDdCMDgsIDB4N0IwMywgMHg3QjA0LAotICAgIDB4N0IxNSwgMHg3QjBBLCAweDdCMkIsIDB4N0IwRiwgMHg3QjQ3LCAweDdCMzgsIDB4N0IyQSwgMHg3QjE5LAotICAgIDB4N0IyRSwgMHg3QjMxLCAweDdCMjAsIDB4N0IyNSwgMHg3QjI0LCAweDdCMzMsIDB4N0IzRSwgMHg3QjFFLAotICAgIDB4N0I1OCwgMHg3QjVBLCAweDdCNDUsIDB4N0I3NSwgMHg3QjRDLCAweDdCNUQsIDB4N0I2MCwgMHg3QjZFLAotICAgIDB4N0I3QiwgMHg3QjYyLCAweDdCNzIsIDB4N0I3MSwgMHg3QjkwLCAweDdCQTYsIDB4N0JBNywgMHg3QkI4LAotICAgIDB4N0JBQywgMHg3QjlELCAweDdCQTgsIDB4N0I4NSwgMHg3QkFBLCAweDdCOUMsIDB4N0JBMiwgMHg3QkFCLAotICAgIDB4N0JCNCwgMHg3QkQxLCAweDdCQzEsIDB4N0JDQywgMHg3QkRELCAweDdCREEsIDB4N0JFNSwgMHg3QkU2LAotICAgIDB4N0JFQSwgMHg3QzBDLCAweDdCRkUsIDB4N0JGQywgMHg3QzBGLCAweDdDMTYsIDB4N0MwQiwgMHg3QzFGLAotICAgIDB4N0MyQSwgMHg3QzI2LCAweDdDMzgsIDB4N0M0MSwgMHg3QzQwLCAweDgxRkUsIDB4ODIwMSwgMHg4MjAyLAotICAgIDB4ODIwNCwgMHg4MUVDLCAweDg4NDQsIDB4ODIyMSwgMHg4MjIyLCAweDgyMjMsIDB4ODIyRCwgMHg4MjJGLAotICAgIDB4ODIyOCwgMHg4MjJCLCAweDgyMzgsIDB4ODIzQiwgMHg4MjMzLCAweDgyMzQsIDB4ODIzRSwgMHg4MjQ0LAotICAgIDB4ODI0OSwgMHg4MjRCLCAweDgyNEYsIDB4ODI1QSwgMHg4MjVGLCAweDgyNjgsIDB4ODg3RSwgMHg4ODg1LAotICAgIDB4ODg4OCwgMHg4OEQ4LCAweDg4REYsIDB4ODk1RSwgMHg3RjlELCAweDdGOUYsIDB4N0ZBNywgMHg3RkFGLAotICAgIDB4N0ZCMCwgMHg3RkIyLCAweDdDN0MsIDB4NjU0OSwgMHg3QzkxLCAweDdDOUQsIDB4N0M5QywgMHg3QzlFLAotICAgIDB4N0NBMiwgMHg3Q0IyLCAweDdDQkMsIDB4N0NCRCwgMHg3Q0MxLCAweDdDQzcsIDB4N0NDQywgMHg3Q0NELAotICAgIDB4N0NDOCwgMHg3Q0M1LCAweDdDRDcsIDB4N0NFOCwgMHg4MjZFLCAweDY2QTgsIDB4N0ZCRiwgMHg3RkNFLAotICAgIDB4N0ZENSwgMHg3RkU1LCAweDdGRTEsIDB4N0ZFNiwgMHg3RkU5LCAweDdGRUUsIDB4N0ZGMywgMHg3Q0Y4LAotICAgIDB4N0Q3NywgMHg3REE2LCAweDdEQUUsIDB4N0U0NywgMHg3RTlCLCAweDlFQjgsIDB4OUVCNCwgMHg4RDczLAotICAgIDB4OEQ4NCwgMHg4RDk0LCAweDhEOTEsIDB4OERCMSwgMHg4RDY3LCAweDhENkQsIDB4OEM0NywgMHg4QzQ5LAotICAgIDB4OTE0QSwgMHg5MTUwLCAweDkxNEUsIDB4OTE0RiwgMHg5MTY0LCAweDkxNjIsIDB4OTE2MSwgMHg5MTcwLAotICAgIDB4OTE2OSwgMHg5MTZGLCAweDkxN0QsIDB4OTE3RSwgMHg5MTcyLCAweDkxNzQsIDB4OTE3OSwgMHg5MThDLAotICAgIDB4OTE4NSwgMHg5MTkwLCAweDkxOEQsIDB4OTE5MSwgMHg5MUEyLCAweDkxQTMsIDB4OTFBQSwgMHg5MUFELAotICAgIDB4OTFBRSwgMHg5MUFGLCAweDkxQjUsIDB4OTFCNCwgMHg5MUJBLCAweDhDNTUsIDB4OUU3RSwgMHg4REI4LAotICAgIDB4OERFQiwgMHg4RTA1LCAweDhFNTksIDB4OEU2OSwgMHg4REI1LCAweDhEQkYsIDB4OERCQywgMHg4REJBLAotICAgIDB4OERDNCwgMHg4REQ2LCAweDhERDcsIDB4OEREQSwgMHg4RERFLCAweDhEQ0UsIDB4OERDRiwgMHg4RERCLAotICAgIDB4OERDNiwgMHg4REVDLCAweDhERjcsIDB4OERGOCwgMHg4REUzLCAweDhERjksIDB4OERGQiwgMHg4REU0LAotICAgIDB4OEUwOSwgMHg4REZELCAweDhFMTQsIDB4OEUxRCwgMHg4RTFGLCAweDhFMkMsIDB4OEUyRSwgMHg4RTIzLAotICAgIDB4OEUyRiwgMHg4RTNBLCAweDhFNDAsIDB4OEUzOSwgMHg4RTM1LCAweDhFM0QsIDB4OEUzMSwgMHg4RTQ5LAotICAgIDB4OEU0MSwgMHg4RTQyLCAweDhFNTEsIDB4OEU1MiwgMHg4RTRBLCAweDhFNzAsIDB4OEU3NiwgMHg4RTdDLAotICAgIDB4OEU2RiwgMHg4RTc0LCAweDhFODUsIDB4OEU4RiwgMHg4RTk0LCAweDhFOTAsIDB4OEU5QywgMHg4RTlFLAotICAgIDB4OEM3OCwgMHg4QzgyLCAweDhDOEEsIDB4OEM4NSwgMHg4Qzk4LCAweDhDOTQsIDB4NjU5QiwgMHg4OUQ2LAotICAgIDB4ODlERSwgMHg4OURBLCAweDg5REMsIDB4ODlFNSwgMHg4OUVCLCAweDg5RUYsIDB4OEEzRSwgMHg4QjI2LAotICAgIDB4OTc1MywgMHg5NkU5LCAweDk2RjMsIDB4OTZFRiwgMHg5NzA2LCAweDk3MDEsIDB4OTcwOCwgMHg5NzBGLAotICAgIDB4OTcwRSwgMHg5NzJBLCAweDk3MkQsIDB4OTczMCwgMHg5NzNFLCAweDlGODAsIDB4OUY4MywgMHg5Rjg1LAotICAgIDB4OUY4NiwgMHg5Rjg3LCAweDlGODgsIDB4OUY4OSwgMHg5RjhBLCAweDlGOEMsIDB4OUVGRSwgMHg5RjBCLAotICAgIDB4OUYwRCwgMHg5NkI5LCAweDk2QkMsIDB4OTZCRCwgMHg5NkNFLCAweDk2RDIsIDB4NzdCRiwgMHg5NkUwLAotICAgIDB4OTI4RSwgMHg5MkFFLCAweDkyQzgsIDB4OTMzRSwgMHg5MzZBLCAweDkzQ0EsIDB4OTM4RiwgMHg5NDNFLAotICAgIDB4OTQ2QiwgMHg5QzdGLCAweDlDODIsIDB4OUM4NSwgMHg5Qzg2LCAweDlDODcsIDB4OUM4OCwgMHg3QTIzLAotICAgIDB4OUM4QiwgMHg5QzhFLCAweDlDOTAsIDB4OUM5MSwgMHg5QzkyLCAweDlDOTQsIDB4OUM5NSwgMHg5QzlBLAotICAgIDB4OUM5QiwgMHg5QzlFLCAweDlDOUYsIDB4OUNBMCwgMHg5Q0ExLCAweDlDQTIsIDB4OUNBMywgMHg5Q0E1LAotICAgIDB4OUNBNiwgMHg5Q0E3LCAweDlDQTgsIDB4OUNBOSwgMHg5Q0FCLCAweDlDQUQsIDB4OUNBRSwgMHg5Q0IwLAotICAgIDB4OUNCMSwgMHg5Q0IyLCAweDlDQjMsIDB4OUNCNCwgMHg5Q0I1LCAweDlDQjYsIDB4OUNCNywgMHg5Q0JBLAotICAgIDB4OUNCQiwgMHg5Q0JDLCAweDlDQkQsIDB4OUNDNCwgMHg5Q0M1LCAweDlDQzYsIDB4OUNDNywgMHg5Q0NBLAotICAgIDB4OUNDQiwgMHg5Q0NDLCAweDlDQ0QsIDB4OUNDRSwgMHg5Q0NGLCAweDlDRDAsIDB4OUNEMywgMHg5Q0Q0LAotICAgIDB4OUNENSwgMHg5Q0Q3LCAweDlDRDgsIDB4OUNEOSwgMHg5Q0RDLCAweDlDREQsIDB4OUNERiwgMHg5Q0UyLAotICAgIDB4OTc3QywgMHg5Nzg1LCAweDk3OTEsIDB4OTc5MiwgMHg5Nzk0LCAweDk3QUYsIDB4OTdBQiwgMHg5N0EzLAotICAgIDB4OTdCMiwgMHg5N0I0LCAweDlBQjEsIDB4OUFCMCwgMHg5QUI3LCAweDlFNTgsIDB4OUFCNiwgMHg5QUJBLAotICAgIDB4OUFCQywgMHg5QUMxLCAweDlBQzAsIDB4OUFDNSwgMHg5QUMyLCAweDlBQ0IsIDB4OUFDQywgMHg5QUQxLAotICAgIDB4OUI0NSwgMHg5QjQzLCAweDlCNDcsIDB4OUI0OSwgMHg5QjQ4LCAweDlCNEQsIDB4OUI1MSwgMHg5OEU4LAotICAgIDB4OTkwRCwgMHg5OTJFLCAweDk5NTUsIDB4OTk1NCwgMHg5QURGLCAweDlBRTEsIDB4OUFFNiwgMHg5QUVGLAotICAgIDB4OUFFQiwgMHg5QUZCLCAweDlBRUQsIDB4OUFGOSwgMHg5QjA4LCAweDlCMEYsIDB4OUIxMywgMHg5QjFGLAotICAgIDB4OUIyMywgMHg5RUJELCAweDlFQkUsIDB4N0UzQiwgMHg5RTgyLCAweDlFODcsIDB4OUU4OCwgMHg5RThCLAotICAgIDB4OUU5MiwgMHg5M0Q2LCAweDlFOUQsIDB4OUU5RiwgMHg5RURCLCAweDlFREMsIDB4OUVERCwgMHg5RUUwLAotICAgIDB4OUVERiwgMHg5RUUyLCAweDlFRTksIDB4OUVFNywgMHg5RUU1LCAweDlFRUEsIDB4OUVFRiwgMHg5RjIyLAotICAgIDB4OUYyQywgMHg5RjJGLCAweDlGMzksIDB4OUYzNywgMHg5RjNELCAweDlGM0UsIDB4OUY0NCwgMHgzMDA3LAotICAgIDB4RkY1RSwgMHgyMDE2LCAweDMwMTMsIDB4RkYwRSwgMHhGRjFELCAweEZGM0IsIDB4RkYzRCwgMHhGRkUzLAotICAgIDB4MDBGQywgMHgwMEE5LCAweDIxMjIsIDB4MjAyNiwgMHgwMDIwLCAweDc2OUEsIDB4ODVGOSwgMHg3OTE5LAotICAgIDB4NjExQiwgMHg5QUFGLCAweDg5NTYsIDB4NThFOSwgMHg3Rjc3LCAweDY0RkEsIDB4NjU1NywgMHg5ODEyLAotICAgIDB4OEZBNiwgMHg3RDQ2LCAweDVFNkIsIDB4N0Q4MSwgMHg5MzhBLCAweDhCMTcsIDB4OThGRCwgMHg1QkY2LAotICAgIDB4NTgzMSwgMHg5QjkxLCAweDhGMjksIDB4OEM5RCwgMHg5MkM3LCAweDcyRkQsIDB4NTA5OSwgMHg2MThBLAotICAgIDB4N0RCMywgMHg3QjQ2LCAweDc1NjIsIDB4NjU4MywgMHg1RTYzLCAweDk1ODksIDB4OTA4QSwgMHg3REU4LAotICAgIDB4OENCNiwgMHg4QjhBLCAweDhGQUYsIDB4OEZBRSwgMHg2QTE5LCAweDlDNDksIDB4NzY1RiwgMHg3MDE1LAotICAgIDB4NkZGMSwgMHg4Q0QzLCAweDY0RUYsIDB4OTkwNSwgMHg2NEE1LCAweDkyNjIsIDB4OTI1MSwgMHg5OUMxLAotICAgIDB4ODhEQywgMHg4Q0ExLCAweDUzQzMsIDB4ODgzNiwgMHg2Qjk4LCAweDYxNUEsIDB4NjE1OCwgMHg3MUU2LAotICAgIDB4ODRCQywgMHg4MjU5LCAweDUwMDksIDB4NkVDNCwgMHg1M0EwLCAweDUwNzQsIDB4NkUyQywgMHg1QzY0LAotICAgIDB4OEE2QiwgMHg2NTE5LCAweDY0N0IsIDB4ODdFQywgMHg5OTVFLCAweDhCOTIsIDB4N0U4RiwgMHg5M0RGLAotICAgIDB4NzUyMywgMHg5NUUxLCAweDk4NkIsIDB4NTgzNCwgMHg1NjE3LCAweDk1NzcsIDB4NTExRiwgMHg4MTc4LAotICAgIDB4NUVFMCwgMHg2NkEyLCAweDkyMTQsIDB4OEVDQSwgMHg1RkI5LCAweDU4NzUsIDB4OTY3MywgMHg4OTZGLAotICAgIDB4N0EzMSwgMHg2MUYyLCAweDhBQTAsIDB4OUEwMSwgMHg5MDcyLCAweDk5QjMsIDB4OUY1MiwgMHg3MUJFLAotICAgIDB4ODg1RCwgMHg4N0YyLCAweDVCRjUsIDB4NzU4NywgMHg4RThBLCAweDdDNEMsIDB4N0RBMiwgMHg5MTlDLAotICAgIDB4OTJFNCwgMHg5NkRCLCAweDc5MEUsIDB4NTEzMiwgMHg4OUY4LCAweDg2NTUsIDB4NTBCMywgMHg3NjIxLAotICAgIDB4OTVENiwgMHg1Mjc1LCAweDkzMTgsIDB4N0QxNCwgMHg3REJELCAweDhGQUQsIDB4OEE1RSwgMHg4Q0RDLAotICAgIDB4ODA3MCwgMHg1RjlFLCAweDUzRTIsIDB4OEVBNSwgMHg3QUM0LCAweDkzMkYsIDB4OTA1NCwgMHg1RTM2LAotICAgIDB4OENCOCwgMHg2NEQ0LCAweDU1QUUsIDB4OTEzMiwgMHg2NEEzLCAweDgxQkQsIDB4NjE5QSwgMHg4QTk1LAotICAgIDB4NUY0OCwgMHg3NTc2LCAweDY0Q0IsIDB4OUVFOCwgMHg4NTY5LCAweDZBOTQsIDB4NjQxNywgMHg1Q0Y2LAotICAgIDB4NzlCMSwgMHg1QzBFLCAweDcxQzgsIDB4OTEyNywgMHg2NTc1LCAweDZFQ0MsIDB4OTA1RSwgMHg3REUwLAotICAgIDB4OTg1QiwgMHg5RURFLCAweDU4OEEsIDB4OTZGQiwgMHg2RkIxLCAweDkxRTMsIDB4OEFCRiwgMHg4QURDLAotICAgIDB4OTFEOCwgMHg5ODAyLCAweDkzMjAsIDB4OEEwMiwgMHg2NzcxLCAweDUyRDUsIDB4NjhERiwgMHg1MUNELAotICAgIDB4OUIyNSwgMHg3MkEyLCAweDczNjgsIDB4OEI4MCwgMHg4Q0VELCAweDkzNEQsIDB4OTM1QiwgMHg2NUI3LAotICAgIDB4N0RERSwgMHg5NjhBLCAweDVDMEQsIDB4NTY3OCwgMHg5ODEzLCAweDkyMEQsIDB4NTk2QSwgMHg1OEFFLAotICAgIDB4OUQ1RCwgMHg5ODRELCAweDhBMUIsIDB4NjBFMSwgMHg5OTEzLCAweDUxNTIsIDB4NzIzRSwgMHg5OTBDLAotICAgIDB4OENCMywgMHg3NjdDLCAweDdGNzAsIDB4OTVBNSwgMHg3OTJDLCAweDkxRTksIDB4NzE2OSwgMHg3QkM0LAotICAgIDB4OENBOSwgMHg5OEVGLCAweDhBMkEsIDB4N0QyMSwgMHg5OERCLCAweDhBQjksIDB4NUVFMiwgMHg4Q0JCLAotICAgIDB4N0QxQiwgMHg1OEIzLCAweDU5NkUsIDB4NjFBNCwgMHg3Q0RFLCAweDhDNTAsIDB4Njk1MywgMHg5MkQyLAotICAgIDB4OThBOCwgMHg3NjBCLCAweDk5QUUsIDB4N0UyQiwgMHg4QUY3LCAweDlDRjMsIDB4ODE5QSwgMHg4RjNCLAotICAgIDB4NjRBQiwgMHg4RjE0LCAweDhDRTYsIDB4NUZBOSwgMHg4Q0EwLCAweDhBMDMsIDB4NUE2NiwgMHg3RTFCLAotICAgIDB4OEE3MiwgMHg5MjIzLCAweDg0Q0IsIDB4NUU3OSwgMHg4RDk1LCAweDhEMUIsIDB4NUNBMSwgMHg1MjVCLAotICAgIDB4OTJGQywgMHg3REIxLCAweDVEMTcsIDB4OTNBQywgMHg2NEYxLCAweDlEM0YsIDB4OTVBMywgMHg5MjdCLAotICAgIDB4NTAwQiwgMHg3RDY2LCAweDlGOTQsIDB4OTc4RiwgMHg4Q0EyLCAweDkyMEUsIDB4NkU5RCwgMHg2OUNCLAotICAgIDB4OENGQywgMHg4ODMxLCAweDk4NjcsIDB4NTI2RSwgMHg5NURDLCAweDg5QzAsIDB4OTkyOCwgMHg2MTYzLAotICAgIDB4OENBQiwgMHg1RUUzLCAweDg5OEYsIDB4NkI3OCwgMHg5RjlDLCAweDk1QTgsIDB4OEVDQywgMHg4QTZELAotICAgIDB4NkFDMywgMHg4Q0I0LCAweDUyOEEsIDB4OEYyNSwgMHg5MzRCLCAweDU3MEIsIDB4OTA0RSwgMHg5OUVELAotICAgIDB4OTdEMywgMHg2RjIyLCAweDg2NUYsIDB4OTVBMSwgMHg5REI0LCAweDhDQzAsIDB4OEY1RiwgMHg5RDNCLAotICAgIDB4N0QwNSwgMHg1OEZBLCAweDhCNzcsIDB4NkVFQywgMHg1NjI5LCAweDgzRUYsIDB4NzU2QiwgMHg1MjgzLAotICAgIDB4OEE3MSwgMHg2MUY3LCAweDU4REUsIDB4NkI2MSwgMHg3NEIwLCAweDkwODQsIDB4N0RFOSwgMHg4QjBBLAotICAgIDB4NjNFRSwgMHg4RjFELCAweDhDQzQsIDB4N0E2MiwgMHg2NzAzLCAweDcxRjQsIDB4NTMyRiwgMHg4QUYxLAotICAgIDB4OEFBOCwgMHg3RTZBLCAweDg0NzcsIDB4NkUzRSwgMHg3MzcyLCAweDhDQTgsIDB4Nzk4RCwgMHg2NENBLAotICAgIDB4NkE1RiwgMHg3QTRELCAweDk5NTEsIDB4OEI0RiwgMHg5REM0LCAweDdFM0UsIDB4N0RERCwgMHg2OTc1LAotICAgIDB4OEYyRiwgMHg3RDFBLCAweDY0RTAsIDB4NUU3RSwgMHg4NThBLCAweDUyOTEsIDB4NkZERiwgMHg4QTA4LAotICAgIDB4OEExOCwgMHg5NjlCLCAweDdFN0MsIDB4N0QwMCwgMHg1OTNFLCAweDgzQTIsIDB4OTgzMCwgMHg4Q0M4LAotICAgIDB4OTI0MCwgMHg1MEY5LCAweDk5RDUsIDB4NkJCMiwgMHg3NkUzLCAweDU4MDUsIDB4N0I4QiwgMHg5NTkzLAotICAgIDB4ODI3MSwgMHg3REQ4LCAweDdFNkQsIDB4NkFBMiwgMHg5RTdDLCAweDYzQzAsIDB4NjRCRiwgMHg3QzIxLAotICAgIDB4NTEwOSwgMHg4NUE2LCAweDZBQkIsIDB4OTQ1MiwgMHg4RTEwLCAweDhDRTQsIDB4ODk4QiwgMHg5Mzc1LAotICAgIDB4ODI2NiwgMHg1MjhELCAweDk5MUUsIDB4NkYzOCwgMHg2RkZBLCAweDZGOTcsIDB4NUMwNywgMHg2RjNGLAotICAgIDB4ODUyMywgMHg2OUYzLCAweDU5NkMsIDB4OEIxQiwgMHg5MUFDLCAweDgxQTAsIDB4NkY4NiwgMHg5QTU1LAotICAgIDB4NUIwQywgMHg2NTJBLCAweDkyNzgsIDB4NzdFRiwgMHg1MEU1LCAweDk5MDMsIDB4N0U3MywgMHg3RDVFLAotICAgIDB4OEY0RSwgMHg4RjAzLCAweDk2OEUsIDB4N0JDMCwgMHg2RjU0LCAweDdENTAsIDB4OEFBMSwgMHg3RENBLAotICAgIDB4OTMyNiwgMHg1MEM1LCAweDhCMzksIDB4OTAzMiwgMHg3MUZDLCAweDc2RTEsIDB4NTJDMSwgMHg4Mzk2LAotICAgIDB4OUJFOCwgMHg5QTVBLCAweDdEOTMsIDB4OTgzOCwgMHg5M0UxLCAweDVGOTEsIDB4NzVEOSwgMHg3QUY2LAotICAgIDB4N0NGRSwgMHg4MjBBLCAweDk5RDIsIDB4ODIwOSwgMHg2NERBLCAweDkyRjgsIDB4NjFGQywgMHg1Mjg3LAotICAgIDB4OUQ1MSwgMHg3RDc5LCAweDg5QkEsIDB4OEEyMywgMHg3RDc2LCAweDkyMUUsIDB4OEVDRCwgMHg5OUZGLAotICAgIDB4OTU4QiwgMHg1MUYxLCAweDk4NDYsIDB4NkJCQiwgMHg4QUIyLCAweDU4QkUsIDB4NjFDNywgMHg2NDczLAotICAgIDB4NUVBQiwgMHg4OTMyLCAweDhBODcsIDB4NTg0QSwgMHg1MTA4LCAweDVCRUMsIDB4NzkyNiwgMHg2NkUwLAotICAgIDB4ODY2NywgMHg1RENCLCAweDdBQkEsIDB4OTk0QiwgMHg2RjcwLCAweDY0RjQsIDB4OTVDQSwgMHg4ODFGLAotICAgIDB4ODFEOCwgMHg4NDBBLCAweDRGODYsIDB4OENGNCwgMHg4NUNELCAweDZCMDQsIDB4NjUxNCwgMHg3QzQzLAotICAgIDB4OTVDQywgMHg4NjJELCAweDcwM0UsIDB4OEI5NSwgMHg2NTJDLCAweDg5QkQsIDB4NjFGNiwgMHg3RTlDLAotICAgIDB4NzIxQiwgMHg2RkVCLCAweDY0ODgsIDB4NTJERSwgMHg2Rjg3LCAweDZBMDIsIDB4OTQzMywgMHg1OEQ4LAotICAgIDB4OTg1RSwgMHg3QzZDLCAweDk2RTIsIDB4NzA1NSwgMHg4OENGLCAweDlCQzksIDB4NzlBRSwgMHg5RTk3LAotICAgIDB4NTNCMiwgMHg1MkY1LCAweDc5MkIsIDB4NkI3NywgMHg3MDFELCAweDk2QjgsIDB4NTAwNiwgMHg4MDZGLAotICAgIDB4ODRFRSwgMHg5MDIzLCAweDk0MkUsIDB4NjE5MCwgMHg2RjIzLCAweDdDM0UsIDB4NjU4MiwgMHg4MUM5LAotICAgIDB4OTNDOCwgMHg2MjAwLCAweDcxNDksIDB4N0RGNCwgMHg3Q0U3LCAweDUxNjksIDB4OEYxQiwgMHg4QUQyLAotICAgIDB4NzY0MiwgMHg5MDdDLCAweDk0MTAsIDB4NzM3NSwgMHg4MUU4LCAweDkxMzAsIDB4OUM1NywgMHg4Q0MzLAotICAgIDB4OUY2MSwgMHg5MjM0LCAweDk3NDgsIDB4NURCQSwgMHg5ODE4LCAweDk5M0UsIDB4NTI4OSwgMHg5RjhELAotICAgIDB4ODA3RSwgMHg1NkE4LCAweDdDNjAsIDB4NThERiwgMHg2NTBGLCAweDk2QjQsIDB4NkExMywgMHg1QTQxLAotICAgIDB4NjQ1RiwgMHg3QzBELCAweDg2MDYsIDB4NzZFNywgMHg5ODcxLCAweDVFRUMsIDB4NzIxMCwgMHg2NEM0LAotICAgIDB4NkVGNywgMHg4NjVDLCAweDlCNkYsIDB4OENDMiwgMHg5MzMyLCAweDk2NzgsIDB4OUE2MiwgMHg5MkMxLAotICAgIDB4NUM2MiwgMHg3RTM3LCAweDYxNkUsIDB4NkZGRSwgMHg3REQxLCAweDVERDIsIDB4NjUyMywgMHg1QjdGLAotICAgIDB4NzA2NCwgMHg0RTgyLCAweDYzODQsIDB4OEYyQSwgMHg1MDJCLCAweDRGOTYsIDB4NkRFQSwgMHg3REI4LAotICAgIDB4OEFENiwgMHg4NjNGLCAweDdGODUsIDB4OTA4RiwgMHg5NDdDLCAweDdDNkUsIDB4OUEzRSwgMHg5OUYxLAotICAgIDB4N0Q2MSwgMHg1QUJELCAweDc0NkEsIDB4NzhCQywgMHg4NzlFLCAweDk5QUMsIDB4OTlFMSwgMHg1NUNFLAotICAgIDB4OENCNywgMHg5RUE1LCAweDhDRTMsIDB4OTA4MSwgMHg3NzlFLCAweDk5NDUsIDB4ODgzQiwgMHg2RUZGLAotICAgIDB4OEIzRSwgMHg5MzI4LCAweDkyNUEsIDB4OENCRiwgMHg5MzgyLCAweDk1ODAsIDB4NjBCNiwgMHg1MDExLAotICAgIDB4OTMzMywgMHg1OTIyLCAweDhCMEUsIDB4NUY0QywgMHg4OTkzLCAweDdEQkYsIDB4N0RFQywgMHg1RURGLAotICAgIDB4NkVDNSwgMHg2MUFCLCAweDk1QTksIDB4OUNGNCwgMHg5Mjk4LCAweDhCMkMsIDB4OEIwMCwgMHg3NTVELAotICAgIDB4OTIwOSwgMHg3RDBELCAweDk2RTMsIDB4NjQ5MywgMHg4MTY2LCAweDYwRjEsIDB4OUIyNywgMHg5OTEyLAotICAgIDB4NjRFQywgMHg4MUE5LCAweDY1MDYsIDB4OTFDMCwgMHg5Q0U1LCAweDgwNzYsIDB4NTY5OSwgMHg5NDc3LAotICAgIDB4OTNCMywgMHg2QUI4LCAweDczNzAsIDB4NUJFNywgMHg2NEYwLCAweDZGRDgsIDB4OTIxNSwgMHg3RDEwLAotICAgIDB4ODFCRiwgMHg2RkMzLCAweDhGQjIsIDB4NzYyNywgMHg4QUZFLCAweDZCNTAsIDB4OURENywgMHg2QkM2LAotICAgIDB4NTYxNCwgMHg2RjFBLCAweDc2RTQsIDB4OUY5MCwgMHg4Q0UwLCAweDU2NzQsIDB4OUQ2QywgMHg5QTE5LAotICAgIDB4OThDNCwgMHg5ODNCLCAweDhDQTcsIDB4ODYwQiwgMHg2MTkxLCAweDhBNTUsIDB4NkY1MSwgMHg5ODE3LAotICAgIDB4NjRCMiwgMHg5MkVBLCAweDUwRDUsIDB4NkEzOCwgMHg4QjVDLCAweDgxQ0QsIDB4OUY0QSwgMHg5QTBFLAotICAgIDB4OEM0OCwgMHg1NTUzLCAweDZDMjMsIDB4OEExNiwgMHg3MjdELCAweDkxRkEsIDB4OTI1QiwgMHg5MDc3LAotICAgIDB4N0MzRCwgMHg4QjE5LCAweDkzMjIsIDB4OTI1NywgMHg2REZBLCAweDhCNzQsIDB4NTg3OSwgMHg2OUNELAotICAgIDB4NTVDNiwgMHg1OEJCLCAweDg1OTQsIDB4NjQzNiwgMHg5MzZDLCAweDZBNEIsIDB4NTVBQywgMHg1MEQxLAotICAgIDB4N0ZGOSwgMHg3QUM1LCAweDdBQ0EsIDB4NkIzRCwgMHg4OUFBLCAweDVCRTIsIDB4OEYxNSwgMHg2QzJCLAotICAgIDB4NTBCRSwgMHg5ODAzLCAweDhBQ0IsIDB4NjE3NiwgMHg3NENBLCAweDdBQUUsIDB4OERBOCwgMHg1MzQwLAotICAgIDB4OEVDMCwgMHg5QTQ1LCAweDlGNzIsIDB4OTg3NCwgMHg2QjBBLCAweDUyRjgsIDB4OUQ3MiwgMHg3OEJBLAotICAgIDB4OEI5MywgMHg5OTUyLCAweDY0RkUsIDB4N0U1RSwgMHg3MUIxLCAweDk3Q0MsIDB4OEE4RCwgMHg3RDA5LAotICAgIDB4NjlBRSwgMHg3RDY4LCAweDhFREYsIDB4OTJFRCwgMHg5NThGLCAweDZGNjQsIDB4NzA1MSwgMHg4NUE5LAotICAgIDB4OUMxMywgMHg4Q0ZELCAweDUwOTgsIDB4NTVBQSwgMHg5QTM3LCAweDYzODMsIDB4NkY4MCwgMHg2QkJBLAotICAgIDB4N0QxNywgMHg3QkU5LCAweDY2RUMsIDB4OTU4MywgMHg5NjVELCAweDhEMEQsIDB4N0U1NSwgMHg1MEI3LAotICAgIDB4OENERSwgMHg3MUQyLCAweDdEMzksIDB4OENEMiwgMHg2MzY4LCAweDY1MUQsIDB4NjFGRSwgMHg4QTJELAotICAgIDB4N0QzMywgMHg1QkU5LCAweDVCMzgsIDB4ODE0RSwgMHg2RUYyLCAweDgwNzIsIDB4N0U2OSwgMHg1MkRELAotICAgIDB4ODA1NiwgMHg1RTJCLCAweDczNDUsIDB4NkZENSwgMHg4QTY5LCAweDY2NDIsIDB4ODc1NSwgMHg1QkU2LAotICAgIDB4OEI1OCwgMHg5OURCLCAweDUyRTIsIDB4OTA2OSwgMHg5MUNCLCAweDk4RkUsIDB4ODk5NiwgMHg4QTY2LAotICAgIDB4NThGRCwgMHg3Mzc4LCAweDZBMUUsIDB4OEYzOCwgMHg2NkY4LCAweDhEMTYsIDB4NUM2QywgMHg4ODUzLAotICAgIDB4NkEzOSwgMHg3QUVBLCAweDY1NzgsIDB4NUUyNSwgMHg5NkQ5LCAweDhBQjAsIDB4OTgwNiwgMHg4QUFDLAotICAgIDB4NzhBOSwgMHg3MjBELCAweDdENzIsIDB4OThGQywgMHg5QjA2LCAweDgwNzMsIDB4NjE2QiwgMHg5ODBDLAotICAgIDB4OEExRiwgMHg4QUE2LCAweDY0RkIsIDB4ODYwNywgMHg4QTM0LCAweDgwODUsIDB4OTZENiwgMHg5NkE4LAotICAgIDB4N0Q4RiwgMHg2QjcyLCAweDVCNkIsIDB4NjQwRCwgMHg3RTJFLCAweDc0NjMsIDB4OTM5NiwgMHg3MzdBLAotICAgIDB4NjRCQiwgMHg4MUZBLCAweDYxNEIsIDB4NjUyNCwgMHg4Q0FBLCAweDc2NzEsIDB4NzA1OCwgMHg1OEM3LAotICAgIDB4OEI1QSwgMHg4QUM3LCAweDU2MDYsIDB4NkU2RiwgMHg3MUQ5LCAweDZGRTQsIDB4N0UyNywgMHg4QTBFLAotICAgIDB4OUEzMCwgMHg4QjA0LCAweDkyQkIsIDB4OTg0QywgMHg5QUQ0LCAweDY4OUQsIDB4OENCQywgMHg5NDM1LAotICAgIDB4NUVGMywgMHg4MDdELCAweDcwRjQsIDB4OTI4NSwgMHg3RDcxLCAweDk4MkQsIDB4NTcxNiwgMHg1ODU3LAotICAgIDB4NTcxOCwgMHg5ODNELCAweDlEMTUsIDB4OTlCMSwgMHg5OURELCAweDZBNjIsIDB4N0FBQSwgMHg4OTZBLAotICAgIDB4NUY0RSwgMHg3MDYzLCAweDk4MTEsIDB4ODQyQywgMHg3REIyLCAweDk3Q0IsIDB4OTA1NSwgMHg1NzBELAotICAgIDB4NzIzMiwgMHg2RkYwLCAweDdEQUQsIDB4ODQ2NiwgMHg1MDQ5LCAweDUwREUsIDB4N0RFRiwgMHg4QjAyLAotICAgIDB4ODg1QiwgMHg4MDVFLCAweDdEMEIsIDB4N0E2OSwgMHg1NTRGLCAweDY0QkUsIDB4ODc3OCwgMHg2RTI2LAotICAgIDB4N0FBOSwgMHg1NURBLCAweDkzQTIsIDB4NzBDRiwgMHg4QUEzLCAweDcxMjEsIDB4ODU2QSwgMHg1ODYyLAotICAgIDB4OTcyNywgMHg1MkQ5LCAweDhBQTQsIDB4OTMyQiwgMHg3MkE3LCAweDg5NzIsIDB4N0ZEMiwgMHg5MjkxLAotICAgIDB4NjIzMiwgMHg3RDMwLCAweDg3NjYsIDB4OEY0NCwgMHg1Q0ZELCAweDRGRTAsIDB4NzJGOSwgMHg1Njg3LAotICAgIDB4OTM0MSwgMHg5QkFFLCAweDdFOTYsIDB4OENFMiwgMHg5MjlDLCAweDk1OTEsIDB4OTg2RiwgMHg5NkFBLAotICAgIDB4NzNGRSwgMHg3MzdCLCAweDdFMjMsIDB4OTkyMSwgMHg2MUIyLCAweDdEQUIsIDB4OTQ3MiwgMHg5MTA5LAotICAgIDB4OEE3MywgMHg5N0ZGLCAweDk4MDUsIDB4ODU2RCwgMHg1NkMyLCAweDkyQjcsIDB4NjZDOSwgMHg1NjJGLAotICAgIDB4NTM1NCwgMHg2MzNFLCAweDgxMDUsIDB4OEFFNywgMHg1QkVCLCAweDcwMDksIDB4OEIxRCwgMHg5MkM1LAotICAgIDB4OTFDMSwgMHg4MjA4LCAweDkyQjksIDB4N0Q4OSwgMHg5ODA4LCAweDhBMzEsIDB4N0REMiwgMHg3RThDLAotICAgIDB4OEVEMiwgMHg2MUY4LCAweDkwNzgsIDB4NzY2QywgMHg3RDYyLCAweDVCNzgsIDB4NTJEQiwgMHg4QTYyLAotICAgIDB4NUMwQiwgMHg5OUI0LCAweDhBMTMsIDB4OEEwQSwgMHg5MDVDLCAweDU4RDMsIDB4OUQwOSwgMHg5RDI4LAotICAgIDB4NTU1RSwgMHg0RTlFLCAweDhBMUQsIDB4OTVCOSwgMHg5RTdELCAweDU2QjQsIDB4OTg1NCwgMHg5NUJCLAotICAgIDB4ODI3NywgMHg1M0FELCAweDc4NkYsIDB4OEFGQSwgMHg5QTU3LCAweDlEMjYsIDB4Njk0QSwgMHg2M0RBLAotICAgIDB4NzYwRCwgMHg5NjdELCAweDc2NjIsIDB4OTkwQSwgMHg2QTIzLCAweDU4MkYsIDB4OEIyMSwgMHg4NUU1LAotICAgIDB4NzIzQSwgMHg5ODAxLCAweDY5NkQsIDB4ODQ0OSwgMHg5MUFCLCAweDkyQTUsIDB4OTgyNCwgMHg5MDdBLAotICAgIDB4NTEwMCwgMHg4N0ZCLCAweDg1REQsIDB4NTEwNCwgMHg2MUI2LCAweDdGQTksIDB4OEE2MywgMHg4QjcwLAotICAgIDB4OEFCQywgMHg4QjZGLCAweDdFNzksIDB4ODUyRCwgMHg5NjcwLCAweDkyODAsIDB4OThGMiwgMHg5NkIxLAotICAgIDB4NkFGQiwgMHg1QjMwLCAweDlERjksIDB4NjFDOSwgMHg3RTkzLCAweDc0NjksIDB4ODdBMiwgMHg3MURGLAotICAgIDB4NzE5MiwgMHg4ODA1LCAweDhEMEYsIDB4N0E0RSwgMHg1NUIyLCAweDY0QzEsIDB4NTBBRCwgMHg3NjcwLAotICAgIDB4OEUzNCwgMHg1MTJBLCAweDYxODIsIDB4OTBGNSwgMHg5MjNFLCAweDczMzYsIDB4OEE5OCwgMHg4RjNGLAotICAgIDB4OTkxOCwgMHg5QjVBLCAweDZGMDEsIDB4ODIwNywgMHg1REJDLCAweDhBOUUsIDB4OUIzMSwgMHg3MzQ0LAotICAgIDB4OEI3RCwgMHg5ODEwLCAweDk5QUQsIDB4OUQxQiwgMHg2REY1LCAweDhGNDUsIDB4NTcxMiwgMHg1NEUxLAotICAgIDB4NTcxMywgMHg3REUzLCAweDkwNjAsIDB4OTg1OCwgMHg3RDA0LCAweDhFOEQsIDB4OTQ3MCwgMHg5NUIyLAotICAgIDB4OTZGMiwgMHg5MTE2LCAweDk2OTUsIDB4OTA0QiwgMHg4NUY0LCAweDkxOTYsIDB4NjY4OCwgMHg5NkRDLAotICAgIDB4OEYwOSwgMHg2NTIyLCAweDY2QUIsIDB4OEQwQSwgMHg4RDFDLCAweDgxREYsIDB4OTQ3RiwgMHg2OEQ3LAotICAgIDB4N0FDOCwgMHg4Q0FDLCAweDY0QzcsIDB4NTI0NywgMHg2RkE0LCAweDhDQ0EsIDB4OEQwOCwgMHg4RUNCLAotICAgIDB4OTM1OCwgMHg5NTk4LCAweDhBNTAsIDB4OUY0QiwgMHg1MEI1LCAweDZDMDgsIDB4NzZERSwgMHg2NUFDLAotICAgIDB4OEYzRSwgMHg1RDg0LCAweDY4RTcsIDB4NjIzMCwgMHg3REJCLCAweDVGMzUsIDB4NkYzMiwgMHg1RTMzLAotICAgIDB4OENFQywgMHg4MTM5LCAweDhEOTksIDB4ODdDNCwgMHg4RjRELCAweDkzN0EsIDB4OTAxOSwgMHg4QzlFLAotICAgIDB4OTFERCwgMHg1MDc1LCAweDhBM0EsIDB4OTNBRSwgMHg5NjYzLCAweDVFNDAsIDB4NzY2NSwgMHg5MTJELAotICAgIDB4OEI0OSwgMHg3RTU0LCAweDgwNzcsIDB4NTdGNywgMHg4ODc5LCAweDdEMTksIDB4NjQ2RiwgMHg2NEYyLAotICAgIDB4NUU1RiwgMHg4Q0VBLCAweDZFRUYsIDB4OTQxOCwgMHg3RDQyLCAweDdBMkUsIDB4ODE2QiwgMHg4ODQ2LAotICAgIDB4OEIwNSwgMHg4RUY4LCAweDc2QkEsIDB4NjY1RCwgMHg5QTVGLCAweDhBRjgsIDB4OEE4NSwgMHg3MUVELAotICAgIDB4NzdEQSwgMHg1NkQxLCAweDhDQUYsIDB4OTQ0NCwgMHg3QkM5LCAweDk5RDAsIDB4NUMwOCwgMHg3OERBLAotICAgIDB4OEY0OSwgMHg4Q0ZBLCAweDZBMDEsIDB4ODM4QSwgMHg4OERELCAweDU5OUQsIDB4NThFRiwgMHg3MkMwLAotICAgIDB4OTMxMCwgMHg4RDA1LCAweDU4OUMsIDB4N0RCNCwgMHg4QUM0LCAweDZFOTYsIDB4NkZDMSwgMHg4Q0M3LAotICAgIDB4NkYyQywgMHg3RDlDLCAweDdFM0QsIDB4N0UzMSwgMHg5MTEyLCAweDhBNUIsIDB4N0Q0NCwgMHg5NDdELAotICAgIDB4NTVDNywgMHg1Mzk5LCAweDUzQjQsIDB4OTc2OCwgMHg4RDBCLCAweDUzMkQsIDB4NTMzMSwgMHg4Q0ZFLAotICAgIDB4NTI0NCwgMHg1MjhDLCAweDUyNzQsIDB4NTBCNCwgMHg1MDAwLCAweDUwOTYsIDB4NTExNSwgMHg1MTAyLAotICAgIDB4NTExNCwgMHg1MTNDLCAweDUxMzcsIDB4NTBFOCwgMHg1MEMyLCAweDUxM0IsIDB4NTExMCwgMHg1MTNBLAotICAgIDB4NTBDOSwgMHg3Q0Y0LCAweDlFQ0MsIDB4NTZDNSwgMHg5Q0VDLCAweDg5M0IsIDB4ODFFMCwgMHg4QTAxLAotICAgIDB4OEExMCwgMHg4QTBDLCAweDhBMTUsIDB4OEIzMywgMHg4QTRFLCAweDhBMjUsIDB4OEE0MSwgMHg4QTM2LAotICAgIDB4OEE0NiwgMHg4QTU0LCAweDhBNTgsIDB4OEE1MiwgMHg4QTg2LCAweDhBODQsIDB4OEE3RiwgMHg4QTcwLAotICAgIDB4OEE3QywgMHg4QTc1LCAweDhBNkMsIDB4OEE2RSwgMHg4QUNELCAweDhBRTIsIDB4OEE2MSwgMHg4QTlBLAotICAgIDB4OEFBNSwgMHg4QTkxLCAweDhBOTIsIDB4OEFDRiwgMHg4QUQxLCAweDhBQzksIDB4OEFEQiwgMHg4QUQ3LAotICAgIDB4OEFDMiwgMHg4QUI2LCAweDhBRjYsIDB4OEFFQiwgMHg4QjE0LCAweDhCMDEsIDB4OEFFNCwgMHg4QUVELAotICAgIDB4OEFGQywgMHg4QUYzLCAweDhBRTYsIDB4OEFFRSwgMHg4QURFLCAweDhCMjgsIDB4OEI5QywgMHg4QjE2LAotICAgIDB4OEIxQSwgMHg4QjEwLCAweDhCMkIsIDB4OEIyRCwgMHg4QjU2LCAweDhCNTksIDB4OEI0RSwgMHg4QjlFLAotICAgIDB4OEI2QiwgMHg4Qjk2LCAweDk2NTgsIDB4OTEzQSwgMHg5MTE0LCAweDkxMzQsIDB4OTBERiwgMHg5MTM2LAotICAgIDB4OTEwNiwgMHg5MTQ4LCAweDgyQkIsIDB4NTJGMSwgMHg1REYwLCAweDU4MEEsIDB4NThEOSwgMHg1OEUyLAotICAgIDB4NThFMCwgMHg1OERBLCAweDU3RTEsIDB4NTg0RiwgMHg1ODE2LCAweDU4NTIsIDB4NTgxRCwgMHg1ODY0LAotICAgIDB4ODU4QywgMHg4NTUzLCAweDg1RjYsIDB4ODNBNywgMHg4NDA3LCAweDg0RUYsIDB4ODJFNywgMHg4NjIyLAotICAgIDB4ODUyNiwgMHg1ODRCLCAweDcxNjIsIDB4ODU1OCwgMHg4NEZELCAweDg1NEUsIDB4ODU4OCwgMHg4NUJBLAotICAgIDB4NzI5NiwgMHg2RUNFLCAweDg1NDEsIDB4ODVDRSwgMHg4NTUyLCAweDg0QzAsIDB4ODQ1MiwgMHg4NDY0LAotICAgIDB4ODQ5NCwgMHg4NDM1LCAweDg1OUYsIDB4ODU1NSwgMHg5REFGLCAweDg0OTMsIDB4N0UwOCwgMHg4NTQ2LAotICAgIDB4ODU2MiwgMHg4NTFFLCAweDlBNDAsIDB4ODYzQSwgMHg5M0EzLCAweDg1NzcsIDB4ODYxRSwgMHg4NUZBLAotICAgIDB4ODYwNCwgMHg4NUVBLCAweDg2MUEsIDB4NTk2OSwgMHg1QzM3LCAweDYzNkIsIDB4NjQ3NiwgMHg2NDlGLAotICAgIDB4NjQ1MSwgMHg2NDVDLCAweDY0QjMsIDB4NjUwNCwgMHg2NTE2LCAweDY0RjcsIDB4NjRGQywgMHg2NTFCLAotICAgIDB4NTYzMCwgMHg1NjM4LCAweDU2QzgsIDB4NTZBNiwgMHg1NTA0LCAweDU0QkMsIDB4NTY4MCwgMHg1NjVELAotICAgIDB4NTY2MCwgMHg1NjM1LCAweDU1RjYsIDB4NTY2NiwgMHg1NjcyLCAweDU2OEMsIDB4NTY2NSwgMHg1NjFDLAotICAgIDB4NTYyRSwgMHg1NUU5LCAweDU2MTYsIDB4NTZDMCwgMHg1NjBELCAweDU2QjMsIDB4NTZDMSwgMHg1NjZGLAotICAgIDB4OEY2MSwgMHg1NkI2LCAweDU2OTUsIDB4NTcwNywgMHg1RTQzLCAweDVFNkMsIDB4NUU1OCwgMHg1RTU3LAotICAgIDB4NUQ4NywgMHg1Q0Y0LCAweDVENTAsIDB4NUQyQywgMHg1REE3LCAweDVEQTAsIDB4NUQ5NywgMHg1RDBELAotICAgIDB4NURCOCwgMHg1RDgxLCAweDVERDQsIDB4NUZBMCwgMHg3Mzc3LCAweDczNDEsIDB4NzM2QSwgMHg3MzNCLAotICAgIDB4NzM2QiwgMHg3MzgwLCAweDczN0MsIDB4OThFMCwgMHg5OTMzLCAweDk4RTksIDB4OTkzQywgMHg5OEVBLAotICAgIDB4OThFQiwgMHg5OEVELCAweDk4RjQsIDB4OTkwOSwgMHg5OTExLCAweDk5MUIsIDB4OTkzNywgMHg5OTNGLAotICAgIDB4OTk0MywgMHg5OTQ4LCAweDk5NDksIDB4OTk0QSwgMHg5OTRDLCAweDk5NjIsIDB4NUVFMSwgMHg4Q0UxLAotICAgIDB4NjFGQSwgMHg2MUFFLCAweDYxNkEsIDB4NjEzRSwgMHg2MEI1LCAweDYxMzQsIDB4NjFDQywgMHg2MTVGLAotICAgIDB4NjFFOCwgMHg2MEZCLCAweDYxMzcsIDB4NjBGMiwgMHg2MTczLCAweDYxMUMsIDB4NjE5MiwgMHg5NTgyLAotICAgIDB4OTU4NiwgMHg5NUM4LCAweDk1OEUsIDB4OTU5NCwgMHg5NThDLCAweDk1RTUsIDB4OTVBRCwgMHg5NUFCLAotICAgIDB4OUIyRSwgMHg5NUFDLCAweDk1QkUsIDB4OTVCNiwgMHg5QjI5LCAweDk1QkYsIDB4OTVCRCwgMHg5NUJDLAotICAgIDB4OTVDMywgMHg5NUNCLCAweDk1RDQsIDB4OTVEMCwgMHg5NUQ1LCAweDk1REUsIDB4NzA0MywgMHg2RjU5LAotICAgIDB4NzAyNywgMHg3MDE4LCAweDZGRkMsIDB4NkQ4NywgMHg2RDc5LCAweDZFNUUsIDB4NkZBRSwgMHg3MDBGLAotICAgIDB4NkVGOCwgMHg2RjZGLCAweDZERjYsIDB4NkY3RiwgMHg3MDA2LCAweDZGQTAsIDB4NzAwQiwgMHg3MDY3LAotICAgIDB4NzA0NCwgMHg3MDA1LCAweDZGNzcsIDB4NzAyMCwgMHg3MDFGLCAweDcwMzIsIDB4NzAyOCwgMHg3MDVELAotICAgIDB4OUEyQiwgMHg5MDg3LCAweDkwMTUsIDB4OTA5MCwgMHg1QzY4LCAweDVGMzMsIDB4NUFGNSwgMHg1QUQ3LAotICAgIDB4NUIwMCwgMHg1QTZELCAweDVCMDgsIDB4NUI0QywgMHg1QUE3LCAweDVBRkIsIDB4NUIwQiwgMHg1QjIxLAotICAgIDB4NUIyQSwgMHg1QjE5LCAweDk5RDQsIDB4OTlERiwgMHg5OUQ5LCAweDlBMzYsIDB4OUE1QiwgMHg5OUQxLAotICAgIDB4OTlEOCwgMHg5QTRELCAweDlBNEEsIDB4OTlFMiwgMHg5QTZBLCAweDlBMEYsIDB4OUEwRCwgMHg5QTA1LAotICAgIDB4OUE0MiwgMHg5QTJELCAweDlBMTYsIDB4OUE0MSwgMHg5QTJFLCAweDlBMzgsIDB4OUE0MywgMHg5QTQ0LAotICAgIDB4OUE0RiwgMHg5QTY1LCAweDlBNjQsIDB4N0NGOSwgMHg3RDA2LCAweDdEMDIsIDB4N0QwNywgMHg3RDA4LAotICAgIDB4N0U4QSwgMHg3RDFDLCAweDdEMTUsIDB4N0QxMywgMHg3RDNBLCAweDdEMzIsIDB4N0QzMSwgMHg3RTEwLAotICAgIDB4N0QzQywgMHg3RDQwLCAweDdEM0YsIDB4N0Q1RCwgMHg3RDRFLCAweDdENzMsIDB4N0Q4NiwgMHg3RDgzLAotICAgIDB4N0Q4OCwgMHg3REJFLCAweDdEQkEsIDB4N0RDQiwgMHg3REQ0LCAweDdEQzQsIDB4N0Q5RSwgMHg3REFDLAotICAgIDB4N0RCOSwgMHg3REEzLCAweDdEQjAsIDB4N0RDNywgMHg3REQ5LCAweDdERDcsIDB4N0RGOSwgMHg3REYyLAotICAgIDB4N0U2MiwgMHg3REU2LCAweDdERjYsIDB4N0RGMSwgMHg3RTBCLCAweDdERTEsIDB4N0UwOSwgMHg3RTFELAotICAgIDB4N0UxRiwgMHg3RTFFLCAweDdFMkQsIDB4N0UwQSwgMHg3RTExLCAweDdFN0QsIDB4N0UzOSwgMHg3RTM1LAotICAgIDB4N0UzMiwgMHg3RTQ2LCAweDdFNDUsIDB4N0U4OCwgMHg3RTVBLCAweDdFNTIsIDB4N0U2RSwgMHg3RTdFLAotICAgIDB4N0U3MCwgMHg3RTZGLCAweDdFOTgsIDB4NzRBMywgMHg3NDRCLCAweDc0Q0YsIDB4OTgwQSwgMHg3NEJELAotICAgIDB4NzQzRiwgMHg3NDg5LCAweDc0QTYsIDB4NzRENCwgMHg3NERBLCAweDk3RDksIDB4OTdERSwgMHg5N0RDLAotICAgIDB4NjlBQSwgMHg2QUVBLCAweDY4OTgsIDB4NjhENiwgMHg2QTA1LCAweDY4OUYsIDB4NkFEQiwgMHg2QUYzLAotICAgIDB4NkFFOCwgMHg2QURGLCAweDZBODksIDB4NjkwRiwgMHg2QTQ4LCAweDY5NjgsIDB4NjlCRiwgMHg2QTNBLAotICAgIDB4NkE5QywgMHg2QjEyLCAweDZCMUUsIDB4NkFERCwgMHg2OUU3LCAweDZCMEYsIDB4NkIxNiwgMHg2QUVDLAotICAgIDB4NkFEQSwgMHg2QUY4LCAweDZBQjMsIDB4NkFFNywgMHg2QUEzLCAweDZBRDMsIDB4NkFERSwgMHg2QkE0LAotICAgIDB4NkI5RSwgMHg2QkFFLCAweDZCQUIsIDB4NkJBRiwgMHg4RUQ0LCAweDhFREIsIDB4OEVGMiwgMHg4RUZCLAotICAgIDB4OEY2NCwgMHg4RUY5LCAweDhFRkMsIDB4OEVFQiwgMHg4RUU0LCAweDhGNjIsIDB4OEVGQSwgMHg4RUZFLAotICAgIDB4OEYwQSwgMHg4RjA3LCAweDhGMDUsIDB4OEYxMiwgMHg4RjI2LCAweDhGMUUsIDB4OEYxRiwgMHg4RjFDLAotICAgIDB4OEYzMywgMHg4RjQ2LCAweDhGNTQsIDB4NjIxNCwgMHg2MjI3LCAweDc1MEMsIDB4NjZDNywgMHg2NkM0LAotICAgIDB4NjY4OSwgMHg2NkQ2LCAweDhDQzEsIDB4OENCMCwgMHg4Q0JBLCAweDhDQkQsIDB4OEQwNCwgMHg4Q0IyLAotICAgIDB4OENDNSwgMHg4RDEwLCAweDhDRDEsIDB4OENEQSwgMHg4Q0Q1LCAweDhDRUIsIDB4OENFNywgMHg4Q0ZCLAotICAgIDB4ODk5OCwgMHg4OUFDLCAweDg5QTEsIDB4ODlCRiwgMHg4OUE2LCAweDg5QUYsIDB4ODlCMiwgMHg4OUI3LAotICAgIDB4NkJGRiwgMHg2QzBDLCAweDZDMkMsIDB4NzI1OCwgMHg2NzI3LCAweDgxNTYsIDB4ODFEQSwgMHg4MTFCLAotICAgIDB4ODFCRSwgMHg4MTYxLCAweDgxQ0YsIDB4NkI1RiwgMHg5OEFFLCAweDk4QUYsIDB4OThCNiwgMHg5OEJDLAotICAgIDB4OThDNiwgMHg5OEM4LCAweDhGNDIsIDB4OUY0RiwgMHg2NTk1LCAweDcxNkMsIDB4NzE1MiwgMHg3MTk3LAotICAgIDB4NzFDMSwgMHg3MURDLCAweDcxRkUsIDB4NzlCMCwgMHg3OThFLCAweDc5QUEsIDB4NjFERiwgMHg2MTY0LAotICAgIDB4NjFFMywgMHg2MjA3LCAweDZGQTksIDB4NzhFRiwgMHg3OEFELCAweDc4NjgsIDB4NzhCOCwgMHg3OTJBLAotICAgIDB4NzkzMSwgMHg3ODY0LCAweDc4RkQsIDB4NzhFNywgMHg3OEUzLCAweDlGOTUsIDB4Nzc5OCwgMHg3NzVFLAotICAgIDB4NzdCQywgMHg3Rjg2LCAweDdGODgsIDB4OTFEMiwgMHg5MUQzLCAweDkxRDQsIDB4OTFEOSwgMHg5MUQ3LAotICAgIDB4OTFENSwgMHg5MUY3LCAweDkxRTcsIDB4OTFFNCwgMHg5MzQ2LCAweDkxRjUsIDB4OTFGOSwgMHg5MjA4LAotICAgIDB4OTIyNiwgMHg5MjQ1LCAweDkyMTEsIDB4OTIxMCwgMHg5MjAxLCAweDkyMjcsIDB4OTIwNCwgMHg5MjI1LAotICAgIDB4OTIwMCwgMHg5MjNBLCAweDkyNjYsIDB4OTIzNywgMHg5MjMzLCAweDkyNTUsIDB4OTIzRCwgMHg5MjM4LAotICAgIDB4OTI1RSwgMHg5MjZDLCAweDkyNkQsIDB4OTIzRiwgMHg5NDYwLCAweDkyMzAsIDB4OTI0OSwgMHg5MjQ4LAotICAgIDB4OTI0RCwgMHg5MjJFLCAweDkyMzksIDB4OTQzOCwgMHg5MkFDLCAweDkyQTAsIDB4OTI3QSwgMHg5MkFBLAotICAgIDB4OTJFRSwgMHg5MkNGLCAweDk0MDMsIDB4OTJFMywgMHg5NDNBLCAweDkyQjEsIDB4OTJBNiwgMHg5M0E3LAotICAgIDB4OTI5NiwgMHg5MkNDLCAweDkyQTksIDB4OTNGNSwgMHg5MjkzLCAweDkyN0YsIDB4OTNBOSwgMHg5MjlBLAotICAgIDB4OTMxQSwgMHg5MkFCLCAweDkyODMsIDB4OTQwQiwgMHg5MkE4LCAweDkyQTMsIDB4OTQxMiwgMHg5MzM4LAotICAgIDB4OTJGMSwgMHg5M0Q3LCAweDkyRTUsIDB4OTJGMCwgMHg5MkVGLCAweDkyRTgsIDB4OTJCQywgMHg5MkRELAotICAgIDB4OTJGNiwgMHg5NDI2LCAweDk0MjcsIDB4OTJDMywgMHg5MkRGLCAweDkyRTYsIDB4OTMxMiwgMHg5MzA2LAotICAgIDB4OTM2OSwgMHg5MzFCLCAweDkzNDAsIDB4OTMwMSwgMHg5MzE1LCAweDkzMkUsIDB4OTM0MywgMHg5MzA3LAotICAgIDB4OTMwOCwgMHg5MzFGLCAweDkzMTksIDB4OTM2NSwgMHg5MzQ3LCAweDkzNzYsIDB4OTM1NCwgMHg5MzY0LAotICAgIDB4OTNBQSwgMHg5MzcwLCAweDkzODQsIDB4OTNFNCwgMHg5M0Q4LCAweDk0MjgsIDB4OTM4NywgMHg5M0NDLAotICAgIDB4OTM5OCwgMHg5M0I4LCAweDkzQkYsIDB4OTNBNiwgMHg5M0IwLCAweDkzQjUsIDB4OTQ0QywgMHg5M0UyLAotICAgIDB4OTNEQywgMHg5M0RELCAweDkzQ0QsIDB4OTNERSwgMHg5M0MzLCAweDkzQzcsIDB4OTNEMSwgMHg5NDE0LAotICAgIDB4OTQxRCwgMHg5M0Y3LCAweDk0NjUsIDB4OTQxMywgMHg5NDZELCAweDk0MjAsIDB4OTQ3OSwgMHg5M0Y5LAotICAgIDB4OTQxOSwgMHg5NDRBLCAweDk0MzIsIDB4OTQzRiwgMHg5NDU0LCAweDk0NjMsIDB4OTM3RSwgMHg3QTYxLAotICAgIDB4OUNFOSwgMHg5Q0Y2LCAweDlEMDcsIDB4OUQwNiwgMHg5RDIzLCAweDlEODcsIDB4OUUxNSwgMHg5RDFELAotICAgIDB4OUQxRiwgMHg5REU1LCAweDlEMkYsIDB4OUREOSwgMHg5RDMwLCAweDlENDIsIDB4OUUxRSwgMHg5RDUzLAotICAgIDB4OUUxRCwgMHg5RDYwLCAweDlENTIsIDB4OURGMywgMHg5RDVDLCAweDlENjEsIDB4OUQ5MywgMHg5RDZBLAotICAgIDB4OUQ2RiwgMHg5RDg5LCAweDlEOTgsIDB4OUQ5QSwgMHg5REMwLCAweDlEQTUsIDB4OURBOSwgMHg5REMyLAotICAgIDB4OURCQywgMHg5RTFBLCAweDlERDMsIDB4OUREQSwgMHg5REVGLCAweDlERTYsIDB4OURGMiwgMHg5REY4LAotICAgIDB4OUUwQywgMHg5REZBLCAweDlFMUIsIDB4NzY2NCwgMHg3NjU4LCAweDc2NjcsIDB4NzYwMiwgMHg3NjQ2LAotICAgIDB4NzY0NywgMHg3NjQ5LCAweDc2MUUsIDB4NzYzQiwgMHg3NjZELCAweDc2NkUsIDB4NzY2OSwgMHg3NjcyLAotICAgIDB4N0FDNywgMHg3QUI2LCAweDg5NjAsIDB4ODkzMywgMHg4OTVELCAweDg5NDcsIDB4ODkzOCwgMHg4OTY0LAotICAgIDB4NzZCOCwgMHg4MDJFLCAweDgwMkMsIDB4ODA3OSwgMHg4MDc1LCAweDk4MDcsIDB4OTgwRSwgMHg5ODBGLAotICAgIDB4OTgyMSwgMHg5ODFDLCAweDZGNDEsIDB4OTgyNiwgMHg5ODM3LCAweDk4NEUsIDB4OTg1MywgMHg5ODczLAotICAgIDB4OTg2MiwgMHg5ODU5LCAweDk4NjUsIDB4OTg2QywgMHg5ODcwLCAweDg3RTMsIDB4ODgwNiwgMHg4NzA2LAotICAgIDB4ODgyMywgMHg4N0Y2LCAweDg2RkEsIDB4ODdFRiwgMHg4Nzg0LCAweDg4MTAsIDB4ODdDOCwgMHg4ODExLAotICAgIDB4ODdCQiwgMHg4N0NFLCAweDdGNEMsIDB4N0JFNCwgMHg3QjY3LCAweDdDNjksIDB4N0JGMywgMHg3QzAwLAotICAgIDB4N0JDQiwgMHg3QzVDLCAweDdDMUUsIDB4N0MyQiwgMHg3QzIzLCAweDdDNkEsIDB4N0M1RiwgMHg4MjY0LAotICAgIDB4ODI2QiwgMHg4OENBLCAweDdGQTUsIDB4N0NGMiwgMHg3Q0Y2LCAweDdDREQsIDB4N0UzNiwgMHg5RUE5LAotICAgIDB4OERCMiwgMHg5MUM1LCAweDkxQzMsIDB4OUU3QSwgMHg4RTg5LCAweDhFNEMsIDB4OEU5MiwgMHg4RTdBLAotICAgIDB4OEU1NSwgMHg4RTlBLCAweDhFOEIsIDB4OEU5MywgMHg4RTkxLCAweDhFQTEsIDB4OEU2MywgMHg4RUFBLAotICAgIDB4OEVBNiwgMHg4OUY0LCAweDg5RjYsIDB4OTc1QSwgMHg5NzQyLCAweDk3M0QsIDB4OTc0NCwgMHg5RjU0LAotICAgIDB4OUY1RiwgMHg5RjU5LCAweDlGNjAsIDB4OUY1QywgMHg5RjY2LCAweDlGNkMsIDB4OUY2QSwgMHg5Rjc3LAotICAgIDB4OUVGRCwgMHg5RUZGLCAweDlGMDksIDB4OEI4RSwgMHg5NDdFLCAweDkzRTgsIDB4OUI3NywgMHg5Qjc0LAotICAgIDB4OUI4MSwgMHg5QjgzLCAweDlCOEUsIDB4OUM3OCwgMHg3QTRDLCAweDlCOTIsIDB4OUM1RiwgMHg5QjkwLAotICAgIDB4OUJBRCwgMHg5QjlBLCAweDlCQUEsIDB4OUI5RSwgMHg5QzZELCAweDlCQUIsIDB4OUI5RCwgMHg5QzU4LAotICAgIDB4OUJDMSwgMHg5QzdBLCAweDlDMzEsIDB4OUMzOSwgMHg5QzIzLCAweDlDMzcsIDB4OUJDMCwgMHg5QkNBLAotICAgIDB4OUJDNywgMHg5QkZELCAweDlCRDYsIDB4OUJFQSwgMHg5QkVCLCAweDlCRTEsIDB4OUJFNCwgMHg5QkU3LAotICAgIDB4OUJERCwgMHg5QkUyLCAweDlCRjAsIDB4OUJEQiwgMHg5QkY0LCAweDlCRDQsIDB4OUM1RCwgMHg5QzA4LAotICAgIDB4OUMxMCwgMHg5QzBELCAweDlDMTIsIDB4OUMwOSwgMHg5QkZGLCAweDlDMjAsIDB4OUMzMiwgMHg5QzJELAotICAgIDB4OUMyOCwgMHg5QzI1LCAweDlDMjksIDB4OUMzMywgMHg5QzNFLCAweDlDNDgsIDB4OUMzQiwgMHg5QzM1LAotICAgIDB4OUM0NSwgMHg5QzU2LCAweDlDNTQsIDB4OUM1MiwgMHg5QzY3LCAweDk3QzMsIDB4OTdCRCwgMHg5N0M5LAotICAgIDB4OURCQiwgMHg5QUNGLCAweDlBRDYsIDB4OUFENSwgMHg5QjU4LCAweDlCNEUsIDB4OTk1NywgMHg5OTVDLAotICAgIDB4OUIyMiwgMHg5RUY3LCAweDlFRjIsIDB4ODk2QywgMHg5NUM2LCAweDkzMzYsIDB4NUY0NiwgMHg4NTE0LAotICAgIDB4N0U5NCwgMHg5RjYzLCAweDU2NzksIDB4OUYxNSwgMHg1NjQxLCAweDlBRUUsIDB4ODkwNywgMHg3QTQwLAotICAgIDB4OThCMywgMHg5NUE0LCAweDlCMEQsIDB4OEZGNCwgMHg1RjU5LCAweDdBNkIsIDB4OThFMiwgMHg1MEEyLAotICAgIDB4ODU5MSwgMHg1MTE4LCAweDYzNzIsIDB4NTI0QiwgMHg3NzRGLCAweDdFOEQsIDB4NjZDNiwgMHg3N0FELAotICAgIDB4OUU3NSwgMHg1NkM5LCAweDlFRjQsIDB4NkZEQiwgMHg2MURFLCAweDc3QzcsIDB4NzAzMCwgMHg5RUI1LAotICAgIDB4ODg0QSwgMHg5NUUyLCAweDk3QzYsIDB4N0M2NCwgMHg3RTM0LCAweDk3QTYsIDB4OUVBRiwgMHg1NkNDLAotICAgIDB4OThCMSwgMHg2QUFGLCAweDdGNEUsIDB4N0NGMCwgMHg0RkMyLCAweDdFNkIsIDB4OUU3OSwgMHg1NkFFLAotICAgIDB4OUIxQSwgMHg4NDZGLCAweDc5QTYsIDB4N0M3MiwgMHg5QUQyLCAweDk2QkIsIDB4N0RGQiwgMHg4OEZELAotICAgIDB4Nzg0MywgMHgyMTcwLCAweDIxNzEsIDB4MjE3MiwgMHgyMTczLCAweDIxNzQsIDB4MjE3NSwgMHgyMTc2LAotICAgIDB4MjE3NywgMHgyMTc4LCAweDIxNzksIDB4MDJDQSwgMHgwMkNCLCAweDAyRDksIDB4MjAxMywgMHgyMDE1LAotICAgIDB4MjAyNSwgMHgyMDM1LCAweDIxMDUsIDB4MjEwOSwgMHgyMTk2LCAweDIxOTcsIDB4MjE5OCwgMHgyMTk5LAotICAgIDB4MjIxNSwgMHgyMjFGLCAweDIyMjMsIDB4MjI1MiwgMHgyMjY2LCAweDIyNjcsIDB4MjJCRiwgMHgyNTUwLAotICAgIDB4MjU1MSwgMHgyNTUyLCAweDI1NTMsIDB4MjU1NCwgMHgyNTU1LCAweDI1NTYsIDB4MjU1NywgMHgyNTU4LAotICAgIDB4MjU1OSwgMHgyNTVBLCAweDI1NUIsIDB4MjU1QywgMHgyNTVELCAweDI1NUUsIDB4MjU1RiwgMHgyNTYwLAotICAgIDB4MjU2MSwgMHgyNTYyLCAweDI1NjMsIDB4MjU2NCwgMHgyNTY1LCAweDI1NjYsIDB4MjU2NywgMHgyNTY4LAotICAgIDB4MjU2OSwgMHgyNTZBLCAweDI1NkIsIDB4MjU2QywgMHgyNTZELCAweDI1NkUsIDB4MjU2RiwgMHgyNTcwLAotICAgIDB4MjU3MSwgMHgyNTcyLCAweDI1NzMsIDB4MjU4MSwgMHgyNTgyLCAweDI1ODMsIDB4MjU4NCwgMHgyNTg1LAotICAgIDB4MjU4NiwgMHgyNTg3LCAweDI1ODgsIDB4MjU4OSwgMHgyNThBLCAweDI1OEIsIDB4MjU4QywgMHgyNThELAotICAgIDB4MjU4RSwgMHgyNThGLCAweDI1OTMsIDB4MjU5NCwgMHgyNTk1LCAweDI1QkMsIDB4MjVCRCwgMHgyNUUyLAotICAgIDB4MjVFMywgMHgyNUU0LCAweDI1RTUsIDB4MjYwOSwgMHgyMjk1LCAweDMwMTIsIDB4MzAxRCwgMHgzMDFFLAotICAgIDB4MzAyMSwgMHgzMDIyLCAweDMwMjMsIDB4MzAyNCwgMHgzMDI1LCAweDMwMjYsIDB4MzAyNywgMHgzMDI4LAotICAgIDB4MzAyOSwgMHgzMkEzLCAweDMzOEUsIDB4MzM4RiwgMHgzMzlDLCAweDMzOUQsIDB4MzM5RSwgMHgzM0ExLAotICAgIDB4MzNDNCwgMHgzM0NFLCAweDMzRDEsIDB4MzNEMiwgMHgzM0Q1LCAweEZFMzAsIDB4RkZFMiwgMHhGRkU0LAotICAgIDB4MjEyMSwgMHgzMjMxLCAweDIwMTAsIDB4MzBGQywgMHgzMDlCLCAweDMwOUMsIDB4MzBGRCwgMHgzMEZFLAotICAgIDB4MzAwNiwgMHgzMDlELCAweDMwOUUsIDB4RkU0OSwgMHhGRTRBLCAweEZFNEIsIDB4RkU0QywgMHhGRTRELAotICAgIDB4RkU0RSwgMHhGRTRGLCAweEZFNTAsIDB4RkU1MSwgMHhGRTUyLCAweEZFNTQsIDB4RkU1NSwgMHhGRTU2LAotICAgIDB4RkU1NywgMHhGRTU5LCAweEZFNUEsIDB4RkU1QiwgMHhGRTVDLCAweEZFNUQsIDB4RkU1RSwgMHhGRTVGLAotICAgIDB4RkU2MCwgMHhGRTYxLCAweEZFNjIsIDB4RkU2MywgMHhGRTY0LCAweEZFNjUsIDB4RkU2NiwgMHhGRTY4LAotICAgIDB4RkU2OSwgMHhGRTZBLCAweEZFNkIsIDB4MzAzRSwgMHgyRkYwLCAweDJGRjEsIDB4MkZGMiwgMHgyRkYzLAotICAgIDB4MkZGNCwgMHgyRkY1LCAweDJGRjYsIDB4MkZGNywgMHgyRkY4LCAweDJGRjksIDB4MkZGQSwgMHgyRkZCLAotICAgIDB4NEUwMiwgMHg0RTA0LCAweDRFMDUsIDB4NEUwNiwgMHg0RTBGLCAweDRFMTIsIDB4NEUxNywgMHg0RTFGLAotICAgIDB4NEUyMCwgMHg0RTIxLCAweDRFMjMsIDB4NEUyNiwgMHg0RTI5LCAweDRFMkUsIDB4NEUyRiwgMHg0RTMxLAotICAgIDB4NEUzMywgMHg0RTM1LCAweDRFMzcsIDB4NEUzQywgMHg0RTQwLCAweDRFNDEsIDB4NEU0MiwgMHg0RTQ0LAotICAgIDB4NEU0NiwgMHg0RTRBLCAweDRFNTEsIDB4NEU1NSwgMHg0RTU3LCAweDRFNUEsIDB4NEU1QiwgMHg0RTYyLAotICAgIDB4NEU2MywgMHg0RTY0LCAweDRFNjUsIDB4NEU2NywgMHg0RTY4LCAweDRFNkEsIDB4NEU2QiwgMHg0RTZDLAotICAgIDB4NEU2RCwgMHg0RTZFLCAweDRFNkYsIDB4NEU3MiwgMHg0RTc0LCAweDRFNzUsIDB4NEU3NiwgMHg0RTc3LAotICAgIDB4NEU3OCwgMHg0RTc5LCAweDRFN0EsIDB4NEU3QiwgMHg0RTdDLCAweDRFN0QsIDB4NEU3RiwgMHg0RTgwLAotICAgIDB4NEU4MSwgMHg0RTgzLCAweDRFODQsIDB4NEU4NSwgMHg0RTg3LCAweDRFOEEsIDB4NEU5MCwgMHg0RTk2LAotICAgIDB4NEU5NywgMHg0RTk5LCAweDRFOUMsIDB4NEU5RCwgMHg0RUEzLCAweDRFQUEsIDB4NEVBRiwgMHg0RUIwLAotICAgIDB4NEVCMSwgMHg0RUI0LCAweDRFQjYsIDB4NEVCNywgMHg0RUI4LCAweDRFQjksIDB4NEVCQywgMHg0RUJELAotICAgIDB4NEVCRSwgMHg0RUM4LCAweDRFQ0MsIDB4NEVDRiwgMHg0RUQwLCAweDRFRDIsIDB4NEVEQSwgMHg0RURCLAotICAgIDB4NEVEQywgMHg0RUUwLCAweDRFRTIsIDB4NEVFNiwgMHg0RUU3LCAweDRFRTksIDB4NEVFRCwgMHg0RUVFLAotICAgIDB4NEVFRiwgMHg0RUYxLCAweDRFRjQsIDB4NEVGOCwgMHg0RUY5LCAweDRFRkEsIDB4NEVGQywgMHg0RUZFLAotICAgIDB4NEYwMCwgMHg0RjAyLCAweDRGMDMsIDB4NEYwNCwgMHg0RjA1LCAweDRGMDYsIDB4NEYwNywgMHg0RjA4LAotICAgIDB4NEYwQiwgMHg0RjBDLCAweDRGMTIsIDB4NEYxMywgMHg0RjE0LCAweDRGMTUsIDB4NEYxNiwgMHg0RjFDLAotICAgIDB4NEYxRCwgMHg0RjIxLCAweDRGMjMsIDB4NEYyOCwgMHg0RjI5LCAweDRGMkMsIDB4NEYyRCwgMHg0RjJFLAotICAgIDB4NEYzMSwgMHg0RjMzLCAweDRGMzUsIDB4NEYzNywgMHg0RjM5LCAweDRGM0IsIDB4NEYzRSwgMHg0RjNGLAotICAgIDB4NEY0MCwgMHg0RjQxLCAweDRGNDIsIDB4NEY0NCwgMHg0RjQ1LCAweDRGNDcsIDB4NEY0OCwgMHg0RjQ5LAotICAgIDB4NEY0QSwgMHg0RjRCLCAweDRGNEMsIDB4NEY1MiwgMHg0RjU0LCAweDRGNTYsIDB4NEY2MSwgMHg0RjYyLAotICAgIDB4NEY2NiwgMHg0RjY4LCAweDRGNkEsIDB4NEY2QiwgMHg0RjZELCAweDRGNkUsIDB4NEY3MSwgMHg0RjcyLAotICAgIDB4NEY3NSwgMHg0Rjc3LCAweDRGNzgsIDB4NEY3OSwgMHg0RjdBLCAweDRGN0QsIDB4NEY4MCwgMHg0RjgxLAotICAgIDB4NEY4MiwgMHg0Rjg1LCAweDRGODcsIDB4NEY4QSwgMHg0RjhDLCAweDRGOEUsIDB4NEY5MCwgMHg0RjkyLAotICAgIDB4NEY5MywgMHg0Rjk1LCAweDRGOTgsIDB4NEY5OSwgMHg0RjlBLCAweDRGOUMsIDB4NEY5RSwgMHg0RjlGLAotICAgIDB4NEZBMSwgMHg0RkEyLCAweDRGQTQsIDB4NEZBQiwgMHg0RkFELCAweDRGQjAsIDB4NEZCMSwgMHg0RkIyLAotICAgIDB4NEZCMywgMHg0RkI0LCAweDRGQjYsIDB4NEZCNywgMHg0RkI4LCAweDRGQjksIDB4NEZCQSwgMHg0RkJCLAotICAgIDB4NEZCQywgMHg0RkJELCAweDRGQkUsIDB4NEZDMCwgMHg0RkMxLCAweDRGQzYsIDB4NEZDNywgMHg0RkM4LAotICAgIDB4NEZDOSwgMHg0RkNCLCAweDRGQ0MsIDB4NEZDRCwgMHg0RkQyLCAweDRGRDMsIDB4NEZENCwgMHg0RkQ1LAotICAgIDB4NEZENiwgMHg0RkQ5LCAweDRGREIsIDB4NEZFMiwgMHg0RkU0LCAweDRGRTUsIDB4NEZFNywgMHg0RkVCLAotICAgIDB4NEZFQywgMHg0RkYwLCAweDRGRjIsIDB4NEZGNCwgMHg0RkY1LCAweDRGRjYsIDB4NEZGNywgMHg0RkY5LAotICAgIDB4NEZGQiwgMHg0RkZDLCAweDRGRkQsIDB4NEZGRiwgMHg1MDAxLCAweDUwMDIsIDB4NTAwMywgMHg1MDA0LAotICAgIDB4NTAwNSwgMHg1MDA3LCAweDUwMDgsIDB4NTAwQSwgMHg1MDBFLCAweDUwMTAsIDB4NTAxMywgMHg1MDE1LAotICAgIDB4NTAxNiwgMHg1MDE3LCAweDUwMUIsIDB4NTAxRCwgMHg1MDFFLCAweDUwMjAsIDB4NTAyMiwgMHg1MDIzLAotICAgIDB4NTAyNCwgMHg1MDI3LCAweDUwMkYsIDB4NTAzMCwgMHg1MDMxLCAweDUwMzIsIDB4NTAzMywgMHg1MDM0LAotICAgIDB4NTAzNSwgMHg1MDM2LCAweDUwMzcsIDB4NTAzOCwgMHg1MDM5LCAweDUwM0IsIDB4NTAzRCwgMHg1MDNGLAotICAgIDB4NTA0MCwgMHg1MDQxLCAweDUwNDIsIDB4NTA0NCwgMHg1MDQ1LCAweDUwNDYsIDB4NTA0QSwgMHg1MDRCLAotICAgIDB4NTA0RCwgMHg1MDUwLCAweDUwNTEsIDB4NTA1MiwgMHg1MDUzLCAweDUwNTQsIDB4NTA1NiwgMHg1MDU3LAotICAgIDB4NTA1OCwgMHg1MDU5LCAweDUwNUIsIDB4NTA1RCwgMHg1MDVFLCAweDUwNUYsIDB4NTA2MCwgMHg1MDYxLAotICAgIDB4NTA2MiwgMHg1MDYzLCAweDUwNjQsIDB4NTA2NiwgMHg1MDY3LCAweDUwNjgsIDB4NTA2OSwgMHg1MDZBLAotICAgIDB4NTA2QiwgMHg1MDZELCAweDUwNkUsIDB4NTA2RiwgMHg1MDcwLCAweDUwNzEsIDB4NTA3MiwgMHg1MDczLAotICAgIDB4NTA3OCwgMHg1MDc5LCAweDUwN0EsIDB4NTA3QywgMHg1MDdELCAweDUwODEsIDB4NTA4MiwgMHg1MDgzLAotICAgIDB4NTA4NCwgMHg1MDg2LCAweDUwODcsIDB4NTA4OSwgMHg1MDhBLCAweDUwOEIsIDB4NTA4QywgMHg1MDhFLAotICAgIDB4NTA4RiwgMHg1MDkwLCAweDUwOTEsIDB4NTA5MiwgMHg1MDkzLCAweDUwOTQsIDB4NTA5NSwgMHg1MDk3LAotICAgIDB4NTA5QSwgMHg1MDlCLCAweDUwOUMsIDB4NTA5RCwgMHg1MDlFLCAweDUwOUYsIDB4NTBBMCwgMHg1MEExLAotICAgIDB4NTBBNCwgMHg1MEE2LCAweDUwQUEsIDB4NTBBQiwgMHg1MEFFLCAweDUwQUYsIDB4NTBCMCwgMHg1MEIxLAotICAgIDB4NTBCNiwgMHg1MEI4LCAweDUwQjksIDB4NTBCQywgMHg1MEJELCAweDUwQkYsIDB4NTBDMCwgMHg1MEMxLAotICAgIDB4NTBDMywgMHg1MEM0LCAweDUwQzYsIDB4NTBDNywgMHg1MEM4LCAweDUwQ0EsIDB4NTBDQiwgMHg1MENDLAotICAgIDB4NTBDRCwgMHg1MENFLCAweDUwRDAsIDB4NTBEMiwgMHg1MEQzLCAweDUwRDQsIDB4NTBENywgMHg1MEQ4LAotICAgIDB4NTBEOSwgMHg1MERCLCAweDUwREMsIDB4NTBERCwgMHg1MERGLCAweDUwRTAsIDB4NTBFMSwgMHg1MEUyLAotICAgIDB4NTBFMywgMHg1MEU0LCAweDUwRTksIDB4NTBFQSwgMHg1MEVCLCAweDUwRUYsIDB4NTBGMCwgMHg1MEYxLAotICAgIDB4NTBGMiwgMHg1MEY0LCAweDUwRjYsIDB4NTBGNywgMHg1MEY4LCAweDUwRkEsIDB4NTBGQywgMHg1MEZELAotICAgIDB4NTBGRSwgMHg1MEZGLCAweDUxMDEsIDB4NTEwMywgMHg1MTA1LCAweDUxMEEsIDB4NTEwQywgMHg1MTBELAotICAgIDB4NTEwRSwgMHg1MTBGLCAweDUxMTEsIDB4NTExMywgMHg1MTE2LCAweDUxMTcsIDB4NTExOSwgMHg1MTFBLAotICAgIDB4NTExQiwgMHg1MTFDLCAweDUxMUQsIDB4NTExRSwgMHg1MTIwLCAweDUxMjIsIDB4NTEyMywgMHg1MTI0LAotICAgIDB4NTEyNSwgMHg1MTI2LCAweDUxMjcsIDB4NTEyOCwgMHg1MTI5LCAweDUxMkIsIDB4NTEyQywgMHg1MTJELAotICAgIDB4NTEyRSwgMHg1MTJGLCAweDUxMzAsIDB4NTEzMSwgMHg1MTMzLCAweDUxMzQsIDB4NTEzNSwgMHg1MTM2LAotICAgIDB4NTEzOCwgMHg1MTM5LCAweDUxM0QsIDB4NTEzRSwgMHg1MTQyLCAweDUxNDcsIDB4NTE0QSwgMHg1MTRDLAotICAgIDB4NTE0RSwgMHg1MTRGLCAweDUxNTAsIDB4NTE1MywgMHg1MTU3LCAweDUxNTgsIDB4NTE1OSwgMHg1MTVCLAotICAgIDB4NTE1RCwgMHg1MTVFLCAweDUxNUYsIDB4NTE2MCwgMHg1MTYxLCAweDUxNjMsIDB4NTE2NCwgMHg1MTY2LAotICAgIDB4NTE2NywgMHg1MTZBLCAweDUxNkYsIDB4NTE3MiwgMHg1MTdBLCAweDUxN0UsIDB4NTE3RiwgMHg1MTgzLAotICAgIDB4NTE4NCwgMHg1MTg2LCAweDUxODcsIDB4NTE4QSwgMHg1MThCLCAweDUxOEUsIDB4NTE4RiwgMHg1MTkwLAotICAgIDB4NTE5MSwgMHg1MTkzLCAweDUxOTQsIDB4NTE5OCwgMHg1MTlBLCAweDUxOUQsIDB4NTE5RSwgMHg1MTlGLAotICAgIDB4NTFBMSwgMHg1MUEzLCAweDUxQTYsIDB4NTFBNywgMHg1MUE4LCAweDUxQTksIDB4NTFBQSwgMHg1MUFELAotICAgIDB4NTFBRSwgMHg1MUI0LCAweDUxQjgsIDB4NTFCOSwgMHg1MUJBLCAweDUxQkUsIDB4NTFCRiwgMHg1MUMxLAotICAgIDB4NTFDMiwgMHg1MUMzLCAweDUxQzUsIDB4NTFDOCwgMHg1MUNBLCAweDUxQ0UsIDB4NTFEMCwgMHg1MUQyLAotICAgIDB4NTFEMywgMHg1MUQ0LCAweDUxRDUsIDB4NTFENiwgMHg1MUQ3LCAweDUxRDgsIDB4NTFEOSwgMHg1MURBLAotICAgIDB4NTFEQywgMHg1MURFLCAweDUxREYsIDB4NTFFMiwgMHg1MUUzLCAweDUxRTUsIDB4NTFFNiwgMHg1MUU3LAotICAgIDB4NTFFOCwgMHg1MUU5LCAweDUxRUEsIDB4NTFFQywgMHg1MUVFLCAweDUxRjIsIDB4NTFGNCwgMHg1MUY3LAotICAgIDB4NTFGRSwgMHg1MjA0LCAweDUyMDUsIDB4NTIwOSwgMHg1MjBCLCAweDUyMEMsIDB4NTIwRiwgMHg1MjEwLAotICAgIDB4NTIxMywgMHg1MjE0LCAweDUyMTUsIDB4NTIxQywgMHg1MjFFLCAweDUyMUYsIDB4NTIyMSwgMHg1MjIyLAotICAgIDB4NTIyMywgMHg1MjI1LCAweDUyMjYsIDB4NTIyNywgMHg1MjJBLCAweDUyMkMsIDB4NTIyRiwgMHg1MjMxLAotICAgIDB4NTIzMiwgMHg1MjM0LCAweDUyMzUsIDB4NTIzQywgMHg1MjNFLCAweDUyNDUsIDB4NTI0NiwgMHg1MjQ4LAotICAgIDB4NTI0OSwgMHg1MjRFLCAweDUyNEYsIDB4NTI1MiwgMHg1MjUzLCAweDUyNTUsIDB4NTI1NywgMHg1MjU4LAotICAgIDB4NTI1OSwgMHg1MjVBLCAweDUyNUQsIDB4NTI1RiwgMHg1MjYwLCAweDUyNjIsIDB4NTI2MywgMHg1MjY0LAotICAgIDB4NTI2NiwgMHg1MjY4LCAweDUyNkIsIDB4NTI2QywgMHg1MjZELCAweDUyNzAsIDB4NTI3MSwgMHg1MjczLAotICAgIDB4NTI3NiwgMHg1Mjc3LCAweDUyNzgsIDB4NTI3OSwgMHg1MjdBLCAweDUyN0IsIDB4NTI3QywgMHg1MjdFLAotICAgIDB4NTI4MCwgMHg1Mjg0LCAweDUyODUsIDB4NTI4NiwgMHg1MjhCLCAweDUyOEUsIDB4NTI4RiwgMHg1MjkyLAotICAgIDB4NTI5NCwgMHg1Mjk1LCAweDUyOTYsIDB4NTI5NywgMHg1Mjk4LCAweDUyOTksIDB4NTI5QSwgMHg1MjlDLAotICAgIDB4NTJBNCwgMHg1MkE1LCAweDUyQTYsIDB4NTJBNywgMHg1MkFFLCAweDUyQUYsIDB4NTJCMCwgMHg1MkI0LAotICAgIDB4NTJCNSwgMHg1MkI2LCAweDUyQjcsIDB4NTJCOCwgMHg1MkI5LCAweDUyQkEsIDB4NTJCQiwgMHg1MkJDLAotICAgIDB4NTJCRCwgMHg1MkMwLCAweDUyQzIsIDB4NTJDNCwgMHg1MkM1LCAweDUyQzYsIDB4NTJDOCwgMHg1MkNBLAotICAgIDB4NTJDQywgMHg1MkNELCAweDUyQ0UsIDB4NTJDRiwgMHg1MkQxLCAweDUyRDMsIDB4NTJENCwgMHg1MkQ3LAotICAgIDB4NTJEQSwgMHg1MkRDLCAweDUyRTAsIDB4NTJFMSwgMHg1MkUzLCAweDUyRTUsIDB4NTJFNiwgMHg1MkU3LAotICAgIDB4NTJFOCwgMHg1MkU5LCAweDUyRUEsIDB4NTJFQiwgMHg1MkVDLCAweDUyRUQsIDB4NTJFRSwgMHg1MkVGLAotICAgIDB4NTJGMiwgMHg1MkYzLCAweDUyRjQsIDB4NTJGNiwgMHg1MkY3LCAweDUyRkIsIDB4NTJGQywgMHg1MkZELAotICAgIDB4NTMwMSwgMHg1MzAyLCAweDUzMDMsIDB4NTMwNCwgMHg1MzA3LCAweDUzMDksIDB4NTMwQSwgMHg1MzBCLAotICAgIDB4NTMwQywgMHg1MzBFLCAweDUzMTEsIDB4NTMxMiwgMHg1MzEzLCAweDUzMTQsIDB4NTMxOCwgMHg1MzFCLAotICAgIDB4NTMxQywgMHg1MzFFLCAweDUzMUYsIDB4NTMyMiwgMHg1MzI0LCAweDUzMjUsIDB4NTMyNywgMHg1MzI4LAotICAgIDB4NTMyOSwgMHg1MzJCLCAweDUzMkMsIDB4NTMzMCwgMHg1MzMyLCAweDUzMzMsIDB4NTMzNCwgMHg1MzM1LAotICAgIDB4NTMzNiwgMHg1MzM3LCAweDUzMzgsIDB4NTMzQywgMHg1MzNELCAweDUzNDIsIDB4NTM0NCwgMHg1MzQ2LAotICAgIDB4NTM0QiwgMHg1MzRDLCAweDUzNEQsIDB4NTM1MCwgMHg1MzU4LCAweDUzNTksIDB4NTM1QiwgMHg1MzVELAotICAgIDB4NTM2NSwgMHg1MzY4LCAweDUzNkEsIDB4NTM2QywgMHg1MzZELCAweDUzNzIsIDB4NTM3NiwgMHg1Mzc5LAotICAgIDB4NTM3QiwgMHg1MzdDLCAweDUzN0QsIDB4NTM3RSwgMHg1MzgwLCAweDUzODEsIDB4NTM4MywgMHg1Mzg3LAotICAgIDB4NTM4OCwgMHg1MzhBLCAweDUzOEUsIDB4NTM4RiwgMHg1MzkwLCAweDUzOTEsIDB4NTM5MiwgMHg1MzkzLAotICAgIDB4NTM5NCwgMHg1Mzk2LCAweDUzOTcsIDB4NTM5QiwgMHg1MzlDLCAweDUzOUUsIDB4NTNBMSwgMHg1M0E0LAotICAgIDB4NTNBNywgMHg1M0FBLCAweDUzQUIsIDB4NTNBQywgMHg1M0FGLCAweDUzQjAsIDB4NTNCMSwgMHg1M0IzLAotICAgIDB4NTNCNSwgMHg1M0I3LCAweDUzQjgsIDB4NTNCOSwgMHg1M0JBLCAweDUzQkMsIDB4NTNCRCwgMHg1M0JFLAotICAgIDB4NTNDMCwgMHg1M0M0LCAweDUzQzUsIDB4NTNDNiwgMHg1M0M3LCAweDUzQ0UsIDB4NTNDRiwgMHg1M0QwLAotICAgIDB4NTNEMiwgMHg1M0QzLCAweDUzRDUsIDB4NTNEQSwgMHg1M0RDLCAweDUzREQsIDB4NTNERSwgMHg1M0UxLAotICAgIDB4NTNFNywgMHg1M0Y0LCAweDUzRkEsIDB4NTNGRSwgMHg1M0ZGLCAweDU0MDAsIDB4NTQwMiwgMHg1NDA1LAotICAgIDB4NTQwNywgMHg1NDBCLCAweDU0MTQsIDB4NTQxOCwgMHg1NDE5LCAweDU0MUEsIDB4NTQxQywgMHg1NDIyLAotICAgIDB4NTQyNCwgMHg1NDI1LCAweDU0MkEsIDB4NTQzMCwgMHg1NDMzLCAweDU0MzYsIDB4NTQzNywgMHg1NDNBLAotICAgIDB4NTQzRCwgMHg1NDNGLCAweDU0NDEsIDB4NTQ0MiwgMHg1NDQ0LCAweDU0NDUsIDB4NTQ0NywgMHg1NDQ5LAotICAgIDB4NTQ0QywgMHg1NDRELCAweDU0NEUsIDB4NTQ0RiwgMHg1NDUxLCAweDU0NUEsIDB4NTQ1RCwgMHg1NDVFLAotICAgIDB4NTQ1RiwgMHg1NDYwLCAweDU0NjEsIDB4NTQ2MywgMHg1NDY1LCAweDU0NjcsIDB4NTQ2OSwgMHg1NDZBLAotICAgIDB4NTQ2QiwgMHg1NDZDLCAweDU0NkQsIDB4NTQ2RSwgMHg1NDZGLCAweDU0NzAsIDB4NTQ3NCwgMHg1NDc5LAotICAgIDB4NTQ3QSwgMHg1NDdFLCAweDU0N0YsIDB4NTQ4MSwgMHg1NDgzLCAweDU0ODUsIDB4NTQ4NywgMHg1NDg4LAotICAgIDB4NTQ4OSwgMHg1NDhBLCAweDU0OEQsIDB4NTQ5MSwgMHg1NDkzLCAweDU0OTcsIDB4NTQ5OCwgMHg1NDlDLAotICAgIDB4NTQ5RSwgMHg1NDlGLCAweDU0QTAsIDB4NTRBMSwgMHg1NEEyLCAweDU0QTUsIDB4NTRBRSwgMHg1NEIwLAotICAgIDB4NTRCMiwgMHg1NEI1LCAweDU0QjYsIDB4NTRCNywgMHg1NEI5LCAweDU0QkEsIDB4NTRCRSwgMHg1NEMzLAotICAgIDB4NTRDNSwgMHg1NENBLCAweDU0Q0IsIDB4NTRENiwgMHg1NEQ4LCAweDU0REIsIDB4NTRFMCwgMHg1NEUyLAotICAgIDB4NTRFMywgMHg1NEU0LCAweDU0RUIsIDB4NTRFQywgMHg1NEVGLCAweDU0RjAsIDB4NTRGMSwgMHg1NEY0LAotICAgIDB4NTRGNSwgMHg1NEY2LCAweDU0RjcsIDB4NTRGOCwgMHg1NEY5LCAweDU0RkIsIDB4NTRGRSwgMHg1NTAwLAotICAgIDB4NTUwMiwgMHg1NTAzLCAweDU1MDUsIDB4NTUwOCwgMHg1NTBBLCAweDU1MEIsIDB4NTUwQywgMHg1NTBELAotICAgIDB4NTUwRSwgMHg1NTEyLCAweDU1MTMsIDB4NTUxNSwgMHg1NTE2LCAweDU1MTcsIDB4NTUxOCwgMHg1NTE5LAotICAgIDB4NTUxQSwgMHg1NTFDLCAweDU1MUQsIDB4NTUxRSwgMHg1NTFGLCAweDU1MjEsIDB4NTUyNSwgMHg1NTI2LAotICAgIDB4NTUyOCwgMHg1NTI5LCAweDU1MkIsIDB4NTUyRCwgMHg1NTMyLCAweDU1MzQsIDB4NTUzNSwgMHg1NTM2LAotICAgIDB4NTUzOCwgMHg1NTM5LCAweDU1M0EsIDB4NTUzQiwgMHg1NTNELCAweDU1NDAsIDB4NTU0MiwgMHg1NTQ1LAotICAgIDB4NTU0NywgMHg1NTQ4LCAweDU1NEIsIDB4NTU0QywgMHg1NTRELCAweDU1NEUsIDB4NTU1MSwgMHg1NTUyLAotICAgIDB4NTU1NCwgMHg1NTU3LCAweDU1NTgsIDB4NTU1OSwgMHg1NTVBLCAweDU1NUIsIDB4NTU1RCwgMHg1NTVGLAotICAgIDB4NTU2MCwgMHg1NTYyLCAweDU1NjMsIDB4NTU2OCwgMHg1NTY5LCAweDU1NkIsIDB4NTU2RiwgMHg1NTcwLAotICAgIDB4NTU3MSwgMHg1NTcyLCAweDU1NzMsIDB4NTU3NCwgMHg1NTc5LCAweDU1N0EsIDB4NTU3RCwgMHg1NTdGLAotICAgIDB4NTU4NSwgMHg1NTg2LCAweDU1OEMsIDB4NTU4RCwgMHg1NThFLCAweDU1OTAsIDB4NTU5MiwgMHg1NTkzLAotICAgIDB4NTU5NSwgMHg1NTk2LCAweDU1OTcsIDB4NTU5QSwgMHg1NTlCLCAweDU1OUUsIDB4NTVBMCwgMHg1NUExLAotICAgIDB4NTVBMiwgMHg1NUEzLCAweDU1QTQsIDB4NTVBNSwgMHg1NUE2LCAweDU1QTgsIDB4NTVBOSwgMHg1NUFCLAotICAgIDB4NTVBRCwgMHg1NUFGLCAweDU1QjAsIDB4NTVCNCwgMHg1NUI2LCAweDU1QjgsIDB4NTVCQSwgMHg1NUJDLAotICAgIDB4NTVCRiwgMHg1NUMwLCAweDU1QzEsIDB4NTVDMiwgMHg1NUMzLCAweDU1QzgsIDB4NTVDQSwgMHg1NUNCLAotICAgIDB4NTVDRiwgMHg1NUQwLCAweDU1RDUsIDB4NTVENywgMHg1NUQ4LCAweDU1RDksIDB4NTVEQiwgMHg1NURFLAotICAgIDB4NTVFMCwgMHg1NUUyLCAweDU1RTcsIDB4NTVFRCwgMHg1NUVFLCAweDU1RjAsIDB4NTVGMSwgMHg1NUY0LAotICAgIDB4NTVGOCwgMHg1NUY5LCAweDU1RkEsIDB4NTVGQiwgMHg1NUZDLCAweDU1RkYsIDB4NTYwMiwgMHg1NjAzLAotICAgIDB4NTYwNCwgMHg1NjA1LCAweDU2MDcsIDB4NTYwQSwgMHg1NjBCLCAweDU2MTAsIDB4NTYxMSwgMHg1NjEyLAotICAgIDB4NTYxMywgMHg1NjE1LCAweDU2MTksIDB4NTYxQSwgMHg1NjFELCAweDU2MjAsIDB4NTYyMSwgMHg1NjIyLAotICAgIDB4NTYyNSwgMHg1NjI2LCAweDU2MjgsIDB4NTYyQSwgMHg1NjJCLCAweDU2MzMsIDB4NTYzNywgMHg1NjNBLAotICAgIDB4NTYzQywgMHg1NjNELCAweDU2M0UsIDB4NTY0MCwgMHg1NjQyLCAweDU2NDMsIDB4NTY0NCwgMHg1NjQ1LAotICAgIDB4NTY0NiwgMHg1NjQ3LCAweDU2NDgsIDB4NTY0OSwgMHg1NjRBLCAweDU2NEIsIDB4NTY0RiwgMHg1NjUwLAotICAgIDB4NTY1MSwgMHg1NjUyLCAweDU2NTMsIDB4NTY1NSwgMHg1NjU2LCAweDU2NUEsIDB4NTY1QiwgMHg1NjVFLAotICAgIDB4NTY1RiwgMHg1NjYxLCAweDU2NjMsIDB4NTY2NywgMHg1NjZELCAweDU2NkUsIDB4NTY3MCwgMHg1NjczLAotICAgIDB4NTY3NSwgMHg1Njc3LCAweDU2N0EsIDB4NTY3RCwgMHg1NjdFLCAweDU2N0YsIDB4NTY4MSwgMHg1NjgyLAotICAgIDB4NTY4MywgMHg1Njg0LCAweDU2ODgsIDB4NTY4OSwgMHg1NjhBLCAweDU2OEIsIDB4NTY4RCwgMHg1NjkwLAotICAgIDB4NTY5MSwgMHg1NjkyLCAweDU2OTQsIDB4NTY5NiwgMHg1Njk3LCAweDU2OTgsIDB4NTY5QSwgMHg1NjlCLAotICAgIDB4NTY5QywgMHg1NjlELCAweDU2OUUsIDB4NTY5RiwgMHg1NkEwLCAweDU2QTEsIDB4NTZBMiwgMHg1NkE0LAotICAgIDB4NTZBNSwgMHg1NkE3LCAweDU2QTksIDB4NTZBQSwgMHg1NkFCLCAweDU2QUMsIDB4NTZBRCwgMHg1NkIwLAotICAgIDB4NTZCMSwgMHg1NkIyLCAweDU2QjUsIDB4NTZCOCwgMHg1NkI5LCAweDU2QkEsIDB4NTZCQiwgMHg1NkJELAotICAgIDB4NTZCRSwgMHg1NkJGLCAweDU2QzMsIDB4NTZDNCwgMHg1NkM2LCAweDU2QzcsIDB4NTZDQiwgMHg1NkNELAotICAgIDB4NTZDRSwgMHg1NkNGLCAweDU2RDAsIDB4NTZEMiwgMHg1NkQzLCAweDU2RDUsIDB4NTZENiwgMHg1NkQ4LAotICAgIDB4NTZEOSwgMHg1NkRDLCAweDU2RTMsIDB4NTZFNSwgMHg1NkU2LCAweDU2RTcsIDB4NTZFOCwgMHg1NkU5LAotICAgIDB4NTZFQSwgMHg1NkVDLCAweDU2RUUsIDB4NTZFRiwgMHg1NkYyLCAweDU2RjMsIDB4NTZGNiwgMHg1NkY3LAotICAgIDB4NTZGOCwgMHg1NkZCLCAweDU2RkMsIDB4NTcwMCwgMHg1NzAxLCAweDU3MDIsIDB4NTcwNSwgMHg1NzBDLAotICAgIDB4NTcwRSwgMHg1NzBGLCAweDU3MTAsIDB4NTcxMSwgMHg1NzE0LCAweDU3MTUsIDB4NTcxNywgMHg1NzE5LAotICAgIDB4NTcxQSwgMHg1NzFCLCAweDU3MUQsIDB4NTcxRSwgMHg1NzIwLCAweDU3MjEsIDB4NTcyMiwgMHg1NzI0LAotICAgIDB4NTcyNSwgMHg1NzI2LCAweDU3MjcsIDB4NTcyQiwgMHg1NzMxLCAweDU3MzIsIDB4NTczNCwgMHg1NzM1LAotICAgIDB4NTczNiwgMHg1NzM3LCAweDU3MzgsIDB4NTczQywgMHg1NzNELCAweDU3M0YsIDB4NTc0MSwgMHg1NzQzLAotICAgIDB4NTc0NCwgMHg1NzQ1LCAweDU3NDYsIDB4NTc0OCwgMHg1NzQ5LCAweDU3NEIsIDB4NTc1MiwgMHg1NzUzLAotICAgIDB4NTc1NCwgMHg1NzU1LCAweDU3NTYsIDB4NTc1OCwgMHg1NzU5LCAweDU3NjIsIDB4NTc2MywgMHg1NzY1LAotICAgIDB4NTc2NywgMHg1NzZDLCAweDU3NkUsIDB4NTc3MCwgMHg1NzcxLCAweDU3NzIsIDB4NTc3NCwgMHg1Nzc1LAotICAgIDB4NTc3OCwgMHg1Nzc5LCAweDU3N0EsIDB4NTc3RCwgMHg1NzdFLCAweDU3N0YsIDB4NTc4MCwgMHg1NzgxLAotICAgIDB4NTc4NywgMHg1Nzg4LCAweDU3ODksIDB4NTc4QSwgMHg1NzhELCAweDU3OEUsIDB4NTc4RiwgMHg1NzkwLAotICAgIDB4NTc5MSwgMHg1Nzk0LCAweDU3OTUsIDB4NTc5NiwgMHg1Nzk3LCAweDU3OTgsIDB4NTc5OSwgMHg1NzlBLAotICAgIDB4NTc5QywgMHg1NzlELCAweDU3OUUsIDB4NTc5RiwgMHg1N0E1LCAweDU3QTgsIDB4NTdBQSwgMHg1N0FDLAotICAgIDB4NTdBRiwgMHg1N0IwLCAweDU3QjEsIDB4NTdCMywgMHg1N0I1LCAweDU3QjYsIDB4NTdCNywgMHg1N0I5LAotICAgIDB4NTdCQSwgMHg1N0JCLCAweDU3QkMsIDB4NTdCRCwgMHg1N0JFLCAweDU3QkYsIDB4NTdDMCwgMHg1N0MxLAotICAgIDB4NTdDNCwgMHg1N0M1LCAweDU3QzYsIDB4NTdDNywgMHg1N0M4LCAweDU3QzksIDB4NTdDQSwgMHg1N0NDLAotICAgIDB4NTdDRCwgMHg1N0QwLCAweDU3RDEsIDB4NTdEMywgMHg1N0Q2LCAweDU3RDcsIDB4NTdEQiwgMHg1N0RDLAotICAgIDB4NTdERSwgMHg1N0UyLCAweDU3RTMsIDB4NTdFNSwgMHg1N0U2LCAweDU3RTcsIDB4NTdFOCwgMHg1N0U5LAotICAgIDB4NTdFQSwgMHg1N0VCLCAweDU3RUMsIDB4NTdFRSwgMHg1N0YwLCAweDU3RjEsIDB4NTdGMiwgMHg1N0YzLAotICAgIDB4NTdGNSwgMHg1N0Y2LCAweDU3RkIsIDB4NTdGQywgMHg1N0ZFLCAweDU3RkYsIDB4NTgwMSwgMHg1ODAzLAotICAgIDB4NTgwNCwgMHg1ODA4LCAweDU4MDksIDB4NTgwQywgMHg1ODBFLCAweDU4MEYsIDB4NTgxMCwgMHg1ODEyLAotICAgIDB4NTgxMywgMHg1ODE0LCAweDU4MTcsIDB4NTgxOCwgMHg1ODFBLCAweDU4MUIsIDB4NTgxQywgMHg1ODFGLAotICAgIDB4NTgyMiwgMHg1ODIzLCAweDU4MjUsIDB4NTgyNiwgMHg1ODI3LCAweDU4MjgsIDB4NTgyOSwgMHg1ODJCLAotICAgIDB4NTgyQywgMHg1ODJELCAweDU4MkUsIDB4NTgzMiwgMHg1ODMzLCAweDU4MzYsIDB4NTgzNywgMHg1ODM4LAotICAgIDB4NTgzOSwgMHg1ODNBLCAweDU4M0IsIDB4NTgzQywgMHg1ODNELCAweDU4M0UsIDB4NTgzRiwgMHg1ODQwLAotICAgIDB4NTg0MSwgMHg1ODQyLCAweDU4NDMsIDB4NTg0NSwgMHg1ODQ2LCAweDU4NDcsIDB4NTg0OCwgMHg1ODQ5LAotICAgIDB4NTg0RSwgMHg1ODUwLCAweDU4NTMsIDB4NTg1NSwgMHg1ODU2LCAweDU4NTksIDB4NTg1QSwgMHg1ODVCLAotICAgIDB4NTg1QywgMHg1ODVELCAweDU4NUYsIDB4NTg2MCwgMHg1ODYxLCAweDU4NjMsIDB4NTg2NiwgMHg1ODY3LAotICAgIDB4NTg2OCwgMHg1ODY5LCAweDU4NkEsIDB4NTg2RCwgMHg1ODZFLCAweDU4NkYsIDB4NTg3MCwgMHg1ODcxLAotICAgIDB4NTg3MiwgMHg1ODczLCAweDU4NzQsIDB4NTg3NiwgMHg1ODc3LCAweDU4NzgsIDB4NTg3QSwgMHg1ODdCLAotICAgIDB4NTg3QywgMHg1ODdELCAweDU4N0YsIDB4NTg4MiwgMHg1ODg0LCAweDU4ODYsIDB4NTg4NywgMHg1ODg4LAotICAgIDB4NTg4QiwgMHg1ODhDLCAweDU4OEQsIDB4NTg4RSwgMHg1ODhGLCAweDU4OTAsIDB4NTg5MSwgMHg1ODk0LAotICAgIDB4NTg5NSwgMHg1ODk2LCAweDU4OTcsIDB4NTg5OCwgMHg1ODlCLCAweDU4OUQsIDB4NThBMCwgMHg1OEExLAotICAgIDB4NThBMiwgMHg1OEEzLCAweDU4QTQsIDB4NThBNSwgMHg1OEE2LCAweDU4QTcsIDB4NThBQSwgMHg1OEFCLAotICAgIDB4NThBQywgMHg1OEFELCAweDU4QUYsIDB4NThCMCwgMHg1OEIxLCAweDU4QjIsIDB4NThCNCwgMHg1OEI1LAotICAgIDB4NThCNiwgMHg1OEI3LCAweDU4QjgsIDB4NThCOSwgMHg1OEJBLCAweDU4QkQsIDB4NThCRiwgMHg1OEMwLAotICAgIDB4NThDMiwgMHg1OEMzLCAweDU4QzQsIDB4NThDNiwgMHg1OEM4LCAweDU4QzksIDB4NThDQSwgMHg1OENCLAotICAgIDB4NThDQywgMHg1OENELCAweDU4Q0UsIDB4NThDRiwgMHg1OEQwLCAweDU4RDIsIDB4NThENCwgMHg1OEQ2LAotICAgIDB4NThENywgMHg1OERCLCAweDU4REMsIDB4NThERCwgMHg1OEUxLCAweDU4RTMsIDB4NThFNSwgMHg1OEU2LAotICAgIDB4NThFNywgMHg1OEU4LCAweDU4RUEsIDB4NThFRCwgMHg1OEYxLCAweDU4RjIsIDB4NThGNCwgMHg1OEY1LAotICAgIDB4NThGNywgMHg1OEY4LCAweDU4RkIsIDB4NThGQywgMHg1OEZFLCAweDU4RkYsIDB4NTkwMCwgMHg1OTAxLAotICAgIDB4NTkwMywgMHg1OTA1LCAweDU5MDYsIDB4NTkwOCwgMHg1OTA5LCAweDU5MEEsIDB4NTkwQiwgMHg1OTBDLAotICAgIDB4NTkwRSwgMHg1OTEwLCAweDU5MTEsIDB4NTkxMiwgMHg1OTEzLCAweDU5MTcsIDB4NTkxOCwgMHg1OTFCLAotICAgIDB4NTkxRCwgMHg1OTFFLCAweDU5MjAsIDB4NTkyMSwgMHg1OTIzLCAweDU5MjYsIDB4NTkyOCwgMHg1OTJDLAotICAgIDB4NTkzMCwgMHg1OTMyLCAweDU5MzMsIDB4NTkzNSwgMHg1OTM2LCAweDU5M0IsIDB4NTkzRCwgMHg1OTNGLAotICAgIDB4NTk0MCwgMHg1OTQzLCAweDU5NDUsIDB4NTk0NiwgMHg1OTRBLCAweDU5NEMsIDB4NTk0RCwgMHg1OTUwLAotICAgIDB4NTk1MiwgMHg1OTUzLCAweDU5NTksIDB4NTk1QiwgMHg1OTVDLCAweDU5NUQsIDB4NTk1RSwgMHg1OTVGLAotICAgIDB4NTk2MSwgMHg1OTYzLCAweDU5NjQsIDB4NTk2NiwgMHg1OTY3LCAweDU5NjgsIDB4NTk2QiwgMHg1OTZELAotICAgIDB4NTk2RiwgMHg1OTcwLCAweDU5NzEsIDB4NTk3MiwgMHg1OTc1LCAweDU5NzcsIDB4NTk3QSwgMHg1OTdCLAotICAgIDB4NTk3QywgMHg1OTdFLCAweDU5N0YsIDB4NTk4MCwgMHg1OTg1LCAweDU5ODksIDB4NTk4QiwgMHg1OThDLAotICAgIDB4NTk4RSwgMHg1OThGLCAweDU5OTAsIDB4NTk5MSwgMHg1OTk0LCAweDU5OTUsIDB4NTk5OCwgMHg1OTlBLAotICAgIDB4NTk5QiwgMHg1OTlDLCAweDU5OUYsIDB4NTlBMCwgMHg1OUExLCAweDU5QTIsIDB4NTlBNiwgMHg1OUE3LAotICAgIDB4NTlBQywgMHg1OUFELCAweDU5QjAsIDB4NTlCMSwgMHg1OUIzLCAweDU5QjQsIDB4NTlCNSwgMHg1OUI2LAotICAgIDB4NTlCNywgMHg1OUI4LCAweDU5QkEsIDB4NTlCQywgMHg1OUJELCAweDU5QkYsIDB4NTlDMCwgMHg1OUMxLAotICAgIDB4NTlDMiwgMHg1OUMzLCAweDU5QzQsIDB4NTlDNSwgMHg1OUM3LCAweDU5QzgsIDB4NTlDOSwgMHg1OUNDLAotICAgIDB4NTlDRCwgMHg1OUNFLCAweDU5Q0YsIDB4NTlENSwgMHg1OUQ2LCAweDU5RDksIDB4NTlEQiwgMHg1OURFLAotICAgIDB4NTlERiwgMHg1OUUwLCAweDU5RTEsIDB4NTlFMiwgMHg1OUU0LCAweDU5RTYsIDB4NTlFNywgMHg1OUU5LAotICAgIDB4NTlFQSwgMHg1OUVCLCAweDU5RUQsIDB4NTlFRSwgMHg1OUVGLCAweDU5RjAsIDB4NTlGMSwgMHg1OUYyLAotICAgIDB4NTlGMywgMHg1OUY0LCAweDU5RjUsIDB4NTlGNiwgMHg1OUY3LCAweDU5RjgsIDB4NTlGQSwgMHg1OUZDLAotICAgIDB4NTlGRCwgMHg1OUZFLCAweDVBMDAsIDB4NUEwMiwgMHg1QTBBLCAweDVBMEIsIDB4NUEwRCwgMHg1QTBFLAotICAgIDB4NUEwRiwgMHg1QTEwLCAweDVBMTIsIDB4NUExNCwgMHg1QTE1LCAweDVBMTYsIDB4NUExNywgMHg1QTE5LAotICAgIDB4NUExQSwgMHg1QTFCLCAweDVBMUQsIDB4NUExRSwgMHg1QTIxLCAweDVBMjIsIDB4NUEyNCwgMHg1QTI2LAotICAgIDB4NUEyNywgMHg1QTI4LCAweDVBMkEsIDB4NUEyQiwgMHg1QTJDLCAweDVBMkQsIDB4NUEyRSwgMHg1QTJGLAotICAgIDB4NUEzMCwgMHg1QTMzLCAweDVBMzUsIDB4NUEzNywgMHg1QTM4LCAweDVBMzksIDB4NUEzQSwgMHg1QTNCLAotICAgIDB4NUEzRCwgMHg1QTNFLCAweDVBM0YsIDB4NUE0MiwgMHg1QTQzLCAweDVBNDQsIDB4NUE0NSwgMHg1QTQ3LAotICAgIDB4NUE0OCwgMHg1QTRCLCAweDVBNEMsIDB4NUE0RCwgMHg1QTRFLCAweDVBNEYsIDB4NUE1MCwgMHg1QTUxLAotICAgIDB4NUE1MiwgMHg1QTUzLCAweDVBNTQsIDB4NUE1NiwgMHg1QTU3LCAweDVBNTgsIDB4NUE1OSwgMHg1QTVCLAotICAgIDB4NUE1QywgMHg1QTVELCAweDVBNUUsIDB4NUE1RiwgMHg1QTYwLCAweDVBNjEsIDB4NUE2MywgMHg1QTY0LAotICAgIDB4NUE2NSwgMHg1QTY4LCAweDVBNjksIDB4NUE2QiwgMHg1QTZDLCAweDVBNkUsIDB4NUE2RiwgMHg1QTcwLAotICAgIDB4NUE3MSwgMHg1QTcyLCAweDVBNzMsIDB4NUE3OCwgMHg1QTc5LCAweDVBN0IsIDB4NUE3QywgMHg1QTdELAotICAgIDB4NUE3RSwgMHg1QTgwLCAweDVBODEsIDB4NUE4MiwgMHg1QTgzLCAweDVBODQsIDB4NUE4NSwgMHg1QTg2LAotICAgIDB4NUE4NywgMHg1QTg4LCAweDVBODksIDB4NUE4QSwgMHg1QThCLCAweDVBOEMsIDB4NUE4RCwgMHg1QThFLAotICAgIDB4NUE4RiwgMHg1QTkwLCAweDVBOTEsIDB4NUE5MywgMHg1QTk0LCAweDVBOTUsIDB4NUE5NiwgMHg1QTk3LAotICAgIDB4NUE5OCwgMHg1QTk5LCAweDVBOUMsIDB4NUE5RCwgMHg1QTlFLCAweDVBOUYsIDB4NUFBMCwgMHg1QUExLAotICAgIDB4NUFBMiwgMHg1QUEzLCAweDVBQTQsIDB4NUFBNSwgMHg1QUE2LCAweDVBQTgsIDB4NUFBOSwgMHg1QUFCLAotICAgIDB4NUFBQywgMHg1QUFELCAweDVBQUUsIDB4NUFBRiwgMHg1QUIwLCAweDVBQjEsIDB4NUFCNCwgMHg1QUI2LAotICAgIDB4NUFCNywgMHg1QUI5LCAweDVBQkEsIDB4NUFCQiwgMHg1QUJDLCAweDVBQkYsIDB4NUFDMCwgMHg1QUMzLAotICAgIDB4NUFDNCwgMHg1QUM1LCAweDVBQzYsIDB4NUFDNywgMHg1QUM4LCAweDVBQ0EsIDB4NUFDQiwgMHg1QUNELAotICAgIDB4NUFDRSwgMHg1QUNGLCAweDVBRDAsIDB4NUFEMSwgMHg1QUQzLCAweDVBRDUsIDB4NUFEOSwgMHg1QURBLAotICAgIDB4NUFEQiwgMHg1QURELCAweDVBREUsIDB4NUFERiwgMHg1QUUyLCAweDVBRTQsIDB4NUFFNSwgMHg1QUU3LAotICAgIDB4NUFFOCwgMHg1QUVBLCAweDVBRUMsIDB4NUFFRCwgMHg1QUVFLCAweDVBRUYsIDB4NUFGMCwgMHg1QUYyLAotICAgIDB4NUFGMywgMHg1QUY0LCAweDVBRjYsIDB4NUFGNywgMHg1QUY4LCAweDVBRjksIDB4NUFGQSwgMHg1QUZDLAotICAgIDB4NUFGRCwgMHg1QUZFLCAweDVBRkYsIDB4NUIwMSwgMHg1QjAyLCAweDVCMDMsIDB4NUIwNCwgMHg1QjA1LAotICAgIDB4NUIwNiwgMHg1QjA3LCAweDVCMEEsIDB4NUIwRCwgMHg1QjBFLCAweDVCMEYsIDB4NUIxMCwgMHg1QjExLAotICAgIDB4NUIxMiwgMHg1QjEzLCAweDVCMTQsIDB4NUIxNSwgMHg1QjE4LCAweDVCMUEsIDB4NUIxQiwgMHg1QjFDLAotICAgIDB4NUIxRCwgMHg1QjFFLCAweDVCMUYsIDB4NUIyMCwgMHg1QjIyLCAweDVCMjMsIDB4NUIyNCwgMHg1QjI1LAotICAgIDB4NUIyNiwgMHg1QjI3LCAweDVCMjgsIDB4NUIyOSwgMHg1QjJCLCAweDVCMkMsIDB4NUIyRCwgMHg1QjJFLAotICAgIDB4NUIyRiwgMHg1QjMxLCAweDVCMzMsIDB4NUIzNSwgMHg1QjM2LCAweDVCMzksIDB4NUIzQSwgMHg1QjNCLAotICAgIDB4NUIzQywgMHg1QjNELCAweDVCM0UsIDB4NUIzRiwgMHg1QjQxLCAweDVCNDIsIDB4NUI0MywgMHg1QjQ0LAotICAgIDB4NUI0NSwgMHg1QjQ2LCAweDVCNDcsIDB4NUI0OCwgMHg1QjQ5LCAweDVCNEEsIDB4NUI0QiwgMHg1QjRELAotICAgIDB4NUI0RSwgMHg1QjRGLCAweDVCNTIsIDB4NUI1NiwgMHg1QjVFLCAweDVCNjAsIDB4NUI2MSwgMHg1QjY3LAotICAgIDB4NUI2OCwgMHg1QjZELCAweDVCNkUsIDB4NUI2RiwgMHg1QjcyLCAweDVCNzQsIDB4NUI3NiwgMHg1Qjc3LAotICAgIDB4NUI3OSwgMHg1QjdCLCAweDVCN0MsIDB4NUI3RSwgMHg1QjgyLCAweDVCODYsIDB4NUI4QSwgMHg1QjhELAotICAgIDB4NUI4RSwgMHg1QjkwLCAweDVCOTEsIDB4NUI5MiwgMHg1Qjk0LCAweDVCOTYsIDB4NUI5RiwgMHg1QkE3LAotICAgIDB4NUJBOCwgMHg1QkE5LCAweDVCQUMsIDB4NUJBRCwgMHg1QkFFLCAweDVCQUYsIDB4NUJCMSwgMHg1QkIyLAotICAgIDB4NUJCNywgMHg1QkJBLCAweDVCQkIsIDB4NUJCQywgMHg1QkMwLCAweDVCQzEsIDB4NUJDMywgMHg1QkM4LAotICAgIDB4NUJDOSwgMHg1QkNBLCAweDVCQ0IsIDB4NUJDRCwgMHg1QkNFLCAweDVCQ0YsIDB4NUJEMSwgMHg1QkQ0LAotICAgIDB4NUJENSwgMHg1QkQ2LCAweDVCRDcsIDB4NUJEOCwgMHg1QkQ5LCAweDVCREEsIDB4NUJEQiwgMHg1QkRDLAotICAgIDB4NUJFMCwgMHg1QkUzLCAweDVCRUEsIDB4NUJFRCwgMHg1QkVGLCAweDVCRjEsIDB4NUJGMiwgMHg1QkYzLAotICAgIDB4NUJGNCwgMHg1QkY3LCAweDVCRkQsIDB4NUJGRSwgMHg1QzAwLCAweDVDMDIsIDB4NUMwMywgMHg1QzA1LAotICAgIDB4NUMwQywgMHg1QzEwLCAweDVDMTIsIDB4NUMxMywgMHg1QzE3LCAweDVDMTksIDB4NUMxQiwgMHg1QzFFLAotICAgIDB4NUMxRiwgMHg1QzIwLCAweDVDMjEsIDB4NUMyMywgMHg1QzI2LCAweDVDMjgsIDB4NUMyOSwgMHg1QzJBLAotICAgIDB4NUMyQiwgMHg1QzJELCAweDVDMkUsIDB4NUMyRiwgMHg1QzMwLCAweDVDMzIsIDB4NUMzMywgMHg1QzM1LAotICAgIDB4NUMzNiwgMHg1QzQzLCAweDVDNDQsIDB4NUM0NiwgMHg1QzQ3LCAweDVDNEMsIDB4NUM0RCwgMHg1QzUyLAotICAgIDB4NUM1MywgMHg1QzU0LCAweDVDNTYsIDB4NUM1NywgMHg1QzU4LCAweDVDNUEsIDB4NUM1QiwgMHg1QzVDLAotICAgIDB4NUM1RCwgMHg1QzVGLCAweDVDNjcsIDB4NUM2OSwgMHg1QzZBLCAweDVDNkIsIDB4NUM2RCwgMHg1QzcwLAotICAgIDB4NUM3MiwgMHg1QzczLCAweDVDNzQsIDB4NUM3NSwgMHg1Qzc2LCAweDVDNzcsIDB4NUM3OCwgMHg1QzdCLAotICAgIDB4NUM3QywgMHg1QzdELCAweDVDN0UsIDB4NUM4MCwgMHg1QzgzLCAweDVDODQsIDB4NUM4NSwgMHg1Qzg2LAotICAgIDB4NUM4NywgMHg1Qzg5LCAweDVDOEEsIDB4NUM4QiwgMHg1QzhFLCAweDVDOEYsIDB4NUM5MiwgMHg1QzkzLAotICAgIDB4NUM5NSwgMHg1QzlELCAweDVDOUUsIDB4NUM5RiwgMHg1Q0EwLCAweDVDQTQsIDB4NUNBNSwgMHg1Q0E2LAotICAgIDB4NUNBNywgMHg1Q0E4LCAweDVDQUEsIDB4NUNBRSwgMHg1Q0FGLCAweDVDQjAsIDB4NUNCMiwgMHg1Q0I0LAotICAgIDB4NUNCNiwgMHg1Q0I5LCAweDVDQkEsIDB4NUNCQiwgMHg1Q0JDLCAweDVDQkUsIDB4NUNDMCwgMHg1Q0MyLAotICAgIDB4NUNDMywgMHg1Q0M1LCAweDVDQzYsIDB4NUNDNywgMHg1Q0M4LCAweDVDQzksIDB4NUNDQSwgMHg1Q0NDLAotICAgIDB4NUNDRCwgMHg1Q0NFLCAweDVDQ0YsIDB4NUNEMCwgMHg1Q0QxLCAweDVDRDMsIDB4NUNENCwgMHg1Q0Q1LAotICAgIDB4NUNENiwgMHg1Q0Q3LCAweDVDRDgsIDB4NUNEQSwgMHg1Q0RCLCAweDVDREMsIDB4NUNERCwgMHg1Q0RFLAotICAgIDB4NUNERiwgMHg1Q0UwLCAweDVDRTIsIDB4NUNFMywgMHg1Q0U3LCAweDVDRTksIDB4NUNFQiwgMHg1Q0VDLAotICAgIDB4NUNFRSwgMHg1Q0VGLCAweDVDRjEsIDB4NUNGMiwgMHg1Q0YzLCAweDVDRjUsIDB4NUNGNywgMHg1Q0Y4LAotICAgIDB4NUNGOSwgMHg1Q0ZBLCAweDVDRkMsIDB4NUNGRSwgMHg1Q0ZGLCAweDVEMDAsIDB4NUQwMSwgMHg1RDA0LAotICAgIDB4NUQwNSwgMHg1RDA4LCAweDVEMDksIDB4NUQwQSwgMHg1RDBCLCAweDVEMEMsIDB4NUQwRiwgMHg1RDEwLAotICAgIDB4NUQxMSwgMHg1RDEyLCAweDVEMTMsIDB4NUQxNSwgMHg1RDE4LCAweDVEMTksIDB4NUQxQSwgMHg1RDFDLAotICAgIDB4NUQxRCwgMHg1RDFGLCAweDVEMjAsIDB4NUQyMSwgMHg1RDIyLCAweDVEMjMsIDB4NUQyNSwgMHg1RDI4LAotICAgIDB4NUQyQSwgMHg1RDJCLCAweDVEMkYsIDB4NUQzMCwgMHg1RDMxLCAweDVEMzIsIDB4NUQzMywgMHg1RDM1LAotICAgIDB4NUQzNiwgMHg1RDM3LCAweDVEMzgsIDB4NUQzOSwgMHg1RDNBLCAweDVEM0IsIDB4NUQzQywgMHg1RDNGLAotICAgIDB4NUQ0MCwgMHg1RDQxLCAweDVENDIsIDB4NUQ0MywgMHg1RDQ0LCAweDVENDUsIDB4NUQ0NiwgMHg1RDQ4LAotICAgIDB4NUQ0OSwgMHg1RDRELCAweDVENEUsIDB4NUQ0RiwgMHg1RDUxLCAweDVENTIsIDB4NUQ1MywgMHg1RDU0LAotICAgIDB4NUQ1NSwgMHg1RDU2LCAweDVENTcsIDB4NUQ1OSwgMHg1RDVBLCAweDVENUMsIDB4NUQ1RSwgMHg1RDVGLAotICAgIDB4NUQ2MCwgMHg1RDYxLCAweDVENjIsIDB4NUQ2MywgMHg1RDY0LCAweDVENjUsIDB4NUQ2NiwgMHg1RDY3LAotICAgIDB4NUQ2OCwgMHg1RDZBLCAweDVENkQsIDB4NUQ2RSwgMHg1RDcwLCAweDVENzEsIDB4NUQ3MiwgMHg1RDczLAotICAgIDB4NUQ3NSwgMHg1RDc2LCAweDVENzcsIDB4NUQ3OCwgMHg1RDc5LCAweDVEN0EsIDB4NUQ3QiwgMHg1RDdDLAotICAgIDB4NUQ3RCwgMHg1RDdFLCAweDVEN0YsIDB4NUQ4MCwgMHg1RDgzLCAweDVEODUsIDB4NUQ4NiwgMHg1RDg4LAotICAgIDB4NUQ4OSwgMHg1RDhBLCAweDVEOEIsIDB4NUQ4QywgMHg1RDhELCAweDVEOEUsIDB4NUQ4RiwgMHg1RDkwLAotICAgIDB4NUQ5MSwgMHg1RDkyLCAweDVEOTMsIDB4NUQ5NCwgMHg1RDk1LCAweDVEOTYsIDB4NUQ5OCwgMHg1RDlBLAotICAgIDB4NUQ5QiwgMHg1RDlDLCAweDVEOUUsIDB4NUQ5RiwgMHg1REExLCAweDVEQTIsIDB4NURBMywgMHg1REE0LAotICAgIDB4NURBNSwgMHg1REE2LCAweDVEQTgsIDB4NURBOSwgMHg1REFBLCAweDVEQUIsIDB4NURBQywgMHg1REFELAotICAgIDB4NURBRSwgMHg1REFGLCAweDVEQjAsIDB4NURCMSwgMHg1REIyLCAweDVEQjMsIDB4NURCNCwgMHg1REI1LAotICAgIDB4NURCNiwgMHg1REI5LCAweDVEQkIsIDB4NURCRCwgMHg1REJFLCAweDVEQkYsIDB4NURDMCwgMHg1REMxLAotICAgIDB4NURDMiwgMHg1REMzLCAweDVEQzQsIDB4NURDNiwgMHg1REM3LCAweDVEQzgsIDB4NURDOSwgMHg1RENBLAotICAgIDB4NURDQywgMHg1RENFLCAweDVEQ0YsIDB4NUREMCwgMHg1REQxLCAweDVERDMsIDB4NURENSwgMHg1REQ2LAotICAgIDB4NURENywgMHg1REQ4LCAweDVERDksIDB4NUREQSwgMHg1RERDLCAweDVEREYsIDB4NURFMCwgMHg1REUzLAotICAgIDB4NURFNCwgMHg1REVBLCAweDVERUMsIDB4NURFRCwgMHg1REY1LCAweDVERjYsIDB4NURGOCwgMHg1REY5LAotICAgIDB4NURGQSwgMHg1REZCLCAweDVERkMsIDB4NURGRiwgMHg1RTAwLCAweDVFMDQsIDB4NUUwNywgMHg1RTA5LAotICAgIDB4NUUwQSwgMHg1RTBCLCAweDVFMEQsIDB4NUUwRSwgMHg1RTEyLCAweDVFMTMsIDB4NUUxNywgMHg1RTFFLAotICAgIDB4NUUxRiwgMHg1RTIwLCAweDVFMjEsIDB4NUUyMiwgMHg1RTIzLCAweDVFMjQsIDB4NUUyOCwgMHg1RTI5LAotICAgIDB4NUUyQSwgMHg1RTJDLCAweDVFMkYsIDB4NUUzMCwgMHg1RTMyLCAweDVFMzQsIDB4NUUzNSwgMHg1RTM5LAotICAgIDB4NUUzQSwgMHg1RTNFLCAweDVFM0YsIDB4NUU0MSwgMHg1RTQ2LCAweDVFNDcsIDB4NUU0OCwgMHg1RTQ5LAotICAgIDB4NUU0QSwgMHg1RTRCLCAweDVFNEQsIDB4NUU0RSwgMHg1RTRGLCAweDVFNTAsIDB4NUU1MSwgMHg1RTUyLAotICAgIDB4NUU1MywgMHg1RTU2LCAweDVFNTksIDB4NUU1QSwgMHg1RTVDLCAweDVFNUQsIDB4NUU2MCwgMHg1RTY0LAotICAgIDB4NUU2NSwgMHg1RTY2LCAweDVFNjcsIDB4NUU2OCwgMHg1RTY5LCAweDVFNkEsIDB4NUU2RCwgMHg1RTZFLAotICAgIDB4NUU2RiwgMHg1RTcwLCAweDVFNzEsIDB4NUU3NSwgMHg1RTc3LCAweDVFODEsIDB4NUU4MiwgMHg1RTgzLAotICAgIDB4NUU4NSwgMHg1RTg4LCAweDVFODksIDB4NUU4QywgMHg1RThELCAweDVFOEUsIDB4NUU5MiwgMHg1RTk4LAotICAgIDB4NUU5QiwgMHg1RTlELCAweDVFQTEsIDB4NUVBMiwgMHg1RUEzLCAweDVFQTQsIDB4NUVBOCwgMHg1RUE5LAotICAgIDB4NUVBQSwgMHg1RUFDLCAweDVFQUUsIDB4NUVBRiwgMHg1RUIwLCAweDVFQjEsIDB4NUVCMiwgMHg1RUI0LAotICAgIDB4NUVCQSwgMHg1RUJCLCAweDVFQkMsIDB4NUVCRCwgMHg1RUJGLCAweDVFQzAsIDB4NUVDMSwgMHg1RUMyLAotICAgIDB4NUVDMywgMHg1RUM0LCAweDVFQzUsIDB4NUVDNiwgMHg1RUM3LCAweDVFQzgsIDB4NUVDQiwgMHg1RUNDLAotICAgIDB4NUVDRCwgMHg1RUNFLCAweDVFQ0YsIDB4NUVEMCwgMHg1RUQ0LCAweDVFRDUsIDB4NUVENywgMHg1RUQ4LAotICAgIDB4NUVEOSwgMHg1RURBLCAweDVFREMsIDB4NUVERCwgMHg1RURFLCAweDVFRTQsIDB4NUVFNSwgMHg1RUU2LAotICAgIDB4NUVFNywgMHg1RUU5LCAweDVFRUIsIDB4NUVFRCwgMHg1RUVFLCAweDVFRUYsIDB4NUVGMCwgMHg1RUYxLAotICAgIDB4NUVGMiwgMHg1RUY1LCAweDVFRjgsIDB4NUVGOSwgMHg1RUZCLCAweDVFRkMsIDB4NUVGRCwgMHg1RjA1LAotICAgIDB4NUYwNiwgMHg1RjA3LCAweDVGMDksIDB4NUYwQywgMHg1RjBELCAweDVGMEUsIDB4NUYxMCwgMHg1RjEyLAotICAgIDB4NUYxNCwgMHg1RjE2LCAweDVGMTksIDB4NUYxQSwgMHg1RjFDLCAweDVGMUQsIDB4NUYxRSwgMHg1RjIxLAotICAgIDB4NUYyMiwgMHg1RjIzLCAweDVGMjQsIDB4NUYyOCwgMHg1RjJCLCAweDVGMkMsIDB4NUYyRSwgMHg1RjMwLAotICAgIDB4NUYzMiwgMHg1RjM0LCAweDVGMzYsIDB4NUYzNywgMHg1RjM4LCAweDVGM0IsIDB4NUYzRCwgMHg1RjNFLAotICAgIDB4NUYzRiwgMHg1RjQxLCAweDVGNDIsIDB4NUY0MywgMHg1RjQ0LCAweDVGNDUsIDB4NUY0NywgMHg1RjQ5LAotICAgIDB4NUY0QSwgMHg1RjRCLCAweDVGNEQsIDB4NUY0RiwgMHg1RjUxLCAweDVGNTQsIDB4NUY1QSwgMHg1RjVCLAotICAgIDB4NUY1QywgMHg1RjVFLCAweDVGNUYsIDB4NUY2MCwgMHg1RjYzLCAweDVGNjUsIDB4NUY2NywgMHg1RjY4LAotICAgIDB4NUY2QiwgMHg1RjZFLCAweDVGNkYsIDB4NUY3MiwgMHg1Rjc0LCAweDVGNzUsIDB4NUY3NiwgMHg1Rjc4LAotICAgIDB4NUY3QSwgMHg1RjdELCAweDVGN0UsIDB4NUY3RiwgMHg1RjgzLCAweDVGODYsIDB4NUY4RCwgMHg1RjhFLAotICAgIDB4NUY4RiwgMHg1RjkzLCAweDVGOTQsIDB4NUY5NiwgMHg1RjlBLCAweDVGOUIsIDB4NUY5RCwgMHg1RjlGLAotICAgIDB4NUZBMiwgMHg1RkEzLCAweDVGQTQsIDB4NUZBNSwgMHg1RkE2LCAweDVGQTcsIDB4NUZBQiwgMHg1RkFDLAotICAgIDB4NUZBRiwgMHg1RkIwLCAweDVGQjEsIDB4NUZCMiwgMHg1RkIzLCAweDVGQjQsIDB4NUZCNiwgMHg1RkI4LAotICAgIDB4NUZCQSwgMHg1RkJCLCAweDVGQkUsIDB4NUZCRiwgMHg1RkMwLCAweDVGQzEsIDB4NUZDMiwgMHg1RkM3LAotICAgIDB4NUZDOCwgMHg1RkNBLCAweDVGQ0IsIDB4NUZDRSwgMHg1RkQzLCAweDVGRDQsIDB4NUZENSwgMHg1RkRBLAotICAgIDB4NUZEQiwgMHg1RkRDLCAweDVGREUsIDB4NUZERiwgMHg1RkUyLCAweDVGRTMsIDB4NUZFNSwgMHg1RkU2LAotICAgIDB4NUZFOCwgMHg1RkU5LCAweDVGRUMsIDB4NUZFRiwgMHg1RkYwLCAweDVGRjIsIDB4NUZGMywgMHg1RkY0LAotICAgIDB4NUZGNiwgMHg1RkY3LCAweDVGRjksIDB4NUZGQSwgMHg1RkZDLCAweDYwMDcsIDB4NjAwOCwgMHg2MDA5LAotICAgIDB4NjAwQiwgMHg2MDBDLCAweDYwMTAsIDB4NjAxMSwgMHg2MDEzLCAweDYwMTcsIDB4NjAxOCwgMHg2MDFBLAotICAgIDB4NjAxRSwgMHg2MDFGLCAweDYwMjIsIDB4NjAyMywgMHg2MDI0LCAweDYwMkMsIDB4NjAyRCwgMHg2MDJFLAotICAgIDB4NjAzMCwgMHg2MDMxLCAweDYwMzIsIDB4NjAzMywgMHg2MDM0LCAweDYwMzYsIDB4NjAzNywgMHg2MDM4LAotICAgIDB4NjAzOSwgMHg2MDNBLCAweDYwM0QsIDB4NjAzRSwgMHg2MDQwLCAweDYwNDQsIDB4NjA0NSwgMHg2MDQ2LAotICAgIDB4NjA0NywgMHg2MDQ4LCAweDYwNDksIDB4NjA0QSwgMHg2MDRDLCAweDYwNEUsIDB4NjA0RiwgMHg2MDUxLAotICAgIDB4NjA1MywgMHg2MDU0LCAweDYwNTYsIDB4NjA1NywgMHg2MDU4LCAweDYwNUIsIDB4NjA1QywgMHg2MDVFLAotICAgIDB4NjA1RiwgMHg2MDYwLCAweDYwNjEsIDB4NjA2NSwgMHg2MDY2LCAweDYwNkUsIDB4NjA3MSwgMHg2MDcyLAotICAgIDB4NjA3NCwgMHg2MDc1LCAweDYwNzcsIDB4NjA3RSwgMHg2MDgwLCAweDYwODEsIDB4NjA4MiwgMHg2MDg1LAotICAgIDB4NjA4NiwgMHg2MDg3LCAweDYwODgsIDB4NjA4QSwgMHg2MDhCLCAweDYwOEUsIDB4NjA4RiwgMHg2MDkwLAotICAgIDB4NjA5MSwgMHg2MDkzLCAweDYwOTUsIDB4NjA5NywgMHg2MDk4LCAweDYwOTksIDB4NjA5QywgMHg2MDlFLAotICAgIDB4NjBBMSwgMHg2MEEyLCAweDYwQTQsIDB4NjBBNSwgMHg2MEE3LCAweDYwQTksIDB4NjBBQSwgMHg2MEFFLAotICAgIDB4NjBCMCwgMHg2MEIzLCAweDYwQjcsIDB4NjBCOSwgMHg2MEJBLCAweDYwQkQsIDB4NjBCRSwgMHg2MEJGLAotICAgIDB4NjBDMCwgMHg2MEMxLCAweDYwQzIsIDB4NjBDMywgMHg2MEM0LCAweDYwQzcsIDB4NjBDOCwgMHg2MEM5LAotICAgIDB4NjBDQywgMHg2MENELCAweDYwQ0UsIDB4NjBDRiwgMHg2MEQwLCAweDYwRDIsIDB4NjBEMywgMHg2MEQ0LAotICAgIDB4NjBENiwgMHg2MEQ3LCAweDYwRDksIDB4NjBEQiwgMHg2MERFLCAweDYwRTIsIDB4NjBFMywgMHg2MEU0LAotICAgIDB4NjBFNSwgMHg2MEVBLCAweDYwRjUsIDB4NjBGNywgMHg2MEY4LCAweDYwRkMsIDB4NjBGRCwgMHg2MEZFLAotICAgIDB4NjBGRiwgMHg2MTAyLCAweDYxMDMsIDB4NjEwNCwgMHg2MTA1LCAweDYxMDcsIDB4NjEwQSwgMHg2MTBCLAotICAgIDB4NjEwQywgMHg2MTEwLCAweDYxMTEsIDB4NjExMiwgMHg2MTEzLCAweDYxMTQsIDB4NjExNiwgMHg2MTE3LAotICAgIDB4NjExOCwgMHg2MTE5LCAweDYxMUQsIDB4NjExRSwgMHg2MTIxLCAweDYxMjIsIDB4NjEyNSwgMHg2MTI4LAotICAgIDB4NjEyOSwgMHg2MTJBLCAweDYxMkMsIDB4NjEyRCwgMHg2MTJFLCAweDYxMkYsIDB4NjEzMCwgMHg2MTMxLAotICAgIDB4NjEzMiwgMHg2MTMzLCAweDYxMzUsIDB4NjEzNiwgMHg2MTM4LCAweDYxMzksIDB4NjEzQSwgMHg2MTNCLAotICAgIDB4NjEzQywgMHg2MTNELCAweDYxNDAsIDB4NjE0MSwgMHg2MTQyLCAweDYxNDMsIDB4NjE0NCwgMHg2MTQ1LAotICAgIDB4NjE0NiwgMHg2MTQ3LCAweDYxNDksIDB4NjE0RCwgMHg2MTRGLCAweDYxNTAsIDB4NjE1MiwgMHg2MTUzLAotICAgIDB4NjE1NCwgMHg2MTU2LCAweDYxNTcsIDB4NjE1OSwgMHg2MTVCLCAweDYxNUMsIDB4NjE1RSwgMHg2MTYwLAotICAgIDB4NjE2MSwgMHg2MTY1LCAweDYxNjYsIDB4NjE2OSwgMHg2MTZDLCAweDYxNkQsIDB4NjE2RiwgMHg2MTcxLAotICAgIDB4NjE3MiwgMHg2MTc0LCAweDYxNzgsIDB4NjE3OSwgMHg2MTdBLCAweDYxN0IsIDB4NjE3QywgMHg2MTdELAotICAgIDB4NjE3RSwgMHg2MTdGLCAweDYxODAsIDB4NjE4MSwgMHg2MTgzLCAweDYxODQsIDB4NjE4NSwgMHg2MTg2LAotICAgIDB4NjE4NywgMHg2MTg4LCAweDYxODksIDB4NjE4QywgMHg2MThELCAweDYxOEYsIDB4NjE5MywgMHg2MTk1LAotICAgIDB4NjE5NiwgMHg2MTk3LCAweDYxOTgsIDB4NjE5OSwgMHg2MTlCLCAweDYxOUMsIDB4NjE5RSwgMHg2MTlGLAotICAgIDB4NjFBMCwgMHg2MUExLCAweDYxQTIsIDB4NjFBMywgMHg2MUE1LCAweDYxQTYsIDB4NjFBQSwgMHg2MUFELAotICAgIDB4NjFBRiwgMHg2MUIwLCAweDYxQjEsIDB4NjFCMywgMHg2MUI0LCAweDYxQjUsIDB4NjFCOCwgMHg2MUI5LAotICAgIDB4NjFCQSwgMHg2MUJCLCAweDYxQkMsIDB4NjFCRCwgMHg2MUJGLCAweDYxQzAsIDB4NjFDMSwgMHg2MUMzLAotICAgIDB4NjFDNCwgMHg2MUM1LCAweDYxQzYsIDB4NjFDRCwgMHg2MUNFLCAweDYxQ0YsIDB4NjFEMCwgMHg2MUQzLAotICAgIDB4NjFENSwgMHg2MUQ2LCAweDYxRDcsIDB4NjFEOCwgMHg2MUQ5LCAweDYxREEsIDB4NjFEQiwgMHg2MURDLAotICAgIDB4NjFERCwgMHg2MUUwLCAweDYxRTEsIDB4NjFFMiwgMHg2MUU0LCAweDYxRTUsIDB4NjFFNywgMHg2MUU5LAotICAgIDB4NjFFQSwgMHg2MUVCLCAweDYxRUMsIDB4NjFFRCwgMHg2MUVFLCAweDYxRUYsIDB4NjFGMCwgMHg2MUYxLAotICAgIDB4NjFGMywgMHg2MUY0LCAweDYxRjksIDB4NjFGQiwgMHg2MUZELCAweDYyMDEsIDB4NjIwMiwgMHg2MjAzLAotICAgIDB4NjIwNCwgMHg2MjA1LCAweDYyMDksIDB4NjIxMywgMHg2MjE5LCAweDYyMUMsIDB4NjIxRCwgMHg2MjFFLAotICAgIDB4NjIyMCwgMHg2MjIzLCAweDYyMjYsIDB4NjIyOCwgMHg2MjI5LCAweDYyMkIsIDB4NjIyRCwgMHg2MjJGLAotICAgIDB4NjIzMSwgMHg2MjM1LCAweDYyMzYsIDB4NjIzOCwgMHg2MjM5LCAweDYyM0EsIDB4NjIzQiwgMHg2MjNDLAotICAgIDB4NjI0MiwgMHg2MjQ0LCAweDYyNDUsIDB4NjI0NiwgMHg2MjRBLCAweDYyNEYsIDB4NjI1MCwgMHg2MjU1LAotICAgIDB4NjI1NiwgMHg2MjU3LCAweDYyNTksIDB4NjI1QSwgMHg2MjVDLCAweDYyNUQsIDB4NjI1RSwgMHg2MjVGLAotICAgIDB4NjI2MCwgMHg2MjYxLCAweDYyNjIsIDB4NjI2NCwgMHg2MjY1LCAweDYyNjgsIDB4NjI3MSwgMHg2MjcyLAotICAgIDB4NjI3NCwgMHg2Mjc1LCAweDYyNzcsIDB4NjI3OCwgMHg2MjdBLCAweDYyN0IsIDB4NjI3RCwgMHg2MjgxLAotICAgIDB4NjI4MiwgMHg2MjgzLCAweDYyODUsIDB4NjI4NiwgMHg2Mjg3LCAweDYyODgsIDB4NjI4QiwgMHg2MjhDLAotICAgIDB4NjI4RCwgMHg2MjhFLCAweDYyOEYsIDB4NjI5MCwgMHg2Mjk0LCAweDYyOTksIDB4NjI5QywgMHg2MjlELAotICAgIDB4NjI5RSwgMHg2MkEzLCAweDYyQTYsIDB4NjJBNywgMHg2MkE5LCAweDYyQUEsIDB4NjJBRCwgMHg2MkFFLAotICAgIDB4NjJBRiwgMHg2MkIwLCAweDYyQjIsIDB4NjJCMywgMHg2MkI0LCAweDYyQjYsIDB4NjJCNywgMHg2MkI4LAotICAgIDB4NjJCQSwgMHg2MkJFLCAweDYyQzAsIDB4NjJDMSwgMHg2MkMzLCAweDYyQ0IsIDB4NjJDRiwgMHg2MkQxLAotICAgIDB4NjJENSwgMHg2MkRELCAweDYyREUsIDB4NjJFMCwgMHg2MkUxLCAweDYyRTQsIDB4NjJFQSwgMHg2MkVCLAotICAgIDB4NjJGMCwgMHg2MkYyLCAweDYyRjUsIDB4NjJGOCwgMHg2MkY5LCAweDYyRkEsIDB4NjJGQiwgMHg2MzAwLAotICAgIDB4NjMwMywgMHg2MzA0LCAweDYzMDUsIDB4NjMwNiwgMHg2MzBBLCAweDYzMEIsIDB4NjMwQywgMHg2MzBELAotICAgIDB4NjMwRiwgMHg2MzEwLCAweDYzMTIsIDB4NjMxMywgMHg2MzE0LCAweDYzMTUsIDB4NjMxNywgMHg2MzE4LAotICAgIDB4NjMxOSwgMHg2MzFDLCAweDYzMjYsIDB4NjMyNywgMHg2MzI5LCAweDYzMkMsIDB4NjMyRCwgMHg2MzJFLAotICAgIDB4NjMzMCwgMHg2MzMxLCAweDYzMzMsIDB4NjMzNCwgMHg2MzM1LCAweDYzMzYsIDB4NjMzNywgMHg2MzM4LAotICAgIDB4NjMzQiwgMHg2MzNDLCAweDYzM0YsIDB4NjM0MCwgMHg2MzQxLCAweDYzNDQsIDB4NjM0NywgMHg2MzQ4LAotICAgIDB4NjM0QSwgMHg2MzUxLCAweDYzNTIsIDB4NjM1MywgMHg2MzU0LCAweDYzNTYsIDB4NjM1NywgMHg2MzU4LAotICAgIDB4NjM1OSwgMHg2MzVBLCAweDYzNUIsIDB4NjM1QywgMHg2MzVELCAweDYzNjAsIDB4NjM2NCwgMHg2MzY1LAotICAgIDB4NjM2NiwgMHg2MzZBLCAweDYzNkMsIDB4NjM2RiwgMHg2MzcwLCAweDYzNzMsIDB4NjM3NCwgMHg2Mzc1LAotICAgIDB4NjM3OCwgMHg2Mzc5LCAweDYzN0MsIDB4NjM3RCwgMHg2MzdFLCAweDYzN0YsIDB4NjM4MSwgMHg2Mzg1LAotICAgIDB4NjM4NiwgMHg2MzhCLCAweDYzOEQsIDB4NjM5MSwgMHg2MzkzLCAweDYzOTQsIDB4NjM5NSwgMHg2Mzk3LAotICAgIDB4NjM5OSwgMHg2MzlBLCAweDYzOUIsIDB4NjM5QywgMHg2MzlELCAweDYzOUUsIDB4NjM5RiwgMHg2M0ExLAotICAgIDB4NjNBNCwgMHg2M0E2LCAweDYzQUIsIDB4NjNBRiwgMHg2M0IxLCAweDYzQjIsIDB4NjNCNSwgMHg2M0I2LAotICAgIDB4NjNCOSwgMHg2M0JCLCAweDYzQkQsIDB4NjNCRiwgMHg2M0MxLCAweDYzQzIsIDB4NjNDMywgMHg2M0M1LAotICAgIDB4NjNDNywgMHg2M0M4LCAweDYzQ0EsIDB4NjNDQiwgMHg2M0NDLCAweDYzRDEsIDB4NjNEMywgMHg2M0Q0LAotICAgIDB4NjNENSwgMHg2M0Q3LCAweDYzRDgsIDB4NjNEOSwgMHg2M0RCLCAweDYzREMsIDB4NjNERCwgMHg2M0RGLAotICAgIDB4NjNFMiwgMHg2M0U0LCAweDYzRTUsIDB4NjNFNiwgMHg2M0U3LCAweDYzRTgsIDB4NjNFQiwgMHg2M0VDLAotICAgIDB4NjNFRiwgMHg2M0YwLCAweDYzRjEsIDB4NjNGMywgMHg2M0Y1LCAweDYzRjcsIDB4NjNGOSwgMHg2M0ZBLAotICAgIDB4NjNGQiwgMHg2M0ZDLCAweDYzRkUsIDB4NjQwMywgMHg2NDA0LCAweDY0MDYsIDB4NjQwNywgMHg2NDA4LAotICAgIDB4NjQwOSwgMHg2NDBBLCAweDY0MEUsIDB4NjQxMSwgMHg2NDEyLCAweDY0MTUsIDB4NjQxNiwgMHg2NDE4LAotICAgIDB4NjQxOSwgMHg2NDFBLCAweDY0MUQsIDB4NjQxRiwgMHg2NDIyLCAweDY0MjMsIDB4NjQyNCwgMHg2NDI1LAotICAgIDB4NjQyNywgMHg2NDI4LCAweDY0MjksIDB4NjQyQiwgMHg2NDJFLCAweDY0MkYsIDB4NjQzMCwgMHg2NDMxLAotICAgIDB4NjQzMiwgMHg2NDMzLCAweDY0MzUsIDB4NjQzNywgMHg2NDM4LCAweDY0MzksIDB4NjQzQiwgMHg2NDNDLAotICAgIDB4NjQzRSwgMHg2NDQwLCAweDY0NDIsIDB4NjQ0MywgMHg2NDQ5LCAweDY0NEIsIDB4NjQ0QywgMHg2NDRELAotICAgIDB4NjQ0RSwgMHg2NDRGLCAweDY0NTAsIDB4NjQ1MywgMHg2NDU1LCAweDY0NTYsIDB4NjQ1NywgMHg2NDU5LAotICAgIDB4NjQ1QSwgMHg2NDVCLCAweDY0NUQsIDB4NjQ2MCwgMHg2NDYxLCAweDY0NjIsIDB4NjQ2MywgMHg2NDY0LAotICAgIDB4NjQ2NSwgMHg2NDY2LCAweDY0NjgsIDB4NjQ2QSwgMHg2NDZCLCAweDY0NkMsIDB4NjQ2RSwgMHg2NDcwLAotICAgIDB4NjQ3MSwgMHg2NDcyLCAweDY0NzQsIDB4NjQ3NSwgMHg2NDc3LCAweDY0N0MsIDB4NjQ3RCwgMHg2NDdFLAotICAgIDB4NjQ3RiwgMHg2NDgwLCAweDY0ODEsIDB4NjQ4MywgMHg2NDg2LCAweDY0ODksIDB4NjQ4QSwgMHg2NDhCLAotICAgIDB4NjQ4QywgMHg2NDhELCAweDY0OEUsIDB4NjQ4RiwgMHg2NDkwLCAweDY0OTQsIDB4NjQ5NywgMHg2NDk4LAotICAgIDB4NjQ5QSwgMHg2NDlCLCAweDY0OUMsIDB4NjQ5RCwgMHg2NEEwLCAweDY0QTEsIDB4NjRBMiwgMHg2NEE2LAotICAgIDB4NjRBNywgMHg2NEE4LCAweDY0QUEsIDB4NjRBRiwgMHg2NEIxLCAweDY0QjQsIDB4NjRCNiwgMHg2NEI5LAotICAgIDB4NjRCRCwgMHg2NEMzLCAweDY0QzYsIDB4NjRDOCwgMHg2NEM5LCAweDY0Q0MsIDB4NjRDRiwgMHg2NEQxLAotICAgIDB4NjREMywgMHg2NEQ1LCAweDY0RDYsIDB4NjREOSwgMHg2NERCLCAweDY0REMsIDB4NjRERCwgMHg2NERGLAotICAgIDB4NjRFMSwgMHg2NEUzLCAweDY0RTUsIDB4NjRFNywgMHg2NEU4LCAweDY0RTksIDB4NjRFQSwgMHg2NEVCLAotICAgIDB4NjRFRCwgMHg2NEVFLCAweDY0RjMsIDB4NjRGNSwgMHg2NEY2LCAweDY0RjgsIDB4NjRGOSwgMHg2NEZELAotICAgIDB4NjRGRiwgMHg2NTAxLCAweDY1MDIsIDB4NjUwMywgMHg2NTA1LCAweDY1MDcsIDB4NjUwOCwgMHg2NTBBLAotICAgIDB4NjUwQiwgMHg2NTBDLCAweDY1MEQsIDB4NjUwRSwgMHg2NTEwLCAweDY1MTEsIDB4NjUxMywgMHg2NTE1LAotICAgIDB4NjUxNywgMHg2NTFBLCAweDY1MUMsIDB4NjUxRSwgMHg2NTFGLCAweDY1MjAsIDB4NjUyMSwgMHg2NTI2LAotICAgIDB4NjUyNywgMHg2NTI4LCAweDY1MjksIDB4NjUyRCwgMHg2NTMwLCAweDY1MzEsIDB4NjUzMiwgMHg2NTMzLAotICAgIDB4NjUzNywgMHg2NTNBLCAweDY1M0MsIDB4NjUzRCwgMHg2NTQwLCAweDY1NDEsIDB4NjU0MiwgMHg2NTQzLAotICAgIDB4NjU0NCwgMHg2NTQ2LCAweDY1NDcsIDB4NjU0QSwgMHg2NTRCLCAweDY1NEQsIDB4NjU0RSwgMHg2NTUwLAotICAgIDB4NjU1MiwgMHg2NTUzLCAweDY1NTQsIDB4NjU1OCwgMHg2NTVBLCAweDY1NUMsIDB4NjU1RiwgMHg2NTYwLAotICAgIDB4NjU2MSwgMHg2NTY0LCAweDY1NjUsIDB4NjU2NywgMHg2NTY4LCAweDY1NjksIDB4NjU2QSwgMHg2NTZELAotICAgIDB4NjU2RSwgMHg2NTZGLCAweDY1NzEsIDB4NjU3MywgMHg2NTc2LCAweDY1NzksIDB4NjU3QSwgMHg2NTdCLAotICAgIDB4NjU3QywgMHg2NTdELCAweDY1N0UsIDB4NjU3RiwgMHg2NTgwLCAweDY1ODEsIDB4NjU4NCwgMHg2NTg1LAotICAgIDB4NjU4NiwgMHg2NTg4LCAweDY1ODksIDB4NjU4QSwgMHg2NThELCAweDY1OEUsIDB4NjU4RiwgMHg2NTkyLAotICAgIDB4NjU5NCwgMHg2NTk2LCAweDY1OTgsIDB4NjU5QSwgMHg2NTlELCAweDY1OUUsIDB4NjVBMCwgMHg2NUEyLAotICAgIDB4NjVBMywgMHg2NUE2LCAweDY1QTgsIDB4NjVBQSwgMHg2NUFFLCAweDY1QjEsIDB4NjVCMiwgMHg2NUIzLAotICAgIDB4NjVCNCwgMHg2NUI1LCAweDY1QjYsIDB4NjVCOCwgMHg2NUJBLCAweDY1QkIsIDB4NjVCRSwgMHg2NUJGLAotICAgIDB4NjVDMCwgMHg2NUMyLCAweDY1QzcsIDB4NjVDOCwgMHg2NUM5LCAweDY1Q0EsIDB4NjVDRCwgMHg2NUQwLAotICAgIDB4NjVEMSwgMHg2NUQzLCAweDY1RDQsIDB4NjVENSwgMHg2NUQ4LCAweDY1RDksIDB4NjVEQSwgMHg2NURCLAotICAgIDB4NjVEQywgMHg2NURELCAweDY1REUsIDB4NjVERiwgMHg2NUUxLCAweDY1RTMsIDB4NjVFNCwgMHg2NUVBLAotICAgIDB4NjVFQiwgMHg2NUYyLCAweDY1RjMsIDB4NjVGNCwgMHg2NUY1LCAweDY1RjgsIDB4NjVGOSwgMHg2NUZCLAotICAgIDB4NjVGQywgMHg2NUZELCAweDY1RkUsIDB4NjVGRiwgMHg2NjAxLCAweDY2MDQsIDB4NjYwNSwgMHg2NjA3LAotICAgIDB4NjYwOCwgMHg2NjA5LCAweDY2MEIsIDB4NjYwRCwgMHg2NjEwLCAweDY2MTEsIDB4NjYxMiwgMHg2NjE2LAotICAgIDB4NjYxNywgMHg2NjE4LCAweDY2MUEsIDB4NjYxQiwgMHg2NjFDLCAweDY2MUUsIDB4NjYyMSwgMHg2NjIyLAotICAgIDB4NjYyMywgMHg2NjI0LCAweDY2MjYsIDB4NjYyOSwgMHg2NjJBLCAweDY2MkIsIDB4NjYyQywgMHg2NjJFLAotICAgIDB4NjYzMCwgMHg2NjMyLCAweDY2MzMsIDB4NjYzNywgMHg2NjM4LCAweDY2MzksIDB4NjYzQSwgMHg2NjNCLAotICAgIDB4NjYzRCwgMHg2NjNGLCAweDY2NDAsIDB4NjY0NCwgMHg2NjQ1LCAweDY2NDYsIDB4NjY0NywgMHg2NjQ4LAotICAgIDB4NjY0OSwgMHg2NjRBLCAweDY2NEQsIDB4NjY0RSwgMHg2NjUwLCAweDY2NTEsIDB4NjY1OCwgMHg2NjU5LAotICAgIDB4NjY1QiwgMHg2NjVDLCAweDY2NUUsIDB4NjY2MCwgMHg2NjYyLCAweDY2NjMsIDB4NjY2NSwgMHg2NjY3LAotICAgIDB4NjY2OSwgMHg2NjZBLCAweDY2NkIsIDB4NjY2QywgMHg2NjZELCAweDY2NzEsIDB4NjY3MiwgMHg2NjczLAotICAgIDB4NjY3NSwgMHg2Njc4LCAweDY2NzksIDB4NjY3QiwgMHg2NjdDLCAweDY2N0QsIDB4NjY3RiwgMHg2NjgwLAotICAgIDB4NjY4MSwgMHg2NjgzLCAweDY2ODUsIDB4NjY4NiwgMHg2NjhBLCAweDY2OEIsIDB4NjY4RCwgMHg2NjhFLAotICAgIDB4NjY4RiwgMHg2NjkwLCAweDY2OTIsIDB4NjY5MywgMHg2Njk0LCAweDY2OTUsIDB4NjY5OCwgMHg2Njk5LAotICAgIDB4NjY5QSwgMHg2NjlCLCAweDY2OUMsIDB4NjY5RSwgMHg2NjlGLCAweDY2QTAsIDB4NjZBMSwgMHg2NkEzLAotICAgIDB4NjZBNCwgMHg2NkE1LCAweDY2QTYsIDB4NjZBOSwgMHg2NkFBLCAweDY2QUMsIDB4NjZBRCwgMHg2NkFGLAotICAgIDB4NjZCMCwgMHg2NkIxLCAweDY2QjIsIDB4NjZCMywgMHg2NkI1LCAweDY2QjYsIDB4NjZCNywgMHg2NkI4LAotICAgIDB4NjZCQSwgMHg2NkJCLCAweDY2QkMsIDB4NjZCRCwgMHg2NkJGLCAweDY2QzAsIDB4NjZDMSwgMHg2NkMyLAotICAgIDB4NjZDMywgMHg2NkM1LCAweDY2QzgsIDB4NjZDQSwgMHg2NkNCLCAweDY2Q0MsIDB4NjZDRCwgMHg2NkNFLAotICAgIDB4NjZDRiwgMHg2NkQwLCAweDY2RDEsIDB4NjZEMiwgMHg2NkQzLCAweDY2RDQsIDB4NjZENSwgMHg2NkQ3LAotICAgIDB4NjZEOCwgMHg2NkRBLCAweDY2REUsIDB4NjZERiwgMHg2NkUxLCAweDY2RTIsIDB4NjZFMywgMHg2NkU0LAotICAgIDB4NjZFNSwgMHg2NkU3LCAweDY2RTgsIDB4NjZFQSwgMHg2NkVCLCAweDY2RUQsIDB4NjZFRSwgMHg2NkVGLAotICAgIDB4NjZGMSwgMHg2NkY1LCAweDY2RjYsIDB4NjZGQSwgMHg2NkZCLCAweDY2RkQsIDB4NjcwMSwgMHg2NzAyLAotICAgIDB4NjcwNCwgMHg2NzA1LCAweDY3MDYsIDB4NjcwNywgMHg2NzBDLCAweDY3MEUsIDB4NjcwRiwgMHg2NzExLAotICAgIDB4NjcxMiwgMHg2NzEzLCAweDY3MTYsIDB4NjcxOCwgMHg2NzE5LCAweDY3MUEsIDB4NjcxQywgMHg2NzFFLAotICAgIDB4NjcyMCwgMHg2NzIxLCAweDY3MjIsIDB4NjcyMywgMHg2NzI0LCAweDY3MjUsIDB4NjcyOSwgMHg2NzJFLAotICAgIDB4NjczMCwgMHg2NzMyLCAweDY3MzMsIDB4NjczNiwgMHg2NzM3LCAweDY3MzgsIDB4NjczOSwgMHg2NzNCLAotICAgIDB4NjczQywgMHg2NzNFLCAweDY3M0YsIDB4Njc0MSwgMHg2NzQ0LCAweDY3NDUsIDB4Njc0NywgMHg2NzRBLAotICAgIDB4Njc0QiwgMHg2NzRELCAweDY3NTIsIDB4Njc1NCwgMHg2NzU1LCAweDY3NTcsIDB4Njc1OCwgMHg2NzU5LAotICAgIDB4Njc1QSwgMHg2NzVCLCAweDY3NUQsIDB4Njc2MiwgMHg2NzYzLCAweDY3NjQsIDB4Njc2NiwgMHg2NzY3LAotICAgIDB4Njc2QiwgMHg2NzZDLCAweDY3NkUsIDB4Njc3NCwgMHg2Nzc2LCAweDY3NzgsIDB4Njc3OSwgMHg2NzdBLAotICAgIDB4Njc3QiwgMHg2NzdELCAweDY3ODAsIDB4Njc4MiwgMHg2NzgzLCAweDY3ODUsIDB4Njc4NiwgMHg2Nzg4LAotICAgIDB4Njc4QSwgMHg2NzhDLCAweDY3OEQsIDB4Njc4RSwgMHg2NzhGLCAweDY3OTEsIDB4Njc5MiwgMHg2NzkzLAotICAgIDB4Njc5NCwgMHg2Nzk2LCAweDY3OTksIDB4Njc5QiwgMHg2NzlGLCAweDY3QTAsIDB4NjdBMSwgMHg2N0E0LAotICAgIDB4NjdBNiwgMHg2N0E5LCAweDY3QUMsIDB4NjdBRSwgMHg2N0IxLCAweDY3QjIsIDB4NjdCNCwgMHg2N0I5LAotICAgIDB4NjdCQSwgMHg2N0JCLCAweDY3QkMsIDB4NjdCRCwgMHg2N0JFLCAweDY3QkYsIDB4NjdDMCwgMHg2N0MyLAotICAgIDB4NjdDNSwgMHg2N0M2LCAweDY3QzcsIDB4NjdDOCwgMHg2N0M5LCAweDY3Q0EsIDB4NjdDQiwgMHg2N0NDLAotICAgIDB4NjdDRCwgMHg2N0NFLCAweDY3RDUsIDB4NjdENiwgMHg2N0Q3LCAweDY3REIsIDB4NjdERiwgMHg2N0UxLAotICAgIDB4NjdFMywgMHg2N0U0LCAweDY3RTYsIDB4NjdFNywgMHg2N0U4LCAweDY3RUEsIDB4NjdFQiwgMHg2N0VELAotICAgIDB4NjdFRSwgMHg2N0YyLCAweDY3RjUsIDB4NjdGNiwgMHg2N0Y3LCAweDY3RjgsIDB4NjdGOSwgMHg2N0ZBLAotICAgIDB4NjdGQiwgMHg2N0ZDLCAweDY3RkUsIDB4NjgwMSwgMHg2ODAyLCAweDY4MDMsIDB4NjgwNCwgMHg2ODA2LAotICAgIDB4NjgwRCwgMHg2ODEwLCAweDY4MTIsIDB4NjgxNCwgMHg2ODE1LCAweDY4MTgsIDB4NjgxOSwgMHg2ODFBLAotICAgIDB4NjgxQiwgMHg2ODFDLCAweDY4MUUsIDB4NjgxRiwgMHg2ODIwLCAweDY4MjIsIDB4NjgyMywgMHg2ODI0LAotICAgIDB4NjgyNSwgMHg2ODI2LCAweDY4MjcsIDB4NjgyOCwgMHg2ODJCLCAweDY4MkMsIDB4NjgyRCwgMHg2ODJFLAotICAgIDB4NjgyRiwgMHg2ODMwLCAweDY4MzEsIDB4NjgzNCwgMHg2ODM1LCAweDY4MzYsIDB4NjgzQSwgMHg2ODNCLAotICAgIDB4NjgzRiwgMHg2ODQ3LCAweDY4NEIsIDB4Njg0RCwgMHg2ODRGLCAweDY4NTIsIDB4Njg1NiwgMHg2ODU3LAotICAgIDB4Njg1OCwgMHg2ODU5LCAweDY4NUEsIDB4Njg1QiwgMHg2ODVDLCAweDY4NUQsIDB4Njg1RSwgMHg2ODVGLAotICAgIDB4Njg2QSwgMHg2ODZDLCAweDY4NkQsIDB4Njg2RSwgMHg2ODZGLCAweDY4NzAsIDB4Njg3MSwgMHg2ODcyLAotICAgIDB4Njg3MywgMHg2ODc1LCAweDY4NzgsIDB4Njg3OSwgMHg2ODdBLCAweDY4N0IsIDB4Njg3QywgMHg2ODdELAotICAgIDB4Njg3RSwgMHg2ODdGLCAweDY4ODAsIDB4Njg4MiwgMHg2ODg0LCAweDY4ODcsIDB4Njg4OCwgMHg2ODg5LAotICAgIDB4Njg4QSwgMHg2ODhCLCAweDY4OEMsIDB4Njg4RCwgMHg2ODhFLCAweDY4OTAsIDB4Njg5MSwgMHg2ODkyLAotICAgIDB4Njg5NCwgMHg2ODk1LCAweDY4OTYsIDB4Njg5OSwgMHg2ODlBLCAweDY4OUIsIDB4Njg5QywgMHg2ODlFLAotICAgIDB4NjhBMCwgMHg2OEExLCAweDY4QTMsIDB4NjhBNCwgMHg2OEE1LCAweDY4QTksIDB4NjhBQSwgMHg2OEFCLAotICAgIDB4NjhBQywgMHg2OEFFLCAweDY4QjEsIDB4NjhCMiwgMHg2OEI0LCAweDY4QjYsIDB4NjhCNywgMHg2OEI4LAotICAgIDB4NjhCOSwgMHg2OEJBLCAweDY4QkIsIDB4NjhCQywgMHg2OEJELCAweDY4QkUsIDB4NjhCRiwgMHg2OEMxLAotICAgIDB4NjhDMywgMHg2OEM0LCAweDY4QzUsIDB4NjhDNiwgMHg2OEM3LCAweDY4QzgsIDB4NjhDQSwgMHg2OENDLAotICAgIDB4NjhDRSwgMHg2OENGLCAweDY4RDAsIDB4NjhEMSwgMHg2OEQzLCAweDY4RDQsIDB4NjhEOSwgMHg2OERCLAotICAgIDB4NjhEQywgMHg2OERELCAweDY4REUsIDB4NjhFMSwgMHg2OEUyLCAweDY4RTQsIDB4NjhFNSwgMHg2OEU2LAotICAgIDB4NjhFOCwgMHg2OEU5LCAweDY4RUEsIDB4NjhFQiwgMHg2OEVDLCAweDY4RUQsIDB4NjhFRiwgMHg2OEYyLAotICAgIDB4NjhGMywgMHg2OEY0LCAweDY4RjYsIDB4NjhGNywgMHg2OEY4LCAweDY4RkIsIDB4NjhGRCwgMHg2OEZFLAotICAgIDB4NjhGRiwgMHg2OTAwLCAweDY5MDIsIDB4NjkwMywgMHg2OTA0LCAweDY5MDYsIDB4NjkwNywgMHg2OTA4LAotICAgIDB4NjkwOSwgMHg2OTBBLCAweDY5MEMsIDB4NjkxMSwgMHg2OTEzLCAweDY5MTQsIDB4NjkxNSwgMHg2OTE2LAotICAgIDB4NjkxNywgMHg2OTE4LCAweDY5MTksIDB4NjkxQSwgMHg2OTFCLCAweDY5MUMsIDB4NjkxRCwgMHg2OTFFLAotICAgIDB4NjkyMSwgMHg2OTIyLCAweDY5MjMsIDB4NjkyNSwgMHg2OTI2LCAweDY5MjcsIDB4NjkyOCwgMHg2OTI5LAotICAgIDB4NjkyQSwgMHg2OTJCLCAweDY5MkMsIDB4NjkyRSwgMHg2OTJGLCAweDY5MzEsIDB4NjkzMiwgMHg2OTMzLAotICAgIDB4NjkzNSwgMHg2OTM2LCAweDY5MzcsIDB4NjkzOCwgMHg2OTNBLCAweDY5M0IsIDB4NjkzQywgMHg2OTNFLAotICAgIDB4Njk0MCwgMHg2OTQxLCAweDY5NDMsIDB4Njk0NCwgMHg2OTQ1LCAweDY5NDYsIDB4Njk0NywgMHg2OTQ4LAotICAgIDB4Njk0OSwgMHg2OTRCLCAweDY5NEMsIDB4Njk0RCwgMHg2OTRFLCAweDY5NEYsIDB4Njk1MCwgMHg2OTUxLAotICAgIDB4Njk1MiwgMHg2OTU1LCAweDY5NTYsIDB4Njk1OCwgMHg2OTU5LCAweDY5NUIsIDB4Njk1QywgMHg2OTVGLAotICAgIDB4Njk2MSwgMHg2OTYyLCAweDY5NjQsIDB4Njk2NSwgMHg2OTY3LCAweDY5NjksIDB4Njk2QSwgMHg2OTZDLAotICAgIDB4Njk2RiwgMHg2OTcwLCAweDY5NzIsIDB4Njk3MywgMHg2OTc0LCAweDY5NzYsIDB4Njk3QSwgMHg2OTdCLAotICAgIDB4Njk3RCwgMHg2OTdFLCAweDY5N0YsIDB4Njk4MSwgMHg2OTgzLCAweDY5ODUsIDB4Njk4QSwgMHg2OThCLAotICAgIDB4Njk4QywgMHg2OThFLCAweDY5OEYsIDB4Njk5MCwgMHg2OTkxLCAweDY5OTIsIDB4Njk5MywgMHg2OTk2LAotICAgIDB4Njk5NywgMHg2OTk5LCAweDY5OUEsIDB4Njk5RCwgMHg2OTlFLCAweDY5OUYsIDB4NjlBMCwgMHg2OUExLAotICAgIDB4NjlBMiwgMHg2OUEzLCAweDY5QTQsIDB4NjlBNSwgMHg2OUE2LCAweDY5QTksIDB4NjlBQywgMHg2OUFGLAotICAgIDB4NjlCMCwgMHg2OUIyLCAweDY5QjMsIDB4NjlCNSwgMHg2OUI2LCAweDY5QjgsIDB4NjlCOSwgMHg2OUJBLAotICAgIDB4NjlCQywgMHg2OUJELCAweDY5QkUsIDB4NjlDMCwgMHg2OUMyLCAweDY5QzMsIDB4NjlDNCwgMHg2OUM1LAotICAgIDB4NjlDNiwgMHg2OUM3LCAweDY5QzgsIDB4NjlDOSwgMHg2OUNGLCAweDY5RDEsIDB4NjlEMiwgMHg2OUQzLAotICAgIDB4NjlENSwgMHg2OUQ2LCAweDY5RDcsIDB4NjlEOCwgMHg2OUQ5LCAweDY5REEsIDB4NjlEQywgMHg2OURELAotICAgIDB4NjlERSwgMHg2OUUxLCAweDY5RTIsIDB4NjlFMywgMHg2OUU0LCAweDY5RTUsIDB4NjlFNiwgMHg2OUU4LAotICAgIDB4NjlFOSwgMHg2OUVBLCAweDY5RUIsIDB4NjlFQywgMHg2OUVFLCAweDY5RUYsIDB4NjlGMCwgMHg2OUYxLAotICAgIDB4NjlGNCwgMHg2OUY1LCAweDY5RjYsIDB4NjlGNywgMHg2OUY4LCAweDY5RjksIDB4NjlGQSwgMHg2OUZCLAotICAgIDB4NjlGQywgMHg2OUZFLCAweDZBMDAsIDB4NkEwMywgMHg2QTA0LCAweDZBMDYsIDB4NkEwNywgMHg2QTA4LAotICAgIDB4NkEwOSwgMHg2QTBCLCAweDZBMEMsIDB4NkEwRCwgMHg2QTBFLCAweDZBMEYsIDB4NkExMCwgMHg2QTExLAotICAgIDB4NkExMiwgMHg2QTE0LCAweDZBMTUsIDB4NkExNiwgMHg2QTFBLCAweDZBMUIsIDB4NkExQywgMHg2QTFELAotICAgIDB4NkEyMCwgMHg2QTIyLCAweDZBMjQsIDB4NkEyNSwgMHg2QTI2LCAweDZBMjcsIDB4NkEyOSwgMHg2QTJCLAotICAgIDB4NkEyQywgMHg2QTJELCAweDZBMkUsIDB4NkEzMCwgMHg2QTMyLCAweDZBMzMsIDB4NkEzNCwgMHg2QTM2LAotICAgIDB4NkEzNywgMHg2QTNCLCAweDZBM0MsIDB4NkEzRiwgMHg2QTQwLCAweDZBNDEsIDB4NkE0MiwgMHg2QTQzLAotICAgIDB4NkE0NSwgMHg2QTQ2LCAweDZBNDksIDB4NkE0QSwgMHg2QTRDLCAweDZBNEQsIDB4NkE0RSwgMHg2QTRGLAotICAgIDB4NkE1MSwgMHg2QTUyLCAweDZBNTMsIDB4NkE1NCwgMHg2QTU1LCAweDZBNTYsIDB4NkE1NywgMHg2QTVBLAotICAgIDB4NkE1QywgMHg2QTVELCAweDZBNUUsIDB4NkE2MCwgMHg2QTYzLCAweDZBNjQsIDB4NkE2NiwgMHg2QTY3LAotICAgIDB4NkE2OCwgMHg2QTY5LCAweDZBNkEsIDB4NkE2QiwgMHg2QTZDLCAweDZBNkQsIDB4NkE2RSwgMHg2QTZGLAotICAgIDB4NkE3MCwgMHg2QTcyLCAweDZBNzMsIDB4NkE3NCwgMHg2QTc1LCAweDZBNzYsIDB4NkE3NywgMHg2QTc4LAotICAgIDB4NkE3QSwgMHg2QTdCLCAweDZBN0QsIDB4NkE3RSwgMHg2QTdGLCAweDZBODEsIDB4NkE4MiwgMHg2QTgzLAotICAgIDB4NkE4NSwgMHg2QTg2LCAweDZBODcsIDB4NkE4OCwgMHg2QThBLCAweDZBOEIsIDB4NkE4QywgMHg2QThELAotICAgIDB4NkE4RiwgMHg2QTkyLCAweDZBOTMsIDB4NkE5NSwgMHg2QTk2LCAweDZBOTgsIDB4NkE5OSwgMHg2QTlBLAotICAgIDB4NkE5QiwgMHg2QTlELCAweDZBOUUsIDB4NkE5RiwgMHg2QUExLCAweDZBQTQsIDB4NkFBNSwgMHg2QUE2LAotICAgIDB4NkFBNywgMHg2QUE4LCAweDZBQUEsIDB4NkFBRCwgMHg2QUFFLCAweDZBQjAsIDB4NkFCMSwgMHg2QUIyLAotICAgIDB4NkFCNCwgMHg2QUI1LCAweDZBQjYsIDB4NkFCNywgMHg2QUI5LCAweDZBQkEsIDB4NkFCQywgMHg2QUJELAotICAgIDB4NkFCRSwgMHg2QUJGLCAweDZBQzAsIDB4NkFDMSwgMHg2QUMyLCAweDZBQzQsIDB4NkFDNSwgMHg2QUM2LAotICAgIDB4NkFDNywgMHg2QUM4LCAweDZBQzksIDB4NkFDQSwgMHg2QUNCLCAweDZBQ0MsIDB4NkFDRCwgMHg2QUNFLAotICAgIDB4NkFDRiwgMHg2QUQwLCAweDZBRDEsIDB4NkFEMiwgMHg2QUQ0LCAweDZBRDUsIDB4NkFENiwgMHg2QUQ3LAotICAgIDB4NkFEOCwgMHg2QUQ5LCAweDZBREMsIDB4NkFFMCwgMHg2QUUxLCAweDZBRTIsIDB4NkFFMywgMHg2QUU0LAotICAgIDB4NkFFNSwgMHg2QUU2LCAweDZBRTksIDB4NkFFQiwgMHg2QUVELCAweDZBRUUsIDB4NkFFRiwgMHg2QUYwLAotICAgIDB4NkFGMSwgMHg2QUYyLCAweDZBRjQsIDB4NkFGNSwgMHg2QUY2LCAweDZBRjcsIDB4NkFGOSwgMHg2QUZBLAotICAgIDB4NkFGQywgMHg2QUZELCAweDZBRkUsIDB4NkFGRiwgMHg2QjAwLCAweDZCMDEsIDB4NkIwMiwgMHg2QjAzLAotICAgIDB4NkIwNSwgMHg2QjA2LCAweDZCMDcsIDB4NkIwOCwgMHg2QjA5LCAweDZCMEIsIDB4NkIwQywgMHg2QjBELAotICAgIDB4NkIwRSwgMHg2QjEwLCAweDZCMTEsIDB4NkIxMywgMHg2QjE0LCAweDZCMTUsIDB4NkIxNywgMHg2QjE4LAotICAgIDB4NkIxOSwgMHg2QjFBLCAweDZCMUIsIDB4NkIxQywgMHg2QjFELCAweDZCMUYsIDB4NkIyNSwgMHg2QjI2LAotICAgIDB4NkIyOCwgMHg2QjI5LCAweDZCMkEsIDB4NkIyQiwgMHg2QjJDLCAweDZCMkQsIDB4NkIyRSwgMHg2QjJGLAotICAgIDB4NkIzMCwgMHg2QjMxLCAweDZCMzMsIDB4NkIzNCwgMHg2QjM1LCAweDZCMzYsIDB4NkIzOCwgMHg2QjNCLAotICAgIDB4NkIzQywgMHg2QjNGLCAweDZCNDAsIDB4NkI0MSwgMHg2QjQyLCAweDZCNDQsIDB4NkI0NSwgMHg2QjQ4LAotICAgIDB4NkI0QSwgMHg2QjRCLCAweDZCNEQsIDB4NkI0RSwgMHg2QjRGLCAweDZCNTEsIDB4NkI1MiwgMHg2QjUzLAotICAgIDB4NkI1NCwgMHg2QjU1LCAweDZCNTYsIDB4NkI1NywgMHg2QjU4LCAweDZCNUEsIDB4NkI1QiwgMHg2QjVDLAotICAgIDB4NkI1RCwgMHg2QjVFLCAweDZCNjAsIDB4NkI2OCwgMHg2QjY5LCAweDZCNkIsIDB4NkI2QywgMHg2QjZELAotICAgIDB4NkI2RSwgMHg2QjZGLCAweDZCNzAsIDB4NkI3MSwgMHg2QjczLCAweDZCNzQsIDB4NkI3NSwgMHg2Qjc2LAotICAgIDB4NkI3QSwgMHg2QjdELCAweDZCN0UsIDB4NkI3RiwgMHg2QjgwLCAweDZCODUsIDB4NkI4OCwgMHg2QjhDLAotICAgIDB4NkI4RSwgMHg2QjhGLCAweDZCOTAsIDB4NkI5MSwgMHg2Qjk0LCAweDZCOTUsIDB4NkI5NywgMHg2Qjk5LAotICAgIDB4NkI5QywgMHg2QjlELCAweDZCOUYsIDB4NkJBMCwgMHg2QkEyLCAweDZCQTMsIDB4NkJBNSwgMHg2QkE2LAotICAgIDB4NkJBNywgMHg2QkE4LCAweDZCQTksIDB4NkJBQywgMHg2QkFELCAweDZCQjAsIDB4NkJCMSwgMHg2QkI2LAotICAgIDB4NkJCOCwgMHg2QkI5LCAweDZCQkMsIDB4NkJCRCwgMHg2QkJFLCAweDZCQzAsIDB4NkJDMywgMHg2QkM0LAotICAgIDB4NkJDNywgMHg2QkM4LCAweDZCQzksIDB4NkJDQSwgMHg2QkNDLCAweDZCQ0UsIDB4NkJEMCwgMHg2QkQxLAotICAgIDB4NkJEOCwgMHg2QkRBLCAweDZCREMsIDB4NkJERCwgMHg2QkRFLCAweDZCREYsIDB4NkJFMCwgMHg2QkUyLAotICAgIDB4NkJFMywgMHg2QkU0LCAweDZCRTUsIDB4NkJFNiwgMHg2QkU3LCAweDZCRTgsIDB4NkJFOSwgMHg2QkVDLAotICAgIDB4NkJFRCwgMHg2QkVFLCAweDZCRjAsIDB4NkJGMSwgMHg2QkYyLCAweDZCRjQsIDB4NkJGNiwgMHg2QkY3LAotICAgIDB4NkJGOCwgMHg2QkZBLCAweDZCRkIsIDB4NkJGQywgMHg2QkZFLCAweDZDMDAsIDB4NkMwMSwgMHg2QzAyLAotICAgIDB4NkMwMywgMHg2QzA0LCAweDZDMDksIDB4NkMwQSwgMHg2QzBCLCAweDZDMEUsIDB4NkMxMiwgMHg2QzE3LAotICAgIDB4NkMxQywgMHg2QzFELCAweDZDMUUsIDB4NkMyMCwgMHg2QzI1LCAweDZDMkQsIDB4NkMzMSwgMHg2QzMzLAotICAgIDB4NkMzNiwgMHg2QzM3LCAweDZDMzksIDB4NkMzQSwgMHg2QzNCLCAweDZDM0MsIDB4NkMzRSwgMHg2QzNGLAotICAgIDB4NkM0MywgMHg2QzQ0LCAweDZDNDUsIDB4NkM0OCwgMHg2QzRCLCAweDZDNEMsIDB4NkM0RCwgMHg2QzRFLAotICAgIDB4NkM0RiwgMHg2QzUxLCAweDZDNTIsIDB4NkM1MywgMHg2QzU2LCAweDZDNTgsIDB4NkM1OSwgMHg2QzVBLAotICAgIDB4NkM2MiwgMHg2QzYzLCAweDZDNjUsIDB4NkM2NiwgMHg2QzY3LCAweDZDNkIsIDB4NkM2QywgMHg2QzZELAotICAgIDB4NkM2RSwgMHg2QzZGLCAweDZDNzEsIDB4NkM3MywgMHg2Qzc1LCAweDZDNzcsIDB4NkM3OCwgMHg2QzdBLAotICAgIDB4NkM3QiwgMHg2QzdDLCAweDZDN0YsIDB4NkM4MCwgMHg2Qzg0LCAweDZDODcsIDB4NkM4QSwgMHg2QzhCLAotICAgIDB4NkM4RCwgMHg2QzhFLCAweDZDOTEsIDB4NkM5MiwgMHg2Qzk1LCAweDZDOTYsIDB4NkM5NywgMHg2Qzk4LAotICAgIDB4NkM5QSwgMHg2QzlDLCAweDZDOUQsIDB4NkM5RSwgMHg2Q0EwLCAweDZDQTIsIDB4NkNBOCwgMHg2Q0FDLAotICAgIDB4NkNBRiwgMHg2Q0IwLCAweDZDQjQsIDB4NkNCNSwgMHg2Q0I2LCAweDZDQjcsIDB4NkNCQSwgMHg2Q0MwLAotICAgIDB4NkNDMSwgMHg2Q0MyLCAweDZDQzMsIDB4NkNDNiwgMHg2Q0M3LCAweDZDQzgsIDB4NkNDQiwgMHg2Q0NELAotICAgIDB4NkNDRSwgMHg2Q0NGLCAweDZDRDEsIDB4NkNEMiwgMHg2Q0Q4LCAweDZDRDksIDB4NkNEQSwgMHg2Q0RDLAotICAgIDB4NkNERCwgMHg2Q0RGLCAweDZDRTQsIDB4NkNFNiwgMHg2Q0U3LCAweDZDRTksIDB4NkNFQywgMHg2Q0VELAotICAgIDB4NkNGMiwgMHg2Q0Y0LCAweDZDRjksIDB4NkNGRiwgMHg2RDAwLCAweDZEMDIsIDB4NkQwMywgMHg2RDA1LAotICAgIDB4NkQwNiwgMHg2RDA4LCAweDZEMDksIDB4NkQwQSwgMHg2RDBELCAweDZEMEYsIDB4NkQxMCwgMHg2RDExLAotICAgIDB4NkQxMywgMHg2RDE0LCAweDZEMTUsIDB4NkQxNiwgMHg2RDE4LCAweDZEMUMsIDB4NkQxRCwgMHg2RDFGLAotICAgIDB4NkQyMCwgMHg2RDIxLCAweDZEMjIsIDB4NkQyMywgMHg2RDI0LCAweDZEMjYsIDB4NkQyOCwgMHg2RDI5LAotICAgIDB4NkQyQywgMHg2RDJELCAweDZEMkYsIDB4NkQzMCwgMHg2RDM0LCAweDZEMzYsIDB4NkQzNywgMHg2RDM4LAotICAgIDB4NkQzQSwgMHg2RDNGLCAweDZENDAsIDB4NkQ0MiwgMHg2RDQ0LCAweDZENDksIDB4NkQ0QywgMHg2RDUwLAotICAgIDB4NkQ1NSwgMHg2RDU2LCAweDZENTcsIDB4NkQ1OCwgMHg2RDVCLCAweDZENUQsIDB4NkQ1RiwgMHg2RDYxLAotICAgIDB4NkQ2MiwgMHg2RDY0LCAweDZENjUsIDB4NkQ2NywgMHg2RDY4LCAweDZENkIsIDB4NkQ2QywgMHg2RDZELAotICAgIDB4NkQ3MCwgMHg2RDcxLCAweDZENzIsIDB4NkQ3MywgMHg2RDc1LCAweDZENzYsIDB4NkQ3QSwgMHg2RDdCLAotICAgIDB4NkQ3RCwgMHg2RDdFLCAweDZEN0YsIDB4NkQ4MCwgMHg2RDgxLCAweDZEODMsIDB4NkQ4NCwgMHg2RDg2LAotICAgIDB4NkQ4QSwgMHg2RDhCLCAweDZEOEQsIDB4NkQ4RiwgMHg2RDkwLCAweDZEOTIsIDB4NkQ5NiwgMHg2RDk3LAotICAgIDB4NkQ5OCwgMHg2RDk5LCAweDZEOUEsIDB4NkQ5QywgMHg2REEyLCAweDZEQTUsIDB4NkRBQywgMHg2REFELAotICAgIDB4NkRCMCwgMHg2REIxLCAweDZEQjMsIDB4NkRCNCwgMHg2REI2LCAweDZEQjcsIDB4NkRCOSwgMHg2REJBLAotICAgIDB4NkRCQiwgMHg2REJDLCAweDZEQkQsIDB4NkRCRSwgMHg2REMxLCAweDZEQzIsIDB4NkRDMywgMHg2REM4LAotICAgIDB4NkRDOSwgMHg2RENBLCAweDZEQ0QsIDB4NkRDRSwgMHg2RENGLCAweDZERDAsIDB4NkREMiwgMHg2REQzLAotICAgIDB4NkRENCwgMHg2REQ1LCAweDZERDcsIDB4NkREQSwgMHg2RERCLCAweDZEREMsIDB4NkRERiwgMHg2REUyLAotICAgIDB4NkRFMywgMHg2REU1LCAweDZERTcsIDB4NkRFOCwgMHg2REU5LCAweDZERUQsIDB4NkRFRiwgMHg2REYwLAotICAgIDB4NkRGMiwgMHg2REY0LCAweDZERjgsIDB4NkRGRCwgMHg2REZFLCAweDZERkYsIDB4NkUwMCwgMHg2RTAxLAotICAgIDB4NkUwMiwgMHg2RTAzLCAweDZFMDQsIDB4NkUwNiwgMHg2RTA3LCAweDZFMDgsIDB4NkUwOSwgMHg2RTBCLAotICAgIDB4NkUwRiwgMHg2RTEyLCAweDZFMTMsIDB4NkUxNSwgMHg2RTE4LCAweDZFMTksIDB4NkUxQiwgMHg2RTFDLAotICAgIDB4NkUxRSwgMHg2RTFGLCAweDZFMjIsIDB4NkUyNywgMHg2RTI4LCAweDZFMkEsIDB4NkUyRSwgMHg2RTMwLAotICAgIDB4NkUzMSwgMHg2RTMzLCAweDZFMzUsIDB4NkUzNiwgMHg2RTM3LCAweDZFMzksIDB4NkUzQiwgMHg2RTNDLAotICAgIDB4NkUzRCwgMHg2RTNGLCAweDZFNDAsIDB4NkU0MSwgMHg2RTQyLCAweDZFNDUsIDB4NkU0NiwgMHg2RTQ3LAotICAgIDB4NkU0OCwgMHg2RTQ5LCAweDZFNEEsIDB4NkU0QiwgMHg2RTRDLCAweDZFNEYsIDB4NkU1MCwgMHg2RTUxLAotICAgIDB4NkU1MiwgMHg2RTU1LCAweDZFNTcsIDB4NkU1OSwgMHg2RTVBLCAweDZFNUMsIDB4NkU1RCwgMHg2RTYwLAotICAgIDB4NkU2MSwgMHg2RTYyLCAweDZFNjMsIDB4NkU2NCwgMHg2RTY1LCAweDZFNjYsIDB4NkU2NywgMHg2RTY4LAotICAgIDB4NkU2OSwgMHg2RTZBLCAweDZFNkMsIDB4NkU2RCwgMHg2RTcwLCAweDZFNzEsIDB4NkU3MiwgMHg2RTczLAotICAgIDB4NkU3NCwgMHg2RTc1LCAweDZFNzYsIDB4NkU3NywgMHg2RTc4LCAweDZFNzksIDB4NkU3QSwgMHg2RTdCLAotICAgIDB4NkU3QywgMHg2RTdELCAweDZFODAsIDB4NkU4MSwgMHg2RTgyLCAweDZFODQsIDB4NkU4NywgMHg2RTg4LAotICAgIDB4NkU4QSwgMHg2RThCLCAweDZFOEMsIDB4NkU4RCwgMHg2RThFLCAweDZFOTEsIDB4NkU5MiwgMHg2RTkzLAotICAgIDB4NkU5NCwgMHg2RTk1LCAweDZFOTcsIDB4NkU5OSwgMHg2RTlBLCAweDZFOUIsIDB4NkU5RSwgMHg2RUEwLAotICAgIDB4NkVBMSwgMHg2RUEzLCAweDZFQTQsIDB4NkVBNiwgMHg2RUE4LCAweDZFQTksIDB4NkVBQiwgMHg2RUFDLAotICAgIDB4NkVBRCwgMHg2RUFFLCAweDZFQjAsIDB4NkVCMywgMHg2RUI1LCAweDZFQjgsIDB4NkVCOSwgMHg2RUJDLAotICAgIDB4NkVCRSwgMHg2RUJGLCAweDZFQzAsIDB4NkVDMywgMHg2RUM2LCAweDZFQzgsIDB4NkVDOSwgMHg2RUNBLAotICAgIDB4NkVDRCwgMHg2RUQwLCAweDZFRDIsIDB4NkVENiwgMHg2RUQ4LCAweDZFRDksIDB4NkVEQiwgMHg2RURDLAotICAgIDB4NkVERCwgMHg2RUUzLCAweDZFRTcsIDB4NkVFQSwgMHg2RUVCLCAweDZFRUQsIDB4NkVFRSwgMHg2RUYwLAotICAgIDB4NkVGMSwgMHg2RUYzLCAweDZFRjUsIDB4NkVGNiwgMHg2RUZBLCAweDZFRkIsIDB4NkVGQywgMHg2RUZELAotICAgIDB4NkVGRSwgMHg2RjAwLCAweDZGMDMsIDB4NkYwNCwgMHg2RjA1LCAweDZGMDcsIDB4NkYwOCwgMHg2RjBBLAotICAgIDB4NkYwQiwgMHg2RjBDLCAweDZGMEQsIDB4NkYwRSwgMHg2RjEwLCAweDZGMTEsIDB4NkYxMiwgMHg2RjE2LAotICAgIDB4NkYxNywgMHg2RjE4LCAweDZGMTksIDB4NkYxQiwgMHg2RjFDLCAweDZGMUQsIDB4NkYxRSwgMHg2RjFGLAotICAgIDB4NkYyMSwgMHg2RjI1LCAweDZGMjYsIDB4NkYyNywgMHg2RjI4LCAweDZGMkUsIDB4NkYzMCwgMHg2RjM0LAotICAgIDB4NkYzNSwgMHg2RjM3LCAweDZGMzksIDB4NkYzQSwgMHg2RjNCLCAweDZGM0MsIDB4NkYzRCwgMHg2RjQwLAotICAgIDB4NkY0MiwgMHg2RjQzLCAweDZGNDQsIDB4NkY0NSwgMHg2RjQ4LCAweDZGNDksIDB4NkY0QSwgMHg2RjRDLAotICAgIDB4NkY0RSwgMHg2RjRGLCAweDZGNTAsIDB4NkY1MiwgMHg2RjUzLCAweDZGNTUsIDB4NkY1NiwgMHg2RjU3LAotICAgIDB4NkY1QSwgMHg2RjVCLCAweDZGNUQsIDB4NkY1RiwgMHg2RjYwLCAweDZGNjEsIDB4NkY2MywgMHg2RjY1LAotICAgIDB4NkY2NywgMHg2RjY4LCAweDZGNjksIDB4NkY2QSwgMHg2RjZCLCAweDZGNkMsIDB4NkY3MSwgMHg2RjczLAotICAgIDB4NkY3NSwgMHg2Rjc2LCAweDZGNzksIDB4NkY3QiwgMHg2RjdELCAweDZGN0UsIDB4NkY4MSwgMHg2RjgyLAotICAgIDB4NkY4MywgMHg2Rjg1LCAweDZGOEEsIDB4NkY4QiwgMHg2RjhGLCAweDZGOTAsIDB4NkY5MSwgMHg2RjkyLAotICAgIDB4NkY5MywgMHg2Rjk0LCAweDZGOTUsIDB4NkY5NiwgMHg2Rjk4LCAweDZGOTksIDB4NkY5QSwgMHg2RjlCLAotICAgIDB4NkY5RCwgMHg2RjlFLCAweDZGOUYsIDB4NkZBMiwgMHg2RkEzLCAweDZGQTUsIDB4NkZBNiwgMHg2RkE4LAotICAgIDB4NkZBQSwgMHg2RkFCLCAweDZGQUMsIDB4NkZBRCwgMHg2RkFGLCAweDZGQjAsIDB4NkZCMiwgMHg2RkI0LAotICAgIDB4NkZCNSwgMHg2RkI3LCAweDZGQjgsIDB4NkZCQSwgMHg2RkJCLCAweDZGQkMsIDB4NkZCRCwgMHg2RkJFLAotICAgIDB4NkZCRiwgMHg2RkM0LCAweDZGQzUsIDB4NkZDNiwgMHg2RkM3LCAweDZGQzgsIDB4NkZDQSwgMHg2RkNCLAotICAgIDB4NkZDQywgMHg2RkNELCAweDZGQ0UsIDB4NkZDRiwgMHg2RkQwLCAweDZGRDMsIDB4NkZENCwgMHg2RkQ2LAotICAgIDB4NkZENywgMHg2RkQ5LCAweDZGREEsIDB4NkZEQywgMHg2RkRELCAweDZGRTIsIDB4NkZFMywgMHg2RkU1LAotICAgIDB4NkZFNiwgMHg2RkU3LCAweDZGRTgsIDB4NkZFOSwgMHg2RkVBLCAweDZGRUMsIDB4NkZFRCwgMHg2RkYyLAotICAgIDB4NkZGMywgMHg2RkY0LCAweDZGRjUsIDB4NkZGNiwgMHg2RkY3LCAweDZGRjgsIDB4NkZGOSwgMHg2RkZCLAotICAgIDB4NkZGRCwgMHg2RkZGLCAweDcwMDAsIDB4NzAwMSwgMHg3MDAyLCAweDcwMDMsIDB4NzAwNCwgMHg3MDA3LAotICAgIDB4NzAwOCwgMHg3MDBBLCAweDcwMEMsIDB4NzAwRCwgMHg3MDBFLCAweDcwMTAsIDB4NzAxMiwgMHg3MDEzLAotICAgIDB4NzAxNCwgMHg3MDE2LCAweDcwMTcsIDB4NzAxOSwgMHg3MDFDLCAweDcwMUUsIDB4NzAyMSwgMHg3MDIyLAotICAgIDB4NzAyNCwgMHg3MDI1LCAweDcwMjYsIDB4NzAyOSwgMHg3MDJBLCAweDcwMkIsIDB4NzAyQywgMHg3MDJELAotICAgIDB4NzAyRSwgMHg3MDJGLCAweDcwMzEsIDB4NzAzMywgMHg3MDM0LCAweDcwMzYsIDB4NzAzNywgMHg3MDM4LAotICAgIDB4NzAzQSwgMHg3MDNCLCAweDcwM0MsIDB4NzAzRCwgMHg3MDNGLCAweDcwNDAsIDB4NzA0MSwgMHg3MDQyLAotICAgIDB4NzA0NSwgMHg3MDQ2LCAweDcwNDcsIDB4NzA0OCwgMHg3MDQ5LCAweDcwNEEsIDB4NzA0QiwgMHg3MDRELAotICAgIDB4NzA0RSwgMHg3MDUwLCAweDcwNTIsIDB4NzA1MywgMHg3MDU0LCAweDcwNTYsIDB4NzA1NywgMHg3MDU5LAotICAgIDB4NzA1QSwgMHg3MDVCLCAweDcwNUMsIDB4NzA1RiwgMHg3MDYwLCAweDcwNjEsIDB4NzA2MiwgMHg3MDY1LAotICAgIDB4NzA2NiwgMHg3MDY4LCAweDcwNjksIDB4NzA2QSwgMHg3MDZFLCAweDcwNzEsIDB4NzA3MiwgMHg3MDczLAotICAgIDB4NzA3NCwgMHg3MDc3LCAweDcwNzksIDB4NzA3QSwgMHg3MDdCLCAweDcwN0QsIDB4NzA4MSwgMHg3MDgyLAotICAgIDB4NzA4MywgMHg3MDg0LCAweDcwODYsIDB4NzA4NywgMHg3MDg4LCAweDcwOEIsIDB4NzA4QywgMHg3MDhELAotICAgIDB4NzA4RiwgMHg3MDkwLCAweDcwOTEsIDB4NzA5MywgMHg3MDk3LCAweDcwOTgsIDB4NzA5QSwgMHg3MDlCLAotICAgIDB4NzA5RSwgMHg3MDlGLCAweDcwQTAsIDB4NzBBMSwgMHg3MEEyLCAweDcwQTMsIDB4NzBBNCwgMHg3MEE1LAotICAgIDB4NzBBNiwgMHg3MEE3LCAweDcwQTgsIDB4NzBBOSwgMHg3MEFBLCAweDcwQjAsIDB4NzBCMiwgMHg3MEI0LAotICAgIDB4NzBCNSwgMHg3MEI2LCAweDcwQkEsIDB4NzBCRSwgMHg3MEJGLCAweDcwQzQsIDB4NzBDNSwgMHg3MEM2LAotICAgIDB4NzBDNywgMHg3MEM5LCAweDcwQ0IsIDB4NzBDQywgMHg3MENELCAweDcwQ0UsIDB4NzBEMCwgMHg3MEQxLAotICAgIDB4NzBEMiwgMHg3MEQzLCAweDcwRDQsIDB4NzBENSwgMHg3MEQ2LCAweDcwRDcsIDB4NzBEQSwgMHg3MERDLAotICAgIDB4NzBERCwgMHg3MERFLCAweDcwRTAsIDB4NzBFMSwgMHg3MEUyLCAweDcwRTMsIDB4NzBFNSwgMHg3MEVBLAotICAgIDB4NzBFRSwgMHg3MEYwLCAweDcwRjEsIDB4NzBGMiwgMHg3MEYzLCAweDcwRjUsIDB4NzBGNiwgMHg3MEY4LAotICAgIDB4NzBGQSwgMHg3MEZCLCAweDcwRkMsIDB4NzBGRSwgMHg3MEZGLCAweDcxMDAsIDB4NzEwMSwgMHg3MTAyLAotICAgIDB4NzEwMywgMHg3MTA0LCAweDcxMDUsIDB4NzEwNiwgMHg3MTA3LCAweDcxMDgsIDB4NzEwQiwgMHg3MTBDLAotICAgIDB4NzEwRCwgMHg3MTBFLCAweDcxMEYsIDB4NzExMSwgMHg3MTEyLCAweDcxMTQsIDB4NzExNywgMHg3MTFCLAotICAgIDB4NzExQywgMHg3MTFELCAweDcxMUUsIDB4NzExRiwgMHg3MTIwLCAweDcxMjIsIDB4NzEyMywgMHg3MTI0LAotICAgIDB4NzEyNSwgMHg3MTI3LCAweDcxMjgsIDB4NzEyOSwgMHg3MTJBLCAweDcxMkIsIDB4NzEyQywgMHg3MTJELAotICAgIDB4NzEyRSwgMHg3MTMyLCAweDcxMzMsIDB4NzEzNCwgMHg3MTM1LCAweDcxMzcsIDB4NzEzOCwgMHg3MTM5LAotICAgIDB4NzEzQSwgMHg3MTNCLCAweDcxM0MsIDB4NzEzRCwgMHg3MTNFLCAweDcxM0YsIDB4NzE0MCwgMHg3MTQxLAotICAgIDB4NzE0MiwgMHg3MTQzLCAweDcxNDQsIDB4NzE0NiwgMHg3MTQ3LCAweDcxNDgsIDB4NzE0QiwgMHg3MTRELAotICAgIDB4NzE0RiwgMHg3MTUwLCAweDcxNTEsIDB4NzE1MywgMHg3MTU0LCAweDcxNTUsIDB4NzE1NiwgMHg3MTU3LAotICAgIDB4NzE1OCwgMHg3MTU5LCAweDcxNUEsIDB4NzE1QiwgMHg3MTVELCAweDcxNUYsIDB4NzE2MCwgMHg3MTYxLAotICAgIDB4NzE2MywgMHg3MTY1LCAweDcxNkEsIDB4NzE2QiwgMHg3MTZELCAweDcxNkYsIDB4NzE3MCwgMHg3MTcxLAotICAgIDB4NzE3NCwgMHg3MTc1LCAweDcxNzYsIDB4NzE3NywgMHg3MTc5LCAweDcxN0IsIDB4NzE3QywgMHg3MTdFLAotICAgIDB4NzE3RiwgMHg3MTgwLCAweDcxODEsIDB4NzE4MiwgMHg3MTgzLCAweDcxODUsIDB4NzE4NiwgMHg3MTg3LAotICAgIDB4NzE4OCwgMHg3MTg5LCAweDcxOEIsIDB4NzE4QywgMHg3MThELCAweDcxOEUsIDB4NzE5MCwgMHg3MTkxLAotICAgIDB4NzE5MywgMHg3MTk1LCAweDcxOTYsIDB4NzE5QSwgMHg3MTlCLCAweDcxOUMsIDB4NzE5RCwgMHg3MTlFLAotICAgIDB4NzFBMSwgMHg3MUEyLCAweDcxQTMsIDB4NzFBNCwgMHg3MUE1LCAweDcxQTYsIDB4NzFBNywgMHg3MUE5LAotICAgIDB4NzFBQSwgMHg3MUFCLCAweDcxQUQsIDB4NzFBRSwgMHg3MUFGLCAweDcxQjAsIDB4NzFCMiwgMHg3MUI0LAotICAgIDB4NzFCNiwgMHg3MUI3LCAweDcxQjgsIDB4NzFCQSwgMHg3MUJCLCAweDcxQkMsIDB4NzFCRCwgMHg3MUJGLAotICAgIDB4NzFDMCwgMHg3MUMyLCAweDcxQzQsIDB4NzFDNSwgMHg3MUM2LCAweDcxQzcsIDB4NzFDOSwgMHg3MUNBLAotICAgIDB4NzFDQiwgMHg3MUNDLCAweDcxQ0QsIDB4NzFDRiwgMHg3MUQwLCAweDcxRDEsIDB4NzFEMywgMHg3MUQ2LAotICAgIDB4NzFENywgMHg3MUQ4LCAweDcxREEsIDB4NzFEQiwgMHg3MURELCAweDcxREUsIDB4NzFFMSwgMHg3MUUyLAotICAgIDB4NzFFMywgMHg3MUU0LCAweDcxRTgsIDB4NzFFOSwgMHg3MUVBLCAweDcxRUIsIDB4NzFFQywgMHg3MUVGLAotICAgIDB4NzFGMCwgMHg3MUYxLCAweDcxRjIsIDB4NzFGMywgMHg3MUY1LCAweDcxRjYsIDB4NzFGNywgMHg3MUY4LAotICAgIDB4NzFGQSwgMHg3MUZCLCAweDcxRkQsIDB4NzFGRiwgMHg3MjAwLCAweDcyMDEsIDB4NzIwMiwgMHg3MjAzLAotICAgIDB4NzIwNCwgMHg3MjA1LCAweDcyMDcsIDB4NzIwOCwgMHg3MjA5LCAweDcyMEEsIDB4NzIwQiwgMHg3MjBDLAotICAgIDB4NzIwRSwgMHg3MjBGLCAweDcyMTEsIDB4NzIxMiwgMHg3MjEzLCAweDcyMTQsIDB4NzIxNSwgMHg3MjE2LAotICAgIDB4NzIxNywgMHg3MjE4LCAweDcyMTksIDB4NzIxQSwgMHg3MjFDLCAweDcyMUUsIDB4NzIxRiwgMHg3MjIwLAotICAgIDB4NzIyMSwgMHg3MjIyLCAweDcyMjMsIDB4NzIyNCwgMHg3MjI1LCAweDcyMjYsIDB4NzIyNywgMHg3MjI5LAotICAgIDB4NzIyQiwgMHg3MjJELCAweDcyMkUsIDB4NzIyRiwgMHg3MjMzLCAweDcyMzQsIDB4NzIzQywgMHg3MjQwLAotICAgIDB4NzI0MSwgMHg3MjQyLCAweDcyNDMsIDB4NzI0NCwgMHg3MjQ1LCAweDcyNDYsIDB4NzI0OSwgMHg3MjRBLAotICAgIDB4NzI0QiwgMHg3MjRFLCAweDcyNEYsIDB4NzI1MCwgMHg3MjUxLCAweDcyNTMsIDB4NzI1NCwgMHg3MjU1LAotICAgIDB4NzI1NywgMHg3MjVBLCAweDcyNUMsIDB4NzI1RSwgMHg3MjYwLCAweDcyNjMsIDB4NzI2NCwgMHg3MjY1LAotICAgIDB4NzI2OCwgMHg3MjZBLCAweDcyNkIsIDB4NzI2QywgMHg3MjZELCAweDcyNzAsIDB4NzI3MSwgMHg3MjczLAotICAgIDB4NzI3NCwgMHg3Mjc2LCAweDcyNzcsIDB4NzI3OCwgMHg3MjdCLCAweDcyN0MsIDB4NzI4MiwgMHg3MjgzLAotICAgIDB4NzI4NSwgMHg3Mjg2LCAweDcyODcsIDB4NzI4OCwgMHg3Mjg5LCAweDcyOEMsIDB4NzI4RSwgMHg3MjkwLAotICAgIDB4NzI5MSwgMHg3MjkzLCAweDcyOTQsIDB4NzI5NSwgMHg3Mjk3LCAweDcyOTgsIDB4NzI5OSwgMHg3MjlBLAotICAgIDB4NzI5QiwgMHg3MjlDLCAweDcyOUQsIDB4NzI5RSwgMHg3MkEwLCAweDcyQTEsIDB4NzJBMywgMHg3MkE0LAotICAgIDB4NzJBNSwgMHg3MkE2LCAweDcyQTgsIDB4NzJBOSwgMHg3MkFBLCAweDcyQUIsIDB4NzJBRSwgMHg3MkIxLAotICAgIDB4NzJCMiwgMHg3MkIzLCAweDcyQjUsIDB4NzJCQSwgMHg3MkJCLCAweDcyQkMsIDB4NzJCRCwgMHg3MkJFLAotICAgIDB4NzJCRiwgMHg3MkM1LCAweDcyQzYsIDB4NzJDNywgMHg3MkM5LCAweDcyQ0EsIDB4NzJDQiwgMHg3MkNDLAotICAgIDB4NzJDRiwgMHg3MkQxLCAweDcyRDMsIDB4NzJENCwgMHg3MkQ1LCAweDcyRDYsIDB4NzJEOCwgMHg3MkRBLAotICAgIDB4NzJEQiwgMHg3MkRDLCAweDcyREQsIDB4NzJERiwgMHg3MkUyLCAweDcyRTMsIDB4NzJFNCwgMHg3MkU1LAotICAgIDB4NzJFNiwgMHg3MkU3LCAweDcyRUEsIDB4NzJFQiwgMHg3MkY1LCAweDcyRjYsIDB4NzJGRSwgMHg3MkZGLAotICAgIDB4NzMwMCwgMHg3MzAyLCAweDczMDQsIDB4NzMwNSwgMHg3MzA2LCAweDczMDcsIDB4NzMwOCwgMHg3MzA5LAotICAgIDB4NzMwQiwgMHg3MzBDLCAweDczMEQsIDB4NzMwRiwgMHg3MzEwLCAweDczMTEsIDB4NzMxMiwgMHg3MzE0LAotICAgIDB4NzMxOCwgMHg3MzE5LCAweDczMUEsIDB4NzMxRiwgMHg3MzIwLCAweDczMjMsIDB4NzMyNCwgMHg3MzI2LAotICAgIDB4NzMyNywgMHg3MzI4LCAweDczMkQsIDB4NzMyRiwgMHg3MzMwLCAweDczMzIsIDB4NzMzMywgMHg3MzM1LAotICAgIDB4NzMzQSwgMHg3MzNDLCAweDczM0QsIDB4NzM0MCwgMHg3MzQyLCAweDczNDMsIDB4NzM0NiwgMHg3MzQ3LAotICAgIDB4NzM0OCwgMHg3MzQ5LCAweDczNEEsIDB4NzM0QiwgMHg3MzRDLCAweDczNEUsIDB4NzM0RiwgMHg3MzUxLAotICAgIDB4NzM1MywgMHg3MzU0LCAweDczNTUsIDB4NzM1NiwgMHg3MzU4LCAweDczNTksIDB4NzM1QSwgMHg3MzVCLAotICAgIDB4NzM1QywgMHg3MzVELCAweDczNUUsIDB4NzM1RiwgMHg3MzYxLCAweDczNjIsIDB4NzM2MywgMHg3MzY0LAotICAgIDB4NzM2NSwgMHg3MzY2LCAweDczNjcsIDB4NzM2OSwgMHg3MzZFLCAweDczNzEsIDB4NzM3MywgMHg3Mzc0LAotICAgIDB4NzM3NiwgMHg3Mzc5LCAweDczN0QsIDB4NzM3RiwgMHg3MzgxLCAweDczODIsIDB4NzM4MywgMHg3Mzg1LAotICAgIDB4NzM4NiwgMHg3Mzg4LCAweDczOEEsIDB4NzM4QywgMHg3MzhELCAweDczOEYsIDB4NzM5MCwgMHg3MzkyLAotICAgIDB4NzM5MywgMHg3Mzk0LCAweDczOTUsIDB4NzM5NywgMHg3Mzk4LCAweDczOTksIDB4NzM5QSwgMHg3MzlDLAotICAgIDB4NzM5RCwgMHg3MzlFLCAweDczQTAsIDB4NzNBMSwgMHg3M0EzLCAweDczQTQsIDB4NzNBNSwgMHg3M0E2LAotICAgIDB4NzNBNywgMHg3M0E4LCAweDczQUEsIDB4NzNBQywgMHg3M0FELCAweDczQjEsIDB4NzNCNCwgMHg3M0I1LAotICAgIDB4NzNCNiwgMHg3M0I4LCAweDczQjksIDB4NzNCQywgMHg3M0JELCAweDczQkUsIDB4NzNCRiwgMHg3M0MxLAotICAgIDB4NzNDMywgMHg3M0M0LCAweDczQzUsIDB4NzNDNiwgMHg3M0M3LCAweDczQ0IsIDB4NzNDQywgMHg3M0NFLAotICAgIDB4NzNEMiwgMHg3M0QzLCAweDczRDQsIDB4NzNENSwgMHg3M0Q2LCAweDczRDcsIDB4NzNEOCwgMHg3M0RBLAotICAgIDB4NzNEQiwgMHg3M0RDLCAweDczREQsIDB4NzNERiwgMHg3M0UxLCAweDczRTIsIDB4NzNFMywgMHg3M0U0LAotICAgIDB4NzNFNiwgMHg3M0U4LCAweDczRUEsIDB4NzNFQiwgMHg3M0VDLCAweDczRUUsIDB4NzNFRiwgMHg3M0YwLAotICAgIDB4NzNGMSwgMHg3M0YzLCAweDczRjQsIDB4NzNGNSwgMHg3M0Y2LCAweDczRjcsIDB4NzNGOCwgMHg3M0Y5LAotICAgIDB4NzNGQSwgMHg3M0ZCLCAweDczRkMsIDB4NzNGRCwgMHg3M0ZGLCAweDc0MDAsIDB4NzQwMSwgMHg3NDAyLAotICAgIDB4NzQwNCwgMHg3NDA3LCAweDc0MDgsIDB4NzQwQiwgMHg3NDBDLCAweDc0MEQsIDB4NzQwRSwgMHg3NDExLAotICAgIDB4NzQxMiwgMHg3NDEzLCAweDc0MTQsIDB4NzQxNSwgMHg3NDE2LCAweDc0MTcsIDB4NzQxOCwgMHg3NDE5LAotICAgIDB4NzQxQywgMHg3NDFELCAweDc0MUUsIDB4NzQxRiwgMHg3NDIwLCAweDc0MjEsIDB4NzQyMywgMHg3NDI0LAotICAgIDB4NzQyNywgMHg3NDI5LCAweDc0MkIsIDB4NzQyRCwgMHg3NDJGLCAweDc0MzEsIDB4NzQzMiwgMHg3NDM3LAotICAgIDB4NzQzOCwgMHg3NDM5LCAweDc0M0EsIDB4NzQzQiwgMHg3NDNELCAweDc0M0UsIDB4NzQ0MCwgMHg3NDQyLAotICAgIDB4NzQ0MywgMHg3NDQ0LCAweDc0NDUsIDB4NzQ0NiwgMHg3NDQ3LCAweDc0NDgsIDB4NzQ0OSwgMHg3NDRBLAotICAgIDB4NzQ0QywgMHg3NDRELCAweDc0NEUsIDB4NzQ0RiwgMHg3NDUwLCAweDc0NTEsIDB4NzQ1MiwgMHg3NDUzLAotICAgIDB4NzQ1NCwgMHg3NDU2LCAweDc0NTgsIDB4NzQ1RCwgMHg3NDYwLCAweDc0NjEsIDB4NzQ2MiwgMHg3NDY0LAotICAgIDB4NzQ2NSwgMHg3NDY2LCAweDc0NjcsIDB4NzQ2OCwgMHg3NDZCLCAweDc0NkMsIDB4NzQ2RSwgMHg3NDZGLAotICAgIDB4NzQ3MSwgMHg3NDcyLCAweDc0NzMsIDB4NzQ3NCwgMHg3NDc1LCAweDc0NzgsIDB4NzQ3OSwgMHg3NDdBLAotICAgIDB4NzQ3QiwgMHg3NDdDLCAweDc0N0QsIDB4NzQ3RiwgMHg3NDgyLCAweDc0ODQsIDB4NzQ4NSwgMHg3NDg2LAotICAgIDB4NzQ4OCwgMHg3NDhBLCAweDc0OEMsIDB4NzQ4RCwgMHg3NDhGLCAweDc0OTEsIDB4NzQ5MiwgMHg3NDkzLAotICAgIDB4NzQ5NCwgMHg3NDk1LCAweDc0OTYsIDB4NzQ5NywgMHg3NDk4LCAweDc0OTksIDB4NzQ5QSwgMHg3NDlCLAotICAgIDB4NzQ5RCwgMHg3NDlGLCAweDc0QTAsIDB4NzRBMSwgMHg3NEEyLCAweDc0QTQsIDB4NzRBNSwgMHg3NEFBLAotICAgIDB4NzRBQiwgMHg3NEFDLCAweDc0QUQsIDB4NzRBRSwgMHg3NEFGLCAweDc0QjEsIDB4NzRCMiwgMHg3NEIzLAotICAgIDB4NzRCNCwgMHg3NEI1LCAweDc0QjYsIDB4NzRCNywgMHg3NEI4LCAweDc0QjksIDB4NzRCQiwgMHg3NEJDLAotICAgIDB4NzRCRSwgMHg3NEJGLCAweDc0QzAsIDB4NzRDMSwgMHg3NEMyLCAweDc0QzMsIDB4NzRDNCwgMHg3NEM1LAotICAgIDB4NzRDNiwgMHg3NEM3LCAweDc0QzgsIDB4NzRDOSwgMHg3NENCLCAweDc0Q0MsIDB4NzRDRCwgMHg3NENFLAotICAgIDB4NzREMCwgMHg3NEQxLCAweDc0RDMsIDB4NzRENSwgMHg3NEQ2LCAweDc0RDcsIDB4NzREOCwgMHg3NEQ5LAotICAgIDB4NzREQiwgMHg3NERELCAweDc0REYsIDB4NzRFMSwgMHg3NEU1LCAweDc0RTcsIDB4NzRFOCwgMHg3NEU5LAotICAgIDB4NzRFQSwgMHg3NEVCLCAweDc0RUMsIDB4NzRFRCwgMHg3NEYwLCAweDc0RjEsIDB4NzRGMiwgMHg3NEYzLAotICAgIDB4NzRGNSwgMHg3NEY4LCAweDc0RjksIDB4NzRGQSwgMHg3NEZCLCAweDc0RkMsIDB4NzRGRCwgMHg3NEZFLAotICAgIDB4NzUwMCwgMHg3NTAxLCAweDc1MDIsIDB4NzUwMywgMHg3NTA1LCAweDc1MDYsIDB4NzUwNywgMHg3NTA4LAotICAgIDB4NzUwOSwgMHg3NTBBLCAweDc1MEIsIDB4NzUwRSwgMHg3NTEwLCAweDc1MTIsIDB4NzUxNCwgMHg3NTE1LAotICAgIDB4NzUxNiwgMHg3NTE3LCAweDc1MUIsIDB4NzUxRCwgMHg3NTFFLCAweDc1MjAsIDB4NzUyMSwgMHg3NTIyLAotICAgIDB4NzUyNCwgMHg3NTI2LCAweDc1MjcsIDB4NzUyQSwgMHg3NTJFLCAweDc1MzQsIDB4NzUzNiwgMHg3NTM5LAotICAgIDB4NzUzQywgMHg3NTNELCAweDc1M0YsIDB4NzU0MSwgMHg3NTQyLCAweDc1NDMsIDB4NzU0NCwgMHg3NTQ2LAotICAgIDB4NzU0NywgMHg3NTQ5LCAweDc1NEEsIDB4NzU0RCwgMHg3NTUwLCAweDc1NTEsIDB4NzU1MiwgMHg3NTUzLAotICAgIDB4NzU1NSwgMHg3NTU2LCAweDc1NTcsIDB4NzU1OCwgMHg3NTVFLCAweDc1NUYsIDB4NzU2MCwgMHg3NTYxLAotICAgIDB4NzU2MywgMHg3NTY0LCAweDc1NjcsIDB4NzU2OCwgMHg3NTY5LCAweDc1NkMsIDB4NzU2RCwgMHg3NTZFLAotICAgIDB4NzU2RiwgMHg3NTcwLCAweDc1NzEsIDB4NzU3MywgMHg3NTc1LCAweDc1NzcsIDB4NzU3QSwgMHg3NTdCLAotICAgIDB4NzU3QywgMHg3NTdELCAweDc1N0UsIDB4NzU4MCwgMHg3NTgxLCAweDc1ODIsIDB4NzU4NCwgMHg3NTg1LAotICAgIDB4NzU4OCwgMHg3NTg5LCAweDc1OEEsIDB4NzU4QywgMHg3NThELCAweDc1OEUsIDB4NzU5MCwgMHg3NTkzLAotICAgIDB4NzU5NSwgMHg3NTk4LCAweDc1OUIsIDB4NzU5QywgMHg3NTlFLCAweDc1QTIsIDB4NzVBNiwgMHg3NUE3LAotICAgIDB4NzVBOCwgMHg3NUE5LCAweDc1QUEsIDB4NzVBRCwgMHg3NUI2LCAweDc1QjcsIDB4NzVCQSwgMHg3NUJCLAotICAgIDB4NzVCRiwgMHg3NUMwLCAweDc1QzEsIDB4NzVDNiwgMHg3NUNCLCAweDc1Q0MsIDB4NzVDRSwgMHg3NUNGLAotICAgIDB4NzVEMCwgMHg3NUQxLCAweDc1RDMsIDB4NzVENywgMHg3NURBLCAweDc1REMsIDB4NzVERCwgMHg3NURGLAotICAgIDB4NzVFMCwgMHg3NUUxLCAweDc1RTUsIDB4NzVFOSwgMHg3NUVDLCAweDc1RUQsIDB4NzVFRSwgMHg3NUVGLAotICAgIDB4NzVGMiwgMHg3NUYzLCAweDc1RjUsIDB4NzVGNiwgMHg3NUY3LCAweDc1RjgsIDB4NzVGQSwgMHg3NUZCLAotICAgIDB4NzVGRCwgMHg3NUZFLCAweDc2MDQsIDB4NzYwNiwgMHg3NjA3LCAweDc2MDgsIDB4NzYwOSwgMHg3NjBFLAotICAgIDB4NzYwRiwgMHg3NjExLCAweDc2MTIsIDB4NzYxMywgMHg3NjE0LCAweDc2MTYsIDB4NzYxQSwgMHg3NjFDLAotICAgIDB4NzYxRCwgMHg3NjIzLCAweDc2MjgsIDB4NzYyQywgMHg3NjJFLCAweDc2MkYsIDB4NzYzMSwgMHg3NjMyLAotICAgIDB4NzYzNiwgMHg3NjM3LCAweDc2MzksIDB4NzYzQSwgMHg3NjNELCAweDc2NDEsIDB4NzY0NCwgMHg3NjQ1LAotICAgIDB4NzY0OCwgMHg3NjRBLCAweDc2NEIsIDB4NzY0RSwgMHg3NjRGLCAweDc2NTAsIDB4NzY1MSwgMHg3NjUyLAotICAgIDB4NzY1MywgMHg3NjU1LCAweDc2NTcsIDB4NzY1OSwgMHg3NjVBLCAweDc2NUIsIDB4NzY1RCwgMHg3NjYwLAotICAgIDB4NzY2MSwgMHg3NjY2LCAweDc2NjgsIDB4NzY2QSwgMHg3NjczLCAweDc2NzQsIDB4NzY3NSwgMHg3Njc2LAotICAgIDB4NzY3NywgMHg3Njc5LCAweDc2N0EsIDB4NzY3RiwgMHg3NjgwLCAweDc2ODEsIDB4NzY4MywgMHg3Njg1LAotICAgIDB4NzY4OSwgMHg3NjhBLCAweDc2OEMsIDB4NzY4RCwgMHg3NjhGLCAweDc2OTAsIDB4NzY5MiwgMHg3Njk0LAotICAgIDB4NzY5NSwgMHg3Njk3LCAweDc2OTgsIDB4NzY5QiwgMHg3NjlDLCAweDc2OUQsIDB4NzY5RSwgMHg3NjlGLAotICAgIDB4NzZBMCwgMHg3NkExLCAweDc2QTIsIDB4NzZBMywgMHg3NkE1LCAweDc2QTYsIDB4NzZBNywgMHg3NkE4LAotICAgIDB4NzZBOSwgMHg3NkFBLCAweDc2QUIsIDB4NzZBQywgMHg3NkFELCAweDc2QUYsIDB4NzZCMCwgMHg3NkIzLAotICAgIDB4NzZCNSwgMHg3NkI2LCAweDc2QjcsIDB4NzZCOSwgMHg3NkJCLCAweDc2QkMsIDB4NzZCRCwgMHg3NkJFLAotICAgIDB4NzZDMCwgMHg3NkMxLCAweDc2QzMsIDB4NzZDNCwgMHg3NkM3LCAweDc2QzksIDB4NzZDQiwgMHg3NkNDLAotICAgIDB4NzZEMywgMHg3NkQ1LCAweDc2RDksIDB4NzZEQSwgMHg3NkRDLCAweDc2REQsIDB4NzZFMCwgMHg3NkUyLAotICAgIDB4NzZFNiwgMHg3NkU4LCAweDc2RTksIDB4NzZFQSwgMHg3NkVCLCAweDc2RUMsIDB4NzZFRCwgMHg3NkYwLAotICAgIDB4NzZGMywgMHg3NkY1LCAweDc2RjYsIDB4NzZGNywgMHg3NkZBLCAweDc2RkIsIDB4NzZGRCwgMHg3NkZGLAotICAgIDB4NzcwMCwgMHg3NzAyLCAweDc3MDMsIDB4NzcwNSwgMHg3NzA2LCAweDc3MEEsIDB4NzcwQywgMHg3NzBFLAotICAgIDB4NzcwRiwgMHg3NzEwLCAweDc3MTEsIDB4NzcxMiwgMHg3NzEzLCAweDc3MTQsIDB4NzcxNSwgMHg3NzE2LAotICAgIDB4NzcxNywgMHg3NzE4LCAweDc3MUIsIDB4NzcxQywgMHg3NzFELCAweDc3MUUsIDB4NzcyMSwgMHg3NzIzLAotICAgIDB4NzcyNCwgMHg3NzI1LCAweDc3MjcsIDB4NzcyQSwgMHg3NzJCLCAweDc3MkMsIDB4NzcyRSwgMHg3NzMwLAotICAgIDB4NzczMSwgMHg3NzMyLCAweDc3MzMsIDB4NzczNCwgMHg3NzM5LCAweDc3M0IsIDB4NzczRCwgMHg3NzNFLAotICAgIDB4NzczRiwgMHg3NzQyLCAweDc3NDQsIDB4Nzc0NSwgMHg3NzQ2LCAweDc3NDgsIDB4Nzc0OSwgMHg3NzRBLAotICAgIDB4Nzc0QiwgMHg3NzRDLCAweDc3NEQsIDB4Nzc0RSwgMHg3NzUyLCAweDc3NTMsIDB4Nzc1NCwgMHg3NzU1LAotICAgIDB4Nzc1NiwgMHg3NzU3LCAweDc3NTgsIDB4Nzc1OSwgMHg3NzVDLCAweDc3NUQsIDB4Nzc1RiwgMHg3NzYwLAotICAgIDB4Nzc2NCwgMHg3NzY3LCAweDc3NjksIDB4Nzc2QSwgMHg3NzZELCAweDc3NkUsIDB4Nzc2RiwgMHg3NzcwLAotICAgIDB4Nzc3MSwgMHg3NzcyLCAweDc3NzMsIDB4Nzc3NCwgMHg3Nzc1LCAweDc3NzYsIDB4Nzc3NywgMHg3Nzc4LAotICAgIDB4Nzc3QSwgMHg3NzdCLCAweDc3N0MsIDB4Nzc4MSwgMHg3NzgyLCAweDc3ODMsIDB4Nzc4NiwgMHg3Nzg3LAotICAgIDB4Nzc4OCwgMHg3Nzg5LCAweDc3OEEsIDB4Nzc4QiwgMHg3NzhGLCAweDc3OTAsIDB4Nzc5MywgMHg3Nzk0LAotICAgIDB4Nzc5NSwgMHg3Nzk2LCAweDc3OTcsIDB4Nzc5OSwgMHg3NzlBLCAweDc3OUIsIDB4Nzc5QywgMHg3NzlELAotICAgIDB4NzdBMSwgMHg3N0EzLCAweDc3QTQsIDB4NzdBNiwgMHg3N0E4LCAweDc3QUIsIDB4NzdBRSwgMHg3N0FGLAotICAgIDB4NzdCMSwgMHg3N0IyLCAweDc3QjQsIDB4NzdCNiwgMHg3N0I3LCAweDc3QjgsIDB4NzdCOSwgMHg3N0JBLAotICAgIDB4NzdCRSwgMHg3N0MwLCAweDc3QzEsIDB4NzdDMiwgMHg3N0MzLCAweDc3QzQsIDB4NzdDNSwgMHg3N0M2LAotICAgIDB4NzdDOCwgMHg3N0M5LCAweDc3Q0EsIDB4NzdDQiwgMHg3N0NDLCAweDc3Q0UsIDB4NzdDRiwgMHg3N0QwLAotICAgIDB4NzdEMSwgMHg3N0QyLCAweDc3RDMsIDB4NzdENCwgMHg3N0Q1LCAweDc3RDYsIDB4NzdEOCwgMHg3N0Q5LAotICAgIDB4NzdERCwgMHg3N0RFLCAweDc3REYsIDB4NzdFMCwgMHg3N0UxLCAweDc3RTQsIDB4NzdFNiwgMHg3N0U4LAotICAgIDB4NzdFQSwgMHg3N0YwLCAweDc3RjEsIDB4NzdGMiwgMHg3N0Y0LCAweDc3RjUsIDB4NzdGNywgMHg3N0Y5LAotICAgIDB4NzdGQSwgMHg3N0ZCLCAweDc3RkMsIDB4NzgwMywgMHg3ODA0LCAweDc4MDUsIDB4NzgwNiwgMHg3ODA3LAotICAgIDB4NzgwOCwgMHg3ODBBLCAweDc4MEIsIDB4NzgwRSwgMHg3ODBGLCAweDc4MTAsIDB4NzgxMywgMHg3ODE1LAotICAgIDB4NzgxOSwgMHg3ODFCLCAweDc4MUUsIDB4NzgyMCwgMHg3ODIxLCAweDc4MjIsIDB4NzgyNCwgMHg3ODI4LAotICAgIDB4NzgyQSwgMHg3ODJCLCAweDc4MkUsIDB4NzgyRiwgMHg3ODMxLCAweDc4MzIsIDB4NzgzMywgMHg3ODM1LAotICAgIDB4NzgzNiwgMHg3ODNELCAweDc4M0YsIDB4Nzg0MSwgMHg3ODQyLCAweDc4NDQsIDB4Nzg0NiwgMHg3ODQ4LAotICAgIDB4Nzg0OSwgMHg3ODRBLCAweDc4NEIsIDB4Nzg0RCwgMHg3ODRGLCAweDc4NTEsIDB4Nzg1MywgMHg3ODU0LAotICAgIDB4Nzg1OCwgMHg3ODU5LCAweDc4NUEsIDB4Nzg1QiwgMHg3ODVDLCAweDc4NUUsIDB4Nzg1RiwgMHg3ODYwLAotICAgIDB4Nzg2MSwgMHg3ODYyLCAweDc4NjMsIDB4Nzg2NSwgMHg3ODY2LCAweDc4NjcsIDB4Nzg2OSwgMHg3ODcwLAotICAgIDB4Nzg3MSwgMHg3ODcyLCAweDc4NzMsIDB4Nzg3NCwgMHg3ODc1LCAweDc4NzYsIDB4Nzg3OCwgMHg3ODc5LAotICAgIDB4Nzg3QSwgMHg3ODdCLCAweDc4N0QsIDB4Nzg3RSwgMHg3ODdGLCAweDc4ODAsIDB4Nzg4MSwgMHg3ODgyLAotICAgIDB4Nzg4MywgMHg3ODg0LCAweDc4ODUsIDB4Nzg4NiwgMHg3ODg4LCAweDc4OEEsIDB4Nzg4QiwgMHg3ODhGLAotICAgIDB4Nzg5MCwgMHg3ODkyLCAweDc4OTQsIDB4Nzg5NSwgMHg3ODk2LCAweDc4OTksIDB4Nzg5RCwgMHg3ODlFLAotICAgIDB4NzhBMCwgMHg3OEEyLCAweDc4QTQsIDB4NzhBNiwgMHg3OEE4LCAweDc4QUEsIDB4NzhBQiwgMHg3OEFDLAotICAgIDB4NzhBRSwgMHg3OEFGLCAweDc4QjUsIDB4NzhCNiwgMHg3OEI3LCAweDc4QkIsIDB4NzhCRCwgMHg3OEJGLAotICAgIDB4NzhDMCwgMHg3OEMyLCAweDc4QzMsIDB4NzhDNCwgMHg3OEM2LCAweDc4QzcsIDB4NzhDOCwgMHg3OENDLAotICAgIDB4NzhDRCwgMHg3OENFLCAweDc4Q0YsIDB4NzhEMSwgMHg3OEQyLCAweDc4RDMsIDB4NzhENiwgMHg3OEQ3LAotICAgIDB4NzhEOCwgMHg3OERCLCAweDc4REMsIDB4NzhERCwgMHg3OERFLCAweDc4REYsIDB4NzhFMCwgMHg3OEUxLAotICAgIDB4NzhFMiwgMHg3OEU0LCAweDc4RTUsIDB4NzhFNiwgMHg3OEU5LCAweDc4RUEsIDB4NzhFQiwgMHg3OEVELAotICAgIDB4NzhFRSwgMHg3OEYwLCAweDc4RjEsIDB4NzhGMywgMHg3OEY1LCAweDc4RjYsIDB4NzhGOCwgMHg3OEY5LAotICAgIDB4NzhGQiwgMHg3OEZDLCAweDc4RkUsIDB4NzhGRiwgMHg3OTAwLCAweDc5MDIsIDB4NzkwMywgMHg3OTA0LAotICAgIDB4NzkwNiwgMHg3OTA3LCAweDc5MDgsIDB4NzkwOSwgMHg3OTBBLCAweDc5MEIsIDB4NzkwQywgMHg3OTBELAotICAgIDB4NzkwRiwgMHg3OTEwLCAweDc5MTEsIDB4NzkxMiwgMHg3OTE0LCAweDc5MTUsIDB4NzkxNiwgMHg3OTE3LAotICAgIDB4NzkxOCwgMHg3OTFBLCAweDc5MUIsIDB4NzkxQywgMHg3OTFELCAweDc5MUYsIDB4NzkyMCwgMHg3OTIxLAotICAgIDB4NzkyMiwgMHg3OTIzLCAweDc5MjUsIDB4NzkyNywgMHg3OTI4LCAweDc5MjksIDB4NzkyRCwgMHg3OTJFLAotICAgIDB4NzkyRiwgMHg3OTMwLCAweDc5MzIsIDB4NzkzMywgMHg3OTM1LCAweDc5MzYsIDB4NzkzNywgMHg3OTM4LAotICAgIDB4NzkzOSwgMHg3OTNELCAweDc5M0YsIDB4Nzk0MiwgMHg3OTQzLCAweDc5NDQsIDB4Nzk0NSwgMHg3OTQ3LAotICAgIDB4Nzk0QSwgMHg3OTRCLCAweDc5NEMsIDB4Nzk0RCwgMHg3OTRFLCAweDc5NEYsIDB4Nzk1MCwgMHg3OTUxLAotICAgIDB4Nzk1MiwgMHg3OTU0LCAweDc5NTUsIDB4Nzk1OCwgMHg3OTU5LCAweDc5NjEsIDB4Nzk2MywgMHg3OTY0LAotICAgIDB4Nzk2NiwgMHg3OTY5LCAweDc5NkEsIDB4Nzk2QiwgMHg3OTZDLCAweDc5NkUsIDB4Nzk3MCwgMHg3OTcxLAotICAgIDB4Nzk3MiwgMHg3OTczLCAweDc5NzQsIDB4Nzk3NSwgMHg3OTc2LCAweDc5NzksIDB4Nzk3QiwgMHg3OTdDLAotICAgIDB4Nzk3RCwgMHg3OTdFLCAweDc5N0YsIDB4Nzk4MiwgMHg3OTgzLCAweDc5ODYsIDB4Nzk4NywgMHg3OTg4LAotICAgIDB4Nzk4OSwgMHg3OThCLCAweDc5OEMsIDB4Nzk5MCwgMHg3OTkxLCAweDc5OTIsIDB4Nzk5MywgMHg3OTk0LAotICAgIDB4Nzk5NSwgMHg3OTk2LCAweDc5OTcsIDB4Nzk5OCwgMHg3OTk5LCAweDc5OUIsIDB4Nzk5QywgMHg3OTlELAotICAgIDB4Nzk5RSwgMHg3OTlGLCAweDc5QTAsIDB4NzlBMSwgMHg3OUEyLCAweDc5QTMsIDB4NzlBNCwgMHg3OUE1LAotICAgIDB4NzlBOCwgMHg3OUE5LCAweDc5QUIsIDB4NzlBQywgMHg3OUFELCAweDc5QUYsIDB4NzlCMiwgMHg3OUI0LAotICAgIDB4NzlCNSwgMHg3OUI2LCAweDc5QjcsIDB4NzlCOCwgMHg3OUJDLCAweDc5QkYsIDB4NzlDMiwgMHg3OUM0LAotICAgIDB4NzlDNSwgMHg3OUM3LCAweDc5QzgsIDB4NzlDQSwgMHg3OUNDLCAweDc5Q0UsIDB4NzlDRiwgMHg3OUQwLAotICAgIDB4NzlEMywgMHg3OUQ0LCAweDc5RDYsIDB4NzlENywgMHg3OUQ5LCAweDc5REEsIDB4NzlEQiwgMHg3OURDLAotICAgIDB4NzlERCwgMHg3OURFLCAweDc5RTAsIDB4NzlFMSwgMHg3OUUyLCAweDc5RTUsIDB4NzlFOCwgMHg3OUVBLAotICAgIDB4NzlFQywgMHg3OUVFLCAweDc5RjEsIDB4NzlGMiwgMHg3OUYzLCAweDc5RjQsIDB4NzlGNSwgMHg3OUY2LAotICAgIDB4NzlGNywgMHg3OUY5LCAweDc5RkEsIDB4NzlGQywgMHg3OUZFLCAweDc5RkYsIDB4N0EwMSwgMHg3QTA0LAotICAgIDB4N0EwNSwgMHg3QTA3LCAweDdBMDgsIDB4N0EwOSwgMHg3QTBBLCAweDdBMEMsIDB4N0EwRiwgMHg3QTEwLAotICAgIDB4N0ExMSwgMHg3QTEyLCAweDdBMTMsIDB4N0ExNSwgMHg3QTE2LCAweDdBMTgsIDB4N0ExOSwgMHg3QTFCLAotICAgIDB4N0ExQywgMHg3QTFELCAweDdBMUYsIDB4N0EyMSwgMHg3QTIyLCAweDdBMjQsIDB4N0EyNSwgMHg3QTI2LAotICAgIDB4N0EyNywgMHg3QTI4LCAweDdBMjksIDB4N0EyQSwgMHg3QTJCLCAweDdBMkMsIDB4N0EyRCwgMHg3QTJGLAotICAgIDB4N0EzMCwgMHg3QTMyLCAweDdBMzQsIDB4N0EzNSwgMHg3QTM2LCAweDdBMzgsIDB4N0EzQSwgMHg3QTNFLAotICAgIDB4N0E0MSwgMHg3QTQyLCAweDdBNDMsIDB4N0E0NCwgMHg3QTQ1LCAweDdBNDcsIDB4N0E0OCwgMHg3QTQ5LAotICAgIDB4N0E0QSwgMHg3QTRCLCAweDdBNEYsIDB4N0E1MCwgMHg3QTUyLCAweDdBNTMsIDB4N0E1NCwgMHg3QTU1LAotICAgIDB4N0E1NiwgMHg3QTU4LCAweDdBNTksIDB4N0E1QSwgMHg3QTVCLCAweDdBNUMsIDB4N0E1RCwgMHg3QTVFLAotICAgIDB4N0E1RiwgMHg3QTYwLCAweDdBNjMsIDB4N0E2NCwgMHg3QTY1LCAweDdBNjYsIDB4N0E2NywgMHg3QTY4LAotICAgIDB4N0E2QSwgMHg3QTZDLCAweDdBNkQsIDB4N0E2RSwgMHg3QTZGLCAweDdBNzEsIDB4N0E3MiwgMHg3QTczLAotICAgIDB4N0E3NSwgMHg3QTdCLCAweDdBN0MsIDB4N0E3RCwgMHg3QTdFLCAweDdBODIsIDB4N0E4NSwgMHg3QTg3LAotICAgIDB4N0E4OSwgMHg3QThBLCAweDdBOEIsIDB4N0E4QywgMHg3QThFLCAweDdBOEYsIDB4N0E5MCwgMHg3QTkzLAotICAgIDB4N0E5NCwgMHg3QTk5LCAweDdBOUEsIDB4N0E5QiwgMHg3QTlFLCAweDdBQTEsIDB4N0FBMiwgMHg3QUEzLAotICAgIDB4N0FBNCwgMHg3QUE3LCAweDdBQUIsIDB4N0FBRiwgMHg3QUIwLCAweDdBQjEsIDB4N0FCMiwgMHg3QUI0LAotICAgIDB4N0FCNSwgMHg3QUI3LCAweDdBQjgsIDB4N0FCOSwgMHg3QUJCLCAweDdBQkMsIDB4N0FCRCwgMHg3QUJFLAotICAgIDB4N0FDMCwgMHg3QUMxLCAweDdBQzIsIDB4N0FDMywgMHg3QUM2LCAweDdBQzksIDB4N0FDQywgMHg3QUNELAotICAgIDB4N0FDRSwgMHg3QUNGLCAweDdBRDAsIDB4N0FEMSwgMHg3QUQyLCAweDdBRDMsIDB4N0FENCwgMHg3QUQ1LAotICAgIDB4N0FENywgMHg3QUQ4LCAweDdBREEsIDB4N0FEQiwgMHg3QURDLCAweDdBREQsIDB4N0FFMSwgMHg3QUUyLAotICAgIDB4N0FFNCwgMHg3QUU3LCAweDdBRTgsIDB4N0FFOSwgMHg3QUVCLCAweDdBRUMsIDB4N0FFRSwgMHg3QUYwLAotICAgIDB4N0FGMSwgMHg3QUYyLCAweDdBRjMsIDB4N0FGNCwgMHg3QUY1LCAweDdBRjcsIDB4N0FGOCwgMHg3QUZCLAotICAgIDB4N0FGQywgMHg3QUZFLCAweDdCMDAsIDB4N0IwMSwgMHg3QjAyLCAweDdCMDUsIDB4N0IwNywgMHg3QjA5LAotICAgIDB4N0IwQywgMHg3QjBELCAweDdCMEUsIDB4N0IxMCwgMHg3QjEyLCAweDdCMTMsIDB4N0IxNiwgMHg3QjE3LAotICAgIDB4N0IxOCwgMHg3QjFBLCAweDdCMUMsIDB4N0IxRCwgMHg3QjFGLCAweDdCMjEsIDB4N0IyMiwgMHg3QjIzLAotICAgIDB4N0IyNywgMHg3QjI5LCAweDdCMkQsIDB4N0IyRiwgMHg3QjMwLCAweDdCMzIsIDB4N0IzNCwgMHg3QjM1LAotICAgIDB4N0IzNiwgMHg3QjM3LCAweDdCMzksIDB4N0IzQiwgMHg3QjNELCAweDdCM0YsIDB4N0I0MCwgMHg3QjQxLAotICAgIDB4N0I0MiwgMHg3QjQzLCAweDdCNDQsIDB4N0I0OCwgMHg3QjRBLCAweDdCNEQsIDB4N0I0RSwgMHg3QjUzLAotICAgIDB4N0I1NSwgMHg3QjU3LCAweDdCNTksIDB4N0I1QywgMHg3QjVFLCAweDdCNUYsIDB4N0I2MSwgMHg3QjYzLAotICAgIDB4N0I2NCwgMHg3QjY1LCAweDdCNjYsIDB4N0I2OCwgMHg3QjY5LCAweDdCNkEsIDB4N0I2QiwgMHg3QjZDLAotICAgIDB4N0I2RCwgMHg3QjZGLCAweDdCNzAsIDB4N0I3MywgMHg3Qjc0LCAweDdCNzYsIDB4N0I3OCwgMHg3QjdBLAotICAgIDB4N0I3QywgMHg3QjdELCAweDdCN0YsIDB4N0I4MSwgMHg3QjgyLCAweDdCODMsIDB4N0I4NCwgMHg3Qjg2LAotICAgIDB4N0I4NywgMHg3Qjg4LCAweDdCODksIDB4N0I4QSwgMHg3QjhDLCAweDdCOEUsIDB4N0I4RiwgMHg3QjkxLAotICAgIDB4N0I5MiwgMHg3QjkzLCAweDdCOTYsIDB4N0I5OCwgMHg3Qjk5LCAweDdCOUEsIDB4N0I5QiwgMHg3QjlFLAotICAgIDB4N0I5RiwgMHg3QkEwLCAweDdCQTMsIDB4N0JBNCwgMHg3QkE1LCAweDdCQUUsIDB4N0JBRiwgMHg3QkIwLAotICAgIDB4N0JCMiwgMHg3QkIzLCAweDdCQjUsIDB4N0JCNiwgMHg3QkI3LCAweDdCQjksIDB4N0JCQSwgMHg3QkJCLAotICAgIDB4N0JCQywgMHg3QkJELCAweDdCQkUsIDB4N0JCRiwgMHg3QkMyLCAweDdCQzMsIDB4N0JDNSwgMHg3QkM4LAotICAgIDB4N0JDQSwgMHg3QkNELCAweDdCQ0UsIDB4N0JDRiwgMHg3QkQwLCAweDdCRDIsIDB4N0JENCwgMHg3QkQ1LAotICAgIDB4N0JENiwgMHg3QkQ3LCAweDdCRDgsIDB4N0JEQiwgMHg3QkRDLCAweDdCREUsIDB4N0JERiwgMHg3QkUwLAotICAgIDB4N0JFMiwgMHg3QkUzLCAweDdCRTcsIDB4N0JFOCwgMHg3QkVCLCAweDdCRUMsIDB4N0JFRCwgMHg3QkVGLAotICAgIDB4N0JGMCwgMHg3QkYyLCAweDdCRjQsIDB4N0JGNSwgMHg3QkY2LCAweDdCRjgsIDB4N0JGOSwgMHg3QkZBLAotICAgIDB4N0JGQiwgMHg3QkZELCAweDdCRkYsIDB4N0MwMSwgMHg3QzAyLCAweDdDMDMsIDB4N0MwNCwgMHg3QzA1LAotICAgIDB4N0MwNiwgMHg3QzA4LCAweDdDMDksIDB4N0MwQSwgMHg3QzBFLCAweDdDMTAsIDB4N0MxMSwgMHg3QzEyLAotICAgIDB4N0MxMywgMHg3QzE0LCAweDdDMTUsIDB4N0MxNywgMHg3QzE4LCAweDdDMTksIDB4N0MxQSwgMHg3QzFCLAotICAgIDB4N0MxQywgMHg3QzFELCAweDdDMjAsIDB4N0MyMiwgMHg3QzI0LCAweDdDMjUsIDB4N0MyOCwgMHg3QzI5LAotICAgIDB4N0MyQywgMHg3QzJELCAweDdDMkUsIDB4N0MyRiwgMHg3QzMwLCAweDdDMzEsIDB4N0MzMiwgMHg3QzMzLAotICAgIDB4N0MzNCwgMHg3QzM1LCAweDdDMzYsIDB4N0MzNywgMHg3QzM5LCAweDdDM0EsIDB4N0MzQiwgMHg3QzNDLAotICAgIDB4N0M0MiwgMHg3QzQ0LCAweDdDNDUsIDB4N0M0NiwgMHg3QzQ3LCAweDdDNDgsIDB4N0M0OSwgMHg3QzRBLAotICAgIDB4N0M0QiwgMHg3QzRFLCAweDdDNEYsIDB4N0M1MCwgMHg3QzUxLCAweDdDNTIsIDB4N0M1MywgMHg3QzU0LAotICAgIDB4N0M1NSwgMHg3QzU2LCAweDdDNTcsIDB4N0M1OCwgMHg3QzU5LCAweDdDNUEsIDB4N0M1QiwgMHg3QzVELAotICAgIDB4N0M1RSwgMHg3QzYxLCAweDdDNjIsIDB4N0M2MywgMHg3QzY1LCAweDdDNjYsIDB4N0M2NywgMHg3QzY4LAotICAgIDB4N0M2QiwgMHg3QzZELCAweDdDNkYsIDB4N0M3MCwgMHg3QzcxLCAweDdDNzUsIDB4N0M3NiwgMHg3Qzc3LAotICAgIDB4N0M3OCwgMHg3Qzc5LCAweDdDN0EsIDB4N0M3RSwgMHg3QzdGLCAweDdDODAsIDB4N0M4MSwgMHg3QzgyLAotICAgIDB4N0M4MywgMHg3Qzg0LCAweDdDODUsIDB4N0M4NiwgMHg3Qzg3LCAweDdDODgsIDB4N0M4QSwgMHg3QzhCLAotICAgIDB4N0M4QywgMHg3QzhELCAweDdDOEUsIDB4N0M4RiwgMHg3QzkwLCAweDdDOTMsIDB4N0M5NCwgMHg3Qzk2LAotICAgIDB4N0M5OSwgMHg3QzlBLCAweDdDOUIsIDB4N0NBMCwgMHg3Q0ExLCAweDdDQTMsIDB4N0NBNiwgMHg3Q0E3LAotICAgIDB4N0NBOCwgMHg3Q0E5LCAweDdDQUIsIDB4N0NBQywgMHg3Q0FELCAweDdDQUYsIDB4N0NCMCwgMHg3Q0I0LAotICAgIDB4N0NCNSwgMHg3Q0I2LCAweDdDQjcsIDB4N0NCOCwgMHg3Q0JBLCAweDdDQkIsIDB4N0NCRiwgMHg3Q0MwLAotICAgIDB4N0NDMiwgMHg3Q0MzLCAweDdDQzQsIDB4N0NDNiwgMHg3Q0M5LCAweDdDQ0IsIDB4N0NDRSwgMHg3Q0NGLAotICAgIDB4N0NEMCwgMHg3Q0QxLCAweDdDRDIsIDB4N0NEMywgMHg3Q0Q0LCAweDdDRDgsIDB4N0NEQSwgMHg3Q0RCLAotICAgIDB4N0NFMSwgMHg3Q0UyLCAweDdDRTMsIDB4N0NFNCwgMHg3Q0U1LCAweDdDRTYsIDB4N0NFOSwgMHg3Q0VBLAotICAgIDB4N0NFQiwgMHg3Q0VDLCAweDdDRUQsIDB4N0NFRSwgMHg3Q0YxLCAweDdDRjMsIDB4N0NGNSwgMHg3Q0Y3LAotICAgIDB4N0NGQSwgMHg3Q0ZDLCAweDdDRkQsIDB4N0NGRiwgMHg3RDAxLCAweDdEMDMsIDB4N0QwQywgMHg3RDBFLAotICAgIDB4N0QwRiwgMHg3RDExLCAweDdEMTIsIDB4N0QxNiwgMHg3RDE4LCAweDdEMUQsIDB4N0QxRSwgMHg3RDFGLAotICAgIDB4N0QyMywgMHg3RDI0LCAweDdEMjUsIDB4N0QyNiwgMHg3RDI4LCAweDdEMjksIDB4N0QyQSwgMHg3RDJDLAotICAgIDB4N0QyRCwgMHg3RDJFLCAweDdEMzQsIDB4N0QzNSwgMHg3RDM2LCAweDdEMzcsIDB4N0QzOCwgMHg3RDNCLAotICAgIDB4N0QzRCwgMHg3RDNFLCAweDdENDEsIDB4N0Q0MywgMHg3RDQ1LCAweDdENDcsIDB4N0Q0OCwgMHg3RDQ5LAotICAgIDB4N0Q0QSwgMHg3RDRCLCAweDdENEMsIDB4N0Q0RCwgMHg3RDRGLCAweDdENTEsIDB4N0Q1MiwgMHg3RDUzLAotICAgIDB4N0Q1NCwgMHg3RDU1LCAweDdENTYsIDB4N0Q1NywgMHg3RDU4LCAweDdENTksIDB4N0Q1QSwgMHg3RDVCLAotICAgIDB4N0Q1QywgMHg3RDVGLCAweDdENjAsIDB4N0Q2MywgMHg3RDY0LCAweDdENjUsIDB4N0Q2NywgMHg3RDY5LAotICAgIDB4N0Q2QSwgMHg3RDZCLCAweDdENkMsIDB4N0Q2RCwgMHg3RDZGLCAweDdENzAsIDB4N0Q3NCwgMHg3RDc1LAotICAgIDB4N0Q3OCwgMHg3RDdBLCAweDdEN0IsIDB4N0Q3QywgMHg3RDdELCAweDdEN0UsIDB4N0Q3RiwgMHg3RDgwLAotICAgIDB4N0Q4MiwgMHg3RDg0LCAweDdEODUsIDB4N0Q4NywgMHg3RDhBLCAweDdEOEIsIDB4N0Q4QywgMHg3RDhELAotICAgIDB4N0Q4RSwgMHg3RDkwLCAweDdEOTEsIDB4N0Q5MiwgMHg3RDk0LCAweDdEOTUsIDB4N0Q5NiwgMHg3RDk3LAotICAgIDB4N0Q5OCwgMHg3RDk5LCAweDdEOUEsIDB4N0Q5QiwgMHg3RDlELCAweDdEOUYsIDB4N0RBMCwgMHg3REExLAotICAgIDB4N0RBNCwgMHg3REE1LCAweDdEQTcsIDB4N0RBOCwgMHg3REE5LCAweDdEQUEsIDB4N0RBRiwgMHg3REI1LAotICAgIDB4N0RCNiwgMHg3REI3LCAweDdEQkMsIDB4N0RDMCwgMHg3REMxLCAweDdEQzIsIDB4N0RDMywgMHg3REM1LAotICAgIDB4N0RDNiwgMHg3REM4LCAweDdEQzksIDB4N0RDQywgMHg3RENELCAweDdEQ0UsIDB4N0RDRiwgMHg3REQwLAotICAgIDB4N0REMywgMHg3REQ1LCAweDdERDYsIDB4N0REQSwgMHg3RERCLCAweDdEREMsIDB4N0RERiwgMHg3REUyLAotICAgIDB4N0RFNCwgMHg3REU1LCAweDdERTcsIDB4N0RFQSwgMHg3REVCLCAweDdERUQsIDB4N0RFRSwgMHg3REYwLAotICAgIDB4N0RGMywgMHg3REY1LCAweDdERjcsIDB4N0RGOCwgMHg3REZBLCAweDdERkMsIDB4N0RGRCwgMHg3REZFLAotICAgIDB4N0RGRiwgMHg3RTAwLCAweDdFMDEsIDB4N0UwMiwgMHg3RTAzLCAweDdFMDQsIDB4N0UwNSwgMHg3RTA2LAotICAgIDB4N0UwNywgMHg3RTBDLCAweDdFMEQsIDB4N0UwRSwgMHg3RTBGLCAweDdFMTIsIDB4N0UxMywgMHg3RTE0LAotICAgIDB4N0UxNSwgMHg3RTE2LCAweDdFMTcsIDB4N0UxOCwgMHg3RTE5LCAweDdFMUEsIDB4N0UxQywgMHg3RTIwLAotICAgIDB4N0UyMSwgMHg3RTIyLCAweDdFMjQsIDB4N0UyNSwgMHg3RTI2LCAweDdFMjgsIDB4N0UyOSwgMHg3RTJBLAotICAgIDB4N0UyQywgMHg3RTJGLCAweDdFMzAsIDB4N0UzMywgMHg3RTM4LCAweDdFM0EsIDB4N0UzQywgMHg3RTNGLAotICAgIDB4N0U0MCwgMHg3RTQyLCAweDdFNDMsIDB4N0U0NCwgMHg3RTQ4LCAweDdFNDksIDB4N0U0QSwgMHg3RTRCLAotICAgIDB4N0U0QywgMHg3RTRELCAweDdFNEUsIDB4N0U0RiwgMHg3RTUwLCAweDdFNTEsIDB4N0U1MywgMHg3RTU2LAotICAgIDB4N0U1NywgMHg3RTU4LCAweDdFNTksIDB4N0U1QiwgMHg3RTVDLCAweDdFNUQsIDB4N0U1RiwgMHg3RTYwLAotICAgIDB4N0U2MSwgMHg3RTYzLCAweDdFNjQsIDB4N0U2NSwgMHg3RTY2LCAweDdFNjcsIDB4N0U2OCwgMHg3RTZDLAotICAgIDB4N0U3MSwgMHg3RTcyLCAweDdFNzQsIDB4N0U3NSwgMHg3RTc2LCAweDdFNzcsIDB4N0U3OCwgMHg3RTdBLAotICAgIDB4N0U3QiwgMHg3RTdGLCAweDdFODAsIDB4N0U4MSwgMHg3RTgzLCAweDdFODQsIDB4N0U4NSwgMHg3RTg2LAotICAgIDB4N0U4NywgMHg3RTg5LCAweDdFOEIsIDB4N0U4RSwgMHg3RTkwLCAweDdFOTEsIDB4N0U5MiwgMHg3RTk1LAotICAgIDB4N0U5NywgMHg3RTk5LCAweDdFOUEsIDB4N0U5RCwgMHg3RTlFLCAweDdFQUUsIDB4N0VCNCwgMHg3RUJCLAotICAgIDB4N0VCQywgMHg3RUQ2LCAweDdFRTQsIDB4N0VFQywgMHg3RUY5LCAweDdGMEEsIDB4N0YxMCwgMHg3RjFFLAotICAgIDB4N0YzNywgMHg3RjM5LCAweDdGM0IsIDB4N0YzQywgMHg3RjNELCAweDdGM0UsIDB4N0YzRiwgMHg3RjQwLAotICAgIDB4N0Y0MSwgMHg3RjQzLCAweDdGNDYsIDB4N0Y0NywgMHg3RjQ4LCAweDdGNDksIDB4N0Y0QSwgMHg3RjRCLAotICAgIDB4N0Y0RCwgMHg3RjRGLCAweDdGNTIsIDB4N0Y1MywgMHg3RjU2LCAweDdGNTksIDB4N0Y1QiwgMHg3RjVDLAotICAgIDB4N0Y1RCwgMHg3RjVFLCAweDdGNjAsIDB4N0Y2MywgMHg3RjY0LCAweDdGNjUsIDB4N0Y2NiwgMHg3RjY3LAotICAgIDB4N0Y2QiwgMHg3RjZDLCAweDdGNkQsIDB4N0Y2RiwgMHg3RjczLCAweDdGNzUsIDB4N0Y3NiwgMHg3Rjc4LAotICAgIDB4N0Y3QSwgMHg3RjdCLCAweDdGN0MsIDB4N0Y3RCwgMHg3RjdGLCAweDdGODAsIDB4N0Y4MiwgMHg3RjgzLAotICAgIDB4N0Y4NCwgMHg3Rjg3LCAweDdGODksIDB4N0Y4QiwgMHg3RjhELCAweDdGOEYsIDB4N0Y5MCwgMHg3RjkxLAotICAgIDB4N0Y5MiwgMHg3RjkzLCAweDdGOTUsIDB4N0Y5NiwgMHg3Rjk3LCAweDdGOTgsIDB4N0Y5OSwgMHg3RjlCLAotICAgIDB4N0Y5QywgMHg3RkEwLCAweDdGQTIsIDB4N0ZBMywgMHg3RkE2LCAweDdGQTgsIDB4N0ZBQSwgMHg3RkFCLAotICAgIDB4N0ZBQywgMHg3RkFELCAweDdGQUUsIDB4N0ZCMSwgMHg3RkIzLCAweDdGQjQsIDB4N0ZCNSwgMHg3RkI2LAotICAgIDB4N0ZCNywgMHg3RkJBLCAweDdGQkIsIDB4N0ZCRSwgMHg3RkMwLCAweDdGQzIsIDB4N0ZDMywgMHg3RkM0LAotICAgIDB4N0ZDNiwgMHg3RkM3LCAweDdGQzgsIDB4N0ZDOSwgMHg3RkNCLCAweDdGQ0QsIDB4N0ZDRiwgMHg3RkQwLAotICAgIDB4N0ZEMSwgMHg3RkQzLCAweDdGRDYsIDB4N0ZENywgMHg3RkQ5LCAweDdGREEsIDB4N0ZEQiwgMHg3RkRDLAotICAgIDB4N0ZERCwgMHg3RkRFLCAweDdGRTIsIDB4N0ZFMywgMHg3RkU0LCAweDdGRTcsIDB4N0ZFOCwgMHg3RkVBLAotICAgIDB4N0ZFQiwgMHg3RkVDLCAweDdGRUQsIDB4N0ZFRiwgMHg3RkYyLCAweDdGRjQsIDB4N0ZGNSwgMHg3RkY2LAotICAgIDB4N0ZGNywgMHg3RkY4LCAweDdGRkEsIDB4N0ZGRCwgMHg3RkZFLCAweDdGRkYsIDB4ODAwMiwgMHg4MDA3LAotICAgIDB4ODAwOCwgMHg4MDA5LCAweDgwMEEsIDB4ODAwRSwgMHg4MDBGLCAweDgwMTEsIDB4ODAxMywgMHg4MDFBLAotICAgIDB4ODAxQiwgMHg4MDFELCAweDgwMUUsIDB4ODAxRiwgMHg4MDIxLCAweDgwMjMsIDB4ODAyNCwgMHg4MDJCLAotICAgIDB4ODAyRCwgMHg4MDJGLCAweDgwMzAsIDB4ODAzMiwgMHg4MDM0LCAweDgwMzksIDB4ODAzQSwgMHg4MDNDLAotICAgIDB4ODAzRSwgMHg4MDQwLCAweDgwNDEsIDB4ODA0NCwgMHg4MDQ1LCAweDgwNDcsIDB4ODA0OCwgMHg4MDQ5LAotICAgIDB4ODA0RSwgMHg4MDRGLCAweDgwNTAsIDB4ODA1MSwgMHg4MDUzLCAweDgwNTUsIDB4ODA1NywgMHg4MDU5LAotICAgIDB4ODA1QiwgMHg4MDVDLCAweDgwNUQsIDB4ODA1RiwgMHg4MDYwLCAweDgwNjEsIDB4ODA2MiwgMHg4MDYzLAotICAgIDB4ODA2NCwgMHg4MDY1LCAweDgwNjYsIDB4ODA2NywgMHg4MDY4LCAweDgwNkIsIDB4ODA2QywgMHg4MDZELAotICAgIDB4ODA2RSwgMHg4MDc0LCAweDgwNzgsIDB4ODA3QSwgMHg4MDdCLCAweDgwN0MsIDB4ODA4MSwgMHg4MDgyLAotICAgIDB4ODA4OCwgMHg4MDhBLCAweDgwOEQsIDB4ODA4RSwgMHg4MDhGLCAweDgwOTAsIDB4ODA5MSwgMHg4MDkyLAotICAgIDB4ODA5NCwgMHg4MDk1LCAweDgwOTcsIDB4ODA5OSwgMHg4MDlFLCAweDgwQTMsIDB4ODBBNiwgMHg4MEE3LAotICAgIDB4ODBBOCwgMHg4MEFDLCAweDgwQjAsIDB4ODBCMywgMHg4MEI1LCAweDgwQjYsIDB4ODBCOCwgMHg4MEI5LAotICAgIDB4ODBCQiwgMHg4MEM1LCAweDgwQzcsIDB4ODBDOCwgMHg4MEM5LCAweDgwQ0EsIDB4ODBDQiwgMHg4MENGLAotICAgIDB4ODBEMCwgMHg4MEQxLCAweDgwRDIsIDB4ODBEMywgMHg4MEQ0LCAweDgwRDUsIDB4ODBEOCwgMHg4MERGLAotICAgIDB4ODBFMCwgMHg4MEUyLCAweDgwRTMsIDB4ODBFNiwgMHg4MEVFLCAweDgwRjUsIDB4ODBGNywgMHg4MEY5LAotICAgIDB4ODBGQiwgMHg4MEZFLCAweDgwRkYsIDB4ODEwMCwgMHg4MTAxLCAweDgxMDMsIDB4ODEwNCwgMHg4MTA3LAotICAgIDB4ODEwOCwgMHg4MTBCLCAweDgxMEMsIDB4ODExNSwgMHg4MTE3LCAweDgxMTksIDB4ODExQywgMHg4MTFELAotICAgIDB4ODExRiwgMHg4MTIwLCAweDgxMjEsIDB4ODEyMiwgMHg4MTIzLCAweDgxMjQsIDB4ODEyNSwgMHg4MTI2LAotICAgIDB4ODEyNywgMHg4MTI4LCAweDgxMjksIDB4ODEyQSwgMHg4MTJCLCAweDgxMkQsIDB4ODEyRSwgMHg4MTMwLAotICAgIDB4ODEzMywgMHg4MTM0LCAweDgxMzUsIDB4ODEzNywgMHg4MTNBLCAweDgxM0IsIDB4ODEzQywgMHg4MTNELAotICAgIDB4ODEzRiwgMHg4MTQwLCAweDgxNDEsIDB4ODE0MiwgMHg4MTQzLCAweDgxNDQsIDB4ODE0NSwgMHg4MTQ3LAotICAgIDB4ODE0OSwgMHg4MTRELCAweDgxNEYsIDB4ODE1MiwgMHg4MTU3LCAweDgxNTgsIDB4ODE1QiwgMHg4MTVDLAotICAgIDB4ODE1RCwgMHg4MTVFLCAweDgxNUYsIDB4ODE2MiwgMHg4MTYzLCAweDgxNjQsIDB4ODE2OCwgMHg4MTZBLAotICAgIDB4ODE2QywgMHg4MTZGLCAweDgxNzIsIDB4ODE3MywgMHg4MTc1LCAweDgxNzYsIDB4ODE3NywgMHg4MTgxLAotICAgIDB4ODE4MywgMHg4MTg0LCAweDgxODUsIDB4ODE4NiwgMHg4MTg3LCAweDgxODksIDB4ODE4QiwgMHg4MThDLAotICAgIDB4ODE4RCwgMHg4MThFLCAweDgxOTAsIDB4ODE5MiwgMHg4MTkzLCAweDgxOTQsIDB4ODE5NSwgMHg4MTk2LAotICAgIDB4ODE5NywgMHg4MTk5LCAweDgxOUUsIDB4ODE5RiwgMHg4MUExLCAweDgxQTIsIDB4ODFBNCwgMHg4MUE1LAotICAgIDB4ODFBNywgMHg4MUFCLCAweDgxQUMsIDB4ODFBRCwgMHg4MUFFLCAweDgxQUYsIDB4ODFCMCwgMHg4MUIxLAotICAgIDB4ODFCMiwgMHg4MUI0LCAweDgxQjUsIDB4ODFCNiwgMHg4MUI3LCAweDgxQjgsIDB4ODFCOSwgMHg4MUJDLAotICAgIDB4ODFDNCwgMHg4MUM1LCAweDgxQzcsIDB4ODFDOCwgMHg4MUNCLCAweDgxQ0UsIDB4ODFEMCwgMHg4MUQxLAotICAgIDB4ODFEMiwgMHg4MUQzLCAweDgxRDQsIDB4ODFENSwgMHg4MUQ2LCAweDgxRDcsIDB4ODFEOSwgMHg4MURCLAotICAgIDB4ODFEQywgMHg4MURELCAweDgxREUsIDB4ODFFMSwgMHg4MUUyLCAweDgxRTQsIDB4ODFFNSwgMHg4MUU2LAotICAgIDB4ODFFOSwgMHg4MUVCLCAweDgxRUUsIDB4ODFFRiwgMHg4MUYwLCAweDgxRjEsIDB4ODFGMiwgMHg4MUY1LAotICAgIDB4ODFGNiwgMHg4MUY3LCAweDgxRjgsIDB4ODFGOSwgMHg4MUZELCAweDgxRkYsIDB4ODIwMywgMHg4MjBCLAotICAgIDB4ODIwRSwgMHg4MjBGLCAweDgyMTEsIDB4ODIxMywgMHg4MjE1LCAweDgyMTYsIDB4ODIxNywgMHg4MjE4LAotICAgIDB4ODIxOSwgMHg4MjFBLCAweDgyMUQsIDB4ODIyMCwgMHg4MjI0LCAweDgyMjUsIDB4ODIyNiwgMHg4MjI3LAotICAgIDB4ODIyOSwgMHg4MjJFLCAweDgyMzIsIDB4ODIzQSwgMHg4MjNDLCAweDgyM0QsIDB4ODIzRiwgMHg4MjQwLAotICAgIDB4ODI0MSwgMHg4MjQyLCAweDgyNDMsIDB4ODI0NSwgMHg4MjQ2LCAweDgyNDgsIDB4ODI0QSwgMHg4MjRDLAotICAgIDB4ODI0RCwgMHg4MjRFLCAweDgyNTAsIDB4ODI1MSwgMHg4MjUyLCAweDgyNTMsIDB4ODI1NCwgMHg4MjU1LAotICAgIDB4ODI1NiwgMHg4MjU3LCAweDgyNUIsIDB4ODI1QywgMHg4MjVELCAweDgyNUUsIDB4ODI2MCwgMHg4MjYxLAotICAgIDB4ODI2MiwgMHg4MjYzLCAweDgyNjUsIDB4ODI2NywgMHg4MjY5LCAweDgyNkEsIDB4ODI2QywgMHg4MjZELAotICAgIDB4ODI3NSwgMHg4Mjc2LCAweDgyNzgsIDB4ODI3QiwgMHg4MjdDLCAweDgyODAsIDB4ODI4MSwgMHg4MjgzLAotICAgIDB4ODI4NSwgMHg4Mjg2LCAweDgyODcsIDB4ODI4OSwgMHg4MjhDLCAweDgyOTAsIDB4ODI5MywgMHg4Mjk0LAotICAgIDB4ODI5NSwgMHg4Mjk2LCAweDgyOUEsIDB4ODI5QiwgMHg4MjlFLCAweDgyQTAsIDB4ODJBMiwgMHg4MkEzLAotICAgIDB4ODJBNywgMHg4MkIyLCAweDgyQjUsIDB4ODJCNiwgMHg4MkJBLCAweDgyQkMsIDB4ODJCRiwgMHg4MkMwLAotICAgIDB4ODJDMiwgMHg4MkMzLCAweDgyQzUsIDB4ODJDNiwgMHg4MkM5LCAweDgyRDAsIDB4ODJENiwgMHg4MkQ5LAotICAgIDB4ODJEQSwgMHg4MkRELCAweDgyRTIsIDB4ODJFOCwgMHg4MkU5LCAweDgyRUEsIDB4ODJFQywgMHg4MkVELAotICAgIDB4ODJFRSwgMHg4MkYwLCAweDgyRjIsIDB4ODJGMywgMHg4MkY1LCAweDgyRjYsIDB4ODJGOCwgMHg4MkZBLAotICAgIDB4ODJGQywgMHg4MkZELCAweDgyRkUsIDB4ODJGRiwgMHg4MzAwLCAweDgzMEEsIDB4ODMwQiwgMHg4MzBELAotICAgIDB4ODMxMCwgMHg4MzEyLCAweDgzMTMsIDB4ODMxNiwgMHg4MzE4LCAweDgzMTksIDB4ODMxRCwgMHg4MzFFLAotICAgIDB4ODMxRiwgMHg4MzIwLCAweDgzMjEsIDB4ODMyMiwgMHg4MzIzLCAweDgzMjQsIDB4ODMyNSwgMHg4MzI2LAotICAgIDB4ODMyOSwgMHg4MzJBLCAweDgzMkUsIDB4ODMzMCwgMHg4MzMyLCAweDgzMzcsIDB4ODMzQiwgMHg4MzNELAotICAgIDB4ODMzRSwgMHg4MzNGLCAweDgzNDEsIDB4ODM0MiwgMHg4MzQ0LCAweDgzNDUsIDB4ODM0OCwgMHg4MzRBLAotICAgIDB4ODM0QiwgMHg4MzRDLCAweDgzNEQsIDB4ODM0RSwgMHg4MzUzLCAweDgzNTUsIDB4ODM1NiwgMHg4MzU3LAotICAgIDB4ODM1OCwgMHg4MzU5LCAweDgzNUQsIDB4ODM2MiwgMHg4MzcwLCAweDgzNzEsIDB4ODM3MiwgMHg4MzczLAotICAgIDB4ODM3NCwgMHg4Mzc1LCAweDgzNzYsIDB4ODM3OSwgMHg4MzdBLCAweDgzN0UsIDB4ODM3RiwgMHg4MzgwLAotICAgIDB4ODM4MSwgMHg4MzgyLCAweDgzODMsIDB4ODM4NCwgMHg4Mzg3LCAweDgzODgsIDB4ODM4QiwgMHg4MzhDLAotICAgIDB4ODM4RCwgMHg4MzhGLCAweDgzOTAsIDB4ODM5MSwgMHg4Mzk0LCAweDgzOTUsIDB4ODM5NywgMHg4Mzk5LAotICAgIDB4ODM5QSwgMHg4MzlELCAweDgzOUYsIDB4ODNBMSwgMHg4M0EzLCAweDgzQTQsIDB4ODNBNSwgMHg4M0E2LAotICAgIDB4ODNBQywgMHg4M0FELCAweDgzQUUsIDB4ODNBRiwgMHg4M0I1LCAweDgzQkIsIDB4ODNCRSwgMHg4M0JGLAotICAgIDB4ODNDMiwgMHg4M0MzLCAweDgzQzQsIDB4ODNDNiwgMHg4M0M4LCAweDgzQzksIDB4ODNDQiwgMHg4M0NELAotICAgIDB4ODNDRSwgMHg4M0QwLCAweDgzRDEsIDB4ODNEMiwgMHg4M0QzLCAweDgzRDUsIDB4ODNENywgMHg4M0Q5LAotICAgIDB4ODNEQSwgMHg4M0RCLCAweDgzREUsIDB4ODNFMiwgMHg4M0UzLCAweDgzRTQsIDB4ODNFNiwgMHg4M0U3LAotICAgIDB4ODNFOCwgMHg4M0VCLCAweDgzRUMsIDB4ODNFRCwgMHg4M0VFLCAweDgzRjMsIDB4ODNGNCwgMHg4M0Y1LAotICAgIDB4ODNGNiwgMHg4M0Y3LCAweDgzRkEsIDB4ODNGQiwgMHg4M0ZDLCAweDgzRkUsIDB4ODNGRiwgMHg4NDAwLAotICAgIDB4ODQwMiwgMHg4NDA1LCAweDg0MDgsIDB4ODQwOSwgMHg4NDEwLCAweDg0MTIsIDB4ODQxMywgMHg4NDE0LAotICAgIDB4ODQxNSwgMHg4NDE2LCAweDg0MTcsIDB4ODQxOSwgMHg4NDFBLCAweDg0MUIsIDB4ODQxRSwgMHg4NDFGLAotICAgIDB4ODQyMCwgMHg4NDIxLCAweDg0MjIsIDB4ODQyMywgMHg4NDI5LCAweDg0MkEsIDB4ODQyQiwgMHg4NDJELAotICAgIDB4ODQyRSwgMHg4NDJGLCAweDg0MzAsIDB4ODQzMiwgMHg4NDMzLCAweDg0MzQsIDB4ODQzNiwgMHg4NDM3LAotICAgIDB4ODQzOSwgMHg4NDNBLCAweDg0M0IsIDB4ODQzRSwgMHg4NDNGLCAweDg0NDAsIDB4ODQ0MSwgMHg4NDQyLAotICAgIDB4ODQ0MywgMHg4NDQ0LCAweDg0NDUsIDB4ODQ0NywgMHg4NDQ4LCAweDg0NEEsIDB4ODQ0QiwgMHg4NDRDLAotICAgIDB4ODQ0RCwgMHg4NDRFLCAweDg0NEYsIDB4ODQ1MCwgMHg4NDUzLCAweDg0NTQsIDB4ODQ1NSwgMHg4NDU2LAotICAgIDB4ODQ1OCwgMHg4NDVELCAweDg0NUUsIDB4ODQ1RiwgMHg4NDYwLCAweDg0NjIsIDB4ODQ2NSwgMHg4NDY3LAotICAgIDB4ODQ2OCwgMHg4NDZBLCAweDg0NkUsIDB4ODQ3MCwgMHg4NDcyLCAweDg0NzQsIDB4ODQ3OSwgMHg4NDdCLAotICAgIDB4ODQ3QywgMHg4NDdELCAweDg0N0UsIDB4ODQ3RiwgMHg4NDgwLCAweDg0ODEsIDB4ODQ4MywgMHg4NDg0LAotICAgIDB4ODQ4NSwgMHg4NDg2LCAweDg0OEEsIDB4ODQ4RCwgMHg4NDhGLCAweDg0OTAsIDB4ODQ5MSwgMHg4NDkyLAotICAgIDB4ODQ5NSwgMHg4NDk2LCAweDg0OTgsIDB4ODQ5QSwgMHg4NDlCLCAweDg0OUQsIDB4ODQ5RSwgMHg4NDlGLAotICAgIDB4ODRBMCwgMHg4NEEyLCAweDg0QTMsIDB4ODRBNCwgMHg4NEE1LCAweDg0QTYsIDB4ODRBNywgMHg4NEE4LAotICAgIDB4ODRBOSwgMHg4NEFBLCAweDg0QUIsIDB4ODRBQywgMHg4NEFELCAweDg0QUUsIDB4ODRCMCwgMHg4NEIxLAotICAgIDB4ODRCMywgMHg4NEI1LCAweDg0QjYsIDB4ODRCNywgMHg4NEJCLCAweDg0QkUsIDB4ODRDMiwgMHg4NEMzLAotICAgIDB4ODRDNSwgMHg4NEM2LCAweDg0QzcsIDB4ODRDOCwgMHg4NENDLCAweDg0Q0UsIDB4ODRDRiwgMHg4NEQyLAotICAgIDB4ODRENCwgMHg4NEQ1LCAweDg0RDcsIDB4ODREOCwgMHg4NEQ5LCAweDg0REEsIDB4ODREQiwgMHg4NERDLAotICAgIDB4ODRERSwgMHg4NEUxLCAweDg0RTIsIDB4ODRFNCwgMHg4NEU3LCAweDg0RTgsIDB4ODRFOSwgMHg4NEVBLAotICAgIDB4ODRFQiwgMHg4NEVELCAweDg0RjEsIDB4ODRGMiwgMHg4NEYzLCAweDg0RjQsIDB4ODRGNSwgMHg4NEY2LAotICAgIDB4ODRGNywgMHg4NEY4LCAweDg0RjksIDB4ODRGQSwgMHg4NEZCLCAweDg0RkUsIDB4ODUwMCwgMHg4NTAxLAotICAgIDB4ODUwMiwgMHg4NTAzLCAweDg1MDQsIDB4ODUwNSwgMHg4NTA2LCAweDg1MDcsIDB4ODUwOCwgMHg4NTA5LAotICAgIDB4ODUwQSwgMHg4NTBCLCAweDg1MEQsIDB4ODUwRSwgMHg4NTBGLCAweDg1MTAsIDB4ODUxMiwgMHg4NTE1LAotICAgIDB4ODUxNiwgMHg4NTE4LCAweDg1MTksIDB4ODUxQiwgMHg4NTFDLCAweDg1MUQsIDB4ODUyMCwgMHg4NTIyLAotICAgIDB4ODUyNCwgMHg4NTI1LCAweDg1MjcsIDB4ODUyOCwgMHg4NTI5LCAweDg1MkEsIDB4ODUyRSwgMHg4NTJGLAotICAgIDB4ODUzMCwgMHg4NTMxLCAweDg1MzIsIDB4ODUzMywgMHg4NTM0LCAweDg1MzUsIDB4ODUzNiwgMHg4NTNFLAotICAgIDB4ODUzRiwgMHg4NTQwLCAweDg1NDIsIDB4ODU0NCwgMHg4NTQ1LCAweDg1NDcsIDB4ODU0QiwgMHg4NTRDLAotICAgIDB4ODU0RCwgMHg4NTRGLCAweDg1NTAsIDB4ODU1MSwgMHg4NTU0LCAweDg1NTcsIDB4ODU1QSwgMHg4NTVCLAotICAgIDB4ODU1QywgMHg4NTVELCAweDg1NUYsIDB4ODU2MCwgMHg4NTYxLCAweDg1NjMsIDB4ODU2NSwgMHg4NTY2LAotICAgIDB4ODU2NywgMHg4NTZCLCAweDg1NkMsIDB4ODU2RSwgMHg4NTZGLCAweDg1NzAsIDB4ODU3MSwgMHg4NTczLAotICAgIDB4ODU3NSwgMHg4NTc2LCAweDg1NzgsIDB4ODU3QywgMHg4NTdELCAweDg1N0YsIDB4ODU4MCwgMHg4NTgxLAotICAgIDB4ODU4MiwgMHg4NTgzLCAweDg1ODYsIDB4ODU4OSwgMHg4NThCLCAweDg1OEQsIDB4ODU4RSwgMHg4NTkwLAotICAgIDB4ODU5MiwgMHg4NTkzLCAweDg1OTUsIDB4ODU5NiwgMHg4NTk3LCAweDg1OTgsIDB4ODU5OSwgMHg4NTlBLAotICAgIDB4ODU5RCwgMHg4NTlFLCAweDg1QTAsIDB4ODVBMSwgMHg4NUEyLCAweDg1QTMsIDB4ODVBNSwgMHg4NUE3LAotICAgIDB4ODVBQiwgMHg4NUFDLCAweDg1QUQsIDB4ODVCMSwgMHg4NUIyLCAweDg1QjMsIDB4ODVCNCwgMHg4NUI1LAotICAgIDB4ODVCNiwgMHg4NUI4LCAweDg1QkIsIDB4ODVCQywgMHg4NUJELCAweDg1QkUsIDB4ODVCRiwgMHg4NUMwLAotICAgIDB4ODVDMiwgMHg4NUMzLCAweDg1QzQsIDB4ODVDNSwgMHg4NUM2LCAweDg1QzcsIDB4ODVDOCwgMHg4NUNBLAotICAgIDB4ODVDQiwgMHg4NUNDLCAweDg1RDEsIDB4ODVEMiwgMHg4NUQ0LCAweDg1RDYsIDB4ODVENywgMHg4NUQ4LAotICAgIDB4ODVEOSwgMHg4NURBLCAweDg1REIsIDB4ODVERSwgMHg4NURGLCAweDg1RTAsIDB4ODVFMSwgMHg4NUUyLAotICAgIDB4ODVFMywgMHg4NUU2LCAweDg1RTcsIDB4ODVFOCwgMHg4NUVCLCAweDg1RUMsIDB4ODVFRCwgMHg4NUVFLAotICAgIDB4ODVFRiwgMHg4NUYwLCAweDg1RjEsIDB4ODVGMiwgMHg4NUYzLCAweDg1RjUsIDB4ODVGNywgMHg4NUY4LAotICAgIDB4ODVGQywgMHg4NUZELCAweDg1RkUsIDB4ODYwMCwgMHg4NjAxLCAweDg2MDIsIDB4ODYwMywgMHg4NjA4LAotICAgIDB4ODYwOSwgMHg4NjBBLCAweDg2MEMsIDB4ODYwRCwgMHg4NjBFLCAweDg2MEYsIDB4ODYxMCwgMHg4NjEyLAotICAgIDB4ODYxMywgMHg4NjE0LCAweDg2MTUsIDB4ODYxNywgMHg4NjE4LCAweDg2MTksIDB4ODYxQiwgMHg4NjFDLAotICAgIDB4ODYxRCwgMHg4NjFGLCAweDg2MjAsIDB4ODYyMSwgMHg4NjIzLCAweDg2MjQsIDB4ODYyNSwgMHg4NjI2LAotICAgIDB4ODYyOCwgMHg4NjJBLCAweDg2MkIsIDB4ODYyQywgMHg4NjJFLCAweDg2MkYsIDB4ODYzMCwgMHg4NjMxLAotICAgIDB4ODYzMiwgMHg4NjMzLCAweDg2MzQsIDB4ODYzNSwgMHg4NjM2LCAweDg2MzcsIDB4ODYzOSwgMHg4NjNCLAotICAgIDB4ODYzRCwgMHg4NjNFLCAweDg2NDAsIDB4ODY0MSwgMHg4NjQyLCAweDg2NDMsIDB4ODY0NCwgMHg4NjQ1LAotICAgIDB4ODY0NiwgMHg4NjQ3LCAweDg2NDgsIDB4ODY0OSwgMHg4NjRBLCAweDg2NEIsIDB4ODY0QywgMHg4NjUyLAotICAgIDB4ODY1MywgMHg4NjU2LCAweDg2NTcsIDB4ODY1OCwgMHg4NjU5LCAweDg2NUIsIDB4ODY1RCwgMHg4NjYwLAotICAgIDB4ODY2MSwgMHg4NjYzLCAweDg2NjQsIDB4ODY2NSwgMHg4NjY2LCAweDg2NjgsIDB4ODY2OSwgMHg4NjZBLAotICAgIDB4ODY2RCwgMHg4NjZGLCAweDg2NzAsIDB4ODY3MiwgMHg4NjczLCAweDg2NzQsIDB4ODY3NSwgMHg4Njc2LAotICAgIDB4ODY3NywgMHg4Njc4LCAweDg2ODMsIDB4ODY4NCwgMHg4Njg1LCAweDg2ODYsIDB4ODY4NywgMHg4Njg4LAotICAgIDB4ODY4OSwgMHg4NjhFLCAweDg2OEYsIDB4ODY5MCwgMHg4NjkxLCAweDg2OTIsIDB4ODY5NCwgMHg4Njk2LAotICAgIDB4ODY5NywgMHg4Njk4LCAweDg2OTksIDB4ODY5QSwgMHg4NjlCLCAweDg2OUUsIDB4ODY5RiwgMHg4NkEwLAotICAgIDB4ODZBMSwgMHg4NkEyLCAweDg2QTUsIDB4ODZBNiwgMHg4NkFCLCAweDg2QUQsIDB4ODZBRSwgMHg4NkIyLAotICAgIDB4ODZCMywgMHg4NkI3LCAweDg2QjgsIDB4ODZCOSwgMHg4NkJCLCAweDg2QkMsIDB4ODZCRCwgMHg4NkJFLAotICAgIDB4ODZCRiwgMHg4NkMxLCAweDg2QzIsIDB4ODZDMywgMHg4NkM1LCAweDg2QzgsIDB4ODZDQywgMHg4NkNELAotICAgIDB4ODZEMiwgMHg4NkQzLCAweDg2RDUsIDB4ODZENiwgMHg4NkQ3LCAweDg2REEsIDB4ODZEQywgMHg4NkRELAotICAgIDB4ODZFMCwgMHg4NkUxLCAweDg2RTIsIDB4ODZFMywgMHg4NkU1LCAweDg2RTYsIDB4ODZFNywgMHg4NkU4LAotICAgIDB4ODZFQSwgMHg4NkVCLCAweDg2RUMsIDB4ODZFRiwgMHg4NkY1LCAweDg2RjYsIDB4ODZGNywgMHg4NkZCLAotICAgIDB4ODZGQywgMHg4NkZELCAweDg2RkYsIDB4ODcwMSwgMHg4NzA0LCAweDg3MDUsIDB4ODcwQiwgMHg4NzBDLAotICAgIDB4ODcwRSwgMHg4NzBGLCAweDg3MTAsIDB4ODcxMSwgMHg4NzE0LCAweDg3MTYsIDB4ODcxOSwgMHg4NzFCLAotICAgIDB4ODcxRCwgMHg4NzFGLCAweDg3MjAsIDB4ODcyNCwgMHg4NzI2LCAweDg3MjcsIDB4ODcyOCwgMHg4NzJBLAotICAgIDB4ODcyQiwgMHg4NzJDLCAweDg3MkQsIDB4ODcyRiwgMHg4NzMwLCAweDg3MzIsIDB4ODczMywgMHg4NzM1LAotICAgIDB4ODczNiwgMHg4NzM4LCAweDg3MzksIDB4ODczQSwgMHg4NzNDLCAweDg3M0QsIDB4ODc0MCwgMHg4NzQxLAotICAgIDB4ODc0MiwgMHg4NzQzLCAweDg3NDQsIDB4ODc0NSwgMHg4NzQ2LCAweDg3NEEsIDB4ODc0QiwgMHg4NzRELAotICAgIDB4ODc0RiwgMHg4NzUwLCAweDg3NTEsIDB4ODc1MiwgMHg4NzU0LCAweDg3NTYsIDB4ODc1OCwgMHg4NzVBLAotICAgIDB4ODc1QiwgMHg4NzVDLCAweDg3NUQsIDB4ODc1RSwgMHg4NzVGLCAweDg3NjEsIDB4ODc2MiwgMHg4NzY3LAotICAgIDB4ODc2OCwgMHg4NzY5LCAweDg3NkEsIDB4ODc2QiwgMHg4NzZDLCAweDg3NkQsIDB4ODc2RiwgMHg4NzcxLAotICAgIDB4ODc3MiwgMHg4NzczLCAweDg3NzUsIDB4ODc3NywgMHg4Nzc5LCAweDg3N0EsIDB4ODc3RiwgMHg4NzgwLAotICAgIDB4ODc4MSwgMHg4Nzg2LCAweDg3ODcsIDB4ODc4OSwgMHg4NzhBLCAweDg3OEMsIDB4ODc4RSwgMHg4NzhGLAotICAgIDB4ODc5MCwgMHg4NzkxLCAweDg3OTIsIDB4ODc5NCwgMHg4Nzk1LCAweDg3OTYsIDB4ODc5OCwgMHg4Nzk5LAotICAgIDB4ODc5QSwgMHg4NzlCLCAweDg3OUMsIDB4ODc5RCwgMHg4N0EwLCAweDg3QTEsIDB4ODdBMywgMHg4N0E0LAotICAgIDB4ODdBNSwgMHg4N0E2LCAweDg3QTcsIDB4ODdBOSwgMHg4N0FBLCAweDg3QUUsIDB4ODdCMCwgMHg4N0IxLAotICAgIDB4ODdCMiwgMHg4N0I0LCAweDg3QjYsIDB4ODdCNywgMHg4N0I4LCAweDg3QjksIDB4ODdCQywgMHg4N0JFLAotICAgIDB4ODdCRiwgMHg4N0MxLCAweDg3QzIsIDB4ODdDMywgMHg4N0M1LCAweDg3QzcsIDB4ODdDOSwgMHg4N0NDLAotICAgIDB4ODdDRCwgMHg4N0NGLCAweDg3RDAsIDB4ODdENCwgMHg4N0Q1LCAweDg3RDYsIDB4ODdENywgMHg4N0Q4LAotICAgIDB4ODdEOSwgMHg4N0RBLCAweDg3REMsIDB4ODdERCwgMHg4N0RFLCAweDg3REYsIDB4ODdFMSwgMHg4N0UyLAotICAgIDB4ODdFNCwgMHg4N0U2LCAweDg3RTcsIDB4ODdFOCwgMHg4N0U5LCAweDg3RUIsIDB4ODdFRCwgMHg4N0YwLAotICAgIDB4ODdGMSwgMHg4N0YzLCAweDg3RjQsIDB4ODdGNSwgMHg4N0Y3LCAweDg3RjgsIDB4ODdGQSwgMHg4N0ZDLAotICAgIDB4ODdGRCwgMHg4N0ZGLCAweDg4MDAsIDB4ODgwMSwgMHg4ODAyLCAweDg4MDQsIDB4ODgwNywgMHg4ODA4LAotICAgIDB4ODgwOSwgMHg4ODBCLCAweDg4MEMsIDB4ODgwRCwgMHg4ODBFLCAweDg4MEYsIDB4ODgxMiwgMHg4ODE0LAotICAgIDB4ODgxNywgMHg4ODE4LCAweDg4MTksIDB4ODgxQSwgMHg4ODFDLCAweDg4MUQsIDB4ODgxRSwgMHg4ODIwLAotICAgIDB4ODgyNCwgMHg4ODI1LCAweDg4MjYsIDB4ODgyNywgMHg4ODI4LCAweDg4MjksIDB4ODgyQSwgMHg4ODJCLAotICAgIDB4ODgyQywgMHg4ODJELCAweDg4MkUsIDB4ODgyRiwgMHg4ODMwLCAweDg4MzMsIDB4ODgzNCwgMHg4ODM1LAotICAgIDB4ODgzNywgMHg4ODM4LCAweDg4M0EsIDB4ODgzRCwgMHg4ODNFLCAweDg4M0YsIDB4ODg0MSwgMHg4ODQyLAotICAgIDB4ODg0MywgMHg4ODQ3LCAweDg4NDgsIDB4ODg0OSwgMHg4ODRCLCAweDg4NEUsIDB4ODg0RiwgMHg4ODUwLAotICAgIDB4ODg1MSwgMHg4ODUyLCAweDg4NTUsIDB4ODg1NiwgMHg4ODU4LCAweDg4NUEsIDB4ODg1QywgMHg4ODVFLAotICAgIDB4ODg1RiwgMHg4ODYwLCAweDg4NjYsIDB4ODg2NywgMHg4ODZBLCAweDg4NkQsIDB4ODg2RiwgMHg4ODcxLAotICAgIDB4ODg3MywgMHg4ODc0LCAweDg4NzUsIDB4ODg3NiwgMHg4ODc4LCAweDg4N0EsIDB4ODg3QiwgMHg4ODdDLAotICAgIDB4ODg4MCwgMHg4ODgzLCAweDg4ODYsIDB4ODg4NywgMHg4ODg5LCAweDg4OEEsIDB4ODg4QywgMHg4ODhFLAotICAgIDB4ODg4RiwgMHg4ODkwLCAweDg4OTEsIDB4ODg5MywgMHg4ODk0LCAweDg4OTUsIDB4ODg5NywgMHg4ODk4LAotICAgIDB4ODg5OSwgMHg4ODlBLCAweDg4OUIsIDB4ODg5RCwgMHg4ODlFLCAweDg4OUYsIDB4ODhBMCwgMHg4OEExLAotICAgIDB4ODhBMywgMHg4OEE1LCAweDg4QTYsIDB4ODhBNywgMHg4OEE4LCAweDg4QTksIDB4ODhBQSwgMHg4OEFDLAotICAgIDB4ODhBRSwgMHg4OEFGLCAweDg4QjAsIDB4ODhCMiwgMHg4OEIzLCAweDg4QjQsIDB4ODhCNSwgMHg4OEI2LAotICAgIDB4ODhCOCwgMHg4OEI5LCAweDg4QkEsIDB4ODhCQiwgMHg4OEJELCAweDg4QkUsIDB4ODhCRiwgMHg4OEMwLAotICAgIDB4ODhDMywgMHg4OEM0LCAweDg4QzcsIDB4ODhDOCwgMHg4OENCLCAweDg4Q0MsIDB4ODhDRCwgMHg4OEQwLAotICAgIDB4ODhEMSwgMHg4OEQzLCAweDg4RDYsIDB4ODhENywgMHg4OERBLCAweDg4REIsIDB4ODhERSwgMHg4OEUwLAotICAgIDB4ODhFMSwgMHg4OEU2LCAweDg4RTcsIDB4ODhFOSwgMHg4OEVBLCAweDg4RUIsIDB4ODhFQywgMHg4OEVELAotICAgIDB4ODhFRSwgMHg4OEVGLCAweDg4RjIsIDB4ODhGNSwgMHg4OEY2LCAweDg4RjcsIDB4ODhGQSwgMHg4OEZCLAotICAgIDB4ODhGRiwgMHg4OTAwLCAweDg5MDEsIDB4ODkwMywgMHg4OTA0LCAweDg5MDUsIDB4ODkwNiwgMHg4OTA4LAotICAgIDB4ODkwOSwgMHg4OTBCLCAweDg5MEMsIDB4ODkwRCwgMHg4OTBFLCAweDg5MEYsIDB4ODkxMSwgMHg4OTE0LAotICAgIDB4ODkxNSwgMHg4OTE2LCAweDg5MTcsIDB4ODkxOCwgMHg4OTFDLCAweDg5MUQsIDB4ODkxRSwgMHg4OTFGLAotICAgIDB4ODkyMCwgMHg4OTIyLCAweDg5MjMsIDB4ODkyNCwgMHg4OTI2LCAweDg5MjcsIDB4ODkyOCwgMHg4OTI5LAotICAgIDB4ODkyQywgMHg4OTJELCAweDg5MkUsIDB4ODkyRiwgMHg4OTMxLCAweDg5MzUsIDB4ODkzNywgMHg4OTM5LAotICAgIDB4ODkzQSwgMHg4OTNDLCAweDg5M0QsIDB4ODkzRSwgMHg4OTNGLCAweDg5NDAsIDB4ODk0MiwgMHg4OTQzLAotICAgIDB4ODk0NSwgMHg4OTQ2LCAweDg5NDgsIDB4ODk0OSwgMHg4OTRBLCAweDg5NEIsIDB4ODk0QywgMHg4OTRELAotICAgIDB4ODk0RSwgMHg4OTRGLCAweDg5NTAsIDB4ODk1MSwgMHg4OTUyLCAweDg5NTMsIDB4ODk1NCwgMHg4OTU1LAotICAgIDB4ODk1NywgMHg4OTU4LCAweDg5NTksIDB4ODk1QSwgMHg4OTVCLCAweDg5NUMsIDB4ODk2MSwgMHg4OTYyLAotICAgIDB4ODk2MywgMHg4OTY1LCAweDg5NjcsIDB4ODk2OCwgMHg4OTY5LCAweDg5NkIsIDB4ODk2RCwgMHg4OTZFLAotICAgIDB4ODk3MCwgMHg4OTcxLCAweDg5NzMsIDB4ODk3NCwgMHg4OTc1LCAweDg5NzYsIDB4ODk3NywgMHg4OTc4LAotICAgIDB4ODk3OSwgMHg4OTdBLCAweDg5N0MsIDB4ODk3RCwgMHg4OTdFLCAweDg5ODAsIDB4ODk4MiwgMHg4OTg0LAotICAgIDB4ODk4NSwgMHg4OTg3LCAweDg5ODgsIDB4ODk4OSwgMHg4OThBLCAweDg5OEMsIDB4ODk4RCwgMHg4OThFLAotICAgIDB4ODk5MCwgMHg4OTkxLCAweDg5OTIsIDB4ODk5NCwgMHg4OTk1LCAweDg5OTcsIDB4ODk5OSwgMHg4OTlBLAotICAgIDB4ODk5QiwgMHg4OTlDLCAweDg5OUQsIDB4ODk5RSwgMHg4OTlGLCAweDg5QTAsIDB4ODlBMiwgMHg4OUEzLAotICAgIDB4ODlBNCwgMHg4OUE1LCAweDg5QTcsIDB4ODlBOCwgMHg4OUE5LCAweDg5QUIsIDB4ODlBRCwgMHg4OUFFLAotICAgIDB4ODlCMCwgMHg4OUIxLCAweDg5QjMsIDB4ODlCNCwgMHg4OUI1LCAweDg5QjYsIDB4ODlCOCwgMHg4OUI5LAotICAgIDB4ODlCQiwgMHg4OUJDLCAweDg5QkUsIDB4ODlDMywgMHg4OUNELCAweDg5RDMsIDB4ODlENCwgMHg4OUQ1LAotICAgIDB4ODlENywgMHg4OUQ4LCAweDg5RDksIDB4ODlEQiwgMHg4OURELCAweDg5REYsIDB4ODlFMCwgMHg4OUUxLAotICAgIDB4ODlFMiwgMHg4OUU0LCAweDg5RTcsIDB4ODlFOCwgMHg4OUU5LCAweDg5RUEsIDB4ODlFQywgMHg4OUVELAotICAgIDB4ODlFRSwgMHg4OUYwLCAweDg5RjEsIDB4ODlGMiwgMHg4OUY1LCAweDg5RjcsIDB4ODlGOSwgMHg4OUZBLAotICAgIDB4ODlGQiwgMHg4OUZDLCAweDg5RkQsIDB4ODlGRSwgMHg4OUZGLCAweDhBMDQsIDB4OEEwNSwgMHg4QTA2LAotICAgIDB4OEEwOSwgMHg4QTBCLCAweDhBMEQsIDB4OEEwRiwgMHg4QTExLCAweDhBMTIsIDB4OEExNCwgMHg4QTE3LAotICAgIDB4OEExOSwgMHg4QTFBLCAweDhBMUMsIDB4OEExRSwgMHg4QTIwLCAweDhBMjEsIDB4OEEyMiwgMHg4QTI0LAotICAgIDB4OEEyNiwgMHg4QTI3LCAweDhBMjgsIDB4OEEyOSwgMHg4QTJCLCAweDhBMkMsIDB4OEEyRSwgMHg4QTJGLAotICAgIDB4OEEzMCwgMHg4QTMyLCAweDhBMzMsIDB4OEEzNSwgMHg4QTM3LCAweDhBMzgsIDB4OEEzOSwgMHg4QTNCLAotICAgIDB4OEEzQywgMHg4QTNELCAweDhBM0YsIDB4OEE0MCwgMHg4QTQyLCAweDhBNDMsIDB4OEE0NCwgMHg4QTQ1LAotICAgIDB4OEE0NywgMHg4QTQ5LCAweDhBNEEsIDB4OEE0QiwgMHg4QTRDLCAweDhBNEQsIDB4OEE0RiwgMHg4QTUxLAotICAgIDB4OEE1MywgMHg4QTU2LCAweDhBNTcsIDB4OEE1OSwgMHg4QTVBLCAweDhBNUMsIDB4OEE1RCwgMHg4QTVGLAotICAgIDB4OEE2MCwgMHg4QTY0LCAweDhBNjUsIDB4OEE2NywgMHg4QTY4LCAweDhBNkEsIDB4OEE2RiwgMHg4QTc0LAotICAgIDB4OEE3NiwgMHg4QTc3LCAweDhBNzgsIDB4OEE3QSwgMHg4QTdCLCAweDhBN0QsIDB4OEE3RSwgMHg4QTgwLAotICAgIDB4OEE4MSwgMHg4QTgyLCAweDhBODMsIDB4OEE4OCwgMHg4QThCLCAweDhBOEMsIDB4OEE4RSwgMHg4QThGLAotICAgIDB4OEE5MCwgMHg4QTk0LCAweDhBOTYsIDB4OEE5NywgMHg4QTk5LCAweDhBOUIsIDB4OEE5QywgMHg4QTlELAotICAgIDB4OEE5RiwgMHg4QUEyLCAweDhBQTcsIDB4OEFBOSwgMHg4QUFBLCAweDhBQUIsIDB4OEFBRCwgMHg4QUFFLAotICAgIDB4OEFBRiwgMHg4QUIxLCAweDhBQjMsIDB4OEFCNCwgMHg4QUI1LCAweDhBQjcsIDB4OEFCOCwgMHg4QUJBLAotICAgIDB4OEFCQiwgMHg4QUJELCAweDhBQkUsIDB4OEFDMCwgMHg4QUMxLCAweDhBQzMsIDB4OEFDNSwgMHg4QUM2LAotICAgIDB4OEFDOCwgMHg4QUNBLCAweDhBQ0MsIDB4OEFDRSwgMHg4QUQwLCAweDhBRDMsIDB4OEFENCwgMHg4QUQ1LAotICAgIDB4OEFEOCwgMHg4QUQ5LCAweDhBREEsIDB4OEFERCwgMHg4QURGLCAweDhBRTAsIDB4OEFFMSwgMHg4QUUzLAotICAgIDB4OEFFNSwgMHg4QUU4LCAweDhBRTksIDB4OEFFQSwgMHg4QUVDLCAweDhBRUYsIDB4OEFGMCwgMHg4QUYyLAotICAgIDB4OEFGNCwgMHg4QUY1LCAweDhBRjksIDB4OEFGQiwgMHg4QUZELCAweDhBRkYsIDB4OEIwMywgMHg4QjA2LAotICAgIDB4OEIwOCwgMHg4QjA5LCAweDhCMEIsIDB4OEIwQywgMHg4QjBELCAweDhCMEYsIDB4OEIxMSwgMHg4QjEyLAotICAgIDB4OEIxMywgMHg4QjE1LCAweDhCMTgsIDB4OEIxQywgMHg4QjFFLCAweDhCMUYsIDB4OEIyMCwgMHg4QjIyLAotICAgIDB4OEIyMywgMHg4QjI0LCAweDhCMjUsIDB4OEIyNywgMHg4QjI5LCAweDhCMkEsIDB4OEIyRSwgMHg4QjJGLAotICAgIDB4OEIzMCwgMHg4QjMxLCAweDhCMzIsIDB4OEIzNCwgMHg4QjM1LCAweDhCMzYsIDB4OEIzNywgMHg4QjM4LAotICAgIDB4OEIzQSwgMHg4QjNCLCAweDhCM0MsIDB4OEIzRCwgMHg4QjNGLCAweDhCNDAsIDB4OEI0MSwgMHg4QjQyLAotICAgIDB4OEI0MywgMHg4QjQ0LCAweDhCNDUsIDB4OEI0NiwgMHg4QjQ3LCAweDhCNDgsIDB4OEI0QSwgMHg4QjRCLAotICAgIDB4OEI0QywgMHg4QjRELCAweDhCNTAsIDB4OEI1MSwgMHg4QjUyLCAweDhCNTMsIDB4OEI1NCwgMHg4QjU1LAotICAgIDB4OEI1NywgMHg4QjVCLCAweDhCNUQsIDB4OEI1RSwgMHg4QjVGLCAweDhCNjAsIDB4OEI2MSwgMHg4QjYyLAotICAgIDB4OEI2MywgMHg4QjY0LCAweDhCNjUsIDB4OEI2NywgMHg4QjY4LCAweDhCNjksIDB4OEI2QSwgMHg4QjZELAotICAgIDB4OEI2RSwgMHg4QjcxLCAweDhCNzIsIDB4OEI3MywgMHg4Qjc1LCAweDhCNzYsIDB4OEI3OCwgMHg4Qjc5LAotICAgIDB4OEI3QSwgMHg4QjdCLCAweDhCN0MsIDB4OEI3RSwgMHg4QjdGLCAweDhCODEsIDB4OEI4MiwgMHg4QjgzLAotICAgIDB4OEI4NCwgMHg4Qjg1LCAweDhCODYsIDB4OEI4NywgMHg4Qjg4LCAweDhCODksIDB4OEI4QiwgMHg4QjhDLAotICAgIDB4OEI4RCwgMHg4QjhGLCAweDhCOTAsIDB4OEI5MSwgMHg4Qjk0LCAweDhCOTcsIDB4OEI5OCwgMHg4Qjk5LAotICAgIDB4OEI5QSwgMHg4QjlCLCAweDhCOUQsIDB4OEI5RiwgMHg4QkFDLCAweDhCQjEsIDB4OEJCQiwgMHg4QkM3LAotICAgIDB4OEJEMCwgMHg4QkVBLCAweDhDMDksIDB4OEMxRSwgMHg4QzM4LCAweDhDMzksIDB4OEMzQSwgMHg4QzNCLAotICAgIDB4OEMzQywgMHg4QzNELCAweDhDM0UsIDB4OEMzRiwgMHg4QzQwLCAweDhDNDIsIDB4OEM0MywgMHg4QzQ0LAotICAgIDB4OEM0NSwgMHg4QzRBLCAweDhDNEIsIDB4OEM0RCwgMHg4QzRFLCAweDhDNEYsIDB4OEM1MSwgMHg4QzUyLAotICAgIDB4OEM1MywgMHg4QzU0LCAweDhDNTYsIDB4OEM1NywgMHg4QzU4LCAweDhDNTksIDB4OEM1QiwgMHg4QzVDLAotICAgIDB4OEM1RCwgMHg4QzVFLCAweDhDNUYsIDB4OEM2MCwgMHg4QzYzLCAweDhDNjQsIDB4OEM2NSwgMHg4QzY2LAotICAgIDB4OEM2NywgMHg4QzY4LCAweDhDNjksIDB4OEM2QywgMHg4QzZELCAweDhDNkUsIDB4OEM2RiwgMHg4QzcwLAotICAgIDB4OEM3MSwgMHg4QzcyLCAweDhDNzQsIDB4OEM3NSwgMHg4Qzc2LCAweDhDNzcsIDB4OEM3QiwgMHg4QzdDLAotICAgIDB4OEM3RCwgMHg4QzdFLCAweDhDN0YsIDB4OEM4MCwgMHg4QzgxLCAweDhDODMsIDB4OEM4NCwgMHg4Qzg2LAotICAgIDB4OEM4NywgMHg4Qzg4LCAweDhDOEIsIDB4OEM4RCwgMHg4QzhFLCAweDhDOEYsIDB4OEM5MCwgMHg4QzkxLAotICAgIDB4OEM5MiwgMHg4QzkzLCAweDhDOTUsIDB4OEM5NiwgMHg4Qzk3LCAweDhDOTksIDB4OEM5QSwgMHg4QzlCLAotICAgIDB4OEM5QywgMHg4QzlGLCAweDhDQTMsIDB4OENBNCwgMHg4Q0E1LCAweDhDQTYsIDB4OENBRCwgMHg4Q0FFLAotICAgIDB4OENCMSwgMHg4Q0I1LCAweDhDQjksIDB4OENCRSwgMHg4Q0M2LCAweDhDQzksIDB4OENDQiwgMHg4Q0NDLAotICAgIDB4OENDRCwgMHg4Q0NFLCAweDhDQ0YsIDB4OENEMCwgMHg4Q0Q0LCAweDhDRDYsIDB4OENENywgMHg4Q0Q4LAotICAgIDB4OENEOSwgMHg4Q0RCLCAweDhDREQsIDB4OENERiwgMHg4Q0U1LCAweDhDRTgsIDB4OENFOSwgMHg4Q0VFLAotICAgIDB4OENFRiwgMHg4Q0YwLCAweDhDRjEsIDB4OENGMiwgMHg4Q0YzLCAweDhDRjUsIDB4OENGNiwgMHg4Q0Y3LAotICAgIDB4OENGOCwgMHg4Q0Y5LCAweDhDRkYsIDB4OEQwMCwgMHg4RDAxLCAweDhEMDIsIDB4OEQwMywgMHg4RDA2LAotICAgIDB4OEQwNywgMHg4RDA5LCAweDhEMEMsIDB4OEQwRSwgMHg4RDExLCAweDhEMTIsIDB4OEQxMywgMHg4RDE0LAotICAgIDB4OEQxNSwgMHg4RDE3LCAweDhEMTgsIDB4OEQxOSwgMHg4RDFBLCAweDhEMjAsIDB4OEQ1MSwgMHg4RDUyLAotICAgIDB4OEQ1NywgMHg4RDVGLCAweDhENjUsIDB4OEQ2OCwgMHg4RDY5LCAweDhENkEsIDB4OEQ2QywgMHg4RDZFLAotICAgIDB4OEQ2RiwgMHg4RDcxLCAweDhENzIsIDB4OEQ3OCwgMHg4RDc5LCAweDhEN0EsIDB4OEQ3QiwgMHg4RDdDLAotICAgIDB4OEQ3RCwgMHg4RDdFLCAweDhEN0YsIDB4OEQ4MCwgMHg4RDgyLCAweDhEODMsIDB4OEQ4NiwgMHg4RDg3LAotICAgIDB4OEQ4OCwgMHg4RDg5LCAweDhEOEMsIDB4OEQ4RCwgMHg4RDhFLCAweDhEOEYsIDB4OEQ5MCwgMHg4RDkyLAotICAgIDB4OEQ5MywgMHg4RDk2LCAweDhEOTcsIDB4OEQ5OCwgMHg4RDlBLCAweDhEOUIsIDB4OEQ5QywgMHg4RDlELAotICAgIDB4OEQ5RSwgMHg4REEwLCAweDhEQTEsIDB4OERBMiwgMHg4REE0LCAweDhEQTUsIDB4OERBNiwgMHg4REE3LAotICAgIDB4OERBOSwgMHg4REFBLCAweDhEQUIsIDB4OERBQywgMHg4REFELCAweDhEQUUsIDB4OERBRiwgMHg4REIwLAotICAgIDB4OERCNiwgMHg4REI3LCAweDhEQjksIDB4OERCQiwgMHg4REJELCAweDhEQzAsIDB4OERDMSwgMHg4REMyLAotICAgIDB4OERDNSwgMHg4REM3LCAweDhEQzgsIDB4OERDOSwgMHg4RENBLCAweDhEQ0QsIDB4OEREMCwgMHg4REQyLAotICAgIDB4OEREMywgMHg4REQ0LCAweDhERDUsIDB4OEREOCwgMHg4REQ5LCAweDhEREMsIDB4OERFMCwgMHg4REUxLAotICAgIDB4OERFMiwgMHg4REU1LCAweDhERTYsIDB4OERFNywgMHg4REU5LCAweDhERUQsIDB4OERFRSwgMHg4REYwLAotICAgIDB4OERGMSwgMHg4REYyLCAweDhERjQsIDB4OERGNiwgMHg4REZDLCAweDhERkUsIDB4OERGRiwgMHg4RTAwLAotICAgIDB4OEUwMSwgMHg4RTAyLCAweDhFMDMsIDB4OEUwNCwgMHg4RTA2LCAweDhFMDcsIDB4OEUwOCwgMHg4RTBCLAotICAgIDB4OEUwRCwgMHg4RTBFLCAweDhFMTEsIDB4OEUxMiwgMHg4RTEzLCAweDhFMTUsIDB4OEUxNiwgMHg4RTE3LAotICAgIDB4OEUxOCwgMHg4RTE5LCAweDhFMUEsIDB4OEUxQiwgMHg4RTFDLCAweDhFMjAsIDB4OEUyMSwgMHg4RTI0LAotICAgIDB4OEUyNSwgMHg4RTI2LCAweDhFMjcsIDB4OEUyOCwgMHg4RTJCLCAweDhFMkQsIDB4OEUzMCwgMHg4RTMyLAotICAgIDB4OEUzMywgMHg4RTM2LCAweDhFMzcsIDB4OEUzOCwgMHg4RTNCLCAweDhFM0MsIDB4OEUzRSwgMHg4RTNGLAotICAgIDB4OEU0MywgMHg4RTQ1LCAweDhFNDYsIDB4OEU0RCwgMHg4RTRFLCAweDhFNEYsIDB4OEU1MCwgMHg4RTUzLAotICAgIDB4OEU1NCwgMHg4RTU2LCAweDhFNTcsIDB4OEU1OCwgMHg4RTVBLCAweDhFNUIsIDB4OEU1QywgMHg4RTVELAotICAgIDB4OEU1RSwgMHg4RTVGLCAweDhFNjAsIDB4OEU2MSwgMHg4RTYyLCAweDhFNjQsIDB4OEU2NSwgMHg4RTY3LAotICAgIDB4OEU2OCwgMHg4RTZBLCAweDhFNkIsIDB4OEU2RSwgMHg4RTcxLCAweDhFNzMsIDB4OEU3NSwgMHg4RTc3LAotICAgIDB4OEU3OCwgMHg4RTc5LCAweDhFN0IsIDB4OEU3RCwgMHg4RTdFLCAweDhFODAsIDB4OEU4MiwgMHg4RTgzLAotICAgIDB4OEU4NCwgMHg4RTg2LCAweDhFODgsIDB4OEU4QywgMHg4RThFLCAweDhFOTUsIDB4OEU5NiwgMHg4RTk3LAotICAgIDB4OEU5OCwgMHg4RTk5LCAweDhFOUIsIDB4OEU5RCwgMHg4RTlGLCAweDhFQTAsIDB4OEVBMiwgMHg4RUEzLAotICAgIDB4OEVBNCwgMHg4RUE3LCAweDhFQTgsIDB4OEVBOSwgMHg4RUFELCAweDhFQUUsIDB4OEVCMCwgMHg4RUIxLAotICAgIDB4OEVCMywgMHg4RUI0LCAweDhFQjUsIDB4OEVCNiwgMHg4RUI3LCAweDhFQjgsIDB4OEVCOSwgMHg4RUJCLAotICAgIDB4OEVCQywgMHg4RUJELCAweDhFQkUsIDB4OEVCRiwgMHg4RUMxLCAweDhFQzIsIDB4OEVDMywgMHg4RUM0LAotICAgIDB4OEVDNSwgMHg4RUM2LCAweDhFQzcsIDB4OEVDOCwgMHg4RUM5LCAweDhFQ0YsIDB4OEVEMCwgMHg4RUQxLAotICAgIDB4OEVEMywgMHg4RUQ1LCAweDhFRDYsIDB4OEVENywgMHg4RUQ4LCAweDhFRDksIDB4OEVEQSwgMHg4RURDLAotICAgIDB4OEVERCwgMHg4RURFLCAweDhFRTAsIDB4OEVFMSwgMHg4RUUyLCAweDhFRTMsIDB4OEVFNSwgMHg4RUU2LAotICAgIDB4OEVFNywgMHg4RUU4LCAweDhFRTksIDB4OEVFQSwgMHg4RUVDLCAweDhFRUQsIDB4OEVFRSwgMHg4RUVGLAotICAgIDB4OEVGMCwgMHg4RUYxLCAweDhFRjMsIDB4OEVGNCwgMHg4RUY1LCAweDhFRjYsIDB4OEVGNywgMHg4RUZELAotICAgIDB4OEVGRiwgMHg4RjAwLCAweDhGMDEsIDB4OEYwMiwgMHg4RjA0LCAweDhGMDYsIDB4OEYwOCwgMHg4RjBCLAotICAgIDB4OEYwQywgMHg4RjBELCAweDhGMEUsIDB4OEYwRiwgMHg4RjEwLCAweDhGMTEsIDB4OEYxMywgMHg4RjE2LAotICAgIDB4OEYxNywgMHg4RjE4LCAweDhGMTksIDB4OEYxQSwgMHg4RjIwLCAweDhGMjEsIDB4OEYyMiwgMHg4RjIzLAotICAgIDB4OEYyNCwgMHg4RjI3LCAweDhGMjgsIDB4OEYyQiwgMHg4RjJDLCAweDhGMkQsIDB4OEYyRSwgMHg4RjMwLAotICAgIDB4OEYzMSwgMHg4RjMyLCAweDhGMzQsIDB4OEYzNSwgMHg4RjM2LCAweDhGMzcsIDB4OEYzOSwgMHg4RjNBLAotICAgIDB4OEYzQywgMHg4RjNELCAweDhGNDAsIDB4OEY0MSwgMHg4RjQzLCAweDhGNDcsIDB4OEY0OCwgMHg4RjRBLAotICAgIDB4OEY0QiwgMHg4RjRDLCAweDhGNEYsIDB4OEY1MCwgMHg4RjUxLCAweDhGNTIsIDB4OEY1MywgMHg4RjU1LAotICAgIDB4OEY1NiwgMHg4RjU3LCAweDhGNTgsIDB4OEY1OSwgMHg4RjVBLCAweDhGNUIsIDB4OEY1QywgMHg4RjVELAotICAgIDB4OEY1RSwgMHg4RjYwLCAweDhGNjMsIDB4OEY2NSwgMHg4RjZBLCAweDhGODAsIDB4OEY4QywgMHg4RjkyLAotICAgIDB4OEY5RCwgMHg4RkEwLCAweDhGQTEsIDB4OEZBMiwgMHg4RkE0LCAweDhGQTUsIDB4OEZBNywgMHg4RkFBLAotICAgIDB4OEZBQywgMHg4RkIzLCAweDhGQjQsIDB4OEZCNSwgMHg4RkI3LCAweDhGQjgsIDB4OEZCQSwgMHg4RkJCLAotICAgIDB4OEZCQywgMHg4RkJGLCAweDhGQzAsIDB4OEZDMywgMHg4RkM2LCAweDhGQzksIDB4OEZDQSwgMHg4RkNCLAotICAgIDB4OEZDQywgMHg4RkNELCAweDhGQ0YsIDB4OEZEMiwgMHg4RkQ2LCAweDhGRDcsIDB4OEZEQSwgMHg4RkUwLAotICAgIDB4OEZFMSwgMHg4RkUzLCAweDhGRTcsIDB4OEZFQywgMHg4RkVGLCAweDhGRjEsIDB4OEZGMiwgMHg4RkY1LAotICAgIDB4OEZGNiwgMHg4RkZBLCAweDhGRkIsIDB4OEZGQywgMHg4RkZFLCAweDhGRkYsIDB4OTAwNywgMHg5MDA4LAotICAgIDB4OTAwQywgMHg5MDBFLCAweDkwMTMsIDB4OTAxOCwgMHg5MDFDLCAweDkwMjQsIDB4OTAyNSwgMHg5MDI3LAotICAgIDB4OTAyOCwgMHg5MDI5LCAweDkwMkEsIDB4OTAyQiwgMHg5MDJDLCAweDkwMzAsIDB4OTAzMSwgMHg5MDMzLAotICAgIDB4OTAzNCwgMHg5MDM3LCAweDkwMzksIDB4OTAzQSwgMHg5MDNELCAweDkwM0YsIDB4OTA0MCwgMHg5MDQzLAotICAgIDB4OTA0NSwgMHg5MDQ2LCAweDkwNDgsIDB4OTA0OSwgMHg5MDRBLCAweDkwNEMsIDB4OTA1NiwgMHg5MDU5LAotICAgIDB4OTA1QSwgMHg5MDVELCAweDkwNUYsIDB4OTA2MSwgMHg5MDY0LCAweDkwNjYsIDB4OTA2NywgMHg5MDZBLAotICAgIDB4OTA2QiwgMHg5MDZDLCAweDkwNkYsIDB4OTA3MCwgMHg5MDcxLCAweDkwNzMsIDB4OTA3NiwgMHg5MDc5LAotICAgIDB4OTA3QiwgMHg5MDdFLCAweDkwODUsIDB4OTA4NiwgMHg5MDg5LCAweDkwOEMsIDB4OTA4RCwgMHg5MDhFLAotICAgIDB4OTA5MiwgMHg5MDk0LCAweDkwOTYsIDB4OTA5OCwgMHg5MDlBLCAweDkwOUMsIDB4OTA5RSwgMHg5MDlGLAotICAgIDB4OTBBMCwgMHg5MEE0LCAweDkwQTUsIDB4OTBBNywgMHg5MEE4LCAweDkwQTksIDB4OTBBQiwgMHg5MEFELAotICAgIDB4OTBCMiwgMHg5MEI3LCAweDkwQkMsIDB4OTBCRCwgMHg5MEJGLCAweDkwQzAsIDB4OTBDMiwgMHg5MEMzLAotICAgIDB4OTBDNiwgMHg5MEM4LCAweDkwQzksIDB4OTBDQiwgMHg5MENDLCAweDkwQ0QsIDB4OTBEMiwgMHg5MEQ0LAotICAgIDB4OTBENSwgMHg5MEQ2LCAweDkwRDgsIDB4OTBEOSwgMHg5MERBLCAweDkwREUsIDB4OTBFMCwgMHg5MEUzLAotICAgIDB4OTBFNCwgMHg5MEU1LCAweDkwRTksIDB4OTBFQSwgMHg5MEVDLCAweDkwRUUsIDB4OTBGMCwgMHg5MEYxLAotICAgIDB4OTBGMiwgMHg5MEYzLCAweDkwRjYsIDB4OTBGNywgMHg5MEY5LCAweDkwRkEsIDB4OTBGQiwgMHg5MEZDLAotICAgIDB4OTBGRiwgMHg5MTAwLCAweDkxMDEsIDB4OTEwMywgMHg5MTA1LCAweDkxMDcsIDB4OTEwOCwgMHg5MTBBLAotICAgIDB4OTEwQiwgMHg5MTBDLCAweDkxMEQsIDB4OTEwRSwgMHg5MTBGLCAweDkxMTAsIDB4OTExMSwgMHg5MTEzLAotICAgIDB4OTExNSwgMHg5MTE3LCAweDkxMTgsIDB4OTExQSwgMHg5MTFCLCAweDkxMUMsIDB4OTExRCwgMHg5MTFGLAotICAgIDB4OTEyMCwgMHg5MTIxLCAweDkxMjQsIDB4OTEyNSwgMHg5MTI2LCAweDkxMjgsIDB4OTEyOSwgMHg5MTJBLAotICAgIDB4OTEyQiwgMHg5MTJDLCAweDkxMkUsIDB4OTEzMywgMHg5MTM1LCAweDkxMzcsIDB4OTEzOCwgMHg5MTNCLAotICAgIDB4OTEzQywgMHg5MTNELCAweDkxM0UsIDB4OTEzRiwgMHg5MTQwLCAweDkxNDEsIDB4OTE0MiwgMHg5MTQ0LAotICAgIDB4OTE0NSwgMHg5MTQ3LCAweDkxNTEsIDB4OTE1MywgMHg5MTU0LCAweDkxNTUsIDB4OTE1NiwgMHg5MTU4LAotICAgIDB4OTE1OSwgMHg5MTVCLCAweDkxNUMsIDB4OTE1RiwgMHg5MTYwLCAweDkxNjYsIDB4OTE2NywgMHg5MTY4LAotICAgIDB4OTE2QiwgMHg5MTZELCAweDkxNzMsIDB4OTE3QSwgMHg5MTdCLCAweDkxN0MsIDB4OTE4MCwgMHg5MTgxLAotICAgIDB4OTE4MiwgMHg5MTgzLCAweDkxODQsIDB4OTE4NiwgMHg5MTg4LCAweDkxOEEsIDB4OTE4RSwgMHg5MThGLAotICAgIDB4OTE5MywgMHg5MTk0LCAweDkxOTUsIDB4OTE5NywgMHg5MTk4LCAweDkxOTksIDB4OTE5RCwgMHg5MTlFLAotICAgIDB4OTE5RiwgMHg5MUEwLCAweDkxQTEsIDB4OTFBNCwgMHg5MUE1LCAweDkxQTYsIDB4OTFBNywgMHg5MUE4LAotICAgIDB4OTFBOSwgMHg5MUIwLCAweDkxQjEsIDB4OTFCMiwgMHg5MUIzLCAweDkxQjYsIDB4OTFCNywgMHg5MUI4LAotICAgIDB4OTFCOSwgMHg5MUJCLCAweDkxQkMsIDB4OTFCRCwgMHg5MUJFLCAweDkxQkYsIDB4OTFDMiwgMHg5MUM0LAotICAgIDB4OTFDNiwgMHg5MUM4LCAweDkxRDAsIDB4OTFENiwgMHg5MURBLCAweDkxREIsIDB4OTFERSwgMHg5MURGLAotICAgIDB4OTFFMCwgMHg5MUUxLCAweDkxRTIsIDB4OTFFNSwgMHg5MUU2LCAweDkxRTgsIDB4OTFFQSwgMHg5MUVCLAotICAgIDB4OTFFQywgMHg5MUVELCAweDkxRUUsIDB4OTFFRiwgMHg5MUYwLCAweDkxRjEsIDB4OTFGMiwgMHg5MUYzLAotICAgIDB4OTFGNCwgMHg5MUY2LCAweDkxRjgsIDB4OTFGQiwgMHg5MUZDLCAweDkxRkQsIDB4OTFGRSwgMHg5MUZGLAotICAgIDB4OTIwMiwgMHg5MjAzLCAweDkyMDUsIDB4OTIwNiwgMHg5MjA3LCAweDkyMEEsIDB4OTIwQiwgMHg5MjBDLAotICAgIDB4OTIwRiwgMHg5MjEyLCAweDkyMTMsIDB4OTIxNiwgMHg5MjE3LCAweDkyMTgsIDB4OTIxOSwgMHg5MjFBLAotICAgIDB4OTIxQiwgMHg5MjFDLCAweDkyMUQsIDB4OTIxRiwgMHg5MjIwLCAweDkyMjEsIDB4OTIyMiwgMHg5MjI0LAotICAgIDB4OTIyOCwgMHg5MjI5LCAweDkyMkEsIDB4OTIyQiwgMHg5MjJDLCAweDkyMkQsIDB4OTIyRiwgMHg5MjMxLAotICAgIDB4OTIzMiwgMHg5MjM1LCAweDkyMzYsIDB4OTIzQiwgMHg5MjNDLCAweDkyNDEsIDB4OTI0MiwgMHg5MjQzLAotICAgIDB4OTI0NCwgMHg5MjQ2LCAweDkyNDcsIDB4OTI0QSwgMHg5MjRCLCAweDkyNEMsIDB4OTI0RSwgMHg5MjRGLAotICAgIDB4OTI1MCwgMHg5MjUyLCAweDkyNTMsIDB4OTI1NCwgMHg5MjU2LCAweDkyNTgsIDB4OTI1OSwgMHg5MjVDLAotICAgIDB4OTI1RCwgMHg5MjVGLCAweDkyNjAsIDB4OTI2MSwgMHg5MjYzLCAweDkyNjQsIDB4OTI2NSwgMHg5MjY3LAotICAgIDB4OTI2OCwgMHg5MjY5LCAweDkyNkEsIDB4OTI2QiwgMHg5MjZFLCAweDkyNkYsIDB4OTI3MCwgMHg5MjcxLAotICAgIDB4OTI3MiwgMHg5MjczLCAweDkyNzUsIDB4OTI3NiwgMHg5Mjc3LCAweDkyNzksIDB4OTI3QywgMHg5MjdELAotICAgIDB4OTI3RSwgMHg5MjgxLCAweDkyODIsIDB4OTI4NCwgMHg5Mjg2LCAweDkyODcsIDB4OTI4OCwgMHg5Mjg5LAotICAgIDB4OTI4QSwgMHg5MjhCLCAweDkyOEMsIDB4OTI4RCwgMHg5MjhGLCAweDkyOTAsIDB4OTI5MiwgMHg5Mjk0LAotICAgIDB4OTI5NSwgMHg5Mjk3LCAweDkyOTksIDB4OTI5QiwgMHg5MjlELCAweDkyOUUsIDB4OTI5RiwgMHg5MkExLAotICAgIDB4OTJBMiwgMHg5MkE0LCAweDkyQTcsIDB4OTJBRCwgMHg5MkFGLCAweDkyQjAsIDB4OTJCMiwgMHg5MkIzLAotICAgIDB4OTJCNCwgMHg5MkI1LCAweDkyQjYsIDB4OTJCOCwgMHg5MkJBLCAweDkyQkQsIDB4OTJCRSwgMHg5MkJGLAotICAgIDB4OTJDMCwgMHg5MkMyLCAweDkyQzQsIDB4OTJDNiwgMHg5MkM5LCAweDkyQ0EsIDB4OTJDQiwgMHg5MkNELAotICAgIDB4OTJDRSwgMHg5MkQwLCAweDkyRDEsIDB4OTJEMywgMHg5MkQ0LCAweDkyRDUsIDB4OTJENiwgMHg5MkQ3LAotICAgIDB4OTJEOCwgMHg5MkQ5LCAweDkyREEsIDB4OTJEQiwgMHg5MkRDLCAweDkyREUsIDB4OTJFMCwgMHg5MkUxLAotICAgIDB4OTJFMiwgMHg5MkU3LCAweDkyRTksIDB4OTJFQiwgMHg5MkVDLCAweDkyRjIsIDB4OTJGMywgMHg5MkY0LAotICAgIDB4OTJGNSwgMHg5MkY3LCAweDkyRjksIDB4OTJGQSwgMHg5MkZCLCAweDkyRkQsIDB4OTJGRSwgMHg5MkZGLAotICAgIDB4OTMwMCwgMHg5MzAyLCAweDkzMDMsIDB4OTMwNCwgMHg5MzA1LCAweDkzMDksIDB4OTMwQSwgMHg5MzBCLAotICAgIDB4OTMwQywgMHg5MzBELCAweDkzMEUsIDB4OTMwRiwgMHg5MzExLCAweDkzMTMsIDB4OTMxNCwgMHg5MzE2LAotICAgIDB4OTMxNywgMHg5MzFDLCAweDkzMUQsIDB4OTMxRSwgMHg5MzIxLCAweDkzMjMsIDB4OTMyNCwgMHg5MzI1LAotICAgIDB4OTMyNywgMHg5MzI5LCAweDkzMkEsIDB4OTMyQywgMHg5MzJELCAweDkzMzAsIDB4OTMzMSwgMHg5MzM0LAotICAgIDB4OTMzNSwgMHg5MzM3LCAweDkzMzksIDB4OTMzQSwgMHg5MzNCLCAweDkzM0MsIDB4OTMzRCwgMHg5MzNGLAotICAgIDB4OTM0MiwgMHg5MzQ0LCAweDkzNDUsIDB4OTM0OCwgMHg5MzQ5LCAweDkzNEEsIDB4OTM0QywgMHg5MzRFLAotICAgIDB4OTM0RiwgMHg5MzUwLCAweDkzNTEsIDB4OTM1MiwgMHg5MzUzLCAweDkzNTUsIDB4OTM1NiwgMHg5MzU3LAotICAgIDB4OTM1OSwgMHg5MzVBLCAweDkzNUMsIDB4OTM1RCwgMHg5MzVFLCAweDkzNUYsIDB4OTM2MCwgMHg5MzYxLAotICAgIDB4OTM2MiwgMHg5MzYzLCAweDkzNjYsIDB4OTM2NywgMHg5MzY4LCAweDkzNkIsIDB4OTM2RCwgMHg5MzZFLAotICAgIDB4OTM2RiwgMHg5MzcxLCAweDkzNzIsIDB4OTM3MywgMHg5Mzc0LCAweDkzNzcsIDB4OTM3OCwgMHg5Mzc5LAotICAgIDB4OTM3QiwgMHg5MzdDLCAweDkzN0QsIDB4OTM3RiwgMHg5MzgwLCAweDkzODEsIDB4OTM4MywgMHg5Mzg1LAotICAgIDB4OTM4NiwgMHg5Mzg4LCAweDkzODksIDB4OTM4QiwgMHg5MzhDLCAweDkzOEQsIDB4OTM4RSwgMHg5MzkwLAotICAgIDB4OTM5MSwgMHg5MzkyLCAweDkzOTMsIDB4OTM5NCwgMHg5Mzk1LCAweDkzOTcsIDB4OTM5OSwgMHg5MzlBLAotICAgIDB4OTM5QiwgMHg5MzlDLCAweDkzOUQsIDB4OTM5RSwgMHg5MzlGLCAweDkzQTAsIDB4OTNBMSwgMHg5M0E0LAotICAgIDB4OTNBNSwgMHg5M0E4LCAweDkzQUIsIDB4OTNBRCwgMHg5M0FGLCAweDkzQjEsIDB4OTNCMiwgMHg5M0I0LAotICAgIDB4OTNCNiwgMHg5M0I3LCAweDkzQjksIDB4OTNCQSwgMHg5M0JCLCAweDkzQkMsIDB4OTNCRCwgMHg5M0JFLAotICAgIDB4OTNDMCwgMHg5M0MxLCAweDkzQzIsIDB4OTNDNCwgMHg5M0M1LCAweDkzQzYsIDB4OTNDOSwgMHg5M0NCLAotICAgIDB4OTNDRSwgMHg5M0NGLCAweDkzRDAsIDB4OTNEMiwgMHg5M0QzLCAweDkzRDQsIDB4OTNENSwgMHg5M0Q5LAotICAgIDB4OTNEQSwgMHg5M0RCLCAweDkzRTAsIDB4OTNFMywgMHg5M0U1LCAweDkzRTYsIDB4OTNFNywgMHg5M0U5LAotICAgIDB4OTNFQSwgMHg5M0VCLCAweDkzRUMsIDB4OTNFRCwgMHg5M0VFLCAweDkzRUYsIDB4OTNGMCwgMHg5M0YxLAotICAgIDB4OTNGMiwgMHg5M0YzLCAweDkzRjQsIDB4OTNGNiwgMHg5M0Y4LCAweDkzRkEsIDB4OTNGQiwgMHg5M0ZDLAotICAgIDB4OTNGRCwgMHg5M0ZFLCAweDkzRkYsIDB4OTQwMCwgMHg5NDAxLCAweDk0MDIsIDB4OTQwNCwgMHg5NDA1LAotICAgIDB4OTQwNiwgMHg5NDA3LCAweDk0MDgsIDB4OTQwOSwgMHg5NDBBLCAweDk0MEMsIDB4OTQwRCwgMHg5NDBFLAotICAgIDB4OTQwRiwgMHg5NDExLCAweDk0MTUsIDB4OTQxNiwgMHg5NDE3LCAweDk0MUEsIDB4OTQxQiwgMHg5NDFDLAotICAgIDB4OTQxRSwgMHg5NDFGLCAweDk0MjEsIDB4OTQyMiwgMHg5NDIzLCAweDk0MjQsIDB4OTQyNSwgMHg5NDI5LAotICAgIDB4OTQyQSwgMHg5NDJCLCAweDk0MkMsIDB4OTQyRCwgMHg5NDJGLCAweDk0MzAsIDB4OTQzMSwgMHg5NDM0LAotICAgIDB4OTQzNiwgMHg5NDM3LCAweDk0MzksIDB4OTQzQiwgMHg5NDNDLCAweDk0M0QsIDB4OTQ0MCwgMHg5NDQxLAotICAgIDB4OTQ0MiwgMHg5NDQzLCAweDk0NDUsIDB4OTQ0NiwgMHg5NDQ3LCAweDk0NDgsIDB4OTQ0OSwgMHg5NDRCLAotICAgIDB4OTQ0RCwgMHg5NDRFLCAweDk0NEYsIDB4OTQ1MCwgMHg5NDUxLCAweDk0NTMsIDB4OTQ1NSwgMHg5NDU2LAotICAgIDB4OTQ1NywgMHg5NDU4LCAweDk0NTksIDB4OTQ1QSwgMHg5NDVCLCAweDk0NUMsIDB4OTQ1RCwgMHg5NDVFLAotICAgIDB4OTQ1RiwgMHg5NDYxLCAweDk0NjIsIDB4OTQ2NCwgMHg5NDY2LCAweDk0NjcsIDB4OTQ2OCwgMHg5NDY5LAotICAgIDB4OTQ2QSwgMHg5NDZDLCAweDk0NkUsIDB4OTQ2RiwgMHg5NDcxLCAweDk0NzMsIDB4OTQ3NCwgMHg5NDc1LAotICAgIDB4OTQ3NiwgMHg5NDc4LCAweDk0N0EsIDB4OTQ3QiwgMHg5NDgwLCAweDk0ODEsIDB4OTQ4MiwgMHg5NDgzLAotICAgIDB4OTQ4NCwgMHg5NDkxLCAweDk0OTYsIDB4OTQ5OCwgMHg5NEM3LCAweDk0Q0YsIDB4OTREMywgMHg5NEQ0LAotICAgIDB4OTREQSwgMHg5NEU2LCAweDk0RkIsIDB4OTUxQywgMHg5NTIwLCAweDk1MjcsIDB4OTUzMywgMHg5NTNELAotICAgIDB4OTU0MywgMHg5NTQ4LCAweDk1NEIsIDB4OTU1NSwgMHg5NTVBLCAweDk1NjAsIDB4OTU2RSwgMHg5NTc0LAotICAgIDB4OTU3NSwgMHg5NTc4LCAweDk1NzksIDB4OTU3QSwgMHg5NTdCLCAweDk1N0MsIDB4OTU3RCwgMHg5NTdFLAotICAgIDB4OTU4MSwgMHg5NTg0LCAweDk1ODUsIDB4OTU4NywgMHg5NTg4LCAweDk1OEEsIDB4OTU4RCwgMHg5NTkwLAotICAgIDB4OTU5MiwgMHg5NTk1LCAweDk1OTYsIDB4OTU5NywgMHg5NTk5LCAweDk1OUEsIDB4OTU5QiwgMHg5NTlDLAotICAgIDB4OTU5RCwgMHg5NTlFLCAweDk1OUYsIDB4OTVBMCwgMHg5NUEyLCAweDk1QTYsIDB4OTVBNywgMHg5NUFBLAotICAgIDB4OTVBRSwgMHg5NUFGLCAweDk1QjAsIDB4OTVCMSwgMHg5NUIzLCAweDk1QjQsIDB4OTVCNSwgMHg5NUI3LAotICAgIDB4OTVCOCwgMHg5NUJBLCAweDk1QzAsIDB4OTVDMSwgMHg5NUMyLCAweDk1QzQsIDB4OTVDNSwgMHg5NUM3LAotICAgIDB4OTVDOSwgMHg5NUNELCAweDk1Q0UsIDB4OTVDRiwgMHg5NUQxLCAweDk1RDIsIDB4OTVEMywgMHg5NUQ3LAotICAgIDB4OTVEOCwgMHg5NUQ5LCAweDk1REEsIDB4OTVEQiwgMHg5NURELCAweDk1REYsIDB4OTVFMCwgMHg5NUUzLAotICAgIDB4OTVFNCwgMHg5NUU2LCAweDk1RTcsIDB4OTVFQywgMHg5NUZGLCAweDk2MDcsIDB4OTYxMywgMHg5NjE4LAotICAgIDB4OTYxQiwgMHg5NjFFLCAweDk2MjAsIDB4OTYyMywgMHg5NjI0LCAweDk2MjUsIDB4OTYyNiwgMHg5NjI3LAotICAgIDB4OTYyOCwgMHg5NjI5LCAweDk2MkIsIDB4OTYyQywgMHg5NjJELCAweDk2MkYsIDB4OTYzMCwgMHg5NjM3LAotICAgIDB4OTYzOCwgMHg5NjM5LCAweDk2M0EsIDB4OTYzRSwgMHg5NjQxLCAweDk2NDMsIDB4OTY0QSwgMHg5NjRFLAotICAgIDB4OTY0RiwgMHg5NjUxLCAweDk2NTIsIDB4OTY1MywgMHg5NjU2LCAweDk2NTcsIDB4OTY1OSwgMHg5NjVBLAotICAgIDB4OTY1QywgMHg5NjVFLCAweDk2NjAsIDB4OTY2NSwgMHg5NjY2LCAweDk2NkIsIDB4OTY2RCwgMHg5NjZFLAotICAgIDB4OTY2RiwgMHg5NjcxLCAweDk2NzksIDB4OTY3QSwgMHg5NjdCLCAweDk2N0MsIDB4OTY3RSwgMHg5NjdGLAotICAgIDB4OTY4MCwgMHg5NjgxLCAweDk2ODIsIDB4OTY4MywgMHg5Njg0LCAweDk2ODcsIDB4OTY4OSwgMHg5NjhDLAotICAgIDB4OTY5MSwgMHg5NjkyLCAweDk2OTMsIDB4OTY5NiwgMHg5NjlBLCAweDk2OUQsIDB4OTY5RSwgMHg5NjlGLAotICAgIDB4OTZBMCwgMHg5NkExLCAweDk2QTIsIDB4OTZBMywgMHg5NkE0LCAweDk2QTUsIDB4OTZBNiwgMHg5NkE5LAotICAgIDB4OTZBQiwgMHg5NkFDLCAweDk2QUQsIDB4OTZBRSwgMHg5NkFGLCAweDk2QjIsIDB4OTZCNSwgMHg5NkI3LAotICAgIDB4OTZCQSwgMHg5NkJGLCAweDk2QzIsIDB4OTZDMywgMHg5NkM4LCAweDk2Q0EsIDB4OTZDQiwgMHg5NkQwLAotICAgIDB4OTZEMSwgMHg5NkQzLCAweDk2RDQsIDB4OTZENywgMHg5NkQ4LCAweDk2REEsIDB4OTZERCwgMHg5NkRFLAotICAgIDB4OTZERiwgMHg5NkUxLCAweDk2RTQsIDB4OTZFNSwgMHg5NkU2LCAweDk2RTcsIDB4OTZFQiwgMHg5NkVDLAotICAgIDB4OTZFRCwgMHg5NkVFLCAweDk2RjAsIDB4OTZGMSwgMHg5NkY0LCAweDk2RjUsIDB4OTZGOCwgMHg5NkZBLAotICAgIDB4OTZGQywgMHg5NkZELCAweDk2RkYsIDB4OTcwMiwgMHg5NzAzLCAweDk3MDUsIDB4OTcwQSwgMHg5NzBCLAotICAgIDB4OTcwQywgMHg5NzEwLCAweDk3MTEsIDB4OTcxMiwgMHg5NzE0LCAweDk3MTUsIDB4OTcxNywgMHg5NzE4LAotICAgIDB4OTcxOSwgMHg5NzFBLCAweDk3MUIsIDB4OTcxRCwgMHg5NzFGLCAweDk3MjAsIDB4OTcyMSwgMHg5NzIyLAotICAgIDB4OTcyMywgMHg5NzI0LCAweDk3MjUsIDB4OTcyNiwgMHg5NzI4LCAweDk3MjksIDB4OTcyQiwgMHg5NzJDLAotICAgIDB4OTcyRSwgMHg5NzJGLCAweDk3MzEsIDB4OTczMywgMHg5NzM0LCAweDk3MzUsIDB4OTczNiwgMHg5NzM3LAotICAgIDB4OTczQSwgMHg5NzNCLCAweDk3M0MsIDB4OTczRiwgMHg5NzQwLCAweDk3NDEsIDB4OTc0MywgMHg5NzQ1LAotICAgIDB4OTc0NiwgMHg5NzQ3LCAweDk3NDksIDB4OTc0QSwgMHg5NzRCLCAweDk3NEMsIDB4OTc0RCwgMHg5NzRFLAotICAgIDB4OTc0RiwgMHg5NzUwLCAweDk3NTEsIDB4OTc1NCwgMHg5NzU1LCAweDk3NTcsIDB4OTc1OCwgMHg5NzVDLAotICAgIDB4OTc1RCwgMHg5NzVGLCAweDk3NjMsIDB4OTc2NCwgMHg5NzY2LCAweDk3NjcsIDB4OTc2QSwgMHg5NzZCLAotICAgIDB4OTc2QywgMHg5NzZELCAweDk3NkUsIDB4OTc2RiwgMHg5NzcwLCAweDk3NzEsIDB4OTc3MiwgMHg5Nzc1LAotICAgIDB4OTc3NywgMHg5Nzc4LCAweDk3NzksIDB4OTc3QSwgMHg5NzdCLCAweDk3N0QsIDB4OTc3RSwgMHg5NzdGLAotICAgIDB4OTc4MCwgMHg5NzgxLCAweDk3ODIsIDB4OTc4MywgMHg5Nzg0LCAweDk3ODYsIDB4OTc4NywgMHg5Nzg4LAotICAgIDB4OTc4OSwgMHg5NzhBLCAweDk3OEMsIDB4OTc4RSwgMHg5NzkwLCAweDk3OTMsIDB4OTc5NSwgMHg5Nzk2LAotICAgIDB4OTc5NywgMHg5Nzk5LCAweDk3OUEsIDB4OTc5QiwgMHg5NzlDLCAweDk3OUQsIDB4OTc5RSwgMHg5NzlGLAotICAgIDB4OTdBMSwgMHg5N0EyLCAweDk3QTQsIDB4OTdBNSwgMHg5N0E3LCAweDk3QTgsIDB4OTdBOSwgMHg5N0FBLAotICAgIDB4OTdBQywgMHg5N0FFLCAweDk3QjAsIDB4OTdCMSwgMHg5N0IzLCAweDk3QjUsIDB4OTdCNiwgMHg5N0I3LAotICAgIDB4OTdCOCwgMHg5N0I5LCAweDk3QkEsIDB4OTdCQiwgMHg5N0JDLCAweDk3QkUsIDB4OTdCRiwgMHg5N0MwLAotICAgIDB4OTdDMSwgMHg5N0MyLCAweDk3QzQsIDB4OTdDNSwgMHg5N0M3LCAweDk3QzgsIDB4OTdDQSwgMHg5N0NELAotICAgIDB4OTdDRSwgMHg5N0NGLCAweDk3RDAsIDB4OTdEMSwgMHg5N0QyLCAweDk3RDQsIDB4OTdENSwgMHg5N0Q2LAotICAgIDB4OTdENywgMHg5N0Q4LCAweDk3REEsIDB4OTdEQiwgMHg5N0RELCAweDk3REYsIDB4OTdFMCwgMHg5N0UxLAotICAgIDB4OTdFMiwgMHg5N0UzLCAweDk3RTQsIDB4OTdFNSwgMHg5N0U4LCAweDk3RUUsIDB4OTdFRiwgMHg5N0YwLAotICAgIDB4OTdGMSwgMHg5N0YyLCAweDk3RjQsIDB4OTdGNywgMHg5N0Y4LCAweDk3RjksIDB4OTdGQSwgMHg5N0ZCLAotICAgIDB4OTdGQywgMHg5N0ZELCAweDk3RkUsIDB4OTgwMCwgMHg5ODA0LCAweDk4MDksIDB4OTgwQiwgMHg5ODBELAotICAgIDB4OTgxNCwgMHg5ODE1LCAweDk4MTYsIDB4OTgxOSwgMHg5ODFBLCAweDk4MUIsIDB4OTgxRCwgMHg5ODFFLAotICAgIDB4OTgxRiwgMHg5ODIwLCAweDk4MjIsIDB4OTgyMywgMHg5ODI1LCAweDk4MjcsIDB4OTgyOCwgMHg5ODI5LAotICAgIDB4OTgyQSwgMHg5ODJCLCAweDk4MkMsIDB4OTgyRSwgMHg5ODJGLCAweDk4MzEsIDB4OTgzMiwgMHg5ODMzLAotICAgIDB4OTgzNCwgMHg5ODM1LCAweDk4MzYsIDB4OTgzOSwgMHg5ODNBLCAweDk4M0MsIDB4OTgzRSwgMHg5ODNGLAotICAgIDB4OTg0MCwgMHg5ODQxLCAweDk4NDIsIDB4OTg0MywgMHg5ODQ0LCAweDk4NDUsIDB4OTg0NywgMHg5ODQ4LAotICAgIDB4OTg0OSwgMHg5ODRBLCAweDk4NEIsIDB4OTg0RiwgMHg5ODUwLCAweDk4NTEsIDB4OTg1MiwgMHg5ODU1LAotICAgIDB4OTg1NiwgMHg5ODU3LCAweDk4NUEsIDB4OTg1QywgMHg5ODVELCAweDk4NUYsIDB4OTg2MCwgMHg5ODYxLAotICAgIDB4OTg2MywgMHg5ODY0LCAweDk4NjYsIDB4OTg2OCwgMHg5ODY5LCAweDk4NkEsIDB4OTg2RCwgMHg5ODZFLAotICAgIDB4OTg3MiwgMHg5ODhCLCAweDk4OEUsIDB4OTg5MiwgMHg5ODk1LCAweDk4OTksIDB4OThBMywgMHg5OEE5LAotICAgIDB4OThBQSwgMHg5OEFCLCAweDk4QUMsIDB4OThBRCwgMHg5OEIwLCAweDk4QjIsIDB4OThCNCwgMHg5OEI1LAotICAgIDB4OThCNywgMHg5OEI4LCAweDk4QjksIDB4OThCQSwgMHg5OEJCLCAweDk4QkQsIDB4OThCRSwgMHg5OEJGLAotICAgIDB4OThDMCwgMHg5OEMxLCAweDk4QzIsIDB4OThDMywgMHg5OEM1LCAweDk4QzcsIDB4OThDOSwgMHg5OENBLAotICAgIDB4OThDQiwgMHg5OENDLCAweDk4Q0QsIDB4OThDRiwgMHg5OEQwLCAweDk4RDQsIDB4OThENiwgMHg5OEQ3LAotICAgIDB4OThEQywgMHg5OERELCAweDk4RTEsIDB4OThFMywgMHg5OEU0LCAweDk4RTUsIDB4OThFNiwgMHg5OEVDLAotICAgIDB4OThFRSwgMHg5OEYwLCAweDk4RjEsIDB4OThGMywgMHg5OEY1LCAweDk4RjYsIDB4OThGNywgMHg5OEY4LAotICAgIDB4OThGOSwgMHg5OEZBLCAweDk4RkIsIDB4OThGRiwgMHg5OTAwLCAweDk5MDEsIDB4OTkwMiwgMHg5OTA0LAotICAgIDB4OTkwNiwgMHg5OTA3LCAweDk5MDgsIDB4OTkwQiwgMHg5OTBFLCAweDk5MEYsIDB4OTkxNCwgMHg5OTE1LAotICAgIDB4OTkxNiwgMHg5OTE3LCAweDk5MTksIDB4OTkxQSwgMHg5OTFDLCAweDk5MUQsIDB4OTkxRiwgMHg5OTIwLAotICAgIDB4OTkyMiwgMHg5OTIzLCAweDk5MjQsIDB4OTkyNSwgMHg5OTI2LCAweDk5MjcsIDB4OTkyOSwgMHg5OTJBLAotICAgIDB4OTkyQiwgMHg5OTJDLCAweDk5MkQsIDB4OTkyRiwgMHg5OTMwLCAweDk5MzEsIDB4OTkzMiwgMHg5OTM0LAotICAgIDB4OTkzNSwgMHg5OTM2LCAweDk5MzgsIDB4OTkzOSwgMHg5OTNBLCAweDk5M0IsIDB4OTkzRCwgMHg5OTQwLAotICAgIDB4OTk0MSwgMHg5OTQyLCAweDk5NDQsIDB4OTk0NiwgMHg5OTQ3LCAweDk5NEQsIDB4OTk0RSwgMHg5OTRGLAotICAgIDB4OTk1MCwgMHg5OTUzLCAweDk5NTYsIDB4OTk1OCwgMHg5OTU5LCAweDk5NUEsIDB4OTk1QiwgMHg5OTVELAotICAgIDB4OTk1RiwgMHg5OTYwLCAweDk5NjEsIDB4OTk2NCwgMHg5OTY2LCAweDk5NzMsIDB4OTk3OCwgMHg5OTc5LAotICAgIDB4OTk3QiwgMHg5OTdFLCAweDk5ODIsIDB4OTk4MywgMHg5OTg5LCAweDk5OEMsIDB4OTk4RSwgMHg5OTlBLAotICAgIDB4OTk5QiwgMHg5OTlDLCAweDk5OUQsIDB4OTk5RSwgMHg5OTlGLCAweDk5QTAsIDB4OTlBMSwgMHg5OUEyLAotICAgIDB4OTlBMywgMHg5OUE0LCAweDk5QTYsIDB4OTlBNywgMHg5OUE5LCAweDk5QUEsIDB4OTlBQiwgMHg5OUFGLAotICAgIDB4OTlCMCwgMHg5OUIyLCAweDk5QjUsIDB4OTlCNiwgMHg5OUI3LCAweDk5QjgsIDB4OTlCOSwgMHg5OUJBLAotICAgIDB4OTlCQiwgMHg5OUJDLCAweDk5QkQsIDB4OTlCRSwgMHg5OUJGLCAweDk5QzAsIDB4OTlDMiwgMHg5OUMzLAotICAgIDB4OTlDNCwgMHg5OUM1LCAweDk5QzYsIDB4OTlDNywgMHg5OUM4LCAweDk5QzksIDB4OTlDQSwgMHg5OUNCLAotICAgIDB4OTlDQywgMHg5OUNELCAweDk5Q0UsIDB4OTlDRiwgMHg5OUQzLCAweDk5RDYsIDB4OTlENywgMHg5OURBLAotICAgIDB4OTlEQywgMHg5OURFLCAweDk5RTAsIDB4OTlFMywgMHg5OUU0LCAweDk5RTUsIDB4OTlFNiwgMHg5OUU3LAotICAgIDB4OTlFOCwgMHg5OUU5LCAweDk5RUEsIDB4OTlFQiwgMHg5OUVDLCAweDk5RUUsIDB4OTlFRiwgMHg5OUYwLAotICAgIDB4OTlGMiwgMHg5OUYzLCAweDk5RjQsIDB4OTlGNSwgMHg5OUY2LCAweDk5RjcsIDB4OTlGOCwgMHg5OUY5LAotICAgIDB4OTlGQSwgMHg5OUZCLCAweDk5RkMsIDB4OTlGRCwgMHg5OUZFLCAweDlBMDAsIDB4OUEwMiwgMHg5QTAzLAotICAgIDB4OUEwNCwgMHg5QTA2LCAweDlBMDcsIDB4OUEwOCwgMHg5QTA5LCAweDlBMEEsIDB4OUEwQiwgMHg5QTBDLAotICAgIDB4OUExMCwgMHg5QTExLCAweDlBMTIsIDB4OUExMywgMHg5QTE0LCAweDlBMTUsIDB4OUExNywgMHg5QTE4LAotICAgIDB4OUExQSwgMHg5QTFCLCAweDlBMUMsIDB4OUExRCwgMHg5QTFFLCAweDlBMUYsIDB4OUEyMCwgMHg5QTIxLAotICAgIDB4OUEyMiwgMHg5QTIzLCAweDlBMjQsIDB4OUEyNSwgMHg5QTI2LCAweDlBMjcsIDB4OUEyOCwgMHg5QTI5LAotICAgIDB4OUEyQSwgMHg5QTJDLCAweDlBMkYsIDB4OUEzMSwgMHg5QTMyLCAweDlBMzMsIDB4OUEzNCwgMHg5QTM1LAotICAgIDB4OUEzOSwgMHg5QTNBLCAweDlBM0IsIDB4OUEzQywgMHg5QTNELCAweDlBM0YsIDB4OUE0NiwgMHg5QTQ3LAotICAgIDB4OUE0OCwgMHg5QTQ5LCAweDlBNEIsIDB4OUE0QywgMHg5QTRFLCAweDlBNTAsIDB4OUE1MSwgMHg5QTUyLAotICAgIDB4OUE1MywgMHg5QTU0LCAweDlBNTYsIDB4OUE1OCwgMHg5QTU5LCAweDlBNUMsIDB4OUE1RCwgMHg5QTVFLAotICAgIDB4OUE2MCwgMHg5QTYxLCAweDlBNjMsIDB4OUE2NiwgMHg5QTY3LCAweDlBNjgsIDB4OUE2OSwgMHg5QTZCLAotICAgIDB4OUE3MiwgMHg5QTgzLCAweDlBODksIDB4OUE4RCwgMHg5QThFLCAweDlBOTQsIDB4OUE5NSwgMHg5QTk5LAotICAgIDB4OUFBNiwgMHg5QUE5LCAweDlBQUEsIDB4OUFBQiwgMHg5QUFDLCAweDlBQUQsIDB4OUFBRSwgMHg5QUIyLAotICAgIDB4OUFCMywgMHg5QUI0LCAweDlBQjUsIDB4OUFCOSwgMHg5QUJCLCAweDlBQkQsIDB4OUFCRSwgMHg5QUJGLAotICAgIDB4OUFDMywgMHg5QUM0LCAweDlBQzYsIDB4OUFDNywgMHg5QUM4LCAweDlBQzksIDB4OUFDQSwgMHg5QUNELAotICAgIDB4OUFDRSwgMHg5QUQwLCAweDlBRDcsIDB4OUFEOSwgMHg5QURBLCAweDlBREIsIDB4OUFEQywgMHg5QURELAotICAgIDB4OUFERSwgMHg5QUUwLCAweDlBRTIsIDB4OUFFMywgMHg5QUU0LCAweDlBRTUsIDB4OUFFNywgMHg5QUU4LAotICAgIDB4OUFFOSwgMHg5QUVBLCAweDlBRUMsIDB4OUFGMCwgMHg5QUYxLCAweDlBRjIsIDB4OUFGMywgMHg5QUY0LAotICAgIDB4OUFGNSwgMHg5QUY2LCAweDlBRjcsIDB4OUFGOCwgMHg5QUZBLCAweDlBRkMsIDB4OUFGRCwgMHg5QUZFLAotICAgIDB4OUFGRiwgMHg5QjAwLCAweDlCMDEsIDB4OUIwMiwgMHg5QjA0LCAweDlCMDUsIDB4OUIwNywgMHg5QjA5LAotICAgIDB4OUIwQSwgMHg5QjBCLCAweDlCMEMsIDB4OUIwRSwgMHg5QjEwLCAweDlCMTEsIDB4OUIxMiwgMHg5QjE0LAotICAgIDB4OUIxNSwgMHg5QjE2LCAweDlCMTcsIDB4OUIxOCwgMHg5QjE5LCAweDlCMUIsIDB4OUIxQywgMHg5QjFELAotICAgIDB4OUIxRSwgMHg5QjIwLCAweDlCMjEsIDB4OUIyNCwgMHg5QjI2LCAweDlCMjgsIDB4OUIyQSwgMHg5QjJCLAotICAgIDB4OUIyQywgMHg5QjJELCAweDlCMzAsIDB4OUIzMywgMHg5QjM0LCAweDlCMzUsIDB4OUIzNiwgMHg5QjM3LAotICAgIDB4OUIzOCwgMHg5QjM5LCAweDlCM0EsIDB4OUIzRCwgMHg5QjNFLCAweDlCM0YsIDB4OUI0MCwgMHg5QjQ2LAotICAgIDB4OUI0QSwgMHg5QjRCLCAweDlCNEMsIDB4OUI1MCwgMHg5QjUyLCAweDlCNTMsIDB4OUI1NSwgMHg5QjU2LAotICAgIDB4OUI1NywgMHg5QjU5LCAweDlCNUIsIDB4OUI1QywgMHg5QjVELCAweDlCNUUsIDB4OUI1RiwgMHg5QjYwLAotICAgIDB4OUI2MSwgMHg5QjYyLCAweDlCNjMsIDB4OUI2NCwgMHg5QjY1LCAweDlCNjYsIDB4OUI2NywgMHg5QjY4LAotICAgIDB4OUI2OSwgMHg5QjZBLCAweDlCNkIsIDB4OUI2QywgMHg5QjZELCAweDlCNkUsIDB4OUI3MCwgMHg5QjcxLAotICAgIDB4OUI3MiwgMHg5QjczLCAweDlCNzUsIDB4OUI3NiwgMHg5Qjc4LCAweDlCNzksIDB4OUI3QSwgMHg5QjdCLAotICAgIDB4OUI3QywgMHg5QjdELCAweDlCN0UsIDB4OUI3RiwgMHg5QjgwLCAweDlCODIsIDB4OUI4NCwgMHg5Qjg1LAotICAgIDB4OUI4NiwgMHg5Qjg3LCAweDlCODgsIDB4OUI4OSwgMHg5QjhBLCAweDlCOEIsIDB4OUI4QywgMHg5QjhELAotICAgIDB4OUI4RiwgMHg5QjkzLCAweDlCOTQsIDB4OUI5NSwgMHg5Qjk2LCAweDlCOTcsIDB4OUI5OCwgMHg5Qjk5LAotICAgIDB4OUI5QiwgMHg5QjlDLCAweDlCOUYsIDB4OUJBMCwgMHg5QkExLCAweDlCQTIsIDB4OUJBMywgMHg5QkE0LAotICAgIDB4OUJBNSwgMHg5QkE2LCAweDlCQTcsIDB4OUJBOCwgMHg5QkE5LCAweDlCQUMsIDB4OUJBRiwgMHg5QkIwLAotICAgIDB4OUJCMSwgMHg5QkIyLCAweDlCQjMsIDB4OUJCNCwgMHg5QkI1LCAweDlCQjYsIDB4OUJCNywgMHg5QkI4LAotICAgIDB4OUJCOSwgMHg5QkJBLCAweDlCQkIsIDB4OUJCQywgMHg5QkJELCAweDlCQkUsIDB4OUJCRiwgMHg5QkMyLAotICAgIDB4OUJDMywgMHg5QkM0LCAweDlCQzUsIDB4OUJDNiwgMHg5QkM4LCAweDlCQ0IsIDB4OUJDQywgMHg5QkNELAotICAgIDB4OUJDRSwgMHg5QkNGLCAweDlCRDAsIDB4OUJEMSwgMHg5QkQyLCAweDlCRDMsIDB4OUJENSwgMHg5QkQ3LAotICAgIDB4OUJEOCwgMHg5QkQ5LCAweDlCREEsIDB4OUJEQywgMHg5QkRFLCAweDlCREYsIDB4OUJFMCwgMHg5QkUzLAotICAgIDB4OUJFNSwgMHg5QkU2LCAweDlCRTksIDB4OUJFQywgMHg5QkVELCAweDlCRUUsIDB4OUJFRiwgMHg5QkYxLAotICAgIDB4OUJGMiwgMHg5QkYzLCAweDlCRjUsIDB4OUJGNiwgMHg5QkY3LCAweDlCRjgsIDB4OUJGOSwgMHg5QkZBLAotICAgIDB4OUJGQiwgMHg5QkZDLCAweDlCRkUsIDB4OUMwMCwgMHg5QzAxLCAweDlDMDIsIDB4OUMwMywgMHg5QzA0LAotICAgIDB4OUMwNSwgMHg5QzA2LCAweDlDMDcsIDB4OUMwQSwgMHg5QzBCLCAweDlDMEMsIDB4OUMwRSwgMHg5QzBGLAotICAgIDB4OUMxMSwgMHg5QzE0LCAweDlDMTUsIDB4OUMxNiwgMHg5QzE3LCAweDlDMTgsIDB4OUMxOSwgMHg5QzFBLAotICAgIDB4OUMxQiwgMHg5QzFDLCAweDlDMUQsIDB4OUMxRSwgMHg5QzFGLCAweDlDMjEsIDB4OUMyMiwgMHg5QzI0LAotICAgIDB4OUMyNiwgMHg5QzI3LCAweDlDMkEsIDB4OUMyQiwgMHg5QzJDLCAweDlDMkUsIDB4OUMyRiwgMHg5QzMwLAotICAgIDB4OUMzNCwgMHg5QzM2LCAweDlDMzgsIDB4OUMzQSwgMHg5QzNDLCAweDlDM0QsIDB4OUMzRiwgMHg5QzQwLAotICAgIDB4OUM0MSwgMHg5QzQyLCAweDlDNDMsIDB4OUM0NCwgMHg5QzQ2LCAweDlDNDcsIDB4OUM0QSwgMHg5QzRCLAotICAgIDB4OUM0QywgMHg5QzRELCAweDlDNEUsIDB4OUM0RiwgMHg5QzUwLCAweDlDNTEsIDB4OUM1MywgMHg5QzU1LAotICAgIDB4OUM1OSwgMHg5QzVBLCAweDlDNUIsIDB4OUM1QywgMHg5QzVFLCAweDlDNjAsIDB4OUM2MSwgMHg5QzYyLAotICAgIDB4OUM2MywgMHg5QzY0LCAweDlDNjUsIDB4OUM2NiwgMHg5QzY4LCAweDlDNjksIDB4OUM2QSwgMHg5QzZCLAotICAgIDB4OUM2QywgMHg5QzZFLCAweDlDNkYsIDB4OUM3MCwgMHg5QzcxLCAweDlDNzIsIDB4OUM3MywgMHg5Qzc0LAotICAgIDB4OUM3NSwgMHg5Qzc2LCAweDlDNzcsIDB4OUM3OSwgMHg5QzdCLCAweDlDN0QsIDB4OUM3RSwgMHg5QzgwLAotICAgIDB4OUM4MywgMHg5Qzg0LCAweDlDODksIDB4OUM4QSwgMHg5QzhDLCAweDlDOEYsIDB4OUM5MywgMHg5Qzk2LAotICAgIDB4OUM5NywgMHg5Qzk4LCAweDlDOTksIDB4OUM5RCwgMHg5Q0FBLCAweDlDQUMsIDB4OUNBRiwgMHg5Q0I5LAotICAgIDB4OUNCRSwgMHg5Q0JGLCAweDlDQzAsIDB4OUNDMSwgMHg5Q0MyLCAweDlDQzgsIDB4OUNDOSwgMHg5Q0QxLAotICAgIDB4OUNEMiwgMHg5Q0RBLCAweDlDREIsIDB4OUNFMCwgMHg5Q0UxLCAweDlDRTMsIDB4OUNFNCwgMHg5Q0U2LAotICAgIDB4OUNFNywgMHg5Q0U4LCAweDlDRUEsIDB4OUNFQiwgMHg5Q0VELCAweDlDRUUsIDB4OUNFRiwgMHg5Q0YwLAotICAgIDB4OUNGMSwgMHg5Q0YyLCAweDlDRjUsIDB4OUNGNywgMHg5Q0Y4LCAweDlDRjksIDB4OUNGQSwgMHg5Q0ZCLAotICAgIDB4OUNGQywgMHg5Q0ZELCAweDlDRkUsIDB4OUNGRiwgMHg5RDAwLCAweDlEMDEsIDB4OUQwMiwgMHg5RDAzLAotICAgIDB4OUQwNCwgMHg5RDA1LCAweDlEMDgsIDB4OUQwQSwgMHg5RDBCLCAweDlEMEMsIDB4OUQwRCwgMHg5RDBFLAotICAgIDB4OUQwRiwgMHg5RDEwLCAweDlEMTEsIDB4OUQxMiwgMHg5RDEzLCAweDlEMTQsIDB4OUQxNiwgMHg5RDE3LAotICAgIDB4OUQxOCwgMHg5RDE5LCAweDlEMUEsIDB4OUQxQywgMHg5RDFFLCAweDlEMjAsIDB4OUQyMSwgMHg5RDIyLAotICAgIDB4OUQyNCwgMHg5RDI1LCAweDlEMjcsIDB4OUQyOSwgMHg5RDJBLCAweDlEMkIsIDB4OUQyQywgMHg5RDJELAotICAgIDB4OUQyRSwgMHg5RDMxLCAweDlEMzIsIDB4OUQzMywgMHg5RDM0LCAweDlEMzUsIDB4OUQzNiwgMHg5RDM3LAotICAgIDB4OUQzOCwgMHg5RDM5LCAweDlEM0EsIDB4OUQzQywgMHg5RDNELCAweDlEM0UsIDB4OUQ0MCwgMHg5RDQxLAotICAgIDB4OUQ0MywgMHg5RDQ0LCAweDlENDUsIDB4OUQ0NiwgMHg5RDQ3LCAweDlENDgsIDB4OUQ0OSwgMHg5RDRBLAotICAgIDB4OUQ0QiwgMHg5RDRDLCAweDlENEQsIDB4OUQ0RSwgMHg5RDRGLCAweDlENTAsIDB4OUQ1NCwgMHg5RDU1LAotICAgIDB4OUQ1NiwgMHg5RDU3LCAweDlENTgsIDB4OUQ1OSwgMHg5RDVBLCAweDlENUIsIDB4OUQ1RSwgMHg5RDVGLAotICAgIDB4OUQ2MiwgMHg5RDYzLCAweDlENjQsIDB4OUQ2NSwgMHg5RDY2LCAweDlENjcsIDB4OUQ2OCwgMHg5RDY5LAotICAgIDB4OUQ2QiwgMHg5RDZELCAweDlENkUsIDB4OUQ3MCwgMHg5RDcxLCAweDlENzMsIDB4OUQ3NCwgMHg5RDc1LAotICAgIDB4OUQ3NiwgMHg5RDc3LCAweDlENzgsIDB4OUQ3OSwgMHg5RDdBLCAweDlEN0IsIDB4OUQ3QywgMHg5RDdELAotICAgIDB4OUQ3RSwgMHg5RDdGLCAweDlEODAsIDB4OUQ4MSwgMHg5RDgyLCAweDlEODMsIDB4OUQ4NCwgMHg5RDg1LAotICAgIDB4OUQ4NiwgMHg5RDg4LCAweDlEOEEsIDB4OUQ4QiwgMHg5RDhDLCAweDlEOEQsIDB4OUQ4RSwgMHg5RDhGLAotICAgIDB4OUQ5MCwgMHg5RDkxLCAweDlEOTIsIDB4OUQ5NCwgMHg5RDk1LCAweDlEOTYsIDB4OUQ5NywgMHg5RDk5LAotICAgIDB4OUQ5QiwgMHg5RDlDLCAweDlEOUQsIDB4OUQ5RSwgMHg5RDlGLCAweDlEQTAsIDB4OURBMSwgMHg5REEyLAotICAgIDB4OURBMywgMHg5REE0LCAweDlEQTYsIDB4OURBNywgMHg5REE4LCAweDlEQUEsIDB4OURBQiwgMHg5REFDLAotICAgIDB4OURBRCwgMHg5REFFLCAweDlEQjAsIDB4OURCMSwgMHg5REIyLCAweDlEQjMsIDB4OURCNSwgMHg5REI2LAotICAgIDB4OURCNywgMHg5REI4LCAweDlEQjksIDB4OURCQSwgMHg5REJELCAweDlEQkUsIDB4OURCRiwgMHg5REMxLAotICAgIDB4OURDMywgMHg5REM1LCAweDlEQzYsIDB4OURDNywgMHg5REM4LCAweDlEQzksIDB4OURDQSwgMHg5RENCLAotICAgIDB4OURDQywgMHg5RENELCAweDlEQ0UsIDB4OURDRiwgMHg5REQwLCAweDlERDEsIDB4OUREMiwgMHg5REQ0LAotICAgIDB4OURENSwgMHg5REQ2LCAweDlERDgsIDB4OUREQiwgMHg5RERDLCAweDlEREQsIDB4OURERSwgMHg5RERGLAotICAgIDB4OURFMCwgMHg5REUxLCAweDlERTIsIDB4OURFMywgMHg5REU0LCAweDlERTcsIDB4OURFOCwgMHg5REU5LAotICAgIDB4OURFQSwgMHg5REVCLCAweDlERUMsIDB4OURFRCwgMHg5REVFLCAweDlERjAsIDB4OURGMSwgMHg5REY0LAotICAgIDB4OURGNSwgMHg5REY2LCAweDlERjcsIDB4OURGQiwgMHg5REZDLCAweDlERkQsIDB4OURGRSwgMHg5REZGLAotICAgIDB4OUUwMCwgMHg5RTAxLCAweDlFMDIsIDB4OUUwMywgMHg5RTA0LCAweDlFMDUsIDB4OUUwNiwgMHg5RTA3LAotICAgIDB4OUUwOCwgMHg5RTA5LCAweDlFMEEsIDB4OUUwQiwgMHg5RTBELCAweDlFMEUsIDB4OUUwRiwgMHg5RTEwLAotICAgIDB4OUUxMSwgMHg5RTEyLCAweDlFMTMsIDB4OUUxNCwgMHg5RTE2LCAweDlFMTcsIDB4OUUxOCwgMHg5RTE5LAotICAgIDB4OUUxQywgMHg5RTI0LCAweDlFMjcsIDB4OUUyRSwgMHg5RTMwLCAweDlFMzQsIDB4OUUzQiwgMHg5RTNDLAotICAgIDB4OUU0MCwgMHg5RTRELCAweDlFNTAsIDB4OUU1MiwgMHg5RTUzLCAweDlFNTQsIDB4OUU1NiwgMHg5RTU5LAotICAgIDB4OUU1RCwgMHg5RTVGLCAweDlFNjAsIDB4OUU2MSwgMHg5RTYyLCAweDlFNjUsIDB4OUU2RSwgMHg5RTZGLAotICAgIDB4OUU3MiwgMHg5RTc0LCAweDlFNzYsIDB4OUU3NywgMHg5RTc4LCAweDlFN0IsIDB4OUU4MCwgMHg5RTgxLAotICAgIDB4OUU4MywgMHg5RTg0LCAweDlFODUsIDB4OUU4NiwgMHg5RTg5LCAweDlFOEEsIDB4OUU4QywgMHg5RThELAotICAgIDB4OUU4RSwgMHg5RThGLCAweDlFOTAsIDB4OUU5MSwgMHg5RTk0LCAweDlFOTUsIDB4OUU5NiwgMHg5RTk4LAotICAgIDB4OUU5OSwgMHg5RTlBLCAweDlFOUIsIDB4OUU5QywgMHg5RTlFLCAweDlFQTAsIDB4OUVBMSwgMHg5RUEyLAotICAgIDB4OUVBMywgMHg5RUE0LCAweDlFQTcsIDB4OUVBOCwgMHg5RUFBLCAweDlFQUIsIDB4OUVBQywgMHg5RUFELAotICAgIDB4OUVBRSwgMHg5RUIwLCAweDlFQjEsIDB4OUVCMiwgMHg5RUIzLCAweDlFQjYsIDB4OUVCNywgMHg5RUI5LAotICAgIDB4OUVCQSwgMHg5RUJDLCAweDlFQkYsIDB4OUVDMCwgMHg5RUMxLCAweDlFQzIsIDB4OUVDMywgMHg5RUM1LAotICAgIDB4OUVDNiwgMHg5RUM3LCAweDlFQzgsIDB4OUVDQSwgMHg5RUNCLCAweDlFRDAsIDB4OUVEMiwgMHg5RUQzLAotICAgIDB4OUVENSwgMHg5RUQ2LCAweDlFRDcsIDB4OUVEOSwgMHg5RURBLCAweDlFRTEsIDB4OUVFMywgMHg5RUU0LAotICAgIDB4OUVFNiwgMHg5RUVCLCAweDlFRUMsIDB4OUVFRCwgMHg5RUVFLCAweDlFRjAsIDB4OUVGMSwgMHg5RUYzLAotICAgIDB4OUVGNSwgMHg5RUY2LCAweDlFRjgsIDB4OUVGQSwgMHg5RjAwLCAweDlGMDEsIDB4OUYwMiwgMHg5RjAzLAotICAgIDB4OUYwNCwgMHg5RjA1LCAweDlGMDYsIDB4OUYwNywgMHg5RjA4LCAweDlGMEEsIDB4OUYwQywgMHg5RjBGLAotICAgIDB4OUYxMSwgMHg5RjEyLCAweDlGMTQsIDB4OUYxNiwgMHg5RjE4LCAweDlGMUEsIDB4OUYxQiwgMHg5RjFDLAotICAgIDB4OUYxRCwgMHg5RjFFLCAweDlGMUYsIDB4OUYyMSwgMHg5RjIzLCAweDlGMjQsIDB4OUYyNSwgMHg5RjI2LAotICAgIDB4OUYyNywgMHg5RjI4LCAweDlGMjksIDB4OUYyQSwgMHg5RjJCLCAweDlGMkQsIDB4OUYyRSwgMHg5RjMwLAotICAgIDB4OUYzMSwgMHg5RjMyLCAweDlGMzMsIDB4OUYzNCwgMHg5RjM1LCAweDlGMzYsIDB4OUYzOCwgMHg5RjNBLAotICAgIDB4OUYzQywgMHg5RjNGLCAweDlGNDAsIDB4OUY0MSwgMHg5RjQyLCAweDlGNDMsIDB4OUY0NSwgMHg5RjQ2LAotICAgIDB4OUY0NywgMHg5RjQ4LCAweDlGNDksIDB4OUY0QywgMHg5RjRELCAweDlGNEUsIDB4OUY1MywgMHg5RjU1LAotICAgIDB4OUY1NiwgMHg5RjU3LCAweDlGNTgsIDB4OUY1QSwgMHg5RjVCLCAweDlGNUQsIDB4OUY1RSwgMHg5RjYyLAotICAgIDB4OUY2NCwgMHg5RjY1LCAweDlGNjcsIDB4OUY2OCwgMHg5RjY5LCAweDlGNkIsIDB4OUY2RCwgMHg5RjZFLAotICAgIDB4OUY2RiwgMHg5RjcwLCAweDlGNzEsIDB4OUY3MywgMHg5Rjc0LCAweDlGNzUsIDB4OUY3NiwgMHg5Rjc4LAotICAgIDB4OUY3OSwgMHg5RjdBLCAweDlGN0IsIDB4OUY3QywgMHg5RjdELCAweDlGN0UsIDB4OUY4MSwgMHg5RjgyLAotICAgIDB4OUY4RSwgMHg5RjhGLCAweDlGOTEsIDB4OUY5MiwgMHg5RjkzLCAweDlGOTYsIDB4OUY5NywgMHg5Rjk4LAotICAgIDB4OUY5RCwgMHg5RjlFLCAweDlGQTEsIDB4OUZBMiwgMHg5RkEzLCAweDlGQTQsIDB4OUZBNSwgMHhGOTJDLAotICAgIDB4RkEwRCwgMHhGQTBFLCAweEZBMEYsIDB4RkExMSwgMHhGQTEzLCAweEZBMTQsIDB4RkExOCwgMHhGQTFGLAotICAgIDB4RkEyMCwgMHhGQTIxLCAweEZBMjMsIDB4RkEyNCwgMHhGQTI3LCAweEZBMjgsIDB4RkEyOSwgMHgyRTgxLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MkU4NCwgMHgzNDczLCAweDM0NDcsIDB4MkU4OCwgMHgyRThCLAotICAgIDB4OUZCNCwgMHgzNTlFLCAweDM2MUEsIDB4MzYwRSwgMHgyRThDLCAweDJFOTcsIDB4Mzk2RSwgMHgzOTE4LAotICAgIDB4OUZCNSwgMHgzOUNGLCAweDM5REYsIDB4M0E3MywgMHgzOUQwLCAweDlGQjYsIDB4OUZCNywgMHgzQjRFLAotICAgIDB4M0M2RSwgMHgzQ0UwLCAweDJFQTcsIDB4MDAwMCwgMHg5RkI4LCAweDJFQUEsIDB4NDA1NiwgMHg0MTVGLAotICAgIDB4MkVBRSwgMHg0MzM3LCAweDJFQjMsIDB4MkVCNiwgMHgyRUI3LCAweDAwMDAsIDB4NDNCMSwgMHg0M0FDLAotICAgIDB4MkVCQiwgMHg0M0RELCAweDQ0RDYsIDB4NDY2MSwgMHg0NjRDLCAweDlGQjksIDB4NDcyMywgMHg0NzI5LAotICAgIDB4NDc3QywgMHg0NzhELCAweDJFQ0EsIDB4NDk0NywgMHg0OTdBLCAweDQ5N0QsIDB4NDk4MiwgMHg0OTgzLAotICAgIDB4NDk4NSwgMHg0OTg2LCAweDQ5OUYsIDB4NDk5QiwgMHg0OUI3LCAweDQ5QjYsIDB4OUZCQSwgMHgwMDAwLAotICAgIDB4NENBMywgMHg0QzlGLCAweDRDQTAsIDB4NENBMSwgMHg0Qzc3LCAweDRDQTIsIDB4NEQxMywgMHg0RDE0LAotICAgIDB4NEQxNSwgMHg0RDE2LCAweDREMTcsIDB4NEQxOCwgMHg0RDE5LCAweDREQUUsIDB4OUZCQiwgMHgwMDIwLAotICAgIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywgMHgwMDI4LAotICAgIDB4MDAyOSwgMHgwMDJBLCAweDAwMkIsIDB4MDAyQywgMHgwMDJELCAweDAwMkUsIDB4MDAyRiwgMHgwMDMwLAotICAgIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgMHgwMDM4LAotICAgIDB4MDAzOSwgMHgwMDNBLCAweDAwM0IsIDB4MDAzQywgMHgwMDNELCAweDAwM0UsIDB4MDAzRiwgMHgwMDQwLAotICAgIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LAotICAgIDB4MDA0OSwgMHgwMDRBLCAweDAwNEIsIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLAotICAgIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LAotICAgIDB4MDA1OSwgMHgwMDVBLCAweDAwNUIsIDB4MDA1QywgMHgwMDVELCAweDAwNUUsIDB4MDA1RiwgMHgwMDYwLAotICAgIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywgMHgwMDY4LAotICAgIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywgMHgwMDZELCAweDAwNkUsIDB4MDA2RiwgMHgwMDcwLAotICAgIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywgMHgwMDc4LAotICAgIDB4MDA3OSwgMHgwMDdBLCAweDAwN0IsIDB4MDA3QywgMHgwMDdELCAweDAwN0UsIDB4MDBGQywgMHgwMEE5LAotICAgIDB4MjEyMiwgMHgyMDI2LCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LAotICAgIDB4MDAyNywgMHgwMDI4LCAweDAwMjksIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLAotICAgIDB4MDAyRiwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LAotICAgIDB4MDAzNywgMHgwMDM4LCAweDAwMzksIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLAotICAgIDB4MDAzRiwgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LAotICAgIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLAotICAgIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LAotICAgIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgwMDVCLCAweDAwNUMsIDB4MDA1RCwgMHgwMDVFLAotICAgIDB4MDA1RiwgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LAotICAgIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLAotICAgIDB4MDA2RiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LAotICAgIDB4MDA3NywgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDdCLCAweDAwN0MsIDB4MDA3RCwgMHgwMDdFLAotICAgIDB4MDEwMSwgMHgwMEUxLCAweDAxQ0UsIDB4MDBFMCwgMHgwMTEzLCAweDAwRTksIDB4MDExQiwgMHgwMEU4LAotICAgIDB4MDEyQiwgMHgwMEVELCAweDAxRDAsIDB4MDBFQywgMHgwMTRELCAweDAwRjMsIDB4MDFEMiwgMHgwMEYyLAotICAgIDB4MDE2QiwgMHgwMEZBLCAweDAxRDQsIDB4MDBGOSwgMHgwMUQ2LCAweDAxRDgsIDB4MDFEQSwgMHgwMURDLAotICAgIDB4MDBGQywgMHgwMEVBLCAweDAyNTEsIDB4MUUzRiwgMHgwMTQ0LCAweDAxNDgsIDB4MDFGOSwgMHgwMjYxLAotICAgIDB4MDAyMCwgMHgyMEFDLCAweDAwQTUsIDB4MjBBQywgMHgwMDI0LCAweDMwM0YsIDB4MjBBQywgMHgzMDQxLAotICAgIDB4MzA0NywgMHgzMDQzLCAweDMwNEIsIDB4MzA0QiwgMHgzMDUxLCAweDMwNTEsIDB4MzA1MywgMHgzMDUzLAotICAgIDB4MzA0OSwgMHgzMDY0LCAweDMwNDUsIDB4MzA4RSwgMHgzMDgzLCAweDMwODcsIDB4MzA4NSwgMHgzMDk0LAotICAgIDB4MzBBMSwgMHgzMEE3LCAweDMwQTMsIDB4MzBGNSwgMHgzMEY2LCAweDMwQjMsIDB4MzBCMywgMHgzMEE5LAotICAgIDB4MzBDMywgMHgzMEE1LCAweDMwRUUsIDB4MzBFMywgMHgzMEU3LCAweDMwRTUsIDB4MzBGNywgMHgzMEY5LAotICAgIDB4MzBGOCwgMHgzMEZBLCAweDMwRkMsIDB4MzAzMywgMHgzMDM0LCAweDMwMzUsIDB4MzAzOCwgMHgzMDM5LAotICAgIDB4MzAzQSwgMHgzMTJBLCAweDMxMkIsIDB4MzEyQywgMHgzMUEwLCAweDMxQTEsIDB4MzFBMiwgMHgzMUEzLAotICAgIDB4MzFBNCwgMHgzMUE1LCAweDMxQTYsIDB4MzFBNywgMHgzMUE4LCAweDMxQTksIDB4MzFBQSwgMHgzMUFCLAotICAgIDB4MzFBQywgMHgzMUFELCAweDMxQUUsIDB4MzFBRiwgMHgzMUIwLCAweDMxQjEsIDB4MzFCMiwgMHgzMUIzLAotICAgIDB4MzFCNCwgMHgzMUI1LCAweDMxQjYsIDB4MzFCNywgMHgyRTgwLCAweDJFODIsIDB4MkU4MywgMHgyRTg1LAotICAgIDB4MkU4NiwgMHgyRTg3LCAweDJFODksIDB4MkU4QSwgMHgyRThELCAweDJFOEUsIDB4MkU4RiwgMHgyRTkwLAotICAgIDB4MkU5MSwgMHgyRTkyLCAweDJFOTMsIDB4MkU5NCwgMHgyRTk1LCAweDJFOTYsIDB4MkU5OCwgMHgyRTk5LAotICAgIDB4MkU5QiwgMHgyRTlDLCAweDJFOUQsIDB4MkU5RSwgMHgyRTlGLCAweDJFQTAsIDB4MkVBMSwgMHgyRUEyLAotICAgIDB4MkVBMywgMHgyRUE0LCAweDJFQTUsIDB4MkVBNiwgMHgyRUE4LCAweDJFQTksIDB4MkVBQiwgMHgyRUFDLAotICAgIDB4MkVBRCwgMHgyRUFGLCAweDJFQjAsIDB4MkVCMSwgMHgyRUIyLCAweDJFQjQsIDB4MkVCNSwgMHgyRUI4LAotICAgIDB4MkVCOSwgMHgyRUJBLCAweDJFQkMsIDB4MkVCRCwgMHgyRUJFLCAweDJFQkYsIDB4MkVDMCwgMHgyRUMxLAotICAgIDB4MkVDMiwgMHgyRUMzLCAweDJFQzQsIDB4MkVDNSwgMHgyRUM2LCAweDJFQzcsIDB4MkVDOCwgMHgyRUM5LAotICAgIDB4MkVDQiwgMHgyRUNDLCAweDJFQ0QsIDB4MkVDRSwgMHgyRUNGLCAweDJFRDAsIDB4MkVEMSwgMHgyRUQyLAotICAgIDB4MkVEMywgMHgyRUQ0LCAweDJFRDUsIDB4MkVENiwgMHgyRUQ3LCAweDJFRDgsIDB4MkVEOSwgMHgyRURBLAotICAgIDB4MkVEQiwgMHgyRURDLCAweDJFREQsIDB4MkVERSwgMHgyRURGLCAweDJFRTAsIDB4MkVFMSwgMHgyRUUyLAotICAgIDB4MkVFMywgMHgyRUU0LCAweDJFRTUsIDB4MkVFNiwgMHgyRUU3LCAweDJFRTgsIDB4MkVFOSwgMHgyRUVBLAotICAgIDB4MkVFQiwgMHgyRUVDLCAweDJFRUQsIDB4MkVFRSwgMHgyRUVGLCAweDJFRjAsIDB4MkVGMSwgMHgyRUYyLAotICAgIDB4MkVGMywgMHgzNDAwLCAweDM0MDEsIDB4MzQwMiwgMHgzNDAzLCAweDM0MDQsIDB4MzQwNSwgMHgzNDA2LAotICAgIDB4MzQwNywgMHgzNDA4LCAweDM0MDksIDB4MzQwQSwgMHgzNDBCLCAweDM0MEMsIDB4MzQwRCwgMHgzNDBFLAotICAgIDB4MzQwRiwgMHgzNDEwLCAweDM0MTEsIDB4MzQxMiwgMHgzNDEzLCAweDM0MTQsIDB4MzQxNSwgMHgzNDE2LAotICAgIDB4MzQxNywgMHgzNDE4LCAweDM0MTksIDB4MzQxQSwgMHgzNDFCLCAweDM0MUMsIDB4MzQxRCwgMHgzNDFFLAotICAgIDB4MzQxRiwgMHgzNDIwLCAweDM0MjEsIDB4MzQyMiwgMHgzNDIzLCAweDM0MjQsIDB4MzQyNSwgMHgzNDI2LAotICAgIDB4MzQyNywgMHgzNDI4LCAweDM0MjksIDB4MzQyQSwgMHgzNDJCLCAweDM0MkMsIDB4MzQyRCwgMHgzNDJFLAotICAgIDB4MzQyRiwgMHgzNDMwLCAweDM0MzEsIDB4MzQzMiwgMHgzNDMzLCAweDM0MzQsIDB4MzQzNSwgMHgzNDM2LAotICAgIDB4MzQzNywgMHgzNDM4LCAweDM0MzksIDB4MzQzQSwgMHgzNDNCLCAweDM0M0MsIDB4MzQzRCwgMHgzNDNFLAotICAgIDB4MzQzRiwgMHgzNDQwLCAweDM0NDEsIDB4MzQ0MiwgMHgzNDQzLCAweDM0NDQsIDB4MzQ0NSwgMHgzNDQ2LAotICAgIDB4MzQ0OCwgMHgzNDQ5LCAweDM0NEEsIDB4MzQ0QiwgMHgzNDRDLCAweDM0NEQsIDB4MzQ0RSwgMHgzNDRGLAotICAgIDB4MzQ1MCwgMHgzNDUxLCAweDM0NTIsIDB4MzQ1MywgMHgzNDU0LCAweDM0NTUsIDB4MzQ1NiwgMHgzNDU3LAotICAgIDB4MzQ1OCwgMHgzNDU5LCAweDM0NUEsIDB4MzQ1QiwgMHgzNDVDLCAweDM0NUQsIDB4MzQ1RSwgMHgzNDVGLAotICAgIDB4MzQ2MCwgMHgzNDYxLCAweDM0NjIsIDB4MzQ2MywgMHgzNDY0LCAweDM0NjUsIDB4MzQ2NiwgMHgzNDY3LAotICAgIDB4MzQ2OCwgMHgzNDY5LCAweDM0NkEsIDB4MzQ2QiwgMHgzNDZDLCAweDM0NkQsIDB4MzQ2RSwgMHgzNDZGLAotICAgIDB4MzQ3MCwgMHgzNDcxLCAweDM0NzIsIDB4MzQ3NCwgMHgzNDc1LCAweDM0NzYsIDB4MzQ3NywgMHgzNDc4LAotICAgIDB4MzQ3OSwgMHgzNDdBLCAweDM0N0IsIDB4MzQ3QywgMHgzNDdELCAweDM0N0UsIDB4MzQ3RiwgMHgzNDgwLAotICAgIDB4MzQ4MSwgMHgzNDgyLCAweDM0ODMsIDB4MzQ4NCwgMHgzNDg1LCAweDM0ODYsIDB4MzQ4NywgMHgzNDg4LAotICAgIDB4MzQ4OSwgMHgzNDhBLCAweDM0OEIsIDB4MzQ4QywgMHgzNDhELCAweDM0OEUsIDB4MzQ4RiwgMHgzNDkwLAotICAgIDB4MzQ5MSwgMHgzNDkyLCAweDM0OTMsIDB4MzQ5NCwgMHgzNDk1LCAweDM0OTYsIDB4MzQ5NywgMHgzNDk4LAotICAgIDB4MzQ5OSwgMHgzNDlBLCAweDM0OUIsIDB4MzQ5QywgMHgzNDlELCAweDM0OUUsIDB4MzQ5RiwgMHgzNEEwLAotICAgIDB4MzRBMSwgMHgzNEEyLCAweDM0QTMsIDB4MzRBNCwgMHgzNEE1LCAweDM0QTYsIDB4MzRBNywgMHgzNEE4LAotICAgIDB4MzRBOSwgMHgzNEFBLCAweDM0QUIsIDB4MzRBQywgMHgzNEFELCAweDM0QUUsIDB4MzRBRiwgMHgzNEIwLAotICAgIDB4MzRCMSwgMHgzNEIyLCAweDM0QjMsIDB4MzRCNCwgMHgzNEI1LCAweDM0QjYsIDB4MzRCNywgMHgzNEI4LAotICAgIDB4MzRCOSwgMHgzNEJBLCAweDM0QkIsIDB4MzRCQywgMHgzNEJELCAweDM0QkUsIDB4MzRCRiwgMHgzNEMwLAotICAgIDB4MzRDMSwgMHgzNEMyLCAweDM0QzMsIDB4MzRDNCwgMHgzNEM1LCAweDM0QzYsIDB4MzRDNywgMHgzNEM4LAotICAgIDB4MzRDOSwgMHgzNENBLCAweDM0Q0IsIDB4MzRDQywgMHgzNENELCAweDM0Q0UsIDB4MzRDRiwgMHgzNEQwLAotICAgIDB4MzREMSwgMHgzNEQyLCAweDM0RDMsIDB4MzRENCwgMHgzNEQ1LCAweDM0RDYsIDB4MzRENywgMHgzNEQ4LAotICAgIDB4MzREOSwgMHgzNERBLCAweDM0REIsIDB4MzREQywgMHgzNERELCAweDM0REUsIDB4MzRERiwgMHgzNEUwLAotICAgIDB4MzRFMSwgMHgzNEUyLCAweDM0RTMsIDB4MzRFNCwgMHgzNEU1LCAweDM0RTYsIDB4MzRFNywgMHgzNEU4LAotICAgIDB4MzRFOSwgMHgzNEVBLCAweDM0RUIsIDB4MzRFQywgMHgzNEVELCAweDM0RUUsIDB4MzRFRiwgMHgzNEYwLAotICAgIDB4MzRGMSwgMHgzNEYyLCAweDM0RjMsIDB4MzRGNCwgMHgzNEY1LCAweDM0RjYsIDB4MzRGNywgMHgzNEY4LAotICAgIDB4MzRGOSwgMHgzNEZBLCAweDM0RkIsIDB4MzRGQywgMHgzNEZELCAweDM0RkUsIDB4MzRGRiwgMHgzNTAwLAotICAgIDB4MzUwMSwgMHgzNTAyLCAweDM1MDMsIDB4MzUwNCwgMHgzNTA1LCAweDM1MDYsIDB4MzUwNywgMHgzNTA4LAotICAgIDB4MzUwOSwgMHgzNTBBLCAweDM1MEIsIDB4MzUwQywgMHgzNTBELCAweDM1MEUsIDB4MzUwRiwgMHgzNTEwLAotICAgIDB4MzUxMSwgMHgzNTEyLCAweDM1MTMsIDB4MzUxNCwgMHgzNTE1LCAweDM1MTYsIDB4MzUxNywgMHgzNTE4LAotICAgIDB4MzUxOSwgMHgzNTFBLCAweDM1MUIsIDB4MzUxQywgMHgzNTFELCAweDM1MUUsIDB4MzUxRiwgMHgzNTIwLAotICAgIDB4MzUyMSwgMHgzNTIyLCAweDM1MjMsIDB4MzUyNCwgMHgzNTI1LCAweDM1MjYsIDB4MzUyNywgMHgzNTI4LAotICAgIDB4MzUyOSwgMHgzNTJBLCAweDM1MkIsIDB4MzUyQywgMHgzNTJELCAweDM1MkUsIDB4MzUyRiwgMHgzNTMwLAotICAgIDB4MzUzMSwgMHgzNTMyLCAweDM1MzMsIDB4MzUzNCwgMHgzNTM1LCAweDM1MzYsIDB4MzUzNywgMHgzNTM4LAotICAgIDB4MzUzOSwgMHgzNTNBLCAweDM1M0IsIDB4MzUzQywgMHgzNTNELCAweDM1M0UsIDB4MzUzRiwgMHgzNTQwLAotICAgIDB4MzU0MSwgMHgzNTQyLCAweDM1NDMsIDB4MzU0NCwgMHgzNTQ1LCAweDM1NDYsIDB4MzU0NywgMHgzNTQ4LAotICAgIDB4MzU0OSwgMHgzNTRBLCAweDM1NEIsIDB4MzU0QywgMHgzNTRELCAweDM1NEUsIDB4MzU0RiwgMHgzNTUwLAotICAgIDB4MzU1MSwgMHgzNTUyLCAweDM1NTMsIDB4MzU1NCwgMHgzNTU1LCAweDM1NTYsIDB4MzU1NywgMHgzNTU4LAotICAgIDB4MzU1OSwgMHgzNTVBLCAweDM1NUIsIDB4MzU1QywgMHgzNTVELCAweDM1NUUsIDB4MzU1RiwgMHgzNTYwLAotICAgIDB4MzU2MSwgMHgzNTYyLCAweDM1NjMsIDB4MzU2NCwgMHgzNTY1LCAweDM1NjYsIDB4MzU2NywgMHgzNTY4LAotICAgIDB4MzU2OSwgMHgzNTZBLCAweDM1NkIsIDB4MzU2QywgMHgzNTZELCAweDM1NkUsIDB4MzU2RiwgMHgzNTcwLAotICAgIDB4MzU3MSwgMHgzNTcyLCAweDM1NzMsIDB4MzU3NCwgMHgzNTc1LCAweDM1NzYsIDB4MzU3NywgMHgzNTc4LAotICAgIDB4MzU3OSwgMHgzNTdBLCAweDM1N0IsIDB4MzU3QywgMHgzNTdELCAweDM1N0UsIDB4MzU3RiwgMHgzNTgwLAotICAgIDB4MzU4MSwgMHgzNTgyLCAweDM1ODMsIDB4MzU4NCwgMHgzNTg1LCAweDM1ODYsIDB4MzU4NywgMHgzNTg4LAotICAgIDB4MzU4OSwgMHgzNThBLCAweDM1OEIsIDB4MzU4QywgMHgzNThELCAweDM1OEUsIDB4MzU4RiwgMHgzNTkwLAotICAgIDB4MzU5MSwgMHgzNTkyLCAweDM1OTMsIDB4MzU5NCwgMHgzNTk1LCAweDM1OTYsIDB4MzU5NywgMHgzNTk4LAotICAgIDB4MzU5OSwgMHgzNTlBLCAweDM1OUIsIDB4MzU5QywgMHgzNTlELCAweDM1OUYsIDB4MzVBMCwgMHgzNUExLAotICAgIDB4MzVBMiwgMHgzNUEzLCAweDM1QTQsIDB4MzVBNSwgMHgzNUE2LCAweDM1QTcsIDB4MzVBOCwgMHgzNUE5LAotICAgIDB4MzVBQSwgMHgzNUFCLCAweDM1QUMsIDB4MzVBRCwgMHgzNUFFLCAweDM1QUYsIDB4MzVCMCwgMHgzNUIxLAotICAgIDB4MzVCMiwgMHgzNUIzLCAweDM1QjQsIDB4MzVCNSwgMHgzNUI2LCAweDM1QjcsIDB4MzVCOCwgMHgzNUI5LAotICAgIDB4MzVCQSwgMHgzNUJCLCAweDM1QkMsIDB4MzVCRCwgMHgzNUJFLCAweDM1QkYsIDB4MzVDMCwgMHgzNUMxLAotICAgIDB4MzVDMiwgMHgzNUMzLCAweDM1QzQsIDB4MzVDNSwgMHgzNUM2LCAweDM1QzcsIDB4MzVDOCwgMHgzNUM5LAotICAgIDB4MzVDQSwgMHgzNUNCLCAweDM1Q0MsIDB4MzVDRCwgMHgzNUNFLCAweDM1Q0YsIDB4MzVEMCwgMHgzNUQxLAotICAgIDB4MzVEMiwgMHgzNUQzLCAweDM1RDQsIDB4MzVENSwgMHgzNUQ2LCAweDM1RDcsIDB4MzVEOCwgMHgzNUQ5LAotICAgIDB4MzVEQSwgMHgzNURCLCAweDM1REMsIDB4MzVERCwgMHgzNURFLCAweDM1REYsIDB4MzVFMCwgMHgzNUUxLAotICAgIDB4MzVFMiwgMHgzNUUzLCAweDM1RTQsIDB4MzVFNSwgMHgzNUU2LCAweDM1RTcsIDB4MzVFOCwgMHgzNUU5LAotICAgIDB4MzVFQSwgMHgzNUVCLCAweDM1RUMsIDB4MzVFRCwgMHgzNUVFLCAweDM1RUYsIDB4MzVGMCwgMHgzNUYxLAotICAgIDB4MzVGMiwgMHgzNUYzLCAweDM1RjQsIDB4MzVGNSwgMHgzNUY2LCAweDM1RjcsIDB4MzVGOCwgMHgzNUY5LAotICAgIDB4MzVGQSwgMHgzNUZCLCAweDM1RkMsIDB4MzVGRCwgMHgzNUZFLCAweDM1RkYsIDB4MzYwMCwgMHgzNjAxLAotICAgIDB4MzYwMiwgMHgzNjAzLCAweDM2MDQsIDB4MzYwNSwgMHgzNjA2LCAweDM2MDcsIDB4MzYwOCwgMHgzNjA5LAotICAgIDB4MzYwQSwgMHgzNjBCLCAweDM2MEMsIDB4MzYwRCwgMHgzNjBGLCAweDM2MTAsIDB4MzYxMSwgMHgzNjEyLAotICAgIDB4MzYxMywgMHgzNjE0LCAweDM2MTUsIDB4MzYxNiwgMHgzNjE3LCAweDM2MTgsIDB4MzYxOSwgMHgzNjFCLAotICAgIDB4MzYxQywgMHgzNjFELCAweDM2MUUsIDB4MzYxRiwgMHgzNjIwLCAweDM2MjEsIDB4MzYyMiwgMHgzNjIzLAotICAgIDB4MzYyNCwgMHgzNjI1LCAweDM2MjYsIDB4MzYyNywgMHgzNjI4LCAweDM2MjksIDB4MzYyQSwgMHgzNjJCLAotICAgIDB4MzYyQywgMHgzNjJELCAweDM2MkUsIDB4MzYyRiwgMHgzNjMwLCAweDM2MzEsIDB4MzYzMiwgMHgzNjMzLAotICAgIDB4MzYzNCwgMHgzNjM1LCAweDM2MzYsIDB4MzYzNywgMHgzNjM4LCAweDM2MzksIDB4MzYzQSwgMHgzNjNCLAotICAgIDB4MzYzQywgMHgzNjNELCAweDM2M0UsIDB4MzYzRiwgMHgzNjQwLCAweDM2NDEsIDB4MzY0MiwgMHgzNjQzLAotICAgIDB4MzY0NCwgMHgzNjQ1LCAweDM2NDYsIDB4MzY0NywgMHgzNjQ4LCAweDM2NDksIDB4MzY0QSwgMHgzNjRCLAotICAgIDB4MzY0QywgMHgzNjRELCAweDM2NEUsIDB4MzY0RiwgMHgzNjUwLCAweDM2NTEsIDB4MzY1MiwgMHgzNjUzLAotICAgIDB4MzY1NCwgMHgzNjU1LCAweDM2NTYsIDB4MzY1NywgMHgzNjU4LCAweDM2NTksIDB4MzY1QSwgMHgzNjVCLAotICAgIDB4MzY1QywgMHgzNjVELCAweDM2NUUsIDB4MzY1RiwgMHgzNjYwLCAweDM2NjEsIDB4MzY2MiwgMHgzNjYzLAotICAgIDB4MzY2NCwgMHgzNjY1LCAweDM2NjYsIDB4MzY2NywgMHgzNjY4LCAweDM2NjksIDB4MzY2QSwgMHgzNjZCLAotICAgIDB4MzY2QywgMHgzNjZELCAweDM2NkUsIDB4MzY2RiwgMHgzNjcwLCAweDM2NzEsIDB4MzY3MiwgMHgzNjczLAotICAgIDB4MzY3NCwgMHgzNjc1LCAweDM2NzYsIDB4MzY3NywgMHgzNjc4LCAweDM2NzksIDB4MzY3QSwgMHgzNjdCLAotICAgIDB4MzY3QywgMHgzNjdELCAweDM2N0UsIDB4MzY3RiwgMHgzNjgwLCAweDM2ODEsIDB4MzY4MiwgMHgzNjgzLAotICAgIDB4MzY4NCwgMHgzNjg1LCAweDM2ODYsIDB4MzY4NywgMHgzNjg4LCAweDM2ODksIDB4MzY4QSwgMHgzNjhCLAotICAgIDB4MzY4QywgMHgzNjhELCAweDM2OEUsIDB4MzY4RiwgMHgzNjkwLCAweDM2OTEsIDB4MzY5MiwgMHgzNjkzLAotICAgIDB4MzY5NCwgMHgzNjk1LCAweDM2OTYsIDB4MzY5NywgMHgzNjk4LCAweDM2OTksIDB4MzY5QSwgMHgzNjlCLAotICAgIDB4MzY5QywgMHgzNjlELCAweDM2OUUsIDB4MzY5RiwgMHgzNkEwLCAweDM2QTEsIDB4MzZBMiwgMHgzNkEzLAotICAgIDB4MzZBNCwgMHgzNkE1LCAweDM2QTYsIDB4MzZBNywgMHgzNkE4LCAweDM2QTksIDB4MzZBQSwgMHgzNkFCLAotICAgIDB4MzZBQywgMHgzNkFELCAweDM2QUUsIDB4MzZBRiwgMHgzNkIwLCAweDM2QjEsIDB4MzZCMiwgMHgzNkIzLAotICAgIDB4MzZCNCwgMHgzNkI1LCAweDM2QjYsIDB4MzZCNywgMHgzNkI4LCAweDM2QjksIDB4MzZCQSwgMHgzNkJCLAotICAgIDB4MzZCQywgMHgzNkJELCAweDM2QkUsIDB4MzZCRiwgMHgzNkMwLCAweDM2QzEsIDB4MzZDMiwgMHgzNkMzLAotICAgIDB4MzZDNCwgMHgzNkM1LCAweDM2QzYsIDB4MzZDNywgMHgzNkM4LCAweDM2QzksIDB4MzZDQSwgMHgzNkNCLAotICAgIDB4MzZDQywgMHgzNkNELCAweDM2Q0UsIDB4MzZDRiwgMHgzNkQwLCAweDM2RDEsIDB4MzZEMiwgMHgzNkQzLAotICAgIDB4MzZENCwgMHgzNkQ1LCAweDM2RDYsIDB4MzZENywgMHgzNkQ4LCAweDM2RDksIDB4MzZEQSwgMHgzNkRCLAotICAgIDB4MzZEQywgMHgzNkRELCAweDM2REUsIDB4MzZERiwgMHgzNkUwLCAweDM2RTEsIDB4MzZFMiwgMHgzNkUzLAotICAgIDB4MzZFNCwgMHgzNkU1LCAweDM2RTYsIDB4MzZFNywgMHgzNkU4LCAweDM2RTksIDB4MzZFQSwgMHgzNkVCLAotICAgIDB4MzZFQywgMHgzNkVELCAweDM2RUUsIDB4MzZFRiwgMHgzNkYwLCAweDM2RjEsIDB4MzZGMiwgMHgzNkYzLAotICAgIDB4MzZGNCwgMHgzNkY1LCAweDM2RjYsIDB4MzZGNywgMHgzNkY4LCAweDM2RjksIDB4MzZGQSwgMHgzNkZCLAotICAgIDB4MzZGQywgMHgzNkZELCAweDM2RkUsIDB4MzZGRiwgMHgzNzAwLCAweDM3MDEsIDB4MzcwMiwgMHgzNzAzLAotICAgIDB4MzcwNCwgMHgzNzA1LCAweDM3MDYsIDB4MzcwNywgMHgzNzA4LCAweDM3MDksIDB4MzcwQSwgMHgzNzBCLAotICAgIDB4MzcwQywgMHgzNzBELCAweDM3MEUsIDB4MzcwRiwgMHgzNzEwLCAweDM3MTEsIDB4MzcxMiwgMHgzNzEzLAotICAgIDB4MzcxNCwgMHgzNzE1LCAweDM3MTYsIDB4MzcxNywgMHgzNzE4LCAweDM3MTksIDB4MzcxQSwgMHgzNzFCLAotICAgIDB4MzcxQywgMHgzNzFELCAweDM3MUUsIDB4MzcxRiwgMHgzNzIwLCAweDM3MjEsIDB4MzcyMiwgMHgzNzIzLAotICAgIDB4MzcyNCwgMHgzNzI1LCAweDM3MjYsIDB4MzcyNywgMHgzNzI4LCAweDM3MjksIDB4MzcyQSwgMHgzNzJCLAotICAgIDB4MzcyQywgMHgzNzJELCAweDM3MkUsIDB4MzcyRiwgMHgzNzMwLCAweDM3MzEsIDB4MzczMiwgMHgzNzMzLAotICAgIDB4MzczNCwgMHgzNzM1LCAweDM3MzYsIDB4MzczNywgMHgzNzM4LCAweDM3MzksIDB4MzczQSwgMHgzNzNCLAotICAgIDB4MzczQywgMHgzNzNELCAweDM3M0UsIDB4MzczRiwgMHgzNzQwLCAweDM3NDEsIDB4Mzc0MiwgMHgzNzQzLAotICAgIDB4Mzc0NCwgMHgzNzQ1LCAweDM3NDYsIDB4Mzc0NywgMHgzNzQ4LCAweDM3NDksIDB4Mzc0QSwgMHgzNzRCLAotICAgIDB4Mzc0QywgMHgzNzRELCAweDM3NEUsIDB4Mzc0RiwgMHgzNzUwLCAweDM3NTEsIDB4Mzc1MiwgMHgzNzUzLAotICAgIDB4Mzc1NCwgMHgzNzU1LCAweDM3NTYsIDB4Mzc1NywgMHgzNzU4LCAweDM3NTksIDB4Mzc1QSwgMHgzNzVCLAotICAgIDB4Mzc1QywgMHgzNzVELCAweDM3NUUsIDB4Mzc1RiwgMHgzNzYwLCAweDM3NjEsIDB4Mzc2MiwgMHgzNzYzLAotICAgIDB4Mzc2NCwgMHgzNzY1LCAweDM3NjYsIDB4Mzc2NywgMHgzNzY4LCAweDM3NjksIDB4Mzc2QSwgMHgzNzZCLAotICAgIDB4Mzc2QywgMHgzNzZELCAweDM3NkUsIDB4Mzc2RiwgMHgzNzcwLCAweDM3NzEsIDB4Mzc3MiwgMHgzNzczLAotICAgIDB4Mzc3NCwgMHgzNzc1LCAweDM3NzYsIDB4Mzc3NywgMHgzNzc4LCAweDM3NzksIDB4Mzc3QSwgMHgzNzdCLAotICAgIDB4Mzc3QywgMHgzNzdELCAweDM3N0UsIDB4Mzc3RiwgMHgzNzgwLCAweDM3ODEsIDB4Mzc4MiwgMHgzNzgzLAotICAgIDB4Mzc4NCwgMHgzNzg1LCAweDM3ODYsIDB4Mzc4NywgMHgzNzg4LCAweDM3ODksIDB4Mzc4QSwgMHgzNzhCLAotICAgIDB4Mzc4QywgMHgzNzhELCAweDM3OEUsIDB4Mzc4RiwgMHgzNzkwLCAweDM3OTEsIDB4Mzc5MiwgMHgzNzkzLAotICAgIDB4Mzc5NCwgMHgzNzk1LCAweDM3OTYsIDB4Mzc5NywgMHgzNzk4LCAweDM3OTksIDB4Mzc5QSwgMHgzNzlCLAotICAgIDB4Mzc5QywgMHgzNzlELCAweDM3OUUsIDB4Mzc5RiwgMHgzN0EwLCAweDM3QTEsIDB4MzdBMiwgMHgzN0EzLAotICAgIDB4MzdBNCwgMHgzN0E1LCAweDM3QTYsIDB4MzdBNywgMHgzN0E4LCAweDM3QTksIDB4MzdBQSwgMHgzN0FCLAotICAgIDB4MzdBQywgMHgzN0FELCAweDM3QUUsIDB4MzdBRiwgMHgzN0IwLCAweDM3QjEsIDB4MzdCMiwgMHgzN0IzLAotICAgIDB4MzdCNCwgMHgzN0I1LCAweDM3QjYsIDB4MzdCNywgMHgzN0I4LCAweDM3QjksIDB4MzdCQSwgMHgzN0JCLAotICAgIDB4MzdCQywgMHgzN0JELCAweDM3QkUsIDB4MzdCRiwgMHgzN0MwLCAweDM3QzEsIDB4MzdDMiwgMHgzN0MzLAotICAgIDB4MzdDNCwgMHgzN0M1LCAweDM3QzYsIDB4MzdDNywgMHgzN0M4LCAweDM3QzksIDB4MzdDQSwgMHgzN0NCLAotICAgIDB4MzdDQywgMHgzN0NELCAweDM3Q0UsIDB4MzdDRiwgMHgzN0QwLCAweDM3RDEsIDB4MzdEMiwgMHgzN0QzLAotICAgIDB4MzdENCwgMHgzN0Q1LCAweDM3RDYsIDB4MzdENywgMHgzN0Q4LCAweDM3RDksIDB4MzdEQSwgMHgzN0RCLAotICAgIDB4MzdEQywgMHgzN0RELCAweDM3REUsIDB4MzdERiwgMHgzN0UwLCAweDM3RTEsIDB4MzdFMiwgMHgzN0UzLAotICAgIDB4MzdFNCwgMHgzN0U1LCAweDM3RTYsIDB4MzdFNywgMHgzN0U4LCAweDM3RTksIDB4MzdFQSwgMHgzN0VCLAotICAgIDB4MzdFQywgMHgzN0VELCAweDM3RUUsIDB4MzdFRiwgMHgzN0YwLCAweDM3RjEsIDB4MzdGMiwgMHgzN0YzLAotICAgIDB4MzdGNCwgMHgzN0Y1LCAweDM3RjYsIDB4MzdGNywgMHgzN0Y4LCAweDM3RjksIDB4MzdGQSwgMHgzN0ZCLAotICAgIDB4MzdGQywgMHgzN0ZELCAweDM3RkUsIDB4MzdGRiwgMHgzODAwLCAweDM4MDEsIDB4MzgwMiwgMHgzODAzLAotICAgIDB4MzgwNCwgMHgzODA1LCAweDM4MDYsIDB4MzgwNywgMHgzODA4LCAweDM4MDksIDB4MzgwQSwgMHgzODBCLAotICAgIDB4MzgwQywgMHgzODBELCAweDM4MEUsIDB4MzgwRiwgMHgzODEwLCAweDM4MTEsIDB4MzgxMiwgMHgzODEzLAotICAgIDB4MzgxNCwgMHgzODE1LCAweDM4MTYsIDB4MzgxNywgMHgzODE4LCAweDM4MTksIDB4MzgxQSwgMHgzODFCLAotICAgIDB4MzgxQywgMHgzODFELCAweDM4MUUsIDB4MzgxRiwgMHgzODIwLCAweDM4MjEsIDB4MzgyMiwgMHgzODIzLAotICAgIDB4MzgyNCwgMHgzODI1LCAweDM4MjYsIDB4MzgyNywgMHgzODI4LCAweDM4MjksIDB4MzgyQSwgMHgzODJCLAotICAgIDB4MzgyQywgMHgzODJELCAweDM4MkUsIDB4MzgyRiwgMHgzODMwLCAweDM4MzEsIDB4MzgzMiwgMHgzODMzLAotICAgIDB4MzgzNCwgMHgzODM1LCAweDM4MzYsIDB4MzgzNywgMHgzODM4LCAweDM4MzksIDB4MzgzQSwgMHgzODNCLAotICAgIDB4MzgzQywgMHgzODNELCAweDM4M0UsIDB4MzgzRiwgMHgzODQwLCAweDM4NDEsIDB4Mzg0MiwgMHgzODQzLAotICAgIDB4Mzg0NCwgMHgzODQ1LCAweDM4NDYsIDB4Mzg0NywgMHgzODQ4LCAweDM4NDksIDB4Mzg0QSwgMHgzODRCLAotICAgIDB4Mzg0QywgMHgzODRELCAweDM4NEUsIDB4Mzg0RiwgMHgzODUwLCAweDM4NTEsIDB4Mzg1MiwgMHgzODUzLAotICAgIDB4Mzg1NCwgMHgzODU1LCAweDM4NTYsIDB4Mzg1NywgMHgzODU4LCAweDM4NTksIDB4Mzg1QSwgMHgzODVCLAotICAgIDB4Mzg1QywgMHgzODVELCAweDM4NUUsIDB4Mzg1RiwgMHgzODYwLCAweDM4NjEsIDB4Mzg2MiwgMHgzODYzLAotICAgIDB4Mzg2NCwgMHgzODY1LCAweDM4NjYsIDB4Mzg2NywgMHgzODY4LCAweDM4NjksIDB4Mzg2QSwgMHgzODZCLAotICAgIDB4Mzg2QywgMHgzODZELCAweDM4NkUsIDB4Mzg2RiwgMHgzODcwLCAweDM4NzEsIDB4Mzg3MiwgMHgzODczLAotICAgIDB4Mzg3NCwgMHgzODc1LCAweDM4NzYsIDB4Mzg3NywgMHgzODc4LCAweDM4NzksIDB4Mzg3QSwgMHgzODdCLAotICAgIDB4Mzg3QywgMHgzODdELCAweDM4N0UsIDB4Mzg3RiwgMHgzODgwLCAweDM4ODEsIDB4Mzg4MiwgMHgzODgzLAotICAgIDB4Mzg4NCwgMHgzODg1LCAweDM4ODYsIDB4Mzg4NywgMHgzODg4LCAweDM4ODksIDB4Mzg4QSwgMHgzODhCLAotICAgIDB4Mzg4QywgMHgzODhELCAweDM4OEUsIDB4Mzg4RiwgMHgzODkwLCAweDM4OTEsIDB4Mzg5MiwgMHgzODkzLAotICAgIDB4Mzg5NCwgMHgzODk1LCAweDM4OTYsIDB4Mzg5NywgMHgzODk4LCAweDM4OTksIDB4Mzg5QSwgMHgzODlCLAotICAgIDB4Mzg5QywgMHgzODlELCAweDM4OUUsIDB4Mzg5RiwgMHgzOEEwLCAweDM4QTEsIDB4MzhBMiwgMHgzOEEzLAotICAgIDB4MzhBNCwgMHgzOEE1LCAweDM4QTYsIDB4MzhBNywgMHgzOEE4LCAweDM4QTksIDB4MzhBQSwgMHgzOEFCLAotICAgIDB4MzhBQywgMHgzOEFELCAweDM4QUUsIDB4MzhBRiwgMHgzOEIwLCAweDM4QjEsIDB4MzhCMiwgMHgzOEIzLAotICAgIDB4MzhCNCwgMHgzOEI1LCAweDM4QjYsIDB4MzhCNywgMHgzOEI4LCAweDM4QjksIDB4MzhCQSwgMHgzOEJCLAotICAgIDB4MzhCQywgMHgzOEJELCAweDM4QkUsIDB4MzhCRiwgMHgzOEMwLCAweDM4QzEsIDB4MzhDMiwgMHgzOEMzLAotICAgIDB4MzhDNCwgMHgzOEM1LCAweDM4QzYsIDB4MzhDNywgMHgzOEM4LCAweDM4QzksIDB4MzhDQSwgMHgzOENCLAotICAgIDB4MzhDQywgMHgzOENELCAweDM4Q0UsIDB4MzhDRiwgMHgzOEQwLCAweDM4RDEsIDB4MzhEMiwgMHgzOEQzLAotICAgIDB4MzhENCwgMHgzOEQ1LCAweDM4RDYsIDB4MzhENywgMHgzOEQ4LCAweDM4RDksIDB4MzhEQSwgMHgzOERCLAotICAgIDB4MzhEQywgMHgzOERELCAweDM4REUsIDB4MzhERiwgMHgzOEUwLCAweDM4RTEsIDB4MzhFMiwgMHgzOEUzLAotICAgIDB4MzhFNCwgMHgzOEU1LCAweDM4RTYsIDB4MzhFNywgMHgzOEU4LCAweDM4RTksIDB4MzhFQSwgMHgzOEVCLAotICAgIDB4MzhFQywgMHgzOEVELCAweDM4RUUsIDB4MzhFRiwgMHgzOEYwLCAweDM4RjEsIDB4MzhGMiwgMHgzOEYzLAotICAgIDB4MzhGNCwgMHgzOEY1LCAweDM4RjYsIDB4MzhGNywgMHgzOEY4LCAweDM4RjksIDB4MzhGQSwgMHgzOEZCLAotICAgIDB4MzhGQywgMHgzOEZELCAweDM4RkUsIDB4MzhGRiwgMHgzOTAwLCAweDM5MDEsIDB4MzkwMiwgMHgzOTAzLAotICAgIDB4MzkwNCwgMHgzOTA1LCAweDM5MDYsIDB4MzkwNywgMHgzOTA4LCAweDM5MDksIDB4MzkwQSwgMHgzOTBCLAotICAgIDB4MzkwQywgMHgzOTBELCAweDM5MEUsIDB4MzkwRiwgMHgzOTEwLCAweDM5MTEsIDB4MzkxMiwgMHgzOTEzLAotICAgIDB4MzkxNCwgMHgzOTE1LCAweDM5MTYsIDB4MzkxNywgMHgzOTE5LCAweDM5MUEsIDB4MzkxQiwgMHgzOTFDLAotICAgIDB4MzkxRCwgMHgzOTFFLCAweDM5MUYsIDB4MzkyMCwgMHgzOTIxLCAweDM5MjIsIDB4MzkyMywgMHgzOTI0LAotICAgIDB4MzkyNSwgMHgzOTI2LCAweDM5MjcsIDB4MzkyOCwgMHgzOTI5LCAweDM5MkEsIDB4MzkyQiwgMHgzOTJDLAotICAgIDB4MzkyRCwgMHgzOTJFLCAweDM5MkYsIDB4MzkzMCwgMHgzOTMxLCAweDM5MzIsIDB4MzkzMywgMHgzOTM0LAotICAgIDB4MzkzNSwgMHgzOTM2LCAweDM5MzcsIDB4MzkzOCwgMHgzOTM5LCAweDM5M0EsIDB4MzkzQiwgMHgzOTNDLAotICAgIDB4MzkzRCwgMHgzOTNFLCAweDM5M0YsIDB4Mzk0MCwgMHgzOTQxLCAweDM5NDIsIDB4Mzk0MywgMHgzOTQ0LAotICAgIDB4Mzk0NSwgMHgzOTQ2LCAweDM5NDcsIDB4Mzk0OCwgMHgzOTQ5LCAweDM5NEEsIDB4Mzk0QiwgMHgzOTRDLAotICAgIDB4Mzk0RCwgMHgzOTRFLCAweDM5NEYsIDB4Mzk1MCwgMHgzOTUxLCAweDM5NTIsIDB4Mzk1MywgMHgzOTU0LAotICAgIDB4Mzk1NSwgMHgzOTU2LCAweDM5NTcsIDB4Mzk1OCwgMHgzOTU5LCAweDM5NUEsIDB4Mzk1QiwgMHgzOTVDLAotICAgIDB4Mzk1RCwgMHgzOTVFLCAweDM5NUYsIDB4Mzk2MCwgMHgzOTYxLCAweDM5NjIsIDB4Mzk2MywgMHgzOTY0LAotICAgIDB4Mzk2NSwgMHgzOTY2LCAweDM5NjcsIDB4Mzk2OCwgMHgzOTY5LCAweDM5NkEsIDB4Mzk2QiwgMHgzOTZDLAotICAgIDB4Mzk2RCwgMHgzOTZGLCAweDM5NzAsIDB4Mzk3MSwgMHgzOTcyLCAweDM5NzMsIDB4Mzk3NCwgMHgzOTc1LAotICAgIDB4Mzk3NiwgMHgzOTc3LCAweDM5NzgsIDB4Mzk3OSwgMHgzOTdBLCAweDM5N0IsIDB4Mzk3QywgMHgzOTdELAotICAgIDB4Mzk3RSwgMHgzOTdGLCAweDM5ODAsIDB4Mzk4MSwgMHgzOTgyLCAweDM5ODMsIDB4Mzk4NCwgMHgzOTg1LAotICAgIDB4Mzk4NiwgMHgzOTg3LCAweDM5ODgsIDB4Mzk4OSwgMHgzOThBLCAweDM5OEIsIDB4Mzk4QywgMHgzOThELAotICAgIDB4Mzk4RSwgMHgzOThGLCAweDM5OTAsIDB4Mzk5MSwgMHgzOTkyLCAweDM5OTMsIDB4Mzk5NCwgMHgzOTk1LAotICAgIDB4Mzk5NiwgMHgzOTk3LCAweDM5OTgsIDB4Mzk5OSwgMHgzOTlBLCAweDM5OUIsIDB4Mzk5QywgMHgzOTlELAotICAgIDB4Mzk5RSwgMHgzOTlGLCAweDM5QTAsIDB4MzlBMSwgMHgzOUEyLCAweDM5QTMsIDB4MzlBNCwgMHgzOUE1LAotICAgIDB4MzlBNiwgMHgzOUE3LCAweDM5QTgsIDB4MzlBOSwgMHgzOUFBLCAweDM5QUIsIDB4MzlBQywgMHgzOUFELAotICAgIDB4MzlBRSwgMHgzOUFGLCAweDM5QjAsIDB4MzlCMSwgMHgzOUIyLCAweDM5QjMsIDB4MzlCNCwgMHgzOUI1LAotICAgIDB4MzlCNiwgMHgzOUI3LCAweDM5QjgsIDB4MzlCOSwgMHgzOUJBLCAweDM5QkIsIDB4MzlCQywgMHgzOUJELAotICAgIDB4MzlCRSwgMHgzOUJGLCAweDM5QzAsIDB4MzlDMSwgMHgzOUMyLCAweDM5QzMsIDB4MzlDNCwgMHgzOUM1LAotICAgIDB4MzlDNiwgMHgzOUM3LCAweDM5QzgsIDB4MzlDOSwgMHgzOUNBLCAweDM5Q0IsIDB4MzlDQywgMHgzOUNELAotICAgIDB4MzlDRSwgMHgzOUQxLCAweDM5RDIsIDB4MzlEMywgMHgzOUQ0LCAweDM5RDUsIDB4MzlENiwgMHgzOUQ3LAotICAgIDB4MzlEOCwgMHgzOUQ5LCAweDM5REEsIDB4MzlEQiwgMHgzOURDLCAweDM5REQsIDB4MzlERSwgMHgzOUUwLAotICAgIDB4MzlFMSwgMHgzOUUyLCAweDM5RTMsIDB4MzlFNCwgMHgzOUU1LCAweDM5RTYsIDB4MzlFNywgMHgzOUU4LAotICAgIDB4MzlFOSwgMHgzOUVBLCAweDM5RUIsIDB4MzlFQywgMHgzOUVELCAweDM5RUUsIDB4MzlFRiwgMHgzOUYwLAotICAgIDB4MzlGMSwgMHgzOUYyLCAweDM5RjMsIDB4MzlGNCwgMHgzOUY1LCAweDM5RjYsIDB4MzlGNywgMHgzOUY4LAotICAgIDB4MzlGOSwgMHgzOUZBLCAweDM5RkIsIDB4MzlGQywgMHgzOUZELCAweDM5RkUsIDB4MzlGRiwgMHgzQTAwLAotICAgIDB4M0EwMSwgMHgzQTAyLCAweDNBMDMsIDB4M0EwNCwgMHgzQTA1LCAweDNBMDYsIDB4M0EwNywgMHgzQTA4LAotICAgIDB4M0EwOSwgMHgzQTBBLCAweDNBMEIsIDB4M0EwQywgMHgzQTBELCAweDNBMEUsIDB4M0EwRiwgMHgzQTEwLAotICAgIDB4M0ExMSwgMHgzQTEyLCAweDNBMTMsIDB4M0ExNCwgMHgzQTE1LCAweDNBMTYsIDB4M0ExNywgMHgzQTE4LAotICAgIDB4M0ExOSwgMHgzQTFBLCAweDNBMUIsIDB4M0ExQywgMHgzQTFELCAweDNBMUUsIDB4M0ExRiwgMHgzQTIwLAotICAgIDB4M0EyMSwgMHgzQTIyLCAweDNBMjMsIDB4M0EyNCwgMHgzQTI1LCAweDNBMjYsIDB4M0EyNywgMHgzQTI4LAotICAgIDB4M0EyOSwgMHgzQTJBLCAweDNBMkIsIDB4M0EyQywgMHgzQTJELCAweDNBMkUsIDB4M0EyRiwgMHgzQTMwLAotICAgIDB4M0EzMSwgMHgzQTMyLCAweDNBMzMsIDB4M0EzNCwgMHgzQTM1LCAweDNBMzYsIDB4M0EzNywgMHgzQTM4LAotICAgIDB4M0EzOSwgMHgzQTNBLCAweDNBM0IsIDB4M0EzQywgMHgzQTNELCAweDNBM0UsIDB4M0EzRiwgMHgzQTQwLAotICAgIDB4M0E0MSwgMHgzQTQyLCAweDNBNDMsIDB4M0E0NCwgMHgzQTQ1LCAweDNBNDYsIDB4M0E0NywgMHgzQTQ4LAotICAgIDB4M0E0OSwgMHgzQTRBLCAweDNBNEIsIDB4M0E0QywgMHgzQTRELCAweDNBNEUsIDB4M0E0RiwgMHgzQTUwLAotICAgIDB4M0E1MSwgMHgzQTUyLCAweDNBNTMsIDB4M0E1NCwgMHgzQTU1LCAweDNBNTYsIDB4M0E1NywgMHgzQTU4LAotICAgIDB4M0E1OSwgMHgzQTVBLCAweDNBNUIsIDB4M0E1QywgMHgzQTVELCAweDNBNUUsIDB4M0E1RiwgMHgzQTYwLAotICAgIDB4M0E2MSwgMHgzQTYyLCAweDNBNjMsIDB4M0E2NCwgMHgzQTY1LCAweDNBNjYsIDB4M0E2NywgMHgzQTY4LAotICAgIDB4M0E2OSwgMHgzQTZBLCAweDNBNkIsIDB4M0E2QywgMHgzQTZELCAweDNBNkUsIDB4M0E2RiwgMHgzQTcwLAotICAgIDB4M0E3MSwgMHgzQTcyLCAweDNBNzQsIDB4M0E3NSwgMHgzQTc2LCAweDNBNzcsIDB4M0E3OCwgMHgzQTc5LAotICAgIDB4M0E3QSwgMHgzQTdCLCAweDNBN0MsIDB4M0E3RCwgMHgzQTdFLCAweDNBN0YsIDB4M0E4MCwgMHgzQTgxLAotICAgIDB4M0E4MiwgMHgzQTgzLCAweDNBODQsIDB4M0E4NSwgMHgzQTg2LCAweDNBODcsIDB4M0E4OCwgMHgzQTg5LAotICAgIDB4M0E4QSwgMHgzQThCLCAweDNBOEMsIDB4M0E4RCwgMHgzQThFLCAweDNBOEYsIDB4M0E5MCwgMHgzQTkxLAotICAgIDB4M0E5MiwgMHgzQTkzLCAweDNBOTQsIDB4M0E5NSwgMHgzQTk2LCAweDNBOTcsIDB4M0E5OCwgMHgzQTk5LAotICAgIDB4M0E5QSwgMHgzQTlCLCAweDNBOUMsIDB4M0E5RCwgMHgzQTlFLCAweDNBOUYsIDB4M0FBMCwgMHgzQUExLAotICAgIDB4M0FBMiwgMHgzQUEzLCAweDNBQTQsIDB4M0FBNSwgMHgzQUE2LCAweDNBQTcsIDB4M0FBOCwgMHgzQUE5LAotICAgIDB4M0FBQSwgMHgzQUFCLCAweDNBQUMsIDB4M0FBRCwgMHgzQUFFLCAweDNBQUYsIDB4M0FCMCwgMHgzQUIxLAotICAgIDB4M0FCMiwgMHgzQUIzLCAweDNBQjQsIDB4M0FCNSwgMHgzQUI2LCAweDNBQjcsIDB4M0FCOCwgMHgzQUI5LAotICAgIDB4M0FCQSwgMHgzQUJCLCAweDNBQkMsIDB4M0FCRCwgMHgzQUJFLCAweDNBQkYsIDB4M0FDMCwgMHgzQUMxLAotICAgIDB4M0FDMiwgMHgzQUMzLCAweDNBQzQsIDB4M0FDNSwgMHgzQUM2LCAweDNBQzcsIDB4M0FDOCwgMHgzQUM5LAotICAgIDB4M0FDQSwgMHgzQUNCLCAweDNBQ0MsIDB4M0FDRCwgMHgzQUNFLCAweDNBQ0YsIDB4M0FEMCwgMHgzQUQxLAotICAgIDB4M0FEMiwgMHgzQUQzLCAweDNBRDQsIDB4M0FENSwgMHgzQUQ2LCAweDNBRDcsIDB4M0FEOCwgMHgzQUQ5LAotICAgIDB4M0FEQSwgMHgzQURCLCAweDNBREMsIDB4M0FERCwgMHgzQURFLCAweDNBREYsIDB4M0FFMCwgMHgzQUUxLAotICAgIDB4M0FFMiwgMHgzQUUzLCAweDNBRTQsIDB4M0FFNSwgMHgzQUU2LCAweDNBRTcsIDB4M0FFOCwgMHgzQUU5LAotICAgIDB4M0FFQSwgMHgzQUVCLCAweDNBRUMsIDB4M0FFRCwgMHgzQUVFLCAweDNBRUYsIDB4M0FGMCwgMHgzQUYxLAotICAgIDB4M0FGMiwgMHgzQUYzLCAweDNBRjQsIDB4M0FGNSwgMHgzQUY2LCAweDNBRjcsIDB4M0FGOCwgMHgzQUY5LAotICAgIDB4M0FGQSwgMHgzQUZCLCAweDNBRkMsIDB4M0FGRCwgMHgzQUZFLCAweDNBRkYsIDB4M0IwMCwgMHgzQjAxLAotICAgIDB4M0IwMiwgMHgzQjAzLCAweDNCMDQsIDB4M0IwNSwgMHgzQjA2LCAweDNCMDcsIDB4M0IwOCwgMHgzQjA5LAotICAgIDB4M0IwQSwgMHgzQjBCLCAweDNCMEMsIDB4M0IwRCwgMHgzQjBFLCAweDNCMEYsIDB4M0IxMCwgMHgzQjExLAotICAgIDB4M0IxMiwgMHgzQjEzLCAweDNCMTQsIDB4M0IxNSwgMHgzQjE2LCAweDNCMTcsIDB4M0IxOCwgMHgzQjE5LAotICAgIDB4M0IxQSwgMHgzQjFCLCAweDNCMUMsIDB4M0IxRCwgMHgzQjFFLCAweDNCMUYsIDB4M0IyMCwgMHgzQjIxLAotICAgIDB4M0IyMiwgMHgzQjIzLCAweDNCMjQsIDB4M0IyNSwgMHgzQjI2LCAweDNCMjcsIDB4M0IyOCwgMHgzQjI5LAotICAgIDB4M0IyQSwgMHgzQjJCLCAweDNCMkMsIDB4M0IyRCwgMHgzQjJFLCAweDNCMkYsIDB4M0IzMCwgMHgzQjMxLAotICAgIDB4M0IzMiwgMHgzQjMzLCAweDNCMzQsIDB4M0IzNSwgMHgzQjM2LCAweDNCMzcsIDB4M0IzOCwgMHgzQjM5LAotICAgIDB4M0IzQSwgMHgzQjNCLCAweDNCM0MsIDB4M0IzRCwgMHgzQjNFLCAweDNCM0YsIDB4M0I0MCwgMHgzQjQxLAotICAgIDB4M0I0MiwgMHgzQjQzLCAweDNCNDQsIDB4M0I0NSwgMHgzQjQ2LCAweDNCNDcsIDB4M0I0OCwgMHgzQjQ5LAotICAgIDB4M0I0QSwgMHgzQjRCLCAweDNCNEMsIDB4M0I0RCwgMHgzQjRGLCAweDNCNTAsIDB4M0I1MSwgMHgzQjUyLAotICAgIDB4M0I1MywgMHgzQjU0LCAweDNCNTUsIDB4M0I1NiwgMHgzQjU3LCAweDNCNTgsIDB4M0I1OSwgMHgzQjVBLAotICAgIDB4M0I1QiwgMHgzQjVDLCAweDNCNUQsIDB4M0I1RSwgMHgzQjVGLCAweDNCNjAsIDB4M0I2MSwgMHgzQjYyLAotICAgIDB4M0I2MywgMHgzQjY0LCAweDNCNjUsIDB4M0I2NiwgMHgzQjY3LCAweDNCNjgsIDB4M0I2OSwgMHgzQjZBLAotICAgIDB4M0I2QiwgMHgzQjZDLCAweDNCNkQsIDB4M0I2RSwgMHgzQjZGLCAweDNCNzAsIDB4M0I3MSwgMHgzQjcyLAotICAgIDB4M0I3MywgMHgzQjc0LCAweDNCNzUsIDB4M0I3NiwgMHgzQjc3LCAweDNCNzgsIDB4M0I3OSwgMHgzQjdBLAotICAgIDB4M0I3QiwgMHgzQjdDLCAweDNCN0QsIDB4M0I3RSwgMHgzQjdGLCAweDNCODAsIDB4M0I4MSwgMHgzQjgyLAotICAgIDB4M0I4MywgMHgzQjg0LCAweDNCODUsIDB4M0I4NiwgMHgzQjg3LCAweDNCODgsIDB4M0I4OSwgMHgzQjhBLAotICAgIDB4M0I4QiwgMHgzQjhDLCAweDNCOEQsIDB4M0I4RSwgMHgzQjhGLCAweDNCOTAsIDB4M0I5MSwgMHgzQjkyLAotICAgIDB4M0I5MywgMHgzQjk0LCAweDNCOTUsIDB4M0I5NiwgMHgzQjk3LCAweDNCOTgsIDB4M0I5OSwgMHgzQjlBLAotICAgIDB4M0I5QiwgMHgzQjlDLCAweDNCOUQsIDB4M0I5RSwgMHgzQjlGLCAweDNCQTAsIDB4M0JBMSwgMHgzQkEyLAotICAgIDB4M0JBMywgMHgzQkE0LCAweDNCQTUsIDB4M0JBNiwgMHgzQkE3LCAweDNCQTgsIDB4M0JBOSwgMHgzQkFBLAotICAgIDB4M0JBQiwgMHgzQkFDLCAweDNCQUQsIDB4M0JBRSwgMHgzQkFGLCAweDNCQjAsIDB4M0JCMSwgMHgzQkIyLAotICAgIDB4M0JCMywgMHgzQkI0LCAweDNCQjUsIDB4M0JCNiwgMHgzQkI3LCAweDNCQjgsIDB4M0JCOSwgMHgzQkJBLAotICAgIDB4M0JCQiwgMHgzQkJDLCAweDNCQkQsIDB4M0JCRSwgMHgzQkJGLCAweDNCQzAsIDB4M0JDMSwgMHgzQkMyLAotICAgIDB4M0JDMywgMHgzQkM0LCAweDNCQzUsIDB4M0JDNiwgMHgzQkM3LCAweDNCQzgsIDB4M0JDOSwgMHgzQkNBLAotICAgIDB4M0JDQiwgMHgzQkNDLCAweDNCQ0QsIDB4M0JDRSwgMHgzQkNGLCAweDNCRDAsIDB4M0JEMSwgMHgzQkQyLAotICAgIDB4M0JEMywgMHgzQkQ0LCAweDNCRDUsIDB4M0JENiwgMHgzQkQ3LCAweDNCRDgsIDB4M0JEOSwgMHgzQkRBLAotICAgIDB4M0JEQiwgMHgzQkRDLCAweDNCREQsIDB4M0JERSwgMHgzQkRGLCAweDNCRTAsIDB4M0JFMSwgMHgzQkUyLAotICAgIDB4M0JFMywgMHgzQkU0LCAweDNCRTUsIDB4M0JFNiwgMHgzQkU3LCAweDNCRTgsIDB4M0JFOSwgMHgzQkVBLAotICAgIDB4M0JFQiwgMHgzQkVDLCAweDNCRUQsIDB4M0JFRSwgMHgzQkVGLCAweDNCRjAsIDB4M0JGMSwgMHgzQkYyLAotICAgIDB4M0JGMywgMHgzQkY0LCAweDNCRjUsIDB4M0JGNiwgMHgzQkY3LCAweDNCRjgsIDB4M0JGOSwgMHgzQkZBLAotICAgIDB4M0JGQiwgMHgzQkZDLCAweDNCRkQsIDB4M0JGRSwgMHgzQkZGLCAweDNDMDAsIDB4M0MwMSwgMHgzQzAyLAotICAgIDB4M0MwMywgMHgzQzA0LCAweDNDMDUsIDB4M0MwNiwgMHgzQzA3LCAweDNDMDgsIDB4M0MwOSwgMHgzQzBBLAotICAgIDB4M0MwQiwgMHgzQzBDLCAweDNDMEQsIDB4M0MwRSwgMHgzQzBGLCAweDNDMTAsIDB4M0MxMSwgMHgzQzEyLAotICAgIDB4M0MxMywgMHgzQzE0LCAweDNDMTUsIDB4M0MxNiwgMHgzQzE3LCAweDNDMTgsIDB4M0MxOSwgMHgzQzFBLAotICAgIDB4M0MxQiwgMHgzQzFDLCAweDNDMUQsIDB4M0MxRSwgMHgzQzFGLCAweDNDMjAsIDB4M0MyMSwgMHgzQzIyLAotICAgIDB4M0MyMywgMHgzQzI0LCAweDNDMjUsIDB4M0MyNiwgMHgzQzI3LCAweDNDMjgsIDB4M0MyOSwgMHgzQzJBLAotICAgIDB4M0MyQiwgMHgzQzJDLCAweDNDMkQsIDB4M0MyRSwgMHgzQzJGLCAweDNDMzAsIDB4M0MzMSwgMHgzQzMyLAotICAgIDB4M0MzMywgMHgzQzM0LCAweDNDMzUsIDB4M0MzNiwgMHgzQzM3LCAweDNDMzgsIDB4M0MzOSwgMHgzQzNBLAotICAgIDB4M0MzQiwgMHgzQzNDLCAweDNDM0QsIDB4M0MzRSwgMHgzQzNGLCAweDNDNDAsIDB4M0M0MSwgMHgzQzQyLAotICAgIDB4M0M0MywgMHgzQzQ0LCAweDNDNDUsIDB4M0M0NiwgMHgzQzQ3LCAweDNDNDgsIDB4M0M0OSwgMHgzQzRBLAotICAgIDB4M0M0QiwgMHgzQzRDLCAweDNDNEQsIDB4M0M0RSwgMHgzQzRGLCAweDNDNTAsIDB4M0M1MSwgMHgzQzUyLAotICAgIDB4M0M1MywgMHgzQzU0LCAweDNDNTUsIDB4M0M1NiwgMHgzQzU3LCAweDNDNTgsIDB4M0M1OSwgMHgzQzVBLAotICAgIDB4M0M1QiwgMHgzQzVDLCAweDNDNUQsIDB4M0M1RSwgMHgzQzVGLCAweDNDNjAsIDB4M0M2MSwgMHgzQzYyLAotICAgIDB4M0M2MywgMHgzQzY0LCAweDNDNjUsIDB4M0M2NiwgMHgzQzY3LCAweDNDNjgsIDB4M0M2OSwgMHgzQzZBLAotICAgIDB4M0M2QiwgMHgzQzZDLCAweDNDNkQsIDB4M0M2RiwgMHgzQzcwLCAweDNDNzEsIDB4M0M3MiwgMHgzQzczLAotICAgIDB4M0M3NCwgMHgzQzc1LCAweDNDNzYsIDB4M0M3NywgMHgzQzc4LCAweDNDNzksIDB4M0M3QSwgMHgzQzdCLAotICAgIDB4M0M3QywgMHgzQzdELCAweDNDN0UsIDB4M0M3RiwgMHgzQzgwLCAweDNDODEsIDB4M0M4MiwgMHgzQzgzLAotICAgIDB4M0M4NCwgMHgzQzg1LCAweDNDODYsIDB4M0M4NywgMHgzQzg4LCAweDNDODksIDB4M0M4QSwgMHgzQzhCLAotICAgIDB4M0M4QywgMHgzQzhELCAweDNDOEUsIDB4M0M4RiwgMHgzQzkwLCAweDNDOTEsIDB4M0M5MiwgMHgzQzkzLAotICAgIDB4M0M5NCwgMHgzQzk1LCAweDNDOTYsIDB4M0M5NywgMHgzQzk4LCAweDNDOTksIDB4M0M5QSwgMHgzQzlCLAotICAgIDB4M0M5QywgMHgzQzlELCAweDNDOUUsIDB4M0M5RiwgMHgzQ0EwLCAweDNDQTEsIDB4M0NBMiwgMHgzQ0EzLAotICAgIDB4M0NBNCwgMHgzQ0E1LCAweDNDQTYsIDB4M0NBNywgMHgzQ0E4LCAweDNDQTksIDB4M0NBQSwgMHgzQ0FCLAotICAgIDB4M0NBQywgMHgzQ0FELCAweDNDQUUsIDB4M0NBRiwgMHgzQ0IwLCAweDNDQjEsIDB4M0NCMiwgMHgzQ0IzLAotICAgIDB4M0NCNCwgMHgzQ0I1LCAweDNDQjYsIDB4M0NCNywgMHgzQ0I4LCAweDNDQjksIDB4M0NCQSwgMHgzQ0JCLAotICAgIDB4M0NCQywgMHgzQ0JELCAweDNDQkUsIDB4M0NCRiwgMHgzQ0MwLCAweDNDQzEsIDB4M0NDMiwgMHgzQ0MzLAotICAgIDB4M0NDNCwgMHgzQ0M1LCAweDNDQzYsIDB4M0NDNywgMHgzQ0M4LCAweDNDQzksIDB4M0NDQSwgMHgzQ0NCLAotICAgIDB4M0NDQywgMHgzQ0NELCAweDNDQ0UsIDB4M0NDRiwgMHgzQ0QwLCAweDNDRDEsIDB4M0NEMiwgMHgzQ0QzLAotICAgIDB4M0NENCwgMHgzQ0Q1LCAweDNDRDYsIDB4M0NENywgMHgzQ0Q4LCAweDNDRDksIDB4M0NEQSwgMHgzQ0RCLAotICAgIDB4M0NEQywgMHgzQ0RELCAweDNDREUsIDB4M0NERiwgMHgzQ0UxLCAweDNDRTIsIDB4M0NFMywgMHgzQ0U0LAotICAgIDB4M0NFNSwgMHgzQ0U2LCAweDNDRTcsIDB4M0NFOCwgMHgzQ0U5LCAweDNDRUEsIDB4M0NFQiwgMHgzQ0VDLAotICAgIDB4M0NFRCwgMHgzQ0VFLCAweDNDRUYsIDB4M0NGMCwgMHgzQ0YxLCAweDNDRjIsIDB4M0NGMywgMHgzQ0Y0LAotICAgIDB4M0NGNSwgMHgzQ0Y2LCAweDNDRjcsIDB4M0NGOCwgMHgzQ0Y5LCAweDNDRkEsIDB4M0NGQiwgMHgzQ0ZDLAotICAgIDB4M0NGRCwgMHgzQ0ZFLCAweDNDRkYsIDB4M0QwMCwgMHgzRDAxLCAweDNEMDIsIDB4M0QwMywgMHgzRDA0LAotICAgIDB4M0QwNSwgMHgzRDA2LCAweDNEMDcsIDB4M0QwOCwgMHgzRDA5LCAweDNEMEEsIDB4M0QwQiwgMHgzRDBDLAotICAgIDB4M0QwRCwgMHgzRDBFLCAweDNEMEYsIDB4M0QxMCwgMHgzRDExLCAweDNEMTIsIDB4M0QxMywgMHgzRDE0LAotICAgIDB4M0QxNSwgMHgzRDE2LCAweDNEMTcsIDB4M0QxOCwgMHgzRDE5LCAweDNEMUEsIDB4M0QxQiwgMHgzRDFDLAotICAgIDB4M0QxRCwgMHgzRDFFLCAweDNEMUYsIDB4M0QyMCwgMHgzRDIxLCAweDNEMjIsIDB4M0QyMywgMHgzRDI0LAotICAgIDB4M0QyNSwgMHgzRDI2LCAweDNEMjcsIDB4M0QyOCwgMHgzRDI5LCAweDNEMkEsIDB4M0QyQiwgMHgzRDJDLAotICAgIDB4M0QyRCwgMHgzRDJFLCAweDNEMkYsIDB4M0QzMCwgMHgzRDMxLCAweDNEMzIsIDB4M0QzMywgMHgzRDM0LAotICAgIDB4M0QzNSwgMHgzRDM2LCAweDNEMzcsIDB4M0QzOCwgMHgzRDM5LCAweDNEM0EsIDB4M0QzQiwgMHgzRDNDLAotICAgIDB4M0QzRCwgMHgzRDNFLCAweDNEM0YsIDB4M0Q0MCwgMHgzRDQxLCAweDNENDIsIDB4M0Q0MywgMHgzRDQ0LAotICAgIDB4M0Q0NSwgMHgzRDQ2LCAweDNENDcsIDB4M0Q0OCwgMHgzRDQ5LCAweDNENEEsIDB4M0Q0QiwgMHgzRDRDLAotICAgIDB4M0Q0RCwgMHgzRDRFLCAweDNENEYsIDB4M0Q1MCwgMHgzRDUxLCAweDNENTIsIDB4M0Q1MywgMHgzRDU0LAotICAgIDB4M0Q1NSwgMHgzRDU2LCAweDNENTcsIDB4M0Q1OCwgMHgzRDU5LCAweDNENUEsIDB4M0Q1QiwgMHgzRDVDLAotICAgIDB4M0Q1RCwgMHgzRDVFLCAweDNENUYsIDB4M0Q2MCwgMHgzRDYxLCAweDNENjIsIDB4M0Q2MywgMHgzRDY0LAotICAgIDB4M0Q2NSwgMHgzRDY2LCAweDNENjcsIDB4M0Q2OCwgMHgzRDY5LCAweDNENkEsIDB4M0Q2QiwgMHgzRDZDLAotICAgIDB4M0Q2RCwgMHgzRDZFLCAweDNENkYsIDB4M0Q3MCwgMHgzRDcxLCAweDNENzIsIDB4M0Q3MywgMHgzRDc0LAotICAgIDB4M0Q3NSwgMHgzRDc2LCAweDNENzcsIDB4M0Q3OCwgMHgzRDc5LCAweDNEN0EsIDB4M0Q3QiwgMHgzRDdDLAotICAgIDB4M0Q3RCwgMHgzRDdFLCAweDNEN0YsIDB4M0Q4MCwgMHgzRDgxLCAweDNEODIsIDB4M0Q4MywgMHgzRDg0LAotICAgIDB4M0Q4NSwgMHgzRDg2LCAweDNEODcsIDB4M0Q4OCwgMHgzRDg5LCAweDNEOEEsIDB4M0Q4QiwgMHgzRDhDLAotICAgIDB4M0Q4RCwgMHgzRDhFLCAweDNEOEYsIDB4M0Q5MCwgMHgzRDkxLCAweDNEOTIsIDB4M0Q5MywgMHgzRDk0LAotICAgIDB4M0Q5NSwgMHgzRDk2LCAweDNEOTcsIDB4M0Q5OCwgMHgzRDk5LCAweDNEOUEsIDB4M0Q5QiwgMHgzRDlDLAotICAgIDB4M0Q5RCwgMHgzRDlFLCAweDNEOUYsIDB4M0RBMCwgMHgzREExLCAweDNEQTIsIDB4M0RBMywgMHgzREE0LAotICAgIDB4M0RBNSwgMHgzREE2LCAweDNEQTcsIDB4M0RBOCwgMHgzREE5LCAweDNEQUEsIDB4M0RBQiwgMHgzREFDLAotICAgIDB4M0RBRCwgMHgzREFFLCAweDNEQUYsIDB4M0RCMCwgMHgzREIxLCAweDNEQjIsIDB4M0RCMywgMHgzREI0LAotICAgIDB4M0RCNSwgMHgzREI2LCAweDNEQjcsIDB4M0RCOCwgMHgzREI5LCAweDNEQkEsIDB4M0RCQiwgMHgzREJDLAotICAgIDB4M0RCRCwgMHgzREJFLCAweDNEQkYsIDB4M0RDMCwgMHgzREMxLCAweDNEQzIsIDB4M0RDMywgMHgzREM0LAotICAgIDB4M0RDNSwgMHgzREM2LCAweDNEQzcsIDB4M0RDOCwgMHgzREM5LCAweDNEQ0EsIDB4M0RDQiwgMHgzRENDLAotICAgIDB4M0RDRCwgMHgzRENFLCAweDNEQ0YsIDB4M0REMCwgMHgzREQxLCAweDNERDIsIDB4M0REMywgMHgzREQ0LAotICAgIDB4M0RENSwgMHgzREQ2LCAweDNERDcsIDB4M0REOCwgMHgzREQ5LCAweDNEREEsIDB4M0REQiwgMHgzRERDLAotICAgIDB4M0RERCwgMHgzRERFLCAweDNEREYsIDB4M0RFMCwgMHgzREUxLCAweDNERTIsIDB4M0RFMywgMHgzREU0LAotICAgIDB4M0RFNSwgMHgzREU2LCAweDNERTcsIDB4M0RFOCwgMHgzREU5LCAweDNERUEsIDB4M0RFQiwgMHgzREVDLAotICAgIDB4M0RFRCwgMHgzREVFLCAweDNERUYsIDB4M0RGMCwgMHgzREYxLCAweDNERjIsIDB4M0RGMywgMHgzREY0LAotICAgIDB4M0RGNSwgMHgzREY2LCAweDNERjcsIDB4M0RGOCwgMHgzREY5LCAweDNERkEsIDB4M0RGQiwgMHgzREZDLAotICAgIDB4M0RGRCwgMHgzREZFLCAweDNERkYsIDB4M0UwMCwgMHgzRTAxLCAweDNFMDIsIDB4M0UwMywgMHgzRTA0LAotICAgIDB4M0UwNSwgMHgzRTA2LCAweDNFMDcsIDB4M0UwOCwgMHgzRTA5LCAweDNFMEEsIDB4M0UwQiwgMHgzRTBDLAotICAgIDB4M0UwRCwgMHgzRTBFLCAweDNFMEYsIDB4M0UxMCwgMHgzRTExLCAweDNFMTIsIDB4M0UxMywgMHgzRTE0LAotICAgIDB4M0UxNSwgMHgzRTE2LCAweDNFMTcsIDB4M0UxOCwgMHgzRTE5LCAweDNFMUEsIDB4M0UxQiwgMHgzRTFDLAotICAgIDB4M0UxRCwgMHgzRTFFLCAweDNFMUYsIDB4M0UyMCwgMHgzRTIxLCAweDNFMjIsIDB4M0UyMywgMHgzRTI0LAotICAgIDB4M0UyNSwgMHgzRTI2LCAweDNFMjcsIDB4M0UyOCwgMHgzRTI5LCAweDNFMkEsIDB4M0UyQiwgMHgzRTJDLAotICAgIDB4M0UyRCwgMHgzRTJFLCAweDNFMkYsIDB4M0UzMCwgMHgzRTMxLCAweDNFMzIsIDB4M0UzMywgMHgzRTM0LAotICAgIDB4M0UzNSwgMHgzRTM2LCAweDNFMzcsIDB4M0UzOCwgMHgzRTM5LCAweDNFM0EsIDB4M0UzQiwgMHgzRTNDLAotICAgIDB4M0UzRCwgMHgzRTNFLCAweDNFM0YsIDB4M0U0MCwgMHgzRTQxLCAweDNFNDIsIDB4M0U0MywgMHgzRTQ0LAotICAgIDB4M0U0NSwgMHgzRTQ2LCAweDNFNDcsIDB4M0U0OCwgMHgzRTQ5LCAweDNFNEEsIDB4M0U0QiwgMHgzRTRDLAotICAgIDB4M0U0RCwgMHgzRTRFLCAweDNFNEYsIDB4M0U1MCwgMHgzRTUxLCAweDNFNTIsIDB4M0U1MywgMHgzRTU0LAotICAgIDB4M0U1NSwgMHgzRTU2LCAweDNFNTcsIDB4M0U1OCwgMHgzRTU5LCAweDNFNUEsIDB4M0U1QiwgMHgzRTVDLAotICAgIDB4M0U1RCwgMHgzRTVFLCAweDNFNUYsIDB4M0U2MCwgMHgzRTYxLCAweDNFNjIsIDB4M0U2MywgMHgzRTY0LAotICAgIDB4M0U2NSwgMHgzRTY2LCAweDNFNjcsIDB4M0U2OCwgMHgzRTY5LCAweDNFNkEsIDB4M0U2QiwgMHgzRTZDLAotICAgIDB4M0U2RCwgMHgzRTZFLCAweDNFNkYsIDB4M0U3MCwgMHgzRTcxLCAweDNFNzIsIDB4M0U3MywgMHgzRTc0LAotICAgIDB4M0U3NSwgMHgzRTc2LCAweDNFNzcsIDB4M0U3OCwgMHgzRTc5LCAweDNFN0EsIDB4M0U3QiwgMHgzRTdDLAotICAgIDB4M0U3RCwgMHgzRTdFLCAweDNFN0YsIDB4M0U4MCwgMHgzRTgxLCAweDNFODIsIDB4M0U4MywgMHgzRTg0LAotICAgIDB4M0U4NSwgMHgzRTg2LCAweDNFODcsIDB4M0U4OCwgMHgzRTg5LCAweDNFOEEsIDB4M0U4QiwgMHgzRThDLAotICAgIDB4M0U4RCwgMHgzRThFLCAweDNFOEYsIDB4M0U5MCwgMHgzRTkxLCAweDNFOTIsIDB4M0U5MywgMHgzRTk0LAotICAgIDB4M0U5NSwgMHgzRTk2LCAweDNFOTcsIDB4M0U5OCwgMHgzRTk5LCAweDNFOUEsIDB4M0U5QiwgMHgzRTlDLAotICAgIDB4M0U5RCwgMHgzRTlFLCAweDNFOUYsIDB4M0VBMCwgMHgzRUExLCAweDNFQTIsIDB4M0VBMywgMHgzRUE0LAotICAgIDB4M0VBNSwgMHgzRUE2LCAweDNFQTcsIDB4M0VBOCwgMHgzRUE5LCAweDNFQUEsIDB4M0VBQiwgMHgzRUFDLAotICAgIDB4M0VBRCwgMHgzRUFFLCAweDNFQUYsIDB4M0VCMCwgMHgzRUIxLCAweDNFQjIsIDB4M0VCMywgMHgzRUI0LAotICAgIDB4M0VCNSwgMHgzRUI2LCAweDNFQjcsIDB4M0VCOCwgMHgzRUI5LCAweDNFQkEsIDB4M0VCQiwgMHgzRUJDLAotICAgIDB4M0VCRCwgMHgzRUJFLCAweDNFQkYsIDB4M0VDMCwgMHgzRUMxLCAweDNFQzIsIDB4M0VDMywgMHgzRUM0LAotICAgIDB4M0VDNSwgMHgzRUM2LCAweDNFQzcsIDB4M0VDOCwgMHgzRUM5LCAweDNFQ0EsIDB4M0VDQiwgMHgzRUNDLAotICAgIDB4M0VDRCwgMHgzRUNFLCAweDNFQ0YsIDB4M0VEMCwgMHgzRUQxLCAweDNFRDIsIDB4M0VEMywgMHgzRUQ0LAotICAgIDB4M0VENSwgMHgzRUQ2LCAweDNFRDcsIDB4M0VEOCwgMHgzRUQ5LCAweDNFREEsIDB4M0VEQiwgMHgzRURDLAotICAgIDB4M0VERCwgMHgzRURFLCAweDNFREYsIDB4M0VFMCwgMHgzRUUxLCAweDNFRTIsIDB4M0VFMywgMHgzRUU0LAotICAgIDB4M0VFNSwgMHgzRUU2LCAweDNFRTcsIDB4M0VFOCwgMHgzRUU5LCAweDNFRUEsIDB4M0VFQiwgMHgzRUVDLAotICAgIDB4M0VFRCwgMHgzRUVFLCAweDNFRUYsIDB4M0VGMCwgMHgzRUYxLCAweDNFRjIsIDB4M0VGMywgMHgzRUY0LAotICAgIDB4M0VGNSwgMHgzRUY2LCAweDNFRjcsIDB4M0VGOCwgMHgzRUY5LCAweDNFRkEsIDB4M0VGQiwgMHgzRUZDLAotICAgIDB4M0VGRCwgMHgzRUZFLCAweDNFRkYsIDB4M0YwMCwgMHgzRjAxLCAweDNGMDIsIDB4M0YwMywgMHgzRjA0LAotICAgIDB4M0YwNSwgMHgzRjA2LCAweDNGMDcsIDB4M0YwOCwgMHgzRjA5LCAweDNGMEEsIDB4M0YwQiwgMHgzRjBDLAotICAgIDB4M0YwRCwgMHgzRjBFLCAweDNGMEYsIDB4M0YxMCwgMHgzRjExLCAweDNGMTIsIDB4M0YxMywgMHgzRjE0LAotICAgIDB4M0YxNSwgMHgzRjE2LCAweDNGMTcsIDB4M0YxOCwgMHgzRjE5LCAweDNGMUEsIDB4M0YxQiwgMHgzRjFDLAotICAgIDB4M0YxRCwgMHgzRjFFLCAweDNGMUYsIDB4M0YyMCwgMHgzRjIxLCAweDNGMjIsIDB4M0YyMywgMHgzRjI0LAotICAgIDB4M0YyNSwgMHgzRjI2LCAweDNGMjcsIDB4M0YyOCwgMHgzRjI5LCAweDNGMkEsIDB4M0YyQiwgMHgzRjJDLAotICAgIDB4M0YyRCwgMHgzRjJFLCAweDNGMkYsIDB4M0YzMCwgMHgzRjMxLCAweDNGMzIsIDB4M0YzMywgMHgzRjM0LAotICAgIDB4M0YzNSwgMHgzRjM2LCAweDNGMzcsIDB4M0YzOCwgMHgzRjM5LCAweDNGM0EsIDB4M0YzQiwgMHgzRjNDLAotICAgIDB4M0YzRCwgMHgzRjNFLCAweDNGM0YsIDB4M0Y0MCwgMHgzRjQxLCAweDNGNDIsIDB4M0Y0MywgMHgzRjQ0LAotICAgIDB4M0Y0NSwgMHgzRjQ2LCAweDNGNDcsIDB4M0Y0OCwgMHgzRjQ5LCAweDNGNEEsIDB4M0Y0QiwgMHgzRjRDLAotICAgIDB4M0Y0RCwgMHgzRjRFLCAweDNGNEYsIDB4M0Y1MCwgMHgzRjUxLCAweDNGNTIsIDB4M0Y1MywgMHgzRjU0LAotICAgIDB4M0Y1NSwgMHgzRjU2LCAweDNGNTcsIDB4M0Y1OCwgMHgzRjU5LCAweDNGNUEsIDB4M0Y1QiwgMHgzRjVDLAotICAgIDB4M0Y1RCwgMHgzRjVFLCAweDNGNUYsIDB4M0Y2MCwgMHgzRjYxLCAweDNGNjIsIDB4M0Y2MywgMHgzRjY0LAotICAgIDB4M0Y2NSwgMHgzRjY2LCAweDNGNjcsIDB4M0Y2OCwgMHgzRjY5LCAweDNGNkEsIDB4M0Y2QiwgMHgzRjZDLAotICAgIDB4M0Y2RCwgMHgzRjZFLCAweDNGNkYsIDB4M0Y3MCwgMHgzRjcxLCAweDNGNzIsIDB4M0Y3MywgMHgzRjc0LAotICAgIDB4M0Y3NSwgMHgzRjc2LCAweDNGNzcsIDB4M0Y3OCwgMHgzRjc5LCAweDNGN0EsIDB4M0Y3QiwgMHgzRjdDLAotICAgIDB4M0Y3RCwgMHgzRjdFLCAweDNGN0YsIDB4M0Y4MCwgMHgzRjgxLCAweDNGODIsIDB4M0Y4MywgMHgzRjg0LAotICAgIDB4M0Y4NSwgMHgzRjg2LCAweDNGODcsIDB4M0Y4OCwgMHgzRjg5LCAweDNGOEEsIDB4M0Y4QiwgMHgzRjhDLAotICAgIDB4M0Y4RCwgMHgzRjhFLCAweDNGOEYsIDB4M0Y5MCwgMHgzRjkxLCAweDNGOTIsIDB4M0Y5MywgMHgzRjk0LAotICAgIDB4M0Y5NSwgMHgzRjk2LCAweDNGOTcsIDB4M0Y5OCwgMHgzRjk5LCAweDNGOUEsIDB4M0Y5QiwgMHgzRjlDLAotICAgIDB4M0Y5RCwgMHgzRjlFLCAweDNGOUYsIDB4M0ZBMCwgMHgzRkExLCAweDNGQTIsIDB4M0ZBMywgMHgzRkE0LAotICAgIDB4M0ZBNSwgMHgzRkE2LCAweDNGQTcsIDB4M0ZBOCwgMHgzRkE5LCAweDNGQUEsIDB4M0ZBQiwgMHgzRkFDLAotICAgIDB4M0ZBRCwgMHgzRkFFLCAweDNGQUYsIDB4M0ZCMCwgMHgzRkIxLCAweDNGQjIsIDB4M0ZCMywgMHgzRkI0LAotICAgIDB4M0ZCNSwgMHgzRkI2LCAweDNGQjcsIDB4M0ZCOCwgMHgzRkI5LCAweDNGQkEsIDB4M0ZCQiwgMHgzRkJDLAotICAgIDB4M0ZCRCwgMHgzRkJFLCAweDNGQkYsIDB4M0ZDMCwgMHgzRkMxLCAweDNGQzIsIDB4M0ZDMywgMHgzRkM0LAotICAgIDB4M0ZDNSwgMHgzRkM2LCAweDNGQzcsIDB4M0ZDOCwgMHgzRkM5LCAweDNGQ0EsIDB4M0ZDQiwgMHgzRkNDLAotICAgIDB4M0ZDRCwgMHgzRkNFLCAweDNGQ0YsIDB4M0ZEMCwgMHgzRkQxLCAweDNGRDIsIDB4M0ZEMywgMHgzRkQ0LAotICAgIDB4M0ZENSwgMHgzRkQ2LCAweDNGRDcsIDB4M0ZEOCwgMHgzRkQ5LCAweDNGREEsIDB4M0ZEQiwgMHgzRkRDLAotICAgIDB4M0ZERCwgMHgzRkRFLCAweDNGREYsIDB4M0ZFMCwgMHgzRkUxLCAweDNGRTIsIDB4M0ZFMywgMHgzRkU0LAotICAgIDB4M0ZFNSwgMHgzRkU2LCAweDNGRTcsIDB4M0ZFOCwgMHgzRkU5LCAweDNGRUEsIDB4M0ZFQiwgMHgzRkVDLAotICAgIDB4M0ZFRCwgMHgzRkVFLCAweDNGRUYsIDB4M0ZGMCwgMHgzRkYxLCAweDNGRjIsIDB4M0ZGMywgMHgzRkY0LAotICAgIDB4M0ZGNSwgMHgzRkY2LCAweDNGRjcsIDB4M0ZGOCwgMHgzRkY5LCAweDNGRkEsIDB4M0ZGQiwgMHgzRkZDLAotICAgIDB4M0ZGRCwgMHgzRkZFLCAweDNGRkYsIDB4NDAwMCwgMHg0MDAxLCAweDQwMDIsIDB4NDAwMywgMHg0MDA0LAotICAgIDB4NDAwNSwgMHg0MDA2LCAweDQwMDcsIDB4NDAwOCwgMHg0MDA5LCAweDQwMEEsIDB4NDAwQiwgMHg0MDBDLAotICAgIDB4NDAwRCwgMHg0MDBFLCAweDQwMEYsIDB4NDAxMCwgMHg0MDExLCAweDQwMTIsIDB4NDAxMywgMHg0MDE0LAotICAgIDB4NDAxNSwgMHg0MDE2LCAweDQwMTcsIDB4NDAxOCwgMHg0MDE5LCAweDQwMUEsIDB4NDAxQiwgMHg0MDFDLAotICAgIDB4NDAxRCwgMHg0MDFFLCAweDQwMUYsIDB4NDAyMCwgMHg0MDIxLCAweDQwMjIsIDB4NDAyMywgMHg0MDI0LAotICAgIDB4NDAyNSwgMHg0MDI2LCAweDQwMjcsIDB4NDAyOCwgMHg0MDI5LCAweDQwMkEsIDB4NDAyQiwgMHg0MDJDLAotICAgIDB4NDAyRCwgMHg0MDJFLCAweDQwMkYsIDB4NDAzMCwgMHg0MDMxLCAweDQwMzIsIDB4NDAzMywgMHg0MDM0LAotICAgIDB4NDAzNSwgMHg0MDM2LCAweDQwMzcsIDB4NDAzOCwgMHg0MDM5LCAweDQwM0EsIDB4NDAzQiwgMHg0MDNDLAotICAgIDB4NDAzRCwgMHg0MDNFLCAweDQwM0YsIDB4NDA0MCwgMHg0MDQxLCAweDQwNDIsIDB4NDA0MywgMHg0MDQ0LAotICAgIDB4NDA0NSwgMHg0MDQ2LCAweDQwNDcsIDB4NDA0OCwgMHg0MDQ5LCAweDQwNEEsIDB4NDA0QiwgMHg0MDRDLAotICAgIDB4NDA0RCwgMHg0MDRFLCAweDQwNEYsIDB4NDA1MCwgMHg0MDUxLCAweDQwNTIsIDB4NDA1MywgMHg0MDU0LAotICAgIDB4NDA1NSwgMHg0MDU3LCAweDQwNTgsIDB4NDA1OSwgMHg0MDVBLCAweDQwNUIsIDB4NDA1QywgMHg0MDVELAotICAgIDB4NDA1RSwgMHg0MDVGLCAweDQwNjAsIDB4NDA2MSwgMHg0MDYyLCAweDQwNjMsIDB4NDA2NCwgMHg0MDY1LAotICAgIDB4NDA2NiwgMHg0MDY3LCAweDQwNjgsIDB4NDA2OSwgMHg0MDZBLCAweDQwNkIsIDB4NDA2QywgMHg0MDZELAotICAgIDB4NDA2RSwgMHg0MDZGLCAweDQwNzAsIDB4NDA3MSwgMHg0MDcyLCAweDQwNzMsIDB4NDA3NCwgMHg0MDc1LAotICAgIDB4NDA3NiwgMHg0MDc3LCAweDQwNzgsIDB4NDA3OSwgMHg0MDdBLCAweDQwN0IsIDB4NDA3QywgMHg0MDdELAotICAgIDB4NDA3RSwgMHg0MDdGLCAweDQwODAsIDB4NDA4MSwgMHg0MDgyLCAweDQwODMsIDB4NDA4NCwgMHg0MDg1LAotICAgIDB4NDA4NiwgMHg0MDg3LCAweDQwODgsIDB4NDA4OSwgMHg0MDhBLCAweDQwOEIsIDB4NDA4QywgMHg0MDhELAotICAgIDB4NDA4RSwgMHg0MDhGLCAweDQwOTAsIDB4NDA5MSwgMHg0MDkyLCAweDQwOTMsIDB4NDA5NCwgMHg0MDk1LAotICAgIDB4NDA5NiwgMHg0MDk3LCAweDQwOTgsIDB4NDA5OSwgMHg0MDlBLCAweDQwOUIsIDB4NDA5QywgMHg0MDlELAotICAgIDB4NDA5RSwgMHg0MDlGLCAweDQwQTAsIDB4NDBBMSwgMHg0MEEyLCAweDQwQTMsIDB4NDBBNCwgMHg0MEE1LAotICAgIDB4NDBBNiwgMHg0MEE3LCAweDQwQTgsIDB4NDBBOSwgMHg0MEFBLCAweDQwQUIsIDB4NDBBQywgMHg0MEFELAotICAgIDB4NDBBRSwgMHg0MEFGLCAweDQwQjAsIDB4NDBCMSwgMHg0MEIyLCAweDQwQjMsIDB4NDBCNCwgMHg0MEI1LAotICAgIDB4NDBCNiwgMHg0MEI3LCAweDQwQjgsIDB4NDBCOSwgMHg0MEJBLCAweDQwQkIsIDB4NDBCQywgMHg0MEJELAotICAgIDB4NDBCRSwgMHg0MEJGLCAweDQwQzAsIDB4NDBDMSwgMHg0MEMyLCAweDQwQzMsIDB4NDBDNCwgMHg0MEM1LAotICAgIDB4NDBDNiwgMHg0MEM3LCAweDQwQzgsIDB4NDBDOSwgMHg0MENBLCAweDQwQ0IsIDB4NDBDQywgMHg0MENELAotICAgIDB4NDBDRSwgMHg0MENGLCAweDQwRDAsIDB4NDBEMSwgMHg0MEQyLCAweDQwRDMsIDB4NDBENCwgMHg0MEQ1LAotICAgIDB4NDBENiwgMHg0MEQ3LCAweDQwRDgsIDB4NDBEOSwgMHg0MERBLCAweDQwREIsIDB4NDBEQywgMHg0MERELAotICAgIDB4NDBERSwgMHg0MERGLCAweDQwRTAsIDB4NDBFMSwgMHg0MEUyLCAweDQwRTMsIDB4NDBFNCwgMHg0MEU1LAotICAgIDB4NDBFNiwgMHg0MEU3LCAweDQwRTgsIDB4NDBFOSwgMHg0MEVBLCAweDQwRUIsIDB4NDBFQywgMHg0MEVELAotICAgIDB4NDBFRSwgMHg0MEVGLCAweDQwRjAsIDB4NDBGMSwgMHg0MEYyLCAweDQwRjMsIDB4NDBGNCwgMHg0MEY1LAotICAgIDB4NDBGNiwgMHg0MEY3LCAweDQwRjgsIDB4NDBGOSwgMHg0MEZBLCAweDQwRkIsIDB4NDBGQywgMHg0MEZELAotICAgIDB4NDBGRSwgMHg0MEZGLCAweDQxMDAsIDB4NDEwMSwgMHg0MTAyLCAweDQxMDMsIDB4NDEwNCwgMHg0MTA1LAotICAgIDB4NDEwNiwgMHg0MTA3LCAweDQxMDgsIDB4NDEwOSwgMHg0MTBBLCAweDQxMEIsIDB4NDEwQywgMHg0MTBELAotICAgIDB4NDEwRSwgMHg0MTBGLCAweDQxMTAsIDB4NDExMSwgMHg0MTEyLCAweDQxMTMsIDB4NDExNCwgMHg0MTE1LAotICAgIDB4NDExNiwgMHg0MTE3LCAweDQxMTgsIDB4NDExOSwgMHg0MTFBLCAweDQxMUIsIDB4NDExQywgMHg0MTFELAotICAgIDB4NDExRSwgMHg0MTFGLCAweDQxMjAsIDB4NDEyMSwgMHg0MTIyLCAweDQxMjMsIDB4NDEyNCwgMHg0MTI1LAotICAgIDB4NDEyNiwgMHg0MTI3LCAweDQxMjgsIDB4NDEyOSwgMHg0MTJBLCAweDQxMkIsIDB4NDEyQywgMHg0MTJELAotICAgIDB4NDEyRSwgMHg0MTJGLCAweDQxMzAsIDB4NDEzMSwgMHg0MTMyLCAweDQxMzMsIDB4NDEzNCwgMHg0MTM1LAotICAgIDB4NDEzNiwgMHg0MTM3LCAweDQxMzgsIDB4NDEzOSwgMHg0MTNBLCAweDQxM0IsIDB4NDEzQywgMHg0MTNELAotICAgIDB4NDEzRSwgMHg0MTNGLCAweDQxNDAsIDB4NDE0MSwgMHg0MTQyLCAweDQxNDMsIDB4NDE0NCwgMHg0MTQ1LAotICAgIDB4NDE0NiwgMHg0MTQ3LCAweDQxNDgsIDB4NDE0OSwgMHg0MTRBLCAweDQxNEIsIDB4NDE0QywgMHg0MTRELAotICAgIDB4NDE0RSwgMHg0MTRGLCAweDQxNTAsIDB4NDE1MSwgMHg0MTUyLCAweDQxNTMsIDB4NDE1NCwgMHg0MTU1LAotICAgIDB4NDE1NiwgMHg0MTU3LCAweDQxNTgsIDB4NDE1OSwgMHg0MTVBLCAweDQxNUIsIDB4NDE1QywgMHg0MTVELAotICAgIDB4NDE1RSwgMHg0MTYwLCAweDQxNjEsIDB4NDE2MiwgMHg0MTYzLCAweDQxNjQsIDB4NDE2NSwgMHg0MTY2LAotICAgIDB4NDE2NywgMHg0MTY4LCAweDQxNjksIDB4NDE2QSwgMHg0MTZCLCAweDQxNkMsIDB4NDE2RCwgMHg0MTZFLAotICAgIDB4NDE2RiwgMHg0MTcwLCAweDQxNzEsIDB4NDE3MiwgMHg0MTczLCAweDQxNzQsIDB4NDE3NSwgMHg0MTc2LAotICAgIDB4NDE3NywgMHg0MTc4LCAweDQxNzksIDB4NDE3QSwgMHg0MTdCLCAweDQxN0MsIDB4NDE3RCwgMHg0MTdFLAotICAgIDB4NDE3RiwgMHg0MTgwLCAweDQxODEsIDB4NDE4MiwgMHg0MTgzLCAweDQxODQsIDB4NDE4NSwgMHg0MTg2LAotICAgIDB4NDE4NywgMHg0MTg4LCAweDQxODksIDB4NDE4QSwgMHg0MThCLCAweDQxOEMsIDB4NDE4RCwgMHg0MThFLAotICAgIDB4NDE4RiwgMHg0MTkwLCAweDQxOTEsIDB4NDE5MiwgMHg0MTkzLCAweDQxOTQsIDB4NDE5NSwgMHg0MTk2LAotICAgIDB4NDE5NywgMHg0MTk4LCAweDQxOTksIDB4NDE5QSwgMHg0MTlCLCAweDQxOUMsIDB4NDE5RCwgMHg0MTlFLAotICAgIDB4NDE5RiwgMHg0MUEwLCAweDQxQTEsIDB4NDFBMiwgMHg0MUEzLCAweDQxQTQsIDB4NDFBNSwgMHg0MUE2LAotICAgIDB4NDFBNywgMHg0MUE4LCAweDQxQTksIDB4NDFBQSwgMHg0MUFCLCAweDQxQUMsIDB4NDFBRCwgMHg0MUFFLAotICAgIDB4NDFBRiwgMHg0MUIwLCAweDQxQjEsIDB4NDFCMiwgMHg0MUIzLCAweDQxQjQsIDB4NDFCNSwgMHg0MUI2LAotICAgIDB4NDFCNywgMHg0MUI4LCAweDQxQjksIDB4NDFCQSwgMHg0MUJCLCAweDQxQkMsIDB4NDFCRCwgMHg0MUJFLAotICAgIDB4NDFCRiwgMHg0MUMwLCAweDQxQzEsIDB4NDFDMiwgMHg0MUMzLCAweDQxQzQsIDB4NDFDNSwgMHg0MUM2LAotICAgIDB4NDFDNywgMHg0MUM4LCAweDQxQzksIDB4NDFDQSwgMHg0MUNCLCAweDQxQ0MsIDB4NDFDRCwgMHg0MUNFLAotICAgIDB4NDFDRiwgMHg0MUQwLCAweDQxRDEsIDB4NDFEMiwgMHg0MUQzLCAweDQxRDQsIDB4NDFENSwgMHg0MUQ2LAotICAgIDB4NDFENywgMHg0MUQ4LCAweDQxRDksIDB4NDFEQSwgMHg0MURCLCAweDQxREMsIDB4NDFERCwgMHg0MURFLAotICAgIDB4NDFERiwgMHg0MUUwLCAweDQxRTEsIDB4NDFFMiwgMHg0MUUzLCAweDQxRTQsIDB4NDFFNSwgMHg0MUU2LAotICAgIDB4NDFFNywgMHg0MUU4LCAweDQxRTksIDB4NDFFQSwgMHg0MUVCLCAweDQxRUMsIDB4NDFFRCwgMHg0MUVFLAotICAgIDB4NDFFRiwgMHg0MUYwLCAweDQxRjEsIDB4NDFGMiwgMHg0MUYzLCAweDQxRjQsIDB4NDFGNSwgMHg0MUY2LAotICAgIDB4NDFGNywgMHg0MUY4LCAweDQxRjksIDB4NDFGQSwgMHg0MUZCLCAweDQxRkMsIDB4NDFGRCwgMHg0MUZFLAotICAgIDB4NDFGRiwgMHg0MjAwLCAweDQyMDEsIDB4NDIwMiwgMHg0MjAzLCAweDQyMDQsIDB4NDIwNSwgMHg0MjA2LAotICAgIDB4NDIwNywgMHg0MjA4LCAweDQyMDksIDB4NDIwQSwgMHg0MjBCLCAweDQyMEMsIDB4NDIwRCwgMHg0MjBFLAotICAgIDB4NDIwRiwgMHg0MjEwLCAweDQyMTEsIDB4NDIxMiwgMHg0MjEzLCAweDQyMTQsIDB4NDIxNSwgMHg0MjE2LAotICAgIDB4NDIxNywgMHg0MjE4LCAweDQyMTksIDB4NDIxQSwgMHg0MjFCLCAweDQyMUMsIDB4NDIxRCwgMHg0MjFFLAotICAgIDB4NDIxRiwgMHg0MjIwLCAweDQyMjEsIDB4NDIyMiwgMHg0MjIzLCAweDQyMjQsIDB4NDIyNSwgMHg0MjI2LAotICAgIDB4NDIyNywgMHg0MjI4LCAweDQyMjksIDB4NDIyQSwgMHg0MjJCLCAweDQyMkMsIDB4NDIyRCwgMHg0MjJFLAotICAgIDB4NDIyRiwgMHg0MjMwLCAweDQyMzEsIDB4NDIzMiwgMHg0MjMzLCAweDQyMzQsIDB4NDIzNSwgMHg0MjM2LAotICAgIDB4NDIzNywgMHg0MjM4LCAweDQyMzksIDB4NDIzQSwgMHg0MjNCLCAweDQyM0MsIDB4NDIzRCwgMHg0MjNFLAotICAgIDB4NDIzRiwgMHg0MjQwLCAweDQyNDEsIDB4NDI0MiwgMHg0MjQzLCAweDQyNDQsIDB4NDI0NSwgMHg0MjQ2LAotICAgIDB4NDI0NywgMHg0MjQ4LCAweDQyNDksIDB4NDI0QSwgMHg0MjRCLCAweDQyNEMsIDB4NDI0RCwgMHg0MjRFLAotICAgIDB4NDI0RiwgMHg0MjUwLCAweDQyNTEsIDB4NDI1MiwgMHg0MjUzLCAweDQyNTQsIDB4NDI1NSwgMHg0MjU2LAotICAgIDB4NDI1NywgMHg0MjU4LCAweDQyNTksIDB4NDI1QSwgMHg0MjVCLCAweDQyNUMsIDB4NDI1RCwgMHg0MjVFLAotICAgIDB4NDI1RiwgMHg0MjYwLCAweDQyNjEsIDB4NDI2MiwgMHg0MjYzLCAweDQyNjQsIDB4NDI2NSwgMHg0MjY2LAotICAgIDB4NDI2NywgMHg0MjY4LCAweDQyNjksIDB4NDI2QSwgMHg0MjZCLCAweDQyNkMsIDB4NDI2RCwgMHg0MjZFLAotICAgIDB4NDI2RiwgMHg0MjcwLCAweDQyNzEsIDB4NDI3MiwgMHg0MjczLCAweDQyNzQsIDB4NDI3NSwgMHg0Mjc2LAotICAgIDB4NDI3NywgMHg0Mjc4LCAweDQyNzksIDB4NDI3QSwgMHg0MjdCLCAweDQyN0MsIDB4NDI3RCwgMHg0MjdFLAotICAgIDB4NDI3RiwgMHg0MjgwLCAweDQyODEsIDB4NDI4MiwgMHg0MjgzLCAweDQyODQsIDB4NDI4NSwgMHg0Mjg2LAotICAgIDB4NDI4NywgMHg0Mjg4LCAweDQyODksIDB4NDI4QSwgMHg0MjhCLCAweDQyOEMsIDB4NDI4RCwgMHg0MjhFLAotICAgIDB4NDI4RiwgMHg0MjkwLCAweDQyOTEsIDB4NDI5MiwgMHg0MjkzLCAweDQyOTQsIDB4NDI5NSwgMHg0Mjk2LAotICAgIDB4NDI5NywgMHg0Mjk4LCAweDQyOTksIDB4NDI5QSwgMHg0MjlCLCAweDQyOUMsIDB4NDI5RCwgMHg0MjlFLAotICAgIDB4NDI5RiwgMHg0MkEwLCAweDQyQTEsIDB4NDJBMiwgMHg0MkEzLCAweDQyQTQsIDB4NDJBNSwgMHg0MkE2LAotICAgIDB4NDJBNywgMHg0MkE4LCAweDQyQTksIDB4NDJBQSwgMHg0MkFCLCAweDQyQUMsIDB4NDJBRCwgMHg0MkFFLAotICAgIDB4NDJBRiwgMHg0MkIwLCAweDQyQjEsIDB4NDJCMiwgMHg0MkIzLCAweDQyQjQsIDB4NDJCNSwgMHg0MkI2LAotICAgIDB4NDJCNywgMHg0MkI4LCAweDQyQjksIDB4NDJCQSwgMHg0MkJCLCAweDQyQkMsIDB4NDJCRCwgMHg0MkJFLAotICAgIDB4NDJCRiwgMHg0MkMwLCAweDQyQzEsIDB4NDJDMiwgMHg0MkMzLCAweDQyQzQsIDB4NDJDNSwgMHg0MkM2LAotICAgIDB4NDJDNywgMHg0MkM4LCAweDQyQzksIDB4NDJDQSwgMHg0MkNCLCAweDQyQ0MsIDB4NDJDRCwgMHg0MkNFLAotICAgIDB4NDJDRiwgMHg0MkQwLCAweDQyRDEsIDB4NDJEMiwgMHg0MkQzLCAweDQyRDQsIDB4NDJENSwgMHg0MkQ2LAotICAgIDB4NDJENywgMHg0MkQ4LCAweDQyRDksIDB4NDJEQSwgMHg0MkRCLCAweDQyREMsIDB4NDJERCwgMHg0MkRFLAotICAgIDB4NDJERiwgMHg0MkUwLCAweDQyRTEsIDB4NDJFMiwgMHg0MkUzLCAweDQyRTQsIDB4NDJFNSwgMHg0MkU2LAotICAgIDB4NDJFNywgMHg0MkU4LCAweDQyRTksIDB4NDJFQSwgMHg0MkVCLCAweDQyRUMsIDB4NDJFRCwgMHg0MkVFLAotICAgIDB4NDJFRiwgMHg0MkYwLCAweDQyRjEsIDB4NDJGMiwgMHg0MkYzLCAweDQyRjQsIDB4NDJGNSwgMHg0MkY2LAotICAgIDB4NDJGNywgMHg0MkY4LCAweDQyRjksIDB4NDJGQSwgMHg0MkZCLCAweDQyRkMsIDB4NDJGRCwgMHg0MkZFLAotICAgIDB4NDJGRiwgMHg0MzAwLCAweDQzMDEsIDB4NDMwMiwgMHg0MzAzLCAweDQzMDQsIDB4NDMwNSwgMHg0MzA2LAotICAgIDB4NDMwNywgMHg0MzA4LCAweDQzMDksIDB4NDMwQSwgMHg0MzBCLCAweDQzMEMsIDB4NDMwRCwgMHg0MzBFLAotICAgIDB4NDMwRiwgMHg0MzEwLCAweDQzMTEsIDB4NDMxMiwgMHg0MzEzLCAweDQzMTQsIDB4NDMxNSwgMHg0MzE2LAotICAgIDB4NDMxNywgMHg0MzE4LCAweDQzMTksIDB4NDMxQSwgMHg0MzFCLCAweDQzMUMsIDB4NDMxRCwgMHg0MzFFLAotICAgIDB4NDMxRiwgMHg0MzIwLCAweDQzMjEsIDB4NDMyMiwgMHg0MzIzLCAweDQzMjQsIDB4NDMyNSwgMHg0MzI2LAotICAgIDB4NDMyNywgMHg0MzI4LCAweDQzMjksIDB4NDMyQSwgMHg0MzJCLCAweDQzMkMsIDB4NDMyRCwgMHg0MzJFLAotICAgIDB4NDMyRiwgMHg0MzMwLCAweDQzMzEsIDB4NDMzMiwgMHg0MzMzLCAweDQzMzQsIDB4NDMzNSwgMHg0MzM2LAotICAgIDB4NDMzOCwgMHg0MzM5LCAweDQzM0EsIDB4NDMzQiwgMHg0MzNDLCAweDQzM0QsIDB4NDMzRSwgMHg0MzNGLAotICAgIDB4NDM0MCwgMHg0MzQxLCAweDQzNDIsIDB4NDM0MywgMHg0MzQ0LCAweDQzNDUsIDB4NDM0NiwgMHg0MzQ3LAotICAgIDB4NDM0OCwgMHg0MzQ5LCAweDQzNEEsIDB4NDM0QiwgMHg0MzRDLCAweDQzNEQsIDB4NDM0RSwgMHg0MzRGLAotICAgIDB4NDM1MCwgMHg0MzUxLCAweDQzNTIsIDB4NDM1MywgMHg0MzU0LCAweDQzNTUsIDB4NDM1NiwgMHg0MzU3LAotICAgIDB4NDM1OCwgMHg0MzU5LCAweDQzNUEsIDB4NDM1QiwgMHg0MzVDLCAweDQzNUQsIDB4NDM1RSwgMHg0MzVGLAotICAgIDB4NDM2MCwgMHg0MzYxLCAweDQzNjIsIDB4NDM2MywgMHg0MzY0LCAweDQzNjUsIDB4NDM2NiwgMHg0MzY3LAotICAgIDB4NDM2OCwgMHg0MzY5LCAweDQzNkEsIDB4NDM2QiwgMHg0MzZDLCAweDQzNkQsIDB4NDM2RSwgMHg0MzZGLAotICAgIDB4NDM3MCwgMHg0MzcxLCAweDQzNzIsIDB4NDM3MywgMHg0Mzc0LCAweDQzNzUsIDB4NDM3NiwgMHg0Mzc3LAotICAgIDB4NDM3OCwgMHg0Mzc5LCAweDQzN0EsIDB4NDM3QiwgMHg0MzdDLCAweDQzN0QsIDB4NDM3RSwgMHg0MzdGLAotICAgIDB4NDM4MCwgMHg0MzgxLCAweDQzODIsIDB4NDM4MywgMHg0Mzg0LCAweDQzODUsIDB4NDM4NiwgMHg0Mzg3LAotICAgIDB4NDM4OCwgMHg0Mzg5LCAweDQzOEEsIDB4NDM4QiwgMHg0MzhDLCAweDQzOEQsIDB4NDM4RSwgMHg0MzhGLAotICAgIDB4NDM5MCwgMHg0MzkxLCAweDQzOTIsIDB4NDM5MywgMHg0Mzk0LCAweDQzOTUsIDB4NDM5NiwgMHg0Mzk3LAotICAgIDB4NDM5OCwgMHg0Mzk5LCAweDQzOUEsIDB4NDM5QiwgMHg0MzlDLCAweDQzOUQsIDB4NDM5RSwgMHg0MzlGLAotICAgIDB4NDNBMCwgMHg0M0ExLCAweDQzQTIsIDB4NDNBMywgMHg0M0E0LCAweDQzQTUsIDB4NDNBNiwgMHg0M0E3LAotICAgIDB4NDNBOCwgMHg0M0E5LCAweDQzQUEsIDB4NDNBQiwgMHg0M0FELCAweDQzQUUsIDB4NDNBRiwgMHg0M0IwLAotICAgIDB4NDNCMiwgMHg0M0IzLCAweDQzQjQsIDB4NDNCNSwgMHg0M0I2LCAweDQzQjcsIDB4NDNCOCwgMHg0M0I5LAotICAgIDB4NDNCQSwgMHg0M0JCLCAweDQzQkMsIDB4NDNCRCwgMHg0M0JFLCAweDQzQkYsIDB4NDNDMCwgMHg0M0MxLAotICAgIDB4NDNDMiwgMHg0M0MzLCAweDQzQzQsIDB4NDNDNSwgMHg0M0M2LCAweDQzQzcsIDB4NDNDOCwgMHg0M0M5LAotICAgIDB4NDNDQSwgMHg0M0NCLCAweDQzQ0MsIDB4NDNDRCwgMHg0M0NFLCAweDQzQ0YsIDB4NDNEMCwgMHg0M0QxLAotICAgIDB4NDNEMiwgMHg0M0QzLCAweDQzRDQsIDB4NDNENSwgMHg0M0Q2LCAweDQzRDcsIDB4NDNEOCwgMHg0M0Q5LAotICAgIDB4NDNEQSwgMHg0M0RCLCAweDQzREMsIDB4NDNERSwgMHg0M0RGLCAweDQzRTAsIDB4NDNFMSwgMHg0M0UyLAotICAgIDB4NDNFMywgMHg0M0U0LCAweDQzRTUsIDB4NDNFNiwgMHg0M0U3LCAweDQzRTgsIDB4NDNFOSwgMHg0M0VBLAotICAgIDB4NDNFQiwgMHg0M0VDLCAweDQzRUQsIDB4NDNFRSwgMHg0M0VGLCAweDQzRjAsIDB4NDNGMSwgMHg0M0YyLAotICAgIDB4NDNGMywgMHg0M0Y0LCAweDQzRjUsIDB4NDNGNiwgMHg0M0Y3LCAweDQzRjgsIDB4NDNGOSwgMHg0M0ZBLAotICAgIDB4NDNGQiwgMHg0M0ZDLCAweDQzRkQsIDB4NDNGRSwgMHg0M0ZGLCAweDQ0MDAsIDB4NDQwMSwgMHg0NDAyLAotICAgIDB4NDQwMywgMHg0NDA0LCAweDQ0MDUsIDB4NDQwNiwgMHg0NDA3LCAweDQ0MDgsIDB4NDQwOSwgMHg0NDBBLAotICAgIDB4NDQwQiwgMHg0NDBDLCAweDQ0MEQsIDB4NDQwRSwgMHg0NDBGLCAweDQ0MTAsIDB4NDQxMSwgMHg0NDEyLAotICAgIDB4NDQxMywgMHg0NDE0LCAweDQ0MTUsIDB4NDQxNiwgMHg0NDE3LCAweDQ0MTgsIDB4NDQxOSwgMHg0NDFBLAotICAgIDB4NDQxQiwgMHg0NDFDLCAweDQ0MUQsIDB4NDQxRSwgMHg0NDFGLCAweDQ0MjAsIDB4NDQyMSwgMHg0NDIyLAotICAgIDB4NDQyMywgMHg0NDI0LCAweDQ0MjUsIDB4NDQyNiwgMHg0NDI3LCAweDQ0MjgsIDB4NDQyOSwgMHg0NDJBLAotICAgIDB4NDQyQiwgMHg0NDJDLCAweDQ0MkQsIDB4NDQyRSwgMHg0NDJGLCAweDQ0MzAsIDB4NDQzMSwgMHg0NDMyLAotICAgIDB4NDQzMywgMHg0NDM0LCAweDQ0MzUsIDB4NDQzNiwgMHg0NDM3LCAweDQ0MzgsIDB4NDQzOSwgMHg0NDNBLAotICAgIDB4NDQzQiwgMHg0NDNDLCAweDQ0M0QsIDB4NDQzRSwgMHg0NDNGLCAweDQ0NDAsIDB4NDQ0MSwgMHg0NDQyLAotICAgIDB4NDQ0MywgMHg0NDQ0LCAweDQ0NDUsIDB4NDQ0NiwgMHg0NDQ3LCAweDQ0NDgsIDB4NDQ0OSwgMHg0NDRBLAotICAgIDB4NDQ0QiwgMHg0NDRDLCAweDQ0NEQsIDB4NDQ0RSwgMHg0NDRGLCAweDQ0NTAsIDB4NDQ1MSwgMHg0NDUyLAotICAgIDB4NDQ1MywgMHg0NDU0LCAweDQ0NTUsIDB4NDQ1NiwgMHg0NDU3LCAweDQ0NTgsIDB4NDQ1OSwgMHg0NDVBLAotICAgIDB4NDQ1QiwgMHg0NDVDLCAweDQ0NUQsIDB4NDQ1RSwgMHg0NDVGLCAweDQ0NjAsIDB4NDQ2MSwgMHg0NDYyLAotICAgIDB4NDQ2MywgMHg0NDY0LCAweDQ0NjUsIDB4NDQ2NiwgMHg0NDY3LCAweDQ0NjgsIDB4NDQ2OSwgMHg0NDZBLAotICAgIDB4NDQ2QiwgMHg0NDZDLCAweDQ0NkQsIDB4NDQ2RSwgMHg0NDZGLCAweDQ0NzAsIDB4NDQ3MSwgMHg0NDcyLAotICAgIDB4NDQ3MywgMHg0NDc0LCAweDQ0NzUsIDB4NDQ3NiwgMHg0NDc3LCAweDQ0NzgsIDB4NDQ3OSwgMHg0NDdBLAotICAgIDB4NDQ3QiwgMHg0NDdDLCAweDQ0N0QsIDB4NDQ3RSwgMHg0NDdGLCAweDQ0ODAsIDB4NDQ4MSwgMHg0NDgyLAotICAgIDB4NDQ4MywgMHg0NDg0LCAweDQ0ODUsIDB4NDQ4NiwgMHg0NDg3LCAweDQ0ODgsIDB4NDQ4OSwgMHg0NDhBLAotICAgIDB4NDQ4QiwgMHg0NDhDLCAweDQ0OEQsIDB4NDQ4RSwgMHg0NDhGLCAweDQ0OTAsIDB4NDQ5MSwgMHg0NDkyLAotICAgIDB4NDQ5MywgMHg0NDk0LCAweDQ0OTUsIDB4NDQ5NiwgMHg0NDk3LCAweDQ0OTgsIDB4NDQ5OSwgMHg0NDlBLAotICAgIDB4NDQ5QiwgMHg0NDlDLCAweDQ0OUQsIDB4NDQ5RSwgMHg0NDlGLCAweDQ0QTAsIDB4NDRBMSwgMHg0NEEyLAotICAgIDB4NDRBMywgMHg0NEE0LCAweDQ0QTUsIDB4NDRBNiwgMHg0NEE3LCAweDQ0QTgsIDB4NDRBOSwgMHg0NEFBLAotICAgIDB4NDRBQiwgMHg0NEFDLCAweDQ0QUQsIDB4NDRBRSwgMHg0NEFGLCAweDQ0QjAsIDB4NDRCMSwgMHg0NEIyLAotICAgIDB4NDRCMywgMHg0NEI0LCAweDQ0QjUsIDB4NDRCNiwgMHg0NEI3LCAweDQ0QjgsIDB4NDRCOSwgMHg0NEJBLAotICAgIDB4NDRCQiwgMHg0NEJDLCAweDQ0QkQsIDB4NDRCRSwgMHg0NEJGLCAweDQ0QzAsIDB4NDRDMSwgMHg0NEMyLAotICAgIDB4NDRDMywgMHg0NEM0LCAweDQ0QzUsIDB4NDRDNiwgMHg0NEM3LCAweDQ0QzgsIDB4NDRDOSwgMHg0NENBLAotICAgIDB4NDRDQiwgMHg0NENDLCAweDQ0Q0QsIDB4NDRDRSwgMHg0NENGLCAweDQ0RDAsIDB4NDREMSwgMHg0NEQyLAotICAgIDB4NDREMywgMHg0NEQ0LCAweDQ0RDUsIDB4NDRENywgMHg0NEQ4LCAweDQ0RDksIDB4NDREQSwgMHg0NERCLAotICAgIDB4NDREQywgMHg0NERELCAweDQ0REUsIDB4NDRERiwgMHg0NEUwLCAweDQ0RTEsIDB4NDRFMiwgMHg0NEUzLAotICAgIDB4NDRFNCwgMHg0NEU1LCAweDQ0RTYsIDB4NDRFNywgMHg0NEU4LCAweDQ0RTksIDB4NDRFQSwgMHg0NEVCLAotICAgIDB4NDRFQywgMHg0NEVELCAweDQ0RUUsIDB4NDRFRiwgMHg0NEYwLCAweDQ0RjEsIDB4NDRGMiwgMHg0NEYzLAotICAgIDB4NDRGNCwgMHg0NEY1LCAweDQ0RjYsIDB4NDRGNywgMHg0NEY4LCAweDQ0RjksIDB4NDRGQSwgMHg0NEZCLAotICAgIDB4NDRGQywgMHg0NEZELCAweDQ0RkUsIDB4NDRGRiwgMHg0NTAwLCAweDQ1MDEsIDB4NDUwMiwgMHg0NTAzLAotICAgIDB4NDUwNCwgMHg0NTA1LCAweDQ1MDYsIDB4NDUwNywgMHg0NTA4LCAweDQ1MDksIDB4NDUwQSwgMHg0NTBCLAotICAgIDB4NDUwQywgMHg0NTBELCAweDQ1MEUsIDB4NDUwRiwgMHg0NTEwLCAweDQ1MTEsIDB4NDUxMiwgMHg0NTEzLAotICAgIDB4NDUxNCwgMHg0NTE1LCAweDQ1MTYsIDB4NDUxNywgMHg0NTE4LCAweDQ1MTksIDB4NDUxQSwgMHg0NTFCLAotICAgIDB4NDUxQywgMHg0NTFELCAweDQ1MUUsIDB4NDUxRiwgMHg0NTIwLCAweDQ1MjEsIDB4NDUyMiwgMHg0NTIzLAotICAgIDB4NDUyNCwgMHg0NTI1LCAweDQ1MjYsIDB4NDUyNywgMHg0NTI4LCAweDQ1MjksIDB4NDUyQSwgMHg0NTJCLAotICAgIDB4NDUyQywgMHg0NTJELCAweDQ1MkUsIDB4NDUyRiwgMHg0NTMwLCAweDQ1MzEsIDB4NDUzMiwgMHg0NTMzLAotICAgIDB4NDUzNCwgMHg0NTM1LCAweDQ1MzYsIDB4NDUzNywgMHg0NTM4LCAweDQ1MzksIDB4NDUzQSwgMHg0NTNCLAotICAgIDB4NDUzQywgMHg0NTNELCAweDQ1M0UsIDB4NDUzRiwgMHg0NTQwLCAweDQ1NDEsIDB4NDU0MiwgMHg0NTQzLAotICAgIDB4NDU0NCwgMHg0NTQ1LCAweDQ1NDYsIDB4NDU0NywgMHg0NTQ4LCAweDQ1NDksIDB4NDU0QSwgMHg0NTRCLAotICAgIDB4NDU0QywgMHg0NTRELCAweDQ1NEUsIDB4NDU0RiwgMHg0NTUwLCAweDQ1NTEsIDB4NDU1MiwgMHg0NTUzLAotICAgIDB4NDU1NCwgMHg0NTU1LCAweDQ1NTYsIDB4NDU1NywgMHg0NTU4LCAweDQ1NTksIDB4NDU1QSwgMHg0NTVCLAotICAgIDB4NDU1QywgMHg0NTVELCAweDQ1NUUsIDB4NDU1RiwgMHg0NTYwLCAweDQ1NjEsIDB4NDU2MiwgMHg0NTYzLAotICAgIDB4NDU2NCwgMHg0NTY1LCAweDQ1NjYsIDB4NDU2NywgMHg0NTY4LCAweDQ1NjksIDB4NDU2QSwgMHg0NTZCLAotICAgIDB4NDU2QywgMHg0NTZELCAweDQ1NkUsIDB4NDU2RiwgMHg0NTcwLCAweDQ1NzEsIDB4NDU3MiwgMHg0NTczLAotICAgIDB4NDU3NCwgMHg0NTc1LCAweDQ1NzYsIDB4NDU3NywgMHg0NTc4LCAweDQ1NzksIDB4NDU3QSwgMHg0NTdCLAotICAgIDB4NDU3QywgMHg0NTdELCAweDQ1N0UsIDB4NDU3RiwgMHg0NTgwLCAweDQ1ODEsIDB4NDU4MiwgMHg0NTgzLAotICAgIDB4NDU4NCwgMHg0NTg1LCAweDQ1ODYsIDB4NDU4NywgMHg0NTg4LCAweDQ1ODksIDB4NDU4QSwgMHg0NThCLAotICAgIDB4NDU4QywgMHg0NThELCAweDQ1OEUsIDB4NDU4RiwgMHg0NTkwLCAweDQ1OTEsIDB4NDU5MiwgMHg0NTkzLAotICAgIDB4NDU5NCwgMHg0NTk1LCAweDQ1OTYsIDB4NDU5NywgMHg0NTk4LCAweDQ1OTksIDB4NDU5QSwgMHg0NTlCLAotICAgIDB4NDU5QywgMHg0NTlELCAweDQ1OUUsIDB4NDU5RiwgMHg0NUEwLCAweDQ1QTEsIDB4NDVBMiwgMHg0NUEzLAotICAgIDB4NDVBNCwgMHg0NUE1LCAweDQ1QTYsIDB4NDVBNywgMHg0NUE4LCAweDQ1QTksIDB4NDVBQSwgMHg0NUFCLAotICAgIDB4NDVBQywgMHg0NUFELCAweDQ1QUUsIDB4NDVBRiwgMHg0NUIwLCAweDQ1QjEsIDB4NDVCMiwgMHg0NUIzLAotICAgIDB4NDVCNCwgMHg0NUI1LCAweDQ1QjYsIDB4NDVCNywgMHg0NUI4LCAweDQ1QjksIDB4NDVCQSwgMHg0NUJCLAotICAgIDB4NDVCQywgMHg0NUJELCAweDQ1QkUsIDB4NDVCRiwgMHg0NUMwLCAweDQ1QzEsIDB4NDVDMiwgMHg0NUMzLAotICAgIDB4NDVDNCwgMHg0NUM1LCAweDQ1QzYsIDB4NDVDNywgMHg0NUM4LCAweDQ1QzksIDB4NDVDQSwgMHg0NUNCLAotICAgIDB4NDVDQywgMHg0NUNELCAweDQ1Q0UsIDB4NDVDRiwgMHg0NUQwLCAweDQ1RDEsIDB4NDVEMiwgMHg0NUQzLAotICAgIDB4NDVENCwgMHg0NUQ1LCAweDQ1RDYsIDB4NDVENywgMHg0NUQ4LCAweDQ1RDksIDB4NDVEQSwgMHg0NURCLAotICAgIDB4NDVEQywgMHg0NURELCAweDQ1REUsIDB4NDVERiwgMHg0NUUwLCAweDQ1RTEsIDB4NDVFMiwgMHg0NUUzLAotICAgIDB4NDVFNCwgMHg0NUU1LCAweDQ1RTYsIDB4NDVFNywgMHg0NUU4LCAweDQ1RTksIDB4NDVFQSwgMHg0NUVCLAotICAgIDB4NDVFQywgMHg0NUVELCAweDQ1RUUsIDB4NDVFRiwgMHg0NUYwLCAweDQ1RjEsIDB4NDVGMiwgMHg0NUYzLAotICAgIDB4NDVGNCwgMHg0NUY1LCAweDQ1RjYsIDB4NDVGNywgMHg0NUY4LCAweDQ1RjksIDB4NDVGQSwgMHg0NUZCLAotICAgIDB4NDVGQywgMHg0NUZELCAweDQ1RkUsIDB4NDVGRiwgMHg0NjAwLCAweDQ2MDEsIDB4NDYwMiwgMHg0NjAzLAotICAgIDB4NDYwNCwgMHg0NjA1LCAweDQ2MDYsIDB4NDYwNywgMHg0NjA4LCAweDQ2MDksIDB4NDYwQSwgMHg0NjBCLAotICAgIDB4NDYwQywgMHg0NjBELCAweDQ2MEUsIDB4NDYwRiwgMHg0NjEwLCAweDQ2MTEsIDB4NDYxMiwgMHg0NjEzLAotICAgIDB4NDYxNCwgMHg0NjE1LCAweDQ2MTYsIDB4NDYxNywgMHg0NjE4LCAweDQ2MTksIDB4NDYxQSwgMHg0NjFCLAotICAgIDB4NDYxQywgMHg0NjFELCAweDQ2MUUsIDB4NDYxRiwgMHg0NjIwLCAweDQ2MjEsIDB4NDYyMiwgMHg0NjIzLAotICAgIDB4NDYyNCwgMHg0NjI1LCAweDQ2MjYsIDB4NDYyNywgMHg0NjI4LCAweDQ2MjksIDB4NDYyQSwgMHg0NjJCLAotICAgIDB4NDYyQywgMHg0NjJELCAweDQ2MkUsIDB4NDYyRiwgMHg0NjMwLCAweDQ2MzEsIDB4NDYzMiwgMHg0NjMzLAotICAgIDB4NDYzNCwgMHg0NjM1LCAweDQ2MzYsIDB4NDYzNywgMHg0NjM4LCAweDQ2MzksIDB4NDYzQSwgMHg0NjNCLAotICAgIDB4NDYzQywgMHg0NjNELCAweDQ2M0UsIDB4NDYzRiwgMHg0NjQwLCAweDQ2NDEsIDB4NDY0MiwgMHg0NjQzLAotICAgIDB4NDY0NCwgMHg0NjQ1LCAweDQ2NDYsIDB4NDY0NywgMHg0NjQ4LCAweDQ2NDksIDB4NDY0QSwgMHg0NjRCLAotICAgIDB4NDY0RCwgMHg0NjRFLCAweDQ2NEYsIDB4NDY1MCwgMHg0NjUxLCAweDQ2NTIsIDB4NDY1MywgMHg0NjU0LAotICAgIDB4NDY1NSwgMHg0NjU2LCAweDQ2NTcsIDB4NDY1OCwgMHg0NjU5LCAweDQ2NUEsIDB4NDY1QiwgMHg0NjVDLAotICAgIDB4NDY1RCwgMHg0NjVFLCAweDQ2NUYsIDB4NDY2MCwgMHg0NjYyLCAweDQ2NjMsIDB4NDY2NCwgMHg0NjY1LAotICAgIDB4NDY2NiwgMHg0NjY3LCAweDQ2NjgsIDB4NDY2OSwgMHg0NjZBLCAweDQ2NkIsIDB4NDY2QywgMHg0NjZELAotICAgIDB4NDY2RSwgMHg0NjZGLCAweDQ2NzAsIDB4NDY3MSwgMHg0NjcyLCAweDQ2NzMsIDB4NDY3NCwgMHg0Njc1LAotICAgIDB4NDY3NiwgMHg0Njc3LCAweDQ2NzgsIDB4NDY3OSwgMHg0NjdBLCAweDQ2N0IsIDB4NDY3QywgMHg0NjdELAotICAgIDB4NDY3RSwgMHg0NjdGLCAweDQ2ODAsIDB4NDY4MSwgMHg0NjgyLCAweDQ2ODMsIDB4NDY4NCwgMHg0Njg1LAotICAgIDB4NDY4NiwgMHg0Njg3LCAweDQ2ODgsIDB4NDY4OSwgMHg0NjhBLCAweDQ2OEIsIDB4NDY4QywgMHg0NjhELAotICAgIDB4NDY4RSwgMHg0NjhGLCAweDQ2OTAsIDB4NDY5MSwgMHg0NjkyLCAweDQ2OTMsIDB4NDY5NCwgMHg0Njk1LAotICAgIDB4NDY5NiwgMHg0Njk3LCAweDQ2OTgsIDB4NDY5OSwgMHg0NjlBLCAweDQ2OUIsIDB4NDY5QywgMHg0NjlELAotICAgIDB4NDY5RSwgMHg0NjlGLCAweDQ2QTAsIDB4NDZBMSwgMHg0NkEyLCAweDQ2QTMsIDB4NDZBNCwgMHg0NkE1LAotICAgIDB4NDZBNiwgMHg0NkE3LCAweDQ2QTgsIDB4NDZBOSwgMHg0NkFBLCAweDQ2QUIsIDB4NDZBQywgMHg0NkFELAotICAgIDB4NDZBRSwgMHg0NkFGLCAweDQ2QjAsIDB4NDZCMSwgMHg0NkIyLCAweDQ2QjMsIDB4NDZCNCwgMHg0NkI1LAotICAgIDB4NDZCNiwgMHg0NkI3LCAweDQ2QjgsIDB4NDZCOSwgMHg0NkJBLCAweDQ2QkIsIDB4NDZCQywgMHg0NkJELAotICAgIDB4NDZCRSwgMHg0NkJGLCAweDQ2QzAsIDB4NDZDMSwgMHg0NkMyLCAweDQ2QzMsIDB4NDZDNCwgMHg0NkM1LAotICAgIDB4NDZDNiwgMHg0NkM3LCAweDQ2QzgsIDB4NDZDOSwgMHg0NkNBLCAweDQ2Q0IsIDB4NDZDQywgMHg0NkNELAotICAgIDB4NDZDRSwgMHg0NkNGLCAweDQ2RDAsIDB4NDZEMSwgMHg0NkQyLCAweDQ2RDMsIDB4NDZENCwgMHg0NkQ1LAotICAgIDB4NDZENiwgMHg0NkQ3LCAweDQ2RDgsIDB4NDZEOSwgMHg0NkRBLCAweDQ2REIsIDB4NDZEQywgMHg0NkRELAotICAgIDB4NDZERSwgMHg0NkRGLCAweDQ2RTAsIDB4NDZFMSwgMHg0NkUyLCAweDQ2RTMsIDB4NDZFNCwgMHg0NkU1LAotICAgIDB4NDZFNiwgMHg0NkU3LCAweDQ2RTgsIDB4NDZFOSwgMHg0NkVBLCAweDQ2RUIsIDB4NDZFQywgMHg0NkVELAotICAgIDB4NDZFRSwgMHg0NkVGLCAweDQ2RjAsIDB4NDZGMSwgMHg0NkYyLCAweDQ2RjMsIDB4NDZGNCwgMHg0NkY1LAotICAgIDB4NDZGNiwgMHg0NkY3LCAweDQ2RjgsIDB4NDZGOSwgMHg0NkZBLCAweDQ2RkIsIDB4NDZGQywgMHg0NkZELAotICAgIDB4NDZGRSwgMHg0NkZGLCAweDQ3MDAsIDB4NDcwMSwgMHg0NzAyLCAweDQ3MDMsIDB4NDcwNCwgMHg0NzA1LAotICAgIDB4NDcwNiwgMHg0NzA3LCAweDQ3MDgsIDB4NDcwOSwgMHg0NzBBLCAweDQ3MEIsIDB4NDcwQywgMHg0NzBELAotICAgIDB4NDcwRSwgMHg0NzBGLCAweDQ3MTAsIDB4NDcxMSwgMHg0NzEyLCAweDQ3MTMsIDB4NDcxNCwgMHg0NzE1LAotICAgIDB4NDcxNiwgMHg0NzE3LCAweDQ3MTgsIDB4NDcxOSwgMHg0NzFBLCAweDQ3MUIsIDB4NDcxQywgMHg0NzFELAotICAgIDB4NDcxRSwgMHg0NzFGLCAweDQ3MjAsIDB4NDcyMSwgMHg0NzIyLCAweDQ3MjQsIDB4NDcyNSwgMHg0NzI2LAotICAgIDB4NDcyNywgMHg0NzI4LCAweDQ3MkEsIDB4NDcyQiwgMHg0NzJDLCAweDQ3MkQsIDB4NDcyRSwgMHg0NzJGLAotICAgIDB4NDczMCwgMHg0NzMxLCAweDQ3MzIsIDB4NDczMywgMHg0NzM0LCAweDQ3MzUsIDB4NDczNiwgMHg0NzM3LAotICAgIDB4NDczOCwgMHg0NzM5LCAweDQ3M0EsIDB4NDczQiwgMHg0NzNDLCAweDQ3M0QsIDB4NDczRSwgMHg0NzNGLAotICAgIDB4NDc0MCwgMHg0NzQxLCAweDQ3NDIsIDB4NDc0MywgMHg0NzQ0LCAweDQ3NDUsIDB4NDc0NiwgMHg0NzQ3LAotICAgIDB4NDc0OCwgMHg0NzQ5LCAweDQ3NEEsIDB4NDc0QiwgMHg0NzRDLCAweDQ3NEQsIDB4NDc0RSwgMHg0NzRGLAotICAgIDB4NDc1MCwgMHg0NzUxLCAweDQ3NTIsIDB4NDc1MywgMHg0NzU0LCAweDQ3NTUsIDB4NDc1NiwgMHg0NzU3LAotICAgIDB4NDc1OCwgMHg0NzU5LCAweDQ3NUEsIDB4NDc1QiwgMHg0NzVDLCAweDQ3NUQsIDB4NDc1RSwgMHg0NzVGLAotICAgIDB4NDc2MCwgMHg0NzYxLCAweDQ3NjIsIDB4NDc2MywgMHg0NzY0LCAweDQ3NjUsIDB4NDc2NiwgMHg0NzY3LAotICAgIDB4NDc2OCwgMHg0NzY5LCAweDQ3NkEsIDB4NDc2QiwgMHg0NzZDLCAweDQ3NkQsIDB4NDc2RSwgMHg0NzZGLAotICAgIDB4NDc3MCwgMHg0NzcxLCAweDQ3NzIsIDB4NDc3MywgMHg0Nzc0LCAweDQ3NzUsIDB4NDc3NiwgMHg0Nzc3LAotICAgIDB4NDc3OCwgMHg0Nzc5LCAweDQ3N0EsIDB4NDc3QiwgMHg0NzdELCAweDQ3N0UsIDB4NDc3RiwgMHg0NzgwLAotICAgIDB4NDc4MSwgMHg0NzgyLCAweDQ3ODMsIDB4NDc4NCwgMHg0Nzg1LCAweDQ3ODYsIDB4NDc4NywgMHg0Nzg4LAotICAgIDB4NDc4OSwgMHg0NzhBLCAweDQ3OEIsIDB4NDc4QywgMHg0NzhFLCAweDQ3OEYsIDB4NDc5MCwgMHg0NzkxLAotICAgIDB4NDc5MiwgMHg0NzkzLCAweDQ3OTQsIDB4NDc5NSwgMHg0Nzk2LCAweDQ3OTcsIDB4NDc5OCwgMHg0Nzk5LAotICAgIDB4NDc5QSwgMHg0NzlCLCAweDQ3OUMsIDB4NDc5RCwgMHg0NzlFLCAweDQ3OUYsIDB4NDdBMCwgMHg0N0ExLAotICAgIDB4NDdBMiwgMHg0N0EzLCAweDQ3QTQsIDB4NDdBNSwgMHg0N0E2LCAweDQ3QTcsIDB4NDdBOCwgMHg0N0E5LAotICAgIDB4NDdBQSwgMHg0N0FCLCAweDQ3QUMsIDB4NDdBRCwgMHg0N0FFLCAweDQ3QUYsIDB4NDdCMCwgMHg0N0IxLAotICAgIDB4NDdCMiwgMHg0N0IzLCAweDQ3QjQsIDB4NDdCNSwgMHg0N0I2LCAweDQ3QjcsIDB4NDdCOCwgMHg0N0I5LAotICAgIDB4NDdCQSwgMHg0N0JCLCAweDQ3QkMsIDB4NDdCRCwgMHg0N0JFLCAweDQ3QkYsIDB4NDdDMCwgMHg0N0MxLAotICAgIDB4NDdDMiwgMHg0N0MzLCAweDQ3QzQsIDB4NDdDNSwgMHg0N0M2LCAweDQ3QzcsIDB4NDdDOCwgMHg0N0M5LAotICAgIDB4NDdDQSwgMHg0N0NCLCAweDQ3Q0MsIDB4NDdDRCwgMHg0N0NFLCAweDQ3Q0YsIDB4NDdEMCwgMHg0N0QxLAotICAgIDB4NDdEMiwgMHg0N0QzLCAweDQ3RDQsIDB4NDdENSwgMHg0N0Q2LCAweDQ3RDcsIDB4NDdEOCwgMHg0N0Q5LAotICAgIDB4NDdEQSwgMHg0N0RCLCAweDQ3REMsIDB4NDdERCwgMHg0N0RFLCAweDQ3REYsIDB4NDdFMCwgMHg0N0UxLAotICAgIDB4NDdFMiwgMHg0N0UzLCAweDQ3RTQsIDB4NDdFNSwgMHg0N0U2LCAweDQ3RTcsIDB4NDdFOCwgMHg0N0U5LAotICAgIDB4NDdFQSwgMHg0N0VCLCAweDQ3RUMsIDB4NDdFRCwgMHg0N0VFLCAweDQ3RUYsIDB4NDdGMCwgMHg0N0YxLAotICAgIDB4NDdGMiwgMHg0N0YzLCAweDQ3RjQsIDB4NDdGNSwgMHg0N0Y2LCAweDQ3RjcsIDB4NDdGOCwgMHg0N0Y5LAotICAgIDB4NDdGQSwgMHg0N0ZCLCAweDQ3RkMsIDB4NDdGRCwgMHg0N0ZFLCAweDQ3RkYsIDB4NDgwMCwgMHg0ODAxLAotICAgIDB4NDgwMiwgMHg0ODAzLCAweDQ4MDQsIDB4NDgwNSwgMHg0ODA2LCAweDQ4MDcsIDB4NDgwOCwgMHg0ODA5LAotICAgIDB4NDgwQSwgMHg0ODBCLCAweDQ4MEMsIDB4NDgwRCwgMHg0ODBFLCAweDQ4MEYsIDB4NDgxMCwgMHg0ODExLAotICAgIDB4NDgxMiwgMHg0ODEzLCAweDQ4MTQsIDB4NDgxNSwgMHg0ODE2LCAweDQ4MTcsIDB4NDgxOCwgMHg0ODE5LAotICAgIDB4NDgxQSwgMHg0ODFCLCAweDQ4MUMsIDB4NDgxRCwgMHg0ODFFLCAweDQ4MUYsIDB4NDgyMCwgMHg0ODIxLAotICAgIDB4NDgyMiwgMHg0ODIzLCAweDQ4MjQsIDB4NDgyNSwgMHg0ODI2LCAweDQ4MjcsIDB4NDgyOCwgMHg0ODI5LAotICAgIDB4NDgyQSwgMHg0ODJCLCAweDQ4MkMsIDB4NDgyRCwgMHg0ODJFLCAweDQ4MkYsIDB4NDgzMCwgMHg0ODMxLAotICAgIDB4NDgzMiwgMHg0ODMzLCAweDQ4MzQsIDB4NDgzNSwgMHg0ODM2LCAweDQ4MzcsIDB4NDgzOCwgMHg0ODM5LAotICAgIDB4NDgzQSwgMHg0ODNCLCAweDQ4M0MsIDB4NDgzRCwgMHg0ODNFLCAweDQ4M0YsIDB4NDg0MCwgMHg0ODQxLAotICAgIDB4NDg0MiwgMHg0ODQzLCAweDQ4NDQsIDB4NDg0NSwgMHg0ODQ2LCAweDQ4NDcsIDB4NDg0OCwgMHg0ODQ5LAotICAgIDB4NDg0QSwgMHg0ODRCLCAweDQ4NEMsIDB4NDg0RCwgMHg0ODRFLCAweDQ4NEYsIDB4NDg1MCwgMHg0ODUxLAotICAgIDB4NDg1MiwgMHg0ODUzLCAweDQ4NTQsIDB4NDg1NSwgMHg0ODU2LCAweDQ4NTcsIDB4NDg1OCwgMHg0ODU5LAotICAgIDB4NDg1QSwgMHg0ODVCLCAweDQ4NUMsIDB4NDg1RCwgMHg0ODVFLCAweDQ4NUYsIDB4NDg2MCwgMHg0ODYxLAotICAgIDB4NDg2MiwgMHg0ODYzLCAweDQ4NjQsIDB4NDg2NSwgMHg0ODY2LCAweDQ4NjcsIDB4NDg2OCwgMHg0ODY5LAotICAgIDB4NDg2QSwgMHg0ODZCLCAweDQ4NkMsIDB4NDg2RCwgMHg0ODZFLCAweDQ4NkYsIDB4NDg3MCwgMHg0ODcxLAotICAgIDB4NDg3MiwgMHg0ODczLCAweDQ4NzQsIDB4NDg3NSwgMHg0ODc2LCAweDQ4NzcsIDB4NDg3OCwgMHg0ODc5LAotICAgIDB4NDg3QSwgMHg0ODdCLCAweDQ4N0MsIDB4NDg3RCwgMHg0ODdFLCAweDQ4N0YsIDB4NDg4MCwgMHg0ODgxLAotICAgIDB4NDg4MiwgMHg0ODgzLCAweDQ4ODQsIDB4NDg4NSwgMHg0ODg2LCAweDQ4ODcsIDB4NDg4OCwgMHg0ODg5LAotICAgIDB4NDg4QSwgMHg0ODhCLCAweDQ4OEMsIDB4NDg4RCwgMHg0ODhFLCAweDQ4OEYsIDB4NDg5MCwgMHg0ODkxLAotICAgIDB4NDg5MiwgMHg0ODkzLCAweDQ4OTQsIDB4NDg5NSwgMHg0ODk2LCAweDQ4OTcsIDB4NDg5OCwgMHg0ODk5LAotICAgIDB4NDg5QSwgMHg0ODlCLCAweDQ4OUMsIDB4NDg5RCwgMHg0ODlFLCAweDQ4OUYsIDB4NDhBMCwgMHg0OEExLAotICAgIDB4NDhBMiwgMHg0OEEzLCAweDQ4QTQsIDB4NDhBNSwgMHg0OEE2LCAweDQ4QTcsIDB4NDhBOCwgMHg0OEE5LAotICAgIDB4NDhBQSwgMHg0OEFCLCAweDQ4QUMsIDB4NDhBRCwgMHg0OEFFLCAweDQ4QUYsIDB4NDhCMCwgMHg0OEIxLAotICAgIDB4NDhCMiwgMHg0OEIzLCAweDQ4QjQsIDB4NDhCNSwgMHg0OEI2LCAweDQ4QjcsIDB4NDhCOCwgMHg0OEI5LAotICAgIDB4NDhCQSwgMHg0OEJCLCAweDQ4QkMsIDB4NDhCRCwgMHg0OEJFLCAweDQ4QkYsIDB4NDhDMCwgMHg0OEMxLAotICAgIDB4NDhDMiwgMHg0OEMzLCAweDQ4QzQsIDB4NDhDNSwgMHg0OEM2LCAweDQ4QzcsIDB4NDhDOCwgMHg0OEM5LAotICAgIDB4NDhDQSwgMHg0OENCLCAweDQ4Q0MsIDB4NDhDRCwgMHg0OENFLCAweDQ4Q0YsIDB4NDhEMCwgMHg0OEQxLAotICAgIDB4NDhEMiwgMHg0OEQzLCAweDQ4RDQsIDB4NDhENSwgMHg0OEQ2LCAweDQ4RDcsIDB4NDhEOCwgMHg0OEQ5LAotICAgIDB4NDhEQSwgMHg0OERCLCAweDQ4REMsIDB4NDhERCwgMHg0OERFLCAweDQ4REYsIDB4NDhFMCwgMHg0OEUxLAotICAgIDB4NDhFMiwgMHg0OEUzLCAweDQ4RTQsIDB4NDhFNSwgMHg0OEU2LCAweDQ4RTcsIDB4NDhFOCwgMHg0OEU5LAotICAgIDB4NDhFQSwgMHg0OEVCLCAweDQ4RUMsIDB4NDhFRCwgMHg0OEVFLCAweDQ4RUYsIDB4NDhGMCwgMHg0OEYxLAotICAgIDB4NDhGMiwgMHg0OEYzLCAweDQ4RjQsIDB4NDhGNSwgMHg0OEY2LCAweDQ4RjcsIDB4NDhGOCwgMHg0OEY5LAotICAgIDB4NDhGQSwgMHg0OEZCLCAweDQ4RkMsIDB4NDhGRCwgMHg0OEZFLCAweDQ4RkYsIDB4NDkwMCwgMHg0OTAxLAotICAgIDB4NDkwMiwgMHg0OTAzLCAweDQ5MDQsIDB4NDkwNSwgMHg0OTA2LCAweDQ5MDcsIDB4NDkwOCwgMHg0OTA5LAotICAgIDB4NDkwQSwgMHg0OTBCLCAweDQ5MEMsIDB4NDkwRCwgMHg0OTBFLCAweDQ5MEYsIDB4NDkxMCwgMHg0OTExLAotICAgIDB4NDkxMiwgMHg0OTEzLCAweDQ5MTQsIDB4NDkxNSwgMHg0OTE2LCAweDQ5MTcsIDB4NDkxOCwgMHg0OTE5LAotICAgIDB4NDkxQSwgMHg0OTFCLCAweDQ5MUMsIDB4NDkxRCwgMHg0OTFFLCAweDQ5MUYsIDB4NDkyMCwgMHg0OTIxLAotICAgIDB4NDkyMiwgMHg0OTIzLCAweDQ5MjQsIDB4NDkyNSwgMHg0OTI2LCAweDQ5MjcsIDB4NDkyOCwgMHg0OTI5LAotICAgIDB4NDkyQSwgMHg0OTJCLCAweDQ5MkMsIDB4NDkyRCwgMHg0OTJFLCAweDQ5MkYsIDB4NDkzMCwgMHg0OTMxLAotICAgIDB4NDkzMiwgMHg0OTMzLCAweDQ5MzQsIDB4NDkzNSwgMHg0OTM2LCAweDQ5MzcsIDB4NDkzOCwgMHg0OTM5LAotICAgIDB4NDkzQSwgMHg0OTNCLCAweDQ5M0MsIDB4NDkzRCwgMHg0OTNFLCAweDQ5M0YsIDB4NDk0MCwgMHg0OTQxLAotICAgIDB4NDk0MiwgMHg0OTQzLCAweDQ5NDQsIDB4NDk0NSwgMHg0OTQ2LCAweDQ5NDgsIDB4NDk0OSwgMHg0OTRBLAotICAgIDB4NDk0QiwgMHg0OTRDLCAweDQ5NEQsIDB4NDk0RSwgMHg0OTRGLCAweDQ5NTAsIDB4NDk1MSwgMHg0OTUyLAotICAgIDB4NDk1MywgMHg0OTU0LCAweDQ5NTUsIDB4NDk1NiwgMHg0OTU3LCAweDQ5NTgsIDB4NDk1OSwgMHg0OTVBLAotICAgIDB4NDk1QiwgMHg0OTVDLCAweDQ5NUQsIDB4NDk1RSwgMHg0OTVGLCAweDQ5NjAsIDB4NDk2MSwgMHg0OTYyLAotICAgIDB4NDk2MywgMHg0OTY0LCAweDQ5NjUsIDB4NDk2NiwgMHg0OTY3LCAweDQ5NjgsIDB4NDk2OSwgMHg0OTZBLAotICAgIDB4NDk2QiwgMHg0OTZDLCAweDQ5NkQsIDB4NDk2RSwgMHg0OTZGLCAweDQ5NzAsIDB4NDk3MSwgMHg0OTcyLAotICAgIDB4NDk3MywgMHg0OTc0LCAweDQ5NzUsIDB4NDk3NiwgMHg0OTc3LCAweDQ5NzgsIDB4NDk3OSwgMHg0OTdCLAotICAgIDB4NDk3QywgMHg0OTdFLCAweDQ5N0YsIDB4NDk4MCwgMHg0OTgxLCAweDQ5ODQsIDB4NDk4NywgMHg0OTg4LAotICAgIDB4NDk4OSwgMHg0OThBLCAweDQ5OEIsIDB4NDk4QywgMHg0OThELCAweDQ5OEUsIDB4NDk4RiwgMHg0OTkwLAotICAgIDB4NDk5MSwgMHg0OTkyLCAweDQ5OTMsIDB4NDk5NCwgMHg0OTk1LCAweDQ5OTYsIDB4NDk5NywgMHg0OTk4LAotICAgIDB4NDk5OSwgMHg0OTlBLCAweDQ5OUMsIDB4NDk5RCwgMHg0OTlFLCAweDQ5QTAsIDB4NDlBMSwgMHg0OUEyLAotICAgIDB4NDlBMywgMHg0OUE0LCAweDQ5QTUsIDB4NDlBNiwgMHg0OUE3LCAweDQ5QTgsIDB4NDlBOSwgMHg0OUFBLAotICAgIDB4NDlBQiwgMHg0OUFDLCAweDQ5QUQsIDB4NDlBRSwgMHg0OUFGLCAweDQ5QjAsIDB4NDlCMSwgMHg0OUIyLAotICAgIDB4NDlCMywgMHg0OUI0LCAweDQ5QjUsIDB4NDlCOCwgMHg0OUI5LCAweDQ5QkEsIDB4NDlCQiwgMHg0OUJDLAotICAgIDB4NDlCRCwgMHg0OUJFLCAweDQ5QkYsIDB4NDlDMCwgMHg0OUMxLCAweDQ5QzIsIDB4NDlDMywgMHg0OUM0LAotICAgIDB4NDlDNSwgMHg0OUM2LCAweDQ5QzcsIDB4NDlDOCwgMHg0OUM5LCAweDQ5Q0EsIDB4NDlDQiwgMHg0OUNDLAotICAgIDB4NDlDRCwgMHg0OUNFLCAweDQ5Q0YsIDB4NDlEMCwgMHg0OUQxLCAweDQ5RDIsIDB4NDlEMywgMHg0OUQ0LAotICAgIDB4NDlENSwgMHg0OUQ2LCAweDQ5RDcsIDB4NDlEOCwgMHg0OUQ5LCAweDQ5REEsIDB4NDlEQiwgMHg0OURDLAotICAgIDB4NDlERCwgMHg0OURFLCAweDQ5REYsIDB4NDlFMCwgMHg0OUUxLCAweDQ5RTIsIDB4NDlFMywgMHg0OUU0LAotICAgIDB4NDlFNSwgMHg0OUU2LCAweDQ5RTcsIDB4NDlFOCwgMHg0OUU5LCAweDQ5RUEsIDB4NDlFQiwgMHg0OUVDLAotICAgIDB4NDlFRCwgMHg0OUVFLCAweDQ5RUYsIDB4NDlGMCwgMHg0OUYxLCAweDQ5RjIsIDB4NDlGMywgMHg0OUY0LAotICAgIDB4NDlGNSwgMHg0OUY2LCAweDQ5RjcsIDB4NDlGOCwgMHg0OUY5LCAweDQ5RkEsIDB4NDlGQiwgMHg0OUZDLAotICAgIDB4NDlGRCwgMHg0OUZFLCAweDQ5RkYsIDB4NEEwMCwgMHg0QTAxLCAweDRBMDIsIDB4NEEwMywgMHg0QTA0LAotICAgIDB4NEEwNSwgMHg0QTA2LCAweDRBMDcsIDB4NEEwOCwgMHg0QTA5LCAweDRBMEEsIDB4NEEwQiwgMHg0QTBDLAotICAgIDB4NEEwRCwgMHg0QTBFLCAweDRBMEYsIDB4NEExMCwgMHg0QTExLCAweDRBMTIsIDB4NEExMywgMHg0QTE0LAotICAgIDB4NEExNSwgMHg0QTE2LCAweDRBMTcsIDB4NEExOCwgMHg0QTE5LCAweDRBMUEsIDB4NEExQiwgMHg0QTFDLAotICAgIDB4NEExRCwgMHg0QTFFLCAweDRBMUYsIDB4NEEyMCwgMHg0QTIxLCAweDRBMjIsIDB4NEEyMywgMHg0QTI0LAotICAgIDB4NEEyNSwgMHg0QTI2LCAweDRBMjcsIDB4NEEyOCwgMHg0QTI5LCAweDRBMkEsIDB4NEEyQiwgMHg0QTJDLAotICAgIDB4NEEyRCwgMHg0QTJFLCAweDRBMkYsIDB4NEEzMCwgMHg0QTMxLCAweDRBMzIsIDB4NEEzMywgMHg0QTM0LAotICAgIDB4NEEzNSwgMHg0QTM2LCAweDRBMzcsIDB4NEEzOCwgMHg0QTM5LCAweDRBM0EsIDB4NEEzQiwgMHg0QTNDLAotICAgIDB4NEEzRCwgMHg0QTNFLCAweDRBM0YsIDB4NEE0MCwgMHg0QTQxLCAweDRBNDIsIDB4NEE0MywgMHg0QTQ0LAotICAgIDB4NEE0NSwgMHg0QTQ2LCAweDRBNDcsIDB4NEE0OCwgMHg0QTQ5LCAweDRBNEEsIDB4NEE0QiwgMHg0QTRDLAotICAgIDB4NEE0RCwgMHg0QTRFLCAweDRBNEYsIDB4NEE1MCwgMHg0QTUxLCAweDRBNTIsIDB4NEE1MywgMHg0QTU0LAotICAgIDB4NEE1NSwgMHg0QTU2LCAweDRBNTcsIDB4NEE1OCwgMHg0QTU5LCAweDRBNUEsIDB4NEE1QiwgMHg0QTVDLAotICAgIDB4NEE1RCwgMHg0QTVFLCAweDRBNUYsIDB4NEE2MCwgMHg0QTYxLCAweDRBNjIsIDB4NEE2MywgMHg0QTY0LAotICAgIDB4NEE2NSwgMHg0QTY2LCAweDRBNjcsIDB4NEE2OCwgMHg0QTY5LCAweDRBNkEsIDB4NEE2QiwgMHg0QTZDLAotICAgIDB4NEE2RCwgMHg0QTZFLCAweDRBNkYsIDB4NEE3MCwgMHg0QTcxLCAweDRBNzIsIDB4NEE3MywgMHg0QTc0LAotICAgIDB4NEE3NSwgMHg0QTc2LCAweDRBNzcsIDB4NEE3OCwgMHg0QTc5LCAweDRBN0EsIDB4NEE3QiwgMHg0QTdDLAotICAgIDB4NEE3RCwgMHg0QTdFLCAweDRBN0YsIDB4NEE4MCwgMHg0QTgxLCAweDRBODIsIDB4NEE4MywgMHg0QTg0LAotICAgIDB4NEE4NSwgMHg0QTg2LCAweDRBODcsIDB4NEE4OCwgMHg0QTg5LCAweDRBOEEsIDB4NEE4QiwgMHg0QThDLAotICAgIDB4NEE4RCwgMHg0QThFLCAweDRBOEYsIDB4NEE5MCwgMHg0QTkxLCAweDRBOTIsIDB4NEE5MywgMHg0QTk0LAotICAgIDB4NEE5NSwgMHg0QTk2LCAweDRBOTcsIDB4NEE5OCwgMHg0QTk5LCAweDRBOUEsIDB4NEE5QiwgMHg0QTlDLAotICAgIDB4NEE5RCwgMHg0QTlFLCAweDRBOUYsIDB4NEFBMCwgMHg0QUExLCAweDRBQTIsIDB4NEFBMywgMHg0QUE0LAotICAgIDB4NEFBNSwgMHg0QUE2LCAweDRBQTcsIDB4NEFBOCwgMHg0QUE5LCAweDRBQUEsIDB4NEFBQiwgMHg0QUFDLAotICAgIDB4NEFBRCwgMHg0QUFFLCAweDRBQUYsIDB4NEFCMCwgMHg0QUIxLCAweDRBQjIsIDB4NEFCMywgMHg0QUI0LAotICAgIDB4NEFCNSwgMHg0QUI2LCAweDRBQjcsIDB4NEFCOCwgMHg0QUI5LCAweDRBQkEsIDB4NEFCQiwgMHg0QUJDLAotICAgIDB4NEFCRCwgMHg0QUJFLCAweDRBQkYsIDB4NEFDMCwgMHg0QUMxLCAweDRBQzIsIDB4NEFDMywgMHg0QUM0LAotICAgIDB4NEFDNSwgMHg0QUM2LCAweDRBQzcsIDB4NEFDOCwgMHg0QUM5LCAweDRBQ0EsIDB4NEFDQiwgMHg0QUNDLAotICAgIDB4NEFDRCwgMHg0QUNFLCAweDRBQ0YsIDB4NEFEMCwgMHg0QUQxLCAweDRBRDIsIDB4NEFEMywgMHg0QUQ0LAotICAgIDB4NEFENSwgMHg0QUQ2LCAweDRBRDcsIDB4NEFEOCwgMHg0QUQ5LCAweDRBREEsIDB4NEFEQiwgMHg0QURDLAotICAgIDB4NEFERCwgMHg0QURFLCAweDRBREYsIDB4NEFFMCwgMHg0QUUxLCAweDRBRTIsIDB4NEFFMywgMHg0QUU0LAotICAgIDB4NEFFNSwgMHg0QUU2LCAweDRBRTcsIDB4NEFFOCwgMHg0QUU5LCAweDRBRUEsIDB4NEFFQiwgMHg0QUVDLAotICAgIDB4NEFFRCwgMHg0QUVFLCAweDRBRUYsIDB4NEFGMCwgMHg0QUYxLCAweDRBRjIsIDB4NEFGMywgMHg0QUY0LAotICAgIDB4NEFGNSwgMHg0QUY2LCAweDRBRjcsIDB4NEFGOCwgMHg0QUY5LCAweDRBRkEsIDB4NEFGQiwgMHg0QUZDLAotICAgIDB4NEFGRCwgMHg0QUZFLCAweDRBRkYsIDB4NEIwMCwgMHg0QjAxLCAweDRCMDIsIDB4NEIwMywgMHg0QjA0LAotICAgIDB4NEIwNSwgMHg0QjA2LCAweDRCMDcsIDB4NEIwOCwgMHg0QjA5LCAweDRCMEEsIDB4NEIwQiwgMHg0QjBDLAotICAgIDB4NEIwRCwgMHg0QjBFLCAweDRCMEYsIDB4NEIxMCwgMHg0QjExLCAweDRCMTIsIDB4NEIxMywgMHg0QjE0LAotICAgIDB4NEIxNSwgMHg0QjE2LCAweDRCMTcsIDB4NEIxOCwgMHg0QjE5LCAweDRCMUEsIDB4NEIxQiwgMHg0QjFDLAotICAgIDB4NEIxRCwgMHg0QjFFLCAweDRCMUYsIDB4NEIyMCwgMHg0QjIxLCAweDRCMjIsIDB4NEIyMywgMHg0QjI0LAotICAgIDB4NEIyNSwgMHg0QjI2LCAweDRCMjcsIDB4NEIyOCwgMHg0QjI5LCAweDRCMkEsIDB4NEIyQiwgMHg0QjJDLAotICAgIDB4NEIyRCwgMHg0QjJFLCAweDRCMkYsIDB4NEIzMCwgMHg0QjMxLCAweDRCMzIsIDB4NEIzMywgMHg0QjM0LAotICAgIDB4NEIzNSwgMHg0QjM2LCAweDRCMzcsIDB4NEIzOCwgMHg0QjM5LCAweDRCM0EsIDB4NEIzQiwgMHg0QjNDLAotICAgIDB4NEIzRCwgMHg0QjNFLCAweDRCM0YsIDB4NEI0MCwgMHg0QjQxLCAweDRCNDIsIDB4NEI0MywgMHg0QjQ0LAotICAgIDB4NEI0NSwgMHg0QjQ2LCAweDRCNDcsIDB4NEI0OCwgMHg0QjQ5LCAweDRCNEEsIDB4NEI0QiwgMHg0QjRDLAotICAgIDB4NEI0RCwgMHg0QjRFLCAweDRCNEYsIDB4NEI1MCwgMHg0QjUxLCAweDRCNTIsIDB4NEI1MywgMHg0QjU0LAotICAgIDB4NEI1NSwgMHg0QjU2LCAweDRCNTcsIDB4NEI1OCwgMHg0QjU5LCAweDRCNUEsIDB4NEI1QiwgMHg0QjVDLAotICAgIDB4NEI1RCwgMHg0QjVFLCAweDRCNUYsIDB4NEI2MCwgMHg0QjYxLCAweDRCNjIsIDB4NEI2MywgMHg0QjY0LAotICAgIDB4NEI2NSwgMHg0QjY2LCAweDRCNjcsIDB4NEI2OCwgMHg0QjY5LCAweDRCNkEsIDB4NEI2QiwgMHg0QjZDLAotICAgIDB4NEI2RCwgMHg0QjZFLCAweDRCNkYsIDB4NEI3MCwgMHg0QjcxLCAweDRCNzIsIDB4NEI3MywgMHg0Qjc0LAotICAgIDB4NEI3NSwgMHg0Qjc2LCAweDRCNzcsIDB4NEI3OCwgMHg0Qjc5LCAweDRCN0EsIDB4NEI3QiwgMHg0QjdDLAotICAgIDB4NEI3RCwgMHg0QjdFLCAweDRCN0YsIDB4NEI4MCwgMHg0QjgxLCAweDRCODIsIDB4NEI4MywgMHg0Qjg0LAotICAgIDB4NEI4NSwgMHg0Qjg2LCAweDRCODcsIDB4NEI4OCwgMHg0Qjg5LCAweDRCOEEsIDB4NEI4QiwgMHg0QjhDLAotICAgIDB4NEI4RCwgMHg0QjhFLCAweDRCOEYsIDB4NEI5MCwgMHg0QjkxLCAweDRCOTIsIDB4NEI5MywgMHg0Qjk0LAotICAgIDB4NEI5NSwgMHg0Qjk2LCAweDRCOTcsIDB4NEI5OCwgMHg0Qjk5LCAweDRCOUEsIDB4NEI5QiwgMHg0QjlDLAotICAgIDB4NEI5RCwgMHg0QjlFLCAweDRCOUYsIDB4NEJBMCwgMHg0QkExLCAweDRCQTIsIDB4NEJBMywgMHg0QkE0LAotICAgIDB4NEJBNSwgMHg0QkE2LCAweDRCQTcsIDB4NEJBOCwgMHg0QkE5LCAweDRCQUEsIDB4NEJBQiwgMHg0QkFDLAotICAgIDB4NEJBRCwgMHg0QkFFLCAweDRCQUYsIDB4NEJCMCwgMHg0QkIxLCAweDRCQjIsIDB4NEJCMywgMHg0QkI0LAotICAgIDB4NEJCNSwgMHg0QkI2LCAweDRCQjcsIDB4NEJCOCwgMHg0QkI5LCAweDRCQkEsIDB4NEJCQiwgMHg0QkJDLAotICAgIDB4NEJCRCwgMHg0QkJFLCAweDRCQkYsIDB4NEJDMCwgMHg0QkMxLCAweDRCQzIsIDB4NEJDMywgMHg0QkM0LAotICAgIDB4NEJDNSwgMHg0QkM2LCAweDRCQzcsIDB4NEJDOCwgMHg0QkM5LCAweDRCQ0EsIDB4NEJDQiwgMHg0QkNDLAotICAgIDB4NEJDRCwgMHg0QkNFLCAweDRCQ0YsIDB4NEJEMCwgMHg0QkQxLCAweDRCRDIsIDB4NEJEMywgMHg0QkQ0LAotICAgIDB4NEJENSwgMHg0QkQ2LCAweDRCRDcsIDB4NEJEOCwgMHg0QkQ5LCAweDRCREEsIDB4NEJEQiwgMHg0QkRDLAotICAgIDB4NEJERCwgMHg0QkRFLCAweDRCREYsIDB4NEJFMCwgMHg0QkUxLCAweDRCRTIsIDB4NEJFMywgMHg0QkU0LAotICAgIDB4NEJFNSwgMHg0QkU2LCAweDRCRTcsIDB4NEJFOCwgMHg0QkU5LCAweDRCRUEsIDB4NEJFQiwgMHg0QkVDLAotICAgIDB4NEJFRCwgMHg0QkVFLCAweDRCRUYsIDB4NEJGMCwgMHg0QkYxLCAweDRCRjIsIDB4NEJGMywgMHg0QkY0LAotICAgIDB4NEJGNSwgMHg0QkY2LCAweDRCRjcsIDB4NEJGOCwgMHg0QkY5LCAweDRCRkEsIDB4NEJGQiwgMHg0QkZDLAotICAgIDB4NEJGRCwgMHg0QkZFLCAweDRCRkYsIDB4NEMwMCwgMHg0QzAxLCAweDRDMDIsIDB4NEMwMywgMHg0QzA0LAotICAgIDB4NEMwNSwgMHg0QzA2LCAweDRDMDcsIDB4NEMwOCwgMHg0QzA5LCAweDRDMEEsIDB4NEMwQiwgMHg0QzBDLAotICAgIDB4NEMwRCwgMHg0QzBFLCAweDRDMEYsIDB4NEMxMCwgMHg0QzExLCAweDRDMTIsIDB4NEMxMywgMHg0QzE0LAotICAgIDB4NEMxNSwgMHg0QzE2LCAweDRDMTcsIDB4NEMxOCwgMHg0QzE5LCAweDRDMUEsIDB4NEMxQiwgMHg0QzFDLAotICAgIDB4NEMxRCwgMHg0QzFFLCAweDRDMUYsIDB4NEMyMCwgMHg0QzIxLCAweDRDMjIsIDB4NEMyMywgMHg0QzI0LAotICAgIDB4NEMyNSwgMHg0QzI2LCAweDRDMjcsIDB4NEMyOCwgMHg0QzI5LCAweDRDMkEsIDB4NEMyQiwgMHg0QzJDLAotICAgIDB4NEMyRCwgMHg0QzJFLCAweDRDMkYsIDB4NEMzMCwgMHg0QzMxLCAweDRDMzIsIDB4NEMzMywgMHg0QzM0LAotICAgIDB4NEMzNSwgMHg0QzM2LCAweDRDMzcsIDB4NEMzOCwgMHg0QzM5LCAweDRDM0EsIDB4NEMzQiwgMHg0QzNDLAotICAgIDB4NEMzRCwgMHg0QzNFLCAweDRDM0YsIDB4NEM0MCwgMHg0QzQxLCAweDRDNDIsIDB4NEM0MywgMHg0QzQ0LAotICAgIDB4NEM0NSwgMHg0QzQ2LCAweDRDNDcsIDB4NEM0OCwgMHg0QzQ5LCAweDRDNEEsIDB4NEM0QiwgMHg0QzRDLAotICAgIDB4NEM0RCwgMHg0QzRFLCAweDRDNEYsIDB4NEM1MCwgMHg0QzUxLCAweDRDNTIsIDB4NEM1MywgMHg0QzU0LAotICAgIDB4NEM1NSwgMHg0QzU2LCAweDRDNTcsIDB4NEM1OCwgMHg0QzU5LCAweDRDNUEsIDB4NEM1QiwgMHg0QzVDLAotICAgIDB4NEM1RCwgMHg0QzVFLCAweDRDNUYsIDB4NEM2MCwgMHg0QzYxLCAweDRDNjIsIDB4NEM2MywgMHg0QzY0LAotICAgIDB4NEM2NSwgMHg0QzY2LCAweDRDNjcsIDB4NEM2OCwgMHg0QzY5LCAweDRDNkEsIDB4NEM2QiwgMHg0QzZDLAotICAgIDB4NEM2RCwgMHg0QzZFLCAweDRDNkYsIDB4NEM3MCwgMHg0QzcxLCAweDRDNzIsIDB4NEM3MywgMHg0Qzc0LAotICAgIDB4NEM3NSwgMHg0Qzc2LCAweDRDNzgsIDB4NEM3OSwgMHg0QzdBLCAweDRDN0IsIDB4NEM3QywgMHg0QzdELAotICAgIDB4NEM3RSwgMHg0QzdGLCAweDRDODAsIDB4NEM4MSwgMHg0QzgyLCAweDRDODMsIDB4NEM4NCwgMHg0Qzg1LAotICAgIDB4NEM4NiwgMHg0Qzg3LCAweDRDODgsIDB4NEM4OSwgMHg0QzhBLCAweDRDOEIsIDB4NEM4QywgMHg0QzhELAotICAgIDB4NEM4RSwgMHg0QzhGLCAweDRDOTAsIDB4NEM5MSwgMHg0QzkyLCAweDRDOTMsIDB4NEM5NCwgMHg0Qzk1LAotICAgIDB4NEM5NiwgMHg0Qzk3LCAweDRDOTgsIDB4NEM5OSwgMHg0QzlBLCAweDRDOUIsIDB4NEM5QywgMHg0QzlELAotICAgIDB4NEM5RSwgMHg0Q0E0LCAweDRDQTUsIDB4NENBNiwgMHg0Q0E3LCAweDRDQTgsIDB4NENBOSwgMHg0Q0FBLAotICAgIDB4NENBQiwgMHg0Q0FDLCAweDRDQUQsIDB4NENBRSwgMHg0Q0FGLCAweDRDQjAsIDB4NENCMSwgMHg0Q0IyLAotICAgIDB4NENCMywgMHg0Q0I0LCAweDRDQjUsIDB4NENCNiwgMHg0Q0I3LCAweDRDQjgsIDB4NENCOSwgMHg0Q0JBLAotICAgIDB4NENCQiwgMHg0Q0JDLCAweDRDQkQsIDB4NENCRSwgMHg0Q0JGLCAweDRDQzAsIDB4NENDMSwgMHg0Q0MyLAotICAgIDB4NENDMywgMHg0Q0M0LCAweDRDQzUsIDB4NENDNiwgMHg0Q0M3LCAweDRDQzgsIDB4NENDOSwgMHg0Q0NBLAotICAgIDB4NENDQiwgMHg0Q0NDLCAweDRDQ0QsIDB4NENDRSwgMHg0Q0NGLCAweDRDRDAsIDB4NENEMSwgMHg0Q0QyLAotICAgIDB4NENEMywgMHg0Q0Q0LCAweDRDRDUsIDB4NENENiwgMHg0Q0Q3LCAweDRDRDgsIDB4NENEOSwgMHg0Q0RBLAotICAgIDB4NENEQiwgMHg0Q0RDLCAweDRDREQsIDB4NENERSwgMHg0Q0RGLCAweDRDRTAsIDB4NENFMSwgMHg0Q0UyLAotICAgIDB4NENFMywgMHg0Q0U0LCAweDRDRTUsIDB4NENFNiwgMHg0Q0U3LCAweDRDRTgsIDB4NENFOSwgMHg0Q0VBLAotICAgIDB4NENFQiwgMHg0Q0VDLCAweDRDRUQsIDB4NENFRSwgMHg0Q0VGLCAweDRDRjAsIDB4NENGMSwgMHg0Q0YyLAotICAgIDB4NENGMywgMHg0Q0Y0LCAweDRDRjUsIDB4NENGNiwgMHg0Q0Y3LCAweDRDRjgsIDB4NENGOSwgMHg0Q0ZBLAotICAgIDB4NENGQiwgMHg0Q0ZDLCAweDRDRkQsIDB4NENGRSwgMHg0Q0ZGLCAweDREMDAsIDB4NEQwMSwgMHg0RDAyLAotICAgIDB4NEQwMywgMHg0RDA0LCAweDREMDUsIDB4NEQwNiwgMHg0RDA3LCAweDREMDgsIDB4NEQwOSwgMHg0RDBBLAotICAgIDB4NEQwQiwgMHg0RDBDLCAweDREMEQsIDB4NEQwRSwgMHg0RDBGLCAweDREMTAsIDB4NEQxMSwgMHg0RDEyLAotICAgIDB4NEQxQSwgMHg0RDFCLCAweDREMUMsIDB4NEQxRCwgMHg0RDFFLCAweDREMUYsIDB4NEQyMCwgMHg0RDIxLAotICAgIDB4NEQyMiwgMHg0RDIzLCAweDREMjQsIDB4NEQyNSwgMHg0RDI2LCAweDREMjcsIDB4NEQyOCwgMHg0RDI5LAotICAgIDB4NEQyQSwgMHg0RDJCLCAweDREMkMsIDB4NEQyRCwgMHg0RDJFLCAweDREMkYsIDB4NEQzMCwgMHg0RDMxLAotICAgIDB4NEQzMiwgMHg0RDMzLCAweDREMzQsIDB4NEQzNSwgMHg0RDM2LCAweDREMzcsIDB4NEQzOCwgMHg0RDM5LAotICAgIDB4NEQzQSwgMHg0RDNCLCAweDREM0MsIDB4NEQzRCwgMHg0RDNFLCAweDREM0YsIDB4NEQ0MCwgMHg0RDQxLAotICAgIDB4NEQ0MiwgMHg0RDQzLCAweDRENDQsIDB4NEQ0NSwgMHg0RDQ2LCAweDRENDcsIDB4NEQ0OCwgMHg0RDQ5LAotICAgIDB4NEQ0QSwgMHg0RDRCLCAweDRENEMsIDB4NEQ0RCwgMHg0RDRFLCAweDRENEYsIDB4NEQ1MCwgMHg0RDUxLAotICAgIDB4NEQ1MiwgMHg0RDUzLCAweDRENTQsIDB4NEQ1NSwgMHg0RDU2LCAweDRENTcsIDB4NEQ1OCwgMHg0RDU5LAotICAgIDB4NEQ1QSwgMHg0RDVCLCAweDRENUMsIDB4NEQ1RCwgMHg0RDVFLCAweDRENUYsIDB4NEQ2MCwgMHg0RDYxLAotICAgIDB4NEQ2MiwgMHg0RDYzLCAweDRENjQsIDB4NEQ2NSwgMHg0RDY2LCAweDRENjcsIDB4NEQ2OCwgMHg0RDY5LAotICAgIDB4NEQ2QSwgMHg0RDZCLCAweDRENkMsIDB4NEQ2RCwgMHg0RDZFLCAweDRENkYsIDB4NEQ3MCwgMHg0RDcxLAotICAgIDB4NEQ3MiwgMHg0RDczLCAweDRENzQsIDB4NEQ3NSwgMHg0RDc2LCAweDRENzcsIDB4NEQ3OCwgMHg0RDc5LAotICAgIDB4NEQ3QSwgMHg0RDdCLCAweDREN0MsIDB4NEQ3RCwgMHg0RDdFLCAweDREN0YsIDB4NEQ4MCwgMHg0RDgxLAotICAgIDB4NEQ4MiwgMHg0RDgzLCAweDREODQsIDB4NEQ4NSwgMHg0RDg2LCAweDREODcsIDB4NEQ4OCwgMHg0RDg5LAotICAgIDB4NEQ4QSwgMHg0RDhCLCAweDREOEMsIDB4NEQ4RCwgMHg0RDhFLCAweDREOEYsIDB4NEQ5MCwgMHg0RDkxLAotICAgIDB4NEQ5MiwgMHg0RDkzLCAweDREOTQsIDB4NEQ5NSwgMHg0RDk2LCAweDREOTcsIDB4NEQ5OCwgMHg0RDk5LAotICAgIDB4NEQ5QSwgMHg0RDlCLCAweDREOUMsIDB4NEQ5RCwgMHg0RDlFLCAweDREOUYsIDB4NERBMCwgMHg0REExLAotICAgIDB4NERBMiwgMHg0REEzLCAweDREQTQsIDB4NERBNSwgMHg0REE2LCAweDREQTcsIDB4NERBOCwgMHg0REE5LAotICAgIDB4NERBQSwgMHg0REFCLCAweDREQUMsIDB4NERBRCwgMHg0REFGLCAweDREQjAsIDB4NERCMSwgMHg0REIyLAotICAgIDB4NERCMywgMHg0REI0LCAweDREQjUsIDB4MjBBQywgMHgwMEE1LCAweDIwQUMsIDB4MDAyNCwgMHgzMDNGLAotICAgIDB4QTAwMCwgMHhBMDAxLCAweEEwMDIsIDB4QTAwMywgMHhBMDA0LCAweEEwMDUsIDB4QTAwNiwgMHhBMDA3LAotICAgIDB4QTAwOCwgMHhBMDA5LCAweEEwMEEsIDB4QTAwQiwgMHhBMDBDLCAweEEwMEQsIDB4QTAwRSwgMHhBMDBGLAotICAgIDB4QTAxMCwgMHhBMDExLCAweEEwMTIsIDB4QTAxMywgMHhBMDE0LCAweEEwMTUsIDB4QTAxNiwgMHhBMDE3LAotICAgIDB4QTAxOCwgMHhBMDE5LCAweEEwMUEsIDB4QTAxQiwgMHhBMDFDLCAweEEwMUQsIDB4QTAxRSwgMHhBMDFGLAotICAgIDB4QTAyMCwgMHhBMDIxLCAweEEwMjIsIDB4QTAyMywgMHhBMDI0LCAweEEwMjUsIDB4QTAyNiwgMHhBMDI3LAotICAgIDB4QTAyOCwgMHhBMDI5LCAweEEwMkEsIDB4QTAyQiwgMHhBMDJDLCAweEEwMkQsIDB4QTAyRSwgMHhBMDJGLAotICAgIDB4QTAzMCwgMHhBMDMxLCAweEEwMzIsIDB4QTAzMywgMHhBMDM0LCAweEEwMzUsIDB4QTAzNiwgMHhBMDM3LAotICAgIDB4QTAzOCwgMHhBMDM5LCAweEEwM0EsIDB4QTAzQiwgMHhBMDNDLCAweEEwM0QsIDB4QTAzRSwgMHhBMDNGLAotICAgIDB4QTA0MCwgMHhBMDQxLCAweEEwNDIsIDB4QTA0MywgMHhBMDQ0LCAweEEwNDUsIDB4QTA0NiwgMHhBMDQ3LAotICAgIDB4QTA0OCwgMHhBMDQ5LCAweEEwNEEsIDB4QTA0QiwgMHhBMDRDLCAweEEwNEQsIDB4QTA0RSwgMHhBMDRGLAotICAgIDB4QTA1MCwgMHhBMDUxLCAweEEwNTIsIDB4QTA1MywgMHhBMDU0LCAweEEwNTUsIDB4QTA1NiwgMHhBMDU3LAotICAgIDB4QTA1OCwgMHhBMDU5LCAweEEwNUEsIDB4QTA1QiwgMHhBMDVDLCAweEEwNUQsIDB4QTA1RSwgMHhBMDVGLAotICAgIDB4QTA2MCwgMHhBMDYxLCAweEEwNjIsIDB4QTA2MywgMHhBMDY0LCAweEEwNjUsIDB4QTA2NiwgMHhBMDY3LAotICAgIDB4QTA2OCwgMHhBMDY5LCAweEEwNkEsIDB4QTA2QiwgMHhBMDZDLCAweEEwNkQsIDB4QTA2RSwgMHhBMDZGLAotICAgIDB4QTA3MCwgMHhBMDcxLCAweEEwNzIsIDB4QTA3MywgMHhBMDc0LCAweEEwNzUsIDB4QTA3NiwgMHhBMDc3LAotICAgIDB4QTA3OCwgMHhBMDc5LCAweEEwN0EsIDB4QTA3QiwgMHhBMDdDLCAweEEwN0QsIDB4QTA3RSwgMHhBMDdGLAotICAgIDB4QTA4MCwgMHhBMDgxLCAweEEwODIsIDB4QTA4MywgMHhBMDg0LCAweEEwODUsIDB4QTA4NiwgMHhBMDg3LAotICAgIDB4QTA4OCwgMHhBMDg5LCAweEEwOEEsIDB4QTA4QiwgMHhBMDhDLCAweEEwOEQsIDB4QTA4RSwgMHhBMDhGLAotICAgIDB4QTA5MCwgMHhBMDkxLCAweEEwOTIsIDB4QTA5MywgMHhBMDk0LCAweEEwOTUsIDB4QTA5NiwgMHhBMDk3LAotICAgIDB4QTA5OCwgMHhBMDk5LCAweEEwOUEsIDB4QTA5QiwgMHhBMDlDLCAweEEwOUQsIDB4QTA5RSwgMHhBMDlGLAotICAgIDB4QTBBMCwgMHhBMEExLCAweEEwQTIsIDB4QTBBMywgMHhBMEE0LCAweEEwQTUsIDB4QTBBNiwgMHhBMEE3LAotICAgIDB4QTBBOCwgMHhBMEE5LCAweEEwQUEsIDB4QTBBQiwgMHhBMEFDLCAweEEwQUQsIDB4QTBBRSwgMHhBMEFGLAotICAgIDB4QTBCMCwgMHhBMEIxLCAweEEwQjIsIDB4QTBCMywgMHhBMEI0LCAweEEwQjUsIDB4QTBCNiwgMHhBMEI3LAotICAgIDB4QTBCOCwgMHhBMEI5LCAweEEwQkEsIDB4QTBCQiwgMHhBMEJDLCAweEEwQkQsIDB4QTBCRSwgMHhBMEJGLAotICAgIDB4QTBDMCwgMHhBMEMxLCAweEEwQzIsIDB4QTBDMywgMHhBMEM0LCAweEEwQzUsIDB4QTBDNiwgMHhBMEM3LAotICAgIDB4QTBDOCwgMHhBMEM5LCAweEEwQ0EsIDB4QTBDQiwgMHhBMENDLCAweEEwQ0QsIDB4QTBDRSwgMHhBMENGLAotICAgIDB4QTBEMCwgMHhBMEQxLCAweEEwRDIsIDB4QTBEMywgMHhBMEQ0LCAweEEwRDUsIDB4QTBENiwgMHhBMEQ3LAotICAgIDB4QTBEOCwgMHhBMEQ5LCAweEEwREEsIDB4QTBEQiwgMHhBMERDLCAweEEwREQsIDB4QTBERSwgMHhBMERGLAotICAgIDB4QTBFMCwgMHhBMEUxLCAweEEwRTIsIDB4QTBFMywgMHhBMEU0LCAweEEwRTUsIDB4QTBFNiwgMHhBMEU3LAotICAgIDB4QTBFOCwgMHhBMEU5LCAweEEwRUEsIDB4QTBFQiwgMHhBMEVDLCAweEEwRUQsIDB4QTBFRSwgMHhBMEVGLAotICAgIDB4QTBGMCwgMHhBMEYxLCAweEEwRjIsIDB4QTBGMywgMHhBMEY0LCAweEEwRjUsIDB4QTBGNiwgMHhBMEY3LAotICAgIDB4QTBGOCwgMHhBMEY5LCAweEEwRkEsIDB4QTBGQiwgMHhBMEZDLCAweEEwRkQsIDB4QTBGRSwgMHhBMEZGLAotICAgIDB4QTEwMCwgMHhBMTAxLCAweEExMDIsIDB4QTEwMywgMHhBMTA0LCAweEExMDUsIDB4QTEwNiwgMHhBMTA3LAotICAgIDB4QTEwOCwgMHhBMTA5LCAweEExMEEsIDB4QTEwQiwgMHhBMTBDLCAweEExMEQsIDB4QTEwRSwgMHhBMTBGLAotICAgIDB4QTExMCwgMHhBMTExLCAweEExMTIsIDB4QTExMywgMHhBMTE0LCAweEExMTUsIDB4QTExNiwgMHhBMTE3LAotICAgIDB4QTExOCwgMHhBMTE5LCAweEExMUEsIDB4QTExQiwgMHhBMTFDLCAweEExMUQsIDB4QTExRSwgMHhBMTFGLAotICAgIDB4QTEyMCwgMHhBMTIxLCAweEExMjIsIDB4QTEyMywgMHhBMTI0LCAweEExMjUsIDB4QTEyNiwgMHhBMTI3LAotICAgIDB4QTEyOCwgMHhBMTI5LCAweEExMkEsIDB4QTEyQiwgMHhBMTJDLCAweEExMkQsIDB4QTEyRSwgMHhBMTJGLAotICAgIDB4QTEzMCwgMHhBMTMxLCAweEExMzIsIDB4QTEzMywgMHhBMTM0LCAweEExMzUsIDB4QTEzNiwgMHhBMTM3LAotICAgIDB4QTEzOCwgMHhBMTM5LCAweEExM0EsIDB4QTEzQiwgMHhBMTNDLCAweEExM0QsIDB4QTEzRSwgMHhBMTNGLAotICAgIDB4QTE0MCwgMHhBMTQxLCAweEExNDIsIDB4QTE0MywgMHhBMTQ0LCAweEExNDUsIDB4QTE0NiwgMHhBMTQ3LAotICAgIDB4QTE0OCwgMHhBMTQ5LCAweEExNEEsIDB4QTE0QiwgMHhBMTRDLCAweEExNEQsIDB4QTE0RSwgMHhBMTRGLAotICAgIDB4QTE1MCwgMHhBMTUxLCAweEExNTIsIDB4QTE1MywgMHhBMTU0LCAweEExNTUsIDB4QTE1NiwgMHhBMTU3LAotICAgIDB4QTE1OCwgMHhBMTU5LCAweEExNUEsIDB4QTE1QiwgMHhBMTVDLCAweEExNUQsIDB4QTE1RSwgMHhBMTVGLAotICAgIDB4QTE2MCwgMHhBMTYxLCAweEExNjIsIDB4QTE2MywgMHhBMTY0LCAweEExNjUsIDB4QTE2NiwgMHhBMTY3LAotICAgIDB4QTE2OCwgMHhBMTY5LCAweEExNkEsIDB4QTE2QiwgMHhBMTZDLCAweEExNkQsIDB4QTE2RSwgMHhBMTZGLAotICAgIDB4QTE3MCwgMHhBMTcxLCAweEExNzIsIDB4QTE3MywgMHhBMTc0LCAweEExNzUsIDB4QTE3NiwgMHhBMTc3LAotICAgIDB4QTE3OCwgMHhBMTc5LCAweEExN0EsIDB4QTE3QiwgMHhBMTdDLCAweEExN0QsIDB4QTE3RSwgMHhBMTdGLAotICAgIDB4QTE4MCwgMHhBMTgxLCAweEExODIsIDB4QTE4MywgMHhBMTg0LCAweEExODUsIDB4QTE4NiwgMHhBMTg3LAotICAgIDB4QTE4OCwgMHhBMTg5LCAweEExOEEsIDB4QTE4QiwgMHhBMThDLCAweEExOEQsIDB4QTE4RSwgMHhBMThGLAotICAgIDB4QTE5MCwgMHhBMTkxLCAweEExOTIsIDB4QTE5MywgMHhBMTk0LCAweEExOTUsIDB4QTE5NiwgMHhBMTk3LAotICAgIDB4QTE5OCwgMHhBMTk5LCAweEExOUEsIDB4QTE5QiwgMHhBMTlDLCAweEExOUQsIDB4QTE5RSwgMHhBMTlGLAotICAgIDB4QTFBMCwgMHhBMUExLCAweEExQTIsIDB4QTFBMywgMHhBMUE0LCAweEExQTUsIDB4QTFBNiwgMHhBMUE3LAotICAgIDB4QTFBOCwgMHhBMUE5LCAweEExQUEsIDB4QTFBQiwgMHhBMUFDLCAweEExQUQsIDB4QTFBRSwgMHhBMUFGLAotICAgIDB4QTFCMCwgMHhBMUIxLCAweEExQjIsIDB4QTFCMywgMHhBMUI0LCAweEExQjUsIDB4QTFCNiwgMHhBMUI3LAotICAgIDB4QTFCOCwgMHhBMUI5LCAweEExQkEsIDB4QTFCQiwgMHhBMUJDLCAweEExQkQsIDB4QTFCRSwgMHhBMUJGLAotICAgIDB4QTFDMCwgMHhBMUMxLCAweEExQzIsIDB4QTFDMywgMHhBMUM0LCAweEExQzUsIDB4QTFDNiwgMHhBMUM3LAotICAgIDB4QTFDOCwgMHhBMUM5LCAweEExQ0EsIDB4QTFDQiwgMHhBMUNDLCAweEExQ0QsIDB4QTFDRSwgMHhBMUNGLAotICAgIDB4QTFEMCwgMHhBMUQxLCAweEExRDIsIDB4QTFEMywgMHhBMUQ0LCAweEExRDUsIDB4QTFENiwgMHhBMUQ3LAotICAgIDB4QTFEOCwgMHhBMUQ5LCAweEExREEsIDB4QTFEQiwgMHhBMURDLCAweEExREQsIDB4QTFERSwgMHhBMURGLAotICAgIDB4QTFFMCwgMHhBMUUxLCAweEExRTIsIDB4QTFFMywgMHhBMUU0LCAweEExRTUsIDB4QTFFNiwgMHhBMUU3LAotICAgIDB4QTFFOCwgMHhBMUU5LCAweEExRUEsIDB4QTFFQiwgMHhBMUVDLCAweEExRUQsIDB4QTFFRSwgMHhBMUVGLAotICAgIDB4QTFGMCwgMHhBMUYxLCAweEExRjIsIDB4QTFGMywgMHhBMUY0LCAweEExRjUsIDB4QTFGNiwgMHhBMUY3LAotICAgIDB4QTFGOCwgMHhBMUY5LCAweEExRkEsIDB4QTFGQiwgMHhBMUZDLCAweEExRkQsIDB4QTFGRSwgMHhBMUZGLAotICAgIDB4QTIwMCwgMHhBMjAxLCAweEEyMDIsIDB4QTIwMywgMHhBMjA0LCAweEEyMDUsIDB4QTIwNiwgMHhBMjA3LAotICAgIDB4QTIwOCwgMHhBMjA5LCAweEEyMEEsIDB4QTIwQiwgMHhBMjBDLCAweEEyMEQsIDB4QTIwRSwgMHhBMjBGLAotICAgIDB4QTIxMCwgMHhBMjExLCAweEEyMTIsIDB4QTIxMywgMHhBMjE0LCAweEEyMTUsIDB4QTIxNiwgMHhBMjE3LAotICAgIDB4QTIxOCwgMHhBMjE5LCAweEEyMUEsIDB4QTIxQiwgMHhBMjFDLCAweEEyMUQsIDB4QTIxRSwgMHhBMjFGLAotICAgIDB4QTIyMCwgMHhBMjIxLCAweEEyMjIsIDB4QTIyMywgMHhBMjI0LCAweEEyMjUsIDB4QTIyNiwgMHhBMjI3LAotICAgIDB4QTIyOCwgMHhBMjI5LCAweEEyMkEsIDB4QTIyQiwgMHhBMjJDLCAweEEyMkQsIDB4QTIyRSwgMHhBMjJGLAotICAgIDB4QTIzMCwgMHhBMjMxLCAweEEyMzIsIDB4QTIzMywgMHhBMjM0LCAweEEyMzUsIDB4QTIzNiwgMHhBMjM3LAotICAgIDB4QTIzOCwgMHhBMjM5LCAweEEyM0EsIDB4QTIzQiwgMHhBMjNDLCAweEEyM0QsIDB4QTIzRSwgMHhBMjNGLAotICAgIDB4QTI0MCwgMHhBMjQxLCAweEEyNDIsIDB4QTI0MywgMHhBMjQ0LCAweEEyNDUsIDB4QTI0NiwgMHhBMjQ3LAotICAgIDB4QTI0OCwgMHhBMjQ5LCAweEEyNEEsIDB4QTI0QiwgMHhBMjRDLCAweEEyNEQsIDB4QTI0RSwgMHhBMjRGLAotICAgIDB4QTI1MCwgMHhBMjUxLCAweEEyNTIsIDB4QTI1MywgMHhBMjU0LCAweEEyNTUsIDB4QTI1NiwgMHhBMjU3LAotICAgIDB4QTI1OCwgMHhBMjU5LCAweEEyNUEsIDB4QTI1QiwgMHhBMjVDLCAweEEyNUQsIDB4QTI1RSwgMHhBMjVGLAotICAgIDB4QTI2MCwgMHhBMjYxLCAweEEyNjIsIDB4QTI2MywgMHhBMjY0LCAweEEyNjUsIDB4QTI2NiwgMHhBMjY3LAotICAgIDB4QTI2OCwgMHhBMjY5LCAweEEyNkEsIDB4QTI2QiwgMHhBMjZDLCAweEEyNkQsIDB4QTI2RSwgMHhBMjZGLAotICAgIDB4QTI3MCwgMHhBMjcxLCAweEEyNzIsIDB4QTI3MywgMHhBMjc0LCAweEEyNzUsIDB4QTI3NiwgMHhBMjc3LAotICAgIDB4QTI3OCwgMHhBMjc5LCAweEEyN0EsIDB4QTI3QiwgMHhBMjdDLCAweEEyN0QsIDB4QTI3RSwgMHhBMjdGLAotICAgIDB4QTI4MCwgMHhBMjgxLCAweEEyODIsIDB4QTI4MywgMHhBMjg0LCAweEEyODUsIDB4QTI4NiwgMHhBMjg3LAotICAgIDB4QTI4OCwgMHhBMjg5LCAweEEyOEEsIDB4QTI4QiwgMHhBMjhDLCAweEEyOEQsIDB4QTI4RSwgMHhBMjhGLAotICAgIDB4QTI5MCwgMHhBMjkxLCAweEEyOTIsIDB4QTI5MywgMHhBMjk0LCAweEEyOTUsIDB4QTI5NiwgMHhBMjk3LAotICAgIDB4QTI5OCwgMHhBMjk5LCAweEEyOUEsIDB4QTI5QiwgMHhBMjlDLCAweEEyOUQsIDB4QTI5RSwgMHhBMjlGLAotICAgIDB4QTJBMCwgMHhBMkExLCAweEEyQTIsIDB4QTJBMywgMHhBMkE0LCAweEEyQTUsIDB4QTJBNiwgMHhBMkE3LAotICAgIDB4QTJBOCwgMHhBMkE5LCAweEEyQUEsIDB4QTJBQiwgMHhBMkFDLCAweEEyQUQsIDB4QTJBRSwgMHhBMkFGLAotICAgIDB4QTJCMCwgMHhBMkIxLCAweEEyQjIsIDB4QTJCMywgMHhBMkI0LCAweEEyQjUsIDB4QTJCNiwgMHhBMkI3LAotICAgIDB4QTJCOCwgMHhBMkI5LCAweEEyQkEsIDB4QTJCQiwgMHhBMkJDLCAweEEyQkQsIDB4QTJCRSwgMHhBMkJGLAotICAgIDB4QTJDMCwgMHhBMkMxLCAweEEyQzIsIDB4QTJDMywgMHhBMkM0LCAweEEyQzUsIDB4QTJDNiwgMHhBMkM3LAotICAgIDB4QTJDOCwgMHhBMkM5LCAweEEyQ0EsIDB4QTJDQiwgMHhBMkNDLCAweEEyQ0QsIDB4QTJDRSwgMHhBMkNGLAotICAgIDB4QTJEMCwgMHhBMkQxLCAweEEyRDIsIDB4QTJEMywgMHhBMkQ0LCAweEEyRDUsIDB4QTJENiwgMHhBMkQ3LAotICAgIDB4QTJEOCwgMHhBMkQ5LCAweEEyREEsIDB4QTJEQiwgMHhBMkRDLCAweEEyREQsIDB4QTJERSwgMHhBMkRGLAotICAgIDB4QTJFMCwgMHhBMkUxLCAweEEyRTIsIDB4QTJFMywgMHhBMkU0LCAweEEyRTUsIDB4QTJFNiwgMHhBMkU3LAotICAgIDB4QTJFOCwgMHhBMkU5LCAweEEyRUEsIDB4QTJFQiwgMHhBMkVDLCAweEEyRUQsIDB4QTJFRSwgMHhBMkVGLAotICAgIDB4QTJGMCwgMHhBMkYxLCAweEEyRjIsIDB4QTJGMywgMHhBMkY0LCAweEEyRjUsIDB4QTJGNiwgMHhBMkY3LAotICAgIDB4QTJGOCwgMHhBMkY5LCAweEEyRkEsIDB4QTJGQiwgMHhBMkZDLCAweEEyRkQsIDB4QTJGRSwgMHhBMkZGLAotICAgIDB4QTMwMCwgMHhBMzAxLCAweEEzMDIsIDB4QTMwMywgMHhBMzA0LCAweEEzMDUsIDB4QTMwNiwgMHhBMzA3LAotICAgIDB4QTMwOCwgMHhBMzA5LCAweEEzMEEsIDB4QTMwQiwgMHhBMzBDLCAweEEzMEQsIDB4QTMwRSwgMHhBMzBGLAotICAgIDB4QTMxMCwgMHhBMzExLCAweEEzMTIsIDB4QTMxMywgMHhBMzE0LCAweEEzMTUsIDB4QTMxNiwgMHhBMzE3LAotICAgIDB4QTMxOCwgMHhBMzE5LCAweEEzMUEsIDB4QTMxQiwgMHhBMzFDLCAweEEzMUQsIDB4QTMxRSwgMHhBMzFGLAotICAgIDB4QTMyMCwgMHhBMzIxLCAweEEzMjIsIDB4QTMyMywgMHhBMzI0LCAweEEzMjUsIDB4QTMyNiwgMHhBMzI3LAotICAgIDB4QTMyOCwgMHhBMzI5LCAweEEzMkEsIDB4QTMyQiwgMHhBMzJDLCAweEEzMkQsIDB4QTMyRSwgMHhBMzJGLAotICAgIDB4QTMzMCwgMHhBMzMxLCAweEEzMzIsIDB4QTMzMywgMHhBMzM0LCAweEEzMzUsIDB4QTMzNiwgMHhBMzM3LAotICAgIDB4QTMzOCwgMHhBMzM5LCAweEEzM0EsIDB4QTMzQiwgMHhBMzNDLCAweEEzM0QsIDB4QTMzRSwgMHhBMzNGLAotICAgIDB4QTM0MCwgMHhBMzQxLCAweEEzNDIsIDB4QTM0MywgMHhBMzQ0LCAweEEzNDUsIDB4QTM0NiwgMHhBMzQ3LAotICAgIDB4QTM0OCwgMHhBMzQ5LCAweEEzNEEsIDB4QTM0QiwgMHhBMzRDLCAweEEzNEQsIDB4QTM0RSwgMHhBMzRGLAotICAgIDB4QTM1MCwgMHhBMzUxLCAweEEzNTIsIDB4QTM1MywgMHhBMzU0LCAweEEzNTUsIDB4QTM1NiwgMHhBMzU3LAotICAgIDB4QTM1OCwgMHhBMzU5LCAweEEzNUEsIDB4QTM1QiwgMHhBMzVDLCAweEEzNUQsIDB4QTM1RSwgMHhBMzVGLAotICAgIDB4QTM2MCwgMHhBMzYxLCAweEEzNjIsIDB4QTM2MywgMHhBMzY0LCAweEEzNjUsIDB4QTM2NiwgMHhBMzY3LAotICAgIDB4QTM2OCwgMHhBMzY5LCAweEEzNkEsIDB4QTM2QiwgMHhBMzZDLCAweEEzNkQsIDB4QTM2RSwgMHhBMzZGLAotICAgIDB4QTM3MCwgMHhBMzcxLCAweEEzNzIsIDB4QTM3MywgMHhBMzc0LCAweEEzNzUsIDB4QTM3NiwgMHhBMzc3LAotICAgIDB4QTM3OCwgMHhBMzc5LCAweEEzN0EsIDB4QTM3QiwgMHhBMzdDLCAweEEzN0QsIDB4QTM3RSwgMHhBMzdGLAotICAgIDB4QTM4MCwgMHhBMzgxLCAweEEzODIsIDB4QTM4MywgMHhBMzg0LCAweEEzODUsIDB4QTM4NiwgMHhBMzg3LAotICAgIDB4QTM4OCwgMHhBMzg5LCAweEEzOEEsIDB4QTM4QiwgMHhBMzhDLCAweEEzOEQsIDB4QTM4RSwgMHhBMzhGLAotICAgIDB4QTM5MCwgMHhBMzkxLCAweEEzOTIsIDB4QTM5MywgMHhBMzk0LCAweEEzOTUsIDB4QTM5NiwgMHhBMzk3LAotICAgIDB4QTM5OCwgMHhBMzk5LCAweEEzOUEsIDB4QTM5QiwgMHhBMzlDLCAweEEzOUQsIDB4QTM5RSwgMHhBMzlGLAotICAgIDB4QTNBMCwgMHhBM0ExLCAweEEzQTIsIDB4QTNBMywgMHhBM0E0LCAweEEzQTUsIDB4QTNBNiwgMHhBM0E3LAotICAgIDB4QTNBOCwgMHhBM0E5LCAweEEzQUEsIDB4QTNBQiwgMHhBM0FDLCAweEEzQUQsIDB4QTNBRSwgMHhBM0FGLAotICAgIDB4QTNCMCwgMHhBM0IxLCAweEEzQjIsIDB4QTNCMywgMHhBM0I0LCAweEEzQjUsIDB4QTNCNiwgMHhBM0I3LAotICAgIDB4QTNCOCwgMHhBM0I5LCAweEEzQkEsIDB4QTNCQiwgMHhBM0JDLCAweEEzQkQsIDB4QTNCRSwgMHhBM0JGLAotICAgIDB4QTNDMCwgMHhBM0MxLCAweEEzQzIsIDB4QTNDMywgMHhBM0M0LCAweEEzQzUsIDB4QTNDNiwgMHhBM0M3LAotICAgIDB4QTNDOCwgMHhBM0M5LCAweEEzQ0EsIDB4QTNDQiwgMHhBM0NDLCAweEEzQ0QsIDB4QTNDRSwgMHhBM0NGLAotICAgIDB4QTNEMCwgMHhBM0QxLCAweEEzRDIsIDB4QTNEMywgMHhBM0Q0LCAweEEzRDUsIDB4QTNENiwgMHhBM0Q3LAotICAgIDB4QTNEOCwgMHhBM0Q5LCAweEEzREEsIDB4QTNEQiwgMHhBM0RDLCAweEEzREQsIDB4QTNERSwgMHhBM0RGLAotICAgIDB4QTNFMCwgMHhBM0UxLCAweEEzRTIsIDB4QTNFMywgMHhBM0U0LCAweEEzRTUsIDB4QTNFNiwgMHhBM0U3LAotICAgIDB4QTNFOCwgMHhBM0U5LCAweEEzRUEsIDB4QTNFQiwgMHhBM0VDLCAweEEzRUQsIDB4QTNFRSwgMHhBM0VGLAotICAgIDB4QTNGMCwgMHhBM0YxLCAweEEzRjIsIDB4QTNGMywgMHhBM0Y0LCAweEEzRjUsIDB4QTNGNiwgMHhBM0Y3LAotICAgIDB4QTNGOCwgMHhBM0Y5LCAweEEzRkEsIDB4QTNGQiwgMHhBM0ZDLCAweEEzRkQsIDB4QTNGRSwgMHhBM0ZGLAotICAgIDB4QTQwMCwgMHhBNDAxLCAweEE0MDIsIDB4QTQwMywgMHhBNDA0LCAweEE0MDUsIDB4QTQwNiwgMHhBNDA3LAotICAgIDB4QTQwOCwgMHhBNDA5LCAweEE0MEEsIDB4QTQwQiwgMHhBNDBDLCAweEE0MEQsIDB4QTQwRSwgMHhBNDBGLAotICAgIDB4QTQxMCwgMHhBNDExLCAweEE0MTIsIDB4QTQxMywgMHhBNDE0LCAweEE0MTUsIDB4QTQxNiwgMHhBNDE3LAotICAgIDB4QTQxOCwgMHhBNDE5LCAweEE0MUEsIDB4QTQxQiwgMHhBNDFDLCAweEE0MUQsIDB4QTQxRSwgMHhBNDFGLAotICAgIDB4QTQyMCwgMHhBNDIxLCAweEE0MjIsIDB4QTQyMywgMHhBNDI0LCAweEE0MjUsIDB4QTQyNiwgMHhBNDI3LAotICAgIDB4QTQyOCwgMHhBNDI5LCAweEE0MkEsIDB4QTQyQiwgMHhBNDJDLCAweEE0MkQsIDB4QTQyRSwgMHhBNDJGLAotICAgIDB4QTQzMCwgMHhBNDMxLCAweEE0MzIsIDB4QTQzMywgMHhBNDM0LCAweEE0MzUsIDB4QTQzNiwgMHhBNDM3LAotICAgIDB4QTQzOCwgMHhBNDM5LCAweEE0M0EsIDB4QTQzQiwgMHhBNDNDLCAweEE0M0QsIDB4QTQzRSwgMHhBNDNGLAotICAgIDB4QTQ0MCwgMHhBNDQxLCAweEE0NDIsIDB4QTQ0MywgMHhBNDQ0LCAweEE0NDUsIDB4QTQ0NiwgMHhBNDQ3LAotICAgIDB4QTQ0OCwgMHhBNDQ5LCAweEE0NEEsIDB4QTQ0QiwgMHhBNDRDLCAweEE0NEQsIDB4QTQ0RSwgMHhBNDRGLAotICAgIDB4QTQ1MCwgMHhBNDUxLCAweEE0NTIsIDB4QTQ1MywgMHhBNDU0LCAweEE0NTUsIDB4QTQ1NiwgMHhBNDU3LAotICAgIDB4QTQ1OCwgMHhBNDU5LCAweEE0NUEsIDB4QTQ1QiwgMHhBNDVDLCAweEE0NUQsIDB4QTQ1RSwgMHhBNDVGLAotICAgIDB4QTQ2MCwgMHhBNDYxLCAweEE0NjIsIDB4QTQ2MywgMHhBNDY0LCAweEE0NjUsIDB4QTQ2NiwgMHhBNDY3LAotICAgIDB4QTQ2OCwgMHhBNDY5LCAweEE0NkEsIDB4QTQ2QiwgMHhBNDZDLCAweEE0NkQsIDB4QTQ2RSwgMHhBNDZGLAotICAgIDB4QTQ3MCwgMHhBNDcxLCAweEE0NzIsIDB4QTQ3MywgMHhBNDc0LCAweEE0NzUsIDB4QTQ3NiwgMHhBNDc3LAotICAgIDB4QTQ3OCwgMHhBNDc5LCAweEE0N0EsIDB4QTQ3QiwgMHhBNDdDLCAweEE0N0QsIDB4QTQ3RSwgMHhBNDdGLAotICAgIDB4QTQ4MCwgMHhBNDgxLCAweEE0ODIsIDB4QTQ4MywgMHhBNDg0LCAweEE0ODUsIDB4QTQ4NiwgMHhBNDg3LAotICAgIDB4QTQ4OCwgMHhBNDg5LCAweEE0OEEsIDB4QTQ4QiwgMHhBNDhDLCAweEE0OTAsIDB4QTQ5MSwgMHhBNDkyLAotICAgIDB4QTQ5MywgMHhBNDk0LCAweEE0OTUsIDB4QTQ5NiwgMHhBNDk3LCAweEE0OTgsIDB4QTQ5OSwgMHhBNDlBLAotICAgIDB4QTQ5QiwgMHhBNDlDLCAweEE0OUQsIDB4QTQ5RSwgMHhBNDlGLCAweEE0QTAsIDB4QTRBMSwgMHhBNEEyLAotICAgIDB4QTRBMywgMHhBNEE0LCAweEE0QTUsIDB4QTRBNiwgMHhBNEE3LCAweEE0QTgsIDB4QTRBOSwgMHhBNEFBLAotICAgIDB4QTRBQiwgMHhBNEFDLCAweEE0QUQsIDB4QTRBRSwgMHhBNEFGLCAweEE0QjAsIDB4QTRCMSwgMHhBNEIyLAotICAgIDB4QTRCMywgMHhBNEI0LCAweEE0QjUsIDB4QTRCNiwgMHhBNEI3LCAweEE0QjgsIDB4QTRCOSwgMHhBNEJBLAotICAgIDB4QTRCQiwgMHhBNEJDLCAweEE0QkQsIDB4QTRCRSwgMHhBNEJGLCAweEE0QzAsIDB4QTRDMSwgMHhBNEMyLAotICAgIDB4QTRDMywgMHhBNEM0LCAweEE0QzUsIDB4QTRDNiwKKyNpbmNsdWRlICJjbWFwc19nYjEuaCIKKworY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9HQjFDSUQyVW5pY29kZV81WzMwMjg0XSA9IHsKKyAgICAweEZGRkQsIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorICAgIDB4MDAyOCwgMHgwMDI5LCAweDAwMkEsIDB4MDAyQiwgMHgwMDJDLCAweDAwMkQsIDB4MDAyRSwgMHgwMDJGLCAweDAwMzAsCisgICAgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwKKyAgICAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLCAweDAwM0QsIDB4MDAzRSwgMHgwMDNGLCAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLAorICAgIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LCAweDAwNDgsIDB4MDA0OSwgMHgwMDRBLCAweDAwNEIsCisgICAgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLCAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwKKyAgICAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwgMHgwMDVBLCAweDAwNUIsIDB4MDA1QywgMHgwMDVELAorICAgIDB4MDA1RSwgMHgwMDVGLCAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsCisgICAgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywgMHgwMDZELCAweDAwNkUsIDB4MDA2RiwKKyAgICAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywgMHgwMDc4LAorICAgIDB4MDA3OSwgMHgwMDdBLCAweDAwN0IsIDB4MDA3QywgMHgwMDdELCAweDAwN0UsIDB4MzAwMCwgMHgzMDAxLCAweDMwMDIsCisgICAgMHgwMEI3LCAweDAyQzksIDB4MDJDNywgMHgwMEE4LCAweDMwMDMsIDB4MzAwNSwgMHgyMDE0LCAweEZGNUUsIDB4MjAxNiwKKyAgICAweDIwMjYsIDB4MjAxOCwgMHgyMDE5LCAweDIwMUMsIDB4MjAxRCwgMHgzMDE0LCAweDMwMTUsIDB4MzAwOCwgMHgzMDA5LAorICAgIDB4MzAwQSwgMHgzMDBCLCAweDMwMEMsIDB4MzAwRCwgMHgzMDBFLCAweDMwMEYsIDB4MzAxNiwgMHgzMDE3LCAweDMwMTAsCisgICAgMHgzMDExLCAweDAwQjEsIDB4MDBENywgMHgwMEY3LCAweDIyMzYsIDB4MjIyNywgMHgyMjI4LCAweDIyMTEsIDB4MjIwRiwKKyAgICAweDIyMkEsIDB4MjIyOSwgMHgyMjA4LCAweDIyMzcsIDB4MjIxQSwgMHgyMkE1LCAweDIyMjUsIDB4MjIyMCwgMHgyMzEyLAorICAgIDB4MjI5OSwgMHgyMjJCLCAweDIyMkUsIDB4MjI2MSwgMHgyMjRDLCAweDIyNDgsIDB4MjIzRCwgMHgyMjFELCAweDIyNjAsCisgICAgMHgyMjZFLCAweDIyNkYsIDB4MjI2NCwgMHgyMjY1LCAweDIyMUUsIDB4MjIzNSwgMHgyMjM0LCAweDI2NDIsIDB4MjY0MCwKKyAgICAweDAwQjAsIDB4MjAzMiwgMHgyMDMzLCAweDIxMDMsIDB4RkYwNCwgMHgwMEE0LCAweEZGRTAsIDB4RkZFMSwgMHgyMDMwLAorICAgIDB4MDBBNywgMHgyMTE2LCAweDI2MDYsIDB4MjYwNSwgMHgyNUNCLCAweDI1Q0YsIDB4MjVDRSwgMHgyNUM3LCAweDI1QzYsCisgICAgMHgyNUExLCAweDI1QTAsIDB4MjVCMywgMHgyNUIyLCAweDIwM0IsIDB4MjE5MiwgMHgyMTkwLCAweDIxOTEsIDB4MjE5MywKKyAgICAweDMwMTMsIDB4MjQ4OCwgMHgyNDg5LCAweDI0OEEsIDB4MjQ4QiwgMHgyNDhDLCAweDI0OEQsIDB4MjQ4RSwgMHgyNDhGLAorICAgIDB4MjQ5MCwgMHgyNDkxLCAweDI0OTIsIDB4MjQ5MywgMHgyNDk0LCAweDI0OTUsIDB4MjQ5NiwgMHgyNDk3LCAweDI0OTgsCisgICAgMHgyNDk5LCAweDI0OUEsIDB4MjQ5QiwgMHgyNDc0LCAweDI0NzUsIDB4MjQ3NiwgMHgyNDc3LCAweDI0NzgsIDB4MjQ3OSwKKyAgICAweDI0N0EsIDB4MjQ3QiwgMHgyNDdDLCAweDI0N0QsIDB4MjQ3RSwgMHgyNDdGLCAweDI0ODAsIDB4MjQ4MSwgMHgyNDgyLAorICAgIDB4MjQ4MywgMHgyNDg0LCAweDI0ODUsIDB4MjQ4NiwgMHgyNDg3LCAweDI0NjAsIDB4MjQ2MSwgMHgyNDYyLCAweDI0NjMsCisgICAgMHgyNDY0LCAweDI0NjUsIDB4MjQ2NiwgMHgyNDY3LCAweDI0NjgsIDB4MjQ2OSwgMHgzMjIwLCAweDMyMjEsIDB4MzIyMiwKKyAgICAweDMyMjMsIDB4MzIyNCwgMHgzMjI1LCAweDMyMjYsIDB4MzIyNywgMHgzMjI4LCAweDMyMjksIDB4MjE2MCwgMHgyMTYxLAorICAgIDB4MjE2MiwgMHgyMTYzLCAweDIxNjQsIDB4MjE2NSwgMHgyMTY2LCAweDIxNjcsIDB4MjE2OCwgMHgyMTY5LCAweDIxNkEsCisgICAgMHgyMTZCLCAweEZGMDEsIDB4RkYwMiwgMHhGRjAzLCAweEZGRTUsIDB4RkYwNSwgMHhGRjA2LCAweEZGMDcsIDB4RkYwOCwKKyAgICAweEZGMDksIDB4RkYwQSwgMHhGRjBCLCAweEZGMEMsIDB4RkYwRCwgMHhGRjBFLCAweEZGMEYsIDB4RkYxMCwgMHhGRjExLAorICAgIDB4RkYxMiwgMHhGRjEzLCAweEZGMTQsIDB4RkYxNSwgMHhGRjE2LCAweEZGMTcsIDB4RkYxOCwgMHhGRjE5LCAweEZGMUEsCisgICAgMHhGRjFCLCAweEZGMUMsIDB4RkYxRCwgMHhGRjFFLCAweEZGMUYsIDB4RkYyMCwgMHhGRjIxLCAweEZGMjIsIDB4RkYyMywKKyAgICAweEZGMjQsIDB4RkYyNSwgMHhGRjI2LCAweEZGMjcsIDB4RkYyOCwgMHhGRjI5LCAweEZGMkEsIDB4RkYyQiwgMHhGRjJDLAorICAgIDB4RkYyRCwgMHhGRjJFLCAweEZGMkYsIDB4RkYzMCwgMHhGRjMxLCAweEZGMzIsIDB4RkYzMywgMHhGRjM0LCAweEZGMzUsCisgICAgMHhGRjM2LCAweEZGMzcsIDB4RkYzOCwgMHhGRjM5LCAweEZGM0EsIDB4RkYzQiwgMHhGRjNDLCAweEZGM0QsIDB4RkYzRSwKKyAgICAweEZGM0YsIDB4RkY0MCwgMHhGRjQxLCAweEZGNDIsIDB4RkY0MywgMHhGRjQ0LCAweEZGNDUsIDB4RkY0NiwgMHhGRjQ3LAorICAgIDB4RkY0OCwgMHhGRjQ5LCAweEZGNEEsIDB4RkY0QiwgMHhGRjRDLCAweEZGNEQsIDB4RkY0RSwgMHhGRjRGLCAweEZGNTAsCisgICAgMHhGRjUxLCAweEZGNTIsIDB4RkY1MywgMHhGRjU0LCAweEZGNTUsIDB4RkY1NiwgMHhGRjU3LCAweEZGNTgsIDB4RkY1OSwKKyAgICAweEZGNUEsIDB4RkY1QiwgMHhGRjVDLCAweEZGNUQsIDB4RkZFMywgMHgzMDQxLCAweDMwNDIsIDB4MzA0MywgMHgzMDQ0LAorICAgIDB4MzA0NSwgMHgzMDQ2LCAweDMwNDcsIDB4MzA0OCwgMHgzMDQ5LCAweDMwNEEsIDB4MzA0QiwgMHgzMDRDLCAweDMwNEQsCisgICAgMHgzMDRFLCAweDMwNEYsIDB4MzA1MCwgMHgzMDUxLCAweDMwNTIsIDB4MzA1MywgMHgzMDU0LCAweDMwNTUsIDB4MzA1NiwKKyAgICAweDMwNTcsIDB4MzA1OCwgMHgzMDU5LCAweDMwNUEsIDB4MzA1QiwgMHgzMDVDLCAweDMwNUQsIDB4MzA1RSwgMHgzMDVGLAorICAgIDB4MzA2MCwgMHgzMDYxLCAweDMwNjIsIDB4MzA2MywgMHgzMDY0LCAweDMwNjUsIDB4MzA2NiwgMHgzMDY3LCAweDMwNjgsCisgICAgMHgzMDY5LCAweDMwNkEsIDB4MzA2QiwgMHgzMDZDLCAweDMwNkQsIDB4MzA2RSwgMHgzMDZGLCAweDMwNzAsIDB4MzA3MSwKKyAgICAweDMwNzIsIDB4MzA3MywgMHgzMDc0LCAweDMwNzUsIDB4MzA3NiwgMHgzMDc3LCAweDMwNzgsIDB4MzA3OSwgMHgzMDdBLAorICAgIDB4MzA3QiwgMHgzMDdDLCAweDMwN0QsIDB4MzA3RSwgMHgzMDdGLCAweDMwODAsIDB4MzA4MSwgMHgzMDgyLCAweDMwODMsCisgICAgMHgzMDg0LCAweDMwODUsIDB4MzA4NiwgMHgzMDg3LCAweDMwODgsIDB4MzA4OSwgMHgzMDhBLCAweDMwOEIsIDB4MzA4QywKKyAgICAweDMwOEQsIDB4MzA4RSwgMHgzMDhGLCAweDMwOTAsIDB4MzA5MSwgMHgzMDkyLCAweDMwOTMsIDB4MzBBMSwgMHgzMEEyLAorICAgIDB4MzBBMywgMHgzMEE0LCAweDMwQTUsIDB4MzBBNiwgMHgzMEE3LCAweDMwQTgsIDB4MzBBOSwgMHgzMEFBLCAweDMwQUIsCisgICAgMHgzMEFDLCAweDMwQUQsIDB4MzBBRSwgMHgzMEFGLCAweDMwQjAsIDB4MzBCMSwgMHgzMEIyLCAweDMwQjMsIDB4MzBCNCwKKyAgICAweDMwQjUsIDB4MzBCNiwgMHgzMEI3LCAweDMwQjgsIDB4MzBCOSwgMHgzMEJBLCAweDMwQkIsIDB4MzBCQywgMHgzMEJELAorICAgIDB4MzBCRSwgMHgzMEJGLCAweDMwQzAsIDB4MzBDMSwgMHgzMEMyLCAweDMwQzMsIDB4MzBDNCwgMHgzMEM1LCAweDMwQzYsCisgICAgMHgzMEM3LCAweDMwQzgsIDB4MzBDOSwgMHgzMENBLCAweDMwQ0IsIDB4MzBDQywgMHgzMENELCAweDMwQ0UsIDB4MzBDRiwKKyAgICAweDMwRDAsIDB4MzBEMSwgMHgzMEQyLCAweDMwRDMsIDB4MzBENCwgMHgzMEQ1LCAweDMwRDYsIDB4MzBENywgMHgzMEQ4LAorICAgIDB4MzBEOSwgMHgzMERBLCAweDMwREIsIDB4MzBEQywgMHgzMERELCAweDMwREUsIDB4MzBERiwgMHgzMEUwLCAweDMwRTEsCisgICAgMHgzMEUyLCAweDMwRTMsIDB4MzBFNCwgMHgzMEU1LCAweDMwRTYsIDB4MzBFNywgMHgzMEU4LCAweDMwRTksIDB4MzBFQSwKKyAgICAweDMwRUIsIDB4MzBFQywgMHgzMEVELCAweDMwRUUsIDB4MzBFRiwgMHgzMEYwLCAweDMwRjEsIDB4MzBGMiwgMHgzMEYzLAorICAgIDB4MzBGNCwgMHgzMEY1LCAweDMwRjYsIDB4MDM5MSwgMHgwMzkyLCAweDAzOTMsIDB4MDM5NCwgMHgwMzk1LCAweDAzOTYsCisgICAgMHgwMzk3LCAweDAzOTgsIDB4MDM5OSwgMHgwMzlBLCAweDAzOUIsIDB4MDM5QywgMHgwMzlELCAweDAzOUUsIDB4MDM5RiwKKyAgICAweDAzQTAsIDB4MDNBMSwgMHgwM0EzLCAweDAzQTQsIDB4MDNBNSwgMHgwM0E2LCAweDAzQTcsIDB4MDNBOCwgMHgwM0E5LAorICAgIDB4MDNCMSwgMHgwM0IyLCAweDAzQjMsIDB4MDNCNCwgMHgwM0I1LCAweDAzQjYsIDB4MDNCNywgMHgwM0I4LCAweDAzQjksCisgICAgMHgwM0JBLCAweDAzQkIsIDB4MDNCQywgMHgwM0JELCAweDAzQkUsIDB4MDNCRiwgMHgwM0MwLCAweDAzQzEsIDB4MDNDMywKKyAgICAweDAzQzQsIDB4MDNDNSwgMHgwM0M2LCAweDAzQzcsIDB4MDNDOCwgMHgwM0M5LCAweEZGMEMsIDB4MzAwMiwgMHgzMDAxLAorICAgIDB4RkYxQSwgMHhGRjFCLCAweEZGMDEsIDB4RkYxRiwgMHhGRTM1LCAweEZFMzYsIDB4RkUzOSwgMHhGRTNBLCAweEZFM0YsCisgICAgMHhGRTQwLCAweEZFM0QsIDB4RkUzRSwgMHhGRTQxLCAweEZFNDIsIDB4RkU0MywgMHhGRTQ0LCAweDMwMTYsIDB4MzAxNywKKyAgICAweEZFM0IsIDB4RkUzQywgMHhGRTM3LCAweEZFMzgsIDB4RkUzMSwgMHgyMDI2LCAweEZFMzMsIDB4RkUzNCwgMHgwNDEwLAorICAgIDB4MDQxMSwgMHgwNDEyLCAweDA0MTMsIDB4MDQxNCwgMHgwNDE1LCAweDA0MDEsIDB4MDQxNiwgMHgwNDE3LCAweDA0MTgsCisgICAgMHgwNDE5LCAweDA0MUEsIDB4MDQxQiwgMHgwNDFDLCAweDA0MUQsIDB4MDQxRSwgMHgwNDFGLCAweDA0MjAsIDB4MDQyMSwKKyAgICAweDA0MjIsIDB4MDQyMywgMHgwNDI0LCAweDA0MjUsIDB4MDQyNiwgMHgwNDI3LCAweDA0MjgsIDB4MDQyOSwgMHgwNDJBLAorICAgIDB4MDQyQiwgMHgwNDJDLCAweDA0MkQsIDB4MDQyRSwgMHgwNDJGLCAweDA0MzAsIDB4MDQzMSwgMHgwNDMyLCAweDA0MzMsCisgICAgMHgwNDM0LCAweDA0MzUsIDB4MDQ1MSwgMHgwNDM2LCAweDA0MzcsIDB4MDQzOCwgMHgwNDM5LCAweDA0M0EsIDB4MDQzQiwKKyAgICAweDA0M0MsIDB4MDQzRCwgMHgwNDNFLCAweDA0M0YsIDB4MDQ0MCwgMHgwNDQxLCAweDA0NDIsIDB4MDQ0MywgMHgwNDQ0LAorICAgIDB4MDQ0NSwgMHgwNDQ2LCAweDA0NDcsIDB4MDQ0OCwgMHgwNDQ5LCAweDA0NEEsIDB4MDQ0QiwgMHgwNDRDLCAweDA0NEQsCisgICAgMHgwNDRFLCAweDA0NEYsIDB4MDEwMSwgMHgwMEUxLCAweDAxQ0UsIDB4MDBFMCwgMHgwMTEzLCAweDAwRTksIDB4MDExQiwKKyAgICAweDAwRTgsIDB4MDEyQiwgMHgwMEVELCAweDAxRDAsIDB4MDBFQywgMHgwMTRELCAweDAwRjMsIDB4MDFEMiwgMHgwMEYyLAorICAgIDB4MDE2QiwgMHgwMEZBLCAweDAxRDQsIDB4MDBGOSwgMHgwMUQ2LCAweDAxRDgsIDB4MDFEQSwgMHgwMURDLCAweDAwRkMsCisgICAgMHgwMEVBLCAweDAyNTEsIDB4MUUzRiwgMHgwMTQ0LCAweDAxNDgsIDB4MDFGOSwgMHgwMjYxLCAweDMxMDUsIDB4MzEwNiwKKyAgICAweDMxMDcsIDB4MzEwOCwgMHgzMTA5LCAweDMxMEEsIDB4MzEwQiwgMHgzMTBDLCAweDMxMEQsIDB4MzEwRSwgMHgzMTBGLAorICAgIDB4MzExMCwgMHgzMTExLCAweDMxMTIsIDB4MzExMywgMHgzMTE0LCAweDMxMTUsIDB4MzExNiwgMHgzMTE3LCAweDMxMTgsCisgICAgMHgzMTE5LCAweDMxMUEsIDB4MzExQiwgMHgzMTFDLCAweDMxMUQsIDB4MzExRSwgMHgzMTFGLCAweDMxMjAsIDB4MzEyMSwKKyAgICAweDMxMjIsIDB4MzEyMywgMHgzMTI0LCAweDMxMjUsIDB4MzEyNiwgMHgzMTI3LCAweDMxMjgsIDB4MzEyOSwgMHhFN0NELAorICAgIDB4MjUwMCwgMHgyNTAxLCAweDI1MDIsIDB4MjUwMywgMHgyNTA0LCAweDI1MDUsIDB4MjUwNiwgMHgyNTA3LCAweDI1MDgsCisgICAgMHgyNTA5LCAweDI1MEEsIDB4MjUwQiwgMHgyNTBDLCAweDI1MEQsIDB4MjUwRSwgMHgyNTBGLCAweDI1MTAsIDB4MjUxMSwKKyAgICAweDI1MTIsIDB4MjUxMywgMHgyNTE0LCAweDI1MTUsIDB4MjUxNiwgMHgyNTE3LCAweDI1MTgsIDB4MjUxOSwgMHgyNTFBLAorICAgIDB4MjUxQiwgMHgyNTFDLCAweDI1MUQsIDB4MjUxRSwgMHgyNTFGLCAweDI1MjAsIDB4MjUyMSwgMHgyNTIyLCAweDI1MjMsCisgICAgMHgyNTI0LCAweDI1MjUsIDB4MjUyNiwgMHgyNTI3LCAweDI1MjgsIDB4MjUyOSwgMHgyNTJBLCAweDI1MkIsIDB4MjUyQywKKyAgICAweDI1MkQsIDB4MjUyRSwgMHgyNTJGLCAweDI1MzAsIDB4MjUzMSwgMHgyNTMyLCAweDI1MzMsIDB4MjUzNCwgMHgyNTM1LAorICAgIDB4MjUzNiwgMHgyNTM3LCAweDI1MzgsIDB4MjUzOSwgMHgyNTNBLCAweDI1M0IsIDB4MjUzQywgMHgyNTNELCAweDI1M0UsCisgICAgMHgyNTNGLCAweDI1NDAsIDB4MjU0MSwgMHgyNTQyLCAweDI1NDMsIDB4MjU0NCwgMHgyNTQ1LCAweDI1NDYsIDB4MjU0NywKKyAgICAweDI1NDgsIDB4MjU0OSwgMHgyNTRBLCAweDI1NEIsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LAorICAgIDB4MDAyNiwgMHgwMDI3LCAweDAwMjgsIDB4MDAyOSwgMHgwMDJBLCAweDAwMkIsIDB4MDAyQywgMHgwMDJELCAweDAwMkUsCisgICAgMHgwMDJGLCAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKyAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDNBLCAweDAwM0IsIDB4MDAzQywgMHgwMDNELCAweDAwM0UsIDB4MDAzRiwgMHgwMDQwLAorICAgIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksCisgICAgMHgwMDRBLCAweDAwNEIsIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwKKyAgICAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgwMDVCLAorICAgIDB4MDA1QywgMHgwMDVELCAweDAwNUUsIDB4MDA1RiwgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsCisgICAgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwKKyAgICAweDAwNkUsIDB4MDA2RiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LAorICAgIDB4MDA3NywgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDdCLCAweDAwN0MsIDB4MDA3RCwgMHgwMDdFLCAweDAxMDEsCisgICAgMHgwMEUxLCAweDAxQ0UsIDB4MDBFMCwgMHgwMTEzLCAweDAwRTksIDB4MDExQiwgMHgwMEU4LCAweDAxMkIsIDB4MDBFRCwKKyAgICAweDAxRDAsIDB4MDBFQywgMHgwMTRELCAweDAwRjMsIDB4MDFEMiwgMHgwMEYyLCAweDAxNkIsIDB4MDBGQSwgMHgwMUQ0LAorICAgIDB4MDBGOSwgMHgwMUQ2LCAweDAxRDgsIDB4MDFEQSwgMHgwMURDLCAweDAwRkMsIDB4MDBFQSwgMHgwMjUxLCAweDFFM0YsCisgICAgMHgwMTQ0LCAweDAxNDgsIDB4MDFGOSwgMHgwMjYxLCAweDU1NEEsIDB4OTYzRiwgMHg1N0MzLCAweDYzMjgsIDB4NTRDRSwKKyAgICAweDU1MDksIDB4NTRDMCwgMHg3NjkxLCAweDc2NEMsIDB4ODUzQywgMHg3N0VFLCAweDgyN0UsIDB4Nzg4RCwgMHg3MjMxLAorICAgIDB4OTY5OCwgMHg5NzhELCAweDZDMjgsIDB4NUI4OSwgMHg0RkZBLCAweDYzMDksIDB4NjY5NywgMHg1Q0I4LCAweDgwRkEsCisgICAgMHg2ODQ4LCAweDgwQUUsIDB4NjYwMiwgMHg3NkNFLCAweDUxRjksIDB4NjU1NiwgMHg3MUFDLCAweDdGRjEsIDB4ODg4NCwKKyAgICAweDUwQjIsIDB4NTk2NSwgMHg2MUNBLCAweDZGQjMsIDB4ODJBRCwgMHg2MzRDLCAweDYyNTIsIDB4NTNFRCwgMHg1NDI3LAorICAgIDB4N0IwNiwgMHg1MTZCLCAweDc1QTQsIDB4NURGNCwgMHg2MkQ0LCAweDhEQ0IsIDB4OTc3NiwgMHg2MjhBLCAweDgwMTksCisgICAgMHg1NzVELCAweDk3MzgsIDB4N0Y2MiwgMHg3MjM4LCAweDc2N0QsIDB4NjdDRiwgMHg3NjdFLCAweDY0NDYsIDB4NEY3MCwKKyAgICAweDhEMjUsIDB4NjJEQywgMHg3QTE3LCAweDY1OTEsIDB4NzNFRCwgMHg2NDJDLCAweDYyNzMsIDB4ODIyQywgMHg5ODgxLAorICAgIDB4Njc3RiwgMHg3MjQ4LCAweDYyNkUsIDB4NjJDQywgMHg0RjM0LCAweDc0RTMsIDB4NTM0QSwgMHg1MjlFLCAweDdFQ0EsCisgICAgMHg5MEE2LCAweDVFMkUsIDB4Njg4NiwgMHg2OTlDLCAweDgxODAsIDB4N0VEMSwgMHg2OEQyLCAweDc4QzUsIDB4ODY4QywKKyAgICAweDk1NTEsIDB4NTA4RCwgMHg4QzI0LCAweDgyREUsIDB4ODBERSwgMHg1MzA1LCAweDg5MTIsIDB4NTI2NSwgMHg4NTg0LAorICAgIDB4OTZGOSwgMHg0RkRELCAweDU4MjEsIDB4OTk3MSwgMHg1QjlELCAweDYyQjEsIDB4NjJBNSwgMHg2NkI0LCAweDhDNzksCisgICAgMHg5QzhELCAweDcyMDYsIDB4Njc2RiwgMHg3ODkxLCAweDYwQjIsIDB4NTM1MSwgMHg1MzE3LCAweDhGODgsIDB4ODBDQywKKyAgICAweDhEMUQsIDB4OTRBMSwgMHg1MDBELCAweDcyQzgsIDB4NTkwNywgMHg2MEVCLCAweDcxMTksIDB4ODhBQiwgMHg1OTU0LAorICAgIDB4ODJFRiwgMHg2NzJDLCAweDdCMjgsIDB4NUQyOSwgMHg3RUY3LCAweDc1MkQsIDB4NkNGNSwgMHg4RTY2LCAweDhGRjgsCisgICAgMHg5MDNDLCAweDlGM0IsIDB4NkJENCwgMHg5MTE5LCAweDdCMTQsIDB4NUY3QywgMHg3OEE3LCAweDg0RDYsIDB4ODUzRCwKKyAgICAweDZCRDUsIDB4NkJEOSwgMHg2QkQ2LCAweDVFMDEsIDB4NUU4NywgMHg3NUY5LCAweDk1RUQsIDB4NjU1RCwgMHg1RjBBLAorICAgIDB4NUZDNSwgMHg4RjlGLCAweDU4QzEsIDB4ODFDMiwgMHg5MDdGLCAweDk2NUIsIDB4OTdBRCwgMHg4RkI5LCAweDdGMTYsCisgICAgMHg4RDJDLCAweDYyNDEsIDB4NEZCRiwgMHg1M0Q4LCAweDUzNUUsIDB4OEZBOCwgMHg4RkE5LCAweDhGQUIsIDB4OTA0RCwKKyAgICAweDY4MDcsIDB4NUY2QSwgMHg4MTk4LCAweDg4NjgsIDB4OUNENiwgMHg2MThCLCAweDUyMkIsIDB4NzYyQSwgMHg1RjZDLAorICAgIDB4NjU4QywgMHg2RkQyLCAweDZFRTgsIDB4NUJCRSwgMHg2NDQ4LCAweDUxNzUsIDB4NTFCMCwgMHg2N0M0LCAweDRFMTksCisgICAgMHg3OUM5LCAweDk5N0MsIDB4NzBCMywgMHg3NUM1LCAweDVFNzYsIDB4NzNCQiwgMHg4M0UwLCAweDY0QUQsIDB4NjJFOCwKKyAgICAweDk0QjUsIDB4NkNFMiwgMHg1MzVBLCAweDUyQzMsIDB4NjQwRiwgMHg5NEMyLCAweDdCOTQsIDB4NEYyRiwgMHg1RTFCLAorICAgIDB4ODIzNiwgMHg4MTE2LCAweDgxOEEsIDB4NkUyNCwgMHg2Q0NBLCAweDlBNzMsIDB4NjM1NSwgMHg1MzVDLCAweDU0RkEsCisgICAgMHg4ODY1LCAweDU3RTAsIDB4NEUwRCwgMHg1RTAzLCAweDZCNjUsIDB4N0MzRiwgMHg5MEU4LCAweDYwMTYsIDB4NjRFNiwKKyAgICAweDczMUMsIDB4ODhDMSwgMHg2NzUwLCAweDYyNEQsIDB4OEQyMiwgMHg3NzZDLCAweDhFMjksIDB4OTFDNywgMHg1RjY5LAorICAgIDB4ODNEQywgMHg4NTIxLCAweDk5MTAsIDB4NTNDMiwgMHg4Njk1LCAweDZCOEIsIDB4NjBFRCwgMHg2MEU4LCAweDcwN0YsCisgICAgMHg4MkNELCAweDgyMzEsIDB4NEVEMywgMHg2Q0E3LCAweDg1Q0YsIDB4NjRDRCwgMHg3Q0Q5LCAweDY5RkQsIDB4NjZGOSwKKyAgICAweDgzNDksIDB4NTM5NSwgMHg3QjU2LCAweDRGQTcsIDB4NTE4QywgMHg2RDRCLCAweDVDNDIsIDB4OEU2RCwgMHg2M0QyLAorICAgIDB4NTNDOSwgMHg4MzJDLCAweDgzMzYsIDB4NjdFNSwgMHg3OEI0LCAweDY0M0QsIDB4NUJERiwgMHg1Qzk0LCAweDVERUUsCisgICAgMHg4QkU3LCAweDYyQzYsIDB4NjdGNCwgMHg4QzdBLCAweDY0MDAsIDB4NjNCQSwgMHg4NzQ5LCAweDk5OEIsIDB4OEMxNywKKyAgICAweDdGMjAsIDB4OTRGMiwgMHg0RUE3LCAweDk2MTAsIDB4OThBNCwgMHg2NjBDLCAweDczMTYsIDB4NTczQSwgMHg1QzFELAorICAgIDB4NUUzOCwgMHg5NTdGLCAweDUwN0YsIDB4ODBBMCwgMHg1MzgyLCAweDY1NUUsIDB4NzU0NSwgMHg1NTMxLCAweDUwMjEsCisgICAgMHg4RDg1LCAweDYyODQsIDB4OTQ5RSwgMHg2NzFELCAweDU2MzIsIDB4NkY2RSwgMHg1REUyLCAweDU0MzUsIDB4NzA5MiwKKyAgICAweDhGNjYsIDB4NjI2RiwgMHg2NEE0LCAweDYzQTMsIDB4NUY3QiwgMHg2Rjg4LCAweDkwRjQsIDB4ODFFMywgMHg4RkIwLAorICAgIDB4NUMxOCwgMHg2NjY4LCAweDVGRjEsIDB4NkM4OSwgMHg5NjQ4LCAweDhEODEsIDB4ODg2QywgMHg2NDkxLCAweDc5RjAsCisgICAgMHg1N0NFLCAweDZBNTksIDB4NjIxMCwgMHg1NDQ4LCAweDRFNTgsIDB4N0EwQiwgMHg2MEU5LCAweDZGODQsIDB4OEJEQSwKKyAgICAweDYyN0YsIDB4OTAxRSwgMHg5QThCLCAweDc5RTQsIDB4NTQwMywgMHg3NUY0LCAweDYzMDEsIDB4NTMxOSwgMHg2QzYwLAorICAgIDB4OEZERiwgMHg1RjFCLCAweDlBNzAsIDB4ODAzQiwgMHg5RjdGLCAweDRGODgsIDB4NUMzQSwgMHg4RDY0LCAweDdGQzUsCisgICAgMHg2NUE1LCAweDcwQkQsIDB4NTE0NSwgMHg1MUIyLCAweDg2NkIsIDB4NUQwNywgMHg1QkEwLCAweDYyQkQsIDB4OTE2QywKKyAgICAweDc1NzQsIDB4OEUwQywgMHg3QTIwLCAweDYxMDEsIDB4N0I3OSwgMHg0RUM3LCAweDdFRjgsIDB4Nzc4NSwgMHg0RTExLAorICAgIDB4ODFFRCwgMHg1MjFELCAweDUxRkEsIDB4NkE3MSwgMHg1M0E4LCAweDhFODcsIDB4OTUwNCwgMHg5NkNGLCAweDZFQzEsCisgICAgMHg5NjY0LCAweDY5NUEsIDB4Nzg0MCwgMHg1MEE4LCAweDc3RDcsIDB4NjQxMCwgMHg4OUU2LCAweDU5MDQsIDB4NjNFMywKKyAgICAweDVEREQsIDB4N0E3RiwgMHg2OTNELCAweDRGMjAsIDB4ODIzOSwgMHg1NTk4LCAweDRFMzIsIDB4NzVBRSwgMHg3QTk3LAorICAgIDB4NUU2MiwgMHg1RThBLCAweDk1RUYsIDB4NTIxQiwgMHg1NDM5LCAweDcwOEEsIDB4NjM3NiwgMHg5NTI0LCAweDU3ODIsCisgICAgMHg2NjI1LCAweDY5M0YsIDB4OTE4NywgMHg1NTA3LCAweDZERjMsIDB4N0VBRiwgMHg4ODIyLCAweDYyMzMsIDB4N0VGMCwKKyAgICAweDc1QjUsIDB4ODMyOCwgMHg3OEMxLCAweDk2Q0MsIDB4OEY5RSwgMHg2MTQ4LCAweDc0RjcsIDB4OEJDRCwgMHg2QjY0LAorICAgIDB4NTIzQSwgMHg4RDUwLCAweDZCMjEsIDB4ODA2QSwgMHg4NDcxLCAweDU2RjEsIDB4NTMwNiwgMHg0RUNFLCAweDRFMUIsCisgICAgMHg1MUQxLCAweDdDOTcsIDB4OTE4QiwgMHg3QzA3LCAweDRGQzMsIDB4OEU3RiwgMHg3QkUxLCAweDdBOUMsIDB4NjQ2NywKKyAgICAweDVEMTQsIDB4NTBBQywgMHg4MTA2LCAweDc2MDEsIDB4N0NCOSwgMHg2REVDLCAweDdGRTAsIDB4Njc1MSwgMHg1QjU4LAorICAgIDB4NUJGOCwgMHg3OENCLCAweDY0QUUsIDB4NjQxMywgMHg2M0FBLCAweDYzMkIsIDB4OTUxOSwgMHg2NDJELCAweDhGQkUsCisgICAgMHg3QjU0LCAweDc2MjksIDB4NjI1MywgMHg1OTI3LCAweDU0NDYsIDB4NkI3OSwgMHg1MEEzLCAweDYyMzQsIDB4NUUyNiwKKyAgICAweDZCODYsIDB4NEVFMywgMHg4RDM3LCAweDg4OEIsIDB4NUY4NSwgMHg5MDJFLCAweDYwMjAsIDB4ODAzRCwgMHg2MkM1LAorICAgIDB4NEUzOSwgMHg1MzU1LCAweDkwRjgsIDB4NjNCOCwgMHg4MEM2LCAweDY1RTYsIDB4NkMyRSwgMHg0RjQ2LCAweDYwRUUsCisgICAgMHg2REUxLCAweDhCREUsIDB4NUYzOSwgMHg4NkNCLCAweDVGNTMsIDB4NjMyMSwgMHg1MTVBLCAweDgzNjEsIDB4Njg2MywKKyAgICAweDUyMDAsIDB4NjM2MywgMHg4RTQ4LCAweDUwMTIsIDB4NUM5QiwgMHg3OTc3LCAweDVCRkMsIDB4NTIzMCwgMHg3QTNCLAorICAgIDB4NjBCQywgMHg5MDUzLCAweDc2RDcsIDB4NUZCNywgMHg1Rjk3LCAweDc2ODQsIDB4OEU2QywgMHg3MDZGLCAweDc2N0IsCisgICAgMHg3QjQ5LCAweDc3QUEsIDB4NTFGMywgMHg5MDkzLCAweDU4MjQsIDB4NEY0RSwgMHg2RUY0LCAweDhGRUEsIDB4NjU0QywKKyAgICAweDdCMUIsIDB4NzJDNCwgMHg2REE0LCAweDdGREYsIDB4NUFFMSwgMHg2MkI1LCAweDVFOTUsIDB4NTczMCwgMHg4NDgyLAorICAgIDB4N0IyQywgMHg1RTFELCAweDVGMUYsIDB4OTAxMiwgMHg3RjE0LCAweDk4QTAsIDB4NjM4MiwgMHg2RUM3LCAweDc4OTgsCisgICAgMHg3MEI5LCAweDUxNzgsIDB4OTc1QiwgMHg1N0FCLCAweDc1MzUsIDB4NEY0MywgMHg3NTM4LCAweDVFOTcsIDB4NjBFNiwKKyAgICAweDU5NjAsIDB4NkRDMCwgMHg2QkJGLCAweDc4ODksIDB4NTNGQywgMHg5NkQ1LCAweDUxQ0IsIDB4NTIwMSwgMHg2Mzg5LAorICAgIDB4NTQwQSwgMHg5NDkzLCAweDhDMDMsIDB4OERDQywgMHg3MjM5LCAweDc4OUYsIDB4ODc3NiwgMHg4RkVELCAweDhDMEQsCisgICAgMHg1M0UwLCAweDRFMDEsIDB4NzZFRiwgMHg1M0VFLCAweDk0ODksIDB4OTg3NiwgMHg5RjBFLCAweDk1MkQsIDB4NUI5QSwKKyAgICAweDhCQTIsIDB4NEUyMiwgMHg0RTFDLCAweDUxQUMsIDB4ODQ2MywgMHg2MUMyLCAweDUyQTgsIDB4NjgwQiwgMHg0Rjk3LAorICAgIDB4NjA2QiwgMHg1MUJCLCAweDZEMUUsIDB4NTE1QywgMHg2Mjk2LCAweDY1OTcsIDB4OTY2MSwgMHg4QzQ2LCAweDkwMTcsCisgICAgMHg3NUQ4LCAweDkwRkQsIDB4Nzc2MywgMHg2QkQyLCAweDcyOEEsIDB4NzJFQywgMHg4QkZCLCAweDU4MzUsIDB4Nzc3OSwKKyAgICAweDhENEMsIDB4Njc1QywgMHg5NTQwLCAweDgwOUEsIDB4NUVBNiwgMHg2RTIxLCAweDU5OTIsIDB4N0FFRiwgMHg3N0VELAorICAgIDB4OTUzQiwgMHg2QkI1LCAweDY1QUQsIDB4N0YwRSwgMHg1ODA2LCAweDUxNTEsIDB4OTYxRiwgMHg1QkY5LCAweDU4QTksCisgICAgMHg1NDI4LCAweDhFNzIsIDB4NjU2NiwgMHg5ODdGLCAweDU2RTQsIDB4OTQ5RCwgMHg3NkZFLCAweDkwNDEsIDB4NjM4NywKKyAgICAweDU0QzYsIDB4NTkxQSwgMHg1OTNBLCAweDU3OUIsIDB4OEVCMiwgMHg2NzM1LCAweDhERkEsIDB4ODIzNSwgMHg1MjQxLAorICAgIDB4NjBGMCwgMHg1ODE1LCAweDg2RkUsIDB4NUNFOCwgMHg5RTQ1LCAweDRGQzQsIDB4OTg5RCwgMHg4QkI5LCAweDVBMjUsCisgICAgMHg2MDc2LCAweDUzODQsIDB4NjI3QywgMHg5MDRGLCAweDkxMDIsIDB4OTk3RiwgMHg2MDY5LCAweDgwMEMsIDB4NTEzRiwKKyAgICAweDgwMzMsIDB4NUMxNCwgMHg5OTc1LCAweDZEMzEsIDB4NEU4QywgMHg4RDMwLCAweDUzRDEsIDB4N0Y1QSwgMHg3QjRGLAorICAgIDB4NEYxMCwgMHg0RTRGLCAweDk2MDAsIDB4NkNENSwgMHg3M0QwLCAweDg1RTksIDB4NUUwNiwgMHg3NTZBLCAweDdGRkIsCisgICAgMHg2QTBBLCAweDc3RkUsIDB4OTQ5MiwgMHg3RTQxLCAweDUxRTEsIDB4NzBFNiwgMHg1M0NELCAweDhGRDQsIDB4ODMwMywKKyAgICAweDhEMjksIDB4NzJBRiwgMHg5OTZELCAweDZDREIsIDB4NTc0QSwgMHg4MkIzLCAweDY1QjksIDB4ODBBQSwgMHg2MjNGLAorICAgIDB4OTYzMiwgMHg1OUE4LCAweDRFRkYsIDB4OEJCRiwgMHg3RUJBLCAweDY1M0UsIDB4ODNGMiwgMHg5NzVFLCAweDU1NjEsCisgICAgMHg5OERFLCAweDgwQTUsIDB4NTMyQSwgMHg4QkZELCAweDU0MjAsIDB4ODBCQSwgMHg1RTlGLCAweDZDQjgsIDB4OEQzOSwKKyAgICAweDgyQUMsIDB4OTE1QSwgMHg1NDI5LCAweDZDMUIsIDB4NTIwNiwgMHg3RUI3LCAweDU3NUYsIDB4NzExQSwgMHg2QzdFLAorICAgIDB4N0M4OSwgMHg1OTRCLCAweDRFRkQsIDB4NUZGRiwgMHg2MTI0LCAweDdDQUEsIDB4NEUzMCwgMHg1QzAxLCAweDY3QUIsCisgICAgMHg4NzAyLCAweDVDRjAsIDB4OTUwQiwgMHg5OENFLCAweDc1QUYsIDB4NzBGRCwgMHg5MDIyLCAweDUxQUYsIDB4N0YxRCwKKyAgICAweDhCQkQsIDB4NTk0OSwgMHg1MUU0LCAweDRGNUIsIDB4NTQyNiwgMHg1OTJCLCAweDY1NzcsIDB4ODBBNCwgMHg1Qjc1LAorICAgIDB4NjI3NiwgMHg2MkMyLCAweDhGOTAsIDB4NUU0NSwgMHg2QzFGLCAweDdCMjYsIDB4NEYwRiwgMHg0RkQ4LCAweDY3MEQsCisgICAgMHg2RDZFLCAweDZEQUEsIDB4Nzk4RiwgMHg4OEIxLCAweDVGMTcsIDB4NzUyQiwgMHg2MjlBLCAweDhGODUsIDB4NEZFRiwKKyAgICAweDkxREMsIDB4NjVBNywgMHg4MTJGLCAweDgxNTEsIDB4NUU5QywgMHg4MTUwLCAweDhENzQsIDB4NTI2RiwgMHg4OTg2LAorICAgIDB4OEQ0QiwgMHg1OTBELCAweDUwODUsIDB4NEVEOCwgMHg5NjFDLCAweDcyMzYsIDB4ODE3OSwgMHg4RDFGLCAweDVCQ0MsCisgICAgMHg4QkEzLCAweDk2NDQsIDB4NTk4NywgMHg3RjFBLCAweDU0OTAsIDB4NTY3NiwgMHg1NjBFLCAweDhCRTUsIDB4NjUzOSwKKyAgICAweDY5ODIsIDB4OTQ5OSwgMHg3NkQ2LCAweDZFODksIDB4NUU3MiwgMHg3NTE4LCAweDY3NDYsIDB4NjdEMSwgMHg3QUZGLAorICAgIDB4ODA5RCwgMHg4RDc2LCAweDYxMUYsIDB4NzlDNiwgMHg2NTYyLCAweDhENjMsIDB4NTE4OCwgMHg1MjFBLCAweDk0QTIsCisgICAgMHg3RjM4LCAweDgwOUIsIDB4N0VCMiwgMHg1Qzk3LCAweDZFMkYsIDB4Njc2MCwgMHg3QkQ5LCAweDc2OEIsIDB4OUFEOCwKKyAgICAweDgxOEYsIDB4N0Y5NCwgMHg3Q0Q1LCAweDY0MUUsIDB4OTU1MCwgMHg3QTNGLCAweDU0NEEsIDB4NTRFNSwgMHg2QjRDLAorICAgIDB4NjQwMSwgMHg2MjA4LCAweDlFM0QsIDB4ODBGMywgMHg3NTk5LCAweDUyNzIsIDB4OTc2OSwgMHg4NDVCLCAweDY4M0MsCisgICAgMHg4NkU0LCAweDk2MDEsIDB4OTY5NCwgMHg5NEVDLCAweDRFMkEsIDB4NTQwNCwgMHg3RUQ5LCAweDY4MzksIDB4OERERiwKKyAgICAweDgwMTUsIDB4NjZGNCwgMHg1RTlBLCAweDdGQjksIDB4NTdDMiwgMHg4MDNGLCAweDY4OTcsIDB4NURFNSwgMHg2NTNCLAorICAgIDB4NTI5RiwgMHg2MDZELCAweDlGOUEsIDB4NEY5QiwgMHg4RUFDLCAweDUxNkMsIDB4NUJBQiwgMHg1RjEzLCAweDVERTksCisgICAgMHg2QzVFLCAweDYyRjEsIDB4OEQyMSwgMHg1MTcxLCAweDk0QTksIDB4NTJGRSwgMHg2QzlGLCAweDgyREYsIDB4NzJENywKKyAgICAweDU3QTIsIDB4Njc4NCwgMHg4RDJELCAweDU5MUYsIDB4OEY5QywgMHg4M0M3LCAweDU0OTUsIDB4N0I4RCwgMHg0RjMwLAorICAgIDB4NkNCRCwgMHg1QjY0LCAweDU5RDEsIDB4OUYxMywgMHg1M0U0LCAweDg2Q0EsIDB4OUFBOCwgMHg4QzM3LCAweDgwQTEsCisgICAgMHg2NTQ1LCAweDk4N0UsIDB4NTZGQSwgMHg5NkM3LCAweDUyMkUsIDB4NzREQywgMHg1MjUwLCAweDVCRTEsIDB4NjMwMiwKKyAgICAweDg5MDIsIDB4NEU1NiwgMHg2MkQwLCAweDYwMkEsIDB4NjhGQSwgMHg1MTczLCAweDVCOTgsIDB4NTFBMCwgMHg4OUMyLAorICAgIDB4N0JBMSwgMHg5OTg2LCAweDdGNTAsIDB4NjBFRiwgMHg3MDRDLCAweDhEMkYsIDB4NTE0OSwgMHg1RTdGLCAweDkwMUIsCisgICAgMHg3NDcwLCAweDg5QzQsIDB4NTcyRCwgMHg3ODQ1LCAweDVGNTIsIDB4OUY5RiwgMHg5NUZBLCAweDhGNjgsIDB4OUIzQywKKyAgICAweDhCRTEsIDB4NzY3OCwgMHg2ODQyLCAweDY3REMsIDB4OERFQSwgMHg4RDM1LCAweDUyM0QsIDB4OEY4QSwgMHg2RURBLAorICAgIDB4NjhDRCwgMHg5NTA1LCAweDkwRUQsIDB4NTZGRCwgMHg2NzlDLCAweDg4RjksIDB4OEZDNywgMHg1NEM4LCAweDlBQjgsCisgICAgMHg1QjY5LCAweDZENzcsIDB4NkMyNiwgMHg0RUE1LCAweDVCQjMsIDB4OUE4NywgMHg5MTYzLCAweDYxQTgsIDB4OTBBRiwKKyAgICAweDk3RTksIDB4NTQyQiwgMHg2REI1LCAweDVCRDIsIDB4NTFGRCwgMHg1NThBLCAweDdGNTUsIDB4N0ZGMCwgMHg2NEJDLAorICAgIDB4NjM0RCwgMHg2NUYxLCAweDYxQkUsIDB4NjA4RCwgMHg3MTBBLCAweDZDNTcsIDB4NkM0OSwgMHg1OTJGLCAweDY3NkQsCisgICAgMHg4MjJBLCAweDU4RDUsIDB4NTY4RSwgMHg4QzZBLCAweDZCRUIsIDB4OTBERCwgMHg1OTdELCAweDgwMTcsIDB4NTNGNywKKyAgICAweDZENjksIDB4NTQ3NSwgMHg1NTlELCAweDgzNzcsIDB4ODNDRiwgMHg2ODM4LCAweDc5QkUsIDB4NTQ4QywgMHg0RjU1LAorICAgIDB4NTQwOCwgMHg3NkQyLCAweDhDODksIDB4OTYwMiwgMHg2Q0IzLCAweDZEQjgsIDB4OEQ2QiwgMHg4OTEwLCAweDlFNjQsCisgICAgMHg4RDNBLCAweDU2M0YsIDB4OUVEMSwgMHg3NUQ1LCAweDVGODgsIDB4NzJFMCwgMHg2MDY4LCAweDU0RkMsIDB4NEVBOCwKKyAgICAweDZBMkEsIDB4ODg2MSwgMHg2MDUyLCAweDhGNzAsIDB4NTRDNCwgMHg3MEQ4LCAweDg2NzksIDB4OUUzRiwgMHg2RDJBLAorICAgIDB4NUI4RiwgMHg1RjE4LCAweDdFQTIsIDB4NTU4OSwgMHg0RkFGLCAweDczMzQsIDB4NTQzQywgMHg1MzlBLCAweDUwMTksCisgICAgMHg1NDBFLCAweDU0N0MsIDB4NEU0RSwgMHg1RkZELCAweDc0NUEsIDB4NThGNiwgMHg4NDZCLCAweDgwRTEsIDB4ODc3NCwKKyAgICAweDcyRDAsIDB4N0NDQSwgMHg2RTU2LCAweDVGMjcsIDB4ODY0RSwgMHg1NTJDLCAweDYyQTQsIDB4NEU5MiwgMHg2Q0FBLAorICAgIDB4NjIzNywgMHg4MkIxLCAweDU0RDcsIDB4NTM0RSwgMHg3MzNFLCAweDZFRDEsIDB4NzUzQiwgMHg1MjEyLCAweDUzMTYsCisgICAgMHg4QkRELCAweDY5RDAsIDB4NUY4QSwgMHg2MDAwLCAweDZERUUsIDB4NTc0RiwgMHg2QjIyLCAweDczQUYsIDB4Njg1MywKKyAgICAweDhGRDgsIDB4N0YxMywgMHg2MzYyLCAweDYwQTMsIDB4NTUyNCwgMHg3NUVBLCAweDhDNjIsIDB4NzExNSwgMHg2REEzLAorICAgIDB4NUJBNiwgMHg1RTdCLCAweDgzNTIsIDB4NjE0QywgMHg5RUM0LCAweDc4RkEsIDB4ODc1NywgMHg3QzI3LCAweDc2ODcsCisgICAgMHg1MUYwLCAweDYwRjYsIDB4NzE0QywgMHg2NjQzLCAweDVFNEMsIDB4NjA0RCwgMHg4QzBFLCAweDcwNzAsIDB4NjMyNSwKKyAgICAweDhGODksIDB4NUZCRCwgMHg2MDYyLCAweDg2RDQsIDB4NTZERSwgMHg2QkMxLCAweDYwOTQsIDB4NjE2NywgMHg1MzQ5LAorICAgIDB4NjBFMCwgMHg2NjY2LCAweDhEM0YsIDB4NzlGRCwgMHg0RjFBLCAweDcwRTksIDB4NkM0NywgMHg4QkIzLCAweDhCRjIsCisgICAgMHg3RUQ4LCAweDgzNjQsIDB4NjYwRiwgMHg1QTVBLCAweDlCNDIsIDB4NkQ1MSwgMHg2REY3LCAweDhDNDEsIDB4NkQzQiwKKyAgICAweDRGMTksIDB4NzA2QiwgMHg4M0I3LCAweDYyMTYsIDB4NjBEMSwgMHg5NzBELCAweDhEMjcsIDB4Nzk3OCwgMHg1MUZCLAorICAgIDB4NTczRSwgMHg1N0ZBLCAweDY3M0EsIDB4NzU3OCwgMHg3QTNELCAweDc5RUYsIDB4N0I5NSwgMHg4MDhDLCAweDk5NjUsCisgICAgMHg4RkY5LCAweDZGQzAsIDB4OEJBNSwgMHg5RTIxLCAweDU5RUMsIDB4N0VFOSwgMHg3RjA5LCAweDU0MDksIDB4Njc4MSwKKyAgICAweDY4RDgsIDB4OEY5MSwgMHg3QzRELCAweDk2QzYsIDB4NTNDQSwgMHg2MDI1LCAweDc1QkUsIDB4NkM3MiwgMHg1MzczLAorICAgIDB4NUFDOSwgMHg3RUE3LCAweDYzMjQsIDB4NTFFMCwgMHg4MTBBLCAweDVERjEsIDB4ODRERiwgMHg2MjgwLCAweDUxODAsCisgICAgMHg1QjYzLCAweDRGMEUsIDB4Nzk2RCwgMHg1MjQyLCAweDYwQjgsIDB4NkQ0RSwgMHg1QkM0LCAweDVCQzIsIDB4OEJBMSwKKyAgICAweDhCQjAsIDB4NjVFMiwgMHg1RkNDLCAweDk2NDUsIDB4NTk5MywgMHg3RUU3LCAweDdFQUEsIDB4NTYwOSwgMHg2N0I3LAorICAgIDB4NTkzOSwgMHg0RjczLCAweDVCQjYsIDB4NTJBMCwgMHg4MzVBLCAweDk4OEEsIDB4OEQzRSwgMHg3NTMyLCAweDk0QkUsCisgICAgMHg1MDQ3LCAweDdBM0MsIDB4NEVGNywgMHg2N0I2LCAweDlBN0UsIDB4NUFDMSwgMHg2QjdDLCAweDc2RDEsIDB4NTc1QSwKKyAgICAweDVDMTYsIDB4N0IzQSwgMHg5NUY0LCAweDcxNEUsIDB4NTE3QywgMHg4MEE5LCAweDgyNzAsIDB4NTk3OCwgMHg3RjA0LAorICAgIDB4ODMyNywgMHg2OEMwLCAweDY3RUMsIDB4NzhCMSwgMHg3ODc3LCAweDYyRTMsIDB4NjM2MSwgMHg3QjgwLCAweDRGRUQsCisgICAgMHg1MjZBLCAweDUxQ0YsIDB4ODM1MCwgMHg2OURCLCAweDkyNzQsIDB4OERGNSwgMHg4RDMxLCAweDg5QzEsIDB4OTUyRSwKKyAgICAweDdCQUQsIDB4NEVGNiwgMHg1MDY1LCAweDgyMzAsIDB4NTI1MSwgMHg5OTZGLCAweDZFMTAsIDB4NkU4NSwgMHg2REE3LAorICAgIDB4NUVGQSwgMHg1MEY1LCAweDU5REMsIDB4NUMwNiwgMHg2RDQ2LCAweDZDNUYsIDB4NzU4NiwgMHg4NDhCLCAweDY4NjgsCisgICAgMHg1OTU2LCAweDhCQjIsIDB4NTMyMCwgMHg5MTcxLCAweDk2NEQsIDB4ODU0OSwgMHg2OTEyLCAweDc5MDEsIDB4NzEyNiwKKyAgICAweDgwRjYsIDB4NEVBNCwgMHg5MENBLCAweDZENDcsIDB4OUE4NCwgMHg1QTA3LCAweDU2QkMsIDB4NjQwNSwgMHg5NEYwLAorICAgIDB4NzdFQiwgMHg0RkE1LCAweDgxMUEsIDB4NzJFMSwgMHg4OUQyLCAweDk5N0EsIDB4N0YzNCwgMHg3RURFLCAweDUyN0YsCisgICAgMHg2NTU5LCAweDkxNzUsIDB4OEY3RiwgMHg4RjgzLCAweDUzRUIsIDB4N0E5NiwgMHg2M0VELCAweDYzQTUsIDB4NzY4NiwKKyAgICAweDc5RjgsIDB4ODg1NywgMHg5NjM2LCAweDYyMkEsIDB4NTJBQiwgMHg4MjgyLCAweDY4NTQsIDB4Njc3MCwgMHg2Mzc3LAorICAgIDB4Nzc2QiwgMHg3QUVELCAweDZEMDEsIDB4N0VEMywgMHg4OUUzLCAweDU5RDAsIDB4NjIxMiwgMHg4NUM5LCAweDgyQTUsCisgICAgMHg3NTRDLCAweDUwMUYsIDB4NEVDQiwgMHg3NUE1LCAweDhCRUIsIDB4NUM0QSwgMHg1REZFLCAweDdCNEIsIDB4NjVBNCwKKyAgICAweDkxRDEsIDB4NEVDQSwgMHg2RDI1LCAweDg5NUYsIDB4N0QyNywgMHg5NTI2LCAweDRFQzUsIDB4OEMyOCwgMHg4RkRCLAorICAgIDB4OTc3MywgMHg2NjRCLCAweDc5ODEsIDB4OEZEMSwgMHg3MEVDLCAweDZENzgsIDB4NUMzRCwgMHg1MkIyLCAweDgzNDYsCisgICAgMHg1MTYyLCAweDgzMEUsIDB4Nzc1QiwgMHg2Njc2LCAweDlDQjgsIDB4NEVBQywgMHg2MENBLCAweDdDQkUsIDB4N0NCMywKKyAgICAweDdFQ0YsIDB4NEU5NSwgMHg4QjY2LCAweDY2NkYsIDB4OTg4OCwgMHg5NzU5LCAweDU4ODMsIDB4NjU2QywgMHg5NTVDLAorICAgIDB4NUY4NCwgMHg3NUM5LCAweDk3NTYsIDB4N0FERiwgMHg3QURFLCAweDUxQzAsIDB4NzBBRiwgMHg3QTk4LCAweDYzRUEsCisgICAgMHg3QTc2LCAweDdFQTAsIDB4NzM5NiwgMHg5N0VELCAweDRFNDUsIDB4NzA3OCwgMHg0RTVELCAweDkxNTIsIDB4NTNBOSwKKyAgICAweDY1NTEsIDB4NjVFNywgMHg4MUZDLCAweDgyMDUsIDB4NTQ4RSwgMHg1QzMxLCAweDc1OUEsIDB4OTdBMCwgMHg2MkQ4LAorICAgIDB4NzJEOSwgMHg3NUJELCAweDVDNDUsIDB4OUE3OSwgMHg4M0NBLCAweDVDNDAsIDB4NTQ4MCwgMHg3N0U5LCAweDRFM0UsCisgICAgMHg2Q0FFLCAweDgwNUEsIDB4NjJEMiwgMHg2MzZFLCAweDVERTgsIDB4NTE3NywgMHg4RERELCAweDhFMUUsIDB4OTUyRiwKKyAgICAweDRGRjEsIDB4NTNFNSwgMHg2MEU3LCAweDcwQUMsIDB4NTI2NywgMHg2MzUwLCAweDlFNDMsIDB4NUExRiwgMHg1MDI2LAorICAgIDB4NzczNywgMHg1Mzc3LCAweDdFRTIsIDB4NjQ4NSwgMHg2NTJCLCAweDYyODksIDB4NjM5OCwgMHg1MDE0LCAweDcyMzUsCisgICAgMHg4OUM5LCAweDUxQjMsIDB4OEJDMCwgMHg3RURELCAweDU3NDcsIDB4ODNDQywgMHg5NEE3LCAweDUxOUIsIDB4NTQxQiwKKyAgICAweDVDRkIsIDB4NEZDQSwgMHg3QUUzLCAweDZENUEsIDB4OTBFMSwgMHg5QThGLCAweDU1ODAsIDB4NTQ5NiwgMHg1MzYxLAorICAgIDB4NTRBRiwgMHg1RjAwLCAweDYzRTksIDB4Njk3NywgMHg1MUVGLCAweDYxNjgsIDB4NTIwQSwgMHg1ODJBLCAweDUyRDgsCisgICAgMHg1NzRFLCAweDc4MEQsIDB4NzcwQiwgMHg1RUI3LCAweDYxNzcsIDB4N0NFMCwgMHg2MjVCLCAweDYyOTcsIDB4NEVBMiwKKyAgICAweDcwOTUsIDB4ODAwMywgMHg2MkY3LCAweDcwRTQsIDB4OTc2MCwgMHg1Nzc3LCAweDgyREIsIDB4NjdFRiwgMHg2OEY1LAorICAgIDB4NzhENSwgMHg5ODk3LCAweDc5RDEsIDB4NThGMywgMHg1NEIzLCAweDUzRUYsIDB4NkUzNCwgMHg1MTRCLCAweDUyM0IsCisgICAgMHg1QkEyLCAweDhCRkUsIDB4ODBBRiwgMHg1NTQzLCAweDU3QTYsIDB4NjA3MywgMHg1NzUxLCAweDU0MkQsIDB4N0E3QSwKKyAgICAweDYwNTAsIDB4NUI1NCwgMHg2M0E3LCAweDYyQTAsIDB4NTNFMywgMHg2MjYzLCAweDVCQzcsIDB4NjdBRiwgMHg1NEVELAorICAgIDB4N0E5RiwgMHg4MkU2LCAweDkxNzcsIDB4NUU5MywgMHg4OEU0LCAweDU5MzgsIDB4NTdBRSwgMHg2MzBFLCAweDhERTgsCisgICAgMHg4MEVGLCAweDU3NTcsIDB4N0I3NywgMHg0RkE5LCAweDVGRUIsIDB4NUJCRCwgMHg2QjNFLCAweDUzMjEsIDB4N0I1MCwKKyAgICAweDcyQzIsIDB4Njg0NiwgMHg3N0ZGLCAweDc3MzYsIDB4NjVGNywgMHg1MUI1LCAweDRFOEYsIDB4NzZENCwgMHg1Q0JGLAorICAgIDB4N0FBNSwgMHg4NDc1LCAweDU5NEUsIDB4OUI0MSwgMHg1MDgwLCAweDk5ODgsIDB4NjEyNywgMHg2RTgzLCAweDU3NjQsCisgICAgMHg2NjA2LCAweDYzNDYsIDB4NTZGMCwgMHg2MkVDLCAweDYyNjksIDB4NUVEMywgMHg5NjE0LCAweDU3ODMsIDB4NjJDOSwKKyAgICAweDU1ODcsIDB4ODcyMSwgMHg4MTRBLCAweDhGQTMsIDB4NTU2NiwgMHg4M0IxLCAweDY3NjUsIDB4OEQ1NiwgMHg4NERELAorICAgIDB4NUE2QSwgMHg2ODBGLCAweDYyRTYsIDB4N0JFRSwgMHg5NjExLCAweDUxNzAsIDB4NkY5QywgMHg4QzMwLCAweDYzRkQsCisgICAgMHg4OUM4LCAweDYxRDIsIDB4N0YwNiwgMHg3MEMyLCAweDZFRTUsIDB4NzQwNSwgMHg2OTk0LCAweDcyRkMsIDB4NUVDQSwKKyAgICAweDkwQ0UsIDB4NjcxNywgMHg2RDZBLCAweDYzNUUsIDB4NTJCMywgMHg3MjYyLCAweDgwMDEsIDB4NEY2QywgMHg1OUU1LAorICAgIDB4OTE2QSwgMHg3MEQ5LCAweDZEOUQsIDB4NTJEMiwgMHg0RTUwLCAweDk2RjcsIDB4OTU2RCwgMHg4NTdFLCAweDc4Q0EsCisgICAgMHg3RDJGLCAweDUxMjEsIDB4NTc5MiwgMHg2NEMyLCAweDgwOEIsIDB4N0M3QiwgMHg2Q0VBLCAweDY4RjEsIDB4Njk1RSwKKyAgICAweDUxQjcsIDB4NTM5OCwgMHg2OEE4LCAweDcyODEsIDB4OUVDRSwgMHg3QkYxLCAweDcyRjgsIDB4NzlCQiwgMHg2RjEzLAorICAgIDB4NzQwNiwgMHg2NzRFLCAweDkxQ0MsIDB4OUNBNCwgMHg3OTNDLCAweDgzODksIDB4ODM1NCwgMHg1NDBGLCAweDY4MTcsCisgICAgMHg0RTNELCAweDUzODksIDB4NTJCMSwgMHg3ODNFLCAweDUzODYsIDB4NTIyOSwgMHg1MDg4LCAweDRGOEIsIDB4NEZEMCwKKyAgICAweDc1RTIsIDB4N0FDQiwgMHg3QzkyLCAweDZDQTUsIDB4OTZCNiwgMHg1MjlCLCAweDc0ODMsIDB4NTRFOSwgMHg0RkU5LAorICAgIDB4ODA1NCwgMHg4M0IyLCAweDhGREUsIDB4OTU3MCwgMHg1RUM5LCAweDYwMUMsIDB4NkQ5RiwgMHg1RTE4LCAweDY1NUIsCisgICAgMHg4MTM4LCAweDk0RkUsIDB4NjA0QiwgMHg3MEJDLCAweDdFQzMsIDB4N0NBRSwgMHg1MUM5LCAweDY4ODEsIDB4N0NCMSwKKyAgICAweDgyNkYsIDB4NEUyNCwgMHg4Rjg2LCAweDkxQ0YsIDB4NjY3RSwgMHg0RUFFLCAweDhDMDUsIDB4NjRBOSwgMHg4MDRBLAorICAgIDB4NTBEQSwgMHg3NTk3LCAweDcxQ0UsIDB4NUJFNSwgMHg4RkJELCAweDZGNjYsIDB4NEU4NiwgMHg2NDgyLCAweDk1NjMsCisgICAgMHg1RUQ2LCAweDY1OTksIDB4NTIxNywgMHg4OEMyLCAweDcwQzgsIDB4NTJBMywgMHg3MzBFLCAweDc0MzMsIDB4Njc5NywKKyAgICAweDc4RjcsIDB4OTcxNiwgMHg0RTM0LCAweDkwQkIsIDB4OUNERSwgMHg2RENCLCAweDUxREIsIDB4OEQ0MSwgMHg1NDFELAorICAgIDB4NjJDRSwgMHg3M0IyLCAweDgzRjEsIDB4OTZGNiwgMHg5Rjg0LCAweDk0QzMsIDB4NEYzNiwgMHg3RjlBLCAweDUxQ0MsCisgICAgMHg3MDc1LCAweDk2NzUsIDB4NUNBRCwgMHg5ODg2LCAweDUzRTYsIDB4NEVFNCwgMHg2RTlDLCAweDc0MDksIDB4NjlCNCwKKyAgICAweDc4NkIsIDB4OTk4RiwgMHg3NTU5LCAweDUyMTgsIDB4NzYyNCwgMHg2RDQxLCAweDY3RjMsIDB4NTE2RCwgMHg5Rjk5LAorICAgIDB4ODA0QiwgMHg1NDk5LCAweDdCM0MsIDB4N0FCRiwgMHg5Njg2LCAweDU3ODQsIDB4NjJFMiwgMHg5NjQ3LCAweDY5N0MsCisgICAgMHg1QTA0LCAweDY0MDIsIDB4N0JEMywgMHg2RjBGLCAweDk2NEIsIDB4ODJBNiwgMHg1MzYyLCAweDk4ODUsIDB4NUU5MCwKKyAgICAweDcwODksIDB4NjNCMywgMHg1MzY0LCAweDg2NEYsIDB4OUM4MSwgMHg5RTkzLCAweDc4OEMsIDB4OTczMiwgMHg4REVGLAorICAgIDB4OEQ0MiwgMHg5RTdGLCAweDZGNUUsIDB4Nzk4NCwgMHg1RjU1LCAweDk2NDYsIDB4NjIyRSwgMHg5QTc0LCAweDU0MTUsCisgICAgMHg5NERELCAweDRGQTMsIDB4NjVDNSwgMHg1QzY1LCAweDVDNjEsIDB4N0YxNSwgMHg4NjUxLCAweDZDMkYsIDB4NUY4QiwKKyAgICAweDczODcsIDB4NkVFNCwgMHg3RUZGLCAweDVDRTYsIDB4NjMxQiwgMHg1QjZBLCAweDZFRTYsIDB4NTM3NSwgMHg0RTcxLAorICAgIDB4NjNBMCwgMHg3NTY1LCAweDYyQTEsIDB4OEY2RSwgMHg0RjI2LCAweDRFRDEsIDB4NkNBNiwgMHg3RUI2LCAweDhCQkEsCisgICAgMHg4NDFELCAweDg3QkEsIDB4N0Y1NywgMHg5MDNCLCAweDk1MjMsIDB4N0JBOSwgMHg5QUExLCAweDg4RjgsIDB4ODQzRCwKKyAgICAweDZEMUIsIDB4OUE4NiwgMHg3RURDLCAweDU5ODgsIDB4OUVCQiwgMHg3MzlCLCAweDc4MDEsIDB4ODY4MiwgMHg5QTZDLAorICAgIDB4OUE4MiwgMHg1NjFCLCAweDU0MTcsIDB4NTdDQiwgMHg0RTcwLCAweDlFQTYsIDB4NTM1NiwgMHg4RkM4LCAweDgxMDksCisgICAgMHg3NzkyLCAweDk5OTIsIDB4ODZFRSwgMHg2RUUxLCAweDg1MTMsIDB4NjZGQywgMHg2MTYyLCAweDZGMkIsIDB4OEMyOSwKKyAgICAweDgyOTIsIDB4ODMyQiwgMHg3NkYyLCAweDZDMTMsIDB4NUZEOSwgMHg4M0JELCAweDczMkIsIDB4ODMwNSwgMHg5NTFBLAorICAgIDB4NkJEQiwgMHg3N0RCLCAweDk0QzYsIDB4NTM2RiwgMHg4MzAyLCAweDUxOTIsIDB4NUUzRCwgMHg4QzhDLCAweDhEMzgsCisgICAgMHg0RTQ4LCAweDczQUIsIDB4Njc5QSwgMHg2ODg1LCAweDkxNzYsIDB4OTcwOSwgMHg3MTY0LCAweDZDQTEsIDB4NzcwOSwKKyAgICAweDVBOTIsIDB4OTU0MSwgMHg2QkNGLCAweDdGOEUsIDB4NjYyNywgMHg1QkQwLCAweDU5QjksIDB4NUE5QSwgMHg5NUU4LAorICAgIDB4OTVGNywgMHg0RUVDLCAweDg0MEMsIDB4ODQ5OSwgMHg2QUFDLCAweDc2REYsIDB4OTUzMCwgMHg3MzFCLCAweDY4QTYsCisgICAgMHg1QjVGLCAweDc3MkYsIDB4OTE5QSwgMHg5NzYxLCAweDdDREMsIDB4OEZGNywgMHg4QzFDLCAweDVGMjUsIDB4N0M3MywKKyAgICAweDc5RDgsIDB4ODlDNSwgMHg2Q0NDLCAweDg3MUMsIDB4NUJDNiwgMHg1RTQyLCAweDY4QzksIDB4NzcyMCwgMHg3RUY1LAorICAgIDB4NTE5NSwgMHg1MTRELCAweDUyQzksIDB4NUEyOSwgMHg3RjA1LCAweDk3NjIsIDB4ODJENywgMHg2M0NGLCAweDc3ODQsCisgICAgMHg4NUQwLCAweDc5RDIsIDB4NkUzQSwgMHg1RTk5LCAweDU5OTksIDB4ODUxMSwgMHg3MDZELCAweDZDMTEsIDB4NjJCRiwKKyAgICAweDc2QkYsIDB4NjU0RiwgMHg2MEFGLCAweDk1RkQsIDB4NjYwRSwgMHg4NzlGLCAweDlFMjMsIDB4OTRFRCwgMHg1NDBELAorICAgIDB4NTQ3RCwgMHg4QzJDLCAweDY0NzgsIDB4NjQ3OSwgMHg4NjExLCAweDZBMjEsIDB4ODE5QywgMHg3OEU4LCAweDY0NjksCisgICAgMHg5QjU0LCAweDYyQjksIDB4NjcyQiwgMHg4M0FCLCAweDU4QTgsIDB4OUVEOCwgMHg2Q0FCLCAweDZGMjAsIDB4NUJERSwKKyAgICAweDk2NEMsIDB4OEMwQiwgMHg3MjVGLCAweDY3RDAsIDB4NjJDNywgMHg3MjYxLCAweDRFQTksIDB4NTlDNiwgMHg2QkNELAorICAgIDB4NTg5MywgMHg2NkFFLCAweDVFNTUsIDB4NTJERiwgMHg2MTU1LCAweDY3MjgsIDB4NzZFRSwgMHg3NzY2LCAweDcyNjcsCisgICAgMHg3QTQ2LCAweDYyRkYsIDB4NTRFQSwgMHg1NDUwLCAweDk0QTAsIDB4OTBBMywgMHg1QTFDLCAweDdFQjMsIDB4NkMxNiwKKyAgICAweDRFNDMsIDB4NTk3NiwgMHg4MDEwLCAweDU5NDgsIDB4NTM1NywgMHg3NTM3LCAweDk2QkUsIDB4NTZDQSwgMHg2MzIwLAorICAgIDB4ODExMSwgMHg2MDdDLCAweDk1RjksIDB4NkRENiwgMHg1NDYyLCAweDk5ODEsIDB4NTE4NSwgMHg1QUU5LCAweDgwRkQsCisgICAgMHg1OUFFLCAweDk3MTMsIDB4NTAyQSwgMHg2Q0U1LCAweDVDM0MsIDB4NjJERiwgMHg0RjYwLCAweDUzM0YsIDB4ODE3QiwKKyAgICAweDkwMDYsIDB4NkVCQSwgMHg4NTJCLCAweDYyQzgsIDB4NUU3NCwgMHg3OEJFLCAweDY0QjUsIDB4NjM3QiwgMHg1RkY1LAorICAgIDB4NUExOCwgMHg5MTdGLCAweDlFMUYsIDB4NUMzRiwgMHg2MzRGLCAweDgwNDIsIDB4NUI3RCwgMHg1NTZFLCAweDk1NEEsCisgICAgMHg5NTRELCAweDZEODUsIDB4NjBBOCwgMHg2N0UwLCAweDcyREUsIDB4NTFERCwgMHg1QjgxLCAweDYyRTcsIDB4NkNERSwKKyAgICAweDcyNUIsIDB4NjI2RCwgMHg5NEFFLCAweDdFQkQsIDB4ODExMywgMHg2RDUzLCAweDUxOUMsIDB4NUYwNCwgMHg1OTc0LAorICAgIDB4NTJBQSwgMHg2MDEyLCAweDU5NzMsIDB4NjY5NiwgMHg4NjUwLCAweDc1OUYsIDB4NjMyQSwgMHg2MUU2LCAweDdDRUYsCisgICAgMHg4QkZBLCAweDU0RTYsIDB4NkIyNywgMHg5RTI1LCAweDZCQjQsIDB4ODVENSwgMHg1NDU1LCAweDUwNzYsIDB4NkNBNCwKKyAgICAweDU1NkEsIDB4OERCNCwgMHg3MjJDLCAweDVFMTUsIDB4NjAxNSwgMHg3NDM2LCAweDYyQ0QsIDB4NjM5MiwgMHg3MjRDLAorICAgIDB4NUY5OCwgMHg2RTQzLCAweDZEM0UsIDB4NjUwMCwgMHg2RjU4LCAweDc2RDgsIDB4NzhEMCwgMHg3NkZDLCAweDc1NTQsCisgICAgMHg1MjI0LCAweDUzREIsIDB4NEU1MywgMHg1RTlFLCAweDY1QzEsIDB4ODAyQSwgMHg4MEQ2LCAweDYyOUIsIDB4NTQ4NiwKKyAgICAweDUyMjgsIDB4NzBBRSwgMHg4ODhELCAweDhERDEsIDB4NkNFMSwgMHg1NDc4LCAweDgwREEsIDB4NTdGOSwgMHg4OEY0LAorICAgIDB4OEQ1NCwgMHg5NjZBLCAweDkxNEQsIDB4NEY2OSwgMHg2QzlCLCAweDU1QjcsIDB4NzZDNiwgMHg3ODMwLCAweDYyQTgsCisgICAgMHg3MEY5LCAweDZGOEUsIDB4NUY2RCwgMHg4NEVDLCAweDY4REEsIDB4Nzg3QywgMHg3QkY3LCAweDgxQTgsIDB4NjcwQiwKKyAgICAweDlFNEYsIDB4NjM2NywgMHg3OEIwLCAweDU3NkYsIDB4NzgxMiwgMHg5NzM5LCAweDYyNzksIDB4NjJBQiwgMHg1Mjg4LAorICAgIDB4NzQzNSwgMHg2QkQ3LCAweDU1NjQsIDB4ODEzRSwgMHg3NUIyLCAweDc2QUUsIDB4NTMzOSwgMHg3NURFLCAweDUwRkIsCisgICAgMHg1QzQxLCAweDhCNkMsIDB4N0JDNywgMHg1MDRGLCAweDcyNDcsIDB4OUE5NywgMHg5OEQ4LCAweDZGMDIsIDB4NzRFMiwKKyAgICAweDc5NjgsIDB4NjQ4NywgMHg3N0E1LCAweDYyRkMsIDB4OTg5MSwgMHg4RDJCLCAweDU0QzEsIDB4ODA1OCwgMHg0RTUyLAorICAgIDB4NTc2QSwgMHg4MkY5LCAweDg0MEQsIDB4NUU3MywgMHg1MUVELCAweDc0RjYsIDB4OEJDNCwgMHg1QzRGLCAweDU3NjEsCisgICAgMHg2Q0ZDLCAweDk4ODcsIDB4NUE0NiwgMHg3ODM0LCAweDlCNDQsIDB4OEZFQiwgMHg3Qzk1LCAweDUyNTYsIDB4NjI1MSwKKyAgICAweDk0RkEsIDB4NEVDNiwgMHg4Mzg2LCAweDg0NjEsIDB4ODNFOSwgMHg4NEIyLCAweDU3RDQsIDB4NjczNCwgMHg1NzAzLAorICAgIDB4NjY2RSwgMHg2RDY2LCAweDhDMzEsIDB4NjZERCwgMHg3MDExLCAweDY3MUYsIDB4NkIzQSwgMHg2ODE2LCAweDYyMUEsCisgICAgMHg1OUJCLCAweDRFMDMsIDB4NTFDNCwgMHg2RjA2LCAweDY3RDIsIDB4NkM4RiwgMHg1MTc2LCAweDY4Q0IsIDB4NTk0NywKKyAgICAweDZCNjcsIDB4NzU2NiwgMHg1RDBFLCAweDgxMTAsIDB4OUY1MCwgMHg2NUQ3LCAweDc5NDgsIDB4Nzk0MSwgMHg5QTkxLAorICAgIDB4OEQ3NywgMHg1QzgyLCAweDRFNUUsIDB4NEYwMSwgMHg1NDJGLCAweDU5NTEsIDB4NzgwQywgMHg1NjY4LCAweDZDMTQsCisgICAgMHg4RkM0LCAweDVGMDMsIDB4NkM3RCwgMHg2Q0UzLCAweDhCQUIsIDB4NjM5MCwgMHg2MDcwLCAweDZEM0QsIDB4NzI3NSwKKyAgICAweDYyNjYsIDB4OTQ4RSwgMHg5NEM1LCAweDUzNDMsIDB4OEZDMSwgMHg3QjdFLCAweDRFREYsIDB4OEMyNiwgMHg0RTdFLAorICAgIDB4OUVENCwgMHg5NEIxLCAweDk0QjMsIDB4NTI0RCwgMHg2RjVDLCAweDkwNjMsIDB4NkQ0NSwgMHg4QzM0LCAweDU4MTEsCisgICAgMHg1RDRDLCAweDZCMjAsIDB4NkI0OSwgMHg2N0FBLCAweDU0NUIsIDB4ODE1NCwgMHg3RjhDLCAweDU4OTksIDB4ODUzNywKKyAgICAweDVGM0EsIDB4NjJBMiwgMHg2QTQ3LCAweDk1MzksIDB4NjU3MiwgMHg2MDg0LCAweDY4NjUsIDB4NzdBNywgMHg0RTU0LAorICAgIDB4NEZBOCwgMHg1REU3LCAweDk3OTgsIDB4NjRBQywgMHg3RkQ4LCAweDVDRUQsIDB4NEZDRiwgMHg3QThELCAweDUyMDcsCisgICAgMHg4MzA0LCAweDRFMTQsIDB4NjAyRiwgMHg3QTgzLCAweDk0QTYsIDB4NEZCNSwgMHg0RUIyLCAweDc5RTYsIDB4NzQzNCwKKyAgICAweDUyRTQsIDB4ODJCOSwgMHg2NEQyLCAweDc5QkQsIDB4NUJERCwgMHg2QzgxLCAweDk3NTIsIDB4OEY3QiwgMHg2QzIyLAorICAgIDB4NTAzRSwgMHg1MzdGLCAweDZFMDUsIDB4NjRDRSwgMHg2Njc0LCAweDZDMzAsIDB4NjBDNSwgMHg5ODc3LCAweDhCRjcsCisgICAgMHg1RTg2LCAweDc0M0MsIDB4N0E3NywgMHg3OUNCLCAweDRFMTgsIDB4OTBCMSwgMHg3NDAzLCAweDZDNDIsIDB4NTZEQSwKKyAgICAweDkxNEIsIDB4NkNDNSwgMHg4RDhCLCAweDUzM0EsIDB4ODZDNiwgMHg2NkYyLCAweDhFQUYsIDB4NUM0OCwgMHg5QTcxLAorICAgIDB4NkUyMCwgMHg1M0Q2LCAweDVBMzYsIDB4OUY4QiwgMHg4REEzLCAweDUzQkIsIDB4NTcwOCwgMHg5OEE3LCAweDY3NDMsCisgICAgMHg5MTlCLCAweDZDQzksIDB4NTE2OCwgMHg3NUNBLCAweDYyRjMsIDB4NzJBQywgMHg1MjM4LCAweDUyOUQsIDB4N0YzQSwKKyAgICAweDcwOTQsIDB4NzYzOCwgMHg1Mzc0LCAweDlFNEEsIDB4NjlCNywgMHg3ODZFLCAweDk2QzAsIDB4ODhEOSwgMHg3RkE0LAorICAgIDB4NzEzNiwgMHg3MUMzLCAweDUxODksIDB4NjdEMywgMHg3NEU0LCAweDU4RTQsIDB4NjUxOCwgMHg1NkI3LCAweDhCQTksCisgICAgMHg5OTc2LCAweDYyNzAsIDB4N0VENSwgMHg2MEY5LCAweDcwRUQsIDB4NThFQywgMHg0RUMxLCAweDRFQkEsIDB4NUZDRCwKKyAgICAweDk3RTcsIDB4NEVGQiwgMHg4QkE0LCAweDUyMDMsIDB4NTk4QSwgMHg3RUFCLCAweDYyNTQsIDB4NEVDRCwgMHg2NUU1LAorICAgIDB4NjIwRSwgMHg4MzM4LCAweDg0QzksIDB4ODM2MywgMHg4NzhELCAweDcxOTQsIDB4NkVCNiwgMHg1QkI5LCAweDdFRDIsCisgICAgMHg1MTk3LCAweDYzQzksIDB4NjdENCwgMHg4MDg5LCAweDgzMzksIDB4ODgxNSwgMHg1MTEyLCAweDVCN0EsIDB4NTk4MiwKKyAgICAweDhGQjEsIDB4NEU3MywgMHg2QzVELCAweDUxNjUsIDB4ODkyNSwgMHg4RjZGLCAweDk2MkUsIDB4ODU0QSwgMHg3NDVFLAorICAgIDB4OTUxMCwgMHg5NUYwLCAweDZEQTYsIDB4ODJFNSwgMHg1RjMxLCAweDY0OTIsIDB4NkQxMiwgMHg4NDI4LCAweDgxNkUsCisgICAgMHg5Q0MzLCAweDU4NUUsIDB4OEQ1QiwgMHg0RTA5LCAweDUzQzEsIDB4NEYxRSwgMHg2NTYzLCAweDY4NTEsIDB4NTVEMywKKyAgICAweDRFMjcsIDB4NjQxNCwgMHg5QTlBLCAweDYyNkIsIDB4NUFDMiwgMHg3NDVGLCAweDgyNzIsIDB4NkRBOSwgMHg2OEVFLAorICAgIDB4NTBFNywgMHg4MzhFLCAweDc4MDIsIDB4Njc0MCwgMHg1MjM5LCAweDZDOTksIDB4N0VCMSwgMHg1MEJCLCAweDU1NjUsCisgICAgMHg3MTVFLCAweDdCNUIsIDB4NjY1MiwgMHg3M0NBLCAweDgyRUIsIDB4Njc0OSwgMHg1QzcxLCAweDUyMjAsIDB4NzE3RCwKKyAgICAweDg4NkIsIDB4OTVFQSwgMHg5NjU1LCAweDY0QzUsIDB4OEQ2MSwgMHg4MUIzLCAweDU1ODQsIDB4NkM1NSwgMHg2MjQ3LAorICAgIDB4N0YyRSwgMHg1ODkyLCAweDRGMjQsIDB4NTU0NiwgMHg4RDRGLCAweDY2NEMsIDB4NEUwQSwgMHg1QzFBLCAweDg4RjMsCisgICAgMHg2OEEyLCAweDYzNEUsIDB4N0EwRCwgMHg3MEU3LCAweDgyOEQsIDB4NTJGQSwgMHg5N0Y2LCAweDVDMTEsIDB4NTRFOCwKKyAgICAweDkwQjUsIDB4N0VDRCwgMHg1OTYyLCAweDhENEEsIDB4ODZDNywgMHg4MjBDLCAweDgyMEQsIDB4OEQ2NiwgMHg2NDQ0LAorICAgIDB4NUMwNCwgMHg2MTUxLCAweDZEODksIDB4NzkzRSwgMHg4QkJFLCAweDc4MzcsIDB4NzUzMywgMHg1NDdCLCAweDRGMzgsCisgICAgMHg4RUFCLCAweDZERjEsIDB4NUEyMCwgMHg3RUM1LCAweDc5NUUsIDB4NkM4OCwgMHg1QkExLCAweDVBNzYsIDB4NzUxQSwKKyAgICAweDgwQkUsIDB4NjE0RSwgMHg2RTE3LCAweDU4RjAsIDB4NzUxRiwgMHg3NTI1LCAweDcyNzIsIDB4NTM0NywgMHg3RUYzLAorICAgIDB4NzcwMSwgMHg3NkRCLCAweDUyNjksIDB4ODBEQywgMHg1NzIzLCAweDVFMDgsIDB4NTkzMSwgMHg3MkVFLCAweDY1QkQsCisgICAgMHg2RTdGLCAweDhCRDcsIDB4NUMzOCwgMHg4NjcxLCAweDUzNDEsIDB4NzdGMywgMHg2MkZFLCAweDY1RjYsIDB4NEVDMCwKKyAgICAweDk4REYsIDB4ODY4MCwgMHg1QjlFLCAweDhCQzYsIDB4NTNGMiwgMHg3N0UyLCAweDRGN0YsIDB4NUM0RSwgMHg5QTc2LAorICAgIDB4NTlDQiwgMHg1RjBGLCAweDc5M0EsIDB4NThFQiwgMHg0RTE2LCAweDY3RkYsIDB4NEU4QiwgMHg2MkVELCAweDhBOTMsCisgICAgMHg5MDFELCAweDUyQkYsIDB4NjYyRiwgMHg1NURDLCAweDU2NkMsIDB4OTAwMiwgMHg0RUQ1LCAweDRGOEQsIDB4OTFDQSwKKyAgICAweDk5NzAsIDB4NkMwRiwgMHg1RTAyLCAweDYwNDMsIDB4NUJBNCwgMHg4OUM2LCAweDhCRDUsIDB4NjUzNiwgMHg2MjRCLAorICAgIDB4OTk5NiwgMHg1Qjg4LCAweDVCRkYsIDB4NjM4OCwgMHg1NTJFLCAweDUzRDcsIDB4NzYyNiwgMHg1MTdELCAweDg1MkMsCisgICAgMHg2N0EyLCAweDY4QjMsIDB4NkI4QSwgMHg2MjkyLCAweDhGOTMsIDB4NTNENCwgMHg4MjEyLCAweDZERDEsIDB4NzU4RiwKKyAgICAweDRFNjYsIDB4OEQ0RSwgMHg1QjcwLCAweDcxOUYsIDB4ODVBRiwgMHg2NjkxLCAweDY2RDksIDB4N0Y3MiwgMHg4NzAwLAorICAgIDB4OUVDRCwgMHg5RjIwLCAweDVDNUUsIDB4NjcyRiwgMHg4RkYwLCAweDY4MTEsIDB4Njc1RiwgMHg2MjBELCAweDdBRDYsCisgICAgMHg1ODg1LCAweDVFQjYsIDB4NjU3MCwgMHg2RjMxLCAweDYwNTUsIDB4NTIzNywgMHg4MDBELCAweDY0NTQsIDB4ODg3MCwKKyAgICAweDc1MjksIDB4NUUwNSwgMHg2ODEzLCAweDYyRjQsIDB4OTcxQywgMHg1M0NDLCAweDcyM0QsIDB4OEMwMSwgMHg2QzM0LAorICAgIDB4Nzc2MSwgMHg3QTBFLCAweDU0MkUsIDB4NzdBQywgMHg5ODdBLCAweDgyMUMsIDB4OEJGNCwgMHg3ODU1LCAweDY3MTQsCisgICAgMHg3MEMxLCAweDY1QUYsIDB4NjQ5NSwgMHg1NjM2LCAweDYwMUQsIDB4NzlDMSwgMHg1M0Y4LCAweDRFMUQsIDB4NkI3QiwKKyAgICAweDgwODYsIDB4NUJGQSwgMHg1NUUzLCAweDU2REIsIDB4NEYzQSwgMHg0RjNDLCAweDk5NzIsIDB4NURGMywgMHg2NzdFLAorICAgIDB4ODAzOCwgMHg2MDAyLCAweDk4ODIsIDB4OTAwMSwgMHg1QjhCLCAweDhCQkMsIDB4OEJGNSwgMHg2NDFDLCAweDgyNTgsCisgICAgMHg2NERFLCAweDU1RkQsIDB4ODJDRiwgMHg5MTY1LCAweDRGRDcsIDB4N0QyMCwgMHg5MDFGLCAweDdDOUYsIDB4NTBGMywKKyAgICAweDU4NTEsIDB4NkVBRiwgMHg1QkJGLCAweDhCQzksIDB4ODA4MywgMHg5MTc4LCAweDg0OUMsIDB4N0I5NywgMHg4NjdELAorICAgIDB4OTY4QiwgMHg5NjhGLCAweDdFRTUsIDB4OUFEMywgMHg3ODhFLCAweDVDODEsIDB4N0E1NywgMHg5MDQyLCAweDk2QTcsCisgICAgMHg3OTVGLCAweDVCNTksIDB4NjM1RiwgMHg3QjBCLCAweDg0RDEsIDB4NjhBRCwgMHg1NTA2LCAweDdGMjksIDB4NzQxMCwKKyAgICAweDdEMjIsIDB4OTUwMSwgMHg2MjQwLCAweDU4NEMsIDB4NEVENiwgMHg1QjgzLCAweDU5NzksIDB4NTg1NCwgMHg3MzZELAorICAgIDB4NjMxRSwgMHg4RTRCLCAweDhFMEYsIDB4ODBDRSwgMHg4MkQ0LCAweDYyQUMsIDB4NTNGMCwgMHg2Q0YwLCAweDkxNUUsCisgICAgMHg1OTJBLCAweDYwMDEsIDB4NkM3MCwgMHg1NzRELCAweDY0NEEsIDB4OEQyQSwgMHg3NjJCLCAweDZFRTksIDB4NTc1QiwKKyAgICAweDZBODAsIDB4NzVGMCwgMHg2RjZELCAweDhDMkQsIDB4OEMwOCwgMHg1NzY2LCAweDZCRUYsIDB4ODg5MiwgMHg3OEIzLAorICAgIDB4NjNBMiwgMHg1M0Y5LCAweDcwQUQsIDB4NkM2NCwgMHg1ODU4LCAweDY0MkEsIDB4NTgwMiwgMHg2OEUwLCAweDgxOUIsCisgICAgMHg1NTEwLCAweDdDRDYsIDB4NTAxOCwgMHg4RUJBLCAweDZEQ0MsIDB4OEQ5RiwgMHg3MEVCLCAweDYzOEYsIDB4NkQ5QiwKKyAgICAweDZFRDQsIDB4N0VFNiwgMHg4NDA0LCAweDY4NDMsIDB4OTAwMywgMHg2REQ4LCAweDk2NzYsIDB4OEJBOCwgMHg1OTU3LAorICAgIDB4NzI3OSwgMHg4NUU0LCAweDgxN0UsIDB4NzVCQywgMHg4QThBLCAweDY4QUYsIDB4NTI1NCwgMHg4RTIyLCAweDk1MTEsCisgICAgMHg2M0QwLCAweDk4OTgsIDB4OEU0NCwgMHg1NTdDLCAweDRGNTMsIDB4NjZGRiwgMHg1NjhGLCAweDYwRDUsIDB4NkQ5NSwKKyAgICAweDUyNDMsIDB4NUM0OSwgMHg1OTI5LCAweDZERkIsIDB4NTg2QiwgMHg3NTMwLCAweDc1MUMsIDB4NjA2QywgMHg4MjE0LAorICAgIDB4ODE0NiwgMHg2MzExLCAweDY3NjEsIDB4OEZFMiwgMHg3NzNBLCAweDhERjMsIDB4OEQzNCwgMHg5NEMxLCAweDVFMTYsCisgICAgMHg1Mzg1LCAweDU0MkMsIDB4NzBDMywgMHg2QzQwLCAweDVFRjcsIDB4NTA1QywgMHg0RUFELCAweDVFQUQsIDB4NjMzQSwKKyAgICAweDgyNDcsIDB4OTAxQSwgMHg2ODUwLCAweDkxNkUsIDB4NzdCMywgMHg1NDBDLCAweDk0REMsIDB4NUY2NCwgMHg3QUU1LAorICAgIDB4Njg3NiwgMHg2MzQ1LCAweDdCNTIsIDB4N0VERiwgMHg3NURCLCAweDUwNzcsIDB4NjI5NSwgMHg1OTM0LCAweDkwMEYsCisgICAgMHg1MUY4LCAweDc5QzMsIDB4N0E4MSwgMHg1NkZFLCAweDVGOTIsIDB4OTAxNCwgMHg2RDgyLCAweDVDNjAsIDB4NTcxRiwKKyAgICAweDU0MTAsIDB4NTE1NCwgMHg2RTRELCAweDU2RTIsIDB4NjNBOCwgMHg5ODkzLCAweDgxN0YsIDB4ODcxNSwgMHg4OTJBLAorICAgIDB4OTAwMCwgMHg1NDFFLCAweDVDNkYsIDB4ODFDMCwgMHg2MkQ2LCAweDYyNTgsIDB4ODEzMSwgMHg5RTM1LCAweDk2NDAsCisgICAgMHg5QTZFLCAweDlBN0MsIDB4NjkyRCwgMHg1OUE1LCAweDYyRDMsIDB4NTUzRSwgMHg2MzE2LCAweDU0QzcsIDB4ODZEOSwKKyAgICAweDZEM0MsIDB4NUEwMywgMHg3NEU2LCAweDg4OUMsIDB4NkI2QSwgMHg1OTE2LCAweDhDNEMsIDB4NUYyRiwgMHg2RTdFLAorICAgIDB4NzNBOSwgMHg5ODdELCAweDRFMzgsIDB4NzBGNywgMHg1QjhDLCAweDc4OTcsIDB4NjMzRCwgMHg2NjVBLCAweDc2OTYsCisgICAgMHg2MENCLCAweDVCOUIsIDB4NUE0OSwgMHg0RTA3LCAweDgxNTUsIDB4NkM2QSwgMHg3MzhCLCAweDRFQTEsIDB4Njc4OSwKKyAgICAweDdGNTEsIDB4NUY4MCwgMHg2NUZBLCAweDY3MUIsIDB4NUZEOCwgMHg1OTg0LCAweDVBMDEsIDB4NURDRCwgMHg1RkFFLAorICAgIDB4NTM3MSwgMHg5N0U2LCAweDhGREQsIDB4Njg0NSwgMHg1NkY0LCAweDU1MkYsIDB4NjBERiwgMHg0RTNBLCAweDZGNEQsCisgICAgMHg3RUY0LCAweDgyQzcsIDB4ODQwRSwgMHg1OUQ0LCAweDRGMUYsIDB4NEYyQSwgMHg1QzNFLCAweDdFQUMsIDB4NjcyQSwKKyAgICAweDg1MUEsIDB4NTQ3MywgMHg3NTRGLCAweDgwQzMsIDB4NTU4MiwgMHg5QjRGLCAweDRGNEQsIDB4NkUyRCwgMHg4QzEzLAorICAgIDB4NUMwOSwgMHg2MTcwLCAweDUzNkIsIDB4NzYxRiwgMHg2RTI5LCAweDg2OEEsIDB4NjU4NywgMHg5NUZCLCAweDdFQjksCisgICAgMHg1NDNCLCAweDdBMzMsIDB4N0QwQSwgMHg5NUVFLCAweDU1RTEsIDB4N0ZDMSwgMHg3NEVFLCAweDYzMUQsIDB4ODcxNywKKyAgICAweDZEQTEsIDB4N0E5RCwgMHg2MjExLCAweDY1QTEsIDB4NTM2NywgMHg2M0UxLCAweDZDODMsIDB4NURFQiwgMHg1NDVDLAorICAgIDB4OTRBOCwgMHg0RTRDLCAweDZDNjEsIDB4OEJFQywgMHg1QzRCLCAweDY1RTAsIDB4ODI5QywgMHg2OEE3LCAweDU0M0UsCisgICAgMHg1NDM0LCAweDZCQ0IsIDB4NkI2NiwgMHg0RTk0LCAweDYzNDIsIDB4NTM0OCwgMHg4MjFFLCAweDRGMEQsIDB4NEZBRSwKKyAgICAweDU3NUUsIDB4NjIwQSwgMHg5NkZFLCAweDY2NjQsIDB4NzI2OSwgMHg1MkZGLCAweDUyQTEsIDB4NjA5RiwgMHg4QkVGLAorICAgIDB4NjYxNCwgMHg3MTk5LCAweDY3OTAsIDB4ODk3RiwgMHg3ODUyLCAweDc3RkQsIDB4NjY3MCwgMHg1NjNCLCAweDU0MzgsCisgICAgMHg5NTIxLCAweDcyN0EsIDB4N0EwMCwgMHg2MDZGLCAweDVFMEMsIDB4NjA4OSwgMHg4MTlELCAweDU5MTUsIDB4NjBEQywKKyAgICAweDcxODQsIDB4NzBFRiwgMHg2RUFBLCAweDZDNTAsIDB4NzI4MCwgMHg2QTg0LCAweDg4QUQsIDB4NUUyRCwgMHg0RTYwLAorICAgIDB4NUFCMywgMHg1NTlDLCAweDk0RTMsIDB4NkQxNywgMHg3Q0ZCLCAweDk2OTksIDB4NjIwRiwgMHg3RUM2LCAweDc3OEUsCisgICAgMHg4NjdFLCAweDUzMjMsIDB4OTcxRSwgMHg4Rjk2LCAweDY2ODcsIDB4NUNFMSwgMHg0RkEwLCAweDcyRUQsIDB4NEUwQiwKKyAgICAweDUzQTYsIDB4NTkwRiwgMHg1NDEzLCAweDYzODAsIDB4OTUyOCwgMHg1MTQ4LCAweDRFRDksIDB4OUM5QywgMHg3RUE0LAorICAgIDB4NTRCOCwgMHg4RDI0LCAweDg4NTQsIDB4ODIzNywgMHg5NUYyLCAweDZEOEUsIDB4NUYyNiwgMHg1QUNDLCAweDY2M0UsCisgICAgMHg5NjY5LCAweDczQjAsIDB4NzMyRSwgMHg1M0JGLCAweDgxN0EsIDB4OTk4NSwgMHg3RkExLCAweDVCQUEsIDB4OTY3NywKKyAgICAweDk2NTAsIDB4N0VCRiwgMHg3NkY4LCAweDUzQTIsIDB4OTU3NiwgMHg5OTk5LCAweDdCQjEsIDB4ODk0NCwgMHg2RTU4LAorICAgIDB4NEU2MSwgMHg3RkQ0LCAweDc5NjUsIDB4OEJFNiwgMHg2MEYzLCAweDU0Q0QsIDB4NEVBQiwgMHg5ODc5LCAweDVERjcsCisgICAgMHg2QTYxLCAweDUwQ0YsIDB4NTQxMSwgMHg4QzYxLCAweDg0MjcsIDB4Nzg1RCwgMHg5NzA0LCAweDUyNEEsIDB4NTRFRSwKKyAgICAweDU2QTMsIDB4OTUwMCwgMHg2RDg4LCAweDVCQjUsIDB4NkRDNiwgMHg2NjUzLCAweDVDMEYsIDB4NUI1RCwgMHg2ODIxLAorICAgIDB4ODA5NiwgMHg1NTc4LCAweDdCMTEsIDB4NjU0OCwgMHg2OTU0LCAweDRFOUIsIDB4NkI0NywgMHg4NzRFLCAweDk3OEIsCisgICAgMHg1MzRGLCAweDYzMUYsIDB4NjQzQSwgMHg5MEFBLCAweDY1OUMsIDB4ODBDMSwgMHg4QzEwLCAweDUxOTksIDB4NjhCMCwKKyAgICAweDUzNzgsIDB4ODdGOSwgMHg2MUM4LCAweDZDQzQsIDB4NkNGQiwgMHg4QzIyLCAweDVDNTEsIDB4ODVBQSwgMHg4MkFGLAorICAgIDB4OTUwQywgMHg2QjIzLCAweDhGOUIsIDB4NjVCMCwgMHg1RkZCLCAweDVGQzMsIDB4NEZFMSwgMHg4ODQ1LCAweDY2MUYsCisgICAgMHg4MTY1LCAweDczMjksIDB4NjBGQSwgMHg1MTc0LCAweDUyMTEsIDB4NTc4QiwgMHg1RjYyLCAweDkwQTIsIDB4ODg0QywKKyAgICAweDkxOTIsIDB4NUU3OCwgMHg2NzRGLCAweDYwMjcsIDB4NTlEMywgMHg1MTQ0LCAweDUxRjYsIDB4ODBGOCwgMHg1MzA4LAorICAgIDB4NkM3OSwgMHg5NkM0LCAweDcxOEEsIDB4NEYxMSwgMHg0RkVFLCAweDdGOUUsIDB4NjczRCwgMHg1NUM1LCAweDk1MDgsCisgICAgMHg3OUMwLCAweDg4OTYsIDB4N0VFMywgMHg1ODlGLCAweDYyMEMsIDB4OTcwMCwgMHg4NjVBLCAweDU2MTgsIDB4OTg3QiwKKyAgICAweDVGOTAsIDB4OEJCOCwgMHg4NEM0LCAweDkxNTcsIDB4NTNEOSwgMHg2NUVELCAweDVFOEYsIDB4NzU1QywgMHg2MDY0LAorICAgIDB4N0Q2RSwgMHg1QTdGLCAweDdFRUEsIDB4N0VFRCwgMHg4RjY5LCAweDU1QTcsIDB4NUJBMywgMHg2MEFDLCAweDY1Q0IsCisgICAgMHg3Mzg0LCAweDkwMDksIDB4NzY2MywgMHg3NzI5LCAweDdFREEsIDB4OTc3NCwgMHg4NTlCLCAweDVCNjYsIDB4N0E3NCwKKyAgICAweDk2RUEsIDB4ODg0MCwgMHg1MkNCLCAweDcxOEYsIDB4NUZBQSwgMHg2NUVDLCAweDhCRTIsIDB4NUJGQiwgMHg5QTZGLAorICAgIDB4NURFMSwgMHg2Qjg5LCAweDZDNUIsIDB4OEJBRCwgMHg4QkFGLCAweDkwMEEsIDB4OEZDNSwgMHg1MzhCLCAweDYyQkMsCisgICAgMHg5RTI2LCAweDlFMkQsIDB4NTQ0MCwgMHg0RTJCLCAweDgyQkQsIDB4NzI1OSwgMHg4NjlDLCAweDVEMTYsIDB4ODg1OSwKKyAgICAweDZEQUYsIDB4OTZDNSwgMHg1NEQxLCAweDRFOUEsIDB4OEJCNiwgMHg3MTA5LCAweDU0QkQsIDB4OTYwOSwgMHg3MERGLAorICAgIDB4NkRGOSwgMHg3NkQwLCAweDRFMjUsIDB4NzgxNCwgMHg4NzEyLCAweDVDQTksIDB4NUVGNiwgMHg4QTAwLCAweDk4OUMsCisgICAgMHg5NjBFLCAweDcwOEUsIDB4NkNCRiwgMHg1OTQ0LCAweDYzQTksIDB4NzczQywgMHg4ODRELCAweDZGMTQsIDB4ODI3MywKKyAgICAweDU4MzAsIDB4NzFENSwgMHg1MzhDLCAweDc4MUEsIDB4OTZDMSwgMHg1NTAxLCAweDVGNjYsIDB4NzEzMCwgMHg1QkI0LAorICAgIDB4OEMxQSwgMHg5QThDLCAweDZCODMsIDB4NTkyRSwgMHg5RTJGLCAweDc5RTcsIDB4Njc2OCwgMHg2MjZDLCAweDRGNkYsCisgICAgMHg3NUExLCAweDdGOEEsIDB4NkQwQiwgMHg5NjMzLCAweDZDMjcsIDB4NEVGMCwgMHg3NUQyLCAweDUxN0IsIDB4NjgzNywKKyAgICAweDZGM0UsIDB4OTA4MCwgMHg4MTcwLCAweDU5OTYsIDB4NzQ3NiwgMHg2NDQ3LCAweDVDMjcsIDB4OTA2NSwgMHg3QTkxLAorICAgIDB4OEMyMywgMHg1OURBLCAweDU0QUMsIDB4ODIwMCwgMHg4MzZGLCAweDg5ODEsIDB4ODAwMCwgMHg2OTMwLCAweDU2NEUsCisgICAgMHg4MDM2LCAweDcyMzcsIDB4OTFDRSwgMHg1MUI2LCAweDRFNUYsIDB4OTg3NSwgMHg2Mzk2LCAweDRFMUEsIDB4NTNGNiwKKyAgICAweDY2RjMsIDB4ODE0QiwgMHg1OTFDLCAweDZEQjIsIDB4NEUwMCwgMHg1OEY5LCAweDUzM0IsIDB4NjNENiwgMHg5NEYxLAorICAgIDB4NEY5RCwgMHg0RjBBLCAweDg4NjMsIDB4OTg5MCwgMHg1OTM3LCAweDkwNTcsIDB4NzlGQiwgMHg0RUVBLCAweDgwRjAsCisgICAgMHg3NTkxLCAweDZDODIsIDB4NUI5QywgMHg1OUU4LCAweDVGNUQsIDB4NjkwNSwgMHg4NjgxLCAweDUwMUEsIDB4NURGMiwKKyAgICAweDRFNTksIDB4NzdFMywgMHg0RUU1LCAweDgyN0EsIDB4NjI5MSwgMHg2NjEzLCAweDkwOTEsIDB4NUM3OSwgMHg0RUJGLAorICAgIDB4NUY3OSwgMHg4MUM2LCAweDkwMzgsIDB4ODA4NCwgMHg3NUFCLCAweDRFQTYsIDB4ODhENCwgMHg2MTBGLCAweDZCQzUsCisgICAgMHg1RkM2LCAweDRFNDksIDB4NzZDQSwgMHg2RUEyLCAweDhCRTMsIDB4OEJBRSwgMHg4QzBBLCAweDhCRDEsIDB4NUYwMiwKKyAgICAweDdGRkMsIDB4N0ZDQywgMHg3RUNFLCAweDgzMzUsIDB4ODM2QiwgMHg1NkUwLCAweDZCQjcsIDB4OTdGMywgMHg5NjM0LAorICAgIDB4NTlGQiwgMHg1NDFGLCAweDk0RjYsIDB4NkRFQiwgMHg1QkM1LCAweDk5NkUsIDB4NUMzOSwgMHg1RjE1LCAweDk2OTAsCisgICAgMHg1MzcwLCAweDgyRjEsIDB4NkEzMSwgMHg1QTc0LCAweDlFNzAsIDB4NUU5NCwgMHg3RjI4LCAweDgzQjksIDB4ODQyNCwKKyAgICAweDg0MjUsIDB4ODM2NywgMHg4NzQ3LCAweDhGQ0UsIDB4OEQ2MiwgMHg3NkM4LCAweDVGNzEsIDB4OTg5NiwgMHg3ODZDLAorICAgIDB4NjYyMCwgMHg1NERGLCAweDYyRTUsIDB4NEY2MywgMHg4MUMzLCAweDc1QzgsIDB4NUVCOCwgMHg5NkNELCAweDhFMEEsCisgICAgMHg4NkY5LCAweDU0OEYsIDB4NkNGMywgMHg2RDhDLCAweDZDMzgsIDB4NjA3RiwgMHg1MkM3LCAweDc1MjgsIDB4NUU3RCwKKyAgICAweDRGMTgsIDB4NjBBMCwgMHg1RkU3LCAweDVDMjQsIDB4NzUzMSwgMHg5MEFFLCAweDk0QzAsIDB4NzJCOSwgMHg2Q0I5LAorICAgIDB4NkUzOCwgMHg5MTQ5LCAweDY3MDksIDB4NTNDQiwgMHg1M0YzLCAweDRGNTEsIDB4OTFDOSwgMHg4QkYxLCAweDUzQzgsCisgICAgMHg1RTdDLCAweDhGQzIsIDB4NkRFNCwgMHg0RThFLCAweDc2QzIsIDB4Njk4NiwgMHg4NjVFLCAweDYxMUEsIDB4ODIwNiwKKyAgICAweDRGNTksIDB4NEZERSwgMHg5MDNFLCAweDlDN0MsIDB4NjEwOSwgMHg2RTFELCAweDZFMTQsIDB4OTY4NSwgMHg0RTg4LAorICAgIDB4NUEzMSwgMHg5NkU4LCAweDRFMEUsIDB4NUM3RiwgMHg3OUI5LCAweDVCODcsIDB4OEJFRCwgMHg3RkJELCAweDczODksCisgICAgMHg1N0RGLCAweDgyOEIsIDB4OTBDMSwgMHg1NDAxLCAweDkwNDcsIDB4NTVCQiwgMHg1Q0VBLCAweDVGQTEsIDB4NjEwOCwKKyAgICAweDZCMzIsIDB4NzJGMSwgMHg4MEIyLCAweDhBODksIDB4NkQ3NCwgMHg1QkQzLCAweDg4RDUsIDB4OTg4NCwgMHg4QzZCLAorICAgIDB4OUE2RCwgMHg5RTMzLCAweDZFMEEsIDB4NTFBNCwgMHg1MTQzLCAweDU3QTMsIDB4ODg4MSwgMHg1MzlGLCAweDYzRjQsCisgICAgMHg4Rjk1LCAweDU2RUQsIDB4NTQ1OCwgMHg1NzA2LCAweDczM0YsIDB4NkU5MCwgMHg3RjE4LCAweDhGREMsIDB4ODJEMSwKKyAgICAweDYxM0YsIDB4NjAyOCwgMHg5NjYyLCAweDY2RjAsIDB4N0VBNiwgMHg4RDhBLCAweDhEQzMsIDB4OTRBNSwgMHg1Q0IzLAorICAgIDB4N0NBNCwgMHg2NzA4LCAweDYwQTYsIDB4OTYwNSwgMHg4MDE4LCAweDRFOTEsIDB4OTBFNywgMHg1MzAwLCAweDk2NjgsCisgICAgMHg1MTQxLCAweDhGRDAsIDB4ODU3NCwgMHg5MTVELCAweDY2NTUsIDB4OTdGNSwgMHg1QjU1LCAweDUzMUQsIDB4NzgzOCwKKyAgICAweDY3NDIsIDB4NjgzRCwgMHg1NEM5LCAweDcwN0UsIDB4NUJCMCwgMHg4RjdELCAweDUxOEQsIDB4NTcyOCwgMHg1NEIxLAorICAgIDB4NjUxMiwgMHg2NjgyLCAweDhENUUsIDB4OEQ0MywgMHg4MTBGLCAweDg0NkMsIDB4OTA2RCwgMHg3Q0RGLCAweDUxRkYsCisgICAgMHg4NUZCLCAweDY3QTMsIDB4NjVFOSwgMHg2RkExLCAweDg2QTQsIDB4OEU4MSwgMHg1NjZBLCAweDkwMjAsIDB4NzY4MiwKKyAgICAweDcwNzYsIDB4NzFFNSwgMHg4RDIzLCAweDYyRTksIDB4NTIxOSwgMHg2Q0ZELCAweDhEM0MsIDB4NjAwRSwgMHg1ODlFLAorICAgIDB4NjE4RSwgMHg2NkZFLCAweDhENjAsIDB4NjI0RSwgMHg1NUIzLCAweDZFMjMsIDB4NjcyRCwgMHg4RjY3LCAweDk0RTEsCisgICAgMHg5NUY4LCAweDc3MjgsIDB4NjgwNSwgMHg2OUE4LCAweDU0OEIsIDB4NEU0RCwgMHg3MEI4LCAweDhCQzgsIDB4NjQ1OCwKKyAgICAweDY1OEIsIDB4NUI4NSwgMHg3QTg0LCAweDUwM0EsIDB4NUJFOCwgMHg3N0JCLCAweDZCRTEsIDB4OEE3OSwgMHg3Qzk4LAorICAgIDB4NkNCRSwgMHg3NkNGLCAweDY1QTksIDB4OEY5NywgMHg1RDJELCAweDVDNTUsIDB4ODYzOCwgMHg2ODA4LCAweDUzNjAsCisgICAgMHg2MjE4LCAweDdBRDksIDB4NkU1QiwgMHg3RUZELCAweDZBMUYsIDB4N0FFMCwgMHg1RjcwLCAweDZGMzMsIDB4NUYyMCwKKyAgICAweDYzOEMsIDB4NkRBOCwgMHg2NzU2LCAweDRFMDgsIDB4NUUxMCwgMHg4RDI2LCAweDRFRDcsIDB4ODBDMCwgMHg3NjM0LAorICAgIDB4OTY5QywgMHg2MkRCLCAweDY2MkQsIDB4NjI3RSwgMHg2Q0JDLCAweDhENzUsIDB4NzE2NywgMHg3RjY5LCAweDUxNDYsCisgICAgMHg4MDg3LCAweDUzRUMsIDB4OTA2RSwgMHg2Mjk4LCAweDU0RjIsIDB4ODZGMCwgMHg4Rjk5LCAweDgwMDUsIDB4OTUxNywKKyAgICAweDg1MTcsIDB4OEZEOSwgMHg2RDU5LCAweDczQ0QsIDB4NjU5RiwgMHg3NzFGLCAweDc1MDQsIDB4NzgyNywgMHg4MUZCLAorICAgIDB4OEQxRSwgMHg5NDg4LCAweDRGQTYsIDB4Njc5NSwgMHg3NUI5LCAweDhCQ0EsIDB4OTcwNywgMHg2MzJGLCAweDk1NDcsCisgICAgMHg5NjM1LCAweDg0QjgsIDB4NjMyMywgMHg3NzQxLCAweDVGODEsIDB4NzJGMCwgMHg0RTg5LCAweDYwMTQsIDB4NjU3NCwKKyAgICAweDYyRUYsIDB4NkI2MywgMHg2NTNGLCAweDVFMjcsIDB4NzVDNywgMHg5MEQxLCAweDhCQzEsIDB4ODI5RCwgMHg2NzlELAorICAgIDB4NjUyRiwgMHg1NDMxLCAweDg3MTgsIDB4NzdFNSwgMHg4MEEyLCAweDgxMDIsIDB4NkM0MSwgMHg0RTRCLCAweDdFQzcsCisgICAgMHg4MDRDLCAweDc2RjQsIDB4NjkwRCwgMHg2Qjk2LCAweDYyNjcsIDB4NTAzQywgMHg0Rjg0LCAweDU3NDAsIDB4NjMwNywKKyAgICAweDZCNjIsIDB4OERCRSwgMHg1M0VBLCAweDY1RTgsIDB4N0VCOCwgMHg1RkQ3LCAweDYzMUEsIDB4NjNCNywgMHg4MUYzLAorICAgIDB4ODFGNCwgMHg3RjZFLCAweDVFMUMsIDB4NUNEOSwgMHg1MjM2LCAweDY2N0EsIDB4NzlFOSwgMHg3QTFBLCAweDhEMjgsCisgICAgMHg3MDk5LCAweDc1RDQsIDB4NkVERSwgMHg2Q0JCLCAweDdBOTIsIDB4NEUyRCwgMHg3NkM1LCAweDVGRTAsIDB4OTQ5RiwKKyAgICAweDg4NzcsIDB4N0VDOCwgMHg3OUNELCAweDgwQkYsIDB4OTFDRCwgMHg0RUYyLCAweDRGMTcsIDB4ODIxRiwgMHg1NDY4LAorICAgIDB4NURERSwgMHg2RDMyLCAweDhCQ0MsIDB4N0NBNSwgMHg4Rjc0LCAweDgwOTgsIDB4NUUxQSwgMHg1NDkyLCAweDc2QjEsCisgICAgMHg1Qjk5LCAweDY2M0MsIDB4OUFBNCwgMHg3M0UwLCAweDY4MkEsIDB4ODZEQiwgMHg2NzMxLCAweDczMkEsIDB4OEJGOCwKKyAgICAweDhCREIsIDB4OTAxMCwgMHg3QUY5LCAweDcwREIsIDB4NzE2RSwgMHg2MkM0LCAweDc3QTksIDB4NTYzMSwgMHg0RTNCLAorICAgIDB4ODQ1NywgMHg2N0YxLCAweDUyQTksIDB4ODZDMCwgMHg4RDJFLCAweDk0RjgsIDB4N0I1MSwgMHg0RjRGLCAweDZDRTgsCisgICAgMHg3OTVELCAweDlBN0IsIDB4NjI5MywgMHg3MjJBLCAweDYyRkQsIDB4NEUxMywgMHg3ODE2LCAweDhGNkMsIDB4NjRCMCwKKyAgICAweDhENUEsIDB4N0JDNiwgMHg2ODY5LCAweDVFODQsIDB4ODhDNSwgMHg1OTg2LCAweDY0OUUsIDB4NThFRSwgMHg3MkI2LAorICAgIDB4NjkwRSwgMHg5NTI1LCAweDhGRkQsIDB4OEQ1OCwgMHg1NzYwLCAweDdGMDAsIDB4OEMwNiwgMHg1MUM2LCAweDYzNDksCisgICAgMHg2MkQ5LCAweDUzNTMsIDB4Njg0QywgMHg3NDIyLCAweDgzMDEsIDB4OTE0QywgMHg1NTQ0LCAweDc3NDAsIDB4NzA3QywKKyAgICAweDZENEEsIDB4NTE3OSwgMHg1NEE4LCAweDhENDQsIDB4NTlGRiwgMHg2RUNCLCAweDZEQzQsIDB4NUI1QywgMHg3RDJCLAorICAgIDB4NEVENCwgMHg3QzdELCAweDZFRDMsIDB4NUI1MCwgMHg4MUVBLCAweDZFMEQsIDB4NUI1NywgMHg5QjAzLCAweDY4RDUsCisgICAgMHg4RTJBLCAweDVCOTcsIDB4N0VGQywgMHg2MDNCLCAweDdFQjUsIDB4OTBCOSwgMHg4RDcwLCAweDU5NEYsIDB4NjNDRCwKKyAgICAweDc5REYsIDB4OERCMywgMHg1MzUyLCAweDY1Q0YsIDB4Nzk1NiwgMHg4QkM1LCAweDk2M0IsIDB4N0VDNCwgMHg5NEJCLAorICAgIDB4N0U4MiwgMHg1NjM0LCAweDkxODksIDB4NjcwMCwgMHg3RjZBLCAweDVDMEEsIDB4OTA3NSwgMHg2NjI4LCAweDVERTYsCisgICAgMHg0RjUwLCAweDY3REUsIDB4NTA1QSwgMHg0RjVDLCAweDU3NTAsIDB4NUVBNywgMHg0RThELCAweDRFMEMsIDB4NTE0MCwKKyAgICAweDRFMTAsIDB4NUVGRiwgMHg1MzQ1LCAweDRFMTUsIDB4NEU5OCwgMHg0RTFFLCAweDlCMzIsIDB4NUI2QywgMHg1NjY5LAorICAgIDB4NEUyOCwgMHg3OUJBLCAweDRFM0YsIDB4NTMxNSwgMHg0RTQ3LCAweDU5MkQsIDB4NzIzQiwgMHg1MzZFLCAweDZDMTAsCisgICAgMHg1NkRGLCAweDgwRTQsIDB4OTk5NywgMHg2QkQzLCAweDc3N0UsIDB4OUYxNywgMHg0RTM2LCAweDRFOUYsIDB4OUYxMCwKKyAgICAweDRFNUMsIDB4NEU2OSwgMHg0RTkzLCAweDgyODgsIDB4NUI1QiwgMHg1NTZDLCAweDU2MEYsIDB4NEVDNCwgMHg1MzhELAorICAgIDB4NTM5RCwgMHg1M0EzLCAweDUzQTUsIDB4NTNBRSwgMHg5NzY1LCAweDhENUQsIDB4NTMxQSwgMHg1M0Y1LCAweDUzMjYsCisgICAgMHg1MzJFLCAweDUzM0UsIDB4OEQ1QywgMHg1MzY2LCAweDUzNjMsIDB4NTIwMiwgMHg1MjA4LCAweDUyMEUsIDB4NTIyRCwKKyAgICAweDUyMzMsIDB4NTIzRiwgMHg1MjQwLCAweDUyNEMsIDB4NTI1RSwgMHg1MjYxLCAweDUyNUMsIDB4ODRBRiwgMHg1MjdELAorICAgIDB4NTI4MiwgMHg1MjgxLCAweDUyOTAsIDB4NTI5MywgMHg1MTgyLCAweDdGNTQsIDB4NEVCQiwgMHg0RUMzLCAweDRFQzksCisgICAgMHg0RUMyLCAweDRFRTgsIDB4NEVFMSwgMHg0RUVCLCAweDRFREUsIDB4NEYxQiwgMHg0RUYzLCAweDRGMjIsIDB4NEY2NCwKKyAgICAweDRFRjUsIDB4NEYyNSwgMHg0RjI3LCAweDRGMDksIDB4NEYyQiwgMHg0RjVFLCAweDRGNjcsIDB4NjUzOCwgMHg0RjVBLAorICAgIDB4NEY1RCwgMHg0RjVGLCAweDRGNTcsIDB4NEYzMiwgMHg0RjNELCAweDRGNzYsIDB4NEY3NCwgMHg0RjkxLCAweDRGODksCisgICAgMHg0RjgzLCAweDRGOEYsIDB4NEY3RSwgMHg0RjdCLCAweDRGQUEsIDB4NEY3QywgMHg0RkFDLCAweDRGOTQsIDB4NEZFNiwKKyAgICAweDRGRTgsIDB4NEZFQSwgMHg0RkM1LCAweDRGREEsIDB4NEZFMywgMHg0RkRDLCAweDRGRDEsIDB4NEZERiwgMHg0RkY4LAorICAgIDB4NTAyOSwgMHg1MDRDLCAweDRGRjMsIDB4NTAyQywgMHg1MDBGLCAweDUwMkUsIDB4NTAyRCwgMHg0RkZFLCAweDUwMUMsCisgICAgMHg1MDBDLCAweDUwMjUsIDB4NTAyOCwgMHg1MDdFLCAweDUwNDMsIDB4NTA1NSwgMHg1MDQ4LCAweDUwNEUsIDB4NTA2QywKKyAgICAweDUwN0IsIDB4NTBBNSwgMHg1MEE3LCAweDUwQTksIDB4NTBCQSwgMHg1MEQ2LCAweDUxMDYsIDB4NTBFRCwgMHg1MEVDLAorICAgIDB4NTBFNiwgMHg1MEVFLCAweDUxMDcsIDB4NTEwQiwgMHg0RURELCAweDZDM0QsIDB4NEY1OCwgMHg0RjY1LCAweDRGQ0UsCisgICAgMHg5RkEwLCAweDZDNDYsIDB4N0M3NCwgMHg1MTZFLCAweDVERkQsIDB4OUVDOSwgMHg5OTk4LCAweDUxODEsIDB4NTkxNCwKKyAgICAweDUyRjksIDB4NTMwRCwgMHg4QTA3LCAweDUzMTAsIDB4NTFFQiwgMHg1OTE5LCAweDUxNTUsIDB4NEVBMCwgMHg1MTU2LAorICAgIDB4NEVCMywgMHg4ODZFLCAweDg4QTQsIDB4NEVCNSwgMHg4MTE0LCAweDg4RDIsIDB4Nzk4MCwgMHg1QjM0LCAweDg4MDMsCisgICAgMHg3RkI4LCAweDUxQUIsIDB4NTFCMSwgMHg1MUJELCAweDUxQkMsIDB4NTFDNywgMHg1MTk2LCAweDUxQTIsIDB4NTFBNSwKKyAgICAweDhCQTAsIDB4OEJBNiwgMHg4QkE3LCAweDhCQUEsIDB4OEJCNCwgMHg4QkI1LCAweDhCQjcsIDB4OEJDMiwgMHg4QkMzLAorICAgIDB4OEJDQiwgMHg4QkNGLCAweDhCQ0UsIDB4OEJEMiwgMHg4QkQzLCAweDhCRDQsIDB4OEJENiwgMHg4QkQ4LCAweDhCRDksCisgICAgMHg4QkRDLCAweDhCREYsIDB4OEJFMCwgMHg4QkU0LCAweDhCRTgsIDB4OEJFOSwgMHg4QkVFLCAweDhCRjAsIDB4OEJGMywKKyAgICAweDhCRjYsIDB4OEJGOSwgMHg4QkZDLCAweDhCRkYsIDB4OEMwMCwgMHg4QzAyLCAweDhDMDQsIDB4OEMwNywgMHg4QzBDLAorICAgIDB4OEMwRiwgMHg4QzExLCAweDhDMTIsIDB4OEMxNCwgMHg4QzE1LCAweDhDMTYsIDB4OEMxOSwgMHg4QzFCLCAweDhDMTgsCisgICAgMHg4QzFELCAweDhDMUYsIDB4OEMyMCwgMHg4QzIxLCAweDhDMjUsIDB4OEMyNywgMHg4QzJBLCAweDhDMkIsIDB4OEMyRSwKKyAgICAweDhDMkYsIDB4OEMzMiwgMHg4QzMzLCAweDhDMzUsIDB4OEMzNiwgMHg1MzY5LCAweDUzN0EsIDB4OTYxRCwgMHg5NjIyLAorICAgIDB4OTYyMSwgMHg5NjMxLCAweDk2MkEsIDB4OTYzRCwgMHg5NjNDLCAweDk2NDIsIDB4OTY0OSwgMHg5NjU0LCAweDk2NUYsCisgICAgMHg5NjY3LCAweDk2NkMsIDB4OTY3MiwgMHg5Njc0LCAweDk2ODgsIDB4OTY4RCwgMHg5Njk3LCAweDk2QjAsIDB4OTA5NywKKyAgICAweDkwOUIsIDB4OTA5RCwgMHg5MDk5LCAweDkwQUMsIDB4OTBBMSwgMHg5MEI0LCAweDkwQjMsIDB4OTBCNiwgMHg5MEJBLAorICAgIDB4OTBCOCwgMHg5MEIwLCAweDkwQ0YsIDB4OTBDNSwgMHg5MEJFLCAweDkwRDAsIDB4OTBDNCwgMHg5MEM3LCAweDkwRDMsCisgICAgMHg5MEU2LCAweDkwRTIsIDB4OTBEQywgMHg5MEQ3LCAweDkwREIsIDB4OTBFQiwgMHg5MEVGLCAweDkwRkUsIDB4OTEwNCwKKyAgICAweDkxMjIsIDB4OTExRSwgMHg5MTIzLCAweDkxMzEsIDB4OTEyRiwgMHg5MTM5LCAweDkxNDMsIDB4OTE0NiwgMHg1MjBELAorICAgIDB4NTk0MiwgMHg1MkEyLCAweDUyQUMsIDB4NTJBRCwgMHg1MkJFLCAweDU0RkYsIDB4NTJEMCwgMHg1MkQ2LCAweDUyRjAsCisgICAgMHg1M0RGLCAweDcxRUUsIDB4NzdDRCwgMHg1RUY0LCAweDUxRjUsIDB4NTFGQywgMHg5QjJGLCAweDUzQjYsIDB4NUYwMSwKKyAgICAweDc1NUEsIDB4NURFRiwgMHg1NzRDLCAweDU3QTksIDB4NTdBMSwgMHg1ODdFLCAweDU4QkMsIDB4NThDNSwgMHg1OEQxLAorICAgIDB4NTcyOSwgMHg1NzJDLCAweDU3MkEsIDB4NTczMywgMHg1NzM5LCAweDU3MkUsIDB4NTcyRiwgMHg1NzVDLCAweDU3M0IsCisgICAgMHg1NzQyLCAweDU3NjksIDB4NTc4NSwgMHg1NzZCLCAweDU3ODYsIDB4NTc3QywgMHg1NzdCLCAweDU3NjgsIDB4NTc2RCwKKyAgICAweDU3NzYsIDB4NTc3MywgMHg1N0FELCAweDU3QTQsIDB4NTc4QywgMHg1N0IyLCAweDU3Q0YsIDB4NTdBNywgMHg1N0I0LAorICAgIDB4NTc5MywgMHg1N0EwLCAweDU3RDUsIDB4NTdEOCwgMHg1N0RBLCAweDU3RDksIDB4NTdEMiwgMHg1N0I4LCAweDU3RjQsCisgICAgMHg1N0VGLCAweDU3RjgsIDB4NTdFNCwgMHg1N0RELCAweDU4MEIsIDB4NTgwRCwgMHg1N0ZELCAweDU3RUQsIDB4NTgwMCwKKyAgICAweDU4MUUsIDB4NTgxOSwgMHg1ODQ0LCAweDU4MjAsIDB4NTg2NSwgMHg1ODZDLCAweDU4ODEsIDB4NTg4OSwgMHg1ODlBLAorICAgIDB4NTg4MCwgMHg5OUE4LCAweDlGMTksIDB4NjFGRiwgMHg4Mjc5LCAweDgyN0QsIDB4ODI3RiwgMHg4MjhGLCAweDgyOEEsCisgICAgMHg4MkE4LCAweDgyODQsIDB4ODI4RSwgMHg4MjkxLCAweDgyOTcsIDB4ODI5OSwgMHg4MkFCLCAweDgyQjgsIDB4ODJCRSwKKyAgICAweDgyQjAsIDB4ODJDOCwgMHg4MkNBLCAweDgyRTMsIDB4ODI5OCwgMHg4MkI3LCAweDgyQUUsIDB4ODJDQiwgMHg4MkNDLAorICAgIDB4ODJDMSwgMHg4MkE5LCAweDgyQjQsIDB4ODJBMSwgMHg4MkFBLCAweDgyOUYsIDB4ODJDNCwgMHg4MkNFLCAweDgyQTQsCisgICAgMHg4MkUxLCAweDgzMDksIDB4ODJGNywgMHg4MkU0LCAweDgzMEYsIDB4ODMwNywgMHg4MkRDLCAweDgyRjQsIDB4ODJEMiwKKyAgICAweDgyRDgsIDB4ODMwQywgMHg4MkZCLCAweDgyRDMsIDB4ODMxMSwgMHg4MzFBLCAweDgzMDYsIDB4ODMxNCwgMHg4MzE1LAorICAgIDB4ODJFMCwgMHg4MkQ1LCAweDgzMUMsIDB4ODM1MSwgMHg4MzVCLCAweDgzNUMsIDB4ODMwOCwgMHg4MzkyLCAweDgzM0MsCisgICAgMHg4MzM0LCAweDgzMzEsIDB4ODM5QiwgMHg4MzVFLCAweDgzMkYsIDB4ODM0RiwgMHg4MzQ3LCAweDgzNDMsIDB4ODM1RiwKKyAgICAweDgzNDAsIDB4ODMxNywgMHg4MzYwLCAweDgzMkQsIDB4ODMzQSwgMHg4MzMzLCAweDgzNjYsIDB4ODM2NSwgMHg4MzY4LAorICAgIDB4ODMxQiwgMHg4MzY5LCAweDgzNkMsIDB4ODM2QSwgMHg4MzZELCAweDgzNkUsIDB4ODNCMCwgMHg4Mzc4LCAweDgzQjMsCisgICAgMHg4M0I0LCAweDgzQTAsIDB4ODNBQSwgMHg4MzkzLCAweDgzOUMsIDB4ODM4NSwgMHg4MzdDLCAweDgzQjYsIDB4ODNBOSwKKyAgICAweDgzN0QsIDB4ODNCOCwgMHg4MzdCLCAweDgzOTgsIDB4ODM5RSwgMHg4M0E4LCAweDgzQkEsIDB4ODNCQywgMHg4M0MxLAorICAgIDB4ODQwMSwgMHg4M0U1LCAweDgzRDgsIDB4NTgwNywgMHg4NDE4LCAweDg0MEIsIDB4ODNERCwgMHg4M0ZELCAweDgzRDYsCisgICAgMHg4NDFDLCAweDg0MzgsIDB4ODQxMSwgMHg4NDA2LCAweDgzRDQsIDB4ODNERiwgMHg4NDBGLCAweDg0MDMsIDB4ODNGOCwKKyAgICAweDgzRjksIDB4ODNFQSwgMHg4M0M1LCAweDgzQzAsIDB4ODQyNiwgMHg4M0YwLCAweDgzRTEsIDB4ODQ1QywgMHg4NDUxLAorICAgIDB4ODQ1QSwgMHg4NDU5LCAweDg0NzMsIDB4ODQ4NywgMHg4NDg4LCAweDg0N0EsIDB4ODQ4OSwgMHg4NDc4LCAweDg0M0MsCisgICAgMHg4NDQ2LCAweDg0NjksIDB4ODQ3NiwgMHg4NDhDLCAweDg0OEUsIDB4ODQzMSwgMHg4NDZELCAweDg0QzEsIDB4ODRDRCwKKyAgICAweDg0RDAsIDB4ODRFNiwgMHg4NEJELCAweDg0RDMsIDB4ODRDQSwgMHg4NEJGLCAweDg0QkEsIDB4ODRFMCwgMHg4NEExLAorICAgIDB4ODRCOSwgMHg4NEI0LCAweDg0OTcsIDB4ODRFNSwgMHg4NEUzLCAweDg1MEMsIDB4NzUwRCwgMHg4NTM4LCAweDg0RjAsCisgICAgMHg4NTM5LCAweDg1MUYsIDB4ODUzQSwgMHg4NTU2LCAweDg1M0IsIDB4ODRGRiwgMHg4NEZDLCAweDg1NTksIDB4ODU0OCwKKyAgICAweDg1NjgsIDB4ODU2NCwgMHg4NTVFLCAweDg1N0EsIDB4NzdBMiwgMHg4NTQzLCAweDg1NzIsIDB4ODU3QiwgMHg4NUE0LAorICAgIDB4ODVBOCwgMHg4NTg3LCAweDg1OEYsIDB4ODU3OSwgMHg4NUFFLCAweDg1OUMsIDB4ODU4NSwgMHg4NUI5LCAweDg1QjcsCisgICAgMHg4NUIwLCAweDg1RDMsIDB4ODVDMSwgMHg4NURDLCAweDg1RkYsIDB4ODYyNywgMHg4NjA1LCAweDg2MjksIDB4ODYxNiwKKyAgICAweDg2M0MsIDB4NUVGRSwgMHg1RjA4LCAweDU5M0MsIDB4NTk0MSwgMHg4MDM3LCAweDU5NTUsIDB4NTk1QSwgMHg1OTU4LAorICAgIDB4NTMwRiwgMHg1QzIyLCAweDVDMjUsIDB4NUMyQywgMHg1QzM0LCAweDYyNEMsIDB4NjI2QSwgMHg2MjlGLCAweDYyQkIsCisgICAgMHg2MkNBLCAweDYyREEsIDB4NjJENywgMHg2MkVFLCAweDYzMjIsIDB4NjJGNiwgMHg2MzM5LCAweDYzNEIsIDB4NjM0MywKKyAgICAweDYzQUQsIDB4NjNGNiwgMHg2MzcxLCAweDYzN0EsIDB4NjM4RSwgMHg2M0I0LCAweDYzNkQsIDB4NjNBQywgMHg2MzhBLAorICAgIDB4NjM2OSwgMHg2M0FFLCAweDYzQkMsIDB4NjNGMiwgMHg2M0Y4LCAweDYzRTAsIDB4NjNGRiwgMHg2M0M0LCAweDYzREUsCisgICAgMHg2M0NFLCAweDY0NTIsIDB4NjNDNiwgMHg2M0JFLCAweDY0NDUsIDB4NjQ0MSwgMHg2NDBCLCAweDY0MUIsIDB4NjQyMCwKKyAgICAweDY0MEMsIDB4NjQyNiwgMHg2NDIxLCAweDY0NUUsIDB4NjQ4NCwgMHg2NDZELCAweDY0OTYsIDB4NjQ3QSwgMHg2NEI3LAorICAgIDB4NjRCOCwgMHg2NDk5LCAweDY0QkEsIDB4NjRDMCwgMHg2NEQwLCAweDY0RDcsIDB4NjRFNCwgMHg2NEUyLCAweDY1MDksCisgICAgMHg2NTI1LCAweDY1MkUsIDB4NUYwQiwgMHg1RkQyLCAweDc1MTksIDB4NUYxMSwgMHg1MzVGLCAweDUzRjEsIDB4NTNGRCwKKyAgICAweDUzRTksIDB4NTNFOCwgMHg1M0ZCLCAweDU0MTIsIDB4NTQxNiwgMHg1NDA2LCAweDU0NEIsIDB4NTQ1MiwgMHg1NDUzLAorICAgIDB4NTQ1NCwgMHg1NDU2LCAweDU0NDMsIDB4NTQyMSwgMHg1NDU3LCAweDU0NTksIDB4NTQyMywgMHg1NDMyLCAweDU0ODIsCisgICAgMHg1NDk0LCAweDU0NzcsIDB4NTQ3MSwgMHg1NDY0LCAweDU0OUEsIDB4NTQ5QiwgMHg1NDg0LCAweDU0NzYsIDB4NTQ2NiwKKyAgICAweDU0OUQsIDB4NTREMCwgMHg1NEFELCAweDU0QzIsIDB4NTRCNCwgMHg1NEQyLCAweDU0QTcsIDB4NTRBNiwgMHg1NEQzLAorICAgIDB4NTRENCwgMHg1NDcyLCAweDU0QTMsIDB4NTRENSwgMHg1NEJCLCAweDU0QkYsIDB4NTRDQywgMHg1NEQ5LCAweDU0REEsCisgICAgMHg1NERDLCAweDU0QTksIDB4NTRBQSwgMHg1NEE0LCAweDU0REQsIDB4NTRDRiwgMHg1NERFLCAweDU1MUIsIDB4NTRFNywKKyAgICAweDU1MjAsIDB4NTRGRCwgMHg1NTE0LCAweDU0RjMsIDB4NTUyMiwgMHg1NTIzLCAweDU1MEYsIDB4NTUxMSwgMHg1NTI3LAorICAgIDB4NTUyQSwgMHg1NTY3LCAweDU1OEYsIDB4NTVCNSwgMHg1NTQ5LCAweDU1NkQsIDB4NTU0MSwgMHg1NTU1LCAweDU1M0YsCisgICAgMHg1NTUwLCAweDU1M0MsIDB4NTUzNywgMHg1NTU2LCAweDU1NzUsIDB4NTU3NiwgMHg1NTc3LCAweDU1MzMsIDB4NTUzMCwKKyAgICAweDU1NUMsIDB4NTU4QiwgMHg1NUQyLCAweDU1ODMsIDB4NTVCMSwgMHg1NUI5LCAweDU1ODgsIDB4NTU4MSwgMHg1NTlGLAorICAgIDB4NTU3RSwgMHg1NUQ2LCAweDU1OTEsIDB4NTU3QiwgMHg1NURGLCAweDU1QkQsIDB4NTVCRSwgMHg1NTk0LCAweDU1OTksCisgICAgMHg1NUVBLCAweDU1RjcsIDB4NTVDOSwgMHg1NjFGLCAweDU1RDEsIDB4NTVFQiwgMHg1NUVDLCAweDU1RDQsIDB4NTVFNiwKKyAgICAweDU1REQsIDB4NTVDNCwgMHg1NUVGLCAweDU1RTUsIDB4NTVGMiwgMHg1NUYzLCAweDU1Q0MsIDB4NTVDRCwgMHg1NUU4LAorICAgIDB4NTVGNSwgMHg1NUU0LCAweDhGOTQsIDB4NTYxRSwgMHg1NjA4LCAweDU2MEMsIDB4NTYwMSwgMHg1NjI0LCAweDU2MjMsCisgICAgMHg1NUZFLCAweDU2MDAsIDB4NTYyNywgMHg1NjJELCAweDU2NTgsIDB4NTYzOSwgMHg1NjU3LCAweDU2MkMsIDB4NTY0RCwKKyAgICAweDU2NjIsIDB4NTY1OSwgMHg1NjVDLCAweDU2NEMsIDB4NTY1NCwgMHg1Njg2LCAweDU2NjQsIDB4NTY3MSwgMHg1NjZCLAorICAgIDB4NTY3QiwgMHg1NjdDLCAweDU2ODUsIDB4NTY5MywgMHg1NkFGLCAweDU2RDQsIDB4NTZENywgMHg1NkRELCAweDU2RTEsCisgICAgMHg1NkY1LCAweDU2RUIsIDB4NTZGOSwgMHg1NkZGLCAweDU3MDQsIDB4NTcwQSwgMHg1NzA5LCAweDU3MUMsIDB4NUUwRiwKKyAgICAweDVFMTksIDB4NUUxNCwgMHg1RTExLCAweDVFMzEsIDB4NUUzQiwgMHg1RTNDLCAweDVFMzcsIDB4NUU0NCwgMHg1RTU0LAorICAgIDB4NUU1QiwgMHg1RTVFLCAweDVFNjEsIDB4NUM4QywgMHg1QzdBLCAweDVDOEQsIDB4NUM5MCwgMHg1Qzk2LCAweDVDODgsCisgICAgMHg1Qzk4LCAweDVDOTksIDB4NUM5MSwgMHg1QzlBLCAweDVDOUMsIDB4NUNCNSwgMHg1Q0EyLCAweDVDQkQsIDB4NUNBQywKKyAgICAweDVDQUIsIDB4NUNCMSwgMHg1Q0EzLCAweDVDQzEsIDB4NUNCNywgMHg1Q0M0LCAweDVDRDIsIDB4NUNFNCwgMHg1Q0NCLAorICAgIDB4NUNFNSwgMHg1RDAyLCAweDVEMDMsIDB4NUQyNywgMHg1RDI2LCAweDVEMkUsIDB4NUQyNCwgMHg1RDFFLCAweDVEMDYsCisgICAgMHg1RDFCLCAweDVENTgsIDB4NUQzRSwgMHg1RDM0LCAweDVEM0QsIDB4NUQ2QywgMHg1RDVCLCAweDVENkYsIDB4NUQ1RCwKKyAgICAweDVENkIsIDB4NUQ0QiwgMHg1RDRBLCAweDVENjksIDB4NUQ3NCwgMHg1RDgyLCAweDVEOTksIDB4NUQ5RCwgMHg4QzczLAorICAgIDB4NURCNywgMHg1REM1LCAweDVGNzMsIDB4NUY3NywgMHg1RjgyLCAweDVGODcsIDB4NUY4OSwgMHg1RjhDLCAweDVGOTUsCisgICAgMHg1Rjk5LCAweDVGOUMsIDB4NUZBOCwgMHg1RkFELCAweDVGQjUsIDB4NUZCQywgMHg4ODYyLCAweDVGNjEsIDB4NzJBRCwKKyAgICAweDcyQjAsIDB4NzJCNCwgMHg3MkI3LCAweDcyQjgsIDB4NzJDMywgMHg3MkMxLCAweDcyQ0UsIDB4NzJDRCwgMHg3MkQyLAorICAgIDB4NzJFOCwgMHg3MkVGLCAweDcyRTksIDB4NzJGMiwgMHg3MkY0LCAweDcyRjcsIDB4NzMwMSwgMHg3MkYzLCAweDczMDMsCisgICAgMHg3MkZBLCAweDcyRkIsIDB4NzMxNywgMHg3MzEzLCAweDczMjEsIDB4NzMwQSwgMHg3MzFFLCAweDczMUQsIDB4NzMxNSwKKyAgICAweDczMjIsIDB4NzMzOSwgMHg3MzI1LCAweDczMkMsIDB4NzMzOCwgMHg3MzMxLCAweDczNTAsIDB4NzM0RCwgMHg3MzU3LAorICAgIDB4NzM2MCwgMHg3MzZDLCAweDczNkYsIDB4NzM3RSwgMHg4MjFCLCAweDU5MjUsIDB4OThFNywgMHg1OTI0LCAweDU5MDIsCisgICAgMHg5OTYzLCAweDk5NjcsIDB4OTk2OCwgMHg5OTY5LCAweDk5NkEsIDB4OTk2QiwgMHg5OTZDLCAweDk5NzQsIDB4OTk3NywKKyAgICAweDk5N0QsIDB4OTk4MCwgMHg5OTg0LCAweDk5ODcsIDB4OTk4QSwgMHg5OThELCAweDk5OTAsIDB4OTk5MSwgMHg5OTkzLAorICAgIDB4OTk5NCwgMHg5OTk1LCAweDVFODAsIDB4NUU5MSwgMHg1RThCLCAweDVFOTYsIDB4NUVBNSwgMHg1RUEwLCAweDVFQjksCisgICAgMHg1RUI1LCAweDVFQkUsIDB4NUVCMywgMHg4RDUzLCAweDVFRDIsIDB4NUVEMSwgMHg1RURCLCAweDVFRTgsIDB4NUVFQSwKKyAgICAweDgxQkEsIDB4NUZDNCwgMHg1RkM5LCAweDVGRDYsIDB4NUZDRiwgMHg2MDAzLCAweDVGRUUsIDB4NjAwNCwgMHg1RkUxLAorICAgIDB4NUZFNCwgMHg1RkZFLCAweDYwMDUsIDB4NjAwNiwgMHg1RkVBLCAweDVGRUQsIDB4NUZGOCwgMHg2MDE5LCAweDYwMzUsCisgICAgMHg2MDI2LCAweDYwMUIsIDB4NjAwRiwgMHg2MDBELCAweDYwMjksIDB4NjAyQiwgMHg2MDBBLCAweDYwM0YsIDB4NjAyMSwKKyAgICAweDYwNzgsIDB4NjA3OSwgMHg2MDdCLCAweDYwN0EsIDB4NjA0MiwgMHg2MDZBLCAweDYwN0QsIDB4NjA5NiwgMHg2MDlBLAorICAgIDB4NjBBRCwgMHg2MDlELCAweDYwODMsIDB4NjA5MiwgMHg2MDhDLCAweDYwOUIsIDB4NjBFQywgMHg2MEJCLCAweDYwQjEsCisgICAgMHg2MERELCAweDYwRDgsIDB4NjBDNiwgMHg2MERBLCAweDYwQjQsIDB4NjEyMCwgMHg2MTI2LCAweDYxMTUsIDB4NjEyMywKKyAgICAweDYwRjQsIDB4NjEwMCwgMHg2MTBFLCAweDYxMkIsIDB4NjE0QSwgMHg2MTc1LCAweDYxQUMsIDB4NjE5NCwgMHg2MUE3LAorICAgIDB4NjFCNywgMHg2MUQ0LCAweDYxRjUsIDB4NUZERCwgMHg5NkIzLCAweDk1RTksIDB4OTVFQiwgMHg5NUYxLCAweDk1RjMsCisgICAgMHg5NUY1LCAweDk1RjYsIDB4OTVGQywgMHg5NUZFLCAweDk2MDMsIDB4OTYwNCwgMHg5NjA2LCAweDk2MDgsIDB4OTYwQSwKKyAgICAweDk2MEIsIDB4OTYwQywgMHg5NjBELCAweDk2MEYsIDB4OTYxMiwgMHg5NjE1LCAweDk2MTYsIDB4OTYxNywgMHg5NjE5LAorICAgIDB4OTYxQSwgMHg0RTJDLCAweDcyM0YsIDB4NjIxNSwgMHg2QzM1LCAweDZDNTQsIDB4NkM1QywgMHg2QzRBLCAweDZDQTMsCisgICAgMHg2Qzg1LCAweDZDOTAsIDB4NkM5NCwgMHg2QzhDLCAweDZDNjgsIDB4NkM2OSwgMHg2Qzc0LCAweDZDNzYsIDB4NkM4NiwKKyAgICAweDZDQTksIDB4NkNEMCwgMHg2Q0Q0LCAweDZDQUQsIDB4NkNGNywgMHg2Q0Y4LCAweDZDRjEsIDB4NkNENywgMHg2Q0IyLAorICAgIDB4NkNFMCwgMHg2Q0Q2LCAweDZDRkEsIDB4NkNFQiwgMHg2Q0VFLCAweDZDQjEsIDB4NkNEMywgMHg2Q0VGLCAweDZDRkUsCisgICAgMHg2RDM5LCAweDZEMjcsIDB4NkQwQywgMHg2RDQzLCAweDZENDgsIDB4NkQwNywgMHg2RDA0LCAweDZEMTksIDB4NkQwRSwKKyAgICAweDZEMkIsIDB4NkQ0RCwgMHg2RDJFLCAweDZEMzUsIDB4NkQxQSwgMHg2RDRGLCAweDZENTIsIDB4NkQ1NCwgMHg2RDMzLAorICAgIDB4NkQ5MSwgMHg2RDZGLCAweDZEOUUsIDB4NkRBMCwgMHg2RDVFLCAweDZEOTMsIDB4NkQ5NCwgMHg2RDVDLCAweDZENjAsCisgICAgMHg2RDdDLCAweDZENjMsIDB4NkUxQSwgMHg2REM3LCAweDZEQzUsIDB4NkRERSwgMHg2RTBFLCAweDZEQkYsIDB4NkRFMCwKKyAgICAweDZFMTEsIDB4NkRFNiwgMHg2RERELCAweDZERDksIDB4NkUxNiwgMHg2REFCLCAweDZFMEMsIDB4NkRBRSwgMHg2RTJCLAorICAgIDB4NkU2RSwgMHg2RTRFLCAweDZFNkIsIDB4NkVCMiwgMHg2RTVGLCAweDZFODYsIDB4NkU1MywgMHg2RTU0LCAweDZFMzIsCisgICAgMHg2RTI1LCAweDZFNDQsIDB4NkVERiwgMHg2RUIxLCAweDZFOTgsIDB4NkVFMCwgMHg2RjJELCAweDZFRTIsIDB4NkVBNSwKKyAgICAweDZFQTcsIDB4NkVCRCwgMHg2RUJCLCAweDZFQjcsIDB4NkVENywgMHg2RUI0LCAweDZFQ0YsIDB4NkU4RiwgMHg2RUMyLAorICAgIDB4NkU5RiwgMHg2RjYyLCAweDZGNDYsIDB4NkY0NywgMHg2RjI0LCAweDZGMTUsIDB4NkVGOSwgMHg2RjJGLCAweDZGMzYsCisgICAgMHg2RjRCLCAweDZGNzQsIDB4NkYyQSwgMHg2RjA5LCAweDZGMjksIDB4NkY4OSwgMHg2RjhELCAweDZGOEMsIDB4NkY3OCwKKyAgICAweDZGNzIsIDB4NkY3QywgMHg2RjdBLCAweDZGRDEsIDB4NkZDOSwgMHg2RkE3LCAweDZGQjksIDB4NkZCNiwgMHg2RkMyLAorICAgIDB4NkZFMSwgMHg2RkVFLCAweDZGREUsIDB4NkZFMCwgMHg2RkVGLCAweDcwMUEsIDB4NzAyMywgMHg3MDFCLCAweDcwMzksCisgICAgMHg3MDM1LCAweDcwNEYsIDB4NzA1RSwgMHg1QjgwLCAweDVCODQsIDB4NUI5NSwgMHg1QjkzLCAweDVCQTUsIDB4NUJCOCwKKyAgICAweDc1MkYsIDB4OUE5RSwgMHg2NDM0LCAweDVCRTQsIDB4NUJFRSwgMHg4OTMwLCAweDVCRjAsIDB4OEU0NywgMHg4QjA3LAorICAgIDB4OEZCNiwgMHg4RkQzLCAweDhGRDUsIDB4OEZFNSwgMHg4RkVFLCAweDhGRTQsIDB4OEZFOSwgMHg4RkU2LCAweDhGRjMsCisgICAgMHg4RkU4LCAweDkwMDUsIDB4OTAwNCwgMHg5MDBCLCAweDkwMjYsIDB4OTAxMSwgMHg5MDBELCAweDkwMTYsIDB4OTAyMSwKKyAgICAweDkwMzUsIDB4OTAzNiwgMHg5MDJELCAweDkwMkYsIDB4OTA0NCwgMHg5MDUxLCAweDkwNTIsIDB4OTA1MCwgMHg5MDY4LAorICAgIDB4OTA1OCwgMHg5MDYyLCAweDkwNUIsIDB4NjZCOSwgMHg5MDc0LCAweDkwN0QsIDB4OTA4MiwgMHg5MDg4LCAweDkwODMsCisgICAgMHg5MDhCLCAweDVGNTAsIDB4NUY1NywgMHg1RjU2LCAweDVGNTgsIDB4NUMzQiwgMHg1NEFCLCAweDVDNTAsIDB4NUM1OSwKKyAgICAweDVCNzEsIDB4NUM2MywgMHg1QzY2LCAweDdGQkMsIDB4NUYyQSwgMHg1RjI5LCAweDVGMkQsIDB4ODI3NCwgMHg1RjNDLAorICAgIDB4OUIzQiwgMHg1QzZFLCAweDU5ODEsIDB4NTk4MywgMHg1OThELCAweDU5QTksIDB4NTlBQSwgMHg1OUEzLCAweDU5OTcsCisgICAgMHg1OUNBLCAweDU5QUIsIDB4NTk5RSwgMHg1OUE0LCAweDU5RDIsIDB4NTlCMiwgMHg1OUFGLCAweDU5RDcsIDB4NTlCRSwKKyAgICAweDVBMDUsIDB4NUEwNiwgMHg1OURELCAweDVBMDgsIDB4NTlFMywgMHg1OUQ4LCAweDU5RjksIDB4NUEwQywgMHg1QTA5LAorICAgIDB4NUEzMiwgMHg1QTM0LCAweDVBMTEsIDB4NUEyMywgMHg1QTEzLCAweDVBNDAsIDB4NUE2NywgMHg1QTRBLCAweDVBNTUsCisgICAgMHg1QTNDLCAweDVBNjIsIDB4NUE3NSwgMHg4MEVDLCAweDVBQUEsIDB4NUE5QiwgMHg1QTc3LCAweDVBN0EsIDB4NUFCRSwKKyAgICAweDVBRUIsIDB4NUFCMiwgMHg1QUQyLCAweDVBRDQsIDB4NUFCOCwgMHg1QUUwLCAweDVBRTMsIDB4NUFGMSwgMHg1QUQ2LAorICAgIDB4NUFFNiwgMHg1QUQ4LCAweDVBREMsIDB4NUIwOSwgMHg1QjE3LCAweDVCMTYsIDB4NUIzMiwgMHg1QjM3LCAweDVCNDAsCisgICAgMHg1QzE1LCAweDVDMUMsIDB4NUI1QSwgMHg1QjY1LCAweDVCNzMsIDB4NUI1MSwgMHg1QjUzLCAweDVCNjIsIDB4OUE3NSwKKyAgICAweDlBNzcsIDB4OUE3OCwgMHg5QTdBLCAweDlBN0YsIDB4OUE3RCwgMHg5QTgwLCAweDlBODEsIDB4OUE4NSwgMHg5QTg4LAorICAgIDB4OUE4QSwgMHg5QTkwLCAweDlBOTIsIDB4OUE5MywgMHg5QTk2LCAweDlBOTgsIDB4OUE5QiwgMHg5QTlDLCAweDlBOUQsCisgICAgMHg5QTlGLCAweDlBQTAsIDB4OUFBMiwgMHg5QUEzLCAweDlBQTUsIDB4OUFBNywgMHg3RTlGLCAweDdFQTEsIDB4N0VBMywKKyAgICAweDdFQTUsIDB4N0VBOCwgMHg3RUE5LCAweDdFQUQsIDB4N0VCMCwgMHg3RUJFLCAweDdFQzAsIDB4N0VDMSwgMHg3RUMyLAorICAgIDB4N0VDOSwgMHg3RUNCLCAweDdFQ0MsIDB4N0VEMCwgMHg3RUQ0LCAweDdFRDcsIDB4N0VEQiwgMHg3RUUwLCAweDdFRTEsCisgICAgMHg3RUU4LCAweDdFRUIsIDB4N0VFRSwgMHg3RUVGLCAweDdFRjEsIDB4N0VGMiwgMHg3RjBELCAweDdFRjYsIDB4N0VGQSwKKyAgICAweDdFRkIsIDB4N0VGRSwgMHg3RjAxLCAweDdGMDIsIDB4N0YwMywgMHg3RjA3LCAweDdGMDgsIDB4N0YwQiwgMHg3RjBDLAorICAgIDB4N0YwRiwgMHg3RjExLCAweDdGMTIsIDB4N0YxNywgMHg3RjE5LCAweDdGMUMsIDB4N0YxQiwgMHg3RjFGLCAweDdGMjEsCisgICAgMHg3RjIyLCAweDdGMjMsIDB4N0YyNCwgMHg3RjI1LCAweDdGMjYsIDB4N0YyNywgMHg3RjJBLCAweDdGMkIsIDB4N0YyQywKKyAgICAweDdGMkQsIDB4N0YyRiwgMHg3RjMwLCAweDdGMzEsIDB4N0YzMiwgMHg3RjMzLCAweDdGMzUsIDB4NUU3QSwgMHg3NTdGLAorICAgIDB4NUREQiwgMHg3NTNFLCAweDkwOTUsIDB4NzM4RSwgMHg3MzkxLCAweDczQUUsIDB4NzNBMiwgMHg3MzlGLCAweDczQ0YsCisgICAgMHg3M0MyLCAweDczRDEsIDB4NzNCNywgMHg3M0IzLCAweDczQzAsIDB4NzNDOSwgMHg3M0M4LCAweDczRTUsIDB4NzNEOSwKKyAgICAweDk4N0MsIDB4NzQwQSwgMHg3M0U5LCAweDczRTcsIDB4NzNERSwgMHg3M0JBLCAweDczRjIsIDB4NzQwRiwgMHg3NDJBLAorICAgIDB4NzQ1QiwgMHg3NDI2LCAweDc0MjUsIDB4NzQyOCwgMHg3NDMwLCAweDc0MkUsIDB4NzQyQywgMHg3NDFCLCAweDc0MUEsCisgICAgMHg3NDQxLCAweDc0NUMsIDB4NzQ1NywgMHg3NDU1LCAweDc0NTksIDB4NzQ3NywgMHg3NDZELCAweDc0N0UsIDB4NzQ5QywKKyAgICAweDc0OEUsIDB4NzQ4MCwgMHg3NDgxLCAweDc0ODcsIDB4NzQ4QiwgMHg3NDlFLCAweDc0QTgsIDB4NzRBOSwgMHg3NDkwLAorICAgIDB4NzRBNywgMHg3NEQyLCAweDc0QkEsIDB4OTdFQSwgMHg5N0VCLCAweDk3RUMsIDB4Njc0QywgMHg2NzUzLCAweDY3NUUsCisgICAgMHg2NzQ4LCAweDY3NjksIDB4NjdBNSwgMHg2Nzg3LCAweDY3NkEsIDB4Njc3MywgMHg2Nzk4LCAweDY3QTcsIDB4Njc3NSwKKyAgICAweDY3QTgsIDB4Njc5RSwgMHg2N0FELCAweDY3OEIsIDB4Njc3NywgMHg2NzdDLCAweDY3RjAsIDB4NjgwOSwgMHg2N0Q4LAorICAgIDB4NjgwQSwgMHg2N0U5LCAweDY3QjAsIDB4NjgwQywgMHg2N0Q5LCAweDY3QjUsIDB4NjdEQSwgMHg2N0IzLCAweDY3REQsCisgICAgMHg2ODAwLCAweDY3QzMsIDB4NjdCOCwgMHg2N0UyLCAweDY4MEUsIDB4NjdDMSwgMHg2N0ZELCAweDY4MzIsIDB4NjgzMywKKyAgICAweDY4NjAsIDB4Njg2MSwgMHg2ODRFLCAweDY4NjIsIDB4Njg0NCwgMHg2ODY0LCAweDY4ODMsIDB4NjgxRCwgMHg2ODU1LAorICAgIDB4Njg2NiwgMHg2ODQxLCAweDY4NjcsIDB4Njg0MCwgMHg2ODNFLCAweDY4NEEsIDB4Njg0OSwgMHg2ODI5LCAweDY4QjUsCisgICAgMHg2ODhGLCAweDY4NzQsIDB4Njg3NywgMHg2ODkzLCAweDY4NkIsIDB4NjhDMiwgMHg2OTZFLCAweDY4RkMsIDB4NjkxRiwKKyAgICAweDY5MjAsIDB4NjhGOSwgMHg2OTI0LCAweDY4RjAsIDB4NjkwQiwgMHg2OTAxLCAweDY5NTcsIDB4NjhFMywgMHg2OTEwLAorICAgIDB4Njk3MSwgMHg2OTM5LCAweDY5NjAsIDB4Njk0MiwgMHg2OTVELCAweDY5ODQsIDB4Njk2QiwgMHg2OTgwLCAweDY5OTgsCisgICAgMHg2OTc4LCAweDY5MzQsIDB4NjlDQywgMHg2OTg3LCAweDY5ODgsIDB4NjlDRSwgMHg2OTg5LCAweDY5NjYsIDB4Njk2MywKKyAgICAweDY5NzksIDB4Njk5QiwgMHg2OUE3LCAweDY5QkIsIDB4NjlBQiwgMHg2OUFELCAweDY5RDQsIDB4NjlCMSwgMHg2OUMxLAorICAgIDB4NjlDQSwgMHg2OURGLCAweDY5OTUsIDB4NjlFMCwgMHg2OThELCAweDY5RkYsIDB4NkEyRiwgMHg2OUVELCAweDZBMTcsCisgICAgMHg2QTE4LCAweDZBNjUsIDB4NjlGMiwgMHg2QTQ0LCAweDZBM0UsIDB4NkFBMCwgMHg2QTUwLCAweDZBNUIsIDB4NkEzNSwKKyAgICAweDZBOEUsIDB4NkE3OSwgMHg2QTNELCAweDZBMjgsIDB4NkE1OCwgMHg2QTdDLCAweDZBOTEsIDB4NkE5MCwgMHg2QUE5LAorICAgIDB4NkE5NywgMHg2QUFCLCAweDczMzcsIDB4NzM1MiwgMHg2QjgxLCAweDZCODIsIDB4NkI4NywgMHg2Qjg0LCAweDZCOTIsCisgICAgMHg2QjkzLCAweDZCOEQsIDB4NkI5QSwgMHg2QjlCLCAweDZCQTEsIDB4NkJBQSwgMHg4RjZCLCAweDhGNkQsIDB4OEY3MSwKKyAgICAweDhGNzIsIDB4OEY3MywgMHg4Rjc1LCAweDhGNzYsIDB4OEY3OCwgMHg4Rjc3LCAweDhGNzksIDB4OEY3QSwgMHg4RjdDLAorICAgIDB4OEY3RSwgMHg4RjgxLCAweDhGODIsIDB4OEY4NCwgMHg4Rjg3LCAweDhGOEIsIDB4OEY4RCwgMHg4RjhFLCAweDhGOEYsCisgICAgMHg4Rjk4LCAweDhGOUEsIDB4OEVDRSwgMHg2MjBCLCAweDYyMTcsIDB4NjIxQiwgMHg2MjFGLCAweDYyMjIsIDB4NjIyMSwKKyAgICAweDYyMjUsIDB4NjIyNCwgMHg2MjJDLCAweDgxRTcsIDB4NzRFRiwgMHg3NEY0LCAweDc0RkYsIDB4NzUwRiwgMHg3NTExLAorICAgIDB4NzUxMywgMHg2NTM0LCAweDY1RUUsIDB4NjVFRiwgMHg2NUYwLCAweDY2MEEsIDB4NjYxOSwgMHg2NzcyLCAweDY2MDMsCisgICAgMHg2NjE1LCAweDY2MDAsIDB4NzA4NSwgMHg2NkY3LCAweDY2MUQsIDB4NjYzNCwgMHg2NjMxLCAweDY2MzYsIDB4NjYzNSwKKyAgICAweDgwMDYsIDB4NjY1RiwgMHg2NjU0LCAweDY2NDEsIDB4NjY0RiwgMHg2NjU2LCAweDY2NjEsIDB4NjY1NywgMHg2Njc3LAorICAgIDB4NjY4NCwgMHg2NjhDLCAweDY2QTcsIDB4NjY5RCwgMHg2NkJFLCAweDY2REIsIDB4NjZEQywgMHg2NkU2LCAweDY2RTksCisgICAgMHg4RDMyLCAweDhEMzMsIDB4OEQzNiwgMHg4RDNCLCAweDhEM0QsIDB4OEQ0MCwgMHg4RDQ1LCAweDhENDYsIDB4OEQ0OCwKKyAgICAweDhENDksIDB4OEQ0NywgMHg4RDRELCAweDhENTUsIDB4OEQ1OSwgMHg4OUM3LCAweDg5Q0EsIDB4ODlDQiwgMHg4OUNDLAorICAgIDB4ODlDRSwgMHg4OUNGLCAweDg5RDAsIDB4ODlEMSwgMHg3MjZFLCAweDcyOUYsIDB4NzI1RCwgMHg3MjY2LCAweDcyNkYsCisgICAgMHg3MjdFLCAweDcyN0YsIDB4NzI4NCwgMHg3MjhCLCAweDcyOEQsIDB4NzI4RiwgMHg3MjkyLCAweDYzMDgsIDB4NjMzMiwKKyAgICAweDYzQjAsIDB4NjQzRiwgMHg2NEQ4LCAweDgwMDQsIDB4NkJFQSwgMHg2QkYzLCAweDZCRkQsIDB4NkJGNSwgMHg2QkY5LAorICAgIDB4NkMwNSwgMHg2QzA3LCAweDZDMDYsIDB4NkMwRCwgMHg2QzE1LCAweDZDMTgsIDB4NkMxOSwgMHg2QzFBLCAweDZDMjEsCisgICAgMHg2QzI5LCAweDZDMjQsIDB4NkMyQSwgMHg2QzMyLCAweDY1MzUsIDB4NjU1NSwgMHg2NTZCLCAweDcyNEQsIDB4NzI1MiwKKyAgICAweDcyNTYsIDB4NzIzMCwgMHg4NjYyLCAweDUyMTYsIDB4ODA5RiwgMHg4MDlDLCAweDgwOTMsIDB4ODBCQywgMHg2NzBBLAorICAgIDB4ODBCRCwgMHg4MEIxLCAweDgwQUIsIDB4ODBBRCwgMHg4MEI0LCAweDgwQjcsIDB4ODBFNywgMHg4MEU4LCAweDgwRTksCisgICAgMHg4MEVBLCAweDgwREIsIDB4ODBDMiwgMHg4MEM0LCAweDgwRDksIDB4ODBDRCwgMHg4MEQ3LCAweDY3MTAsIDB4ODBERCwKKyAgICAweDgwRUIsIDB4ODBGMSwgMHg4MEY0LCAweDgwRUQsIDB4ODEwRCwgMHg4MTBFLCAweDgwRjIsIDB4ODBGQywgMHg2NzE1LAorICAgIDB4ODExMiwgMHg4QzVBLCAweDgxMzYsIDB4ODExRSwgMHg4MTJDLCAweDgxMTgsIDB4ODEzMiwgMHg4MTQ4LCAweDgxNEMsCisgICAgMHg4MTUzLCAweDgxNzQsIDB4ODE1OSwgMHg4MTVBLCAweDgxNzEsIDB4ODE2MCwgMHg4MTY5LCAweDgxN0MsIDB4ODE3RCwKKyAgICAweDgxNkQsIDB4ODE2NywgMHg1ODRELCAweDVBQjUsIDB4ODE4OCwgMHg4MTgyLCAweDgxOTEsIDB4NkVENSwgMHg4MUEzLAorICAgIDB4ODFBQSwgMHg4MUNDLCAweDY3MjYsIDB4ODFDQSwgMHg4MUJCLCAweDgxQzEsIDB4ODFBNiwgMHg2QjI0LCAweDZCMzcsCisgICAgMHg2QjM5LCAweDZCNDMsIDB4NkI0NiwgMHg2QjU5LCAweDk4RDEsIDB4OThEMiwgMHg5OEQzLCAweDk4RDUsIDB4OThEOSwKKyAgICAweDk4REEsIDB4NkJCMywgMHg1RjQwLCAweDZCQzIsIDB4ODlGMywgMHg2NTkwLCAweDlGNTEsIDB4NjU5MywgMHg2NUJDLAorICAgIDB4NjVDNiwgMHg2NUM0LCAweDY1QzMsIDB4NjVDQywgMHg2NUNFLCAweDY1RDIsIDB4NjVENiwgMHg3MDgwLCAweDcwOUMsCisgICAgMHg3MDk2LCAweDcwOUQsIDB4NzBCQiwgMHg3MEMwLCAweDcwQjcsIDB4NzBBQiwgMHg3MEIxLCAweDcwRTgsIDB4NzBDQSwKKyAgICAweDcxMTAsIDB4NzExMywgMHg3MTE2LCAweDcxMkYsIDB4NzEzMSwgMHg3MTczLCAweDcxNUMsIDB4NzE2OCwgMHg3MTQ1LAorICAgIDB4NzE3MiwgMHg3MTRBLCAweDcxNzgsIDB4NzE3QSwgMHg3MTk4LCAweDcxQjMsIDB4NzFCNSwgMHg3MUE4LCAweDcxQTAsCisgICAgMHg3MUUwLCAweDcxRDQsIDB4NzFFNywgMHg3MUY5LCAweDcyMUQsIDB4NzIyOCwgMHg3MDZDLCAweDcxMTgsIDB4NzE2NiwKKyAgICAweDcxQjksIDB4NjIzRSwgMHg2MjNELCAweDYyNDMsIDB4NjI0OCwgMHg2MjQ5LCAweDc5M0IsIDB4Nzk0MCwgMHg3OTQ2LAorICAgIDB4Nzk0OSwgMHg3OTVCLCAweDc5NUMsIDB4Nzk1MywgMHg3OTVBLCAweDc5NjIsIDB4Nzk1NywgMHg3OTYwLCAweDc5NkYsCisgICAgMHg3OTY3LCAweDc5N0EsIDB4Nzk4NSwgMHg3OThBLCAweDc5OUEsIDB4NzlBNywgMHg3OUIzLCAweDVGRDEsIDB4NUZEMCwKKyAgICAweDYwM0MsIDB4NjA1RCwgMHg2MDVBLCAweDYwNjcsIDB4NjA0MSwgMHg2MDU5LCAweDYwNjMsIDB4NjBBQiwgMHg2MTA2LAorICAgIDB4NjEwRCwgMHg2MTVELCAweDYxQTksIDB4NjE5RCwgMHg2MUNCLCAweDYxRDEsIDB4NjIwNiwgMHg4MDgwLCAweDgwN0YsCisgICAgMHg2QzkzLCAweDZDRjYsIDB4NkRGQywgMHg3N0Y2LCAweDc3RjgsIDB4NzgwMCwgMHg3ODA5LCAweDc4MTcsIDB4NzgxOCwKKyAgICAweDc4MTEsIDB4NjVBQiwgMHg3ODJELCAweDc4MUMsIDB4NzgxRCwgMHg3ODM5LCAweDc4M0EsIDB4NzgzQiwgMHg3ODFGLAorICAgIDB4NzgzQywgMHg3ODI1LCAweDc4MkMsIDB4NzgyMywgMHg3ODI5LCAweDc4NEUsIDB4Nzg2RCwgMHg3ODU2LCAweDc4NTcsCisgICAgMHg3ODI2LCAweDc4NTAsIDB4Nzg0NywgMHg3ODRDLCAweDc4NkEsIDB4Nzg5QiwgMHg3ODkzLCAweDc4OUEsIDB4Nzg4NywKKyAgICAweDc4OUMsIDB4NzhBMSwgMHg3OEEzLCAweDc4QjIsIDB4NzhCOSwgMHg3OEE1LCAweDc4RDQsIDB4NzhEOSwgMHg3OEM5LAorICAgIDB4NzhFQywgMHg3OEYyLCAweDc5MDUsIDB4NzhGNCwgMHg3OTEzLCAweDc5MjQsIDB4NzkxRSwgMHg3OTM0LCAweDlGOUIsCisgICAgMHg5RUY5LCAweDlFRkIsIDB4OUVGQywgMHg3NkYxLCAweDc3MDQsIDB4NzcwRCwgMHg3NkY5LCAweDc3MDcsIDB4NzcwOCwKKyAgICAweDc3MUEsIDB4NzcyMiwgMHg3NzE5LCAweDc3MkQsIDB4NzcyNiwgMHg3NzM1LCAweDc3MzgsIDB4Nzc1MCwgMHg3NzUxLAorICAgIDB4Nzc0NywgMHg3NzQzLCAweDc3NUEsIDB4Nzc2OCwgMHg3NzYyLCAweDc3NjUsIDB4Nzc3RiwgMHg3NzhELCAweDc3N0QsCisgICAgMHg3NzgwLCAweDc3OEMsIDB4Nzc5MSwgMHg3NzlGLCAweDc3QTAsIDB4NzdCMCwgMHg3N0I1LCAweDc3QkQsIDB4NzUzQSwKKyAgICAweDc1NDAsIDB4NzU0RSwgMHg3NTRCLCAweDc1NDgsIDB4NzU1QiwgMHg3NTcyLCAweDc1NzksIDB4NzU4MywgMHg3RjU4LAorICAgIDB4N0Y2MSwgMHg3RjVGLCAweDhBNDgsIDB4N0Y2OCwgMHg3Rjc0LCAweDdGNzEsIDB4N0Y3OSwgMHg3RjgxLCAweDdGN0UsCisgICAgMHg3NkNELCAweDc2RTUsIDB4ODgzMiwgMHg5NDg1LCAweDk0ODYsIDB4OTQ4NywgMHg5NDhCLCAweDk0OEEsIDB4OTQ4QywKKyAgICAweDk0OEQsIDB4OTQ4RiwgMHg5NDkwLCAweDk0OTQsIDB4OTQ5NywgMHg5NDk1LCAweDk0OUEsIDB4OTQ5QiwgMHg5NDlDLAorICAgIDB4OTRBMywgMHg5NEE0LCAweDk0QUIsIDB4OTRBQSwgMHg5NEFELCAweDk0QUMsIDB4OTRBRiwgMHg5NEIwLCAweDk0QjIsCisgICAgMHg5NEI0LCAweDk0QjYsIDB4OTRCNywgMHg5NEI4LCAweDk0QjksIDB4OTRCQSwgMHg5NEJDLCAweDk0QkQsIDB4OTRCRiwKKyAgICAweDk0QzQsIDB4OTRDOCwgMHg5NEM5LCAweDk0Q0EsIDB4OTRDQiwgMHg5NENDLCAweDk0Q0QsIDB4OTRDRSwgMHg5NEQwLAorICAgIDB4OTREMSwgMHg5NEQyLCAweDk0RDUsIDB4OTRENiwgMHg5NEQ3LCAweDk0RDksIDB4OTREOCwgMHg5NERCLCAweDk0REUsCisgICAgMHg5NERGLCAweDk0RTAsIDB4OTRFMiwgMHg5NEU0LCAweDk0RTUsIDB4OTRFNywgMHg5NEU4LCAweDk0RUEsIDB4OTRFOSwKKyAgICAweDk0RUIsIDB4OTRFRSwgMHg5NEVGLCAweDk0RjMsIDB4OTRGNCwgMHg5NEY1LCAweDk0RjcsIDB4OTRGOSwgMHg5NEZDLAorICAgIDB4OTRGRCwgMHg5NEZGLCAweDk1MDMsIDB4OTUwMiwgMHg5NTA2LCAweDk1MDcsIDB4OTUwOSwgMHg5NTBBLCAweDk1MEQsCisgICAgMHg5NTBFLCAweDk1MEYsIDB4OTUxMiwgMHg5NTEzLCAweDk1MTQsIDB4OTUxNSwgMHg5NTE2LCAweDk1MTgsIDB4OTUxQiwKKyAgICAweDk1MUQsIDB4OTUxRSwgMHg5NTFGLCAweDk1MjIsIDB4OTUyQSwgMHg5NTJCLCAweDk1MjksIDB4OTUyQywgMHg5NTMxLAorICAgIDB4OTUzMiwgMHg5NTM0LCAweDk1MzYsIDB4OTUzNywgMHg5NTM4LCAweDk1M0MsIDB4OTUzRSwgMHg5NTNGLCAweDk1NDIsCisgICAgMHg5NTM1LCAweDk1NDQsIDB4OTU0NSwgMHg5NTQ2LCAweDk1NDksIDB4OTU0QywgMHg5NTRFLCAweDk1NEYsIDB4OTU1MiwKKyAgICAweDk1NTMsIDB4OTU1NCwgMHg5NTU2LCAweDk1NTcsIDB4OTU1OCwgMHg5NTU5LCAweDk1NUIsIDB4OTU1RSwgMHg5NTVGLAorICAgIDB4OTU1RCwgMHg5NTYxLCAweDk1NjIsIDB4OTU2NCwgMHg5NTY1LCAweDk1NjYsIDB4OTU2NywgMHg5NTY4LCAweDk1NjksCisgICAgMHg5NTZBLCAweDk1NkIsIDB4OTU2QywgMHg5NTZGLCAweDk1NzEsIDB4OTU3MiwgMHg5NTczLCAweDk1M0EsIDB4NzdFNywKKyAgICAweDc3RUMsIDB4OTZDOSwgMHg3OUQ1LCAweDc5RUQsIDB4NzlFMywgMHg3OUVCLCAweDdBMDYsIDB4NUQ0NywgMHg3QTAzLAorICAgIDB4N0EwMiwgMHg3QTFFLCAweDdBMTQsIDB4N0EzOSwgMHg3QTM3LCAweDdBNTEsIDB4OUVDRiwgMHg5OUE1LCAweDdBNzAsCisgICAgMHg3Njg4LCAweDc2OEUsIDB4NzY5MywgMHg3Njk5LCAweDc2QTQsIDB4NzRERSwgMHg3NEUwLCAweDc1MkMsIDB4OUUyMCwKKyAgICAweDlFMjIsIDB4OUUyOCwgMHg5RTI5LCAweDlFMkEsIDB4OUUyQiwgMHg5RTJDLCAweDlFMzIsIDB4OUUzMSwgMHg5RTM2LAorICAgIDB4OUUzOCwgMHg5RTM3LCAweDlFMzksIDB4OUUzQSwgMHg5RTNFLCAweDlFNDEsIDB4OUU0MiwgMHg5RTQ0LCAweDlFNDYsCisgICAgMHg5RTQ3LCAweDlFNDgsIDB4OUU0OSwgMHg5RTRCLCAweDlFNEMsIDB4OUU0RSwgMHg5RTUxLCAweDlFNTUsIDB4OUU1NywKKyAgICAweDlFNUEsIDB4OUU1QiwgMHg5RTVDLCAweDlFNUUsIDB4OUU2MywgMHg5RTY2LCAweDlFNjcsIDB4OUU2OCwgMHg5RTY5LAorICAgIDB4OUU2QSwgMHg5RTZCLCAweDlFNkMsIDB4OUU3MSwgMHg5RTZELCAweDlFNzMsIDB4NzU5MiwgMHg3NTk0LCAweDc1OTYsCisgICAgMHg3NUEwLCAweDc1OUQsIDB4NzVBQywgMHg3NUEzLCAweDc1QjMsIDB4NzVCNCwgMHg3NUI4LCAweDc1QzQsIDB4NzVCMSwKKyAgICAweDc1QjAsIDB4NzVDMywgMHg3NUMyLCAweDc1RDYsIDB4NzVDRCwgMHg3NUUzLCAweDc1RTgsIDB4NzVFNiwgMHg3NUU0LAorICAgIDB4NzVFQiwgMHg3NUU3LCAweDc2MDMsIDB4NzVGMSwgMHg3NUZDLCAweDc1RkYsIDB4NzYxMCwgMHg3NjAwLCAweDc2MDUsCisgICAgMHg3NjBDLCAweDc2MTcsIDB4NzYwQSwgMHg3NjI1LCAweDc2MTgsIDB4NzYxNSwgMHg3NjE5LCAweDc2MUIsIDB4NzYzQywKKyAgICAweDc2MjIsIDB4NzYyMCwgMHg3NjQwLCAweDc2MkQsIDB4NzYzMCwgMHg3NjNGLCAweDc2MzUsIDB4NzY0MywgMHg3NjNFLAorICAgIDB4NzYzMywgMHg3NjRELCAweDc2NUUsIDB4NzY1NCwgMHg3NjVDLCAweDc2NTYsIDB4NzY2QiwgMHg3NjZGLCAweDdGQ0EsCisgICAgMHg3QUU2LCAweDdBNzgsIDB4N0E3OSwgMHg3QTgwLCAweDdBODYsIDB4N0E4OCwgMHg3QTk1LCAweDdBQTYsIDB4N0FBMCwKKyAgICAweDdBQUMsIDB4N0FBOCwgMHg3QUFELCAweDdBQjMsIDB4ODg2NCwgMHg4ODY5LCAweDg4NzIsIDB4ODg3RCwgMHg4ODdGLAorICAgIDB4ODg4MiwgMHg4OEEyLCAweDg4QzYsIDB4ODhCNywgMHg4OEJDLCAweDg4QzksIDB4ODhFMiwgMHg4OENFLCAweDg4RTMsCisgICAgMHg4OEU1LCAweDg4RjEsIDB4ODkxQSwgMHg4OEZDLCAweDg4RTgsIDB4ODhGRSwgMHg4OEYwLCAweDg5MjEsIDB4ODkxOSwKKyAgICAweDg5MTMsIDB4ODkxQiwgMHg4OTBBLCAweDg5MzQsIDB4ODkyQiwgMHg4OTM2LCAweDg5NDEsIDB4ODk2NiwgMHg4OTdCLAorICAgIDB4NzU4QiwgMHg4MEU1LCAweDc2QjIsIDB4NzZCNCwgMHg3N0RDLCAweDgwMTIsIDB4ODAxNCwgMHg4MDE2LCAweDgwMUMsCisgICAgMHg4MDIwLCAweDgwMjIsIDB4ODAyNSwgMHg4MDI2LCAweDgwMjcsIDB4ODAyOSwgMHg4MDI4LCAweDgwMzEsIDB4ODAwQiwKKyAgICAweDgwMzUsIDB4ODA0MywgMHg4MDQ2LCAweDgwNEQsIDB4ODA1MiwgMHg4MDY5LCAweDgwNzEsIDB4ODk4MywgMHg5ODc4LAorICAgIDB4OTg4MCwgMHg5ODgzLCAweDk4ODksIDB4OTg4QywgMHg5ODhELCAweDk4OEYsIDB4OTg5NCwgMHg5ODlBLCAweDk4OUIsCisgICAgMHg5ODlFLCAweDk4OUYsIDB4OThBMSwgMHg5OEEyLCAweDk4QTUsIDB4OThBNiwgMHg4NjRELCAweDg2NTQsIDB4ODY2QywKKyAgICAweDg2NkUsIDB4ODY3RiwgMHg4NjdBLCAweDg2N0MsIDB4ODY3QiwgMHg4NkE4LCAweDg2OEQsIDB4ODY4QiwgMHg4NkFDLAorICAgIDB4ODY5RCwgMHg4NkE3LCAweDg2QTMsIDB4ODZBQSwgMHg4NjkzLCAweDg2QTksIDB4ODZCNiwgMHg4NkM0LCAweDg2QjUsCisgICAgMHg4NkNFLCAweDg2QjAsIDB4ODZCQSwgMHg4NkIxLCAweDg2QUYsIDB4ODZDOSwgMHg4NkNGLCAweDg2QjQsIDB4ODZFOSwKKyAgICAweDg2RjEsIDB4ODZGMiwgMHg4NkVELCAweDg2RjMsIDB4ODZEMCwgMHg4NzEzLCAweDg2REUsIDB4ODZGNCwgMHg4NkRGLAorICAgIDB4ODZEOCwgMHg4NkQxLCAweDg3MDMsIDB4ODcwNywgMHg4NkY4LCAweDg3MDgsIDB4ODcwQSwgMHg4NzBELCAweDg3MDksCisgICAgMHg4NzIzLCAweDg3M0IsIDB4ODcxRSwgMHg4NzI1LCAweDg3MkUsIDB4ODcxQSwgMHg4NzNFLCAweDg3NDgsIDB4ODczNCwKKyAgICAweDg3MzEsIDB4ODcyOSwgMHg4NzM3LCAweDg3M0YsIDB4ODc4MiwgMHg4NzIyLCAweDg3N0QsIDB4ODc3RSwgMHg4NzdCLAorICAgIDB4ODc2MCwgMHg4NzcwLCAweDg3NEMsIDB4ODc2RSwgMHg4NzhCLCAweDg3NTMsIDB4ODc2MywgMHg4NzdDLCAweDg3NjQsCisgICAgMHg4NzU5LCAweDg3NjUsIDB4ODc5MywgMHg4N0FGLCAweDg3QTgsIDB4ODdEMiwgMHg4N0M2LCAweDg3ODgsIDB4ODc4NSwKKyAgICAweDg3QUQsIDB4ODc5NywgMHg4NzgzLCAweDg3QUIsIDB4ODdFNSwgMHg4N0FDLCAweDg3QjUsIDB4ODdCMywgMHg4N0NCLAorICAgIDB4ODdEMywgMHg4N0JELCAweDg3RDEsIDB4ODdDMCwgMHg4N0NBLCAweDg3REIsIDB4ODdFQSwgMHg4N0UwLCAweDg3RUUsCisgICAgMHg4ODE2LCAweDg4MTMsIDB4ODdGRSwgMHg4ODBBLCAweDg4MUIsIDB4ODgyMSwgMHg4ODM5LCAweDg4M0MsIDB4N0YzNiwKKyAgICAweDdGNDIsIDB4N0Y0NCwgMHg3RjQ1LCAweDgyMTAsIDB4N0FGQSwgMHg3QUZELCAweDdCMDgsIDB4N0IwMywgMHg3QjA0LAorICAgIDB4N0IxNSwgMHg3QjBBLCAweDdCMkIsIDB4N0IwRiwgMHg3QjQ3LCAweDdCMzgsIDB4N0IyQSwgMHg3QjE5LCAweDdCMkUsCisgICAgMHg3QjMxLCAweDdCMjAsIDB4N0IyNSwgMHg3QjI0LCAweDdCMzMsIDB4N0IzRSwgMHg3QjFFLCAweDdCNTgsIDB4N0I1QSwKKyAgICAweDdCNDUsIDB4N0I3NSwgMHg3QjRDLCAweDdCNUQsIDB4N0I2MCwgMHg3QjZFLCAweDdCN0IsIDB4N0I2MiwgMHg3QjcyLAorICAgIDB4N0I3MSwgMHg3QjkwLCAweDdCQTYsIDB4N0JBNywgMHg3QkI4LCAweDdCQUMsIDB4N0I5RCwgMHg3QkE4LCAweDdCODUsCisgICAgMHg3QkFBLCAweDdCOUMsIDB4N0JBMiwgMHg3QkFCLCAweDdCQjQsIDB4N0JEMSwgMHg3QkMxLCAweDdCQ0MsIDB4N0JERCwKKyAgICAweDdCREEsIDB4N0JFNSwgMHg3QkU2LCAweDdCRUEsIDB4N0MwQywgMHg3QkZFLCAweDdCRkMsIDB4N0MwRiwgMHg3QzE2LAorICAgIDB4N0MwQiwgMHg3QzFGLCAweDdDMkEsIDB4N0MyNiwgMHg3QzM4LCAweDdDNDEsIDB4N0M0MCwgMHg4MUZFLCAweDgyMDEsCisgICAgMHg4MjAyLCAweDgyMDQsIDB4ODFFQywgMHg4ODQ0LCAweDgyMjEsIDB4ODIyMiwgMHg4MjIzLCAweDgyMkQsIDB4ODIyRiwKKyAgICAweDgyMjgsIDB4ODIyQiwgMHg4MjM4LCAweDgyM0IsIDB4ODIzMywgMHg4MjM0LCAweDgyM0UsIDB4ODI0NCwgMHg4MjQ5LAorICAgIDB4ODI0QiwgMHg4MjRGLCAweDgyNUEsIDB4ODI1RiwgMHg4MjY4LCAweDg4N0UsIDB4ODg4NSwgMHg4ODg4LCAweDg4RDgsCisgICAgMHg4OERGLCAweDg5NUUsIDB4N0Y5RCwgMHg3RjlGLCAweDdGQTcsIDB4N0ZBRiwgMHg3RkIwLCAweDdGQjIsIDB4N0M3QywKKyAgICAweDY1NDksIDB4N0M5MSwgMHg3QzlELCAweDdDOUMsIDB4N0M5RSwgMHg3Q0EyLCAweDdDQjIsIDB4N0NCQywgMHg3Q0JELAorICAgIDB4N0NDMSwgMHg3Q0M3LCAweDdDQ0MsIDB4N0NDRCwgMHg3Q0M4LCAweDdDQzUsIDB4N0NENywgMHg3Q0U4LCAweDgyNkUsCisgICAgMHg2NkE4LCAweDdGQkYsIDB4N0ZDRSwgMHg3RkQ1LCAweDdGRTUsIDB4N0ZFMSwgMHg3RkU2LCAweDdGRTksIDB4N0ZFRSwKKyAgICAweDdGRjMsIDB4N0NGOCwgMHg3RDc3LCAweDdEQTYsIDB4N0RBRSwgMHg3RTQ3LCAweDdFOUIsIDB4OUVCOCwgMHg5RUI0LAorICAgIDB4OEQ3MywgMHg4RDg0LCAweDhEOTQsIDB4OEQ5MSwgMHg4REIxLCAweDhENjcsIDB4OEQ2RCwgMHg4QzQ3LCAweDhDNDksCisgICAgMHg5MTRBLCAweDkxNTAsIDB4OTE0RSwgMHg5MTRGLCAweDkxNjQsIDB4OTE2MiwgMHg5MTYxLCAweDkxNzAsIDB4OTE2OSwKKyAgICAweDkxNkYsIDB4OTE3RCwgMHg5MTdFLCAweDkxNzIsIDB4OTE3NCwgMHg5MTc5LCAweDkxOEMsIDB4OTE4NSwgMHg5MTkwLAorICAgIDB4OTE4RCwgMHg5MTkxLCAweDkxQTIsIDB4OTFBMywgMHg5MUFBLCAweDkxQUQsIDB4OTFBRSwgMHg5MUFGLCAweDkxQjUsCisgICAgMHg5MUI0LCAweDkxQkEsIDB4OEM1NSwgMHg5RTdFLCAweDhEQjgsIDB4OERFQiwgMHg4RTA1LCAweDhFNTksIDB4OEU2OSwKKyAgICAweDhEQjUsIDB4OERCRiwgMHg4REJDLCAweDhEQkEsIDB4OERDNCwgMHg4REQ2LCAweDhERDcsIDB4OEREQSwgMHg4RERFLAorICAgIDB4OERDRSwgMHg4RENGLCAweDhEREIsIDB4OERDNiwgMHg4REVDLCAweDhERjcsIDB4OERGOCwgMHg4REUzLCAweDhERjksCisgICAgMHg4REZCLCAweDhERTQsIDB4OEUwOSwgMHg4REZELCAweDhFMTQsIDB4OEUxRCwgMHg4RTFGLCAweDhFMkMsIDB4OEUyRSwKKyAgICAweDhFMjMsIDB4OEUyRiwgMHg4RTNBLCAweDhFNDAsIDB4OEUzOSwgMHg4RTM1LCAweDhFM0QsIDB4OEUzMSwgMHg4RTQ5LAorICAgIDB4OEU0MSwgMHg4RTQyLCAweDhFNTEsIDB4OEU1MiwgMHg4RTRBLCAweDhFNzAsIDB4OEU3NiwgMHg4RTdDLCAweDhFNkYsCisgICAgMHg4RTc0LCAweDhFODUsIDB4OEU4RiwgMHg4RTk0LCAweDhFOTAsIDB4OEU5QywgMHg4RTlFLCAweDhDNzgsIDB4OEM4MiwKKyAgICAweDhDOEEsIDB4OEM4NSwgMHg4Qzk4LCAweDhDOTQsIDB4NjU5QiwgMHg4OUQ2LCAweDg5REUsIDB4ODlEQSwgMHg4OURDLAorICAgIDB4ODlFNSwgMHg4OUVCLCAweDg5RUYsIDB4OEEzRSwgMHg4QjI2LCAweDk3NTMsIDB4OTZFOSwgMHg5NkYzLCAweDk2RUYsCisgICAgMHg5NzA2LCAweDk3MDEsIDB4OTcwOCwgMHg5NzBGLCAweDk3MEUsIDB4OTcyQSwgMHg5NzJELCAweDk3MzAsIDB4OTczRSwKKyAgICAweDlGODAsIDB4OUY4MywgMHg5Rjg1LCAweDlGODYsIDB4OUY4NywgMHg5Rjg4LCAweDlGODksIDB4OUY4QSwgMHg5RjhDLAorICAgIDB4OUVGRSwgMHg5RjBCLCAweDlGMEQsIDB4OTZCOSwgMHg5NkJDLCAweDk2QkQsIDB4OTZDRSwgMHg5NkQyLCAweDc3QkYsCisgICAgMHg5NkUwLCAweDkyOEUsIDB4OTJBRSwgMHg5MkM4LCAweDkzM0UsIDB4OTM2QSwgMHg5M0NBLCAweDkzOEYsIDB4OTQzRSwKKyAgICAweDk0NkIsIDB4OUM3RiwgMHg5QzgyLCAweDlDODUsIDB4OUM4NiwgMHg5Qzg3LCAweDlDODgsIDB4N0EyMywgMHg5QzhCLAorICAgIDB4OUM4RSwgMHg5QzkwLCAweDlDOTEsIDB4OUM5MiwgMHg5Qzk0LCAweDlDOTUsIDB4OUM5QSwgMHg5QzlCLCAweDlDOUUsCisgICAgMHg5QzlGLCAweDlDQTAsIDB4OUNBMSwgMHg5Q0EyLCAweDlDQTMsIDB4OUNBNSwgMHg5Q0E2LCAweDlDQTcsIDB4OUNBOCwKKyAgICAweDlDQTksIDB4OUNBQiwgMHg5Q0FELCAweDlDQUUsIDB4OUNCMCwgMHg5Q0IxLCAweDlDQjIsIDB4OUNCMywgMHg5Q0I0LAorICAgIDB4OUNCNSwgMHg5Q0I2LCAweDlDQjcsIDB4OUNCQSwgMHg5Q0JCLCAweDlDQkMsIDB4OUNCRCwgMHg5Q0M0LCAweDlDQzUsCisgICAgMHg5Q0M2LCAweDlDQzcsIDB4OUNDQSwgMHg5Q0NCLCAweDlDQ0MsIDB4OUNDRCwgMHg5Q0NFLCAweDlDQ0YsIDB4OUNEMCwKKyAgICAweDlDRDMsIDB4OUNENCwgMHg5Q0Q1LCAweDlDRDcsIDB4OUNEOCwgMHg5Q0Q5LCAweDlDREMsIDB4OUNERCwgMHg5Q0RGLAorICAgIDB4OUNFMiwgMHg5NzdDLCAweDk3ODUsIDB4OTc5MSwgMHg5NzkyLCAweDk3OTQsIDB4OTdBRiwgMHg5N0FCLCAweDk3QTMsCisgICAgMHg5N0IyLCAweDk3QjQsIDB4OUFCMSwgMHg5QUIwLCAweDlBQjcsIDB4OUU1OCwgMHg5QUI2LCAweDlBQkEsIDB4OUFCQywKKyAgICAweDlBQzEsIDB4OUFDMCwgMHg5QUM1LCAweDlBQzIsIDB4OUFDQiwgMHg5QUNDLCAweDlBRDEsIDB4OUI0NSwgMHg5QjQzLAorICAgIDB4OUI0NywgMHg5QjQ5LCAweDlCNDgsIDB4OUI0RCwgMHg5QjUxLCAweDk4RTgsIDB4OTkwRCwgMHg5OTJFLCAweDk5NTUsCisgICAgMHg5OTU0LCAweDlBREYsIDB4OUFFMSwgMHg5QUU2LCAweDlBRUYsIDB4OUFFQiwgMHg5QUZCLCAweDlBRUQsIDB4OUFGOSwKKyAgICAweDlCMDgsIDB4OUIwRiwgMHg5QjEzLCAweDlCMUYsIDB4OUIyMywgMHg5RUJELCAweDlFQkUsIDB4N0UzQiwgMHg5RTgyLAorICAgIDB4OUU4NywgMHg5RTg4LCAweDlFOEIsIDB4OUU5MiwgMHg5M0Q2LCAweDlFOUQsIDB4OUU5RiwgMHg5RURCLCAweDlFREMsCisgICAgMHg5RURELCAweDlFRTAsIDB4OUVERiwgMHg5RUUyLCAweDlFRTksIDB4OUVFNywgMHg5RUU1LCAweDlFRUEsIDB4OUVFRiwKKyAgICAweDlGMjIsIDB4OUYyQywgMHg5RjJGLCAweDlGMzksIDB4OUYzNywgMHg5RjNELCAweDlGM0UsIDB4OUY0NCwgMHgzMDA3LAorICAgIDB4RkY1RSwgMHgyMDE2LCAweDMwMTMsIDB4RkYwRSwgMHhGRjFELCAweEZGM0IsIDB4RkYzRCwgMHhGRkUzLCAweDAwRkMsCisgICAgMHgwMEE5LCAweDIxMjIsIDB4MjAyNiwgMHgwMDIwLCAweDc2OUEsIDB4ODVGOSwgMHg3OTE5LCAweDYxMUIsIDB4OUFBRiwKKyAgICAweDg5NTYsIDB4NThFOSwgMHg3Rjc3LCAweDY0RkEsIDB4NjU1NywgMHg5ODEyLCAweDhGQTYsIDB4N0Q0NiwgMHg1RTZCLAorICAgIDB4N0Q4MSwgMHg5MzhBLCAweDhCMTcsIDB4OThGRCwgMHg1QkY2LCAweDU4MzEsIDB4OUI5MSwgMHg4RjI5LCAweDhDOUQsCisgICAgMHg5MkM3LCAweDcyRkQsIDB4NTA5OSwgMHg2MThBLCAweDdEQjMsIDB4N0I0NiwgMHg3NTYyLCAweDY1ODMsIDB4NUU2MywKKyAgICAweDk1ODksIDB4OTA4QSwgMHg3REU4LCAweDhDQjYsIDB4OEI4QSwgMHg4RkFGLCAweDhGQUUsIDB4NkExOSwgMHg5QzQ5LAorICAgIDB4NzY1RiwgMHg3MDE1LCAweDZGRjEsIDB4OENEMywgMHg2NEVGLCAweDk5MDUsIDB4NjRBNSwgMHg5MjYyLCAweDkyNTEsCisgICAgMHg5OUMxLCAweDg4REMsIDB4OENBMSwgMHg1M0MzLCAweDg4MzYsIDB4NkI5OCwgMHg2MTVBLCAweDYxNTgsIDB4NzFFNiwKKyAgICAweDg0QkMsIDB4ODI1OSwgMHg1MDA5LCAweDZFQzQsIDB4NTNBMCwgMHg1MDc0LCAweDZFMkMsIDB4NUM2NCwgMHg4QTZCLAorICAgIDB4NjUxOSwgMHg2NDdCLCAweDg3RUMsIDB4OTk1RSwgMHg4QjkyLCAweDdFOEYsIDB4OTNERiwgMHg3NTIzLCAweDk1RTEsCisgICAgMHg5ODZCLCAweDU4MzQsIDB4NTYxNywgMHg5NTc3LCAweDUxMUYsIDB4ODE3OCwgMHg1RUUwLCAweDY2QTIsIDB4OTIxNCwKKyAgICAweDhFQ0EsIDB4NUZCOSwgMHg1ODc1LCAweDk2NzMsIDB4ODk2RiwgMHg3QTMxLCAweDYxRjIsIDB4OEFBMCwgMHg5QTAxLAorICAgIDB4OTA3MiwgMHg5OUIzLCAweDlGNTIsIDB4NzFCRSwgMHg4ODVELCAweDg3RjIsIDB4NUJGNSwgMHg3NTg3LCAweDhFOEEsCisgICAgMHg3QzRDLCAweDdEQTIsIDB4OTE5QywgMHg5MkU0LCAweDk2REIsIDB4NzkwRSwgMHg1MTMyLCAweDg5RjgsIDB4ODY1NSwKKyAgICAweDUwQjMsIDB4NzYyMSwgMHg5NUQ2LCAweDUyNzUsIDB4OTMxOCwgMHg3RDE0LCAweDdEQkQsIDB4OEZBRCwgMHg4QTVFLAorICAgIDB4OENEQywgMHg4MDcwLCAweDVGOUUsIDB4NTNFMiwgMHg4RUE1LCAweDdBQzQsIDB4OTMyRiwgMHg5MDU0LCAweDVFMzYsCisgICAgMHg4Q0I4LCAweDY0RDQsIDB4NTVBRSwgMHg5MTMyLCAweDY0QTMsIDB4ODFCRCwgMHg2MTlBLCAweDhBOTUsIDB4NUY0OCwKKyAgICAweDc1NzYsIDB4NjRDQiwgMHg5RUU4LCAweDg1NjksIDB4NkE5NCwgMHg2NDE3LCAweDVDRjYsIDB4NzlCMSwgMHg1QzBFLAorICAgIDB4NzFDOCwgMHg5MTI3LCAweDY1NzUsIDB4NkVDQywgMHg5MDVFLCAweDdERTAsIDB4OTg1QiwgMHg5RURFLCAweDU4OEEsCisgICAgMHg5NkZCLCAweDZGQjEsIDB4OTFFMywgMHg4QUJGLCAweDhBREMsIDB4OTFEOCwgMHg5ODAyLCAweDkzMjAsIDB4OEEwMiwKKyAgICAweDY3NzEsIDB4NTJENSwgMHg2OERGLCAweDUxQ0QsIDB4OUIyNSwgMHg3MkEyLCAweDczNjgsIDB4OEI4MCwgMHg4Q0VELAorICAgIDB4OTM0RCwgMHg5MzVCLCAweDY1QjcsIDB4N0RERSwgMHg5NjhBLCAweDVDMEQsIDB4NTY3OCwgMHg5ODEzLCAweDkyMEQsCisgICAgMHg1OTZBLCAweDU4QUUsIDB4OUQ1RCwgMHg5ODRELCAweDhBMUIsIDB4NjBFMSwgMHg5OTEzLCAweDUxNTIsIDB4NzIzRSwKKyAgICAweDk5MEMsIDB4OENCMywgMHg3NjdDLCAweDdGNzAsIDB4OTVBNSwgMHg3OTJDLCAweDkxRTksIDB4NzE2OSwgMHg3QkM0LAorICAgIDB4OENBOSwgMHg5OEVGLCAweDhBMkEsIDB4N0QyMSwgMHg5OERCLCAweDhBQjksIDB4NUVFMiwgMHg4Q0JCLCAweDdEMUIsCisgICAgMHg1OEIzLCAweDU5NkUsIDB4NjFBNCwgMHg3Q0RFLCAweDhDNTAsIDB4Njk1MywgMHg5MkQyLCAweDk4QTgsIDB4NzYwQiwKKyAgICAweDk5QUUsIDB4N0UyQiwgMHg4QUY3LCAweDlDRjMsIDB4ODE5QSwgMHg4RjNCLCAweDY0QUIsIDB4OEYxNCwgMHg4Q0U2LAorICAgIDB4NUZBOSwgMHg4Q0EwLCAweDhBMDMsIDB4NUE2NiwgMHg3RTFCLCAweDhBNzIsIDB4OTIyMywgMHg4NENCLCAweDVFNzksCisgICAgMHg4RDk1LCAweDhEMUIsIDB4NUNBMSwgMHg1MjVCLCAweDkyRkMsIDB4N0RCMSwgMHg1RDE3LCAweDkzQUMsIDB4NjRGMSwKKyAgICAweDlEM0YsIDB4OTVBMywgMHg5MjdCLCAweDUwMEIsIDB4N0Q2NiwgMHg5Rjk0LCAweDk3OEYsIDB4OENBMiwgMHg5MjBFLAorICAgIDB4NkU5RCwgMHg2OUNCLCAweDhDRkMsIDB4ODgzMSwgMHg5ODY3LCAweDUyNkUsIDB4OTVEQywgMHg4OUMwLCAweDk5MjgsCisgICAgMHg2MTYzLCAweDhDQUIsIDB4NUVFMywgMHg4OThGLCAweDZCNzgsIDB4OUY5QywgMHg5NUE4LCAweDhFQ0MsIDB4OEE2RCwKKyAgICAweDZBQzMsIDB4OENCNCwgMHg1MjhBLCAweDhGMjUsIDB4OTM0QiwgMHg1NzBCLCAweDkwNEUsIDB4OTlFRCwgMHg5N0QzLAorICAgIDB4NkYyMiwgMHg4NjVGLCAweDk1QTEsIDB4OURCNCwgMHg4Q0MwLCAweDhGNUYsIDB4OUQzQiwgMHg3RDA1LCAweDU4RkEsCisgICAgMHg4Qjc3LCAweDZFRUMsIDB4NTYyOSwgMHg4M0VGLCAweDc1NkIsIDB4NTI4MywgMHg4QTcxLCAweDYxRjcsIDB4NThERSwKKyAgICAweDZCNjEsIDB4NzRCMCwgMHg5MDg0LCAweDdERTksIDB4OEIwQSwgMHg2M0VFLCAweDhGMUQsIDB4OENDNCwgMHg3QTYyLAorICAgIDB4NjcwMywgMHg3MUY0LCAweDUzMkYsIDB4OEFGMSwgMHg4QUE4LCAweDdFNkEsIDB4ODQ3NywgMHg2RTNFLCAweDczNzIsCisgICAgMHg4Q0E4LCAweDc5OEQsIDB4NjRDQSwgMHg2QTVGLCAweDdBNEQsIDB4OTk1MSwgMHg4QjRGLCAweDlEQzQsIDB4N0UzRSwKKyAgICAweDdEREQsIDB4Njk3NSwgMHg4RjJGLCAweDdEMUEsIDB4NjRFMCwgMHg1RTdFLCAweDg1OEEsIDB4NTI5MSwgMHg2RkRGLAorICAgIDB4OEEwOCwgMHg4QTE4LCAweDk2OUIsIDB4N0U3QywgMHg3RDAwLCAweDU5M0UsIDB4ODNBMiwgMHg5ODMwLCAweDhDQzgsCisgICAgMHg5MjQwLCAweDUwRjksIDB4OTlENSwgMHg2QkIyLCAweDc2RTMsIDB4NTgwNSwgMHg3QjhCLCAweDk1OTMsIDB4ODI3MSwKKyAgICAweDdERDgsIDB4N0U2RCwgMHg2QUEyLCAweDlFN0MsIDB4NjNDMCwgMHg2NEJGLCAweDdDMjEsIDB4NTEwOSwgMHg4NUE2LAorICAgIDB4NkFCQiwgMHg5NDUyLCAweDhFMTAsIDB4OENFNCwgMHg4OThCLCAweDkzNzUsIDB4ODI2NiwgMHg1MjhELCAweDk5MUUsCisgICAgMHg2RjM4LCAweDZGRkEsIDB4NkY5NywgMHg1QzA3LCAweDZGM0YsIDB4ODUyMywgMHg2OUYzLCAweDU5NkMsIDB4OEIxQiwKKyAgICAweDkxQUMsIDB4ODFBMCwgMHg2Rjg2LCAweDlBNTUsIDB4NUIwQywgMHg2NTJBLCAweDkyNzgsIDB4NzdFRiwgMHg1MEU1LAorICAgIDB4OTkwMywgMHg3RTczLCAweDdENUUsIDB4OEY0RSwgMHg4RjAzLCAweDk2OEUsIDB4N0JDMCwgMHg2RjU0LCAweDdENTAsCisgICAgMHg4QUExLCAweDdEQ0EsIDB4OTMyNiwgMHg1MEM1LCAweDhCMzksIDB4OTAzMiwgMHg3MUZDLCAweDc2RTEsIDB4NTJDMSwKKyAgICAweDgzOTYsIDB4OUJFOCwgMHg5QTVBLCAweDdEOTMsIDB4OTgzOCwgMHg5M0UxLCAweDVGOTEsIDB4NzVEOSwgMHg3QUY2LAorICAgIDB4N0NGRSwgMHg4MjBBLCAweDk5RDIsIDB4ODIwOSwgMHg2NERBLCAweDkyRjgsIDB4NjFGQywgMHg1Mjg3LCAweDlENTEsCisgICAgMHg3RDc5LCAweDg5QkEsIDB4OEEyMywgMHg3RDc2LCAweDkyMUUsIDB4OEVDRCwgMHg5OUZGLCAweDk1OEIsIDB4NTFGMSwKKyAgICAweDk4NDYsIDB4NkJCQiwgMHg4QUIyLCAweDU4QkUsIDB4NjFDNywgMHg2NDczLCAweDVFQUIsIDB4ODkzMiwgMHg4QTg3LAorICAgIDB4NTg0QSwgMHg1MTA4LCAweDVCRUMsIDB4NzkyNiwgMHg2NkUwLCAweDg2NjcsIDB4NURDQiwgMHg3QUJBLCAweDk5NEIsCisgICAgMHg2RjcwLCAweDY0RjQsIDB4OTVDQSwgMHg4ODFGLCAweDgxRDgsIDB4ODQwQSwgMHg0Rjg2LCAweDhDRjQsIDB4ODVDRCwKKyAgICAweDZCMDQsIDB4NjUxNCwgMHg3QzQzLCAweDk1Q0MsIDB4ODYyRCwgMHg3MDNFLCAweDhCOTUsIDB4NjUyQywgMHg4OUJELAorICAgIDB4NjFGNiwgMHg3RTlDLCAweDcyMUIsIDB4NkZFQiwgMHg2NDg4LCAweDUyREUsIDB4NkY4NywgMHg2QTAyLCAweDk0MzMsCisgICAgMHg1OEQ4LCAweDk4NUUsIDB4N0M2QywgMHg5NkUyLCAweDcwNTUsIDB4ODhDRiwgMHg5QkM5LCAweDc5QUUsIDB4OUU5NywKKyAgICAweDUzQjIsIDB4NTJGNSwgMHg3OTJCLCAweDZCNzcsIDB4NzAxRCwgMHg5NkI4LCAweDUwMDYsIDB4ODA2RiwgMHg4NEVFLAorICAgIDB4OTAyMywgMHg5NDJFLCAweDYxOTAsIDB4NkYyMywgMHg3QzNFLCAweDY1ODIsIDB4ODFDOSwgMHg5M0M4LCAweDYyMDAsCisgICAgMHg3MTQ5LCAweDdERjQsIDB4N0NFNywgMHg1MTY5LCAweDhGMUIsIDB4OEFEMiwgMHg3NjQyLCAweDkwN0MsIDB4OTQxMCwKKyAgICAweDczNzUsIDB4ODFFOCwgMHg5MTMwLCAweDlDNTcsIDB4OENDMywgMHg5RjYxLCAweDkyMzQsIDB4OTc0OCwgMHg1REJBLAorICAgIDB4OTgxOCwgMHg5OTNFLCAweDUyODksIDB4OUY4RCwgMHg4MDdFLCAweDU2QTgsIDB4N0M2MCwgMHg1OERGLCAweDY1MEYsCisgICAgMHg5NkI0LCAweDZBMTMsIDB4NUE0MSwgMHg2NDVGLCAweDdDMEQsIDB4ODYwNiwgMHg3NkU3LCAweDk4NzEsIDB4NUVFQywKKyAgICAweDcyMTAsIDB4NjRDNCwgMHg2RUY3LCAweDg2NUMsIDB4OUI2RiwgMHg4Q0MyLCAweDkzMzIsIDB4OTY3OCwgMHg5QTYyLAorICAgIDB4OTJDMSwgMHg1QzYyLCAweDdFMzcsIDB4NjE2RSwgMHg2RkZFLCAweDdERDEsIDB4NUREMiwgMHg2NTIzLCAweDVCN0YsCisgICAgMHg3MDY0LCAweDRFODIsIDB4NjM4NCwgMHg4RjJBLCAweDUwMkIsIDB4NEY5NiwgMHg2REVBLCAweDdEQjgsIDB4OEFENiwKKyAgICAweDg2M0YsIDB4N0Y4NSwgMHg5MDhGLCAweDk0N0MsIDB4N0M2RSwgMHg5QTNFLCAweDk5RjEsIDB4N0Q2MSwgMHg1QUJELAorICAgIDB4NzQ2QSwgMHg3OEJDLCAweDg3OUUsIDB4OTlBQywgMHg5OUUxLCAweDU1Q0UsIDB4OENCNywgMHg5RUE1LCAweDhDRTMsCisgICAgMHg5MDgxLCAweDc3OUUsIDB4OTk0NSwgMHg4ODNCLCAweDZFRkYsIDB4OEIzRSwgMHg5MzI4LCAweDkyNUEsIDB4OENCRiwKKyAgICAweDkzODIsIDB4OTU4MCwgMHg2MEI2LCAweDUwMTEsIDB4OTMzMywgMHg1OTIyLCAweDhCMEUsIDB4NUY0QywgMHg4OTkzLAorICAgIDB4N0RCRiwgMHg3REVDLCAweDVFREYsIDB4NkVDNSwgMHg2MUFCLCAweDk1QTksIDB4OUNGNCwgMHg5Mjk4LCAweDhCMkMsCisgICAgMHg4QjAwLCAweDc1NUQsIDB4OTIwOSwgMHg3RDBELCAweDk2RTMsIDB4NjQ5MywgMHg4MTY2LCAweDYwRjEsIDB4OUIyNywKKyAgICAweDk5MTIsIDB4NjRFQywgMHg4MUE5LCAweDY1MDYsIDB4OTFDMCwgMHg5Q0U1LCAweDgwNzYsIDB4NTY5OSwgMHg5NDc3LAorICAgIDB4OTNCMywgMHg2QUI4LCAweDczNzAsIDB4NUJFNywgMHg2NEYwLCAweDZGRDgsIDB4OTIxNSwgMHg3RDEwLCAweDgxQkYsCisgICAgMHg2RkMzLCAweDhGQjIsIDB4NzYyNywgMHg4QUZFLCAweDZCNTAsIDB4OURENywgMHg2QkM2LCAweDU2MTQsIDB4NkYxQSwKKyAgICAweDc2RTQsIDB4OUY5MCwgMHg4Q0UwLCAweDU2NzQsIDB4OUQ2QywgMHg5QTE5LCAweDk4QzQsIDB4OTgzQiwgMHg4Q0E3LAorICAgIDB4ODYwQiwgMHg2MTkxLCAweDhBNTUsIDB4NkY1MSwgMHg5ODE3LCAweDY0QjIsIDB4OTJFQSwgMHg1MEQ1LCAweDZBMzgsCisgICAgMHg4QjVDLCAweDgxQ0QsIDB4OUY0QSwgMHg5QTBFLCAweDhDNDgsIDB4NTU1MywgMHg2QzIzLCAweDhBMTYsIDB4NzI3RCwKKyAgICAweDkxRkEsIDB4OTI1QiwgMHg5MDc3LCAweDdDM0QsIDB4OEIxOSwgMHg5MzIyLCAweDkyNTcsIDB4NkRGQSwgMHg4Qjc0LAorICAgIDB4NTg3OSwgMHg2OUNELCAweDU1QzYsIDB4NThCQiwgMHg4NTk0LCAweDY0MzYsIDB4OTM2QywgMHg2QTRCLCAweDU1QUMsCisgICAgMHg1MEQxLCAweDdGRjksIDB4N0FDNSwgMHg3QUNBLCAweDZCM0QsIDB4ODlBQSwgMHg1QkUyLCAweDhGMTUsIDB4NkMyQiwKKyAgICAweDUwQkUsIDB4OTgwMywgMHg4QUNCLCAweDYxNzYsIDB4NzRDQSwgMHg3QUFFLCAweDhEQTgsIDB4NTM0MCwgMHg4RUMwLAorICAgIDB4OUE0NSwgMHg5RjcyLCAweDk4NzQsIDB4NkIwQSwgMHg1MkY4LCAweDlENzIsIDB4NzhCQSwgMHg4QjkzLCAweDk5NTIsCisgICAgMHg2NEZFLCAweDdFNUUsIDB4NzFCMSwgMHg5N0NDLCAweDhBOEQsIDB4N0QwOSwgMHg2OUFFLCAweDdENjgsIDB4OEVERiwKKyAgICAweDkyRUQsIDB4OTU4RiwgMHg2RjY0LCAweDcwNTEsIDB4ODVBOSwgMHg5QzEzLCAweDhDRkQsIDB4NTA5OCwgMHg1NUFBLAorICAgIDB4OUEzNywgMHg2MzgzLCAweDZGODAsIDB4NkJCQSwgMHg3RDE3LCAweDdCRTksIDB4NjZFQywgMHg5NTgzLCAweDk2NUQsCisgICAgMHg4RDBELCAweDdFNTUsIDB4NTBCNywgMHg4Q0RFLCAweDcxRDIsIDB4N0QzOSwgMHg4Q0QyLCAweDYzNjgsIDB4NjUxRCwKKyAgICAweDYxRkUsIDB4OEEyRCwgMHg3RDMzLCAweDVCRTksIDB4NUIzOCwgMHg4MTRFLCAweDZFRjIsIDB4ODA3MiwgMHg3RTY5LAorICAgIDB4NTJERCwgMHg4MDU2LCAweDVFMkIsIDB4NzM0NSwgMHg2RkQ1LCAweDhBNjksIDB4NjY0MiwgMHg4NzU1LCAweDVCRTYsCisgICAgMHg4QjU4LCAweDk5REIsIDB4NTJFMiwgMHg5MDY5LCAweDkxQ0IsIDB4OThGRSwgMHg4OTk2LCAweDhBNjYsIDB4NThGRCwKKyAgICAweDczNzgsIDB4NkExRSwgMHg4RjM4LCAweDY2RjgsIDB4OEQxNiwgMHg1QzZDLCAweDg4NTMsIDB4NkEzOSwgMHg3QUVBLAorICAgIDB4NjU3OCwgMHg1RTI1LCAweDk2RDksIDB4OEFCMCwgMHg5ODA2LCAweDhBQUMsIDB4NzhBOSwgMHg3MjBELCAweDdENzIsCisgICAgMHg5OEZDLCAweDlCMDYsIDB4ODA3MywgMHg2MTZCLCAweDk4MEMsIDB4OEExRiwgMHg4QUE2LCAweDY0RkIsIDB4ODYwNywKKyAgICAweDhBMzQsIDB4ODA4NSwgMHg5NkQ2LCAweDk2QTgsIDB4N0Q4RiwgMHg2QjcyLCAweDVCNkIsIDB4NjQwRCwgMHg3RTJFLAorICAgIDB4NzQ2MywgMHg5Mzk2LCAweDczN0EsIDB4NjRCQiwgMHg4MUZBLCAweDYxNEIsIDB4NjUyNCwgMHg4Q0FBLCAweDc2NzEsCisgICAgMHg3MDU4LCAweDU4QzcsIDB4OEI1QSwgMHg4QUM3LCAweDU2MDYsIDB4NkU2RiwgMHg3MUQ5LCAweDZGRTQsIDB4N0UyNywKKyAgICAweDhBMEUsIDB4OUEzMCwgMHg4QjA0LCAweDkyQkIsIDB4OTg0QywgMHg5QUQ0LCAweDY4OUQsIDB4OENCQywgMHg5NDM1LAorICAgIDB4NUVGMywgMHg4MDdELCAweDcwRjQsIDB4OTI4NSwgMHg3RDcxLCAweDk4MkQsIDB4NTcxNiwgMHg1ODU3LCAweDU3MTgsCisgICAgMHg5ODNELCAweDlEMTUsIDB4OTlCMSwgMHg5OURELCAweDZBNjIsIDB4N0FBQSwgMHg4OTZBLCAweDVGNEUsIDB4NzA2MywKKyAgICAweDk4MTEsIDB4ODQyQywgMHg3REIyLCAweDk3Q0IsIDB4OTA1NSwgMHg1NzBELCAweDcyMzIsIDB4NkZGMCwgMHg3REFELAorICAgIDB4ODQ2NiwgMHg1MDQ5LCAweDUwREUsIDB4N0RFRiwgMHg4QjAyLCAweDg4NUIsIDB4ODA1RSwgMHg3RDBCLCAweDdBNjksCisgICAgMHg1NTRGLCAweDY0QkUsIDB4ODc3OCwgMHg2RTI2LCAweDdBQTksIDB4NTVEQSwgMHg5M0EyLCAweDcwQ0YsIDB4OEFBMywKKyAgICAweDcxMjEsIDB4ODU2QSwgMHg1ODYyLCAweDk3MjcsIDB4NTJEOSwgMHg4QUE0LCAweDkzMkIsIDB4NzJBNywgMHg4OTcyLAorICAgIDB4N0ZEMiwgMHg5MjkxLCAweDYyMzIsIDB4N0QzMCwgMHg4NzY2LCAweDhGNDQsIDB4NUNGRCwgMHg0RkUwLCAweDcyRjksCisgICAgMHg1Njg3LCAweDkzNDEsIDB4OUJBRSwgMHg3RTk2LCAweDhDRTIsIDB4OTI5QywgMHg5NTkxLCAweDk4NkYsIDB4OTZBQSwKKyAgICAweDczRkUsIDB4NzM3QiwgMHg3RTIzLCAweDk5MjEsIDB4NjFCMiwgMHg3REFCLCAweDk0NzIsIDB4OTEwOSwgMHg4QTczLAorICAgIDB4OTdGRiwgMHg5ODA1LCAweDg1NkQsIDB4NTZDMiwgMHg5MkI3LCAweDY2QzksIDB4NTYyRiwgMHg1MzU0LCAweDYzM0UsCisgICAgMHg4MTA1LCAweDhBRTcsIDB4NUJFQiwgMHg3MDA5LCAweDhCMUQsIDB4OTJDNSwgMHg5MUMxLCAweDgyMDgsIDB4OTJCOSwKKyAgICAweDdEODksIDB4OTgwOCwgMHg4QTMxLCAweDdERDIsIDB4N0U4QywgMHg4RUQyLCAweDYxRjgsIDB4OTA3OCwgMHg3NjZDLAorICAgIDB4N0Q2MiwgMHg1Qjc4LCAweDUyREIsIDB4OEE2MiwgMHg1QzBCLCAweDk5QjQsIDB4OEExMywgMHg4QTBBLCAweDkwNUMsCisgICAgMHg1OEQzLCAweDlEMDksIDB4OUQyOCwgMHg1NTVFLCAweDRFOUUsIDB4OEExRCwgMHg5NUI5LCAweDlFN0QsIDB4NTZCNCwKKyAgICAweDk4NTQsIDB4OTVCQiwgMHg4Mjc3LCAweDUzQUQsIDB4Nzg2RiwgMHg4QUZBLCAweDlBNTcsIDB4OUQyNiwgMHg2OTRBLAorICAgIDB4NjNEQSwgMHg3NjBELCAweDk2N0QsIDB4NzY2MiwgMHg5OTBBLCAweDZBMjMsIDB4NTgyRiwgMHg4QjIxLCAweDg1RTUsCisgICAgMHg3MjNBLCAweDk4MDEsIDB4Njk2RCwgMHg4NDQ5LCAweDkxQUIsIDB4OTJBNSwgMHg5ODI0LCAweDkwN0EsIDB4NTEwMCwKKyAgICAweDg3RkIsIDB4ODVERCwgMHg1MTA0LCAweDYxQjYsIDB4N0ZBOSwgMHg4QTYzLCAweDhCNzAsIDB4OEFCQywgMHg4QjZGLAorICAgIDB4N0U3OSwgMHg4NTJELCAweDk2NzAsIDB4OTI4MCwgMHg5OEYyLCAweDk2QjEsIDB4NkFGQiwgMHg1QjMwLCAweDlERjksCisgICAgMHg2MUM5LCAweDdFOTMsIDB4NzQ2OSwgMHg4N0EyLCAweDcxREYsIDB4NzE5MiwgMHg4ODA1LCAweDhEMEYsIDB4N0E0RSwKKyAgICAweDU1QjIsIDB4NjRDMSwgMHg1MEFELCAweDc2NzAsIDB4OEUzNCwgMHg1MTJBLCAweDYxODIsIDB4OTBGNSwgMHg5MjNFLAorICAgIDB4NzMzNiwgMHg4QTk4LCAweDhGM0YsIDB4OTkxOCwgMHg5QjVBLCAweDZGMDEsIDB4ODIwNywgMHg1REJDLCAweDhBOUUsCisgICAgMHg5QjMxLCAweDczNDQsIDB4OEI3RCwgMHg5ODEwLCAweDk5QUQsIDB4OUQxQiwgMHg2REY1LCAweDhGNDUsIDB4NTcxMiwKKyAgICAweDU0RTEsIDB4NTcxMywgMHg3REUzLCAweDkwNjAsIDB4OTg1OCwgMHg3RDA0LCAweDhFOEQsIDB4OTQ3MCwgMHg5NUIyLAorICAgIDB4OTZGMiwgMHg5MTE2LCAweDk2OTUsIDB4OTA0QiwgMHg4NUY0LCAweDkxOTYsIDB4NjY4OCwgMHg5NkRDLCAweDhGMDksCisgICAgMHg2NTIyLCAweDY2QUIsIDB4OEQwQSwgMHg4RDFDLCAweDgxREYsIDB4OTQ3RiwgMHg2OEQ3LCAweDdBQzgsIDB4OENBQywKKyAgICAweDY0QzcsIDB4NTI0NywgMHg2RkE0LCAweDhDQ0EsIDB4OEQwOCwgMHg4RUNCLCAweDkzNTgsIDB4OTU5OCwgMHg4QTUwLAorICAgIDB4OUY0QiwgMHg1MEI1LCAweDZDMDgsIDB4NzZERSwgMHg2NUFDLCAweDhGM0UsIDB4NUQ4NCwgMHg2OEU3LCAweDYyMzAsCisgICAgMHg3REJCLCAweDVGMzUsIDB4NkYzMiwgMHg1RTMzLCAweDhDRUMsIDB4ODEzOSwgMHg4RDk5LCAweDg3QzQsIDB4OEY0RCwKKyAgICAweDkzN0EsIDB4OTAxOSwgMHg4QzlFLCAweDkxREQsIDB4NTA3NSwgMHg4QTNBLCAweDkzQUUsIDB4OTY2MywgMHg1RTQwLAorICAgIDB4NzY2NSwgMHg5MTJELCAweDhCNDksIDB4N0U1NCwgMHg4MDc3LCAweDU3RjcsIDB4ODg3OSwgMHg3RDE5LCAweDY0NkYsCisgICAgMHg2NEYyLCAweDVFNUYsIDB4OENFQSwgMHg2RUVGLCAweDk0MTgsIDB4N0Q0MiwgMHg3QTJFLCAweDgxNkIsIDB4ODg0NiwKKyAgICAweDhCMDUsIDB4OEVGOCwgMHg3NkJBLCAweDY2NUQsIDB4OUE1RiwgMHg4QUY4LCAweDhBODUsIDB4NzFFRCwgMHg3N0RBLAorICAgIDB4NTZEMSwgMHg4Q0FGLCAweDk0NDQsIDB4N0JDOSwgMHg5OUQwLCAweDVDMDgsIDB4NzhEQSwgMHg4RjQ5LCAweDhDRkEsCisgICAgMHg2QTAxLCAweDgzOEEsIDB4ODhERCwgMHg1OTlELCAweDU4RUYsIDB4NzJDMCwgMHg5MzEwLCAweDhEMDUsIDB4NTg5QywKKyAgICAweDdEQjQsIDB4OEFDNCwgMHg2RTk2LCAweDZGQzEsIDB4OENDNywgMHg2RjJDLCAweDdEOUMsIDB4N0UzRCwgMHg3RTMxLAorICAgIDB4OTExMiwgMHg4QTVCLCAweDdENDQsIDB4OTQ3RCwgMHg1NUM3LCAweDUzOTksIDB4NTNCNCwgMHg5NzY4LCAweDhEMEIsCisgICAgMHg1MzJELCAweDUzMzEsIDB4OENGRSwgMHg1MjQ0LCAweDUyOEMsIDB4NTI3NCwgMHg1MEI0LCAweDUwMDAsIDB4NTA5NiwKKyAgICAweDUxMTUsIDB4NTEwMiwgMHg1MTE0LCAweDUxM0MsIDB4NTEzNywgMHg1MEU4LCAweDUwQzIsIDB4NTEzQiwgMHg1MTEwLAorICAgIDB4NTEzQSwgMHg1MEM5LCAweDdDRjQsIDB4OUVDQywgMHg1NkM1LCAweDlDRUMsIDB4ODkzQiwgMHg4MUUwLCAweDhBMDEsCisgICAgMHg4QTEwLCAweDhBMEMsIDB4OEExNSwgMHg4QjMzLCAweDhBNEUsIDB4OEEyNSwgMHg4QTQxLCAweDhBMzYsIDB4OEE0NiwKKyAgICAweDhBNTQsIDB4OEE1OCwgMHg4QTUyLCAweDhBODYsIDB4OEE4NCwgMHg4QTdGLCAweDhBNzAsIDB4OEE3QywgMHg4QTc1LAorICAgIDB4OEE2QywgMHg4QTZFLCAweDhBQ0QsIDB4OEFFMiwgMHg4QTYxLCAweDhBOUEsIDB4OEFBNSwgMHg4QTkxLCAweDhBOTIsCisgICAgMHg4QUNGLCAweDhBRDEsIDB4OEFDOSwgMHg4QURCLCAweDhBRDcsIDB4OEFDMiwgMHg4QUI2LCAweDhBRjYsIDB4OEFFQiwKKyAgICAweDhCMTQsIDB4OEIwMSwgMHg4QUU0LCAweDhBRUQsIDB4OEFGQywgMHg4QUYzLCAweDhBRTYsIDB4OEFFRSwgMHg4QURFLAorICAgIDB4OEIyOCwgMHg4QjlDLCAweDhCMTYsIDB4OEIxQSwgMHg4QjEwLCAweDhCMkIsIDB4OEIyRCwgMHg4QjU2LCAweDhCNTksCisgICAgMHg4QjRFLCAweDhCOUUsIDB4OEI2QiwgMHg4Qjk2LCAweDk2NTgsIDB4OTEzQSwgMHg5MTE0LCAweDkxMzQsIDB4OTBERiwKKyAgICAweDkxMzYsIDB4OTEwNiwgMHg5MTQ4LCAweDgyQkIsIDB4NTJGMSwgMHg1REYwLCAweDU4MEEsIDB4NThEOSwgMHg1OEUyLAorICAgIDB4NThFMCwgMHg1OERBLCAweDU3RTEsIDB4NTg0RiwgMHg1ODE2LCAweDU4NTIsIDB4NTgxRCwgMHg1ODY0LCAweDg1OEMsCisgICAgMHg4NTUzLCAweDg1RjYsIDB4ODNBNywgMHg4NDA3LCAweDg0RUYsIDB4ODJFNywgMHg4NjIyLCAweDg1MjYsIDB4NTg0QiwKKyAgICAweDcxNjIsIDB4ODU1OCwgMHg4NEZELCAweDg1NEUsIDB4ODU4OCwgMHg4NUJBLCAweDcyOTYsIDB4NkVDRSwgMHg4NTQxLAorICAgIDB4ODVDRSwgMHg4NTUyLCAweDg0QzAsIDB4ODQ1MiwgMHg4NDY0LCAweDg0OTQsIDB4ODQzNSwgMHg4NTlGLCAweDg1NTUsCisgICAgMHg5REFGLCAweDg0OTMsIDB4N0UwOCwgMHg4NTQ2LCAweDg1NjIsIDB4ODUxRSwgMHg5QTQwLCAweDg2M0EsIDB4OTNBMywKKyAgICAweDg1NzcsIDB4ODYxRSwgMHg4NUZBLCAweDg2MDQsIDB4ODVFQSwgMHg4NjFBLCAweDU5NjksIDB4NUMzNywgMHg2MzZCLAorICAgIDB4NjQ3NiwgMHg2NDlGLCAweDY0NTEsIDB4NjQ1QywgMHg2NEIzLCAweDY1MDQsIDB4NjUxNiwgMHg2NEY3LCAweDY0RkMsCisgICAgMHg2NTFCLCAweDU2MzAsIDB4NTYzOCwgMHg1NkM4LCAweDU2QTYsIDB4NTUwNCwgMHg1NEJDLCAweDU2ODAsIDB4NTY1RCwKKyAgICAweDU2NjAsIDB4NTYzNSwgMHg1NUY2LCAweDU2NjYsIDB4NTY3MiwgMHg1NjhDLCAweDU2NjUsIDB4NTYxQywgMHg1NjJFLAorICAgIDB4NTVFOSwgMHg1NjE2LCAweDU2QzAsIDB4NTYwRCwgMHg1NkIzLCAweDU2QzEsIDB4NTY2RiwgMHg4RjYxLCAweDU2QjYsCisgICAgMHg1Njk1LCAweDU3MDcsIDB4NUU0MywgMHg1RTZDLCAweDVFNTgsIDB4NUU1NywgMHg1RDg3LCAweDVDRjQsIDB4NUQ1MCwKKyAgICAweDVEMkMsIDB4NURBNywgMHg1REEwLCAweDVEOTcsIDB4NUQwRCwgMHg1REI4LCAweDVEODEsIDB4NURENCwgMHg1RkEwLAorICAgIDB4NzM3NywgMHg3MzQxLCAweDczNkEsIDB4NzMzQiwgMHg3MzZCLCAweDczODAsIDB4NzM3QywgMHg5OEUwLCAweDk5MzMsCisgICAgMHg5OEU5LCAweDk5M0MsIDB4OThFQSwgMHg5OEVCLCAweDk4RUQsIDB4OThGNCwgMHg5OTA5LCAweDk5MTEsIDB4OTkxQiwKKyAgICAweDk5MzcsIDB4OTkzRiwgMHg5OTQzLCAweDk5NDgsIDB4OTk0OSwgMHg5OTRBLCAweDk5NEMsIDB4OTk2MiwgMHg1RUUxLAorICAgIDB4OENFMSwgMHg2MUZBLCAweDYxQUUsIDB4NjE2QSwgMHg2MTNFLCAweDYwQjUsIDB4NjEzNCwgMHg2MUNDLCAweDYxNUYsCisgICAgMHg2MUU4LCAweDYwRkIsIDB4NjEzNywgMHg2MEYyLCAweDYxNzMsIDB4NjExQywgMHg2MTkyLCAweDk1ODIsIDB4OTU4NiwKKyAgICAweDk1QzgsIDB4OTU4RSwgMHg5NTk0LCAweDk1OEMsIDB4OTVFNSwgMHg5NUFELCAweDk1QUIsIDB4OUIyRSwgMHg5NUFDLAorICAgIDB4OTVCRSwgMHg5NUI2LCAweDlCMjksIDB4OTVCRiwgMHg5NUJELCAweDk1QkMsIDB4OTVDMywgMHg5NUNCLCAweDk1RDQsCisgICAgMHg5NUQwLCAweDk1RDUsIDB4OTVERSwgMHg3MDQzLCAweDZGNTksIDB4NzAyNywgMHg3MDE4LCAweDZGRkMsIDB4NkQ4NywKKyAgICAweDZENzksIDB4NkU1RSwgMHg2RkFFLCAweDcwMEYsIDB4NkVGOCwgMHg2RjZGLCAweDZERjYsIDB4NkY3RiwgMHg3MDA2LAorICAgIDB4NkZBMCwgMHg3MDBCLCAweDcwNjcsIDB4NzA0NCwgMHg3MDA1LCAweDZGNzcsIDB4NzAyMCwgMHg3MDFGLCAweDcwMzIsCisgICAgMHg3MDI4LCAweDcwNUQsIDB4OUEyQiwgMHg5MDg3LCAweDkwMTUsIDB4OTA5MCwgMHg1QzY4LCAweDVGMzMsIDB4NUFGNSwKKyAgICAweDVBRDcsIDB4NUIwMCwgMHg1QTZELCAweDVCMDgsIDB4NUI0QywgMHg1QUE3LCAweDVBRkIsIDB4NUIwQiwgMHg1QjIxLAorICAgIDB4NUIyQSwgMHg1QjE5LCAweDk5RDQsIDB4OTlERiwgMHg5OUQ5LCAweDlBMzYsIDB4OUE1QiwgMHg5OUQxLCAweDk5RDgsCisgICAgMHg5QTRELCAweDlBNEEsIDB4OTlFMiwgMHg5QTZBLCAweDlBMEYsIDB4OUEwRCwgMHg5QTA1LCAweDlBNDIsIDB4OUEyRCwKKyAgICAweDlBMTYsIDB4OUE0MSwgMHg5QTJFLCAweDlBMzgsIDB4OUE0MywgMHg5QTQ0LCAweDlBNEYsIDB4OUE2NSwgMHg5QTY0LAorICAgIDB4N0NGOSwgMHg3RDA2LCAweDdEMDIsIDB4N0QwNywgMHg3RDA4LCAweDdFOEEsIDB4N0QxQywgMHg3RDE1LCAweDdEMTMsCisgICAgMHg3RDNBLCAweDdEMzIsIDB4N0QzMSwgMHg3RTEwLCAweDdEM0MsIDB4N0Q0MCwgMHg3RDNGLCAweDdENUQsIDB4N0Q0RSwKKyAgICAweDdENzMsIDB4N0Q4NiwgMHg3RDgzLCAweDdEODgsIDB4N0RCRSwgMHg3REJBLCAweDdEQ0IsIDB4N0RENCwgMHg3REM0LAorICAgIDB4N0Q5RSwgMHg3REFDLCAweDdEQjksIDB4N0RBMywgMHg3REIwLCAweDdEQzcsIDB4N0REOSwgMHg3REQ3LCAweDdERjksCisgICAgMHg3REYyLCAweDdFNjIsIDB4N0RFNiwgMHg3REY2LCAweDdERjEsIDB4N0UwQiwgMHg3REUxLCAweDdFMDksIDB4N0UxRCwKKyAgICAweDdFMUYsIDB4N0UxRSwgMHg3RTJELCAweDdFMEEsIDB4N0UxMSwgMHg3RTdELCAweDdFMzksIDB4N0UzNSwgMHg3RTMyLAorICAgIDB4N0U0NiwgMHg3RTQ1LCAweDdFODgsIDB4N0U1QSwgMHg3RTUyLCAweDdFNkUsIDB4N0U3RSwgMHg3RTcwLCAweDdFNkYsCisgICAgMHg3RTk4LCAweDc0QTMsIDB4NzQ0QiwgMHg3NENGLCAweDk4MEEsIDB4NzRCRCwgMHg3NDNGLCAweDc0ODksIDB4NzRBNiwKKyAgICAweDc0RDQsIDB4NzREQSwgMHg5N0Q5LCAweDk3REUsIDB4OTdEQywgMHg2OUFBLCAweDZBRUEsIDB4Njg5OCwgMHg2OEQ2LAorICAgIDB4NkEwNSwgMHg2ODlGLCAweDZBREIsIDB4NkFGMywgMHg2QUU4LCAweDZBREYsIDB4NkE4OSwgMHg2OTBGLCAweDZBNDgsCisgICAgMHg2OTY4LCAweDY5QkYsIDB4NkEzQSwgMHg2QTlDLCAweDZCMTIsIDB4NkIxRSwgMHg2QURELCAweDY5RTcsIDB4NkIwRiwKKyAgICAweDZCMTYsIDB4NkFFQywgMHg2QURBLCAweDZBRjgsIDB4NkFCMywgMHg2QUU3LCAweDZBQTMsIDB4NkFEMywgMHg2QURFLAorICAgIDB4NkJBNCwgMHg2QjlFLCAweDZCQUUsIDB4NkJBQiwgMHg2QkFGLCAweDhFRDQsIDB4OEVEQiwgMHg4RUYyLCAweDhFRkIsCisgICAgMHg4RjY0LCAweDhFRjksIDB4OEVGQywgMHg4RUVCLCAweDhFRTQsIDB4OEY2MiwgMHg4RUZBLCAweDhFRkUsIDB4OEYwQSwKKyAgICAweDhGMDcsIDB4OEYwNSwgMHg4RjEyLCAweDhGMjYsIDB4OEYxRSwgMHg4RjFGLCAweDhGMUMsIDB4OEYzMywgMHg4RjQ2LAorICAgIDB4OEY1NCwgMHg2MjE0LCAweDYyMjcsIDB4NzUwQywgMHg2NkM3LCAweDY2QzQsIDB4NjY4OSwgMHg2NkQ2LCAweDhDQzEsCisgICAgMHg4Q0IwLCAweDhDQkEsIDB4OENCRCwgMHg4RDA0LCAweDhDQjIsIDB4OENDNSwgMHg4RDEwLCAweDhDRDEsIDB4OENEQSwKKyAgICAweDhDRDUsIDB4OENFQiwgMHg4Q0U3LCAweDhDRkIsIDB4ODk5OCwgMHg4OUFDLCAweDg5QTEsIDB4ODlCRiwgMHg4OUE2LAorICAgIDB4ODlBRiwgMHg4OUIyLCAweDg5QjcsIDB4NkJGRiwgMHg2QzBDLCAweDZDMkMsIDB4NzI1OCwgMHg2NzI3LCAweDgxNTYsCisgICAgMHg4MURBLCAweDgxMUIsIDB4ODFCRSwgMHg4MTYxLCAweDgxQ0YsIDB4NkI1RiwgMHg5OEFFLCAweDk4QUYsIDB4OThCNiwKKyAgICAweDk4QkMsIDB4OThDNiwgMHg5OEM4LCAweDhGNDIsIDB4OUY0RiwgMHg2NTk1LCAweDcxNkMsIDB4NzE1MiwgMHg3MTk3LAorICAgIDB4NzFDMSwgMHg3MURDLCAweDcxRkUsIDB4NzlCMCwgMHg3OThFLCAweDc5QUEsIDB4NjFERiwgMHg2MTY0LCAweDYxRTMsCisgICAgMHg2MjA3LCAweDZGQTksIDB4NzhFRiwgMHg3OEFELCAweDc4NjgsIDB4NzhCOCwgMHg3OTJBLCAweDc5MzEsIDB4Nzg2NCwKKyAgICAweDc4RkQsIDB4NzhFNywgMHg3OEUzLCAweDlGOTUsIDB4Nzc5OCwgMHg3NzVFLCAweDc3QkMsIDB4N0Y4NiwgMHg3Rjg4LAorICAgIDB4OTFEMiwgMHg5MUQzLCAweDkxRDQsIDB4OTFEOSwgMHg5MUQ3LCAweDkxRDUsIDB4OTFGNywgMHg5MUU3LCAweDkxRTQsCisgICAgMHg5MzQ2LCAweDkxRjUsIDB4OTFGOSwgMHg5MjA4LCAweDkyMjYsIDB4OTI0NSwgMHg5MjExLCAweDkyMTAsIDB4OTIwMSwKKyAgICAweDkyMjcsIDB4OTIwNCwgMHg5MjI1LCAweDkyMDAsIDB4OTIzQSwgMHg5MjY2LCAweDkyMzcsIDB4OTIzMywgMHg5MjU1LAorICAgIDB4OTIzRCwgMHg5MjM4LCAweDkyNUUsIDB4OTI2QywgMHg5MjZELCAweDkyM0YsIDB4OTQ2MCwgMHg5MjMwLCAweDkyNDksCisgICAgMHg5MjQ4LCAweDkyNEQsIDB4OTIyRSwgMHg5MjM5LCAweDk0MzgsIDB4OTJBQywgMHg5MkEwLCAweDkyN0EsIDB4OTJBQSwKKyAgICAweDkyRUUsIDB4OTJDRiwgMHg5NDAzLCAweDkyRTMsIDB4OTQzQSwgMHg5MkIxLCAweDkyQTYsIDB4OTNBNywgMHg5Mjk2LAorICAgIDB4OTJDQywgMHg5MkE5LCAweDkzRjUsIDB4OTI5MywgMHg5MjdGLCAweDkzQTksIDB4OTI5QSwgMHg5MzFBLCAweDkyQUIsCisgICAgMHg5MjgzLCAweDk0MEIsIDB4OTJBOCwgMHg5MkEzLCAweDk0MTIsIDB4OTMzOCwgMHg5MkYxLCAweDkzRDcsIDB4OTJFNSwKKyAgICAweDkyRjAsIDB4OTJFRiwgMHg5MkU4LCAweDkyQkMsIDB4OTJERCwgMHg5MkY2LCAweDk0MjYsIDB4OTQyNywgMHg5MkMzLAorICAgIDB4OTJERiwgMHg5MkU2LCAweDkzMTIsIDB4OTMwNiwgMHg5MzY5LCAweDkzMUIsIDB4OTM0MCwgMHg5MzAxLCAweDkzMTUsCisgICAgMHg5MzJFLCAweDkzNDMsIDB4OTMwNywgMHg5MzA4LCAweDkzMUYsIDB4OTMxOSwgMHg5MzY1LCAweDkzNDcsIDB4OTM3NiwKKyAgICAweDkzNTQsIDB4OTM2NCwgMHg5M0FBLCAweDkzNzAsIDB4OTM4NCwgMHg5M0U0LCAweDkzRDgsIDB4OTQyOCwgMHg5Mzg3LAorICAgIDB4OTNDQywgMHg5Mzk4LCAweDkzQjgsIDB4OTNCRiwgMHg5M0E2LCAweDkzQjAsIDB4OTNCNSwgMHg5NDRDLCAweDkzRTIsCisgICAgMHg5M0RDLCAweDkzREQsIDB4OTNDRCwgMHg5M0RFLCAweDkzQzMsIDB4OTNDNywgMHg5M0QxLCAweDk0MTQsIDB4OTQxRCwKKyAgICAweDkzRjcsIDB4OTQ2NSwgMHg5NDEzLCAweDk0NkQsIDB4OTQyMCwgMHg5NDc5LCAweDkzRjksIDB4OTQxOSwgMHg5NDRBLAorICAgIDB4OTQzMiwgMHg5NDNGLCAweDk0NTQsIDB4OTQ2MywgMHg5MzdFLCAweDdBNjEsIDB4OUNFOSwgMHg5Q0Y2LCAweDlEMDcsCisgICAgMHg5RDA2LCAweDlEMjMsIDB4OUQ4NywgMHg5RTE1LCAweDlEMUQsIDB4OUQxRiwgMHg5REU1LCAweDlEMkYsIDB4OUREOSwKKyAgICAweDlEMzAsIDB4OUQ0MiwgMHg5RTFFLCAweDlENTMsIDB4OUUxRCwgMHg5RDYwLCAweDlENTIsIDB4OURGMywgMHg5RDVDLAorICAgIDB4OUQ2MSwgMHg5RDkzLCAweDlENkEsIDB4OUQ2RiwgMHg5RDg5LCAweDlEOTgsIDB4OUQ5QSwgMHg5REMwLCAweDlEQTUsCisgICAgMHg5REE5LCAweDlEQzIsIDB4OURCQywgMHg5RTFBLCAweDlERDMsIDB4OUREQSwgMHg5REVGLCAweDlERTYsIDB4OURGMiwKKyAgICAweDlERjgsIDB4OUUwQywgMHg5REZBLCAweDlFMUIsIDB4NzY2NCwgMHg3NjU4LCAweDc2NjcsIDB4NzYwMiwgMHg3NjQ2LAorICAgIDB4NzY0NywgMHg3NjQ5LCAweDc2MUUsIDB4NzYzQiwgMHg3NjZELCAweDc2NkUsIDB4NzY2OSwgMHg3NjcyLCAweDdBQzcsCisgICAgMHg3QUI2LCAweDg5NjAsIDB4ODkzMywgMHg4OTVELCAweDg5NDcsIDB4ODkzOCwgMHg4OTY0LCAweDc2QjgsIDB4ODAyRSwKKyAgICAweDgwMkMsIDB4ODA3OSwgMHg4MDc1LCAweDk4MDcsIDB4OTgwRSwgMHg5ODBGLCAweDk4MjEsIDB4OTgxQywgMHg2RjQxLAorICAgIDB4OTgyNiwgMHg5ODM3LCAweDk4NEUsIDB4OTg1MywgMHg5ODczLCAweDk4NjIsIDB4OTg1OSwgMHg5ODY1LCAweDk4NkMsCisgICAgMHg5ODcwLCAweDg3RTMsIDB4ODgwNiwgMHg4NzA2LCAweDg4MjMsIDB4ODdGNiwgMHg4NkZBLCAweDg3RUYsIDB4ODc4NCwKKyAgICAweDg4MTAsIDB4ODdDOCwgMHg4ODExLCAweDg3QkIsIDB4ODdDRSwgMHg3RjRDLCAweDdCRTQsIDB4N0I2NywgMHg3QzY5LAorICAgIDB4N0JGMywgMHg3QzAwLCAweDdCQ0IsIDB4N0M1QywgMHg3QzFFLCAweDdDMkIsIDB4N0MyMywgMHg3QzZBLCAweDdDNUYsCisgICAgMHg4MjY0LCAweDgyNkIsIDB4ODhDQSwgMHg3RkE1LCAweDdDRjIsIDB4N0NGNiwgMHg3Q0RELCAweDdFMzYsIDB4OUVBOSwKKyAgICAweDhEQjIsIDB4OTFDNSwgMHg5MUMzLCAweDlFN0EsIDB4OEU4OSwgMHg4RTRDLCAweDhFOTIsIDB4OEU3QSwgMHg4RTU1LAorICAgIDB4OEU5QSwgMHg4RThCLCAweDhFOTMsIDB4OEU5MSwgMHg4RUExLCAweDhFNjMsIDB4OEVBQSwgMHg4RUE2LCAweDg5RjQsCisgICAgMHg4OUY2LCAweDk3NUEsIDB4OTc0MiwgMHg5NzNELCAweDk3NDQsIDB4OUY1NCwgMHg5RjVGLCAweDlGNTksIDB4OUY2MCwKKyAgICAweDlGNUMsIDB4OUY2NiwgMHg5RjZDLCAweDlGNkEsIDB4OUY3NywgMHg5RUZELCAweDlFRkYsIDB4OUYwOSwgMHg4QjhFLAorICAgIDB4OTQ3RSwgMHg5M0U4LCAweDlCNzcsIDB4OUI3NCwgMHg5QjgxLCAweDlCODMsIDB4OUI4RSwgMHg5Qzc4LCAweDdBNEMsCisgICAgMHg5QjkyLCAweDlDNUYsIDB4OUI5MCwgMHg5QkFELCAweDlCOUEsIDB4OUJBQSwgMHg5QjlFLCAweDlDNkQsIDB4OUJBQiwKKyAgICAweDlCOUQsIDB4OUM1OCwgMHg5QkMxLCAweDlDN0EsIDB4OUMzMSwgMHg5QzM5LCAweDlDMjMsIDB4OUMzNywgMHg5QkMwLAorICAgIDB4OUJDQSwgMHg5QkM3LCAweDlCRkQsIDB4OUJENiwgMHg5QkVBLCAweDlCRUIsIDB4OUJFMSwgMHg5QkU0LCAweDlCRTcsCisgICAgMHg5QkRELCAweDlCRTIsIDB4OUJGMCwgMHg5QkRCLCAweDlCRjQsIDB4OUJENCwgMHg5QzVELCAweDlDMDgsIDB4OUMxMCwKKyAgICAweDlDMEQsIDB4OUMxMiwgMHg5QzA5LCAweDlCRkYsIDB4OUMyMCwgMHg5QzMyLCAweDlDMkQsIDB4OUMyOCwgMHg5QzI1LAorICAgIDB4OUMyOSwgMHg5QzMzLCAweDlDM0UsIDB4OUM0OCwgMHg5QzNCLCAweDlDMzUsIDB4OUM0NSwgMHg5QzU2LCAweDlDNTQsCisgICAgMHg5QzUyLCAweDlDNjcsIDB4OTdDMywgMHg5N0JELCAweDk3QzksIDB4OURCQiwgMHg5QUNGLCAweDlBRDYsIDB4OUFENSwKKyAgICAweDlCNTgsIDB4OUI0RSwgMHg5OTU3LCAweDk5NUMsIDB4OUIyMiwgMHg5RUY3LCAweDlFRjIsIDB4ODk2QywgMHg5NUM2LAorICAgIDB4OTMzNiwgMHg1RjQ2LCAweDg1MTQsIDB4N0U5NCwgMHg5RjYzLCAweDU2NzksIDB4OUYxNSwgMHg1NjQxLCAweDlBRUUsCisgICAgMHg4OTA3LCAweDdBNDAsIDB4OThCMywgMHg5NUE0LCAweDlCMEQsIDB4OEZGNCwgMHg1RjU5LCAweDdBNkIsIDB4OThFMiwKKyAgICAweDUwQTIsIDB4ODU5MSwgMHg1MTE4LCAweDYzNzIsIDB4NTI0QiwgMHg3NzRGLCAweDdFOEQsIDB4NjZDNiwgMHg3N0FELAorICAgIDB4OUU3NSwgMHg1NkM5LCAweDlFRjQsIDB4NkZEQiwgMHg2MURFLCAweDc3QzcsIDB4NzAzMCwgMHg5RUI1LCAweDg4NEEsCisgICAgMHg5NUUyLCAweDk3QzYsIDB4N0M2NCwgMHg3RTM0LCAweDk3QTYsIDB4OUVBRiwgMHg1NkNDLCAweDk4QjEsIDB4NkFBRiwKKyAgICAweDdGNEUsIDB4N0NGMCwgMHg0RkMyLCAweDdFNkIsIDB4OUU3OSwgMHg1NkFFLCAweDlCMUEsIDB4ODQ2RiwgMHg3OUE2LAorICAgIDB4N0M3MiwgMHg5QUQyLCAweDk2QkIsIDB4N0RGQiwgMHg4OEZELCAweDc4NDMsIDB4MjE3MCwgMHgyMTcxLCAweDIxNzIsCisgICAgMHgyMTczLCAweDIxNzQsIDB4MjE3NSwgMHgyMTc2LCAweDIxNzcsIDB4MjE3OCwgMHgyMTc5LCAweDAyQ0EsIDB4MDJDQiwKKyAgICAweDAyRDksIDB4MjAxMywgMHgyMDE1LCAweDIwMjUsIDB4MjAzNSwgMHgyMTA1LCAweDIxMDksIDB4MjE5NiwgMHgyMTk3LAorICAgIDB4MjE5OCwgMHgyMTk5LCAweDIyMTUsIDB4MjIxRiwgMHgyMjIzLCAweDIyNTIsIDB4MjI2NiwgMHgyMjY3LCAweDIyQkYsCisgICAgMHgyNTUwLCAweDI1NTEsIDB4MjU1MiwgMHgyNTUzLCAweDI1NTQsIDB4MjU1NSwgMHgyNTU2LCAweDI1NTcsIDB4MjU1OCwKKyAgICAweDI1NTksIDB4MjU1QSwgMHgyNTVCLCAweDI1NUMsIDB4MjU1RCwgMHgyNTVFLCAweDI1NUYsIDB4MjU2MCwgMHgyNTYxLAorICAgIDB4MjU2MiwgMHgyNTYzLCAweDI1NjQsIDB4MjU2NSwgMHgyNTY2LCAweDI1NjcsIDB4MjU2OCwgMHgyNTY5LCAweDI1NkEsCisgICAgMHgyNTZCLCAweDI1NkMsIDB4MjU2RCwgMHgyNTZFLCAweDI1NkYsIDB4MjU3MCwgMHgyNTcxLCAweDI1NzIsIDB4MjU3MywKKyAgICAweDI1ODEsIDB4MjU4MiwgMHgyNTgzLCAweDI1ODQsIDB4MjU4NSwgMHgyNTg2LCAweDI1ODcsIDB4MjU4OCwgMHgyNTg5LAorICAgIDB4MjU4QSwgMHgyNThCLCAweDI1OEMsIDB4MjU4RCwgMHgyNThFLCAweDI1OEYsIDB4MjU5MywgMHgyNTk0LCAweDI1OTUsCisgICAgMHgyNUJDLCAweDI1QkQsIDB4MjVFMiwgMHgyNUUzLCAweDI1RTQsIDB4MjVFNSwgMHgyNjA5LCAweDIyOTUsIDB4MzAxMiwKKyAgICAweDMwMUQsIDB4MzAxRSwgMHgzMDIxLCAweDMwMjIsIDB4MzAyMywgMHgzMDI0LCAweDMwMjUsIDB4MzAyNiwgMHgzMDI3LAorICAgIDB4MzAyOCwgMHgzMDI5LCAweDMyQTMsIDB4MzM4RSwgMHgzMzhGLCAweDMzOUMsIDB4MzM5RCwgMHgzMzlFLCAweDMzQTEsCisgICAgMHgzM0M0LCAweDMzQ0UsIDB4MzNEMSwgMHgzM0QyLCAweDMzRDUsIDB4RkUzMCwgMHhGRkUyLCAweEZGRTQsIDB4MjEyMSwKKyAgICAweDMyMzEsIDB4MjAxMCwgMHgzMEZDLCAweDMwOUIsIDB4MzA5QywgMHgzMEZELCAweDMwRkUsIDB4MzAwNiwgMHgzMDlELAorICAgIDB4MzA5RSwgMHhGRTQ5LCAweEZFNEEsIDB4RkU0QiwgMHhGRTRDLCAweEZFNEQsIDB4RkU0RSwgMHhGRTRGLCAweEZFNTAsCisgICAgMHhGRTUxLCAweEZFNTIsIDB4RkU1NCwgMHhGRTU1LCAweEZFNTYsIDB4RkU1NywgMHhGRTU5LCAweEZFNUEsIDB4RkU1QiwKKyAgICAweEZFNUMsIDB4RkU1RCwgMHhGRTVFLCAweEZFNUYsIDB4RkU2MCwgMHhGRTYxLCAweEZFNjIsIDB4RkU2MywgMHhGRTY0LAorICAgIDB4RkU2NSwgMHhGRTY2LCAweEZFNjgsIDB4RkU2OSwgMHhGRTZBLCAweEZFNkIsIDB4MzAzRSwgMHgyRkYwLCAweDJGRjEsCisgICAgMHgyRkYyLCAweDJGRjMsIDB4MkZGNCwgMHgyRkY1LCAweDJGRjYsIDB4MkZGNywgMHgyRkY4LCAweDJGRjksIDB4MkZGQSwKKyAgICAweDJGRkIsIDB4NEUwMiwgMHg0RTA0LCAweDRFMDUsIDB4NEUwNiwgMHg0RTBGLCAweDRFMTIsIDB4NEUxNywgMHg0RTFGLAorICAgIDB4NEUyMCwgMHg0RTIxLCAweDRFMjMsIDB4NEUyNiwgMHg0RTI5LCAweDRFMkUsIDB4NEUyRiwgMHg0RTMxLCAweDRFMzMsCisgICAgMHg0RTM1LCAweDRFMzcsIDB4NEUzQywgMHg0RTQwLCAweDRFNDEsIDB4NEU0MiwgMHg0RTQ0LCAweDRFNDYsIDB4NEU0QSwKKyAgICAweDRFNTEsIDB4NEU1NSwgMHg0RTU3LCAweDRFNUEsIDB4NEU1QiwgMHg0RTYyLCAweDRFNjMsIDB4NEU2NCwgMHg0RTY1LAorICAgIDB4NEU2NywgMHg0RTY4LCAweDRFNkEsIDB4NEU2QiwgMHg0RTZDLCAweDRFNkQsIDB4NEU2RSwgMHg0RTZGLCAweDRFNzIsCisgICAgMHg0RTc0LCAweDRFNzUsIDB4NEU3NiwgMHg0RTc3LCAweDRFNzgsIDB4NEU3OSwgMHg0RTdBLCAweDRFN0IsIDB4NEU3QywKKyAgICAweDRFN0QsIDB4NEU3RiwgMHg0RTgwLCAweDRFODEsIDB4NEU4MywgMHg0RTg0LCAweDRFODUsIDB4NEU4NywgMHg0RThBLAorICAgIDB4NEU5MCwgMHg0RTk2LCAweDRFOTcsIDB4NEU5OSwgMHg0RTlDLCAweDRFOUQsIDB4NEVBMywgMHg0RUFBLCAweDRFQUYsCisgICAgMHg0RUIwLCAweDRFQjEsIDB4NEVCNCwgMHg0RUI2LCAweDRFQjcsIDB4NEVCOCwgMHg0RUI5LCAweDRFQkMsIDB4NEVCRCwKKyAgICAweDRFQkUsIDB4NEVDOCwgMHg0RUNDLCAweDRFQ0YsIDB4NEVEMCwgMHg0RUQyLCAweDRFREEsIDB4NEVEQiwgMHg0RURDLAorICAgIDB4NEVFMCwgMHg0RUUyLCAweDRFRTYsIDB4NEVFNywgMHg0RUU5LCAweDRFRUQsIDB4NEVFRSwgMHg0RUVGLCAweDRFRjEsCisgICAgMHg0RUY0LCAweDRFRjgsIDB4NEVGOSwgMHg0RUZBLCAweDRFRkMsIDB4NEVGRSwgMHg0RjAwLCAweDRGMDIsIDB4NEYwMywKKyAgICAweDRGMDQsIDB4NEYwNSwgMHg0RjA2LCAweDRGMDcsIDB4NEYwOCwgMHg0RjBCLCAweDRGMEMsIDB4NEYxMiwgMHg0RjEzLAorICAgIDB4NEYxNCwgMHg0RjE1LCAweDRGMTYsIDB4NEYxQywgMHg0RjFELCAweDRGMjEsIDB4NEYyMywgMHg0RjI4LCAweDRGMjksCisgICAgMHg0RjJDLCAweDRGMkQsIDB4NEYyRSwgMHg0RjMxLCAweDRGMzMsIDB4NEYzNSwgMHg0RjM3LCAweDRGMzksIDB4NEYzQiwKKyAgICAweDRGM0UsIDB4NEYzRiwgMHg0RjQwLCAweDRGNDEsIDB4NEY0MiwgMHg0RjQ0LCAweDRGNDUsIDB4NEY0NywgMHg0RjQ4LAorICAgIDB4NEY0OSwgMHg0RjRBLCAweDRGNEIsIDB4NEY0QywgMHg0RjUyLCAweDRGNTQsIDB4NEY1NiwgMHg0RjYxLCAweDRGNjIsCisgICAgMHg0RjY2LCAweDRGNjgsIDB4NEY2QSwgMHg0RjZCLCAweDRGNkQsIDB4NEY2RSwgMHg0RjcxLCAweDRGNzIsIDB4NEY3NSwKKyAgICAweDRGNzcsIDB4NEY3OCwgMHg0Rjc5LCAweDRGN0EsIDB4NEY3RCwgMHg0RjgwLCAweDRGODEsIDB4NEY4MiwgMHg0Rjg1LAorICAgIDB4NEY4NywgMHg0RjhBLCAweDRGOEMsIDB4NEY4RSwgMHg0RjkwLCAweDRGOTIsIDB4NEY5MywgMHg0Rjk1LCAweDRGOTgsCisgICAgMHg0Rjk5LCAweDRGOUEsIDB4NEY5QywgMHg0RjlFLCAweDRGOUYsIDB4NEZBMSwgMHg0RkEyLCAweDRGQTQsIDB4NEZBQiwKKyAgICAweDRGQUQsIDB4NEZCMCwgMHg0RkIxLCAweDRGQjIsIDB4NEZCMywgMHg0RkI0LCAweDRGQjYsIDB4NEZCNywgMHg0RkI4LAorICAgIDB4NEZCOSwgMHg0RkJBLCAweDRGQkIsIDB4NEZCQywgMHg0RkJELCAweDRGQkUsIDB4NEZDMCwgMHg0RkMxLCAweDRGQzYsCisgICAgMHg0RkM3LCAweDRGQzgsIDB4NEZDOSwgMHg0RkNCLCAweDRGQ0MsIDB4NEZDRCwgMHg0RkQyLCAweDRGRDMsIDB4NEZENCwKKyAgICAweDRGRDUsIDB4NEZENiwgMHg0RkQ5LCAweDRGREIsIDB4NEZFMiwgMHg0RkU0LCAweDRGRTUsIDB4NEZFNywgMHg0RkVCLAorICAgIDB4NEZFQywgMHg0RkYwLCAweDRGRjIsIDB4NEZGNCwgMHg0RkY1LCAweDRGRjYsIDB4NEZGNywgMHg0RkY5LCAweDRGRkIsCisgICAgMHg0RkZDLCAweDRGRkQsIDB4NEZGRiwgMHg1MDAxLCAweDUwMDIsIDB4NTAwMywgMHg1MDA0LCAweDUwMDUsIDB4NTAwNywKKyAgICAweDUwMDgsIDB4NTAwQSwgMHg1MDBFLCAweDUwMTAsIDB4NTAxMywgMHg1MDE1LCAweDUwMTYsIDB4NTAxNywgMHg1MDFCLAorICAgIDB4NTAxRCwgMHg1MDFFLCAweDUwMjAsIDB4NTAyMiwgMHg1MDIzLCAweDUwMjQsIDB4NTAyNywgMHg1MDJGLCAweDUwMzAsCisgICAgMHg1MDMxLCAweDUwMzIsIDB4NTAzMywgMHg1MDM0LCAweDUwMzUsIDB4NTAzNiwgMHg1MDM3LCAweDUwMzgsIDB4NTAzOSwKKyAgICAweDUwM0IsIDB4NTAzRCwgMHg1MDNGLCAweDUwNDAsIDB4NTA0MSwgMHg1MDQyLCAweDUwNDQsIDB4NTA0NSwgMHg1MDQ2LAorICAgIDB4NTA0QSwgMHg1MDRCLCAweDUwNEQsIDB4NTA1MCwgMHg1MDUxLCAweDUwNTIsIDB4NTA1MywgMHg1MDU0LCAweDUwNTYsCisgICAgMHg1MDU3LCAweDUwNTgsIDB4NTA1OSwgMHg1MDVCLCAweDUwNUQsIDB4NTA1RSwgMHg1MDVGLCAweDUwNjAsIDB4NTA2MSwKKyAgICAweDUwNjIsIDB4NTA2MywgMHg1MDY0LCAweDUwNjYsIDB4NTA2NywgMHg1MDY4LCAweDUwNjksIDB4NTA2QSwgMHg1MDZCLAorICAgIDB4NTA2RCwgMHg1MDZFLCAweDUwNkYsIDB4NTA3MCwgMHg1MDcxLCAweDUwNzIsIDB4NTA3MywgMHg1MDc4LCAweDUwNzksCisgICAgMHg1MDdBLCAweDUwN0MsIDB4NTA3RCwgMHg1MDgxLCAweDUwODIsIDB4NTA4MywgMHg1MDg0LCAweDUwODYsIDB4NTA4NywKKyAgICAweDUwODksIDB4NTA4QSwgMHg1MDhCLCAweDUwOEMsIDB4NTA4RSwgMHg1MDhGLCAweDUwOTAsIDB4NTA5MSwgMHg1MDkyLAorICAgIDB4NTA5MywgMHg1MDk0LCAweDUwOTUsIDB4NTA5NywgMHg1MDlBLCAweDUwOUIsIDB4NTA5QywgMHg1MDlELCAweDUwOUUsCisgICAgMHg1MDlGLCAweDUwQTAsIDB4NTBBMSwgMHg1MEE0LCAweDUwQTYsIDB4NTBBQSwgMHg1MEFCLCAweDUwQUUsIDB4NTBBRiwKKyAgICAweDUwQjAsIDB4NTBCMSwgMHg1MEI2LCAweDUwQjgsIDB4NTBCOSwgMHg1MEJDLCAweDUwQkQsIDB4NTBCRiwgMHg1MEMwLAorICAgIDB4NTBDMSwgMHg1MEMzLCAweDUwQzQsIDB4NTBDNiwgMHg1MEM3LCAweDUwQzgsIDB4NTBDQSwgMHg1MENCLCAweDUwQ0MsCisgICAgMHg1MENELCAweDUwQ0UsIDB4NTBEMCwgMHg1MEQyLCAweDUwRDMsIDB4NTBENCwgMHg1MEQ3LCAweDUwRDgsIDB4NTBEOSwKKyAgICAweDUwREIsIDB4NTBEQywgMHg1MERELCAweDUwREYsIDB4NTBFMCwgMHg1MEUxLCAweDUwRTIsIDB4NTBFMywgMHg1MEU0LAorICAgIDB4NTBFOSwgMHg1MEVBLCAweDUwRUIsIDB4NTBFRiwgMHg1MEYwLCAweDUwRjEsIDB4NTBGMiwgMHg1MEY0LCAweDUwRjYsCisgICAgMHg1MEY3LCAweDUwRjgsIDB4NTBGQSwgMHg1MEZDLCAweDUwRkQsIDB4NTBGRSwgMHg1MEZGLCAweDUxMDEsIDB4NTEwMywKKyAgICAweDUxMDUsIDB4NTEwQSwgMHg1MTBDLCAweDUxMEQsIDB4NTEwRSwgMHg1MTBGLCAweDUxMTEsIDB4NTExMywgMHg1MTE2LAorICAgIDB4NTExNywgMHg1MTE5LCAweDUxMUEsIDB4NTExQiwgMHg1MTFDLCAweDUxMUQsIDB4NTExRSwgMHg1MTIwLCAweDUxMjIsCisgICAgMHg1MTIzLCAweDUxMjQsIDB4NTEyNSwgMHg1MTI2LCAweDUxMjcsIDB4NTEyOCwgMHg1MTI5LCAweDUxMkIsIDB4NTEyQywKKyAgICAweDUxMkQsIDB4NTEyRSwgMHg1MTJGLCAweDUxMzAsIDB4NTEzMSwgMHg1MTMzLCAweDUxMzQsIDB4NTEzNSwgMHg1MTM2LAorICAgIDB4NTEzOCwgMHg1MTM5LCAweDUxM0QsIDB4NTEzRSwgMHg1MTQyLCAweDUxNDcsIDB4NTE0QSwgMHg1MTRDLCAweDUxNEUsCisgICAgMHg1MTRGLCAweDUxNTAsIDB4NTE1MywgMHg1MTU3LCAweDUxNTgsIDB4NTE1OSwgMHg1MTVCLCAweDUxNUQsIDB4NTE1RSwKKyAgICAweDUxNUYsIDB4NTE2MCwgMHg1MTYxLCAweDUxNjMsIDB4NTE2NCwgMHg1MTY2LCAweDUxNjcsIDB4NTE2QSwgMHg1MTZGLAorICAgIDB4NTE3MiwgMHg1MTdBLCAweDUxN0UsIDB4NTE3RiwgMHg1MTgzLCAweDUxODQsIDB4NTE4NiwgMHg1MTg3LCAweDUxOEEsCisgICAgMHg1MThCLCAweDUxOEUsIDB4NTE4RiwgMHg1MTkwLCAweDUxOTEsIDB4NTE5MywgMHg1MTk0LCAweDUxOTgsIDB4NTE5QSwKKyAgICAweDUxOUQsIDB4NTE5RSwgMHg1MTlGLCAweDUxQTEsIDB4NTFBMywgMHg1MUE2LCAweDUxQTcsIDB4NTFBOCwgMHg1MUE5LAorICAgIDB4NTFBQSwgMHg1MUFELCAweDUxQUUsIDB4NTFCNCwgMHg1MUI4LCAweDUxQjksIDB4NTFCQSwgMHg1MUJFLCAweDUxQkYsCisgICAgMHg1MUMxLCAweDUxQzIsIDB4NTFDMywgMHg1MUM1LCAweDUxQzgsIDB4NTFDQSwgMHg1MUNFLCAweDUxRDAsIDB4NTFEMiwKKyAgICAweDUxRDMsIDB4NTFENCwgMHg1MUQ1LCAweDUxRDYsIDB4NTFENywgMHg1MUQ4LCAweDUxRDksIDB4NTFEQSwgMHg1MURDLAorICAgIDB4NTFERSwgMHg1MURGLCAweDUxRTIsIDB4NTFFMywgMHg1MUU1LCAweDUxRTYsIDB4NTFFNywgMHg1MUU4LCAweDUxRTksCisgICAgMHg1MUVBLCAweDUxRUMsIDB4NTFFRSwgMHg1MUYyLCAweDUxRjQsIDB4NTFGNywgMHg1MUZFLCAweDUyMDQsIDB4NTIwNSwKKyAgICAweDUyMDksIDB4NTIwQiwgMHg1MjBDLCAweDUyMEYsIDB4NTIxMCwgMHg1MjEzLCAweDUyMTQsIDB4NTIxNSwgMHg1MjFDLAorICAgIDB4NTIxRSwgMHg1MjFGLCAweDUyMjEsIDB4NTIyMiwgMHg1MjIzLCAweDUyMjUsIDB4NTIyNiwgMHg1MjI3LCAweDUyMkEsCisgICAgMHg1MjJDLCAweDUyMkYsIDB4NTIzMSwgMHg1MjMyLCAweDUyMzQsIDB4NTIzNSwgMHg1MjNDLCAweDUyM0UsIDB4NTI0NSwKKyAgICAweDUyNDYsIDB4NTI0OCwgMHg1MjQ5LCAweDUyNEUsIDB4NTI0RiwgMHg1MjUyLCAweDUyNTMsIDB4NTI1NSwgMHg1MjU3LAorICAgIDB4NTI1OCwgMHg1MjU5LCAweDUyNUEsIDB4NTI1RCwgMHg1MjVGLCAweDUyNjAsIDB4NTI2MiwgMHg1MjYzLCAweDUyNjQsCisgICAgMHg1MjY2LCAweDUyNjgsIDB4NTI2QiwgMHg1MjZDLCAweDUyNkQsIDB4NTI3MCwgMHg1MjcxLCAweDUyNzMsIDB4NTI3NiwKKyAgICAweDUyNzcsIDB4NTI3OCwgMHg1Mjc5LCAweDUyN0EsIDB4NTI3QiwgMHg1MjdDLCAweDUyN0UsIDB4NTI4MCwgMHg1Mjg0LAorICAgIDB4NTI4NSwgMHg1Mjg2LCAweDUyOEIsIDB4NTI4RSwgMHg1MjhGLCAweDUyOTIsIDB4NTI5NCwgMHg1Mjk1LCAweDUyOTYsCisgICAgMHg1Mjk3LCAweDUyOTgsIDB4NTI5OSwgMHg1MjlBLCAweDUyOUMsIDB4NTJBNCwgMHg1MkE1LCAweDUyQTYsIDB4NTJBNywKKyAgICAweDUyQUUsIDB4NTJBRiwgMHg1MkIwLCAweDUyQjQsIDB4NTJCNSwgMHg1MkI2LCAweDUyQjcsIDB4NTJCOCwgMHg1MkI5LAorICAgIDB4NTJCQSwgMHg1MkJCLCAweDUyQkMsIDB4NTJCRCwgMHg1MkMwLCAweDUyQzIsIDB4NTJDNCwgMHg1MkM1LCAweDUyQzYsCisgICAgMHg1MkM4LCAweDUyQ0EsIDB4NTJDQywgMHg1MkNELCAweDUyQ0UsIDB4NTJDRiwgMHg1MkQxLCAweDUyRDMsIDB4NTJENCwKKyAgICAweDUyRDcsIDB4NTJEQSwgMHg1MkRDLCAweDUyRTAsIDB4NTJFMSwgMHg1MkUzLCAweDUyRTUsIDB4NTJFNiwgMHg1MkU3LAorICAgIDB4NTJFOCwgMHg1MkU5LCAweDUyRUEsIDB4NTJFQiwgMHg1MkVDLCAweDUyRUQsIDB4NTJFRSwgMHg1MkVGLCAweDUyRjIsCisgICAgMHg1MkYzLCAweDUyRjQsIDB4NTJGNiwgMHg1MkY3LCAweDUyRkIsIDB4NTJGQywgMHg1MkZELCAweDUzMDEsIDB4NTMwMiwKKyAgICAweDUzMDMsIDB4NTMwNCwgMHg1MzA3LCAweDUzMDksIDB4NTMwQSwgMHg1MzBCLCAweDUzMEMsIDB4NTMwRSwgMHg1MzExLAorICAgIDB4NTMxMiwgMHg1MzEzLCAweDUzMTQsIDB4NTMxOCwgMHg1MzFCLCAweDUzMUMsIDB4NTMxRSwgMHg1MzFGLCAweDUzMjIsCisgICAgMHg1MzI0LCAweDUzMjUsIDB4NTMyNywgMHg1MzI4LCAweDUzMjksIDB4NTMyQiwgMHg1MzJDLCAweDUzMzAsIDB4NTMzMiwKKyAgICAweDUzMzMsIDB4NTMzNCwgMHg1MzM1LCAweDUzMzYsIDB4NTMzNywgMHg1MzM4LCAweDUzM0MsIDB4NTMzRCwgMHg1MzQyLAorICAgIDB4NTM0NCwgMHg1MzQ2LCAweDUzNEIsIDB4NTM0QywgMHg1MzRELCAweDUzNTAsIDB4NTM1OCwgMHg1MzU5LCAweDUzNUIsCisgICAgMHg1MzVELCAweDUzNjUsIDB4NTM2OCwgMHg1MzZBLCAweDUzNkMsIDB4NTM2RCwgMHg1MzcyLCAweDUzNzYsIDB4NTM3OSwKKyAgICAweDUzN0IsIDB4NTM3QywgMHg1MzdELCAweDUzN0UsIDB4NTM4MCwgMHg1MzgxLCAweDUzODMsIDB4NTM4NywgMHg1Mzg4LAorICAgIDB4NTM4QSwgMHg1MzhFLCAweDUzOEYsIDB4NTM5MCwgMHg1MzkxLCAweDUzOTIsIDB4NTM5MywgMHg1Mzk0LCAweDUzOTYsCisgICAgMHg1Mzk3LCAweDUzOUIsIDB4NTM5QywgMHg1MzlFLCAweDUzQTEsIDB4NTNBNCwgMHg1M0E3LCAweDUzQUEsIDB4NTNBQiwKKyAgICAweDUzQUMsIDB4NTNBRiwgMHg1M0IwLCAweDUzQjEsIDB4NTNCMywgMHg1M0I1LCAweDUzQjcsIDB4NTNCOCwgMHg1M0I5LAorICAgIDB4NTNCQSwgMHg1M0JDLCAweDUzQkQsIDB4NTNCRSwgMHg1M0MwLCAweDUzQzQsIDB4NTNDNSwgMHg1M0M2LCAweDUzQzcsCisgICAgMHg1M0NFLCAweDUzQ0YsIDB4NTNEMCwgMHg1M0QyLCAweDUzRDMsIDB4NTNENSwgMHg1M0RBLCAweDUzREMsIDB4NTNERCwKKyAgICAweDUzREUsIDB4NTNFMSwgMHg1M0U3LCAweDUzRjQsIDB4NTNGQSwgMHg1M0ZFLCAweDUzRkYsIDB4NTQwMCwgMHg1NDAyLAorICAgIDB4NTQwNSwgMHg1NDA3LCAweDU0MEIsIDB4NTQxNCwgMHg1NDE4LCAweDU0MTksIDB4NTQxQSwgMHg1NDFDLCAweDU0MjIsCisgICAgMHg1NDI0LCAweDU0MjUsIDB4NTQyQSwgMHg1NDMwLCAweDU0MzMsIDB4NTQzNiwgMHg1NDM3LCAweDU0M0EsIDB4NTQzRCwKKyAgICAweDU0M0YsIDB4NTQ0MSwgMHg1NDQyLCAweDU0NDQsIDB4NTQ0NSwgMHg1NDQ3LCAweDU0NDksIDB4NTQ0QywgMHg1NDRELAorICAgIDB4NTQ0RSwgMHg1NDRGLCAweDU0NTEsIDB4NTQ1QSwgMHg1NDVELCAweDU0NUUsIDB4NTQ1RiwgMHg1NDYwLCAweDU0NjEsCisgICAgMHg1NDYzLCAweDU0NjUsIDB4NTQ2NywgMHg1NDY5LCAweDU0NkEsIDB4NTQ2QiwgMHg1NDZDLCAweDU0NkQsIDB4NTQ2RSwKKyAgICAweDU0NkYsIDB4NTQ3MCwgMHg1NDc0LCAweDU0NzksIDB4NTQ3QSwgMHg1NDdFLCAweDU0N0YsIDB4NTQ4MSwgMHg1NDgzLAorICAgIDB4NTQ4NSwgMHg1NDg3LCAweDU0ODgsIDB4NTQ4OSwgMHg1NDhBLCAweDU0OEQsIDB4NTQ5MSwgMHg1NDkzLCAweDU0OTcsCisgICAgMHg1NDk4LCAweDU0OUMsIDB4NTQ5RSwgMHg1NDlGLCAweDU0QTAsIDB4NTRBMSwgMHg1NEEyLCAweDU0QTUsIDB4NTRBRSwKKyAgICAweDU0QjAsIDB4NTRCMiwgMHg1NEI1LCAweDU0QjYsIDB4NTRCNywgMHg1NEI5LCAweDU0QkEsIDB4NTRCRSwgMHg1NEMzLAorICAgIDB4NTRDNSwgMHg1NENBLCAweDU0Q0IsIDB4NTRENiwgMHg1NEQ4LCAweDU0REIsIDB4NTRFMCwgMHg1NEUyLCAweDU0RTMsCisgICAgMHg1NEU0LCAweDU0RUIsIDB4NTRFQywgMHg1NEVGLCAweDU0RjAsIDB4NTRGMSwgMHg1NEY0LCAweDU0RjUsIDB4NTRGNiwKKyAgICAweDU0RjcsIDB4NTRGOCwgMHg1NEY5LCAweDU0RkIsIDB4NTRGRSwgMHg1NTAwLCAweDU1MDIsIDB4NTUwMywgMHg1NTA1LAorICAgIDB4NTUwOCwgMHg1NTBBLCAweDU1MEIsIDB4NTUwQywgMHg1NTBELCAweDU1MEUsIDB4NTUxMiwgMHg1NTEzLCAweDU1MTUsCisgICAgMHg1NTE2LCAweDU1MTcsIDB4NTUxOCwgMHg1NTE5LCAweDU1MUEsIDB4NTUxQywgMHg1NTFELCAweDU1MUUsIDB4NTUxRiwKKyAgICAweDU1MjEsIDB4NTUyNSwgMHg1NTI2LCAweDU1MjgsIDB4NTUyOSwgMHg1NTJCLCAweDU1MkQsIDB4NTUzMiwgMHg1NTM0LAorICAgIDB4NTUzNSwgMHg1NTM2LCAweDU1MzgsIDB4NTUzOSwgMHg1NTNBLCAweDU1M0IsIDB4NTUzRCwgMHg1NTQwLCAweDU1NDIsCisgICAgMHg1NTQ1LCAweDU1NDcsIDB4NTU0OCwgMHg1NTRCLCAweDU1NEMsIDB4NTU0RCwgMHg1NTRFLCAweDU1NTEsIDB4NTU1MiwKKyAgICAweDU1NTQsIDB4NTU1NywgMHg1NTU4LCAweDU1NTksIDB4NTU1QSwgMHg1NTVCLCAweDU1NUQsIDB4NTU1RiwgMHg1NTYwLAorICAgIDB4NTU2MiwgMHg1NTYzLCAweDU1NjgsIDB4NTU2OSwgMHg1NTZCLCAweDU1NkYsIDB4NTU3MCwgMHg1NTcxLCAweDU1NzIsCisgICAgMHg1NTczLCAweDU1NzQsIDB4NTU3OSwgMHg1NTdBLCAweDU1N0QsIDB4NTU3RiwgMHg1NTg1LCAweDU1ODYsIDB4NTU4QywKKyAgICAweDU1OEQsIDB4NTU4RSwgMHg1NTkwLCAweDU1OTIsIDB4NTU5MywgMHg1NTk1LCAweDU1OTYsIDB4NTU5NywgMHg1NTlBLAorICAgIDB4NTU5QiwgMHg1NTlFLCAweDU1QTAsIDB4NTVBMSwgMHg1NUEyLCAweDU1QTMsIDB4NTVBNCwgMHg1NUE1LCAweDU1QTYsCisgICAgMHg1NUE4LCAweDU1QTksIDB4NTVBQiwgMHg1NUFELCAweDU1QUYsIDB4NTVCMCwgMHg1NUI0LCAweDU1QjYsIDB4NTVCOCwKKyAgICAweDU1QkEsIDB4NTVCQywgMHg1NUJGLCAweDU1QzAsIDB4NTVDMSwgMHg1NUMyLCAweDU1QzMsIDB4NTVDOCwgMHg1NUNBLAorICAgIDB4NTVDQiwgMHg1NUNGLCAweDU1RDAsIDB4NTVENSwgMHg1NUQ3LCAweDU1RDgsIDB4NTVEOSwgMHg1NURCLCAweDU1REUsCisgICAgMHg1NUUwLCAweDU1RTIsIDB4NTVFNywgMHg1NUVELCAweDU1RUUsIDB4NTVGMCwgMHg1NUYxLCAweDU1RjQsIDB4NTVGOCwKKyAgICAweDU1RjksIDB4NTVGQSwgMHg1NUZCLCAweDU1RkMsIDB4NTVGRiwgMHg1NjAyLCAweDU2MDMsIDB4NTYwNCwgMHg1NjA1LAorICAgIDB4NTYwNywgMHg1NjBBLCAweDU2MEIsIDB4NTYxMCwgMHg1NjExLCAweDU2MTIsIDB4NTYxMywgMHg1NjE1LCAweDU2MTksCisgICAgMHg1NjFBLCAweDU2MUQsIDB4NTYyMCwgMHg1NjIxLCAweDU2MjIsIDB4NTYyNSwgMHg1NjI2LCAweDU2MjgsIDB4NTYyQSwKKyAgICAweDU2MkIsIDB4NTYzMywgMHg1NjM3LCAweDU2M0EsIDB4NTYzQywgMHg1NjNELCAweDU2M0UsIDB4NTY0MCwgMHg1NjQyLAorICAgIDB4NTY0MywgMHg1NjQ0LCAweDU2NDUsIDB4NTY0NiwgMHg1NjQ3LCAweDU2NDgsIDB4NTY0OSwgMHg1NjRBLCAweDU2NEIsCisgICAgMHg1NjRGLCAweDU2NTAsIDB4NTY1MSwgMHg1NjUyLCAweDU2NTMsIDB4NTY1NSwgMHg1NjU2LCAweDU2NUEsIDB4NTY1QiwKKyAgICAweDU2NUUsIDB4NTY1RiwgMHg1NjYxLCAweDU2NjMsIDB4NTY2NywgMHg1NjZELCAweDU2NkUsIDB4NTY3MCwgMHg1NjczLAorICAgIDB4NTY3NSwgMHg1Njc3LCAweDU2N0EsIDB4NTY3RCwgMHg1NjdFLCAweDU2N0YsIDB4NTY4MSwgMHg1NjgyLCAweDU2ODMsCisgICAgMHg1Njg0LCAweDU2ODgsIDB4NTY4OSwgMHg1NjhBLCAweDU2OEIsIDB4NTY4RCwgMHg1NjkwLCAweDU2OTEsIDB4NTY5MiwKKyAgICAweDU2OTQsIDB4NTY5NiwgMHg1Njk3LCAweDU2OTgsIDB4NTY5QSwgMHg1NjlCLCAweDU2OUMsIDB4NTY5RCwgMHg1NjlFLAorICAgIDB4NTY5RiwgMHg1NkEwLCAweDU2QTEsIDB4NTZBMiwgMHg1NkE0LCAweDU2QTUsIDB4NTZBNywgMHg1NkE5LCAweDU2QUEsCisgICAgMHg1NkFCLCAweDU2QUMsIDB4NTZBRCwgMHg1NkIwLCAweDU2QjEsIDB4NTZCMiwgMHg1NkI1LCAweDU2QjgsIDB4NTZCOSwKKyAgICAweDU2QkEsIDB4NTZCQiwgMHg1NkJELCAweDU2QkUsIDB4NTZCRiwgMHg1NkMzLCAweDU2QzQsIDB4NTZDNiwgMHg1NkM3LAorICAgIDB4NTZDQiwgMHg1NkNELCAweDU2Q0UsIDB4NTZDRiwgMHg1NkQwLCAweDU2RDIsIDB4NTZEMywgMHg1NkQ1LCAweDU2RDYsCisgICAgMHg1NkQ4LCAweDU2RDksIDB4NTZEQywgMHg1NkUzLCAweDU2RTUsIDB4NTZFNiwgMHg1NkU3LCAweDU2RTgsIDB4NTZFOSwKKyAgICAweDU2RUEsIDB4NTZFQywgMHg1NkVFLCAweDU2RUYsIDB4NTZGMiwgMHg1NkYzLCAweDU2RjYsIDB4NTZGNywgMHg1NkY4LAorICAgIDB4NTZGQiwgMHg1NkZDLCAweDU3MDAsIDB4NTcwMSwgMHg1NzAyLCAweDU3MDUsIDB4NTcwQywgMHg1NzBFLCAweDU3MEYsCisgICAgMHg1NzEwLCAweDU3MTEsIDB4NTcxNCwgMHg1NzE1LCAweDU3MTcsIDB4NTcxOSwgMHg1NzFBLCAweDU3MUIsIDB4NTcxRCwKKyAgICAweDU3MUUsIDB4NTcyMCwgMHg1NzIxLCAweDU3MjIsIDB4NTcyNCwgMHg1NzI1LCAweDU3MjYsIDB4NTcyNywgMHg1NzJCLAorICAgIDB4NTczMSwgMHg1NzMyLCAweDU3MzQsIDB4NTczNSwgMHg1NzM2LCAweDU3MzcsIDB4NTczOCwgMHg1NzNDLCAweDU3M0QsCisgICAgMHg1NzNGLCAweDU3NDEsIDB4NTc0MywgMHg1NzQ0LCAweDU3NDUsIDB4NTc0NiwgMHg1NzQ4LCAweDU3NDksIDB4NTc0QiwKKyAgICAweDU3NTIsIDB4NTc1MywgMHg1NzU0LCAweDU3NTUsIDB4NTc1NiwgMHg1NzU4LCAweDU3NTksIDB4NTc2MiwgMHg1NzYzLAorICAgIDB4NTc2NSwgMHg1NzY3LCAweDU3NkMsIDB4NTc2RSwgMHg1NzcwLCAweDU3NzEsIDB4NTc3MiwgMHg1Nzc0LCAweDU3NzUsCisgICAgMHg1Nzc4LCAweDU3NzksIDB4NTc3QSwgMHg1NzdELCAweDU3N0UsIDB4NTc3RiwgMHg1NzgwLCAweDU3ODEsIDB4NTc4NywKKyAgICAweDU3ODgsIDB4NTc4OSwgMHg1NzhBLCAweDU3OEQsIDB4NTc4RSwgMHg1NzhGLCAweDU3OTAsIDB4NTc5MSwgMHg1Nzk0LAorICAgIDB4NTc5NSwgMHg1Nzk2LCAweDU3OTcsIDB4NTc5OCwgMHg1Nzk5LCAweDU3OUEsIDB4NTc5QywgMHg1NzlELCAweDU3OUUsCisgICAgMHg1NzlGLCAweDU3QTUsIDB4NTdBOCwgMHg1N0FBLCAweDU3QUMsIDB4NTdBRiwgMHg1N0IwLCAweDU3QjEsIDB4NTdCMywKKyAgICAweDU3QjUsIDB4NTdCNiwgMHg1N0I3LCAweDU3QjksIDB4NTdCQSwgMHg1N0JCLCAweDU3QkMsIDB4NTdCRCwgMHg1N0JFLAorICAgIDB4NTdCRiwgMHg1N0MwLCAweDU3QzEsIDB4NTdDNCwgMHg1N0M1LCAweDU3QzYsIDB4NTdDNywgMHg1N0M4LCAweDU3QzksCisgICAgMHg1N0NBLCAweDU3Q0MsIDB4NTdDRCwgMHg1N0QwLCAweDU3RDEsIDB4NTdEMywgMHg1N0Q2LCAweDU3RDcsIDB4NTdEQiwKKyAgICAweDU3REMsIDB4NTdERSwgMHg1N0UyLCAweDU3RTMsIDB4NTdFNSwgMHg1N0U2LCAweDU3RTcsIDB4NTdFOCwgMHg1N0U5LAorICAgIDB4NTdFQSwgMHg1N0VCLCAweDU3RUMsIDB4NTdFRSwgMHg1N0YwLCAweDU3RjEsIDB4NTdGMiwgMHg1N0YzLCAweDU3RjUsCisgICAgMHg1N0Y2LCAweDU3RkIsIDB4NTdGQywgMHg1N0ZFLCAweDU3RkYsIDB4NTgwMSwgMHg1ODAzLCAweDU4MDQsIDB4NTgwOCwKKyAgICAweDU4MDksIDB4NTgwQywgMHg1ODBFLCAweDU4MEYsIDB4NTgxMCwgMHg1ODEyLCAweDU4MTMsIDB4NTgxNCwgMHg1ODE3LAorICAgIDB4NTgxOCwgMHg1ODFBLCAweDU4MUIsIDB4NTgxQywgMHg1ODFGLCAweDU4MjIsIDB4NTgyMywgMHg1ODI1LCAweDU4MjYsCisgICAgMHg1ODI3LCAweDU4MjgsIDB4NTgyOSwgMHg1ODJCLCAweDU4MkMsIDB4NTgyRCwgMHg1ODJFLCAweDU4MzIsIDB4NTgzMywKKyAgICAweDU4MzYsIDB4NTgzNywgMHg1ODM4LCAweDU4MzksIDB4NTgzQSwgMHg1ODNCLCAweDU4M0MsIDB4NTgzRCwgMHg1ODNFLAorICAgIDB4NTgzRiwgMHg1ODQwLCAweDU4NDEsIDB4NTg0MiwgMHg1ODQzLCAweDU4NDUsIDB4NTg0NiwgMHg1ODQ3LCAweDU4NDgsCisgICAgMHg1ODQ5LCAweDU4NEUsIDB4NTg1MCwgMHg1ODUzLCAweDU4NTUsIDB4NTg1NiwgMHg1ODU5LCAweDU4NUEsIDB4NTg1QiwKKyAgICAweDU4NUMsIDB4NTg1RCwgMHg1ODVGLCAweDU4NjAsIDB4NTg2MSwgMHg1ODYzLCAweDU4NjYsIDB4NTg2NywgMHg1ODY4LAorICAgIDB4NTg2OSwgMHg1ODZBLCAweDU4NkQsIDB4NTg2RSwgMHg1ODZGLCAweDU4NzAsIDB4NTg3MSwgMHg1ODcyLCAweDU4NzMsCisgICAgMHg1ODc0LCAweDU4NzYsIDB4NTg3NywgMHg1ODc4LCAweDU4N0EsIDB4NTg3QiwgMHg1ODdDLCAweDU4N0QsIDB4NTg3RiwKKyAgICAweDU4ODIsIDB4NTg4NCwgMHg1ODg2LCAweDU4ODcsIDB4NTg4OCwgMHg1ODhCLCAweDU4OEMsIDB4NTg4RCwgMHg1ODhFLAorICAgIDB4NTg4RiwgMHg1ODkwLCAweDU4OTEsIDB4NTg5NCwgMHg1ODk1LCAweDU4OTYsIDB4NTg5NywgMHg1ODk4LCAweDU4OUIsCisgICAgMHg1ODlELCAweDU4QTAsIDB4NThBMSwgMHg1OEEyLCAweDU4QTMsIDB4NThBNCwgMHg1OEE1LCAweDU4QTYsIDB4NThBNywKKyAgICAweDU4QUEsIDB4NThBQiwgMHg1OEFDLCAweDU4QUQsIDB4NThBRiwgMHg1OEIwLCAweDU4QjEsIDB4NThCMiwgMHg1OEI0LAorICAgIDB4NThCNSwgMHg1OEI2LCAweDU4QjcsIDB4NThCOCwgMHg1OEI5LCAweDU4QkEsIDB4NThCRCwgMHg1OEJGLCAweDU4QzAsCisgICAgMHg1OEMyLCAweDU4QzMsIDB4NThDNCwgMHg1OEM2LCAweDU4QzgsIDB4NThDOSwgMHg1OENBLCAweDU4Q0IsIDB4NThDQywKKyAgICAweDU4Q0QsIDB4NThDRSwgMHg1OENGLCAweDU4RDAsIDB4NThEMiwgMHg1OEQ0LCAweDU4RDYsIDB4NThENywgMHg1OERCLAorICAgIDB4NThEQywgMHg1OERELCAweDU4RTEsIDB4NThFMywgMHg1OEU1LCAweDU4RTYsIDB4NThFNywgMHg1OEU4LCAweDU4RUEsCisgICAgMHg1OEVELCAweDU4RjEsIDB4NThGMiwgMHg1OEY0LCAweDU4RjUsIDB4NThGNywgMHg1OEY4LCAweDU4RkIsIDB4NThGQywKKyAgICAweDU4RkUsIDB4NThGRiwgMHg1OTAwLCAweDU5MDEsIDB4NTkwMywgMHg1OTA1LCAweDU5MDYsIDB4NTkwOCwgMHg1OTA5LAorICAgIDB4NTkwQSwgMHg1OTBCLCAweDU5MEMsIDB4NTkwRSwgMHg1OTEwLCAweDU5MTEsIDB4NTkxMiwgMHg1OTEzLCAweDU5MTcsCisgICAgMHg1OTE4LCAweDU5MUIsIDB4NTkxRCwgMHg1OTFFLCAweDU5MjAsIDB4NTkyMSwgMHg1OTIzLCAweDU5MjYsIDB4NTkyOCwKKyAgICAweDU5MkMsIDB4NTkzMCwgMHg1OTMyLCAweDU5MzMsIDB4NTkzNSwgMHg1OTM2LCAweDU5M0IsIDB4NTkzRCwgMHg1OTNGLAorICAgIDB4NTk0MCwgMHg1OTQzLCAweDU5NDUsIDB4NTk0NiwgMHg1OTRBLCAweDU5NEMsIDB4NTk0RCwgMHg1OTUwLCAweDU5NTIsCisgICAgMHg1OTUzLCAweDU5NTksIDB4NTk1QiwgMHg1OTVDLCAweDU5NUQsIDB4NTk1RSwgMHg1OTVGLCAweDU5NjEsIDB4NTk2MywKKyAgICAweDU5NjQsIDB4NTk2NiwgMHg1OTY3LCAweDU5NjgsIDB4NTk2QiwgMHg1OTZELCAweDU5NkYsIDB4NTk3MCwgMHg1OTcxLAorICAgIDB4NTk3MiwgMHg1OTc1LCAweDU5NzcsIDB4NTk3QSwgMHg1OTdCLCAweDU5N0MsIDB4NTk3RSwgMHg1OTdGLCAweDU5ODAsCisgICAgMHg1OTg1LCAweDU5ODksIDB4NTk4QiwgMHg1OThDLCAweDU5OEUsIDB4NTk4RiwgMHg1OTkwLCAweDU5OTEsIDB4NTk5NCwKKyAgICAweDU5OTUsIDB4NTk5OCwgMHg1OTlBLCAweDU5OUIsIDB4NTk5QywgMHg1OTlGLCAweDU5QTAsIDB4NTlBMSwgMHg1OUEyLAorICAgIDB4NTlBNiwgMHg1OUE3LCAweDU5QUMsIDB4NTlBRCwgMHg1OUIwLCAweDU5QjEsIDB4NTlCMywgMHg1OUI0LCAweDU5QjUsCisgICAgMHg1OUI2LCAweDU5QjcsIDB4NTlCOCwgMHg1OUJBLCAweDU5QkMsIDB4NTlCRCwgMHg1OUJGLCAweDU5QzAsIDB4NTlDMSwKKyAgICAweDU5QzIsIDB4NTlDMywgMHg1OUM0LCAweDU5QzUsIDB4NTlDNywgMHg1OUM4LCAweDU5QzksIDB4NTlDQywgMHg1OUNELAorICAgIDB4NTlDRSwgMHg1OUNGLCAweDU5RDUsIDB4NTlENiwgMHg1OUQ5LCAweDU5REIsIDB4NTlERSwgMHg1OURGLCAweDU5RTAsCisgICAgMHg1OUUxLCAweDU5RTIsIDB4NTlFNCwgMHg1OUU2LCAweDU5RTcsIDB4NTlFOSwgMHg1OUVBLCAweDU5RUIsIDB4NTlFRCwKKyAgICAweDU5RUUsIDB4NTlFRiwgMHg1OUYwLCAweDU5RjEsIDB4NTlGMiwgMHg1OUYzLCAweDU5RjQsIDB4NTlGNSwgMHg1OUY2LAorICAgIDB4NTlGNywgMHg1OUY4LCAweDU5RkEsIDB4NTlGQywgMHg1OUZELCAweDU5RkUsIDB4NUEwMCwgMHg1QTAyLCAweDVBMEEsCisgICAgMHg1QTBCLCAweDVBMEQsIDB4NUEwRSwgMHg1QTBGLCAweDVBMTAsIDB4NUExMiwgMHg1QTE0LCAweDVBMTUsIDB4NUExNiwKKyAgICAweDVBMTcsIDB4NUExOSwgMHg1QTFBLCAweDVBMUIsIDB4NUExRCwgMHg1QTFFLCAweDVBMjEsIDB4NUEyMiwgMHg1QTI0LAorICAgIDB4NUEyNiwgMHg1QTI3LCAweDVBMjgsIDB4NUEyQSwgMHg1QTJCLCAweDVBMkMsIDB4NUEyRCwgMHg1QTJFLCAweDVBMkYsCisgICAgMHg1QTMwLCAweDVBMzMsIDB4NUEzNSwgMHg1QTM3LCAweDVBMzgsIDB4NUEzOSwgMHg1QTNBLCAweDVBM0IsIDB4NUEzRCwKKyAgICAweDVBM0UsIDB4NUEzRiwgMHg1QTQyLCAweDVBNDMsIDB4NUE0NCwgMHg1QTQ1LCAweDVBNDcsIDB4NUE0OCwgMHg1QTRCLAorICAgIDB4NUE0QywgMHg1QTRELCAweDVBNEUsIDB4NUE0RiwgMHg1QTUwLCAweDVBNTEsIDB4NUE1MiwgMHg1QTUzLCAweDVBNTQsCisgICAgMHg1QTU2LCAweDVBNTcsIDB4NUE1OCwgMHg1QTU5LCAweDVBNUIsIDB4NUE1QywgMHg1QTVELCAweDVBNUUsIDB4NUE1RiwKKyAgICAweDVBNjAsIDB4NUE2MSwgMHg1QTYzLCAweDVBNjQsIDB4NUE2NSwgMHg1QTY4LCAweDVBNjksIDB4NUE2QiwgMHg1QTZDLAorICAgIDB4NUE2RSwgMHg1QTZGLCAweDVBNzAsIDB4NUE3MSwgMHg1QTcyLCAweDVBNzMsIDB4NUE3OCwgMHg1QTc5LCAweDVBN0IsCisgICAgMHg1QTdDLCAweDVBN0QsIDB4NUE3RSwgMHg1QTgwLCAweDVBODEsIDB4NUE4MiwgMHg1QTgzLCAweDVBODQsIDB4NUE4NSwKKyAgICAweDVBODYsIDB4NUE4NywgMHg1QTg4LCAweDVBODksIDB4NUE4QSwgMHg1QThCLCAweDVBOEMsIDB4NUE4RCwgMHg1QThFLAorICAgIDB4NUE4RiwgMHg1QTkwLCAweDVBOTEsIDB4NUE5MywgMHg1QTk0LCAweDVBOTUsIDB4NUE5NiwgMHg1QTk3LCAweDVBOTgsCisgICAgMHg1QTk5LCAweDVBOUMsIDB4NUE5RCwgMHg1QTlFLCAweDVBOUYsIDB4NUFBMCwgMHg1QUExLCAweDVBQTIsIDB4NUFBMywKKyAgICAweDVBQTQsIDB4NUFBNSwgMHg1QUE2LCAweDVBQTgsIDB4NUFBOSwgMHg1QUFCLCAweDVBQUMsIDB4NUFBRCwgMHg1QUFFLAorICAgIDB4NUFBRiwgMHg1QUIwLCAweDVBQjEsIDB4NUFCNCwgMHg1QUI2LCAweDVBQjcsIDB4NUFCOSwgMHg1QUJBLCAweDVBQkIsCisgICAgMHg1QUJDLCAweDVBQkYsIDB4NUFDMCwgMHg1QUMzLCAweDVBQzQsIDB4NUFDNSwgMHg1QUM2LCAweDVBQzcsIDB4NUFDOCwKKyAgICAweDVBQ0EsIDB4NUFDQiwgMHg1QUNELCAweDVBQ0UsIDB4NUFDRiwgMHg1QUQwLCAweDVBRDEsIDB4NUFEMywgMHg1QUQ1LAorICAgIDB4NUFEOSwgMHg1QURBLCAweDVBREIsIDB4NUFERCwgMHg1QURFLCAweDVBREYsIDB4NUFFMiwgMHg1QUU0LCAweDVBRTUsCisgICAgMHg1QUU3LCAweDVBRTgsIDB4NUFFQSwgMHg1QUVDLCAweDVBRUQsIDB4NUFFRSwgMHg1QUVGLCAweDVBRjAsIDB4NUFGMiwKKyAgICAweDVBRjMsIDB4NUFGNCwgMHg1QUY2LCAweDVBRjcsIDB4NUFGOCwgMHg1QUY5LCAweDVBRkEsIDB4NUFGQywgMHg1QUZELAorICAgIDB4NUFGRSwgMHg1QUZGLCAweDVCMDEsIDB4NUIwMiwgMHg1QjAzLCAweDVCMDQsIDB4NUIwNSwgMHg1QjA2LCAweDVCMDcsCisgICAgMHg1QjBBLCAweDVCMEQsIDB4NUIwRSwgMHg1QjBGLCAweDVCMTAsIDB4NUIxMSwgMHg1QjEyLCAweDVCMTMsIDB4NUIxNCwKKyAgICAweDVCMTUsIDB4NUIxOCwgMHg1QjFBLCAweDVCMUIsIDB4NUIxQywgMHg1QjFELCAweDVCMUUsIDB4NUIxRiwgMHg1QjIwLAorICAgIDB4NUIyMiwgMHg1QjIzLCAweDVCMjQsIDB4NUIyNSwgMHg1QjI2LCAweDVCMjcsIDB4NUIyOCwgMHg1QjI5LCAweDVCMkIsCisgICAgMHg1QjJDLCAweDVCMkQsIDB4NUIyRSwgMHg1QjJGLCAweDVCMzEsIDB4NUIzMywgMHg1QjM1LCAweDVCMzYsIDB4NUIzOSwKKyAgICAweDVCM0EsIDB4NUIzQiwgMHg1QjNDLCAweDVCM0QsIDB4NUIzRSwgMHg1QjNGLCAweDVCNDEsIDB4NUI0MiwgMHg1QjQzLAorICAgIDB4NUI0NCwgMHg1QjQ1LCAweDVCNDYsIDB4NUI0NywgMHg1QjQ4LCAweDVCNDksIDB4NUI0QSwgMHg1QjRCLCAweDVCNEQsCisgICAgMHg1QjRFLCAweDVCNEYsIDB4NUI1MiwgMHg1QjU2LCAweDVCNUUsIDB4NUI2MCwgMHg1QjYxLCAweDVCNjcsIDB4NUI2OCwKKyAgICAweDVCNkQsIDB4NUI2RSwgMHg1QjZGLCAweDVCNzIsIDB4NUI3NCwgMHg1Qjc2LCAweDVCNzcsIDB4NUI3OSwgMHg1QjdCLAorICAgIDB4NUI3QywgMHg1QjdFLCAweDVCODIsIDB4NUI4NiwgMHg1QjhBLCAweDVCOEQsIDB4NUI4RSwgMHg1QjkwLCAweDVCOTEsCisgICAgMHg1QjkyLCAweDVCOTQsIDB4NUI5NiwgMHg1QjlGLCAweDVCQTcsIDB4NUJBOCwgMHg1QkE5LCAweDVCQUMsIDB4NUJBRCwKKyAgICAweDVCQUUsIDB4NUJBRiwgMHg1QkIxLCAweDVCQjIsIDB4NUJCNywgMHg1QkJBLCAweDVCQkIsIDB4NUJCQywgMHg1QkMwLAorICAgIDB4NUJDMSwgMHg1QkMzLCAweDVCQzgsIDB4NUJDOSwgMHg1QkNBLCAweDVCQ0IsIDB4NUJDRCwgMHg1QkNFLCAweDVCQ0YsCisgICAgMHg1QkQxLCAweDVCRDQsIDB4NUJENSwgMHg1QkQ2LCAweDVCRDcsIDB4NUJEOCwgMHg1QkQ5LCAweDVCREEsIDB4NUJEQiwKKyAgICAweDVCREMsIDB4NUJFMCwgMHg1QkUzLCAweDVCRUEsIDB4NUJFRCwgMHg1QkVGLCAweDVCRjEsIDB4NUJGMiwgMHg1QkYzLAorICAgIDB4NUJGNCwgMHg1QkY3LCAweDVCRkQsIDB4NUJGRSwgMHg1QzAwLCAweDVDMDIsIDB4NUMwMywgMHg1QzA1LCAweDVDMEMsCisgICAgMHg1QzEwLCAweDVDMTIsIDB4NUMxMywgMHg1QzE3LCAweDVDMTksIDB4NUMxQiwgMHg1QzFFLCAweDVDMUYsIDB4NUMyMCwKKyAgICAweDVDMjEsIDB4NUMyMywgMHg1QzI2LCAweDVDMjgsIDB4NUMyOSwgMHg1QzJBLCAweDVDMkIsIDB4NUMyRCwgMHg1QzJFLAorICAgIDB4NUMyRiwgMHg1QzMwLCAweDVDMzIsIDB4NUMzMywgMHg1QzM1LCAweDVDMzYsIDB4NUM0MywgMHg1QzQ0LCAweDVDNDYsCisgICAgMHg1QzQ3LCAweDVDNEMsIDB4NUM0RCwgMHg1QzUyLCAweDVDNTMsIDB4NUM1NCwgMHg1QzU2LCAweDVDNTcsIDB4NUM1OCwKKyAgICAweDVDNUEsIDB4NUM1QiwgMHg1QzVDLCAweDVDNUQsIDB4NUM1RiwgMHg1QzY3LCAweDVDNjksIDB4NUM2QSwgMHg1QzZCLAorICAgIDB4NUM2RCwgMHg1QzcwLCAweDVDNzIsIDB4NUM3MywgMHg1Qzc0LCAweDVDNzUsIDB4NUM3NiwgMHg1Qzc3LCAweDVDNzgsCisgICAgMHg1QzdCLCAweDVDN0MsIDB4NUM3RCwgMHg1QzdFLCAweDVDODAsIDB4NUM4MywgMHg1Qzg0LCAweDVDODUsIDB4NUM4NiwKKyAgICAweDVDODcsIDB4NUM4OSwgMHg1QzhBLCAweDVDOEIsIDB4NUM4RSwgMHg1QzhGLCAweDVDOTIsIDB4NUM5MywgMHg1Qzk1LAorICAgIDB4NUM5RCwgMHg1QzlFLCAweDVDOUYsIDB4NUNBMCwgMHg1Q0E0LCAweDVDQTUsIDB4NUNBNiwgMHg1Q0E3LCAweDVDQTgsCisgICAgMHg1Q0FBLCAweDVDQUUsIDB4NUNBRiwgMHg1Q0IwLCAweDVDQjIsIDB4NUNCNCwgMHg1Q0I2LCAweDVDQjksIDB4NUNCQSwKKyAgICAweDVDQkIsIDB4NUNCQywgMHg1Q0JFLCAweDVDQzAsIDB4NUNDMiwgMHg1Q0MzLCAweDVDQzUsIDB4NUNDNiwgMHg1Q0M3LAorICAgIDB4NUNDOCwgMHg1Q0M5LCAweDVDQ0EsIDB4NUNDQywgMHg1Q0NELCAweDVDQ0UsIDB4NUNDRiwgMHg1Q0QwLCAweDVDRDEsCisgICAgMHg1Q0QzLCAweDVDRDQsIDB4NUNENSwgMHg1Q0Q2LCAweDVDRDcsIDB4NUNEOCwgMHg1Q0RBLCAweDVDREIsIDB4NUNEQywKKyAgICAweDVDREQsIDB4NUNERSwgMHg1Q0RGLCAweDVDRTAsIDB4NUNFMiwgMHg1Q0UzLCAweDVDRTcsIDB4NUNFOSwgMHg1Q0VCLAorICAgIDB4NUNFQywgMHg1Q0VFLCAweDVDRUYsIDB4NUNGMSwgMHg1Q0YyLCAweDVDRjMsIDB4NUNGNSwgMHg1Q0Y3LCAweDVDRjgsCisgICAgMHg1Q0Y5LCAweDVDRkEsIDB4NUNGQywgMHg1Q0ZFLCAweDVDRkYsIDB4NUQwMCwgMHg1RDAxLCAweDVEMDQsIDB4NUQwNSwKKyAgICAweDVEMDgsIDB4NUQwOSwgMHg1RDBBLCAweDVEMEIsIDB4NUQwQywgMHg1RDBGLCAweDVEMTAsIDB4NUQxMSwgMHg1RDEyLAorICAgIDB4NUQxMywgMHg1RDE1LCAweDVEMTgsIDB4NUQxOSwgMHg1RDFBLCAweDVEMUMsIDB4NUQxRCwgMHg1RDFGLCAweDVEMjAsCisgICAgMHg1RDIxLCAweDVEMjIsIDB4NUQyMywgMHg1RDI1LCAweDVEMjgsIDB4NUQyQSwgMHg1RDJCLCAweDVEMkYsIDB4NUQzMCwKKyAgICAweDVEMzEsIDB4NUQzMiwgMHg1RDMzLCAweDVEMzUsIDB4NUQzNiwgMHg1RDM3LCAweDVEMzgsIDB4NUQzOSwgMHg1RDNBLAorICAgIDB4NUQzQiwgMHg1RDNDLCAweDVEM0YsIDB4NUQ0MCwgMHg1RDQxLCAweDVENDIsIDB4NUQ0MywgMHg1RDQ0LCAweDVENDUsCisgICAgMHg1RDQ2LCAweDVENDgsIDB4NUQ0OSwgMHg1RDRELCAweDVENEUsIDB4NUQ0RiwgMHg1RDUxLCAweDVENTIsIDB4NUQ1MywKKyAgICAweDVENTQsIDB4NUQ1NSwgMHg1RDU2LCAweDVENTcsIDB4NUQ1OSwgMHg1RDVBLCAweDVENUMsIDB4NUQ1RSwgMHg1RDVGLAorICAgIDB4NUQ2MCwgMHg1RDYxLCAweDVENjIsIDB4NUQ2MywgMHg1RDY0LCAweDVENjUsIDB4NUQ2NiwgMHg1RDY3LCAweDVENjgsCisgICAgMHg1RDZBLCAweDVENkQsIDB4NUQ2RSwgMHg1RDcwLCAweDVENzEsIDB4NUQ3MiwgMHg1RDczLCAweDVENzUsIDB4NUQ3NiwKKyAgICAweDVENzcsIDB4NUQ3OCwgMHg1RDc5LCAweDVEN0EsIDB4NUQ3QiwgMHg1RDdDLCAweDVEN0QsIDB4NUQ3RSwgMHg1RDdGLAorICAgIDB4NUQ4MCwgMHg1RDgzLCAweDVEODUsIDB4NUQ4NiwgMHg1RDg4LCAweDVEODksIDB4NUQ4QSwgMHg1RDhCLCAweDVEOEMsCisgICAgMHg1RDhELCAweDVEOEUsIDB4NUQ4RiwgMHg1RDkwLCAweDVEOTEsIDB4NUQ5MiwgMHg1RDkzLCAweDVEOTQsIDB4NUQ5NSwKKyAgICAweDVEOTYsIDB4NUQ5OCwgMHg1RDlBLCAweDVEOUIsIDB4NUQ5QywgMHg1RDlFLCAweDVEOUYsIDB4NURBMSwgMHg1REEyLAorICAgIDB4NURBMywgMHg1REE0LCAweDVEQTUsIDB4NURBNiwgMHg1REE4LCAweDVEQTksIDB4NURBQSwgMHg1REFCLCAweDVEQUMsCisgICAgMHg1REFELCAweDVEQUUsIDB4NURBRiwgMHg1REIwLCAweDVEQjEsIDB4NURCMiwgMHg1REIzLCAweDVEQjQsIDB4NURCNSwKKyAgICAweDVEQjYsIDB4NURCOSwgMHg1REJCLCAweDVEQkQsIDB4NURCRSwgMHg1REJGLCAweDVEQzAsIDB4NURDMSwgMHg1REMyLAorICAgIDB4NURDMywgMHg1REM0LCAweDVEQzYsIDB4NURDNywgMHg1REM4LCAweDVEQzksIDB4NURDQSwgMHg1RENDLCAweDVEQ0UsCisgICAgMHg1RENGLCAweDVERDAsIDB4NUREMSwgMHg1REQzLCAweDVERDUsIDB4NURENiwgMHg1REQ3LCAweDVERDgsIDB4NUREOSwKKyAgICAweDVEREEsIDB4NUREQywgMHg1RERGLCAweDVERTAsIDB4NURFMywgMHg1REU0LCAweDVERUEsIDB4NURFQywgMHg1REVELAorICAgIDB4NURGNSwgMHg1REY2LCAweDVERjgsIDB4NURGOSwgMHg1REZBLCAweDVERkIsIDB4NURGQywgMHg1REZGLCAweDVFMDAsCisgICAgMHg1RTA0LCAweDVFMDcsIDB4NUUwOSwgMHg1RTBBLCAweDVFMEIsIDB4NUUwRCwgMHg1RTBFLCAweDVFMTIsIDB4NUUxMywKKyAgICAweDVFMTcsIDB4NUUxRSwgMHg1RTFGLCAweDVFMjAsIDB4NUUyMSwgMHg1RTIyLCAweDVFMjMsIDB4NUUyNCwgMHg1RTI4LAorICAgIDB4NUUyOSwgMHg1RTJBLCAweDVFMkMsIDB4NUUyRiwgMHg1RTMwLCAweDVFMzIsIDB4NUUzNCwgMHg1RTM1LCAweDVFMzksCisgICAgMHg1RTNBLCAweDVFM0UsIDB4NUUzRiwgMHg1RTQxLCAweDVFNDYsIDB4NUU0NywgMHg1RTQ4LCAweDVFNDksIDB4NUU0QSwKKyAgICAweDVFNEIsIDB4NUU0RCwgMHg1RTRFLCAweDVFNEYsIDB4NUU1MCwgMHg1RTUxLCAweDVFNTIsIDB4NUU1MywgMHg1RTU2LAorICAgIDB4NUU1OSwgMHg1RTVBLCAweDVFNUMsIDB4NUU1RCwgMHg1RTYwLCAweDVFNjQsIDB4NUU2NSwgMHg1RTY2LCAweDVFNjcsCisgICAgMHg1RTY4LCAweDVFNjksIDB4NUU2QSwgMHg1RTZELCAweDVFNkUsIDB4NUU2RiwgMHg1RTcwLCAweDVFNzEsIDB4NUU3NSwKKyAgICAweDVFNzcsIDB4NUU4MSwgMHg1RTgyLCAweDVFODMsIDB4NUU4NSwgMHg1RTg4LCAweDVFODksIDB4NUU4QywgMHg1RThELAorICAgIDB4NUU4RSwgMHg1RTkyLCAweDVFOTgsIDB4NUU5QiwgMHg1RTlELCAweDVFQTEsIDB4NUVBMiwgMHg1RUEzLCAweDVFQTQsCisgICAgMHg1RUE4LCAweDVFQTksIDB4NUVBQSwgMHg1RUFDLCAweDVFQUUsIDB4NUVBRiwgMHg1RUIwLCAweDVFQjEsIDB4NUVCMiwKKyAgICAweDVFQjQsIDB4NUVCQSwgMHg1RUJCLCAweDVFQkMsIDB4NUVCRCwgMHg1RUJGLCAweDVFQzAsIDB4NUVDMSwgMHg1RUMyLAorICAgIDB4NUVDMywgMHg1RUM0LCAweDVFQzUsIDB4NUVDNiwgMHg1RUM3LCAweDVFQzgsIDB4NUVDQiwgMHg1RUNDLCAweDVFQ0QsCisgICAgMHg1RUNFLCAweDVFQ0YsIDB4NUVEMCwgMHg1RUQ0LCAweDVFRDUsIDB4NUVENywgMHg1RUQ4LCAweDVFRDksIDB4NUVEQSwKKyAgICAweDVFREMsIDB4NUVERCwgMHg1RURFLCAweDVFRTQsIDB4NUVFNSwgMHg1RUU2LCAweDVFRTcsIDB4NUVFOSwgMHg1RUVCLAorICAgIDB4NUVFRCwgMHg1RUVFLCAweDVFRUYsIDB4NUVGMCwgMHg1RUYxLCAweDVFRjIsIDB4NUVGNSwgMHg1RUY4LCAweDVFRjksCisgICAgMHg1RUZCLCAweDVFRkMsIDB4NUVGRCwgMHg1RjA1LCAweDVGMDYsIDB4NUYwNywgMHg1RjA5LCAweDVGMEMsIDB4NUYwRCwKKyAgICAweDVGMEUsIDB4NUYxMCwgMHg1RjEyLCAweDVGMTQsIDB4NUYxNiwgMHg1RjE5LCAweDVGMUEsIDB4NUYxQywgMHg1RjFELAorICAgIDB4NUYxRSwgMHg1RjIxLCAweDVGMjIsIDB4NUYyMywgMHg1RjI0LCAweDVGMjgsIDB4NUYyQiwgMHg1RjJDLCAweDVGMkUsCisgICAgMHg1RjMwLCAweDVGMzIsIDB4NUYzNCwgMHg1RjM2LCAweDVGMzcsIDB4NUYzOCwgMHg1RjNCLCAweDVGM0QsIDB4NUYzRSwKKyAgICAweDVGM0YsIDB4NUY0MSwgMHg1RjQyLCAweDVGNDMsIDB4NUY0NCwgMHg1RjQ1LCAweDVGNDcsIDB4NUY0OSwgMHg1RjRBLAorICAgIDB4NUY0QiwgMHg1RjRELCAweDVGNEYsIDB4NUY1MSwgMHg1RjU0LCAweDVGNUEsIDB4NUY1QiwgMHg1RjVDLCAweDVGNUUsCisgICAgMHg1RjVGLCAweDVGNjAsIDB4NUY2MywgMHg1RjY1LCAweDVGNjcsIDB4NUY2OCwgMHg1RjZCLCAweDVGNkUsIDB4NUY2RiwKKyAgICAweDVGNzIsIDB4NUY3NCwgMHg1Rjc1LCAweDVGNzYsIDB4NUY3OCwgMHg1RjdBLCAweDVGN0QsIDB4NUY3RSwgMHg1RjdGLAorICAgIDB4NUY4MywgMHg1Rjg2LCAweDVGOEQsIDB4NUY4RSwgMHg1RjhGLCAweDVGOTMsIDB4NUY5NCwgMHg1Rjk2LCAweDVGOUEsCisgICAgMHg1RjlCLCAweDVGOUQsIDB4NUY5RiwgMHg1RkEyLCAweDVGQTMsIDB4NUZBNCwgMHg1RkE1LCAweDVGQTYsIDB4NUZBNywKKyAgICAweDVGQUIsIDB4NUZBQywgMHg1RkFGLCAweDVGQjAsIDB4NUZCMSwgMHg1RkIyLCAweDVGQjMsIDB4NUZCNCwgMHg1RkI2LAorICAgIDB4NUZCOCwgMHg1RkJBLCAweDVGQkIsIDB4NUZCRSwgMHg1RkJGLCAweDVGQzAsIDB4NUZDMSwgMHg1RkMyLCAweDVGQzcsCisgICAgMHg1RkM4LCAweDVGQ0EsIDB4NUZDQiwgMHg1RkNFLCAweDVGRDMsIDB4NUZENCwgMHg1RkQ1LCAweDVGREEsIDB4NUZEQiwKKyAgICAweDVGREMsIDB4NUZERSwgMHg1RkRGLCAweDVGRTIsIDB4NUZFMywgMHg1RkU1LCAweDVGRTYsIDB4NUZFOCwgMHg1RkU5LAorICAgIDB4NUZFQywgMHg1RkVGLCAweDVGRjAsIDB4NUZGMiwgMHg1RkYzLCAweDVGRjQsIDB4NUZGNiwgMHg1RkY3LCAweDVGRjksCisgICAgMHg1RkZBLCAweDVGRkMsIDB4NjAwNywgMHg2MDA4LCAweDYwMDksIDB4NjAwQiwgMHg2MDBDLCAweDYwMTAsIDB4NjAxMSwKKyAgICAweDYwMTMsIDB4NjAxNywgMHg2MDE4LCAweDYwMUEsIDB4NjAxRSwgMHg2MDFGLCAweDYwMjIsIDB4NjAyMywgMHg2MDI0LAorICAgIDB4NjAyQywgMHg2MDJELCAweDYwMkUsIDB4NjAzMCwgMHg2MDMxLCAweDYwMzIsIDB4NjAzMywgMHg2MDM0LCAweDYwMzYsCisgICAgMHg2MDM3LCAweDYwMzgsIDB4NjAzOSwgMHg2MDNBLCAweDYwM0QsIDB4NjAzRSwgMHg2MDQwLCAweDYwNDQsIDB4NjA0NSwKKyAgICAweDYwNDYsIDB4NjA0NywgMHg2MDQ4LCAweDYwNDksIDB4NjA0QSwgMHg2MDRDLCAweDYwNEUsIDB4NjA0RiwgMHg2MDUxLAorICAgIDB4NjA1MywgMHg2MDU0LCAweDYwNTYsIDB4NjA1NywgMHg2MDU4LCAweDYwNUIsIDB4NjA1QywgMHg2MDVFLCAweDYwNUYsCisgICAgMHg2MDYwLCAweDYwNjEsIDB4NjA2NSwgMHg2MDY2LCAweDYwNkUsIDB4NjA3MSwgMHg2MDcyLCAweDYwNzQsIDB4NjA3NSwKKyAgICAweDYwNzcsIDB4NjA3RSwgMHg2MDgwLCAweDYwODEsIDB4NjA4MiwgMHg2MDg1LCAweDYwODYsIDB4NjA4NywgMHg2MDg4LAorICAgIDB4NjA4QSwgMHg2MDhCLCAweDYwOEUsIDB4NjA4RiwgMHg2MDkwLCAweDYwOTEsIDB4NjA5MywgMHg2MDk1LCAweDYwOTcsCisgICAgMHg2MDk4LCAweDYwOTksIDB4NjA5QywgMHg2MDlFLCAweDYwQTEsIDB4NjBBMiwgMHg2MEE0LCAweDYwQTUsIDB4NjBBNywKKyAgICAweDYwQTksIDB4NjBBQSwgMHg2MEFFLCAweDYwQjAsIDB4NjBCMywgMHg2MEI3LCAweDYwQjksIDB4NjBCQSwgMHg2MEJELAorICAgIDB4NjBCRSwgMHg2MEJGLCAweDYwQzAsIDB4NjBDMSwgMHg2MEMyLCAweDYwQzMsIDB4NjBDNCwgMHg2MEM3LCAweDYwQzgsCisgICAgMHg2MEM5LCAweDYwQ0MsIDB4NjBDRCwgMHg2MENFLCAweDYwQ0YsIDB4NjBEMCwgMHg2MEQyLCAweDYwRDMsIDB4NjBENCwKKyAgICAweDYwRDYsIDB4NjBENywgMHg2MEQ5LCAweDYwREIsIDB4NjBERSwgMHg2MEUyLCAweDYwRTMsIDB4NjBFNCwgMHg2MEU1LAorICAgIDB4NjBFQSwgMHg2MEY1LCAweDYwRjcsIDB4NjBGOCwgMHg2MEZDLCAweDYwRkQsIDB4NjBGRSwgMHg2MEZGLCAweDYxMDIsCisgICAgMHg2MTAzLCAweDYxMDQsIDB4NjEwNSwgMHg2MTA3LCAweDYxMEEsIDB4NjEwQiwgMHg2MTBDLCAweDYxMTAsIDB4NjExMSwKKyAgICAweDYxMTIsIDB4NjExMywgMHg2MTE0LCAweDYxMTYsIDB4NjExNywgMHg2MTE4LCAweDYxMTksIDB4NjExRCwgMHg2MTFFLAorICAgIDB4NjEyMSwgMHg2MTIyLCAweDYxMjUsIDB4NjEyOCwgMHg2MTI5LCAweDYxMkEsIDB4NjEyQywgMHg2MTJELCAweDYxMkUsCisgICAgMHg2MTJGLCAweDYxMzAsIDB4NjEzMSwgMHg2MTMyLCAweDYxMzMsIDB4NjEzNSwgMHg2MTM2LCAweDYxMzgsIDB4NjEzOSwKKyAgICAweDYxM0EsIDB4NjEzQiwgMHg2MTNDLCAweDYxM0QsIDB4NjE0MCwgMHg2MTQxLCAweDYxNDIsIDB4NjE0MywgMHg2MTQ0LAorICAgIDB4NjE0NSwgMHg2MTQ2LCAweDYxNDcsIDB4NjE0OSwgMHg2MTRELCAweDYxNEYsIDB4NjE1MCwgMHg2MTUyLCAweDYxNTMsCisgICAgMHg2MTU0LCAweDYxNTYsIDB4NjE1NywgMHg2MTU5LCAweDYxNUIsIDB4NjE1QywgMHg2MTVFLCAweDYxNjAsIDB4NjE2MSwKKyAgICAweDYxNjUsIDB4NjE2NiwgMHg2MTY5LCAweDYxNkMsIDB4NjE2RCwgMHg2MTZGLCAweDYxNzEsIDB4NjE3MiwgMHg2MTc0LAorICAgIDB4NjE3OCwgMHg2MTc5LCAweDYxN0EsIDB4NjE3QiwgMHg2MTdDLCAweDYxN0QsIDB4NjE3RSwgMHg2MTdGLCAweDYxODAsCisgICAgMHg2MTgxLCAweDYxODMsIDB4NjE4NCwgMHg2MTg1LCAweDYxODYsIDB4NjE4NywgMHg2MTg4LCAweDYxODksIDB4NjE4QywKKyAgICAweDYxOEQsIDB4NjE4RiwgMHg2MTkzLCAweDYxOTUsIDB4NjE5NiwgMHg2MTk3LCAweDYxOTgsIDB4NjE5OSwgMHg2MTlCLAorICAgIDB4NjE5QywgMHg2MTlFLCAweDYxOUYsIDB4NjFBMCwgMHg2MUExLCAweDYxQTIsIDB4NjFBMywgMHg2MUE1LCAweDYxQTYsCisgICAgMHg2MUFBLCAweDYxQUQsIDB4NjFBRiwgMHg2MUIwLCAweDYxQjEsIDB4NjFCMywgMHg2MUI0LCAweDYxQjUsIDB4NjFCOCwKKyAgICAweDYxQjksIDB4NjFCQSwgMHg2MUJCLCAweDYxQkMsIDB4NjFCRCwgMHg2MUJGLCAweDYxQzAsIDB4NjFDMSwgMHg2MUMzLAorICAgIDB4NjFDNCwgMHg2MUM1LCAweDYxQzYsIDB4NjFDRCwgMHg2MUNFLCAweDYxQ0YsIDB4NjFEMCwgMHg2MUQzLCAweDYxRDUsCisgICAgMHg2MUQ2LCAweDYxRDcsIDB4NjFEOCwgMHg2MUQ5LCAweDYxREEsIDB4NjFEQiwgMHg2MURDLCAweDYxREQsIDB4NjFFMCwKKyAgICAweDYxRTEsIDB4NjFFMiwgMHg2MUU0LCAweDYxRTUsIDB4NjFFNywgMHg2MUU5LCAweDYxRUEsIDB4NjFFQiwgMHg2MUVDLAorICAgIDB4NjFFRCwgMHg2MUVFLCAweDYxRUYsIDB4NjFGMCwgMHg2MUYxLCAweDYxRjMsIDB4NjFGNCwgMHg2MUY5LCAweDYxRkIsCisgICAgMHg2MUZELCAweDYyMDEsIDB4NjIwMiwgMHg2MjAzLCAweDYyMDQsIDB4NjIwNSwgMHg2MjA5LCAweDYyMTMsIDB4NjIxOSwKKyAgICAweDYyMUMsIDB4NjIxRCwgMHg2MjFFLCAweDYyMjAsIDB4NjIyMywgMHg2MjI2LCAweDYyMjgsIDB4NjIyOSwgMHg2MjJCLAorICAgIDB4NjIyRCwgMHg2MjJGLCAweDYyMzEsIDB4NjIzNSwgMHg2MjM2LCAweDYyMzgsIDB4NjIzOSwgMHg2MjNBLCAweDYyM0IsCisgICAgMHg2MjNDLCAweDYyNDIsIDB4NjI0NCwgMHg2MjQ1LCAweDYyNDYsIDB4NjI0QSwgMHg2MjRGLCAweDYyNTAsIDB4NjI1NSwKKyAgICAweDYyNTYsIDB4NjI1NywgMHg2MjU5LCAweDYyNUEsIDB4NjI1QywgMHg2MjVELCAweDYyNUUsIDB4NjI1RiwgMHg2MjYwLAorICAgIDB4NjI2MSwgMHg2MjYyLCAweDYyNjQsIDB4NjI2NSwgMHg2MjY4LCAweDYyNzEsIDB4NjI3MiwgMHg2Mjc0LCAweDYyNzUsCisgICAgMHg2Mjc3LCAweDYyNzgsIDB4NjI3QSwgMHg2MjdCLCAweDYyN0QsIDB4NjI4MSwgMHg2MjgyLCAweDYyODMsIDB4NjI4NSwKKyAgICAweDYyODYsIDB4NjI4NywgMHg2Mjg4LCAweDYyOEIsIDB4NjI4QywgMHg2MjhELCAweDYyOEUsIDB4NjI4RiwgMHg2MjkwLAorICAgIDB4NjI5NCwgMHg2Mjk5LCAweDYyOUMsIDB4NjI5RCwgMHg2MjlFLCAweDYyQTMsIDB4NjJBNiwgMHg2MkE3LCAweDYyQTksCisgICAgMHg2MkFBLCAweDYyQUQsIDB4NjJBRSwgMHg2MkFGLCAweDYyQjAsIDB4NjJCMiwgMHg2MkIzLCAweDYyQjQsIDB4NjJCNiwKKyAgICAweDYyQjcsIDB4NjJCOCwgMHg2MkJBLCAweDYyQkUsIDB4NjJDMCwgMHg2MkMxLCAweDYyQzMsIDB4NjJDQiwgMHg2MkNGLAorICAgIDB4NjJEMSwgMHg2MkQ1LCAweDYyREQsIDB4NjJERSwgMHg2MkUwLCAweDYyRTEsIDB4NjJFNCwgMHg2MkVBLCAweDYyRUIsCisgICAgMHg2MkYwLCAweDYyRjIsIDB4NjJGNSwgMHg2MkY4LCAweDYyRjksIDB4NjJGQSwgMHg2MkZCLCAweDYzMDAsIDB4NjMwMywKKyAgICAweDYzMDQsIDB4NjMwNSwgMHg2MzA2LCAweDYzMEEsIDB4NjMwQiwgMHg2MzBDLCAweDYzMEQsIDB4NjMwRiwgMHg2MzEwLAorICAgIDB4NjMxMiwgMHg2MzEzLCAweDYzMTQsIDB4NjMxNSwgMHg2MzE3LCAweDYzMTgsIDB4NjMxOSwgMHg2MzFDLCAweDYzMjYsCisgICAgMHg2MzI3LCAweDYzMjksIDB4NjMyQywgMHg2MzJELCAweDYzMkUsIDB4NjMzMCwgMHg2MzMxLCAweDYzMzMsIDB4NjMzNCwKKyAgICAweDYzMzUsIDB4NjMzNiwgMHg2MzM3LCAweDYzMzgsIDB4NjMzQiwgMHg2MzNDLCAweDYzM0YsIDB4NjM0MCwgMHg2MzQxLAorICAgIDB4NjM0NCwgMHg2MzQ3LCAweDYzNDgsIDB4NjM0QSwgMHg2MzUxLCAweDYzNTIsIDB4NjM1MywgMHg2MzU0LCAweDYzNTYsCisgICAgMHg2MzU3LCAweDYzNTgsIDB4NjM1OSwgMHg2MzVBLCAweDYzNUIsIDB4NjM1QywgMHg2MzVELCAweDYzNjAsIDB4NjM2NCwKKyAgICAweDYzNjUsIDB4NjM2NiwgMHg2MzZBLCAweDYzNkMsIDB4NjM2RiwgMHg2MzcwLCAweDYzNzMsIDB4NjM3NCwgMHg2Mzc1LAorICAgIDB4NjM3OCwgMHg2Mzc5LCAweDYzN0MsIDB4NjM3RCwgMHg2MzdFLCAweDYzN0YsIDB4NjM4MSwgMHg2Mzg1LCAweDYzODYsCisgICAgMHg2MzhCLCAweDYzOEQsIDB4NjM5MSwgMHg2MzkzLCAweDYzOTQsIDB4NjM5NSwgMHg2Mzk3LCAweDYzOTksIDB4NjM5QSwKKyAgICAweDYzOUIsIDB4NjM5QywgMHg2MzlELCAweDYzOUUsIDB4NjM5RiwgMHg2M0ExLCAweDYzQTQsIDB4NjNBNiwgMHg2M0FCLAorICAgIDB4NjNBRiwgMHg2M0IxLCAweDYzQjIsIDB4NjNCNSwgMHg2M0I2LCAweDYzQjksIDB4NjNCQiwgMHg2M0JELCAweDYzQkYsCisgICAgMHg2M0MxLCAweDYzQzIsIDB4NjNDMywgMHg2M0M1LCAweDYzQzcsIDB4NjNDOCwgMHg2M0NBLCAweDYzQ0IsIDB4NjNDQywKKyAgICAweDYzRDEsIDB4NjNEMywgMHg2M0Q0LCAweDYzRDUsIDB4NjNENywgMHg2M0Q4LCAweDYzRDksIDB4NjNEQiwgMHg2M0RDLAorICAgIDB4NjNERCwgMHg2M0RGLCAweDYzRTIsIDB4NjNFNCwgMHg2M0U1LCAweDYzRTYsIDB4NjNFNywgMHg2M0U4LCAweDYzRUIsCisgICAgMHg2M0VDLCAweDYzRUYsIDB4NjNGMCwgMHg2M0YxLCAweDYzRjMsIDB4NjNGNSwgMHg2M0Y3LCAweDYzRjksIDB4NjNGQSwKKyAgICAweDYzRkIsIDB4NjNGQywgMHg2M0ZFLCAweDY0MDMsIDB4NjQwNCwgMHg2NDA2LCAweDY0MDcsIDB4NjQwOCwgMHg2NDA5LAorICAgIDB4NjQwQSwgMHg2NDBFLCAweDY0MTEsIDB4NjQxMiwgMHg2NDE1LCAweDY0MTYsIDB4NjQxOCwgMHg2NDE5LCAweDY0MUEsCisgICAgMHg2NDFELCAweDY0MUYsIDB4NjQyMiwgMHg2NDIzLCAweDY0MjQsIDB4NjQyNSwgMHg2NDI3LCAweDY0MjgsIDB4NjQyOSwKKyAgICAweDY0MkIsIDB4NjQyRSwgMHg2NDJGLCAweDY0MzAsIDB4NjQzMSwgMHg2NDMyLCAweDY0MzMsIDB4NjQzNSwgMHg2NDM3LAorICAgIDB4NjQzOCwgMHg2NDM5LCAweDY0M0IsIDB4NjQzQywgMHg2NDNFLCAweDY0NDAsIDB4NjQ0MiwgMHg2NDQzLCAweDY0NDksCisgICAgMHg2NDRCLCAweDY0NEMsIDB4NjQ0RCwgMHg2NDRFLCAweDY0NEYsIDB4NjQ1MCwgMHg2NDUzLCAweDY0NTUsIDB4NjQ1NiwKKyAgICAweDY0NTcsIDB4NjQ1OSwgMHg2NDVBLCAweDY0NUIsIDB4NjQ1RCwgMHg2NDYwLCAweDY0NjEsIDB4NjQ2MiwgMHg2NDYzLAorICAgIDB4NjQ2NCwgMHg2NDY1LCAweDY0NjYsIDB4NjQ2OCwgMHg2NDZBLCAweDY0NkIsIDB4NjQ2QywgMHg2NDZFLCAweDY0NzAsCisgICAgMHg2NDcxLCAweDY0NzIsIDB4NjQ3NCwgMHg2NDc1LCAweDY0NzcsIDB4NjQ3QywgMHg2NDdELCAweDY0N0UsIDB4NjQ3RiwKKyAgICAweDY0ODAsIDB4NjQ4MSwgMHg2NDgzLCAweDY0ODYsIDB4NjQ4OSwgMHg2NDhBLCAweDY0OEIsIDB4NjQ4QywgMHg2NDhELAorICAgIDB4NjQ4RSwgMHg2NDhGLCAweDY0OTAsIDB4NjQ5NCwgMHg2NDk3LCAweDY0OTgsIDB4NjQ5QSwgMHg2NDlCLCAweDY0OUMsCisgICAgMHg2NDlELCAweDY0QTAsIDB4NjRBMSwgMHg2NEEyLCAweDY0QTYsIDB4NjRBNywgMHg2NEE4LCAweDY0QUEsIDB4NjRBRiwKKyAgICAweDY0QjEsIDB4NjRCNCwgMHg2NEI2LCAweDY0QjksIDB4NjRCRCwgMHg2NEMzLCAweDY0QzYsIDB4NjRDOCwgMHg2NEM5LAorICAgIDB4NjRDQywgMHg2NENGLCAweDY0RDEsIDB4NjREMywgMHg2NEQ1LCAweDY0RDYsIDB4NjREOSwgMHg2NERCLCAweDY0REMsCisgICAgMHg2NERELCAweDY0REYsIDB4NjRFMSwgMHg2NEUzLCAweDY0RTUsIDB4NjRFNywgMHg2NEU4LCAweDY0RTksIDB4NjRFQSwKKyAgICAweDY0RUIsIDB4NjRFRCwgMHg2NEVFLCAweDY0RjMsIDB4NjRGNSwgMHg2NEY2LCAweDY0RjgsIDB4NjRGOSwgMHg2NEZELAorICAgIDB4NjRGRiwgMHg2NTAxLCAweDY1MDIsIDB4NjUwMywgMHg2NTA1LCAweDY1MDcsIDB4NjUwOCwgMHg2NTBBLCAweDY1MEIsCisgICAgMHg2NTBDLCAweDY1MEQsIDB4NjUwRSwgMHg2NTEwLCAweDY1MTEsIDB4NjUxMywgMHg2NTE1LCAweDY1MTcsIDB4NjUxQSwKKyAgICAweDY1MUMsIDB4NjUxRSwgMHg2NTFGLCAweDY1MjAsIDB4NjUyMSwgMHg2NTI2LCAweDY1MjcsIDB4NjUyOCwgMHg2NTI5LAorICAgIDB4NjUyRCwgMHg2NTMwLCAweDY1MzEsIDB4NjUzMiwgMHg2NTMzLCAweDY1MzcsIDB4NjUzQSwgMHg2NTNDLCAweDY1M0QsCisgICAgMHg2NTQwLCAweDY1NDEsIDB4NjU0MiwgMHg2NTQzLCAweDY1NDQsIDB4NjU0NiwgMHg2NTQ3LCAweDY1NEEsIDB4NjU0QiwKKyAgICAweDY1NEQsIDB4NjU0RSwgMHg2NTUwLCAweDY1NTIsIDB4NjU1MywgMHg2NTU0LCAweDY1NTgsIDB4NjU1QSwgMHg2NTVDLAorICAgIDB4NjU1RiwgMHg2NTYwLCAweDY1NjEsIDB4NjU2NCwgMHg2NTY1LCAweDY1NjcsIDB4NjU2OCwgMHg2NTY5LCAweDY1NkEsCisgICAgMHg2NTZELCAweDY1NkUsIDB4NjU2RiwgMHg2NTcxLCAweDY1NzMsIDB4NjU3NiwgMHg2NTc5LCAweDY1N0EsIDB4NjU3QiwKKyAgICAweDY1N0MsIDB4NjU3RCwgMHg2NTdFLCAweDY1N0YsIDB4NjU4MCwgMHg2NTgxLCAweDY1ODQsIDB4NjU4NSwgMHg2NTg2LAorICAgIDB4NjU4OCwgMHg2NTg5LCAweDY1OEEsIDB4NjU4RCwgMHg2NThFLCAweDY1OEYsIDB4NjU5MiwgMHg2NTk0LCAweDY1OTYsCisgICAgMHg2NTk4LCAweDY1OUEsIDB4NjU5RCwgMHg2NTlFLCAweDY1QTAsIDB4NjVBMiwgMHg2NUEzLCAweDY1QTYsIDB4NjVBOCwKKyAgICAweDY1QUEsIDB4NjVBRSwgMHg2NUIxLCAweDY1QjIsIDB4NjVCMywgMHg2NUI0LCAweDY1QjUsIDB4NjVCNiwgMHg2NUI4LAorICAgIDB4NjVCQSwgMHg2NUJCLCAweDY1QkUsIDB4NjVCRiwgMHg2NUMwLCAweDY1QzIsIDB4NjVDNywgMHg2NUM4LCAweDY1QzksCisgICAgMHg2NUNBLCAweDY1Q0QsIDB4NjVEMCwgMHg2NUQxLCAweDY1RDMsIDB4NjVENCwgMHg2NUQ1LCAweDY1RDgsIDB4NjVEOSwKKyAgICAweDY1REEsIDB4NjVEQiwgMHg2NURDLCAweDY1REQsIDB4NjVERSwgMHg2NURGLCAweDY1RTEsIDB4NjVFMywgMHg2NUU0LAorICAgIDB4NjVFQSwgMHg2NUVCLCAweDY1RjIsIDB4NjVGMywgMHg2NUY0LCAweDY1RjUsIDB4NjVGOCwgMHg2NUY5LCAweDY1RkIsCisgICAgMHg2NUZDLCAweDY1RkQsIDB4NjVGRSwgMHg2NUZGLCAweDY2MDEsIDB4NjYwNCwgMHg2NjA1LCAweDY2MDcsIDB4NjYwOCwKKyAgICAweDY2MDksIDB4NjYwQiwgMHg2NjBELCAweDY2MTAsIDB4NjYxMSwgMHg2NjEyLCAweDY2MTYsIDB4NjYxNywgMHg2NjE4LAorICAgIDB4NjYxQSwgMHg2NjFCLCAweDY2MUMsIDB4NjYxRSwgMHg2NjIxLCAweDY2MjIsIDB4NjYyMywgMHg2NjI0LCAweDY2MjYsCisgICAgMHg2NjI5LCAweDY2MkEsIDB4NjYyQiwgMHg2NjJDLCAweDY2MkUsIDB4NjYzMCwgMHg2NjMyLCAweDY2MzMsIDB4NjYzNywKKyAgICAweDY2MzgsIDB4NjYzOSwgMHg2NjNBLCAweDY2M0IsIDB4NjYzRCwgMHg2NjNGLCAweDY2NDAsIDB4NjY0NCwgMHg2NjQ1LAorICAgIDB4NjY0NiwgMHg2NjQ3LCAweDY2NDgsIDB4NjY0OSwgMHg2NjRBLCAweDY2NEQsIDB4NjY0RSwgMHg2NjUwLCAweDY2NTEsCisgICAgMHg2NjU4LCAweDY2NTksIDB4NjY1QiwgMHg2NjVDLCAweDY2NUUsIDB4NjY2MCwgMHg2NjYyLCAweDY2NjMsIDB4NjY2NSwKKyAgICAweDY2NjcsIDB4NjY2OSwgMHg2NjZBLCAweDY2NkIsIDB4NjY2QywgMHg2NjZELCAweDY2NzEsIDB4NjY3MiwgMHg2NjczLAorICAgIDB4NjY3NSwgMHg2Njc4LCAweDY2NzksIDB4NjY3QiwgMHg2NjdDLCAweDY2N0QsIDB4NjY3RiwgMHg2NjgwLCAweDY2ODEsCisgICAgMHg2NjgzLCAweDY2ODUsIDB4NjY4NiwgMHg2NjhBLCAweDY2OEIsIDB4NjY4RCwgMHg2NjhFLCAweDY2OEYsIDB4NjY5MCwKKyAgICAweDY2OTIsIDB4NjY5MywgMHg2Njk0LCAweDY2OTUsIDB4NjY5OCwgMHg2Njk5LCAweDY2OUEsIDB4NjY5QiwgMHg2NjlDLAorICAgIDB4NjY5RSwgMHg2NjlGLCAweDY2QTAsIDB4NjZBMSwgMHg2NkEzLCAweDY2QTQsIDB4NjZBNSwgMHg2NkE2LCAweDY2QTksCisgICAgMHg2NkFBLCAweDY2QUMsIDB4NjZBRCwgMHg2NkFGLCAweDY2QjAsIDB4NjZCMSwgMHg2NkIyLCAweDY2QjMsIDB4NjZCNSwKKyAgICAweDY2QjYsIDB4NjZCNywgMHg2NkI4LCAweDY2QkEsIDB4NjZCQiwgMHg2NkJDLCAweDY2QkQsIDB4NjZCRiwgMHg2NkMwLAorICAgIDB4NjZDMSwgMHg2NkMyLCAweDY2QzMsIDB4NjZDNSwgMHg2NkM4LCAweDY2Q0EsIDB4NjZDQiwgMHg2NkNDLCAweDY2Q0QsCisgICAgMHg2NkNFLCAweDY2Q0YsIDB4NjZEMCwgMHg2NkQxLCAweDY2RDIsIDB4NjZEMywgMHg2NkQ0LCAweDY2RDUsIDB4NjZENywKKyAgICAweDY2RDgsIDB4NjZEQSwgMHg2NkRFLCAweDY2REYsIDB4NjZFMSwgMHg2NkUyLCAweDY2RTMsIDB4NjZFNCwgMHg2NkU1LAorICAgIDB4NjZFNywgMHg2NkU4LCAweDY2RUEsIDB4NjZFQiwgMHg2NkVELCAweDY2RUUsIDB4NjZFRiwgMHg2NkYxLCAweDY2RjUsCisgICAgMHg2NkY2LCAweDY2RkEsIDB4NjZGQiwgMHg2NkZELCAweDY3MDEsIDB4NjcwMiwgMHg2NzA0LCAweDY3MDUsIDB4NjcwNiwKKyAgICAweDY3MDcsIDB4NjcwQywgMHg2NzBFLCAweDY3MEYsIDB4NjcxMSwgMHg2NzEyLCAweDY3MTMsIDB4NjcxNiwgMHg2NzE4LAorICAgIDB4NjcxOSwgMHg2NzFBLCAweDY3MUMsIDB4NjcxRSwgMHg2NzIwLCAweDY3MjEsIDB4NjcyMiwgMHg2NzIzLCAweDY3MjQsCisgICAgMHg2NzI1LCAweDY3MjksIDB4NjcyRSwgMHg2NzMwLCAweDY3MzIsIDB4NjczMywgMHg2NzM2LCAweDY3MzcsIDB4NjczOCwKKyAgICAweDY3MzksIDB4NjczQiwgMHg2NzNDLCAweDY3M0UsIDB4NjczRiwgMHg2NzQxLCAweDY3NDQsIDB4Njc0NSwgMHg2NzQ3LAorICAgIDB4Njc0QSwgMHg2NzRCLCAweDY3NEQsIDB4Njc1MiwgMHg2NzU0LCAweDY3NTUsIDB4Njc1NywgMHg2NzU4LCAweDY3NTksCisgICAgMHg2NzVBLCAweDY3NUIsIDB4Njc1RCwgMHg2NzYyLCAweDY3NjMsIDB4Njc2NCwgMHg2NzY2LCAweDY3NjcsIDB4Njc2QiwKKyAgICAweDY3NkMsIDB4Njc2RSwgMHg2Nzc0LCAweDY3NzYsIDB4Njc3OCwgMHg2Nzc5LCAweDY3N0EsIDB4Njc3QiwgMHg2NzdELAorICAgIDB4Njc4MCwgMHg2NzgyLCAweDY3ODMsIDB4Njc4NSwgMHg2Nzg2LCAweDY3ODgsIDB4Njc4QSwgMHg2NzhDLCAweDY3OEQsCisgICAgMHg2NzhFLCAweDY3OEYsIDB4Njc5MSwgMHg2NzkyLCAweDY3OTMsIDB4Njc5NCwgMHg2Nzk2LCAweDY3OTksIDB4Njc5QiwKKyAgICAweDY3OUYsIDB4NjdBMCwgMHg2N0ExLCAweDY3QTQsIDB4NjdBNiwgMHg2N0E5LCAweDY3QUMsIDB4NjdBRSwgMHg2N0IxLAorICAgIDB4NjdCMiwgMHg2N0I0LCAweDY3QjksIDB4NjdCQSwgMHg2N0JCLCAweDY3QkMsIDB4NjdCRCwgMHg2N0JFLCAweDY3QkYsCisgICAgMHg2N0MwLCAweDY3QzIsIDB4NjdDNSwgMHg2N0M2LCAweDY3QzcsIDB4NjdDOCwgMHg2N0M5LCAweDY3Q0EsIDB4NjdDQiwKKyAgICAweDY3Q0MsIDB4NjdDRCwgMHg2N0NFLCAweDY3RDUsIDB4NjdENiwgMHg2N0Q3LCAweDY3REIsIDB4NjdERiwgMHg2N0UxLAorICAgIDB4NjdFMywgMHg2N0U0LCAweDY3RTYsIDB4NjdFNywgMHg2N0U4LCAweDY3RUEsIDB4NjdFQiwgMHg2N0VELCAweDY3RUUsCisgICAgMHg2N0YyLCAweDY3RjUsIDB4NjdGNiwgMHg2N0Y3LCAweDY3RjgsIDB4NjdGOSwgMHg2N0ZBLCAweDY3RkIsIDB4NjdGQywKKyAgICAweDY3RkUsIDB4NjgwMSwgMHg2ODAyLCAweDY4MDMsIDB4NjgwNCwgMHg2ODA2LCAweDY4MEQsIDB4NjgxMCwgMHg2ODEyLAorICAgIDB4NjgxNCwgMHg2ODE1LCAweDY4MTgsIDB4NjgxOSwgMHg2ODFBLCAweDY4MUIsIDB4NjgxQywgMHg2ODFFLCAweDY4MUYsCisgICAgMHg2ODIwLCAweDY4MjIsIDB4NjgyMywgMHg2ODI0LCAweDY4MjUsIDB4NjgyNiwgMHg2ODI3LCAweDY4MjgsIDB4NjgyQiwKKyAgICAweDY4MkMsIDB4NjgyRCwgMHg2ODJFLCAweDY4MkYsIDB4NjgzMCwgMHg2ODMxLCAweDY4MzQsIDB4NjgzNSwgMHg2ODM2LAorICAgIDB4NjgzQSwgMHg2ODNCLCAweDY4M0YsIDB4Njg0NywgMHg2ODRCLCAweDY4NEQsIDB4Njg0RiwgMHg2ODUyLCAweDY4NTYsCisgICAgMHg2ODU3LCAweDY4NTgsIDB4Njg1OSwgMHg2ODVBLCAweDY4NUIsIDB4Njg1QywgMHg2ODVELCAweDY4NUUsIDB4Njg1RiwKKyAgICAweDY4NkEsIDB4Njg2QywgMHg2ODZELCAweDY4NkUsIDB4Njg2RiwgMHg2ODcwLCAweDY4NzEsIDB4Njg3MiwgMHg2ODczLAorICAgIDB4Njg3NSwgMHg2ODc4LCAweDY4NzksIDB4Njg3QSwgMHg2ODdCLCAweDY4N0MsIDB4Njg3RCwgMHg2ODdFLCAweDY4N0YsCisgICAgMHg2ODgwLCAweDY4ODIsIDB4Njg4NCwgMHg2ODg3LCAweDY4ODgsIDB4Njg4OSwgMHg2ODhBLCAweDY4OEIsIDB4Njg4QywKKyAgICAweDY4OEQsIDB4Njg4RSwgMHg2ODkwLCAweDY4OTEsIDB4Njg5MiwgMHg2ODk0LCAweDY4OTUsIDB4Njg5NiwgMHg2ODk5LAorICAgIDB4Njg5QSwgMHg2ODlCLCAweDY4OUMsIDB4Njg5RSwgMHg2OEEwLCAweDY4QTEsIDB4NjhBMywgMHg2OEE0LCAweDY4QTUsCisgICAgMHg2OEE5LCAweDY4QUEsIDB4NjhBQiwgMHg2OEFDLCAweDY4QUUsIDB4NjhCMSwgMHg2OEIyLCAweDY4QjQsIDB4NjhCNiwKKyAgICAweDY4QjcsIDB4NjhCOCwgMHg2OEI5LCAweDY4QkEsIDB4NjhCQiwgMHg2OEJDLCAweDY4QkQsIDB4NjhCRSwgMHg2OEJGLAorICAgIDB4NjhDMSwgMHg2OEMzLCAweDY4QzQsIDB4NjhDNSwgMHg2OEM2LCAweDY4QzcsIDB4NjhDOCwgMHg2OENBLCAweDY4Q0MsCisgICAgMHg2OENFLCAweDY4Q0YsIDB4NjhEMCwgMHg2OEQxLCAweDY4RDMsIDB4NjhENCwgMHg2OEQ5LCAweDY4REIsIDB4NjhEQywKKyAgICAweDY4REQsIDB4NjhERSwgMHg2OEUxLCAweDY4RTIsIDB4NjhFNCwgMHg2OEU1LCAweDY4RTYsIDB4NjhFOCwgMHg2OEU5LAorICAgIDB4NjhFQSwgMHg2OEVCLCAweDY4RUMsIDB4NjhFRCwgMHg2OEVGLCAweDY4RjIsIDB4NjhGMywgMHg2OEY0LCAweDY4RjYsCisgICAgMHg2OEY3LCAweDY4RjgsIDB4NjhGQiwgMHg2OEZELCAweDY4RkUsIDB4NjhGRiwgMHg2OTAwLCAweDY5MDIsIDB4NjkwMywKKyAgICAweDY5MDQsIDB4NjkwNiwgMHg2OTA3LCAweDY5MDgsIDB4NjkwOSwgMHg2OTBBLCAweDY5MEMsIDB4NjkxMSwgMHg2OTEzLAorICAgIDB4NjkxNCwgMHg2OTE1LCAweDY5MTYsIDB4NjkxNywgMHg2OTE4LCAweDY5MTksIDB4NjkxQSwgMHg2OTFCLCAweDY5MUMsCisgICAgMHg2OTFELCAweDY5MUUsIDB4NjkyMSwgMHg2OTIyLCAweDY5MjMsIDB4NjkyNSwgMHg2OTI2LCAweDY5MjcsIDB4NjkyOCwKKyAgICAweDY5MjksIDB4NjkyQSwgMHg2OTJCLCAweDY5MkMsIDB4NjkyRSwgMHg2OTJGLCAweDY5MzEsIDB4NjkzMiwgMHg2OTMzLAorICAgIDB4NjkzNSwgMHg2OTM2LCAweDY5MzcsIDB4NjkzOCwgMHg2OTNBLCAweDY5M0IsIDB4NjkzQywgMHg2OTNFLCAweDY5NDAsCisgICAgMHg2OTQxLCAweDY5NDMsIDB4Njk0NCwgMHg2OTQ1LCAweDY5NDYsIDB4Njk0NywgMHg2OTQ4LCAweDY5NDksIDB4Njk0QiwKKyAgICAweDY5NEMsIDB4Njk0RCwgMHg2OTRFLCAweDY5NEYsIDB4Njk1MCwgMHg2OTUxLCAweDY5NTIsIDB4Njk1NSwgMHg2OTU2LAorICAgIDB4Njk1OCwgMHg2OTU5LCAweDY5NUIsIDB4Njk1QywgMHg2OTVGLCAweDY5NjEsIDB4Njk2MiwgMHg2OTY0LCAweDY5NjUsCisgICAgMHg2OTY3LCAweDY5NjksIDB4Njk2QSwgMHg2OTZDLCAweDY5NkYsIDB4Njk3MCwgMHg2OTcyLCAweDY5NzMsIDB4Njk3NCwKKyAgICAweDY5NzYsIDB4Njk3QSwgMHg2OTdCLCAweDY5N0QsIDB4Njk3RSwgMHg2OTdGLCAweDY5ODEsIDB4Njk4MywgMHg2OTg1LAorICAgIDB4Njk4QSwgMHg2OThCLCAweDY5OEMsIDB4Njk4RSwgMHg2OThGLCAweDY5OTAsIDB4Njk5MSwgMHg2OTkyLCAweDY5OTMsCisgICAgMHg2OTk2LCAweDY5OTcsIDB4Njk5OSwgMHg2OTlBLCAweDY5OUQsIDB4Njk5RSwgMHg2OTlGLCAweDY5QTAsIDB4NjlBMSwKKyAgICAweDY5QTIsIDB4NjlBMywgMHg2OUE0LCAweDY5QTUsIDB4NjlBNiwgMHg2OUE5LCAweDY5QUMsIDB4NjlBRiwgMHg2OUIwLAorICAgIDB4NjlCMiwgMHg2OUIzLCAweDY5QjUsIDB4NjlCNiwgMHg2OUI4LCAweDY5QjksIDB4NjlCQSwgMHg2OUJDLCAweDY5QkQsCisgICAgMHg2OUJFLCAweDY5QzAsIDB4NjlDMiwgMHg2OUMzLCAweDY5QzQsIDB4NjlDNSwgMHg2OUM2LCAweDY5QzcsIDB4NjlDOCwKKyAgICAweDY5QzksIDB4NjlDRiwgMHg2OUQxLCAweDY5RDIsIDB4NjlEMywgMHg2OUQ1LCAweDY5RDYsIDB4NjlENywgMHg2OUQ4LAorICAgIDB4NjlEOSwgMHg2OURBLCAweDY5REMsIDB4NjlERCwgMHg2OURFLCAweDY5RTEsIDB4NjlFMiwgMHg2OUUzLCAweDY5RTQsCisgICAgMHg2OUU1LCAweDY5RTYsIDB4NjlFOCwgMHg2OUU5LCAweDY5RUEsIDB4NjlFQiwgMHg2OUVDLCAweDY5RUUsIDB4NjlFRiwKKyAgICAweDY5RjAsIDB4NjlGMSwgMHg2OUY0LCAweDY5RjUsIDB4NjlGNiwgMHg2OUY3LCAweDY5RjgsIDB4NjlGOSwgMHg2OUZBLAorICAgIDB4NjlGQiwgMHg2OUZDLCAweDY5RkUsIDB4NkEwMCwgMHg2QTAzLCAweDZBMDQsIDB4NkEwNiwgMHg2QTA3LCAweDZBMDgsCisgICAgMHg2QTA5LCAweDZBMEIsIDB4NkEwQywgMHg2QTBELCAweDZBMEUsIDB4NkEwRiwgMHg2QTEwLCAweDZBMTEsIDB4NkExMiwKKyAgICAweDZBMTQsIDB4NkExNSwgMHg2QTE2LCAweDZBMUEsIDB4NkExQiwgMHg2QTFDLCAweDZBMUQsIDB4NkEyMCwgMHg2QTIyLAorICAgIDB4NkEyNCwgMHg2QTI1LCAweDZBMjYsIDB4NkEyNywgMHg2QTI5LCAweDZBMkIsIDB4NkEyQywgMHg2QTJELCAweDZBMkUsCisgICAgMHg2QTMwLCAweDZBMzIsIDB4NkEzMywgMHg2QTM0LCAweDZBMzYsIDB4NkEzNywgMHg2QTNCLCAweDZBM0MsIDB4NkEzRiwKKyAgICAweDZBNDAsIDB4NkE0MSwgMHg2QTQyLCAweDZBNDMsIDB4NkE0NSwgMHg2QTQ2LCAweDZBNDksIDB4NkE0QSwgMHg2QTRDLAorICAgIDB4NkE0RCwgMHg2QTRFLCAweDZBNEYsIDB4NkE1MSwgMHg2QTUyLCAweDZBNTMsIDB4NkE1NCwgMHg2QTU1LCAweDZBNTYsCisgICAgMHg2QTU3LCAweDZBNUEsIDB4NkE1QywgMHg2QTVELCAweDZBNUUsIDB4NkE2MCwgMHg2QTYzLCAweDZBNjQsIDB4NkE2NiwKKyAgICAweDZBNjcsIDB4NkE2OCwgMHg2QTY5LCAweDZBNkEsIDB4NkE2QiwgMHg2QTZDLCAweDZBNkQsIDB4NkE2RSwgMHg2QTZGLAorICAgIDB4NkE3MCwgMHg2QTcyLCAweDZBNzMsIDB4NkE3NCwgMHg2QTc1LCAweDZBNzYsIDB4NkE3NywgMHg2QTc4LCAweDZBN0EsCisgICAgMHg2QTdCLCAweDZBN0QsIDB4NkE3RSwgMHg2QTdGLCAweDZBODEsIDB4NkE4MiwgMHg2QTgzLCAweDZBODUsIDB4NkE4NiwKKyAgICAweDZBODcsIDB4NkE4OCwgMHg2QThBLCAweDZBOEIsIDB4NkE4QywgMHg2QThELCAweDZBOEYsIDB4NkE5MiwgMHg2QTkzLAorICAgIDB4NkE5NSwgMHg2QTk2LCAweDZBOTgsIDB4NkE5OSwgMHg2QTlBLCAweDZBOUIsIDB4NkE5RCwgMHg2QTlFLCAweDZBOUYsCisgICAgMHg2QUExLCAweDZBQTQsIDB4NkFBNSwgMHg2QUE2LCAweDZBQTcsIDB4NkFBOCwgMHg2QUFBLCAweDZBQUQsIDB4NkFBRSwKKyAgICAweDZBQjAsIDB4NkFCMSwgMHg2QUIyLCAweDZBQjQsIDB4NkFCNSwgMHg2QUI2LCAweDZBQjcsIDB4NkFCOSwgMHg2QUJBLAorICAgIDB4NkFCQywgMHg2QUJELCAweDZBQkUsIDB4NkFCRiwgMHg2QUMwLCAweDZBQzEsIDB4NkFDMiwgMHg2QUM0LCAweDZBQzUsCisgICAgMHg2QUM2LCAweDZBQzcsIDB4NkFDOCwgMHg2QUM5LCAweDZBQ0EsIDB4NkFDQiwgMHg2QUNDLCAweDZBQ0QsIDB4NkFDRSwKKyAgICAweDZBQ0YsIDB4NkFEMCwgMHg2QUQxLCAweDZBRDIsIDB4NkFENCwgMHg2QUQ1LCAweDZBRDYsIDB4NkFENywgMHg2QUQ4LAorICAgIDB4NkFEOSwgMHg2QURDLCAweDZBRTAsIDB4NkFFMSwgMHg2QUUyLCAweDZBRTMsIDB4NkFFNCwgMHg2QUU1LCAweDZBRTYsCisgICAgMHg2QUU5LCAweDZBRUIsIDB4NkFFRCwgMHg2QUVFLCAweDZBRUYsIDB4NkFGMCwgMHg2QUYxLCAweDZBRjIsIDB4NkFGNCwKKyAgICAweDZBRjUsIDB4NkFGNiwgMHg2QUY3LCAweDZBRjksIDB4NkFGQSwgMHg2QUZDLCAweDZBRkQsIDB4NkFGRSwgMHg2QUZGLAorICAgIDB4NkIwMCwgMHg2QjAxLCAweDZCMDIsIDB4NkIwMywgMHg2QjA1LCAweDZCMDYsIDB4NkIwNywgMHg2QjA4LCAweDZCMDksCisgICAgMHg2QjBCLCAweDZCMEMsIDB4NkIwRCwgMHg2QjBFLCAweDZCMTAsIDB4NkIxMSwgMHg2QjEzLCAweDZCMTQsIDB4NkIxNSwKKyAgICAweDZCMTcsIDB4NkIxOCwgMHg2QjE5LCAweDZCMUEsIDB4NkIxQiwgMHg2QjFDLCAweDZCMUQsIDB4NkIxRiwgMHg2QjI1LAorICAgIDB4NkIyNiwgMHg2QjI4LCAweDZCMjksIDB4NkIyQSwgMHg2QjJCLCAweDZCMkMsIDB4NkIyRCwgMHg2QjJFLCAweDZCMkYsCisgICAgMHg2QjMwLCAweDZCMzEsIDB4NkIzMywgMHg2QjM0LCAweDZCMzUsIDB4NkIzNiwgMHg2QjM4LCAweDZCM0IsIDB4NkIzQywKKyAgICAweDZCM0YsIDB4NkI0MCwgMHg2QjQxLCAweDZCNDIsIDB4NkI0NCwgMHg2QjQ1LCAweDZCNDgsIDB4NkI0QSwgMHg2QjRCLAorICAgIDB4NkI0RCwgMHg2QjRFLCAweDZCNEYsIDB4NkI1MSwgMHg2QjUyLCAweDZCNTMsIDB4NkI1NCwgMHg2QjU1LCAweDZCNTYsCisgICAgMHg2QjU3LCAweDZCNTgsIDB4NkI1QSwgMHg2QjVCLCAweDZCNUMsIDB4NkI1RCwgMHg2QjVFLCAweDZCNjAsIDB4NkI2OCwKKyAgICAweDZCNjksIDB4NkI2QiwgMHg2QjZDLCAweDZCNkQsIDB4NkI2RSwgMHg2QjZGLCAweDZCNzAsIDB4NkI3MSwgMHg2QjczLAorICAgIDB4NkI3NCwgMHg2Qjc1LCAweDZCNzYsIDB4NkI3QSwgMHg2QjdELCAweDZCN0UsIDB4NkI3RiwgMHg2QjgwLCAweDZCODUsCisgICAgMHg2Qjg4LCAweDZCOEMsIDB4NkI4RSwgMHg2QjhGLCAweDZCOTAsIDB4NkI5MSwgMHg2Qjk0LCAweDZCOTUsIDB4NkI5NywKKyAgICAweDZCOTksIDB4NkI5QywgMHg2QjlELCAweDZCOUYsIDB4NkJBMCwgMHg2QkEyLCAweDZCQTMsIDB4NkJBNSwgMHg2QkE2LAorICAgIDB4NkJBNywgMHg2QkE4LCAweDZCQTksIDB4NkJBQywgMHg2QkFELCAweDZCQjAsIDB4NkJCMSwgMHg2QkI2LCAweDZCQjgsCisgICAgMHg2QkI5LCAweDZCQkMsIDB4NkJCRCwgMHg2QkJFLCAweDZCQzAsIDB4NkJDMywgMHg2QkM0LCAweDZCQzcsIDB4NkJDOCwKKyAgICAweDZCQzksIDB4NkJDQSwgMHg2QkNDLCAweDZCQ0UsIDB4NkJEMCwgMHg2QkQxLCAweDZCRDgsIDB4NkJEQSwgMHg2QkRDLAorICAgIDB4NkJERCwgMHg2QkRFLCAweDZCREYsIDB4NkJFMCwgMHg2QkUyLCAweDZCRTMsIDB4NkJFNCwgMHg2QkU1LCAweDZCRTYsCisgICAgMHg2QkU3LCAweDZCRTgsIDB4NkJFOSwgMHg2QkVDLCAweDZCRUQsIDB4NkJFRSwgMHg2QkYwLCAweDZCRjEsIDB4NkJGMiwKKyAgICAweDZCRjQsIDB4NkJGNiwgMHg2QkY3LCAweDZCRjgsIDB4NkJGQSwgMHg2QkZCLCAweDZCRkMsIDB4NkJGRSwgMHg2QzAwLAorICAgIDB4NkMwMSwgMHg2QzAyLCAweDZDMDMsIDB4NkMwNCwgMHg2QzA5LCAweDZDMEEsIDB4NkMwQiwgMHg2QzBFLCAweDZDMTIsCisgICAgMHg2QzE3LCAweDZDMUMsIDB4NkMxRCwgMHg2QzFFLCAweDZDMjAsIDB4NkMyNSwgMHg2QzJELCAweDZDMzEsIDB4NkMzMywKKyAgICAweDZDMzYsIDB4NkMzNywgMHg2QzM5LCAweDZDM0EsIDB4NkMzQiwgMHg2QzNDLCAweDZDM0UsIDB4NkMzRiwgMHg2QzQzLAorICAgIDB4NkM0NCwgMHg2QzQ1LCAweDZDNDgsIDB4NkM0QiwgMHg2QzRDLCAweDZDNEQsIDB4NkM0RSwgMHg2QzRGLCAweDZDNTEsCisgICAgMHg2QzUyLCAweDZDNTMsIDB4NkM1NiwgMHg2QzU4LCAweDZDNTksIDB4NkM1QSwgMHg2QzYyLCAweDZDNjMsIDB4NkM2NSwKKyAgICAweDZDNjYsIDB4NkM2NywgMHg2QzZCLCAweDZDNkMsIDB4NkM2RCwgMHg2QzZFLCAweDZDNkYsIDB4NkM3MSwgMHg2QzczLAorICAgIDB4NkM3NSwgMHg2Qzc3LCAweDZDNzgsIDB4NkM3QSwgMHg2QzdCLCAweDZDN0MsIDB4NkM3RiwgMHg2QzgwLCAweDZDODQsCisgICAgMHg2Qzg3LCAweDZDOEEsIDB4NkM4QiwgMHg2QzhELCAweDZDOEUsIDB4NkM5MSwgMHg2QzkyLCAweDZDOTUsIDB4NkM5NiwKKyAgICAweDZDOTcsIDB4NkM5OCwgMHg2QzlBLCAweDZDOUMsIDB4NkM5RCwgMHg2QzlFLCAweDZDQTAsIDB4NkNBMiwgMHg2Q0E4LAorICAgIDB4NkNBQywgMHg2Q0FGLCAweDZDQjAsIDB4NkNCNCwgMHg2Q0I1LCAweDZDQjYsIDB4NkNCNywgMHg2Q0JBLCAweDZDQzAsCisgICAgMHg2Q0MxLCAweDZDQzIsIDB4NkNDMywgMHg2Q0M2LCAweDZDQzcsIDB4NkNDOCwgMHg2Q0NCLCAweDZDQ0QsIDB4NkNDRSwKKyAgICAweDZDQ0YsIDB4NkNEMSwgMHg2Q0QyLCAweDZDRDgsIDB4NkNEOSwgMHg2Q0RBLCAweDZDREMsIDB4NkNERCwgMHg2Q0RGLAorICAgIDB4NkNFNCwgMHg2Q0U2LCAweDZDRTcsIDB4NkNFOSwgMHg2Q0VDLCAweDZDRUQsIDB4NkNGMiwgMHg2Q0Y0LCAweDZDRjksCisgICAgMHg2Q0ZGLCAweDZEMDAsIDB4NkQwMiwgMHg2RDAzLCAweDZEMDUsIDB4NkQwNiwgMHg2RDA4LCAweDZEMDksIDB4NkQwQSwKKyAgICAweDZEMEQsIDB4NkQwRiwgMHg2RDEwLCAweDZEMTEsIDB4NkQxMywgMHg2RDE0LCAweDZEMTUsIDB4NkQxNiwgMHg2RDE4LAorICAgIDB4NkQxQywgMHg2RDFELCAweDZEMUYsIDB4NkQyMCwgMHg2RDIxLCAweDZEMjIsIDB4NkQyMywgMHg2RDI0LCAweDZEMjYsCisgICAgMHg2RDI4LCAweDZEMjksIDB4NkQyQywgMHg2RDJELCAweDZEMkYsIDB4NkQzMCwgMHg2RDM0LCAweDZEMzYsIDB4NkQzNywKKyAgICAweDZEMzgsIDB4NkQzQSwgMHg2RDNGLCAweDZENDAsIDB4NkQ0MiwgMHg2RDQ0LCAweDZENDksIDB4NkQ0QywgMHg2RDUwLAorICAgIDB4NkQ1NSwgMHg2RDU2LCAweDZENTcsIDB4NkQ1OCwgMHg2RDVCLCAweDZENUQsIDB4NkQ1RiwgMHg2RDYxLCAweDZENjIsCisgICAgMHg2RDY0LCAweDZENjUsIDB4NkQ2NywgMHg2RDY4LCAweDZENkIsIDB4NkQ2QywgMHg2RDZELCAweDZENzAsIDB4NkQ3MSwKKyAgICAweDZENzIsIDB4NkQ3MywgMHg2RDc1LCAweDZENzYsIDB4NkQ3QSwgMHg2RDdCLCAweDZEN0QsIDB4NkQ3RSwgMHg2RDdGLAorICAgIDB4NkQ4MCwgMHg2RDgxLCAweDZEODMsIDB4NkQ4NCwgMHg2RDg2LCAweDZEOEEsIDB4NkQ4QiwgMHg2RDhELCAweDZEOEYsCisgICAgMHg2RDkwLCAweDZEOTIsIDB4NkQ5NiwgMHg2RDk3LCAweDZEOTgsIDB4NkQ5OSwgMHg2RDlBLCAweDZEOUMsIDB4NkRBMiwKKyAgICAweDZEQTUsIDB4NkRBQywgMHg2REFELCAweDZEQjAsIDB4NkRCMSwgMHg2REIzLCAweDZEQjQsIDB4NkRCNiwgMHg2REI3LAorICAgIDB4NkRCOSwgMHg2REJBLCAweDZEQkIsIDB4NkRCQywgMHg2REJELCAweDZEQkUsIDB4NkRDMSwgMHg2REMyLCAweDZEQzMsCisgICAgMHg2REM4LCAweDZEQzksIDB4NkRDQSwgMHg2RENELCAweDZEQ0UsIDB4NkRDRiwgMHg2REQwLCAweDZERDIsIDB4NkREMywKKyAgICAweDZERDQsIDB4NkRENSwgMHg2REQ3LCAweDZEREEsIDB4NkREQiwgMHg2RERDLCAweDZEREYsIDB4NkRFMiwgMHg2REUzLAorICAgIDB4NkRFNSwgMHg2REU3LCAweDZERTgsIDB4NkRFOSwgMHg2REVELCAweDZERUYsIDB4NkRGMCwgMHg2REYyLCAweDZERjQsCisgICAgMHg2REY4LCAweDZERkQsIDB4NkRGRSwgMHg2REZGLCAweDZFMDAsIDB4NkUwMSwgMHg2RTAyLCAweDZFMDMsIDB4NkUwNCwKKyAgICAweDZFMDYsIDB4NkUwNywgMHg2RTA4LCAweDZFMDksIDB4NkUwQiwgMHg2RTBGLCAweDZFMTIsIDB4NkUxMywgMHg2RTE1LAorICAgIDB4NkUxOCwgMHg2RTE5LCAweDZFMUIsIDB4NkUxQywgMHg2RTFFLCAweDZFMUYsIDB4NkUyMiwgMHg2RTI3LCAweDZFMjgsCisgICAgMHg2RTJBLCAweDZFMkUsIDB4NkUzMCwgMHg2RTMxLCAweDZFMzMsIDB4NkUzNSwgMHg2RTM2LCAweDZFMzcsIDB4NkUzOSwKKyAgICAweDZFM0IsIDB4NkUzQywgMHg2RTNELCAweDZFM0YsIDB4NkU0MCwgMHg2RTQxLCAweDZFNDIsIDB4NkU0NSwgMHg2RTQ2LAorICAgIDB4NkU0NywgMHg2RTQ4LCAweDZFNDksIDB4NkU0QSwgMHg2RTRCLCAweDZFNEMsIDB4NkU0RiwgMHg2RTUwLCAweDZFNTEsCisgICAgMHg2RTUyLCAweDZFNTUsIDB4NkU1NywgMHg2RTU5LCAweDZFNUEsIDB4NkU1QywgMHg2RTVELCAweDZFNjAsIDB4NkU2MSwKKyAgICAweDZFNjIsIDB4NkU2MywgMHg2RTY0LCAweDZFNjUsIDB4NkU2NiwgMHg2RTY3LCAweDZFNjgsIDB4NkU2OSwgMHg2RTZBLAorICAgIDB4NkU2QywgMHg2RTZELCAweDZFNzAsIDB4NkU3MSwgMHg2RTcyLCAweDZFNzMsIDB4NkU3NCwgMHg2RTc1LCAweDZFNzYsCisgICAgMHg2RTc3LCAweDZFNzgsIDB4NkU3OSwgMHg2RTdBLCAweDZFN0IsIDB4NkU3QywgMHg2RTdELCAweDZFODAsIDB4NkU4MSwKKyAgICAweDZFODIsIDB4NkU4NCwgMHg2RTg3LCAweDZFODgsIDB4NkU4QSwgMHg2RThCLCAweDZFOEMsIDB4NkU4RCwgMHg2RThFLAorICAgIDB4NkU5MSwgMHg2RTkyLCAweDZFOTMsIDB4NkU5NCwgMHg2RTk1LCAweDZFOTcsIDB4NkU5OSwgMHg2RTlBLCAweDZFOUIsCisgICAgMHg2RTlFLCAweDZFQTAsIDB4NkVBMSwgMHg2RUEzLCAweDZFQTQsIDB4NkVBNiwgMHg2RUE4LCAweDZFQTksIDB4NkVBQiwKKyAgICAweDZFQUMsIDB4NkVBRCwgMHg2RUFFLCAweDZFQjAsIDB4NkVCMywgMHg2RUI1LCAweDZFQjgsIDB4NkVCOSwgMHg2RUJDLAorICAgIDB4NkVCRSwgMHg2RUJGLCAweDZFQzAsIDB4NkVDMywgMHg2RUM2LCAweDZFQzgsIDB4NkVDOSwgMHg2RUNBLCAweDZFQ0QsCisgICAgMHg2RUQwLCAweDZFRDIsIDB4NkVENiwgMHg2RUQ4LCAweDZFRDksIDB4NkVEQiwgMHg2RURDLCAweDZFREQsIDB4NkVFMywKKyAgICAweDZFRTcsIDB4NkVFQSwgMHg2RUVCLCAweDZFRUQsIDB4NkVFRSwgMHg2RUYwLCAweDZFRjEsIDB4NkVGMywgMHg2RUY1LAorICAgIDB4NkVGNiwgMHg2RUZBLCAweDZFRkIsIDB4NkVGQywgMHg2RUZELCAweDZFRkUsIDB4NkYwMCwgMHg2RjAzLCAweDZGMDQsCisgICAgMHg2RjA1LCAweDZGMDcsIDB4NkYwOCwgMHg2RjBBLCAweDZGMEIsIDB4NkYwQywgMHg2RjBELCAweDZGMEUsIDB4NkYxMCwKKyAgICAweDZGMTEsIDB4NkYxMiwgMHg2RjE2LCAweDZGMTcsIDB4NkYxOCwgMHg2RjE5LCAweDZGMUIsIDB4NkYxQywgMHg2RjFELAorICAgIDB4NkYxRSwgMHg2RjFGLCAweDZGMjEsIDB4NkYyNSwgMHg2RjI2LCAweDZGMjcsIDB4NkYyOCwgMHg2RjJFLCAweDZGMzAsCisgICAgMHg2RjM0LCAweDZGMzUsIDB4NkYzNywgMHg2RjM5LCAweDZGM0EsIDB4NkYzQiwgMHg2RjNDLCAweDZGM0QsIDB4NkY0MCwKKyAgICAweDZGNDIsIDB4NkY0MywgMHg2RjQ0LCAweDZGNDUsIDB4NkY0OCwgMHg2RjQ5LCAweDZGNEEsIDB4NkY0QywgMHg2RjRFLAorICAgIDB4NkY0RiwgMHg2RjUwLCAweDZGNTIsIDB4NkY1MywgMHg2RjU1LCAweDZGNTYsIDB4NkY1NywgMHg2RjVBLCAweDZGNUIsCisgICAgMHg2RjVELCAweDZGNUYsIDB4NkY2MCwgMHg2RjYxLCAweDZGNjMsIDB4NkY2NSwgMHg2RjY3LCAweDZGNjgsIDB4NkY2OSwKKyAgICAweDZGNkEsIDB4NkY2QiwgMHg2RjZDLCAweDZGNzEsIDB4NkY3MywgMHg2Rjc1LCAweDZGNzYsIDB4NkY3OSwgMHg2RjdCLAorICAgIDB4NkY3RCwgMHg2RjdFLCAweDZGODEsIDB4NkY4MiwgMHg2RjgzLCAweDZGODUsIDB4NkY4QSwgMHg2RjhCLCAweDZGOEYsCisgICAgMHg2RjkwLCAweDZGOTEsIDB4NkY5MiwgMHg2RjkzLCAweDZGOTQsIDB4NkY5NSwgMHg2Rjk2LCAweDZGOTgsIDB4NkY5OSwKKyAgICAweDZGOUEsIDB4NkY5QiwgMHg2RjlELCAweDZGOUUsIDB4NkY5RiwgMHg2RkEyLCAweDZGQTMsIDB4NkZBNSwgMHg2RkE2LAorICAgIDB4NkZBOCwgMHg2RkFBLCAweDZGQUIsIDB4NkZBQywgMHg2RkFELCAweDZGQUYsIDB4NkZCMCwgMHg2RkIyLCAweDZGQjQsCisgICAgMHg2RkI1LCAweDZGQjcsIDB4NkZCOCwgMHg2RkJBLCAweDZGQkIsIDB4NkZCQywgMHg2RkJELCAweDZGQkUsIDB4NkZCRiwKKyAgICAweDZGQzQsIDB4NkZDNSwgMHg2RkM2LCAweDZGQzcsIDB4NkZDOCwgMHg2RkNBLCAweDZGQ0IsIDB4NkZDQywgMHg2RkNELAorICAgIDB4NkZDRSwgMHg2RkNGLCAweDZGRDAsIDB4NkZEMywgMHg2RkQ0LCAweDZGRDYsIDB4NkZENywgMHg2RkQ5LCAweDZGREEsCisgICAgMHg2RkRDLCAweDZGREQsIDB4NkZFMiwgMHg2RkUzLCAweDZGRTUsIDB4NkZFNiwgMHg2RkU3LCAweDZGRTgsIDB4NkZFOSwKKyAgICAweDZGRUEsIDB4NkZFQywgMHg2RkVELCAweDZGRjIsIDB4NkZGMywgMHg2RkY0LCAweDZGRjUsIDB4NkZGNiwgMHg2RkY3LAorICAgIDB4NkZGOCwgMHg2RkY5LCAweDZGRkIsIDB4NkZGRCwgMHg2RkZGLCAweDcwMDAsIDB4NzAwMSwgMHg3MDAyLCAweDcwMDMsCisgICAgMHg3MDA0LCAweDcwMDcsIDB4NzAwOCwgMHg3MDBBLCAweDcwMEMsIDB4NzAwRCwgMHg3MDBFLCAweDcwMTAsIDB4NzAxMiwKKyAgICAweDcwMTMsIDB4NzAxNCwgMHg3MDE2LCAweDcwMTcsIDB4NzAxOSwgMHg3MDFDLCAweDcwMUUsIDB4NzAyMSwgMHg3MDIyLAorICAgIDB4NzAyNCwgMHg3MDI1LCAweDcwMjYsIDB4NzAyOSwgMHg3MDJBLCAweDcwMkIsIDB4NzAyQywgMHg3MDJELCAweDcwMkUsCisgICAgMHg3MDJGLCAweDcwMzEsIDB4NzAzMywgMHg3MDM0LCAweDcwMzYsIDB4NzAzNywgMHg3MDM4LCAweDcwM0EsIDB4NzAzQiwKKyAgICAweDcwM0MsIDB4NzAzRCwgMHg3MDNGLCAweDcwNDAsIDB4NzA0MSwgMHg3MDQyLCAweDcwNDUsIDB4NzA0NiwgMHg3MDQ3LAorICAgIDB4NzA0OCwgMHg3MDQ5LCAweDcwNEEsIDB4NzA0QiwgMHg3MDRELCAweDcwNEUsIDB4NzA1MCwgMHg3MDUyLCAweDcwNTMsCisgICAgMHg3MDU0LCAweDcwNTYsIDB4NzA1NywgMHg3MDU5LCAweDcwNUEsIDB4NzA1QiwgMHg3MDVDLCAweDcwNUYsIDB4NzA2MCwKKyAgICAweDcwNjEsIDB4NzA2MiwgMHg3MDY1LCAweDcwNjYsIDB4NzA2OCwgMHg3MDY5LCAweDcwNkEsIDB4NzA2RSwgMHg3MDcxLAorICAgIDB4NzA3MiwgMHg3MDczLCAweDcwNzQsIDB4NzA3NywgMHg3MDc5LCAweDcwN0EsIDB4NzA3QiwgMHg3MDdELCAweDcwODEsCisgICAgMHg3MDgyLCAweDcwODMsIDB4NzA4NCwgMHg3MDg2LCAweDcwODcsIDB4NzA4OCwgMHg3MDhCLCAweDcwOEMsIDB4NzA4RCwKKyAgICAweDcwOEYsIDB4NzA5MCwgMHg3MDkxLCAweDcwOTMsIDB4NzA5NywgMHg3MDk4LCAweDcwOUEsIDB4NzA5QiwgMHg3MDlFLAorICAgIDB4NzA5RiwgMHg3MEEwLCAweDcwQTEsIDB4NzBBMiwgMHg3MEEzLCAweDcwQTQsIDB4NzBBNSwgMHg3MEE2LCAweDcwQTcsCisgICAgMHg3MEE4LCAweDcwQTksIDB4NzBBQSwgMHg3MEIwLCAweDcwQjIsIDB4NzBCNCwgMHg3MEI1LCAweDcwQjYsIDB4NzBCQSwKKyAgICAweDcwQkUsIDB4NzBCRiwgMHg3MEM0LCAweDcwQzUsIDB4NzBDNiwgMHg3MEM3LCAweDcwQzksIDB4NzBDQiwgMHg3MENDLAorICAgIDB4NzBDRCwgMHg3MENFLCAweDcwRDAsIDB4NzBEMSwgMHg3MEQyLCAweDcwRDMsIDB4NzBENCwgMHg3MEQ1LCAweDcwRDYsCisgICAgMHg3MEQ3LCAweDcwREEsIDB4NzBEQywgMHg3MERELCAweDcwREUsIDB4NzBFMCwgMHg3MEUxLCAweDcwRTIsIDB4NzBFMywKKyAgICAweDcwRTUsIDB4NzBFQSwgMHg3MEVFLCAweDcwRjAsIDB4NzBGMSwgMHg3MEYyLCAweDcwRjMsIDB4NzBGNSwgMHg3MEY2LAorICAgIDB4NzBGOCwgMHg3MEZBLCAweDcwRkIsIDB4NzBGQywgMHg3MEZFLCAweDcwRkYsIDB4NzEwMCwgMHg3MTAxLCAweDcxMDIsCisgICAgMHg3MTAzLCAweDcxMDQsIDB4NzEwNSwgMHg3MTA2LCAweDcxMDcsIDB4NzEwOCwgMHg3MTBCLCAweDcxMEMsIDB4NzEwRCwKKyAgICAweDcxMEUsIDB4NzEwRiwgMHg3MTExLCAweDcxMTIsIDB4NzExNCwgMHg3MTE3LCAweDcxMUIsIDB4NzExQywgMHg3MTFELAorICAgIDB4NzExRSwgMHg3MTFGLCAweDcxMjAsIDB4NzEyMiwgMHg3MTIzLCAweDcxMjQsIDB4NzEyNSwgMHg3MTI3LCAweDcxMjgsCisgICAgMHg3MTI5LCAweDcxMkEsIDB4NzEyQiwgMHg3MTJDLCAweDcxMkQsIDB4NzEyRSwgMHg3MTMyLCAweDcxMzMsIDB4NzEzNCwKKyAgICAweDcxMzUsIDB4NzEzNywgMHg3MTM4LCAweDcxMzksIDB4NzEzQSwgMHg3MTNCLCAweDcxM0MsIDB4NzEzRCwgMHg3MTNFLAorICAgIDB4NzEzRiwgMHg3MTQwLCAweDcxNDEsIDB4NzE0MiwgMHg3MTQzLCAweDcxNDQsIDB4NzE0NiwgMHg3MTQ3LCAweDcxNDgsCisgICAgMHg3MTRCLCAweDcxNEQsIDB4NzE0RiwgMHg3MTUwLCAweDcxNTEsIDB4NzE1MywgMHg3MTU0LCAweDcxNTUsIDB4NzE1NiwKKyAgICAweDcxNTcsIDB4NzE1OCwgMHg3MTU5LCAweDcxNUEsIDB4NzE1QiwgMHg3MTVELCAweDcxNUYsIDB4NzE2MCwgMHg3MTYxLAorICAgIDB4NzE2MywgMHg3MTY1LCAweDcxNkEsIDB4NzE2QiwgMHg3MTZELCAweDcxNkYsIDB4NzE3MCwgMHg3MTcxLCAweDcxNzQsCisgICAgMHg3MTc1LCAweDcxNzYsIDB4NzE3NywgMHg3MTc5LCAweDcxN0IsIDB4NzE3QywgMHg3MTdFLCAweDcxN0YsIDB4NzE4MCwKKyAgICAweDcxODEsIDB4NzE4MiwgMHg3MTgzLCAweDcxODUsIDB4NzE4NiwgMHg3MTg3LCAweDcxODgsIDB4NzE4OSwgMHg3MThCLAorICAgIDB4NzE4QywgMHg3MThELCAweDcxOEUsIDB4NzE5MCwgMHg3MTkxLCAweDcxOTMsIDB4NzE5NSwgMHg3MTk2LCAweDcxOUEsCisgICAgMHg3MTlCLCAweDcxOUMsIDB4NzE5RCwgMHg3MTlFLCAweDcxQTEsIDB4NzFBMiwgMHg3MUEzLCAweDcxQTQsIDB4NzFBNSwKKyAgICAweDcxQTYsIDB4NzFBNywgMHg3MUE5LCAweDcxQUEsIDB4NzFBQiwgMHg3MUFELCAweDcxQUUsIDB4NzFBRiwgMHg3MUIwLAorICAgIDB4NzFCMiwgMHg3MUI0LCAweDcxQjYsIDB4NzFCNywgMHg3MUI4LCAweDcxQkEsIDB4NzFCQiwgMHg3MUJDLCAweDcxQkQsCisgICAgMHg3MUJGLCAweDcxQzAsIDB4NzFDMiwgMHg3MUM0LCAweDcxQzUsIDB4NzFDNiwgMHg3MUM3LCAweDcxQzksIDB4NzFDQSwKKyAgICAweDcxQ0IsIDB4NzFDQywgMHg3MUNELCAweDcxQ0YsIDB4NzFEMCwgMHg3MUQxLCAweDcxRDMsIDB4NzFENiwgMHg3MUQ3LAorICAgIDB4NzFEOCwgMHg3MURBLCAweDcxREIsIDB4NzFERCwgMHg3MURFLCAweDcxRTEsIDB4NzFFMiwgMHg3MUUzLCAweDcxRTQsCisgICAgMHg3MUU4LCAweDcxRTksIDB4NzFFQSwgMHg3MUVCLCAweDcxRUMsIDB4NzFFRiwgMHg3MUYwLCAweDcxRjEsIDB4NzFGMiwKKyAgICAweDcxRjMsIDB4NzFGNSwgMHg3MUY2LCAweDcxRjcsIDB4NzFGOCwgMHg3MUZBLCAweDcxRkIsIDB4NzFGRCwgMHg3MUZGLAorICAgIDB4NzIwMCwgMHg3MjAxLCAweDcyMDIsIDB4NzIwMywgMHg3MjA0LCAweDcyMDUsIDB4NzIwNywgMHg3MjA4LCAweDcyMDksCisgICAgMHg3MjBBLCAweDcyMEIsIDB4NzIwQywgMHg3MjBFLCAweDcyMEYsIDB4NzIxMSwgMHg3MjEyLCAweDcyMTMsIDB4NzIxNCwKKyAgICAweDcyMTUsIDB4NzIxNiwgMHg3MjE3LCAweDcyMTgsIDB4NzIxOSwgMHg3MjFBLCAweDcyMUMsIDB4NzIxRSwgMHg3MjFGLAorICAgIDB4NzIyMCwgMHg3MjIxLCAweDcyMjIsIDB4NzIyMywgMHg3MjI0LCAweDcyMjUsIDB4NzIyNiwgMHg3MjI3LCAweDcyMjksCisgICAgMHg3MjJCLCAweDcyMkQsIDB4NzIyRSwgMHg3MjJGLCAweDcyMzMsIDB4NzIzNCwgMHg3MjNDLCAweDcyNDAsIDB4NzI0MSwKKyAgICAweDcyNDIsIDB4NzI0MywgMHg3MjQ0LCAweDcyNDUsIDB4NzI0NiwgMHg3MjQ5LCAweDcyNEEsIDB4NzI0QiwgMHg3MjRFLAorICAgIDB4NzI0RiwgMHg3MjUwLCAweDcyNTEsIDB4NzI1MywgMHg3MjU0LCAweDcyNTUsIDB4NzI1NywgMHg3MjVBLCAweDcyNUMsCisgICAgMHg3MjVFLCAweDcyNjAsIDB4NzI2MywgMHg3MjY0LCAweDcyNjUsIDB4NzI2OCwgMHg3MjZBLCAweDcyNkIsIDB4NzI2QywKKyAgICAweDcyNkQsIDB4NzI3MCwgMHg3MjcxLCAweDcyNzMsIDB4NzI3NCwgMHg3Mjc2LCAweDcyNzcsIDB4NzI3OCwgMHg3MjdCLAorICAgIDB4NzI3QywgMHg3MjgyLCAweDcyODMsIDB4NzI4NSwgMHg3Mjg2LCAweDcyODcsIDB4NzI4OCwgMHg3Mjg5LCAweDcyOEMsCisgICAgMHg3MjhFLCAweDcyOTAsIDB4NzI5MSwgMHg3MjkzLCAweDcyOTQsIDB4NzI5NSwgMHg3Mjk3LCAweDcyOTgsIDB4NzI5OSwKKyAgICAweDcyOUEsIDB4NzI5QiwgMHg3MjlDLCAweDcyOUQsIDB4NzI5RSwgMHg3MkEwLCAweDcyQTEsIDB4NzJBMywgMHg3MkE0LAorICAgIDB4NzJBNSwgMHg3MkE2LCAweDcyQTgsIDB4NzJBOSwgMHg3MkFBLCAweDcyQUIsIDB4NzJBRSwgMHg3MkIxLCAweDcyQjIsCisgICAgMHg3MkIzLCAweDcyQjUsIDB4NzJCQSwgMHg3MkJCLCAweDcyQkMsIDB4NzJCRCwgMHg3MkJFLCAweDcyQkYsIDB4NzJDNSwKKyAgICAweDcyQzYsIDB4NzJDNywgMHg3MkM5LCAweDcyQ0EsIDB4NzJDQiwgMHg3MkNDLCAweDcyQ0YsIDB4NzJEMSwgMHg3MkQzLAorICAgIDB4NzJENCwgMHg3MkQ1LCAweDcyRDYsIDB4NzJEOCwgMHg3MkRBLCAweDcyREIsIDB4NzJEQywgMHg3MkRELCAweDcyREYsCisgICAgMHg3MkUyLCAweDcyRTMsIDB4NzJFNCwgMHg3MkU1LCAweDcyRTYsIDB4NzJFNywgMHg3MkVBLCAweDcyRUIsIDB4NzJGNSwKKyAgICAweDcyRjYsIDB4NzJGRSwgMHg3MkZGLCAweDczMDAsIDB4NzMwMiwgMHg3MzA0LCAweDczMDUsIDB4NzMwNiwgMHg3MzA3LAorICAgIDB4NzMwOCwgMHg3MzA5LCAweDczMEIsIDB4NzMwQywgMHg3MzBELCAweDczMEYsIDB4NzMxMCwgMHg3MzExLCAweDczMTIsCisgICAgMHg3MzE0LCAweDczMTgsIDB4NzMxOSwgMHg3MzFBLCAweDczMUYsIDB4NzMyMCwgMHg3MzIzLCAweDczMjQsIDB4NzMyNiwKKyAgICAweDczMjcsIDB4NzMyOCwgMHg3MzJELCAweDczMkYsIDB4NzMzMCwgMHg3MzMyLCAweDczMzMsIDB4NzMzNSwgMHg3MzNBLAorICAgIDB4NzMzQywgMHg3MzNELCAweDczNDAsIDB4NzM0MiwgMHg3MzQzLCAweDczNDYsIDB4NzM0NywgMHg3MzQ4LCAweDczNDksCisgICAgMHg3MzRBLCAweDczNEIsIDB4NzM0QywgMHg3MzRFLCAweDczNEYsIDB4NzM1MSwgMHg3MzUzLCAweDczNTQsIDB4NzM1NSwKKyAgICAweDczNTYsIDB4NzM1OCwgMHg3MzU5LCAweDczNUEsIDB4NzM1QiwgMHg3MzVDLCAweDczNUQsIDB4NzM1RSwgMHg3MzVGLAorICAgIDB4NzM2MSwgMHg3MzYyLCAweDczNjMsIDB4NzM2NCwgMHg3MzY1LCAweDczNjYsIDB4NzM2NywgMHg3MzY5LCAweDczNkUsCisgICAgMHg3MzcxLCAweDczNzMsIDB4NzM3NCwgMHg3Mzc2LCAweDczNzksIDB4NzM3RCwgMHg3MzdGLCAweDczODEsIDB4NzM4MiwKKyAgICAweDczODMsIDB4NzM4NSwgMHg3Mzg2LCAweDczODgsIDB4NzM4QSwgMHg3MzhDLCAweDczOEQsIDB4NzM4RiwgMHg3MzkwLAorICAgIDB4NzM5MiwgMHg3MzkzLCAweDczOTQsIDB4NzM5NSwgMHg3Mzk3LCAweDczOTgsIDB4NzM5OSwgMHg3MzlBLCAweDczOUMsCisgICAgMHg3MzlELCAweDczOUUsIDB4NzNBMCwgMHg3M0ExLCAweDczQTMsIDB4NzNBNCwgMHg3M0E1LCAweDczQTYsIDB4NzNBNywKKyAgICAweDczQTgsIDB4NzNBQSwgMHg3M0FDLCAweDczQUQsIDB4NzNCMSwgMHg3M0I0LCAweDczQjUsIDB4NzNCNiwgMHg3M0I4LAorICAgIDB4NzNCOSwgMHg3M0JDLCAweDczQkQsIDB4NzNCRSwgMHg3M0JGLCAweDczQzEsIDB4NzNDMywgMHg3M0M0LCAweDczQzUsCisgICAgMHg3M0M2LCAweDczQzcsIDB4NzNDQiwgMHg3M0NDLCAweDczQ0UsIDB4NzNEMiwgMHg3M0QzLCAweDczRDQsIDB4NzNENSwKKyAgICAweDczRDYsIDB4NzNENywgMHg3M0Q4LCAweDczREEsIDB4NzNEQiwgMHg3M0RDLCAweDczREQsIDB4NzNERiwgMHg3M0UxLAorICAgIDB4NzNFMiwgMHg3M0UzLCAweDczRTQsIDB4NzNFNiwgMHg3M0U4LCAweDczRUEsIDB4NzNFQiwgMHg3M0VDLCAweDczRUUsCisgICAgMHg3M0VGLCAweDczRjAsIDB4NzNGMSwgMHg3M0YzLCAweDczRjQsIDB4NzNGNSwgMHg3M0Y2LCAweDczRjcsIDB4NzNGOCwKKyAgICAweDczRjksIDB4NzNGQSwgMHg3M0ZCLCAweDczRkMsIDB4NzNGRCwgMHg3M0ZGLCAweDc0MDAsIDB4NzQwMSwgMHg3NDAyLAorICAgIDB4NzQwNCwgMHg3NDA3LCAweDc0MDgsIDB4NzQwQiwgMHg3NDBDLCAweDc0MEQsIDB4NzQwRSwgMHg3NDExLCAweDc0MTIsCisgICAgMHg3NDEzLCAweDc0MTQsIDB4NzQxNSwgMHg3NDE2LCAweDc0MTcsIDB4NzQxOCwgMHg3NDE5LCAweDc0MUMsIDB4NzQxRCwKKyAgICAweDc0MUUsIDB4NzQxRiwgMHg3NDIwLCAweDc0MjEsIDB4NzQyMywgMHg3NDI0LCAweDc0MjcsIDB4NzQyOSwgMHg3NDJCLAorICAgIDB4NzQyRCwgMHg3NDJGLCAweDc0MzEsIDB4NzQzMiwgMHg3NDM3LCAweDc0MzgsIDB4NzQzOSwgMHg3NDNBLCAweDc0M0IsCisgICAgMHg3NDNELCAweDc0M0UsIDB4NzQ0MCwgMHg3NDQyLCAweDc0NDMsIDB4NzQ0NCwgMHg3NDQ1LCAweDc0NDYsIDB4NzQ0NywKKyAgICAweDc0NDgsIDB4NzQ0OSwgMHg3NDRBLCAweDc0NEMsIDB4NzQ0RCwgMHg3NDRFLCAweDc0NEYsIDB4NzQ1MCwgMHg3NDUxLAorICAgIDB4NzQ1MiwgMHg3NDUzLCAweDc0NTQsIDB4NzQ1NiwgMHg3NDU4LCAweDc0NUQsIDB4NzQ2MCwgMHg3NDYxLCAweDc0NjIsCisgICAgMHg3NDY0LCAweDc0NjUsIDB4NzQ2NiwgMHg3NDY3LCAweDc0NjgsIDB4NzQ2QiwgMHg3NDZDLCAweDc0NkUsIDB4NzQ2RiwKKyAgICAweDc0NzEsIDB4NzQ3MiwgMHg3NDczLCAweDc0NzQsIDB4NzQ3NSwgMHg3NDc4LCAweDc0NzksIDB4NzQ3QSwgMHg3NDdCLAorICAgIDB4NzQ3QywgMHg3NDdELCAweDc0N0YsIDB4NzQ4MiwgMHg3NDg0LCAweDc0ODUsIDB4NzQ4NiwgMHg3NDg4LCAweDc0OEEsCisgICAgMHg3NDhDLCAweDc0OEQsIDB4NzQ4RiwgMHg3NDkxLCAweDc0OTIsIDB4NzQ5MywgMHg3NDk0LCAweDc0OTUsIDB4NzQ5NiwKKyAgICAweDc0OTcsIDB4NzQ5OCwgMHg3NDk5LCAweDc0OUEsIDB4NzQ5QiwgMHg3NDlELCAweDc0OUYsIDB4NzRBMCwgMHg3NEExLAorICAgIDB4NzRBMiwgMHg3NEE0LCAweDc0QTUsIDB4NzRBQSwgMHg3NEFCLCAweDc0QUMsIDB4NzRBRCwgMHg3NEFFLCAweDc0QUYsCisgICAgMHg3NEIxLCAweDc0QjIsIDB4NzRCMywgMHg3NEI0LCAweDc0QjUsIDB4NzRCNiwgMHg3NEI3LCAweDc0QjgsIDB4NzRCOSwKKyAgICAweDc0QkIsIDB4NzRCQywgMHg3NEJFLCAweDc0QkYsIDB4NzRDMCwgMHg3NEMxLCAweDc0QzIsIDB4NzRDMywgMHg3NEM0LAorICAgIDB4NzRDNSwgMHg3NEM2LCAweDc0QzcsIDB4NzRDOCwgMHg3NEM5LCAweDc0Q0IsIDB4NzRDQywgMHg3NENELCAweDc0Q0UsCisgICAgMHg3NEQwLCAweDc0RDEsIDB4NzREMywgMHg3NEQ1LCAweDc0RDYsIDB4NzRENywgMHg3NEQ4LCAweDc0RDksIDB4NzREQiwKKyAgICAweDc0REQsIDB4NzRERiwgMHg3NEUxLCAweDc0RTUsIDB4NzRFNywgMHg3NEU4LCAweDc0RTksIDB4NzRFQSwgMHg3NEVCLAorICAgIDB4NzRFQywgMHg3NEVELCAweDc0RjAsIDB4NzRGMSwgMHg3NEYyLCAweDc0RjMsIDB4NzRGNSwgMHg3NEY4LCAweDc0RjksCisgICAgMHg3NEZBLCAweDc0RkIsIDB4NzRGQywgMHg3NEZELCAweDc0RkUsIDB4NzUwMCwgMHg3NTAxLCAweDc1MDIsIDB4NzUwMywKKyAgICAweDc1MDUsIDB4NzUwNiwgMHg3NTA3LCAweDc1MDgsIDB4NzUwOSwgMHg3NTBBLCAweDc1MEIsIDB4NzUwRSwgMHg3NTEwLAorICAgIDB4NzUxMiwgMHg3NTE0LCAweDc1MTUsIDB4NzUxNiwgMHg3NTE3LCAweDc1MUIsIDB4NzUxRCwgMHg3NTFFLCAweDc1MjAsCisgICAgMHg3NTIxLCAweDc1MjIsIDB4NzUyNCwgMHg3NTI2LCAweDc1MjcsIDB4NzUyQSwgMHg3NTJFLCAweDc1MzQsIDB4NzUzNiwKKyAgICAweDc1MzksIDB4NzUzQywgMHg3NTNELCAweDc1M0YsIDB4NzU0MSwgMHg3NTQyLCAweDc1NDMsIDB4NzU0NCwgMHg3NTQ2LAorICAgIDB4NzU0NywgMHg3NTQ5LCAweDc1NEEsIDB4NzU0RCwgMHg3NTUwLCAweDc1NTEsIDB4NzU1MiwgMHg3NTUzLCAweDc1NTUsCisgICAgMHg3NTU2LCAweDc1NTcsIDB4NzU1OCwgMHg3NTVFLCAweDc1NUYsIDB4NzU2MCwgMHg3NTYxLCAweDc1NjMsIDB4NzU2NCwKKyAgICAweDc1NjcsIDB4NzU2OCwgMHg3NTY5LCAweDc1NkMsIDB4NzU2RCwgMHg3NTZFLCAweDc1NkYsIDB4NzU3MCwgMHg3NTcxLAorICAgIDB4NzU3MywgMHg3NTc1LCAweDc1NzcsIDB4NzU3QSwgMHg3NTdCLCAweDc1N0MsIDB4NzU3RCwgMHg3NTdFLCAweDc1ODAsCisgICAgMHg3NTgxLCAweDc1ODIsIDB4NzU4NCwgMHg3NTg1LCAweDc1ODgsIDB4NzU4OSwgMHg3NThBLCAweDc1OEMsIDB4NzU4RCwKKyAgICAweDc1OEUsIDB4NzU5MCwgMHg3NTkzLCAweDc1OTUsIDB4NzU5OCwgMHg3NTlCLCAweDc1OUMsIDB4NzU5RSwgMHg3NUEyLAorICAgIDB4NzVBNiwgMHg3NUE3LCAweDc1QTgsIDB4NzVBOSwgMHg3NUFBLCAweDc1QUQsIDB4NzVCNiwgMHg3NUI3LCAweDc1QkEsCisgICAgMHg3NUJCLCAweDc1QkYsIDB4NzVDMCwgMHg3NUMxLCAweDc1QzYsIDB4NzVDQiwgMHg3NUNDLCAweDc1Q0UsIDB4NzVDRiwKKyAgICAweDc1RDAsIDB4NzVEMSwgMHg3NUQzLCAweDc1RDcsIDB4NzVEQSwgMHg3NURDLCAweDc1REQsIDB4NzVERiwgMHg3NUUwLAorICAgIDB4NzVFMSwgMHg3NUU1LCAweDc1RTksIDB4NzVFQywgMHg3NUVELCAweDc1RUUsIDB4NzVFRiwgMHg3NUYyLCAweDc1RjMsCisgICAgMHg3NUY1LCAweDc1RjYsIDB4NzVGNywgMHg3NUY4LCAweDc1RkEsIDB4NzVGQiwgMHg3NUZELCAweDc1RkUsIDB4NzYwNCwKKyAgICAweDc2MDYsIDB4NzYwNywgMHg3NjA4LCAweDc2MDksIDB4NzYwRSwgMHg3NjBGLCAweDc2MTEsIDB4NzYxMiwgMHg3NjEzLAorICAgIDB4NzYxNCwgMHg3NjE2LCAweDc2MUEsIDB4NzYxQywgMHg3NjFELCAweDc2MjMsIDB4NzYyOCwgMHg3NjJDLCAweDc2MkUsCisgICAgMHg3NjJGLCAweDc2MzEsIDB4NzYzMiwgMHg3NjM2LCAweDc2MzcsIDB4NzYzOSwgMHg3NjNBLCAweDc2M0QsIDB4NzY0MSwKKyAgICAweDc2NDQsIDB4NzY0NSwgMHg3NjQ4LCAweDc2NEEsIDB4NzY0QiwgMHg3NjRFLCAweDc2NEYsIDB4NzY1MCwgMHg3NjUxLAorICAgIDB4NzY1MiwgMHg3NjUzLCAweDc2NTUsIDB4NzY1NywgMHg3NjU5LCAweDc2NUEsIDB4NzY1QiwgMHg3NjVELCAweDc2NjAsCisgICAgMHg3NjYxLCAweDc2NjYsIDB4NzY2OCwgMHg3NjZBLCAweDc2NzMsIDB4NzY3NCwgMHg3Njc1LCAweDc2NzYsIDB4NzY3NywKKyAgICAweDc2NzksIDB4NzY3QSwgMHg3NjdGLCAweDc2ODAsIDB4NzY4MSwgMHg3NjgzLCAweDc2ODUsIDB4NzY4OSwgMHg3NjhBLAorICAgIDB4NzY4QywgMHg3NjhELCAweDc2OEYsIDB4NzY5MCwgMHg3NjkyLCAweDc2OTQsIDB4NzY5NSwgMHg3Njk3LCAweDc2OTgsCisgICAgMHg3NjlCLCAweDc2OUMsIDB4NzY5RCwgMHg3NjlFLCAweDc2OUYsIDB4NzZBMCwgMHg3NkExLCAweDc2QTIsIDB4NzZBMywKKyAgICAweDc2QTUsIDB4NzZBNiwgMHg3NkE3LCAweDc2QTgsIDB4NzZBOSwgMHg3NkFBLCAweDc2QUIsIDB4NzZBQywgMHg3NkFELAorICAgIDB4NzZBRiwgMHg3NkIwLCAweDc2QjMsIDB4NzZCNSwgMHg3NkI2LCAweDc2QjcsIDB4NzZCOSwgMHg3NkJCLCAweDc2QkMsCisgICAgMHg3NkJELCAweDc2QkUsIDB4NzZDMCwgMHg3NkMxLCAweDc2QzMsIDB4NzZDNCwgMHg3NkM3LCAweDc2QzksIDB4NzZDQiwKKyAgICAweDc2Q0MsIDB4NzZEMywgMHg3NkQ1LCAweDc2RDksIDB4NzZEQSwgMHg3NkRDLCAweDc2REQsIDB4NzZFMCwgMHg3NkUyLAorICAgIDB4NzZFNiwgMHg3NkU4LCAweDc2RTksIDB4NzZFQSwgMHg3NkVCLCAweDc2RUMsIDB4NzZFRCwgMHg3NkYwLCAweDc2RjMsCisgICAgMHg3NkY1LCAweDc2RjYsIDB4NzZGNywgMHg3NkZBLCAweDc2RkIsIDB4NzZGRCwgMHg3NkZGLCAweDc3MDAsIDB4NzcwMiwKKyAgICAweDc3MDMsIDB4NzcwNSwgMHg3NzA2LCAweDc3MEEsIDB4NzcwQywgMHg3NzBFLCAweDc3MEYsIDB4NzcxMCwgMHg3NzExLAorICAgIDB4NzcxMiwgMHg3NzEzLCAweDc3MTQsIDB4NzcxNSwgMHg3NzE2LCAweDc3MTcsIDB4NzcxOCwgMHg3NzFCLCAweDc3MUMsCisgICAgMHg3NzFELCAweDc3MUUsIDB4NzcyMSwgMHg3NzIzLCAweDc3MjQsIDB4NzcyNSwgMHg3NzI3LCAweDc3MkEsIDB4NzcyQiwKKyAgICAweDc3MkMsIDB4NzcyRSwgMHg3NzMwLCAweDc3MzEsIDB4NzczMiwgMHg3NzMzLCAweDc3MzQsIDB4NzczOSwgMHg3NzNCLAorICAgIDB4NzczRCwgMHg3NzNFLCAweDc3M0YsIDB4Nzc0MiwgMHg3NzQ0LCAweDc3NDUsIDB4Nzc0NiwgMHg3NzQ4LCAweDc3NDksCisgICAgMHg3NzRBLCAweDc3NEIsIDB4Nzc0QywgMHg3NzRELCAweDc3NEUsIDB4Nzc1MiwgMHg3NzUzLCAweDc3NTQsIDB4Nzc1NSwKKyAgICAweDc3NTYsIDB4Nzc1NywgMHg3NzU4LCAweDc3NTksIDB4Nzc1QywgMHg3NzVELCAweDc3NUYsIDB4Nzc2MCwgMHg3NzY0LAorICAgIDB4Nzc2NywgMHg3NzY5LCAweDc3NkEsIDB4Nzc2RCwgMHg3NzZFLCAweDc3NkYsIDB4Nzc3MCwgMHg3NzcxLCAweDc3NzIsCisgICAgMHg3NzczLCAweDc3NzQsIDB4Nzc3NSwgMHg3Nzc2LCAweDc3NzcsIDB4Nzc3OCwgMHg3NzdBLCAweDc3N0IsIDB4Nzc3QywKKyAgICAweDc3ODEsIDB4Nzc4MiwgMHg3NzgzLCAweDc3ODYsIDB4Nzc4NywgMHg3Nzg4LCAweDc3ODksIDB4Nzc4QSwgMHg3NzhCLAorICAgIDB4Nzc4RiwgMHg3NzkwLCAweDc3OTMsIDB4Nzc5NCwgMHg3Nzk1LCAweDc3OTYsIDB4Nzc5NywgMHg3Nzk5LCAweDc3OUEsCisgICAgMHg3NzlCLCAweDc3OUMsIDB4Nzc5RCwgMHg3N0ExLCAweDc3QTMsIDB4NzdBNCwgMHg3N0E2LCAweDc3QTgsIDB4NzdBQiwKKyAgICAweDc3QUUsIDB4NzdBRiwgMHg3N0IxLCAweDc3QjIsIDB4NzdCNCwgMHg3N0I2LCAweDc3QjcsIDB4NzdCOCwgMHg3N0I5LAorICAgIDB4NzdCQSwgMHg3N0JFLCAweDc3QzAsIDB4NzdDMSwgMHg3N0MyLCAweDc3QzMsIDB4NzdDNCwgMHg3N0M1LCAweDc3QzYsCisgICAgMHg3N0M4LCAweDc3QzksIDB4NzdDQSwgMHg3N0NCLCAweDc3Q0MsIDB4NzdDRSwgMHg3N0NGLCAweDc3RDAsIDB4NzdEMSwKKyAgICAweDc3RDIsIDB4NzdEMywgMHg3N0Q0LCAweDc3RDUsIDB4NzdENiwgMHg3N0Q4LCAweDc3RDksIDB4NzdERCwgMHg3N0RFLAorICAgIDB4NzdERiwgMHg3N0UwLCAweDc3RTEsIDB4NzdFNCwgMHg3N0U2LCAweDc3RTgsIDB4NzdFQSwgMHg3N0YwLCAweDc3RjEsCisgICAgMHg3N0YyLCAweDc3RjQsIDB4NzdGNSwgMHg3N0Y3LCAweDc3RjksIDB4NzdGQSwgMHg3N0ZCLCAweDc3RkMsIDB4NzgwMywKKyAgICAweDc4MDQsIDB4NzgwNSwgMHg3ODA2LCAweDc4MDcsIDB4NzgwOCwgMHg3ODBBLCAweDc4MEIsIDB4NzgwRSwgMHg3ODBGLAorICAgIDB4NzgxMCwgMHg3ODEzLCAweDc4MTUsIDB4NzgxOSwgMHg3ODFCLCAweDc4MUUsIDB4NzgyMCwgMHg3ODIxLCAweDc4MjIsCisgICAgMHg3ODI0LCAweDc4MjgsIDB4NzgyQSwgMHg3ODJCLCAweDc4MkUsIDB4NzgyRiwgMHg3ODMxLCAweDc4MzIsIDB4NzgzMywKKyAgICAweDc4MzUsIDB4NzgzNiwgMHg3ODNELCAweDc4M0YsIDB4Nzg0MSwgMHg3ODQyLCAweDc4NDQsIDB4Nzg0NiwgMHg3ODQ4LAorICAgIDB4Nzg0OSwgMHg3ODRBLCAweDc4NEIsIDB4Nzg0RCwgMHg3ODRGLCAweDc4NTEsIDB4Nzg1MywgMHg3ODU0LCAweDc4NTgsCisgICAgMHg3ODU5LCAweDc4NUEsIDB4Nzg1QiwgMHg3ODVDLCAweDc4NUUsIDB4Nzg1RiwgMHg3ODYwLCAweDc4NjEsIDB4Nzg2MiwKKyAgICAweDc4NjMsIDB4Nzg2NSwgMHg3ODY2LCAweDc4NjcsIDB4Nzg2OSwgMHg3ODcwLCAweDc4NzEsIDB4Nzg3MiwgMHg3ODczLAorICAgIDB4Nzg3NCwgMHg3ODc1LCAweDc4NzYsIDB4Nzg3OCwgMHg3ODc5LCAweDc4N0EsIDB4Nzg3QiwgMHg3ODdELCAweDc4N0UsCisgICAgMHg3ODdGLCAweDc4ODAsIDB4Nzg4MSwgMHg3ODgyLCAweDc4ODMsIDB4Nzg4NCwgMHg3ODg1LCAweDc4ODYsIDB4Nzg4OCwKKyAgICAweDc4OEEsIDB4Nzg4QiwgMHg3ODhGLCAweDc4OTAsIDB4Nzg5MiwgMHg3ODk0LCAweDc4OTUsIDB4Nzg5NiwgMHg3ODk5LAorICAgIDB4Nzg5RCwgMHg3ODlFLCAweDc4QTAsIDB4NzhBMiwgMHg3OEE0LCAweDc4QTYsIDB4NzhBOCwgMHg3OEFBLCAweDc4QUIsCisgICAgMHg3OEFDLCAweDc4QUUsIDB4NzhBRiwgMHg3OEI1LCAweDc4QjYsIDB4NzhCNywgMHg3OEJCLCAweDc4QkQsIDB4NzhCRiwKKyAgICAweDc4QzAsIDB4NzhDMiwgMHg3OEMzLCAweDc4QzQsIDB4NzhDNiwgMHg3OEM3LCAweDc4QzgsIDB4NzhDQywgMHg3OENELAorICAgIDB4NzhDRSwgMHg3OENGLCAweDc4RDEsIDB4NzhEMiwgMHg3OEQzLCAweDc4RDYsIDB4NzhENywgMHg3OEQ4LCAweDc4REIsCisgICAgMHg3OERDLCAweDc4REQsIDB4NzhERSwgMHg3OERGLCAweDc4RTAsIDB4NzhFMSwgMHg3OEUyLCAweDc4RTQsIDB4NzhFNSwKKyAgICAweDc4RTYsIDB4NzhFOSwgMHg3OEVBLCAweDc4RUIsIDB4NzhFRCwgMHg3OEVFLCAweDc4RjAsIDB4NzhGMSwgMHg3OEYzLAorICAgIDB4NzhGNSwgMHg3OEY2LCAweDc4RjgsIDB4NzhGOSwgMHg3OEZCLCAweDc4RkMsIDB4NzhGRSwgMHg3OEZGLCAweDc5MDAsCisgICAgMHg3OTAyLCAweDc5MDMsIDB4NzkwNCwgMHg3OTA2LCAweDc5MDcsIDB4NzkwOCwgMHg3OTA5LCAweDc5MEEsIDB4NzkwQiwKKyAgICAweDc5MEMsIDB4NzkwRCwgMHg3OTBGLCAweDc5MTAsIDB4NzkxMSwgMHg3OTEyLCAweDc5MTQsIDB4NzkxNSwgMHg3OTE2LAorICAgIDB4NzkxNywgMHg3OTE4LCAweDc5MUEsIDB4NzkxQiwgMHg3OTFDLCAweDc5MUQsIDB4NzkxRiwgMHg3OTIwLCAweDc5MjEsCisgICAgMHg3OTIyLCAweDc5MjMsIDB4NzkyNSwgMHg3OTI3LCAweDc5MjgsIDB4NzkyOSwgMHg3OTJELCAweDc5MkUsIDB4NzkyRiwKKyAgICAweDc5MzAsIDB4NzkzMiwgMHg3OTMzLCAweDc5MzUsIDB4NzkzNiwgMHg3OTM3LCAweDc5MzgsIDB4NzkzOSwgMHg3OTNELAorICAgIDB4NzkzRiwgMHg3OTQyLCAweDc5NDMsIDB4Nzk0NCwgMHg3OTQ1LCAweDc5NDcsIDB4Nzk0QSwgMHg3OTRCLCAweDc5NEMsCisgICAgMHg3OTRELCAweDc5NEUsIDB4Nzk0RiwgMHg3OTUwLCAweDc5NTEsIDB4Nzk1MiwgMHg3OTU0LCAweDc5NTUsIDB4Nzk1OCwKKyAgICAweDc5NTksIDB4Nzk2MSwgMHg3OTYzLCAweDc5NjQsIDB4Nzk2NiwgMHg3OTY5LCAweDc5NkEsIDB4Nzk2QiwgMHg3OTZDLAorICAgIDB4Nzk2RSwgMHg3OTcwLCAweDc5NzEsIDB4Nzk3MiwgMHg3OTczLCAweDc5NzQsIDB4Nzk3NSwgMHg3OTc2LCAweDc5NzksCisgICAgMHg3OTdCLCAweDc5N0MsIDB4Nzk3RCwgMHg3OTdFLCAweDc5N0YsIDB4Nzk4MiwgMHg3OTgzLCAweDc5ODYsIDB4Nzk4NywKKyAgICAweDc5ODgsIDB4Nzk4OSwgMHg3OThCLCAweDc5OEMsIDB4Nzk5MCwgMHg3OTkxLCAweDc5OTIsIDB4Nzk5MywgMHg3OTk0LAorICAgIDB4Nzk5NSwgMHg3OTk2LCAweDc5OTcsIDB4Nzk5OCwgMHg3OTk5LCAweDc5OUIsIDB4Nzk5QywgMHg3OTlELCAweDc5OUUsCisgICAgMHg3OTlGLCAweDc5QTAsIDB4NzlBMSwgMHg3OUEyLCAweDc5QTMsIDB4NzlBNCwgMHg3OUE1LCAweDc5QTgsIDB4NzlBOSwKKyAgICAweDc5QUIsIDB4NzlBQywgMHg3OUFELCAweDc5QUYsIDB4NzlCMiwgMHg3OUI0LCAweDc5QjUsIDB4NzlCNiwgMHg3OUI3LAorICAgIDB4NzlCOCwgMHg3OUJDLCAweDc5QkYsIDB4NzlDMiwgMHg3OUM0LCAweDc5QzUsIDB4NzlDNywgMHg3OUM4LCAweDc5Q0EsCisgICAgMHg3OUNDLCAweDc5Q0UsIDB4NzlDRiwgMHg3OUQwLCAweDc5RDMsIDB4NzlENCwgMHg3OUQ2LCAweDc5RDcsIDB4NzlEOSwKKyAgICAweDc5REEsIDB4NzlEQiwgMHg3OURDLCAweDc5REQsIDB4NzlERSwgMHg3OUUwLCAweDc5RTEsIDB4NzlFMiwgMHg3OUU1LAorICAgIDB4NzlFOCwgMHg3OUVBLCAweDc5RUMsIDB4NzlFRSwgMHg3OUYxLCAweDc5RjIsIDB4NzlGMywgMHg3OUY0LCAweDc5RjUsCisgICAgMHg3OUY2LCAweDc5RjcsIDB4NzlGOSwgMHg3OUZBLCAweDc5RkMsIDB4NzlGRSwgMHg3OUZGLCAweDdBMDEsIDB4N0EwNCwKKyAgICAweDdBMDUsIDB4N0EwNywgMHg3QTA4LCAweDdBMDksIDB4N0EwQSwgMHg3QTBDLCAweDdBMEYsIDB4N0ExMCwgMHg3QTExLAorICAgIDB4N0ExMiwgMHg3QTEzLCAweDdBMTUsIDB4N0ExNiwgMHg3QTE4LCAweDdBMTksIDB4N0ExQiwgMHg3QTFDLCAweDdBMUQsCisgICAgMHg3QTFGLCAweDdBMjEsIDB4N0EyMiwgMHg3QTI0LCAweDdBMjUsIDB4N0EyNiwgMHg3QTI3LCAweDdBMjgsIDB4N0EyOSwKKyAgICAweDdBMkEsIDB4N0EyQiwgMHg3QTJDLCAweDdBMkQsIDB4N0EyRiwgMHg3QTMwLCAweDdBMzIsIDB4N0EzNCwgMHg3QTM1LAorICAgIDB4N0EzNiwgMHg3QTM4LCAweDdBM0EsIDB4N0EzRSwgMHg3QTQxLCAweDdBNDIsIDB4N0E0MywgMHg3QTQ0LCAweDdBNDUsCisgICAgMHg3QTQ3LCAweDdBNDgsIDB4N0E0OSwgMHg3QTRBLCAweDdBNEIsIDB4N0E0RiwgMHg3QTUwLCAweDdBNTIsIDB4N0E1MywKKyAgICAweDdBNTQsIDB4N0E1NSwgMHg3QTU2LCAweDdBNTgsIDB4N0E1OSwgMHg3QTVBLCAweDdBNUIsIDB4N0E1QywgMHg3QTVELAorICAgIDB4N0E1RSwgMHg3QTVGLCAweDdBNjAsIDB4N0E2MywgMHg3QTY0LCAweDdBNjUsIDB4N0E2NiwgMHg3QTY3LCAweDdBNjgsCisgICAgMHg3QTZBLCAweDdBNkMsIDB4N0E2RCwgMHg3QTZFLCAweDdBNkYsIDB4N0E3MSwgMHg3QTcyLCAweDdBNzMsIDB4N0E3NSwKKyAgICAweDdBN0IsIDB4N0E3QywgMHg3QTdELCAweDdBN0UsIDB4N0E4MiwgMHg3QTg1LCAweDdBODcsIDB4N0E4OSwgMHg3QThBLAorICAgIDB4N0E4QiwgMHg3QThDLCAweDdBOEUsIDB4N0E4RiwgMHg3QTkwLCAweDdBOTMsIDB4N0E5NCwgMHg3QTk5LCAweDdBOUEsCisgICAgMHg3QTlCLCAweDdBOUUsIDB4N0FBMSwgMHg3QUEyLCAweDdBQTMsIDB4N0FBNCwgMHg3QUE3LCAweDdBQUIsIDB4N0FBRiwKKyAgICAweDdBQjAsIDB4N0FCMSwgMHg3QUIyLCAweDdBQjQsIDB4N0FCNSwgMHg3QUI3LCAweDdBQjgsIDB4N0FCOSwgMHg3QUJCLAorICAgIDB4N0FCQywgMHg3QUJELCAweDdBQkUsIDB4N0FDMCwgMHg3QUMxLCAweDdBQzIsIDB4N0FDMywgMHg3QUM2LCAweDdBQzksCisgICAgMHg3QUNDLCAweDdBQ0QsIDB4N0FDRSwgMHg3QUNGLCAweDdBRDAsIDB4N0FEMSwgMHg3QUQyLCAweDdBRDMsIDB4N0FENCwKKyAgICAweDdBRDUsIDB4N0FENywgMHg3QUQ4LCAweDdBREEsIDB4N0FEQiwgMHg3QURDLCAweDdBREQsIDB4N0FFMSwgMHg3QUUyLAorICAgIDB4N0FFNCwgMHg3QUU3LCAweDdBRTgsIDB4N0FFOSwgMHg3QUVCLCAweDdBRUMsIDB4N0FFRSwgMHg3QUYwLCAweDdBRjEsCisgICAgMHg3QUYyLCAweDdBRjMsIDB4N0FGNCwgMHg3QUY1LCAweDdBRjcsIDB4N0FGOCwgMHg3QUZCLCAweDdBRkMsIDB4N0FGRSwKKyAgICAweDdCMDAsIDB4N0IwMSwgMHg3QjAyLCAweDdCMDUsIDB4N0IwNywgMHg3QjA5LCAweDdCMEMsIDB4N0IwRCwgMHg3QjBFLAorICAgIDB4N0IxMCwgMHg3QjEyLCAweDdCMTMsIDB4N0IxNiwgMHg3QjE3LCAweDdCMTgsIDB4N0IxQSwgMHg3QjFDLCAweDdCMUQsCisgICAgMHg3QjFGLCAweDdCMjEsIDB4N0IyMiwgMHg3QjIzLCAweDdCMjcsIDB4N0IyOSwgMHg3QjJELCAweDdCMkYsIDB4N0IzMCwKKyAgICAweDdCMzIsIDB4N0IzNCwgMHg3QjM1LCAweDdCMzYsIDB4N0IzNywgMHg3QjM5LCAweDdCM0IsIDB4N0IzRCwgMHg3QjNGLAorICAgIDB4N0I0MCwgMHg3QjQxLCAweDdCNDIsIDB4N0I0MywgMHg3QjQ0LCAweDdCNDgsIDB4N0I0QSwgMHg3QjRELCAweDdCNEUsCisgICAgMHg3QjUzLCAweDdCNTUsIDB4N0I1NywgMHg3QjU5LCAweDdCNUMsIDB4N0I1RSwgMHg3QjVGLCAweDdCNjEsIDB4N0I2MywKKyAgICAweDdCNjQsIDB4N0I2NSwgMHg3QjY2LCAweDdCNjgsIDB4N0I2OSwgMHg3QjZBLCAweDdCNkIsIDB4N0I2QywgMHg3QjZELAorICAgIDB4N0I2RiwgMHg3QjcwLCAweDdCNzMsIDB4N0I3NCwgMHg3Qjc2LCAweDdCNzgsIDB4N0I3QSwgMHg3QjdDLCAweDdCN0QsCisgICAgMHg3QjdGLCAweDdCODEsIDB4N0I4MiwgMHg3QjgzLCAweDdCODQsIDB4N0I4NiwgMHg3Qjg3LCAweDdCODgsIDB4N0I4OSwKKyAgICAweDdCOEEsIDB4N0I4QywgMHg3QjhFLCAweDdCOEYsIDB4N0I5MSwgMHg3QjkyLCAweDdCOTMsIDB4N0I5NiwgMHg3Qjk4LAorICAgIDB4N0I5OSwgMHg3QjlBLCAweDdCOUIsIDB4N0I5RSwgMHg3QjlGLCAweDdCQTAsIDB4N0JBMywgMHg3QkE0LCAweDdCQTUsCisgICAgMHg3QkFFLCAweDdCQUYsIDB4N0JCMCwgMHg3QkIyLCAweDdCQjMsIDB4N0JCNSwgMHg3QkI2LCAweDdCQjcsIDB4N0JCOSwKKyAgICAweDdCQkEsIDB4N0JCQiwgMHg3QkJDLCAweDdCQkQsIDB4N0JCRSwgMHg3QkJGLCAweDdCQzIsIDB4N0JDMywgMHg3QkM1LAorICAgIDB4N0JDOCwgMHg3QkNBLCAweDdCQ0QsIDB4N0JDRSwgMHg3QkNGLCAweDdCRDAsIDB4N0JEMiwgMHg3QkQ0LCAweDdCRDUsCisgICAgMHg3QkQ2LCAweDdCRDcsIDB4N0JEOCwgMHg3QkRCLCAweDdCREMsIDB4N0JERSwgMHg3QkRGLCAweDdCRTAsIDB4N0JFMiwKKyAgICAweDdCRTMsIDB4N0JFNywgMHg3QkU4LCAweDdCRUIsIDB4N0JFQywgMHg3QkVELCAweDdCRUYsIDB4N0JGMCwgMHg3QkYyLAorICAgIDB4N0JGNCwgMHg3QkY1LCAweDdCRjYsIDB4N0JGOCwgMHg3QkY5LCAweDdCRkEsIDB4N0JGQiwgMHg3QkZELCAweDdCRkYsCisgICAgMHg3QzAxLCAweDdDMDIsIDB4N0MwMywgMHg3QzA0LCAweDdDMDUsIDB4N0MwNiwgMHg3QzA4LCAweDdDMDksIDB4N0MwQSwKKyAgICAweDdDMEUsIDB4N0MxMCwgMHg3QzExLCAweDdDMTIsIDB4N0MxMywgMHg3QzE0LCAweDdDMTUsIDB4N0MxNywgMHg3QzE4LAorICAgIDB4N0MxOSwgMHg3QzFBLCAweDdDMUIsIDB4N0MxQywgMHg3QzFELCAweDdDMjAsIDB4N0MyMiwgMHg3QzI0LCAweDdDMjUsCisgICAgMHg3QzI4LCAweDdDMjksIDB4N0MyQywgMHg3QzJELCAweDdDMkUsIDB4N0MyRiwgMHg3QzMwLCAweDdDMzEsIDB4N0MzMiwKKyAgICAweDdDMzMsIDB4N0MzNCwgMHg3QzM1LCAweDdDMzYsIDB4N0MzNywgMHg3QzM5LCAweDdDM0EsIDB4N0MzQiwgMHg3QzNDLAorICAgIDB4N0M0MiwgMHg3QzQ0LCAweDdDNDUsIDB4N0M0NiwgMHg3QzQ3LCAweDdDNDgsIDB4N0M0OSwgMHg3QzRBLCAweDdDNEIsCisgICAgMHg3QzRFLCAweDdDNEYsIDB4N0M1MCwgMHg3QzUxLCAweDdDNTIsIDB4N0M1MywgMHg3QzU0LCAweDdDNTUsIDB4N0M1NiwKKyAgICAweDdDNTcsIDB4N0M1OCwgMHg3QzU5LCAweDdDNUEsIDB4N0M1QiwgMHg3QzVELCAweDdDNUUsIDB4N0M2MSwgMHg3QzYyLAorICAgIDB4N0M2MywgMHg3QzY1LCAweDdDNjYsIDB4N0M2NywgMHg3QzY4LCAweDdDNkIsIDB4N0M2RCwgMHg3QzZGLCAweDdDNzAsCisgICAgMHg3QzcxLCAweDdDNzUsIDB4N0M3NiwgMHg3Qzc3LCAweDdDNzgsIDB4N0M3OSwgMHg3QzdBLCAweDdDN0UsIDB4N0M3RiwKKyAgICAweDdDODAsIDB4N0M4MSwgMHg3QzgyLCAweDdDODMsIDB4N0M4NCwgMHg3Qzg1LCAweDdDODYsIDB4N0M4NywgMHg3Qzg4LAorICAgIDB4N0M4QSwgMHg3QzhCLCAweDdDOEMsIDB4N0M4RCwgMHg3QzhFLCAweDdDOEYsIDB4N0M5MCwgMHg3QzkzLCAweDdDOTQsCisgICAgMHg3Qzk2LCAweDdDOTksIDB4N0M5QSwgMHg3QzlCLCAweDdDQTAsIDB4N0NBMSwgMHg3Q0EzLCAweDdDQTYsIDB4N0NBNywKKyAgICAweDdDQTgsIDB4N0NBOSwgMHg3Q0FCLCAweDdDQUMsIDB4N0NBRCwgMHg3Q0FGLCAweDdDQjAsIDB4N0NCNCwgMHg3Q0I1LAorICAgIDB4N0NCNiwgMHg3Q0I3LCAweDdDQjgsIDB4N0NCQSwgMHg3Q0JCLCAweDdDQkYsIDB4N0NDMCwgMHg3Q0MyLCAweDdDQzMsCisgICAgMHg3Q0M0LCAweDdDQzYsIDB4N0NDOSwgMHg3Q0NCLCAweDdDQ0UsIDB4N0NDRiwgMHg3Q0QwLCAweDdDRDEsIDB4N0NEMiwKKyAgICAweDdDRDMsIDB4N0NENCwgMHg3Q0Q4LCAweDdDREEsIDB4N0NEQiwgMHg3Q0UxLCAweDdDRTIsIDB4N0NFMywgMHg3Q0U0LAorICAgIDB4N0NFNSwgMHg3Q0U2LCAweDdDRTksIDB4N0NFQSwgMHg3Q0VCLCAweDdDRUMsIDB4N0NFRCwgMHg3Q0VFLCAweDdDRjEsCisgICAgMHg3Q0YzLCAweDdDRjUsIDB4N0NGNywgMHg3Q0ZBLCAweDdDRkMsIDB4N0NGRCwgMHg3Q0ZGLCAweDdEMDEsIDB4N0QwMywKKyAgICAweDdEMEMsIDB4N0QwRSwgMHg3RDBGLCAweDdEMTEsIDB4N0QxMiwgMHg3RDE2LCAweDdEMTgsIDB4N0QxRCwgMHg3RDFFLAorICAgIDB4N0QxRiwgMHg3RDIzLCAweDdEMjQsIDB4N0QyNSwgMHg3RDI2LCAweDdEMjgsIDB4N0QyOSwgMHg3RDJBLCAweDdEMkMsCisgICAgMHg3RDJELCAweDdEMkUsIDB4N0QzNCwgMHg3RDM1LCAweDdEMzYsIDB4N0QzNywgMHg3RDM4LCAweDdEM0IsIDB4N0QzRCwKKyAgICAweDdEM0UsIDB4N0Q0MSwgMHg3RDQzLCAweDdENDUsIDB4N0Q0NywgMHg3RDQ4LCAweDdENDksIDB4N0Q0QSwgMHg3RDRCLAorICAgIDB4N0Q0QywgMHg3RDRELCAweDdENEYsIDB4N0Q1MSwgMHg3RDUyLCAweDdENTMsIDB4N0Q1NCwgMHg3RDU1LCAweDdENTYsCisgICAgMHg3RDU3LCAweDdENTgsIDB4N0Q1OSwgMHg3RDVBLCAweDdENUIsIDB4N0Q1QywgMHg3RDVGLCAweDdENjAsIDB4N0Q2MywKKyAgICAweDdENjQsIDB4N0Q2NSwgMHg3RDY3LCAweDdENjksIDB4N0Q2QSwgMHg3RDZCLCAweDdENkMsIDB4N0Q2RCwgMHg3RDZGLAorICAgIDB4N0Q3MCwgMHg3RDc0LCAweDdENzUsIDB4N0Q3OCwgMHg3RDdBLCAweDdEN0IsIDB4N0Q3QywgMHg3RDdELCAweDdEN0UsCisgICAgMHg3RDdGLCAweDdEODAsIDB4N0Q4MiwgMHg3RDg0LCAweDdEODUsIDB4N0Q4NywgMHg3RDhBLCAweDdEOEIsIDB4N0Q4QywKKyAgICAweDdEOEQsIDB4N0Q4RSwgMHg3RDkwLCAweDdEOTEsIDB4N0Q5MiwgMHg3RDk0LCAweDdEOTUsIDB4N0Q5NiwgMHg3RDk3LAorICAgIDB4N0Q5OCwgMHg3RDk5LCAweDdEOUEsIDB4N0Q5QiwgMHg3RDlELCAweDdEOUYsIDB4N0RBMCwgMHg3REExLCAweDdEQTQsCisgICAgMHg3REE1LCAweDdEQTcsIDB4N0RBOCwgMHg3REE5LCAweDdEQUEsIDB4N0RBRiwgMHg3REI1LCAweDdEQjYsIDB4N0RCNywKKyAgICAweDdEQkMsIDB4N0RDMCwgMHg3REMxLCAweDdEQzIsIDB4N0RDMywgMHg3REM1LCAweDdEQzYsIDB4N0RDOCwgMHg3REM5LAorICAgIDB4N0RDQywgMHg3RENELCAweDdEQ0UsIDB4N0RDRiwgMHg3REQwLCAweDdERDMsIDB4N0RENSwgMHg3REQ2LCAweDdEREEsCisgICAgMHg3RERCLCAweDdEREMsIDB4N0RERiwgMHg3REUyLCAweDdERTQsIDB4N0RFNSwgMHg3REU3LCAweDdERUEsIDB4N0RFQiwKKyAgICAweDdERUQsIDB4N0RFRSwgMHg3REYwLCAweDdERjMsIDB4N0RGNSwgMHg3REY3LCAweDdERjgsIDB4N0RGQSwgMHg3REZDLAorICAgIDB4N0RGRCwgMHg3REZFLCAweDdERkYsIDB4N0UwMCwgMHg3RTAxLCAweDdFMDIsIDB4N0UwMywgMHg3RTA0LCAweDdFMDUsCisgICAgMHg3RTA2LCAweDdFMDcsIDB4N0UwQywgMHg3RTBELCAweDdFMEUsIDB4N0UwRiwgMHg3RTEyLCAweDdFMTMsIDB4N0UxNCwKKyAgICAweDdFMTUsIDB4N0UxNiwgMHg3RTE3LCAweDdFMTgsIDB4N0UxOSwgMHg3RTFBLCAweDdFMUMsIDB4N0UyMCwgMHg3RTIxLAorICAgIDB4N0UyMiwgMHg3RTI0LCAweDdFMjUsIDB4N0UyNiwgMHg3RTI4LCAweDdFMjksIDB4N0UyQSwgMHg3RTJDLCAweDdFMkYsCisgICAgMHg3RTMwLCAweDdFMzMsIDB4N0UzOCwgMHg3RTNBLCAweDdFM0MsIDB4N0UzRiwgMHg3RTQwLCAweDdFNDIsIDB4N0U0MywKKyAgICAweDdFNDQsIDB4N0U0OCwgMHg3RTQ5LCAweDdFNEEsIDB4N0U0QiwgMHg3RTRDLCAweDdFNEQsIDB4N0U0RSwgMHg3RTRGLAorICAgIDB4N0U1MCwgMHg3RTUxLCAweDdFNTMsIDB4N0U1NiwgMHg3RTU3LCAweDdFNTgsIDB4N0U1OSwgMHg3RTVCLCAweDdFNUMsCisgICAgMHg3RTVELCAweDdFNUYsIDB4N0U2MCwgMHg3RTYxLCAweDdFNjMsIDB4N0U2NCwgMHg3RTY1LCAweDdFNjYsIDB4N0U2NywKKyAgICAweDdFNjgsIDB4N0U2QywgMHg3RTcxLCAweDdFNzIsIDB4N0U3NCwgMHg3RTc1LCAweDdFNzYsIDB4N0U3NywgMHg3RTc4LAorICAgIDB4N0U3QSwgMHg3RTdCLCAweDdFN0YsIDB4N0U4MCwgMHg3RTgxLCAweDdFODMsIDB4N0U4NCwgMHg3RTg1LCAweDdFODYsCisgICAgMHg3RTg3LCAweDdFODksIDB4N0U4QiwgMHg3RThFLCAweDdFOTAsIDB4N0U5MSwgMHg3RTkyLCAweDdFOTUsIDB4N0U5NywKKyAgICAweDdFOTksIDB4N0U5QSwgMHg3RTlELCAweDdFOUUsIDB4N0VBRSwgMHg3RUI0LCAweDdFQkIsIDB4N0VCQywgMHg3RUQ2LAorICAgIDB4N0VFNCwgMHg3RUVDLCAweDdFRjksIDB4N0YwQSwgMHg3RjEwLCAweDdGMUUsIDB4N0YzNywgMHg3RjM5LCAweDdGM0IsCisgICAgMHg3RjNDLCAweDdGM0QsIDB4N0YzRSwgMHg3RjNGLCAweDdGNDAsIDB4N0Y0MSwgMHg3RjQzLCAweDdGNDYsIDB4N0Y0NywKKyAgICAweDdGNDgsIDB4N0Y0OSwgMHg3RjRBLCAweDdGNEIsIDB4N0Y0RCwgMHg3RjRGLCAweDdGNTIsIDB4N0Y1MywgMHg3RjU2LAorICAgIDB4N0Y1OSwgMHg3RjVCLCAweDdGNUMsIDB4N0Y1RCwgMHg3RjVFLCAweDdGNjAsIDB4N0Y2MywgMHg3RjY0LCAweDdGNjUsCisgICAgMHg3RjY2LCAweDdGNjcsIDB4N0Y2QiwgMHg3RjZDLCAweDdGNkQsIDB4N0Y2RiwgMHg3RjczLCAweDdGNzUsIDB4N0Y3NiwKKyAgICAweDdGNzgsIDB4N0Y3QSwgMHg3RjdCLCAweDdGN0MsIDB4N0Y3RCwgMHg3RjdGLCAweDdGODAsIDB4N0Y4MiwgMHg3RjgzLAorICAgIDB4N0Y4NCwgMHg3Rjg3LCAweDdGODksIDB4N0Y4QiwgMHg3RjhELCAweDdGOEYsIDB4N0Y5MCwgMHg3RjkxLCAweDdGOTIsCisgICAgMHg3RjkzLCAweDdGOTUsIDB4N0Y5NiwgMHg3Rjk3LCAweDdGOTgsIDB4N0Y5OSwgMHg3RjlCLCAweDdGOUMsIDB4N0ZBMCwKKyAgICAweDdGQTIsIDB4N0ZBMywgMHg3RkE2LCAweDdGQTgsIDB4N0ZBQSwgMHg3RkFCLCAweDdGQUMsIDB4N0ZBRCwgMHg3RkFFLAorICAgIDB4N0ZCMSwgMHg3RkIzLCAweDdGQjQsIDB4N0ZCNSwgMHg3RkI2LCAweDdGQjcsIDB4N0ZCQSwgMHg3RkJCLCAweDdGQkUsCisgICAgMHg3RkMwLCAweDdGQzIsIDB4N0ZDMywgMHg3RkM0LCAweDdGQzYsIDB4N0ZDNywgMHg3RkM4LCAweDdGQzksIDB4N0ZDQiwKKyAgICAweDdGQ0QsIDB4N0ZDRiwgMHg3RkQwLCAweDdGRDEsIDB4N0ZEMywgMHg3RkQ2LCAweDdGRDcsIDB4N0ZEOSwgMHg3RkRBLAorICAgIDB4N0ZEQiwgMHg3RkRDLCAweDdGREQsIDB4N0ZERSwgMHg3RkUyLCAweDdGRTMsIDB4N0ZFNCwgMHg3RkU3LCAweDdGRTgsCisgICAgMHg3RkVBLCAweDdGRUIsIDB4N0ZFQywgMHg3RkVELCAweDdGRUYsIDB4N0ZGMiwgMHg3RkY0LCAweDdGRjUsIDB4N0ZGNiwKKyAgICAweDdGRjcsIDB4N0ZGOCwgMHg3RkZBLCAweDdGRkQsIDB4N0ZGRSwgMHg3RkZGLCAweDgwMDIsIDB4ODAwNywgMHg4MDA4LAorICAgIDB4ODAwOSwgMHg4MDBBLCAweDgwMEUsIDB4ODAwRiwgMHg4MDExLCAweDgwMTMsIDB4ODAxQSwgMHg4MDFCLCAweDgwMUQsCisgICAgMHg4MDFFLCAweDgwMUYsIDB4ODAyMSwgMHg4MDIzLCAweDgwMjQsIDB4ODAyQiwgMHg4MDJELCAweDgwMkYsIDB4ODAzMCwKKyAgICAweDgwMzIsIDB4ODAzNCwgMHg4MDM5LCAweDgwM0EsIDB4ODAzQywgMHg4MDNFLCAweDgwNDAsIDB4ODA0MSwgMHg4MDQ0LAorICAgIDB4ODA0NSwgMHg4MDQ3LCAweDgwNDgsIDB4ODA0OSwgMHg4MDRFLCAweDgwNEYsIDB4ODA1MCwgMHg4MDUxLCAweDgwNTMsCisgICAgMHg4MDU1LCAweDgwNTcsIDB4ODA1OSwgMHg4MDVCLCAweDgwNUMsIDB4ODA1RCwgMHg4MDVGLCAweDgwNjAsIDB4ODA2MSwKKyAgICAweDgwNjIsIDB4ODA2MywgMHg4MDY0LCAweDgwNjUsIDB4ODA2NiwgMHg4MDY3LCAweDgwNjgsIDB4ODA2QiwgMHg4MDZDLAorICAgIDB4ODA2RCwgMHg4MDZFLCAweDgwNzQsIDB4ODA3OCwgMHg4MDdBLCAweDgwN0IsIDB4ODA3QywgMHg4MDgxLCAweDgwODIsCisgICAgMHg4MDg4LCAweDgwOEEsIDB4ODA4RCwgMHg4MDhFLCAweDgwOEYsIDB4ODA5MCwgMHg4MDkxLCAweDgwOTIsIDB4ODA5NCwKKyAgICAweDgwOTUsIDB4ODA5NywgMHg4MDk5LCAweDgwOUUsIDB4ODBBMywgMHg4MEE2LCAweDgwQTcsIDB4ODBBOCwgMHg4MEFDLAorICAgIDB4ODBCMCwgMHg4MEIzLCAweDgwQjUsIDB4ODBCNiwgMHg4MEI4LCAweDgwQjksIDB4ODBCQiwgMHg4MEM1LCAweDgwQzcsCisgICAgMHg4MEM4LCAweDgwQzksIDB4ODBDQSwgMHg4MENCLCAweDgwQ0YsIDB4ODBEMCwgMHg4MEQxLCAweDgwRDIsIDB4ODBEMywKKyAgICAweDgwRDQsIDB4ODBENSwgMHg4MEQ4LCAweDgwREYsIDB4ODBFMCwgMHg4MEUyLCAweDgwRTMsIDB4ODBFNiwgMHg4MEVFLAorICAgIDB4ODBGNSwgMHg4MEY3LCAweDgwRjksIDB4ODBGQiwgMHg4MEZFLCAweDgwRkYsIDB4ODEwMCwgMHg4MTAxLCAweDgxMDMsCisgICAgMHg4MTA0LCAweDgxMDcsIDB4ODEwOCwgMHg4MTBCLCAweDgxMEMsIDB4ODExNSwgMHg4MTE3LCAweDgxMTksIDB4ODExQywKKyAgICAweDgxMUQsIDB4ODExRiwgMHg4MTIwLCAweDgxMjEsIDB4ODEyMiwgMHg4MTIzLCAweDgxMjQsIDB4ODEyNSwgMHg4MTI2LAorICAgIDB4ODEyNywgMHg4MTI4LCAweDgxMjksIDB4ODEyQSwgMHg4MTJCLCAweDgxMkQsIDB4ODEyRSwgMHg4MTMwLCAweDgxMzMsCisgICAgMHg4MTM0LCAweDgxMzUsIDB4ODEzNywgMHg4MTNBLCAweDgxM0IsIDB4ODEzQywgMHg4MTNELCAweDgxM0YsIDB4ODE0MCwKKyAgICAweDgxNDEsIDB4ODE0MiwgMHg4MTQzLCAweDgxNDQsIDB4ODE0NSwgMHg4MTQ3LCAweDgxNDksIDB4ODE0RCwgMHg4MTRGLAorICAgIDB4ODE1MiwgMHg4MTU3LCAweDgxNTgsIDB4ODE1QiwgMHg4MTVDLCAweDgxNUQsIDB4ODE1RSwgMHg4MTVGLCAweDgxNjIsCisgICAgMHg4MTYzLCAweDgxNjQsIDB4ODE2OCwgMHg4MTZBLCAweDgxNkMsIDB4ODE2RiwgMHg4MTcyLCAweDgxNzMsIDB4ODE3NSwKKyAgICAweDgxNzYsIDB4ODE3NywgMHg4MTgxLCAweDgxODMsIDB4ODE4NCwgMHg4MTg1LCAweDgxODYsIDB4ODE4NywgMHg4MTg5LAorICAgIDB4ODE4QiwgMHg4MThDLCAweDgxOEQsIDB4ODE4RSwgMHg4MTkwLCAweDgxOTIsIDB4ODE5MywgMHg4MTk0LCAweDgxOTUsCisgICAgMHg4MTk2LCAweDgxOTcsIDB4ODE5OSwgMHg4MTlFLCAweDgxOUYsIDB4ODFBMSwgMHg4MUEyLCAweDgxQTQsIDB4ODFBNSwKKyAgICAweDgxQTcsIDB4ODFBQiwgMHg4MUFDLCAweDgxQUQsIDB4ODFBRSwgMHg4MUFGLCAweDgxQjAsIDB4ODFCMSwgMHg4MUIyLAorICAgIDB4ODFCNCwgMHg4MUI1LCAweDgxQjYsIDB4ODFCNywgMHg4MUI4LCAweDgxQjksIDB4ODFCQywgMHg4MUM0LCAweDgxQzUsCisgICAgMHg4MUM3LCAweDgxQzgsIDB4ODFDQiwgMHg4MUNFLCAweDgxRDAsIDB4ODFEMSwgMHg4MUQyLCAweDgxRDMsIDB4ODFENCwKKyAgICAweDgxRDUsIDB4ODFENiwgMHg4MUQ3LCAweDgxRDksIDB4ODFEQiwgMHg4MURDLCAweDgxREQsIDB4ODFERSwgMHg4MUUxLAorICAgIDB4ODFFMiwgMHg4MUU0LCAweDgxRTUsIDB4ODFFNiwgMHg4MUU5LCAweDgxRUIsIDB4ODFFRSwgMHg4MUVGLCAweDgxRjAsCisgICAgMHg4MUYxLCAweDgxRjIsIDB4ODFGNSwgMHg4MUY2LCAweDgxRjcsIDB4ODFGOCwgMHg4MUY5LCAweDgxRkQsIDB4ODFGRiwKKyAgICAweDgyMDMsIDB4ODIwQiwgMHg4MjBFLCAweDgyMEYsIDB4ODIxMSwgMHg4MjEzLCAweDgyMTUsIDB4ODIxNiwgMHg4MjE3LAorICAgIDB4ODIxOCwgMHg4MjE5LCAweDgyMUEsIDB4ODIxRCwgMHg4MjIwLCAweDgyMjQsIDB4ODIyNSwgMHg4MjI2LCAweDgyMjcsCisgICAgMHg4MjI5LCAweDgyMkUsIDB4ODIzMiwgMHg4MjNBLCAweDgyM0MsIDB4ODIzRCwgMHg4MjNGLCAweDgyNDAsIDB4ODI0MSwKKyAgICAweDgyNDIsIDB4ODI0MywgMHg4MjQ1LCAweDgyNDYsIDB4ODI0OCwgMHg4MjRBLCAweDgyNEMsIDB4ODI0RCwgMHg4MjRFLAorICAgIDB4ODI1MCwgMHg4MjUxLCAweDgyNTIsIDB4ODI1MywgMHg4MjU0LCAweDgyNTUsIDB4ODI1NiwgMHg4MjU3LCAweDgyNUIsCisgICAgMHg4MjVDLCAweDgyNUQsIDB4ODI1RSwgMHg4MjYwLCAweDgyNjEsIDB4ODI2MiwgMHg4MjYzLCAweDgyNjUsIDB4ODI2NywKKyAgICAweDgyNjksIDB4ODI2QSwgMHg4MjZDLCAweDgyNkQsIDB4ODI3NSwgMHg4Mjc2LCAweDgyNzgsIDB4ODI3QiwgMHg4MjdDLAorICAgIDB4ODI4MCwgMHg4MjgxLCAweDgyODMsIDB4ODI4NSwgMHg4Mjg2LCAweDgyODcsIDB4ODI4OSwgMHg4MjhDLCAweDgyOTAsCisgICAgMHg4MjkzLCAweDgyOTQsIDB4ODI5NSwgMHg4Mjk2LCAweDgyOUEsIDB4ODI5QiwgMHg4MjlFLCAweDgyQTAsIDB4ODJBMiwKKyAgICAweDgyQTMsIDB4ODJBNywgMHg4MkIyLCAweDgyQjUsIDB4ODJCNiwgMHg4MkJBLCAweDgyQkMsIDB4ODJCRiwgMHg4MkMwLAorICAgIDB4ODJDMiwgMHg4MkMzLCAweDgyQzUsIDB4ODJDNiwgMHg4MkM5LCAweDgyRDAsIDB4ODJENiwgMHg4MkQ5LCAweDgyREEsCisgICAgMHg4MkRELCAweDgyRTIsIDB4ODJFOCwgMHg4MkU5LCAweDgyRUEsIDB4ODJFQywgMHg4MkVELCAweDgyRUUsIDB4ODJGMCwKKyAgICAweDgyRjIsIDB4ODJGMywgMHg4MkY1LCAweDgyRjYsIDB4ODJGOCwgMHg4MkZBLCAweDgyRkMsIDB4ODJGRCwgMHg4MkZFLAorICAgIDB4ODJGRiwgMHg4MzAwLCAweDgzMEEsIDB4ODMwQiwgMHg4MzBELCAweDgzMTAsIDB4ODMxMiwgMHg4MzEzLCAweDgzMTYsCisgICAgMHg4MzE4LCAweDgzMTksIDB4ODMxRCwgMHg4MzFFLCAweDgzMUYsIDB4ODMyMCwgMHg4MzIxLCAweDgzMjIsIDB4ODMyMywKKyAgICAweDgzMjQsIDB4ODMyNSwgMHg4MzI2LCAweDgzMjksIDB4ODMyQSwgMHg4MzJFLCAweDgzMzAsIDB4ODMzMiwgMHg4MzM3LAorICAgIDB4ODMzQiwgMHg4MzNELCAweDgzM0UsIDB4ODMzRiwgMHg4MzQxLCAweDgzNDIsIDB4ODM0NCwgMHg4MzQ1LCAweDgzNDgsCisgICAgMHg4MzRBLCAweDgzNEIsIDB4ODM0QywgMHg4MzRELCAweDgzNEUsIDB4ODM1MywgMHg4MzU1LCAweDgzNTYsIDB4ODM1NywKKyAgICAweDgzNTgsIDB4ODM1OSwgMHg4MzVELCAweDgzNjIsIDB4ODM3MCwgMHg4MzcxLCAweDgzNzIsIDB4ODM3MywgMHg4Mzc0LAorICAgIDB4ODM3NSwgMHg4Mzc2LCAweDgzNzksIDB4ODM3QSwgMHg4MzdFLCAweDgzN0YsIDB4ODM4MCwgMHg4MzgxLCAweDgzODIsCisgICAgMHg4MzgzLCAweDgzODQsIDB4ODM4NywgMHg4Mzg4LCAweDgzOEIsIDB4ODM4QywgMHg4MzhELCAweDgzOEYsIDB4ODM5MCwKKyAgICAweDgzOTEsIDB4ODM5NCwgMHg4Mzk1LCAweDgzOTcsIDB4ODM5OSwgMHg4MzlBLCAweDgzOUQsIDB4ODM5RiwgMHg4M0ExLAorICAgIDB4ODNBMywgMHg4M0E0LCAweDgzQTUsIDB4ODNBNiwgMHg4M0FDLCAweDgzQUQsIDB4ODNBRSwgMHg4M0FGLCAweDgzQjUsCisgICAgMHg4M0JCLCAweDgzQkUsIDB4ODNCRiwgMHg4M0MyLCAweDgzQzMsIDB4ODNDNCwgMHg4M0M2LCAweDgzQzgsIDB4ODNDOSwKKyAgICAweDgzQ0IsIDB4ODNDRCwgMHg4M0NFLCAweDgzRDAsIDB4ODNEMSwgMHg4M0QyLCAweDgzRDMsIDB4ODNENSwgMHg4M0Q3LAorICAgIDB4ODNEOSwgMHg4M0RBLCAweDgzREIsIDB4ODNERSwgMHg4M0UyLCAweDgzRTMsIDB4ODNFNCwgMHg4M0U2LCAweDgzRTcsCisgICAgMHg4M0U4LCAweDgzRUIsIDB4ODNFQywgMHg4M0VELCAweDgzRUUsIDB4ODNGMywgMHg4M0Y0LCAweDgzRjUsIDB4ODNGNiwKKyAgICAweDgzRjcsIDB4ODNGQSwgMHg4M0ZCLCAweDgzRkMsIDB4ODNGRSwgMHg4M0ZGLCAweDg0MDAsIDB4ODQwMiwgMHg4NDA1LAorICAgIDB4ODQwOCwgMHg4NDA5LCAweDg0MTAsIDB4ODQxMiwgMHg4NDEzLCAweDg0MTQsIDB4ODQxNSwgMHg4NDE2LCAweDg0MTcsCisgICAgMHg4NDE5LCAweDg0MUEsIDB4ODQxQiwgMHg4NDFFLCAweDg0MUYsIDB4ODQyMCwgMHg4NDIxLCAweDg0MjIsIDB4ODQyMywKKyAgICAweDg0MjksIDB4ODQyQSwgMHg4NDJCLCAweDg0MkQsIDB4ODQyRSwgMHg4NDJGLCAweDg0MzAsIDB4ODQzMiwgMHg4NDMzLAorICAgIDB4ODQzNCwgMHg4NDM2LCAweDg0MzcsIDB4ODQzOSwgMHg4NDNBLCAweDg0M0IsIDB4ODQzRSwgMHg4NDNGLCAweDg0NDAsCisgICAgMHg4NDQxLCAweDg0NDIsIDB4ODQ0MywgMHg4NDQ0LCAweDg0NDUsIDB4ODQ0NywgMHg4NDQ4LCAweDg0NEEsIDB4ODQ0QiwKKyAgICAweDg0NEMsIDB4ODQ0RCwgMHg4NDRFLCAweDg0NEYsIDB4ODQ1MCwgMHg4NDUzLCAweDg0NTQsIDB4ODQ1NSwgMHg4NDU2LAorICAgIDB4ODQ1OCwgMHg4NDVELCAweDg0NUUsIDB4ODQ1RiwgMHg4NDYwLCAweDg0NjIsIDB4ODQ2NSwgMHg4NDY3LCAweDg0NjgsCisgICAgMHg4NDZBLCAweDg0NkUsIDB4ODQ3MCwgMHg4NDcyLCAweDg0NzQsIDB4ODQ3OSwgMHg4NDdCLCAweDg0N0MsIDB4ODQ3RCwKKyAgICAweDg0N0UsIDB4ODQ3RiwgMHg4NDgwLCAweDg0ODEsIDB4ODQ4MywgMHg4NDg0LCAweDg0ODUsIDB4ODQ4NiwgMHg4NDhBLAorICAgIDB4ODQ4RCwgMHg4NDhGLCAweDg0OTAsIDB4ODQ5MSwgMHg4NDkyLCAweDg0OTUsIDB4ODQ5NiwgMHg4NDk4LCAweDg0OUEsCisgICAgMHg4NDlCLCAweDg0OUQsIDB4ODQ5RSwgMHg4NDlGLCAweDg0QTAsIDB4ODRBMiwgMHg4NEEzLCAweDg0QTQsIDB4ODRBNSwKKyAgICAweDg0QTYsIDB4ODRBNywgMHg4NEE4LCAweDg0QTksIDB4ODRBQSwgMHg4NEFCLCAweDg0QUMsIDB4ODRBRCwgMHg4NEFFLAorICAgIDB4ODRCMCwgMHg4NEIxLCAweDg0QjMsIDB4ODRCNSwgMHg4NEI2LCAweDg0QjcsIDB4ODRCQiwgMHg4NEJFLCAweDg0QzIsCisgICAgMHg4NEMzLCAweDg0QzUsIDB4ODRDNiwgMHg4NEM3LCAweDg0QzgsIDB4ODRDQywgMHg4NENFLCAweDg0Q0YsIDB4ODREMiwKKyAgICAweDg0RDQsIDB4ODRENSwgMHg4NEQ3LCAweDg0RDgsIDB4ODREOSwgMHg4NERBLCAweDg0REIsIDB4ODREQywgMHg4NERFLAorICAgIDB4ODRFMSwgMHg4NEUyLCAweDg0RTQsIDB4ODRFNywgMHg4NEU4LCAweDg0RTksIDB4ODRFQSwgMHg4NEVCLCAweDg0RUQsCisgICAgMHg4NEYxLCAweDg0RjIsIDB4ODRGMywgMHg4NEY0LCAweDg0RjUsIDB4ODRGNiwgMHg4NEY3LCAweDg0RjgsIDB4ODRGOSwKKyAgICAweDg0RkEsIDB4ODRGQiwgMHg4NEZFLCAweDg1MDAsIDB4ODUwMSwgMHg4NTAyLCAweDg1MDMsIDB4ODUwNCwgMHg4NTA1LAorICAgIDB4ODUwNiwgMHg4NTA3LCAweDg1MDgsIDB4ODUwOSwgMHg4NTBBLCAweDg1MEIsIDB4ODUwRCwgMHg4NTBFLCAweDg1MEYsCisgICAgMHg4NTEwLCAweDg1MTIsIDB4ODUxNSwgMHg4NTE2LCAweDg1MTgsIDB4ODUxOSwgMHg4NTFCLCAweDg1MUMsIDB4ODUxRCwKKyAgICAweDg1MjAsIDB4ODUyMiwgMHg4NTI0LCAweDg1MjUsIDB4ODUyNywgMHg4NTI4LCAweDg1MjksIDB4ODUyQSwgMHg4NTJFLAorICAgIDB4ODUyRiwgMHg4NTMwLCAweDg1MzEsIDB4ODUzMiwgMHg4NTMzLCAweDg1MzQsIDB4ODUzNSwgMHg4NTM2LCAweDg1M0UsCisgICAgMHg4NTNGLCAweDg1NDAsIDB4ODU0MiwgMHg4NTQ0LCAweDg1NDUsIDB4ODU0NywgMHg4NTRCLCAweDg1NEMsIDB4ODU0RCwKKyAgICAweDg1NEYsIDB4ODU1MCwgMHg4NTUxLCAweDg1NTQsIDB4ODU1NywgMHg4NTVBLCAweDg1NUIsIDB4ODU1QywgMHg4NTVELAorICAgIDB4ODU1RiwgMHg4NTYwLCAweDg1NjEsIDB4ODU2MywgMHg4NTY1LCAweDg1NjYsIDB4ODU2NywgMHg4NTZCLCAweDg1NkMsCisgICAgMHg4NTZFLCAweDg1NkYsIDB4ODU3MCwgMHg4NTcxLCAweDg1NzMsIDB4ODU3NSwgMHg4NTc2LCAweDg1NzgsIDB4ODU3QywKKyAgICAweDg1N0QsIDB4ODU3RiwgMHg4NTgwLCAweDg1ODEsIDB4ODU4MiwgMHg4NTgzLCAweDg1ODYsIDB4ODU4OSwgMHg4NThCLAorICAgIDB4ODU4RCwgMHg4NThFLCAweDg1OTAsIDB4ODU5MiwgMHg4NTkzLCAweDg1OTUsIDB4ODU5NiwgMHg4NTk3LCAweDg1OTgsCisgICAgMHg4NTk5LCAweDg1OUEsIDB4ODU5RCwgMHg4NTlFLCAweDg1QTAsIDB4ODVBMSwgMHg4NUEyLCAweDg1QTMsIDB4ODVBNSwKKyAgICAweDg1QTcsIDB4ODVBQiwgMHg4NUFDLCAweDg1QUQsIDB4ODVCMSwgMHg4NUIyLCAweDg1QjMsIDB4ODVCNCwgMHg4NUI1LAorICAgIDB4ODVCNiwgMHg4NUI4LCAweDg1QkIsIDB4ODVCQywgMHg4NUJELCAweDg1QkUsIDB4ODVCRiwgMHg4NUMwLCAweDg1QzIsCisgICAgMHg4NUMzLCAweDg1QzQsIDB4ODVDNSwgMHg4NUM2LCAweDg1QzcsIDB4ODVDOCwgMHg4NUNBLCAweDg1Q0IsIDB4ODVDQywKKyAgICAweDg1RDEsIDB4ODVEMiwgMHg4NUQ0LCAweDg1RDYsIDB4ODVENywgMHg4NUQ4LCAweDg1RDksIDB4ODVEQSwgMHg4NURCLAorICAgIDB4ODVERSwgMHg4NURGLCAweDg1RTAsIDB4ODVFMSwgMHg4NUUyLCAweDg1RTMsIDB4ODVFNiwgMHg4NUU3LCAweDg1RTgsCisgICAgMHg4NUVCLCAweDg1RUMsIDB4ODVFRCwgMHg4NUVFLCAweDg1RUYsIDB4ODVGMCwgMHg4NUYxLCAweDg1RjIsIDB4ODVGMywKKyAgICAweDg1RjUsIDB4ODVGNywgMHg4NUY4LCAweDg1RkMsIDB4ODVGRCwgMHg4NUZFLCAweDg2MDAsIDB4ODYwMSwgMHg4NjAyLAorICAgIDB4ODYwMywgMHg4NjA4LCAweDg2MDksIDB4ODYwQSwgMHg4NjBDLCAweDg2MEQsIDB4ODYwRSwgMHg4NjBGLCAweDg2MTAsCisgICAgMHg4NjEyLCAweDg2MTMsIDB4ODYxNCwgMHg4NjE1LCAweDg2MTcsIDB4ODYxOCwgMHg4NjE5LCAweDg2MUIsIDB4ODYxQywKKyAgICAweDg2MUQsIDB4ODYxRiwgMHg4NjIwLCAweDg2MjEsIDB4ODYyMywgMHg4NjI0LCAweDg2MjUsIDB4ODYyNiwgMHg4NjI4LAorICAgIDB4ODYyQSwgMHg4NjJCLCAweDg2MkMsIDB4ODYyRSwgMHg4NjJGLCAweDg2MzAsIDB4ODYzMSwgMHg4NjMyLCAweDg2MzMsCisgICAgMHg4NjM0LCAweDg2MzUsIDB4ODYzNiwgMHg4NjM3LCAweDg2MzksIDB4ODYzQiwgMHg4NjNELCAweDg2M0UsIDB4ODY0MCwKKyAgICAweDg2NDEsIDB4ODY0MiwgMHg4NjQzLCAweDg2NDQsIDB4ODY0NSwgMHg4NjQ2LCAweDg2NDcsIDB4ODY0OCwgMHg4NjQ5LAorICAgIDB4ODY0QSwgMHg4NjRCLCAweDg2NEMsIDB4ODY1MiwgMHg4NjUzLCAweDg2NTYsIDB4ODY1NywgMHg4NjU4LCAweDg2NTksCisgICAgMHg4NjVCLCAweDg2NUQsIDB4ODY2MCwgMHg4NjYxLCAweDg2NjMsIDB4ODY2NCwgMHg4NjY1LCAweDg2NjYsIDB4ODY2OCwKKyAgICAweDg2NjksIDB4ODY2QSwgMHg4NjZELCAweDg2NkYsIDB4ODY3MCwgMHg4NjcyLCAweDg2NzMsIDB4ODY3NCwgMHg4Njc1LAorICAgIDB4ODY3NiwgMHg4Njc3LCAweDg2NzgsIDB4ODY4MywgMHg4Njg0LCAweDg2ODUsIDB4ODY4NiwgMHg4Njg3LCAweDg2ODgsCisgICAgMHg4Njg5LCAweDg2OEUsIDB4ODY4RiwgMHg4NjkwLCAweDg2OTEsIDB4ODY5MiwgMHg4Njk0LCAweDg2OTYsIDB4ODY5NywKKyAgICAweDg2OTgsIDB4ODY5OSwgMHg4NjlBLCAweDg2OUIsIDB4ODY5RSwgMHg4NjlGLCAweDg2QTAsIDB4ODZBMSwgMHg4NkEyLAorICAgIDB4ODZBNSwgMHg4NkE2LCAweDg2QUIsIDB4ODZBRCwgMHg4NkFFLCAweDg2QjIsIDB4ODZCMywgMHg4NkI3LCAweDg2QjgsCisgICAgMHg4NkI5LCAweDg2QkIsIDB4ODZCQywgMHg4NkJELCAweDg2QkUsIDB4ODZCRiwgMHg4NkMxLCAweDg2QzIsIDB4ODZDMywKKyAgICAweDg2QzUsIDB4ODZDOCwgMHg4NkNDLCAweDg2Q0QsIDB4ODZEMiwgMHg4NkQzLCAweDg2RDUsIDB4ODZENiwgMHg4NkQ3LAorICAgIDB4ODZEQSwgMHg4NkRDLCAweDg2REQsIDB4ODZFMCwgMHg4NkUxLCAweDg2RTIsIDB4ODZFMywgMHg4NkU1LCAweDg2RTYsCisgICAgMHg4NkU3LCAweDg2RTgsIDB4ODZFQSwgMHg4NkVCLCAweDg2RUMsIDB4ODZFRiwgMHg4NkY1LCAweDg2RjYsIDB4ODZGNywKKyAgICAweDg2RkIsIDB4ODZGQywgMHg4NkZELCAweDg2RkYsIDB4ODcwMSwgMHg4NzA0LCAweDg3MDUsIDB4ODcwQiwgMHg4NzBDLAorICAgIDB4ODcwRSwgMHg4NzBGLCAweDg3MTAsIDB4ODcxMSwgMHg4NzE0LCAweDg3MTYsIDB4ODcxOSwgMHg4NzFCLCAweDg3MUQsCisgICAgMHg4NzFGLCAweDg3MjAsIDB4ODcyNCwgMHg4NzI2LCAweDg3MjcsIDB4ODcyOCwgMHg4NzJBLCAweDg3MkIsIDB4ODcyQywKKyAgICAweDg3MkQsIDB4ODcyRiwgMHg4NzMwLCAweDg3MzIsIDB4ODczMywgMHg4NzM1LCAweDg3MzYsIDB4ODczOCwgMHg4NzM5LAorICAgIDB4ODczQSwgMHg4NzNDLCAweDg3M0QsIDB4ODc0MCwgMHg4NzQxLCAweDg3NDIsIDB4ODc0MywgMHg4NzQ0LCAweDg3NDUsCisgICAgMHg4NzQ2LCAweDg3NEEsIDB4ODc0QiwgMHg4NzRELCAweDg3NEYsIDB4ODc1MCwgMHg4NzUxLCAweDg3NTIsIDB4ODc1NCwKKyAgICAweDg3NTYsIDB4ODc1OCwgMHg4NzVBLCAweDg3NUIsIDB4ODc1QywgMHg4NzVELCAweDg3NUUsIDB4ODc1RiwgMHg4NzYxLAorICAgIDB4ODc2MiwgMHg4NzY3LCAweDg3NjgsIDB4ODc2OSwgMHg4NzZBLCAweDg3NkIsIDB4ODc2QywgMHg4NzZELCAweDg3NkYsCisgICAgMHg4NzcxLCAweDg3NzIsIDB4ODc3MywgMHg4Nzc1LCAweDg3NzcsIDB4ODc3OSwgMHg4NzdBLCAweDg3N0YsIDB4ODc4MCwKKyAgICAweDg3ODEsIDB4ODc4NiwgMHg4Nzg3LCAweDg3ODksIDB4ODc4QSwgMHg4NzhDLCAweDg3OEUsIDB4ODc4RiwgMHg4NzkwLAorICAgIDB4ODc5MSwgMHg4NzkyLCAweDg3OTQsIDB4ODc5NSwgMHg4Nzk2LCAweDg3OTgsIDB4ODc5OSwgMHg4NzlBLCAweDg3OUIsCisgICAgMHg4NzlDLCAweDg3OUQsIDB4ODdBMCwgMHg4N0ExLCAweDg3QTMsIDB4ODdBNCwgMHg4N0E1LCAweDg3QTYsIDB4ODdBNywKKyAgICAweDg3QTksIDB4ODdBQSwgMHg4N0FFLCAweDg3QjAsIDB4ODdCMSwgMHg4N0IyLCAweDg3QjQsIDB4ODdCNiwgMHg4N0I3LAorICAgIDB4ODdCOCwgMHg4N0I5LCAweDg3QkMsIDB4ODdCRSwgMHg4N0JGLCAweDg3QzEsIDB4ODdDMiwgMHg4N0MzLCAweDg3QzUsCisgICAgMHg4N0M3LCAweDg3QzksIDB4ODdDQywgMHg4N0NELCAweDg3Q0YsIDB4ODdEMCwgMHg4N0Q0LCAweDg3RDUsIDB4ODdENiwKKyAgICAweDg3RDcsIDB4ODdEOCwgMHg4N0Q5LCAweDg3REEsIDB4ODdEQywgMHg4N0RELCAweDg3REUsIDB4ODdERiwgMHg4N0UxLAorICAgIDB4ODdFMiwgMHg4N0U0LCAweDg3RTYsIDB4ODdFNywgMHg4N0U4LCAweDg3RTksIDB4ODdFQiwgMHg4N0VELCAweDg3RjAsCisgICAgMHg4N0YxLCAweDg3RjMsIDB4ODdGNCwgMHg4N0Y1LCAweDg3RjcsIDB4ODdGOCwgMHg4N0ZBLCAweDg3RkMsIDB4ODdGRCwKKyAgICAweDg3RkYsIDB4ODgwMCwgMHg4ODAxLCAweDg4MDIsIDB4ODgwNCwgMHg4ODA3LCAweDg4MDgsIDB4ODgwOSwgMHg4ODBCLAorICAgIDB4ODgwQywgMHg4ODBELCAweDg4MEUsIDB4ODgwRiwgMHg4ODEyLCAweDg4MTQsIDB4ODgxNywgMHg4ODE4LCAweDg4MTksCisgICAgMHg4ODFBLCAweDg4MUMsIDB4ODgxRCwgMHg4ODFFLCAweDg4MjAsIDB4ODgyNCwgMHg4ODI1LCAweDg4MjYsIDB4ODgyNywKKyAgICAweDg4MjgsIDB4ODgyOSwgMHg4ODJBLCAweDg4MkIsIDB4ODgyQywgMHg4ODJELCAweDg4MkUsIDB4ODgyRiwgMHg4ODMwLAorICAgIDB4ODgzMywgMHg4ODM0LCAweDg4MzUsIDB4ODgzNywgMHg4ODM4LCAweDg4M0EsIDB4ODgzRCwgMHg4ODNFLCAweDg4M0YsCisgICAgMHg4ODQxLCAweDg4NDIsIDB4ODg0MywgMHg4ODQ3LCAweDg4NDgsIDB4ODg0OSwgMHg4ODRCLCAweDg4NEUsIDB4ODg0RiwKKyAgICAweDg4NTAsIDB4ODg1MSwgMHg4ODUyLCAweDg4NTUsIDB4ODg1NiwgMHg4ODU4LCAweDg4NUEsIDB4ODg1QywgMHg4ODVFLAorICAgIDB4ODg1RiwgMHg4ODYwLCAweDg4NjYsIDB4ODg2NywgMHg4ODZBLCAweDg4NkQsIDB4ODg2RiwgMHg4ODcxLCAweDg4NzMsCisgICAgMHg4ODc0LCAweDg4NzUsIDB4ODg3NiwgMHg4ODc4LCAweDg4N0EsIDB4ODg3QiwgMHg4ODdDLCAweDg4ODAsIDB4ODg4MywKKyAgICAweDg4ODYsIDB4ODg4NywgMHg4ODg5LCAweDg4OEEsIDB4ODg4QywgMHg4ODhFLCAweDg4OEYsIDB4ODg5MCwgMHg4ODkxLAorICAgIDB4ODg5MywgMHg4ODk0LCAweDg4OTUsIDB4ODg5NywgMHg4ODk4LCAweDg4OTksIDB4ODg5QSwgMHg4ODlCLCAweDg4OUQsCisgICAgMHg4ODlFLCAweDg4OUYsIDB4ODhBMCwgMHg4OEExLCAweDg4QTMsIDB4ODhBNSwgMHg4OEE2LCAweDg4QTcsIDB4ODhBOCwKKyAgICAweDg4QTksIDB4ODhBQSwgMHg4OEFDLCAweDg4QUUsIDB4ODhBRiwgMHg4OEIwLCAweDg4QjIsIDB4ODhCMywgMHg4OEI0LAorICAgIDB4ODhCNSwgMHg4OEI2LCAweDg4QjgsIDB4ODhCOSwgMHg4OEJBLCAweDg4QkIsIDB4ODhCRCwgMHg4OEJFLCAweDg4QkYsCisgICAgMHg4OEMwLCAweDg4QzMsIDB4ODhDNCwgMHg4OEM3LCAweDg4QzgsIDB4ODhDQiwgMHg4OENDLCAweDg4Q0QsIDB4ODhEMCwKKyAgICAweDg4RDEsIDB4ODhEMywgMHg4OEQ2LCAweDg4RDcsIDB4ODhEQSwgMHg4OERCLCAweDg4REUsIDB4ODhFMCwgMHg4OEUxLAorICAgIDB4ODhFNiwgMHg4OEU3LCAweDg4RTksIDB4ODhFQSwgMHg4OEVCLCAweDg4RUMsIDB4ODhFRCwgMHg4OEVFLCAweDg4RUYsCisgICAgMHg4OEYyLCAweDg4RjUsIDB4ODhGNiwgMHg4OEY3LCAweDg4RkEsIDB4ODhGQiwgMHg4OEZGLCAweDg5MDAsIDB4ODkwMSwKKyAgICAweDg5MDMsIDB4ODkwNCwgMHg4OTA1LCAweDg5MDYsIDB4ODkwOCwgMHg4OTA5LCAweDg5MEIsIDB4ODkwQywgMHg4OTBELAorICAgIDB4ODkwRSwgMHg4OTBGLCAweDg5MTEsIDB4ODkxNCwgMHg4OTE1LCAweDg5MTYsIDB4ODkxNywgMHg4OTE4LCAweDg5MUMsCisgICAgMHg4OTFELCAweDg5MUUsIDB4ODkxRiwgMHg4OTIwLCAweDg5MjIsIDB4ODkyMywgMHg4OTI0LCAweDg5MjYsIDB4ODkyNywKKyAgICAweDg5MjgsIDB4ODkyOSwgMHg4OTJDLCAweDg5MkQsIDB4ODkyRSwgMHg4OTJGLCAweDg5MzEsIDB4ODkzNSwgMHg4OTM3LAorICAgIDB4ODkzOSwgMHg4OTNBLCAweDg5M0MsIDB4ODkzRCwgMHg4OTNFLCAweDg5M0YsIDB4ODk0MCwgMHg4OTQyLCAweDg5NDMsCisgICAgMHg4OTQ1LCAweDg5NDYsIDB4ODk0OCwgMHg4OTQ5LCAweDg5NEEsIDB4ODk0QiwgMHg4OTRDLCAweDg5NEQsIDB4ODk0RSwKKyAgICAweDg5NEYsIDB4ODk1MCwgMHg4OTUxLCAweDg5NTIsIDB4ODk1MywgMHg4OTU0LCAweDg5NTUsIDB4ODk1NywgMHg4OTU4LAorICAgIDB4ODk1OSwgMHg4OTVBLCAweDg5NUIsIDB4ODk1QywgMHg4OTYxLCAweDg5NjIsIDB4ODk2MywgMHg4OTY1LCAweDg5NjcsCisgICAgMHg4OTY4LCAweDg5NjksIDB4ODk2QiwgMHg4OTZELCAweDg5NkUsIDB4ODk3MCwgMHg4OTcxLCAweDg5NzMsIDB4ODk3NCwKKyAgICAweDg5NzUsIDB4ODk3NiwgMHg4OTc3LCAweDg5NzgsIDB4ODk3OSwgMHg4OTdBLCAweDg5N0MsIDB4ODk3RCwgMHg4OTdFLAorICAgIDB4ODk4MCwgMHg4OTgyLCAweDg5ODQsIDB4ODk4NSwgMHg4OTg3LCAweDg5ODgsIDB4ODk4OSwgMHg4OThBLCAweDg5OEMsCisgICAgMHg4OThELCAweDg5OEUsIDB4ODk5MCwgMHg4OTkxLCAweDg5OTIsIDB4ODk5NCwgMHg4OTk1LCAweDg5OTcsIDB4ODk5OSwKKyAgICAweDg5OUEsIDB4ODk5QiwgMHg4OTlDLCAweDg5OUQsIDB4ODk5RSwgMHg4OTlGLCAweDg5QTAsIDB4ODlBMiwgMHg4OUEzLAorICAgIDB4ODlBNCwgMHg4OUE1LCAweDg5QTcsIDB4ODlBOCwgMHg4OUE5LCAweDg5QUIsIDB4ODlBRCwgMHg4OUFFLCAweDg5QjAsCisgICAgMHg4OUIxLCAweDg5QjMsIDB4ODlCNCwgMHg4OUI1LCAweDg5QjYsIDB4ODlCOCwgMHg4OUI5LCAweDg5QkIsIDB4ODlCQywKKyAgICAweDg5QkUsIDB4ODlDMywgMHg4OUNELCAweDg5RDMsIDB4ODlENCwgMHg4OUQ1LCAweDg5RDcsIDB4ODlEOCwgMHg4OUQ5LAorICAgIDB4ODlEQiwgMHg4OURELCAweDg5REYsIDB4ODlFMCwgMHg4OUUxLCAweDg5RTIsIDB4ODlFNCwgMHg4OUU3LCAweDg5RTgsCisgICAgMHg4OUU5LCAweDg5RUEsIDB4ODlFQywgMHg4OUVELCAweDg5RUUsIDB4ODlGMCwgMHg4OUYxLCAweDg5RjIsIDB4ODlGNSwKKyAgICAweDg5RjcsIDB4ODlGOSwgMHg4OUZBLCAweDg5RkIsIDB4ODlGQywgMHg4OUZELCAweDg5RkUsIDB4ODlGRiwgMHg4QTA0LAorICAgIDB4OEEwNSwgMHg4QTA2LCAweDhBMDksIDB4OEEwQiwgMHg4QTBELCAweDhBMEYsIDB4OEExMSwgMHg4QTEyLCAweDhBMTQsCisgICAgMHg4QTE3LCAweDhBMTksIDB4OEExQSwgMHg4QTFDLCAweDhBMUUsIDB4OEEyMCwgMHg4QTIxLCAweDhBMjIsIDB4OEEyNCwKKyAgICAweDhBMjYsIDB4OEEyNywgMHg4QTI4LCAweDhBMjksIDB4OEEyQiwgMHg4QTJDLCAweDhBMkUsIDB4OEEyRiwgMHg4QTMwLAorICAgIDB4OEEzMiwgMHg4QTMzLCAweDhBMzUsIDB4OEEzNywgMHg4QTM4LCAweDhBMzksIDB4OEEzQiwgMHg4QTNDLCAweDhBM0QsCisgICAgMHg4QTNGLCAweDhBNDAsIDB4OEE0MiwgMHg4QTQzLCAweDhBNDQsIDB4OEE0NSwgMHg4QTQ3LCAweDhBNDksIDB4OEE0QSwKKyAgICAweDhBNEIsIDB4OEE0QywgMHg4QTRELCAweDhBNEYsIDB4OEE1MSwgMHg4QTUzLCAweDhBNTYsIDB4OEE1NywgMHg4QTU5LAorICAgIDB4OEE1QSwgMHg4QTVDLCAweDhBNUQsIDB4OEE1RiwgMHg4QTYwLCAweDhBNjQsIDB4OEE2NSwgMHg4QTY3LCAweDhBNjgsCisgICAgMHg4QTZBLCAweDhBNkYsIDB4OEE3NCwgMHg4QTc2LCAweDhBNzcsIDB4OEE3OCwgMHg4QTdBLCAweDhBN0IsIDB4OEE3RCwKKyAgICAweDhBN0UsIDB4OEE4MCwgMHg4QTgxLCAweDhBODIsIDB4OEE4MywgMHg4QTg4LCAweDhBOEIsIDB4OEE4QywgMHg4QThFLAorICAgIDB4OEE4RiwgMHg4QTkwLCAweDhBOTQsIDB4OEE5NiwgMHg4QTk3LCAweDhBOTksIDB4OEE5QiwgMHg4QTlDLCAweDhBOUQsCisgICAgMHg4QTlGLCAweDhBQTIsIDB4OEFBNywgMHg4QUE5LCAweDhBQUEsIDB4OEFBQiwgMHg4QUFELCAweDhBQUUsIDB4OEFBRiwKKyAgICAweDhBQjEsIDB4OEFCMywgMHg4QUI0LCAweDhBQjUsIDB4OEFCNywgMHg4QUI4LCAweDhBQkEsIDB4OEFCQiwgMHg4QUJELAorICAgIDB4OEFCRSwgMHg4QUMwLCAweDhBQzEsIDB4OEFDMywgMHg4QUM1LCAweDhBQzYsIDB4OEFDOCwgMHg4QUNBLCAweDhBQ0MsCisgICAgMHg4QUNFLCAweDhBRDAsIDB4OEFEMywgMHg4QUQ0LCAweDhBRDUsIDB4OEFEOCwgMHg4QUQ5LCAweDhBREEsIDB4OEFERCwKKyAgICAweDhBREYsIDB4OEFFMCwgMHg4QUUxLCAweDhBRTMsIDB4OEFFNSwgMHg4QUU4LCAweDhBRTksIDB4OEFFQSwgMHg4QUVDLAorICAgIDB4OEFFRiwgMHg4QUYwLCAweDhBRjIsIDB4OEFGNCwgMHg4QUY1LCAweDhBRjksIDB4OEFGQiwgMHg4QUZELCAweDhBRkYsCisgICAgMHg4QjAzLCAweDhCMDYsIDB4OEIwOCwgMHg4QjA5LCAweDhCMEIsIDB4OEIwQywgMHg4QjBELCAweDhCMEYsIDB4OEIxMSwKKyAgICAweDhCMTIsIDB4OEIxMywgMHg4QjE1LCAweDhCMTgsIDB4OEIxQywgMHg4QjFFLCAweDhCMUYsIDB4OEIyMCwgMHg4QjIyLAorICAgIDB4OEIyMywgMHg4QjI0LCAweDhCMjUsIDB4OEIyNywgMHg4QjI5LCAweDhCMkEsIDB4OEIyRSwgMHg4QjJGLCAweDhCMzAsCisgICAgMHg4QjMxLCAweDhCMzIsIDB4OEIzNCwgMHg4QjM1LCAweDhCMzYsIDB4OEIzNywgMHg4QjM4LCAweDhCM0EsIDB4OEIzQiwKKyAgICAweDhCM0MsIDB4OEIzRCwgMHg4QjNGLCAweDhCNDAsIDB4OEI0MSwgMHg4QjQyLCAweDhCNDMsIDB4OEI0NCwgMHg4QjQ1LAorICAgIDB4OEI0NiwgMHg4QjQ3LCAweDhCNDgsIDB4OEI0QSwgMHg4QjRCLCAweDhCNEMsIDB4OEI0RCwgMHg4QjUwLCAweDhCNTEsCisgICAgMHg4QjUyLCAweDhCNTMsIDB4OEI1NCwgMHg4QjU1LCAweDhCNTcsIDB4OEI1QiwgMHg4QjVELCAweDhCNUUsIDB4OEI1RiwKKyAgICAweDhCNjAsIDB4OEI2MSwgMHg4QjYyLCAweDhCNjMsIDB4OEI2NCwgMHg4QjY1LCAweDhCNjcsIDB4OEI2OCwgMHg4QjY5LAorICAgIDB4OEI2QSwgMHg4QjZELCAweDhCNkUsIDB4OEI3MSwgMHg4QjcyLCAweDhCNzMsIDB4OEI3NSwgMHg4Qjc2LCAweDhCNzgsCisgICAgMHg4Qjc5LCAweDhCN0EsIDB4OEI3QiwgMHg4QjdDLCAweDhCN0UsIDB4OEI3RiwgMHg4QjgxLCAweDhCODIsIDB4OEI4MywKKyAgICAweDhCODQsIDB4OEI4NSwgMHg4Qjg2LCAweDhCODcsIDB4OEI4OCwgMHg4Qjg5LCAweDhCOEIsIDB4OEI4QywgMHg4QjhELAorICAgIDB4OEI4RiwgMHg4QjkwLCAweDhCOTEsIDB4OEI5NCwgMHg4Qjk3LCAweDhCOTgsIDB4OEI5OSwgMHg4QjlBLCAweDhCOUIsCisgICAgMHg4QjlELCAweDhCOUYsIDB4OEJBQywgMHg4QkIxLCAweDhCQkIsIDB4OEJDNywgMHg4QkQwLCAweDhCRUEsIDB4OEMwOSwKKyAgICAweDhDMUUsIDB4OEMzOCwgMHg4QzM5LCAweDhDM0EsIDB4OEMzQiwgMHg4QzNDLCAweDhDM0QsIDB4OEMzRSwgMHg4QzNGLAorICAgIDB4OEM0MCwgMHg4QzQyLCAweDhDNDMsIDB4OEM0NCwgMHg4QzQ1LCAweDhDNEEsIDB4OEM0QiwgMHg4QzRELCAweDhDNEUsCisgICAgMHg4QzRGLCAweDhDNTEsIDB4OEM1MiwgMHg4QzUzLCAweDhDNTQsIDB4OEM1NiwgMHg4QzU3LCAweDhDNTgsIDB4OEM1OSwKKyAgICAweDhDNUIsIDB4OEM1QywgMHg4QzVELCAweDhDNUUsIDB4OEM1RiwgMHg4QzYwLCAweDhDNjMsIDB4OEM2NCwgMHg4QzY1LAorICAgIDB4OEM2NiwgMHg4QzY3LCAweDhDNjgsIDB4OEM2OSwgMHg4QzZDLCAweDhDNkQsIDB4OEM2RSwgMHg4QzZGLCAweDhDNzAsCisgICAgMHg4QzcxLCAweDhDNzIsIDB4OEM3NCwgMHg4Qzc1LCAweDhDNzYsIDB4OEM3NywgMHg4QzdCLCAweDhDN0MsIDB4OEM3RCwKKyAgICAweDhDN0UsIDB4OEM3RiwgMHg4QzgwLCAweDhDODEsIDB4OEM4MywgMHg4Qzg0LCAweDhDODYsIDB4OEM4NywgMHg4Qzg4LAorICAgIDB4OEM4QiwgMHg4QzhELCAweDhDOEUsIDB4OEM4RiwgMHg4QzkwLCAweDhDOTEsIDB4OEM5MiwgMHg4QzkzLCAweDhDOTUsCisgICAgMHg4Qzk2LCAweDhDOTcsIDB4OEM5OSwgMHg4QzlBLCAweDhDOUIsIDB4OEM5QywgMHg4QzlGLCAweDhDQTMsIDB4OENBNCwKKyAgICAweDhDQTUsIDB4OENBNiwgMHg4Q0FELCAweDhDQUUsIDB4OENCMSwgMHg4Q0I1LCAweDhDQjksIDB4OENCRSwgMHg4Q0M2LAorICAgIDB4OENDOSwgMHg4Q0NCLCAweDhDQ0MsIDB4OENDRCwgMHg4Q0NFLCAweDhDQ0YsIDB4OENEMCwgMHg4Q0Q0LCAweDhDRDYsCisgICAgMHg4Q0Q3LCAweDhDRDgsIDB4OENEOSwgMHg4Q0RCLCAweDhDREQsIDB4OENERiwgMHg4Q0U1LCAweDhDRTgsIDB4OENFOSwKKyAgICAweDhDRUUsIDB4OENFRiwgMHg4Q0YwLCAweDhDRjEsIDB4OENGMiwgMHg4Q0YzLCAweDhDRjUsIDB4OENGNiwgMHg4Q0Y3LAorICAgIDB4OENGOCwgMHg4Q0Y5LCAweDhDRkYsIDB4OEQwMCwgMHg4RDAxLCAweDhEMDIsIDB4OEQwMywgMHg4RDA2LCAweDhEMDcsCisgICAgMHg4RDA5LCAweDhEMEMsIDB4OEQwRSwgMHg4RDExLCAweDhEMTIsIDB4OEQxMywgMHg4RDE0LCAweDhEMTUsIDB4OEQxNywKKyAgICAweDhEMTgsIDB4OEQxOSwgMHg4RDFBLCAweDhEMjAsIDB4OEQ1MSwgMHg4RDUyLCAweDhENTcsIDB4OEQ1RiwgMHg4RDY1LAorICAgIDB4OEQ2OCwgMHg4RDY5LCAweDhENkEsIDB4OEQ2QywgMHg4RDZFLCAweDhENkYsIDB4OEQ3MSwgMHg4RDcyLCAweDhENzgsCisgICAgMHg4RDc5LCAweDhEN0EsIDB4OEQ3QiwgMHg4RDdDLCAweDhEN0QsIDB4OEQ3RSwgMHg4RDdGLCAweDhEODAsIDB4OEQ4MiwKKyAgICAweDhEODMsIDB4OEQ4NiwgMHg4RDg3LCAweDhEODgsIDB4OEQ4OSwgMHg4RDhDLCAweDhEOEQsIDB4OEQ4RSwgMHg4RDhGLAorICAgIDB4OEQ5MCwgMHg4RDkyLCAweDhEOTMsIDB4OEQ5NiwgMHg4RDk3LCAweDhEOTgsIDB4OEQ5QSwgMHg4RDlCLCAweDhEOUMsCisgICAgMHg4RDlELCAweDhEOUUsIDB4OERBMCwgMHg4REExLCAweDhEQTIsIDB4OERBNCwgMHg4REE1LCAweDhEQTYsIDB4OERBNywKKyAgICAweDhEQTksIDB4OERBQSwgMHg4REFCLCAweDhEQUMsIDB4OERBRCwgMHg4REFFLCAweDhEQUYsIDB4OERCMCwgMHg4REI2LAorICAgIDB4OERCNywgMHg4REI5LCAweDhEQkIsIDB4OERCRCwgMHg4REMwLCAweDhEQzEsIDB4OERDMiwgMHg4REM1LCAweDhEQzcsCisgICAgMHg4REM4LCAweDhEQzksIDB4OERDQSwgMHg4RENELCAweDhERDAsIDB4OEREMiwgMHg4REQzLCAweDhERDQsIDB4OERENSwKKyAgICAweDhERDgsIDB4OEREOSwgMHg4RERDLCAweDhERTAsIDB4OERFMSwgMHg4REUyLCAweDhERTUsIDB4OERFNiwgMHg4REU3LAorICAgIDB4OERFOSwgMHg4REVELCAweDhERUUsIDB4OERGMCwgMHg4REYxLCAweDhERjIsIDB4OERGNCwgMHg4REY2LCAweDhERkMsCisgICAgMHg4REZFLCAweDhERkYsIDB4OEUwMCwgMHg4RTAxLCAweDhFMDIsIDB4OEUwMywgMHg4RTA0LCAweDhFMDYsIDB4OEUwNywKKyAgICAweDhFMDgsIDB4OEUwQiwgMHg4RTBELCAweDhFMEUsIDB4OEUxMSwgMHg4RTEyLCAweDhFMTMsIDB4OEUxNSwgMHg4RTE2LAorICAgIDB4OEUxNywgMHg4RTE4LCAweDhFMTksIDB4OEUxQSwgMHg4RTFCLCAweDhFMUMsIDB4OEUyMCwgMHg4RTIxLCAweDhFMjQsCisgICAgMHg4RTI1LCAweDhFMjYsIDB4OEUyNywgMHg4RTI4LCAweDhFMkIsIDB4OEUyRCwgMHg4RTMwLCAweDhFMzIsIDB4OEUzMywKKyAgICAweDhFMzYsIDB4OEUzNywgMHg4RTM4LCAweDhFM0IsIDB4OEUzQywgMHg4RTNFLCAweDhFM0YsIDB4OEU0MywgMHg4RTQ1LAorICAgIDB4OEU0NiwgMHg4RTRELCAweDhFNEUsIDB4OEU0RiwgMHg4RTUwLCAweDhFNTMsIDB4OEU1NCwgMHg4RTU2LCAweDhFNTcsCisgICAgMHg4RTU4LCAweDhFNUEsIDB4OEU1QiwgMHg4RTVDLCAweDhFNUQsIDB4OEU1RSwgMHg4RTVGLCAweDhFNjAsIDB4OEU2MSwKKyAgICAweDhFNjIsIDB4OEU2NCwgMHg4RTY1LCAweDhFNjcsIDB4OEU2OCwgMHg4RTZBLCAweDhFNkIsIDB4OEU2RSwgMHg4RTcxLAorICAgIDB4OEU3MywgMHg4RTc1LCAweDhFNzcsIDB4OEU3OCwgMHg4RTc5LCAweDhFN0IsIDB4OEU3RCwgMHg4RTdFLCAweDhFODAsCisgICAgMHg4RTgyLCAweDhFODMsIDB4OEU4NCwgMHg4RTg2LCAweDhFODgsIDB4OEU4QywgMHg4RThFLCAweDhFOTUsIDB4OEU5NiwKKyAgICAweDhFOTcsIDB4OEU5OCwgMHg4RTk5LCAweDhFOUIsIDB4OEU5RCwgMHg4RTlGLCAweDhFQTAsIDB4OEVBMiwgMHg4RUEzLAorICAgIDB4OEVBNCwgMHg4RUE3LCAweDhFQTgsIDB4OEVBOSwgMHg4RUFELCAweDhFQUUsIDB4OEVCMCwgMHg4RUIxLCAweDhFQjMsCisgICAgMHg4RUI0LCAweDhFQjUsIDB4OEVCNiwgMHg4RUI3LCAweDhFQjgsIDB4OEVCOSwgMHg4RUJCLCAweDhFQkMsIDB4OEVCRCwKKyAgICAweDhFQkUsIDB4OEVCRiwgMHg4RUMxLCAweDhFQzIsIDB4OEVDMywgMHg4RUM0LCAweDhFQzUsIDB4OEVDNiwgMHg4RUM3LAorICAgIDB4OEVDOCwgMHg4RUM5LCAweDhFQ0YsIDB4OEVEMCwgMHg4RUQxLCAweDhFRDMsIDB4OEVENSwgMHg4RUQ2LCAweDhFRDcsCisgICAgMHg4RUQ4LCAweDhFRDksIDB4OEVEQSwgMHg4RURDLCAweDhFREQsIDB4OEVERSwgMHg4RUUwLCAweDhFRTEsIDB4OEVFMiwKKyAgICAweDhFRTMsIDB4OEVFNSwgMHg4RUU2LCAweDhFRTcsIDB4OEVFOCwgMHg4RUU5LCAweDhFRUEsIDB4OEVFQywgMHg4RUVELAorICAgIDB4OEVFRSwgMHg4RUVGLCAweDhFRjAsIDB4OEVGMSwgMHg4RUYzLCAweDhFRjQsIDB4OEVGNSwgMHg4RUY2LCAweDhFRjcsCisgICAgMHg4RUZELCAweDhFRkYsIDB4OEYwMCwgMHg4RjAxLCAweDhGMDIsIDB4OEYwNCwgMHg4RjA2LCAweDhGMDgsIDB4OEYwQiwKKyAgICAweDhGMEMsIDB4OEYwRCwgMHg4RjBFLCAweDhGMEYsIDB4OEYxMCwgMHg4RjExLCAweDhGMTMsIDB4OEYxNiwgMHg4RjE3LAorICAgIDB4OEYxOCwgMHg4RjE5LCAweDhGMUEsIDB4OEYyMCwgMHg4RjIxLCAweDhGMjIsIDB4OEYyMywgMHg4RjI0LCAweDhGMjcsCisgICAgMHg4RjI4LCAweDhGMkIsIDB4OEYyQywgMHg4RjJELCAweDhGMkUsIDB4OEYzMCwgMHg4RjMxLCAweDhGMzIsIDB4OEYzNCwKKyAgICAweDhGMzUsIDB4OEYzNiwgMHg4RjM3LCAweDhGMzksIDB4OEYzQSwgMHg4RjNDLCAweDhGM0QsIDB4OEY0MCwgMHg4RjQxLAorICAgIDB4OEY0MywgMHg4RjQ3LCAweDhGNDgsIDB4OEY0QSwgMHg4RjRCLCAweDhGNEMsIDB4OEY0RiwgMHg4RjUwLCAweDhGNTEsCisgICAgMHg4RjUyLCAweDhGNTMsIDB4OEY1NSwgMHg4RjU2LCAweDhGNTcsIDB4OEY1OCwgMHg4RjU5LCAweDhGNUEsIDB4OEY1QiwKKyAgICAweDhGNUMsIDB4OEY1RCwgMHg4RjVFLCAweDhGNjAsIDB4OEY2MywgMHg4RjY1LCAweDhGNkEsIDB4OEY4MCwgMHg4RjhDLAorICAgIDB4OEY5MiwgMHg4RjlELCAweDhGQTAsIDB4OEZBMSwgMHg4RkEyLCAweDhGQTQsIDB4OEZBNSwgMHg4RkE3LCAweDhGQUEsCisgICAgMHg4RkFDLCAweDhGQjMsIDB4OEZCNCwgMHg4RkI1LCAweDhGQjcsIDB4OEZCOCwgMHg4RkJBLCAweDhGQkIsIDB4OEZCQywKKyAgICAweDhGQkYsIDB4OEZDMCwgMHg4RkMzLCAweDhGQzYsIDB4OEZDOSwgMHg4RkNBLCAweDhGQ0IsIDB4OEZDQywgMHg4RkNELAorICAgIDB4OEZDRiwgMHg4RkQyLCAweDhGRDYsIDB4OEZENywgMHg4RkRBLCAweDhGRTAsIDB4OEZFMSwgMHg4RkUzLCAweDhGRTcsCisgICAgMHg4RkVDLCAweDhGRUYsIDB4OEZGMSwgMHg4RkYyLCAweDhGRjUsIDB4OEZGNiwgMHg4RkZBLCAweDhGRkIsIDB4OEZGQywKKyAgICAweDhGRkUsIDB4OEZGRiwgMHg5MDA3LCAweDkwMDgsIDB4OTAwQywgMHg5MDBFLCAweDkwMTMsIDB4OTAxOCwgMHg5MDFDLAorICAgIDB4OTAyNCwgMHg5MDI1LCAweDkwMjcsIDB4OTAyOCwgMHg5MDI5LCAweDkwMkEsIDB4OTAyQiwgMHg5MDJDLCAweDkwMzAsCisgICAgMHg5MDMxLCAweDkwMzMsIDB4OTAzNCwgMHg5MDM3LCAweDkwMzksIDB4OTAzQSwgMHg5MDNELCAweDkwM0YsIDB4OTA0MCwKKyAgICAweDkwNDMsIDB4OTA0NSwgMHg5MDQ2LCAweDkwNDgsIDB4OTA0OSwgMHg5MDRBLCAweDkwNEMsIDB4OTA1NiwgMHg5MDU5LAorICAgIDB4OTA1QSwgMHg5MDVELCAweDkwNUYsIDB4OTA2MSwgMHg5MDY0LCAweDkwNjYsIDB4OTA2NywgMHg5MDZBLCAweDkwNkIsCisgICAgMHg5MDZDLCAweDkwNkYsIDB4OTA3MCwgMHg5MDcxLCAweDkwNzMsIDB4OTA3NiwgMHg5MDc5LCAweDkwN0IsIDB4OTA3RSwKKyAgICAweDkwODUsIDB4OTA4NiwgMHg5MDg5LCAweDkwOEMsIDB4OTA4RCwgMHg5MDhFLCAweDkwOTIsIDB4OTA5NCwgMHg5MDk2LAorICAgIDB4OTA5OCwgMHg5MDlBLCAweDkwOUMsIDB4OTA5RSwgMHg5MDlGLCAweDkwQTAsIDB4OTBBNCwgMHg5MEE1LCAweDkwQTcsCisgICAgMHg5MEE4LCAweDkwQTksIDB4OTBBQiwgMHg5MEFELCAweDkwQjIsIDB4OTBCNywgMHg5MEJDLCAweDkwQkQsIDB4OTBCRiwKKyAgICAweDkwQzAsIDB4OTBDMiwgMHg5MEMzLCAweDkwQzYsIDB4OTBDOCwgMHg5MEM5LCAweDkwQ0IsIDB4OTBDQywgMHg5MENELAorICAgIDB4OTBEMiwgMHg5MEQ0LCAweDkwRDUsIDB4OTBENiwgMHg5MEQ4LCAweDkwRDksIDB4OTBEQSwgMHg5MERFLCAweDkwRTAsCisgICAgMHg5MEUzLCAweDkwRTQsIDB4OTBFNSwgMHg5MEU5LCAweDkwRUEsIDB4OTBFQywgMHg5MEVFLCAweDkwRjAsIDB4OTBGMSwKKyAgICAweDkwRjIsIDB4OTBGMywgMHg5MEY2LCAweDkwRjcsIDB4OTBGOSwgMHg5MEZBLCAweDkwRkIsIDB4OTBGQywgMHg5MEZGLAorICAgIDB4OTEwMCwgMHg5MTAxLCAweDkxMDMsIDB4OTEwNSwgMHg5MTA3LCAweDkxMDgsIDB4OTEwQSwgMHg5MTBCLCAweDkxMEMsCisgICAgMHg5MTBELCAweDkxMEUsIDB4OTEwRiwgMHg5MTEwLCAweDkxMTEsIDB4OTExMywgMHg5MTE1LCAweDkxMTcsIDB4OTExOCwKKyAgICAweDkxMUEsIDB4OTExQiwgMHg5MTFDLCAweDkxMUQsIDB4OTExRiwgMHg5MTIwLCAweDkxMjEsIDB4OTEyNCwgMHg5MTI1LAorICAgIDB4OTEyNiwgMHg5MTI4LCAweDkxMjksIDB4OTEyQSwgMHg5MTJCLCAweDkxMkMsIDB4OTEyRSwgMHg5MTMzLCAweDkxMzUsCisgICAgMHg5MTM3LCAweDkxMzgsIDB4OTEzQiwgMHg5MTNDLCAweDkxM0QsIDB4OTEzRSwgMHg5MTNGLCAweDkxNDAsIDB4OTE0MSwKKyAgICAweDkxNDIsIDB4OTE0NCwgMHg5MTQ1LCAweDkxNDcsIDB4OTE1MSwgMHg5MTUzLCAweDkxNTQsIDB4OTE1NSwgMHg5MTU2LAorICAgIDB4OTE1OCwgMHg5MTU5LCAweDkxNUIsIDB4OTE1QywgMHg5MTVGLCAweDkxNjAsIDB4OTE2NiwgMHg5MTY3LCAweDkxNjgsCisgICAgMHg5MTZCLCAweDkxNkQsIDB4OTE3MywgMHg5MTdBLCAweDkxN0IsIDB4OTE3QywgMHg5MTgwLCAweDkxODEsIDB4OTE4MiwKKyAgICAweDkxODMsIDB4OTE4NCwgMHg5MTg2LCAweDkxODgsIDB4OTE4QSwgMHg5MThFLCAweDkxOEYsIDB4OTE5MywgMHg5MTk0LAorICAgIDB4OTE5NSwgMHg5MTk3LCAweDkxOTgsIDB4OTE5OSwgMHg5MTlELCAweDkxOUUsIDB4OTE5RiwgMHg5MUEwLCAweDkxQTEsCisgICAgMHg5MUE0LCAweDkxQTUsIDB4OTFBNiwgMHg5MUE3LCAweDkxQTgsIDB4OTFBOSwgMHg5MUIwLCAweDkxQjEsIDB4OTFCMiwKKyAgICAweDkxQjMsIDB4OTFCNiwgMHg5MUI3LCAweDkxQjgsIDB4OTFCOSwgMHg5MUJCLCAweDkxQkMsIDB4OTFCRCwgMHg5MUJFLAorICAgIDB4OTFCRiwgMHg5MUMyLCAweDkxQzQsIDB4OTFDNiwgMHg5MUM4LCAweDkxRDAsIDB4OTFENiwgMHg5MURBLCAweDkxREIsCisgICAgMHg5MURFLCAweDkxREYsIDB4OTFFMCwgMHg5MUUxLCAweDkxRTIsIDB4OTFFNSwgMHg5MUU2LCAweDkxRTgsIDB4OTFFQSwKKyAgICAweDkxRUIsIDB4OTFFQywgMHg5MUVELCAweDkxRUUsIDB4OTFFRiwgMHg5MUYwLCAweDkxRjEsIDB4OTFGMiwgMHg5MUYzLAorICAgIDB4OTFGNCwgMHg5MUY2LCAweDkxRjgsIDB4OTFGQiwgMHg5MUZDLCAweDkxRkQsIDB4OTFGRSwgMHg5MUZGLCAweDkyMDIsCisgICAgMHg5MjAzLCAweDkyMDUsIDB4OTIwNiwgMHg5MjA3LCAweDkyMEEsIDB4OTIwQiwgMHg5MjBDLCAweDkyMEYsIDB4OTIxMiwKKyAgICAweDkyMTMsIDB4OTIxNiwgMHg5MjE3LCAweDkyMTgsIDB4OTIxOSwgMHg5MjFBLCAweDkyMUIsIDB4OTIxQywgMHg5MjFELAorICAgIDB4OTIxRiwgMHg5MjIwLCAweDkyMjEsIDB4OTIyMiwgMHg5MjI0LCAweDkyMjgsIDB4OTIyOSwgMHg5MjJBLCAweDkyMkIsCisgICAgMHg5MjJDLCAweDkyMkQsIDB4OTIyRiwgMHg5MjMxLCAweDkyMzIsIDB4OTIzNSwgMHg5MjM2LCAweDkyM0IsIDB4OTIzQywKKyAgICAweDkyNDEsIDB4OTI0MiwgMHg5MjQzLCAweDkyNDQsIDB4OTI0NiwgMHg5MjQ3LCAweDkyNEEsIDB4OTI0QiwgMHg5MjRDLAorICAgIDB4OTI0RSwgMHg5MjRGLCAweDkyNTAsIDB4OTI1MiwgMHg5MjUzLCAweDkyNTQsIDB4OTI1NiwgMHg5MjU4LCAweDkyNTksCisgICAgMHg5MjVDLCAweDkyNUQsIDB4OTI1RiwgMHg5MjYwLCAweDkyNjEsIDB4OTI2MywgMHg5MjY0LCAweDkyNjUsIDB4OTI2NywKKyAgICAweDkyNjgsIDB4OTI2OSwgMHg5MjZBLCAweDkyNkIsIDB4OTI2RSwgMHg5MjZGLCAweDkyNzAsIDB4OTI3MSwgMHg5MjcyLAorICAgIDB4OTI3MywgMHg5Mjc1LCAweDkyNzYsIDB4OTI3NywgMHg5Mjc5LCAweDkyN0MsIDB4OTI3RCwgMHg5MjdFLCAweDkyODEsCisgICAgMHg5MjgyLCAweDkyODQsIDB4OTI4NiwgMHg5Mjg3LCAweDkyODgsIDB4OTI4OSwgMHg5MjhBLCAweDkyOEIsIDB4OTI4QywKKyAgICAweDkyOEQsIDB4OTI4RiwgMHg5MjkwLCAweDkyOTIsIDB4OTI5NCwgMHg5Mjk1LCAweDkyOTcsIDB4OTI5OSwgMHg5MjlCLAorICAgIDB4OTI5RCwgMHg5MjlFLCAweDkyOUYsIDB4OTJBMSwgMHg5MkEyLCAweDkyQTQsIDB4OTJBNywgMHg5MkFELCAweDkyQUYsCisgICAgMHg5MkIwLCAweDkyQjIsIDB4OTJCMywgMHg5MkI0LCAweDkyQjUsIDB4OTJCNiwgMHg5MkI4LCAweDkyQkEsIDB4OTJCRCwKKyAgICAweDkyQkUsIDB4OTJCRiwgMHg5MkMwLCAweDkyQzIsIDB4OTJDNCwgMHg5MkM2LCAweDkyQzksIDB4OTJDQSwgMHg5MkNCLAorICAgIDB4OTJDRCwgMHg5MkNFLCAweDkyRDAsIDB4OTJEMSwgMHg5MkQzLCAweDkyRDQsIDB4OTJENSwgMHg5MkQ2LCAweDkyRDcsCisgICAgMHg5MkQ4LCAweDkyRDksIDB4OTJEQSwgMHg5MkRCLCAweDkyREMsIDB4OTJERSwgMHg5MkUwLCAweDkyRTEsIDB4OTJFMiwKKyAgICAweDkyRTcsIDB4OTJFOSwgMHg5MkVCLCAweDkyRUMsIDB4OTJGMiwgMHg5MkYzLCAweDkyRjQsIDB4OTJGNSwgMHg5MkY3LAorICAgIDB4OTJGOSwgMHg5MkZBLCAweDkyRkIsIDB4OTJGRCwgMHg5MkZFLCAweDkyRkYsIDB4OTMwMCwgMHg5MzAyLCAweDkzMDMsCisgICAgMHg5MzA0LCAweDkzMDUsIDB4OTMwOSwgMHg5MzBBLCAweDkzMEIsIDB4OTMwQywgMHg5MzBELCAweDkzMEUsIDB4OTMwRiwKKyAgICAweDkzMTEsIDB4OTMxMywgMHg5MzE0LCAweDkzMTYsIDB4OTMxNywgMHg5MzFDLCAweDkzMUQsIDB4OTMxRSwgMHg5MzIxLAorICAgIDB4OTMyMywgMHg5MzI0LCAweDkzMjUsIDB4OTMyNywgMHg5MzI5LCAweDkzMkEsIDB4OTMyQywgMHg5MzJELCAweDkzMzAsCisgICAgMHg5MzMxLCAweDkzMzQsIDB4OTMzNSwgMHg5MzM3LCAweDkzMzksIDB4OTMzQSwgMHg5MzNCLCAweDkzM0MsIDB4OTMzRCwKKyAgICAweDkzM0YsIDB4OTM0MiwgMHg5MzQ0LCAweDkzNDUsIDB4OTM0OCwgMHg5MzQ5LCAweDkzNEEsIDB4OTM0QywgMHg5MzRFLAorICAgIDB4OTM0RiwgMHg5MzUwLCAweDkzNTEsIDB4OTM1MiwgMHg5MzUzLCAweDkzNTUsIDB4OTM1NiwgMHg5MzU3LCAweDkzNTksCisgICAgMHg5MzVBLCAweDkzNUMsIDB4OTM1RCwgMHg5MzVFLCAweDkzNUYsIDB4OTM2MCwgMHg5MzYxLCAweDkzNjIsIDB4OTM2MywKKyAgICAweDkzNjYsIDB4OTM2NywgMHg5MzY4LCAweDkzNkIsIDB4OTM2RCwgMHg5MzZFLCAweDkzNkYsIDB4OTM3MSwgMHg5MzcyLAorICAgIDB4OTM3MywgMHg5Mzc0LCAweDkzNzcsIDB4OTM3OCwgMHg5Mzc5LCAweDkzN0IsIDB4OTM3QywgMHg5MzdELCAweDkzN0YsCisgICAgMHg5MzgwLCAweDkzODEsIDB4OTM4MywgMHg5Mzg1LCAweDkzODYsIDB4OTM4OCwgMHg5Mzg5LCAweDkzOEIsIDB4OTM4QywKKyAgICAweDkzOEQsIDB4OTM4RSwgMHg5MzkwLCAweDkzOTEsIDB4OTM5MiwgMHg5MzkzLCAweDkzOTQsIDB4OTM5NSwgMHg5Mzk3LAorICAgIDB4OTM5OSwgMHg5MzlBLCAweDkzOUIsIDB4OTM5QywgMHg5MzlELCAweDkzOUUsIDB4OTM5RiwgMHg5M0EwLCAweDkzQTEsCisgICAgMHg5M0E0LCAweDkzQTUsIDB4OTNBOCwgMHg5M0FCLCAweDkzQUQsIDB4OTNBRiwgMHg5M0IxLCAweDkzQjIsIDB4OTNCNCwKKyAgICAweDkzQjYsIDB4OTNCNywgMHg5M0I5LCAweDkzQkEsIDB4OTNCQiwgMHg5M0JDLCAweDkzQkQsIDB4OTNCRSwgMHg5M0MwLAorICAgIDB4OTNDMSwgMHg5M0MyLCAweDkzQzQsIDB4OTNDNSwgMHg5M0M2LCAweDkzQzksIDB4OTNDQiwgMHg5M0NFLCAweDkzQ0YsCisgICAgMHg5M0QwLCAweDkzRDIsIDB4OTNEMywgMHg5M0Q0LCAweDkzRDUsIDB4OTNEOSwgMHg5M0RBLCAweDkzREIsIDB4OTNFMCwKKyAgICAweDkzRTMsIDB4OTNFNSwgMHg5M0U2LCAweDkzRTcsIDB4OTNFOSwgMHg5M0VBLCAweDkzRUIsIDB4OTNFQywgMHg5M0VELAorICAgIDB4OTNFRSwgMHg5M0VGLCAweDkzRjAsIDB4OTNGMSwgMHg5M0YyLCAweDkzRjMsIDB4OTNGNCwgMHg5M0Y2LCAweDkzRjgsCisgICAgMHg5M0ZBLCAweDkzRkIsIDB4OTNGQywgMHg5M0ZELCAweDkzRkUsIDB4OTNGRiwgMHg5NDAwLCAweDk0MDEsIDB4OTQwMiwKKyAgICAweDk0MDQsIDB4OTQwNSwgMHg5NDA2LCAweDk0MDcsIDB4OTQwOCwgMHg5NDA5LCAweDk0MEEsIDB4OTQwQywgMHg5NDBELAorICAgIDB4OTQwRSwgMHg5NDBGLCAweDk0MTEsIDB4OTQxNSwgMHg5NDE2LCAweDk0MTcsIDB4OTQxQSwgMHg5NDFCLCAweDk0MUMsCisgICAgMHg5NDFFLCAweDk0MUYsIDB4OTQyMSwgMHg5NDIyLCAweDk0MjMsIDB4OTQyNCwgMHg5NDI1LCAweDk0MjksIDB4OTQyQSwKKyAgICAweDk0MkIsIDB4OTQyQywgMHg5NDJELCAweDk0MkYsIDB4OTQzMCwgMHg5NDMxLCAweDk0MzQsIDB4OTQzNiwgMHg5NDM3LAorICAgIDB4OTQzOSwgMHg5NDNCLCAweDk0M0MsIDB4OTQzRCwgMHg5NDQwLCAweDk0NDEsIDB4OTQ0MiwgMHg5NDQzLCAweDk0NDUsCisgICAgMHg5NDQ2LCAweDk0NDcsIDB4OTQ0OCwgMHg5NDQ5LCAweDk0NEIsIDB4OTQ0RCwgMHg5NDRFLCAweDk0NEYsIDB4OTQ1MCwKKyAgICAweDk0NTEsIDB4OTQ1MywgMHg5NDU1LCAweDk0NTYsIDB4OTQ1NywgMHg5NDU4LCAweDk0NTksIDB4OTQ1QSwgMHg5NDVCLAorICAgIDB4OTQ1QywgMHg5NDVELCAweDk0NUUsIDB4OTQ1RiwgMHg5NDYxLCAweDk0NjIsIDB4OTQ2NCwgMHg5NDY2LCAweDk0NjcsCisgICAgMHg5NDY4LCAweDk0NjksIDB4OTQ2QSwgMHg5NDZDLCAweDk0NkUsIDB4OTQ2RiwgMHg5NDcxLCAweDk0NzMsIDB4OTQ3NCwKKyAgICAweDk0NzUsIDB4OTQ3NiwgMHg5NDc4LCAweDk0N0EsIDB4OTQ3QiwgMHg5NDgwLCAweDk0ODEsIDB4OTQ4MiwgMHg5NDgzLAorICAgIDB4OTQ4NCwgMHg5NDkxLCAweDk0OTYsIDB4OTQ5OCwgMHg5NEM3LCAweDk0Q0YsIDB4OTREMywgMHg5NEQ0LCAweDk0REEsCisgICAgMHg5NEU2LCAweDk0RkIsIDB4OTUxQywgMHg5NTIwLCAweDk1MjcsIDB4OTUzMywgMHg5NTNELCAweDk1NDMsIDB4OTU0OCwKKyAgICAweDk1NEIsIDB4OTU1NSwgMHg5NTVBLCAweDk1NjAsIDB4OTU2RSwgMHg5NTc0LCAweDk1NzUsIDB4OTU3OCwgMHg5NTc5LAorICAgIDB4OTU3QSwgMHg5NTdCLCAweDk1N0MsIDB4OTU3RCwgMHg5NTdFLCAweDk1ODEsIDB4OTU4NCwgMHg5NTg1LCAweDk1ODcsCisgICAgMHg5NTg4LCAweDk1OEEsIDB4OTU4RCwgMHg5NTkwLCAweDk1OTIsIDB4OTU5NSwgMHg5NTk2LCAweDk1OTcsIDB4OTU5OSwKKyAgICAweDk1OUEsIDB4OTU5QiwgMHg5NTlDLCAweDk1OUQsIDB4OTU5RSwgMHg5NTlGLCAweDk1QTAsIDB4OTVBMiwgMHg5NUE2LAorICAgIDB4OTVBNywgMHg5NUFBLCAweDk1QUUsIDB4OTVBRiwgMHg5NUIwLCAweDk1QjEsIDB4OTVCMywgMHg5NUI0LCAweDk1QjUsCisgICAgMHg5NUI3LCAweDk1QjgsIDB4OTVCQSwgMHg5NUMwLCAweDk1QzEsIDB4OTVDMiwgMHg5NUM0LCAweDk1QzUsIDB4OTVDNywKKyAgICAweDk1QzksIDB4OTVDRCwgMHg5NUNFLCAweDk1Q0YsIDB4OTVEMSwgMHg5NUQyLCAweDk1RDMsIDB4OTVENywgMHg5NUQ4LAorICAgIDB4OTVEOSwgMHg5NURBLCAweDk1REIsIDB4OTVERCwgMHg5NURGLCAweDk1RTAsIDB4OTVFMywgMHg5NUU0LCAweDk1RTYsCisgICAgMHg5NUU3LCAweDk1RUMsIDB4OTVGRiwgMHg5NjA3LCAweDk2MTMsIDB4OTYxOCwgMHg5NjFCLCAweDk2MUUsIDB4OTYyMCwKKyAgICAweDk2MjMsIDB4OTYyNCwgMHg5NjI1LCAweDk2MjYsIDB4OTYyNywgMHg5NjI4LCAweDk2MjksIDB4OTYyQiwgMHg5NjJDLAorICAgIDB4OTYyRCwgMHg5NjJGLCAweDk2MzAsIDB4OTYzNywgMHg5NjM4LCAweDk2MzksIDB4OTYzQSwgMHg5NjNFLCAweDk2NDEsCisgICAgMHg5NjQzLCAweDk2NEEsIDB4OTY0RSwgMHg5NjRGLCAweDk2NTEsIDB4OTY1MiwgMHg5NjUzLCAweDk2NTYsIDB4OTY1NywKKyAgICAweDk2NTksIDB4OTY1QSwgMHg5NjVDLCAweDk2NUUsIDB4OTY2MCwgMHg5NjY1LCAweDk2NjYsIDB4OTY2QiwgMHg5NjZELAorICAgIDB4OTY2RSwgMHg5NjZGLCAweDk2NzEsIDB4OTY3OSwgMHg5NjdBLCAweDk2N0IsIDB4OTY3QywgMHg5NjdFLCAweDk2N0YsCisgICAgMHg5NjgwLCAweDk2ODEsIDB4OTY4MiwgMHg5NjgzLCAweDk2ODQsIDB4OTY4NywgMHg5Njg5LCAweDk2OEMsIDB4OTY5MSwKKyAgICAweDk2OTIsIDB4OTY5MywgMHg5Njk2LCAweDk2OUEsIDB4OTY5RCwgMHg5NjlFLCAweDk2OUYsIDB4OTZBMCwgMHg5NkExLAorICAgIDB4OTZBMiwgMHg5NkEzLCAweDk2QTQsIDB4OTZBNSwgMHg5NkE2LCAweDk2QTksIDB4OTZBQiwgMHg5NkFDLCAweDk2QUQsCisgICAgMHg5NkFFLCAweDk2QUYsIDB4OTZCMiwgMHg5NkI1LCAweDk2QjcsIDB4OTZCQSwgMHg5NkJGLCAweDk2QzIsIDB4OTZDMywKKyAgICAweDk2QzgsIDB4OTZDQSwgMHg5NkNCLCAweDk2RDAsIDB4OTZEMSwgMHg5NkQzLCAweDk2RDQsIDB4OTZENywgMHg5NkQ4LAorICAgIDB4OTZEQSwgMHg5NkRELCAweDk2REUsIDB4OTZERiwgMHg5NkUxLCAweDk2RTQsIDB4OTZFNSwgMHg5NkU2LCAweDk2RTcsCisgICAgMHg5NkVCLCAweDk2RUMsIDB4OTZFRCwgMHg5NkVFLCAweDk2RjAsIDB4OTZGMSwgMHg5NkY0LCAweDk2RjUsIDB4OTZGOCwKKyAgICAweDk2RkEsIDB4OTZGQywgMHg5NkZELCAweDk2RkYsIDB4OTcwMiwgMHg5NzAzLCAweDk3MDUsIDB4OTcwQSwgMHg5NzBCLAorICAgIDB4OTcwQywgMHg5NzEwLCAweDk3MTEsIDB4OTcxMiwgMHg5NzE0LCAweDk3MTUsIDB4OTcxNywgMHg5NzE4LCAweDk3MTksCisgICAgMHg5NzFBLCAweDk3MUIsIDB4OTcxRCwgMHg5NzFGLCAweDk3MjAsIDB4OTcyMSwgMHg5NzIyLCAweDk3MjMsIDB4OTcyNCwKKyAgICAweDk3MjUsIDB4OTcyNiwgMHg5NzI4LCAweDk3MjksIDB4OTcyQiwgMHg5NzJDLCAweDk3MkUsIDB4OTcyRiwgMHg5NzMxLAorICAgIDB4OTczMywgMHg5NzM0LCAweDk3MzUsIDB4OTczNiwgMHg5NzM3LCAweDk3M0EsIDB4OTczQiwgMHg5NzNDLCAweDk3M0YsCisgICAgMHg5NzQwLCAweDk3NDEsIDB4OTc0MywgMHg5NzQ1LCAweDk3NDYsIDB4OTc0NywgMHg5NzQ5LCAweDk3NEEsIDB4OTc0QiwKKyAgICAweDk3NEMsIDB4OTc0RCwgMHg5NzRFLCAweDk3NEYsIDB4OTc1MCwgMHg5NzUxLCAweDk3NTQsIDB4OTc1NSwgMHg5NzU3LAorICAgIDB4OTc1OCwgMHg5NzVDLCAweDk3NUQsIDB4OTc1RiwgMHg5NzYzLCAweDk3NjQsIDB4OTc2NiwgMHg5NzY3LCAweDk3NkEsCisgICAgMHg5NzZCLCAweDk3NkMsIDB4OTc2RCwgMHg5NzZFLCAweDk3NkYsIDB4OTc3MCwgMHg5NzcxLCAweDk3NzIsIDB4OTc3NSwKKyAgICAweDk3NzcsIDB4OTc3OCwgMHg5Nzc5LCAweDk3N0EsIDB4OTc3QiwgMHg5NzdELCAweDk3N0UsIDB4OTc3RiwgMHg5NzgwLAorICAgIDB4OTc4MSwgMHg5NzgyLCAweDk3ODMsIDB4OTc4NCwgMHg5Nzg2LCAweDk3ODcsIDB4OTc4OCwgMHg5Nzg5LCAweDk3OEEsCisgICAgMHg5NzhDLCAweDk3OEUsIDB4OTc5MCwgMHg5NzkzLCAweDk3OTUsIDB4OTc5NiwgMHg5Nzk3LCAweDk3OTksIDB4OTc5QSwKKyAgICAweDk3OUIsIDB4OTc5QywgMHg5NzlELCAweDk3OUUsIDB4OTc5RiwgMHg5N0ExLCAweDk3QTIsIDB4OTdBNCwgMHg5N0E1LAorICAgIDB4OTdBNywgMHg5N0E4LCAweDk3QTksIDB4OTdBQSwgMHg5N0FDLCAweDk3QUUsIDB4OTdCMCwgMHg5N0IxLCAweDk3QjMsCisgICAgMHg5N0I1LCAweDk3QjYsIDB4OTdCNywgMHg5N0I4LCAweDk3QjksIDB4OTdCQSwgMHg5N0JCLCAweDk3QkMsIDB4OTdCRSwKKyAgICAweDk3QkYsIDB4OTdDMCwgMHg5N0MxLCAweDk3QzIsIDB4OTdDNCwgMHg5N0M1LCAweDk3QzcsIDB4OTdDOCwgMHg5N0NBLAorICAgIDB4OTdDRCwgMHg5N0NFLCAweDk3Q0YsIDB4OTdEMCwgMHg5N0QxLCAweDk3RDIsIDB4OTdENCwgMHg5N0Q1LCAweDk3RDYsCisgICAgMHg5N0Q3LCAweDk3RDgsIDB4OTdEQSwgMHg5N0RCLCAweDk3REQsIDB4OTdERiwgMHg5N0UwLCAweDk3RTEsIDB4OTdFMiwKKyAgICAweDk3RTMsIDB4OTdFNCwgMHg5N0U1LCAweDk3RTgsIDB4OTdFRSwgMHg5N0VGLCAweDk3RjAsIDB4OTdGMSwgMHg5N0YyLAorICAgIDB4OTdGNCwgMHg5N0Y3LCAweDk3RjgsIDB4OTdGOSwgMHg5N0ZBLCAweDk3RkIsIDB4OTdGQywgMHg5N0ZELCAweDk3RkUsCisgICAgMHg5ODAwLCAweDk4MDQsIDB4OTgwOSwgMHg5ODBCLCAweDk4MEQsIDB4OTgxNCwgMHg5ODE1LCAweDk4MTYsIDB4OTgxOSwKKyAgICAweDk4MUEsIDB4OTgxQiwgMHg5ODFELCAweDk4MUUsIDB4OTgxRiwgMHg5ODIwLCAweDk4MjIsIDB4OTgyMywgMHg5ODI1LAorICAgIDB4OTgyNywgMHg5ODI4LCAweDk4MjksIDB4OTgyQSwgMHg5ODJCLCAweDk4MkMsIDB4OTgyRSwgMHg5ODJGLCAweDk4MzEsCisgICAgMHg5ODMyLCAweDk4MzMsIDB4OTgzNCwgMHg5ODM1LCAweDk4MzYsIDB4OTgzOSwgMHg5ODNBLCAweDk4M0MsIDB4OTgzRSwKKyAgICAweDk4M0YsIDB4OTg0MCwgMHg5ODQxLCAweDk4NDIsIDB4OTg0MywgMHg5ODQ0LCAweDk4NDUsIDB4OTg0NywgMHg5ODQ4LAorICAgIDB4OTg0OSwgMHg5ODRBLCAweDk4NEIsIDB4OTg0RiwgMHg5ODUwLCAweDk4NTEsIDB4OTg1MiwgMHg5ODU1LCAweDk4NTYsCisgICAgMHg5ODU3LCAweDk4NUEsIDB4OTg1QywgMHg5ODVELCAweDk4NUYsIDB4OTg2MCwgMHg5ODYxLCAweDk4NjMsIDB4OTg2NCwKKyAgICAweDk4NjYsIDB4OTg2OCwgMHg5ODY5LCAweDk4NkEsIDB4OTg2RCwgMHg5ODZFLCAweDk4NzIsIDB4OTg4QiwgMHg5ODhFLAorICAgIDB4OTg5MiwgMHg5ODk1LCAweDk4OTksIDB4OThBMywgMHg5OEE5LCAweDk4QUEsIDB4OThBQiwgMHg5OEFDLCAweDk4QUQsCisgICAgMHg5OEIwLCAweDk4QjIsIDB4OThCNCwgMHg5OEI1LCAweDk4QjcsIDB4OThCOCwgMHg5OEI5LCAweDk4QkEsIDB4OThCQiwKKyAgICAweDk4QkQsIDB4OThCRSwgMHg5OEJGLCAweDk4QzAsIDB4OThDMSwgMHg5OEMyLCAweDk4QzMsIDB4OThDNSwgMHg5OEM3LAorICAgIDB4OThDOSwgMHg5OENBLCAweDk4Q0IsIDB4OThDQywgMHg5OENELCAweDk4Q0YsIDB4OThEMCwgMHg5OEQ0LCAweDk4RDYsCisgICAgMHg5OEQ3LCAweDk4REMsIDB4OThERCwgMHg5OEUxLCAweDk4RTMsIDB4OThFNCwgMHg5OEU1LCAweDk4RTYsIDB4OThFQywKKyAgICAweDk4RUUsIDB4OThGMCwgMHg5OEYxLCAweDk4RjMsIDB4OThGNSwgMHg5OEY2LCAweDk4RjcsIDB4OThGOCwgMHg5OEY5LAorICAgIDB4OThGQSwgMHg5OEZCLCAweDk4RkYsIDB4OTkwMCwgMHg5OTAxLCAweDk5MDIsIDB4OTkwNCwgMHg5OTA2LCAweDk5MDcsCisgICAgMHg5OTA4LCAweDk5MEIsIDB4OTkwRSwgMHg5OTBGLCAweDk5MTQsIDB4OTkxNSwgMHg5OTE2LCAweDk5MTcsIDB4OTkxOSwKKyAgICAweDk5MUEsIDB4OTkxQywgMHg5OTFELCAweDk5MUYsIDB4OTkyMCwgMHg5OTIyLCAweDk5MjMsIDB4OTkyNCwgMHg5OTI1LAorICAgIDB4OTkyNiwgMHg5OTI3LCAweDk5MjksIDB4OTkyQSwgMHg5OTJCLCAweDk5MkMsIDB4OTkyRCwgMHg5OTJGLCAweDk5MzAsCisgICAgMHg5OTMxLCAweDk5MzIsIDB4OTkzNCwgMHg5OTM1LCAweDk5MzYsIDB4OTkzOCwgMHg5OTM5LCAweDk5M0EsIDB4OTkzQiwKKyAgICAweDk5M0QsIDB4OTk0MCwgMHg5OTQxLCAweDk5NDIsIDB4OTk0NCwgMHg5OTQ2LCAweDk5NDcsIDB4OTk0RCwgMHg5OTRFLAorICAgIDB4OTk0RiwgMHg5OTUwLCAweDk5NTMsIDB4OTk1NiwgMHg5OTU4LCAweDk5NTksIDB4OTk1QSwgMHg5OTVCLCAweDk5NUQsCisgICAgMHg5OTVGLCAweDk5NjAsIDB4OTk2MSwgMHg5OTY0LCAweDk5NjYsIDB4OTk3MywgMHg5OTc4LCAweDk5NzksIDB4OTk3QiwKKyAgICAweDk5N0UsIDB4OTk4MiwgMHg5OTgzLCAweDk5ODksIDB4OTk4QywgMHg5OThFLCAweDk5OUEsIDB4OTk5QiwgMHg5OTlDLAorICAgIDB4OTk5RCwgMHg5OTlFLCAweDk5OUYsIDB4OTlBMCwgMHg5OUExLCAweDk5QTIsIDB4OTlBMywgMHg5OUE0LCAweDk5QTYsCisgICAgMHg5OUE3LCAweDk5QTksIDB4OTlBQSwgMHg5OUFCLCAweDk5QUYsIDB4OTlCMCwgMHg5OUIyLCAweDk5QjUsIDB4OTlCNiwKKyAgICAweDk5QjcsIDB4OTlCOCwgMHg5OUI5LCAweDk5QkEsIDB4OTlCQiwgMHg5OUJDLCAweDk5QkQsIDB4OTlCRSwgMHg5OUJGLAorICAgIDB4OTlDMCwgMHg5OUMyLCAweDk5QzMsIDB4OTlDNCwgMHg5OUM1LCAweDk5QzYsIDB4OTlDNywgMHg5OUM4LCAweDk5QzksCisgICAgMHg5OUNBLCAweDk5Q0IsIDB4OTlDQywgMHg5OUNELCAweDk5Q0UsIDB4OTlDRiwgMHg5OUQzLCAweDk5RDYsIDB4OTlENywKKyAgICAweDk5REEsIDB4OTlEQywgMHg5OURFLCAweDk5RTAsIDB4OTlFMywgMHg5OUU0LCAweDk5RTUsIDB4OTlFNiwgMHg5OUU3LAorICAgIDB4OTlFOCwgMHg5OUU5LCAweDk5RUEsIDB4OTlFQiwgMHg5OUVDLCAweDk5RUUsIDB4OTlFRiwgMHg5OUYwLCAweDk5RjIsCisgICAgMHg5OUYzLCAweDk5RjQsIDB4OTlGNSwgMHg5OUY2LCAweDk5RjcsIDB4OTlGOCwgMHg5OUY5LCAweDk5RkEsIDB4OTlGQiwKKyAgICAweDk5RkMsIDB4OTlGRCwgMHg5OUZFLCAweDlBMDAsIDB4OUEwMiwgMHg5QTAzLCAweDlBMDQsIDB4OUEwNiwgMHg5QTA3LAorICAgIDB4OUEwOCwgMHg5QTA5LCAweDlBMEEsIDB4OUEwQiwgMHg5QTBDLCAweDlBMTAsIDB4OUExMSwgMHg5QTEyLCAweDlBMTMsCisgICAgMHg5QTE0LCAweDlBMTUsIDB4OUExNywgMHg5QTE4LCAweDlBMUEsIDB4OUExQiwgMHg5QTFDLCAweDlBMUQsIDB4OUExRSwKKyAgICAweDlBMUYsIDB4OUEyMCwgMHg5QTIxLCAweDlBMjIsIDB4OUEyMywgMHg5QTI0LCAweDlBMjUsIDB4OUEyNiwgMHg5QTI3LAorICAgIDB4OUEyOCwgMHg5QTI5LCAweDlBMkEsIDB4OUEyQywgMHg5QTJGLCAweDlBMzEsIDB4OUEzMiwgMHg5QTMzLCAweDlBMzQsCisgICAgMHg5QTM1LCAweDlBMzksIDB4OUEzQSwgMHg5QTNCLCAweDlBM0MsIDB4OUEzRCwgMHg5QTNGLCAweDlBNDYsIDB4OUE0NywKKyAgICAweDlBNDgsIDB4OUE0OSwgMHg5QTRCLCAweDlBNEMsIDB4OUE0RSwgMHg5QTUwLCAweDlBNTEsIDB4OUE1MiwgMHg5QTUzLAorICAgIDB4OUE1NCwgMHg5QTU2LCAweDlBNTgsIDB4OUE1OSwgMHg5QTVDLCAweDlBNUQsIDB4OUE1RSwgMHg5QTYwLCAweDlBNjEsCisgICAgMHg5QTYzLCAweDlBNjYsIDB4OUE2NywgMHg5QTY4LCAweDlBNjksIDB4OUE2QiwgMHg5QTcyLCAweDlBODMsIDB4OUE4OSwKKyAgICAweDlBOEQsIDB4OUE4RSwgMHg5QTk0LCAweDlBOTUsIDB4OUE5OSwgMHg5QUE2LCAweDlBQTksIDB4OUFBQSwgMHg5QUFCLAorICAgIDB4OUFBQywgMHg5QUFELCAweDlBQUUsIDB4OUFCMiwgMHg5QUIzLCAweDlBQjQsIDB4OUFCNSwgMHg5QUI5LCAweDlBQkIsCisgICAgMHg5QUJELCAweDlBQkUsIDB4OUFCRiwgMHg5QUMzLCAweDlBQzQsIDB4OUFDNiwgMHg5QUM3LCAweDlBQzgsIDB4OUFDOSwKKyAgICAweDlBQ0EsIDB4OUFDRCwgMHg5QUNFLCAweDlBRDAsIDB4OUFENywgMHg5QUQ5LCAweDlBREEsIDB4OUFEQiwgMHg5QURDLAorICAgIDB4OUFERCwgMHg5QURFLCAweDlBRTAsIDB4OUFFMiwgMHg5QUUzLCAweDlBRTQsIDB4OUFFNSwgMHg5QUU3LCAweDlBRTgsCisgICAgMHg5QUU5LCAweDlBRUEsIDB4OUFFQywgMHg5QUYwLCAweDlBRjEsIDB4OUFGMiwgMHg5QUYzLCAweDlBRjQsIDB4OUFGNSwKKyAgICAweDlBRjYsIDB4OUFGNywgMHg5QUY4LCAweDlBRkEsIDB4OUFGQywgMHg5QUZELCAweDlBRkUsIDB4OUFGRiwgMHg5QjAwLAorICAgIDB4OUIwMSwgMHg5QjAyLCAweDlCMDQsIDB4OUIwNSwgMHg5QjA3LCAweDlCMDksIDB4OUIwQSwgMHg5QjBCLCAweDlCMEMsCisgICAgMHg5QjBFLCAweDlCMTAsIDB4OUIxMSwgMHg5QjEyLCAweDlCMTQsIDB4OUIxNSwgMHg5QjE2LCAweDlCMTcsIDB4OUIxOCwKKyAgICAweDlCMTksIDB4OUIxQiwgMHg5QjFDLCAweDlCMUQsIDB4OUIxRSwgMHg5QjIwLCAweDlCMjEsIDB4OUIyNCwgMHg5QjI2LAorICAgIDB4OUIyOCwgMHg5QjJBLCAweDlCMkIsIDB4OUIyQywgMHg5QjJELCAweDlCMzAsIDB4OUIzMywgMHg5QjM0LCAweDlCMzUsCisgICAgMHg5QjM2LCAweDlCMzcsIDB4OUIzOCwgMHg5QjM5LCAweDlCM0EsIDB4OUIzRCwgMHg5QjNFLCAweDlCM0YsIDB4OUI0MCwKKyAgICAweDlCNDYsIDB4OUI0QSwgMHg5QjRCLCAweDlCNEMsIDB4OUI1MCwgMHg5QjUyLCAweDlCNTMsIDB4OUI1NSwgMHg5QjU2LAorICAgIDB4OUI1NywgMHg5QjU5LCAweDlCNUIsIDB4OUI1QywgMHg5QjVELCAweDlCNUUsIDB4OUI1RiwgMHg5QjYwLCAweDlCNjEsCisgICAgMHg5QjYyLCAweDlCNjMsIDB4OUI2NCwgMHg5QjY1LCAweDlCNjYsIDB4OUI2NywgMHg5QjY4LCAweDlCNjksIDB4OUI2QSwKKyAgICAweDlCNkIsIDB4OUI2QywgMHg5QjZELCAweDlCNkUsIDB4OUI3MCwgMHg5QjcxLCAweDlCNzIsIDB4OUI3MywgMHg5Qjc1LAorICAgIDB4OUI3NiwgMHg5Qjc4LCAweDlCNzksIDB4OUI3QSwgMHg5QjdCLCAweDlCN0MsIDB4OUI3RCwgMHg5QjdFLCAweDlCN0YsCisgICAgMHg5QjgwLCAweDlCODIsIDB4OUI4NCwgMHg5Qjg1LCAweDlCODYsIDB4OUI4NywgMHg5Qjg4LCAweDlCODksIDB4OUI4QSwKKyAgICAweDlCOEIsIDB4OUI4QywgMHg5QjhELCAweDlCOEYsIDB4OUI5MywgMHg5Qjk0LCAweDlCOTUsIDB4OUI5NiwgMHg5Qjk3LAorICAgIDB4OUI5OCwgMHg5Qjk5LCAweDlCOUIsIDB4OUI5QywgMHg5QjlGLCAweDlCQTAsIDB4OUJBMSwgMHg5QkEyLCAweDlCQTMsCisgICAgMHg5QkE0LCAweDlCQTUsIDB4OUJBNiwgMHg5QkE3LCAweDlCQTgsIDB4OUJBOSwgMHg5QkFDLCAweDlCQUYsIDB4OUJCMCwKKyAgICAweDlCQjEsIDB4OUJCMiwgMHg5QkIzLCAweDlCQjQsIDB4OUJCNSwgMHg5QkI2LCAweDlCQjcsIDB4OUJCOCwgMHg5QkI5LAorICAgIDB4OUJCQSwgMHg5QkJCLCAweDlCQkMsIDB4OUJCRCwgMHg5QkJFLCAweDlCQkYsIDB4OUJDMiwgMHg5QkMzLCAweDlCQzQsCisgICAgMHg5QkM1LCAweDlCQzYsIDB4OUJDOCwgMHg5QkNCLCAweDlCQ0MsIDB4OUJDRCwgMHg5QkNFLCAweDlCQ0YsIDB4OUJEMCwKKyAgICAweDlCRDEsIDB4OUJEMiwgMHg5QkQzLCAweDlCRDUsIDB4OUJENywgMHg5QkQ4LCAweDlCRDksIDB4OUJEQSwgMHg5QkRDLAorICAgIDB4OUJERSwgMHg5QkRGLCAweDlCRTAsIDB4OUJFMywgMHg5QkU1LCAweDlCRTYsIDB4OUJFOSwgMHg5QkVDLCAweDlCRUQsCisgICAgMHg5QkVFLCAweDlCRUYsIDB4OUJGMSwgMHg5QkYyLCAweDlCRjMsIDB4OUJGNSwgMHg5QkY2LCAweDlCRjcsIDB4OUJGOCwKKyAgICAweDlCRjksIDB4OUJGQSwgMHg5QkZCLCAweDlCRkMsIDB4OUJGRSwgMHg5QzAwLCAweDlDMDEsIDB4OUMwMiwgMHg5QzAzLAorICAgIDB4OUMwNCwgMHg5QzA1LCAweDlDMDYsIDB4OUMwNywgMHg5QzBBLCAweDlDMEIsIDB4OUMwQywgMHg5QzBFLCAweDlDMEYsCisgICAgMHg5QzExLCAweDlDMTQsIDB4OUMxNSwgMHg5QzE2LCAweDlDMTcsIDB4OUMxOCwgMHg5QzE5LCAweDlDMUEsIDB4OUMxQiwKKyAgICAweDlDMUMsIDB4OUMxRCwgMHg5QzFFLCAweDlDMUYsIDB4OUMyMSwgMHg5QzIyLCAweDlDMjQsIDB4OUMyNiwgMHg5QzI3LAorICAgIDB4OUMyQSwgMHg5QzJCLCAweDlDMkMsIDB4OUMyRSwgMHg5QzJGLCAweDlDMzAsIDB4OUMzNCwgMHg5QzM2LCAweDlDMzgsCisgICAgMHg5QzNBLCAweDlDM0MsIDB4OUMzRCwgMHg5QzNGLCAweDlDNDAsIDB4OUM0MSwgMHg5QzQyLCAweDlDNDMsIDB4OUM0NCwKKyAgICAweDlDNDYsIDB4OUM0NywgMHg5QzRBLCAweDlDNEIsIDB4OUM0QywgMHg5QzRELCAweDlDNEUsIDB4OUM0RiwgMHg5QzUwLAorICAgIDB4OUM1MSwgMHg5QzUzLCAweDlDNTUsIDB4OUM1OSwgMHg5QzVBLCAweDlDNUIsIDB4OUM1QywgMHg5QzVFLCAweDlDNjAsCisgICAgMHg5QzYxLCAweDlDNjIsIDB4OUM2MywgMHg5QzY0LCAweDlDNjUsIDB4OUM2NiwgMHg5QzY4LCAweDlDNjksIDB4OUM2QSwKKyAgICAweDlDNkIsIDB4OUM2QywgMHg5QzZFLCAweDlDNkYsIDB4OUM3MCwgMHg5QzcxLCAweDlDNzIsIDB4OUM3MywgMHg5Qzc0LAorICAgIDB4OUM3NSwgMHg5Qzc2LCAweDlDNzcsIDB4OUM3OSwgMHg5QzdCLCAweDlDN0QsIDB4OUM3RSwgMHg5QzgwLCAweDlDODMsCisgICAgMHg5Qzg0LCAweDlDODksIDB4OUM4QSwgMHg5QzhDLCAweDlDOEYsIDB4OUM5MywgMHg5Qzk2LCAweDlDOTcsIDB4OUM5OCwKKyAgICAweDlDOTksIDB4OUM5RCwgMHg5Q0FBLCAweDlDQUMsIDB4OUNBRiwgMHg5Q0I5LCAweDlDQkUsIDB4OUNCRiwgMHg5Q0MwLAorICAgIDB4OUNDMSwgMHg5Q0MyLCAweDlDQzgsIDB4OUNDOSwgMHg5Q0QxLCAweDlDRDIsIDB4OUNEQSwgMHg5Q0RCLCAweDlDRTAsCisgICAgMHg5Q0UxLCAweDlDRTMsIDB4OUNFNCwgMHg5Q0U2LCAweDlDRTcsIDB4OUNFOCwgMHg5Q0VBLCAweDlDRUIsIDB4OUNFRCwKKyAgICAweDlDRUUsIDB4OUNFRiwgMHg5Q0YwLCAweDlDRjEsIDB4OUNGMiwgMHg5Q0Y1LCAweDlDRjcsIDB4OUNGOCwgMHg5Q0Y5LAorICAgIDB4OUNGQSwgMHg5Q0ZCLCAweDlDRkMsIDB4OUNGRCwgMHg5Q0ZFLCAweDlDRkYsIDB4OUQwMCwgMHg5RDAxLCAweDlEMDIsCisgICAgMHg5RDAzLCAweDlEMDQsIDB4OUQwNSwgMHg5RDA4LCAweDlEMEEsIDB4OUQwQiwgMHg5RDBDLCAweDlEMEQsIDB4OUQwRSwKKyAgICAweDlEMEYsIDB4OUQxMCwgMHg5RDExLCAweDlEMTIsIDB4OUQxMywgMHg5RDE0LCAweDlEMTYsIDB4OUQxNywgMHg5RDE4LAorICAgIDB4OUQxOSwgMHg5RDFBLCAweDlEMUMsIDB4OUQxRSwgMHg5RDIwLCAweDlEMjEsIDB4OUQyMiwgMHg5RDI0LCAweDlEMjUsCisgICAgMHg5RDI3LCAweDlEMjksIDB4OUQyQSwgMHg5RDJCLCAweDlEMkMsIDB4OUQyRCwgMHg5RDJFLCAweDlEMzEsIDB4OUQzMiwKKyAgICAweDlEMzMsIDB4OUQzNCwgMHg5RDM1LCAweDlEMzYsIDB4OUQzNywgMHg5RDM4LCAweDlEMzksIDB4OUQzQSwgMHg5RDNDLAorICAgIDB4OUQzRCwgMHg5RDNFLCAweDlENDAsIDB4OUQ0MSwgMHg5RDQzLCAweDlENDQsIDB4OUQ0NSwgMHg5RDQ2LCAweDlENDcsCisgICAgMHg5RDQ4LCAweDlENDksIDB4OUQ0QSwgMHg5RDRCLCAweDlENEMsIDB4OUQ0RCwgMHg5RDRFLCAweDlENEYsIDB4OUQ1MCwKKyAgICAweDlENTQsIDB4OUQ1NSwgMHg5RDU2LCAweDlENTcsIDB4OUQ1OCwgMHg5RDU5LCAweDlENUEsIDB4OUQ1QiwgMHg5RDVFLAorICAgIDB4OUQ1RiwgMHg5RDYyLCAweDlENjMsIDB4OUQ2NCwgMHg5RDY1LCAweDlENjYsIDB4OUQ2NywgMHg5RDY4LCAweDlENjksCisgICAgMHg5RDZCLCAweDlENkQsIDB4OUQ2RSwgMHg5RDcwLCAweDlENzEsIDB4OUQ3MywgMHg5RDc0LCAweDlENzUsIDB4OUQ3NiwKKyAgICAweDlENzcsIDB4OUQ3OCwgMHg5RDc5LCAweDlEN0EsIDB4OUQ3QiwgMHg5RDdDLCAweDlEN0QsIDB4OUQ3RSwgMHg5RDdGLAorICAgIDB4OUQ4MCwgMHg5RDgxLCAweDlEODIsIDB4OUQ4MywgMHg5RDg0LCAweDlEODUsIDB4OUQ4NiwgMHg5RDg4LCAweDlEOEEsCisgICAgMHg5RDhCLCAweDlEOEMsIDB4OUQ4RCwgMHg5RDhFLCAweDlEOEYsIDB4OUQ5MCwgMHg5RDkxLCAweDlEOTIsIDB4OUQ5NCwKKyAgICAweDlEOTUsIDB4OUQ5NiwgMHg5RDk3LCAweDlEOTksIDB4OUQ5QiwgMHg5RDlDLCAweDlEOUQsIDB4OUQ5RSwgMHg5RDlGLAorICAgIDB4OURBMCwgMHg5REExLCAweDlEQTIsIDB4OURBMywgMHg5REE0LCAweDlEQTYsIDB4OURBNywgMHg5REE4LCAweDlEQUEsCisgICAgMHg5REFCLCAweDlEQUMsIDB4OURBRCwgMHg5REFFLCAweDlEQjAsIDB4OURCMSwgMHg5REIyLCAweDlEQjMsIDB4OURCNSwKKyAgICAweDlEQjYsIDB4OURCNywgMHg5REI4LCAweDlEQjksIDB4OURCQSwgMHg5REJELCAweDlEQkUsIDB4OURCRiwgMHg5REMxLAorICAgIDB4OURDMywgMHg5REM1LCAweDlEQzYsIDB4OURDNywgMHg5REM4LCAweDlEQzksIDB4OURDQSwgMHg5RENCLCAweDlEQ0MsCisgICAgMHg5RENELCAweDlEQ0UsIDB4OURDRiwgMHg5REQwLCAweDlERDEsIDB4OUREMiwgMHg5REQ0LCAweDlERDUsIDB4OURENiwKKyAgICAweDlERDgsIDB4OUREQiwgMHg5RERDLCAweDlEREQsIDB4OURERSwgMHg5RERGLCAweDlERTAsIDB4OURFMSwgMHg5REUyLAorICAgIDB4OURFMywgMHg5REU0LCAweDlERTcsIDB4OURFOCwgMHg5REU5LCAweDlERUEsIDB4OURFQiwgMHg5REVDLCAweDlERUQsCisgICAgMHg5REVFLCAweDlERjAsIDB4OURGMSwgMHg5REY0LCAweDlERjUsIDB4OURGNiwgMHg5REY3LCAweDlERkIsIDB4OURGQywKKyAgICAweDlERkQsIDB4OURGRSwgMHg5REZGLCAweDlFMDAsIDB4OUUwMSwgMHg5RTAyLCAweDlFMDMsIDB4OUUwNCwgMHg5RTA1LAorICAgIDB4OUUwNiwgMHg5RTA3LCAweDlFMDgsIDB4OUUwOSwgMHg5RTBBLCAweDlFMEIsIDB4OUUwRCwgMHg5RTBFLCAweDlFMEYsCisgICAgMHg5RTEwLCAweDlFMTEsIDB4OUUxMiwgMHg5RTEzLCAweDlFMTQsIDB4OUUxNiwgMHg5RTE3LCAweDlFMTgsIDB4OUUxOSwKKyAgICAweDlFMUMsIDB4OUUyNCwgMHg5RTI3LCAweDlFMkUsIDB4OUUzMCwgMHg5RTM0LCAweDlFM0IsIDB4OUUzQywgMHg5RTQwLAorICAgIDB4OUU0RCwgMHg5RTUwLCAweDlFNTIsIDB4OUU1MywgMHg5RTU0LCAweDlFNTYsIDB4OUU1OSwgMHg5RTVELCAweDlFNUYsCisgICAgMHg5RTYwLCAweDlFNjEsIDB4OUU2MiwgMHg5RTY1LCAweDlFNkUsIDB4OUU2RiwgMHg5RTcyLCAweDlFNzQsIDB4OUU3NiwKKyAgICAweDlFNzcsIDB4OUU3OCwgMHg5RTdCLCAweDlFODAsIDB4OUU4MSwgMHg5RTgzLCAweDlFODQsIDB4OUU4NSwgMHg5RTg2LAorICAgIDB4OUU4OSwgMHg5RThBLCAweDlFOEMsIDB4OUU4RCwgMHg5RThFLCAweDlFOEYsIDB4OUU5MCwgMHg5RTkxLCAweDlFOTQsCisgICAgMHg5RTk1LCAweDlFOTYsIDB4OUU5OCwgMHg5RTk5LCAweDlFOUEsIDB4OUU5QiwgMHg5RTlDLCAweDlFOUUsIDB4OUVBMCwKKyAgICAweDlFQTEsIDB4OUVBMiwgMHg5RUEzLCAweDlFQTQsIDB4OUVBNywgMHg5RUE4LCAweDlFQUEsIDB4OUVBQiwgMHg5RUFDLAorICAgIDB4OUVBRCwgMHg5RUFFLCAweDlFQjAsIDB4OUVCMSwgMHg5RUIyLCAweDlFQjMsIDB4OUVCNiwgMHg5RUI3LCAweDlFQjksCisgICAgMHg5RUJBLCAweDlFQkMsIDB4OUVCRiwgMHg5RUMwLCAweDlFQzEsIDB4OUVDMiwgMHg5RUMzLCAweDlFQzUsIDB4OUVDNiwKKyAgICAweDlFQzcsIDB4OUVDOCwgMHg5RUNBLCAweDlFQ0IsIDB4OUVEMCwgMHg5RUQyLCAweDlFRDMsIDB4OUVENSwgMHg5RUQ2LAorICAgIDB4OUVENywgMHg5RUQ5LCAweDlFREEsIDB4OUVFMSwgMHg5RUUzLCAweDlFRTQsIDB4OUVFNiwgMHg5RUVCLCAweDlFRUMsCisgICAgMHg5RUVELCAweDlFRUUsIDB4OUVGMCwgMHg5RUYxLCAweDlFRjMsIDB4OUVGNSwgMHg5RUY2LCAweDlFRjgsIDB4OUVGQSwKKyAgICAweDlGMDAsIDB4OUYwMSwgMHg5RjAyLCAweDlGMDMsIDB4OUYwNCwgMHg5RjA1LCAweDlGMDYsIDB4OUYwNywgMHg5RjA4LAorICAgIDB4OUYwQSwgMHg5RjBDLCAweDlGMEYsIDB4OUYxMSwgMHg5RjEyLCAweDlGMTQsIDB4OUYxNiwgMHg5RjE4LCAweDlGMUEsCisgICAgMHg5RjFCLCAweDlGMUMsIDB4OUYxRCwgMHg5RjFFLCAweDlGMUYsIDB4OUYyMSwgMHg5RjIzLCAweDlGMjQsIDB4OUYyNSwKKyAgICAweDlGMjYsIDB4OUYyNywgMHg5RjI4LCAweDlGMjksIDB4OUYyQSwgMHg5RjJCLCAweDlGMkQsIDB4OUYyRSwgMHg5RjMwLAorICAgIDB4OUYzMSwgMHg5RjMyLCAweDlGMzMsIDB4OUYzNCwgMHg5RjM1LCAweDlGMzYsIDB4OUYzOCwgMHg5RjNBLCAweDlGM0MsCisgICAgMHg5RjNGLCAweDlGNDAsIDB4OUY0MSwgMHg5RjQyLCAweDlGNDMsIDB4OUY0NSwgMHg5RjQ2LCAweDlGNDcsIDB4OUY0OCwKKyAgICAweDlGNDksIDB4OUY0QywgMHg5RjRELCAweDlGNEUsIDB4OUY1MywgMHg5RjU1LCAweDlGNTYsIDB4OUY1NywgMHg5RjU4LAorICAgIDB4OUY1QSwgMHg5RjVCLCAweDlGNUQsIDB4OUY1RSwgMHg5RjYyLCAweDlGNjQsIDB4OUY2NSwgMHg5RjY3LCAweDlGNjgsCisgICAgMHg5RjY5LCAweDlGNkIsIDB4OUY2RCwgMHg5RjZFLCAweDlGNkYsIDB4OUY3MCwgMHg5RjcxLCAweDlGNzMsIDB4OUY3NCwKKyAgICAweDlGNzUsIDB4OUY3NiwgMHg5Rjc4LCAweDlGNzksIDB4OUY3QSwgMHg5RjdCLCAweDlGN0MsIDB4OUY3RCwgMHg5RjdFLAorICAgIDB4OUY4MSwgMHg5RjgyLCAweDlGOEUsIDB4OUY4RiwgMHg5RjkxLCAweDlGOTIsIDB4OUY5MywgMHg5Rjk2LCAweDlGOTcsCisgICAgMHg5Rjk4LCAweDlGOUQsIDB4OUY5RSwgMHg5RkExLCAweDlGQTIsIDB4OUZBMywgMHg5RkE0LCAweDlGQTUsIDB4RjkyQywKKyAgICAweEZBMEQsIDB4RkEwRSwgMHhGQTBGLCAweEZBMTEsIDB4RkExMywgMHhGQTE0LCAweEZBMTgsIDB4RkExRiwgMHhGQTIwLAorICAgIDB4RkEyMSwgMHhGQTIzLCAweEZBMjQsIDB4RkEyNywgMHhGQTI4LCAweEZBMjksIDB4MkU4MSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDJFODQsIDB4MzQ3MywgMHgzNDQ3LCAweDJFODgsIDB4MkU4QiwgMHg5RkI0LCAweDM1OUUsIDB4MzYxQSwKKyAgICAweDM2MEUsIDB4MkU4QywgMHgyRTk3LCAweDM5NkUsIDB4MzkxOCwgMHg5RkI1LCAweDM5Q0YsIDB4MzlERiwgMHgzQTczLAorICAgIDB4MzlEMCwgMHg5RkI2LCAweDlGQjcsIDB4M0I0RSwgMHgzQzZFLCAweDNDRTAsIDB4MkVBNywgMHgwMDAwLCAweDlGQjgsCisgICAgMHgyRUFBLCAweDQwNTYsIDB4NDE1RiwgMHgyRUFFLCAweDQzMzcsIDB4MkVCMywgMHgyRUI2LCAweDJFQjcsIDB4MDAwMCwKKyAgICAweDQzQjEsIDB4NDNBQywgMHgyRUJCLCAweDQzREQsIDB4NDRENiwgMHg0NjYxLCAweDQ2NEMsIDB4OUZCOSwgMHg0NzIzLAorICAgIDB4NDcyOSwgMHg0NzdDLCAweDQ3OEQsIDB4MkVDQSwgMHg0OTQ3LCAweDQ5N0EsIDB4NDk3RCwgMHg0OTgyLCAweDQ5ODMsCisgICAgMHg0OTg1LCAweDQ5ODYsIDB4NDk5RiwgMHg0OTlCLCAweDQ5QjcsIDB4NDlCNiwgMHg5RkJBLCAweDAwMDAsIDB4NENBMywKKyAgICAweDRDOUYsIDB4NENBMCwgMHg0Q0ExLCAweDRDNzcsIDB4NENBMiwgMHg0RDEzLCAweDREMTQsIDB4NEQxNSwgMHg0RDE2LAorICAgIDB4NEQxNywgMHg0RDE4LCAweDREMTksIDB4NERBRSwgMHg5RkJCLCAweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsCisgICAgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LCAweDAwMjgsIDB4MDAyOSwgMHgwMDJBLCAweDAwMkIsIDB4MDAyQywKKyAgICAweDAwMkQsIDB4MDAyRSwgMHgwMDJGLCAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LAorICAgIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgwMDNBLCAweDAwM0IsIDB4MDAzQywgMHgwMDNELCAweDAwM0UsCisgICAgMHgwMDNGLCAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKyAgICAweDAwNDgsIDB4MDA0OSwgMHgwMDRBLCAweDAwNEIsIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLAorICAgIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksCisgICAgMHgwMDVBLCAweDAwNUIsIDB4MDA1QywgMHgwMDVELCAweDAwNUUsIDB4MDA1RiwgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwKKyAgICAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLAorICAgIDB4MDA2QywgMHgwMDZELCAweDAwNkUsIDB4MDA2RiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsCisgICAgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDdCLCAweDAwN0MsIDB4MDA3RCwKKyAgICAweDAwN0UsIDB4MDBGQywgMHgwMEE5LCAweDIxMjIsIDB4MjAyNiwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LAorICAgIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsIDB4MDAyOCwgMHgwMDI5LCAweDAwMkEsIDB4MDAyQiwgMHgwMDJDLCAweDAwMkQsCisgICAgMHgwMDJFLCAweDAwMkYsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwKKyAgICAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLCAweDAwM0QsIDB4MDAzRSwgMHgwMDNGLAorICAgIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LCAweDAwNDgsCisgICAgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLCAweDAwNTAsIDB4MDA1MSwKKyAgICAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwgMHgwMDVBLAorICAgIDB4MDA1QiwgMHgwMDVDLCAweDAwNUQsIDB4MDA1RSwgMHgwMDVGLCAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCisgICAgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywKKyAgICAweDAwNkQsIDB4MDA2RSwgMHgwMDZGLCAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LAorICAgIDB4MDA3NiwgMHgwMDc3LCAweDAwNzgsIDB4MDA3OSwgMHgwMDdBLCAweDAwN0IsIDB4MDA3QywgMHgwMDdELCAweDAwN0UsCisgICAgMHgwMTAxLCAweDAwRTEsIDB4MDFDRSwgMHgwMEUwLCAweDAxMTMsIDB4MDBFOSwgMHgwMTFCLCAweDAwRTgsIDB4MDEyQiwKKyAgICAweDAwRUQsIDB4MDFEMCwgMHgwMEVDLCAweDAxNEQsIDB4MDBGMywgMHgwMUQyLCAweDAwRjIsIDB4MDE2QiwgMHgwMEZBLAorICAgIDB4MDFENCwgMHgwMEY5LCAweDAxRDYsIDB4MDFEOCwgMHgwMURBLCAweDAxREMsIDB4MDBGQywgMHgwMEVBLCAweDAyNTEsCisgICAgMHgxRTNGLCAweDAxNDQsIDB4MDE0OCwgMHgwMUY5LCAweDAyNjEsIDB4MDAyMCwgMHgyMEFDLCAweDAwQTUsIDB4MjBBQywKKyAgICAweDAwMjQsIDB4MzAzRiwgMHgyMEFDLCAweDMwNDEsIDB4MzA0NywgMHgzMDQzLCAweDMwNEIsIDB4MzA0QiwgMHgzMDUxLAorICAgIDB4MzA1MSwgMHgzMDUzLCAweDMwNTMsIDB4MzA0OSwgMHgzMDY0LCAweDMwNDUsIDB4MzA4RSwgMHgzMDgzLCAweDMwODcsCisgICAgMHgzMDg1LCAweDMwOTQsIDB4MzBBMSwgMHgzMEE3LCAweDMwQTMsIDB4MzBGNSwgMHgzMEY2LCAweDMwQjMsIDB4MzBCMywKKyAgICAweDMwQTksIDB4MzBDMywgMHgzMEE1LCAweDMwRUUsIDB4MzBFMywgMHgzMEU3LCAweDMwRTUsIDB4MzBGNywgMHgzMEY5LAorICAgIDB4MzBGOCwgMHgzMEZBLCAweDMwRkMsIDB4MzAzMywgMHgzMDM0LCAweDMwMzUsIDB4MzAzOCwgMHgzMDM5LCAweDMwM0EsCisgICAgMHgzMTJBLCAweDMxMkIsIDB4MzEyQywgMHgzMUEwLCAweDMxQTEsIDB4MzFBMiwgMHgzMUEzLCAweDMxQTQsIDB4MzFBNSwKKyAgICAweDMxQTYsIDB4MzFBNywgMHgzMUE4LCAweDMxQTksIDB4MzFBQSwgMHgzMUFCLCAweDMxQUMsIDB4MzFBRCwgMHgzMUFFLAorICAgIDB4MzFBRiwgMHgzMUIwLCAweDMxQjEsIDB4MzFCMiwgMHgzMUIzLCAweDMxQjQsIDB4MzFCNSwgMHgzMUI2LCAweDMxQjcsCisgICAgMHgyRTgwLCAweDJFODIsIDB4MkU4MywgMHgyRTg1LCAweDJFODYsIDB4MkU4NywgMHgyRTg5LCAweDJFOEEsIDB4MkU4RCwKKyAgICAweDJFOEUsIDB4MkU4RiwgMHgyRTkwLCAweDJFOTEsIDB4MkU5MiwgMHgyRTkzLCAweDJFOTQsIDB4MkU5NSwgMHgyRTk2LAorICAgIDB4MkU5OCwgMHgyRTk5LCAweDJFOUIsIDB4MkU5QywgMHgyRTlELCAweDJFOUUsIDB4MkU5RiwgMHgyRUEwLCAweDJFQTEsCisgICAgMHgyRUEyLCAweDJFQTMsIDB4MkVBNCwgMHgyRUE1LCAweDJFQTYsIDB4MkVBOCwgMHgyRUE5LCAweDJFQUIsIDB4MkVBQywKKyAgICAweDJFQUQsIDB4MkVBRiwgMHgyRUIwLCAweDJFQjEsIDB4MkVCMiwgMHgyRUI0LCAweDJFQjUsIDB4MkVCOCwgMHgyRUI5LAorICAgIDB4MkVCQSwgMHgyRUJDLCAweDJFQkQsIDB4MkVCRSwgMHgyRUJGLCAweDJFQzAsIDB4MkVDMSwgMHgyRUMyLCAweDJFQzMsCisgICAgMHgyRUM0LCAweDJFQzUsIDB4MkVDNiwgMHgyRUM3LCAweDJFQzgsIDB4MkVDOSwgMHgyRUNCLCAweDJFQ0MsIDB4MkVDRCwKKyAgICAweDJFQ0UsIDB4MkVDRiwgMHgyRUQwLCAweDJFRDEsIDB4MkVEMiwgMHgyRUQzLCAweDJFRDQsIDB4MkVENSwgMHgyRUQ2LAorICAgIDB4MkVENywgMHgyRUQ4LCAweDJFRDksIDB4MkVEQSwgMHgyRURCLCAweDJFREMsIDB4MkVERCwgMHgyRURFLCAweDJFREYsCisgICAgMHgyRUUwLCAweDJFRTEsIDB4MkVFMiwgMHgyRUUzLCAweDJFRTQsIDB4MkVFNSwgMHgyRUU2LCAweDJFRTcsIDB4MkVFOCwKKyAgICAweDJFRTksIDB4MkVFQSwgMHgyRUVCLCAweDJFRUMsIDB4MkVFRCwgMHgyRUVFLCAweDJFRUYsIDB4MkVGMCwgMHgyRUYxLAorICAgIDB4MkVGMiwgMHgyRUYzLCAweDM0MDAsIDB4MzQwMSwgMHgzNDAyLCAweDM0MDMsIDB4MzQwNCwgMHgzNDA1LCAweDM0MDYsCisgICAgMHgzNDA3LCAweDM0MDgsIDB4MzQwOSwgMHgzNDBBLCAweDM0MEIsIDB4MzQwQywgMHgzNDBELCAweDM0MEUsIDB4MzQwRiwKKyAgICAweDM0MTAsIDB4MzQxMSwgMHgzNDEyLCAweDM0MTMsIDB4MzQxNCwgMHgzNDE1LCAweDM0MTYsIDB4MzQxNywgMHgzNDE4LAorICAgIDB4MzQxOSwgMHgzNDFBLCAweDM0MUIsIDB4MzQxQywgMHgzNDFELCAweDM0MUUsIDB4MzQxRiwgMHgzNDIwLCAweDM0MjEsCisgICAgMHgzNDIyLCAweDM0MjMsIDB4MzQyNCwgMHgzNDI1LCAweDM0MjYsIDB4MzQyNywgMHgzNDI4LCAweDM0MjksIDB4MzQyQSwKKyAgICAweDM0MkIsIDB4MzQyQywgMHgzNDJELCAweDM0MkUsIDB4MzQyRiwgMHgzNDMwLCAweDM0MzEsIDB4MzQzMiwgMHgzNDMzLAorICAgIDB4MzQzNCwgMHgzNDM1LCAweDM0MzYsIDB4MzQzNywgMHgzNDM4LCAweDM0MzksIDB4MzQzQSwgMHgzNDNCLCAweDM0M0MsCisgICAgMHgzNDNELCAweDM0M0UsIDB4MzQzRiwgMHgzNDQwLCAweDM0NDEsIDB4MzQ0MiwgMHgzNDQzLCAweDM0NDQsIDB4MzQ0NSwKKyAgICAweDM0NDYsIDB4MzQ0OCwgMHgzNDQ5LCAweDM0NEEsIDB4MzQ0QiwgMHgzNDRDLCAweDM0NEQsIDB4MzQ0RSwgMHgzNDRGLAorICAgIDB4MzQ1MCwgMHgzNDUxLCAweDM0NTIsIDB4MzQ1MywgMHgzNDU0LCAweDM0NTUsIDB4MzQ1NiwgMHgzNDU3LCAweDM0NTgsCisgICAgMHgzNDU5LCAweDM0NUEsIDB4MzQ1QiwgMHgzNDVDLCAweDM0NUQsIDB4MzQ1RSwgMHgzNDVGLCAweDM0NjAsIDB4MzQ2MSwKKyAgICAweDM0NjIsIDB4MzQ2MywgMHgzNDY0LCAweDM0NjUsIDB4MzQ2NiwgMHgzNDY3LCAweDM0NjgsIDB4MzQ2OSwgMHgzNDZBLAorICAgIDB4MzQ2QiwgMHgzNDZDLCAweDM0NkQsIDB4MzQ2RSwgMHgzNDZGLCAweDM0NzAsIDB4MzQ3MSwgMHgzNDcyLCAweDM0NzQsCisgICAgMHgzNDc1LCAweDM0NzYsIDB4MzQ3NywgMHgzNDc4LCAweDM0NzksIDB4MzQ3QSwgMHgzNDdCLCAweDM0N0MsIDB4MzQ3RCwKKyAgICAweDM0N0UsIDB4MzQ3RiwgMHgzNDgwLCAweDM0ODEsIDB4MzQ4MiwgMHgzNDgzLCAweDM0ODQsIDB4MzQ4NSwgMHgzNDg2LAorICAgIDB4MzQ4NywgMHgzNDg4LCAweDM0ODksIDB4MzQ4QSwgMHgzNDhCLCAweDM0OEMsIDB4MzQ4RCwgMHgzNDhFLCAweDM0OEYsCisgICAgMHgzNDkwLCAweDM0OTEsIDB4MzQ5MiwgMHgzNDkzLCAweDM0OTQsIDB4MzQ5NSwgMHgzNDk2LCAweDM0OTcsIDB4MzQ5OCwKKyAgICAweDM0OTksIDB4MzQ5QSwgMHgzNDlCLCAweDM0OUMsIDB4MzQ5RCwgMHgzNDlFLCAweDM0OUYsIDB4MzRBMCwgMHgzNEExLAorICAgIDB4MzRBMiwgMHgzNEEzLCAweDM0QTQsIDB4MzRBNSwgMHgzNEE2LCAweDM0QTcsIDB4MzRBOCwgMHgzNEE5LCAweDM0QUEsCisgICAgMHgzNEFCLCAweDM0QUMsIDB4MzRBRCwgMHgzNEFFLCAweDM0QUYsIDB4MzRCMCwgMHgzNEIxLCAweDM0QjIsIDB4MzRCMywKKyAgICAweDM0QjQsIDB4MzRCNSwgMHgzNEI2LCAweDM0QjcsIDB4MzRCOCwgMHgzNEI5LCAweDM0QkEsIDB4MzRCQiwgMHgzNEJDLAorICAgIDB4MzRCRCwgMHgzNEJFLCAweDM0QkYsIDB4MzRDMCwgMHgzNEMxLCAweDM0QzIsIDB4MzRDMywgMHgzNEM0LCAweDM0QzUsCisgICAgMHgzNEM2LCAweDM0QzcsIDB4MzRDOCwgMHgzNEM5LCAweDM0Q0EsIDB4MzRDQiwgMHgzNENDLCAweDM0Q0QsIDB4MzRDRSwKKyAgICAweDM0Q0YsIDB4MzREMCwgMHgzNEQxLCAweDM0RDIsIDB4MzREMywgMHgzNEQ0LCAweDM0RDUsIDB4MzRENiwgMHgzNEQ3LAorICAgIDB4MzREOCwgMHgzNEQ5LCAweDM0REEsIDB4MzREQiwgMHgzNERDLCAweDM0REQsIDB4MzRERSwgMHgzNERGLCAweDM0RTAsCisgICAgMHgzNEUxLCAweDM0RTIsIDB4MzRFMywgMHgzNEU0LCAweDM0RTUsIDB4MzRFNiwgMHgzNEU3LCAweDM0RTgsIDB4MzRFOSwKKyAgICAweDM0RUEsIDB4MzRFQiwgMHgzNEVDLCAweDM0RUQsIDB4MzRFRSwgMHgzNEVGLCAweDM0RjAsIDB4MzRGMSwgMHgzNEYyLAorICAgIDB4MzRGMywgMHgzNEY0LCAweDM0RjUsIDB4MzRGNiwgMHgzNEY3LCAweDM0RjgsIDB4MzRGOSwgMHgzNEZBLCAweDM0RkIsCisgICAgMHgzNEZDLCAweDM0RkQsIDB4MzRGRSwgMHgzNEZGLCAweDM1MDAsIDB4MzUwMSwgMHgzNTAyLCAweDM1MDMsIDB4MzUwNCwKKyAgICAweDM1MDUsIDB4MzUwNiwgMHgzNTA3LCAweDM1MDgsIDB4MzUwOSwgMHgzNTBBLCAweDM1MEIsIDB4MzUwQywgMHgzNTBELAorICAgIDB4MzUwRSwgMHgzNTBGLCAweDM1MTAsIDB4MzUxMSwgMHgzNTEyLCAweDM1MTMsIDB4MzUxNCwgMHgzNTE1LCAweDM1MTYsCisgICAgMHgzNTE3LCAweDM1MTgsIDB4MzUxOSwgMHgzNTFBLCAweDM1MUIsIDB4MzUxQywgMHgzNTFELCAweDM1MUUsIDB4MzUxRiwKKyAgICAweDM1MjAsIDB4MzUyMSwgMHgzNTIyLCAweDM1MjMsIDB4MzUyNCwgMHgzNTI1LCAweDM1MjYsIDB4MzUyNywgMHgzNTI4LAorICAgIDB4MzUyOSwgMHgzNTJBLCAweDM1MkIsIDB4MzUyQywgMHgzNTJELCAweDM1MkUsIDB4MzUyRiwgMHgzNTMwLCAweDM1MzEsCisgICAgMHgzNTMyLCAweDM1MzMsIDB4MzUzNCwgMHgzNTM1LCAweDM1MzYsIDB4MzUzNywgMHgzNTM4LCAweDM1MzksIDB4MzUzQSwKKyAgICAweDM1M0IsIDB4MzUzQywgMHgzNTNELCAweDM1M0UsIDB4MzUzRiwgMHgzNTQwLCAweDM1NDEsIDB4MzU0MiwgMHgzNTQzLAorICAgIDB4MzU0NCwgMHgzNTQ1LCAweDM1NDYsIDB4MzU0NywgMHgzNTQ4LCAweDM1NDksIDB4MzU0QSwgMHgzNTRCLCAweDM1NEMsCisgICAgMHgzNTRELCAweDM1NEUsIDB4MzU0RiwgMHgzNTUwLCAweDM1NTEsIDB4MzU1MiwgMHgzNTUzLCAweDM1NTQsIDB4MzU1NSwKKyAgICAweDM1NTYsIDB4MzU1NywgMHgzNTU4LCAweDM1NTksIDB4MzU1QSwgMHgzNTVCLCAweDM1NUMsIDB4MzU1RCwgMHgzNTVFLAorICAgIDB4MzU1RiwgMHgzNTYwLCAweDM1NjEsIDB4MzU2MiwgMHgzNTYzLCAweDM1NjQsIDB4MzU2NSwgMHgzNTY2LCAweDM1NjcsCisgICAgMHgzNTY4LCAweDM1NjksIDB4MzU2QSwgMHgzNTZCLCAweDM1NkMsIDB4MzU2RCwgMHgzNTZFLCAweDM1NkYsIDB4MzU3MCwKKyAgICAweDM1NzEsIDB4MzU3MiwgMHgzNTczLCAweDM1NzQsIDB4MzU3NSwgMHgzNTc2LCAweDM1NzcsIDB4MzU3OCwgMHgzNTc5LAorICAgIDB4MzU3QSwgMHgzNTdCLCAweDM1N0MsIDB4MzU3RCwgMHgzNTdFLCAweDM1N0YsIDB4MzU4MCwgMHgzNTgxLCAweDM1ODIsCisgICAgMHgzNTgzLCAweDM1ODQsIDB4MzU4NSwgMHgzNTg2LCAweDM1ODcsIDB4MzU4OCwgMHgzNTg5LCAweDM1OEEsIDB4MzU4QiwKKyAgICAweDM1OEMsIDB4MzU4RCwgMHgzNThFLCAweDM1OEYsIDB4MzU5MCwgMHgzNTkxLCAweDM1OTIsIDB4MzU5MywgMHgzNTk0LAorICAgIDB4MzU5NSwgMHgzNTk2LCAweDM1OTcsIDB4MzU5OCwgMHgzNTk5LCAweDM1OUEsIDB4MzU5QiwgMHgzNTlDLCAweDM1OUQsCisgICAgMHgzNTlGLCAweDM1QTAsIDB4MzVBMSwgMHgzNUEyLCAweDM1QTMsIDB4MzVBNCwgMHgzNUE1LCAweDM1QTYsIDB4MzVBNywKKyAgICAweDM1QTgsIDB4MzVBOSwgMHgzNUFBLCAweDM1QUIsIDB4MzVBQywgMHgzNUFELCAweDM1QUUsIDB4MzVBRiwgMHgzNUIwLAorICAgIDB4MzVCMSwgMHgzNUIyLCAweDM1QjMsIDB4MzVCNCwgMHgzNUI1LCAweDM1QjYsIDB4MzVCNywgMHgzNUI4LCAweDM1QjksCisgICAgMHgzNUJBLCAweDM1QkIsIDB4MzVCQywgMHgzNUJELCAweDM1QkUsIDB4MzVCRiwgMHgzNUMwLCAweDM1QzEsIDB4MzVDMiwKKyAgICAweDM1QzMsIDB4MzVDNCwgMHgzNUM1LCAweDM1QzYsIDB4MzVDNywgMHgzNUM4LCAweDM1QzksIDB4MzVDQSwgMHgzNUNCLAorICAgIDB4MzVDQywgMHgzNUNELCAweDM1Q0UsIDB4MzVDRiwgMHgzNUQwLCAweDM1RDEsIDB4MzVEMiwgMHgzNUQzLCAweDM1RDQsCisgICAgMHgzNUQ1LCAweDM1RDYsIDB4MzVENywgMHgzNUQ4LCAweDM1RDksIDB4MzVEQSwgMHgzNURCLCAweDM1REMsIDB4MzVERCwKKyAgICAweDM1REUsIDB4MzVERiwgMHgzNUUwLCAweDM1RTEsIDB4MzVFMiwgMHgzNUUzLCAweDM1RTQsIDB4MzVFNSwgMHgzNUU2LAorICAgIDB4MzVFNywgMHgzNUU4LCAweDM1RTksIDB4MzVFQSwgMHgzNUVCLCAweDM1RUMsIDB4MzVFRCwgMHgzNUVFLCAweDM1RUYsCisgICAgMHgzNUYwLCAweDM1RjEsIDB4MzVGMiwgMHgzNUYzLCAweDM1RjQsIDB4MzVGNSwgMHgzNUY2LCAweDM1RjcsIDB4MzVGOCwKKyAgICAweDM1RjksIDB4MzVGQSwgMHgzNUZCLCAweDM1RkMsIDB4MzVGRCwgMHgzNUZFLCAweDM1RkYsIDB4MzYwMCwgMHgzNjAxLAorICAgIDB4MzYwMiwgMHgzNjAzLCAweDM2MDQsIDB4MzYwNSwgMHgzNjA2LCAweDM2MDcsIDB4MzYwOCwgMHgzNjA5LCAweDM2MEEsCisgICAgMHgzNjBCLCAweDM2MEMsIDB4MzYwRCwgMHgzNjBGLCAweDM2MTAsIDB4MzYxMSwgMHgzNjEyLCAweDM2MTMsIDB4MzYxNCwKKyAgICAweDM2MTUsIDB4MzYxNiwgMHgzNjE3LCAweDM2MTgsIDB4MzYxOSwgMHgzNjFCLCAweDM2MUMsIDB4MzYxRCwgMHgzNjFFLAorICAgIDB4MzYxRiwgMHgzNjIwLCAweDM2MjEsIDB4MzYyMiwgMHgzNjIzLCAweDM2MjQsIDB4MzYyNSwgMHgzNjI2LCAweDM2MjcsCisgICAgMHgzNjI4LCAweDM2MjksIDB4MzYyQSwgMHgzNjJCLCAweDM2MkMsIDB4MzYyRCwgMHgzNjJFLCAweDM2MkYsIDB4MzYzMCwKKyAgICAweDM2MzEsIDB4MzYzMiwgMHgzNjMzLCAweDM2MzQsIDB4MzYzNSwgMHgzNjM2LCAweDM2MzcsIDB4MzYzOCwgMHgzNjM5LAorICAgIDB4MzYzQSwgMHgzNjNCLCAweDM2M0MsIDB4MzYzRCwgMHgzNjNFLCAweDM2M0YsIDB4MzY0MCwgMHgzNjQxLCAweDM2NDIsCisgICAgMHgzNjQzLCAweDM2NDQsIDB4MzY0NSwgMHgzNjQ2LCAweDM2NDcsIDB4MzY0OCwgMHgzNjQ5LCAweDM2NEEsIDB4MzY0QiwKKyAgICAweDM2NEMsIDB4MzY0RCwgMHgzNjRFLCAweDM2NEYsIDB4MzY1MCwgMHgzNjUxLCAweDM2NTIsIDB4MzY1MywgMHgzNjU0LAorICAgIDB4MzY1NSwgMHgzNjU2LCAweDM2NTcsIDB4MzY1OCwgMHgzNjU5LCAweDM2NUEsIDB4MzY1QiwgMHgzNjVDLCAweDM2NUQsCisgICAgMHgzNjVFLCAweDM2NUYsIDB4MzY2MCwgMHgzNjYxLCAweDM2NjIsIDB4MzY2MywgMHgzNjY0LCAweDM2NjUsIDB4MzY2NiwKKyAgICAweDM2NjcsIDB4MzY2OCwgMHgzNjY5LCAweDM2NkEsIDB4MzY2QiwgMHgzNjZDLCAweDM2NkQsIDB4MzY2RSwgMHgzNjZGLAorICAgIDB4MzY3MCwgMHgzNjcxLCAweDM2NzIsIDB4MzY3MywgMHgzNjc0LCAweDM2NzUsIDB4MzY3NiwgMHgzNjc3LCAweDM2NzgsCisgICAgMHgzNjc5LCAweDM2N0EsIDB4MzY3QiwgMHgzNjdDLCAweDM2N0QsIDB4MzY3RSwgMHgzNjdGLCAweDM2ODAsIDB4MzY4MSwKKyAgICAweDM2ODIsIDB4MzY4MywgMHgzNjg0LCAweDM2ODUsIDB4MzY4NiwgMHgzNjg3LCAweDM2ODgsIDB4MzY4OSwgMHgzNjhBLAorICAgIDB4MzY4QiwgMHgzNjhDLCAweDM2OEQsIDB4MzY4RSwgMHgzNjhGLCAweDM2OTAsIDB4MzY5MSwgMHgzNjkyLCAweDM2OTMsCisgICAgMHgzNjk0LCAweDM2OTUsIDB4MzY5NiwgMHgzNjk3LCAweDM2OTgsIDB4MzY5OSwgMHgzNjlBLCAweDM2OUIsIDB4MzY5QywKKyAgICAweDM2OUQsIDB4MzY5RSwgMHgzNjlGLCAweDM2QTAsIDB4MzZBMSwgMHgzNkEyLCAweDM2QTMsIDB4MzZBNCwgMHgzNkE1LAorICAgIDB4MzZBNiwgMHgzNkE3LCAweDM2QTgsIDB4MzZBOSwgMHgzNkFBLCAweDM2QUIsIDB4MzZBQywgMHgzNkFELCAweDM2QUUsCisgICAgMHgzNkFGLCAweDM2QjAsIDB4MzZCMSwgMHgzNkIyLCAweDM2QjMsIDB4MzZCNCwgMHgzNkI1LCAweDM2QjYsIDB4MzZCNywKKyAgICAweDM2QjgsIDB4MzZCOSwgMHgzNkJBLCAweDM2QkIsIDB4MzZCQywgMHgzNkJELCAweDM2QkUsIDB4MzZCRiwgMHgzNkMwLAorICAgIDB4MzZDMSwgMHgzNkMyLCAweDM2QzMsIDB4MzZDNCwgMHgzNkM1LCAweDM2QzYsIDB4MzZDNywgMHgzNkM4LCAweDM2QzksCisgICAgMHgzNkNBLCAweDM2Q0IsIDB4MzZDQywgMHgzNkNELCAweDM2Q0UsIDB4MzZDRiwgMHgzNkQwLCAweDM2RDEsIDB4MzZEMiwKKyAgICAweDM2RDMsIDB4MzZENCwgMHgzNkQ1LCAweDM2RDYsIDB4MzZENywgMHgzNkQ4LCAweDM2RDksIDB4MzZEQSwgMHgzNkRCLAorICAgIDB4MzZEQywgMHgzNkRELCAweDM2REUsIDB4MzZERiwgMHgzNkUwLCAweDM2RTEsIDB4MzZFMiwgMHgzNkUzLCAweDM2RTQsCisgICAgMHgzNkU1LCAweDM2RTYsIDB4MzZFNywgMHgzNkU4LCAweDM2RTksIDB4MzZFQSwgMHgzNkVCLCAweDM2RUMsIDB4MzZFRCwKKyAgICAweDM2RUUsIDB4MzZFRiwgMHgzNkYwLCAweDM2RjEsIDB4MzZGMiwgMHgzNkYzLCAweDM2RjQsIDB4MzZGNSwgMHgzNkY2LAorICAgIDB4MzZGNywgMHgzNkY4LCAweDM2RjksIDB4MzZGQSwgMHgzNkZCLCAweDM2RkMsIDB4MzZGRCwgMHgzNkZFLCAweDM2RkYsCisgICAgMHgzNzAwLCAweDM3MDEsIDB4MzcwMiwgMHgzNzAzLCAweDM3MDQsIDB4MzcwNSwgMHgzNzA2LCAweDM3MDcsIDB4MzcwOCwKKyAgICAweDM3MDksIDB4MzcwQSwgMHgzNzBCLCAweDM3MEMsIDB4MzcwRCwgMHgzNzBFLCAweDM3MEYsIDB4MzcxMCwgMHgzNzExLAorICAgIDB4MzcxMiwgMHgzNzEzLCAweDM3MTQsIDB4MzcxNSwgMHgzNzE2LCAweDM3MTcsIDB4MzcxOCwgMHgzNzE5LCAweDM3MUEsCisgICAgMHgzNzFCLCAweDM3MUMsIDB4MzcxRCwgMHgzNzFFLCAweDM3MUYsIDB4MzcyMCwgMHgzNzIxLCAweDM3MjIsIDB4MzcyMywKKyAgICAweDM3MjQsIDB4MzcyNSwgMHgzNzI2LCAweDM3MjcsIDB4MzcyOCwgMHgzNzI5LCAweDM3MkEsIDB4MzcyQiwgMHgzNzJDLAorICAgIDB4MzcyRCwgMHgzNzJFLCAweDM3MkYsIDB4MzczMCwgMHgzNzMxLCAweDM3MzIsIDB4MzczMywgMHgzNzM0LCAweDM3MzUsCisgICAgMHgzNzM2LCAweDM3MzcsIDB4MzczOCwgMHgzNzM5LCAweDM3M0EsIDB4MzczQiwgMHgzNzNDLCAweDM3M0QsIDB4MzczRSwKKyAgICAweDM3M0YsIDB4Mzc0MCwgMHgzNzQxLCAweDM3NDIsIDB4Mzc0MywgMHgzNzQ0LCAweDM3NDUsIDB4Mzc0NiwgMHgzNzQ3LAorICAgIDB4Mzc0OCwgMHgzNzQ5LCAweDM3NEEsIDB4Mzc0QiwgMHgzNzRDLCAweDM3NEQsIDB4Mzc0RSwgMHgzNzRGLCAweDM3NTAsCisgICAgMHgzNzUxLCAweDM3NTIsIDB4Mzc1MywgMHgzNzU0LCAweDM3NTUsIDB4Mzc1NiwgMHgzNzU3LCAweDM3NTgsIDB4Mzc1OSwKKyAgICAweDM3NUEsIDB4Mzc1QiwgMHgzNzVDLCAweDM3NUQsIDB4Mzc1RSwgMHgzNzVGLCAweDM3NjAsIDB4Mzc2MSwgMHgzNzYyLAorICAgIDB4Mzc2MywgMHgzNzY0LCAweDM3NjUsIDB4Mzc2NiwgMHgzNzY3LCAweDM3NjgsIDB4Mzc2OSwgMHgzNzZBLCAweDM3NkIsCisgICAgMHgzNzZDLCAweDM3NkQsIDB4Mzc2RSwgMHgzNzZGLCAweDM3NzAsIDB4Mzc3MSwgMHgzNzcyLCAweDM3NzMsIDB4Mzc3NCwKKyAgICAweDM3NzUsIDB4Mzc3NiwgMHgzNzc3LCAweDM3NzgsIDB4Mzc3OSwgMHgzNzdBLCAweDM3N0IsIDB4Mzc3QywgMHgzNzdELAorICAgIDB4Mzc3RSwgMHgzNzdGLCAweDM3ODAsIDB4Mzc4MSwgMHgzNzgyLCAweDM3ODMsIDB4Mzc4NCwgMHgzNzg1LCAweDM3ODYsCisgICAgMHgzNzg3LCAweDM3ODgsIDB4Mzc4OSwgMHgzNzhBLCAweDM3OEIsIDB4Mzc4QywgMHgzNzhELCAweDM3OEUsIDB4Mzc4RiwKKyAgICAweDM3OTAsIDB4Mzc5MSwgMHgzNzkyLCAweDM3OTMsIDB4Mzc5NCwgMHgzNzk1LCAweDM3OTYsIDB4Mzc5NywgMHgzNzk4LAorICAgIDB4Mzc5OSwgMHgzNzlBLCAweDM3OUIsIDB4Mzc5QywgMHgzNzlELCAweDM3OUUsIDB4Mzc5RiwgMHgzN0EwLCAweDM3QTEsCisgICAgMHgzN0EyLCAweDM3QTMsIDB4MzdBNCwgMHgzN0E1LCAweDM3QTYsIDB4MzdBNywgMHgzN0E4LCAweDM3QTksIDB4MzdBQSwKKyAgICAweDM3QUIsIDB4MzdBQywgMHgzN0FELCAweDM3QUUsIDB4MzdBRiwgMHgzN0IwLCAweDM3QjEsIDB4MzdCMiwgMHgzN0IzLAorICAgIDB4MzdCNCwgMHgzN0I1LCAweDM3QjYsIDB4MzdCNywgMHgzN0I4LCAweDM3QjksIDB4MzdCQSwgMHgzN0JCLCAweDM3QkMsCisgICAgMHgzN0JELCAweDM3QkUsIDB4MzdCRiwgMHgzN0MwLCAweDM3QzEsIDB4MzdDMiwgMHgzN0MzLCAweDM3QzQsIDB4MzdDNSwKKyAgICAweDM3QzYsIDB4MzdDNywgMHgzN0M4LCAweDM3QzksIDB4MzdDQSwgMHgzN0NCLCAweDM3Q0MsIDB4MzdDRCwgMHgzN0NFLAorICAgIDB4MzdDRiwgMHgzN0QwLCAweDM3RDEsIDB4MzdEMiwgMHgzN0QzLCAweDM3RDQsIDB4MzdENSwgMHgzN0Q2LCAweDM3RDcsCisgICAgMHgzN0Q4LCAweDM3RDksIDB4MzdEQSwgMHgzN0RCLCAweDM3REMsIDB4MzdERCwgMHgzN0RFLCAweDM3REYsIDB4MzdFMCwKKyAgICAweDM3RTEsIDB4MzdFMiwgMHgzN0UzLCAweDM3RTQsIDB4MzdFNSwgMHgzN0U2LCAweDM3RTcsIDB4MzdFOCwgMHgzN0U5LAorICAgIDB4MzdFQSwgMHgzN0VCLCAweDM3RUMsIDB4MzdFRCwgMHgzN0VFLCAweDM3RUYsIDB4MzdGMCwgMHgzN0YxLCAweDM3RjIsCisgICAgMHgzN0YzLCAweDM3RjQsIDB4MzdGNSwgMHgzN0Y2LCAweDM3RjcsIDB4MzdGOCwgMHgzN0Y5LCAweDM3RkEsIDB4MzdGQiwKKyAgICAweDM3RkMsIDB4MzdGRCwgMHgzN0ZFLCAweDM3RkYsIDB4MzgwMCwgMHgzODAxLCAweDM4MDIsIDB4MzgwMywgMHgzODA0LAorICAgIDB4MzgwNSwgMHgzODA2LCAweDM4MDcsIDB4MzgwOCwgMHgzODA5LCAweDM4MEEsIDB4MzgwQiwgMHgzODBDLCAweDM4MEQsCisgICAgMHgzODBFLCAweDM4MEYsIDB4MzgxMCwgMHgzODExLCAweDM4MTIsIDB4MzgxMywgMHgzODE0LCAweDM4MTUsIDB4MzgxNiwKKyAgICAweDM4MTcsIDB4MzgxOCwgMHgzODE5LCAweDM4MUEsIDB4MzgxQiwgMHgzODFDLCAweDM4MUQsIDB4MzgxRSwgMHgzODFGLAorICAgIDB4MzgyMCwgMHgzODIxLCAweDM4MjIsIDB4MzgyMywgMHgzODI0LCAweDM4MjUsIDB4MzgyNiwgMHgzODI3LCAweDM4MjgsCisgICAgMHgzODI5LCAweDM4MkEsIDB4MzgyQiwgMHgzODJDLCAweDM4MkQsIDB4MzgyRSwgMHgzODJGLCAweDM4MzAsIDB4MzgzMSwKKyAgICAweDM4MzIsIDB4MzgzMywgMHgzODM0LCAweDM4MzUsIDB4MzgzNiwgMHgzODM3LCAweDM4MzgsIDB4MzgzOSwgMHgzODNBLAorICAgIDB4MzgzQiwgMHgzODNDLCAweDM4M0QsIDB4MzgzRSwgMHgzODNGLCAweDM4NDAsIDB4Mzg0MSwgMHgzODQyLCAweDM4NDMsCisgICAgMHgzODQ0LCAweDM4NDUsIDB4Mzg0NiwgMHgzODQ3LCAweDM4NDgsIDB4Mzg0OSwgMHgzODRBLCAweDM4NEIsIDB4Mzg0QywKKyAgICAweDM4NEQsIDB4Mzg0RSwgMHgzODRGLCAweDM4NTAsIDB4Mzg1MSwgMHgzODUyLCAweDM4NTMsIDB4Mzg1NCwgMHgzODU1LAorICAgIDB4Mzg1NiwgMHgzODU3LCAweDM4NTgsIDB4Mzg1OSwgMHgzODVBLCAweDM4NUIsIDB4Mzg1QywgMHgzODVELCAweDM4NUUsCisgICAgMHgzODVGLCAweDM4NjAsIDB4Mzg2MSwgMHgzODYyLCAweDM4NjMsIDB4Mzg2NCwgMHgzODY1LCAweDM4NjYsIDB4Mzg2NywKKyAgICAweDM4NjgsIDB4Mzg2OSwgMHgzODZBLCAweDM4NkIsIDB4Mzg2QywgMHgzODZELCAweDM4NkUsIDB4Mzg2RiwgMHgzODcwLAorICAgIDB4Mzg3MSwgMHgzODcyLCAweDM4NzMsIDB4Mzg3NCwgMHgzODc1LCAweDM4NzYsIDB4Mzg3NywgMHgzODc4LCAweDM4NzksCisgICAgMHgzODdBLCAweDM4N0IsIDB4Mzg3QywgMHgzODdELCAweDM4N0UsIDB4Mzg3RiwgMHgzODgwLCAweDM4ODEsIDB4Mzg4MiwKKyAgICAweDM4ODMsIDB4Mzg4NCwgMHgzODg1LCAweDM4ODYsIDB4Mzg4NywgMHgzODg4LCAweDM4ODksIDB4Mzg4QSwgMHgzODhCLAorICAgIDB4Mzg4QywgMHgzODhELCAweDM4OEUsIDB4Mzg4RiwgMHgzODkwLCAweDM4OTEsIDB4Mzg5MiwgMHgzODkzLCAweDM4OTQsCisgICAgMHgzODk1LCAweDM4OTYsIDB4Mzg5NywgMHgzODk4LCAweDM4OTksIDB4Mzg5QSwgMHgzODlCLCAweDM4OUMsIDB4Mzg5RCwKKyAgICAweDM4OUUsIDB4Mzg5RiwgMHgzOEEwLCAweDM4QTEsIDB4MzhBMiwgMHgzOEEzLCAweDM4QTQsIDB4MzhBNSwgMHgzOEE2LAorICAgIDB4MzhBNywgMHgzOEE4LCAweDM4QTksIDB4MzhBQSwgMHgzOEFCLCAweDM4QUMsIDB4MzhBRCwgMHgzOEFFLCAweDM4QUYsCisgICAgMHgzOEIwLCAweDM4QjEsIDB4MzhCMiwgMHgzOEIzLCAweDM4QjQsIDB4MzhCNSwgMHgzOEI2LCAweDM4QjcsIDB4MzhCOCwKKyAgICAweDM4QjksIDB4MzhCQSwgMHgzOEJCLCAweDM4QkMsIDB4MzhCRCwgMHgzOEJFLCAweDM4QkYsIDB4MzhDMCwgMHgzOEMxLAorICAgIDB4MzhDMiwgMHgzOEMzLCAweDM4QzQsIDB4MzhDNSwgMHgzOEM2LCAweDM4QzcsIDB4MzhDOCwgMHgzOEM5LCAweDM4Q0EsCisgICAgMHgzOENCLCAweDM4Q0MsIDB4MzhDRCwgMHgzOENFLCAweDM4Q0YsIDB4MzhEMCwgMHgzOEQxLCAweDM4RDIsIDB4MzhEMywKKyAgICAweDM4RDQsIDB4MzhENSwgMHgzOEQ2LCAweDM4RDcsIDB4MzhEOCwgMHgzOEQ5LCAweDM4REEsIDB4MzhEQiwgMHgzOERDLAorICAgIDB4MzhERCwgMHgzOERFLCAweDM4REYsIDB4MzhFMCwgMHgzOEUxLCAweDM4RTIsIDB4MzhFMywgMHgzOEU0LCAweDM4RTUsCisgICAgMHgzOEU2LCAweDM4RTcsIDB4MzhFOCwgMHgzOEU5LCAweDM4RUEsIDB4MzhFQiwgMHgzOEVDLCAweDM4RUQsIDB4MzhFRSwKKyAgICAweDM4RUYsIDB4MzhGMCwgMHgzOEYxLCAweDM4RjIsIDB4MzhGMywgMHgzOEY0LCAweDM4RjUsIDB4MzhGNiwgMHgzOEY3LAorICAgIDB4MzhGOCwgMHgzOEY5LCAweDM4RkEsIDB4MzhGQiwgMHgzOEZDLCAweDM4RkQsIDB4MzhGRSwgMHgzOEZGLCAweDM5MDAsCisgICAgMHgzOTAxLCAweDM5MDIsIDB4MzkwMywgMHgzOTA0LCAweDM5MDUsIDB4MzkwNiwgMHgzOTA3LCAweDM5MDgsIDB4MzkwOSwKKyAgICAweDM5MEEsIDB4MzkwQiwgMHgzOTBDLCAweDM5MEQsIDB4MzkwRSwgMHgzOTBGLCAweDM5MTAsIDB4MzkxMSwgMHgzOTEyLAorICAgIDB4MzkxMywgMHgzOTE0LCAweDM5MTUsIDB4MzkxNiwgMHgzOTE3LCAweDM5MTksIDB4MzkxQSwgMHgzOTFCLCAweDM5MUMsCisgICAgMHgzOTFELCAweDM5MUUsIDB4MzkxRiwgMHgzOTIwLCAweDM5MjEsIDB4MzkyMiwgMHgzOTIzLCAweDM5MjQsIDB4MzkyNSwKKyAgICAweDM5MjYsIDB4MzkyNywgMHgzOTI4LCAweDM5MjksIDB4MzkyQSwgMHgzOTJCLCAweDM5MkMsIDB4MzkyRCwgMHgzOTJFLAorICAgIDB4MzkyRiwgMHgzOTMwLCAweDM5MzEsIDB4MzkzMiwgMHgzOTMzLCAweDM5MzQsIDB4MzkzNSwgMHgzOTM2LCAweDM5MzcsCisgICAgMHgzOTM4LCAweDM5MzksIDB4MzkzQSwgMHgzOTNCLCAweDM5M0MsIDB4MzkzRCwgMHgzOTNFLCAweDM5M0YsIDB4Mzk0MCwKKyAgICAweDM5NDEsIDB4Mzk0MiwgMHgzOTQzLCAweDM5NDQsIDB4Mzk0NSwgMHgzOTQ2LCAweDM5NDcsIDB4Mzk0OCwgMHgzOTQ5LAorICAgIDB4Mzk0QSwgMHgzOTRCLCAweDM5NEMsIDB4Mzk0RCwgMHgzOTRFLCAweDM5NEYsIDB4Mzk1MCwgMHgzOTUxLCAweDM5NTIsCisgICAgMHgzOTUzLCAweDM5NTQsIDB4Mzk1NSwgMHgzOTU2LCAweDM5NTcsIDB4Mzk1OCwgMHgzOTU5LCAweDM5NUEsIDB4Mzk1QiwKKyAgICAweDM5NUMsIDB4Mzk1RCwgMHgzOTVFLCAweDM5NUYsIDB4Mzk2MCwgMHgzOTYxLCAweDM5NjIsIDB4Mzk2MywgMHgzOTY0LAorICAgIDB4Mzk2NSwgMHgzOTY2LCAweDM5NjcsIDB4Mzk2OCwgMHgzOTY5LCAweDM5NkEsIDB4Mzk2QiwgMHgzOTZDLCAweDM5NkQsCisgICAgMHgzOTZGLCAweDM5NzAsIDB4Mzk3MSwgMHgzOTcyLCAweDM5NzMsIDB4Mzk3NCwgMHgzOTc1LCAweDM5NzYsIDB4Mzk3NywKKyAgICAweDM5NzgsIDB4Mzk3OSwgMHgzOTdBLCAweDM5N0IsIDB4Mzk3QywgMHgzOTdELCAweDM5N0UsIDB4Mzk3RiwgMHgzOTgwLAorICAgIDB4Mzk4MSwgMHgzOTgyLCAweDM5ODMsIDB4Mzk4NCwgMHgzOTg1LCAweDM5ODYsIDB4Mzk4NywgMHgzOTg4LCAweDM5ODksCisgICAgMHgzOThBLCAweDM5OEIsIDB4Mzk4QywgMHgzOThELCAweDM5OEUsIDB4Mzk4RiwgMHgzOTkwLCAweDM5OTEsIDB4Mzk5MiwKKyAgICAweDM5OTMsIDB4Mzk5NCwgMHgzOTk1LCAweDM5OTYsIDB4Mzk5NywgMHgzOTk4LCAweDM5OTksIDB4Mzk5QSwgMHgzOTlCLAorICAgIDB4Mzk5QywgMHgzOTlELCAweDM5OUUsIDB4Mzk5RiwgMHgzOUEwLCAweDM5QTEsIDB4MzlBMiwgMHgzOUEzLCAweDM5QTQsCisgICAgMHgzOUE1LCAweDM5QTYsIDB4MzlBNywgMHgzOUE4LCAweDM5QTksIDB4MzlBQSwgMHgzOUFCLCAweDM5QUMsIDB4MzlBRCwKKyAgICAweDM5QUUsIDB4MzlBRiwgMHgzOUIwLCAweDM5QjEsIDB4MzlCMiwgMHgzOUIzLCAweDM5QjQsIDB4MzlCNSwgMHgzOUI2LAorICAgIDB4MzlCNywgMHgzOUI4LCAweDM5QjksIDB4MzlCQSwgMHgzOUJCLCAweDM5QkMsIDB4MzlCRCwgMHgzOUJFLCAweDM5QkYsCisgICAgMHgzOUMwLCAweDM5QzEsIDB4MzlDMiwgMHgzOUMzLCAweDM5QzQsIDB4MzlDNSwgMHgzOUM2LCAweDM5QzcsIDB4MzlDOCwKKyAgICAweDM5QzksIDB4MzlDQSwgMHgzOUNCLCAweDM5Q0MsIDB4MzlDRCwgMHgzOUNFLCAweDM5RDEsIDB4MzlEMiwgMHgzOUQzLAorICAgIDB4MzlENCwgMHgzOUQ1LCAweDM5RDYsIDB4MzlENywgMHgzOUQ4LCAweDM5RDksIDB4MzlEQSwgMHgzOURCLCAweDM5REMsCisgICAgMHgzOURELCAweDM5REUsIDB4MzlFMCwgMHgzOUUxLCAweDM5RTIsIDB4MzlFMywgMHgzOUU0LCAweDM5RTUsIDB4MzlFNiwKKyAgICAweDM5RTcsIDB4MzlFOCwgMHgzOUU5LCAweDM5RUEsIDB4MzlFQiwgMHgzOUVDLCAweDM5RUQsIDB4MzlFRSwgMHgzOUVGLAorICAgIDB4MzlGMCwgMHgzOUYxLCAweDM5RjIsIDB4MzlGMywgMHgzOUY0LCAweDM5RjUsIDB4MzlGNiwgMHgzOUY3LCAweDM5RjgsCisgICAgMHgzOUY5LCAweDM5RkEsIDB4MzlGQiwgMHgzOUZDLCAweDM5RkQsIDB4MzlGRSwgMHgzOUZGLCAweDNBMDAsIDB4M0EwMSwKKyAgICAweDNBMDIsIDB4M0EwMywgMHgzQTA0LCAweDNBMDUsIDB4M0EwNiwgMHgzQTA3LCAweDNBMDgsIDB4M0EwOSwgMHgzQTBBLAorICAgIDB4M0EwQiwgMHgzQTBDLCAweDNBMEQsIDB4M0EwRSwgMHgzQTBGLCAweDNBMTAsIDB4M0ExMSwgMHgzQTEyLCAweDNBMTMsCisgICAgMHgzQTE0LCAweDNBMTUsIDB4M0ExNiwgMHgzQTE3LCAweDNBMTgsIDB4M0ExOSwgMHgzQTFBLCAweDNBMUIsIDB4M0ExQywKKyAgICAweDNBMUQsIDB4M0ExRSwgMHgzQTFGLCAweDNBMjAsIDB4M0EyMSwgMHgzQTIyLCAweDNBMjMsIDB4M0EyNCwgMHgzQTI1LAorICAgIDB4M0EyNiwgMHgzQTI3LCAweDNBMjgsIDB4M0EyOSwgMHgzQTJBLCAweDNBMkIsIDB4M0EyQywgMHgzQTJELCAweDNBMkUsCisgICAgMHgzQTJGLCAweDNBMzAsIDB4M0EzMSwgMHgzQTMyLCAweDNBMzMsIDB4M0EzNCwgMHgzQTM1LCAweDNBMzYsIDB4M0EzNywKKyAgICAweDNBMzgsIDB4M0EzOSwgMHgzQTNBLCAweDNBM0IsIDB4M0EzQywgMHgzQTNELCAweDNBM0UsIDB4M0EzRiwgMHgzQTQwLAorICAgIDB4M0E0MSwgMHgzQTQyLCAweDNBNDMsIDB4M0E0NCwgMHgzQTQ1LCAweDNBNDYsIDB4M0E0NywgMHgzQTQ4LCAweDNBNDksCisgICAgMHgzQTRBLCAweDNBNEIsIDB4M0E0QywgMHgzQTRELCAweDNBNEUsIDB4M0E0RiwgMHgzQTUwLCAweDNBNTEsIDB4M0E1MiwKKyAgICAweDNBNTMsIDB4M0E1NCwgMHgzQTU1LCAweDNBNTYsIDB4M0E1NywgMHgzQTU4LCAweDNBNTksIDB4M0E1QSwgMHgzQTVCLAorICAgIDB4M0E1QywgMHgzQTVELCAweDNBNUUsIDB4M0E1RiwgMHgzQTYwLCAweDNBNjEsIDB4M0E2MiwgMHgzQTYzLCAweDNBNjQsCisgICAgMHgzQTY1LCAweDNBNjYsIDB4M0E2NywgMHgzQTY4LCAweDNBNjksIDB4M0E2QSwgMHgzQTZCLCAweDNBNkMsIDB4M0E2RCwKKyAgICAweDNBNkUsIDB4M0E2RiwgMHgzQTcwLCAweDNBNzEsIDB4M0E3MiwgMHgzQTc0LCAweDNBNzUsIDB4M0E3NiwgMHgzQTc3LAorICAgIDB4M0E3OCwgMHgzQTc5LCAweDNBN0EsIDB4M0E3QiwgMHgzQTdDLCAweDNBN0QsIDB4M0E3RSwgMHgzQTdGLCAweDNBODAsCisgICAgMHgzQTgxLCAweDNBODIsIDB4M0E4MywgMHgzQTg0LCAweDNBODUsIDB4M0E4NiwgMHgzQTg3LCAweDNBODgsIDB4M0E4OSwKKyAgICAweDNBOEEsIDB4M0E4QiwgMHgzQThDLCAweDNBOEQsIDB4M0E4RSwgMHgzQThGLCAweDNBOTAsIDB4M0E5MSwgMHgzQTkyLAorICAgIDB4M0E5MywgMHgzQTk0LCAweDNBOTUsIDB4M0E5NiwgMHgzQTk3LCAweDNBOTgsIDB4M0E5OSwgMHgzQTlBLCAweDNBOUIsCisgICAgMHgzQTlDLCAweDNBOUQsIDB4M0E5RSwgMHgzQTlGLCAweDNBQTAsIDB4M0FBMSwgMHgzQUEyLCAweDNBQTMsIDB4M0FBNCwKKyAgICAweDNBQTUsIDB4M0FBNiwgMHgzQUE3LCAweDNBQTgsIDB4M0FBOSwgMHgzQUFBLCAweDNBQUIsIDB4M0FBQywgMHgzQUFELAorICAgIDB4M0FBRSwgMHgzQUFGLCAweDNBQjAsIDB4M0FCMSwgMHgzQUIyLCAweDNBQjMsIDB4M0FCNCwgMHgzQUI1LCAweDNBQjYsCisgICAgMHgzQUI3LCAweDNBQjgsIDB4M0FCOSwgMHgzQUJBLCAweDNBQkIsIDB4M0FCQywgMHgzQUJELCAweDNBQkUsIDB4M0FCRiwKKyAgICAweDNBQzAsIDB4M0FDMSwgMHgzQUMyLCAweDNBQzMsIDB4M0FDNCwgMHgzQUM1LCAweDNBQzYsIDB4M0FDNywgMHgzQUM4LAorICAgIDB4M0FDOSwgMHgzQUNBLCAweDNBQ0IsIDB4M0FDQywgMHgzQUNELCAweDNBQ0UsIDB4M0FDRiwgMHgzQUQwLCAweDNBRDEsCisgICAgMHgzQUQyLCAweDNBRDMsIDB4M0FENCwgMHgzQUQ1LCAweDNBRDYsIDB4M0FENywgMHgzQUQ4LCAweDNBRDksIDB4M0FEQSwKKyAgICAweDNBREIsIDB4M0FEQywgMHgzQURELCAweDNBREUsIDB4M0FERiwgMHgzQUUwLCAweDNBRTEsIDB4M0FFMiwgMHgzQUUzLAorICAgIDB4M0FFNCwgMHgzQUU1LCAweDNBRTYsIDB4M0FFNywgMHgzQUU4LCAweDNBRTksIDB4M0FFQSwgMHgzQUVCLCAweDNBRUMsCisgICAgMHgzQUVELCAweDNBRUUsIDB4M0FFRiwgMHgzQUYwLCAweDNBRjEsIDB4M0FGMiwgMHgzQUYzLCAweDNBRjQsIDB4M0FGNSwKKyAgICAweDNBRjYsIDB4M0FGNywgMHgzQUY4LCAweDNBRjksIDB4M0FGQSwgMHgzQUZCLCAweDNBRkMsIDB4M0FGRCwgMHgzQUZFLAorICAgIDB4M0FGRiwgMHgzQjAwLCAweDNCMDEsIDB4M0IwMiwgMHgzQjAzLCAweDNCMDQsIDB4M0IwNSwgMHgzQjA2LCAweDNCMDcsCisgICAgMHgzQjA4LCAweDNCMDksIDB4M0IwQSwgMHgzQjBCLCAweDNCMEMsIDB4M0IwRCwgMHgzQjBFLCAweDNCMEYsIDB4M0IxMCwKKyAgICAweDNCMTEsIDB4M0IxMiwgMHgzQjEzLCAweDNCMTQsIDB4M0IxNSwgMHgzQjE2LCAweDNCMTcsIDB4M0IxOCwgMHgzQjE5LAorICAgIDB4M0IxQSwgMHgzQjFCLCAweDNCMUMsIDB4M0IxRCwgMHgzQjFFLCAweDNCMUYsIDB4M0IyMCwgMHgzQjIxLCAweDNCMjIsCisgICAgMHgzQjIzLCAweDNCMjQsIDB4M0IyNSwgMHgzQjI2LCAweDNCMjcsIDB4M0IyOCwgMHgzQjI5LCAweDNCMkEsIDB4M0IyQiwKKyAgICAweDNCMkMsIDB4M0IyRCwgMHgzQjJFLCAweDNCMkYsIDB4M0IzMCwgMHgzQjMxLCAweDNCMzIsIDB4M0IzMywgMHgzQjM0LAorICAgIDB4M0IzNSwgMHgzQjM2LCAweDNCMzcsIDB4M0IzOCwgMHgzQjM5LCAweDNCM0EsIDB4M0IzQiwgMHgzQjNDLCAweDNCM0QsCisgICAgMHgzQjNFLCAweDNCM0YsIDB4M0I0MCwgMHgzQjQxLCAweDNCNDIsIDB4M0I0MywgMHgzQjQ0LCAweDNCNDUsIDB4M0I0NiwKKyAgICAweDNCNDcsIDB4M0I0OCwgMHgzQjQ5LCAweDNCNEEsIDB4M0I0QiwgMHgzQjRDLCAweDNCNEQsIDB4M0I0RiwgMHgzQjUwLAorICAgIDB4M0I1MSwgMHgzQjUyLCAweDNCNTMsIDB4M0I1NCwgMHgzQjU1LCAweDNCNTYsIDB4M0I1NywgMHgzQjU4LCAweDNCNTksCisgICAgMHgzQjVBLCAweDNCNUIsIDB4M0I1QywgMHgzQjVELCAweDNCNUUsIDB4M0I1RiwgMHgzQjYwLCAweDNCNjEsIDB4M0I2MiwKKyAgICAweDNCNjMsIDB4M0I2NCwgMHgzQjY1LCAweDNCNjYsIDB4M0I2NywgMHgzQjY4LCAweDNCNjksIDB4M0I2QSwgMHgzQjZCLAorICAgIDB4M0I2QywgMHgzQjZELCAweDNCNkUsIDB4M0I2RiwgMHgzQjcwLCAweDNCNzEsIDB4M0I3MiwgMHgzQjczLCAweDNCNzQsCisgICAgMHgzQjc1LCAweDNCNzYsIDB4M0I3NywgMHgzQjc4LCAweDNCNzksIDB4M0I3QSwgMHgzQjdCLCAweDNCN0MsIDB4M0I3RCwKKyAgICAweDNCN0UsIDB4M0I3RiwgMHgzQjgwLCAweDNCODEsIDB4M0I4MiwgMHgzQjgzLCAweDNCODQsIDB4M0I4NSwgMHgzQjg2LAorICAgIDB4M0I4NywgMHgzQjg4LCAweDNCODksIDB4M0I4QSwgMHgzQjhCLCAweDNCOEMsIDB4M0I4RCwgMHgzQjhFLCAweDNCOEYsCisgICAgMHgzQjkwLCAweDNCOTEsIDB4M0I5MiwgMHgzQjkzLCAweDNCOTQsIDB4M0I5NSwgMHgzQjk2LCAweDNCOTcsIDB4M0I5OCwKKyAgICAweDNCOTksIDB4M0I5QSwgMHgzQjlCLCAweDNCOUMsIDB4M0I5RCwgMHgzQjlFLCAweDNCOUYsIDB4M0JBMCwgMHgzQkExLAorICAgIDB4M0JBMiwgMHgzQkEzLCAweDNCQTQsIDB4M0JBNSwgMHgzQkE2LCAweDNCQTcsIDB4M0JBOCwgMHgzQkE5LCAweDNCQUEsCisgICAgMHgzQkFCLCAweDNCQUMsIDB4M0JBRCwgMHgzQkFFLCAweDNCQUYsIDB4M0JCMCwgMHgzQkIxLCAweDNCQjIsIDB4M0JCMywKKyAgICAweDNCQjQsIDB4M0JCNSwgMHgzQkI2LCAweDNCQjcsIDB4M0JCOCwgMHgzQkI5LCAweDNCQkEsIDB4M0JCQiwgMHgzQkJDLAorICAgIDB4M0JCRCwgMHgzQkJFLCAweDNCQkYsIDB4M0JDMCwgMHgzQkMxLCAweDNCQzIsIDB4M0JDMywgMHgzQkM0LCAweDNCQzUsCisgICAgMHgzQkM2LCAweDNCQzcsIDB4M0JDOCwgMHgzQkM5LCAweDNCQ0EsIDB4M0JDQiwgMHgzQkNDLCAweDNCQ0QsIDB4M0JDRSwKKyAgICAweDNCQ0YsIDB4M0JEMCwgMHgzQkQxLCAweDNCRDIsIDB4M0JEMywgMHgzQkQ0LCAweDNCRDUsIDB4M0JENiwgMHgzQkQ3LAorICAgIDB4M0JEOCwgMHgzQkQ5LCAweDNCREEsIDB4M0JEQiwgMHgzQkRDLCAweDNCREQsIDB4M0JERSwgMHgzQkRGLCAweDNCRTAsCisgICAgMHgzQkUxLCAweDNCRTIsIDB4M0JFMywgMHgzQkU0LCAweDNCRTUsIDB4M0JFNiwgMHgzQkU3LCAweDNCRTgsIDB4M0JFOSwKKyAgICAweDNCRUEsIDB4M0JFQiwgMHgzQkVDLCAweDNCRUQsIDB4M0JFRSwgMHgzQkVGLCAweDNCRjAsIDB4M0JGMSwgMHgzQkYyLAorICAgIDB4M0JGMywgMHgzQkY0LCAweDNCRjUsIDB4M0JGNiwgMHgzQkY3LCAweDNCRjgsIDB4M0JGOSwgMHgzQkZBLCAweDNCRkIsCisgICAgMHgzQkZDLCAweDNCRkQsIDB4M0JGRSwgMHgzQkZGLCAweDNDMDAsIDB4M0MwMSwgMHgzQzAyLCAweDNDMDMsIDB4M0MwNCwKKyAgICAweDNDMDUsIDB4M0MwNiwgMHgzQzA3LCAweDNDMDgsIDB4M0MwOSwgMHgzQzBBLCAweDNDMEIsIDB4M0MwQywgMHgzQzBELAorICAgIDB4M0MwRSwgMHgzQzBGLCAweDNDMTAsIDB4M0MxMSwgMHgzQzEyLCAweDNDMTMsIDB4M0MxNCwgMHgzQzE1LCAweDNDMTYsCisgICAgMHgzQzE3LCAweDNDMTgsIDB4M0MxOSwgMHgzQzFBLCAweDNDMUIsIDB4M0MxQywgMHgzQzFELCAweDNDMUUsIDB4M0MxRiwKKyAgICAweDNDMjAsIDB4M0MyMSwgMHgzQzIyLCAweDNDMjMsIDB4M0MyNCwgMHgzQzI1LCAweDNDMjYsIDB4M0MyNywgMHgzQzI4LAorICAgIDB4M0MyOSwgMHgzQzJBLCAweDNDMkIsIDB4M0MyQywgMHgzQzJELCAweDNDMkUsIDB4M0MyRiwgMHgzQzMwLCAweDNDMzEsCisgICAgMHgzQzMyLCAweDNDMzMsIDB4M0MzNCwgMHgzQzM1LCAweDNDMzYsIDB4M0MzNywgMHgzQzM4LCAweDNDMzksIDB4M0MzQSwKKyAgICAweDNDM0IsIDB4M0MzQywgMHgzQzNELCAweDNDM0UsIDB4M0MzRiwgMHgzQzQwLCAweDNDNDEsIDB4M0M0MiwgMHgzQzQzLAorICAgIDB4M0M0NCwgMHgzQzQ1LCAweDNDNDYsIDB4M0M0NywgMHgzQzQ4LCAweDNDNDksIDB4M0M0QSwgMHgzQzRCLCAweDNDNEMsCisgICAgMHgzQzRELCAweDNDNEUsIDB4M0M0RiwgMHgzQzUwLCAweDNDNTEsIDB4M0M1MiwgMHgzQzUzLCAweDNDNTQsIDB4M0M1NSwKKyAgICAweDNDNTYsIDB4M0M1NywgMHgzQzU4LCAweDNDNTksIDB4M0M1QSwgMHgzQzVCLCAweDNDNUMsIDB4M0M1RCwgMHgzQzVFLAorICAgIDB4M0M1RiwgMHgzQzYwLCAweDNDNjEsIDB4M0M2MiwgMHgzQzYzLCAweDNDNjQsIDB4M0M2NSwgMHgzQzY2LCAweDNDNjcsCisgICAgMHgzQzY4LCAweDNDNjksIDB4M0M2QSwgMHgzQzZCLCAweDNDNkMsIDB4M0M2RCwgMHgzQzZGLCAweDNDNzAsIDB4M0M3MSwKKyAgICAweDNDNzIsIDB4M0M3MywgMHgzQzc0LCAweDNDNzUsIDB4M0M3NiwgMHgzQzc3LCAweDNDNzgsIDB4M0M3OSwgMHgzQzdBLAorICAgIDB4M0M3QiwgMHgzQzdDLCAweDNDN0QsIDB4M0M3RSwgMHgzQzdGLCAweDNDODAsIDB4M0M4MSwgMHgzQzgyLCAweDNDODMsCisgICAgMHgzQzg0LCAweDNDODUsIDB4M0M4NiwgMHgzQzg3LCAweDNDODgsIDB4M0M4OSwgMHgzQzhBLCAweDNDOEIsIDB4M0M4QywKKyAgICAweDNDOEQsIDB4M0M4RSwgMHgzQzhGLCAweDNDOTAsIDB4M0M5MSwgMHgzQzkyLCAweDNDOTMsIDB4M0M5NCwgMHgzQzk1LAorICAgIDB4M0M5NiwgMHgzQzk3LCAweDNDOTgsIDB4M0M5OSwgMHgzQzlBLCAweDNDOUIsIDB4M0M5QywgMHgzQzlELCAweDNDOUUsCisgICAgMHgzQzlGLCAweDNDQTAsIDB4M0NBMSwgMHgzQ0EyLCAweDNDQTMsIDB4M0NBNCwgMHgzQ0E1LCAweDNDQTYsIDB4M0NBNywKKyAgICAweDNDQTgsIDB4M0NBOSwgMHgzQ0FBLCAweDNDQUIsIDB4M0NBQywgMHgzQ0FELCAweDNDQUUsIDB4M0NBRiwgMHgzQ0IwLAorICAgIDB4M0NCMSwgMHgzQ0IyLCAweDNDQjMsIDB4M0NCNCwgMHgzQ0I1LCAweDNDQjYsIDB4M0NCNywgMHgzQ0I4LCAweDNDQjksCisgICAgMHgzQ0JBLCAweDNDQkIsIDB4M0NCQywgMHgzQ0JELCAweDNDQkUsIDB4M0NCRiwgMHgzQ0MwLCAweDNDQzEsIDB4M0NDMiwKKyAgICAweDNDQzMsIDB4M0NDNCwgMHgzQ0M1LCAweDNDQzYsIDB4M0NDNywgMHgzQ0M4LCAweDNDQzksIDB4M0NDQSwgMHgzQ0NCLAorICAgIDB4M0NDQywgMHgzQ0NELCAweDNDQ0UsIDB4M0NDRiwgMHgzQ0QwLCAweDNDRDEsIDB4M0NEMiwgMHgzQ0QzLCAweDNDRDQsCisgICAgMHgzQ0Q1LCAweDNDRDYsIDB4M0NENywgMHgzQ0Q4LCAweDNDRDksIDB4M0NEQSwgMHgzQ0RCLCAweDNDREMsIDB4M0NERCwKKyAgICAweDNDREUsIDB4M0NERiwgMHgzQ0UxLCAweDNDRTIsIDB4M0NFMywgMHgzQ0U0LCAweDNDRTUsIDB4M0NFNiwgMHgzQ0U3LAorICAgIDB4M0NFOCwgMHgzQ0U5LCAweDNDRUEsIDB4M0NFQiwgMHgzQ0VDLCAweDNDRUQsIDB4M0NFRSwgMHgzQ0VGLCAweDNDRjAsCisgICAgMHgzQ0YxLCAweDNDRjIsIDB4M0NGMywgMHgzQ0Y0LCAweDNDRjUsIDB4M0NGNiwgMHgzQ0Y3LCAweDNDRjgsIDB4M0NGOSwKKyAgICAweDNDRkEsIDB4M0NGQiwgMHgzQ0ZDLCAweDNDRkQsIDB4M0NGRSwgMHgzQ0ZGLCAweDNEMDAsIDB4M0QwMSwgMHgzRDAyLAorICAgIDB4M0QwMywgMHgzRDA0LCAweDNEMDUsIDB4M0QwNiwgMHgzRDA3LCAweDNEMDgsIDB4M0QwOSwgMHgzRDBBLCAweDNEMEIsCisgICAgMHgzRDBDLCAweDNEMEQsIDB4M0QwRSwgMHgzRDBGLCAweDNEMTAsIDB4M0QxMSwgMHgzRDEyLCAweDNEMTMsIDB4M0QxNCwKKyAgICAweDNEMTUsIDB4M0QxNiwgMHgzRDE3LCAweDNEMTgsIDB4M0QxOSwgMHgzRDFBLCAweDNEMUIsIDB4M0QxQywgMHgzRDFELAorICAgIDB4M0QxRSwgMHgzRDFGLCAweDNEMjAsIDB4M0QyMSwgMHgzRDIyLCAweDNEMjMsIDB4M0QyNCwgMHgzRDI1LCAweDNEMjYsCisgICAgMHgzRDI3LCAweDNEMjgsIDB4M0QyOSwgMHgzRDJBLCAweDNEMkIsIDB4M0QyQywgMHgzRDJELCAweDNEMkUsIDB4M0QyRiwKKyAgICAweDNEMzAsIDB4M0QzMSwgMHgzRDMyLCAweDNEMzMsIDB4M0QzNCwgMHgzRDM1LCAweDNEMzYsIDB4M0QzNywgMHgzRDM4LAorICAgIDB4M0QzOSwgMHgzRDNBLCAweDNEM0IsIDB4M0QzQywgMHgzRDNELCAweDNEM0UsIDB4M0QzRiwgMHgzRDQwLCAweDNENDEsCisgICAgMHgzRDQyLCAweDNENDMsIDB4M0Q0NCwgMHgzRDQ1LCAweDNENDYsIDB4M0Q0NywgMHgzRDQ4LCAweDNENDksIDB4M0Q0QSwKKyAgICAweDNENEIsIDB4M0Q0QywgMHgzRDRELCAweDNENEUsIDB4M0Q0RiwgMHgzRDUwLCAweDNENTEsIDB4M0Q1MiwgMHgzRDUzLAorICAgIDB4M0Q1NCwgMHgzRDU1LCAweDNENTYsIDB4M0Q1NywgMHgzRDU4LCAweDNENTksIDB4M0Q1QSwgMHgzRDVCLCAweDNENUMsCisgICAgMHgzRDVELCAweDNENUUsIDB4M0Q1RiwgMHgzRDYwLCAweDNENjEsIDB4M0Q2MiwgMHgzRDYzLCAweDNENjQsIDB4M0Q2NSwKKyAgICAweDNENjYsIDB4M0Q2NywgMHgzRDY4LCAweDNENjksIDB4M0Q2QSwgMHgzRDZCLCAweDNENkMsIDB4M0Q2RCwgMHgzRDZFLAorICAgIDB4M0Q2RiwgMHgzRDcwLCAweDNENzEsIDB4M0Q3MiwgMHgzRDczLCAweDNENzQsIDB4M0Q3NSwgMHgzRDc2LCAweDNENzcsCisgICAgMHgzRDc4LCAweDNENzksIDB4M0Q3QSwgMHgzRDdCLCAweDNEN0MsIDB4M0Q3RCwgMHgzRDdFLCAweDNEN0YsIDB4M0Q4MCwKKyAgICAweDNEODEsIDB4M0Q4MiwgMHgzRDgzLCAweDNEODQsIDB4M0Q4NSwgMHgzRDg2LCAweDNEODcsIDB4M0Q4OCwgMHgzRDg5LAorICAgIDB4M0Q4QSwgMHgzRDhCLCAweDNEOEMsIDB4M0Q4RCwgMHgzRDhFLCAweDNEOEYsIDB4M0Q5MCwgMHgzRDkxLCAweDNEOTIsCisgICAgMHgzRDkzLCAweDNEOTQsIDB4M0Q5NSwgMHgzRDk2LCAweDNEOTcsIDB4M0Q5OCwgMHgzRDk5LCAweDNEOUEsIDB4M0Q5QiwKKyAgICAweDNEOUMsIDB4M0Q5RCwgMHgzRDlFLCAweDNEOUYsIDB4M0RBMCwgMHgzREExLCAweDNEQTIsIDB4M0RBMywgMHgzREE0LAorICAgIDB4M0RBNSwgMHgzREE2LCAweDNEQTcsIDB4M0RBOCwgMHgzREE5LCAweDNEQUEsIDB4M0RBQiwgMHgzREFDLCAweDNEQUQsCisgICAgMHgzREFFLCAweDNEQUYsIDB4M0RCMCwgMHgzREIxLCAweDNEQjIsIDB4M0RCMywgMHgzREI0LCAweDNEQjUsIDB4M0RCNiwKKyAgICAweDNEQjcsIDB4M0RCOCwgMHgzREI5LCAweDNEQkEsIDB4M0RCQiwgMHgzREJDLCAweDNEQkQsIDB4M0RCRSwgMHgzREJGLAorICAgIDB4M0RDMCwgMHgzREMxLCAweDNEQzIsIDB4M0RDMywgMHgzREM0LCAweDNEQzUsIDB4M0RDNiwgMHgzREM3LCAweDNEQzgsCisgICAgMHgzREM5LCAweDNEQ0EsIDB4M0RDQiwgMHgzRENDLCAweDNEQ0QsIDB4M0RDRSwgMHgzRENGLCAweDNERDAsIDB4M0REMSwKKyAgICAweDNERDIsIDB4M0REMywgMHgzREQ0LCAweDNERDUsIDB4M0RENiwgMHgzREQ3LCAweDNERDgsIDB4M0REOSwgMHgzRERBLAorICAgIDB4M0REQiwgMHgzRERDLCAweDNEREQsIDB4M0RERSwgMHgzRERGLCAweDNERTAsIDB4M0RFMSwgMHgzREUyLCAweDNERTMsCisgICAgMHgzREU0LCAweDNERTUsIDB4M0RFNiwgMHgzREU3LCAweDNERTgsIDB4M0RFOSwgMHgzREVBLCAweDNERUIsIDB4M0RFQywKKyAgICAweDNERUQsIDB4M0RFRSwgMHgzREVGLCAweDNERjAsIDB4M0RGMSwgMHgzREYyLCAweDNERjMsIDB4M0RGNCwgMHgzREY1LAorICAgIDB4M0RGNiwgMHgzREY3LCAweDNERjgsIDB4M0RGOSwgMHgzREZBLCAweDNERkIsIDB4M0RGQywgMHgzREZELCAweDNERkUsCisgICAgMHgzREZGLCAweDNFMDAsIDB4M0UwMSwgMHgzRTAyLCAweDNFMDMsIDB4M0UwNCwgMHgzRTA1LCAweDNFMDYsIDB4M0UwNywKKyAgICAweDNFMDgsIDB4M0UwOSwgMHgzRTBBLCAweDNFMEIsIDB4M0UwQywgMHgzRTBELCAweDNFMEUsIDB4M0UwRiwgMHgzRTEwLAorICAgIDB4M0UxMSwgMHgzRTEyLCAweDNFMTMsIDB4M0UxNCwgMHgzRTE1LCAweDNFMTYsIDB4M0UxNywgMHgzRTE4LCAweDNFMTksCisgICAgMHgzRTFBLCAweDNFMUIsIDB4M0UxQywgMHgzRTFELCAweDNFMUUsIDB4M0UxRiwgMHgzRTIwLCAweDNFMjEsIDB4M0UyMiwKKyAgICAweDNFMjMsIDB4M0UyNCwgMHgzRTI1LCAweDNFMjYsIDB4M0UyNywgMHgzRTI4LCAweDNFMjksIDB4M0UyQSwgMHgzRTJCLAorICAgIDB4M0UyQywgMHgzRTJELCAweDNFMkUsIDB4M0UyRiwgMHgzRTMwLCAweDNFMzEsIDB4M0UzMiwgMHgzRTMzLCAweDNFMzQsCisgICAgMHgzRTM1LCAweDNFMzYsIDB4M0UzNywgMHgzRTM4LCAweDNFMzksIDB4M0UzQSwgMHgzRTNCLCAweDNFM0MsIDB4M0UzRCwKKyAgICAweDNFM0UsIDB4M0UzRiwgMHgzRTQwLCAweDNFNDEsIDB4M0U0MiwgMHgzRTQzLCAweDNFNDQsIDB4M0U0NSwgMHgzRTQ2LAorICAgIDB4M0U0NywgMHgzRTQ4LCAweDNFNDksIDB4M0U0QSwgMHgzRTRCLCAweDNFNEMsIDB4M0U0RCwgMHgzRTRFLCAweDNFNEYsCisgICAgMHgzRTUwLCAweDNFNTEsIDB4M0U1MiwgMHgzRTUzLCAweDNFNTQsIDB4M0U1NSwgMHgzRTU2LCAweDNFNTcsIDB4M0U1OCwKKyAgICAweDNFNTksIDB4M0U1QSwgMHgzRTVCLCAweDNFNUMsIDB4M0U1RCwgMHgzRTVFLCAweDNFNUYsIDB4M0U2MCwgMHgzRTYxLAorICAgIDB4M0U2MiwgMHgzRTYzLCAweDNFNjQsIDB4M0U2NSwgMHgzRTY2LCAweDNFNjcsIDB4M0U2OCwgMHgzRTY5LCAweDNFNkEsCisgICAgMHgzRTZCLCAweDNFNkMsIDB4M0U2RCwgMHgzRTZFLCAweDNFNkYsIDB4M0U3MCwgMHgzRTcxLCAweDNFNzIsIDB4M0U3MywKKyAgICAweDNFNzQsIDB4M0U3NSwgMHgzRTc2LCAweDNFNzcsIDB4M0U3OCwgMHgzRTc5LCAweDNFN0EsIDB4M0U3QiwgMHgzRTdDLAorICAgIDB4M0U3RCwgMHgzRTdFLCAweDNFN0YsIDB4M0U4MCwgMHgzRTgxLCAweDNFODIsIDB4M0U4MywgMHgzRTg0LCAweDNFODUsCisgICAgMHgzRTg2LCAweDNFODcsIDB4M0U4OCwgMHgzRTg5LCAweDNFOEEsIDB4M0U4QiwgMHgzRThDLCAweDNFOEQsIDB4M0U4RSwKKyAgICAweDNFOEYsIDB4M0U5MCwgMHgzRTkxLCAweDNFOTIsIDB4M0U5MywgMHgzRTk0LCAweDNFOTUsIDB4M0U5NiwgMHgzRTk3LAorICAgIDB4M0U5OCwgMHgzRTk5LCAweDNFOUEsIDB4M0U5QiwgMHgzRTlDLCAweDNFOUQsIDB4M0U5RSwgMHgzRTlGLCAweDNFQTAsCisgICAgMHgzRUExLCAweDNFQTIsIDB4M0VBMywgMHgzRUE0LCAweDNFQTUsIDB4M0VBNiwgMHgzRUE3LCAweDNFQTgsIDB4M0VBOSwKKyAgICAweDNFQUEsIDB4M0VBQiwgMHgzRUFDLCAweDNFQUQsIDB4M0VBRSwgMHgzRUFGLCAweDNFQjAsIDB4M0VCMSwgMHgzRUIyLAorICAgIDB4M0VCMywgMHgzRUI0LCAweDNFQjUsIDB4M0VCNiwgMHgzRUI3LCAweDNFQjgsIDB4M0VCOSwgMHgzRUJBLCAweDNFQkIsCisgICAgMHgzRUJDLCAweDNFQkQsIDB4M0VCRSwgMHgzRUJGLCAweDNFQzAsIDB4M0VDMSwgMHgzRUMyLCAweDNFQzMsIDB4M0VDNCwKKyAgICAweDNFQzUsIDB4M0VDNiwgMHgzRUM3LCAweDNFQzgsIDB4M0VDOSwgMHgzRUNBLCAweDNFQ0IsIDB4M0VDQywgMHgzRUNELAorICAgIDB4M0VDRSwgMHgzRUNGLCAweDNFRDAsIDB4M0VEMSwgMHgzRUQyLCAweDNFRDMsIDB4M0VENCwgMHgzRUQ1LCAweDNFRDYsCisgICAgMHgzRUQ3LCAweDNFRDgsIDB4M0VEOSwgMHgzRURBLCAweDNFREIsIDB4M0VEQywgMHgzRURELCAweDNFREUsIDB4M0VERiwKKyAgICAweDNFRTAsIDB4M0VFMSwgMHgzRUUyLCAweDNFRTMsIDB4M0VFNCwgMHgzRUU1LCAweDNFRTYsIDB4M0VFNywgMHgzRUU4LAorICAgIDB4M0VFOSwgMHgzRUVBLCAweDNFRUIsIDB4M0VFQywgMHgzRUVELCAweDNFRUUsIDB4M0VFRiwgMHgzRUYwLCAweDNFRjEsCisgICAgMHgzRUYyLCAweDNFRjMsIDB4M0VGNCwgMHgzRUY1LCAweDNFRjYsIDB4M0VGNywgMHgzRUY4LCAweDNFRjksIDB4M0VGQSwKKyAgICAweDNFRkIsIDB4M0VGQywgMHgzRUZELCAweDNFRkUsIDB4M0VGRiwgMHgzRjAwLCAweDNGMDEsIDB4M0YwMiwgMHgzRjAzLAorICAgIDB4M0YwNCwgMHgzRjA1LCAweDNGMDYsIDB4M0YwNywgMHgzRjA4LCAweDNGMDksIDB4M0YwQSwgMHgzRjBCLCAweDNGMEMsCisgICAgMHgzRjBELCAweDNGMEUsIDB4M0YwRiwgMHgzRjEwLCAweDNGMTEsIDB4M0YxMiwgMHgzRjEzLCAweDNGMTQsIDB4M0YxNSwKKyAgICAweDNGMTYsIDB4M0YxNywgMHgzRjE4LCAweDNGMTksIDB4M0YxQSwgMHgzRjFCLCAweDNGMUMsIDB4M0YxRCwgMHgzRjFFLAorICAgIDB4M0YxRiwgMHgzRjIwLCAweDNGMjEsIDB4M0YyMiwgMHgzRjIzLCAweDNGMjQsIDB4M0YyNSwgMHgzRjI2LCAweDNGMjcsCisgICAgMHgzRjI4LCAweDNGMjksIDB4M0YyQSwgMHgzRjJCLCAweDNGMkMsIDB4M0YyRCwgMHgzRjJFLCAweDNGMkYsIDB4M0YzMCwKKyAgICAweDNGMzEsIDB4M0YzMiwgMHgzRjMzLCAweDNGMzQsIDB4M0YzNSwgMHgzRjM2LCAweDNGMzcsIDB4M0YzOCwgMHgzRjM5LAorICAgIDB4M0YzQSwgMHgzRjNCLCAweDNGM0MsIDB4M0YzRCwgMHgzRjNFLCAweDNGM0YsIDB4M0Y0MCwgMHgzRjQxLCAweDNGNDIsCisgICAgMHgzRjQzLCAweDNGNDQsIDB4M0Y0NSwgMHgzRjQ2LCAweDNGNDcsIDB4M0Y0OCwgMHgzRjQ5LCAweDNGNEEsIDB4M0Y0QiwKKyAgICAweDNGNEMsIDB4M0Y0RCwgMHgzRjRFLCAweDNGNEYsIDB4M0Y1MCwgMHgzRjUxLCAweDNGNTIsIDB4M0Y1MywgMHgzRjU0LAorICAgIDB4M0Y1NSwgMHgzRjU2LCAweDNGNTcsIDB4M0Y1OCwgMHgzRjU5LCAweDNGNUEsIDB4M0Y1QiwgMHgzRjVDLCAweDNGNUQsCisgICAgMHgzRjVFLCAweDNGNUYsIDB4M0Y2MCwgMHgzRjYxLCAweDNGNjIsIDB4M0Y2MywgMHgzRjY0LCAweDNGNjUsIDB4M0Y2NiwKKyAgICAweDNGNjcsIDB4M0Y2OCwgMHgzRjY5LCAweDNGNkEsIDB4M0Y2QiwgMHgzRjZDLCAweDNGNkQsIDB4M0Y2RSwgMHgzRjZGLAorICAgIDB4M0Y3MCwgMHgzRjcxLCAweDNGNzIsIDB4M0Y3MywgMHgzRjc0LCAweDNGNzUsIDB4M0Y3NiwgMHgzRjc3LCAweDNGNzgsCisgICAgMHgzRjc5LCAweDNGN0EsIDB4M0Y3QiwgMHgzRjdDLCAweDNGN0QsIDB4M0Y3RSwgMHgzRjdGLCAweDNGODAsIDB4M0Y4MSwKKyAgICAweDNGODIsIDB4M0Y4MywgMHgzRjg0LCAweDNGODUsIDB4M0Y4NiwgMHgzRjg3LCAweDNGODgsIDB4M0Y4OSwgMHgzRjhBLAorICAgIDB4M0Y4QiwgMHgzRjhDLCAweDNGOEQsIDB4M0Y4RSwgMHgzRjhGLCAweDNGOTAsIDB4M0Y5MSwgMHgzRjkyLCAweDNGOTMsCisgICAgMHgzRjk0LCAweDNGOTUsIDB4M0Y5NiwgMHgzRjk3LCAweDNGOTgsIDB4M0Y5OSwgMHgzRjlBLCAweDNGOUIsIDB4M0Y5QywKKyAgICAweDNGOUQsIDB4M0Y5RSwgMHgzRjlGLCAweDNGQTAsIDB4M0ZBMSwgMHgzRkEyLCAweDNGQTMsIDB4M0ZBNCwgMHgzRkE1LAorICAgIDB4M0ZBNiwgMHgzRkE3LCAweDNGQTgsIDB4M0ZBOSwgMHgzRkFBLCAweDNGQUIsIDB4M0ZBQywgMHgzRkFELCAweDNGQUUsCisgICAgMHgzRkFGLCAweDNGQjAsIDB4M0ZCMSwgMHgzRkIyLCAweDNGQjMsIDB4M0ZCNCwgMHgzRkI1LCAweDNGQjYsIDB4M0ZCNywKKyAgICAweDNGQjgsIDB4M0ZCOSwgMHgzRkJBLCAweDNGQkIsIDB4M0ZCQywgMHgzRkJELCAweDNGQkUsIDB4M0ZCRiwgMHgzRkMwLAorICAgIDB4M0ZDMSwgMHgzRkMyLCAweDNGQzMsIDB4M0ZDNCwgMHgzRkM1LCAweDNGQzYsIDB4M0ZDNywgMHgzRkM4LCAweDNGQzksCisgICAgMHgzRkNBLCAweDNGQ0IsIDB4M0ZDQywgMHgzRkNELCAweDNGQ0UsIDB4M0ZDRiwgMHgzRkQwLCAweDNGRDEsIDB4M0ZEMiwKKyAgICAweDNGRDMsIDB4M0ZENCwgMHgzRkQ1LCAweDNGRDYsIDB4M0ZENywgMHgzRkQ4LCAweDNGRDksIDB4M0ZEQSwgMHgzRkRCLAorICAgIDB4M0ZEQywgMHgzRkRELCAweDNGREUsIDB4M0ZERiwgMHgzRkUwLCAweDNGRTEsIDB4M0ZFMiwgMHgzRkUzLCAweDNGRTQsCisgICAgMHgzRkU1LCAweDNGRTYsIDB4M0ZFNywgMHgzRkU4LCAweDNGRTksIDB4M0ZFQSwgMHgzRkVCLCAweDNGRUMsIDB4M0ZFRCwKKyAgICAweDNGRUUsIDB4M0ZFRiwgMHgzRkYwLCAweDNGRjEsIDB4M0ZGMiwgMHgzRkYzLCAweDNGRjQsIDB4M0ZGNSwgMHgzRkY2LAorICAgIDB4M0ZGNywgMHgzRkY4LCAweDNGRjksIDB4M0ZGQSwgMHgzRkZCLCAweDNGRkMsIDB4M0ZGRCwgMHgzRkZFLCAweDNGRkYsCisgICAgMHg0MDAwLCAweDQwMDEsIDB4NDAwMiwgMHg0MDAzLCAweDQwMDQsIDB4NDAwNSwgMHg0MDA2LCAweDQwMDcsIDB4NDAwOCwKKyAgICAweDQwMDksIDB4NDAwQSwgMHg0MDBCLCAweDQwMEMsIDB4NDAwRCwgMHg0MDBFLCAweDQwMEYsIDB4NDAxMCwgMHg0MDExLAorICAgIDB4NDAxMiwgMHg0MDEzLCAweDQwMTQsIDB4NDAxNSwgMHg0MDE2LCAweDQwMTcsIDB4NDAxOCwgMHg0MDE5LCAweDQwMUEsCisgICAgMHg0MDFCLCAweDQwMUMsIDB4NDAxRCwgMHg0MDFFLCAweDQwMUYsIDB4NDAyMCwgMHg0MDIxLCAweDQwMjIsIDB4NDAyMywKKyAgICAweDQwMjQsIDB4NDAyNSwgMHg0MDI2LCAweDQwMjcsIDB4NDAyOCwgMHg0MDI5LCAweDQwMkEsIDB4NDAyQiwgMHg0MDJDLAorICAgIDB4NDAyRCwgMHg0MDJFLCAweDQwMkYsIDB4NDAzMCwgMHg0MDMxLCAweDQwMzIsIDB4NDAzMywgMHg0MDM0LCAweDQwMzUsCisgICAgMHg0MDM2LCAweDQwMzcsIDB4NDAzOCwgMHg0MDM5LCAweDQwM0EsIDB4NDAzQiwgMHg0MDNDLCAweDQwM0QsIDB4NDAzRSwKKyAgICAweDQwM0YsIDB4NDA0MCwgMHg0MDQxLCAweDQwNDIsIDB4NDA0MywgMHg0MDQ0LCAweDQwNDUsIDB4NDA0NiwgMHg0MDQ3LAorICAgIDB4NDA0OCwgMHg0MDQ5LCAweDQwNEEsIDB4NDA0QiwgMHg0MDRDLCAweDQwNEQsIDB4NDA0RSwgMHg0MDRGLCAweDQwNTAsCisgICAgMHg0MDUxLCAweDQwNTIsIDB4NDA1MywgMHg0MDU0LCAweDQwNTUsIDB4NDA1NywgMHg0MDU4LCAweDQwNTksIDB4NDA1QSwKKyAgICAweDQwNUIsIDB4NDA1QywgMHg0MDVELCAweDQwNUUsIDB4NDA1RiwgMHg0MDYwLCAweDQwNjEsIDB4NDA2MiwgMHg0MDYzLAorICAgIDB4NDA2NCwgMHg0MDY1LCAweDQwNjYsIDB4NDA2NywgMHg0MDY4LCAweDQwNjksIDB4NDA2QSwgMHg0MDZCLCAweDQwNkMsCisgICAgMHg0MDZELCAweDQwNkUsIDB4NDA2RiwgMHg0MDcwLCAweDQwNzEsIDB4NDA3MiwgMHg0MDczLCAweDQwNzQsIDB4NDA3NSwKKyAgICAweDQwNzYsIDB4NDA3NywgMHg0MDc4LCAweDQwNzksIDB4NDA3QSwgMHg0MDdCLCAweDQwN0MsIDB4NDA3RCwgMHg0MDdFLAorICAgIDB4NDA3RiwgMHg0MDgwLCAweDQwODEsIDB4NDA4MiwgMHg0MDgzLCAweDQwODQsIDB4NDA4NSwgMHg0MDg2LCAweDQwODcsCisgICAgMHg0MDg4LCAweDQwODksIDB4NDA4QSwgMHg0MDhCLCAweDQwOEMsIDB4NDA4RCwgMHg0MDhFLCAweDQwOEYsIDB4NDA5MCwKKyAgICAweDQwOTEsIDB4NDA5MiwgMHg0MDkzLCAweDQwOTQsIDB4NDA5NSwgMHg0MDk2LCAweDQwOTcsIDB4NDA5OCwgMHg0MDk5LAorICAgIDB4NDA5QSwgMHg0MDlCLCAweDQwOUMsIDB4NDA5RCwgMHg0MDlFLCAweDQwOUYsIDB4NDBBMCwgMHg0MEExLCAweDQwQTIsCisgICAgMHg0MEEzLCAweDQwQTQsIDB4NDBBNSwgMHg0MEE2LCAweDQwQTcsIDB4NDBBOCwgMHg0MEE5LCAweDQwQUEsIDB4NDBBQiwKKyAgICAweDQwQUMsIDB4NDBBRCwgMHg0MEFFLCAweDQwQUYsIDB4NDBCMCwgMHg0MEIxLCAweDQwQjIsIDB4NDBCMywgMHg0MEI0LAorICAgIDB4NDBCNSwgMHg0MEI2LCAweDQwQjcsIDB4NDBCOCwgMHg0MEI5LCAweDQwQkEsIDB4NDBCQiwgMHg0MEJDLCAweDQwQkQsCisgICAgMHg0MEJFLCAweDQwQkYsIDB4NDBDMCwgMHg0MEMxLCAweDQwQzIsIDB4NDBDMywgMHg0MEM0LCAweDQwQzUsIDB4NDBDNiwKKyAgICAweDQwQzcsIDB4NDBDOCwgMHg0MEM5LCAweDQwQ0EsIDB4NDBDQiwgMHg0MENDLCAweDQwQ0QsIDB4NDBDRSwgMHg0MENGLAorICAgIDB4NDBEMCwgMHg0MEQxLCAweDQwRDIsIDB4NDBEMywgMHg0MEQ0LCAweDQwRDUsIDB4NDBENiwgMHg0MEQ3LCAweDQwRDgsCisgICAgMHg0MEQ5LCAweDQwREEsIDB4NDBEQiwgMHg0MERDLCAweDQwREQsIDB4NDBERSwgMHg0MERGLCAweDQwRTAsIDB4NDBFMSwKKyAgICAweDQwRTIsIDB4NDBFMywgMHg0MEU0LCAweDQwRTUsIDB4NDBFNiwgMHg0MEU3LCAweDQwRTgsIDB4NDBFOSwgMHg0MEVBLAorICAgIDB4NDBFQiwgMHg0MEVDLCAweDQwRUQsIDB4NDBFRSwgMHg0MEVGLCAweDQwRjAsIDB4NDBGMSwgMHg0MEYyLCAweDQwRjMsCisgICAgMHg0MEY0LCAweDQwRjUsIDB4NDBGNiwgMHg0MEY3LCAweDQwRjgsIDB4NDBGOSwgMHg0MEZBLCAweDQwRkIsIDB4NDBGQywKKyAgICAweDQwRkQsIDB4NDBGRSwgMHg0MEZGLCAweDQxMDAsIDB4NDEwMSwgMHg0MTAyLCAweDQxMDMsIDB4NDEwNCwgMHg0MTA1LAorICAgIDB4NDEwNiwgMHg0MTA3LCAweDQxMDgsIDB4NDEwOSwgMHg0MTBBLCAweDQxMEIsIDB4NDEwQywgMHg0MTBELCAweDQxMEUsCisgICAgMHg0MTBGLCAweDQxMTAsIDB4NDExMSwgMHg0MTEyLCAweDQxMTMsIDB4NDExNCwgMHg0MTE1LCAweDQxMTYsIDB4NDExNywKKyAgICAweDQxMTgsIDB4NDExOSwgMHg0MTFBLCAweDQxMUIsIDB4NDExQywgMHg0MTFELCAweDQxMUUsIDB4NDExRiwgMHg0MTIwLAorICAgIDB4NDEyMSwgMHg0MTIyLCAweDQxMjMsIDB4NDEyNCwgMHg0MTI1LCAweDQxMjYsIDB4NDEyNywgMHg0MTI4LCAweDQxMjksCisgICAgMHg0MTJBLCAweDQxMkIsIDB4NDEyQywgMHg0MTJELCAweDQxMkUsIDB4NDEyRiwgMHg0MTMwLCAweDQxMzEsIDB4NDEzMiwKKyAgICAweDQxMzMsIDB4NDEzNCwgMHg0MTM1LCAweDQxMzYsIDB4NDEzNywgMHg0MTM4LCAweDQxMzksIDB4NDEzQSwgMHg0MTNCLAorICAgIDB4NDEzQywgMHg0MTNELCAweDQxM0UsIDB4NDEzRiwgMHg0MTQwLCAweDQxNDEsIDB4NDE0MiwgMHg0MTQzLCAweDQxNDQsCisgICAgMHg0MTQ1LCAweDQxNDYsIDB4NDE0NywgMHg0MTQ4LCAweDQxNDksIDB4NDE0QSwgMHg0MTRCLCAweDQxNEMsIDB4NDE0RCwKKyAgICAweDQxNEUsIDB4NDE0RiwgMHg0MTUwLCAweDQxNTEsIDB4NDE1MiwgMHg0MTUzLCAweDQxNTQsIDB4NDE1NSwgMHg0MTU2LAorICAgIDB4NDE1NywgMHg0MTU4LCAweDQxNTksIDB4NDE1QSwgMHg0MTVCLCAweDQxNUMsIDB4NDE1RCwgMHg0MTVFLCAweDQxNjAsCisgICAgMHg0MTYxLCAweDQxNjIsIDB4NDE2MywgMHg0MTY0LCAweDQxNjUsIDB4NDE2NiwgMHg0MTY3LCAweDQxNjgsIDB4NDE2OSwKKyAgICAweDQxNkEsIDB4NDE2QiwgMHg0MTZDLCAweDQxNkQsIDB4NDE2RSwgMHg0MTZGLCAweDQxNzAsIDB4NDE3MSwgMHg0MTcyLAorICAgIDB4NDE3MywgMHg0MTc0LCAweDQxNzUsIDB4NDE3NiwgMHg0MTc3LCAweDQxNzgsIDB4NDE3OSwgMHg0MTdBLCAweDQxN0IsCisgICAgMHg0MTdDLCAweDQxN0QsIDB4NDE3RSwgMHg0MTdGLCAweDQxODAsIDB4NDE4MSwgMHg0MTgyLCAweDQxODMsIDB4NDE4NCwKKyAgICAweDQxODUsIDB4NDE4NiwgMHg0MTg3LCAweDQxODgsIDB4NDE4OSwgMHg0MThBLCAweDQxOEIsIDB4NDE4QywgMHg0MThELAorICAgIDB4NDE4RSwgMHg0MThGLCAweDQxOTAsIDB4NDE5MSwgMHg0MTkyLCAweDQxOTMsIDB4NDE5NCwgMHg0MTk1LCAweDQxOTYsCisgICAgMHg0MTk3LCAweDQxOTgsIDB4NDE5OSwgMHg0MTlBLCAweDQxOUIsIDB4NDE5QywgMHg0MTlELCAweDQxOUUsIDB4NDE5RiwKKyAgICAweDQxQTAsIDB4NDFBMSwgMHg0MUEyLCAweDQxQTMsIDB4NDFBNCwgMHg0MUE1LCAweDQxQTYsIDB4NDFBNywgMHg0MUE4LAorICAgIDB4NDFBOSwgMHg0MUFBLCAweDQxQUIsIDB4NDFBQywgMHg0MUFELCAweDQxQUUsIDB4NDFBRiwgMHg0MUIwLCAweDQxQjEsCisgICAgMHg0MUIyLCAweDQxQjMsIDB4NDFCNCwgMHg0MUI1LCAweDQxQjYsIDB4NDFCNywgMHg0MUI4LCAweDQxQjksIDB4NDFCQSwKKyAgICAweDQxQkIsIDB4NDFCQywgMHg0MUJELCAweDQxQkUsIDB4NDFCRiwgMHg0MUMwLCAweDQxQzEsIDB4NDFDMiwgMHg0MUMzLAorICAgIDB4NDFDNCwgMHg0MUM1LCAweDQxQzYsIDB4NDFDNywgMHg0MUM4LCAweDQxQzksIDB4NDFDQSwgMHg0MUNCLCAweDQxQ0MsCisgICAgMHg0MUNELCAweDQxQ0UsIDB4NDFDRiwgMHg0MUQwLCAweDQxRDEsIDB4NDFEMiwgMHg0MUQzLCAweDQxRDQsIDB4NDFENSwKKyAgICAweDQxRDYsIDB4NDFENywgMHg0MUQ4LCAweDQxRDksIDB4NDFEQSwgMHg0MURCLCAweDQxREMsIDB4NDFERCwgMHg0MURFLAorICAgIDB4NDFERiwgMHg0MUUwLCAweDQxRTEsIDB4NDFFMiwgMHg0MUUzLCAweDQxRTQsIDB4NDFFNSwgMHg0MUU2LCAweDQxRTcsCisgICAgMHg0MUU4LCAweDQxRTksIDB4NDFFQSwgMHg0MUVCLCAweDQxRUMsIDB4NDFFRCwgMHg0MUVFLCAweDQxRUYsIDB4NDFGMCwKKyAgICAweDQxRjEsIDB4NDFGMiwgMHg0MUYzLCAweDQxRjQsIDB4NDFGNSwgMHg0MUY2LCAweDQxRjcsIDB4NDFGOCwgMHg0MUY5LAorICAgIDB4NDFGQSwgMHg0MUZCLCAweDQxRkMsIDB4NDFGRCwgMHg0MUZFLCAweDQxRkYsIDB4NDIwMCwgMHg0MjAxLCAweDQyMDIsCisgICAgMHg0MjAzLCAweDQyMDQsIDB4NDIwNSwgMHg0MjA2LCAweDQyMDcsIDB4NDIwOCwgMHg0MjA5LCAweDQyMEEsIDB4NDIwQiwKKyAgICAweDQyMEMsIDB4NDIwRCwgMHg0MjBFLCAweDQyMEYsIDB4NDIxMCwgMHg0MjExLCAweDQyMTIsIDB4NDIxMywgMHg0MjE0LAorICAgIDB4NDIxNSwgMHg0MjE2LCAweDQyMTcsIDB4NDIxOCwgMHg0MjE5LCAweDQyMUEsIDB4NDIxQiwgMHg0MjFDLCAweDQyMUQsCisgICAgMHg0MjFFLCAweDQyMUYsIDB4NDIyMCwgMHg0MjIxLCAweDQyMjIsIDB4NDIyMywgMHg0MjI0LCAweDQyMjUsIDB4NDIyNiwKKyAgICAweDQyMjcsIDB4NDIyOCwgMHg0MjI5LCAweDQyMkEsIDB4NDIyQiwgMHg0MjJDLCAweDQyMkQsIDB4NDIyRSwgMHg0MjJGLAorICAgIDB4NDIzMCwgMHg0MjMxLCAweDQyMzIsIDB4NDIzMywgMHg0MjM0LCAweDQyMzUsIDB4NDIzNiwgMHg0MjM3LCAweDQyMzgsCisgICAgMHg0MjM5LCAweDQyM0EsIDB4NDIzQiwgMHg0MjNDLCAweDQyM0QsIDB4NDIzRSwgMHg0MjNGLCAweDQyNDAsIDB4NDI0MSwKKyAgICAweDQyNDIsIDB4NDI0MywgMHg0MjQ0LCAweDQyNDUsIDB4NDI0NiwgMHg0MjQ3LCAweDQyNDgsIDB4NDI0OSwgMHg0MjRBLAorICAgIDB4NDI0QiwgMHg0MjRDLCAweDQyNEQsIDB4NDI0RSwgMHg0MjRGLCAweDQyNTAsIDB4NDI1MSwgMHg0MjUyLCAweDQyNTMsCisgICAgMHg0MjU0LCAweDQyNTUsIDB4NDI1NiwgMHg0MjU3LCAweDQyNTgsIDB4NDI1OSwgMHg0MjVBLCAweDQyNUIsIDB4NDI1QywKKyAgICAweDQyNUQsIDB4NDI1RSwgMHg0MjVGLCAweDQyNjAsIDB4NDI2MSwgMHg0MjYyLCAweDQyNjMsIDB4NDI2NCwgMHg0MjY1LAorICAgIDB4NDI2NiwgMHg0MjY3LCAweDQyNjgsIDB4NDI2OSwgMHg0MjZBLCAweDQyNkIsIDB4NDI2QywgMHg0MjZELCAweDQyNkUsCisgICAgMHg0MjZGLCAweDQyNzAsIDB4NDI3MSwgMHg0MjcyLCAweDQyNzMsIDB4NDI3NCwgMHg0Mjc1LCAweDQyNzYsIDB4NDI3NywKKyAgICAweDQyNzgsIDB4NDI3OSwgMHg0MjdBLCAweDQyN0IsIDB4NDI3QywgMHg0MjdELCAweDQyN0UsIDB4NDI3RiwgMHg0MjgwLAorICAgIDB4NDI4MSwgMHg0MjgyLCAweDQyODMsIDB4NDI4NCwgMHg0Mjg1LCAweDQyODYsIDB4NDI4NywgMHg0Mjg4LCAweDQyODksCisgICAgMHg0MjhBLCAweDQyOEIsIDB4NDI4QywgMHg0MjhELCAweDQyOEUsIDB4NDI4RiwgMHg0MjkwLCAweDQyOTEsIDB4NDI5MiwKKyAgICAweDQyOTMsIDB4NDI5NCwgMHg0Mjk1LCAweDQyOTYsIDB4NDI5NywgMHg0Mjk4LCAweDQyOTksIDB4NDI5QSwgMHg0MjlCLAorICAgIDB4NDI5QywgMHg0MjlELCAweDQyOUUsIDB4NDI5RiwgMHg0MkEwLCAweDQyQTEsIDB4NDJBMiwgMHg0MkEzLCAweDQyQTQsCisgICAgMHg0MkE1LCAweDQyQTYsIDB4NDJBNywgMHg0MkE4LCAweDQyQTksIDB4NDJBQSwgMHg0MkFCLCAweDQyQUMsIDB4NDJBRCwKKyAgICAweDQyQUUsIDB4NDJBRiwgMHg0MkIwLCAweDQyQjEsIDB4NDJCMiwgMHg0MkIzLCAweDQyQjQsIDB4NDJCNSwgMHg0MkI2LAorICAgIDB4NDJCNywgMHg0MkI4LCAweDQyQjksIDB4NDJCQSwgMHg0MkJCLCAweDQyQkMsIDB4NDJCRCwgMHg0MkJFLCAweDQyQkYsCisgICAgMHg0MkMwLCAweDQyQzEsIDB4NDJDMiwgMHg0MkMzLCAweDQyQzQsIDB4NDJDNSwgMHg0MkM2LCAweDQyQzcsIDB4NDJDOCwKKyAgICAweDQyQzksIDB4NDJDQSwgMHg0MkNCLCAweDQyQ0MsIDB4NDJDRCwgMHg0MkNFLCAweDQyQ0YsIDB4NDJEMCwgMHg0MkQxLAorICAgIDB4NDJEMiwgMHg0MkQzLCAweDQyRDQsIDB4NDJENSwgMHg0MkQ2LCAweDQyRDcsIDB4NDJEOCwgMHg0MkQ5LCAweDQyREEsCisgICAgMHg0MkRCLCAweDQyREMsIDB4NDJERCwgMHg0MkRFLCAweDQyREYsIDB4NDJFMCwgMHg0MkUxLCAweDQyRTIsIDB4NDJFMywKKyAgICAweDQyRTQsIDB4NDJFNSwgMHg0MkU2LCAweDQyRTcsIDB4NDJFOCwgMHg0MkU5LCAweDQyRUEsIDB4NDJFQiwgMHg0MkVDLAorICAgIDB4NDJFRCwgMHg0MkVFLCAweDQyRUYsIDB4NDJGMCwgMHg0MkYxLCAweDQyRjIsIDB4NDJGMywgMHg0MkY0LCAweDQyRjUsCisgICAgMHg0MkY2LCAweDQyRjcsIDB4NDJGOCwgMHg0MkY5LCAweDQyRkEsIDB4NDJGQiwgMHg0MkZDLCAweDQyRkQsIDB4NDJGRSwKKyAgICAweDQyRkYsIDB4NDMwMCwgMHg0MzAxLCAweDQzMDIsIDB4NDMwMywgMHg0MzA0LCAweDQzMDUsIDB4NDMwNiwgMHg0MzA3LAorICAgIDB4NDMwOCwgMHg0MzA5LCAweDQzMEEsIDB4NDMwQiwgMHg0MzBDLCAweDQzMEQsIDB4NDMwRSwgMHg0MzBGLCAweDQzMTAsCisgICAgMHg0MzExLCAweDQzMTIsIDB4NDMxMywgMHg0MzE0LCAweDQzMTUsIDB4NDMxNiwgMHg0MzE3LCAweDQzMTgsIDB4NDMxOSwKKyAgICAweDQzMUEsIDB4NDMxQiwgMHg0MzFDLCAweDQzMUQsIDB4NDMxRSwgMHg0MzFGLCAweDQzMjAsIDB4NDMyMSwgMHg0MzIyLAorICAgIDB4NDMyMywgMHg0MzI0LCAweDQzMjUsIDB4NDMyNiwgMHg0MzI3LCAweDQzMjgsIDB4NDMyOSwgMHg0MzJBLCAweDQzMkIsCisgICAgMHg0MzJDLCAweDQzMkQsIDB4NDMyRSwgMHg0MzJGLCAweDQzMzAsIDB4NDMzMSwgMHg0MzMyLCAweDQzMzMsIDB4NDMzNCwKKyAgICAweDQzMzUsIDB4NDMzNiwgMHg0MzM4LCAweDQzMzksIDB4NDMzQSwgMHg0MzNCLCAweDQzM0MsIDB4NDMzRCwgMHg0MzNFLAorICAgIDB4NDMzRiwgMHg0MzQwLCAweDQzNDEsIDB4NDM0MiwgMHg0MzQzLCAweDQzNDQsIDB4NDM0NSwgMHg0MzQ2LCAweDQzNDcsCisgICAgMHg0MzQ4LCAweDQzNDksIDB4NDM0QSwgMHg0MzRCLCAweDQzNEMsIDB4NDM0RCwgMHg0MzRFLCAweDQzNEYsIDB4NDM1MCwKKyAgICAweDQzNTEsIDB4NDM1MiwgMHg0MzUzLCAweDQzNTQsIDB4NDM1NSwgMHg0MzU2LCAweDQzNTcsIDB4NDM1OCwgMHg0MzU5LAorICAgIDB4NDM1QSwgMHg0MzVCLCAweDQzNUMsIDB4NDM1RCwgMHg0MzVFLCAweDQzNUYsIDB4NDM2MCwgMHg0MzYxLCAweDQzNjIsCisgICAgMHg0MzYzLCAweDQzNjQsIDB4NDM2NSwgMHg0MzY2LCAweDQzNjcsIDB4NDM2OCwgMHg0MzY5LCAweDQzNkEsIDB4NDM2QiwKKyAgICAweDQzNkMsIDB4NDM2RCwgMHg0MzZFLCAweDQzNkYsIDB4NDM3MCwgMHg0MzcxLCAweDQzNzIsIDB4NDM3MywgMHg0Mzc0LAorICAgIDB4NDM3NSwgMHg0Mzc2LCAweDQzNzcsIDB4NDM3OCwgMHg0Mzc5LCAweDQzN0EsIDB4NDM3QiwgMHg0MzdDLCAweDQzN0QsCisgICAgMHg0MzdFLCAweDQzN0YsIDB4NDM4MCwgMHg0MzgxLCAweDQzODIsIDB4NDM4MywgMHg0Mzg0LCAweDQzODUsIDB4NDM4NiwKKyAgICAweDQzODcsIDB4NDM4OCwgMHg0Mzg5LCAweDQzOEEsIDB4NDM4QiwgMHg0MzhDLCAweDQzOEQsIDB4NDM4RSwgMHg0MzhGLAorICAgIDB4NDM5MCwgMHg0MzkxLCAweDQzOTIsIDB4NDM5MywgMHg0Mzk0LCAweDQzOTUsIDB4NDM5NiwgMHg0Mzk3LCAweDQzOTgsCisgICAgMHg0Mzk5LCAweDQzOUEsIDB4NDM5QiwgMHg0MzlDLCAweDQzOUQsIDB4NDM5RSwgMHg0MzlGLCAweDQzQTAsIDB4NDNBMSwKKyAgICAweDQzQTIsIDB4NDNBMywgMHg0M0E0LCAweDQzQTUsIDB4NDNBNiwgMHg0M0E3LCAweDQzQTgsIDB4NDNBOSwgMHg0M0FBLAorICAgIDB4NDNBQiwgMHg0M0FELCAweDQzQUUsIDB4NDNBRiwgMHg0M0IwLCAweDQzQjIsIDB4NDNCMywgMHg0M0I0LCAweDQzQjUsCisgICAgMHg0M0I2LCAweDQzQjcsIDB4NDNCOCwgMHg0M0I5LCAweDQzQkEsIDB4NDNCQiwgMHg0M0JDLCAweDQzQkQsIDB4NDNCRSwKKyAgICAweDQzQkYsIDB4NDNDMCwgMHg0M0MxLCAweDQzQzIsIDB4NDNDMywgMHg0M0M0LCAweDQzQzUsIDB4NDNDNiwgMHg0M0M3LAorICAgIDB4NDNDOCwgMHg0M0M5LCAweDQzQ0EsIDB4NDNDQiwgMHg0M0NDLCAweDQzQ0QsIDB4NDNDRSwgMHg0M0NGLCAweDQzRDAsCisgICAgMHg0M0QxLCAweDQzRDIsIDB4NDNEMywgMHg0M0Q0LCAweDQzRDUsIDB4NDNENiwgMHg0M0Q3LCAweDQzRDgsIDB4NDNEOSwKKyAgICAweDQzREEsIDB4NDNEQiwgMHg0M0RDLCAweDQzREUsIDB4NDNERiwgMHg0M0UwLCAweDQzRTEsIDB4NDNFMiwgMHg0M0UzLAorICAgIDB4NDNFNCwgMHg0M0U1LCAweDQzRTYsIDB4NDNFNywgMHg0M0U4LCAweDQzRTksIDB4NDNFQSwgMHg0M0VCLCAweDQzRUMsCisgICAgMHg0M0VELCAweDQzRUUsIDB4NDNFRiwgMHg0M0YwLCAweDQzRjEsIDB4NDNGMiwgMHg0M0YzLCAweDQzRjQsIDB4NDNGNSwKKyAgICAweDQzRjYsIDB4NDNGNywgMHg0M0Y4LCAweDQzRjksIDB4NDNGQSwgMHg0M0ZCLCAweDQzRkMsIDB4NDNGRCwgMHg0M0ZFLAorICAgIDB4NDNGRiwgMHg0NDAwLCAweDQ0MDEsIDB4NDQwMiwgMHg0NDAzLCAweDQ0MDQsIDB4NDQwNSwgMHg0NDA2LCAweDQ0MDcsCisgICAgMHg0NDA4LCAweDQ0MDksIDB4NDQwQSwgMHg0NDBCLCAweDQ0MEMsIDB4NDQwRCwgMHg0NDBFLCAweDQ0MEYsIDB4NDQxMCwKKyAgICAweDQ0MTEsIDB4NDQxMiwgMHg0NDEzLCAweDQ0MTQsIDB4NDQxNSwgMHg0NDE2LCAweDQ0MTcsIDB4NDQxOCwgMHg0NDE5LAorICAgIDB4NDQxQSwgMHg0NDFCLCAweDQ0MUMsIDB4NDQxRCwgMHg0NDFFLCAweDQ0MUYsIDB4NDQyMCwgMHg0NDIxLCAweDQ0MjIsCisgICAgMHg0NDIzLCAweDQ0MjQsIDB4NDQyNSwgMHg0NDI2LCAweDQ0MjcsIDB4NDQyOCwgMHg0NDI5LCAweDQ0MkEsIDB4NDQyQiwKKyAgICAweDQ0MkMsIDB4NDQyRCwgMHg0NDJFLCAweDQ0MkYsIDB4NDQzMCwgMHg0NDMxLCAweDQ0MzIsIDB4NDQzMywgMHg0NDM0LAorICAgIDB4NDQzNSwgMHg0NDM2LCAweDQ0MzcsIDB4NDQzOCwgMHg0NDM5LCAweDQ0M0EsIDB4NDQzQiwgMHg0NDNDLCAweDQ0M0QsCisgICAgMHg0NDNFLCAweDQ0M0YsIDB4NDQ0MCwgMHg0NDQxLCAweDQ0NDIsIDB4NDQ0MywgMHg0NDQ0LCAweDQ0NDUsIDB4NDQ0NiwKKyAgICAweDQ0NDcsIDB4NDQ0OCwgMHg0NDQ5LCAweDQ0NEEsIDB4NDQ0QiwgMHg0NDRDLCAweDQ0NEQsIDB4NDQ0RSwgMHg0NDRGLAorICAgIDB4NDQ1MCwgMHg0NDUxLCAweDQ0NTIsIDB4NDQ1MywgMHg0NDU0LCAweDQ0NTUsIDB4NDQ1NiwgMHg0NDU3LCAweDQ0NTgsCisgICAgMHg0NDU5LCAweDQ0NUEsIDB4NDQ1QiwgMHg0NDVDLCAweDQ0NUQsIDB4NDQ1RSwgMHg0NDVGLCAweDQ0NjAsIDB4NDQ2MSwKKyAgICAweDQ0NjIsIDB4NDQ2MywgMHg0NDY0LCAweDQ0NjUsIDB4NDQ2NiwgMHg0NDY3LCAweDQ0NjgsIDB4NDQ2OSwgMHg0NDZBLAorICAgIDB4NDQ2QiwgMHg0NDZDLCAweDQ0NkQsIDB4NDQ2RSwgMHg0NDZGLCAweDQ0NzAsIDB4NDQ3MSwgMHg0NDcyLCAweDQ0NzMsCisgICAgMHg0NDc0LCAweDQ0NzUsIDB4NDQ3NiwgMHg0NDc3LCAweDQ0NzgsIDB4NDQ3OSwgMHg0NDdBLCAweDQ0N0IsIDB4NDQ3QywKKyAgICAweDQ0N0QsIDB4NDQ3RSwgMHg0NDdGLCAweDQ0ODAsIDB4NDQ4MSwgMHg0NDgyLCAweDQ0ODMsIDB4NDQ4NCwgMHg0NDg1LAorICAgIDB4NDQ4NiwgMHg0NDg3LCAweDQ0ODgsIDB4NDQ4OSwgMHg0NDhBLCAweDQ0OEIsIDB4NDQ4QywgMHg0NDhELCAweDQ0OEUsCisgICAgMHg0NDhGLCAweDQ0OTAsIDB4NDQ5MSwgMHg0NDkyLCAweDQ0OTMsIDB4NDQ5NCwgMHg0NDk1LCAweDQ0OTYsIDB4NDQ5NywKKyAgICAweDQ0OTgsIDB4NDQ5OSwgMHg0NDlBLCAweDQ0OUIsIDB4NDQ5QywgMHg0NDlELCAweDQ0OUUsIDB4NDQ5RiwgMHg0NEEwLAorICAgIDB4NDRBMSwgMHg0NEEyLCAweDQ0QTMsIDB4NDRBNCwgMHg0NEE1LCAweDQ0QTYsIDB4NDRBNywgMHg0NEE4LCAweDQ0QTksCisgICAgMHg0NEFBLCAweDQ0QUIsIDB4NDRBQywgMHg0NEFELCAweDQ0QUUsIDB4NDRBRiwgMHg0NEIwLCAweDQ0QjEsIDB4NDRCMiwKKyAgICAweDQ0QjMsIDB4NDRCNCwgMHg0NEI1LCAweDQ0QjYsIDB4NDRCNywgMHg0NEI4LCAweDQ0QjksIDB4NDRCQSwgMHg0NEJCLAorICAgIDB4NDRCQywgMHg0NEJELCAweDQ0QkUsIDB4NDRCRiwgMHg0NEMwLCAweDQ0QzEsIDB4NDRDMiwgMHg0NEMzLCAweDQ0QzQsCisgICAgMHg0NEM1LCAweDQ0QzYsIDB4NDRDNywgMHg0NEM4LCAweDQ0QzksIDB4NDRDQSwgMHg0NENCLCAweDQ0Q0MsIDB4NDRDRCwKKyAgICAweDQ0Q0UsIDB4NDRDRiwgMHg0NEQwLCAweDQ0RDEsIDB4NDREMiwgMHg0NEQzLCAweDQ0RDQsIDB4NDRENSwgMHg0NEQ3LAorICAgIDB4NDREOCwgMHg0NEQ5LCAweDQ0REEsIDB4NDREQiwgMHg0NERDLCAweDQ0REQsIDB4NDRERSwgMHg0NERGLCAweDQ0RTAsCisgICAgMHg0NEUxLCAweDQ0RTIsIDB4NDRFMywgMHg0NEU0LCAweDQ0RTUsIDB4NDRFNiwgMHg0NEU3LCAweDQ0RTgsIDB4NDRFOSwKKyAgICAweDQ0RUEsIDB4NDRFQiwgMHg0NEVDLCAweDQ0RUQsIDB4NDRFRSwgMHg0NEVGLCAweDQ0RjAsIDB4NDRGMSwgMHg0NEYyLAorICAgIDB4NDRGMywgMHg0NEY0LCAweDQ0RjUsIDB4NDRGNiwgMHg0NEY3LCAweDQ0RjgsIDB4NDRGOSwgMHg0NEZBLCAweDQ0RkIsCisgICAgMHg0NEZDLCAweDQ0RkQsIDB4NDRGRSwgMHg0NEZGLCAweDQ1MDAsIDB4NDUwMSwgMHg0NTAyLCAweDQ1MDMsIDB4NDUwNCwKKyAgICAweDQ1MDUsIDB4NDUwNiwgMHg0NTA3LCAweDQ1MDgsIDB4NDUwOSwgMHg0NTBBLCAweDQ1MEIsIDB4NDUwQywgMHg0NTBELAorICAgIDB4NDUwRSwgMHg0NTBGLCAweDQ1MTAsIDB4NDUxMSwgMHg0NTEyLCAweDQ1MTMsIDB4NDUxNCwgMHg0NTE1LCAweDQ1MTYsCisgICAgMHg0NTE3LCAweDQ1MTgsIDB4NDUxOSwgMHg0NTFBLCAweDQ1MUIsIDB4NDUxQywgMHg0NTFELCAweDQ1MUUsIDB4NDUxRiwKKyAgICAweDQ1MjAsIDB4NDUyMSwgMHg0NTIyLCAweDQ1MjMsIDB4NDUyNCwgMHg0NTI1LCAweDQ1MjYsIDB4NDUyNywgMHg0NTI4LAorICAgIDB4NDUyOSwgMHg0NTJBLCAweDQ1MkIsIDB4NDUyQywgMHg0NTJELCAweDQ1MkUsIDB4NDUyRiwgMHg0NTMwLCAweDQ1MzEsCisgICAgMHg0NTMyLCAweDQ1MzMsIDB4NDUzNCwgMHg0NTM1LCAweDQ1MzYsIDB4NDUzNywgMHg0NTM4LCAweDQ1MzksIDB4NDUzQSwKKyAgICAweDQ1M0IsIDB4NDUzQywgMHg0NTNELCAweDQ1M0UsIDB4NDUzRiwgMHg0NTQwLCAweDQ1NDEsIDB4NDU0MiwgMHg0NTQzLAorICAgIDB4NDU0NCwgMHg0NTQ1LCAweDQ1NDYsIDB4NDU0NywgMHg0NTQ4LCAweDQ1NDksIDB4NDU0QSwgMHg0NTRCLCAweDQ1NEMsCisgICAgMHg0NTRELCAweDQ1NEUsIDB4NDU0RiwgMHg0NTUwLCAweDQ1NTEsIDB4NDU1MiwgMHg0NTUzLCAweDQ1NTQsIDB4NDU1NSwKKyAgICAweDQ1NTYsIDB4NDU1NywgMHg0NTU4LCAweDQ1NTksIDB4NDU1QSwgMHg0NTVCLCAweDQ1NUMsIDB4NDU1RCwgMHg0NTVFLAorICAgIDB4NDU1RiwgMHg0NTYwLCAweDQ1NjEsIDB4NDU2MiwgMHg0NTYzLCAweDQ1NjQsIDB4NDU2NSwgMHg0NTY2LCAweDQ1NjcsCisgICAgMHg0NTY4LCAweDQ1NjksIDB4NDU2QSwgMHg0NTZCLCAweDQ1NkMsIDB4NDU2RCwgMHg0NTZFLCAweDQ1NkYsIDB4NDU3MCwKKyAgICAweDQ1NzEsIDB4NDU3MiwgMHg0NTczLCAweDQ1NzQsIDB4NDU3NSwgMHg0NTc2LCAweDQ1NzcsIDB4NDU3OCwgMHg0NTc5LAorICAgIDB4NDU3QSwgMHg0NTdCLCAweDQ1N0MsIDB4NDU3RCwgMHg0NTdFLCAweDQ1N0YsIDB4NDU4MCwgMHg0NTgxLCAweDQ1ODIsCisgICAgMHg0NTgzLCAweDQ1ODQsIDB4NDU4NSwgMHg0NTg2LCAweDQ1ODcsIDB4NDU4OCwgMHg0NTg5LCAweDQ1OEEsIDB4NDU4QiwKKyAgICAweDQ1OEMsIDB4NDU4RCwgMHg0NThFLCAweDQ1OEYsIDB4NDU5MCwgMHg0NTkxLCAweDQ1OTIsIDB4NDU5MywgMHg0NTk0LAorICAgIDB4NDU5NSwgMHg0NTk2LCAweDQ1OTcsIDB4NDU5OCwgMHg0NTk5LCAweDQ1OUEsIDB4NDU5QiwgMHg0NTlDLCAweDQ1OUQsCisgICAgMHg0NTlFLCAweDQ1OUYsIDB4NDVBMCwgMHg0NUExLCAweDQ1QTIsIDB4NDVBMywgMHg0NUE0LCAweDQ1QTUsIDB4NDVBNiwKKyAgICAweDQ1QTcsIDB4NDVBOCwgMHg0NUE5LCAweDQ1QUEsIDB4NDVBQiwgMHg0NUFDLCAweDQ1QUQsIDB4NDVBRSwgMHg0NUFGLAorICAgIDB4NDVCMCwgMHg0NUIxLCAweDQ1QjIsIDB4NDVCMywgMHg0NUI0LCAweDQ1QjUsIDB4NDVCNiwgMHg0NUI3LCAweDQ1QjgsCisgICAgMHg0NUI5LCAweDQ1QkEsIDB4NDVCQiwgMHg0NUJDLCAweDQ1QkQsIDB4NDVCRSwgMHg0NUJGLCAweDQ1QzAsIDB4NDVDMSwKKyAgICAweDQ1QzIsIDB4NDVDMywgMHg0NUM0LCAweDQ1QzUsIDB4NDVDNiwgMHg0NUM3LCAweDQ1QzgsIDB4NDVDOSwgMHg0NUNBLAorICAgIDB4NDVDQiwgMHg0NUNDLCAweDQ1Q0QsIDB4NDVDRSwgMHg0NUNGLCAweDQ1RDAsIDB4NDVEMSwgMHg0NUQyLCAweDQ1RDMsCisgICAgMHg0NUQ0LCAweDQ1RDUsIDB4NDVENiwgMHg0NUQ3LCAweDQ1RDgsIDB4NDVEOSwgMHg0NURBLCAweDQ1REIsIDB4NDVEQywKKyAgICAweDQ1REQsIDB4NDVERSwgMHg0NURGLCAweDQ1RTAsIDB4NDVFMSwgMHg0NUUyLCAweDQ1RTMsIDB4NDVFNCwgMHg0NUU1LAorICAgIDB4NDVFNiwgMHg0NUU3LCAweDQ1RTgsIDB4NDVFOSwgMHg0NUVBLCAweDQ1RUIsIDB4NDVFQywgMHg0NUVELCAweDQ1RUUsCisgICAgMHg0NUVGLCAweDQ1RjAsIDB4NDVGMSwgMHg0NUYyLCAweDQ1RjMsIDB4NDVGNCwgMHg0NUY1LCAweDQ1RjYsIDB4NDVGNywKKyAgICAweDQ1RjgsIDB4NDVGOSwgMHg0NUZBLCAweDQ1RkIsIDB4NDVGQywgMHg0NUZELCAweDQ1RkUsIDB4NDVGRiwgMHg0NjAwLAorICAgIDB4NDYwMSwgMHg0NjAyLCAweDQ2MDMsIDB4NDYwNCwgMHg0NjA1LCAweDQ2MDYsIDB4NDYwNywgMHg0NjA4LCAweDQ2MDksCisgICAgMHg0NjBBLCAweDQ2MEIsIDB4NDYwQywgMHg0NjBELCAweDQ2MEUsIDB4NDYwRiwgMHg0NjEwLCAweDQ2MTEsIDB4NDYxMiwKKyAgICAweDQ2MTMsIDB4NDYxNCwgMHg0NjE1LCAweDQ2MTYsIDB4NDYxNywgMHg0NjE4LCAweDQ2MTksIDB4NDYxQSwgMHg0NjFCLAorICAgIDB4NDYxQywgMHg0NjFELCAweDQ2MUUsIDB4NDYxRiwgMHg0NjIwLCAweDQ2MjEsIDB4NDYyMiwgMHg0NjIzLCAweDQ2MjQsCisgICAgMHg0NjI1LCAweDQ2MjYsIDB4NDYyNywgMHg0NjI4LCAweDQ2MjksIDB4NDYyQSwgMHg0NjJCLCAweDQ2MkMsIDB4NDYyRCwKKyAgICAweDQ2MkUsIDB4NDYyRiwgMHg0NjMwLCAweDQ2MzEsIDB4NDYzMiwgMHg0NjMzLCAweDQ2MzQsIDB4NDYzNSwgMHg0NjM2LAorICAgIDB4NDYzNywgMHg0NjM4LCAweDQ2MzksIDB4NDYzQSwgMHg0NjNCLCAweDQ2M0MsIDB4NDYzRCwgMHg0NjNFLCAweDQ2M0YsCisgICAgMHg0NjQwLCAweDQ2NDEsIDB4NDY0MiwgMHg0NjQzLCAweDQ2NDQsIDB4NDY0NSwgMHg0NjQ2LCAweDQ2NDcsIDB4NDY0OCwKKyAgICAweDQ2NDksIDB4NDY0QSwgMHg0NjRCLCAweDQ2NEQsIDB4NDY0RSwgMHg0NjRGLCAweDQ2NTAsIDB4NDY1MSwgMHg0NjUyLAorICAgIDB4NDY1MywgMHg0NjU0LCAweDQ2NTUsIDB4NDY1NiwgMHg0NjU3LCAweDQ2NTgsIDB4NDY1OSwgMHg0NjVBLCAweDQ2NUIsCisgICAgMHg0NjVDLCAweDQ2NUQsIDB4NDY1RSwgMHg0NjVGLCAweDQ2NjAsIDB4NDY2MiwgMHg0NjYzLCAweDQ2NjQsIDB4NDY2NSwKKyAgICAweDQ2NjYsIDB4NDY2NywgMHg0NjY4LCAweDQ2NjksIDB4NDY2QSwgMHg0NjZCLCAweDQ2NkMsIDB4NDY2RCwgMHg0NjZFLAorICAgIDB4NDY2RiwgMHg0NjcwLCAweDQ2NzEsIDB4NDY3MiwgMHg0NjczLCAweDQ2NzQsIDB4NDY3NSwgMHg0Njc2LCAweDQ2NzcsCisgICAgMHg0Njc4LCAweDQ2NzksIDB4NDY3QSwgMHg0NjdCLCAweDQ2N0MsIDB4NDY3RCwgMHg0NjdFLCAweDQ2N0YsIDB4NDY4MCwKKyAgICAweDQ2ODEsIDB4NDY4MiwgMHg0NjgzLCAweDQ2ODQsIDB4NDY4NSwgMHg0Njg2LCAweDQ2ODcsIDB4NDY4OCwgMHg0Njg5LAorICAgIDB4NDY4QSwgMHg0NjhCLCAweDQ2OEMsIDB4NDY4RCwgMHg0NjhFLCAweDQ2OEYsIDB4NDY5MCwgMHg0NjkxLCAweDQ2OTIsCisgICAgMHg0NjkzLCAweDQ2OTQsIDB4NDY5NSwgMHg0Njk2LCAweDQ2OTcsIDB4NDY5OCwgMHg0Njk5LCAweDQ2OUEsIDB4NDY5QiwKKyAgICAweDQ2OUMsIDB4NDY5RCwgMHg0NjlFLCAweDQ2OUYsIDB4NDZBMCwgMHg0NkExLCAweDQ2QTIsIDB4NDZBMywgMHg0NkE0LAorICAgIDB4NDZBNSwgMHg0NkE2LCAweDQ2QTcsIDB4NDZBOCwgMHg0NkE5LCAweDQ2QUEsIDB4NDZBQiwgMHg0NkFDLCAweDQ2QUQsCisgICAgMHg0NkFFLCAweDQ2QUYsIDB4NDZCMCwgMHg0NkIxLCAweDQ2QjIsIDB4NDZCMywgMHg0NkI0LCAweDQ2QjUsIDB4NDZCNiwKKyAgICAweDQ2QjcsIDB4NDZCOCwgMHg0NkI5LCAweDQ2QkEsIDB4NDZCQiwgMHg0NkJDLCAweDQ2QkQsIDB4NDZCRSwgMHg0NkJGLAorICAgIDB4NDZDMCwgMHg0NkMxLCAweDQ2QzIsIDB4NDZDMywgMHg0NkM0LCAweDQ2QzUsIDB4NDZDNiwgMHg0NkM3LCAweDQ2QzgsCisgICAgMHg0NkM5LCAweDQ2Q0EsIDB4NDZDQiwgMHg0NkNDLCAweDQ2Q0QsIDB4NDZDRSwgMHg0NkNGLCAweDQ2RDAsIDB4NDZEMSwKKyAgICAweDQ2RDIsIDB4NDZEMywgMHg0NkQ0LCAweDQ2RDUsIDB4NDZENiwgMHg0NkQ3LCAweDQ2RDgsIDB4NDZEOSwgMHg0NkRBLAorICAgIDB4NDZEQiwgMHg0NkRDLCAweDQ2REQsIDB4NDZERSwgMHg0NkRGLCAweDQ2RTAsIDB4NDZFMSwgMHg0NkUyLCAweDQ2RTMsCisgICAgMHg0NkU0LCAweDQ2RTUsIDB4NDZFNiwgMHg0NkU3LCAweDQ2RTgsIDB4NDZFOSwgMHg0NkVBLCAweDQ2RUIsIDB4NDZFQywKKyAgICAweDQ2RUQsIDB4NDZFRSwgMHg0NkVGLCAweDQ2RjAsIDB4NDZGMSwgMHg0NkYyLCAweDQ2RjMsIDB4NDZGNCwgMHg0NkY1LAorICAgIDB4NDZGNiwgMHg0NkY3LCAweDQ2RjgsIDB4NDZGOSwgMHg0NkZBLCAweDQ2RkIsIDB4NDZGQywgMHg0NkZELCAweDQ2RkUsCisgICAgMHg0NkZGLCAweDQ3MDAsIDB4NDcwMSwgMHg0NzAyLCAweDQ3MDMsIDB4NDcwNCwgMHg0NzA1LCAweDQ3MDYsIDB4NDcwNywKKyAgICAweDQ3MDgsIDB4NDcwOSwgMHg0NzBBLCAweDQ3MEIsIDB4NDcwQywgMHg0NzBELCAweDQ3MEUsIDB4NDcwRiwgMHg0NzEwLAorICAgIDB4NDcxMSwgMHg0NzEyLCAweDQ3MTMsIDB4NDcxNCwgMHg0NzE1LCAweDQ3MTYsIDB4NDcxNywgMHg0NzE4LCAweDQ3MTksCisgICAgMHg0NzFBLCAweDQ3MUIsIDB4NDcxQywgMHg0NzFELCAweDQ3MUUsIDB4NDcxRiwgMHg0NzIwLCAweDQ3MjEsIDB4NDcyMiwKKyAgICAweDQ3MjQsIDB4NDcyNSwgMHg0NzI2LCAweDQ3MjcsIDB4NDcyOCwgMHg0NzJBLCAweDQ3MkIsIDB4NDcyQywgMHg0NzJELAorICAgIDB4NDcyRSwgMHg0NzJGLCAweDQ3MzAsIDB4NDczMSwgMHg0NzMyLCAweDQ3MzMsIDB4NDczNCwgMHg0NzM1LCAweDQ3MzYsCisgICAgMHg0NzM3LCAweDQ3MzgsIDB4NDczOSwgMHg0NzNBLCAweDQ3M0IsIDB4NDczQywgMHg0NzNELCAweDQ3M0UsIDB4NDczRiwKKyAgICAweDQ3NDAsIDB4NDc0MSwgMHg0NzQyLCAweDQ3NDMsIDB4NDc0NCwgMHg0NzQ1LCAweDQ3NDYsIDB4NDc0NywgMHg0NzQ4LAorICAgIDB4NDc0OSwgMHg0NzRBLCAweDQ3NEIsIDB4NDc0QywgMHg0NzRELCAweDQ3NEUsIDB4NDc0RiwgMHg0NzUwLCAweDQ3NTEsCisgICAgMHg0NzUyLCAweDQ3NTMsIDB4NDc1NCwgMHg0NzU1LCAweDQ3NTYsIDB4NDc1NywgMHg0NzU4LCAweDQ3NTksIDB4NDc1QSwKKyAgICAweDQ3NUIsIDB4NDc1QywgMHg0NzVELCAweDQ3NUUsIDB4NDc1RiwgMHg0NzYwLCAweDQ3NjEsIDB4NDc2MiwgMHg0NzYzLAorICAgIDB4NDc2NCwgMHg0NzY1LCAweDQ3NjYsIDB4NDc2NywgMHg0NzY4LCAweDQ3NjksIDB4NDc2QSwgMHg0NzZCLCAweDQ3NkMsCisgICAgMHg0NzZELCAweDQ3NkUsIDB4NDc2RiwgMHg0NzcwLCAweDQ3NzEsIDB4NDc3MiwgMHg0NzczLCAweDQ3NzQsIDB4NDc3NSwKKyAgICAweDQ3NzYsIDB4NDc3NywgMHg0Nzc4LCAweDQ3NzksIDB4NDc3QSwgMHg0NzdCLCAweDQ3N0QsIDB4NDc3RSwgMHg0NzdGLAorICAgIDB4NDc4MCwgMHg0NzgxLCAweDQ3ODIsIDB4NDc4MywgMHg0Nzg0LCAweDQ3ODUsIDB4NDc4NiwgMHg0Nzg3LCAweDQ3ODgsCisgICAgMHg0Nzg5LCAweDQ3OEEsIDB4NDc4QiwgMHg0NzhDLCAweDQ3OEUsIDB4NDc4RiwgMHg0NzkwLCAweDQ3OTEsIDB4NDc5MiwKKyAgICAweDQ3OTMsIDB4NDc5NCwgMHg0Nzk1LCAweDQ3OTYsIDB4NDc5NywgMHg0Nzk4LCAweDQ3OTksIDB4NDc5QSwgMHg0NzlCLAorICAgIDB4NDc5QywgMHg0NzlELCAweDQ3OUUsIDB4NDc5RiwgMHg0N0EwLCAweDQ3QTEsIDB4NDdBMiwgMHg0N0EzLCAweDQ3QTQsCisgICAgMHg0N0E1LCAweDQ3QTYsIDB4NDdBNywgMHg0N0E4LCAweDQ3QTksIDB4NDdBQSwgMHg0N0FCLCAweDQ3QUMsIDB4NDdBRCwKKyAgICAweDQ3QUUsIDB4NDdBRiwgMHg0N0IwLCAweDQ3QjEsIDB4NDdCMiwgMHg0N0IzLCAweDQ3QjQsIDB4NDdCNSwgMHg0N0I2LAorICAgIDB4NDdCNywgMHg0N0I4LCAweDQ3QjksIDB4NDdCQSwgMHg0N0JCLCAweDQ3QkMsIDB4NDdCRCwgMHg0N0JFLCAweDQ3QkYsCisgICAgMHg0N0MwLCAweDQ3QzEsIDB4NDdDMiwgMHg0N0MzLCAweDQ3QzQsIDB4NDdDNSwgMHg0N0M2LCAweDQ3QzcsIDB4NDdDOCwKKyAgICAweDQ3QzksIDB4NDdDQSwgMHg0N0NCLCAweDQ3Q0MsIDB4NDdDRCwgMHg0N0NFLCAweDQ3Q0YsIDB4NDdEMCwgMHg0N0QxLAorICAgIDB4NDdEMiwgMHg0N0QzLCAweDQ3RDQsIDB4NDdENSwgMHg0N0Q2LCAweDQ3RDcsIDB4NDdEOCwgMHg0N0Q5LCAweDQ3REEsCisgICAgMHg0N0RCLCAweDQ3REMsIDB4NDdERCwgMHg0N0RFLCAweDQ3REYsIDB4NDdFMCwgMHg0N0UxLCAweDQ3RTIsIDB4NDdFMywKKyAgICAweDQ3RTQsIDB4NDdFNSwgMHg0N0U2LCAweDQ3RTcsIDB4NDdFOCwgMHg0N0U5LCAweDQ3RUEsIDB4NDdFQiwgMHg0N0VDLAorICAgIDB4NDdFRCwgMHg0N0VFLCAweDQ3RUYsIDB4NDdGMCwgMHg0N0YxLCAweDQ3RjIsIDB4NDdGMywgMHg0N0Y0LCAweDQ3RjUsCisgICAgMHg0N0Y2LCAweDQ3RjcsIDB4NDdGOCwgMHg0N0Y5LCAweDQ3RkEsIDB4NDdGQiwgMHg0N0ZDLCAweDQ3RkQsIDB4NDdGRSwKKyAgICAweDQ3RkYsIDB4NDgwMCwgMHg0ODAxLCAweDQ4MDIsIDB4NDgwMywgMHg0ODA0LCAweDQ4MDUsIDB4NDgwNiwgMHg0ODA3LAorICAgIDB4NDgwOCwgMHg0ODA5LCAweDQ4MEEsIDB4NDgwQiwgMHg0ODBDLCAweDQ4MEQsIDB4NDgwRSwgMHg0ODBGLCAweDQ4MTAsCisgICAgMHg0ODExLCAweDQ4MTIsIDB4NDgxMywgMHg0ODE0LCAweDQ4MTUsIDB4NDgxNiwgMHg0ODE3LCAweDQ4MTgsIDB4NDgxOSwKKyAgICAweDQ4MUEsIDB4NDgxQiwgMHg0ODFDLCAweDQ4MUQsIDB4NDgxRSwgMHg0ODFGLCAweDQ4MjAsIDB4NDgyMSwgMHg0ODIyLAorICAgIDB4NDgyMywgMHg0ODI0LCAweDQ4MjUsIDB4NDgyNiwgMHg0ODI3LCAweDQ4MjgsIDB4NDgyOSwgMHg0ODJBLCAweDQ4MkIsCisgICAgMHg0ODJDLCAweDQ4MkQsIDB4NDgyRSwgMHg0ODJGLCAweDQ4MzAsIDB4NDgzMSwgMHg0ODMyLCAweDQ4MzMsIDB4NDgzNCwKKyAgICAweDQ4MzUsIDB4NDgzNiwgMHg0ODM3LCAweDQ4MzgsIDB4NDgzOSwgMHg0ODNBLCAweDQ4M0IsIDB4NDgzQywgMHg0ODNELAorICAgIDB4NDgzRSwgMHg0ODNGLCAweDQ4NDAsIDB4NDg0MSwgMHg0ODQyLCAweDQ4NDMsIDB4NDg0NCwgMHg0ODQ1LCAweDQ4NDYsCisgICAgMHg0ODQ3LCAweDQ4NDgsIDB4NDg0OSwgMHg0ODRBLCAweDQ4NEIsIDB4NDg0QywgMHg0ODRELCAweDQ4NEUsIDB4NDg0RiwKKyAgICAweDQ4NTAsIDB4NDg1MSwgMHg0ODUyLCAweDQ4NTMsIDB4NDg1NCwgMHg0ODU1LCAweDQ4NTYsIDB4NDg1NywgMHg0ODU4LAorICAgIDB4NDg1OSwgMHg0ODVBLCAweDQ4NUIsIDB4NDg1QywgMHg0ODVELCAweDQ4NUUsIDB4NDg1RiwgMHg0ODYwLCAweDQ4NjEsCisgICAgMHg0ODYyLCAweDQ4NjMsIDB4NDg2NCwgMHg0ODY1LCAweDQ4NjYsIDB4NDg2NywgMHg0ODY4LCAweDQ4NjksIDB4NDg2QSwKKyAgICAweDQ4NkIsIDB4NDg2QywgMHg0ODZELCAweDQ4NkUsIDB4NDg2RiwgMHg0ODcwLCAweDQ4NzEsIDB4NDg3MiwgMHg0ODczLAorICAgIDB4NDg3NCwgMHg0ODc1LCAweDQ4NzYsIDB4NDg3NywgMHg0ODc4LCAweDQ4NzksIDB4NDg3QSwgMHg0ODdCLCAweDQ4N0MsCisgICAgMHg0ODdELCAweDQ4N0UsIDB4NDg3RiwgMHg0ODgwLCAweDQ4ODEsIDB4NDg4MiwgMHg0ODgzLCAweDQ4ODQsIDB4NDg4NSwKKyAgICAweDQ4ODYsIDB4NDg4NywgMHg0ODg4LCAweDQ4ODksIDB4NDg4QSwgMHg0ODhCLCAweDQ4OEMsIDB4NDg4RCwgMHg0ODhFLAorICAgIDB4NDg4RiwgMHg0ODkwLCAweDQ4OTEsIDB4NDg5MiwgMHg0ODkzLCAweDQ4OTQsIDB4NDg5NSwgMHg0ODk2LCAweDQ4OTcsCisgICAgMHg0ODk4LCAweDQ4OTksIDB4NDg5QSwgMHg0ODlCLCAweDQ4OUMsIDB4NDg5RCwgMHg0ODlFLCAweDQ4OUYsIDB4NDhBMCwKKyAgICAweDQ4QTEsIDB4NDhBMiwgMHg0OEEzLCAweDQ4QTQsIDB4NDhBNSwgMHg0OEE2LCAweDQ4QTcsIDB4NDhBOCwgMHg0OEE5LAorICAgIDB4NDhBQSwgMHg0OEFCLCAweDQ4QUMsIDB4NDhBRCwgMHg0OEFFLCAweDQ4QUYsIDB4NDhCMCwgMHg0OEIxLCAweDQ4QjIsCisgICAgMHg0OEIzLCAweDQ4QjQsIDB4NDhCNSwgMHg0OEI2LCAweDQ4QjcsIDB4NDhCOCwgMHg0OEI5LCAweDQ4QkEsIDB4NDhCQiwKKyAgICAweDQ4QkMsIDB4NDhCRCwgMHg0OEJFLCAweDQ4QkYsIDB4NDhDMCwgMHg0OEMxLCAweDQ4QzIsIDB4NDhDMywgMHg0OEM0LAorICAgIDB4NDhDNSwgMHg0OEM2LCAweDQ4QzcsIDB4NDhDOCwgMHg0OEM5LCAweDQ4Q0EsIDB4NDhDQiwgMHg0OENDLCAweDQ4Q0QsCisgICAgMHg0OENFLCAweDQ4Q0YsIDB4NDhEMCwgMHg0OEQxLCAweDQ4RDIsIDB4NDhEMywgMHg0OEQ0LCAweDQ4RDUsIDB4NDhENiwKKyAgICAweDQ4RDcsIDB4NDhEOCwgMHg0OEQ5LCAweDQ4REEsIDB4NDhEQiwgMHg0OERDLCAweDQ4REQsIDB4NDhERSwgMHg0OERGLAorICAgIDB4NDhFMCwgMHg0OEUxLCAweDQ4RTIsIDB4NDhFMywgMHg0OEU0LCAweDQ4RTUsIDB4NDhFNiwgMHg0OEU3LCAweDQ4RTgsCisgICAgMHg0OEU5LCAweDQ4RUEsIDB4NDhFQiwgMHg0OEVDLCAweDQ4RUQsIDB4NDhFRSwgMHg0OEVGLCAweDQ4RjAsIDB4NDhGMSwKKyAgICAweDQ4RjIsIDB4NDhGMywgMHg0OEY0LCAweDQ4RjUsIDB4NDhGNiwgMHg0OEY3LCAweDQ4RjgsIDB4NDhGOSwgMHg0OEZBLAorICAgIDB4NDhGQiwgMHg0OEZDLCAweDQ4RkQsIDB4NDhGRSwgMHg0OEZGLCAweDQ5MDAsIDB4NDkwMSwgMHg0OTAyLCAweDQ5MDMsCisgICAgMHg0OTA0LCAweDQ5MDUsIDB4NDkwNiwgMHg0OTA3LCAweDQ5MDgsIDB4NDkwOSwgMHg0OTBBLCAweDQ5MEIsIDB4NDkwQywKKyAgICAweDQ5MEQsIDB4NDkwRSwgMHg0OTBGLCAweDQ5MTAsIDB4NDkxMSwgMHg0OTEyLCAweDQ5MTMsIDB4NDkxNCwgMHg0OTE1LAorICAgIDB4NDkxNiwgMHg0OTE3LCAweDQ5MTgsIDB4NDkxOSwgMHg0OTFBLCAweDQ5MUIsIDB4NDkxQywgMHg0OTFELCAweDQ5MUUsCisgICAgMHg0OTFGLCAweDQ5MjAsIDB4NDkyMSwgMHg0OTIyLCAweDQ5MjMsIDB4NDkyNCwgMHg0OTI1LCAweDQ5MjYsIDB4NDkyNywKKyAgICAweDQ5MjgsIDB4NDkyOSwgMHg0OTJBLCAweDQ5MkIsIDB4NDkyQywgMHg0OTJELCAweDQ5MkUsIDB4NDkyRiwgMHg0OTMwLAorICAgIDB4NDkzMSwgMHg0OTMyLCAweDQ5MzMsIDB4NDkzNCwgMHg0OTM1LCAweDQ5MzYsIDB4NDkzNywgMHg0OTM4LCAweDQ5MzksCisgICAgMHg0OTNBLCAweDQ5M0IsIDB4NDkzQywgMHg0OTNELCAweDQ5M0UsIDB4NDkzRiwgMHg0OTQwLCAweDQ5NDEsIDB4NDk0MiwKKyAgICAweDQ5NDMsIDB4NDk0NCwgMHg0OTQ1LCAweDQ5NDYsIDB4NDk0OCwgMHg0OTQ5LCAweDQ5NEEsIDB4NDk0QiwgMHg0OTRDLAorICAgIDB4NDk0RCwgMHg0OTRFLCAweDQ5NEYsIDB4NDk1MCwgMHg0OTUxLCAweDQ5NTIsIDB4NDk1MywgMHg0OTU0LCAweDQ5NTUsCisgICAgMHg0OTU2LCAweDQ5NTcsIDB4NDk1OCwgMHg0OTU5LCAweDQ5NUEsIDB4NDk1QiwgMHg0OTVDLCAweDQ5NUQsIDB4NDk1RSwKKyAgICAweDQ5NUYsIDB4NDk2MCwgMHg0OTYxLCAweDQ5NjIsIDB4NDk2MywgMHg0OTY0LCAweDQ5NjUsIDB4NDk2NiwgMHg0OTY3LAorICAgIDB4NDk2OCwgMHg0OTY5LCAweDQ5NkEsIDB4NDk2QiwgMHg0OTZDLCAweDQ5NkQsIDB4NDk2RSwgMHg0OTZGLCAweDQ5NzAsCisgICAgMHg0OTcxLCAweDQ5NzIsIDB4NDk3MywgMHg0OTc0LCAweDQ5NzUsIDB4NDk3NiwgMHg0OTc3LCAweDQ5NzgsIDB4NDk3OSwKKyAgICAweDQ5N0IsIDB4NDk3QywgMHg0OTdFLCAweDQ5N0YsIDB4NDk4MCwgMHg0OTgxLCAweDQ5ODQsIDB4NDk4NywgMHg0OTg4LAorICAgIDB4NDk4OSwgMHg0OThBLCAweDQ5OEIsIDB4NDk4QywgMHg0OThELCAweDQ5OEUsIDB4NDk4RiwgMHg0OTkwLCAweDQ5OTEsCisgICAgMHg0OTkyLCAweDQ5OTMsIDB4NDk5NCwgMHg0OTk1LCAweDQ5OTYsIDB4NDk5NywgMHg0OTk4LCAweDQ5OTksIDB4NDk5QSwKKyAgICAweDQ5OUMsIDB4NDk5RCwgMHg0OTlFLCAweDQ5QTAsIDB4NDlBMSwgMHg0OUEyLCAweDQ5QTMsIDB4NDlBNCwgMHg0OUE1LAorICAgIDB4NDlBNiwgMHg0OUE3LCAweDQ5QTgsIDB4NDlBOSwgMHg0OUFBLCAweDQ5QUIsIDB4NDlBQywgMHg0OUFELCAweDQ5QUUsCisgICAgMHg0OUFGLCAweDQ5QjAsIDB4NDlCMSwgMHg0OUIyLCAweDQ5QjMsIDB4NDlCNCwgMHg0OUI1LCAweDQ5QjgsIDB4NDlCOSwKKyAgICAweDQ5QkEsIDB4NDlCQiwgMHg0OUJDLCAweDQ5QkQsIDB4NDlCRSwgMHg0OUJGLCAweDQ5QzAsIDB4NDlDMSwgMHg0OUMyLAorICAgIDB4NDlDMywgMHg0OUM0LCAweDQ5QzUsIDB4NDlDNiwgMHg0OUM3LCAweDQ5QzgsIDB4NDlDOSwgMHg0OUNBLCAweDQ5Q0IsCisgICAgMHg0OUNDLCAweDQ5Q0QsIDB4NDlDRSwgMHg0OUNGLCAweDQ5RDAsIDB4NDlEMSwgMHg0OUQyLCAweDQ5RDMsIDB4NDlENCwKKyAgICAweDQ5RDUsIDB4NDlENiwgMHg0OUQ3LCAweDQ5RDgsIDB4NDlEOSwgMHg0OURBLCAweDQ5REIsIDB4NDlEQywgMHg0OURELAorICAgIDB4NDlERSwgMHg0OURGLCAweDQ5RTAsIDB4NDlFMSwgMHg0OUUyLCAweDQ5RTMsIDB4NDlFNCwgMHg0OUU1LCAweDQ5RTYsCisgICAgMHg0OUU3LCAweDQ5RTgsIDB4NDlFOSwgMHg0OUVBLCAweDQ5RUIsIDB4NDlFQywgMHg0OUVELCAweDQ5RUUsIDB4NDlFRiwKKyAgICAweDQ5RjAsIDB4NDlGMSwgMHg0OUYyLCAweDQ5RjMsIDB4NDlGNCwgMHg0OUY1LCAweDQ5RjYsIDB4NDlGNywgMHg0OUY4LAorICAgIDB4NDlGOSwgMHg0OUZBLCAweDQ5RkIsIDB4NDlGQywgMHg0OUZELCAweDQ5RkUsIDB4NDlGRiwgMHg0QTAwLCAweDRBMDEsCisgICAgMHg0QTAyLCAweDRBMDMsIDB4NEEwNCwgMHg0QTA1LCAweDRBMDYsIDB4NEEwNywgMHg0QTA4LCAweDRBMDksIDB4NEEwQSwKKyAgICAweDRBMEIsIDB4NEEwQywgMHg0QTBELCAweDRBMEUsIDB4NEEwRiwgMHg0QTEwLCAweDRBMTEsIDB4NEExMiwgMHg0QTEzLAorICAgIDB4NEExNCwgMHg0QTE1LCAweDRBMTYsIDB4NEExNywgMHg0QTE4LCAweDRBMTksIDB4NEExQSwgMHg0QTFCLCAweDRBMUMsCisgICAgMHg0QTFELCAweDRBMUUsIDB4NEExRiwgMHg0QTIwLCAweDRBMjEsIDB4NEEyMiwgMHg0QTIzLCAweDRBMjQsIDB4NEEyNSwKKyAgICAweDRBMjYsIDB4NEEyNywgMHg0QTI4LCAweDRBMjksIDB4NEEyQSwgMHg0QTJCLCAweDRBMkMsIDB4NEEyRCwgMHg0QTJFLAorICAgIDB4NEEyRiwgMHg0QTMwLCAweDRBMzEsIDB4NEEzMiwgMHg0QTMzLCAweDRBMzQsIDB4NEEzNSwgMHg0QTM2LCAweDRBMzcsCisgICAgMHg0QTM4LCAweDRBMzksIDB4NEEzQSwgMHg0QTNCLCAweDRBM0MsIDB4NEEzRCwgMHg0QTNFLCAweDRBM0YsIDB4NEE0MCwKKyAgICAweDRBNDEsIDB4NEE0MiwgMHg0QTQzLCAweDRBNDQsIDB4NEE0NSwgMHg0QTQ2LCAweDRBNDcsIDB4NEE0OCwgMHg0QTQ5LAorICAgIDB4NEE0QSwgMHg0QTRCLCAweDRBNEMsIDB4NEE0RCwgMHg0QTRFLCAweDRBNEYsIDB4NEE1MCwgMHg0QTUxLCAweDRBNTIsCisgICAgMHg0QTUzLCAweDRBNTQsIDB4NEE1NSwgMHg0QTU2LCAweDRBNTcsIDB4NEE1OCwgMHg0QTU5LCAweDRBNUEsIDB4NEE1QiwKKyAgICAweDRBNUMsIDB4NEE1RCwgMHg0QTVFLCAweDRBNUYsIDB4NEE2MCwgMHg0QTYxLCAweDRBNjIsIDB4NEE2MywgMHg0QTY0LAorICAgIDB4NEE2NSwgMHg0QTY2LCAweDRBNjcsIDB4NEE2OCwgMHg0QTY5LCAweDRBNkEsIDB4NEE2QiwgMHg0QTZDLCAweDRBNkQsCisgICAgMHg0QTZFLCAweDRBNkYsIDB4NEE3MCwgMHg0QTcxLCAweDRBNzIsIDB4NEE3MywgMHg0QTc0LCAweDRBNzUsIDB4NEE3NiwKKyAgICAweDRBNzcsIDB4NEE3OCwgMHg0QTc5LCAweDRBN0EsIDB4NEE3QiwgMHg0QTdDLCAweDRBN0QsIDB4NEE3RSwgMHg0QTdGLAorICAgIDB4NEE4MCwgMHg0QTgxLCAweDRBODIsIDB4NEE4MywgMHg0QTg0LCAweDRBODUsIDB4NEE4NiwgMHg0QTg3LCAweDRBODgsCisgICAgMHg0QTg5LCAweDRBOEEsIDB4NEE4QiwgMHg0QThDLCAweDRBOEQsIDB4NEE4RSwgMHg0QThGLCAweDRBOTAsIDB4NEE5MSwKKyAgICAweDRBOTIsIDB4NEE5MywgMHg0QTk0LCAweDRBOTUsIDB4NEE5NiwgMHg0QTk3LCAweDRBOTgsIDB4NEE5OSwgMHg0QTlBLAorICAgIDB4NEE5QiwgMHg0QTlDLCAweDRBOUQsIDB4NEE5RSwgMHg0QTlGLCAweDRBQTAsIDB4NEFBMSwgMHg0QUEyLCAweDRBQTMsCisgICAgMHg0QUE0LCAweDRBQTUsIDB4NEFBNiwgMHg0QUE3LCAweDRBQTgsIDB4NEFBOSwgMHg0QUFBLCAweDRBQUIsIDB4NEFBQywKKyAgICAweDRBQUQsIDB4NEFBRSwgMHg0QUFGLCAweDRBQjAsIDB4NEFCMSwgMHg0QUIyLCAweDRBQjMsIDB4NEFCNCwgMHg0QUI1LAorICAgIDB4NEFCNiwgMHg0QUI3LCAweDRBQjgsIDB4NEFCOSwgMHg0QUJBLCAweDRBQkIsIDB4NEFCQywgMHg0QUJELCAweDRBQkUsCisgICAgMHg0QUJGLCAweDRBQzAsIDB4NEFDMSwgMHg0QUMyLCAweDRBQzMsIDB4NEFDNCwgMHg0QUM1LCAweDRBQzYsIDB4NEFDNywKKyAgICAweDRBQzgsIDB4NEFDOSwgMHg0QUNBLCAweDRBQ0IsIDB4NEFDQywgMHg0QUNELCAweDRBQ0UsIDB4NEFDRiwgMHg0QUQwLAorICAgIDB4NEFEMSwgMHg0QUQyLCAweDRBRDMsIDB4NEFENCwgMHg0QUQ1LCAweDRBRDYsIDB4NEFENywgMHg0QUQ4LCAweDRBRDksCisgICAgMHg0QURBLCAweDRBREIsIDB4NEFEQywgMHg0QURELCAweDRBREUsIDB4NEFERiwgMHg0QUUwLCAweDRBRTEsIDB4NEFFMiwKKyAgICAweDRBRTMsIDB4NEFFNCwgMHg0QUU1LCAweDRBRTYsIDB4NEFFNywgMHg0QUU4LCAweDRBRTksIDB4NEFFQSwgMHg0QUVCLAorICAgIDB4NEFFQywgMHg0QUVELCAweDRBRUUsIDB4NEFFRiwgMHg0QUYwLCAweDRBRjEsIDB4NEFGMiwgMHg0QUYzLCAweDRBRjQsCisgICAgMHg0QUY1LCAweDRBRjYsIDB4NEFGNywgMHg0QUY4LCAweDRBRjksIDB4NEFGQSwgMHg0QUZCLCAweDRBRkMsIDB4NEFGRCwKKyAgICAweDRBRkUsIDB4NEFGRiwgMHg0QjAwLCAweDRCMDEsIDB4NEIwMiwgMHg0QjAzLCAweDRCMDQsIDB4NEIwNSwgMHg0QjA2LAorICAgIDB4NEIwNywgMHg0QjA4LCAweDRCMDksIDB4NEIwQSwgMHg0QjBCLCAweDRCMEMsIDB4NEIwRCwgMHg0QjBFLCAweDRCMEYsCisgICAgMHg0QjEwLCAweDRCMTEsIDB4NEIxMiwgMHg0QjEzLCAweDRCMTQsIDB4NEIxNSwgMHg0QjE2LCAweDRCMTcsIDB4NEIxOCwKKyAgICAweDRCMTksIDB4NEIxQSwgMHg0QjFCLCAweDRCMUMsIDB4NEIxRCwgMHg0QjFFLCAweDRCMUYsIDB4NEIyMCwgMHg0QjIxLAorICAgIDB4NEIyMiwgMHg0QjIzLCAweDRCMjQsIDB4NEIyNSwgMHg0QjI2LCAweDRCMjcsIDB4NEIyOCwgMHg0QjI5LCAweDRCMkEsCisgICAgMHg0QjJCLCAweDRCMkMsIDB4NEIyRCwgMHg0QjJFLCAweDRCMkYsIDB4NEIzMCwgMHg0QjMxLCAweDRCMzIsIDB4NEIzMywKKyAgICAweDRCMzQsIDB4NEIzNSwgMHg0QjM2LCAweDRCMzcsIDB4NEIzOCwgMHg0QjM5LCAweDRCM0EsIDB4NEIzQiwgMHg0QjNDLAorICAgIDB4NEIzRCwgMHg0QjNFLCAweDRCM0YsIDB4NEI0MCwgMHg0QjQxLCAweDRCNDIsIDB4NEI0MywgMHg0QjQ0LCAweDRCNDUsCisgICAgMHg0QjQ2LCAweDRCNDcsIDB4NEI0OCwgMHg0QjQ5LCAweDRCNEEsIDB4NEI0QiwgMHg0QjRDLCAweDRCNEQsIDB4NEI0RSwKKyAgICAweDRCNEYsIDB4NEI1MCwgMHg0QjUxLCAweDRCNTIsIDB4NEI1MywgMHg0QjU0LCAweDRCNTUsIDB4NEI1NiwgMHg0QjU3LAorICAgIDB4NEI1OCwgMHg0QjU5LCAweDRCNUEsIDB4NEI1QiwgMHg0QjVDLCAweDRCNUQsIDB4NEI1RSwgMHg0QjVGLCAweDRCNjAsCisgICAgMHg0QjYxLCAweDRCNjIsIDB4NEI2MywgMHg0QjY0LCAweDRCNjUsIDB4NEI2NiwgMHg0QjY3LCAweDRCNjgsIDB4NEI2OSwKKyAgICAweDRCNkEsIDB4NEI2QiwgMHg0QjZDLCAweDRCNkQsIDB4NEI2RSwgMHg0QjZGLCAweDRCNzAsIDB4NEI3MSwgMHg0QjcyLAorICAgIDB4NEI3MywgMHg0Qjc0LCAweDRCNzUsIDB4NEI3NiwgMHg0Qjc3LCAweDRCNzgsIDB4NEI3OSwgMHg0QjdBLCAweDRCN0IsCisgICAgMHg0QjdDLCAweDRCN0QsIDB4NEI3RSwgMHg0QjdGLCAweDRCODAsIDB4NEI4MSwgMHg0QjgyLCAweDRCODMsIDB4NEI4NCwKKyAgICAweDRCODUsIDB4NEI4NiwgMHg0Qjg3LCAweDRCODgsIDB4NEI4OSwgMHg0QjhBLCAweDRCOEIsIDB4NEI4QywgMHg0QjhELAorICAgIDB4NEI4RSwgMHg0QjhGLCAweDRCOTAsIDB4NEI5MSwgMHg0QjkyLCAweDRCOTMsIDB4NEI5NCwgMHg0Qjk1LCAweDRCOTYsCisgICAgMHg0Qjk3LCAweDRCOTgsIDB4NEI5OSwgMHg0QjlBLCAweDRCOUIsIDB4NEI5QywgMHg0QjlELCAweDRCOUUsIDB4NEI5RiwKKyAgICAweDRCQTAsIDB4NEJBMSwgMHg0QkEyLCAweDRCQTMsIDB4NEJBNCwgMHg0QkE1LCAweDRCQTYsIDB4NEJBNywgMHg0QkE4LAorICAgIDB4NEJBOSwgMHg0QkFBLCAweDRCQUIsIDB4NEJBQywgMHg0QkFELCAweDRCQUUsIDB4NEJBRiwgMHg0QkIwLCAweDRCQjEsCisgICAgMHg0QkIyLCAweDRCQjMsIDB4NEJCNCwgMHg0QkI1LCAweDRCQjYsIDB4NEJCNywgMHg0QkI4LCAweDRCQjksIDB4NEJCQSwKKyAgICAweDRCQkIsIDB4NEJCQywgMHg0QkJELCAweDRCQkUsIDB4NEJCRiwgMHg0QkMwLCAweDRCQzEsIDB4NEJDMiwgMHg0QkMzLAorICAgIDB4NEJDNCwgMHg0QkM1LCAweDRCQzYsIDB4NEJDNywgMHg0QkM4LCAweDRCQzksIDB4NEJDQSwgMHg0QkNCLCAweDRCQ0MsCisgICAgMHg0QkNELCAweDRCQ0UsIDB4NEJDRiwgMHg0QkQwLCAweDRCRDEsIDB4NEJEMiwgMHg0QkQzLCAweDRCRDQsIDB4NEJENSwKKyAgICAweDRCRDYsIDB4NEJENywgMHg0QkQ4LCAweDRCRDksIDB4NEJEQSwgMHg0QkRCLCAweDRCREMsIDB4NEJERCwgMHg0QkRFLAorICAgIDB4NEJERiwgMHg0QkUwLCAweDRCRTEsIDB4NEJFMiwgMHg0QkUzLCAweDRCRTQsIDB4NEJFNSwgMHg0QkU2LCAweDRCRTcsCisgICAgMHg0QkU4LCAweDRCRTksIDB4NEJFQSwgMHg0QkVCLCAweDRCRUMsIDB4NEJFRCwgMHg0QkVFLCAweDRCRUYsIDB4NEJGMCwKKyAgICAweDRCRjEsIDB4NEJGMiwgMHg0QkYzLCAweDRCRjQsIDB4NEJGNSwgMHg0QkY2LCAweDRCRjcsIDB4NEJGOCwgMHg0QkY5LAorICAgIDB4NEJGQSwgMHg0QkZCLCAweDRCRkMsIDB4NEJGRCwgMHg0QkZFLCAweDRCRkYsIDB4NEMwMCwgMHg0QzAxLCAweDRDMDIsCisgICAgMHg0QzAzLCAweDRDMDQsIDB4NEMwNSwgMHg0QzA2LCAweDRDMDcsIDB4NEMwOCwgMHg0QzA5LCAweDRDMEEsIDB4NEMwQiwKKyAgICAweDRDMEMsIDB4NEMwRCwgMHg0QzBFLCAweDRDMEYsIDB4NEMxMCwgMHg0QzExLCAweDRDMTIsIDB4NEMxMywgMHg0QzE0LAorICAgIDB4NEMxNSwgMHg0QzE2LCAweDRDMTcsIDB4NEMxOCwgMHg0QzE5LCAweDRDMUEsIDB4NEMxQiwgMHg0QzFDLCAweDRDMUQsCisgICAgMHg0QzFFLCAweDRDMUYsIDB4NEMyMCwgMHg0QzIxLCAweDRDMjIsIDB4NEMyMywgMHg0QzI0LCAweDRDMjUsIDB4NEMyNiwKKyAgICAweDRDMjcsIDB4NEMyOCwgMHg0QzI5LCAweDRDMkEsIDB4NEMyQiwgMHg0QzJDLCAweDRDMkQsIDB4NEMyRSwgMHg0QzJGLAorICAgIDB4NEMzMCwgMHg0QzMxLCAweDRDMzIsIDB4NEMzMywgMHg0QzM0LCAweDRDMzUsIDB4NEMzNiwgMHg0QzM3LCAweDRDMzgsCisgICAgMHg0QzM5LCAweDRDM0EsIDB4NEMzQiwgMHg0QzNDLCAweDRDM0QsIDB4NEMzRSwgMHg0QzNGLCAweDRDNDAsIDB4NEM0MSwKKyAgICAweDRDNDIsIDB4NEM0MywgMHg0QzQ0LCAweDRDNDUsIDB4NEM0NiwgMHg0QzQ3LCAweDRDNDgsIDB4NEM0OSwgMHg0QzRBLAorICAgIDB4NEM0QiwgMHg0QzRDLCAweDRDNEQsIDB4NEM0RSwgMHg0QzRGLCAweDRDNTAsIDB4NEM1MSwgMHg0QzUyLCAweDRDNTMsCisgICAgMHg0QzU0LCAweDRDNTUsIDB4NEM1NiwgMHg0QzU3LCAweDRDNTgsIDB4NEM1OSwgMHg0QzVBLCAweDRDNUIsIDB4NEM1QywKKyAgICAweDRDNUQsIDB4NEM1RSwgMHg0QzVGLCAweDRDNjAsIDB4NEM2MSwgMHg0QzYyLCAweDRDNjMsIDB4NEM2NCwgMHg0QzY1LAorICAgIDB4NEM2NiwgMHg0QzY3LCAweDRDNjgsIDB4NEM2OSwgMHg0QzZBLCAweDRDNkIsIDB4NEM2QywgMHg0QzZELCAweDRDNkUsCisgICAgMHg0QzZGLCAweDRDNzAsIDB4NEM3MSwgMHg0QzcyLCAweDRDNzMsIDB4NEM3NCwgMHg0Qzc1LCAweDRDNzYsIDB4NEM3OCwKKyAgICAweDRDNzksIDB4NEM3QSwgMHg0QzdCLCAweDRDN0MsIDB4NEM3RCwgMHg0QzdFLCAweDRDN0YsIDB4NEM4MCwgMHg0QzgxLAorICAgIDB4NEM4MiwgMHg0QzgzLCAweDRDODQsIDB4NEM4NSwgMHg0Qzg2LCAweDRDODcsIDB4NEM4OCwgMHg0Qzg5LCAweDRDOEEsCisgICAgMHg0QzhCLCAweDRDOEMsIDB4NEM4RCwgMHg0QzhFLCAweDRDOEYsIDB4NEM5MCwgMHg0QzkxLCAweDRDOTIsIDB4NEM5MywKKyAgICAweDRDOTQsIDB4NEM5NSwgMHg0Qzk2LCAweDRDOTcsIDB4NEM5OCwgMHg0Qzk5LCAweDRDOUEsIDB4NEM5QiwgMHg0QzlDLAorICAgIDB4NEM5RCwgMHg0QzlFLCAweDRDQTQsIDB4NENBNSwgMHg0Q0E2LCAweDRDQTcsIDB4NENBOCwgMHg0Q0E5LCAweDRDQUEsCisgICAgMHg0Q0FCLCAweDRDQUMsIDB4NENBRCwgMHg0Q0FFLCAweDRDQUYsIDB4NENCMCwgMHg0Q0IxLCAweDRDQjIsIDB4NENCMywKKyAgICAweDRDQjQsIDB4NENCNSwgMHg0Q0I2LCAweDRDQjcsIDB4NENCOCwgMHg0Q0I5LCAweDRDQkEsIDB4NENCQiwgMHg0Q0JDLAorICAgIDB4NENCRCwgMHg0Q0JFLCAweDRDQkYsIDB4NENDMCwgMHg0Q0MxLCAweDRDQzIsIDB4NENDMywgMHg0Q0M0LCAweDRDQzUsCisgICAgMHg0Q0M2LCAweDRDQzcsIDB4NENDOCwgMHg0Q0M5LCAweDRDQ0EsIDB4NENDQiwgMHg0Q0NDLCAweDRDQ0QsIDB4NENDRSwKKyAgICAweDRDQ0YsIDB4NENEMCwgMHg0Q0QxLCAweDRDRDIsIDB4NENEMywgMHg0Q0Q0LCAweDRDRDUsIDB4NENENiwgMHg0Q0Q3LAorICAgIDB4NENEOCwgMHg0Q0Q5LCAweDRDREEsIDB4NENEQiwgMHg0Q0RDLCAweDRDREQsIDB4NENERSwgMHg0Q0RGLCAweDRDRTAsCisgICAgMHg0Q0UxLCAweDRDRTIsIDB4NENFMywgMHg0Q0U0LCAweDRDRTUsIDB4NENFNiwgMHg0Q0U3LCAweDRDRTgsIDB4NENFOSwKKyAgICAweDRDRUEsIDB4NENFQiwgMHg0Q0VDLCAweDRDRUQsIDB4NENFRSwgMHg0Q0VGLCAweDRDRjAsIDB4NENGMSwgMHg0Q0YyLAorICAgIDB4NENGMywgMHg0Q0Y0LCAweDRDRjUsIDB4NENGNiwgMHg0Q0Y3LCAweDRDRjgsIDB4NENGOSwgMHg0Q0ZBLCAweDRDRkIsCisgICAgMHg0Q0ZDLCAweDRDRkQsIDB4NENGRSwgMHg0Q0ZGLCAweDREMDAsIDB4NEQwMSwgMHg0RDAyLCAweDREMDMsIDB4NEQwNCwKKyAgICAweDREMDUsIDB4NEQwNiwgMHg0RDA3LCAweDREMDgsIDB4NEQwOSwgMHg0RDBBLCAweDREMEIsIDB4NEQwQywgMHg0RDBELAorICAgIDB4NEQwRSwgMHg0RDBGLCAweDREMTAsIDB4NEQxMSwgMHg0RDEyLCAweDREMUEsIDB4NEQxQiwgMHg0RDFDLCAweDREMUQsCisgICAgMHg0RDFFLCAweDREMUYsIDB4NEQyMCwgMHg0RDIxLCAweDREMjIsIDB4NEQyMywgMHg0RDI0LCAweDREMjUsIDB4NEQyNiwKKyAgICAweDREMjcsIDB4NEQyOCwgMHg0RDI5LCAweDREMkEsIDB4NEQyQiwgMHg0RDJDLCAweDREMkQsIDB4NEQyRSwgMHg0RDJGLAorICAgIDB4NEQzMCwgMHg0RDMxLCAweDREMzIsIDB4NEQzMywgMHg0RDM0LCAweDREMzUsIDB4NEQzNiwgMHg0RDM3LCAweDREMzgsCisgICAgMHg0RDM5LCAweDREM0EsIDB4NEQzQiwgMHg0RDNDLCAweDREM0QsIDB4NEQzRSwgMHg0RDNGLCAweDRENDAsIDB4NEQ0MSwKKyAgICAweDRENDIsIDB4NEQ0MywgMHg0RDQ0LCAweDRENDUsIDB4NEQ0NiwgMHg0RDQ3LCAweDRENDgsIDB4NEQ0OSwgMHg0RDRBLAorICAgIDB4NEQ0QiwgMHg0RDRDLCAweDRENEQsIDB4NEQ0RSwgMHg0RDRGLCAweDRENTAsIDB4NEQ1MSwgMHg0RDUyLCAweDRENTMsCisgICAgMHg0RDU0LCAweDRENTUsIDB4NEQ1NiwgMHg0RDU3LCAweDRENTgsIDB4NEQ1OSwgMHg0RDVBLCAweDRENUIsIDB4NEQ1QywKKyAgICAweDRENUQsIDB4NEQ1RSwgMHg0RDVGLCAweDRENjAsIDB4NEQ2MSwgMHg0RDYyLCAweDRENjMsIDB4NEQ2NCwgMHg0RDY1LAorICAgIDB4NEQ2NiwgMHg0RDY3LCAweDRENjgsIDB4NEQ2OSwgMHg0RDZBLCAweDRENkIsIDB4NEQ2QywgMHg0RDZELCAweDRENkUsCisgICAgMHg0RDZGLCAweDRENzAsIDB4NEQ3MSwgMHg0RDcyLCAweDRENzMsIDB4NEQ3NCwgMHg0RDc1LCAweDRENzYsIDB4NEQ3NywKKyAgICAweDRENzgsIDB4NEQ3OSwgMHg0RDdBLCAweDREN0IsIDB4NEQ3QywgMHg0RDdELCAweDREN0UsIDB4NEQ3RiwgMHg0RDgwLAorICAgIDB4NEQ4MSwgMHg0RDgyLCAweDREODMsIDB4NEQ4NCwgMHg0RDg1LCAweDREODYsIDB4NEQ4NywgMHg0RDg4LCAweDREODksCisgICAgMHg0RDhBLCAweDREOEIsIDB4NEQ4QywgMHg0RDhELCAweDREOEUsIDB4NEQ4RiwgMHg0RDkwLCAweDREOTEsIDB4NEQ5MiwKKyAgICAweDREOTMsIDB4NEQ5NCwgMHg0RDk1LCAweDREOTYsIDB4NEQ5NywgMHg0RDk4LCAweDREOTksIDB4NEQ5QSwgMHg0RDlCLAorICAgIDB4NEQ5QywgMHg0RDlELCAweDREOUUsIDB4NEQ5RiwgMHg0REEwLCAweDREQTEsIDB4NERBMiwgMHg0REEzLCAweDREQTQsCisgICAgMHg0REE1LCAweDREQTYsIDB4NERBNywgMHg0REE4LCAweDREQTksIDB4NERBQSwgMHg0REFCLCAweDREQUMsIDB4NERBRCwKKyAgICAweDREQUYsIDB4NERCMCwgMHg0REIxLCAweDREQjIsIDB4NERCMywgMHg0REI0LCAweDREQjUsIDB4MjBBQywgMHgwMEE1LAorICAgIDB4MjBBQywgMHgwMDI0LCAweDMwM0YsIDB4QTAwMCwgMHhBMDAxLCAweEEwMDIsIDB4QTAwMywgMHhBMDA0LCAweEEwMDUsCisgICAgMHhBMDA2LCAweEEwMDcsIDB4QTAwOCwgMHhBMDA5LCAweEEwMEEsIDB4QTAwQiwgMHhBMDBDLCAweEEwMEQsIDB4QTAwRSwKKyAgICAweEEwMEYsIDB4QTAxMCwgMHhBMDExLCAweEEwMTIsIDB4QTAxMywgMHhBMDE0LCAweEEwMTUsIDB4QTAxNiwgMHhBMDE3LAorICAgIDB4QTAxOCwgMHhBMDE5LCAweEEwMUEsIDB4QTAxQiwgMHhBMDFDLCAweEEwMUQsIDB4QTAxRSwgMHhBMDFGLCAweEEwMjAsCisgICAgMHhBMDIxLCAweEEwMjIsIDB4QTAyMywgMHhBMDI0LCAweEEwMjUsIDB4QTAyNiwgMHhBMDI3LCAweEEwMjgsIDB4QTAyOSwKKyAgICAweEEwMkEsIDB4QTAyQiwgMHhBMDJDLCAweEEwMkQsIDB4QTAyRSwgMHhBMDJGLCAweEEwMzAsIDB4QTAzMSwgMHhBMDMyLAorICAgIDB4QTAzMywgMHhBMDM0LCAweEEwMzUsIDB4QTAzNiwgMHhBMDM3LCAweEEwMzgsIDB4QTAzOSwgMHhBMDNBLCAweEEwM0IsCisgICAgMHhBMDNDLCAweEEwM0QsIDB4QTAzRSwgMHhBMDNGLCAweEEwNDAsIDB4QTA0MSwgMHhBMDQyLCAweEEwNDMsIDB4QTA0NCwKKyAgICAweEEwNDUsIDB4QTA0NiwgMHhBMDQ3LCAweEEwNDgsIDB4QTA0OSwgMHhBMDRBLCAweEEwNEIsIDB4QTA0QywgMHhBMDRELAorICAgIDB4QTA0RSwgMHhBMDRGLCAweEEwNTAsIDB4QTA1MSwgMHhBMDUyLCAweEEwNTMsIDB4QTA1NCwgMHhBMDU1LCAweEEwNTYsCisgICAgMHhBMDU3LCAweEEwNTgsIDB4QTA1OSwgMHhBMDVBLCAweEEwNUIsIDB4QTA1QywgMHhBMDVELCAweEEwNUUsIDB4QTA1RiwKKyAgICAweEEwNjAsIDB4QTA2MSwgMHhBMDYyLCAweEEwNjMsIDB4QTA2NCwgMHhBMDY1LCAweEEwNjYsIDB4QTA2NywgMHhBMDY4LAorICAgIDB4QTA2OSwgMHhBMDZBLCAweEEwNkIsIDB4QTA2QywgMHhBMDZELCAweEEwNkUsIDB4QTA2RiwgMHhBMDcwLCAweEEwNzEsCisgICAgMHhBMDcyLCAweEEwNzMsIDB4QTA3NCwgMHhBMDc1LCAweEEwNzYsIDB4QTA3NywgMHhBMDc4LCAweEEwNzksIDB4QTA3QSwKKyAgICAweEEwN0IsIDB4QTA3QywgMHhBMDdELCAweEEwN0UsIDB4QTA3RiwgMHhBMDgwLCAweEEwODEsIDB4QTA4MiwgMHhBMDgzLAorICAgIDB4QTA4NCwgMHhBMDg1LCAweEEwODYsIDB4QTA4NywgMHhBMDg4LCAweEEwODksIDB4QTA4QSwgMHhBMDhCLCAweEEwOEMsCisgICAgMHhBMDhELCAweEEwOEUsIDB4QTA4RiwgMHhBMDkwLCAweEEwOTEsIDB4QTA5MiwgMHhBMDkzLCAweEEwOTQsIDB4QTA5NSwKKyAgICAweEEwOTYsIDB4QTA5NywgMHhBMDk4LCAweEEwOTksIDB4QTA5QSwgMHhBMDlCLCAweEEwOUMsIDB4QTA5RCwgMHhBMDlFLAorICAgIDB4QTA5RiwgMHhBMEEwLCAweEEwQTEsIDB4QTBBMiwgMHhBMEEzLCAweEEwQTQsIDB4QTBBNSwgMHhBMEE2LCAweEEwQTcsCisgICAgMHhBMEE4LCAweEEwQTksIDB4QTBBQSwgMHhBMEFCLCAweEEwQUMsIDB4QTBBRCwgMHhBMEFFLCAweEEwQUYsIDB4QTBCMCwKKyAgICAweEEwQjEsIDB4QTBCMiwgMHhBMEIzLCAweEEwQjQsIDB4QTBCNSwgMHhBMEI2LCAweEEwQjcsIDB4QTBCOCwgMHhBMEI5LAorICAgIDB4QTBCQSwgMHhBMEJCLCAweEEwQkMsIDB4QTBCRCwgMHhBMEJFLCAweEEwQkYsIDB4QTBDMCwgMHhBMEMxLCAweEEwQzIsCisgICAgMHhBMEMzLCAweEEwQzQsIDB4QTBDNSwgMHhBMEM2LCAweEEwQzcsIDB4QTBDOCwgMHhBMEM5LCAweEEwQ0EsIDB4QTBDQiwKKyAgICAweEEwQ0MsIDB4QTBDRCwgMHhBMENFLCAweEEwQ0YsIDB4QTBEMCwgMHhBMEQxLCAweEEwRDIsIDB4QTBEMywgMHhBMEQ0LAorICAgIDB4QTBENSwgMHhBMEQ2LCAweEEwRDcsIDB4QTBEOCwgMHhBMEQ5LCAweEEwREEsIDB4QTBEQiwgMHhBMERDLCAweEEwREQsCisgICAgMHhBMERFLCAweEEwREYsIDB4QTBFMCwgMHhBMEUxLCAweEEwRTIsIDB4QTBFMywgMHhBMEU0LCAweEEwRTUsIDB4QTBFNiwKKyAgICAweEEwRTcsIDB4QTBFOCwgMHhBMEU5LCAweEEwRUEsIDB4QTBFQiwgMHhBMEVDLCAweEEwRUQsIDB4QTBFRSwgMHhBMEVGLAorICAgIDB4QTBGMCwgMHhBMEYxLCAweEEwRjIsIDB4QTBGMywgMHhBMEY0LCAweEEwRjUsIDB4QTBGNiwgMHhBMEY3LCAweEEwRjgsCisgICAgMHhBMEY5LCAweEEwRkEsIDB4QTBGQiwgMHhBMEZDLCAweEEwRkQsIDB4QTBGRSwgMHhBMEZGLCAweEExMDAsIDB4QTEwMSwKKyAgICAweEExMDIsIDB4QTEwMywgMHhBMTA0LCAweEExMDUsIDB4QTEwNiwgMHhBMTA3LCAweEExMDgsIDB4QTEwOSwgMHhBMTBBLAorICAgIDB4QTEwQiwgMHhBMTBDLCAweEExMEQsIDB4QTEwRSwgMHhBMTBGLCAweEExMTAsIDB4QTExMSwgMHhBMTEyLCAweEExMTMsCisgICAgMHhBMTE0LCAweEExMTUsIDB4QTExNiwgMHhBMTE3LCAweEExMTgsIDB4QTExOSwgMHhBMTFBLCAweEExMUIsIDB4QTExQywKKyAgICAweEExMUQsIDB4QTExRSwgMHhBMTFGLCAweEExMjAsIDB4QTEyMSwgMHhBMTIyLCAweEExMjMsIDB4QTEyNCwgMHhBMTI1LAorICAgIDB4QTEyNiwgMHhBMTI3LCAweEExMjgsIDB4QTEyOSwgMHhBMTJBLCAweEExMkIsIDB4QTEyQywgMHhBMTJELCAweEExMkUsCisgICAgMHhBMTJGLCAweEExMzAsIDB4QTEzMSwgMHhBMTMyLCAweEExMzMsIDB4QTEzNCwgMHhBMTM1LCAweEExMzYsIDB4QTEzNywKKyAgICAweEExMzgsIDB4QTEzOSwgMHhBMTNBLCAweEExM0IsIDB4QTEzQywgMHhBMTNELCAweEExM0UsIDB4QTEzRiwgMHhBMTQwLAorICAgIDB4QTE0MSwgMHhBMTQyLCAweEExNDMsIDB4QTE0NCwgMHhBMTQ1LCAweEExNDYsIDB4QTE0NywgMHhBMTQ4LCAweEExNDksCisgICAgMHhBMTRBLCAweEExNEIsIDB4QTE0QywgMHhBMTRELCAweEExNEUsIDB4QTE0RiwgMHhBMTUwLCAweEExNTEsIDB4QTE1MiwKKyAgICAweEExNTMsIDB4QTE1NCwgMHhBMTU1LCAweEExNTYsIDB4QTE1NywgMHhBMTU4LCAweEExNTksIDB4QTE1QSwgMHhBMTVCLAorICAgIDB4QTE1QywgMHhBMTVELCAweEExNUUsIDB4QTE1RiwgMHhBMTYwLCAweEExNjEsIDB4QTE2MiwgMHhBMTYzLCAweEExNjQsCisgICAgMHhBMTY1LCAweEExNjYsIDB4QTE2NywgMHhBMTY4LCAweEExNjksIDB4QTE2QSwgMHhBMTZCLCAweEExNkMsIDB4QTE2RCwKKyAgICAweEExNkUsIDB4QTE2RiwgMHhBMTcwLCAweEExNzEsIDB4QTE3MiwgMHhBMTczLCAweEExNzQsIDB4QTE3NSwgMHhBMTc2LAorICAgIDB4QTE3NywgMHhBMTc4LCAweEExNzksIDB4QTE3QSwgMHhBMTdCLCAweEExN0MsIDB4QTE3RCwgMHhBMTdFLCAweEExN0YsCisgICAgMHhBMTgwLCAweEExODEsIDB4QTE4MiwgMHhBMTgzLCAweEExODQsIDB4QTE4NSwgMHhBMTg2LCAweEExODcsIDB4QTE4OCwKKyAgICAweEExODksIDB4QTE4QSwgMHhBMThCLCAweEExOEMsIDB4QTE4RCwgMHhBMThFLCAweEExOEYsIDB4QTE5MCwgMHhBMTkxLAorICAgIDB4QTE5MiwgMHhBMTkzLCAweEExOTQsIDB4QTE5NSwgMHhBMTk2LCAweEExOTcsIDB4QTE5OCwgMHhBMTk5LCAweEExOUEsCisgICAgMHhBMTlCLCAweEExOUMsIDB4QTE5RCwgMHhBMTlFLCAweEExOUYsIDB4QTFBMCwgMHhBMUExLCAweEExQTIsIDB4QTFBMywKKyAgICAweEExQTQsIDB4QTFBNSwgMHhBMUE2LCAweEExQTcsIDB4QTFBOCwgMHhBMUE5LCAweEExQUEsIDB4QTFBQiwgMHhBMUFDLAorICAgIDB4QTFBRCwgMHhBMUFFLCAweEExQUYsIDB4QTFCMCwgMHhBMUIxLCAweEExQjIsIDB4QTFCMywgMHhBMUI0LCAweEExQjUsCisgICAgMHhBMUI2LCAweEExQjcsIDB4QTFCOCwgMHhBMUI5LCAweEExQkEsIDB4QTFCQiwgMHhBMUJDLCAweEExQkQsIDB4QTFCRSwKKyAgICAweEExQkYsIDB4QTFDMCwgMHhBMUMxLCAweEExQzIsIDB4QTFDMywgMHhBMUM0LCAweEExQzUsIDB4QTFDNiwgMHhBMUM3LAorICAgIDB4QTFDOCwgMHhBMUM5LCAweEExQ0EsIDB4QTFDQiwgMHhBMUNDLCAweEExQ0QsIDB4QTFDRSwgMHhBMUNGLCAweEExRDAsCisgICAgMHhBMUQxLCAweEExRDIsIDB4QTFEMywgMHhBMUQ0LCAweEExRDUsIDB4QTFENiwgMHhBMUQ3LCAweEExRDgsIDB4QTFEOSwKKyAgICAweEExREEsIDB4QTFEQiwgMHhBMURDLCAweEExREQsIDB4QTFERSwgMHhBMURGLCAweEExRTAsIDB4QTFFMSwgMHhBMUUyLAorICAgIDB4QTFFMywgMHhBMUU0LCAweEExRTUsIDB4QTFFNiwgMHhBMUU3LCAweEExRTgsIDB4QTFFOSwgMHhBMUVBLCAweEExRUIsCisgICAgMHhBMUVDLCAweEExRUQsIDB4QTFFRSwgMHhBMUVGLCAweEExRjAsIDB4QTFGMSwgMHhBMUYyLCAweEExRjMsIDB4QTFGNCwKKyAgICAweEExRjUsIDB4QTFGNiwgMHhBMUY3LCAweEExRjgsIDB4QTFGOSwgMHhBMUZBLCAweEExRkIsIDB4QTFGQywgMHhBMUZELAorICAgIDB4QTFGRSwgMHhBMUZGLCAweEEyMDAsIDB4QTIwMSwgMHhBMjAyLCAweEEyMDMsIDB4QTIwNCwgMHhBMjA1LCAweEEyMDYsCisgICAgMHhBMjA3LCAweEEyMDgsIDB4QTIwOSwgMHhBMjBBLCAweEEyMEIsIDB4QTIwQywgMHhBMjBELCAweEEyMEUsIDB4QTIwRiwKKyAgICAweEEyMTAsIDB4QTIxMSwgMHhBMjEyLCAweEEyMTMsIDB4QTIxNCwgMHhBMjE1LCAweEEyMTYsIDB4QTIxNywgMHhBMjE4LAorICAgIDB4QTIxOSwgMHhBMjFBLCAweEEyMUIsIDB4QTIxQywgMHhBMjFELCAweEEyMUUsIDB4QTIxRiwgMHhBMjIwLCAweEEyMjEsCisgICAgMHhBMjIyLCAweEEyMjMsIDB4QTIyNCwgMHhBMjI1LCAweEEyMjYsIDB4QTIyNywgMHhBMjI4LCAweEEyMjksIDB4QTIyQSwKKyAgICAweEEyMkIsIDB4QTIyQywgMHhBMjJELCAweEEyMkUsIDB4QTIyRiwgMHhBMjMwLCAweEEyMzEsIDB4QTIzMiwgMHhBMjMzLAorICAgIDB4QTIzNCwgMHhBMjM1LCAweEEyMzYsIDB4QTIzNywgMHhBMjM4LCAweEEyMzksIDB4QTIzQSwgMHhBMjNCLCAweEEyM0MsCisgICAgMHhBMjNELCAweEEyM0UsIDB4QTIzRiwgMHhBMjQwLCAweEEyNDEsIDB4QTI0MiwgMHhBMjQzLCAweEEyNDQsIDB4QTI0NSwKKyAgICAweEEyNDYsIDB4QTI0NywgMHhBMjQ4LCAweEEyNDksIDB4QTI0QSwgMHhBMjRCLCAweEEyNEMsIDB4QTI0RCwgMHhBMjRFLAorICAgIDB4QTI0RiwgMHhBMjUwLCAweEEyNTEsIDB4QTI1MiwgMHhBMjUzLCAweEEyNTQsIDB4QTI1NSwgMHhBMjU2LCAweEEyNTcsCisgICAgMHhBMjU4LCAweEEyNTksIDB4QTI1QSwgMHhBMjVCLCAweEEyNUMsIDB4QTI1RCwgMHhBMjVFLCAweEEyNUYsIDB4QTI2MCwKKyAgICAweEEyNjEsIDB4QTI2MiwgMHhBMjYzLCAweEEyNjQsIDB4QTI2NSwgMHhBMjY2LCAweEEyNjcsIDB4QTI2OCwgMHhBMjY5LAorICAgIDB4QTI2QSwgMHhBMjZCLCAweEEyNkMsIDB4QTI2RCwgMHhBMjZFLCAweEEyNkYsIDB4QTI3MCwgMHhBMjcxLCAweEEyNzIsCisgICAgMHhBMjczLCAweEEyNzQsIDB4QTI3NSwgMHhBMjc2LCAweEEyNzcsIDB4QTI3OCwgMHhBMjc5LCAweEEyN0EsIDB4QTI3QiwKKyAgICAweEEyN0MsIDB4QTI3RCwgMHhBMjdFLCAweEEyN0YsIDB4QTI4MCwgMHhBMjgxLCAweEEyODIsIDB4QTI4MywgMHhBMjg0LAorICAgIDB4QTI4NSwgMHhBMjg2LCAweEEyODcsIDB4QTI4OCwgMHhBMjg5LCAweEEyOEEsIDB4QTI4QiwgMHhBMjhDLCAweEEyOEQsCisgICAgMHhBMjhFLCAweEEyOEYsIDB4QTI5MCwgMHhBMjkxLCAweEEyOTIsIDB4QTI5MywgMHhBMjk0LCAweEEyOTUsIDB4QTI5NiwKKyAgICAweEEyOTcsIDB4QTI5OCwgMHhBMjk5LCAweEEyOUEsIDB4QTI5QiwgMHhBMjlDLCAweEEyOUQsIDB4QTI5RSwgMHhBMjlGLAorICAgIDB4QTJBMCwgMHhBMkExLCAweEEyQTIsIDB4QTJBMywgMHhBMkE0LCAweEEyQTUsIDB4QTJBNiwgMHhBMkE3LCAweEEyQTgsCisgICAgMHhBMkE5LCAweEEyQUEsIDB4QTJBQiwgMHhBMkFDLCAweEEyQUQsIDB4QTJBRSwgMHhBMkFGLCAweEEyQjAsIDB4QTJCMSwKKyAgICAweEEyQjIsIDB4QTJCMywgMHhBMkI0LCAweEEyQjUsIDB4QTJCNiwgMHhBMkI3LCAweEEyQjgsIDB4QTJCOSwgMHhBMkJBLAorICAgIDB4QTJCQiwgMHhBMkJDLCAweEEyQkQsIDB4QTJCRSwgMHhBMkJGLCAweEEyQzAsIDB4QTJDMSwgMHhBMkMyLCAweEEyQzMsCisgICAgMHhBMkM0LCAweEEyQzUsIDB4QTJDNiwgMHhBMkM3LCAweEEyQzgsIDB4QTJDOSwgMHhBMkNBLCAweEEyQ0IsIDB4QTJDQywKKyAgICAweEEyQ0QsIDB4QTJDRSwgMHhBMkNGLCAweEEyRDAsIDB4QTJEMSwgMHhBMkQyLCAweEEyRDMsIDB4QTJENCwgMHhBMkQ1LAorICAgIDB4QTJENiwgMHhBMkQ3LCAweEEyRDgsIDB4QTJEOSwgMHhBMkRBLCAweEEyREIsIDB4QTJEQywgMHhBMkRELCAweEEyREUsCisgICAgMHhBMkRGLCAweEEyRTAsIDB4QTJFMSwgMHhBMkUyLCAweEEyRTMsIDB4QTJFNCwgMHhBMkU1LCAweEEyRTYsIDB4QTJFNywKKyAgICAweEEyRTgsIDB4QTJFOSwgMHhBMkVBLCAweEEyRUIsIDB4QTJFQywgMHhBMkVELCAweEEyRUUsIDB4QTJFRiwgMHhBMkYwLAorICAgIDB4QTJGMSwgMHhBMkYyLCAweEEyRjMsIDB4QTJGNCwgMHhBMkY1LCAweEEyRjYsIDB4QTJGNywgMHhBMkY4LCAweEEyRjksCisgICAgMHhBMkZBLCAweEEyRkIsIDB4QTJGQywgMHhBMkZELCAweEEyRkUsIDB4QTJGRiwgMHhBMzAwLCAweEEzMDEsIDB4QTMwMiwKKyAgICAweEEzMDMsIDB4QTMwNCwgMHhBMzA1LCAweEEzMDYsIDB4QTMwNywgMHhBMzA4LCAweEEzMDksIDB4QTMwQSwgMHhBMzBCLAorICAgIDB4QTMwQywgMHhBMzBELCAweEEzMEUsIDB4QTMwRiwgMHhBMzEwLCAweEEzMTEsIDB4QTMxMiwgMHhBMzEzLCAweEEzMTQsCisgICAgMHhBMzE1LCAweEEzMTYsIDB4QTMxNywgMHhBMzE4LCAweEEzMTksIDB4QTMxQSwgMHhBMzFCLCAweEEzMUMsIDB4QTMxRCwKKyAgICAweEEzMUUsIDB4QTMxRiwgMHhBMzIwLCAweEEzMjEsIDB4QTMyMiwgMHhBMzIzLCAweEEzMjQsIDB4QTMyNSwgMHhBMzI2LAorICAgIDB4QTMyNywgMHhBMzI4LCAweEEzMjksIDB4QTMyQSwgMHhBMzJCLCAweEEzMkMsIDB4QTMyRCwgMHhBMzJFLCAweEEzMkYsCisgICAgMHhBMzMwLCAweEEzMzEsIDB4QTMzMiwgMHhBMzMzLCAweEEzMzQsIDB4QTMzNSwgMHhBMzM2LCAweEEzMzcsIDB4QTMzOCwKKyAgICAweEEzMzksIDB4QTMzQSwgMHhBMzNCLCAweEEzM0MsIDB4QTMzRCwgMHhBMzNFLCAweEEzM0YsIDB4QTM0MCwgMHhBMzQxLAorICAgIDB4QTM0MiwgMHhBMzQzLCAweEEzNDQsIDB4QTM0NSwgMHhBMzQ2LCAweEEzNDcsIDB4QTM0OCwgMHhBMzQ5LCAweEEzNEEsCisgICAgMHhBMzRCLCAweEEzNEMsIDB4QTM0RCwgMHhBMzRFLCAweEEzNEYsIDB4QTM1MCwgMHhBMzUxLCAweEEzNTIsIDB4QTM1MywKKyAgICAweEEzNTQsIDB4QTM1NSwgMHhBMzU2LCAweEEzNTcsIDB4QTM1OCwgMHhBMzU5LCAweEEzNUEsIDB4QTM1QiwgMHhBMzVDLAorICAgIDB4QTM1RCwgMHhBMzVFLCAweEEzNUYsIDB4QTM2MCwgMHhBMzYxLCAweEEzNjIsIDB4QTM2MywgMHhBMzY0LCAweEEzNjUsCisgICAgMHhBMzY2LCAweEEzNjcsIDB4QTM2OCwgMHhBMzY5LCAweEEzNkEsIDB4QTM2QiwgMHhBMzZDLCAweEEzNkQsIDB4QTM2RSwKKyAgICAweEEzNkYsIDB4QTM3MCwgMHhBMzcxLCAweEEzNzIsIDB4QTM3MywgMHhBMzc0LCAweEEzNzUsIDB4QTM3NiwgMHhBMzc3LAorICAgIDB4QTM3OCwgMHhBMzc5LCAweEEzN0EsIDB4QTM3QiwgMHhBMzdDLCAweEEzN0QsIDB4QTM3RSwgMHhBMzdGLCAweEEzODAsCisgICAgMHhBMzgxLCAweEEzODIsIDB4QTM4MywgMHhBMzg0LCAweEEzODUsIDB4QTM4NiwgMHhBMzg3LCAweEEzODgsIDB4QTM4OSwKKyAgICAweEEzOEEsIDB4QTM4QiwgMHhBMzhDLCAweEEzOEQsIDB4QTM4RSwgMHhBMzhGLCAweEEzOTAsIDB4QTM5MSwgMHhBMzkyLAorICAgIDB4QTM5MywgMHhBMzk0LCAweEEzOTUsIDB4QTM5NiwgMHhBMzk3LCAweEEzOTgsIDB4QTM5OSwgMHhBMzlBLCAweEEzOUIsCisgICAgMHhBMzlDLCAweEEzOUQsIDB4QTM5RSwgMHhBMzlGLCAweEEzQTAsIDB4QTNBMSwgMHhBM0EyLCAweEEzQTMsIDB4QTNBNCwKKyAgICAweEEzQTUsIDB4QTNBNiwgMHhBM0E3LCAweEEzQTgsIDB4QTNBOSwgMHhBM0FBLCAweEEzQUIsIDB4QTNBQywgMHhBM0FELAorICAgIDB4QTNBRSwgMHhBM0FGLCAweEEzQjAsIDB4QTNCMSwgMHhBM0IyLCAweEEzQjMsIDB4QTNCNCwgMHhBM0I1LCAweEEzQjYsCisgICAgMHhBM0I3LCAweEEzQjgsIDB4QTNCOSwgMHhBM0JBLCAweEEzQkIsIDB4QTNCQywgMHhBM0JELCAweEEzQkUsIDB4QTNCRiwKKyAgICAweEEzQzAsIDB4QTNDMSwgMHhBM0MyLCAweEEzQzMsIDB4QTNDNCwgMHhBM0M1LCAweEEzQzYsIDB4QTNDNywgMHhBM0M4LAorICAgIDB4QTNDOSwgMHhBM0NBLCAweEEzQ0IsIDB4QTNDQywgMHhBM0NELCAweEEzQ0UsIDB4QTNDRiwgMHhBM0QwLCAweEEzRDEsCisgICAgMHhBM0QyLCAweEEzRDMsIDB4QTNENCwgMHhBM0Q1LCAweEEzRDYsIDB4QTNENywgMHhBM0Q4LCAweEEzRDksIDB4QTNEQSwKKyAgICAweEEzREIsIDB4QTNEQywgMHhBM0RELCAweEEzREUsIDB4QTNERiwgMHhBM0UwLCAweEEzRTEsIDB4QTNFMiwgMHhBM0UzLAorICAgIDB4QTNFNCwgMHhBM0U1LCAweEEzRTYsIDB4QTNFNywgMHhBM0U4LCAweEEzRTksIDB4QTNFQSwgMHhBM0VCLCAweEEzRUMsCisgICAgMHhBM0VELCAweEEzRUUsIDB4QTNFRiwgMHhBM0YwLCAweEEzRjEsIDB4QTNGMiwgMHhBM0YzLCAweEEzRjQsIDB4QTNGNSwKKyAgICAweEEzRjYsIDB4QTNGNywgMHhBM0Y4LCAweEEzRjksIDB4QTNGQSwgMHhBM0ZCLCAweEEzRkMsIDB4QTNGRCwgMHhBM0ZFLAorICAgIDB4QTNGRiwgMHhBNDAwLCAweEE0MDEsIDB4QTQwMiwgMHhBNDAzLCAweEE0MDQsIDB4QTQwNSwgMHhBNDA2LCAweEE0MDcsCisgICAgMHhBNDA4LCAweEE0MDksIDB4QTQwQSwgMHhBNDBCLCAweEE0MEMsIDB4QTQwRCwgMHhBNDBFLCAweEE0MEYsIDB4QTQxMCwKKyAgICAweEE0MTEsIDB4QTQxMiwgMHhBNDEzLCAweEE0MTQsIDB4QTQxNSwgMHhBNDE2LCAweEE0MTcsIDB4QTQxOCwgMHhBNDE5LAorICAgIDB4QTQxQSwgMHhBNDFCLCAweEE0MUMsIDB4QTQxRCwgMHhBNDFFLCAweEE0MUYsIDB4QTQyMCwgMHhBNDIxLCAweEE0MjIsCisgICAgMHhBNDIzLCAweEE0MjQsIDB4QTQyNSwgMHhBNDI2LCAweEE0MjcsIDB4QTQyOCwgMHhBNDI5LCAweEE0MkEsIDB4QTQyQiwKKyAgICAweEE0MkMsIDB4QTQyRCwgMHhBNDJFLCAweEE0MkYsIDB4QTQzMCwgMHhBNDMxLCAweEE0MzIsIDB4QTQzMywgMHhBNDM0LAorICAgIDB4QTQzNSwgMHhBNDM2LCAweEE0MzcsIDB4QTQzOCwgMHhBNDM5LCAweEE0M0EsIDB4QTQzQiwgMHhBNDNDLCAweEE0M0QsCisgICAgMHhBNDNFLCAweEE0M0YsIDB4QTQ0MCwgMHhBNDQxLCAweEE0NDIsIDB4QTQ0MywgMHhBNDQ0LCAweEE0NDUsIDB4QTQ0NiwKKyAgICAweEE0NDcsIDB4QTQ0OCwgMHhBNDQ5LCAweEE0NEEsIDB4QTQ0QiwgMHhBNDRDLCAweEE0NEQsIDB4QTQ0RSwgMHhBNDRGLAorICAgIDB4QTQ1MCwgMHhBNDUxLCAweEE0NTIsIDB4QTQ1MywgMHhBNDU0LCAweEE0NTUsIDB4QTQ1NiwgMHhBNDU3LCAweEE0NTgsCisgICAgMHhBNDU5LCAweEE0NUEsIDB4QTQ1QiwgMHhBNDVDLCAweEE0NUQsIDB4QTQ1RSwgMHhBNDVGLCAweEE0NjAsIDB4QTQ2MSwKKyAgICAweEE0NjIsIDB4QTQ2MywgMHhBNDY0LCAweEE0NjUsIDB4QTQ2NiwgMHhBNDY3LCAweEE0NjgsIDB4QTQ2OSwgMHhBNDZBLAorICAgIDB4QTQ2QiwgMHhBNDZDLCAweEE0NkQsIDB4QTQ2RSwgMHhBNDZGLCAweEE0NzAsIDB4QTQ3MSwgMHhBNDcyLCAweEE0NzMsCisgICAgMHhBNDc0LCAweEE0NzUsIDB4QTQ3NiwgMHhBNDc3LCAweEE0NzgsIDB4QTQ3OSwgMHhBNDdBLCAweEE0N0IsIDB4QTQ3QywKKyAgICAweEE0N0QsIDB4QTQ3RSwgMHhBNDdGLCAweEE0ODAsIDB4QTQ4MSwgMHhBNDgyLCAweEE0ODMsIDB4QTQ4NCwgMHhBNDg1LAorICAgIDB4QTQ4NiwgMHhBNDg3LCAweEE0ODgsIDB4QTQ4OSwgMHhBNDhBLCAweEE0OEIsIDB4QTQ4QywgMHhBNDkwLCAweEE0OTEsCisgICAgMHhBNDkyLCAweEE0OTMsIDB4QTQ5NCwgMHhBNDk1LCAweEE0OTYsIDB4QTQ5NywgMHhBNDk4LCAweEE0OTksIDB4QTQ5QSwKKyAgICAweEE0OUIsIDB4QTQ5QywgMHhBNDlELCAweEE0OUUsIDB4QTQ5RiwgMHhBNEEwLCAweEE0QTEsIDB4QTRBMiwgMHhBNEEzLAorICAgIDB4QTRBNCwgMHhBNEE1LCAweEE0QTYsIDB4QTRBNywgMHhBNEE4LCAweEE0QTksIDB4QTRBQSwgMHhBNEFCLCAweEE0QUMsCisgICAgMHhBNEFELCAweEE0QUUsIDB4QTRBRiwgMHhBNEIwLCAweEE0QjEsIDB4QTRCMiwgMHhBNEIzLCAweEE0QjQsIDB4QTRCNSwKKyAgICAweEE0QjYsIDB4QTRCNywgMHhBNEI4LCAweEE0QjksIDB4QTRCQSwgMHhBNEJCLCAweEE0QkMsIDB4QTRCRCwgMHhBNEJFLAorICAgIDB4QTRCRiwgMHhBNEMwLCAweEE0QzEsIDB4QTRDMiwgMHhBNEMzLCAweEE0QzQsIDB4QTRDNSwgMHhBNEM2LAogfTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0ItRVVDLUhfMC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL0dCLUVVQy1IXzAuY3BwCmluZGV4IGQ1NDcyZjguLjhlOTA2MTEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0ItRVVDLUhfMC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9HQi1FVUMtSF8wLmNwcApAQCAtMSwxMCArMSwxMiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi1leHRlcm4gY29uc3QgdW5zaWduZWQgc2hvcnQgZ19GWENNQVBfR0JfRVVDX0hfMFs5MCAqIDNdID0geworI2luY2x1ZGUgImNtYXBzX2diMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0dCX0VVQ19IXzBbOTAgKiAzXSA9IHsKICAgICAweDAwMjAsIDB4MDAyMCwgMHgxRTI0LCAweDAwMjEsIDB4MDA3RSwgMHgwMzJFLCAweEExQTEsIDB4QTFGRSwgMHgwMDYwLAogICAgIDB4QTJCMSwgMHhBMkUyLCAweDAwQkUsIDB4QTJFNSwgMHhBMkVFLCAweDAwRjAsIDB4QTJGMSwgMHhBMkZDLCAweDAwRkEsCiAgICAgMHhBM0ExLCAweEEzRkUsIDB4MDEwNiwgMHhBNEExLCAweEE0RjMsIDB4MDE2NCwgMHhBNUExLCAweEE1RjYsIDB4MDFCNywKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0ItRVVDLVZfMC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL0dCLUVVQy1WXzAuY3BwCmluZGV4IGJmMmJkNDUuLmQwMjBkYzggMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0ItRVVDLVZfMC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9HQi1FVUMtVl8wLmNwcApAQCAtMSwxMCArMSwxMiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi1leHRlcm4gY29uc3QgdW5zaWduZWQgc2hvcnQgZ19GWENNQVBfR0JfRVVDX1ZfMFsyMCAqIDNdID0geworI2luY2x1ZGUgImNtYXBzX2diMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0dCX0VVQ19WXzBbMjAgKiAzXSA9IHsKICAgICAweEExQTIsIDB4QTFBMiwgMHgwMjNGLCAweEExQTMsIDB4QTFBMywgMHgwMjNFLCAweEExQUEsIDB4QTFBQSwgMHgwMjU2LAogICAgIDB4QTFBQiwgMHhBMUFDLCAweDFFMTgsIDB4QTFBRCwgMHhBMUFELCAweDAyNTcsIDB4QTFCMiwgMHhBMUJGLCAweDAyNDYsCiAgICAgMHhBMUZFLCAweEExRkUsIDB4MUUxQSwgMHhBM0ExLCAweEEzQTEsIDB4MDI0MiwgMHhBM0E4LCAweEEzQTksIDB4MDI0NCwKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0JLLUVVQy1IXzIuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9HQkstRVVDLUhfMi5jcHAKaW5kZXggM2YzODc0Zi4uMGUyNmE4ZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9HQkstRVVDLUhfMi5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9HQkstRVVDLUhfMi5jcHAKQEAgLTEsMTAgKzEsMTIgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0IGdfRlhDTUFQX0dCS19FVUNfSF8yWzQwNzEgKiAzXSA9IHsKKyNpbmNsdWRlICJjbWFwc19nYjEuaCIKKworY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9HQktfRVVDX0hfMls0MDcxICogM10gPSB7CiAgICAgMHgwMDIwLCAweDAwMjAsIDB4MUUyNCwgMHgwMDIxLCAweDAwN0UsIDB4MDMyRSwgMHg4MTQwLCAweDgxNzgsIDB4Mjc1OCwKICAgICAweDgxNzksIDB4ODE3OSwgMHgyMDU5LCAweDgxN0EsIDB4ODE3RSwgMHgyNzkxLCAweDgxODAsIDB4ODE4NSwgMHgyNzk2LAogICAgIDB4ODE4NiwgMHg4MTg2LCAweDIxRjEsIDB4ODE4NywgMHg4MUVDLCAweDI3OUMsIDB4ODFFRCwgMHg4MUVELCAweDFGRjIsCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL0dCSy1FVUMtVl8yLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0JLLUVVQy1WXzIuY3BwCmluZGV4IDUwYWFkZGEuLjMzNmFiMzkgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0JLLUVVQy1WXzIuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0JLLUVVQy1WXzIuY3BwCkBAIC0xLDEwICsxLDEyIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCBnX0ZYQ01BUF9HQktfRVVDX1ZfMlsyMCAqIDNdID0geworI2luY2x1ZGUgImNtYXBzX2diMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0dCS19FVUNfVl8yWzIwICogM10gPSB7CiAgICAgMHhBMUEyLCAweEExQTIsIDB4MDIzRiwgMHhBMUEzLCAweEExQTMsIDB4MDIzRSwgMHhBMUFBLCAweEExQUEsIDB4MDI1NiwKICAgICAweEExQUIsIDB4QTFBQywgMHgxRTE4LCAweEExQUQsIDB4QTFBRCwgMHgwMjU3LCAweEExQjIsIDB4QTFCRiwgMHgwMjQ2LAogICAgIDB4QTFGRSwgMHhBMUZFLCAweDFFMUEsIDB4QTNBMSwgMHhBM0ExLCAweDAyNDIsIDB4QTNBOCwgMHhBM0E5LCAweDAyNDQsCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL0dCSzJLLUhfNS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL0dCSzJLLUhfNS5jcHAKaW5kZXggMjIxMzAxZS4uNDc1MTRkMyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9HQksySy1IXzUuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0JLMkstSF81LmNwcApAQCAtMSwxMCArMSwxMiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi1leHRlcm4gY29uc3QgdW5zaWduZWQgc2hvcnQgZ19GWENNQVBfR0JLMktfSF81WzQwNzEgKiAzXSA9IHsKKyNpbmNsdWRlICJjbWFwc19nYjEuaCIKKworY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9HQksyS19IXzVbNDA3MSAqIDNdID0gewogICAgIDB4MDAyMCwgMHgwMDdFLCAweDAwMDEsIDB4ODE0MCwgMHg4MTc4LCAweDI3NTgsIDB4ODE3OSwgMHg4MTc5LCAweDIwNTksCiAgICAgMHg4MTdBLCAweDgxN0UsIDB4Mjc5MSwgMHg4MTgwLCAweDgxODUsIDB4Mjc5NiwgMHg4MTg2LCAweDgxODYsIDB4MjFGMSwKICAgICAweDgxODcsIDB4ODFFQywgMHgyNzlDLCAweDgxRUQsIDB4ODFFRCwgMHgxRkYyLCAweDgxRUUsIDB4ODFGNSwgMHgyODAyLApAQCAtMTM2MywzNDQgKzEzNjUsNDU4IEBACiAgICAgMHhGRDlFLCAweEZEOUUsIDB4NDBEMywgMHhGRDlGLCAweEZEOUYsIDB4MjAwQywgMHhGREEwLCAweEZEQTAsIDB4NTA4MywKICAgICAweEZFNDAsIDB4RkU0MCwgMHgxMjU5LCAweEZFNDEsIDB4RkU3RSwgMHg1NjEwLCAweEZFODAsIDB4RkVBMCwgMHg1NjRFLAogfTsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCBnX0ZYQ01BUF9HQksyS19IXzVfRFdvcmRbMTAxNyAqIDRdID0gewotICAgIDB4ODEzMCwgMHg4NDM2LCAweDg0MzYsIDB4NTc1MiwgMHg4MTM4LCAweEZEMzgsIDB4RkQzOSwgMHg1NzlDLCAweDgxMzgsIDB4RkUzMCwgMHhGRTM5LCAweDU3OUUsCi0gICAgMHg4MTM5LCAweDgxMzAsIDB4ODEzNywgMHg1N0E4LCAweDgxMzksIDB4ODEzOSwgMHg4MTM5LCAweDU3QjAsIDB4ODEzOSwgMHg4MjMwLCAweDgyMzksIDB4NTdCMSwKLSAgICAweDgxMzksIDB4ODMzMCwgMHg4MzM5LCAweDU3QkIsIDB4ODEzOSwgMHg4NDMwLCAweDg0MzksIDB4NTdDNSwgMHg4MTM5LCAweDg1MzAsIDB4ODUzOSwgMHg1N0NGLAotICAgIDB4ODEzOSwgMHg4NjMwLCAweDg2MzksIDB4NTdEOSwgMHg4MTM5LCAweDg3MzAsIDB4ODczOSwgMHg1N0UzLCAweDgxMzksIDB4ODgzMCwgMHg4ODM5LCAweDU3RUQsCi0gICAgMHg4MTM5LCAweDg5MzAsIDB4ODkzOSwgMHg1N0Y3LCAweDgxMzksIDB4OEIzMiwgMHg4QjMyLCAweDEwNDIsIDB4ODEzOSwgMHg4QjMzLCAweDhCMzMsIDB4MTI2MywKLSAgICAweDgxMzksIDB4OEIzNCwgMHg4QjM0LCAweDEyNzIsIDB4ODEzOSwgMHg4QjM1LCAweDhCMzUsIDB4MTI2NSwgMHg4MTM5LCAweDhCMzYsIDB4OEIzNiwgMHgxMDU5LAotICAgIDB4ODEzOSwgMHg4QjM3LCAweDhCMzcsIDB4Mjc5MywgMHg4MTM5LCAweDhCMzgsIDB4OEIzOCwgMHgwNjNELCAweDgxMzksIDB4OEIzOSwgMHg4QjM5LCAweDEzMDMsCi0gICAgMHg4MTM5LCAweDhDMzAsIDB4OEMzMCwgMHgwQ0E2LCAweDgxMzksIDB4OEMzMSwgMHg4QzMxLCAweDA2MzgsIDB4ODEzOSwgMHg4QzMyLCAweDhDMzIsIDB4MENDNiwKLSAgICAweDgxMzksIDB4OEMzMywgMHg4QzMzLCAweDAzRDYsIDB4ODEzOSwgMHg4QzM0LCAweDhDMzQsIDB4MTI5RCwgMHg4MTM5LCAweDhDMzUsIDB4OEMzNSwgMHgxMzE0LAotICAgIDB4ODEzOSwgMHg4QzM2LCAweDhDMzYsIDB4MTMwRiwgMHg4MTM5LCAweDhDMzcsIDB4OEMzNywgMHgwODJCLCAweDgxMzksIDB4OEMzOCwgMHg4QzM4LCAweDEzOTksCi0gICAgMHg4MTM5LCAweDhDMzksIDB4OEMzOSwgMHgwNTk3LCAweDgxMzksIDB4OEQzMCwgMHg4RDMwLCAweDA5RUYsIDB4ODEzOSwgMHg4RDMxLCAweDhEMzEsIDB4MTJGQywKLSAgICAweDgxMzksIDB4OEQzMiwgMHg4RDMyLCAweDEyNjYsIDB4ODEzOSwgMHg4RDMzLCAweDhEMzMsIDB4MTI4NCwgMHg4MTM5LCAweDhEMzQsIDB4OEQzNCwgMHgyQTFBLAotICAgIDB4ODEzOSwgMHg4RDM1LCAweDhEMzUsIDB4MEQ0NSwgMHg4MTM5LCAweDhEMzYsIDB4OEQzNiwgMHgwNDdFLCAweDgxMzksIDB4OEQzNywgMHg4RDM3LCAweDEzNTIsCi0gICAgMHg4MTM5LCAweDhEMzgsIDB4OEQzOCwgMHgwNENDLCAweDgxMzksIDB4OEQzOSwgMHg4RDM5LCAweDEzOUMsIDB4ODEzOSwgMHg4RTMwLCAweDhFMzAsIDB4MTBCQiwKLSAgICAweDgxMzksIDB4OEUzMSwgMHg4RTMxLCAweDA5NjcsIDB4ODEzOSwgMHg4RTMyLCAweDhFMzIsIDB4MTU5MywgMHg4MTM5LCAweDhFMzMsIDB4OEUzMywgMHgwRTcyLAotICAgIDB4ODEzOSwgMHg4RTM0LCAweDhFMzQsIDB4MEQ1NiwgMHg4MTM5LCAweDhFMzUsIDB4OEUzNSwgMHgxNjFDLCAweDgxMzksIDB4OEUzNiwgMHg4RTM2LCAweDJEMkQsCi0gICAgMHg4MTM5LCAweDhFMzcsIDB4OEUzNywgMHgwRjEzLCAweDgxMzksIDB4OEUzOCwgMHg4RTM4LCAweDA1NzYsIDB4ODEzOSwgMHg4RTM5LCAweDhFMzksIDB4MEI2RiwKLSAgICAweDgxMzksIDB4OEYzMCwgMHg4RjMwLCAweDEyMzAsIDB4ODEzOSwgMHg4RjMxLCAweDhGMzEsIDB4MTcyRSwgMHg4MTM5LCAweDhGMzIsIDB4OEYzMiwgMHgwNTZBLAotICAgIDB4ODEzOSwgMHg4RjMzLCAweDhGMzMsIDB4MEY2QywgMHg4MTM5LCAweDhGMzQsIDB4OEYzNCwgMHgxNEI2LCAweDgxMzksIDB4OEYzNSwgMHg4RjM1LCAweDBENDMsCi0gICAgMHg4MTM5LCAweDhGMzYsIDB4OEYzNiwgMHgxNzc0LCAweDgxMzksIDB4OEYzNywgMHg4RjM3LCAweDBDRjYsIDB4ODEzOSwgMHg4RjM4LCAweDhGMzgsIDB4MTgxNSwKLSAgICAweDgxMzksIDB4OEYzOSwgMHg4RjM5LCAweDA2RkQsIDB4ODEzOSwgMHg5MDMwLCAweDkwMzAsIDB4MDgyRCwgMHg4MTM5LCAweDkwMzEsIDB4OTAzMSwgMHgwOEJFLAotICAgIDB4ODEzOSwgMHg5MDMyLCAweDkwMzIsIDB4MDZDNCwgMHg4MTM5LCAweDkwMzMsIDB4OTAzMywgMHgxODEzLCAweDgxMzksIDB4OTAzNCwgMHg5MDM0LCAweDA3M0MsCi0gICAgMHg4MTM5LCAweDkwMzUsIDB4OTAzNSwgMHgxMzk4LCAweDgxMzksIDB4OTAzNiwgMHg5MDM2LCAweDE0QUQsIDB4ODEzOSwgMHg5MDM3LCAweDkwMzcsIDB4MTRGNiwKLSAgICAweDgxMzksIDB4OTAzOCwgMHg5MDM4LCAweDA3MDYsIDB4ODEzOSwgMHg5MDM5LCAweDkwMzksIDB4MTc2MiwgMHg4MTM5LCAweDkxMzAsIDB4OTEzMCwgMHgxNUVFLAotICAgIDB4ODEzOSwgMHg5MTMxLCAweDkxMzEsIDB4MTVFMCwgMHg4MTM5LCAweDkxMzIsIDB4OTEzMiwgMHgwRjhGLCAweDgxMzksIDB4OTEzMywgMHg5MTMzLCAweDA2RTUsCi0gICAgMHg4MTM5LCAweDkxMzQsIDB4OTEzNCwgMHgzMjkyLCAweDgxMzksIDB4OTEzNSwgMHg5MTM1LCAweDBENkQsIDB4ODEzOSwgMHg5MTM2LCAweDkxMzYsIDB4MTFBNiwKLSAgICAweDgxMzksIDB4OTEzNywgMHg5MTM3LCAweDE5MDksIDB4ODEzOSwgMHg5MTM4LCAweDkxMzgsIDB4MEVEMywgMHg4MTM5LCAweDkxMzksIDB4OTEzOSwgMHgwNUY2LAotICAgIDB4ODEzOSwgMHg5MjMwLCAweDkyMzAsIDB4MDhDMCwgMHg4MTM5LCAweDkyMzEsIDB4OTIzMSwgMHgwNjVBLCAweDgxMzksIDB4OTIzMiwgMHg5MjMyLCAweDBFRUQsCi0gICAgMHg4MTM5LCAweDkyMzMsIDB4OTIzMywgMHgwQ0IwLCAweDgxMzksIDB4OTIzNCwgMHg5MjM0LCAweDEwRkUsIDB4ODEzOSwgMHg5MjM1LCAweDkyMzUsIDB4MTEwNSwKLSAgICAweDgxMzksIDB4OTIzNiwgMHg5MjM2LCAweDBCMjEsIDB4ODEzOSwgMHg5MjM3LCAweDkyMzcsIDB4MEMzNCwgMHg4MTM5LCAweDkyMzgsIDB4OTIzOCwgMHgxMUI4LAotICAgIDB4ODEzOSwgMHg5MjM5LCAweDkyMzksIDB4MDU3OCwgMHg4MTM5LCAweDkzMzAsIDB4OTMzMCwgMHgxOUJELCAweDgxMzksIDB4OTMzMSwgMHg5MzMxLCAweDBFRjIsCi0gICAgMHg4MTM5LCAweDkzMzIsIDB4OTMzMiwgMHgwNDMxLCAweDgxMzksIDB4OTMzMywgMHg5MzMzLCAweDBBQjAsIDB4ODEzOSwgMHg5MzM0LCAweDkzMzQsIDB4MEQ2NiwKLSAgICAweDgxMzksIDB4OTMzNSwgMHg5MzM1LCAweDBDMTcsIDB4ODEzOSwgMHg5MzM2LCAweDkzMzYsIDB4MERBMywgMHg4MTM5LCAweDkzMzcsIDB4OTMzNywgMHgwODA1LAotICAgIDB4ODEzOSwgMHg5MzM4LCAweDkzMzgsIDB4MTIwMywgMHg4MTM5LCAweDkzMzksIDB4OTMzOSwgMHgwNkIzLCAweDgxMzksIDB4OTQzMCwgMHg5NDMwLCAweDEyNjksCi0gICAgMHg4MTM5LCAweDk0MzEsIDB4OTQzMSwgMHgxNjlELCAweDgxMzksIDB4OTQzMiwgMHg5NDMyLCAweDBCQ0IsIDB4ODEzOSwgMHg5NDMzLCAweDk0MzMsIDB4MEZFOSwKLSAgICAweDgxMzksIDB4OTQzNCwgMHg5NDM0LCAweDBCNjQsIDB4ODEzOSwgMHg5NDM1LCAweDk0MzUsIDB4MEM4OSwgMHg4MTM5LCAweDk0MzYsIDB4OTQzNiwgMHgwRkM5LAotICAgIDB4ODEzOSwgMHg5NDM3LCAweDk0MzcsIDB4MTBENiwgMHg4MTM5LCAweDk0MzgsIDB4OTQzOCwgMHgwNzI4LCAweDgxMzksIDB4OTQzOSwgMHg5NDM5LCAweDBFOTAsCi0gICAgMHg4MTM5LCAweDk1MzAsIDB4OTUzMCwgMHgwNkM1LCAweDgxMzksIDB4OTUzMSwgMHg5NTMxLCAweDBEMzMsIDB4ODEzOSwgMHg5NTMyLCAweDk1MzIsIDB4MTBBOCwKLSAgICAweDgxMzksIDB4OTUzMywgMHg5NTMzLCAweDBFNDIsIDB4ODEzOSwgMHg5NTM0LCAweDk1MzQsIDB4MUJDNiwgMHg4MTM5LCAweDk1MzUsIDB4OTUzNSwgMHgxQjYwLAotICAgIDB4ODEzOSwgMHg5NTM2LCAweDk1MzYsIDB4M0VCRiwgMHg4MTM5LCAweDk1MzcsIDB4OTUzNywgMHgwM0UyLCAweDgxMzksIDB4OTUzOCwgMHg5NTM4LCAweDBCQzMsCi0gICAgMHg4MTM5LCAweDk1MzksIDB4OTUzOSwgMHgwQUY4LCAweDgxMzksIDB4OTYzMCwgMHg5NjMwLCAweDBCMjIsIDB4ODEzOSwgMHg5NjMxLCAweDk2MzEsIDB4MEFCMSwKLSAgICAweDgxMzksIDB4OTYzMiwgMHg5NjMyLCAweDBENEYsIDB4ODEzOSwgMHg5NjMzLCAweDk2MzMsIDB4MEQ0NiwgMHg4MTM5LCAweDk2MzQsIDB4OTYzNCwgMHgwRDU1LAotICAgIDB4ODEzOSwgMHg5NjM1LCAweDk2MzUsIDB4NDBDQiwgMHg4MTM5LCAweDk2MzYsIDB4OTYzNiwgMHgwNzgzLCAweDgxMzksIDB4OTYzNywgMHg5NjM3LCAweDBGRDEsCi0gICAgMHg4MTM5LCAweDk2MzgsIDB4OTYzOCwgMHgwOUVCLCAweDgxMzksIDB4OTYzOSwgMHg5NjM5LCAweDExRjAsIDB4ODEzOSwgMHg5NzMwLCAweDk3MzAsIDB4MEFEQywKLSAgICAweDgxMzksIDB4OTczMSwgMHg5NzMxLCAweDFDRTcsIDB4ODEzOSwgMHg5NzMyLCAweDk3MzIsIDB4MUM1RSwgMHg4MTM5LCAweDk3MzMsIDB4OTczMywgMHgwRUE5LAotICAgIDB4ODEzOSwgMHg5NzM0LCAweDk3MzQsIDB4MTAxQiwgMHg4MTM5LCAweDk3MzUsIDB4OTczNSwgMHgxMEQ1LCAweDgxMzksIDB4OTczNiwgMHg5NzM2LCAweDA5QkEsCi0gICAgMHg4MTM5LCAweDk3MzcsIDB4OTczNywgMHgwNjM3LCAweDgxMzksIDB4OTczOCwgMHg5NzM4LCAweDFCQ0IsIDB4ODEzOSwgMHg5NzM5LCAweDk3MzksIDB4MDYzOSwKLSAgICAweDgxMzksIDB4OTgzMCwgMHg5ODMwLCAweDFBMUUsIDB4ODEzOSwgMHg5ODMxLCAweDk4MzEsIDB4MENCRCwgMHg4MTM5LCAweDk4MzIsIDB4OTgzMiwgMHgwNEUxLAotICAgIDB4ODEzOSwgMHg5ODMzLCAweDk4MzMsIDB4MTIzMSwgMHg4MTM5LCAweDk4MzQsIDB4OTgzNCwgMHgxMUMwLCAweDgxMzksIDB4OTgzNSwgMHg5ODM1LCAweDA4RjksCi0gICAgMHg4MTM5LCAweDk4MzYsIDB4OTgzNiwgMHgwRDE5LCAweDgxMzksIDB4OTgzNywgMHg5ODM3LCAweDE2MTgsIDB4ODEzOSwgMHg5ODM4LCAweDk4MzgsIDB4MTFEQSwKLSAgICAweDgxMzksIDB4OTgzOSwgMHg5ODM5LCAweDFDREMsIDB4ODEzOSwgMHg5OTMwLCAweDk5MzAsIDB4MENFNCwgMHg4MTM5LCAweDk5MzEsIDB4OTkzMSwgMHg0NUEyLAotICAgIDB4ODEzOSwgMHg5OTMyLCAweDk5MzIsIDB4MUJGMCwgMHg4MTM5LCAweDk5MzMsIDB4OTkzMywgMHgwNTBCLCAweDgxMzksIDB4OTkzNCwgMHg5OTM0LCAweDBGRDMsCi0gICAgMHg4MTM5LCAweDk5MzUsIDB4OTkzNSwgMHgwRjlCLCAweDgxMzksIDB4OTkzNiwgMHg5OTM2LCAweDEwNDksIDB4ODEzOSwgMHg5OTM3LCAweDk5MzcsIDB4NDlEQywKLSAgICAweDgxMzksIDB4OTkzOCwgMHg5OTM4LCAweDFGOTYsIDB4ODEzOSwgMHg5OTM5LCAweDk5MzksIDB4MDg5OCwgMHg4MTM5LCAweDlBMzAsIDB4OUEzMCwgMHgwRkZELAotICAgIDB4ODEzOSwgMHg5QTMxLCAweDlBMzEsIDB4MDcyMSwgMHg4MTM5LCAweDlBMzIsIDB4OUEzMiwgMHgwNUY4LCAweDgxMzksIDB4OUEzMywgMHg5QTMzLCAweDFEMTUsCi0gICAgMHg4MTM5LCAweDlBMzQsIDB4OUEzNCwgMHgxRDUwLCAweDgxMzksIDB4OUEzNSwgMHg5QTM1LCAweDFFM0IsIDB4ODEzOSwgMHg5QTM2LCAweDlBMzYsIDB4MDUwNSwKLSAgICAweDgxMzksIDB4OUEzNywgMHg5QTM3LCAweDEyM0MsIDB4ODEzOSwgMHg5QTM4LCAweDlBMzgsIDB4MTI0MCwgMHg4MTM5LCAweDlBMzksIDB4OUEzOSwgMHgwRDI2LAotICAgIDB4ODEzOSwgMHg5QjMwLCAweDlCMzAsIDB4MUU3QiwgMHg4MTM5LCAweDlCMzEsIDB4OUIzMSwgMHgwRjhDLCAweDgxMzksIDB4OUIzMiwgMHg5QjMyLCAweDA0RTIsCi0gICAgMHg4MTM5LCAweDlCMzMsIDB4OUIzMywgMHg0RDEzLCAweDgxMzksIDB4OUIzNCwgMHg5QjM0LCAweDEwNUYsIDB4ODEzOSwgMHg5QjM1LCAweDlCMzUsIDB4MTBCNCwKLSAgICAweDgxMzksIDB4OUIzNiwgMHg5QjM2LCAweDRFMTgsIDB4ODEzOSwgMHg5QjM3LCAweDlCMzcsIDB4MDlEQSwgMHg4MTM5LCAweDlCMzgsIDB4OUIzOCwgMHgwOEMxLAotICAgIDB4ODEzOSwgMHg5QjM5LCAweDlCMzksIDB4MUU3NSwgMHg4MTM5LCAweDlDMzAsIDB4OUMzMCwgMHgyMDdELCAweDgxMzksIDB4OUMzMSwgMHg5QzMxLCAweDA2QjIsCi0gICAgMHg4MTM5LCAweDlDMzIsIDB4OUMzMiwgMHgwOUVFLCAweDgxMzksIDB4OUMzMywgMHg5QzMzLCAweDFENzksIDB4ODEzOSwgMHg5QzM0LCAweDlDMzQsIDB4MTBDRiwKLSAgICAweDgxMzksIDB4OUMzNSwgMHg5QzM1LCAweDUwRUEsIDB4ODEzOSwgMHg5QzM2LCAweDlDMzYsIDB4MDY2NCwgMHg4MTM5LCAweDlDMzcsIDB4OUMzNywgMHgwQUVCLAotICAgIDB4ODEzOSwgMHg5QzM4LCAweDlDMzgsIDB4MDZFQSwgMHg4MTM5LCAweDlDMzksIDB4OUMzOSwgMHgyMThELCAweDgxMzksIDB4OUQzMCwgMHg5RDMwLCAweDA4RjEsCi0gICAgMHg4MTM5LCAweDlEMzEsIDB4OUQzMSwgMHgxMDdCLCAweDgxMzksIDB4OUQzMiwgMHg5RDMyLCAweDIyMDksIDB4ODEzOSwgMHg5RDMzLCAweDlEMzMsIDB4MUYwMCwKLSAgICAweDgxMzksIDB4OUQzNCwgMHg5RDM0LCAweDFFRjQsIDB4ODEzOSwgMHg5RDM1LCAweDlEMzUsIDB4MEQ0QSwgMHg4MTM5LCAweDlEMzYsIDB4OUQzNiwgMHgwRDZFLAotICAgIDB4ODEzOSwgMHg5RDM3LCAweDlEMzcsIDB4MEY1MCwgMHg4MTM5LCAweDlEMzgsIDB4OUQzOCwgMHgyMDZELCAweDgxMzksIDB4OUQzOSwgMHg5RDM5LCAweDA3MjAsCi0gICAgMHg4MTM5LCAweDlFMzAsIDB4OUUzMCwgMHgwNkRBLCAweDgxMzksIDB4OUUzMSwgMHg5RTMxLCAweDFERUMsIDB4ODEzOSwgMHg5RTMyLCAweDlFMzIsIDB4MUVEMCwKLSAgICAweDgxMzksIDB4OUUzMywgMHg5RTMzLCAweDEzOUIsIDB4ODEzOSwgMHg5RTM0LCAweDlFMzQsIDB4MTI2MCwgMHg4MTM5LCAweDlFMzUsIDB4OUUzNSwgMHgwNzQ2LAotICAgIDB4ODEzOSwgMHg5RTM2LCAweDlFMzYsIDB4MjIzOSwgMHg4MTM5LCAweDlFMzcsIDB4OUUzNywgMHgyMDlDLCAweDgxMzksIDB4OUUzOCwgMHg5RTM4LCAweDI2ODgsCi0gICAgMHg4MTM5LCAweDlFMzksIDB4OUUzOSwgMHgwQTYwLCAweDgxMzksIDB4OUYzMCwgMHg5RjMwLCAweDIwNzEsIDB4ODEzOSwgMHg5RjMxLCAweDlGMzEsIDB4MEE5MCwKLSAgICAweDgxMzksIDB4OUYzMiwgMHg5RjMyLCAweDU1ODYsIDB4ODEzOSwgMHg5RjMzLCAweDlGMzMsIDB4MEQ4OSwgMHg4MTM5LCAweDlGMzQsIDB4OUYzNCwgMHgwNzkxLAotICAgIDB4ODEzOSwgMHg5RjM1LCAweDlGMzUsIDB4MUE1NSwgMHg4MTM5LCAweDlGMzYsIDB4OUYzNiwgMHgyNjE4LCAweDgxMzksIDB4OUYzNywgMHg5RjM3LCAweDA1RTUsCi0gICAgMHg4MTM5LCAweDlGMzgsIDB4OUYzOCwgMHgwNzFELCAweDgxMzksIDB4OUYzOSwgMHg5RjM5LCAweDBEOEEsIDB4ODEzOSwgMHhBMDMwLCAweEEwMzAsIDB4MDQzMCwKLSAgICAweDgxMzksIDB4QTAzMSwgMHhBMDMxLCAweDIwQzYsIDB4ODEzOSwgMHhBMDMyLCAweEEwMzIsIDB4MUU4NiwgMHg4MTM5LCAweEEwMzMsIDB4QTAzMywgMHgyMDM3LAotICAgIDB4ODEzOSwgMHhBMDM0LCAweEEwMzQsIDB4MUYzNCwgMHg4MTM5LCAweEEwMzUsIDB4QTAzNSwgMHgxMkYzLCAweDgxMzksIDB4QTUzMywgMHhBNTM1LCAweDU3N0IsCi0gICAgMHg4MTM5LCAweEE1MzgsIDB4QTUzOSwgMHg1NzdFLCAweDgxMzksIDB4QTYzMCwgMHhBNjMwLCAweDU3ODAsIDB4ODEzOSwgMHhBNjM0LCAweEE2MzQsIDB4NTc1NSwKLSAgICAweDgxMzksIDB4QTYzNiwgMHhBNjM2LCAweDU3NjcsIDB4ODEzOSwgMHhBNzM1LCAweEE3MzUsIDB4NTc3NiwgMHg4MTM5LCAweEE3MzYsIDB4QTczNiwgMHg1Nzc4LAotICAgIDB4ODEzOSwgMHhBNzM3LCAweEE3MzcsIDB4NTc3NywgMHg4MTM5LCAweEE3MzgsIDB4QTczOCwgMHg1Nzc5LCAweDgxMzksIDB4QTgzNiwgMHhBODM4LCAweDU3ODEsCi0gICAgMHg4MTM5LCAweEI0MzQsIDB4QjQzOSwgMHg1Nzg0LCAweDgxMzksIDB4QjUzMCwgMHhCNTM5LCAweDU3OEEsIDB4ODEzOSwgMHhCNjMwLCAweEI2MzcsIDB4NTc5NCwKLSAgICAweDgxMzksIDB4RUUzOSwgMHhFRTM5LCAweDU4MDEsIDB4ODEzOSwgMHhFRjMwLCAweEVGMzksIDB4NTgwMiwgMHg4MTM5LCAweEYwMzAsIDB4RjAzOSwgMHg1ODBDLAotICAgIDB4ODEzOSwgMHhGMTMwLCAweEYxMzksIDB4NTgxNiwgMHg4MTM5LCAweEYyMzAsIDB4RjIzOSwgMHg1ODIwLCAweDgxMzksIDB4RjMzMCwgMHhGMzM5LCAweDU4MkEsCi0gICAgMHg4MTM5LCAweEY0MzAsIDB4RjQzOSwgMHg1ODM0LCAweDgxMzksIDB4RjUzMCwgMHhGNTM5LCAweDU4M0UsIDB4ODEzOSwgMHhGNjMwLCAweEY2MzksIDB4NTg0OCwKLSAgICAweDgxMzksIDB4RjczMCwgMHhGNzM5LCAweDU4NTIsIDB4ODEzOSwgMHhGODMwLCAweEY4MzksIDB4NTg1QywgMHg4MTM5LCAweEY5MzAsIDB4RjkzOSwgMHg1ODY2LAotICAgIDB4ODEzOSwgMHhGQTMwLCAweEZBMzksIDB4NTg3MCwgMHg4MTM5LCAweEZCMzAsIDB4RkIzOSwgMHg1ODdBLCAweDgxMzksIDB4RkMzMCwgMHhGQzM5LCAweDU4ODQsCi0gICAgMHg4MTM5LCAweEZEMzAsIDB4RkQzOSwgMHg1ODhFLCAweDgxMzksIDB4RkUzMCwgMHhGRTM5LCAweDU4OTgsIDB4ODIzMCwgMHg4MTMwLCAweDgxMzksIDB4NThBMiwKLSAgICAweDgyMzAsIDB4ODIzMCwgMHg4MjM5LCAweDU4QUMsIDB4ODIzMCwgMHg4MzMwLCAweDgzMzksIDB4NThCNiwgMHg4MjMwLCAweDg0MzAsIDB4ODQzOSwgMHg1OEMwLAotICAgIDB4ODIzMCwgMHg4NTMwLCAweDg1MzksIDB4NThDQSwgMHg4MjMwLCAweDg2MzAsIDB4ODYzOSwgMHg1OEQ0LCAweDgyMzAsIDB4ODczMCwgMHg4NzM5LCAweDU4REUsCi0gICAgMHg4MjMwLCAweDg4MzAsIDB4ODgzOSwgMHg1OEU4LCAweDgyMzAsIDB4ODkzMCwgMHg4OTM5LCAweDU4RjIsIDB4ODIzMCwgMHg4QTMwLCAweDhBMzksIDB4NThGQywKLSAgICAweDgyMzAsIDB4OEIzMCwgMHg4QjM5LCAweDU5MDYsIDB4ODIzMCwgMHg4QzMwLCAweDhDMzksIDB4NTkxMCwgMHg4MjMwLCAweDhEMzAsIDB4OEQzOSwgMHg1OTFBLAotICAgIDB4ODIzMCwgMHg4RTMwLCAweDhFMzksIDB4NTkyNCwgMHg4MjMwLCAweDhGMzAsIDB4OEYzOSwgMHg1OTJFLCAweDgyMzAsIDB4OTAzMCwgMHg5MDM5LCAweDU5MzgsCi0gICAgMHg4MjMwLCAweDkxMzAsIDB4OTEzOSwgMHg1OTQyLCAweDgyMzAsIDB4OTIzMCwgMHg5MjM5LCAweDU5NEMsIDB4ODIzMCwgMHg5MzMwLCAweDkzMzksIDB4NTk1NiwKLSAgICAweDgyMzAsIDB4OTQzMCwgMHg5NDM5LCAweDU5NjAsIDB4ODIzMCwgMHg5NTMwLCAweDk1MzksIDB4NTk2QSwgMHg4MjMwLCAweDk2MzAsIDB4OTYzOSwgMHg1OTc0LAotICAgIDB4ODIzMCwgMHg5NzMwLCAweDk3MzksIDB4NTk3RSwgMHg4MjMwLCAweDk4MzAsIDB4OTgzOSwgMHg1OTg4LCAweDgyMzAsIDB4OTkzMCwgMHg5OTM5LCAweDU5OTIsCi0gICAgMHg4MjMwLCAweDlBMzAsIDB4OUEzOSwgMHg1OTlDLCAweDgyMzAsIDB4OUIzMCwgMHg5QjM5LCAweDU5QTYsIDB4ODIzMCwgMHg5QzMwLCAweDlDMzksIDB4NTlCMCwKLSAgICAweDgyMzAsIDB4OUQzMCwgMHg5RDM5LCAweDU5QkEsIDB4ODIzMCwgMHg5RTMwLCAweDlFMzksIDB4NTlDNCwgMHg4MjMwLCAweDlGMzAsIDB4OUYzOSwgMHg1OUNFLAotICAgIDB4ODIzMCwgMHhBMDMwLCAweEEwMzksIDB4NTlEOCwgMHg4MjMwLCAweEExMzAsIDB4QTEzOSwgMHg1OUUyLCAweDgyMzAsIDB4QTIzMCwgMHhBMjM5LCAweDU5RUMsCi0gICAgMHg4MjMwLCAweEEzMzAsIDB4QTMzOSwgMHg1OUY2LCAweDgyMzAsIDB4QTQzMCwgMHhBNDM5LCAweDVBMDAsIDB4ODIzMCwgMHhBNTMwLCAweEE1MzksIDB4NUEwQSwKLSAgICAweDgyMzAsIDB4QTYzMCwgMHhBNjM5LCAweDVBMTQsIDB4ODIzMCwgMHhBNzMwLCAweEE3MzksIDB4NUExRSwgMHg4MjMwLCAweEE4MzAsIDB4QTgzOSwgMHg1QTI4LAotICAgIDB4ODIzMCwgMHhBOTMwLCAweEE5MzksIDB4NUEzMiwgMHg4MjMwLCAweEFBMzAsIDB4QUEzOSwgMHg1QTNDLCAweDgyMzAsIDB4QUIzMCwgMHhBQjM5LCAweDVBNDYsCi0gICAgMHg4MjMwLCAweEFDMzAsIDB4QUMzOSwgMHg1QTUwLCAweDgyMzAsIDB4QUQzMCwgMHhBRDM5LCAweDVBNUEsIDB4ODIzMCwgMHhBRTMwLCAweEFFMzksIDB4NUE2NCwKLSAgICAweDgyMzAsIDB4QUYzMCwgMHhBRjM5LCAweDVBNkUsIDB4ODIzMCwgMHhCMDMwLCAweEIwMzksIDB4NUE3OCwgMHg4MjMwLCAweEIxMzAsIDB4QjEzOSwgMHg1QTgyLAotICAgIDB4ODIzMCwgMHhCMjMwLCAweEIyMzksIDB4NUE4QywgMHg4MjMwLCAweEIzMzAsIDB4QjMzOSwgMHg1QTk2LCAweDgyMzAsIDB4QjQzMCwgMHhCNDM5LCAweDVBQTAsCi0gICAgMHg4MjMwLCAweEI1MzAsIDB4QjUzOSwgMHg1QUFBLCAweDgyMzAsIDB4QjYzMCwgMHhCNjM5LCAweDVBQjQsIDB4ODIzMCwgMHhCNzMwLCAweEI3MzksIDB4NUFCRSwKLSAgICAweDgyMzAsIDB4QjgzMCwgMHhCODM5LCAweDVBQzgsIDB4ODIzMCwgMHhCOTMwLCAweEI5MzksIDB4NUFEMiwgMHg4MjMwLCAweEJBMzAsIDB4QkEzOSwgMHg1QURDLAotICAgIDB4ODIzMCwgMHhCQjMwLCAweEJCMzksIDB4NUFFNiwgMHg4MjMwLCAweEJDMzAsIDB4QkMzOSwgMHg1QUYwLCAweDgyMzAsIDB4QkQzMCwgMHhCRDM5LCAweDVBRkEsCi0gICAgMHg4MjMwLCAweEJFMzAsIDB4QkUzOSwgMHg1QjA0LCAweDgyMzAsIDB4QkYzMCwgMHhCRjM5LCAweDVCMEUsIDB4ODIzMCwgMHhDMDMwLCAweEMwMzksIDB4NUIxOCwKLSAgICAweDgyMzAsIDB4QzEzMCwgMHhDMTM5LCAweDVCMjIsIDB4ODIzMCwgMHhDMjMwLCAweEMyMzksIDB4NUIyQywgMHg4MjMwLCAweEMzMzAsIDB4QzMzOSwgMHg1QjM2LAotICAgIDB4ODIzMCwgMHhDNDMwLCAweEM0MzksIDB4NUI0MCwgMHg4MjMwLCAweEM1MzAsIDB4QzUzOSwgMHg1QjRBLCAweDgyMzAsIDB4QzYzMCwgMHhDNjM5LCAweDVCNTQsCi0gICAgMHg4MjMwLCAweEM3MzAsIDB4QzczOSwgMHg1QjVFLCAweDgyMzAsIDB4QzgzMCwgMHhDODM5LCAweDVCNjgsIDB4ODIzMCwgMHhDOTMwLCAweEM5MzksIDB4NUI3MiwKLSAgICAweDgyMzAsIDB4Q0EzMCwgMHhDQTM5LCAweDVCN0MsIDB4ODIzMCwgMHhDQjMwLCAweENCMzksIDB4NUI4NiwgMHg4MjMwLCAweENDMzAsIDB4Q0MzOSwgMHg1QjkwLAotICAgIDB4ODIzMCwgMHhDRDMwLCAweENEMzksIDB4NUI5QSwgMHg4MjMwLCAweENFMzAsIDB4Q0UzOSwgMHg1QkE0LCAweDgyMzAsIDB4Q0YzMCwgMHhDRjM5LCAweDVCQUUsCi0gICAgMHg4MjMwLCAweEQwMzAsIDB4RDAzOSwgMHg1QkI4LCAweDgyMzAsIDB4RDEzMCwgMHhEMTM5LCAweDVCQzIsIDB4ODIzMCwgMHhEMjMwLCAweEQyMzksIDB4NUJDQywKLSAgICAweDgyMzAsIDB4RDMzMCwgMHhEMzM5LCAweDVCRDYsIDB4ODIzMCwgMHhENDMwLCAweEQ0MzksIDB4NUJFMCwgMHg4MjMwLCAweEQ1MzAsIDB4RDUzOSwgMHg1QkVBLAotICAgIDB4ODIzMCwgMHhENjMwLCAweEQ2MzksIDB4NUJGNCwgMHg4MjMwLCAweEQ3MzAsIDB4RDczOSwgMHg1QkZFLCAweDgyMzAsIDB4RDgzMCwgMHhEODM5LCAweDVDMDgsCi0gICAgMHg4MjMwLCAweEQ5MzAsIDB4RDkzOSwgMHg1QzEyLCAweDgyMzAsIDB4REEzMCwgMHhEQTM5LCAweDVDMUMsIDB4ODIzMCwgMHhEQjMwLCAweERCMzksIDB4NUMyNiwKLSAgICAweDgyMzAsIDB4REMzMCwgMHhEQzM5LCAweDVDMzAsIDB4ODIzMCwgMHhERDMwLCAweEREMzksIDB4NUMzQSwgMHg4MjMwLCAweERFMzAsIDB4REUzOSwgMHg1QzQ0LAotICAgIDB4ODIzMCwgMHhERjMwLCAweERGMzksIDB4NUM0RSwgMHg4MjMwLCAweEUwMzAsIDB4RTAzOSwgMHg1QzU4LCAweDgyMzAsIDB4RTEzMCwgMHhFMTM5LCAweDVDNjIsCi0gICAgMHg4MjMwLCAweEUyMzAsIDB4RTIzOSwgMHg1QzZDLCAweDgyMzAsIDB4RTMzMCwgMHhFMzM5LCAweDVDNzYsIDB4ODIzMCwgMHhFNDMwLCAweEU0MzksIDB4NUM4MCwKLSAgICAweDgyMzAsIDB4RTUzMCwgMHhFNTM5LCAweDVDOEEsIDB4ODIzMCwgMHhFNjMwLCAweEU2MzksIDB4NUM5NCwgMHg4MjMwLCAweEU3MzAsIDB4RTczOSwgMHg1QzlFLAotICAgIDB4ODIzMCwgMHhFODMwLCAweEU4MzksIDB4NUNBOCwgMHg4MjMwLCAweEU5MzAsIDB4RTkzOSwgMHg1Q0IyLCAweDgyMzAsIDB4RUEzMCwgMHhFQTM5LCAweDVDQkMsCi0gICAgMHg4MjMwLCAweEVCMzAsIDB4RUIzOSwgMHg1Q0M2LCAweDgyMzAsIDB4RUMzMCwgMHhFQzM5LCAweDVDRDAsIDB4ODIzMCwgMHhFRDMwLCAweEVEMzksIDB4NUNEQSwKLSAgICAweDgyMzAsIDB4RUUzMCwgMHhFRTM5LCAweDVDRTQsIDB4ODIzMCwgMHhFRjMwLCAweEVGMzksIDB4NUNFRSwgMHg4MjMwLCAweEYwMzAsIDB4RjAzOSwgMHg1Q0Y4LAotICAgIDB4ODIzMCwgMHhGMTMwLCAweEYxMzksIDB4NUQwMiwgMHg4MjMwLCAweEYyMzAsIDB4RjIzOSwgMHg1RDBDLCAweDgyMzAsIDB4RjMzMCwgMHhGMzM5LCAweDVEMTYsCi0gICAgMHg4MjMwLCAweEY0MzAsIDB4RjQzOSwgMHg1RDIwLCAweDgyMzAsIDB4RjUzMCwgMHhGNTM5LCAweDVEMkEsIDB4ODIzMCwgMHhGNjMwLCAweEY2MzksIDB4NUQzNCwKLSAgICAweDgyMzAsIDB4RjczMCwgMHhGNzM5LCAweDVEM0UsIDB4ODIzMCwgMHhGODMwLCAweEY4MzksIDB4NUQ0OCwgMHg4MjMwLCAweEY5MzAsIDB4RjkzOSwgMHg1RDUyLAotICAgIDB4ODIzMCwgMHhGQTMwLCAweEZBMzksIDB4NUQ1QywgMHg4MjMwLCAweEZCMzAsIDB4RkIzOSwgMHg1RDY2LCAweDgyMzAsIDB4RkMzMCwgMHhGQzM5LCAweDVENzAsCi0gICAgMHg4MjMwLCAweEZEMzAsIDB4RkQzOSwgMHg1RDdBLCAweDgyMzAsIDB4RkUzMCwgMHhGRTM5LCAweDVEODQsIDB4ODIzMSwgMHg4MTMwLCAweDgxMzksIDB4NUQ4RSwKLSAgICAweDgyMzEsIDB4ODIzMCwgMHg4MjM5LCAweDVEOTgsIDB4ODIzMSwgMHg4MzMwLCAweDgzMzksIDB4NURBMiwgMHg4MjMxLCAweDg0MzAsIDB4ODQzOSwgMHg1REFDLAotICAgIDB4ODIzMSwgMHg4NTMwLCAweDg1MzksIDB4NURCNiwgMHg4MjMxLCAweDg2MzAsIDB4ODYzOSwgMHg1REMwLCAweDgyMzEsIDB4ODczMCwgMHg4NzM5LCAweDVEQ0EsCi0gICAgMHg4MjMxLCAweDg4MzAsIDB4ODgzOSwgMHg1REQ0LCAweDgyMzEsIDB4ODkzMCwgMHg4OTM5LCAweDVEREUsIDB4ODIzMSwgMHg4QTMwLCAweDhBMzksIDB4NURFOCwKLSAgICAweDgyMzEsIDB4OEIzMCwgMHg4QjM5LCAweDVERjIsIDB4ODIzMSwgMHg4QzMwLCAweDhDMzksIDB4NURGQywgMHg4MjMxLCAweDhEMzAsIDB4OEQzOSwgMHg1RTA2LAotICAgIDB4ODIzMSwgMHg4RTMwLCAweDhFMzksIDB4NUUxMCwgMHg4MjMxLCAweDhGMzAsIDB4OEYzOSwgMHg1RTFBLCAweDgyMzEsIDB4OTAzMCwgMHg5MDM5LCAweDVFMjQsCi0gICAgMHg4MjMxLCAweDkxMzAsIDB4OTEzOSwgMHg1RTJFLCAweDgyMzEsIDB4OTIzMCwgMHg5MjM5LCAweDVFMzgsIDB4ODIzMSwgMHg5MzMwLCAweDkzMzksIDB4NUU0MiwKLSAgICAweDgyMzEsIDB4OTQzMCwgMHg5NDM5LCAweDVFNEMsIDB4ODIzMSwgMHg5NTMwLCAweDk1MzksIDB4NUU1NiwgMHg4MjMxLCAweDk2MzAsIDB4OTYzOSwgMHg1RTYwLAotICAgIDB4ODIzMSwgMHg5NzMwLCAweDk3MzksIDB4NUU2QSwgMHg4MjMxLCAweDk4MzAsIDB4OTgzOSwgMHg1RTc0LCAweDgyMzEsIDB4OTkzMCwgMHg5OTM5LCAweDVFN0UsCi0gICAgMHg4MjMxLCAweDlBMzAsIDB4OUEzOSwgMHg1RTg4LCAweDgyMzEsIDB4OUIzMCwgMHg5QjM5LCAweDVFOTIsIDB4ODIzMSwgMHg5QzMwLCAweDlDMzksIDB4NUU5QywKLSAgICAweDgyMzEsIDB4OUQzMCwgMHg5RDM5LCAweDVFQTYsIDB4ODIzMSwgMHg5RTMwLCAweDlFMzksIDB4NUVCMCwgMHg4MjMxLCAweDlGMzAsIDB4OUYzOSwgMHg1RUJBLAotICAgIDB4ODIzMSwgMHhBMDMwLCAweEEwMzksIDB4NUVDNCwgMHg4MjMxLCAweEExMzAsIDB4QTEzOSwgMHg1RUNFLCAweDgyMzEsIDB4QTIzMCwgMHhBMjM5LCAweDVFRDgsCi0gICAgMHg4MjMxLCAweEEzMzAsIDB4QTMzOSwgMHg1RUUyLCAweDgyMzEsIDB4QTQzMCwgMHhBNDM5LCAweDVFRUMsIDB4ODIzMSwgMHhBNTMwLCAweEE1MzksIDB4NUVGNiwKLSAgICAweDgyMzEsIDB4QTYzMCwgMHhBNjM5LCAweDVGMDAsIDB4ODIzMSwgMHhBNzMwLCAweEE3MzksIDB4NUYwQSwgMHg4MjMxLCAweEE4MzAsIDB4QTgzOSwgMHg1RjE0LAotICAgIDB4ODIzMSwgMHhBOTMwLCAweEE5MzksIDB4NUYxRSwgMHg4MjMxLCAweEFBMzAsIDB4QUEzOSwgMHg1RjI4LCAweDgyMzEsIDB4QUIzMCwgMHhBQjM5LCAweDVGMzIsCi0gICAgMHg4MjMxLCAweEFDMzAsIDB4QUMzOSwgMHg1RjNDLCAweDgyMzEsIDB4QUQzMCwgMHhBRDM5LCAweDVGNDYsIDB4ODIzMSwgMHhBRTMwLCAweEFFMzksIDB4NUY1MCwKLSAgICAweDgyMzEsIDB4QUYzMCwgMHhBRjM5LCAweDVGNUEsIDB4ODIzMSwgMHhCMDMwLCAweEIwMzksIDB4NUY2NCwgMHg4MjMxLCAweEIxMzAsIDB4QjEzOSwgMHg1RjZFLAotICAgIDB4ODIzMSwgMHhCMjMwLCAweEIyMzksIDB4NUY3OCwgMHg4MjMxLCAweEIzMzAsIDB4QjMzOSwgMHg1RjgyLCAweDgyMzEsIDB4QjQzMCwgMHhCNDM5LCAweDVGOEMsCi0gICAgMHg4MjMxLCAweEI1MzAsIDB4QjUzOSwgMHg1Rjk2LCAweDgyMzEsIDB4QjYzMCwgMHhCNjM5LCAweDVGQTAsIDB4ODIzMSwgMHhCNzMwLCAweEI3MzksIDB4NUZBQSwKLSAgICAweDgyMzEsIDB4QjgzMCwgMHhCODM5LCAweDVGQjQsIDB4ODIzMSwgMHhCOTMwLCAweEI5MzksIDB4NUZCRSwgMHg4MjMxLCAweEJBMzAsIDB4QkEzOSwgMHg1RkM4LAotICAgIDB4ODIzMSwgMHhCQjMwLCAweEJCMzksIDB4NUZEMiwgMHg4MjMxLCAweEJDMzAsIDB4QkMzOSwgMHg1RkRDLCAweDgyMzEsIDB4QkQzMCwgMHhCRDM5LCAweDVGRTYsCi0gICAgMHg4MjMxLCAweEJFMzAsIDB4QkUzOSwgMHg1RkYwLCAweDgyMzEsIDB4QkYzMCwgMHhCRjM5LCAweDVGRkEsIDB4ODIzMSwgMHhDMDMwLCAweEMwMzksIDB4NjAwNCwKLSAgICAweDgyMzEsIDB4QzEzMCwgMHhDMTM5LCAweDYwMEUsIDB4ODIzMSwgMHhDMjMwLCAweEMyMzksIDB4NjAxOCwgMHg4MjMxLCAweEMzMzAsIDB4QzMzOSwgMHg2MDIyLAotICAgIDB4ODIzMSwgMHhDNDMwLCAweEM0MzksIDB4NjAyQywgMHg4MjMxLCAweEM1MzAsIDB4QzUzOSwgMHg2MDM2LCAweDgyMzEsIDB4QzYzMCwgMHhDNjM5LCAweDYwNDAsCi0gICAgMHg4MjMxLCAweEM3MzAsIDB4QzczOSwgMHg2MDRBLCAweDgyMzEsIDB4QzgzMCwgMHhDODM5LCAweDYwNTQsIDB4ODIzMSwgMHhDOTMwLCAweEM5MzksIDB4NjA1RSwKLSAgICAweDgyMzEsIDB4Q0EzMCwgMHhDQTM5LCAweDYwNjgsIDB4ODIzMSwgMHhDQjMwLCAweENCMzksIDB4NjA3MiwgMHg4MjMxLCAweENDMzAsIDB4Q0MzOSwgMHg2MDdDLAotICAgIDB4ODIzMSwgMHhDRDMwLCAweENEMzksIDB4NjA4NiwgMHg4MjMxLCAweENFMzAsIDB4Q0UzOSwgMHg2MDkwLCAweDgyMzEsIDB4Q0YzMCwgMHhDRjM5LCAweDYwOUEsCi0gICAgMHg4MjMxLCAweEQwMzAsIDB4RDAzOSwgMHg2MEE0LCAweDgyMzEsIDB4RDEzMCwgMHhEMTM5LCAweDYwQUUsIDB4ODIzMSwgMHhEMjMwLCAweEQyMzksIDB4NjBCOCwKLSAgICAweDgyMzEsIDB4RDMzMCwgMHhEMzM5LCAweDYwQzIsIDB4ODIzMSwgMHhENDMwLCAweEQ0MzksIDB4NjBDQywgMHg4MjMxLCAweEQ1MzAsIDB4RDUzOSwgMHg2MEQ2LAotICAgIDB4ODIzMSwgMHhENjMwLCAweEQ2MzksIDB4NjBFMCwgMHg4MjMxLCAweEQ3MzAsIDB4RDczOSwgMHg2MEVBLCAweDgyMzEsIDB4RDgzMCwgMHhEODM5LCAweDYwRjQsCi0gICAgMHg4MjMxLCAweEQ5MzAsIDB4RDkzOSwgMHg2MEZFLCAweDgyMzEsIDB4REEzMCwgMHhEQTM5LCAweDYxMDgsIDB4ODIzMSwgMHhEQjMwLCAweERCMzksIDB4NjExMiwKLSAgICAweDgyMzEsIDB4REMzMCwgMHhEQzM5LCAweDYxMUMsIDB4ODIzMSwgMHhERDMwLCAweEREMzksIDB4NjEyNiwgMHg4MjMxLCAweERFMzAsIDB4REUzOSwgMHg2MTMwLAotICAgIDB4ODIzMSwgMHhERjMwLCAweERGMzksIDB4NjEzQSwgMHg4MjMxLCAweEUwMzAsIDB4RTAzOSwgMHg2MTQ0LCAweDgyMzEsIDB4RTEzMCwgMHhFMTM5LCAweDYxNEUsCi0gICAgMHg4MjMxLCAweEUyMzAsIDB4RTIzOSwgMHg2MTU4LCAweDgyMzEsIDB4RTMzMCwgMHhFMzM5LCAweDYxNjIsIDB4ODIzMSwgMHhFNDMwLCAweEU0MzksIDB4NjE2QywKLSAgICAweDgyMzEsIDB4RTUzMCwgMHhFNTM5LCAweDYxNzYsIDB4ODIzMSwgMHhFNjMwLCAweEU2MzksIDB4NjE4MCwgMHg4MjMxLCAweEU3MzAsIDB4RTczOSwgMHg2MThBLAotICAgIDB4ODIzMSwgMHhFODMwLCAweEU4MzksIDB4NjE5NCwgMHg4MjMxLCAweEU5MzAsIDB4RTkzOSwgMHg2MTlFLCAweDgyMzEsIDB4RUEzMCwgMHhFQTM5LCAweDYxQTgsCi0gICAgMHg4MjMxLCAweEVCMzAsIDB4RUIzOSwgMHg2MUIyLCAweDgyMzEsIDB4RUMzMCwgMHhFQzM5LCAweDYxQkMsIDB4ODIzMSwgMHhFRDMwLCAweEVEMzksIDB4NjFDNiwKLSAgICAweDgyMzEsIDB4RUUzMCwgMHhFRTM5LCAweDYxRDAsIDB4ODIzMSwgMHhFRjMwLCAweEVGMzksIDB4NjFEQSwgMHg4MjMxLCAweEYwMzAsIDB4RjAzOSwgMHg2MUU0LAotICAgIDB4ODIzMSwgMHhGMTMwLCAweEYxMzksIDB4NjFFRSwgMHg4MjMxLCAweEYyMzAsIDB4RjIzOSwgMHg2MUY4LCAweDgyMzEsIDB4RjMzMCwgMHhGMzM5LCAweDYyMDIsCi0gICAgMHg4MjMxLCAweEY0MzAsIDB4RjQzOSwgMHg2MjBDLCAweDgyMzEsIDB4RjUzMCwgMHhGNTM5LCAweDYyMTYsIDB4ODIzMSwgMHhGNjMwLCAweEY2MzksIDB4NjIyMCwKLSAgICAweDgyMzEsIDB4RjczMCwgMHhGNzM5LCAweDYyMkEsIDB4ODIzMSwgMHhGODMwLCAweEY4MzksIDB4NjIzNCwgMHg4MjMxLCAweEY5MzAsIDB4RjkzOSwgMHg2MjNFLAotICAgIDB4ODIzMSwgMHhGQTMwLCAweEZBMzksIDB4NjI0OCwgMHg4MjMxLCAweEZCMzAsIDB4RkIzOSwgMHg2MjUyLCAweDgyMzEsIDB4RkMzMCwgMHhGQzM5LCAweDYyNUMsCi0gICAgMHg4MjMxLCAweEZEMzAsIDB4RkQzOSwgMHg2MjY2LCAweDgyMzEsIDB4RkUzMCwgMHhGRTM5LCAweDYyNzAsIDB4ODIzMiwgMHg4MTMwLCAweDgxMzksIDB4NjI3QSwKLSAgICAweDgyMzIsIDB4ODIzMCwgMHg4MjM5LCAweDYyODQsIDB4ODIzMiwgMHg4MzMwLCAweDgzMzksIDB4NjI4RSwgMHg4MjMyLCAweDg0MzAsIDB4ODQzOSwgMHg2Mjk4LAotICAgIDB4ODIzMiwgMHg4NTMwLCAweDg1MzksIDB4NjJBMiwgMHg4MjMyLCAweDg2MzAsIDB4ODYzOSwgMHg2MkFDLCAweDgyMzIsIDB4ODczMCwgMHg4NzM5LCAweDYyQjYsCi0gICAgMHg4MjMyLCAweDg4MzAsIDB4ODgzOSwgMHg2MkMwLCAweDgyMzIsIDB4ODkzMCwgMHg4OTM5LCAweDYyQ0EsIDB4ODIzMiwgMHg4QTMwLCAweDhBMzksIDB4NjJENCwKLSAgICAweDgyMzIsIDB4OEIzMCwgMHg4QjM5LCAweDYyREUsIDB4ODIzMiwgMHg4QzMwLCAweDhDMzksIDB4NjJFOCwgMHg4MjMyLCAweDhEMzAsIDB4OEQzOSwgMHg2MkYyLAotICAgIDB4ODIzMiwgMHg4RTMwLCAweDhFMzksIDB4NjJGQywgMHg4MjMyLCAweDhGMzAsIDB4OEYzOSwgMHg2MzA2LCAweDgyMzIsIDB4OTAzMCwgMHg5MDM5LCAweDYzMTAsCi0gICAgMHg4MjMyLCAweDkxMzAsIDB4OTEzOSwgMHg2MzFBLCAweDgyMzIsIDB4OTIzMCwgMHg5MjM5LCAweDYzMjQsIDB4ODIzMiwgMHg5MzMwLCAweDkzMzksIDB4NjMyRSwKLSAgICAweDgyMzIsIDB4OTQzMCwgMHg5NDM5LCAweDYzMzgsIDB4ODIzMiwgMHg5NTMwLCAweDk1MzksIDB4NjM0MiwgMHg4MjMyLCAweDk2MzAsIDB4OTYzOSwgMHg2MzRDLAotICAgIDB4ODIzMiwgMHg5NzMwLCAweDk3MzksIDB4NjM1NiwgMHg4MjMyLCAweDk4MzAsIDB4OTgzOSwgMHg2MzYwLCAweDgyMzIsIDB4OTkzMCwgMHg5OTM5LCAweDYzNkEsCi0gICAgMHg4MjMyLCAweDlBMzAsIDB4OUEzOSwgMHg2Mzc0LCAweDgyMzIsIDB4OUIzMCwgMHg5QjM5LCAweDYzN0UsIDB4ODIzMiwgMHg5QzMwLCAweDlDMzksIDB4NjM4OCwKLSAgICAweDgyMzIsIDB4OUQzMCwgMHg5RDM5LCAweDYzOTIsIDB4ODIzMiwgMHg5RTMwLCAweDlFMzksIDB4NjM5QywgMHg4MjMyLCAweDlGMzAsIDB4OUYzOSwgMHg2M0E2LAotICAgIDB4ODIzMiwgMHhBMDMwLCAweEEwMzksIDB4NjNCMCwgMHg4MjMyLCAweEExMzAsIDB4QTEzOSwgMHg2M0JBLCAweDgyMzIsIDB4QTIzMCwgMHhBMjM5LCAweDYzQzQsCi0gICAgMHg4MjMyLCAweEEzMzAsIDB4QTMzOSwgMHg2M0NFLCAweDgyMzIsIDB4QTQzMCwgMHhBNDM5LCAweDYzRDgsIDB4ODIzMiwgMHhBNTMwLCAweEE1MzksIDB4NjNFMiwKLSAgICAweDgyMzIsIDB4QTYzMCwgMHhBNjM5LCAweDYzRUMsIDB4ODIzMiwgMHhBNzMwLCAweEE3MzksIDB4NjNGNiwgMHg4MjMyLCAweEE4MzAsIDB4QTgzOSwgMHg2NDAwLAotICAgIDB4ODIzMiwgMHhBOTMwLCAweEE5MzksIDB4NjQwQSwgMHg4MjMyLCAweEFBMzAsIDB4QUEzOSwgMHg2NDE0LCAweDgyMzIsIDB4QUIzMCwgMHhBQjM5LCAweDY0MUUsCi0gICAgMHg4MjMyLCAweEFDMzAsIDB4QUMzOSwgMHg2NDI4LCAweDgyMzIsIDB4QUQzMCwgMHhBRDM5LCAweDY0MzIsIDB4ODIzMiwgMHhBRTMwLCAweEFFMzksIDB4NjQzQywKLSAgICAweDgyMzIsIDB4QUYzMCwgMHhBRjM5LCAweDY0NDYsIDB4ODIzMiwgMHhCMDMwLCAweEIwMzksIDB4NjQ1MCwgMHg4MjMyLCAweEIxMzAsIDB4QjEzOSwgMHg2NDVBLAotICAgIDB4ODIzMiwgMHhCMjMwLCAweEIyMzksIDB4NjQ2NCwgMHg4MjMyLCAweEIzMzAsIDB4QjMzOSwgMHg2NDZFLCAweDgyMzIsIDB4QjQzMCwgMHhCNDM5LCAweDY0NzgsCi0gICAgMHg4MjMyLCAweEI1MzAsIDB4QjUzOSwgMHg2NDgyLCAweDgyMzIsIDB4QjYzMCwgMHhCNjM5LCAweDY0OEMsIDB4ODIzMiwgMHhCNzMwLCAweEI3MzksIDB4NjQ5NiwKLSAgICAweDgyMzIsIDB4QjgzMCwgMHhCODM5LCAweDY0QTAsIDB4ODIzMiwgMHhCOTMwLCAweEI5MzksIDB4NjRBQSwgMHg4MjMyLCAweEJBMzAsIDB4QkEzOSwgMHg2NEI0LAotICAgIDB4ODIzMiwgMHhCQjMwLCAweEJCMzksIDB4NjRCRSwgMHg4MjMyLCAweEJDMzAsIDB4QkMzOSwgMHg2NEM4LCAweDgyMzIsIDB4QkQzMCwgMHhCRDM5LCAweDY0RDIsCi0gICAgMHg4MjMyLCAweEJFMzAsIDB4QkUzOSwgMHg2NERDLCAweDgyMzIsIDB4QkYzMCwgMHhCRjM5LCAweDY0RTYsIDB4ODIzMiwgMHhDMDMwLCAweEMwMzksIDB4NjRGMCwKLSAgICAweDgyMzIsIDB4QzEzMCwgMHhDMTM5LCAweDY0RkEsIDB4ODIzMiwgMHhDMjMwLCAweEMyMzksIDB4NjUwNCwgMHg4MjMyLCAweEMzMzAsIDB4QzMzOSwgMHg2NTBFLAotICAgIDB4ODIzMiwgMHhDNDMwLCAweEM0MzksIDB4NjUxOCwgMHg4MjMyLCAweEM1MzAsIDB4QzUzOSwgMHg2NTIyLCAweDgyMzIsIDB4QzYzMCwgMHhDNjM5LCAweDY1MkMsCi0gICAgMHg4MjMyLCAweEM3MzAsIDB4QzczOSwgMHg2NTM2LCAweDgyMzIsIDB4QzgzMCwgMHhDODM5LCAweDY1NDAsIDB4ODIzMiwgMHhDOTMwLCAweEM5MzksIDB4NjU0QSwKLSAgICAweDgyMzIsIDB4Q0EzMCwgMHhDQTM5LCAweDY1NTQsIDB4ODIzMiwgMHhDQjMwLCAweENCMzksIDB4NjU1RSwgMHg4MjMyLCAweENDMzAsIDB4Q0MzOSwgMHg2NTY4LAotICAgIDB4ODIzMiwgMHhDRDMwLCAweENEMzksIDB4NjU3MiwgMHg4MjMyLCAweENFMzAsIDB4Q0UzOSwgMHg2NTdDLCAweDgyMzIsIDB4Q0YzMCwgMHhDRjM5LCAweDY1ODYsCi0gICAgMHg4MjMyLCAweEQwMzAsIDB4RDAzOSwgMHg2NTkwLCAweDgyMzIsIDB4RDEzMCwgMHhEMTM5LCAweDY1OUEsIDB4ODIzMiwgMHhEMjMwLCAweEQyMzksIDB4NjVBNCwKLSAgICAweDgyMzIsIDB4RDMzMCwgMHhEMzM5LCAweDY1QUUsIDB4ODIzMiwgMHhENDMwLCAweEQ0MzksIDB4NjVCOCwgMHg4MjMyLCAweEQ1MzAsIDB4RDUzOSwgMHg2NUMyLAotICAgIDB4ODIzMiwgMHhENjMwLCAweEQ2MzksIDB4NjVDQywgMHg4MjMyLCAweEQ3MzAsIDB4RDczOSwgMHg2NUQ2LCAweDgyMzIsIDB4RDgzMCwgMHhEODM5LCAweDY1RTAsCi0gICAgMHg4MjMyLCAweEQ5MzAsIDB4RDkzOSwgMHg2NUVBLCAweDgyMzIsIDB4REEzMCwgMHhEQTM5LCAweDY1RjQsIDB4ODIzMiwgMHhEQjMwLCAweERCMzksIDB4NjVGRSwKLSAgICAweDgyMzIsIDB4REMzMCwgMHhEQzM5LCAweDY2MDgsIDB4ODIzMiwgMHhERDMwLCAweEREMzksIDB4NjYxMiwgMHg4MjMyLCAweERFMzAsIDB4REUzOSwgMHg2NjFDLAotICAgIDB4ODIzMiwgMHhERjMwLCAweERGMzksIDB4NjYyNiwgMHg4MjMyLCAweEUwMzAsIDB4RTAzOSwgMHg2NjMwLCAweDgyMzIsIDB4RTEzMCwgMHhFMTM5LCAweDY2M0EsCi0gICAgMHg4MjMyLCAweEUyMzAsIDB4RTIzOSwgMHg2NjQ0LCAweDgyMzIsIDB4RTMzMCwgMHhFMzM5LCAweDY2NEUsIDB4ODIzMiwgMHhFNDMwLCAweEU0MzksIDB4NjY1OCwKLSAgICAweDgyMzIsIDB4RTUzMCwgMHhFNTM5LCAweDY2NjIsIDB4ODIzMiwgMHhFNjMwLCAweEU2MzksIDB4NjY2QywgMHg4MjMyLCAweEU3MzAsIDB4RTczOSwgMHg2Njc2LAotICAgIDB4ODIzMiwgMHhFODMwLCAweEU4MzksIDB4NjY4MCwgMHg4MjMyLCAweEU5MzAsIDB4RTkzOSwgMHg2NjhBLCAweDgyMzIsIDB4RUEzMCwgMHhFQTM5LCAweDY2OTQsCi0gICAgMHg4MjMyLCAweEVCMzAsIDB4RUIzOSwgMHg2NjlFLCAweDgyMzIsIDB4RUMzMCwgMHhFQzM5LCAweDY2QTgsIDB4ODIzMiwgMHhFRDMwLCAweEVEMzksIDB4NjZCMiwKLSAgICAweDgyMzIsIDB4RUUzMCwgMHhFRTM5LCAweDY2QkMsIDB4ODIzMiwgMHhFRjMwLCAweEVGMzksIDB4NjZDNiwgMHg4MjMyLCAweEYwMzAsIDB4RjAzOSwgMHg2NkQwLAotICAgIDB4ODIzMiwgMHhGMTMwLCAweEYxMzksIDB4NjZEQSwgMHg4MjMyLCAweEYyMzAsIDB4RjIzOSwgMHg2NkU0LCAweDgyMzIsIDB4RjMzMCwgMHhGMzM5LCAweDY2RUUsCi0gICAgMHg4MjMyLCAweEY0MzAsIDB4RjQzOSwgMHg2NkY4LCAweDgyMzIsIDB4RjUzMCwgMHhGNTM5LCAweDY3MDIsIDB4ODIzMiwgMHhGNjMwLCAweEY2MzksIDB4NjcwQywKLSAgICAweDgyMzIsIDB4RjczMCwgMHhGNzM5LCAweDY3MTYsIDB4ODIzMiwgMHhGODMwLCAweEY4MzksIDB4NjcyMCwgMHg4MjMyLCAweEY5MzAsIDB4RjkzOSwgMHg2NzJBLAotICAgIDB4ODIzMiwgMHhGQTMwLCAweEZBMzksIDB4NjczNCwgMHg4MjMyLCAweEZCMzAsIDB4RkIzOSwgMHg2NzNFLCAweDgyMzIsIDB4RkMzMCwgMHhGQzM5LCAweDY3NDgsCi0gICAgMHg4MjMyLCAweEZEMzAsIDB4RkQzOSwgMHg2NzUyLCAweDgyMzIsIDB4RkUzMCwgMHhGRTM5LCAweDY3NUMsIDB4ODIzMywgMHg4MTMwLCAweDgxMzksIDB4Njc2NiwKLSAgICAweDgyMzMsIDB4ODIzMCwgMHg4MjM5LCAweDY3NzAsIDB4ODIzMywgMHg4MzMwLCAweDgzMzksIDB4Njc3QSwgMHg4MjMzLCAweDg0MzAsIDB4ODQzOSwgMHg2Nzg0LAotICAgIDB4ODIzMywgMHg4NTMwLCAweDg1MzksIDB4Njc4RSwgMHg4MjMzLCAweDg2MzAsIDB4ODYzOSwgMHg2Nzk4LCAweDgyMzMsIDB4ODczMCwgMHg4NzM5LCAweDY3QTIsCi0gICAgMHg4MjMzLCAweDg4MzAsIDB4ODgzOSwgMHg2N0FDLCAweDgyMzMsIDB4ODkzMCwgMHg4OTM5LCAweDY3QjYsIDB4ODIzMywgMHg4QTMwLCAweDhBMzksIDB4NjdDMCwKLSAgICAweDgyMzMsIDB4OEIzMCwgMHg4QjM5LCAweDY3Q0EsIDB4ODIzMywgMHg4QzMwLCAweDhDMzksIDB4NjdENCwgMHg4MjMzLCAweDhEMzAsIDB4OEQzOSwgMHg2N0RFLAotICAgIDB4ODIzMywgMHg4RTMwLCAweDhFMzksIDB4NjdFOCwgMHg4MjMzLCAweDhGMzAsIDB4OEYzOSwgMHg2N0YyLCAweDgyMzMsIDB4OTAzMCwgMHg5MDM5LCAweDY3RkMsCi0gICAgMHg4MjMzLCAweDkxMzAsIDB4OTEzOSwgMHg2ODA2LCAweDgyMzMsIDB4OTIzMCwgMHg5MjM5LCAweDY4MTAsIDB4ODIzMywgMHg5MzMwLCAweDkzMzksIDB4NjgxQSwKLSAgICAweDgyMzMsIDB4OTQzMCwgMHg5NDM5LCAweDY4MjQsIDB4ODIzMywgMHg5NTMwLCAweDk1MzksIDB4NjgyRSwgMHg4MjMzLCAweDk2MzAsIDB4OTYzOSwgMHg2ODM4LAotICAgIDB4ODIzMywgMHg5NzMwLCAweDk3MzksIDB4Njg0MiwgMHg4MjMzLCAweDk4MzAsIDB4OTgzOSwgMHg2ODRDLCAweDgyMzMsIDB4OTkzMCwgMHg5OTM5LCAweDY4NTYsCi0gICAgMHg4MjMzLCAweDlBMzAsIDB4OUEzOSwgMHg2ODYwLCAweDgyMzMsIDB4OUIzMCwgMHg5QjM5LCAweDY4NkEsIDB4ODIzMywgMHg5QzMwLCAweDlDMzksIDB4Njg3NCwKLSAgICAweDgyMzMsIDB4OUQzMCwgMHg5RDM5LCAweDY4N0UsIDB4ODIzMywgMHg5RTMwLCAweDlFMzksIDB4Njg4OCwgMHg4MjMzLCAweDlGMzAsIDB4OUYzOSwgMHg2ODkyLAotICAgIDB4ODIzMywgMHhBMDMwLCAweEEwMzksIDB4Njg5QywgMHg4MjMzLCAweEExMzAsIDB4QTEzOSwgMHg2OEE2LCAweDgyMzMsIDB4QTIzMCwgMHhBMjM5LCAweDY4QjAsCi0gICAgMHg4MjMzLCAweEEzMzAsIDB4QTMzOSwgMHg2OEJBLCAweDgyMzMsIDB4QTQzMCwgMHhBNDM5LCAweDY4QzQsIDB4ODIzMywgMHhBNTMwLCAweEE1MzksIDB4NjhDRSwKLSAgICAweDgyMzMsIDB4QTYzMCwgMHhBNjM5LCAweDY4RDgsIDB4ODIzMywgMHhBNzMwLCAweEE3MzksIDB4NjhFMiwgMHg4MjMzLCAweEE4MzAsIDB4QTgzOSwgMHg2OEVDLAotICAgIDB4ODIzMywgMHhBOTMwLCAweEE5MzksIDB4NjhGNiwgMHg4MjMzLCAweEFBMzAsIDB4QUEzOSwgMHg2OTAwLCAweDgyMzMsIDB4QUIzMCwgMHhBQjM5LCAweDY5MEEsCi0gICAgMHg4MjMzLCAweEFDMzAsIDB4QUMzOSwgMHg2OTE0LCAweDgyMzMsIDB4QUQzMCwgMHhBRDM5LCAweDY5MUUsIDB4ODIzMywgMHhBRTMwLCAweEFFMzksIDB4NjkyOCwKLSAgICAweDgyMzMsIDB4QUYzMCwgMHhBRjM5LCAweDY5MzIsIDB4ODIzMywgMHhCMDMwLCAweEIwMzksIDB4NjkzQywgMHg4MjMzLCAweEIxMzAsIDB4QjEzOSwgMHg2OTQ2LAotICAgIDB4ODIzMywgMHhCMjMwLCAweEIyMzksIDB4Njk1MCwgMHg4MjMzLCAweEIzMzAsIDB4QjMzOSwgMHg2OTVBLCAweDgyMzMsIDB4QjQzMCwgMHhCNDM5LCAweDY5NjQsCi0gICAgMHg4MjMzLCAweEI1MzAsIDB4QjUzOSwgMHg2OTZFLCAweDgyMzMsIDB4QjYzMCwgMHhCNjM5LCAweDY5NzgsIDB4ODIzMywgMHhCNzMwLCAweEI3MzksIDB4Njk4MiwKLSAgICAweDgyMzMsIDB4QjgzMCwgMHhCODM5LCAweDY5OEMsIDB4ODIzMywgMHhCOTMwLCAweEI5MzksIDB4Njk5NiwgMHg4MjMzLCAweEJBMzAsIDB4QkEzOSwgMHg2OUEwLAotICAgIDB4ODIzMywgMHhCQjMwLCAweEJCMzksIDB4NjlBQSwgMHg4MjMzLCAweEJDMzAsIDB4QkMzOSwgMHg2OUI0LCAweDgyMzMsIDB4QkQzMCwgMHhCRDM5LCAweDY5QkUsCi0gICAgMHg4MjMzLCAweEJFMzAsIDB4QkUzOSwgMHg2OUM4LCAweDgyMzMsIDB4QkYzMCwgMHhCRjM5LCAweDY5RDIsIDB4ODIzMywgMHhDMDMwLCAweEMwMzksIDB4NjlEQywKLSAgICAweDgyMzMsIDB4QzEzMCwgMHhDMTM5LCAweDY5RTYsIDB4ODIzMywgMHhDMjMwLCAweEMyMzksIDB4NjlGMCwgMHg4MjMzLCAweEMzMzAsIDB4QzMzOSwgMHg2OUZBLAotICAgIDB4ODIzMywgMHhDNDMwLCAweEM0MzksIDB4NkEwNCwgMHg4MjMzLCAweEM1MzAsIDB4QzUzOSwgMHg2QTBFLCAweDgyMzMsIDB4QzYzMCwgMHhDNjM5LCAweDZBMTgsCi0gICAgMHg4MjMzLCAweEM3MzAsIDB4QzczOSwgMHg2QTIyLCAweDgyMzMsIDB4QzgzMCwgMHhDODM5LCAweDZBMkMsIDB4ODIzMywgMHhDOTMwLCAweEM5MzksIDB4NkEzNiwKLSAgICAweDgyMzMsIDB4Q0EzMCwgMHhDQTM5LCAweDZBNDAsIDB4ODIzMywgMHhDQjMwLCAweENCMzksIDB4NkE0QSwgMHg4MjMzLCAweENDMzAsIDB4Q0MzOSwgMHg2QTU0LAotICAgIDB4ODIzMywgMHhDRDMwLCAweENEMzksIDB4NkE1RSwgMHg4MjMzLCAweENFMzAsIDB4Q0UzOSwgMHg2QTY4LCAweDgyMzMsIDB4Q0YzMCwgMHhDRjM5LCAweDZBNzIsCi0gICAgMHg4MjMzLCAweEQwMzAsIDB4RDAzOSwgMHg2QTdDLCAweDgyMzMsIDB4RDEzMCwgMHhEMTM5LCAweDZBODYsIDB4ODIzMywgMHhEMjMwLCAweEQyMzksIDB4NkE5MCwKLSAgICAweDgyMzMsIDB4RDMzMCwgMHhEMzM5LCAweDZBOUEsIDB4ODIzMywgMHhENDMwLCAweEQ0MzksIDB4NkFBNCwgMHg4MjMzLCAweEQ1MzAsIDB4RDUzOSwgMHg2QUFFLAotICAgIDB4ODIzMywgMHhENjMwLCAweEQ2MzksIDB4NkFCOCwgMHg4MjMzLCAweEQ3MzAsIDB4RDczOSwgMHg2QUMyLCAweDgyMzMsIDB4RDgzMCwgMHhEODM5LCAweDZBQ0MsCi0gICAgMHg4MjMzLCAweEQ5MzAsIDB4RDkzOSwgMHg2QUQ2LCAweDgyMzMsIDB4REEzMCwgMHhEQTM5LCAweDZBRTAsIDB4ODIzMywgMHhEQjMwLCAweERCMzksIDB4NkFFQSwKLSAgICAweDgyMzMsIDB4REMzMCwgMHhEQzM5LCAweDZBRjQsIDB4ODIzMywgMHhERDMwLCAweEREMzksIDB4NkFGRSwgMHg4MjMzLCAweERFMzAsIDB4REUzOSwgMHg2QjA4LAotICAgIDB4ODIzMywgMHhERjMwLCAweERGMzksIDB4NkIxMiwgMHg4MjMzLCAweEUwMzAsIDB4RTAzOSwgMHg2QjFDLCAweDgyMzMsIDB4RTEzMCwgMHhFMTM5LCAweDZCMjYsCi0gICAgMHg4MjMzLCAweEUyMzAsIDB4RTIzOSwgMHg2QjMwLCAweDgyMzMsIDB4RTMzMCwgMHhFMzM5LCAweDZCM0EsIDB4ODIzMywgMHhFNDMwLCAweEU0MzksIDB4NkI0NCwKLSAgICAweDgyMzMsIDB4RTUzMCwgMHhFNTM5LCAweDZCNEUsIDB4ODIzMywgMHhFNjMwLCAweEU2MzksIDB4NkI1OCwgMHg4MjMzLCAweEU3MzAsIDB4RTczOSwgMHg2QjYyLAotICAgIDB4ODIzMywgMHhFODMwLCAweEU4MzksIDB4NkI2QywgMHg4MjMzLCAweEU5MzAsIDB4RTkzOSwgMHg2Qjc2LCAweDgyMzMsIDB4RUEzMCwgMHhFQTM5LCAweDZCODAsCi0gICAgMHg4MjMzLCAweEVCMzAsIDB4RUIzOSwgMHg2QjhBLCAweDgyMzMsIDB4RUMzMCwgMHhFQzM5LCAweDZCOTQsIDB4ODIzMywgMHhFRDMwLCAweEVEMzksIDB4NkI5RSwKLSAgICAweDgyMzMsIDB4RUUzMCwgMHhFRTM5LCAweDZCQTgsIDB4ODIzMywgMHhFRjMwLCAweEVGMzksIDB4NkJCMiwgMHg4MjMzLCAweEYwMzAsIDB4RjAzOSwgMHg2QkJDLAotICAgIDB4ODIzMywgMHhGMTMwLCAweEYxMzksIDB4NkJDNiwgMHg4MjMzLCAweEYyMzAsIDB4RjIzOSwgMHg2QkQwLCAweDgyMzMsIDB4RjMzMCwgMHhGMzM5LCAweDZCREEsCi0gICAgMHg4MjMzLCAweEY0MzAsIDB4RjQzOSwgMHg2QkU0LCAweDgyMzMsIDB4RjUzMCwgMHhGNTM5LCAweDZCRUUsIDB4ODIzMywgMHhGNjMwLCAweEY2MzksIDB4NkJGOCwKLSAgICAweDgyMzMsIDB4RjczMCwgMHhGNzM5LCAweDZDMDIsIDB4ODIzMywgMHhGODMwLCAweEY4MzksIDB4NkMwQywgMHg4MjMzLCAweEY5MzAsIDB4RjkzOSwgMHg2QzE2LAotICAgIDB4ODIzMywgMHhGQTMwLCAweEZBMzksIDB4NkMyMCwgMHg4MjMzLCAweEZCMzAsIDB4RkIzOSwgMHg2QzJBLCAweDgyMzMsIDB4RkMzMCwgMHhGQzM5LCAweDZDMzQsCi0gICAgMHg4MjMzLCAweEZEMzAsIDB4RkQzOSwgMHg2QzNFLCAweDgyMzMsIDB4RkUzMCwgMHhGRTM5LCAweDZDNDgsIDB4ODIzNCwgMHg4MTMwLCAweDgxMzksIDB4NkM1MiwKLSAgICAweDgyMzQsIDB4ODIzMCwgMHg4MjM5LCAweDZDNUMsIDB4ODIzNCwgMHg4MzMwLCAweDgzMzksIDB4NkM2NiwgMHg4MjM0LCAweDg0MzAsIDB4ODQzOSwgMHg2QzcwLAotICAgIDB4ODIzNCwgMHg4NTMwLCAweDg1MzksIDB4NkM3QSwgMHg4MjM0LCAweDg2MzAsIDB4ODYzOSwgMHg2Qzg0LCAweDgyMzQsIDB4ODczMCwgMHg4NzM5LCAweDZDOEUsCi0gICAgMHg4MjM0LCAweDg4MzAsIDB4ODgzOSwgMHg2Qzk4LCAweDgyMzQsIDB4ODkzMCwgMHg4OTM5LCAweDZDQTIsIDB4ODIzNCwgMHg4QTMwLCAweDhBMzksIDB4NkNBQywKLSAgICAweDgyMzQsIDB4OEIzMCwgMHg4QjM5LCAweDZDQjYsIDB4ODIzNCwgMHg4QzMwLCAweDhDMzksIDB4NkNDMCwgMHg4MjM0LCAweDhEMzAsIDB4OEQzOSwgMHg2Q0NBLAotICAgIDB4ODIzNCwgMHg4RTMwLCAweDhFMzksIDB4NkNENCwgMHg4MjM0LCAweDhGMzAsIDB4OEYzOSwgMHg2Q0RFLCAweDgyMzQsIDB4OTAzMCwgMHg5MDM5LCAweDZDRTgsCi0gICAgMHg4MjM0LCAweDkxMzAsIDB4OTEzOSwgMHg2Q0YyLCAweDgyMzQsIDB4OTIzMCwgMHg5MjM5LCAweDZDRkMsIDB4ODIzNCwgMHg5MzMwLCAweDkzMzksIDB4NkQwNiwKLSAgICAweDgyMzQsIDB4OTQzMCwgMHg5NDM5LCAweDZEMTAsIDB4ODIzNCwgMHg5NTMwLCAweDk1MzksIDB4NkQxQSwgMHg4MjM0LCAweDk2MzAsIDB4OTYzOSwgMHg2RDI0LAotICAgIDB4ODIzNCwgMHg5NzMwLCAweDk3MzksIDB4NkQyRSwgMHg4MjM0LCAweDk4MzAsIDB4OTgzOSwgMHg2RDM4LCAweDgyMzQsIDB4OTkzMCwgMHg5OTM5LCAweDZENDIsCi0gICAgMHg4MjM0LCAweDlBMzAsIDB4OUEzOSwgMHg2RDRDLCAweDgyMzQsIDB4OUIzMCwgMHg5QjM5LCAweDZENTYsIDB4ODIzNCwgMHg5QzMwLCAweDlDMzksIDB4NkQ2MCwKLSAgICAweDgyMzQsIDB4OUQzMCwgMHg5RDM5LCAweDZENkEsIDB4ODIzNCwgMHg5RTMwLCAweDlFMzksIDB4NkQ3NCwgMHg4MjM0LCAweDlGMzAsIDB4OUYzOSwgMHg2RDdFLAotICAgIDB4ODIzNCwgMHhBMDMwLCAweEEwMzksIDB4NkQ4OCwgMHg4MjM0LCAweEExMzAsIDB4QTEzOSwgMHg2RDkyLCAweDgyMzQsIDB4QTIzMCwgMHhBMjM5LCAweDZEOUMsCi0gICAgMHg4MjM0LCAweEEzMzAsIDB4QTMzOSwgMHg2REE2LCAweDgyMzQsIDB4QTQzMCwgMHhBNDM5LCAweDZEQjAsIDB4ODIzNCwgMHhBNTMwLCAweEE1MzksIDB4NkRCQSwKLSAgICAweDgyMzQsIDB4QTYzMCwgMHhBNjM5LCAweDZEQzQsIDB4ODIzNCwgMHhBNzMwLCAweEE3MzksIDB4NkRDRSwgMHg4MjM0LCAweEE4MzAsIDB4QTgzOSwgMHg2REQ4LAotICAgIDB4ODIzNCwgMHhBOTMwLCAweEE5MzksIDB4NkRFMiwgMHg4MjM0LCAweEFBMzAsIDB4QUEzOSwgMHg2REVDLCAweDgyMzQsIDB4QUIzMCwgMHhBQjM5LCAweDZERjYsCi0gICAgMHg4MjM0LCAweEFDMzAsIDB4QUMzOSwgMHg2RTAwLCAweDgyMzQsIDB4QUQzMCwgMHhBRDM5LCAweDZFMEEsIDB4ODIzNCwgMHhBRTMwLCAweEFFMzksIDB4NkUxNCwKLSAgICAweDgyMzQsIDB4QUYzMCwgMHhBRjM5LCAweDZFMUUsIDB4ODIzNCwgMHhCMDMwLCAweEIwMzksIDB4NkUyOCwgMHg4MjM0LCAweEIxMzAsIDB4QjEzOSwgMHg2RTMyLAotICAgIDB4ODIzNCwgMHhCMjMwLCAweEIyMzksIDB4NkUzQywgMHg4MjM0LCAweEIzMzAsIDB4QjMzOSwgMHg2RTQ2LCAweDgyMzQsIDB4QjQzMCwgMHhCNDM5LCAweDZFNTAsCi0gICAgMHg4MjM0LCAweEI1MzAsIDB4QjUzOSwgMHg2RTVBLCAweDgyMzQsIDB4QjYzMCwgMHhCNjM5LCAweDZFNjQsIDB4ODIzNCwgMHhCNzMwLCAweEI3MzksIDB4NkU2RSwKLSAgICAweDgyMzQsIDB4QjgzMCwgMHhCODM5LCAweDZFNzgsIDB4ODIzNCwgMHhCOTMwLCAweEI5MzksIDB4NkU4MiwgMHg4MjM0LCAweEJBMzAsIDB4QkEzOSwgMHg2RThDLAotICAgIDB4ODIzNCwgMHhCQjMwLCAweEJCMzksIDB4NkU5NiwgMHg4MjM0LCAweEJDMzAsIDB4QkMzOSwgMHg2RUEwLCAweDgyMzQsIDB4QkQzMCwgMHhCRDM5LCAweDZFQUEsCi0gICAgMHg4MjM0LCAweEJFMzAsIDB4QkUzOSwgMHg2RUI0LCAweDgyMzQsIDB4QkYzMCwgMHhCRjM5LCAweDZFQkUsIDB4ODIzNCwgMHhDMDMwLCAweEMwMzksIDB4NkVDOCwKLSAgICAweDgyMzQsIDB4QzEzMCwgMHhDMTM5LCAweDZFRDIsIDB4ODIzNCwgMHhDMjMwLCAweEMyMzksIDB4NkVEQywgMHg4MjM0LCAweEMzMzAsIDB4QzMzOSwgMHg2RUU2LAotICAgIDB4ODIzNCwgMHhDNDMwLCAweEM0MzksIDB4NkVGMCwgMHg4MjM0LCAweEM1MzAsIDB4QzUzOSwgMHg2RUZBLCAweDgyMzQsIDB4QzYzMCwgMHhDNjM5LCAweDZGMDQsCi0gICAgMHg4MjM0LCAweEM3MzAsIDB4QzczOSwgMHg2RjBFLCAweDgyMzQsIDB4QzgzMCwgMHhDODM5LCAweDZGMTgsIDB4ODIzNCwgMHhDOTMwLCAweEM5MzksIDB4NkYyMiwKLSAgICAweDgyMzQsIDB4Q0EzMCwgMHhDQTM5LCAweDZGMkMsIDB4ODIzNCwgMHhDQjMwLCAweENCMzksIDB4NkYzNiwgMHg4MjM0LCAweENDMzAsIDB4Q0MzOSwgMHg2RjQwLAotICAgIDB4ODIzNCwgMHhDRDMwLCAweENEMzksIDB4NkY0QSwgMHg4MjM0LCAweENFMzAsIDB4Q0UzOSwgMHg2RjU0LCAweDgyMzQsIDB4Q0YzMCwgMHhDRjM5LCAweDZGNUUsCi0gICAgMHg4MjM0LCAweEQwMzAsIDB4RDAzOSwgMHg2RjY4LCAweDgyMzQsIDB4RDEzMCwgMHhEMTM5LCAweDZGNzIsIDB4ODIzNCwgMHhEMjMwLCAweEQyMzksIDB4NkY3QywKLSAgICAweDgyMzQsIDB4RDMzMCwgMHhEMzM5LCAweDZGODYsIDB4ODIzNCwgMHhENDMwLCAweEQ0MzksIDB4NkY5MCwgMHg4MjM0LCAweEQ1MzAsIDB4RDUzOSwgMHg2RjlBLAotICAgIDB4ODIzNCwgMHhENjMwLCAweEQ2MzksIDB4NkZBNCwgMHg4MjM0LCAweEQ3MzAsIDB4RDczOSwgMHg2RkFFLCAweDgyMzQsIDB4RDgzMCwgMHhEODM5LCAweDZGQjgsCi0gICAgMHg4MjM0LCAweEQ5MzAsIDB4RDkzOSwgMHg2RkMyLCAweDgyMzQsIDB4REEzMCwgMHhEQTM5LCAweDZGQ0MsIDB4ODIzNCwgMHhEQjMwLCAweERCMzksIDB4NkZENiwKLSAgICAweDgyMzQsIDB4REMzMCwgMHhEQzM5LCAweDZGRTAsIDB4ODIzNCwgMHhERDMwLCAweEREMzksIDB4NkZFQSwgMHg4MjM0LCAweERFMzAsIDB4REUzOSwgMHg2RkY0LAotICAgIDB4ODIzNCwgMHhERjMwLCAweERGMzksIDB4NkZGRSwgMHg4MjM0LCAweEUwMzAsIDB4RTAzOSwgMHg3MDA4LCAweDgyMzQsIDB4RTEzMCwgMHhFMTM5LCAweDcwMTIsCi0gICAgMHg4MjM0LCAweEUyMzAsIDB4RTIzOSwgMHg3MDFDLCAweDgyMzQsIDB4RTMzMCwgMHhFMzM5LCAweDcwMjYsIDB4ODIzNCwgMHhFNDMwLCAweEU0MzksIDB4NzAzMCwKLSAgICAweDgyMzQsIDB4RTUzMCwgMHhFNTM5LCAweDcwM0EsIDB4ODIzNCwgMHhFNjMwLCAweEU2MzksIDB4NzA0NCwgMHg4MjM0LCAweEU3MzAsIDB4RTczOSwgMHg3MDRFLAotICAgIDB4ODIzNCwgMHhFODMwLCAweEU4MzksIDB4NzA1OCwgMHg4MjM0LCAweEU5MzAsIDB4RTkzOSwgMHg3MDYyLCAweDgyMzQsIDB4RUEzMCwgMHhFQTM5LCAweDcwNkMsCi0gICAgMHg4MjM0LCAweEVCMzAsIDB4RUIzOSwgMHg3MDc2LCAweDgyMzQsIDB4RUMzMCwgMHhFQzM5LCAweDcwODAsIDB4ODIzNCwgMHhFRDMwLCAweEVEMzksIDB4NzA4QSwKLSAgICAweDgyMzQsIDB4RUUzMCwgMHhFRTM5LCAweDcwOTQsIDB4ODIzNCwgMHhFRjMwLCAweEVGMzksIDB4NzA5RSwgMHg4MjM0LCAweEYwMzAsIDB4RjAzOSwgMHg3MEE4LAotICAgIDB4ODIzNCwgMHhGMTMwLCAweEYxMzksIDB4NzBCMiwgMHg4MjM0LCAweEYyMzAsIDB4RjIzOSwgMHg3MEJDLCAweDgyMzQsIDB4RjMzMCwgMHhGMzM5LCAweDcwQzYsCi0gICAgMHg4MjM0LCAweEY0MzAsIDB4RjQzOSwgMHg3MEQwLCAweDgyMzQsIDB4RjUzMCwgMHhGNTM5LCAweDcwREEsIDB4ODIzNCwgMHhGNjMwLCAweEY2MzksIDB4NzBFNCwKLSAgICAweDgyMzQsIDB4RjczMCwgMHhGNzM5LCAweDcwRUUsIDB4ODIzNCwgMHhGODMwLCAweEY4MzksIDB4NzBGOCwgMHg4MjM0LCAweEY5MzAsIDB4RjkzOSwgMHg3MTAyLAotICAgIDB4ODIzNCwgMHhGQTMwLCAweEZBMzksIDB4NzEwQywgMHg4MjM0LCAweEZCMzAsIDB4RkIzOSwgMHg3MTE2LCAweDgyMzQsIDB4RkMzMCwgMHhGQzM5LCAweDcxMjAsCi0gICAgMHg4MjM0LCAweEZEMzAsIDB4RkQzOSwgMHg3MTJBLCAweDgyMzQsIDB4RkUzMCwgMHhGRTM5LCAweDcxMzQsIDB4ODIzNSwgMHg4MTMwLCAweDgxMzksIDB4NzEzRSwKLSAgICAweDgyMzUsIDB4ODIzMCwgMHg4MjM5LCAweDcxNDgsIDB4ODIzNSwgMHg4MzMwLCAweDgzMzksIDB4NzE1MiwgMHg4MjM1LCAweDg0MzAsIDB4ODQzOSwgMHg3MTVDLAotICAgIDB4ODIzNSwgMHg4NTMwLCAweDg1MzksIDB4NzE2NiwgMHg4MjM1LCAweDg2MzAsIDB4ODYzOSwgMHg3MTcwLCAweDgyMzUsIDB4ODczMCwgMHg4NzM4LCAweDcxN0EsCi0gICAgMHg4MjM1LCAweDk4MzMsIDB4OTgzOSwgMHg3MTg4LCAweDgyMzUsIDB4OTkzMCwgMHg5OTM5LCAweDcxOEYsIDB4ODIzNSwgMHg5QTMwLCAweDlBMzksIDB4NzE5OSwKLSAgICAweDgyMzUsIDB4OUIzMCwgMHg5QjM5LCAweDcxQTMsIDB4ODIzNSwgMHg5QzMwLCAweDlDMzksIDB4NzFBRCwgMHg4MjM1LCAweDlEMzAsIDB4OUQzOSwgMHg3MUI3LAotICAgIDB4ODIzNSwgMHg5RTMwLCAweDlFMzksIDB4NzFDMSwgMHg4MjM1LCAweDlGMzAsIDB4OUYzOSwgMHg3MUNCLCAweDgyMzUsIDB4QTAzMCwgMHhBMDM5LCAweDcxRDUsCi0gICAgMHg4MjM1LCAweEExMzAsIDB4QTEzOSwgMHg3MURGLCAweDgyMzUsIDB4QTIzMCwgMHhBMjM5LCAweDcxRTksIDB4ODIzNSwgMHhBMzMwLCAweEEzMzksIDB4NzFGMywKLSAgICAweDgyMzUsIDB4QTQzMCwgMHhBNDM5LCAweDcxRkQsIDB4ODIzNSwgMHhBNTMwLCAweEE1MzksIDB4NzIwNywgMHg4MjM1LCAweEE2MzAsIDB4QTYzOSwgMHg3MjExLAotICAgIDB4ODIzNSwgMHhBNzMwLCAweEE3MzksIDB4NzIxQiwgMHg4MjM1LCAweEE4MzAsIDB4QTgzOSwgMHg3MjI1LCAweDgyMzUsIDB4QTkzMCwgMHhBOTM5LCAweDcyMkYsCi0gICAgMHg4MjM1LCAweEFBMzAsIDB4QUEzOSwgMHg3MjM5LCAweDgyMzUsIDB4QUIzMCwgMHhBQjM5LCAweDcyNDMsIDB4ODIzNSwgMHhBQzMwLCAweEFDMzksIDB4NzI0RCwKLSAgICAweDgyMzUsIDB4QUQzMCwgMHhBRDM5LCAweDcyNTcsIDB4ODIzNSwgMHhBRTMwLCAweEFFMzksIDB4NzI2MSwgMHg4MjM1LCAweEFGMzAsIDB4QUYzOSwgMHg3MjZCLAotICAgIDB4ODIzNSwgMHhCMDMwLCAweEIwMzksIDB4NzI3NSwgMHg4MjM1LCAweEIxMzAsIDB4QjEzOSwgMHg3MjdGLCAweDgyMzUsIDB4QjIzMCwgMHhCMjM5LCAweDcyODksCi0gICAgMHg4MjM1LCAweEIzMzAsIDB4QjMzOSwgMHg3MjkzLCAweDgyMzUsIDB4QjQzMCwgMHhCNDM5LCAweDcyOUQsIDB4ODIzNSwgMHhCNTMwLCAweEI1MzksIDB4NzJBNywKLSAgICAweDgyMzUsIDB4QjYzMCwgMHhCNjM5LCAweDcyQjEsIDB4ODIzNSwgMHhCNzMwLCAweEI3MzksIDB4NzJCQiwgMHg4MjM1LCAweEI4MzAsIDB4QjgzOSwgMHg3MkM1LAotICAgIDB4ODIzNSwgMHhCOTMwLCAweEI5MzksIDB4NzJDRiwgMHg4MjM1LCAweEJBMzAsIDB4QkEzOSwgMHg3MkQ5LCAweDgyMzUsIDB4QkIzMCwgMHhCQjM5LCAweDcyRTMsCi0gICAgMHg4MjM1LCAweEJDMzAsIDB4QkMzOSwgMHg3MkVELCAweDgyMzUsIDB4QkQzMCwgMHhCRDM5LCAweDcyRjcsIDB4ODIzNSwgMHhCRTMwLCAweEJFMzksIDB4NzMwMSwKLSAgICAweDgyMzUsIDB4QkYzMCwgMHhCRjM5LCAweDczMEIsIDB4ODIzNSwgMHhDMDMwLCAweEMwMzksIDB4NzMxNSwgMHg4MjM1LCAweEMxMzAsIDB4QzEzOSwgMHg3MzFGLAotICAgIDB4ODIzNSwgMHhDMjMwLCAweEMyMzksIDB4NzMyOSwgMHg4MjM1LCAweEMzMzAsIDB4QzMzOSwgMHg3MzMzLCAweDgyMzUsIDB4QzQzMCwgMHhDNDM5LCAweDczM0QsCi0gICAgMHg4MjM1LCAweEM1MzAsIDB4QzUzOSwgMHg3MzQ3LCAweDgyMzUsIDB4QzYzMCwgMHhDNjM5LCAweDczNTEsIDB4ODIzNSwgMHhDNzMwLCAweEM3MzksIDB4NzM1QiwKLSAgICAweDgyMzUsIDB4QzgzMCwgMHhDODM5LCAweDczNjUsIDB4ODIzNSwgMHhDOTMwLCAweEM5MzksIDB4NzM2RiwgMHg4MjM1LCAweENBMzAsIDB4Q0EzOSwgMHg3Mzc5LAotICAgIDB4ODIzNSwgMHhDQjMwLCAweENCMzksIDB4NzM4MywgMHg4MjM1LCAweENDMzAsIDB4Q0MzOSwgMHg3MzhELCAweDgyMzUsIDB4Q0QzMCwgMHhDRDM5LCAweDczOTcsCi0gICAgMHg4MjM1LCAweENFMzAsIDB4Q0UzOSwgMHg3M0ExLCAweDgyMzUsIDB4Q0YzMCwgMHhDRjM5LCAweDczQUIsIDB4ODIzNSwgMHhEMDMwLCAweEQwMzksIDB4NzNCNSwKLSAgICAweDgyMzUsIDB4RDEzMCwgMHhEMTM5LCAweDczQkYsIDB4ODIzNSwgMHhEMjMwLCAweEQyMzksIDB4NzNDOSwgMHg4MjM1LCAweEQzMzAsIDB4RDMzOSwgMHg3M0QzLAotICAgIDB4ODIzNSwgMHhENDMwLCAweEQ0MzksIDB4NzNERCwgMHg4MjM1LCAweEQ1MzAsIDB4RDUzOSwgMHg3M0U3LCAweDgyMzUsIDB4RDYzMCwgMHhENjM5LCAweDczRjEsCi0gICAgMHg4MjM1LCAweEQ3MzAsIDB4RDczOSwgMHg3M0ZCLCAweDgyMzUsIDB4RDgzMCwgMHhEODM5LCAweDc0MDUsIDB4ODIzNSwgMHhEOTMwLCAweEQ5MzksIDB4NzQwRiwKLSAgICAweDgyMzUsIDB4REEzMCwgMHhEQTM5LCAweDc0MTksIDB4ODIzNSwgMHhEQjMwLCAweERCMzksIDB4NzQyMywgMHg4MjM1LCAweERDMzAsIDB4REMzOSwgMHg3NDJELAotICAgIDB4ODIzNSwgMHhERDMwLCAweEREMzksIDB4NzQzNywgMHg4MjM1LCAweERFMzAsIDB4REUzOSwgMHg3NDQxLCAweDgyMzUsIDB4REYzMCwgMHhERjM5LCAweDc0NEIsCi0gICAgMHg4MjM1LCAweEUwMzAsIDB4RTAzOSwgMHg3NDU1LCAweDgyMzUsIDB4RTEzMCwgMHhFMTM5LCAweDc0NUYsIDB4ODIzNSwgMHhFMjMwLCAweEUyMzksIDB4NzQ2OSwKLSAgICAweDgyMzUsIDB4RTMzMCwgMHhFMzM5LCAweDc0NzMsIDB4ODIzNSwgMHhFNDMwLCAweEU0MzksIDB4NzQ3RCwgMHg4MjM1LCAweEU1MzAsIDB4RTUzOSwgMHg3NDg3LAotICAgIDB4ODIzNSwgMHhFNjMwLCAweEU2MzksIDB4NzQ5MSwgMHg4MjM1LCAweEU3MzAsIDB4RTczOSwgMHg3NDlCLCAweDgyMzUsIDB4RTgzMCwgMHhFODM5LCAweDc0QTUsCi0gICAgMHg4MjM1LCAweEU5MzAsIDB4RTkzOSwgMHg3NEFGLCAweDgyMzUsIDB4RUEzMCwgMHhFQTM5LCAweDc0QjksIDB4ODIzNSwgMHhFQjMwLCAweEVCMzksIDB4NzRDMywKLSAgICAweDgyMzUsIDB4RUMzMCwgMHhFQzM5LCAweDc0Q0QsIDB4ODIzNSwgMHhFRDMwLCAweEVEMzksIDB4NzRENywgMHg4MjM1LCAweEVFMzAsIDB4RUUzOSwgMHg3NEUxLAotICAgIDB4ODIzNSwgMHhFRjMwLCAweEVGMzksIDB4NzRFQiwgMHg4MjM1LCAweEYwMzAsIDB4RjAzOSwgMHg3NEY1LCAweDgyMzUsIDB4RjEzMCwgMHhGMTM5LCAweDc0RkYsCi0gICAgMHg4MjM1LCAweEYyMzAsIDB4RjIzOSwgMHg3NTA5LCAweDgyMzUsIDB4RjMzMCwgMHhGMzM5LCAweDc1MTMsIDB4ODIzNSwgMHhGNDMwLCAweEY0MzksIDB4NzUxRCwKLSAgICAweDgyMzUsIDB4RjUzMCwgMHhGNTM5LCAweDc1MjcsIDB4ODIzNSwgMHhGNjMwLCAweEY2MzksIDB4NzUzMSwgMHg4MjM1LCAweEY3MzAsIDB4RjczOSwgMHg3NTNCLAotICAgIDB4ODIzNSwgMHhGODMwLCAweEY4MzksIDB4NzU0NSwgMHg4MjM1LCAweEY5MzAsIDB4RjkzOSwgMHg3NTRGLCAweDgyMzUsIDB4RkEzMCwgMHhGQTM5LCAweDc1NTksCi0gICAgMHg4MjM1LCAweEZCMzAsIDB4RkIzOSwgMHg3NTYzLCAweDgyMzUsIDB4RkMzMCwgMHhGQzM5LCAweDc1NkQsIDB4ODIzNSwgMHhGRDMwLCAweEZEMzksIDB4NzU3NywKLSAgICAweDgyMzUsIDB4RkUzMCwgMHhGRTM5LCAweDc1ODEsIDB4ODIzNiwgMHg4MTMwLCAweDgxMzksIDB4NzU4QiwgMHg4MjM2LCAweDgyMzAsIDB4ODIzOSwgMHg3NTk1LAotICAgIDB4ODIzNiwgMHg4MzMwLCAweDgzMzksIDB4NzU5RiwgMHg4MjM2LCAweDg0MzAsIDB4ODQzOSwgMHg3NUE5LCAweDgyMzYsIDB4ODUzMCwgMHg4NTM5LCAweDc1QjMsCi0gICAgMHg4MjM2LCAweDg2MzAsIDB4ODYzOSwgMHg3NUJELCAweDgyMzYsIDB4ODczMCwgMHg4NzM5LCAweDc1QzcsIDB4ODIzNiwgMHg4ODMwLCAweDg4MzksIDB4NzVEMSwKLSAgICAweDgyMzYsIDB4ODkzMCwgMHg4OTM5LCAweDc1REIsIDB4ODIzNiwgMHg4QTMwLCAweDhBMzksIDB4NzVFNSwgMHg4MjM2LCAweDhCMzAsIDB4OEIzOSwgMHg3NUVGLAotICAgIDB4ODIzNiwgMHg4QzMwLCAweDhDMzksIDB4NzVGOSwgMHg4MjM2LCAweDhEMzAsIDB4OEQzOSwgMHg3NjAzLCAweDgyMzYsIDB4OEUzMCwgMHg4RTM3LCAweDc2MEQsCi0gICAgMHg4MjM2LCAweDhGMzEsIDB4OEYzOSwgMHg3NjE1LCAweDgyMzYsIDB4OTAzMCwgMHg5MDM5LCAweDc2MUUsIDB4ODIzNiwgMHg5MTMwLCAweDkxMzksIDB4NzYyOCwKLSAgICAweDgyMzYsIDB4OTIzMCwgMHg5MjM5LCAweDc2MzIsIDB4ODIzNiwgMHg5MzMwLCAweDkzMzksIDB4NzYzQywgMHg4MjM2LCAweDk0MzAsIDB4OTQzNSwgMHg3NjQ2LAorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0dCSzJLX0hfNV9EV29yZFsxMDE3ICogNF0gPSB7CisgICAgMHg4MTMwLCAweDg0MzYsIDB4ODQzNiwgMHg1NzUyLCAweDgxMzgsIDB4RkQzOCwgMHhGRDM5LCAweDU3OUMsIDB4ODEzOCwKKyAgICAweEZFMzAsIDB4RkUzOSwgMHg1NzlFLCAweDgxMzksIDB4ODEzMCwgMHg4MTM3LCAweDU3QTgsIDB4ODEzOSwgMHg4MTM5LAorICAgIDB4ODEzOSwgMHg1N0IwLCAweDgxMzksIDB4ODIzMCwgMHg4MjM5LCAweDU3QjEsIDB4ODEzOSwgMHg4MzMwLCAweDgzMzksCisgICAgMHg1N0JCLCAweDgxMzksIDB4ODQzMCwgMHg4NDM5LCAweDU3QzUsIDB4ODEzOSwgMHg4NTMwLCAweDg1MzksIDB4NTdDRiwKKyAgICAweDgxMzksIDB4ODYzMCwgMHg4NjM5LCAweDU3RDksIDB4ODEzOSwgMHg4NzMwLCAweDg3MzksIDB4NTdFMywgMHg4MTM5LAorICAgIDB4ODgzMCwgMHg4ODM5LCAweDU3RUQsIDB4ODEzOSwgMHg4OTMwLCAweDg5MzksIDB4NTdGNywgMHg4MTM5LCAweDhCMzIsCisgICAgMHg4QjMyLCAweDEwNDIsIDB4ODEzOSwgMHg4QjMzLCAweDhCMzMsIDB4MTI2MywgMHg4MTM5LCAweDhCMzQsIDB4OEIzNCwKKyAgICAweDEyNzIsIDB4ODEzOSwgMHg4QjM1LCAweDhCMzUsIDB4MTI2NSwgMHg4MTM5LCAweDhCMzYsIDB4OEIzNiwgMHgxMDU5LAorICAgIDB4ODEzOSwgMHg4QjM3LCAweDhCMzcsIDB4Mjc5MywgMHg4MTM5LCAweDhCMzgsIDB4OEIzOCwgMHgwNjNELCAweDgxMzksCisgICAgMHg4QjM5LCAweDhCMzksIDB4MTMwMywgMHg4MTM5LCAweDhDMzAsIDB4OEMzMCwgMHgwQ0E2LCAweDgxMzksIDB4OEMzMSwKKyAgICAweDhDMzEsIDB4MDYzOCwgMHg4MTM5LCAweDhDMzIsIDB4OEMzMiwgMHgwQ0M2LCAweDgxMzksIDB4OEMzMywgMHg4QzMzLAorICAgIDB4MDNENiwgMHg4MTM5LCAweDhDMzQsIDB4OEMzNCwgMHgxMjlELCAweDgxMzksIDB4OEMzNSwgMHg4QzM1LCAweDEzMTQsCisgICAgMHg4MTM5LCAweDhDMzYsIDB4OEMzNiwgMHgxMzBGLCAweDgxMzksIDB4OEMzNywgMHg4QzM3LCAweDA4MkIsIDB4ODEzOSwKKyAgICAweDhDMzgsIDB4OEMzOCwgMHgxMzk5LCAweDgxMzksIDB4OEMzOSwgMHg4QzM5LCAweDA1OTcsIDB4ODEzOSwgMHg4RDMwLAorICAgIDB4OEQzMCwgMHgwOUVGLCAweDgxMzksIDB4OEQzMSwgMHg4RDMxLCAweDEyRkMsIDB4ODEzOSwgMHg4RDMyLCAweDhEMzIsCisgICAgMHgxMjY2LCAweDgxMzksIDB4OEQzMywgMHg4RDMzLCAweDEyODQsIDB4ODEzOSwgMHg4RDM0LCAweDhEMzQsIDB4MkExQSwKKyAgICAweDgxMzksIDB4OEQzNSwgMHg4RDM1LCAweDBENDUsIDB4ODEzOSwgMHg4RDM2LCAweDhEMzYsIDB4MDQ3RSwgMHg4MTM5LAorICAgIDB4OEQzNywgMHg4RDM3LCAweDEzNTIsIDB4ODEzOSwgMHg4RDM4LCAweDhEMzgsIDB4MDRDQywgMHg4MTM5LCAweDhEMzksCisgICAgMHg4RDM5LCAweDEzOUMsIDB4ODEzOSwgMHg4RTMwLCAweDhFMzAsIDB4MTBCQiwgMHg4MTM5LCAweDhFMzEsIDB4OEUzMSwKKyAgICAweDA5NjcsIDB4ODEzOSwgMHg4RTMyLCAweDhFMzIsIDB4MTU5MywgMHg4MTM5LCAweDhFMzMsIDB4OEUzMywgMHgwRTcyLAorICAgIDB4ODEzOSwgMHg4RTM0LCAweDhFMzQsIDB4MEQ1NiwgMHg4MTM5LCAweDhFMzUsIDB4OEUzNSwgMHgxNjFDLCAweDgxMzksCisgICAgMHg4RTM2LCAweDhFMzYsIDB4MkQyRCwgMHg4MTM5LCAweDhFMzcsIDB4OEUzNywgMHgwRjEzLCAweDgxMzksIDB4OEUzOCwKKyAgICAweDhFMzgsIDB4MDU3NiwgMHg4MTM5LCAweDhFMzksIDB4OEUzOSwgMHgwQjZGLCAweDgxMzksIDB4OEYzMCwgMHg4RjMwLAorICAgIDB4MTIzMCwgMHg4MTM5LCAweDhGMzEsIDB4OEYzMSwgMHgxNzJFLCAweDgxMzksIDB4OEYzMiwgMHg4RjMyLCAweDA1NkEsCisgICAgMHg4MTM5LCAweDhGMzMsIDB4OEYzMywgMHgwRjZDLCAweDgxMzksIDB4OEYzNCwgMHg4RjM0LCAweDE0QjYsIDB4ODEzOSwKKyAgICAweDhGMzUsIDB4OEYzNSwgMHgwRDQzLCAweDgxMzksIDB4OEYzNiwgMHg4RjM2LCAweDE3NzQsIDB4ODEzOSwgMHg4RjM3LAorICAgIDB4OEYzNywgMHgwQ0Y2LCAweDgxMzksIDB4OEYzOCwgMHg4RjM4LCAweDE4MTUsIDB4ODEzOSwgMHg4RjM5LCAweDhGMzksCisgICAgMHgwNkZELCAweDgxMzksIDB4OTAzMCwgMHg5MDMwLCAweDA4MkQsIDB4ODEzOSwgMHg5MDMxLCAweDkwMzEsIDB4MDhCRSwKKyAgICAweDgxMzksIDB4OTAzMiwgMHg5MDMyLCAweDA2QzQsIDB4ODEzOSwgMHg5MDMzLCAweDkwMzMsIDB4MTgxMywgMHg4MTM5LAorICAgIDB4OTAzNCwgMHg5MDM0LCAweDA3M0MsIDB4ODEzOSwgMHg5MDM1LCAweDkwMzUsIDB4MTM5OCwgMHg4MTM5LCAweDkwMzYsCisgICAgMHg5MDM2LCAweDE0QUQsIDB4ODEzOSwgMHg5MDM3LCAweDkwMzcsIDB4MTRGNiwgMHg4MTM5LCAweDkwMzgsIDB4OTAzOCwKKyAgICAweDA3MDYsIDB4ODEzOSwgMHg5MDM5LCAweDkwMzksIDB4MTc2MiwgMHg4MTM5LCAweDkxMzAsIDB4OTEzMCwgMHgxNUVFLAorICAgIDB4ODEzOSwgMHg5MTMxLCAweDkxMzEsIDB4MTVFMCwgMHg4MTM5LCAweDkxMzIsIDB4OTEzMiwgMHgwRjhGLCAweDgxMzksCisgICAgMHg5MTMzLCAweDkxMzMsIDB4MDZFNSwgMHg4MTM5LCAweDkxMzQsIDB4OTEzNCwgMHgzMjkyLCAweDgxMzksIDB4OTEzNSwKKyAgICAweDkxMzUsIDB4MEQ2RCwgMHg4MTM5LCAweDkxMzYsIDB4OTEzNiwgMHgxMUE2LCAweDgxMzksIDB4OTEzNywgMHg5MTM3LAorICAgIDB4MTkwOSwgMHg4MTM5LCAweDkxMzgsIDB4OTEzOCwgMHgwRUQzLCAweDgxMzksIDB4OTEzOSwgMHg5MTM5LCAweDA1RjYsCisgICAgMHg4MTM5LCAweDkyMzAsIDB4OTIzMCwgMHgwOEMwLCAweDgxMzksIDB4OTIzMSwgMHg5MjMxLCAweDA2NUEsIDB4ODEzOSwKKyAgICAweDkyMzIsIDB4OTIzMiwgMHgwRUVELCAweDgxMzksIDB4OTIzMywgMHg5MjMzLCAweDBDQjAsIDB4ODEzOSwgMHg5MjM0LAorICAgIDB4OTIzNCwgMHgxMEZFLCAweDgxMzksIDB4OTIzNSwgMHg5MjM1LCAweDExMDUsIDB4ODEzOSwgMHg5MjM2LCAweDkyMzYsCisgICAgMHgwQjIxLCAweDgxMzksIDB4OTIzNywgMHg5MjM3LCAweDBDMzQsIDB4ODEzOSwgMHg5MjM4LCAweDkyMzgsIDB4MTFCOCwKKyAgICAweDgxMzksIDB4OTIzOSwgMHg5MjM5LCAweDA1NzgsIDB4ODEzOSwgMHg5MzMwLCAweDkzMzAsIDB4MTlCRCwgMHg4MTM5LAorICAgIDB4OTMzMSwgMHg5MzMxLCAweDBFRjIsIDB4ODEzOSwgMHg5MzMyLCAweDkzMzIsIDB4MDQzMSwgMHg4MTM5LCAweDkzMzMsCisgICAgMHg5MzMzLCAweDBBQjAsIDB4ODEzOSwgMHg5MzM0LCAweDkzMzQsIDB4MEQ2NiwgMHg4MTM5LCAweDkzMzUsIDB4OTMzNSwKKyAgICAweDBDMTcsIDB4ODEzOSwgMHg5MzM2LCAweDkzMzYsIDB4MERBMywgMHg4MTM5LCAweDkzMzcsIDB4OTMzNywgMHgwODA1LAorICAgIDB4ODEzOSwgMHg5MzM4LCAweDkzMzgsIDB4MTIwMywgMHg4MTM5LCAweDkzMzksIDB4OTMzOSwgMHgwNkIzLCAweDgxMzksCisgICAgMHg5NDMwLCAweDk0MzAsIDB4MTI2OSwgMHg4MTM5LCAweDk0MzEsIDB4OTQzMSwgMHgxNjlELCAweDgxMzksIDB4OTQzMiwKKyAgICAweDk0MzIsIDB4MEJDQiwgMHg4MTM5LCAweDk0MzMsIDB4OTQzMywgMHgwRkU5LCAweDgxMzksIDB4OTQzNCwgMHg5NDM0LAorICAgIDB4MEI2NCwgMHg4MTM5LCAweDk0MzUsIDB4OTQzNSwgMHgwQzg5LCAweDgxMzksIDB4OTQzNiwgMHg5NDM2LCAweDBGQzksCisgICAgMHg4MTM5LCAweDk0MzcsIDB4OTQzNywgMHgxMEQ2LCAweDgxMzksIDB4OTQzOCwgMHg5NDM4LCAweDA3MjgsIDB4ODEzOSwKKyAgICAweDk0MzksIDB4OTQzOSwgMHgwRTkwLCAweDgxMzksIDB4OTUzMCwgMHg5NTMwLCAweDA2QzUsIDB4ODEzOSwgMHg5NTMxLAorICAgIDB4OTUzMSwgMHgwRDMzLCAweDgxMzksIDB4OTUzMiwgMHg5NTMyLCAweDEwQTgsIDB4ODEzOSwgMHg5NTMzLCAweDk1MzMsCisgICAgMHgwRTQyLCAweDgxMzksIDB4OTUzNCwgMHg5NTM0LCAweDFCQzYsIDB4ODEzOSwgMHg5NTM1LCAweDk1MzUsIDB4MUI2MCwKKyAgICAweDgxMzksIDB4OTUzNiwgMHg5NTM2LCAweDNFQkYsIDB4ODEzOSwgMHg5NTM3LCAweDk1MzcsIDB4MDNFMiwgMHg4MTM5LAorICAgIDB4OTUzOCwgMHg5NTM4LCAweDBCQzMsIDB4ODEzOSwgMHg5NTM5LCAweDk1MzksIDB4MEFGOCwgMHg4MTM5LCAweDk2MzAsCisgICAgMHg5NjMwLCAweDBCMjIsIDB4ODEzOSwgMHg5NjMxLCAweDk2MzEsIDB4MEFCMSwgMHg4MTM5LCAweDk2MzIsIDB4OTYzMiwKKyAgICAweDBENEYsIDB4ODEzOSwgMHg5NjMzLCAweDk2MzMsIDB4MEQ0NiwgMHg4MTM5LCAweDk2MzQsIDB4OTYzNCwgMHgwRDU1LAorICAgIDB4ODEzOSwgMHg5NjM1LCAweDk2MzUsIDB4NDBDQiwgMHg4MTM5LCAweDk2MzYsIDB4OTYzNiwgMHgwNzgzLCAweDgxMzksCisgICAgMHg5NjM3LCAweDk2MzcsIDB4MEZEMSwgMHg4MTM5LCAweDk2MzgsIDB4OTYzOCwgMHgwOUVCLCAweDgxMzksIDB4OTYzOSwKKyAgICAweDk2MzksIDB4MTFGMCwgMHg4MTM5LCAweDk3MzAsIDB4OTczMCwgMHgwQURDLCAweDgxMzksIDB4OTczMSwgMHg5NzMxLAorICAgIDB4MUNFNywgMHg4MTM5LCAweDk3MzIsIDB4OTczMiwgMHgxQzVFLCAweDgxMzksIDB4OTczMywgMHg5NzMzLCAweDBFQTksCisgICAgMHg4MTM5LCAweDk3MzQsIDB4OTczNCwgMHgxMDFCLCAweDgxMzksIDB4OTczNSwgMHg5NzM1LCAweDEwRDUsIDB4ODEzOSwKKyAgICAweDk3MzYsIDB4OTczNiwgMHgwOUJBLCAweDgxMzksIDB4OTczNywgMHg5NzM3LCAweDA2MzcsIDB4ODEzOSwgMHg5NzM4LAorICAgIDB4OTczOCwgMHgxQkNCLCAweDgxMzksIDB4OTczOSwgMHg5NzM5LCAweDA2MzksIDB4ODEzOSwgMHg5ODMwLCAweDk4MzAsCisgICAgMHgxQTFFLCAweDgxMzksIDB4OTgzMSwgMHg5ODMxLCAweDBDQkQsIDB4ODEzOSwgMHg5ODMyLCAweDk4MzIsIDB4MDRFMSwKKyAgICAweDgxMzksIDB4OTgzMywgMHg5ODMzLCAweDEyMzEsIDB4ODEzOSwgMHg5ODM0LCAweDk4MzQsIDB4MTFDMCwgMHg4MTM5LAorICAgIDB4OTgzNSwgMHg5ODM1LCAweDA4RjksIDB4ODEzOSwgMHg5ODM2LCAweDk4MzYsIDB4MEQxOSwgMHg4MTM5LCAweDk4MzcsCisgICAgMHg5ODM3LCAweDE2MTgsIDB4ODEzOSwgMHg5ODM4LCAweDk4MzgsIDB4MTFEQSwgMHg4MTM5LCAweDk4MzksIDB4OTgzOSwKKyAgICAweDFDREMsIDB4ODEzOSwgMHg5OTMwLCAweDk5MzAsIDB4MENFNCwgMHg4MTM5LCAweDk5MzEsIDB4OTkzMSwgMHg0NUEyLAorICAgIDB4ODEzOSwgMHg5OTMyLCAweDk5MzIsIDB4MUJGMCwgMHg4MTM5LCAweDk5MzMsIDB4OTkzMywgMHgwNTBCLCAweDgxMzksCisgICAgMHg5OTM0LCAweDk5MzQsIDB4MEZEMywgMHg4MTM5LCAweDk5MzUsIDB4OTkzNSwgMHgwRjlCLCAweDgxMzksIDB4OTkzNiwKKyAgICAweDk5MzYsIDB4MTA0OSwgMHg4MTM5LCAweDk5MzcsIDB4OTkzNywgMHg0OURDLCAweDgxMzksIDB4OTkzOCwgMHg5OTM4LAorICAgIDB4MUY5NiwgMHg4MTM5LCAweDk5MzksIDB4OTkzOSwgMHgwODk4LCAweDgxMzksIDB4OUEzMCwgMHg5QTMwLCAweDBGRkQsCisgICAgMHg4MTM5LCAweDlBMzEsIDB4OUEzMSwgMHgwNzIxLCAweDgxMzksIDB4OUEzMiwgMHg5QTMyLCAweDA1RjgsIDB4ODEzOSwKKyAgICAweDlBMzMsIDB4OUEzMywgMHgxRDE1LCAweDgxMzksIDB4OUEzNCwgMHg5QTM0LCAweDFENTAsIDB4ODEzOSwgMHg5QTM1LAorICAgIDB4OUEzNSwgMHgxRTNCLCAweDgxMzksIDB4OUEzNiwgMHg5QTM2LCAweDA1MDUsIDB4ODEzOSwgMHg5QTM3LCAweDlBMzcsCisgICAgMHgxMjNDLCAweDgxMzksIDB4OUEzOCwgMHg5QTM4LCAweDEyNDAsIDB4ODEzOSwgMHg5QTM5LCAweDlBMzksIDB4MEQyNiwKKyAgICAweDgxMzksIDB4OUIzMCwgMHg5QjMwLCAweDFFN0IsIDB4ODEzOSwgMHg5QjMxLCAweDlCMzEsIDB4MEY4QywgMHg4MTM5LAorICAgIDB4OUIzMiwgMHg5QjMyLCAweDA0RTIsIDB4ODEzOSwgMHg5QjMzLCAweDlCMzMsIDB4NEQxMywgMHg4MTM5LCAweDlCMzQsCisgICAgMHg5QjM0LCAweDEwNUYsIDB4ODEzOSwgMHg5QjM1LCAweDlCMzUsIDB4MTBCNCwgMHg4MTM5LCAweDlCMzYsIDB4OUIzNiwKKyAgICAweDRFMTgsIDB4ODEzOSwgMHg5QjM3LCAweDlCMzcsIDB4MDlEQSwgMHg4MTM5LCAweDlCMzgsIDB4OUIzOCwgMHgwOEMxLAorICAgIDB4ODEzOSwgMHg5QjM5LCAweDlCMzksIDB4MUU3NSwgMHg4MTM5LCAweDlDMzAsIDB4OUMzMCwgMHgyMDdELCAweDgxMzksCisgICAgMHg5QzMxLCAweDlDMzEsIDB4MDZCMiwgMHg4MTM5LCAweDlDMzIsIDB4OUMzMiwgMHgwOUVFLCAweDgxMzksIDB4OUMzMywKKyAgICAweDlDMzMsIDB4MUQ3OSwgMHg4MTM5LCAweDlDMzQsIDB4OUMzNCwgMHgxMENGLCAweDgxMzksIDB4OUMzNSwgMHg5QzM1LAorICAgIDB4NTBFQSwgMHg4MTM5LCAweDlDMzYsIDB4OUMzNiwgMHgwNjY0LCAweDgxMzksIDB4OUMzNywgMHg5QzM3LCAweDBBRUIsCisgICAgMHg4MTM5LCAweDlDMzgsIDB4OUMzOCwgMHgwNkVBLCAweDgxMzksIDB4OUMzOSwgMHg5QzM5LCAweDIxOEQsIDB4ODEzOSwKKyAgICAweDlEMzAsIDB4OUQzMCwgMHgwOEYxLCAweDgxMzksIDB4OUQzMSwgMHg5RDMxLCAweDEwN0IsIDB4ODEzOSwgMHg5RDMyLAorICAgIDB4OUQzMiwgMHgyMjA5LCAweDgxMzksIDB4OUQzMywgMHg5RDMzLCAweDFGMDAsIDB4ODEzOSwgMHg5RDM0LCAweDlEMzQsCisgICAgMHgxRUY0LCAweDgxMzksIDB4OUQzNSwgMHg5RDM1LCAweDBENEEsIDB4ODEzOSwgMHg5RDM2LCAweDlEMzYsIDB4MEQ2RSwKKyAgICAweDgxMzksIDB4OUQzNywgMHg5RDM3LCAweDBGNTAsIDB4ODEzOSwgMHg5RDM4LCAweDlEMzgsIDB4MjA2RCwgMHg4MTM5LAorICAgIDB4OUQzOSwgMHg5RDM5LCAweDA3MjAsIDB4ODEzOSwgMHg5RTMwLCAweDlFMzAsIDB4MDZEQSwgMHg4MTM5LCAweDlFMzEsCisgICAgMHg5RTMxLCAweDFERUMsIDB4ODEzOSwgMHg5RTMyLCAweDlFMzIsIDB4MUVEMCwgMHg4MTM5LCAweDlFMzMsIDB4OUUzMywKKyAgICAweDEzOUIsIDB4ODEzOSwgMHg5RTM0LCAweDlFMzQsIDB4MTI2MCwgMHg4MTM5LCAweDlFMzUsIDB4OUUzNSwgMHgwNzQ2LAorICAgIDB4ODEzOSwgMHg5RTM2LCAweDlFMzYsIDB4MjIzOSwgMHg4MTM5LCAweDlFMzcsIDB4OUUzNywgMHgyMDlDLCAweDgxMzksCisgICAgMHg5RTM4LCAweDlFMzgsIDB4MjY4OCwgMHg4MTM5LCAweDlFMzksIDB4OUUzOSwgMHgwQTYwLCAweDgxMzksIDB4OUYzMCwKKyAgICAweDlGMzAsIDB4MjA3MSwgMHg4MTM5LCAweDlGMzEsIDB4OUYzMSwgMHgwQTkwLCAweDgxMzksIDB4OUYzMiwgMHg5RjMyLAorICAgIDB4NTU4NiwgMHg4MTM5LCAweDlGMzMsIDB4OUYzMywgMHgwRDg5LCAweDgxMzksIDB4OUYzNCwgMHg5RjM0LCAweDA3OTEsCisgICAgMHg4MTM5LCAweDlGMzUsIDB4OUYzNSwgMHgxQTU1LCAweDgxMzksIDB4OUYzNiwgMHg5RjM2LCAweDI2MTgsIDB4ODEzOSwKKyAgICAweDlGMzcsIDB4OUYzNywgMHgwNUU1LCAweDgxMzksIDB4OUYzOCwgMHg5RjM4LCAweDA3MUQsIDB4ODEzOSwgMHg5RjM5LAorICAgIDB4OUYzOSwgMHgwRDhBLCAweDgxMzksIDB4QTAzMCwgMHhBMDMwLCAweDA0MzAsIDB4ODEzOSwgMHhBMDMxLCAweEEwMzEsCisgICAgMHgyMEM2LCAweDgxMzksIDB4QTAzMiwgMHhBMDMyLCAweDFFODYsIDB4ODEzOSwgMHhBMDMzLCAweEEwMzMsIDB4MjAzNywKKyAgICAweDgxMzksIDB4QTAzNCwgMHhBMDM0LCAweDFGMzQsIDB4ODEzOSwgMHhBMDM1LCAweEEwMzUsIDB4MTJGMywgMHg4MTM5LAorICAgIDB4QTUzMywgMHhBNTM1LCAweDU3N0IsIDB4ODEzOSwgMHhBNTM4LCAweEE1MzksIDB4NTc3RSwgMHg4MTM5LCAweEE2MzAsCisgICAgMHhBNjMwLCAweDU3ODAsIDB4ODEzOSwgMHhBNjM0LCAweEE2MzQsIDB4NTc1NSwgMHg4MTM5LCAweEE2MzYsIDB4QTYzNiwKKyAgICAweDU3NjcsIDB4ODEzOSwgMHhBNzM1LCAweEE3MzUsIDB4NTc3NiwgMHg4MTM5LCAweEE3MzYsIDB4QTczNiwgMHg1Nzc4LAorICAgIDB4ODEzOSwgMHhBNzM3LCAweEE3MzcsIDB4NTc3NywgMHg4MTM5LCAweEE3MzgsIDB4QTczOCwgMHg1Nzc5LCAweDgxMzksCisgICAgMHhBODM2LCAweEE4MzgsIDB4NTc4MSwgMHg4MTM5LCAweEI0MzQsIDB4QjQzOSwgMHg1Nzg0LCAweDgxMzksIDB4QjUzMCwKKyAgICAweEI1MzksIDB4NTc4QSwgMHg4MTM5LCAweEI2MzAsIDB4QjYzNywgMHg1Nzk0LCAweDgxMzksIDB4RUUzOSwgMHhFRTM5LAorICAgIDB4NTgwMSwgMHg4MTM5LCAweEVGMzAsIDB4RUYzOSwgMHg1ODAyLCAweDgxMzksIDB4RjAzMCwgMHhGMDM5LCAweDU4MEMsCisgICAgMHg4MTM5LCAweEYxMzAsIDB4RjEzOSwgMHg1ODE2LCAweDgxMzksIDB4RjIzMCwgMHhGMjM5LCAweDU4MjAsIDB4ODEzOSwKKyAgICAweEYzMzAsIDB4RjMzOSwgMHg1ODJBLCAweDgxMzksIDB4RjQzMCwgMHhGNDM5LCAweDU4MzQsIDB4ODEzOSwgMHhGNTMwLAorICAgIDB4RjUzOSwgMHg1ODNFLCAweDgxMzksIDB4RjYzMCwgMHhGNjM5LCAweDU4NDgsIDB4ODEzOSwgMHhGNzMwLCAweEY3MzksCisgICAgMHg1ODUyLCAweDgxMzksIDB4RjgzMCwgMHhGODM5LCAweDU4NUMsIDB4ODEzOSwgMHhGOTMwLCAweEY5MzksIDB4NTg2NiwKKyAgICAweDgxMzksIDB4RkEzMCwgMHhGQTM5LCAweDU4NzAsIDB4ODEzOSwgMHhGQjMwLCAweEZCMzksIDB4NTg3QSwgMHg4MTM5LAorICAgIDB4RkMzMCwgMHhGQzM5LCAweDU4ODQsIDB4ODEzOSwgMHhGRDMwLCAweEZEMzksIDB4NTg4RSwgMHg4MTM5LCAweEZFMzAsCisgICAgMHhGRTM5LCAweDU4OTgsIDB4ODIzMCwgMHg4MTMwLCAweDgxMzksIDB4NThBMiwgMHg4MjMwLCAweDgyMzAsIDB4ODIzOSwKKyAgICAweDU4QUMsIDB4ODIzMCwgMHg4MzMwLCAweDgzMzksIDB4NThCNiwgMHg4MjMwLCAweDg0MzAsIDB4ODQzOSwgMHg1OEMwLAorICAgIDB4ODIzMCwgMHg4NTMwLCAweDg1MzksIDB4NThDQSwgMHg4MjMwLCAweDg2MzAsIDB4ODYzOSwgMHg1OEQ0LCAweDgyMzAsCisgICAgMHg4NzMwLCAweDg3MzksIDB4NThERSwgMHg4MjMwLCAweDg4MzAsIDB4ODgzOSwgMHg1OEU4LCAweDgyMzAsIDB4ODkzMCwKKyAgICAweDg5MzksIDB4NThGMiwgMHg4MjMwLCAweDhBMzAsIDB4OEEzOSwgMHg1OEZDLCAweDgyMzAsIDB4OEIzMCwgMHg4QjM5LAorICAgIDB4NTkwNiwgMHg4MjMwLCAweDhDMzAsIDB4OEMzOSwgMHg1OTEwLCAweDgyMzAsIDB4OEQzMCwgMHg4RDM5LCAweDU5MUEsCisgICAgMHg4MjMwLCAweDhFMzAsIDB4OEUzOSwgMHg1OTI0LCAweDgyMzAsIDB4OEYzMCwgMHg4RjM5LCAweDU5MkUsIDB4ODIzMCwKKyAgICAweDkwMzAsIDB4OTAzOSwgMHg1OTM4LCAweDgyMzAsIDB4OTEzMCwgMHg5MTM5LCAweDU5NDIsIDB4ODIzMCwgMHg5MjMwLAorICAgIDB4OTIzOSwgMHg1OTRDLCAweDgyMzAsIDB4OTMzMCwgMHg5MzM5LCAweDU5NTYsIDB4ODIzMCwgMHg5NDMwLCAweDk0MzksCisgICAgMHg1OTYwLCAweDgyMzAsIDB4OTUzMCwgMHg5NTM5LCAweDU5NkEsIDB4ODIzMCwgMHg5NjMwLCAweDk2MzksIDB4NTk3NCwKKyAgICAweDgyMzAsIDB4OTczMCwgMHg5NzM5LCAweDU5N0UsIDB4ODIzMCwgMHg5ODMwLCAweDk4MzksIDB4NTk4OCwgMHg4MjMwLAorICAgIDB4OTkzMCwgMHg5OTM5LCAweDU5OTIsIDB4ODIzMCwgMHg5QTMwLCAweDlBMzksIDB4NTk5QywgMHg4MjMwLCAweDlCMzAsCisgICAgMHg5QjM5LCAweDU5QTYsIDB4ODIzMCwgMHg5QzMwLCAweDlDMzksIDB4NTlCMCwgMHg4MjMwLCAweDlEMzAsIDB4OUQzOSwKKyAgICAweDU5QkEsIDB4ODIzMCwgMHg5RTMwLCAweDlFMzksIDB4NTlDNCwgMHg4MjMwLCAweDlGMzAsIDB4OUYzOSwgMHg1OUNFLAorICAgIDB4ODIzMCwgMHhBMDMwLCAweEEwMzksIDB4NTlEOCwgMHg4MjMwLCAweEExMzAsIDB4QTEzOSwgMHg1OUUyLCAweDgyMzAsCisgICAgMHhBMjMwLCAweEEyMzksIDB4NTlFQywgMHg4MjMwLCAweEEzMzAsIDB4QTMzOSwgMHg1OUY2LCAweDgyMzAsIDB4QTQzMCwKKyAgICAweEE0MzksIDB4NUEwMCwgMHg4MjMwLCAweEE1MzAsIDB4QTUzOSwgMHg1QTBBLCAweDgyMzAsIDB4QTYzMCwgMHhBNjM5LAorICAgIDB4NUExNCwgMHg4MjMwLCAweEE3MzAsIDB4QTczOSwgMHg1QTFFLCAweDgyMzAsIDB4QTgzMCwgMHhBODM5LCAweDVBMjgsCisgICAgMHg4MjMwLCAweEE5MzAsIDB4QTkzOSwgMHg1QTMyLCAweDgyMzAsIDB4QUEzMCwgMHhBQTM5LCAweDVBM0MsIDB4ODIzMCwKKyAgICAweEFCMzAsIDB4QUIzOSwgMHg1QTQ2LCAweDgyMzAsIDB4QUMzMCwgMHhBQzM5LCAweDVBNTAsIDB4ODIzMCwgMHhBRDMwLAorICAgIDB4QUQzOSwgMHg1QTVBLCAweDgyMzAsIDB4QUUzMCwgMHhBRTM5LCAweDVBNjQsIDB4ODIzMCwgMHhBRjMwLCAweEFGMzksCisgICAgMHg1QTZFLCAweDgyMzAsIDB4QjAzMCwgMHhCMDM5LCAweDVBNzgsIDB4ODIzMCwgMHhCMTMwLCAweEIxMzksIDB4NUE4MiwKKyAgICAweDgyMzAsIDB4QjIzMCwgMHhCMjM5LCAweDVBOEMsIDB4ODIzMCwgMHhCMzMwLCAweEIzMzksIDB4NUE5NiwgMHg4MjMwLAorICAgIDB4QjQzMCwgMHhCNDM5LCAweDVBQTAsIDB4ODIzMCwgMHhCNTMwLCAweEI1MzksIDB4NUFBQSwgMHg4MjMwLCAweEI2MzAsCisgICAgMHhCNjM5LCAweDVBQjQsIDB4ODIzMCwgMHhCNzMwLCAweEI3MzksIDB4NUFCRSwgMHg4MjMwLCAweEI4MzAsIDB4QjgzOSwKKyAgICAweDVBQzgsIDB4ODIzMCwgMHhCOTMwLCAweEI5MzksIDB4NUFEMiwgMHg4MjMwLCAweEJBMzAsIDB4QkEzOSwgMHg1QURDLAorICAgIDB4ODIzMCwgMHhCQjMwLCAweEJCMzksIDB4NUFFNiwgMHg4MjMwLCAweEJDMzAsIDB4QkMzOSwgMHg1QUYwLCAweDgyMzAsCisgICAgMHhCRDMwLCAweEJEMzksIDB4NUFGQSwgMHg4MjMwLCAweEJFMzAsIDB4QkUzOSwgMHg1QjA0LCAweDgyMzAsIDB4QkYzMCwKKyAgICAweEJGMzksIDB4NUIwRSwgMHg4MjMwLCAweEMwMzAsIDB4QzAzOSwgMHg1QjE4LCAweDgyMzAsIDB4QzEzMCwgMHhDMTM5LAorICAgIDB4NUIyMiwgMHg4MjMwLCAweEMyMzAsIDB4QzIzOSwgMHg1QjJDLCAweDgyMzAsIDB4QzMzMCwgMHhDMzM5LCAweDVCMzYsCisgICAgMHg4MjMwLCAweEM0MzAsIDB4QzQzOSwgMHg1QjQwLCAweDgyMzAsIDB4QzUzMCwgMHhDNTM5LCAweDVCNEEsIDB4ODIzMCwKKyAgICAweEM2MzAsIDB4QzYzOSwgMHg1QjU0LCAweDgyMzAsIDB4QzczMCwgMHhDNzM5LCAweDVCNUUsIDB4ODIzMCwgMHhDODMwLAorICAgIDB4QzgzOSwgMHg1QjY4LCAweDgyMzAsIDB4QzkzMCwgMHhDOTM5LCAweDVCNzIsIDB4ODIzMCwgMHhDQTMwLCAweENBMzksCisgICAgMHg1QjdDLCAweDgyMzAsIDB4Q0IzMCwgMHhDQjM5LCAweDVCODYsIDB4ODIzMCwgMHhDQzMwLCAweENDMzksIDB4NUI5MCwKKyAgICAweDgyMzAsIDB4Q0QzMCwgMHhDRDM5LCAweDVCOUEsIDB4ODIzMCwgMHhDRTMwLCAweENFMzksIDB4NUJBNCwgMHg4MjMwLAorICAgIDB4Q0YzMCwgMHhDRjM5LCAweDVCQUUsIDB4ODIzMCwgMHhEMDMwLCAweEQwMzksIDB4NUJCOCwgMHg4MjMwLCAweEQxMzAsCisgICAgMHhEMTM5LCAweDVCQzIsIDB4ODIzMCwgMHhEMjMwLCAweEQyMzksIDB4NUJDQywgMHg4MjMwLCAweEQzMzAsIDB4RDMzOSwKKyAgICAweDVCRDYsIDB4ODIzMCwgMHhENDMwLCAweEQ0MzksIDB4NUJFMCwgMHg4MjMwLCAweEQ1MzAsIDB4RDUzOSwgMHg1QkVBLAorICAgIDB4ODIzMCwgMHhENjMwLCAweEQ2MzksIDB4NUJGNCwgMHg4MjMwLCAweEQ3MzAsIDB4RDczOSwgMHg1QkZFLCAweDgyMzAsCisgICAgMHhEODMwLCAweEQ4MzksIDB4NUMwOCwgMHg4MjMwLCAweEQ5MzAsIDB4RDkzOSwgMHg1QzEyLCAweDgyMzAsIDB4REEzMCwKKyAgICAweERBMzksIDB4NUMxQywgMHg4MjMwLCAweERCMzAsIDB4REIzOSwgMHg1QzI2LCAweDgyMzAsIDB4REMzMCwgMHhEQzM5LAorICAgIDB4NUMzMCwgMHg4MjMwLCAweEREMzAsIDB4REQzOSwgMHg1QzNBLCAweDgyMzAsIDB4REUzMCwgMHhERTM5LCAweDVDNDQsCisgICAgMHg4MjMwLCAweERGMzAsIDB4REYzOSwgMHg1QzRFLCAweDgyMzAsIDB4RTAzMCwgMHhFMDM5LCAweDVDNTgsIDB4ODIzMCwKKyAgICAweEUxMzAsIDB4RTEzOSwgMHg1QzYyLCAweDgyMzAsIDB4RTIzMCwgMHhFMjM5LCAweDVDNkMsIDB4ODIzMCwgMHhFMzMwLAorICAgIDB4RTMzOSwgMHg1Qzc2LCAweDgyMzAsIDB4RTQzMCwgMHhFNDM5LCAweDVDODAsIDB4ODIzMCwgMHhFNTMwLCAweEU1MzksCisgICAgMHg1QzhBLCAweDgyMzAsIDB4RTYzMCwgMHhFNjM5LCAweDVDOTQsIDB4ODIzMCwgMHhFNzMwLCAweEU3MzksIDB4NUM5RSwKKyAgICAweDgyMzAsIDB4RTgzMCwgMHhFODM5LCAweDVDQTgsIDB4ODIzMCwgMHhFOTMwLCAweEU5MzksIDB4NUNCMiwgMHg4MjMwLAorICAgIDB4RUEzMCwgMHhFQTM5LCAweDVDQkMsIDB4ODIzMCwgMHhFQjMwLCAweEVCMzksIDB4NUNDNiwgMHg4MjMwLCAweEVDMzAsCisgICAgMHhFQzM5LCAweDVDRDAsIDB4ODIzMCwgMHhFRDMwLCAweEVEMzksIDB4NUNEQSwgMHg4MjMwLCAweEVFMzAsIDB4RUUzOSwKKyAgICAweDVDRTQsIDB4ODIzMCwgMHhFRjMwLCAweEVGMzksIDB4NUNFRSwgMHg4MjMwLCAweEYwMzAsIDB4RjAzOSwgMHg1Q0Y4LAorICAgIDB4ODIzMCwgMHhGMTMwLCAweEYxMzksIDB4NUQwMiwgMHg4MjMwLCAweEYyMzAsIDB4RjIzOSwgMHg1RDBDLCAweDgyMzAsCisgICAgMHhGMzMwLCAweEYzMzksIDB4NUQxNiwgMHg4MjMwLCAweEY0MzAsIDB4RjQzOSwgMHg1RDIwLCAweDgyMzAsIDB4RjUzMCwKKyAgICAweEY1MzksIDB4NUQyQSwgMHg4MjMwLCAweEY2MzAsIDB4RjYzOSwgMHg1RDM0LCAweDgyMzAsIDB4RjczMCwgMHhGNzM5LAorICAgIDB4NUQzRSwgMHg4MjMwLCAweEY4MzAsIDB4RjgzOSwgMHg1RDQ4LCAweDgyMzAsIDB4RjkzMCwgMHhGOTM5LCAweDVENTIsCisgICAgMHg4MjMwLCAweEZBMzAsIDB4RkEzOSwgMHg1RDVDLCAweDgyMzAsIDB4RkIzMCwgMHhGQjM5LCAweDVENjYsIDB4ODIzMCwKKyAgICAweEZDMzAsIDB4RkMzOSwgMHg1RDcwLCAweDgyMzAsIDB4RkQzMCwgMHhGRDM5LCAweDVEN0EsIDB4ODIzMCwgMHhGRTMwLAorICAgIDB4RkUzOSwgMHg1RDg0LCAweDgyMzEsIDB4ODEzMCwgMHg4MTM5LCAweDVEOEUsIDB4ODIzMSwgMHg4MjMwLCAweDgyMzksCisgICAgMHg1RDk4LCAweDgyMzEsIDB4ODMzMCwgMHg4MzM5LCAweDVEQTIsIDB4ODIzMSwgMHg4NDMwLCAweDg0MzksIDB4NURBQywKKyAgICAweDgyMzEsIDB4ODUzMCwgMHg4NTM5LCAweDVEQjYsIDB4ODIzMSwgMHg4NjMwLCAweDg2MzksIDB4NURDMCwgMHg4MjMxLAorICAgIDB4ODczMCwgMHg4NzM5LCAweDVEQ0EsIDB4ODIzMSwgMHg4ODMwLCAweDg4MzksIDB4NURENCwgMHg4MjMxLCAweDg5MzAsCisgICAgMHg4OTM5LCAweDVEREUsIDB4ODIzMSwgMHg4QTMwLCAweDhBMzksIDB4NURFOCwgMHg4MjMxLCAweDhCMzAsIDB4OEIzOSwKKyAgICAweDVERjIsIDB4ODIzMSwgMHg4QzMwLCAweDhDMzksIDB4NURGQywgMHg4MjMxLCAweDhEMzAsIDB4OEQzOSwgMHg1RTA2LAorICAgIDB4ODIzMSwgMHg4RTMwLCAweDhFMzksIDB4NUUxMCwgMHg4MjMxLCAweDhGMzAsIDB4OEYzOSwgMHg1RTFBLCAweDgyMzEsCisgICAgMHg5MDMwLCAweDkwMzksIDB4NUUyNCwgMHg4MjMxLCAweDkxMzAsIDB4OTEzOSwgMHg1RTJFLCAweDgyMzEsIDB4OTIzMCwKKyAgICAweDkyMzksIDB4NUUzOCwgMHg4MjMxLCAweDkzMzAsIDB4OTMzOSwgMHg1RTQyLCAweDgyMzEsIDB4OTQzMCwgMHg5NDM5LAorICAgIDB4NUU0QywgMHg4MjMxLCAweDk1MzAsIDB4OTUzOSwgMHg1RTU2LCAweDgyMzEsIDB4OTYzMCwgMHg5NjM5LCAweDVFNjAsCisgICAgMHg4MjMxLCAweDk3MzAsIDB4OTczOSwgMHg1RTZBLCAweDgyMzEsIDB4OTgzMCwgMHg5ODM5LCAweDVFNzQsIDB4ODIzMSwKKyAgICAweDk5MzAsIDB4OTkzOSwgMHg1RTdFLCAweDgyMzEsIDB4OUEzMCwgMHg5QTM5LCAweDVFODgsIDB4ODIzMSwgMHg5QjMwLAorICAgIDB4OUIzOSwgMHg1RTkyLCAweDgyMzEsIDB4OUMzMCwgMHg5QzM5LCAweDVFOUMsIDB4ODIzMSwgMHg5RDMwLCAweDlEMzksCisgICAgMHg1RUE2LCAweDgyMzEsIDB4OUUzMCwgMHg5RTM5LCAweDVFQjAsIDB4ODIzMSwgMHg5RjMwLCAweDlGMzksIDB4NUVCQSwKKyAgICAweDgyMzEsIDB4QTAzMCwgMHhBMDM5LCAweDVFQzQsIDB4ODIzMSwgMHhBMTMwLCAweEExMzksIDB4NUVDRSwgMHg4MjMxLAorICAgIDB4QTIzMCwgMHhBMjM5LCAweDVFRDgsIDB4ODIzMSwgMHhBMzMwLCAweEEzMzksIDB4NUVFMiwgMHg4MjMxLCAweEE0MzAsCisgICAgMHhBNDM5LCAweDVFRUMsIDB4ODIzMSwgMHhBNTMwLCAweEE1MzksIDB4NUVGNiwgMHg4MjMxLCAweEE2MzAsIDB4QTYzOSwKKyAgICAweDVGMDAsIDB4ODIzMSwgMHhBNzMwLCAweEE3MzksIDB4NUYwQSwgMHg4MjMxLCAweEE4MzAsIDB4QTgzOSwgMHg1RjE0LAorICAgIDB4ODIzMSwgMHhBOTMwLCAweEE5MzksIDB4NUYxRSwgMHg4MjMxLCAweEFBMzAsIDB4QUEzOSwgMHg1RjI4LCAweDgyMzEsCisgICAgMHhBQjMwLCAweEFCMzksIDB4NUYzMiwgMHg4MjMxLCAweEFDMzAsIDB4QUMzOSwgMHg1RjNDLCAweDgyMzEsIDB4QUQzMCwKKyAgICAweEFEMzksIDB4NUY0NiwgMHg4MjMxLCAweEFFMzAsIDB4QUUzOSwgMHg1RjUwLCAweDgyMzEsIDB4QUYzMCwgMHhBRjM5LAorICAgIDB4NUY1QSwgMHg4MjMxLCAweEIwMzAsIDB4QjAzOSwgMHg1RjY0LCAweDgyMzEsIDB4QjEzMCwgMHhCMTM5LCAweDVGNkUsCisgICAgMHg4MjMxLCAweEIyMzAsIDB4QjIzOSwgMHg1Rjc4LCAweDgyMzEsIDB4QjMzMCwgMHhCMzM5LCAweDVGODIsIDB4ODIzMSwKKyAgICAweEI0MzAsIDB4QjQzOSwgMHg1RjhDLCAweDgyMzEsIDB4QjUzMCwgMHhCNTM5LCAweDVGOTYsIDB4ODIzMSwgMHhCNjMwLAorICAgIDB4QjYzOSwgMHg1RkEwLCAweDgyMzEsIDB4QjczMCwgMHhCNzM5LCAweDVGQUEsIDB4ODIzMSwgMHhCODMwLCAweEI4MzksCisgICAgMHg1RkI0LCAweDgyMzEsIDB4QjkzMCwgMHhCOTM5LCAweDVGQkUsIDB4ODIzMSwgMHhCQTMwLCAweEJBMzksIDB4NUZDOCwKKyAgICAweDgyMzEsIDB4QkIzMCwgMHhCQjM5LCAweDVGRDIsIDB4ODIzMSwgMHhCQzMwLCAweEJDMzksIDB4NUZEQywgMHg4MjMxLAorICAgIDB4QkQzMCwgMHhCRDM5LCAweDVGRTYsIDB4ODIzMSwgMHhCRTMwLCAweEJFMzksIDB4NUZGMCwgMHg4MjMxLCAweEJGMzAsCisgICAgMHhCRjM5LCAweDVGRkEsIDB4ODIzMSwgMHhDMDMwLCAweEMwMzksIDB4NjAwNCwgMHg4MjMxLCAweEMxMzAsIDB4QzEzOSwKKyAgICAweDYwMEUsIDB4ODIzMSwgMHhDMjMwLCAweEMyMzksIDB4NjAxOCwgMHg4MjMxLCAweEMzMzAsIDB4QzMzOSwgMHg2MDIyLAorICAgIDB4ODIzMSwgMHhDNDMwLCAweEM0MzksIDB4NjAyQywgMHg4MjMxLCAweEM1MzAsIDB4QzUzOSwgMHg2MDM2LCAweDgyMzEsCisgICAgMHhDNjMwLCAweEM2MzksIDB4NjA0MCwgMHg4MjMxLCAweEM3MzAsIDB4QzczOSwgMHg2MDRBLCAweDgyMzEsIDB4QzgzMCwKKyAgICAweEM4MzksIDB4NjA1NCwgMHg4MjMxLCAweEM5MzAsIDB4QzkzOSwgMHg2MDVFLCAweDgyMzEsIDB4Q0EzMCwgMHhDQTM5LAorICAgIDB4NjA2OCwgMHg4MjMxLCAweENCMzAsIDB4Q0IzOSwgMHg2MDcyLCAweDgyMzEsIDB4Q0MzMCwgMHhDQzM5LCAweDYwN0MsCisgICAgMHg4MjMxLCAweENEMzAsIDB4Q0QzOSwgMHg2MDg2LCAweDgyMzEsIDB4Q0UzMCwgMHhDRTM5LCAweDYwOTAsIDB4ODIzMSwKKyAgICAweENGMzAsIDB4Q0YzOSwgMHg2MDlBLCAweDgyMzEsIDB4RDAzMCwgMHhEMDM5LCAweDYwQTQsIDB4ODIzMSwgMHhEMTMwLAorICAgIDB4RDEzOSwgMHg2MEFFLCAweDgyMzEsIDB4RDIzMCwgMHhEMjM5LCAweDYwQjgsIDB4ODIzMSwgMHhEMzMwLCAweEQzMzksCisgICAgMHg2MEMyLCAweDgyMzEsIDB4RDQzMCwgMHhENDM5LCAweDYwQ0MsIDB4ODIzMSwgMHhENTMwLCAweEQ1MzksIDB4NjBENiwKKyAgICAweDgyMzEsIDB4RDYzMCwgMHhENjM5LCAweDYwRTAsIDB4ODIzMSwgMHhENzMwLCAweEQ3MzksIDB4NjBFQSwgMHg4MjMxLAorICAgIDB4RDgzMCwgMHhEODM5LCAweDYwRjQsIDB4ODIzMSwgMHhEOTMwLCAweEQ5MzksIDB4NjBGRSwgMHg4MjMxLCAweERBMzAsCisgICAgMHhEQTM5LCAweDYxMDgsIDB4ODIzMSwgMHhEQjMwLCAweERCMzksIDB4NjExMiwgMHg4MjMxLCAweERDMzAsIDB4REMzOSwKKyAgICAweDYxMUMsIDB4ODIzMSwgMHhERDMwLCAweEREMzksIDB4NjEyNiwgMHg4MjMxLCAweERFMzAsIDB4REUzOSwgMHg2MTMwLAorICAgIDB4ODIzMSwgMHhERjMwLCAweERGMzksIDB4NjEzQSwgMHg4MjMxLCAweEUwMzAsIDB4RTAzOSwgMHg2MTQ0LCAweDgyMzEsCisgICAgMHhFMTMwLCAweEUxMzksIDB4NjE0RSwgMHg4MjMxLCAweEUyMzAsIDB4RTIzOSwgMHg2MTU4LCAweDgyMzEsIDB4RTMzMCwKKyAgICAweEUzMzksIDB4NjE2MiwgMHg4MjMxLCAweEU0MzAsIDB4RTQzOSwgMHg2MTZDLCAweDgyMzEsIDB4RTUzMCwgMHhFNTM5LAorICAgIDB4NjE3NiwgMHg4MjMxLCAweEU2MzAsIDB4RTYzOSwgMHg2MTgwLCAweDgyMzEsIDB4RTczMCwgMHhFNzM5LCAweDYxOEEsCisgICAgMHg4MjMxLCAweEU4MzAsIDB4RTgzOSwgMHg2MTk0LCAweDgyMzEsIDB4RTkzMCwgMHhFOTM5LCAweDYxOUUsIDB4ODIzMSwKKyAgICAweEVBMzAsIDB4RUEzOSwgMHg2MUE4LCAweDgyMzEsIDB4RUIzMCwgMHhFQjM5LCAweDYxQjIsIDB4ODIzMSwgMHhFQzMwLAorICAgIDB4RUMzOSwgMHg2MUJDLCAweDgyMzEsIDB4RUQzMCwgMHhFRDM5LCAweDYxQzYsIDB4ODIzMSwgMHhFRTMwLCAweEVFMzksCisgICAgMHg2MUQwLCAweDgyMzEsIDB4RUYzMCwgMHhFRjM5LCAweDYxREEsIDB4ODIzMSwgMHhGMDMwLCAweEYwMzksIDB4NjFFNCwKKyAgICAweDgyMzEsIDB4RjEzMCwgMHhGMTM5LCAweDYxRUUsIDB4ODIzMSwgMHhGMjMwLCAweEYyMzksIDB4NjFGOCwgMHg4MjMxLAorICAgIDB4RjMzMCwgMHhGMzM5LCAweDYyMDIsIDB4ODIzMSwgMHhGNDMwLCAweEY0MzksIDB4NjIwQywgMHg4MjMxLCAweEY1MzAsCisgICAgMHhGNTM5LCAweDYyMTYsIDB4ODIzMSwgMHhGNjMwLCAweEY2MzksIDB4NjIyMCwgMHg4MjMxLCAweEY3MzAsIDB4RjczOSwKKyAgICAweDYyMkEsIDB4ODIzMSwgMHhGODMwLCAweEY4MzksIDB4NjIzNCwgMHg4MjMxLCAweEY5MzAsIDB4RjkzOSwgMHg2MjNFLAorICAgIDB4ODIzMSwgMHhGQTMwLCAweEZBMzksIDB4NjI0OCwgMHg4MjMxLCAweEZCMzAsIDB4RkIzOSwgMHg2MjUyLCAweDgyMzEsCisgICAgMHhGQzMwLCAweEZDMzksIDB4NjI1QywgMHg4MjMxLCAweEZEMzAsIDB4RkQzOSwgMHg2MjY2LCAweDgyMzEsIDB4RkUzMCwKKyAgICAweEZFMzksIDB4NjI3MCwgMHg4MjMyLCAweDgxMzAsIDB4ODEzOSwgMHg2MjdBLCAweDgyMzIsIDB4ODIzMCwgMHg4MjM5LAorICAgIDB4NjI4NCwgMHg4MjMyLCAweDgzMzAsIDB4ODMzOSwgMHg2MjhFLCAweDgyMzIsIDB4ODQzMCwgMHg4NDM5LCAweDYyOTgsCisgICAgMHg4MjMyLCAweDg1MzAsIDB4ODUzOSwgMHg2MkEyLCAweDgyMzIsIDB4ODYzMCwgMHg4NjM5LCAweDYyQUMsIDB4ODIzMiwKKyAgICAweDg3MzAsIDB4ODczOSwgMHg2MkI2LCAweDgyMzIsIDB4ODgzMCwgMHg4ODM5LCAweDYyQzAsIDB4ODIzMiwgMHg4OTMwLAorICAgIDB4ODkzOSwgMHg2MkNBLCAweDgyMzIsIDB4OEEzMCwgMHg4QTM5LCAweDYyRDQsIDB4ODIzMiwgMHg4QjMwLCAweDhCMzksCisgICAgMHg2MkRFLCAweDgyMzIsIDB4OEMzMCwgMHg4QzM5LCAweDYyRTgsIDB4ODIzMiwgMHg4RDMwLCAweDhEMzksIDB4NjJGMiwKKyAgICAweDgyMzIsIDB4OEUzMCwgMHg4RTM5LCAweDYyRkMsIDB4ODIzMiwgMHg4RjMwLCAweDhGMzksIDB4NjMwNiwgMHg4MjMyLAorICAgIDB4OTAzMCwgMHg5MDM5LCAweDYzMTAsIDB4ODIzMiwgMHg5MTMwLCAweDkxMzksIDB4NjMxQSwgMHg4MjMyLCAweDkyMzAsCisgICAgMHg5MjM5LCAweDYzMjQsIDB4ODIzMiwgMHg5MzMwLCAweDkzMzksIDB4NjMyRSwgMHg4MjMyLCAweDk0MzAsIDB4OTQzOSwKKyAgICAweDYzMzgsIDB4ODIzMiwgMHg5NTMwLCAweDk1MzksIDB4NjM0MiwgMHg4MjMyLCAweDk2MzAsIDB4OTYzOSwgMHg2MzRDLAorICAgIDB4ODIzMiwgMHg5NzMwLCAweDk3MzksIDB4NjM1NiwgMHg4MjMyLCAweDk4MzAsIDB4OTgzOSwgMHg2MzYwLCAweDgyMzIsCisgICAgMHg5OTMwLCAweDk5MzksIDB4NjM2QSwgMHg4MjMyLCAweDlBMzAsIDB4OUEzOSwgMHg2Mzc0LCAweDgyMzIsIDB4OUIzMCwKKyAgICAweDlCMzksIDB4NjM3RSwgMHg4MjMyLCAweDlDMzAsIDB4OUMzOSwgMHg2Mzg4LCAweDgyMzIsIDB4OUQzMCwgMHg5RDM5LAorICAgIDB4NjM5MiwgMHg4MjMyLCAweDlFMzAsIDB4OUUzOSwgMHg2MzlDLCAweDgyMzIsIDB4OUYzMCwgMHg5RjM5LCAweDYzQTYsCisgICAgMHg4MjMyLCAweEEwMzAsIDB4QTAzOSwgMHg2M0IwLCAweDgyMzIsIDB4QTEzMCwgMHhBMTM5LCAweDYzQkEsIDB4ODIzMiwKKyAgICAweEEyMzAsIDB4QTIzOSwgMHg2M0M0LCAweDgyMzIsIDB4QTMzMCwgMHhBMzM5LCAweDYzQ0UsIDB4ODIzMiwgMHhBNDMwLAorICAgIDB4QTQzOSwgMHg2M0Q4LCAweDgyMzIsIDB4QTUzMCwgMHhBNTM5LCAweDYzRTIsIDB4ODIzMiwgMHhBNjMwLCAweEE2MzksCisgICAgMHg2M0VDLCAweDgyMzIsIDB4QTczMCwgMHhBNzM5LCAweDYzRjYsIDB4ODIzMiwgMHhBODMwLCAweEE4MzksIDB4NjQwMCwKKyAgICAweDgyMzIsIDB4QTkzMCwgMHhBOTM5LCAweDY0MEEsIDB4ODIzMiwgMHhBQTMwLCAweEFBMzksIDB4NjQxNCwgMHg4MjMyLAorICAgIDB4QUIzMCwgMHhBQjM5LCAweDY0MUUsIDB4ODIzMiwgMHhBQzMwLCAweEFDMzksIDB4NjQyOCwgMHg4MjMyLCAweEFEMzAsCisgICAgMHhBRDM5LCAweDY0MzIsIDB4ODIzMiwgMHhBRTMwLCAweEFFMzksIDB4NjQzQywgMHg4MjMyLCAweEFGMzAsIDB4QUYzOSwKKyAgICAweDY0NDYsIDB4ODIzMiwgMHhCMDMwLCAweEIwMzksIDB4NjQ1MCwgMHg4MjMyLCAweEIxMzAsIDB4QjEzOSwgMHg2NDVBLAorICAgIDB4ODIzMiwgMHhCMjMwLCAweEIyMzksIDB4NjQ2NCwgMHg4MjMyLCAweEIzMzAsIDB4QjMzOSwgMHg2NDZFLCAweDgyMzIsCisgICAgMHhCNDMwLCAweEI0MzksIDB4NjQ3OCwgMHg4MjMyLCAweEI1MzAsIDB4QjUzOSwgMHg2NDgyLCAweDgyMzIsIDB4QjYzMCwKKyAgICAweEI2MzksIDB4NjQ4QywgMHg4MjMyLCAweEI3MzAsIDB4QjczOSwgMHg2NDk2LCAweDgyMzIsIDB4QjgzMCwgMHhCODM5LAorICAgIDB4NjRBMCwgMHg4MjMyLCAweEI5MzAsIDB4QjkzOSwgMHg2NEFBLCAweDgyMzIsIDB4QkEzMCwgMHhCQTM5LCAweDY0QjQsCisgICAgMHg4MjMyLCAweEJCMzAsIDB4QkIzOSwgMHg2NEJFLCAweDgyMzIsIDB4QkMzMCwgMHhCQzM5LCAweDY0QzgsIDB4ODIzMiwKKyAgICAweEJEMzAsIDB4QkQzOSwgMHg2NEQyLCAweDgyMzIsIDB4QkUzMCwgMHhCRTM5LCAweDY0REMsIDB4ODIzMiwgMHhCRjMwLAorICAgIDB4QkYzOSwgMHg2NEU2LCAweDgyMzIsIDB4QzAzMCwgMHhDMDM5LCAweDY0RjAsIDB4ODIzMiwgMHhDMTMwLCAweEMxMzksCisgICAgMHg2NEZBLCAweDgyMzIsIDB4QzIzMCwgMHhDMjM5LCAweDY1MDQsIDB4ODIzMiwgMHhDMzMwLCAweEMzMzksIDB4NjUwRSwKKyAgICAweDgyMzIsIDB4QzQzMCwgMHhDNDM5LCAweDY1MTgsIDB4ODIzMiwgMHhDNTMwLCAweEM1MzksIDB4NjUyMiwgMHg4MjMyLAorICAgIDB4QzYzMCwgMHhDNjM5LCAweDY1MkMsIDB4ODIzMiwgMHhDNzMwLCAweEM3MzksIDB4NjUzNiwgMHg4MjMyLCAweEM4MzAsCisgICAgMHhDODM5LCAweDY1NDAsIDB4ODIzMiwgMHhDOTMwLCAweEM5MzksIDB4NjU0QSwgMHg4MjMyLCAweENBMzAsIDB4Q0EzOSwKKyAgICAweDY1NTQsIDB4ODIzMiwgMHhDQjMwLCAweENCMzksIDB4NjU1RSwgMHg4MjMyLCAweENDMzAsIDB4Q0MzOSwgMHg2NTY4LAorICAgIDB4ODIzMiwgMHhDRDMwLCAweENEMzksIDB4NjU3MiwgMHg4MjMyLCAweENFMzAsIDB4Q0UzOSwgMHg2NTdDLCAweDgyMzIsCisgICAgMHhDRjMwLCAweENGMzksIDB4NjU4NiwgMHg4MjMyLCAweEQwMzAsIDB4RDAzOSwgMHg2NTkwLCAweDgyMzIsIDB4RDEzMCwKKyAgICAweEQxMzksIDB4NjU5QSwgMHg4MjMyLCAweEQyMzAsIDB4RDIzOSwgMHg2NUE0LCAweDgyMzIsIDB4RDMzMCwgMHhEMzM5LAorICAgIDB4NjVBRSwgMHg4MjMyLCAweEQ0MzAsIDB4RDQzOSwgMHg2NUI4LCAweDgyMzIsIDB4RDUzMCwgMHhENTM5LCAweDY1QzIsCisgICAgMHg4MjMyLCAweEQ2MzAsIDB4RDYzOSwgMHg2NUNDLCAweDgyMzIsIDB4RDczMCwgMHhENzM5LCAweDY1RDYsIDB4ODIzMiwKKyAgICAweEQ4MzAsIDB4RDgzOSwgMHg2NUUwLCAweDgyMzIsIDB4RDkzMCwgMHhEOTM5LCAweDY1RUEsIDB4ODIzMiwgMHhEQTMwLAorICAgIDB4REEzOSwgMHg2NUY0LCAweDgyMzIsIDB4REIzMCwgMHhEQjM5LCAweDY1RkUsIDB4ODIzMiwgMHhEQzMwLCAweERDMzksCisgICAgMHg2NjA4LCAweDgyMzIsIDB4REQzMCwgMHhERDM5LCAweDY2MTIsIDB4ODIzMiwgMHhERTMwLCAweERFMzksIDB4NjYxQywKKyAgICAweDgyMzIsIDB4REYzMCwgMHhERjM5LCAweDY2MjYsIDB4ODIzMiwgMHhFMDMwLCAweEUwMzksIDB4NjYzMCwgMHg4MjMyLAorICAgIDB4RTEzMCwgMHhFMTM5LCAweDY2M0EsIDB4ODIzMiwgMHhFMjMwLCAweEUyMzksIDB4NjY0NCwgMHg4MjMyLCAweEUzMzAsCisgICAgMHhFMzM5LCAweDY2NEUsIDB4ODIzMiwgMHhFNDMwLCAweEU0MzksIDB4NjY1OCwgMHg4MjMyLCAweEU1MzAsIDB4RTUzOSwKKyAgICAweDY2NjIsIDB4ODIzMiwgMHhFNjMwLCAweEU2MzksIDB4NjY2QywgMHg4MjMyLCAweEU3MzAsIDB4RTczOSwgMHg2Njc2LAorICAgIDB4ODIzMiwgMHhFODMwLCAweEU4MzksIDB4NjY4MCwgMHg4MjMyLCAweEU5MzAsIDB4RTkzOSwgMHg2NjhBLCAweDgyMzIsCisgICAgMHhFQTMwLCAweEVBMzksIDB4NjY5NCwgMHg4MjMyLCAweEVCMzAsIDB4RUIzOSwgMHg2NjlFLCAweDgyMzIsIDB4RUMzMCwKKyAgICAweEVDMzksIDB4NjZBOCwgMHg4MjMyLCAweEVEMzAsIDB4RUQzOSwgMHg2NkIyLCAweDgyMzIsIDB4RUUzMCwgMHhFRTM5LAorICAgIDB4NjZCQywgMHg4MjMyLCAweEVGMzAsIDB4RUYzOSwgMHg2NkM2LCAweDgyMzIsIDB4RjAzMCwgMHhGMDM5LCAweDY2RDAsCisgICAgMHg4MjMyLCAweEYxMzAsIDB4RjEzOSwgMHg2NkRBLCAweDgyMzIsIDB4RjIzMCwgMHhGMjM5LCAweDY2RTQsIDB4ODIzMiwKKyAgICAweEYzMzAsIDB4RjMzOSwgMHg2NkVFLCAweDgyMzIsIDB4RjQzMCwgMHhGNDM5LCAweDY2RjgsIDB4ODIzMiwgMHhGNTMwLAorICAgIDB4RjUzOSwgMHg2NzAyLCAweDgyMzIsIDB4RjYzMCwgMHhGNjM5LCAweDY3MEMsIDB4ODIzMiwgMHhGNzMwLCAweEY3MzksCisgICAgMHg2NzE2LCAweDgyMzIsIDB4RjgzMCwgMHhGODM5LCAweDY3MjAsIDB4ODIzMiwgMHhGOTMwLCAweEY5MzksIDB4NjcyQSwKKyAgICAweDgyMzIsIDB4RkEzMCwgMHhGQTM5LCAweDY3MzQsIDB4ODIzMiwgMHhGQjMwLCAweEZCMzksIDB4NjczRSwgMHg4MjMyLAorICAgIDB4RkMzMCwgMHhGQzM5LCAweDY3NDgsIDB4ODIzMiwgMHhGRDMwLCAweEZEMzksIDB4Njc1MiwgMHg4MjMyLCAweEZFMzAsCisgICAgMHhGRTM5LCAweDY3NUMsIDB4ODIzMywgMHg4MTMwLCAweDgxMzksIDB4Njc2NiwgMHg4MjMzLCAweDgyMzAsIDB4ODIzOSwKKyAgICAweDY3NzAsIDB4ODIzMywgMHg4MzMwLCAweDgzMzksIDB4Njc3QSwgMHg4MjMzLCAweDg0MzAsIDB4ODQzOSwgMHg2Nzg0LAorICAgIDB4ODIzMywgMHg4NTMwLCAweDg1MzksIDB4Njc4RSwgMHg4MjMzLCAweDg2MzAsIDB4ODYzOSwgMHg2Nzk4LCAweDgyMzMsCisgICAgMHg4NzMwLCAweDg3MzksIDB4NjdBMiwgMHg4MjMzLCAweDg4MzAsIDB4ODgzOSwgMHg2N0FDLCAweDgyMzMsIDB4ODkzMCwKKyAgICAweDg5MzksIDB4NjdCNiwgMHg4MjMzLCAweDhBMzAsIDB4OEEzOSwgMHg2N0MwLCAweDgyMzMsIDB4OEIzMCwgMHg4QjM5LAorICAgIDB4NjdDQSwgMHg4MjMzLCAweDhDMzAsIDB4OEMzOSwgMHg2N0Q0LCAweDgyMzMsIDB4OEQzMCwgMHg4RDM5LCAweDY3REUsCisgICAgMHg4MjMzLCAweDhFMzAsIDB4OEUzOSwgMHg2N0U4LCAweDgyMzMsIDB4OEYzMCwgMHg4RjM5LCAweDY3RjIsIDB4ODIzMywKKyAgICAweDkwMzAsIDB4OTAzOSwgMHg2N0ZDLCAweDgyMzMsIDB4OTEzMCwgMHg5MTM5LCAweDY4MDYsIDB4ODIzMywgMHg5MjMwLAorICAgIDB4OTIzOSwgMHg2ODEwLCAweDgyMzMsIDB4OTMzMCwgMHg5MzM5LCAweDY4MUEsIDB4ODIzMywgMHg5NDMwLCAweDk0MzksCisgICAgMHg2ODI0LCAweDgyMzMsIDB4OTUzMCwgMHg5NTM5LCAweDY4MkUsIDB4ODIzMywgMHg5NjMwLCAweDk2MzksIDB4NjgzOCwKKyAgICAweDgyMzMsIDB4OTczMCwgMHg5NzM5LCAweDY4NDIsIDB4ODIzMywgMHg5ODMwLCAweDk4MzksIDB4Njg0QywgMHg4MjMzLAorICAgIDB4OTkzMCwgMHg5OTM5LCAweDY4NTYsIDB4ODIzMywgMHg5QTMwLCAweDlBMzksIDB4Njg2MCwgMHg4MjMzLCAweDlCMzAsCisgICAgMHg5QjM5LCAweDY4NkEsIDB4ODIzMywgMHg5QzMwLCAweDlDMzksIDB4Njg3NCwgMHg4MjMzLCAweDlEMzAsIDB4OUQzOSwKKyAgICAweDY4N0UsIDB4ODIzMywgMHg5RTMwLCAweDlFMzksIDB4Njg4OCwgMHg4MjMzLCAweDlGMzAsIDB4OUYzOSwgMHg2ODkyLAorICAgIDB4ODIzMywgMHhBMDMwLCAweEEwMzksIDB4Njg5QywgMHg4MjMzLCAweEExMzAsIDB4QTEzOSwgMHg2OEE2LCAweDgyMzMsCisgICAgMHhBMjMwLCAweEEyMzksIDB4NjhCMCwgMHg4MjMzLCAweEEzMzAsIDB4QTMzOSwgMHg2OEJBLCAweDgyMzMsIDB4QTQzMCwKKyAgICAweEE0MzksIDB4NjhDNCwgMHg4MjMzLCAweEE1MzAsIDB4QTUzOSwgMHg2OENFLCAweDgyMzMsIDB4QTYzMCwgMHhBNjM5LAorICAgIDB4NjhEOCwgMHg4MjMzLCAweEE3MzAsIDB4QTczOSwgMHg2OEUyLCAweDgyMzMsIDB4QTgzMCwgMHhBODM5LCAweDY4RUMsCisgICAgMHg4MjMzLCAweEE5MzAsIDB4QTkzOSwgMHg2OEY2LCAweDgyMzMsIDB4QUEzMCwgMHhBQTM5LCAweDY5MDAsIDB4ODIzMywKKyAgICAweEFCMzAsIDB4QUIzOSwgMHg2OTBBLCAweDgyMzMsIDB4QUMzMCwgMHhBQzM5LCAweDY5MTQsIDB4ODIzMywgMHhBRDMwLAorICAgIDB4QUQzOSwgMHg2OTFFLCAweDgyMzMsIDB4QUUzMCwgMHhBRTM5LCAweDY5MjgsIDB4ODIzMywgMHhBRjMwLCAweEFGMzksCisgICAgMHg2OTMyLCAweDgyMzMsIDB4QjAzMCwgMHhCMDM5LCAweDY5M0MsIDB4ODIzMywgMHhCMTMwLCAweEIxMzksIDB4Njk0NiwKKyAgICAweDgyMzMsIDB4QjIzMCwgMHhCMjM5LCAweDY5NTAsIDB4ODIzMywgMHhCMzMwLCAweEIzMzksIDB4Njk1QSwgMHg4MjMzLAorICAgIDB4QjQzMCwgMHhCNDM5LCAweDY5NjQsIDB4ODIzMywgMHhCNTMwLCAweEI1MzksIDB4Njk2RSwgMHg4MjMzLCAweEI2MzAsCisgICAgMHhCNjM5LCAweDY5NzgsIDB4ODIzMywgMHhCNzMwLCAweEI3MzksIDB4Njk4MiwgMHg4MjMzLCAweEI4MzAsIDB4QjgzOSwKKyAgICAweDY5OEMsIDB4ODIzMywgMHhCOTMwLCAweEI5MzksIDB4Njk5NiwgMHg4MjMzLCAweEJBMzAsIDB4QkEzOSwgMHg2OUEwLAorICAgIDB4ODIzMywgMHhCQjMwLCAweEJCMzksIDB4NjlBQSwgMHg4MjMzLCAweEJDMzAsIDB4QkMzOSwgMHg2OUI0LCAweDgyMzMsCisgICAgMHhCRDMwLCAweEJEMzksIDB4NjlCRSwgMHg4MjMzLCAweEJFMzAsIDB4QkUzOSwgMHg2OUM4LCAweDgyMzMsIDB4QkYzMCwKKyAgICAweEJGMzksIDB4NjlEMiwgMHg4MjMzLCAweEMwMzAsIDB4QzAzOSwgMHg2OURDLCAweDgyMzMsIDB4QzEzMCwgMHhDMTM5LAorICAgIDB4NjlFNiwgMHg4MjMzLCAweEMyMzAsIDB4QzIzOSwgMHg2OUYwLCAweDgyMzMsIDB4QzMzMCwgMHhDMzM5LCAweDY5RkEsCisgICAgMHg4MjMzLCAweEM0MzAsIDB4QzQzOSwgMHg2QTA0LCAweDgyMzMsIDB4QzUzMCwgMHhDNTM5LCAweDZBMEUsIDB4ODIzMywKKyAgICAweEM2MzAsIDB4QzYzOSwgMHg2QTE4LCAweDgyMzMsIDB4QzczMCwgMHhDNzM5LCAweDZBMjIsIDB4ODIzMywgMHhDODMwLAorICAgIDB4QzgzOSwgMHg2QTJDLCAweDgyMzMsIDB4QzkzMCwgMHhDOTM5LCAweDZBMzYsIDB4ODIzMywgMHhDQTMwLCAweENBMzksCisgICAgMHg2QTQwLCAweDgyMzMsIDB4Q0IzMCwgMHhDQjM5LCAweDZBNEEsIDB4ODIzMywgMHhDQzMwLCAweENDMzksIDB4NkE1NCwKKyAgICAweDgyMzMsIDB4Q0QzMCwgMHhDRDM5LCAweDZBNUUsIDB4ODIzMywgMHhDRTMwLCAweENFMzksIDB4NkE2OCwgMHg4MjMzLAorICAgIDB4Q0YzMCwgMHhDRjM5LCAweDZBNzIsIDB4ODIzMywgMHhEMDMwLCAweEQwMzksIDB4NkE3QywgMHg4MjMzLCAweEQxMzAsCisgICAgMHhEMTM5LCAweDZBODYsIDB4ODIzMywgMHhEMjMwLCAweEQyMzksIDB4NkE5MCwgMHg4MjMzLCAweEQzMzAsIDB4RDMzOSwKKyAgICAweDZBOUEsIDB4ODIzMywgMHhENDMwLCAweEQ0MzksIDB4NkFBNCwgMHg4MjMzLCAweEQ1MzAsIDB4RDUzOSwgMHg2QUFFLAorICAgIDB4ODIzMywgMHhENjMwLCAweEQ2MzksIDB4NkFCOCwgMHg4MjMzLCAweEQ3MzAsIDB4RDczOSwgMHg2QUMyLCAweDgyMzMsCisgICAgMHhEODMwLCAweEQ4MzksIDB4NkFDQywgMHg4MjMzLCAweEQ5MzAsIDB4RDkzOSwgMHg2QUQ2LCAweDgyMzMsIDB4REEzMCwKKyAgICAweERBMzksIDB4NkFFMCwgMHg4MjMzLCAweERCMzAsIDB4REIzOSwgMHg2QUVBLCAweDgyMzMsIDB4REMzMCwgMHhEQzM5LAorICAgIDB4NkFGNCwgMHg4MjMzLCAweEREMzAsIDB4REQzOSwgMHg2QUZFLCAweDgyMzMsIDB4REUzMCwgMHhERTM5LCAweDZCMDgsCisgICAgMHg4MjMzLCAweERGMzAsIDB4REYzOSwgMHg2QjEyLCAweDgyMzMsIDB4RTAzMCwgMHhFMDM5LCAweDZCMUMsIDB4ODIzMywKKyAgICAweEUxMzAsIDB4RTEzOSwgMHg2QjI2LCAweDgyMzMsIDB4RTIzMCwgMHhFMjM5LCAweDZCMzAsIDB4ODIzMywgMHhFMzMwLAorICAgIDB4RTMzOSwgMHg2QjNBLCAweDgyMzMsIDB4RTQzMCwgMHhFNDM5LCAweDZCNDQsIDB4ODIzMywgMHhFNTMwLCAweEU1MzksCisgICAgMHg2QjRFLCAweDgyMzMsIDB4RTYzMCwgMHhFNjM5LCAweDZCNTgsIDB4ODIzMywgMHhFNzMwLCAweEU3MzksIDB4NkI2MiwKKyAgICAweDgyMzMsIDB4RTgzMCwgMHhFODM5LCAweDZCNkMsIDB4ODIzMywgMHhFOTMwLCAweEU5MzksIDB4NkI3NiwgMHg4MjMzLAorICAgIDB4RUEzMCwgMHhFQTM5LCAweDZCODAsIDB4ODIzMywgMHhFQjMwLCAweEVCMzksIDB4NkI4QSwgMHg4MjMzLCAweEVDMzAsCisgICAgMHhFQzM5LCAweDZCOTQsIDB4ODIzMywgMHhFRDMwLCAweEVEMzksIDB4NkI5RSwgMHg4MjMzLCAweEVFMzAsIDB4RUUzOSwKKyAgICAweDZCQTgsIDB4ODIzMywgMHhFRjMwLCAweEVGMzksIDB4NkJCMiwgMHg4MjMzLCAweEYwMzAsIDB4RjAzOSwgMHg2QkJDLAorICAgIDB4ODIzMywgMHhGMTMwLCAweEYxMzksIDB4NkJDNiwgMHg4MjMzLCAweEYyMzAsIDB4RjIzOSwgMHg2QkQwLCAweDgyMzMsCisgICAgMHhGMzMwLCAweEYzMzksIDB4NkJEQSwgMHg4MjMzLCAweEY0MzAsIDB4RjQzOSwgMHg2QkU0LCAweDgyMzMsIDB4RjUzMCwKKyAgICAweEY1MzksIDB4NkJFRSwgMHg4MjMzLCAweEY2MzAsIDB4RjYzOSwgMHg2QkY4LCAweDgyMzMsIDB4RjczMCwgMHhGNzM5LAorICAgIDB4NkMwMiwgMHg4MjMzLCAweEY4MzAsIDB4RjgzOSwgMHg2QzBDLCAweDgyMzMsIDB4RjkzMCwgMHhGOTM5LCAweDZDMTYsCisgICAgMHg4MjMzLCAweEZBMzAsIDB4RkEzOSwgMHg2QzIwLCAweDgyMzMsIDB4RkIzMCwgMHhGQjM5LCAweDZDMkEsIDB4ODIzMywKKyAgICAweEZDMzAsIDB4RkMzOSwgMHg2QzM0LCAweDgyMzMsIDB4RkQzMCwgMHhGRDM5LCAweDZDM0UsIDB4ODIzMywgMHhGRTMwLAorICAgIDB4RkUzOSwgMHg2QzQ4LCAweDgyMzQsIDB4ODEzMCwgMHg4MTM5LCAweDZDNTIsIDB4ODIzNCwgMHg4MjMwLCAweDgyMzksCisgICAgMHg2QzVDLCAweDgyMzQsIDB4ODMzMCwgMHg4MzM5LCAweDZDNjYsIDB4ODIzNCwgMHg4NDMwLCAweDg0MzksIDB4NkM3MCwKKyAgICAweDgyMzQsIDB4ODUzMCwgMHg4NTM5LCAweDZDN0EsIDB4ODIzNCwgMHg4NjMwLCAweDg2MzksIDB4NkM4NCwgMHg4MjM0LAorICAgIDB4ODczMCwgMHg4NzM5LCAweDZDOEUsIDB4ODIzNCwgMHg4ODMwLCAweDg4MzksIDB4NkM5OCwgMHg4MjM0LCAweDg5MzAsCisgICAgMHg4OTM5LCAweDZDQTIsIDB4ODIzNCwgMHg4QTMwLCAweDhBMzksIDB4NkNBQywgMHg4MjM0LCAweDhCMzAsIDB4OEIzOSwKKyAgICAweDZDQjYsIDB4ODIzNCwgMHg4QzMwLCAweDhDMzksIDB4NkNDMCwgMHg4MjM0LCAweDhEMzAsIDB4OEQzOSwgMHg2Q0NBLAorICAgIDB4ODIzNCwgMHg4RTMwLCAweDhFMzksIDB4NkNENCwgMHg4MjM0LCAweDhGMzAsIDB4OEYzOSwgMHg2Q0RFLCAweDgyMzQsCisgICAgMHg5MDMwLCAweDkwMzksIDB4NkNFOCwgMHg4MjM0LCAweDkxMzAsIDB4OTEzOSwgMHg2Q0YyLCAweDgyMzQsIDB4OTIzMCwKKyAgICAweDkyMzksIDB4NkNGQywgMHg4MjM0LCAweDkzMzAsIDB4OTMzOSwgMHg2RDA2LCAweDgyMzQsIDB4OTQzMCwgMHg5NDM5LAorICAgIDB4NkQxMCwgMHg4MjM0LCAweDk1MzAsIDB4OTUzOSwgMHg2RDFBLCAweDgyMzQsIDB4OTYzMCwgMHg5NjM5LCAweDZEMjQsCisgICAgMHg4MjM0LCAweDk3MzAsIDB4OTczOSwgMHg2RDJFLCAweDgyMzQsIDB4OTgzMCwgMHg5ODM5LCAweDZEMzgsIDB4ODIzNCwKKyAgICAweDk5MzAsIDB4OTkzOSwgMHg2RDQyLCAweDgyMzQsIDB4OUEzMCwgMHg5QTM5LCAweDZENEMsIDB4ODIzNCwgMHg5QjMwLAorICAgIDB4OUIzOSwgMHg2RDU2LCAweDgyMzQsIDB4OUMzMCwgMHg5QzM5LCAweDZENjAsIDB4ODIzNCwgMHg5RDMwLCAweDlEMzksCisgICAgMHg2RDZBLCAweDgyMzQsIDB4OUUzMCwgMHg5RTM5LCAweDZENzQsIDB4ODIzNCwgMHg5RjMwLCAweDlGMzksIDB4NkQ3RSwKKyAgICAweDgyMzQsIDB4QTAzMCwgMHhBMDM5LCAweDZEODgsIDB4ODIzNCwgMHhBMTMwLCAweEExMzksIDB4NkQ5MiwgMHg4MjM0LAorICAgIDB4QTIzMCwgMHhBMjM5LCAweDZEOUMsIDB4ODIzNCwgMHhBMzMwLCAweEEzMzksIDB4NkRBNiwgMHg4MjM0LCAweEE0MzAsCisgICAgMHhBNDM5LCAweDZEQjAsIDB4ODIzNCwgMHhBNTMwLCAweEE1MzksIDB4NkRCQSwgMHg4MjM0LCAweEE2MzAsIDB4QTYzOSwKKyAgICAweDZEQzQsIDB4ODIzNCwgMHhBNzMwLCAweEE3MzksIDB4NkRDRSwgMHg4MjM0LCAweEE4MzAsIDB4QTgzOSwgMHg2REQ4LAorICAgIDB4ODIzNCwgMHhBOTMwLCAweEE5MzksIDB4NkRFMiwgMHg4MjM0LCAweEFBMzAsIDB4QUEzOSwgMHg2REVDLCAweDgyMzQsCisgICAgMHhBQjMwLCAweEFCMzksIDB4NkRGNiwgMHg4MjM0LCAweEFDMzAsIDB4QUMzOSwgMHg2RTAwLCAweDgyMzQsIDB4QUQzMCwKKyAgICAweEFEMzksIDB4NkUwQSwgMHg4MjM0LCAweEFFMzAsIDB4QUUzOSwgMHg2RTE0LCAweDgyMzQsIDB4QUYzMCwgMHhBRjM5LAorICAgIDB4NkUxRSwgMHg4MjM0LCAweEIwMzAsIDB4QjAzOSwgMHg2RTI4LCAweDgyMzQsIDB4QjEzMCwgMHhCMTM5LCAweDZFMzIsCisgICAgMHg4MjM0LCAweEIyMzAsIDB4QjIzOSwgMHg2RTNDLCAweDgyMzQsIDB4QjMzMCwgMHhCMzM5LCAweDZFNDYsIDB4ODIzNCwKKyAgICAweEI0MzAsIDB4QjQzOSwgMHg2RTUwLCAweDgyMzQsIDB4QjUzMCwgMHhCNTM5LCAweDZFNUEsIDB4ODIzNCwgMHhCNjMwLAorICAgIDB4QjYzOSwgMHg2RTY0LCAweDgyMzQsIDB4QjczMCwgMHhCNzM5LCAweDZFNkUsIDB4ODIzNCwgMHhCODMwLCAweEI4MzksCisgICAgMHg2RTc4LCAweDgyMzQsIDB4QjkzMCwgMHhCOTM5LCAweDZFODIsIDB4ODIzNCwgMHhCQTMwLCAweEJBMzksIDB4NkU4QywKKyAgICAweDgyMzQsIDB4QkIzMCwgMHhCQjM5LCAweDZFOTYsIDB4ODIzNCwgMHhCQzMwLCAweEJDMzksIDB4NkVBMCwgMHg4MjM0LAorICAgIDB4QkQzMCwgMHhCRDM5LCAweDZFQUEsIDB4ODIzNCwgMHhCRTMwLCAweEJFMzksIDB4NkVCNCwgMHg4MjM0LCAweEJGMzAsCisgICAgMHhCRjM5LCAweDZFQkUsIDB4ODIzNCwgMHhDMDMwLCAweEMwMzksIDB4NkVDOCwgMHg4MjM0LCAweEMxMzAsIDB4QzEzOSwKKyAgICAweDZFRDIsIDB4ODIzNCwgMHhDMjMwLCAweEMyMzksIDB4NkVEQywgMHg4MjM0LCAweEMzMzAsIDB4QzMzOSwgMHg2RUU2LAorICAgIDB4ODIzNCwgMHhDNDMwLCAweEM0MzksIDB4NkVGMCwgMHg4MjM0LCAweEM1MzAsIDB4QzUzOSwgMHg2RUZBLCAweDgyMzQsCisgICAgMHhDNjMwLCAweEM2MzksIDB4NkYwNCwgMHg4MjM0LCAweEM3MzAsIDB4QzczOSwgMHg2RjBFLCAweDgyMzQsIDB4QzgzMCwKKyAgICAweEM4MzksIDB4NkYxOCwgMHg4MjM0LCAweEM5MzAsIDB4QzkzOSwgMHg2RjIyLCAweDgyMzQsIDB4Q0EzMCwgMHhDQTM5LAorICAgIDB4NkYyQywgMHg4MjM0LCAweENCMzAsIDB4Q0IzOSwgMHg2RjM2LCAweDgyMzQsIDB4Q0MzMCwgMHhDQzM5LCAweDZGNDAsCisgICAgMHg4MjM0LCAweENEMzAsIDB4Q0QzOSwgMHg2RjRBLCAweDgyMzQsIDB4Q0UzMCwgMHhDRTM5LCAweDZGNTQsIDB4ODIzNCwKKyAgICAweENGMzAsIDB4Q0YzOSwgMHg2RjVFLCAweDgyMzQsIDB4RDAzMCwgMHhEMDM5LCAweDZGNjgsIDB4ODIzNCwgMHhEMTMwLAorICAgIDB4RDEzOSwgMHg2RjcyLCAweDgyMzQsIDB4RDIzMCwgMHhEMjM5LCAweDZGN0MsIDB4ODIzNCwgMHhEMzMwLCAweEQzMzksCisgICAgMHg2Rjg2LCAweDgyMzQsIDB4RDQzMCwgMHhENDM5LCAweDZGOTAsIDB4ODIzNCwgMHhENTMwLCAweEQ1MzksIDB4NkY5QSwKKyAgICAweDgyMzQsIDB4RDYzMCwgMHhENjM5LCAweDZGQTQsIDB4ODIzNCwgMHhENzMwLCAweEQ3MzksIDB4NkZBRSwgMHg4MjM0LAorICAgIDB4RDgzMCwgMHhEODM5LCAweDZGQjgsIDB4ODIzNCwgMHhEOTMwLCAweEQ5MzksIDB4NkZDMiwgMHg4MjM0LCAweERBMzAsCisgICAgMHhEQTM5LCAweDZGQ0MsIDB4ODIzNCwgMHhEQjMwLCAweERCMzksIDB4NkZENiwgMHg4MjM0LCAweERDMzAsIDB4REMzOSwKKyAgICAweDZGRTAsIDB4ODIzNCwgMHhERDMwLCAweEREMzksIDB4NkZFQSwgMHg4MjM0LCAweERFMzAsIDB4REUzOSwgMHg2RkY0LAorICAgIDB4ODIzNCwgMHhERjMwLCAweERGMzksIDB4NkZGRSwgMHg4MjM0LCAweEUwMzAsIDB4RTAzOSwgMHg3MDA4LCAweDgyMzQsCisgICAgMHhFMTMwLCAweEUxMzksIDB4NzAxMiwgMHg4MjM0LCAweEUyMzAsIDB4RTIzOSwgMHg3MDFDLCAweDgyMzQsIDB4RTMzMCwKKyAgICAweEUzMzksIDB4NzAyNiwgMHg4MjM0LCAweEU0MzAsIDB4RTQzOSwgMHg3MDMwLCAweDgyMzQsIDB4RTUzMCwgMHhFNTM5LAorICAgIDB4NzAzQSwgMHg4MjM0LCAweEU2MzAsIDB4RTYzOSwgMHg3MDQ0LCAweDgyMzQsIDB4RTczMCwgMHhFNzM5LCAweDcwNEUsCisgICAgMHg4MjM0LCAweEU4MzAsIDB4RTgzOSwgMHg3MDU4LCAweDgyMzQsIDB4RTkzMCwgMHhFOTM5LCAweDcwNjIsIDB4ODIzNCwKKyAgICAweEVBMzAsIDB4RUEzOSwgMHg3MDZDLCAweDgyMzQsIDB4RUIzMCwgMHhFQjM5LCAweDcwNzYsIDB4ODIzNCwgMHhFQzMwLAorICAgIDB4RUMzOSwgMHg3MDgwLCAweDgyMzQsIDB4RUQzMCwgMHhFRDM5LCAweDcwOEEsIDB4ODIzNCwgMHhFRTMwLCAweEVFMzksCisgICAgMHg3MDk0LCAweDgyMzQsIDB4RUYzMCwgMHhFRjM5LCAweDcwOUUsIDB4ODIzNCwgMHhGMDMwLCAweEYwMzksIDB4NzBBOCwKKyAgICAweDgyMzQsIDB4RjEzMCwgMHhGMTM5LCAweDcwQjIsIDB4ODIzNCwgMHhGMjMwLCAweEYyMzksIDB4NzBCQywgMHg4MjM0LAorICAgIDB4RjMzMCwgMHhGMzM5LCAweDcwQzYsIDB4ODIzNCwgMHhGNDMwLCAweEY0MzksIDB4NzBEMCwgMHg4MjM0LCAweEY1MzAsCisgICAgMHhGNTM5LCAweDcwREEsIDB4ODIzNCwgMHhGNjMwLCAweEY2MzksIDB4NzBFNCwgMHg4MjM0LCAweEY3MzAsIDB4RjczOSwKKyAgICAweDcwRUUsIDB4ODIzNCwgMHhGODMwLCAweEY4MzksIDB4NzBGOCwgMHg4MjM0LCAweEY5MzAsIDB4RjkzOSwgMHg3MTAyLAorICAgIDB4ODIzNCwgMHhGQTMwLCAweEZBMzksIDB4NzEwQywgMHg4MjM0LCAweEZCMzAsIDB4RkIzOSwgMHg3MTE2LCAweDgyMzQsCisgICAgMHhGQzMwLCAweEZDMzksIDB4NzEyMCwgMHg4MjM0LCAweEZEMzAsIDB4RkQzOSwgMHg3MTJBLCAweDgyMzQsIDB4RkUzMCwKKyAgICAweEZFMzksIDB4NzEzNCwgMHg4MjM1LCAweDgxMzAsIDB4ODEzOSwgMHg3MTNFLCAweDgyMzUsIDB4ODIzMCwgMHg4MjM5LAorICAgIDB4NzE0OCwgMHg4MjM1LCAweDgzMzAsIDB4ODMzOSwgMHg3MTUyLCAweDgyMzUsIDB4ODQzMCwgMHg4NDM5LCAweDcxNUMsCisgICAgMHg4MjM1LCAweDg1MzAsIDB4ODUzOSwgMHg3MTY2LCAweDgyMzUsIDB4ODYzMCwgMHg4NjM5LCAweDcxNzAsIDB4ODIzNSwKKyAgICAweDg3MzAsIDB4ODczOCwgMHg3MTdBLCAweDgyMzUsIDB4OTgzMywgMHg5ODM5LCAweDcxODgsIDB4ODIzNSwgMHg5OTMwLAorICAgIDB4OTkzOSwgMHg3MThGLCAweDgyMzUsIDB4OUEzMCwgMHg5QTM5LCAweDcxOTksIDB4ODIzNSwgMHg5QjMwLCAweDlCMzksCisgICAgMHg3MUEzLCAweDgyMzUsIDB4OUMzMCwgMHg5QzM5LCAweDcxQUQsIDB4ODIzNSwgMHg5RDMwLCAweDlEMzksIDB4NzFCNywKKyAgICAweDgyMzUsIDB4OUUzMCwgMHg5RTM5LCAweDcxQzEsIDB4ODIzNSwgMHg5RjMwLCAweDlGMzksIDB4NzFDQiwgMHg4MjM1LAorICAgIDB4QTAzMCwgMHhBMDM5LCAweDcxRDUsIDB4ODIzNSwgMHhBMTMwLCAweEExMzksIDB4NzFERiwgMHg4MjM1LCAweEEyMzAsCisgICAgMHhBMjM5LCAweDcxRTksIDB4ODIzNSwgMHhBMzMwLCAweEEzMzksIDB4NzFGMywgMHg4MjM1LCAweEE0MzAsIDB4QTQzOSwKKyAgICAweDcxRkQsIDB4ODIzNSwgMHhBNTMwLCAweEE1MzksIDB4NzIwNywgMHg4MjM1LCAweEE2MzAsIDB4QTYzOSwgMHg3MjExLAorICAgIDB4ODIzNSwgMHhBNzMwLCAweEE3MzksIDB4NzIxQiwgMHg4MjM1LCAweEE4MzAsIDB4QTgzOSwgMHg3MjI1LCAweDgyMzUsCisgICAgMHhBOTMwLCAweEE5MzksIDB4NzIyRiwgMHg4MjM1LCAweEFBMzAsIDB4QUEzOSwgMHg3MjM5LCAweDgyMzUsIDB4QUIzMCwKKyAgICAweEFCMzksIDB4NzI0MywgMHg4MjM1LCAweEFDMzAsIDB4QUMzOSwgMHg3MjRELCAweDgyMzUsIDB4QUQzMCwgMHhBRDM5LAorICAgIDB4NzI1NywgMHg4MjM1LCAweEFFMzAsIDB4QUUzOSwgMHg3MjYxLCAweDgyMzUsIDB4QUYzMCwgMHhBRjM5LCAweDcyNkIsCisgICAgMHg4MjM1LCAweEIwMzAsIDB4QjAzOSwgMHg3Mjc1LCAweDgyMzUsIDB4QjEzMCwgMHhCMTM5LCAweDcyN0YsIDB4ODIzNSwKKyAgICAweEIyMzAsIDB4QjIzOSwgMHg3Mjg5LCAweDgyMzUsIDB4QjMzMCwgMHhCMzM5LCAweDcyOTMsIDB4ODIzNSwgMHhCNDMwLAorICAgIDB4QjQzOSwgMHg3MjlELCAweDgyMzUsIDB4QjUzMCwgMHhCNTM5LCAweDcyQTcsIDB4ODIzNSwgMHhCNjMwLCAweEI2MzksCisgICAgMHg3MkIxLCAweDgyMzUsIDB4QjczMCwgMHhCNzM5LCAweDcyQkIsIDB4ODIzNSwgMHhCODMwLCAweEI4MzksIDB4NzJDNSwKKyAgICAweDgyMzUsIDB4QjkzMCwgMHhCOTM5LCAweDcyQ0YsIDB4ODIzNSwgMHhCQTMwLCAweEJBMzksIDB4NzJEOSwgMHg4MjM1LAorICAgIDB4QkIzMCwgMHhCQjM5LCAweDcyRTMsIDB4ODIzNSwgMHhCQzMwLCAweEJDMzksIDB4NzJFRCwgMHg4MjM1LCAweEJEMzAsCisgICAgMHhCRDM5LCAweDcyRjcsIDB4ODIzNSwgMHhCRTMwLCAweEJFMzksIDB4NzMwMSwgMHg4MjM1LCAweEJGMzAsIDB4QkYzOSwKKyAgICAweDczMEIsIDB4ODIzNSwgMHhDMDMwLCAweEMwMzksIDB4NzMxNSwgMHg4MjM1LCAweEMxMzAsIDB4QzEzOSwgMHg3MzFGLAorICAgIDB4ODIzNSwgMHhDMjMwLCAweEMyMzksIDB4NzMyOSwgMHg4MjM1LCAweEMzMzAsIDB4QzMzOSwgMHg3MzMzLCAweDgyMzUsCisgICAgMHhDNDMwLCAweEM0MzksIDB4NzMzRCwgMHg4MjM1LCAweEM1MzAsIDB4QzUzOSwgMHg3MzQ3LCAweDgyMzUsIDB4QzYzMCwKKyAgICAweEM2MzksIDB4NzM1MSwgMHg4MjM1LCAweEM3MzAsIDB4QzczOSwgMHg3MzVCLCAweDgyMzUsIDB4QzgzMCwgMHhDODM5LAorICAgIDB4NzM2NSwgMHg4MjM1LCAweEM5MzAsIDB4QzkzOSwgMHg3MzZGLCAweDgyMzUsIDB4Q0EzMCwgMHhDQTM5LCAweDczNzksCisgICAgMHg4MjM1LCAweENCMzAsIDB4Q0IzOSwgMHg3MzgzLCAweDgyMzUsIDB4Q0MzMCwgMHhDQzM5LCAweDczOEQsIDB4ODIzNSwKKyAgICAweENEMzAsIDB4Q0QzOSwgMHg3Mzk3LCAweDgyMzUsIDB4Q0UzMCwgMHhDRTM5LCAweDczQTEsIDB4ODIzNSwgMHhDRjMwLAorICAgIDB4Q0YzOSwgMHg3M0FCLCAweDgyMzUsIDB4RDAzMCwgMHhEMDM5LCAweDczQjUsIDB4ODIzNSwgMHhEMTMwLCAweEQxMzksCisgICAgMHg3M0JGLCAweDgyMzUsIDB4RDIzMCwgMHhEMjM5LCAweDczQzksIDB4ODIzNSwgMHhEMzMwLCAweEQzMzksIDB4NzNEMywKKyAgICAweDgyMzUsIDB4RDQzMCwgMHhENDM5LCAweDczREQsIDB4ODIzNSwgMHhENTMwLCAweEQ1MzksIDB4NzNFNywgMHg4MjM1LAorICAgIDB4RDYzMCwgMHhENjM5LCAweDczRjEsIDB4ODIzNSwgMHhENzMwLCAweEQ3MzksIDB4NzNGQiwgMHg4MjM1LCAweEQ4MzAsCisgICAgMHhEODM5LCAweDc0MDUsIDB4ODIzNSwgMHhEOTMwLCAweEQ5MzksIDB4NzQwRiwgMHg4MjM1LCAweERBMzAsIDB4REEzOSwKKyAgICAweDc0MTksIDB4ODIzNSwgMHhEQjMwLCAweERCMzksIDB4NzQyMywgMHg4MjM1LCAweERDMzAsIDB4REMzOSwgMHg3NDJELAorICAgIDB4ODIzNSwgMHhERDMwLCAweEREMzksIDB4NzQzNywgMHg4MjM1LCAweERFMzAsIDB4REUzOSwgMHg3NDQxLCAweDgyMzUsCisgICAgMHhERjMwLCAweERGMzksIDB4NzQ0QiwgMHg4MjM1LCAweEUwMzAsIDB4RTAzOSwgMHg3NDU1LCAweDgyMzUsIDB4RTEzMCwKKyAgICAweEUxMzksIDB4NzQ1RiwgMHg4MjM1LCAweEUyMzAsIDB4RTIzOSwgMHg3NDY5LCAweDgyMzUsIDB4RTMzMCwgMHhFMzM5LAorICAgIDB4NzQ3MywgMHg4MjM1LCAweEU0MzAsIDB4RTQzOSwgMHg3NDdELCAweDgyMzUsIDB4RTUzMCwgMHhFNTM5LCAweDc0ODcsCisgICAgMHg4MjM1LCAweEU2MzAsIDB4RTYzOSwgMHg3NDkxLCAweDgyMzUsIDB4RTczMCwgMHhFNzM5LCAweDc0OUIsIDB4ODIzNSwKKyAgICAweEU4MzAsIDB4RTgzOSwgMHg3NEE1LCAweDgyMzUsIDB4RTkzMCwgMHhFOTM5LCAweDc0QUYsIDB4ODIzNSwgMHhFQTMwLAorICAgIDB4RUEzOSwgMHg3NEI5LCAweDgyMzUsIDB4RUIzMCwgMHhFQjM5LCAweDc0QzMsIDB4ODIzNSwgMHhFQzMwLCAweEVDMzksCisgICAgMHg3NENELCAweDgyMzUsIDB4RUQzMCwgMHhFRDM5LCAweDc0RDcsIDB4ODIzNSwgMHhFRTMwLCAweEVFMzksIDB4NzRFMSwKKyAgICAweDgyMzUsIDB4RUYzMCwgMHhFRjM5LCAweDc0RUIsIDB4ODIzNSwgMHhGMDMwLCAweEYwMzksIDB4NzRGNSwgMHg4MjM1LAorICAgIDB4RjEzMCwgMHhGMTM5LCAweDc0RkYsIDB4ODIzNSwgMHhGMjMwLCAweEYyMzksIDB4NzUwOSwgMHg4MjM1LCAweEYzMzAsCisgICAgMHhGMzM5LCAweDc1MTMsIDB4ODIzNSwgMHhGNDMwLCAweEY0MzksIDB4NzUxRCwgMHg4MjM1LCAweEY1MzAsIDB4RjUzOSwKKyAgICAweDc1MjcsIDB4ODIzNSwgMHhGNjMwLCAweEY2MzksIDB4NzUzMSwgMHg4MjM1LCAweEY3MzAsIDB4RjczOSwgMHg3NTNCLAorICAgIDB4ODIzNSwgMHhGODMwLCAweEY4MzksIDB4NzU0NSwgMHg4MjM1LCAweEY5MzAsIDB4RjkzOSwgMHg3NTRGLCAweDgyMzUsCisgICAgMHhGQTMwLCAweEZBMzksIDB4NzU1OSwgMHg4MjM1LCAweEZCMzAsIDB4RkIzOSwgMHg3NTYzLCAweDgyMzUsIDB4RkMzMCwKKyAgICAweEZDMzksIDB4NzU2RCwgMHg4MjM1LCAweEZEMzAsIDB4RkQzOSwgMHg3NTc3LCAweDgyMzUsIDB4RkUzMCwgMHhGRTM5LAorICAgIDB4NzU4MSwgMHg4MjM2LCAweDgxMzAsIDB4ODEzOSwgMHg3NThCLCAweDgyMzYsIDB4ODIzMCwgMHg4MjM5LCAweDc1OTUsCisgICAgMHg4MjM2LCAweDgzMzAsIDB4ODMzOSwgMHg3NTlGLCAweDgyMzYsIDB4ODQzMCwgMHg4NDM5LCAweDc1QTksIDB4ODIzNiwKKyAgICAweDg1MzAsIDB4ODUzOSwgMHg3NUIzLCAweDgyMzYsIDB4ODYzMCwgMHg4NjM5LCAweDc1QkQsIDB4ODIzNiwgMHg4NzMwLAorICAgIDB4ODczOSwgMHg3NUM3LCAweDgyMzYsIDB4ODgzMCwgMHg4ODM5LCAweDc1RDEsIDB4ODIzNiwgMHg4OTMwLCAweDg5MzksCisgICAgMHg3NURCLCAweDgyMzYsIDB4OEEzMCwgMHg4QTM5LCAweDc1RTUsIDB4ODIzNiwgMHg4QjMwLCAweDhCMzksIDB4NzVFRiwKKyAgICAweDgyMzYsIDB4OEMzMCwgMHg4QzM5LCAweDc1RjksIDB4ODIzNiwgMHg4RDMwLCAweDhEMzksIDB4NzYwMywgMHg4MjM2LAorICAgIDB4OEUzMCwgMHg4RTM3LCAweDc2MEQsIDB4ODIzNiwgMHg4RjMxLCAweDhGMzksIDB4NzYxNSwgMHg4MjM2LCAweDkwMzAsCisgICAgMHg5MDM5LCAweDc2MUUsIDB4ODIzNiwgMHg5MTMwLCAweDkxMzksIDB4NzYyOCwgMHg4MjM2LCAweDkyMzAsIDB4OTIzOSwKKyAgICAweDc2MzIsIDB4ODIzNiwgMHg5MzMwLCAweDkzMzksIDB4NzYzQywgMHg4MjM2LCAweDk0MzAsIDB4OTQzNSwgMHg3NjQ2LAogfTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0JLMkstVl81LmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0JLMkstVl81LmNwcAppbmRleCAyZmNkODViLi44MzNjZjJmIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL0dCSzJLLVZfNS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9HQksySy1WXzUuY3BwCkBAIC0xLDEwICsxLDEyIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCBnX0ZYQ01BUF9HQksyS19WXzVbNDEgKiAzXSA9IHsKKyNpbmNsdWRlICJjbWFwc19nYjEuaCIKKworY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9HQksyS19WXzVbNDEgKiAzXSA9IHsKICAgICAweEExQTIsIDB4QTFBMiwgMHgwMjNGLCAweEExQTMsIDB4QTFBMywgMHgwMjNFLCAweEExQUEsIDB4QTFBQSwgMHgwMjU2LAogICAgIDB4QTFBQiwgMHhBMUFDLCAweDFFMTgsIDB4QTFBRCwgMHhBMUFELCAweDAyNTcsIDB4QTFCMiwgMHhBMUJGLCAweDAyNDYsCiAgICAgMHhBMUZFLCAweEExRkUsIDB4MUUxQSwgMHhBM0ExLCAweEEzQTEsIDB4MDI0MiwgMHhBM0E4LCAweEEzQTksIDB4MDI0NCwKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0JLcC1FVUMtSF8yLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0JLcC1FVUMtSF8yLmNwcAppbmRleCAyMjZjOTUwLi5iOTA1Nzg1IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL0dCS3AtRVVDLUhfMi5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9HQktwLUVVQy1IXzIuY3BwCkBAIC0xLDEwICsxLDEyIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCBnX0ZYQ01BUF9HQktwX0VVQ19IXzJbNDA3MCAqIDNdID0geworI2luY2x1ZGUgImNtYXBzX2diMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0dCS3BfRVVDX0hfMls0MDcwICogM10gPSB7CiAgICAgMHgwMDIwLCAweDAwN0UsIDB4MDAwMSwgMHg4MTQwLCAweDgxNzgsIDB4Mjc1OCwgMHg4MTc5LCAweDgxNzksIDB4MjA1OSwKICAgICAweDgxN0EsIDB4ODE3RSwgMHgyNzkxLCAweDgxODAsIDB4ODE4NSwgMHgyNzk2LCAweDgxODYsIDB4ODE4NiwgMHgyMUYxLAogICAgIDB4ODE4NywgMHg4MUVDLCAweDI3OUMsIDB4ODFFRCwgMHg4MUVELCAweDFGRjIsIDB4ODFFRSwgMHg4MUY1LCAweDI4MDIsCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL0dCS3AtRVVDLVZfMi5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL0dCS3AtRVVDLVZfMi5jcHAKaW5kZXggOTdkOTc5OC4uNTM3NzJkYyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9HQktwLUVVQy1WXzIuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0JLcC1FVUMtVl8yLmNwcApAQCAtMSwxMCArMSwxMiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi1leHRlcm4gY29uc3QgdW5zaWduZWQgc2hvcnQgZ19GWENNQVBfR0JLcF9FVUNfVl8yWzIwICogM10gPSB7CisjaW5jbHVkZSAiY21hcHNfZ2IxLmgiCisKK2NvbnN0IEZYX1dPUkQgZ19GWENNQVBfR0JLcF9FVUNfVl8yWzIwICogM10gPSB7CiAgICAgMHhBMUEyLCAweEExQTIsIDB4MDIzRiwgMHhBMUEzLCAweEExQTMsIDB4MDIzRSwgMHhBMUFBLCAweEExQUEsIDB4MDI1NiwKICAgICAweEExQUIsIDB4QTFBQywgMHgxRTE4LCAweEExQUQsIDB4QTFBRCwgMHgwMjU3LCAweEExQjIsIDB4QTFCRiwgMHgwMjQ2LAogICAgIDB4QTFGRSwgMHhBMUZFLCAweDFFMUEsIDB4QTNBMSwgMHhBM0ExLCAweDAyNDIsIDB4QTNBOCwgMHhBM0E5LCAweDAyNDQsCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL0dCcGMtRVVDLUhfMC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL0dCcGMtRVVDLUhfMC5jcHAKaW5kZXggN2QxYzkxZi4uMmY0ZjE1YSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9HQnBjLUVVQy1IXzAuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0JwYy1FVUMtSF8wLmNwcApAQCAtMSwxMCArMSwxMiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi1leHRlcm4gY29uc3QgdW5zaWduZWQgc2hvcnQgZ19GWENNQVBfR0JwY19FVUNfSF8wWzkxICogM10gPSB7CisjaW5jbHVkZSAiY21hcHNfZ2IxLmgiCisKK2NvbnN0IEZYX1dPUkQgZ19GWENNQVBfR0JwY19FVUNfSF8wWzkxICogM10gPSB7CiAgICAgMHgwMDIwLCAweDAwN0UsIDB4MDAwMSwgMHgwMDgwLCAweDAwODAsIDB4MUUyMCwgMHgwMEZELCAweDAwRkYsIDB4MUUyMSwKICAgICAweEExQTEsIDB4QTFGRSwgMHgwMDYwLCAweEEyQjEsIDB4QTJFMiwgMHgwMEJFLCAweEEyRTUsIDB4QTJFRSwgMHgwMEYwLAogICAgIDB4QTJGMSwgMHhBMkZDLCAweDAwRkEsIDB4QTNBMSwgMHhBM0ZFLCAweDAxMDYsIDB4QTRBMSwgMHhBNEYzLCAweDAxNjQsCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL0dCcGMtRVVDLVZfMC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL0dCcGMtRVVDLVZfMC5jcHAKaW5kZXggMzI1ZWMyMi4uZmU0NGJmMiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9HQnBjLUVVQy1WXzAuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvR0JwYy1FVUMtVl8wLmNwcApAQCAtMSwxMCArMSwxMiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi1leHRlcm4gY29uc3QgdW5zaWduZWQgc2hvcnQgZ19GWENNQVBfR0JwY19FVUNfVl8wWzIwICogM10gPSB7CisjaW5jbHVkZSAiY21hcHNfZ2IxLmgiCisKK2NvbnN0IEZYX1dPUkQgZ19GWENNQVBfR0JwY19FVUNfVl8wWzIwICogM10gPSB7CiAgICAgMHhBMUEyLCAweEExQTIsIDB4MDIzRiwgMHhBMUEzLCAweEExQTMsIDB4MDIzRSwgMHhBMUFBLCAweEExQUEsIDB4MDI1NiwKICAgICAweEExQUIsIDB4QTFBQywgMHgxRTE4LCAweEExQUQsIDB4QTFBRCwgMHgwMjU3LCAweEExQjIsIDB4QTFCRiwgMHgwMjQ2LAogICAgIDB4QTFGRSwgMHhBMUZFLCAweDFFMUEsIDB4QTNBMSwgMHhBM0ExLCAweDAyNDIsIDB4QTNBOCwgMHhBM0E5LCAweDAyNDQsCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL1VuaUdCLVVDUzItSF80LmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvVW5pR0ItVUNTMi1IXzQuY3BwCmluZGV4IGQxMmU4MTUuLmM1N2UzNDYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvVW5pR0ItVUNTMi1IXzQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvVW5pR0ItVUNTMi1IXzQuY3BwCkBAIC0xLDEwICsxLDEyIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCBnX0ZYQ01BUF9VbmlHQl9VQ1MyX0hfNFsxMzgyNSAqIDNdID0geworI2luY2x1ZGUgImNtYXBzX2diMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQX1VuaUdCX1VDUzJfSF80WzEzODI1ICogM10gPSB7CiAgICAgMHgwMDIwLCAweDAwN0UsIDB4MDAwMSwgMHgwMEE0LCAweDAwQTQsIDB4MDBBNywgMHgwMEE1LCAweDAwQTUsIDB4NTc1MiwKICAgICAweDAwQTcsIDB4MDBBNywgMHgwMEFCLCAweDAwQTgsIDB4MDBBOCwgMHgwMDY2LCAweDAwQjAsIDB4MDBCMCwgMHgwMEEyLAogICAgIDB4MDBCMSwgMHgwMEIxLCAweDAwN0YsIDB4MDBENywgMHgwMEQ3LCAweDAwODAsIDB4MDBFMCwgMHgwMEUwLCAweDAyOUYsCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL1VuaUdCLVVDUzItVl80LmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvVW5pR0ItVUNTMi1WXzQuY3BwCmluZGV4IDk4OTFhNjkuLjgwZmRjOWUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvVW5pR0ItVUNTMi1WXzQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvVW5pR0ItVUNTMi1WXzQuY3BwCkBAIC0xLDEwICsxLDEyIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCBnX0ZYQ01BUF9VbmlHQl9VQ1MyX1ZfNFsyNCAqIDNdID0geworI2luY2x1ZGUgImNtYXBzX2diMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQX1VuaUdCX1VDUzJfVl80WzI0ICogM10gPSB7CiAgICAgMHgyMDE0LCAweDIwMTQsIDB4MDI1NiwgMHgyMDI2LCAweDIwMjYsIDB4MDI1NywgMHgyMjI1LCAweDIyMjUsIDB4MUUxQywKICAgICAweDMwMDEsIDB4MzAwMSwgMHgwMjNGLCAweDMwMDIsIDB4MzAwMiwgMHgwMjNFLCAweDMwMDgsIDB4MzAwRiwgMHgwMjQ4LAogICAgIDB4MzAxMCwgMHgzMDExLCAweDAyNTIsIDB4MzAxMywgMHgzMDEzLCAweDFFMUEsIDB4MzAxNCwgMHgzMDE1LCAweDAyNDYsCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL2NtYXBzX2diMS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL2NtYXBzX2diMS5jcHAKaW5kZXggYjA3MzliMS4uOTQ5ZDBhMSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0dCMS9jbWFwc19nYjEuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvY21hcHNfZ2IxLmNwcApAQCAtMSw0OCArMSw1NSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcmVzb3VyY2UuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKLSNpbmNsdWRlICIuLi8uLi9mcGRmX2ZvbnQvZm9udF9pbnQuaCIKLSNpbmNsdWRlICIuLi9jbWFwX2ludC5oIgotZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfR0JfRVVDX0hfMFtdOwotZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfR0JfRVVDX1ZfMFtdOwotZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfR0JwY19FVUNfSF8wW107Ci1leHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9HQnBjX0VVQ19WXzBbXTsKLWV4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0dCS19FVUNfSF8yW107Ci1leHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9HQktfRVVDX1ZfMltdOwotZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfR0JLcF9FVUNfSF8yW107Ci1leHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9HQktwX0VVQ19WXzJbXTsKLWV4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0dCSzJLX0hfNVtdOwotZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfR0JLMktfSF81X0RXb3JkW107Ci1leHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9HQksyS19WXzVbXTsKLWV4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX1VuaUdCX1VDUzJfSF80W107Ci1leHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9VbmlHQl9VQ1MyX1ZfNFtdOwotZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfR0IxQ0lEMlVuaWNvZGVfNVtdOworI2luY2x1ZGUgImNtYXBzX2diMS5oIgorCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3Jlc291cmNlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiICAvLyBGb3IgRlhfQXJyYXlTaXplKCkuCisjaW5jbHVkZSAiY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL2NtYXBfaW50LmgiCisjaW5jbHVkZSAiY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZm9udF9pbnQuaCIKKwogc3RhdGljIGNvbnN0IEZYQ01BUF9DTWFwIGdfRlhDTUFQX0dCMV9jbWFwc1tdID0gewotICAgIHsgIkdCLUVVQy1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9HQl9FVUNfSF8wLCA5MCwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDAgfSwKLSAgICB7ICJHQi1FVUMtViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfR0JfRVVDX1ZfMCwgMjAsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMSB9LAotICAgIHsgIkdCcGMtRVVDLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0dCcGNfRVVDX0hfMCwgOTEsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwIH0sCi0gICAgeyAiR0JwYy1FVUMtViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfR0JwY19FVUNfVl8wLCAyMCwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xIH0sCi0gICAgeyAiR0JLLUVVQy1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9HQktfRVVDX0hfMiwgNDA3MSwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDAgfSwKLSAgICB7ICJHQkstRVVDLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0dCS19FVUNfVl8yLCAyMCwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xIH0sCi0gICAgeyAiR0JLcC1FVUMtSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfR0JLcF9FVUNfSF8yLCA0MDcwLCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTIgfSwKLSAgICB7ICJHQktwLUVVQy1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9HQktwX0VVQ19WXzIsIDIwLCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTEgfSwKLSAgICB7ICJHQksySy1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9HQksyS19IXzUsIDQwNzEsIEZYQ01BUF9DTWFwOjpTaW5nbGUsIGdfRlhDTUFQX0dCSzJLX0hfNV9EV29yZCwgMTAxNywgLTQgfSwKLSAgICB7ICJHQksySy1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9HQksyS19WXzUsIDQxLCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTEgfSwKLSAgICB7ICJVbmlHQi1VQ1MyLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX1VuaUdCX1VDUzJfSF80LCAxMzgyNSwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDAgfSwKLSAgICB7ICJVbmlHQi1VQ1MyLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX1VuaUdCX1VDUzJfVl80LCAyNCwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xIH0sCi0gICAgeyAiVW5pR0ItVVRGMTYtSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfVW5pR0JfVUNTMl9IXzQsIDEzODI1LCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgMCB9LAotICAgIHsgIlVuaUdCLVVURjE2LVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX1VuaUdCX1VDUzJfVl80LCAyNCwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xIH0sCisgICAgeyJHQi1FVUMtSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfR0JfRVVDX0hfMCwgOTAsIEZYQ01BUF9DTWFwOjpOb25lLAorICAgICBOVUxMLCAwLCAwfSwKKyAgICB7IkdCLUVVQy1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9HQl9FVUNfVl8wLCAyMCwgRlhDTUFQX0NNYXA6Ok5vbmUsCisgICAgIE5VTEwsIDAsIC0xfSwKKyAgICB7IkdCcGMtRVVDLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0dCcGNfRVVDX0hfMCwgOTEsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwfSwKKyAgICB7IkdCcGMtRVVDLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0dCcGNfRVVDX1ZfMCwgMjAsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMX0sCisgICAgeyJHQkstRVVDLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0dCS19FVUNfSF8yLCA0MDcxLAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgMH0sCisgICAgeyJHQkstRVVDLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0dCS19FVUNfVl8yLCAyMCwKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xfSwKKyAgICB7IkdCS3AtRVVDLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0dCS3BfRVVDX0hfMiwgNDA3MCwKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0yfSwKKyAgICB7IkdCS3AtRVVDLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0dCS3BfRVVDX1ZfMiwgMjAsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMX0sCisgICAgeyJHQksySy1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9HQksyS19IXzUsIDQwNzEsCisgICAgIEZYQ01BUF9DTWFwOjpTaW5nbGUsIGdfRlhDTUFQX0dCSzJLX0hfNV9EV29yZCwgMTAxNywgLTR9LAorICAgIHsiR0JLMkstViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfR0JLMktfVl81LCA0MSwgRlhDTUFQX0NNYXA6Ok5vbmUsCisgICAgIE5VTEwsIDAsIC0xfSwKKyAgICB7IlVuaUdCLVVDUzItSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfVW5pR0JfVUNTMl9IXzQsIDEzODI1LAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgMH0sCisgICAgeyJVbmlHQi1VQ1MyLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX1VuaUdCX1VDUzJfVl80LCAyNCwKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xfSwKKyAgICB7IlVuaUdCLVVURjE2LUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX1VuaUdCX1VDUzJfSF80LCAxMzgyNSwKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDB9LAorICAgIHsiVW5pR0ItVVRGMTYtViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfVW5pR0JfVUNTMl9WXzQsIDI0LAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTF9LAogfTsKLXZvaWQgQ1BERl9Nb2R1bGVNZ3I6OkxvYWRFbWJlZGRlZEdCMUNNYXBzKCkKLXsKLSAgICBDUERGX0ZvbnRHbG9iYWxzKiBwRm9udEdsb2JhbHMgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+R2V0Rm9udEdsb2JhbHMoKTsKLSAgICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRDaGFyc2V0c1tDSURTRVRfR0IxXS5tX3BNYXBMaXN0ID0gZ19GWENNQVBfR0IxX2NtYXBzOwotICAgIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZENoYXJzZXRzW0NJRFNFVF9HQjFdLm1fQ291bnQgPSBzaXplb2YgZ19GWENNQVBfR0IxX2NtYXBzIC8gc2l6ZW9mIChGWENNQVBfQ01hcCk7Ci0gICAgcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkVG9Vbmljb2Rlc1tDSURTRVRfR0IxXS5tX3BNYXAgPSBnX0ZYQ01BUF9HQjFDSUQyVW5pY29kZV81OwotICAgIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbQ0lEU0VUX0dCMV0ubV9Db3VudCA9IDMwMjg0OworCit2b2lkIENQREZfTW9kdWxlTWdyOjpMb2FkRW1iZWRkZWRHQjFDTWFwcygpIHsKKyAgQ1BERl9Gb250R2xvYmFscyogcEZvbnRHbG9iYWxzID0KKyAgICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRGb250R2xvYmFscygpOworICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRDaGFyc2V0c1tDSURTRVRfR0IxXS5tX3BNYXBMaXN0ID0gZ19GWENNQVBfR0IxX2NtYXBzOworICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRDaGFyc2V0c1tDSURTRVRfR0IxXS5tX0NvdW50ID0KKyAgICAgIEZYX0FycmF5U2l6ZShnX0ZYQ01BUF9HQjFfY21hcHMpOworICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRUb1VuaWNvZGVzW0NJRFNFVF9HQjFdLm1fcE1hcCA9CisgICAgICBnX0ZYQ01BUF9HQjFDSUQyVW5pY29kZV81OworICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRUb1VuaWNvZGVzW0NJRFNFVF9HQjFdLm1fQ291bnQgPSAzMDI4NDsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9HQjEvY21hcHNfZ2IxLmggYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL2NtYXBzX2diMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYWU2OGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvR0IxL2NtYXBzX2diMS5oCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAyMDE1IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX1NSQ19GUERGQVBJX0ZQREZfQ01BUFNfR0IxX0NNQVBTX0dCMV9IXworI2RlZmluZSBDT1JFX1NSQ19GUERGQVBJX0ZQREZfQ01BUFNfR0IxX0NNQVBTX0dCMV9IXworCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oIiAgLy8gRm9yIEZYX1dPUkQuCisKK2V4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0dCX0VVQ19IXzBbXTsKK2V4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0dCX0VVQ19WXzBbXTsKK2V4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0dCcGNfRVVDX0hfMFtdOworZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfR0JwY19FVUNfVl8wW107CitleHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9HQktfRVVDX0hfMltdOworZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfR0JLX0VVQ19WXzJbXTsKK2V4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0dCS3BfRVVDX0hfMltdOworZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfR0JLcF9FVUNfVl8yW107CitleHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9HQksyS19IXzVbXTsKK2V4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0dCSzJLX0hfNV9EV29yZFtdOworZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfR0JLMktfVl81W107CitleHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9VbmlHQl9VQ1MyX0hfNFtdOworZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfVW5pR0JfVUNTMl9WXzRbXTsKK2V4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0dCMUNJRDJVbmljb2RlXzVbXTsKKworI2VuZGlmICAvLyBDT1JFX1NSQ19GUERGQVBJX0ZQREZfQ01BUFNfR0IxX0NNQVBTX0dCMV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS84M3B2LVJLU0otSF8xLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvODNwdi1SS1NKLUhfMS5jcHAKaW5kZXggNmE4ODUzNy4uNjA1ZWVjMCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS84M3B2LVJLU0otSF8xLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xLzgzcHYtUktTSi1IXzEuY3BwCkBAIC0xLDEwICsxLDEyIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCBnX0ZYQ01BUF84M3B2X1JLU0pfSF8xWzIyMiAqIDNdID0geworI2luY2x1ZGUgImNtYXBzX2phcGFuMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQXzgzcHZfUktTSl9IXzFbMjIyICogM10gPSB7CiAgICAgMHgwMDIwLCAweDAwN0UsIDB4MDAwMSwgMHgwMDgwLCAweDAwODAsIDB4MDA2MSwgMHgwMEEwLCAweDAwREYsIDB4MDE0NiwKICAgICAweDAwRkQsIDB4MDBGRCwgMHgwMDk4LCAweDAwRkUsIDB4MDBGRSwgMHgwMEU0LCAweDAwRkYsIDB4MDBGRiwgMHgwMDdDLAogICAgIDB4ODE0MCwgMHg4MTdFLCAweDAyNzksIDB4ODE4MCwgMHg4MUFDLCAweDAyQjgsIDB4ODFCOCwgMHg4MUJGLCAweDAyRTUsCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xLzkwbXMtUktTSi1IXzIuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS85MG1zLVJLU0otSF8yLmNwcAppbmRleCAxYmMzMWQ4Li4yMmQwMmI5IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xLzkwbXMtUktTSi1IXzIuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvOTBtcy1SS1NKLUhfMi5jcHAKQEAgLTEsMTAgKzEsMTIgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0IGdfRlhDTUFQXzkwbXNfUktTSl9IXzJbMTcxICogM10gPSB7CisjaW5jbHVkZSAiY21hcHNfamFwYW4xLmgiCisKK2NvbnN0IEZYX1dPUkQgZ19GWENNQVBfOTBtc19SS1NKX0hfMlsxNzEgKiAzXSA9IHsKICAgICAweDAwMjAsIDB4MDA3RCwgMHgwMEU3LCAweDAwN0UsIDB4MDA3RSwgMHgwMjc3LCAweDAwQTAsIDB4MDBERiwgMHgwMTQ2LAogICAgIDB4ODE0MCwgMHg4MTdFLCAweDAyNzksIDB4ODE4MCwgMHg4MUFDLCAweDAyQjgsIDB4ODFCOCwgMHg4MUJGLCAweDAyRTUsCiAgICAgMHg4MUM4LCAweDgxQ0UsIDB4MDJFRCwgMHg4MURBLCAweDgxRTgsIDB4MDJGNCwgMHg4MUYwLCAweDgxRjcsIDB4MDMwMywKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvOTBtcy1SS1NKLVZfMi5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xLzkwbXMtUktTSi1WXzIuY3BwCmluZGV4IGNhZjgxZWQuLjc3MTBlZGIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvOTBtcy1SS1NKLVZfMi5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS85MG1zLVJLU0otVl8yLmNwcApAQCAtMSwxMCArMSwxMiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi1leHRlcm4gY29uc3QgdW5zaWduZWQgc2hvcnQgZ19GWENNQVBfOTBtc19SS1NKX1ZfMls3OCAqIDNdID0geworI2luY2x1ZGUgImNtYXBzX2phcGFuMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQXzkwbXNfUktTSl9WXzJbNzggKiAzXSA9IHsKICAgICAweDgxNDEsIDB4ODE0MiwgMHgxRUNGLCAweDgxNDMsIDB4ODE0MywgMHgyMDRDLCAweDgxNDQsIDB4ODE0NCwgMHgyMDUyLAogICAgIDB4ODE1MCwgMHg4MTUxLCAweDFFRDEsIDB4ODE1QiwgMHg4MTVELCAweDFFRDMsIDB4ODE2MCwgMHg4MTY0LCAweDFFRDYsCiAgICAgMHg4MTY5LCAweDgxN0EsIDB4MUVEQiwgMHg4MTgxLCAweDgxODEsIDB4MUVFRCwgMHg4MUE4LCAweDgxQTgsIDB4MDJFMywKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvOTBtc3AtUktTSi1IXzIuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS85MG1zcC1SS1NKLUhfMi5jcHAKaW5kZXggMzZlY2IxNy4uMjA5OWFlZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS85MG1zcC1SS1NKLUhfMi5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS85MG1zcC1SS1NKLUhfMi5jcHAKQEAgLTEsMTAgKzEsMTIgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0IGdfRlhDTUFQXzkwbXNwX1JLU0pfSF8yWzE3MCAqIDNdID0geworI2luY2x1ZGUgImNtYXBzX2phcGFuMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQXzkwbXNwX1JLU0pfSF8yWzE3MCAqIDNdID0gewogICAgIDB4MDAyMCwgMHgwMDdFLCAweDAwMDEsIDB4MDBBMCwgMHgwMERGLCAweDAxNDYsIDB4ODE0MCwgMHg4MTdFLCAweDAyNzksCiAgICAgMHg4MTgwLCAweDgxQUMsIDB4MDJCOCwgMHg4MUI4LCAweDgxQkYsIDB4MDJFNSwgMHg4MUM4LCAweDgxQ0UsIDB4MDJFRCwKICAgICAweDgxREEsIDB4ODFFOCwgMHgwMkY0LCAweDgxRjAsIDB4ODFGNywgMHgwMzAzLCAweDgxRkMsIDB4ODFGQywgMHgwMzBCLApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS85MG1zcC1SS1NKLVZfMi5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xLzkwbXNwLVJLU0otVl8yLmNwcAppbmRleCBmNTU4YzZhLi5mYWQwZTAxIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xLzkwbXNwLVJLU0otVl8yLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xLzkwbXNwLVJLU0otVl8yLmNwcApAQCAtMSwxMCArMSwxMiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi1leHRlcm4gY29uc3QgdW5zaWduZWQgc2hvcnQgZ19GWENNQVBfOTBtc3BfUktTSl9WXzJbNzggKiAzXSA9IHsKKyNpbmNsdWRlICJjbWFwc19qYXBhbjEuaCIKKworY29uc3QgRlhfV09SRCBnX0ZYQ01BUF85MG1zcF9SS1NKX1ZfMls3OCAqIDNdID0gewogICAgIDB4ODE0MSwgMHg4MTQyLCAweDFFQ0YsIDB4ODE0MywgMHg4MTQzLCAweDIwNEMsIDB4ODE0NCwgMHg4MTQ0LCAweDIwNTIsCiAgICAgMHg4MTUwLCAweDgxNTEsIDB4MUVEMSwgMHg4MTVCLCAweDgxNUQsIDB4MUVEMywgMHg4MTYwLCAweDgxNjQsIDB4MUVENiwKICAgICAweDgxNjksIDB4ODE3QSwgMHgxRURCLCAweDgxODEsIDB4ODE4MSwgMHgxRUVELCAweDgxQTgsIDB4ODFBOCwgMHgwMkUzLApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS85MHB2LVJLU0otSF8xLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvOTBwdi1SS1NKLUhfMS5jcHAKaW5kZXggMTk1MjZiYi4uYmQ4NWU1OCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS85MHB2LVJLU0otSF8xLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xLzkwcHYtUktTSi1IXzEuY3BwCkBAIC0xLDEwICsxLDEyIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCBnX0ZYQ01BUF85MHB2X1JLU0pfSF8xWzI2MyAqIDNdID0geworI2luY2x1ZGUgImNtYXBzX2phcGFuMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQXzkwcHZfUktTSl9IXzFbMjYzICogM10gPSB7CiAgICAgMHgwMDIwLCAweDAwN0UsIDB4MDAwMSwgMHgwMDgwLCAweDAwODAsIDB4MDA2MSwgMHgwMEEwLCAweDAwREYsIDB4MDE0NiwKICAgICAweDAwRkQsIDB4MDBGRCwgMHgwMDk4LCAweDAwRkUsIDB4MDBGRSwgMHgwMEU0LCAweDAwRkYsIDB4MDBGRiwgMHgwMDdDLAogICAgIDB4ODE0MCwgMHg4MTdFLCAweDAyNzksIDB4ODE4MCwgMHg4MUFDLCAweDAyQjgsIDB4ODFCOCwgMHg4MUJGLCAweDAyRTUsCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL0FkZC1SS1NKLUhfMS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL0FkZC1SS1NKLUhfMS5jcHAKaW5kZXggODQ4Y2I0OS4uMzlkMzI2YyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9BZGQtUktTSi1IXzEuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvQWRkLVJLU0otSF8xLmNwcApAQCAtMSwxMCArMSwxMiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi1leHRlcm4gY29uc3QgdW5zaWduZWQgc2hvcnQgZ19GWENNQVBfQWRkX1JLU0pfSF8xWzYzNSAqIDNdID0geworI2luY2x1ZGUgImNtYXBzX2phcGFuMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0FkZF9SS1NKX0hfMVs2MzUgKiAzXSA9IHsKICAgICAweDAwMjAsIDB4MDA3RSwgMHgwMEU3LCAweDAwQTAsIDB4MDBERiwgMHgwMTQ2LCAweDgxNDAsIDB4ODE3RSwgMHgwMjc5LAogICAgIDB4ODE4MCwgMHg4MUFDLCAweDAyQjgsIDB4ODFCOCwgMHg4MUJGLCAweDAyRTUsIDB4ODFDOCwgMHg4MUNFLCAweDAyRUQsCiAgICAgMHg4MURBLCAweDgxRTgsIDB4MDJGNCwgMHg4MUYwLCAweDgxRjcsIDB4MDMwMywgMHg4MUZDLCAweDgxRkMsIDB4MDMwQiwKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvQWRkLVJLU0otVl8xLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvQWRkLVJLU0otVl8xLmNwcAppbmRleCBjODU1OTExLi5lYTk3ZjM4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL0FkZC1SS1NKLVZfMS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9BZGQtUktTSi1WXzEuY3BwCkBAIC0xLDEwICsxLDEyIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCBnX0ZYQ01BUF9BZGRfUktTSl9WXzFbNTcgKiAzXSA9IHsKKyNpbmNsdWRlICJjbWFwc19qYXBhbjEuaCIKKworY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9BZGRfUktTSl9WXzFbNTcgKiAzXSA9IHsKICAgICAweDgxNDEsIDB4ODE0MiwgMHgxRUNGLCAweDgxNDMsIDB4ODE0MywgMHgyMDRDLCAweDgxNDQsIDB4ODE0NCwgMHgyMDUyLAogICAgIDB4ODE1MCwgMHg4MTUxLCAweDFFRDEsIDB4ODE1QiwgMHg4MTVELCAweDFFRDMsIDB4ODE2MCwgMHg4MTY0LCAweDFFRDYsCiAgICAgMHg4MTY1LCAweDgxNjUsIDB4MjA1QSwgMHg4MTY2LCAweDgxNjYsIDB4MjA1MywgMHg4MTY3LCAweDgxNjcsIDB4MjA1OCwKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvQWRvYmUtSmFwYW4xLVVDUzJfNC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL0Fkb2JlLUphcGFuMS1VQ1MyXzQuY3BwCmluZGV4IDM0NTQ1MzcuLmQ2ZGFkZDUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvQWRvYmUtSmFwYW4xLVVDUzJfNC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9BZG9iZS1KYXBhbjEtVUNTMl80LmNwcApAQCAtMSwxOTM5ICsxLDE3MjYgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0IGdfRlhDTUFQX0phcGFuMUNJRDJVbmljb2RlXzRbMTU0NDRdID0gewotICAgIDB4RkZGRCwgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LAotICAgIDB4MDAyNywgMHgwMDI4LCAweDAwMjksIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLAotICAgIDB4MDAyRiwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LAotICAgIDB4MDAzNywgMHgwMDM4LCAweDAwMzksIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLAotICAgIDB4MDAzRiwgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LAotICAgIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLAotICAgIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LAotICAgIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgwMDVCLCAweDAwQTUsIDB4MDA1RCwgMHgwMDVFLAotICAgIDB4MDA1RiwgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LAotICAgIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLAotICAgIDB4MDA2RiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LAotICAgIDB4MDA3NywgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDdCLCAweDAwQTYsIDB4MDA3RCwgMHgwMzAzLAotICAgIDB4MDJCQywgMHgwMDVDLCAweDAyQkIsIDB4MDA3QywgMHgwMDdFLCAweDAwQTEsIDB4MDBBMiwgMHgwMEEzLAotICAgIDB4MjA0NCwgMHgwMTkyLCAweDAwQTcsIDB4MDBBNCwgMHgyMDFDLCAweDAwQUIsIDB4MjAzOSwgMHgyMDNBLAotICAgIDB4RkIwMSwgMHhGQjAyLCAweDIwMTIsIDB4MjAyMCwgMHgyMDIxLCAweDAwQjcsIDB4MDBCNiwgMHgyMDIyLAotICAgIDB4MjAxQSwgMHgyMDFFLCAweDIwMUQsIDB4MDBCQiwgMHgyMDI2LCAweDIwMzAsIDB4MDBCRiwgMHgwMzAxLAotICAgIDB4MDMwMiwgMHgwMEFGLCAweDAzMDYsIDB4MDMwNywgMHgwMzA4LCAweDAzMEEsIDB4MDBCOCwgMHgwMzBCLAotICAgIDB4MDMyOCwgMHgwMzBDLCAweDAzMzYsIDB4MDBDNiwgMHgwMEFBLCAweDAxNDEsIDB4MDBEOCwgMHgwMTUyLAotICAgIDB4MDBCQSwgMHgwMEU2LCAweDAxMzEsIDB4MDE0MiwgMHgwMEY4LCAweDAxNTMsIDB4MDBERiwgMHgwMDJELAotICAgIDB4MDBBOSwgMHgwMEFDLCAweDAwQUUsIDB4MDBCMCwgMHgwMEIxLCAweDAwQjIsIDB4MDBCMywgMHgwMEI1LAotICAgIDB4MDBCOSwgMHgwMEJDLCAweDAwQkQsIDB4MDBCRSwgMHgwMEMwLCAweDAwQzEsIDB4MDBDMiwgMHgwMEMzLAotICAgIDB4MDBDNCwgMHgwMEM1LCAweDAwQzcsIDB4MDBDOCwgMHgwMEM5LCAweDAwQ0EsIDB4MDBDQiwgMHgwMENDLAotICAgIDB4MDBDRCwgMHgwMENFLCAweDAwQ0YsIDB4MDBEMCwgMHgwMEQxLCAweDAwRDIsIDB4MDBEMywgMHgwMEQ0LAotICAgIDB4MDBENSwgMHgwMEQ2LCAweDAwRDcsIDB4MDBEOSwgMHgwMERBLCAweDAwREIsIDB4MDBEQywgMHgwMERELAotICAgIDB4MDBERSwgMHgwMEUwLCAweDAwRTEsIDB4MDBFMiwgMHgwMEUzLCAweDAwRTQsIDB4MDBFNSwgMHgwMEU3LAotICAgIDB4MDBFOCwgMHgwMEU5LCAweDAwRUEsIDB4MDBFQiwgMHgwMEVDLCAweDAwRUQsIDB4MDBFRSwgMHgwMEVGLAotICAgIDB4MDBGMCwgMHgwMEYxLCAweDAwRjIsIDB4MDBGMywgMHgwMEY0LCAweDAwRjUsIDB4MDBGNiwgMHgwMEY3LAotICAgIDB4MDBGOSwgMHgwMEZBLCAweDAwRkIsIDB4MDBGQywgMHgwMEZELCAweDAwRkUsIDB4MDBGRiwgMHgwMTYwLAotICAgIDB4MDE3OCwgMHgwMTdELCAweDAzMDUsIDB4MDE2MSwgMHgyMTIyLCAweDAxN0UsIDB4MDAzMCwgMHgwMDIwLAotICAgIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywgMHgwMDI4LAotICAgIDB4MDAyOSwgMHgwMDJBLCAweDAwMkIsIDB4MDAyQywgMHgwMDJELCAweDAwMkUsIDB4MDAyRiwgMHgwMDMwLAotICAgIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgMHgwMDM4LAotICAgIDB4MDAzOSwgMHgwMDNBLCAweDAwM0IsIDB4MDAzQywgMHgwMDNELCAweDAwM0UsIDB4MDAzRiwgMHgwMDQwLAotICAgIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LAotICAgIDB4MDA0OSwgMHgwMDRBLCAweDAwNEIsIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLAotICAgIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LAotICAgIDB4MDA1OSwgMHgwMDVBLCAweDAwNUIsIDB4MDBBNSwgMHgwMDVELCAweDAwNUUsIDB4MDA1RiwgMHgwMDYwLAotICAgIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywgMHgwMDY4LAotICAgIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywgMHgwMDZELCAweDAwNkUsIDB4MDA2RiwgMHgwMDcwLAotICAgIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywgMHgwMDc4LAotICAgIDB4MDA3OSwgMHgwMDdBLCAweDAwN0IsIDB4MDA3QywgMHgwMDdELCAweDIwM0UsIDB4RkY2MCwgMHhGRjYxLAotICAgIDB4RkY2MiwgMHhGRjYzLCAweEZGNjQsIDB4RkY2NSwgMHhGRjY2LCAweEZGNjcsIDB4RkY2OCwgMHhGRjY5LAotICAgIDB4RkY2QSwgMHhGRjZCLCAweEZGNkMsIDB4RkY2RCwgMHhGRjZFLCAweEZGNkYsIDB4RkY3MCwgMHhGRjcxLAotICAgIDB4RkY3MiwgMHhGRjczLCAweEZGNzQsIDB4RkY3NSwgMHhGRjc2LCAweEZGNzcsIDB4RkY3OCwgMHhGRjc5LAotICAgIDB4RkY3QSwgMHhGRjdCLCAweEZGN0MsIDB4RkY3RCwgMHhGRjdFLCAweEZGN0YsIDB4RkY4MCwgMHhGRjgxLAotICAgIDB4RkY4MiwgMHhGRjgzLCAweEZGODQsIDB4RkY4NSwgMHhGRjg2LCAweEZGODcsIDB4RkY4OCwgMHhGRjg5LAotICAgIDB4RkY4QSwgMHhGRjhCLCAweEZGOEMsIDB4RkY4RCwgMHhGRjhFLCAweEZGOEYsIDB4RkY5MCwgMHhGRjkxLAotICAgIDB4RkY5MiwgMHhGRjkzLCAweEZGOTQsIDB4RkY5NSwgMHhGRjk2LCAweEZGOTcsIDB4RkY5OCwgMHhGRjk5LAotICAgIDB4RkY5QSwgMHhGRjlCLCAweEZGOUMsIDB4RkY5RCwgMHhGRjlFLCAweEZGOUYsIDB4RkY0MCwgMHgzMEYwLAotICAgIDB4MzBGMSwgMHgzMEVFLCAweDMwQUIsIDB4MzBCMSwgMHgzMEY0LCAweDMwQUMsIDB4MzBBRSwgMHgzMEIwLAotICAgIDB4MzBCMiwgMHgzMEI0LCAweDMwQjYsIDB4MzBCOCwgMHgzMEJBLCAweDMwQkMsIDB4MzBCRSwgMHgzMEMwLAotICAgIDB4MzBDMiwgMHgzMEM1LCAweDMwQzcsIDB4MzBDOSwgMHgzMEQwLCAweDMwRDEsIDB4MzBEMywgMHgzMEQ0LAotICAgIDB4MzBENiwgMHgzMEQ3LCAweDMwRDksIDB4MzBEQSwgMHgzMERDLCAweDMwREQsIDB4RkY2MCwgMHgzMDFELAotICAgIDB4MzAxRSwgMHgyNTAwLCAweDI1MDEsIDB4MjUwMiwgMHgyNTAzLCAweDI1MDQsIDB4MjUwNSwgMHgyNTA2LAotICAgIDB4MjUwNywgMHgyNTA4LCAweDI1MDksIDB4MjUwQSwgMHgyNTBCLCAweDI1MEMsIDB4MjUwRCwgMHgyNTBFLAotICAgIDB4MjUwRiwgMHgyNTEwLCAweDI1MTEsIDB4MjUxMiwgMHgyNTEzLCAweDI1MTQsIDB4MjUxNSwgMHgyNTE2LAotICAgIDB4MjUxNywgMHgyNTE4LCAweDI1MTksIDB4MjUxQSwgMHgyNTFCLCAweDI1MUMsIDB4MjUxRCwgMHgyNTFFLAotICAgIDB4MjUxRiwgMHgyNTIwLCAweDI1MjEsIDB4MjUyMiwgMHgyNTIzLCAweDI1MjQsIDB4MjUyNSwgMHgyNTI2LAotICAgIDB4MjUyNywgMHgyNTI4LCAweDI1MjksIDB4MjUyQSwgMHgyNTJCLCAweDI1MkMsIDB4MjUyRCwgMHgyNTJFLAotICAgIDB4MjUyRiwgMHgyNTMwLCAweDI1MzEsIDB4MjUzMiwgMHgyNTMzLCAweDI1MzQsIDB4MjUzNSwgMHgyNTM2LAotICAgIDB4MjUzNywgMHgyNTM4LCAweDI1MzksIDB4MjUzQSwgMHgyNTNCLCAweDI1M0MsIDB4MjUzRCwgMHgyNTNFLAotICAgIDB4MjUzRiwgMHgyNTQwLCAweDI1NDEsIDB4MjU0MiwgMHgyNTQzLCAweDI1NDQsIDB4MjU0NSwgMHgyNTQ2LAotICAgIDB4MjU0NywgMHgyNTQ4LCAweDI1NDksIDB4MjU0QSwgMHgyNTRCLCAweDIwMzIsIDB4MDBBOCwgMHgyMDM2LAotICAgIDB4MDA1QiwgMHgwMDVELCAweDMwMDgsIDB4MzAwOSwgMHgzMDBBLCAweDMwMEIsIDB4MzAwRSwgMHgzMDBGLAotICAgIDB4MzAxMCwgMHgzMDExLCAweDIwMTIsIDB4RkY2MCwgMHgzMDkyLCAweDMwNDEsIDB4MzA0MywgMHgzMDQ1LAotICAgIDB4MzA0NywgMHgzMDQ5LCAweDMwODMsIDB4MzA4NSwgMHgzMDg3LCAweDMwNjMsIDB4MzA0MiwgMHgzMDQ0LAotICAgIDB4MzA0NiwgMHgzMDQ4LCAweDMwNEEsIDB4MzA0QiwgMHgzMDRELCAweDMwNEYsIDB4MzA1MSwgMHgzMDUzLAotICAgIDB4MzA1NSwgMHgzMDU3LCAweDMwNTksIDB4MzA1QiwgMHgzMDVELCAweDMwNUYsIDB4MzA2MSwgMHgzMDY0LAotICAgIDB4MzA2NiwgMHgzMDY4LCAweDMwNkEsIDB4MzA2QiwgMHgzMDZDLCAweDMwNkQsIDB4MzA2RSwgMHgzMDZGLAotICAgIDB4MzA3MiwgMHgzMDc1LCAweDMwNzgsIDB4MzA3QiwgMHgzMDdFLCAweDMwN0YsIDB4MzA4MCwgMHgzMDgxLAotICAgIDB4MzA4MiwgMHgzMDg0LCAweDMwODYsIDB4MzA4OCwgMHgzMDg5LCAweDMwOEEsIDB4MzA4QiwgMHgzMDhDLAotICAgIDB4MzA4RCwgMHgzMDhGLCAweDMwOTMsIDB4MzA5MCwgMHgzMDkxLCAweDMwOEUsIDB4MzA0QywgMHgzMDRFLAotICAgIDB4MzA1MCwgMHgzMDUyLCAweDMwNTQsIDB4MzA1NiwgMHgzMDY4LCAweDMwNUEsIDB4MzA1QywgMHgzMDVFLAotICAgIDB4MzA2MCwgMHgzMDYyLCAweDMwNjUsIDB4MzA2NywgMHgzMDY5LCAweDMwNzAsIDB4MzA3MSwgMHgzMDczLAotICAgIDB4MzA3NCwgMHgzMDc2LCAweDMwNzcsIDB4MzA3OSwgMHgzMDdBLCAweDMwN0MsIDB4MzA3RCwgMHgwMEM0LAotICAgIDB4MDBGOSwgMHgwMEU5LCAweDAwRUQsIDB4MDBERiwgMHgwMEU3LCAweDAwQzcsIDB4MDBEMSwgMHgwMEYxLAotICAgIDB4MDBBMiwgMHgwMEEzLCAweDAwRjMsIDB4MDBGQSwgMHgwMEExLCAweDAwQkYsIDB4MDBCRCwgMHgwMEQ2LAotICAgIDB4MDBEQywgMHgwMEU0LCAweDAwRUIsIDB4MDBFRiwgMHgwMEY2LCAweDAwREMsIDB4MDBFMiwgMHgwMEVBLAotICAgIDB4MDBFRSwgMHgwMEY0LCAweDAwRkMsIDB4MDBFMCwgMHgwMEU5LCAweDI1QjIsIDB4MDBFMSwgMHgwMDdFLAotICAgIDB4MDAzMCwgMHgzMDAwLCAweDMwMDEsIDB4MzAwMiwgMHhGRjBDLCAweEZGMEUsIDB4MzBGQiwgMHhGRjFBLAotICAgIDB4RkYxQiwgMHhGRjFGLCAweEZGMDEsIDB4MzA5QiwgMHgzMDlDLCAweDAwQjQsIDB4RkY0MCwgMHgwMEE4LAotICAgIDB4RkYzRSwgMHgyMDNFLCAweEZGM0YsIDB4MzBGRCwgMHgzMEZFLCAweDMwOUQsIDB4MzA5RSwgMHgzMDAzLAotICAgIDB4NEVERCwgMHgzMDA1LCAweDMwMDYsIDB4MzAwNywgMHgzMEZDLCAweDIwMTUsIDB4MjAxMCwgMHhGRjBGLAotICAgIDB4RkYzQywgMHhGRjVFLCAweDIwMTYsIDB4RkY1QywgMHgyMDI2LCAweDIwMjUsIDB4MjAxOCwgMHgyMDE5LAotICAgIDB4MjAxQywgMHgyMDFELCAweEZGMDgsIDB4RkYwOSwgMHgzMDE0LCAweDMwMTUsIDB4RkYzQiwgMHhGRjNELAotICAgIDB4RkY1QiwgMHhGRjVELCAweDMwMDgsIDB4MzAwOSwgMHgzMDBBLCAweDMwMEIsIDB4MzAwQywgMHgzMDBELAotICAgIDB4MzAwRSwgMHgzMDBGLCAweDMwMTAsIDB4MzAxMSwgMHhGRjBCLCAweEZGMEQsIDB4MDBCMSwgMHgwMEQ3LAotICAgIDB4MDBGNywgMHhGRjFELCAweDIyNjAsIDB4RkYxQywgMHhGRjFFLCAweDIyNjYsIDB4MjI2NywgMHgyMjFFLAotICAgIDB4MjIzNCwgMHgyNjQyLCAweDI2NDAsIDB4MDBCMCwgMHgyMDMyLCAweDIwMzMsIDB4MjEwMywgMHhGRkU1LAotICAgIDB4RkYwNCwgMHgwMEEyLCAweDAwQTMsIDB4RkYwNSwgMHhGRjAzLCAweEZGMDYsIDB4RkYwQSwgMHhGRjIwLAotICAgIDB4MDBBNywgMHgyNjA2LCAweDI2MDUsIDB4MjVDQiwgMHgyNUNGLCAweDI1Q0UsIDB4MjVDNywgMHgyNUM2LAotICAgIDB4MjVBMSwgMHgyNUEwLCAweDI1QjMsIDB4MjVCMiwgMHgyNUJELCAweDI1QkMsIDB4MjAzQiwgMHgzMDEyLAotICAgIDB4MjE5MiwgMHgyMTkwLCAweDIxOTEsIDB4MjE5MywgMHgzMDEzLCAweDIyMDgsIDB4MjIwQiwgMHgyMjg2LAotICAgIDB4MjI4NywgMHgyMjgyLCAweDIyODMsIDB4MjIyQSwgMHgyMjI5LCAweDIyMjcsIDB4MjIyOCwgMHgwMEFDLAotICAgIDB4MjFEMiwgMHgyMUQ0LCAweDIyMDAsIDB4MjIwMywgMHgyMjIwLCAweDIyQTUsIDB4MjMxMiwgMHgyMjAyLAotICAgIDB4MjIwNywgMHgyMjYxLCAweDIyNTIsIDB4MjI2QSwgMHgyMjZCLCAweDIyMUEsIDB4MjIzRCwgMHgyMjFELAotICAgIDB4MjIzNSwgMHgyMjJCLCAweDIyMkMsIDB4MjEyQiwgMHgyMDMwLCAweDI2NkYsIDB4MjY2RCwgMHgyNjZBLAotICAgIDB4MjAyMCwgMHgyMDIxLCAweDAwQjYsIDB4MjVFRiwgMHhGRjEwLCAweEZGMTEsIDB4RkYxMiwgMHhGRjEzLAotICAgIDB4RkYxNCwgMHhGRjE1LCAweEZGMTYsIDB4RkYxNywgMHhGRjE4LCAweEZGMTksIDB4RkYyMSwgMHhGRjIyLAotICAgIDB4RkYyMywgMHhGRjI0LCAweEZGMjUsIDB4RkYyNiwgMHhGRjI3LCAweEZGMjgsIDB4RkYyOSwgMHhGRjJBLAotICAgIDB4RkYyQiwgMHhGRjJDLCAweEZGMkQsIDB4RkYyRSwgMHhGRjJGLCAweEZGMzAsIDB4RkYzMSwgMHhGRjMyLAotICAgIDB4RkYzMywgMHhGRjM0LCAweEZGMzUsIDB4RkYzNiwgMHhGRjM3LCAweEZGMzgsIDB4RkYzOSwgMHhGRjNBLAotICAgIDB4RkY0MSwgMHhGRjQyLCAweEZGNDMsIDB4RkY0NCwgMHhGRjQ1LCAweEZGNDYsIDB4RkY0NywgMHhGRjQ4LAotICAgIDB4RkY0OSwgMHhGRjRBLCAweEZGNEIsIDB4RkY0QywgMHhGRjRELCAweEZGNEUsIDB4RkY0RiwgMHhGRjUwLAotICAgIDB4RkY1MSwgMHhGRjUyLCAweEZGNTMsIDB4RkY1NCwgMHhGRjU1LCAweEZGNTYsIDB4RkY1NywgMHhGRjU4LAotICAgIDB4RkY1OSwgMHhGRjVBLCAweDMwNDEsIDB4MzA0MiwgMHgzMDQzLCAweDMwNDQsIDB4MzA0NSwgMHgzMDQ2LAotICAgIDB4MzA0NywgMHgzMDQ4LCAweDMwNDksIDB4MzA0QSwgMHgzMDRCLCAweDMwNEMsIDB4MzA0RCwgMHgzMDRFLAotICAgIDB4MzA0RiwgMHgzMDUwLCAweDMwNTEsIDB4MzA1MiwgMHgzMDUzLCAweDMwNTQsIDB4MzA1NSwgMHgzMDU2LAotICAgIDB4MzA1NywgMHgzMDU4LCAweDMwNTksIDB4MzA1QSwgMHgzMDVCLCAweDMwNUMsIDB4MzA1RCwgMHgzMDVFLAotICAgIDB4MzA1RiwgMHgzMDYwLCAweDMwNjEsIDB4MzA2MiwgMHgzMDYzLCAweDMwNjQsIDB4MzA2NSwgMHgzMDY2LAotICAgIDB4MzA2NywgMHgzMDY4LCAweDMwNjksIDB4MzA2QSwgMHgzMDZCLCAweDMwNkMsIDB4MzA2RCwgMHgzMDZFLAotICAgIDB4MzA2RiwgMHgzMDcwLCAweDMwNzEsIDB4MzA3MiwgMHgzMDczLCAweDMwNzQsIDB4MzA3NSwgMHgzMDc2LAotICAgIDB4MzA3NywgMHgzMDc4LCAweDMwNzksIDB4MzA3QSwgMHgzMDdCLCAweDMwN0MsIDB4MzA3RCwgMHgzMDdFLAotICAgIDB4MzA3RiwgMHgzMDgwLCAweDMwODEsIDB4MzA4MiwgMHgzMDgzLCAweDMwODQsIDB4MzA4NSwgMHgzMDg2LAotICAgIDB4MzA4NywgMHgzMDg4LCAweDMwODksIDB4MzA4QSwgMHgzMDhCLCAweDMwOEMsIDB4MzA4RCwgMHgzMDhFLAotICAgIDB4MzA4RiwgMHgzMDkwLCAweDMwOTEsIDB4MzA5MiwgMHgzMDkzLCAweDMwQTEsIDB4MzBBMiwgMHgzMEEzLAotICAgIDB4MzBBNCwgMHgzMEE1LCAweDMwQTYsIDB4MzBBNywgMHgzMEE4LCAweDMwQTksIDB4MzBBQSwgMHgzMEFCLAotICAgIDB4MzBBQywgMHgzMEFELCAweDMwQUUsIDB4MzBBRiwgMHgzMEIwLCAweDMwQjEsIDB4MzBCMiwgMHgzMEIzLAotICAgIDB4MzBCNCwgMHgzMEI1LCAweDMwQjYsIDB4MzBCNywgMHgzMEI4LCAweDMwQjksIDB4MzBCQSwgMHgzMEJCLAotICAgIDB4MzBCQywgMHgzMEJELCAweDMwQkUsIDB4MzBCRiwgMHgzMEMwLCAweDMwQzEsIDB4MzBDMiwgMHgzMEMzLAotICAgIDB4MzBDNCwgMHgzMEM1LCAweDMwQzYsIDB4MzBDNywgMHgzMEM4LCAweDMwQzksIDB4MzBDQSwgMHgzMENCLAotICAgIDB4MzBDQywgMHgzMENELCAweDMwQ0UsIDB4MzBDRiwgMHgzMEQwLCAweDMwRDEsIDB4MzBEMiwgMHgzMEQzLAotICAgIDB4MzBENCwgMHgzMEQ1LCAweDMwRDYsIDB4MzBENywgMHgzMEQ4LCAweDMwRDksIDB4MzBEQSwgMHgzMERCLAotICAgIDB4MzBEQywgMHgzMERELCAweDMwREUsIDB4MzBERiwgMHgzMEUwLCAweDMwRTEsIDB4MzBFMiwgMHgzMEUzLAotICAgIDB4MzBFNCwgMHgzMEU1LCAweDMwRTYsIDB4MzBFNywgMHgzMEU4LCAweDMwRTksIDB4MzBFQSwgMHgzMEVCLAotICAgIDB4MzBFQywgMHgzMEVELCAweDMwRUUsIDB4MzBFRiwgMHgzMEYwLCAweDMwRjEsIDB4MzBGMiwgMHgzMEYzLAotICAgIDB4MzBGNCwgMHgzMEY1LCAweDMwRjYsIDB4MDM5MSwgMHgwMzkyLCAweDAzOTMsIDB4MDM5NCwgMHgwMzk1LAotICAgIDB4MDM5NiwgMHgwMzk3LCAweDAzOTgsIDB4MDM5OSwgMHgwMzlBLCAweDAzOUIsIDB4MDM5QywgMHgwMzlELAotICAgIDB4MDM5RSwgMHgwMzlGLCAweDAzQTAsIDB4MDNBMSwgMHgwM0EzLCAweDAzQTQsIDB4MDNBNSwgMHgwM0E2LAotICAgIDB4MDNBNywgMHgwM0E4LCAweDAzQTksIDB4MDNCMSwgMHgwM0IyLCAweDAzQjMsIDB4MDNCNCwgMHgwM0I1LAotICAgIDB4MDNCNiwgMHgwM0I3LCAweDAzQjgsIDB4MDNCOSwgMHgwM0JBLCAweDAzQkIsIDB4MDNCQywgMHgwM0JELAotICAgIDB4MDNCRSwgMHgwM0JGLCAweDAzQzAsIDB4MDNDMSwgMHgwM0MzLCAweDAzQzQsIDB4MDNDNSwgMHgwM0M2LAotICAgIDB4MDNDNywgMHgwM0M4LCAweDAzQzksIDB4MDQxMCwgMHgwNDExLCAweDA0MTIsIDB4MDQxMywgMHgwNDE0LAotICAgIDB4MDQxNSwgMHgwNDAxLCAweDA0MTYsIDB4MDQxNywgMHgwNDE4LCAweDA0MTksIDB4MDQxQSwgMHgwNDFCLAotICAgIDB4MDQxQywgMHgwNDFELCAweDA0MUUsIDB4MDQxRiwgMHgwNDIwLCAweDA0MjEsIDB4MDQyMiwgMHgwNDIzLAotICAgIDB4MDQyNCwgMHgwNDI1LCAweDA0MjYsIDB4MDQyNywgMHgwNDI4LCAweDA0MjksIDB4MDQyQSwgMHgwNDJCLAotICAgIDB4MDQyQywgMHgwNDJELCAweDA0MkUsIDB4MDQyRiwgMHgwNDMwLCAweDA0MzEsIDB4MDQzMiwgMHgwNDMzLAotICAgIDB4MDQzNCwgMHgwNDM1LCAweDA0NTEsIDB4MDQzNiwgMHgwNDM3LCAweDA0MzgsIDB4MDQzOSwgMHgwNDNBLAotICAgIDB4MDQzQiwgMHgwNDNDLCAweDA0M0QsIDB4MDQzRSwgMHgwNDNGLCAweDA0NDAsIDB4MDQ0MSwgMHgwNDQyLAotICAgIDB4MDQ0MywgMHgwNDQ0LCAweDA0NDUsIDB4MDQ0NiwgMHgwNDQ3LCAweDA0NDgsIDB4MDQ0OSwgMHgwNDRBLAotICAgIDB4MDQ0QiwgMHgwNDRDLCAweDA0NEQsIDB4MDQ0RSwgMHgwNDRGLCAweDRFOUMsIDB4NTUxNiwgMHg1QTAzLAotICAgIDB4OTYzRiwgMHg1NEMwLCAweDYxMUIsIDB4NjMyOCwgMHg1OUY2LCAweDkwMjIsIDB4ODQ3NSwgMHg4MzFDLAotICAgIDB4N0E1MCwgMHg2MEFBLCAweDYzRTEsIDB4NkUyNSwgMHg2NUVELCAweDg0NjYsIDB4ODJBNiwgMHg5QkY1LAotICAgIDB4Njg5MywgMHg1NzI3LCAweDY1QTEsIDB4NjI3MSwgMHg1QjlCLCAweDU5RDAsIDB4ODY3QiwgMHg5OEY0LAotICAgIDB4N0Q2MiwgMHg3REJFLCAweDlCOEUsIDB4NjIxNiwgMHg3QzlGLCAweDg4QjcsIDB4NUI4OSwgMHg1RUI1LAotICAgIDB4NjMwOSwgMHg2Njk3LCAweDY4NDgsIDB4OTVDNywgMHg5NzhELCAweDY3NEYsIDB4NEVFNSwgMHg0RjBBLAotICAgIDB4NEY0RCwgMHg0RjlELCAweDUwNDksIDB4NTZGMiwgMHg1OTM3LCAweDU5RDQsIDB4NUEwMSwgMHg1QzA5LAotICAgIDB4NjBERiwgMHg2MTBGLCAweDYxNzAsIDB4NjYxMywgMHg2OTA1LCAweDcwQkEsIDB4NzU0RiwgMHg3NTcwLAotICAgIDB4NzlGQiwgMHg3REFELCAweDdERUYsIDB4ODBDMywgMHg4NDBFLCAweDg4NjMsIDB4OEIwMiwgMHg5MDU1LAotICAgIDB4OTA3QSwgMHg1MzNCLCAweDRFOTUsIDB4NEVBNSwgMHg1N0RGLCAweDgwQjIsIDB4OTBDMSwgMHg3OEVGLAotICAgIDB4NEUwMCwgMHg1OEYxLCAweDZFQTIsIDB4OTAzOCwgMHg3QTMyLCAweDgzMjgsIDB4ODI4QiwgMHg5QzJGLAotICAgIDB4NTE0MSwgMHg1MzcwLCAweDU0QkQsIDB4NTRFMSwgMHg1NkUwLCAweDU5RkIsIDB4NUYxNSwgMHg5OEYyLAotICAgIDB4NkRFQiwgMHg4MEU0LCAweDg1MkQsIDB4OTY2MiwgMHg5NjcwLCAweDk2QTAsIDB4OTdGQiwgMHg1NDBCLAotICAgIDB4NTNGMywgMHg1Qjg3LCAweDcwQ0YsIDB4N0ZCRCwgMHg4RkMyLCAweDk2RTgsIDB4NTM2RiwgMHg5RDVDLAotICAgIDB4N0FCQSwgMHg0RTExLCAweDc4OTMsIDB4ODFGQywgMHg2RTI2LCAweDU2MTgsIDB4NTUwNCwgMHg2QjFELAotICAgIDB4ODUxQSwgMHg5QzNCLCAweDU5RTUsIDB4NTNBOSwgMHg2RDY2LCAweDc0REMsIDB4OTU4RiwgMHg1NjQyLAotICAgIDB4NEU5MSwgMHg5MDRCLCAweDk2RjIsIDB4ODM0RiwgMHg5OTBDLCAweDUzRTEsIDB4NTVCNiwgMHg1QjMwLAotICAgIDB4NUY3MSwgMHg2NjIwLCAweDY2RjMsIDB4NjgwNCwgMHg2QzM4LCAweDZDRjMsIDB4NkQyOSwgMHg3NDVCLAotICAgIDB4NzZDOCwgMHg3QTRFLCAweDk4MzQsIDB4ODJGMSwgMHg4ODVCLCAweDhBNjAsIDB4OTJFRCwgMHg2REIyLAotICAgIDB4NzVBQiwgMHg3NkNBLCAweDk5QzUsIDB4NjBBNiwgMHg4QjAxLCAweDhEOEEsIDB4OTVCMiwgMHg2OThFLAotICAgIDB4NTNBRCwgMHg1MTg2LCAweDU3MTIsIDB4NTgzMCwgMHg1OTQ0LCAweDVCQjQsIDB4NUVGNiwgMHg2MDI4LAotICAgIDB4NjNBOSwgMHg2M0Y0LCAweDZDQkYsIDB4NkYxNCwgMHg3MDhFLCAweDcxMTQsIDB4NzE1OSwgMHg3MUQ1LAotICAgIDB4NzMzRiwgMHg3RTAxLCAweDgyNzYsIDB4ODJEMSwgMHg4NTk3LCAweDkwNjAsIDB4OTI1QiwgMHg5RDFCLAotICAgIDB4NTg2OSwgMHg2NUJDLCAweDZDNUEsIDB4NzUyNSwgMHg1MUY5LCAweDU5MkUsIDB4NTk2NSwgMHg1RjgwLAotICAgIDB4NUZEQywgMHg2MkJDLCAweDY1RkEsIDB4NkEyQSwgMHg2QjI3LCAweDZCQjQsIDB4NzM4QiwgMHg3RkMxLAotICAgIDB4ODk1NiwgMHg5RDJDLCAweDlEMEUsIDB4OUVDNCwgMHg1Q0ExLCAweDZDOTYsIDB4ODM3QiwgMHg1MTA0LAotICAgIDB4NUM0QiwgMHg2MUI2LCAweDgxQzYsIDB4Njg3NiwgMHg3MjYxLCAweDRFNTksIDB4NEZGQSwgMHg1Mzc4LAotICAgIDB4NjA2OSwgMHg2RTI5LCAweDdBNEYsIDB4OTdGMywgMHg0RTBCLCAweDUzMTYsIDB4NEVFRSwgMHg0RjU1LAotICAgIDB4NEYzRCwgMHg0RkExLCAweDRGNzMsIDB4NTJBMCwgMHg1M0VGLCAweDU2MDksIDB4NTkwRiwgMHg1QUMxLAotICAgIDB4NUJCNiwgMHg1QkUxLCAweDc5RDEsIDB4NjY4NywgMHg2NzlDLCAweDY3QjYsIDB4NkI0QywgMHg2Q0IzLAotICAgIDB4NzA2QiwgMHg3M0MyLCAweDc5OEQsIDB4NzlCRSwgMHg3QTNDLCAweDdCODcsIDB4ODJCMSwgMHg4MkRCLAotICAgIDB4ODMwNCwgMHg4Mzc3LCAweDgzRUYsIDB4ODNEMywgMHg4NzY2LCAweDhBQjIsIDB4NTYyOSwgMHg4Q0E4LAotICAgIDB4OEZFNiwgMHg5MDRFLCAweDk3MUUsIDB4ODY4QSwgMHg0RkM0LCAweDVDRTgsIDB4NjIxMSwgMHg3MjU5LAotICAgIDB4NzUzQiwgMHg4MUU1LCAweDgyQkQsIDB4ODZGRSwgMHg4Q0MwLCAweDk2QzUsIDB4OTkxMywgMHg5OUQ1LAotICAgIDB4NEVDQiwgMHg0RjFBLCAweDg5RTMsIDB4NTZERSwgMHg1ODRBLCAweDU4Q0EsIDB4NUVGQiwgMHg1RkVCLAotICAgIDB4NjAyQSwgMHg2MDk0LCAweDYwNjIsIDB4NjFEMCwgMHg2MjEyLCAweDYyRDAsIDB4NjUzOSwgMHg5QjQxLAotICAgIDB4NjY2NiwgMHg2OEIwLCAweDZENzcsIDB4NzA3MCwgMHg3NTRDLCAweDc2ODYsIDB4N0Q3NSwgMHg4MkE1LAotICAgIDB4ODdGOSwgMHg5NThCLCAweDk2OEUsIDB4OEM5RCwgMHg1MUYxLCAweDUyQkUsIDB4NTkxNiwgMHg1NEIzLAotICAgIDB4NUJCMywgMHg1RDE2LCAweDYxNjgsIDB4Njk4MiwgMHg2REFGLCAweDc4OEQsIDB4ODRDQiwgMHg4ODU3LAotICAgIDB4OEE3MiwgMHg5M0E3LCAweDlBQjgsIDB4NkQ2QywgMHg5OUE4LCAweDg2RDksIDB4NTdBMywgMHg2N0ZGLAotICAgIDB4ODZDRSwgMHg5MjBFLCAweDUyODMsIDB4NTY4NywgMHg1NDA0LCAweDVFRDMsIDB4NjJFMSwgMHg2NEI5LAotICAgIDB4NjgzQywgMHg2ODM4LCAweDZCQkIsIDB4NzM3MiwgMHg3OEJBLCAweDdBNkIsIDB4ODk5QSwgMHg4OUQyLAotICAgIDB4OEQ2QiwgMHg4RjAzLCAweDkwRUQsIDB4OTVBMywgMHg5Njk0LCAweDk3NjksIDB4NUI2NiwgMHg1Q0IzLAotICAgIDB4Njk3RCwgMHg5ODRELCAweDk4NEUsIDB4NjM5QiwgMHg3QjIwLCAweDZBMkIsIDB4NkE3RiwgMHg2OEI2LAotICAgIDB4OUMwRCwgMHg2RjVGLCAweDUyNzIsIDB4NTU5RCwgMHg2MDcwLCAweDYyRUMsIDB4NkQzQiwgMHg2RTA3LAotICAgIDB4NkVEMSwgMHg4NDVCLCAweDg5MTAsIDB4OEY0NCwgMHg0RTE0LCAweDlDMzksIDB4NTNGNiwgMHg2OTFCLAotICAgIDB4NkEzQSwgMHg5Nzg0LCAweDY4MkEsIDB4NTE1QywgMHg3QUMzLCAweDg0QjIsIDB4OTFEQywgMHg5MzhDLAotICAgIDB4NTY1QiwgMHg5RDI4LCAweDY4MjIsIDB4ODMwNSwgMHg4NDMxLCAweDdDQTUsIDB4NTIwOCwgMHg4MkM1LAotICAgIDB4NzRFNiwgMHg0RTdFLCAweDRGODMsIDB4NTFBMCwgMHg1QkQyLCAweDUyMEEsIDB4NTJEOCwgMHg1MkU3LAotICAgIDB4NURGQiwgMHg1NTlBLCAweDU4MkEsIDB4NTlFNiwgMHg1QjhDLCAweDVCOTgsIDB4NUJEQiwgMHg1RTcyLAotICAgIDB4NUU3OSwgMHg2MEEzLCAweDYxMUYsIDB4NjE2MywgMHg2MUJFLCAweDYzREIsIDB4NjU2MiwgMHg2N0QxLAotICAgIDB4Njg1MywgMHg2OEZBLCAweDZCM0UsIDB4NkI1MywgMHg2QzU3LCAweDZGMjIsIDB4NkY5NywgMHg2RjQ1LAotICAgIDB4NzRCMCwgMHg3NTE4LCAweDc2RTMsIDB4NzcwQiwgMHg3QUZGLCAweDdCQTEsIDB4N0MyMSwgMHg3REU5LAotICAgIDB4N0YzNiwgMHg3RkYwLCAweDgwOUQsIDB4ODI2NiwgMHg4MzlFLCAweDg5QjMsIDB4OEFDQywgMHg4Q0FCLAotICAgIDB4OTA4NCwgMHg5NDUxLCAweDk1OTMsIDB4OTU5MSwgMHg5NUEyLCAweDk2NjUsIDB4OTdEMywgMHg5OTI4LAotICAgIDB4ODIxOCwgMHg0RTM4LCAweDU0MkIsIDB4NUNCOCwgMHg1RENDLCAweDczQTksIDB4NzY0QywgMHg3NzNDLAotICAgIDB4NUNBOSwgMHg3RkVCLCAweDhEMEIsIDB4OTZDMSwgMHg5ODExLCAweDk4NTQsIDB4OTg1OCwgMHg0RjAxLAotICAgIDB4NEYwRSwgMHg1MzcxLCAweDU1OUMsIDB4NTY2OCwgMHg1N0ZBLCAweDU5NDcsIDB4NUIwOSwgMHg1QkM0LAotICAgIDB4NUM5MCwgMHg1RTBDLCAweDVFN0UsIDB4NUZDQywgMHg2M0VFLCAweDY3M0EsIDB4NjVENywgMHg2NUUyLAotICAgIDB4NjcxRiwgMHg2OENCLCAweDY4QzQsIDB4NkE1RiwgMHg1RTMwLCAweDZCQzUsIDB4NkMxNywgMHg2QzdELAotICAgIDB4NzU3RiwgMHg3OTQ4LCAweDVCNjMsIDB4N0EwMCwgMHg3RDAwLCAweDVGQkQsIDB4ODk4RiwgMHg4QTE4LAotICAgIDB4OENCNCwgMHg4RDc3LCAweDhFQ0MsIDB4OEYxRCwgMHg5OEUyLCAweDlBMEUsIDB4OUIzQywgMHg0RTgwLAotICAgIDB4NTA3RCwgMHg1MTAwLCAweDU5OTMsIDB4NUI5QywgMHg2MjJGLCAweDYyODAsIDB4NjRFQywgMHg2QjNBLAotICAgIDB4NzJBMCwgMHg3NTkxLCAweDc5NDcsIDB4N0ZBOSwgMHg4N0ZCLCAweDhBQkMsIDB4OEI3MCwgMHg2M0FDLAotICAgIDB4ODNDQSwgMHg5N0EwLCAweDU0MDksIDB4NTQwMywgMHg1NUFCLCAweDY4NTQsIDB4NkE1OCwgMHg4QTcwLAotICAgIDB4NzgyNywgMHg2Nzc1LCAweDlFQ0QsIDB4NTM3NCwgMHg1QkEyLCAweDgxMUEsIDB4ODY1MCwgMHg5MDA2LAotICAgIDB4NEUxOCwgMHg0RTQ1LCAweDRFQzcsIDB4NEYxMSwgMHg1M0NBLCAweDU0MzgsIDB4NUJBRSwgMHg1RjEzLAotICAgIDB4NjAyNSwgMHg2NTUxLCAweDY3M0QsIDB4NkM0MiwgMHg2QzcyLCAweDZDRTMsIDB4NzA3OCwgMHg3NDAzLAotICAgIDB4N0E3NiwgMHg3QUFFLCAweDdCMDgsIDB4N0QxQSwgMHg3Q0ZFLCAweDdENjYsIDB4NjVFNywgMHg3MjVCLAotICAgIDB4NTNCQiwgMHg1QzQ1LCAweDVERTgsIDB4NjJEMiwgMHg2MkUwLCAweDYzMTksIDB4NkUyMCwgMHg4NjVBLAotICAgIDB4OEEzMSwgMHg4RERELCAweDkyRjgsIDB4NkYwMSwgMHg3OUE2LCAweDlCNUEsIDB4NEVBOCwgMHg0RUFCLAotICAgIDB4NEVBQywgMHg0RjlCLCAweDRGQTAsIDB4NTBEMSwgMHg1MTQ3LCAweDdBRjYsIDB4NTE3MSwgMHg1MUY2LAotICAgIDB4NTM1NCwgMHg1MzIxLCAweDUzN0YsIDB4NTNFQiwgMHg1NUFDLCAweDU4ODMsIDB4NUNFMSwgMHg1RjM3LAotICAgIDB4NUY0QSwgMHg2MDJGLCAweDYwNTAsIDB4NjA2RCwgMHg2MzFGLCAweDY1NTksIDB4NkE0QiwgMHg2Q0MxLAotICAgIDB4NzJDMiwgMHg3MkVELCAweDc3RUYsIDB4ODBGOCwgMHg4MTA1LCAweDgyMDgsIDB4ODU0RSwgMHg5MEY3LAotICAgIDB4OTNFMSwgMHg5N0ZGLCAweDk5NTcsIDB4OUE1QSwgMHg0RUYwLCAweDUxREQsIDB4NUMyRCwgMHg2NjgxLAotICAgIDB4Njk2RCwgMHg1QzQwLCAweDY2RjIsIDB4Njk3NSwgMHg3Mzg5LCAweDY4NTAsIDB4N0M4MSwgMHg1MEM1LAotICAgIDB4NTJFNCwgMHg1NzQ3LCAweDVERkUsIDB4OTMyNiwgMHg2NUE0LCAweDZCMjMsIDB4NkIzRCwgMHg3NDM0LAotICAgIDB4Nzk4MSwgMHg3OUJELCAweDdCNEIsIDB4N0RDQSwgMHg4MkI5LCAweDgzQ0MsIDB4ODg3RiwgMHg4OTVGLAotICAgIDB4OEIzOSwgMHg4RkQxLCAweDkxRDEsIDB4NTQxRiwgMHg5MjgwLCAweDRFNUQsIDB4NTAzNiwgMHg1M0U1LAotICAgIDB4NTMzQSwgMHg3MkQ3LCAweDczOTYsIDB4NzdFOSwgMHg4MkU2LCAweDhFQUYsIDB4OTlDNiwgMHg5OUM4LAotICAgIDB4OTlEMiwgMHg1MTc3LCAweDYxMUEsIDB4ODY1RSwgMHg1NUIwLCAweDdBN0EsIDB4NTA3NiwgMHg1QkQzLAotICAgIDB4OTA0NywgMHg5Njg1LCAweDRFMzIsIDB4NkFEQiwgMHg5MUU3LCAweDVDNTEsIDB4NUM0OCwgMHg2Mzk4LAotICAgIDB4N0E5RiwgMHg2QzkzLCAweDk3NzQsIDB4OEY2MSwgMHg3QUFBLCAweDcxOEEsIDB4OTY4OCwgMHg3QzgyLAotICAgIDB4NjgxNywgMHg3RTcwLCAweDY4NTEsIDB4OTM2QywgMHg1MkYyLCAweDU0MUIsIDB4ODVBQiwgMHg4QTEzLAotICAgIDB4N0ZBNCwgMHg4RUNELCAweDkwRTEsIDB4NTM2NiwgMHg4ODg4LCAweDc5NDEsIDB4NEZDMiwgMHg1MEJFLAotICAgIDB4NTIxMSwgMHg1MTQ0LCAweDU1NTMsIDB4NTcyRCwgMHg3M0VBLCAweDU3OEIsIDB4NTk1MSwgMHg1RjYyLAotICAgIDB4NUY4NCwgMHg2MDc1LCAweDYxNzYsIDB4NjE2NywgMHg2MUE5LCAweDYzQjIsIDB4NjQzQSwgMHg2NTZDLAotICAgIDB4NjY2RiwgMHg2ODQyLCAweDZFMTMsIDB4NzU2NiwgMHg3QTNELCAweDdDRkIsIDB4N0Q0QywgMHg3RDk5LAotICAgIDB4N0U0QiwgMHg3RjZCLCAweDgzMEUsIDB4ODM0QSwgMHg4NkNELCAweDhBMDgsIDB4OEE2MywgMHg4QjY2LAotICAgIDB4OEVGRCwgMHg5ODFBLCAweDlEOEYsIDB4ODJCOCwgMHg4RkNFLCAweDlCRTgsIDB4NTI4NywgMHg2MjFGLAotICAgIDB4NjQ4MywgMHg2RkMwLCAweDk2OTksIDB4Njg0MSwgMHg1MDkxLCAweDZCMjAsIDB4NkM3QSwgMHg2RjU0LAotICAgIDB4N0E3NCwgMHg3RDUwLCAweDg4NDAsIDB4OEEyMywgMHg2NzA4LCAweDRFRjYsIDB4NTAzOSwgMHg1MDI2LAotICAgIDB4NTA2NSwgMHg1MTdDLCAweDUyMzgsIDB4NTI2MywgMHg1NUE3LCAweDU3MEYsIDB4NTgwNSwgMHg1QUNDLAotICAgIDB4NUVGQSwgMHg2MUIyLCAweDYxRjgsIDB4NjJGMywgMHg2MzcyLCAweDY5MUMsIDB4NkEyOSwgMHg3MjdELAotICAgIDB4NzJBQywgMHg3MzJFLCAweDc4MTQsIDB4Nzg2RiwgMHg3RDc5LCAweDc3MEMsIDB4ODBBOSwgMHg4OThCLAotICAgIDB4OEIxOSwgMHg4Q0UyLCAweDhFRDIsIDB4OTA2MywgMHg5Mzc1LCAweDk2N0EsIDB4OTg1NSwgMHg5QTEzLAotICAgIDB4OUU3OCwgMHg1MTQzLCAweDUzOUYsIDB4NTNCMywgMHg1RTdCLCAweDVGMjYsIDB4NkUxQiwgMHg2RTkwLAotICAgIDB4NzM4NCwgMHg3M0ZFLCAweDdENDMsIDB4ODIzNywgMHg4QTAwLCAweDhBRkEsIDB4OTY1MCwgMHg0RTRFLAotICAgIDB4NTAwQiwgMHg1M0U0LCAweDU0N0MsIDB4NTZGQSwgMHg1OUQxLCAweDVCNjQsIDB4NURGMSwgMHg1RUFCLAotICAgIDB4NUYyNywgMHg2MjM4LCAweDY1NDUsIDB4NjdBRiwgMHg2RTU2LCAweDcyRDAsIDB4N0NDQSwgMHg4OEI0LAotICAgIDB4ODBBMSwgMHg4MEUxLCAweDgzRjAsIDB4ODY0RSwgMHg4QTg3LCAweDhERTgsIDB4OTIzNywgMHg5NkM3LAotICAgIDB4OTg2NywgMHg5RjEzLCAweDRFOTQsIDB4NEU5MiwgMHg0RjBELCAweDUzNDgsIDB4NTQ0OSwgMHg1NDNFLAotICAgIDB4NUEyRiwgMHg1RjhDLCAweDVGQTEsIDB4NjA5RiwgMHg2OEE3LCAweDZBOEUsIDB4NzQ1QSwgMHg3ODgxLAotICAgIDB4OEE5RSwgMHg4QUE0LCAweDhCNzcsIDB4OTE5MCwgMHg0RTVFLCAweDlCQzksIDB4NEVBNCwgMHg0RjdDLAotICAgIDB4NEZBRiwgMHg1MDE5LCAweDUwMTYsIDB4NTE0OSwgMHg1MTZDLCAweDUyOUYsIDB4NTJCOSwgMHg1MkZFLAotICAgIDB4NTM5QSwgMHg1M0UzLCAweDU0MTEsIDB4NTQwRSwgMHg1NTg5LCAweDU3NTEsIDB4NTdBMiwgMHg1OTdELAotICAgIDB4NUI1NCwgMHg1QjVELCAweDVCOEYsIDB4NURFNSwgMHg1REU3LCAweDVERjcsIDB4NUU3OCwgMHg1RTgzLAotICAgIDB4NUU5QSwgMHg1RUI3LCAweDVGMTgsIDB4NjA1MiwgMHg2MTRDLCAweDYyOTcsIDB4NjJEOCwgMHg2M0E3LAotICAgIDB4NjUzQiwgMHg2NjAyLCAweDY2NDMsIDB4NjZGNCwgMHg2NzZELCAweDY4MjEsIDB4Njg5NywgMHg2OUNCLAotICAgIDB4NkM1RiwgMHg2RDJBLCAweDZENjksIDB4NkUyRiwgMHg2RTlELCAweDc1MzIsIDB4NzY4NywgMHg3ODZDLAotICAgIDB4N0EzRiwgMHg3Q0UwLCAweDdEMDUsIDB4N0QxOCwgMHg3RDVFLCAweDdEQjEsIDB4ODAxNSwgMHg4MDAzLAotICAgIDB4ODBBRiwgMHg4MEIxLCAweDgxNTQsIDB4ODE4RiwgMHg4MjJBLCAweDgzNTIsIDB4ODg0QywgMHg4ODYxLAotICAgIDB4OEIxQiwgMHg4Q0EyLCAweDhDRkMsIDB4OTBDQSwgMHg5MTc1LCAweDkyNzEsIDB4NzgzRiwgMHg5MkZDLAotICAgIDB4OTVBNCwgMHg5NjRELCAweDk4MDUsIDB4OTk5OSwgMHg5QUQ4LCAweDlEM0IsIDB4NTI1QiwgMHg1MkFCLAotICAgIDB4NTNGNywgMHg1NDA4LCAweDU4RDUsIDB4NjJGNywgMHg2RkUwLCAweDhDNkEsIDB4OEY1RiwgMHg5RUI5LAotICAgIDB4NTE0QiwgMHg1MjNCLCAweDU0NEEsIDB4NTZGRCwgMHg3QTQwLCAweDkxNzcsIDB4OUQ2MCwgMHg5RUQyLAotICAgIDB4NzM0NCwgMHg2RjA5LCAweDgxNzAsIDB4NzUxMSwgMHg1RkZELCAweDYwREEsIDB4OUFBOCwgMHg3MkRCLAotICAgIDB4OEZCQywgMHg2QjY0LCAweDk4MDMsIDB4NEVDQSwgMHg1NkYwLCAweDU3NjQsIDB4NThCRSwgMHg1QTVBLAotICAgIDB4NjA2OCwgMHg2MUM3LCAweDY2MEYsIDB4NjYwNiwgMHg2ODM5LCAweDY4QjEsIDB4NkRGNywgMHg3NUQ1LAotICAgIDB4N0QzQSwgMHg4MjZFLCAweDlCNDIsIDB4NEU5QiwgMHg0RjUwLCAweDUzQzksIDB4NTUwNiwgMHg1RDZGLAotICAgIDB4NURFNiwgMHg1REVFLCAweDY3RkIsIDB4NkM5OSwgMHg3NDczLCAweDc4MDIsIDB4OEE1MCwgMHg5Mzk2LAotICAgIDB4ODhERiwgMHg1NzUwLCAweDVFQTcsIDB4NjMyQiwgMHg1MEI1LCAweDUwQUMsIDB4NTE4RCwgMHg2NzAwLAotICAgIDB4NTRDOSwgMHg1ODVFLCAweDU5QkIsIDB4NUJCMCwgMHg1RjY5LCAweDYyNEQsIDB4NjNBMSwgMHg2ODNELAotICAgIDB4NkI3MywgMHg2RTA4LCAweDcwN0QsIDB4OTFDNywgMHg3MjgwLCAweDc4MTUsIDB4NzgyNiwgMHg3OTZELAotICAgIDB4NjU4RSwgMHg3RDMwLCAweDgzREMsIDB4ODhDMSwgMHg4RjA5LCAweDk2OUIsIDB4NTI2NCwgMHg1NzI4LAotICAgIDB4Njc1MCwgMHg3RjZBLCAweDhDQTEsIDB4NTFCNCwgMHg1NzQyLCAweDk2MkEsIDB4NTgzQSwgMHg2OThBLAotICAgIDB4ODBCNCwgMHg1NEIyLCAweDVEMEUsIDB4NTdGQywgMHg3ODk1LCAweDlERkEsIDB4NEY1QywgMHg1MjRBLAotICAgIDB4NTQ4QiwgMHg2NDNFLCAweDY2MjgsIDB4NjcxNCwgMHg2N0Y1LCAweDdBODQsIDB4N0I1NiwgMHg3RDIyLAotICAgIDB4OTMyRiwgMHg2ODVDLCAweDlCQUQsIDB4N0IzOSwgMHg1MzE5LCAweDUxOEEsIDB4NTIzNywgMHg1QkRGLAotICAgIDB4NjJGNiwgMHg2NEFFLCAweDY0RTYsIDB4NjcyRCwgMHg2QkJBLCAweDg1QTksIDB4OTZEMSwgMHg3NjkwLAotICAgIDB4OUJENiwgMHg2MzRDLCAweDkzMDYsIDB4OUJBQiwgMHg3NkJGLCAweDY2NTIsIDB4NEUwOSwgMHg1MDk4LAotICAgIDB4NTNDMiwgMHg1QzcxLCAweDYwRTgsIDB4NjQ5MiwgMHg2NTYzLCAweDY4NUYsIDB4NzFFNiwgMHg3M0NBLAotICAgIDB4NzUyMywgMHg3Qjk3LCAweDdFODIsIDB4ODY5NSwgMHg4QjgzLCAweDhDREIsIDB4OTE3OCwgMHg5OTEwLAotICAgIDB4NjVBQywgMHg2NkFCLCAweDZCOEIsIDB4NEVENSwgMHg0RUQ0LCAweDRGM0EsIDB4NEY3RiwgMHg1MjNBLAotICAgIDB4NTNGOCwgMHg1M0YyLCAweDU1RTMsIDB4NTZEQiwgMHg1OEVCLCAweDU5Q0IsIDB4NTlDOSwgMHg1OUZGLAotICAgIDB4NUI1MCwgMHg1QzRELCAweDVFMDIsIDB4NUUyQiwgMHg1RkQ3LCAweDYwMUQsIDB4NjMwNywgMHg2NTJGLAotICAgIDB4NUI1QywgMHg2NUFGLCAweDY1QkQsIDB4NjVFOCwgMHg2NzlELCAweDZCNjIsIDB4NkI3QiwgMHg2QzBGLAotICAgIDB4NzM0NSwgMHg3OTQ5LCAweDc5QzEsIDB4N0NGOCwgMHg3RDE5LCAweDdEMkIsIDB4ODBBMiwgMHg4MTAyLAotICAgIDB4ODFGMywgMHg4OTk2LCAweDhBNUUsIDB4OEE2OSwgMHg4QTY2LCAweDhBOEMsIDB4OEFFRSwgMHg4Q0M3LAotICAgIDB4OENEQywgMHg5NkNDLCAweDk4RkMsIDB4NkI2RiwgMHg0RThCLCAweDRGM0MsIDB4NEY4RCwgMHg1MTUwLAotICAgIDB4NUI1NywgMHg1QkZBLCAweDYxNDgsIDB4NjMwMSwgMHg2NjQyLCAweDZCMjEsIDB4NkVDQiwgMHg2Q0JCLAotICAgIDB4NzIzRSwgMHg3NEJELCAweDc1RDQsIDB4NzhDMSwgMHg3OTNBLCAweDgwMEMsIDB4ODAzMywgMHg4MUVBLAotICAgIDB4ODQ5NCwgMHg4RjlFLCAweDZDNTAsIDB4OUU3RiwgMHg1RjBGLCAweDhCNTgsIDB4OUQyQiwgMHg3QUZBLAotICAgIDB4OEVGOCwgMHg1QjhELCAweDk2RUIsIDB4NEUwMywgMHg1M0YxLCAweDU3RjcsIDB4NTkzMSwgMHg1QUM5LAotICAgIDB4NUJBNCwgMHg2MDg5LCAweDZFN0YsIDB4NkYwNiwgMHg3NUJFLCAweDhDRUEsIDB4NUI5RiwgMHg4NTAwLAotICAgIDB4N0JFMCwgMHg1MDcyLCAweDY3RjQsIDB4ODI5RCwgMHg1QzYxLCAweDg1NEEsIDB4N0UxRSwgMHg4MjBFLAotICAgIDB4NTE5OSwgMHg1QzA0LCAweDYzNjgsIDB4OEQ2NiwgMHg2NTlDLCAweDcxNkUsIDB4NzkzRSwgMHg3RDE3LAotICAgIDB4ODAwNSwgMHg4QjFELCAweDhFQ0EsIDB4OTA2RSwgMHg4NkM3LCAweDkwQUEsIDB4NTAxRiwgMHg1MkZBLAotICAgIDB4NUMzQSwgMHg2NzUzLCAweDcwN0MsIDB4NzIzNSwgMHg5MTRDLCAweDkxQzgsIDB4OTMyQiwgMHg4MkU1LAotICAgIDB4NUJDMiwgMHg1RjMxLCAweDYwRjksIDB4NEUzQiwgMHg1M0Q2LCAweDVCODgsIDB4NjI0QiwgMHg2NzMxLAotICAgIDB4NkI4QSwgMHg3MkU5LCAweDczRTAsIDB4N0EyRSwgMHg4MTZCLCAweDhEQTMsIDB4OTE1MiwgMHg5OTk2LAotICAgIDB4NTExMiwgMHg1M0Q3LCAweDU0NkEsIDB4NUJGRiwgMHg2Mzg4LCAweDZBMzksIDB4N0RBQywgMHg5NzAwLAotICAgIDB4NTZEQSwgMHg1M0NFLCAweDU0NjgsIDB4NUI5NywgMHg1QzMxLCAweDVEREUsIDB4NEZFRSwgMHg2MTAxLAotICAgIDB4NjJGRSwgMHg2RDMyLCAweDc5QzAsIDB4NzlDQiwgMHg3RDQyLCAweDdFNEQsIDB4N0ZEMiwgMHg4MUVELAotICAgIDB4ODIxRiwgMHg4NDkwLCAweDg4NDYsIDB4ODk3MiwgMHg4QjkwLCAweDhFNzQsIDB4OEYyRiwgMHg5MDMxLAotICAgIDB4OTE0QiwgMHg5MTZDLCAweDk2QzYsIDB4OTE5QywgMHg0RUMwLCAweDRGNEYsIDB4NTE0NSwgMHg1MzQxLAotICAgIDB4NUY5MywgMHg2MjBFLCAweDY3RDQsIDB4NkM0MSwgMHg2RTBCLCAweDczNjMsIDB4N0UyNiwgMHg5MUNELAotICAgIDB4OTI4MywgMHg1M0Q0LCAweDU5MTksIDB4NUJCRiwgMHg2REQxLCAweDc5NUQsIDB4N0UyRSwgMHg3QzlCLAotICAgIDB4NTg3RSwgMHg3MTlGLCAweDUxRkEsIDB4ODg1MywgMHg4RkYwLCAweDRGQ0EsIDB4NUNGQiwgMHg2NjI1LAotICAgIDB4NzdBQywgMHg3QUUzLCAweDgyMUMsIDB4OTlGRiwgMHg1MUM2LCAweDVGQUEsIDB4NjVFQywgMHg2OTZGLAotICAgIDB4NkI4OSwgMHg2REYzLCAweDZFOTYsIDB4NkY2NCwgMHg3NkZFLCAweDdEMTQsIDB4NURFMSwgMHg5MDc1LAotICAgIDB4OTE4NywgMHg5ODA2LCAweDUxRTYsIDB4NTIxRCwgMHg2MjQwLCAweDY2OTEsIDB4NjZEOSwgMHg2RTFBLAotICAgIDB4NUVCNiwgMHg3REQyLCAweDdGNzIsIDB4NjZGOCwgMHg4NUFGLCAweDg1RjcsIDB4OEFGOCwgMHg1MkE5LAotICAgIDB4NTNEOSwgMHg1OTczLCAweDVFOEYsIDB4NUY5MCwgMHg2MDU1LCAweDkyRTQsIDB4OTY2NCwgMHg1MEI3LAotICAgIDB4NTExRiwgMHg1MkRELCAweDUzMjAsIDB4NTM0NywgMHg1M0VDLCAweDU0RTgsIDB4NTU0NiwgMHg1NTMxLAotICAgIDB4NTYxNywgMHg1OTY4LCAweDU5QkUsIDB4NUEzQywgMHg1QkI1LCAweDVDMDYsIDB4NUMwRiwgMHg1QzExLAotICAgIDB4NUMxQSwgMHg1RTg0LCAweDVFOEEsIDB4NUVFMCwgMHg1RjcwLCAweDYyN0YsIDB4NjI4NCwgMHg2MkRCLAotICAgIDB4NjM4QywgMHg2Mzc3LCAweDY2MDcsIDB4NjYwQywgMHg2NjJELCAweDY2NzYsIDB4Njc3RSwgMHg2OEEyLAotICAgIDB4NkExRiwgMHg2QTM1LCAweDZDQkMsIDB4NkQ4OCwgMHg2RTA5LCAweDZFNTgsIDB4NzEzQywgMHg3MTI2LAotICAgIDB4NzE2NywgMHg3NUM3LCAweDc3MDEsIDB4Nzg1RCwgMHg3OTAxLCAweDc5NjUsIDB4NzlGMCwgMHg3QUUwLAotICAgIDB4N0IxMSwgMHg3Q0E3LCAweDdEMzksIDB4ODA5NiwgMHg4M0Q2LCAweDg0OEIsIDB4ODU0OSwgMHg4ODVELAotICAgIDB4ODhGMywgMHg4QTFGLCAweDhBM0MsIDB4OEE1NCwgMHg4QTczLCAweDhDNjEsIDB4OENERSwgMHg5MUE0LAotICAgIDB4OTI2NiwgMHg5MzdFLCAweDk0MTgsIDB4OTY5QywgMHg5Nzk4LCAweDRFMEEsIDB4NEUwOCwgMHg0RTFFLAotICAgIDB4NEU1NywgMHg1MTk3LCAweDUyNzAsIDB4NTdDRSwgMHg1ODM0LCAweDU4Q0MsIDB4NUIyMiwgMHg1RTM4LAotICAgIDB4NjBDNSwgMHg2NEZFLCAweDY3NjEsIDB4Njc1NiwgMHg2RDQ0LCAweDcyQjYsIDB4NzU3MywgMHg3QTYzLAotICAgIDB4ODRCOCwgMHg4QjcyLCAweDkxQjgsIDB4OTMyMCwgMHg1NjMxLCAweDU3RjQsIDB4OThGRSwgMHg2MkVELAotICAgIDB4NjkwRCwgMHg2Qjk2LCAweDcxRUQsIDB4N0U1NCwgMHg4MDc3LCAweDgyNzIsIDB4ODlFNiwgMHg5OERGLAotICAgIDB4ODc1NSwgMHg4RkIxLCAweDVDM0IsIDB4NEYzOCwgMHg0RkUxLCAweDRGQjUsIDB4NTUwNywgMHg1QTIwLAotICAgIDB4NUJERCwgMHg1QkU5LCAweDVGQzMsIDB4NjE0RSwgMHg2MzJGLCAweDY1QjAsIDB4NjY0QiwgMHg2OEVFLAotICAgIDB4Njk5QiwgMHg2RDc4LCAweDZERjEsIDB4NzUzMywgMHg3NUI5LCAweDc3MUYsIDB4Nzk1RSwgMHg3OUU2LAotICAgIDB4N0QzMywgMHg4MUUzLCAweDgyQUYsIDB4ODVBQSwgMHg4OUFBLCAweDhBM0EsIDB4OEVBQiwgMHg4RjlCLAotICAgIDB4OTAzMiwgMHg5MURELCAweDk3MDcsIDB4NEVCQSwgMHg0RUMxLCAweDUyMDMsIDB4NTg3NSwgMHg1OEVDLAotICAgIDB4NUMwQiwgMHg3NTFBLCAweDVDM0QsIDB4ODE0RSwgMHg4QTBBLCAweDhGQzUsIDB4OTY2MywgMHg5NzZELAotICAgIDB4N0IyNSwgMHg4QUNGLCAweDk4MDgsIDB4OTE2MiwgMHg1NkYzLCAweDUzQTgsIDB4OTAxNywgMHg1NDM5LAotICAgIDB4NTc4MiwgMHg1RTI1LCAweDYzQTgsIDB4NkMzNCwgMHg3MDhBLCAweDc3NjEsIDB4N0M4QiwgMHg3RkUwLAotICAgIDB4ODg3MCwgMHg5MDQyLCAweDkxNTQsIDB4OTMxMCwgMHg5MzE4LCAweDk2OEYsIDB4NzQ1RSwgMHg5QUM0LAotICAgIDB4NUQwNywgMHg1RDY5LCAweDY1NzAsIDB4NjdBMiwgMHg4REE4LCAweDk2REIsIDB4NjM2RSwgMHg2NzQ5LAotICAgIDB4NjkxOSwgMHg4M0M1LCAweDk4MTcsIDB4OTZDMCwgMHg4OEZFLCAweDZGODQsIDB4NjQ3QSwgMHg1QkY4LAotICAgIDB4NEUxNiwgMHg3MDJDLCAweDc1NUQsIDB4NjYyRiwgMHg1MUM0LCAweDUyMzYsIDB4NTJFMiwgMHg1OUQzLAotICAgIDB4NUY4MSwgMHg2MDI3LCAweDYyMTAsIDB4NjUzRiwgMHg2NTc0LCAweDY2MUYsIDB4NjY3NCwgMHg2OEYyLAotICAgIDB4NjgxNiwgMHg2QjYzLCAweDZFMDUsIDB4NzI3MiwgMHg3NTFGLCAweDc2REIsIDB4N0NCRSwgMHg4MDU2LAotICAgIDB4NThGMCwgMHg4OEZELCAweDg5N0YsIDB4OEFBMCwgMHg4QTkzLCAweDhBQ0IsIDB4OTAxRCwgMHg5MTkyLAotICAgIDB4OTc1MiwgMHg5NzU5LCAweDY1ODksIDB4N0EwRSwgMHg4MTA2LCAweDk2QkIsIDB4NUUyRCwgMHg2MERDLAotICAgIDB4NjIxQSwgMHg2NUE1LCAweDY2MTQsIDB4Njc5MCwgMHg3N0YzLCAweDdBNEQsIDB4N0M0RCwgMHg3RTNFLAotICAgIDB4ODEwQSwgMHg4Q0FDLCAweDhENjQsIDB4OERFMSwgMHg4RTVGLCAweDc4QTksIDB4NTIwNywgMHg2MkQ5LAotICAgIDB4NjNBNSwgMHg2NDQyLCAweDYyOTgsIDB4OEEyRCwgMHg3QTgzLCAweDdCQzAsIDB4OEFBQywgMHg5NkVBLAotICAgIDB4N0Q3NiwgMHg4MjBDLCAweDg3NDksIDB4NEVEOSwgMHg1MTQ4LCAweDUzNDMsIDB4NTM2MCwgMHg1QkEzLAotICAgIDB4NUMwMiwgMHg1QzE2LCAweDVEREQsIDB4NjIyNiwgMHg2MjQ3LCAweDY0QjAsIDB4NjgxMywgMHg2ODM0LAotICAgIDB4NkNDOSwgMHg2RDQ1LCAweDZEMTcsIDB4NjdEMywgMHg2RjVDLCAweDcxNEUsIDB4NzE3RCwgMHg2NUNCLAotICAgIDB4N0E3RiwgMHg3QkFELCAweDdEREEsIDB4N0U0QSwgMHg3RkE4LCAweDgxN0EsIDB4ODIxQiwgMHg4MjM5LAotICAgIDB4ODVBNiwgMHg4QTZFLCAweDhDQ0UsIDB4OERGNSwgMHg5MDc4LCAweDkwNzcsIDB4OTJBRCwgMHg5MjkxLAotICAgIDB4OTU4MywgMHg5QkFFLCAweDUyNEQsIDB4NTU4NCwgMHg2RjM4LCAweDcxMzYsIDB4NTE2OCwgMHg3OTg1LAotICAgIDB4N0U1NSwgMHg4MUIzLCAweDdDQ0UsIDB4NTY0QywgMHg1ODUxLCAweDVDQTgsIDB4NjNBQSwgMHg2NkZFLAotICAgIDB4NjZGRCwgMHg2OTVBLCAweDcyRDksIDB4NzU4RiwgMHg3NThFLCAweDc5MEUsIDB4Nzk1NiwgMHg3OURGLAotICAgIDB4N0M5NywgMHg3RDIwLCAweDdENDQsIDB4ODYwNywgMHg4QTM0LCAweDk2M0IsIDB4OTA2MSwgMHg5RjIwLAotICAgIDB4NTBFNywgMHg1Mjc1LCAweDUzQ0MsIDB4NTNFMiwgMHg1MDA5LCAweDU1QUEsIDB4NThFRSwgMHg1OTRGLAotICAgIDB4NzIzRCwgMHg1QjhCLCAweDVDNjQsIDB4NTMxRCwgMHg2MEUzLCAweDYwRjMsIDB4NjM1QywgMHg2MzgzLAotICAgIDB4NjMzRiwgMHg2M0JCLCAweDY0Q0QsIDB4NjVFOSwgMHg2NkY5LCAweDVERTMsIDB4NjlDRCwgMHg2OUZELAotICAgIDB4NkYxNSwgMHg3MUU1LCAweDRFODksIDB4NzVFOSwgMHg3NkY4LCAweDdBOTMsIDB4N0NERiwgMHg3RENGLAotICAgIDB4N0Q5QywgMHg4MDYxLCAweDgzNDksIDB4ODM1OCwgMHg4NDZDLCAweDg0QkMsIDB4ODVGQiwgMHg4OEM1LAotICAgIDB4OEQ3MCwgMHg5MDAxLCAweDkwNkQsIDB4OTM5NywgMHg5NzFDLCAweDlBMTIsIDB4NTBDRiwgMHg1ODk3LAotICAgIDB4NjE4RSwgMHg4MUQzLCAweDg1MzUsIDB4OEQwOCwgMHg5MDIwLCAweDRGQzMsIDB4NTA3NCwgMHg1MjQ3LAotICAgIDB4NTM3MywgMHg2MDZGLCAweDYzNDksIDB4Njc1RiwgMHg2RTJDLCAweDhEQjMsIDB4OTAxRiwgMHg0RkQ3LAotICAgIDB4NUM1RSwgMHg4Q0NBLCAweDY1Q0YsIDB4N0Q5QSwgMHg1MzUyLCAweDg4OTYsIDB4NTE3NiwgMHg2M0MzLAotICAgIDB4NUI1OCwgMHg1QjZCLCAweDVDMEEsIDB4NjQwRCwgMHg2NzUxLCAweDkwNUMsIDB4NEVENiwgMHg1OTFBLAotICAgIDB4NTkyQSwgMHg2QzcwLCAweDhBNTEsIDB4NTUzRSwgMHg1ODE1LCAweDU5QTUsIDB4NjBGMCwgMHg2MjUzLAotICAgIDB4NjdDMSwgMHg4MjM1LCAweDY5NTUsIDB4OTY0MCwgMHg5OUM0LCAweDlBMjgsIDB4NEY1MywgMHg1ODA2LAotICAgIDB4NUJGRSwgMHg4MDEwLCAweDVDQjEsIDB4NUUyRiwgMHg1Rjg1LCAweDYwMjAsIDB4NjE0QiwgMHg2MjM0LAotICAgIDB4NjZGRiwgMHg2Q0YwLCAweDZFREUsIDB4ODBDRSwgMHg4MTdGLCAweDgyRDQsIDB4ODg4QiwgMHg4Q0I4LAotICAgIDB4OTAwMCwgMHg5MDJFLCAweDk2OEEsIDB4OUVEQiwgMHg5QkRCLCAweDRFRTMsIDB4NTNGMCwgMHg1OTI3LAotICAgIDB4N0IyQywgMHg5MThELCAweDk4NEMsIDB4OURGOSwgMHg2RURELCAweDcwMjcsIDB4NTM1MywgMHg1NTQ0LAotICAgIDB4NUI4NSwgMHg2MjU4LCAweDYyOUUsIDB4NjJEMywgMHg2Q0EyLCAweDZGRUYsIDB4NzQyMiwgMHg4QTE3LAotICAgIDB4OTQzOCwgMHg2RkMxLCAweDhBRkUsIDB4ODMzOCwgMHg1MUU3LCAweDg2RjgsIDB4NTNFQSwgMHg1M0U5LAotICAgIDB4NEY0NiwgMHg5MDU0LCAweDhGQjAsIDB4NTk2QSwgMHg4MTMxLCAweDVERkQsIDB4N0FFQSwgMHg4RkJGLAotICAgIDB4NjhEQSwgMHg4QzM3LCAweDcyRjgsIDB4OUM0OCwgMHg2QTNELCAweDhBQjAsIDB4NEUzOSwgMHg1MzU4LAotICAgIDB4NTYwNiwgMHg1NzY2LCAweDYyQzUsIDB4NjNBMiwgMHg2NUU2LCAweDZCNEUsIDB4NkRFMSwgMHg2RTVCLAotICAgIDB4NzBBRCwgMHg3N0VELCAweDdBRUYsIDB4N0JBQSwgMHg3REJCLCAweDgwM0QsIDB4ODBDNiwgMHg4NkNCLAotICAgIDB4OEE5NSwgMHg5MzVCLCAweDU2RTMsIDB4NThDNywgMHg1RjNFLCAweDY1QUQsIDB4NjY5NiwgMHg2QTgwLAotICAgIDB4NkJCNSwgMHg3NTM3LCAweDhBQzcsIDB4NTAyNCwgMHg3N0U1LCAweDU3MzAsIDB4NUYxQiwgMHg2MDY1LAotICAgIDB4NjY3QSwgMHg2QzYwLCAweDc1RjQsIDB4N0ExQSwgMHg3RjZFLCAweDgxRjQsIDB4ODcxOCwgMHg5MDQ1LAotICAgIDB4OTlCMywgMHg3QkM5LCAweDc1NUMsIDB4N0FGOSwgMHg3QjUxLCAweDg0QzQsIDB4OTAxMCwgMHg3OUU5LAotICAgIDB4N0E5MiwgMHg4MzM2LCAweDVBRTEsIDB4Nzc0MCwgMHg0RTJELCAweDRFRjIsIDB4NUI5OSwgMHg1RkUwLAotICAgIDB4NjJCRCwgMHg2NjNDLCAweDY3RjEsIDB4NkNFOCwgMHg4NjZCLCAweDg4NzcsIDB4OEEzQiwgMHg5MTRFLAotICAgIDB4OTJGMywgMHg5OUQwLCAweDZBMTcsIDB4NzAyNiwgMHg3MzJBLCAweDgyRTcsIDB4ODQ1NywgMHg4Q0FGLAotICAgIDB4NEUwMSwgMHg1MTQ2LCAweDUxQ0IsIDB4NTU4QiwgMHg1QkY1LCAweDVFMTYsIDB4NUUzMywgMHg1RTgxLAotICAgIDB4NUYxNCwgMHg1RjM1LCAweDVGNkIsIDB4NUZCNCwgMHg2MUYyLCAweDYzMTEsIDB4NjZBMiwgMHg2NzFELAotICAgIDB4NkY2RSwgMHg3MjUyLCAweDc1M0EsIDB4NzczQSwgMHg4MDc0LCAweDgxMzksIDB4ODE3OCwgMHg4Nzc2LAotICAgIDB4OEFCRiwgMHg4QURDLCAweDhEODUsIDB4OERGMywgMHg5MjlBLCAweDk1NzcsIDB4OTgwMiwgMHg5Q0U1LAotICAgIDB4NTJDNSwgMHg2MzU3LCAweDc2RjQsIDB4NjcxNSwgMHg2Qzg4LCAweDczQ0QsIDB4OENDMywgMHg5M0FFLAotICAgIDB4OTY3MywgMHg2RDI1LCAweDU4OUMsIDB4NjkwRSwgMHg2OUNDLCAweDhGRkQsIDB4OTM5QSwgMHg3NURCLAotICAgIDB4OTAxQSwgMHg1ODVBLCAweDY4MDIsIDB4NjNCNCwgMHg2OUZCLCAweDRGNDMsIDB4NkYyQywgMHg2N0Q4LAotICAgIDB4OEZCQiwgMHg4NTI2LCAweDdEQjQsIDB4OTM1NCwgMHg2OTNGLCAweDZGNzAsIDB4NTc2QSwgMHg1OEY3LAotICAgIDB4NUIyQywgMHg3RDJDLCAweDcyMkEsIDB4NTQwQSwgMHg5MUUzLCAweDlEQjQsIDB4NEVBRCwgMHg0RjRFLAotICAgIDB4NTA1QywgMHg1MDc1LCAweDUyNDMsIDB4OEM5RSwgMHg1NDQ4LCAweDU4MjQsIDB4NUI5QSwgMHg1RTFELAotICAgIDB4NUU5NSwgMHg1RUFELCAweDVFRjcsIDB4NUYxRiwgMHg2MDhDLCAweDYyQjUsIDB4NjMzQSwgMHg2M0QwLAotICAgIDB4NjhBRiwgMHg2QzQwLCAweDc4ODcsIDB4Nzk4RSwgMHg3QTBCLCAweDdERTAsIDB4ODI0NywgMHg4QTAyLAotICAgIDB4OEFFNiwgMHg4RTQ0LCAweDkwMTMsIDB4OTBCOCwgMHg5MTJELCAweDkxRDgsIDB4OUYwRSwgMHg2Q0U1LAotICAgIDB4NjQ1OCwgMHg2NEUyLCAweDY1NzUsIDB4NkVGNCwgMHg3Njg0LCAweDdCMUIsIDB4OTA2OSwgMHg5M0QxLAotICAgIDB4NkVCQSwgMHg1NEYyLCAweDVGQjksIDB4NjRBNCwgMHg4RjRELCAweDhGRUQsIDB4OTI0NCwgMHg1MTc4LAotICAgIDB4NTg2QiwgMHg1OTI5LCAweDVDNTUsIDB4NUU5NywgMHg2REZCLCAweDdFOEYsIDB4NzUxQywgMHg4Q0JDLAotICAgIDB4OEVFMiwgMHg5ODVCLCAweDcwQjksIDB4NEYxRCwgMHg2QkJGLCAweDZGQjEsIDB4NzUzMCwgMHg5NkZCLAotICAgIDB4NTE0RSwgMHg1NDEwLCAweDU4MzUsIDB4NTg1NywgMHg1OUFDLCAweDVDNjAsIDB4NUY5MiwgMHg2NTk3LAotICAgIDB4Njc1QywgMHg2RTIxLCAweDc2N0IsIDB4ODNERiwgMHg4Q0VELCAweDkwMTQsIDB4OTBGRCwgMHg5MzRELAotICAgIDB4NzgyNSwgMHg3ODNBLCAweDUyQUEsIDB4NUVBNiwgMHg1NzFGLCAweDU5NzQsIDB4NjAxMiwgMHg1MDEyLAotICAgIDB4NTE1QSwgMHg1MUFDLCAweDUxQ0QsIDB4NTIwMCwgMHg1NTEwLCAweDU4NTQsIDB4NTg1OCwgMHg1OTU3LAotICAgIDB4NUI5NSwgMHg1Q0Y2LCAweDVEOEIsIDB4NjBCQywgMHg2Mjk1LCAweDY0MkQsIDB4Njc3MSwgMHg2ODQzLAotICAgIDB4NjhCQywgMHg2OERGLCAweDc2RDcsIDB4NkREOCwgMHg2RTZGLCAweDZEOUIsIDB4NzA2RiwgMHg3MUM4LAotICAgIDB4NUY1MywgMHg3NUQ4LCAweDc5NzcsIDB4N0I0OSwgMHg3QjU0LCAweDdCNTIsIDB4N0NENiwgMHg3RDcxLAotICAgIDB4NTIzMCwgMHg4NDYzLCAweDg1NjksIDB4ODVFNCwgMHg4QTBFLCAweDhCMDQsIDB4OEM0NiwgMHg4RTBGLAotICAgIDB4OTAwMywgMHg5MDBGLCAweDk0MTksIDB4OTY3NiwgMHg5ODJELCAweDlBMzAsIDB4OTVEOCwgMHg1MENELAotICAgIDB4NTJENSwgMHg1NDBDLCAweDU4MDIsIDB4NUMwRSwgMHg2MUE3LCAweDY0OUUsIDB4NkQxRSwgMHg3N0IzLAotICAgIDB4N0FFNSwgMHg4MEY0LCAweDg0MDQsIDB4OTA1MywgMHg5Mjg1LCAweDVDRTAsIDB4OUQwNywgMHg1MzNGLAotICAgIDB4NUY5NywgMHg1RkIzLCAweDZEOUMsIDB4NzI3OSwgMHg3NzYzLCAweDc5QkYsIDB4N0JFNCwgMHg2QkQyLAotICAgIDB4NzJFQywgMHg4QUFELCAweDY4MDMsIDB4NkE2MSwgMHg1MUY4LCAweDdBODEsIDB4NjkzNCwgMHg1QzRBLAotICAgIDB4OUNGNiwgMHg4MkVCLCAweDVCQzUsIDB4OTE0OSwgMHg3MDFFLCAweDU2NzgsIDB4NUM2RiwgMHg2MEM3LAotICAgIDB4NjU2NiwgMHg2QzhDLCAweDhDNUEsIDB4OTA0MSwgMHg5ODEzLCAweDU0NTEsIDB4NjZDNywgMHg5MjBELAotICAgIDB4NTk0OCwgMHg5MEEzLCAweDUxODUsIDB4NEU0RCwgMHg1MUVBLCAweDg1OTksIDB4OEIwRSwgMHg3MDU4LAotICAgIDB4NjM3QSwgMHg5MzRCLCAweDY5NjIsIDB4OTlCNCwgMHg3RTA0LCAweDc1NzcsIDB4NTM1NywgMHg2OTYwLAotICAgIDB4OEVERiwgMHg5NkUzLCAweDZDNUQsIDB4NEU4QywgMHg1QzNDLCAweDVGMTAsIDB4OEZFOSwgMHg1MzAyLAotICAgIDB4OENEMSwgMHg4MDg5LCAweDg2NzksIDB4NUVGRiwgMHg2NUU1LCAweDRFNzMsIDB4NTE2NSwgMHg1OTgyLAotICAgIDB4NUMzRiwgMHg5N0VFLCAweDRFRkIsIDB4NTk4QSwgMHg1RkNELCAweDhBOEQsIDB4NkZFMSwgMHg3OUIwLAotICAgIDB4Nzk2MiwgMHg1QkU3LCAweDg0NzEsIDB4NzMyQiwgMHg3MUIxLCAweDVFNzQsIDB4NUZGNSwgMHg2MzdCLAotICAgIDB4NjQ5QSwgMHg3MUMzLCAweDdDOTgsIDB4NEU0MywgMHg1RUZDLCAweDRFNEIsIDB4NTdEQywgMHg1NkEyLAotICAgIDB4NjBBOSwgMHg2RkMzLCAweDdEMEQsIDB4ODBGRCwgMHg4MTMzLCAweDgxQkYsIDB4OEZCMiwgMHg4OTk3LAotICAgIDB4ODZBNCwgMHg1REY0LCAweDYyOEEsIDB4NjRBRCwgMHg4OTg3LCAweDY3NzcsIDB4NkNFMiwgMHg2RDNFLAotICAgIDB4NzQzNiwgMHg3ODM0LCAweDVBNDYsIDB4N0Y3NSwgMHg4MkFELCAweDk5QUMsIDB4NEZGMywgMHg1RUMzLAotICAgIDB4NjJERCwgMHg2MzkyLCAweDY1NTcsIDB4Njc2RiwgMHg3NkMzLCAweDcyNEMsIDB4ODBDQywgMHg4MEJBLAotICAgIDB4OEYyOSwgMHg5MTRELCAweDUwMEQsIDB4NTdGOSwgMHg1QTkyLCAweDY4ODUsIDB4Njk3MywgMHg3MTY0LAotICAgIDB4NzJGRCwgMHg4Q0I3LCAweDU4RjIsIDB4OENFMCwgMHg5NjZBLCAweDkwMTksIDB4ODc3RiwgMHg3OUU0LAotICAgIDB4NzdFNywgMHg4NDI5LCAweDRGMkYsIDB4NTI2NSwgMHg1MzVBLCAweDYyQ0QsIDB4NjdDRiwgMHg2Q0NBLAotICAgIDB4NzY3RCwgMHg3Qjk0LCAweDdDOTUsIDB4ODIzNiwgMHg4NTg0LCAweDhGRUIsIDB4NjZERCwgMHg2RjIwLAotICAgIDB4NzIwNiwgMHg3RTFCLCAweDgzQUIsIDB4OTlDMSwgMHg5RUE2LCAweDUxRkQsIDB4N0JCMSwgMHg3ODcyLAotICAgIDB4N0JCOCwgMHg4MDg3LCAweDdCNDgsIDB4NkFFOCwgMHg1RTYxLCAweDgwOEMsIDB4NzU1MSwgMHg3NTYwLAotICAgIDB4NTE2QiwgMHg5MjYyLCAweDZFOEMsIDB4NzY3QSwgMHg5MTk3LCAweDlBRUEsIDB4NEYxMCwgMHg3RjcwLAotICAgIDB4NjI5QywgMHg3QjRGLCAweDk1QTUsIDB4OUNFOSwgMHg1NjdBLCAweDU4NTksIDB4ODZFNCwgMHg5NkJDLAotICAgIDB4NEYzNCwgMHg1MjI0LCAweDUzNEEsIDB4NTNDRCwgMHg1M0RCLCAweDVFMDYsIDB4NjQyQywgMHg2NTkxLAotICAgIDB4Njc3RiwgMHg2QzNFLCAweDZDNEUsIDB4NzI0OCwgMHg3MkFGLCAweDczRUQsIDB4NzU1NCwgMHg3RTQxLAotICAgIDB4ODIyQywgMHg4NUU5LCAweDhDQTksIDB4N0JDNCwgMHg5MUM2LCAweDcxNjksIDB4OTgxMiwgMHg5OEVGLAotICAgIDB4NjMzRCwgMHg2NjY5LCAweDc1NkEsIDB4NzZFNCwgMHg3OEQwLCAweDg1NDMsIDB4ODZFRSwgMHg1MzJBLAotICAgIDB4NTM1MSwgMHg1NDI2LCAweDU5ODMsIDB4NUU4NywgMHg1RjdDLCAweDYwQjIsIDB4NjI0OSwgMHg2Mjc5LAotICAgIDB4NjJBQiwgMHg2NTkwLCAweDZCRDQsIDB4NkNDQywgMHg3NUIyLCAweDc2QUUsIDB4Nzg5MSwgMHg3OUQ4LAotICAgIDB4N0RDQiwgMHg3Rjc3LCAweDgwQTUsIDB4ODhBQiwgMHg4QUI5LCAweDhDQkIsIDB4OTA3RiwgMHg5NzVFLAotICAgIDB4OThEQiwgMHg2QTBCLCAweDdDMzgsIDB4NTA5OSwgMHg1QzNFLCAweDVGQUUsIDB4Njc4NywgMHg2QkQ4LAotICAgIDB4NzQzNSwgMHg3NzA5LCAweDdGOEUsIDB4OUYzQiwgMHg2N0NBLCAweDdBMTcsIDB4NTMzOSwgMHg3NThCLAotICAgIDB4OUFFRCwgMHg1RjY2LCAweDgxOUQsIDB4ODNGMSwgMHg4MDk4LCAweDVGM0MsIDB4NUZDNSwgMHg3NTYyLAotICAgIDB4N0I0NiwgMHg5MDNDLCAweDY4NjcsIDB4NTlFQiwgMHg1QTlCLCAweDdEMTAsIDB4NzY3RSwgMHg4QjJDLAotICAgIDB4NEZGNSwgMHg1RjZBLCAweDZBMTksIDB4NkMzNywgMHg2RjAyLCAweDc0RTIsIDB4Nzk2OCwgMHg4ODY4LAotICAgIDB4OEE1NSwgMHg4Qzc5LCAweDVFREYsIDB4NjNDRiwgMHg3NUM1LCAweDc5RDIsIDB4ODJENywgMHg5MzI4LAotICAgIDB4OTJGMiwgMHg4NDlDLCAweDg2RUQsIDB4OUMyRCwgMHg1NEMxLCAweDVGNkMsIDB4NjU4QywgMHg2RDVDLAotICAgIDB4NzAxNSwgMHg4Q0E3LCAweDhDRDMsIDB4OTgzQiwgMHg2NTRGLCAweDc0RjYsIDB4NEUwRCwgMHg0RUQ4LAotICAgIDB4NTdFMCwgMHg1OTJCLCAweDVBNjYsIDB4NUJDQywgMHg1MUE4LCAweDVFMDMsIDB4NUU5QywgMHg2MDE2LAotICAgIDB4NjI3NiwgMHg2NTc3LCAweDY1QTcsIDB4NjY2RSwgMHg2RDZFLCAweDcyMzYsIDB4N0IyNiwgMHg4MTUwLAotICAgIDB4ODE5QSwgMHg4Mjk5LCAweDhCNUMsIDB4OENBMCwgMHg4Q0U2LCAweDhENzQsIDB4OTYxQywgMHg5NjQ0LAotICAgIDB4NEZBRSwgMHg2NEFCLCAweDZCNjYsIDB4ODIxRSwgMHg4NDYxLCAweDg1NkEsIDB4OTBFOCwgMHg1QzAxLAotICAgIDB4Njk1MywgMHg5OEE4LCAweDg0N0EsIDB4ODU1NywgMHg0RjBGLCAweDUyNkYsIDB4NUZBOSwgMHg1RTQ1LAotICAgIDB4NjcwRCwgMHg3OThGLCAweDgxNzksIDB4ODkwNywgMHg4OTg2LCAweDZERjUsIDB4NUYxNywgMHg2MjU1LAotICAgIDB4NkNCOCwgMHg0RUNGLCAweDcyNjksIDB4OUI5MiwgMHg1MjA2LCAweDU0M0IsIDB4NTY3NCwgMHg1OEIzLAotICAgIDB4NjFBNCwgMHg2MjZFLCAweDcxMUEsIDB4NTk2RSwgMHg3Qzg5LCAweDdDREUsIDB4N0QxQiwgMHg5NkYwLAotICAgIDB4NjU4NywgMHg4MDVFLCAweDRFMTksIDB4NEY3NSwgMHg1MTc1LCAweDU4NDAsIDB4NUU2MywgMHg1RTczLAotICAgIDB4NUYwQSwgMHg2N0M0LCAweDRFMjYsIDB4ODUzRCwgMHg5NTg5LCAweDk2NUIsIDB4N0M3MywgMHg5ODAxLAotICAgIDB4NTBGQiwgMHg1OEMxLCAweDc2NTYsIDB4NzhBNywgMHg1MjI1LCAweDc3QTUsIDB4ODUxMSwgMHg3Qjg2LAotICAgIDB4NTA0RiwgMHg1OTA5LCAweDcyNDcsIDB4N0JDNywgMHg3REU4LCAweDhGQkEsIDB4OEZENCwgMHg5MDRELAotICAgIDB4NEZCRiwgMHg1MkM5LCAweDVBMjksIDB4NUYwMSwgMHg5N0FELCAweDRGREQsIDB4ODIxNywgMHg5MkVBLAotICAgIDB4NTcwMywgMHg2MzU1LCAweDZCNjksIDB4NzUyQiwgMHg4OERDLCAweDhGMTQsIDB4N0E0MiwgMHg1MkRGLAotICAgIDB4NTg5MywgMHg2MTU1LCAweDYyMEEsIDB4NjZBRSwgMHg2QkNELCAweDdDM0YsIDB4ODNFOSwgMHg1MDIzLAotICAgIDB4NEZGOCwgMHg1MzA1LCAweDU0NDYsIDB4NTgzMSwgMHg1OTQ5LCAweDVCOUQsIDB4NUNGMCwgMHg1Q0VGLAotICAgIDB4NUQyOSwgMHg1RTk2LCAweDYyQjEsIDB4NjM2NywgMHg2NTNFLCAweDY1QjksIDB4NjcwQiwgMHg2Q0Q1LAotICAgIDB4NkNFMSwgMHg3MEY5LCAweDc4MzIsIDB4N0UyQiwgMHg4MERFLCAweDgyQjMsIDB4ODQwQywgMHg4NEVDLAotICAgIDB4ODcwMiwgMHg4OTEyLCAweDhBMkEsIDB4OEM0QSwgMHg5MEE2LCAweDkyRDIsIDB4OThGRCwgMHg5Q0YzLAotICAgIDB4OUQ2QywgMHg0RTRGLCAweDRFQTEsIDB4NTA4RCwgMHg1MjU2LCAweDU3NEEsIDB4NTlBOCwgMHg1RTNELAotICAgIDB4NUZEOCwgMHg1RkQ5LCAweDYyM0YsIDB4NjZCNCwgMHg2NzFCLCAweDY3RDAsIDB4NjhEMiwgMHg1MTkyLAotICAgIDB4N0QyMSwgMHg4MEFBLCAweDgxQTgsIDB4OEIwMCwgMHg4QzhDLCAweDhDQkYsIDB4OTI3RSwgMHg5NjMyLAotICAgIDB4NTQyMCwgMHg5ODJDLCAweDUzMTcsIDB4NTBENSwgMHg1MzVDLCAweDU4QTgsIDB4NjRCMiwgMHg2NzM0LAotICAgIDB4NzI2NywgMHg3NzY2LCAweDdBNDYsIDB4OTFFNiwgMHg1MkMzLCAweDZDQTEsIDB4NkI4NiwgMHg1ODAwLAotICAgIDB4NUU0QywgMHg1OTU0LCAweDY3MkMsIDB4N0ZGQiwgMHg1MUUxLCAweDc2QzYsIDB4NjQ2OSwgMHg3OEU4LAotICAgIDB4OUI1NCwgMHg5RUJCLCAweDU3Q0IsIDB4NTlCOSwgMHg2NjI3LCAweDY3OUEsIDB4NkJDRSwgMHg1NEU5LAotICAgIDB4NjlEOSwgMHg1RTU1LCAweDgxOUMsIDB4Njc5NSwgMHg5QkFBLCAweDY3RkUsIDB4OUM1MiwgMHg2ODVELAotICAgIDB4NEVBNiwgMHg0RkUzLCAweDUzQzgsIDB4NjJCOSwgMHg2NzJCLCAweDZDQUIsIDB4OEZDNCwgMHg0RkFELAotICAgIDB4N0U2RCwgMHg5RUJGLCAweDRFMDcsIDB4NjE2MiwgMHg2RTgwLCAweDZGMkIsIDB4ODUxMywgMHg1NDczLAotICAgIDB4NjcyQSwgMHg5QjQ1LCAweDVERjMsIDB4N0I5NSwgMHg1Q0FDLCAweDVCQzYsIDB4ODcxQywgMHg2RTRBLAotICAgIDB4ODREMSwgMHg3QTE0LCAweDgxMDgsIDB4NTk5OSwgMHg3QzhELCAweDZDMTEsIDB4NzcyMCwgMHg1MkQ5LAotICAgIDB4NTkyMiwgMHg3MTIxLCAweDcyNUYsIDB4NzdEQiwgMHg5NzI3LCAweDlENjEsIDB4NjkwQiwgMHg1QTdGLAotICAgIDB4NUExOCwgMHg1MUE1LCAweDU0MEQsIDB4NTQ3RCwgMHg2NjBFLCAweDc2REYsIDB4OEZGNywgMHg5Mjk4LAotICAgIDB4OUNGNCwgMHg1OUVBLCAweDcyNUQsIDB4NkVDNSwgMHg1MTRELCAweDY4QzksIDB4N0RCRiwgMHg3REVDLAotICAgIDB4OTc2MiwgMHg5RUJBLCAweDY0NzgsIDB4NkEyMSwgMHg4MzAyLCAweDU5ODQsIDB4NUI1RiwgMHg2QkRCLAotICAgIDB4NzMxQiwgMHg3NkYyLCAweDdEQjIsIDB4ODAxNywgMHg4NDk5LCAweDUxMzIsIDB4NjcyOCwgMHg5RUQ5LAotICAgIDB4NzZFRSwgMHg2NzYyLCAweDUyRkYsIDB4OTkwNSwgMHg1QzI0LCAweDYyM0IsIDB4N0M3RSwgMHg4Q0IwLAotICAgIDB4NTU0RiwgMHg2MEI2LCAweDdEMEIsIDB4OTU4MCwgMHg1MzAxLCAweDRFNUYsIDB4NTFCNiwgMHg1OTFDLAotICAgIDB4NzIzQSwgMHg4MDM2LCAweDkxQ0UsIDB4NUYyNSwgMHg3N0UyLCAweDUzODQsIDB4NUY3OSwgMHg3RDA0LAotICAgIDB4ODVBQywgMHg4QTMzLCAweDhFOEQsIDB4OTc1NiwgMHg2N0YzLCAweDg1QUUsIDB4OTQ1MywgMHg2MTA5LAotICAgIDB4NjEwOCwgMHg2Q0I5LCAweDc2NTIsIDB4OEFFRCwgMHg4RjM4LCAweDU1MkYsIDB4NEY1MSwgMHg1MTJBLAotICAgIDB4NTJDNywgMHg1M0NCLCAweDVCQTUsIDB4NUU3RCwgMHg2MEEwLCAweDYxODIsIDB4NjNENiwgMHg2NzA5LAotICAgIDB4NjdEQSwgMHg2RTY3LCAweDZEOEMsIDB4NzMzNiwgMHg3MzM3LCAweDc1MzEsIDB4Nzk1MCwgMHg4OEQ1LAotICAgIDB4OEE5OCwgMHg5MDRBLCAweDkwOTEsIDB4OTBGNSwgMHg5NkM0LCAweDg3OEQsIDB4NTkxNSwgMHg0RTg4LAotICAgIDB4NEY1OSwgMHg0RTBFLCAweDhBODksIDB4OEYzRiwgMHg5ODEwLCAweDUwQUQsIDB4NUU3QywgMHg1OTk2LAotICAgIDB4NUJCOSwgMHg1RUI4LCAweDYzREEsIDB4NjNGQSwgMHg2NEMxLCAweDY2REMsIDB4Njk0QSwgMHg2OUQ4LAotICAgIDB4NkQwQiwgMHg2RUI2LCAweDcxOTQsIDB4NzUyOCwgMHg3QUFGLCAweDdGOEEsIDB4ODAwMCwgMHg4NDQ5LAotICAgIDB4ODRDOSwgMHg4OTgxLCAweDhCMjEsIDB4OEUwQSwgMHg5MDY1LCAweDk2N0QsIDB4OTkwQSwgMHg2MTdFLAotICAgIDB4NjI5MSwgMHg2QjMyLCAweDZDODMsIDB4NkQ3NCwgMHg3RkNDLCAweDdGRkMsIDB4NkRDMCwgMHg3Rjg1LAotICAgIDB4ODdCQSwgMHg4OEY4LCAweDY3NjUsIDB4ODNCMSwgMHg5ODNDLCAweDk2RjcsIDB4NkQxQiwgMHg3RDYxLAotICAgIDB4ODQzRCwgMHg5MTZBLCAweDRFNzEsIDB4NTM3NSwgMHg1RDUwLCAweDZCMDQsIDB4NkZFQiwgMHg4NUNELAotICAgIDB4ODYyRCwgMHg4OUE3LCAweDUyMjksIDB4NTQwRiwgMHg1QzY1LCAweDY3NEUsIDB4NjhBOCwgMHg3NDA2LAotICAgIDB4NzQ4MywgMHg3NUUyLCAweDg4Q0YsIDB4ODhFMSwgMHg5MUNDLCAweDk2RTIsIDB4OTY3OCwgMHg1RjhCLAotICAgIDB4NzM4NywgMHg3QUNCLCAweDg0NEUsIDB4NjNBMCwgMHg3NTY1LCAweDUyODksIDB4NkQ0MSwgMHg2RTlDLAotICAgIDB4NzQwOSwgMHg3NTU5LCAweDc4NkIsIDB4N0M5MiwgMHg5Njg2LCAweDdBREMsIDB4OUY4RCwgMHg0RkI2LAotICAgIDB4NjE2RSwgMHg2NUM1LCAweDg2NUMsIDB4NEU4NiwgMHg0RUFFLCAweDUwREEsIDB4NEUyMSwgMHg1MUNDLAotICAgIDB4NUJFRSwgMHg2NTk5LCAweDY4ODEsIDB4NkRCQywgMHg3MzFGLCAweDc2NDIsIDB4NzdBRCwgMHg3QTFDLAotICAgIDB4N0NFNywgMHg4MjZGLCAweDhBRDIsIDB4OTA3QywgMHg5MUNGLCAweDk2NzUsIDB4OTgxOCwgMHg1MjlCLAotICAgIDB4N0REMSwgMHg1MDJCLCAweDUzOTgsIDB4Njc5NywgMHg2RENCLCAweDcxRDAsIDB4NzQzMywgMHg4MUU4LAotICAgIDB4OEYyQSwgMHg5NkEzLCAweDlDNTcsIDB4OUU5RiwgMHg3NDYwLCAweDU4NDEsIDB4NkQ5OSwgMHg3RDJGLAotICAgIDB4OTg1RSwgMHg0RUU0LCAweDRGMzYsIDB4NEY4QiwgMHg1MUI3LCAweDUyQjEsIDB4NURCQSwgMHg2MDFDLAotICAgIDB4NzNCMiwgMHg3OTNDLCAweDgyRDMsIDB4OTIzNCwgMHg5NkI3LCAweDk2RjYsIDB4OTcwQSwgMHg5RTk3LAotICAgIDB4OUY2MiwgMHg2NkE2LCAweDZCNzQsIDB4NTIxNywgMHg1MkEzLCAweDcwQzgsIDB4ODhDMiwgMHg1RUM5LAotICAgIDB4NjA0QiwgMHg2MTkwLCAweDZGMjMsIDB4NzE0OSwgMHg3QzNFLCAweDdERjQsIDB4ODA2RiwgMHg4NEVFLAotICAgIDB4OTAyMywgMHg5MzJDLCAweDU0NDIsIDB4OUI2RiwgMHg2QUQzLCAweDcwODksIDB4OENDMiwgMHg4REVGLAotICAgIDB4OTczMiwgMHg1MkI0LCAweDVBNDEsIDB4NUVDQSwgMHg1RjA0LCAweDY3MTcsIDB4Njk3QywgMHg2OTk0LAotICAgIDB4NkQ2QSwgMHg2RjBGLCAweDcyNjIsIDB4NzJGQywgMHg3QkVELCAweDgwMDEsIDB4ODA3RSwgMHg4NzRCLAotICAgIDB4OTBDRSwgMHg1MTZELCAweDlFOTMsIDB4Nzk4NCwgMHg4MDhCLCAweDkzMzIsIDB4OEFENiwgMHg1MDJELAotICAgIDB4NTQ4QywgMHg4QTcxLCAweDZCNkEsIDB4OENDNCwgMHg4MTA3LCAweDYwRDEsIDB4NjdBMCwgMHg5REYyLAotICAgIDB4NEU5OSwgMHg0RTk4LCAweDlDMTAsIDB4OEE2QiwgMHg4NUMxLCAweDg1NjgsIDB4NjkwMCwgMHg2RTdFLAotICAgIDB4Nzg5NywgMHg4MTU1LCAweDVGMEMsIDB4NEUxMCwgMHg0RTE1LCAweDRFMkEsIDB4NEUzMSwgMHg0RTM2LAotICAgIDB4NEUzQywgMHg0RTNGLCAweDRFNDIsIDB4NEU1NiwgMHg0RTU4LCAweDRFODIsIDB4NEU4NSwgMHg4QzZCLAotICAgIDB4NEU4QSwgMHg4MjEyLCAweDVGMEQsIDB4NEU4RSwgMHg0RTlFLCAweDRFOUYsIDB4NEVBMCwgMHg0RUEyLAotICAgIDB4NEVCMCwgMHg0RUIzLCAweDRFQjYsIDB4NEVDRSwgMHg0RUNELCAweDRFQzQsIDB4NEVDNiwgMHg0RUMyLAotICAgIDB4NEVENywgMHg0RURFLCAweDRFRUQsIDB4NEVERiwgMHg0RUY3LCAweDRGMDksIDB4NEY1QSwgMHg0RjMwLAotICAgIDB4NEY1QiwgMHg0RjVELCAweDRGNTcsIDB4NEY0NywgMHg0Rjc2LCAweDRGODgsIDB4NEY4RiwgMHg0Rjk4LAotICAgIDB4NEY3QiwgMHg0RjY5LCAweDRGNzAsIDB4NEY5MSwgMHg0RjZGLCAweDRGODYsIDB4NEY5NiwgMHg1MTE4LAotICAgIDB4NEZENCwgMHg0RkRGLCAweDRGQ0UsIDB4NEZEOCwgMHg0RkRCLCAweDRGRDEsIDB4NEZEQSwgMHg0RkQwLAotICAgIDB4NEZFNCwgMHg0RkU1LCAweDUwMUEsIDB4NTAyOCwgMHg1MDE0LCAweDUwMkEsIDB4NTAyNSwgMHg1MDA1LAotICAgIDB4NEYxQywgMHg0RkY2LCAweDUwMjEsIDB4NTAyOSwgMHg1MDJDLCAweDRGRkUsIDB4NEZFRiwgMHg1MDExLAotICAgIDB4NTAwNiwgMHg1MDQzLCAweDUwNDcsIDB4NjcwMywgMHg1MDU1LCAweDUwNTAsIDB4NTA0OCwgMHg1MDVBLAotICAgIDB4NTA1NiwgMHg1MDZDLCAweDUwNzgsIDB4NTA4MCwgMHg1MDlBLCAweDUwODUsIDB4NTBCNCwgMHg1MEIyLAotICAgIDB4NTBDOSwgMHg1MENBLCAweDUwQjMsIDB4NTBDMiwgMHg1MEQ2LCAweDUwREUsIDB4NTBFNSwgMHg1MEVELAotICAgIDB4NTBFMywgMHg1MEVFLCAweDUwRjksIDB4NTBGNSwgMHg1MTA5LCAweDUxMDEsIDB4NTEwMiwgMHg1MTE2LAotICAgIDB4NTExNSwgMHg1MTE0LCAweDUxMUEsIDB4NTEyMSwgMHg1MTNBLCAweDUxMzcsIDB4NTEzQywgMHg1MTNCLAotICAgIDB4NTEzRiwgMHg1MTQwLCAweDUxNTIsIDB4NTE0QywgMHg1MTU0LCAweDUxNjIsIDB4N0FGOCwgMHg1MTY5LAotICAgIDB4NTE2QSwgMHg1MTZFLCAweDUxODAsIDB4NTE4MiwgMHg1NkQ4LCAweDUxOEMsIDB4NTE4OSwgMHg1MThGLAotICAgIDB4NTE5MSwgMHg1MTkzLCAweDUxOTUsIDB4NTE5NiwgMHg1MUE0LCAweDUxQTYsIDB4NTFBMiwgMHg1MUE5LAotICAgIDB4NTFBQSwgMHg1MUFCLCAweDUxQjMsIDB4NTFCMSwgMHg1MUIyLCAweDUxQjAsIDB4NTFCNSwgMHg1MUJELAotICAgIDB4NTFDNSwgMHg1MUM5LCAweDUxREIsIDB4NTFFMCwgMHg4NjU1LCAweDUxRTksIDB4NTFFRCwgMHg1MUYwLAotICAgIDB4NTFGNSwgMHg1MUZFLCAweDUyMDQsIDB4NTIwQiwgMHg1MjE0LCAweDUyMEUsIDB4NTIyNywgMHg1MjJBLAotICAgIDB4NTIyRSwgMHg1MjMzLCAweDUyMzksIDB4NTI0RiwgMHg1MjQ0LCAweDUyNEIsIDB4NTI0QywgMHg1MjVFLAotICAgIDB4NTI1NCwgMHg1MjZBLCAweDUyNzQsIDB4NTI2OSwgMHg1MjczLCAweDUyN0YsIDB4NTI3RCwgMHg1MjhELAotICAgIDB4NTI5NCwgMHg1MjkyLCAweDUyNzEsIDB4NTI4OCwgMHg1MjkxLCAweDhGQTgsIDB4OEZBNywgMHg1MkFDLAotICAgIDB4NTJBRCwgMHg1MkJDLCAweDUyQjUsIDB4NTJDMSwgMHg1MkNELCAweDUyRDcsIDB4NTJERSwgMHg1MkUzLAotICAgIDB4NTJFNiwgMHg5OEVELCAweDUyRTAsIDB4NTJGMywgMHg1MkY1LCAweDUyRjgsIDB4NTJGOSwgMHg1MzA2LAotICAgIDB4NTMwOCwgMHg3NTM4LCAweDUzMEQsIDB4NTMxMCwgMHg1MzBGLCAweDUzMTUsIDB4NTMxQSwgMHg1MzIzLAotICAgIDB4NTMyRiwgMHg1MzMxLCAweDUzMzMsIDB4NTMzOCwgMHg1MzQwLCAweDUzNDYsIDB4NTM0NSwgMHg0RTE3LAotICAgIDB4NTM0OSwgMHg1MzRELCAweDUxRDYsIDB4NTM1RSwgMHg1MzY5LCAweDUzNkUsIDB4NTkxOCwgMHg1MzdCLAotICAgIDB4NTM3NywgMHg1MzgyLCAweDUzOTYsIDB4NTNBMCwgMHg1M0E2LCAweDUzQTUsIDB4NTNBRSwgMHg1M0IwLAotICAgIDB4NTNCNiwgMHg1M0MzLCAweDdDMTIsIDB4OTZEOSwgMHg1M0RGLCAweDY2RkMsIDB4NzFFRSwgMHg1M0VFLAotICAgIDB4NTNFOCwgMHg1M0VELCAweDUzRkEsIDB4NTQwMSwgMHg1NDNELCAweDU0NDAsIDB4NTQyQywgMHg1NDJELAotICAgIDB4NTQzQywgMHg1NDJFLCAweDU0MzYsIDB4NTQyOSwgMHg1NDFELCAweDU0NEUsIDB4NTQ4RiwgMHg1NDc1LAotICAgIDB4NTQ4RSwgMHg1NDVGLCAweDU0NzEsIDB4NTQ3NywgMHg1NDcwLCAweDU0OTIsIDB4NTQ3QiwgMHg1NDgwLAotICAgIDB4NTQ3NiwgMHg1NDg0LCAweDU0OTAsIDB4NTQ4NiwgMHg1NEM3LCAweDU0QTIsIDB4NTRCOCwgMHg1NEE1LAotICAgIDB4NTRBQywgMHg1NEM0LCAweDU0QzgsIDB4NTRBOCwgMHg1NEFCLCAweDU0QzIsIDB4NTRBNCwgMHg1NEJFLAotICAgIDB4NTRCQywgMHg1NEQ4LCAweDU0RTUsIDB4NTRFNiwgMHg1NTBGLCAweDU1MTQsIDB4NTRGRCwgMHg1NEVFLAotICAgIDB4NTRFRCwgMHg1NEZBLCAweDU0RTIsIDB4NTUzOSwgMHg1NTQwLCAweDU1NjMsIDB4NTU0QywgMHg1NTJFLAotICAgIDB4NTU1QywgMHg1NTQ1LCAweDU1NTYsIDB4NTU1NywgMHg1NTM4LCAweDU1MzMsIDB4NTU1RCwgMHg1NTk5LAotICAgIDB4NTU4MCwgMHg1NEFGLCAweDU1OEEsIDB4NTU5RiwgMHg1NTdCLCAweDU1N0UsIDB4NTU5OCwgMHg1NTlFLAotICAgIDB4NTVBRSwgMHg1NTdDLCAweDU1ODMsIDB4NTVBOSwgMHg1NTg3LCAweDU1QTgsIDB4NTVEQSwgMHg1NUM1LAotICAgIDB4NTVERiwgMHg1NUM0LCAweDU1REMsIDB4NTVFNCwgMHg1NUQ0LCAweDU2MTQsIDB4NTVGNywgMHg1NjE2LAotICAgIDB4NTVGRSwgMHg1NUZELCAweDU2MUIsIDB4NTVGOSwgMHg1NjRFLCAweDU2NTAsIDB4NzFERiwgMHg1NjM0LAotICAgIDB4NTYzNiwgMHg1NjMyLCAweDU2MzgsIDB4NTY2QiwgMHg1NjY0LCAweDU2MkYsIDB4NTY2QywgMHg1NjZBLAotICAgIDB4NTY4NiwgMHg1NjgwLCAweDU2OEEsIDB4NTZBMCwgMHg1Njk0LCAweDU2OEYsIDB4NTZBNSwgMHg1NkFFLAotICAgIDB4NTZCNiwgMHg1NkI0LCAweDU2QzIsIDB4NTZCQywgMHg1NkMxLCAweDU2QzMsIDB4NTZDMCwgMHg1NkM4LAotICAgIDB4NTZDRSwgMHg1NkQxLCAweDU2RDMsIDB4NTZENywgMHg1NkVFLCAweDU2RjksIDB4NTcwMCwgMHg1NkZGLAotICAgIDB4NTcwNCwgMHg1NzA5LCAweDU3MDgsIDB4NTcwQiwgMHg1NzBELCAweDU3MTMsIDB4NTcxOCwgMHg1NzE2LAotICAgIDB4NTVDNywgMHg1NzFDLCAweDU3MjYsIDB4NTczNywgMHg1NzM4LCAweDU3NEUsIDB4NTczQiwgMHg1NzQwLAotICAgIDB4NTc0RiwgMHg1NzY5LCAweDU3QzAsIDB4NTc4OCwgMHg1NzYxLCAweDU3N0YsIDB4NTc4OSwgMHg1NzkzLAotICAgIDB4NTdBMCwgMHg1N0IzLCAweDU3QTQsIDB4NTdBQSwgMHg1N0IwLCAweDU3QzMsIDB4NTdDNiwgMHg1N0Q0LAotICAgIDB4NTdEMiwgMHg1N0QzLCAweDU4MEEsIDB4NTdENiwgMHg1N0UzLCAweDU4MEIsIDB4NTgxOSwgMHg1ODFELAotICAgIDB4NTg3MiwgMHg1ODIxLCAweDU4NjIsIDB4NTg0QiwgMHg1ODcwLCAweDZCQzAsIDB4NTg1MiwgMHg1ODNELAotICAgIDB4NTg3OSwgMHg1ODg1LCAweDU4QjksIDB4NTg5RiwgMHg1OEFCLCAweDU4QkEsIDB4NThERSwgMHg1OEJCLAotICAgIDB4NThCOCwgMHg1OEFFLCAweDU4QzUsIDB4NThEMywgMHg1OEQxLCAweDU4RDcsIDB4NThEOSwgMHg1OEQ4LAotICAgIDB4NThFNSwgMHg1OERDLCAweDU4RTQsIDB4NThERiwgMHg1OEVGLCAweDU4RkEsIDB4NThGOSwgMHg1OEZCLAotICAgIDB4NThGQywgMHg1OEZELCAweDU5MDIsIDB4NTkwQSwgMHg1OTEwLCAweDU5MUIsIDB4NjhBNiwgMHg1OTI1LAotICAgIDB4NTkyQywgMHg1OTJELCAweDU5MzIsIDB4NTkzOCwgMHg1OTNFLCAweDdBRDIsIDB4NTk1NSwgMHg1OTUwLAotICAgIDB4NTk0RSwgMHg1OTVBLCAweDU5NTgsIDB4NTk2MiwgMHg1OTYwLCAweDU5NjcsIDB4NTk2QywgMHg1OTY5LAotICAgIDB4NTk3OCwgMHg1OTgxLCAweDU5OUQsIDB4NEY1RSwgMHg0RkFCLCAweDU5QTMsIDB4NTlCMiwgMHg1OUM2LAotICAgIDB4NTlFOCwgMHg1OURDLCAweDU5OEQsIDB4NTlEOSwgMHg1OURBLCAweDVBMjUsIDB4NUExRiwgMHg1QTExLAotICAgIDB4NUExQywgMHg1QTA5LCAweDVBMUEsIDB4NUE0MCwgMHg1QTZDLCAweDVBNDksIDB4NUEzNSwgMHg1QTM2LAotICAgIDB4NUE2MiwgMHg1QTZBLCAweDVBOUEsIDB4NUFCQywgMHg1QUJFLCAweDVBQ0IsIDB4NUFDMiwgMHg1QUJELAotICAgIDB4NUFFMywgMHg1QUQ3LCAweDVBRTYsIDB4NUFFOSwgMHg1QUQ2LCAweDVBRkEsIDB4NUFGQiwgMHg1QjBDLAotICAgIDB4NUIwQiwgMHg1QjE2LCAweDVCMzIsIDB4NUFEMCwgMHg1QjJBLCAweDVCMzYsIDB4NUIzRSwgMHg1QjQzLAotICAgIDB4NUI0NSwgMHg1QjQwLCAweDVCNTEsIDB4NUI1NSwgMHg1QjVBLCAweDVCNUIsIDB4NUI2NSwgMHg1QjY5LAotICAgIDB4NUI3MCwgMHg1QjczLCAweDVCNzUsIDB4NUI3OCwgMHg2NTg4LCAweDVCN0EsIDB4NUI4MCwgMHg1QjgzLAotICAgIDB4NUJBNiwgMHg1QkI4LCAweDVCQzMsIDB4NUJDNywgMHg1QkM5LCAweDVCRDQsIDB4NUJEMCwgMHg1QkU0LAotICAgIDB4NUJFNiwgMHg1QkUyLCAweDVCREUsIDB4NUJFNSwgMHg1QkVCLCAweDVCRjAsIDB4NUJGNiwgMHg1QkYzLAotICAgIDB4NUMwNSwgMHg1QzA3LCAweDVDMDgsIDB4NUMwRCwgMHg1QzEzLCAweDVDMjAsIDB4NUMyMiwgMHg1QzI4LAotICAgIDB4NUMzOCwgMHg1QzM5LCAweDVDNDEsIDB4NUM0NiwgMHg1QzRFLCAweDVDNTMsIDB4NUM1MCwgMHg1QzRGLAotICAgIDB4NUI3MSwgMHg1QzZDLCAweDVDNkUsIDB4NEU2MiwgMHg1Qzc2LCAweDVDNzksIDB4NUM4QywgMHg1QzkxLAotICAgIDB4NUM5NCwgMHg1OTlCLCAweDVDQUIsIDB4NUNCQiwgMHg1Q0I2LCAweDVDQkMsIDB4NUNCNywgMHg1Q0M1LAotICAgIDB4NUNCRSwgMHg1Q0M3LCAweDVDRDksIDB4NUNFOSwgMHg1Q0ZELCAweDVDRkEsIDB4NUNFRCwgMHg1RDhDLAotICAgIDB4NUNFQSwgMHg1RDBCLCAweDVEMTUsIDB4NUQxNywgMHg1RDVDLCAweDVEMUYsIDB4NUQxQiwgMHg1RDExLAotICAgIDB4NUQxNCwgMHg1RDIyLCAweDVEMUEsIDB4NUQxOSwgMHg1RDE4LCAweDVENEMsIDB4NUQ1MiwgMHg1RDRFLAotICAgIDB4NUQ0QiwgMHg1RDZDLCAweDVENzMsIDB4NUQ3NiwgMHg1RDg3LCAweDVEODQsIDB4NUQ4MiwgMHg1REEyLAotICAgIDB4NUQ5RCwgMHg1REFDLCAweDVEQUUsIDB4NURCRCwgMHg1RDkwLCAweDVEQjcsIDB4NURCQywgMHg1REM5LAotICAgIDB4NURDRCwgMHg1REQzLCAweDVERDIsIDB4NURENiwgMHg1RERCLCAweDVERUIsIDB4NURGMiwgMHg1REY1LAotICAgIDB4NUUwQiwgMHg1RTFBLCAweDVFMTksIDB4NUUxMSwgMHg1RTFCLCAweDVFMzYsIDB4NUUzNywgMHg1RTQ0LAotICAgIDB4NUU0MywgMHg1RTQwLCAweDVFNEUsIDB4NUU1NywgMHg1RTU0LCAweDVFNUYsIDB4NUU2MiwgMHg1RTY0LAotICAgIDB4NUU0NywgMHg1RTc1LCAweDVFNzYsIDB4NUU3QSwgMHg5RUJDLCAweDVFN0YsIDB4NUVBMCwgMHg1RUMxLAotICAgIDB4NUVDMiwgMHg1RUM4LCAweDVFRDAsIDB4NUVDRiwgMHg1RUQ2LCAweDVFRTMsIDB4NUVERCwgMHg1RURBLAotICAgIDB4NUVEQiwgMHg1RUUyLCAweDVFRTEsIDB4NUVFOCwgMHg1RUU5LCAweDVFRUMsIDB4NUVGMSwgMHg1RUYzLAotICAgIDB4NUVGMCwgMHg1RUY0LCAweDVFRjgsIDB4NUVGRSwgMHg1RjAzLCAweDVGMDksIDB4NUY1RCwgMHg1RjVDLAotICAgIDB4NUYwQiwgMHg1RjExLCAweDVGMTYsIDB4NUYyOSwgMHg1RjJELCAweDVGMzgsIDB4NUY0MSwgMHg1RjQ4LAotICAgIDB4NUY0QywgMHg1RjRFLCAweDVGMkYsIDB4NUY1MSwgMHg1RjU2LCAweDVGNTcsIDB4NUY1OSwgMHg1RjYxLAotICAgIDB4NUY2RCwgMHg1RjczLCAweDVGNzcsIDB4NUY4MywgMHg1RjgyLCAweDVGN0YsIDB4NUY4QSwgMHg1Rjg4LAotICAgIDB4NUY5MSwgMHg1Rjg3LCAweDVGOUUsIDB4NUY5OSwgMHg1Rjk4LCAweDVGQTAsIDB4NUZBOCwgMHg1RkFELAotICAgIDB4NUZCQywgMHg1RkQ2LCAweDVGRkIsIDB4NUZFNCwgMHg1RkY4LCAweDVGRjEsIDB4NUZERCwgMHg2MEIzLAotICAgIDB4NUZGRiwgMHg2MDIxLCAweDYwNjAsIDB4NjAxOSwgMHg2MDEwLCAweDYwMjksIDB4NjAwRSwgMHg2MDMxLAotICAgIDB4NjAxQiwgMHg2MDE1LCAweDYwMkIsIDB4NjAyNiwgMHg2MDBGLCAweDYwM0EsIDB4NjA1QSwgMHg2MDQxLAotICAgIDB4NjA2QSwgMHg2MDc3LCAweDYwNUYsIDB4NjA0QSwgMHg2MDQ2LCAweDYwNEQsIDB4NjA2MywgMHg2MDQzLAotICAgIDB4NjA2NCwgMHg2MDQyLCAweDYwNkMsIDB4NjA2QiwgMHg2MDU5LCAweDYwODEsIDB4NjA4RCwgMHg2MEU3LAotICAgIDB4NjA4MywgMHg2MDlBLCAweDYwODQsIDB4NjA5QiwgMHg2MDk2LCAweDYwOTcsIDB4NjA5MiwgMHg2MEE3LAotICAgIDB4NjA4QiwgMHg2MEUxLCAweDYwQjgsIDB4NjBFMCwgMHg2MEQzLCAweDYwQjQsIDB4NUZGMCwgMHg2MEJELAotICAgIDB4NjBDNiwgMHg2MEI1LCAweDYwRDgsIDB4NjE0RCwgMHg2MTE1LCAweDYxMDYsIDB4NjBGNiwgMHg2MEY3LAotICAgIDB4NjEwMCwgMHg2MEY0LCAweDYwRkEsIDB4NjEwMywgMHg2MTIxLCAweDYwRkIsIDB4NjBGMSwgMHg2MTBELAotICAgIDB4NjEwRSwgMHg2MTQ3LCAweDYxM0UsIDB4NjEyOCwgMHg2MTI3LCAweDYxNEEsIDB4NjEzRiwgMHg2MTNDLAotICAgIDB4NjEyQywgMHg2MTM0LCAweDYxM0QsIDB4NjE0MiwgMHg2MTQ0LCAweDYxNzMsIDB4NjE3NywgMHg2MTU4LAotICAgIDB4NjE1OSwgMHg2MTVBLCAweDYxNkIsIDB4NjE3NCwgMHg2MTZGLCAweDYxNjUsIDB4NjE3MSwgMHg2MTVGLAotICAgIDB4NjE1RCwgMHg2MTUzLCAweDYxNzUsIDB4NjE5OSwgMHg2MTk2LCAweDYxODcsIDB4NjFBQywgMHg2MTk0LAotICAgIDB4NjE5QSwgMHg2MThBLCAweDYxOTEsIDB4NjFBQiwgMHg2MUFFLCAweDYxQ0MsIDB4NjFDQSwgMHg2MUM5LAotICAgIDB4NjFGNywgMHg2MUM4LCAweDYxQzMsIDB4NjFDNiwgMHg2MUJBLCAweDYxQ0IsIDB4N0Y3OSwgMHg2MUNELAotICAgIDB4NjFFNiwgMHg2MUUzLCAweDYxRjYsIDB4NjFGQSwgMHg2MUY0LCAweDYxRkYsIDB4NjFGRCwgMHg2MUZDLAotICAgIDB4NjFGRSwgMHg2MjAwLCAweDYyMDgsIDB4NjIwOSwgMHg2MjBELCAweDYyMEMsIDB4NjIxNCwgMHg2MjFCLAotICAgIDB4NjIxRSwgMHg2MjIxLCAweDYyMkEsIDB4NjIyRSwgMHg2MjMwLCAweDYyMzIsIDB4NjIzMywgMHg2MjQxLAotICAgIDB4NjI0RSwgMHg2MjVFLCAweDYyNjMsIDB4NjI1QiwgMHg2MjYwLCAweDYyNjgsIDB4NjI3QywgMHg2MjgyLAotICAgIDB4NjI4OSwgMHg2MjdFLCAweDYyOTIsIDB4NjI5MywgMHg2Mjk2LCAweDYyRDQsIDB4NjI4MywgMHg2Mjk0LAotICAgIDB4NjJENywgMHg2MkQxLCAweDYyQkIsIDB4NjJDRiwgMHg2MkZGLCAweDYyQzYsIDB4NjRENCwgMHg2MkM4LAotICAgIDB4NjJEQywgMHg2MkNDLCAweDYyQ0EsIDB4NjJDMiwgMHg2MkM3LCAweDYyOUIsIDB4NjJDOSwgMHg2MzBDLAotICAgIDB4NjJFRSwgMHg2MkYxLCAweDYzMjcsIDB4NjMwMiwgMHg2MzA4LCAweDYyRUYsIDB4NjJGNSwgMHg2MzUwLAotICAgIDB4NjMzRSwgMHg2MzRELCAweDY0MUMsIDB4NjM0RiwgMHg2Mzk2LCAweDYzOEUsIDB4NjM4MCwgMHg2M0FCLAotICAgIDB4NjM3NiwgMHg2M0EzLCAweDYzOEYsIDB4NjM4OSwgMHg2MzlGLCAweDYzQjUsIDB4NjM2QiwgMHg2MzY5LAotICAgIDB4NjNCRSwgMHg2M0U5LCAweDYzQzAsIDB4NjNDNiwgMHg2M0UzLCAweDYzQzksIDB4NjNEMiwgMHg2M0Y2LAotICAgIDB4NjNDNCwgMHg2NDE2LCAweDY0MzQsIDB4NjQwNiwgMHg2NDEzLCAweDY0MjYsIDB4NjQzNiwgMHg2NTFELAotICAgIDB4NjQxNywgMHg2NDI4LCAweDY0MEYsIDB4NjQ2NywgMHg2NDZGLCAweDY0NzYsIDB4NjQ0RSwgMHg2NTJBLAotICAgIDB4NjQ5NSwgMHg2NDkzLCAweDY0QTUsIDB4NjRBOSwgMHg2NDg4LCAweDY0QkMsIDB4NjREQSwgMHg2NEQyLAotICAgIDB4NjRDNSwgMHg2NEM3LCAweDY0QkIsIDB4NjREOCwgMHg2NEMyLCAweDY0RjEsIDB4NjRFNywgMHg4MjA5LAotICAgIDB4NjRFMCwgMHg2NEUxLCAweDYyQUMsIDB4NjRFMywgMHg2NEVGLCAweDY1MkMsIDB4NjRGNiwgMHg2NEY0LAotICAgIDB4NjRGMiwgMHg2NEZBLCAweDY1MDAsIDB4NjRGRCwgMHg2NTE4LCAweDY1MUMsIDB4NjUwNSwgMHg2NTI0LAotICAgIDB4NjUyMywgMHg2NTJCLCAweDY1MzQsIDB4NjUzNSwgMHg2NTM3LCAweDY1MzYsIDB4NjUzOCwgMHg3NTRCLAotICAgIDB4NjU0OCwgMHg2NTU2LCAweDY1NTUsIDB4NjU0RCwgMHg2NTU4LCAweDY1NUUsIDB4NjU1RCwgMHg2NTcyLAotICAgIDB4NjU3OCwgMHg2NTgyLCAweDY1ODMsIDB4OEI4QSwgMHg2NTlCLCAweDY1OUYsIDB4NjVBQiwgMHg2NUI3LAotICAgIDB4NjVDMywgMHg2NUM2LCAweDY1QzEsIDB4NjVDNCwgMHg2NUNDLCAweDY1RDIsIDB4NjVEQiwgMHg2NUQ5LAotICAgIDB4NjVFMCwgMHg2NUUxLCAweDY1RjEsIDB4Njc3MiwgMHg2NjBBLCAweDY2MDMsIDB4NjVGQiwgMHg2NzczLAotICAgIDB4NjYzNSwgMHg2NjM2LCAweDY2MzQsIDB4NjYxQywgMHg2NjRGLCAweDY2NDQsIDB4NjY0OSwgMHg2NjQxLAotICAgIDB4NjY1RSwgMHg2NjVELCAweDY2NjQsIDB4NjY2NywgMHg2NjY4LCAweDY2NUYsIDB4NjY2MiwgMHg2NjcwLAotICAgIDB4NjY4MywgMHg2Njg4LCAweDY2OEUsIDB4NjY4OSwgMHg2Njg0LCAweDY2OTgsIDB4NjY5RCwgMHg2NkMxLAotICAgIDB4NjZCOSwgMHg2NkM5LCAweDY2QkUsIDB4NjZCQywgMHg2NkM0LCAweDY2QjgsIDB4NjZENiwgMHg2NkRBLAotICAgIDB4NjZFMCwgMHg2NjNGLCAweDY2RTYsIDB4NjZFOSwgMHg2NkYwLCAweDY2RjUsIDB4NjZGNywgMHg2NzBGLAotICAgIDB4NjcxNiwgMHg2NzFFLCAweDY3MjYsIDB4NjcyNywgMHg5NzM4LCAweDY3MkUsIDB4NjczRiwgMHg2NzM2LAotICAgIDB4Njc0MSwgMHg2NzM4LCAweDY3MzcsIDB4Njc0NiwgMHg2NzVFLCAweDY3NjAsIDB4Njc1OSwgMHg2NzYzLAotICAgIDB4Njc2NCwgMHg2Nzg5LCAweDY3NzAsIDB4NjdBOSwgMHg2NzdDLCAweDY3NkEsIDB4Njc4QywgMHg2NzhCLAotICAgIDB4NjdBNiwgMHg2N0ExLCAweDY3ODUsIDB4NjdCNywgMHg2N0VGLCAweDY3QjQsIDB4NjdFQywgMHg2N0IzLAotICAgIDB4NjdFOSwgMHg2N0I4LCAweDY3RTQsIDB4NjdERSwgMHg2N0RELCAweDY3RTIsIDB4NjdFRSwgMHg2N0I5LAotICAgIDB4NjdDRSwgMHg2N0M2LCAweDY3RTcsIDB4NkE5QywgMHg2ODFFLCAweDY4NDYsIDB4NjgyOSwgMHg2ODQwLAotICAgIDB4Njg0RCwgMHg2ODMyLCAweDY4NEUsIDB4NjhCMywgMHg2ODJCLCAweDY4NTksIDB4Njg2MywgMHg2ODc3LAotICAgIDB4Njg3RiwgMHg2ODlGLCAweDY4OEYsIDB4NjhBRCwgMHg2ODk0LCAweDY4OUQsIDB4Njg5QiwgMHg2ODgzLAotICAgIDB4NkFBRSwgMHg2OEI5LCAweDY4NzQsIDB4NjhCNSwgMHg2OEEwLCAweDY4QkEsIDB4NjkwRiwgMHg2ODhELAotICAgIDB4Njg3RSwgMHg2OTAxLCAweDY4Q0EsIDB4NjkwOCwgMHg2OEQ4LCAweDY5MjIsIDB4NjkyNiwgMHg2OEUxLAotICAgIDB4NjkwQywgMHg2OENELCAweDY4RDQsIDB4NjhFNywgMHg2OEQ1LCAweDY5MzYsIDB4NjkxMiwgMHg2OTA0LAotICAgIDB4NjhENywgMHg2OEUzLCAweDY5MjUsIDB4NjhGOSwgMHg2OEUwLCAweDY4RUYsIDB4NjkyOCwgMHg2OTJBLAotICAgIDB4NjkxQSwgMHg2OTIzLCAweDY5MjEsIDB4NjhDNiwgMHg2OTc5LCAweDY5NzcsIDB4Njk1QywgMHg2OTc4LAotICAgIDB4Njk2QiwgMHg2OTU0LCAweDY5N0UsIDB4Njk2RSwgMHg2OTM5LCAweDY5NzQsIDB4NjkzRCwgMHg2OTU5LAotICAgIDB4NjkzMCwgMHg2OTYxLCAweDY5NUUsIDB4Njk1RCwgMHg2OTgxLCAweDY5NkEsIDB4NjlCMiwgMHg2OUFFLAotICAgIDB4NjlEMCwgMHg2OUJGLCAweDY5QzEsIDB4NjlEMywgMHg2OUJFLCAweDY5Q0UsIDB4NUJFOCwgMHg2OUNBLAotICAgIDB4NjlERCwgMHg2OUJCLCAweDY5QzMsIDB4NjlBNywgMHg2QTJFLCAweDY5OTEsIDB4NjlBMCwgMHg2OTlDLAotICAgIDB4Njk5NSwgMHg2OUI0LCAweDY5REUsIDB4NjlFOCwgMHg2QTAyLCAweDZBMUIsIDB4NjlGRiwgMHg2QjBBLAotICAgIDB4NjlGOSwgMHg2OUYyLCAweDY5RTcsIDB4NkEwNSwgMHg2OUIxLCAweDZBMUUsIDB4NjlFRCwgMHg2QTE0LAotICAgIDB4NjlFQiwgMHg2QTBBLCAweDZBMTIsIDB4NkFDMSwgMHg2QTIzLCAweDZBMTMsIDB4NkE0NCwgMHg2QTBDLAotICAgIDB4NkE3MiwgMHg2QTM2LCAweDZBNzgsIDB4NkE0NywgMHg2QTYyLCAweDZBNTksIDB4NkE2NiwgMHg2QTQ4LAotICAgIDB4NkEzOCwgMHg2QTIyLCAweDZBOTAsIDB4NkE4RCwgMHg2QUEwLCAweDZBODQsIDB4NkFBMiwgMHg2QUEzLAotICAgIDB4NkE5NywgMHg4NjE3LCAweDZBQkIsIDB4NkFDMywgMHg2QUMyLCAweDZBQjgsIDB4NkFCMywgMHg2QUFDLAotICAgIDB4NkFERSwgMHg2QUQxLCAweDZBREYsIDB4NkFBQSwgMHg2QURBLCAweDZBRUEsIDB4NkFGQiwgMHg2QjA1LAotICAgIDB4ODYxNiwgMHg2QUZBLCAweDZCMTIsIDB4NkIxNiwgMHg5QjMxLCAweDZCMUYsIDB4NkIzOCwgMHg2QjM3LAotICAgIDB4NzZEQywgMHg2QjM5LCAweDk4RUUsIDB4NkI0NywgMHg2QjQzLCAweDZCNDksIDB4NkI1MCwgMHg2QjU5LAotICAgIDB4NkI1NCwgMHg2QjVCLCAweDZCNUYsIDB4NkI2MSwgMHg2Qjc4LCAweDZCNzksIDB4NkI3RiwgMHg2QjgwLAotICAgIDB4NkI4NCwgMHg2QjgzLCAweDZCOEQsIDB4NkI5OCwgMHg2Qjk1LCAweDZCOUUsIDB4NkJBNCwgMHg2QkFBLAotICAgIDB4NkJBQiwgMHg2QkFGLCAweDZCQjIsIDB4NkJCMSwgMHg2QkIzLCAweDZCQjcsIDB4NkJCQywgMHg2QkM2LAotICAgIDB4NkJDQiwgMHg2QkQzLCAweDZCREYsIDB4NkJFQywgMHg2QkVCLCAweDZCRjMsIDB4NkJFRiwgMHg5RUJFLAotICAgIDB4NkMwOCwgMHg2QzEzLCAweDZDMTQsIDB4NkMxQiwgMHg2QzI0LCAweDZDMjMsIDB4NkM1RSwgMHg2QzU1LAotICAgIDB4NkM2MiwgMHg2QzZBLCAweDZDODIsIDB4NkM4RCwgMHg2QzlBLCAweDZDODEsIDB4NkM5QiwgMHg2QzdFLAotICAgIDB4NkM2OCwgMHg2QzczLCAweDZDOTIsIDB4NkM5MCwgMHg2Q0M0LCAweDZDRjEsIDB4NkNEMywgMHg2Q0JELAotICAgIDB4NkNENywgMHg2Q0M1LCAweDZDREQsIDB4NkNBRSwgMHg2Q0IxLCAweDZDQkUsIDB4NkNCQSwgMHg2Q0RCLAotICAgIDB4NkNFRiwgMHg2Q0Q5LCAweDZDRUEsIDB4NkQxRiwgMHg4ODRELCAweDZEMzYsIDB4NkQyQiwgMHg2RDNELAotICAgIDB4NkQzOCwgMHg2RDE5LCAweDZEMzUsIDB4NkQzMywgMHg2RDEyLCAweDZEMEMsIDB4NkQ2MywgMHg2RDkzLAotICAgIDB4NkQ2NCwgMHg2RDVBLCAweDZENzksIDB4NkQ1OSwgMHg2RDhFLCAweDZEOTUsIDB4NkZFNCwgMHg2RDg1LAotICAgIDB4NkRGOSwgMHg2RTE1LCAweDZFMEEsIDB4NkRCNSwgMHg2REM3LCAweDZERTYsIDB4NkRCOCwgMHg2REM2LAotICAgIDB4NkRFQywgMHg2RERFLCAweDZEQ0MsIDB4NkRFOCwgMHg2REQyLCAweDZEQzUsIDB4NkRGQSwgMHg2REQ5LAotICAgIDB4NkRFNCwgMHg2REQ1LCAweDZERUEsIDB4NkRFRSwgMHg2RTJELCAweDZFNkUsIDB4NkUyRSwgMHg2RTE5LAotICAgIDB4NkU3MiwgMHg2RTVGLCAweDZFM0UsIDB4NkUyMywgMHg2RTZCLCAweDZFMkIsIDB4NkU3NiwgMHg2RTRELAotICAgIDB4NkUxRiwgMHg2RTQzLCAweDZFM0EsIDB4NkU0RSwgMHg2RTI0LCAweDZFRkYsIDB4NkUxRCwgMHg2RTM4LAotICAgIDB4NkU4MiwgMHg2RUFBLCAweDZFOTgsIDB4NkVDOSwgMHg2RUI3LCAweDZFRDMsIDB4NkVCRCwgMHg2RUFGLAotICAgIDB4NkVDNCwgMHg2RUIyLCAweDZFRDQsIDB4NkVENSwgMHg2RThGLCAweDZFQTUsIDB4NkVDMiwgMHg2RTlGLAotICAgIDB4NkY0MSwgMHg2RjExLCAweDcwNEMsIDB4NkVFQywgMHg2RUY4LCAweDZFRkUsIDB4NkYzRiwgMHg2RUYyLAotICAgIDB4NkYzMSwgMHg2RUVGLCAweDZGMzIsIDB4NkVDQywgMHg2RjNFLCAweDZGMTMsIDB4NkVGNywgMHg2Rjg2LAotICAgIDB4NkY3QSwgMHg2Rjc4LCAweDZGODEsIDB4NkY4MCwgMHg2RjZGLCAweDZGNUIsIDB4NkZGMywgMHg2RjZELAotICAgIDB4NkY4MiwgMHg2RjdDLCAweDZGNTgsIDB4NkY4RSwgMHg2RjkxLCAweDZGQzIsIDB4NkY2NiwgMHg2RkIzLAotICAgIDB4NkZBMywgMHg2RkExLCAweDZGQTQsIDB4NkZCOSwgMHg2RkM2LCAweDZGQUEsIDB4NkZERiwgMHg2RkQ1LAotICAgIDB4NkZFQywgMHg2RkQ0LCAweDZGRDgsIDB4NkZGMSwgMHg2RkVFLCAweDZGREIsIDB4NzAwOSwgMHg3MDBCLAotICAgIDB4NkZGQSwgMHg3MDExLCAweDcwMDEsIDB4NzAwRiwgMHg2RkZFLCAweDcwMUIsIDB4NzAxQSwgMHg2Rjc0LAotICAgIDB4NzAxRCwgMHg3MDE4LCAweDcwMUYsIDB4NzAzMCwgMHg3MDNFLCAweDcwMzIsIDB4NzA1MSwgMHg3MDYzLAotICAgIDB4NzA5OSwgMHg3MDkyLCAweDcwQUYsIDB4NzBGMSwgMHg3MEFDLCAweDcwQjgsIDB4NzBCMywgMHg3MEFFLAotICAgIDB4NzBERiwgMHg3MENCLCAweDcwREQsIDB4NzBEOSwgMHg3MTA5LCAweDcwRkQsIDB4NzExQywgMHg3MTE5LAotICAgIDB4NzE2NSwgMHg3MTU1LCAweDcxODgsIDB4NzE2NiwgMHg3MTYyLCAweDcxNEMsIDB4NzE1NiwgMHg3MTZDLAotICAgIDB4NzE4RiwgMHg3MUZCLCAweDcxODQsIDB4NzE5NSwgMHg3MUE4LCAweDcxQUMsIDB4NzFENywgMHg3MUI5LAotICAgIDB4NzFCRSwgMHg3MUQyLCAweDcxQzksIDB4NzFENCwgMHg3MUNFLCAweDcxRTAsIDB4NzFFQywgMHg3MUU3LAotICAgIDB4NzFGNSwgMHg3MUZDLCAweDcxRjksIDB4NzFGRiwgMHg3MjBELCAweDcyMTAsIDB4NzIxQiwgMHg3MjI4LAotICAgIDB4NzIyRCwgMHg3MjJDLCAweDcyMzAsIDB4NzIzMiwgMHg3MjNCLCAweDcyM0MsIDB4NzIzRiwgMHg3MjQwLAotICAgIDB4NzI0NiwgMHg3MjRCLCAweDcyNTgsIDB4NzI3NCwgMHg3MjdFLCAweDcyODIsIDB4NzI4MSwgMHg3Mjg3LAotICAgIDB4NzI5MiwgMHg3Mjk2LCAweDcyQTIsIDB4NzJBNywgMHg3MkI5LCAweDcyQjIsIDB4NzJDMywgMHg3MkM2LAotICAgIDB4NzJDNCwgMHg3MkNFLCAweDcyRDIsIDB4NzJFMiwgMHg3MkUwLCAweDcyRTEsIDB4NzJGOSwgMHg3MkY3LAotICAgIDB4NTAwRiwgMHg3MzE3LCAweDczMEEsIDB4NzMxQywgMHg3MzE2LCAweDczMUQsIDB4NzMzNCwgMHg3MzJGLAotICAgIDB4NzMyOSwgMHg3MzI1LCAweDczM0UsIDB4NzM0RSwgMHg3MzRGLCAweDlFRDgsIDB4NzM1NywgMHg3MzZBLAotICAgIDB4NzM2OCwgMHg3MzcwLCAweDczNzgsIDB4NzM3NSwgMHg3MzdCLCAweDczN0EsIDB4NzNDOCwgMHg3M0IzLAotICAgIDB4NzNDRSwgMHg3M0JCLCAweDczQzAsIDB4NzNFNSwgMHg3M0VFLCAweDczREUsIDB4NzRBMiwgMHg3NDA1LAotICAgIDB4NzQ2RiwgMHg3NDI1LCAweDczRjgsIDB4NzQzMiwgMHg3NDNBLCAweDc0NTUsIDB4NzQzRiwgMHg3NDVGLAotICAgIDB4NzQ1OSwgMHg3NDQxLCAweDc0NUMsIDB4NzQ2OSwgMHg3NDcwLCAweDc0NjMsIDB4NzQ2QSwgMHg3NDc2LAotICAgIDB4NzQ3RSwgMHg3NDhCLCAweDc0OUUsIDB4NzRBNywgMHg3NENBLCAweDc0Q0YsIDB4NzRENCwgMHg3M0YxLAotICAgIDB4NzRFMCwgMHg3NEUzLCAweDc0RTcsIDB4NzRFOSwgMHg3NEVFLCAweDc0RjIsIDB4NzRGMCwgMHg3NEYxLAotICAgIDB4NzRGOCwgMHg3NEY3LCAweDc1MDQsIDB4NzUwMywgMHg3NTA1LCAweDc1MEMsIDB4NzUwRSwgMHg3NTBELAotICAgIDB4NzUxNSwgMHg3NTEzLCAweDc1MUUsIDB4NzUyNiwgMHg3NTJDLCAweDc1M0MsIDB4NzU0NCwgMHg3NTRELAotICAgIDB4NzU0QSwgMHg3NTQ5LCAweDc1NUIsIDB4NzU0NiwgMHg3NTVBLCAweDc1NjksIDB4NzU2NCwgMHg3NTY3LAotICAgIDB4NzU2QiwgMHg3NTZELCAweDc1NzgsIDB4NzU3NiwgMHg3NTg2LCAweDc1ODcsIDB4NzU3NCwgMHg3NThBLAotICAgIDB4NzU4OSwgMHg3NTgyLCAweDc1OTQsIDB4NzU5QSwgMHg3NTlELCAweDc1QTUsIDB4NzVBMywgMHg3NUMyLAotICAgIDB4NzVCMywgMHg3NUMzLCAweDc1QjUsIDB4NzVCRCwgMHg3NUI4LCAweDc1QkMsIDB4NzVCMSwgMHg3NUNELAotICAgIDB4NzVDQSwgMHg3NUQyLCAweDc1RDksIDB4NzVFMywgMHg3NURFLCAweDc1RkUsIDB4NzVGRiwgMHg3NUZDLAotICAgIDB4NzYwMSwgMHg3NUYwLCAweDc1RkEsIDB4NzVGMiwgMHg3NUYzLCAweDc2MEIsIDB4NzYwRCwgMHg3NjA5LAotICAgIDB4NzYxRiwgMHg3NjI3LCAweDc2MjAsIDB4NzYyMSwgMHg3NjIyLCAweDc2MjQsIDB4NzYzNCwgMHg3NjMwLAotICAgIDB4NzYzQiwgMHg3NjQ3LCAweDc2NDgsIDB4NzY0NiwgMHg3NjVDLCAweDc2NTgsIDB4NzY2MSwgMHg3NjYyLAotICAgIDB4NzY2OCwgMHg3NjY5LCAweDc2NkEsIDB4NzY2NywgMHg3NjZDLCAweDc2NzAsIDB4NzY3MiwgMHg3Njc2LAotICAgIDB4NzY3OCwgMHg3NjdDLCAweDc2ODAsIDB4NzY4MywgMHg3Njg4LCAweDc2OEIsIDB4NzY4RSwgMHg3Njk2LAotICAgIDB4NzY5MywgMHg3Njk5LCAweDc2OUEsIDB4NzZCMCwgMHg3NkI0LCAweDc2QjgsIDB4NzZCOSwgMHg3NkJBLAotICAgIDB4NzZDMiwgMHg3NkNELCAweDc2RDYsIDB4NzZEMiwgMHg3NkRFLCAweDc2RTEsIDB4NzZFNSwgMHg3NkU3LAotICAgIDB4NzZFQSwgMHg4NjJGLCAweDc2RkIsIDB4NzcwOCwgMHg3NzA3LCAweDc3MDQsIDB4NzcyOSwgMHg3NzI0LAotICAgIDB4NzcxRSwgMHg3NzI1LCAweDc3MjYsIDB4NzcxQiwgMHg3NzM3LCAweDc3MzgsIDB4Nzc0NywgMHg3NzVBLAotICAgIDB4Nzc2OCwgMHg3NzZCLCAweDc3NUIsIDB4Nzc2NSwgMHg3NzdGLCAweDc3N0UsIDB4Nzc3OSwgMHg3NzhFLAotICAgIDB4Nzc4QiwgMHg3NzkxLCAweDc3QTAsIDB4Nzc5RSwgMHg3N0IwLCAweDc3QjYsIDB4NzdCOSwgMHg3N0JGLAotICAgIDB4NzdCQywgMHg3N0JELCAweDc3QkIsIDB4NzdDNywgMHg3N0NELCAweDc3RDcsIDB4NzdEQSwgMHg3N0RDLAotICAgIDB4NzdFMywgMHg3N0VFLCAweDc3RkMsIDB4NzgwQywgMHg3ODEyLCAweDc5MjYsIDB4NzgyMCwgMHg3OTJBLAotICAgIDB4Nzg0NSwgMHg3ODhFLCAweDc4NzQsIDB4Nzg4NiwgMHg3ODdDLCAweDc4OUEsIDB4Nzg4QywgMHg3OEEzLAotICAgIDB4NzhCNSwgMHg3OEFBLCAweDc4QUYsIDB4NzhEMSwgMHg3OEM2LCAweDc4Q0IsIDB4NzhENCwgMHg3OEJFLAotICAgIDB4NzhCQywgMHg3OEM1LCAweDc4Q0EsIDB4NzhFQywgMHg3OEU3LCAweDc4REEsIDB4NzhGRCwgMHg3OEY0LAotICAgIDB4NzkwNywgMHg3OTEyLCAweDc5MTEsIDB4NzkxOSwgMHg3OTJDLCAweDc5MkIsIDB4Nzk0MCwgMHg3OTYwLAotICAgIDB4Nzk1NywgMHg3OTVGLCAweDc5NUEsIDB4Nzk1NSwgMHg3OTUzLCAweDc5N0EsIDB4Nzk3RiwgMHg3OThBLAotICAgIDB4Nzk5RCwgMHg3OUE3LCAweDlGNEIsIDB4NzlBQSwgMHg3OUFFLCAweDc5QjMsIDB4NzlCOSwgMHg3OUJBLAotICAgIDB4NzlDOSwgMHg3OUQ1LCAweDc5RTcsIDB4NzlFQywgMHg3OUUxLCAweDc5RTMsIDB4N0EwOCwgMHg3QTBELAotICAgIDB4N0ExOCwgMHg3QTE5LCAweDdBMjAsIDB4N0ExRiwgMHg3OTgwLCAweDdBMzEsIDB4N0EzQiwgMHg3QTNFLAotICAgIDB4N0EzNywgMHg3QTQzLCAweDdBNTcsIDB4N0E0OSwgMHg3QTYxLCAweDdBNjIsIDB4N0E2OSwgMHg5RjlELAotICAgIDB4N0E3MCwgMHg3QTc5LCAweDdBN0QsIDB4N0E4OCwgMHg3QTk3LCAweDdBOTUsIDB4N0E5OCwgMHg3QTk2LAotICAgIDB4N0FBOSwgMHg3QUM4LCAweDdBQjAsIDB4N0FCNiwgMHg3QUM1LCAweDdBQzQsIDB4N0FCRiwgMHg5MDgzLAotICAgIDB4N0FDNywgMHg3QUNBLCAweDdBQ0QsIDB4N0FDRiwgMHg3QUQ1LCAweDdBRDMsIDB4N0FEOSwgMHg3QURBLAotICAgIDB4N0FERCwgMHg3QUUxLCAweDdBRTIsIDB4N0FFNiwgMHg3QUVELCAweDdBRjAsIDB4N0IwMiwgMHg3QjBGLAotICAgIDB4N0IwQSwgMHg3QjA2LCAweDdCMzMsIDB4N0IxOCwgMHg3QjE5LCAweDdCMUUsIDB4N0IzNSwgMHg3QjI4LAotICAgIDB4N0IzNiwgMHg3QjUwLCAweDdCN0EsIDB4N0IwNCwgMHg3QjRELCAweDdCMEIsIDB4N0I0QywgMHg3QjQ1LAotICAgIDB4N0I3NSwgMHg3QjY1LCAweDdCNzQsIDB4N0I2NywgMHg3QjcwLCAweDdCNzEsIDB4N0I2QywgMHg3QjZFLAotICAgIDB4N0I5RCwgMHg3Qjk4LCAweDdCOUYsIDB4N0I4RCwgMHg3QjlDLCAweDdCOUEsIDB4N0I4QiwgMHg3QjkyLAotICAgIDB4N0I4RiwgMHg3QjVELCAweDdCOTksIDB4N0JDQiwgMHg3QkMxLCAweDdCQ0MsIDB4N0JDRiwgMHg3QkI0LAotICAgIDB4N0JDNiwgMHg3QkRELCAweDdCRTksIDB4N0MxMSwgMHg3QzE0LCAweDdCRTYsIDB4N0JFNSwgMHg3QzYwLAotICAgIDB4N0MwMCwgMHg3QzA3LCAweDdDMTMsIDB4N0JGMywgMHg3QkY3LCAweDdDMTcsIDB4N0MwRCwgMHg3QkY2LAotICAgIDB4N0MyMywgMHg3QzI3LCAweDdDMkEsIDB4N0MxRiwgMHg3QzM3LCAweDdDMkIsIDB4N0MzRCwgMHg3QzRDLAotICAgIDB4N0M0MywgMHg3QzU0LCAweDdDNEYsIDB4N0M0MCwgMHg3QzUwLCAweDdDNTgsIDB4N0M1RiwgMHg3QzY0LAotICAgIDB4N0M1NiwgMHg3QzY1LCAweDdDNkMsIDB4N0M3NSwgMHg3QzgzLCAweDdDOTAsIDB4N0NBNCwgMHg3Q0FELAotICAgIDB4N0NBMiwgMHg3Q0FCLCAweDdDQTEsIDB4N0NBOCwgMHg3Q0IzLCAweDdDQjIsIDB4N0NCMSwgMHg3Q0FFLAotICAgIDB4N0NCOSwgMHg3Q0JELCAweDdDQzAsIDB4N0NDNSwgMHg3Q0MyLCAweDdDRDgsIDB4N0NEMiwgMHg3Q0RDLAotICAgIDB4N0NFMiwgMHg5QjNCLCAweDdDRUYsIDB4N0NGMiwgMHg3Q0Y0LCAweDdDRjYsIDB4N0NGQSwgMHg3RDA2LAotICAgIDB4N0QwMiwgMHg3RDFDLCAweDdEMTUsIDB4N0QwQSwgMHg3RDQ1LCAweDdENEIsIDB4N0QyRSwgMHg3RDMyLAotICAgIDB4N0QzRiwgMHg3RDM1LCAweDdENDYsIDB4N0Q3MywgMHg3RDU2LCAweDdENEUsIDB4N0Q3MiwgMHg3RDY4LAotICAgIDB4N0Q2RSwgMHg3RDRGLCAweDdENjMsIDB4N0Q5MywgMHg3RDg5LCAweDdENUIsIDB4N0Q4RiwgMHg3RDdELAotICAgIDB4N0Q5QiwgMHg3REJBLCAweDdEQUUsIDB4N0RBMywgMHg3REI1LCAweDdEQzcsIDB4N0RCRCwgMHg3REFCLAotICAgIDB4N0UzRCwgMHg3REEyLCAweDdEQUYsIDB4N0REQywgMHg3REI4LCAweDdEOUYsIDB4N0RCMCwgMHg3REQ4LAotICAgIDB4N0RERCwgMHg3REU0LCAweDdEREUsIDB4N0RGQiwgMHg3REYyLCAweDdERTEsIDB4N0UwNSwgMHg3RTBBLAotICAgIDB4N0UyMywgMHg3RTIxLCAweDdFMTIsIDB4N0UzMSwgMHg3RTFGLCAweDdFMDksIDB4N0UwQiwgMHg3RTIyLAotICAgIDB4N0U0NiwgMHg3RTY2LCAweDdFM0IsIDB4N0UzNSwgMHg3RTM5LCAweDdFNDMsIDB4N0UzNywgMHg3RTMyLAotICAgIDB4N0UzQSwgMHg3RTY3LCAweDdFNUQsIDB4N0U1NiwgMHg3RTVFLCAweDdFNTksIDB4N0U1QSwgMHg3RTc5LAotICAgIDB4N0U2QSwgMHg3RTY5LCAweDdFN0MsIDB4N0U3QiwgMHg3RTgzLCAweDdERDUsIDB4N0U3RCwgMHg4RkFFLAotICAgIDB4N0U3RiwgMHg3RTg4LCAweDdFODksIDB4N0U4QywgMHg3RTkyLCAweDdFOTAsIDB4N0U5MywgMHg3RTk0LAotICAgIDB4N0U5NiwgMHg3RThFLCAweDdFOUIsIDB4N0U5QywgMHg3RjM4LCAweDdGM0EsIDB4N0Y0NSwgMHg3RjRDLAotICAgIDB4N0Y0RCwgMHg3RjRFLCAweDdGNTAsIDB4N0Y1MSwgMHg3RjU1LCAweDdGNTQsIDB4N0Y1OCwgMHg3RjVGLAotICAgIDB4N0Y2MCwgMHg3RjY4LCAweDdGNjksIDB4N0Y2NywgMHg3Rjc4LCAweDdGODIsIDB4N0Y4NiwgMHg3RjgzLAotICAgIDB4N0Y4OCwgMHg3Rjg3LCAweDdGOEMsIDB4N0Y5NCwgMHg3RjlFLCAweDdGOUQsIDB4N0Y5QSwgMHg3RkEzLAotICAgIDB4N0ZBRiwgMHg3RkIyLCAweDdGQjksIDB4N0ZBRSwgMHg3RkI2LCAweDdGQjgsIDB4OEI3MSwgMHg3RkM1LAotICAgIDB4N0ZDNiwgMHg3RkNBLCAweDdGRDUsIDB4N0ZENCwgMHg3RkUxLCAweDdGRTYsIDB4N0ZFOSwgMHg3RkYzLAotICAgIDB4N0ZGOSwgMHg5OERDLCAweDgwMDYsIDB4ODAwNCwgMHg4MDBCLCAweDgwMTIsIDB4ODAxOCwgMHg4MDE5LAotICAgIDB4ODAxQywgMHg4MDIxLCAweDgwMjgsIDB4ODAzRiwgMHg4MDNCLCAweDgwNEEsIDB4ODA0NiwgMHg4MDUyLAotICAgIDB4ODA1OCwgMHg4MDVBLCAweDgwNUYsIDB4ODA2MiwgMHg4MDY4LCAweDgwNzMsIDB4ODA3MiwgMHg4MDcwLAotICAgIDB4ODA3NiwgMHg4MDc5LCAweDgwN0QsIDB4ODA3RiwgMHg4MDg0LCAweDgwODYsIDB4ODA4NSwgMHg4MDlCLAotICAgIDB4ODA5MywgMHg4MDlBLCAweDgwQUQsIDB4NTE5MCwgMHg4MEFDLCAweDgwREIsIDB4ODBFNSwgMHg4MEQ5LAotICAgIDB4ODBERCwgMHg4MEM0LCAweDgwREEsIDB4ODBENiwgMHg4MTA5LCAweDgwRUYsIDB4ODBGMSwgMHg4MTFCLAotICAgIDB4ODEyOSwgMHg4MTIzLCAweDgxMkYsIDB4ODE0QiwgMHg5NjhCLCAweDgxNDYsIDB4ODEzRSwgMHg4MTUzLAotICAgIDB4ODE1MSwgMHg4MEZDLCAweDgxNzEsIDB4ODE2RSwgMHg4MTY1LCAweDgxNjYsIDB4ODE3NCwgMHg4MTgzLAotICAgIDB4ODE4OCwgMHg4MThBLCAweDgxODAsIDB4ODE4MiwgMHg4MUEwLCAweDgxOTUsIDB4ODFBNCwgMHg4MUEzLAotICAgIDB4ODE1RiwgMHg4MTkzLCAweDgxQTksIDB4ODFCMCwgMHg4MUI1LCAweDgxQkUsIDB4ODFCOCwgMHg4MUJELAotICAgIDB4ODFDMCwgMHg4MUMyLCAweDgxQkEsIDB4ODFDOSwgMHg4MUNELCAweDgxRDEsIDB4ODFEOSwgMHg4MUQ4LAotICAgIDB4ODFDOCwgMHg4MURBLCAweDgxREYsIDB4ODFFMCwgMHg4MUU3LCAweDgxRkEsIDB4ODFGQiwgMHg4MUZFLAotICAgIDB4ODIwMSwgMHg4MjAyLCAweDgyMDUsIDB4ODIwNywgMHg4MjBBLCAweDgyMEQsIDB4ODIxMCwgMHg4MjE2LAotICAgIDB4ODIyOSwgMHg4MjJCLCAweDgyMzgsIDB4ODIzMywgMHg4MjQwLCAweDgyNTksIDB4ODI1OCwgMHg4MjVELAotICAgIDB4ODI1QSwgMHg4MjVGLCAweDgyNjQsIDB4ODI2MiwgMHg4MjY4LCAweDgyNkEsIDB4ODI2QiwgMHg4MjJFLAotICAgIDB4ODI3MSwgMHg4Mjc3LCAweDgyNzgsIDB4ODI3RSwgMHg4MjhELCAweDgyOTIsIDB4ODJBQiwgMHg4MjlGLAotICAgIDB4ODJCQiwgMHg4MkFDLCAweDgyRTEsIDB4ODJFMywgMHg4MkRGLCAweDgyRDIsIDB4ODJGNCwgMHg4MkYzLAotICAgIDB4ODJGQSwgMHg4MzkzLCAweDgzMDMsIDB4ODJGQiwgMHg4MkY5LCAweDgyREUsIDB4ODMwNiwgMHg4MkRDLAotICAgIDB4ODMwOSwgMHg4MkQ5LCAweDgzMzUsIDB4ODMzNCwgMHg4MzE2LCAweDgzMzIsIDB4ODMzMSwgMHg4MzQwLAotICAgIDB4ODMzOSwgMHg4MzUwLCAweDgzNDUsIDB4ODMyRiwgMHg4MzJCLCAweDgzMTcsIDB4ODMxOCwgMHg4Mzg1LAotICAgIDB4ODM5QSwgMHg4M0FBLCAweDgzOUYsIDB4ODNBMiwgMHg4Mzk2LCAweDgzMjMsIDB4ODM4RSwgMHg4Mzg3LAotICAgIDB4ODM4QSwgMHg4MzdDLCAweDgzQjUsIDB4ODM3MywgMHg4Mzc1LCAweDgzQTAsIDB4ODM4OSwgMHg4M0E4LAotICAgIDB4ODNGNCwgMHg4NDEzLCAweDgzRUIsIDB4ODNDRSwgMHg4M0ZELCAweDg0MDMsIDB4ODNEOCwgMHg4NDBCLAotICAgIDB4ODNDMSwgMHg4M0Y3LCAweDg0MDcsIDB4ODNFMCwgMHg4M0YyLCAweDg0MEQsIDB4ODQyMiwgMHg4NDIwLAotICAgIDB4ODNCRCwgMHg4NDM4LCAweDg1MDYsIDB4ODNGQiwgMHg4NDZELCAweDg0MkEsIDB4ODQzQywgMHg4NTVBLAotICAgIDB4ODQ4NCwgMHg4NDc3LCAweDg0NkIsIDB4ODRBRCwgMHg4NDZFLCAweDg0ODIsIDB4ODQ2OSwgMHg4NDQ2LAotICAgIDB4ODQyQywgMHg4NDZGLCAweDg0NzksIDB4ODQzNSwgMHg4NENBLCAweDg0NjIsIDB4ODRCOSwgMHg4NEJGLAotICAgIDB4ODQ5RiwgMHg4NEQ5LCAweDg0Q0QsIDB4ODRCQiwgMHg4NERBLCAweDg0RDAsIDB4ODRDMSwgMHg4NEM2LAotICAgIDB4ODRENiwgMHg4NEExLCAweDg1MjEsIDB4ODRGRiwgMHg4NEY0LCAweDg1MTcsIDB4ODUxOCwgMHg4NTJDLAotICAgIDB4ODUxRiwgMHg4NTE1LCAweDg1MTQsIDB4ODRGQywgMHg4NTQwLCAweDg1NjMsIDB4ODU1OCwgMHg4NTQ4LAotICAgIDB4ODU0MSwgMHg4NjAyLCAweDg1NEIsIDB4ODU1NSwgMHg4NTgwLCAweDg1QTQsIDB4ODU4OCwgMHg4NTkxLAotICAgIDB4ODU4QSwgMHg4NUE4LCAweDg1NkQsIDB4ODU5NCwgMHg4NTlCLCAweDg1RUEsIDB4ODU4NywgMHg4NTlDLAotICAgIDB4ODU3NywgMHg4NTdFLCAweDg1OTAsIDB4ODVDOSwgMHg4NUJBLCAweDg1Q0YsIDB4ODVCOSwgMHg4NUQwLAotICAgIDB4ODVENSwgMHg4NURELCAweDg1RTUsIDB4ODVEQywgMHg4NUY5LCAweDg2MEEsIDB4ODYxMywgMHg4NjBCLAotICAgIDB4ODVGRSwgMHg4NUZBLCAweDg2MDYsIDB4ODYyMiwgMHg4NjFBLCAweDg2MzAsIDB4ODYzRiwgMHg4NjRELAotICAgIDB4NEU1NSwgMHg4NjU0LCAweDg2NUYsIDB4ODY2NywgMHg4NjcxLCAweDg2OTMsIDB4ODZBMywgMHg4NkE5LAotICAgIDB4ODZBQSwgMHg4NjhCLCAweDg2OEMsIDB4ODZCNiwgMHg4NkFGLCAweDg2QzQsIDB4ODZDNiwgMHg4NkIwLAotICAgIDB4ODZDOSwgMHg4ODIzLCAweDg2QUIsIDB4ODZENCwgMHg4NkRFLCAweDg2RTksIDB4ODZFQywgMHg4NkRGLAotICAgIDB4ODZEQiwgMHg4NkVGLCAweDg3MTIsIDB4ODcwNiwgMHg4NzA4LCAweDg3MDAsIDB4ODcwMywgMHg4NkZCLAotICAgIDB4ODcxMSwgMHg4NzA5LCAweDg3MEQsIDB4ODZGOSwgMHg4NzBBLCAweDg3MzQsIDB4ODczRiwgMHg4NzM3LAotICAgIDB4ODczQiwgMHg4NzI1LCAweDg3MjksIDB4ODcxQSwgMHg4NzYwLCAweDg3NUYsIDB4ODc3OCwgMHg4NzRDLAotICAgIDB4ODc0RSwgMHg4Nzc0LCAweDg3NTcsIDB4ODc2OCwgMHg4NzZFLCAweDg3NTksIDB4ODc1MywgMHg4NzYzLAotICAgIDB4ODc2QSwgMHg4ODA1LCAweDg3QTIsIDB4ODc5RiwgMHg4NzgyLCAweDg3QUYsIDB4ODdDQiwgMHg4N0JELAotICAgIDB4ODdDMCwgMHg4N0QwLCAweDk2RDYsIDB4ODdBQiwgMHg4N0M0LCAweDg3QjMsIDB4ODdDNywgMHg4N0M2LAotICAgIDB4ODdCQiwgMHg4N0VGLCAweDg3RjIsIDB4ODdFMCwgMHg4ODBGLCAweDg4MEQsIDB4ODdGRSwgMHg4N0Y2LAotICAgIDB4ODdGNywgMHg4ODBFLCAweDg3RDIsIDB4ODgxMSwgMHg4ODE2LCAweDg4MTUsIDB4ODgyMiwgMHg4ODIxLAotICAgIDB4ODgzMSwgMHg4ODM2LCAweDg4MzksIDB4ODgyNywgMHg4ODNCLCAweDg4NDQsIDB4ODg0MiwgMHg4ODUyLAotICAgIDB4ODg1OSwgMHg4ODVFLCAweDg4NjIsIDB4ODg2QiwgMHg4ODgxLCAweDg4N0UsIDB4ODg5RSwgMHg4ODc1LAotICAgIDB4ODg3RCwgMHg4OEI1LCAweDg4NzIsIDB4ODg4MiwgMHg4ODk3LCAweDg4OTIsIDB4ODhBRSwgMHg4ODk5LAotICAgIDB4ODhBMiwgMHg4ODhELCAweDg4QTQsIDB4ODhCMCwgMHg4OEJGLCAweDg4QjEsIDB4ODhDMywgMHg4OEM0LAotICAgIDB4ODhENCwgMHg4OEQ4LCAweDg4RDksIDB4ODhERCwgMHg4OEY5LCAweDg5MDIsIDB4ODhGQywgMHg4OEY0LAotICAgIDB4ODhFOCwgMHg4OEYyLCAweDg5MDQsIDB4ODkwQywgMHg4OTBBLCAweDg5MTMsIDB4ODk0MywgMHg4OTFFLAotICAgIDB4ODkyNSwgMHg4OTJBLCAweDg5MkIsIDB4ODk0MSwgMHg4OTQ0LCAweDg5M0IsIDB4ODkzNiwgMHg4OTM4LAotICAgIDB4ODk0QywgMHg4OTFELCAweDg5NjAsIDB4ODk1RSwgMHg4OTY2LCAweDg5NjQsIDB4ODk2RCwgMHg4OTZBLAotICAgIDB4ODk2RiwgMHg4OTc0LCAweDg5NzcsIDB4ODk3RSwgMHg4OTgzLCAweDg5ODgsIDB4ODk4QSwgMHg4OTkzLAotICAgIDB4ODk5OCwgMHg4OUExLCAweDg5QTksIDB4ODlBNiwgMHg4OUFDLCAweDg5QUYsIDB4ODlCMiwgMHg4OUJBLAotICAgIDB4ODlCRCwgMHg4OUJGLCAweDg5QzAsIDB4ODlEQSwgMHg4OURDLCAweDg5REQsIDB4ODlFNywgMHg4OUY0LAotICAgIDB4ODlGOCwgMHg4QTAzLCAweDhBMTYsIDB4OEExMCwgMHg4QTBDLCAweDhBMUIsIDB4OEExRCwgMHg4QTI1LAotICAgIDB4OEEzNiwgMHg4QTQxLCAweDhBNUIsIDB4OEE1MiwgMHg4QTQ2LCAweDhBNDgsIDB4OEE3QywgMHg4QTZELAotICAgIDB4OEE2QywgMHg4QTYyLCAweDhBODUsIDB4OEE4MiwgMHg4QTg0LCAweDhBQTgsIDB4OEFBMSwgMHg4QTkxLAotICAgIDB4OEFBNSwgMHg4QUE2LCAweDhBOUEsIDB4OEFBMywgMHg4QUM0LCAweDhBQ0QsIDB4OEFDMiwgMHg4QURBLAotICAgIDB4OEFFQiwgMHg4QUYzLCAweDhBRTcsIDB4OEFFNCwgMHg4QUYxLCAweDhCMTQsIDB4OEFFMCwgMHg4QUUyLAotICAgIDB4OEFGNywgMHg4QURFLCAweDhBREIsIDB4OEIwQywgMHg4QjA3LCAweDhCMUEsIDB4OEFFMSwgMHg4QjE2LAotICAgIDB4OEIxMCwgMHg4QjE3LCAweDhCMjAsIDB4OEIzMywgMHg5N0FCLCAweDhCMjYsIDB4OEIyQiwgMHg4QjNFLAotICAgIDB4OEIyOCwgMHg4QjQxLCAweDhCNEMsIDB4OEI0RiwgMHg4QjRFLCAweDhCNDksIDB4OEI1NiwgMHg4QjVCLAotICAgIDB4OEI1QSwgMHg4QjZCLCAweDhCNUYsIDB4OEI2QywgMHg4QjZGLCAweDhCNzQsIDB4OEI3RCwgMHg4QjgwLAotICAgIDB4OEI4QywgMHg4QjhFLCAweDhCOTIsIDB4OEI5MywgMHg4Qjk2LCAweDhCOTksIDB4OEI5QSwgMHg4QzNBLAotICAgIDB4OEM0MSwgMHg4QzNGLCAweDhDNDgsIDB4OEM0QywgMHg4QzRFLCAweDhDNTAsIDB4OEM1NSwgMHg4QzYyLAotICAgIDB4OEM2QywgMHg4Qzc4LCAweDhDN0EsIDB4OEM4MiwgMHg4Qzg5LCAweDhDODUsIDB4OEM4QSwgMHg4QzhELAotICAgIDB4OEM4RSwgMHg4Qzk0LCAweDhDN0MsIDB4OEM5OCwgMHg2MjFELCAweDhDQUQsIDB4OENBQSwgMHg4Q0JELAotICAgIDB4OENCMiwgMHg4Q0IzLCAweDhDQUUsIDB4OENCNiwgMHg4Q0M4LCAweDhDQzEsIDB4OENFNCwgMHg4Q0UzLAotICAgIDB4OENEQSwgMHg4Q0ZELCAweDhDRkEsIDB4OENGQiwgMHg4RDA0LCAweDhEMDUsIDB4OEQwQSwgMHg4RDA3LAotICAgIDB4OEQwRiwgMHg4RDBELCAweDhEMTAsIDB4OUY0RSwgMHg4RDEzLCAweDhDQ0QsIDB4OEQxNCwgMHg4RDE2LAotICAgIDB4OEQ2NywgMHg4RDZELCAweDhENzEsIDB4OEQ3MywgMHg4RDgxLCAweDhEOTksIDB4OERDMiwgMHg4REJFLAotICAgIDB4OERCQSwgMHg4RENGLCAweDhEREEsIDB4OERENiwgMHg4RENDLCAweDhEREIsIDB4OERDQiwgMHg4REVBLAotICAgIDB4OERFQiwgMHg4RERGLCAweDhERTMsIDB4OERGQywgMHg4RTA4LCAweDhFMDksIDB4OERGRiwgMHg4RTFELAotICAgIDB4OEUxRSwgMHg4RTEwLCAweDhFMUYsIDB4OEU0MiwgMHg4RTM1LCAweDhFMzAsIDB4OEUzNCwgMHg4RTRBLAotICAgIDB4OEU0NywgMHg4RTQ5LCAweDhFNEMsIDB4OEU1MCwgMHg4RTQ4LCAweDhFNTksIDB4OEU2NCwgMHg4RTYwLAotICAgIDB4OEUyQSwgMHg4RTYzLCAweDhFNTUsIDB4OEU3NiwgMHg4RTcyLCAweDhFN0MsIDB4OEU4MSwgMHg4RTg3LAotICAgIDB4OEU4NSwgMHg4RTg0LCAweDhFOEIsIDB4OEU4QSwgMHg4RTkzLCAweDhFOTEsIDB4OEU5NCwgMHg4RTk5LAotICAgIDB4OEVBQSwgMHg4RUExLCAweDhFQUMsIDB4OEVCMCwgMHg4RUM2LCAweDhFQjEsIDB4OEVCRSwgMHg4RUM1LAotICAgIDB4OEVDOCwgMHg4RUNCLCAweDhFREIsIDB4OEVFMywgMHg4RUZDLCAweDhFRkIsIDB4OEVFQiwgMHg4RUZFLAotICAgIDB4OEYwQSwgMHg4RjA1LCAweDhGMTUsIDB4OEYxMiwgMHg4RjE5LCAweDhGMTMsIDB4OEYxQywgMHg4RjFGLAotICAgIDB4OEYxQiwgMHg4RjBDLCAweDhGMjYsIDB4OEYzMywgMHg4RjNCLCAweDhGMzksIDB4OEY0NSwgMHg4RjQyLAotICAgIDB4OEYzRSwgMHg4RjRDLCAweDhGNDksIDB4OEY0NiwgMHg4RjRFLCAweDhGNTcsIDB4OEY1QywgMHg4RjYyLAotICAgIDB4OEY2MywgMHg4RjY0LCAweDhGOUMsIDB4OEY5RiwgMHg4RkEzLCAweDhGQUQsIDB4OEZBRiwgMHg4RkI3LAotICAgIDB4OEZEQSwgMHg4RkU1LCAweDhGRTIsIDB4OEZFQSwgMHg4RkVGLCAweDkwODcsIDB4OEZGNCwgMHg5MDA1LAotICAgIDB4OEZGOSwgMHg4RkZBLCAweDkwMTEsIDB4OTAxNSwgMHg5MDIxLCAweDkwMEQsIDB4OTAxRSwgMHg5MDE2LAotICAgIDB4OTAwQiwgMHg5MDI3LCAweDkwMzYsIDB4OTAzNSwgMHg5MDM5LCAweDhGRjgsIDB4OTA0RiwgMHg5MDUwLAotICAgIDB4OTA1MSwgMHg5MDUyLCAweDkwMEUsIDB4OTA0OSwgMHg5MDNFLCAweDkwNTYsIDB4OTA1OCwgMHg5MDVFLAotICAgIDB4OTA2OCwgMHg5MDZGLCAweDkwNzYsIDB4OTZBOCwgMHg5MDcyLCAweDkwODIsIDB4OTA3RCwgMHg5MDgxLAotICAgIDB4OTA4MCwgMHg5MDhBLCAweDkwODksIDB4OTA4RiwgMHg5MEE4LCAweDkwQUYsIDB4OTBCMSwgMHg5MEI1LAotICAgIDB4OTBFMiwgMHg5MEU0LCAweDYyNDgsIDB4OTBEQiwgMHg5MTAyLCAweDkxMTIsIDB4OTExOSwgMHg5MTMyLAotICAgIDB4OTEzMCwgMHg5MTRBLCAweDkxNTYsIDB4OTE1OCwgMHg5MTYzLCAweDkxNjUsIDB4OTE2OSwgMHg5MTczLAotICAgIDB4OTE3MiwgMHg5MThCLCAweDkxODksIDB4OTE4MiwgMHg5MUEyLCAweDkxQUIsIDB4OTFBRiwgMHg5MUFBLAotICAgIDB4OTFCNSwgMHg5MUI0LCAweDkxQkEsIDB4OTFDMCwgMHg5MUMxLCAweDkxQzksIDB4OTFDQiwgMHg5MUQwLAotICAgIDB4OTFENiwgMHg5MURGLCAweDkxRTEsIDB4OTFEQiwgMHg5MUZDLCAweDkxRjUsIDB4OTFGNiwgMHg5MjFFLAotICAgIDB4OTFGRiwgMHg5MjE0LCAweDkyMkMsIDB4OTIxNSwgMHg5MjExLCAweDkyNUUsIDB4OTI1NywgMHg5MjQ1LAotICAgIDB4OTI0OSwgMHg5MjY0LCAweDkyNDgsIDB4OTI5NSwgMHg5MjNGLCAweDkyNEIsIDB4OTI1MCwgMHg5MjlDLAotICAgIDB4OTI5NiwgMHg5MjkzLCAweDkyOUIsIDB4OTI1QSwgMHg5MkNGLCAweDkyQjksIDB4OTJCNywgMHg5MkU5LAotICAgIDB4OTMwRiwgMHg5MkZBLCAweDkzNDQsIDB4OTMyRSwgMHg5MzE5LCAweDkzMjIsIDB4OTMxQSwgMHg5MzIzLAotICAgIDB4OTMzQSwgMHg5MzM1LCAweDkzM0IsIDB4OTM1QywgMHg5MzYwLCAweDkzN0MsIDB4OTM2RSwgMHg5MzU2LAotICAgIDB4OTNCMCwgMHg5M0FDLCAweDkzQUQsIDB4OTM5NCwgMHg5M0I5LCAweDkzRDYsIDB4OTNENywgMHg5M0U4LAotICAgIDB4OTNFNSwgMHg5M0Q4LCAweDkzQzMsIDB4OTNERCwgMHg5M0QwLCAweDkzQzgsIDB4OTNFNCwgMHg5NDFBLAotICAgIDB4OTQxNCwgMHg5NDEzLCAweDk0MDMsIDB4OTQwNywgMHg5NDEwLCAweDk0MzYsIDB4OTQyQiwgMHg5NDM1LAotICAgIDB4OTQyMSwgMHg5NDNBLCAweDk0NDEsIDB4OTQ1MiwgMHg5NDQ0LCAweDk0NUIsIDB4OTQ2MCwgMHg5NDYyLAotICAgIDB4OTQ1RSwgMHg5NDZBLCAweDkyMjksIDB4OTQ3MCwgMHg5NDc1LCAweDk0NzcsIDB4OTQ3RCwgMHg5NDVBLAotICAgIDB4OTQ3QywgMHg5NDdFLCAweDk0ODEsIDB4OTQ3RiwgMHg5NTgyLCAweDk1ODcsIDB4OTU4QSwgMHg5NTk0LAotICAgIDB4OTU5NiwgMHg5NTk4LCAweDk1OTksIDB4OTVBMCwgMHg5NUE4LCAweDk1QTcsIDB4OTVBRCwgMHg5NUJDLAotICAgIDB4OTVCQiwgMHg5NUI5LCAweDk1QkUsIDB4OTVDQSwgMHg2RkY2LCAweDk1QzMsIDB4OTVDRCwgMHg5NUNDLAotICAgIDB4OTVENSwgMHg5NUQ0LCAweDk1RDYsIDB4OTVEQywgMHg5NUUxLCAweDk1RTUsIDB4OTVFMiwgMHg5NjIxLAotICAgIDB4OTYyOCwgMHg5NjJFLCAweDk2MkYsIDB4OTY0MiwgMHg5NjRDLCAweDk2NEYsIDB4OTY0QiwgMHg5Njc3LAotICAgIDB4OTY1QywgMHg5NjVFLCAweDk2NUQsIDB4OTY1RiwgMHg5NjY2LCAweDk2NzIsIDB4OTY2QywgMHg5NjhELAotICAgIDB4OTY5OCwgMHg5Njk1LCAweDk2OTcsIDB4OTZBQSwgMHg5NkE3LCAweDk2QjEsIDB4OTZCMiwgMHg5NkIwLAotICAgIDB4OTZCNCwgMHg5NkI2LCAweDk2QjgsIDB4OTZCOSwgMHg5NkNFLCAweDk2Q0IsIDB4OTZDOSwgMHg5NkNELAotICAgIDB4ODk0RCwgMHg5NkRDLCAweDk3MEQsIDB4OTZENSwgMHg5NkY5LCAweDk3MDQsIDB4OTcwNiwgMHg5NzA4LAotICAgIDB4OTcxMywgMHg5NzBFLCAweDk3MTEsIDB4OTcwRiwgMHg5NzE2LCAweDk3MTksIDB4OTcyNCwgMHg5NzJBLAotICAgIDB4OTczMCwgMHg5NzM5LCAweDk3M0QsIDB4OTczRSwgMHg5NzQ0LCAweDk3NDYsIDB4OTc0OCwgMHg5NzQyLAotICAgIDB4OTc0OSwgMHg5NzVDLCAweDk3NjAsIDB4OTc2NCwgMHg5NzY2LCAweDk3NjgsIDB4NTJEMiwgMHg5NzZCLAotICAgIDB4OTc3MSwgMHg5Nzc5LCAweDk3ODUsIDB4OTc3QywgMHg5NzgxLCAweDk3N0EsIDB4OTc4NiwgMHg5NzhCLAotICAgIDB4OTc4RiwgMHg5NzkwLCAweDk3OUMsIDB4OTdBOCwgMHg5N0E2LCAweDk3QTMsIDB4OTdCMywgMHg5N0I0LAotICAgIDB4OTdDMywgMHg5N0M2LCAweDk3QzgsIDB4OTdDQiwgMHg5N0RDLCAweDk3RUQsIDB4OUY0RiwgMHg5N0YyLAotICAgIDB4N0FERiwgMHg5N0Y2LCAweDk3RjUsIDB4OTgwRiwgMHg5ODBDLCAweDk4MzgsIDB4OTgyNCwgMHg5ODIxLAotICAgIDB4OTgzNywgMHg5ODNELCAweDk4NDYsIDB4OTg0RiwgMHg5ODRCLCAweDk4NkIsIDB4OTg2RiwgMHg5ODcwLAotICAgIDB4OTg3MSwgMHg5ODc0LCAweDk4NzMsIDB4OThBQSwgMHg5OEFGLCAweDk4QjEsIDB4OThCNiwgMHg5OEM0LAotICAgIDB4OThDMywgMHg5OEM2LCAweDk4RTksIDB4OThFQiwgMHg5OTAzLCAweDk5MDksIDB4OTkxMiwgMHg5OTE0LAotICAgIDB4OTkxOCwgMHg5OTIxLCAweDk5MUQsIDB4OTkxRSwgMHg5OTI0LCAweDk5MjAsIDB4OTkyQywgMHg5OTJFLAotICAgIDB4OTkzRCwgMHg5OTNFLCAweDk5NDIsIDB4OTk0OSwgMHg5OTQ1LCAweDk5NTAsIDB4OTk0QiwgMHg5OTUxLAotICAgIDB4OTk1MiwgMHg5OTRDLCAweDk5NTUsIDB4OTk5NywgMHg5OTk4LCAweDk5QTUsIDB4OTlBRCwgMHg5OUFFLAotICAgIDB4OTlCQywgMHg5OURGLCAweDk5REIsIDB4OTlERCwgMHg5OUQ4LCAweDk5RDEsIDB4OTlFRCwgMHg5OUVFLAotICAgIDB4OTlGMSwgMHg5OUYyLCAweDk5RkIsIDB4OTlGOCwgMHg5QTAxLCAweDlBMEYsIDB4OUEwNSwgMHg5OUUyLAotICAgIDB4OUExOSwgMHg5QTJCLCAweDlBMzcsIDB4OUE0NSwgMHg5QTQyLCAweDlBNDAsIDB4OUE0MywgMHg5QTNFLAotICAgIDB4OUE1NSwgMHg5QTRELCAweDlBNUIsIDB4OUE1NywgMHg5QTVGLCAweDlBNjIsIDB4OUE2NSwgMHg5QTY0LAotICAgIDB4OUE2OSwgMHg5QTZCLCAweDlBNkEsIDB4OUFBRCwgMHg5QUIwLCAweDlBQkMsIDB4OUFDMCwgMHg5QUNGLAotICAgIDB4OUFEMSwgMHg5QUQzLCAweDlBRDQsIDB4OUFERSwgMHg5QURGLCAweDlBRTIsIDB4OUFFMywgMHg5QUU2LAotICAgIDB4OUFFRiwgMHg5QUVCLCAweDlBRUUsIDB4OUFGNCwgMHg5QUYxLCAweDlBRjcsIDB4OUFGQiwgMHg5QjA2LAotICAgIDB4OUIxOCwgMHg5QjFBLCAweDlCMUYsIDB4OUIyMiwgMHg5QjIzLCAweDlCMjUsIDB4OUIyNywgMHg5QjI4LAotICAgIDB4OUIyOSwgMHg5QjJBLCAweDlCMkUsIDB4OUIyRiwgMHg5QjMyLCAweDlCNDQsIDB4OUI0MywgMHg5QjRGLAotICAgIDB4OUI0RCwgMHg5QjRFLCAweDlCNTEsIDB4OUI1OCwgMHg5Qjc0LCAweDlCOTMsIDB4OUI4MywgMHg5QjkxLAotICAgIDB4OUI5NiwgMHg5Qjk3LCAweDlCOUYsIDB4OUJBMCwgMHg5QkE4LCAweDlCQjQsIDB4OUJDMCwgMHg5QkNBLAotICAgIDB4OUJCOSwgMHg5QkM2LCAweDlCQ0YsIDB4OUJEMSwgMHg5QkQyLCAweDlCRTMsIDB4OUJFMiwgMHg5QkU0LAotICAgIDB4OUJENCwgMHg5QkUxLCAweDlDM0EsIDB4OUJGMiwgMHg5QkYxLCAweDlCRjAsIDB4OUMxNSwgMHg5QzE0LAotICAgIDB4OUMwOSwgMHg5QzEzLCAweDlDMEMsIDB4OUMwNiwgMHg5QzA4LCAweDlDMTIsIDB4OUMwQSwgMHg5QzA0LAotICAgIDB4OUMyRSwgMHg5QzFCLCAweDlDMjUsIDB4OUMyNCwgMHg5QzIxLCAweDlDMzAsIDB4OUM0NywgMHg5QzMyLAotICAgIDB4OUM0NiwgMHg5QzNFLCAweDlDNUEsIDB4OUM2MCwgMHg5QzY3LCAweDlDNzYsIDB4OUM3OCwgMHg5Q0U3LAotICAgIDB4OUNFQywgMHg5Q0YwLCAweDlEMDksIDB4OUQwOCwgMHg5Q0VCLCAweDlEMDMsIDB4OUQwNiwgMHg5RDJBLAotICAgIDB4OUQyNiwgMHg5REFGLCAweDlEMjMsIDB4OUQxRiwgMHg5RDQ0LCAweDlEMTUsIDB4OUQxMiwgMHg5RDQxLAotICAgIDB4OUQzRiwgMHg5RDNFLCAweDlENDYsIDB4OUQ0OCwgMHg5RDVELCAweDlENUUsIDB4OUQ2NCwgMHg5RDUxLAotICAgIDB4OUQ1MCwgMHg5RDU5LCAweDlENzIsIDB4OUQ4OSwgMHg5RDg3LCAweDlEQUIsIDB4OUQ2RiwgMHg5RDdBLAotICAgIDB4OUQ5QSwgMHg5REE0LCAweDlEQTksIDB4OURCMiwgMHg5REM0LCAweDlEQzEsIDB4OURCQiwgMHg5REI4LAotICAgIDB4OURCQSwgMHg5REM2LCAweDlEQ0YsIDB4OURDMiwgMHg5REQ5LCAweDlERDMsIDB4OURGOCwgMHg5REU2LAotICAgIDB4OURFRCwgMHg5REVGLCAweDlERkQsIDB4OUUxQSwgMHg5RTFCLCAweDlFMUUsIDB4OUU3NSwgMHg5RTc5LAotICAgIDB4OUU3RCwgMHg5RTgxLCAweDlFODgsIDB4OUU4QiwgMHg5RThDLCAweDlFOTIsIDB4OUU5NSwgMHg5RTkxLAotICAgIDB4OUU5RCwgMHg5RUE1LCAweDlFQTksIDB4OUVCOCwgMHg5RUFBLCAweDlFQUQsIDB4OTc2MSwgMHg5RUNDLAotICAgIDB4OUVDRSwgMHg5RUNGLCAweDlFRDAsIDB4OUVENCwgMHg5RURDLCAweDlFREUsIDB4OUVERCwgMHg5RUUwLAotICAgIDB4OUVFNSwgMHg5RUU4LCAweDlFRUYsIDB4OUVGNCwgMHg5RUY2LCAweDlFRjcsIDB4OUVGOSwgMHg5RUZCLAotICAgIDB4OUVGQywgMHg5RUZELCAweDlGMDcsIDB4OUYwOCwgMHg3NkI3LCAweDlGMTUsIDB4OUYyMSwgMHg5RjJDLAotICAgIDB4OUYzRSwgMHg5RjRBLCAweDlGNTIsIDB4OUY1NCwgMHg5RjYzLCAweDlGNUYsIDB4OUY2MCwgMHg5RjYxLAotICAgIDB4OUY2NiwgMHg5RjY3LCAweDlGNkMsIDB4OUY2QSwgMHg5Rjc3LCAweDlGNzIsIDB4OUY3NiwgMHg5Rjk1LAotICAgIDB4OUY5QywgMHg5RkEwLCAweDU4MkYsIDB4NjlDNywgMHg5MDU5LCAweDc0NjQsIDB4MjY0MiwgMHgyNTAwLAotICAgIDB4MjUwMSwgMHgyNTAyLCAweDI1MDMsIDB4MjUwNCwgMHgyNTA1LCAweDI1MDYsIDB4MjUwNywgMHgyNTA4LAotICAgIDB4MjUwOSwgMHgyNTBBLCAweDI1MEIsIDB4MjUwQywgMHgyNTBELCAweDI1MEUsIDB4MjUwRiwgMHgyNTEwLAotICAgIDB4MjUxMSwgMHgyNTEyLCAweDI1MTMsIDB4MjUxNCwgMHgyNTE1LCAweDI1MTYsIDB4MjUxNywgMHgyNTE4LAotICAgIDB4MjUxOSwgMHgyNTFBLCAweDI1MUIsIDB4MjUxQywgMHgyNTFELCAweDI1MUUsIDB4MjUxRiwgMHgyNTIwLAotICAgIDB4MjUyMSwgMHgyNTIyLCAweDI1MjMsIDB4MjUyNCwgMHgyNTI1LCAweDI1MjYsIDB4MjUyNywgMHgyNTI4LAotICAgIDB4MjUyOSwgMHgyNTJBLCAweDI1MkIsIDB4MjUyQywgMHgyNTJELCAweDI1MkUsIDB4MjUyRiwgMHgyNTMwLAotICAgIDB4MjUzMSwgMHgyNTMyLCAweDI1MzMsIDB4MjUzNCwgMHgyNTM1LCAweDI1MzYsIDB4MjUzNywgMHgyNTM4LAotICAgIDB4MjUzOSwgMHgyNTNBLCAweDI1M0IsIDB4MjUzQywgMHgyNTNELCAweDI1M0UsIDB4MjUzRiwgMHgyNTQwLAotICAgIDB4MjU0MSwgMHgyNTQyLCAweDI1NDMsIDB4MjU0NCwgMHgyNTQ1LCAweDI1NDYsIDB4MjU0NywgMHgyNTQ4LAotICAgIDB4MjU0OSwgMHgyNTRBLCAweDI1NEIsIDB4MjQ2MCwgMHgyNDYxLCAweDI0NjIsIDB4MjQ2MywgMHgyNDY0LAotICAgIDB4MjQ2NSwgMHgyNDY2LCAweDI0NjcsIDB4MjQ2OCwgMHgyNDY5LCAweDI0NkEsIDB4MjQ2QiwgMHgyNDZDLAotICAgIDB4MjQ2RCwgMHgyNDZFLCAweDI0NkYsIDB4MjQ3MCwgMHgyNDcxLCAweDI0NzIsIDB4MjQ3MywgMHgyMTYwLAotICAgIDB4MjE2MSwgMHgyMTYyLCAweDIxNjMsIDB4MjE2NCwgMHgyMTY1LCAweDIxNjYsIDB4MjE2NywgMHgyMTY4LAotICAgIDB4MjE2OSwgMHgzMzQ5LCAweDMzMTQsIDB4MzMyMiwgMHgzMzRELCAweDMzMTgsIDB4MzMyNywgMHgzMzAzLAotICAgIDB4MzMzNiwgMHgzMzUxLCAweDMzNTcsIDB4MzMwRCwgMHgzMzI2LCAweDMzMjMsIDB4MzMyQiwgMHgzMzRBLAotICAgIDB4MzMzQiwgMHgzMzlDLCAweDMzOUQsIDB4MzM5RSwgMHgzMzhFLCAweDMzOEYsIDB4MzNDNCwgMHgzM0ExLAotICAgIDB4MzAxRCwgMHgzMDFGLCAweDIxMTYsIDB4MzNDRCwgMHgyMTIxLCAweDMyQTQsIDB4MzJBNSwgMHgzMkE2LAotICAgIDB4MzJBNywgMHgzMkE4LCAweDMyMzEsIDB4MzIzMiwgMHgzMjM5LCAweDMzN0UsIDB4MzM3RCwgMHgzMzdDLAotICAgIDB4MjIyRSwgMHgyMjExLCAweDIyMUEsIDB4MjJBNSwgMHgyMjIwLCAweDIyMUYsIDB4MjJCRiwgMHgyMjI5LAotICAgIDB4MjIyQSwgMHg1NTVFLCAweDk4RjQsIDB4NkVBMiwgMHg5QzJGLCAweDZERUIsIDB4OEZDMiwgMHg2QjFELAotICAgIDB4NTNBOSwgMHg5NThGLCAweDU2NDIsIDB4OTkwQywgMHg3MTMwLCAweDg5NTYsIDB4OURENywgMHg4RkU2LAotICAgIDB4NjA2MiwgMHg2MkQwLCAweDY2NjYsIDB4NTU5RCwgMHg4NDVCLCAweDk3ODQsIDB4NTY5OSwgMHg2Rjk3LAotICAgIDB4N0ZGMCwgMHg3RkVCLCAweDVGQkQsIDB4Nzk0NywgMHg0RkUwLCAweDUzN0YsIDB4NTBDNSwgMHg4RUMwLAotICAgIDB4NTVCMCwgMHg2QURCLCAweDVDNTEsIDB4OTc3NCwgMHg3OTQxLCAweDYxNjcsIDB4N0EzRCwgMHg3RTZCLAotICAgIDB4ODM0QSwgMHg5Njk5LCAweDUwMjYsIDB4NUFDQywgMHg2MzcyLCAweDlFN0MsIDB4OEFGQSwgMHg1REY3LAotICAgIDB4NjYzQiwgMHg2RTlELCAweDlFQjQsIDB4OUQ2MCwgMHg3NTExLCAweDkxQzcsIDB4Njk4QSwgMHg2ODA1LAotICAgIDB4ODVBOSwgMHg5QkQ2LCAweDkzMDYsIDB4NzNDQSwgMHg1M0YxLCAweDVDNjIsIDB4OTA2RSwgMHg2NzUzLAotICAgIDB4NzA3QywgMHg3RTYxLCAweDkxNEIsIDB4NjZEOSwgMHg2RTFBLCAweDg1QUYsIDB4ODVGNywgMHg1NEU4LAotICAgIDB4NUVFMCwgMHg2OEEyLCAweDg1MjMsIDB4OTFBQywgMHg5Nzk4LCAweDg3NTUsIDB4OTc3MSwgMHg5MDE3LAotICAgIDB4N0ZFMCwgMHg2NDdBLCAweDkwMUQsIDB4ODdFQywgMHg2NEIwLCAweDY4MTMsIDB4NzE0RSwgMHg3MTdELAotICAgIDB4OEE2RSwgMHg1NjRDLCAweDkwNjEsIDB4NTI3NSwgMHg2NDE0LCAweDc2MjYsIDB4OTA1QywgMHg5QTUyLAotICAgIDB4ODE3RiwgMHg5RURCLCAweDU1NDQsIDB4NkZFRiwgMHg3NDIyLCAweDg2RjgsIDB4NURGRCwgMHg4RkJGLAotICAgIDB4NjhEQSwgMHg5QzQ4LCAweDZBM0QsIDB4N0MxRSwgMHg4QTNCLCAweDcwMjYsIDB4NTFDQiwgMHg2MzU3LAotICAgIDB4NjlDQywgMHg5MzlBLCAweDU4NUEsIDB4NjQ1MSwgMHg5MTJELCAweDY0RTIsIDB4NkVCQSwgMHg1ODYxLAotICAgIDB4OTg1QSwgMHg1ODM1LCAweDVDNjAsIDB4ODNERiwgMHg4Q0VELCAweDU4NTgsIDB4NzlCMSwgMHg5RDA3LAotICAgIDB4NzAwNiwgMHg3MDFFLCAweDU2NzgsIDB4OTA0MSwgMHg5ODEzLCAweDkwQTMsIDB4OEIwRSwgMHg3MDU4LAotICAgIDB4Njk2MiwgMHg3OUIwLCAweDU2Q0EsIDB4NzI0QywgMHg5MDE5LCAweDc5RTQsIDB4NTI1RCwgMHg3QkI4LAotICAgIDB4NkY1MSwgMHg5MUIxLCAweDYzM0QsIDB4NjI0OSwgMHg2QTBCLCAweDY3Q0EsIDB4N0ExNywgMHg5MDNDLAotICAgIDB4NUE5QiwgMHg4QjJDLCAweDVFREYsIDB4NzAxNSwgMHg5ODNCLCAweDg1M0QsIDB4NzdBNSwgMHg1QTI5LAotICAgIDB4NUU5NiwgMHg2Q0UxLCAweDg0RUMsIDB4OTgzMCwgMHg5QzUyLCAweDlFQjUsIDB4NTEzMiwgMHg5OTA1LAotICAgIDB4N0M3RSwgMHg5NDUzLCAweDYxMDgsIDB4NzY1MiwgMHg3MzM3LCAweDcxOTQsIDB4ODAwMCwgMHg4NDBBLAotICAgIDB4OTA3QywgMHg2RjIzLCAweDcxNDksIDB4ODRFRSwgMHg2OTk0LCAweDg4MUYsIDB4NTE1NCwgMHg1MTg5LAotICAgIDB4NTE5NSwgMHg1MUE0LCAweDU1MzksIDB4NTUzMywgMHg1NUU0LCAweDU2MzIsIDB4NTZBNSwgMHg1ODBCLAotICAgIDB4NUFCRSwgMHg1QkMzLCAweDVDNUIsIDB4NUU2NCwgMHg2MDk3LCAweDYzNjksIDB4NjQwNiwgMHg2NTIyLAotICAgIDB4NjU4MywgMHg2N0E2LCAweDY3QjQsIDB4Njg5QiwgMHg2ODhFLCAweDZFNkUsIDB4NzFENywgMHg3MjI4LAotICAgIDB4NzNDRSwgMHg3NTA0LCAweDc1MEQsIDB4NzUxNSwgMHg3NjkzLCAweDc4N0MsIDB4N0EzMSwgMHg5RjlELAotICAgIDB4N0I5OSwgMHg3QzkwLCAweDdDQUUsIDB4N0Q5QiwgMHg3REFFLCAweDdEOUYsIDB4N0ZENCwgMHg4MjJFLAotICAgIDB4ODI4RCwgMHg4MkQyLCAweDgzMjMsIDB4ODM3NSwgMHg4NTE3LCAweDg1M0UsIDB4ODc4MiwgMHg4N0QyLAotICAgIDB4ODkwQSwgMHg4OUFGLCAweDhBREUsIDB4OEI0MSwgMHg4RERBLCAweDhFMDksIDB4OEYxMywgMHg4RkVBLAotICAgIDB4OEZFOSwgMHg5MDU4LCAweDYyNDgsIDB4OTFDMSwgMHg5NUJCLCAweDc3NjIsIDB4OTcyNCwgMHg5NzYwLAotICAgIDB4OTc2RCwgMHg5ODI0LCAweDlCMkUsIDB4OUI5NywgMHg5QkYyLCAweDlFQUEsIDB4OUY5QywgMHgzMDAxLAotICAgIDB4MzAwMiwgMHgyMDNFLCAweEZGM0YsIDB4MzBGQywgMHgyMDE1LCAweDIwMTAsIDB4MzAxQywgMHgyMDE2LAotICAgIDB4RkY1QywgMHgyMDI2LCAweDIwMjUsIDB4RkYwOCwgMHhGRjA5LCAweDMwMTQsIDB4MzAxNSwgMHhGRjNCLAotICAgIDB4RkYzRCwgMHhGRjVCLCAweEZGNUQsIDB4MzAwOCwgMHgzMDA5LCAweDMwMEEsIDB4MzAwQiwgMHgzMDBDLAotICAgIDB4MzAwRCwgMHgzMDBFLCAweDMwMEYsIDB4MzAxMCwgMHgzMDExLCAweEZGMUQsIDB4MzA0MSwgMHgzMDQzLAotICAgIDB4MzA0NSwgMHgzMDQ3LCAweDMwNDksIDB4MzA2MywgMHgzMDgzLCAweDMwODUsIDB4MzA4NywgMHgzMDhFLAotICAgIDB4MzBBMSwgMHgzMEEzLCAweDMwQTUsIDB4MzBBNywgMHgzMEE5LCAweDMwQzMsIDB4MzBFMywgMHgzMEU1LAotICAgIDB4MzBFNywgMHgzMEVFLCAweDMwRjUsIDB4MzBGNiwgMHgzMzQ5LCAweDMzMTQsIDB4MzMyMiwgMHgzMzRELAotICAgIDB4MzMxOCwgMHgzMzI3LCAweDMzMDMsIDB4MzMzNiwgMHgzMzUxLCAweDMzNTcsIDB4MzMwRCwgMHgzMzI2LAotICAgIDB4MzMyMywgMHgzMzJCLCAweDMzNEEsIDB4MzMzQiwgMHgzMDFELCAweDMwMUUsIDB4MzA5NCwgMHgzMDRCLAotICAgIDB4MzA1MSwgMHg4MkE2LCAweDgzMjgsIDB4NTY1MywgMHg1M0E5LCAweDcyNTksIDB4NkM3MiwgMHg3QjA4LAotICAgIDB4OTk1NywgMHg2MkYzLCAweDk5MTAsIDB4OTc2RCwgMHg3MTdELCAweDdBN0YsIDB4N0JBRCwgMHg2M0MzLAotICAgIDB4ODNERiwgMHg3OTYyLCAweDUzREIsIDB4N0JDNywgMHg4RkM0LCAweDdDM0UsIDB4NTBDQSwgMHg1MzE1LAotICAgIDB4NTVBOSwgMHg1NkFFLCAweDU4MTksIDB4NTkxQiwgMHg1QzI4LCAweDVFRDAsIDB4NUVDRiwgMHg2MjQxLAotICAgIDB4NjZDMSwgMHg2QzA4LCAweDZFMjMsIDB4NkVFQywgMHg3QTk3LCAweDdCREQsIDB4N0ZFOSwgMHg4NDIyLAotICAgIDB4ODc1OSwgMHg4ODBFLCAweDg3RDIsIDB4OUExOSwgMHg5RUFELCAweEZGRTQsIDB4RkYwNywgMHhGRjAyLAotICAgIDB4MTFBOCwgMHgyNUMxLCAweDI1QjcsIDB4MjFFOSwgMHgyMUU3LCAweDIxRTYsIDB4MjFFOCwgMHgyNUEyLAotICAgIDB4MjY2NywgMHgyNjYxLCAweDI2NjQsIDB4MjY2MiwgMHgzM0EwLCAweDMzQTIsIDB4MzNBNCwgMHgzM0E1LAotICAgIDB4MzM5NywgMHgyMTEzLCAweDMzOTgsIDB4MzNCMywgMHgzM0IyLCAweDMzQjEsIDB4MzNCMCwgMHgzMzg1LAotICAgIDB4MzM4NiwgMHgzMzg3LCAweDMzQ0IsIDB4MzM5MCwgMHgzM0Q0LCAweDMzOTYsIDB4MzMyMiwgMHgzMzE2LAotICAgIDB4MzMxOCwgMHgzMzE1LCAweDMzMDMsIDB4MzMyMywgMHgzMzU3LCAweDMzNDIsIDB4MzMzOSwgMHgzMzNCLAotICAgIDB4MzMwMCwgMHgzMzMxLCAweDMzNDcsIDB4MzMxRSwgMHgzMzJBLCAweDMzQ0QsIDB4MzM3RiwgMHgyMTIxLAotICAgIDB4MjYwRSwgMHgzMDM2LCAweDMwMjAsIDB4MDBBOSwgMHgwMEFFLCAweDAwMDAsIDB4MjQ4OCwgMHgyNDg5LAotICAgIDB4MjQ4QSwgMHgyNDhCLCAweDI0OEMsIDB4MjQ4RCwgMHgyNDhFLCAweDI0OEYsIDB4MjQ5MCwgMHgyNDc0LAotICAgIDB4MjQ3NSwgMHgyNDc2LCAweDI0NzcsIDB4MjQ3OCwgMHgyNDc5LCAweDI0N0EsIDB4MjQ3QiwgMHgyNDdDLAotICAgIDB4MjQ3RCwgMHgyNDdFLCAweDI0N0YsIDB4MjQ4MCwgMHgyNDgxLCAweDI0ODIsIDB4MjQ4MywgMHgyNDg0LAotICAgIDB4MjQ4NSwgMHgyNDg2LCAweDI0ODcsIDB4MzI1MSwgMHgyMTcwLCAweDIxNzEsIDB4MjE3MiwgMHgyMTczLAotICAgIDB4MjE3NCwgMHgyMTc1LCAweDIxNzYsIDB4MjE3NywgMHgyMTc4LCAweDIxNzksIDB4MzI1MiwgMHgzMjUzLAotICAgIDB4MzI1NCwgMHgzMjU1LCAweDMyNTYsIDB4MzI1NywgMHgzMjU4LCAweDMyNTksIDB4MzI1QSwgMHgzMjVCLAotICAgIDB4MjQ5QywgMHgyNDlELCAweDI0OUUsIDB4MjQ5RiwgMHgyNEEwLCAweDI0QTEsIDB4MjRBMiwgMHgyNEEzLAotICAgIDB4MjRBNCwgMHgyNEE1LCAweDI0QTYsIDB4MjRBNywgMHgyNEE4LCAweDI0QTksIDB4MjRBQSwgMHgyNEFCLAotICAgIDB4MjRBQywgMHgyNEFELCAweDI0QUUsIDB4MjRBRiwgMHgyNEIwLCAweDI0QjEsIDB4MjRCMiwgMHgyNEIzLAotICAgIDB4MjRCNCwgMHgyNEI1LCAweDMyNDMsIDB4MzIzRCwgMHgzMjNGLCAweDMyMzQsIDB4MzIzOCwgMHgzMjMzLAotICAgIDB4MzIzQywgMHgzMjQyLCAweDMyM0UsIDB4MzIzNiwgMHgzMjM1LCAweDMyM0IsIDB4MzI0MCwgMHgzMjNBLAotICAgIDB4MzJCMCwgMHgzMkFELCAweDMyQTksIDB4MzJBRiwgMHgzMjk0LCAweDMyQUEsIDB4MzI5OCwgMHgzMkFCLAotICAgIDB4MzI5MiwgMHgzMjkxLCAweDMyOTMsIDB4MzJBQywgMHgzMkFFLCAweDMyOTYsIDB4MjNBOSwgMHgyM0E4LAotICAgIDB4MjNBNywgMHhGRTM4LCAweDIzQUQsIDB4MjNBQywgMHgyM0FCLCAweEZFMzgsIDB4MjNBQiwgMHgyM0FDLAotICAgIDB4MjNBRCwgMHhGRTM4LCAweDIzQTcsIDB4MjNBOCwgMHgyM0E5LCAweEZFMzgsIDB4MzNDQywgMHgzMzA1LAotICAgIDB4MDBCRCwgMHgwMEJDLCAweDMzOUYsIDB4MzNBMywgMHgzM0E2LCAweEZGRkQsIDB4RkZGRCwgMHgzMjlFLAotICAgIDB4MzM4OCwgMHgzMzg5LCAweDMzQzgsIDB4MjIyRCwgMHg1MzcwLCAweDMyMzAsIDB4MzIyQSwgMHgzMjJCLAotICAgIDB4MzIyQywgMHgzMjJELCAweDMyMkUsIDB4MzIyRiwgMHgzMjM3LCAweDMyNDEsIDB4MjdBMSwgMHgyMUU2LAotICAgIDB4MjFFNywgMHgyMUU5LCAweDI1QzksIDB4MjY2MCwgMHgyNjY1LCAweDI2NjMsIDB4MjY2NiwgMHgyNjAwLAotICAgIDB4MjYwMSwgMHgyNjAyLCAweDI2MDMsIDB4MjYxRSwgMHgyNjFDLCAweDI2MUQsIDB4MjYxRiwgMHgzMjk5LAotICAgIDB4MjRFQSwgMHgyMTZBLCAweDIxNkIsIDB4RkYxMCwgMHhGRjEwLCAweDMwMDAsIDB4MjU4MSwgMHgyNTgyLAotICAgIDB4MjU4MywgMHgyNTg0LCAweDI1ODUsIDB4MjU4NiwgMHgyNTg3LCAweDI1ODgsIDB4MjU4RiwgMHgyNThFLAotICAgIDB4MjU4RCwgMHgyNThDLCAweDI1OEIsIDB4MjU4QSwgMHgyNTg5LCAweDI1OTQsIDB4MjU5NSwgMHgyNTZELAotICAgIDB4MjU2RSwgMHgyNTcwLCAweDI1NkYsIDB4MjU1MCwgMHgyNTVFLCAweDI1NkEsIDB4MjU2MSwgMHgyNUUyLAotICAgIDB4MjVFMywgMHgyNUU1LCAweDI1RTQsIDB4MjVDRiwgMHgwRUQwLCAweDI1NzEsIDB4MjU3MiwgMHgyNTczLAotICAgIDB4MzA0QiwgMHgzMDUxLCAweDkwMjIsIDB4OEZCQiwgMHhGRjBDLCAweDAwQjAsIDB4MzAxMywgMHgzMDlDLAotICAgIDB4MzA5QiwgMHgwMkNGLCAweEZGMEUsIDB4MjAxOCwgMHgyMDE5LCAweDIwMUMsIDB4MjAxRCwgMHgyMDFDLAotICAgIDB4MjAxRSwgMHgyMDE4LCAweDIwMUEsIDB4MDJCQSwgMHg1MURDLCAweDcxOTksIDB4Mjc3NiwgMHgyNzc3LAotICAgIDB4Mjc3OCwgMHgyNzc5LCAweDI3N0EsIDB4Mjc3QiwgMHgyNzdDLCAweDI3N0QsIDB4Mjc3RSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDIxN0EsIDB4MjE3QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTdGLAotICAgIDB4MjEwQSwgMHgyMTA5LCAweDAwMDAsIDB4MDAwMCwgMHgzMDA0LCAweDIxQzYsIDB4MjFDNCwgMHgyMUM1LAotICAgIDB4MDAwMCwgMHgzMEY3LCAweDMwRjgsIDB4MzBGOSwgMHgzMEZBLCAweDU5MjcsIDB4NUMwRiwgMHgzMjlELAotICAgIDB4NjNBNywgMHgwMDAwLCAweDAwMDAsIDB4MzM3QiwgMHgzMzdGLCAweDAwMDAsIDB4MDAwMCwgMHgzMzMzLAotICAgIDB4MzM0RSwgMHgzMzIyLCAweDMzMTYsIDB4MzMwNSwgMHgzMzA1LCAweDMzMDUsIDB4MzMzMywgMHgzMzRFLAotICAgIDB4MzM0RSwgMHgzMzRFLCAweDMzMDMsIDB4MzMxOCwgMHgzMzE1LCAweDMzMzksIDB4MzMzOSwgMHgzMzM5LAotICAgIDB4MzM1NywgMHgzMzQyLCAweDMzNDIsIDB4MzM0MiwgMHgzMzIzLCAweDMzM0IsIDB4MzMwMCwgMHgzMzFFLAotICAgIDB4MzMxRSwgMHgzMzFFLCAweDMzMkEsIDB4MzMyQSwgMHgzMzJBLCAweDMzNDcsIDB4MzMzMSwgMHg3RThBLAotICAgIDB4ODkxQywgMHg5MzQ4LCAweDkyODgsIDB4ODREQywgMHg0RkM5LCAweDcwQkIsIDB4NjYzMSwgMHg2OEM4LAotICAgIDB4OTJGOSwgMHg2NkZCLCAweDVGNDUsIDB4NEUyOCwgMHg0RUUxLCAweDRFRkMsIDB4NEYwMCwgMHg0RjAzLAotICAgIDB4NEYzOSwgMHg0RjU2LCAweDRGOTIsIDB4NEY4QSwgMHg0RjlBLCAweDRGOTQsIDB4NEZDRCwgMHg1MDQwLAotICAgIDB4NTAyMiwgMHg0RkZGLCAweDUwMUUsIDB4NTA0NiwgMHg1MDcwLCAweDUwNDIsIDB4NTA5NCwgMHg1MEY0LAotICAgIDB4NTBEOCwgMHg1MTRBLCAweDUxNjQsIDB4NTE5RCwgMHg1MUJFLCAweDUxRUMsIDB4NTIxNSwgMHg1MjlDLAotICAgIDB4NTJBNiwgMHg1MkMwLCAweDUyREIsIDB4NTMwMCwgMHg1MzA3LCAweDUzMjQsIDB4NTM3MiwgMHg1MzkzLAotICAgIDB4NTNCMiwgMHg1M0RELCAweEZBMEUsIDB4NTQ5QywgMHg1NDhBLCAweDU0QTksIDB4NTRGRiwgMHg1NTg2LAotICAgIDB4NTc1OSwgMHg1NzY1LCAweDU3QUMsIDB4NTdDOCwgMHg1N0M3LCAweEZBMEYsIDB4RkExMCwgMHg1ODlFLAotICAgIDB4NThCMiwgMHg1OTBCLCAweDU5NTMsIDB4NTk1QiwgMHg1OTVELCAweDU5NjMsIDB4NTlBNCwgMHg1OUJBLAotICAgIDB4NUI1NiwgMHg1QkMwLCAweDc1MkYsIDB4NUJEOCwgMHg1QkVDLCAweDVDMUUsIDB4NUNBNiwgMHg1Q0JBLAotICAgIDB4NUNGNSwgMHg1RDI3LCAweDVENTMsIDB4RkExMSwgMHg1RDQyLCAweDVENkQsIDB4NURCOCwgMHg1REI5LAotICAgIDB4NUREMCwgMHg1RjIxLCAweDVGMzQsIDB4NUY2NywgMHg1RkI3LCAweDVGREUsIDB4NjA1RCwgMHg2MDg1LAotICAgIDB4NjA4QSwgMHg2MERFLCAweDYwRDUsIDB4NjEyMCwgMHg2MEYyLCAweDYxMTEsIDB4NjEzNywgMHg2MTMwLAotICAgIDB4NjE5OCwgMHg2MjEzLCAweDYyQTYsIDB4NjNGNSwgMHg2NDYwLCAweDY0OUQsIDB4NjRDRSwgMHg2NTRFLAotICAgIDB4NjYwMCwgMHg2NjE1LCAweDY2MDksIDB4NjYyRSwgMHg2NjFFLCAweDY2MjQsIDB4NjY2NSwgMHg2NjU3LAotICAgIDB4NjY1OSwgMHhGQTEyLCAweDY2NzMsIDB4NjY5OSwgMHg2NkEwLCAweDY2QjIsIDB4NjZCRiwgMHg2NkZBLAotICAgIDB4NjcwRSwgMHhGOTI5LCAweDY3NjYsIDB4NjdCQiwgMHg2ODUyLCAweDY3QzAsIDB4NjgwMSwgMHg2ODQ0LAotICAgIDB4NjhDRiwgMHhGQTEzLCAweDY5NjgsIDB4RkExNCwgMHg2OTk4LCAweDY5RTIsIDB4NkEzMCwgMHg2QTZCLAotICAgIDB4NkE0NiwgMHg2QTczLCAweDZBN0UsIDB4NkFFMiwgMHg2QUU0LCAweDZCRDYsIDB4NkMzRiwgMHg2QzVDLAotICAgIDB4NkM4NiwgMHg2QzZGLCAweDZDREEsIDB4NkQwNCwgMHg2RDg3LCAweDZENkYsIDB4NkQ5NiwgMHg2REFDLAotICAgIDB4NkRDRiwgMHg2REY4LCAweDZERjIsIDB4NkRGQywgMHg2RTM5LCAweDZFNUMsIDB4NkUyNywgMHg2RTNDLAotICAgIDB4NkVCRiwgMHg2Rjg4LCAweDZGQjUsIDB4NkZGNSwgMHg3MDA1LCAweDcwMDcsIDB4NzAyOCwgMHg3MDg1LAotICAgIDB4NzBBQiwgMHg3MTBGLCAweDcxMDQsIDB4NzE1QywgMHg3MTQ2LCAweDcxNDcsIDB4RkExNSwgMHg3MUMxLAotICAgIDB4NzFGRSwgMHg3MkIxLCAweDcyQkUsIDB4NzMyNCwgMHhGQTE2LCAweDczNzcsIDB4NzNCRCwgMHg3M0M5LAotICAgIDB4NzNENiwgMHg3M0UzLCAweDczRDIsIDB4NzQwNywgMHg3M0Y1LCAweDc0MjYsIDB4NzQyQSwgMHg3NDI5LAotICAgIDB4NzQyRSwgMHg3NDYyLCAweDc0ODksIDB4NzQ5RiwgMHg3NTAxLCAweDc1NkYsIDB4NzY4MiwgMHg3NjlDLAotICAgIDB4NzY5RSwgMHg3NjlCLCAweDc2QTYsIDB4RkExNywgMHg3NzQ2LCAweDUyQUYsIDB4NzgyMSwgMHg3ODRFLAotICAgIDB4Nzg2NCwgMHg3ODdBLCAweDc5MzAsIDB4RkExOCwgMHhGQTE5LCAweEZBMUEsIDB4Nzk5NCwgMHhGQTFCLAotICAgIDB4Nzk5QiwgMHg3QUQxLCAweDdBRTcsIDB4RkExQywgMHg3QUVCLCAweDdCOUUsIDB4RkExRCwgMHg3RDQ4LAotICAgIDB4N0Q1QywgMHg3REI3LCAweDdEQTAsIDB4N0RENiwgMHg3RTUyLCAweDdGNDcsIDB4N0ZBMSwgMHhGQTFFLAotICAgIDB4ODMwMSwgMHg4MzYyLCAweDgzN0YsIDB4ODNDNywgMHg4M0Y2LCAweDg0NDgsIDB4ODRCNCwgMHg4NTUzLAotICAgIDB4ODU1OSwgMHg4NTZCLCAweEZBMUYsIDB4ODVCMCwgMHhGQTIwLCAweEZBMjEsIDB4ODgwNywgMHg4OEY1LAotICAgIDB4OEExMiwgMHg4QTM3LCAweDhBNzksIDB4OEFBNywgMHg4QUJFLCAweDhBREYsIDB4RkEyMiwgMHg4QUY2LAotICAgIDB4OEI1MywgMHg4QjdGLCAweDhDRjAsIDB4OENGNCwgMHg4RDEyLCAweDhENzYsIDB4RkEyMywgMHg4RUNGLAotICAgIDB4RkEyNCwgMHhGQTI1LCAweDkwNjcsIDB4OTBERSwgMHhGQTI2LCAweDkxMTUsIDB4OTEyNywgMHg5MURBLAotICAgIDB4OTFENywgMHg5MURFLCAweDkxRUQsIDB4OTFFRSwgMHg5MUU0LCAweDkxRTUsIDB4OTIwNiwgMHg5MjEwLAotICAgIDB4OTIwQSwgMHg5MjNBLCAweDkyNDAsIDB4OTIzQywgMHg5MjRFLCAweDkyNTksIDB4OTI1MSwgMHg5MjM5LAotICAgIDB4OTI2NywgMHg5MkE3LCAweDkyNzcsIDB4OTI3OCwgMHg5MkU3LCAweDkyRDcsIDB4OTJEOSwgMHg5MkQwLAotICAgIDB4RkEyNywgMHg5MkQ1LCAweDkyRTAsIDB4OTJEMywgMHg5MzI1LCAweDkzMjEsIDB4OTJGQiwgMHhGQTI4LAotICAgIDB4OTMxRSwgMHg5MkZGLCAweDkzMUQsIDB4OTMwMiwgMHg5MzcwLCAweDkzNTcsIDB4OTNBNCwgMHg5M0M2LAotICAgIDB4OTNERSwgMHg5M0Y4LCAweDk0MzEsIDB4OTQ0NSwgMHg5NDQ4LCAweDk1OTIsIDB4RjlEQywgMHhGQTI5LAotICAgIDB4OTY5RCwgMHg5NkFGLCAweDk3MzMsIDB4OTczQiwgMHg5NzQzLCAweDk3NEQsIDB4OTc0RiwgMHg5NzUxLAotICAgIDB4OTc1NSwgMHg5ODU3LCAweDk4NjUsIDB4RkEyQSwgMHhGQTJCLCAweDk5MjcsIDB4RkEyQywgMHg5OTlFLAotICAgIDB4OUE0RSwgMHg5QUQ5LCAweDlBREMsIDB4OUI3NSwgMHg5QjcyLCAweDlCOEYsIDB4OUJCMSwgMHg5QkJCLAotICAgIDB4OUMwMCwgMHg5RDcwLCAweDlENkIsIDB4RkEyRCwgMHg5RTE5LCAweDlFRDEsIDB4MDBBQywgMHgwMDVDLAotICAgIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAotICAgIDB4MDAyOCwgMHgwMDI5LCAweDAwMkEsIDB4MDAyQiwgMHgwMDJDLCAweDAwMkQsIDB4MDAyRSwgMHgwMDJGLAotICAgIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAotICAgIDB4MDAzOCwgMHgwMDM5LCAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLCAweDAwM0QsIDB4MDAzRSwgMHgwMDNGLAotICAgIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAotICAgIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLAotICAgIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAotICAgIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MDA1QiwgMHgwMEE1LCAweDAwNUQsIDB4MDA1RSwgMHgwMDVGLAotICAgIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAotICAgIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsIDB4MDA2RSwgMHgwMDZGLAotICAgIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAotICAgIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDA3QiwgMHgwMEE2LCAweDAwN0QsIDB4MDMwMywgMHgwMkJDLAotICAgIDB4MDA1QywgMHgwMkJCLCAweDAwN0MsIDB4MDA3RSwgMHgwMEExLCAweDAwQTIsIDB4MDBBMywgMHgyMDQ0LAotICAgIDB4MDE5MiwgMHgwMEE3LCAweDAwQTQsIDB4MjAxQywgMHgwMEFCLCAweDIwMzksIDB4MjAzQSwgMHhGQjAxLAotICAgIDB4RkIwMiwgMHgyMDEyLCAweDIwMjAsIDB4MjAyMSwgMHgwMEI3LCAweDAwQjYsIDB4MjAyMiwgMHgyMDFBLAotICAgIDB4MjAxRSwgMHgyMDFELCAweDAwQkIsIDB4MjAyNiwgMHgyMDMwLCAweDAwQkYsIDB4MDMwMSwgMHgwMzAyLAotICAgIDB4MDBBRiwgMHgwMzA2LCAweDAzMDcsIDB4MDMwOCwgMHgwMzBBLCAweDAwQjgsIDB4MDMwQiwgMHgwMzI4LAotICAgIDB4MDMwQywgMHgwMzM2LCAweDAwQzYsIDB4MDBBQSwgMHgwMTQxLCAweDAwRDgsIDB4MDE1MiwgMHgwMEJBLAotICAgIDB4MDBFNiwgMHgwMTMxLCAweDAxNDIsIDB4MDBGOCwgMHgwMTUzLCAweDAwREYsIDB4MDAyRCwgMHgwMEE5LAotICAgIDB4MDBBQywgMHgwMEFFLCAweDAwQjAsIDB4MDBCMSwgMHgwMEIyLCAweDAwQjMsIDB4MDBCNSwgMHgwMEI5LAotICAgIDB4MDBCQywgMHgwMEJELCAweDAwQkUsIDB4MDBDMCwgMHgwMEMxLCAweDAwQzIsIDB4MDBDMywgMHgwMEM0LAotICAgIDB4MDBDNSwgMHgwMEM3LCAweDAwQzgsIDB4MDBDOSwgMHgwMENBLCAweDAwQ0IsIDB4MDBDQywgMHgwMENELAotICAgIDB4MDBDRSwgMHgwMENGLCAweDAwRDAsIDB4MDBEMSwgMHgwMEQyLCAweDAwRDMsIDB4MDBENCwgMHgwMEQ1LAotICAgIDB4MDBENiwgMHgwMEQ3LCAweDAwRDksIDB4MDBEQSwgMHgwMERCLCAweDAwREMsIDB4MDBERCwgMHgwMERFLAotICAgIDB4MDBFMCwgMHgwMEUxLCAweDAwRTIsIDB4MDBFMywgMHgwMEU0LCAweDAwRTUsIDB4MDBFNywgMHgwMEU4LAotICAgIDB4MDBFOSwgMHgwMEVBLCAweDAwRUIsIDB4MDBFQywgMHgwMEVELCAweDAwRUUsIDB4MDBFRiwgMHgwMEYwLAotICAgIDB4MDBGMSwgMHgwMEYyLCAweDAwRjMsIDB4MDBGNCwgMHgwMEY1LCAweDAwRjYsIDB4MDBGNywgMHgwMEY5LAotICAgIDB4MDBGQSwgMHgwMEZCLCAweDAwRkMsIDB4MDBGRCwgMHgwMEZFLCAweDAwRkYsIDB4MDE2MCwgMHgwMTc4LAotICAgIDB4MDE3RCwgMHgwMzA1LCAweDAxNjEsIDB4MjEyMiwgMHgwMTdFLCAweDAwMzAsIDB4MjAwMiwgMHgwMDIxLAotICAgIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsIDB4MDAyOCwgMHgwMDI5LAotICAgIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLCAweDAwMkYsIDB4MDAzMCwgMHgwMDMxLAotICAgIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LAotICAgIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLCAweDAwM0YsIDB4MDA0MCwgMHgwMDQxLAotICAgIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LAotICAgIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLAotICAgIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LAotICAgIDB4MDA1QSwgMHgwMDVCLCAweDAwQTUsIDB4MDA1RCwgMHgwMDVFLCAweDAwNUYsIDB4MDA2MCwgMHgwMDYxLAotICAgIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LAotICAgIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLAotICAgIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LAotICAgIDB4MDA3QSwgMHgwMDdCLCAweDAwN0MsIDB4MDA3RCwgMHgyMDNFLCAweEZGNDAsIDB4MjAzMiwgMHgwMEE4LAotICAgIDB4MjAzNiwgMHgwMEM0LCAweDAwRjksIDB4MDBFOSwgMHgwMEVELCAweDAwREYsIDB4MDBFNywgMHgwMEM3LAotICAgIDB4MDBEMSwgMHgwMEYxLCAweDAwQTIsIDB4MDBBMywgMHgwMEYzLCAweDAwRkEsIDB4MDBBMSwgMHgwMEJGLAotICAgIDB4MDBCRCwgMHgwMEQ2LCAweDAwREMsIDB4MDBFNCwgMHgwMEVCLCAweDAwRUYsIDB4MDBGNiwgMHgwMERDLAotICAgIDB4MDBFMiwgMHgwMEVBLCAweDAwRUUsIDB4MDBGNCwgMHgwMEZDLCAweDAwRTAsIDB4MDBFOSwgMHgwMEUxLAotICAgIDB4MDA3RSwgMHgwMDMwLCAweDAwQUMsIDB4MDA1QywgMHhGRjYwLCAweEZGNjEsIDB4RkY2MiwgMHhGRjYzLAotICAgIDB4RkY2NCwgMHhGRjY1LCAweEZGNjYsIDB4RkY2NywgMHhGRjY4LCAweEZGNjksIDB4RkY2QSwgMHhGRjZCLAotICAgIDB4RkY2QywgMHhGRjZELCAweEZGNkUsIDB4RkY2RiwgMHhGRjcwLCAweEZGNzEsIDB4RkY3MiwgMHhGRjczLAotICAgIDB4RkY3NCwgMHhGRjc1LCAweEZGNzYsIDB4RkY3NywgMHhGRjc4LCAweEZGNzksIDB4RkY3QSwgMHhGRjdCLAotICAgIDB4RkY3QywgMHhGRjdELCAweEZGN0UsIDB4RkY3RiwgMHhGRjgwLCAweEZGODEsIDB4RkY4MiwgMHhGRjgzLAotICAgIDB4RkY4NCwgMHhGRjg1LCAweEZGODYsIDB4RkY4NywgMHhGRjg4LCAweEZGODksIDB4RkY4QSwgMHhGRjhCLAotICAgIDB4RkY4QywgMHhGRjhELCAweEZGOEUsIDB4RkY4RiwgMHhGRjkwLCAweEZGOTEsIDB4RkY5MiwgMHhGRjkzLAotICAgIDB4RkY5NCwgMHhGRjk1LCAweEZGOTYsIDB4RkY5NywgMHhGRjk4LCAweEZGOTksIDB4RkY5QSwgMHhGRjlCLAotICAgIDB4RkY5QywgMHhGRjlELCAweEZGOUUsIDB4RkY5RiwgMHgzMEYwLCAweDMwRjEsIDB4MzBFRSwgMHgzMEFCLAotICAgIDB4MzBCMSwgMHgzMEY0LCAweDMwQUMsIDB4MzBBRSwgMHgzMEIwLCAweDMwQjIsIDB4MzBCNCwgMHgzMEI2LAotICAgIDB4MzBCOCwgMHgzMEJBLCAweDMwQkMsIDB4MzBCRSwgMHgzMEMwLCAweDMwQzIsIDB4MzBDNSwgMHgzMEM3LAotICAgIDB4MzBDOSwgMHgzMEQwLCAweDMwRDEsIDB4MzBEMywgMHgzMEQ0LCAweDMwRDYsIDB4MzBENywgMHgzMEQ5LAotICAgIDB4MzBEQSwgMHgzMERDLCAweDMwREQsIDB4RkY2MCwgMHgzMDkyLCAweDMwNDEsIDB4MzA0MywgMHgzMDQ1LAotICAgIDB4MzA0NywgMHgzMDQ5LCAweDMwODMsIDB4MzA4NSwgMHgzMDg3LCAweDMwNjMsIDB4MzA0MiwgMHgzMDQ0LAotICAgIDB4MzA0NiwgMHgzMDQ4LCAweDMwNEEsIDB4MzA0QiwgMHgzMDRELCAweDMwNEYsIDB4MzA1MSwgMHgzMDUzLAotICAgIDB4MzA1NSwgMHgzMDU3LCAweDMwNTksIDB4MzA1QiwgMHgzMDVELCAweDMwNUYsIDB4MzA2MSwgMHgzMDY0LAotICAgIDB4MzA2NiwgMHgzMDY4LCAweDMwNkEsIDB4MzA2QiwgMHgzMDZDLCAweDMwNkQsIDB4MzA2RSwgMHgzMDZGLAotICAgIDB4MzA3MiwgMHgzMDc1LCAweDMwNzgsIDB4MzA3QiwgMHgzMDdFLCAweDMwN0YsIDB4MzA4MCwgMHgzMDgxLAotICAgIDB4MzA4MiwgMHgzMDg0LCAweDMwODYsIDB4MzA4OCwgMHgzMDg5LCAweDMwOEEsIDB4MzA4QiwgMHgzMDhDLAotICAgIDB4MzA4RCwgMHgzMDhGLCAweDMwOTMsIDB4MzA5MCwgMHgzMDkxLCAweDMwOEUsIDB4MzA0QywgMHgzMDRFLAotICAgIDB4MzA1MCwgMHgzMDUyLCAweDMwNTQsIDB4MzA1NiwgMHgzMDY4LCAweDMwNUEsIDB4MzA1QywgMHgzMDVFLAotICAgIDB4MzA2MCwgMHgzMDYyLCAweDMwNjUsIDB4MzA2NywgMHgzMDY5LCAweDMwNzAsIDB4MzA3MSwgMHgzMDczLAotICAgIDB4MzA3NCwgMHgzMDc2LCAweDMwNzcsIDB4MzA3OSwgMHgzMDdBLCAweDMwN0MsIDB4MzA3RCwgMHgzMDFELAotICAgIDB4MzAxRSwgMHgwMDVCLCAweDAwNUQsIDB4MzAwOCwgMHgzMDA5LCAweDMwMEEsIDB4MzAwQiwgMHgzMDBFLAotICAgIDB4MzAwRiwgMHgzMDEwLCAweDMwMTEsIDB4MjAxMiwgMHhGRjYwLCAweDI1MDAsIDB4MjUwMSwgMHgyNTAyLAotICAgIDB4MjUwMywgMHgyNTA0LCAweDI1MDUsIDB4MjUwNiwgMHgyNTA3LCAweDI1MDgsIDB4MjUwOSwgMHgyNTBBLAotICAgIDB4MjUwQiwgMHgyNTBDLCAweDI1MEQsIDB4MjUwRSwgMHgyNTBGLCAweDI1MTAsIDB4MjUxMSwgMHgyNTEyLAotICAgIDB4MjUxMywgMHgyNTE0LCAweDI1MTUsIDB4MjUxNiwgMHgyNTE3LCAweDI1MTgsIDB4MjUxOSwgMHgyNTFBLAotICAgIDB4MjUxQiwgMHgyNTFDLCAweDI1MUQsIDB4MjUxRSwgMHgyNTFGLCAweDI1MjAsIDB4MjUyMSwgMHgyNTIyLAotICAgIDB4MjUyMywgMHgyNTI0LCAweDI1MjUsIDB4MjUyNiwgMHgyNTI3LCAweDI1MjgsIDB4MjUyOSwgMHgyNTJBLAotICAgIDB4MjUyQiwgMHgyNTJDLCAweDI1MkQsIDB4MjUyRSwgMHgyNTJGLCAweDI1MzAsIDB4MjUzMSwgMHgyNTMyLAotICAgIDB4MjUzMywgMHgyNTM0LCAweDI1MzUsIDB4MjUzNiwgMHgyNTM3LCAweDI1MzgsIDB4MjUzOSwgMHgyNTNBLAotICAgIDB4MjUzQiwgMHgyNTNDLCAweDI1M0QsIDB4MjUzRSwgMHgyNTNGLCAweDI1NDAsIDB4MjU0MSwgMHgyNTQyLAotICAgIDB4MjU0MywgMHgyNTQ0LCAweDI1NDUsIDB4MjU0NiwgMHgyNTQ3LCAweDI1NDgsIDB4MjU0OSwgMHgyNTRBLAotICAgIDB4MjU0QiwgMHgyNUIyLCAweDIwQUMsIDB4MjEyNiwgMHgyMDMyLCAweDIwMzMsIDB4RkIwMCwgMHhGQjAzLAotICAgIDB4RkIwNCwgMHgwMTAxLCAweDAxMkIsIDB4MDE2QiwgMHgwMTEzLCAweDAxNEQsIDB4MDEwMCwgMHgwMTJBLAotICAgIDB4MDE2QSwgMHgwMTEyLCAweDAxNEMsIDB4MjE1QiwgMHgyMTVDLCAweDIxNUQsIDB4MjE1RSwgMHgyMTUzLAotICAgIDB4MjE1NCwgMHgyMDcwLCAweDIwNzQsIDB4MjA3NSwgMHgyMDc2LCAweDIwNzcsIDB4MjA3OCwgMHgyMDc5LAotICAgIDB4MjA4MCwgMHgyMDgxLCAweDIwODIsIDB4MjA4MywgMHgyMDg0LCAweDIwODUsIDB4MjA4NiwgMHgyMDg3LAotICAgIDB4MjA4OCwgMHgyMDg5LCAweDAxQ0QsIDB4MDExQSwgMHgwMDAwLCAweDFFQkMsIDB4MDFDRiwgMHgwMDAwLAotICAgIDB4MDEyOCwgMHgwMUQxLCAweDAwMDAsIDB4MDFEMywgMHgwMTZFLCAweDAxNjgsIDB4MDFDRSwgMHgwMTFCLAotICAgIDB4MDAwMCwgMHgxRUJELCAweDAxRDAsIDB4MDAwMCwgMHgwMTI5LCAweDAxRDIsIDB4MDAwMCwgMHgwMUQ0LAotICAgIDB4MDE2RiwgMHgwMTY5LCAweDAyNTEsIDB4MDI1MSwgMHgwMjUxLCAweDAxRkQsIDB4MDBFNiwgMHgwMjU0LAotICAgIDB4MDI1NCwgMHgwMjU0LCAweDAyNTksIDB4MDI1OSwgMHgwMjU5LCAweDAyNUEsIDB4MDI1QSwgMHgwMjVBLAotICAgIDB4MDI1QiwgMHgwMjVCLCAweDAyNUIsIDB4MDA2QSwgMHgwMTRCLCAweDAyNzUsIDB4MDI4QywgMHgwMjhDLAotICAgIDB4MDI4QywgMHgwMjkyLCAweDAyODMsIDB4MDJEMCwgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAotICAgIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywgMHgwMDI4LCAweDAwMjksIDB4MDAyQSwgMHgwMDJCLAotICAgIDB4MDAyQywgMHgwMDJELCAweDAwMkUsIDB4MDAyRiwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLAotICAgIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgMHgwMDM4LCAweDAwMzksIDB4MDAzQSwgMHgwMDNCLAotICAgIDB4MDAzQywgMHgwMDNELCAweDAwM0UsIDB4MDAzRiwgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAotICAgIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLAotICAgIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAotICAgIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgwMDVCLAotICAgIDB4MDBBNSwgMHgwMDVELCAweDAwNUUsIDB4MDA1RiwgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLAotICAgIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLAotICAgIDB4MDA2QywgMHgwMDZELCAweDAwNkUsIDB4MDA2RiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAotICAgIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDdCLAotICAgIDB4MDBBNiwgMHgwMDdELCAweDAzMDMsIDB4MDJCQywgMHgwMDVDLCAweDAyQkIsIDB4MDA3QywgMHgwMDdFLAotICAgIDB4MDBBMSwgMHgwMEEyLCAweDAwQTMsIDB4MjA0NCwgMHgwMTkyLCAweDAwQTcsIDB4MDBBNCwgMHgyMDFDLAotICAgIDB4MDBBQiwgMHgyMDM5LCAweDIwM0EsIDB4RkIwMSwgMHhGQjAyLCAweDIwMTIsIDB4MjAyMCwgMHgyMDIxLAotICAgIDB4MDBCNywgMHgwMEI2LCAweDIwMjIsIDB4MjAxQSwgMHgyMDFFLCAweDIwMUQsIDB4MDBCQiwgMHgyMDI2LAotICAgIDB4MjAzMCwgMHgwMEJGLCAweDAzMDEsIDB4MDMwMiwgMHgwMEFGLCAweDAzMDYsIDB4MDMwNywgMHgwMzA4LAotICAgIDB4MDMwQSwgMHgwMEI4LCAweDAzMEIsIDB4MDMyOCwgMHgwMzBDLCAweDAzMzYsIDB4MDBDNiwgMHgwMEFBLAotICAgIDB4MDE0MSwgMHgwMEQ4LCAweDAxNTIsIDB4MDBCQSwgMHgwMEU2LCAweDAxMzEsIDB4MDE0MiwgMHgwMEY4LAotICAgIDB4MDE1MywgMHgwMERGLCAweDAwMkQsIDB4MDBBOSwgMHgwMEFDLCAweDAwQUUsIDB4MDBCMCwgMHgwMEIxLAotICAgIDB4MDBCMiwgMHgwMEIzLCAweDAwQjUsIDB4MDBCOSwgMHgwMEJDLCAweDAwQkQsIDB4MDBCRSwgMHgwMEMwLAotICAgIDB4MDBDMSwgMHgwMEMyLCAweDAwQzMsIDB4MDBDNCwgMHgwMEM1LCAweDAwQzcsIDB4MDBDOCwgMHgwMEM5LAotICAgIDB4MDBDQSwgMHgwMENCLCAweDAwQ0MsIDB4MDBDRCwgMHgwMENFLCAweDAwQ0YsIDB4MDBEMCwgMHgwMEQxLAotICAgIDB4MDBEMiwgMHgwMEQzLCAweDAwRDQsIDB4MDBENSwgMHgwMEQ2LCAweDAwRDcsIDB4MDBEOSwgMHgwMERBLAotICAgIDB4MDBEQiwgMHgwMERDLCAweDAwREQsIDB4MDBERSwgMHgwMEUwLCAweDAwRTEsIDB4MDBFMiwgMHgwMEUzLAotICAgIDB4MDBFNCwgMHgwMEU1LCAweDAwRTcsIDB4MDBFOCwgMHgwMEU5LCAweDAwRUEsIDB4MDBFQiwgMHgwMEVDLAotICAgIDB4MDBFRCwgMHgwMEVFLCAweDAwRUYsIDB4MDBGMCwgMHgwMEYxLCAweDAwRjIsIDB4MDBGMywgMHgwMEY0LAotICAgIDB4MDBGNSwgMHgwMEY2LCAweDAwRjcsIDB4MDBGOSwgMHgwMEZBLCAweDAwRkIsIDB4MDBGQywgMHgwMEZELAotICAgIDB4MDBGRSwgMHgwMEZGLCAweDAxNjAsIDB4MDE3OCwgMHgwMTdELCAweDAzMDUsIDB4MDE2MSwgMHgyMTIyLAotICAgIDB4MDE3RSwgMHgwMDMwLCAweDIwQUMsIDB4MjEyNiwgMHgyMDMyLCAweDIwMzMsIDB4RkIwMCwgMHhGQjAzLAotICAgIDB4RkIwNCwgMHgwMTAxLCAweDAxMkIsIDB4MDE2QiwgMHgwMTEzLCAweDAxNEQsIDB4MDEwMCwgMHgwMTJBLAotICAgIDB4MDE2QSwgMHgwMTEyLCAweDAxNEMsIDB4MjE1QiwgMHgyMTVDLCAweDIxNUQsIDB4MjE1RSwgMHgyMTUzLAotICAgIDB4MjE1NCwgMHgyMDcwLCAweDIwNzQsIDB4MjA3NSwgMHgyMDc2LCAweDIwNzcsIDB4MjA3OCwgMHgyMDc5LAotICAgIDB4MjA4MCwgMHgyMDgxLCAweDIwODIsIDB4MjA4MywgMHgyMDg0LCAweDIwODUsIDB4MjA4NiwgMHgyMDg3LAotICAgIDB4MjA4OCwgMHgyMDg5LCAweDAxQ0QsIDB4MDExQSwgMHgwMDAwLCAweDFFQkMsIDB4MDFDRiwgMHgwMDAwLAotICAgIDB4MDEyOCwgMHgwMUQxLCAweDAwMDAsIDB4MDFEMywgMHgwMTZFLCAweDAxNjgsIDB4MDFDRSwgMHgwMTFCLAotICAgIDB4MDAwMCwgMHgxRUJELCAweDAxRDAsIDB4MDAwMCwgMHgwMTI5LCAweDAxRDIsIDB4MDAwMCwgMHgwMUQ0LAotICAgIDB4MDE2RiwgMHgwMTY5LCAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LAotICAgIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgwMzM2LCAweDAwMkQsIDB4MDAzRCwgMHgwMDJDLAotICAgIDB4MDAyOCwgMHgwMDI5LCAweDAwMkUsIDB4MDAyRiwgMHgwMDNBLCAweDAwM0IsIDB4MDAzMCwgMHgwMDMxLAotICAgIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LAotICAgIDB4MDMzNiwgMHgwMDJELCAweDAwM0QsIDB4MDAyQywgMHgwMDI4LCAweDAwMjksIDB4MDAyRSwgMHgwMDJGLAotICAgIDB4MDAzQSwgMHgwMDNCLCAweDAwQjcsIDB4MjBBQywgMHgwMDAwLCAweDIxNTMsIDB4MjE1NCwgMHgwMEJFLAotICAgIDB4MjE1NSwgMHgyMTU2LCAweDIxNTcsIDB4MjE1OCwgMHgyMTU5LCAweDIxNUEsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTVCLCAweDIxNUMsIDB4MjE1RCwgMHgyMTVFLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAotICAgIDB4MDAzOCwgMHgwMDM5LCAweDAwMzAsIDB4MjE2MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjE3MCwgMHgyMTcxLAotICAgIDB4MjE3MiwgMHgyMTczLCAweDIxNzQsIDB4MjE3NSwgMHgyMTc2LCAweDIxNzcsIDB4MjE3OCwgMHgyMTc5LAotICAgIDB4MjE3QSwgMHgyMTdCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIxNjAsIDB4MjE2MSwgMHgyMTYyLAotICAgIDB4MjE2MywgMHgyMTY0LCAweDIxNjUsIDB4MjE2NiwgMHgyMTY3LCAweDIxNjgsIDB4MjE2OSwgMHgyMTZBLAotICAgIDB4MjE2QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LAotICAgIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLAotICAgIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LAotICAgIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MzA0MiwgMHgzMDQ0LAotICAgIDB4MzA0NiwgMHgzMDQ4LCAweDMwNEEsIDB4MzA0QiwgMHgzMDRELCAweDMwNEYsIDB4MzA1MSwgMHgzMDUzLAotICAgIDB4MzA1NSwgMHgzMDU3LCAweDMwNTksIDB4MzA1QiwgMHgzMDVELCAweDMwNUYsIDB4MzA2MSwgMHgzMDY0LAotICAgIDB4MzA2NiwgMHgzMDY4LCAweDMwNkEsIDB4MzA2QiwgMHgzMDZDLCAweDMwNkQsIDB4MzA2RSwgMHgzMDZGLAotICAgIDB4MzA3MiwgMHgzMDc1LCAweDMwNzgsIDB4MzA3QiwgMHgzMDdFLCAweDMwN0YsIDB4MzA4MCwgMHgzMDgxLAotICAgIDB4MzA4MiwgMHgzMDg0LCAweDMwODYsIDB4MzA4OCwgMHgzMDg5LCAweDMwOEEsIDB4MzA4QiwgMHgzMDhDLAotICAgIDB4MzA4RCwgMHgzMDhGLCAweDMwOTAsIDB4MzA5MSwgMHgzMDkyLCAweDMwOTMsIDB4MzBBMiwgMHgzMEE0LAotICAgIDB4MzBBNiwgMHgzMEE4LCAweDMwQUEsIDB4MzBBQiwgMHgzMEFELCAweDMwQUYsIDB4MzBCMSwgMHgzMEIzLAotICAgIDB4MzBCNSwgMHgzMEI3LCAweDMwQjksIDB4MzBCQiwgMHgzMEJELCAweDMwQkYsIDB4MzBDMSwgMHgzMEM0LAotICAgIDB4MzBDNiwgMHgzMEM4LCAweDMwQ0EsIDB4MzBDQiwgMHgzMENDLCAweDMwQ0QsIDB4MzBDRSwgMHgzMENGLAotICAgIDB4MzBEMiwgMHgzMEQ1LCAweDMwRDgsIDB4MzBEQiwgMHgzMERFLCAweDMwREYsIDB4MzBFMCwgMHgzMEUxLAotICAgIDB4MzBFMiwgMHgzMEU0LCAweDMwRTYsIDB4MzBFOCwgMHgzMEU5LCAweDMwRUEsIDB4MzBFQiwgMHgzMEVDLAotICAgIDB4MzBFRCwgMHgzMEVGLCAweDMwRjAsIDB4MzBGMSwgMHgzMEYyLCAweDMwRjMsIDB4MzIyMCwgMHgzMjIxLAotICAgIDB4MzIyMiwgMHgzMjIzLCAweDMyMjQsIDB4MzIyNSwgMHgzMjI2LCAweDMyMjcsIDB4MzIyOCwgMHgzMjI5LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDU1QjYsIDB4NTQwOCwgMHg2Q0VCLCAweDU1NEYsIDB4N0I1NCwgMHg0RjhCLAotICAgIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAotICAgIDB4MDAzOCwgMHgwMDM5LCAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LAotICAgIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgzMDYzLCAweDYyNEQsIDB4MzAwNywgMHg0RTAwLAotICAgIDB4NEU4QywgMHg0RTA5LCAweDU2REIsIDB4NEU5NCwgMHg1MTZELCAweDRFMDMsIDB4NTE2QiwgMHg0RTVELAotICAgIDB4NTM0MSwgMHgzMDA3LCAweDRFMDAsIDB4NEU4QywgMHg0RTA5LCAweDU2REIsIDB4NEU5NCwgMHg1MTZELAotICAgIDB4NEUwMywgMHg1MTZCLCAweDRFNUQsIDB4NTM0MSwgMHgzMDA3LCAweDRFMDAsIDB4NEU4QywgMHg0RTA5LAotICAgIDB4NTZEQiwgMHg0RTk0LCAweDUxNkQsIDB4NEUwMywgMHg1MTZCLCAweDRFNUQsIDB4MzA2NCwgMHg2MjRELAotICAgIDB4NEUwMCwgMHg0RThDLCAweDRFMDksIDB4NTZEQiwgMHg0RTk0LCAweDUxNkQsIDB4NEUwMywgMHg1MTZCLAotICAgIDB4NEU1RCwgMHg1MzQxLCAweDMwMDcsIDB4NEUwMCwgMHg0RThDLCAweDRFMDksIDB4NTZEQiwgMHg0RTk0LAotICAgIDB4NTE2RCwgMHg0RTAzLCAweDUxNkIsIDB4NEU1RCwgMHg1MzQxLCAweDMwQjMsIDB4MzA2MywgMHgzMEMzLAotICAgIDB4MzBBOSwgMHgwMDAwLCAweDAwMDAsIDB4MjQ2MCwgMHgyNDYxLCAweDI0NjIsIDB4MjQ2MywgMHgyNDY0LAotICAgIDB4MjQ2NSwgMHgyNDY2LCAweDI0NjcsIDB4MjQ2OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgyNEQwLCAweDI0RDEsIDB4MjREMiwgMHgyNEQzLCAweDI0RDQsIDB4MjRENSwgMHgyNEQ2LAotICAgIDB4MjRENywgMHgyNEQ4LCAweDI0RDksIDB4MjREQSwgMHgyNERCLCAweDI0REMsIDB4MjRERCwgMHgyNERFLAotICAgIDB4MjRERiwgMHgyNEUwLCAweDI0RTEsIDB4MjRFMiwgMHgyNEUzLCAweDI0RTQsIDB4MjRFNSwgMHgyNEU2LAotICAgIDB4MjRFNywgMHgyNEU4LCAweDI0RTksIDB4MjRCNiwgMHgyNEI3LCAweDI0QjgsIDB4MjRCOSwgMHgyNEJBLAotICAgIDB4MjRCQiwgMHgyNEJDLCAweDI0QkQsIDB4MjRCRSwgMHgyNEJGLCAweDI0QzAsIDB4MjRDMSwgMHgyNEMyLAotICAgIDB4MjRDMywgMHgyNEM0LCAweDI0QzUsIDB4MjRDNiwgMHgyNEM3LCAweDI0QzgsIDB4MjRDOSwgMHgyNENBLAotICAgIDB4MjRDQiwgMHgyNENDLCAweDI0Q0QsIDB4MjRDRSwgMHgyNENGLCAweDMwNDIsIDB4MzA0NCwgMHgzMDQ2LAotICAgIDB4MzA0OCwgMHgzMDRBLCAweDMwNEIsIDB4MzA0RCwgMHgzMDRGLCAweDMwNTEsIDB4MzA1MywgMHgzMDU1LAotICAgIDB4MzA1NywgMHgzMDU5LCAweDMwNUIsIDB4MzA1RCwgMHgzMDVGLCAweDMwNjEsIDB4MzA2NCwgMHgzMDY2LAotICAgIDB4MzA2OCwgMHgzMDZBLCAweDMwNkIsIDB4MzA2QywgMHgzMDZELCAweDMwNkUsIDB4MzA2RiwgMHgzMDcyLAotICAgIDB4MzA3NSwgMHgzMDc4LCAweDMwN0IsIDB4MzA3RSwgMHgzMDdGLCAweDMwODAsIDB4MzA4MSwgMHgzMDgyLAotICAgIDB4MzA4NCwgMHgzMDg2LCAweDMwODgsIDB4MzA4OSwgMHgzMDhBLCAweDMwOEIsIDB4MzA4QywgMHgzMDhELAotICAgIDB4MzA4RiwgMHgzMDkwLCAweDMwOTEsIDB4MzA5MiwgMHgzMDkzLCAweDMyRDAsIDB4MzJEMSwgMHgzMkQyLAotICAgIDB4MzJEMywgMHgzMkQ0LCAweDMyRDUsIDB4MzJENiwgMHgzMkQ3LCAweDMyRDgsIDB4MzJEOSwgMHgzMkRBLAotICAgIDB4MzJEQiwgMHgzMkRDLCAweDMyREQsIDB4MzJERSwgMHgzMkRGLCAweDMyRTAsIDB4MzJFMSwgMHgzMkUyLAotICAgIDB4MzJFMywgMHgzMkU0LCAweDMyRTUsIDB4MzJFNiwgMHgzMkU3LCAweDMyRTgsIDB4MzJFOSwgMHgzMkVBLAotICAgIDB4MzJFQiwgMHgzMkVDLCAweDMyRUQsIDB4MzJFRSwgMHgzMkVGLCAweDMyRjAsIDB4MzJGMSwgMHgzMkYyLAotICAgIDB4MzJGMywgMHgzMkY0LCAweDMyRjUsIDB4MzJGNiwgMHgzMkY3LCAweDMyRjgsIDB4MzJGOSwgMHgzMkZBLAotICAgIDB4MzJGQiwgMHgzMkZDLCAweDMyRkQsIDB4MzJGRSwgMHgzMEYzLCAweDMyODAsIDB4MzI4MSwgMHgzMjgyLAotICAgIDB4MzI4MywgMHgzMjg0LCAweDMyODUsIDB4MzI4NiwgMHgzMjg3LCAweDMyODgsIDB4MzI4OSwgMHgzMjkwLAotICAgIDB4MzI4QSwgMHgzMjhCLCAweDMyOEMsIDB4MzI4RCwgMHgzMjhFLCAweDMyOEYsIDB4OEFCRiwgMHgzMjlGLAotICAgIDB4NTI2RiwgMHg2RTFCLCAweDZBMTksIDB4NkIyMCwgMHg1N0ZBLCAweDc5ODEsIDB4MzJBMCwgMHgzMkExLAotICAgIDB4MzI5QiwgMHgzMjlBLCAweDMyQTMsIDB4MzJBMiwgMHgzMjk3LCAweDUxRkEsIDB4MzI5QywgMHgzMjk1LAotICAgIDB4NkUwOCwgMHg1ODk3LCAweDU1NEYsIDB4N0I1NCwgMHg0RjhCLCAweDk2RkIsIDB4MjVDQywgMHgwMDMwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLAotICAgIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLAotICAgIDB4MDA2QywgMHgwMDZELCAweDAwNkUsIDB4MDA2RiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAotICAgIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDQxLAotICAgIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LAotICAgIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLAotICAgIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LAotICAgIDB4MDA1QSwgMHgzMDQyLCAweDMwNDQsIDB4MzA0NiwgMHgzMDQ4LCAweDMwNEEsIDB4MzA0QiwgMHgzMDRELAotICAgIDB4MzA0RiwgMHgzMDUxLCAweDMwNTMsIDB4MzA1NSwgMHgzMDU3LCAweDMwNTksIDB4MzA1QiwgMHgzMDVELAotICAgIDB4MzA1RiwgMHgzMDYxLCAweDMwNjQsIDB4MzA2NiwgMHgzMDY4LCAweDMwNkEsIDB4MzA2QiwgMHgzMDZDLAotICAgIDB4MzA2RCwgMHgzMDZFLCAweDMwNkYsIDB4MzA3MiwgMHgzMDc1LCAweDMwNzgsIDB4MzA3QiwgMHgzMDdFLAotICAgIDB4MzA3RiwgMHgzMDgwLCAweDMwODEsIDB4MzA4MiwgMHgzMDg0LCAweDMwODYsIDB4MzA4OCwgMHgzMDg5LAotICAgIDB4MzA4QSwgMHgzMDhCLCAweDMwOEMsIDB4MzA4RCwgMHgzMDhGLCAweDMwOTAsIDB4MzA5MSwgMHgzMDkyLAotICAgIDB4MzA5MywgMHgzMEEyLCAweDMwQTQsIDB4MzBBNiwgMHgzMEE4LCAweDMwQUEsIDB4MzBBQiwgMHgzMEFELAotICAgIDB4MzBBRiwgMHgzMEIxLCAweDMwQjMsIDB4MzBCNSwgMHgzMEI3LCAweDMwQjksIDB4MzBCQiwgMHgzMEJELAotICAgIDB4MzBCRiwgMHgzMEMxLCAweDMwQzQsIDB4MzBDNiwgMHgzMEM4LCAweDMwQ0EsIDB4MzBDQiwgMHgzMENDLAotICAgIDB4MzBDRCwgMHgzMENFLCAweDMwQ0YsIDB4MzBEMiwgMHgzMEQ1LCAweDMwRDgsIDB4MzBEQiwgMHgzMERFLAotICAgIDB4MzBERiwgMHgzMEUwLCAweDMwRTEsIDB4MzBFMiwgMHgzMEU0LCAweDMwRTYsIDB4MzBFOCwgMHgzMEU5LAotICAgIDB4MzBFQSwgMHgzMEVCLCAweDMwRUMsIDB4MzBFRCwgMHgzMEVGLCAweDMwRjAsIDB4MzBGMSwgMHgzMEYyLAotICAgIDB4MzBGMywgMHg2NUU1LCAweDY3MDgsIDB4NzA2QiwgMHg2QzM0LCAweDY3MjgsIDB4OTFEMSwgMHg1NzFGLAotICAgIDB4NTU0RiwgMHg3QjU0LCAweDRGOEIsIDB4MjVDRiwgMHgwMDMwLCAweDAwMDAsIDB4MDAzMSwgMHgwMDAwLAotICAgIDB4MDAzMiwgMHgwMDAwLCAweDAwMzMsIDB4MDAwMCwgMHgwMDM0LCAweDAwMDAsIDB4MDAzNSwgMHgwMDAwLAotICAgIDB4MDAzNiwgMHgwMDAwLCAweDAwMzcsIDB4MDAwMCwgMHgwMDM4LCAweDAwMDAsIDB4MDAzOSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LAotICAgIDB4MDA2NiwgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywgMHgwMDZELAotICAgIDB4MDA2RSwgMHgwMDZGLCAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LAotICAgIDB4MDA3NiwgMHgwMDc3LCAweDAwNzgsIDB4MDA3OSwgMHgwMDdBLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAotICAgIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLAotICAgIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAotICAgIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgzMDQyLAotICAgIDB4MzA0NCwgMHgzMDQ2LCAweDMwNDgsIDB4MzA0QSwgMHgzMDRCLCAweDMwNEQsIDB4MzA0RiwgMHgzMDUxLAotICAgIDB4MzA1MywgMHgzMDU1LCAweDMwNTcsIDB4MzA1OSwgMHgzMDVCLCAweDMwNUQsIDB4MzA1RiwgMHgzMDYxLAotICAgIDB4MzA2NCwgMHgzMDY2LCAweDMwNjgsIDB4MzA2QSwgMHgzMDZCLCAweDMwNkMsIDB4MzA2RCwgMHgzMDZFLAotICAgIDB4MzA2RiwgMHgzMDcyLCAweDMwNzUsIDB4MzA3OCwgMHgzMDdCLCAweDMwN0UsIDB4MzA3RiwgMHgzMDgwLAotICAgIDB4MzA4MSwgMHgzMDgyLCAweDMwODQsIDB4MzA4NiwgMHgzMDg4LCAweDMwODksIDB4MzA4QSwgMHgzMDhCLAotICAgIDB4MzA4QywgMHgzMDhELCAweDMwOEYsIDB4MzA5MCwgMHgzMDkxLCAweDMwOTIsIDB4MzA5MywgMHgzMEEyLAotICAgIDB4MzBBNCwgMHgzMEE2LCAweDMwQTgsIDB4MzBBQSwgMHgzMEFCLCAweDMwQUQsIDB4MzBBRiwgMHgzMEIxLAotICAgIDB4MzBCMywgMHgzMEI1LCAweDMwQjcsIDB4MzBCOSwgMHgzMEJCLCAweDMwQkQsIDB4MzBCRiwgMHgzMEMxLAotICAgIDB4MzBDNCwgMHgzMEM2LCAweDMwQzgsIDB4MzBDQSwgMHgzMENCLCAweDMwQ0MsIDB4MzBDRCwgMHgzMENFLAotICAgIDB4MzBDRiwgMHgzMEQyLCAweDMwRDUsIDB4MzBEOCwgMHgzMERCLCAweDMwREUsIDB4MzBERiwgMHgzMEUwLAotICAgIDB4MzBFMSwgMHgzMEUyLCAweDMwRTQsIDB4MzBFNiwgMHgzMEU4LCAweDMwRTksIDB4MzBFQSwgMHgzMEVCLAotICAgIDB4MzBFQywgMHgzMEVELCAweDMwRUYsIDB4MzBGMCwgMHgzMEYxLCAweDMwRjIsIDB4MzBGMywgMHg2NUU1LAotICAgIDB4NjcwOCwgMHg3MDZCLCAweDZDMzQsIDB4NjcyOCwgMHg5MUQxLCAweDU3MUYsIDB4OENBMCwgMHg1MkRELAotICAgIDB4NTU0RiwgMHg3QjU0LCAweDRGOEIsIDB4MjVBMSwgMHgyNUExLCAweDAwMzAsIDB4MDAwMCwgMHgwMDMxLAotICAgIDB4MDAwMCwgMHgwMDMyLCAweDAwMDAsIDB4MDAzMywgMHgwMDAwLCAweDAwMzQsIDB4MDAwMCwgMHgwMDM1LAotICAgIDB4MDAwMCwgMHgwMDM2LCAweDAwMDAsIDB4MDAzNywgMHgwMDAwLCAweDAwMzgsIDB4MDAwMCwgMHgwMDM5LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LAotICAgIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLAotICAgIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LAotICAgIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDA0MSwgMHgwMDQyLAotICAgIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LCAweDAwNDgsIDB4MDA0OSwgMHgwMDRBLAotICAgIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLCAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLAotICAgIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwgMHgwMDVBLAotICAgIDB4MzA0MiwgMHgzMDQ0LCAweDMwNDYsIDB4MzA0OCwgMHgzMDRBLCAweDMwNEIsIDB4MzA0RCwgMHgzMDRGLAotICAgIDB4MzA1MSwgMHgzMDUzLCAweDMwNTUsIDB4MzA1NywgMHgzMDU5LCAweDMwNUIsIDB4MzA1RCwgMHgzMDVGLAotICAgIDB4MzA2MSwgMHgzMDY0LCAweDMwNjYsIDB4MzA2OCwgMHgzMDZBLCAweDMwNkIsIDB4MzA2QywgMHgzMDZELAotICAgIDB4MzA2RSwgMHgzMDZGLCAweDMwNzIsIDB4MzA3NSwgMHgzMDc4LCAweDMwN0IsIDB4MzA3RSwgMHgzMDdGLAotICAgIDB4MzA4MCwgMHgzMDgxLCAweDMwODIsIDB4MzA4NCwgMHgzMDg2LCAweDMwODgsIDB4MzA4OSwgMHgzMDhBLAotICAgIDB4MzA4QiwgMHgzMDhDLCAweDMwOEQsIDB4MzA4RiwgMHgzMDkwLCAweDMwOTEsIDB4MzA5MiwgMHgzMDkzLAotICAgIDB4MzBBMiwgMHgzMEE0LCAweDMwQTYsIDB4MzBBOCwgMHgzMEFBLCAweDMwQUIsIDB4MzBBRCwgMHgzMEFGLAotICAgIDB4MzBCMSwgMHgzMEIzLCAweDMwQjUsIDB4MzBCNywgMHgzMEI5LCAweDMwQkIsIDB4MzBCRCwgMHgzMEJGLAotICAgIDB4MzBDMSwgMHgzMEM0LCAweDMwQzYsIDB4MzBDOCwgMHgzMENBLCAweDMwQ0IsIDB4MzBDQywgMHgzMENELAotICAgIDB4MzBDRSwgMHgzMENGLCAweDMwRDIsIDB4MzBENSwgMHgzMEQ4LCAweDMwREIsIDB4MzBERSwgMHgzMERGLAotICAgIDB4MzBFMCwgMHgzMEUxLCAweDMwRTIsIDB4MzBFNCwgMHgzMEU2LCAweDMwRTgsIDB4MzBFOSwgMHgzMEVBLAotICAgIDB4MzBFQiwgMHgzMEVDLCAweDMwRUQsIDB4MzBFRiwgMHgzMEYwLCAweDMwRjEsIDB4MzBGMiwgMHgzMEYzLAotICAgIDB4NjVFNSwgMHg2NzA4LCAweDcwNkIsIDB4NkMzNCwgMHg2NzI4LCAweDkxRDEsIDB4NTcxRiwgMHg1NTRGLAotICAgIDB4N0I1NCwgMHg0RjhCLCAweDI1QTAsIDB4MDAzMCwgMHgwMDAwLCAweDAwMzEsIDB4MDAwMCwgMHgwMDMyLAotICAgIDB4MDAwMCwgMHgwMDMzLCAweDAwMDAsIDB4MDAzNCwgMHgwMDAwLCAweDAwMzUsIDB4MDAwMCwgMHgwMDM2LAotICAgIDB4MDAwMCwgMHgwMDM3LCAweDAwMDAsIDB4MDAzOCwgMHgwMDAwLCAweDAwMzksIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LAotICAgIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLAotICAgIDB4MDA2RiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LAotICAgIDB4MDA3NywgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LAotICAgIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLAotICAgIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LAotICAgIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MzA0MiwgMHgzMDQ0LAotICAgIDB4MzA0NiwgMHgzMDQ4LCAweDMwNEEsIDB4MzA0QiwgMHgzMDRELCAweDMwNEYsIDB4MzA1MSwgMHgzMDUzLAotICAgIDB4MzA1NSwgMHgzMDU3LCAweDMwNTksIDB4MzA1QiwgMHgzMDVELCAweDMwNUYsIDB4MzA2MSwgMHgzMDY0LAotICAgIDB4MzA2NiwgMHgzMDY4LCAweDMwNkEsIDB4MzA2QiwgMHgzMDZDLCAweDMwNkQsIDB4MzA2RSwgMHgzMDZGLAotICAgIDB4MzA3MiwgMHgzMDc1LCAweDMwNzgsIDB4MzA3QiwgMHgzMDdFLCAweDMwN0YsIDB4MzA4MCwgMHgzMDgxLAotICAgIDB4MzA4MiwgMHgzMDg0LCAweDMwODYsIDB4MzA4OCwgMHgzMDg5LCAweDMwOEEsIDB4MzA4QiwgMHgzMDhDLAotICAgIDB4MzA4RCwgMHgzMDhGLCAweDMwOTAsIDB4MzA5MSwgMHgzMDkyLCAweDMwOTMsIDB4MzBBMiwgMHgzMEE0LAotICAgIDB4MzBBNiwgMHgzMEE4LCAweDMwQUEsIDB4MzBBQiwgMHgzMEFELCAweDMwQUYsIDB4MzBCMSwgMHgzMEIzLAotICAgIDB4MzBCNSwgMHgzMEI3LCAweDMwQjksIDB4MzBCQiwgMHgzMEJELCAweDMwQkYsIDB4MzBDMSwgMHgzMEM0LAotICAgIDB4MzBDNiwgMHgzMEM4LCAweDMwQ0EsIDB4MzBDQiwgMHgzMENDLCAweDMwQ0QsIDB4MzBDRSwgMHgzMENGLAotICAgIDB4MzBEMiwgMHgzMEQ1LCAweDMwRDgsIDB4MzBEQiwgMHgzMERFLCAweDMwREYsIDB4MzBFMCwgMHgzMEUxLAotICAgIDB4MzBFMiwgMHgzMEU0LCAweDMwRTYsIDB4MzBFOCwgMHgzMEU5LCAweDMwRUEsIDB4MzBFQiwgMHgzMEVDLAotICAgIDB4MzBFRCwgMHgzMEVGLCAweDMwRjAsIDB4MzBGMSwgMHgzMEYyLCAweDMwRjMsIDB4NjVFNSwgMHg2NzA4LAotICAgIDB4NzA2QiwgMHg2QzM0LCAweDY3MjgsIDB4OTFEMSwgMHg1NzFGLCAweDU1NEYsIDB4N0I1NCwgMHg0RjhCLAotICAgIDB4MDAzMCwgMHgwMDAwLCAweDAwMzEsIDB4MDAwMCwgMHgwMDMyLCAweDAwMDAsIDB4MDAzMywgMHgwMDAwLAotICAgIDB4MDAzNCwgMHgwMDAwLCAweDAwMzUsIDB4MDAwMCwgMHgwMDM2LCAweDAwMDAsIDB4MDAzNywgMHgwMDAwLAotICAgIDB4MDAzOCwgMHgwMDAwLCAweDAwMzksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDYxLAotICAgIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LAotICAgIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLAotICAgIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LAotICAgIDB4MDA3QSwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAotICAgIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLAotICAgIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAotICAgIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MzA0MiwgMHgzMDQ0LCAweDMwNDYsIDB4MzA0OCwgMHgzMDRBLAotICAgIDB4MzA0QiwgMHgzMDRELCAweDMwNEYsIDB4MzA1MSwgMHgzMDUzLCAweDMwNTUsIDB4MzA1NywgMHgzMDU5LAotICAgIDB4MzA1QiwgMHgzMDVELCAweDMwNUYsIDB4MzA2MSwgMHgzMDY0LCAweDMwNjYsIDB4MzA2OCwgMHgzMDZBLAotICAgIDB4MzA2QiwgMHgzMDZDLCAweDMwNkQsIDB4MzA2RSwgMHgzMDZGLCAweDMwNzIsIDB4MzA3NSwgMHgzMDc4LAotICAgIDB4MzA3QiwgMHgzMDdFLCAweDMwN0YsIDB4MzA4MCwgMHgzMDgxLCAweDMwODIsIDB4MzA4NCwgMHgzMDg2LAotICAgIDB4MzA4OCwgMHgzMDg5LCAweDMwOEEsIDB4MzA4QiwgMHgzMDhDLCAweDMwOEQsIDB4MzA4RiwgMHgzMDkwLAotICAgIDB4MzA5MSwgMHgzMDkyLCAweDMwOTMsIDB4MzBBMiwgMHgzMEE0LCAweDMwQTYsIDB4MzBBOCwgMHgzMEFBLAotICAgIDB4MzBBQiwgMHgzMEFELCAweDMwQUYsIDB4MzBCMSwgMHgzMEIzLCAweDMwQjUsIDB4MzBCNywgMHgzMEI5LAotICAgIDB4MzBCQiwgMHgzMEJELCAweDMwQkYsIDB4MzBDMSwgMHgzMEM0LCAweDMwQzYsIDB4MzBDOCwgMHgzMENBLAotICAgIDB4MzBDQiwgMHgzMENDLCAweDMwQ0QsIDB4MzBDRSwgMHgzMENGLCAweDMwRDIsIDB4MzBENSwgMHgzMEQ4LAotICAgIDB4MzBEQiwgMHgzMERFLCAweDMwREYsIDB4MzBFMCwgMHgzMEUxLCAweDMwRTIsIDB4MzBFNCwgMHgzMEU2LAotICAgIDB4MzBFOCwgMHgzMEU5LCAweDMwRUEsIDB4MzBFQiwgMHgzMEVDLCAweDMwRUQsIDB4MzBFRiwgMHgzMEYwLAotICAgIDB4MzBGMSwgMHgzMEYyLCAweDMwRjMsIDB4NjVFNSwgMHg2NzA4LCAweDcwNkIsIDB4NkMzNCwgMHg2NzI4LAotICAgIDB4OTFEMSwgMHg1NzFGLCAweDU1NEYsIDB4N0I1NCwgMHg0RjhCLCAweDI1QTAsIDB4MzNDMiwgMHgzM0NELAotICAgIDB4MjExNiwgMHgwMDAwLCAweDMzRDgsIDB4MzNEQSwgMHgyMTIxLCAweDIxMjIsIDB4MDAwMCwgMHgyMTAwLAotICAgIDB4MzNDMiwgMHgwMDAwLCAweDMzQzQsIDB4MjEwNSwgMHgzMzk3LCAweDMzNzEsIDB4MzM5OCwgMHgyMTEzLAotICAgIDB4MzM4RCwgMHgzMzlCLCAweDMzOTYsIDB4MDAwMCwgMHgwMDAwLCAweDMzRDcsIDB4MzNEOCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDMzMDEsIDB4MzMwMiwgMHgzMzA0LCAweDMzMDYsIDB4MDAwMCwgMHgzMzA4LAotICAgIDB4MDAwMCwgMHgzMzA3LCAweDMzMEEsIDB4MDAwMCwgMHgzMzA5LCAweDAwMDAsIDB4MzMwQiwgMHgwMDAwLAotICAgIDB4MzMwQywgMHgzMzBFLCAweDMzMEYsIDB4MzMxMCwgMHgzMzExLCAweDMzMTIsIDB4MzMxMywgMHgwMDAwLAotICAgIDB4MzMxNywgMHgwMDAwLCAweDMzMTksIDB4MDAwMCwgMHgzMzFBLCAweDMzMUIsIDB4MzMxQywgMHgzMzFELAotICAgIDB4MzMxRiwgMHgzMzIwLCAweDMzMjEsIDB4MzMyNCwgMHgwMDAwLCAweDMzMjUsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MzMyOCwgMHgzMzI5LCAweDAwMDAsIDB4MzMyRCwgMHgwMDAwLCAweDAwMDAsIDB4MzMyRSwgMHgzMzJGLAotICAgIDB4MzMzMCwgMHgzMzMyLCAweDAwMDAsIDB4MDAwMCwgMHgzMzM0LCAweDMzMzUsIDB4MzMzQywgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDMzMzcsIDB4MDAwMCwgMHgzMzM4LCAweDMzM0EsIDB4MzMzRCwgMHgzMzQxLAotICAgIDB4MzMzRSwgMHgzMzNGLCAweDMzNDAsIDB4MzM0MywgMHgzMzQ0LCAweDMzNDUsIDB4MzM0NiwgMHgzMzQ4LAotICAgIDB4MzM0QiwgMHgzMzRDLCAweDMzNEYsIDB4MzM1MCwgMHgwMDAwLCAweDAwMDAsIDB4MzM1MiwgMHgzMzU0LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDMzNTMsIDB4MzM1NSwgMHgzMzU2LCAweDAwMDAsIDB4MzMwMSwgMHgzMzAyLAotICAgIDB4MzMwNCwgMHgzMzA2LCAweDAwMDAsIDB4MzMwOCwgMHgwMDAwLCAweDMzMDcsIDB4MzMwQSwgMHgwMDAwLAotICAgIDB4MzMwOSwgMHgwMDAwLCAweDMzMEIsIDB4MDAwMCwgMHgzMzBDLCAweDMzMEUsIDB4MzMwRiwgMHgzMzEwLAotICAgIDB4MzMxMSwgMHgzMzEyLCAweDMzMTMsIDB4MDAwMCwgMHgzMzE3LCAweDAwMDAsIDB4MzMxOSwgMHgwMDAwLAotICAgIDB4MzMxQSwgMHgzMzFCLCAweDMzMUMsIDB4MzMxRCwgMHgzMzFGLCAweDMzMjAsIDB4MzMyMSwgMHgzMzI0LAotICAgIDB4MDAwMCwgMHgzMzI1LCAweDAwMDAsIDB4MDAwMCwgMHgzMzI4LCAweDMzMjksIDB4MDAwMCwgMHgzMzJELAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDMzMkUsIDB4MzMyRiwgMHgzMzMwLCAweDMzMzIsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MzMzNCwgMHgzMzM1LCAweDMzM0MsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MzMzNywgMHgwMDAwLAotICAgIDB4MzMzOCwgMHgzMzNBLCAweDMzM0QsIDB4MzM0MSwgMHgzMzNFLCAweDMzM0YsIDB4MzM0MCwgMHgzMzQzLAotICAgIDB4MzM0NCwgMHgzMzQ1LCAweDMzNDYsIDB4MzM0OCwgMHgzMzRCLCAweDMzNEMsIDB4MzM0RiwgMHgzMzUwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDMzNTIsIDB4MzM1NCwgMHgwMDAwLCAweDAwMDAsIDB4MzM1MywgMHgzMzU1LAotICAgIDB4MzM1NiwgMHgzMzdFLCAweDMzN0QsIDB4MzM3QywgMHgzMzdCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDJELAotICAgIDB4MDAzRCwgMHgyMTAzLCAweDI2NDAsIDB4MjY0MiwgMHgzMDEzLCAweDMwMTIsIDB4MzAwQywgMHgzMDBELAotICAgIDB4MzAwRSwgMHgzMDBGLCAweDMwMUEsIDB4MzAxQiwgMHgzMDE4LCAweDMwMTksIDB4RkYwOCwgMHhGRjA5LAotICAgIDB4MzAxRCwgMHgzMDFFLCAweDIwMTgsIDB4MjAxOSwgMHgyMDFDLCAweDIwMUQsIDB4MDAyNywgMHgwMDIyLAotICAgIDB4MDAwMCwgMHgyMTM1LCAweDAzRDAsIDB4MjIwQSwgMHgyMTBGLCAweDAwQjUsIDB4MDNDNiwgMHgwM0RCLAotICAgIDB4MDNEMSwgMHhGRkZELCAweDI2NjgsIDB4MjY2OSwgMHgyNjZDLCAweEZGMUEsIDB4MDBBOSwgMHgwMEE5LAotICAgIDB4MDBBRSwgMHgwMEFFLCAweDMwM0IsIDB4MzAzQiwgMHgzMDMzLCAweDMwMzQsIDB4MzAzNSwgMHgyMDNDLAotICAgIDB4MjA0OSwgMHgwMDIxLCAweDIwM0MsIDB4MjA0OSwgMHgyNDRBLCAweDAwMDAsIDB4MjIxMywgMHgyMjYwLAotICAgIDB4MjI0MywgMHgyMjcyLCAweDIyNzMsIDB4MzAwQywgMHgzMDBELCAweDMwMEUsIDB4MzAwRiwgMHgzMDFBLAotICAgIDB4MzAxQiwgMHgzMDE4LCAweDMwMTksIDB4RkY1RiwgMHhGRjYwLCAweDMwMEMsIDB4MzAwRCwgMHgzMDBFLAotICAgIDB4MzAwRiwgMHgzMDFBLCAweDMwMUIsIDB4MzAxOCwgMHgzMDE5LCAweEZGNUYsIDB4RkY2MCwgMHgyMzlCLAotICAgIDB4MjM5RCwgMHgyMzlFLCAweDIzQTAsIDB4MjM5RCwgMHgyMzlCLCAweDIzQTAsIDB4MjM5RSwgMHgyM0ExLAotICAgIDB4MjNBMywgMHgyM0E0LCAweDIzQTYsIDB4MjNBMywgMHgyM0ExLCAweDIzQTYsIDB4MjNBNCwgMHgyM0ExLAotICAgIDB4MjNBMywgMHgyM0E0LCAweDIzQTYsIDB4MjNBMywgMHgyM0ExLCAweDIzQTYsIDB4MjNBNCwgMHhGRjVDLAotICAgIDB4MjAxNSwgMHgzMDFELCAweDMwMUUsIDB4MjAxOCwgMHgyMDE5LCAweDIwMTgsIDB4MjAxOSwgMHgyNzAyLAotICAgIDB4MjcwMiwgMHgyNzAyLCAweDI3MDIsIDB4MzAzRCwgMHgzMDEyLCAweDMwOUYsIDB4NTM0RCwgMHgyMjA3LAotICAgIDB4MjIwNSwgMHgyMkEwLCAweDIyOTYsIDB4MjI5OCwgMHgyMjk1LCAweDIyOTcsIDB4MjI5RSwgMHgyMjk1LAotICAgIDB4MDAyMSwgMHgyNUIzLCAweDI1QzAsIDB4MjVCNiwgMHgyMUU2LCAweDIxRTgsIDB4MjFFNywgMHgyMUU5LAotICAgIDB4MjFEMCwgMHgyMTk0LCAweDIxOTgsIDB4MjE5OSwgMHgyMTk2LCAweDIxOTcsIDB4MjFDQywgMHgyMUM2LAotICAgIDB4MjFDNCwgMHgyMUM1LCAweDIxOTAsIDB4MjE5MiwgMHgyMTkxLCAweDIxOTMsIDB4MjE5NCwgMHgyMTk1LAotICAgIDB4MjUwNCwgMHgyNTA2LCAweDMwMzAsIDB4MjMwNywgMHgzMDMwLCAweDIzMDcsIDB4MzAzMCwgMHgyMzA3LAotICAgIDB4MzAzMCwgMHgyMzA3LCAweDMwMzAsIDB4MjMwNywgMHgyNzQwLCAweDI3M0YsIDB4MjVBMSwgMHgyNUEwLAotICAgIDB4MjVBMSwgMHgyNUExLCAweDI1QTEsIDB4MjVBMSwgMHgyNUExLCAweDI1QUIsIDB4MjVBMCwgMHgyNUFBLAotICAgIDB4MjcxQSwgMHgyNzFBLCAweDI1QzcsIDB4MjVDNiwgMHgyNUM3LCAweDI1QzcsIDB4MjVDNywgMHgyNUM3LAotICAgIDB4MjVDNywgMHgyNUM2LCAweDI1QzYsIDB4MjVDRSwgMHgyNUM5LCAweDI1Q0IsIDB4MjVFNiwgMHgyNUNGLAotICAgIDB4MjAyMiwgMHgyNzU2LCAweDI3NTYsIDB4Mjc1NiwgMHgyNzU2LCAweDMwMDgsIDB4MzAwOSwgMHgzMDA4LAotICAgIDB4MzAwOSwgMHgzMDBBLCAweDMwMEIsIDB4MzAwQSwgMHgzMDBCLCAweDMwNTMsIDB4MzA1MywgMHgzMEIzLAotICAgIDB4MzBCMywgMHgzMDlELCAweDMwOUUsIDB4MzA0MSwgMHgzMDQyLCAweDMwNDMsIDB4MzA0NCwgMHgzMDQ1LAotICAgIDB4MzA0NiwgMHgzMDQ3LCAweDMwNDgsIDB4MzA0OSwgMHgzMDRBLCAweDMwNEIsIDB4MzA0QiwgMHgzMDRDLAotICAgIDB4MzA0RCwgMHgzMDRFLCAweDMwNEYsIDB4MzA1MCwgMHgzMDUxLCAweDMwNTEsIDB4MzA1MiwgMHgzMDUzLAotICAgIDB4MzA1MywgMHgzMDU0LCAweDMwNTUsIDB4MzA1NiwgMHgzMDU3LCAweDMwNTgsIDB4MzA1OSwgMHgzMDVBLAotICAgIDB4MzA1QiwgMHgzMDVDLCAweDMwNUQsIDB4MzA1RSwgMHgzMDVGLCAweDMwNjAsIDB4MzA2MSwgMHgzMDYyLAotICAgIDB4MzA2MywgMHgzMDY0LCAweDMwNjUsIDB4MzA2NiwgMHgzMDY3LCAweDMwNjgsIDB4MzA2OSwgMHgzMDZBLAotICAgIDB4MzA2QiwgMHgzMDZDLCAweDMwNkQsIDB4MzA2RSwgMHgzMDZGLCAweDMwNzAsIDB4MzA3MSwgMHgzMDcyLAotICAgIDB4MzA3MywgMHgzMDc0LCAweDMwNzUsIDB4MzA3NiwgMHgzMDc3LCAweDMwNzgsIDB4MzA3OSwgMHgzMDdBLAotICAgIDB4MzA3QiwgMHgzMDdDLCAweDMwN0QsIDB4MzA3RSwgMHgzMDdGLCAweDMwODAsIDB4MzA4MSwgMHgzMDgyLAotICAgIDB4MzA4MywgMHgzMDg0LCAweDMwODUsIDB4MzA4NiwgMHgzMDg3LCAweDMwODgsIDB4MzA4OSwgMHgzMDhBLAotICAgIDB4MzA4QiwgMHgzMDhDLCAweDMwOEQsIDB4MzA4RSwgMHgzMDhGLCAweDMwOTAsIDB4MzA5MSwgMHgzMDkyLAotICAgIDB4MzA5MywgMHgzMDk0LCAweDMwRkQsIDB4MzBGRSwgMHgzMEZDLCAweDMwQTEsIDB4MzBBMiwgMHgzMEEzLAotICAgIDB4MzBBNCwgMHgzMEE1LCAweDMwQTYsIDB4MzBBNywgMHgzMEE4LCAweDMwQTksIDB4MzBBQSwgMHgzMEY1LAotICAgIDB4MzBBQiwgMHgzMEFDLCAweDMwQUQsIDB4MzBBRSwgMHgzMEFGLCAweDMwQjAsIDB4MzBGNiwgMHgzMEIxLAotICAgIDB4MzBCMiwgMHgzMEIzLCAweDMwQjMsIDB4MzBCNCwgMHgzMEI1LCAweDMwQjYsIDB4MzBCNywgMHgzMEI4LAotICAgIDB4MzBCOSwgMHgzMEJBLCAweDMwQkIsIDB4MzBCQywgMHgzMEJELCAweDMwQkUsIDB4MzBCRiwgMHgzMEMwLAotICAgIDB4MzBDMSwgMHgzMEMyLCAweDMwQzMsIDB4MzBDNCwgMHgzMEM1LCAweDMwQzYsIDB4MzBDNywgMHgzMEM4LAotICAgIDB4MzBDOSwgMHgzMENBLCAweDMwQ0IsIDB4MzBDQywgMHgzMENELCAweDMwQ0UsIDB4MzBDRiwgMHgzMEQwLAotICAgIDB4MzBEMSwgMHgzMEQyLCAweDMwRDMsIDB4MzBENCwgMHgzMEQ1LCAweDMwRDYsIDB4MzBENywgMHgzMEQ4LAotICAgIDB4MzBEOSwgMHgzMERBLCAweDMwREIsIDB4MzBEQywgMHgzMERELCAweDMwREUsIDB4MzBERiwgMHgzMEUwLAotICAgIDB4MzBFMSwgMHgzMEUyLCAweDMwRTMsIDB4MzBFNCwgMHgzMEU1LCAweDMwRTYsIDB4MzBFNywgMHgzMEU4LAotICAgIDB4MzBFOSwgMHgzMEVBLCAweDMwRUIsIDB4MzBFQywgMHgzMEVELCAweDMwRUUsIDB4MzBFRiwgMHgzMEYwLAotICAgIDB4MzBGMSwgMHgzMEYyLCAweDMwRjMsIDB4MzBGNCwgMHgzMEY3LCAweDMwRjgsIDB4MzBGOSwgMHgzMEZBLAotICAgIDB4MzA5RCwgMHgzMDlFLCAweDMwNDEsIDB4MzA0MiwgMHgzMDQzLCAweDMwNDQsIDB4MzA0NSwgMHgzMDQ2LAotICAgIDB4MzA0NywgMHgzMDQ4LCAweDMwNDksIDB4MzA0QSwgMHgzMDRCLCAweDMwNEIsIDB4MzA0QywgMHgzMDRELAotICAgIDB4MzA0RSwgMHgzMDRGLCAweDMwNTAsIDB4MzA1MSwgMHgzMDUxLCAweDMwNTIsIDB4MzA1MywgMHgzMDUzLAotICAgIDB4MzA1NCwgMHgzMDU1LCAweDMwNTYsIDB4MzA1NywgMHgzMDU4LCAweDMwNTksIDB4MzA1QSwgMHgzMDVCLAotICAgIDB4MzA1QywgMHgzMDVELCAweDMwNUUsIDB4MzA1RiwgMHgzMDYwLCAweDMwNjEsIDB4MzA2MiwgMHgzMDYzLAotICAgIDB4MzA2NCwgMHgzMDY1LCAweDMwNjYsIDB4MzA2NywgMHgzMDY4LCAweDMwNjksIDB4MzA2QSwgMHgzMDZCLAotICAgIDB4MzA2QywgMHgzMDZELCAweDMwNkUsIDB4MzA2RiwgMHgzMDcwLCAweDMwNzEsIDB4MzA3MiwgMHgzMDczLAotICAgIDB4MzA3NCwgMHgzMDc1LCAweDMwNzYsIDB4MzA3NywgMHgzMDc4LCAweDMwNzksIDB4MzA3QSwgMHgzMDdCLAotICAgIDB4MzA3QywgMHgzMDdELCAweDMwN0UsIDB4MzA3RiwgMHgzMDgwLCAweDMwODEsIDB4MzA4MiwgMHgzMDgzLAotICAgIDB4MzA4NCwgMHgzMDg1LCAweDMwODYsIDB4MzA4NywgMHgzMDg4LCAweDMwODksIDB4MzA4QSwgMHgzMDhCLAotICAgIDB4MzA4QywgMHgzMDhELCAweDMwOEUsIDB4MzA4RiwgMHgzMDkwLCAweDMwOTEsIDB4MzA5MiwgMHgzMDkzLAotICAgIDB4MzA5NCwgMHgzMEZELCAweDMwRkUsIDB4MzBGQywgMHgzMEExLCAweDMwQTIsIDB4MzBBMywgMHgzMEE0LAotICAgIDB4MzBBNSwgMHgzMEE2LCAweDMwQTcsIDB4MzBBOCwgMHgzMEE5LCAweDMwQUEsIDB4MzBGNSwgMHgzMEFCLAotICAgIDB4MzBBQywgMHgzMEFELCAweDMwQUUsIDB4MzBBRiwgMHgzMEIwLCAweDMwRjYsIDB4MzBCMSwgMHgzMEIyLAotICAgIDB4MzBCMywgMHgzMEIzLCAweDMwQjQsIDB4MzBCNSwgMHgzMEI2LCAweDMwQjcsIDB4MzBCOCwgMHgzMEI5LAotICAgIDB4MzBCQSwgMHgzMEJCLCAweDMwQkMsIDB4MzBCRCwgMHgzMEJFLCAweDMwQkYsIDB4MzBDMCwgMHgzMEMxLAotICAgIDB4MzBDMiwgMHgzMEMzLCAweDMwQzQsIDB4MzBDNSwgMHgzMEM2LCAweDMwQzcsIDB4MzBDOCwgMHgzMEM5LAotICAgIDB4MzBDQSwgMHgzMENCLCAweDMwQ0MsIDB4MzBDRCwgMHgzMENFLCAweDMwQ0YsIDB4MzBEMCwgMHgzMEQxLAotICAgIDB4MzBEMiwgMHgzMEQzLCAweDMwRDQsIDB4MzBENSwgMHgzMEQ2LCAweDMwRDcsIDB4MzBEOCwgMHgzMEQ5LAotICAgIDB4MzBEQSwgMHgzMERCLCAweDMwREMsIDB4MzBERCwgMHgzMERFLCAweDMwREYsIDB4MzBFMCwgMHgzMEUxLAotICAgIDB4MzBFMiwgMHgzMEUzLCAweDMwRTQsIDB4MzBFNSwgMHgzMEU2LCAweDMwRTcsIDB4MzBFOCwgMHgzMEU5LAotICAgIDB4MzBFQSwgMHgzMEVCLCAweDMwRUMsIDB4MzBFRCwgMHgzMEVFLCAweDMwRUYsIDB4MzBGMCwgMHgzMEYxLAotICAgIDB4MzBGMiwgMHgzMEYzLCAweDMwRjQsIDB4MzBGNywgMHgzMEY4LCAweDMwRjksIDB4MzBGQSwgMHgzMDAxLAotICAgIDB4MzAwMiwgMHgzMEZCLCAweEZGMEEsIDB4MjAzQiwgMHgyNUNCLCAweDI1Q0UsIDB4MjVDOSwgMHgyNUIzLAotICAgIDB4MjVCMiwgMHgzMEZELCAweDMwRkUsIDB4MzA5RCwgMHgzMDlFLCAweEZGMDgsIDB4RkYwOSwgMHgzMDE0LAotICAgIDB4MzAxNSwgMHhGRjA4LCAweEZGMDksIDB4MzAxNCwgMHgzMDE1LCAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLAotICAgIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgzMDQxLAotICAgIDB4MzA0MiwgMHgzMDQzLCAweDMwNDQsIDB4MzA0NSwgMHgzMDQ2LCAweDMwNDcsIDB4MzA0OCwgMHgzMDQ5LAotICAgIDB4MzA0QSwgMHgzMDRCLCAweDMwNEIsIDB4MzA0QywgMHgzMDRELCAweDMwNEUsIDB4MzA0RiwgMHgzMDUwLAotICAgIDB4MzA1MSwgMHgzMDUxLCAweDMwNTIsIDB4MzA1MywgMHgzMDU0LCAweDMwNTUsIDB4MzA1NiwgMHgzMDU3LAotICAgIDB4MzA1OCwgMHgzMDU5LCAweDMwNUEsIDB4MzA1QiwgMHgzMDVDLCAweDMwNUQsIDB4MzA1RSwgMHgzMDVGLAotICAgIDB4MzA2MCwgMHgzMDYxLCAweDMwNjIsIDB4MzA2MywgMHgzMDY0LCAweDMwNjUsIDB4MzA2NiwgMHgzMDY3LAotICAgIDB4MzA2OCwgMHgzMDY5LCAweDMwNkEsIDB4MzA2QiwgMHgzMDZDLCAweDMwNkQsIDB4MzA2RSwgMHgzMDZGLAotICAgIDB4MzA3MCwgMHgzMDcxLCAweDMwNzIsIDB4MzA3MywgMHgzMDc0LCAweDMwNzUsIDB4MzA3NiwgMHgzMDc3LAotICAgIDB4MzA3OCwgMHgzMDc5LCAweDMwN0EsIDB4MzA3QiwgMHgzMDdDLCAweDMwN0QsIDB4MzA3RSwgMHgzMDdGLAotICAgIDB4MzA4MCwgMHgzMDgxLCAweDMwODIsIDB4MzA4MywgMHgzMDg0LCAweDMwODUsIDB4MzA4NiwgMHgzMDg3LAotICAgIDB4MzA4OCwgMHgzMDg5LCAweDMwOEEsIDB4MzA4QiwgMHgzMDhDLCAweDMwOEQsIDB4MzA4RSwgMHgzMDhGLAotICAgIDB4MzA5MCwgMHgzMDkxLCAweDMwOTIsIDB4MzA5MywgMHgzMDk0LCAweDMwNDEsIDB4MzA0MywgMHgzMDQ1LAotICAgIDB4MzA0NywgMHgzMDQ5LCAweDMwNEIsIDB4MzA1MSwgMHgzMDYzLCAweDMwODMsIDB4MzA4NSwgMHgzMDg3LAotICAgIDB4MzA4RSwgMHgzMEExLCAweDMwQTIsIDB4MzBBMywgMHgzMEE0LCAweDMwQTUsIDB4MzBBNiwgMHgzMEE3LAotICAgIDB4MzBBOCwgMHgzMEE5LCAweDMwQUEsIDB4MzBBQiwgMHgzMEY1LCAweDMwQUMsIDB4MzBBRCwgMHgzMEFFLAotICAgIDB4MzBBRiwgMHgzMEIwLCAweDMwQjEsIDB4MzBGNiwgMHgzMEIyLCAweDMwQjMsIDB4MzBCNCwgMHgzMEI1LAotICAgIDB4MzBCNiwgMHgzMEI3LCAweDMwQjgsIDB4MzBCOSwgMHgzMEJBLCAweDMwQkIsIDB4MzBCQywgMHgzMEJELAotICAgIDB4MzBCRSwgMHgzMEJGLCAweDMwQzAsIDB4MzBDMSwgMHgzMEMyLCAweDMwQzMsIDB4MzBDNCwgMHgzMEM1LAotICAgIDB4MzBDNiwgMHgzMEM3LCAweDMwQzgsIDB4MzBDOSwgMHgzMENBLCAweDMwQ0IsIDB4MzBDQywgMHgzMENELAotICAgIDB4MzBDRSwgMHgzMENGLCAweDMwRDAsIDB4MzBEMSwgMHgzMEQyLCAweDMwRDMsIDB4MzBENCwgMHgzMEQ1LAotICAgIDB4MzBENiwgMHgzMEQ3LCAweDMwRDgsIDB4MzBEOSwgMHgzMERBLCAweDMwREIsIDB4MzBEQywgMHgzMERELAotICAgIDB4MzBERSwgMHgzMERGLCAweDMwRTAsIDB4MzBFMSwgMHgzMEUyLCAweDMwRTMsIDB4MzBFNCwgMHgzMEU1LAotICAgIDB4MzBFNiwgMHgzMEU3LCAweDMwRTgsIDB4MzBFOSwgMHgzMEVBLCAweDMwRUIsIDB4MzBFQywgMHgzMEVELAotICAgIDB4MzBFRSwgMHgzMEVGLCAweDMwRjAsIDB4MzBGMSwgMHgzMEYyLCAweDMwRjMsIDB4MzBGNCwgMHgzMEExLAotICAgIDB4MzBBMywgMHgzMEE1LCAweDMwQTcsIDB4MzBBOSwgMHgzMEY1LCAweDMwRjYsIDB4MzBDMywgMHgzMEUzLAotICAgIDB4MzBFNSwgMHgzMEU3LCAweDMwRUUsIDB4MzBGQywgMHgzMEZDLCAweDZDRTgsIDB4MjBBQywgMHgyMTI2LAotICAgIDB4MjAzMiwgMHgyMDMzLCAweEZCMDAsIDB4RkIwMywgMHhGQjA0LCAweDAxMDEsIDB4MDEyQiwgMHgwMTZCLAotICAgIDB4MDExMywgMHgwMTRELCAweDAxMDAsIDB4MDEyQSwgMHgwMTZBLCAweDAxMTIsIDB4MDE0QywgMHgyMTVCLAotICAgIDB4MjE1QywgMHgyMTVELCAweDIxNUUsIDB4MjE1MywgMHgyMTU0LCAweDIwNzAsIDB4MjA3NCwgMHgyMDc1LAotICAgIDB4MjA3NiwgMHgyMDc3LCAweDIwNzgsIDB4MjA3OSwgMHgyMDgwLCAweDIwODEsIDB4MjA4MiwgMHgyMDgzLAotICAgIDB4MjA4NCwgMHgyMDg1LCAweDIwODYsIDB4MjA4NywgMHgyMDg4LCAweDIwODksIDB4MDFDRCwgMHgwMTFBLAotICAgIDB4MDAwMCwgMHgxRUJDLCAweDAxQ0YsIDB4MDAwMCwgMHgwMTI4LCAweDAxRDEsIDB4MDAwMCwgMHgwMUQzLAotICAgIDB4MDE2RSwgMHgwMTY4LCAweDAxQ0UsIDB4MDExQiwgMHgwMDAwLCAweDFFQkQsIDB4MDFEMCwgMHgwMDAwLAotICAgIDB4MDEyOSwgMHgwMUQyLCAweDAwMDAsIDB4MDFENCwgMHgwMTZGLCAweDAxNjksIDB4MDI1MSwgMHgwMjUxLAotICAgIDB4MDI1MSwgMHgwMUZELCAweDAwRTYsIDB4MDI1NCwgMHgwMjU0LCAweDAyNTQsIDB4MDI1OSwgMHgwMjU5LAotICAgIDB4MDI1OSwgMHgwMjVBLCAweDAyNUEsIDB4MDI1QSwgMHgwMjVCLCAweDAyNUIsIDB4MDI1QiwgMHgwMDZBLAotICAgIDB4MDE0QiwgMHgwMjc1LCAweDAyOEMsIDB4MDI4QywgMHgwMjhDLCAweDAyOTIsIDB4MDI4MywgMHgwMkQwLAotICAgIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAotICAgIDB4MDAyOCwgMHgwMDI5LCAweDAwMkEsIDB4MDAyQiwgMHgwMDJDLCAweDAwMkQsIDB4MDAyRSwgMHgwMDJGLAotICAgIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAotICAgIDB4MDAzOCwgMHgwMDM5LCAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLCAweDAwM0QsIDB4MDAzRSwgMHgwMDNGLAotICAgIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAotICAgIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLAotICAgIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAotICAgIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MDA1QiwgMHgwMEE1LCAweDAwNUQsIDB4MDA1RSwgMHgwMDVGLAotICAgIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAotICAgIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsIDB4MDA2RSwgMHgwMDZGLAotICAgIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAotICAgIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDA3QiwgMHgwMEE2LCAweDAwN0QsIDB4MDMwMywgMHgwMkJDLAotICAgIDB4MDA1QywgMHgwMkJCLCAweDAwN0MsIDB4MDA3RSwgMHgwMEExLCAweDAwQTIsIDB4MDBBMywgMHgyMDQ0LAotICAgIDB4MDE5MiwgMHgwMEE3LCAweDAwQTQsIDB4MjAxQywgMHgwMEFCLCAweDIwMzksIDB4MjAzQSwgMHhGQjAxLAotICAgIDB4RkIwMiwgMHgyMDEyLCAweDIwMjAsIDB4MjAyMSwgMHgwMEI3LCAweDAwQjYsIDB4MjAyMiwgMHgyMDFBLAotICAgIDB4MjAxRSwgMHgyMDFELCAweDAwQkIsIDB4MjAyNiwgMHgyMDMwLCAweDAwQkYsIDB4MDMwMSwgMHgwMzAyLAotICAgIDB4MDBBRiwgMHgwMzA2LCAweDAzMDcsIDB4MDMwOCwgMHgwMzBBLCAweDAwQjgsIDB4MDMwQiwgMHgwMzI4LAotICAgIDB4MDMwQywgMHgwMzM2LCAweDAwQzYsIDB4MDBBQSwgMHgwMTQxLCAweDAwRDgsIDB4MDE1MiwgMHgwMEJBLAotICAgIDB4MDBFNiwgMHgwMTMxLCAweDAxNDIsIDB4MDBGOCwgMHgwMTUzLCAweDAwREYsIDB4MDAyRCwgMHgwMEE5LAotICAgIDB4MDBBQywgMHgwMEFFLCAweDAwQjAsIDB4MDBCMSwgMHgwMEIyLCAweDAwQjMsIDB4MDBCNSwgMHgwMEI5LAotICAgIDB4MDBCQywgMHgwMEJELCAweDAwQkUsIDB4MDBDMCwgMHgwMEMxLCAweDAwQzIsIDB4MDBDMywgMHgwMEM0LAotICAgIDB4MDBDNSwgMHgwMEM3LCAweDAwQzgsIDB4MDBDOSwgMHgwMENBLCAweDAwQ0IsIDB4MDBDQywgMHgwMENELAotICAgIDB4MDBDRSwgMHgwMENGLCAweDAwRDAsIDB4MDBEMSwgMHgwMEQyLCAweDAwRDMsIDB4MDBENCwgMHgwMEQ1LAotICAgIDB4MDBENiwgMHgwMEQ3LCAweDAwRDksIDB4MDBEQSwgMHgwMERCLCAweDAwREMsIDB4MDBERCwgMHgwMERFLAotICAgIDB4MDBFMCwgMHgwMEUxLCAweDAwRTIsIDB4MDBFMywgMHgwMEU0LCAweDAwRTUsIDB4MDBFNywgMHgwMEU4LAotICAgIDB4MDBFOSwgMHgwMEVBLCAweDAwRUIsIDB4MDBFQywgMHgwMEVELCAweDAwRUUsIDB4MDBFRiwgMHgwMEYwLAotICAgIDB4MDBGMSwgMHgwMEYyLCAweDAwRjMsIDB4MDBGNCwgMHgwMEY1LCAweDAwRjYsIDB4MDBGNywgMHgwMEY5LAotICAgIDB4MDBGQSwgMHgwMEZCLCAweDAwRkMsIDB4MDBGRCwgMHgwMEZFLCAweDAwRkYsIDB4MDE2MCwgMHgwMTc4LAotICAgIDB4MDE3RCwgMHgwMzA1LCAweDAxNjEsIDB4MjEyMiwgMHgwMTdFLCAweDAwMzAsIDB4MjBBQywgMHgyMTI2LAotICAgIDB4MjAzMiwgMHgyMDMzLCAweEZCMDAsIDB4RkIwMywgMHhGQjA0LCAweDAxMDEsIDB4MDEyQiwgMHgwMTZCLAotICAgIDB4MDExMywgMHgwMTRELCAweDAxMDAsIDB4MDEyQSwgMHgwMTZBLCAweDAxMTIsIDB4MDE0QywgMHgyMTVCLAotICAgIDB4MjE1QywgMHgyMTVELCAweDIxNUUsIDB4MjE1MywgMHgyMTU0LCAweDIwNzAsIDB4MjA3NCwgMHgyMDc1LAotICAgIDB4MjA3NiwgMHgyMDc3LCAweDIwNzgsIDB4MjA3OSwgMHgyMDgwLCAweDIwODEsIDB4MjA4MiwgMHgyMDgzLAotICAgIDB4MjA4NCwgMHgyMDg1LCAweDIwODYsIDB4MjA4NywgMHgyMDg4LCAweDIwODksIDB4MDFDRCwgMHgwMTFBLAotICAgIDB4MDAwMCwgMHgxRUJDLCAweDAxQ0YsIDB4MDAwMCwgMHgwMTI4LCAweDAxRDEsIDB4MDAwMCwgMHgwMUQzLAotICAgIDB4MDE2RSwgMHgwMTY4LCAweDAxQ0UsIDB4MDExQiwgMHgwMDAwLCAweDFFQkQsIDB4MDFEMCwgMHgwMDAwLAotICAgIDB4MDEyOSwgMHgwMUQyLCAweDAwMDAsIDB4MDFENCwgMHgwMTZGLCAweDAxNjksIDB4MDAzMCwgMHgwMDMxLAotICAgIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LAotICAgIDB4MDMzNiwgMHgwMDJELCAweDAwM0QsIDB4MDAyQywgMHgwMDI4LCAweDAwMjksIDB4MDAyRSwgMHgwMDJGLAotICAgIDB4MDAzQSwgMHgwMDNCLCAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LAotICAgIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgwMzM2LCAweDAwMkQsIDB4MDAzRCwgMHgwMDJDLAotICAgIDB4MDAyOCwgMHgwMDI5LCAweDAwMkUsIDB4MDAyRiwgMHgwMDNBLCAweDAwM0IsIDB4MDBCNywgMHgwMDJELAotICAgIDB4MDAzRCwgMHgyMTAzLCAweDI2NDAsIDB4MjY0MiwgMHgzMDEzLCAweDMwMTIsIDB4MzAwQywgMHgzMDBELAotICAgIDB4MzAwRSwgMHgzMDBGLCAweDMwMUEsIDB4MzAxQiwgMHgzMDE4LCAweDMwMTksIDB4RkYwOCwgMHhGRjA5LAotICAgIDB4MzAxRCwgMHgzMDFFLCAweDIwMTgsIDB4MjAxOSwgMHgyMDFDLCAweDIwMUQsIDB4MDAyNywgMHgwMDIyLAotICAgIDB4OTAzOCwgMHg4QjAxLCAweDdERTMsIDB4OUVDMywgMHg2RUFCLCAweDc5OEQsIDB4NjA5NCwgMHg2RDc3LAotICAgIDB4NjE2OCwgMHg2OTgyLCAweDZFMzQsIDB4ODkxMCwgMHg2RjIyLCAweDU2NjgsIDB4NjVFMiwgMHg3OTQ4LAotICAgIDB4ODY1QiwgMHg5N0ZGLCAweDUyRTQsIDB4OEIzOSwgMHg2M0VELCAweDY0Q0EsIDB4Nzg0RiwgMHg3QTQwLAotICAgIDB4NkJCQSwgMHg3OTQ5LCAweDg5OTYsIDB4NzE2RSwgMHg3OTNFLCAweDgwMDUsIDB4ODFFRCwgMHg3OTVELAotICAgIDB4NjY5MSwgMHg3RjcyLCAweDZEODksIDB4NzJDMCwgMHg2MTNDLCAweDc3MUUsIDB4N0JDMCwgMHg3OTU2LAotICAgIDB4NTBFNywgMHg1QzY0LCAweDVERTIsIDB4NjE4RSwgMHg4RDA4LCAweDUzN0QsIDB4NTYwNiwgMHg4NDU3LAotICAgIDB4NUZCNSwgMHg2MUYyLCAweDkzQUQsIDB4Nzk4RSwgMHg5QjJELCAweDdBODEsIDB4OTZFMywgMHg2ODg1LAotICAgIDB4N0U0MSwgMHg2NjY5LCAweDUzNTEsIDB4Nzg5MSwgMHg4Q0QzLCAweDY1NEYsIDB4NEZBRSwgMHg1MDAyLAotICAgIDB4NTg0MCwgMHg1MkM5LCAweDZCNjUsIDB4NThBOCwgMHg2QkNGLCAweDUxNEQsIDB4NjIzRSwgMHg3OTUwLAotICAgIDB4NkIwNCwgMHg5Njg2LCAweDg2NUMsIDB4NkREQSwgMHg5ODVFLCAweDY2QzYsIDB4NkI3NywgMHg3REY0LAotICAgIDB4OTM0QSwgMHg1RUNBLCAweDkzMDQsIDB4Njk4MiwgMHg1MUI0LCAweDYzNEMsIDB4ODZEQiwgMHg5MDg5LAotICAgIDB4OTAyMiwgMHg1MDQ5LCAweDdERUYsIDB4OTA1NSwgMHg1M0E5LCAweDk5MEMsIDB4ODg1QiwgMHg1RUY2LAotICAgIDB4NkNCRiwgMHg5MjVCLCAweDdGQzEsIDB4ODJCRCwgMHg5NkM1LCAweDVCQjMsIDB4NjE2OCwgMHg2OTgyLAotICAgIDB4NkJCQiwgMHg2NTYyLCAweDhDQUIsIDB4NURDQywgMHg5ODExLCAweDVFMzAsIDB4OEVDQywgMHg3QUFFLAotICAgIDB4NTc0NywgMHg1MDkxLCAweDdBNzQsIDB4NTA2NSwgMHg1RUZBLCAweDkyMzcsIDB4NkE4RSwgMHg0RUE0LAotICAgIDB4NTE2QywgMHg2NkY0LCAweDY4MjEsIDB4Nzg2QywgMHg3RDVFLCAweDgwMDMsIDB4OENGQywgMHg5NjRELAotICAgIDB4NjJGNywgMHg3RjZBLCAweDRGN0YsIDB4NTNGMiwgMHg1OUM5LCAweDhCMUQsIDB4OTBBQSwgMHg1M0NFLAotICAgIDB4OEYyRiwgMHg2N0Q0LCAweDc3QUMsIDB4ODIxQywgMHg2OTZGLCAweDY3N0UsIDB4OEExRiwgMHg0RTA4LAotICAgIDB4NTdGNCwgMHg2OTBELCAweDgwNzcsIDB4ODlBQSwgMHg5MDQyLCAweDYzNkUsIDB4NjQ0MiwgMHg4MjM5LAotICAgIDB4N0RDRiwgMHg4MDYxLCAweDUwQ0YsIDB4OEE5NSwgMHg2MDY1LCAweDUxNDYsIDB4NzczQSwgMHg4MDc0LAotICAgIDB4OERGMywgMHg1RUFELCAweDVFRjcsIDB4ODI0NywgMHg2ODQzLCAweDkwMDMsIDB4NkQzRSwgMHg2MzkyLAotICAgIDB4OEYyOSwgMHg3M0VELCAweDk4MTIsIDB4NjBCMiwgMHg2MjQ5LCAweDY1OTAsIDB4N0RDQiwgMHg4QUI5LAotICAgIDB4OENBNywgMHg3MjM2LCAweDg0N0EsIDB4NTIwNiwgMHg1Njc0LCAweDYxQTQsIDB4N0M4OSwgMHg3RDFCLAotICAgIDB4OTZGMCwgMHg4NTNELCAweDRGQkYsIDB4NjM2NywgMHg3NkM2LCAweDY4NUQsIDB4ODEwOCwgMHg4MDM2LAotICAgIDB4N0ZGQywgMHg1NDBGLCAweDk2QTMsIDB4OUU5RiwgMHg5RTk3LCAweDgwNkYsIDB4ODA3RSwgMHg2RTdFLAotICAgIDB4NTA4NSwgMHg1MTkzLCAweDUxREIsIDB4NTMxNSwgMHg1MzQwLCAweDk2RDksIDB4NTVBOSwgMHg1NkMxLAotICAgIDB4NTcwRCwgMHg1OEFCLCAweDU5REEsIDB4NUEzNiwgMHg1QUJFLCAweDVENEUsIDB4NUQ4NywgMHg1REM5LAotICAgIDB4NUREMywgMHg1RjJELCAweDVGOTgsIDB4NjBEOCwgMHg2MTNELCAweDYxRkUsIDB4NjI2OCwgMHg2MkNGLAotICAgIDB4NjUxRCwgMHg2NDBGLCAweDY0RjIsIDB4NjU1RCwgMHg2NjVGLCAweDY3QTksIDB4NjdFNywgMHg2OTZCLAotICAgIDB4NjkzMCwgMHg2OUE3LCAweDZBNDQsIDB4NkE5MCwgMHg2QzA4LCAweDZDMTMsIDB4NkUyMywgMHg2RjExLAotICAgIDB4NkVGRSwgMHg2RjNFLCAweDcxRkYsIDB4NzNFNSwgMHg3NDMyLCAweDc0NUYsIDB4NzRFMCwgMHg3NTBDLAotICAgIDB4NzY3MiwgMHg3OTJBLCAweDc4RDQsIDB4NzlCQSwgMHg3QTE5LCAweDdBOTUsIDB4N0NGMiwgMHg3RDczLAotICAgIDB4N0RERCwgMHg3RTM1LCAweDdGQUUsIDB4N0ZFMSwgMHg4MDVBLCAweDgwNUYsIDB4ODA3MywgMHg4MDcwLAotICAgIDB4ODA3NiwgMHg4MTUzLCAweDgxOEEsIDB4ODFCNSwgMHg4MUNELCAweDgzRjIsIDB4ODU1NSwgMHg4NUQ1LAotICAgIDB4ODcxQSwgMHg4ODM2LCAweDg4OUUsIDB4ODhEOCwgMHg4OEY0LCAweDg5MkIsIDB4ODkzQiwgMHg4OTZBLAotICAgIDB4ODk2RiwgMHg4QTFELCAweDhEMDUsIDB4OEQwRiwgMHg5RjRFLCAweDhFOTEsIDB4OEVBMSwgMHg5MDUyLAotICAgIDB4OTAwRSwgMHg5MTMwLCAweDkxNTYsIDB4OTE1OCwgMHg5MTY1LCAweDkxNzMsIDB4OTE3MiwgMHg5MUEyLAotICAgIDB4OTFBRiwgMHg5MUFBLCAweDkxQjQsIDB4OTFCQSwgMHg5NDc3LCAweDk2OTgsIDB4OTczRCwgMHg5NzYwLAotICAgIDB4OTc3MSwgMHg5ODBDLCAweDk4NzMsIDB4OThDMywgMHg5QTQ1LCAweDlCNEQsIDB4OUI1OCwgMHg5QkM2LAotICAgIDB4OUJFMSwgMHg5QkYxLCAweDlENDgsIDB4OURDRiwgMHg5RjA4LCAweDYyNzEsIDB4NjY5NywgMHg2MTBGLAotICAgIDB4ODg2MywgMHg5MDU1LCAweDkwN0EsIDB4NzhFRiwgMHg1NEUxLCAweDJFRDcsIDB4MkVCRCwgMHg1M0E5LAotICAgIDB4NzREQywgMHg5MDRCLCAweDk5MEMsIDB4ODg1RSwgMHg5MkIzLCAweDk1QjEsIDB4NUVGNiwgMHg2M0Y0LAotICAgIDB4NkNCRiwgMHg3MTU5LCAweDkwNjAsIDB4OTI1QiwgMHg2NUJDLCAweDVGODAsIDB4N0ZDMSwgMHg1Mzc4LAotICAgIDB4OTdGMywgMHg1MzE2LCAweDgyQjEsIDB4ODNEMywgMHg4Q0E4LCAweDkwNEUsIDB4ODJCRCwgMHg5NkM1LAotICAgIDB4OTkxMywgMHg1RUZCLCAweDcwNzAsIDB4NUJCMywgMHg2MTY4LCAweDYxNjgsIDB4NjE2OCwgMHg2OUVBLAotICAgIDB4Njk4MiwgMHg2NzZFLCAweDg5RDIsIDB4OTY5NCwgMHg1MjcyLCAweDhGNDQsIDB4OTM4QywgMHg4MkM1LAotICAgIDB4NUJEMiwgMHg3NEIwLCAweDdERTksIDB4N0YzNiwgMHg5MDg0LCAweDk1OTIsIDB4OTdEMywgMHg4MjE4LAotICAgIDB4NTM3MSwgMHg1NTlDLCAweDM0MDIsIDB4MzQwMiwgMHg1RTdFLCAweDY1RTMsIDB4NjcxRiwgMHg2QTVGLAotICAgIDB4OEQ3NywgMHg5OEUyLCAweDU0MDksIDB4NTVBQiwgMHg4NjUwLCAweDkwMDYsIDB4NTNDQSwgMHg1NDM4LAotICAgIDB4NjAyNSwgMHg3RDFBLCAweDVERTgsIDB4NjJEMiwgMHg4RERELCAweDlCNUEsIDB4OUI1QSwgMHg1MzdGLAotICAgIDB4NUYzQSwgMHg2MDUwLCAweDY5QzEsIDB4NkE0QiwgMHg2QTRCLCAweDkxMTUsIDB4OTdGRiwgMHg5OTU3LAotICAgIDB4NjY4MSwgMHgyRUE5LCAweDhGRDEsIDB4NTAzNiwgMHg3N0U5LCAweDUxNzcsIDB4ODY1RSwgMHg3QTdBLAotICAgIDB4OTA0NywgMHg2QURCLCAweDU1NTMsIDB4NTk1MSwgMHg2MDc1LCAweDYxNjcsIDB4OEZDRSwgMHg1MDkxLAotICAgIDB4NkY1NCwgMHg3QTc0LCAweDJFQkMsIDB4MkVCQywgMHg1MTdDLCAweDUyMzgsIDB4NjFCMiwgMHg2NzQzLAotICAgIDB4ODBBOSwgMHg4QjE5LCAweDkwNjMsIDB4NTM5RiwgMHg4QTAxLCAweDYyMzYsIDB4OTZDNywgMHg5ODY3LAotICAgIDB4NTQzMywgMHg1QTFCLCAweDhBQTQsIDB4NURFNSwgMHg2MTRDLCAweDYyODUsIDB4NjNBNywgMHg2OUNCLAotICAgIDB4NkQ2OSwgMHg2RTJGLCAweDgwMTUsIDB4ODE1NCwgMHg4MzUyLCAweDhCMUIsIDB4OENGQywgMHg1NDNGLAotICAgIDB4OTE3NywgMHg4MTcwLCAweDc1MTEsIDB4OEZCQywgMHg0RUNBLCAweDkzOTYsIDB4NUVBNywgMHg1RjY5LAotICAgIDB4NjNBMSwgMHg2QjcyLCAweDgzREMsIDB4NTFCNCwgMHg1NEIyLCAweDUyNEEsIDB4NzUyMiwgMHg5OTEwLAotICAgIDB4NTlGRiwgMHg1OUZGLCAweDVERkYsIDB4OEFFRSwgMHg4QUVFLCAweDhDQzcsIDB4OENDNywgMHg2QjIxLAotICAgIDB4NkIyMSwgMHg2RUNCLCAweDczQkEsIDB4NTNGMSwgMHg2MzY4LCAweDY1OUMsIDB4OTBBQSwgMHg1MkZBLAotICAgIDB4NzIzNSwgMHg3MjM1LCAweDkxNEMsIDB4NUYzMSwgMHg0RTNCLCAweDUzRDcsIDB4NjM4OCwgMHg1NDY4LAotICAgIDB4N0Q0MiwgMHg3RkQyLCAweDg4NDYsIDB4OTAzMSwgMHg0RjRGLCAweDg4NTMsIDB4OEZGMCwgMHg1REUxLAotICAgIDB4OTA3NSwgMHg5MDc1LCAweDYyNDAsIDB4NjZGOCwgMHg1OTczLCAweDUyREQsIDB4NTU0NiwgMHg1QkI1LAotICAgIDB4NUMwNiwgMHgyRThDLCAweDJFOEQsIDB4NUMxOSwgMHg2RDg4LCAweDc4NUQsIDB4ODA5NiwgMHg0RTA4LAotICAgIDB4NUI4MiwgMHg1N0NFLCAweDYwQzUsIDB4NTdGNCwgMHg5OEZFLCAweDY5MEQsIDB4NkI5NiwgMHg5OERGLAotICAgIDB4OThFMCwgMHgyRURFLCAweDM3OEQsIDB4NEZCNSwgMHgyRTk3LCAweDZENzgsIDB4NzcxRiwgMHg5MDMyLAotICAgIDB4NEVCQiwgMHg0RUJBLCAweDUyMDMsIDB4NUMwQiwgMHg4QTBBLCAweDhBMEEsIDB4OEZDNSwgMHg4ODcwLAotICAgIDB4OTA0MiwgMHgzNTFGLCAweDUyRTIsIDB4NjIxMCwgMHg3NkRCLCAweDgwNTYsIDB4ODk4MCwgMHg4QUEwLAotICAgIDB4OEFDQiwgMHg5NzVDLCAweDk3NUMsIDB4N0EwNSwgMHg4MTA2LCAweDk2QkIsIDB4N0M0RCwgMHg3QkMwLAotICAgIDB4OEFBQSwgMHg5NkVBLCAweDdENzYsIDB4NjI0NywgMHg2Rjk4LCAweDdGQTEsIDB4ODIzOSwgMHg5MDc4LAotICAgIDB4OTA3NywgMHg1MjRELCAweDUxNjgsIDB4NjM4MywgMHg2M0Y3LCAweDc2MjYsIDB4OEQ3MCwgMHg5MDAxLAotICAgIDB4OTA2RCwgMHg5MDIwLCAweDJFQ0EsIDB4OTAxRiwgMHg4Q0NBLCAweDVDMEEsIDB4NUMwQSwgMHg1OUE1LAotICAgIDB4NkNGMCwgMHg5MDAwLCAweDkwMkUsIDB4OTY4QSwgMHg5QkRCLCAweDU5MjcsIDB4MzQyNywgMHg3MDI3LAotICAgIDB4OTA1NCwgMHg4MTJCLCAweDRFMzksIDB4NkI0RSwgMHg3MEFELCAweDhBOTUsIDB4NjY5NiwgMHg1MDI0LAotICAgIDB4N0Y2RSwgMHg3QkM5LCAweDJFQUUsIDB4N0I1MSwgMHg5MDEwLCAweDY3RjEsIDB4NkNFOCwgMHg5OUQwLAotICAgIDB4NUY2QiwgMHg1RkI1LCAweDYxRjIsIDB4NjcxRCwgMHg2RjZFLCAweDhBQkYsIDB4NzZGNCwgMHg2NzE1LAotICAgIDB4NjcxNSwgMHg1ODlDLCAweDhGRkQsIDB4OTAxQSwgMHg1NzZBLCAweDkxRTMsIDB4NTQ0OCwgMHg1RTFELAotICAgIDB4N0EwQiwgMHg3Njg0LCAweDkwNjksIDB4OEZFRCwgMHg2REZCLCAweDUxNEUsIDB4OTAxNCwgMHg3ODNBLAotICAgIDB4NTcyMSwgMHg1NzFGLCAweDUxQUMsIDB4NTUxMCwgMHg3Q0Q2LCAweDg1RTQsIDB4OEIwNCwgMHg5MDAzLAotICAgIDB4OTAwRiwgMHg5QTMwLCAweDVDMEUsIDB4OTA1MywgMHg1NDUxLCAweDNCODgsIDB4NTE2NywgMHg4MDg5LAotICAgIDB4NEU3MywgMHg1RkNELCAweDhBOEQsIDB4NUJFNywgMHg3RDBELCAweDg5ODcsIDB4NkQzRSwgMHg4MEJBLAotICAgIDB4NTM1QSwgMHg4NTg0LCAweDhGRUIsIDB4N0UxQiwgMHg4MDg3LCAweDRFMzcsIDB4NkY1MSwgMHg5MUIxLAotICAgIDB4NEYzNCwgMHg1MjI0LCAweDUzNEEsIDB4NUUwNiwgMHg3NTU0LCAweDY2NjksIDB4ODU0MywgMHg5MDdGLAotICAgIDB4NUZBRSwgMHg5RjNCLCAweDUzMzksIDB4MkVBQSwgMHg1RjY1LCAweDU5RUMsIDB4NTlFQiwgMHg4QTU1LAotICAgIDB4NUU5OSwgMHg3NUM1LCAweDVBNjYsIDB4NjU3NywgMHg2RDZFLCAweDhDQTAsIDB4OENBMCwgMHg2NzBELAotICAgIDB4ODk4NiwgMHg0RTE5LCAweDVFNjMsIDB4NUU3MywgMHg1RjBBLCAweDg1MTEsIDB4NTA0RiwgMHg3REU4LAotICAgIDB4OEZENCwgMHg5MDRELCAweDdDM0YsIDB4NTMwNSwgMHg1RDI5LCAweDYyQjEsIDB4NjcwQiwgMHg3ODMyLAotICAgIDB4N0UyQiwgMHg4MERFLCAweDg0MEMsIDB4OTBBNiwgMHg5MEE2LCAweDk4RkQsIDB4OUQ2QywgMHg0RUExLAotICAgIDB4NUUzRCwgMHg1RkQ4LCAweDVGRDksIDB4NjIzRiwgMHg2NzFCLCAweDY3MUIsIDB4NTE5MiwgMHg2NDY5LAotICAgIDB4N0ZGQiwgMHg1MUUxLCAweDc4RTgsIDB4OUI1NCwgMHgyRkM3LCAweDY5RDksIDB4Njg1RCwgMHg0RkUzLAotICAgIDB4NTNDOCwgMHg3RTZELCAweDlFQkYsIDB4ODEwOCwgMHg2NjBFLCAweDc2REYsIDB4OEZGNywgMHg1OTg0LAotICAgIDB4NTJEMCwgMHg3NkYyLCAweDgwMTcsIDB4NjIzRSwgMHg3RDBCLCAweDk1ODAsIDB4N0QwNCwgMHg4RThELAotICAgIDB4Njg3QSwgMHg2ODdBLCAweDY4MDEsIDB4NjEwOSwgMHg4QUVELCAweDhGMzgsIDB4NTJDNywgMHg2NzA5LAotICAgIDB4NzMzNiwgMHg3MzM2LCAweDczMzcsIDB4ODhENSwgMHg5MDRBLCAweDY2REMsIDB4MkVCNywgMHg4OTgxLAotICAgIDB4OTkwQSwgMHg3RkNDLCAweDdGRkMsIDB4OEVCNiwgMHg4NjJELCAweDczODcsIDB4OUY4RCwgMHg5RjhELAotICAgIDB4NjVDNSwgMHg2ODgxLCAweDcxRDAsIDB4OTZBMywgMHg5QzU3LCAweDlFOUYsIDB4N0M3QiwgMHg1RUM5LAotICAgIDB4NjE5MCwgMHg5MDIzLCAweDY3MTcsIDB4ODAwMiwgMHg4MTA3LCAweDUwQ0EsIDB4NTExQSwgMHg1MTU0LAotICAgIDB4NTE5NSwgMHgyRTg3LCAweDUyOEQsIDB4NTJENywgMHg1MkY5LCAweDUzNDksIDB4MzUzRSwgMHg1M0RGLAotICAgIDB4NjZGQywgMHg1NTMzLCAweDU1RTQsIDB4NTQ1NSwgMHg1NkMwLCAweDU5MzksIDB4NUExQywgMHg1QUMyLAotICAgIDB4NUI3MywgMHg1QkMzLCAweDVDMTQsIDB4MzdFMiwgMHg1Q0U2LCAweDVFNTQsIDB4NEU0OCwgMHg1RUUzLAotICAgIDB4NjA5NywgMHg2MkQ0LCAweDYyQ0MsIDB4NjQxQywgMHg2M0M2LCAweDY0MjgsIDB4ODIwOSwgMHg2MzFCLAotICAgIDB4NjY1RiwgMHg2NjVGLCAweDY2NjMsIDB4NjZGNSwgMHg2NzVFLCAweDY4OUQsIDB4Njg4RCwgMHg2OUY2LAotICAgIDB4Njk2MSwgMHg1QkU4LCAweDVCRTgsIDB4NjlCQiwgMHg2QkNDLCAweDZGMTEsIDB4NkUxNywgMHg2Rjk4LAotICAgIDB4NkNBQSwgMHg2Q0FBLCAweDcwMUIsIDB4NzE2MiwgMHg3MjNCLCAweDRFMkMsIDB4NzMxQywgMHg3NENBLAotICAgIDB4NzRFRiwgMHg3NTc1LCAweDc1RUMsIDB4NzY0RSwgMHgzRkIxLCAweDc3NkEsIDB4NzdBOSwgMHg3OTQwLAotICAgIDB4Nzk1MywgMHg3OTUzLCAweDlGNEIsIDB4NzlBRSwgMHg5MDgzLCAweDdCNTMsIDB4N0MxMSwgMHg3QzE0LAotICAgIDB4NDI2NCwgMHg3QzUwLCAweDdDNTgsIDB4N0Q0NiwgMHg3RDYzLCAweDdFMjIsIDB4N0UyMiwgMHg3RTQ4LAotICAgIDB4N0UzNSwgMHg3RTQzLCAweDdFOEMsIDB4N0Y1MCwgMHg3RjUxLCAweDdGNTEsIDB4N0Y1MSwgMHg3RkM1LAotICAgIDB4N0ZDNiwgMHg3RkU5LCAweDgxNDEsIDB4NDQ1MywgMHg4MjU4LCAweDgyNzksIDB4MkVCRiwgMHgyRUMwLAotICAgIDB4ODJFMywgMHg1MTc5LCAweDgzQTIsIDB4ODQyMCwgMHg4M0JELCAweDg0RjQsIDB4ODU2RCwgMHg4NTg3LAotICAgIDB4ODVGNCwgMHg0RTU1LCAweDg3MzcsIDB4ODczQiwgMHg4ODA1LCAweDg3QkQsIDB4ODY3RCwgMHg4ODM2LAotICAgIDB4ODk0NCwgMHg4OEM2LCAweDg5QkQsIDB4OEFEQiwgMHg4QjNFLCAweDhCNUEsIDB4OEQ3MywgMHg4RDk5LAotICAgIDB4OERDQiwgMHg4RTM0LCAweDhFNEEsIDB4OEZFRiwgMHg5MDg3LCAweDhGRkEsIDB4OTAxRSwgMHg5MDM1LAotICAgIDB4OTA1MCwgMHg4RkM4LCAweDkwODEsIDB4OTA4QSwgMHg5MDhBLCAweDkwOEEsIDB4OTA4QSwgMHg5MDhBLAotICAgIDB4OTA4QSwgMHg5MDg5LCAweDkwODksIDB4OTA4OSwgMHg5MDg5LCAweDkwODksIDB4OTA4OSwgMHg5MDg5LAotICAgIDB4OTA4OSwgMHg5MDg5LCAweDkwODksIDB4OTA4OSwgMHg5MDg5LCAweDkyQ0YsIDB4OTNERCwgMHg5NUJDLAotICAgIDB4OTYyMSwgMHg5NkIyLCAweDk3NUMsIDB4OTgzOSwgMHg5OEVCLCAweDk5MDMsIDB4OTkwOSwgMHg5OTQ1LAotICAgIDB4OTk0NSwgMHg5OTRCLCAweDlBMDgsIDB4OUE1RiwgMHg5QTY1LCAweDlBRUYsIDB4OUIxOCwgMHg5QkRGLAotICAgIDB4OUQwOSwgMHg5RDA4LCAweDlFQTUsIDB4OUVDQywgMHg5RjA4LCAweDlGNEEsIDB4OUY2MywgMHg5RjY3LAotICAgIDB4OUY2QywgMHg3MTk5LCAweDcxOTksIDB4ODkxQywgMHg2OEM4LCAweDY2RkIsIDB4NUY0NSwgMHg1MzAwLAotICAgIDB4NTM4OSwgMHg1OTUzLCAweEZBMTEsIDB4Njg1MiwgMHg2QTczLCAweDZEODcsIDB4RkExNSwgMHg4QTEyLAotICAgIDB4NEUwNCwgMHg0RTA1LCAweDRFMUYsIDB4NEUyQiwgMHg0RTJGLCAweDRFMzAsIDB4NEU0MCwgMHg0RTQxLAotICAgIDB4NEU0NCwgMHg0RTVBLCAweDRFN0YsIDB4NEU4RCwgMHg0RTk2LCAweDRFQjksIDB4NEVEMCwgMHg0RUUwLAotICAgIDB4NEVGRCwgMHg0RUZGLCAweDRGMEIsIDB4NEYxNSwgMHg0RjYwLCAweDRGM0IsIDB4NEY0OSwgMHg0RjU0LAotICAgIDB4NEY3QSwgMHg0RjdELCAweDRGN0UsIDB4NEY5NywgMHg0RkJFLCAweDRGQ0YsIDB4NEZGRCwgMHg1MDAwLAotICAgIDB4NTAwMSwgMHg1MDEwLCAweDUwMUIsIDB4NTAyNywgMHg1MDJFLCAweDUwNTcsIDB4NTA2NiwgMHg1MDZBLAotICAgIDB4NTAzQiwgMHg1MDhGLCAweDUwOTYsIDB4NTA5QywgMHg1MENDLCAweDUwRTYsIDB4NTBFOSwgMHg1MEVGLAotICAgIDB4NTEwOCwgMHg1MTBCLCAweDUxMTAsIDB4NTExQiwgMHg1MTFFLCAweDUxNUYsIDB4NTFBMSwgMHg1MUJDLAotICAgIDB4NTFERSwgMHg1MUVFLCAweDUxRjQsIDB4NTIwMSwgMHg1MjAyLCAweDUyMTMsIDB4NTI0OSwgMHg1MjYxLAotICAgIDB4NTI2NiwgMHg1MjkzLCAweDUyQzgsIDB4NTJGMCwgMHg1MzBBLCAweDUzMEIsIDB4NTMzRSwgMHg1MzRDLAotICAgIDB4NTM0QiwgMHg1MzYxLCAweDUzNkMsIDB4NTNBQiwgMHg1M0RBLCAweDUzRTYsIDB4NTNGNSwgMHg1NDI3LAotICAgIDB4NTQ0RCwgMHg1NDY2LCAweDU0NkIsIDB4NTQ3NCwgMHg1NDhELCAweDU0OTYsIDB4NTRBMSwgMHg1NEFELAotICAgIDB4NTRCOSwgMHg1NEJGLCAweDU0QzYsIDB4NTRDRCwgMHg1NTBFLCAweDU1MkIsIDB4NTUzNSwgMHg1NTRBLAotICAgIDB4NTU2MCwgMHg1NTYxLCAweDU1ODgsIDB4NTU4RSwgMHg1NjA4LCAweDU2MEUsIDB4NTYwRiwgMHg1NjM3LAotICAgIDB4NTYzRiwgMHg1NjQ5LCAweDU2NEIsIDB4NTY0RiwgMHg1NjY2LCAweDU2NjksIDB4NTY2RiwgMHg1NjcxLAotICAgIDB4NTY3MiwgMHg1Njk1LCAweDU2OUEsIDB4NTZBQywgMHg1NkFELCAweDU2QjEsIDB4NTZDOSwgMHg1NkRELAotICAgIDB4NTZFNCwgMHg1NzBBLCAweDU3MTUsIDB4NTcyMywgMHg1NzJGLCAweDU3MzMsIDB4NTczNCwgMHg1NzRDLAotICAgIDB4NTc3MCwgMHg1NzhDLCAweDU3OUMsIDB4NTdCOCwgMHg1N0U2LCAweDU3RUQsIDB4NTdGNSwgMHg1N0Y2LAotICAgIDB4NTdGRiwgMHg1ODA5LCAweDU4MjAsIDB4NTgzMiwgMHg1ODdDLCAweDU4ODAsIDB4NThBOSwgMHg1OENFLAotICAgIDB4NThEMCwgMHg1OEQ0LCAweDU4REEsIDB4NThFOSwgMHg1OTBDLCAweDU5MjQsIDB4NTkyRiwgMHg1OTYxLAotICAgIDB4NTk2RCwgMHg1OUNBLCAweDU5RDIsIDB4NTlERCwgMHg1OUUzLCAweDU5RTQsIDB4NUEwNCwgMHg1QTBDLAotICAgIDB4NUEyMywgMHg1QTQ3LCAweDVBNTUsIDB4NUE2MywgMHg1QTZELCAweDVBN0UsIDB4NUE5RSwgMHg1QUE3LAotICAgIDB4NUFBQywgMHg1QUIzLCAweDVBRTAsIDB4NUIwMCwgMHg1QjE5LCAweDVCMjUsIDB4NUIyRCwgMHg1QjQxLAotICAgIDB4NUI3QywgMHg1QjdFLCAweDVCN0YsIDB4NUI4QSwgMHg1QzIzLCAweDVDMkIsIDB4NUMzMCwgMHg1QzYzLAotICAgIDB4NUM2OSwgMHg1QzdDLCAweDVDQ0IsIDB4NUNEMiwgMHg1Q0Y0LCAweDVEMjQsIDB4NUQyNiwgMHg1RDQzLAotICAgIDB4NUQ0NiwgMHg1RDRBLCAweDVEOTIsIDB4NUQ5NCwgMHg1RDk5LCAweDVEQTAsIDB4NUREOCwgMHg1REUwLAotICAgIDB4NURGOCwgMHg1RTAwLCAweDVFMTIsIDB4NUUxNCwgMHg1RTE1LCAweDVFMTgsIDB4NUUyRSwgMHg1RTU4LAotICAgIDB4NUU2QiwgMHg1RTZDLCAweDVFQTgsIDB4NUVBQSwgMHg1RUJFLCAweDVFQkYsIDB4NUVDQiwgMHg1RUQyLAotICAgIDB4NUYwNywgMHg1RjBFLCAweDVGMUMsIDB4NUYxRCwgMHg1RjIyLCAweDVGMjgsIDB4NUYzNiwgMHg1RjNCLAotICAgIDB4NUY0MCwgMHg1RjUwLCAweDVGNTgsIDB4NUY2NCwgMHg1Rjg5LCAweDVGOUMsIDB4NUZBNywgMHg1RkE0LAotICAgIDB4NUZBRiwgMHg1RkI4LCAweDVGQzQsIDB4NUZDOSwgMHg1RkUxLCAweDVGRTksIDB4NUZFRCwgMHg1RkZDLAotICAgIDB4NjAxNywgMHg2MDFBLCAweDYwMzMsIDB4NjA2MSwgMHg2MDdGLCAweDYwOUUsIDB4NjBBNCwgMHg2MEIwLAotICAgIDB4NjBDQiwgMHg2MERCLCAweDYwRjgsIDB4NjExMiwgMHg2MTEzLCAweDYxMTQsIDB4NjExQywgMHg2MTdDLAotICAgIDB4NjE4RCwgMHg2MTlGLCAweDYxQTgsIDB4NjFDMiwgMHg2MURGLCAweDYyMTUsIDB4NjIyOSwgMHg2MjQzLAotICAgIDB4NjI0NiwgMHg2MjRDLCAweDYyNTEsIDB4NjI1NiwgMHg2MkM0LCAweDYyRkMsIDB4NjMwQSwgMHg2MzBELAotICAgIDB4NjMxOCwgMHg2MzM5LCAweDYzNDIsIDB4NjM0MywgMHg2MzY1LCAweDYzNzQsIDB4NjM3RCwgMHg2Mzg0LAotICAgIDB4NjM4NywgMHg2MzkwLCAweDYzOUUsIDB4NjNEMSwgMHg2M0RDLCAweDY0MDksIDB4NjQxMCwgMHg2NDIyLAotICAgIDB4NjQ1NCwgMHg2NDVCLCAweDY0NkQsIDB4NjQ3QiwgMHg2NEJFLCAweDY0QkYsIDB4NjRFNSwgMHg2NEY3LAotICAgIDB4NjRGQiwgMHg2NTA0LCAweDY1MTYsIDB4NjUxOSwgMHg2NTQ3LCAweDY1NjcsIDB4NjU4MSwgMHg2NTg1LAotICAgIDB4NjVDMiwgMHg2NUYwLCAweDY1RjIsIDB4NjYyQywgMHg2NjRDLCAweDY2NUIsIDB4NjY1QywgMHg2NjYxLAotICAgIDB4NjY2QiwgMHg2Njc3LCAweDY2QTQsIDB4NjZDOCwgMHg2NkVDLCAweDY3MDUsIDB4NjcxMywgMHg2NzMzLAotICAgIDB4Njc0OCwgMHg2NzRDLCAweDY3NzYsIDB4Njc3QiwgMHg2N0IwLCAweDY3QjIsIDB4NjdGOSwgMHg2N0Q3LAotICAgIDB4NjdEOSwgMHg2N0YwLCAweDY4MkMsIDB4NjgzMCwgMHg2ODMxLCAweDY4NUIsIDB4Njg3MiwgMHg2ODc1LAotICAgIDB4Njg3QSwgMHg2ODg0LCAweDY4QTUsIDB4NjhCMiwgMHg2OEQwLCAweDY4RDYsIDB4NjhFOCwgMHg2OEVELAotICAgIDB4NjhGMCwgMHg2OEYxLCAweDY4RkMsIDB4NjkxMSwgMHg2OTEzLCAweDY5MzUsIDB4NjkzQiwgMHg2OTU3LAotICAgIDB4Njk2MywgMHg2OTcyLCAweDY5N0YsIDB4Njk4MCwgMHg2OUE2LCAweDY5QUQsIDB4NjlCNywgMHg2OUQ2LAotICAgIDB4NjlENywgMHg2QTAxLCAweDZBMEYsIDB4NkExNSwgMHg2QTI4LCAweDZBMzQsIDB4NkEzRSwgMHg2QTQ1LAotICAgIDB4NkE1MCwgMHg2QTUxLCAweDZBNTYsIDB4NkE1QiwgMHg2QTgzLCAweDZBODksIDB4NkE5MSwgMHg2QTlELAotICAgIDB4NkE5RSwgMHg2QTlGLCAweDZBREMsIDB4NkFFNywgMHg2QUVDLCAweDZCMUUsIDB4NkIyNCwgMHg2QjM1LAotICAgIDB4NkI0NiwgMHg2QjU2LCAweDZCNjAsIDB4NkI4MiwgMHg2QkJFLCAweDZCRTEsIDB4NkJGMSwgMHg2QzEwLAotICAgIDB4NkMzMywgMHg2QzM1LCAweDZDM0EsIDB4NkM1OSwgMHg2Qzc2LCAweDZDN0IsIDB4NkM4NSwgMHg2Qzk1LAotICAgIDB4NkM5QywgMHg2Q0QwLCAweDZDRDQsIDB4NkNENiwgMHg2Q0UwLCAweDZDRUIsIDB4NkNFQywgMHg2Q0VFLAotICAgIDB4NkQwQSwgMHg2RDBFLCAweDZEMTEsIDB4NkQyRSwgMHg2RDU3LCAweDZENUUsIDB4NkQ2NSwgMHg2RDgyLAotICAgIDB4NkRCRiwgMHg2REM0LCAweDZEQ0EsIDB4NkRENiwgMHg2REU5LCAweDZFMjIsIDB4NkU1MSwgMHg2RUM3LAotICAgIDB4NkVDQSwgMHg2RUNFLCAweDZFRkQsIDB4NkYxQSwgMHg2RjJBLCAweDZGMkYsIDB4NkYzMywgMHg2RjVBLAotICAgIDB4NkY1RSwgMHg2RjYyLCAweDZGN0QsIDB4NkY4QiwgMHg2RjhELCAweDZGOTIsIDB4NkY5NCwgMHg2RjlBLAotICAgIDB4NkZBNywgMHg2RkE4LCAweDZGQjYsIDB4NkZEQSwgMHg2RkRFLCAweDZGRjksIDB4NzAzOSwgMHg3MDNDLAotICAgIDB4NzA0QSwgMHg3MDU0LCAweDcwNUQsIDB4NzA1RSwgMHg3MDY0LCAweDcwNkMsIDB4NzA3RSwgMHg3MDgxLAotICAgIDB4NzA5NSwgMHg3MEI3LCAweDcwRDMsIDB4NzBENCwgMHg3MEQ4LCAweDcwREMsIDB4NzEwNywgMHg3MTIwLAotICAgIDB4NzEzMSwgMHg3MTRBLCAweDcxNTIsIDB4NzE2MCwgMHg3MTc5LCAweDcxOTIsIDB4NzFCMywgMHg3MUNCLAotICAgIDB4NzFEMywgMHg3MUQ2LCAweDcyMDAsIDB4NzIxRCwgMHg3MjJCLCAweDcyMzgsIDB4NzI0MSwgMHg3MjUzLAotICAgIDB4NzI1NSwgMHg3MjU2LCAweDcyNUMsIDB4NzI4RCwgMHg3MkFELCAweDcyQjQsIDB4NzJDNywgMHg3MkZCLAotICAgIDB4NzMwNCwgMHg3MzA1LCAweDczMjgsIDB4NzMzMSwgMHg3MzQzLCAweDczNkMsIDB4NzM3QywgMHg3MzgzLAotICAgIDB4NzM4NSwgMHg3Mzg2LCAweDczOTUsIDB4NzM5RSwgMHg3MzlGLCAweDczQTAsIDB4NzNBNiwgMHg3M0FCLAotICAgIDB4NzNCNSwgMHg3M0I3LCAweDczQkMsIDB4NzNDRiwgMHg3M0Q5LCAweDczRTksIDB4NzNGNCwgMHg3M0ZELAotICAgIDB4NzQwNCwgMHg3NDBBLCAweDc0MUEsIDB4NzQxQiwgMHg3NDI0LCAweDc0MjgsIDB4NzQyQywgMHg3NDJGLAotICAgIDB4NzQzMCwgMHg3NDMxLCAweDc0MzksIDB4NzQ0NCwgMHg3NDQ3LCAweDc0NEIsIDB4NzQ0RCwgMHg3NDUxLAotICAgIDB4NzQ1NywgMHg3NDY2LCAweDc0NkIsIDB4NzQ3MSwgMHg3NDgwLCAweDc0ODUsIDB4NzQ4NiwgMHg3NDg3LAotICAgIDB4NzQ5MCwgMHg3NDk4LCAweDc0OUMsIDB4NzRBMCwgMHg3NEEzLCAweDc0QTgsIDB4NzRBQiwgMHg3NEI1LAotICAgIDB4NzRCRiwgMHg3NEM4LCAweDc0REEsIDB4NzRERSwgMHg3NTRFLCAweDc1NzksIDB4NzU4MSwgMHg3NTkwLAotICAgIDB4NzU5MiwgMHg3NTkzLCAweDc1QjQsIDB4NzVFNCwgMHg3NUY5LCAweDc2MDAsIDB4NzYwQSwgMHg3NjE1LAotICAgIDB4NzYxNiwgMHg3NjE5LCAweDc2MUUsIDB4NzYyRCwgMHg3NjM1LCAweDc2NDMsIDB4NzY0QiwgMHg3NjY1LAotICAgIDB4NzY2RCwgMHg3NjZGLCAweDc2NzEsIDB4NzY3NCwgMHg3NkE0LCAweDc2QTUsIDB4NzZDNSwgMHg3NkNDLAotICAgIDB4NzZFQywgMHg3NkZDLCAweDc3MzQsIDB4NzczNiwgMHg3NzVDLCAweDc3NUYsIDB4Nzc2MCwgMHg3NzcyLAotICAgIDB4Nzc3RCwgMHg3Nzk1LCAweDc3QUEsIDB4NzdFNiwgMHg3N0YwLCAweDc3RjQsIDB4NzgwNiwgMHg3ODIyLAotICAgIDB4NzgyRCwgMHg3ODJFLCAweDc4MzAsIDB4NzgzNSwgMHg3ODY4LCAweDc4OUUsIDB4NzhDOCwgMHg3OENDLAotICAgIDB4NzhDRSwgMHg3OEU0LCAweDc4RTAsIDB4NzhFMSwgMHg3OEYyLCAweDc4RjcsIDB4NzhGQiwgMHg3OTMxLAotICAgIDB4NzkzNCwgMHg3OTNCLCAweDc5M0QsIDB4Nzk0NSwgMHg3OTVCLCAweDc5NUMsIDB4Nzk4QiwgMHg3OTk2LAotICAgIDB4Nzk5OCwgMHg3OUI4LCAweDc5QkIsIDB4NzlDQSwgMHg3OURBLCAweDdBMDMsIDB4N0EwOSwgMHg3QTExLAotICAgIDB4N0ExRSwgMHg3QTJELCAweDdBMzksIDB4N0E0NSwgMHg3QTRDLCAweDdBNUQsIDB4N0E2MCwgMHg3QTZELAotICAgIDB4N0E3OCwgMHg3QUEwLCAweDdBQTMsIDB4N0FCMywgMHg3QUJCLCAweDdBQkMsIDB4N0FDNiwgMHg3QjA3LAotICAgIDB4N0IxNCwgMHg3QjI3LCAweDdCMzEsIDB4N0I0NywgMHg3QjRFLCAweDdCNjAsIDB4N0I2OSwgMHg3QjZELAotICAgIDB4N0I3MiwgMHg3QjkxLCAweDdCQUYsIDB4N0JENywgMHg3QkQ5LCAweDdDMEIsIDB4N0MwRiwgMHg3QzIwLAotICAgIDB4N0MyNiwgMHg3QzMxLCAweDdDMzYsIDB4N0M1MSwgMHg3QzU5LCAweDdDNjcsIDB4N0M2RSwgMHg3QzcwLAotICAgIDB4N0NCQywgMHg3Q0JGLCAweDdDQzgsIDB4N0NDOSwgMHg3Q0Q3LCAweDdDRDksIDB4N0NERCwgMHg3Q0VCLAotICAgIDB4N0QwNywgMHg3RDA4LCAweDdEMDksIDB4N0QxMywgMHg3RDFELCAweDdEMjMsIDB4N0Q0MSwgMHg3RDUzLAotICAgIDB4N0Q1OSwgMHg3RDVELCAweDdEN0EsIDB4N0Q4NiwgMHg3RDhCLCAweDdEOEMsIDB4N0RDQywgMHg3REVCLAotICAgIDB4N0RGMSwgMHg3REY5LCAweDdFMDgsIDB4N0UxMSwgMHg3RTE1LCAweDdFMjAsIDB4N0U0NywgMHg3RTYyLAotICAgIDB4N0U2RSwgMHg3RTczLCAweDdFOEQsIDB4N0U5MSwgMHg3RTk4LCAweDdGNDQsIDB4N0Y0RiwgMHg3RjUyLAotICAgIDB4N0Y1MywgMHg3RjYxLCAweDdGOTEsIDB4N0ZCRiwgMHg3RkNFLCAweDdGREYsIDB4N0ZFNSwgMHg3RkVDLAotICAgIDB4N0ZFRSwgMHg3RkVGLCAweDdGRkEsIDB4ODAwRSwgMHg4MDExLCAweDgwMTQsIDB4ODAyNCwgMHg4MDI2LAotICAgIDB4ODAzQSwgMHg4MDNDLCAweDgwNjAsIDB4ODA3MSwgMHg4MDc1LCAweDgwOUUsIDB4ODBBNiwgMHg4MEFCLAotICAgIDB4ODBENywgMHg4MEQ4LCAweDgxMTYsIDB4ODExOCwgMHg4MTNBLCAweDgxNEEsIDB4ODE0QywgMHg4MTgxLAotICAgIDB4ODE4NCwgMHg4MUI0LCAweDgxQ0YsIDB4ODFGOSwgMHg4MjAzLCAweDgyMjEsIDB4ODIzMiwgMHg4MjM0LAotICAgIDB4ODI0NiwgMHg4MjRCLCAweDgyNEYsIDB4ODI4RSwgMHg4MkFFLCAweDgyQjcsIDB4ODJCRSwgMHg4MkM2LAotICAgIDB4ODJGRSwgMHg4MzQzLCAweDgzNTEsIDB4ODM1NSwgMHg4Mzg2LCAweDgzOEQsIDB4ODM5MiwgMHg4Mzk4LAotICAgIDB4ODNBOSwgMHg4M0JGLCAweDgzQzAsIDB4ODNFQSwgMHg4NDBGLCAweDg0MTEsIDB4ODQ0QSwgMHg4NDc2LAotICAgIDB4ODRBOCwgMHg4NEFGLCAweDg0QzAsIDB4ODRDMiwgMHg4NEYwLCAweDg0RkQsIDB4ODUwQywgMHg4NTM0LAotICAgIDB4ODU1RSwgMHg4NThGLCAweDg1QjcsIDB4ODVDRSwgMHg4NUFELCAweDg2MTIsIDB4ODYyOSwgMHg4NjUyLAotICAgIDB4ODY2MywgMHg4NjZDLCAweDg2NkYsIDB4ODY3QSwgMHg4NjhELCAweDg2OTEsIDB4ODY5OCwgMHg4NkE3LAotICAgIDB4ODZBOCwgMHg4NkZBLCAweDg2RkQsIDB4ODcwQiwgMHg4NzEzLCAweDg3MTksIDB4ODcxRSwgMHg4NzI4LAotICAgIDB4ODczRSwgMHg4NzcxLCAweDg3ODgsIDB4ODc5OSwgMHg4N0FDLCAweDg3QUQsIDB4ODdCNSwgMHg4N0Q2LAotICAgIDB4ODdFQiwgMHg4N0VELCAweDg4MDEsIDB4ODgwMywgMHg4ODA2LCAweDg4MEIsIDB4ODgxNCwgMHg4ODFDLAotICAgIDB4ODg1NiwgMHg4ODVGLCAweDg4NjQsIDB4ODg5OCwgMHg4OEFBLCAweDg4QkQsIDB4ODhCRSwgMHg4OENBLAotICAgIDB4ODhEMiwgMHg4OERCLCAweDg4RjAsIDB4ODhGMSwgMHg4OTA2LCAweDg5MTgsIDB4ODkxOSwgMHg4OTFBLAotICAgIDB4ODkyNywgMHg4OTMwLCAweDg5M0UsIDB4ODk3QiwgMHg4OUQ0LCAweDg5RDYsIDB4ODlFNSwgMHg4OUYxLAotICAgIDB4OEEwNywgMHg4QTBGLCAweDhBMTUsIDB4OEEyMiwgMHg4QTRFLCAweDhBN0YsIDB4OEFGNCwgMHg4QjFGLAotICAgIDB4OEIzNywgMHg4QjQzLCAweDhCNDQsIDB4OEI1NCwgMHg4QjlDLCAweDhCOUUsIDB4OEM0NywgMHg4QzU0LAotICAgIDB4OEM3MywgMHg4Q0E0LCAweDhDRDksIDB4OENFMSwgMHg4Q0Y4LCAweDhDRkUsIDB4OEQxQiwgMHg4RDY5LAotICAgIDB4OEQ2QywgMHg4RDg0LCAweDhEOEQsIDB4OEQ5NSwgMHg4REE2LCAweDhEQzYsIDB4OERDRSwgMHg4REU0LAotICAgIDB4OERFQywgMHg4RTIwLCAweDhFNEIsIDB4OEU2QywgMHg4RTcwLCAweDhFN0EsIDB4OEU5MiwgMHg4RUFFLAotICAgIDB4OEVCMywgMHg4RUQxLCAweDhFRDQsIDB4OEVGOSwgMHg4RjE3LCAweDhGMzYsIDB4OEZBNiwgMHg4RkI1LAotICAgIDB4OEZCNiwgMHg4RkM2LCAweDhGRTAsIDB4OEZFNCwgMHg4RkY2LCAweDkwMDIsIDB4OTAyQywgMHg5MDQ0LAotICAgIDB4OTA4OCwgMHg5MDk1LCAweDkwOTksIDB4OTA5QiwgMHg5MEEyLCAweDkwQjQsIDB4OTBENywgMHg5MERELAotICAgIDB4OTBGNCwgMHg5MTE3LCAweDkxMUMsIDB4OTEzMSwgMHg5MTNBLCAweDkxM0QsIDB4OTE0OCwgMHg5MTVCLAotICAgIDB4OTE2MSwgMHg5MTY0LCAweDkxOEUsIDB4OTE5RSwgMHg5MUE4LCAweDkxQUQsIDB4OTFBRSwgMHg5MUIyLAotICAgIDB4OTFCQywgMHg5MUYwLCAweDkxRjcsIDB4OTFGQiwgMHg5MjA3LCAweDkyMjgsIDB4OTIzMywgMHg5MjM4LAotICAgIDB4OTI0MywgMHg5MjQ3LCAweDkyNEYsIDB4OTI2MCwgMHg5MkMyLCAweDkyQ0IsIDB4OTJDQywgMHg5MkRGLAotICAgIDB4OTMwRCwgMHg5MzE1LCAweDkzMUYsIDB4OTMyNywgMHg5MzQ3LCAweDkzNTIsIDB4OTM2NSwgMHg5MzZBLAotICAgIDB4OTM2RCwgMHg5MzlCLCAweDkzQkEsIDB4OTNBOSwgMHg5M0MxLCAweDkzQ0EsIDB4OTNFMiwgMHg5M0ZBLAotICAgIDB4OTNGRCwgMHg5NDBGLCAweDk0MzQsIDB4OTQzRiwgMHg5NDU1LCAweDk0NkIsIDB4OTQ3MiwgMHg5NTc4LAotICAgIDB4OTVBNiwgMHg5NUE5LCAweDk1QUIsIDB4OTVCNCwgMHg5NUJELCAweDk1REEsIDB4OTYxRCwgMHg5NjQxLAotICAgIDB4OTY1OCwgMHg5Njg0LCAweDk2QTQsIDB4OTZBOSwgMHg5NkQyLCAweDVEQjIsIDB4OTZERSwgMHg5NkU5LAotICAgIDB4OTZGMSwgMHg5NzAyLCAweDk3MDksIDB4OTc1QSwgMHg5NzYzLCAweDk3NkUsIDB4OTc3MywgMHg5NzlBLAotICAgIDB4OTdBMiwgMHg5N0I1LCAweDk3QjYsIDB4OTdEOSwgMHg5N0RFLCAweDk3RjQsIDB4OTgwQSwgMHg5ODBFLAotICAgIDB4OTgxRSwgMHg5ODIzLCAweDk4MkIsIDB4OTgzRSwgMHg5ODUyLCAweDk4NTMsIDB4OTg1OSwgMHg5ODZDLAotICAgIDB4OThCOCwgMHg5OEJBLCAweDk4QkYsIDB4OThDOCwgMHg5OEU1LCAweDk5MzIsIDB4OTkzMywgMHg5OTQwLAotICAgIDB4OTk0RCwgMHg5OTVDLCAweDk5NUYsIDB4OTlCMSwgMHg5OUI5LCAweDk5QkEsIDB4OTlDOSwgMHg5QTAyLAotICAgIDB4OUExNiwgMHg5QTI0LCAweDlBMjcsIDB4OUEyRCwgMHg5QTJFLCAweDlBMzYsIDB4OUEzOCwgMHg5QTRBLAotICAgIDB4OUE1NiwgMHg5QUI1LCAweDlBQjYsIDB4OUFGOSwgMHg5QjAzLCAweDlCMjAsIDB4OUIzMywgMHg5QjM0LAotICAgIDB4OUI3MywgMHg5Qjc5LCAweDlCQTcsIDB4OUJDMSwgMHg5QkM3LCAweDlCRDcsIDB4OUJFNywgMHg5QkVCLAotICAgIDB4OUJGNywgMHg5QkZBLCAweDlCRkQsIDB4OUMwQiwgMHg5QzI3LCAweDlDMkEsIDB4OUMzNiwgMHg5QzQxLAotICAgIDB4OUM1MywgMHg5QzYzLCAweDlDNkEsIDB4OUM3NywgMHg5RDAyLCAweDlENDIsIDB4OUQ0NywgMHg5RDYzLAotICAgIDB4OUQ2OSwgMHg5RDdDLCAweDlEN0UsIDB4OUQ4RCwgMHg5REIxLCAweDlEQzMsIDB4OURDNywgMHg5REQ2LAotICAgIDB4OURERiwgMHg5REVCLCAweDlERjQsIDB4OUUxNSwgMHg5RTFELCAweDlFQTQsIDB4OUVBOCwgMHg5RUFDLAotICAgIDB4OUVFNywgMHg5RUVFLCAweDlGMTAsIDB4OUYxMiwgMHg5RjE3LCAweDlGMTksIDB4OUYyRiwgMHg5RjM3LAotICAgIDB4OUYzOSwgMHg5RjQxLCAweDlGNDUsIDB4OUY1NywgMHg5RjY4LCAweDlGNzEsIDB4OUY3NSwgMHg5RjkwLAotICAgIDB4OUY5NCwgMHg5RkEyLCAweDRFMzAsIDB4MzQwNSwgMHg0RjYwLCAweDU2MjAsIDB4NUVDQiwgMHgyRTk1LAotICAgIDB4NjBBNCwgMHg2OUQ3LCAweDZCMjQsIDB4NkZGOSwgMHg2RUU2LCAweDcxQjMsIDB4MkVBNCwgMHg3QUM2LAotICAgIDB4N0Y2MSwgMHg4MDcxLCAweDgwOUUsIDB4MkVDQywgMHg5MUYwLCAweDVEQjIsIDB4OTdERSwgMHg0RkQzLAotICAgIDB4NTBEOSwgMHg1MEYwLCAweDUxQzMsIDB4NTY3NiwgMHg2QTU0LCAweDZEMDEsIDB4NkREMCwgMHg2RTQyLAotICAgIDB4NkVEOSwgMHg3M0U0LCAweDc0MjEsIDB4NzU2QywgMHg3ODUxLCAweDg3RjUsIDB4RkZGRCwgMHg3M0E4LAotICAgIDB4M0FGMywgMHgzNERCLCAweDQ0MEMsIDB4M0U4QSwgMHhGRkZELCAweEZGRkQsIDB4NEJFOCwgMHhGRkZELAotICAgIDB4M0VEQSwgMHgzQjIyLCAweEZGRkQsIDB4NDU3QSwgMHg0MDkzLCAweEZGRkQsIDB4NDY2NSwgMHg0MTAzLAotICAgIDB4NDI5MywgMHg0NkFFLCAweDM0ODgsIDB4RkZGRCwKKyNpbmNsdWRlICJjbWFwc19qYXBhbjEuaCIKKworY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9KYXBhbjFDSUQyVW5pY29kZV80WzE1NDQ0XSA9IHsKKyAgICAweEZGRkQsIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorICAgIDB4MDAyOCwgMHgwMDI5LCAweDAwMkEsIDB4MDAyQiwgMHgwMDJDLCAweDAwMkQsIDB4MDAyRSwgMHgwMDJGLCAweDAwMzAsCisgICAgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwKKyAgICAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLCAweDAwM0QsIDB4MDAzRSwgMHgwMDNGLCAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLAorICAgIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LCAweDAwNDgsIDB4MDA0OSwgMHgwMDRBLCAweDAwNEIsCisgICAgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLCAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwKKyAgICAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwgMHgwMDVBLCAweDAwNUIsIDB4MDBBNSwgMHgwMDVELAorICAgIDB4MDA1RSwgMHgwMDVGLCAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsCisgICAgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywgMHgwMDZELCAweDAwNkUsIDB4MDA2RiwKKyAgICAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywgMHgwMDc4LAorICAgIDB4MDA3OSwgMHgwMDdBLCAweDAwN0IsIDB4MDBBNiwgMHgwMDdELCAweDAzMDMsIDB4MDJCQywgMHgwMDVDLCAweDAyQkIsCisgICAgMHgwMDdDLCAweDAwN0UsIDB4MDBBMSwgMHgwMEEyLCAweDAwQTMsIDB4MjA0NCwgMHgwMTkyLCAweDAwQTcsIDB4MDBBNCwKKyAgICAweDIwMUMsIDB4MDBBQiwgMHgyMDM5LCAweDIwM0EsIDB4RkIwMSwgMHhGQjAyLCAweDIwMTIsIDB4MjAyMCwgMHgyMDIxLAorICAgIDB4MDBCNywgMHgwMEI2LCAweDIwMjIsIDB4MjAxQSwgMHgyMDFFLCAweDIwMUQsIDB4MDBCQiwgMHgyMDI2LCAweDIwMzAsCisgICAgMHgwMEJGLCAweDAzMDEsIDB4MDMwMiwgMHgwMEFGLCAweDAzMDYsIDB4MDMwNywgMHgwMzA4LCAweDAzMEEsIDB4MDBCOCwKKyAgICAweDAzMEIsIDB4MDMyOCwgMHgwMzBDLCAweDAzMzYsIDB4MDBDNiwgMHgwMEFBLCAweDAxNDEsIDB4MDBEOCwgMHgwMTUyLAorICAgIDB4MDBCQSwgMHgwMEU2LCAweDAxMzEsIDB4MDE0MiwgMHgwMEY4LCAweDAxNTMsIDB4MDBERiwgMHgwMDJELCAweDAwQTksCisgICAgMHgwMEFDLCAweDAwQUUsIDB4MDBCMCwgMHgwMEIxLCAweDAwQjIsIDB4MDBCMywgMHgwMEI1LCAweDAwQjksIDB4MDBCQywKKyAgICAweDAwQkQsIDB4MDBCRSwgMHgwMEMwLCAweDAwQzEsIDB4MDBDMiwgMHgwMEMzLCAweDAwQzQsIDB4MDBDNSwgMHgwMEM3LAorICAgIDB4MDBDOCwgMHgwMEM5LCAweDAwQ0EsIDB4MDBDQiwgMHgwMENDLCAweDAwQ0QsIDB4MDBDRSwgMHgwMENGLCAweDAwRDAsCisgICAgMHgwMEQxLCAweDAwRDIsIDB4MDBEMywgMHgwMEQ0LCAweDAwRDUsIDB4MDBENiwgMHgwMEQ3LCAweDAwRDksIDB4MDBEQSwKKyAgICAweDAwREIsIDB4MDBEQywgMHgwMERELCAweDAwREUsIDB4MDBFMCwgMHgwMEUxLCAweDAwRTIsIDB4MDBFMywgMHgwMEU0LAorICAgIDB4MDBFNSwgMHgwMEU3LCAweDAwRTgsIDB4MDBFOSwgMHgwMEVBLCAweDAwRUIsIDB4MDBFQywgMHgwMEVELCAweDAwRUUsCisgICAgMHgwMEVGLCAweDAwRjAsIDB4MDBGMSwgMHgwMEYyLCAweDAwRjMsIDB4MDBGNCwgMHgwMEY1LCAweDAwRjYsIDB4MDBGNywKKyAgICAweDAwRjksIDB4MDBGQSwgMHgwMEZCLCAweDAwRkMsIDB4MDBGRCwgMHgwMEZFLCAweDAwRkYsIDB4MDE2MCwgMHgwMTc4LAorICAgIDB4MDE3RCwgMHgwMzA1LCAweDAxNjEsIDB4MjEyMiwgMHgwMTdFLCAweDAwMzAsIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsCisgICAgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsIDB4MDAyOCwgMHgwMDI5LCAweDAwMkEsIDB4MDAyQiwKKyAgICAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLCAweDAwMkYsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LAorICAgIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLCAweDAwM0QsCisgICAgMHgwMDNFLCAweDAwM0YsIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwKKyAgICAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLAorICAgIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAweDAwNTgsCisgICAgMHgwMDU5LCAweDAwNUEsIDB4MDA1QiwgMHgwMEE1LCAweDAwNUQsIDB4MDA1RSwgMHgwMDVGLCAweDAwNjAsIDB4MDA2MSwKKyAgICAweDAwNjIsIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZBLAorICAgIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsIDB4MDA2RSwgMHgwMDZGLCAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsCisgICAgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LCAweDAwNzgsIDB4MDA3OSwgMHgwMDdBLCAweDAwN0IsIDB4MDA3QywKKyAgICAweDAwN0QsIDB4MjAzRSwgMHhGRjYwLCAweEZGNjEsIDB4RkY2MiwgMHhGRjYzLCAweEZGNjQsIDB4RkY2NSwgMHhGRjY2LAorICAgIDB4RkY2NywgMHhGRjY4LCAweEZGNjksIDB4RkY2QSwgMHhGRjZCLCAweEZGNkMsIDB4RkY2RCwgMHhGRjZFLCAweEZGNkYsCisgICAgMHhGRjcwLCAweEZGNzEsIDB4RkY3MiwgMHhGRjczLCAweEZGNzQsIDB4RkY3NSwgMHhGRjc2LCAweEZGNzcsIDB4RkY3OCwKKyAgICAweEZGNzksIDB4RkY3QSwgMHhGRjdCLCAweEZGN0MsIDB4RkY3RCwgMHhGRjdFLCAweEZGN0YsIDB4RkY4MCwgMHhGRjgxLAorICAgIDB4RkY4MiwgMHhGRjgzLCAweEZGODQsIDB4RkY4NSwgMHhGRjg2LCAweEZGODcsIDB4RkY4OCwgMHhGRjg5LCAweEZGOEEsCisgICAgMHhGRjhCLCAweEZGOEMsIDB4RkY4RCwgMHhGRjhFLCAweEZGOEYsIDB4RkY5MCwgMHhGRjkxLCAweEZGOTIsIDB4RkY5MywKKyAgICAweEZGOTQsIDB4RkY5NSwgMHhGRjk2LCAweEZGOTcsIDB4RkY5OCwgMHhGRjk5LCAweEZGOUEsIDB4RkY5QiwgMHhGRjlDLAorICAgIDB4RkY5RCwgMHhGRjlFLCAweEZGOUYsIDB4RkY0MCwgMHgzMEYwLCAweDMwRjEsIDB4MzBFRSwgMHgzMEFCLCAweDMwQjEsCisgICAgMHgzMEY0LCAweDMwQUMsIDB4MzBBRSwgMHgzMEIwLCAweDMwQjIsIDB4MzBCNCwgMHgzMEI2LCAweDMwQjgsIDB4MzBCQSwKKyAgICAweDMwQkMsIDB4MzBCRSwgMHgzMEMwLCAweDMwQzIsIDB4MzBDNSwgMHgzMEM3LCAweDMwQzksIDB4MzBEMCwgMHgzMEQxLAorICAgIDB4MzBEMywgMHgzMEQ0LCAweDMwRDYsIDB4MzBENywgMHgzMEQ5LCAweDMwREEsIDB4MzBEQywgMHgzMERELCAweEZGNjAsCisgICAgMHgzMDFELCAweDMwMUUsIDB4MjUwMCwgMHgyNTAxLCAweDI1MDIsIDB4MjUwMywgMHgyNTA0LCAweDI1MDUsIDB4MjUwNiwKKyAgICAweDI1MDcsIDB4MjUwOCwgMHgyNTA5LCAweDI1MEEsIDB4MjUwQiwgMHgyNTBDLCAweDI1MEQsIDB4MjUwRSwgMHgyNTBGLAorICAgIDB4MjUxMCwgMHgyNTExLCAweDI1MTIsIDB4MjUxMywgMHgyNTE0LCAweDI1MTUsIDB4MjUxNiwgMHgyNTE3LCAweDI1MTgsCisgICAgMHgyNTE5LCAweDI1MUEsIDB4MjUxQiwgMHgyNTFDLCAweDI1MUQsIDB4MjUxRSwgMHgyNTFGLCAweDI1MjAsIDB4MjUyMSwKKyAgICAweDI1MjIsIDB4MjUyMywgMHgyNTI0LCAweDI1MjUsIDB4MjUyNiwgMHgyNTI3LCAweDI1MjgsIDB4MjUyOSwgMHgyNTJBLAorICAgIDB4MjUyQiwgMHgyNTJDLCAweDI1MkQsIDB4MjUyRSwgMHgyNTJGLCAweDI1MzAsIDB4MjUzMSwgMHgyNTMyLCAweDI1MzMsCisgICAgMHgyNTM0LCAweDI1MzUsIDB4MjUzNiwgMHgyNTM3LCAweDI1MzgsIDB4MjUzOSwgMHgyNTNBLCAweDI1M0IsIDB4MjUzQywKKyAgICAweDI1M0QsIDB4MjUzRSwgMHgyNTNGLCAweDI1NDAsIDB4MjU0MSwgMHgyNTQyLCAweDI1NDMsIDB4MjU0NCwgMHgyNTQ1LAorICAgIDB4MjU0NiwgMHgyNTQ3LCAweDI1NDgsIDB4MjU0OSwgMHgyNTRBLCAweDI1NEIsIDB4MjAzMiwgMHgwMEE4LCAweDIwMzYsCisgICAgMHgwMDVCLCAweDAwNUQsIDB4MzAwOCwgMHgzMDA5LCAweDMwMEEsIDB4MzAwQiwgMHgzMDBFLCAweDMwMEYsIDB4MzAxMCwKKyAgICAweDMwMTEsIDB4MjAxMiwgMHhGRjYwLCAweDMwOTIsIDB4MzA0MSwgMHgzMDQzLCAweDMwNDUsIDB4MzA0NywgMHgzMDQ5LAorICAgIDB4MzA4MywgMHgzMDg1LCAweDMwODcsIDB4MzA2MywgMHgzMDQyLCAweDMwNDQsIDB4MzA0NiwgMHgzMDQ4LCAweDMwNEEsCisgICAgMHgzMDRCLCAweDMwNEQsIDB4MzA0RiwgMHgzMDUxLCAweDMwNTMsIDB4MzA1NSwgMHgzMDU3LCAweDMwNTksIDB4MzA1QiwKKyAgICAweDMwNUQsIDB4MzA1RiwgMHgzMDYxLCAweDMwNjQsIDB4MzA2NiwgMHgzMDY4LCAweDMwNkEsIDB4MzA2QiwgMHgzMDZDLAorICAgIDB4MzA2RCwgMHgzMDZFLCAweDMwNkYsIDB4MzA3MiwgMHgzMDc1LCAweDMwNzgsIDB4MzA3QiwgMHgzMDdFLCAweDMwN0YsCisgICAgMHgzMDgwLCAweDMwODEsIDB4MzA4MiwgMHgzMDg0LCAweDMwODYsIDB4MzA4OCwgMHgzMDg5LCAweDMwOEEsIDB4MzA4QiwKKyAgICAweDMwOEMsIDB4MzA4RCwgMHgzMDhGLCAweDMwOTMsIDB4MzA5MCwgMHgzMDkxLCAweDMwOEUsIDB4MzA0QywgMHgzMDRFLAorICAgIDB4MzA1MCwgMHgzMDUyLCAweDMwNTQsIDB4MzA1NiwgMHgzMDY4LCAweDMwNUEsIDB4MzA1QywgMHgzMDVFLCAweDMwNjAsCisgICAgMHgzMDYyLCAweDMwNjUsIDB4MzA2NywgMHgzMDY5LCAweDMwNzAsIDB4MzA3MSwgMHgzMDczLCAweDMwNzQsIDB4MzA3NiwKKyAgICAweDMwNzcsIDB4MzA3OSwgMHgzMDdBLCAweDMwN0MsIDB4MzA3RCwgMHgwMEM0LCAweDAwRjksIDB4MDBFOSwgMHgwMEVELAorICAgIDB4MDBERiwgMHgwMEU3LCAweDAwQzcsIDB4MDBEMSwgMHgwMEYxLCAweDAwQTIsIDB4MDBBMywgMHgwMEYzLCAweDAwRkEsCisgICAgMHgwMEExLCAweDAwQkYsIDB4MDBCRCwgMHgwMEQ2LCAweDAwREMsIDB4MDBFNCwgMHgwMEVCLCAweDAwRUYsIDB4MDBGNiwKKyAgICAweDAwREMsIDB4MDBFMiwgMHgwMEVBLCAweDAwRUUsIDB4MDBGNCwgMHgwMEZDLCAweDAwRTAsIDB4MDBFOSwgMHgyNUIyLAorICAgIDB4MDBFMSwgMHgwMDdFLCAweDAwMzAsIDB4MzAwMCwgMHgzMDAxLCAweDMwMDIsIDB4RkYwQywgMHhGRjBFLCAweDMwRkIsCisgICAgMHhGRjFBLCAweEZGMUIsIDB4RkYxRiwgMHhGRjAxLCAweDMwOUIsIDB4MzA5QywgMHgwMEI0LCAweEZGNDAsIDB4MDBBOCwKKyAgICAweEZGM0UsIDB4MjAzRSwgMHhGRjNGLCAweDMwRkQsIDB4MzBGRSwgMHgzMDlELCAweDMwOUUsIDB4MzAwMywgMHg0RURELAorICAgIDB4MzAwNSwgMHgzMDA2LCAweDMwMDcsIDB4MzBGQywgMHgyMDE1LCAweDIwMTAsIDB4RkYwRiwgMHhGRjNDLCAweEZGNUUsCisgICAgMHgyMDE2LCAweEZGNUMsIDB4MjAyNiwgMHgyMDI1LCAweDIwMTgsIDB4MjAxOSwgMHgyMDFDLCAweDIwMUQsIDB4RkYwOCwKKyAgICAweEZGMDksIDB4MzAxNCwgMHgzMDE1LCAweEZGM0IsIDB4RkYzRCwgMHhGRjVCLCAweEZGNUQsIDB4MzAwOCwgMHgzMDA5LAorICAgIDB4MzAwQSwgMHgzMDBCLCAweDMwMEMsIDB4MzAwRCwgMHgzMDBFLCAweDMwMEYsIDB4MzAxMCwgMHgzMDExLCAweEZGMEIsCisgICAgMHhGRjBELCAweDAwQjEsIDB4MDBENywgMHgwMEY3LCAweEZGMUQsIDB4MjI2MCwgMHhGRjFDLCAweEZGMUUsIDB4MjI2NiwKKyAgICAweDIyNjcsIDB4MjIxRSwgMHgyMjM0LCAweDI2NDIsIDB4MjY0MCwgMHgwMEIwLCAweDIwMzIsIDB4MjAzMywgMHgyMTAzLAorICAgIDB4RkZFNSwgMHhGRjA0LCAweDAwQTIsIDB4MDBBMywgMHhGRjA1LCAweEZGMDMsIDB4RkYwNiwgMHhGRjBBLCAweEZGMjAsCisgICAgMHgwMEE3LCAweDI2MDYsIDB4MjYwNSwgMHgyNUNCLCAweDI1Q0YsIDB4MjVDRSwgMHgyNUM3LCAweDI1QzYsIDB4MjVBMSwKKyAgICAweDI1QTAsIDB4MjVCMywgMHgyNUIyLCAweDI1QkQsIDB4MjVCQywgMHgyMDNCLCAweDMwMTIsIDB4MjE5MiwgMHgyMTkwLAorICAgIDB4MjE5MSwgMHgyMTkzLCAweDMwMTMsIDB4MjIwOCwgMHgyMjBCLCAweDIyODYsIDB4MjI4NywgMHgyMjgyLCAweDIyODMsCisgICAgMHgyMjJBLCAweDIyMjksIDB4MjIyNywgMHgyMjI4LCAweDAwQUMsIDB4MjFEMiwgMHgyMUQ0LCAweDIyMDAsIDB4MjIwMywKKyAgICAweDIyMjAsIDB4MjJBNSwgMHgyMzEyLCAweDIyMDIsIDB4MjIwNywgMHgyMjYxLCAweDIyNTIsIDB4MjI2QSwgMHgyMjZCLAorICAgIDB4MjIxQSwgMHgyMjNELCAweDIyMUQsIDB4MjIzNSwgMHgyMjJCLCAweDIyMkMsIDB4MjEyQiwgMHgyMDMwLCAweDI2NkYsCisgICAgMHgyNjZELCAweDI2NkEsIDB4MjAyMCwgMHgyMDIxLCAweDAwQjYsIDB4MjVFRiwgMHhGRjEwLCAweEZGMTEsIDB4RkYxMiwKKyAgICAweEZGMTMsIDB4RkYxNCwgMHhGRjE1LCAweEZGMTYsIDB4RkYxNywgMHhGRjE4LCAweEZGMTksIDB4RkYyMSwgMHhGRjIyLAorICAgIDB4RkYyMywgMHhGRjI0LCAweEZGMjUsIDB4RkYyNiwgMHhGRjI3LCAweEZGMjgsIDB4RkYyOSwgMHhGRjJBLCAweEZGMkIsCisgICAgMHhGRjJDLCAweEZGMkQsIDB4RkYyRSwgMHhGRjJGLCAweEZGMzAsIDB4RkYzMSwgMHhGRjMyLCAweEZGMzMsIDB4RkYzNCwKKyAgICAweEZGMzUsIDB4RkYzNiwgMHhGRjM3LCAweEZGMzgsIDB4RkYzOSwgMHhGRjNBLCAweEZGNDEsIDB4RkY0MiwgMHhGRjQzLAorICAgIDB4RkY0NCwgMHhGRjQ1LCAweEZGNDYsIDB4RkY0NywgMHhGRjQ4LCAweEZGNDksIDB4RkY0QSwgMHhGRjRCLCAweEZGNEMsCisgICAgMHhGRjRELCAweEZGNEUsIDB4RkY0RiwgMHhGRjUwLCAweEZGNTEsIDB4RkY1MiwgMHhGRjUzLCAweEZGNTQsIDB4RkY1NSwKKyAgICAweEZGNTYsIDB4RkY1NywgMHhGRjU4LCAweEZGNTksIDB4RkY1QSwgMHgzMDQxLCAweDMwNDIsIDB4MzA0MywgMHgzMDQ0LAorICAgIDB4MzA0NSwgMHgzMDQ2LCAweDMwNDcsIDB4MzA0OCwgMHgzMDQ5LCAweDMwNEEsIDB4MzA0QiwgMHgzMDRDLCAweDMwNEQsCisgICAgMHgzMDRFLCAweDMwNEYsIDB4MzA1MCwgMHgzMDUxLCAweDMwNTIsIDB4MzA1MywgMHgzMDU0LCAweDMwNTUsIDB4MzA1NiwKKyAgICAweDMwNTcsIDB4MzA1OCwgMHgzMDU5LCAweDMwNUEsIDB4MzA1QiwgMHgzMDVDLCAweDMwNUQsIDB4MzA1RSwgMHgzMDVGLAorICAgIDB4MzA2MCwgMHgzMDYxLCAweDMwNjIsIDB4MzA2MywgMHgzMDY0LCAweDMwNjUsIDB4MzA2NiwgMHgzMDY3LCAweDMwNjgsCisgICAgMHgzMDY5LCAweDMwNkEsIDB4MzA2QiwgMHgzMDZDLCAweDMwNkQsIDB4MzA2RSwgMHgzMDZGLCAweDMwNzAsIDB4MzA3MSwKKyAgICAweDMwNzIsIDB4MzA3MywgMHgzMDc0LCAweDMwNzUsIDB4MzA3NiwgMHgzMDc3LCAweDMwNzgsIDB4MzA3OSwgMHgzMDdBLAorICAgIDB4MzA3QiwgMHgzMDdDLCAweDMwN0QsIDB4MzA3RSwgMHgzMDdGLCAweDMwODAsIDB4MzA4MSwgMHgzMDgyLCAweDMwODMsCisgICAgMHgzMDg0LCAweDMwODUsIDB4MzA4NiwgMHgzMDg3LCAweDMwODgsIDB4MzA4OSwgMHgzMDhBLCAweDMwOEIsIDB4MzA4QywKKyAgICAweDMwOEQsIDB4MzA4RSwgMHgzMDhGLCAweDMwOTAsIDB4MzA5MSwgMHgzMDkyLCAweDMwOTMsIDB4MzBBMSwgMHgzMEEyLAorICAgIDB4MzBBMywgMHgzMEE0LCAweDMwQTUsIDB4MzBBNiwgMHgzMEE3LCAweDMwQTgsIDB4MzBBOSwgMHgzMEFBLCAweDMwQUIsCisgICAgMHgzMEFDLCAweDMwQUQsIDB4MzBBRSwgMHgzMEFGLCAweDMwQjAsIDB4MzBCMSwgMHgzMEIyLCAweDMwQjMsIDB4MzBCNCwKKyAgICAweDMwQjUsIDB4MzBCNiwgMHgzMEI3LCAweDMwQjgsIDB4MzBCOSwgMHgzMEJBLCAweDMwQkIsIDB4MzBCQywgMHgzMEJELAorICAgIDB4MzBCRSwgMHgzMEJGLCAweDMwQzAsIDB4MzBDMSwgMHgzMEMyLCAweDMwQzMsIDB4MzBDNCwgMHgzMEM1LCAweDMwQzYsCisgICAgMHgzMEM3LCAweDMwQzgsIDB4MzBDOSwgMHgzMENBLCAweDMwQ0IsIDB4MzBDQywgMHgzMENELCAweDMwQ0UsIDB4MzBDRiwKKyAgICAweDMwRDAsIDB4MzBEMSwgMHgzMEQyLCAweDMwRDMsIDB4MzBENCwgMHgzMEQ1LCAweDMwRDYsIDB4MzBENywgMHgzMEQ4LAorICAgIDB4MzBEOSwgMHgzMERBLCAweDMwREIsIDB4MzBEQywgMHgzMERELCAweDMwREUsIDB4MzBERiwgMHgzMEUwLCAweDMwRTEsCisgICAgMHgzMEUyLCAweDMwRTMsIDB4MzBFNCwgMHgzMEU1LCAweDMwRTYsIDB4MzBFNywgMHgzMEU4LCAweDMwRTksIDB4MzBFQSwKKyAgICAweDMwRUIsIDB4MzBFQywgMHgzMEVELCAweDMwRUUsIDB4MzBFRiwgMHgzMEYwLCAweDMwRjEsIDB4MzBGMiwgMHgzMEYzLAorICAgIDB4MzBGNCwgMHgzMEY1LCAweDMwRjYsIDB4MDM5MSwgMHgwMzkyLCAweDAzOTMsIDB4MDM5NCwgMHgwMzk1LCAweDAzOTYsCisgICAgMHgwMzk3LCAweDAzOTgsIDB4MDM5OSwgMHgwMzlBLCAweDAzOUIsIDB4MDM5QywgMHgwMzlELCAweDAzOUUsIDB4MDM5RiwKKyAgICAweDAzQTAsIDB4MDNBMSwgMHgwM0EzLCAweDAzQTQsIDB4MDNBNSwgMHgwM0E2LCAweDAzQTcsIDB4MDNBOCwgMHgwM0E5LAorICAgIDB4MDNCMSwgMHgwM0IyLCAweDAzQjMsIDB4MDNCNCwgMHgwM0I1LCAweDAzQjYsIDB4MDNCNywgMHgwM0I4LCAweDAzQjksCisgICAgMHgwM0JBLCAweDAzQkIsIDB4MDNCQywgMHgwM0JELCAweDAzQkUsIDB4MDNCRiwgMHgwM0MwLCAweDAzQzEsIDB4MDNDMywKKyAgICAweDAzQzQsIDB4MDNDNSwgMHgwM0M2LCAweDAzQzcsIDB4MDNDOCwgMHgwM0M5LCAweDA0MTAsIDB4MDQxMSwgMHgwNDEyLAorICAgIDB4MDQxMywgMHgwNDE0LCAweDA0MTUsIDB4MDQwMSwgMHgwNDE2LCAweDA0MTcsIDB4MDQxOCwgMHgwNDE5LCAweDA0MUEsCisgICAgMHgwNDFCLCAweDA0MUMsIDB4MDQxRCwgMHgwNDFFLCAweDA0MUYsIDB4MDQyMCwgMHgwNDIxLCAweDA0MjIsIDB4MDQyMywKKyAgICAweDA0MjQsIDB4MDQyNSwgMHgwNDI2LCAweDA0MjcsIDB4MDQyOCwgMHgwNDI5LCAweDA0MkEsIDB4MDQyQiwgMHgwNDJDLAorICAgIDB4MDQyRCwgMHgwNDJFLCAweDA0MkYsIDB4MDQzMCwgMHgwNDMxLCAweDA0MzIsIDB4MDQzMywgMHgwNDM0LCAweDA0MzUsCisgICAgMHgwNDUxLCAweDA0MzYsIDB4MDQzNywgMHgwNDM4LCAweDA0MzksIDB4MDQzQSwgMHgwNDNCLCAweDA0M0MsIDB4MDQzRCwKKyAgICAweDA0M0UsIDB4MDQzRiwgMHgwNDQwLCAweDA0NDEsIDB4MDQ0MiwgMHgwNDQzLCAweDA0NDQsIDB4MDQ0NSwgMHgwNDQ2LAorICAgIDB4MDQ0NywgMHgwNDQ4LCAweDA0NDksIDB4MDQ0QSwgMHgwNDRCLCAweDA0NEMsIDB4MDQ0RCwgMHgwNDRFLCAweDA0NEYsCisgICAgMHg0RTlDLCAweDU1MTYsIDB4NUEwMywgMHg5NjNGLCAweDU0QzAsIDB4NjExQiwgMHg2MzI4LCAweDU5RjYsIDB4OTAyMiwKKyAgICAweDg0NzUsIDB4ODMxQywgMHg3QTUwLCAweDYwQUEsIDB4NjNFMSwgMHg2RTI1LCAweDY1RUQsIDB4ODQ2NiwgMHg4MkE2LAorICAgIDB4OUJGNSwgMHg2ODkzLCAweDU3MjcsIDB4NjVBMSwgMHg2MjcxLCAweDVCOUIsIDB4NTlEMCwgMHg4NjdCLCAweDk4RjQsCisgICAgMHg3RDYyLCAweDdEQkUsIDB4OUI4RSwgMHg2MjE2LCAweDdDOUYsIDB4ODhCNywgMHg1Qjg5LCAweDVFQjUsIDB4NjMwOSwKKyAgICAweDY2OTcsIDB4Njg0OCwgMHg5NUM3LCAweDk3OEQsIDB4Njc0RiwgMHg0RUU1LCAweDRGMEEsIDB4NEY0RCwgMHg0RjlELAorICAgIDB4NTA0OSwgMHg1NkYyLCAweDU5MzcsIDB4NTlENCwgMHg1QTAxLCAweDVDMDksIDB4NjBERiwgMHg2MTBGLCAweDYxNzAsCisgICAgMHg2NjEzLCAweDY5MDUsIDB4NzBCQSwgMHg3NTRGLCAweDc1NzAsIDB4NzlGQiwgMHg3REFELCAweDdERUYsIDB4ODBDMywKKyAgICAweDg0MEUsIDB4ODg2MywgMHg4QjAyLCAweDkwNTUsIDB4OTA3QSwgMHg1MzNCLCAweDRFOTUsIDB4NEVBNSwgMHg1N0RGLAorICAgIDB4ODBCMiwgMHg5MEMxLCAweDc4RUYsIDB4NEUwMCwgMHg1OEYxLCAweDZFQTIsIDB4OTAzOCwgMHg3QTMyLCAweDgzMjgsCisgICAgMHg4MjhCLCAweDlDMkYsIDB4NTE0MSwgMHg1MzcwLCAweDU0QkQsIDB4NTRFMSwgMHg1NkUwLCAweDU5RkIsIDB4NUYxNSwKKyAgICAweDk4RjIsIDB4NkRFQiwgMHg4MEU0LCAweDg1MkQsIDB4OTY2MiwgMHg5NjcwLCAweDk2QTAsIDB4OTdGQiwgMHg1NDBCLAorICAgIDB4NTNGMywgMHg1Qjg3LCAweDcwQ0YsIDB4N0ZCRCwgMHg4RkMyLCAweDk2RTgsIDB4NTM2RiwgMHg5RDVDLCAweDdBQkEsCisgICAgMHg0RTExLCAweDc4OTMsIDB4ODFGQywgMHg2RTI2LCAweDU2MTgsIDB4NTUwNCwgMHg2QjFELCAweDg1MUEsIDB4OUMzQiwKKyAgICAweDU5RTUsIDB4NTNBOSwgMHg2RDY2LCAweDc0REMsIDB4OTU4RiwgMHg1NjQyLCAweDRFOTEsIDB4OTA0QiwgMHg5NkYyLAorICAgIDB4ODM0RiwgMHg5OTBDLCAweDUzRTEsIDB4NTVCNiwgMHg1QjMwLCAweDVGNzEsIDB4NjYyMCwgMHg2NkYzLCAweDY4MDQsCisgICAgMHg2QzM4LCAweDZDRjMsIDB4NkQyOSwgMHg3NDVCLCAweDc2QzgsIDB4N0E0RSwgMHg5ODM0LCAweDgyRjEsIDB4ODg1QiwKKyAgICAweDhBNjAsIDB4OTJFRCwgMHg2REIyLCAweDc1QUIsIDB4NzZDQSwgMHg5OUM1LCAweDYwQTYsIDB4OEIwMSwgMHg4RDhBLAorICAgIDB4OTVCMiwgMHg2OThFLCAweDUzQUQsIDB4NTE4NiwgMHg1NzEyLCAweDU4MzAsIDB4NTk0NCwgMHg1QkI0LCAweDVFRjYsCisgICAgMHg2MDI4LCAweDYzQTksIDB4NjNGNCwgMHg2Q0JGLCAweDZGMTQsIDB4NzA4RSwgMHg3MTE0LCAweDcxNTksIDB4NzFENSwKKyAgICAweDczM0YsIDB4N0UwMSwgMHg4Mjc2LCAweDgyRDEsIDB4ODU5NywgMHg5MDYwLCAweDkyNUIsIDB4OUQxQiwgMHg1ODY5LAorICAgIDB4NjVCQywgMHg2QzVBLCAweDc1MjUsIDB4NTFGOSwgMHg1OTJFLCAweDU5NjUsIDB4NUY4MCwgMHg1RkRDLCAweDYyQkMsCisgICAgMHg2NUZBLCAweDZBMkEsIDB4NkIyNywgMHg2QkI0LCAweDczOEIsIDB4N0ZDMSwgMHg4OTU2LCAweDlEMkMsIDB4OUQwRSwKKyAgICAweDlFQzQsIDB4NUNBMSwgMHg2Qzk2LCAweDgzN0IsIDB4NTEwNCwgMHg1QzRCLCAweDYxQjYsIDB4ODFDNiwgMHg2ODc2LAorICAgIDB4NzI2MSwgMHg0RTU5LCAweDRGRkEsIDB4NTM3OCwgMHg2MDY5LCAweDZFMjksIDB4N0E0RiwgMHg5N0YzLCAweDRFMEIsCisgICAgMHg1MzE2LCAweDRFRUUsIDB4NEY1NSwgMHg0RjNELCAweDRGQTEsIDB4NEY3MywgMHg1MkEwLCAweDUzRUYsIDB4NTYwOSwKKyAgICAweDU5MEYsIDB4NUFDMSwgMHg1QkI2LCAweDVCRTEsIDB4NzlEMSwgMHg2Njg3LCAweDY3OUMsIDB4NjdCNiwgMHg2QjRDLAorICAgIDB4NkNCMywgMHg3MDZCLCAweDczQzIsIDB4Nzk4RCwgMHg3OUJFLCAweDdBM0MsIDB4N0I4NywgMHg4MkIxLCAweDgyREIsCisgICAgMHg4MzA0LCAweDgzNzcsIDB4ODNFRiwgMHg4M0QzLCAweDg3NjYsIDB4OEFCMiwgMHg1NjI5LCAweDhDQTgsIDB4OEZFNiwKKyAgICAweDkwNEUsIDB4OTcxRSwgMHg4NjhBLCAweDRGQzQsIDB4NUNFOCwgMHg2MjExLCAweDcyNTksIDB4NzUzQiwgMHg4MUU1LAorICAgIDB4ODJCRCwgMHg4NkZFLCAweDhDQzAsIDB4OTZDNSwgMHg5OTEzLCAweDk5RDUsIDB4NEVDQiwgMHg0RjFBLCAweDg5RTMsCisgICAgMHg1NkRFLCAweDU4NEEsIDB4NThDQSwgMHg1RUZCLCAweDVGRUIsIDB4NjAyQSwgMHg2MDk0LCAweDYwNjIsIDB4NjFEMCwKKyAgICAweDYyMTIsIDB4NjJEMCwgMHg2NTM5LCAweDlCNDEsIDB4NjY2NiwgMHg2OEIwLCAweDZENzcsIDB4NzA3MCwgMHg3NTRDLAorICAgIDB4NzY4NiwgMHg3RDc1LCAweDgyQTUsIDB4ODdGOSwgMHg5NThCLCAweDk2OEUsIDB4OEM5RCwgMHg1MUYxLCAweDUyQkUsCisgICAgMHg1OTE2LCAweDU0QjMsIDB4NUJCMywgMHg1RDE2LCAweDYxNjgsIDB4Njk4MiwgMHg2REFGLCAweDc4OEQsIDB4ODRDQiwKKyAgICAweDg4NTcsIDB4OEE3MiwgMHg5M0E3LCAweDlBQjgsIDB4NkQ2QywgMHg5OUE4LCAweDg2RDksIDB4NTdBMywgMHg2N0ZGLAorICAgIDB4ODZDRSwgMHg5MjBFLCAweDUyODMsIDB4NTY4NywgMHg1NDA0LCAweDVFRDMsIDB4NjJFMSwgMHg2NEI5LCAweDY4M0MsCisgICAgMHg2ODM4LCAweDZCQkIsIDB4NzM3MiwgMHg3OEJBLCAweDdBNkIsIDB4ODk5QSwgMHg4OUQyLCAweDhENkIsIDB4OEYwMywKKyAgICAweDkwRUQsIDB4OTVBMywgMHg5Njk0LCAweDk3NjksIDB4NUI2NiwgMHg1Q0IzLCAweDY5N0QsIDB4OTg0RCwgMHg5ODRFLAorICAgIDB4NjM5QiwgMHg3QjIwLCAweDZBMkIsIDB4NkE3RiwgMHg2OEI2LCAweDlDMEQsIDB4NkY1RiwgMHg1MjcyLCAweDU1OUQsCisgICAgMHg2MDcwLCAweDYyRUMsIDB4NkQzQiwgMHg2RTA3LCAweDZFRDEsIDB4ODQ1QiwgMHg4OTEwLCAweDhGNDQsIDB4NEUxNCwKKyAgICAweDlDMzksIDB4NTNGNiwgMHg2OTFCLCAweDZBM0EsIDB4OTc4NCwgMHg2ODJBLCAweDUxNUMsIDB4N0FDMywgMHg4NEIyLAorICAgIDB4OTFEQywgMHg5MzhDLCAweDU2NUIsIDB4OUQyOCwgMHg2ODIyLCAweDgzMDUsIDB4ODQzMSwgMHg3Q0E1LCAweDUyMDgsCisgICAgMHg4MkM1LCAweDc0RTYsIDB4NEU3RSwgMHg0RjgzLCAweDUxQTAsIDB4NUJEMiwgMHg1MjBBLCAweDUyRDgsIDB4NTJFNywKKyAgICAweDVERkIsIDB4NTU5QSwgMHg1ODJBLCAweDU5RTYsIDB4NUI4QywgMHg1Qjk4LCAweDVCREIsIDB4NUU3MiwgMHg1RTc5LAorICAgIDB4NjBBMywgMHg2MTFGLCAweDYxNjMsIDB4NjFCRSwgMHg2M0RCLCAweDY1NjIsIDB4NjdEMSwgMHg2ODUzLCAweDY4RkEsCisgICAgMHg2QjNFLCAweDZCNTMsIDB4NkM1NywgMHg2RjIyLCAweDZGOTcsIDB4NkY0NSwgMHg3NEIwLCAweDc1MTgsIDB4NzZFMywKKyAgICAweDc3MEIsIDB4N0FGRiwgMHg3QkExLCAweDdDMjEsIDB4N0RFOSwgMHg3RjM2LCAweDdGRjAsIDB4ODA5RCwgMHg4MjY2LAorICAgIDB4ODM5RSwgMHg4OUIzLCAweDhBQ0MsIDB4OENBQiwgMHg5MDg0LCAweDk0NTEsIDB4OTU5MywgMHg5NTkxLCAweDk1QTIsCisgICAgMHg5NjY1LCAweDk3RDMsIDB4OTkyOCwgMHg4MjE4LCAweDRFMzgsIDB4NTQyQiwgMHg1Q0I4LCAweDVEQ0MsIDB4NzNBOSwKKyAgICAweDc2NEMsIDB4NzczQywgMHg1Q0E5LCAweDdGRUIsIDB4OEQwQiwgMHg5NkMxLCAweDk4MTEsIDB4OTg1NCwgMHg5ODU4LAorICAgIDB4NEYwMSwgMHg0RjBFLCAweDUzNzEsIDB4NTU5QywgMHg1NjY4LCAweDU3RkEsIDB4NTk0NywgMHg1QjA5LCAweDVCQzQsCisgICAgMHg1QzkwLCAweDVFMEMsIDB4NUU3RSwgMHg1RkNDLCAweDYzRUUsIDB4NjczQSwgMHg2NUQ3LCAweDY1RTIsIDB4NjcxRiwKKyAgICAweDY4Q0IsIDB4NjhDNCwgMHg2QTVGLCAweDVFMzAsIDB4NkJDNSwgMHg2QzE3LCAweDZDN0QsIDB4NzU3RiwgMHg3OTQ4LAorICAgIDB4NUI2MywgMHg3QTAwLCAweDdEMDAsIDB4NUZCRCwgMHg4OThGLCAweDhBMTgsIDB4OENCNCwgMHg4RDc3LCAweDhFQ0MsCisgICAgMHg4RjFELCAweDk4RTIsIDB4OUEwRSwgMHg5QjNDLCAweDRFODAsIDB4NTA3RCwgMHg1MTAwLCAweDU5OTMsIDB4NUI5QywKKyAgICAweDYyMkYsIDB4NjI4MCwgMHg2NEVDLCAweDZCM0EsIDB4NzJBMCwgMHg3NTkxLCAweDc5NDcsIDB4N0ZBOSwgMHg4N0ZCLAorICAgIDB4OEFCQywgMHg4QjcwLCAweDYzQUMsIDB4ODNDQSwgMHg5N0EwLCAweDU0MDksIDB4NTQwMywgMHg1NUFCLCAweDY4NTQsCisgICAgMHg2QTU4LCAweDhBNzAsIDB4NzgyNywgMHg2Nzc1LCAweDlFQ0QsIDB4NTM3NCwgMHg1QkEyLCAweDgxMUEsIDB4ODY1MCwKKyAgICAweDkwMDYsIDB4NEUxOCwgMHg0RTQ1LCAweDRFQzcsIDB4NEYxMSwgMHg1M0NBLCAweDU0MzgsIDB4NUJBRSwgMHg1RjEzLAorICAgIDB4NjAyNSwgMHg2NTUxLCAweDY3M0QsIDB4NkM0MiwgMHg2QzcyLCAweDZDRTMsIDB4NzA3OCwgMHg3NDAzLCAweDdBNzYsCisgICAgMHg3QUFFLCAweDdCMDgsIDB4N0QxQSwgMHg3Q0ZFLCAweDdENjYsIDB4NjVFNywgMHg3MjVCLCAweDUzQkIsIDB4NUM0NSwKKyAgICAweDVERTgsIDB4NjJEMiwgMHg2MkUwLCAweDYzMTksIDB4NkUyMCwgMHg4NjVBLCAweDhBMzEsIDB4OERERCwgMHg5MkY4LAorICAgIDB4NkYwMSwgMHg3OUE2LCAweDlCNUEsIDB4NEVBOCwgMHg0RUFCLCAweDRFQUMsIDB4NEY5QiwgMHg0RkEwLCAweDUwRDEsCisgICAgMHg1MTQ3LCAweDdBRjYsIDB4NTE3MSwgMHg1MUY2LCAweDUzNTQsIDB4NTMyMSwgMHg1MzdGLCAweDUzRUIsIDB4NTVBQywKKyAgICAweDU4ODMsIDB4NUNFMSwgMHg1RjM3LCAweDVGNEEsIDB4NjAyRiwgMHg2MDUwLCAweDYwNkQsIDB4NjMxRiwgMHg2NTU5LAorICAgIDB4NkE0QiwgMHg2Q0MxLCAweDcyQzIsIDB4NzJFRCwgMHg3N0VGLCAweDgwRjgsIDB4ODEwNSwgMHg4MjA4LCAweDg1NEUsCisgICAgMHg5MEY3LCAweDkzRTEsIDB4OTdGRiwgMHg5OTU3LCAweDlBNUEsIDB4NEVGMCwgMHg1MURELCAweDVDMkQsIDB4NjY4MSwKKyAgICAweDY5NkQsIDB4NUM0MCwgMHg2NkYyLCAweDY5NzUsIDB4NzM4OSwgMHg2ODUwLCAweDdDODEsIDB4NTBDNSwgMHg1MkU0LAorICAgIDB4NTc0NywgMHg1REZFLCAweDkzMjYsIDB4NjVBNCwgMHg2QjIzLCAweDZCM0QsIDB4NzQzNCwgMHg3OTgxLCAweDc5QkQsCisgICAgMHg3QjRCLCAweDdEQ0EsIDB4ODJCOSwgMHg4M0NDLCAweDg4N0YsIDB4ODk1RiwgMHg4QjM5LCAweDhGRDEsIDB4OTFEMSwKKyAgICAweDU0MUYsIDB4OTI4MCwgMHg0RTVELCAweDUwMzYsIDB4NTNFNSwgMHg1MzNBLCAweDcyRDcsIDB4NzM5NiwgMHg3N0U5LAorICAgIDB4ODJFNiwgMHg4RUFGLCAweDk5QzYsIDB4OTlDOCwgMHg5OUQyLCAweDUxNzcsIDB4NjExQSwgMHg4NjVFLCAweDU1QjAsCisgICAgMHg3QTdBLCAweDUwNzYsIDB4NUJEMywgMHg5MDQ3LCAweDk2ODUsIDB4NEUzMiwgMHg2QURCLCAweDkxRTcsIDB4NUM1MSwKKyAgICAweDVDNDgsIDB4NjM5OCwgMHg3QTlGLCAweDZDOTMsIDB4OTc3NCwgMHg4RjYxLCAweDdBQUEsIDB4NzE4QSwgMHg5Njg4LAorICAgIDB4N0M4MiwgMHg2ODE3LCAweDdFNzAsIDB4Njg1MSwgMHg5MzZDLCAweDUyRjIsIDB4NTQxQiwgMHg4NUFCLCAweDhBMTMsCisgICAgMHg3RkE0LCAweDhFQ0QsIDB4OTBFMSwgMHg1MzY2LCAweDg4ODgsIDB4Nzk0MSwgMHg0RkMyLCAweDUwQkUsIDB4NTIxMSwKKyAgICAweDUxNDQsIDB4NTU1MywgMHg1NzJELCAweDczRUEsIDB4NTc4QiwgMHg1OTUxLCAweDVGNjIsIDB4NUY4NCwgMHg2MDc1LAorICAgIDB4NjE3NiwgMHg2MTY3LCAweDYxQTksIDB4NjNCMiwgMHg2NDNBLCAweDY1NkMsIDB4NjY2RiwgMHg2ODQyLCAweDZFMTMsCisgICAgMHg3NTY2LCAweDdBM0QsIDB4N0NGQiwgMHg3RDRDLCAweDdEOTksIDB4N0U0QiwgMHg3RjZCLCAweDgzMEUsIDB4ODM0QSwKKyAgICAweDg2Q0QsIDB4OEEwOCwgMHg4QTYzLCAweDhCNjYsIDB4OEVGRCwgMHg5ODFBLCAweDlEOEYsIDB4ODJCOCwgMHg4RkNFLAorICAgIDB4OUJFOCwgMHg1Mjg3LCAweDYyMUYsIDB4NjQ4MywgMHg2RkMwLCAweDk2OTksIDB4Njg0MSwgMHg1MDkxLCAweDZCMjAsCisgICAgMHg2QzdBLCAweDZGNTQsIDB4N0E3NCwgMHg3RDUwLCAweDg4NDAsIDB4OEEyMywgMHg2NzA4LCAweDRFRjYsIDB4NTAzOSwKKyAgICAweDUwMjYsIDB4NTA2NSwgMHg1MTdDLCAweDUyMzgsIDB4NTI2MywgMHg1NUE3LCAweDU3MEYsIDB4NTgwNSwgMHg1QUNDLAorICAgIDB4NUVGQSwgMHg2MUIyLCAweDYxRjgsIDB4NjJGMywgMHg2MzcyLCAweDY5MUMsIDB4NkEyOSwgMHg3MjdELCAweDcyQUMsCisgICAgMHg3MzJFLCAweDc4MTQsIDB4Nzg2RiwgMHg3RDc5LCAweDc3MEMsIDB4ODBBOSwgMHg4OThCLCAweDhCMTksIDB4OENFMiwKKyAgICAweDhFRDIsIDB4OTA2MywgMHg5Mzc1LCAweDk2N0EsIDB4OTg1NSwgMHg5QTEzLCAweDlFNzgsIDB4NTE0MywgMHg1MzlGLAorICAgIDB4NTNCMywgMHg1RTdCLCAweDVGMjYsIDB4NkUxQiwgMHg2RTkwLCAweDczODQsIDB4NzNGRSwgMHg3RDQzLCAweDgyMzcsCisgICAgMHg4QTAwLCAweDhBRkEsIDB4OTY1MCwgMHg0RTRFLCAweDUwMEIsIDB4NTNFNCwgMHg1NDdDLCAweDU2RkEsIDB4NTlEMSwKKyAgICAweDVCNjQsIDB4NURGMSwgMHg1RUFCLCAweDVGMjcsIDB4NjIzOCwgMHg2NTQ1LCAweDY3QUYsIDB4NkU1NiwgMHg3MkQwLAorICAgIDB4N0NDQSwgMHg4OEI0LCAweDgwQTEsIDB4ODBFMSwgMHg4M0YwLCAweDg2NEUsIDB4OEE4NywgMHg4REU4LCAweDkyMzcsCisgICAgMHg5NkM3LCAweDk4NjcsIDB4OUYxMywgMHg0RTk0LCAweDRFOTIsIDB4NEYwRCwgMHg1MzQ4LCAweDU0NDksIDB4NTQzRSwKKyAgICAweDVBMkYsIDB4NUY4QywgMHg1RkExLCAweDYwOUYsIDB4NjhBNywgMHg2QThFLCAweDc0NUEsIDB4Nzg4MSwgMHg4QTlFLAorICAgIDB4OEFBNCwgMHg4Qjc3LCAweDkxOTAsIDB4NEU1RSwgMHg5QkM5LCAweDRFQTQsIDB4NEY3QywgMHg0RkFGLCAweDUwMTksCisgICAgMHg1MDE2LCAweDUxNDksIDB4NTE2QywgMHg1MjlGLCAweDUyQjksIDB4NTJGRSwgMHg1MzlBLCAweDUzRTMsIDB4NTQxMSwKKyAgICAweDU0MEUsIDB4NTU4OSwgMHg1NzUxLCAweDU3QTIsIDB4NTk3RCwgMHg1QjU0LCAweDVCNUQsIDB4NUI4RiwgMHg1REU1LAorICAgIDB4NURFNywgMHg1REY3LCAweDVFNzgsIDB4NUU4MywgMHg1RTlBLCAweDVFQjcsIDB4NUYxOCwgMHg2MDUyLCAweDYxNEMsCisgICAgMHg2Mjk3LCAweDYyRDgsIDB4NjNBNywgMHg2NTNCLCAweDY2MDIsIDB4NjY0MywgMHg2NkY0LCAweDY3NkQsIDB4NjgyMSwKKyAgICAweDY4OTcsIDB4NjlDQiwgMHg2QzVGLCAweDZEMkEsIDB4NkQ2OSwgMHg2RTJGLCAweDZFOUQsIDB4NzUzMiwgMHg3Njg3LAorICAgIDB4Nzg2QywgMHg3QTNGLCAweDdDRTAsIDB4N0QwNSwgMHg3RDE4LCAweDdENUUsIDB4N0RCMSwgMHg4MDE1LCAweDgwMDMsCisgICAgMHg4MEFGLCAweDgwQjEsIDB4ODE1NCwgMHg4MThGLCAweDgyMkEsIDB4ODM1MiwgMHg4ODRDLCAweDg4NjEsIDB4OEIxQiwKKyAgICAweDhDQTIsIDB4OENGQywgMHg5MENBLCAweDkxNzUsIDB4OTI3MSwgMHg3ODNGLCAweDkyRkMsIDB4OTVBNCwgMHg5NjRELAorICAgIDB4OTgwNSwgMHg5OTk5LCAweDlBRDgsIDB4OUQzQiwgMHg1MjVCLCAweDUyQUIsIDB4NTNGNywgMHg1NDA4LCAweDU4RDUsCisgICAgMHg2MkY3LCAweDZGRTAsIDB4OEM2QSwgMHg4RjVGLCAweDlFQjksIDB4NTE0QiwgMHg1MjNCLCAweDU0NEEsIDB4NTZGRCwKKyAgICAweDdBNDAsIDB4OTE3NywgMHg5RDYwLCAweDlFRDIsIDB4NzM0NCwgMHg2RjA5LCAweDgxNzAsIDB4NzUxMSwgMHg1RkZELAorICAgIDB4NjBEQSwgMHg5QUE4LCAweDcyREIsIDB4OEZCQywgMHg2QjY0LCAweDk4MDMsIDB4NEVDQSwgMHg1NkYwLCAweDU3NjQsCisgICAgMHg1OEJFLCAweDVBNUEsIDB4NjA2OCwgMHg2MUM3LCAweDY2MEYsIDB4NjYwNiwgMHg2ODM5LCAweDY4QjEsIDB4NkRGNywKKyAgICAweDc1RDUsIDB4N0QzQSwgMHg4MjZFLCAweDlCNDIsIDB4NEU5QiwgMHg0RjUwLCAweDUzQzksIDB4NTUwNiwgMHg1RDZGLAorICAgIDB4NURFNiwgMHg1REVFLCAweDY3RkIsIDB4NkM5OSwgMHg3NDczLCAweDc4MDIsIDB4OEE1MCwgMHg5Mzk2LCAweDg4REYsCisgICAgMHg1NzUwLCAweDVFQTcsIDB4NjMyQiwgMHg1MEI1LCAweDUwQUMsIDB4NTE4RCwgMHg2NzAwLCAweDU0QzksIDB4NTg1RSwKKyAgICAweDU5QkIsIDB4NUJCMCwgMHg1RjY5LCAweDYyNEQsIDB4NjNBMSwgMHg2ODNELCAweDZCNzMsIDB4NkUwOCwgMHg3MDdELAorICAgIDB4OTFDNywgMHg3MjgwLCAweDc4MTUsIDB4NzgyNiwgMHg3OTZELCAweDY1OEUsIDB4N0QzMCwgMHg4M0RDLCAweDg4QzEsCisgICAgMHg4RjA5LCAweDk2OUIsIDB4NTI2NCwgMHg1NzI4LCAweDY3NTAsIDB4N0Y2QSwgMHg4Q0ExLCAweDUxQjQsIDB4NTc0MiwKKyAgICAweDk2MkEsIDB4NTgzQSwgMHg2OThBLCAweDgwQjQsIDB4NTRCMiwgMHg1RDBFLCAweDU3RkMsIDB4Nzg5NSwgMHg5REZBLAorICAgIDB4NEY1QywgMHg1MjRBLCAweDU0OEIsIDB4NjQzRSwgMHg2NjI4LCAweDY3MTQsIDB4NjdGNSwgMHg3QTg0LCAweDdCNTYsCisgICAgMHg3RDIyLCAweDkzMkYsIDB4Njg1QywgMHg5QkFELCAweDdCMzksIDB4NTMxOSwgMHg1MThBLCAweDUyMzcsIDB4NUJERiwKKyAgICAweDYyRjYsIDB4NjRBRSwgMHg2NEU2LCAweDY3MkQsIDB4NkJCQSwgMHg4NUE5LCAweDk2RDEsIDB4NzY5MCwgMHg5QkQ2LAorICAgIDB4NjM0QywgMHg5MzA2LCAweDlCQUIsIDB4NzZCRiwgMHg2NjUyLCAweDRFMDksIDB4NTA5OCwgMHg1M0MyLCAweDVDNzEsCisgICAgMHg2MEU4LCAweDY0OTIsIDB4NjU2MywgMHg2ODVGLCAweDcxRTYsIDB4NzNDQSwgMHg3NTIzLCAweDdCOTcsIDB4N0U4MiwKKyAgICAweDg2OTUsIDB4OEI4MywgMHg4Q0RCLCAweDkxNzgsIDB4OTkxMCwgMHg2NUFDLCAweDY2QUIsIDB4NkI4QiwgMHg0RUQ1LAorICAgIDB4NEVENCwgMHg0RjNBLCAweDRGN0YsIDB4NTIzQSwgMHg1M0Y4LCAweDUzRjIsIDB4NTVFMywgMHg1NkRCLCAweDU4RUIsCisgICAgMHg1OUNCLCAweDU5QzksIDB4NTlGRiwgMHg1QjUwLCAweDVDNEQsIDB4NUUwMiwgMHg1RTJCLCAweDVGRDcsIDB4NjAxRCwKKyAgICAweDYzMDcsIDB4NjUyRiwgMHg1QjVDLCAweDY1QUYsIDB4NjVCRCwgMHg2NUU4LCAweDY3OUQsIDB4NkI2MiwgMHg2QjdCLAorICAgIDB4NkMwRiwgMHg3MzQ1LCAweDc5NDksIDB4NzlDMSwgMHg3Q0Y4LCAweDdEMTksIDB4N0QyQiwgMHg4MEEyLCAweDgxMDIsCisgICAgMHg4MUYzLCAweDg5OTYsIDB4OEE1RSwgMHg4QTY5LCAweDhBNjYsIDB4OEE4QywgMHg4QUVFLCAweDhDQzcsIDB4OENEQywKKyAgICAweDk2Q0MsIDB4OThGQywgMHg2QjZGLCAweDRFOEIsIDB4NEYzQywgMHg0RjhELCAweDUxNTAsIDB4NUI1NywgMHg1QkZBLAorICAgIDB4NjE0OCwgMHg2MzAxLCAweDY2NDIsIDB4NkIyMSwgMHg2RUNCLCAweDZDQkIsIDB4NzIzRSwgMHg3NEJELCAweDc1RDQsCisgICAgMHg3OEMxLCAweDc5M0EsIDB4ODAwQywgMHg4MDMzLCAweDgxRUEsIDB4ODQ5NCwgMHg4RjlFLCAweDZDNTAsIDB4OUU3RiwKKyAgICAweDVGMEYsIDB4OEI1OCwgMHg5RDJCLCAweDdBRkEsIDB4OEVGOCwgMHg1QjhELCAweDk2RUIsIDB4NEUwMywgMHg1M0YxLAorICAgIDB4NTdGNywgMHg1OTMxLCAweDVBQzksIDB4NUJBNCwgMHg2MDg5LCAweDZFN0YsIDB4NkYwNiwgMHg3NUJFLCAweDhDRUEsCisgICAgMHg1QjlGLCAweDg1MDAsIDB4N0JFMCwgMHg1MDcyLCAweDY3RjQsIDB4ODI5RCwgMHg1QzYxLCAweDg1NEEsIDB4N0UxRSwKKyAgICAweDgyMEUsIDB4NTE5OSwgMHg1QzA0LCAweDYzNjgsIDB4OEQ2NiwgMHg2NTlDLCAweDcxNkUsIDB4NzkzRSwgMHg3RDE3LAorICAgIDB4ODAwNSwgMHg4QjFELCAweDhFQ0EsIDB4OTA2RSwgMHg4NkM3LCAweDkwQUEsIDB4NTAxRiwgMHg1MkZBLCAweDVDM0EsCisgICAgMHg2NzUzLCAweDcwN0MsIDB4NzIzNSwgMHg5MTRDLCAweDkxQzgsIDB4OTMyQiwgMHg4MkU1LCAweDVCQzIsIDB4NUYzMSwKKyAgICAweDYwRjksIDB4NEUzQiwgMHg1M0Q2LCAweDVCODgsIDB4NjI0QiwgMHg2NzMxLCAweDZCOEEsIDB4NzJFOSwgMHg3M0UwLAorICAgIDB4N0EyRSwgMHg4MTZCLCAweDhEQTMsIDB4OTE1MiwgMHg5OTk2LCAweDUxMTIsIDB4NTNENywgMHg1NDZBLCAweDVCRkYsCisgICAgMHg2Mzg4LCAweDZBMzksIDB4N0RBQywgMHg5NzAwLCAweDU2REEsIDB4NTNDRSwgMHg1NDY4LCAweDVCOTcsIDB4NUMzMSwKKyAgICAweDVEREUsIDB4NEZFRSwgMHg2MTAxLCAweDYyRkUsIDB4NkQzMiwgMHg3OUMwLCAweDc5Q0IsIDB4N0Q0MiwgMHg3RTRELAorICAgIDB4N0ZEMiwgMHg4MUVELCAweDgyMUYsIDB4ODQ5MCwgMHg4ODQ2LCAweDg5NzIsIDB4OEI5MCwgMHg4RTc0LCAweDhGMkYsCisgICAgMHg5MDMxLCAweDkxNEIsIDB4OTE2QywgMHg5NkM2LCAweDkxOUMsIDB4NEVDMCwgMHg0RjRGLCAweDUxNDUsIDB4NTM0MSwKKyAgICAweDVGOTMsIDB4NjIwRSwgMHg2N0Q0LCAweDZDNDEsIDB4NkUwQiwgMHg3MzYzLCAweDdFMjYsIDB4OTFDRCwgMHg5MjgzLAorICAgIDB4NTNENCwgMHg1OTE5LCAweDVCQkYsIDB4NkREMSwgMHg3OTVELCAweDdFMkUsIDB4N0M5QiwgMHg1ODdFLCAweDcxOUYsCisgICAgMHg1MUZBLCAweDg4NTMsIDB4OEZGMCwgMHg0RkNBLCAweDVDRkIsIDB4NjYyNSwgMHg3N0FDLCAweDdBRTMsIDB4ODIxQywKKyAgICAweDk5RkYsIDB4NTFDNiwgMHg1RkFBLCAweDY1RUMsIDB4Njk2RiwgMHg2Qjg5LCAweDZERjMsIDB4NkU5NiwgMHg2RjY0LAorICAgIDB4NzZGRSwgMHg3RDE0LCAweDVERTEsIDB4OTA3NSwgMHg5MTg3LCAweDk4MDYsIDB4NTFFNiwgMHg1MjFELCAweDYyNDAsCisgICAgMHg2NjkxLCAweDY2RDksIDB4NkUxQSwgMHg1RUI2LCAweDdERDIsIDB4N0Y3MiwgMHg2NkY4LCAweDg1QUYsIDB4ODVGNywKKyAgICAweDhBRjgsIDB4NTJBOSwgMHg1M0Q5LCAweDU5NzMsIDB4NUU4RiwgMHg1RjkwLCAweDYwNTUsIDB4OTJFNCwgMHg5NjY0LAorICAgIDB4NTBCNywgMHg1MTFGLCAweDUyREQsIDB4NTMyMCwgMHg1MzQ3LCAweDUzRUMsIDB4NTRFOCwgMHg1NTQ2LCAweDU1MzEsCisgICAgMHg1NjE3LCAweDU5NjgsIDB4NTlCRSwgMHg1QTNDLCAweDVCQjUsIDB4NUMwNiwgMHg1QzBGLCAweDVDMTEsIDB4NUMxQSwKKyAgICAweDVFODQsIDB4NUU4QSwgMHg1RUUwLCAweDVGNzAsIDB4NjI3RiwgMHg2Mjg0LCAweDYyREIsIDB4NjM4QywgMHg2Mzc3LAorICAgIDB4NjYwNywgMHg2NjBDLCAweDY2MkQsIDB4NjY3NiwgMHg2NzdFLCAweDY4QTIsIDB4NkExRiwgMHg2QTM1LCAweDZDQkMsCisgICAgMHg2RDg4LCAweDZFMDksIDB4NkU1OCwgMHg3MTNDLCAweDcxMjYsIDB4NzE2NywgMHg3NUM3LCAweDc3MDEsIDB4Nzg1RCwKKyAgICAweDc5MDEsIDB4Nzk2NSwgMHg3OUYwLCAweDdBRTAsIDB4N0IxMSwgMHg3Q0E3LCAweDdEMzksIDB4ODA5NiwgMHg4M0Q2LAorICAgIDB4ODQ4QiwgMHg4NTQ5LCAweDg4NUQsIDB4ODhGMywgMHg4QTFGLCAweDhBM0MsIDB4OEE1NCwgMHg4QTczLCAweDhDNjEsCisgICAgMHg4Q0RFLCAweDkxQTQsIDB4OTI2NiwgMHg5MzdFLCAweDk0MTgsIDB4OTY5QywgMHg5Nzk4LCAweDRFMEEsIDB4NEUwOCwKKyAgICAweDRFMUUsIDB4NEU1NywgMHg1MTk3LCAweDUyNzAsIDB4NTdDRSwgMHg1ODM0LCAweDU4Q0MsIDB4NUIyMiwgMHg1RTM4LAorICAgIDB4NjBDNSwgMHg2NEZFLCAweDY3NjEsIDB4Njc1NiwgMHg2RDQ0LCAweDcyQjYsIDB4NzU3MywgMHg3QTYzLCAweDg0QjgsCisgICAgMHg4QjcyLCAweDkxQjgsIDB4OTMyMCwgMHg1NjMxLCAweDU3RjQsIDB4OThGRSwgMHg2MkVELCAweDY5MEQsIDB4NkI5NiwKKyAgICAweDcxRUQsIDB4N0U1NCwgMHg4MDc3LCAweDgyNzIsIDB4ODlFNiwgMHg5OERGLCAweDg3NTUsIDB4OEZCMSwgMHg1QzNCLAorICAgIDB4NEYzOCwgMHg0RkUxLCAweDRGQjUsIDB4NTUwNywgMHg1QTIwLCAweDVCREQsIDB4NUJFOSwgMHg1RkMzLCAweDYxNEUsCisgICAgMHg2MzJGLCAweDY1QjAsIDB4NjY0QiwgMHg2OEVFLCAweDY5OUIsIDB4NkQ3OCwgMHg2REYxLCAweDc1MzMsIDB4NzVCOSwKKyAgICAweDc3MUYsIDB4Nzk1RSwgMHg3OUU2LCAweDdEMzMsIDB4ODFFMywgMHg4MkFGLCAweDg1QUEsIDB4ODlBQSwgMHg4QTNBLAorICAgIDB4OEVBQiwgMHg4RjlCLCAweDkwMzIsIDB4OTFERCwgMHg5NzA3LCAweDRFQkEsIDB4NEVDMSwgMHg1MjAzLCAweDU4NzUsCisgICAgMHg1OEVDLCAweDVDMEIsIDB4NzUxQSwgMHg1QzNELCAweDgxNEUsIDB4OEEwQSwgMHg4RkM1LCAweDk2NjMsIDB4OTc2RCwKKyAgICAweDdCMjUsIDB4OEFDRiwgMHg5ODA4LCAweDkxNjIsIDB4NTZGMywgMHg1M0E4LCAweDkwMTcsIDB4NTQzOSwgMHg1NzgyLAorICAgIDB4NUUyNSwgMHg2M0E4LCAweDZDMzQsIDB4NzA4QSwgMHg3NzYxLCAweDdDOEIsIDB4N0ZFMCwgMHg4ODcwLCAweDkwNDIsCisgICAgMHg5MTU0LCAweDkzMTAsIDB4OTMxOCwgMHg5NjhGLCAweDc0NUUsIDB4OUFDNCwgMHg1RDA3LCAweDVENjksIDB4NjU3MCwKKyAgICAweDY3QTIsIDB4OERBOCwgMHg5NkRCLCAweDYzNkUsIDB4Njc0OSwgMHg2OTE5LCAweDgzQzUsIDB4OTgxNywgMHg5NkMwLAorICAgIDB4ODhGRSwgMHg2Rjg0LCAweDY0N0EsIDB4NUJGOCwgMHg0RTE2LCAweDcwMkMsIDB4NzU1RCwgMHg2NjJGLCAweDUxQzQsCisgICAgMHg1MjM2LCAweDUyRTIsIDB4NTlEMywgMHg1RjgxLCAweDYwMjcsIDB4NjIxMCwgMHg2NTNGLCAweDY1NzQsIDB4NjYxRiwKKyAgICAweDY2NzQsIDB4NjhGMiwgMHg2ODE2LCAweDZCNjMsIDB4NkUwNSwgMHg3MjcyLCAweDc1MUYsIDB4NzZEQiwgMHg3Q0JFLAorICAgIDB4ODA1NiwgMHg1OEYwLCAweDg4RkQsIDB4ODk3RiwgMHg4QUEwLCAweDhBOTMsIDB4OEFDQiwgMHg5MDFELCAweDkxOTIsCisgICAgMHg5NzUyLCAweDk3NTksIDB4NjU4OSwgMHg3QTBFLCAweDgxMDYsIDB4OTZCQiwgMHg1RTJELCAweDYwREMsIDB4NjIxQSwKKyAgICAweDY1QTUsIDB4NjYxNCwgMHg2NzkwLCAweDc3RjMsIDB4N0E0RCwgMHg3QzRELCAweDdFM0UsIDB4ODEwQSwgMHg4Q0FDLAorICAgIDB4OEQ2NCwgMHg4REUxLCAweDhFNUYsIDB4NzhBOSwgMHg1MjA3LCAweDYyRDksIDB4NjNBNSwgMHg2NDQyLCAweDYyOTgsCisgICAgMHg4QTJELCAweDdBODMsIDB4N0JDMCwgMHg4QUFDLCAweDk2RUEsIDB4N0Q3NiwgMHg4MjBDLCAweDg3NDksIDB4NEVEOSwKKyAgICAweDUxNDgsIDB4NTM0MywgMHg1MzYwLCAweDVCQTMsIDB4NUMwMiwgMHg1QzE2LCAweDVEREQsIDB4NjIyNiwgMHg2MjQ3LAorICAgIDB4NjRCMCwgMHg2ODEzLCAweDY4MzQsIDB4NkNDOSwgMHg2RDQ1LCAweDZEMTcsIDB4NjdEMywgMHg2RjVDLCAweDcxNEUsCisgICAgMHg3MTdELCAweDY1Q0IsIDB4N0E3RiwgMHg3QkFELCAweDdEREEsIDB4N0U0QSwgMHg3RkE4LCAweDgxN0EsIDB4ODIxQiwKKyAgICAweDgyMzksIDB4ODVBNiwgMHg4QTZFLCAweDhDQ0UsIDB4OERGNSwgMHg5MDc4LCAweDkwNzcsIDB4OTJBRCwgMHg5MjkxLAorICAgIDB4OTU4MywgMHg5QkFFLCAweDUyNEQsIDB4NTU4NCwgMHg2RjM4LCAweDcxMzYsIDB4NTE2OCwgMHg3OTg1LCAweDdFNTUsCisgICAgMHg4MUIzLCAweDdDQ0UsIDB4NTY0QywgMHg1ODUxLCAweDVDQTgsIDB4NjNBQSwgMHg2NkZFLCAweDY2RkQsIDB4Njk1QSwKKyAgICAweDcyRDksIDB4NzU4RiwgMHg3NThFLCAweDc5MEUsIDB4Nzk1NiwgMHg3OURGLCAweDdDOTcsIDB4N0QyMCwgMHg3RDQ0LAorICAgIDB4ODYwNywgMHg4QTM0LCAweDk2M0IsIDB4OTA2MSwgMHg5RjIwLCAweDUwRTcsIDB4NTI3NSwgMHg1M0NDLCAweDUzRTIsCisgICAgMHg1MDA5LCAweDU1QUEsIDB4NThFRSwgMHg1OTRGLCAweDcyM0QsIDB4NUI4QiwgMHg1QzY0LCAweDUzMUQsIDB4NjBFMywKKyAgICAweDYwRjMsIDB4NjM1QywgMHg2MzgzLCAweDYzM0YsIDB4NjNCQiwgMHg2NENELCAweDY1RTksIDB4NjZGOSwgMHg1REUzLAorICAgIDB4NjlDRCwgMHg2OUZELCAweDZGMTUsIDB4NzFFNSwgMHg0RTg5LCAweDc1RTksIDB4NzZGOCwgMHg3QTkzLCAweDdDREYsCisgICAgMHg3RENGLCAweDdEOUMsIDB4ODA2MSwgMHg4MzQ5LCAweDgzNTgsIDB4ODQ2QywgMHg4NEJDLCAweDg1RkIsIDB4ODhDNSwKKyAgICAweDhENzAsIDB4OTAwMSwgMHg5MDZELCAweDkzOTcsIDB4OTcxQywgMHg5QTEyLCAweDUwQ0YsIDB4NTg5NywgMHg2MThFLAorICAgIDB4ODFEMywgMHg4NTM1LCAweDhEMDgsIDB4OTAyMCwgMHg0RkMzLCAweDUwNzQsIDB4NTI0NywgMHg1MzczLCAweDYwNkYsCisgICAgMHg2MzQ5LCAweDY3NUYsIDB4NkUyQywgMHg4REIzLCAweDkwMUYsIDB4NEZENywgMHg1QzVFLCAweDhDQ0EsIDB4NjVDRiwKKyAgICAweDdEOUEsIDB4NTM1MiwgMHg4ODk2LCAweDUxNzYsIDB4NjNDMywgMHg1QjU4LCAweDVCNkIsIDB4NUMwQSwgMHg2NDBELAorICAgIDB4Njc1MSwgMHg5MDVDLCAweDRFRDYsIDB4NTkxQSwgMHg1OTJBLCAweDZDNzAsIDB4OEE1MSwgMHg1NTNFLCAweDU4MTUsCisgICAgMHg1OUE1LCAweDYwRjAsIDB4NjI1MywgMHg2N0MxLCAweDgyMzUsIDB4Njk1NSwgMHg5NjQwLCAweDk5QzQsIDB4OUEyOCwKKyAgICAweDRGNTMsIDB4NTgwNiwgMHg1QkZFLCAweDgwMTAsIDB4NUNCMSwgMHg1RTJGLCAweDVGODUsIDB4NjAyMCwgMHg2MTRCLAorICAgIDB4NjIzNCwgMHg2NkZGLCAweDZDRjAsIDB4NkVERSwgMHg4MENFLCAweDgxN0YsIDB4ODJENCwgMHg4ODhCLCAweDhDQjgsCisgICAgMHg5MDAwLCAweDkwMkUsIDB4OTY4QSwgMHg5RURCLCAweDlCREIsIDB4NEVFMywgMHg1M0YwLCAweDU5MjcsIDB4N0IyQywKKyAgICAweDkxOEQsIDB4OTg0QywgMHg5REY5LCAweDZFREQsIDB4NzAyNywgMHg1MzUzLCAweDU1NDQsIDB4NUI4NSwgMHg2MjU4LAorICAgIDB4NjI5RSwgMHg2MkQzLCAweDZDQTIsIDB4NkZFRiwgMHg3NDIyLCAweDhBMTcsIDB4OTQzOCwgMHg2RkMxLCAweDhBRkUsCisgICAgMHg4MzM4LCAweDUxRTcsIDB4ODZGOCwgMHg1M0VBLCAweDUzRTksIDB4NEY0NiwgMHg5MDU0LCAweDhGQjAsIDB4NTk2QSwKKyAgICAweDgxMzEsIDB4NURGRCwgMHg3QUVBLCAweDhGQkYsIDB4NjhEQSwgMHg4QzM3LCAweDcyRjgsIDB4OUM0OCwgMHg2QTNELAorICAgIDB4OEFCMCwgMHg0RTM5LCAweDUzNTgsIDB4NTYwNiwgMHg1NzY2LCAweDYyQzUsIDB4NjNBMiwgMHg2NUU2LCAweDZCNEUsCisgICAgMHg2REUxLCAweDZFNUIsIDB4NzBBRCwgMHg3N0VELCAweDdBRUYsIDB4N0JBQSwgMHg3REJCLCAweDgwM0QsIDB4ODBDNiwKKyAgICAweDg2Q0IsIDB4OEE5NSwgMHg5MzVCLCAweDU2RTMsIDB4NThDNywgMHg1RjNFLCAweDY1QUQsIDB4NjY5NiwgMHg2QTgwLAorICAgIDB4NkJCNSwgMHg3NTM3LCAweDhBQzcsIDB4NTAyNCwgMHg3N0U1LCAweDU3MzAsIDB4NUYxQiwgMHg2MDY1LCAweDY2N0EsCisgICAgMHg2QzYwLCAweDc1RjQsIDB4N0ExQSwgMHg3RjZFLCAweDgxRjQsIDB4ODcxOCwgMHg5MDQ1LCAweDk5QjMsIDB4N0JDOSwKKyAgICAweDc1NUMsIDB4N0FGOSwgMHg3QjUxLCAweDg0QzQsIDB4OTAxMCwgMHg3OUU5LCAweDdBOTIsIDB4ODMzNiwgMHg1QUUxLAorICAgIDB4Nzc0MCwgMHg0RTJELCAweDRFRjIsIDB4NUI5OSwgMHg1RkUwLCAweDYyQkQsIDB4NjYzQywgMHg2N0YxLCAweDZDRTgsCisgICAgMHg4NjZCLCAweDg4NzcsIDB4OEEzQiwgMHg5MTRFLCAweDkyRjMsIDB4OTlEMCwgMHg2QTE3LCAweDcwMjYsIDB4NzMyQSwKKyAgICAweDgyRTcsIDB4ODQ1NywgMHg4Q0FGLCAweDRFMDEsIDB4NTE0NiwgMHg1MUNCLCAweDU1OEIsIDB4NUJGNSwgMHg1RTE2LAorICAgIDB4NUUzMywgMHg1RTgxLCAweDVGMTQsIDB4NUYzNSwgMHg1RjZCLCAweDVGQjQsIDB4NjFGMiwgMHg2MzExLCAweDY2QTIsCisgICAgMHg2NzFELCAweDZGNkUsIDB4NzI1MiwgMHg3NTNBLCAweDc3M0EsIDB4ODA3NCwgMHg4MTM5LCAweDgxNzgsIDB4ODc3NiwKKyAgICAweDhBQkYsIDB4OEFEQywgMHg4RDg1LCAweDhERjMsIDB4OTI5QSwgMHg5NTc3LCAweDk4MDIsIDB4OUNFNSwgMHg1MkM1LAorICAgIDB4NjM1NywgMHg3NkY0LCAweDY3MTUsIDB4NkM4OCwgMHg3M0NELCAweDhDQzMsIDB4OTNBRSwgMHg5NjczLCAweDZEMjUsCisgICAgMHg1ODlDLCAweDY5MEUsIDB4NjlDQywgMHg4RkZELCAweDkzOUEsIDB4NzVEQiwgMHg5MDFBLCAweDU4NUEsIDB4NjgwMiwKKyAgICAweDYzQjQsIDB4NjlGQiwgMHg0RjQzLCAweDZGMkMsIDB4NjdEOCwgMHg4RkJCLCAweDg1MjYsIDB4N0RCNCwgMHg5MzU0LAorICAgIDB4NjkzRiwgMHg2RjcwLCAweDU3NkEsIDB4NThGNywgMHg1QjJDLCAweDdEMkMsIDB4NzIyQSwgMHg1NDBBLCAweDkxRTMsCisgICAgMHg5REI0LCAweDRFQUQsIDB4NEY0RSwgMHg1MDVDLCAweDUwNzUsIDB4NTI0MywgMHg4QzlFLCAweDU0NDgsIDB4NTgyNCwKKyAgICAweDVCOUEsIDB4NUUxRCwgMHg1RTk1LCAweDVFQUQsIDB4NUVGNywgMHg1RjFGLCAweDYwOEMsIDB4NjJCNSwgMHg2MzNBLAorICAgIDB4NjNEMCwgMHg2OEFGLCAweDZDNDAsIDB4Nzg4NywgMHg3OThFLCAweDdBMEIsIDB4N0RFMCwgMHg4MjQ3LCAweDhBMDIsCisgICAgMHg4QUU2LCAweDhFNDQsIDB4OTAxMywgMHg5MEI4LCAweDkxMkQsIDB4OTFEOCwgMHg5RjBFLCAweDZDRTUsIDB4NjQ1OCwKKyAgICAweDY0RTIsIDB4NjU3NSwgMHg2RUY0LCAweDc2ODQsIDB4N0IxQiwgMHg5MDY5LCAweDkzRDEsIDB4NkVCQSwgMHg1NEYyLAorICAgIDB4NUZCOSwgMHg2NEE0LCAweDhGNEQsIDB4OEZFRCwgMHg5MjQ0LCAweDUxNzgsIDB4NTg2QiwgMHg1OTI5LCAweDVDNTUsCisgICAgMHg1RTk3LCAweDZERkIsIDB4N0U4RiwgMHg3NTFDLCAweDhDQkMsIDB4OEVFMiwgMHg5ODVCLCAweDcwQjksIDB4NEYxRCwKKyAgICAweDZCQkYsIDB4NkZCMSwgMHg3NTMwLCAweDk2RkIsIDB4NTE0RSwgMHg1NDEwLCAweDU4MzUsIDB4NTg1NywgMHg1OUFDLAorICAgIDB4NUM2MCwgMHg1RjkyLCAweDY1OTcsIDB4Njc1QywgMHg2RTIxLCAweDc2N0IsIDB4ODNERiwgMHg4Q0VELCAweDkwMTQsCisgICAgMHg5MEZELCAweDkzNEQsIDB4NzgyNSwgMHg3ODNBLCAweDUyQUEsIDB4NUVBNiwgMHg1NzFGLCAweDU5NzQsIDB4NjAxMiwKKyAgICAweDUwMTIsIDB4NTE1QSwgMHg1MUFDLCAweDUxQ0QsIDB4NTIwMCwgMHg1NTEwLCAweDU4NTQsIDB4NTg1OCwgMHg1OTU3LAorICAgIDB4NUI5NSwgMHg1Q0Y2LCAweDVEOEIsIDB4NjBCQywgMHg2Mjk1LCAweDY0MkQsIDB4Njc3MSwgMHg2ODQzLCAweDY4QkMsCisgICAgMHg2OERGLCAweDc2RDcsIDB4NkREOCwgMHg2RTZGLCAweDZEOUIsIDB4NzA2RiwgMHg3MUM4LCAweDVGNTMsIDB4NzVEOCwKKyAgICAweDc5NzcsIDB4N0I0OSwgMHg3QjU0LCAweDdCNTIsIDB4N0NENiwgMHg3RDcxLCAweDUyMzAsIDB4ODQ2MywgMHg4NTY5LAorICAgIDB4ODVFNCwgMHg4QTBFLCAweDhCMDQsIDB4OEM0NiwgMHg4RTBGLCAweDkwMDMsIDB4OTAwRiwgMHg5NDE5LCAweDk2NzYsCisgICAgMHg5ODJELCAweDlBMzAsIDB4OTVEOCwgMHg1MENELCAweDUyRDUsIDB4NTQwQywgMHg1ODAyLCAweDVDMEUsIDB4NjFBNywKKyAgICAweDY0OUUsIDB4NkQxRSwgMHg3N0IzLCAweDdBRTUsIDB4ODBGNCwgMHg4NDA0LCAweDkwNTMsIDB4OTI4NSwgMHg1Q0UwLAorICAgIDB4OUQwNywgMHg1MzNGLCAweDVGOTcsIDB4NUZCMywgMHg2RDlDLCAweDcyNzksIDB4Nzc2MywgMHg3OUJGLCAweDdCRTQsCisgICAgMHg2QkQyLCAweDcyRUMsIDB4OEFBRCwgMHg2ODAzLCAweDZBNjEsIDB4NTFGOCwgMHg3QTgxLCAweDY5MzQsIDB4NUM0QSwKKyAgICAweDlDRjYsIDB4ODJFQiwgMHg1QkM1LCAweDkxNDksIDB4NzAxRSwgMHg1Njc4LCAweDVDNkYsIDB4NjBDNywgMHg2NTY2LAorICAgIDB4NkM4QywgMHg4QzVBLCAweDkwNDEsIDB4OTgxMywgMHg1NDUxLCAweDY2QzcsIDB4OTIwRCwgMHg1OTQ4LCAweDkwQTMsCisgICAgMHg1MTg1LCAweDRFNEQsIDB4NTFFQSwgMHg4NTk5LCAweDhCMEUsIDB4NzA1OCwgMHg2MzdBLCAweDkzNEIsIDB4Njk2MiwKKyAgICAweDk5QjQsIDB4N0UwNCwgMHg3NTc3LCAweDUzNTcsIDB4Njk2MCwgMHg4RURGLCAweDk2RTMsIDB4NkM1RCwgMHg0RThDLAorICAgIDB4NUMzQywgMHg1RjEwLCAweDhGRTksIDB4NTMwMiwgMHg4Q0QxLCAweDgwODksIDB4ODY3OSwgMHg1RUZGLCAweDY1RTUsCisgICAgMHg0RTczLCAweDUxNjUsIDB4NTk4MiwgMHg1QzNGLCAweDk3RUUsIDB4NEVGQiwgMHg1OThBLCAweDVGQ0QsIDB4OEE4RCwKKyAgICAweDZGRTEsIDB4NzlCMCwgMHg3OTYyLCAweDVCRTcsIDB4ODQ3MSwgMHg3MzJCLCAweDcxQjEsIDB4NUU3NCwgMHg1RkY1LAorICAgIDB4NjM3QiwgMHg2NDlBLCAweDcxQzMsIDB4N0M5OCwgMHg0RTQzLCAweDVFRkMsIDB4NEU0QiwgMHg1N0RDLCAweDU2QTIsCisgICAgMHg2MEE5LCAweDZGQzMsIDB4N0QwRCwgMHg4MEZELCAweDgxMzMsIDB4ODFCRiwgMHg4RkIyLCAweDg5OTcsIDB4ODZBNCwKKyAgICAweDVERjQsIDB4NjI4QSwgMHg2NEFELCAweDg5ODcsIDB4Njc3NywgMHg2Q0UyLCAweDZEM0UsIDB4NzQzNiwgMHg3ODM0LAorICAgIDB4NUE0NiwgMHg3Rjc1LCAweDgyQUQsIDB4OTlBQywgMHg0RkYzLCAweDVFQzMsIDB4NjJERCwgMHg2MzkyLCAweDY1NTcsCisgICAgMHg2NzZGLCAweDc2QzMsIDB4NzI0QywgMHg4MENDLCAweDgwQkEsIDB4OEYyOSwgMHg5MTRELCAweDUwMEQsIDB4NTdGOSwKKyAgICAweDVBOTIsIDB4Njg4NSwgMHg2OTczLCAweDcxNjQsIDB4NzJGRCwgMHg4Q0I3LCAweDU4RjIsIDB4OENFMCwgMHg5NjZBLAorICAgIDB4OTAxOSwgMHg4NzdGLCAweDc5RTQsIDB4NzdFNywgMHg4NDI5LCAweDRGMkYsIDB4NTI2NSwgMHg1MzVBLCAweDYyQ0QsCisgICAgMHg2N0NGLCAweDZDQ0EsIDB4NzY3RCwgMHg3Qjk0LCAweDdDOTUsIDB4ODIzNiwgMHg4NTg0LCAweDhGRUIsIDB4NjZERCwKKyAgICAweDZGMjAsIDB4NzIwNiwgMHg3RTFCLCAweDgzQUIsIDB4OTlDMSwgMHg5RUE2LCAweDUxRkQsIDB4N0JCMSwgMHg3ODcyLAorICAgIDB4N0JCOCwgMHg4MDg3LCAweDdCNDgsIDB4NkFFOCwgMHg1RTYxLCAweDgwOEMsIDB4NzU1MSwgMHg3NTYwLCAweDUxNkIsCisgICAgMHg5MjYyLCAweDZFOEMsIDB4NzY3QSwgMHg5MTk3LCAweDlBRUEsIDB4NEYxMCwgMHg3RjcwLCAweDYyOUMsIDB4N0I0RiwKKyAgICAweDk1QTUsIDB4OUNFOSwgMHg1NjdBLCAweDU4NTksIDB4ODZFNCwgMHg5NkJDLCAweDRGMzQsIDB4NTIyNCwgMHg1MzRBLAorICAgIDB4NTNDRCwgMHg1M0RCLCAweDVFMDYsIDB4NjQyQywgMHg2NTkxLCAweDY3N0YsIDB4NkMzRSwgMHg2QzRFLCAweDcyNDgsCisgICAgMHg3MkFGLCAweDczRUQsIDB4NzU1NCwgMHg3RTQxLCAweDgyMkMsIDB4ODVFOSwgMHg4Q0E5LCAweDdCQzQsIDB4OTFDNiwKKyAgICAweDcxNjksIDB4OTgxMiwgMHg5OEVGLCAweDYzM0QsIDB4NjY2OSwgMHg3NTZBLCAweDc2RTQsIDB4NzhEMCwgMHg4NTQzLAorICAgIDB4ODZFRSwgMHg1MzJBLCAweDUzNTEsIDB4NTQyNiwgMHg1OTgzLCAweDVFODcsIDB4NUY3QywgMHg2MEIyLCAweDYyNDksCisgICAgMHg2Mjc5LCAweDYyQUIsIDB4NjU5MCwgMHg2QkQ0LCAweDZDQ0MsIDB4NzVCMiwgMHg3NkFFLCAweDc4OTEsIDB4NzlEOCwKKyAgICAweDdEQ0IsIDB4N0Y3NywgMHg4MEE1LCAweDg4QUIsIDB4OEFCOSwgMHg4Q0JCLCAweDkwN0YsIDB4OTc1RSwgMHg5OERCLAorICAgIDB4NkEwQiwgMHg3QzM4LCAweDUwOTksIDB4NUMzRSwgMHg1RkFFLCAweDY3ODcsIDB4NkJEOCwgMHg3NDM1LCAweDc3MDksCisgICAgMHg3RjhFLCAweDlGM0IsIDB4NjdDQSwgMHg3QTE3LCAweDUzMzksIDB4NzU4QiwgMHg5QUVELCAweDVGNjYsIDB4ODE5RCwKKyAgICAweDgzRjEsIDB4ODA5OCwgMHg1RjNDLCAweDVGQzUsIDB4NzU2MiwgMHg3QjQ2LCAweDkwM0MsIDB4Njg2NywgMHg1OUVCLAorICAgIDB4NUE5QiwgMHg3RDEwLCAweDc2N0UsIDB4OEIyQywgMHg0RkY1LCAweDVGNkEsIDB4NkExOSwgMHg2QzM3LCAweDZGMDIsCisgICAgMHg3NEUyLCAweDc5NjgsIDB4ODg2OCwgMHg4QTU1LCAweDhDNzksIDB4NUVERiwgMHg2M0NGLCAweDc1QzUsIDB4NzlEMiwKKyAgICAweDgyRDcsIDB4OTMyOCwgMHg5MkYyLCAweDg0OUMsIDB4ODZFRCwgMHg5QzJELCAweDU0QzEsIDB4NUY2QywgMHg2NThDLAorICAgIDB4NkQ1QywgMHg3MDE1LCAweDhDQTcsIDB4OENEMywgMHg5ODNCLCAweDY1NEYsIDB4NzRGNiwgMHg0RTBELCAweDRFRDgsCisgICAgMHg1N0UwLCAweDU5MkIsIDB4NUE2NiwgMHg1QkNDLCAweDUxQTgsIDB4NUUwMywgMHg1RTlDLCAweDYwMTYsIDB4NjI3NiwKKyAgICAweDY1NzcsIDB4NjVBNywgMHg2NjZFLCAweDZENkUsIDB4NzIzNiwgMHg3QjI2LCAweDgxNTAsIDB4ODE5QSwgMHg4Mjk5LAorICAgIDB4OEI1QywgMHg4Q0EwLCAweDhDRTYsIDB4OEQ3NCwgMHg5NjFDLCAweDk2NDQsIDB4NEZBRSwgMHg2NEFCLCAweDZCNjYsCisgICAgMHg4MjFFLCAweDg0NjEsIDB4ODU2QSwgMHg5MEU4LCAweDVDMDEsIDB4Njk1MywgMHg5OEE4LCAweDg0N0EsIDB4ODU1NywKKyAgICAweDRGMEYsIDB4NTI2RiwgMHg1RkE5LCAweDVFNDUsIDB4NjcwRCwgMHg3OThGLCAweDgxNzksIDB4ODkwNywgMHg4OTg2LAorICAgIDB4NkRGNSwgMHg1RjE3LCAweDYyNTUsIDB4NkNCOCwgMHg0RUNGLCAweDcyNjksIDB4OUI5MiwgMHg1MjA2LCAweDU0M0IsCisgICAgMHg1Njc0LCAweDU4QjMsIDB4NjFBNCwgMHg2MjZFLCAweDcxMUEsIDB4NTk2RSwgMHg3Qzg5LCAweDdDREUsIDB4N0QxQiwKKyAgICAweDk2RjAsIDB4NjU4NywgMHg4MDVFLCAweDRFMTksIDB4NEY3NSwgMHg1MTc1LCAweDU4NDAsIDB4NUU2MywgMHg1RTczLAorICAgIDB4NUYwQSwgMHg2N0M0LCAweDRFMjYsIDB4ODUzRCwgMHg5NTg5LCAweDk2NUIsIDB4N0M3MywgMHg5ODAxLCAweDUwRkIsCisgICAgMHg1OEMxLCAweDc2NTYsIDB4NzhBNywgMHg1MjI1LCAweDc3QTUsIDB4ODUxMSwgMHg3Qjg2LCAweDUwNEYsIDB4NTkwOSwKKyAgICAweDcyNDcsIDB4N0JDNywgMHg3REU4LCAweDhGQkEsIDB4OEZENCwgMHg5MDRELCAweDRGQkYsIDB4NTJDOSwgMHg1QTI5LAorICAgIDB4NUYwMSwgMHg5N0FELCAweDRGREQsIDB4ODIxNywgMHg5MkVBLCAweDU3MDMsIDB4NjM1NSwgMHg2QjY5LCAweDc1MkIsCisgICAgMHg4OERDLCAweDhGMTQsIDB4N0E0MiwgMHg1MkRGLCAweDU4OTMsIDB4NjE1NSwgMHg2MjBBLCAweDY2QUUsIDB4NkJDRCwKKyAgICAweDdDM0YsIDB4ODNFOSwgMHg1MDIzLCAweDRGRjgsIDB4NTMwNSwgMHg1NDQ2LCAweDU4MzEsIDB4NTk0OSwgMHg1QjlELAorICAgIDB4NUNGMCwgMHg1Q0VGLCAweDVEMjksIDB4NUU5NiwgMHg2MkIxLCAweDYzNjcsIDB4NjUzRSwgMHg2NUI5LCAweDY3MEIsCisgICAgMHg2Q0Q1LCAweDZDRTEsIDB4NzBGOSwgMHg3ODMyLCAweDdFMkIsIDB4ODBERSwgMHg4MkIzLCAweDg0MEMsIDB4ODRFQywKKyAgICAweDg3MDIsIDB4ODkxMiwgMHg4QTJBLCAweDhDNEEsIDB4OTBBNiwgMHg5MkQyLCAweDk4RkQsIDB4OUNGMywgMHg5RDZDLAorICAgIDB4NEU0RiwgMHg0RUExLCAweDUwOEQsIDB4NTI1NiwgMHg1NzRBLCAweDU5QTgsIDB4NUUzRCwgMHg1RkQ4LCAweDVGRDksCisgICAgMHg2MjNGLCAweDY2QjQsIDB4NjcxQiwgMHg2N0QwLCAweDY4RDIsIDB4NTE5MiwgMHg3RDIxLCAweDgwQUEsIDB4ODFBOCwKKyAgICAweDhCMDAsIDB4OEM4QywgMHg4Q0JGLCAweDkyN0UsIDB4OTYzMiwgMHg1NDIwLCAweDk4MkMsIDB4NTMxNywgMHg1MEQ1LAorICAgIDB4NTM1QywgMHg1OEE4LCAweDY0QjIsIDB4NjczNCwgMHg3MjY3LCAweDc3NjYsIDB4N0E0NiwgMHg5MUU2LCAweDUyQzMsCisgICAgMHg2Q0ExLCAweDZCODYsIDB4NTgwMCwgMHg1RTRDLCAweDU5NTQsIDB4NjcyQywgMHg3RkZCLCAweDUxRTEsIDB4NzZDNiwKKyAgICAweDY0NjksIDB4NzhFOCwgMHg5QjU0LCAweDlFQkIsIDB4NTdDQiwgMHg1OUI5LCAweDY2MjcsIDB4Njc5QSwgMHg2QkNFLAorICAgIDB4NTRFOSwgMHg2OUQ5LCAweDVFNTUsIDB4ODE5QywgMHg2Nzk1LCAweDlCQUEsIDB4NjdGRSwgMHg5QzUyLCAweDY4NUQsCisgICAgMHg0RUE2LCAweDRGRTMsIDB4NTNDOCwgMHg2MkI5LCAweDY3MkIsIDB4NkNBQiwgMHg4RkM0LCAweDRGQUQsIDB4N0U2RCwKKyAgICAweDlFQkYsIDB4NEUwNywgMHg2MTYyLCAweDZFODAsIDB4NkYyQiwgMHg4NTEzLCAweDU0NzMsIDB4NjcyQSwgMHg5QjQ1LAorICAgIDB4NURGMywgMHg3Qjk1LCAweDVDQUMsIDB4NUJDNiwgMHg4NzFDLCAweDZFNEEsIDB4ODREMSwgMHg3QTE0LCAweDgxMDgsCisgICAgMHg1OTk5LCAweDdDOEQsIDB4NkMxMSwgMHg3NzIwLCAweDUyRDksIDB4NTkyMiwgMHg3MTIxLCAweDcyNUYsIDB4NzdEQiwKKyAgICAweDk3MjcsIDB4OUQ2MSwgMHg2OTBCLCAweDVBN0YsIDB4NUExOCwgMHg1MUE1LCAweDU0MEQsIDB4NTQ3RCwgMHg2NjBFLAorICAgIDB4NzZERiwgMHg4RkY3LCAweDkyOTgsIDB4OUNGNCwgMHg1OUVBLCAweDcyNUQsIDB4NkVDNSwgMHg1MTRELCAweDY4QzksCisgICAgMHg3REJGLCAweDdERUMsIDB4OTc2MiwgMHg5RUJBLCAweDY0NzgsIDB4NkEyMSwgMHg4MzAyLCAweDU5ODQsIDB4NUI1RiwKKyAgICAweDZCREIsIDB4NzMxQiwgMHg3NkYyLCAweDdEQjIsIDB4ODAxNywgMHg4NDk5LCAweDUxMzIsIDB4NjcyOCwgMHg5RUQ5LAorICAgIDB4NzZFRSwgMHg2NzYyLCAweDUyRkYsIDB4OTkwNSwgMHg1QzI0LCAweDYyM0IsIDB4N0M3RSwgMHg4Q0IwLCAweDU1NEYsCisgICAgMHg2MEI2LCAweDdEMEIsIDB4OTU4MCwgMHg1MzAxLCAweDRFNUYsIDB4NTFCNiwgMHg1OTFDLCAweDcyM0EsIDB4ODAzNiwKKyAgICAweDkxQ0UsIDB4NUYyNSwgMHg3N0UyLCAweDUzODQsIDB4NUY3OSwgMHg3RDA0LCAweDg1QUMsIDB4OEEzMywgMHg4RThELAorICAgIDB4OTc1NiwgMHg2N0YzLCAweDg1QUUsIDB4OTQ1MywgMHg2MTA5LCAweDYxMDgsIDB4NkNCOSwgMHg3NjUyLCAweDhBRUQsCisgICAgMHg4RjM4LCAweDU1MkYsIDB4NEY1MSwgMHg1MTJBLCAweDUyQzcsIDB4NTNDQiwgMHg1QkE1LCAweDVFN0QsIDB4NjBBMCwKKyAgICAweDYxODIsIDB4NjNENiwgMHg2NzA5LCAweDY3REEsIDB4NkU2NywgMHg2RDhDLCAweDczMzYsIDB4NzMzNywgMHg3NTMxLAorICAgIDB4Nzk1MCwgMHg4OEQ1LCAweDhBOTgsIDB4OTA0QSwgMHg5MDkxLCAweDkwRjUsIDB4OTZDNCwgMHg4NzhELCAweDU5MTUsCisgICAgMHg0RTg4LCAweDRGNTksIDB4NEUwRSwgMHg4QTg5LCAweDhGM0YsIDB4OTgxMCwgMHg1MEFELCAweDVFN0MsIDB4NTk5NiwKKyAgICAweDVCQjksIDB4NUVCOCwgMHg2M0RBLCAweDYzRkEsIDB4NjRDMSwgMHg2NkRDLCAweDY5NEEsIDB4NjlEOCwgMHg2RDBCLAorICAgIDB4NkVCNiwgMHg3MTk0LCAweDc1MjgsIDB4N0FBRiwgMHg3RjhBLCAweDgwMDAsIDB4ODQ0OSwgMHg4NEM5LCAweDg5ODEsCisgICAgMHg4QjIxLCAweDhFMEEsIDB4OTA2NSwgMHg5NjdELCAweDk5MEEsIDB4NjE3RSwgMHg2MjkxLCAweDZCMzIsIDB4NkM4MywKKyAgICAweDZENzQsIDB4N0ZDQywgMHg3RkZDLCAweDZEQzAsIDB4N0Y4NSwgMHg4N0JBLCAweDg4RjgsIDB4Njc2NSwgMHg4M0IxLAorICAgIDB4OTgzQywgMHg5NkY3LCAweDZEMUIsIDB4N0Q2MSwgMHg4NDNELCAweDkxNkEsIDB4NEU3MSwgMHg1Mzc1LCAweDVENTAsCisgICAgMHg2QjA0LCAweDZGRUIsIDB4ODVDRCwgMHg4NjJELCAweDg5QTcsIDB4NTIyOSwgMHg1NDBGLCAweDVDNjUsIDB4Njc0RSwKKyAgICAweDY4QTgsIDB4NzQwNiwgMHg3NDgzLCAweDc1RTIsIDB4ODhDRiwgMHg4OEUxLCAweDkxQ0MsIDB4OTZFMiwgMHg5Njc4LAorICAgIDB4NUY4QiwgMHg3Mzg3LCAweDdBQ0IsIDB4ODQ0RSwgMHg2M0EwLCAweDc1NjUsIDB4NTI4OSwgMHg2RDQxLCAweDZFOUMsCisgICAgMHg3NDA5LCAweDc1NTksIDB4Nzg2QiwgMHg3QzkyLCAweDk2ODYsIDB4N0FEQywgMHg5RjhELCAweDRGQjYsIDB4NjE2RSwKKyAgICAweDY1QzUsIDB4ODY1QywgMHg0RTg2LCAweDRFQUUsIDB4NTBEQSwgMHg0RTIxLCAweDUxQ0MsIDB4NUJFRSwgMHg2NTk5LAorICAgIDB4Njg4MSwgMHg2REJDLCAweDczMUYsIDB4NzY0MiwgMHg3N0FELCAweDdBMUMsIDB4N0NFNywgMHg4MjZGLCAweDhBRDIsCisgICAgMHg5MDdDLCAweDkxQ0YsIDB4OTY3NSwgMHg5ODE4LCAweDUyOUIsIDB4N0REMSwgMHg1MDJCLCAweDUzOTgsIDB4Njc5NywKKyAgICAweDZEQ0IsIDB4NzFEMCwgMHg3NDMzLCAweDgxRTgsIDB4OEYyQSwgMHg5NkEzLCAweDlDNTcsIDB4OUU5RiwgMHg3NDYwLAorICAgIDB4NTg0MSwgMHg2RDk5LCAweDdEMkYsIDB4OTg1RSwgMHg0RUU0LCAweDRGMzYsIDB4NEY4QiwgMHg1MUI3LCAweDUyQjEsCisgICAgMHg1REJBLCAweDYwMUMsIDB4NzNCMiwgMHg3OTNDLCAweDgyRDMsIDB4OTIzNCwgMHg5NkI3LCAweDk2RjYsIDB4OTcwQSwKKyAgICAweDlFOTcsIDB4OUY2MiwgMHg2NkE2LCAweDZCNzQsIDB4NTIxNywgMHg1MkEzLCAweDcwQzgsIDB4ODhDMiwgMHg1RUM5LAorICAgIDB4NjA0QiwgMHg2MTkwLCAweDZGMjMsIDB4NzE0OSwgMHg3QzNFLCAweDdERjQsIDB4ODA2RiwgMHg4NEVFLCAweDkwMjMsCisgICAgMHg5MzJDLCAweDU0NDIsIDB4OUI2RiwgMHg2QUQzLCAweDcwODksIDB4OENDMiwgMHg4REVGLCAweDk3MzIsIDB4NTJCNCwKKyAgICAweDVBNDEsIDB4NUVDQSwgMHg1RjA0LCAweDY3MTcsIDB4Njk3QywgMHg2OTk0LCAweDZENkEsIDB4NkYwRiwgMHg3MjYyLAorICAgIDB4NzJGQywgMHg3QkVELCAweDgwMDEsIDB4ODA3RSwgMHg4NzRCLCAweDkwQ0UsIDB4NTE2RCwgMHg5RTkzLCAweDc5ODQsCisgICAgMHg4MDhCLCAweDkzMzIsIDB4OEFENiwgMHg1MDJELCAweDU0OEMsIDB4OEE3MSwgMHg2QjZBLCAweDhDQzQsIDB4ODEwNywKKyAgICAweDYwRDEsIDB4NjdBMCwgMHg5REYyLCAweDRFOTksIDB4NEU5OCwgMHg5QzEwLCAweDhBNkIsIDB4ODVDMSwgMHg4NTY4LAorICAgIDB4NjkwMCwgMHg2RTdFLCAweDc4OTcsIDB4ODE1NSwgMHg1RjBDLCAweDRFMTAsIDB4NEUxNSwgMHg0RTJBLCAweDRFMzEsCisgICAgMHg0RTM2LCAweDRFM0MsIDB4NEUzRiwgMHg0RTQyLCAweDRFNTYsIDB4NEU1OCwgMHg0RTgyLCAweDRFODUsIDB4OEM2QiwKKyAgICAweDRFOEEsIDB4ODIxMiwgMHg1RjBELCAweDRFOEUsIDB4NEU5RSwgMHg0RTlGLCAweDRFQTAsIDB4NEVBMiwgMHg0RUIwLAorICAgIDB4NEVCMywgMHg0RUI2LCAweDRFQ0UsIDB4NEVDRCwgMHg0RUM0LCAweDRFQzYsIDB4NEVDMiwgMHg0RUQ3LCAweDRFREUsCisgICAgMHg0RUVELCAweDRFREYsIDB4NEVGNywgMHg0RjA5LCAweDRGNUEsIDB4NEYzMCwgMHg0RjVCLCAweDRGNUQsIDB4NEY1NywKKyAgICAweDRGNDcsIDB4NEY3NiwgMHg0Rjg4LCAweDRGOEYsIDB4NEY5OCwgMHg0RjdCLCAweDRGNjksIDB4NEY3MCwgMHg0RjkxLAorICAgIDB4NEY2RiwgMHg0Rjg2LCAweDRGOTYsIDB4NTExOCwgMHg0RkQ0LCAweDRGREYsIDB4NEZDRSwgMHg0RkQ4LCAweDRGREIsCisgICAgMHg0RkQxLCAweDRGREEsIDB4NEZEMCwgMHg0RkU0LCAweDRGRTUsIDB4NTAxQSwgMHg1MDI4LCAweDUwMTQsIDB4NTAyQSwKKyAgICAweDUwMjUsIDB4NTAwNSwgMHg0RjFDLCAweDRGRjYsIDB4NTAyMSwgMHg1MDI5LCAweDUwMkMsIDB4NEZGRSwgMHg0RkVGLAorICAgIDB4NTAxMSwgMHg1MDA2LCAweDUwNDMsIDB4NTA0NywgMHg2NzAzLCAweDUwNTUsIDB4NTA1MCwgMHg1MDQ4LCAweDUwNUEsCisgICAgMHg1MDU2LCAweDUwNkMsIDB4NTA3OCwgMHg1MDgwLCAweDUwOUEsIDB4NTA4NSwgMHg1MEI0LCAweDUwQjIsIDB4NTBDOSwKKyAgICAweDUwQ0EsIDB4NTBCMywgMHg1MEMyLCAweDUwRDYsIDB4NTBERSwgMHg1MEU1LCAweDUwRUQsIDB4NTBFMywgMHg1MEVFLAorICAgIDB4NTBGOSwgMHg1MEY1LCAweDUxMDksIDB4NTEwMSwgMHg1MTAyLCAweDUxMTYsIDB4NTExNSwgMHg1MTE0LCAweDUxMUEsCisgICAgMHg1MTIxLCAweDUxM0EsIDB4NTEzNywgMHg1MTNDLCAweDUxM0IsIDB4NTEzRiwgMHg1MTQwLCAweDUxNTIsIDB4NTE0QywKKyAgICAweDUxNTQsIDB4NTE2MiwgMHg3QUY4LCAweDUxNjksIDB4NTE2QSwgMHg1MTZFLCAweDUxODAsIDB4NTE4MiwgMHg1NkQ4LAorICAgIDB4NTE4QywgMHg1MTg5LCAweDUxOEYsIDB4NTE5MSwgMHg1MTkzLCAweDUxOTUsIDB4NTE5NiwgMHg1MUE0LCAweDUxQTYsCisgICAgMHg1MUEyLCAweDUxQTksIDB4NTFBQSwgMHg1MUFCLCAweDUxQjMsIDB4NTFCMSwgMHg1MUIyLCAweDUxQjAsIDB4NTFCNSwKKyAgICAweDUxQkQsIDB4NTFDNSwgMHg1MUM5LCAweDUxREIsIDB4NTFFMCwgMHg4NjU1LCAweDUxRTksIDB4NTFFRCwgMHg1MUYwLAorICAgIDB4NTFGNSwgMHg1MUZFLCAweDUyMDQsIDB4NTIwQiwgMHg1MjE0LCAweDUyMEUsIDB4NTIyNywgMHg1MjJBLCAweDUyMkUsCisgICAgMHg1MjMzLCAweDUyMzksIDB4NTI0RiwgMHg1MjQ0LCAweDUyNEIsIDB4NTI0QywgMHg1MjVFLCAweDUyNTQsIDB4NTI2QSwKKyAgICAweDUyNzQsIDB4NTI2OSwgMHg1MjczLCAweDUyN0YsIDB4NTI3RCwgMHg1MjhELCAweDUyOTQsIDB4NTI5MiwgMHg1MjcxLAorICAgIDB4NTI4OCwgMHg1MjkxLCAweDhGQTgsIDB4OEZBNywgMHg1MkFDLCAweDUyQUQsIDB4NTJCQywgMHg1MkI1LCAweDUyQzEsCisgICAgMHg1MkNELCAweDUyRDcsIDB4NTJERSwgMHg1MkUzLCAweDUyRTYsIDB4OThFRCwgMHg1MkUwLCAweDUyRjMsIDB4NTJGNSwKKyAgICAweDUyRjgsIDB4NTJGOSwgMHg1MzA2LCAweDUzMDgsIDB4NzUzOCwgMHg1MzBELCAweDUzMTAsIDB4NTMwRiwgMHg1MzE1LAorICAgIDB4NTMxQSwgMHg1MzIzLCAweDUzMkYsIDB4NTMzMSwgMHg1MzMzLCAweDUzMzgsIDB4NTM0MCwgMHg1MzQ2LCAweDUzNDUsCisgICAgMHg0RTE3LCAweDUzNDksIDB4NTM0RCwgMHg1MUQ2LCAweDUzNUUsIDB4NTM2OSwgMHg1MzZFLCAweDU5MTgsIDB4NTM3QiwKKyAgICAweDUzNzcsIDB4NTM4MiwgMHg1Mzk2LCAweDUzQTAsIDB4NTNBNiwgMHg1M0E1LCAweDUzQUUsIDB4NTNCMCwgMHg1M0I2LAorICAgIDB4NTNDMywgMHg3QzEyLCAweDk2RDksIDB4NTNERiwgMHg2NkZDLCAweDcxRUUsIDB4NTNFRSwgMHg1M0U4LCAweDUzRUQsCisgICAgMHg1M0ZBLCAweDU0MDEsIDB4NTQzRCwgMHg1NDQwLCAweDU0MkMsIDB4NTQyRCwgMHg1NDNDLCAweDU0MkUsIDB4NTQzNiwKKyAgICAweDU0MjksIDB4NTQxRCwgMHg1NDRFLCAweDU0OEYsIDB4NTQ3NSwgMHg1NDhFLCAweDU0NUYsIDB4NTQ3MSwgMHg1NDc3LAorICAgIDB4NTQ3MCwgMHg1NDkyLCAweDU0N0IsIDB4NTQ4MCwgMHg1NDc2LCAweDU0ODQsIDB4NTQ5MCwgMHg1NDg2LCAweDU0QzcsCisgICAgMHg1NEEyLCAweDU0QjgsIDB4NTRBNSwgMHg1NEFDLCAweDU0QzQsIDB4NTRDOCwgMHg1NEE4LCAweDU0QUIsIDB4NTRDMiwKKyAgICAweDU0QTQsIDB4NTRCRSwgMHg1NEJDLCAweDU0RDgsIDB4NTRFNSwgMHg1NEU2LCAweDU1MEYsIDB4NTUxNCwgMHg1NEZELAorICAgIDB4NTRFRSwgMHg1NEVELCAweDU0RkEsIDB4NTRFMiwgMHg1NTM5LCAweDU1NDAsIDB4NTU2MywgMHg1NTRDLCAweDU1MkUsCisgICAgMHg1NTVDLCAweDU1NDUsIDB4NTU1NiwgMHg1NTU3LCAweDU1MzgsIDB4NTUzMywgMHg1NTVELCAweDU1OTksIDB4NTU4MCwKKyAgICAweDU0QUYsIDB4NTU4QSwgMHg1NTlGLCAweDU1N0IsIDB4NTU3RSwgMHg1NTk4LCAweDU1OUUsIDB4NTVBRSwgMHg1NTdDLAorICAgIDB4NTU4MywgMHg1NUE5LCAweDU1ODcsIDB4NTVBOCwgMHg1NURBLCAweDU1QzUsIDB4NTVERiwgMHg1NUM0LCAweDU1REMsCisgICAgMHg1NUU0LCAweDU1RDQsIDB4NTYxNCwgMHg1NUY3LCAweDU2MTYsIDB4NTVGRSwgMHg1NUZELCAweDU2MUIsIDB4NTVGOSwKKyAgICAweDU2NEUsIDB4NTY1MCwgMHg3MURGLCAweDU2MzQsIDB4NTYzNiwgMHg1NjMyLCAweDU2MzgsIDB4NTY2QiwgMHg1NjY0LAorICAgIDB4NTYyRiwgMHg1NjZDLCAweDU2NkEsIDB4NTY4NiwgMHg1NjgwLCAweDU2OEEsIDB4NTZBMCwgMHg1Njk0LCAweDU2OEYsCisgICAgMHg1NkE1LCAweDU2QUUsIDB4NTZCNiwgMHg1NkI0LCAweDU2QzIsIDB4NTZCQywgMHg1NkMxLCAweDU2QzMsIDB4NTZDMCwKKyAgICAweDU2QzgsIDB4NTZDRSwgMHg1NkQxLCAweDU2RDMsIDB4NTZENywgMHg1NkVFLCAweDU2RjksIDB4NTcwMCwgMHg1NkZGLAorICAgIDB4NTcwNCwgMHg1NzA5LCAweDU3MDgsIDB4NTcwQiwgMHg1NzBELCAweDU3MTMsIDB4NTcxOCwgMHg1NzE2LCAweDU1QzcsCisgICAgMHg1NzFDLCAweDU3MjYsIDB4NTczNywgMHg1NzM4LCAweDU3NEUsIDB4NTczQiwgMHg1NzQwLCAweDU3NEYsIDB4NTc2OSwKKyAgICAweDU3QzAsIDB4NTc4OCwgMHg1NzYxLCAweDU3N0YsIDB4NTc4OSwgMHg1NzkzLCAweDU3QTAsIDB4NTdCMywgMHg1N0E0LAorICAgIDB4NTdBQSwgMHg1N0IwLCAweDU3QzMsIDB4NTdDNiwgMHg1N0Q0LCAweDU3RDIsIDB4NTdEMywgMHg1ODBBLCAweDU3RDYsCisgICAgMHg1N0UzLCAweDU4MEIsIDB4NTgxOSwgMHg1ODFELCAweDU4NzIsIDB4NTgyMSwgMHg1ODYyLCAweDU4NEIsIDB4NTg3MCwKKyAgICAweDZCQzAsIDB4NTg1MiwgMHg1ODNELCAweDU4NzksIDB4NTg4NSwgMHg1OEI5LCAweDU4OUYsIDB4NThBQiwgMHg1OEJBLAorICAgIDB4NThERSwgMHg1OEJCLCAweDU4QjgsIDB4NThBRSwgMHg1OEM1LCAweDU4RDMsIDB4NThEMSwgMHg1OEQ3LCAweDU4RDksCisgICAgMHg1OEQ4LCAweDU4RTUsIDB4NThEQywgMHg1OEU0LCAweDU4REYsIDB4NThFRiwgMHg1OEZBLCAweDU4RjksIDB4NThGQiwKKyAgICAweDU4RkMsIDB4NThGRCwgMHg1OTAyLCAweDU5MEEsIDB4NTkxMCwgMHg1OTFCLCAweDY4QTYsIDB4NTkyNSwgMHg1OTJDLAorICAgIDB4NTkyRCwgMHg1OTMyLCAweDU5MzgsIDB4NTkzRSwgMHg3QUQyLCAweDU5NTUsIDB4NTk1MCwgMHg1OTRFLCAweDU5NUEsCisgICAgMHg1OTU4LCAweDU5NjIsIDB4NTk2MCwgMHg1OTY3LCAweDU5NkMsIDB4NTk2OSwgMHg1OTc4LCAweDU5ODEsIDB4NTk5RCwKKyAgICAweDRGNUUsIDB4NEZBQiwgMHg1OUEzLCAweDU5QjIsIDB4NTlDNiwgMHg1OUU4LCAweDU5REMsIDB4NTk4RCwgMHg1OUQ5LAorICAgIDB4NTlEQSwgMHg1QTI1LCAweDVBMUYsIDB4NUExMSwgMHg1QTFDLCAweDVBMDksIDB4NUExQSwgMHg1QTQwLCAweDVBNkMsCisgICAgMHg1QTQ5LCAweDVBMzUsIDB4NUEzNiwgMHg1QTYyLCAweDVBNkEsIDB4NUE5QSwgMHg1QUJDLCAweDVBQkUsIDB4NUFDQiwKKyAgICAweDVBQzIsIDB4NUFCRCwgMHg1QUUzLCAweDVBRDcsIDB4NUFFNiwgMHg1QUU5LCAweDVBRDYsIDB4NUFGQSwgMHg1QUZCLAorICAgIDB4NUIwQywgMHg1QjBCLCAweDVCMTYsIDB4NUIzMiwgMHg1QUQwLCAweDVCMkEsIDB4NUIzNiwgMHg1QjNFLCAweDVCNDMsCisgICAgMHg1QjQ1LCAweDVCNDAsIDB4NUI1MSwgMHg1QjU1LCAweDVCNUEsIDB4NUI1QiwgMHg1QjY1LCAweDVCNjksIDB4NUI3MCwKKyAgICAweDVCNzMsIDB4NUI3NSwgMHg1Qjc4LCAweDY1ODgsIDB4NUI3QSwgMHg1QjgwLCAweDVCODMsIDB4NUJBNiwgMHg1QkI4LAorICAgIDB4NUJDMywgMHg1QkM3LCAweDVCQzksIDB4NUJENCwgMHg1QkQwLCAweDVCRTQsIDB4NUJFNiwgMHg1QkUyLCAweDVCREUsCisgICAgMHg1QkU1LCAweDVCRUIsIDB4NUJGMCwgMHg1QkY2LCAweDVCRjMsIDB4NUMwNSwgMHg1QzA3LCAweDVDMDgsIDB4NUMwRCwKKyAgICAweDVDMTMsIDB4NUMyMCwgMHg1QzIyLCAweDVDMjgsIDB4NUMzOCwgMHg1QzM5LCAweDVDNDEsIDB4NUM0NiwgMHg1QzRFLAorICAgIDB4NUM1MywgMHg1QzUwLCAweDVDNEYsIDB4NUI3MSwgMHg1QzZDLCAweDVDNkUsIDB4NEU2MiwgMHg1Qzc2LCAweDVDNzksCisgICAgMHg1QzhDLCAweDVDOTEsIDB4NUM5NCwgMHg1OTlCLCAweDVDQUIsIDB4NUNCQiwgMHg1Q0I2LCAweDVDQkMsIDB4NUNCNywKKyAgICAweDVDQzUsIDB4NUNCRSwgMHg1Q0M3LCAweDVDRDksIDB4NUNFOSwgMHg1Q0ZELCAweDVDRkEsIDB4NUNFRCwgMHg1RDhDLAorICAgIDB4NUNFQSwgMHg1RDBCLCAweDVEMTUsIDB4NUQxNywgMHg1RDVDLCAweDVEMUYsIDB4NUQxQiwgMHg1RDExLCAweDVEMTQsCisgICAgMHg1RDIyLCAweDVEMUEsIDB4NUQxOSwgMHg1RDE4LCAweDVENEMsIDB4NUQ1MiwgMHg1RDRFLCAweDVENEIsIDB4NUQ2QywKKyAgICAweDVENzMsIDB4NUQ3NiwgMHg1RDg3LCAweDVEODQsIDB4NUQ4MiwgMHg1REEyLCAweDVEOUQsIDB4NURBQywgMHg1REFFLAorICAgIDB4NURCRCwgMHg1RDkwLCAweDVEQjcsIDB4NURCQywgMHg1REM5LCAweDVEQ0QsIDB4NUREMywgMHg1REQyLCAweDVERDYsCisgICAgMHg1RERCLCAweDVERUIsIDB4NURGMiwgMHg1REY1LCAweDVFMEIsIDB4NUUxQSwgMHg1RTE5LCAweDVFMTEsIDB4NUUxQiwKKyAgICAweDVFMzYsIDB4NUUzNywgMHg1RTQ0LCAweDVFNDMsIDB4NUU0MCwgMHg1RTRFLCAweDVFNTcsIDB4NUU1NCwgMHg1RTVGLAorICAgIDB4NUU2MiwgMHg1RTY0LCAweDVFNDcsIDB4NUU3NSwgMHg1RTc2LCAweDVFN0EsIDB4OUVCQywgMHg1RTdGLCAweDVFQTAsCisgICAgMHg1RUMxLCAweDVFQzIsIDB4NUVDOCwgMHg1RUQwLCAweDVFQ0YsIDB4NUVENiwgMHg1RUUzLCAweDVFREQsIDB4NUVEQSwKKyAgICAweDVFREIsIDB4NUVFMiwgMHg1RUUxLCAweDVFRTgsIDB4NUVFOSwgMHg1RUVDLCAweDVFRjEsIDB4NUVGMywgMHg1RUYwLAorICAgIDB4NUVGNCwgMHg1RUY4LCAweDVFRkUsIDB4NUYwMywgMHg1RjA5LCAweDVGNUQsIDB4NUY1QywgMHg1RjBCLCAweDVGMTEsCisgICAgMHg1RjE2LCAweDVGMjksIDB4NUYyRCwgMHg1RjM4LCAweDVGNDEsIDB4NUY0OCwgMHg1RjRDLCAweDVGNEUsIDB4NUYyRiwKKyAgICAweDVGNTEsIDB4NUY1NiwgMHg1RjU3LCAweDVGNTksIDB4NUY2MSwgMHg1RjZELCAweDVGNzMsIDB4NUY3NywgMHg1RjgzLAorICAgIDB4NUY4MiwgMHg1RjdGLCAweDVGOEEsIDB4NUY4OCwgMHg1RjkxLCAweDVGODcsIDB4NUY5RSwgMHg1Rjk5LCAweDVGOTgsCisgICAgMHg1RkEwLCAweDVGQTgsIDB4NUZBRCwgMHg1RkJDLCAweDVGRDYsIDB4NUZGQiwgMHg1RkU0LCAweDVGRjgsIDB4NUZGMSwKKyAgICAweDVGREQsIDB4NjBCMywgMHg1RkZGLCAweDYwMjEsIDB4NjA2MCwgMHg2MDE5LCAweDYwMTAsIDB4NjAyOSwgMHg2MDBFLAorICAgIDB4NjAzMSwgMHg2MDFCLCAweDYwMTUsIDB4NjAyQiwgMHg2MDI2LCAweDYwMEYsIDB4NjAzQSwgMHg2MDVBLCAweDYwNDEsCisgICAgMHg2MDZBLCAweDYwNzcsIDB4NjA1RiwgMHg2MDRBLCAweDYwNDYsIDB4NjA0RCwgMHg2MDYzLCAweDYwNDMsIDB4NjA2NCwKKyAgICAweDYwNDIsIDB4NjA2QywgMHg2MDZCLCAweDYwNTksIDB4NjA4MSwgMHg2MDhELCAweDYwRTcsIDB4NjA4MywgMHg2MDlBLAorICAgIDB4NjA4NCwgMHg2MDlCLCAweDYwOTYsIDB4NjA5NywgMHg2MDkyLCAweDYwQTcsIDB4NjA4QiwgMHg2MEUxLCAweDYwQjgsCisgICAgMHg2MEUwLCAweDYwRDMsIDB4NjBCNCwgMHg1RkYwLCAweDYwQkQsIDB4NjBDNiwgMHg2MEI1LCAweDYwRDgsIDB4NjE0RCwKKyAgICAweDYxMTUsIDB4NjEwNiwgMHg2MEY2LCAweDYwRjcsIDB4NjEwMCwgMHg2MEY0LCAweDYwRkEsIDB4NjEwMywgMHg2MTIxLAorICAgIDB4NjBGQiwgMHg2MEYxLCAweDYxMEQsIDB4NjEwRSwgMHg2MTQ3LCAweDYxM0UsIDB4NjEyOCwgMHg2MTI3LCAweDYxNEEsCisgICAgMHg2MTNGLCAweDYxM0MsIDB4NjEyQywgMHg2MTM0LCAweDYxM0QsIDB4NjE0MiwgMHg2MTQ0LCAweDYxNzMsIDB4NjE3NywKKyAgICAweDYxNTgsIDB4NjE1OSwgMHg2MTVBLCAweDYxNkIsIDB4NjE3NCwgMHg2MTZGLCAweDYxNjUsIDB4NjE3MSwgMHg2MTVGLAorICAgIDB4NjE1RCwgMHg2MTUzLCAweDYxNzUsIDB4NjE5OSwgMHg2MTk2LCAweDYxODcsIDB4NjFBQywgMHg2MTk0LCAweDYxOUEsCisgICAgMHg2MThBLCAweDYxOTEsIDB4NjFBQiwgMHg2MUFFLCAweDYxQ0MsIDB4NjFDQSwgMHg2MUM5LCAweDYxRjcsIDB4NjFDOCwKKyAgICAweDYxQzMsIDB4NjFDNiwgMHg2MUJBLCAweDYxQ0IsIDB4N0Y3OSwgMHg2MUNELCAweDYxRTYsIDB4NjFFMywgMHg2MUY2LAorICAgIDB4NjFGQSwgMHg2MUY0LCAweDYxRkYsIDB4NjFGRCwgMHg2MUZDLCAweDYxRkUsIDB4NjIwMCwgMHg2MjA4LCAweDYyMDksCisgICAgMHg2MjBELCAweDYyMEMsIDB4NjIxNCwgMHg2MjFCLCAweDYyMUUsIDB4NjIyMSwgMHg2MjJBLCAweDYyMkUsIDB4NjIzMCwKKyAgICAweDYyMzIsIDB4NjIzMywgMHg2MjQxLCAweDYyNEUsIDB4NjI1RSwgMHg2MjYzLCAweDYyNUIsIDB4NjI2MCwgMHg2MjY4LAorICAgIDB4NjI3QywgMHg2MjgyLCAweDYyODksIDB4NjI3RSwgMHg2MjkyLCAweDYyOTMsIDB4NjI5NiwgMHg2MkQ0LCAweDYyODMsCisgICAgMHg2Mjk0LCAweDYyRDcsIDB4NjJEMSwgMHg2MkJCLCAweDYyQ0YsIDB4NjJGRiwgMHg2MkM2LCAweDY0RDQsIDB4NjJDOCwKKyAgICAweDYyREMsIDB4NjJDQywgMHg2MkNBLCAweDYyQzIsIDB4NjJDNywgMHg2MjlCLCAweDYyQzksIDB4NjMwQywgMHg2MkVFLAorICAgIDB4NjJGMSwgMHg2MzI3LCAweDYzMDIsIDB4NjMwOCwgMHg2MkVGLCAweDYyRjUsIDB4NjM1MCwgMHg2MzNFLCAweDYzNEQsCisgICAgMHg2NDFDLCAweDYzNEYsIDB4NjM5NiwgMHg2MzhFLCAweDYzODAsIDB4NjNBQiwgMHg2Mzc2LCAweDYzQTMsIDB4NjM4RiwKKyAgICAweDYzODksIDB4NjM5RiwgMHg2M0I1LCAweDYzNkIsIDB4NjM2OSwgMHg2M0JFLCAweDYzRTksIDB4NjNDMCwgMHg2M0M2LAorICAgIDB4NjNFMywgMHg2M0M5LCAweDYzRDIsIDB4NjNGNiwgMHg2M0M0LCAweDY0MTYsIDB4NjQzNCwgMHg2NDA2LCAweDY0MTMsCisgICAgMHg2NDI2LCAweDY0MzYsIDB4NjUxRCwgMHg2NDE3LCAweDY0MjgsIDB4NjQwRiwgMHg2NDY3LCAweDY0NkYsIDB4NjQ3NiwKKyAgICAweDY0NEUsIDB4NjUyQSwgMHg2NDk1LCAweDY0OTMsIDB4NjRBNSwgMHg2NEE5LCAweDY0ODgsIDB4NjRCQywgMHg2NERBLAorICAgIDB4NjREMiwgMHg2NEM1LCAweDY0QzcsIDB4NjRCQiwgMHg2NEQ4LCAweDY0QzIsIDB4NjRGMSwgMHg2NEU3LCAweDgyMDksCisgICAgMHg2NEUwLCAweDY0RTEsIDB4NjJBQywgMHg2NEUzLCAweDY0RUYsIDB4NjUyQywgMHg2NEY2LCAweDY0RjQsIDB4NjRGMiwKKyAgICAweDY0RkEsIDB4NjUwMCwgMHg2NEZELCAweDY1MTgsIDB4NjUxQywgMHg2NTA1LCAweDY1MjQsIDB4NjUyMywgMHg2NTJCLAorICAgIDB4NjUzNCwgMHg2NTM1LCAweDY1MzcsIDB4NjUzNiwgMHg2NTM4LCAweDc1NEIsIDB4NjU0OCwgMHg2NTU2LCAweDY1NTUsCisgICAgMHg2NTRELCAweDY1NTgsIDB4NjU1RSwgMHg2NTVELCAweDY1NzIsIDB4NjU3OCwgMHg2NTgyLCAweDY1ODMsIDB4OEI4QSwKKyAgICAweDY1OUIsIDB4NjU5RiwgMHg2NUFCLCAweDY1QjcsIDB4NjVDMywgMHg2NUM2LCAweDY1QzEsIDB4NjVDNCwgMHg2NUNDLAorICAgIDB4NjVEMiwgMHg2NURCLCAweDY1RDksIDB4NjVFMCwgMHg2NUUxLCAweDY1RjEsIDB4Njc3MiwgMHg2NjBBLCAweDY2MDMsCisgICAgMHg2NUZCLCAweDY3NzMsIDB4NjYzNSwgMHg2NjM2LCAweDY2MzQsIDB4NjYxQywgMHg2NjRGLCAweDY2NDQsIDB4NjY0OSwKKyAgICAweDY2NDEsIDB4NjY1RSwgMHg2NjVELCAweDY2NjQsIDB4NjY2NywgMHg2NjY4LCAweDY2NUYsIDB4NjY2MiwgMHg2NjcwLAorICAgIDB4NjY4MywgMHg2Njg4LCAweDY2OEUsIDB4NjY4OSwgMHg2Njg0LCAweDY2OTgsIDB4NjY5RCwgMHg2NkMxLCAweDY2QjksCisgICAgMHg2NkM5LCAweDY2QkUsIDB4NjZCQywgMHg2NkM0LCAweDY2QjgsIDB4NjZENiwgMHg2NkRBLCAweDY2RTAsIDB4NjYzRiwKKyAgICAweDY2RTYsIDB4NjZFOSwgMHg2NkYwLCAweDY2RjUsIDB4NjZGNywgMHg2NzBGLCAweDY3MTYsIDB4NjcxRSwgMHg2NzI2LAorICAgIDB4NjcyNywgMHg5NzM4LCAweDY3MkUsIDB4NjczRiwgMHg2NzM2LCAweDY3NDEsIDB4NjczOCwgMHg2NzM3LCAweDY3NDYsCisgICAgMHg2NzVFLCAweDY3NjAsIDB4Njc1OSwgMHg2NzYzLCAweDY3NjQsIDB4Njc4OSwgMHg2NzcwLCAweDY3QTksIDB4Njc3QywKKyAgICAweDY3NkEsIDB4Njc4QywgMHg2NzhCLCAweDY3QTYsIDB4NjdBMSwgMHg2Nzg1LCAweDY3QjcsIDB4NjdFRiwgMHg2N0I0LAorICAgIDB4NjdFQywgMHg2N0IzLCAweDY3RTksIDB4NjdCOCwgMHg2N0U0LCAweDY3REUsIDB4NjdERCwgMHg2N0UyLCAweDY3RUUsCisgICAgMHg2N0I5LCAweDY3Q0UsIDB4NjdDNiwgMHg2N0U3LCAweDZBOUMsIDB4NjgxRSwgMHg2ODQ2LCAweDY4MjksIDB4Njg0MCwKKyAgICAweDY4NEQsIDB4NjgzMiwgMHg2ODRFLCAweDY4QjMsIDB4NjgyQiwgMHg2ODU5LCAweDY4NjMsIDB4Njg3NywgMHg2ODdGLAorICAgIDB4Njg5RiwgMHg2ODhGLCAweDY4QUQsIDB4Njg5NCwgMHg2ODlELCAweDY4OUIsIDB4Njg4MywgMHg2QUFFLCAweDY4QjksCisgICAgMHg2ODc0LCAweDY4QjUsIDB4NjhBMCwgMHg2OEJBLCAweDY5MEYsIDB4Njg4RCwgMHg2ODdFLCAweDY5MDEsIDB4NjhDQSwKKyAgICAweDY5MDgsIDB4NjhEOCwgMHg2OTIyLCAweDY5MjYsIDB4NjhFMSwgMHg2OTBDLCAweDY4Q0QsIDB4NjhENCwgMHg2OEU3LAorICAgIDB4NjhENSwgMHg2OTM2LCAweDY5MTIsIDB4NjkwNCwgMHg2OEQ3LCAweDY4RTMsIDB4NjkyNSwgMHg2OEY5LCAweDY4RTAsCisgICAgMHg2OEVGLCAweDY5MjgsIDB4NjkyQSwgMHg2OTFBLCAweDY5MjMsIDB4NjkyMSwgMHg2OEM2LCAweDY5NzksIDB4Njk3NywKKyAgICAweDY5NUMsIDB4Njk3OCwgMHg2OTZCLCAweDY5NTQsIDB4Njk3RSwgMHg2OTZFLCAweDY5MzksIDB4Njk3NCwgMHg2OTNELAorICAgIDB4Njk1OSwgMHg2OTMwLCAweDY5NjEsIDB4Njk1RSwgMHg2OTVELCAweDY5ODEsIDB4Njk2QSwgMHg2OUIyLCAweDY5QUUsCisgICAgMHg2OUQwLCAweDY5QkYsIDB4NjlDMSwgMHg2OUQzLCAweDY5QkUsIDB4NjlDRSwgMHg1QkU4LCAweDY5Q0EsIDB4NjlERCwKKyAgICAweDY5QkIsIDB4NjlDMywgMHg2OUE3LCAweDZBMkUsIDB4Njk5MSwgMHg2OUEwLCAweDY5OUMsIDB4Njk5NSwgMHg2OUI0LAorICAgIDB4NjlERSwgMHg2OUU4LCAweDZBMDIsIDB4NkExQiwgMHg2OUZGLCAweDZCMEEsIDB4NjlGOSwgMHg2OUYyLCAweDY5RTcsCisgICAgMHg2QTA1LCAweDY5QjEsIDB4NkExRSwgMHg2OUVELCAweDZBMTQsIDB4NjlFQiwgMHg2QTBBLCAweDZBMTIsIDB4NkFDMSwKKyAgICAweDZBMjMsIDB4NkExMywgMHg2QTQ0LCAweDZBMEMsIDB4NkE3MiwgMHg2QTM2LCAweDZBNzgsIDB4NkE0NywgMHg2QTYyLAorICAgIDB4NkE1OSwgMHg2QTY2LCAweDZBNDgsIDB4NkEzOCwgMHg2QTIyLCAweDZBOTAsIDB4NkE4RCwgMHg2QUEwLCAweDZBODQsCisgICAgMHg2QUEyLCAweDZBQTMsIDB4NkE5NywgMHg4NjE3LCAweDZBQkIsIDB4NkFDMywgMHg2QUMyLCAweDZBQjgsIDB4NkFCMywKKyAgICAweDZBQUMsIDB4NkFERSwgMHg2QUQxLCAweDZBREYsIDB4NkFBQSwgMHg2QURBLCAweDZBRUEsIDB4NkFGQiwgMHg2QjA1LAorICAgIDB4ODYxNiwgMHg2QUZBLCAweDZCMTIsIDB4NkIxNiwgMHg5QjMxLCAweDZCMUYsIDB4NkIzOCwgMHg2QjM3LCAweDc2REMsCisgICAgMHg2QjM5LCAweDk4RUUsIDB4NkI0NywgMHg2QjQzLCAweDZCNDksIDB4NkI1MCwgMHg2QjU5LCAweDZCNTQsIDB4NkI1QiwKKyAgICAweDZCNUYsIDB4NkI2MSwgMHg2Qjc4LCAweDZCNzksIDB4NkI3RiwgMHg2QjgwLCAweDZCODQsIDB4NkI4MywgMHg2QjhELAorICAgIDB4NkI5OCwgMHg2Qjk1LCAweDZCOUUsIDB4NkJBNCwgMHg2QkFBLCAweDZCQUIsIDB4NkJBRiwgMHg2QkIyLCAweDZCQjEsCisgICAgMHg2QkIzLCAweDZCQjcsIDB4NkJCQywgMHg2QkM2LCAweDZCQ0IsIDB4NkJEMywgMHg2QkRGLCAweDZCRUMsIDB4NkJFQiwKKyAgICAweDZCRjMsIDB4NkJFRiwgMHg5RUJFLCAweDZDMDgsIDB4NkMxMywgMHg2QzE0LCAweDZDMUIsIDB4NkMyNCwgMHg2QzIzLAorICAgIDB4NkM1RSwgMHg2QzU1LCAweDZDNjIsIDB4NkM2QSwgMHg2QzgyLCAweDZDOEQsIDB4NkM5QSwgMHg2QzgxLCAweDZDOUIsCisgICAgMHg2QzdFLCAweDZDNjgsIDB4NkM3MywgMHg2QzkyLCAweDZDOTAsIDB4NkNDNCwgMHg2Q0YxLCAweDZDRDMsIDB4NkNCRCwKKyAgICAweDZDRDcsIDB4NkNDNSwgMHg2Q0RELCAweDZDQUUsIDB4NkNCMSwgMHg2Q0JFLCAweDZDQkEsIDB4NkNEQiwgMHg2Q0VGLAorICAgIDB4NkNEOSwgMHg2Q0VBLCAweDZEMUYsIDB4ODg0RCwgMHg2RDM2LCAweDZEMkIsIDB4NkQzRCwgMHg2RDM4LCAweDZEMTksCisgICAgMHg2RDM1LCAweDZEMzMsIDB4NkQxMiwgMHg2RDBDLCAweDZENjMsIDB4NkQ5MywgMHg2RDY0LCAweDZENUEsIDB4NkQ3OSwKKyAgICAweDZENTksIDB4NkQ4RSwgMHg2RDk1LCAweDZGRTQsIDB4NkQ4NSwgMHg2REY5LCAweDZFMTUsIDB4NkUwQSwgMHg2REI1LAorICAgIDB4NkRDNywgMHg2REU2LCAweDZEQjgsIDB4NkRDNiwgMHg2REVDLCAweDZEREUsIDB4NkRDQywgMHg2REU4LCAweDZERDIsCisgICAgMHg2REM1LCAweDZERkEsIDB4NkREOSwgMHg2REU0LCAweDZERDUsIDB4NkRFQSwgMHg2REVFLCAweDZFMkQsIDB4NkU2RSwKKyAgICAweDZFMkUsIDB4NkUxOSwgMHg2RTcyLCAweDZFNUYsIDB4NkUzRSwgMHg2RTIzLCAweDZFNkIsIDB4NkUyQiwgMHg2RTc2LAorICAgIDB4NkU0RCwgMHg2RTFGLCAweDZFNDMsIDB4NkUzQSwgMHg2RTRFLCAweDZFMjQsIDB4NkVGRiwgMHg2RTFELCAweDZFMzgsCisgICAgMHg2RTgyLCAweDZFQUEsIDB4NkU5OCwgMHg2RUM5LCAweDZFQjcsIDB4NkVEMywgMHg2RUJELCAweDZFQUYsIDB4NkVDNCwKKyAgICAweDZFQjIsIDB4NkVENCwgMHg2RUQ1LCAweDZFOEYsIDB4NkVBNSwgMHg2RUMyLCAweDZFOUYsIDB4NkY0MSwgMHg2RjExLAorICAgIDB4NzA0QywgMHg2RUVDLCAweDZFRjgsIDB4NkVGRSwgMHg2RjNGLCAweDZFRjIsIDB4NkYzMSwgMHg2RUVGLCAweDZGMzIsCisgICAgMHg2RUNDLCAweDZGM0UsIDB4NkYxMywgMHg2RUY3LCAweDZGODYsIDB4NkY3QSwgMHg2Rjc4LCAweDZGODEsIDB4NkY4MCwKKyAgICAweDZGNkYsIDB4NkY1QiwgMHg2RkYzLCAweDZGNkQsIDB4NkY4MiwgMHg2RjdDLCAweDZGNTgsIDB4NkY4RSwgMHg2RjkxLAorICAgIDB4NkZDMiwgMHg2RjY2LCAweDZGQjMsIDB4NkZBMywgMHg2RkExLCAweDZGQTQsIDB4NkZCOSwgMHg2RkM2LCAweDZGQUEsCisgICAgMHg2RkRGLCAweDZGRDUsIDB4NkZFQywgMHg2RkQ0LCAweDZGRDgsIDB4NkZGMSwgMHg2RkVFLCAweDZGREIsIDB4NzAwOSwKKyAgICAweDcwMEIsIDB4NkZGQSwgMHg3MDExLCAweDcwMDEsIDB4NzAwRiwgMHg2RkZFLCAweDcwMUIsIDB4NzAxQSwgMHg2Rjc0LAorICAgIDB4NzAxRCwgMHg3MDE4LCAweDcwMUYsIDB4NzAzMCwgMHg3MDNFLCAweDcwMzIsIDB4NzA1MSwgMHg3MDYzLCAweDcwOTksCisgICAgMHg3MDkyLCAweDcwQUYsIDB4NzBGMSwgMHg3MEFDLCAweDcwQjgsIDB4NzBCMywgMHg3MEFFLCAweDcwREYsIDB4NzBDQiwKKyAgICAweDcwREQsIDB4NzBEOSwgMHg3MTA5LCAweDcwRkQsIDB4NzExQywgMHg3MTE5LCAweDcxNjUsIDB4NzE1NSwgMHg3MTg4LAorICAgIDB4NzE2NiwgMHg3MTYyLCAweDcxNEMsIDB4NzE1NiwgMHg3MTZDLCAweDcxOEYsIDB4NzFGQiwgMHg3MTg0LCAweDcxOTUsCisgICAgMHg3MUE4LCAweDcxQUMsIDB4NzFENywgMHg3MUI5LCAweDcxQkUsIDB4NzFEMiwgMHg3MUM5LCAweDcxRDQsIDB4NzFDRSwKKyAgICAweDcxRTAsIDB4NzFFQywgMHg3MUU3LCAweDcxRjUsIDB4NzFGQywgMHg3MUY5LCAweDcxRkYsIDB4NzIwRCwgMHg3MjEwLAorICAgIDB4NzIxQiwgMHg3MjI4LCAweDcyMkQsIDB4NzIyQywgMHg3MjMwLCAweDcyMzIsIDB4NzIzQiwgMHg3MjNDLCAweDcyM0YsCisgICAgMHg3MjQwLCAweDcyNDYsIDB4NzI0QiwgMHg3MjU4LCAweDcyNzQsIDB4NzI3RSwgMHg3MjgyLCAweDcyODEsIDB4NzI4NywKKyAgICAweDcyOTIsIDB4NzI5NiwgMHg3MkEyLCAweDcyQTcsIDB4NzJCOSwgMHg3MkIyLCAweDcyQzMsIDB4NzJDNiwgMHg3MkM0LAorICAgIDB4NzJDRSwgMHg3MkQyLCAweDcyRTIsIDB4NzJFMCwgMHg3MkUxLCAweDcyRjksIDB4NzJGNywgMHg1MDBGLCAweDczMTcsCisgICAgMHg3MzBBLCAweDczMUMsIDB4NzMxNiwgMHg3MzFELCAweDczMzQsIDB4NzMyRiwgMHg3MzI5LCAweDczMjUsIDB4NzMzRSwKKyAgICAweDczNEUsIDB4NzM0RiwgMHg5RUQ4LCAweDczNTcsIDB4NzM2QSwgMHg3MzY4LCAweDczNzAsIDB4NzM3OCwgMHg3Mzc1LAorICAgIDB4NzM3QiwgMHg3MzdBLCAweDczQzgsIDB4NzNCMywgMHg3M0NFLCAweDczQkIsIDB4NzNDMCwgMHg3M0U1LCAweDczRUUsCisgICAgMHg3M0RFLCAweDc0QTIsIDB4NzQwNSwgMHg3NDZGLCAweDc0MjUsIDB4NzNGOCwgMHg3NDMyLCAweDc0M0EsIDB4NzQ1NSwKKyAgICAweDc0M0YsIDB4NzQ1RiwgMHg3NDU5LCAweDc0NDEsIDB4NzQ1QywgMHg3NDY5LCAweDc0NzAsIDB4NzQ2MywgMHg3NDZBLAorICAgIDB4NzQ3NiwgMHg3NDdFLCAweDc0OEIsIDB4NzQ5RSwgMHg3NEE3LCAweDc0Q0EsIDB4NzRDRiwgMHg3NEQ0LCAweDczRjEsCisgICAgMHg3NEUwLCAweDc0RTMsIDB4NzRFNywgMHg3NEU5LCAweDc0RUUsIDB4NzRGMiwgMHg3NEYwLCAweDc0RjEsIDB4NzRGOCwKKyAgICAweDc0RjcsIDB4NzUwNCwgMHg3NTAzLCAweDc1MDUsIDB4NzUwQywgMHg3NTBFLCAweDc1MEQsIDB4NzUxNSwgMHg3NTEzLAorICAgIDB4NzUxRSwgMHg3NTI2LCAweDc1MkMsIDB4NzUzQywgMHg3NTQ0LCAweDc1NEQsIDB4NzU0QSwgMHg3NTQ5LCAweDc1NUIsCisgICAgMHg3NTQ2LCAweDc1NUEsIDB4NzU2OSwgMHg3NTY0LCAweDc1NjcsIDB4NzU2QiwgMHg3NTZELCAweDc1NzgsIDB4NzU3NiwKKyAgICAweDc1ODYsIDB4NzU4NywgMHg3NTc0LCAweDc1OEEsIDB4NzU4OSwgMHg3NTgyLCAweDc1OTQsIDB4NzU5QSwgMHg3NTlELAorICAgIDB4NzVBNSwgMHg3NUEzLCAweDc1QzIsIDB4NzVCMywgMHg3NUMzLCAweDc1QjUsIDB4NzVCRCwgMHg3NUI4LCAweDc1QkMsCisgICAgMHg3NUIxLCAweDc1Q0QsIDB4NzVDQSwgMHg3NUQyLCAweDc1RDksIDB4NzVFMywgMHg3NURFLCAweDc1RkUsIDB4NzVGRiwKKyAgICAweDc1RkMsIDB4NzYwMSwgMHg3NUYwLCAweDc1RkEsIDB4NzVGMiwgMHg3NUYzLCAweDc2MEIsIDB4NzYwRCwgMHg3NjA5LAorICAgIDB4NzYxRiwgMHg3NjI3LCAweDc2MjAsIDB4NzYyMSwgMHg3NjIyLCAweDc2MjQsIDB4NzYzNCwgMHg3NjMwLCAweDc2M0IsCisgICAgMHg3NjQ3LCAweDc2NDgsIDB4NzY0NiwgMHg3NjVDLCAweDc2NTgsIDB4NzY2MSwgMHg3NjYyLCAweDc2NjgsIDB4NzY2OSwKKyAgICAweDc2NkEsIDB4NzY2NywgMHg3NjZDLCAweDc2NzAsIDB4NzY3MiwgMHg3Njc2LCAweDc2NzgsIDB4NzY3QywgMHg3NjgwLAorICAgIDB4NzY4MywgMHg3Njg4LCAweDc2OEIsIDB4NzY4RSwgMHg3Njk2LCAweDc2OTMsIDB4NzY5OSwgMHg3NjlBLCAweDc2QjAsCisgICAgMHg3NkI0LCAweDc2QjgsIDB4NzZCOSwgMHg3NkJBLCAweDc2QzIsIDB4NzZDRCwgMHg3NkQ2LCAweDc2RDIsIDB4NzZERSwKKyAgICAweDc2RTEsIDB4NzZFNSwgMHg3NkU3LCAweDc2RUEsIDB4ODYyRiwgMHg3NkZCLCAweDc3MDgsIDB4NzcwNywgMHg3NzA0LAorICAgIDB4NzcyOSwgMHg3NzI0LCAweDc3MUUsIDB4NzcyNSwgMHg3NzI2LCAweDc3MUIsIDB4NzczNywgMHg3NzM4LCAweDc3NDcsCisgICAgMHg3NzVBLCAweDc3NjgsIDB4Nzc2QiwgMHg3NzVCLCAweDc3NjUsIDB4Nzc3RiwgMHg3NzdFLCAweDc3NzksIDB4Nzc4RSwKKyAgICAweDc3OEIsIDB4Nzc5MSwgMHg3N0EwLCAweDc3OUUsIDB4NzdCMCwgMHg3N0I2LCAweDc3QjksIDB4NzdCRiwgMHg3N0JDLAorICAgIDB4NzdCRCwgMHg3N0JCLCAweDc3QzcsIDB4NzdDRCwgMHg3N0Q3LCAweDc3REEsIDB4NzdEQywgMHg3N0UzLCAweDc3RUUsCisgICAgMHg3N0ZDLCAweDc4MEMsIDB4NzgxMiwgMHg3OTI2LCAweDc4MjAsIDB4NzkyQSwgMHg3ODQ1LCAweDc4OEUsIDB4Nzg3NCwKKyAgICAweDc4ODYsIDB4Nzg3QywgMHg3ODlBLCAweDc4OEMsIDB4NzhBMywgMHg3OEI1LCAweDc4QUEsIDB4NzhBRiwgMHg3OEQxLAorICAgIDB4NzhDNiwgMHg3OENCLCAweDc4RDQsIDB4NzhCRSwgMHg3OEJDLCAweDc4QzUsIDB4NzhDQSwgMHg3OEVDLCAweDc4RTcsCisgICAgMHg3OERBLCAweDc4RkQsIDB4NzhGNCwgMHg3OTA3LCAweDc5MTIsIDB4NzkxMSwgMHg3OTE5LCAweDc5MkMsIDB4NzkyQiwKKyAgICAweDc5NDAsIDB4Nzk2MCwgMHg3OTU3LCAweDc5NUYsIDB4Nzk1QSwgMHg3OTU1LCAweDc5NTMsIDB4Nzk3QSwgMHg3OTdGLAorICAgIDB4Nzk4QSwgMHg3OTlELCAweDc5QTcsIDB4OUY0QiwgMHg3OUFBLCAweDc5QUUsIDB4NzlCMywgMHg3OUI5LCAweDc5QkEsCisgICAgMHg3OUM5LCAweDc5RDUsIDB4NzlFNywgMHg3OUVDLCAweDc5RTEsIDB4NzlFMywgMHg3QTA4LCAweDdBMEQsIDB4N0ExOCwKKyAgICAweDdBMTksIDB4N0EyMCwgMHg3QTFGLCAweDc5ODAsIDB4N0EzMSwgMHg3QTNCLCAweDdBM0UsIDB4N0EzNywgMHg3QTQzLAorICAgIDB4N0E1NywgMHg3QTQ5LCAweDdBNjEsIDB4N0E2MiwgMHg3QTY5LCAweDlGOUQsIDB4N0E3MCwgMHg3QTc5LCAweDdBN0QsCisgICAgMHg3QTg4LCAweDdBOTcsIDB4N0E5NSwgMHg3QTk4LCAweDdBOTYsIDB4N0FBOSwgMHg3QUM4LCAweDdBQjAsIDB4N0FCNiwKKyAgICAweDdBQzUsIDB4N0FDNCwgMHg3QUJGLCAweDkwODMsIDB4N0FDNywgMHg3QUNBLCAweDdBQ0QsIDB4N0FDRiwgMHg3QUQ1LAorICAgIDB4N0FEMywgMHg3QUQ5LCAweDdBREEsIDB4N0FERCwgMHg3QUUxLCAweDdBRTIsIDB4N0FFNiwgMHg3QUVELCAweDdBRjAsCisgICAgMHg3QjAyLCAweDdCMEYsIDB4N0IwQSwgMHg3QjA2LCAweDdCMzMsIDB4N0IxOCwgMHg3QjE5LCAweDdCMUUsIDB4N0IzNSwKKyAgICAweDdCMjgsIDB4N0IzNiwgMHg3QjUwLCAweDdCN0EsIDB4N0IwNCwgMHg3QjRELCAweDdCMEIsIDB4N0I0QywgMHg3QjQ1LAorICAgIDB4N0I3NSwgMHg3QjY1LCAweDdCNzQsIDB4N0I2NywgMHg3QjcwLCAweDdCNzEsIDB4N0I2QywgMHg3QjZFLCAweDdCOUQsCisgICAgMHg3Qjk4LCAweDdCOUYsIDB4N0I4RCwgMHg3QjlDLCAweDdCOUEsIDB4N0I4QiwgMHg3QjkyLCAweDdCOEYsIDB4N0I1RCwKKyAgICAweDdCOTksIDB4N0JDQiwgMHg3QkMxLCAweDdCQ0MsIDB4N0JDRiwgMHg3QkI0LCAweDdCQzYsIDB4N0JERCwgMHg3QkU5LAorICAgIDB4N0MxMSwgMHg3QzE0LCAweDdCRTYsIDB4N0JFNSwgMHg3QzYwLCAweDdDMDAsIDB4N0MwNywgMHg3QzEzLCAweDdCRjMsCisgICAgMHg3QkY3LCAweDdDMTcsIDB4N0MwRCwgMHg3QkY2LCAweDdDMjMsIDB4N0MyNywgMHg3QzJBLCAweDdDMUYsIDB4N0MzNywKKyAgICAweDdDMkIsIDB4N0MzRCwgMHg3QzRDLCAweDdDNDMsIDB4N0M1NCwgMHg3QzRGLCAweDdDNDAsIDB4N0M1MCwgMHg3QzU4LAorICAgIDB4N0M1RiwgMHg3QzY0LCAweDdDNTYsIDB4N0M2NSwgMHg3QzZDLCAweDdDNzUsIDB4N0M4MywgMHg3QzkwLCAweDdDQTQsCisgICAgMHg3Q0FELCAweDdDQTIsIDB4N0NBQiwgMHg3Q0ExLCAweDdDQTgsIDB4N0NCMywgMHg3Q0IyLCAweDdDQjEsIDB4N0NBRSwKKyAgICAweDdDQjksIDB4N0NCRCwgMHg3Q0MwLCAweDdDQzUsIDB4N0NDMiwgMHg3Q0Q4LCAweDdDRDIsIDB4N0NEQywgMHg3Q0UyLAorICAgIDB4OUIzQiwgMHg3Q0VGLCAweDdDRjIsIDB4N0NGNCwgMHg3Q0Y2LCAweDdDRkEsIDB4N0QwNiwgMHg3RDAyLCAweDdEMUMsCisgICAgMHg3RDE1LCAweDdEMEEsIDB4N0Q0NSwgMHg3RDRCLCAweDdEMkUsIDB4N0QzMiwgMHg3RDNGLCAweDdEMzUsIDB4N0Q0NiwKKyAgICAweDdENzMsIDB4N0Q1NiwgMHg3RDRFLCAweDdENzIsIDB4N0Q2OCwgMHg3RDZFLCAweDdENEYsIDB4N0Q2MywgMHg3RDkzLAorICAgIDB4N0Q4OSwgMHg3RDVCLCAweDdEOEYsIDB4N0Q3RCwgMHg3RDlCLCAweDdEQkEsIDB4N0RBRSwgMHg3REEzLCAweDdEQjUsCisgICAgMHg3REM3LCAweDdEQkQsIDB4N0RBQiwgMHg3RTNELCAweDdEQTIsIDB4N0RBRiwgMHg3RERDLCAweDdEQjgsIDB4N0Q5RiwKKyAgICAweDdEQjAsIDB4N0REOCwgMHg3RERELCAweDdERTQsIDB4N0RERSwgMHg3REZCLCAweDdERjIsIDB4N0RFMSwgMHg3RTA1LAorICAgIDB4N0UwQSwgMHg3RTIzLCAweDdFMjEsIDB4N0UxMiwgMHg3RTMxLCAweDdFMUYsIDB4N0UwOSwgMHg3RTBCLCAweDdFMjIsCisgICAgMHg3RTQ2LCAweDdFNjYsIDB4N0UzQiwgMHg3RTM1LCAweDdFMzksIDB4N0U0MywgMHg3RTM3LCAweDdFMzIsIDB4N0UzQSwKKyAgICAweDdFNjcsIDB4N0U1RCwgMHg3RTU2LCAweDdFNUUsIDB4N0U1OSwgMHg3RTVBLCAweDdFNzksIDB4N0U2QSwgMHg3RTY5LAorICAgIDB4N0U3QywgMHg3RTdCLCAweDdFODMsIDB4N0RENSwgMHg3RTdELCAweDhGQUUsIDB4N0U3RiwgMHg3RTg4LCAweDdFODksCisgICAgMHg3RThDLCAweDdFOTIsIDB4N0U5MCwgMHg3RTkzLCAweDdFOTQsIDB4N0U5NiwgMHg3RThFLCAweDdFOUIsIDB4N0U5QywKKyAgICAweDdGMzgsIDB4N0YzQSwgMHg3RjQ1LCAweDdGNEMsIDB4N0Y0RCwgMHg3RjRFLCAweDdGNTAsIDB4N0Y1MSwgMHg3RjU1LAorICAgIDB4N0Y1NCwgMHg3RjU4LCAweDdGNUYsIDB4N0Y2MCwgMHg3RjY4LCAweDdGNjksIDB4N0Y2NywgMHg3Rjc4LCAweDdGODIsCisgICAgMHg3Rjg2LCAweDdGODMsIDB4N0Y4OCwgMHg3Rjg3LCAweDdGOEMsIDB4N0Y5NCwgMHg3RjlFLCAweDdGOUQsIDB4N0Y5QSwKKyAgICAweDdGQTMsIDB4N0ZBRiwgMHg3RkIyLCAweDdGQjksIDB4N0ZBRSwgMHg3RkI2LCAweDdGQjgsIDB4OEI3MSwgMHg3RkM1LAorICAgIDB4N0ZDNiwgMHg3RkNBLCAweDdGRDUsIDB4N0ZENCwgMHg3RkUxLCAweDdGRTYsIDB4N0ZFOSwgMHg3RkYzLCAweDdGRjksCisgICAgMHg5OERDLCAweDgwMDYsIDB4ODAwNCwgMHg4MDBCLCAweDgwMTIsIDB4ODAxOCwgMHg4MDE5LCAweDgwMUMsIDB4ODAyMSwKKyAgICAweDgwMjgsIDB4ODAzRiwgMHg4MDNCLCAweDgwNEEsIDB4ODA0NiwgMHg4MDUyLCAweDgwNTgsIDB4ODA1QSwgMHg4MDVGLAorICAgIDB4ODA2MiwgMHg4MDY4LCAweDgwNzMsIDB4ODA3MiwgMHg4MDcwLCAweDgwNzYsIDB4ODA3OSwgMHg4MDdELCAweDgwN0YsCisgICAgMHg4MDg0LCAweDgwODYsIDB4ODA4NSwgMHg4MDlCLCAweDgwOTMsIDB4ODA5QSwgMHg4MEFELCAweDUxOTAsIDB4ODBBQywKKyAgICAweDgwREIsIDB4ODBFNSwgMHg4MEQ5LCAweDgwREQsIDB4ODBDNCwgMHg4MERBLCAweDgwRDYsIDB4ODEwOSwgMHg4MEVGLAorICAgIDB4ODBGMSwgMHg4MTFCLCAweDgxMjksIDB4ODEyMywgMHg4MTJGLCAweDgxNEIsIDB4OTY4QiwgMHg4MTQ2LCAweDgxM0UsCisgICAgMHg4MTUzLCAweDgxNTEsIDB4ODBGQywgMHg4MTcxLCAweDgxNkUsIDB4ODE2NSwgMHg4MTY2LCAweDgxNzQsIDB4ODE4MywKKyAgICAweDgxODgsIDB4ODE4QSwgMHg4MTgwLCAweDgxODIsIDB4ODFBMCwgMHg4MTk1LCAweDgxQTQsIDB4ODFBMywgMHg4MTVGLAorICAgIDB4ODE5MywgMHg4MUE5LCAweDgxQjAsIDB4ODFCNSwgMHg4MUJFLCAweDgxQjgsIDB4ODFCRCwgMHg4MUMwLCAweDgxQzIsCisgICAgMHg4MUJBLCAweDgxQzksIDB4ODFDRCwgMHg4MUQxLCAweDgxRDksIDB4ODFEOCwgMHg4MUM4LCAweDgxREEsIDB4ODFERiwKKyAgICAweDgxRTAsIDB4ODFFNywgMHg4MUZBLCAweDgxRkIsIDB4ODFGRSwgMHg4MjAxLCAweDgyMDIsIDB4ODIwNSwgMHg4MjA3LAorICAgIDB4ODIwQSwgMHg4MjBELCAweDgyMTAsIDB4ODIxNiwgMHg4MjI5LCAweDgyMkIsIDB4ODIzOCwgMHg4MjMzLCAweDgyNDAsCisgICAgMHg4MjU5LCAweDgyNTgsIDB4ODI1RCwgMHg4MjVBLCAweDgyNUYsIDB4ODI2NCwgMHg4MjYyLCAweDgyNjgsIDB4ODI2QSwKKyAgICAweDgyNkIsIDB4ODIyRSwgMHg4MjcxLCAweDgyNzcsIDB4ODI3OCwgMHg4MjdFLCAweDgyOEQsIDB4ODI5MiwgMHg4MkFCLAorICAgIDB4ODI5RiwgMHg4MkJCLCAweDgyQUMsIDB4ODJFMSwgMHg4MkUzLCAweDgyREYsIDB4ODJEMiwgMHg4MkY0LCAweDgyRjMsCisgICAgMHg4MkZBLCAweDgzOTMsIDB4ODMwMywgMHg4MkZCLCAweDgyRjksIDB4ODJERSwgMHg4MzA2LCAweDgyREMsIDB4ODMwOSwKKyAgICAweDgyRDksIDB4ODMzNSwgMHg4MzM0LCAweDgzMTYsIDB4ODMzMiwgMHg4MzMxLCAweDgzNDAsIDB4ODMzOSwgMHg4MzUwLAorICAgIDB4ODM0NSwgMHg4MzJGLCAweDgzMkIsIDB4ODMxNywgMHg4MzE4LCAweDgzODUsIDB4ODM5QSwgMHg4M0FBLCAweDgzOUYsCisgICAgMHg4M0EyLCAweDgzOTYsIDB4ODMyMywgMHg4MzhFLCAweDgzODcsIDB4ODM4QSwgMHg4MzdDLCAweDgzQjUsIDB4ODM3MywKKyAgICAweDgzNzUsIDB4ODNBMCwgMHg4Mzg5LCAweDgzQTgsIDB4ODNGNCwgMHg4NDEzLCAweDgzRUIsIDB4ODNDRSwgMHg4M0ZELAorICAgIDB4ODQwMywgMHg4M0Q4LCAweDg0MEIsIDB4ODNDMSwgMHg4M0Y3LCAweDg0MDcsIDB4ODNFMCwgMHg4M0YyLCAweDg0MEQsCisgICAgMHg4NDIyLCAweDg0MjAsIDB4ODNCRCwgMHg4NDM4LCAweDg1MDYsIDB4ODNGQiwgMHg4NDZELCAweDg0MkEsIDB4ODQzQywKKyAgICAweDg1NUEsIDB4ODQ4NCwgMHg4NDc3LCAweDg0NkIsIDB4ODRBRCwgMHg4NDZFLCAweDg0ODIsIDB4ODQ2OSwgMHg4NDQ2LAorICAgIDB4ODQyQywgMHg4NDZGLCAweDg0NzksIDB4ODQzNSwgMHg4NENBLCAweDg0NjIsIDB4ODRCOSwgMHg4NEJGLCAweDg0OUYsCisgICAgMHg4NEQ5LCAweDg0Q0QsIDB4ODRCQiwgMHg4NERBLCAweDg0RDAsIDB4ODRDMSwgMHg4NEM2LCAweDg0RDYsIDB4ODRBMSwKKyAgICAweDg1MjEsIDB4ODRGRiwgMHg4NEY0LCAweDg1MTcsIDB4ODUxOCwgMHg4NTJDLCAweDg1MUYsIDB4ODUxNSwgMHg4NTE0LAorICAgIDB4ODRGQywgMHg4NTQwLCAweDg1NjMsIDB4ODU1OCwgMHg4NTQ4LCAweDg1NDEsIDB4ODYwMiwgMHg4NTRCLCAweDg1NTUsCisgICAgMHg4NTgwLCAweDg1QTQsIDB4ODU4OCwgMHg4NTkxLCAweDg1OEEsIDB4ODVBOCwgMHg4NTZELCAweDg1OTQsIDB4ODU5QiwKKyAgICAweDg1RUEsIDB4ODU4NywgMHg4NTlDLCAweDg1NzcsIDB4ODU3RSwgMHg4NTkwLCAweDg1QzksIDB4ODVCQSwgMHg4NUNGLAorICAgIDB4ODVCOSwgMHg4NUQwLCAweDg1RDUsIDB4ODVERCwgMHg4NUU1LCAweDg1REMsIDB4ODVGOSwgMHg4NjBBLCAweDg2MTMsCisgICAgMHg4NjBCLCAweDg1RkUsIDB4ODVGQSwgMHg4NjA2LCAweDg2MjIsIDB4ODYxQSwgMHg4NjMwLCAweDg2M0YsIDB4ODY0RCwKKyAgICAweDRFNTUsIDB4ODY1NCwgMHg4NjVGLCAweDg2NjcsIDB4ODY3MSwgMHg4NjkzLCAweDg2QTMsIDB4ODZBOSwgMHg4NkFBLAorICAgIDB4ODY4QiwgMHg4NjhDLCAweDg2QjYsIDB4ODZBRiwgMHg4NkM0LCAweDg2QzYsIDB4ODZCMCwgMHg4NkM5LCAweDg4MjMsCisgICAgMHg4NkFCLCAweDg2RDQsIDB4ODZERSwgMHg4NkU5LCAweDg2RUMsIDB4ODZERiwgMHg4NkRCLCAweDg2RUYsIDB4ODcxMiwKKyAgICAweDg3MDYsIDB4ODcwOCwgMHg4NzAwLCAweDg3MDMsIDB4ODZGQiwgMHg4NzExLCAweDg3MDksIDB4ODcwRCwgMHg4NkY5LAorICAgIDB4ODcwQSwgMHg4NzM0LCAweDg3M0YsIDB4ODczNywgMHg4NzNCLCAweDg3MjUsIDB4ODcyOSwgMHg4NzFBLCAweDg3NjAsCisgICAgMHg4NzVGLCAweDg3NzgsIDB4ODc0QywgMHg4NzRFLCAweDg3NzQsIDB4ODc1NywgMHg4NzY4LCAweDg3NkUsIDB4ODc1OSwKKyAgICAweDg3NTMsIDB4ODc2MywgMHg4NzZBLCAweDg4MDUsIDB4ODdBMiwgMHg4NzlGLCAweDg3ODIsIDB4ODdBRiwgMHg4N0NCLAorICAgIDB4ODdCRCwgMHg4N0MwLCAweDg3RDAsIDB4OTZENiwgMHg4N0FCLCAweDg3QzQsIDB4ODdCMywgMHg4N0M3LCAweDg3QzYsCisgICAgMHg4N0JCLCAweDg3RUYsIDB4ODdGMiwgMHg4N0UwLCAweDg4MEYsIDB4ODgwRCwgMHg4N0ZFLCAweDg3RjYsIDB4ODdGNywKKyAgICAweDg4MEUsIDB4ODdEMiwgMHg4ODExLCAweDg4MTYsIDB4ODgxNSwgMHg4ODIyLCAweDg4MjEsIDB4ODgzMSwgMHg4ODM2LAorICAgIDB4ODgzOSwgMHg4ODI3LCAweDg4M0IsIDB4ODg0NCwgMHg4ODQyLCAweDg4NTIsIDB4ODg1OSwgMHg4ODVFLCAweDg4NjIsCisgICAgMHg4ODZCLCAweDg4ODEsIDB4ODg3RSwgMHg4ODlFLCAweDg4NzUsIDB4ODg3RCwgMHg4OEI1LCAweDg4NzIsIDB4ODg4MiwKKyAgICAweDg4OTcsIDB4ODg5MiwgMHg4OEFFLCAweDg4OTksIDB4ODhBMiwgMHg4ODhELCAweDg4QTQsIDB4ODhCMCwgMHg4OEJGLAorICAgIDB4ODhCMSwgMHg4OEMzLCAweDg4QzQsIDB4ODhENCwgMHg4OEQ4LCAweDg4RDksIDB4ODhERCwgMHg4OEY5LCAweDg5MDIsCisgICAgMHg4OEZDLCAweDg4RjQsIDB4ODhFOCwgMHg4OEYyLCAweDg5MDQsIDB4ODkwQywgMHg4OTBBLCAweDg5MTMsIDB4ODk0MywKKyAgICAweDg5MUUsIDB4ODkyNSwgMHg4OTJBLCAweDg5MkIsIDB4ODk0MSwgMHg4OTQ0LCAweDg5M0IsIDB4ODkzNiwgMHg4OTM4LAorICAgIDB4ODk0QywgMHg4OTFELCAweDg5NjAsIDB4ODk1RSwgMHg4OTY2LCAweDg5NjQsIDB4ODk2RCwgMHg4OTZBLCAweDg5NkYsCisgICAgMHg4OTc0LCAweDg5NzcsIDB4ODk3RSwgMHg4OTgzLCAweDg5ODgsIDB4ODk4QSwgMHg4OTkzLCAweDg5OTgsIDB4ODlBMSwKKyAgICAweDg5QTksIDB4ODlBNiwgMHg4OUFDLCAweDg5QUYsIDB4ODlCMiwgMHg4OUJBLCAweDg5QkQsIDB4ODlCRiwgMHg4OUMwLAorICAgIDB4ODlEQSwgMHg4OURDLCAweDg5REQsIDB4ODlFNywgMHg4OUY0LCAweDg5RjgsIDB4OEEwMywgMHg4QTE2LCAweDhBMTAsCisgICAgMHg4QTBDLCAweDhBMUIsIDB4OEExRCwgMHg4QTI1LCAweDhBMzYsIDB4OEE0MSwgMHg4QTVCLCAweDhBNTIsIDB4OEE0NiwKKyAgICAweDhBNDgsIDB4OEE3QywgMHg4QTZELCAweDhBNkMsIDB4OEE2MiwgMHg4QTg1LCAweDhBODIsIDB4OEE4NCwgMHg4QUE4LAorICAgIDB4OEFBMSwgMHg4QTkxLCAweDhBQTUsIDB4OEFBNiwgMHg4QTlBLCAweDhBQTMsIDB4OEFDNCwgMHg4QUNELCAweDhBQzIsCisgICAgMHg4QURBLCAweDhBRUIsIDB4OEFGMywgMHg4QUU3LCAweDhBRTQsIDB4OEFGMSwgMHg4QjE0LCAweDhBRTAsIDB4OEFFMiwKKyAgICAweDhBRjcsIDB4OEFERSwgMHg4QURCLCAweDhCMEMsIDB4OEIwNywgMHg4QjFBLCAweDhBRTEsIDB4OEIxNiwgMHg4QjEwLAorICAgIDB4OEIxNywgMHg4QjIwLCAweDhCMzMsIDB4OTdBQiwgMHg4QjI2LCAweDhCMkIsIDB4OEIzRSwgMHg4QjI4LCAweDhCNDEsCisgICAgMHg4QjRDLCAweDhCNEYsIDB4OEI0RSwgMHg4QjQ5LCAweDhCNTYsIDB4OEI1QiwgMHg4QjVBLCAweDhCNkIsIDB4OEI1RiwKKyAgICAweDhCNkMsIDB4OEI2RiwgMHg4Qjc0LCAweDhCN0QsIDB4OEI4MCwgMHg4QjhDLCAweDhCOEUsIDB4OEI5MiwgMHg4QjkzLAorICAgIDB4OEI5NiwgMHg4Qjk5LCAweDhCOUEsIDB4OEMzQSwgMHg4QzQxLCAweDhDM0YsIDB4OEM0OCwgMHg4QzRDLCAweDhDNEUsCisgICAgMHg4QzUwLCAweDhDNTUsIDB4OEM2MiwgMHg4QzZDLCAweDhDNzgsIDB4OEM3QSwgMHg4QzgyLCAweDhDODksIDB4OEM4NSwKKyAgICAweDhDOEEsIDB4OEM4RCwgMHg4QzhFLCAweDhDOTQsIDB4OEM3QywgMHg4Qzk4LCAweDYyMUQsIDB4OENBRCwgMHg4Q0FBLAorICAgIDB4OENCRCwgMHg4Q0IyLCAweDhDQjMsIDB4OENBRSwgMHg4Q0I2LCAweDhDQzgsIDB4OENDMSwgMHg4Q0U0LCAweDhDRTMsCisgICAgMHg4Q0RBLCAweDhDRkQsIDB4OENGQSwgMHg4Q0ZCLCAweDhEMDQsIDB4OEQwNSwgMHg4RDBBLCAweDhEMDcsIDB4OEQwRiwKKyAgICAweDhEMEQsIDB4OEQxMCwgMHg5RjRFLCAweDhEMTMsIDB4OENDRCwgMHg4RDE0LCAweDhEMTYsIDB4OEQ2NywgMHg4RDZELAorICAgIDB4OEQ3MSwgMHg4RDczLCAweDhEODEsIDB4OEQ5OSwgMHg4REMyLCAweDhEQkUsIDB4OERCQSwgMHg4RENGLCAweDhEREEsCisgICAgMHg4REQ2LCAweDhEQ0MsIDB4OEREQiwgMHg4RENCLCAweDhERUEsIDB4OERFQiwgMHg4RERGLCAweDhERTMsIDB4OERGQywKKyAgICAweDhFMDgsIDB4OEUwOSwgMHg4REZGLCAweDhFMUQsIDB4OEUxRSwgMHg4RTEwLCAweDhFMUYsIDB4OEU0MiwgMHg4RTM1LAorICAgIDB4OEUzMCwgMHg4RTM0LCAweDhFNEEsIDB4OEU0NywgMHg4RTQ5LCAweDhFNEMsIDB4OEU1MCwgMHg4RTQ4LCAweDhFNTksCisgICAgMHg4RTY0LCAweDhFNjAsIDB4OEUyQSwgMHg4RTYzLCAweDhFNTUsIDB4OEU3NiwgMHg4RTcyLCAweDhFN0MsIDB4OEU4MSwKKyAgICAweDhFODcsIDB4OEU4NSwgMHg4RTg0LCAweDhFOEIsIDB4OEU4QSwgMHg4RTkzLCAweDhFOTEsIDB4OEU5NCwgMHg4RTk5LAorICAgIDB4OEVBQSwgMHg4RUExLCAweDhFQUMsIDB4OEVCMCwgMHg4RUM2LCAweDhFQjEsIDB4OEVCRSwgMHg4RUM1LCAweDhFQzgsCisgICAgMHg4RUNCLCAweDhFREIsIDB4OEVFMywgMHg4RUZDLCAweDhFRkIsIDB4OEVFQiwgMHg4RUZFLCAweDhGMEEsIDB4OEYwNSwKKyAgICAweDhGMTUsIDB4OEYxMiwgMHg4RjE5LCAweDhGMTMsIDB4OEYxQywgMHg4RjFGLCAweDhGMUIsIDB4OEYwQywgMHg4RjI2LAorICAgIDB4OEYzMywgMHg4RjNCLCAweDhGMzksIDB4OEY0NSwgMHg4RjQyLCAweDhGM0UsIDB4OEY0QywgMHg4RjQ5LCAweDhGNDYsCisgICAgMHg4RjRFLCAweDhGNTcsIDB4OEY1QywgMHg4RjYyLCAweDhGNjMsIDB4OEY2NCwgMHg4RjlDLCAweDhGOUYsIDB4OEZBMywKKyAgICAweDhGQUQsIDB4OEZBRiwgMHg4RkI3LCAweDhGREEsIDB4OEZFNSwgMHg4RkUyLCAweDhGRUEsIDB4OEZFRiwgMHg5MDg3LAorICAgIDB4OEZGNCwgMHg5MDA1LCAweDhGRjksIDB4OEZGQSwgMHg5MDExLCAweDkwMTUsIDB4OTAyMSwgMHg5MDBELCAweDkwMUUsCisgICAgMHg5MDE2LCAweDkwMEIsIDB4OTAyNywgMHg5MDM2LCAweDkwMzUsIDB4OTAzOSwgMHg4RkY4LCAweDkwNEYsIDB4OTA1MCwKKyAgICAweDkwNTEsIDB4OTA1MiwgMHg5MDBFLCAweDkwNDksIDB4OTAzRSwgMHg5MDU2LCAweDkwNTgsIDB4OTA1RSwgMHg5MDY4LAorICAgIDB4OTA2RiwgMHg5MDc2LCAweDk2QTgsIDB4OTA3MiwgMHg5MDgyLCAweDkwN0QsIDB4OTA4MSwgMHg5MDgwLCAweDkwOEEsCisgICAgMHg5MDg5LCAweDkwOEYsIDB4OTBBOCwgMHg5MEFGLCAweDkwQjEsIDB4OTBCNSwgMHg5MEUyLCAweDkwRTQsIDB4NjI0OCwKKyAgICAweDkwREIsIDB4OTEwMiwgMHg5MTEyLCAweDkxMTksIDB4OTEzMiwgMHg5MTMwLCAweDkxNEEsIDB4OTE1NiwgMHg5MTU4LAorICAgIDB4OTE2MywgMHg5MTY1LCAweDkxNjksIDB4OTE3MywgMHg5MTcyLCAweDkxOEIsIDB4OTE4OSwgMHg5MTgyLCAweDkxQTIsCisgICAgMHg5MUFCLCAweDkxQUYsIDB4OTFBQSwgMHg5MUI1LCAweDkxQjQsIDB4OTFCQSwgMHg5MUMwLCAweDkxQzEsIDB4OTFDOSwKKyAgICAweDkxQ0IsIDB4OTFEMCwgMHg5MUQ2LCAweDkxREYsIDB4OTFFMSwgMHg5MURCLCAweDkxRkMsIDB4OTFGNSwgMHg5MUY2LAorICAgIDB4OTIxRSwgMHg5MUZGLCAweDkyMTQsIDB4OTIyQywgMHg5MjE1LCAweDkyMTEsIDB4OTI1RSwgMHg5MjU3LCAweDkyNDUsCisgICAgMHg5MjQ5LCAweDkyNjQsIDB4OTI0OCwgMHg5Mjk1LCAweDkyM0YsIDB4OTI0QiwgMHg5MjUwLCAweDkyOUMsIDB4OTI5NiwKKyAgICAweDkyOTMsIDB4OTI5QiwgMHg5MjVBLCAweDkyQ0YsIDB4OTJCOSwgMHg5MkI3LCAweDkyRTksIDB4OTMwRiwgMHg5MkZBLAorICAgIDB4OTM0NCwgMHg5MzJFLCAweDkzMTksIDB4OTMyMiwgMHg5MzFBLCAweDkzMjMsIDB4OTMzQSwgMHg5MzM1LCAweDkzM0IsCisgICAgMHg5MzVDLCAweDkzNjAsIDB4OTM3QywgMHg5MzZFLCAweDkzNTYsIDB4OTNCMCwgMHg5M0FDLCAweDkzQUQsIDB4OTM5NCwKKyAgICAweDkzQjksIDB4OTNENiwgMHg5M0Q3LCAweDkzRTgsIDB4OTNFNSwgMHg5M0Q4LCAweDkzQzMsIDB4OTNERCwgMHg5M0QwLAorICAgIDB4OTNDOCwgMHg5M0U0LCAweDk0MUEsIDB4OTQxNCwgMHg5NDEzLCAweDk0MDMsIDB4OTQwNywgMHg5NDEwLCAweDk0MzYsCisgICAgMHg5NDJCLCAweDk0MzUsIDB4OTQyMSwgMHg5NDNBLCAweDk0NDEsIDB4OTQ1MiwgMHg5NDQ0LCAweDk0NUIsIDB4OTQ2MCwKKyAgICAweDk0NjIsIDB4OTQ1RSwgMHg5NDZBLCAweDkyMjksIDB4OTQ3MCwgMHg5NDc1LCAweDk0NzcsIDB4OTQ3RCwgMHg5NDVBLAorICAgIDB4OTQ3QywgMHg5NDdFLCAweDk0ODEsIDB4OTQ3RiwgMHg5NTgyLCAweDk1ODcsIDB4OTU4QSwgMHg5NTk0LCAweDk1OTYsCisgICAgMHg5NTk4LCAweDk1OTksIDB4OTVBMCwgMHg5NUE4LCAweDk1QTcsIDB4OTVBRCwgMHg5NUJDLCAweDk1QkIsIDB4OTVCOSwKKyAgICAweDk1QkUsIDB4OTVDQSwgMHg2RkY2LCAweDk1QzMsIDB4OTVDRCwgMHg5NUNDLCAweDk1RDUsIDB4OTVENCwgMHg5NUQ2LAorICAgIDB4OTVEQywgMHg5NUUxLCAweDk1RTUsIDB4OTVFMiwgMHg5NjIxLCAweDk2MjgsIDB4OTYyRSwgMHg5NjJGLCAweDk2NDIsCisgICAgMHg5NjRDLCAweDk2NEYsIDB4OTY0QiwgMHg5Njc3LCAweDk2NUMsIDB4OTY1RSwgMHg5NjVELCAweDk2NUYsIDB4OTY2NiwKKyAgICAweDk2NzIsIDB4OTY2QywgMHg5NjhELCAweDk2OTgsIDB4OTY5NSwgMHg5Njk3LCAweDk2QUEsIDB4OTZBNywgMHg5NkIxLAorICAgIDB4OTZCMiwgMHg5NkIwLCAweDk2QjQsIDB4OTZCNiwgMHg5NkI4LCAweDk2QjksIDB4OTZDRSwgMHg5NkNCLCAweDk2QzksCisgICAgMHg5NkNELCAweDg5NEQsIDB4OTZEQywgMHg5NzBELCAweDk2RDUsIDB4OTZGOSwgMHg5NzA0LCAweDk3MDYsIDB4OTcwOCwKKyAgICAweDk3MTMsIDB4OTcwRSwgMHg5NzExLCAweDk3MEYsIDB4OTcxNiwgMHg5NzE5LCAweDk3MjQsIDB4OTcyQSwgMHg5NzMwLAorICAgIDB4OTczOSwgMHg5NzNELCAweDk3M0UsIDB4OTc0NCwgMHg5NzQ2LCAweDk3NDgsIDB4OTc0MiwgMHg5NzQ5LCAweDk3NUMsCisgICAgMHg5NzYwLCAweDk3NjQsIDB4OTc2NiwgMHg5NzY4LCAweDUyRDIsIDB4OTc2QiwgMHg5NzcxLCAweDk3NzksIDB4OTc4NSwKKyAgICAweDk3N0MsIDB4OTc4MSwgMHg5NzdBLCAweDk3ODYsIDB4OTc4QiwgMHg5NzhGLCAweDk3OTAsIDB4OTc5QywgMHg5N0E4LAorICAgIDB4OTdBNiwgMHg5N0EzLCAweDk3QjMsIDB4OTdCNCwgMHg5N0MzLCAweDk3QzYsIDB4OTdDOCwgMHg5N0NCLCAweDk3REMsCisgICAgMHg5N0VELCAweDlGNEYsIDB4OTdGMiwgMHg3QURGLCAweDk3RjYsIDB4OTdGNSwgMHg5ODBGLCAweDk4MEMsIDB4OTgzOCwKKyAgICAweDk4MjQsIDB4OTgyMSwgMHg5ODM3LCAweDk4M0QsIDB4OTg0NiwgMHg5ODRGLCAweDk4NEIsIDB4OTg2QiwgMHg5ODZGLAorICAgIDB4OTg3MCwgMHg5ODcxLCAweDk4NzQsIDB4OTg3MywgMHg5OEFBLCAweDk4QUYsIDB4OThCMSwgMHg5OEI2LCAweDk4QzQsCisgICAgMHg5OEMzLCAweDk4QzYsIDB4OThFOSwgMHg5OEVCLCAweDk5MDMsIDB4OTkwOSwgMHg5OTEyLCAweDk5MTQsIDB4OTkxOCwKKyAgICAweDk5MjEsIDB4OTkxRCwgMHg5OTFFLCAweDk5MjQsIDB4OTkyMCwgMHg5OTJDLCAweDk5MkUsIDB4OTkzRCwgMHg5OTNFLAorICAgIDB4OTk0MiwgMHg5OTQ5LCAweDk5NDUsIDB4OTk1MCwgMHg5OTRCLCAweDk5NTEsIDB4OTk1MiwgMHg5OTRDLCAweDk5NTUsCisgICAgMHg5OTk3LCAweDk5OTgsIDB4OTlBNSwgMHg5OUFELCAweDk5QUUsIDB4OTlCQywgMHg5OURGLCAweDk5REIsIDB4OTlERCwKKyAgICAweDk5RDgsIDB4OTlEMSwgMHg5OUVELCAweDk5RUUsIDB4OTlGMSwgMHg5OUYyLCAweDk5RkIsIDB4OTlGOCwgMHg5QTAxLAorICAgIDB4OUEwRiwgMHg5QTA1LCAweDk5RTIsIDB4OUExOSwgMHg5QTJCLCAweDlBMzcsIDB4OUE0NSwgMHg5QTQyLCAweDlBNDAsCisgICAgMHg5QTQzLCAweDlBM0UsIDB4OUE1NSwgMHg5QTRELCAweDlBNUIsIDB4OUE1NywgMHg5QTVGLCAweDlBNjIsIDB4OUE2NSwKKyAgICAweDlBNjQsIDB4OUE2OSwgMHg5QTZCLCAweDlBNkEsIDB4OUFBRCwgMHg5QUIwLCAweDlBQkMsIDB4OUFDMCwgMHg5QUNGLAorICAgIDB4OUFEMSwgMHg5QUQzLCAweDlBRDQsIDB4OUFERSwgMHg5QURGLCAweDlBRTIsIDB4OUFFMywgMHg5QUU2LCAweDlBRUYsCisgICAgMHg5QUVCLCAweDlBRUUsIDB4OUFGNCwgMHg5QUYxLCAweDlBRjcsIDB4OUFGQiwgMHg5QjA2LCAweDlCMTgsIDB4OUIxQSwKKyAgICAweDlCMUYsIDB4OUIyMiwgMHg5QjIzLCAweDlCMjUsIDB4OUIyNywgMHg5QjI4LCAweDlCMjksIDB4OUIyQSwgMHg5QjJFLAorICAgIDB4OUIyRiwgMHg5QjMyLCAweDlCNDQsIDB4OUI0MywgMHg5QjRGLCAweDlCNEQsIDB4OUI0RSwgMHg5QjUxLCAweDlCNTgsCisgICAgMHg5Qjc0LCAweDlCOTMsIDB4OUI4MywgMHg5QjkxLCAweDlCOTYsIDB4OUI5NywgMHg5QjlGLCAweDlCQTAsIDB4OUJBOCwKKyAgICAweDlCQjQsIDB4OUJDMCwgMHg5QkNBLCAweDlCQjksIDB4OUJDNiwgMHg5QkNGLCAweDlCRDEsIDB4OUJEMiwgMHg5QkUzLAorICAgIDB4OUJFMiwgMHg5QkU0LCAweDlCRDQsIDB4OUJFMSwgMHg5QzNBLCAweDlCRjIsIDB4OUJGMSwgMHg5QkYwLCAweDlDMTUsCisgICAgMHg5QzE0LCAweDlDMDksIDB4OUMxMywgMHg5QzBDLCAweDlDMDYsIDB4OUMwOCwgMHg5QzEyLCAweDlDMEEsIDB4OUMwNCwKKyAgICAweDlDMkUsIDB4OUMxQiwgMHg5QzI1LCAweDlDMjQsIDB4OUMyMSwgMHg5QzMwLCAweDlDNDcsIDB4OUMzMiwgMHg5QzQ2LAorICAgIDB4OUMzRSwgMHg5QzVBLCAweDlDNjAsIDB4OUM2NywgMHg5Qzc2LCAweDlDNzgsIDB4OUNFNywgMHg5Q0VDLCAweDlDRjAsCisgICAgMHg5RDA5LCAweDlEMDgsIDB4OUNFQiwgMHg5RDAzLCAweDlEMDYsIDB4OUQyQSwgMHg5RDI2LCAweDlEQUYsIDB4OUQyMywKKyAgICAweDlEMUYsIDB4OUQ0NCwgMHg5RDE1LCAweDlEMTIsIDB4OUQ0MSwgMHg5RDNGLCAweDlEM0UsIDB4OUQ0NiwgMHg5RDQ4LAorICAgIDB4OUQ1RCwgMHg5RDVFLCAweDlENjQsIDB4OUQ1MSwgMHg5RDUwLCAweDlENTksIDB4OUQ3MiwgMHg5RDg5LCAweDlEODcsCisgICAgMHg5REFCLCAweDlENkYsIDB4OUQ3QSwgMHg5RDlBLCAweDlEQTQsIDB4OURBOSwgMHg5REIyLCAweDlEQzQsIDB4OURDMSwKKyAgICAweDlEQkIsIDB4OURCOCwgMHg5REJBLCAweDlEQzYsIDB4OURDRiwgMHg5REMyLCAweDlERDksIDB4OUREMywgMHg5REY4LAorICAgIDB4OURFNiwgMHg5REVELCAweDlERUYsIDB4OURGRCwgMHg5RTFBLCAweDlFMUIsIDB4OUUxRSwgMHg5RTc1LCAweDlFNzksCisgICAgMHg5RTdELCAweDlFODEsIDB4OUU4OCwgMHg5RThCLCAweDlFOEMsIDB4OUU5MiwgMHg5RTk1LCAweDlFOTEsIDB4OUU5RCwKKyAgICAweDlFQTUsIDB4OUVBOSwgMHg5RUI4LCAweDlFQUEsIDB4OUVBRCwgMHg5NzYxLCAweDlFQ0MsIDB4OUVDRSwgMHg5RUNGLAorICAgIDB4OUVEMCwgMHg5RUQ0LCAweDlFREMsIDB4OUVERSwgMHg5RURELCAweDlFRTAsIDB4OUVFNSwgMHg5RUU4LCAweDlFRUYsCisgICAgMHg5RUY0LCAweDlFRjYsIDB4OUVGNywgMHg5RUY5LCAweDlFRkIsIDB4OUVGQywgMHg5RUZELCAweDlGMDcsIDB4OUYwOCwKKyAgICAweDc2QjcsIDB4OUYxNSwgMHg5RjIxLCAweDlGMkMsIDB4OUYzRSwgMHg5RjRBLCAweDlGNTIsIDB4OUY1NCwgMHg5RjYzLAorICAgIDB4OUY1RiwgMHg5RjYwLCAweDlGNjEsIDB4OUY2NiwgMHg5RjY3LCAweDlGNkMsIDB4OUY2QSwgMHg5Rjc3LCAweDlGNzIsCisgICAgMHg5Rjc2LCAweDlGOTUsIDB4OUY5QywgMHg5RkEwLCAweDU4MkYsIDB4NjlDNywgMHg5MDU5LCAweDc0NjQsIDB4MjY0MiwKKyAgICAweDI1MDAsIDB4MjUwMSwgMHgyNTAyLCAweDI1MDMsIDB4MjUwNCwgMHgyNTA1LCAweDI1MDYsIDB4MjUwNywgMHgyNTA4LAorICAgIDB4MjUwOSwgMHgyNTBBLCAweDI1MEIsIDB4MjUwQywgMHgyNTBELCAweDI1MEUsIDB4MjUwRiwgMHgyNTEwLCAweDI1MTEsCisgICAgMHgyNTEyLCAweDI1MTMsIDB4MjUxNCwgMHgyNTE1LCAweDI1MTYsIDB4MjUxNywgMHgyNTE4LCAweDI1MTksIDB4MjUxQSwKKyAgICAweDI1MUIsIDB4MjUxQywgMHgyNTFELCAweDI1MUUsIDB4MjUxRiwgMHgyNTIwLCAweDI1MjEsIDB4MjUyMiwgMHgyNTIzLAorICAgIDB4MjUyNCwgMHgyNTI1LCAweDI1MjYsIDB4MjUyNywgMHgyNTI4LCAweDI1MjksIDB4MjUyQSwgMHgyNTJCLCAweDI1MkMsCisgICAgMHgyNTJELCAweDI1MkUsIDB4MjUyRiwgMHgyNTMwLCAweDI1MzEsIDB4MjUzMiwgMHgyNTMzLCAweDI1MzQsIDB4MjUzNSwKKyAgICAweDI1MzYsIDB4MjUzNywgMHgyNTM4LCAweDI1MzksIDB4MjUzQSwgMHgyNTNCLCAweDI1M0MsIDB4MjUzRCwgMHgyNTNFLAorICAgIDB4MjUzRiwgMHgyNTQwLCAweDI1NDEsIDB4MjU0MiwgMHgyNTQzLCAweDI1NDQsIDB4MjU0NSwgMHgyNTQ2LCAweDI1NDcsCisgICAgMHgyNTQ4LCAweDI1NDksIDB4MjU0QSwgMHgyNTRCLCAweDI0NjAsIDB4MjQ2MSwgMHgyNDYyLCAweDI0NjMsIDB4MjQ2NCwKKyAgICAweDI0NjUsIDB4MjQ2NiwgMHgyNDY3LCAweDI0NjgsIDB4MjQ2OSwgMHgyNDZBLCAweDI0NkIsIDB4MjQ2QywgMHgyNDZELAorICAgIDB4MjQ2RSwgMHgyNDZGLCAweDI0NzAsIDB4MjQ3MSwgMHgyNDcyLCAweDI0NzMsIDB4MjE2MCwgMHgyMTYxLCAweDIxNjIsCisgICAgMHgyMTYzLCAweDIxNjQsIDB4MjE2NSwgMHgyMTY2LCAweDIxNjcsIDB4MjE2OCwgMHgyMTY5LCAweDMzNDksIDB4MzMxNCwKKyAgICAweDMzMjIsIDB4MzM0RCwgMHgzMzE4LCAweDMzMjcsIDB4MzMwMywgMHgzMzM2LCAweDMzNTEsIDB4MzM1NywgMHgzMzBELAorICAgIDB4MzMyNiwgMHgzMzIzLCAweDMzMkIsIDB4MzM0QSwgMHgzMzNCLCAweDMzOUMsIDB4MzM5RCwgMHgzMzlFLCAweDMzOEUsCisgICAgMHgzMzhGLCAweDMzQzQsIDB4MzNBMSwgMHgzMDFELCAweDMwMUYsIDB4MjExNiwgMHgzM0NELCAweDIxMjEsIDB4MzJBNCwKKyAgICAweDMyQTUsIDB4MzJBNiwgMHgzMkE3LCAweDMyQTgsIDB4MzIzMSwgMHgzMjMyLCAweDMyMzksIDB4MzM3RSwgMHgzMzdELAorICAgIDB4MzM3QywgMHgyMjJFLCAweDIyMTEsIDB4MjIxQSwgMHgyMkE1LCAweDIyMjAsIDB4MjIxRiwgMHgyMkJGLCAweDIyMjksCisgICAgMHgyMjJBLCAweDU1NUUsIDB4OThGNCwgMHg2RUEyLCAweDlDMkYsIDB4NkRFQiwgMHg4RkMyLCAweDZCMUQsIDB4NTNBOSwKKyAgICAweDk1OEYsIDB4NTY0MiwgMHg5OTBDLCAweDcxMzAsIDB4ODk1NiwgMHg5REQ3LCAweDhGRTYsIDB4NjA2MiwgMHg2MkQwLAorICAgIDB4NjY2NiwgMHg1NTlELCAweDg0NUIsIDB4OTc4NCwgMHg1Njk5LCAweDZGOTcsIDB4N0ZGMCwgMHg3RkVCLCAweDVGQkQsCisgICAgMHg3OTQ3LCAweDRGRTAsIDB4NTM3RiwgMHg1MEM1LCAweDhFQzAsIDB4NTVCMCwgMHg2QURCLCAweDVDNTEsIDB4OTc3NCwKKyAgICAweDc5NDEsIDB4NjE2NywgMHg3QTNELCAweDdFNkIsIDB4ODM0QSwgMHg5Njk5LCAweDUwMjYsIDB4NUFDQywgMHg2MzcyLAorICAgIDB4OUU3QywgMHg4QUZBLCAweDVERjcsIDB4NjYzQiwgMHg2RTlELCAweDlFQjQsIDB4OUQ2MCwgMHg3NTExLCAweDkxQzcsCisgICAgMHg2OThBLCAweDY4MDUsIDB4ODVBOSwgMHg5QkQ2LCAweDkzMDYsIDB4NzNDQSwgMHg1M0YxLCAweDVDNjIsIDB4OTA2RSwKKyAgICAweDY3NTMsIDB4NzA3QywgMHg3RTYxLCAweDkxNEIsIDB4NjZEOSwgMHg2RTFBLCAweDg1QUYsIDB4ODVGNywgMHg1NEU4LAorICAgIDB4NUVFMCwgMHg2OEEyLCAweDg1MjMsIDB4OTFBQywgMHg5Nzk4LCAweDg3NTUsIDB4OTc3MSwgMHg5MDE3LCAweDdGRTAsCisgICAgMHg2NDdBLCAweDkwMUQsIDB4ODdFQywgMHg2NEIwLCAweDY4MTMsIDB4NzE0RSwgMHg3MTdELCAweDhBNkUsIDB4NTY0QywKKyAgICAweDkwNjEsIDB4NTI3NSwgMHg2NDE0LCAweDc2MjYsIDB4OTA1QywgMHg5QTUyLCAweDgxN0YsIDB4OUVEQiwgMHg1NTQ0LAorICAgIDB4NkZFRiwgMHg3NDIyLCAweDg2RjgsIDB4NURGRCwgMHg4RkJGLCAweDY4REEsIDB4OUM0OCwgMHg2QTNELCAweDdDMUUsCisgICAgMHg4QTNCLCAweDcwMjYsIDB4NTFDQiwgMHg2MzU3LCAweDY5Q0MsIDB4OTM5QSwgMHg1ODVBLCAweDY0NTEsIDB4OTEyRCwKKyAgICAweDY0RTIsIDB4NkVCQSwgMHg1ODYxLCAweDk4NUEsIDB4NTgzNSwgMHg1QzYwLCAweDgzREYsIDB4OENFRCwgMHg1ODU4LAorICAgIDB4NzlCMSwgMHg5RDA3LCAweDcwMDYsIDB4NzAxRSwgMHg1Njc4LCAweDkwNDEsIDB4OTgxMywgMHg5MEEzLCAweDhCMEUsCisgICAgMHg3MDU4LCAweDY5NjIsIDB4NzlCMCwgMHg1NkNBLCAweDcyNEMsIDB4OTAxOSwgMHg3OUU0LCAweDUyNUQsIDB4N0JCOCwKKyAgICAweDZGNTEsIDB4OTFCMSwgMHg2MzNELCAweDYyNDksIDB4NkEwQiwgMHg2N0NBLCAweDdBMTcsIDB4OTAzQywgMHg1QTlCLAorICAgIDB4OEIyQywgMHg1RURGLCAweDcwMTUsIDB4OTgzQiwgMHg4NTNELCAweDc3QTUsIDB4NUEyOSwgMHg1RTk2LCAweDZDRTEsCisgICAgMHg4NEVDLCAweDk4MzAsIDB4OUM1MiwgMHg5RUI1LCAweDUxMzIsIDB4OTkwNSwgMHg3QzdFLCAweDk0NTMsIDB4NjEwOCwKKyAgICAweDc2NTIsIDB4NzMzNywgMHg3MTk0LCAweDgwMDAsIDB4ODQwQSwgMHg5MDdDLCAweDZGMjMsIDB4NzE0OSwgMHg4NEVFLAorICAgIDB4Njk5NCwgMHg4ODFGLCAweDUxNTQsIDB4NTE4OSwgMHg1MTk1LCAweDUxQTQsIDB4NTUzOSwgMHg1NTMzLCAweDU1RTQsCisgICAgMHg1NjMyLCAweDU2QTUsIDB4NTgwQiwgMHg1QUJFLCAweDVCQzMsIDB4NUM1QiwgMHg1RTY0LCAweDYwOTcsIDB4NjM2OSwKKyAgICAweDY0MDYsIDB4NjUyMiwgMHg2NTgzLCAweDY3QTYsIDB4NjdCNCwgMHg2ODlCLCAweDY4OEUsIDB4NkU2RSwgMHg3MUQ3LAorICAgIDB4NzIyOCwgMHg3M0NFLCAweDc1MDQsIDB4NzUwRCwgMHg3NTE1LCAweDc2OTMsIDB4Nzg3QywgMHg3QTMxLCAweDlGOUQsCisgICAgMHg3Qjk5LCAweDdDOTAsIDB4N0NBRSwgMHg3RDlCLCAweDdEQUUsIDB4N0Q5RiwgMHg3RkQ0LCAweDgyMkUsIDB4ODI4RCwKKyAgICAweDgyRDIsIDB4ODMyMywgMHg4Mzc1LCAweDg1MTcsIDB4ODUzRSwgMHg4NzgyLCAweDg3RDIsIDB4ODkwQSwgMHg4OUFGLAorICAgIDB4OEFERSwgMHg4QjQxLCAweDhEREEsIDB4OEUwOSwgMHg4RjEzLCAweDhGRUEsIDB4OEZFOSwgMHg5MDU4LCAweDYyNDgsCisgICAgMHg5MUMxLCAweDk1QkIsIDB4Nzc2MiwgMHg5NzI0LCAweDk3NjAsIDB4OTc2RCwgMHg5ODI0LCAweDlCMkUsIDB4OUI5NywKKyAgICAweDlCRjIsIDB4OUVBQSwgMHg5RjlDLCAweDMwMDEsIDB4MzAwMiwgMHgyMDNFLCAweEZGM0YsIDB4MzBGQywgMHgyMDE1LAorICAgIDB4MjAxMCwgMHgzMDFDLCAweDIwMTYsIDB4RkY1QywgMHgyMDI2LCAweDIwMjUsIDB4RkYwOCwgMHhGRjA5LCAweDMwMTQsCisgICAgMHgzMDE1LCAweEZGM0IsIDB4RkYzRCwgMHhGRjVCLCAweEZGNUQsIDB4MzAwOCwgMHgzMDA5LCAweDMwMEEsIDB4MzAwQiwKKyAgICAweDMwMEMsIDB4MzAwRCwgMHgzMDBFLCAweDMwMEYsIDB4MzAxMCwgMHgzMDExLCAweEZGMUQsIDB4MzA0MSwgMHgzMDQzLAorICAgIDB4MzA0NSwgMHgzMDQ3LCAweDMwNDksIDB4MzA2MywgMHgzMDgzLCAweDMwODUsIDB4MzA4NywgMHgzMDhFLCAweDMwQTEsCisgICAgMHgzMEEzLCAweDMwQTUsIDB4MzBBNywgMHgzMEE5LCAweDMwQzMsIDB4MzBFMywgMHgzMEU1LCAweDMwRTcsIDB4MzBFRSwKKyAgICAweDMwRjUsIDB4MzBGNiwgMHgzMzQ5LCAweDMzMTQsIDB4MzMyMiwgMHgzMzRELCAweDMzMTgsIDB4MzMyNywgMHgzMzAzLAorICAgIDB4MzMzNiwgMHgzMzUxLCAweDMzNTcsIDB4MzMwRCwgMHgzMzI2LCAweDMzMjMsIDB4MzMyQiwgMHgzMzRBLCAweDMzM0IsCisgICAgMHgzMDFELCAweDMwMUUsIDB4MzA5NCwgMHgzMDRCLCAweDMwNTEsIDB4ODJBNiwgMHg4MzI4LCAweDU2NTMsIDB4NTNBOSwKKyAgICAweDcyNTksIDB4NkM3MiwgMHg3QjA4LCAweDk5NTcsIDB4NjJGMywgMHg5OTEwLCAweDk3NkQsIDB4NzE3RCwgMHg3QTdGLAorICAgIDB4N0JBRCwgMHg2M0MzLCAweDgzREYsIDB4Nzk2MiwgMHg1M0RCLCAweDdCQzcsIDB4OEZDNCwgMHg3QzNFLCAweDUwQ0EsCisgICAgMHg1MzE1LCAweDU1QTksIDB4NTZBRSwgMHg1ODE5LCAweDU5MUIsIDB4NUMyOCwgMHg1RUQwLCAweDVFQ0YsIDB4NjI0MSwKKyAgICAweDY2QzEsIDB4NkMwOCwgMHg2RTIzLCAweDZFRUMsIDB4N0E5NywgMHg3QkRELCAweDdGRTksIDB4ODQyMiwgMHg4NzU5LAorICAgIDB4ODgwRSwgMHg4N0QyLCAweDlBMTksIDB4OUVBRCwgMHhGRkU0LCAweEZGMDcsIDB4RkYwMiwgMHgxMUE4LCAweDI1QzEsCisgICAgMHgyNUI3LCAweDIxRTksIDB4MjFFNywgMHgyMUU2LCAweDIxRTgsIDB4MjVBMiwgMHgyNjY3LCAweDI2NjEsIDB4MjY2NCwKKyAgICAweDI2NjIsIDB4MzNBMCwgMHgzM0EyLCAweDMzQTQsIDB4MzNBNSwgMHgzMzk3LCAweDIxMTMsIDB4MzM5OCwgMHgzM0IzLAorICAgIDB4MzNCMiwgMHgzM0IxLCAweDMzQjAsIDB4MzM4NSwgMHgzMzg2LCAweDMzODcsIDB4MzNDQiwgMHgzMzkwLCAweDMzRDQsCisgICAgMHgzMzk2LCAweDMzMjIsIDB4MzMxNiwgMHgzMzE4LCAweDMzMTUsIDB4MzMwMywgMHgzMzIzLCAweDMzNTcsIDB4MzM0MiwKKyAgICAweDMzMzksIDB4MzMzQiwgMHgzMzAwLCAweDMzMzEsIDB4MzM0NywgMHgzMzFFLCAweDMzMkEsIDB4MzNDRCwgMHgzMzdGLAorICAgIDB4MjEyMSwgMHgyNjBFLCAweDMwMzYsIDB4MzAyMCwgMHgwMEE5LCAweDAwQUUsIDB4MDAwMCwgMHgyNDg4LCAweDI0ODksCisgICAgMHgyNDhBLCAweDI0OEIsIDB4MjQ4QywgMHgyNDhELCAweDI0OEUsIDB4MjQ4RiwgMHgyNDkwLCAweDI0NzQsIDB4MjQ3NSwKKyAgICAweDI0NzYsIDB4MjQ3NywgMHgyNDc4LCAweDI0NzksIDB4MjQ3QSwgMHgyNDdCLCAweDI0N0MsIDB4MjQ3RCwgMHgyNDdFLAorICAgIDB4MjQ3RiwgMHgyNDgwLCAweDI0ODEsIDB4MjQ4MiwgMHgyNDgzLCAweDI0ODQsIDB4MjQ4NSwgMHgyNDg2LCAweDI0ODcsCisgICAgMHgzMjUxLCAweDIxNzAsIDB4MjE3MSwgMHgyMTcyLCAweDIxNzMsIDB4MjE3NCwgMHgyMTc1LCAweDIxNzYsIDB4MjE3NywKKyAgICAweDIxNzgsIDB4MjE3OSwgMHgzMjUyLCAweDMyNTMsIDB4MzI1NCwgMHgzMjU1LCAweDMyNTYsIDB4MzI1NywgMHgzMjU4LAorICAgIDB4MzI1OSwgMHgzMjVBLCAweDMyNUIsIDB4MjQ5QywgMHgyNDlELCAweDI0OUUsIDB4MjQ5RiwgMHgyNEEwLCAweDI0QTEsCisgICAgMHgyNEEyLCAweDI0QTMsIDB4MjRBNCwgMHgyNEE1LCAweDI0QTYsIDB4MjRBNywgMHgyNEE4LCAweDI0QTksIDB4MjRBQSwKKyAgICAweDI0QUIsIDB4MjRBQywgMHgyNEFELCAweDI0QUUsIDB4MjRBRiwgMHgyNEIwLCAweDI0QjEsIDB4MjRCMiwgMHgyNEIzLAorICAgIDB4MjRCNCwgMHgyNEI1LCAweDMyNDMsIDB4MzIzRCwgMHgzMjNGLCAweDMyMzQsIDB4MzIzOCwgMHgzMjMzLCAweDMyM0MsCisgICAgMHgzMjQyLCAweDMyM0UsIDB4MzIzNiwgMHgzMjM1LCAweDMyM0IsIDB4MzI0MCwgMHgzMjNBLCAweDMyQjAsIDB4MzJBRCwKKyAgICAweDMyQTksIDB4MzJBRiwgMHgzMjk0LCAweDMyQUEsIDB4MzI5OCwgMHgzMkFCLCAweDMyOTIsIDB4MzI5MSwgMHgzMjkzLAorICAgIDB4MzJBQywgMHgzMkFFLCAweDMyOTYsIDB4MjNBOSwgMHgyM0E4LCAweDIzQTcsIDB4RkUzOCwgMHgyM0FELCAweDIzQUMsCisgICAgMHgyM0FCLCAweEZFMzgsIDB4MjNBQiwgMHgyM0FDLCAweDIzQUQsIDB4RkUzOCwgMHgyM0E3LCAweDIzQTgsIDB4MjNBOSwKKyAgICAweEZFMzgsIDB4MzNDQywgMHgzMzA1LCAweDAwQkQsIDB4MDBCQywgMHgzMzlGLCAweDMzQTMsIDB4MzNBNiwgMHhGRkZELAorICAgIDB4RkZGRCwgMHgzMjlFLCAweDMzODgsIDB4MzM4OSwgMHgzM0M4LCAweDIyMkQsIDB4NTM3MCwgMHgzMjMwLCAweDMyMkEsCisgICAgMHgzMjJCLCAweDMyMkMsIDB4MzIyRCwgMHgzMjJFLCAweDMyMkYsIDB4MzIzNywgMHgzMjQxLCAweDI3QTEsIDB4MjFFNiwKKyAgICAweDIxRTcsIDB4MjFFOSwgMHgyNUM5LCAweDI2NjAsIDB4MjY2NSwgMHgyNjYzLCAweDI2NjYsIDB4MjYwMCwgMHgyNjAxLAorICAgIDB4MjYwMiwgMHgyNjAzLCAweDI2MUUsIDB4MjYxQywgMHgyNjFELCAweDI2MUYsIDB4MzI5OSwgMHgyNEVBLCAweDIxNkEsCisgICAgMHgyMTZCLCAweEZGMTAsIDB4RkYxMCwgMHgzMDAwLCAweDI1ODEsIDB4MjU4MiwgMHgyNTgzLCAweDI1ODQsIDB4MjU4NSwKKyAgICAweDI1ODYsIDB4MjU4NywgMHgyNTg4LCAweDI1OEYsIDB4MjU4RSwgMHgyNThELCAweDI1OEMsIDB4MjU4QiwgMHgyNThBLAorICAgIDB4MjU4OSwgMHgyNTk0LCAweDI1OTUsIDB4MjU2RCwgMHgyNTZFLCAweDI1NzAsIDB4MjU2RiwgMHgyNTUwLCAweDI1NUUsCisgICAgMHgyNTZBLCAweDI1NjEsIDB4MjVFMiwgMHgyNUUzLCAweDI1RTUsIDB4MjVFNCwgMHgyNUNGLCAweDBFRDAsIDB4MjU3MSwKKyAgICAweDI1NzIsIDB4MjU3MywgMHgzMDRCLCAweDMwNTEsIDB4OTAyMiwgMHg4RkJCLCAweEZGMEMsIDB4MDBCMCwgMHgzMDEzLAorICAgIDB4MzA5QywgMHgzMDlCLCAweDAyQ0YsIDB4RkYwRSwgMHgyMDE4LCAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMUMsCisgICAgMHgyMDFFLCAweDIwMTgsIDB4MjAxQSwgMHgwMkJBLCAweDUxREMsIDB4NzE5OSwgMHgyNzc2LCAweDI3NzcsIDB4Mjc3OCwKKyAgICAweDI3NzksIDB4Mjc3QSwgMHgyNzdCLCAweDI3N0MsIDB4Mjc3RCwgMHgyNzdFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MjE3QSwgMHgyMTdCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIxN0YsIDB4MjEwQSwgMHgyMTA5LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDMwMDQsIDB4MjFDNiwgMHgyMUM0LCAweDIxQzUsIDB4MDAwMCwgMHgzMEY3LCAweDMwRjgsIDB4MzBGOSwKKyAgICAweDMwRkEsIDB4NTkyNywgMHg1QzBGLCAweDMyOUQsIDB4NjNBNywgMHgwMDAwLCAweDAwMDAsIDB4MzM3QiwgMHgzMzdGLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDMzMzMsIDB4MzM0RSwgMHgzMzIyLCAweDMzMTYsIDB4MzMwNSwgMHgzMzA1LCAweDMzMDUsCisgICAgMHgzMzMzLCAweDMzNEUsIDB4MzM0RSwgMHgzMzRFLCAweDMzMDMsIDB4MzMxOCwgMHgzMzE1LCAweDMzMzksIDB4MzMzOSwKKyAgICAweDMzMzksIDB4MzM1NywgMHgzMzQyLCAweDMzNDIsIDB4MzM0MiwgMHgzMzIzLCAweDMzM0IsIDB4MzMwMCwgMHgzMzFFLAorICAgIDB4MzMxRSwgMHgzMzFFLCAweDMzMkEsIDB4MzMyQSwgMHgzMzJBLCAweDMzNDcsIDB4MzMzMSwgMHg3RThBLCAweDg5MUMsCisgICAgMHg5MzQ4LCAweDkyODgsIDB4ODREQywgMHg0RkM5LCAweDcwQkIsIDB4NjYzMSwgMHg2OEM4LCAweDkyRjksIDB4NjZGQiwKKyAgICAweDVGNDUsIDB4NEUyOCwgMHg0RUUxLCAweDRFRkMsIDB4NEYwMCwgMHg0RjAzLCAweDRGMzksIDB4NEY1NiwgMHg0RjkyLAorICAgIDB4NEY4QSwgMHg0RjlBLCAweDRGOTQsIDB4NEZDRCwgMHg1MDQwLCAweDUwMjIsIDB4NEZGRiwgMHg1MDFFLCAweDUwNDYsCisgICAgMHg1MDcwLCAweDUwNDIsIDB4NTA5NCwgMHg1MEY0LCAweDUwRDgsIDB4NTE0QSwgMHg1MTY0LCAweDUxOUQsIDB4NTFCRSwKKyAgICAweDUxRUMsIDB4NTIxNSwgMHg1MjlDLCAweDUyQTYsIDB4NTJDMCwgMHg1MkRCLCAweDUzMDAsIDB4NTMwNywgMHg1MzI0LAorICAgIDB4NTM3MiwgMHg1MzkzLCAweDUzQjIsIDB4NTNERCwgMHhGQTBFLCAweDU0OUMsIDB4NTQ4QSwgMHg1NEE5LCAweDU0RkYsCisgICAgMHg1NTg2LCAweDU3NTksIDB4NTc2NSwgMHg1N0FDLCAweDU3QzgsIDB4NTdDNywgMHhGQTBGLCAweEZBMTAsIDB4NTg5RSwKKyAgICAweDU4QjIsIDB4NTkwQiwgMHg1OTUzLCAweDU5NUIsIDB4NTk1RCwgMHg1OTYzLCAweDU5QTQsIDB4NTlCQSwgMHg1QjU2LAorICAgIDB4NUJDMCwgMHg3NTJGLCAweDVCRDgsIDB4NUJFQywgMHg1QzFFLCAweDVDQTYsIDB4NUNCQSwgMHg1Q0Y1LCAweDVEMjcsCisgICAgMHg1RDUzLCAweEZBMTEsIDB4NUQ0MiwgMHg1RDZELCAweDVEQjgsIDB4NURCOSwgMHg1REQwLCAweDVGMjEsIDB4NUYzNCwKKyAgICAweDVGNjcsIDB4NUZCNywgMHg1RkRFLCAweDYwNUQsIDB4NjA4NSwgMHg2MDhBLCAweDYwREUsIDB4NjBENSwgMHg2MTIwLAorICAgIDB4NjBGMiwgMHg2MTExLCAweDYxMzcsIDB4NjEzMCwgMHg2MTk4LCAweDYyMTMsIDB4NjJBNiwgMHg2M0Y1LCAweDY0NjAsCisgICAgMHg2NDlELCAweDY0Q0UsIDB4NjU0RSwgMHg2NjAwLCAweDY2MTUsIDB4NjYwOSwgMHg2NjJFLCAweDY2MUUsIDB4NjYyNCwKKyAgICAweDY2NjUsIDB4NjY1NywgMHg2NjU5LCAweEZBMTIsIDB4NjY3MywgMHg2Njk5LCAweDY2QTAsIDB4NjZCMiwgMHg2NkJGLAorICAgIDB4NjZGQSwgMHg2NzBFLCAweEY5MjksIDB4Njc2NiwgMHg2N0JCLCAweDY4NTIsIDB4NjdDMCwgMHg2ODAxLCAweDY4NDQsCisgICAgMHg2OENGLCAweEZBMTMsIDB4Njk2OCwgMHhGQTE0LCAweDY5OTgsIDB4NjlFMiwgMHg2QTMwLCAweDZBNkIsIDB4NkE0NiwKKyAgICAweDZBNzMsIDB4NkE3RSwgMHg2QUUyLCAweDZBRTQsIDB4NkJENiwgMHg2QzNGLCAweDZDNUMsIDB4NkM4NiwgMHg2QzZGLAorICAgIDB4NkNEQSwgMHg2RDA0LCAweDZEODcsIDB4NkQ2RiwgMHg2RDk2LCAweDZEQUMsIDB4NkRDRiwgMHg2REY4LCAweDZERjIsCisgICAgMHg2REZDLCAweDZFMzksIDB4NkU1QywgMHg2RTI3LCAweDZFM0MsIDB4NkVCRiwgMHg2Rjg4LCAweDZGQjUsIDB4NkZGNSwKKyAgICAweDcwMDUsIDB4NzAwNywgMHg3MDI4LCAweDcwODUsIDB4NzBBQiwgMHg3MTBGLCAweDcxMDQsIDB4NzE1QywgMHg3MTQ2LAorICAgIDB4NzE0NywgMHhGQTE1LCAweDcxQzEsIDB4NzFGRSwgMHg3MkIxLCAweDcyQkUsIDB4NzMyNCwgMHhGQTE2LCAweDczNzcsCisgICAgMHg3M0JELCAweDczQzksIDB4NzNENiwgMHg3M0UzLCAweDczRDIsIDB4NzQwNywgMHg3M0Y1LCAweDc0MjYsIDB4NzQyQSwKKyAgICAweDc0MjksIDB4NzQyRSwgMHg3NDYyLCAweDc0ODksIDB4NzQ5RiwgMHg3NTAxLCAweDc1NkYsIDB4NzY4MiwgMHg3NjlDLAorICAgIDB4NzY5RSwgMHg3NjlCLCAweDc2QTYsIDB4RkExNywgMHg3NzQ2LCAweDUyQUYsIDB4NzgyMSwgMHg3ODRFLCAweDc4NjQsCisgICAgMHg3ODdBLCAweDc5MzAsIDB4RkExOCwgMHhGQTE5LCAweEZBMUEsIDB4Nzk5NCwgMHhGQTFCLCAweDc5OUIsIDB4N0FEMSwKKyAgICAweDdBRTcsIDB4RkExQywgMHg3QUVCLCAweDdCOUUsIDB4RkExRCwgMHg3RDQ4LCAweDdENUMsIDB4N0RCNywgMHg3REEwLAorICAgIDB4N0RENiwgMHg3RTUyLCAweDdGNDcsIDB4N0ZBMSwgMHhGQTFFLCAweDgzMDEsIDB4ODM2MiwgMHg4MzdGLCAweDgzQzcsCisgICAgMHg4M0Y2LCAweDg0NDgsIDB4ODRCNCwgMHg4NTUzLCAweDg1NTksIDB4ODU2QiwgMHhGQTFGLCAweDg1QjAsIDB4RkEyMCwKKyAgICAweEZBMjEsIDB4ODgwNywgMHg4OEY1LCAweDhBMTIsIDB4OEEzNywgMHg4QTc5LCAweDhBQTcsIDB4OEFCRSwgMHg4QURGLAorICAgIDB4RkEyMiwgMHg4QUY2LCAweDhCNTMsIDB4OEI3RiwgMHg4Q0YwLCAweDhDRjQsIDB4OEQxMiwgMHg4RDc2LCAweEZBMjMsCisgICAgMHg4RUNGLCAweEZBMjQsIDB4RkEyNSwgMHg5MDY3LCAweDkwREUsIDB4RkEyNiwgMHg5MTE1LCAweDkxMjcsIDB4OTFEQSwKKyAgICAweDkxRDcsIDB4OTFERSwgMHg5MUVELCAweDkxRUUsIDB4OTFFNCwgMHg5MUU1LCAweDkyMDYsIDB4OTIxMCwgMHg5MjBBLAorICAgIDB4OTIzQSwgMHg5MjQwLCAweDkyM0MsIDB4OTI0RSwgMHg5MjU5LCAweDkyNTEsIDB4OTIzOSwgMHg5MjY3LCAweDkyQTcsCisgICAgMHg5Mjc3LCAweDkyNzgsIDB4OTJFNywgMHg5MkQ3LCAweDkyRDksIDB4OTJEMCwgMHhGQTI3LCAweDkyRDUsIDB4OTJFMCwKKyAgICAweDkyRDMsIDB4OTMyNSwgMHg5MzIxLCAweDkyRkIsIDB4RkEyOCwgMHg5MzFFLCAweDkyRkYsIDB4OTMxRCwgMHg5MzAyLAorICAgIDB4OTM3MCwgMHg5MzU3LCAweDkzQTQsIDB4OTNDNiwgMHg5M0RFLCAweDkzRjgsIDB4OTQzMSwgMHg5NDQ1LCAweDk0NDgsCisgICAgMHg5NTkyLCAweEY5REMsIDB4RkEyOSwgMHg5NjlELCAweDk2QUYsIDB4OTczMywgMHg5NzNCLCAweDk3NDMsIDB4OTc0RCwKKyAgICAweDk3NEYsIDB4OTc1MSwgMHg5NzU1LCAweDk4NTcsIDB4OTg2NSwgMHhGQTJBLCAweEZBMkIsIDB4OTkyNywgMHhGQTJDLAorICAgIDB4OTk5RSwgMHg5QTRFLCAweDlBRDksIDB4OUFEQywgMHg5Qjc1LCAweDlCNzIsIDB4OUI4RiwgMHg5QkIxLCAweDlCQkIsCisgICAgMHg5QzAwLCAweDlENzAsIDB4OUQ2QiwgMHhGQTJELCAweDlFMTksIDB4OUVEMSwgMHgwMEFDLCAweDAwNUMsIDB4MDAyMCwKKyAgICAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsIDB4MDAyOCwgMHgwMDI5LAorICAgIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLCAweDAwMkYsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsCisgICAgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwM0EsIDB4MDAzQiwKKyAgICAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLCAweDAwM0YsIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LAorICAgIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsCisgICAgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwKKyAgICAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MDA1QiwgMHgwMEE1LCAweDAwNUQsIDB4MDA1RSwgMHgwMDVGLAorICAgIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LCAweDAwNjgsCisgICAgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsIDB4MDA2RSwgMHgwMDZGLCAweDAwNzAsIDB4MDA3MSwKKyAgICAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LCAweDAwNzgsIDB4MDA3OSwgMHgwMDdBLAorICAgIDB4MDA3QiwgMHgwMEE2LCAweDAwN0QsIDB4MDMwMywgMHgwMkJDLCAweDAwNUMsIDB4MDJCQiwgMHgwMDdDLCAweDAwN0UsCisgICAgMHgwMEExLCAweDAwQTIsIDB4MDBBMywgMHgyMDQ0LCAweDAxOTIsIDB4MDBBNywgMHgwMEE0LCAweDIwMUMsIDB4MDBBQiwKKyAgICAweDIwMzksIDB4MjAzQSwgMHhGQjAxLCAweEZCMDIsIDB4MjAxMiwgMHgyMDIwLCAweDIwMjEsIDB4MDBCNywgMHgwMEI2LAorICAgIDB4MjAyMiwgMHgyMDFBLCAweDIwMUUsIDB4MjAxRCwgMHgwMEJCLCAweDIwMjYsIDB4MjAzMCwgMHgwMEJGLCAweDAzMDEsCisgICAgMHgwMzAyLCAweDAwQUYsIDB4MDMwNiwgMHgwMzA3LCAweDAzMDgsIDB4MDMwQSwgMHgwMEI4LCAweDAzMEIsIDB4MDMyOCwKKyAgICAweDAzMEMsIDB4MDMzNiwgMHgwMEM2LCAweDAwQUEsIDB4MDE0MSwgMHgwMEQ4LCAweDAxNTIsIDB4MDBCQSwgMHgwMEU2LAorICAgIDB4MDEzMSwgMHgwMTQyLCAweDAwRjgsIDB4MDE1MywgMHgwMERGLCAweDAwMkQsIDB4MDBBOSwgMHgwMEFDLCAweDAwQUUsCisgICAgMHgwMEIwLCAweDAwQjEsIDB4MDBCMiwgMHgwMEIzLCAweDAwQjUsIDB4MDBCOSwgMHgwMEJDLCAweDAwQkQsIDB4MDBCRSwKKyAgICAweDAwQzAsIDB4MDBDMSwgMHgwMEMyLCAweDAwQzMsIDB4MDBDNCwgMHgwMEM1LCAweDAwQzcsIDB4MDBDOCwgMHgwMEM5LAorICAgIDB4MDBDQSwgMHgwMENCLCAweDAwQ0MsIDB4MDBDRCwgMHgwMENFLCAweDAwQ0YsIDB4MDBEMCwgMHgwMEQxLCAweDAwRDIsCisgICAgMHgwMEQzLCAweDAwRDQsIDB4MDBENSwgMHgwMEQ2LCAweDAwRDcsIDB4MDBEOSwgMHgwMERBLCAweDAwREIsIDB4MDBEQywKKyAgICAweDAwREQsIDB4MDBERSwgMHgwMEUwLCAweDAwRTEsIDB4MDBFMiwgMHgwMEUzLCAweDAwRTQsIDB4MDBFNSwgMHgwMEU3LAorICAgIDB4MDBFOCwgMHgwMEU5LCAweDAwRUEsIDB4MDBFQiwgMHgwMEVDLCAweDAwRUQsIDB4MDBFRSwgMHgwMEVGLCAweDAwRjAsCisgICAgMHgwMEYxLCAweDAwRjIsIDB4MDBGMywgMHgwMEY0LCAweDAwRjUsIDB4MDBGNiwgMHgwMEY3LCAweDAwRjksIDB4MDBGQSwKKyAgICAweDAwRkIsIDB4MDBGQywgMHgwMEZELCAweDAwRkUsIDB4MDBGRiwgMHgwMTYwLCAweDAxNzgsIDB4MDE3RCwgMHgwMzA1LAorICAgIDB4MDE2MSwgMHgyMTIyLCAweDAxN0UsIDB4MDAzMCwgMHgyMDAyLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsCisgICAgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywgMHgwMDI4LCAweDAwMjksIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwKKyAgICAweDAwMkUsIDB4MDAyRiwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LAorICAgIDB4MDAzNywgMHgwMDM4LCAweDAwMzksIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLCAweDAwM0YsCisgICAgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwKKyAgICAweDAwNDksIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLAorICAgIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsCisgICAgMHgwMDVCLCAweDAwQTUsIDB4MDA1RCwgMHgwMDVFLCAweDAwNUYsIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKyAgICAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLAorICAgIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsCisgICAgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDA3QiwgMHgwMDdDLCAweDAwN0QsIDB4MjAzRSwKKyAgICAweEZGNDAsIDB4MjAzMiwgMHgwMEE4LCAweDIwMzYsIDB4MDBDNCwgMHgwMEY5LCAweDAwRTksIDB4MDBFRCwgMHgwMERGLAorICAgIDB4MDBFNywgMHgwMEM3LCAweDAwRDEsIDB4MDBGMSwgMHgwMEEyLCAweDAwQTMsIDB4MDBGMywgMHgwMEZBLCAweDAwQTEsCisgICAgMHgwMEJGLCAweDAwQkQsIDB4MDBENiwgMHgwMERDLCAweDAwRTQsIDB4MDBFQiwgMHgwMEVGLCAweDAwRjYsIDB4MDBEQywKKyAgICAweDAwRTIsIDB4MDBFQSwgMHgwMEVFLCAweDAwRjQsIDB4MDBGQywgMHgwMEUwLCAweDAwRTksIDB4MDBFMSwgMHgwMDdFLAorICAgIDB4MDAzMCwgMHgwMEFDLCAweDAwNUMsIDB4RkY2MCwgMHhGRjYxLCAweEZGNjIsIDB4RkY2MywgMHhGRjY0LCAweEZGNjUsCisgICAgMHhGRjY2LCAweEZGNjcsIDB4RkY2OCwgMHhGRjY5LCAweEZGNkEsIDB4RkY2QiwgMHhGRjZDLCAweEZGNkQsIDB4RkY2RSwKKyAgICAweEZGNkYsIDB4RkY3MCwgMHhGRjcxLCAweEZGNzIsIDB4RkY3MywgMHhGRjc0LCAweEZGNzUsIDB4RkY3NiwgMHhGRjc3LAorICAgIDB4RkY3OCwgMHhGRjc5LCAweEZGN0EsIDB4RkY3QiwgMHhGRjdDLCAweEZGN0QsIDB4RkY3RSwgMHhGRjdGLCAweEZGODAsCisgICAgMHhGRjgxLCAweEZGODIsIDB4RkY4MywgMHhGRjg0LCAweEZGODUsIDB4RkY4NiwgMHhGRjg3LCAweEZGODgsIDB4RkY4OSwKKyAgICAweEZGOEEsIDB4RkY4QiwgMHhGRjhDLCAweEZGOEQsIDB4RkY4RSwgMHhGRjhGLCAweEZGOTAsIDB4RkY5MSwgMHhGRjkyLAorICAgIDB4RkY5MywgMHhGRjk0LCAweEZGOTUsIDB4RkY5NiwgMHhGRjk3LCAweEZGOTgsIDB4RkY5OSwgMHhGRjlBLCAweEZGOUIsCisgICAgMHhGRjlDLCAweEZGOUQsIDB4RkY5RSwgMHhGRjlGLCAweDMwRjAsIDB4MzBGMSwgMHgzMEVFLCAweDMwQUIsIDB4MzBCMSwKKyAgICAweDMwRjQsIDB4MzBBQywgMHgzMEFFLCAweDMwQjAsIDB4MzBCMiwgMHgzMEI0LCAweDMwQjYsIDB4MzBCOCwgMHgzMEJBLAorICAgIDB4MzBCQywgMHgzMEJFLCAweDMwQzAsIDB4MzBDMiwgMHgzMEM1LCAweDMwQzcsIDB4MzBDOSwgMHgzMEQwLCAweDMwRDEsCisgICAgMHgzMEQzLCAweDMwRDQsIDB4MzBENiwgMHgzMEQ3LCAweDMwRDksIDB4MzBEQSwgMHgzMERDLCAweDMwREQsIDB4RkY2MCwKKyAgICAweDMwOTIsIDB4MzA0MSwgMHgzMDQzLCAweDMwNDUsIDB4MzA0NywgMHgzMDQ5LCAweDMwODMsIDB4MzA4NSwgMHgzMDg3LAorICAgIDB4MzA2MywgMHgzMDQyLCAweDMwNDQsIDB4MzA0NiwgMHgzMDQ4LCAweDMwNEEsIDB4MzA0QiwgMHgzMDRELCAweDMwNEYsCisgICAgMHgzMDUxLCAweDMwNTMsIDB4MzA1NSwgMHgzMDU3LCAweDMwNTksIDB4MzA1QiwgMHgzMDVELCAweDMwNUYsIDB4MzA2MSwKKyAgICAweDMwNjQsIDB4MzA2NiwgMHgzMDY4LCAweDMwNkEsIDB4MzA2QiwgMHgzMDZDLCAweDMwNkQsIDB4MzA2RSwgMHgzMDZGLAorICAgIDB4MzA3MiwgMHgzMDc1LCAweDMwNzgsIDB4MzA3QiwgMHgzMDdFLCAweDMwN0YsIDB4MzA4MCwgMHgzMDgxLCAweDMwODIsCisgICAgMHgzMDg0LCAweDMwODYsIDB4MzA4OCwgMHgzMDg5LCAweDMwOEEsIDB4MzA4QiwgMHgzMDhDLCAweDMwOEQsIDB4MzA4RiwKKyAgICAweDMwOTMsIDB4MzA5MCwgMHgzMDkxLCAweDMwOEUsIDB4MzA0QywgMHgzMDRFLCAweDMwNTAsIDB4MzA1MiwgMHgzMDU0LAorICAgIDB4MzA1NiwgMHgzMDY4LCAweDMwNUEsIDB4MzA1QywgMHgzMDVFLCAweDMwNjAsIDB4MzA2MiwgMHgzMDY1LCAweDMwNjcsCisgICAgMHgzMDY5LCAweDMwNzAsIDB4MzA3MSwgMHgzMDczLCAweDMwNzQsIDB4MzA3NiwgMHgzMDc3LCAweDMwNzksIDB4MzA3QSwKKyAgICAweDMwN0MsIDB4MzA3RCwgMHgzMDFELCAweDMwMUUsIDB4MDA1QiwgMHgwMDVELCAweDMwMDgsIDB4MzAwOSwgMHgzMDBBLAorICAgIDB4MzAwQiwgMHgzMDBFLCAweDMwMEYsIDB4MzAxMCwgMHgzMDExLCAweDIwMTIsIDB4RkY2MCwgMHgyNTAwLCAweDI1MDEsCisgICAgMHgyNTAyLCAweDI1MDMsIDB4MjUwNCwgMHgyNTA1LCAweDI1MDYsIDB4MjUwNywgMHgyNTA4LCAweDI1MDksIDB4MjUwQSwKKyAgICAweDI1MEIsIDB4MjUwQywgMHgyNTBELCAweDI1MEUsIDB4MjUwRiwgMHgyNTEwLCAweDI1MTEsIDB4MjUxMiwgMHgyNTEzLAorICAgIDB4MjUxNCwgMHgyNTE1LCAweDI1MTYsIDB4MjUxNywgMHgyNTE4LCAweDI1MTksIDB4MjUxQSwgMHgyNTFCLCAweDI1MUMsCisgICAgMHgyNTFELCAweDI1MUUsIDB4MjUxRiwgMHgyNTIwLCAweDI1MjEsIDB4MjUyMiwgMHgyNTIzLCAweDI1MjQsIDB4MjUyNSwKKyAgICAweDI1MjYsIDB4MjUyNywgMHgyNTI4LCAweDI1MjksIDB4MjUyQSwgMHgyNTJCLCAweDI1MkMsIDB4MjUyRCwgMHgyNTJFLAorICAgIDB4MjUyRiwgMHgyNTMwLCAweDI1MzEsIDB4MjUzMiwgMHgyNTMzLCAweDI1MzQsIDB4MjUzNSwgMHgyNTM2LCAweDI1MzcsCisgICAgMHgyNTM4LCAweDI1MzksIDB4MjUzQSwgMHgyNTNCLCAweDI1M0MsIDB4MjUzRCwgMHgyNTNFLCAweDI1M0YsIDB4MjU0MCwKKyAgICAweDI1NDEsIDB4MjU0MiwgMHgyNTQzLCAweDI1NDQsIDB4MjU0NSwgMHgyNTQ2LCAweDI1NDcsIDB4MjU0OCwgMHgyNTQ5LAorICAgIDB4MjU0QSwgMHgyNTRCLCAweDI1QjIsIDB4MjBBQywgMHgyMTI2LCAweDIwMzIsIDB4MjAzMywgMHhGQjAwLCAweEZCMDMsCisgICAgMHhGQjA0LCAweDAxMDEsIDB4MDEyQiwgMHgwMTZCLCAweDAxMTMsIDB4MDE0RCwgMHgwMTAwLCAweDAxMkEsIDB4MDE2QSwKKyAgICAweDAxMTIsIDB4MDE0QywgMHgyMTVCLCAweDIxNUMsIDB4MjE1RCwgMHgyMTVFLCAweDIxNTMsIDB4MjE1NCwgMHgyMDcwLAorICAgIDB4MjA3NCwgMHgyMDc1LCAweDIwNzYsIDB4MjA3NywgMHgyMDc4LCAweDIwNzksIDB4MjA4MCwgMHgyMDgxLCAweDIwODIsCisgICAgMHgyMDgzLCAweDIwODQsIDB4MjA4NSwgMHgyMDg2LCAweDIwODcsIDB4MjA4OCwgMHgyMDg5LCAweDAxQ0QsIDB4MDExQSwKKyAgICAweDAwMDAsIDB4MUVCQywgMHgwMUNGLCAweDAwMDAsIDB4MDEyOCwgMHgwMUQxLCAweDAwMDAsIDB4MDFEMywgMHgwMTZFLAorICAgIDB4MDE2OCwgMHgwMUNFLCAweDAxMUIsIDB4MDAwMCwgMHgxRUJELCAweDAxRDAsIDB4MDAwMCwgMHgwMTI5LCAweDAxRDIsCisgICAgMHgwMDAwLCAweDAxRDQsIDB4MDE2RiwgMHgwMTY5LCAweDAyNTEsIDB4MDI1MSwgMHgwMjUxLCAweDAxRkQsIDB4MDBFNiwKKyAgICAweDAyNTQsIDB4MDI1NCwgMHgwMjU0LCAweDAyNTksIDB4MDI1OSwgMHgwMjU5LCAweDAyNUEsIDB4MDI1QSwgMHgwMjVBLAorICAgIDB4MDI1QiwgMHgwMjVCLCAweDAyNUIsIDB4MDA2QSwgMHgwMTRCLCAweDAyNzUsIDB4MDI4QywgMHgwMjhDLCAweDAyOEMsCisgICAgMHgwMjkyLCAweDAyODMsIDB4MDJEMCwgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwKKyAgICAweDAwMjYsIDB4MDAyNywgMHgwMDI4LCAweDAwMjksIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLAorICAgIDB4MDAyRiwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisgICAgMHgwMDM4LCAweDAwMzksIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLCAweDAwM0YsIDB4MDA0MCwKKyAgICAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LAorICAgIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsCisgICAgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MDA1QiwKKyAgICAweDAwQTUsIDB4MDA1RCwgMHgwMDVFLCAweDAwNUYsIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LAorICAgIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsCisgICAgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwKKyAgICAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDA3QiwgMHgwMEE2LCAweDAwN0QsIDB4MDMwMywgMHgwMkJDLAorICAgIDB4MDA1QywgMHgwMkJCLCAweDAwN0MsIDB4MDA3RSwgMHgwMEExLCAweDAwQTIsIDB4MDBBMywgMHgyMDQ0LCAweDAxOTIsCisgICAgMHgwMEE3LCAweDAwQTQsIDB4MjAxQywgMHgwMEFCLCAweDIwMzksIDB4MjAzQSwgMHhGQjAxLCAweEZCMDIsIDB4MjAxMiwKKyAgICAweDIwMjAsIDB4MjAyMSwgMHgwMEI3LCAweDAwQjYsIDB4MjAyMiwgMHgyMDFBLCAweDIwMUUsIDB4MjAxRCwgMHgwMEJCLAorICAgIDB4MjAyNiwgMHgyMDMwLCAweDAwQkYsIDB4MDMwMSwgMHgwMzAyLCAweDAwQUYsIDB4MDMwNiwgMHgwMzA3LCAweDAzMDgsCisgICAgMHgwMzBBLCAweDAwQjgsIDB4MDMwQiwgMHgwMzI4LCAweDAzMEMsIDB4MDMzNiwgMHgwMEM2LCAweDAwQUEsIDB4MDE0MSwKKyAgICAweDAwRDgsIDB4MDE1MiwgMHgwMEJBLCAweDAwRTYsIDB4MDEzMSwgMHgwMTQyLCAweDAwRjgsIDB4MDE1MywgMHgwMERGLAorICAgIDB4MDAyRCwgMHgwMEE5LCAweDAwQUMsIDB4MDBBRSwgMHgwMEIwLCAweDAwQjEsIDB4MDBCMiwgMHgwMEIzLCAweDAwQjUsCisgICAgMHgwMEI5LCAweDAwQkMsIDB4MDBCRCwgMHgwMEJFLCAweDAwQzAsIDB4MDBDMSwgMHgwMEMyLCAweDAwQzMsIDB4MDBDNCwKKyAgICAweDAwQzUsIDB4MDBDNywgMHgwMEM4LCAweDAwQzksIDB4MDBDQSwgMHgwMENCLCAweDAwQ0MsIDB4MDBDRCwgMHgwMENFLAorICAgIDB4MDBDRiwgMHgwMEQwLCAweDAwRDEsIDB4MDBEMiwgMHgwMEQzLCAweDAwRDQsIDB4MDBENSwgMHgwMEQ2LCAweDAwRDcsCisgICAgMHgwMEQ5LCAweDAwREEsIDB4MDBEQiwgMHgwMERDLCAweDAwREQsIDB4MDBERSwgMHgwMEUwLCAweDAwRTEsIDB4MDBFMiwKKyAgICAweDAwRTMsIDB4MDBFNCwgMHgwMEU1LCAweDAwRTcsIDB4MDBFOCwgMHgwMEU5LCAweDAwRUEsIDB4MDBFQiwgMHgwMEVDLAorICAgIDB4MDBFRCwgMHgwMEVFLCAweDAwRUYsIDB4MDBGMCwgMHgwMEYxLCAweDAwRjIsIDB4MDBGMywgMHgwMEY0LCAweDAwRjUsCisgICAgMHgwMEY2LCAweDAwRjcsIDB4MDBGOSwgMHgwMEZBLCAweDAwRkIsIDB4MDBGQywgMHgwMEZELCAweDAwRkUsIDB4MDBGRiwKKyAgICAweDAxNjAsIDB4MDE3OCwgMHgwMTdELCAweDAzMDUsIDB4MDE2MSwgMHgyMTIyLCAweDAxN0UsIDB4MDAzMCwgMHgyMEFDLAorICAgIDB4MjEyNiwgMHgyMDMyLCAweDIwMzMsIDB4RkIwMCwgMHhGQjAzLCAweEZCMDQsIDB4MDEwMSwgMHgwMTJCLCAweDAxNkIsCisgICAgMHgwMTEzLCAweDAxNEQsIDB4MDEwMCwgMHgwMTJBLCAweDAxNkEsIDB4MDExMiwgMHgwMTRDLCAweDIxNUIsIDB4MjE1QywKKyAgICAweDIxNUQsIDB4MjE1RSwgMHgyMTUzLCAweDIxNTQsIDB4MjA3MCwgMHgyMDc0LCAweDIwNzUsIDB4MjA3NiwgMHgyMDc3LAorICAgIDB4MjA3OCwgMHgyMDc5LCAweDIwODAsIDB4MjA4MSwgMHgyMDgyLCAweDIwODMsIDB4MjA4NCwgMHgyMDg1LCAweDIwODYsCisgICAgMHgyMDg3LCAweDIwODgsIDB4MjA4OSwgMHgwMUNELCAweDAxMUEsIDB4MDAwMCwgMHgxRUJDLCAweDAxQ0YsIDB4MDAwMCwKKyAgICAweDAxMjgsIDB4MDFEMSwgMHgwMDAwLCAweDAxRDMsIDB4MDE2RSwgMHgwMTY4LCAweDAxQ0UsIDB4MDExQiwgMHgwMDAwLAorICAgIDB4MUVCRCwgMHgwMUQwLCAweDAwMDAsIDB4MDEyOSwgMHgwMUQyLCAweDAwMDAsIDB4MDFENCwgMHgwMTZGLCAweDAxNjksCisgICAgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwKKyAgICAweDAwMzksIDB4MDMzNiwgMHgwMDJELCAweDAwM0QsIDB4MDAyQywgMHgwMDI4LCAweDAwMjksIDB4MDAyRSwgMHgwMDJGLAorICAgIDB4MDAzQSwgMHgwMDNCLCAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsCisgICAgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgwMzM2LCAweDAwMkQsIDB4MDAzRCwgMHgwMDJDLCAweDAwMjgsIDB4MDAyOSwKKyAgICAweDAwMkUsIDB4MDAyRiwgMHgwMDNBLCAweDAwM0IsIDB4MDBCNywgMHgyMEFDLCAweDAwMDAsIDB4MjE1MywgMHgyMTU0LAorICAgIDB4MDBCRSwgMHgyMTU1LCAweDIxNTYsIDB4MjE1NywgMHgyMTU4LCAweDIxNTksIDB4MjE1QSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIxNUIsIDB4MjE1QywgMHgyMTVELCAweDIxNUUsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMzAsCisgICAgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwKKyAgICAweDAwMzAsIDB4MjE2MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDIxNzAsIDB4MjE3MSwgMHgyMTcyLCAweDIxNzMsIDB4MjE3NCwgMHgyMTc1LCAweDIxNzYsCisgICAgMHgyMTc3LCAweDIxNzgsIDB4MjE3OSwgMHgyMTdBLCAweDIxN0IsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjE2MCwKKyAgICAweDIxNjEsIDB4MjE2MiwgMHgyMTYzLCAweDIxNjQsIDB4MjE2NSwgMHgyMTY2LCAweDIxNjcsIDB4MjE2OCwgMHgyMTY5LAorICAgIDB4MjE2QSwgMHgyMTZCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsCisgICAgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwKKyAgICAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LAorICAgIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgzMDQyLCAweDMwNDQsIDB4MzA0NiwgMHgzMDQ4LCAweDMwNEEsCisgICAgMHgzMDRCLCAweDMwNEQsIDB4MzA0RiwgMHgzMDUxLCAweDMwNTMsIDB4MzA1NSwgMHgzMDU3LCAweDMwNTksIDB4MzA1QiwKKyAgICAweDMwNUQsIDB4MzA1RiwgMHgzMDYxLCAweDMwNjQsIDB4MzA2NiwgMHgzMDY4LCAweDMwNkEsIDB4MzA2QiwgMHgzMDZDLAorICAgIDB4MzA2RCwgMHgzMDZFLCAweDMwNkYsIDB4MzA3MiwgMHgzMDc1LCAweDMwNzgsIDB4MzA3QiwgMHgzMDdFLCAweDMwN0YsCisgICAgMHgzMDgwLCAweDMwODEsIDB4MzA4MiwgMHgzMDg0LCAweDMwODYsIDB4MzA4OCwgMHgzMDg5LCAweDMwOEEsIDB4MzA4QiwKKyAgICAweDMwOEMsIDB4MzA4RCwgMHgzMDhGLCAweDMwOTAsIDB4MzA5MSwgMHgzMDkyLCAweDMwOTMsIDB4MzBBMiwgMHgzMEE0LAorICAgIDB4MzBBNiwgMHgzMEE4LCAweDMwQUEsIDB4MzBBQiwgMHgzMEFELCAweDMwQUYsIDB4MzBCMSwgMHgzMEIzLCAweDMwQjUsCisgICAgMHgzMEI3LCAweDMwQjksIDB4MzBCQiwgMHgzMEJELCAweDMwQkYsIDB4MzBDMSwgMHgzMEM0LCAweDMwQzYsIDB4MzBDOCwKKyAgICAweDMwQ0EsIDB4MzBDQiwgMHgzMENDLCAweDMwQ0QsIDB4MzBDRSwgMHgzMENGLCAweDMwRDIsIDB4MzBENSwgMHgzMEQ4LAorICAgIDB4MzBEQiwgMHgzMERFLCAweDMwREYsIDB4MzBFMCwgMHgzMEUxLCAweDMwRTIsIDB4MzBFNCwgMHgzMEU2LCAweDMwRTgsCisgICAgMHgzMEU5LCAweDMwRUEsIDB4MzBFQiwgMHgzMEVDLCAweDMwRUQsIDB4MzBFRiwgMHgzMEYwLCAweDMwRjEsIDB4MzBGMiwKKyAgICAweDMwRjMsIDB4MzIyMCwgMHgzMjIxLCAweDMyMjIsIDB4MzIyMywgMHgzMjI0LCAweDMyMjUsIDB4MzIyNiwgMHgzMjI3LAorICAgIDB4MzIyOCwgMHgzMjI5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg1NUI2LCAweDU0MDgsIDB4NkNFQiwgMHg1NTRGLCAweDdCNTQsIDB4NEY4QiwKKyAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgMHgwMDM4LAorICAgIDB4MDAzOSwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisgICAgMHgwMDM4LCAweDAwMzksIDB4MzA2MywgMHg2MjRELCAweDMwMDcsIDB4NEUwMCwgMHg0RThDLCAweDRFMDksIDB4NTZEQiwKKyAgICAweDRFOTQsIDB4NTE2RCwgMHg0RTAzLCAweDUxNkIsIDB4NEU1RCwgMHg1MzQxLCAweDMwMDcsIDB4NEUwMCwgMHg0RThDLAorICAgIDB4NEUwOSwgMHg1NkRCLCAweDRFOTQsIDB4NTE2RCwgMHg0RTAzLCAweDUxNkIsIDB4NEU1RCwgMHg1MzQxLCAweDMwMDcsCisgICAgMHg0RTAwLCAweDRFOEMsIDB4NEUwOSwgMHg1NkRCLCAweDRFOTQsIDB4NTE2RCwgMHg0RTAzLCAweDUxNkIsIDB4NEU1RCwKKyAgICAweDMwNjQsIDB4NjI0RCwgMHg0RTAwLCAweDRFOEMsIDB4NEUwOSwgMHg1NkRCLCAweDRFOTQsIDB4NTE2RCwgMHg0RTAzLAorICAgIDB4NTE2QiwgMHg0RTVELCAweDUzNDEsIDB4MzAwNywgMHg0RTAwLCAweDRFOEMsIDB4NEUwOSwgMHg1NkRCLCAweDRFOTQsCisgICAgMHg1MTZELCAweDRFMDMsIDB4NTE2QiwgMHg0RTVELCAweDUzNDEsIDB4MzBCMywgMHgzMDYzLCAweDMwQzMsIDB4MzBBOSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgyNDYwLCAweDI0NjEsIDB4MjQ2MiwgMHgyNDYzLCAweDI0NjQsIDB4MjQ2NSwgMHgyNDY2LAorICAgIDB4MjQ2NywgMHgyNDY4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjREMCwKKyAgICAweDI0RDEsIDB4MjREMiwgMHgyNEQzLCAweDI0RDQsIDB4MjRENSwgMHgyNEQ2LCAweDI0RDcsIDB4MjREOCwgMHgyNEQ5LAorICAgIDB4MjREQSwgMHgyNERCLCAweDI0REMsIDB4MjRERCwgMHgyNERFLCAweDI0REYsIDB4MjRFMCwgMHgyNEUxLCAweDI0RTIsCisgICAgMHgyNEUzLCAweDI0RTQsIDB4MjRFNSwgMHgyNEU2LCAweDI0RTcsIDB4MjRFOCwgMHgyNEU5LCAweDI0QjYsIDB4MjRCNywKKyAgICAweDI0QjgsIDB4MjRCOSwgMHgyNEJBLCAweDI0QkIsIDB4MjRCQywgMHgyNEJELCAweDI0QkUsIDB4MjRCRiwgMHgyNEMwLAorICAgIDB4MjRDMSwgMHgyNEMyLCAweDI0QzMsIDB4MjRDNCwgMHgyNEM1LCAweDI0QzYsIDB4MjRDNywgMHgyNEM4LCAweDI0QzksCisgICAgMHgyNENBLCAweDI0Q0IsIDB4MjRDQywgMHgyNENELCAweDI0Q0UsIDB4MjRDRiwgMHgzMDQyLCAweDMwNDQsIDB4MzA0NiwKKyAgICAweDMwNDgsIDB4MzA0QSwgMHgzMDRCLCAweDMwNEQsIDB4MzA0RiwgMHgzMDUxLCAweDMwNTMsIDB4MzA1NSwgMHgzMDU3LAorICAgIDB4MzA1OSwgMHgzMDVCLCAweDMwNUQsIDB4MzA1RiwgMHgzMDYxLCAweDMwNjQsIDB4MzA2NiwgMHgzMDY4LCAweDMwNkEsCisgICAgMHgzMDZCLCAweDMwNkMsIDB4MzA2RCwgMHgzMDZFLCAweDMwNkYsIDB4MzA3MiwgMHgzMDc1LCAweDMwNzgsIDB4MzA3QiwKKyAgICAweDMwN0UsIDB4MzA3RiwgMHgzMDgwLCAweDMwODEsIDB4MzA4MiwgMHgzMDg0LCAweDMwODYsIDB4MzA4OCwgMHgzMDg5LAorICAgIDB4MzA4QSwgMHgzMDhCLCAweDMwOEMsIDB4MzA4RCwgMHgzMDhGLCAweDMwOTAsIDB4MzA5MSwgMHgzMDkyLCAweDMwOTMsCisgICAgMHgzMkQwLCAweDMyRDEsIDB4MzJEMiwgMHgzMkQzLCAweDMyRDQsIDB4MzJENSwgMHgzMkQ2LCAweDMyRDcsIDB4MzJEOCwKKyAgICAweDMyRDksIDB4MzJEQSwgMHgzMkRCLCAweDMyREMsIDB4MzJERCwgMHgzMkRFLCAweDMyREYsIDB4MzJFMCwgMHgzMkUxLAorICAgIDB4MzJFMiwgMHgzMkUzLCAweDMyRTQsIDB4MzJFNSwgMHgzMkU2LCAweDMyRTcsIDB4MzJFOCwgMHgzMkU5LCAweDMyRUEsCisgICAgMHgzMkVCLCAweDMyRUMsIDB4MzJFRCwgMHgzMkVFLCAweDMyRUYsIDB4MzJGMCwgMHgzMkYxLCAweDMyRjIsIDB4MzJGMywKKyAgICAweDMyRjQsIDB4MzJGNSwgMHgzMkY2LCAweDMyRjcsIDB4MzJGOCwgMHgzMkY5LCAweDMyRkEsIDB4MzJGQiwgMHgzMkZDLAorICAgIDB4MzJGRCwgMHgzMkZFLCAweDMwRjMsIDB4MzI4MCwgMHgzMjgxLCAweDMyODIsIDB4MzI4MywgMHgzMjg0LCAweDMyODUsCisgICAgMHgzMjg2LCAweDMyODcsIDB4MzI4OCwgMHgzMjg5LCAweDMyOTAsIDB4MzI4QSwgMHgzMjhCLCAweDMyOEMsIDB4MzI4RCwKKyAgICAweDMyOEUsIDB4MzI4RiwgMHg4QUJGLCAweDMyOUYsIDB4NTI2RiwgMHg2RTFCLCAweDZBMTksIDB4NkIyMCwgMHg1N0ZBLAorICAgIDB4Nzk4MSwgMHgzMkEwLCAweDMyQTEsIDB4MzI5QiwgMHgzMjlBLCAweDMyQTMsIDB4MzJBMiwgMHgzMjk3LCAweDUxRkEsCisgICAgMHgzMjlDLCAweDMyOTUsIDB4NkUwOCwgMHg1ODk3LCAweDU1NEYsIDB4N0I1NCwgMHg0RjhCLCAweDk2RkIsIDB4MjVDQywKKyAgICAweDAwMzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwKKyAgICAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsIDB4MDA2RSwgMHgwMDZGLAorICAgIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LCAweDAwNzgsCisgICAgMHgwMDc5LCAweDAwN0EsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKyAgICAweDAwNDgsIDB4MDA0OSwgMHgwMDRBLCAweDAwNEIsIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLAorICAgIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksCisgICAgMHgwMDVBLCAweDMwNDIsIDB4MzA0NCwgMHgzMDQ2LCAweDMwNDgsIDB4MzA0QSwgMHgzMDRCLCAweDMwNEQsIDB4MzA0RiwKKyAgICAweDMwNTEsIDB4MzA1MywgMHgzMDU1LCAweDMwNTcsIDB4MzA1OSwgMHgzMDVCLCAweDMwNUQsIDB4MzA1RiwgMHgzMDYxLAorICAgIDB4MzA2NCwgMHgzMDY2LCAweDMwNjgsIDB4MzA2QSwgMHgzMDZCLCAweDMwNkMsIDB4MzA2RCwgMHgzMDZFLCAweDMwNkYsCisgICAgMHgzMDcyLCAweDMwNzUsIDB4MzA3OCwgMHgzMDdCLCAweDMwN0UsIDB4MzA3RiwgMHgzMDgwLCAweDMwODEsIDB4MzA4MiwKKyAgICAweDMwODQsIDB4MzA4NiwgMHgzMDg4LCAweDMwODksIDB4MzA4QSwgMHgzMDhCLCAweDMwOEMsIDB4MzA4RCwgMHgzMDhGLAorICAgIDB4MzA5MCwgMHgzMDkxLCAweDMwOTIsIDB4MzA5MywgMHgzMEEyLCAweDMwQTQsIDB4MzBBNiwgMHgzMEE4LCAweDMwQUEsCisgICAgMHgzMEFCLCAweDMwQUQsIDB4MzBBRiwgMHgzMEIxLCAweDMwQjMsIDB4MzBCNSwgMHgzMEI3LCAweDMwQjksIDB4MzBCQiwKKyAgICAweDMwQkQsIDB4MzBCRiwgMHgzMEMxLCAweDMwQzQsIDB4MzBDNiwgMHgzMEM4LCAweDMwQ0EsIDB4MzBDQiwgMHgzMENDLAorICAgIDB4MzBDRCwgMHgzMENFLCAweDMwQ0YsIDB4MzBEMiwgMHgzMEQ1LCAweDMwRDgsIDB4MzBEQiwgMHgzMERFLCAweDMwREYsCisgICAgMHgzMEUwLCAweDMwRTEsIDB4MzBFMiwgMHgzMEU0LCAweDMwRTYsIDB4MzBFOCwgMHgzMEU5LCAweDMwRUEsIDB4MzBFQiwKKyAgICAweDMwRUMsIDB4MzBFRCwgMHgzMEVGLCAweDMwRjAsIDB4MzBGMSwgMHgzMEYyLCAweDMwRjMsIDB4NjVFNSwgMHg2NzA4LAorICAgIDB4NzA2QiwgMHg2QzM0LCAweDY3MjgsIDB4OTFEMSwgMHg1NzFGLCAweDU1NEYsIDB4N0I1NCwgMHg0RjhCLCAweDI1Q0YsCisgICAgMHgwMDMwLCAweDAwMDAsIDB4MDAzMSwgMHgwMDAwLCAweDAwMzIsIDB4MDAwMCwgMHgwMDMzLCAweDAwMDAsIDB4MDAzNCwKKyAgICAweDAwMDAsIDB4MDAzNSwgMHgwMDAwLCAweDAwMzYsIDB4MDAwMCwgMHgwMDM3LCAweDAwMDAsIDB4MDAzOCwgMHgwMDAwLAorICAgIDB4MDAzOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwKKyAgICAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsIDB4MDA2RSwgMHgwMDZGLAorICAgIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LCAweDAwNzgsCisgICAgMHgwMDc5LCAweDAwN0EsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKyAgICAweDAwNDgsIDB4MDA0OSwgMHgwMDRBLCAweDAwNEIsIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLAorICAgIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksCisgICAgMHgwMDVBLCAweDMwNDIsIDB4MzA0NCwgMHgzMDQ2LCAweDMwNDgsIDB4MzA0QSwgMHgzMDRCLCAweDMwNEQsIDB4MzA0RiwKKyAgICAweDMwNTEsIDB4MzA1MywgMHgzMDU1LCAweDMwNTcsIDB4MzA1OSwgMHgzMDVCLCAweDMwNUQsIDB4MzA1RiwgMHgzMDYxLAorICAgIDB4MzA2NCwgMHgzMDY2LCAweDMwNjgsIDB4MzA2QSwgMHgzMDZCLCAweDMwNkMsIDB4MzA2RCwgMHgzMDZFLCAweDMwNkYsCisgICAgMHgzMDcyLCAweDMwNzUsIDB4MzA3OCwgMHgzMDdCLCAweDMwN0UsIDB4MzA3RiwgMHgzMDgwLCAweDMwODEsIDB4MzA4MiwKKyAgICAweDMwODQsIDB4MzA4NiwgMHgzMDg4LCAweDMwODksIDB4MzA4QSwgMHgzMDhCLCAweDMwOEMsIDB4MzA4RCwgMHgzMDhGLAorICAgIDB4MzA5MCwgMHgzMDkxLCAweDMwOTIsIDB4MzA5MywgMHgzMEEyLCAweDMwQTQsIDB4MzBBNiwgMHgzMEE4LCAweDMwQUEsCisgICAgMHgzMEFCLCAweDMwQUQsIDB4MzBBRiwgMHgzMEIxLCAweDMwQjMsIDB4MzBCNSwgMHgzMEI3LCAweDMwQjksIDB4MzBCQiwKKyAgICAweDMwQkQsIDB4MzBCRiwgMHgzMEMxLCAweDMwQzQsIDB4MzBDNiwgMHgzMEM4LCAweDMwQ0EsIDB4MzBDQiwgMHgzMENDLAorICAgIDB4MzBDRCwgMHgzMENFLCAweDMwQ0YsIDB4MzBEMiwgMHgzMEQ1LCAweDMwRDgsIDB4MzBEQiwgMHgzMERFLCAweDMwREYsCisgICAgMHgzMEUwLCAweDMwRTEsIDB4MzBFMiwgMHgzMEU0LCAweDMwRTYsIDB4MzBFOCwgMHgzMEU5LCAweDMwRUEsIDB4MzBFQiwKKyAgICAweDMwRUMsIDB4MzBFRCwgMHgzMEVGLCAweDMwRjAsIDB4MzBGMSwgMHgzMEYyLCAweDMwRjMsIDB4NjVFNSwgMHg2NzA4LAorICAgIDB4NzA2QiwgMHg2QzM0LCAweDY3MjgsIDB4OTFEMSwgMHg1NzFGLCAweDhDQTAsIDB4NTJERCwgMHg1NTRGLCAweDdCNTQsCisgICAgMHg0RjhCLCAweDI1QTEsIDB4MjVBMSwgMHgwMDMwLCAweDAwMDAsIDB4MDAzMSwgMHgwMDAwLCAweDAwMzIsIDB4MDAwMCwKKyAgICAweDAwMzMsIDB4MDAwMCwgMHgwMDM0LCAweDAwMDAsIDB4MDAzNSwgMHgwMDAwLCAweDAwMzYsIDB4MDAwMCwgMHgwMDM3LAorICAgIDB4MDAwMCwgMHgwMDM4LCAweDAwMDAsIDB4MDAzOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKyAgICAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLAorICAgIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsCisgICAgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwKKyAgICAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LCAweDAwNDgsIDB4MDA0OSwgMHgwMDRBLCAweDAwNEIsIDB4MDA0QywgMHgwMDRELAorICAgIDB4MDA0RSwgMHgwMDRGLCAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsCisgICAgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwgMHgwMDVBLCAweDMwNDIsIDB4MzA0NCwgMHgzMDQ2LCAweDMwNDgsIDB4MzA0QSwKKyAgICAweDMwNEIsIDB4MzA0RCwgMHgzMDRGLCAweDMwNTEsIDB4MzA1MywgMHgzMDU1LCAweDMwNTcsIDB4MzA1OSwgMHgzMDVCLAorICAgIDB4MzA1RCwgMHgzMDVGLCAweDMwNjEsIDB4MzA2NCwgMHgzMDY2LCAweDMwNjgsIDB4MzA2QSwgMHgzMDZCLCAweDMwNkMsCisgICAgMHgzMDZELCAweDMwNkUsIDB4MzA2RiwgMHgzMDcyLCAweDMwNzUsIDB4MzA3OCwgMHgzMDdCLCAweDMwN0UsIDB4MzA3RiwKKyAgICAweDMwODAsIDB4MzA4MSwgMHgzMDgyLCAweDMwODQsIDB4MzA4NiwgMHgzMDg4LCAweDMwODksIDB4MzA4QSwgMHgzMDhCLAorICAgIDB4MzA4QywgMHgzMDhELCAweDMwOEYsIDB4MzA5MCwgMHgzMDkxLCAweDMwOTIsIDB4MzA5MywgMHgzMEEyLCAweDMwQTQsCisgICAgMHgzMEE2LCAweDMwQTgsIDB4MzBBQSwgMHgzMEFCLCAweDMwQUQsIDB4MzBBRiwgMHgzMEIxLCAweDMwQjMsIDB4MzBCNSwKKyAgICAweDMwQjcsIDB4MzBCOSwgMHgzMEJCLCAweDMwQkQsIDB4MzBCRiwgMHgzMEMxLCAweDMwQzQsIDB4MzBDNiwgMHgzMEM4LAorICAgIDB4MzBDQSwgMHgzMENCLCAweDMwQ0MsIDB4MzBDRCwgMHgzMENFLCAweDMwQ0YsIDB4MzBEMiwgMHgzMEQ1LCAweDMwRDgsCisgICAgMHgzMERCLCAweDMwREUsIDB4MzBERiwgMHgzMEUwLCAweDMwRTEsIDB4MzBFMiwgMHgzMEU0LCAweDMwRTYsIDB4MzBFOCwKKyAgICAweDMwRTksIDB4MzBFQSwgMHgzMEVCLCAweDMwRUMsIDB4MzBFRCwgMHgzMEVGLCAweDMwRjAsIDB4MzBGMSwgMHgzMEYyLAorICAgIDB4MzBGMywgMHg2NUU1LCAweDY3MDgsIDB4NzA2QiwgMHg2QzM0LCAweDY3MjgsIDB4OTFEMSwgMHg1NzFGLCAweDU1NEYsCisgICAgMHg3QjU0LCAweDRGOEIsIDB4MjVBMCwgMHgwMDMwLCAweDAwMDAsIDB4MDAzMSwgMHgwMDAwLCAweDAwMzIsIDB4MDAwMCwKKyAgICAweDAwMzMsIDB4MDAwMCwgMHgwMDM0LCAweDAwMDAsIDB4MDAzNSwgMHgwMDAwLCAweDAwMzYsIDB4MDAwMCwgMHgwMDM3LAorICAgIDB4MDAwMCwgMHgwMDM4LCAweDAwMDAsIDB4MDAzOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKyAgICAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLAorICAgIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsCisgICAgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwKKyAgICAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LCAweDAwNDgsIDB4MDA0OSwgMHgwMDRBLCAweDAwNEIsIDB4MDA0QywgMHgwMDRELAorICAgIDB4MDA0RSwgMHgwMDRGLCAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsCisgICAgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwgMHgwMDVBLCAweDMwNDIsIDB4MzA0NCwgMHgzMDQ2LCAweDMwNDgsIDB4MzA0QSwKKyAgICAweDMwNEIsIDB4MzA0RCwgMHgzMDRGLCAweDMwNTEsIDB4MzA1MywgMHgzMDU1LCAweDMwNTcsIDB4MzA1OSwgMHgzMDVCLAorICAgIDB4MzA1RCwgMHgzMDVGLCAweDMwNjEsIDB4MzA2NCwgMHgzMDY2LCAweDMwNjgsIDB4MzA2QSwgMHgzMDZCLCAweDMwNkMsCisgICAgMHgzMDZELCAweDMwNkUsIDB4MzA2RiwgMHgzMDcyLCAweDMwNzUsIDB4MzA3OCwgMHgzMDdCLCAweDMwN0UsIDB4MzA3RiwKKyAgICAweDMwODAsIDB4MzA4MSwgMHgzMDgyLCAweDMwODQsIDB4MzA4NiwgMHgzMDg4LCAweDMwODksIDB4MzA4QSwgMHgzMDhCLAorICAgIDB4MzA4QywgMHgzMDhELCAweDMwOEYsIDB4MzA5MCwgMHgzMDkxLCAweDMwOTIsIDB4MzA5MywgMHgzMEEyLCAweDMwQTQsCisgICAgMHgzMEE2LCAweDMwQTgsIDB4MzBBQSwgMHgzMEFCLCAweDMwQUQsIDB4MzBBRiwgMHgzMEIxLCAweDMwQjMsIDB4MzBCNSwKKyAgICAweDMwQjcsIDB4MzBCOSwgMHgzMEJCLCAweDMwQkQsIDB4MzBCRiwgMHgzMEMxLCAweDMwQzQsIDB4MzBDNiwgMHgzMEM4LAorICAgIDB4MzBDQSwgMHgzMENCLCAweDMwQ0MsIDB4MzBDRCwgMHgzMENFLCAweDMwQ0YsIDB4MzBEMiwgMHgzMEQ1LCAweDMwRDgsCisgICAgMHgzMERCLCAweDMwREUsIDB4MzBERiwgMHgzMEUwLCAweDMwRTEsIDB4MzBFMiwgMHgzMEU0LCAweDMwRTYsIDB4MzBFOCwKKyAgICAweDMwRTksIDB4MzBFQSwgMHgzMEVCLCAweDMwRUMsIDB4MzBFRCwgMHgzMEVGLCAweDMwRjAsIDB4MzBGMSwgMHgzMEYyLAorICAgIDB4MzBGMywgMHg2NUU1LCAweDY3MDgsIDB4NzA2QiwgMHg2QzM0LCAweDY3MjgsIDB4OTFEMSwgMHg1NzFGLCAweDU1NEYsCisgICAgMHg3QjU0LCAweDRGOEIsIDB4MDAzMCwgMHgwMDAwLCAweDAwMzEsIDB4MDAwMCwgMHgwMDMyLCAweDAwMDAsIDB4MDAzMywKKyAgICAweDAwMDAsIDB4MDAzNCwgMHgwMDAwLCAweDAwMzUsIDB4MDAwMCwgMHgwMDM2LCAweDAwMDAsIDB4MDAzNywgMHgwMDAwLAorICAgIDB4MDAzOCwgMHgwMDAwLCAweDAwMzksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwKKyAgICAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywgMHgwMDZELAorICAgIDB4MDA2RSwgMHgwMDZGLCAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsCisgICAgMHgwMDc3LCAweDAwNzgsIDB4MDA3OSwgMHgwMDdBLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwKKyAgICAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLAorICAgIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisgICAgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgzMDQyLCAweDMwNDQsIDB4MzA0NiwgMHgzMDQ4LCAweDMwNEEsIDB4MzA0QiwKKyAgICAweDMwNEQsIDB4MzA0RiwgMHgzMDUxLCAweDMwNTMsIDB4MzA1NSwgMHgzMDU3LCAweDMwNTksIDB4MzA1QiwgMHgzMDVELAorICAgIDB4MzA1RiwgMHgzMDYxLCAweDMwNjQsIDB4MzA2NiwgMHgzMDY4LCAweDMwNkEsIDB4MzA2QiwgMHgzMDZDLCAweDMwNkQsCisgICAgMHgzMDZFLCAweDMwNkYsIDB4MzA3MiwgMHgzMDc1LCAweDMwNzgsIDB4MzA3QiwgMHgzMDdFLCAweDMwN0YsIDB4MzA4MCwKKyAgICAweDMwODEsIDB4MzA4MiwgMHgzMDg0LCAweDMwODYsIDB4MzA4OCwgMHgzMDg5LCAweDMwOEEsIDB4MzA4QiwgMHgzMDhDLAorICAgIDB4MzA4RCwgMHgzMDhGLCAweDMwOTAsIDB4MzA5MSwgMHgzMDkyLCAweDMwOTMsIDB4MzBBMiwgMHgzMEE0LCAweDMwQTYsCisgICAgMHgzMEE4LCAweDMwQUEsIDB4MzBBQiwgMHgzMEFELCAweDMwQUYsIDB4MzBCMSwgMHgzMEIzLCAweDMwQjUsIDB4MzBCNywKKyAgICAweDMwQjksIDB4MzBCQiwgMHgzMEJELCAweDMwQkYsIDB4MzBDMSwgMHgzMEM0LCAweDMwQzYsIDB4MzBDOCwgMHgzMENBLAorICAgIDB4MzBDQiwgMHgzMENDLCAweDMwQ0QsIDB4MzBDRSwgMHgzMENGLCAweDMwRDIsIDB4MzBENSwgMHgzMEQ4LCAweDMwREIsCisgICAgMHgzMERFLCAweDMwREYsIDB4MzBFMCwgMHgzMEUxLCAweDMwRTIsIDB4MzBFNCwgMHgzMEU2LCAweDMwRTgsIDB4MzBFOSwKKyAgICAweDMwRUEsIDB4MzBFQiwgMHgzMEVDLCAweDMwRUQsIDB4MzBFRiwgMHgzMEYwLCAweDMwRjEsIDB4MzBGMiwgMHgzMEYzLAorICAgIDB4NjVFNSwgMHg2NzA4LCAweDcwNkIsIDB4NkMzNCwgMHg2NzI4LCAweDkxRDEsIDB4NTcxRiwgMHg1NTRGLCAweDdCNTQsCisgICAgMHg0RjhCLCAweDI1QTAsIDB4MzNDMiwgMHgzM0NELCAweDIxMTYsIDB4MDAwMCwgMHgzM0Q4LCAweDMzREEsIDB4MjEyMSwKKyAgICAweDIxMjIsIDB4MDAwMCwgMHgyMTAwLCAweDMzQzIsIDB4MDAwMCwgMHgzM0M0LCAweDIxMDUsIDB4MzM5NywgMHgzMzcxLAorICAgIDB4MzM5OCwgMHgyMTEzLCAweDMzOEQsIDB4MzM5QiwgMHgzMzk2LCAweDAwMDAsIDB4MDAwMCwgMHgzM0Q3LCAweDMzRDgsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzMzAxLCAweDMzMDIsIDB4MzMwNCwgMHgzMzA2LCAweDAwMDAsIDB4MzMwOCwKKyAgICAweDAwMDAsIDB4MzMwNywgMHgzMzBBLCAweDAwMDAsIDB4MzMwOSwgMHgwMDAwLCAweDMzMEIsIDB4MDAwMCwgMHgzMzBDLAorICAgIDB4MzMwRSwgMHgzMzBGLCAweDMzMTAsIDB4MzMxMSwgMHgzMzEyLCAweDMzMTMsIDB4MDAwMCwgMHgzMzE3LCAweDAwMDAsCisgICAgMHgzMzE5LCAweDAwMDAsIDB4MzMxQSwgMHgzMzFCLCAweDMzMUMsIDB4MzMxRCwgMHgzMzFGLCAweDMzMjAsIDB4MzMyMSwKKyAgICAweDMzMjQsIDB4MDAwMCwgMHgzMzI1LCAweDAwMDAsIDB4MDAwMCwgMHgzMzI4LCAweDMzMjksIDB4MDAwMCwgMHgzMzJELAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDMzMkUsIDB4MzMyRiwgMHgzMzMwLCAweDMzMzIsIDB4MDAwMCwgMHgwMDAwLCAweDMzMzQsCisgICAgMHgzMzM1LCAweDMzM0MsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MzMzNywgMHgwMDAwLCAweDMzMzgsIDB4MzMzQSwKKyAgICAweDMzM0QsIDB4MzM0MSwgMHgzMzNFLCAweDMzM0YsIDB4MzM0MCwgMHgzMzQzLCAweDMzNDQsIDB4MzM0NSwgMHgzMzQ2LAorICAgIDB4MzM0OCwgMHgzMzRCLCAweDMzNEMsIDB4MzM0RiwgMHgzMzUwLCAweDAwMDAsIDB4MDAwMCwgMHgzMzUyLCAweDMzNTQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MzM1MywgMHgzMzU1LCAweDMzNTYsIDB4MDAwMCwgMHgzMzAxLCAweDMzMDIsIDB4MzMwNCwKKyAgICAweDMzMDYsIDB4MDAwMCwgMHgzMzA4LCAweDAwMDAsIDB4MzMwNywgMHgzMzBBLCAweDAwMDAsIDB4MzMwOSwgMHgwMDAwLAorICAgIDB4MzMwQiwgMHgwMDAwLCAweDMzMEMsIDB4MzMwRSwgMHgzMzBGLCAweDMzMTAsIDB4MzMxMSwgMHgzMzEyLCAweDMzMTMsCisgICAgMHgwMDAwLCAweDMzMTcsIDB4MDAwMCwgMHgzMzE5LCAweDAwMDAsIDB4MzMxQSwgMHgzMzFCLCAweDMzMUMsIDB4MzMxRCwKKyAgICAweDMzMUYsIDB4MzMyMCwgMHgzMzIxLCAweDMzMjQsIDB4MDAwMCwgMHgzMzI1LCAweDAwMDAsIDB4MDAwMCwgMHgzMzI4LAorICAgIDB4MzMyOSwgMHgwMDAwLCAweDMzMkQsIDB4MDAwMCwgMHgwMDAwLCAweDMzMkUsIDB4MzMyRiwgMHgzMzMwLCAweDMzMzIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MzMzNCwgMHgzMzM1LCAweDMzM0MsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MzMzNywKKyAgICAweDAwMDAsIDB4MzMzOCwgMHgzMzNBLCAweDMzM0QsIDB4MzM0MSwgMHgzMzNFLCAweDMzM0YsIDB4MzM0MCwgMHgzMzQzLAorICAgIDB4MzM0NCwgMHgzMzQ1LCAweDMzNDYsIDB4MzM0OCwgMHgzMzRCLCAweDMzNEMsIDB4MzM0RiwgMHgzMzUwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDMzNTIsIDB4MzM1NCwgMHgwMDAwLCAweDAwMDAsIDB4MzM1MywgMHgzMzU1LCAweDMzNTYsIDB4MzM3RSwKKyAgICAweDMzN0QsIDB4MzM3QywgMHgzMzdCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDJELCAweDAwM0QsIDB4MjEwMywgMHgyNjQwLCAweDI2NDIsIDB4MzAxMywKKyAgICAweDMwMTIsIDB4MzAwQywgMHgzMDBELCAweDMwMEUsIDB4MzAwRiwgMHgzMDFBLCAweDMwMUIsIDB4MzAxOCwgMHgzMDE5LAorICAgIDB4RkYwOCwgMHhGRjA5LCAweDMwMUQsIDB4MzAxRSwgMHgyMDE4LCAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDAwMjcsCisgICAgMHgwMDIyLCAweDAwMDAsIDB4MjEzNSwgMHgwM0QwLCAweDIyMEEsIDB4MjEwRiwgMHgwMEI1LCAweDAzQzYsIDB4MDNEQiwKKyAgICAweDAzRDEsIDB4RkZGRCwgMHgyNjY4LCAweDI2NjksIDB4MjY2QywgMHhGRjFBLCAweDAwQTksIDB4MDBBOSwgMHgwMEFFLAorICAgIDB4MDBBRSwgMHgzMDNCLCAweDMwM0IsIDB4MzAzMywgMHgzMDM0LCAweDMwMzUsIDB4MjAzQywgMHgyMDQ5LCAweDAwMjEsCisgICAgMHgyMDNDLCAweDIwNDksIDB4MjQ0QSwgMHgwMDAwLCAweDIyMTMsIDB4MjI2MCwgMHgyMjQzLCAweDIyNzIsIDB4MjI3MywKKyAgICAweDMwMEMsIDB4MzAwRCwgMHgzMDBFLCAweDMwMEYsIDB4MzAxQSwgMHgzMDFCLCAweDMwMTgsIDB4MzAxOSwgMHhGRjVGLAorICAgIDB4RkY2MCwgMHgzMDBDLCAweDMwMEQsIDB4MzAwRSwgMHgzMDBGLCAweDMwMUEsIDB4MzAxQiwgMHgzMDE4LCAweDMwMTksCisgICAgMHhGRjVGLCAweEZGNjAsIDB4MjM5QiwgMHgyMzlELCAweDIzOUUsIDB4MjNBMCwgMHgyMzlELCAweDIzOUIsIDB4MjNBMCwKKyAgICAweDIzOUUsIDB4MjNBMSwgMHgyM0EzLCAweDIzQTQsIDB4MjNBNiwgMHgyM0EzLCAweDIzQTEsIDB4MjNBNiwgMHgyM0E0LAorICAgIDB4MjNBMSwgMHgyM0EzLCAweDIzQTQsIDB4MjNBNiwgMHgyM0EzLCAweDIzQTEsIDB4MjNBNiwgMHgyM0E0LCAweEZGNUMsCisgICAgMHgyMDE1LCAweDMwMUQsIDB4MzAxRSwgMHgyMDE4LCAweDIwMTksIDB4MjAxOCwgMHgyMDE5LCAweDI3MDIsIDB4MjcwMiwKKyAgICAweDI3MDIsIDB4MjcwMiwgMHgzMDNELCAweDMwMTIsIDB4MzA5RiwgMHg1MzRELCAweDIyMDcsIDB4MjIwNSwgMHgyMkEwLAorICAgIDB4MjI5NiwgMHgyMjk4LCAweDIyOTUsIDB4MjI5NywgMHgyMjlFLCAweDIyOTUsIDB4MDAyMSwgMHgyNUIzLCAweDI1QzAsCisgICAgMHgyNUI2LCAweDIxRTYsIDB4MjFFOCwgMHgyMUU3LCAweDIxRTksIDB4MjFEMCwgMHgyMTk0LCAweDIxOTgsIDB4MjE5OSwKKyAgICAweDIxOTYsIDB4MjE5NywgMHgyMUNDLCAweDIxQzYsIDB4MjFDNCwgMHgyMUM1LCAweDIxOTAsIDB4MjE5MiwgMHgyMTkxLAorICAgIDB4MjE5MywgMHgyMTk0LCAweDIxOTUsIDB4MjUwNCwgMHgyNTA2LCAweDMwMzAsIDB4MjMwNywgMHgzMDMwLCAweDIzMDcsCisgICAgMHgzMDMwLCAweDIzMDcsIDB4MzAzMCwgMHgyMzA3LCAweDMwMzAsIDB4MjMwNywgMHgyNzQwLCAweDI3M0YsIDB4MjVBMSwKKyAgICAweDI1QTAsIDB4MjVBMSwgMHgyNUExLCAweDI1QTEsIDB4MjVBMSwgMHgyNUExLCAweDI1QUIsIDB4MjVBMCwgMHgyNUFBLAorICAgIDB4MjcxQSwgMHgyNzFBLCAweDI1QzcsIDB4MjVDNiwgMHgyNUM3LCAweDI1QzcsIDB4MjVDNywgMHgyNUM3LCAweDI1QzcsCisgICAgMHgyNUM2LCAweDI1QzYsIDB4MjVDRSwgMHgyNUM5LCAweDI1Q0IsIDB4MjVFNiwgMHgyNUNGLCAweDIwMjIsIDB4Mjc1NiwKKyAgICAweDI3NTYsIDB4Mjc1NiwgMHgyNzU2LCAweDMwMDgsIDB4MzAwOSwgMHgzMDA4LCAweDMwMDksIDB4MzAwQSwgMHgzMDBCLAorICAgIDB4MzAwQSwgMHgzMDBCLCAweDMwNTMsIDB4MzA1MywgMHgzMEIzLCAweDMwQjMsIDB4MzA5RCwgMHgzMDlFLCAweDMwNDEsCisgICAgMHgzMDQyLCAweDMwNDMsIDB4MzA0NCwgMHgzMDQ1LCAweDMwNDYsIDB4MzA0NywgMHgzMDQ4LCAweDMwNDksIDB4MzA0QSwKKyAgICAweDMwNEIsIDB4MzA0QiwgMHgzMDRDLCAweDMwNEQsIDB4MzA0RSwgMHgzMDRGLCAweDMwNTAsIDB4MzA1MSwgMHgzMDUxLAorICAgIDB4MzA1MiwgMHgzMDUzLCAweDMwNTMsIDB4MzA1NCwgMHgzMDU1LCAweDMwNTYsIDB4MzA1NywgMHgzMDU4LCAweDMwNTksCisgICAgMHgzMDVBLCAweDMwNUIsIDB4MzA1QywgMHgzMDVELCAweDMwNUUsIDB4MzA1RiwgMHgzMDYwLCAweDMwNjEsIDB4MzA2MiwKKyAgICAweDMwNjMsIDB4MzA2NCwgMHgzMDY1LCAweDMwNjYsIDB4MzA2NywgMHgzMDY4LCAweDMwNjksIDB4MzA2QSwgMHgzMDZCLAorICAgIDB4MzA2QywgMHgzMDZELCAweDMwNkUsIDB4MzA2RiwgMHgzMDcwLCAweDMwNzEsIDB4MzA3MiwgMHgzMDczLCAweDMwNzQsCisgICAgMHgzMDc1LCAweDMwNzYsIDB4MzA3NywgMHgzMDc4LCAweDMwNzksIDB4MzA3QSwgMHgzMDdCLCAweDMwN0MsIDB4MzA3RCwKKyAgICAweDMwN0UsIDB4MzA3RiwgMHgzMDgwLCAweDMwODEsIDB4MzA4MiwgMHgzMDgzLCAweDMwODQsIDB4MzA4NSwgMHgzMDg2LAorICAgIDB4MzA4NywgMHgzMDg4LCAweDMwODksIDB4MzA4QSwgMHgzMDhCLCAweDMwOEMsIDB4MzA4RCwgMHgzMDhFLCAweDMwOEYsCisgICAgMHgzMDkwLCAweDMwOTEsIDB4MzA5MiwgMHgzMDkzLCAweDMwOTQsIDB4MzBGRCwgMHgzMEZFLCAweDMwRkMsIDB4MzBBMSwKKyAgICAweDMwQTIsIDB4MzBBMywgMHgzMEE0LCAweDMwQTUsIDB4MzBBNiwgMHgzMEE3LCAweDMwQTgsIDB4MzBBOSwgMHgzMEFBLAorICAgIDB4MzBGNSwgMHgzMEFCLCAweDMwQUMsIDB4MzBBRCwgMHgzMEFFLCAweDMwQUYsIDB4MzBCMCwgMHgzMEY2LCAweDMwQjEsCisgICAgMHgzMEIyLCAweDMwQjMsIDB4MzBCMywgMHgzMEI0LCAweDMwQjUsIDB4MzBCNiwgMHgzMEI3LCAweDMwQjgsIDB4MzBCOSwKKyAgICAweDMwQkEsIDB4MzBCQiwgMHgzMEJDLCAweDMwQkQsIDB4MzBCRSwgMHgzMEJGLCAweDMwQzAsIDB4MzBDMSwgMHgzMEMyLAorICAgIDB4MzBDMywgMHgzMEM0LCAweDMwQzUsIDB4MzBDNiwgMHgzMEM3LCAweDMwQzgsIDB4MzBDOSwgMHgzMENBLCAweDMwQ0IsCisgICAgMHgzMENDLCAweDMwQ0QsIDB4MzBDRSwgMHgzMENGLCAweDMwRDAsIDB4MzBEMSwgMHgzMEQyLCAweDMwRDMsIDB4MzBENCwKKyAgICAweDMwRDUsIDB4MzBENiwgMHgzMEQ3LCAweDMwRDgsIDB4MzBEOSwgMHgzMERBLCAweDMwREIsIDB4MzBEQywgMHgzMERELAorICAgIDB4MzBERSwgMHgzMERGLCAweDMwRTAsIDB4MzBFMSwgMHgzMEUyLCAweDMwRTMsIDB4MzBFNCwgMHgzMEU1LCAweDMwRTYsCisgICAgMHgzMEU3LCAweDMwRTgsIDB4MzBFOSwgMHgzMEVBLCAweDMwRUIsIDB4MzBFQywgMHgzMEVELCAweDMwRUUsIDB4MzBFRiwKKyAgICAweDMwRjAsIDB4MzBGMSwgMHgzMEYyLCAweDMwRjMsIDB4MzBGNCwgMHgzMEY3LCAweDMwRjgsIDB4MzBGOSwgMHgzMEZBLAorICAgIDB4MzA5RCwgMHgzMDlFLCAweDMwNDEsIDB4MzA0MiwgMHgzMDQzLCAweDMwNDQsIDB4MzA0NSwgMHgzMDQ2LCAweDMwNDcsCisgICAgMHgzMDQ4LCAweDMwNDksIDB4MzA0QSwgMHgzMDRCLCAweDMwNEIsIDB4MzA0QywgMHgzMDRELCAweDMwNEUsIDB4MzA0RiwKKyAgICAweDMwNTAsIDB4MzA1MSwgMHgzMDUxLCAweDMwNTIsIDB4MzA1MywgMHgzMDUzLCAweDMwNTQsIDB4MzA1NSwgMHgzMDU2LAorICAgIDB4MzA1NywgMHgzMDU4LCAweDMwNTksIDB4MzA1QSwgMHgzMDVCLCAweDMwNUMsIDB4MzA1RCwgMHgzMDVFLCAweDMwNUYsCisgICAgMHgzMDYwLCAweDMwNjEsIDB4MzA2MiwgMHgzMDYzLCAweDMwNjQsIDB4MzA2NSwgMHgzMDY2LCAweDMwNjcsIDB4MzA2OCwKKyAgICAweDMwNjksIDB4MzA2QSwgMHgzMDZCLCAweDMwNkMsIDB4MzA2RCwgMHgzMDZFLCAweDMwNkYsIDB4MzA3MCwgMHgzMDcxLAorICAgIDB4MzA3MiwgMHgzMDczLCAweDMwNzQsIDB4MzA3NSwgMHgzMDc2LCAweDMwNzcsIDB4MzA3OCwgMHgzMDc5LCAweDMwN0EsCisgICAgMHgzMDdCLCAweDMwN0MsIDB4MzA3RCwgMHgzMDdFLCAweDMwN0YsIDB4MzA4MCwgMHgzMDgxLCAweDMwODIsIDB4MzA4MywKKyAgICAweDMwODQsIDB4MzA4NSwgMHgzMDg2LCAweDMwODcsIDB4MzA4OCwgMHgzMDg5LCAweDMwOEEsIDB4MzA4QiwgMHgzMDhDLAorICAgIDB4MzA4RCwgMHgzMDhFLCAweDMwOEYsIDB4MzA5MCwgMHgzMDkxLCAweDMwOTIsIDB4MzA5MywgMHgzMDk0LCAweDMwRkQsCisgICAgMHgzMEZFLCAweDMwRkMsIDB4MzBBMSwgMHgzMEEyLCAweDMwQTMsIDB4MzBBNCwgMHgzMEE1LCAweDMwQTYsIDB4MzBBNywKKyAgICAweDMwQTgsIDB4MzBBOSwgMHgzMEFBLCAweDMwRjUsIDB4MzBBQiwgMHgzMEFDLCAweDMwQUQsIDB4MzBBRSwgMHgzMEFGLAorICAgIDB4MzBCMCwgMHgzMEY2LCAweDMwQjEsIDB4MzBCMiwgMHgzMEIzLCAweDMwQjMsIDB4MzBCNCwgMHgzMEI1LCAweDMwQjYsCisgICAgMHgzMEI3LCAweDMwQjgsIDB4MzBCOSwgMHgzMEJBLCAweDMwQkIsIDB4MzBCQywgMHgzMEJELCAweDMwQkUsIDB4MzBCRiwKKyAgICAweDMwQzAsIDB4MzBDMSwgMHgzMEMyLCAweDMwQzMsIDB4MzBDNCwgMHgzMEM1LCAweDMwQzYsIDB4MzBDNywgMHgzMEM4LAorICAgIDB4MzBDOSwgMHgzMENBLCAweDMwQ0IsIDB4MzBDQywgMHgzMENELCAweDMwQ0UsIDB4MzBDRiwgMHgzMEQwLCAweDMwRDEsCisgICAgMHgzMEQyLCAweDMwRDMsIDB4MzBENCwgMHgzMEQ1LCAweDMwRDYsIDB4MzBENywgMHgzMEQ4LCAweDMwRDksIDB4MzBEQSwKKyAgICAweDMwREIsIDB4MzBEQywgMHgzMERELCAweDMwREUsIDB4MzBERiwgMHgzMEUwLCAweDMwRTEsIDB4MzBFMiwgMHgzMEUzLAorICAgIDB4MzBFNCwgMHgzMEU1LCAweDMwRTYsIDB4MzBFNywgMHgzMEU4LCAweDMwRTksIDB4MzBFQSwgMHgzMEVCLCAweDMwRUMsCisgICAgMHgzMEVELCAweDMwRUUsIDB4MzBFRiwgMHgzMEYwLCAweDMwRjEsIDB4MzBGMiwgMHgzMEYzLCAweDMwRjQsIDB4MzBGNywKKyAgICAweDMwRjgsIDB4MzBGOSwgMHgzMEZBLCAweDMwMDEsIDB4MzAwMiwgMHgzMEZCLCAweEZGMEEsIDB4MjAzQiwgMHgyNUNCLAorICAgIDB4MjVDRSwgMHgyNUM5LCAweDI1QjMsIDB4MjVCMiwgMHgzMEZELCAweDMwRkUsIDB4MzA5RCwgMHgzMDlFLCAweEZGMDgsCisgICAgMHhGRjA5LCAweDMwMTQsIDB4MzAxNSwgMHhGRjA4LCAweEZGMDksIDB4MzAxNCwgMHgzMDE1LCAweDAwMzAsIDB4MDAzMSwKKyAgICAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgzMDQxLAorICAgIDB4MzA0MiwgMHgzMDQzLCAweDMwNDQsIDB4MzA0NSwgMHgzMDQ2LCAweDMwNDcsIDB4MzA0OCwgMHgzMDQ5LCAweDMwNEEsCisgICAgMHgzMDRCLCAweDMwNEIsIDB4MzA0QywgMHgzMDRELCAweDMwNEUsIDB4MzA0RiwgMHgzMDUwLCAweDMwNTEsIDB4MzA1MSwKKyAgICAweDMwNTIsIDB4MzA1MywgMHgzMDU0LCAweDMwNTUsIDB4MzA1NiwgMHgzMDU3LCAweDMwNTgsIDB4MzA1OSwgMHgzMDVBLAorICAgIDB4MzA1QiwgMHgzMDVDLCAweDMwNUQsIDB4MzA1RSwgMHgzMDVGLCAweDMwNjAsIDB4MzA2MSwgMHgzMDYyLCAweDMwNjMsCisgICAgMHgzMDY0LCAweDMwNjUsIDB4MzA2NiwgMHgzMDY3LCAweDMwNjgsIDB4MzA2OSwgMHgzMDZBLCAweDMwNkIsIDB4MzA2QywKKyAgICAweDMwNkQsIDB4MzA2RSwgMHgzMDZGLCAweDMwNzAsIDB4MzA3MSwgMHgzMDcyLCAweDMwNzMsIDB4MzA3NCwgMHgzMDc1LAorICAgIDB4MzA3NiwgMHgzMDc3LCAweDMwNzgsIDB4MzA3OSwgMHgzMDdBLCAweDMwN0IsIDB4MzA3QywgMHgzMDdELCAweDMwN0UsCisgICAgMHgzMDdGLCAweDMwODAsIDB4MzA4MSwgMHgzMDgyLCAweDMwODMsIDB4MzA4NCwgMHgzMDg1LCAweDMwODYsIDB4MzA4NywKKyAgICAweDMwODgsIDB4MzA4OSwgMHgzMDhBLCAweDMwOEIsIDB4MzA4QywgMHgzMDhELCAweDMwOEUsIDB4MzA4RiwgMHgzMDkwLAorICAgIDB4MzA5MSwgMHgzMDkyLCAweDMwOTMsIDB4MzA5NCwgMHgzMDQxLCAweDMwNDMsIDB4MzA0NSwgMHgzMDQ3LCAweDMwNDksCisgICAgMHgzMDRCLCAweDMwNTEsIDB4MzA2MywgMHgzMDgzLCAweDMwODUsIDB4MzA4NywgMHgzMDhFLCAweDMwQTEsIDB4MzBBMiwKKyAgICAweDMwQTMsIDB4MzBBNCwgMHgzMEE1LCAweDMwQTYsIDB4MzBBNywgMHgzMEE4LCAweDMwQTksIDB4MzBBQSwgMHgzMEFCLAorICAgIDB4MzBGNSwgMHgzMEFDLCAweDMwQUQsIDB4MzBBRSwgMHgzMEFGLCAweDMwQjAsIDB4MzBCMSwgMHgzMEY2LCAweDMwQjIsCisgICAgMHgzMEIzLCAweDMwQjQsIDB4MzBCNSwgMHgzMEI2LCAweDMwQjcsIDB4MzBCOCwgMHgzMEI5LCAweDMwQkEsIDB4MzBCQiwKKyAgICAweDMwQkMsIDB4MzBCRCwgMHgzMEJFLCAweDMwQkYsIDB4MzBDMCwgMHgzMEMxLCAweDMwQzIsIDB4MzBDMywgMHgzMEM0LAorICAgIDB4MzBDNSwgMHgzMEM2LCAweDMwQzcsIDB4MzBDOCwgMHgzMEM5LCAweDMwQ0EsIDB4MzBDQiwgMHgzMENDLCAweDMwQ0QsCisgICAgMHgzMENFLCAweDMwQ0YsIDB4MzBEMCwgMHgzMEQxLCAweDMwRDIsIDB4MzBEMywgMHgzMEQ0LCAweDMwRDUsIDB4MzBENiwKKyAgICAweDMwRDcsIDB4MzBEOCwgMHgzMEQ5LCAweDMwREEsIDB4MzBEQiwgMHgzMERDLCAweDMwREQsIDB4MzBERSwgMHgzMERGLAorICAgIDB4MzBFMCwgMHgzMEUxLCAweDMwRTIsIDB4MzBFMywgMHgzMEU0LCAweDMwRTUsIDB4MzBFNiwgMHgzMEU3LCAweDMwRTgsCisgICAgMHgzMEU5LCAweDMwRUEsIDB4MzBFQiwgMHgzMEVDLCAweDMwRUQsIDB4MzBFRSwgMHgzMEVGLCAweDMwRjAsIDB4MzBGMSwKKyAgICAweDMwRjIsIDB4MzBGMywgMHgzMEY0LCAweDMwQTEsIDB4MzBBMywgMHgzMEE1LCAweDMwQTcsIDB4MzBBOSwgMHgzMEY1LAorICAgIDB4MzBGNiwgMHgzMEMzLCAweDMwRTMsIDB4MzBFNSwgMHgzMEU3LCAweDMwRUUsIDB4MzBGQywgMHgzMEZDLCAweDZDRTgsCisgICAgMHgyMEFDLCAweDIxMjYsIDB4MjAzMiwgMHgyMDMzLCAweEZCMDAsIDB4RkIwMywgMHhGQjA0LCAweDAxMDEsIDB4MDEyQiwKKyAgICAweDAxNkIsIDB4MDExMywgMHgwMTRELCAweDAxMDAsIDB4MDEyQSwgMHgwMTZBLCAweDAxMTIsIDB4MDE0QywgMHgyMTVCLAorICAgIDB4MjE1QywgMHgyMTVELCAweDIxNUUsIDB4MjE1MywgMHgyMTU0LCAweDIwNzAsIDB4MjA3NCwgMHgyMDc1LCAweDIwNzYsCisgICAgMHgyMDc3LCAweDIwNzgsIDB4MjA3OSwgMHgyMDgwLCAweDIwODEsIDB4MjA4MiwgMHgyMDgzLCAweDIwODQsIDB4MjA4NSwKKyAgICAweDIwODYsIDB4MjA4NywgMHgyMDg4LCAweDIwODksIDB4MDFDRCwgMHgwMTFBLCAweDAwMDAsIDB4MUVCQywgMHgwMUNGLAorICAgIDB4MDAwMCwgMHgwMTI4LCAweDAxRDEsIDB4MDAwMCwgMHgwMUQzLCAweDAxNkUsIDB4MDE2OCwgMHgwMUNFLCAweDAxMUIsCisgICAgMHgwMDAwLCAweDFFQkQsIDB4MDFEMCwgMHgwMDAwLCAweDAxMjksIDB4MDFEMiwgMHgwMDAwLCAweDAxRDQsIDB4MDE2RiwKKyAgICAweDAxNjksIDB4MDI1MSwgMHgwMjUxLCAweDAyNTEsIDB4MDFGRCwgMHgwMEU2LCAweDAyNTQsIDB4MDI1NCwgMHgwMjU0LAorICAgIDB4MDI1OSwgMHgwMjU5LCAweDAyNTksIDB4MDI1QSwgMHgwMjVBLCAweDAyNUEsIDB4MDI1QiwgMHgwMjVCLCAweDAyNUIsCisgICAgMHgwMDZBLCAweDAxNEIsIDB4MDI3NSwgMHgwMjhDLCAweDAyOEMsIDB4MDI4QywgMHgwMjkyLCAweDAyODMsIDB4MDJEMCwKKyAgICAweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywgMHgwMDI4LAorICAgIDB4MDAyOSwgMHgwMDJBLCAweDAwMkIsIDB4MDAyQywgMHgwMDJELCAweDAwMkUsIDB4MDAyRiwgMHgwMDMwLCAweDAwMzEsCisgICAgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgMHgwMDM4LCAweDAwMzksIDB4MDAzQSwKKyAgICAweDAwM0IsIDB4MDAzQywgMHgwMDNELCAweDAwM0UsIDB4MDAzRiwgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAorICAgIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsCisgICAgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwKKyAgICAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgwMDVCLCAweDAwQTUsIDB4MDA1RCwgMHgwMDVFLAorICAgIDB4MDA1RiwgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisgICAgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwKKyAgICAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LAorICAgIDB4MDA3QSwgMHgwMDdCLCAweDAwQTYsIDB4MDA3RCwgMHgwMzAzLCAweDAyQkMsIDB4MDA1QywgMHgwMkJCLCAweDAwN0MsCisgICAgMHgwMDdFLCAweDAwQTEsIDB4MDBBMiwgMHgwMEEzLCAweDIwNDQsIDB4MDE5MiwgMHgwMEE3LCAweDAwQTQsIDB4MjAxQywKKyAgICAweDAwQUIsIDB4MjAzOSwgMHgyMDNBLCAweEZCMDEsIDB4RkIwMiwgMHgyMDEyLCAweDIwMjAsIDB4MjAyMSwgMHgwMEI3LAorICAgIDB4MDBCNiwgMHgyMDIyLCAweDIwMUEsIDB4MjAxRSwgMHgyMDFELCAweDAwQkIsIDB4MjAyNiwgMHgyMDMwLCAweDAwQkYsCisgICAgMHgwMzAxLCAweDAzMDIsIDB4MDBBRiwgMHgwMzA2LCAweDAzMDcsIDB4MDMwOCwgMHgwMzBBLCAweDAwQjgsIDB4MDMwQiwKKyAgICAweDAzMjgsIDB4MDMwQywgMHgwMzM2LCAweDAwQzYsIDB4MDBBQSwgMHgwMTQxLCAweDAwRDgsIDB4MDE1MiwgMHgwMEJBLAorICAgIDB4MDBFNiwgMHgwMTMxLCAweDAxNDIsIDB4MDBGOCwgMHgwMTUzLCAweDAwREYsIDB4MDAyRCwgMHgwMEE5LCAweDAwQUMsCisgICAgMHgwMEFFLCAweDAwQjAsIDB4MDBCMSwgMHgwMEIyLCAweDAwQjMsIDB4MDBCNSwgMHgwMEI5LCAweDAwQkMsIDB4MDBCRCwKKyAgICAweDAwQkUsIDB4MDBDMCwgMHgwMEMxLCAweDAwQzIsIDB4MDBDMywgMHgwMEM0LCAweDAwQzUsIDB4MDBDNywgMHgwMEM4LAorICAgIDB4MDBDOSwgMHgwMENBLCAweDAwQ0IsIDB4MDBDQywgMHgwMENELCAweDAwQ0UsIDB4MDBDRiwgMHgwMEQwLCAweDAwRDEsCisgICAgMHgwMEQyLCAweDAwRDMsIDB4MDBENCwgMHgwMEQ1LCAweDAwRDYsIDB4MDBENywgMHgwMEQ5LCAweDAwREEsIDB4MDBEQiwKKyAgICAweDAwREMsIDB4MDBERCwgMHgwMERFLCAweDAwRTAsIDB4MDBFMSwgMHgwMEUyLCAweDAwRTMsIDB4MDBFNCwgMHgwMEU1LAorICAgIDB4MDBFNywgMHgwMEU4LCAweDAwRTksIDB4MDBFQSwgMHgwMEVCLCAweDAwRUMsIDB4MDBFRCwgMHgwMEVFLCAweDAwRUYsCisgICAgMHgwMEYwLCAweDAwRjEsIDB4MDBGMiwgMHgwMEYzLCAweDAwRjQsIDB4MDBGNSwgMHgwMEY2LCAweDAwRjcsIDB4MDBGOSwKKyAgICAweDAwRkEsIDB4MDBGQiwgMHgwMEZDLCAweDAwRkQsIDB4MDBGRSwgMHgwMEZGLCAweDAxNjAsIDB4MDE3OCwgMHgwMTdELAorICAgIDB4MDMwNSwgMHgwMTYxLCAweDIxMjIsIDB4MDE3RSwgMHgwMDMwLCAweDIwQUMsIDB4MjEyNiwgMHgyMDMyLCAweDIwMzMsCisgICAgMHhGQjAwLCAweEZCMDMsIDB4RkIwNCwgMHgwMTAxLCAweDAxMkIsIDB4MDE2QiwgMHgwMTEzLCAweDAxNEQsIDB4MDEwMCwKKyAgICAweDAxMkEsIDB4MDE2QSwgMHgwMTEyLCAweDAxNEMsIDB4MjE1QiwgMHgyMTVDLCAweDIxNUQsIDB4MjE1RSwgMHgyMTUzLAorICAgIDB4MjE1NCwgMHgyMDcwLCAweDIwNzQsIDB4MjA3NSwgMHgyMDc2LCAweDIwNzcsIDB4MjA3OCwgMHgyMDc5LCAweDIwODAsCisgICAgMHgyMDgxLCAweDIwODIsIDB4MjA4MywgMHgyMDg0LCAweDIwODUsIDB4MjA4NiwgMHgyMDg3LCAweDIwODgsIDB4MjA4OSwKKyAgICAweDAxQ0QsIDB4MDExQSwgMHgwMDAwLCAweDFFQkMsIDB4MDFDRiwgMHgwMDAwLCAweDAxMjgsIDB4MDFEMSwgMHgwMDAwLAorICAgIDB4MDFEMywgMHgwMTZFLCAweDAxNjgsIDB4MDFDRSwgMHgwMTFCLCAweDAwMDAsIDB4MUVCRCwgMHgwMUQwLCAweDAwMDAsCisgICAgMHgwMTI5LCAweDAxRDIsIDB4MDAwMCwgMHgwMUQ0LCAweDAxNkYsIDB4MDE2OSwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwKKyAgICAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgMHgwMDM4LCAweDAwMzksIDB4MDMzNiwgMHgwMDJELAorICAgIDB4MDAzRCwgMHgwMDJDLCAweDAwMjgsIDB4MDAyOSwgMHgwMDJFLCAweDAwMkYsIDB4MDAzQSwgMHgwMDNCLCAweDAwMzAsCisgICAgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwKKyAgICAweDAzMzYsIDB4MDAyRCwgMHgwMDNELCAweDAwMkMsIDB4MDAyOCwgMHgwMDI5LCAweDAwMkUsIDB4MDAyRiwgMHgwMDNBLAorICAgIDB4MDAzQiwgMHgwMEI3LCAweDAwMkQsIDB4MDAzRCwgMHgyMTAzLCAweDI2NDAsIDB4MjY0MiwgMHgzMDEzLCAweDMwMTIsCisgICAgMHgzMDBDLCAweDMwMEQsIDB4MzAwRSwgMHgzMDBGLCAweDMwMUEsIDB4MzAxQiwgMHgzMDE4LCAweDMwMTksIDB4RkYwOCwKKyAgICAweEZGMDksIDB4MzAxRCwgMHgzMDFFLCAweDIwMTgsIDB4MjAxOSwgMHgyMDFDLCAweDIwMUQsIDB4MDAyNywgMHgwMDIyLAorICAgIDB4OTAzOCwgMHg4QjAxLCAweDdERTMsIDB4OUVDMywgMHg2RUFCLCAweDc5OEQsIDB4NjA5NCwgMHg2RDc3LCAweDYxNjgsCisgICAgMHg2OTgyLCAweDZFMzQsIDB4ODkxMCwgMHg2RjIyLCAweDU2NjgsIDB4NjVFMiwgMHg3OTQ4LCAweDg2NUIsIDB4OTdGRiwKKyAgICAweDUyRTQsIDB4OEIzOSwgMHg2M0VELCAweDY0Q0EsIDB4Nzg0RiwgMHg3QTQwLCAweDZCQkEsIDB4Nzk0OSwgMHg4OTk2LAorICAgIDB4NzE2RSwgMHg3OTNFLCAweDgwMDUsIDB4ODFFRCwgMHg3OTVELCAweDY2OTEsIDB4N0Y3MiwgMHg2RDg5LCAweDcyQzAsCisgICAgMHg2MTNDLCAweDc3MUUsIDB4N0JDMCwgMHg3OTU2LCAweDUwRTcsIDB4NUM2NCwgMHg1REUyLCAweDYxOEUsIDB4OEQwOCwKKyAgICAweDUzN0QsIDB4NTYwNiwgMHg4NDU3LCAweDVGQjUsIDB4NjFGMiwgMHg5M0FELCAweDc5OEUsIDB4OUIyRCwgMHg3QTgxLAorICAgIDB4OTZFMywgMHg2ODg1LCAweDdFNDEsIDB4NjY2OSwgMHg1MzUxLCAweDc4OTEsIDB4OENEMywgMHg2NTRGLCAweDRGQUUsCisgICAgMHg1MDAyLCAweDU4NDAsIDB4NTJDOSwgMHg2QjY1LCAweDU4QTgsIDB4NkJDRiwgMHg1MTRELCAweDYyM0UsIDB4Nzk1MCwKKyAgICAweDZCMDQsIDB4OTY4NiwgMHg4NjVDLCAweDZEREEsIDB4OTg1RSwgMHg2NkM2LCAweDZCNzcsIDB4N0RGNCwgMHg5MzRBLAorICAgIDB4NUVDQSwgMHg5MzA0LCAweDY5ODIsIDB4NTFCNCwgMHg2MzRDLCAweDg2REIsIDB4OTA4OSwgMHg5MDIyLCAweDUwNDksCisgICAgMHg3REVGLCAweDkwNTUsIDB4NTNBOSwgMHg5OTBDLCAweDg4NUIsIDB4NUVGNiwgMHg2Q0JGLCAweDkyNUIsIDB4N0ZDMSwKKyAgICAweDgyQkQsIDB4OTZDNSwgMHg1QkIzLCAweDYxNjgsIDB4Njk4MiwgMHg2QkJCLCAweDY1NjIsIDB4OENBQiwgMHg1RENDLAorICAgIDB4OTgxMSwgMHg1RTMwLCAweDhFQ0MsIDB4N0FBRSwgMHg1NzQ3LCAweDUwOTEsIDB4N0E3NCwgMHg1MDY1LCAweDVFRkEsCisgICAgMHg5MjM3LCAweDZBOEUsIDB4NEVBNCwgMHg1MTZDLCAweDY2RjQsIDB4NjgyMSwgMHg3ODZDLCAweDdENUUsIDB4ODAwMywKKyAgICAweDhDRkMsIDB4OTY0RCwgMHg2MkY3LCAweDdGNkEsIDB4NEY3RiwgMHg1M0YyLCAweDU5QzksIDB4OEIxRCwgMHg5MEFBLAorICAgIDB4NTNDRSwgMHg4RjJGLCAweDY3RDQsIDB4NzdBQywgMHg4MjFDLCAweDY5NkYsIDB4Njc3RSwgMHg4QTFGLCAweDRFMDgsCisgICAgMHg1N0Y0LCAweDY5MEQsIDB4ODA3NywgMHg4OUFBLCAweDkwNDIsIDB4NjM2RSwgMHg2NDQyLCAweDgyMzksIDB4N0RDRiwKKyAgICAweDgwNjEsIDB4NTBDRiwgMHg4QTk1LCAweDYwNjUsIDB4NTE0NiwgMHg3NzNBLCAweDgwNzQsIDB4OERGMywgMHg1RUFELAorICAgIDB4NUVGNywgMHg4MjQ3LCAweDY4NDMsIDB4OTAwMywgMHg2RDNFLCAweDYzOTIsIDB4OEYyOSwgMHg3M0VELCAweDk4MTIsCisgICAgMHg2MEIyLCAweDYyNDksIDB4NjU5MCwgMHg3RENCLCAweDhBQjksIDB4OENBNywgMHg3MjM2LCAweDg0N0EsIDB4NTIwNiwKKyAgICAweDU2NzQsIDB4NjFBNCwgMHg3Qzg5LCAweDdEMUIsIDB4OTZGMCwgMHg4NTNELCAweDRGQkYsIDB4NjM2NywgMHg3NkM2LAorICAgIDB4Njg1RCwgMHg4MTA4LCAweDgwMzYsIDB4N0ZGQywgMHg1NDBGLCAweDk2QTMsIDB4OUU5RiwgMHg5RTk3LCAweDgwNkYsCisgICAgMHg4MDdFLCAweDZFN0UsIDB4NTA4NSwgMHg1MTkzLCAweDUxREIsIDB4NTMxNSwgMHg1MzQwLCAweDk2RDksIDB4NTVBOSwKKyAgICAweDU2QzEsIDB4NTcwRCwgMHg1OEFCLCAweDU5REEsIDB4NUEzNiwgMHg1QUJFLCAweDVENEUsIDB4NUQ4NywgMHg1REM5LAorICAgIDB4NUREMywgMHg1RjJELCAweDVGOTgsIDB4NjBEOCwgMHg2MTNELCAweDYxRkUsIDB4NjI2OCwgMHg2MkNGLCAweDY1MUQsCisgICAgMHg2NDBGLCAweDY0RjIsIDB4NjU1RCwgMHg2NjVGLCAweDY3QTksIDB4NjdFNywgMHg2OTZCLCAweDY5MzAsIDB4NjlBNywKKyAgICAweDZBNDQsIDB4NkE5MCwgMHg2QzA4LCAweDZDMTMsIDB4NkUyMywgMHg2RjExLCAweDZFRkUsIDB4NkYzRSwgMHg3MUZGLAorICAgIDB4NzNFNSwgMHg3NDMyLCAweDc0NUYsIDB4NzRFMCwgMHg3NTBDLCAweDc2NzIsIDB4NzkyQSwgMHg3OEQ0LCAweDc5QkEsCisgICAgMHg3QTE5LCAweDdBOTUsIDB4N0NGMiwgMHg3RDczLCAweDdEREQsIDB4N0UzNSwgMHg3RkFFLCAweDdGRTEsIDB4ODA1QSwKKyAgICAweDgwNUYsIDB4ODA3MywgMHg4MDcwLCAweDgwNzYsIDB4ODE1MywgMHg4MThBLCAweDgxQjUsIDB4ODFDRCwgMHg4M0YyLAorICAgIDB4ODU1NSwgMHg4NUQ1LCAweDg3MUEsIDB4ODgzNiwgMHg4ODlFLCAweDg4RDgsIDB4ODhGNCwgMHg4OTJCLCAweDg5M0IsCisgICAgMHg4OTZBLCAweDg5NkYsIDB4OEExRCwgMHg4RDA1LCAweDhEMEYsIDB4OUY0RSwgMHg4RTkxLCAweDhFQTEsIDB4OTA1MiwKKyAgICAweDkwMEUsIDB4OTEzMCwgMHg5MTU2LCAweDkxNTgsIDB4OTE2NSwgMHg5MTczLCAweDkxNzIsIDB4OTFBMiwgMHg5MUFGLAorICAgIDB4OTFBQSwgMHg5MUI0LCAweDkxQkEsIDB4OTQ3NywgMHg5Njk4LCAweDk3M0QsIDB4OTc2MCwgMHg5NzcxLCAweDk4MEMsCisgICAgMHg5ODczLCAweDk4QzMsIDB4OUE0NSwgMHg5QjRELCAweDlCNTgsIDB4OUJDNiwgMHg5QkUxLCAweDlCRjEsIDB4OUQ0OCwKKyAgICAweDlEQ0YsIDB4OUYwOCwgMHg2MjcxLCAweDY2OTcsIDB4NjEwRiwgMHg4ODYzLCAweDkwNTUsIDB4OTA3QSwgMHg3OEVGLAorICAgIDB4NTRFMSwgMHgyRUQ3LCAweDJFQkQsIDB4NTNBOSwgMHg3NERDLCAweDkwNEIsIDB4OTkwQywgMHg4ODVFLCAweDkyQjMsCisgICAgMHg5NUIxLCAweDVFRjYsIDB4NjNGNCwgMHg2Q0JGLCAweDcxNTksIDB4OTA2MCwgMHg5MjVCLCAweDY1QkMsIDB4NUY4MCwKKyAgICAweDdGQzEsIDB4NTM3OCwgMHg5N0YzLCAweDUzMTYsIDB4ODJCMSwgMHg4M0QzLCAweDhDQTgsIDB4OTA0RSwgMHg4MkJELAorICAgIDB4OTZDNSwgMHg5OTEzLCAweDVFRkIsIDB4NzA3MCwgMHg1QkIzLCAweDYxNjgsIDB4NjE2OCwgMHg2MTY4LCAweDY5RUEsCisgICAgMHg2OTgyLCAweDY3NkUsIDB4ODlEMiwgMHg5Njk0LCAweDUyNzIsIDB4OEY0NCwgMHg5MzhDLCAweDgyQzUsIDB4NUJEMiwKKyAgICAweDc0QjAsIDB4N0RFOSwgMHg3RjM2LCAweDkwODQsIDB4OTU5MiwgMHg5N0QzLCAweDgyMTgsIDB4NTM3MSwgMHg1NTlDLAorICAgIDB4MzQwMiwgMHgzNDAyLCAweDVFN0UsIDB4NjVFMywgMHg2NzFGLCAweDZBNUYsIDB4OEQ3NywgMHg5OEUyLCAweDU0MDksCisgICAgMHg1NUFCLCAweDg2NTAsIDB4OTAwNiwgMHg1M0NBLCAweDU0MzgsIDB4NjAyNSwgMHg3RDFBLCAweDVERTgsIDB4NjJEMiwKKyAgICAweDhEREQsIDB4OUI1QSwgMHg5QjVBLCAweDUzN0YsIDB4NUYzQSwgMHg2MDUwLCAweDY5QzEsIDB4NkE0QiwgMHg2QTRCLAorICAgIDB4OTExNSwgMHg5N0ZGLCAweDk5NTcsIDB4NjY4MSwgMHgyRUE5LCAweDhGRDEsIDB4NTAzNiwgMHg3N0U5LCAweDUxNzcsCisgICAgMHg4NjVFLCAweDdBN0EsIDB4OTA0NywgMHg2QURCLCAweDU1NTMsIDB4NTk1MSwgMHg2MDc1LCAweDYxNjcsIDB4OEZDRSwKKyAgICAweDUwOTEsIDB4NkY1NCwgMHg3QTc0LCAweDJFQkMsIDB4MkVCQywgMHg1MTdDLCAweDUyMzgsIDB4NjFCMiwgMHg2NzQzLAorICAgIDB4ODBBOSwgMHg4QjE5LCAweDkwNjMsIDB4NTM5RiwgMHg4QTAxLCAweDYyMzYsIDB4OTZDNywgMHg5ODY3LCAweDU0MzMsCisgICAgMHg1QTFCLCAweDhBQTQsIDB4NURFNSwgMHg2MTRDLCAweDYyODUsIDB4NjNBNywgMHg2OUNCLCAweDZENjksIDB4NkUyRiwKKyAgICAweDgwMTUsIDB4ODE1NCwgMHg4MzUyLCAweDhCMUIsIDB4OENGQywgMHg1NDNGLCAweDkxNzcsIDB4ODE3MCwgMHg3NTExLAorICAgIDB4OEZCQywgMHg0RUNBLCAweDkzOTYsIDB4NUVBNywgMHg1RjY5LCAweDYzQTEsIDB4NkI3MiwgMHg4M0RDLCAweDUxQjQsCisgICAgMHg1NEIyLCAweDUyNEEsIDB4NzUyMiwgMHg5OTEwLCAweDU5RkYsIDB4NTlGRiwgMHg1REZGLCAweDhBRUUsIDB4OEFFRSwKKyAgICAweDhDQzcsIDB4OENDNywgMHg2QjIxLCAweDZCMjEsIDB4NkVDQiwgMHg3M0JBLCAweDUzRjEsIDB4NjM2OCwgMHg2NTlDLAorICAgIDB4OTBBQSwgMHg1MkZBLCAweDcyMzUsIDB4NzIzNSwgMHg5MTRDLCAweDVGMzEsIDB4NEUzQiwgMHg1M0Q3LCAweDYzODgsCisgICAgMHg1NDY4LCAweDdENDIsIDB4N0ZEMiwgMHg4ODQ2LCAweDkwMzEsIDB4NEY0RiwgMHg4ODUzLCAweDhGRjAsIDB4NURFMSwKKyAgICAweDkwNzUsIDB4OTA3NSwgMHg2MjQwLCAweDY2RjgsIDB4NTk3MywgMHg1MkRELCAweDU1NDYsIDB4NUJCNSwgMHg1QzA2LAorICAgIDB4MkU4QywgMHgyRThELCAweDVDMTksIDB4NkQ4OCwgMHg3ODVELCAweDgwOTYsIDB4NEUwOCwgMHg1QjgyLCAweDU3Q0UsCisgICAgMHg2MEM1LCAweDU3RjQsIDB4OThGRSwgMHg2OTBELCAweDZCOTYsIDB4OThERiwgMHg5OEUwLCAweDJFREUsIDB4Mzc4RCwKKyAgICAweDRGQjUsIDB4MkU5NywgMHg2RDc4LCAweDc3MUYsIDB4OTAzMiwgMHg0RUJCLCAweDRFQkEsIDB4NTIwMywgMHg1QzBCLAorICAgIDB4OEEwQSwgMHg4QTBBLCAweDhGQzUsIDB4ODg3MCwgMHg5MDQyLCAweDM1MUYsIDB4NTJFMiwgMHg2MjEwLCAweDc2REIsCisgICAgMHg4MDU2LCAweDg5ODAsIDB4OEFBMCwgMHg4QUNCLCAweDk3NUMsIDB4OTc1QywgMHg3QTA1LCAweDgxMDYsIDB4OTZCQiwKKyAgICAweDdDNEQsIDB4N0JDMCwgMHg4QUFBLCAweDk2RUEsIDB4N0Q3NiwgMHg2MjQ3LCAweDZGOTgsIDB4N0ZBMSwgMHg4MjM5LAorICAgIDB4OTA3OCwgMHg5MDc3LCAweDUyNEQsIDB4NTE2OCwgMHg2MzgzLCAweDYzRjcsIDB4NzYyNiwgMHg4RDcwLCAweDkwMDEsCisgICAgMHg5MDZELCAweDkwMjAsIDB4MkVDQSwgMHg5MDFGLCAweDhDQ0EsIDB4NUMwQSwgMHg1QzBBLCAweDU5QTUsIDB4NkNGMCwKKyAgICAweDkwMDAsIDB4OTAyRSwgMHg5NjhBLCAweDlCREIsIDB4NTkyNywgMHgzNDI3LCAweDcwMjcsIDB4OTA1NCwgMHg4MTJCLAorICAgIDB4NEUzOSwgMHg2QjRFLCAweDcwQUQsIDB4OEE5NSwgMHg2Njk2LCAweDUwMjQsIDB4N0Y2RSwgMHg3QkM5LCAweDJFQUUsCisgICAgMHg3QjUxLCAweDkwMTAsIDB4NjdGMSwgMHg2Q0U4LCAweDk5RDAsIDB4NUY2QiwgMHg1RkI1LCAweDYxRjIsIDB4NjcxRCwKKyAgICAweDZGNkUsIDB4OEFCRiwgMHg3NkY0LCAweDY3MTUsIDB4NjcxNSwgMHg1ODlDLCAweDhGRkQsIDB4OTAxQSwgMHg1NzZBLAorICAgIDB4OTFFMywgMHg1NDQ4LCAweDVFMUQsIDB4N0EwQiwgMHg3Njg0LCAweDkwNjksIDB4OEZFRCwgMHg2REZCLCAweDUxNEUsCisgICAgMHg5MDE0LCAweDc4M0EsIDB4NTcyMSwgMHg1NzFGLCAweDUxQUMsIDB4NTUxMCwgMHg3Q0Q2LCAweDg1RTQsIDB4OEIwNCwKKyAgICAweDkwMDMsIDB4OTAwRiwgMHg5QTMwLCAweDVDMEUsIDB4OTA1MywgMHg1NDUxLCAweDNCODgsIDB4NTE2NywgMHg4MDg5LAorICAgIDB4NEU3MywgMHg1RkNELCAweDhBOEQsIDB4NUJFNywgMHg3RDBELCAweDg5ODcsIDB4NkQzRSwgMHg4MEJBLCAweDUzNUEsCisgICAgMHg4NTg0LCAweDhGRUIsIDB4N0UxQiwgMHg4MDg3LCAweDRFMzcsIDB4NkY1MSwgMHg5MUIxLCAweDRGMzQsIDB4NTIyNCwKKyAgICAweDUzNEEsIDB4NUUwNiwgMHg3NTU0LCAweDY2NjksIDB4ODU0MywgMHg5MDdGLCAweDVGQUUsIDB4OUYzQiwgMHg1MzM5LAorICAgIDB4MkVBQSwgMHg1RjY1LCAweDU5RUMsIDB4NTlFQiwgMHg4QTU1LCAweDVFOTksIDB4NzVDNSwgMHg1QTY2LCAweDY1NzcsCisgICAgMHg2RDZFLCAweDhDQTAsIDB4OENBMCwgMHg2NzBELCAweDg5ODYsIDB4NEUxOSwgMHg1RTYzLCAweDVFNzMsIDB4NUYwQSwKKyAgICAweDg1MTEsIDB4NTA0RiwgMHg3REU4LCAweDhGRDQsIDB4OTA0RCwgMHg3QzNGLCAweDUzMDUsIDB4NUQyOSwgMHg2MkIxLAorICAgIDB4NjcwQiwgMHg3ODMyLCAweDdFMkIsIDB4ODBERSwgMHg4NDBDLCAweDkwQTYsIDB4OTBBNiwgMHg5OEZELCAweDlENkMsCisgICAgMHg0RUExLCAweDVFM0QsIDB4NUZEOCwgMHg1RkQ5LCAweDYyM0YsIDB4NjcxQiwgMHg2NzFCLCAweDUxOTIsIDB4NjQ2OSwKKyAgICAweDdGRkIsIDB4NTFFMSwgMHg3OEU4LCAweDlCNTQsIDB4MkZDNywgMHg2OUQ5LCAweDY4NUQsIDB4NEZFMywgMHg1M0M4LAorICAgIDB4N0U2RCwgMHg5RUJGLCAweDgxMDgsIDB4NjYwRSwgMHg3NkRGLCAweDhGRjcsIDB4NTk4NCwgMHg1MkQwLCAweDc2RjIsCisgICAgMHg4MDE3LCAweDYyM0UsIDB4N0QwQiwgMHg5NTgwLCAweDdEMDQsIDB4OEU4RCwgMHg2ODdBLCAweDY4N0EsIDB4NjgwMSwKKyAgICAweDYxMDksIDB4OEFFRCwgMHg4RjM4LCAweDUyQzcsIDB4NjcwOSwgMHg3MzM2LCAweDczMzYsIDB4NzMzNywgMHg4OEQ1LAorICAgIDB4OTA0QSwgMHg2NkRDLCAweDJFQjcsIDB4ODk4MSwgMHg5OTBBLCAweDdGQ0MsIDB4N0ZGQywgMHg4RUI2LCAweDg2MkQsCisgICAgMHg3Mzg3LCAweDlGOEQsIDB4OUY4RCwgMHg2NUM1LCAweDY4ODEsIDB4NzFEMCwgMHg5NkEzLCAweDlDNTcsIDB4OUU5RiwKKyAgICAweDdDN0IsIDB4NUVDOSwgMHg2MTkwLCAweDkwMjMsIDB4NjcxNywgMHg4MDAyLCAweDgxMDcsIDB4NTBDQSwgMHg1MTFBLAorICAgIDB4NTE1NCwgMHg1MTk1LCAweDJFODcsIDB4NTI4RCwgMHg1MkQ3LCAweDUyRjksIDB4NTM0OSwgMHgzNTNFLCAweDUzREYsCisgICAgMHg2NkZDLCAweDU1MzMsIDB4NTVFNCwgMHg1NDU1LCAweDU2QzAsIDB4NTkzOSwgMHg1QTFDLCAweDVBQzIsIDB4NUI3MywKKyAgICAweDVCQzMsIDB4NUMxNCwgMHgzN0UyLCAweDVDRTYsIDB4NUU1NCwgMHg0RTQ4LCAweDVFRTMsIDB4NjA5NywgMHg2MkQ0LAorICAgIDB4NjJDQywgMHg2NDFDLCAweDYzQzYsIDB4NjQyOCwgMHg4MjA5LCAweDYzMUIsIDB4NjY1RiwgMHg2NjVGLCAweDY2NjMsCisgICAgMHg2NkY1LCAweDY3NUUsIDB4Njg5RCwgMHg2ODhELCAweDY5RjYsIDB4Njk2MSwgMHg1QkU4LCAweDVCRTgsIDB4NjlCQiwKKyAgICAweDZCQ0MsIDB4NkYxMSwgMHg2RTE3LCAweDZGOTgsIDB4NkNBQSwgMHg2Q0FBLCAweDcwMUIsIDB4NzE2MiwgMHg3MjNCLAorICAgIDB4NEUyQywgMHg3MzFDLCAweDc0Q0EsIDB4NzRFRiwgMHg3NTc1LCAweDc1RUMsIDB4NzY0RSwgMHgzRkIxLCAweDc3NkEsCisgICAgMHg3N0E5LCAweDc5NDAsIDB4Nzk1MywgMHg3OTUzLCAweDlGNEIsIDB4NzlBRSwgMHg5MDgzLCAweDdCNTMsIDB4N0MxMSwKKyAgICAweDdDMTQsIDB4NDI2NCwgMHg3QzUwLCAweDdDNTgsIDB4N0Q0NiwgMHg3RDYzLCAweDdFMjIsIDB4N0UyMiwgMHg3RTQ4LAorICAgIDB4N0UzNSwgMHg3RTQzLCAweDdFOEMsIDB4N0Y1MCwgMHg3RjUxLCAweDdGNTEsIDB4N0Y1MSwgMHg3RkM1LCAweDdGQzYsCisgICAgMHg3RkU5LCAweDgxNDEsIDB4NDQ1MywgMHg4MjU4LCAweDgyNzksIDB4MkVCRiwgMHgyRUMwLCAweDgyRTMsIDB4NTE3OSwKKyAgICAweDgzQTIsIDB4ODQyMCwgMHg4M0JELCAweDg0RjQsIDB4ODU2RCwgMHg4NTg3LCAweDg1RjQsIDB4NEU1NSwgMHg4NzM3LAorICAgIDB4ODczQiwgMHg4ODA1LCAweDg3QkQsIDB4ODY3RCwgMHg4ODM2LCAweDg5NDQsIDB4ODhDNiwgMHg4OUJELCAweDhBREIsCisgICAgMHg4QjNFLCAweDhCNUEsIDB4OEQ3MywgMHg4RDk5LCAweDhEQ0IsIDB4OEUzNCwgMHg4RTRBLCAweDhGRUYsIDB4OTA4NywKKyAgICAweDhGRkEsIDB4OTAxRSwgMHg5MDM1LCAweDkwNTAsIDB4OEZDOCwgMHg5MDgxLCAweDkwOEEsIDB4OTA4QSwgMHg5MDhBLAorICAgIDB4OTA4QSwgMHg5MDhBLCAweDkwOEEsIDB4OTA4OSwgMHg5MDg5LCAweDkwODksIDB4OTA4OSwgMHg5MDg5LCAweDkwODksCisgICAgMHg5MDg5LCAweDkwODksIDB4OTA4OSwgMHg5MDg5LCAweDkwODksIDB4OTA4OSwgMHg5MkNGLCAweDkzREQsIDB4OTVCQywKKyAgICAweDk2MjEsIDB4OTZCMiwgMHg5NzVDLCAweDk4MzksIDB4OThFQiwgMHg5OTAzLCAweDk5MDksIDB4OTk0NSwgMHg5OTQ1LAorICAgIDB4OTk0QiwgMHg5QTA4LCAweDlBNUYsIDB4OUE2NSwgMHg5QUVGLCAweDlCMTgsIDB4OUJERiwgMHg5RDA5LCAweDlEMDgsCisgICAgMHg5RUE1LCAweDlFQ0MsIDB4OUYwOCwgMHg5RjRBLCAweDlGNjMsIDB4OUY2NywgMHg5RjZDLCAweDcxOTksIDB4NzE5OSwKKyAgICAweDg5MUMsIDB4NjhDOCwgMHg2NkZCLCAweDVGNDUsIDB4NTMwMCwgMHg1Mzg5LCAweDU5NTMsIDB4RkExMSwgMHg2ODUyLAorICAgIDB4NkE3MywgMHg2RDg3LCAweEZBMTUsIDB4OEExMiwgMHg0RTA0LCAweDRFMDUsIDB4NEUxRiwgMHg0RTJCLCAweDRFMkYsCisgICAgMHg0RTMwLCAweDRFNDAsIDB4NEU0MSwgMHg0RTQ0LCAweDRFNUEsIDB4NEU3RiwgMHg0RThELCAweDRFOTYsIDB4NEVCOSwKKyAgICAweDRFRDAsIDB4NEVFMCwgMHg0RUZELCAweDRFRkYsIDB4NEYwQiwgMHg0RjE1LCAweDRGNjAsIDB4NEYzQiwgMHg0RjQ5LAorICAgIDB4NEY1NCwgMHg0RjdBLCAweDRGN0QsIDB4NEY3RSwgMHg0Rjk3LCAweDRGQkUsIDB4NEZDRiwgMHg0RkZELCAweDUwMDAsCisgICAgMHg1MDAxLCAweDUwMTAsIDB4NTAxQiwgMHg1MDI3LCAweDUwMkUsIDB4NTA1NywgMHg1MDY2LCAweDUwNkEsIDB4NTAzQiwKKyAgICAweDUwOEYsIDB4NTA5NiwgMHg1MDlDLCAweDUwQ0MsIDB4NTBFNiwgMHg1MEU5LCAweDUwRUYsIDB4NTEwOCwgMHg1MTBCLAorICAgIDB4NTExMCwgMHg1MTFCLCAweDUxMUUsIDB4NTE1RiwgMHg1MUExLCAweDUxQkMsIDB4NTFERSwgMHg1MUVFLCAweDUxRjQsCisgICAgMHg1MjAxLCAweDUyMDIsIDB4NTIxMywgMHg1MjQ5LCAweDUyNjEsIDB4NTI2NiwgMHg1MjkzLCAweDUyQzgsIDB4NTJGMCwKKyAgICAweDUzMEEsIDB4NTMwQiwgMHg1MzNFLCAweDUzNEMsIDB4NTM0QiwgMHg1MzYxLCAweDUzNkMsIDB4NTNBQiwgMHg1M0RBLAorICAgIDB4NTNFNiwgMHg1M0Y1LCAweDU0MjcsIDB4NTQ0RCwgMHg1NDY2LCAweDU0NkIsIDB4NTQ3NCwgMHg1NDhELCAweDU0OTYsCisgICAgMHg1NEExLCAweDU0QUQsIDB4NTRCOSwgMHg1NEJGLCAweDU0QzYsIDB4NTRDRCwgMHg1NTBFLCAweDU1MkIsIDB4NTUzNSwKKyAgICAweDU1NEEsIDB4NTU2MCwgMHg1NTYxLCAweDU1ODgsIDB4NTU4RSwgMHg1NjA4LCAweDU2MEUsIDB4NTYwRiwgMHg1NjM3LAorICAgIDB4NTYzRiwgMHg1NjQ5LCAweDU2NEIsIDB4NTY0RiwgMHg1NjY2LCAweDU2NjksIDB4NTY2RiwgMHg1NjcxLCAweDU2NzIsCisgICAgMHg1Njk1LCAweDU2OUEsIDB4NTZBQywgMHg1NkFELCAweDU2QjEsIDB4NTZDOSwgMHg1NkRELCAweDU2RTQsIDB4NTcwQSwKKyAgICAweDU3MTUsIDB4NTcyMywgMHg1NzJGLCAweDU3MzMsIDB4NTczNCwgMHg1NzRDLCAweDU3NzAsIDB4NTc4QywgMHg1NzlDLAorICAgIDB4NTdCOCwgMHg1N0U2LCAweDU3RUQsIDB4NTdGNSwgMHg1N0Y2LCAweDU3RkYsIDB4NTgwOSwgMHg1ODIwLCAweDU4MzIsCisgICAgMHg1ODdDLCAweDU4ODAsIDB4NThBOSwgMHg1OENFLCAweDU4RDAsIDB4NThENCwgMHg1OERBLCAweDU4RTksIDB4NTkwQywKKyAgICAweDU5MjQsIDB4NTkyRiwgMHg1OTYxLCAweDU5NkQsIDB4NTlDQSwgMHg1OUQyLCAweDU5REQsIDB4NTlFMywgMHg1OUU0LAorICAgIDB4NUEwNCwgMHg1QTBDLCAweDVBMjMsIDB4NUE0NywgMHg1QTU1LCAweDVBNjMsIDB4NUE2RCwgMHg1QTdFLCAweDVBOUUsCisgICAgMHg1QUE3LCAweDVBQUMsIDB4NUFCMywgMHg1QUUwLCAweDVCMDAsIDB4NUIxOSwgMHg1QjI1LCAweDVCMkQsIDB4NUI0MSwKKyAgICAweDVCN0MsIDB4NUI3RSwgMHg1QjdGLCAweDVCOEEsIDB4NUMyMywgMHg1QzJCLCAweDVDMzAsIDB4NUM2MywgMHg1QzY5LAorICAgIDB4NUM3QywgMHg1Q0NCLCAweDVDRDIsIDB4NUNGNCwgMHg1RDI0LCAweDVEMjYsIDB4NUQ0MywgMHg1RDQ2LCAweDVENEEsCisgICAgMHg1RDkyLCAweDVEOTQsIDB4NUQ5OSwgMHg1REEwLCAweDVERDgsIDB4NURFMCwgMHg1REY4LCAweDVFMDAsIDB4NUUxMiwKKyAgICAweDVFMTQsIDB4NUUxNSwgMHg1RTE4LCAweDVFMkUsIDB4NUU1OCwgMHg1RTZCLCAweDVFNkMsIDB4NUVBOCwgMHg1RUFBLAorICAgIDB4NUVCRSwgMHg1RUJGLCAweDVFQ0IsIDB4NUVEMiwgMHg1RjA3LCAweDVGMEUsIDB4NUYxQywgMHg1RjFELCAweDVGMjIsCisgICAgMHg1RjI4LCAweDVGMzYsIDB4NUYzQiwgMHg1RjQwLCAweDVGNTAsIDB4NUY1OCwgMHg1RjY0LCAweDVGODksIDB4NUY5QywKKyAgICAweDVGQTcsIDB4NUZBNCwgMHg1RkFGLCAweDVGQjgsIDB4NUZDNCwgMHg1RkM5LCAweDVGRTEsIDB4NUZFOSwgMHg1RkVELAorICAgIDB4NUZGQywgMHg2MDE3LCAweDYwMUEsIDB4NjAzMywgMHg2MDYxLCAweDYwN0YsIDB4NjA5RSwgMHg2MEE0LCAweDYwQjAsCisgICAgMHg2MENCLCAweDYwREIsIDB4NjBGOCwgMHg2MTEyLCAweDYxMTMsIDB4NjExNCwgMHg2MTFDLCAweDYxN0MsIDB4NjE4RCwKKyAgICAweDYxOUYsIDB4NjFBOCwgMHg2MUMyLCAweDYxREYsIDB4NjIxNSwgMHg2MjI5LCAweDYyNDMsIDB4NjI0NiwgMHg2MjRDLAorICAgIDB4NjI1MSwgMHg2MjU2LCAweDYyQzQsIDB4NjJGQywgMHg2MzBBLCAweDYzMEQsIDB4NjMxOCwgMHg2MzM5LCAweDYzNDIsCisgICAgMHg2MzQzLCAweDYzNjUsIDB4NjM3NCwgMHg2MzdELCAweDYzODQsIDB4NjM4NywgMHg2MzkwLCAweDYzOUUsIDB4NjNEMSwKKyAgICAweDYzREMsIDB4NjQwOSwgMHg2NDEwLCAweDY0MjIsIDB4NjQ1NCwgMHg2NDVCLCAweDY0NkQsIDB4NjQ3QiwgMHg2NEJFLAorICAgIDB4NjRCRiwgMHg2NEU1LCAweDY0RjcsIDB4NjRGQiwgMHg2NTA0LCAweDY1MTYsIDB4NjUxOSwgMHg2NTQ3LCAweDY1NjcsCisgICAgMHg2NTgxLCAweDY1ODUsIDB4NjVDMiwgMHg2NUYwLCAweDY1RjIsIDB4NjYyQywgMHg2NjRDLCAweDY2NUIsIDB4NjY1QywKKyAgICAweDY2NjEsIDB4NjY2QiwgMHg2Njc3LCAweDY2QTQsIDB4NjZDOCwgMHg2NkVDLCAweDY3MDUsIDB4NjcxMywgMHg2NzMzLAorICAgIDB4Njc0OCwgMHg2NzRDLCAweDY3NzYsIDB4Njc3QiwgMHg2N0IwLCAweDY3QjIsIDB4NjdGOSwgMHg2N0Q3LCAweDY3RDksCisgICAgMHg2N0YwLCAweDY4MkMsIDB4NjgzMCwgMHg2ODMxLCAweDY4NUIsIDB4Njg3MiwgMHg2ODc1LCAweDY4N0EsIDB4Njg4NCwKKyAgICAweDY4QTUsIDB4NjhCMiwgMHg2OEQwLCAweDY4RDYsIDB4NjhFOCwgMHg2OEVELCAweDY4RjAsIDB4NjhGMSwgMHg2OEZDLAorICAgIDB4NjkxMSwgMHg2OTEzLCAweDY5MzUsIDB4NjkzQiwgMHg2OTU3LCAweDY5NjMsIDB4Njk3MiwgMHg2OTdGLCAweDY5ODAsCisgICAgMHg2OUE2LCAweDY5QUQsIDB4NjlCNywgMHg2OUQ2LCAweDY5RDcsIDB4NkEwMSwgMHg2QTBGLCAweDZBMTUsIDB4NkEyOCwKKyAgICAweDZBMzQsIDB4NkEzRSwgMHg2QTQ1LCAweDZBNTAsIDB4NkE1MSwgMHg2QTU2LCAweDZBNUIsIDB4NkE4MywgMHg2QTg5LAorICAgIDB4NkE5MSwgMHg2QTlELCAweDZBOUUsIDB4NkE5RiwgMHg2QURDLCAweDZBRTcsIDB4NkFFQywgMHg2QjFFLCAweDZCMjQsCisgICAgMHg2QjM1LCAweDZCNDYsIDB4NkI1NiwgMHg2QjYwLCAweDZCODIsIDB4NkJCRSwgMHg2QkUxLCAweDZCRjEsIDB4NkMxMCwKKyAgICAweDZDMzMsIDB4NkMzNSwgMHg2QzNBLCAweDZDNTksIDB4NkM3NiwgMHg2QzdCLCAweDZDODUsIDB4NkM5NSwgMHg2QzlDLAorICAgIDB4NkNEMCwgMHg2Q0Q0LCAweDZDRDYsIDB4NkNFMCwgMHg2Q0VCLCAweDZDRUMsIDB4NkNFRSwgMHg2RDBBLCAweDZEMEUsCisgICAgMHg2RDExLCAweDZEMkUsIDB4NkQ1NywgMHg2RDVFLCAweDZENjUsIDB4NkQ4MiwgMHg2REJGLCAweDZEQzQsIDB4NkRDQSwKKyAgICAweDZERDYsIDB4NkRFOSwgMHg2RTIyLCAweDZFNTEsIDB4NkVDNywgMHg2RUNBLCAweDZFQ0UsIDB4NkVGRCwgMHg2RjFBLAorICAgIDB4NkYyQSwgMHg2RjJGLCAweDZGMzMsIDB4NkY1QSwgMHg2RjVFLCAweDZGNjIsIDB4NkY3RCwgMHg2RjhCLCAweDZGOEQsCisgICAgMHg2RjkyLCAweDZGOTQsIDB4NkY5QSwgMHg2RkE3LCAweDZGQTgsIDB4NkZCNiwgMHg2RkRBLCAweDZGREUsIDB4NkZGOSwKKyAgICAweDcwMzksIDB4NzAzQywgMHg3MDRBLCAweDcwNTQsIDB4NzA1RCwgMHg3MDVFLCAweDcwNjQsIDB4NzA2QywgMHg3MDdFLAorICAgIDB4NzA4MSwgMHg3MDk1LCAweDcwQjcsIDB4NzBEMywgMHg3MEQ0LCAweDcwRDgsIDB4NzBEQywgMHg3MTA3LCAweDcxMjAsCisgICAgMHg3MTMxLCAweDcxNEEsIDB4NzE1MiwgMHg3MTYwLCAweDcxNzksIDB4NzE5MiwgMHg3MUIzLCAweDcxQ0IsIDB4NzFEMywKKyAgICAweDcxRDYsIDB4NzIwMCwgMHg3MjFELCAweDcyMkIsIDB4NzIzOCwgMHg3MjQxLCAweDcyNTMsIDB4NzI1NSwgMHg3MjU2LAorICAgIDB4NzI1QywgMHg3MjhELCAweDcyQUQsIDB4NzJCNCwgMHg3MkM3LCAweDcyRkIsIDB4NzMwNCwgMHg3MzA1LCAweDczMjgsCisgICAgMHg3MzMxLCAweDczNDMsIDB4NzM2QywgMHg3MzdDLCAweDczODMsIDB4NzM4NSwgMHg3Mzg2LCAweDczOTUsIDB4NzM5RSwKKyAgICAweDczOUYsIDB4NzNBMCwgMHg3M0E2LCAweDczQUIsIDB4NzNCNSwgMHg3M0I3LCAweDczQkMsIDB4NzNDRiwgMHg3M0Q5LAorICAgIDB4NzNFOSwgMHg3M0Y0LCAweDczRkQsIDB4NzQwNCwgMHg3NDBBLCAweDc0MUEsIDB4NzQxQiwgMHg3NDI0LCAweDc0MjgsCisgICAgMHg3NDJDLCAweDc0MkYsIDB4NzQzMCwgMHg3NDMxLCAweDc0MzksIDB4NzQ0NCwgMHg3NDQ3LCAweDc0NEIsIDB4NzQ0RCwKKyAgICAweDc0NTEsIDB4NzQ1NywgMHg3NDY2LCAweDc0NkIsIDB4NzQ3MSwgMHg3NDgwLCAweDc0ODUsIDB4NzQ4NiwgMHg3NDg3LAorICAgIDB4NzQ5MCwgMHg3NDk4LCAweDc0OUMsIDB4NzRBMCwgMHg3NEEzLCAweDc0QTgsIDB4NzRBQiwgMHg3NEI1LCAweDc0QkYsCisgICAgMHg3NEM4LCAweDc0REEsIDB4NzRERSwgMHg3NTRFLCAweDc1NzksIDB4NzU4MSwgMHg3NTkwLCAweDc1OTIsIDB4NzU5MywKKyAgICAweDc1QjQsIDB4NzVFNCwgMHg3NUY5LCAweDc2MDAsIDB4NzYwQSwgMHg3NjE1LCAweDc2MTYsIDB4NzYxOSwgMHg3NjFFLAorICAgIDB4NzYyRCwgMHg3NjM1LCAweDc2NDMsIDB4NzY0QiwgMHg3NjY1LCAweDc2NkQsIDB4NzY2RiwgMHg3NjcxLCAweDc2NzQsCisgICAgMHg3NkE0LCAweDc2QTUsIDB4NzZDNSwgMHg3NkNDLCAweDc2RUMsIDB4NzZGQywgMHg3NzM0LCAweDc3MzYsIDB4Nzc1QywKKyAgICAweDc3NUYsIDB4Nzc2MCwgMHg3NzcyLCAweDc3N0QsIDB4Nzc5NSwgMHg3N0FBLCAweDc3RTYsIDB4NzdGMCwgMHg3N0Y0LAorICAgIDB4NzgwNiwgMHg3ODIyLCAweDc4MkQsIDB4NzgyRSwgMHg3ODMwLCAweDc4MzUsIDB4Nzg2OCwgMHg3ODlFLCAweDc4QzgsCisgICAgMHg3OENDLCAweDc4Q0UsIDB4NzhFNCwgMHg3OEUwLCAweDc4RTEsIDB4NzhGMiwgMHg3OEY3LCAweDc4RkIsIDB4NzkzMSwKKyAgICAweDc5MzQsIDB4NzkzQiwgMHg3OTNELCAweDc5NDUsIDB4Nzk1QiwgMHg3OTVDLCAweDc5OEIsIDB4Nzk5NiwgMHg3OTk4LAorICAgIDB4NzlCOCwgMHg3OUJCLCAweDc5Q0EsIDB4NzlEQSwgMHg3QTAzLCAweDdBMDksIDB4N0ExMSwgMHg3QTFFLCAweDdBMkQsCisgICAgMHg3QTM5LCAweDdBNDUsIDB4N0E0QywgMHg3QTVELCAweDdBNjAsIDB4N0E2RCwgMHg3QTc4LCAweDdBQTAsIDB4N0FBMywKKyAgICAweDdBQjMsIDB4N0FCQiwgMHg3QUJDLCAweDdBQzYsIDB4N0IwNywgMHg3QjE0LCAweDdCMjcsIDB4N0IzMSwgMHg3QjQ3LAorICAgIDB4N0I0RSwgMHg3QjYwLCAweDdCNjksIDB4N0I2RCwgMHg3QjcyLCAweDdCOTEsIDB4N0JBRiwgMHg3QkQ3LCAweDdCRDksCisgICAgMHg3QzBCLCAweDdDMEYsIDB4N0MyMCwgMHg3QzI2LCAweDdDMzEsIDB4N0MzNiwgMHg3QzUxLCAweDdDNTksIDB4N0M2NywKKyAgICAweDdDNkUsIDB4N0M3MCwgMHg3Q0JDLCAweDdDQkYsIDB4N0NDOCwgMHg3Q0M5LCAweDdDRDcsIDB4N0NEOSwgMHg3Q0RELAorICAgIDB4N0NFQiwgMHg3RDA3LCAweDdEMDgsIDB4N0QwOSwgMHg3RDEzLCAweDdEMUQsIDB4N0QyMywgMHg3RDQxLCAweDdENTMsCisgICAgMHg3RDU5LCAweDdENUQsIDB4N0Q3QSwgMHg3RDg2LCAweDdEOEIsIDB4N0Q4QywgMHg3RENDLCAweDdERUIsIDB4N0RGMSwKKyAgICAweDdERjksIDB4N0UwOCwgMHg3RTExLCAweDdFMTUsIDB4N0UyMCwgMHg3RTQ3LCAweDdFNjIsIDB4N0U2RSwgMHg3RTczLAorICAgIDB4N0U4RCwgMHg3RTkxLCAweDdFOTgsIDB4N0Y0NCwgMHg3RjRGLCAweDdGNTIsIDB4N0Y1MywgMHg3RjYxLCAweDdGOTEsCisgICAgMHg3RkJGLCAweDdGQ0UsIDB4N0ZERiwgMHg3RkU1LCAweDdGRUMsIDB4N0ZFRSwgMHg3RkVGLCAweDdGRkEsIDB4ODAwRSwKKyAgICAweDgwMTEsIDB4ODAxNCwgMHg4MDI0LCAweDgwMjYsIDB4ODAzQSwgMHg4MDNDLCAweDgwNjAsIDB4ODA3MSwgMHg4MDc1LAorICAgIDB4ODA5RSwgMHg4MEE2LCAweDgwQUIsIDB4ODBENywgMHg4MEQ4LCAweDgxMTYsIDB4ODExOCwgMHg4MTNBLCAweDgxNEEsCisgICAgMHg4MTRDLCAweDgxODEsIDB4ODE4NCwgMHg4MUI0LCAweDgxQ0YsIDB4ODFGOSwgMHg4MjAzLCAweDgyMjEsIDB4ODIzMiwKKyAgICAweDgyMzQsIDB4ODI0NiwgMHg4MjRCLCAweDgyNEYsIDB4ODI4RSwgMHg4MkFFLCAweDgyQjcsIDB4ODJCRSwgMHg4MkM2LAorICAgIDB4ODJGRSwgMHg4MzQzLCAweDgzNTEsIDB4ODM1NSwgMHg4Mzg2LCAweDgzOEQsIDB4ODM5MiwgMHg4Mzk4LCAweDgzQTksCisgICAgMHg4M0JGLCAweDgzQzAsIDB4ODNFQSwgMHg4NDBGLCAweDg0MTEsIDB4ODQ0QSwgMHg4NDc2LCAweDg0QTgsIDB4ODRBRiwKKyAgICAweDg0QzAsIDB4ODRDMiwgMHg4NEYwLCAweDg0RkQsIDB4ODUwQywgMHg4NTM0LCAweDg1NUUsIDB4ODU4RiwgMHg4NUI3LAorICAgIDB4ODVDRSwgMHg4NUFELCAweDg2MTIsIDB4ODYyOSwgMHg4NjUyLCAweDg2NjMsIDB4ODY2QywgMHg4NjZGLCAweDg2N0EsCisgICAgMHg4NjhELCAweDg2OTEsIDB4ODY5OCwgMHg4NkE3LCAweDg2QTgsIDB4ODZGQSwgMHg4NkZELCAweDg3MEIsIDB4ODcxMywKKyAgICAweDg3MTksIDB4ODcxRSwgMHg4NzI4LCAweDg3M0UsIDB4ODc3MSwgMHg4Nzg4LCAweDg3OTksIDB4ODdBQywgMHg4N0FELAorICAgIDB4ODdCNSwgMHg4N0Q2LCAweDg3RUIsIDB4ODdFRCwgMHg4ODAxLCAweDg4MDMsIDB4ODgwNiwgMHg4ODBCLCAweDg4MTQsCisgICAgMHg4ODFDLCAweDg4NTYsIDB4ODg1RiwgMHg4ODY0LCAweDg4OTgsIDB4ODhBQSwgMHg4OEJELCAweDg4QkUsIDB4ODhDQSwKKyAgICAweDg4RDIsIDB4ODhEQiwgMHg4OEYwLCAweDg4RjEsIDB4ODkwNiwgMHg4OTE4LCAweDg5MTksIDB4ODkxQSwgMHg4OTI3LAorICAgIDB4ODkzMCwgMHg4OTNFLCAweDg5N0IsIDB4ODlENCwgMHg4OUQ2LCAweDg5RTUsIDB4ODlGMSwgMHg4QTA3LCAweDhBMEYsCisgICAgMHg4QTE1LCAweDhBMjIsIDB4OEE0RSwgMHg4QTdGLCAweDhBRjQsIDB4OEIxRiwgMHg4QjM3LCAweDhCNDMsIDB4OEI0NCwKKyAgICAweDhCNTQsIDB4OEI5QywgMHg4QjlFLCAweDhDNDcsIDB4OEM1NCwgMHg4QzczLCAweDhDQTQsIDB4OENEOSwgMHg4Q0UxLAorICAgIDB4OENGOCwgMHg4Q0ZFLCAweDhEMUIsIDB4OEQ2OSwgMHg4RDZDLCAweDhEODQsIDB4OEQ4RCwgMHg4RDk1LCAweDhEQTYsCisgICAgMHg4REM2LCAweDhEQ0UsIDB4OERFNCwgMHg4REVDLCAweDhFMjAsIDB4OEU0QiwgMHg4RTZDLCAweDhFNzAsIDB4OEU3QSwKKyAgICAweDhFOTIsIDB4OEVBRSwgMHg4RUIzLCAweDhFRDEsIDB4OEVENCwgMHg4RUY5LCAweDhGMTcsIDB4OEYzNiwgMHg4RkE2LAorICAgIDB4OEZCNSwgMHg4RkI2LCAweDhGQzYsIDB4OEZFMCwgMHg4RkU0LCAweDhGRjYsIDB4OTAwMiwgMHg5MDJDLCAweDkwNDQsCisgICAgMHg5MDg4LCAweDkwOTUsIDB4OTA5OSwgMHg5MDlCLCAweDkwQTIsIDB4OTBCNCwgMHg5MEQ3LCAweDkwREQsIDB4OTBGNCwKKyAgICAweDkxMTcsIDB4OTExQywgMHg5MTMxLCAweDkxM0EsIDB4OTEzRCwgMHg5MTQ4LCAweDkxNUIsIDB4OTE2MSwgMHg5MTY0LAorICAgIDB4OTE4RSwgMHg5MTlFLCAweDkxQTgsIDB4OTFBRCwgMHg5MUFFLCAweDkxQjIsIDB4OTFCQywgMHg5MUYwLCAweDkxRjcsCisgICAgMHg5MUZCLCAweDkyMDcsIDB4OTIyOCwgMHg5MjMzLCAweDkyMzgsIDB4OTI0MywgMHg5MjQ3LCAweDkyNEYsIDB4OTI2MCwKKyAgICAweDkyQzIsIDB4OTJDQiwgMHg5MkNDLCAweDkyREYsIDB4OTMwRCwgMHg5MzE1LCAweDkzMUYsIDB4OTMyNywgMHg5MzQ3LAorICAgIDB4OTM1MiwgMHg5MzY1LCAweDkzNkEsIDB4OTM2RCwgMHg5MzlCLCAweDkzQkEsIDB4OTNBOSwgMHg5M0MxLCAweDkzQ0EsCisgICAgMHg5M0UyLCAweDkzRkEsIDB4OTNGRCwgMHg5NDBGLCAweDk0MzQsIDB4OTQzRiwgMHg5NDU1LCAweDk0NkIsIDB4OTQ3MiwKKyAgICAweDk1NzgsIDB4OTVBNiwgMHg5NUE5LCAweDk1QUIsIDB4OTVCNCwgMHg5NUJELCAweDk1REEsIDB4OTYxRCwgMHg5NjQxLAorICAgIDB4OTY1OCwgMHg5Njg0LCAweDk2QTQsIDB4OTZBOSwgMHg5NkQyLCAweDVEQjIsIDB4OTZERSwgMHg5NkU5LCAweDk2RjEsCisgICAgMHg5NzAyLCAweDk3MDksIDB4OTc1QSwgMHg5NzYzLCAweDk3NkUsIDB4OTc3MywgMHg5NzlBLCAweDk3QTIsIDB4OTdCNSwKKyAgICAweDk3QjYsIDB4OTdEOSwgMHg5N0RFLCAweDk3RjQsIDB4OTgwQSwgMHg5ODBFLCAweDk4MUUsIDB4OTgyMywgMHg5ODJCLAorICAgIDB4OTgzRSwgMHg5ODUyLCAweDk4NTMsIDB4OTg1OSwgMHg5ODZDLCAweDk4QjgsIDB4OThCQSwgMHg5OEJGLCAweDk4QzgsCisgICAgMHg5OEU1LCAweDk5MzIsIDB4OTkzMywgMHg5OTQwLCAweDk5NEQsIDB4OTk1QywgMHg5OTVGLCAweDk5QjEsIDB4OTlCOSwKKyAgICAweDk5QkEsIDB4OTlDOSwgMHg5QTAyLCAweDlBMTYsIDB4OUEyNCwgMHg5QTI3LCAweDlBMkQsIDB4OUEyRSwgMHg5QTM2LAorICAgIDB4OUEzOCwgMHg5QTRBLCAweDlBNTYsIDB4OUFCNSwgMHg5QUI2LCAweDlBRjksIDB4OUIwMywgMHg5QjIwLCAweDlCMzMsCisgICAgMHg5QjM0LCAweDlCNzMsIDB4OUI3OSwgMHg5QkE3LCAweDlCQzEsIDB4OUJDNywgMHg5QkQ3LCAweDlCRTcsIDB4OUJFQiwKKyAgICAweDlCRjcsIDB4OUJGQSwgMHg5QkZELCAweDlDMEIsIDB4OUMyNywgMHg5QzJBLCAweDlDMzYsIDB4OUM0MSwgMHg5QzUzLAorICAgIDB4OUM2MywgMHg5QzZBLCAweDlDNzcsIDB4OUQwMiwgMHg5RDQyLCAweDlENDcsIDB4OUQ2MywgMHg5RDY5LCAweDlEN0MsCisgICAgMHg5RDdFLCAweDlEOEQsIDB4OURCMSwgMHg5REMzLCAweDlEQzcsIDB4OURENiwgMHg5RERGLCAweDlERUIsIDB4OURGNCwKKyAgICAweDlFMTUsIDB4OUUxRCwgMHg5RUE0LCAweDlFQTgsIDB4OUVBQywgMHg5RUU3LCAweDlFRUUsIDB4OUYxMCwgMHg5RjEyLAorICAgIDB4OUYxNywgMHg5RjE5LCAweDlGMkYsIDB4OUYzNywgMHg5RjM5LCAweDlGNDEsIDB4OUY0NSwgMHg5RjU3LCAweDlGNjgsCisgICAgMHg5RjcxLCAweDlGNzUsIDB4OUY5MCwgMHg5Rjk0LCAweDlGQTIsIDB4NEUzMCwgMHgzNDA1LCAweDRGNjAsIDB4NTYyMCwKKyAgICAweDVFQ0IsIDB4MkU5NSwgMHg2MEE0LCAweDY5RDcsIDB4NkIyNCwgMHg2RkY5LCAweDZFRTYsIDB4NzFCMywgMHgyRUE0LAorICAgIDB4N0FDNiwgMHg3RjYxLCAweDgwNzEsIDB4ODA5RSwgMHgyRUNDLCAweDkxRjAsIDB4NURCMiwgMHg5N0RFLCAweDRGRDMsCisgICAgMHg1MEQ5LCAweDUwRjAsIDB4NTFDMywgMHg1Njc2LCAweDZBNTQsIDB4NkQwMSwgMHg2REQwLCAweDZFNDIsIDB4NkVEOSwKKyAgICAweDczRTQsIDB4NzQyMSwgMHg3NTZDLCAweDc4NTEsIDB4ODdGNSwgMHhGRkZELCAweDczQTgsIDB4M0FGMywgMHgzNERCLAorICAgIDB4NDQwQywgMHgzRThBLCAweEZGRkQsIDB4RkZGRCwgMHg0QkU4LCAweEZGRkQsIDB4M0VEQSwgMHgzQjIyLCAweEZGRkQsCisgICAgMHg0NTdBLCAweDQwOTMsIDB4RkZGRCwgMHg0NjY1LCAweDQxMDMsIDB4NDI5MywgMHg0NkFFLCAweDM0ODgsIDB4RkZGRCwKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL0VVQy1IXzEuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9FVUMtSF8xLmNwcAppbmRleCA3ZWE1ODY2Li5mM2IxNWQzIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL0VVQy1IXzEuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvRVVDLUhfMS5jcHAKQEAgLTEsMTAgKzEsMTIgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0IGdfRlhDTUFQX0VVQ19IXzFbMTIwICogM10gPSB7CisjaW5jbHVkZSAiY21hcHNfamFwYW4xLmgiCisKK2NvbnN0IEZYX1dPUkQgZ19GWENNQVBfRVVDX0hfMVsxMjAgKiAzXSA9IHsKICAgICAweDAwMjAsIDB4MDA3RSwgMHgwMEU3LCAweDhFQTAsIDB4OEVERiwgMHgwMTQ2LCAweEExQTEsIDB4QTFGRSwgMHgwMjc5LAogICAgIDB4QTJBMSwgMHhBMkFFLCAweDAyRDcsIDB4QTJCQSwgMHhBMkMxLCAweDAyRTUsIDB4QTJDQSwgMHhBMkQwLCAweDAyRUQsCiAgICAgMHhBMkRDLCAweEEyRUEsIDB4MDJGNCwgMHhBMkYyLCAweEEyRjksIDB4MDMwMywgMHhBMkZFLCAweEEyRkUsIDB4MDMwQiwKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvRVVDLVZfMS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL0VVQy1WXzEuY3BwCmluZGV4IDNiNGZiNzkuLmQ0MDA0Y2QgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvRVVDLVZfMS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9FVUMtVl8xLmNwcApAQCAtMSwxMCArMSwxMiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi1leHRlcm4gY29uc3QgdW5zaWduZWQgc2hvcnQgZ19GWENNQVBfRVVDX1ZfMVsyNyAqIDNdID0geworI2luY2x1ZGUgImNtYXBzX2phcGFuMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0VVQ19WXzFbMjcgKiAzXSA9IHsKICAgICAweEExQTIsIDB4QTFBMywgMHgxRUNGLCAweEExQjEsIDB4QTFCMiwgMHgxRUQxLCAweEExQkMsIDB4QTFCRSwgMHgxRUQzLAogICAgIDB4QTFDMSwgMHhBMUM1LCAweDFFRDYsIDB4QTFDQSwgMHhBMURCLCAweDFFREIsIDB4QTFFMSwgMHhBMUUxLCAweDFFRUQsCiAgICAgMHhBNEExLCAweEE0QTEsIDB4MUVFRSwgMHhBNEEzLCAweEE0QTMsIDB4MUVFRiwgMHhBNEE1LCAweEE0QTUsIDB4MUVGMCwKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvRXh0LVJLU0otSF8yLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvRXh0LVJLU0otSF8yLmNwcAppbmRleCBhMjY5YmE2Li44NTA2MjUzIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL0V4dC1SS1NKLUhfMi5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9FeHQtUktTSi1IXzIuY3BwCkBAIC0xLDEwICsxLDEyIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCBnX0ZYQ01BUF9FeHRfUktTSl9IXzJbNjY1ICogM10gPSB7CisjaW5jbHVkZSAiY21hcHNfamFwYW4xLmgiCisKK2NvbnN0IEZYX1dPUkQgZ19GWENNQVBfRXh0X1JLU0pfSF8yWzY2NSAqIDNdID0gewogICAgIDB4MDAyMCwgMHgwMDdFLCAweDAwRTcsIDB4MDBBMCwgMHgwMERGLCAweDAxNDYsIDB4ODE0MCwgMHg4MTdFLCAweDAyNzksCiAgICAgMHg4MTgwLCAweDgxODgsIDB4MDJCOCwgMHg4MTg5LCAweDgxODksIDB4MUQzNiwgMHg4MThBLCAweDgxQUMsIDB4MDJDMiwKICAgICAweDgyNEYsIDB4ODI1OCwgMHgwMzBDLCAweDgyNjAsIDB4ODI3OSwgMHgwMzE2LCAweDgyODEsIDB4ODI5QSwgMHgwMzMwLApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9FeHQtUktTSi1WXzIuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9FeHQtUktTSi1WXzIuY3BwCmluZGV4IGQ1N2RjZTkuLjdkZTZmMDEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvRXh0LVJLU0otVl8yLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL0V4dC1SS1NKLVZfMi5jcHAKQEAgLTEsMTAgKzEsMTIgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0IGdfRlhDTUFQX0V4dF9SS1NKX1ZfMlszOSAqIDNdID0geworI2luY2x1ZGUgImNtYXBzX2phcGFuMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0V4dF9SS1NKX1ZfMlszOSAqIDNdID0gewogICAgIDB4ODE0MSwgMHg4MTQyLCAweDFFQ0YsIDB4ODE0MywgMHg4MTQzLCAweDIwNEMsIDB4ODE0NCwgMHg4MTQ0LCAweDIwNTIsCiAgICAgMHg4MTRBLCAweDgxNEEsIDB4MjA1MCwgMHg4MTRCLCAweDgxNEIsIDB4MjA0RiwgMHg4MTVCLCAweDgxNUQsIDB4MUVEMywKICAgICAweDgxNjAsIDB4ODE2NCwgMHgxRUQ2LCAweDgxNjUsIDB4ODE2NSwgMHgyMDU5LCAweDgxNjYsIDB4ODE2NiwgMHgyMDU0LApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9IXzEuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9IXzEuY3BwCmluZGV4IDQzMDc2YTAuLmVkNmNiODEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvSF8xLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL0hfMS5jcHAKQEAgLTEsMTAgKzEsMTIgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0IGdfRlhDTUFQX0hfMVsxMTggKiAzXSA9IHsKKyNpbmNsdWRlICJjbWFwc19qYXBhbjEuaCIKKworY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9IXzFbMTE4ICogM10gPSB7CiAgICAgMHgyMTIxLCAweDIxN0UsIDB4MDI3OSwgMHgyMjIxLCAweDIyMkUsIDB4MDJENywgMHgyMjNBLCAweDIyNDEsIDB4MDJFNSwKICAgICAweDIyNEEsIDB4MjI1MCwgMHgwMkVELCAweDIyNUMsIDB4MjI2QSwgMHgwMkY0LCAweDIyNzIsIDB4MjI3OSwgMHgwMzAzLAogICAgIDB4MjI3RSwgMHgyMjdFLCAweDAzMEIsIDB4MjMzMCwgMHgyMzM5LCAweDAzMEMsIDB4MjM0MSwgMHgyMzVBLCAweDAzMTYsCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1VuaUpJUy1VQ1MyLUhXLUhfNC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1VuaUpJUy1VQ1MyLUhXLUhfNC5jcHAKaW5kZXggOTk4Mzc1OC4uODM2YTFmMSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9VbmlKSVMtVUNTMi1IVy1IXzQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvVW5pSklTLVVDUzItSFctSF80LmNwcApAQCAtMSwxMCArMSwxMiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi1leHRlcm4gY29uc3QgdW5zaWduZWQgc2hvcnQgZ19GWENNQVBfVW5pSklTX1VDUzJfSFdfSF80WzQgKiAzXSA9IHsKLSAgICAweDAwMjAsIDB4MDA1QiwgMHgwMEU3LCAweDAwNUMsIDB4MDA1QywgMHgyMjBGLCAweDAwNUQsIDB4MDA3RSwgMHgwMTI0LAotICAgIDB4MDBBNSwgMHgwMEE1LCAweDAxMjMsCisjaW5jbHVkZSAiY21hcHNfamFwYW4xLmgiCisKK2NvbnN0IEZYX1dPUkQgZ19GWENNQVBfVW5pSklTX1VDUzJfSFdfSF80WzQgKiAzXSA9IHsKKyAgICAweDAwMjAsIDB4MDA1QiwgMHgwMEU3LCAweDAwNUMsIDB4MDA1QywgMHgyMjBGLAorICAgIDB4MDA1RCwgMHgwMDdFLCAweDAxMjQsIDB4MDBBNSwgMHgwMEE1LCAweDAxMjMsCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9VbmlKSVMtVUNTMi1IVy1WXzQuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9VbmlKSVMtVUNTMi1IVy1WXzQuY3BwCmluZGV4IGU5OTZhZWIuLjk5N2NlMDUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvVW5pSklTLVVDUzItSFctVl80LmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1VuaUpJUy1VQ1MyLUhXLVZfNC5jcHAKQEAgLTEsMTAgKzEsMTIgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0IGdfRlhDTUFQX1VuaUpJU19VQ1MyX0hXX1ZfNFsxOTkgKiAzXSA9IHsKKyNpbmNsdWRlICJjbWFwc19qYXBhbjEuaCIKKworY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9VbmlKSVNfVUNTMl9IV19WXzRbMTk5ICogM10gPSB7CiAgICAgMHgwMDIwLCAweDAwNUIsIDB4MDBFNywgMHgwMDVDLCAweDAwNUMsIDB4MjIwRiwgMHgwMDVELCAweDAwN0UsIDB4MDEyNCwKICAgICAweDAwQTUsIDB4MDBBNSwgMHgwMTIzLCAweDAwQjAsIDB4MDBCMCwgMHgyMDRELCAweDIwMTAsIDB4MjAxMCwgMHgxRUQ1LAogICAgIDB4MjAxNSwgMHgyMDE1LCAweDFFRDQsIDB4MjAxNiwgMHgyMDE2LCAweDFFRDcsIDB4MjAxOCwgMHgyMDE5LCAweDIwNTksCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1VuaUpJUy1VQ1MyLUhfNC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1VuaUpJUy1VQ1MyLUhfNC5jcHAKaW5kZXggYzZhYjgzNC4uNjc3NDVhZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9VbmlKSVMtVUNTMi1IXzQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvVW5pSklTLVVDUzItSF80LmNwcApAQCAtMSwyNDUxICsxLDIxODIgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0IGdfRlhDTUFQX1VuaUpJU19VQ1MyX0hfNFs5NzcyICogMl0gPSB7Ci0gICAgMHgwMDIwLCAweDAwMDEsIDB4MDAyMSwgMHgwMDAyLCAweDAwMjIsIDB4MDAwMywgMHgwMDIzLCAweDAwMDQsCi0gICAgMHgwMDI0LCAweDAwMDUsIDB4MDAyNSwgMHgwMDA2LCAweDAwMjYsIDB4MDAwNywgMHgwMDI3LCAweDAwMDgsCi0gICAgMHgwMDI4LCAweDAwMDksIDB4MDAyOSwgMHgwMDBBLCAweDAwMkEsIDB4MDAwQiwgMHgwMDJCLCAweDAwMEMsCi0gICAgMHgwMDJDLCAweDAwMEQsIDB4MDAyRCwgMHgwMDBFLCAweDAwMkUsIDB4MDAwRiwgMHgwMDJGLCAweDAwMTAsCi0gICAgMHgwMDMwLCAweDAwMTEsIDB4MDAzMSwgMHgwMDEyLCAweDAwMzIsIDB4MDAxMywgMHgwMDMzLCAweDAwMTQsCi0gICAgMHgwMDM0LCAweDAwMTUsIDB4MDAzNSwgMHgwMDE2LCAweDAwMzYsIDB4MDAxNywgMHgwMDM3LCAweDAwMTgsCi0gICAgMHgwMDM4LCAweDAwMTksIDB4MDAzOSwgMHgwMDFBLCAweDAwM0EsIDB4MDAxQiwgMHgwMDNCLCAweDAwMUMsCi0gICAgMHgwMDNDLCAweDAwMUQsIDB4MDAzRCwgMHgwMDFFLCAweDAwM0UsIDB4MDAxRiwgMHgwMDNGLCAweDAwMjAsCi0gICAgMHgwMDQwLCAweDAwMjEsIDB4MDA0MSwgMHgwMDIyLCAweDAwNDIsIDB4MDAyMywgMHgwMDQzLCAweDAwMjQsCi0gICAgMHgwMDQ0LCAweDAwMjUsIDB4MDA0NSwgMHgwMDI2LCAweDAwNDYsIDB4MDAyNywgMHgwMDQ3LCAweDAwMjgsCi0gICAgMHgwMDQ4LCAweDAwMjksIDB4MDA0OSwgMHgwMDJBLCAweDAwNEEsIDB4MDAyQiwgMHgwMDRCLCAweDAwMkMsCi0gICAgMHgwMDRDLCAweDAwMkQsIDB4MDA0RCwgMHgwMDJFLCAweDAwNEUsIDB4MDAyRiwgMHgwMDRGLCAweDAwMzAsCi0gICAgMHgwMDUwLCAweDAwMzEsIDB4MDA1MSwgMHgwMDMyLCAweDAwNTIsIDB4MDAzMywgMHgwMDUzLCAweDAwMzQsCi0gICAgMHgwMDU0LCAweDAwMzUsIDB4MDA1NSwgMHgwMDM2LCAweDAwNTYsIDB4MDAzNywgMHgwMDU3LCAweDAwMzgsCi0gICAgMHgwMDU4LCAweDAwMzksIDB4MDA1OSwgMHgwMDNBLCAweDAwNUEsIDB4MDAzQiwgMHgwMDVCLCAweDAwM0MsCi0gICAgMHgwMDVDLCAweDAwNjEsIDB4MDA1RCwgMHgwMDNFLCAweDAwNUUsIDB4MDAzRiwgMHgwMDVGLCAweDAwNDAsCi0gICAgMHgwMDYwLCAweDAwNDEsIDB4MDA2MSwgMHgwMDQyLCAweDAwNjIsIDB4MDA0MywgMHgwMDYzLCAweDAwNDQsCi0gICAgMHgwMDY0LCAweDAwNDUsIDB4MDA2NSwgMHgwMDQ2LCAweDAwNjYsIDB4MDA0NywgMHgwMDY3LCAweDAwNDgsCi0gICAgMHgwMDY4LCAweDAwNDksIDB4MDA2OSwgMHgwMDRBLCAweDAwNkEsIDB4MDA0QiwgMHgwMDZCLCAweDAwNEMsCi0gICAgMHgwMDZDLCAweDAwNEQsIDB4MDA2RCwgMHgwMDRFLCAweDAwNkUsIDB4MDA0RiwgMHgwMDZGLCAweDAwNTAsCi0gICAgMHgwMDcwLCAweDAwNTEsIDB4MDA3MSwgMHgwMDUyLCAweDAwNzIsIDB4MDA1MywgMHgwMDczLCAweDAwNTQsCi0gICAgMHgwMDc0LCAweDAwNTUsIDB4MDA3NSwgMHgwMDU2LCAweDAwNzYsIDB4MDA1NywgMHgwMDc3LCAweDAwNTgsCi0gICAgMHgwMDc4LCAweDAwNTksIDB4MDA3OSwgMHgwMDVBLCAweDAwN0EsIDB4MDA1QiwgMHgwMDdCLCAweDAwNUMsCi0gICAgMHgwMDdDLCAweDAwNUQsIDB4MDA3RCwgMHgwMDVFLCAweDAwN0UsIDB4MDA1RiwgMHgwMEExLCAweDAwNjUsCi0gICAgMHgwMEEyLCAweDAwNjYsIDB4MDBBMywgMHgwMDY3LCAweDAwQTQsIDB4MDA2QiwgMHgwMEE1LCAweDAwM0QsCi0gICAgMHgwMEE2LCAweDAwNjMsIDB4MDBBNywgMHgwMkQwLCAweDAwQTgsIDB4MDI4NywgMHgwMEE5LCAweDAwOTgsCi0gICAgMHgwMEFBLCAweDAwOEMsIDB4MDBBQiwgMHgwMDZELCAweDAwQUMsIDB4MDA5OSwgMHgwMEFELCAweDAwOTcsCi0gICAgMHgwMEFFLCAweDAwOUEsIDB4MDBBRiwgMHgwMDgxLCAweDAwQjAsIDB4MDJDMywgMHgwMEIxLCAweDAyQjYsCi0gICAgMHgwMEIyLCAweDAwOUQsIDB4MDBCMywgMHgwMDlFLCAweDAwQjQsIDB4MDI4NSwgMHgwMEI1LCAweDAwOUYsCi0gICAgMHgwMEI2LCAweDAzMEEsIDB4MDBCNywgMHgwMDc1LCAweDAwQjgsIDB4MDA4NiwgMHgwMEI5LCAweDAwQTAsCi0gICAgMHgwMEJBLCAweDAwOTAsIDB4MDBCQiwgMHgwMDdCLCAweDAwQkMsIDB4MDBBMSwgMHgwMEJELCAweDAwQTIsCi0gICAgMHgwMEJFLCAweDAwQTMsIDB4MDBCRiwgMHgwMDdFLCAweDAwQzAsIDB4MDBBNCwgMHgwMEMxLCAweDAwQTUsCi0gICAgMHgwMEMyLCAweDAwQTYsIDB4MDBDMywgMHgwMEE3LCAweDAwQzQsIDB4MDBBOCwgMHgwMEM1LCAweDAwQTksCi0gICAgMHgwMEM2LCAweDAwOEIsIDB4MDBDNywgMHgwMEFBLCAweDAwQzgsIDB4MDBBQiwgMHgwMEM5LCAweDAwQUMsCi0gICAgMHgwMENBLCAweDAwQUQsIDB4MDBDQiwgMHgwMEFFLCAweDAwQ0MsIDB4MDBBRiwgMHgwMENELCAweDAwQjAsCi0gICAgMHgwMENFLCAweDAwQjEsIDB4MDBDRiwgMHgwMEIyLCAweDAwRDAsIDB4MDBCMywgMHgwMEQxLCAweDAwQjQsCi0gICAgMHgwMEQyLCAweDAwQjUsIDB4MDBEMywgMHgwMEI2LCAweDAwRDQsIDB4MDBCNywgMHgwMEQ1LCAweDAwQjgsCi0gICAgMHgwMEQ2LCAweDAwQjksIDB4MDBENywgMHgwMkI3LCAweDAwRDgsIDB4MDA4RSwgMHgwMEQ5LCAweDAwQkIsCi0gICAgMHgwMERBLCAweDAwQkMsIDB4MDBEQiwgMHgwMEJELCAweDAwREMsIDB4MDBCRSwgMHgwMERELCAweDAwQkYsCi0gICAgMHgwMERFLCAweDAwQzAsIDB4MDBERiwgMHgwMDk2LCAweDAwRTAsIDB4MDBDMSwgMHgwMEUxLCAweDAwQzIsCi0gICAgMHgwMEUyLCAweDAwQzMsIDB4MDBFMywgMHgwMEM0LCAweDAwRTQsIDB4MDBDNSwgMHgwMEU1LCAweDAwQzYsCi0gICAgMHgwMEU2LCAweDAwOTEsIDB4MDBFNywgMHgwMEM3LCAweDAwRTgsIDB4MDBDOCwgMHgwMEU5LCAweDAwQzksCi0gICAgMHgwMEVBLCAweDAwQ0EsIDB4MDBFQiwgMHgwMENCLCAweDAwRUMsIDB4MDBDQywgMHgwMEVELCAweDAwQ0QsCi0gICAgMHgwMEVFLCAweDAwQ0UsIDB4MDBFRiwgMHgwMENGLCAweDAwRjAsIDB4MDBEMCwgMHgwMEYxLCAweDAwRDEsCi0gICAgMHgwMEYyLCAweDAwRDIsIDB4MDBGMywgMHgwMEQzLCAweDAwRjQsIDB4MDBENCwgMHgwMEY1LCAweDAwRDUsCi0gICAgMHgwMEY2LCAweDAwRDYsIDB4MDBGNywgMHgwMkI4LCAweDAwRjgsIDB4MDA5NCwgMHgwMEY5LCAweDAwRDgsCi0gICAgMHgwMEZBLCAweDAwRDksIDB4MDBGQiwgMHgwMERBLCAweDAwRkMsIDB4MDBEQiwgMHgwMEZELCAweDAwREMsCi0gICAgMHgwMEZFLCAweDAwREQsIDB4MDBGRiwgMHgwMERFLCAweDAxMDAsIDB4MjQ5NiwgMHgwMTAxLCAweDI0OTEsCi0gICAgMHgwMTEyLCAweDI0OTksIDB4MDExMywgMHgyNDk0LCAweDAxMUEsIDB4MjRCMywgMHgwMTFCLCAweDI0QkYsCi0gICAgMHgwMTI3LCAweDJGM0MsIDB4MDEyOCwgMHgyNEI4LCAweDAxMjksIDB4MjRDNCwgMHgwMTJBLCAweDI0OTcsCi0gICAgMHgwMTJCLCAweDI0OTIsIDB4MDEzMSwgMHgwMDkyLCAweDAxNDEsIDB4MDA4RCwgMHgwMTQyLCAweDAwOTMsCi0gICAgMHgwMTRCLCAweDI0REMsIDB4MDE0QywgMHgyNDlBLCAweDAxNEQsIDB4MjQ5NSwgMHgwMTUyLCAweDAwOEYsCi0gICAgMHgwMTUzLCAweDAwOTUsIDB4MDE2MCwgMHgwMERGLCAweDAxNjEsIDB4MDBFMywgMHgwMTY4LCAweDI0QkQsCi0gICAgMHgwMTY5LCAweDI0QzksIDB4MDE2QSwgMHgyNDk4LCAweDAxNkIsIDB4MjQ5MywgMHgwMTZFLCAweDI0QkMsCi0gICAgMHgwMTZGLCAweDI0QzgsIDB4MDE3OCwgMHgwMEUwLCAweDAxN0QsIDB4MDBFMSwgMHgwMTdFLCAweDAwRTUsCi0gICAgMHgwMUMwLCAweDAwNjMsIDB4MDFDRCwgMHgyNEIyLCAweDAxQ0UsIDB4MjRCRSwgMHgwMUNGLCAweDI0QjYsCi0gICAgMHgwMUQwLCAweDI0QzIsIDB4MDFEMSwgMHgyNEI5LCAweDAxRDIsIDB4MjRDNSwgMHgwMUQzLCAweDI0QkIsCi0gICAgMHgwMUQ0LCAweDI0QzcsIDB4MDFGRCwgMHgyNENELCAweDAyNTEsIDB4MjRDQSwgMHgwMjU0LCAweDI0Q0YsCi0gICAgMHgwMjU5LCAweDI0RDIsIDB4MDI1QSwgMHgyNEQ1LCAweDAyNUIsIDB4MjREOCwgMHgwMjc1LCAweDI0REQsCi0gICAgMHgwMjgzLCAweDI0RTIsIDB4MDI4QywgMHgyNERFLCAweDAyOTIsIDB4MjRFMSwgMHgwMkQwLCAweDI0RTMsCi0gICAgMHgwMzAwLCAweDAwNDEsIDB4MDMwMSwgMHgwMDdGLCAweDAzMDIsIDB4MDA4MCwgMHgwMzAzLCAweDAwNUYsCi0gICAgMHgwMzA0LCAweDAwODEsIDB4MDMwNSwgMHgwMEUyLCAweDAzMDYsIDB4MDA4MiwgMHgwMzA3LCAweDAwODMsCi0gICAgMHgwMzA4LCAweDAwODQsIDB4MDMwQSwgMHgwMDg1LCAweDAzMEIsIDB4MDA4NywgMHgwMzBDLCAweDAwODksCi0gICAgMHgwMzI3LCAweDAwODYsIDB4MDMyOCwgMHgwMDg4LCAweDAzMzIsIDB4MDA0MCwgMHgwMzM2LCAweDAwOEEsCi0gICAgMHgwMzYxLCAweDAyRjYsIDB4MDM5MSwgMHgwM0YzLCAweDAzOTIsIDB4MDNGNCwgMHgwMzkzLCAweDAzRjUsCi0gICAgMHgwMzk0LCAweDAzRjYsIDB4MDM5NSwgMHgwM0Y3LCAweDAzOTYsIDB4MDNGOCwgMHgwMzk3LCAweDAzRjksCi0gICAgMHgwMzk4LCAweDAzRkEsIDB4MDM5OSwgMHgwM0ZCLCAweDAzOUEsIDB4MDNGQywgMHgwMzlCLCAweDAzRkQsCi0gICAgMHgwMzlDLCAweDAzRkUsIDB4MDM5RCwgMHgwM0ZGLCAweDAzOUUsIDB4MDQwMCwgMHgwMzlGLCAweDA0MDEsCi0gICAgMHgwM0EwLCAweDA0MDIsIDB4MDNBMSwgMHgwNDAzLCAweDAzQTMsIDB4MDQwNCwgMHgwM0E0LCAweDA0MDUsCi0gICAgMHgwM0E1LCAweDA0MDYsIDB4MDNBNiwgMHgwNDA3LCAweDAzQTcsIDB4MDQwOCwgMHgwM0E4LCAweDA0MDksCi0gICAgMHgwM0E5LCAweDA0MEEsIDB4MDNCMSwgMHgwNDBCLCAweDAzQjIsIDB4MDQwQywgMHgwM0IzLCAweDA0MEQsCi0gICAgMHgwM0I0LCAweDA0MEUsIDB4MDNCNSwgMHgwNDBGLCAweDAzQjYsIDB4MDQxMCwgMHgwM0I3LCAweDA0MTEsCi0gICAgMHgwM0I4LCAweDA0MTIsIDB4MDNCOSwgMHgwNDEzLCAweDAzQkEsIDB4MDQxNCwgMHgwM0JCLCAweDA0MTUsCi0gICAgMHgwM0JDLCAweDA0MTYsIDB4MDNCRCwgMHgwNDE3LCAweDAzQkUsIDB4MDQxOCwgMHgwM0JGLCAweDA0MTksCi0gICAgMHgwM0MwLCAweDA0MUEsIDB4MDNDMSwgMHgwNDFCLCAweDAzQzMsIDB4MDQxQywgMHgwM0M0LCAweDA0MUQsCi0gICAgMHgwM0M1LCAweDA0MUUsIDB4MDNDNiwgMHgwNDFGLCAweDAzQzcsIDB4MDQyMCwgMHgwM0M4LCAweDA0MjEsCi0gICAgMHgwM0M5LCAweDA0MjIsIDB4MDNEMCwgMHgyRjNBLCAweDAzRDEsIDB4MkY0MCwgMHgwM0RCLCAweDJGM0YsCi0gICAgMHgwNDAxLCAweDA0MjksIDB4MDQxMCwgMHgwNDIzLCAweDA0MTEsIDB4MDQyNCwgMHgwNDEyLCAweDA0MjUsCi0gICAgMHgwNDEzLCAweDA0MjYsIDB4MDQxNCwgMHgwNDI3LCAweDA0MTUsIDB4MDQyOCwgMHgwNDE2LCAweDA0MkEsCi0gICAgMHgwNDE3LCAweDA0MkIsIDB4MDQxOCwgMHgwNDJDLCAweDA0MTksIDB4MDQyRCwgMHgwNDFBLCAweDA0MkUsCi0gICAgMHgwNDFCLCAweDA0MkYsIDB4MDQxQywgMHgwNDMwLCAweDA0MUQsIDB4MDQzMSwgMHgwNDFFLCAweDA0MzIsCi0gICAgMHgwNDFGLCAweDA0MzMsIDB4MDQyMCwgMHgwNDM0LCAweDA0MjEsIDB4MDQzNSwgMHgwNDIyLCAweDA0MzYsCi0gICAgMHgwNDIzLCAweDA0MzcsIDB4MDQyNCwgMHgwNDM4LCAweDA0MjUsIDB4MDQzOSwgMHgwNDI2LCAweDA0M0EsCi0gICAgMHgwNDI3LCAweDA0M0IsIDB4MDQyOCwgMHgwNDNDLCAweDA0MjksIDB4MDQzRCwgMHgwNDJBLCAweDA0M0UsCi0gICAgMHgwNDJCLCAweDA0M0YsIDB4MDQyQywgMHgwNDQwLCAweDA0MkQsIDB4MDQ0MSwgMHgwNDJFLCAweDA0NDIsCi0gICAgMHgwNDJGLCAweDA0NDMsIDB4MDQzMCwgMHgwNDQ0LCAweDA0MzEsIDB4MDQ0NSwgMHgwNDMyLCAweDA0NDYsCi0gICAgMHgwNDMzLCAweDA0NDcsIDB4MDQzNCwgMHgwNDQ4LCAweDA0MzUsIDB4MDQ0OSwgMHgwNDM2LCAweDA0NEIsCi0gICAgMHgwNDM3LCAweDA0NEMsIDB4MDQzOCwgMHgwNDRELCAweDA0MzksIDB4MDQ0RSwgMHgwNDNBLCAweDA0NEYsCi0gICAgMHgwNDNCLCAweDA0NTAsIDB4MDQzQywgMHgwNDUxLCAweDA0M0QsIDB4MDQ1MiwgMHgwNDNFLCAweDA0NTMsCi0gICAgMHgwNDNGLCAweDA0NTQsIDB4MDQ0MCwgMHgwNDU1LCAweDA0NDEsIDB4MDQ1NiwgMHgwNDQyLCAweDA0NTcsCi0gICAgMHgwNDQzLCAweDA0NTgsIDB4MDQ0NCwgMHgwNDU5LCAweDA0NDUsIDB4MDQ1QSwgMHgwNDQ2LCAweDA0NUIsCi0gICAgMHgwNDQ3LCAweDA0NUMsIDB4MDQ0OCwgMHgwNDVELCAweDA0NDksIDB4MDQ1RSwgMHgwNDRBLCAweDA0NUYsCi0gICAgMHgwNDRCLCAweDA0NjAsIDB4MDQ0QywgMHgwNDYxLCAweDA0NEQsIDB4MDQ2MiwgMHgwNDRFLCAweDA0NjMsCi0gICAgMHgwNDRGLCAweDA0NjQsIDB4MDQ1MSwgMHgwNDRBLCAweDA0NUIsIDB4MkYzQywgMHgxRUJDLCAweDI0QjUsCi0gICAgMHgxRUJELCAweDI0QzEsIDB4MjAwMiwgMHgwMEU3LCAweDIwMDMsIDB4MDI3OSwgMHgyMDEwLCAweDAyOTYsCi0gICAgMHgyMDExLCAweDAwMEUsIDB4MjAxMiwgMHgwMDcyLCAweDIwMTMsIDB4MDA3MiwgMHgyMDE0LCAweDAwOEEsCi0gICAgMHgyMDE1LCAweDAyOTUsIDB4MjAxNiwgMHgwMjlBLCAweDIwMTgsIDB4MDI5RSwgMHgyMDE5LCAweDAyOUYsCi0gICAgMHgyMDFBLCAweDAwNzgsIDB4MjAxQywgMHgwMkEwLCAweDIwMUQsIDB4MDJBMSwgMHgyMDFFLCAweDAwNzksCi0gICAgMHgyMDIwLCAweDAzMDgsIDB4MjAyMSwgMHgwMzA5LCAweDIwMjIsIDB4MDA3NywgMHgyMDI1LCAweDAyOUQsCi0gICAgMHgyMDI2LCAweDAyOUMsIDB4MjAzMCwgMHgwMzA0LCAweDIwMzIsIDB4MDJDNCwgMHgyMDMzLCAweDAyQzUsCi0gICAgMHgyMDM5LCAweDAwNkUsIDB4MjAzQSwgMHgwMDZGLCAweDIwM0IsIDB4MDJERSwgMHgyMDNDLCAweDJGNEYsCi0gICAgMHgyMDNFLCAweDAxNDUsIDB4MjA0NCwgMHgwMDY4LCAweDIwNDksIDB4MkY1MCwgMHgyMDcwLCAweDI0QTEsCi0gICAgMHgyMDc0LCAweDI0QTIsIDB4MjA3NSwgMHgyNEEzLCAweDIwNzYsIDB4MjRBNCwgMHgyMDc3LCAweDI0QTUsCi0gICAgMHgyMDc4LCAweDI0QTYsIDB4MjA3OSwgMHgyNEE3LCAweDIwODAsIDB4MjRBOCwgMHgyMDgxLCAweDI0QTksCi0gICAgMHgyMDgyLCAweDI0QUEsIDB4MjA4MywgMHgyNEFCLCAweDIwODQsIDB4MjRBQywgMHgyMDg1LCAweDI0QUQsCi0gICAgMHgyMDg2LCAweDI0QUUsIDB4MjA4NywgMHgyNEFGLCAweDIwODgsIDB4MjRCMCwgMHgyMDg5LCAweDI0QjEsCi0gICAgMHgyMEFDLCAweDI0OEEsIDB4MjBERCwgMHgwMzBCLCAweDIxMDAsIDB4MkU0RiwgMHgyMTAzLCAweDAyQzYsCi0gICAgMHgyMTA1LCAweDJFNTMsIDB4MjEwOSwgMHgyMDcxLCAweDIxMEEsIDB4MjA3MCwgMHgyMTBGLCAweDJGM0MsCi0gICAgMHgyMTEzLCAweDFGNTksIDB4MjExNiwgMHgxREJBLCAweDIxMjEsIDB4MUY3NywgMHgyMTIyLCAweDAwRTQsCi0gICAgMHgyMTI2LCAweDI0OEIsIDB4MjEyQiwgMHgwMzAzLCAweDIxMzUsIDB4MkYzOSwgMHgyMTUzLCAweDI0OUYsCi0gICAgMHgyMTU0LCAweDI0QTAsIDB4MjE1QiwgMHgyNDlCLCAweDIxNUMsIDB4MjQ5QywgMHgyMTVELCAweDI0OUQsCi0gICAgMHgyMTVFLCAweDI0OUUsIDB4MjE2MCwgMHgxRDk3LCAweDIxNjEsIDB4MUQ5OCwgMHgyMTYyLCAweDFEOTksCi0gICAgMHgyMTYzLCAweDFEOUEsIDB4MjE2NCwgMHgxRDlCLCAweDIxNjUsIDB4MUQ5QywgMHgyMTY2LCAweDFEOUQsCi0gICAgMHgyMTY3LCAweDFEOUUsIDB4MjE2OCwgMHgxRDlGLCAweDIxNjksIDB4MURBMCwgMHgyMTZBLCAweDIwMjEsCi0gICAgMHgyMTZCLCAweDIwMjIsIDB4MjE3MCwgMHgxRjlDLCAweDIxNzEsIDB4MUY5RCwgMHgyMTcyLCAweDFGOUUsCi0gICAgMHgyMTczLCAweDFGOUYsIDB4MjE3NCwgMHgxRkEwLCAweDIxNzUsIDB4MUZBMSwgMHgyMTc2LCAweDFGQTIsCi0gICAgMHgyMTc3LCAweDFGQTMsIDB4MjE3OCwgMHgxRkE0LCAweDIxNzksIDB4MUZBNSwgMHgyMTdBLCAweDIwNkEsCi0gICAgMHgyMTdCLCAweDIwNkIsIDB4MjE3RiwgMHgyMDZGLCAweDIxOTAsIDB4MDJFMSwgMHgyMTkxLCAweDAyRTIsCi0gICAgMHgyMTkyLCAweDAyRTAsIDB4MjE5MywgMHgwMkUzLCAweDIxOTQsIDB4MkZBOSwgMHgyMTk1LCAweDJGQjcsCi0gICAgMHgyMTk2LCAweDJGQUMsIDB4MjE5NywgMHgyRkFELCAweDIxOTgsIDB4MkZBQSwgMHgyMTk5LCAweDJGQUIsCi0gICAgMHgyMUM0LCAweDIwNzYsIDB4MjFDNSwgMHgyMDc3LCAweDIxQzYsIDB4MjA3NSwgMHgyMUNDLCAweDJGQUUsCi0gICAgMHgyMUQwLCAweDJGQTgsIDB4MjFEMiwgMHgwMkYwLCAweDIxRDQsIDB4MDJGMSwgMHgyMUU2LCAweDFGNEQsCi0gICAgMHgyMUU3LCAweDFGNEMsIDB4MjFFOCwgMHgxRjRFLCAweDIxRTksIDB4MUY0QiwgMHgyMjAwLCAweDAyRjIsCi0gICAgMHgyMjAyLCAweDAyRjcsIDB4MjIwMywgMHgwMkYzLCAweDIyMDUsIDB4MkY5OCwgMHgyMjA3LCAweDAyRjgsCi0gICAgMHgyMjA4LCAweDAyRTUsIDB4MjIwQSwgMHgyRjNCLCAweDIyMEIsIDB4MDJFNiwgMHgyMjExLCAweDFEQzksCi0gICAgMHgyMjEyLCAweDAyQjUsIDB4MjIxMywgMHgyRjU2LCAweDIyMUEsIDB4MDJGRCwgMHgyMjFELCAweDAyRkYsCi0gICAgMHgyMjFFLCAweDAyQkYsIDB4MjIxRiwgMHgxRENELCAweDIyMjAsIDB4MDJGNCwgMHgyMjI1LCAweDAyOUEsCi0gICAgMHgyMjI3LCAweDAyRUQsIDB4MjIyOCwgMHgwMkVFLCAweDIyMjksIDB4MDJFQywgMHgyMjJBLCAweDAyRUIsCi0gICAgMHgyMjJCLCAweDAzMDEsIDB4MjIyQywgMHgwMzAyLCAweDIyMkQsIDB4MjAwMywgMHgyMjJFLCAweDFEQzgsCi0gICAgMHgyMjM0LCAweDAyQzAsIDB4MjIzNSwgMHgwMzAwLCAweDIyM0MsIDB4MDI5OSwgMHgyMjNELCAweDAyRkUsCi0gICAgMHgyMjQzLCAweDJGNTgsIDB4MjI1MiwgMHgwMkZBLCAweDIyNjAsIDB4MDJCQSwgMHgyMjYxLCAweDAyRjksCi0gICAgMHgyMjY2LCAweDAyQkQsIDB4MjI2NywgMHgwMkJFLCAweDIyNkEsIDB4MDJGQiwgMHgyMjZCLCAweDAyRkMsCi0gICAgMHgyMjcyLCAweDJGNTksIDB4MjI3MywgMHgyRjVBLCAweDIyODIsIDB4MDJFOSwgMHgyMjgzLCAweDAyRUEsCi0gICAgMHgyMjg2LCAweDAyRTcsIDB4MjI4NywgMHgwMkU4LCAweDIyOTUsIDB4MkY5QywgMHgyMjk2LCAweDJGOUEsCi0gICAgMHgyMjk3LCAweDJGOUQsIDB4MjI5OCwgMHgyRjlCLCAweDIyOUQsIDB4MkY5QSwgMHgyMjlFLCAweDJGOUUsCi0gICAgMHgyMkEwLCAweDJGOTksIDB4MjJBNSwgMHgwMkY1LCAweDIyQkYsIDB4MURDRSwgMHgyMkVFLCAweDFFRDksCi0gICAgMHgyMkVGLCAweDAyOUMsIDB4MjMwMCwgMHgyRjk4LCAweDIzMDcsIDB4MkZCQiwgMHgyMzEyLCAweDAyRjYsCi0gICAgMHgyNDRBLCAweDJGNTQsIDB4MjQ2MCwgMHgxRDgzLCAweDI0NjEsIDB4MUQ4NCwgMHgyNDYyLCAweDFEODUsCi0gICAgMHgyNDYzLCAweDFEODYsIDB4MjQ2NCwgMHgxRDg3LCAweDI0NjUsIDB4MUQ4OCwgMHgyNDY2LCAweDFEODksCi0gICAgMHgyNDY3LCAweDFEOEEsIDB4MjQ2OCwgMHgxRDhCLCAweDI0NjksIDB4MUQ4QywgMHgyNDZBLCAweDFEOEQsCi0gICAgMHgyNDZCLCAweDFEOEUsIDB4MjQ2QywgMHgxRDhGLCAweDI0NkQsIDB4MUQ5MCwgMHgyNDZFLCAweDFEOTEsCi0gICAgMHgyNDZGLCAweDFEOTIsIDB4MjQ3MCwgMHgxRDkzLCAweDI0NzEsIDB4MUQ5NCwgMHgyNDcyLCAweDFEOTUsCi0gICAgMHgyNDczLCAweDFEOTYsIDB4MjQ3NCwgMHgxRjg3LCAweDI0NzUsIDB4MUY4OCwgMHgyNDc2LCAweDFGODksCi0gICAgMHgyNDc3LCAweDFGOEEsIDB4MjQ3OCwgMHgxRjhCLCAweDI0NzksIDB4MUY4QywgMHgyNDdBLCAweDFGOEQsCi0gICAgMHgyNDdCLCAweDFGOEUsIDB4MjQ3QywgMHgxRjhGLCAweDI0N0QsIDB4MUY5MCwgMHgyNDdFLCAweDFGOTEsCi0gICAgMHgyNDdGLCAweDFGOTIsIDB4MjQ4MCwgMHgxRjkzLCAweDI0ODEsIDB4MUY5NCwgMHgyNDgyLCAweDFGOTUsCi0gICAgMHgyNDgzLCAweDFGOTYsIDB4MjQ4NCwgMHgxRjk3LCAweDI0ODUsIDB4MUY5OCwgMHgyNDg2LCAweDFGOTksCi0gICAgMHgyNDg3LCAweDFGOUEsIDB4MjQ4OCwgMHgxRjdFLCAweDI0ODksIDB4MUY3RiwgMHgyNDhBLCAweDFGODAsCi0gICAgMHgyNDhCLCAweDFGODEsIDB4MjQ4QywgMHgxRjgyLCAweDI0OEQsIDB4MUY4MywgMHgyNDhFLCAweDFGODQsCi0gICAgMHgyNDhGLCAweDFGODUsIDB4MjQ5MCwgMHgxRjg2LCAweDI0OUMsIDB4MUZCMCwgMHgyNDlELCAweDFGQjEsCi0gICAgMHgyNDlFLCAweDFGQjIsIDB4MjQ5RiwgMHgxRkIzLCAweDI0QTAsIDB4MUZCNCwgMHgyNEExLCAweDFGQjUsCi0gICAgMHgyNEEyLCAweDFGQjYsIDB4MjRBMywgMHgxRkI3LCAweDI0QTQsIDB4MUZCOCwgMHgyNEE1LCAweDFGQjksCi0gICAgMHgyNEE2LCAweDFGQkEsIDB4MjRBNywgMHgxRkJCLCAweDI0QTgsIDB4MUZCQywgMHgyNEE5LCAweDFGQkQsCi0gICAgMHgyNEFBLCAweDFGQkUsIDB4MjRBQiwgMHgxRkJGLCAweDI0QUMsIDB4MUZDMCwgMHgyNEFELCAweDFGQzEsCi0gICAgMHgyNEFFLCAweDFGQzIsIDB4MjRBRiwgMHgxRkMzLCAweDI0QjAsIDB4MUZDNCwgMHgyNEIxLCAweDFGQzUsCi0gICAgMHgyNEIyLCAweDFGQzYsIDB4MjRCMywgMHgxRkM3LCAweDI0QjQsIDB4MUZDOCwgMHgyNEI1LCAweDFGQzksCi0gICAgMHgyNEI2LCAweDI4NjMsIDB4MjRCNywgMHgyODY0LCAweDI0QjgsIDB4Mjg2NSwgMHgyNEI5LCAweDI4NjYsCi0gICAgMHgyNEJBLCAweDI4NjcsIDB4MjRCQiwgMHgyODY4LCAweDI0QkMsIDB4Mjg2OSwgMHgyNEJELCAweDI4NkEsCi0gICAgMHgyNEJFLCAweDI4NkIsIDB4MjRCRiwgMHgyODZDLCAweDI0QzAsIDB4Mjg2RCwgMHgyNEMxLCAweDI4NkUsCi0gICAgMHgyNEMyLCAweDI4NkYsIDB4MjRDMywgMHgyODcwLCAweDI0QzQsIDB4Mjg3MSwgMHgyNEM1LCAweDI4NzIsCi0gICAgMHgyNEM2LCAweDI4NzMsIDB4MjRDNywgMHgyODc0LCAweDI0QzgsIDB4Mjg3NSwgMHgyNEM5LCAweDI4NzYsCi0gICAgMHgyNENBLCAweDI4NzcsIDB4MjRDQiwgMHgyODc4LCAweDI0Q0MsIDB4Mjg3OSwgMHgyNENELCAweDI4N0EsCi0gICAgMHgyNENFLCAweDI4N0IsIDB4MjRDRiwgMHgyODdDLCAweDI0RDAsIDB4Mjg0OSwgMHgyNEQxLCAweDI4NEEsCi0gICAgMHgyNEQyLCAweDI4NEIsIDB4MjREMywgMHgyODRDLCAweDI0RDQsIDB4Mjg0RCwgMHgyNEQ1LCAweDI4NEUsCi0gICAgMHgyNEQ2LCAweDI4NEYsIDB4MjRENywgMHgyODUwLCAweDI0RDgsIDB4Mjg1MSwgMHgyNEQ5LCAweDI4NTIsCi0gICAgMHgyNERBLCAweDI4NTMsIDB4MjREQiwgMHgyODU0LCAweDI0REMsIDB4Mjg1NSwgMHgyNERELCAweDI4NTYsCi0gICAgMHgyNERFLCAweDI4NTcsIDB4MjRERiwgMHgyODU4LCAweDI0RTAsIDB4Mjg1OSwgMHgyNEUxLCAweDI4NUEsCi0gICAgMHgyNEUyLCAweDI4NUIsIDB4MjRFMywgMHgyODVDLCAweDI0RTQsIDB4Mjg1RCwgMHgyNEU1LCAweDI4NUUsCi0gICAgMHgyNEU2LCAweDI4NUYsIDB4MjRFNywgMHgyODYwLCAweDI0RTgsIDB4Mjg2MSwgMHgyNEU5LCAweDI4NjIsCi0gICAgMHgyNEVBLCAweDIwMjAsIDB4MjUwMCwgMHgxRDM3LCAweDI1MDEsIDB4MUQzOCwgMHgyNTAyLCAweDFEMzksCi0gICAgMHgyNTAzLCAweDFEM0EsIDB4MjUwNCwgMHgxRDNCLCAweDI1MDUsIDB4MUQzQywgMHgyNTA2LCAweDFEM0QsCi0gICAgMHgyNTA3LCAweDFEM0UsIDB4MjUwOCwgMHgxRDNGLCAweDI1MDksIDB4MUQ0MCwgMHgyNTBBLCAweDFENDEsCi0gICAgMHgyNTBCLCAweDFENDIsIDB4MjUwQywgMHgxRDQzLCAweDI1MEQsIDB4MUQ0NCwgMHgyNTBFLCAweDFENDUsCi0gICAgMHgyNTBGLCAweDFENDYsIDB4MjUxMCwgMHgxRDQ3LCAweDI1MTEsIDB4MUQ0OCwgMHgyNTEyLCAweDFENDksCi0gICAgMHgyNTEzLCAweDFENEEsIDB4MjUxNCwgMHgxRDRCLCAweDI1MTUsIDB4MUQ0QywgMHgyNTE2LCAweDFENEQsCi0gICAgMHgyNTE3LCAweDFENEUsIDB4MjUxOCwgMHgxRDRGLCAweDI1MTksIDB4MUQ1MCwgMHgyNTFBLCAweDFENTEsCi0gICAgMHgyNTFCLCAweDFENTIsIDB4MjUxQywgMHgxRDUzLCAweDI1MUQsIDB4MUQ1NCwgMHgyNTFFLCAweDFENTUsCi0gICAgMHgyNTFGLCAweDFENTYsIDB4MjUyMCwgMHgxRDU3LCAweDI1MjEsIDB4MUQ1OCwgMHgyNTIyLCAweDFENTksCi0gICAgMHgyNTIzLCAweDFENUEsIDB4MjUyNCwgMHgxRDVCLCAweDI1MjUsIDB4MUQ1QywgMHgyNTI2LCAweDFENUQsCi0gICAgMHgyNTI3LCAweDFENUUsIDB4MjUyOCwgMHgxRDVGLCAweDI1MjksIDB4MUQ2MCwgMHgyNTJBLCAweDFENjEsCi0gICAgMHgyNTJCLCAweDFENjIsIDB4MjUyQywgMHgxRDYzLCAweDI1MkQsIDB4MUQ2NCwgMHgyNTJFLCAweDFENjUsCi0gICAgMHgyNTJGLCAweDFENjYsIDB4MjUzMCwgMHgxRDY3LCAweDI1MzEsIDB4MUQ2OCwgMHgyNTMyLCAweDFENjksCi0gICAgMHgyNTMzLCAweDFENkEsIDB4MjUzNCwgMHgxRDZCLCAweDI1MzUsIDB4MUQ2QywgMHgyNTM2LCAweDFENkQsCi0gICAgMHgyNTM3LCAweDFENkUsIDB4MjUzOCwgMHgxRDZGLCAweDI1MzksIDB4MUQ3MCwgMHgyNTNBLCAweDFENzEsCi0gICAgMHgyNTNCLCAweDFENzIsIDB4MjUzQywgMHgxRDczLCAweDI1M0QsIDB4MUQ3NCwgMHgyNTNFLCAweDFENzUsCi0gICAgMHgyNTNGLCAweDFENzYsIDB4MjU0MCwgMHgxRDc3LCAweDI1NDEsIDB4MUQ3OCwgMHgyNTQyLCAweDFENzksCi0gICAgMHgyNTQzLCAweDFEN0EsIDB4MjU0NCwgMHgxRDdCLCAweDI1NDUsIDB4MUQ3QywgMHgyNTQ2LCAweDFEN0QsCi0gICAgMHgyNTQ3LCAweDFEN0UsIDB4MjU0OCwgMHgxRDdGLCAweDI1NDksIDB4MUQ4MCwgMHgyNTRBLCAweDFEODEsCi0gICAgMHgyNTRCLCAweDFEODIsIDB4MjU1MCwgMHgyMDNCLCAweDI1NUUsIDB4MjAzQywgMHgyNTYxLCAweDIwM0UsCi0gICAgMHgyNTZBLCAweDIwM0QsIDB4MjU2RCwgMHgyMDM3LCAweDI1NkUsIDB4MjAzOCwgMHgyNTZGLCAweDIwM0EsCi0gICAgMHgyNTcwLCAweDIwMzksIDB4MjU3MSwgMHgyMDQ1LCAweDI1NzIsIDB4MjA0NiwgMHgyNTczLCAweDIwNDcsCi0gICAgMHgyNTgxLCAweDIwMjYsIDB4MjU4MiwgMHgyMDI3LCAweDI1ODMsIDB4MjAyOCwgMHgyNTg0LCAweDIwMjksCi0gICAgMHgyNTg1LCAweDIwMkEsIDB4MjU4NiwgMHgyMDJCLCAweDI1ODcsIDB4MjAyQywgMHgyNTg4LCAweDIwMkQsCi0gICAgMHgyNTg5LCAweDIwMzQsIDB4MjU4QSwgMHgyMDMzLCAweDI1OEIsIDB4MjAzMiwgMHgyNThDLCAweDIwMzEsCi0gICAgMHgyNThELCAweDIwMzAsIDB4MjU4RSwgMHgyMDJGLCAweDI1OEYsIDB4MjAyRSwgMHgyNTk0LCAweDIwMzUsCi0gICAgMHgyNTk1LCAweDIwMzYsIDB4MjVBMCwgMHgwMkQ5LCAweDI1QTEsIDB4MDJEOCwgMHgyNUEyLCAweDFGNEYsCi0gICAgMHgyNUFBLCAweDJGQ0YsIDB4MjVBQiwgMHgyRkNELCAweDI1QjIsIDB4MDJEQiwgMHgyNUIzLCAweDAyREEsCi0gICAgMHgyNUI2LCAweDJGQTMsIDB4MjVCNywgMHgxRjRBLCAweDI1QkMsIDB4MDJERCwgMHgyNUJELCAweDAyREMsCi0gICAgMHgyNUMwLCAweDJGQTIsIDB4MjVDMSwgMHgxRjQ5LCAweDI1QzYsIDB4MDJENywgMHgyNUM3LCAweDAyRDYsCi0gICAgMHgyNUM5LCAweDIwMTIsIDB4MjVDQiwgMHgwMkQzLCAweDI1Q0MsIDB4MjkwNiwgMHgyNUNFLCAweDAyRDUsCi0gICAgMHgyNUNGLCAweDAyRDQsIDB4MjVFMiwgMHgyMDNGLCAweDI1RTMsIDB4MjA0MCwgMHgyNUU0LCAweDIwNDIsCi0gICAgMHgyNUU1LCAweDIwNDEsIDB4MjVFNiwgMHgyRkRFLCAweDI1RUYsIDB4MDMwQiwgMHgyNjAwLCAweDIwMTcsCi0gICAgMHgyNjAxLCAweDIwMTgsIDB4MjYwMiwgMHgyMDE5LCAweDI2MDMsIDB4MjAxQSwgMHgyNjA1LCAweDAyRDIsCi0gICAgMHgyNjA2LCAweDAyRDEsIDB4MjYwRSwgMHgxRjc4LCAweDI2MTIsIDB4MkY5OSwgMHgyNjFDLCAweDIwMUMsCi0gICAgMHgyNjFELCAweDIwMUQsIDB4MjYxRSwgMHgyMDFCLCAweDI2MUYsIDB4MjAxRSwgMHgyNjQwLCAweDAyQzIsCi0gICAgMHgyNjQyLCAweDAyQzEsIDB4MjY2MCwgMHgyMDEzLCAweDI2NjEsIDB4MUY1MSwgMHgyNjYyLCAweDFGNTMsCi0gICAgMHgyNjYzLCAweDIwMTUsIDB4MjY2NCwgMHgxRjUyLCAweDI2NjUsIDB4MjAxNCwgMHgyNjY2LCAweDIwMTYsCi0gICAgMHgyNjY3LCAweDFGNTAsIDB4MjY2OCwgMHgyRjQyLCAweDI2NjksIDB4MkY0MywgMHgyNjZBLCAweDAzMDcsCi0gICAgMHgyNjZDLCAweDJGNDQsIDB4MjY2RCwgMHgwMzA2LCAweDI2NkYsIDB4MDMwNSwgMHgyNzAyLCAweDJGOTAsCi0gICAgMHgyNzFBLCAweDJGRDEsIDB4Mjc1NiwgMHgyRkUzLCAweDI3NzYsIDB4MjA1RSwgMHgyNzc3LCAweDIwNUYsCi0gICAgMHgyNzc4LCAweDIwNjAsIDB4Mjc3OSwgMHgyMDYxLCAweDI3N0EsIDB4MjA2MiwgMHgyNzdCLCAweDIwNjMsCi0gICAgMHgyNzdDLCAweDIwNjQsIDB4Mjc3RCwgMHgyMDY1LCAweDI3N0UsIDB4MjA2NiwgMHgyN0ExLCAweDIwMEUsCi0gICAgMHgyRTgzLCAweDM3RTEsIDB4MkU4NSwgMHgzNjIwLCAweDJFODcsIDB4MzcxOSwgMHgyRTg5LCAweDM4MTQsCi0gICAgMHgyRThCLCAweDM3MUUsIDB4MkU4QywgMHgzNjA5LCAweDJFOEQsIDB4MzYwQSwgMHgyRThFLCAweDEwNzEsCi0gICAgMHgyRThGLCAweDM4OEMsIDB4MkU5MCwgMHgxMjI2LCAweDJFOTIsIDB4MEVCMiwgMHgyRTkzLCAweDEyODMsCi0gICAgMHgyRTk0LCAweDEyQUIsIDB4MkU5NSwgMHgzQzFGLCAweDJFOTYsIDB4MzhDMiwgMHgyRTk3LCAweDM2MUMsCi0gICAgMHgyRTk4LCAweDM4RTEsIDB4MkU5OSwgMHgxM0MzLCAweDJFOUIsIDB4MTNFMSwgMHgyRTlGLCAweDBFM0MsCi0gICAgMHgyRUEwLCAweDBFQkQsIDB4MkVBMSwgMHgzOTYxLCAweDJFQTIsIDB4Mzk2MiwgMHgyRUEzLCAweDM5OUQsCi0gICAgMHgyRUE0LCAweDNDMjYsIDB4MkVBNiwgMHgzNzRELCAweDJFQTgsIDB4MzlCQywgMHgyRUE5LCAweDM1QTEsCi0gICAgMHgyRUFBLCAweDM2QUIsIDB4MkVBQiwgMHgzQTk3LCAweDJFQUMsIDB4MDhENCwgMHgyRUFELCAweDNBMzksCi0gICAgMHgyRUFFLCAweDM2NjIsIDB4MkVCMSwgMHgzQTk4LCAweDJFQjIsIDB4M0E5NywgMHgyRUIzLCAweDM3NkQsCi0gICAgMHgyRUI3LCAweDM2RkUsIDB4MkVCOSwgMHgzNzEzLCAweDJFQkMsIDB4MzVCMywgMHgyRUJELCAweDM1NEUsCi0gICAgMHgyRUJFLCAweDM3NzUsIDB4MkVCRiwgMHgzNzc2LCAweDJFQzAsIDB4Mzc3NywgMHgyRUMxLCAweDA3OEIsCi0gICAgMHgyRUMyLCAweDNCMEEsIDB4MkVDMywgMHgzNjJFLCAweDJFQzQsIDB4MEE2MiwgMHgyRUM2LCAweDM1NzIsCi0gICAgMHgyRUNBLCAweDM2NEEsIDB4MkVDQywgMHgzQzJCLCAweDJFQ0QsIDB4M0I1MCwgMHgyRUNGLCAweDNCOUUsCi0gICAgMHgyRUQxLCAweDBCRDUsIDB4MkVEMiwgMHgzQjk3LCAweDJFRDYsIDB4M0I5RSwgMHgyRUQ3LCAweDM1NEQsCi0gICAgMHgyRUQ4LCAweDBBNjgsIDB4MkVERCwgMHgzNjE3LCAweDJFREUsIDB4MzYxOSwgMHgyRURGLCAweDM2MTgsCi0gICAgMHgyRUU0LCAweDA2NEUsIDB4MkVFOCwgMHgwRDM0LCAweDJFRTksIDB4MDUyQiwgMHgyRUVCLCAweDBBNkEsCi0gICAgMHgyRUVELCAweDA4QzMsIDB4MkVFRiwgMHgwRjdELCAweDJFRjIsIDB4MDY0RiwgMHgyRjAwLCAweDA0QjAsCi0gICAgMHgyRjAxLCAweDIwQjMsIDB4MkYwMiwgMHgwRkZGLCAweDJGMDMsIDB4MTAwMSwgMHgyRjA0LCAweDA1MzUsCi0gICAgMHgyRjA1LCAweDEwMDYsIDB4MkYwNiwgMHgwQ0NCLCAweDJGMDcsIDB4MTAwRSwgMHgyRjA4LCAweDBBMTMsCi0gICAgMHgyRjA5LCAweDEwNzAsIDB4MkYwQSwgMHgwQ0Q2LCAweDJGMEIsIDB4MEQ0MCwgMHgyRjBDLCAweDEwN0IsCi0gICAgMHgyRjBELCAweDEwODMsIDB4MkYwRSwgMHgxMDg5LCAweDJGMEYsIDB4MTA5MywgMHgyRjEwLCAweDEwOTgsCi0gICAgMHgyRjExLCAweDBDNUIsIDB4MkYxMiwgMHgwRjk3LCAweDJGMTMsIDB4MTBDNiwgMHgyRjE0LCAweDEwQ0QsCi0gICAgMHgyRjE1LCAweDEwQ0UsIDB4MkYxNiwgMHgxMEQzLCAweDJGMTcsIDB4MDk0NywgMHgyRjE4LCAweDBFN0MsCi0gICAgMHgyRjE5LCAweDEwREMsIDB4MkYxQSwgMHgxMEUxLCAweDJGMUIsIDB4MTBFOCwgMHgyRjFDLCAweDBFQTIsCi0gICAgMHgyRjFELCAweDA3QjEsIDB4MkYxRSwgMHgxMTZCLCAweDJGMUYsIDB4MEM1NCwgMHgyRjIwLCAweDA4OUMsCi0gICAgMHgyRjIxLCAweDExQkEsIDB4MkYyMiwgMHgxMUJCLCAweDJGMjMsIDB4MEYyNiwgMHgyRjI0LCAweDBCNDcsCi0gICAgMHgyRjI1LCAweDA5ODEsIDB4MkYyNiwgMHgwOEEwLCAweDJGMjcsIDB4MTIwRSwgMHgyRjI4LCAweDBBNDcsCi0gICAgMHgyRjI5LCAweDA5OTYsIDB4MkYyQSwgMHgxMjI2LCAweDJGMkIsIDB4MTIyOCwgMHgyRjJDLCAweDEyMzIsCi0gICAgMHgyRjJELCAweDA4ODEsIDB4MkYyRSwgMHgxMjZDLCAweDJGMkYsIDB4MDdCQiwgMHgyRjMwLCAweDA3N0UsCi0gICAgMHgyRjMxLCAweDA2Q0EsIDB4MkYzMiwgMHgwNUVGLCAweDJGMzMsIDB4MTI4MywgMHgyRjM0LCAweDEyODUsCi0gICAgMHgyRjM1LCAweDEyOTksIDB4MkYzNiwgMHgxMjlCLCAweDJGMzcsIDB4MTJBMCwgMHgyRjM4LCAweDA2NzcsCi0gICAgMHgyRjM5LCAweDM4QjksIDB4MkYzQSwgMHgxMkFGLCAweDJGM0IsIDB4MTJCMSwgMHgyRjNDLCAweDA5RkEsCi0gICAgMHgyRjNELCAweDEzNDIsIDB4MkYzRSwgMHgwNzgxLCAweDJGM0YsIDB4MDkxNiwgMHgyRjQwLCAweDA4QTcsCi0gICAgMHgyRjQxLCAweDEzQzIsIDB4MkY0MiwgMHgwRTA4LCAweDJGNDMsIDB4MEM0NywgMHgyRjQ0LCAweDA2Q0MsCi0gICAgMHgyRjQ1LCAweDBFNEQsIDB4MkY0NiwgMHgxM0UwLCAweDJGNDcsIDB4MENENCwgMHgyRjQ4LCAweDE0MEMsCi0gICAgMHgyRjQ5LCAweDA3NDQsIDB4MkY0QSwgMHgwRUU2LCAweDJGNEIsIDB4MDczRCwgMHgyRjRDLCAweDA4QUQsCi0gICAgMHgyRjRELCAweDE0RTUsIDB4MkY0RSwgMHgxNEY0LCAweDJGNEYsIDB4MTRGOCwgMHgyRjUwLCAweDBEN0EsCi0gICAgMHgyRjUxLCAweDBFREYsIDB4MkY1MiwgMHgwOEFGLCAweDJGNTMsIDB4MTUwMiwgMHgyRjU0LCAweDBBMkIsCi0gICAgMHgyRjU1LCAweDA1NTAsIDB4MkY1NiwgMHgwQkZBLCAweDJGNTcsIDB4MERENSwgMHgyRjU4LCAweDE1RTQsCi0gICAgMHgyRjU5LCAweDE1RTYsIDB4MkY1QSwgMHgwRTIyLCAweDJGNUIsIDB4MDU2NywgMHgyRjVDLCAweDA2ODcsCi0gICAgMHgyRjVELCAweDA3NTgsIDB4MkY1RSwgMHgwNzcwLCAweDJGNUYsIDB4MDZDNCwgMHgyRjYwLCAweDA0REQsCi0gICAgMHgyRjYxLCAweDA1RTAsIDB4MkY2MiwgMHgwNjAxLCAweDJGNjMsIDB4MEE1QywgMHgyRjY0LCAweDBGM0IsCi0gICAgMHgyRjY1LCAweDBDM0UsIDB4MkY2NiwgMHgwRDk3LCAweDJGNjcsIDB4M0EwMCwgMHgyRjY4LCAweDE2OTcsCi0gICAgMHgyRjY5LCAweDBEMjgsIDB4MkY2QSwgMHgwRDdELCAweDJGNkIsIDB4MDg3QywgMHgyRjZDLCAweDBFRTgsCi0gICAgMHgyRjZELCAweDBFQzMsIDB4MkY2RSwgMHgwRUZDLCAweDJGNkYsIDB4MEE3NCwgMHgyRjcwLCAweDA4RDQsCi0gICAgMHgyRjcxLCAweDNBNDEsIDB4MkY3MiwgMHgwNTUzLCAweDJGNzMsIDB4MDc0MCwgMHgyRjc0LCAweDBGNzEsCi0gICAgMHgyRjc1LCAweDBCOUIsIDB4MkY3NiwgMHgwRTE2LCAweDJGNzcsIDB4MDhCMywgMHgyRjc4LCAweDA2MDgsCi0gICAgMHgyRjc5LCAweDE4MTMsIDB4MkY3QSwgMHgwRjNELCAweDJGN0IsIDB4MDRDQiwgMHgyRjdDLCAweDBGREQsCi0gICAgMHgyRjdELCAweDA4RDUsIDB4MkY3RSwgMHgxODNELCAweDJGN0YsIDB4MDhENiwgMHgyRjgwLCAweDE4NTMsCi0gICAgMHgyRjgxLCAweDBDRDEsIDB4MkY4MiwgMHgwQTA5LCAweDJGODMsIDB4MDhENywgMHgyRjg0LCAweDA4QjgsCi0gICAgMHgyRjg1LCAweDA0RDMsIDB4MkY4NiwgMHgwQTg5LCAweDJGODcsIDB4MEFBNiwgMHgyRjg4LCAweDA5MzgsCi0gICAgMHgyRjg5LCAweDA4MjEsIDB4MkY4QSwgMHgwOUVELCAweDJGOEIsIDB4MThCMiwgMHgyRjhDLCAweDE5NEYsCi0gICAgMHgyRjhELCAweDBCQUMsIDB4MkY4RSwgMHgwNzQyLCAweDJGOEYsIDB4MDdFNiwgMHgyRjkwLCAweDA0QTUsCi0gICAgMHgyRjkxLCAweDE5RUIsIDB4MkY5MiwgMHgwNzVGLCAweDJGOTMsIDB4MDVBRiwgMHgyRjk0LCAweDA3NzQsCi0gICAgMHgyRjk1LCAweDBCNjksIDB4MkY5NiwgMHgwQzdFLCAweDJGOTcsIDB4MUE1NiwgMHgyRjk4LCAweDFBNTksCi0gICAgMHgyRjk5LCAweDA1OEIsIDB4MkY5QSwgMHgwQTdBLCAweDJGOUIsIDB4MEFGOCwgMHgyRjlDLCAweDBCMEQsCi0gICAgMHgyRjlELCAweDBBMEUsIDB4MkY5RSwgMHgwOTAyLCAweDJGOUYsIDB4MEEwRiwgMHgyRkEwLCAweDBCNjIsCi0gICAgMHgyRkExLCAweDNCNEYsIDB4MkZBMiwgMHgwRjIyLCAweDJGQTMsIDB4MENBQiwgMHgyRkE0LCAweDBENjQsCi0gICAgMHgyRkE1LCAweDBGNkMsIDB4MkZBNiwgMHgwNkRBLCAweDJGQTcsIDB4MEJENSwgMHgyRkE4LCAweDBFRjMsCi0gICAgMHgyRkE5LCAweDBEREUsIDB4MkZBQSwgMHgxQkM5LCAweDJGQUIsIDB4MUJDQiwgMHgyRkFDLCAweDA0Q0QsCi0gICAgMHgyRkFELCAweDIxRjcsIDB4MkZBRSwgMHgwRDg3LCAweDJGQUYsIDB4MEVEOCwgMHgyRkIwLCAweDA1QjUsCi0gICAgMHgyRkIxLCAweDFDMDMsIDB4MkZCMiwgMHgxQzA1LCAweDJGQjMsIDB4MDUzQiwgMHgyRkI0LCAweDBFMTcsCi0gICAgMHgyRkI1LCAweDBERTksIDB4MkZCNiwgMHgwRDg4LCAweDJGQjcsIDB4MDlFRiwgMHgyRkI4LCAweDA5MUYsCi0gICAgMHgyRkI5LCAweDA3RjMsIDB4MkZCQSwgMHgwRDA1LCAweDJGQkIsIDB4MDgwRSwgMHgyRkJDLCAweDA3RjQsCi0gICAgMHgyRkJELCAweDFDNkMsIDB4MkZCRSwgMHgxQzdELCAweDJGQkYsIDB4MUM4MywgMHgyRkMwLCAweDFDODQsCi0gICAgMHgyRkMxLCAweDA2NEUsIDB4MkZDMiwgMHgwNjk1LCAweDJGQzMsIDB4MEJENywgMHgyRkM0LCAweDFDRjYsCi0gICAgMHgyRkM1LCAweDA4REIsIDB4MkZDNiwgMHgxRDAxLCAweDJGQzcsIDB4MEU5MSwgMHgyRkM4LCAweDM0MEIsCi0gICAgMHgyRkM5LCAweDA2NkEsIDB4MkZDQSwgMHgwODA3LCAweDJGQ0IsIDB4MUQxNiwgMHgyRkNDLCAweDFEMTksCi0gICAgMHgyRkNELCAweDBDMUUsIDB4MkZDRSwgMHgwNzkxLCAweDJGQ0YsIDB4MEFDRiwgMHgyRkQwLCAweDBEOTMsCi0gICAgMHgyRkQxLCAweDFEMjEsIDB4MkZEMiwgMHgxRDIyLCAweDJGRDMsIDB4MEY3RSwgMHgyRkQ0LCAweDFEMzAsCi0gICAgMHgyRkQ1LCAweDFEMzEsIDB4MzAwMCwgMHgwMjc5LCAweDMwMDEsIDB4MDI3QSwgMHgzMDAyLCAweDAyN0IsCi0gICAgMHgzMDAzLCAweDAyOEYsIDB4MzAwNCwgMHgyMDc0LCAweDMwMDUsIDB4MDI5MSwgMHgzMDA2LCAweDAyOTIsCi0gICAgMHgzMDA3LCAweDAyOTMsIDB4MzAwOCwgMHgwMkFBLCAweDMwMDksIDB4MDJBQiwgMHgzMDBBLCAweDAyQUMsCi0gICAgMHgzMDBCLCAweDAyQUQsIDB4MzAwQywgMHgwMkFFLCAweDMwMEQsIDB4MDJBRiwgMHgzMDBFLCAweDAyQjAsCi0gICAgMHgzMDBGLCAweDAyQjEsIDB4MzAxMCwgMHgwMkIyLCAweDMwMTEsIDB4MDJCMywgMHgzMDEyLCAweDAyREYsCi0gICAgMHgzMDEzLCAweDAyRTQsIDB4MzAxNCwgMHgwMkE0LCAweDMwMTUsIDB4MDJBNSwgMHgzMDFDLCAweDAyOTksCi0gICAgMHgzMDFELCAweDFEQjgsIDB4MzAxRiwgMHgxREI5LCAweDMwMjAsIDB4MUY3QSwgMHgzMDMwLCAweDJGQkEsCi0gICAgMHgzMDMzLCAweDJGNEMsIDB4MzAzNCwgMHgyRjRELCAweDMwMzUsIDB4MkY0RSwgMHgzMDM2LCAweDFGNzksCi0gICAgMHgzMDQxLCAweDAzNEEsIDB4MzA0MiwgMHgwMzRCLCAweDMwNDMsIDB4MDM0QywgMHgzMDQ0LCAweDAzNEQsCi0gICAgMHgzMDQ1LCAweDAzNEUsIDB4MzA0NiwgMHgwMzRGLCAweDMwNDcsIDB4MDM1MCwgMHgzMDQ4LCAweDAzNTEsCi0gICAgMHgzMDQ5LCAweDAzNTIsIDB4MzA0QSwgMHgwMzUzLCAweDMwNEIsIDB4MDM1NCwgMHgzMDRDLCAweDAzNTUsCi0gICAgMHgzMDRELCAweDAzNTYsIDB4MzA0RSwgMHgwMzU3LCAweDMwNEYsIDB4MDM1OCwgMHgzMDUwLCAweDAzNTksCi0gICAgMHgzMDUxLCAweDAzNUEsIDB4MzA1MiwgMHgwMzVCLCAweDMwNTMsIDB4MDM1QywgMHgzMDU0LCAweDAzNUQsCi0gICAgMHgzMDU1LCAweDAzNUUsIDB4MzA1NiwgMHgwMzVGLCAweDMwNTcsIDB4MDM2MCwgMHgzMDU4LCAweDAzNjEsCi0gICAgMHgzMDU5LCAweDAzNjIsIDB4MzA1QSwgMHgwMzYzLCAweDMwNUIsIDB4MDM2NCwgMHgzMDVDLCAweDAzNjUsCi0gICAgMHgzMDVELCAweDAzNjYsIDB4MzA1RSwgMHgwMzY3LCAweDMwNUYsIDB4MDM2OCwgMHgzMDYwLCAweDAzNjksCi0gICAgMHgzMDYxLCAweDAzNkEsIDB4MzA2MiwgMHgwMzZCLCAweDMwNjMsIDB4MDM2QywgMHgzMDY0LCAweDAzNkQsCi0gICAgMHgzMDY1LCAweDAzNkUsIDB4MzA2NiwgMHgwMzZGLCAweDMwNjcsIDB4MDM3MCwgMHgzMDY4LCAweDAzNzEsCi0gICAgMHgzMDY5LCAweDAzNzIsIDB4MzA2QSwgMHgwMzczLCAweDMwNkIsIDB4MDM3NCwgMHgzMDZDLCAweDAzNzUsCi0gICAgMHgzMDZELCAweDAzNzYsIDB4MzA2RSwgMHgwMzc3LCAweDMwNkYsIDB4MDM3OCwgMHgzMDcwLCAweDAzNzksCi0gICAgMHgzMDcxLCAweDAzN0EsIDB4MzA3MiwgMHgwMzdCLCAweDMwNzMsIDB4MDM3QywgMHgzMDc0LCAweDAzN0QsCi0gICAgMHgzMDc1LCAweDAzN0UsIDB4MzA3NiwgMHgwMzdGLCAweDMwNzcsIDB4MDM4MCwgMHgzMDc4LCAweDAzODEsCi0gICAgMHgzMDc5LCAweDAzODIsIDB4MzA3QSwgMHgwMzgzLCAweDMwN0IsIDB4MDM4NCwgMHgzMDdDLCAweDAzODUsCi0gICAgMHgzMDdELCAweDAzODYsIDB4MzA3RSwgMHgwMzg3LCAweDMwN0YsIDB4MDM4OCwgMHgzMDgwLCAweDAzODksCi0gICAgMHgzMDgxLCAweDAzOEEsIDB4MzA4MiwgMHgwMzhCLCAweDMwODMsIDB4MDM4QywgMHgzMDg0LCAweDAzOEQsCi0gICAgMHgzMDg1LCAweDAzOEUsIDB4MzA4NiwgMHgwMzhGLCAweDMwODcsIDB4MDM5MCwgMHgzMDg4LCAweDAzOTEsCi0gICAgMHgzMDg5LCAweDAzOTIsIDB4MzA4QSwgMHgwMzkzLCAweDMwOEIsIDB4MDM5NCwgMHgzMDhDLCAweDAzOTUsCi0gICAgMHgzMDhELCAweDAzOTYsIDB4MzA4RSwgMHgwMzk3LCAweDMwOEYsIDB4MDM5OCwgMHgzMDkwLCAweDAzOTksCi0gICAgMHgzMDkxLCAweDAzOUEsIDB4MzA5MiwgMHgwMzlCLCAweDMwOTMsIDB4MDM5QywgMHgzMDk0LCAweDFGMTYsCi0gICAgMHgzMDlCLCAweDAyODMsIDB4MzA5QywgMHgwMjg0LCAweDMwOUQsIDB4MDI4RCwgMHgzMDlFLCAweDAyOEUsCi0gICAgMHgzMEExLCAweDAzOUQsIDB4MzBBMiwgMHgwMzlFLCAweDMwQTMsIDB4MDM5RiwgMHgzMEE0LCAweDAzQTAsCi0gICAgMHgzMEE1LCAweDAzQTEsIDB4MzBBNiwgMHgwM0EyLCAweDMwQTcsIDB4MDNBMywgMHgzMEE4LCAweDAzQTQsCi0gICAgMHgzMEE5LCAweDAzQTUsIDB4MzBBQSwgMHgwM0E2LCAweDMwQUIsIDB4MDNBNywgMHgzMEFDLCAweDAzQTgsCi0gICAgMHgzMEFELCAweDAzQTksIDB4MzBBRSwgMHgwM0FBLCAweDMwQUYsIDB4MDNBQiwgMHgzMEIwLCAweDAzQUMsCi0gICAgMHgzMEIxLCAweDAzQUQsIDB4MzBCMiwgMHgwM0FFLCAweDMwQjMsIDB4MDNBRiwgMHgzMEI0LCAweDAzQjAsCi0gICAgMHgzMEI1LCAweDAzQjEsIDB4MzBCNiwgMHgwM0IyLCAweDMwQjcsIDB4MDNCMywgMHgzMEI4LCAweDAzQjQsCi0gICAgMHgzMEI5LCAweDAzQjUsIDB4MzBCQSwgMHgwM0I2LCAweDMwQkIsIDB4MDNCNywgMHgzMEJDLCAweDAzQjgsCi0gICAgMHgzMEJELCAweDAzQjksIDB4MzBCRSwgMHgwM0JBLCAweDMwQkYsIDB4MDNCQiwgMHgzMEMwLCAweDAzQkMsCi0gICAgMHgzMEMxLCAweDAzQkQsIDB4MzBDMiwgMHgwM0JFLCAweDMwQzMsIDB4MDNCRiwgMHgzMEM0LCAweDAzQzAsCi0gICAgMHgzMEM1LCAweDAzQzEsIDB4MzBDNiwgMHgwM0MyLCAweDMwQzcsIDB4MDNDMywgMHgzMEM4LCAweDAzQzQsCi0gICAgMHgzMEM5LCAweDAzQzUsIDB4MzBDQSwgMHgwM0M2LCAweDMwQ0IsIDB4MDNDNywgMHgzMENDLCAweDAzQzgsCi0gICAgMHgzMENELCAweDAzQzksIDB4MzBDRSwgMHgwM0NBLCAweDMwQ0YsIDB4MDNDQiwgMHgzMEQwLCAweDAzQ0MsCi0gICAgMHgzMEQxLCAweDAzQ0QsIDB4MzBEMiwgMHgwM0NFLCAweDMwRDMsIDB4MDNDRiwgMHgzMEQ0LCAweDAzRDAsCi0gICAgMHgzMEQ1LCAweDAzRDEsIDB4MzBENiwgMHgwM0QyLCAweDMwRDcsIDB4MDNEMywgMHgzMEQ4LCAweDAzRDQsCi0gICAgMHgzMEQ5LCAweDAzRDUsIDB4MzBEQSwgMHgwM0Q2LCAweDMwREIsIDB4MDNENywgMHgzMERDLCAweDAzRDgsCi0gICAgMHgzMERELCAweDAzRDksIDB4MzBERSwgMHgwM0RBLCAweDMwREYsIDB4MDNEQiwgMHgzMEUwLCAweDAzREMsCi0gICAgMHgzMEUxLCAweDAzREQsIDB4MzBFMiwgMHgwM0RFLCAweDMwRTMsIDB4MDNERiwgMHgzMEU0LCAweDAzRTAsCi0gICAgMHgzMEU1LCAweDAzRTEsIDB4MzBFNiwgMHgwM0UyLCAweDMwRTcsIDB4MDNFMywgMHgzMEU4LCAweDAzRTQsCi0gICAgMHgzMEU5LCAweDAzRTUsIDB4MzBFQSwgMHgwM0U2LCAweDMwRUIsIDB4MDNFNywgMHgzMEVDLCAweDAzRTgsCi0gICAgMHgzMEVELCAweDAzRTksIDB4MzBFRSwgMHgwM0VBLCAweDMwRUYsIDB4MDNFQiwgMHgzMEYwLCAweDAzRUMsCi0gICAgMHgzMEYxLCAweDAzRUQsIDB4MzBGMiwgMHgwM0VFLCAweDMwRjMsIDB4MDNFRiwgMHgzMEY0LCAweDAzRjAsCi0gICAgMHgzMEY1LCAweDAzRjEsIDB4MzBGNiwgMHgwM0YyLCAweDMwRjcsIDB4MjA3OSwgMHgzMEY4LCAweDIwN0EsCi0gICAgMHgzMEY5LCAweDIwN0IsIDB4MzBGQSwgMHgyMDdDLCAweDMwRkIsIDB4MDI3RSwgMHgzMEZDLCAweDAyOTQsCi0gICAgMHgzMEZELCAweDAyOEIsIDB4MzBGRSwgMHgwMjhDLCAweDMyMjAsIDB4Mjc4RSwgMHgzMjIxLCAweDI3OEYsCi0gICAgMHgzMjIyLCAweDI3OTAsIDB4MzIyMywgMHgyNzkxLCAweDMyMjQsIDB4Mjc5MiwgMHgzMjI1LCAweDI3OTMsCi0gICAgMHgzMjI2LCAweDI3OTQsIDB4MzIyNywgMHgyNzk1LCAweDMyMjgsIDB4Mjc5NiwgMHgzMjI5LCAweDI3OTcsCi0gICAgMHgzMjJBLCAweDIwMDYsIDB4MzIyQiwgMHgyMDA3LCAweDMyMkMsIDB4MjAwOCwgMHgzMjJELCAweDIwMDksCi0gICAgMHgzMjJFLCAweDIwMEEsIDB4MzIyRiwgMHgyMDBCLCAweDMyMzAsIDB4MjAwNSwgMHgzMjMxLCAweDFEQzIsCi0gICAgMHgzMjMyLCAweDFEQzMsIDB4MzIzMywgMHgxRkNGLCAweDMyMzQsIDB4MUZDRCwgMHgzMjM1LCAweDFGRDQsCi0gICAgMHgzMjM2LCAweDFGRDMsIDB4MzIzNywgMHgyMDBDLCAweDMyMzgsIDB4MUZDRSwgMHgzMjM5LCAweDFEQzQsCi0gICAgMHgzMjNBLCAweDFGRDcsIDB4MzIzQiwgMHgxRkQ1LCAweDMyM0MsIDB4MUZEMCwgMHgzMjNELCAweDFGQ0IsCi0gICAgMHgzMjNFLCAweDFGRDIsIDB4MzIzRiwgMHgxRkNDLCAweDMyNDAsIDB4MUZENiwgMHgzMjQxLCAweDIwMEQsCi0gICAgMHgzMjQyLCAweDFGRDEsIDB4MzI0MywgMHgxRkNBLCAweDMyODAsIDB4MjhERCwgMHgzMjgxLCAweDI4REUsCi0gICAgMHgzMjgyLCAweDI4REYsIDB4MzI4MywgMHgyOEUwLCAweDMyODQsIDB4MjhFMSwgMHgzMjg1LCAweDI4RTIsCi0gICAgMHgzMjg2LCAweDI4RTMsIDB4MzI4NywgMHgyOEU0LCAweDMyODgsIDB4MjhFNSwgMHgzMjg5LCAweDI4RTYsCi0gICAgMHgzMjhBLCAweDI4RTgsIDB4MzI4QiwgMHgyOEU5LCAweDMyOEMsIDB4MjhFQSwgMHgzMjhELCAweDI4RUIsCi0gICAgMHgzMjhFLCAweDI4RUMsIDB4MzI4RiwgMHgyOEVELCAweDMyOTAsIDB4MjhFNywgMHgzMjkxLCAweDFGRTEsCi0gICAgMHgzMjkyLCAweDFGRTAsIDB4MzI5MywgMHgxRkUyLCAweDMyOTQsIDB4MUZEQywgMHgzMjk1LCAweDI4RkYsCi0gICAgMHgzMjk2LCAweDFGRTUsIDB4MzI5NywgMHgyOEZDLCAweDMyOTgsIDB4MUZERSwgMHgzMjk5LCAweDIwMUYsCi0gICAgMHgzMjlBLCAweDI4RjksIDB4MzI5QiwgMHgyOEY4LCAweDMyOUMsIDB4MjhGRSwgMHgzMjlELCAweDIwN0YsCi0gICAgMHgzMjlFLCAweDFGRkYsIDB4MzI5RiwgMHgyOEVGLCAweDMyQTAsIDB4MjhGNiwgMHgzMkExLCAweDI4RjcsCi0gICAgMHgzMkEyLCAweDI4RkIsIDB4MzJBMywgMHgyOEZBLCAweDMyQTQsIDB4MURCRCwgMHgzMkE1LCAweDFEQkUsCi0gICAgMHgzMkE2LCAweDFEQkYsIDB4MzJBNywgMHgxREMwLCAweDMyQTgsIDB4MURDMSwgMHgzMkE5LCAweDFGREEsCi0gICAgMHgzMkFBLCAweDFGREQsIDB4MzJBQiwgMHgxRkRGLCAweDMyQUMsIDB4MUZFMywgMHgzMkFELCAweDFGRDksCi0gICAgMHgzMkFFLCAweDFGRTQsIDB4MzJBRiwgMHgxRkRCLCAweDMyQjAsIDB4MUZEOCwgMHgzMkQwLCAweDI4QUQsCi0gICAgMHgzMkQxLCAweDI4QUUsIDB4MzJEMiwgMHgyOEFGLCAweDMyRDMsIDB4MjhCMCwgMHgzMkQ0LCAweDI4QjEsCi0gICAgMHgzMkQ1LCAweDI4QjIsIDB4MzJENiwgMHgyOEIzLCAweDMyRDcsIDB4MjhCNCwgMHgzMkQ4LCAweDI4QjUsCi0gICAgMHgzMkQ5LCAweDI4QjYsIDB4MzJEQSwgMHgyOEI3LCAweDMyREIsIDB4MjhCOCwgMHgzMkRDLCAweDI4QjksCi0gICAgMHgzMkRELCAweDI4QkEsIDB4MzJERSwgMHgyOEJCLCAweDMyREYsIDB4MjhCQywgMHgzMkUwLCAweDI4QkQsCi0gICAgMHgzMkUxLCAweDI4QkUsIDB4MzJFMiwgMHgyOEJGLCAweDMyRTMsIDB4MjhDMCwgMHgzMkU0LCAweDI4QzEsCi0gICAgMHgzMkU1LCAweDI4QzIsIDB4MzJFNiwgMHgyOEMzLCAweDMyRTcsIDB4MjhDNCwgMHgzMkU4LCAweDI4QzUsCi0gICAgMHgzMkU5LCAweDI4QzYsIDB4MzJFQSwgMHgyOEM3LCAweDMyRUIsIDB4MjhDOCwgMHgzMkVDLCAweDI4QzksCi0gICAgMHgzMkVELCAweDI4Q0EsIDB4MzJFRSwgMHgyOENCLCAweDMyRUYsIDB4MjhDQywgMHgzMkYwLCAweDI4Q0QsCi0gICAgMHgzMkYxLCAweDI4Q0UsIDB4MzJGMiwgMHgyOENGLCAweDMyRjMsIDB4MjhEMCwgMHgzMkY0LCAweDI4RDEsCi0gICAgMHgzMkY1LCAweDI4RDIsIDB4MzJGNiwgMHgyOEQzLCAweDMyRjcsIDB4MjhENCwgMHgzMkY4LCAweDI4RDUsCi0gICAgMHgzMkY5LCAweDI4RDYsIDB4MzJGQSwgMHgyOEQ3LCAweDMyRkIsIDB4MjhEOCwgMHgzMkZDLCAweDI4RDksCi0gICAgMHgzMkZELCAweDI4REEsIDB4MzJGRSwgMHgyOERCLCAweDMzMDAsIDB4MUY3MCwgMHgzMzAxLCAweDJFNjIsCi0gICAgMHgzMzAyLCAweDJFNjMsIDB4MzMwMywgMHgxRjZBLCAweDMzMDQsIDB4MkU2NCwgMHgzMzA1LCAweDFGRjcsCi0gICAgMHgzMzA2LCAweDJFNjUsIDB4MzMwNywgMHgyRTY5LCAweDMzMDgsIDB4MkU2NywgMHgzMzA5LCAweDJFNkMsCi0gICAgMHgzMzBBLCAweDJFNkEsIDB4MzMwQiwgMHgyRTZFLCAweDMzMEMsIDB4MkU3MCwgMHgzMzBELCAweDFEQUIsCi0gICAgMHgzMzBFLCAweDJFNzEsIDB4MzMwRiwgMHgyRTcyLCAweDMzMTAsIDB4MkU3MywgMHgzMzExLCAweDJFNzQsCi0gICAgMHgzMzEyLCAweDJFNzUsIDB4MzMxMywgMHgyRTc2LCAweDMzMTQsIDB4MURBMiwgMHgzMzE1LCAweDFGNjksCi0gICAgMHgzMzE2LCAweDFGNjcsIDB4MzMxNywgMHgyRTc4LCAweDMzMTgsIDB4MUY2OCwgMHgzMzE5LCAweDJFN0EsCi0gICAgMHgzMzFBLCAweDJFN0MsIDB4MzMxQiwgMHgyRTdELCAweDMzMUMsIDB4MkU3RSwgMHgzMzFELCAweDJFN0YsCi0gICAgMHgzMzFFLCAweDFGNzMsIDB4MzMxRiwgMHgyRTgwLCAweDMzMjAsIDB4MkU4MSwgMHgzMzIxLCAweDJFODIsCi0gICAgMHgzMzIyLCAweDFGNjYsIDB4MzMyMywgMHgxRjZCLCAweDMzMjQsIDB4MkU4MywgMHgzMzI1LCAweDJFODUsCi0gICAgMHgzMzI2LCAweDFEQUMsIDB4MzMyNywgMHgxREE2LCAweDMzMjgsIDB4MkU4OCwgMHgzMzI5LCAweDJFODksCi0gICAgMHgzMzJBLCAweDFGNzQsIDB4MzMyQiwgMHgxREFFLCAweDMzMkQsIDB4MkU4QiwgMHgzMzJFLCAweDJFOEUsCi0gICAgMHgzMzJGLCAweDJFOEYsIDB4MzMzMCwgMHgyRTkwLCAweDMzMzEsIDB4MUY3MSwgMHgzMzMyLCAweDJFOTEsCi0gICAgMHgzMzMzLCAweDIwODcsIDB4MzMzNCwgMHgyRTk0LCAweDMzMzUsIDB4MkU5NSwgMHgzMzM2LCAweDFEQTgsCi0gICAgMHgzMzM3LCAweDJFOUEsIDB4MzMzOCwgMHgyRTlDLCAweDMzMzksIDB4MUY2RSwgMHgzMzNBLCAweDJFOUQsCi0gICAgMHgzMzNCLCAweDFGNkYsIDB4MzMzQywgMHgyRTk2LCAweDMzM0QsIDB4MkU5RSwgMHgzMzNFLCAweDJFQTAsCi0gICAgMHgzMzNGLCAweDJFQTEsIDB4MzM0MCwgMHgyRUEyLCAweDMzNDEsIDB4MkU5RiwgMHgzMzQyLCAweDFGNkQsCi0gICAgMHgzMzQzLCAweDJFQTMsIDB4MzM0NCwgMHgyRUE0LCAweDMzNDUsIDB4MkVBNSwgMHgzMzQ2LCAweDJFQTYsCi0gICAgMHgzMzQ3LCAweDFGNzIsIDB4MzM0OCwgMHgyRUE3LCAweDMzNDksIDB4MURBMSwgMHgzMzRBLCAweDFEQUYsCi0gICAgMHgzMzRCLCAweDJFQTgsIDB4MzM0QywgMHgyRUE5LCAweDMzNEQsIDB4MURBNCwgMHgzMzRFLCAweDIwODgsCi0gICAgMHgzMzRGLCAweDJFQUEsIDB4MzM1MCwgMHgyRUFCLCAweDMzNTEsIDB4MURBOSwgMHgzMzUyLCAweDJFQUUsCi0gICAgMHgzMzUzLCAweDJFQjIsIDB4MzM1NCwgMHgyRUFGLCAweDMzNTUsIDB4MkVCMywgMHgzMzU2LCAweDJFQjQsCi0gICAgMHgzMzU3LCAweDFGNkMsIDB4MzM3MSwgMHgyRTU1LCAweDMzN0IsIDB4MjA4MywgMHgzMzdDLCAweDFEQzcsCi0gICAgMHgzMzdELCAweDFEQzYsIDB4MzM3RSwgMHgxREM1LCAweDMzN0YsIDB4MUY3NiwgMHgzMzg1LCAweDFGNUYsCi0gICAgMHgzMzg2LCAweDFGNjAsIDB4MzM4NywgMHgxRjYxLCAweDMzODgsIDB4MjAwMCwgMHgzMzg5LCAweDIwMDEsCi0gICAgMHgzMzhELCAweDJFNTgsIDB4MzM4RSwgMHgxREI0LCAweDMzOEYsIDB4MURCNSwgMHgzMzkwLCAweDFGNjMsCi0gICAgMHgzMzk2LCAweDFGNjUsIDB4MzM5NywgMHgxRjU4LCAweDMzOTgsIDB4MUY1QSwgMHgzMzlCLCAweDJFNTksCi0gICAgMHgzMzlDLCAweDFEQjEsIDB4MzM5RCwgMHgxREIyLCAweDMzOUUsIDB4MURCMywgMHgzMzlGLCAweDFGRkEsCi0gICAgMHgzM0EwLCAweDFGNTQsIDB4MzNBMSwgMHgxREI3LCAweDMzQTIsIDB4MUY1NSwgMHgzM0EzLCAweDFGRkIsCi0gICAgMHgzM0E0LCAweDFGNTYsIDB4MzNBNSwgMHgxRjU3LCAweDMzQTYsIDB4MUZGQywgMHgzM0IwLCAweDFGNUUsCi0gICAgMHgzM0IxLCAweDFGNUQsIDB4MzNCMiwgMHgxRjVDLCAweDMzQjMsIDB4MUY1QiwgMHgzM0MyLCAweDJFNTAsCi0gICAgMHgzM0M0LCAweDFEQjYsIDB4MzNDOCwgMHgyMDAyLCAweDMzQ0IsIDB4MUY2MiwgMHgzM0NDLCAweDFGRjYsCi0gICAgMHgzM0NELCAweDFEQkIsIDB4MzNENCwgMHgxRjY0LCAweDMzRDcsIDB4MkU1RCwgMHgzM0Q4LCAweDJFNUUsCi0gICAgMHgzM0RBLCAweDJFNEIsIDB4MzQwMiwgMHgzNTgyLCAweDM0MDUsIDB4M0MxQiwgMHgzNDI3LCAweDM2NTYsCi0gICAgMHgzNDg4LCAweDNDNTIsIDB4MzREQiwgMHgzQzQxLCAweDM1MUYsIDB4MzYyOSwgMHgzNTNFLCAweDM3MUUsCi0gICAgMHgzNzhELCAweDM2MUEsIDB4MzdFMiwgMHgzNzJCLCAweDNBRjMsIDB4M0M0MCwgMHgzQjIyLCAweDNDNDksCi0gICAgMHgzQjg4LCAweDM2OEQsIDB4M0U4QSwgMHgzQzQzLCAweDNFREEsIDB4M0M0OCwgMHgzRkIxLCAweDM3NTQsCi0gICAgMHg0MDkzLCAweDNDNEMsIDB4NDEwMywgMHgzQzRGLCAweDQyNjQsIDB4Mzc2MCwgMHg0MjkzLCAweDNDNTAsCi0gICAgMHg0NDBDLCAweDNDNDIsIDB4NDQ1MywgMHgzNzczLCAweDQ1N0EsIDB4M0M0QiwgMHg0NjY1LCAweDNDNEUsCi0gICAgMHg0NkFFLCAweDNDNTEsIDB4NEJFOCwgMHgzQzQ2LCAweDRFMDAsIDB4MDRCMCwgMHg0RTAxLCAweDBCQjgsCi0gICAgMHg0RTAzLCAweDA4RTMsIDB4NEUwNCwgMHgzN0Q4LCAweDRFMDUsIDB4MzdEOSwgMHg0RTA3LCAweDBFQUEsCi0gICAgMHg0RTA4LCAweDA5Q0UsIDB4NEUwOSwgMHgwODdFLCAweDRFMEEsIDB4MDlDRCwgMHg0RTBCLCAweDA1M0MsCi0gICAgMHg0RTBELCAweDBEQzYsIDB4NEUwRSwgMHgwRjI5LCAweDRFMTAsIDB4MEZGQiwgMHg0RTExLCAweDA0RDEsCi0gICAgMHg0RTE0LCAweDA1Q0MsIDB4NEUxNSwgMHgwRkZDLCAweDRFMTYsIDB4MEE0OCwgMHg0RTE3LCAweDEwRDcsCi0gICAgMHg0RTE4LCAweDA2NzAsIDB4NEUxOSwgMHgwRTBBLCAweDRFMUUsIDB4MDlDRiwgMHg0RTFGLCAweDM3REEsCi0gICAgMHg0RTIxLCAweDBGODYsIDB4NEUyNiwgMHgwRTEyLCAweDRFMjgsIDB4MjBCMywgMHg0RTJBLCAweDBGRkQsCi0gICAgMHg0RTJCLCAweDM3REIsIDB4NEUyQywgMHgzNzRELCAweDRFMkQsIDB4MEJBNCwgMHg0RTJGLCAweDM3REMsCi0gICAgMHg0RTMwLCAweDM3REQsIDB4NEUzMSwgMHgwRkZFLCAweDRFMzIsIDB4MDZGMiwgMHg0RTM2LCAweDBGRkYsCi0gICAgMHg0RTM3LCAweDM2OUQsIDB4NEUzOCwgMHgwNjE5LCAweDRFMzksIDB4MEI2RSwgMHg0RTNCLCAweDA5MTMsCi0gICAgMHg0RTNDLCAweDEwMDAsIDB4NEUzRiwgMHgxMDAxLCAweDRFNDAsIDB4MzdERSwgMHg0RTQxLCAweDM3REYsCi0gICAgMHg0RTQyLCAweDEwMDIsIDB4NEU0MywgMHgwQ0VCLCAweDRFNDQsIDB4MzdFMCwgMHg0RTQ1LCAweDA2NzEsCi0gICAgMHg0RTQ4LCAweDM3MkUsIDB4NEU0QiwgMHgwQ0VELCAweDRFNEQsIDB4MENCQiwgMHg0RTRFLCAweDA3NzcsCi0gICAgMHg0RTRGLCAweDBFNjEsIDB4NEU1NSwgMHgxOTUwLCAweDRFNTYsIDB4MTAwMywgMHg0RTU3LCAweDA5RDAsCi0gICAgMHg0RTU4LCAweDEwMDQsIDB4NEU1OSwgMHgwNTM1LCAweDRFNUEsIDB4MzdFMSwgMHg0RTVELCAweDA2REQsCi0gICAgMHg0RTVFLCAweDA3QTQsIDB4NEU1RiwgMHgwRUY1LCAweDRFNjIsIDB4MTIzMywgMHg0RTcxLCAweDBGNUEsCi0gICAgMHg0RTczLCAweDBDRDUsIDB4NEU3RSwgMHgwNUUxLCAweDRFN0YsIDB4MzdFMiwgMHg0RTgwLCAweDA2NEYsCi0gICAgMHg0RTgyLCAweDEwMDUsIDB4NEU4NSwgMHgxMDA2LCAweDRFODYsIDB4MEY4MywgMHg0RTg4LCAweDBGMjcsCi0gICAgMHg0RTg5LCAweDBBRUEsIDB4NEU4QSwgMHgxMDA4LCAweDRFOEIsIDB4MDhDNCwgMHg0RThDLCAweDBDQ0IsCi0gICAgMHg0RThELCAweDM3RTMsIDB4NEU4RSwgMHgxMDBCLCAweDRFOTEsIDB4MDRFMCwgMHg0RTkyLCAweDA3OTMsCi0gICAgMHg0RTk0LCAweDA3OTIsIDB4NEU5NSwgMHgwNEFBLCAweDRFOTYsIDB4MzdFNCwgMHg0RTk4LCAweDBGRjEsCi0gICAgMHg0RTk5LCAweDBGRjAsIDB4NEU5QiwgMHgwODIzLCAweDRFOUMsIDB4MDQ2NSwgMHg0RTlFLCAweDEwMEMsCi0gICAgMHg0RTlGLCAweDEwMEQsIDB4NEVBMCwgMHgxMDBFLCAweDRFQTEsIDB4MEU2MiwgMHg0RUEyLCAweDEwMEYsCi0gICAgMHg0RUE0LCAweDA3QTYsIDB4NEVBNSwgMHgwNEFCLCAweDRFQTYsIDB4MEVBMCwgMHg0RUE4LCAweDA2OTYsCi0gICAgMHg0RUFCLCAweDA2OTcsIDB4NEVBQywgMHgwNjk4LCAweDRFQUQsIDB4MEJGRSwgMHg0RUFFLCAweDBGODQsCi0gICAgMHg0RUIwLCAweDEwMTAsIDB4NEVCMywgMHgxMDExLCAweDRFQjYsIDB4MTAxMiwgMHg0RUI5LCAweDM3RTUsCi0gICAgMHg0RUJBLCAweDBBMTMsIDB4NEVCQiwgMHgzNjIwLCAweDRFQzAsIDB4MDk0NCwgMHg0RUMxLCAweDBBMTQsCi0gICAgMHg0RUMyLCAweDEwMTcsIDB4NEVDNCwgMHgxMDE1LCAweDRFQzYsIDB4MTAxNiwgMHg0RUM3LCAweDA2NzIsCi0gICAgMHg0RUNBLCAweDA4MTMsIDB4NEVDQiwgMHgwNTcwLCAweDRFQ0QsIDB4MTAxNCwgMHg0RUNFLCAweDEwMTMsCi0gICAgMHg0RUNGLCAweDBERjksIDB4NEVEMCwgMHgzN0U2LCAweDRFRDQsIDB4MDg5NCwgMHg0RUQ1LCAweDA4OTMsCi0gICAgMHg0RUQ2LCAweDBCMUUsIDB4NEVENywgMHgxMDE4LCAweDRFRDgsIDB4MERDNywgMHg0RUQ5LCAweDBBOEIsCi0gICAgMHg0RURELCAweDAyOTAsIDB4NEVERSwgMHgxMDE5LCAweDRFREYsIDB4MTAxQiwgMHg0RUUwLCAweDM3RTcsCi0gICAgMHg0RUUxLCAweDIwQjQsIDB4NEVFMywgMHgwQjQ1LCAweDRFRTQsIDB4MEZBOSwgMHg0RUU1LCAweDA0OEUsCi0gICAgMHg0RUVELCAweDEwMUEsIDB4NEVFRSwgMHgwNTNFLCAweDRFRjAsIDB4MDZCQywgMHg0RUYyLCAweDBCQTUsCi0gICAgMHg0RUY2LCAweDA3NDUsIDB4NEVGNywgMHgxMDFDLCAweDRFRkIsIDB4MENEQSwgMHg0RUZDLCAweDIwQjUsCi0gICAgMHg0RUZELCAweDM3RTgsIDB4NEVGRiwgMHgzN0U5LCAweDRGMDAsIDB4MjBCNiwgMHg0RjAxLCAweDA2MjcsCi0gICAgMHg0RjAzLCAweDIwQjcsIDB4NEYwOSwgMHgxMDFELCAweDRGMEEsIDB4MDQ4RiwgMHg0RjBCLCAweDM3RUEsCi0gICAgMHg0RjBELCAweDA3OTQsIDB4NEYwRSwgMHgwNjI4LCAweDRGMEYsIDB4MERFQywgMHg0RjEwLCAweDBENDYsCi0gICAgMHg0RjExLCAweDA2NzMsIDB4NEYxNSwgMHgzN0VCLCAweDRGMUEsIDB4MDU3MSwgMHg0RjFDLCAweDEwNDAsCi0gICAgMHg0RjFELCAweDBDM0IsIDB4NEYyRiwgMHgwRDIyLCAweDRGMzAsIDB4MTAxRiwgMHg0RjM0LCAweDBENTAsCi0gICAgMHg0RjM2LCAweDBGQUEsIDB4NEYzOCwgMHgwOUYzLCAweDRGMzksIDB4MjBCOCwgMHg0RjNBLCAweDA4OTUsCi0gICAgMHg0RjNCLCAweDM3RUQsIDB4NEYzQywgMHgwOEM1LCAweDRGM0QsIDB4MDU0MCwgMHg0RjQzLCAweDBCRUQsCi0gICAgMHg0RjQ2LCAweDBCNjAsIDB4NEY0NywgMHgxMDIzLCAweDRGNDksIDB4MzdFRSwgMHg0RjRELCAweDA0OTAsCi0gICAgMHg0RjRFLCAweDBCRkYsIDB4NEY0RiwgMHgwOTQ1LCAweDRGNTAsIDB4MDgyNCwgMHg0RjUxLCAweDBGMEUsCi0gICAgMHg0RjUzLCAweDBCMkUsIDB4NEY1NCwgMHgzN0VGLCAweDRGNTUsIDB4MDUzRiwgMHg0RjU2LCAweDIwQjksCi0gICAgMHg0RjU3LCAweDEwMjIsIDB4NEY1OSwgMHgwRjI4LCAweDRGNUEsIDB4MTAxRSwgMHg0RjVCLCAweDEwMjAsCi0gICAgMHg0RjVDLCAweDA4NUUsIDB4NEY1RCwgMHgxMDIxLCAweDRGNUUsIDB4MTFEMywgMHg0RjYwLCAweDM3RUMsCi0gICAgMHg0RjY5LCAweDEwMjksIDB4NEY2RiwgMHgxMDJDLCAweDRGNzAsIDB4MTAyQSwgMHg0RjczLCAweDA1NDIsCi0gICAgMHg0Rjc1LCAweDBFMEIsIDB4NEY3NiwgMHgxMDI0LCAweDRGN0EsIDB4MzdGMCwgMHg0RjdCLCAweDEwMjgsCi0gICAgMHg0RjdDLCAweDA3QTcsIDB4NEY3RCwgMHgzN0YxLCAweDRGN0UsIDB4MzdGMiwgMHg0RjdGLCAweDA4OTYsCi0gICAgMHg0RjgzLCAweDA1RTIsIDB4NEY4NiwgMHgxMDJELCAweDRGODgsIDB4MTAyNSwgMHg0RjhBLCAweDIwQkIsCi0gICAgMHg0RjhCLCAweDBGQUIsIDB4NEY4RCwgMHgwOEM2LCAweDRGOEYsIDB4MTAyNiwgMHg0RjkxLCAweDEwMkIsCi0gICAgMHg0RjkyLCAweDIwQkEsIDB4NEY5NCwgMHgyMEJELCAweDRGOTYsIDB4MTAyRSwgMHg0Rjk3LCAweDM3RjMsCi0gICAgMHg0Rjk4LCAweDEwMjcsIDB4NEY5QSwgMHgyMEJDLCAweDRGOUIsIDB4MDY5OSwgMHg0RjlELCAweDA0OTEsCi0gICAgMHg0RkEwLCAweDA2OUEsIDB4NEZBMSwgMHgwNTQxLCAweDRGQUIsIDB4MTFENCwgMHg0RkFELCAweDBFQTcsCi0gICAgMHg0RkFFLCAweDBERTAsIDB4NEZBRiwgMHgwN0E4LCAweDRGQjUsIDB4MDlGNSwgMHg0RkI2LCAweDBGN0YsCi0gICAgMHg0RkJFLCAweDM3RjQsIDB4NEZCRiwgMHgwRTI4LCAweDRGQzIsIDB4MDcwRSwgMHg0RkMzLCAweDBCMDUsCi0gICAgMHg0RkM0LCAweDA1NjQsIDB4NEZDOSwgMHgyMEFDLCAweDRGQ0EsIDB4MDk1RCwgMHg0RkNELCAweDIwQkUsCi0gICAgMHg0RkNFLCAweDEwMzIsIDB4NEZDRiwgMHgzN0Y1LCAweDRGRDAsIDB4MTAzNywgMHg0RkQxLCAweDEwMzUsCi0gICAgMHg0RkQzLCAweDNDMkYsIDB4NEZENCwgMHgxMDMwLCAweDRGRDcsIDB4MEIwRiwgMHg0RkQ4LCAweDEwMzMsCi0gICAgMHg0RkRBLCAweDEwMzYsIDB4NEZEQiwgMHgxMDM0LCAweDRGREQsIDB4MEUyRCwgMHg0RkRGLCAweDEwMzEsCi0gICAgMHg0RkUwLCAweDFERUMsIDB4NEZFMSwgMHgwOUY0LCAweDRGRTMsIDB4MEVBMSwgMHg0RkU0LCAweDEwMzgsCi0gICAgMHg0RkU1LCAweDEwMzksIDB4NEZFRSwgMHgwOTJFLCAweDRGRUYsIDB4MTA0NiwgMHg0RkYzLCAweDBEMDYsCi0gICAgMHg0RkY1LCAweDBEQTgsIDB4NEZGNiwgMHgxMDQxLCAweDRGRjgsIDB4MEU0MCwgMHg0RkZBLCAweDA1MzYsCi0gICAgMHg0RkZELCAweDM3RjYsIDB4NEZGRSwgMHgxMDQ1LCAweDRGRkYsIDB4MjBDMSwgMHg1MDAwLCAweDM3RjcsCi0gICAgMHg1MDAxLCAweDM3RjgsIDB4NTAwMiwgMHgzNDQ3LCAweDUwMDUsIDB4MTAzRiwgMHg1MDA2LCAweDEwNDgsCi0gICAgMHg1MDA5LCAweDBBRDQsIDB4NTAwQiwgMHgwNzc4LCAweDUwMEQsIDB4MEQxMiwgMHg1MDBGLCAweDE2MDAsCi0gICAgMHg1MDEwLCAweDM3RjksIDB4NTAxMSwgMHgxMDQ3LCAweDUwMTIsIDB4MEM1NywgMHg1MDE0LCAweDEwM0MsCi0gICAgMHg1MDE2LCAweDA3QUEsIDB4NTAxOSwgMHgwN0E5LCAweDUwMUEsIDB4MTAzQSwgMHg1MDFCLCAweDM3RkEsCi0gICAgMHg1MDFFLCAweDIwQzIsIDB4NTAxRiwgMHgwOTA2LCAweDUwMjEsIDB4MTA0MiwgMHg1MDIyLCAweDIwQzAsCi0gICAgMHg1MDIzLCAweDBFM0YsIDB4NTAyNCwgMHgwQjhCLCAweDUwMjUsIDB4MTAzRSwgMHg1MDI2LCAweDA3NDcsCi0gICAgMHg1MDI3LCAweDM3RkIsIDB4NTAyOCwgMHgxMDNCLCAweDUwMjksIDB4MTA0MywgMHg1MDJBLCAweDEwM0QsCi0gICAgMHg1MDJCLCAweDBGOTksIDB4NTAyQywgMHgxMDQ0LCAweDUwMkQsIDB4MEZFNywgMHg1MDJFLCAweDM3RkMsCi0gICAgMHg1MDM2LCAweDA2REUsIDB4NTAzOSwgMHgwNzQ2LCAweDUwM0IsIDB4MzgwMCwgMHg1MDQwLCAweDIwQkYsCi0gICAgMHg1MDQyLCAweDIwQzUsIDB4NTA0MywgMHgxMDQ5LCAweDUwNDYsIDB4MjBDMywgMHg1MDQ3LCAweDEwNEEsCi0gICAgMHg1MDQ4LCAweDEwNEUsIDB4NTA0OSwgMHgwNDkyLCAweDUwNEYsIDB4MEUyMCwgMHg1MDUwLCAweDEwNEQsCi0gICAgMHg1MDU1LCAweDEwNEMsIDB4NTA1NiwgMHgxMDUwLCAweDUwNTcsIDB4MzdGRCwgMHg1MDVBLCAweDEwNEYsCi0gICAgMHg1MDVDLCAweDBDMDAsIDB4NTA2NSwgMHgwNzQ4LCAweDUwNjYsIDB4MzdGRSwgMHg1MDZBLCAweDM3RkYsCi0gICAgMHg1MDZDLCAweDEwNTEsIDB4NTA3MCwgMHgyMEM0LCAweDUwNzIsIDB4MDhGMSwgMHg1MDc0LCAweDBCMDYsCi0gICAgMHg1MDc1LCAweDBDMDEsIDB4NTA3NiwgMHgwNkVFLCAweDUwNzgsIDB4MTA1MiwgMHg1MDdELCAweDA2NTAsCi0gICAgMHg1MDgwLCAweDEwNTMsIDB4NTA4NSwgMHgxMDU1LCAweDUwOEQsIDB4MEU2MywgMHg1MDhGLCAweDM4MDEsCi0gICAgMHg1MDkxLCAweDA3M0MsIDB4NTA5NCwgMHgyMEM2LCAweDUwOTYsIDB4MzgwMiwgMHg1MDk4LCAweDA4N0YsCi0gICAgMHg1MDk5LCAweDBEOEIsIDB4NTA5QSwgMHgxMDU0LCAweDUwOUMsIDB4MzgwMywgMHg1MEFDLCAweDA4MzUsCi0gICAgMHg1MEFELCAweDBGMkQsIDB4NTBCMiwgMHgxMDU3LCAweDUwQjMsIDB4MTA1QSwgMHg1MEI0LCAweDEwNTYsCi0gICAgMHg1MEI1LCAweDA4MzQsIDB4NTBCNywgMHgwOTg3LCAweDUwQkUsIDB4MDcwRiwgMHg1MEMyLCAweDEwNUIsCi0gICAgMHg1MEM1LCAweDA2QzcsIDB4NTBDOSwgMHgxMDU4LCAweDUwQ0EsIDB4MTA1OSwgMHg1MENDLCAweDM4MDQsCi0gICAgMHg1MENELCAweDBDODcsIDB4NTBDRiwgMHgwQUZFLCAweDUwRDEsIDB4MDY5QiwgMHg1MEQ1LCAweDBFN0IsCi0gICAgMHg1MEQ2LCAweDEwNUMsIDB4NTBEOCwgMHgyMEM4LCAweDUwRDksIDB4M0MzMCwgMHg1MERBLCAweDBGODUsCi0gICAgMHg1MERFLCAweDEwNUQsIDB4NTBFMywgMHgxMDYwLCAweDUwRTUsIDB4MTA1RSwgMHg1MEU2LCAweDM4MDUsCi0gICAgMHg1MEU3LCAweDBBRDAsIDB4NTBFOSwgMHgzODA2LCAweDUwRUQsIDB4MTA1RiwgMHg1MEVFLCAweDEwNjEsCi0gICAgMHg1MEVGLCAweDM4MDcsIDB4NTBGMCwgMHgzQzMxLCAweDUwRjQsIDB4MjBDNywgMHg1MEY1LCAweDEwNjMsCi0gICAgMHg1MEY5LCAweDEwNjIsIDB4NTBGQiwgMHgwRTE4LCAweDUxMDAsIDB4MDY1MSwgMHg1MTAxLCAweDEwNjUsCi0gICAgMHg1MTAyLCAweDEwNjYsIDB4NTEwNCwgMHgwNTJGLCAweDUxMDgsIDB4MzgwOCwgMHg1MTA5LCAweDEwNjQsCi0gICAgMHg1MTBCLCAweDM4MDksIDB4NTExMCwgMHgzODBBLCAweDUxMTIsIDB4MDkyMCwgMHg1MTE0LCAweDEwNjksCi0gICAgMHg1MTE1LCAweDEwNjgsIDB4NTExNiwgMHgxMDY3LCAweDUxMTgsIDB4MTAyRiwgMHg1MTFBLCAweDEwNkEsCi0gICAgMHg1MTFCLCAweDM4MEIsIDB4NTExRSwgMHgzODBDLCAweDUxMUYsIDB4MDk4OCwgMHg1MTIxLCAweDEwNkIsCi0gICAgMHg1MTJBLCAweDBGMEYsIDB4NTEzMiwgMHgwRUU1LCAweDUxMzcsIDB4MTA2RCwgMHg1MTNBLCAweDEwNkMsCi0gICAgMHg1MTNCLCAweDEwNkYsIDB4NTEzQywgMHgxMDZFLCAweDUxM0YsIDB4MTA3MCwgMHg1MTQwLCAweDEwNzEsCi0gICAgMHg1MTQxLCAweDA0QjgsIDB4NTE0MywgMHgwNzY5LCAweDUxNDQsIDB4MDcxMSwgMHg1MTQ1LCAweDA5NDYsCi0gICAgMHg1MTQ2LCAweDBCQjksIDB4NTE0NywgMHgwNjlDLCAweDUxNDgsIDB4MEE4QywgMHg1MTQ5LCAweDA3QUIsCi0gICAgMHg1MTRBLCAweDIwQzksIDB4NTE0QiwgMHgwODAwLCAweDUxNEMsIDB4MTA3MywgMHg1MTRELCAweDBFRDQsCi0gICAgMHg1MTRFLCAweDBDNDAsIDB4NTE1MCwgMHgwOEM3LCAweDUxNTIsIDB4MTA3MiwgMHg1MTU0LCAweDEwNzQsCi0gICAgMHg1MTVBLCAweDBDNTgsIDB4NTE1QywgMHgwNUQzLCAweDUxNUYsIDB4MzgwRCwgMHg1MTYyLCAweDEwNzUsCi0gICAgMHg1MTY0LCAweDIwQ0EsIDB4NTE2NSwgMHgwQ0Q2LCAweDUxNjcsIDB4MzY4RSwgMHg1MTY4LCAweDBBQjYsCi0gICAgMHg1MTY5LCAweDEwNzcsIDB4NTE2QSwgMHgxMDc4LCAweDUxNkIsIDB4MEQ0MCwgMHg1MTZDLCAweDA3QUMsCi0gICAgMHg1MTZELCAweDBGRTEsIDB4NTE2RSwgMHgxMDc5LCAweDUxNzEsIDB4MDY5RSwgMHg1MTc1LCAweDBFMEMsCi0gICAgMHg1MTc2LCAweDBCMTYsIDB4NTE3NywgMHgwNkU5LCAweDUxNzgsIDB4MEMyRiwgMHg1MTc5LCAweDM3NzksCi0gICAgMHg1MTdDLCAweDA3NDksIDB4NTE4MCwgMHgxMDdBLCAweDUxODIsIDB4MTA3QiwgMHg1MTg1LCAweDBDQkEsCi0gICAgMHg1MTg2LCAweDA1MDEsIDB4NTE4OSwgMHgxMDdFLCAweDUxOEEsIDB4MDg2RCwgMHg1MThDLCAweDEwN0QsCi0gICAgMHg1MThELCAweDA4MzYsIDB4NTE4RiwgMHgxMDdGLCAweDUxOTAsIDB4MTg1QiwgMHg1MTkxLCAweDEwODAsCi0gICAgMHg1MTkyLCAweDBFNkYsIDB4NTE5MywgMHgxMDgxLCAweDUxOTUsIDB4MTA4MiwgMHg1MTk2LCAweDEwODMsCi0gICAgMHg1MTk3LCAweDA5RDEsIDB4NTE5OSwgMHgwOEY4LCAweDUxOUQsIDB4MjBDQiwgMHg1MUEwLCAweDA1RTMsCi0gICAgMHg1MUExLCAweDM4MEUsIDB4NTFBMiwgMHgxMDg2LCAweDUxQTQsIDB4MTA4NCwgMHg1MUE1LCAweDBFQzksCi0gICAgMHg1MUE2LCAweDEwODUsIDB4NTFBOCwgMHgwRENDLCAweDUxQTksIDB4MTA4NywgMHg1MUFBLCAweDEwODgsCi0gICAgMHg1MUFCLCAweDEwODksIDB4NTFBQywgMHgwQzU5LCAweDUxQjAsIDB4MTA4RCwgMHg1MUIxLCAweDEwOEIsCi0gICAgMHg1MUIyLCAweDEwOEMsIDB4NTFCMywgMHgxMDhBLCAweDUxQjQsIDB4MDg1MywgMHg1MUI1LCAweDEwOEUsCi0gICAgMHg1MUI2LCAweDBFRjYsIDB4NTFCNywgMHgwRkFDLCAweDUxQkMsIDB4MzgwRiwgMHg1MUJELCAweDEwOEYsCi0gICAgMHg1MUJFLCAweDIwQ0MsIDB4NTFDMywgMHgzQzMyLCAweDUxQzQsIDB4MEE0QywgMHg1MUM1LCAweDEwOTAsCi0gICAgMHg1MUM2LCAweDA5NjQsIDB4NTFDOSwgMHgxMDkxLCAweDUxQ0IsIDB4MEJCQSwgMHg1MUNDLCAweDBGODcsCi0gICAgMHg1MUNELCAweDBDNUEsIDB4NTFENiwgMHgxMERBLCAweDUxREIsIDB4MTA5MiwgMHg1MURDLCAweDIwNUMsCi0gICAgMHg1MURELCAweDA2QkQsIDB4NTFERSwgMHgzODEwLCAweDUxRTAsIDB4MTA5MywgMHg1MUUxLCAweDBFOEMsCi0gICAgMHg1MUU2LCAweDA5NzIsIDB4NTFFNywgMHgwQjVDLCAweDUxRTksIDB4MTA5NSwgMHg1MUVBLCAweDBDQkMsCi0gICAgMHg1MUVDLCAweDIwQ0QsIDB4NTFFRCwgMHgxMDk2LCAweDUxRUUsIDB4MzgxMSwgMHg1MUYwLCAweDEwOTcsCi0gICAgMHg1MUYxLCAweDA1OEMsIDB4NTFGNCwgMHgzODEyLCAweDUxRjUsIDB4MTA5OCwgMHg1MUY2LCAweDA2OUYsCi0gICAgMHg1MUY4LCAweDBDQTQsIDB4NTFGOSwgMHgwNTFDLCAweDUxRkEsIDB4MDk1QSwgMHg1MUZELCAweDBEMzUsCi0gICAgMHg1MUZFLCAweDEwOTksIDB4NTIwMCwgMHgwQzVCLCAweDUyMDEsIDB4MzgxMywgMHg1MjAyLCAweDM4MTQsCi0gICAgMHg1MjAzLCAweDBBMTUsIDB4NTIwNCwgMHgxMDlBLCAweDUyMDYsIDB4MERGQywgMHg1MjA3LCAweDBBN0UsCi0gICAgMHg1MjA4LCAweDA1REUsIDB4NTIwQSwgMHgwNUU1LCAweDUyMEIsIDB4MTA5QiwgMHg1MjBFLCAweDEwOUQsCi0gICAgMHg1MjExLCAweDA3MTAsIDB4NTIxMywgMHgzODE1LCAweDUyMTQsIDB4MTA5QywgMHg1MjE1LCAweDIwQ0UsCi0gICAgMHg1MjE3LCAweDBGQkIsIDB4NTIxRCwgMHgwOTczLCAweDUyMjQsIDB4MEQ1MSwgMHg1MjI1LCAweDBFMUMsCi0gICAgMHg1MjI3LCAweDEwOUUsIDB4NTIyOSwgMHgwRjYyLCAweDUyMkEsIDB4MTA5RiwgMHg1MjJFLCAweDEwQTAsCi0gICAgMHg1MjMwLCAweDBDNzgsIDB4NTIzMywgMHgxMEExLCAweDUyMzYsIDB4MEE0RCwgMHg1MjM3LCAweDA4NkUsCi0gICAgMHg1MjM4LCAweDA3NEEsIDB4NTIzOSwgMHgxMEEyLCAweDUyM0EsIDB4MDg5NywgMHg1MjNCLCAweDA4MDEsCi0gICAgMHg1MjQzLCAweDBDMDIsIDB4NTI0NCwgMHgxMEE0LCAweDUyNDcsIDB4MEIwNywgMHg1MjQ5LCAweDM4MTYsCi0gICAgMHg1MjRBLCAweDA4NUYsIDB4NTI0QiwgMHgxMEE1LCAweDUyNEMsIDB4MTBBNiwgMHg1MjRELCAweDBBQjIsCi0gICAgMHg1MjRGLCAweDEwQTMsIDB4NTI1NCwgMHgxMEE4LCAweDUyNTYsIDB4MEU2NCwgMHg1MjVCLCAweDA3RjYsCi0gICAgMHg1MjVELCAweDFFNUUsIDB4NTI1RSwgMHgxMEE3LCAweDUyNjEsIDB4MzgxNywgMHg1MjYzLCAweDA3NEIsCi0gICAgMHg1MjY0LCAweDA4NEUsIDB4NTI2NSwgMHgwRDIzLCAweDUyNjYsIDB4MzgxOCwgMHg1MjY5LCAweDEwQUIsCi0gICAgMHg1MjZBLCAweDEwQTksIDB4NTI2RiwgMHgwREVELCAweDUyNzAsIDB4MDlEMiwgMHg1MjcxLCAweDEwQjIsCi0gICAgMHg1MjcyLCAweDA1QzIsIDB4NTI3MywgMHgxMEFDLCAweDUyNzQsIDB4MTBBQSwgMHg1Mjc1LCAweDBBRDEsCi0gICAgMHg1MjdELCAweDEwQUUsIDB4NTI3RiwgMHgxMEFELCAweDUyODMsIDB4MDVBMiwgMHg1Mjg3LCAweDA3MzYsCi0gICAgMHg1Mjg4LCAweDEwQjMsIDB4NTI4OSwgMHgwRjc1LCAweDUyOEQsIDB4MTBBRiwgMHg1MjkxLCAweDEwQjQsCi0gICAgMHg1MjkyLCAweDEwQjEsIDB4NTI5MywgMHgzODE5LCAweDUyOTQsIDB4MTBCMCwgMHg1MjlCLCAweDBGOTcsCi0gICAgMHg1MjlDLCAweDIwQ0YsIDB4NTI5RiwgMHgwN0FELCAweDUyQTAsIDB4MDU0MywgMHg1MkEzLCAweDBGQkMsCi0gICAgMHg1MkE2LCAweDIwRDAsIDB4NTJBOSwgMHgwOTdGLCAweDUyQUEsIDB4MEM1MiwgMHg1MkFCLCAweDA3RjcsCi0gICAgMHg1MkFDLCAweDEwQjcsIDB4NTJBRCwgMHgxMEI4LCAweDUyQUYsIDB4MjE3RCwgMHg1MkIxLCAweDBGQUQsCi0gICAgMHg1MkI0LCAweDBGRDEsIDB4NTJCNSwgMHgxMEJBLCAweDUyQjksIDB4MDdBRSwgMHg1MkJDLCAweDEwQjksCi0gICAgMHg1MkJFLCAweDA1OEQsIDB4NTJDMCwgMHgyMEQxLCAweDUyQzEsIDB4MTBCQiwgMHg1MkMzLCAweDBFODQsCi0gICAgMHg1MkM1LCAweDBCRDgsIDB4NTJDNywgMHgwRjEwLCAweDUyQzgsIDB4MzgxQSwgMHg1MkM5LCAweDBFMjksCi0gICAgMHg1MkNELCAweDEwQkMsIDB4NTJEMCwgMHgzNkU4LCAweDUyRDIsIDB4MUJFRSwgMHg1MkQ1LCAweDBDODgsCi0gICAgMHg1MkQ3LCAweDEwQkQsIDB4NTJEOCwgMHgwNUU2LCAweDUyRDksIDB4MEVCRiwgMHg1MkRCLCAweDIwRDIsCi0gICAgMHg1MkRELCAweDA5ODksIDB4NTJERSwgMHgxMEJFLCAweDUyREYsIDB4MEUzNywgMHg1MkUwLCAweDEwQzIsCi0gICAgMHg1MkUyLCAweDBBNEUsIDB4NTJFMywgMHgxMEJGLCAweDUyRTQsIDB4MDZDOCwgMHg1MkU2LCAweDEwQzAsCi0gICAgMHg1MkU3LCAweDA1RTcsIDB4NTJGMCwgMHgzODFCLCAweDUyRjIsIDB4MDcwNCwgMHg1MkYzLCAweDEwQzMsCi0gICAgMHg1MkY1LCAweDEwQzQsIDB4NTJGOCwgMHgxMEM1LCAweDUyRjksIDB4MTBDNiwgMHg1MkZBLCAweDA5MDcsCi0gICAgMHg1MkZFLCAweDA3QUYsIDB4NTJGRiwgMHgwRUVBLCAweDUzMDAsIDB4MjBEMywgMHg1MzAxLCAweDBFRjQsCi0gICAgMHg1MzAyLCAweDBDQ0YsIDB4NTMwNSwgMHgwRTQxLCAweDUzMDYsIDB4MTBDNywgMHg1MzA3LCAweDIwRDQsCi0gICAgMHg1MzA4LCAweDEwQzgsIDB4NTMwQSwgMHgzODFDLCAweDUzMEIsIDB4MzgxRCwgMHg1MzBELCAweDEwQ0EsCi0gICAgMHg1MzBGLCAweDEwQ0MsIDB4NTMxMCwgMHgxMENCLCAweDUzMTUsIDB4MTBDRCwgMHg1MzE2LCAweDA1M0QsCi0gICAgMHg1MzE3LCAweDBFN0EsIDB4NTMxOSwgMHgwODZDLCAweDUzMUEsIDB4MTBDRSwgMHg1MzFELCAweDBBREIsCi0gICAgMHg1MzIwLCAweDA5OEEsIDB4NTMyMSwgMHgwNkExLCAweDUzMjMsIDB4MTBDRiwgMHg1MzI0LCAweDIwRDUsCi0gICAgMHg1MzJBLCAweDBENkYsIDB4NTMyRiwgMHgxMEQwLCAweDUzMzEsIDB4MTBEMSwgMHg1MzMzLCAweDEwRDIsCi0gICAgMHg1MzM4LCAweDEwRDMsIDB4NTMzOSwgMHgwRDk2LCAweDUzM0EsIDB4MDZFMCwgMHg1MzNCLCAweDA0QTksCi0gICAgMHg1MzNFLCAweDM4MUUsIDB4NTMzRiwgMHgwQzk3LCAweDUzNDAsIDB4MTBENCwgMHg1MzQxLCAweDA5NDcsCi0gICAgMHg1MzQzLCAweDBBOEQsIDB4NTM0NSwgMHgxMEQ2LCAweDUzNDYsIDB4MTBENSwgMHg1MzQ3LCAweDA5OEIsCi0gICAgMHg1MzQ4LCAweDA3OTUsIDB4NTM0OSwgMHgxMEQ4LCAweDUzNEEsIDB4MEQ1MiwgMHg1MzRCLCAweDM4MjAsCi0gICAgMHg1MzRDLCAweDM4MUYsIDB4NTM0RCwgMHgxMEQ5LCAweDUzNTEsIDB4MEQ3MCwgMHg1MzUyLCAweDBCMTQsCi0gICAgMHg1MzUzLCAweDBCNEUsIDB4NTM1NCwgMHgwNkEwLCAweDUzNTcsIDB4MENDNiwgMHg1MzU4LCAweDBCNkYsCi0gICAgMHg1MzVBLCAweDBEMjQsIDB4NTM1QywgMHgwRTdDLCAweDUzNUUsIDB4MTBEQiwgMHg1MzYwLCAweDBBOEUsCi0gICAgMHg1MzYxLCAweDM4MjEsIDB4NTM2NiwgMHgwNzBCLCAweDUzNjksIDB4MTBEQywgMHg1MzZDLCAweDM4MjIsCi0gICAgMHg1MzZFLCAweDEwREQsIDB4NTM2RiwgMHgwNENFLCAweDUzNzAsIDB4MDRCOSwgMHg1MzcxLCAweDA2MjksCi0gICAgMHg1MzcyLCAweDIwRDYsIDB4NTM3MywgMHgwQjA4LCAweDUzNzQsIDB4MDY2QiwgMHg1Mzc1LCAweDBGNUIsCi0gICAgMHg1Mzc3LCAweDEwRTAsIDB4NTM3OCwgMHgwNTM3LCAweDUzN0IsIDB4MTBERiwgMHg1MzdELCAweDM0MzUsCi0gICAgMHg1MzdGLCAweDA2QTIsIDB4NTM4MiwgMHgxMEUxLCAweDUzODQsIDB4MEVGRCwgMHg1Mzg5LCAweDM3RDAsCi0gICAgMHg1MzkzLCAweDIwRDcsIDB4NTM5NiwgMHgxMEUyLCAweDUzOTgsIDB4MEY5QSwgMHg1MzlBLCAweDA3QjAsCi0gICAgMHg1MzlGLCAweDA3NkEsIDB4NTNBMCwgMHgxMEUzLCAweDUzQTUsIDB4MTBFNSwgMHg1M0E2LCAweDEwRTQsCi0gICAgMHg1M0E4LCAweDBBMjUsIDB4NTNBOSwgMHgwNERCLCAweDUzQUIsIDB4MzgyMywgMHg1M0FELCAweDA1MDAsCi0gICAgMHg1M0FFLCAweDEwRTYsIDB4NTNCMCwgMHgxMEU3LCAweDUzQjIsIDB4MjBEOCwgMHg1M0IzLCAweDA3NkIsCi0gICAgMHg1M0I2LCAweDEwRTgsIDB4NTNCQiwgMHgwNjg4LCAweDUzQzIsIDB4MDg4MCwgMHg1M0MzLCAweDEwRTksCi0gICAgMHg1M0M4LCAweDBFQTIsIDB4NTNDOSwgMHgwODI1LCAweDUzQ0EsIDB4MDY3NCwgMHg1M0NCLCAweDBGMTEsCi0gICAgMHg1M0NDLCAweDBBRDIsIDB4NTNDRCwgMHgwRDUzLCAweDUzQ0UsIDB4MDkyOSwgMHg1M0Q0LCAweDA5NTEsCi0gICAgMHg1M0Q2LCAweDA5MTQsIDB4NTNENywgMHgwOTIxLCAweDUzRDksIDB4MDk4MCwgMHg1M0RBLCAweDM4MjQsCi0gICAgMHg1M0RCLCAweDBENTQsIDB4NTNERCwgMHgyMEQ5LCAweDUzREYsIDB4MTBFQywgMHg1M0UxLCAweDA0RTUsCi0gICAgMHg1M0UyLCAweDBBRDMsIDB4NTNFMywgMHgwN0IxLCAweDUzRTQsIDB4MDc3OSwgMHg1M0U1LCAweDA2REYsCi0gICAgMHg1M0U2LCAweDM4MjUsIDB4NTNFOCwgMHgxMEYwLCAweDUzRTksIDB4MEI1RiwgMHg1M0VBLCAweDBCNUUsCi0gICAgMHg1M0VCLCAweDA2QTMsIDB4NTNFQywgMHgwOThDLCAweDUzRUQsIDB4MTBGMSwgMHg1M0VFLCAweDEwRUYsCi0gICAgMHg1M0VGLCAweDA1NDQsIDB4NTNGMCwgMHgwQjQ2LCAweDUzRjEsIDB4MDhFNCwgMHg1M0YyLCAweDA4OTksCi0gICAgMHg1M0YzLCAweDA0QzgsIDB4NTNGNSwgMHgzODI2LCAweDUzRjYsIDB4MDVDRSwgMHg1M0Y3LCAweDA3RjgsCi0gICAgMHg1M0Y4LCAweDA4OTgsIDB4NTNGQSwgMHgxMEYyLCAweDU0MDEsIDB4MTBGMywgMHg1NDAzLCAweDA2NjMsCi0gICAgMHg1NDA0LCAweDA1QTQsIDB4NTQwOCwgMHgwN0Y5LCAweDU0MDksIDB4MDY2MiwgMHg1NDBBLCAweDBCRkIsCi0gICAgMHg1NDBCLCAweDA0QzcsIDB4NTQwQywgMHgwQzg5LCAweDU0MEQsIDB4MEVDQSwgMHg1NDBFLCAweDA3QjMsCi0gICAgMHg1NDBGLCAweDBGNjMsIDB4NTQxMCwgMHgwQzQxLCAweDU0MTEsIDB4MDdCMiwgMHg1NDFCLCAweDA3MDUsCi0gICAgMHg1NDFELCAweDEwRkMsIDB4NTQxRiwgMHgwNkRCLCAweDU0MjAsIDB4MEU3OCwgMHg1NDI2LCAweDBENzEsCi0gICAgMHg1NDI3LCAweDM4MjcsIDB4NTQyOSwgMHgxMEZCLCAweDU0MkIsIDB4MDYxQSwgMHg1NDJDLCAweDEwRjYsCi0gICAgMHg1NDJELCAweDEwRjcsIDB4NTQyRSwgMHgxMEY5LCAweDU0MzMsIDB4MzVDMCwgMHg1NDM2LCAweDEwRkEsCi0gICAgMHg1NDM4LCAweDA2NzUsIDB4NTQzOSwgMHgwQTI3LCAweDU0M0IsIDB4MERGRCwgMHg1NDNDLCAweDEwRjgsCi0gICAgMHg1NDNELCAweDEwRjQsIDB4NTQzRSwgMHgwNzk3LCAweDU0M0YsIDB4MzVDRiwgMHg1NDQwLCAweDEwRjUsCi0gICAgMHg1NDQyLCAweDBGQ0EsIDB4NTQ0NiwgMHgwRTQyLCAweDU0NDgsIDB4MEMwNCwgMHg1NDQ5LCAweDA3OTYsCi0gICAgMHg1NDRBLCAweDA4MDIsIDB4NTQ0RCwgMHgzODI4LCAweDU0NEUsIDB4MTBGRCwgMHg1NDUxLCAweDBDQjUsCi0gICAgMHg1NDU1LCAweDM3MjMsIDB4NTQ1RiwgMHgxMTAxLCAweDU0NjYsIDB4MzgyOSwgMHg1NDY4LCAweDA5MkEsCi0gICAgMHg1NDZBLCAweDA5MjIsIDB4NTQ2QiwgMHgzODJBLCAweDU0NzAsIDB4MTEwNCwgMHg1NDcxLCAweDExMDIsCi0gICAgMHg1NDczLCAweDBFQUYsIDB4NTQ3NCwgMHgzODJCLCAweDU0NzUsIDB4MTBGRiwgMHg1NDc2LCAweDExMDgsCi0gICAgMHg1NDc3LCAweDExMDMsIDB4NTQ3QiwgMHgxMTA2LCAweDU0N0MsIDB4MDc3QSwgMHg1NDdELCAweDBFQ0IsCi0gICAgMHg1NDgwLCAweDExMDcsIDB4NTQ4NCwgMHgxMTA5LCAweDU0ODYsIDB4MTEwQiwgMHg1NDhBLCAweDIwREMsCi0gICAgMHg1NDhCLCAweDA4NjAsIDB4NTQ4QywgMHgwRkU4LCAweDU0OEQsIDB4MzgyQywgMHg1NDhFLCAweDExMDAsCi0gICAgMHg1NDhGLCAweDEwRkUsIDB4NTQ5MCwgMHgxMTBBLCAweDU0OTIsIDB4MTEwNSwgMHg1NDk2LCAweDM4MkQsCi0gICAgMHg1NDlDLCAweDIwREIsIDB4NTRBMSwgMHgzODJFLCAweDU0QTIsIDB4MTEwRCwgMHg1NEE0LCAweDExMTYsCi0gICAgMHg1NEE1LCAweDExMEYsIDB4NTRBOCwgMHgxMTEzLCAweDU0QTksIDB4MjBERCwgMHg1NEFCLCAweDExMTQsCi0gICAgMHg1NEFDLCAweDExMTAsIDB4NTRBRCwgMHgzODJGLCAweDU0QUYsIDB4MTEzMSwgMHg1NEIyLCAweDA4NTksCi0gICAgMHg1NEIzLCAweDA1OEYsIDB4NTRCOCwgMHgxMTBFLCAweDU0QjksIDB4MzgzMCwgMHg1NEJDLCAweDExMTgsCi0gICAgMHg1NEJELCAweDA0QkEsIDB4NTRCRSwgMHgxMTE3LCAweDU0QkYsIDB4MzgzMSwgMHg1NEMwLCAweDA0NjksCi0gICAgMHg1NEMxLCAweDBEQkMsIDB4NTRDMiwgMHgxMTE1LCAweDU0QzQsIDB4MTExMSwgMHg1NEM2LCAweDM4MzIsCi0gICAgMHg1NEM3LCAweDExMEMsIDB4NTRDOCwgMHgxMTEyLCAweDU0QzksIDB4MDgzOCwgMHg1NENELCAweDM4MzMsCi0gICAgMHg1NEQ4LCAweDExMTksIDB4NTRFMSwgMHgwNEJCLCAweDU0RTIsIDB4MTEyMiwgMHg1NEU1LCAweDExMUEsCi0gICAgMHg1NEU2LCAweDExMUIsIDB4NTRFOCwgMHgwOThELCAweDU0RTksIDB4MEU5NywgMHg1NEVELCAweDExMjAsCi0gICAgMHg1NEVFLCAweDExMUYsIDB4NTRGMiwgMHgwQzI5LCAweDU0RkEsIDB4MTEyMSwgMHg1NEZELCAweDExMUUsCi0gICAgMHg1NEZGLCAweDIwREUsIDB4NTUwNCwgMHgwNEQ2LCAweDU1MDYsIDB4MDgyNiwgMHg1NTA3LCAweDA5RjYsCi0gICAgMHg1NTBFLCAweDM4MzQsIDB4NTUwRiwgMHgxMTFDLCAweDU1MTAsIDB4MEM1QywgMHg1NTE0LCAweDExMUQsCi0gICAgMHg1NTE2LCAweDA0NjYsIDB4NTUyQiwgMHgzODM1LCAweDU1MkUsIDB4MTEyNywgMHg1NTJGLCAweDBGMEQsCi0gICAgMHg1NTMxLCAweDA5OEYsIDB4NTUzMywgMHgxMTJELCAweDU1MzUsIDB4MzgzNiwgMHg1NTM4LCAweDExMkMsCi0gICAgMHg1NTM5LCAweDExMjMsIDB4NTUzRSwgMHgwQjIzLCAweDU1NDAsIDB4MTEyNCwgMHg1NTQ0LCAweDBCNEYsCi0gICAgMHg1NTQ1LCAweDExMjksIDB4NTU0NiwgMHgwOThFLCAweDU1NEEsIDB4MzgzNywgMHg1NTRDLCAweDExMjYsCi0gICAgMHg1NTRGLCAweDBFRjAsIDB4NTU1MywgMHgwNzEyLCAweDU1NTYsIDB4MTEyQSwgMHg1NTU3LCAweDExMkIsCi0gICAgMHg1NTVDLCAweDExMjgsIDB4NTU1RCwgMHgxMTJFLCAweDU1NUUsIDB4MUREMSwgMHg1NTYwLCAweDM4MzgsCi0gICAgMHg1NTYxLCAweDM4MzksIDB4NTU2MywgMHgxMTI1LCAweDU1N0IsIDB4MTEzNCwgMHg1NTdDLCAweDExMzksCi0gICAgMHg1NTdFLCAweDExMzUsIDB4NTU4MCwgMHgxMTMwLCAweDU1ODMsIDB4MTEzQSwgMHg1NTg0LCAweDBBQjMsCi0gICAgMHg1NTg2LCAweDIwREYsIDB4NTU4NywgMHgxMTNDLCAweDU1ODgsIDB4MzgzQSwgMHg1NTg5LCAweDA3QjQsCi0gICAgMHg1NThBLCAweDExMzIsIDB4NTU4QiwgMHgwQkJCLCAweDU1OEUsIDB4MzgzQiwgMHg1NTk4LCAweDExMzYsCi0gICAgMHg1NTk5LCAweDExMkYsIDB4NTU5QSwgMHgwNUU5LCAweDU1OUMsIDB4MDYyQSwgMHg1NTlELCAweDA1QzMsCi0gICAgMHg1NTlFLCAweDExMzcsIDB4NTU5RiwgMHgxMTMzLCAweDU1QTcsIDB4MDc0QywgMHg1NUE4LCAweDExM0QsCi0gICAgMHg1NUE5LCAweDExM0IsIDB4NTVBQSwgMHgwQUQ1LCAweDU1QUIsIDB4MDY2NCwgMHg1NUFDLCAweDA2QTQsCi0gICAgMHg1NUFFLCAweDExMzgsIDB4NTVCMCwgMHgwNkVDLCAweDU1QjYsIDB4MDRFNiwgMHg1NUM0LCAweDExNDEsCi0gICAgMHg1NUM1LCAweDExM0YsIDB4NTVDNywgMHgxMTc4LCAweDU1RDQsIDB4MTE0NCwgMHg1NURBLCAweDExM0UsCi0gICAgMHg1NURDLCAweDExNDIsIDB4NTVERiwgMHgxMTQwLCAweDU1RTMsIDB4MDg5QSwgMHg1NUU0LCAweDExNDMsCi0gICAgMHg1NUY3LCAweDExNDYsIDB4NTVGOSwgMHgxMTRCLCAweDU1RkQsIDB4MTE0OSwgMHg1NUZFLCAweDExNDgsCi0gICAgMHg1NjA2LCAweDBCNzAsIDB4NTYwOCwgMHgzODNDLCAweDU2MDksIDB4MDU0NSwgMHg1NjBFLCAweDM4M0QsCi0gICAgMHg1NjBGLCAweDM4M0UsIDB4NTYxNCwgMHgxMTQ1LCAweDU2MTYsIDB4MTE0NywgMHg1NjE3LCAweDA5OTAsCi0gICAgMHg1NjE4LCAweDA0RDUsIDB4NTYxQiwgMHgxMTRBLCAweDU2MjAsIDB4M0MxRCwgMHg1NjI5LCAweDA1NUUsCi0gICAgMHg1NjJGLCAweDExNTUsIDB4NTYzMSwgMHgwOUU0LCAweDU2MzIsIDB4MTE1MSwgMHg1NjM0LCAweDExNEYsCi0gICAgMHg1NjM2LCAweDExNTAsIDB4NTYzNywgMHgzODNGLCAweDU2MzgsIDB4MTE1MiwgMHg1NjNGLCAweDM4NDAsCi0gICAgMHg1NjQyLCAweDA0REYsIDB4NTY0OSwgMHgzODQxLCAweDU2NEIsIDB4Mzg0MiwgMHg1NjRDLCAweDBBQkIsCi0gICAgMHg1NjRFLCAweDExNEMsIDB4NTY0RiwgMHgzODQzLCAweDU2NTAsIDB4MTE0RCwgMHg1NjUzLCAweDFGMUIsCi0gICAgMHg1NjVCLCAweDA1RDgsIDB4NTY2NCwgMHgxMTU0LCAweDU2NjYsIDB4Mzg0NCwgMHg1NjY4LCAweDA2MkIsCi0gICAgMHg1NjY5LCAweDM4NDUsIDB4NTY2QSwgMHgxMTU3LCAweDU2NkIsIDB4MTE1MywgMHg1NjZDLCAweDExNTYsCi0gICAgMHg1NjZGLCAweDM4NDYsIDB4NTY3MSwgMHgzODQ3LCAweDU2NzIsIDB4Mzg0OCwgMHg1Njc0LCAweDBERkUsCi0gICAgMHg1Njc2LCAweDNDMzMsIDB4NTY3OCwgMHgwQ0FELCAweDU2N0EsIDB4MEQ0QywgMHg1NjgwLCAweDExNTksCi0gICAgMHg1Njg2LCAweDExNTgsIDB4NTY4NywgMHgwNUEzLCAweDU2OEEsIDB4MTE1QSwgMHg1NjhGLCAweDExNUQsCi0gICAgMHg1Njk0LCAweDExNUMsIDB4NTY5NSwgMHgzODQ5LCAweDU2OTksIDB4MURFNiwgMHg1NjlBLCAweDM4NEEsCi0gICAgMHg1NkEwLCAweDExNUIsIDB4NTZBMiwgMHgwQ0VGLCAweDU2QTUsIDB4MTE1RSwgMHg1NkFDLCAweDM4NEIsCi0gICAgMHg1NkFELCAweDM4NEMsIDB4NTZBRSwgMHgxMTVGLCAweDU2QjEsIDB4Mzg0RCwgMHg1NkI0LCAweDExNjEsCi0gICAgMHg1NkI2LCAweDExNjAsIDB4NTZCQywgMHgxMTYzLCAweDU2QzAsIDB4MTE2NiwgMHg1NkMxLCAweDExNjQsCi0gICAgMHg1NkMyLCAweDExNjIsIDB4NTZDMywgMHgxMTY1LCAweDU2QzgsIDB4MTE2NywgMHg1NkM5LCAweDM4NEUsCi0gICAgMHg1NkNBLCAweDFFNUEsIDB4NTZDRSwgMHgxMTY4LCAweDU2RDEsIDB4MTE2OSwgMHg1NkQzLCAweDExNkEsCi0gICAgMHg1NkQ3LCAweDExNkIsIDB4NTZEOCwgMHgxMDdDLCAweDU2REEsIDB4MDkyOCwgMHg1NkRCLCAweDA4OUIsCi0gICAgMHg1NkRELCAweDM4NEYsIDB4NTZERSwgMHgwNTczLCAweDU2RTAsIDB4MDRCQywgMHg1NkUzLCAweDBCODIsCi0gICAgMHg1NkU0LCAweDM4NTAsIDB4NTZFRSwgMHgxMTZDLCAweDU2RjAsIDB4MDgxNCwgMHg1NkYyLCAweDA0OTMsCi0gICAgMHg1NkYzLCAweDBBMjQsIDB4NTZGOSwgMHgxMTZELCAweDU2RkEsIDB4MDc3QiwgMHg1NkZELCAweDA4MDMsCi0gICAgMHg1NkZGLCAweDExNkYsIDB4NTcwMCwgMHgxMTZFLCAweDU3MDMsIDB4MEUzMCwgMHg1NzA0LCAweDExNzAsCi0gICAgMHg1NzA4LCAweDExNzIsIDB4NTcwOSwgMHgxMTcxLCAweDU3MEEsIDB4Mzg1MSwgMHg1NzBCLCAweDExNzMsCi0gICAgMHg1NzBELCAweDExNzQsIDB4NTcwRiwgMHgwNzRELCAweDU3MTIsIDB4MDUwMiwgMHg1NzEzLCAweDExNzUsCi0gICAgMHg1NzE1LCAweDM4NTIsIDB4NTcxNiwgMHgxMTc3LCAweDU3MTgsIDB4MTE3NiwgMHg1NzFDLCAweDExNzksCi0gICAgMHg1NzFGLCAweDBDNTQsIDB4NTcyMSwgMHgzNjgwLCAweDU3MjMsIDB4Mzg1MywgMHg1NzI2LCAweDExN0EsCi0gICAgMHg1NzI3LCAweDA0NzksIDB4NTcyOCwgMHgwODRGLCAweDU3MkQsIDB4MDcxMywgMHg1NzJGLCAweDM4NTQsCi0gICAgMHg1NzMwLCAweDBCOEQsIDB4NTczMywgMHgzODU1LCAweDU3MzQsIDB4Mzg1NiwgMHg1NzM3LCAweDExN0IsCi0gICAgMHg1NzM4LCAweDExN0MsIDB4NTczQiwgMHgxMTdFLCAweDU3NDAsIDB4MTE3RiwgMHg1NzQyLCAweDA4NTQsCi0gICAgMHg1NzQ3LCAweDA2QzksIDB4NTc0QSwgMHgwRTY1LCAweDU3NEMsIDB4Mzg1NywgMHg1NzRFLCAweDExN0QsCi0gICAgMHg1NzRGLCAweDExODAsIDB4NTc1MCwgMHgwODMxLCAweDU3NTEsIDB4MDdCNSwgMHg1NzU5LCAweDIwRTAsCi0gICAgMHg1NzYxLCAweDExODQsIDB4NTc2NCwgMHgwODE1LCAweDU3NjUsIDB4MjBFMSwgMHg1NzY2LCAweDBCNzEsCi0gICAgMHg1NzY5LCAweDExODEsIDB4NTc2QSwgMHgwQkY2LCAweDU3NzAsIDB4Mzg1OCwgMHg1NzdGLCAweDExODUsCi0gICAgMHg1NzgyLCAweDBBMjgsIDB4NTc4OCwgMHgxMTgzLCAweDU3ODksIDB4MTE4NiwgMHg1NzhCLCAweDA3MTUsCi0gICAgMHg1NzhDLCAweDM4NTksIDB4NTc5MywgMHgxMTg3LCAweDU3OUMsIDB4Mzg1QSwgMHg1N0EwLCAweDExODgsCi0gICAgMHg1N0EyLCAweDA3QjYsIDB4NTdBMywgMHgwNTlFLCAweDU3QTQsIDB4MTE4QSwgMHg1N0FBLCAweDExOEIsCi0gICAgMHg1N0FDLCAweDIwRTIsIDB4NTdCMCwgMHgxMThDLCAweDU3QjMsIDB4MTE4OSwgMHg1N0I4LCAweDM4NUIsCi0gICAgMHg1N0MwLCAweDExODIsIDB4NTdDMywgMHgxMThELCAweDU3QzYsIDB4MTE4RSwgMHg1N0M3LCAweDIwRTQsCi0gICAgMHg1N0M4LCAweDIwRTMsIDB4NTdDQiwgMHgwRTkyLCAweDU3Q0UsIDB4MDlEMywgMHg1N0QyLCAweDExOTAsCi0gICAgMHg1N0QzLCAweDExOTEsIDB4NTdENCwgMHgxMThGLCAweDU3RDYsIDB4MTE5MywgMHg1N0RDLCAweDBDRUUsCi0gICAgMHg1N0RGLCAweDA0QUMsIDB4NTdFMCwgMHgwREM4LCAweDU3RTMsIDB4MTE5NCwgMHg1N0U2LCAweDM4NUMsCi0gICAgMHg1N0VELCAweDM4NUQsIDB4NTdGNCwgMHgwOUU1LCAweDU3RjUsIDB4Mzg1RSwgMHg1N0Y2LCAweDM4NUYsCi0gICAgMHg1N0Y3LCAweDA4RTUsIDB4NTdGOSwgMHgwRDEzLCAweDU3RkEsIDB4MDYyQywgMHg1N0ZDLCAweDA4NUIsCi0gICAgMHg1N0ZGLCAweDM4NjAsIDB4NTgwMCwgMHgwRTg3LCAweDU4MDIsIDB4MEM4QSwgMHg1ODA1LCAweDA3NEUsCi0gICAgMHg1ODA2LCAweDBCMkYsIDB4NTgwOSwgMHgzODYxLCAweDU4MEEsIDB4MTE5MiwgMHg1ODBCLCAweDExOTUsCi0gICAgMHg1ODE1LCAweDBCMjQsIDB4NTgxOSwgMHgxMTk2LCAweDU4MUQsIDB4MTE5NywgMHg1ODIwLCAweDM4NjIsCi0gICAgMHg1ODIxLCAweDExOTksIDB4NTgyNCwgMHgwQzA1LCAweDU4MkEsIDB4MDVFQSwgMHg1ODJGLCAweDFEMzIsCi0gICAgMHg1ODMwLCAweDA1MDMsIDB4NTgzMSwgMHgwRTQzLCAweDU4MzIsIDB4Mzg2MywgMHg1ODM0LCAweDA5RDQsCi0gICAgMHg1ODM1LCAweDBDNDIsIDB4NTgzQSwgMHgwODU2LCAweDU4M0QsIDB4MTE5RiwgMHg1ODQwLCAweDBFMEQsCi0gICAgMHg1ODQxLCAweDBGQTUsIDB4NTg0QSwgMHgwNTc0LCAweDU4NEIsIDB4MTE5QiwgMHg1ODUxLCAweDBBQkMsCi0gICAgMHg1ODUyLCAweDExOUUsIDB4NTg1NCwgMHgwQzVELCAweDU4NTcsIDB4MEM0MywgMHg1ODU4LCAweDBDNUUsCi0gICAgMHg1ODU5LCAweDBENEQsIDB4NTg1QSwgMHgwQkU5LCAweDU4NUUsIDB4MDgzOSwgMHg1ODYxLCAweDFFNDcsCi0gICAgMHg1ODYyLCAweDExOUEsIDB4NTg2OSwgMHgwNTE4LCAweDU4NkIsIDB4MEMzMCwgMHg1ODcwLCAweDExOUMsCi0gICAgMHg1ODcyLCAweDExOTgsIDB4NTg3NSwgMHgwQTE2LCAweDU4NzksIDB4MTFBMCwgMHg1ODdDLCAweDM4NjQsCi0gICAgMHg1ODdFLCAweDA5NTgsIDB4NTg4MCwgMHgzODY1LCAweDU4ODMsIDB4MDZBNSwgMHg1ODg1LCAweDExQTEsCi0gICAgMHg1ODkzLCAweDBFMzgsIDB4NTg5NywgMHgwQUZGLCAweDU4OUMsIDB4MEJFMiwgMHg1ODlFLCAweDIwRTcsCi0gICAgMHg1ODlGLCAweDExQTMsIDB4NThBOCwgMHgwRTdELCAweDU4QTksIDB4Mzg2NiwgMHg1OEFCLCAweDExQTQsCi0gICAgMHg1OEFFLCAweDExQTksIDB4NThCMiwgMHgyMEU4LCAweDU4QjMsIDB4MERGRiwgMHg1OEI4LCAweDExQTgsCi0gICAgMHg1OEI5LCAweDExQTIsIDB4NThCQSwgMHgxMUE1LCAweDU4QkIsIDB4MTFBNywgMHg1OEJFLCAweDA4MTYsCi0gICAgMHg1OEMxLCAweDBFMTksIDB4NThDNSwgMHgxMUFBLCAweDU4QzcsIDB4MEI4MywgMHg1OENBLCAweDA1NzUsCi0gICAgMHg1OENDLCAweDA5RDUsIDB4NThDRSwgMHgzODY3LCAweDU4RDAsIDB4Mzg2OCwgMHg1OEQxLCAweDExQUMsCi0gICAgMHg1OEQzLCAweDExQUIsIDB4NThENCwgMHgzODY5LCAweDU4RDUsIDB4MDdGQSwgMHg1OEQ3LCAweDExQUQsCi0gICAgMHg1OEQ4LCAweDExQUYsIDB4NThEOSwgMHgxMUFFLCAweDU4REEsIDB4Mzg2QSwgMHg1OERDLCAweDExQjEsCi0gICAgMHg1OERFLCAweDExQTYsIDB4NThERiwgMHgxMUIzLCAweDU4RTQsIDB4MTFCMiwgMHg1OEU1LCAweDExQjAsCi0gICAgMHg1OEU5LCAweDM4NkIsIDB4NThFQiwgMHgwODlDLCAweDU4RUMsIDB4MEExNywgMHg1OEVFLCAweDBBRDYsCi0gICAgMHg1OEVGLCAweDExQjQsIDB4NThGMCwgMHgwQTYwLCAweDU4RjEsIDB4MDRCMSwgMHg1OEYyLCAweDBEMUEsCi0gICAgMHg1OEY3LCAweDBCRjcsIDB4NThGOSwgMHgxMUI2LCAweDU4RkEsIDB4MTFCNSwgMHg1OEZCLCAweDExQjcsCi0gICAgMHg1OEZDLCAweDExQjgsIDB4NThGRCwgMHgxMUI5LCAweDU5MDIsIDB4MTFCQSwgMHg1OTA5LCAweDBFMjEsCi0gICAgMHg1OTBBLCAweDExQkIsIDB4NTkwQiwgMHgyMEU5LCAweDU5MEMsIDB4Mzg2QywgMHg1OTBGLCAweDA1NDYsCi0gICAgMHg1OTEwLCAweDExQkMsIDB4NTkxNSwgMHgwRjI2LCAweDU5MTYsIDB4MDU4RSwgMHg1OTE4LCAweDEwREUsCi0gICAgMHg1OTE5LCAweDA5NTIsIDB4NTkxQSwgMHgwQjFGLCAweDU5MUIsIDB4MTFCRCwgMHg1OTFDLCAweDBFRjcsCi0gICAgMHg1OTIyLCAweDBFQzAsIDB4NTkyNCwgMHgzODZELCAweDU5MjUsIDB4MTFCRiwgMHg1OTI3LCAweDBCNDcsCi0gICAgMHg1OTI5LCAweDBDMzEsIDB4NTkyQSwgMHgwQjIwLCAweDU5MkIsIDB4MERDOSwgMHg1OTJDLCAweDExQzAsCi0gICAgMHg1OTJELCAweDExQzEsIDB4NTkyRSwgMHgwNTFELCAweDU5MkYsIDB4Mzg2RSwgMHg1OTMxLCAweDA4RTYsCi0gICAgMHg1OTMyLCAweDExQzIsIDB4NTkzNywgMHgwNDk0LCAweDU5MzgsIDB4MTFDMywgMHg1OTM5LCAweDM3MjUsCi0gICAgMHg1OTNFLCAweDExQzQsIDB4NTk0NCwgMHgwNTA0LCAweDU5NDcsIDB4MDYyRCwgMHg1OTQ4LCAweDBDQjgsCi0gICAgMHg1OTQ5LCAweDBFNDQsIDB4NTk0RSwgMHgxMUM4LCAweDU5NEYsIDB4MEFENywgMHg1OTUwLCAweDExQzcsCi0gICAgMHg1OTUxLCAweDA3MTYsIDB4NTk1MywgMHgyMEVBLCAweDU5NTQsIDB4MEU4OSwgMHg1OTU1LCAweDExQzYsCi0gICAgMHg1OTU3LCAweDBDNUYsIDB4NTk1OCwgMHgxMUNBLCAweDU5NUEsIDB4MTFDOSwgMHg1OTVCLCAweDIwRUIsCi0gICAgMHg1OTVELCAweDIwRUMsIDB4NTk2MCwgMHgxMUNDLCAweDU5NjEsIDB4Mzg2RiwgMHg1OTYyLCAweDExQ0IsCi0gICAgMHg1OTYzLCAweDIwRUQsIDB4NTk2NSwgMHgwNTFFLCAweDU5NjcsIDB4MTFDRCwgMHg1OTY4LCAweDA5OTEsCi0gICAgMHg1OTY5LCAweDExQ0YsIDB4NTk2QSwgMHgwQjYzLCAweDU5NkMsIDB4MTFDRSwgMHg1OTZELCAweDM4NzAsCi0gICAgMHg1OTZFLCAweDBFMDMsIDB4NTk3MywgMHgwOTgxLCAweDU5NzQsIDB4MEM1NSwgMHg1OTc4LCAweDExRDAsCi0gICAgMHg1OTdELCAweDA3QjcsIDB4NTk4MSwgMHgxMUQxLCAweDU5ODIsIDB4MENENywgMHg1OTgzLCAweDBENzIsCi0gICAgMHg1OTg0LCAweDBFREQsIDB4NTk4QSwgMHgwQ0RCLCAweDU5OEQsIDB4MTFEQSwgMHg1OTkzLCAweDA2NTIsCi0gICAgMHg1OTk2LCAweDBGMkYsIDB4NTk5OSwgMHgwRUJCLCAweDU5OUIsIDB4MTIzOSwgMHg1OTlELCAweDExRDIsCi0gICAgMHg1OUEzLCAweDExRDUsIDB4NTlBNCwgMHgyMEVFLCAweDU5QTUsIDB4MEIyNSwgMHg1OUE4LCAweDBFNjYsCi0gICAgMHg1OUFDLCAweDBDNDQsIDB4NTlCMiwgMHgxMUQ2LCAweDU5QjksIDB4MEU5MywgMHg1OUJBLCAweDIwRUYsCi0gICAgMHg1OUJCLCAweDA4M0EsIDB4NTlCRSwgMHgwOTkyLCAweDU5QzYsIDB4MTFENywgMHg1OUM5LCAweDA4OUUsCi0gICAgMHg1OUNBLCAweDM4NzEsIDB4NTlDQiwgMHgwODlELCAweDU5RDAsIDB4MDQ3RCwgMHg1OUQxLCAweDA3N0MsCi0gICAgMHg1OUQyLCAweDM4NzIsIDB4NTlEMywgMHgwQTRGLCAweDU5RDQsIDB4MDQ5NSwgMHg1OUQ5LCAweDExREIsCi0gICAgMHg1OURBLCAweDExREMsIDB4NTlEQywgMHgxMUQ5LCAweDU5REQsIDB4Mzg3MywgMHg1OUUzLCAweDM4NzQsCi0gICAgMHg1OUU0LCAweDM4NzUsIDB4NTlFNSwgMHgwNERBLCAweDU5RTYsIDB4MDVFQiwgMHg1OUU4LCAweDExRDgsCi0gICAgMHg1OUVBLCAweDBFRDEsIDB4NTlFQiwgMHgwREEzLCAweDU5RUMsIDB4MzZBRCwgMHg1OUY2LCAweDA0NkMsCi0gICAgMHg1OUZCLCAweDA0QkQsIDB4NTlGRiwgMHgwODlGLCAweDVBMDEsIDB4MDQ5NiwgMHg1QTAzLCAweDA0NjcsCi0gICAgMHg1QTA0LCAweDM4NzYsIDB4NUEwOSwgMHgxMUUxLCAweDVBMEMsIDB4Mzg3NywgMHg1QTExLCAweDExREYsCi0gICAgMHg1QTE4LCAweDBFQzgsIDB4NUExQSwgMHgxMUUyLCAweDVBMUIsIDB4MzVDMSwgMHg1QTFDLCAweDExRTAsCi0gICAgMHg1QTFGLCAweDExREUsIDB4NUEyMCwgMHgwOUY3LCAweDVBMjMsIDB4Mzg3OCwgMHg1QTI1LCAweDExREQsCi0gICAgMHg1QTI5LCAweDBFMkEsIDB4NUEyRiwgMHgwNzk4LCAweDVBMzUsIDB4MTFFNiwgMHg1QTM2LCAweDExRTcsCi0gICAgMHg1QTNDLCAweDA5OTMsIDB4NUE0MCwgMHgxMUUzLCAweDVBNDEsIDB4MEZEMiwgMHg1QTQ2LCAweDBEMDIsCi0gICAgMHg1QTQ3LCAweDM4NzksIDB4NUE0OSwgMHgxMUU1LCAweDVBNTUsIDB4Mzg3QSwgMHg1QTVBLCAweDA4MTcsCi0gICAgMHg1QTYyLCAweDExRTgsIDB4NUE2MywgMHgzODdCLCAweDVBNjYsIDB4MERDQSwgMHg1QTZBLCAweDExRTksCi0gICAgMHg1QTZDLCAweDExRTQsIDB4NUE2RCwgMHgzODdDLCAweDVBN0UsIDB4Mzg3RCwgMHg1QTdGLCAweDBFQzcsCi0gICAgMHg1QTkyLCAweDBEMTQsIDB4NUE5QSwgMHgxMUVBLCAweDVBOUIsIDB4MERBNCwgMHg1QTlFLCAweDM4N0UsCi0gICAgMHg1QUE3LCAweDM4N0YsIDB4NUFBQywgMHgzODgwLCAweDVBQjMsIDB4Mzg4MSwgMHg1QUJDLCAweDExRUIsCi0gICAgMHg1QUJELCAweDExRUYsIDB4NUFCRSwgMHgxMUVDLCAweDVBQzEsIDB4MDU0NywgMHg1QUMyLCAweDExRUUsCi0gICAgMHg1QUM5LCAweDA4RTcsIDB4NUFDQiwgMHgxMUVELCAweDVBQ0MsIDB4MDc0RiwgMHg1QUQwLCAweDExRkIsCi0gICAgMHg1QUQ2LCAweDExRjQsIDB4NUFENywgMHgxMUYxLCAweDVBRTAsIDB4Mzg4MiwgMHg1QUUxLCAweDBCQTIsCi0gICAgMHg1QUUzLCAweDExRjAsIDB4NUFFNiwgMHgxMUYyLCAweDVBRTksIDB4MTFGMywgMHg1QUZBLCAweDExRjUsCi0gICAgMHg1QUZCLCAweDExRjYsIDB4NUIwMCwgMHgzODgzLCAweDVCMDksIDB4MDYyRSwgMHg1QjBCLCAweDExRjgsCi0gICAgMHg1QjBDLCAweDExRjcsIDB4NUIxNiwgMHgxMUY5LCAweDVCMTksIDB4Mzg4NCwgMHg1QjIyLCAweDA5RDYsCi0gICAgMHg1QjI1LCAweDM4ODUsIDB4NUIyQSwgMHgxMUZDLCAweDVCMkMsIDB4MEJGOCwgMHg1QjJELCAweDM4ODYsCi0gICAgMHg1QjMwLCAweDA0RTcsIDB4NUIzMiwgMHgxMUZBLCAweDVCMzYsIDB4MTFGRCwgMHg1QjNFLCAweDExRkUsCi0gICAgMHg1QjQwLCAweDEyMDEsIDB4NUI0MSwgMHgzODg3LCAweDVCNDMsIDB4MTFGRiwgMHg1QjQ1LCAweDEyMDAsCi0gICAgMHg1QjUwLCAweDA4QTAsIDB4NUI1MSwgMHgxMjAyLCAweDVCNTQsIDB4MDdCOCwgMHg1QjU1LCAweDEyMDMsCi0gICAgMHg1QjU2LCAweDIwRjAsIDB4NUI1NywgMHgwOEM4LCAweDVCNTgsIDB4MEIxOCwgMHg1QjVBLCAweDEyMDQsCi0gICAgMHg1QjVCLCAweDEyMDUsIDB4NUI1QywgMHgwOEE4LCAweDVCNUQsIDB4MDdCOSwgMHg1QjVGLCAweDBFREUsCi0gICAgMHg1QjYzLCAweDA2NDIsIDB4NUI2NCwgMHgwNzdELCAweDVCNjUsIDB4MTIwNiwgMHg1QjY2LCAweDA1QjYsCi0gICAgMHg1QjY5LCAweDEyMDcsIDB4NUI2QiwgMHgwQjE5LCAweDVCNzAsIDB4MTIwOCwgMHg1QjcxLCAweDEyMzAsCi0gICAgMHg1QjczLCAweDEyMDksIDB4NUI3NSwgMHgxMjBBLCAweDVCNzgsIDB4MTIwQiwgMHg1QjdBLCAweDEyMEQsCi0gICAgMHg1QjdDLCAweDM4ODgsIDB4NUI3RSwgMHgzODg5LCAweDVCN0YsIDB4Mzg4QSwgMHg1QjgwLCAweDEyMEUsCi0gICAgMHg1QjgyLCAweDM2MTAsIDB4NUI4MywgMHgxMjBGLCAweDVCODUsIDB4MEI1MCwgMHg1Qjg3LCAweDA0QzksCi0gICAgMHg1Qjg4LCAweDA5MTUsIDB4NUI4OSwgMHgwNDg2LCAweDVCOEEsIDB4Mzg4QiwgMHg1QjhCLCAweDBBRDksCi0gICAgMHg1QjhDLCAweDA1RUMsIDB4NUI4RCwgMHgwOEUxLCAweDVCOEYsIDB4MDdCQSwgMHg1Qjk1LCAweDBDNjAsCi0gICAgMHg1Qjk3LCAweDA5MkIsIDB4NUI5OCwgMHgwNUVELCAweDVCOTksIDB4MEJBNiwgMHg1QjlBLCAweDBDMDYsCi0gICAgMHg1QjlCLCAweDA0N0MsIDB4NUI5QywgMHgwNjUzLCAweDVCOUQsIDB4MEU0NSwgMHg1QjlGLCAweDA4RUUsCi0gICAgMHg1QkEyLCAweDA2NkMsIDB4NUJBMywgMHgwQThGLCAweDVCQTQsIDB4MDhFOCwgMHg1QkE1LCAweDBGMTIsCi0gICAgMHg1QkE2LCAweDEyMTAsIDB4NUJBRSwgMHgwNjc2LCAweDVCQjAsIDB4MDgzQiwgMHg1QkIzLCAweDA1OTAsCi0gICAgMHg1QkI0LCAweDA1MDUsIDB4NUJCNSwgMHgwOTk0LCAweDVCQjYsIDB4MDU0OCwgMHg1QkI4LCAweDEyMTEsCi0gICAgMHg1QkI5LCAweDBGMzAsIDB4NUJCRiwgMHgwOTUzLCAweDVCQzAsIDB4MjBGMSwgMHg1QkMyLCAweDA5MTAsCi0gICAgMHg1QkMzLCAweDEyMTIsIDB4NUJDNCwgMHgwNjJGLCAweDVCQzUsIDB4MENBQSwgMHg1QkM2LCAweDBFQjUsCi0gICAgMHg1QkM3LCAweDEyMTMsIDB4NUJDOSwgMHgxMjE0LCAweDVCQ0MsIDB4MERDQiwgMHg1QkQwLCAweDEyMTYsCi0gICAgMHg1QkQyLCAweDA1RTQsIDB4NUJEMywgMHgwNkVGLCAweDVCRDQsIDB4MTIxNSwgMHg1QkQ4LCAweDIwRjMsCi0gICAgMHg1QkRCLCAweDA1RUUsIDB4NUJERCwgMHgwOUY4LCAweDVCREUsIDB4MTIxQSwgMHg1QkRGLCAweDA4NkYsCi0gICAgMHg1QkUxLCAweDA1NDksIDB4NUJFMiwgMHgxMjE5LCAweDVCRTQsIDB4MTIxNywgMHg1QkU1LCAweDEyMUIsCi0gICAgMHg1QkU2LCAweDEyMTgsIDB4NUJFNywgMHgwQ0UxLCAweDVCRTgsIDB4MTQ4RSwgMHg1QkU5LCAweDA5RjksCi0gICAgMHg1QkVCLCAweDEyMUMsIDB4NUJFQywgMHgyMEY0LCAweDVCRUUsIDB4MEY4OCwgMHg1QkYwLCAweDEyMUQsCi0gICAgMHg1QkYzLCAweDEyMUYsIDB4NUJGNSwgMHgwQkJDLCAweDVCRjYsIDB4MTIxRSwgMHg1QkY4LCAweDBBNDcsCi0gICAgMHg1QkZBLCAweDA4QzksIDB4NUJGRSwgMHgwQjMwLCAweDVCRkYsIDB4MDkyMywgMHg1QzAxLCAweDBERTcsCi0gICAgMHg1QzAyLCAweDBBOTAsIDB4NUMwNCwgMHgwOEY5LCAweDVDMDUsIDB4MTIyMCwgMHg1QzA2LCAweDA5OTUsCi0gICAgMHg1QzA3LCAweDEyMjEsIDB4NUMwOCwgMHgxMjIyLCAweDVDMDksIDB4MDQ5NywgMHg1QzBBLCAweDBCMUEsCi0gICAgMHg1QzBCLCAweDBBMTgsIDB4NUMwRCwgMHgxMjIzLCAweDVDMEUsIDB4MEM4QiwgMHg1QzBGLCAweDA5OTYsCi0gICAgMHg1QzExLCAweDA5OTcsIDB4NUMxMywgMHgxMjI0LCAweDVDMTQsIDB4MzcyQSwgMHg1QzE2LCAweDBBOTEsCi0gICAgMHg1QzE5LCAweDM2MEIsIDB4NUMxQSwgMHgwOTk4LCAweDVDMUUsIDB4MjBGNSwgMHg1QzIwLCAweDEyMjUsCi0gICAgMHg1QzIyLCAweDEyMjYsIDB4NUMyMywgMHgzODhDLCAweDVDMjQsIDB4MEVFQywgMHg1QzI4LCAweDEyMjcsCi0gICAgMHg1QzJCLCAweDM4OEQsIDB4NUMyRCwgMHgwNkJFLCAweDVDMzAsIDB4Mzg4RSwgMHg1QzMxLCAweDA5MkMsCi0gICAgMHg1QzM4LCAweDEyMjgsIDB4NUMzOSwgMHgxMjI5LCAweDVDM0EsIDB4MDkwOCwgMHg1QzNCLCAweDA5RjIsCi0gICAgMHg1QzNDLCAweDBDQ0MsIDB4NUMzRCwgMHgwQTFBLCAweDVDM0UsIDB4MEQ4QywgMHg1QzNGLCAweDBDRDgsCi0gICAgMHg1QzQwLCAweDA2QzEsIDB4NUM0MSwgMHgxMjJBLCAweDVDNDUsIDB4MDY4OSwgMHg1QzQ2LCAweDEyMkIsCi0gICAgMHg1QzQ4LCAweDA2RjYsIDB4NUM0QSwgMHgwQ0E3LCAweDVDNEIsIDB4MDUzMCwgMHg1QzRELCAweDA4QTEsCi0gICAgMHg1QzRFLCAweDEyMkMsIDB4NUM0RiwgMHgxMjJGLCAweDVDNTAsIDB4MTIyRSwgMHg1QzUxLCAweDA2RjUsCi0gICAgMHg1QzUzLCAweDEyMkQsIDB4NUM1NSwgMHgwQzMyLCAweDVDNUIsIDB4MUU5MiwgMHg1QzVFLCAweDBCMTAsCi0gICAgMHg1QzYwLCAweDBDNDUsIDB4NUM2MSwgMHgwOEY0LCAweDVDNjIsIDB4MUUwRCwgMHg1QzYzLCAweDM4OEYsCi0gICAgMHg1QzY0LCAweDBBREEsIDB4NUM2NSwgMHgwRjY0LCAweDVDNjksIDB4Mzg5MCwgMHg1QzZDLCAweDEyMzEsCi0gICAgMHg1QzZFLCAweDEyMzIsIDB4NUM2RiwgMHgwQ0FFLCAweDVDNzEsIDB4MDg4MSwgMHg1Qzc2LCAweDEyMzQsCi0gICAgMHg1Qzc5LCAweDEyMzUsIDB4NUM3QywgMHgzODkxLCAweDVDOEMsIDB4MTIzNiwgMHg1QzkwLCAweDA2MzAsCi0gICAgMHg1QzkxLCAweDEyMzcsIDB4NUM5NCwgMHgxMjM4LCAweDVDQTEsIDB4MDUyQywgMHg1Q0E2LCAweDIwRjYsCi0gICAgMHg1Q0E4LCAweDBBQkQsIDB4NUNBOSwgMHgwNjIwLCAweDVDQUIsIDB4MTIzQSwgMHg1Q0FDLCAweDBFQjQsCi0gICAgMHg1Q0IxLCAweDBCMzIsIDB4NUNCMywgMHgwNUI3LCAweDVDQjYsIDB4MTIzQywgMHg1Q0I3LCAweDEyM0UsCi0gICAgMHg1Q0I4LCAweDA2MUIsIDB4NUNCQSwgMHgyMEY3LCAweDVDQkIsIDB4MTIzQiwgMHg1Q0JDLCAweDEyM0QsCi0gICAgMHg1Q0JFLCAweDEyNDAsIDB4NUNDNSwgMHgxMjNGLCAweDVDQzcsIDB4MTI0MSwgMHg1Q0NCLCAweDM4OTIsCi0gICAgMHg1Q0QyLCAweDM4OTMsIDB4NUNEOSwgMHgxMjQyLCAweDVDRTAsIDB4MEM5NSwgMHg1Q0UxLCAweDA2QTYsCi0gICAgMHg1Q0U2LCAweDM3MkMsIDB4NUNFOCwgMHgwNTY1LCAweDVDRTksIDB4MTI0MywgMHg1Q0VBLCAweDEyNDgsCi0gICAgMHg1Q0VELCAweDEyNDYsIDB4NUNFRiwgMHgwRTQ3LCAweDVDRjAsIDB4MEU0NiwgMHg1Q0Y0LCAweDM4OTQsCi0gICAgMHg1Q0Y1LCAweDIwRjgsIDB4NUNGNiwgMHgwQzYxLCAweDVDRkEsIDB4MTI0NSwgMHg1Q0ZCLCAweDA5NUUsCi0gICAgMHg1Q0ZELCAweDEyNDQsIDB4NUQwNywgMHgwQTM4LCAweDVEMEIsIDB4MTI0OSwgMHg1RDBFLCAweDA4NUEsCi0gICAgMHg1RDExLCAweDEyNEYsIDB4NUQxNCwgMHgxMjUwLCAweDVEMTUsIDB4MTI0QSwgMHg1RDE2LCAweDA1OTEsCi0gICAgMHg1RDE3LCAweDEyNEIsIDB4NUQxOCwgMHgxMjU0LCAweDVEMTksIDB4MTI1MywgMHg1RDFBLCAweDEyNTIsCi0gICAgMHg1RDFCLCAweDEyNEUsIDB4NUQxRiwgMHgxMjRELCAweDVEMjIsIDB4MTI1MSwgMHg1RDI0LCAweDM4OTUsCi0gICAgMHg1RDI2LCAweDM4OTYsIDB4NUQyNywgMHgyMEY5LCAweDVEMjksIDB4MEU0OCwgMHg1RDQyLCAweDIwRkMsCi0gICAgMHg1RDQzLCAweDM4OTcsIDB4NUQ0NiwgMHgzODk4LCAweDVENEEsIDB4Mzg5OSwgMHg1RDRCLCAweDEyNTgsCi0gICAgMHg1RDRDLCAweDEyNTUsIDB4NUQ0RSwgMHgxMjU3LCAweDVENTAsIDB4MEY1QywgMHg1RDUyLCAweDEyNTYsCi0gICAgMHg1RDUzLCAweDIwRkEsIDB4NUQ1QywgMHgxMjRDLCAweDVENjksIDB4MEEzOSwgMHg1RDZDLCAweDEyNTksCi0gICAgMHg1RDZELCAweDIwRkQsIDB4NUQ2RiwgMHgwODI3LCAweDVENzMsIDB4MTI1QSwgMHg1RDc2LCAweDEyNUIsCi0gICAgMHg1RDgyLCAweDEyNUUsIDB4NUQ4NCwgMHgxMjVELCAweDVEODcsIDB4MTI1QywgMHg1RDhCLCAweDBDNjIsCi0gICAgMHg1RDhDLCAweDEyNDcsIDB4NUQ5MCwgMHgxMjY0LCAweDVEOTIsIDB4Mzg5QSwgMHg1RDk0LCAweDM4OUIsCi0gICAgMHg1RDk5LCAweDM4OUMsIDB4NUQ5RCwgMHgxMjYwLCAweDVEQTAsIDB4Mzg5RCwgMHg1REEyLCAweDEyNUYsCi0gICAgMHg1REFDLCAweDEyNjEsIDB4NURBRSwgMHgxMjYyLCAweDVEQjIsIDB4M0JBNSwgMHg1REI3LCAweDEyNjUsCi0gICAgMHg1REI4LCAweDIwRkUsIDB4NURCOSwgMHgyMEZGLCAweDVEQkEsIDB4MEZBRSwgMHg1REJDLCAweDEyNjYsCi0gICAgMHg1REJELCAweDEyNjMsIDB4NURDOSwgMHgxMjY3LCAweDVEQ0MsIDB4MDYxQywgMHg1RENELCAweDEyNjgsCi0gICAgMHg1REQwLCAweDIxMDAsIDB4NUREMiwgMHgxMjZBLCAweDVERDMsIDB4MTI2OSwgMHg1REQ2LCAweDEyNkIsCi0gICAgMHg1REQ4LCAweDM4OUUsIDB4NUREQiwgMHgxMjZDLCAweDVEREQsIDB4MEE5MiwgMHg1RERFLCAweDA5MkQsCi0gICAgMHg1REUwLCAweDM4OUYsIDB4NURFMSwgMHgwOTZFLCAweDVERTIsIDB4MzQzMiwgMHg1REUzLCAweDBBRTUsCi0gICAgMHg1REU1LCAweDA3QkIsIDB4NURFNiwgMHgwODI4LCAweDVERTcsIDB4MDdCQywgMHg1REU4LCAweDA2OEEsCi0gICAgMHg1REVCLCAweDEyNkQsIDB4NURFRSwgMHgwODI5LCAweDVERjEsIDB4MDc3RSwgMHg1REYyLCAweDEyNkUsCi0gICAgMHg1REYzLCAweDBFQjIsIDB4NURGNCwgMHgwQ0Y5LCAweDVERjUsIDB4MTI2RiwgMHg1REY3LCAweDA3QkQsCi0gICAgMHg1REY4LCAweDM4QTAsIDB4NURGQiwgMHgwNUU4LCAweDVERkQsIDB4MEI2NSwgMHg1REZFLCAweDA2Q0EsCi0gICAgMHg1REZGLCAweDM1RTIsIDB4NUUwMCwgMHgzOEExLCAweDVFMDIsIDB4MDhBMiwgMHg1RTAzLCAweDBEQ0QsCi0gICAgMHg1RTA2LCAweDBENTUsIDB4NUUwQiwgMHgxMjcwLCAweDVFMEMsIDB4MDYzMSwgMHg1RTExLCAweDEyNzMsCi0gICAgMHg1RTEyLCAweDM4QTIsIDB4NUUxNCwgMHgzOEEzLCAweDVFMTUsIDB4MzhBNCwgMHg1RTE2LCAweDBCQkQsCi0gICAgMHg1RTE4LCAweDM4QTUsIDB4NUUxOSwgMHgxMjcyLCAweDVFMUEsIDB4MTI3MSwgMHg1RTFCLCAweDEyNzQsCi0gICAgMHg1RTFELCAweDBDMDcsIDB4NUUyNSwgMHgwQTI5LCAweDVFMkIsIDB4MDhBMywgMHg1RTJELCAweDBBNkUsCi0gICAgMHg1RTJFLCAweDM4QTYsIDB4NUUyRiwgMHgwQjMzLCAweDVFMzAsIDB4MDYzQywgMHg1RTMzLCAweDBCQkUsCi0gICAgMHg1RTM2LCAweDEyNzUsIDB4NUUzNywgMHgxMjc2LCAweDVFMzgsIDB4MDlENywgMHg1RTNELCAweDBFNjcsCi0gICAgMHg1RTQwLCAweDEyNzksIDB4NUU0MywgMHgxMjc4LCAweDVFNDQsIDB4MTI3NywgMHg1RTQ1LCAweDBERUYsCi0gICAgMHg1RTQ3LCAweDEyODAsIDB4NUU0QywgMHgwRTg4LCAweDVFNEUsIDB4MTI3QSwgMHg1RTU0LCAweDEyN0MsCi0gICAgMHg1RTU1LCAweDBFOTksIDB4NUU1NywgMHgxMjdCLCAweDVFNTgsIDB4MzhBNywgMHg1RTVGLCAweDEyN0QsCi0gICAgMHg1RTYxLCAweDBEM0MsIDB4NUU2MiwgMHgxMjdFLCAweDVFNjMsIDB4MEUwRSwgMHg1RTY0LCAweDEyN0YsCi0gICAgMHg1RTZCLCAweDM4QTgsIDB4NUU2QywgMHgzOEE5LCAweDVFNzIsIDB4MDVFRiwgMHg1RTczLCAweDBFMEYsCi0gICAgMHg1RTc0LCAweDBDRTUsIDB4NUU3NSwgMHgxMjgxLCAweDVFNzYsIDB4MTI4MiwgMHg1RTc4LCAweDA3QkUsCi0gICAgMHg1RTc5LCAweDA1RjAsIDB4NUU3QSwgMHgxMjgzLCAweDVFN0IsIDB4MDc2QywgMHg1RTdDLCAweDBGMkUsCi0gICAgMHg1RTdELCAweDBGMTMsIDB4NUU3RSwgMHgwNjMyLCAweDVFN0YsIDB4MTI4NSwgMHg1RTgxLCAweDBCQkYsCi0gICAgMHg1RTgzLCAweDA3QkYsIDB4NUU4NCwgMHgwOTk5LCAweDVFODcsIDB4MEQ3MywgMHg1RThBLCAweDA5OUEsCi0gICAgMHg1RThGLCAweDA5ODIsIDB4NUU5NSwgMHgwQzA4LCAweDVFOTYsIDB4MEU0OSwgMHg1RTk3LCAweDBDMzMsCi0gICAgMHg1RTk5LCAweDM2QjAsIDB4NUU5QSwgMHgwN0MwLCAweDVFOUMsIDB4MERDRSwgMHg1RUEwLCAweDEyODYsCi0gICAgMHg1RUE2LCAweDBDNTMsIDB4NUVBNywgMHgwODMyLCAweDVFQTgsIDB4MzhBQSwgMHg1RUFBLCAweDM4QUIsCi0gICAgMHg1RUFCLCAweDA3N0YsIDB4NUVBRCwgMHgwQzA5LCAweDVFQjUsIDB4MDQ4NywgMHg1RUI2LCAweDA5NzgsCi0gICAgMHg1RUI3LCAweDA3QzEsIDB4NUVCOCwgMHgwRjMxLCAweDVFQkUsIDB4MzhBQywgMHg1RUJGLCAweDM4QUQsCi0gICAgMHg1RUMxLCAweDEyODcsIDB4NUVDMiwgMHgxMjg4LCAweDVFQzMsIDB4MEQwNywgMHg1RUM4LCAweDEyODksCi0gICAgMHg1RUM5LCAweDBGQkYsIDB4NUVDQSwgMHgwRkQzLCAweDVFQ0IsIDB4MzhBRSwgMHg1RUNGLCAweDEyOEIsCi0gICAgMHg1RUQwLCAweDEyOEEsIDB4NUVEMiwgMHgzOEFGLCAweDVFRDMsIDB4MDVBNSwgMHg1RUQ2LCAweDEyOEMsCi0gICAgMHg1RURBLCAweDEyOEYsIDB4NUVEQiwgMHgxMjkwLCAweDVFREQsIDB4MTI4RSwgMHg1RURGLCAweDBEQjIsCi0gICAgMHg1RUUwLCAweDA5OUIsIDB4NUVFMSwgMHgxMjkyLCAweDVFRTIsIDB4MTI5MSwgMHg1RUUzLCAweDEyOEQsCi0gICAgMHg1RUU4LCAweDEyOTMsIDB4NUVFOSwgMHgxMjk0LCAweDVFRUMsIDB4MTI5NSwgMHg1RUYwLCAweDEyOTgsCi0gICAgMHg1RUYxLCAweDEyOTYsIDB4NUVGMywgMHgxMjk3LCAweDVFRjQsIDB4MTI5OSwgMHg1RUY2LCAweDA1MDYsCi0gICAgMHg1RUY3LCAweDBDMEEsIDB4NUVGOCwgMHgxMjlBLCAweDVFRkEsIDB4MDc1MCwgMHg1RUZCLCAweDA1NzYsCi0gICAgMHg1RUZDLCAweDBDRUMsIDB4NUVGRSwgMHgxMjlCLCAweDVFRkYsIDB4MENEMywgMHg1RjAxLCAweDBFMkIsCi0gICAgMHg1RjAzLCAweDEyOUMsIDB4NUYwNCwgMHgwRkQ0LCAweDVGMDcsIDB4MzhCMCwgMHg1RjA5LCAweDEyOUQsCi0gICAgMHg1RjBBLCAweDBFMTAsIDB4NUYwQiwgMHgxMkEwLCAweDVGMEMsIDB4MEZGQSwgMHg1RjBELCAweDEwMEEsCi0gICAgMHg1RjBFLCAweDM4QjEsIDB4NUYwRiwgMHgwOERDLCAweDVGMTAsIDB4MENDRCwgMHg1RjExLCAweDEyQTEsCi0gICAgMHg1RjEzLCAweDA2NzcsIDB4NUYxNCwgMHgwQkMwLCAweDVGMTUsIDB4MDRCRSwgMHg1RjE2LCAweDEyQTIsCi0gICAgMHg1RjE3LCAweDBERjYsIDB4NUYxOCwgMHgwN0MyLCAweDVGMUIsIDB4MEI4RSwgMHg1RjFDLCAweDM4QjIsCi0gICAgMHg1RjFELCAweDM4QjMsIDB4NUYxRiwgMHgwQzBCLCAweDVGMjEsIDB4MjEwMSwgMHg1RjIyLCAweDM4QjQsCi0gICAgMHg1RjI1LCAweDBFRkIsIDB4NUYyNiwgMHgwNzZELCAweDVGMjcsIDB4MDc4MCwgMHg1RjI4LCAweDM4QjUsCi0gICAgMHg1RjI5LCAweDEyQTMsIDB4NUYyRCwgMHgxMkE0LCAweDVGMkYsIDB4MTJBQSwgMHg1RjMxLCAweDA5MTEsCi0gICAgMHg1RjM0LCAweDIxMDIsIDB4NUYzNSwgMHgwQkMxLCAweDVGMzYsIDB4MzhCNiwgMHg1RjM3LCAweDA2QTcsCi0gICAgMHg1RjM4LCAweDEyQTUsIDB4NUYzQSwgMHgzNTk4LCAweDVGM0IsIDB4MzhCNywgMHg1RjNDLCAweDBEOUQsCi0gICAgMHg1RjNFLCAweDBCODQsIDB4NUY0MCwgMHgzOEI4LCAweDVGNDEsIDB4MTJBNiwgMHg1RjQ1LCAweDIwQjIsCi0gICAgMHg1RjQ4LCAweDEyQTcsIDB4NUY0QSwgMHgwNkE4LCAweDVGNEMsIDB4MTJBOCwgMHg1RjRFLCAweDEyQTksCi0gICAgMHg1RjUwLCAweDM4QjksIDB4NUY1MSwgMHgxMkFCLCAweDVGNTMsIDB4MEM3MCwgMHg1RjU2LCAweDEyQUMsCi0gICAgMHg1RjU3LCAweDEyQUQsIDB4NUY1OCwgMHgzOEJBLCAweDVGNTksIDB4MTJBRSwgMHg1RjVDLCAweDEyOUYsCi0gICAgMHg1RjVELCAweDEyOUUsIDB4NUY2MSwgMHgxMkFGLCAweDVGNjIsIDB4MDcxNywgMHg1RjY0LCAweDM4QkIsCi0gICAgMHg1RjY1LCAweDM2QUMsIDB4NUY2NiwgMHgwRDk5LCAweDVGNjcsIDB4MjEwMywgMHg1RjY5LCAweDA4M0MsCi0gICAgMHg1RjZBLCAweDBEQTksIDB4NUY2QiwgMHgwQkMyLCAweDVGNkMsIDB4MERCRCwgMHg1RjZELCAweDEyQjAsCi0gICAgMHg1RjcwLCAweDA5OUMsIDB4NUY3MSwgMHgwNEU4LCAweDVGNzMsIDB4MTJCMSwgMHg1Rjc3LCAweDEyQjIsCi0gICAgMHg1Rjc5LCAweDBFRkUsIDB4NUY3QywgMHgwRDc0LCAweDVGN0YsIDB4MTJCNSwgMHg1RjgwLCAweDA1MUYsCi0gICAgMHg1RjgxLCAweDBBNTAsIDB4NUY4MiwgMHgxMkI0LCAweDVGODMsIDB4MTJCMywgMHg1Rjg0LCAweDA3MTgsCi0gICAgMHg1Rjg1LCAweDBCMzQsIDB4NUY4NywgMHgxMkI5LCAweDVGODgsIDB4MTJCNywgMHg1Rjg5LCAweDM4QkMsCi0gICAgMHg1RjhBLCAweDEyQjYsIDB4NUY4QiwgMHgwRjZGLCAweDVGOEMsIDB4MDc5OSwgMHg1RjkwLCAweDA5ODMsCi0gICAgMHg1RjkxLCAweDEyQjgsIDB4NUY5MiwgMHgwQzQ2LCAweDVGOTMsIDB4MDk0OCwgMHg1Rjk3LCAweDBDOTgsCi0gICAgMHg1Rjk4LCAweDEyQkMsIDB4NUY5OSwgMHgxMkJCLCAweDVGOUMsIDB4MzhCRCwgMHg1RjlFLCAweDEyQkEsCi0gICAgMHg1RkEwLCAweDEyQkQsIDB4NUZBMSwgMHgwNzlBLCAweDVGQTQsIDB4MzhCRiwgMHg1RkE3LCAweDM4QkUsCi0gICAgMHg1RkE4LCAweDEyQkUsIDB4NUZBOSwgMHgwREVFLCAweDVGQUEsIDB4MDk2NSwgMHg1RkFELCAweDEyQkYsCi0gICAgMHg1RkFFLCAweDBEOEQsIDB4NUZBRiwgMHgzOEMwLCAweDVGQjMsIDB4MEM5OSwgMHg1RkI0LCAweDBCQzMsCi0gICAgMHg1RkI1LCAweDM0MzgsIDB4NUZCNywgMHgyMTA0LCAweDVGQjgsIDB4MzhDMSwgMHg1RkI5LCAweDBDMkEsCi0gICAgMHg1RkJDLCAweDEyQzAsIDB4NUZCRCwgMHgwNjQ1LCAweDVGQzMsIDB4MDlGQSwgMHg1RkM0LCAweDM4QzIsCi0gICAgMHg1RkM1LCAweDBEOUUsIDB4NUZDOSwgMHgzOEMzLCAweDVGQ0MsIDB4MDYzMywgMHg1RkNELCAweDBDREMsCi0gICAgMHg1RkQ2LCAweDEyQzEsIDB4NUZENywgMHgwOEE0LCAweDVGRDgsIDB4MEU2OCwgMHg1RkQ5LCAweDBFNjksCi0gICAgMHg1RkRDLCAweDA1MjAsIDB4NUZERCwgMHgxMkM2LCAweDVGREUsIDB4MjEwNSwgMHg1RkUwLCAweDBCQTcsCi0gICAgMHg1RkUxLCAweDM4QzQsIDB4NUZFNCwgMHgxMkMzLCAweDVGRTksIDB4MzhDNSwgMHg1RkVCLCAweDA1NzcsCi0gICAgMHg1RkVELCAweDM4QzYsIDB4NUZGMCwgMHgxMkY2LCAweDVGRjEsIDB4MTJDNSwgMHg1RkY1LCAweDBDRTYsCi0gICAgMHg1RkY4LCAweDEyQzQsIDB4NUZGQiwgMHgxMkMyLCAweDVGRkMsIDB4MzhDNywgMHg1RkZELCAweDA4MEMsCi0gICAgMHg1RkZGLCAweDEyQzgsIDB4NjAwRSwgMHgxMkNFLCAweDYwMEYsIDB4MTJENCwgMHg2MDEwLCAweDEyQ0MsCi0gICAgMHg2MDEyLCAweDBDNTYsIDB4NjAxNSwgMHgxMkQxLCAweDYwMTYsIDB4MERDRiwgMHg2MDE3LCAweDM4QzgsCi0gICAgMHg2MDE5LCAweDEyQ0IsIDB4NjAxQSwgMHgzOEM5LCAweDYwMUIsIDB4MTJEMCwgMHg2MDFDLCAweDBGQUYsCi0gICAgMHg2MDFELCAweDA4QTUsIDB4NjAyMCwgMHgwQjM1LCAweDYwMjEsIDB4MTJDOSwgMHg2MDI1LCAweDA2NzgsCi0gICAgMHg2MDI2LCAweDEyRDMsIDB4NjAyNywgMHgwQTUxLCAweDYwMjgsIDB4MDUwNywgMHg2MDI5LCAweDEyQ0QsCi0gICAgMHg2MDJBLCAweDA1NzgsIDB4NjAyQiwgMHgxMkQyLCAweDYwMkYsIDB4MDZBOSwgMHg2MDMxLCAweDEyQ0YsCi0gICAgMHg2MDMzLCAweDM4Q0EsIDB4NjAzQSwgMHgxMkQ1LCAweDYwNDEsIDB4MTJENywgMHg2MDQyLCAweDEyRTEsCi0gICAgMHg2MDQzLCAweDEyREYsIDB4NjA0NiwgMHgxMkRDLCAweDYwNEEsIDB4MTJEQiwgMHg2MDRCLCAweDBGQzAsCi0gICAgMHg2MDRELCAweDEyREQsIDB4NjA1MCwgMHgwNkFBLCAweDYwNTIsIDB4MDdDMywgMHg2MDU1LCAweDA5ODQsCi0gICAgMHg2MDU5LCAweDEyRTQsIDB4NjA1QSwgMHgxMkQ2LCAweDYwNUQsIDB4MjEwNiwgMHg2MDVGLCAweDEyREEsCi0gICAgMHg2MDYwLCAweDEyQ0EsIDB4NjA2MSwgMHgzOENCLCAweDYwNjIsIDB4MDU3QSwgMHg2MDYzLCAweDEyREUsCi0gICAgMHg2MDY0LCAweDEyRTAsIDB4NjA2NSwgMHgwQjhGLCAweDYwNjgsIDB4MDgxOCwgMHg2MDY5LCAweDA1MzgsCi0gICAgMHg2MDZBLCAweDEyRDgsIDB4NjA2QiwgMHgxMkUzLCAweDYwNkMsIDB4MTJFMiwgMHg2MDZELCAweDA2QUIsCi0gICAgMHg2MDZGLCAweDBCMDksIDB4NjA3MCwgMHgwNUM0LCAweDYwNzUsIDB4MDcxOSwgMHg2MDc3LCAweDEyRDksCi0gICAgMHg2MDdGLCAweDM4Q0MsIDB4NjA4MSwgMHgxMkU1LCAweDYwODMsIDB4MTJFOCwgMHg2MDg0LCAweDEyRUEsCi0gICAgMHg2MDg1LCAweDIxMDcsIDB4NjA4OSwgMHgwOEU5LCAweDYwOEEsIDB4MjEwOCwgMHg2MDhCLCAweDEyRjAsCi0gICAgMHg2MDhDLCAweDBDMEMsIDB4NjA4RCwgMHgxMkU2LCAweDYwOTIsIDB4MTJFRSwgMHg2MDk0LCAweDA1NzksCi0gICAgMHg2MDk2LCAweDEyRUMsIDB4NjA5NywgMHgxMkVELCAweDYwOUEsIDB4MTJFOSwgMHg2MDlCLCAweDEyRUIsCi0gICAgMHg2MDlFLCAweDM4Q0QsIDB4NjA5RiwgMHgwNzlCLCAweDYwQTAsIDB4MEYxNCwgMHg2MEEzLCAweDA1RjEsCi0gICAgMHg2MEE0LCAweDM4Q0UsIDB4NjBBNiwgMHgwNEZCLCAweDYwQTcsIDB4MTJFRiwgMHg2MEE5LCAweDBDRjAsCi0gICAgMHg2MEFBLCAweDA0NzEsIDB4NjBCMCwgMHgzOENGLCAweDYwQjIsIDB4MEQ3NSwgMHg2MEIzLCAweDEyQzcsCi0gICAgMHg2MEI0LCAweDEyRjUsIDB4NjBCNSwgMHgxMkY5LCAweDYwQjYsIDB4MEVGMSwgMHg2MEI4LCAweDEyRjIsCi0gICAgMHg2MEJDLCAweDBDNjMsIDB4NjBCRCwgMHgxMkY3LCAweDYwQzUsIDB4MDlEOCwgMHg2MEM2LCAweDEyRjgsCi0gICAgMHg2MEM3LCAweDBDQUYsIDB4NjBDQiwgMHgzOEQwLCAweDYwRDEsIDB4MEZFRCwgMHg2MEQzLCAweDEyRjQsCi0gICAgMHg2MEQ1LCAweDIxMEEsIDB4NjBEOCwgMHgxMkZBLCAweDYwREEsIDB4MDgwRCwgMHg2MERCLCAweDM4RDEsCi0gICAgMHg2MERDLCAweDBBNkYsIDB4NjBERSwgMHgyMTA5LCAweDYwREYsIDB4MDQ5OCwgMHg2MEUwLCAweDEyRjMsCi0gICAgMHg2MEUxLCAweDEyRjEsIDB4NjBFMywgMHgwQURDLCAweDYwRTcsIDB4MTJFNywgMHg2MEU4LCAweDA4ODIsCi0gICAgMHg2MEYwLCAweDBCMjYsIDB4NjBGMSwgMHgxMzA2LCAweDYwRjIsIDB4MjEwQywgMHg2MEYzLCAweDBBREQsCi0gICAgMHg2MEY0LCAweDEzMDEsIDB4NjBGNiwgMHgxMkZFLCAweDYwRjcsIDB4MTJGRiwgMHg2MEY4LCAweDM4RDIsCi0gICAgMHg2MEY5LCAweDA5MTIsIDB4NjBGQSwgMHgxMzAyLCAweDYwRkIsIDB4MTMwNSwgMHg2MTAwLCAweDEzMDAsCi0gICAgMHg2MTAxLCAweDA5MkYsIDB4NjEwMywgMHgxMzAzLCAweDYxMDYsIDB4MTJGRCwgMHg2MTA4LCAweDBGMDgsCi0gICAgMHg2MTA5LCAweDBGMDcsIDB4NjEwRCwgMHgxMzA3LCAweDYxMEUsIDB4MTMwOCwgMHg2MTBGLCAweDA0OTksCi0gICAgMHg2MTExLCAweDIxMEQsIDB4NjExMiwgMHgzOEQzLCAweDYxMTMsIDB4MzhENCwgMHg2MTE0LCAweDM4RDUsCi0gICAgMHg2MTE1LCAweDEyRkMsIDB4NjExQSwgMHgwNkVBLCAweDYxMUIsIDB4MDQ2QSwgMHg2MTFDLCAweDM4RDYsCi0gICAgMHg2MTFGLCAweDA1RjIsIDB4NjEyMCwgMHgyMTBCLCAweDYxMjEsIDB4MTMwNCwgMHg2MTI3LCAweDEzMEMsCi0gICAgMHg2MTI4LCAweDEzMEIsIDB4NjEyQywgMHgxMzEwLCAweDYxMzAsIDB4MjEwRiwgMHg2MTM0LCAweDEzMTEsCi0gICAgMHg2MTM3LCAweDIxMEUsIDB4NjEzQywgMHgxMzBGLCAweDYxM0QsIDB4MTMxMiwgMHg2MTNFLCAweDEzMEEsCi0gICAgMHg2MTNGLCAweDEzMEUsIDB4NjE0MiwgMHgxMzEzLCAweDYxNDQsIDB4MTMxNCwgMHg2MTQ3LCAweDEzMDksCi0gICAgMHg2MTQ4LCAweDA4Q0EsIDB4NjE0QSwgMHgxMzBELCAweDYxNEIsIDB4MEIzNiwgMHg2MTRDLCAweDA3QzQsCi0gICAgMHg2MTRELCAweDEyRkIsIDB4NjE0RSwgMHgwOUZCLCAweDYxNTMsIDB4MTMyMSwgMHg2MTU1LCAweDBFMzksCi0gICAgMHg2MTU4LCAweDEzMTcsIDB4NjE1OSwgMHgxMzE4LCAweDYxNUEsIDB4MTMxOSwgMHg2MTVELCAweDEzMjAsCi0gICAgMHg2MTVGLCAweDEzMUYsIDB4NjE2MiwgMHgwRUFCLCAweDYxNjMsIDB4MDVGMywgMHg2MTY1LCAweDEzMUQsCi0gICAgMHg2MTY3LCAweDA3MUIsIDB4NjE2OCwgMHgwNTkyLCAweDYxNkIsIDB4MTMxQSwgMHg2MTZFLCAweDBGODAsCi0gICAgMHg2MTZGLCAweDEzMUMsIDB4NjE3MCwgMHgwNDlBLCAweDYxNzEsIDB4MTMxRSwgMHg2MTczLCAweDEzMTUsCi0gICAgMHg2MTc0LCAweDEzMUIsIDB4NjE3NSwgMHgxMzIyLCAweDYxNzYsIDB4MDcxQSwgMHg2MTc3LCAweDEzMTYsCi0gICAgMHg2MTdDLCAweDM4RDcsIDB4NjE3RSwgMHgwRjQ3LCAweDYxODIsIDB4MEYxNSwgMHg2MTg3LCAweDEzMjUsCi0gICAgMHg2MThBLCAweDEzMjksIDB4NjE4RCwgMHgzOEQ4LCAweDYxOEUsIDB4MEIwMCwgMHg2MTkwLCAweDBGQzEsCi0gICAgMHg2MTkxLCAweDEzMkEsIDB4NjE5NCwgMHgxMzI3LCAweDYxOTYsIDB4MTMyNCwgMHg2MTk4LCAweDIxMTAsCi0gICAgMHg2MTk5LCAweDEzMjMsIDB4NjE5QSwgMHgxMzI4LCAweDYxOUYsIDB4MzhEOSwgMHg2MUE0LCAweDBFMDAsCi0gICAgMHg2MUE3LCAweDBDOEMsIDB4NjFBOCwgMHgzOERBLCAweDYxQTksIDB4MDcxQywgMHg2MUFCLCAweDEzMkIsCi0gICAgMHg2MUFDLCAweDEzMjYsIDB4NjFBRSwgMHgxMzJDLCAweDYxQjIsIDB4MDc1MSwgMHg2MUI2LCAweDA1MzEsCi0gICAgMHg2MUJBLCAweDEzMzQsIDB4NjFCRSwgMHgwNUY0LCAweDYxQzIsIDB4MzhEQiwgMHg2MUMzLCAweDEzMzIsCi0gICAgMHg2MUM2LCAweDEzMzMsIDB4NjFDNywgMHgwODE5LCAweDYxQzgsIDB4MTMzMSwgMHg2MUM5LCAweDEzMkYsCi0gICAgMHg2MUNBLCAweDEzMkUsIDB4NjFDQiwgMHgxMzM1LCAweDYxQ0MsIDB4MTMyRCwgMHg2MUNELCAweDEzMzcsCi0gICAgMHg2MUQwLCAweDA1N0IsIDB4NjFERiwgMHgzOERDLCAweDYxRTMsIDB4MTMzOSwgMHg2MUU2LCAweDEzMzgsCi0gICAgMHg2MUYyLCAweDBCQzQsIDB4NjFGNCwgMHgxMzNDLCAweDYxRjYsIDB4MTMzQSwgMHg2MUY3LCAweDEzMzAsCi0gICAgMHg2MUY4LCAweDA3NTIsIDB4NjFGQSwgMHgxMzNCLCAweDYxRkMsIDB4MTMzRiwgMHg2MUZELCAweDEzM0UsCi0gICAgMHg2MUZFLCAweDEzNDAsIDB4NjFGRiwgMHgxMzNELCAweDYyMDAsIDB4MTM0MSwgMHg2MjA4LCAweDEzNDIsCi0gICAgMHg2MjA5LCAweDEzNDMsIDB4NjIwQSwgMHgwRTNBLCAweDYyMEMsIDB4MTM0NSwgMHg2MjBELCAweDEzNDQsCi0gICAgMHg2MjBFLCAweDA5NDksIDB4NjIxMCwgMHgwQTUyLCAweDYyMTEsIDB4MDU2NiwgMHg2MjEyLCAweDA1N0MsCi0gICAgMHg2MjEzLCAweDIxMTEsIDB4NjIxNCwgMHgxMzQ2LCAweDYyMTUsIDB4MzhERCwgMHg2MjE2LCAweDA0ODMsCi0gICAgMHg2MjFBLCAweDBBNzAsIDB4NjIxQiwgMHgxMzQ3LCAweDYyMUQsIDB4MUE2NCwgMHg2MjFFLCAweDEzNDgsCi0gICAgMHg2MjFGLCAweDA3MzcsIDB4NjIyMSwgMHgxMzQ5LCAweDYyMjYsIDB4MEE5MywgMHg2MjI5LCAweDM4REUsCi0gICAgMHg2MjJBLCAweDEzNEEsIDB4NjIyRSwgMHgxMzRCLCAweDYyMkYsIDB4MDY1NCwgMHg2MjMwLCAweDEzNEMsCi0gICAgMHg2MjMyLCAweDEzNEQsIDB4NjIzMywgMHgxMzRFLCAweDYyMzQsIDB4MEIzNywgMHg2MjM2LCAweDM1QkQsCi0gICAgMHg2MjM4LCAweDA3ODEsIDB4NjIzQiwgMHgwRUVELCAweDYyM0UsIDB4MzQ0RSwgMHg2MjNGLCAweDBFNkEsCi0gICAgMHg2MjQwLCAweDA5NzQsIDB4NjI0MSwgMHgxMzRGLCAweDYyNDMsIDB4MzhERiwgMHg2MjQ2LCAweDM4RTAsCi0gICAgMHg2MjQ3LCAweDBBOTQsIDB4NjI0OCwgMHgxQjFBLCAweDYyNDksIDB4MEQ3NiwgMHg2MjRCLCAweDA5MTYsCi0gICAgMHg2MjRDLCAweDM4RTEsIDB4NjI0RCwgMHgwODNELCAweDYyNEUsIDB4MTM1MCwgMHg2MjUxLCAweDM4RTIsCi0gICAgMHg2MjUzLCAweDBCMjcsIDB4NjI1NSwgMHgwREY3LCAweDYyNTYsIDB4MzhFMywgMHg2MjU4LCAweDBCNTEsCi0gICAgMHg2MjVCLCAweDEzNTMsIDB4NjI1RSwgMHgxMzUxLCAweDYyNjAsIDB4MTM1NCwgMHg2MjYzLCAweDEzNTIsCi0gICAgMHg2MjY4LCAweDEzNTUsIDB4NjI2RSwgMHgwRTAxLCAweDYyNzEsIDB4MDQ3QiwgMHg2Mjc2LCAweDBERDAsCi0gICAgMHg2Mjc5LCAweDBENzcsIDB4NjI3QywgMHgxMzU2LCAweDYyN0UsIDB4MTM1OSwgMHg2MjdGLCAweDA5OUQsCi0gICAgMHg2MjgwLCAweDA2NTUsIDB4NjI4MiwgMHgxMzU3LCAweDYyODMsIDB4MTM1RSwgMHg2Mjg0LCAweDA5OUUsCi0gICAgMHg2Mjg1LCAweDM1QzUsIDB4NjI4OSwgMHgxMzU4LCAweDYyOEEsIDB4MENGQSwgMHg2MjkxLCAweDBGNDgsCi0gICAgMHg2MjkyLCAweDEzNUEsIDB4NjI5MywgMHgxMzVCLCAweDYyOTQsIDB4MTM1RiwgMHg2Mjk1LCAweDBDNjQsCi0gICAgMHg2Mjk2LCAweDEzNUMsIDB4NjI5NywgMHgwN0M1LCAweDYyOTgsIDB4MEE4MiwgMHg2MjlCLCAweDEzNkQsCi0gICAgMHg2MjlDLCAweDBENDgsIDB4NjI5RSwgMHgwQjUyLCAweDYyQTYsIDB4MjExMiwgMHg2MkFCLCAweDBENzgsCi0gICAgMHg2MkFDLCAweDEzQjIsIDB4NjJCMSwgMHgwRTRBLCAweDYyQjUsIDB4MEMwRCwgMHg2MkI5LCAweDBFQTMsCi0gICAgMHg2MkJCLCAweDEzNjIsIDB4NjJCQywgMHgwNTIxLCAweDYyQkQsIDB4MEJBOCwgMHg2MkMyLCAweDEzNkIsCi0gICAgMHg2MkM0LCAweDM4RTQsIDB4NjJDNSwgMHgwQjcyLCAweDYyQzYsIDB4MTM2NSwgMHg2MkM3LCAweDEzNkMsCi0gICAgMHg2MkM4LCAweDEzNjcsIDB4NjJDOSwgMHgxMzZFLCAweDYyQ0EsIDB4MTM2QSwgMHg2MkNDLCAweDEzNjksCi0gICAgMHg2MkNELCAweDBEMjUsIDB4NjJDRiwgMHgxMzYzLCAweDYyRDAsIDB4MDU3RCwgMHg2MkQxLCAweDEzNjEsCi0gICAgMHg2MkQyLCAweDA2OEIsIDB4NjJEMywgMHgwQjUzLCAweDYyRDQsIDB4MTM1RCwgMHg2MkQ3LCAweDEzNjAsCi0gICAgMHg2MkQ4LCAweDA3QzYsIDB4NjJEOSwgMHgwQTdGLCAweDYyREIsIDB4MDk5RiwgMHg2MkRDLCAweDEzNjgsCi0gICAgMHg2MkRELCAweDBEMDgsIDB4NjJFMCwgMHgwNjhDLCAweDYyRTEsIDB4MDVBNiwgMHg2MkVDLCAweDA1QzUsCi0gICAgMHg2MkVELCAweDA5RTcsIDB4NjJFRSwgMHgxMzcwLCAweDYyRUYsIDB4MTM3NSwgMHg2MkYxLCAweDEzNzEsCi0gICAgMHg2MkYzLCAweDA3NTMsIDB4NjJGNSwgMHgxMzc2LCAweDYyRjYsIDB4MDg3MCwgMHg2MkY3LCAweDA3RkIsCi0gICAgMHg2MkZDLCAweDM4RTUsIDB4NjJGRSwgMHgwOTMwLCAweDYyRkYsIDB4MTM2NCwgMHg2MzAxLCAweDA4Q0IsCi0gICAgMHg2MzAyLCAweDEzNzMsIDB4NjMwNywgMHgwOEE2LCAweDYzMDgsIDB4MTM3NCwgMHg2MzA5LCAweDA0ODgsCi0gICAgMHg2MzBBLCAweDM4RTYsIDB4NjMwQywgMHgxMzZGLCAweDYzMEQsIDB4MzhFNywgMHg2MzExLCAweDBCQzUsCi0gICAgMHg2MzE4LCAweDM4RTgsIDB4NjMxOSwgMHgwNjhELCAweDYzMUIsIDB4MzczNywgMHg2MzFGLCAweDA2QUMsCi0gICAgMHg2MzI3LCAweDEzNzIsIDB4NjMyOCwgMHgwNDZCLCAweDYzMkIsIDB4MDgzMywgMHg2MzJGLCAweDA5RkMsCi0gICAgMHg2MzM5LCAweDM4RTksIDB4NjMzQSwgMHgwQzBFLCAweDYzM0QsIDB4MEQ2OCwgMHg2MzNFLCAweDEzNzgsCi0gICAgMHg2MzNGLCAweDBBRTAsIDB4NjM0MiwgMHgzOEVBLCAweDYzNDMsIDB4MzhFQiwgMHg2MzQ5LCAweDBCMEEsCi0gICAgMHg2MzRDLCAweDA4NzksIDB4NjM0RCwgMHgxMzc5LCAweDYzNEYsIDB4MTM3QiwgMHg2MzUwLCAweDEzNzcsCi0gICAgMHg2MzU1LCAweDBFMzEsIDB4NjM1NywgMHgwQkQ5LCAweDYzNUMsIDB4MEFERSwgMHg2MzY1LCAweDM4RUMsCi0gICAgMHg2MzY3LCAweDBFNEIsIDB4NjM2OCwgMHgwOEZBLCAweDYzNjksIDB4MTM4NywgMHg2MzZCLCAweDEzODYsCi0gICAgMHg2MzZFLCAweDBBM0UsIDB4NjM3MiwgMHgwNzU0LCAweDYzNzQsIDB4MzhFRCwgMHg2Mzc2LCAweDEzODAsCi0gICAgMHg2Mzc3LCAweDA5QTEsIDB4NjM3QSwgMHgwQ0MwLCAweDYzN0IsIDB4MENFNywgMHg2MzdELCAweDM4RUUsCi0gICAgMHg2MzgwLCAweDEzN0UsIDB4NjM4MywgMHgwQURGLCAweDYzODQsIDB4MzhFRiwgMHg2Mzg3LCAweDM4RjAsCi0gICAgMHg2Mzg4LCAweDA5MjQsIDB4NjM4OSwgMHgxMzgzLCAweDYzOEMsIDB4MDlBMCwgMHg2MzhFLCAweDEzN0QsCi0gICAgMHg2MzhGLCAweDEzODIsIDB4NjM5MCwgMHgzOEYxLCAweDYzOTIsIDB4MEQwOSwgMHg2Mzk2LCAweDEzN0MsCi0gICAgMHg2Mzk4LCAweDA2RjcsIDB4NjM5QiwgMHgwNUJCLCAweDYzOUUsIDB4MzhGMiwgMHg2MzlGLCAweDEzODQsCi0gICAgMHg2M0EwLCAweDBGNzMsIDB4NjNBMSwgMHgwODNFLCAweDYzQTIsIDB4MEI3MywgMHg2M0EzLCAweDEzODEsCi0gICAgMHg2M0E1LCAweDBBODAsIDB4NjNBNywgMHgwN0M3LCAweDYzQTgsIDB4MEEyQSwgMHg2M0E5LCAweDA1MDgsCi0gICAgMHg2M0FBLCAweDBBQkUsIDB4NjNBQiwgMHgxMzdGLCAweDYzQUMsIDB4MDY1RiwgMHg2M0IyLCAweDA3MUQsCi0gICAgMHg2M0I0LCAweDBCRUIsIDB4NjNCNSwgMHgxMzg1LCAweDYzQkIsIDB4MEFFMSwgMHg2M0JFLCAweDEzODgsCi0gICAgMHg2M0MwLCAweDEzOEEsIDB4NjNDMywgMHgwQjE3LCAweDYzQzQsIDB4MTM5MCwgMHg2M0M2LCAweDEzOEIsCi0gICAgMHg2M0M5LCAweDEzOEQsIDB4NjNDRiwgMHgwREIzLCAweDYzRDAsIDB4MEMwRiwgMHg2M0QxLCAweDM4RjMsCi0gICAgMHg2M0QyLCAweDEzOEUsIDB4NjNENiwgMHgwRjE2LCAweDYzREEsIDB4MEYzMiwgMHg2M0RCLCAweDA1RjUsCi0gICAgMHg2M0RDLCAweDM4RjQsIDB4NjNFMSwgMHgwNDcyLCAweDYzRTMsIDB4MTM4QywgMHg2M0U5LCAweDEzODksCi0gICAgMHg2M0VELCAweDM0MUMsIDB4NjNFRSwgMHgwNjM0LCAweDYzRjQsIDB4MDUwOSwgMHg2M0Y1LCAweDIxMTMsCi0gICAgMHg2M0Y2LCAweDEzOEYsIDB4NjNGNywgMHgzNjQ0LCAweDYzRkEsIDB4MEYzMywgMHg2NDA2LCAweDEzOTMsCi0gICAgMHg2NDA5LCAweDM4RjUsIDB4NjQwRCwgMHgwQjFCLCAweDY0MEYsIDB4MTM5QSwgMHg2NDEwLCAweDM4RjYsCi0gICAgMHg2NDEzLCAweDEzOTQsIDB4NjQxNCwgMHgxRTJDLCAweDY0MTYsIDB4MTM5MSwgMHg2NDE3LCAweDEzOTgsCi0gICAgMHg2NDFDLCAweDEzN0EsIDB4NjQyMiwgMHgzOEY3LCAweDY0MjYsIDB4MTM5NSwgMHg2NDI4LCAweDEzOTksCi0gICAgMHg2NDJDLCAweDBENTYsIDB4NjQyRCwgMHgwQzY1LCAweDY0MzQsIDB4MTM5MiwgMHg2NDM2LCAweDEzOTYsCi0gICAgMHg2NDNBLCAweDA3MUUsIDB4NjQzRSwgMHgwODYxLCAweDY0NDIsIDB4MEE4MSwgMHg2NDRFLCAweDEzOUUsCi0gICAgMHg2NDUxLCAweDFFNDMsIDB4NjQ1NCwgMHgzOEY4LCAweDY0NTgsIDB4MEMyMCwgMHg2NDVCLCAweDM4RjksCi0gICAgMHg2NDYwLCAweDIxMTQsIDB4NjQ2NywgMHgxMzlCLCAweDY0NjksIDB4MEU4RSwgMHg2NDZELCAweDM4RkEsCi0gICAgMHg2NDZGLCAweDEzOUMsIDB4NjQ3NiwgMHgxMzlELCAweDY0NzgsIDB4MEVEQSwgMHg2NDdBLCAweDBBNDYsCi0gICAgMHg2NDdCLCAweDM4RkIsIDB4NjQ4MywgMHgwNzM4LCAweDY0ODgsIDB4MTNBNCwgMHg2NDkyLCAweDA4ODMsCi0gICAgMHg2NDkzLCAweDEzQTEsIDB4NjQ5NSwgMHgxM0EwLCAweDY0OUEsIDB4MENFOCwgMHg2NDlELCAweDIxMTUsCi0gICAgMHg2NDlFLCAweDBDOEQsIDB4NjRBNCwgMHgwQzJCLCAweDY0QTUsIDB4MTNBMiwgMHg2NEE5LCAweDEzQTMsCi0gICAgMHg2NEFCLCAweDBERTEsIDB4NjRBRCwgMHgwQ0ZCLCAweDY0QUUsIDB4MDg3MSwgMHg2NEIwLCAweDBBOTUsCi0gICAgMHg2NEIyLCAweDBFN0UsIDB4NjRCOSwgMHgwNUE3LCAweDY0QkIsIDB4MTNBQSwgMHg2NEJDLCAweDEzQTUsCi0gICAgMHg2NEJFLCAweDM4RkMsIDB4NjRCRiwgMHgzOEZELCAweDY0QzEsIDB4MEYzNCwgMHg2NEMyLCAweDEzQUMsCi0gICAgMHg2NEM1LCAweDEzQTgsIDB4NjRDNywgMHgxM0E5LCAweDY0Q0EsIDB4MzQxRCwgMHg2NENELCAweDBBRTIsCi0gICAgMHg2NENFLCAweDIxMTYsIDB4NjREMiwgMHgxM0E3LCAweDY0RDQsIDB4MTM2NiwgMHg2NEQ4LCAweDEzQUIsCi0gICAgMHg2NERBLCAweDEzQTYsIDB4NjRFMCwgMHgxM0IwLCAweDY0RTEsIDB4MTNCMSwgMHg2NEUyLCAweDBDMjEsCi0gICAgMHg2NEUzLCAweDEzQjMsIDB4NjRFNSwgMHgzOEZFLCAweDY0RTYsIDB4MDg3MiwgMHg2NEU3LCAweDEzQUUsCi0gICAgMHg2NEVDLCAweDA2NTYsIDB4NjRFRiwgMHgxM0I0LCAweDY0RjEsIDB4MTNBRCwgMHg2NEYyLCAweDEzQjgsCi0gICAgMHg2NEY0LCAweDEzQjcsIDB4NjRGNiwgMHgxM0I2LCAweDY0RjcsIDB4MzhGRiwgMHg2NEZBLCAweDEzQjksCi0gICAgMHg2NEZCLCAweDM5MDAsIDB4NjRGRCwgMHgxM0JCLCAweDY0RkUsIDB4MDlEOSwgMHg2NTAwLCAweDEzQkEsCi0gICAgMHg2NTA0LCAweDM5MDEsIDB4NjUwNSwgMHgxM0JFLCAweDY1MTYsIDB4MzkwMiwgMHg2NTE4LCAweDEzQkMsCi0gICAgMHg2NTE5LCAweDM5MDMsIDB4NjUxQywgMHgxM0JELCAweDY1MUQsIDB4MTM5NywgMHg2NTIyLCAweDFFOTcsCi0gICAgMHg2NTIzLCAweDEzQzAsIDB4NjUyNCwgMHgxM0JGLCAweDY1MkEsIDB4MTM5RiwgMHg2NTJCLCAweDEzQzEsCi0gICAgMHg2NTJDLCAweDEzQjUsIDB4NjUyRiwgMHgwOEE3LCAweDY1MzQsIDB4MTNDMiwgMHg2NTM1LCAweDEzQzMsCi0gICAgMHg2NTM2LCAweDEzQzUsIDB4NjUzNywgMHgxM0M0LCAweDY1MzgsIDB4MTNDNiwgMHg2NTM5LCAweDA1N0UsCi0gICAgMHg2NTNCLCAweDA3QzgsIDB4NjUzRSwgMHgwRTRDLCAweDY1M0YsIDB4MEE1MywgMHg2NTQ1LCAweDA3ODIsCi0gICAgMHg2NTQ3LCAweDM5MDQsIDB4NjU0OCwgMHgxM0M4LCAweDY1NEQsIDB4MTNDQiwgMHg2NTRFLCAweDIxMTcsCi0gICAgMHg2NTRGLCAweDBEQzQsIDB4NjU1MSwgMHgwNjc5LCAweDY1NTUsIDB4MTNDQSwgMHg2NTU2LCAweDEzQzksCi0gICAgMHg2NTU3LCAweDBEMEEsIDB4NjU1OCwgMHgxM0NDLCAweDY1NTksIDB4MDZBRCwgMHg2NTVELCAweDEzQ0UsCi0gICAgMHg2NTVFLCAweDEzQ0QsIDB4NjU2MiwgMHgwNUY2LCAweDY1NjMsIDB4MDg4NCwgMHg2NTY2LCAweDBDQjAsCi0gICAgMHg2NTY3LCAweDM5MDUsIDB4NjU2QywgMHgwNzFGLCAweDY1NzAsIDB4MEEzQSwgMHg2NTcyLCAweDEzQ0YsCi0gICAgMHg2NTc0LCAweDBBNTQsIDB4NjU3NSwgMHgwQzIyLCAweDY1NzcsIDB4MEREMSwgMHg2NTc4LCAweDEzRDAsCi0gICAgMHg2NTgxLCAweDM5MDYsIDB4NjU4MiwgMHgxM0QxLCAweDY1ODMsIDB4MTNEMiwgMHg2NTg1LCAweDM5MDcsCi0gICAgMHg2NTg3LCAweDBFMDgsIDB4NjU4OCwgMHgxMjBDLCAweDY1ODksIDB4MEE2QSwgMHg2NThDLCAweDBEQkUsCi0gICAgMHg2NThFLCAweDA4NDgsIDB4NjU5MCwgMHgwRDc5LCAweDY1OTEsIDB4MEQ1NywgMHg2NTk3LCAweDBDNDcsCi0gICAgMHg2NTk5LCAweDBGODksIDB4NjU5QiwgMHgxM0Q0LCAweDY1OUMsIDB4MDhGQywgMHg2NTlGLCAweDEzRDUsCi0gICAgMHg2NUExLCAweDA0N0EsIDB4NjVBNCwgMHgwNkNDLCAweDY1QTUsIDB4MEE3MSwgMHg2NUE3LCAweDBERDIsCi0gICAgMHg2NUFCLCAweDEzRDYsIDB4NjVBQywgMHgwODkwLCAweDY1QUQsIDB4MEI4NSwgMHg2NUFGLCAweDA4QTksCi0gICAgMHg2NUIwLCAweDA5RkQsIDB4NjVCNywgMHgxM0Q3LCAweDY1QjksIDB4MEU0RCwgMHg2NUJDLCAweDA1MTksCi0gICAgMHg2NUJELCAweDA4QUEsIDB4NjVDMSwgMHgxM0RBLCAweDY1QzIsIDB4MzkwOCwgMHg2NUMzLCAweDEzRDgsCi0gICAgMHg2NUM0LCAweDEzREIsIDB4NjVDNSwgMHgwRjgxLCAweDY1QzYsIDB4MTNEOSwgMHg2NUNCLCAweDBBOUYsCi0gICAgMHg2NUNDLCAweDEzREMsIDB4NjVDRiwgMHgwQjEyLCAweDY1RDIsIDB4MTNERCwgMHg2NUQ3LCAweDA2MzYsCi0gICAgMHg2NUQ5LCAweDEzREYsIDB4NjVEQiwgMHgxM0RFLCAweDY1RTAsIDB4MTNFMCwgMHg2NUUxLCAweDEzRTEsCi0gICAgMHg2NUUyLCAweDA2MzcsIDB4NjVFMywgMHgzNTg1LCAweDY1RTUsIDB4MENENCwgMHg2NUU2LCAweDBCNzQsCi0gICAgMHg2NUU3LCAweDA2ODYsIDB4NjVFOCwgMHgwOEFCLCAweDY1RTksIDB4MEFFMywgMHg2NUVDLCAweDA5NjYsCi0gICAgMHg2NUVELCAweDA0NzQsIDB4NjVGMCwgMHgzOTA5LCAweDY1RjEsIDB4MTNFMiwgMHg2NUYyLCAweDM5MEEsCi0gICAgMHg2NUZBLCAweDA1MjIsIDB4NjVGQiwgMHgxM0U2LCAweDY2MDAsIDB4MjExOCwgMHg2NjAyLCAweDA3QzksCi0gICAgMHg2NjAzLCAweDEzRTUsIDB4NjYwNiwgMHgwODFCLCAweDY2MDcsIDB4MDlBMiwgMHg2NjA5LCAweDIxMUEsCi0gICAgMHg2NjBBLCAweDEzRTQsIDB4NjYwQywgMHgwOUEzLCAweDY2MEUsIDB4MEVDQywgMHg2NjBGLCAweDA4MUEsCi0gICAgMHg2NjEzLCAweDA0OUIsIDB4NjYxNCwgMHgwQTcyLCAweDY2MTUsIDB4MjExOSwgMHg2NjFDLCAweDEzRUIsCi0gICAgMHg2NjFFLCAweDIxMUMsIDB4NjYxRiwgMHgwQTU1LCAweDY2MjAsIDB4MDRFOSwgMHg2NjI0LCAweDIxMUQsCi0gICAgMHg2NjI1LCAweDA5NUYsIDB4NjYyNywgMHgwRTk0LCAweDY2MjgsIDB4MDg2MiwgMHg2NjJDLCAweDM5MEIsCi0gICAgMHg2NjJELCAweDA5QTQsIDB4NjYyRSwgMHgyMTFCLCAweDY2MkYsIDB4MEE0QiwgMHg2NjMxLCAweDIwQUUsCi0gICAgMHg2NjM0LCAweDEzRUEsIDB4NjYzNSwgMHgxM0U4LCAweDY2MzYsIDB4MTNFOSwgMHg2NjNCLCAweDFFMDAsCi0gICAgMHg2NjNDLCAweDBCQTksIDB4NjYzRiwgMHgxNDA5LCAweDY2NDEsIDB4MTNFRiwgMHg2NjQyLCAweDA4Q0MsCi0gICAgMHg2NjQzLCAweDA3Q0EsIDB4NjY0NCwgMHgxM0VELCAweDY2NDksIDB4MTNFRSwgMHg2NjRCLCAweDA5RkUsCi0gICAgMHg2NjRDLCAweDM5MEMsIDB4NjY0RiwgMHgxM0VDLCAweDY2NTIsIDB4MDg3RCwgMHg2NjU3LCAweDIxMUYsCi0gICAgMHg2NjU5LCAweDIxMjAsIDB4NjY1QiwgMHgzOTBELCAweDY2NUMsIDB4MzkwRSwgMHg2NjVELCAweDEzRjEsCi0gICAgMHg2NjVFLCAweDEzRjAsIDB4NjY1RiwgMHgxM0Y1LCAweDY2NjEsIDB4MzkwRiwgMHg2NjYyLCAweDEzRjYsCi0gICAgMHg2NjYzLCAweDM3M0EsIDB4NjY2NCwgMHgxM0YyLCAweDY2NjUsIDB4MjExRSwgMHg2NjY2LCAweDA1ODAsCi0gICAgMHg2NjY3LCAweDEzRjMsIDB4NjY2OCwgMHgxM0Y0LCAweDY2NjksIDB4MEQ2OSwgMHg2NjZCLCAweDM5MTAsCi0gICAgMHg2NjZFLCAweDBERDMsIDB4NjY2RiwgMHgwNzIwLCAweDY2NzAsIDB4MTNGNywgMHg2NjczLCAweDIxMjIsCi0gICAgMHg2Njc0LCAweDBBNTYsIDB4NjY3NiwgMHgwOUE1LCAweDY2NzcsIDB4MzkxMSwgMHg2NjdBLCAweDBCOTAsCi0gICAgMHg2NjgxLCAweDA2QkYsIDB4NjY4MywgMHgxM0Y4LCAweDY2ODQsIDB4MTNGQywgMHg2Njg3LCAweDA1NEIsCi0gICAgMHg2Njg4LCAweDEzRjksIDB4NjY4OSwgMHgxM0ZCLCAweDY2OEUsIDB4MTNGQSwgMHg2NjkxLCAweDA5NzUsCi0gICAgMHg2Njk2LCAweDBCODYsIDB4NjY5NywgMHgwNDg5LCAweDY2OTgsIDB4MTNGRCwgMHg2Njk5LCAweDIxMjMsCi0gICAgMHg2NjlELCAweDEzRkUsIDB4NjZBMCwgMHgyMTI0LCAweDY2QTIsIDB4MEJDNiwgMHg2NkE0LCAweDM5MTIsCi0gICAgMHg2NkE2LCAweDBGQjksIDB4NjZBQiwgMHgwODkxLCAweDY2QUUsIDB4MEUzQiwgMHg2NkIyLCAweDIxMjUsCi0gICAgMHg2NkI0LCAweDBFNkIsIDB4NjZCOCwgMHgxNDA1LCAweDY2QjksIDB4MTQwMCwgMHg2NkJDLCAweDE0MDMsCi0gICAgMHg2NkJFLCAweDE0MDIsIDB4NjZCRiwgMHgyMTI2LCAweDY2QzEsIDB4MTNGRiwgMHg2NkM0LCAweDE0MDQsCi0gICAgMHg2NkM2LCAweDM0NTUsIDB4NjZDNywgMHgwQ0I2LCAweDY2QzgsIDB4MzkxMywgMHg2NkM5LCAweDE0MDEsCi0gICAgMHg2NkQ2LCAweDE0MDYsIDB4NjZEOSwgMHgwOTc2LCAweDY2REEsIDB4MTQwNywgMHg2NkRDLCAweDBGMzUsCi0gICAgMHg2NkRELCAweDBEMkUsIDB4NjZFMCwgMHgxNDA4LCAweDY2RTYsIDB4MTQwQSwgMHg2NkU5LCAweDE0MEIsCi0gICAgMHg2NkVDLCAweDM5MTQsIDB4NjZGMCwgMHgxNDBDLCAweDY2RjIsIDB4MDZDMiwgMHg2NkYzLCAweDA0RUEsCi0gICAgMHg2NkY0LCAweDA3Q0IsIDB4NjZGNSwgMHgxNDBELCAweDY2RjcsIDB4MTQwRSwgMHg2NkY4LCAweDA5N0IsCi0gICAgMHg2NkY5LCAweDBBRTQsIDB4NjZGQSwgMHgyMTI3LCAweDY2RkIsIDB4MjBCMSwgMHg2NkZDLCAweDEwRUQsCi0gICAgMHg2NkZELCAweDBBQzAsIDB4NjZGRSwgMHgwQUJGLCAweDY2RkYsIDB4MEIzOCwgMHg2NzAwLCAweDA4MzcsCi0gICAgMHg2NzAzLCAweDEwNEIsIDB4NjcwNSwgMHgzOTE1LCAweDY3MDgsIDB4MDc0NCwgMHg2NzA5LCAweDBGMTcsCi0gICAgMHg2NzBCLCAweDBFNEUsIDB4NjcwRCwgMHgwREYwLCAweDY3MEUsIDB4MjEyOCwgMHg2NzBGLCAweDE0MEYsCi0gICAgMHg2NzEzLCAweDM5MTYsIDB4NjcxNCwgMHgwODYzLCAweDY3MTUsIDB4MEJEQiwgMHg2NzE2LCAweDE0MTAsCi0gICAgMHg2NzE3LCAweDBGRDUsIDB4NjcxQiwgMHgwRTZDLCAweDY3MUQsIDB4MEJDNywgMHg2NzFFLCAweDE0MTEsCi0gICAgMHg2NzFGLCAweDA2MzgsIDB4NjcyNiwgMHgxNDEyLCAweDY3MjcsIDB4MTQxMywgMHg2NzI4LCAweDBFRTYsCi0gICAgMHg2NzJBLCAweDBFQjAsIDB4NjcyQiwgMHgwRUE0LCAweDY3MkMsIDB4MEU4QSwgMHg2NzJELCAweDA4NzMsCi0gICAgMHg2NzJFLCAweDE0MTUsIDB4NjczMSwgMHgwOTE3LCAweDY3MzMsIDB4MzkxNywgMHg2NzM0LCAweDBFN0YsCi0gICAgMHg2NzM2LCAweDE0MTcsIDB4NjczNywgMHgxNDFBLCAweDY3MzgsIDB4MTQxOSwgMHg2NzNBLCAweDA2MzUsCi0gICAgMHg2NzNELCAweDA2N0EsIDB4NjczRiwgMHgxNDE2LCAweDY3NDEsIDB4MTQxOCwgMHg2NzQzLCAweDM1QjcsCi0gICAgMHg2NzQ2LCAweDE0MUIsIDB4Njc0OCwgMHgzOTE4LCAweDY3NDksIDB4MEEzRiwgMHg2NzRDLCAweDM5MTksCi0gICAgMHg2NzRFLCAweDBGNjUsIDB4Njc0RiwgMHgwNDhELCAweDY3NTAsIDB4MDg1MCwgMHg2NzUxLCAweDBCMUMsCi0gICAgMHg2NzUzLCAweDA5MDksIDB4Njc1NiwgMHgwOURCLCAweDY3NTksIDB4MTQxRSwgMHg2NzVDLCAweDBDNDgsCi0gICAgMHg2NzVFLCAweDE0MUMsIDB4Njc1RiwgMHgwQjBCLCAweDY3NjAsIDB4MTQxRCwgMHg2NzYxLCAweDA5REEsCi0gICAgMHg2NzYyLCAweDBFRTksIDB4Njc2MywgMHgxNDFGLCAweDY3NjQsIDB4MTQyMCwgMHg2NzY1LCAweDBGNTIsCi0gICAgMHg2NzY2LCAweDIxMkEsIDB4Njc2QSwgMHgxNDI1LCAweDY3NkQsIDB4MDdDQywgMHg2NzZFLCAweDM1NzEsCi0gICAgMHg2NzZGLCAweDBEMEIsIDB4Njc3MCwgMHgxNDIyLCAweDY3NzEsIDB4MEM2NiwgMHg2NzcyLCAweDEzRTMsCi0gICAgMHg2NzczLCAweDEzRTcsIDB4Njc3NSwgMHgwNjY5LCAweDY3NzYsIDB4MzkxQSwgMHg2Nzc3LCAweDBDRkQsCi0gICAgMHg2NzdCLCAweDM5MUIsIDB4Njc3QywgMHgxNDI0LCAweDY3N0UsIDB4MDlBNiwgMHg2NzdGLCAweDBENTgsCi0gICAgMHg2Nzg1LCAweDE0MkEsIDB4Njc4NywgMHgwRDhFLCAweDY3ODksIDB4MTQyMSwgMHg2NzhCLCAweDE0MjcsCi0gICAgMHg2NzhDLCAweDE0MjYsIDB4Njc5MCwgMHgwQTczLCAweDY3OTUsIDB4MEU5QiwgMHg2Nzk3LCAweDBGOUIsCi0gICAgMHg2NzlBLCAweDBFOTUsIDB4Njc5QywgMHgwNTRDLCAweDY3OUQsIDB4MDhBQywgMHg2N0EwLCAweDBGRUUsCi0gICAgMHg2N0ExLCAweDE0MjksIDB4NjdBMiwgMHgwQTNCLCAweDY3QTYsIDB4MTQyOCwgMHg2N0E5LCAweDE0MjMsCi0gICAgMHg2N0FGLCAweDA3ODMsIDB4NjdCMCwgMHgzOTFDLCAweDY3QjIsIDB4MzkxRCwgMHg2N0IzLCAweDE0MkYsCi0gICAgMHg2N0I0LCAweDE0MkQsIDB4NjdCNiwgMHgwNTRELCAweDY3QjcsIDB4MTQyQiwgMHg2N0I4LCAweDE0MzEsCi0gICAgMHg2N0I5LCAweDE0MzcsIDB4NjdCQiwgMHgyMTJCLCAweDY3QzAsIDB4MjEyRCwgMHg2N0MxLCAweDBCMjgsCi0gICAgMHg2N0M0LCAweDBFMTEsIDB4NjdDNiwgMHgxNDM5LCAweDY3Q0EsIDB4MEQ5NCwgMHg2N0NFLCAweDE0MzgsCi0gICAgMHg2N0NGLCAweDBEMjYsIDB4NjdEMCwgMHgwRTZELCAweDY3RDEsIDB4MDVGNywgMHg2N0QzLCAweDBBOUIsCi0gICAgMHg2N0Q0LCAweDA5NEEsIDB4NjdENywgMHgzOTFGLCAweDY3RDgsIDB4MEJFRiwgMHg2N0Q5LCAweDM5MjAsCi0gICAgMHg2N0RBLCAweDBGMTgsIDB4NjdERCwgMHgxNDM0LCAweDY3REUsIDB4MTQzMywgMHg2N0UyLCAweDE0MzUsCi0gICAgMHg2N0U0LCAweDE0MzIsIDB4NjdFNywgMHgxNDNBLCAweDY3RTksIDB4MTQzMCwgMHg2N0VDLCAweDE0MkUsCi0gICAgMHg2N0VFLCAweDE0MzYsIDB4NjdFRiwgMHgxNDJDLCAweDY3RjAsIDB4MzkyMSwgMHg2N0YxLCAweDBCQUEsCi0gICAgMHg2N0YzLCAweDBGMDQsIDB4NjdGNCwgMHgwOEYyLCAweDY3RjUsIDB4MDg2NCwgMHg2N0Y5LCAweDM5MUUsCi0gICAgMHg2N0ZCLCAweDA4MkEsIDB4NjdGRSwgMHgwRTlELCAweDY3RkYsIDB4MDU5RiwgMHg2ODAxLCAweDIxMkUsCi0gICAgMHg2ODAyLCAweDBCRUEsIDB4NjgwMywgMHgwQ0EyLCAweDY4MDQsIDB4MDRFQiwgMHg2ODA1LCAweDFFMDcsCi0gICAgMHg2ODEzLCAweDBBOTYsIDB4NjgxNiwgMHgwQTU4LCAweDY4MTcsIDB4MDcwMCwgMHg2ODFFLCAweDE0M0MsCi0gICAgMHg2ODIxLCAweDA3Q0QsIDB4NjgyMiwgMHgwNURBLCAweDY4MjksIDB4MTQzRSwgMHg2ODJBLCAweDA1RDIsCi0gICAgMHg2ODJCLCAweDE0NDQsIDB4NjgyQywgMHgzOTIyLCAweDY4MzAsIDB4MzkyMywgMHg2ODMxLCAweDM5MjQsCi0gICAgMHg2ODMyLCAweDE0NDEsIDB4NjgzNCwgMHgwQTk3LCAweDY4MzgsIDB4MDVBOSwgMHg2ODM5LCAweDA4MUMsCi0gICAgMHg2ODNDLCAweDA1QTgsIDB4NjgzRCwgMHgwODNGLCAweDY4NDAsIDB4MTQzRiwgMHg2ODQxLCAweDA3M0IsCi0gICAgMHg2ODQyLCAweDA3MjEsIDB4Njg0MywgMHgwQzY3LCAweDY4NDQsIDB4MjEyRiwgMHg2ODQ2LCAweDE0M0QsCi0gICAgMHg2ODQ4LCAweDA0OEEsIDB4Njg0RCwgMHgxNDQwLCAweDY4NEUsIDB4MTQ0MiwgMHg2ODUwLCAweDA2QzUsCi0gICAgMHg2ODUxLCAweDA3MDIsIDB4Njg1MiwgMHgyMTJDLCAweDY4NTMsIDB4MDVGOCwgMHg2ODU0LCAweDA2NjUsCi0gICAgMHg2ODU5LCAweDE0NDUsIDB4Njg1QiwgMHgzOTI1LCAweDY4NUMsIDB4MDg2OSwgMHg2ODVELCAweDBFOUYsCi0gICAgMHg2ODVGLCAweDA4ODUsIDB4Njg2MywgMHgxNDQ2LCAweDY4NjcsIDB4MERBMiwgMHg2ODcyLCAweDM5MjYsCi0gICAgMHg2ODc0LCAweDE0NTIsIDB4Njg3NSwgMHgzOTI3LCAweDY4NzYsIDB4MDUzMywgMHg2ODc3LCAweDE0NDcsCi0gICAgMHg2ODdBLCAweDM5MjgsIDB4Njg3RSwgMHgxNDU4LCAweDY4N0YsIDB4MTQ0OCwgMHg2ODgxLCAweDBGOEEsCi0gICAgMHg2ODgzLCAweDE0NEYsIDB4Njg4NCwgMHgzOTI5LCAweDY4ODUsIDB4MEQxNSwgMHg2ODhELCAweDE0NTcsCi0gICAgMHg2ODhFLCAweDFFOUMsIDB4Njg4RiwgMHgxNDRBLCAweDY4OTMsIDB4MDQ3OCwgMHg2ODk0LCAweDE0NEMsCi0gICAgMHg2ODk3LCAweDA3Q0UsIDB4Njg5QiwgMHgxNDRFLCAweDY4OUQsIDB4MTQ0RCwgMHg2ODlGLCAweDE0NDksCi0gICAgMHg2OEEwLCAweDE0NTQsIDB4NjhBMiwgMHgwOUE3LCAweDY4QTUsIDB4MzkyQSwgMHg2OEE2LCAweDExQkUsCi0gICAgMHg2OEE3LCAweDA3OUMsIDB4NjhBOCwgMHgwRjY2LCAweDY4QUQsIDB4MTQ0QiwgMHg2OEFGLCAweDBDMTAsCi0gICAgMHg2OEIwLCAweDA1ODEsIDB4NjhCMSwgMHgwODFELCAweDY4QjIsIDB4MzkyQiwgMHg2OEIzLCAweDE0NDMsCi0gICAgMHg2OEI1LCAweDE0NTMsIDB4NjhCNiwgMHgwNUJGLCAweDY4QjksIDB4MTQ1MSwgMHg2OEJBLCAweDE0NTUsCi0gICAgMHg2OEJDLCAweDBDNjgsIDB4NjhDNCwgMHgwNjNBLCAweDY4QzYsIDB4MTQ3MywgMHg2OEM4LCAweDIwQUYsCi0gICAgMHg2OEM5LCAweDBFRDUsIDB4NjhDQSwgMHgxNDVBLCAweDY4Q0IsIDB4MDYzOSwgMHg2OENELCAweDE0NjEsCi0gICAgMHg2OENGLCAweDIxMzAsIDB4NjhEMCwgMHgzOTJDLCAweDY4RDIsIDB4MEU2RSwgMHg2OEQ0LCAweDE0NjIsCi0gICAgMHg2OEQ1LCAweDE0NjQsIDB4NjhENiwgMHgzOTJELCAweDY4RDcsIDB4MTQ2OCwgMHg2OEQ4LCAweDE0NUMsCi0gICAgMHg2OERBLCAweDBCNjgsIDB4NjhERiwgMHgwQzY5LCAweDY4RTAsIDB4MTQ2QywgMHg2OEUxLCAweDE0NUYsCi0gICAgMHg2OEUzLCAweDE0NjksIDB4NjhFNywgMHgxNDYzLCAweDY4RTgsIDB4MzkyRSwgMHg2OEVELCAweDM5MkYsCi0gICAgMHg2OEVFLCAweDA5RkYsIDB4NjhFRiwgMHgxNDZELCAweDY4RjAsIDB4MzkzMCwgMHg2OEYxLCAweDM5MzEsCi0gICAgMHg2OEYyLCAweDBBNTcsIDB4NjhGOSwgMHgxNDZCLCAweDY4RkEsIDB4MDVGOSwgMHg2OEZDLCAweDM5MzIsCi0gICAgMHg2OTAwLCAweDBGRjYsIDB4NjkwMSwgMHgxNDU5LCAweDY5MDQsIDB4MTQ2NywgMHg2OTA1LCAweDA0OUMsCi0gICAgMHg2OTA4LCAweDE0NUIsIDB4NjkwQiwgMHgwRUM2LCAweDY5MEMsIDB4MTQ2MCwgMHg2OTBELCAweDA5RTgsCi0gICAgMHg2OTBFLCAweDBCRTMsIDB4NjkwRiwgMHgxNDU2LCAweDY5MTEsIDB4MzkzMywgMHg2OTEyLCAweDE0NjYsCi0gICAgMHg2OTEzLCAweDM5MzQsIDB4NjkxOSwgMHgwQTQwLCAweDY5MUEsIDB4MTQ3MCwgMHg2OTFCLCAweDA1Q0YsCi0gICAgMHg2OTFDLCAweDA3NTUsIDB4NjkyMSwgMHgxNDcyLCAweDY5MjIsIDB4MTQ1RCwgMHg2OTIzLCAweDE0NzEsCi0gICAgMHg2OTI1LCAweDE0NkEsIDB4NjkyNiwgMHgxNDVFLCAweDY5MjgsIDB4MTQ2RSwgMHg2OTJBLCAweDE0NkYsCi0gICAgMHg2OTMwLCAweDE0ODAsIDB4NjkzNCwgMHgwQ0E2LCAweDY5MzUsIDB4MzkzNSwgMHg2OTM2LCAweDE0NjUsCi0gICAgMHg2OTM5LCAweDE0N0MsIDB4NjkzQiwgMHgzOTM2LCAweDY5M0QsIDB4MTQ3RSwgMHg2OTNGLCAweDBCRjQsCi0gICAgMHg2OTRBLCAweDBGMzYsIDB4Njk1MywgMHgwREU4LCAweDY5NTQsIDB4MTQ3OSwgMHg2OTU1LCAweDBCMkEsCi0gICAgMHg2OTU3LCAweDM5MzcsIDB4Njk1OSwgMHgxNDdGLCAweDY5NUEsIDB4MEFDMSwgMHg2OTVDLCAweDE0NzYsCi0gICAgMHg2OTVELCAweDE0ODMsIDB4Njk1RSwgMHgxNDgyLCAweDY5NjAsIDB4MENDNywgMHg2OTYxLCAweDE0ODEsCi0gICAgMHg2OTYyLCAweDBDQzIsIDB4Njk2MywgMHgzOTM4LCAweDY5NjgsIDB4MjEzMiwgMHg2OTZBLCAweDE0ODUsCi0gICAgMHg2OTZCLCAweDE0NzgsIDB4Njk2RCwgMHgwNkMwLCAweDY5NkUsIDB4MTQ3QiwgMHg2OTZGLCAweDA5NjcsCi0gICAgMHg2OTcyLCAweDM5MzksIDB4Njk3MywgMHgwRDE2LCAweDY5NzQsIDB4MTQ3RCwgMHg2OTc1LCAweDA2QzMsCi0gICAgMHg2OTc3LCAweDE0NzUsIDB4Njk3OCwgMHgxNDc3LCAweDY5NzksIDB4MTQ3NCwgMHg2OTdDLCAweDBGRDYsCi0gICAgMHg2OTdELCAweDA1QjgsIDB4Njk3RSwgMHgxNDdBLCAweDY5N0YsIDB4MzkzQSwgMHg2OTgwLCAweDM5M0IsCi0gICAgMHg2OTgxLCAweDE0ODQsIDB4Njk4MiwgMHgwNTkzLCAweDY5OEEsIDB4MDg1NywgMHg2OThFLCAweDA0RkYsCi0gICAgMHg2OTkxLCAweDE0OTUsIDB4Njk5NCwgMHgwRkQ3LCAweDY5OTUsIDB4MTQ5OCwgMHg2OTk4LCAweDIxMzQsCi0gICAgMHg2OTlCLCAweDBBMDAsIDB4Njk5QywgMHgxNDk3LCAweDY5QTAsIDB4MTQ5NiwgMHg2OUE2LCAweDM5M0MsCi0gICAgMHg2OUE3LCAweDE0OTMsIDB4NjlBRCwgMHgzOTNELCAweDY5QUUsIDB4MTQ4NywgMHg2OUIxLCAweDE0QTQsCi0gICAgMHg2OUIyLCAweDE0ODYsIDB4NjlCNCwgMHgxNDk5LCAweDY5QjcsIDB4MzkzRSwgMHg2OUJCLCAweDE0OTEsCi0gICAgMHg2OUJFLCAweDE0OEMsIDB4NjlCRiwgMHgxNDg5LCAweDY5QzEsIDB4MTQ4QSwgMHg2OUMzLCAweDE0OTIsCi0gICAgMHg2OUM3LCAweDFEMzMsIDB4NjlDQSwgMHgxNDhGLCAweDY5Q0IsIDB4MDdDRiwgMHg2OUNDLCAweDBCRTQsCi0gICAgMHg2OUNELCAweDBBRTYsIDB4NjlDRSwgMHgxNDhELCAweDY5RDAsIDB4MTQ4OCwgMHg2OUQzLCAweDE0OEIsCi0gICAgMHg2OUQ2LCAweDM5M0YsIDB4NjlENywgMHgzOTQwLCAweDY5RDgsIDB4MEYzNywgMHg2OUQ5LCAweDBFOTgsCi0gICAgMHg2OURELCAweDE0OTAsIDB4NjlERSwgMHgxNDlBLCAweDY5RTIsIDB4MjEzNSwgMHg2OUU3LCAweDE0QTIsCi0gICAgMHg2OUU4LCAweDE0OUIsIDB4NjlFQSwgMHgzNTZGLCAweDY5RUIsIDB4MTRBOCwgMHg2OUVELCAweDE0QTYsCi0gICAgMHg2OUYyLCAweDE0QTEsIDB4NjlGNiwgMHgzNzNGLCAweDY5RjksIDB4MTRBMCwgMHg2OUZCLCAweDBCRUMsCi0gICAgMHg2OUZELCAweDBBRTcsIDB4NjlGRiwgMHgxNDlFLCAweDZBMDEsIDB4Mzk0MSwgMHg2QTAyLCAweDE0OUMsCi0gICAgMHg2QTA1LCAweDE0QTMsIDB4NkEwQSwgMHgxNEE5LCAweDZBMEIsIDB4MEQ4OSwgMHg2QTBDLCAweDE0QUYsCi0gICAgMHg2QTBGLCAweDM5NDIsIDB4NkExMiwgMHgxNEFBLCAweDZBMTMsIDB4MTRBRCwgMHg2QTE0LCAweDE0QTcsCi0gICAgMHg2QTE1LCAweDM5NDMsIDB4NkExNywgMHgwQkIyLCAweDZBMTksIDB4MERBQSwgMHg2QTFCLCAweDE0OUQsCi0gICAgMHg2QTFFLCAweDE0QTUsIDB4NkExRiwgMHgwOUE4LCAweDZBMjEsIDB4MEVEQiwgMHg2QTIyLCAweDE0QjksCi0gICAgMHg2QTIzLCAweDE0QUMsIDB4NkEyOCwgMHgzOTQ0LCAweDZBMjksIDB4MDc1NiwgMHg2QTJBLCAweDA1MjMsCi0gICAgMHg2QTJCLCAweDA1QkQsIDB4NkEyRSwgMHgxNDk0LCAweDZBMzAsIDB4MjEzNiwgMHg2QTM0LCAweDM5NDUsCi0gICAgMHg2QTM1LCAweDA5QTksIDB4NkEzNiwgMHgxNEIxLCAweDZBMzgsIDB4MTRCOCwgMHg2QTM5LCAweDA5MjUsCi0gICAgMHg2QTNBLCAweDA1RDAsIDB4NkEzRCwgMHgwQjZDLCAweDZBM0UsIDB4Mzk0NiwgMHg2QTQ0LCAweDE0QUUsCi0gICAgMHg2QTQ1LCAweDM5NDcsIDB4NkE0NiwgMHgyMTM4LCAweDZBNDcsIDB4MTRCMywgMHg2QTQ4LCAweDE0QjcsCi0gICAgMHg2QTRCLCAweDA2QUUsIDB4NkE1MCwgMHgzOTQ4LCAweDZBNTEsIDB4Mzk0OSwgMHg2QTU0LCAweDNDMzQsCi0gICAgMHg2QTU2LCAweDM5NEEsIDB4NkE1OCwgMHgwNjY2LCAweDZBNTksIDB4MTRCNSwgMHg2QTVCLCAweDM5NEIsCi0gICAgMHg2QTVGLCAweDA2M0IsIDB4NkE2MSwgMHgwQ0EzLCAweDZBNjIsIDB4MTRCNCwgMHg2QTY2LCAweDE0QjYsCi0gICAgMHg2QTZCLCAweDIxMzcsIDB4NkE3MiwgMHgxNEIwLCAweDZBNzMsIDB4MjEzOSwgMHg2QTc4LCAweDE0QjIsCi0gICAgMHg2QTdFLCAweDIxM0EsIDB4NkE3RiwgMHgwNUJFLCAweDZBODAsIDB4MEI4NywgMHg2QTgzLCAweDM5NEMsCi0gICAgMHg2QTg0LCAweDE0QkQsIDB4NkE4OSwgMHgzOTRELCAweDZBOEQsIDB4MTRCQiwgMHg2QThFLCAweDA3OUQsCi0gICAgMHg2QTkwLCAweDE0QkEsIDB4NkE5MSwgMHgzOTRFLCAweDZBOTcsIDB4MTRDMCwgMHg2QTlDLCAweDE0M0IsCi0gICAgMHg2QTlELCAweDM5NEYsIDB4NkE5RSwgMHgzOTUwLCAweDZBOUYsIDB4Mzk1MSwgMHg2QUEwLCAweDE0QkMsCi0gICAgMHg2QUEyLCAweDE0QkUsIDB4NkFBMywgMHgxNEJGLCAweDZBQUEsIDB4MTRDQiwgMHg2QUFDLCAweDE0QzcsCi0gICAgMHg2QUFFLCAweDE0NTAsIDB4NkFCMywgMHgxNEM2LCAweDZBQjgsIDB4MTRDNSwgMHg2QUJCLCAweDE0QzIsCi0gICAgMHg2QUMxLCAweDE0QUIsIDB4NkFDMiwgMHgxNEM0LCAweDZBQzMsIDB4MTRDMywgMHg2QUQxLCAweDE0QzksCi0gICAgMHg2QUQzLCAweDBGQ0MsIDB4NkFEQSwgMHgxNENDLCAweDZBREIsIDB4MDZGMywgMHg2QURDLCAweDM5NTIsCi0gICAgMHg2QURFLCAweDE0QzgsIDB4NkFERiwgMHgxNENBLCAweDZBRTIsIDB4MjEzQiwgMHg2QUU0LCAweDIxM0MsCi0gICAgMHg2QUU3LCAweDM5NTMsIDB4NkFFOCwgMHgwRDNCLCAweDZBRUEsIDB4MTRDRCwgMHg2QUVDLCAweDM5NTQsCi0gICAgMHg2QUZBLCAweDE0RDEsIDB4NkFGQiwgMHgxNENFLCAweDZCMDQsIDB4MEY1RCwgMHg2QjA1LCAweDE0Q0YsCi0gICAgMHg2QjBBLCAweDE0OUYsIDB4NkIxMiwgMHgxNEQyLCAweDZCMTYsIDB4MTREMywgMHg2QjFELCAweDA0RDcsCi0gICAgMHg2QjFFLCAweDM5NTUsIDB4NkIxRiwgMHgxNEQ1LCAweDZCMjAsIDB4MDczRCwgMHg2QjIxLCAweDA4Q0QsCi0gICAgMHg2QjIzLCAweDA2Q0QsIDB4NkIyNCwgMHgzOTU2LCAweDZCMjcsIDB4MDUyNCwgMHg2QjMyLCAweDBGNDksCi0gICAgMHg2QjM1LCAweDM5NTcsIDB4NkIzNywgMHgxNEQ3LCAweDZCMzgsIDB4MTRENiwgMHg2QjM5LCAweDE0RDksCi0gICAgMHg2QjNBLCAweDA2NTcsIDB4NkIzRCwgMHgwNkNFLCAweDZCM0UsIDB4MDVGQSwgMHg2QjQzLCAweDE0REMsCi0gICAgMHg2QjQ2LCAweDM5NTgsIDB4NkI0NywgMHgxNERCLCAweDZCNDksIDB4MTRERCwgMHg2QjRDLCAweDA1NEUsCi0gICAgMHg2QjRFLCAweDBCNzUsIDB4NkI1MCwgMHgxNERFLCAweDZCNTMsIDB4MDVGQiwgMHg2QjU0LCAweDE0RTAsCi0gICAgMHg2QjU2LCAweDM5NTksIDB4NkI1OSwgMHgxNERGLCAweDZCNUIsIDB4MTRFMSwgMHg2QjVGLCAweDE0RTIsCi0gICAgMHg2QjYwLCAweDM5NUEsIDB4NkI2MSwgMHgxNEUzLCAweDZCNjIsIDB4MDhBRCwgMHg2QjYzLCAweDBBNTksCi0gICAgMHg2QjY0LCAweDA4MTEsIDB4NkI2NSwgMHgzNDRBLCAweDZCNjYsIDB4MERFMiwgMHg2QjY5LCAweDBFMzIsCi0gICAgMHg2QjZBLCAweDBGRUEsIDB4NkI2RiwgMHgwOEMzLCAweDZCNzIsIDB4MzVEOSwgMHg2QjczLCAweDA4NDAsCi0gICAgMHg2Qjc0LCAweDBGQkEsIDB4NkI3NywgMHgzNDU2LCAweDZCNzgsIDB4MTRFNCwgMHg2Qjc5LCAweDE0RTUsCi0gICAgMHg2QjdCLCAweDA4QUUsIDB4NkI3RiwgMHgxNEU2LCAweDZCODAsIDB4MTRFNywgMHg2QjgyLCAweDM5NUIsCi0gICAgMHg2QjgzLCAweDE0RTksIDB4NkI4NCwgMHgxNEU4LCAweDZCODYsIDB4MEU4NiwgMHg2Qjg5LCAweDA5NjgsCi0gICAgMHg2QjhBLCAweDA5MTgsIDB4NkI4QiwgMHgwODkyLCAweDZCOEQsIDB4MTRFQSwgMHg2Qjk1LCAweDE0RUMsCi0gICAgMHg2Qjk2LCAweDA5RTksIDB4NkI5OCwgMHgxNEVCLCAweDZCOUUsIDB4MTRFRCwgMHg2QkE0LCAweDE0RUUsCi0gICAgMHg2QkFBLCAweDE0RUYsIDB4NkJBQiwgMHgxNEYwLCAweDZCQUYsIDB4MTRGMSwgMHg2QkIxLCAweDE0RjMsCi0gICAgMHg2QkIyLCAweDE0RjIsIDB4NkJCMywgMHgxNEY0LCAweDZCQjQsIDB4MDUyNSwgMHg2QkI1LCAweDBCODgsCi0gICAgMHg2QkI3LCAweDE0RjUsIDB4NkJCQSwgMHgwODc0LCAweDZCQkIsIDB4MDVBQSwgMHg2QkJDLCAweDE0RjYsCi0gICAgMHg2QkJFLCAweDM5NUMsIDB4NkJCRiwgMHgwQzNDLCAweDZCQzAsIDB4MTE5RCwgMHg2QkM1LCAweDA2M0QsCi0gICAgMHg2QkM2LCAweDE0RjcsIDB4NkJDQiwgMHgxNEY4LCAweDZCQ0MsIDB4Mzc0NCwgMHg2QkNELCAweDBFM0MsCi0gICAgMHg2QkNFLCAweDBFOTYsIDB4NkJDRiwgMHgzNDRDLCAweDZCRDIsIDB4MEM5RiwgMHg2QkQzLCAweDE0RjksCi0gICAgMHg2QkQ0LCAweDBEN0EsIDB4NkJENiwgMHgyMTNELCAweDZCRDgsIDB4MEQ4RiwgMHg2QkRCLCAweDBFREYsCi0gICAgMHg2QkRGLCAweDE0RkEsIDB4NkJFMSwgMHgzOTVELCAweDZCRUIsIDB4MTRGQywgMHg2QkVDLCAweDE0RkIsCi0gICAgMHg2QkVGLCAweDE0RkUsIDB4NkJGMSwgMHgzOTVFLCAweDZCRjMsIDB4MTRGRCwgMHg2QzA4LCAweDE1MDAsCi0gICAgMHg2QzBGLCAweDA4QUYsIDB4NkMxMCwgMHgzOTVGLCAweDZDMTEsIDB4MEVCRCwgMHg2QzEzLCAweDE1MDEsCi0gICAgMHg2QzE0LCAweDE1MDIsIDB4NkMxNywgMHgwNjNFLCAweDZDMUIsIDB4MTUwMywgMHg2QzIzLCAweDE1MDUsCi0gICAgMHg2QzI0LCAweDE1MDQsIDB4NkMzMywgMHgzOTYwLCAweDZDMzQsIDB4MEEyQiwgMHg2QzM1LCAweDM5NjEsCi0gICAgMHg2QzM3LCAweDBEQUIsIDB4NkMzOCwgMHgwNEVDLCAweDZDM0EsIDB4Mzk2MiwgMHg2QzNFLCAweDBENTksCi0gICAgMHg2QzNGLCAweDIxM0UsIDB4NkM0MCwgMHgwQzExLCAweDZDNDEsIDB4MDk0QiwgMHg2QzQyLCAweDA2N0IsCi0gICAgMHg2QzRFLCAweDBENUEsIDB4NkM1MCwgMHgwOERBLCAweDZDNTUsIDB4MTUwNywgMHg2QzU3LCAweDA1RkMsCi0gICAgMHg2QzU5LCAweDM5NjMsIDB4NkM1QSwgMHgwNTFBLCAweDZDNUMsIDB4MjEzRiwgMHg2QzVELCAweDBDQ0EsCi0gICAgMHg2QzVFLCAweDE1MDYsIDB4NkM1RiwgMHgwN0QwLCAweDZDNjAsIDB4MEI5MSwgMHg2QzYyLCAweDE1MDgsCi0gICAgMHg2QzY4LCAweDE1MTAsIDB4NkM2QSwgMHgxNTA5LCAweDZDNkYsIDB4MjE0MSwgMHg2QzcwLCAweDBCMjEsCi0gICAgMHg2QzcyLCAweDA2N0MsIDB4NkM3MywgMHgxNTExLCAweDZDNzYsIDB4Mzk2NCwgMHg2QzdBLCAweDA3M0UsCi0gICAgMHg2QzdCLCAweDM5NjUsIDB4NkM3RCwgMHgwNjNGLCAweDZDN0UsIDB4MTUwRiwgMHg2QzgxLCAweDE1MEQsCi0gICAgMHg2QzgyLCAweDE1MEEsIDB4NkM4MywgMHgwRjRBLCAweDZDODUsIDB4Mzk2NiwgMHg2Qzg2LCAweDIxNDAsCi0gICAgMHg2Qzg4LCAweDBCREMsIDB4NkM4QywgMHgwQ0IxLCAweDZDOEQsIDB4MTUwQiwgMHg2QzkwLCAweDE1MTMsCi0gICAgMHg2QzkyLCAweDE1MTIsIDB4NkM5MywgMHgwNkY5LCAweDZDOTUsIDB4Mzk2NywgMHg2Qzk2LCAweDA1MkQsCi0gICAgMHg2Qzk5LCAweDA4MkIsIDB4NkM5QSwgMHgxNTBDLCAweDZDOUIsIDB4MTUwRSwgMHg2QzlDLCAweDM5NjgsCi0gICAgMHg2Q0ExLCAweDBFODUsIDB4NkNBMiwgMHgwQjU0LCAweDZDQUEsIDB4Mzc0OSwgMHg2Q0FCLCAweDBFQTUsCi0gICAgMHg2Q0FFLCAweDE1MUIsIDB4NkNCMSwgMHgxNTFDLCAweDZDQjMsIDB4MDU0RiwgMHg2Q0I4LCAweDBERjgsCi0gICAgMHg2Q0I5LCAweDBGMDksIDB4NkNCQSwgMHgxNTFFLCAweDZDQkIsIDB4MDhDRiwgMHg2Q0JDLCAweDA5QUEsCi0gICAgMHg2Q0JELCAweDE1MTcsIDB4NkNCRSwgMHgxNTFELCAweDZDQkYsIDB4MDUwQSwgMHg2Q0MxLCAweDA2QUYsCi0gICAgMHg2Q0M0LCAweDE1MTQsIDB4NkNDNSwgMHgxNTE5LCAweDZDQzksIDB4MEE5OCwgMHg2Q0NBLCAweDBEMjcsCi0gICAgMHg2Q0NDLCAweDBEN0IsIDB4NkNEMCwgMHgzOTY5LCAweDZDRDMsIDB4MTUxNiwgMHg2Q0Q0LCAweDM5NkEsCi0gICAgMHg2Q0Q1LCAweDBFNEYsIDB4NkNENiwgMHgzOTZCLCAweDZDRDcsIDB4MTUxOCwgMHg2Q0Q5LCAweDE1MjEsCi0gICAgMHg2Q0RBLCAweDIxNDIsIDB4NkNEQiwgMHgxNTFGLCAweDZDREQsIDB4MTUxQSwgMHg2Q0UwLCAweDM5NkMsCi0gICAgMHg2Q0UxLCAweDBFNTAsIDB4NkNFMiwgMHgwQ0ZFLCAweDZDRTMsIDB4MDY3RCwgMHg2Q0U1LCAweDBDMUYsCi0gICAgMHg2Q0U4LCAweDBCQUIsIDB4NkNFQSwgMHgxNTIyLCAweDZDRUIsIDB4Mzk2RCwgMHg2Q0VDLCAweDM5NkUsCi0gICAgMHg2Q0VFLCAweDM5NkYsIDB4NkNFRiwgMHgxNTIwLCAweDZDRjAsIDB4MEIzOSwgMHg2Q0YxLCAweDE1MTUsCi0gICAgMHg2Q0YzLCAweDA0RUQsIDB4NkQwMSwgMHgzQzM1LCAweDZEMDQsIDB4MjE0MywgMHg2RDBBLCAweDM5NzAsCi0gICAgMHg2RDBCLCAweDBGMzgsIDB4NkQwQywgMHgxNTJELCAweDZEMEUsIDB4Mzk3MSwgMHg2RDExLCAweDM5NzIsCi0gICAgMHg2RDEyLCAweDE1MkMsIDB4NkQxNywgMHgwQTlBLCAweDZEMTksIDB4MTUyOSwgMHg2RDFCLCAweDBGNTYsCi0gICAgMHg2RDFFLCAweDBDOEUsIDB4NkQxRiwgMHgxNTIzLCAweDZEMjUsIDB4MEJFMSwgMHg2RDI5LCAweDA0RUUsCi0gICAgMHg2RDJBLCAweDA3RDEsIDB4NkQyQiwgMHgxNTI2LCAweDZEMkUsIDB4Mzk3MywgMHg2RDMyLCAweDA5MzEsCi0gICAgMHg2RDMzLCAweDE1MkIsIDB4NkQzNSwgMHgxNTJBLCAweDZEMzYsIDB4MTUyNSwgMHg2RDM4LCAweDE1MjgsCi0gICAgMHg2RDNCLCAweDA1QzYsIDB4NkQzRCwgMHgxNTI3LCAweDZEM0UsIDB4MENGRiwgMHg2RDQxLCAweDBGNzYsCi0gICAgMHg2RDQ0LCAweDA5REMsIDB4NkQ0NSwgMHgwQTk5LCAweDZENTcsIDB4Mzk3NCwgMHg2RDU5LCAweDE1MzMsCi0gICAgMHg2RDVBLCAweDE1MzEsIDB4NkQ1QywgMHgwREJGLCAweDZENUUsIDB4Mzk3NSwgMHg2RDYzLCAweDE1MkUsCi0gICAgMHg2RDY0LCAweDE1MzAsIDB4NkQ2NSwgMHgzOTc2LCAweDZENjYsIDB4MDREQywgMHg2RDY5LCAweDA3RDIsCi0gICAgMHg2RDZBLCAweDBGRDgsIDB4NkQ2QywgMHgwNTlCLCAweDZENkUsIDB4MERENCwgMHg2RDZGLCAweDIxNDUsCi0gICAgMHg2RDc0LCAweDBGNEIsIDB4NkQ3NywgMHgwNTgyLCAweDZENzgsIDB4MEEwMSwgMHg2RDc5LCAweDE1MzIsCi0gICAgMHg2RDgyLCAweDM5NzcsIDB4NkQ4NSwgMHgxNTM3LCAweDZEODcsIDB4MjE0NCwgMHg2RDg4LCAweDA5QUIsCi0gICAgMHg2RDg5LCAweDM0MkEsIDB4NkQ4QywgMHgwRjFBLCAweDZEOEUsIDB4MTUzNCwgMHg2RDkzLCAweDE1MkYsCi0gICAgMHg2RDk1LCAweDE1MzUsIDB4NkQ5NiwgMHgyMTQ2LCAweDZEOTksIDB4MEZBNiwgMHg2RDlCLCAweDBDNkQsCi0gICAgMHg2RDlDLCAweDBDOUEsIDB4NkRBQywgMHgyMTQ3LCAweDZEQUYsIDB4MDU5NCwgMHg2REIyLCAweDA0RjcsCi0gICAgMHg2REI1LCAweDE1M0IsIDB4NkRCOCwgMHgxNTNFLCAweDZEQkMsIDB4MEY4QiwgMHg2REJGLCAweDM5NzgsCi0gICAgMHg2REMwLCAweDBGNEUsIDB4NkRDNCwgMHgzOTc5LCAweDZEQzUsIDB4MTU0NSwgMHg2REM2LCAweDE1M0YsCi0gICAgMHg2REM3LCAweDE1M0MsIDB4NkRDQSwgMHgzOTdBLCAweDZEQ0IsIDB4MEY5QywgMHg2RENDLCAweDE1NDIsCi0gICAgMHg2RENGLCAweDIxNDgsIDB4NkREMCwgMHgzQzM2LCAweDZERDEsIDB4MDk1NCwgMHg2REQyLCAweDE1NDQsCi0gICAgMHg2REQ1LCAweDE1NDksIDB4NkRENiwgMHgzOTdCLCAweDZERDgsIDB4MEM2QiwgMHg2REQ5LCAweDE1NDcsCi0gICAgMHg2RERBLCAweDM0NTMsIDB4NkRERSwgMHgxNTQxLCAweDZERTEsIDB4MEI3NiwgMHg2REU0LCAweDE1NDgsCi0gICAgMHg2REU2LCAweDE1M0QsIDB4NkRFOCwgMHgxNTQzLCAweDZERTksIDB4Mzk3QywgMHg2REVBLCAweDE1NEEsCi0gICAgMHg2REVCLCAweDA0QzAsIDB4NkRFQywgMHgxNTQwLCAweDZERUUsIDB4MTU0QiwgMHg2REYxLCAweDBBMDIsCi0gICAgMHg2REYyLCAweDIxNEEsIDB4NkRGMywgMHgwOTY5LCAweDZERjUsIDB4MERGNSwgMHg2REY3LCAweDA4MUUsCi0gICAgMHg2REY4LCAweDIxNDksIDB4NkRGOSwgMHgxNTM4LCAweDZERkEsIDB4MTU0NiwgMHg2REZCLCAweDBDMzQsCi0gICAgMHg2REZDLCAweDIxNEIsIDB4NkUwNSwgMHgwQTVBLCAweDZFMDcsIDB4MDVDNywgMHg2RTA4LCAweDA4NDEsCi0gICAgMHg2RTA5LCAweDA5QUMsIDB4NkUwQSwgMHgxNTNBLCAweDZFMEIsIDB4MDk0QywgMHg2RTEzLCAweDA3MjIsCi0gICAgMHg2RTE1LCAweDE1MzksIDB4NkUxNywgMHgzNzQ2LCAweDZFMTksIDB4MTU0RiwgMHg2RTFBLCAweDA5NzcsCi0gICAgMHg2RTFCLCAweDA3NkUsIDB4NkUxRCwgMHgxNTVFLCAweDZFMUYsIDB4MTU1OCwgMHg2RTIwLCAweDA2OEUsCi0gICAgMHg2RTIxLCAweDBDNDksIDB4NkUyMiwgMHgzOTdELCAweDZFMjMsIDB4MTU1MywgMHg2RTI0LCAweDE1NUMsCi0gICAgMHg2RTI1LCAweDA0NzMsIDB4NkUyNiwgMHgwNEQ0LCAweDZFMjcsIDB4MjE0RSwgMHg2RTI5LCAweDA1MzksCi0gICAgMHg2RTJCLCAweDE1NTUsIDB4NkUyQywgMHgwQjBDLCAweDZFMkQsIDB4MTU0QywgMHg2RTJFLCAweDE1NEUsCi0gICAgMHg2RTJGLCAweDA3RDMsIDB4NkUzNCwgMHgzNDEyLCAweDZFMzgsIDB4MTU1RiwgMHg2RTM5LCAweDIxNEMsCi0gICAgMHg2RTNBLCAweDE1NUEsIDB4NkUzQywgMHgyMTRGLCAweDZFM0UsIDB4MTU1MiwgMHg2RTQyLCAweDNDMzcsCi0gICAgMHg2RTQzLCAweDE1NTksIDB4NkU0QSwgMHgwRUI3LCAweDZFNEQsIDB4MTU1NywgMHg2RTRFLCAweDE1NUIsCi0gICAgMHg2RTUxLCAweDM5N0UsIDB4NkU1NiwgMHgwNzg0LCAweDZFNTgsIDB4MDlBRCwgMHg2RTVCLCAweDBCNzcsCi0gICAgMHg2RTVDLCAweDIxNEQsIDB4NkU1RiwgMHgxNTUxLCAweDZFNjcsIDB4MEYxOSwgMHg2RTZCLCAweDE1NTQsCi0gICAgMHg2RTZFLCAweDE1NEQsIDB4NkU2RiwgMHgwQzZDLCAweDZFNzIsIDB4MTU1MCwgMHg2RTc2LCAweDE1NTYsCi0gICAgMHg2RTdFLCAweDBGRjcsIDB4NkU3RiwgMHgwOEVBLCAweDZFODAsIDB4MEVBQywgMHg2RTgyLCAweDE1NjAsCi0gICAgMHg2RThDLCAweDBENDIsIDB4NkU4RiwgMHgxNTZDLCAweDZFOTAsIDB4MDc2RiwgMHg2RTk2LCAweDA5NkEsCi0gICAgMHg2RTk4LCAweDE1NjIsIDB4NkU5QywgMHgwRjc3LCAweDZFOUQsIDB4MDdENCwgMHg2RTlGLCAweDE1NkYsCi0gICAgMHg2RUEyLCAweDA0QjIsIDB4NkVBNSwgMHgxNTZELCAweDZFQUEsIDB4MTU2MSwgMHg2RUFCLCAweDM0MEMsCi0gICAgMHg2RUFGLCAweDE1NjcsIDB4NkVCMiwgMHgxNTY5LCAweDZFQjYsIDB4MEYzOSwgMHg2RUI3LCAweDE1NjQsCi0gICAgMHg2RUJBLCAweDBDMjgsIDB4NkVCRCwgMHgxNTY2LCAweDZFQkYsIDB4MjE1MCwgMHg2RUMyLCAweDE1NkUsCi0gICAgMHg2RUM0LCAweDE1NjgsIDB4NkVDNSwgMHgwRUQzLCAweDZFQzcsIDB4Mzk3RiwgMHg2RUM5LCAweDE1NjMsCi0gICAgMHg2RUNBLCAweDM5ODAsIDB4NkVDQiwgMHgwOENFLCAweDZFQ0MsIDB4MTU3QiwgMHg2RUNFLCAweDM5ODEsCi0gICAgMHg2RUQxLCAweDA1QzgsIDB4NkVEMywgMHgxNTY1LCAweDZFRDQsIDB4MTU2QSwgMHg2RUQ1LCAweDE1NkIsCi0gICAgMHg2RUQ5LCAweDNDMzgsIDB4NkVERCwgMHgwQjRDLCAweDZFREUsIDB4MEIzQSwgMHg2RUU2LCAweDNDMjQsCi0gICAgMHg2RUVDLCAweDE1NzMsIDB4NkVFRiwgMHgxNTc5LCAweDZFRjIsIDB4MTU3NywgMHg2RUY0LCAweDBDMjMsCi0gICAgMHg2RUY3LCAweDE1N0UsIDB4NkVGOCwgMHgxNTc0LCAweDZFRkQsIDB4Mzk4MiwgMHg2RUZFLCAweDE1NzUsCi0gICAgMHg2RUZGLCAweDE1NUQsIDB4NkYwMSwgMHgwNjkzLCAweDZGMDIsIDB4MERBQywgMHg2RjA2LCAweDA4RUIsCi0gICAgMHg2RjA5LCAweDA4MDksIDB4NkYwRiwgMHgwRkQ5LCAweDZGMTEsIDB4MTU3MSwgMHg2RjEzLCAweDE1N0QsCi0gICAgMHg2RjE0LCAweDA1MEIsIDB4NkYxNSwgMHgwQUU4LCAweDZGMUEsIDB4Mzk4MywgMHg2RjIwLCAweDBEMkYsCi0gICAgMHg2RjIyLCAweDA1RkQsIDB4NkYyMywgMHgwRkMyLCAweDZGMkEsIDB4Mzk4NCwgMHg2RjJCLCAweDBFQUQsCi0gICAgMHg2RjJDLCAweDBCRUUsIDB4NkYyRiwgMHgzOTg1LCAweDZGMzEsIDB4MTU3OCwgMHg2RjMyLCAweDE1N0EsCi0gICAgMHg2RjMzLCAweDM5ODYsIDB4NkYzOCwgMHgwQUI0LCAweDZGM0UsIDB4MTU3QywgMHg2RjNGLCAweDE1NzYsCi0gICAgMHg2RjQxLCAweDE1NzAsIDB4NkY0NSwgMHgwNUZGLCAweDZGNTEsIDB4MUU2MCwgMHg2RjU0LCAweDA3M0YsCi0gICAgMHg2RjU4LCAweDE1OEEsIDB4NkY1QSwgMHgzOTg3LCAweDZGNUIsIDB4MTU4NSwgMHg2RjVDLCAweDBBOUMsCi0gICAgMHg2RjVFLCAweDM5ODgsIDB4NkY1RiwgMHgwNUMxLCAweDZGNjIsIDB4Mzk4OSwgMHg2RjY0LCAweDA5NkIsCi0gICAgMHg2RjY2LCAweDE1OEUsIDB4NkY2RCwgMHgxNTg3LCAweDZGNkUsIDB4MEJDOCwgMHg2RjZGLCAweDE1ODQsCi0gICAgMHg2RjcwLCAweDBCRjUsIDB4NkY3NCwgMHgxNUE3LCAweDZGNzgsIDB4MTU4MSwgMHg2RjdBLCAweDE1ODAsCi0gICAgMHg2RjdDLCAweDE1ODksIDB4NkY3RCwgMHgzOThBLCAweDZGODAsIDB4MTU4MywgMHg2RjgxLCAweDE1ODIsCi0gICAgMHg2RjgyLCAweDE1ODgsIDB4NkY4NCwgMHgwQTQ1LCAweDZGODYsIDB4MTU3RiwgMHg2Rjg4LCAweDIxNTEsCi0gICAgMHg2RjhCLCAweDM5OEIsIDB4NkY4RCwgMHgzOThDLCAweDZGOEUsIDB4MTU4QiwgMHg2RjkxLCAweDE1OEMsCi0gICAgMHg2RjkyLCAweDM5OEQsIDB4NkY5NCwgMHgzOThFLCAweDZGOTcsIDB4MDVGRSwgMHg2Rjk4LCAweDM2M0MsCi0gICAgMHg2RjlBLCAweDM5OEYsIDB4NkZBMSwgMHgxNTkxLCAweDZGQTMsIDB4MTU5MCwgMHg2RkE0LCAweDE1OTIsCi0gICAgMHg2RkE3LCAweDM5OTAsIDB4NkZBOCwgMHgzOTkxLCAweDZGQUEsIDB4MTU5NSwgMHg2RkIxLCAweDBDM0QsCi0gICAgMHg2RkIzLCAweDE1OEYsIDB4NkZCNSwgMHgyMTUyLCAweDZGQjYsIDB4Mzk5MiwgMHg2RkI5LCAweDE1OTMsCi0gICAgMHg2RkMwLCAweDA3MzksIDB4NkZDMSwgMHgwQjU5LCAweDZGQzIsIDB4MTU4RCwgMHg2RkMzLCAweDBDRjEsCi0gICAgMHg2RkM2LCAweDE1OTQsIDB4NkZENCwgMHgxNTk5LCAweDZGRDUsIDB4MTU5NywgMHg2RkQ4LCAweDE1OUEsCi0gICAgMHg2RkRBLCAweDM5OTMsIDB4NkZEQiwgMHgxNTlELCAweDZGREUsIDB4Mzk5NCwgMHg2RkRGLCAweDE1OTYsCi0gICAgMHg2RkUwLCAweDA3RkMsIDB4NkZFMSwgMHgwQ0RFLCAweDZGRTQsIDB4MTUzNiwgMHg2RkVCLCAweDBGNUUsCi0gICAgMHg2RkVDLCAweDE1OTgsIDB4NkZFRSwgMHgxNTlDLCAweDZGRUYsIDB4MEI1NSwgMHg2RkYxLCAweDE1OUIsCi0gICAgMHg2RkYzLCAweDE1ODYsIDB4NkZGNSwgMHgyMTUzLCAweDZGRjYsIDB4MUJBNCwgMHg2RkY5LCAweDM5OTUsCi0gICAgMHg2RkZBLCAweDE1QTAsIDB4NkZGRSwgMHgxNUE0LCAweDcwMDEsIDB4MTVBMiwgMHg3MDA1LCAweDIxNTQsCi0gICAgMHg3MDA2LCAweDFFNTAsIDB4NzAwNywgMHgyMTU1LCAweDcwMDksIDB4MTU5RSwgMHg3MDBCLCAweDE1OUYsCi0gICAgMHg3MDBGLCAweDE1QTMsIDB4NzAxMSwgMHgxNUExLCAweDcwMTUsIDB4MERDMCwgMHg3MDE4LCAweDE1QTksCi0gICAgMHg3MDFBLCAweDE1QTYsIDB4NzAxQiwgMHgxNUE1LCAweDcwMUQsIDB4MTVBOCwgMHg3MDFFLCAweDBDQUMsCi0gICAgMHg3MDFGLCAweDE1QUEsIDB4NzAyNiwgMHgwQkIzLCAweDcwMjcsIDB4MEI0RCwgMHg3MDI4LCAweDIxNTYsCi0gICAgMHg3MDJDLCAweDBBNDksIDB4NzAzMCwgMHgxNUFCLCAweDcwMzIsIDB4MTVBRCwgMHg3MDM5LCAweDM5OTYsCi0gICAgMHg3MDNDLCAweDM5OTcsIDB4NzAzRSwgMHgxNUFDLCAweDcwNEEsIDB4Mzk5OCwgMHg3MDRDLCAweDE1NzIsCi0gICAgMHg3MDUxLCAweDE1QUUsIDB4NzA1NCwgMHgzOTk5LCAweDcwNTgsIDB4MENCRiwgMHg3MDVELCAweDM5OUEsCi0gICAgMHg3MDVFLCAweDM5OUIsIDB4NzA2MywgMHgxNUFGLCAweDcwNjQsIDB4Mzk5QywgMHg3MDZCLCAweDA1NTAsCi0gICAgMHg3MDZDLCAweDM5OUQsIDB4NzA2RiwgMHgwQzZFLCAweDcwNzAsIDB4MDU4MywgMHg3MDc4LCAweDA2N0UsCi0gICAgMHg3MDdDLCAweDA5MEEsIDB4NzA3RCwgMHgwODQyLCAweDcwN0UsIDB4Mzk5RSwgMHg3MDgxLCAweDM5OUYsCi0gICAgMHg3MDg1LCAweDIxNTcsIDB4NzA4OSwgMHgwRkNELCAweDcwOEEsIDB4MEEyQywgMHg3MDhFLCAweDA1MEMsCi0gICAgMHg3MDkyLCAweDE1QjEsIDB4NzA5NSwgMHgzOUEwLCAweDcwOTksIDB4MTVCMCwgMHg3MEFCLCAweDIxNTgsCi0gICAgMHg3MEFDLCAweDE1QjQsIDB4NzBBRCwgMHgwQjc4LCAweDcwQUUsIDB4MTVCNywgMHg3MEFGLCAweDE1QjIsCi0gICAgMHg3MEIzLCAweDE1QjYsIDB4NzBCNywgMHgzOUExLCAweDcwQjgsIDB4MTVCNSwgMHg3MEI5LCAweDBDM0EsCi0gICAgMHg3MEJBLCAweDA0OUQsIDB4NzBCQiwgMHgyMEFELCAweDcwQzgsIDB4MEZCRCwgMHg3MENCLCAweDE1QjksCi0gICAgMHg3MENGLCAweDA0Q0EsIDB4NzBEMywgMHgzOUEyLCAweDcwRDQsIDB4MzlBMywgMHg3MEQ4LCAweDM5QTQsCi0gICAgMHg3MEQ5LCAweDE1QkIsIDB4NzBEQywgMHgzOUE1LCAweDcwREQsIDB4MTVCQSwgMHg3MERGLCAweDE1QjgsCi0gICAgMHg3MEYxLCAweDE1QjMsIDB4NzBGOSwgMHgwRTUxLCAweDcwRkQsIDB4MTVCRCwgMHg3MTA0LCAweDIxNUEsCi0gICAgMHg3MTA3LCAweDM5QTYsIDB4NzEwOSwgMHgxNUJDLCAweDcxMEYsIDB4MjE1OSwgMHg3MTE0LCAweDA1MEQsCi0gICAgMHg3MTE5LCAweDE1QkYsIDB4NzExQSwgMHgwRTAyLCAweDcxMUMsIDB4MTVCRSwgMHg3MTIwLCAweDM5QTcsCi0gICAgMHg3MTIxLCAweDBFQzEsIDB4NzEyNiwgMHgwOUFGLCAweDcxMzAsIDB4MUREQywgMHg3MTMxLCAweDM5QTgsCi0gICAgMHg3MTM2LCAweDBBQjUsIDB4NzEzQywgMHgwOUFFLCAweDcxNDYsIDB4MjE1QywgMHg3MTQ3LCAweDIxNUQsCi0gICAgMHg3MTQ5LCAweDBGQzMsIDB4NzE0QSwgMHgzOUE5LCAweDcxNEMsIDB4MTVDNSwgMHg3MTRFLCAweDBBOUQsCi0gICAgMHg3MTUyLCAweDM5QUEsIDB4NzE1NSwgMHgxNUMxLCAweDcxNTYsIDB4MTVDNiwgMHg3MTU5LCAweDA1MEUsCi0gICAgMHg3MTVDLCAweDIxNUIsIDB4NzE2MCwgMHgzOUFCLCAweDcxNjIsIDB4MTVDNCwgMHg3MTY0LCAweDBEMTcsCi0gICAgMHg3MTY1LCAweDE1QzAsIDB4NzE2NiwgMHgxNUMzLCAweDcxNjcsIDB4MDlCMCwgMHg3MTY5LCAweDBENjUsCi0gICAgMHg3MTZDLCAweDE1QzcsIDB4NzE2RSwgMHgwOEZELCAweDcxNzksIDB4MzlBQywgMHg3MTdELCAweDBBOUUsCi0gICAgMHg3MTg0LCAweDE1Q0EsIDB4NzE4OCwgMHgxNUMyLCAweDcxOEEsIDB4MDZGRCwgMHg3MThGLCAweDE1QzgsCi0gICAgMHg3MTkyLCAweDM5QUQsIDB4NzE5NCwgMHgwRjNBLCAweDcxOTUsIDB4MTVDQiwgMHg3MTk5LCAweDIwNUQsCi0gICAgMHg3MTlGLCAweDA5NTksIDB4NzFBOCwgMHgxNUNDLCAweDcxQUMsIDB4MTVDRCwgMHg3MUIxLCAweDBDRTQsCi0gICAgMHg3MUIzLCAweDM5QUUsIDB4NzFCOSwgMHgxNUNGLCAweDcxQkUsIDB4MTVEMCwgMHg3MUMxLCAweDIxNUYsCi0gICAgMHg3MUMzLCAweDBDRTksIDB4NzFDOCwgMHgwQzZGLCAweDcxQzksIDB4MTVEMiwgMHg3MUNCLCAweDM5QUYsCi0gICAgMHg3MUNFLCAweDE1RDQsIDB4NzFEMCwgMHgwRjlELCAweDcxRDIsIDB4MTVEMSwgMHg3MUQzLCAweDM5QjAsCi0gICAgMHg3MUQ0LCAweDE1RDMsIDB4NzFENSwgMHgwNTBGLCAweDcxRDYsIDB4MzlCMSwgMHg3MUQ3LCAweDE1Q0UsCi0gICAgMHg3MURGLCAweDExNEUsIDB4NzFFMCwgMHgxNUQ1LCAweDcxRTUsIDB4MEFFOSwgMHg3MUU2LCAweDA4ODYsCi0gICAgMHg3MUU3LCAweDE1RDcsIDB4NzFFQywgMHgxNUQ2LCAweDcxRUQsIDB4MDlFQSwgMHg3MUVFLCAweDEwRUUsCi0gICAgMHg3MUY1LCAweDE1RDgsIDB4NzFGOSwgMHgxNURBLCAweDcxRkIsIDB4MTVDOSwgMHg3MUZDLCAweDE1RDksCi0gICAgMHg3MUZFLCAweDIxNjAsIDB4NzFGRiwgMHgxNURCLCAweDcyMDAsIDB4MzlCMiwgMHg3MjA2LCAweDBEMzAsCi0gICAgMHg3MjBELCAweDE1REMsIDB4NzIxMCwgMHgxNURELCAweDcyMUIsIDB4MTVERSwgMHg3MjFELCAweDM5QjMsCi0gICAgMHg3MjI4LCAweDE1REYsIDB4NzIyQSwgMHgwQkZBLCAweDcyMkIsIDB4MzlCNCwgMHg3MjJDLCAweDE1RTEsCi0gICAgMHg3MjJELCAweDE1RTAsIDB4NzIzMCwgMHgxNUUyLCAweDcyMzIsIDB4MTVFMywgMHg3MjM1LCAweDA5MEIsCi0gICAgMHg3MjM2LCAweDBERDUsIDB4NzIzOCwgMHgzOUI1LCAweDcyM0EsIDB4MEVGOCwgMHg3MjNCLCAweDE1RTQsCi0gICAgMHg3MjNDLCAweDE1RTUsIDB4NzIzRCwgMHgwQUQ4LCAweDcyM0UsIDB4MDhEMCwgMHg3MjNGLCAweDE1RTYsCi0gICAgMHg3MjQwLCAweDE1RTcsIDB4NzI0MSwgMHgzOUI2LCAweDcyNDYsIDB4MTVFOCwgMHg3MjQ3LCAweDBFMjIsCi0gICAgMHg3MjQ4LCAweDBENUIsIDB4NzI0QiwgMHgxNUU5LCAweDcyNEMsIDB4MEQwRCwgMHg3MjUyLCAweDBCQzksCi0gICAgMHg3MjUzLCAweDM5QjcsIDB4NzI1NSwgMHgzOUI4LCAweDcyNTYsIDB4MzlCOSwgMHg3MjU4LCAweDE1RUEsCi0gICAgMHg3MjU5LCAweDA1NjcsIDB4NzI1QiwgMHgwNjg3LCAweDcyNUMsIDB4MzlCQSwgMHg3MjVELCAweDBFRDIsCi0gICAgMHg3MjVGLCAweDBFQzIsIDB4NzI2MSwgMHgwNTM0LCAweDcyNjIsIDB4MEZEQSwgMHg3MjY3LCAweDBFODAsCi0gICAgMHg3MjY5LCAweDBERkEsIDB4NzI3MiwgMHgwQTVCLCAweDcyNzQsIDB4MTVFQiwgMHg3Mjc5LCAweDBDOUIsCi0gICAgMHg3MjdELCAweDA3NTcsIDB4NzI3RSwgMHgxNUVDLCAweDcyODAsIDB4MDg0NCwgMHg3MjgxLCAweDE1RUUsCi0gICAgMHg3MjgyLCAweDE1RUQsIDB4NzI4NywgMHgxNUVGLCAweDcyOEQsIDB4MzlCQiwgMHg3MjkyLCAweDE1RjAsCi0gICAgMHg3Mjk2LCAweDE1RjEsIDB4NzJBMCwgMHgwNjU4LCAweDcyQTIsIDB4MTVGMiwgMHg3MkE3LCAweDE1RjMsCi0gICAgMHg3MkFDLCAweDA3NTgsIDB4NzJBRCwgMHgzOUJDLCAweDcyQUYsIDB4MEQ1QywgMHg3MkIxLCAweDIxNjEsCi0gICAgMHg3MkIyLCAweDE1RjUsIDB4NzJCNCwgMHgzOUJELCAweDcyQjYsIDB4MDlERCwgMHg3MkI5LCAweDE1RjQsCi0gICAgMHg3MkJFLCAweDIxNjIsIDB4NzJDMCwgMHgzNDJCLCAweDcyQzIsIDB4MDZCMCwgMHg3MkMzLCAweDE1RjYsCi0gICAgMHg3MkM0LCAweDE1RjgsIDB4NzJDNiwgMHgxNUY3LCAweDcyQzcsIDB4MzlCRSwgMHg3MkNFLCAweDE1RjksCi0gICAgMHg3MkQwLCAweDA3ODUsIDB4NzJEMiwgMHgxNUZBLCAweDcyRDcsIDB4MDZFMSwgMHg3MkQ5LCAweDBBQzIsCi0gICAgMHg3MkRCLCAweDA4MEYsIDB4NzJFMCwgMHgxNUZDLCAweDcyRTEsIDB4MTVGRCwgMHg3MkUyLCAweDE1RkIsCi0gICAgMHg3MkU5LCAweDA5MTksIDB4NzJFQywgMHgwQ0EwLCAweDcyRUQsIDB4MDZCMSwgMHg3MkY3LCAweDE1RkYsCi0gICAgMHg3MkY4LCAweDBCNkEsIDB4NzJGOSwgMHgxNUZFLCAweDcyRkIsIDB4MzlCRiwgMHg3MkZDLCAweDBGREIsCi0gICAgMHg3MkZELCAweDBEMTgsIDB4NzMwNCwgMHgzOUMwLCAweDczMDUsIDB4MzlDMSwgMHg3MzBBLCAweDE2MDIsCi0gICAgMHg3MzE2LCAweDE2MDQsIDB4NzMxNywgMHgxNjAxLCAweDczMUIsIDB4MEVFMCwgMHg3MzFDLCAweDE2MDMsCi0gICAgMHg3MzFELCAweDE2MDUsIDB4NzMxRiwgMHgwRjhDLCAweDczMjQsIDB4MjE2MywgMHg3MzI1LCAweDE2MDksCi0gICAgMHg3MzI4LCAweDM5QzIsIDB4NzMyOSwgMHgxNjA4LCAweDczMkEsIDB4MEJCNCwgMHg3MzJCLCAweDBDRTMsCi0gICAgMHg3MzJFLCAweDA3NTksIDB4NzMyRiwgMHgxNjA3LCAweDczMzEsIDB4MzlDMywgMHg3MzM0LCAweDE2MDYsCi0gICAgMHg3MzM2LCAweDBGMUIsIDB4NzMzNywgMHgwRjFDLCAweDczM0UsIDB4MTYwQSwgMHg3MzNGLCAweDA1MTAsCi0gICAgMHg3MzQzLCAweDM5QzQsIDB4NzM0NCwgMHgwODA4LCAweDczNDUsIDB4MDhCMCwgMHg3MzRFLCAweDE2MEIsCi0gICAgMHg3MzRGLCAweDE2MEMsIDB4NzM1NywgMHgxNjBFLCAweDczNjMsIDB4MDk0RCwgMHg3MzY4LCAweDE2MTAsCi0gICAgMHg3MzZBLCAweDE2MEYsIDB4NzM2QywgMHgzOUM1LCAweDczNzAsIDB4MTYxMSwgMHg3MzcyLCAweDA1QUIsCi0gICAgMHg3Mzc1LCAweDE2MTMsIDB4NzM3NywgMHgyMTY1LCAweDczNzgsIDB4MTYxMiwgMHg3MzdBLCAweDE2MTUsCi0gICAgMHg3MzdCLCAweDE2MTQsIDB4NzM3QywgMHgzOUM2LCAweDczODMsIDB4MzlDNywgMHg3Mzg0LCAweDA3NzAsCi0gICAgMHg3Mzg1LCAweDM5QzgsIDB4NzM4NiwgMHgzOUM5LCAweDczODcsIDB4MEY3MCwgMHg3Mzg5LCAweDA2QzQsCi0gICAgMHg3MzhCLCAweDA1MjYsIDB4NzM5NSwgMHgzOUNBLCAweDczOTYsIDB4MDZFMiwgMHg3MzlFLCAweDM5Q0IsCi0gICAgMHg3MzlGLCAweDM5Q0MsIDB4NzNBMCwgMHgzOUNELCAweDczQTYsIDB4MzlDRSwgMHg3M0E4LCAweDNDM0YsCi0gICAgMHg3M0E5LCAweDA2MUQsIDB4NzNBQiwgMHgzOUNGLCAweDczQjIsIDB4MEZCMCwgMHg3M0IzLCAweDE2MTcsCi0gICAgMHg3M0I1LCAweDM5RDAsIDB4NzNCNywgMHgzOUQxLCAweDczQkEsIDB4MzVFQSwgMHg3M0JCLCAweDE2MTksCi0gICAgMHg3M0JDLCAweDM5RDIsIDB4NzNCRCwgMHgyMTY2LCAweDczQzAsIDB4MTYxQSwgMHg3M0MyLCAweDA1NTEsCi0gICAgMHg3M0M4LCAweDE2MTYsIDB4NzNDOSwgMHgyMTY3LCAweDczQ0EsIDB4MDg4NywgMHg3M0NELCAweDBCREQsCi0gICAgMHg3M0NFLCAweDE2MTgsIDB4NzNDRiwgMHgzOUQzLCAweDczRDIsIDB4MjE2QSwgMHg3M0Q2LCAweDIxNjgsCi0gICAgMHg3M0Q5LCAweDM5RDQsIDB4NzNERSwgMHgxNjFELCAweDczRTAsIDB4MDkxQSwgMHg3M0UzLCAweDIxNjksCi0gICAgMHg3M0U0LCAweDNDMzksIDB4NzNFNSwgMHgxNjFCLCAweDczRTksIDB4MzlENSwgMHg3M0VBLCAweDA3MTQsCi0gICAgMHg3M0VELCAweDBENUQsIDB4NzNFRSwgMHgxNjFDLCAweDczRjEsIDB4MTYzNywgMHg3M0Y0LCAweDM5RDYsCi0gICAgMHg3M0Y1LCAweDIxNkMsIDB4NzNGOCwgMHgxNjIyLCAweDczRkQsIDB4MzlENywgMHg3M0ZFLCAweDA3NzEsCi0gICAgMHg3NDAzLCAweDA2N0YsIDB4NzQwNCwgMHgzOUQ4LCAweDc0MDUsIDB4MTYxRiwgMHg3NDA2LCAweDBGNjcsCi0gICAgMHg3NDA3LCAweDIxNkIsIDB4NzQwOSwgMHgwRjc4LCAweDc0MEEsIDB4MzlEOSwgMHg3NDFBLCAweDM5REEsCi0gICAgMHg3NDFCLCAweDM5REIsIDB4NzQyMSwgMHgzQzNBLCAweDc0MjIsIDB4MEI1NiwgMHg3NDI0LCAweDM5REMsCi0gICAgMHg3NDI1LCAweDE2MjEsIDB4NzQyNiwgMHgyMTZELCAweDc0MjgsIDB4MzlERCwgMHg3NDI5LCAweDIxNkYsCi0gICAgMHg3NDJBLCAweDIxNkUsIDB4NzQyQywgMHgzOURFLCAweDc0MkUsIDB4MjE3MCwgMHg3NDJGLCAweDM5REYsCi0gICAgMHg3NDMwLCAweDM5RTAsIDB4NzQzMSwgMHgzOUUxLCAweDc0MzIsIDB4MTYyMywgMHg3NDMzLCAweDBGOUUsCi0gICAgMHg3NDM0LCAweDA2Q0YsIDB4NzQzNSwgMHgwRDkwLCAweDc0MzYsIDB4MEQwMCwgMHg3NDM5LCAweDM5RTIsCi0gICAgMHg3NDNBLCAweDE2MjQsIDB4NzQzRiwgMHgxNjI2LCAweDc0NDEsIDB4MTYyOSwgMHg3NDQ0LCAweDM5RTMsCi0gICAgMHg3NDQ3LCAweDM5RTQsIDB4NzQ0QiwgMHgzOUU1LCAweDc0NEQsIDB4MzlFNiwgMHg3NDUxLCAweDM5RTcsCi0gICAgMHg3NDU1LCAweDE2MjUsIDB4NzQ1NywgMHgzOUU4LCAweDc0NTksIDB4MTYyOCwgMHg3NDVBLCAweDA3OUUsCi0gICAgMHg3NDVCLCAweDA0RUYsIDB4NzQ1QywgMHgxNjJBLCAweDc0NUUsIDB4MEEzNiwgMHg3NDVGLCAweDE2MjcsCi0gICAgMHg3NDYwLCAweDBGQTQsIDB4NzQ2MiwgMHgyMTcxLCAweDc0NjMsIDB4MTYyRCwgMHg3NDY0LCAweDFEMzUsCi0gICAgMHg3NDY2LCAweDM5RTksIDB4NzQ2OSwgMHgxNjJCLCAweDc0NkEsIDB4MTYyRSwgMHg3NDZCLCAweDM5RUEsCi0gICAgMHg3NDZGLCAweDE2MjAsIDB4NzQ3MCwgMHgxNjJDLCAweDc0NzEsIDB4MzlFQiwgMHg3NDczLCAweDA4MkMsCi0gICAgMHg3NDc2LCAweDE2MkYsIDB4NzQ3RSwgMHgxNjMwLCAweDc0ODAsIDB4MzlFQywgMHg3NDgzLCAweDBGNjgsCi0gICAgMHg3NDg1LCAweDM5RUQsIDB4NzQ4NiwgMHgzOUVFLCAweDc0ODcsIDB4MzlFRiwgMHg3NDg5LCAweDIxNzIsCi0gICAgMHg3NDhCLCAweDE2MzEsIDB4NzQ5MCwgMHgzOUYwLCAweDc0OTgsIDB4MzlGMSwgMHg3NDlDLCAweDM5RjIsCi0gICAgMHg3NDlFLCAweDE2MzIsIDB4NzQ5RiwgMHgyMTczLCAweDc0QTAsIDB4MzlGMywgMHg3NEEyLCAweDE2MUUsCi0gICAgMHg3NEEzLCAweDM5RjQsIDB4NzRBNywgMHgxNjMzLCAweDc0QTgsIDB4MzlGNSwgMHg3NEFCLCAweDM5RjYsCi0gICAgMHg3NEIwLCAweDA2MDAsIDB4NzRCNSwgMHgzOUY3LCAweDc0QkQsIDB4MDhEMSwgMHg3NEJGLCAweDM5RjgsCi0gICAgMHg3NEM4LCAweDM5RjksIDB4NzRDQSwgMHgxNjM0LCAweDc0Q0YsIDB4MTYzNSwgMHg3NEQ0LCAweDE2MzYsCi0gICAgMHg3NERBLCAweDM5RkEsIDB4NzREQywgMHgwNERELCAweDc0REUsIDB4MzlGQiwgMHg3NEUwLCAweDE2MzgsCi0gICAgMHg3NEUyLCAweDBEQUQsIDB4NzRFMywgMHgxNjM5LCAweDc0RTYsIDB4MDVFMCwgMHg3NEU3LCAweDE2M0EsCi0gICAgMHg3NEU5LCAweDE2M0IsIDB4NzRFRSwgMHgxNjNDLCAweDc0RUYsIDB4Mzc1MCwgMHg3NEYwLCAweDE2M0UsCi0gICAgMHg3NEYxLCAweDE2M0YsIDB4NzRGMiwgMHgxNjNELCAweDc0RjYsIDB4MERDNSwgMHg3NEY3LCAweDE2NDEsCi0gICAgMHg3NEY4LCAweDE2NDAsIDB4NzUwMSwgMHgyMTc0LCAweDc1MDMsIDB4MTY0MywgMHg3NTA0LCAweDE2NDIsCi0gICAgMHg3NTA1LCAweDE2NDQsIDB4NzUwQywgMHgxNjQ1LCAweDc1MEQsIDB4MTY0NywgMHg3NTBFLCAweDE2NDYsCi0gICAgMHg3NTExLCAweDA4MEIsIDB4NzUxMywgMHgxNjQ5LCAweDc1MTUsIDB4MTY0OCwgMHg3NTE4LCAweDA2MDEsCi0gICAgMHg3NTFBLCAweDBBMTksIDB4NzUxQywgMHgwQzM2LCAweDc1MUUsIDB4MTY0QSwgMHg3NTFGLCAweDBBNUMsCi0gICAgMHg3NTIyLCAweDM1REUsIDB4NzUyMywgMHgwODg4LCAweDc1MjUsIDB4MDUxQiwgMHg3NTI2LCAweDE2NEIsCi0gICAgMHg3NTI4LCAweDBGM0IsIDB4NzUyQiwgMHgwRTMzLCAweDc1MkMsIDB4MTY0QywgMHg3NTJGLCAweDIwRjIsCi0gICAgMHg3NTMwLCAweDBDM0UsIDB4NzUzMSwgMHgwRjFELCAweDc1MzIsIDB4MDdENSwgMHg3NTMzLCAweDBBMDMsCi0gICAgMHg3NTM3LCAweDBCODksIDB4NzUzOCwgMHgxMEM5LCAweDc1M0EsIDB4MEJDQSwgMHg3NTNCLCAweDA1NjgsCi0gICAgMHg3NTNDLCAweDE2NEQsIDB4NzU0NCwgMHgxNjRFLCAweDc1NDYsIDB4MTY1MywgMHg3NTQ5LCAweDE2NTEsCi0gICAgMHg3NTRBLCAweDE2NTAsIDB4NzU0QiwgMHgxM0M3LCAweDc1NEMsIDB4MDU4NCwgMHg3NTRELCAweDE2NEYsCi0gICAgMHg3NTRFLCAweDM5RkMsIDB4NzU0RiwgMHgwNDlFLCAweDc1NTEsIDB4MEQzRSwgMHg3NTU0LCAweDBENUUsCi0gICAgMHg3NTU5LCAweDBGNzksIDB4NzU1QSwgMHgxNjU0LCAweDc1NUIsIDB4MTY1MiwgMHg3NTVDLCAweDBCOUEsCi0gICAgMHg3NTVELCAweDBBNEEsIDB4NzU2MCwgMHgwRDNGLCAweDc1NjIsIDB4MEQ5RiwgMHg3NTY0LCAweDE2NTYsCi0gICAgMHg3NTY1LCAweDBGNzQsIDB4NzU2NiwgMHgwNzIzLCAweDc1NjcsIDB4MTY1NywgMHg3NTY5LCAweDE2NTUsCi0gICAgMHg3NTZBLCAweDBENkEsIDB4NzU2QiwgMHgxNjU4LCAweDc1NkMsIDB4M0MzQiwgMHg3NTZELCAweDE2NTksCi0gICAgMHg3NTZGLCAweDIxNzUsIDB4NzU3MCwgMHgwNDlGLCAweDc1NzMsIDB4MDlERSwgMHg3NTc0LCAweDE2NUUsCi0gICAgMHg3NTc1LCAweDM3NTEsIDB4NzU3NiwgMHgxNjVCLCAweDc1NzcsIDB4MENDNSwgMHg3NTc4LCAweDE2NUEsCi0gICAgMHg3NTc5LCAweDM5RkQsIDB4NzU3RiwgMHgwNjQwLCAweDc1ODEsIDB4MzlGRSwgMHg3NTgyLCAweDE2NjEsCi0gICAgMHg3NTg2LCAweDE2NUMsIDB4NzU4NywgMHgxNjVELCAweDc1ODksIDB4MTY2MCwgMHg3NThBLCAweDE2NUYsCi0gICAgMHg3NThCLCAweDBEOTcsIDB4NzU4RSwgMHgwQUM0LCAweDc1OEYsIDB4MEFDMywgMHg3NTkwLCAweDM5RkYsCi0gICAgMHg3NTkxLCAweDA2NTksIDB4NzU5MiwgMHgzQTAwLCAweDc1OTMsIDB4M0EwMSwgMHg3NTk0LCAweDE2NjIsCi0gICAgMHg3NTlBLCAweDE2NjMsIDB4NzU5RCwgMHgxNjY0LCAweDc1QTMsIDB4MTY2NiwgMHg3NUE1LCAweDE2NjUsCi0gICAgMHg3NUFCLCAweDA0RjgsIDB4NzVCMSwgMHgxNjZFLCAweDc1QjIsIDB4MEQ3QywgMHg3NUIzLCAweDE2NjgsCi0gICAgMHg3NUI0LCAweDNBMDIsIDB4NzVCNSwgMHgxNjZBLCAweDc1QjgsIDB4MTY2QywgMHg3NUI5LCAweDBBMDQsCi0gICAgMHg3NUJDLCAweDE2NkQsIDB4NzVCRCwgMHgxNjZCLCAweDc1QkUsIDB4MDhFQywgMHg3NUMyLCAweDE2NjcsCi0gICAgMHg3NUMzLCAweDE2NjksIDB4NzVDNSwgMHgwREI0LCAweDc1QzcsIDB4MDlCMSwgMHg3NUNBLCAweDE2NzAsCi0gICAgMHg3NUNELCAweDE2NkYsIDB4NzVEMiwgMHgxNjcxLCAweDc1RDQsIDB4MDhEMiwgMHg3NUQ1LCAweDA4MUYsCi0gICAgMHg3NUQ4LCAweDBDNzEsIDB4NzVEOSwgMHgxNjcyLCAweDc1REIsIDB4MEJFNywgMHg3NURFLCAweDE2NzQsCi0gICAgMHg3NUUyLCAweDBGNjksIDB4NzVFMywgMHgxNjczLCAweDc1RTQsIDB4M0EwMywgMHg3NUU5LCAweDBBRUIsCi0gICAgMHg3NUVDLCAweDM3NTIsIDB4NzVGMCwgMHgxNjc5LCAweDc1RjIsIDB4MTY3QiwgMHg3NUYzLCAweDE2N0MsCi0gICAgMHg3NUY0LCAweDBCOTIsIDB4NzVGOSwgMHgzQTA0LCAweDc1RkEsIDB4MTY3QSwgMHg3NUZDLCAweDE2NzcsCi0gICAgMHg3NUZFLCAweDE2NzUsIDB4NzVGRiwgMHgxNjc2LCAweDc2MDAsIDB4M0EwNSwgMHg3NjAxLCAweDE2NzgsCi0gICAgMHg3NjA5LCAweDE2N0YsIDB4NzYwQSwgMHgzQTA2LCAweDc2MEIsIDB4MTY3RCwgMHg3NjBELCAweDE2N0UsCi0gICAgMHg3NjE1LCAweDNBMDcsIDB4NzYxNiwgMHgzQTA4LCAweDc2MTksIDB4M0EwOSwgMHg3NjFFLCAweDNBMEEsCi0gICAgMHg3NjFGLCAweDE2ODAsIDB4NzYyMCwgMHgxNjgyLCAweDc2MjEsIDB4MTY4MywgMHg3NjIyLCAweDE2ODQsCi0gICAgMHg3NjI0LCAweDE2ODUsIDB4NzYyNiwgMHgxRTJELCAweDc2MjcsIDB4MTY4MSwgMHg3NjJELCAweDNBMEIsCi0gICAgMHg3NjMwLCAweDE2ODcsIDB4NzYzNCwgMHgxNjg2LCAweDc2MzUsIDB4M0EwQywgMHg3NjNCLCAweDE2ODgsCi0gICAgMHg3NjQyLCAweDBGOEQsIDB4NzY0MywgMHgzQTBELCAweDc2NDYsIDB4MTY4QiwgMHg3NjQ3LCAweDE2ODksCi0gICAgMHg3NjQ4LCAweDE2OEEsIDB4NzY0QiwgMHgzQTBFLCAweDc2NEMsIDB4MDYxRSwgMHg3NjRFLCAweDM3NTMsCi0gICAgMHg3NjUyLCAweDBGMEEsIDB4NzY1NiwgMHgwRTFBLCAweDc2NTgsIDB4MTY4RCwgMHg3NjVDLCAweDE2OEMsCi0gICAgMHg3NjYxLCAweDE2OEUsIDB4NzY2MiwgMHgxNjhGLCAweDc2NjUsIDB4M0EwRiwgMHg3NjY3LCAweDE2OTMsCi0gICAgMHg3NjY4LCAweDE2OTAsIDB4NzY2OSwgMHgxNjkxLCAweDc2NkEsIDB4MTY5MiwgMHg3NjZDLCAweDE2OTQsCi0gICAgMHg3NjZELCAweDNBMTAsIDB4NzY2RiwgMHgzQTExLCAweDc2NzAsIDB4MTY5NSwgMHg3NjcxLCAweDNBMTIsCi0gICAgMHg3NjcyLCAweDE2OTYsIDB4NzY3NCwgMHgzQTEzLCAweDc2NzYsIDB4MTY5NywgMHg3Njc4LCAweDE2OTgsCi0gICAgMHg3NjdBLCAweDBENDMsIDB4NzY3QiwgMHgwQzRBLCAweDc2N0MsIDB4MTY5OSwgMHg3NjdELCAweDBEMjgsCi0gICAgMHg3NjdFLCAweDBEQTYsIDB4NzY4MCwgMHgxNjlBLCAweDc2ODIsIDB4MjE3NiwgMHg3NjgzLCAweDE2OUIsCi0gICAgMHg3Njg0LCAweDBDMjQsIDB4NzY4NiwgMHgwNTg1LCAweDc2ODcsIDB4MDdENiwgMHg3Njg4LCAweDE2OUMsCi0gICAgMHg3NjhCLCAweDE2OUQsIDB4NzY4RSwgMHgxNjlFLCAweDc2OTAsIDB4MDg3NywgMHg3NjkzLCAweDE2QTAsCi0gICAgMHg3Njk2LCAweDE2OUYsIDB4NzY5OSwgMHgxNkExLCAweDc2OUEsIDB4MTZBMiwgMHg3NjlCLCAweDIxNzksCi0gICAgMHg3NjlDLCAweDIxNzcsIDB4NzY5RSwgMHgyMTc4LCAweDc2QTQsIDB4M0ExNCwgMHg3NkE1LCAweDNBMTUsCi0gICAgMHg3NkE2LCAweDIxN0EsIDB4NzZBRSwgMHgwRDdELCAweDc2QjAsIDB4MTZBMywgMHg3NkI0LCAweDE2QTQsCi0gICAgMHg3NkI3LCAweDFEMUMsIDB4NzZCOCwgMHgxNkE1LCAweDc2QjksIDB4MTZBNiwgMHg3NkJBLCAweDE2QTcsCi0gICAgMHg3NkJGLCAweDA4N0MsIDB4NzZDMiwgMHgxNkE4LCAweDc2QzMsIDB4MEQwQywgMHg3NkM1LCAweDNBMTYsCi0gICAgMHg3NkM2LCAweDBFOEQsIDB4NzZDOCwgMHgwNEYwLCAweDc2Q0EsIDB4MDRGOSwgMHg3NkNDLCAweDNBMTcsCi0gICAgMHg3NkNELCAweDE2QTksIDB4NzZEMiwgMHgxNkFCLCAweDc2RDYsIDB4MTZBQSwgMHg3NkQ3LCAweDBDNkEsCi0gICAgMHg3NkRCLCAweDBBNUQsIDB4NzZEQywgMHgxNEQ4LCAweDc2REUsIDB4MTZBQywgMHg3NkRGLCAweDBFQ0QsCi0gICAgMHg3NkUxLCAweDE2QUQsIDB4NzZFMywgMHgwNjAyLCAweDc2RTQsIDB4MEQ2QiwgMHg3NkU1LCAweDE2QUUsCi0gICAgMHg3NkU3LCAweDE2QUYsIDB4NzZFQSwgMHgxNkIwLCAweDc2RUMsIDB4M0ExOCwgMHg3NkVFLCAweDBFRTgsCi0gICAgMHg3NkYyLCAweDBFRTEsIDB4NzZGNCwgMHgwQkRBLCAweDc2RjgsIDB4MEFFQywgMHg3NkZCLCAweDE2QjIsCi0gICAgMHg3NkZDLCAweDNBMTksIDB4NzZGRSwgMHgwOTZDLCAweDc3MDEsIDB4MDlCMiwgMHg3NzA0LCAweDE2QjUsCi0gICAgMHg3NzA3LCAweDE2QjQsIDB4NzcwOCwgMHgxNkIzLCAweDc3MDksIDB4MEQ5MSwgMHg3NzBCLCAweDA2MDMsCi0gICAgMHg3NzBDLCAweDA3NUQsIDB4NzcxQiwgMHgxNkJCLCAweDc3MUUsIDB4MTZCOCwgMHg3NzFGLCAweDBBMDUsCi0gICAgMHg3NzIwLCAweDBFQkUsIDB4NzcyNCwgMHgxNkI3LCAweDc3MjUsIDB4MTZCOSwgMHg3NzI2LCAweDE2QkEsCi0gICAgMHg3NzI5LCAweDE2QjYsIDB4NzczNCwgMHgzQTFBLCAweDc3MzYsIDB4M0ExQiwgMHg3NzM3LCAweDE2QkMsCi0gICAgMHg3NzM4LCAweDE2QkQsIDB4NzczQSwgMHgwQkNCLCAweDc3M0MsIDB4MDYxRiwgMHg3NzQwLCAweDBCQTMsCi0gICAgMHg3NzQ2LCAweDIxN0MsIDB4Nzc0NywgMHgxNkJFLCAweDc3NUEsIDB4MTZCRiwgMHg3NzVCLCAweDE2QzIsCi0gICAgMHg3NzVDLCAweDNBMUMsIDB4Nzc1RiwgMHgzQTFELCAweDc3NjAsIDB4M0ExRSwgMHg3NzYxLCAweDBBMkQsCi0gICAgMHg3NzYyLCAweDFFQzUsIDB4Nzc2MywgMHgwQzlDLCAweDc3NjUsIDB4MTZDMywgMHg3NzY2LCAweDBFODEsCi0gICAgMHg3NzY4LCAweDE2QzAsIDB4Nzc2QSwgMHgzNzU1LCAweDc3NkIsIDB4MTZDMSwgMHg3NzcyLCAweDNBMUYsCi0gICAgMHg3Nzc5LCAweDE2QzYsIDB4Nzc3RCwgMHgzQTIwLCAweDc3N0UsIDB4MTZDNSwgMHg3NzdGLCAweDE2QzQsCi0gICAgMHg3NzhCLCAweDE2QzgsIDB4Nzc4RSwgMHgxNkM3LCAweDc3OTEsIDB4MTZDOSwgMHg3Nzk1LCAweDNBMjEsCi0gICAgMHg3NzlFLCAweDE2Q0IsIDB4NzdBMCwgMHgxNkNBLCAweDc3QTUsIDB4MEUxRCwgMHg3N0E5LCAweDM3NTYsCi0gICAgMHg3N0FBLCAweDNBMjIsIDB4NzdBQywgMHgwOTYwLCAweDc3QUQsIDB4MEY4RSwgMHg3N0IwLCAweDE2Q0MsCi0gICAgMHg3N0IzLCAweDBDOEYsIDB4NzdCNiwgMHgxNkNELCAweDc3QjksIDB4MTZDRSwgMHg3N0JCLCAweDE2RDIsCi0gICAgMHg3N0JDLCAweDE2RDAsIDB4NzdCRCwgMHgxNkQxLCAweDc3QkYsIDB4MTZDRiwgMHg3N0M3LCAweDE2RDMsCi0gICAgMHg3N0NELCAweDE2RDQsIDB4NzdENywgMHgxNkQ1LCAweDc3REEsIDB4MTZENiwgMHg3N0RCLCAweDBFQzMsCi0gICAgMHg3N0RDLCAweDE2RDcsIDB4NzdFMiwgMHgwRUZDLCAweDc3RTMsIDB4MTZEOCwgMHg3N0U1LCAweDBCOEMsCi0gICAgMHg3N0U2LCAweDNBMjMsIDB4NzdFNywgMHgwRDIwLCAweDc3RTksIDB4MDZFMywgMHg3N0VELCAweDBCNzksCi0gICAgMHg3N0VFLCAweDE2RDksIDB4NzdFRiwgMHgwNkIyLCAweDc3RjAsIDB4M0EyNCwgMHg3N0YzLCAweDBBNzQsCi0gICAgMHg3N0Y0LCAweDNBMjUsIDB4NzdGQywgMHgxNkRBLCAweDc4MDIsIDB4MDgyRCwgMHg3ODA2LCAweDNBMjYsCi0gICAgMHg3ODBDLCAweDE2REIsIDB4NzgxMiwgMHgxNkRDLCAweDc4MTQsIDB4MDc1QSwgMHg3ODE1LCAweDA4NDUsCi0gICAgMHg3ODIwLCAweDE2REUsIDB4NzgyMSwgMHgyMTdFLCAweDc4MjIsIDB4M0EyNywgMHg3ODI1LCAweDBDNTAsCi0gICAgMHg3ODI2LCAweDA4NDYsIDB4NzgyNywgMHgwNjY4LCAweDc4MkQsIDB4M0EyOCwgMHg3ODJFLCAweDNBMjksCi0gICAgMHg3ODMwLCAweDNBMkEsIDB4NzgzMiwgMHgwRTUyLCAweDc4MzQsIDB4MEQwMSwgMHg3ODM1LCAweDNBMkIsCi0gICAgMHg3ODNBLCAweDBDNTEsIDB4NzgzRiwgMHgwN0VFLCAweDc4NDUsIDB4MTZFMCwgMHg3ODRFLCAweDIxN0YsCi0gICAgMHg3ODRGLCAweDM0MUUsIDB4Nzg1MSwgMHgzQzNDLCAweDc4NUQsIDB4MDlCMywgMHg3ODY0LCAweDIxODAsCi0gICAgMHg3ODY4LCAweDNBMkMsIDB4Nzg2QiwgMHgwRjdBLCAweDc4NkMsIDB4MDdENywgMHg3ODZGLCAweDA3NUIsCi0gICAgMHg3ODcyLCAweDBEMzcsIDB4Nzg3NCwgMHgxNkUyLCAweDc4N0EsIDB4MjE4MSwgMHg3ODdDLCAweDE2RTQsCi0gICAgMHg3ODgxLCAweDA3OUYsIDB4Nzg4NiwgMHgxNkUzLCAweDc4ODcsIDB4MEMxMiwgMHg3ODhDLCAweDE2RTYsCi0gICAgMHg3ODhELCAweDA1OTUsIDB4Nzg4RSwgMHgxNkUxLCAweDc4OTEsIDB4MEQ3RSwgMHg3ODkzLCAweDA0RDIsCi0gICAgMHg3ODk1LCAweDA4NUMsIDB4Nzg5NywgMHgwRkY4LCAweDc4OUEsIDB4MTZFNSwgMHg3ODlFLCAweDNBMkQsCi0gICAgMHg3OEEzLCAweDE2RTcsIDB4NzhBNywgMHgwRTFCLCAweDc4QTksIDB4MEE3RCwgMHg3OEFBLCAweDE2RTksCi0gICAgMHg3OEFGLCAweDE2RUEsIDB4NzhCNSwgMHgxNkU4LCAweDc4QkEsIDB4MDVBQywgMHg3OEJDLCAweDE2RjAsCi0gICAgMHg3OEJFLCAweDE2RUYsIDB4NzhDMSwgMHgwOEQzLCAweDc4QzUsIDB4MTZGMSwgMHg3OEM2LCAweDE2RUMsCi0gICAgMHg3OEM4LCAweDNBMkUsIDB4NzhDQSwgMHgxNkYyLCAweDc4Q0IsIDB4MTZFRCwgMHg3OENDLCAweDNBMkYsCi0gICAgMHg3OENFLCAweDNBMzAsIDB4NzhEMCwgMHgwRDZDLCAweDc4RDEsIDB4MTZFQiwgMHg3OEQ0LCAweDE2RUUsCi0gICAgMHg3OERBLCAweDE2RjUsIDB4NzhFMCwgMHgzQTMyLCAweDc4RTEsIDB4M0EzMywgMHg3OEU0LCAweDNBMzEsCi0gICAgMHg3OEU3LCAweDE2RjQsIDB4NzhFOCwgMHgwRThGLCAweDc4RUMsIDB4MTZGMywgMHg3OEVGLCAweDA0QUYsCi0gICAgMHg3OEYyLCAweDNBMzQsIDB4NzhGNCwgMHgxNkY3LCAweDc4RjcsIDB4M0EzNSwgMHg3OEZCLCAweDNBMzYsCi0gICAgMHg3OEZELCAweDE2RjYsIDB4NzkwMSwgMHgwOUI0LCAweDc5MDcsIDB4MTZGOCwgMHg3OTBFLCAweDBBQzUsCi0gICAgMHg3OTExLCAweDE2RkEsIDB4NzkxMiwgMHgxNkY5LCAweDc5MTksIDB4MTZGQiwgMHg3OTI2LCAweDE2REQsCi0gICAgMHg3OTJBLCAweDE2REYsIDB4NzkyQiwgMHgxNkZELCAweDc5MkMsIDB4MTZGQywgMHg3OTMwLCAweDIxODIsCi0gICAgMHg3OTMxLCAweDNBMzcsIDB4NzkzNCwgMHgzQTM4LCAweDc5M0EsIDB4MDhENCwgMHg3OTNCLCAweDNBMzksCi0gICAgMHg3OTNDLCAweDBGQjEsIDB4NzkzRCwgMHgzQTNBLCAweDc5M0UsIDB4MDhGRSwgMHg3OTQwLCAweDE2RkUsCi0gICAgMHg3OTQxLCAweDA3MEQsIDB4Nzk0NSwgMHgzQTNCLCAweDc5NDcsIDB4MDY1QSwgMHg3OTQ4LCAweDA2NDEsCi0gICAgMHg3OTQ5LCAweDA4QjEsIDB4Nzk1MCwgMHgwRjFFLCAweDc5NTMsIDB4MTcwNCwgMHg3OTU1LCAweDE3MDMsCi0gICAgMHg3OTU2LCAweDBBQzYsIDB4Nzk1NywgMHgxNzAwLCAweDc5NUEsIDB4MTcwMiwgMHg3OTVCLCAweDNBM0MsCi0gICAgMHg3OTVDLCAweDNBM0QsIDB4Nzk1RCwgMHgwOTU1LCAweDc5NUUsIDB4MEEwNiwgMHg3OTVGLCAweDE3MDEsCi0gICAgMHg3OTYwLCAweDE2RkYsIDB4Nzk2MiwgMHgwQ0UwLCAweDc5NjUsIDB4MDlCNSwgMHg3OTY4LCAweDBEQUUsCi0gICAgMHg3OTZELCAweDA4NDcsIDB4Nzk3NywgMHgwQzcyLCAweDc5N0EsIDB4MTcwNSwgMHg3OTdGLCAweDE3MDYsCi0gICAgMHg3OTgwLCAweDE3MUMsIDB4Nzk4MSwgMHgwNkQwLCAweDc5ODQsIDB4MEZFMywgMHg3OTg1LCAweDBBQjcsCi0gICAgMHg3OThBLCAweDE3MDcsIDB4Nzk4QiwgMHgzQTNFLCAweDc5OEQsIDB4MDU1MiwgMHg3OThFLCAweDBDMTMsCi0gICAgMHg3OThGLCAweDBERjEsIDB4Nzk5NCwgMHgyMTg2LCAweDc5OTYsIDB4M0EzRiwgMHg3OTk4LCAweDNBNDAsCi0gICAgMHg3OTlCLCAweDIxODgsIDB4Nzk5RCwgMHgxNzA4LCAweDc5QTYsIDB4MDY5NCwgMHg3OUE3LCAweDE3MDksCi0gICAgMHg3OUFBLCAweDE3MEIsIDB4NzlBRSwgMHgxNzBDLCAweDc5QjAsIDB4MENERiwgMHg3OUIxLCAweDFFNEUsCi0gICAgMHg3OUIzLCAweDE3MEQsIDB4NzlCOCwgMHgzQTQxLCAweDc5QjksIDB4MTcwRSwgMHg3OUJBLCAweDE3MEYsCi0gICAgMHg3OUJCLCAweDNBNDIsIDB4NzlCRCwgMHgwNkQxLCAweDc5QkUsIDB4MDU1MywgMHg3OUJGLCAweDBDOUQsCi0gICAgMHg3OUMwLCAweDA5MzIsIDB4NzlDMSwgMHgwOEIyLCAweDc5QzksIDB4MTcxMCwgMHg3OUNBLCAweDNBNDMsCi0gICAgMHg3OUNCLCAweDA5MzMsIDB4NzlEMSwgMHgwNTRBLCAweDc5RDIsIDB4MERCNSwgMHg3OUQ1LCAweDE3MTEsCi0gICAgMHg3OUQ4LCAweDBEN0YsIDB4NzlEQSwgMHgzQTQ0LCAweDc5REYsIDB4MEFDNywgMHg3OUUxLCAweDE3MTQsCi0gICAgMHg3OUUzLCAweDE3MTUsIDB4NzlFNCwgMHgwRDFGLCAweDc5RTYsIDB4MEEwNywgMHg3OUU3LCAweDE3MTIsCi0gICAgMHg3OUU5LCAweDBCOUYsIDB4NzlFQywgMHgxNzEzLCAweDc5RjAsIDB4MDlCNiwgMHg3OUZCLCAweDA0QTAsCi0gICAgMHg3QTAwLCAweDA2NDMsIDB4N0EwMywgMHgzQTQ1LCAweDdBMDUsIDB4MzYzMywgMHg3QTA4LCAweDE3MTYsCi0gICAgMHg3QTA5LCAweDNBNDYsIDB4N0EwQiwgMHgwQzE0LCAweDdBMEQsIDB4MTcxNywgMHg3QTBFLCAweDBBNkIsCi0gICAgMHg3QTExLCAweDNBNDcsIDB4N0ExNCwgMHgwRUI5LCAweDdBMTcsIDB4MEQ5NSwgMHg3QTE4LCAweDE3MTgsCi0gICAgMHg3QTE5LCAweDE3MTksIDB4N0ExQSwgMHgwQjkzLCAweDdBMUMsIDB4MEY4RiwgMHg3QTFFLCAweDNBNDgsCi0gICAgMHg3QTFGLCAweDE3MUIsIDB4N0EyMCwgMHgxNzFBLCAweDdBMkQsIDB4M0E0OSwgMHg3QTJFLCAweDA5MUIsCi0gICAgMHg3QTMxLCAweDE3MUQsIDB4N0EzMiwgMHgwNEI0LCAweDdBMzcsIDB4MTcyMCwgMHg3QTM5LCAweDNBNEEsCi0gICAgMHg3QTNCLCAweDE3MUUsIDB4N0EzQywgMHgwNTU0LCAweDdBM0QsIDB4MDcyNCwgMHg3QTNFLCAweDE3MUYsCi0gICAgMHg3QTNGLCAweDA3RDgsIDB4N0E0MCwgMHgwODA0LCAweDdBNDIsIDB4MEUzNiwgMHg3QTQzLCAweDE3MjEsCi0gICAgMHg3QTQ1LCAweDNBNEIsIDB4N0E0NiwgMHgwRTgyLCAweDdBNDksIDB4MTcyMywgMHg3QTRDLCAweDNBNEMsCi0gICAgMHg3QTRELCAweDBBNzUsIDB4N0E0RSwgMHgwNEYxLCAweDdBNEYsIDB4MDUzQSwgMHg3QTUwLCAweDA0NzAsCi0gICAgMHg3QTU3LCAweDE3MjIsIDB4N0E1RCwgMHgzQTRELCAweDdBNjAsIDB4M0E0RSwgMHg3QTYxLCAweDE3MjQsCi0gICAgMHg3QTYyLCAweDE3MjUsIDB4N0E2MywgMHgwOURGLCAweDdBNjksIDB4MTcyNiwgMHg3QTZCLCAweDA1QUQsCi0gICAgMHg3QTZELCAweDNBNEYsIDB4N0E3MCwgMHgxNzI4LCAweDdBNzQsIDB4MDc0MCwgMHg3QTc2LCAweDA2ODAsCi0gICAgMHg3QTc4LCAweDNBNTAsIDB4N0E3OSwgMHgxNzI5LCAweDdBN0EsIDB4MDZFRCwgMHg3QTdELCAweDE3MkEsCi0gICAgMHg3QTdGLCAweDBBQTAsIDB4N0E4MSwgMHgwQ0E1LCAweDdBODMsIDB4MEE4NCwgMHg3QTg0LCAweDA4NjUsCi0gICAgMHg3QTg4LCAweDE3MkIsIDB4N0E5MiwgMHgwQkEwLCAweDdBOTMsIDB4MEFFRCwgMHg3QTk1LCAweDE3MkQsCi0gICAgMHg3QTk2LCAweDE3MkYsIDB4N0E5NywgMHgxNzJDLCAweDdBOTgsIDB4MTcyRSwgMHg3QTlGLCAweDA2RjgsCi0gICAgMHg3QUEwLCAweDNBNTEsIDB4N0FBMywgMHgzQTUyLCAweDdBQTksIDB4MTczMCwgMHg3QUFBLCAweDA2RkMsCi0gICAgMHg3QUFFLCAweDA2ODEsIDB4N0FBRiwgMHgwRjNDLCAweDdBQjAsIDB4MTczMiwgMHg3QUIzLCAweDNBNTMsCi0gICAgMHg3QUI2LCAweDE3MzMsIDB4N0FCQSwgMHgwNEQwLCAweDdBQkIsIDB4M0E1NCwgMHg3QUJDLCAweDNBNTUsCi0gICAgMHg3QUJGLCAweDE3MzYsIDB4N0FDMywgMHgwNUQ0LCAweDdBQzQsIDB4MTczNSwgMHg3QUM1LCAweDE3MzQsCi0gICAgMHg3QUM2LCAweDNBNTYsIDB4N0FDNywgMHgxNzM4LCAweDdBQzgsIDB4MTczMSwgMHg3QUNBLCAweDE3MzksCi0gICAgMHg3QUNCLCAweDBGNzEsIDB4N0FDRCwgMHgxNzNBLCAweDdBQ0YsIDB4MTczQiwgMHg3QUQxLCAweDIxODksCi0gICAgMHg3QUQyLCAweDExQzUsIDB4N0FEMywgMHgxNzNELCAweDdBRDUsIDB4MTczQywgMHg3QUQ5LCAweDE3M0UsCi0gICAgMHg3QURBLCAweDE3M0YsIDB4N0FEQywgMHgwRjdELCAweDdBREQsIDB4MTc0MCwgMHg3QURGLCAweDFDMDgsCi0gICAgMHg3QUUwLCAweDA5QjcsIDB4N0FFMSwgMHgxNzQxLCAweDdBRTIsIDB4MTc0MiwgMHg3QUUzLCAweDA5NjEsCi0gICAgMHg3QUU1LCAweDBDOTAsIDB4N0FFNiwgMHgxNzQzLCAweDdBRTcsIDB4MjE4QSwgMHg3QUVBLCAweDBCNjYsCi0gICAgMHg3QUVCLCAweDIxOEMsIDB4N0FFRCwgMHgxNzQ0LCAweDdBRUYsIDB4MEI3QSwgMHg3QUYwLCAweDE3NDUsCi0gICAgMHg3QUY2LCAweDA2OUQsIDB4N0FGOCwgMHgxMDc2LCAweDdBRjksIDB4MEI5QiwgMHg3QUZBLCAweDA4REYsCi0gICAgMHg3QUZGLCAweDA2MDQsIDB4N0IwMiwgMHgxNzQ2LCAweDdCMDQsIDB4MTc1MywgMHg3QjA2LCAweDE3NDksCi0gICAgMHg3QjA3LCAweDNBNTcsIDB4N0IwOCwgMHgwNjgyLCAweDdCMEEsIDB4MTc0OCwgMHg3QjBCLCAweDE3NTUsCi0gICAgMHg3QjBGLCAweDE3NDcsIDB4N0IxMSwgMHgwOUI4LCAweDdCMTQsIDB4M0E1OCwgMHg3QjE4LCAweDE3NEIsCi0gICAgMHg3QjE5LCAweDE3NEMsIDB4N0IxQiwgMHgwQzI1LCAweDdCMUUsIDB4MTc0RCwgMHg3QjIwLCAweDA1QkMsCi0gICAgMHg3QjI1LCAweDBBMjAsIDB4N0IyNiwgMHgwREQ2LCAweDdCMjcsIDB4M0E1OSwgMHg3QjI4LCAweDE3NEYsCi0gICAgMHg3QjJDLCAweDBCNDgsIDB4N0IzMSwgMHgzQTVBLCAweDdCMzMsIDB4MTc0QSwgMHg3QjM1LCAweDE3NEUsCi0gICAgMHg3QjM2LCAweDE3NTAsIDB4N0IzOSwgMHgwODZCLCAweDdCNDUsIDB4MTc1NywgMHg3QjQ2LCAweDBEQTAsCi0gICAgMHg3QjQ3LCAweDNBNUIsIDB4N0I0OCwgMHgwRDNBLCAweDdCNDksIDB4MEM3MywgMHg3QjRCLCAweDA2RDIsCi0gICAgMHg3QjRDLCAweDE3NTYsIDB4N0I0RCwgMHgxNzU0LCAweDdCNEUsIDB4M0E1QywgMHg3QjRGLCAweDBENDksCi0gICAgMHg3QjUwLCAweDE3NTEsIDB4N0I1MSwgMHgwQjlDLCAweDdCNTIsIDB4MEM3NSwgMHg3QjUzLCAweDM3NUQsCi0gICAgMHg3QjU0LCAweDBDNzQsIDB4N0I1NiwgMHgwODY2LCAweDdCNUQsIDB4MTc2OSwgMHg3QjYwLCAweDNBNUQsCi0gICAgMHg3QjY1LCAweDE3NTksIDB4N0I2NywgMHgxNzVCLCAweDdCNjksIDB4M0E1RSwgMHg3QjZDLCAweDE3NUUsCi0gICAgMHg3QjZELCAweDNBNUYsIDB4N0I2RSwgMHgxNzVGLCAweDdCNzAsIDB4MTc1QywgMHg3QjcxLCAweDE3NUQsCi0gICAgMHg3QjcyLCAweDNBNjAsIDB4N0I3NCwgMHgxNzVBLCAweDdCNzUsIDB4MTc1OCwgMHg3QjdBLCAweDE3NTIsCi0gICAgMHg3Qjg2LCAweDBFMUYsIDB4N0I4NywgMHgwNTU1LCAweDdCOEIsIDB4MTc2NiwgMHg3QjhELCAweDE3NjMsCi0gICAgMHg3QjhGLCAweDE3NjgsIDB4N0I5MSwgMHgzQTYxLCAweDdCOTIsIDB4MTc2NywgMHg3Qjk0LCAweDBEMjksCi0gICAgMHg3Qjk1LCAweDBFQjMsIDB4N0I5NywgMHgwODg5LCAweDdCOTgsIDB4MTc2MSwgMHg3Qjk5LCAweDE3NkEsCi0gICAgMHg3QjlBLCAweDE3NjUsIDB4N0I5QywgMHgxNzY0LCAweDdCOUQsIDB4MTc2MCwgMHg3QjlFLCAweDIxOEQsCi0gICAgMHg3QjlGLCAweDE3NjIsIDB4N0JBMSwgMHgwNjA1LCAweDdCQUEsIDB4MEI3QiwgMHg3QkFELCAweDBBQTEsCi0gICAgMHg3QkFGLCAweDNBNjIsIDB4N0JCMSwgMHgwRDM2LCAweDdCQjQsIDB4MTc2RiwgMHg3QkI4LCAweDBEMzgsCi0gICAgMHg3QkMwLCAweDBBODUsIDB4N0JDMSwgMHgxNzZDLCAweDdCQzQsIDB4MEQ2MywgMHg3QkM2LCAweDE3NzAsCi0gICAgMHg3QkM3LCAweDBFMjMsIDB4N0JDOSwgMHgwQjk5LCAweDdCQ0IsIDB4MTc2QiwgMHg3QkNDLCAweDE3NkQsCi0gICAgMHg3QkNGLCAweDE3NkUsIDB4N0JENywgMHgzQTYzLCAweDdCRDksIDB4M0E2NCwgMHg3QkRELCAweDE3NzEsCi0gICAgMHg3QkUwLCAweDA4RjAsIDB4N0JFNCwgMHgwQzlFLCAweDdCRTUsIDB4MTc3NiwgMHg3QkU2LCAweDE3NzUsCi0gICAgMHg3QkU5LCAweDE3NzIsIDB4N0JFRCwgMHgwRkRDLCAweDdCRjMsIDB4MTc3QiwgMHg3QkY2LCAweDE3N0YsCi0gICAgMHg3QkY3LCAweDE3N0MsIDB4N0MwMCwgMHgxNzc4LCAweDdDMDcsIDB4MTc3OSwgMHg3QzBCLCAweDNBNjUsCi0gICAgMHg3QzBELCAweDE3N0UsIDB4N0MwRiwgMHgzQTY2LCAweDdDMTEsIDB4MTc3MywgMHg3QzEyLCAweDEwRUEsCi0gICAgMHg3QzEzLCAweDE3N0EsIDB4N0MxNCwgMHgxNzc0LCAweDdDMTcsIDB4MTc3RCwgMHg3QzFFLCAweDFFM0IsCi0gICAgMHg3QzFGLCAweDE3ODMsIDB4N0MyMCwgMHgzQTY3LCAweDdDMjEsIDB4MDYwNiwgMHg3QzIzLCAweDE3ODAsCi0gICAgMHg3QzI2LCAweDNBNjgsIDB4N0MyNywgMHgxNzgxLCAweDdDMkEsIDB4MTc4MiwgMHg3QzJCLCAweDE3ODUsCi0gICAgMHg3QzMxLCAweDNBNjksIDB4N0MzNiwgMHgzQTZBLCAweDdDMzcsIDB4MTc4NCwgMHg3QzM4LCAweDBEOEEsCi0gICAgMHg3QzNELCAweDE3ODYsIDB4N0MzRSwgMHgwRkM0LCAweDdDM0YsIDB4MEUzRCwgMHg3QzQwLCAweDE3OEIsCi0gICAgMHg3QzQzLCAweDE3ODgsIDB4N0M0QywgMHgxNzg3LCAweDdDNEQsIDB4MEE3NiwgMHg3QzRGLCAweDE3OEEsCi0gICAgMHg3QzUwLCAweDE3OEMsIDB4N0M1MSwgMHgzQTZCLCAweDdDNTQsIDB4MTc4OSwgMHg3QzU2LCAweDE3OTAsCi0gICAgMHg3QzU4LCAweDE3OEQsIDB4N0M1OSwgMHgzQTZDLCAweDdDNUYsIDB4MTc4RSwgMHg3QzYwLCAweDE3NzcsCi0gICAgMHg3QzY0LCAweDE3OEYsIDB4N0M2NSwgMHgxNzkxLCAweDdDNjcsIDB4M0E2RCwgMHg3QzZDLCAweDE3OTIsCi0gICAgMHg3QzZFLCAweDNBNkUsIDB4N0M3MCwgMHgzQTZGLCAweDdDNzMsIDB4MEUxNiwgMHg3Qzc1LCAweDE3OTMsCi0gICAgMHg3QzdCLCAweDM3MEUsIDB4N0M3RSwgMHgwRUVFLCAweDdDODEsIDB4MDZDNiwgMHg3QzgyLCAweDA2RkYsCi0gICAgMHg3QzgzLCAweDE3OTQsIDB4N0M4OSwgMHgwRTA0LCAweDdDOEIsIDB4MEEyRSwgMHg3QzhELCAweDBFQkMsCi0gICAgMHg3QzkwLCAweDE3OTUsIDB4N0M5MiwgMHgwRjdCLCAweDdDOTUsIDB4MEQyQSwgMHg3Qzk3LCAweDBBQzgsCi0gICAgMHg3Qzk4LCAweDBDRUEsIDB4N0M5QiwgMHgwOTU3LCAweDdDOUYsIDB4MDQ4NCwgMHg3Q0ExLCAweDE3OUEsCi0gICAgMHg3Q0EyLCAweDE3OTgsIDB4N0NBNCwgMHgxNzk2LCAweDdDQTUsIDB4MDVERCwgMHg3Q0E3LCAweDA5QjksCi0gICAgMHg3Q0E4LCAweDE3OUIsIDB4N0NBQiwgMHgxNzk5LCAweDdDQUQsIDB4MTc5NywgMHg3Q0FFLCAweDE3OUYsCi0gICAgMHg3Q0IxLCAweDE3OUUsIDB4N0NCMiwgMHgxNzlELCAweDdDQjMsIDB4MTc5QywgMHg3Q0I5LCAweDE3QTAsCi0gICAgMHg3Q0JDLCAweDNBNzAsIDB4N0NCRCwgMHgxN0ExLCAweDdDQkUsIDB4MEE1RSwgMHg3Q0JGLCAweDNBNzEsCi0gICAgMHg3Q0MwLCAweDE3QTIsIDB4N0NDMiwgMHgxN0E0LCAweDdDQzUsIDB4MTdBMywgMHg3Q0M4LCAweDNBNzIsCi0gICAgMHg3Q0M5LCAweDNBNzMsIDB4N0NDQSwgMHgwNzg2LCAweDdDQ0UsIDB4MEFCQSwgMHg3Q0QyLCAweDE3QTYsCi0gICAgMHg3Q0Q2LCAweDBDNzYsIDB4N0NENywgMHgzQTc0LCAweDdDRDgsIDB4MTdBNSwgMHg3Q0Q5LCAweDNBNzUsCi0gICAgMHg3Q0RDLCAweDE3QTcsIDB4N0NERCwgMHgzQTc2LCAweDdDREUsIDB4MEUwNSwgMHg3Q0RGLCAweDBBRUUsCi0gICAgMHg3Q0UwLCAweDA3RDksIDB4N0NFMiwgMHgxN0E4LCAweDdDRTcsIDB4MEY5MCwgMHg3Q0VCLCAweDNBNzcsCi0gICAgMHg3Q0VGLCAweDE3QUEsIDB4N0NGMiwgMHgxN0FCLCAweDdDRjQsIDB4MTdBQywgMHg3Q0Y2LCAweDE3QUQsCi0gICAgMHg3Q0Y4LCAweDA4QjMsIDB4N0NGQSwgMHgxN0FFLCAweDdDRkIsIDB4MDcyNSwgMHg3Q0ZFLCAweDA2ODQsCi0gICAgMHg3RDAwLCAweDA2NDQsIDB4N0QwMiwgMHgxN0IwLCAweDdEMDQsIDB4MEVGRiwgMHg3RDA1LCAweDA3REEsCi0gICAgMHg3RDA2LCAweDE3QUYsIDB4N0QwNywgMHgzQTc4LCAweDdEMDgsIDB4M0E3OSwgMHg3RDA5LCAweDNBN0EsCi0gICAgMHg3RDBBLCAweDE3QjMsIDB4N0QwQiwgMHgwRUYyLCAweDdEMEQsIDB4MENGMiwgMHg3RDEwLCAweDBEQTUsCi0gICAgMHg3RDEzLCAweDNBN0IsIDB4N0QxNCwgMHgwOTZELCAweDdEMTUsIDB4MTdCMiwgMHg3RDE3LCAweDA4RkYsCi0gICAgMHg3RDE4LCAweDA3REIsIDB4N0QxOSwgMHgwOEI0LCAweDdEMUEsIDB4MDY4MywgMHg3RDFCLCAweDBFMDYsCi0gICAgMHg3RDFDLCAweDE3QjEsIDB4N0QxRCwgMHgzQTdDLCAweDdEMjAsIDB4MEFDOSwgMHg3RDIxLCAweDBFNzAsCi0gICAgMHg3RDIyLCAweDA4NjcsIDB4N0QyMywgMHgzQTdELCAweDdEMkIsIDB4MDhCNSwgMHg3RDJDLCAweDBCRjksCi0gICAgMHg3RDJFLCAweDE3QjYsIDB4N0QyRiwgMHgwRkE3LCAweDdEMzAsIDB4MDg0OSwgMHg3RDMyLCAweDE3QjcsCi0gICAgMHg3RDMzLCAweDBBMDgsIDB4N0QzNSwgMHgxN0I5LCAweDdEMzksIDB4MDlCQSwgMHg3RDNBLCAweDA4MjAsCi0gICAgMHg3RDNGLCAweDE3QjgsIDB4N0Q0MSwgMHgzQTdFLCAweDdENDIsIDB4MDkzNCwgMHg3RDQzLCAweDA3NzIsCi0gICAgMHg3RDQ0LCAweDBBQ0EsIDB4N0Q0NSwgMHgxN0I0LCAweDdENDYsIDB4MTdCQSwgMHg3RDQ4LCAweDIxOEYsCi0gICAgMHg3RDRCLCAweDE3QjUsIDB4N0Q0QywgMHgwNzI2LCAweDdENEUsIDB4MTdCRCwgMHg3RDRGLCAweDE3QzEsCi0gICAgMHg3RDUwLCAweDA3NDEsIDB4N0Q1MywgMHgzQTdGLCAweDdENTYsIDB4MTdCQywgMHg3RDU5LCAweDNBODAsCi0gICAgMHg3RDVCLCAweDE3QzUsIDB4N0Q1QywgMHgyMTkwLCAweDdENUQsIDB4M0E4MSwgMHg3RDVFLCAweDA3REMsCi0gICAgMHg3RDYxLCAweDBGNTcsIDB4N0Q2MiwgMHgwNDgwLCAweDdENjMsIDB4MTdDMiwgMHg3RDY2LCAweDA2ODUsCi0gICAgMHg3RDY4LCAweDE3QkYsIDB4N0Q2RSwgMHgxN0MwLCAweDdENzEsIDB4MEM3NywgMHg3RDcyLCAweDE3QkUsCi0gICAgMHg3RDczLCAweDE3QkIsIDB4N0Q3NSwgMHgwNTg2LCAweDdENzYsIDB4MEE4OCwgMHg3RDc5LCAweDA3NUMsCi0gICAgMHg3RDdBLCAweDNBODIsIDB4N0Q3RCwgMHgxN0M3LCAweDdEODYsIDB4M0E4MywgMHg3RDg5LCAweDE3QzQsCi0gICAgMHg3RDhCLCAweDNBODQsIDB4N0Q4QywgMHgzQTg1LCAweDdEOEYsIDB4MTdDNiwgMHg3RDkzLCAweDE3QzMsCi0gICAgMHg3RDk5LCAweDA3MjcsIDB4N0Q5QSwgMHgwQjEzLCAweDdEOUIsIDB4MTdDOCwgMHg3RDlDLCAweDBBRjAsCi0gICAgMHg3RDlGLCAweDE3RDUsIDB4N0RBMCwgMHgyMTkyLCAweDdEQTIsIDB4MTdEMSwgMHg3REEzLCAweDE3Q0IsCi0gICAgMHg3REFCLCAweDE3Q0YsIDB4N0RBQywgMHgwOTI2LCAweDdEQUQsIDB4MDRBMSwgMHg3REFFLCAweDE3Q0EsCi0gICAgMHg3REFGLCAweDE3RDIsIDB4N0RCMCwgMHgxN0Q2LCAweDdEQjEsIDB4MDdERCwgMHg3REIyLCAweDBFRTIsCi0gICAgMHg3REI0LCAweDBCRjIsIDB4N0RCNSwgMHgxN0NDLCAweDdEQjcsIDB4MjE5MSwgMHg3REI4LCAweDE3RDQsCi0gICAgMHg3REJBLCAweDE3QzksIDB4N0RCQiwgMHgwQjdDLCAweDdEQkQsIDB4MTdDRSwgMHg3REJFLCAweDA0ODEsCi0gICAgMHg3REJGLCAweDBFRDYsIDB4N0RDNywgMHgxN0NELCAweDdEQ0EsIDB4MDZEMywgMHg3RENCLCAweDBEODAsCi0gICAgMHg3RENDLCAweDNBODYsIDB4N0RDRiwgMHgwQUVGLCAweDdERDEsIDB4MEY5OCwgMHg3REQyLCAweDA5NzksCi0gICAgMHg3REQ1LCAweDE3RkQsIDB4N0RENiwgMHgyMTkzLCAweDdERDgsIDB4MTdENywgMHg3RERBLCAweDBBQTIsCi0gICAgMHg3RERDLCAweDE3RDMsIDB4N0RERCwgMHgxN0Q4LCAweDdEREUsIDB4MTdEQSwgMHg3REUwLCAweDBDMTUsCi0gICAgMHg3REUxLCAweDE3REQsIDB4N0RFMywgMHgzNDBBLCAweDdERTQsIDB4MTdEOSwgMHg3REU4LCAweDBFMjQsCi0gICAgMHg3REU5LCAweDA2MDcsIDB4N0RFQiwgMHgzQTg3LCAweDdERUMsIDB4MEVENywgMHg3REVGLCAweDA0QTIsCi0gICAgMHg3REYxLCAweDNBODgsIDB4N0RGMiwgMHgxN0RDLCAweDdERjQsIDB4MEZDNSwgMHg3REY5LCAweDNBODksCi0gICAgMHg3REZCLCAweDE3REIsIDB4N0UwMSwgMHgwNTExLCAweDdFMDQsIDB4MENDNCwgMHg3RTA1LCAweDE3REUsCi0gICAgMHg3RTA4LCAweDNBOEEsIDB4N0UwOSwgMHgxN0U1LCAweDdFMEEsIDB4MTdERiwgMHg3RTBCLCAweDE3RTYsCi0gICAgMHg3RTExLCAweDNBOEIsIDB4N0UxMiwgMHgxN0UyLCAweDdFMTUsIDB4M0E4QywgMHg3RTFCLCAweDBEMzEsCi0gICAgMHg3RTFFLCAweDA4RjYsIDB4N0UxRiwgMHgxN0U0LCAweDdFMjAsIDB4M0E4RCwgMHg3RTIxLCAweDE3RTEsCi0gICAgMHg3RTIyLCAweDE3RTcsIDB4N0UyMywgMHgxN0UwLCAweDdFMjYsIDB4MDk0RSwgMHg3RTJCLCAweDBFNTMsCi0gICAgMHg3RTJFLCAweDA5NTYsIDB4N0UzMSwgMHgxN0UzLCAweDdFMzIsIDB4MTdFRiwgMHg3RTM1LCAweDE3RUIsCi0gICAgMHg3RTM3LCAweDE3RUUsIDB4N0UzOSwgMHgxN0VDLCAweDdFM0EsIDB4MTdGMCwgMHg3RTNCLCAweDE3RUEsCi0gICAgMHg3RTNELCAweDE3RDAsIDB4N0UzRSwgMHgwQTc3LCAweDdFNDEsIDB4MEQ1RiwgMHg3RTQzLCAweDE3RUQsCi0gICAgMHg3RTQ2LCAweDE3RTgsIDB4N0U0NywgMHgzQThFLCAweDdFNDgsIDB4Mzc2NywgMHg3RTRBLCAweDBBQTMsCi0gICAgMHg3RTRCLCAweDA3MjgsIDB4N0U0RCwgMHgwOTM1LCAweDdFNTIsIDB4MjE5NCwgMHg3RTU0LCAweDA5RUIsCi0gICAgMHg3RTU1LCAweDBBQjgsIDB4N0U1NiwgMHgxN0YzLCAweDdFNTksIDB4MTdGNSwgMHg3RTVBLCAweDE3RjYsCi0gICAgMHg3RTVELCAweDE3RjIsIDB4N0U1RSwgMHgxN0Y0LCAweDdFNjEsIDB4MUUxMSwgMHg3RTYyLCAweDNBOEYsCi0gICAgMHg3RTY2LCAweDE3RTksIDB4N0U2NywgMHgxN0YxLCAweDdFNjksIDB4MTdGOSwgMHg3RTZBLCAweDE3RjgsCi0gICAgMHg3RTZCLCAweDFERjcsIDB4N0U2RCwgMHgwRUE4LCAweDdFNkUsIDB4M0E5MCwgMHg3RTcwLCAweDA3MDEsCi0gICAgMHg3RTczLCAweDNBOTEsIDB4N0U3OSwgMHgxN0Y3LCAweDdFN0IsIDB4MTdGQiwgMHg3RTdDLCAweDE3RkEsCi0gICAgMHg3RTdELCAweDE3RkUsIDB4N0U3RiwgMHgxODAwLCAweDdFODIsIDB4MDg4QSwgMHg3RTgzLCAweDE3RkMsCi0gICAgMHg3RTg4LCAweDE4MDEsIDB4N0U4OSwgMHgxODAyLCAweDdFOEEsIDB4MjBBNywgMHg3RThDLCAweDE4MDMsCi0gICAgMHg3RThELCAweDNBOTIsIDB4N0U4RSwgMHgxODA5LCAweDdFOEYsIDB4MEMzNSwgMHg3RTkwLCAweDE4MDUsCi0gICAgMHg3RTkxLCAweDNBOTMsIDB4N0U5MiwgMHgxODA0LCAweDdFOTMsIDB4MTgwNiwgMHg3RTk0LCAweDE4MDcsCi0gICAgMHg3RTk2LCAweDE4MDgsIDB4N0U5OCwgMHgzQTk0LCAweDdFOUIsIDB4MTgwQSwgMHg3RTlDLCAweDE4MEIsCi0gICAgMHg3RjM2LCAweDA2MDgsIDB4N0YzOCwgMHgxODBDLCAweDdGM0EsIDB4MTgwRCwgMHg3RjQ0LCAweDNBOTUsCi0gICAgMHg3RjQ1LCAweDE4MEUsIDB4N0Y0NywgMHgyMTk1LCAweDdGNEMsIDB4MTgwRiwgMHg3RjRELCAweDE4MTAsCi0gICAgMHg3RjRFLCAweDE4MTEsIDB4N0Y0RiwgMHgzQTk2LCAweDdGNTAsIDB4MTgxMiwgMHg3RjUxLCAweDE4MTMsCi0gICAgMHg3RjUyLCAweDNBOTcsIDB4N0Y1MywgMHgzQTk4LCAweDdGNTQsIDB4MTgxNSwgMHg3RjU1LCAweDE4MTQsCi0gICAgMHg3RjU4LCAweDE4MTYsIDB4N0Y1RiwgMHgxODE3LCAweDdGNjAsIDB4MTgxOCwgMHg3RjYxLCAweDNBOTksCi0gICAgMHg3RjY3LCAweDE4MUIsIDB4N0Y2OCwgMHgxODE5LCAweDdGNjksIDB4MTgxQSwgMHg3RjZBLCAweDA4NTEsCi0gICAgMHg3RjZCLCAweDA3MjksIDB4N0Y2RSwgMHgwQjk0LCAweDdGNzAsIDB4MEQ0NywgMHg3RjcyLCAweDA5N0EsCi0gICAgMHg3Rjc1LCAweDBEMDMsIDB4N0Y3NywgMHgwRDgxLCAweDdGNzgsIDB4MTgxQywgMHg3Rjc5LCAweDEzMzYsCi0gICAgMHg3RjgyLCAweDE4MUQsIDB4N0Y4MywgMHgxODFGLCAweDdGODUsIDB4MEY0RiwgMHg3Rjg2LCAweDE4MUUsCi0gICAgMHg3Rjg3LCAweDE4MjEsIDB4N0Y4OCwgMHgxODIwLCAweDdGOEEsIDB4MEYzRCwgMHg3RjhDLCAweDE4MjIsCi0gICAgMHg3RjhFLCAweDBEOTIsIDB4N0Y5MSwgMHgzQTlBLCAweDdGOTQsIDB4MTgyMywgMHg3RjlBLCAweDE4MjYsCi0gICAgMHg3RjlELCAweDE4MjUsIDB4N0Y5RSwgMHgxODI0LCAweDdGQTEsIDB4MjE5NiwgMHg3RkEzLCAweDE4MjcsCi0gICAgMHg3RkE0LCAweDA3MDgsIDB4N0ZBOCwgMHgwQUE0LCAweDdGQTksIDB4MDY1QiwgMHg3RkFFLCAweDE4MkIsCi0gICAgMHg3RkFGLCAweDE4MjgsIDB4N0ZCMiwgMHgxODI5LCAweDdGQjYsIDB4MTgyQywgMHg3RkI4LCAweDE4MkQsCi0gICAgMHg3RkI5LCAweDE4MkEsIDB4N0ZCRCwgMHgwNENCLCAweDdGQkYsIDB4M0E5QiwgMHg3RkMxLCAweDA1MjcsCi0gICAgMHg3RkM1LCAweDE4MkYsIDB4N0ZDNiwgMHgxODMwLCAweDdGQ0EsIDB4MTgzMSwgMHg3RkNDLCAweDBGNEMsCi0gICAgMHg3RkNFLCAweDNBOUMsIDB4N0ZEMiwgMHgwOTM2LCAweDdGRDQsIDB4MTgzMywgMHg3RkQ1LCAweDE4MzIsCi0gICAgMHg3RkRGLCAweDNBOUQsIDB4N0ZFMCwgMHgwQTJGLCAweDdGRTEsIDB4MTgzNCwgMHg3RkU1LCAweDNBOUUsCi0gICAgMHg3RkU2LCAweDE4MzUsIDB4N0ZFOSwgMHgxODM2LCAweDdGRUIsIDB4MDYyMSwgMHg3RkVDLCAweDNBOUYsCi0gICAgMHg3RkVFLCAweDNBQTAsIDB4N0ZFRiwgMHgzQUExLCAweDdGRjAsIDB4MDYwOSwgMHg3RkYzLCAweDE4MzcsCi0gICAgMHg3RkY5LCAweDE4MzgsIDB4N0ZGQSwgMHgzQUEyLCAweDdGRkIsIDB4MEU4QiwgMHg3RkZDLCAweDBGNEQsCi0gICAgMHg4MDAwLCAweDBGM0UsIDB4ODAwMSwgMHgwRkRELCAweDgwMDIsIDB4MzcxMywgMHg4MDAzLCAweDA3REYsCi0gICAgMHg4MDA0LCAweDE4M0IsIDB4ODAwNSwgMHgwOTAwLCAweDgwMDYsIDB4MTgzQSwgMHg4MDBCLCAweDE4M0MsCi0gICAgMHg4MDBDLCAweDA4RDUsIDB4ODAwRSwgMHgzQUEzLCAweDgwMTAsIDB4MEIzMSwgMHg4MDExLCAweDNBQTQsCi0gICAgMHg4MDEyLCAweDE4M0QsIDB4ODAxNCwgMHgzQUE1LCAweDgwMTUsIDB4MDdERSwgMHg4MDE3LCAweDBFRTMsCi0gICAgMHg4MDE4LCAweDE4M0UsIDB4ODAxOSwgMHgxODNGLCAweDgwMUMsIDB4MTg0MCwgMHg4MDIxLCAweDE4NDEsCi0gICAgMHg4MDI0LCAweDNBQTYsIDB4ODAyNiwgMHgzQUE3LCAweDgwMjgsIDB4MTg0MiwgMHg4MDMzLCAweDA4RDYsCi0gICAgMHg4MDM2LCAweDBFRjksIDB4ODAzQSwgMHgzQUE4LCAweDgwM0IsIDB4MTg0NCwgMHg4MDNDLCAweDNBQTksCi0gICAgMHg4MDNELCAweDBCN0QsIDB4ODAzRiwgMHgxODQzLCAweDgwNDYsIDB4MTg0NiwgMHg4MDRBLCAweDE4NDUsCi0gICAgMHg4MDUyLCAweDE4NDcsIDB4ODA1NiwgMHgwQTVGLCAweDgwNTgsIDB4MTg0OCwgMHg4MDVBLCAweDE4NDksCi0gICAgMHg4MDVFLCAweDBFMDksIDB4ODA1RiwgMHgxODRBLCAweDgwNjAsIDB4M0FBQSwgMHg4MDYxLCAweDBBRjEsCi0gICAgMHg4MDYyLCAweDE4NEIsIDB4ODA2OCwgMHgxODRDLCAweDgwNkYsIDB4MEZDNiwgMHg4MDcwLCAweDE4NEYsCi0gICAgMHg4MDcxLCAweDNBQUIsIDB4ODA3MiwgMHgxODRFLCAweDgwNzMsIDB4MTg0RCwgMHg4MDc0LCAweDBCQ0MsCi0gICAgMHg4MDc1LCAweDNBQUMsIDB4ODA3NiwgMHgxODUwLCAweDgwNzcsIDB4MDlFQywgMHg4MDc5LCAweDE4NTEsCi0gICAgMHg4MDdELCAweDE4NTIsIDB4ODA3RSwgMHgwRkRFLCAweDgwN0YsIDB4MTg1MywgMHg4MDg0LCAweDE4NTQsCi0gICAgMHg4MDg1LCAweDE4NTYsIDB4ODA4NiwgMHgxODU1LCAweDgwODcsIDB4MEQzOSwgMHg4MDg5LCAweDBDRDEsCi0gICAgMHg4MDhCLCAweDBGRTQsIDB4ODA4QywgMHgwRDNELCAweDgwOTMsIDB4MTg1OCwgMHg4MDk2LCAweDA5QkIsCi0gICAgMHg4MDk4LCAweDBEOUMsIDB4ODA5QSwgMHgxODU5LCAweDgwOUIsIDB4MTg1NywgMHg4MDlELCAweDA2MEEsCi0gICAgMHg4MDlFLCAweDNBQUQsIDB4ODBBMSwgMHgwNzg4LCAweDgwQTIsIDB4MDhCNiwgMHg4MEE1LCAweDBEODIsCi0gICAgMHg4MEE2LCAweDNBQUUsIDB4ODBBOSwgMHgwNzVFLCAweDgwQUEsIDB4MEU3MSwgMHg4MEFCLCAweDNBQUYsCi0gICAgMHg4MEFDLCAweDE4NUMsIDB4ODBBRCwgMHgxODVBLCAweDgwQUYsIDB4MDdFMCwgMHg4MEIxLCAweDA3RTEsCi0gICAgMHg4MEIyLCAweDA0QUQsIDB4ODBCNCwgMHgwODU4LCAweDgwQkEsIDB4MEQwRiwgMHg4MEMzLCAweDA0QTMsCi0gICAgMHg4MEM0LCAweDE4NjEsIDB4ODBDNiwgMHgwQjdFLCAweDgwQ0MsIDB4MEQwRSwgMHg4MENFLCAweDBCM0IsCi0gICAgMHg4MEQ2LCAweDE4NjMsIDB4ODBENywgMHgzQUIwLCAweDgwRDgsIDB4M0FCMSwgMHg4MEQ5LCAweDE4NUYsCi0gICAgMHg4MERBLCAweDE4NjIsIDB4ODBEQiwgMHgxODVELCAweDgwREQsIDB4MTg2MCwgMHg4MERFLCAweDBFNTQsCi0gICAgMHg4MEUxLCAweDA3ODksIDB4ODBFNCwgMHgwNEMxLCAweDgwRTUsIDB4MTg1RSwgMHg4MEVGLCAweDE4NjUsCi0gICAgMHg4MEYxLCAweDE4NjYsIDB4ODBGNCwgMHgwQzkxLCAweDgwRjgsIDB4MDZCMywgMHg4MEZDLCAweDE4NzEsCi0gICAgMHg4MEZELCAweDBDRjMsIDB4ODEwMiwgMHgwOEI3LCAweDgxMDUsIDB4MDZCNCwgMHg4MTA2LCAweDBBNkMsCi0gICAgMHg4MTA3LCAweDBGRUMsIDB4ODEwOCwgMHgwRUJBLCAweDgxMDksIDB4MTg2NCwgMHg4MTBBLCAweDBBNzgsCi0gICAgMHg4MTE2LCAweDNBQjIsIDB4ODExOCwgMHgzQUIzLCAweDgxMUEsIDB4MDY2RCwgMHg4MTFCLCAweDE4NjcsCi0gICAgMHg4MTIzLCAweDE4NjksIDB4ODEyOSwgMHgxODY4LCAweDgxMkIsIDB4MzY1OSwgMHg4MTJGLCAweDE4NkEsCi0gICAgMHg4MTMxLCAweDBCNjQsIDB4ODEzMywgMHgwQ0Y0LCAweDgxMzksIDB4MEJDRCwgMHg4MTNBLCAweDNBQjQsCi0gICAgMHg4MTNFLCAweDE4NkUsIDB4ODE0MSwgMHgzNzcyLCAweDgxNDYsIDB4MTg2RCwgMHg4MTRBLCAweDNBQjUsCi0gICAgMHg4MTRCLCAweDE4NkIsIDB4ODE0QywgMHgzQUI2LCAweDgxNEUsIDB4MEExQiwgMHg4MTUwLCAweDBERDcsCi0gICAgMHg4MTUxLCAweDE4NzAsIDB4ODE1MywgMHgxODZGLCAweDgxNTQsIDB4MDdFMiwgMHg4MTU1LCAweDBGRjksCi0gICAgMHg4MTVGLCAweDE4ODAsIDB4ODE2NSwgMHgxODc0LCAweDgxNjYsIDB4MTg3NSwgMHg4MTZCLCAweDA5MUMsCi0gICAgMHg4MTZFLCAweDE4NzMsIDB4ODE3MCwgMHgwODBBLCAweDgxNzEsIDB4MTg3MiwgMHg4MTc0LCAweDE4NzYsCi0gICAgMHg4MTc4LCAweDBCQ0UsIDB4ODE3OSwgMHgwREYyLCAweDgxN0EsIDB4MEFBNSwgMHg4MTdGLCAweDBCM0MsCi0gICAgMHg4MTgwLCAweDE4N0EsIDB4ODE4MSwgMHgzQUI3LCAweDgxODIsIDB4MTg3QiwgMHg4MTgzLCAweDE4NzcsCi0gICAgMHg4MTg0LCAweDNBQjgsIDB4ODE4OCwgMHgxODc4LCAweDgxOEEsIDB4MTg3OSwgMHg4MThGLCAweDA3RTMsCi0gICAgMHg4MTkzLCAweDE4ODEsIDB4ODE5NSwgMHgxODdELCAweDgxOUEsIDB4MEREOCwgMHg4MTlDLCAweDBFOUEsCi0gICAgMHg4MTlELCAweDBEOUEsIDB4ODFBMCwgMHgxODdDLCAweDgxQTMsIDB4MTg3RiwgMHg4MUE0LCAweDE4N0UsCi0gICAgMHg4MUE4LCAweDBFNzIsIDB4ODFBOSwgMHgxODgyLCAweDgxQjAsIDB4MTg4MywgMHg4MUIzLCAweDBBQjksCi0gICAgMHg4MUI0LCAweDNBQjksIDB4ODFCNSwgMHgxODg0LCAweDgxQjgsIDB4MTg4NiwgMHg4MUJBLCAweDE4OEEsCi0gICAgMHg4MUJELCAweDE4ODcsIDB4ODFCRSwgMHgxODg1LCAweDgxQkYsIDB4MENGNSwgMHg4MUMwLCAweDE4ODgsCi0gICAgMHg4MUMyLCAweDE4ODksIDB4ODFDNiwgMHgwNTMyLCAweDgxQzgsIDB4MTg5MCwgMHg4MUM5LCAweDE4OEIsCi0gICAgMHg4MUNELCAweDE4OEMsIDB4ODFDRiwgMHgzQUJBLCAweDgxRDEsIDB4MTg4RCwgMHg4MUQzLCAweDBCMDEsCi0gICAgMHg4MUQ4LCAweDE4OEYsIDB4ODFEOSwgMHgxODhFLCAweDgxREEsIDB4MTg5MSwgMHg4MURGLCAweDE4OTIsCi0gICAgMHg4MUUwLCAweDE4OTMsIDB4ODFFMywgMHgwQTA5LCAweDgxRTUsIDB4MDU2OSwgMHg4MUU3LCAweDE4OTQsCi0gICAgMHg4MUU4LCAweDBGOUYsIDB4ODFFQSwgMHgwOEQ3LCAweDgxRUQsIDB4MDkzNywgMHg4MUYzLCAweDA4QjgsCi0gICAgMHg4MUY0LCAweDBCOTUsIDB4ODFGOSwgMHgzQUJCLCAweDgxRkEsIDB4MTg5NSwgMHg4MUZCLCAweDE4OTYsCi0gICAgMHg4MUZDLCAweDA0RDMsIDB4ODFGRSwgMHgxODk3LCAweDgyMDEsIDB4MTg5OCwgMHg4MjAyLCAweDE4OTksCi0gICAgMHg4MjAzLCAweDNBQkMsIDB4ODIwNSwgMHgxODlBLCAweDgyMDcsIDB4MTg5QiwgMHg4MjA4LCAweDA2QjUsCi0gICAgMHg4MjA5LCAweDEzQUYsIDB4ODIwQSwgMHgxODlDLCAweDgyMEMsIDB4MEE4OSwgMHg4MjBELCAweDE4OUQsCi0gICAgMHg4MjBFLCAweDA4RjcsIDB4ODIxMCwgMHgxODlFLCAweDgyMTIsIDB4MTAwOSwgMHg4MjE2LCAweDE4OUYsCi0gICAgMHg4MjE3LCAweDBFMkUsIDB4ODIxOCwgMHgwNjE4LCAweDgyMUIsIDB4MEFBNiwgMHg4MjFDLCAweDA5NjIsCi0gICAgMHg4MjFFLCAweDBERTMsIDB4ODIxRiwgMHgwOTM4LCAweDgyMjEsIDB4M0FCRCwgMHg4MjI5LCAweDE4QTAsCi0gICAgMHg4MjJBLCAweDA3RTQsIDB4ODIyQiwgMHgxOEExLCAweDgyMkMsIDB4MEQ2MCwgMHg4MjJFLCAweDE4QUYsCi0gICAgMHg4MjMyLCAweDNBQkUsIDB4ODIzMywgMHgxOEEzLCAweDgyMzQsIDB4M0FCRiwgMHg4MjM1LCAweDBCMjksCi0gICAgMHg4MjM2LCAweDBEMkIsIDB4ODIzNywgMHgwNzczLCAweDgyMzgsIDB4MThBMiwgMHg4MjM5LCAweDBBQTcsCi0gICAgMHg4MjQwLCAweDE4QTQsIDB4ODI0NiwgMHgzQUMwLCAweDgyNDcsIDB4MEMxNiwgMHg4MjRCLCAweDNBQzEsCi0gICAgMHg4MjRGLCAweDNBQzIsIDB4ODI1OCwgMHgxOEE2LCAweDgyNTksIDB4MThBNSwgMHg4MjVBLCAweDE4QTgsCi0gICAgMHg4MjVELCAweDE4QTcsIDB4ODI1RiwgMHgxOEE5LCAweDgyNjIsIDB4MThBQiwgMHg4MjY0LCAweDE4QUEsCi0gICAgMHg4MjY2LCAweDA2MEIsIDB4ODI2OCwgMHgxOEFDLCAweDgyNkEsIDB4MThBRCwgMHg4MjZCLCAweDE4QUUsCi0gICAgMHg4MjZFLCAweDA4MjEsIDB4ODI2RiwgMHgwRjkxLCAweDgyNzEsIDB4MThCMCwgMHg4MjcyLCAweDA5RUQsCi0gICAgMHg4Mjc2LCAweDA1MTIsIDB4ODI3NywgMHgxOEIxLCAweDgyNzgsIDB4MThCMiwgMHg4Mjc5LCAweDM3NzUsCi0gICAgMHg4MjdFLCAweDE4QjMsIDB4ODI4QiwgMHgwNEI2LCAweDgyOEQsIDB4MThCNCwgMHg4MjhFLCAweDNBQzMsCi0gICAgMHg4MjkyLCAweDE4QjUsIDB4ODI5OSwgMHgwREQ5LCAweDgyOUQsIDB4MDhGMywgMHg4MjlGLCAweDE4QjcsCi0gICAgMHg4MkE1LCAweDA1ODcsIDB4ODJBNiwgMHgwNDc2LCAweDgyQUIsIDB4MThCNiwgMHg4MkFDLCAweDE4QjksCi0gICAgMHg4MkFELCAweDBEMDQsIDB4ODJBRSwgMHgzQUM0LCAweDgyQUYsIDB4MEEwQSwgMHg4MkIxLCAweDA1NTYsCi0gICAgMHg4MkIzLCAweDBFNTUsIDB4ODJCNywgMHgzQUM1LCAweDgyQjgsIDB4MDczMywgMHg4MkI5LCAweDA2RDQsCi0gICAgMHg4MkJCLCAweDE4QjgsIDB4ODJCRCwgMHgwNTZBLCAweDgyQkUsIDB4M0FDNiwgMHg4MkM1LCAweDA1REYsCi0gICAgMHg4MkM2LCAweDNBQzcsIDB4ODJEMSwgMHgwNTEzLCAweDgyRDIsIDB4MThCRCwgMHg4MkQzLCAweDBGQjIsCi0gICAgMHg4MkQ0LCAweDBCM0QsIDB4ODJENywgMHgwREI2LCAweDgyRDksIDB4MThDOSwgMHg4MkRCLCAweDA1NTcsCi0gICAgMHg4MkRDLCAweDE4QzcsIDB4ODJERSwgMHgxOEM1LCAweDgyREYsIDB4MThCQywgMHg4MkUxLCAweDE4QkEsCi0gICAgMHg4MkUzLCAweDE4QkIsIDB4ODJFNSwgMHgwOTBGLCAweDgyRTYsIDB4MDZFNCwgMHg4MkU3LCAweDBCQjUsCi0gICAgMHg4MkVCLCAweDBDQTksIDB4ODJGMSwgMHgwNEYzLCAweDgyRjMsIDB4MThCRiwgMHg4MkY0LCAweDE4QkUsCi0gICAgMHg4MkY5LCAweDE4QzQsIDB4ODJGQSwgMHgxOEMwLCAweDgyRkIsIDB4MThDMywgMHg4MkZFLCAweDNBQzgsCi0gICAgMHg4MzAxLCAweDIxOTgsIDB4ODMwMiwgMHgwRURDLCAweDgzMDMsIDB4MThDMiwgMHg4MzA0LCAweDA1NTgsCi0gICAgMHg4MzA1LCAweDA1REIsIDB4ODMwNiwgMHgxOEM2LCAweDgzMDksIDB4MThDOCwgMHg4MzBFLCAweDA3MkEsCi0gICAgMHg4MzE2LCAweDE4Q0MsIDB4ODMxNywgMHgxOEQ1LCAweDgzMTgsIDB4MThENiwgMHg4MzFDLCAweDA0NkYsCi0gICAgMHg4MzIzLCAweDE4REQsIDB4ODMyOCwgMHgwNEI1LCAweDgzMkIsIDB4MThENCwgMHg4MzJGLCAweDE4RDMsCi0gICAgMHg4MzMxLCAweDE4Q0UsIDB4ODMzMiwgMHgxOENELCAweDgzMzQsIDB4MThDQiwgMHg4MzM1LCAweDE4Q0EsCi0gICAgMHg4MzM2LCAweDBCQTEsIDB4ODMzOCwgMHgwQjVCLCAweDgzMzksIDB4MThEMCwgMHg4MzQwLCAweDE4Q0YsCi0gICAgMHg4MzQzLCAweDNBQzksIDB4ODM0NSwgMHgxOEQyLCAweDgzNDksIDB4MEFGMiwgMHg4MzRBLCAweDA3MkIsCi0gICAgMHg4MzRGLCAweDA0RTMsIDB4ODM1MCwgMHgxOEQxLCAweDgzNTEsIDB4M0FDQSwgMHg4MzUyLCAweDA3RTUsCi0gICAgMHg4MzU1LCAweDNBQ0IsIDB4ODM1OCwgMHgwQUYzLCAweDgzNjIsIDB4MjE5OSwgMHg4MzczLCAweDE4RTMsCi0gICAgMHg4Mzc1LCAweDE4RTQsIDB4ODM3NywgMHgwNTU5LCAweDgzN0IsIDB4MDUyRSwgMHg4MzdDLCAweDE4RTEsCi0gICAgMHg4MzdGLCAweDIxOUEsIDB4ODM4NSwgMHgxOEQ3LCAweDgzODYsIDB4M0FDQywgMHg4Mzg3LCAweDE4REYsCi0gICAgMHg4Mzg5LCAweDE4RTYsIDB4ODM4QSwgMHgxOEUwLCAweDgzOEQsIDB4M0FDRCwgMHg4MzhFLCAweDE4REUsCi0gICAgMHg4MzkyLCAweDNBQ0UsIDB4ODM5MywgMHgxOEMxLCAweDgzOTYsIDB4MThEQywgMHg4Mzk4LCAweDNBQ0YsCi0gICAgMHg4MzlBLCAweDE4RDgsIDB4ODM5RSwgMHgwNjBDLCAweDgzOUYsIDB4MThEQSwgMHg4M0EwLCAweDE4RTUsCi0gICAgMHg4M0EyLCAweDE4REIsIDB4ODNBOCwgMHgxOEU3LCAweDgzQTksIDB4M0FEMCwgMHg4M0FBLCAweDE4RDksCi0gICAgMHg4M0FCLCAweDBEMzIsIDB4ODNCMSwgMHgwRjUzLCAweDgzQjUsIDB4MThFMiwgMHg4M0JELCAweDE4RjgsCi0gICAgMHg4M0JGLCAweDNBRDEsIDB4ODNDMCwgMHgzQUQyLCAweDgzQzEsIDB4MThGMCwgMHg4M0M1LCAweDBBNDEsCi0gICAgMHg4M0M3LCAweDIxOUIsIDB4ODNDQSwgMHgwNjYwLCAweDgzQ0MsIDB4MDZENSwgMHg4M0NFLCAweDE4RUIsCi0gICAgMHg4M0QzLCAweDA1NUIsIDB4ODNENiwgMHgwOUJDLCAweDgzRDgsIDB4MThFRSwgMHg4M0RDLCAweDA4NEEsCi0gICAgMHg4M0RGLCAweDBDNEIsIDB4ODNFMCwgMHgxOEYzLCAweDgzRTksIDB4MEUzRSwgMHg4M0VBLCAweDNBRDMsCi0gICAgMHg4M0VCLCAweDE4RUEsIDB4ODNFRiwgMHgwNTVBLCAweDgzRjAsIDB4MDc4QSwgMHg4M0YxLCAweDBEOUIsCi0gICAgMHg4M0YyLCAweDE4RjQsIDB4ODNGNCwgMHgxOEU4LCAweDgzRjYsIDB4MjE5QywgMHg4M0Y3LCAweDE4RjEsCi0gICAgMHg4M0ZCLCAweDE4RkIsIDB4ODNGRCwgMHgxOEVDLCAweDg0MDMsIDB4MThFRCwgMHg4NDA0LCAweDBDOTIsCi0gICAgMHg4NDA3LCAweDE4RjIsIDB4ODQwQSwgMHgxRTdGLCAweDg0MEIsIDB4MThFRiwgMHg4NDBDLCAweDBFNTYsCi0gICAgMHg4NDBELCAweDE4RjUsIDB4ODQwRSwgMHgwNEE0LCAweDg0MEYsIDB4M0FENCwgMHg4NDExLCAweDNBRDUsCi0gICAgMHg4NDEzLCAweDE4RTksIDB4ODQyMCwgMHgxOEY3LCAweDg0MjIsIDB4MThGNiwgMHg4NDI5LCAweDBEMjEsCi0gICAgMHg4NDJBLCAweDE4RkQsIDB4ODQyQywgMHgxOTA4LCAweDg0MzEsIDB4MDVEQywgMHg4NDM1LCAweDE5MEIsCi0gICAgMHg4NDM4LCAweDE4RjksIDB4ODQzQywgMHgxOEZFLCAweDg0M0QsIDB4MEY1OCwgMHg4NDQ2LCAweDE5MDcsCi0gICAgMHg4NDQ4LCAweDIxOUQsIDB4ODQ0OSwgMHgwRjNGLCAweDg0NEEsIDB4M0FENiwgMHg4NDRFLCAweDBGNzIsCi0gICAgMHg4NDU3LCAweDBCQjYsIDB4ODQ1QiwgMHgwNUM5LCAweDg0NjEsIDB4MERFNCwgMHg4NDYyLCAweDE5MEQsCi0gICAgMHg4NDYzLCAweDBDNzksIDB4ODQ2NiwgMHgwNDc1LCAweDg0NjksIDB4MTkwNiwgMHg4NDZCLCAweDE5MDIsCi0gICAgMHg4NDZDLCAweDBBRjQsIDB4ODQ2RCwgMHgxOEZDLCAweDg0NkUsIDB4MTkwNCwgMHg4NDZGLCAweDE5MDksCi0gICAgMHg4NDcxLCAweDBDRTIsIDB4ODQ3NSwgMHgwNDZFLCAweDg0NzYsIDB4M0FENywgMHg4NDc3LCAweDE5MDEsCi0gICAgMHg4NDc5LCAweDE5MEEsIDB4ODQ3QSwgMHgwREVBLCAweDg0ODIsIDB4MTkwNSwgMHg4NDg0LCAweDE5MDAsCi0gICAgMHg4NDhCLCAweDA5QkQsIDB4ODQ5MCwgMHgwOTM5LCAweDg0OTQsIDB4MDhEOCwgMHg4NDk5LCAweDBFRTQsCi0gICAgMHg4NDlDLCAweDBEQjksIDB4ODQ5RiwgMHgxOTEwLCAweDg0QTEsIDB4MTkxOSwgMHg4NEE4LCAweDNBRDgsCi0gICAgMHg4NEFELCAweDE5MDMsIDB4ODRBRiwgMHgzQUQ5LCAweDg0QjIsIDB4MDVENSwgMHg4NEI0LCAweDIxOUUsCi0gICAgMHg4NEI4LCAweDA5RTAsIDB4ODRCOSwgMHgxOTBFLCAweDg0QkIsIDB4MTkxMywgMHg4NEJDLCAweDBBRjUsCi0gICAgMHg4NEJGLCAweDE5MEYsIDB4ODRDMCwgMHgzQURBLCAweDg0QzEsIDB4MTkxNiwgMHg4NEMyLCAweDNBREIsCi0gICAgMHg4NEM0LCAweDBCOUQsIDB4ODRDNiwgMHgxOTE3LCAweDg0QzksIDB4MEY0MCwgMHg4NENBLCAweDE5MEMsCi0gICAgMHg4NENCLCAweDA1OTYsIDB4ODRDRCwgMHgxOTEyLCAweDg0RDAsIDB4MTkxNSwgMHg4NEQxLCAweDBFQjgsCi0gICAgMHg4NEQ2LCAweDE5MTgsIDB4ODREOSwgMHgxOTExLCAweDg0REEsIDB4MTkxNCwgMHg4NERDLCAweDIwQUIsCi0gICAgMHg4NEVDLCAweDBFNTcsIDB4ODRFRSwgMHgwRkM3LCAweDg0RjAsIDB4M0FEQywgMHg4NEY0LCAweDE5MUMsCi0gICAgMHg4NEZDLCAweDE5MjMsIDB4ODRGRCwgMHgzQURELCAweDg0RkYsIDB4MTkxQiwgMHg4NTAwLCAweDA4RUYsCi0gICAgMHg4NTA2LCAweDE4RkEsIDB4ODUwQywgMHgzQURFLCAweDg1MTEsIDB4MEUxRSwgMHg4NTEzLCAweDBFQUUsCi0gICAgMHg4NTE0LCAweDE5MjIsIDB4ODUxNSwgMHgxOTIxLCAweDg1MTcsIDB4MTkxRCwgMHg4NTE4LCAweDE5MUUsCi0gICAgMHg4NTFBLCAweDA0RDgsIDB4ODUxRiwgMHgxOTIwLCAweDg1MjEsIDB4MTkxQSwgMHg4NTIzLCAweDFFMUEsCi0gICAgMHg4NTI2LCAweDBCRjEsIDB4ODUyQywgMHgxOTFGLCAweDg1MkQsIDB4MDRDMiwgMHg4NTM0LCAweDNBREYsCi0gICAgMHg4NTM1LCAweDBCMDIsIDB4ODUzRCwgMHgwRTEzLCAweDg1M0UsIDB4MUVCNSwgMHg4NTQwLCAweDE5MjQsCi0gICAgMHg4NTQxLCAweDE5MjgsIDB4ODU0MywgMHgwRDZELCAweDg1NDgsIDB4MTkyNywgMHg4NTQ5LCAweDA5QkUsCi0gICAgMHg4NTRBLCAweDA4RjUsIDB4ODU0QiwgMHgxOTJBLCAweDg1NEUsIDB4MDZCNiwgMHg4NTUzLCAweDIxOUYsCi0gICAgMHg4NTU1LCAweDE5MkIsIDB4ODU1NywgMHgwREVCLCAweDg1NTgsIDB4MTkyNiwgMHg4NTU5LCAweDIxQTAsCi0gICAgMHg4NTVBLCAweDE4RkYsIDB4ODU1RSwgMHgzQUUwLCAweDg1NjMsIDB4MTkyNSwgMHg4NTY4LCAweDBGRjUsCi0gICAgMHg4NTY5LCAweDBDN0EsIDB4ODU2QSwgMHgwREU1LCAweDg1NkIsIDB4MjFBMSwgMHg4NTZELCAweDE5MzIsCi0gICAgMHg4NTc3LCAweDE5MzgsIDB4ODU3RSwgMHgxOTM5LCAweDg1ODAsIDB4MTkyQywgMHg4NTg0LCAweDBEMkMsCi0gICAgMHg4NTg3LCAweDE5MzYsIDB4ODU4OCwgMHgxOTJFLCAweDg1OEEsIDB4MTkzMCwgMHg4NThGLCAweDNBRTEsCi0gICAgMHg4NTkwLCAweDE5M0EsIDB4ODU5MSwgMHgxOTJGLCAweDg1OTQsIDB4MTkzMywgMHg4NTk3LCAweDA1MTQsCi0gICAgMHg4NTk5LCAweDBDQkQsIDB4ODU5QiwgMHgxOTM0LCAweDg1OUMsIDB4MTkzNywgMHg4NUE0LCAweDE5MkQsCi0gICAgMHg4NUE2LCAweDBBQTgsIDB4ODVBOCwgMHgxOTMxLCAweDg1QTksIDB4MDg3NSwgMHg4NUFBLCAweDBBMEIsCi0gICAgMHg4NUFCLCAweDA3MDYsIDB4ODVBQywgMHgwRjAwLCAweDg1QUQsIDB4M0FFNCwgMHg4NUFFLCAweDBGMDUsCi0gICAgMHg4NUFGLCAweDA5N0MsIDB4ODVCMCwgMHgyMUEzLCAweDg1QjcsIDB4M0FFMiwgMHg4NUI5LCAweDE5M0UsCi0gICAgMHg4NUJBLCAweDE5M0MsIDB4ODVDMSwgMHgwRkY0LCAweDg1QzksIDB4MTkzQiwgMHg4NUNELCAweDBGNUYsCi0gICAgMHg4NUNFLCAweDNBRTMsIDB4ODVDRiwgMHgxOTNELCAweDg1RDAsIDB4MTkzRiwgMHg4NUQ1LCAweDE5NDAsCi0gICAgMHg4NURDLCAweDE5NDMsIDB4ODVERCwgMHgxOTQxLCAweDg1RTQsIDB4MEM3QiwgMHg4NUU1LCAweDE5NDIsCi0gICAgMHg4NUU5LCAweDBENjEsIDB4ODVFQSwgMHgxOTM1LCAweDg1RjQsIDB4Mzc4MCwgMHg4NUY3LCAweDA5N0QsCi0gICAgMHg4NUY5LCAweDE5NDQsIDB4ODVGQSwgMHgxOTQ5LCAweDg1RkIsIDB4MEFGNiwgMHg4NUZFLCAweDE5NDgsCi0gICAgMHg4NjAyLCAweDE5MjksIDB4ODYwNiwgMHgxOTRBLCAweDg2MDcsIDB4MEFDQiwgMHg4NjBBLCAweDE5NDUsCi0gICAgMHg4NjBCLCAweDE5NDcsIDB4ODYxMiwgMHgzQUU1LCAweDg2MTMsIDB4MTk0NiwgMHg4NjE2LCAweDE0RDAsCi0gICAgMHg4NjE3LCAweDE0QzEsIDB4ODYxQSwgMHgxOTRDLCAweDg2MjIsIDB4MTk0QiwgMHg4NjI5LCAweDNBRTYsCi0gICAgMHg4NjJELCAweDBGNjAsIDB4ODYyRiwgMHgxNkIxLCAweDg2MzAsIDB4MTk0RCwgMHg4NjNGLCAweDE5NEUsCi0gICAgMHg4NjRELCAweDE5NEYsIDB4ODY0RSwgMHgwNzhCLCAweDg2NTAsIDB4MDY2RSwgMHg4NjUyLCAweDNBRTcsCi0gICAgMHg4NjU0LCAweDE5NTEsIDB4ODY1NSwgMHgxMDk0LCAweDg2NUEsIDB4MDY4RiwgMHg4NjVCLCAweDM0MTgsCi0gICAgMHg4NjVDLCAweDBGODIsIDB4ODY1RSwgMHgwNkVCLCAweDg2NUYsIDB4MTk1MiwgMHg4NjYzLCAweDNBRTgsCi0gICAgMHg4NjY3LCAweDE5NTMsIDB4ODY2QiwgMHgwQkFDLCAweDg2NkMsIDB4M0FFOSwgMHg4NjZGLCAweDNBRUEsCi0gICAgMHg4NjcxLCAweDE5NTQsIDB4ODY3OSwgMHgwQ0QyLCAweDg2N0EsIDB4M0FFQiwgMHg4NjdCLCAweDA0N0UsCi0gICAgMHg4NjdELCAweDM3ODYsIDB4ODY4QSwgMHgwNTYzLCAweDg2OEIsIDB4MTk1OSwgMHg4NjhDLCAweDE5NUEsCi0gICAgMHg4NjhELCAweDNBRUMsIDB4ODY5MSwgMHgzQUVELCAweDg2OTMsIDB4MTk1NSwgMHg4Njk1LCAweDA4OEIsCi0gICAgMHg4Njk4LCAweDNBRUUsIDB4ODZBMywgMHgxOTU2LCAweDg2QTQsIDB4MENGOCwgMHg4NkE3LCAweDNBRUYsCi0gICAgMHg4NkE4LCAweDNBRjAsIDB4ODZBOSwgMHgxOTU3LCAweDg2QUEsIDB4MTk1OCwgMHg4NkFCLCAweDE5NjIsCi0gICAgMHg4NkFGLCAweDE5NUMsIDB4ODZCMCwgMHgxOTVGLCAweDg2QjYsIDB4MTk1QiwgMHg4NkM0LCAweDE5NUQsCi0gICAgMHg4NkM2LCAweDE5NUUsIDB4ODZDNywgMHgwOTA0LCAweDg2QzksIDB4MTk2MCwgMHg4NkNCLCAweDBCN0YsCi0gICAgMHg4NkNELCAweDA3MkMsIDB4ODZDRSwgMHgwNUEwLCAweDg2RDQsIDB4MTk2MywgMHg4NkQ5LCAweDA1OUQsCi0gICAgMHg4NkRCLCAweDE5NjgsIDB4ODZERSwgMHgxOTY0LCAweDg2REYsIDB4MTk2NywgMHg4NkU0LCAweDBENEUsCi0gICAgMHg4NkU5LCAweDE5NjUsIDB4ODZFQywgMHgxOTY2LCAweDg2RUQsIDB4MERCQSwgMHg4NkVFLCAweDBENkUsCi0gICAgMHg4NkVGLCAweDE5NjksIDB4ODZGOCwgMHgwQjVELCAweDg2RjksIDB4MTk3MywgMHg4NkZBLCAweDNBRjEsCi0gICAgMHg4NkZCLCAweDE5NkYsIDB4ODZGRCwgMHgzQUYyLCAweDg2RkUsIDB4MDU2QiwgMHg4NzAwLCAweDE5NkQsCi0gICAgMHg4NzAyLCAweDBFNTgsIDB4ODcwMywgMHgxOTZFLCAweDg3MDYsIDB4MTk2QiwgMHg4NzA4LCAweDE5NkMsCi0gICAgMHg4NzA5LCAweDE5NzEsIDB4ODcwQSwgMHgxOTc0LCAweDg3MEIsIDB4M0FGMywgMHg4NzBELCAweDE5NzIsCi0gICAgMHg4NzExLCAweDE5NzAsIDB4ODcxMiwgMHgxOTZBLCAweDg3MTMsIDB4M0FGNCwgMHg4NzE4LCAweDBCOTYsCi0gICAgMHg4NzE5LCAweDNBRjUsIDB4ODcxQSwgMHgxOTdCLCAweDg3MUMsIDB4MEVCNiwgMHg4NzFFLCAweDNBRjYsCi0gICAgMHg4NzI1LCAweDE5NzksIDB4ODcyOCwgMHgzQUY3LCAweDg3MjksIDB4MTk3QSwgMHg4NzM0LCAweDE5NzUsCi0gICAgMHg4NzM3LCAweDE5NzcsIDB4ODczQiwgMHgxOTc4LCAweDg3M0UsIDB4M0FGOCwgMHg4NzNGLCAweDE5NzYsCi0gICAgMHg4NzQ5LCAweDBBOEEsIDB4ODc0QiwgMHgwRkRGLCAweDg3NEMsIDB4MTk3RiwgMHg4NzRFLCAweDE5ODAsCi0gICAgMHg4NzUzLCAweDE5ODYsIDB4ODc1NSwgMHgwOUYwLCAweDg3NTcsIDB4MTk4MiwgMHg4NzU5LCAweDE5ODUsCi0gICAgMHg4NzVGLCAweDE5N0QsIDB4ODc2MCwgMHgxOTdDLCAweDg3NjMsIDB4MTk4NywgMHg4NzY2LCAweDA1NUMsCi0gICAgMHg4NzY4LCAweDE5ODMsIDB4ODc2QSwgMHgxOTg4LCAweDg3NkUsIDB4MTk4NCwgMHg4NzcxLCAweDNBRjksCi0gICAgMHg4Nzc0LCAweDE5ODEsIDB4ODc3NiwgMHgwQkNGLCAweDg3NzgsIDB4MTk3RSwgMHg4NzdGLCAweDBEMUUsCi0gICAgMHg4NzgyLCAweDE5OEMsIDB4ODc4OCwgMHgzQUZBLCAweDg3OEQsIDB4MEYyNSwgMHg4Nzk5LCAweDNBRkIsCi0gICAgMHg4NzlGLCAweDE5OEIsIDB4ODdBMiwgMHgxOThBLCAweDg3QUIsIDB4MTk5MywgMHg4N0FDLCAweDNBRkMsCi0gICAgMHg4N0FELCAweDNBRkQsIDB4ODdBRiwgMHgxOThELCAweDg3QjMsIDB4MTk5NSwgMHg4N0I1LCAweDNBRkUsCi0gICAgMHg4N0JBLCAweDBGNTAsIDB4ODdCQiwgMHgxOTk4LCAweDg3QkQsIDB4MTk4RiwgMHg4N0MwLCAweDE5OTAsCi0gICAgMHg4N0M0LCAweDE5OTQsIDB4ODdDNiwgMHgxOTk3LCAweDg3QzcsIDB4MTk5NiwgMHg4N0NCLCAweDE5OEUsCi0gICAgMHg4N0QwLCAweDE5OTEsIDB4ODdEMiwgMHgxOUEyLCAweDg3RDYsIDB4M0FGRiwgMHg4N0UwLCAweDE5OUIsCi0gICAgMHg4N0VCLCAweDNCMDAsIDB4ODdFQywgMHgxRTIzLCAweDg3RUQsIDB4M0IwMSwgMHg4N0VGLCAweDE5OTksCi0gICAgMHg4N0YyLCAweDE5OUEsIDB4ODdGNSwgMHgzQzNELCAweDg3RjYsIDB4MTk5RiwgMHg4N0Y3LCAweDE5QTAsCi0gICAgMHg4N0Y5LCAweDA1ODgsIDB4ODdGQiwgMHgwNjVDLCAweDg3RkUsIDB4MTk5RSwgMHg4ODAxLCAweDNCMDIsCi0gICAgMHg4ODAzLCAweDNCMDMsIDB4ODgwNSwgMHgxOTg5LCAweDg4MDYsIDB4M0IwNCwgMHg4ODA3LCAweDIxQTYsCi0gICAgMHg4ODBCLCAweDNCMDUsIDB4ODgwRCwgMHgxOTlELCAweDg4MEUsIDB4MTlBMSwgMHg4ODBGLCAweDE5OUMsCi0gICAgMHg4ODExLCAweDE5QTMsIDB4ODgxNCwgMHgzQjA2LCAweDg4MTUsIDB4MTlBNSwgMHg4ODE2LCAweDE5QTQsCi0gICAgMHg4ODFDLCAweDNCMDcsIDB4ODgxRiwgMHgxRTg1LCAweDg4MjEsIDB4MTlBNywgMHg4ODIyLCAweDE5QTYsCi0gICAgMHg4ODIzLCAweDE5NjEsIDB4ODgyNywgMHgxOUFCLCAweDg4MzEsIDB4MTlBOCwgMHg4ODM2LCAweDE5QTksCi0gICAgMHg4ODM5LCAweDE5QUEsIDB4ODgzQiwgMHgxOUFDLCAweDg4NDAsIDB4MDc0MiwgMHg4ODQyLCAweDE5QUUsCi0gICAgMHg4ODQ0LCAweDE5QUQsIDB4ODg0NiwgMHgwOTNBLCAweDg4NEMsIDB4MDdFNiwgMHg4ODRELCAweDE1MjQsCi0gICAgMHg4ODUyLCAweDE5QUYsIDB4ODg1MywgMHgwOTVCLCAweDg4NTYsIDB4M0IwOCwgMHg4ODU3LCAweDA1OTcsCi0gICAgMHg4ODU5LCAweDE5QjAsIDB4ODg1QiwgMHgwNEY0LCAweDg4NUQsIDB4MDlCRiwgMHg4ODVFLCAweDE5QjEsCi0gICAgMHg4ODVGLCAweDNCMDksIDB4ODg2MSwgMHgwN0U3LCAweDg4NjIsIDB4MTlCMiwgMHg4ODYzLCAweDA0QTUsCi0gICAgMHg4ODY0LCAweDNCMEEsIDB4ODg2OCwgMHgwREFGLCAweDg4NkIsIDB4MTlCMywgMHg4ODcwLCAweDBBMzAsCi0gICAgMHg4ODcyLCAweDE5QkEsIDB4ODg3NSwgMHgxOUI3LCAweDg4NzcsIDB4MEJBRCwgMHg4ODdELCAweDE5QjgsCi0gICAgMHg4ODdFLCAweDE5QjUsIDB4ODg3RiwgMHgwNkQ2LCAweDg4ODEsIDB4MTlCNCwgMHg4ODgyLCAweDE5QkIsCi0gICAgMHg4ODg4LCAweDA3MEMsIDB4ODg4QiwgMHgwQjNFLCAweDg4OEQsIDB4MTlDMSwgMHg4ODkyLCAweDE5QkQsCi0gICAgMHg4ODk2LCAweDBCMTUsIDB4ODg5NywgMHgxOUJDLCAweDg4OTgsIDB4M0IwQiwgMHg4ODk5LCAweDE5QkYsCi0gICAgMHg4ODlFLCAweDE5QjYsIDB4ODhBMiwgMHgxOUMwLCAweDg4QTQsIDB4MTlDMiwgMHg4OEFBLCAweDNCMEMsCi0gICAgMHg4OEFCLCAweDBEODMsIDB4ODhBRSwgMHgxOUJFLCAweDg4QjAsIDB4MTlDMywgMHg4OEIxLCAweDE5QzUsCi0gICAgMHg4OEI0LCAweDA3ODcsIDB4ODhCNSwgMHgxOUI5LCAweDg4QjcsIDB4MDQ4NSwgMHg4OEJELCAweDNCMEQsCi0gICAgMHg4OEJFLCAweDNCMEUsIDB4ODhCRiwgMHgxOUM0LCAweDg4QzEsIDB4MDg0QiwgMHg4OEMyLCAweDBGQkUsCi0gICAgMHg4OEMzLCAweDE5QzYsIDB4ODhDNCwgMHgxOUM3LCAweDg4QzUsIDB4MEFGNywgMHg4OEM2LCAweDM3ODksCi0gICAgMHg4OENBLCAweDNCMEYsIDB4ODhDRiwgMHgwRjZBLCAweDg4RDIsIDB4M0IxMCwgMHg4OEQ0LCAweDE5QzgsCi0gICAgMHg4OEQ1LCAweDBGMUYsIDB4ODhEOCwgMHgxOUM5LCAweDg4RDksIDB4MTlDQSwgMHg4OERCLCAweDNCMTEsCi0gICAgMHg4OERDLCAweDBFMzQsIDB4ODhERCwgMHgxOUNCLCAweDg4REYsIDB4MDgzMCwgMHg4OEUxLCAweDBGNkIsCi0gICAgMHg4OEU4LCAweDE5RDAsIDB4ODhGMCwgMHgzQjEyLCAweDg4RjEsIDB4M0IxMywgMHg4OEYyLCAweDE5RDEsCi0gICAgMHg4OEYzLCAweDA5QzAsIDB4ODhGNCwgMHgxOUNGLCAweDg4RjUsIDB4MjFBNywgMHg4OEY4LCAweDBGNTEsCi0gICAgMHg4OEY5LCAweDE5Q0MsIDB4ODhGQywgMHgxOUNFLCAweDg4RkQsIDB4MEE2MSwgMHg4OEZFLCAweDBBNDQsCi0gICAgMHg4OTAyLCAweDE5Q0QsIDB4ODkwNCwgMHgxOUQyLCAweDg5MDYsIDB4M0IxNCwgMHg4OTA3LCAweDBERjMsCi0gICAgMHg4OTBBLCAweDE5RDQsIDB4ODkwQywgMHgxOUQzLCAweDg5MTAsIDB4MDVDQSwgMHg4OTEyLCAweDBFNTksCi0gICAgMHg4OTEzLCAweDE5RDUsIDB4ODkxOCwgMHgzQjE1LCAweDg5MTksIDB4M0IxNiwgMHg4OTFBLCAweDNCMTcsCi0gICAgMHg4OTFDLCAweDIwQTgsIDB4ODkxRCwgMHgxOUUxLCAweDg5MUUsIDB4MTlENywgMHg4OTI1LCAweDE5RDgsCi0gICAgMHg4OTI3LCAweDNCMTgsIDB4ODkyQSwgMHgxOUQ5LCAweDg5MkIsIDB4MTlEQSwgMHg4OTMwLCAweDNCMTksCi0gICAgMHg4OTM2LCAweDE5REUsIDB4ODkzOCwgMHgxOURGLCAweDg5M0IsIDB4MTlERCwgMHg4OTNFLCAweDNCMUEsCi0gICAgMHg4OTQxLCAweDE5REIsIDB4ODk0MywgMHgxOUQ2LCAweDg5NDQsIDB4MTlEQywgMHg4OTRDLCAweDE5RTAsCi0gICAgMHg4OTRELCAweDFCRDAsIDB4ODk1NiwgMHgwNTI4LCAweDg5NUUsIDB4MTlFMywgMHg4OTVGLCAweDA2RDcsCi0gICAgMHg4OTYwLCAweDE5RTIsIDB4ODk2NCwgMHgxOUU1LCAweDg5NjYsIDB4MTlFNCwgMHg4OTZBLCAweDE5RTcsCi0gICAgMHg4OTZELCAweDE5RTYsIDB4ODk2RiwgMHgxOUU4LCAweDg5NzIsIDB4MDkzQiwgMHg4OTc0LCAweDE5RTksCi0gICAgMHg4OTc3LCAweDE5RUEsIDB4ODk3QiwgMHgzQjFCLCAweDg5N0UsIDB4MTlFQiwgMHg4OTdGLCAweDBBNjIsCi0gICAgMHg4OTgwLCAweDM2MkUsIDB4ODk4MSwgMHgwRjQxLCAweDg5ODMsIDB4MTlFQywgMHg4OTg2LCAweDBERjQsCi0gICAgMHg4OTg3LCAweDBDRkMsIDB4ODk4OCwgMHgxOUVELCAweDg5OEEsIDB4MTlFRSwgMHg4OThCLCAweDA3NUYsCi0gICAgMHg4OThGLCAweDA2NDYsIDB4ODk5MywgMHgxOUVGLCAweDg5OTYsIDB4MDhCOSwgMHg4OTk3LCAweDBDRjcsCi0gICAgMHg4OTk4LCAweDE5RjAsIDB4ODk5QSwgMHgwNUFFLCAweDg5QTEsIDB4MTlGMSwgMHg4OUE2LCAweDE5RjMsCi0gICAgMHg4OUE3LCAweDBGNjEsIDB4ODlBOSwgMHgxOUYyLCAweDg5QUEsIDB4MEEwQywgMHg4OUFDLCAweDE5RjQsCi0gICAgMHg4OUFGLCAweDE5RjUsIDB4ODlCMiwgMHgxOUY2LCAweDg5QjMsIDB4MDYwRCwgMHg4OUJBLCAweDE5RjcsCi0gICAgMHg4OUJELCAweDE5RjgsIDB4ODlCRiwgMHgxOUY5LCAweDg5QzAsIDB4MTlGQSwgMHg4OUQyLCAweDA1QUYsCi0gICAgMHg4OUQ0LCAweDNCMUMsIDB4ODlENiwgMHgzQjFELCAweDg5REEsIDB4MTlGQiwgMHg4OURDLCAweDE5RkMsCi0gICAgMHg4OURELCAweDE5RkQsIDB4ODlFMywgMHgwNTcyLCAweDg5RTUsIDB4M0IxRSwgMHg4OUU2LCAweDA5RUUsCi0gICAgMHg4OUU3LCAweDE5RkUsIDB4ODlGMSwgMHgzQjFGLCAweDg5RjQsIDB4MTlGRiwgMHg4OUY4LCAweDFBMDAsCi0gICAgMHg4QTAwLCAweDA3NzQsIDB4OEEwMSwgMHgzNUJDLCAweDhBMDIsIDB4MEMxNywgMHg4QTAzLCAweDFBMDEsCi0gICAgMHg4QTA3LCAweDNCMjAsIDB4OEEwOCwgMHgwNzJELCAweDhBMEEsIDB4MEExQywgMHg4QTBDLCAweDFBMDQsCi0gICAgMHg4QTBFLCAweDBDN0MsIDB4OEEwRiwgMHgzQjIxLCAweDhBMTAsIDB4MUEwMywgMHg4QTEyLCAweDIxQTgsCi0gICAgMHg4QTEzLCAweDA3MDcsIDB4OEExNSwgMHgzQjIyLCAweDhBMTYsIDB4MUEwMiwgMHg4QTE3LCAweDBCNTcsCi0gICAgMHg4QTE4LCAweDA2NDcsIDB4OEExQiwgMHgxQTA1LCAweDhBMUQsIDB4MUEwNiwgMHg4QTFGLCAweDA5QzEsCi0gICAgMHg4QTIyLCAweDNCMjMsIDB4OEEyMywgMHgwNzQzLCAweDhBMjUsIDB4MUEwNywgMHg4QTJBLCAweDBFNUEsCi0gICAgMHg4QTJELCAweDBBODMsIDB4OEEzMSwgMHgwNjkwLCAweDhBMzMsIDB4MEYwMSwgMHg4QTM0LCAweDBBQ0MsCi0gICAgMHg4QTM2LCAweDFBMDgsIDB4OEEzNywgMHgyMUE5LCAweDhBM0EsIDB4MEEwRCwgMHg4QTNCLCAweDBCQUUsCi0gICAgMHg4QTNDLCAweDA5QzIsIDB4OEE0MSwgMHgxQTA5LCAweDhBNDYsIDB4MUEwQywgMHg4QTQ4LCAweDFBMEQsCi0gICAgMHg4QTRFLCAweDNCMjQsIDB4OEE1MCwgMHgwODJFLCAweDhBNTEsIDB4MEIyMiwgMHg4QTUyLCAweDFBMEIsCi0gICAgMHg4QTU0LCAweDA5QzMsIDB4OEE1NSwgMHgwREIwLCAweDhBNUIsIDB4MUEwQSwgMHg4QTVFLCAweDA4QkEsCi0gICAgMHg4QTYwLCAweDA0RjUsIDB4OEE2MiwgMHgxQTExLCAweDhBNjMsIDB4MDcyRSwgMHg4QTY2LCAweDA4QkMsCi0gICAgMHg4QTY5LCAweDA4QkIsIDB4OEE2QiwgMHgwRkYzLCAweDhBNkMsIDB4MUExMCwgMHg4QTZELCAweDFBMEYsCi0gICAgMHg4QTZFLCAweDBBQTksIDB4OEE3MCwgMHgwNjY3LCAweDhBNzEsIDB4MEZFOSwgMHg4QTcyLCAweDA1OTgsCi0gICAgMHg4QTczLCAweDA5QzQsIDB4OEE3OSwgMHgyMUFBLCAweDhBN0MsIDB4MUEwRSwgMHg4QTdGLCAweDNCMjUsCi0gICAgMHg4QTgyLCAweDFBMTMsIDB4OEE4NCwgMHgxQTE0LCAweDhBODUsIDB4MUExMiwgMHg4QTg3LCAweDA3OEMsCi0gICAgMHg4QTg5LCAweDBGMkEsIDB4OEE4QywgMHgwOEJELCAweDhBOEQsIDB4MENERCwgMHg4QTkxLCAweDFBMTcsCi0gICAgMHg4QTkzLCAweDBBNjQsIDB4OEE5NSwgMHgwQjgwLCAweDhBOTgsIDB4MEYyMCwgMHg4QTlBLCAweDFBMUEsCi0gICAgMHg4QTlFLCAweDA3QTAsIDB4OEFBMCwgMHgwQTYzLCAweDhBQTEsIDB4MUExNiwgMHg4QUEzLCAweDFBMUIsCi0gICAgMHg4QUE0LCAweDA3QTEsIDB4OEFBNSwgMHgxQTE4LCAweDhBQTYsIDB4MUExOSwgMHg4QUE3LCAweDIxQUIsCi0gICAgMHg4QUE4LCAweDFBMTUsIDB4OEFBQSwgMHgzNjM4LCAweDhBQUMsIDB4MEE4NiwgMHg4QUFELCAweDBDQTEsCi0gICAgMHg4QUIwLCAweDBCNkQsIDB4OEFCMiwgMHgwNTVELCAweDhBQjksIDB4MEQ4NCwgMHg4QUJDLCAweDA2NUQsCi0gICAgMHg4QUJFLCAweDIxQUMsIDB4OEFCRiwgMHgwQkQwLCAweDhBQzIsIDB4MUExRSwgMHg4QUM0LCAweDFBMUMsCi0gICAgMHg4QUM3LCAweDBCOEEsIDB4OEFDQiwgMHgwQTY1LCAweDhBQ0MsIDB4MDYwRSwgMHg4QUNELCAweDFBMUQsCi0gICAgMHg4QUNGLCAweDBBMjEsIDB4OEFEMiwgMHgwRjkyLCAweDhBRDYsIDB4MEZFNiwgMHg4QURBLCAweDFBMUYsCi0gICAgMHg4QURCLCAweDFBMkEsIDB4OEFEQywgMHgwQkQxLCAweDhBREUsIDB4MUEyOSwgMHg4QURGLCAweDIxQUQsCi0gICAgMHg4QUUwLCAweDFBMjYsIDB4OEFFMSwgMHgxQTJFLCAweDhBRTIsIDB4MUEyNywgMHg4QUU0LCAweDFBMjMsCi0gICAgMHg4QUU2LCAweDBDMTgsIDB4OEFFNywgMHgxQTIyLCAweDhBRUIsIDB4MUEyMCwgMHg4QUVELCAweDBGMEIsCi0gICAgMHg4QUVFLCAweDA4QkUsIDB4OEFGMSwgMHgxQTI0LCAweDhBRjMsIDB4MUEyMSwgMHg4QUY0LCAweDNCMjYsCi0gICAgMHg4QUY2LCAweDIxQUYsIDB4OEFGNywgMHgxQTI4LCAweDhBRjgsIDB4MDk3RSwgMHg4QUZBLCAweDA3NzUsCi0gICAgMHg4QUZFLCAweDBCNUEsIDB4OEIwMCwgMHgwRTczLCAweDhCMDEsIDB4MDRGQywgMHg4QjAyLCAweDA0QTYsCi0gICAgMHg4QjA0LCAweDBDN0QsIDB4OEIwNywgMHgxQTJDLCAweDhCMEMsIDB4MUEyQiwgMHg4QjBFLCAweDBDQkUsCi0gICAgMHg4QjEwLCAweDFBMzAsIDB4OEIxNCwgMHgxQTI1LCAweDhCMTYsIDB4MUEyRiwgMHg4QjE3LCAweDFBMzEsCi0gICAgMHg4QjE5LCAweDA3NjAsIDB4OEIxQSwgMHgxQTJELCAweDhCMUIsIDB4MDdFOCwgMHg4QjFELCAweDA5MDEsCi0gICAgMHg4QjFGLCAweDNCMjcsIDB4OEIyMCwgMHgxQTMyLCAweDhCMjEsIDB4MEY0MiwgMHg4QjI2LCAweDFBMzUsCi0gICAgMHg4QjI4LCAweDFBMzgsIDB4OEIyQiwgMHgxQTM2LCAweDhCMkMsIDB4MERBNywgMHg4QjMzLCAweDFBMzMsCi0gICAgMHg4QjM3LCAweDNCMjgsIDB4OEIzOSwgMHgwNkQ4LCAweDhCM0UsIDB4MUEzNywgMHg4QjQxLCAweDFBMzksCi0gICAgMHg4QjQzLCAweDNCMjksIDB4OEI0NCwgMHgzQjJBLCAweDhCNDksIDB4MUEzRCwgMHg4QjRDLCAweDFBM0EsCi0gICAgMHg4QjRFLCAweDFBM0MsIDB4OEI0RiwgMHgxQTNCLCAweDhCNTMsIDB4MjFCMCwgMHg4QjU0LCAweDNCMkIsCi0gICAgMHg4QjU2LCAweDFBM0UsIDB4OEI1OCwgMHgwOERELCAweDhCNUEsIDB4MUE0MCwgMHg4QjVCLCAweDFBM0YsCi0gICAgMHg4QjVDLCAweDBEREEsIDB4OEI1RiwgMHgxQTQyLCAweDhCNjYsIDB4MDcyRiwgMHg4QjZCLCAweDFBNDEsCi0gICAgMHg4QjZDLCAweDFBNDMsIDB4OEI2RiwgMHgxQTQ0LCAweDhCNzAsIDB4MDY1RSwgMHg4QjcxLCAweDE4MkUsCi0gICAgMHg4QjcyLCAweDA5RTEsIDB4OEI3NCwgMHgxQTQ1LCAweDhCNzcsIDB4MDdBMiwgMHg4QjdELCAweDFBNDYsCi0gICAgMHg4QjdGLCAweDIxQjEsIDB4OEI4MCwgMHgxQTQ3LCAweDhCODMsIDB4MDg4QywgMHg4QjhBLCAweDEzRDMsCi0gICAgMHg4QjhDLCAweDFBNDgsIDB4OEI4RSwgMHgxQTQ5LCAweDhCOTAsIDB4MDkzQywgMHg4QjkyLCAweDFBNEEsCi0gICAgMHg4QjkzLCAweDFBNEIsIDB4OEI5NiwgMHgxQTRDLCAweDhCOTksIDB4MUE0RCwgMHg4QjlBLCAweDFBNEUsCi0gICAgMHg4QjlDLCAweDNCMkMsIDB4OEI5RSwgMHgzQjJELCAweDhDMzcsIDB4MEI2OSwgMHg4QzNBLCAweDFBNEYsCi0gICAgMHg4QzNGLCAweDFBNTEsIDB4OEM0MSwgMHgxQTUwLCAweDhDNDYsIDB4MEM3RSwgMHg4QzQ3LCAweDNCMkUsCi0gICAgMHg4QzQ4LCAweDFBNTIsIDB4OEM0QSwgMHgwRTVCLCAweDhDNEMsIDB4MUE1MywgMHg4QzRFLCAweDFBNTQsCi0gICAgMHg4QzUwLCAweDFBNTUsIDB4OEM1NCwgMHgzQjJGLCAweDhDNTUsIDB4MUE1NiwgMHg4QzVBLCAweDBDQjIsCi0gICAgMHg4QzYxLCAweDA5QzUsIDB4OEM2MiwgMHgxQTU3LCAweDhDNkEsIDB4MDdGRCwgMHg4QzZCLCAweDEwMDcsCi0gICAgMHg4QzZDLCAweDFBNTgsIDB4OEM3MywgMHgzQjMwLCAweDhDNzgsIDB4MUE1OSwgMHg4Qzc5LCAweDBEQjEsCi0gICAgMHg4QzdBLCAweDFBNUEsIDB4OEM3QywgMHgxQTYyLCAweDhDODIsIDB4MUE1QiwgMHg4Qzg1LCAweDFBNUQsCi0gICAgMHg4Qzg5LCAweDFBNUMsIDB4OEM4QSwgMHgxQTVFLCAweDhDOEMsIDB4MEU3NCwgMHg4QzhELCAweDFBNUYsCi0gICAgMHg4QzhFLCAweDFBNjAsIDB4OEM5NCwgMHgxQTYxLCAweDhDOTgsIDB4MUE2MywgMHg4QzlELCAweDA1OEIsCi0gICAgMHg4QzlFLCAweDBDMDMsIDB4OENBMCwgMHgwRERCLCAweDhDQTEsIDB4MDg1MiwgMHg4Q0EyLCAweDA3RTksCi0gICAgMHg4Q0E0LCAweDNCMzEsIDB4OENBNywgMHgwREMxLCAweDhDQTgsIDB4MDU1RiwgMHg4Q0E5LCAweDBENjIsCi0gICAgMHg4Q0FBLCAweDFBNjYsIDB4OENBQiwgMHgwNjBGLCAweDhDQUMsIDB4MEE3OSwgMHg4Q0FELCAweDFBNjUsCi0gICAgMHg4Q0FFLCAweDFBNkEsIDB4OENBRiwgMHgwQkI3LCAweDhDQjAsIDB4MEVFRiwgMHg4Q0IyLCAweDFBNjgsCi0gICAgMHg4Q0IzLCAweDFBNjksIDB4OENCNCwgMHgwNjQ4LCAweDhDQjYsIDB4MUE2QiwgMHg4Q0I3LCAweDBEMTksCi0gICAgMHg4Q0I4LCAweDBCM0YsIDB4OENCQiwgMHgwRDg1LCAweDhDQkMsIDB4MEMzNywgMHg4Q0JELCAweDFBNjcsCi0gICAgMHg4Q0JGLCAweDBFNzUsIDB4OENDMCwgMHgwNTZDLCAweDhDQzEsIDB4MUE2RCwgMHg4Q0MyLCAweDBGQ0UsCi0gICAgMHg4Q0MzLCAweDBCREUsIDB4OENDNCwgMHgwRkVCLCAweDhDQzcsIDB4MDhCRiwgMHg4Q0M4LCAweDFBNkMsCi0gICAgMHg4Q0NBLCAweDBCMTEsIDB4OENDRCwgMHgxQTdELCAweDhDQ0UsIDB4MEFBQSwgMHg4Q0QxLCAweDBDRDAsCi0gICAgMHg4Q0QzLCAweDBEQzIsIDB4OENEOSwgMHgzQjMyLCAweDhDREEsIDB4MUE3MCwgMHg4Q0RCLCAweDA4OEQsCi0gICAgMHg4Q0RDLCAweDA4QzAsIDB4OENERSwgMHgwOUM2LCAweDhDRTAsIDB4MEQxQiwgMHg4Q0UxLCAweDNCMzMsCi0gICAgMHg4Q0UyLCAweDA3NjEsIDB4OENFMywgMHgxQTZGLCAweDhDRTQsIDB4MUE2RSwgMHg4Q0U2LCAweDBEREMsCi0gICAgMHg4Q0VBLCAweDA4RUQsIDB4OENFRCwgMHgwQzRDLCAweDhDRjAsIDB4MjFCMiwgMHg4Q0Y0LCAweDIxQjMsCi0gICAgMHg4Q0Y4LCAweDNCMzQsIDB4OENGQSwgMHgxQTcyLCAweDhDRkIsIDB4MUE3MywgMHg4Q0ZDLCAweDA3RUEsCi0gICAgMHg4Q0ZELCAweDFBNzEsIDB4OENGRSwgMHgzQjM1LCAweDhEMDQsIDB4MUE3NCwgMHg4RDA1LCAweDFBNzUsCi0gICAgMHg4RDA3LCAweDFBNzcsIDB4OEQwOCwgMHgwQjAzLCAweDhEMEEsIDB4MUE3NiwgMHg4RDBCLCAweDA2MjIsCi0gICAgMHg4RDBELCAweDFBNzksIDB4OEQwRiwgMHgxQTc4LCAweDhEMTAsIDB4MUE3QSwgMHg4RDEyLCAweDIxQjQsCi0gICAgMHg4RDEzLCAweDFBN0MsIDB4OEQxNCwgMHgxQTdFLCAweDhEMTYsIDB4MUE3RiwgMHg4RDFCLCAweDNCMzYsCi0gICAgMHg4RDY0LCAweDBBN0EsIDB4OEQ2NiwgMHgwOEZCLCAweDhENjcsIDB4MUE4MCwgMHg4RDY5LCAweDNCMzcsCi0gICAgMHg4RDZCLCAweDA1QjAsIDB4OEQ2QywgMHgzQjM4LCAweDhENkQsIDB4MUE4MSwgMHg4RDcwLCAweDBBRjgsCi0gICAgMHg4RDcxLCAweDFBODIsIDB4OEQ3MywgMHgxQTgzLCAweDhENzQsIDB4MERERCwgMHg4RDc2LCAweDIxQjUsCi0gICAgMHg4RDc3LCAweDA2NDksIDB4OEQ4MSwgMHgxQTg0LCAweDhEODQsIDB4M0IzOSwgMHg4RDg1LCAweDBCRDIsCi0gICAgMHg4RDhBLCAweDA0RkQsIDB4OEQ4RCwgMHgzQjNBLCAweDhEOTUsIDB4M0IzQiwgMHg4RDk5LCAweDFBODUsCi0gICAgMHg4REEzLCAweDA5MUQsIDB4OERBNiwgMHgzQjNDLCAweDhEQTgsIDB4MEEzQywgMHg4REIzLCAweDBCMEQsCi0gICAgMHg4REJBLCAweDFBODgsIDB4OERCRSwgMHgxQTg3LCAweDhEQzIsIDB4MUE4NiwgMHg4REM2LCAweDNCM0QsCi0gICAgMHg4RENCLCAweDFBOEUsIDB4OERDQywgMHgxQThDLCAweDhEQ0UsIDB4M0IzRSwgMHg4RENGLCAweDFBODksCi0gICAgMHg4REQ2LCAweDFBOEIsIDB4OEREQSwgMHgxQThBLCAweDhEREIsIDB4MUE4RCwgMHg4RERELCAweDA2OTEsCi0gICAgMHg4RERGLCAweDFBOTEsIDB4OERFMSwgMHgwQTdCLCAweDhERTMsIDB4MUE5MiwgMHg4REU0LCAweDNCM0YsCi0gICAgMHg4REU4LCAweDA3OEQsIDB4OERFQSwgMHgxQThGLCAweDhERUIsIDB4MUE5MCwgMHg4REVDLCAweDNCNDAsCi0gICAgMHg4REVGLCAweDBGQ0YsIDB4OERGMywgMHgwQkQzLCAweDhERjUsIDB4MEFBQiwgMHg4REZDLCAweDFBOTMsCi0gICAgMHg4REZGLCAweDFBOTYsIDB4OEUwOCwgMHgxQTk0LCAweDhFMDksIDB4MUE5NSwgMHg4RTBBLCAweDBGNDMsCi0gICAgMHg4RTBGLCAweDBDN0YsIDB4OEUxMCwgMHgxQTk5LCAweDhFMUQsIDB4MUE5NywgMHg4RTFFLCAweDFBOTgsCi0gICAgMHg4RTFGLCAweDFBOUEsIDB4OEUyMCwgMHgzQjQxLCAweDhFMkEsIDB4MUFBOCwgMHg4RTMwLCAweDFBOUQsCi0gICAgMHg4RTM0LCAweDFBOUUsIDB4OEUzNSwgMHgxQTlDLCAweDhFNDIsIDB4MUE5QiwgMHg4RTQ0LCAweDBDMTksCi0gICAgMHg4RTQ3LCAweDFBQTAsIDB4OEU0OCwgMHgxQUE0LCAweDhFNDksIDB4MUFBMSwgMHg4RTRBLCAweDFBOUYsCi0gICAgMHg4RTRCLCAweDNCNDIsIDB4OEU0QywgMHgxQUEyLCAweDhFNTAsIDB4MUFBMywgMHg4RTU1LCAweDFBQUEsCi0gICAgMHg4RTU5LCAweDFBQTUsIDB4OEU1RiwgMHgwQTdDLCAweDhFNjAsIDB4MUFBNywgMHg4RTYzLCAweDFBQTksCi0gICAgMHg4RTY0LCAweDFBQTYsIDB4OEU2QywgMHgzQjQzLCAweDhFNzAsIDB4M0I0NCwgMHg4RTcyLCAweDFBQUMsCi0gICAgMHg4RTc0LCAweDA5M0QsIDB4OEU3NiwgMHgxQUFCLCAweDhFN0EsIDB4M0I0NSwgMHg4RTdDLCAweDFBQUQsCi0gICAgMHg4RTgxLCAweDFBQUUsIDB4OEU4NCwgMHgxQUIxLCAweDhFODUsIDB4MUFCMCwgMHg4RTg3LCAweDFBQUYsCi0gICAgMHg4RThBLCAweDFBQjMsIDB4OEU4QiwgMHgxQUIyLCAweDhFOEQsIDB4MEYwMiwgMHg4RTkxLCAweDFBQjUsCi0gICAgMHg4RTkyLCAweDNCNDYsIDB4OEU5MywgMHgxQUI0LCAweDhFOTQsIDB4MUFCNiwgMHg4RTk5LCAweDFBQjcsCi0gICAgMHg4RUExLCAweDFBQjksIDB4OEVBQSwgMHgxQUI4LCAweDhFQUIsIDB4MEEwRSwgMHg4RUFDLCAweDFBQkEsCi0gICAgMHg4RUFFLCAweDNCNDcsIDB4OEVBRiwgMHgwNkU1LCAweDhFQjAsIDB4MUFCQiwgMHg4RUIxLCAweDFBQkQsCi0gICAgMHg4RUIzLCAweDNCNDgsIDB4OEVCNiwgMHgzNzAzLCAweDhFQkUsIDB4MUFCRSwgMHg4RUMwLCAweDFERUYsCi0gICAgMHg4RUM1LCAweDFBQkYsIDB4OEVDNiwgMHgxQUJDLCAweDhFQzgsIDB4MUFDMCwgMHg4RUNBLCAweDA5MDIsCi0gICAgMHg4RUNCLCAweDFBQzEsIDB4OEVDQywgMHgwNjRBLCAweDhFQ0QsIDB4MDcwOSwgMHg4RUNGLCAweDIxQjcsCi0gICAgMHg4RUQxLCAweDNCNDksIDB4OEVEMiwgMHgwNzYyLCAweDhFRDQsIDB4M0I0QSwgMHg4RURCLCAweDFBQzIsCi0gICAgMHg4RURGLCAweDBDQzgsIDB4OEVFMiwgMHgwQzM4LCAweDhFRTMsIDB4MUFDMywgMHg4RUVCLCAweDFBQzYsCi0gICAgMHg4RUY4LCAweDA4RTAsIDB4OEVGOSwgMHgzQjRCLCAweDhFRkIsIDB4MUFDNSwgMHg4RUZDLCAweDFBQzQsCi0gICAgMHg4RUZELCAweDA3MzAsIDB4OEVGRSwgMHgxQUM3LCAweDhGMDMsIDB4MDVCMSwgMHg4RjA1LCAweDFBQzksCi0gICAgMHg4RjA5LCAweDA4NEMsIDB4OEYwQSwgMHgxQUM4LCAweDhGMEMsIDB4MUFEMSwgMHg4RjEyLCAweDFBQ0IsCi0gICAgMHg4RjEzLCAweDFBQ0QsIDB4OEYxNCwgMHgwRTM1LCAweDhGMTUsIDB4MUFDQSwgMHg4RjE3LCAweDNCNEMsCi0gICAgMHg4RjE5LCAweDFBQ0MsIDB4OEYxQiwgMHgxQUQwLCAweDhGMUMsIDB4MUFDRSwgMHg4RjFELCAweDA2NEIsCi0gICAgMHg4RjFGLCAweDFBQ0YsIDB4OEYyNiwgMHgxQUQyLCAweDhGMjksIDB4MEQxMCwgMHg4RjJBLCAweDBGQTAsCi0gICAgMHg4RjJGLCAweDA5M0UsIDB4OEYzMywgMHgxQUQzLCAweDhGMzYsIDB4M0I0RCwgMHg4RjM4LCAweDBGMEMsCi0gICAgMHg4RjM5LCAweDFBRDUsIDB4OEYzQiwgMHgxQUQ0LCAweDhGM0UsIDB4MUFEOCwgMHg4RjNGLCAweDBGMkIsCi0gICAgMHg4RjQyLCAweDFBRDcsIDB4OEY0NCwgMHgwNUNCLCAweDhGNDUsIDB4MUFENiwgMHg4RjQ2LCAweDFBREIsCi0gICAgMHg4RjQ5LCAweDFBREEsIDB4OEY0QywgMHgxQUQ5LCAweDhGNEQsIDB4MEMyQywgMHg4RjRFLCAweDFBREMsCi0gICAgMHg4RjU3LCAweDFBREQsIDB4OEY1QywgMHgxQURFLCAweDhGNUYsIDB4MDdGRSwgMHg4RjYxLCAweDA2RkIsCi0gICAgMHg4RjYyLCAweDFBREYsIDB4OEY2MywgMHgxQUUwLCAweDhGNjQsIDB4MUFFMSwgMHg4RjlCLCAweDBBMEYsCi0gICAgMHg4RjlDLCAweDFBRTIsIDB4OEY5RSwgMHgwOEQ5LCAweDhGOUYsIDB4MUFFMywgMHg4RkEzLCAweDFBRTQsCi0gICAgMHg4RkE2LCAweDNCNEUsIDB4OEZBNywgMHgxMEI2LCAweDhGQTgsIDB4MTBCNSwgMHg4RkFELCAweDFBRTUsCi0gICAgMHg4RkFFLCAweDE3RkYsIDB4OEZBRiwgMHgxQUU2LCAweDhGQjAsIDB4MEI2MiwgMHg4RkIxLCAweDA5RjEsCi0gICAgMHg4RkIyLCAweDBDRjYsIDB4OEZCNSwgMHgzQjRGLCAweDhGQjYsIDB4M0I1MCwgMHg4RkI3LCAweDFBRTcsCi0gICAgMHg4RkJBLCAweDBFMjUsIDB4OEZCQiwgMHgwQkYwLCAweDhGQkMsIDB4MDgxMCwgMHg4RkJGLCAweDBCNjcsCi0gICAgMHg4RkMyLCAweDA0Q0MsIDB4OEZDNCwgMHgwRUE2LCAweDhGQzUsIDB4MEExRCwgMHg4RkM2LCAweDNCNTEsCi0gICAgMHg4RkM4LCAweDM3OTksIDB4OEZDRSwgMHgwNzM0LCAweDhGRDEsIDB4MDZEOSwgMHg4RkQ0LCAweDBFMjYsCi0gICAgMHg4RkRBLCAweDFBRTgsIDB4OEZFMCwgMHgzQjUyLCAweDhGRTIsIDB4MUFFQSwgMHg4RkU0LCAweDNCNTMsCi0gICAgMHg4RkU1LCAweDFBRTksIDB4OEZFNiwgMHgwNTYwLCAweDhGRTksIDB4MENDRSwgMHg4RkVBLCAweDFBRUIsCi0gICAgMHg4RkVCLCAweDBEMkQsIDB4OEZFRCwgMHgwQzJELCAweDhGRUYsIDB4MUFFQywgMHg4RkYwLCAweDA5NUMsCi0gICAgMHg4RkY0LCAweDFBRUUsIDB4OEZGNiwgMHgzQjU0LCAweDhGRjcsIDB4MEVDRSwgMHg4RkY4LCAweDFBRkQsCi0gICAgMHg4RkY5LCAweDFBRjAsIDB4OEZGQSwgMHgxQUYxLCAweDhGRkQsIDB4MEJFNSwgMHg5MDAwLCAweDBCNDAsCi0gICAgMHg5MDAxLCAweDBBRjksIDB4OTAwMiwgMHgzQjU1LCAweDkwMDMsIDB4MEM4MCwgMHg5MDA1LCAweDFBRUYsCi0gICAgMHg5MDA2LCAweDA2NkYsIDB4OTAwQiwgMHgxQUY4LCAweDkwMEQsIDB4MUFGNSwgMHg5MDBFLCAweDFCMDIsCi0gICAgMHg5MDBGLCAweDBDODEsIDB4OTAxMCwgMHgwQjlFLCAweDkwMTEsIDB4MUFGMiwgMHg5MDEzLCAweDBDMUEsCi0gICAgMHg5MDE0LCAweDBDNEQsIDB4OTAxNSwgMHgxQUYzLCAweDkwMTYsIDB4MUFGNywgMHg5MDE3LCAweDBBMjYsCi0gICAgMHg5MDE5LCAweDBEMUQsIDB4OTAxQSwgMHgwQkU4LCAweDkwMUQsIDB4MEE2NiwgMHg5MDFFLCAweDFBRjYsCi0gICAgMHg5MDFGLCAweDBCMEUsIDB4OTAyMCwgMHgwQjA0LCAweDkwMjEsIDB4MUFGNCwgMHg5MDIyLCAweDA0NkQsCi0gICAgMHg5MDIzLCAweDBGQzgsIDB4OTAyNywgMHgxQUY5LCAweDkwMkMsIDB4M0I1NiwgMHg5MDJFLCAweDBCNDEsCi0gICAgMHg5MDMxLCAweDA5M0YsIDB4OTAzMiwgMHgwQTEwLCAweDkwMzUsIDB4MUFGQiwgMHg5MDM2LCAweDFBRkEsCi0gICAgMHg5MDM4LCAweDA0QjMsIDB4OTAzOSwgMHgxQUZDLCAweDkwM0MsIDB4MERBMSwgMHg5MDNFLCAweDFCMDQsCi0gICAgMHg5MDQxLCAweDBDQjMsIDB4OTA0MiwgMHgwQTMxLCAweDkwNDQsIDB4M0I1NywgMHg5MDQ1LCAweDBCOTcsCi0gICAgMHg5MDQ3LCAweDA2RjAsIDB4OTA0OSwgMHgxQjAzLCAweDkwNEEsIDB4MEYyMSwgMHg5MDRCLCAweDA0RTEsCi0gICAgMHg5MDRELCAweDBFMjcsIDB4OTA0RSwgMHgwNTYxLCAweDkwNEYsIDB4MUFGRSwgMHg5MDUwLCAweDFBRkYsCi0gICAgMHg5MDUxLCAweDFCMDAsIDB4OTA1MiwgMHgxQjAxLCAweDkwNTMsIDB4MEM5MywgMHg5MDU0LCAweDBCNjEsCi0gICAgMHg5MDU1LCAweDA0QTcsIDB4OTA1NiwgMHgxQjA1LCAweDkwNTgsIDB4MUIwNiwgMHg5MDU5LCAweDFEMzQsCi0gICAgMHg5MDVDLCAweDBCMUQsIDB4OTA1RSwgMHgxQjA3LCAweDkwNjAsIDB4MDUxNSwgMHg5MDYxLCAweDBBQ0UsCi0gICAgMHg5MDYzLCAweDA3NjMsIDB4OTA2NSwgMHgwRjQ0LCAweDkwNjcsIDB4MjFCQSwgMHg5MDY4LCAweDFCMDgsCi0gICAgMHg5MDY5LCAweDBDMjYsIDB4OTA2RCwgMHgwQUZBLCAweDkwNkUsIDB4MDkwMywgMHg5MDZGLCAweDFCMDksCi0gICAgMHg5MDcyLCAweDFCMEMsIDB4OTA3NSwgMHgwOTZGLCAweDkwNzYsIDB4MUIwQSwgMHg5MDc3LCAweDBBQUQsCi0gICAgMHg5MDc4LCAweDBBQUMsIDB4OTA3QSwgMHgwNEE4LCAweDkwN0MsIDB4MEY5MywgMHg5MDdELCAweDFCMEUsCi0gICAgMHg5MDdGLCAweDBEODYsIDB4OTA4MCwgMHgxQjEwLCAweDkwODEsIDB4MUIwRiwgMHg5MDgyLCAweDFCMEQsCi0gICAgMHg5MDgzLCAweDE3MzcsIDB4OTA4NCwgMHgwNjEwLCAweDkwODcsIDB4MUFFRCwgMHg5MDg4LCAweDNCNTgsCi0gICAgMHg5MDg5LCAweDFCMTIsIDB4OTA4QSwgMHgxQjExLCAweDkwOEYsIDB4MUIxMywgMHg5MDkxLCAweDBGMjIsCi0gICAgMHg5MDk1LCAweDNCNTksIDB4OTA5OSwgMHgzQjVBLCAweDkwOUIsIDB4M0I1QiwgMHg5MEEyLCAweDNCNUMsCi0gICAgMHg5MEEzLCAweDBDQjksIDB4OTBBNiwgMHgwRTVDLCAweDkwQTgsIDB4MUIxNCwgMHg5MEFBLCAweDA5MDUsCi0gICAgMHg5MEFGLCAweDFCMTUsIDB4OTBCMSwgMHgxQjE2LCAweDkwQjQsIDB4M0I1RCwgMHg5MEI1LCAweDFCMTcsCi0gICAgMHg5MEI4LCAweDBDMUIsIDB4OTBDMSwgMHgwNEFFLCAweDkwQ0EsIDB4MDdFQiwgMHg5MENFLCAweDBGRTAsCi0gICAgMHg5MEQ3LCAweDNCNUUsIDB4OTBEQiwgMHgxQjFCLCAweDkwREQsIDB4M0I1RiwgMHg5MERFLCAweDIxQkIsCi0gICAgMHg5MEUxLCAweDA3MEEsIDB4OTBFMiwgMHgxQjE4LCAweDkwRTQsIDB4MUIxOSwgMHg5MEU4LCAweDBERTYsCi0gICAgMHg5MEVELCAweDA1QjIsIDB4OTBGNCwgMHgzQjYwLCAweDkwRjUsIDB4MEYyMywgMHg5MEY3LCAweDA2QjcsCi0gICAgMHg5MEZELCAweDBDNEUsIDB4OTEwMiwgMHgxQjFDLCAweDkxMTIsIDB4MUIxRCwgMHg5MTE1LCAweDIxQkQsCi0gICAgMHg5MTE3LCAweDNCNjEsIDB4OTExOSwgMHgxQjFFLCAweDkxMUMsIDB4M0I2MiwgMHg5MTI3LCAweDIxQkUsCi0gICAgMHg5MTJELCAweDBDMUMsIDB4OTEzMCwgMHgxQjIwLCAweDkxMzEsIDB4M0I2MywgMHg5MTMyLCAweDFCMUYsCi0gICAgMHg5MTNBLCAweDNCNjQsIDB4OTEzRCwgMHgzQjY1LCAweDkxNDgsIDB4M0I2NiwgMHg5MTQ5LCAweDBDQUIsCi0gICAgMHg5MTRBLCAweDFCMjEsIDB4OTE0QiwgMHgwOTQwLCAweDkxNEMsIDB4MDkwQywgMHg5MTRELCAweDBEMTEsCi0gICAgMHg5MTRFLCAweDBCQUYsIDB4OTE1MiwgMHgwOTFFLCAweDkxNTQsIDB4MEEzMiwgMHg5MTU2LCAweDFCMjIsCi0gICAgMHg5MTU4LCAweDFCMjMsIDB4OTE1QiwgMHgzQjY3LCAweDkxNjEsIDB4M0I2OCwgMHg5MTYyLCAweDBBMjMsCi0gICAgMHg5MTYzLCAweDFCMjQsIDB4OTE2NCwgMHgzQjY5LCAweDkxNjUsIDB4MUIyNSwgMHg5MTY5LCAweDFCMjYsCi0gICAgMHg5MTZBLCAweDBGNTksIDB4OTE2QywgMHgwOTQxLCAweDkxNzIsIDB4MUIyOCwgMHg5MTczLCAweDFCMjcsCi0gICAgMHg5MTc1LCAweDA3RUMsIDB4OTE3NywgMHgwODA1LCAweDkxNzgsIDB4MDg4RSwgMHg5MTgyLCAweDFCMkIsCi0gICAgMHg5MTg3LCAweDA5NzAsIDB4OTE4OSwgMHgxQjJBLCAweDkxOEIsIDB4MUIyOSwgMHg5MThELCAweDBCNDksCi0gICAgMHg5MThFLCAweDNCNkEsIDB4OTE5MCwgMHgwN0EzLCAweDkxOTIsIDB4MEE2NywgMHg5MTk3LCAweDBENDQsCi0gICAgMHg5MTlDLCAweDA5NDMsIDB4OTE5RSwgMHgzQjZCLCAweDkxQTIsIDB4MUIyQywgMHg5MUE0LCAweDA5QzcsCi0gICAgMHg5MUE4LCAweDNCNkMsIDB4OTFBQSwgMHgxQjJGLCAweDkxQUIsIDB4MUIyRCwgMHg5MUFDLCAweDFFMUIsCi0gICAgMHg5MUFELCAweDNCNkQsIDB4OTFBRSwgMHgzQjZFLCAweDkxQUYsIDB4MUIyRSwgMHg5MUIxLCAweDFFNjEsCi0gICAgMHg5MUIyLCAweDNCNkYsIDB4OTFCNCwgMHgxQjMxLCAweDkxQjUsIDB4MUIzMCwgMHg5MUI4LCAweDA5RTIsCi0gICAgMHg5MUJBLCAweDFCMzIsIDB4OTFCQywgMHgzQjcwLCAweDkxQzAsIDB4MUIzMywgMHg5MUMxLCAweDFCMzQsCi0gICAgMHg5MUM2LCAweDBENjQsIDB4OTFDNywgMHgwODQzLCAweDkxQzgsIDB4MDkwRCwgMHg5MUM5LCAweDFCMzUsCi0gICAgMHg5MUNCLCAweDFCMzYsIDB4OTFDQywgMHgwRjZDLCAweDkxQ0QsIDB4MDk0RiwgMHg5MUNFLCAweDBFRkEsCi0gICAgMHg5MUNGLCAweDBGOTQsIDB4OTFEMCwgMHgxQjM3LCAweDkxRDEsIDB4MDZEQSwgMHg5MUQ2LCAweDFCMzgsCi0gICAgMHg5MUQ3LCAweDIxQzAsIDB4OTFEOCwgMHgwQzFELCAweDkxREEsIDB4MjFCRiwgMHg5MURCLCAweDFCM0IsCi0gICAgMHg5MURDLCAweDA1RDYsIDB4OTFERCwgMHgwQTExLCAweDkxREUsIDB4MjFDMSwgMHg5MURGLCAweDFCMzksCi0gICAgMHg5MUUxLCAweDFCM0EsIDB4OTFFMywgMHgwQkZDLCAweDkxRTQsIDB4MjFDNCwgMHg5MUU1LCAweDIxQzUsCi0gICAgMHg5MUU2LCAweDBFODMsIDB4OTFFNywgMHgwNkY0LCAweDkxRUQsIDB4MjFDMiwgMHg5MUVFLCAweDIxQzMsCi0gICAgMHg5MUYwLCAweDNCNzEsIDB4OTFGNSwgMHgxQjNELCAweDkxRjYsIDB4MUIzRSwgMHg5MUY3LCAweDNCNzIsCi0gICAgMHg5MUZCLCAweDNCNzMsIDB4OTFGQywgMHgxQjNDLCAweDkxRkYsIDB4MUI0MCwgMHg5MjA2LCAweDIxQzYsCi0gICAgMHg5MjA3LCAweDNCNzQsIDB4OTIwQSwgMHgyMUM4LCAweDkyMEQsIDB4MENCNywgMHg5MjBFLCAweDA1QTEsCi0gICAgMHg5MjEwLCAweDIxQzcsIDB4OTIxMSwgMHgxQjQ0LCAweDkyMTQsIDB4MUI0MSwgMHg5MjE1LCAweDFCNDMsCi0gICAgMHg5MjFFLCAweDFCM0YsIDB4OTIyOCwgMHgzQjc1LCAweDkyMjksIDB4MUI4QSwgMHg5MjJDLCAweDFCNDIsCi0gICAgMHg5MjMzLCAweDNCNzYsIDB4OTIzNCwgMHgwRkIzLCAweDkyMzcsIDB4MDc4RSwgMHg5MjM4LCAweDNCNzcsCi0gICAgMHg5MjM5LCAweDIxQ0YsIDB4OTIzQSwgMHgyMUM5LCAweDkyM0MsIDB4MjFDQiwgMHg5MjNGLCAweDFCNEMsCi0gICAgMHg5MjQwLCAweDIxQ0EsIDB4OTI0MywgMHgzQjc4LCAweDkyNDQsIDB4MEMyRSwgMHg5MjQ1LCAweDFCNDcsCi0gICAgMHg5MjQ3LCAweDNCNzksIDB4OTI0OCwgMHgxQjRBLCAweDkyNDksIDB4MUI0OCwgMHg5MjRCLCAweDFCNEQsCi0gICAgMHg5MjRFLCAweDIxQ0MsIDB4OTI0RiwgMHgzQjdBLCAweDkyNTAsIDB4MUI0RSwgMHg5MjUxLCAweDIxQ0UsCi0gICAgMHg5MjU3LCAweDFCNDYsIDB4OTI1OSwgMHgyMUNELCAweDkyNUEsIDB4MUI1MywgMHg5MjVCLCAweDA1MTYsCi0gICAgMHg5MjVFLCAweDFCNDUsIDB4OTI2MCwgMHgzQjdCLCAweDkyNjIsIDB4MEQ0MSwgMHg5MjY0LCAweDFCNDksCi0gICAgMHg5MjY2LCAweDA5QzgsIDB4OTI2NywgMHgyMUQwLCAweDkyNzEsIDB4MDdFRCwgMHg5Mjc3LCAweDIxRDIsCi0gICAgMHg5Mjc4LCAweDIxRDMsIDB4OTI3RSwgMHgwRTc2LCAweDkyODAsIDB4MDZEQywgMHg5MjgzLCAweDA5NTAsCi0gICAgMHg5Mjg1LCAweDBDOTQsIDB4OTI4OCwgMHgyMEFBLCAweDkyOTEsIDB4MEFBRiwgMHg5MjkzLCAweDFCNTEsCi0gICAgMHg5Mjk1LCAweDFCNEIsIDB4OTI5NiwgMHgxQjUwLCAweDkyOTgsIDB4MEVDRiwgMHg5MjlBLCAweDBCRDQsCi0gICAgMHg5MjlCLCAweDFCNTIsIDB4OTI5QywgMHgxQjRGLCAweDkyQTcsIDB4MjFEMSwgMHg5MkFELCAweDBBQUUsCi0gICAgMHg5MkIzLCAweDM1NTQsIDB4OTJCNywgMHgxQjU2LCAweDkyQjksIDB4MUI1NSwgMHg5MkMyLCAweDNCN0MsCi0gICAgMHg5MkNCLCAweDNCN0QsIDB4OTJDQywgMHgzQjdFLCAweDkyQ0YsIDB4MUI1NCwgMHg5MkQwLCAweDIxRDcsCi0gICAgMHg5MkQyLCAweDBFNUQsIDB4OTJEMywgMHgyMURCLCAweDkyRDUsIDB4MjFEOSwgMHg5MkQ3LCAweDIxRDUsCi0gICAgMHg5MkQ5LCAweDIxRDYsIDB4OTJERiwgMHgzQjdGLCAweDkyRTAsIDB4MjFEQSwgMHg5MkU0LCAweDA5ODUsCi0gICAgMHg5MkU3LCAweDIxRDQsIDB4OTJFOSwgMHgxQjU3LCAweDkyRUEsIDB4MEUyRiwgMHg5MkVELCAweDA0RjYsCi0gICAgMHg5MkYyLCAweDBEQjgsIDB4OTJGMywgMHgwQkIwLCAweDkyRjgsIDB4MDY5MiwgMHg5MkY5LCAweDIwQjAsCi0gICAgMHg5MkZBLCAweDFCNTksIDB4OTJGQiwgMHgyMURFLCAweDkyRkMsIDB4MDdFRiwgMHg5MkZGLCAweDIxRTEsCi0gICAgMHg5MzAyLCAweDIxRTMsIDB4OTMwNCwgMHgzNDVBLCAweDkzMDYsIDB4MDg3QSwgMHg5MzBELCAweDNCODAsCi0gICAgMHg5MzBGLCAweDFCNTgsIDB4OTMxMCwgMHgwQTMzLCAweDkzMTUsIDB4M0I4MSwgMHg5MzE4LCAweDBBMzQsCi0gICAgMHg5MzE5LCAweDFCNUMsIDB4OTMxQSwgMHgxQjVFLCAweDkzMUQsIDB4MjFFMiwgMHg5MzFFLCAweDIxRTAsCi0gICAgMHg5MzFGLCAweDNCODIsIDB4OTMyMCwgMHgwOUUzLCAweDkzMjEsIDB4MjFERCwgMHg5MzIyLCAweDFCNUQsCi0gICAgMHg5MzIzLCAweDFCNUYsIDB4OTMyNSwgMHgyMURDLCAweDkzMjYsIDB4MDZDQiwgMHg5MzI3LCAweDNCODMsCi0gICAgMHg5MzI4LCAweDBEQjcsIDB4OTMyQiwgMHgwOTBFLCAweDkzMkMsIDB4MEZDOSwgMHg5MzJFLCAweDFCNUIsCi0gICAgMHg5MzJGLCAweDA4NjgsIDB4OTMzMiwgMHgwRkU1LCAweDkzMzUsIDB4MUI2MSwgMHg5MzNBLCAweDFCNjAsCi0gICAgMHg5MzNCLCAweDFCNjIsIDB4OTM0NCwgMHgxQjVBLCAweDkzNDcsIDB4M0I4NCwgMHg5MzQ4LCAweDIwQTksCi0gICAgMHg5MzRBLCAweDM0NTgsIDB4OTM0QiwgMHgwQ0MxLCAweDkzNEQsIDB4MEM0RiwgMHg5MzUyLCAweDNCODUsCi0gICAgMHg5MzU0LCAweDBCRjMsIDB4OTM1NiwgMHgxQjY3LCAweDkzNTcsIDB4MjFFNSwgMHg5MzVCLCAweDBCODEsCi0gICAgMHg5MzVDLCAweDFCNjMsIDB4OTM2MCwgMHgxQjY0LCAweDkzNjUsIDB4M0I4NiwgMHg5MzZBLCAweDNCODcsCi0gICAgMHg5MzZDLCAweDA3MDMsIDB4OTM2RCwgMHgzQjg4LCAweDkzNkUsIDB4MUI2NiwgMHg5MzcwLCAweDIxRTQsCi0gICAgMHg5Mzc1LCAweDA3NjQsIDB4OTM3QywgMHgxQjY1LCAweDkzN0UsIDB4MDlDOSwgMHg5MzhDLCAweDA1RDcsCi0gICAgMHg5Mzk0LCAweDFCNkIsIDB4OTM5NiwgMHgwODJGLCAweDkzOTcsIDB4MEFGQiwgMHg5MzlBLCAweDBCRTYsCi0gICAgMHg5MzlCLCAweDNCODksIDB4OTNBNCwgMHgyMUU2LCAweDkzQTcsIDB4MDU5OSwgMHg5M0E5LCAweDNCOEIsCi0gICAgMHg5M0FDLCAweDFCNjksIDB4OTNBRCwgMHgxQjZBLCAweDkzQUUsIDB4MEJERiwgMHg5M0IwLCAweDFCNjgsCi0gICAgMHg5M0I5LCAweDFCNkMsIDB4OTNCQSwgMHgzQjhBLCAweDkzQzEsIDB4M0I4QywgMHg5M0MzLCAweDFCNzIsCi0gICAgMHg5M0M2LCAweDIxRTcsIDB4OTNDOCwgMHgxQjc1LCAweDkzQ0EsIDB4M0I4RCwgMHg5M0QwLCAweDFCNzQsCi0gICAgMHg5M0QxLCAweDBDMjcsIDB4OTNENiwgMHgxQjZELCAweDkzRDcsIDB4MUI2RSwgMHg5M0Q4LCAweDFCNzEsCi0gICAgMHg5M0RELCAweDFCNzMsIDB4OTNERSwgMHgyMUU4LCAweDkzRTEsIDB4MDZCOCwgMHg5M0UyLCAweDNCOEUsCi0gICAgMHg5M0U0LCAweDFCNzYsIDB4OTNFNSwgMHgxQjcwLCAweDkzRTgsIDB4MUI2RiwgMHg5M0Y4LCAweDIxRTksCi0gICAgMHg5M0ZBLCAweDNCOEYsIDB4OTNGRCwgMHgzQjkwLCAweDk0MDMsIDB4MUI3QSwgMHg5NDA3LCAweDFCN0IsCi0gICAgMHg5NDBGLCAweDNCOTEsIDB4OTQxMCwgMHgxQjdDLCAweDk0MTMsIDB4MUI3OSwgMHg5NDE0LCAweDFCNzgsCi0gICAgMHg5NDE4LCAweDA5Q0EsIDB4OTQxOSwgMHgwQzgyLCAweDk0MUEsIDB4MUI3NywgMHg5NDIxLCAweDFCODAsCi0gICAgMHg5NDJCLCAweDFCN0UsIDB4OTQzMSwgMHgyMUVBLCAweDk0MzQsIDB4M0I5MiwgMHg5NDM1LCAweDFCN0YsCi0gICAgMHg5NDM2LCAweDFCN0QsIDB4OTQzOCwgMHgwQjU4LCAweDk0M0EsIDB4MUI4MSwgMHg5NDNGLCAweDNCOTMsCi0gICAgMHg5NDQxLCAweDFCODIsIDB4OTQ0NCwgMHgxQjg0LCAweDk0NDUsIDB4MjFFQiwgMHg5NDQ4LCAweDIxRUMsCi0gICAgMHg5NDUxLCAweDA2MTEsIDB4OTQ1MiwgMHgxQjgzLCAweDk0NTMsIDB4MEYwNiwgMHg5NDU1LCAweDNCOTQsCi0gICAgMHg5NDVBLCAweDFCOEYsIDB4OTQ1QiwgMHgxQjg1LCAweDk0NUUsIDB4MUI4OCwgMHg5NDYwLCAweDFCODYsCi0gICAgMHg5NDYyLCAweDFCODcsIDB4OTQ2QSwgMHgxQjg5LCAweDk0NkIsIDB4M0I5NSwgMHg5NDcwLCAweDFCOEIsCi0gICAgMHg5NDcyLCAweDNCOTYsIDB4OTQ3NSwgMHgxQjhDLCAweDk0NzcsIDB4MUI4RCwgMHg5NDdDLCAweDFCOTAsCi0gICAgMHg5NDdELCAweDFCOEUsIDB4OTQ3RSwgMHgxQjkxLCAweDk0N0YsIDB4MUI5MywgMHg5NDgxLCAweDFCOTIsCi0gICAgMHg5NTc3LCAweDBCRDUsIDB4OTU3OCwgMHgzQjk3LCAweDk1ODAsIDB4MEVGMywgMHg5NTgyLCAweDFCOTQsCi0gICAgMHg5NTgzLCAweDBBQjAsIDB4OTU4NywgMHgxQjk1LCAweDk1ODksIDB4MEUxNCwgMHg5NThBLCAweDFCOTYsCi0gICAgMHg5NThCLCAweDA1ODksIDB4OTU4RiwgMHgwNERFLCAweDk1OTEsIDB4MDYxMywgMHg5NTkyLCAweDIxRUQsCi0gICAgMHg5NTkzLCAweDA2MTIsIDB4OTU5NCwgMHgxQjk3LCAweDk1OTYsIDB4MUI5OCwgMHg5NTk4LCAweDFCOTksCi0gICAgMHg5NTk5LCAweDFCOUEsIDB4OTVBMCwgMHgxQjlCLCAweDk1QTIsIDB4MDYxNCwgMHg5NUEzLCAweDA1QjMsCi0gICAgMHg5NUE0LCAweDA3RjAsIDB4OTVBNSwgMHgwRDRBLCAweDk1QTYsIDB4M0I5OCwgMHg5NUE3LCAweDFCOUQsCi0gICAgMHg5NUE4LCAweDFCOUMsIDB4OTVBOSwgMHgzQjk5LCAweDk1QUIsIDB4M0I5QSwgMHg5NUFELCAweDFCOUUsCi0gICAgMHg5NUIxLCAweDM1NTUsIDB4OTVCMiwgMHgwNEZFLCAweDk1QjQsIDB4M0I5QiwgMHg5NUI5LCAweDFCQTEsCi0gICAgMHg5NUJCLCAweDFCQTAsIDB4OTVCQywgMHgxQjlGLCAweDk1QkQsIDB4M0I5QywgMHg5NUJFLCAweDFCQTIsCi0gICAgMHg5NUMzLCAweDFCQTUsIDB4OTVDNywgMHgwNDhCLCAweDk1Q0EsIDB4MUJBMywgMHg5NUNDLCAweDFCQTcsCi0gICAgMHg5NUNELCAweDFCQTYsIDB4OTVENCwgMHgxQkE5LCAweDk1RDUsIDB4MUJBOCwgMHg5NUQ2LCAweDFCQUEsCi0gICAgMHg5NUQ4LCAweDBDODYsIDB4OTVEQSwgMHgzQjlELCAweDk1REMsIDB4MUJBQiwgMHg5NUUxLCAweDFCQUMsCi0gICAgMHg5NUUyLCAweDFCQUUsIDB4OTVFNSwgMHgxQkFELCAweDk2MUMsIDB4MERERSwgMHg5NjFELCAweDNCOUUsCi0gICAgMHg5NjIxLCAweDFCQUYsIDB4OTYyOCwgMHgxQkIwLCAweDk2MkEsIDB4MDg1NSwgMHg5NjJFLCAweDFCQjEsCi0gICAgMHg5NjJGLCAweDFCQjIsIDB4OTYzMiwgMHgwRTc3LCAweDk2M0IsIDB4MEFDRCwgMHg5NjNGLCAweDA0NjgsCi0gICAgMHg5NjQwLCAweDBCMkIsIDB4OTY0MSwgMHgzQjlGLCAweDk2NDIsIDB4MUJCMywgMHg5NjQ0LCAweDBEREYsCi0gICAgMHg5NjRCLCAweDFCQjYsIDB4OTY0QywgMHgxQkI0LCAweDk2NEQsIDB4MDdGMSwgMHg5NjRGLCAweDFCQjUsCi0gICAgMHg5NjUwLCAweDA3NzYsIDB4OTY1OCwgMHgzQkEwLCAweDk2NUIsIDB4MEUxNSwgMHg5NjVDLCAweDFCQjgsCi0gICAgMHg5NjVELCAweDFCQkEsIDB4OTY1RSwgMHgxQkI5LCAweDk2NUYsIDB4MUJCQiwgMHg5NjYyLCAweDA0QzMsCi0gICAgMHg5NjYzLCAweDBBMUUsIDB4OTY2NCwgMHgwOTg2LCAweDk2NjUsIDB4MDYxNSwgMHg5NjY2LCAweDFCQkMsCi0gICAgMHg5NjZBLCAweDBEMUMsIDB4OTY2QywgMHgxQkJFLCAweDk2NzAsIDB4MDRDNCwgMHg5NjcyLCAweDFCQkQsCi0gICAgMHg5NjczLCAweDBCRTAsIDB4OTY3NSwgMHgwRjk1LCAweDk2NzYsIDB4MEM4MywgMHg5Njc3LCAweDFCQjcsCi0gICAgMHg5Njc4LCAweDBGNkUsIDB4OTY3QSwgMHgwNzY1LCAweDk2N0QsIDB4MEY0NSwgMHg5Njg0LCAweDNCQTEsCi0gICAgMHg5Njg1LCAweDA2RjEsIDB4OTY4NiwgMHgwRjdDLCAweDk2ODgsIDB4MDZGRSwgMHg5NjhBLCAweDBCNDIsCi0gICAgMHg5NjhCLCAweDE4NkMsIDB4OTY4RCwgMHgxQkJGLCAweDk2OEUsIDB4MDU4QSwgMHg5NjhGLCAweDBBMzUsCi0gICAgMHg5Njk0LCAweDA1QjQsIDB4OTY5NSwgMHgxQkMxLCAweDk2OTcsIDB4MUJDMiwgMHg5Njk4LCAweDFCQzAsCi0gICAgMHg5Njk5LCAweDA3M0EsIDB4OTY5QiwgMHgwODRELCAweDk2OUMsIDB4MDlDQiwgMHg5NjlELCAweDIxRjAsCi0gICAgMHg5NkEwLCAweDA0QzUsIDB4OTZBMywgMHgwRkExLCAweDk2QTQsIDB4M0JBMiwgMHg5NkE3LCAweDFCQzQsCi0gICAgMHg5NkE4LCAweDFCMEIsIDB4OTZBOSwgMHgzQkEzLCAweDk2QUEsIDB4MUJDMywgMHg5NkFGLCAweDIxRjEsCi0gICAgMHg5NkIwLCAweDFCQzcsIDB4OTZCMSwgMHgxQkM1LCAweDk2QjIsIDB4MUJDNiwgMHg5NkI0LCAweDFCQzgsCi0gICAgMHg5NkI2LCAweDFCQzksIDB4OTZCNywgMHgwRkI0LCAweDk2QjgsIDB4MUJDQSwgMHg5NkI5LCAweDFCQ0IsCi0gICAgMHg5NkJCLCAweDBBNkQsIDB4OTZCQywgMHgwRDRGLCAweDk2QzAsIDB4MEE0MywgMHg5NkMxLCAweDA2MjMsCi0gICAgMHg5NkM0LCAweDBGMjQsIDB4OTZDNSwgMHgwNTZELCAweDk2QzYsIDB4MDk0MiwgMHg5NkM3LCAweDA3OEYsCi0gICAgMHg5NkM5LCAweDFCQ0UsIDB4OTZDQiwgMHgxQkNELCAweDk2Q0MsIDB4MDhDMSwgMHg5NkNELCAweDFCQ0YsCi0gICAgMHg5NkNFLCAweDFCQ0MsIDB4OTZEMSwgMHgwODc2LCAweDk2RDIsIDB4M0JBNCwgMHg5NkQ1LCAweDFCRDMsCi0gICAgMHg5NkQ2LCAweDE5OTIsIDB4OTZEOSwgMHgxMEVCLCAweDk2REIsIDB4MEEzRCwgMHg5NkRDLCAweDFCRDEsCi0gICAgMHg5NkRFLCAweDNCQTYsIDB4OTZFMiwgMHgwRjZELCAweDk2RTMsIDB4MENDOSwgMHg5NkU4LCAweDA0Q0QsCi0gICAgMHg5NkU5LCAweDNCQTcsIDB4OTZFQSwgMHgwQTg3LCAweDk2RUIsIDB4MDhFMiwgMHg5NkYwLCAweDBFMDcsCi0gICAgMHg5NkYxLCAweDNCQTgsIDB4OTZGMiwgMHgwNEUyLCAweDk2RjYsIDB4MEZCNSwgMHg5NkY3LCAweDBGNTUsCi0gICAgMHg5NkY5LCAweDFCRDQsIDB4OTZGQiwgMHgwQzNGLCAweDk3MDAsIDB4MDkyNywgMHg5NzAyLCAweDNCQTksCi0gICAgMHg5NzA0LCAweDFCRDUsIDB4OTcwNiwgMHgxQkQ2LCAweDk3MDcsIDB4MEExMiwgMHg5NzA4LCAweDFCRDcsCi0gICAgMHg5NzA5LCAweDNCQUEsIDB4OTcwQSwgMHgwRkI2LCAweDk3MEQsIDB4MUJEMiwgMHg5NzBFLCAweDFCRDksCi0gICAgMHg5NzBGLCAweDFCREIsIDB4OTcxMSwgMHgxQkRBLCAweDk3MTMsIDB4MUJEOCwgMHg5NzE2LCAweDFCREMsCi0gICAgMHg5NzE5LCAweDFCREQsIDB4OTcxQywgMHgwQUZDLCAweDk3MUUsIDB4MDU2MiwgMHg5NzI0LCAweDFCREUsCi0gICAgMHg5NzI3LCAweDBFQzQsIDB4OTcyQSwgMHgxQkRGLCAweDk3MzAsIDB4MUJFMCwgMHg5NzMyLCAweDBGRDAsCi0gICAgMHg5NzMzLCAweDIxRjIsIDB4OTczOCwgMHgxNDE0LCAweDk3MzksIDB4MUJFMSwgMHg5NzNCLCAweDIxRjMsCi0gICAgMHg5NzNELCAweDFCRTIsIDB4OTczRSwgMHgxQkUzLCAweDk3NDIsIDB4MUJFNywgMHg5NzQzLCAweDIxRjQsCi0gICAgMHg5NzQ0LCAweDFCRTQsIDB4OTc0NiwgMHgxQkU1LCAweDk3NDgsIDB4MUJFNiwgMHg5NzQ5LCAweDFCRTgsCi0gICAgMHg5NzRELCAweDIxRjUsIDB4OTc0RiwgMHgyMUY2LCAweDk3NTEsIDB4MjFGNywgMHg5NzUyLCAweDBBNjgsCi0gICAgMHg5NzU1LCAweDIxRjgsIDB4OTc1NiwgMHgwRjAzLCAweDk3NTksIDB4MEE2OSwgMHg5NzVBLCAweDNCQUIsCi0gICAgMHg5NzVDLCAweDFCRTksIDB4OTc1RSwgMHgwRDg3LCAweDk3NjAsIDB4MUJFQSwgMHg5NzYxLCAweDFEMDYsCi0gICAgMHg5NzYyLCAweDBFRDgsIDB4OTc2MywgMHgzQkFDLCAweDk3NjQsIDB4MUJFQiwgMHg5NzY2LCAweDFCRUMsCi0gICAgMHg5NzY4LCAweDFCRUQsIDB4OTc2OSwgMHgwNUI1LCAweDk3NkIsIDB4MUJFRiwgMHg5NzZELCAweDBBMUYsCi0gICAgMHg5NzZFLCAweDNCQUQsIDB4OTc3MSwgMHgxQkYwLCAweDk3NzMsIDB4M0JBRSwgMHg5Nzc0LCAweDA2RkEsCi0gICAgMHg5Nzc5LCAweDFCRjEsIDB4OTc3QSwgMHgxQkY1LCAweDk3N0MsIDB4MUJGMywgMHg5NzgxLCAweDFCRjQsCi0gICAgMHg5Nzg0LCAweDA1RDEsIDB4OTc4NSwgMHgxQkYyLCAweDk3ODYsIDB4MUJGNiwgMHg5NzhCLCAweDFCRjcsCi0gICAgMHg5NzhELCAweDA0OEMsIDB4OTc4RiwgMHgxQkY4LCAweDk3OTAsIDB4MUJGOSwgMHg5Nzk4LCAweDA5Q0MsCi0gICAgMHg5NzlBLCAweDNCQUYsIDB4OTc5QywgMHgxQkZBLCAweDk3QTAsIDB4MDY2MSwgMHg5N0EyLCAweDNCQjAsCi0gICAgMHg5N0EzLCAweDFCRkQsIDB4OTdBNiwgMHgxQkZDLCAweDk3QTgsIDB4MUJGQiwgMHg5N0FCLCAweDFBMzQsCi0gICAgMHg5N0FELCAweDBFMkMsIDB4OTdCMywgMHgxQkZFLCAweDk3QjQsIDB4MUJGRiwgMHg5N0I1LCAweDNCQjEsCi0gICAgMHg5N0I2LCAweDNCQjIsIDB4OTdDMywgMHgxQzAwLCAweDk3QzYsIDB4MUMwMSwgMHg5N0M4LCAweDFDMDIsCi0gICAgMHg5N0NCLCAweDFDMDMsIDB4OTdEMywgMHgwNjE2LCAweDk3RDksIDB4M0JCMywgMHg5N0RDLCAweDFDMDQsCi0gICAgMHg5N0RFLCAweDNCQjQsIDB4OTdFRCwgMHgxQzA1LCAweDk3RUUsIDB4MENEOSwgMHg5N0YyLCAweDFDMDcsCi0gICAgMHg5N0YzLCAweDA1M0IsIDB4OTdGNCwgMHgzQkI1LCAweDk3RjUsIDB4MUMwQSwgMHg5N0Y2LCAweDFDMDksCi0gICAgMHg5N0ZCLCAweDA0QzYsIDB4OTdGRiwgMHgwNkI5LCAweDk4MDEsIDB4MEUxNywgMHg5ODAyLCAweDBCRDYsCi0gICAgMHg5ODAzLCAweDA4MTIsIDB4OTgwNSwgMHgwN0YyLCAweDk4MDYsIDB4MDk3MSwgMHg5ODA4LCAweDBBMjIsCi0gICAgMHg5ODBBLCAweDNCQjYsIDB4OTgwQywgMHgxQzBDLCAweDk4MEUsIDB4M0JCNywgMHg5ODBGLCAweDFDMEIsCi0gICAgMHg5ODEwLCAweDBGMkMsIDB4OTgxMSwgMHgwNjI0LCAweDk4MTIsIDB4MEQ2NiwgMHg5ODEzLCAweDBDQjQsCi0gICAgMHg5ODE3LCAweDBBNDIsIDB4OTgxOCwgMHgwRjk2LCAweDk4MUEsIDB4MDczMSwgMHg5ODFFLCAweDNCQjgsCi0gICAgMHg5ODIxLCAweDFDMEYsIDB4OTgyMywgMHgzQkI5LCAweDk4MjQsIDB4MUMwRSwgMHg5ODJCLCAweDNCQkEsCi0gICAgMHg5ODJDLCAweDBFNzksIDB4OTgyRCwgMHgwQzg0LCAweDk4MzAsIDB4MUU3MywgMHg5ODM0LCAweDA0RjIsCi0gICAgMHg5ODM3LCAweDFDMTAsIDB4OTgzOCwgMHgxQzBELCAweDk4MzksIDB4MzdCMywgMHg5ODNCLCAweDBEQzMsCi0gICAgMHg5ODNDLCAweDBGNTQsIDB4OTgzRCwgMHgxQzExLCAweDk4M0UsIDB4M0JCQiwgMHg5ODQ2LCAweDFDMTIsCi0gICAgMHg5ODRCLCAweDFDMTQsIDB4OTg0QywgMHgwQjRBLCAweDk4NEQsIDB4MDVCOSwgMHg5ODRFLCAweDA1QkEsCi0gICAgMHg5ODRGLCAweDFDMTMsIDB4OTg1MiwgMHgzQkJDLCAweDk4NTMsIDB4M0JCRCwgMHg5ODU0LCAweDA2MjUsCi0gICAgMHg5ODU1LCAweDA3NjYsIDB4OTg1NywgMHgyMUY5LCAweDk4NTgsIDB4MDYyNiwgMHg5ODU5LCAweDNCQkUsCi0gICAgMHg5ODVBLCAweDFFNDgsIDB4OTg1QiwgMHgwQzM5LCAweDk4NUUsIDB4MEZBOCwgMHg5ODY1LCAweDIxRkEsCi0gICAgMHg5ODY3LCAweDA3OTAsIDB4OTg2QiwgMHgxQzE1LCAweDk4NkMsIDB4M0JCRiwgMHg5ODZGLCAweDFDMTYsCi0gICAgMHg5ODcwLCAweDFDMTcsIDB4OTg3MSwgMHgxQzE4LCAweDk4NzMsIDB4MUMxQSwgMHg5ODc0LCAweDFDMTksCi0gICAgMHg5OEE4LCAweDBERTksIDB4OThBQSwgMHgxQzFCLCAweDk4QUYsIDB4MUMxQywgMHg5OEIxLCAweDFDMUQsCi0gICAgMHg5OEI2LCAweDFDMUUsIDB4OThCOCwgMHgzQkMwLCAweDk4QkEsIDB4M0JDMSwgMHg5OEJGLCAweDNCQzIsCi0gICAgMHg5OEMzLCAweDFDMjAsIDB4OThDNCwgMHgxQzFGLCAweDk4QzYsIDB4MUMyMSwgMHg5OEM4LCAweDNCQzMsCi0gICAgMHg5OERCLCAweDBEODgsIDB4OThEQywgMHgxODM5LCAweDk4REYsIDB4MDlFRiwgMHg5OEUwLCAweDM2MTgsCi0gICAgMHg5OEUyLCAweDA2NEMsIDB4OThFNSwgMHgzQkM0LCAweDk4RTksIDB4MUMyMiwgMHg5OEVCLCAweDFDMjMsCi0gICAgMHg5OEVELCAweDEwQzEsIDB4OThFRSwgMHgxNERBLCAweDk4RUYsIDB4MEQ2NywgMHg5OEYyLCAweDA0QkYsCi0gICAgMHg5OEY0LCAweDA0N0YsIDB4OThGQywgMHgwOEMyLCAweDk4RkQsIDB4MEU1RSwgMHg5OEZFLCAweDA5RTYsCi0gICAgMHg5OTAzLCAweDFDMjQsIDB4OTkwNSwgMHgwRUVCLCAweDk5MDksIDB4MUMyNSwgMHg5OTBBLCAweDBGNDYsCi0gICAgMHg5OTBDLCAweDA0RTQsIDB4OTkxMCwgMHgwODhGLCAweDk5MTIsIDB4MUMyNiwgMHg5OTEzLCAweDA1NkUsCi0gICAgMHg5OTE0LCAweDFDMjcsIDB4OTkxOCwgMHgxQzI4LCAweDk5MUQsIDB4MUMyQSwgMHg5OTFFLCAweDFDMkIsCi0gICAgMHg5OTIwLCAweDFDMkQsIDB4OTkyMSwgMHgxQzI5LCAweDk5MjQsIDB4MUMyQywgMHg5OTI3LCAweDIxRkQsCi0gICAgMHg5OTI4LCAweDA2MTcsIDB4OTkyQywgMHgxQzJFLCAweDk5MkUsIDB4MUMyRiwgMHg5OTMyLCAweDNCQzUsCi0gICAgMHg5OTMzLCAweDNCQzYsIDB4OTkzRCwgMHgxQzMwLCAweDk5M0UsIDB4MUMzMSwgMHg5OTQwLCAweDNCQzcsCi0gICAgMHg5OTQyLCAweDFDMzIsIDB4OTk0NSwgMHgxQzM0LCAweDk5NDksIDB4MUMzMywgMHg5OTRCLCAweDFDMzYsCi0gICAgMHg5OTRDLCAweDFDMzksIDB4OTk0RCwgMHgzQkM4LCAweDk5NTAsIDB4MUMzNSwgMHg5OTUxLCAweDFDMzcsCi0gICAgMHg5OTUyLCAweDFDMzgsIDB4OTk1NSwgMHgxQzNBLCAweDk5NTcsIDB4MDZCQSwgMHg5OTVDLCAweDNCQzksCi0gICAgMHg5OTVGLCAweDNCQ0EsIDB4OTk5NiwgMHgwOTFGLCAweDk5OTcsIDB4MUMzQiwgMHg5OTk4LCAweDFDM0MsCi0gICAgMHg5OTk5LCAweDA3RjMsIDB4OTk5RSwgMHgyMUZGLCAweDk5QTUsIDB4MUMzRCwgMHg5OUE4LCAweDA1OUMsCi0gICAgMHg5OUFDLCAweDBEMDUsIDB4OTlBRCwgMHgxQzNFLCAweDk5QUUsIDB4MUMzRiwgMHg5OUIxLCAweDNCQ0IsCi0gICAgMHg5OUIzLCAweDBCOTgsIDB4OTlCNCwgMHgwQ0MzLCAweDk5QjksIDB4M0JDQywgMHg5OUJBLCAweDNCQ0QsCi0gICAgMHg5OUJDLCAweDFDNDAsIDB4OTlDMSwgMHgwRDMzLCAweDk5QzQsIDB4MEIyQywgMHg5OUM1LCAweDA0RkEsCi0gICAgMHg5OUM2LCAweDA2RTYsIDB4OTlDOCwgMHgwNkU3LCAweDk5QzksIDB4M0JDRSwgMHg5OUQwLCAweDBCQjEsCi0gICAgMHg5OUQxLCAweDFDNDUsIDB4OTlEMiwgMHgwNkU4LCAweDk5RDUsIDB4MDU2RiwgMHg5OUQ4LCAweDFDNDQsCi0gICAgMHg5OURCLCAweDFDNDIsIDB4OTlERCwgMHgxQzQzLCAweDk5REYsIDB4MUM0MSwgMHg5OUUyLCAweDFDNEYsCi0gICAgMHg5OUVELCAweDFDNDYsIDB4OTlFRSwgMHgxQzQ3LCAweDk5RjEsIDB4MUM0OCwgMHg5OUYyLCAweDFDNDksCi0gICAgMHg5OUY4LCAweDFDNEIsIDB4OTlGQiwgMHgxQzRBLCAweDk5RkYsIDB4MDk2MywgMHg5QTAxLCAweDFDNEMsCi0gICAgMHg5QTAyLCAweDNCQ0YsIDB4OUEwNSwgMHgxQzRFLCAweDlBMDgsIDB4MzdCQSwgMHg5QTBFLCAweDA2NEQsCi0gICAgMHg5QTBGLCAweDFDNEQsIDB4OUExMiwgMHgwQUZELCAweDlBMTMsIDB4MDc2NywgMHg5QTE2LCAweDNCRDAsCi0gICAgMHg5QTE5LCAweDFDNTAsIDB4OUEyNCwgMHgzQkQxLCAweDlBMjcsIDB4M0JEMiwgMHg5QTI4LCAweDBCMkQsCi0gICAgMHg5QTJCLCAweDFDNTEsIDB4OUEyRCwgMHgzQkQzLCAweDlBMkUsIDB4M0JENCwgMHg5QTMwLCAweDBDODUsCi0gICAgMHg5QTM2LCAweDNCRDUsIDB4OUEzNywgMHgxQzUyLCAweDlBMzgsIDB4M0JENiwgMHg5QTNFLCAweDFDNTcsCi0gICAgMHg5QTQwLCAweDFDNTUsIDB4OUE0MiwgMHgxQzU0LCAweDlBNDMsIDB4MUM1NiwgMHg5QTQ1LCAweDFDNTMsCi0gICAgMHg5QTRBLCAweDNCRDcsIDB4OUE0RCwgMHgxQzU5LCAweDlBNEUsIDB4MjIwMCwgMHg5QTUyLCAweDFFMkYsCi0gICAgMHg5QTU1LCAweDFDNTgsIDB4OUE1NiwgMHgzQkQ4LCAweDlBNTcsIDB4MUM1QiwgMHg5QTVBLCAweDA2QkIsCi0gICAgMHg5QTVCLCAweDFDNUEsIDB4OUE1RiwgMHgxQzVDLCAweDlBNjIsIDB4MUM1RCwgMHg5QTY0LCAweDFDNUYsCi0gICAgMHg5QTY1LCAweDFDNUUsIDB4OUE2OSwgMHgxQzYwLCAweDlBNkEsIDB4MUM2MiwgMHg5QTZCLCAweDFDNjEsCi0gICAgMHg5QUE4LCAweDA4MEUsIDB4OUFBRCwgMHgxQzYzLCAweDlBQjAsIDB4MUM2NCwgMHg5QUI1LCAweDNCRDksCi0gICAgMHg5QUI2LCAweDNCREEsIDB4OUFCOCwgMHgwNTlBLCAweDlBQkMsIDB4MUM2NSwgMHg5QUMwLCAweDFDNjYsCi0gICAgMHg5QUM0LCAweDBBMzcsIDB4OUFDRiwgMHgxQzY3LCAweDlBRDEsIDB4MUM2OCwgMHg5QUQzLCAweDFDNjksCi0gICAgMHg5QUQ0LCAweDFDNkEsIDB4OUFEOCwgMHgwN0Y0LCAweDlBRDksIDB4MjIwMSwgMHg5QURDLCAweDIyMDIsCi0gICAgMHg5QURFLCAweDFDNkIsIDB4OUFERiwgMHgxQzZDLCAweDlBRTIsIDB4MUM2RCwgMHg5QUUzLCAweDFDNkUsCi0gICAgMHg5QUU2LCAweDFDNkYsIDB4OUFFQSwgMHgwRDQ1LCAweDlBRUIsIDB4MUM3MSwgMHg5QUVELCAweDBEOTgsCi0gICAgMHg5QUVFLCAweDFDNzIsIDB4OUFFRiwgMHgxQzcwLCAweDlBRjEsIDB4MUM3NCwgMHg5QUY0LCAweDFDNzMsCi0gICAgMHg5QUY3LCAweDFDNzUsIDB4OUFGOSwgMHgzQkRCLCAweDlBRkIsIDB4MUM3NiwgMHg5QjAzLCAweDNCREMsCi0gICAgMHg5QjA2LCAweDFDNzcsIDB4OUIxOCwgMHgxQzc4LCAweDlCMUEsIDB4MUM3OSwgMHg5QjFGLCAweDFDN0EsCi0gICAgMHg5QjIwLCAweDNCREQsIDB4OUIyMiwgMHgxQzdCLCAweDlCMjMsIDB4MUM3QywgMHg5QjI1LCAweDFDN0QsCi0gICAgMHg5QjI3LCAweDFDN0UsIDB4OUIyOCwgMHgxQzdGLCAweDlCMjksIDB4MUM4MCwgMHg5QjJBLCAweDFDODEsCi0gICAgMHg5QjJELCAweDM0M0MsIDB4OUIyRSwgMHgxQzgyLCAweDlCMkYsIDB4MUM4MywgMHg5QjMxLCAweDE0RDQsCi0gICAgMHg5QjMyLCAweDFDODQsIDB4OUIzMywgMHgzQkRFLCAweDlCMzQsIDB4M0JERiwgMHg5QjNCLCAweDE3QTksCi0gICAgMHg5QjNDLCAweDA2NEUsIDB4OUI0MSwgMHgwNTdGLCAweDlCNDIsIDB4MDgyMiwgMHg5QjQzLCAweDFDODYsCi0gICAgMHg5QjQ0LCAweDFDODUsIDB4OUI0NSwgMHgwRUIxLCAweDlCNEQsIDB4MUM4OCwgMHg5QjRFLCAweDFDODksCi0gICAgMHg5QjRGLCAweDFDODcsIDB4OUI1MSwgMHgxQzhBLCAweDlCNTQsIDB4MEU5MCwgMHg5QjU4LCAweDFDOEIsCi0gICAgMHg5QjVBLCAweDA2OTUsIDB4OUI2RiwgMHgwRkNCLCAweDlCNzIsIDB4MjIwNCwgMHg5QjczLCAweDNCRTAsCi0gICAgMHg5Qjc0LCAweDFDOEMsIDB4OUI3NSwgMHgyMjAzLCAweDlCNzksIDB4M0JFMSwgMHg5QjgzLCAweDFDOEUsCi0gICAgMHg5QjhFLCAweDA0ODIsIDB4OUI4RiwgMHgyMjA1LCAweDlCOTEsIDB4MUM4RiwgMHg5QjkyLCAweDBERkIsCi0gICAgMHg5QjkzLCAweDFDOEQsIDB4OUI5NiwgMHgxQzkwLCAweDlCOTcsIDB4MUM5MSwgMHg5QjlGLCAweDFDOTIsCi0gICAgMHg5QkEwLCAweDFDOTMsIDB4OUJBNywgMHgzQkUyLCAweDlCQTgsIDB4MUM5NCwgMHg5QkFBLCAweDBFOUMsCi0gICAgMHg5QkFCLCAweDA4N0IsIDB4OUJBRCwgMHgwODZBLCAweDlCQUUsIDB4MEFCMSwgMHg5QkIxLCAweDIyMDYsCi0gICAgMHg5QkI0LCAweDFDOTUsIDB4OUJCOSwgMHgxQzk4LCAweDlCQkIsIDB4MjIwNywgMHg5QkMwLCAweDFDOTYsCi0gICAgMHg5QkMxLCAweDNCRTMsIDB4OUJDNiwgMHgxQzk5LCAweDlCQzcsIDB4M0JFNCwgMHg5QkM5LCAweDA3QTUsCi0gICAgMHg5QkNBLCAweDFDOTcsIDB4OUJDRiwgMHgxQzlBLCAweDlCRDEsIDB4MUM5QiwgMHg5QkQyLCAweDFDOUMsCi0gICAgMHg5QkQ0LCAweDFDQTAsIDB4OUJENiwgMHgwODc4LCAweDlCRDcsIDB4M0JFNSwgMHg5QkRCLCAweDBCNDQsCi0gICAgMHg5QkRGLCAweDM3QkYsIDB4OUJFMSwgMHgxQ0ExLCAweDlCRTIsIDB4MUM5RSwgMHg5QkUzLCAweDFDOUQsCi0gICAgMHg5QkU0LCAweDFDOUYsIDB4OUJFNywgMHgzQkU2LCAweDlCRTgsIDB4MDczNSwgMHg5QkVCLCAweDNCRTcsCi0gICAgMHg5QkYwLCAweDFDQTUsIDB4OUJGMSwgMHgxQ0E0LCAweDlCRjIsIDB4MUNBMywgMHg5QkY1LCAweDA0NzcsCi0gICAgMHg5QkY3LCAweDNCRTgsIDB4OUJGQSwgMHgzQkU5LCAweDlCRkQsIDB4M0JFQSwgMHg5QzAwLCAweDIyMDgsCi0gICAgMHg5QzA0LCAweDFDQUYsIDB4OUMwNiwgMHgxQ0FCLCAweDlDMDgsIDB4MUNBQywgMHg5QzA5LCAweDFDQTgsCi0gICAgMHg5QzBBLCAweDFDQUUsIDB4OUMwQiwgMHgzQkVCLCAweDlDMEMsIDB4MUNBQSwgMHg5QzBELCAweDA1QzAsCi0gICAgMHg5QzEwLCAweDBGRjIsIDB4OUMxMiwgMHgxQ0FELCAweDlDMTMsIDB4MUNBOSwgMHg5QzE0LCAweDFDQTcsCi0gICAgMHg5QzE1LCAweDFDQTYsIDB4OUMxQiwgMHgxQ0IxLCAweDlDMjEsIDB4MUNCNCwgMHg5QzI0LCAweDFDQjMsCi0gICAgMHg5QzI1LCAweDFDQjIsIDB4OUMyNywgMHgzQkVDLCAweDlDMkEsIDB4M0JFRCwgMHg5QzJELCAweDBEQkIsCi0gICAgMHg5QzJFLCAweDFDQjAsIDB4OUMyRiwgMHgwNEI3LCAweDlDMzAsIDB4MUNCNSwgMHg5QzMyLCAweDFDQjcsCi0gICAgMHg5QzM2LCAweDNCRUUsIDB4OUMzOSwgMHgwNUNELCAweDlDM0EsIDB4MUNBMiwgMHg5QzNCLCAweDA0RDksCi0gICAgMHg5QzNFLCAweDFDQjksIDB4OUM0MSwgMHgzQkVGLCAweDlDNDYsIDB4MUNCOCwgMHg5QzQ3LCAweDFDQjYsCi0gICAgMHg5QzQ4LCAweDBCNkIsIDB4OUM1MiwgMHgwRTlFLCAweDlDNTMsIDB4M0JGMCwgMHg5QzU3LCAweDBGQTIsCi0gICAgMHg5QzVBLCAweDFDQkEsIDB4OUM2MCwgMHgxQ0JCLCAweDlDNjMsIDB4M0JGMSwgMHg5QzY3LCAweDFDQkMsCi0gICAgMHg5QzZBLCAweDNCRjIsIDB4OUM3NiwgMHgxQ0JELCAweDlDNzcsIDB4M0JGMywgMHg5Qzc4LCAweDFDQkUsCi0gICAgMHg5Q0U1LCAweDBCRDcsIDB4OUNFNywgMHgxQ0JGLCAweDlDRTksIDB4MEQ0QiwgMHg5Q0VCLCAweDFDQzQsCi0gICAgMHg5Q0VDLCAweDFDQzAsIDB4OUNGMCwgMHgxQ0MxLCAweDlDRjMsIDB4MEU1RiwgMHg5Q0Y0LCAweDBFRDAsCi0gICAgMHg5Q0Y2LCAweDBDQTgsIDB4OUQwMiwgMHgzQkY0LCAweDlEMDMsIDB4MUNDNSwgMHg5RDA2LCAweDFDQzYsCi0gICAgMHg5RDA3LCAweDBDOTYsIDB4OUQwOCwgMHgxQ0MzLCAweDlEMDksIDB4MUNDMiwgMHg5RDBFLCAweDA1MkEsCi0gICAgMHg5RDEyLCAweDFDQ0UsIDB4OUQxNSwgMHgxQ0NELCAweDlEMUIsIDB4MDUxNywgMHg5RDFGLCAweDFDQ0IsCi0gICAgMHg5RDIzLCAweDFDQ0EsIDB4OUQyNiwgMHgxQ0M4LCAweDlEMjgsIDB4MDVEOSwgMHg5RDJBLCAweDFDQzcsCi0gICAgMHg5RDJCLCAweDA4REUsIDB4OUQyQywgMHgwNTI5LCAweDlEM0IsIDB4MDdGNSwgMHg5RDNFLCAweDFDRDEsCi0gICAgMHg5RDNGLCAweDFDRDAsIDB4OUQ0MSwgMHgxQ0NGLCAweDlENDIsIDB4M0JGNSwgMHg5RDQ0LCAweDFDQ0MsCi0gICAgMHg5RDQ2LCAweDFDRDIsIDB4OUQ0NywgMHgzQkY2LCAweDlENDgsIDB4MUNEMywgMHg5RDUwLCAweDFDRDgsCi0gICAgMHg5RDUxLCAweDFDRDcsIDB4OUQ1OSwgMHgxQ0Q5LCAweDlENUMsIDB4MDRDRiwgMHg5RDVELCAweDFDRDQsCi0gICAgMHg5RDVFLCAweDFDRDUsIDB4OUQ2MCwgMHgwODA2LCAweDlENjEsIDB4MEVDNSwgMHg5RDYzLCAweDNCRjcsCi0gICAgMHg5RDY0LCAweDFDRDYsIDB4OUQ2OSwgMHgzQkY4LCAweDlENkIsIDB4MjIwQSwgMHg5RDZDLCAweDBFNjAsCi0gICAgMHg5RDZGLCAweDFDREUsIDB4OUQ3MCwgMHgyMjA5LCAweDlENzIsIDB4MUNEQSwgMHg5RDdBLCAweDFDREYsCi0gICAgMHg5RDdDLCAweDNCRjksIDB4OUQ3RSwgMHgzQkZBLCAweDlEODcsIDB4MUNEQywgMHg5RDg5LCAweDFDREIsCi0gICAgMHg5RDhELCAweDNCRkIsIDB4OUQ4RiwgMHgwNzMyLCAweDlEOUEsIDB4MUNFMCwgMHg5REE0LCAweDFDRTEsCi0gICAgMHg5REE5LCAweDFDRTIsIDB4OURBQiwgMHgxQ0RELCAweDlEQUYsIDB4MUNDOSwgMHg5REIxLCAweDNCRkMsCi0gICAgMHg5REIyLCAweDFDRTMsIDB4OURCNCwgMHgwQkZELCAweDlEQjgsIDB4MUNFNywgMHg5REJBLCAweDFDRTgsCi0gICAgMHg5REJCLCAweDFDRTYsIDB4OURDMSwgMHgxQ0U1LCAweDlEQzIsIDB4MUNFQiwgMHg5REMzLCAweDNCRkQsCi0gICAgMHg5REM0LCAweDFDRTQsIDB4OURDNiwgMHgxQ0U5LCAweDlEQzcsIDB4M0JGRSwgMHg5RENGLCAweDFDRUEsCi0gICAgMHg5REQzLCAweDFDRUQsIDB4OURENiwgMHgzQkZGLCAweDlERDcsIDB4MURERSwgMHg5REQ5LCAweDFDRUMsCi0gICAgMHg5RERGLCAweDNDMDAsIDB4OURFNiwgMHgxQ0VGLCAweDlERUIsIDB4M0MwMSwgMHg5REVELCAweDFDRjAsCi0gICAgMHg5REVGLCAweDFDRjEsIDB4OURGMiwgMHgwRkVGLCAweDlERjQsIDB4M0MwMiwgMHg5REY4LCAweDFDRUUsCi0gICAgMHg5REY5LCAweDBCNEIsIDB4OURGQSwgMHgwODVELCAweDlERkQsIDB4MUNGMiwgMHg5RTE1LCAweDNDMDMsCi0gICAgMHg5RTE5LCAweDIyMEMsIDB4OUUxQSwgMHgxQ0YzLCAweDlFMUIsIDB4MUNGNCwgMHg5RTFELCAweDNDMDQsCi0gICAgMHg5RTFFLCAweDFDRjUsIDB4OUU3NSwgMHgxQ0Y2LCAweDlFNzgsIDB4MDc2OCwgMHg5RTc5LCAweDFDRjcsCi0gICAgMHg5RTdDLCAweDFERkQsIDB4OUU3RCwgMHgxQ0Y4LCAweDlFN0YsIDB4MDhEQiwgMHg5RTgxLCAweDFDRjksCi0gICAgMHg5RTg4LCAweDFDRkEsIDB4OUU4QiwgMHgxQ0ZCLCAweDlFOEMsIDB4MUNGQywgMHg5RTkxLCAweDFDRkYsCi0gICAgMHg5RTkyLCAweDFDRkQsIDB4OUU5MywgMHgwRkUyLCAweDlFOTUsIDB4MUNGRSwgMHg5RTk3LCAweDBGQjcsCi0gICAgMHg5RTlELCAweDFEMDAsIDB4OUU5RiwgMHgwRkEzLCAweDlFQTQsIDB4M0MwNSwgMHg5RUE1LCAweDFEMDEsCi0gICAgMHg5RUE2LCAweDBEMzQsIDB4OUVBOCwgMHgzQzA2LCAweDlFQTksIDB4MUQwMiwgMHg5RUFBLCAweDFEMDQsCi0gICAgMHg5RUFDLCAweDNDMDcsIDB4OUVBRCwgMHgxRDA1LCAweDlFQjQsIDB4MUUwMiwgMHg5RUI1LCAweDFFNzUsCi0gICAgMHg5RUI4LCAweDFEMDMsIDB4OUVCOSwgMHgwN0ZGLCAweDlFQkEsIDB4MEVEOSwgMHg5RUJCLCAweDBFOTEsCi0gICAgMHg5RUJDLCAweDEyODQsIDB4OUVCRSwgMHgxNEZGLCAweDlFQkYsIDB4MEVBOSwgMHg5RUMzLCAweDM0MEIsCi0gICAgMHg5RUM0LCAweDA1MkIsIDB4OUVDQywgMHgxRDA3LCAweDlFQ0QsIDB4MDY2QSwgMHg5RUNFLCAweDFEMDgsCi0gICAgMHg5RUNGLCAweDFEMDksIDB4OUVEMCwgMHgxRDBBLCAweDlFRDEsIDB4MjIwRCwgMHg5RUQyLCAweDA4MDcsCi0gICAgMHg5RUQ0LCAweDFEMEIsIDB4OUVEOCwgMHgxNjBELCAweDlFRDksIDB4MEVFNywgMHg5RURCLCAweDBCNDMsCi0gICAgMHg5RURDLCAweDFEMEMsIDB4OUVERCwgMHgxRDBFLCAweDlFREUsIDB4MUQwRCwgMHg5RUUwLCAweDFEMEYsCi0gICAgMHg5RUU1LCAweDFEMTAsIDB4OUVFNywgMHgzQzA4LCAweDlFRTgsIDB4MUQxMSwgMHg5RUVFLCAweDNDMDksCi0gICAgMHg5RUVGLCAweDFEMTIsIDB4OUVGNCwgMHgxRDEzLCAweDlFRjYsIDB4MUQxNCwgMHg5RUY3LCAweDFEMTUsCi0gICAgMHg5RUY5LCAweDFEMTYsIDB4OUVGQiwgMHgxRDE3LCAweDlFRkMsIDB4MUQxOCwgMHg5RUZELCAweDFEMTksCi0gICAgMHg5RjA3LCAweDFEMUEsIDB4OUYwOCwgMHgxRDFCLCAweDlGMEUsIDB4MEMxRSwgMHg5RjEwLCAweDNDMEEsCi0gICAgMHg5RjEyLCAweDNDMEIsIDB4OUYxMywgMHgwNzkxLCAweDlGMTUsIDB4MUQxRCwgMHg5RjE3LCAweDNDMEMsCi0gICAgMHg5RjE5LCAweDNDMEQsIDB4OUYyMCwgMHgwQUNGLCAweDlGMjEsIDB4MUQxRSwgMHg5RjJDLCAweDFEMUYsCi0gICAgMHg5RjJGLCAweDNDMEUsIDB4OUYzNywgMHgzQzBGLCAweDlGMzksIDB4M0MxMCwgMHg5RjNCLCAweDBEOTMsCi0gICAgMHg5RjNFLCAweDFEMjAsIDB4OUY0MSwgMHgzQzExLCAweDlGNDUsIDB4M0MxMiwgMHg5RjRBLCAweDFEMjEsCi0gICAgMHg5RjRCLCAweDE3MEEsIDB4OUY0RSwgMHgxQTdCLCAweDlGNEYsIDB4MUMwNiwgMHg5RjUyLCAweDFEMjIsCi0gICAgMHg5RjU0LCAweDFEMjMsIDB4OUY1NywgMHgzQzEzLCAweDlGNUYsIDB4MUQyNSwgMHg5RjYwLCAweDFEMjYsCi0gICAgMHg5RjYxLCAweDFEMjcsIDB4OUY2MiwgMHgwRkI4LCAweDlGNjMsIDB4MUQyNCwgMHg5RjY2LCAweDFEMjgsCi0gICAgMHg5RjY3LCAweDFEMjksIDB4OUY2OCwgMHgzQzE0LCAweDlGNkEsIDB4MUQyQiwgMHg5RjZDLCAweDFEMkEsCi0gICAgMHg5RjcxLCAweDNDMTUsIDB4OUY3MiwgMHgxRDJELCAweDlGNzUsIDB4M0MxNiwgMHg5Rjc2LCAweDFEMkUsCi0gICAgMHg5Rjc3LCAweDFEMkMsIDB4OUY4RCwgMHgwRjdFLCAweDlGOTAsIDB4M0MxNywgMHg5Rjk0LCAweDNDMTgsCi0gICAgMHg5Rjk1LCAweDFEMkYsIDB4OUY5QywgMHgxRDMwLCAweDlGOUQsIDB4MTcyNywgMHg5RkEwLCAweDFEMzEsCi0gICAgMHg5RkEyLCAweDNDMTksIDB4RjkyOSwgMHgyMTI5LCAweEY5REMsIDB4MjFFRSwgMHhGQTBFLCAweDIwREEsCi0gICAgMHhGQTBGLCAweDIwRTUsIDB4RkExMCwgMHgyMEU2LCAweEZBMTEsIDB4MjBGQiwgMHhGQTEyLCAweDIxMjEsCi0gICAgMHhGQTEzLCAweDIxMzEsIDB4RkExNCwgMHgyMTMzLCAweEZBMTUsIDB4MjE1RSwgMHhGQTE2LCAweDIxNjQsCi0gICAgMHhGQTE3LCAweDIxN0IsIDB4RkExOCwgMHgyMTgzLCAweEZBMTksIDB4MjE4NCwgMHhGQTFBLCAweDIxODUsCi0gICAgMHhGQTFCLCAweDIxODcsIDB4RkExQywgMHgyMThCLCAweEZBMUQsIDB4MjE4RSwgMHhGQTFFLCAweDIxOTcsCi0gICAgMHhGQTFGLCAweDIxQTIsIDB4RkEyMCwgMHgyMUE0LCAweEZBMjEsIDB4MjFBNSwgMHhGQTIyLCAweDIxQUUsCi0gICAgMHhGQTIzLCAweDIxQjYsIDB4RkEyNCwgMHgyMUI4LCAweEZBMjUsIDB4MjFCOSwgMHhGQTI2LCAweDIxQkMsCi0gICAgMHhGQTI3LCAweDIxRDgsIDB4RkEyOCwgMHgyMURGLCAweEZBMjksIDB4MjFFRiwgMHhGQTJBLCAweDIxRkIsCi0gICAgMHhGQTJCLCAweDIxRkMsIDB4RkEyQywgMHgyMUZFLCAweEZBMkQsIDB4MjIwQiwgMHhGQjAwLCAweDI0OEUsCi0gICAgMHhGQjAxLCAweDAwNzAsIDB4RkIwMiwgMHgwMDcxLCAweEZCMDMsIDB4MjQ4RiwgMHhGQjA0LCAweDI0OTAsCi0gICAgMHhGRTMwLCAweDFFREEsIDB4RkUzMSwgMHgxRUQ0LCAweEZFMzIsIDB4MUVENSwgMHhGRTMzLCAweDFFRDIsCi0gICAgMHhGRTM1LCAweDFFREIsIDB4RkUzNiwgMHgxRURDLCAweEZFMzcsIDB4MUVFMSwgMHhGRTM4LCAweDFFRTIsCi0gICAgMHhGRTM5LCAweDFFREQsIDB4RkUzQSwgMHgxRURFLCAweEZFM0IsIDB4MUVFQiwgMHhGRTNDLCAweDFFRUMsCi0gICAgMHhGRTNELCAweDFFRTUsIDB4RkUzRSwgMHgxRUU2LCAweEZFM0YsIDB4MUVFMywgMHhGRTQwLCAweDFFRTQsCi0gICAgMHhGRTQxLCAweDFFRTcsIDB4RkU0MiwgMHgxRUU4LCAweEZFNDMsIDB4MUVFOSwgMHhGRTQ0LCAweDFFRUEsCi0gICAgMHhGRjAxLCAweDAyODIsIDB4RkYwMiwgMHgxRjQ3LCAweEZGMDMsIDB4MDJDQywgMHhGRjA0LCAweDAyQzgsCi0gICAgMHhGRjA1LCAweDAyQ0IsIDB4RkYwNiwgMHgwMkNELCAweEZGMDcsIDB4MUY0NiwgMHhGRjA4LCAweDAyQTIsCi0gICAgMHhGRjA5LCAweDAyQTMsIDB4RkYwQSwgMHgwMkNFLCAweEZGMEIsIDB4MDJCNCwgMHhGRjBDLCAweDAyN0MsCi0gICAgMHhGRjBELCAweDAyQjUsIDB4RkYwRSwgMHgwMjdELCAweEZGMEYsIDB4MDI5NywgMHhGRjEwLCAweDAzMEMsCi0gICAgMHhGRjExLCAweDAzMEQsIDB4RkYxMiwgMHgwMzBFLCAweEZGMTMsIDB4MDMwRiwgMHhGRjE0LCAweDAzMTAsCi0gICAgMHhGRjE1LCAweDAzMTEsIDB4RkYxNiwgMHgwMzEyLCAweEZGMTcsIDB4MDMxMywgMHhGRjE4LCAweDAzMTQsCi0gICAgMHhGRjE5LCAweDAzMTUsIDB4RkYxQSwgMHgwMjdGLCAweEZGMUIsIDB4MDI4MCwgMHhGRjFDLCAweDAyQkIsCi0gICAgMHhGRjFELCAweDAyQjksIDB4RkYxRSwgMHgwMkJDLCAweEZGMUYsIDB4MDI4MSwgMHhGRjIwLCAweDAyQ0YsCi0gICAgMHhGRjIxLCAweDAzMTYsIDB4RkYyMiwgMHgwMzE3LCAweEZGMjMsIDB4MDMxOCwgMHhGRjI0LCAweDAzMTksCi0gICAgMHhGRjI1LCAweDAzMUEsIDB4RkYyNiwgMHgwMzFCLCAweEZGMjcsIDB4MDMxQywgMHhGRjI4LCAweDAzMUQsCi0gICAgMHhGRjI5LCAweDAzMUUsIDB4RkYyQSwgMHgwMzFGLCAweEZGMkIsIDB4MDMyMCwgMHhGRjJDLCAweDAzMjEsCi0gICAgMHhGRjJELCAweDAzMjIsIDB4RkYyRSwgMHgwMzIzLCAweEZGMkYsIDB4MDMyNCwgMHhGRjMwLCAweDAzMjUsCi0gICAgMHhGRjMxLCAweDAzMjYsIDB4RkYzMiwgMHgwMzI3LCAweEZGMzMsIDB4MDMyOCwgMHhGRjM0LCAweDAzMjksCi0gICAgMHhGRjM1LCAweDAzMkEsIDB4RkYzNiwgMHgwMzJCLCAweEZGMzcsIDB4MDMyQywgMHhGRjM4LCAweDAzMkQsCi0gICAgMHhGRjM5LCAweDAzMkUsIDB4RkYzQSwgMHgwMzJGLCAweEZGM0IsIDB4MDJBNiwgMHhGRjNDLCAweDAyOTgsCi0gICAgMHhGRjNELCAweDAyQTcsIDB4RkYzRSwgMHgwMjg4LCAweEZGM0YsIDB4MDI4QSwgMHhGRjQwLCAweDAyODYsCi0gICAgMHhGRjQxLCAweDAzMzAsIDB4RkY0MiwgMHgwMzMxLCAweEZGNDMsIDB4MDMzMiwgMHhGRjQ0LCAweDAzMzMsCi0gICAgMHhGRjQ1LCAweDAzMzQsIDB4RkY0NiwgMHgwMzM1LCAweEZGNDcsIDB4MDMzNiwgMHhGRjQ4LCAweDAzMzcsCi0gICAgMHhGRjQ5LCAweDAzMzgsIDB4RkY0QSwgMHgwMzM5LCAweEZGNEIsIDB4MDMzQSwgMHhGRjRDLCAweDAzM0IsCi0gICAgMHhGRjRELCAweDAzM0MsIDB4RkY0RSwgMHgwMzNELCAweEZGNEYsIDB4MDMzRSwgMHhGRjUwLCAweDAzM0YsCi0gICAgMHhGRjUxLCAweDAzNDAsIDB4RkY1MiwgMHgwMzQxLCAweEZGNTMsIDB4MDM0MiwgMHhGRjU0LCAweDAzNDMsCi0gICAgMHhGRjU1LCAweDAzNDQsIDB4RkY1NiwgMHgwMzQ1LCAweEZGNTcsIDB4MDM0NiwgMHhGRjU4LCAweDAzNDcsCi0gICAgMHhGRjU5LCAweDAzNDgsIDB4RkY1QSwgMHgwMzQ5LCAweEZGNUIsIDB4MDJBOCwgMHhGRjVDLCAweDAyOUIsCi0gICAgMHhGRjVELCAweDAyQTksIDB4RkY1RSwgMHgwMjk5LCAweEZGNjEsIDB4MDE0NywgMHhGRjYyLCAweDAxNDgsCi0gICAgMHhGRjYzLCAweDAxNDksIDB4RkY2NCwgMHgwMTRBLCAweEZGNjUsIDB4MDE0QiwgMHhGRjY2LCAweDAxNEMsCi0gICAgMHhGRjY3LCAweDAxNEQsIDB4RkY2OCwgMHgwMTRFLCAweEZGNjksIDB4MDE0RiwgMHhGRjZBLCAweDAxNTAsCi0gICAgMHhGRjZCLCAweDAxNTEsIDB4RkY2QywgMHgwMTUyLCAweEZGNkQsIDB4MDE1MywgMHhGRjZFLCAweDAxNTQsCi0gICAgMHhGRjZGLCAweDAxNTUsIDB4RkY3MCwgMHgwMTU2LCAweEZGNzEsIDB4MDE1NywgMHhGRjcyLCAweDAxNTgsCi0gICAgMHhGRjczLCAweDAxNTksIDB4RkY3NCwgMHgwMTVBLCAweEZGNzUsIDB4MDE1QiwgMHhGRjc2LCAweDAxNUMsCi0gICAgMHhGRjc3LCAweDAxNUQsIDB4RkY3OCwgMHgwMTVFLCAweEZGNzksIDB4MDE1RiwgMHhGRjdBLCAweDAxNjAsCi0gICAgMHhGRjdCLCAweDAxNjEsIDB4RkY3QywgMHgwMTYyLCAweEZGN0QsIDB4MDE2MywgMHhGRjdFLCAweDAxNjQsCi0gICAgMHhGRjdGLCAweDAxNjUsIDB4RkY4MCwgMHgwMTY2LCAweEZGODEsIDB4MDE2NywgMHhGRjgyLCAweDAxNjgsCi0gICAgMHhGRjgzLCAweDAxNjksIDB4RkY4NCwgMHgwMTZBLCAweEZGODUsIDB4MDE2QiwgMHhGRjg2LCAweDAxNkMsCi0gICAgMHhGRjg3LCAweDAxNkQsIDB4RkY4OCwgMHgwMTZFLCAweEZGODksIDB4MDE2RiwgMHhGRjhBLCAweDAxNzAsCi0gICAgMHhGRjhCLCAweDAxNzEsIDB4RkY4QywgMHgwMTcyLCAweEZGOEQsIDB4MDE3MywgMHhGRjhFLCAweDAxNzQsCi0gICAgMHhGRjhGLCAweDAxNzUsIDB4RkY5MCwgMHgwMTc2LCAweEZGOTEsIDB4MDE3NywgMHhGRjkyLCAweDAxNzgsCi0gICAgMHhGRjkzLCAweDAxNzksIDB4RkY5NCwgMHgwMTdBLCAweEZGOTUsIDB4MDE3QiwgMHhGRjk2LCAweDAxN0MsCi0gICAgMHhGRjk3LCAweDAxN0QsIDB4RkY5OCwgMHgwMTdFLCAweEZGOTksIDB4MDE3RiwgMHhGRjlBLCAweDAxODAsCi0gICAgMHhGRjlCLCAweDAxODEsIDB4RkY5QywgMHgwMTgyLCAweEZGOUQsIDB4MDE4MywgMHhGRjlFLCAweDAxODQsCi0gICAgMHhGRjlGLCAweDAxODUsIDB4RkZFMCwgMHgwMkM5LCAweEZGRTEsIDB4MDJDQSwgMHhGRkUyLCAweDAyRUYsCi0gICAgMHhGRkUzLCAweDAyODksIDB4RkZFNCwgMHgxRjQ1LCAweEZGRTUsIDB4MDJDNywgMHhGRkU4LCAweDAxNDMsCisjaW5jbHVkZSAiY21hcHNfamFwYW4xLmgiCisKK2NvbnN0IEZYX1dPUkQgZ19GWENNQVBfVW5pSklTX1VDUzJfSF80Wzk3NzIgKiAyXSA9IHsKKyAgICAweDAwMjAsIDB4MDAwMSwgMHgwMDIxLCAweDAwMDIsIDB4MDAyMiwgMHgwMDAzLCAweDAwMjMsIDB4MDAwNCwgMHgwMDI0LAorICAgIDB4MDAwNSwgMHgwMDI1LCAweDAwMDYsIDB4MDAyNiwgMHgwMDA3LCAweDAwMjcsIDB4MDAwOCwgMHgwMDI4LCAweDAwMDksCisgICAgMHgwMDI5LCAweDAwMEEsIDB4MDAyQSwgMHgwMDBCLCAweDAwMkIsIDB4MDAwQywgMHgwMDJDLCAweDAwMEQsIDB4MDAyRCwKKyAgICAweDAwMEUsIDB4MDAyRSwgMHgwMDBGLCAweDAwMkYsIDB4MDAxMCwgMHgwMDMwLCAweDAwMTEsIDB4MDAzMSwgMHgwMDEyLAorICAgIDB4MDAzMiwgMHgwMDEzLCAweDAwMzMsIDB4MDAxNCwgMHgwMDM0LCAweDAwMTUsIDB4MDAzNSwgMHgwMDE2LCAweDAwMzYsCisgICAgMHgwMDE3LCAweDAwMzcsIDB4MDAxOCwgMHgwMDM4LCAweDAwMTksIDB4MDAzOSwgMHgwMDFBLCAweDAwM0EsIDB4MDAxQiwKKyAgICAweDAwM0IsIDB4MDAxQywgMHgwMDNDLCAweDAwMUQsIDB4MDAzRCwgMHgwMDFFLCAweDAwM0UsIDB4MDAxRiwgMHgwMDNGLAorICAgIDB4MDAyMCwgMHgwMDQwLCAweDAwMjEsIDB4MDA0MSwgMHgwMDIyLCAweDAwNDIsIDB4MDAyMywgMHgwMDQzLCAweDAwMjQsCisgICAgMHgwMDQ0LCAweDAwMjUsIDB4MDA0NSwgMHgwMDI2LCAweDAwNDYsIDB4MDAyNywgMHgwMDQ3LCAweDAwMjgsIDB4MDA0OCwKKyAgICAweDAwMjksIDB4MDA0OSwgMHgwMDJBLCAweDAwNEEsIDB4MDAyQiwgMHgwMDRCLCAweDAwMkMsIDB4MDA0QywgMHgwMDJELAorICAgIDB4MDA0RCwgMHgwMDJFLCAweDAwNEUsIDB4MDAyRiwgMHgwMDRGLCAweDAwMzAsIDB4MDA1MCwgMHgwMDMxLCAweDAwNTEsCisgICAgMHgwMDMyLCAweDAwNTIsIDB4MDAzMywgMHgwMDUzLCAweDAwMzQsIDB4MDA1NCwgMHgwMDM1LCAweDAwNTUsIDB4MDAzNiwKKyAgICAweDAwNTYsIDB4MDAzNywgMHgwMDU3LCAweDAwMzgsIDB4MDA1OCwgMHgwMDM5LCAweDAwNTksIDB4MDAzQSwgMHgwMDVBLAorICAgIDB4MDAzQiwgMHgwMDVCLCAweDAwM0MsIDB4MDA1QywgMHgwMDYxLCAweDAwNUQsIDB4MDAzRSwgMHgwMDVFLCAweDAwM0YsCisgICAgMHgwMDVGLCAweDAwNDAsIDB4MDA2MCwgMHgwMDQxLCAweDAwNjEsIDB4MDA0MiwgMHgwMDYyLCAweDAwNDMsIDB4MDA2MywKKyAgICAweDAwNDQsIDB4MDA2NCwgMHgwMDQ1LCAweDAwNjUsIDB4MDA0NiwgMHgwMDY2LCAweDAwNDcsIDB4MDA2NywgMHgwMDQ4LAorICAgIDB4MDA2OCwgMHgwMDQ5LCAweDAwNjksIDB4MDA0QSwgMHgwMDZBLCAweDAwNEIsIDB4MDA2QiwgMHgwMDRDLCAweDAwNkMsCisgICAgMHgwMDRELCAweDAwNkQsIDB4MDA0RSwgMHgwMDZFLCAweDAwNEYsIDB4MDA2RiwgMHgwMDUwLCAweDAwNzAsIDB4MDA1MSwKKyAgICAweDAwNzEsIDB4MDA1MiwgMHgwMDcyLCAweDAwNTMsIDB4MDA3MywgMHgwMDU0LCAweDAwNzQsIDB4MDA1NSwgMHgwMDc1LAorICAgIDB4MDA1NiwgMHgwMDc2LCAweDAwNTcsIDB4MDA3NywgMHgwMDU4LCAweDAwNzgsIDB4MDA1OSwgMHgwMDc5LCAweDAwNUEsCisgICAgMHgwMDdBLCAweDAwNUIsIDB4MDA3QiwgMHgwMDVDLCAweDAwN0MsIDB4MDA1RCwgMHgwMDdELCAweDAwNUUsIDB4MDA3RSwKKyAgICAweDAwNUYsIDB4MDBBMSwgMHgwMDY1LCAweDAwQTIsIDB4MDA2NiwgMHgwMEEzLCAweDAwNjcsIDB4MDBBNCwgMHgwMDZCLAorICAgIDB4MDBBNSwgMHgwMDNELCAweDAwQTYsIDB4MDA2MywgMHgwMEE3LCAweDAyRDAsIDB4MDBBOCwgMHgwMjg3LCAweDAwQTksCisgICAgMHgwMDk4LCAweDAwQUEsIDB4MDA4QywgMHgwMEFCLCAweDAwNkQsIDB4MDBBQywgMHgwMDk5LCAweDAwQUQsIDB4MDA5NywKKyAgICAweDAwQUUsIDB4MDA5QSwgMHgwMEFGLCAweDAwODEsIDB4MDBCMCwgMHgwMkMzLCAweDAwQjEsIDB4MDJCNiwgMHgwMEIyLAorICAgIDB4MDA5RCwgMHgwMEIzLCAweDAwOUUsIDB4MDBCNCwgMHgwMjg1LCAweDAwQjUsIDB4MDA5RiwgMHgwMEI2LCAweDAzMEEsCisgICAgMHgwMEI3LCAweDAwNzUsIDB4MDBCOCwgMHgwMDg2LCAweDAwQjksIDB4MDBBMCwgMHgwMEJBLCAweDAwOTAsIDB4MDBCQiwKKyAgICAweDAwN0IsIDB4MDBCQywgMHgwMEExLCAweDAwQkQsIDB4MDBBMiwgMHgwMEJFLCAweDAwQTMsIDB4MDBCRiwgMHgwMDdFLAorICAgIDB4MDBDMCwgMHgwMEE0LCAweDAwQzEsIDB4MDBBNSwgMHgwMEMyLCAweDAwQTYsIDB4MDBDMywgMHgwMEE3LCAweDAwQzQsCisgICAgMHgwMEE4LCAweDAwQzUsIDB4MDBBOSwgMHgwMEM2LCAweDAwOEIsIDB4MDBDNywgMHgwMEFBLCAweDAwQzgsIDB4MDBBQiwKKyAgICAweDAwQzksIDB4MDBBQywgMHgwMENBLCAweDAwQUQsIDB4MDBDQiwgMHgwMEFFLCAweDAwQ0MsIDB4MDBBRiwgMHgwMENELAorICAgIDB4MDBCMCwgMHgwMENFLCAweDAwQjEsIDB4MDBDRiwgMHgwMEIyLCAweDAwRDAsIDB4MDBCMywgMHgwMEQxLCAweDAwQjQsCisgICAgMHgwMEQyLCAweDAwQjUsIDB4MDBEMywgMHgwMEI2LCAweDAwRDQsIDB4MDBCNywgMHgwMEQ1LCAweDAwQjgsIDB4MDBENiwKKyAgICAweDAwQjksIDB4MDBENywgMHgwMkI3LCAweDAwRDgsIDB4MDA4RSwgMHgwMEQ5LCAweDAwQkIsIDB4MDBEQSwgMHgwMEJDLAorICAgIDB4MDBEQiwgMHgwMEJELCAweDAwREMsIDB4MDBCRSwgMHgwMERELCAweDAwQkYsIDB4MDBERSwgMHgwMEMwLCAweDAwREYsCisgICAgMHgwMDk2LCAweDAwRTAsIDB4MDBDMSwgMHgwMEUxLCAweDAwQzIsIDB4MDBFMiwgMHgwMEMzLCAweDAwRTMsIDB4MDBDNCwKKyAgICAweDAwRTQsIDB4MDBDNSwgMHgwMEU1LCAweDAwQzYsIDB4MDBFNiwgMHgwMDkxLCAweDAwRTcsIDB4MDBDNywgMHgwMEU4LAorICAgIDB4MDBDOCwgMHgwMEU5LCAweDAwQzksIDB4MDBFQSwgMHgwMENBLCAweDAwRUIsIDB4MDBDQiwgMHgwMEVDLCAweDAwQ0MsCisgICAgMHgwMEVELCAweDAwQ0QsIDB4MDBFRSwgMHgwMENFLCAweDAwRUYsIDB4MDBDRiwgMHgwMEYwLCAweDAwRDAsIDB4MDBGMSwKKyAgICAweDAwRDEsIDB4MDBGMiwgMHgwMEQyLCAweDAwRjMsIDB4MDBEMywgMHgwMEY0LCAweDAwRDQsIDB4MDBGNSwgMHgwMEQ1LAorICAgIDB4MDBGNiwgMHgwMEQ2LCAweDAwRjcsIDB4MDJCOCwgMHgwMEY4LCAweDAwOTQsIDB4MDBGOSwgMHgwMEQ4LCAweDAwRkEsCisgICAgMHgwMEQ5LCAweDAwRkIsIDB4MDBEQSwgMHgwMEZDLCAweDAwREIsIDB4MDBGRCwgMHgwMERDLCAweDAwRkUsIDB4MDBERCwKKyAgICAweDAwRkYsIDB4MDBERSwgMHgwMTAwLCAweDI0OTYsIDB4MDEwMSwgMHgyNDkxLCAweDAxMTIsIDB4MjQ5OSwgMHgwMTEzLAorICAgIDB4MjQ5NCwgMHgwMTFBLCAweDI0QjMsIDB4MDExQiwgMHgyNEJGLCAweDAxMjcsIDB4MkYzQywgMHgwMTI4LCAweDI0QjgsCisgICAgMHgwMTI5LCAweDI0QzQsIDB4MDEyQSwgMHgyNDk3LCAweDAxMkIsIDB4MjQ5MiwgMHgwMTMxLCAweDAwOTIsIDB4MDE0MSwKKyAgICAweDAwOEQsIDB4MDE0MiwgMHgwMDkzLCAweDAxNEIsIDB4MjREQywgMHgwMTRDLCAweDI0OUEsIDB4MDE0RCwgMHgyNDk1LAorICAgIDB4MDE1MiwgMHgwMDhGLCAweDAxNTMsIDB4MDA5NSwgMHgwMTYwLCAweDAwREYsIDB4MDE2MSwgMHgwMEUzLCAweDAxNjgsCisgICAgMHgyNEJELCAweDAxNjksIDB4MjRDOSwgMHgwMTZBLCAweDI0OTgsIDB4MDE2QiwgMHgyNDkzLCAweDAxNkUsIDB4MjRCQywKKyAgICAweDAxNkYsIDB4MjRDOCwgMHgwMTc4LCAweDAwRTAsIDB4MDE3RCwgMHgwMEUxLCAweDAxN0UsIDB4MDBFNSwgMHgwMUMwLAorICAgIDB4MDA2MywgMHgwMUNELCAweDI0QjIsIDB4MDFDRSwgMHgyNEJFLCAweDAxQ0YsIDB4MjRCNiwgMHgwMUQwLCAweDI0QzIsCisgICAgMHgwMUQxLCAweDI0QjksIDB4MDFEMiwgMHgyNEM1LCAweDAxRDMsIDB4MjRCQiwgMHgwMUQ0LCAweDI0QzcsIDB4MDFGRCwKKyAgICAweDI0Q0QsIDB4MDI1MSwgMHgyNENBLCAweDAyNTQsIDB4MjRDRiwgMHgwMjU5LCAweDI0RDIsIDB4MDI1QSwgMHgyNEQ1LAorICAgIDB4MDI1QiwgMHgyNEQ4LCAweDAyNzUsIDB4MjRERCwgMHgwMjgzLCAweDI0RTIsIDB4MDI4QywgMHgyNERFLCAweDAyOTIsCisgICAgMHgyNEUxLCAweDAyRDAsIDB4MjRFMywgMHgwMzAwLCAweDAwNDEsIDB4MDMwMSwgMHgwMDdGLCAweDAzMDIsIDB4MDA4MCwKKyAgICAweDAzMDMsIDB4MDA1RiwgMHgwMzA0LCAweDAwODEsIDB4MDMwNSwgMHgwMEUyLCAweDAzMDYsIDB4MDA4MiwgMHgwMzA3LAorICAgIDB4MDA4MywgMHgwMzA4LCAweDAwODQsIDB4MDMwQSwgMHgwMDg1LCAweDAzMEIsIDB4MDA4NywgMHgwMzBDLCAweDAwODksCisgICAgMHgwMzI3LCAweDAwODYsIDB4MDMyOCwgMHgwMDg4LCAweDAzMzIsIDB4MDA0MCwgMHgwMzM2LCAweDAwOEEsIDB4MDM2MSwKKyAgICAweDAyRjYsIDB4MDM5MSwgMHgwM0YzLCAweDAzOTIsIDB4MDNGNCwgMHgwMzkzLCAweDAzRjUsIDB4MDM5NCwgMHgwM0Y2LAorICAgIDB4MDM5NSwgMHgwM0Y3LCAweDAzOTYsIDB4MDNGOCwgMHgwMzk3LCAweDAzRjksIDB4MDM5OCwgMHgwM0ZBLCAweDAzOTksCisgICAgMHgwM0ZCLCAweDAzOUEsIDB4MDNGQywgMHgwMzlCLCAweDAzRkQsIDB4MDM5QywgMHgwM0ZFLCAweDAzOUQsIDB4MDNGRiwKKyAgICAweDAzOUUsIDB4MDQwMCwgMHgwMzlGLCAweDA0MDEsIDB4MDNBMCwgMHgwNDAyLCAweDAzQTEsIDB4MDQwMywgMHgwM0EzLAorICAgIDB4MDQwNCwgMHgwM0E0LCAweDA0MDUsIDB4MDNBNSwgMHgwNDA2LCAweDAzQTYsIDB4MDQwNywgMHgwM0E3LCAweDA0MDgsCisgICAgMHgwM0E4LCAweDA0MDksIDB4MDNBOSwgMHgwNDBBLCAweDAzQjEsIDB4MDQwQiwgMHgwM0IyLCAweDA0MEMsIDB4MDNCMywKKyAgICAweDA0MEQsIDB4MDNCNCwgMHgwNDBFLCAweDAzQjUsIDB4MDQwRiwgMHgwM0I2LCAweDA0MTAsIDB4MDNCNywgMHgwNDExLAorICAgIDB4MDNCOCwgMHgwNDEyLCAweDAzQjksIDB4MDQxMywgMHgwM0JBLCAweDA0MTQsIDB4MDNCQiwgMHgwNDE1LCAweDAzQkMsCisgICAgMHgwNDE2LCAweDAzQkQsIDB4MDQxNywgMHgwM0JFLCAweDA0MTgsIDB4MDNCRiwgMHgwNDE5LCAweDAzQzAsIDB4MDQxQSwKKyAgICAweDAzQzEsIDB4MDQxQiwgMHgwM0MzLCAweDA0MUMsIDB4MDNDNCwgMHgwNDFELCAweDAzQzUsIDB4MDQxRSwgMHgwM0M2LAorICAgIDB4MDQxRiwgMHgwM0M3LCAweDA0MjAsIDB4MDNDOCwgMHgwNDIxLCAweDAzQzksIDB4MDQyMiwgMHgwM0QwLCAweDJGM0EsCisgICAgMHgwM0QxLCAweDJGNDAsIDB4MDNEQiwgMHgyRjNGLCAweDA0MDEsIDB4MDQyOSwgMHgwNDEwLCAweDA0MjMsIDB4MDQxMSwKKyAgICAweDA0MjQsIDB4MDQxMiwgMHgwNDI1LCAweDA0MTMsIDB4MDQyNiwgMHgwNDE0LCAweDA0MjcsIDB4MDQxNSwgMHgwNDI4LAorICAgIDB4MDQxNiwgMHgwNDJBLCAweDA0MTcsIDB4MDQyQiwgMHgwNDE4LCAweDA0MkMsIDB4MDQxOSwgMHgwNDJELCAweDA0MUEsCisgICAgMHgwNDJFLCAweDA0MUIsIDB4MDQyRiwgMHgwNDFDLCAweDA0MzAsIDB4MDQxRCwgMHgwNDMxLCAweDA0MUUsIDB4MDQzMiwKKyAgICAweDA0MUYsIDB4MDQzMywgMHgwNDIwLCAweDA0MzQsIDB4MDQyMSwgMHgwNDM1LCAweDA0MjIsIDB4MDQzNiwgMHgwNDIzLAorICAgIDB4MDQzNywgMHgwNDI0LCAweDA0MzgsIDB4MDQyNSwgMHgwNDM5LCAweDA0MjYsIDB4MDQzQSwgMHgwNDI3LCAweDA0M0IsCisgICAgMHgwNDI4LCAweDA0M0MsIDB4MDQyOSwgMHgwNDNELCAweDA0MkEsIDB4MDQzRSwgMHgwNDJCLCAweDA0M0YsIDB4MDQyQywKKyAgICAweDA0NDAsIDB4MDQyRCwgMHgwNDQxLCAweDA0MkUsIDB4MDQ0MiwgMHgwNDJGLCAweDA0NDMsIDB4MDQzMCwgMHgwNDQ0LAorICAgIDB4MDQzMSwgMHgwNDQ1LCAweDA0MzIsIDB4MDQ0NiwgMHgwNDMzLCAweDA0NDcsIDB4MDQzNCwgMHgwNDQ4LCAweDA0MzUsCisgICAgMHgwNDQ5LCAweDA0MzYsIDB4MDQ0QiwgMHgwNDM3LCAweDA0NEMsIDB4MDQzOCwgMHgwNDRELCAweDA0MzksIDB4MDQ0RSwKKyAgICAweDA0M0EsIDB4MDQ0RiwgMHgwNDNCLCAweDA0NTAsIDB4MDQzQywgMHgwNDUxLCAweDA0M0QsIDB4MDQ1MiwgMHgwNDNFLAorICAgIDB4MDQ1MywgMHgwNDNGLCAweDA0NTQsIDB4MDQ0MCwgMHgwNDU1LCAweDA0NDEsIDB4MDQ1NiwgMHgwNDQyLCAweDA0NTcsCisgICAgMHgwNDQzLCAweDA0NTgsIDB4MDQ0NCwgMHgwNDU5LCAweDA0NDUsIDB4MDQ1QSwgMHgwNDQ2LCAweDA0NUIsIDB4MDQ0NywKKyAgICAweDA0NUMsIDB4MDQ0OCwgMHgwNDVELCAweDA0NDksIDB4MDQ1RSwgMHgwNDRBLCAweDA0NUYsIDB4MDQ0QiwgMHgwNDYwLAorICAgIDB4MDQ0QywgMHgwNDYxLCAweDA0NEQsIDB4MDQ2MiwgMHgwNDRFLCAweDA0NjMsIDB4MDQ0RiwgMHgwNDY0LCAweDA0NTEsCisgICAgMHgwNDRBLCAweDA0NUIsIDB4MkYzQywgMHgxRUJDLCAweDI0QjUsIDB4MUVCRCwgMHgyNEMxLCAweDIwMDIsIDB4MDBFNywKKyAgICAweDIwMDMsIDB4MDI3OSwgMHgyMDEwLCAweDAyOTYsIDB4MjAxMSwgMHgwMDBFLCAweDIwMTIsIDB4MDA3MiwgMHgyMDEzLAorICAgIDB4MDA3MiwgMHgyMDE0LCAweDAwOEEsIDB4MjAxNSwgMHgwMjk1LCAweDIwMTYsIDB4MDI5QSwgMHgyMDE4LCAweDAyOUUsCisgICAgMHgyMDE5LCAweDAyOUYsIDB4MjAxQSwgMHgwMDc4LCAweDIwMUMsIDB4MDJBMCwgMHgyMDFELCAweDAyQTEsIDB4MjAxRSwKKyAgICAweDAwNzksIDB4MjAyMCwgMHgwMzA4LCAweDIwMjEsIDB4MDMwOSwgMHgyMDIyLCAweDAwNzcsIDB4MjAyNSwgMHgwMjlELAorICAgIDB4MjAyNiwgMHgwMjlDLCAweDIwMzAsIDB4MDMwNCwgMHgyMDMyLCAweDAyQzQsIDB4MjAzMywgMHgwMkM1LCAweDIwMzksCisgICAgMHgwMDZFLCAweDIwM0EsIDB4MDA2RiwgMHgyMDNCLCAweDAyREUsIDB4MjAzQywgMHgyRjRGLCAweDIwM0UsIDB4MDE0NSwKKyAgICAweDIwNDQsIDB4MDA2OCwgMHgyMDQ5LCAweDJGNTAsIDB4MjA3MCwgMHgyNEExLCAweDIwNzQsIDB4MjRBMiwgMHgyMDc1LAorICAgIDB4MjRBMywgMHgyMDc2LCAweDI0QTQsIDB4MjA3NywgMHgyNEE1LCAweDIwNzgsIDB4MjRBNiwgMHgyMDc5LCAweDI0QTcsCisgICAgMHgyMDgwLCAweDI0QTgsIDB4MjA4MSwgMHgyNEE5LCAweDIwODIsIDB4MjRBQSwgMHgyMDgzLCAweDI0QUIsIDB4MjA4NCwKKyAgICAweDI0QUMsIDB4MjA4NSwgMHgyNEFELCAweDIwODYsIDB4MjRBRSwgMHgyMDg3LCAweDI0QUYsIDB4MjA4OCwgMHgyNEIwLAorICAgIDB4MjA4OSwgMHgyNEIxLCAweDIwQUMsIDB4MjQ4QSwgMHgyMERELCAweDAzMEIsIDB4MjEwMCwgMHgyRTRGLCAweDIxMDMsCisgICAgMHgwMkM2LCAweDIxMDUsIDB4MkU1MywgMHgyMTA5LCAweDIwNzEsIDB4MjEwQSwgMHgyMDcwLCAweDIxMEYsIDB4MkYzQywKKyAgICAweDIxMTMsIDB4MUY1OSwgMHgyMTE2LCAweDFEQkEsIDB4MjEyMSwgMHgxRjc3LCAweDIxMjIsIDB4MDBFNCwgMHgyMTI2LAorICAgIDB4MjQ4QiwgMHgyMTJCLCAweDAzMDMsIDB4MjEzNSwgMHgyRjM5LCAweDIxNTMsIDB4MjQ5RiwgMHgyMTU0LCAweDI0QTAsCisgICAgMHgyMTVCLCAweDI0OUIsIDB4MjE1QywgMHgyNDlDLCAweDIxNUQsIDB4MjQ5RCwgMHgyMTVFLCAweDI0OUUsIDB4MjE2MCwKKyAgICAweDFEOTcsIDB4MjE2MSwgMHgxRDk4LCAweDIxNjIsIDB4MUQ5OSwgMHgyMTYzLCAweDFEOUEsIDB4MjE2NCwgMHgxRDlCLAorICAgIDB4MjE2NSwgMHgxRDlDLCAweDIxNjYsIDB4MUQ5RCwgMHgyMTY3LCAweDFEOUUsIDB4MjE2OCwgMHgxRDlGLCAweDIxNjksCisgICAgMHgxREEwLCAweDIxNkEsIDB4MjAyMSwgMHgyMTZCLCAweDIwMjIsIDB4MjE3MCwgMHgxRjlDLCAweDIxNzEsIDB4MUY5RCwKKyAgICAweDIxNzIsIDB4MUY5RSwgMHgyMTczLCAweDFGOUYsIDB4MjE3NCwgMHgxRkEwLCAweDIxNzUsIDB4MUZBMSwgMHgyMTc2LAorICAgIDB4MUZBMiwgMHgyMTc3LCAweDFGQTMsIDB4MjE3OCwgMHgxRkE0LCAweDIxNzksIDB4MUZBNSwgMHgyMTdBLCAweDIwNkEsCisgICAgMHgyMTdCLCAweDIwNkIsIDB4MjE3RiwgMHgyMDZGLCAweDIxOTAsIDB4MDJFMSwgMHgyMTkxLCAweDAyRTIsIDB4MjE5MiwKKyAgICAweDAyRTAsIDB4MjE5MywgMHgwMkUzLCAweDIxOTQsIDB4MkZBOSwgMHgyMTk1LCAweDJGQjcsIDB4MjE5NiwgMHgyRkFDLAorICAgIDB4MjE5NywgMHgyRkFELCAweDIxOTgsIDB4MkZBQSwgMHgyMTk5LCAweDJGQUIsIDB4MjFDNCwgMHgyMDc2LCAweDIxQzUsCisgICAgMHgyMDc3LCAweDIxQzYsIDB4MjA3NSwgMHgyMUNDLCAweDJGQUUsIDB4MjFEMCwgMHgyRkE4LCAweDIxRDIsIDB4MDJGMCwKKyAgICAweDIxRDQsIDB4MDJGMSwgMHgyMUU2LCAweDFGNEQsIDB4MjFFNywgMHgxRjRDLCAweDIxRTgsIDB4MUY0RSwgMHgyMUU5LAorICAgIDB4MUY0QiwgMHgyMjAwLCAweDAyRjIsIDB4MjIwMiwgMHgwMkY3LCAweDIyMDMsIDB4MDJGMywgMHgyMjA1LCAweDJGOTgsCisgICAgMHgyMjA3LCAweDAyRjgsIDB4MjIwOCwgMHgwMkU1LCAweDIyMEEsIDB4MkYzQiwgMHgyMjBCLCAweDAyRTYsIDB4MjIxMSwKKyAgICAweDFEQzksIDB4MjIxMiwgMHgwMkI1LCAweDIyMTMsIDB4MkY1NiwgMHgyMjFBLCAweDAyRkQsIDB4MjIxRCwgMHgwMkZGLAorICAgIDB4MjIxRSwgMHgwMkJGLCAweDIyMUYsIDB4MURDRCwgMHgyMjIwLCAweDAyRjQsIDB4MjIyNSwgMHgwMjlBLCAweDIyMjcsCisgICAgMHgwMkVELCAweDIyMjgsIDB4MDJFRSwgMHgyMjI5LCAweDAyRUMsIDB4MjIyQSwgMHgwMkVCLCAweDIyMkIsIDB4MDMwMSwKKyAgICAweDIyMkMsIDB4MDMwMiwgMHgyMjJELCAweDIwMDMsIDB4MjIyRSwgMHgxREM4LCAweDIyMzQsIDB4MDJDMCwgMHgyMjM1LAorICAgIDB4MDMwMCwgMHgyMjNDLCAweDAyOTksIDB4MjIzRCwgMHgwMkZFLCAweDIyNDMsIDB4MkY1OCwgMHgyMjUyLCAweDAyRkEsCisgICAgMHgyMjYwLCAweDAyQkEsIDB4MjI2MSwgMHgwMkY5LCAweDIyNjYsIDB4MDJCRCwgMHgyMjY3LCAweDAyQkUsIDB4MjI2QSwKKyAgICAweDAyRkIsIDB4MjI2QiwgMHgwMkZDLCAweDIyNzIsIDB4MkY1OSwgMHgyMjczLCAweDJGNUEsIDB4MjI4MiwgMHgwMkU5LAorICAgIDB4MjI4MywgMHgwMkVBLCAweDIyODYsIDB4MDJFNywgMHgyMjg3LCAweDAyRTgsIDB4MjI5NSwgMHgyRjlDLCAweDIyOTYsCisgICAgMHgyRjlBLCAweDIyOTcsIDB4MkY5RCwgMHgyMjk4LCAweDJGOUIsIDB4MjI5RCwgMHgyRjlBLCAweDIyOUUsIDB4MkY5RSwKKyAgICAweDIyQTAsIDB4MkY5OSwgMHgyMkE1LCAweDAyRjUsIDB4MjJCRiwgMHgxRENFLCAweDIyRUUsIDB4MUVEOSwgMHgyMkVGLAorICAgIDB4MDI5QywgMHgyMzAwLCAweDJGOTgsIDB4MjMwNywgMHgyRkJCLCAweDIzMTIsIDB4MDJGNiwgMHgyNDRBLCAweDJGNTQsCisgICAgMHgyNDYwLCAweDFEODMsIDB4MjQ2MSwgMHgxRDg0LCAweDI0NjIsIDB4MUQ4NSwgMHgyNDYzLCAweDFEODYsIDB4MjQ2NCwKKyAgICAweDFEODcsIDB4MjQ2NSwgMHgxRDg4LCAweDI0NjYsIDB4MUQ4OSwgMHgyNDY3LCAweDFEOEEsIDB4MjQ2OCwgMHgxRDhCLAorICAgIDB4MjQ2OSwgMHgxRDhDLCAweDI0NkEsIDB4MUQ4RCwgMHgyNDZCLCAweDFEOEUsIDB4MjQ2QywgMHgxRDhGLCAweDI0NkQsCisgICAgMHgxRDkwLCAweDI0NkUsIDB4MUQ5MSwgMHgyNDZGLCAweDFEOTIsIDB4MjQ3MCwgMHgxRDkzLCAweDI0NzEsIDB4MUQ5NCwKKyAgICAweDI0NzIsIDB4MUQ5NSwgMHgyNDczLCAweDFEOTYsIDB4MjQ3NCwgMHgxRjg3LCAweDI0NzUsIDB4MUY4OCwgMHgyNDc2LAorICAgIDB4MUY4OSwgMHgyNDc3LCAweDFGOEEsIDB4MjQ3OCwgMHgxRjhCLCAweDI0NzksIDB4MUY4QywgMHgyNDdBLCAweDFGOEQsCisgICAgMHgyNDdCLCAweDFGOEUsIDB4MjQ3QywgMHgxRjhGLCAweDI0N0QsIDB4MUY5MCwgMHgyNDdFLCAweDFGOTEsIDB4MjQ3RiwKKyAgICAweDFGOTIsIDB4MjQ4MCwgMHgxRjkzLCAweDI0ODEsIDB4MUY5NCwgMHgyNDgyLCAweDFGOTUsIDB4MjQ4MywgMHgxRjk2LAorICAgIDB4MjQ4NCwgMHgxRjk3LCAweDI0ODUsIDB4MUY5OCwgMHgyNDg2LCAweDFGOTksIDB4MjQ4NywgMHgxRjlBLCAweDI0ODgsCisgICAgMHgxRjdFLCAweDI0ODksIDB4MUY3RiwgMHgyNDhBLCAweDFGODAsIDB4MjQ4QiwgMHgxRjgxLCAweDI0OEMsIDB4MUY4MiwKKyAgICAweDI0OEQsIDB4MUY4MywgMHgyNDhFLCAweDFGODQsIDB4MjQ4RiwgMHgxRjg1LCAweDI0OTAsIDB4MUY4NiwgMHgyNDlDLAorICAgIDB4MUZCMCwgMHgyNDlELCAweDFGQjEsIDB4MjQ5RSwgMHgxRkIyLCAweDI0OUYsIDB4MUZCMywgMHgyNEEwLCAweDFGQjQsCisgICAgMHgyNEExLCAweDFGQjUsIDB4MjRBMiwgMHgxRkI2LCAweDI0QTMsIDB4MUZCNywgMHgyNEE0LCAweDFGQjgsIDB4MjRBNSwKKyAgICAweDFGQjksIDB4MjRBNiwgMHgxRkJBLCAweDI0QTcsIDB4MUZCQiwgMHgyNEE4LCAweDFGQkMsIDB4MjRBOSwgMHgxRkJELAorICAgIDB4MjRBQSwgMHgxRkJFLCAweDI0QUIsIDB4MUZCRiwgMHgyNEFDLCAweDFGQzAsIDB4MjRBRCwgMHgxRkMxLCAweDI0QUUsCisgICAgMHgxRkMyLCAweDI0QUYsIDB4MUZDMywgMHgyNEIwLCAweDFGQzQsIDB4MjRCMSwgMHgxRkM1LCAweDI0QjIsIDB4MUZDNiwKKyAgICAweDI0QjMsIDB4MUZDNywgMHgyNEI0LCAweDFGQzgsIDB4MjRCNSwgMHgxRkM5LCAweDI0QjYsIDB4Mjg2MywgMHgyNEI3LAorICAgIDB4Mjg2NCwgMHgyNEI4LCAweDI4NjUsIDB4MjRCOSwgMHgyODY2LCAweDI0QkEsIDB4Mjg2NywgMHgyNEJCLCAweDI4NjgsCisgICAgMHgyNEJDLCAweDI4NjksIDB4MjRCRCwgMHgyODZBLCAweDI0QkUsIDB4Mjg2QiwgMHgyNEJGLCAweDI4NkMsIDB4MjRDMCwKKyAgICAweDI4NkQsIDB4MjRDMSwgMHgyODZFLCAweDI0QzIsIDB4Mjg2RiwgMHgyNEMzLCAweDI4NzAsIDB4MjRDNCwgMHgyODcxLAorICAgIDB4MjRDNSwgMHgyODcyLCAweDI0QzYsIDB4Mjg3MywgMHgyNEM3LCAweDI4NzQsIDB4MjRDOCwgMHgyODc1LCAweDI0QzksCisgICAgMHgyODc2LCAweDI0Q0EsIDB4Mjg3NywgMHgyNENCLCAweDI4NzgsIDB4MjRDQywgMHgyODc5LCAweDI0Q0QsIDB4Mjg3QSwKKyAgICAweDI0Q0UsIDB4Mjg3QiwgMHgyNENGLCAweDI4N0MsIDB4MjREMCwgMHgyODQ5LCAweDI0RDEsIDB4Mjg0QSwgMHgyNEQyLAorICAgIDB4Mjg0QiwgMHgyNEQzLCAweDI4NEMsIDB4MjRENCwgMHgyODRELCAweDI0RDUsIDB4Mjg0RSwgMHgyNEQ2LCAweDI4NEYsCisgICAgMHgyNEQ3LCAweDI4NTAsIDB4MjREOCwgMHgyODUxLCAweDI0RDksIDB4Mjg1MiwgMHgyNERBLCAweDI4NTMsIDB4MjREQiwKKyAgICAweDI4NTQsIDB4MjREQywgMHgyODU1LCAweDI0REQsIDB4Mjg1NiwgMHgyNERFLCAweDI4NTcsIDB4MjRERiwgMHgyODU4LAorICAgIDB4MjRFMCwgMHgyODU5LCAweDI0RTEsIDB4Mjg1QSwgMHgyNEUyLCAweDI4NUIsIDB4MjRFMywgMHgyODVDLCAweDI0RTQsCisgICAgMHgyODVELCAweDI0RTUsIDB4Mjg1RSwgMHgyNEU2LCAweDI4NUYsIDB4MjRFNywgMHgyODYwLCAweDI0RTgsIDB4Mjg2MSwKKyAgICAweDI0RTksIDB4Mjg2MiwgMHgyNEVBLCAweDIwMjAsIDB4MjUwMCwgMHgxRDM3LCAweDI1MDEsIDB4MUQzOCwgMHgyNTAyLAorICAgIDB4MUQzOSwgMHgyNTAzLCAweDFEM0EsIDB4MjUwNCwgMHgxRDNCLCAweDI1MDUsIDB4MUQzQywgMHgyNTA2LCAweDFEM0QsCisgICAgMHgyNTA3LCAweDFEM0UsIDB4MjUwOCwgMHgxRDNGLCAweDI1MDksIDB4MUQ0MCwgMHgyNTBBLCAweDFENDEsIDB4MjUwQiwKKyAgICAweDFENDIsIDB4MjUwQywgMHgxRDQzLCAweDI1MEQsIDB4MUQ0NCwgMHgyNTBFLCAweDFENDUsIDB4MjUwRiwgMHgxRDQ2LAorICAgIDB4MjUxMCwgMHgxRDQ3LCAweDI1MTEsIDB4MUQ0OCwgMHgyNTEyLCAweDFENDksIDB4MjUxMywgMHgxRDRBLCAweDI1MTQsCisgICAgMHgxRDRCLCAweDI1MTUsIDB4MUQ0QywgMHgyNTE2LCAweDFENEQsIDB4MjUxNywgMHgxRDRFLCAweDI1MTgsIDB4MUQ0RiwKKyAgICAweDI1MTksIDB4MUQ1MCwgMHgyNTFBLCAweDFENTEsIDB4MjUxQiwgMHgxRDUyLCAweDI1MUMsIDB4MUQ1MywgMHgyNTFELAorICAgIDB4MUQ1NCwgMHgyNTFFLCAweDFENTUsIDB4MjUxRiwgMHgxRDU2LCAweDI1MjAsIDB4MUQ1NywgMHgyNTIxLCAweDFENTgsCisgICAgMHgyNTIyLCAweDFENTksIDB4MjUyMywgMHgxRDVBLCAweDI1MjQsIDB4MUQ1QiwgMHgyNTI1LCAweDFENUMsIDB4MjUyNiwKKyAgICAweDFENUQsIDB4MjUyNywgMHgxRDVFLCAweDI1MjgsIDB4MUQ1RiwgMHgyNTI5LCAweDFENjAsIDB4MjUyQSwgMHgxRDYxLAorICAgIDB4MjUyQiwgMHgxRDYyLCAweDI1MkMsIDB4MUQ2MywgMHgyNTJELCAweDFENjQsIDB4MjUyRSwgMHgxRDY1LCAweDI1MkYsCisgICAgMHgxRDY2LCAweDI1MzAsIDB4MUQ2NywgMHgyNTMxLCAweDFENjgsIDB4MjUzMiwgMHgxRDY5LCAweDI1MzMsIDB4MUQ2QSwKKyAgICAweDI1MzQsIDB4MUQ2QiwgMHgyNTM1LCAweDFENkMsIDB4MjUzNiwgMHgxRDZELCAweDI1MzcsIDB4MUQ2RSwgMHgyNTM4LAorICAgIDB4MUQ2RiwgMHgyNTM5LCAweDFENzAsIDB4MjUzQSwgMHgxRDcxLCAweDI1M0IsIDB4MUQ3MiwgMHgyNTNDLCAweDFENzMsCisgICAgMHgyNTNELCAweDFENzQsIDB4MjUzRSwgMHgxRDc1LCAweDI1M0YsIDB4MUQ3NiwgMHgyNTQwLCAweDFENzcsIDB4MjU0MSwKKyAgICAweDFENzgsIDB4MjU0MiwgMHgxRDc5LCAweDI1NDMsIDB4MUQ3QSwgMHgyNTQ0LCAweDFEN0IsIDB4MjU0NSwgMHgxRDdDLAorICAgIDB4MjU0NiwgMHgxRDdELCAweDI1NDcsIDB4MUQ3RSwgMHgyNTQ4LCAweDFEN0YsIDB4MjU0OSwgMHgxRDgwLCAweDI1NEEsCisgICAgMHgxRDgxLCAweDI1NEIsIDB4MUQ4MiwgMHgyNTUwLCAweDIwM0IsIDB4MjU1RSwgMHgyMDNDLCAweDI1NjEsIDB4MjAzRSwKKyAgICAweDI1NkEsIDB4MjAzRCwgMHgyNTZELCAweDIwMzcsIDB4MjU2RSwgMHgyMDM4LCAweDI1NkYsIDB4MjAzQSwgMHgyNTcwLAorICAgIDB4MjAzOSwgMHgyNTcxLCAweDIwNDUsIDB4MjU3MiwgMHgyMDQ2LCAweDI1NzMsIDB4MjA0NywgMHgyNTgxLCAweDIwMjYsCisgICAgMHgyNTgyLCAweDIwMjcsIDB4MjU4MywgMHgyMDI4LCAweDI1ODQsIDB4MjAyOSwgMHgyNTg1LCAweDIwMkEsIDB4MjU4NiwKKyAgICAweDIwMkIsIDB4MjU4NywgMHgyMDJDLCAweDI1ODgsIDB4MjAyRCwgMHgyNTg5LCAweDIwMzQsIDB4MjU4QSwgMHgyMDMzLAorICAgIDB4MjU4QiwgMHgyMDMyLCAweDI1OEMsIDB4MjAzMSwgMHgyNThELCAweDIwMzAsIDB4MjU4RSwgMHgyMDJGLCAweDI1OEYsCisgICAgMHgyMDJFLCAweDI1OTQsIDB4MjAzNSwgMHgyNTk1LCAweDIwMzYsIDB4MjVBMCwgMHgwMkQ5LCAweDI1QTEsIDB4MDJEOCwKKyAgICAweDI1QTIsIDB4MUY0RiwgMHgyNUFBLCAweDJGQ0YsIDB4MjVBQiwgMHgyRkNELCAweDI1QjIsIDB4MDJEQiwgMHgyNUIzLAorICAgIDB4MDJEQSwgMHgyNUI2LCAweDJGQTMsIDB4MjVCNywgMHgxRjRBLCAweDI1QkMsIDB4MDJERCwgMHgyNUJELCAweDAyREMsCisgICAgMHgyNUMwLCAweDJGQTIsIDB4MjVDMSwgMHgxRjQ5LCAweDI1QzYsIDB4MDJENywgMHgyNUM3LCAweDAyRDYsIDB4MjVDOSwKKyAgICAweDIwMTIsIDB4MjVDQiwgMHgwMkQzLCAweDI1Q0MsIDB4MjkwNiwgMHgyNUNFLCAweDAyRDUsIDB4MjVDRiwgMHgwMkQ0LAorICAgIDB4MjVFMiwgMHgyMDNGLCAweDI1RTMsIDB4MjA0MCwgMHgyNUU0LCAweDIwNDIsIDB4MjVFNSwgMHgyMDQxLCAweDI1RTYsCisgICAgMHgyRkRFLCAweDI1RUYsIDB4MDMwQiwgMHgyNjAwLCAweDIwMTcsIDB4MjYwMSwgMHgyMDE4LCAweDI2MDIsIDB4MjAxOSwKKyAgICAweDI2MDMsIDB4MjAxQSwgMHgyNjA1LCAweDAyRDIsIDB4MjYwNiwgMHgwMkQxLCAweDI2MEUsIDB4MUY3OCwgMHgyNjEyLAorICAgIDB4MkY5OSwgMHgyNjFDLCAweDIwMUMsIDB4MjYxRCwgMHgyMDFELCAweDI2MUUsIDB4MjAxQiwgMHgyNjFGLCAweDIwMUUsCisgICAgMHgyNjQwLCAweDAyQzIsIDB4MjY0MiwgMHgwMkMxLCAweDI2NjAsIDB4MjAxMywgMHgyNjYxLCAweDFGNTEsIDB4MjY2MiwKKyAgICAweDFGNTMsIDB4MjY2MywgMHgyMDE1LCAweDI2NjQsIDB4MUY1MiwgMHgyNjY1LCAweDIwMTQsIDB4MjY2NiwgMHgyMDE2LAorICAgIDB4MjY2NywgMHgxRjUwLCAweDI2NjgsIDB4MkY0MiwgMHgyNjY5LCAweDJGNDMsIDB4MjY2QSwgMHgwMzA3LCAweDI2NkMsCisgICAgMHgyRjQ0LCAweDI2NkQsIDB4MDMwNiwgMHgyNjZGLCAweDAzMDUsIDB4MjcwMiwgMHgyRjkwLCAweDI3MUEsIDB4MkZEMSwKKyAgICAweDI3NTYsIDB4MkZFMywgMHgyNzc2LCAweDIwNUUsIDB4Mjc3NywgMHgyMDVGLCAweDI3NzgsIDB4MjA2MCwgMHgyNzc5LAorICAgIDB4MjA2MSwgMHgyNzdBLCAweDIwNjIsIDB4Mjc3QiwgMHgyMDYzLCAweDI3N0MsIDB4MjA2NCwgMHgyNzdELCAweDIwNjUsCisgICAgMHgyNzdFLCAweDIwNjYsIDB4MjdBMSwgMHgyMDBFLCAweDJFODMsIDB4MzdFMSwgMHgyRTg1LCAweDM2MjAsIDB4MkU4NywKKyAgICAweDM3MTksIDB4MkU4OSwgMHgzODE0LCAweDJFOEIsIDB4MzcxRSwgMHgyRThDLCAweDM2MDksIDB4MkU4RCwgMHgzNjBBLAorICAgIDB4MkU4RSwgMHgxMDcxLCAweDJFOEYsIDB4Mzg4QywgMHgyRTkwLCAweDEyMjYsIDB4MkU5MiwgMHgwRUIyLCAweDJFOTMsCisgICAgMHgxMjgzLCAweDJFOTQsIDB4MTJBQiwgMHgyRTk1LCAweDNDMUYsIDB4MkU5NiwgMHgzOEMyLCAweDJFOTcsIDB4MzYxQywKKyAgICAweDJFOTgsIDB4MzhFMSwgMHgyRTk5LCAweDEzQzMsIDB4MkU5QiwgMHgxM0UxLCAweDJFOUYsIDB4MEUzQywgMHgyRUEwLAorICAgIDB4MEVCRCwgMHgyRUExLCAweDM5NjEsIDB4MkVBMiwgMHgzOTYyLCAweDJFQTMsIDB4Mzk5RCwgMHgyRUE0LCAweDNDMjYsCisgICAgMHgyRUE2LCAweDM3NEQsIDB4MkVBOCwgMHgzOUJDLCAweDJFQTksIDB4MzVBMSwgMHgyRUFBLCAweDM2QUIsIDB4MkVBQiwKKyAgICAweDNBOTcsIDB4MkVBQywgMHgwOEQ0LCAweDJFQUQsIDB4M0EzOSwgMHgyRUFFLCAweDM2NjIsIDB4MkVCMSwgMHgzQTk4LAorICAgIDB4MkVCMiwgMHgzQTk3LCAweDJFQjMsIDB4Mzc2RCwgMHgyRUI3LCAweDM2RkUsIDB4MkVCOSwgMHgzNzEzLCAweDJFQkMsCisgICAgMHgzNUIzLCAweDJFQkQsIDB4MzU0RSwgMHgyRUJFLCAweDM3NzUsIDB4MkVCRiwgMHgzNzc2LCAweDJFQzAsIDB4Mzc3NywKKyAgICAweDJFQzEsIDB4MDc4QiwgMHgyRUMyLCAweDNCMEEsIDB4MkVDMywgMHgzNjJFLCAweDJFQzQsIDB4MEE2MiwgMHgyRUM2LAorICAgIDB4MzU3MiwgMHgyRUNBLCAweDM2NEEsIDB4MkVDQywgMHgzQzJCLCAweDJFQ0QsIDB4M0I1MCwgMHgyRUNGLCAweDNCOUUsCisgICAgMHgyRUQxLCAweDBCRDUsIDB4MkVEMiwgMHgzQjk3LCAweDJFRDYsIDB4M0I5RSwgMHgyRUQ3LCAweDM1NEQsIDB4MkVEOCwKKyAgICAweDBBNjgsIDB4MkVERCwgMHgzNjE3LCAweDJFREUsIDB4MzYxOSwgMHgyRURGLCAweDM2MTgsIDB4MkVFNCwgMHgwNjRFLAorICAgIDB4MkVFOCwgMHgwRDM0LCAweDJFRTksIDB4MDUyQiwgMHgyRUVCLCAweDBBNkEsIDB4MkVFRCwgMHgwOEMzLCAweDJFRUYsCisgICAgMHgwRjdELCAweDJFRjIsIDB4MDY0RiwgMHgyRjAwLCAweDA0QjAsIDB4MkYwMSwgMHgyMEIzLCAweDJGMDIsIDB4MEZGRiwKKyAgICAweDJGMDMsIDB4MTAwMSwgMHgyRjA0LCAweDA1MzUsIDB4MkYwNSwgMHgxMDA2LCAweDJGMDYsIDB4MENDQiwgMHgyRjA3LAorICAgIDB4MTAwRSwgMHgyRjA4LCAweDBBMTMsIDB4MkYwOSwgMHgxMDcwLCAweDJGMEEsIDB4MENENiwgMHgyRjBCLCAweDBENDAsCisgICAgMHgyRjBDLCAweDEwN0IsIDB4MkYwRCwgMHgxMDgzLCAweDJGMEUsIDB4MTA4OSwgMHgyRjBGLCAweDEwOTMsIDB4MkYxMCwKKyAgICAweDEwOTgsIDB4MkYxMSwgMHgwQzVCLCAweDJGMTIsIDB4MEY5NywgMHgyRjEzLCAweDEwQzYsIDB4MkYxNCwgMHgxMENELAorICAgIDB4MkYxNSwgMHgxMENFLCAweDJGMTYsIDB4MTBEMywgMHgyRjE3LCAweDA5NDcsIDB4MkYxOCwgMHgwRTdDLCAweDJGMTksCisgICAgMHgxMERDLCAweDJGMUEsIDB4MTBFMSwgMHgyRjFCLCAweDEwRTgsIDB4MkYxQywgMHgwRUEyLCAweDJGMUQsIDB4MDdCMSwKKyAgICAweDJGMUUsIDB4MTE2QiwgMHgyRjFGLCAweDBDNTQsIDB4MkYyMCwgMHgwODlDLCAweDJGMjEsIDB4MTFCQSwgMHgyRjIyLAorICAgIDB4MTFCQiwgMHgyRjIzLCAweDBGMjYsIDB4MkYyNCwgMHgwQjQ3LCAweDJGMjUsIDB4MDk4MSwgMHgyRjI2LCAweDA4QTAsCisgICAgMHgyRjI3LCAweDEyMEUsIDB4MkYyOCwgMHgwQTQ3LCAweDJGMjksIDB4MDk5NiwgMHgyRjJBLCAweDEyMjYsIDB4MkYyQiwKKyAgICAweDEyMjgsIDB4MkYyQywgMHgxMjMyLCAweDJGMkQsIDB4MDg4MSwgMHgyRjJFLCAweDEyNkMsIDB4MkYyRiwgMHgwN0JCLAorICAgIDB4MkYzMCwgMHgwNzdFLCAweDJGMzEsIDB4MDZDQSwgMHgyRjMyLCAweDA1RUYsIDB4MkYzMywgMHgxMjgzLCAweDJGMzQsCisgICAgMHgxMjg1LCAweDJGMzUsIDB4MTI5OSwgMHgyRjM2LCAweDEyOUIsIDB4MkYzNywgMHgxMkEwLCAweDJGMzgsIDB4MDY3NywKKyAgICAweDJGMzksIDB4MzhCOSwgMHgyRjNBLCAweDEyQUYsIDB4MkYzQiwgMHgxMkIxLCAweDJGM0MsIDB4MDlGQSwgMHgyRjNELAorICAgIDB4MTM0MiwgMHgyRjNFLCAweDA3ODEsIDB4MkYzRiwgMHgwOTE2LCAweDJGNDAsIDB4MDhBNywgMHgyRjQxLCAweDEzQzIsCisgICAgMHgyRjQyLCAweDBFMDgsIDB4MkY0MywgMHgwQzQ3LCAweDJGNDQsIDB4MDZDQywgMHgyRjQ1LCAweDBFNEQsIDB4MkY0NiwKKyAgICAweDEzRTAsIDB4MkY0NywgMHgwQ0Q0LCAweDJGNDgsIDB4MTQwQywgMHgyRjQ5LCAweDA3NDQsIDB4MkY0QSwgMHgwRUU2LAorICAgIDB4MkY0QiwgMHgwNzNELCAweDJGNEMsIDB4MDhBRCwgMHgyRjRELCAweDE0RTUsIDB4MkY0RSwgMHgxNEY0LCAweDJGNEYsCisgICAgMHgxNEY4LCAweDJGNTAsIDB4MEQ3QSwgMHgyRjUxLCAweDBFREYsIDB4MkY1MiwgMHgwOEFGLCAweDJGNTMsIDB4MTUwMiwKKyAgICAweDJGNTQsIDB4MEEyQiwgMHgyRjU1LCAweDA1NTAsIDB4MkY1NiwgMHgwQkZBLCAweDJGNTcsIDB4MERENSwgMHgyRjU4LAorICAgIDB4MTVFNCwgMHgyRjU5LCAweDE1RTYsIDB4MkY1QSwgMHgwRTIyLCAweDJGNUIsIDB4MDU2NywgMHgyRjVDLCAweDA2ODcsCisgICAgMHgyRjVELCAweDA3NTgsIDB4MkY1RSwgMHgwNzcwLCAweDJGNUYsIDB4MDZDNCwgMHgyRjYwLCAweDA0REQsIDB4MkY2MSwKKyAgICAweDA1RTAsIDB4MkY2MiwgMHgwNjAxLCAweDJGNjMsIDB4MEE1QywgMHgyRjY0LCAweDBGM0IsIDB4MkY2NSwgMHgwQzNFLAorICAgIDB4MkY2NiwgMHgwRDk3LCAweDJGNjcsIDB4M0EwMCwgMHgyRjY4LCAweDE2OTcsIDB4MkY2OSwgMHgwRDI4LCAweDJGNkEsCisgICAgMHgwRDdELCAweDJGNkIsIDB4MDg3QywgMHgyRjZDLCAweDBFRTgsIDB4MkY2RCwgMHgwRUMzLCAweDJGNkUsIDB4MEVGQywKKyAgICAweDJGNkYsIDB4MEE3NCwgMHgyRjcwLCAweDA4RDQsIDB4MkY3MSwgMHgzQTQxLCAweDJGNzIsIDB4MDU1MywgMHgyRjczLAorICAgIDB4MDc0MCwgMHgyRjc0LCAweDBGNzEsIDB4MkY3NSwgMHgwQjlCLCAweDJGNzYsIDB4MEUxNiwgMHgyRjc3LCAweDA4QjMsCisgICAgMHgyRjc4LCAweDA2MDgsIDB4MkY3OSwgMHgxODEzLCAweDJGN0EsIDB4MEYzRCwgMHgyRjdCLCAweDA0Q0IsIDB4MkY3QywKKyAgICAweDBGREQsIDB4MkY3RCwgMHgwOEQ1LCAweDJGN0UsIDB4MTgzRCwgMHgyRjdGLCAweDA4RDYsIDB4MkY4MCwgMHgxODUzLAorICAgIDB4MkY4MSwgMHgwQ0QxLCAweDJGODIsIDB4MEEwOSwgMHgyRjgzLCAweDA4RDcsIDB4MkY4NCwgMHgwOEI4LCAweDJGODUsCisgICAgMHgwNEQzLCAweDJGODYsIDB4MEE4OSwgMHgyRjg3LCAweDBBQTYsIDB4MkY4OCwgMHgwOTM4LCAweDJGODksIDB4MDgyMSwKKyAgICAweDJGOEEsIDB4MDlFRCwgMHgyRjhCLCAweDE4QjIsIDB4MkY4QywgMHgxOTRGLCAweDJGOEQsIDB4MEJBQywgMHgyRjhFLAorICAgIDB4MDc0MiwgMHgyRjhGLCAweDA3RTYsIDB4MkY5MCwgMHgwNEE1LCAweDJGOTEsIDB4MTlFQiwgMHgyRjkyLCAweDA3NUYsCisgICAgMHgyRjkzLCAweDA1QUYsIDB4MkY5NCwgMHgwNzc0LCAweDJGOTUsIDB4MEI2OSwgMHgyRjk2LCAweDBDN0UsIDB4MkY5NywKKyAgICAweDFBNTYsIDB4MkY5OCwgMHgxQTU5LCAweDJGOTksIDB4MDU4QiwgMHgyRjlBLCAweDBBN0EsIDB4MkY5QiwgMHgwQUY4LAorICAgIDB4MkY5QywgMHgwQjBELCAweDJGOUQsIDB4MEEwRSwgMHgyRjlFLCAweDA5MDIsIDB4MkY5RiwgMHgwQTBGLCAweDJGQTAsCisgICAgMHgwQjYyLCAweDJGQTEsIDB4M0I0RiwgMHgyRkEyLCAweDBGMjIsIDB4MkZBMywgMHgwQ0FCLCAweDJGQTQsIDB4MEQ2NCwKKyAgICAweDJGQTUsIDB4MEY2QywgMHgyRkE2LCAweDA2REEsIDB4MkZBNywgMHgwQkQ1LCAweDJGQTgsIDB4MEVGMywgMHgyRkE5LAorICAgIDB4MERERSwgMHgyRkFBLCAweDFCQzksIDB4MkZBQiwgMHgxQkNCLCAweDJGQUMsIDB4MDRDRCwgMHgyRkFELCAweDIxRjcsCisgICAgMHgyRkFFLCAweDBEODcsIDB4MkZBRiwgMHgwRUQ4LCAweDJGQjAsIDB4MDVCNSwgMHgyRkIxLCAweDFDMDMsIDB4MkZCMiwKKyAgICAweDFDMDUsIDB4MkZCMywgMHgwNTNCLCAweDJGQjQsIDB4MEUxNywgMHgyRkI1LCAweDBERTksIDB4MkZCNiwgMHgwRDg4LAorICAgIDB4MkZCNywgMHgwOUVGLCAweDJGQjgsIDB4MDkxRiwgMHgyRkI5LCAweDA3RjMsIDB4MkZCQSwgMHgwRDA1LCAweDJGQkIsCisgICAgMHgwODBFLCAweDJGQkMsIDB4MDdGNCwgMHgyRkJELCAweDFDNkMsIDB4MkZCRSwgMHgxQzdELCAweDJGQkYsIDB4MUM4MywKKyAgICAweDJGQzAsIDB4MUM4NCwgMHgyRkMxLCAweDA2NEUsIDB4MkZDMiwgMHgwNjk1LCAweDJGQzMsIDB4MEJENywgMHgyRkM0LAorICAgIDB4MUNGNiwgMHgyRkM1LCAweDA4REIsIDB4MkZDNiwgMHgxRDAxLCAweDJGQzcsIDB4MEU5MSwgMHgyRkM4LCAweDM0MEIsCisgICAgMHgyRkM5LCAweDA2NkEsIDB4MkZDQSwgMHgwODA3LCAweDJGQ0IsIDB4MUQxNiwgMHgyRkNDLCAweDFEMTksIDB4MkZDRCwKKyAgICAweDBDMUUsIDB4MkZDRSwgMHgwNzkxLCAweDJGQ0YsIDB4MEFDRiwgMHgyRkQwLCAweDBEOTMsIDB4MkZEMSwgMHgxRDIxLAorICAgIDB4MkZEMiwgMHgxRDIyLCAweDJGRDMsIDB4MEY3RSwgMHgyRkQ0LCAweDFEMzAsIDB4MkZENSwgMHgxRDMxLCAweDMwMDAsCisgICAgMHgwMjc5LCAweDMwMDEsIDB4MDI3QSwgMHgzMDAyLCAweDAyN0IsIDB4MzAwMywgMHgwMjhGLCAweDMwMDQsIDB4MjA3NCwKKyAgICAweDMwMDUsIDB4MDI5MSwgMHgzMDA2LCAweDAyOTIsIDB4MzAwNywgMHgwMjkzLCAweDMwMDgsIDB4MDJBQSwgMHgzMDA5LAorICAgIDB4MDJBQiwgMHgzMDBBLCAweDAyQUMsIDB4MzAwQiwgMHgwMkFELCAweDMwMEMsIDB4MDJBRSwgMHgzMDBELCAweDAyQUYsCisgICAgMHgzMDBFLCAweDAyQjAsIDB4MzAwRiwgMHgwMkIxLCAweDMwMTAsIDB4MDJCMiwgMHgzMDExLCAweDAyQjMsIDB4MzAxMiwKKyAgICAweDAyREYsIDB4MzAxMywgMHgwMkU0LCAweDMwMTQsIDB4MDJBNCwgMHgzMDE1LCAweDAyQTUsIDB4MzAxQywgMHgwMjk5LAorICAgIDB4MzAxRCwgMHgxREI4LCAweDMwMUYsIDB4MURCOSwgMHgzMDIwLCAweDFGN0EsIDB4MzAzMCwgMHgyRkJBLCAweDMwMzMsCisgICAgMHgyRjRDLCAweDMwMzQsIDB4MkY0RCwgMHgzMDM1LCAweDJGNEUsIDB4MzAzNiwgMHgxRjc5LCAweDMwNDEsIDB4MDM0QSwKKyAgICAweDMwNDIsIDB4MDM0QiwgMHgzMDQzLCAweDAzNEMsIDB4MzA0NCwgMHgwMzRELCAweDMwNDUsIDB4MDM0RSwgMHgzMDQ2LAorICAgIDB4MDM0RiwgMHgzMDQ3LCAweDAzNTAsIDB4MzA0OCwgMHgwMzUxLCAweDMwNDksIDB4MDM1MiwgMHgzMDRBLCAweDAzNTMsCisgICAgMHgzMDRCLCAweDAzNTQsIDB4MzA0QywgMHgwMzU1LCAweDMwNEQsIDB4MDM1NiwgMHgzMDRFLCAweDAzNTcsIDB4MzA0RiwKKyAgICAweDAzNTgsIDB4MzA1MCwgMHgwMzU5LCAweDMwNTEsIDB4MDM1QSwgMHgzMDUyLCAweDAzNUIsIDB4MzA1MywgMHgwMzVDLAorICAgIDB4MzA1NCwgMHgwMzVELCAweDMwNTUsIDB4MDM1RSwgMHgzMDU2LCAweDAzNUYsIDB4MzA1NywgMHgwMzYwLCAweDMwNTgsCisgICAgMHgwMzYxLCAweDMwNTksIDB4MDM2MiwgMHgzMDVBLCAweDAzNjMsIDB4MzA1QiwgMHgwMzY0LCAweDMwNUMsIDB4MDM2NSwKKyAgICAweDMwNUQsIDB4MDM2NiwgMHgzMDVFLCAweDAzNjcsIDB4MzA1RiwgMHgwMzY4LCAweDMwNjAsIDB4MDM2OSwgMHgzMDYxLAorICAgIDB4MDM2QSwgMHgzMDYyLCAweDAzNkIsIDB4MzA2MywgMHgwMzZDLCAweDMwNjQsIDB4MDM2RCwgMHgzMDY1LCAweDAzNkUsCisgICAgMHgzMDY2LCAweDAzNkYsIDB4MzA2NywgMHgwMzcwLCAweDMwNjgsIDB4MDM3MSwgMHgzMDY5LCAweDAzNzIsIDB4MzA2QSwKKyAgICAweDAzNzMsIDB4MzA2QiwgMHgwMzc0LCAweDMwNkMsIDB4MDM3NSwgMHgzMDZELCAweDAzNzYsIDB4MzA2RSwgMHgwMzc3LAorICAgIDB4MzA2RiwgMHgwMzc4LCAweDMwNzAsIDB4MDM3OSwgMHgzMDcxLCAweDAzN0EsIDB4MzA3MiwgMHgwMzdCLCAweDMwNzMsCisgICAgMHgwMzdDLCAweDMwNzQsIDB4MDM3RCwgMHgzMDc1LCAweDAzN0UsIDB4MzA3NiwgMHgwMzdGLCAweDMwNzcsIDB4MDM4MCwKKyAgICAweDMwNzgsIDB4MDM4MSwgMHgzMDc5LCAweDAzODIsIDB4MzA3QSwgMHgwMzgzLCAweDMwN0IsIDB4MDM4NCwgMHgzMDdDLAorICAgIDB4MDM4NSwgMHgzMDdELCAweDAzODYsIDB4MzA3RSwgMHgwMzg3LCAweDMwN0YsIDB4MDM4OCwgMHgzMDgwLCAweDAzODksCisgICAgMHgzMDgxLCAweDAzOEEsIDB4MzA4MiwgMHgwMzhCLCAweDMwODMsIDB4MDM4QywgMHgzMDg0LCAweDAzOEQsIDB4MzA4NSwKKyAgICAweDAzOEUsIDB4MzA4NiwgMHgwMzhGLCAweDMwODcsIDB4MDM5MCwgMHgzMDg4LCAweDAzOTEsIDB4MzA4OSwgMHgwMzkyLAorICAgIDB4MzA4QSwgMHgwMzkzLCAweDMwOEIsIDB4MDM5NCwgMHgzMDhDLCAweDAzOTUsIDB4MzA4RCwgMHgwMzk2LCAweDMwOEUsCisgICAgMHgwMzk3LCAweDMwOEYsIDB4MDM5OCwgMHgzMDkwLCAweDAzOTksIDB4MzA5MSwgMHgwMzlBLCAweDMwOTIsIDB4MDM5QiwKKyAgICAweDMwOTMsIDB4MDM5QywgMHgzMDk0LCAweDFGMTYsIDB4MzA5QiwgMHgwMjgzLCAweDMwOUMsIDB4MDI4NCwgMHgzMDlELAorICAgIDB4MDI4RCwgMHgzMDlFLCAweDAyOEUsIDB4MzBBMSwgMHgwMzlELCAweDMwQTIsIDB4MDM5RSwgMHgzMEEzLCAweDAzOUYsCisgICAgMHgzMEE0LCAweDAzQTAsIDB4MzBBNSwgMHgwM0ExLCAweDMwQTYsIDB4MDNBMiwgMHgzMEE3LCAweDAzQTMsIDB4MzBBOCwKKyAgICAweDAzQTQsIDB4MzBBOSwgMHgwM0E1LCAweDMwQUEsIDB4MDNBNiwgMHgzMEFCLCAweDAzQTcsIDB4MzBBQywgMHgwM0E4LAorICAgIDB4MzBBRCwgMHgwM0E5LCAweDMwQUUsIDB4MDNBQSwgMHgzMEFGLCAweDAzQUIsIDB4MzBCMCwgMHgwM0FDLCAweDMwQjEsCisgICAgMHgwM0FELCAweDMwQjIsIDB4MDNBRSwgMHgzMEIzLCAweDAzQUYsIDB4MzBCNCwgMHgwM0IwLCAweDMwQjUsIDB4MDNCMSwKKyAgICAweDMwQjYsIDB4MDNCMiwgMHgzMEI3LCAweDAzQjMsIDB4MzBCOCwgMHgwM0I0LCAweDMwQjksIDB4MDNCNSwgMHgzMEJBLAorICAgIDB4MDNCNiwgMHgzMEJCLCAweDAzQjcsIDB4MzBCQywgMHgwM0I4LCAweDMwQkQsIDB4MDNCOSwgMHgzMEJFLCAweDAzQkEsCisgICAgMHgzMEJGLCAweDAzQkIsIDB4MzBDMCwgMHgwM0JDLCAweDMwQzEsIDB4MDNCRCwgMHgzMEMyLCAweDAzQkUsIDB4MzBDMywKKyAgICAweDAzQkYsIDB4MzBDNCwgMHgwM0MwLCAweDMwQzUsIDB4MDNDMSwgMHgzMEM2LCAweDAzQzIsIDB4MzBDNywgMHgwM0MzLAorICAgIDB4MzBDOCwgMHgwM0M0LCAweDMwQzksIDB4MDNDNSwgMHgzMENBLCAweDAzQzYsIDB4MzBDQiwgMHgwM0M3LCAweDMwQ0MsCisgICAgMHgwM0M4LCAweDMwQ0QsIDB4MDNDOSwgMHgzMENFLCAweDAzQ0EsIDB4MzBDRiwgMHgwM0NCLCAweDMwRDAsIDB4MDNDQywKKyAgICAweDMwRDEsIDB4MDNDRCwgMHgzMEQyLCAweDAzQ0UsIDB4MzBEMywgMHgwM0NGLCAweDMwRDQsIDB4MDNEMCwgMHgzMEQ1LAorICAgIDB4MDNEMSwgMHgzMEQ2LCAweDAzRDIsIDB4MzBENywgMHgwM0QzLCAweDMwRDgsIDB4MDNENCwgMHgzMEQ5LCAweDAzRDUsCisgICAgMHgzMERBLCAweDAzRDYsIDB4MzBEQiwgMHgwM0Q3LCAweDMwREMsIDB4MDNEOCwgMHgzMERELCAweDAzRDksIDB4MzBERSwKKyAgICAweDAzREEsIDB4MzBERiwgMHgwM0RCLCAweDMwRTAsIDB4MDNEQywgMHgzMEUxLCAweDAzREQsIDB4MzBFMiwgMHgwM0RFLAorICAgIDB4MzBFMywgMHgwM0RGLCAweDMwRTQsIDB4MDNFMCwgMHgzMEU1LCAweDAzRTEsIDB4MzBFNiwgMHgwM0UyLCAweDMwRTcsCisgICAgMHgwM0UzLCAweDMwRTgsIDB4MDNFNCwgMHgzMEU5LCAweDAzRTUsIDB4MzBFQSwgMHgwM0U2LCAweDMwRUIsIDB4MDNFNywKKyAgICAweDMwRUMsIDB4MDNFOCwgMHgzMEVELCAweDAzRTksIDB4MzBFRSwgMHgwM0VBLCAweDMwRUYsIDB4MDNFQiwgMHgzMEYwLAorICAgIDB4MDNFQywgMHgzMEYxLCAweDAzRUQsIDB4MzBGMiwgMHgwM0VFLCAweDMwRjMsIDB4MDNFRiwgMHgzMEY0LCAweDAzRjAsCisgICAgMHgzMEY1LCAweDAzRjEsIDB4MzBGNiwgMHgwM0YyLCAweDMwRjcsIDB4MjA3OSwgMHgzMEY4LCAweDIwN0EsIDB4MzBGOSwKKyAgICAweDIwN0IsIDB4MzBGQSwgMHgyMDdDLCAweDMwRkIsIDB4MDI3RSwgMHgzMEZDLCAweDAyOTQsIDB4MzBGRCwgMHgwMjhCLAorICAgIDB4MzBGRSwgMHgwMjhDLCAweDMyMjAsIDB4Mjc4RSwgMHgzMjIxLCAweDI3OEYsIDB4MzIyMiwgMHgyNzkwLCAweDMyMjMsCisgICAgMHgyNzkxLCAweDMyMjQsIDB4Mjc5MiwgMHgzMjI1LCAweDI3OTMsIDB4MzIyNiwgMHgyNzk0LCAweDMyMjcsIDB4Mjc5NSwKKyAgICAweDMyMjgsIDB4Mjc5NiwgMHgzMjI5LCAweDI3OTcsIDB4MzIyQSwgMHgyMDA2LCAweDMyMkIsIDB4MjAwNywgMHgzMjJDLAorICAgIDB4MjAwOCwgMHgzMjJELCAweDIwMDksIDB4MzIyRSwgMHgyMDBBLCAweDMyMkYsIDB4MjAwQiwgMHgzMjMwLCAweDIwMDUsCisgICAgMHgzMjMxLCAweDFEQzIsIDB4MzIzMiwgMHgxREMzLCAweDMyMzMsIDB4MUZDRiwgMHgzMjM0LCAweDFGQ0QsIDB4MzIzNSwKKyAgICAweDFGRDQsIDB4MzIzNiwgMHgxRkQzLCAweDMyMzcsIDB4MjAwQywgMHgzMjM4LCAweDFGQ0UsIDB4MzIzOSwgMHgxREM0LAorICAgIDB4MzIzQSwgMHgxRkQ3LCAweDMyM0IsIDB4MUZENSwgMHgzMjNDLCAweDFGRDAsIDB4MzIzRCwgMHgxRkNCLCAweDMyM0UsCisgICAgMHgxRkQyLCAweDMyM0YsIDB4MUZDQywgMHgzMjQwLCAweDFGRDYsIDB4MzI0MSwgMHgyMDBELCAweDMyNDIsIDB4MUZEMSwKKyAgICAweDMyNDMsIDB4MUZDQSwgMHgzMjgwLCAweDI4REQsIDB4MzI4MSwgMHgyOERFLCAweDMyODIsIDB4MjhERiwgMHgzMjgzLAorICAgIDB4MjhFMCwgMHgzMjg0LCAweDI4RTEsIDB4MzI4NSwgMHgyOEUyLCAweDMyODYsIDB4MjhFMywgMHgzMjg3LCAweDI4RTQsCisgICAgMHgzMjg4LCAweDI4RTUsIDB4MzI4OSwgMHgyOEU2LCAweDMyOEEsIDB4MjhFOCwgMHgzMjhCLCAweDI4RTksIDB4MzI4QywKKyAgICAweDI4RUEsIDB4MzI4RCwgMHgyOEVCLCAweDMyOEUsIDB4MjhFQywgMHgzMjhGLCAweDI4RUQsIDB4MzI5MCwgMHgyOEU3LAorICAgIDB4MzI5MSwgMHgxRkUxLCAweDMyOTIsIDB4MUZFMCwgMHgzMjkzLCAweDFGRTIsIDB4MzI5NCwgMHgxRkRDLCAweDMyOTUsCisgICAgMHgyOEZGLCAweDMyOTYsIDB4MUZFNSwgMHgzMjk3LCAweDI4RkMsIDB4MzI5OCwgMHgxRkRFLCAweDMyOTksIDB4MjAxRiwKKyAgICAweDMyOUEsIDB4MjhGOSwgMHgzMjlCLCAweDI4RjgsIDB4MzI5QywgMHgyOEZFLCAweDMyOUQsIDB4MjA3RiwgMHgzMjlFLAorICAgIDB4MUZGRiwgMHgzMjlGLCAweDI4RUYsIDB4MzJBMCwgMHgyOEY2LCAweDMyQTEsIDB4MjhGNywgMHgzMkEyLCAweDI4RkIsCisgICAgMHgzMkEzLCAweDI4RkEsIDB4MzJBNCwgMHgxREJELCAweDMyQTUsIDB4MURCRSwgMHgzMkE2LCAweDFEQkYsIDB4MzJBNywKKyAgICAweDFEQzAsIDB4MzJBOCwgMHgxREMxLCAweDMyQTksIDB4MUZEQSwgMHgzMkFBLCAweDFGREQsIDB4MzJBQiwgMHgxRkRGLAorICAgIDB4MzJBQywgMHgxRkUzLCAweDMyQUQsIDB4MUZEOSwgMHgzMkFFLCAweDFGRTQsIDB4MzJBRiwgMHgxRkRCLCAweDMyQjAsCisgICAgMHgxRkQ4LCAweDMyRDAsIDB4MjhBRCwgMHgzMkQxLCAweDI4QUUsIDB4MzJEMiwgMHgyOEFGLCAweDMyRDMsIDB4MjhCMCwKKyAgICAweDMyRDQsIDB4MjhCMSwgMHgzMkQ1LCAweDI4QjIsIDB4MzJENiwgMHgyOEIzLCAweDMyRDcsIDB4MjhCNCwgMHgzMkQ4LAorICAgIDB4MjhCNSwgMHgzMkQ5LCAweDI4QjYsIDB4MzJEQSwgMHgyOEI3LCAweDMyREIsIDB4MjhCOCwgMHgzMkRDLCAweDI4QjksCisgICAgMHgzMkRELCAweDI4QkEsIDB4MzJERSwgMHgyOEJCLCAweDMyREYsIDB4MjhCQywgMHgzMkUwLCAweDI4QkQsIDB4MzJFMSwKKyAgICAweDI4QkUsIDB4MzJFMiwgMHgyOEJGLCAweDMyRTMsIDB4MjhDMCwgMHgzMkU0LCAweDI4QzEsIDB4MzJFNSwgMHgyOEMyLAorICAgIDB4MzJFNiwgMHgyOEMzLCAweDMyRTcsIDB4MjhDNCwgMHgzMkU4LCAweDI4QzUsIDB4MzJFOSwgMHgyOEM2LCAweDMyRUEsCisgICAgMHgyOEM3LCAweDMyRUIsIDB4MjhDOCwgMHgzMkVDLCAweDI4QzksIDB4MzJFRCwgMHgyOENBLCAweDMyRUUsIDB4MjhDQiwKKyAgICAweDMyRUYsIDB4MjhDQywgMHgzMkYwLCAweDI4Q0QsIDB4MzJGMSwgMHgyOENFLCAweDMyRjIsIDB4MjhDRiwgMHgzMkYzLAorICAgIDB4MjhEMCwgMHgzMkY0LCAweDI4RDEsIDB4MzJGNSwgMHgyOEQyLCAweDMyRjYsIDB4MjhEMywgMHgzMkY3LCAweDI4RDQsCisgICAgMHgzMkY4LCAweDI4RDUsIDB4MzJGOSwgMHgyOEQ2LCAweDMyRkEsIDB4MjhENywgMHgzMkZCLCAweDI4RDgsIDB4MzJGQywKKyAgICAweDI4RDksIDB4MzJGRCwgMHgyOERBLCAweDMyRkUsIDB4MjhEQiwgMHgzMzAwLCAweDFGNzAsIDB4MzMwMSwgMHgyRTYyLAorICAgIDB4MzMwMiwgMHgyRTYzLCAweDMzMDMsIDB4MUY2QSwgMHgzMzA0LCAweDJFNjQsIDB4MzMwNSwgMHgxRkY3LCAweDMzMDYsCisgICAgMHgyRTY1LCAweDMzMDcsIDB4MkU2OSwgMHgzMzA4LCAweDJFNjcsIDB4MzMwOSwgMHgyRTZDLCAweDMzMEEsIDB4MkU2QSwKKyAgICAweDMzMEIsIDB4MkU2RSwgMHgzMzBDLCAweDJFNzAsIDB4MzMwRCwgMHgxREFCLCAweDMzMEUsIDB4MkU3MSwgMHgzMzBGLAorICAgIDB4MkU3MiwgMHgzMzEwLCAweDJFNzMsIDB4MzMxMSwgMHgyRTc0LCAweDMzMTIsIDB4MkU3NSwgMHgzMzEzLCAweDJFNzYsCisgICAgMHgzMzE0LCAweDFEQTIsIDB4MzMxNSwgMHgxRjY5LCAweDMzMTYsIDB4MUY2NywgMHgzMzE3LCAweDJFNzgsIDB4MzMxOCwKKyAgICAweDFGNjgsIDB4MzMxOSwgMHgyRTdBLCAweDMzMUEsIDB4MkU3QywgMHgzMzFCLCAweDJFN0QsIDB4MzMxQywgMHgyRTdFLAorICAgIDB4MzMxRCwgMHgyRTdGLCAweDMzMUUsIDB4MUY3MywgMHgzMzFGLCAweDJFODAsIDB4MzMyMCwgMHgyRTgxLCAweDMzMjEsCisgICAgMHgyRTgyLCAweDMzMjIsIDB4MUY2NiwgMHgzMzIzLCAweDFGNkIsIDB4MzMyNCwgMHgyRTgzLCAweDMzMjUsIDB4MkU4NSwKKyAgICAweDMzMjYsIDB4MURBQywgMHgzMzI3LCAweDFEQTYsIDB4MzMyOCwgMHgyRTg4LCAweDMzMjksIDB4MkU4OSwgMHgzMzJBLAorICAgIDB4MUY3NCwgMHgzMzJCLCAweDFEQUUsIDB4MzMyRCwgMHgyRThCLCAweDMzMkUsIDB4MkU4RSwgMHgzMzJGLCAweDJFOEYsCisgICAgMHgzMzMwLCAweDJFOTAsIDB4MzMzMSwgMHgxRjcxLCAweDMzMzIsIDB4MkU5MSwgMHgzMzMzLCAweDIwODcsIDB4MzMzNCwKKyAgICAweDJFOTQsIDB4MzMzNSwgMHgyRTk1LCAweDMzMzYsIDB4MURBOCwgMHgzMzM3LCAweDJFOUEsIDB4MzMzOCwgMHgyRTlDLAorICAgIDB4MzMzOSwgMHgxRjZFLCAweDMzM0EsIDB4MkU5RCwgMHgzMzNCLCAweDFGNkYsIDB4MzMzQywgMHgyRTk2LCAweDMzM0QsCisgICAgMHgyRTlFLCAweDMzM0UsIDB4MkVBMCwgMHgzMzNGLCAweDJFQTEsIDB4MzM0MCwgMHgyRUEyLCAweDMzNDEsIDB4MkU5RiwKKyAgICAweDMzNDIsIDB4MUY2RCwgMHgzMzQzLCAweDJFQTMsIDB4MzM0NCwgMHgyRUE0LCAweDMzNDUsIDB4MkVBNSwgMHgzMzQ2LAorICAgIDB4MkVBNiwgMHgzMzQ3LCAweDFGNzIsIDB4MzM0OCwgMHgyRUE3LCAweDMzNDksIDB4MURBMSwgMHgzMzRBLCAweDFEQUYsCisgICAgMHgzMzRCLCAweDJFQTgsIDB4MzM0QywgMHgyRUE5LCAweDMzNEQsIDB4MURBNCwgMHgzMzRFLCAweDIwODgsIDB4MzM0RiwKKyAgICAweDJFQUEsIDB4MzM1MCwgMHgyRUFCLCAweDMzNTEsIDB4MURBOSwgMHgzMzUyLCAweDJFQUUsIDB4MzM1MywgMHgyRUIyLAorICAgIDB4MzM1NCwgMHgyRUFGLCAweDMzNTUsIDB4MkVCMywgMHgzMzU2LCAweDJFQjQsIDB4MzM1NywgMHgxRjZDLCAweDMzNzEsCisgICAgMHgyRTU1LCAweDMzN0IsIDB4MjA4MywgMHgzMzdDLCAweDFEQzcsIDB4MzM3RCwgMHgxREM2LCAweDMzN0UsIDB4MURDNSwKKyAgICAweDMzN0YsIDB4MUY3NiwgMHgzMzg1LCAweDFGNUYsIDB4MzM4NiwgMHgxRjYwLCAweDMzODcsIDB4MUY2MSwgMHgzMzg4LAorICAgIDB4MjAwMCwgMHgzMzg5LCAweDIwMDEsIDB4MzM4RCwgMHgyRTU4LCAweDMzOEUsIDB4MURCNCwgMHgzMzhGLCAweDFEQjUsCisgICAgMHgzMzkwLCAweDFGNjMsIDB4MzM5NiwgMHgxRjY1LCAweDMzOTcsIDB4MUY1OCwgMHgzMzk4LCAweDFGNUEsIDB4MzM5QiwKKyAgICAweDJFNTksIDB4MzM5QywgMHgxREIxLCAweDMzOUQsIDB4MURCMiwgMHgzMzlFLCAweDFEQjMsIDB4MzM5RiwgMHgxRkZBLAorICAgIDB4MzNBMCwgMHgxRjU0LCAweDMzQTEsIDB4MURCNywgMHgzM0EyLCAweDFGNTUsIDB4MzNBMywgMHgxRkZCLCAweDMzQTQsCisgICAgMHgxRjU2LCAweDMzQTUsIDB4MUY1NywgMHgzM0E2LCAweDFGRkMsIDB4MzNCMCwgMHgxRjVFLCAweDMzQjEsIDB4MUY1RCwKKyAgICAweDMzQjIsIDB4MUY1QywgMHgzM0IzLCAweDFGNUIsIDB4MzNDMiwgMHgyRTUwLCAweDMzQzQsIDB4MURCNiwgMHgzM0M4LAorICAgIDB4MjAwMiwgMHgzM0NCLCAweDFGNjIsIDB4MzNDQywgMHgxRkY2LCAweDMzQ0QsIDB4MURCQiwgMHgzM0Q0LCAweDFGNjQsCisgICAgMHgzM0Q3LCAweDJFNUQsIDB4MzNEOCwgMHgyRTVFLCAweDMzREEsIDB4MkU0QiwgMHgzNDAyLCAweDM1ODIsIDB4MzQwNSwKKyAgICAweDNDMUIsIDB4MzQyNywgMHgzNjU2LCAweDM0ODgsIDB4M0M1MiwgMHgzNERCLCAweDNDNDEsIDB4MzUxRiwgMHgzNjI5LAorICAgIDB4MzUzRSwgMHgzNzFFLCAweDM3OEQsIDB4MzYxQSwgMHgzN0UyLCAweDM3MkIsIDB4M0FGMywgMHgzQzQwLCAweDNCMjIsCisgICAgMHgzQzQ5LCAweDNCODgsIDB4MzY4RCwgMHgzRThBLCAweDNDNDMsIDB4M0VEQSwgMHgzQzQ4LCAweDNGQjEsIDB4Mzc1NCwKKyAgICAweDQwOTMsIDB4M0M0QywgMHg0MTAzLCAweDNDNEYsIDB4NDI2NCwgMHgzNzYwLCAweDQyOTMsIDB4M0M1MCwgMHg0NDBDLAorICAgIDB4M0M0MiwgMHg0NDUzLCAweDM3NzMsIDB4NDU3QSwgMHgzQzRCLCAweDQ2NjUsIDB4M0M0RSwgMHg0NkFFLCAweDNDNTEsCisgICAgMHg0QkU4LCAweDNDNDYsIDB4NEUwMCwgMHgwNEIwLCAweDRFMDEsIDB4MEJCOCwgMHg0RTAzLCAweDA4RTMsIDB4NEUwNCwKKyAgICAweDM3RDgsIDB4NEUwNSwgMHgzN0Q5LCAweDRFMDcsIDB4MEVBQSwgMHg0RTA4LCAweDA5Q0UsIDB4NEUwOSwgMHgwODdFLAorICAgIDB4NEUwQSwgMHgwOUNELCAweDRFMEIsIDB4MDUzQywgMHg0RTBELCAweDBEQzYsIDB4NEUwRSwgMHgwRjI5LCAweDRFMTAsCisgICAgMHgwRkZCLCAweDRFMTEsIDB4MDREMSwgMHg0RTE0LCAweDA1Q0MsIDB4NEUxNSwgMHgwRkZDLCAweDRFMTYsIDB4MEE0OCwKKyAgICAweDRFMTcsIDB4MTBENywgMHg0RTE4LCAweDA2NzAsIDB4NEUxOSwgMHgwRTBBLCAweDRFMUUsIDB4MDlDRiwgMHg0RTFGLAorICAgIDB4MzdEQSwgMHg0RTIxLCAweDBGODYsIDB4NEUyNiwgMHgwRTEyLCAweDRFMjgsIDB4MjBCMywgMHg0RTJBLCAweDBGRkQsCisgICAgMHg0RTJCLCAweDM3REIsIDB4NEUyQywgMHgzNzRELCAweDRFMkQsIDB4MEJBNCwgMHg0RTJGLCAweDM3REMsIDB4NEUzMCwKKyAgICAweDM3REQsIDB4NEUzMSwgMHgwRkZFLCAweDRFMzIsIDB4MDZGMiwgMHg0RTM2LCAweDBGRkYsIDB4NEUzNywgMHgzNjlELAorICAgIDB4NEUzOCwgMHgwNjE5LCAweDRFMzksIDB4MEI2RSwgMHg0RTNCLCAweDA5MTMsIDB4NEUzQywgMHgxMDAwLCAweDRFM0YsCisgICAgMHgxMDAxLCAweDRFNDAsIDB4MzdERSwgMHg0RTQxLCAweDM3REYsIDB4NEU0MiwgMHgxMDAyLCAweDRFNDMsIDB4MENFQiwKKyAgICAweDRFNDQsIDB4MzdFMCwgMHg0RTQ1LCAweDA2NzEsIDB4NEU0OCwgMHgzNzJFLCAweDRFNEIsIDB4MENFRCwgMHg0RTRELAorICAgIDB4MENCQiwgMHg0RTRFLCAweDA3NzcsIDB4NEU0RiwgMHgwRTYxLCAweDRFNTUsIDB4MTk1MCwgMHg0RTU2LCAweDEwMDMsCisgICAgMHg0RTU3LCAweDA5RDAsIDB4NEU1OCwgMHgxMDA0LCAweDRFNTksIDB4MDUzNSwgMHg0RTVBLCAweDM3RTEsIDB4NEU1RCwKKyAgICAweDA2REQsIDB4NEU1RSwgMHgwN0E0LCAweDRFNUYsIDB4MEVGNSwgMHg0RTYyLCAweDEyMzMsIDB4NEU3MSwgMHgwRjVBLAorICAgIDB4NEU3MywgMHgwQ0Q1LCAweDRFN0UsIDB4MDVFMSwgMHg0RTdGLCAweDM3RTIsIDB4NEU4MCwgMHgwNjRGLCAweDRFODIsCisgICAgMHgxMDA1LCAweDRFODUsIDB4MTAwNiwgMHg0RTg2LCAweDBGODMsIDB4NEU4OCwgMHgwRjI3LCAweDRFODksIDB4MEFFQSwKKyAgICAweDRFOEEsIDB4MTAwOCwgMHg0RThCLCAweDA4QzQsIDB4NEU4QywgMHgwQ0NCLCAweDRFOEQsIDB4MzdFMywgMHg0RThFLAorICAgIDB4MTAwQiwgMHg0RTkxLCAweDA0RTAsIDB4NEU5MiwgMHgwNzkzLCAweDRFOTQsIDB4MDc5MiwgMHg0RTk1LCAweDA0QUEsCisgICAgMHg0RTk2LCAweDM3RTQsIDB4NEU5OCwgMHgwRkYxLCAweDRFOTksIDB4MEZGMCwgMHg0RTlCLCAweDA4MjMsIDB4NEU5QywKKyAgICAweDA0NjUsIDB4NEU5RSwgMHgxMDBDLCAweDRFOUYsIDB4MTAwRCwgMHg0RUEwLCAweDEwMEUsIDB4NEVBMSwgMHgwRTYyLAorICAgIDB4NEVBMiwgMHgxMDBGLCAweDRFQTQsIDB4MDdBNiwgMHg0RUE1LCAweDA0QUIsIDB4NEVBNiwgMHgwRUEwLCAweDRFQTgsCisgICAgMHgwNjk2LCAweDRFQUIsIDB4MDY5NywgMHg0RUFDLCAweDA2OTgsIDB4NEVBRCwgMHgwQkZFLCAweDRFQUUsIDB4MEY4NCwKKyAgICAweDRFQjAsIDB4MTAxMCwgMHg0RUIzLCAweDEwMTEsIDB4NEVCNiwgMHgxMDEyLCAweDRFQjksIDB4MzdFNSwgMHg0RUJBLAorICAgIDB4MEExMywgMHg0RUJCLCAweDM2MjAsIDB4NEVDMCwgMHgwOTQ0LCAweDRFQzEsIDB4MEExNCwgMHg0RUMyLCAweDEwMTcsCisgICAgMHg0RUM0LCAweDEwMTUsIDB4NEVDNiwgMHgxMDE2LCAweDRFQzcsIDB4MDY3MiwgMHg0RUNBLCAweDA4MTMsIDB4NEVDQiwKKyAgICAweDA1NzAsIDB4NEVDRCwgMHgxMDE0LCAweDRFQ0UsIDB4MTAxMywgMHg0RUNGLCAweDBERjksIDB4NEVEMCwgMHgzN0U2LAorICAgIDB4NEVENCwgMHgwODk0LCAweDRFRDUsIDB4MDg5MywgMHg0RUQ2LCAweDBCMUUsIDB4NEVENywgMHgxMDE4LCAweDRFRDgsCisgICAgMHgwREM3LCAweDRFRDksIDB4MEE4QiwgMHg0RURELCAweDAyOTAsIDB4NEVERSwgMHgxMDE5LCAweDRFREYsIDB4MTAxQiwKKyAgICAweDRFRTAsIDB4MzdFNywgMHg0RUUxLCAweDIwQjQsIDB4NEVFMywgMHgwQjQ1LCAweDRFRTQsIDB4MEZBOSwgMHg0RUU1LAorICAgIDB4MDQ4RSwgMHg0RUVELCAweDEwMUEsIDB4NEVFRSwgMHgwNTNFLCAweDRFRjAsIDB4MDZCQywgMHg0RUYyLCAweDBCQTUsCisgICAgMHg0RUY2LCAweDA3NDUsIDB4NEVGNywgMHgxMDFDLCAweDRFRkIsIDB4MENEQSwgMHg0RUZDLCAweDIwQjUsIDB4NEVGRCwKKyAgICAweDM3RTgsIDB4NEVGRiwgMHgzN0U5LCAweDRGMDAsIDB4MjBCNiwgMHg0RjAxLCAweDA2MjcsIDB4NEYwMywgMHgyMEI3LAorICAgIDB4NEYwOSwgMHgxMDFELCAweDRGMEEsIDB4MDQ4RiwgMHg0RjBCLCAweDM3RUEsIDB4NEYwRCwgMHgwNzk0LCAweDRGMEUsCisgICAgMHgwNjI4LCAweDRGMEYsIDB4MERFQywgMHg0RjEwLCAweDBENDYsIDB4NEYxMSwgMHgwNjczLCAweDRGMTUsIDB4MzdFQiwKKyAgICAweDRGMUEsIDB4MDU3MSwgMHg0RjFDLCAweDEwNDAsIDB4NEYxRCwgMHgwQzNCLCAweDRGMkYsIDB4MEQyMiwgMHg0RjMwLAorICAgIDB4MTAxRiwgMHg0RjM0LCAweDBENTAsIDB4NEYzNiwgMHgwRkFBLCAweDRGMzgsIDB4MDlGMywgMHg0RjM5LCAweDIwQjgsCisgICAgMHg0RjNBLCAweDA4OTUsIDB4NEYzQiwgMHgzN0VELCAweDRGM0MsIDB4MDhDNSwgMHg0RjNELCAweDA1NDAsIDB4NEY0MywKKyAgICAweDBCRUQsIDB4NEY0NiwgMHgwQjYwLCAweDRGNDcsIDB4MTAyMywgMHg0RjQ5LCAweDM3RUUsIDB4NEY0RCwgMHgwNDkwLAorICAgIDB4NEY0RSwgMHgwQkZGLCAweDRGNEYsIDB4MDk0NSwgMHg0RjUwLCAweDA4MjQsIDB4NEY1MSwgMHgwRjBFLCAweDRGNTMsCisgICAgMHgwQjJFLCAweDRGNTQsIDB4MzdFRiwgMHg0RjU1LCAweDA1M0YsIDB4NEY1NiwgMHgyMEI5LCAweDRGNTcsIDB4MTAyMiwKKyAgICAweDRGNTksIDB4MEYyOCwgMHg0RjVBLCAweDEwMUUsIDB4NEY1QiwgMHgxMDIwLCAweDRGNUMsIDB4MDg1RSwgMHg0RjVELAorICAgIDB4MTAyMSwgMHg0RjVFLCAweDExRDMsIDB4NEY2MCwgMHgzN0VDLCAweDRGNjksIDB4MTAyOSwgMHg0RjZGLCAweDEwMkMsCisgICAgMHg0RjcwLCAweDEwMkEsIDB4NEY3MywgMHgwNTQyLCAweDRGNzUsIDB4MEUwQiwgMHg0Rjc2LCAweDEwMjQsIDB4NEY3QSwKKyAgICAweDM3RjAsIDB4NEY3QiwgMHgxMDI4LCAweDRGN0MsIDB4MDdBNywgMHg0RjdELCAweDM3RjEsIDB4NEY3RSwgMHgzN0YyLAorICAgIDB4NEY3RiwgMHgwODk2LCAweDRGODMsIDB4MDVFMiwgMHg0Rjg2LCAweDEwMkQsIDB4NEY4OCwgMHgxMDI1LCAweDRGOEEsCisgICAgMHgyMEJCLCAweDRGOEIsIDB4MEZBQiwgMHg0RjhELCAweDA4QzYsIDB4NEY4RiwgMHgxMDI2LCAweDRGOTEsIDB4MTAyQiwKKyAgICAweDRGOTIsIDB4MjBCQSwgMHg0Rjk0LCAweDIwQkQsIDB4NEY5NiwgMHgxMDJFLCAweDRGOTcsIDB4MzdGMywgMHg0Rjk4LAorICAgIDB4MTAyNywgMHg0RjlBLCAweDIwQkMsIDB4NEY5QiwgMHgwNjk5LCAweDRGOUQsIDB4MDQ5MSwgMHg0RkEwLCAweDA2OUEsCisgICAgMHg0RkExLCAweDA1NDEsIDB4NEZBQiwgMHgxMUQ0LCAweDRGQUQsIDB4MEVBNywgMHg0RkFFLCAweDBERTAsIDB4NEZBRiwKKyAgICAweDA3QTgsIDB4NEZCNSwgMHgwOUY1LCAweDRGQjYsIDB4MEY3RiwgMHg0RkJFLCAweDM3RjQsIDB4NEZCRiwgMHgwRTI4LAorICAgIDB4NEZDMiwgMHgwNzBFLCAweDRGQzMsIDB4MEIwNSwgMHg0RkM0LCAweDA1NjQsIDB4NEZDOSwgMHgyMEFDLCAweDRGQ0EsCisgICAgMHgwOTVELCAweDRGQ0QsIDB4MjBCRSwgMHg0RkNFLCAweDEwMzIsIDB4NEZDRiwgMHgzN0Y1LCAweDRGRDAsIDB4MTAzNywKKyAgICAweDRGRDEsIDB4MTAzNSwgMHg0RkQzLCAweDNDMkYsIDB4NEZENCwgMHgxMDMwLCAweDRGRDcsIDB4MEIwRiwgMHg0RkQ4LAorICAgIDB4MTAzMywgMHg0RkRBLCAweDEwMzYsIDB4NEZEQiwgMHgxMDM0LCAweDRGREQsIDB4MEUyRCwgMHg0RkRGLCAweDEwMzEsCisgICAgMHg0RkUwLCAweDFERUMsIDB4NEZFMSwgMHgwOUY0LCAweDRGRTMsIDB4MEVBMSwgMHg0RkU0LCAweDEwMzgsIDB4NEZFNSwKKyAgICAweDEwMzksIDB4NEZFRSwgMHgwOTJFLCAweDRGRUYsIDB4MTA0NiwgMHg0RkYzLCAweDBEMDYsIDB4NEZGNSwgMHgwREE4LAorICAgIDB4NEZGNiwgMHgxMDQxLCAweDRGRjgsIDB4MEU0MCwgMHg0RkZBLCAweDA1MzYsIDB4NEZGRCwgMHgzN0Y2LCAweDRGRkUsCisgICAgMHgxMDQ1LCAweDRGRkYsIDB4MjBDMSwgMHg1MDAwLCAweDM3RjcsIDB4NTAwMSwgMHgzN0Y4LCAweDUwMDIsIDB4MzQ0NywKKyAgICAweDUwMDUsIDB4MTAzRiwgMHg1MDA2LCAweDEwNDgsIDB4NTAwOSwgMHgwQUQ0LCAweDUwMEIsIDB4MDc3OCwgMHg1MDBELAorICAgIDB4MEQxMiwgMHg1MDBGLCAweDE2MDAsIDB4NTAxMCwgMHgzN0Y5LCAweDUwMTEsIDB4MTA0NywgMHg1MDEyLCAweDBDNTcsCisgICAgMHg1MDE0LCAweDEwM0MsIDB4NTAxNiwgMHgwN0FBLCAweDUwMTksIDB4MDdBOSwgMHg1MDFBLCAweDEwM0EsIDB4NTAxQiwKKyAgICAweDM3RkEsIDB4NTAxRSwgMHgyMEMyLCAweDUwMUYsIDB4MDkwNiwgMHg1MDIxLCAweDEwNDIsIDB4NTAyMiwgMHgyMEMwLAorICAgIDB4NTAyMywgMHgwRTNGLCAweDUwMjQsIDB4MEI4QiwgMHg1MDI1LCAweDEwM0UsIDB4NTAyNiwgMHgwNzQ3LCAweDUwMjcsCisgICAgMHgzN0ZCLCAweDUwMjgsIDB4MTAzQiwgMHg1MDI5LCAweDEwNDMsIDB4NTAyQSwgMHgxMDNELCAweDUwMkIsIDB4MEY5OSwKKyAgICAweDUwMkMsIDB4MTA0NCwgMHg1MDJELCAweDBGRTcsIDB4NTAyRSwgMHgzN0ZDLCAweDUwMzYsIDB4MDZERSwgMHg1MDM5LAorICAgIDB4MDc0NiwgMHg1MDNCLCAweDM4MDAsIDB4NTA0MCwgMHgyMEJGLCAweDUwNDIsIDB4MjBDNSwgMHg1MDQzLCAweDEwNDksCisgICAgMHg1MDQ2LCAweDIwQzMsIDB4NTA0NywgMHgxMDRBLCAweDUwNDgsIDB4MTA0RSwgMHg1MDQ5LCAweDA0OTIsIDB4NTA0RiwKKyAgICAweDBFMjAsIDB4NTA1MCwgMHgxMDRELCAweDUwNTUsIDB4MTA0QywgMHg1MDU2LCAweDEwNTAsIDB4NTA1NywgMHgzN0ZELAorICAgIDB4NTA1QSwgMHgxMDRGLCAweDUwNUMsIDB4MEMwMCwgMHg1MDY1LCAweDA3NDgsIDB4NTA2NiwgMHgzN0ZFLCAweDUwNkEsCisgICAgMHgzN0ZGLCAweDUwNkMsIDB4MTA1MSwgMHg1MDcwLCAweDIwQzQsIDB4NTA3MiwgMHgwOEYxLCAweDUwNzQsIDB4MEIwNiwKKyAgICAweDUwNzUsIDB4MEMwMSwgMHg1MDc2LCAweDA2RUUsIDB4NTA3OCwgMHgxMDUyLCAweDUwN0QsIDB4MDY1MCwgMHg1MDgwLAorICAgIDB4MTA1MywgMHg1MDg1LCAweDEwNTUsIDB4NTA4RCwgMHgwRTYzLCAweDUwOEYsIDB4MzgwMSwgMHg1MDkxLCAweDA3M0MsCisgICAgMHg1MDk0LCAweDIwQzYsIDB4NTA5NiwgMHgzODAyLCAweDUwOTgsIDB4MDg3RiwgMHg1MDk5LCAweDBEOEIsIDB4NTA5QSwKKyAgICAweDEwNTQsIDB4NTA5QywgMHgzODAzLCAweDUwQUMsIDB4MDgzNSwgMHg1MEFELCAweDBGMkQsIDB4NTBCMiwgMHgxMDU3LAorICAgIDB4NTBCMywgMHgxMDVBLCAweDUwQjQsIDB4MTA1NiwgMHg1MEI1LCAweDA4MzQsIDB4NTBCNywgMHgwOTg3LCAweDUwQkUsCisgICAgMHgwNzBGLCAweDUwQzIsIDB4MTA1QiwgMHg1MEM1LCAweDA2QzcsIDB4NTBDOSwgMHgxMDU4LCAweDUwQ0EsIDB4MTA1OSwKKyAgICAweDUwQ0MsIDB4MzgwNCwgMHg1MENELCAweDBDODcsIDB4NTBDRiwgMHgwQUZFLCAweDUwRDEsIDB4MDY5QiwgMHg1MEQ1LAorICAgIDB4MEU3QiwgMHg1MEQ2LCAweDEwNUMsIDB4NTBEOCwgMHgyMEM4LCAweDUwRDksIDB4M0MzMCwgMHg1MERBLCAweDBGODUsCisgICAgMHg1MERFLCAweDEwNUQsIDB4NTBFMywgMHgxMDYwLCAweDUwRTUsIDB4MTA1RSwgMHg1MEU2LCAweDM4MDUsIDB4NTBFNywKKyAgICAweDBBRDAsIDB4NTBFOSwgMHgzODA2LCAweDUwRUQsIDB4MTA1RiwgMHg1MEVFLCAweDEwNjEsIDB4NTBFRiwgMHgzODA3LAorICAgIDB4NTBGMCwgMHgzQzMxLCAweDUwRjQsIDB4MjBDNywgMHg1MEY1LCAweDEwNjMsIDB4NTBGOSwgMHgxMDYyLCAweDUwRkIsCisgICAgMHgwRTE4LCAweDUxMDAsIDB4MDY1MSwgMHg1MTAxLCAweDEwNjUsIDB4NTEwMiwgMHgxMDY2LCAweDUxMDQsIDB4MDUyRiwKKyAgICAweDUxMDgsIDB4MzgwOCwgMHg1MTA5LCAweDEwNjQsIDB4NTEwQiwgMHgzODA5LCAweDUxMTAsIDB4MzgwQSwgMHg1MTEyLAorICAgIDB4MDkyMCwgMHg1MTE0LCAweDEwNjksIDB4NTExNSwgMHgxMDY4LCAweDUxMTYsIDB4MTA2NywgMHg1MTE4LCAweDEwMkYsCisgICAgMHg1MTFBLCAweDEwNkEsIDB4NTExQiwgMHgzODBCLCAweDUxMUUsIDB4MzgwQywgMHg1MTFGLCAweDA5ODgsIDB4NTEyMSwKKyAgICAweDEwNkIsIDB4NTEyQSwgMHgwRjBGLCAweDUxMzIsIDB4MEVFNSwgMHg1MTM3LCAweDEwNkQsIDB4NTEzQSwgMHgxMDZDLAorICAgIDB4NTEzQiwgMHgxMDZGLCAweDUxM0MsIDB4MTA2RSwgMHg1MTNGLCAweDEwNzAsIDB4NTE0MCwgMHgxMDcxLCAweDUxNDEsCisgICAgMHgwNEI4LCAweDUxNDMsIDB4MDc2OSwgMHg1MTQ0LCAweDA3MTEsIDB4NTE0NSwgMHgwOTQ2LCAweDUxNDYsIDB4MEJCOSwKKyAgICAweDUxNDcsIDB4MDY5QywgMHg1MTQ4LCAweDBBOEMsIDB4NTE0OSwgMHgwN0FCLCAweDUxNEEsIDB4MjBDOSwgMHg1MTRCLAorICAgIDB4MDgwMCwgMHg1MTRDLCAweDEwNzMsIDB4NTE0RCwgMHgwRUQ0LCAweDUxNEUsIDB4MEM0MCwgMHg1MTUwLCAweDA4QzcsCisgICAgMHg1MTUyLCAweDEwNzIsIDB4NTE1NCwgMHgxMDc0LCAweDUxNUEsIDB4MEM1OCwgMHg1MTVDLCAweDA1RDMsIDB4NTE1RiwKKyAgICAweDM4MEQsIDB4NTE2MiwgMHgxMDc1LCAweDUxNjQsIDB4MjBDQSwgMHg1MTY1LCAweDBDRDYsIDB4NTE2NywgMHgzNjhFLAorICAgIDB4NTE2OCwgMHgwQUI2LCAweDUxNjksIDB4MTA3NywgMHg1MTZBLCAweDEwNzgsIDB4NTE2QiwgMHgwRDQwLCAweDUxNkMsCisgICAgMHgwN0FDLCAweDUxNkQsIDB4MEZFMSwgMHg1MTZFLCAweDEwNzksIDB4NTE3MSwgMHgwNjlFLCAweDUxNzUsIDB4MEUwQywKKyAgICAweDUxNzYsIDB4MEIxNiwgMHg1MTc3LCAweDA2RTksIDB4NTE3OCwgMHgwQzJGLCAweDUxNzksIDB4Mzc3OSwgMHg1MTdDLAorICAgIDB4MDc0OSwgMHg1MTgwLCAweDEwN0EsIDB4NTE4MiwgMHgxMDdCLCAweDUxODUsIDB4MENCQSwgMHg1MTg2LCAweDA1MDEsCisgICAgMHg1MTg5LCAweDEwN0UsIDB4NTE4QSwgMHgwODZELCAweDUxOEMsIDB4MTA3RCwgMHg1MThELCAweDA4MzYsIDB4NTE4RiwKKyAgICAweDEwN0YsIDB4NTE5MCwgMHgxODVCLCAweDUxOTEsIDB4MTA4MCwgMHg1MTkyLCAweDBFNkYsIDB4NTE5MywgMHgxMDgxLAorICAgIDB4NTE5NSwgMHgxMDgyLCAweDUxOTYsIDB4MTA4MywgMHg1MTk3LCAweDA5RDEsIDB4NTE5OSwgMHgwOEY4LCAweDUxOUQsCisgICAgMHgyMENCLCAweDUxQTAsIDB4MDVFMywgMHg1MUExLCAweDM4MEUsIDB4NTFBMiwgMHgxMDg2LCAweDUxQTQsIDB4MTA4NCwKKyAgICAweDUxQTUsIDB4MEVDOSwgMHg1MUE2LCAweDEwODUsIDB4NTFBOCwgMHgwRENDLCAweDUxQTksIDB4MTA4NywgMHg1MUFBLAorICAgIDB4MTA4OCwgMHg1MUFCLCAweDEwODksIDB4NTFBQywgMHgwQzU5LCAweDUxQjAsIDB4MTA4RCwgMHg1MUIxLCAweDEwOEIsCisgICAgMHg1MUIyLCAweDEwOEMsIDB4NTFCMywgMHgxMDhBLCAweDUxQjQsIDB4MDg1MywgMHg1MUI1LCAweDEwOEUsIDB4NTFCNiwKKyAgICAweDBFRjYsIDB4NTFCNywgMHgwRkFDLCAweDUxQkMsIDB4MzgwRiwgMHg1MUJELCAweDEwOEYsIDB4NTFCRSwgMHgyMENDLAorICAgIDB4NTFDMywgMHgzQzMyLCAweDUxQzQsIDB4MEE0QywgMHg1MUM1LCAweDEwOTAsIDB4NTFDNiwgMHgwOTY0LCAweDUxQzksCisgICAgMHgxMDkxLCAweDUxQ0IsIDB4MEJCQSwgMHg1MUNDLCAweDBGODcsIDB4NTFDRCwgMHgwQzVBLCAweDUxRDYsIDB4MTBEQSwKKyAgICAweDUxREIsIDB4MTA5MiwgMHg1MURDLCAweDIwNUMsIDB4NTFERCwgMHgwNkJELCAweDUxREUsIDB4MzgxMCwgMHg1MUUwLAorICAgIDB4MTA5MywgMHg1MUUxLCAweDBFOEMsIDB4NTFFNiwgMHgwOTcyLCAweDUxRTcsIDB4MEI1QywgMHg1MUU5LCAweDEwOTUsCisgICAgMHg1MUVBLCAweDBDQkMsIDB4NTFFQywgMHgyMENELCAweDUxRUQsIDB4MTA5NiwgMHg1MUVFLCAweDM4MTEsIDB4NTFGMCwKKyAgICAweDEwOTcsIDB4NTFGMSwgMHgwNThDLCAweDUxRjQsIDB4MzgxMiwgMHg1MUY1LCAweDEwOTgsIDB4NTFGNiwgMHgwNjlGLAorICAgIDB4NTFGOCwgMHgwQ0E0LCAweDUxRjksIDB4MDUxQywgMHg1MUZBLCAweDA5NUEsIDB4NTFGRCwgMHgwRDM1LCAweDUxRkUsCisgICAgMHgxMDk5LCAweDUyMDAsIDB4MEM1QiwgMHg1MjAxLCAweDM4MTMsIDB4NTIwMiwgMHgzODE0LCAweDUyMDMsIDB4MEExNSwKKyAgICAweDUyMDQsIDB4MTA5QSwgMHg1MjA2LCAweDBERkMsIDB4NTIwNywgMHgwQTdFLCAweDUyMDgsIDB4MDVERSwgMHg1MjBBLAorICAgIDB4MDVFNSwgMHg1MjBCLCAweDEwOUIsIDB4NTIwRSwgMHgxMDlELCAweDUyMTEsIDB4MDcxMCwgMHg1MjEzLCAweDM4MTUsCisgICAgMHg1MjE0LCAweDEwOUMsIDB4NTIxNSwgMHgyMENFLCAweDUyMTcsIDB4MEZCQiwgMHg1MjFELCAweDA5NzMsIDB4NTIyNCwKKyAgICAweDBENTEsIDB4NTIyNSwgMHgwRTFDLCAweDUyMjcsIDB4MTA5RSwgMHg1MjI5LCAweDBGNjIsIDB4NTIyQSwgMHgxMDlGLAorICAgIDB4NTIyRSwgMHgxMEEwLCAweDUyMzAsIDB4MEM3OCwgMHg1MjMzLCAweDEwQTEsIDB4NTIzNiwgMHgwQTRELCAweDUyMzcsCisgICAgMHgwODZFLCAweDUyMzgsIDB4MDc0QSwgMHg1MjM5LCAweDEwQTIsIDB4NTIzQSwgMHgwODk3LCAweDUyM0IsIDB4MDgwMSwKKyAgICAweDUyNDMsIDB4MEMwMiwgMHg1MjQ0LCAweDEwQTQsIDB4NTI0NywgMHgwQjA3LCAweDUyNDksIDB4MzgxNiwgMHg1MjRBLAorICAgIDB4MDg1RiwgMHg1MjRCLCAweDEwQTUsIDB4NTI0QywgMHgxMEE2LCAweDUyNEQsIDB4MEFCMiwgMHg1MjRGLCAweDEwQTMsCisgICAgMHg1MjU0LCAweDEwQTgsIDB4NTI1NiwgMHgwRTY0LCAweDUyNUIsIDB4MDdGNiwgMHg1MjVELCAweDFFNUUsIDB4NTI1RSwKKyAgICAweDEwQTcsIDB4NTI2MSwgMHgzODE3LCAweDUyNjMsIDB4MDc0QiwgMHg1MjY0LCAweDA4NEUsIDB4NTI2NSwgMHgwRDIzLAorICAgIDB4NTI2NiwgMHgzODE4LCAweDUyNjksIDB4MTBBQiwgMHg1MjZBLCAweDEwQTksIDB4NTI2RiwgMHgwREVELCAweDUyNzAsCisgICAgMHgwOUQyLCAweDUyNzEsIDB4MTBCMiwgMHg1MjcyLCAweDA1QzIsIDB4NTI3MywgMHgxMEFDLCAweDUyNzQsIDB4MTBBQSwKKyAgICAweDUyNzUsIDB4MEFEMSwgMHg1MjdELCAweDEwQUUsIDB4NTI3RiwgMHgxMEFELCAweDUyODMsIDB4MDVBMiwgMHg1Mjg3LAorICAgIDB4MDczNiwgMHg1Mjg4LCAweDEwQjMsIDB4NTI4OSwgMHgwRjc1LCAweDUyOEQsIDB4MTBBRiwgMHg1MjkxLCAweDEwQjQsCisgICAgMHg1MjkyLCAweDEwQjEsIDB4NTI5MywgMHgzODE5LCAweDUyOTQsIDB4MTBCMCwgMHg1MjlCLCAweDBGOTcsIDB4NTI5QywKKyAgICAweDIwQ0YsIDB4NTI5RiwgMHgwN0FELCAweDUyQTAsIDB4MDU0MywgMHg1MkEzLCAweDBGQkMsIDB4NTJBNiwgMHgyMEQwLAorICAgIDB4NTJBOSwgMHgwOTdGLCAweDUyQUEsIDB4MEM1MiwgMHg1MkFCLCAweDA3RjcsIDB4NTJBQywgMHgxMEI3LCAweDUyQUQsCisgICAgMHgxMEI4LCAweDUyQUYsIDB4MjE3RCwgMHg1MkIxLCAweDBGQUQsIDB4NTJCNCwgMHgwRkQxLCAweDUyQjUsIDB4MTBCQSwKKyAgICAweDUyQjksIDB4MDdBRSwgMHg1MkJDLCAweDEwQjksIDB4NTJCRSwgMHgwNThELCAweDUyQzAsIDB4MjBEMSwgMHg1MkMxLAorICAgIDB4MTBCQiwgMHg1MkMzLCAweDBFODQsIDB4NTJDNSwgMHgwQkQ4LCAweDUyQzcsIDB4MEYxMCwgMHg1MkM4LCAweDM4MUEsCisgICAgMHg1MkM5LCAweDBFMjksIDB4NTJDRCwgMHgxMEJDLCAweDUyRDAsIDB4MzZFOCwgMHg1MkQyLCAweDFCRUUsIDB4NTJENSwKKyAgICAweDBDODgsIDB4NTJENywgMHgxMEJELCAweDUyRDgsIDB4MDVFNiwgMHg1MkQ5LCAweDBFQkYsIDB4NTJEQiwgMHgyMEQyLAorICAgIDB4NTJERCwgMHgwOTg5LCAweDUyREUsIDB4MTBCRSwgMHg1MkRGLCAweDBFMzcsIDB4NTJFMCwgMHgxMEMyLCAweDUyRTIsCisgICAgMHgwQTRFLCAweDUyRTMsIDB4MTBCRiwgMHg1MkU0LCAweDA2QzgsIDB4NTJFNiwgMHgxMEMwLCAweDUyRTcsIDB4MDVFNywKKyAgICAweDUyRjAsIDB4MzgxQiwgMHg1MkYyLCAweDA3MDQsIDB4NTJGMywgMHgxMEMzLCAweDUyRjUsIDB4MTBDNCwgMHg1MkY4LAorICAgIDB4MTBDNSwgMHg1MkY5LCAweDEwQzYsIDB4NTJGQSwgMHgwOTA3LCAweDUyRkUsIDB4MDdBRiwgMHg1MkZGLCAweDBFRUEsCisgICAgMHg1MzAwLCAweDIwRDMsIDB4NTMwMSwgMHgwRUY0LCAweDUzMDIsIDB4MENDRiwgMHg1MzA1LCAweDBFNDEsIDB4NTMwNiwKKyAgICAweDEwQzcsIDB4NTMwNywgMHgyMEQ0LCAweDUzMDgsIDB4MTBDOCwgMHg1MzBBLCAweDM4MUMsIDB4NTMwQiwgMHgzODFELAorICAgIDB4NTMwRCwgMHgxMENBLCAweDUzMEYsIDB4MTBDQywgMHg1MzEwLCAweDEwQ0IsIDB4NTMxNSwgMHgxMENELCAweDUzMTYsCisgICAgMHgwNTNELCAweDUzMTcsIDB4MEU3QSwgMHg1MzE5LCAweDA4NkMsIDB4NTMxQSwgMHgxMENFLCAweDUzMUQsIDB4MEFEQiwKKyAgICAweDUzMjAsIDB4MDk4QSwgMHg1MzIxLCAweDA2QTEsIDB4NTMyMywgMHgxMENGLCAweDUzMjQsIDB4MjBENSwgMHg1MzJBLAorICAgIDB4MEQ2RiwgMHg1MzJGLCAweDEwRDAsIDB4NTMzMSwgMHgxMEQxLCAweDUzMzMsIDB4MTBEMiwgMHg1MzM4LCAweDEwRDMsCisgICAgMHg1MzM5LCAweDBEOTYsIDB4NTMzQSwgMHgwNkUwLCAweDUzM0IsIDB4MDRBOSwgMHg1MzNFLCAweDM4MUUsIDB4NTMzRiwKKyAgICAweDBDOTcsIDB4NTM0MCwgMHgxMEQ0LCAweDUzNDEsIDB4MDk0NywgMHg1MzQzLCAweDBBOEQsIDB4NTM0NSwgMHgxMEQ2LAorICAgIDB4NTM0NiwgMHgxMEQ1LCAweDUzNDcsIDB4MDk4QiwgMHg1MzQ4LCAweDA3OTUsIDB4NTM0OSwgMHgxMEQ4LCAweDUzNEEsCisgICAgMHgwRDUyLCAweDUzNEIsIDB4MzgyMCwgMHg1MzRDLCAweDM4MUYsIDB4NTM0RCwgMHgxMEQ5LCAweDUzNTEsIDB4MEQ3MCwKKyAgICAweDUzNTIsIDB4MEIxNCwgMHg1MzUzLCAweDBCNEUsIDB4NTM1NCwgMHgwNkEwLCAweDUzNTcsIDB4MENDNiwgMHg1MzU4LAorICAgIDB4MEI2RiwgMHg1MzVBLCAweDBEMjQsIDB4NTM1QywgMHgwRTdDLCAweDUzNUUsIDB4MTBEQiwgMHg1MzYwLCAweDBBOEUsCisgICAgMHg1MzYxLCAweDM4MjEsIDB4NTM2NiwgMHgwNzBCLCAweDUzNjksIDB4MTBEQywgMHg1MzZDLCAweDM4MjIsIDB4NTM2RSwKKyAgICAweDEwREQsIDB4NTM2RiwgMHgwNENFLCAweDUzNzAsIDB4MDRCOSwgMHg1MzcxLCAweDA2MjksIDB4NTM3MiwgMHgyMEQ2LAorICAgIDB4NTM3MywgMHgwQjA4LCAweDUzNzQsIDB4MDY2QiwgMHg1Mzc1LCAweDBGNUIsIDB4NTM3NywgMHgxMEUwLCAweDUzNzgsCisgICAgMHgwNTM3LCAweDUzN0IsIDB4MTBERiwgMHg1MzdELCAweDM0MzUsIDB4NTM3RiwgMHgwNkEyLCAweDUzODIsIDB4MTBFMSwKKyAgICAweDUzODQsIDB4MEVGRCwgMHg1Mzg5LCAweDM3RDAsIDB4NTM5MywgMHgyMEQ3LCAweDUzOTYsIDB4MTBFMiwgMHg1Mzk4LAorICAgIDB4MEY5QSwgMHg1MzlBLCAweDA3QjAsIDB4NTM5RiwgMHgwNzZBLCAweDUzQTAsIDB4MTBFMywgMHg1M0E1LCAweDEwRTUsCisgICAgMHg1M0E2LCAweDEwRTQsIDB4NTNBOCwgMHgwQTI1LCAweDUzQTksIDB4MDREQiwgMHg1M0FCLCAweDM4MjMsIDB4NTNBRCwKKyAgICAweDA1MDAsIDB4NTNBRSwgMHgxMEU2LCAweDUzQjAsIDB4MTBFNywgMHg1M0IyLCAweDIwRDgsIDB4NTNCMywgMHgwNzZCLAorICAgIDB4NTNCNiwgMHgxMEU4LCAweDUzQkIsIDB4MDY4OCwgMHg1M0MyLCAweDA4ODAsIDB4NTNDMywgMHgxMEU5LCAweDUzQzgsCisgICAgMHgwRUEyLCAweDUzQzksIDB4MDgyNSwgMHg1M0NBLCAweDA2NzQsIDB4NTNDQiwgMHgwRjExLCAweDUzQ0MsIDB4MEFEMiwKKyAgICAweDUzQ0QsIDB4MEQ1MywgMHg1M0NFLCAweDA5MjksIDB4NTNENCwgMHgwOTUxLCAweDUzRDYsIDB4MDkxNCwgMHg1M0Q3LAorICAgIDB4MDkyMSwgMHg1M0Q5LCAweDA5ODAsIDB4NTNEQSwgMHgzODI0LCAweDUzREIsIDB4MEQ1NCwgMHg1M0RELCAweDIwRDksCisgICAgMHg1M0RGLCAweDEwRUMsIDB4NTNFMSwgMHgwNEU1LCAweDUzRTIsIDB4MEFEMywgMHg1M0UzLCAweDA3QjEsIDB4NTNFNCwKKyAgICAweDA3NzksIDB4NTNFNSwgMHgwNkRGLCAweDUzRTYsIDB4MzgyNSwgMHg1M0U4LCAweDEwRjAsIDB4NTNFOSwgMHgwQjVGLAorICAgIDB4NTNFQSwgMHgwQjVFLCAweDUzRUIsIDB4MDZBMywgMHg1M0VDLCAweDA5OEMsIDB4NTNFRCwgMHgxMEYxLCAweDUzRUUsCisgICAgMHgxMEVGLCAweDUzRUYsIDB4MDU0NCwgMHg1M0YwLCAweDBCNDYsIDB4NTNGMSwgMHgwOEU0LCAweDUzRjIsIDB4MDg5OSwKKyAgICAweDUzRjMsIDB4MDRDOCwgMHg1M0Y1LCAweDM4MjYsIDB4NTNGNiwgMHgwNUNFLCAweDUzRjcsIDB4MDdGOCwgMHg1M0Y4LAorICAgIDB4MDg5OCwgMHg1M0ZBLCAweDEwRjIsIDB4NTQwMSwgMHgxMEYzLCAweDU0MDMsIDB4MDY2MywgMHg1NDA0LCAweDA1QTQsCisgICAgMHg1NDA4LCAweDA3RjksIDB4NTQwOSwgMHgwNjYyLCAweDU0MEEsIDB4MEJGQiwgMHg1NDBCLCAweDA0QzcsIDB4NTQwQywKKyAgICAweDBDODksIDB4NTQwRCwgMHgwRUNBLCAweDU0MEUsIDB4MDdCMywgMHg1NDBGLCAweDBGNjMsIDB4NTQxMCwgMHgwQzQxLAorICAgIDB4NTQxMSwgMHgwN0IyLCAweDU0MUIsIDB4MDcwNSwgMHg1NDFELCAweDEwRkMsIDB4NTQxRiwgMHgwNkRCLCAweDU0MjAsCisgICAgMHgwRTc4LCAweDU0MjYsIDB4MEQ3MSwgMHg1NDI3LCAweDM4MjcsIDB4NTQyOSwgMHgxMEZCLCAweDU0MkIsIDB4MDYxQSwKKyAgICAweDU0MkMsIDB4MTBGNiwgMHg1NDJELCAweDEwRjcsIDB4NTQyRSwgMHgxMEY5LCAweDU0MzMsIDB4MzVDMCwgMHg1NDM2LAorICAgIDB4MTBGQSwgMHg1NDM4LCAweDA2NzUsIDB4NTQzOSwgMHgwQTI3LCAweDU0M0IsIDB4MERGRCwgMHg1NDNDLCAweDEwRjgsCisgICAgMHg1NDNELCAweDEwRjQsIDB4NTQzRSwgMHgwNzk3LCAweDU0M0YsIDB4MzVDRiwgMHg1NDQwLCAweDEwRjUsIDB4NTQ0MiwKKyAgICAweDBGQ0EsIDB4NTQ0NiwgMHgwRTQyLCAweDU0NDgsIDB4MEMwNCwgMHg1NDQ5LCAweDA3OTYsIDB4NTQ0QSwgMHgwODAyLAorICAgIDB4NTQ0RCwgMHgzODI4LCAweDU0NEUsIDB4MTBGRCwgMHg1NDUxLCAweDBDQjUsIDB4NTQ1NSwgMHgzNzIzLCAweDU0NUYsCisgICAgMHgxMTAxLCAweDU0NjYsIDB4MzgyOSwgMHg1NDY4LCAweDA5MkEsIDB4NTQ2QSwgMHgwOTIyLCAweDU0NkIsIDB4MzgyQSwKKyAgICAweDU0NzAsIDB4MTEwNCwgMHg1NDcxLCAweDExMDIsIDB4NTQ3MywgMHgwRUFGLCAweDU0NzQsIDB4MzgyQiwgMHg1NDc1LAorICAgIDB4MTBGRiwgMHg1NDc2LCAweDExMDgsIDB4NTQ3NywgMHgxMTAzLCAweDU0N0IsIDB4MTEwNiwgMHg1NDdDLCAweDA3N0EsCisgICAgMHg1NDdELCAweDBFQ0IsIDB4NTQ4MCwgMHgxMTA3LCAweDU0ODQsIDB4MTEwOSwgMHg1NDg2LCAweDExMEIsIDB4NTQ4QSwKKyAgICAweDIwREMsIDB4NTQ4QiwgMHgwODYwLCAweDU0OEMsIDB4MEZFOCwgMHg1NDhELCAweDM4MkMsIDB4NTQ4RSwgMHgxMTAwLAorICAgIDB4NTQ4RiwgMHgxMEZFLCAweDU0OTAsIDB4MTEwQSwgMHg1NDkyLCAweDExMDUsIDB4NTQ5NiwgMHgzODJELCAweDU0OUMsCisgICAgMHgyMERCLCAweDU0QTEsIDB4MzgyRSwgMHg1NEEyLCAweDExMEQsIDB4NTRBNCwgMHgxMTE2LCAweDU0QTUsIDB4MTEwRiwKKyAgICAweDU0QTgsIDB4MTExMywgMHg1NEE5LCAweDIwREQsIDB4NTRBQiwgMHgxMTE0LCAweDU0QUMsIDB4MTExMCwgMHg1NEFELAorICAgIDB4MzgyRiwgMHg1NEFGLCAweDExMzEsIDB4NTRCMiwgMHgwODU5LCAweDU0QjMsIDB4MDU4RiwgMHg1NEI4LCAweDExMEUsCisgICAgMHg1NEI5LCAweDM4MzAsIDB4NTRCQywgMHgxMTE4LCAweDU0QkQsIDB4MDRCQSwgMHg1NEJFLCAweDExMTcsIDB4NTRCRiwKKyAgICAweDM4MzEsIDB4NTRDMCwgMHgwNDY5LCAweDU0QzEsIDB4MERCQywgMHg1NEMyLCAweDExMTUsIDB4NTRDNCwgMHgxMTExLAorICAgIDB4NTRDNiwgMHgzODMyLCAweDU0QzcsIDB4MTEwQywgMHg1NEM4LCAweDExMTIsIDB4NTRDOSwgMHgwODM4LCAweDU0Q0QsCisgICAgMHgzODMzLCAweDU0RDgsIDB4MTExOSwgMHg1NEUxLCAweDA0QkIsIDB4NTRFMiwgMHgxMTIyLCAweDU0RTUsIDB4MTExQSwKKyAgICAweDU0RTYsIDB4MTExQiwgMHg1NEU4LCAweDA5OEQsIDB4NTRFOSwgMHgwRTk3LCAweDU0RUQsIDB4MTEyMCwgMHg1NEVFLAorICAgIDB4MTExRiwgMHg1NEYyLCAweDBDMjksIDB4NTRGQSwgMHgxMTIxLCAweDU0RkQsIDB4MTExRSwgMHg1NEZGLCAweDIwREUsCisgICAgMHg1NTA0LCAweDA0RDYsIDB4NTUwNiwgMHgwODI2LCAweDU1MDcsIDB4MDlGNiwgMHg1NTBFLCAweDM4MzQsIDB4NTUwRiwKKyAgICAweDExMUMsIDB4NTUxMCwgMHgwQzVDLCAweDU1MTQsIDB4MTExRCwgMHg1NTE2LCAweDA0NjYsIDB4NTUyQiwgMHgzODM1LAorICAgIDB4NTUyRSwgMHgxMTI3LCAweDU1MkYsIDB4MEYwRCwgMHg1NTMxLCAweDA5OEYsIDB4NTUzMywgMHgxMTJELCAweDU1MzUsCisgICAgMHgzODM2LCAweDU1MzgsIDB4MTEyQywgMHg1NTM5LCAweDExMjMsIDB4NTUzRSwgMHgwQjIzLCAweDU1NDAsIDB4MTEyNCwKKyAgICAweDU1NDQsIDB4MEI0RiwgMHg1NTQ1LCAweDExMjksIDB4NTU0NiwgMHgwOThFLCAweDU1NEEsIDB4MzgzNywgMHg1NTRDLAorICAgIDB4MTEyNiwgMHg1NTRGLCAweDBFRjAsIDB4NTU1MywgMHgwNzEyLCAweDU1NTYsIDB4MTEyQSwgMHg1NTU3LCAweDExMkIsCisgICAgMHg1NTVDLCAweDExMjgsIDB4NTU1RCwgMHgxMTJFLCAweDU1NUUsIDB4MUREMSwgMHg1NTYwLCAweDM4MzgsIDB4NTU2MSwKKyAgICAweDM4MzksIDB4NTU2MywgMHgxMTI1LCAweDU1N0IsIDB4MTEzNCwgMHg1NTdDLCAweDExMzksIDB4NTU3RSwgMHgxMTM1LAorICAgIDB4NTU4MCwgMHgxMTMwLCAweDU1ODMsIDB4MTEzQSwgMHg1NTg0LCAweDBBQjMsIDB4NTU4NiwgMHgyMERGLCAweDU1ODcsCisgICAgMHgxMTNDLCAweDU1ODgsIDB4MzgzQSwgMHg1NTg5LCAweDA3QjQsIDB4NTU4QSwgMHgxMTMyLCAweDU1OEIsIDB4MEJCQiwKKyAgICAweDU1OEUsIDB4MzgzQiwgMHg1NTk4LCAweDExMzYsIDB4NTU5OSwgMHgxMTJGLCAweDU1OUEsIDB4MDVFOSwgMHg1NTlDLAorICAgIDB4MDYyQSwgMHg1NTlELCAweDA1QzMsIDB4NTU5RSwgMHgxMTM3LCAweDU1OUYsIDB4MTEzMywgMHg1NUE3LCAweDA3NEMsCisgICAgMHg1NUE4LCAweDExM0QsIDB4NTVBOSwgMHgxMTNCLCAweDU1QUEsIDB4MEFENSwgMHg1NUFCLCAweDA2NjQsIDB4NTVBQywKKyAgICAweDA2QTQsIDB4NTVBRSwgMHgxMTM4LCAweDU1QjAsIDB4MDZFQywgMHg1NUI2LCAweDA0RTYsIDB4NTVDNCwgMHgxMTQxLAorICAgIDB4NTVDNSwgMHgxMTNGLCAweDU1QzcsIDB4MTE3OCwgMHg1NUQ0LCAweDExNDQsIDB4NTVEQSwgMHgxMTNFLCAweDU1REMsCisgICAgMHgxMTQyLCAweDU1REYsIDB4MTE0MCwgMHg1NUUzLCAweDA4OUEsIDB4NTVFNCwgMHgxMTQzLCAweDU1RjcsIDB4MTE0NiwKKyAgICAweDU1RjksIDB4MTE0QiwgMHg1NUZELCAweDExNDksIDB4NTVGRSwgMHgxMTQ4LCAweDU2MDYsIDB4MEI3MCwgMHg1NjA4LAorICAgIDB4MzgzQywgMHg1NjA5LCAweDA1NDUsIDB4NTYwRSwgMHgzODNELCAweDU2MEYsIDB4MzgzRSwgMHg1NjE0LCAweDExNDUsCisgICAgMHg1NjE2LCAweDExNDcsIDB4NTYxNywgMHgwOTkwLCAweDU2MTgsIDB4MDRENSwgMHg1NjFCLCAweDExNEEsIDB4NTYyMCwKKyAgICAweDNDMUQsIDB4NTYyOSwgMHgwNTVFLCAweDU2MkYsIDB4MTE1NSwgMHg1NjMxLCAweDA5RTQsIDB4NTYzMiwgMHgxMTUxLAorICAgIDB4NTYzNCwgMHgxMTRGLCAweDU2MzYsIDB4MTE1MCwgMHg1NjM3LCAweDM4M0YsIDB4NTYzOCwgMHgxMTUyLCAweDU2M0YsCisgICAgMHgzODQwLCAweDU2NDIsIDB4MDRERiwgMHg1NjQ5LCAweDM4NDEsIDB4NTY0QiwgMHgzODQyLCAweDU2NEMsIDB4MEFCQiwKKyAgICAweDU2NEUsIDB4MTE0QywgMHg1NjRGLCAweDM4NDMsIDB4NTY1MCwgMHgxMTRELCAweDU2NTMsIDB4MUYxQiwgMHg1NjVCLAorICAgIDB4MDVEOCwgMHg1NjY0LCAweDExNTQsIDB4NTY2NiwgMHgzODQ0LCAweDU2NjgsIDB4MDYyQiwgMHg1NjY5LCAweDM4NDUsCisgICAgMHg1NjZBLCAweDExNTcsIDB4NTY2QiwgMHgxMTUzLCAweDU2NkMsIDB4MTE1NiwgMHg1NjZGLCAweDM4NDYsIDB4NTY3MSwKKyAgICAweDM4NDcsIDB4NTY3MiwgMHgzODQ4LCAweDU2NzQsIDB4MERGRSwgMHg1Njc2LCAweDNDMzMsIDB4NTY3OCwgMHgwQ0FELAorICAgIDB4NTY3QSwgMHgwRDRDLCAweDU2ODAsIDB4MTE1OSwgMHg1Njg2LCAweDExNTgsIDB4NTY4NywgMHgwNUEzLCAweDU2OEEsCisgICAgMHgxMTVBLCAweDU2OEYsIDB4MTE1RCwgMHg1Njk0LCAweDExNUMsIDB4NTY5NSwgMHgzODQ5LCAweDU2OTksIDB4MURFNiwKKyAgICAweDU2OUEsIDB4Mzg0QSwgMHg1NkEwLCAweDExNUIsIDB4NTZBMiwgMHgwQ0VGLCAweDU2QTUsIDB4MTE1RSwgMHg1NkFDLAorICAgIDB4Mzg0QiwgMHg1NkFELCAweDM4NEMsIDB4NTZBRSwgMHgxMTVGLCAweDU2QjEsIDB4Mzg0RCwgMHg1NkI0LCAweDExNjEsCisgICAgMHg1NkI2LCAweDExNjAsIDB4NTZCQywgMHgxMTYzLCAweDU2QzAsIDB4MTE2NiwgMHg1NkMxLCAweDExNjQsIDB4NTZDMiwKKyAgICAweDExNjIsIDB4NTZDMywgMHgxMTY1LCAweDU2QzgsIDB4MTE2NywgMHg1NkM5LCAweDM4NEUsIDB4NTZDQSwgMHgxRTVBLAorICAgIDB4NTZDRSwgMHgxMTY4LCAweDU2RDEsIDB4MTE2OSwgMHg1NkQzLCAweDExNkEsIDB4NTZENywgMHgxMTZCLCAweDU2RDgsCisgICAgMHgxMDdDLCAweDU2REEsIDB4MDkyOCwgMHg1NkRCLCAweDA4OUIsIDB4NTZERCwgMHgzODRGLCAweDU2REUsIDB4MDU3MywKKyAgICAweDU2RTAsIDB4MDRCQywgMHg1NkUzLCAweDBCODIsIDB4NTZFNCwgMHgzODUwLCAweDU2RUUsIDB4MTE2QywgMHg1NkYwLAorICAgIDB4MDgxNCwgMHg1NkYyLCAweDA0OTMsIDB4NTZGMywgMHgwQTI0LCAweDU2RjksIDB4MTE2RCwgMHg1NkZBLCAweDA3N0IsCisgICAgMHg1NkZELCAweDA4MDMsIDB4NTZGRiwgMHgxMTZGLCAweDU3MDAsIDB4MTE2RSwgMHg1NzAzLCAweDBFMzAsIDB4NTcwNCwKKyAgICAweDExNzAsIDB4NTcwOCwgMHgxMTcyLCAweDU3MDksIDB4MTE3MSwgMHg1NzBBLCAweDM4NTEsIDB4NTcwQiwgMHgxMTczLAorICAgIDB4NTcwRCwgMHgxMTc0LCAweDU3MEYsIDB4MDc0RCwgMHg1NzEyLCAweDA1MDIsIDB4NTcxMywgMHgxMTc1LCAweDU3MTUsCisgICAgMHgzODUyLCAweDU3MTYsIDB4MTE3NywgMHg1NzE4LCAweDExNzYsIDB4NTcxQywgMHgxMTc5LCAweDU3MUYsIDB4MEM1NCwKKyAgICAweDU3MjEsIDB4MzY4MCwgMHg1NzIzLCAweDM4NTMsIDB4NTcyNiwgMHgxMTdBLCAweDU3MjcsIDB4MDQ3OSwgMHg1NzI4LAorICAgIDB4MDg0RiwgMHg1NzJELCAweDA3MTMsIDB4NTcyRiwgMHgzODU0LCAweDU3MzAsIDB4MEI4RCwgMHg1NzMzLCAweDM4NTUsCisgICAgMHg1NzM0LCAweDM4NTYsIDB4NTczNywgMHgxMTdCLCAweDU3MzgsIDB4MTE3QywgMHg1NzNCLCAweDExN0UsIDB4NTc0MCwKKyAgICAweDExN0YsIDB4NTc0MiwgMHgwODU0LCAweDU3NDcsIDB4MDZDOSwgMHg1NzRBLCAweDBFNjUsIDB4NTc0QywgMHgzODU3LAorICAgIDB4NTc0RSwgMHgxMTdELCAweDU3NEYsIDB4MTE4MCwgMHg1NzUwLCAweDA4MzEsIDB4NTc1MSwgMHgwN0I1LCAweDU3NTksCisgICAgMHgyMEUwLCAweDU3NjEsIDB4MTE4NCwgMHg1NzY0LCAweDA4MTUsIDB4NTc2NSwgMHgyMEUxLCAweDU3NjYsIDB4MEI3MSwKKyAgICAweDU3NjksIDB4MTE4MSwgMHg1NzZBLCAweDBCRjYsIDB4NTc3MCwgMHgzODU4LCAweDU3N0YsIDB4MTE4NSwgMHg1NzgyLAorICAgIDB4MEEyOCwgMHg1Nzg4LCAweDExODMsIDB4NTc4OSwgMHgxMTg2LCAweDU3OEIsIDB4MDcxNSwgMHg1NzhDLCAweDM4NTksCisgICAgMHg1NzkzLCAweDExODcsIDB4NTc5QywgMHgzODVBLCAweDU3QTAsIDB4MTE4OCwgMHg1N0EyLCAweDA3QjYsIDB4NTdBMywKKyAgICAweDA1OUUsIDB4NTdBNCwgMHgxMThBLCAweDU3QUEsIDB4MTE4QiwgMHg1N0FDLCAweDIwRTIsIDB4NTdCMCwgMHgxMThDLAorICAgIDB4NTdCMywgMHgxMTg5LCAweDU3QjgsIDB4Mzg1QiwgMHg1N0MwLCAweDExODIsIDB4NTdDMywgMHgxMThELCAweDU3QzYsCisgICAgMHgxMThFLCAweDU3QzcsIDB4MjBFNCwgMHg1N0M4LCAweDIwRTMsIDB4NTdDQiwgMHgwRTkyLCAweDU3Q0UsIDB4MDlEMywKKyAgICAweDU3RDIsIDB4MTE5MCwgMHg1N0QzLCAweDExOTEsIDB4NTdENCwgMHgxMThGLCAweDU3RDYsIDB4MTE5MywgMHg1N0RDLAorICAgIDB4MENFRSwgMHg1N0RGLCAweDA0QUMsIDB4NTdFMCwgMHgwREM4LCAweDU3RTMsIDB4MTE5NCwgMHg1N0U2LCAweDM4NUMsCisgICAgMHg1N0VELCAweDM4NUQsIDB4NTdGNCwgMHgwOUU1LCAweDU3RjUsIDB4Mzg1RSwgMHg1N0Y2LCAweDM4NUYsIDB4NTdGNywKKyAgICAweDA4RTUsIDB4NTdGOSwgMHgwRDEzLCAweDU3RkEsIDB4MDYyQywgMHg1N0ZDLCAweDA4NUIsIDB4NTdGRiwgMHgzODYwLAorICAgIDB4NTgwMCwgMHgwRTg3LCAweDU4MDIsIDB4MEM4QSwgMHg1ODA1LCAweDA3NEUsIDB4NTgwNiwgMHgwQjJGLCAweDU4MDksCisgICAgMHgzODYxLCAweDU4MEEsIDB4MTE5MiwgMHg1ODBCLCAweDExOTUsIDB4NTgxNSwgMHgwQjI0LCAweDU4MTksIDB4MTE5NiwKKyAgICAweDU4MUQsIDB4MTE5NywgMHg1ODIwLCAweDM4NjIsIDB4NTgyMSwgMHgxMTk5LCAweDU4MjQsIDB4MEMwNSwgMHg1ODJBLAorICAgIDB4MDVFQSwgMHg1ODJGLCAweDFEMzIsIDB4NTgzMCwgMHgwNTAzLCAweDU4MzEsIDB4MEU0MywgMHg1ODMyLCAweDM4NjMsCisgICAgMHg1ODM0LCAweDA5RDQsIDB4NTgzNSwgMHgwQzQyLCAweDU4M0EsIDB4MDg1NiwgMHg1ODNELCAweDExOUYsIDB4NTg0MCwKKyAgICAweDBFMEQsIDB4NTg0MSwgMHgwRkE1LCAweDU4NEEsIDB4MDU3NCwgMHg1ODRCLCAweDExOUIsIDB4NTg1MSwgMHgwQUJDLAorICAgIDB4NTg1MiwgMHgxMTlFLCAweDU4NTQsIDB4MEM1RCwgMHg1ODU3LCAweDBDNDMsIDB4NTg1OCwgMHgwQzVFLCAweDU4NTksCisgICAgMHgwRDRELCAweDU4NUEsIDB4MEJFOSwgMHg1ODVFLCAweDA4MzksIDB4NTg2MSwgMHgxRTQ3LCAweDU4NjIsIDB4MTE5QSwKKyAgICAweDU4NjksIDB4MDUxOCwgMHg1ODZCLCAweDBDMzAsIDB4NTg3MCwgMHgxMTlDLCAweDU4NzIsIDB4MTE5OCwgMHg1ODc1LAorICAgIDB4MEExNiwgMHg1ODc5LCAweDExQTAsIDB4NTg3QywgMHgzODY0LCAweDU4N0UsIDB4MDk1OCwgMHg1ODgwLCAweDM4NjUsCisgICAgMHg1ODgzLCAweDA2QTUsIDB4NTg4NSwgMHgxMUExLCAweDU4OTMsIDB4MEUzOCwgMHg1ODk3LCAweDBBRkYsIDB4NTg5QywKKyAgICAweDBCRTIsIDB4NTg5RSwgMHgyMEU3LCAweDU4OUYsIDB4MTFBMywgMHg1OEE4LCAweDBFN0QsIDB4NThBOSwgMHgzODY2LAorICAgIDB4NThBQiwgMHgxMUE0LCAweDU4QUUsIDB4MTFBOSwgMHg1OEIyLCAweDIwRTgsIDB4NThCMywgMHgwREZGLCAweDU4QjgsCisgICAgMHgxMUE4LCAweDU4QjksIDB4MTFBMiwgMHg1OEJBLCAweDExQTUsIDB4NThCQiwgMHgxMUE3LCAweDU4QkUsIDB4MDgxNiwKKyAgICAweDU4QzEsIDB4MEUxOSwgMHg1OEM1LCAweDExQUEsIDB4NThDNywgMHgwQjgzLCAweDU4Q0EsIDB4MDU3NSwgMHg1OENDLAorICAgIDB4MDlENSwgMHg1OENFLCAweDM4NjcsIDB4NThEMCwgMHgzODY4LCAweDU4RDEsIDB4MTFBQywgMHg1OEQzLCAweDExQUIsCisgICAgMHg1OEQ0LCAweDM4NjksIDB4NThENSwgMHgwN0ZBLCAweDU4RDcsIDB4MTFBRCwgMHg1OEQ4LCAweDExQUYsIDB4NThEOSwKKyAgICAweDExQUUsIDB4NThEQSwgMHgzODZBLCAweDU4REMsIDB4MTFCMSwgMHg1OERFLCAweDExQTYsIDB4NThERiwgMHgxMUIzLAorICAgIDB4NThFNCwgMHgxMUIyLCAweDU4RTUsIDB4MTFCMCwgMHg1OEU5LCAweDM4NkIsIDB4NThFQiwgMHgwODlDLCAweDU4RUMsCisgICAgMHgwQTE3LCAweDU4RUUsIDB4MEFENiwgMHg1OEVGLCAweDExQjQsIDB4NThGMCwgMHgwQTYwLCAweDU4RjEsIDB4MDRCMSwKKyAgICAweDU4RjIsIDB4MEQxQSwgMHg1OEY3LCAweDBCRjcsIDB4NThGOSwgMHgxMUI2LCAweDU4RkEsIDB4MTFCNSwgMHg1OEZCLAorICAgIDB4MTFCNywgMHg1OEZDLCAweDExQjgsIDB4NThGRCwgMHgxMUI5LCAweDU5MDIsIDB4MTFCQSwgMHg1OTA5LCAweDBFMjEsCisgICAgMHg1OTBBLCAweDExQkIsIDB4NTkwQiwgMHgyMEU5LCAweDU5MEMsIDB4Mzg2QywgMHg1OTBGLCAweDA1NDYsIDB4NTkxMCwKKyAgICAweDExQkMsIDB4NTkxNSwgMHgwRjI2LCAweDU5MTYsIDB4MDU4RSwgMHg1OTE4LCAweDEwREUsIDB4NTkxOSwgMHgwOTUyLAorICAgIDB4NTkxQSwgMHgwQjFGLCAweDU5MUIsIDB4MTFCRCwgMHg1OTFDLCAweDBFRjcsIDB4NTkyMiwgMHgwRUMwLCAweDU5MjQsCisgICAgMHgzODZELCAweDU5MjUsIDB4MTFCRiwgMHg1OTI3LCAweDBCNDcsIDB4NTkyOSwgMHgwQzMxLCAweDU5MkEsIDB4MEIyMCwKKyAgICAweDU5MkIsIDB4MERDOSwgMHg1OTJDLCAweDExQzAsIDB4NTkyRCwgMHgxMUMxLCAweDU5MkUsIDB4MDUxRCwgMHg1OTJGLAorICAgIDB4Mzg2RSwgMHg1OTMxLCAweDA4RTYsIDB4NTkzMiwgMHgxMUMyLCAweDU5MzcsIDB4MDQ5NCwgMHg1OTM4LCAweDExQzMsCisgICAgMHg1OTM5LCAweDM3MjUsIDB4NTkzRSwgMHgxMUM0LCAweDU5NDQsIDB4MDUwNCwgMHg1OTQ3LCAweDA2MkQsIDB4NTk0OCwKKyAgICAweDBDQjgsIDB4NTk0OSwgMHgwRTQ0LCAweDU5NEUsIDB4MTFDOCwgMHg1OTRGLCAweDBBRDcsIDB4NTk1MCwgMHgxMUM3LAorICAgIDB4NTk1MSwgMHgwNzE2LCAweDU5NTMsIDB4MjBFQSwgMHg1OTU0LCAweDBFODksIDB4NTk1NSwgMHgxMUM2LCAweDU5NTcsCisgICAgMHgwQzVGLCAweDU5NTgsIDB4MTFDQSwgMHg1OTVBLCAweDExQzksIDB4NTk1QiwgMHgyMEVCLCAweDU5NUQsIDB4MjBFQywKKyAgICAweDU5NjAsIDB4MTFDQywgMHg1OTYxLCAweDM4NkYsIDB4NTk2MiwgMHgxMUNCLCAweDU5NjMsIDB4MjBFRCwgMHg1OTY1LAorICAgIDB4MDUxRSwgMHg1OTY3LCAweDExQ0QsIDB4NTk2OCwgMHgwOTkxLCAweDU5NjksIDB4MTFDRiwgMHg1OTZBLCAweDBCNjMsCisgICAgMHg1OTZDLCAweDExQ0UsIDB4NTk2RCwgMHgzODcwLCAweDU5NkUsIDB4MEUwMywgMHg1OTczLCAweDA5ODEsIDB4NTk3NCwKKyAgICAweDBDNTUsIDB4NTk3OCwgMHgxMUQwLCAweDU5N0QsIDB4MDdCNywgMHg1OTgxLCAweDExRDEsIDB4NTk4MiwgMHgwQ0Q3LAorICAgIDB4NTk4MywgMHgwRDcyLCAweDU5ODQsIDB4MEVERCwgMHg1OThBLCAweDBDREIsIDB4NTk4RCwgMHgxMURBLCAweDU5OTMsCisgICAgMHgwNjUyLCAweDU5OTYsIDB4MEYyRiwgMHg1OTk5LCAweDBFQkIsIDB4NTk5QiwgMHgxMjM5LCAweDU5OUQsIDB4MTFEMiwKKyAgICAweDU5QTMsIDB4MTFENSwgMHg1OUE0LCAweDIwRUUsIDB4NTlBNSwgMHgwQjI1LCAweDU5QTgsIDB4MEU2NiwgMHg1OUFDLAorICAgIDB4MEM0NCwgMHg1OUIyLCAweDExRDYsIDB4NTlCOSwgMHgwRTkzLCAweDU5QkEsIDB4MjBFRiwgMHg1OUJCLCAweDA4M0EsCisgICAgMHg1OUJFLCAweDA5OTIsIDB4NTlDNiwgMHgxMUQ3LCAweDU5QzksIDB4MDg5RSwgMHg1OUNBLCAweDM4NzEsIDB4NTlDQiwKKyAgICAweDA4OUQsIDB4NTlEMCwgMHgwNDdELCAweDU5RDEsIDB4MDc3QywgMHg1OUQyLCAweDM4NzIsIDB4NTlEMywgMHgwQTRGLAorICAgIDB4NTlENCwgMHgwNDk1LCAweDU5RDksIDB4MTFEQiwgMHg1OURBLCAweDExREMsIDB4NTlEQywgMHgxMUQ5LCAweDU5REQsCisgICAgMHgzODczLCAweDU5RTMsIDB4Mzg3NCwgMHg1OUU0LCAweDM4NzUsIDB4NTlFNSwgMHgwNERBLCAweDU5RTYsIDB4MDVFQiwKKyAgICAweDU5RTgsIDB4MTFEOCwgMHg1OUVBLCAweDBFRDEsIDB4NTlFQiwgMHgwREEzLCAweDU5RUMsIDB4MzZBRCwgMHg1OUY2LAorICAgIDB4MDQ2QywgMHg1OUZCLCAweDA0QkQsIDB4NTlGRiwgMHgwODlGLCAweDVBMDEsIDB4MDQ5NiwgMHg1QTAzLCAweDA0NjcsCisgICAgMHg1QTA0LCAweDM4NzYsIDB4NUEwOSwgMHgxMUUxLCAweDVBMEMsIDB4Mzg3NywgMHg1QTExLCAweDExREYsIDB4NUExOCwKKyAgICAweDBFQzgsIDB4NUExQSwgMHgxMUUyLCAweDVBMUIsIDB4MzVDMSwgMHg1QTFDLCAweDExRTAsIDB4NUExRiwgMHgxMURFLAorICAgIDB4NUEyMCwgMHgwOUY3LCAweDVBMjMsIDB4Mzg3OCwgMHg1QTI1LCAweDExREQsIDB4NUEyOSwgMHgwRTJBLCAweDVBMkYsCisgICAgMHgwNzk4LCAweDVBMzUsIDB4MTFFNiwgMHg1QTM2LCAweDExRTcsIDB4NUEzQywgMHgwOTkzLCAweDVBNDAsIDB4MTFFMywKKyAgICAweDVBNDEsIDB4MEZEMiwgMHg1QTQ2LCAweDBEMDIsIDB4NUE0NywgMHgzODc5LCAweDVBNDksIDB4MTFFNSwgMHg1QTU1LAorICAgIDB4Mzg3QSwgMHg1QTVBLCAweDA4MTcsIDB4NUE2MiwgMHgxMUU4LCAweDVBNjMsIDB4Mzg3QiwgMHg1QTY2LCAweDBEQ0EsCisgICAgMHg1QTZBLCAweDExRTksIDB4NUE2QywgMHgxMUU0LCAweDVBNkQsIDB4Mzg3QywgMHg1QTdFLCAweDM4N0QsIDB4NUE3RiwKKyAgICAweDBFQzcsIDB4NUE5MiwgMHgwRDE0LCAweDVBOUEsIDB4MTFFQSwgMHg1QTlCLCAweDBEQTQsIDB4NUE5RSwgMHgzODdFLAorICAgIDB4NUFBNywgMHgzODdGLCAweDVBQUMsIDB4Mzg4MCwgMHg1QUIzLCAweDM4ODEsIDB4NUFCQywgMHgxMUVCLCAweDVBQkQsCisgICAgMHgxMUVGLCAweDVBQkUsIDB4MTFFQywgMHg1QUMxLCAweDA1NDcsIDB4NUFDMiwgMHgxMUVFLCAweDVBQzksIDB4MDhFNywKKyAgICAweDVBQ0IsIDB4MTFFRCwgMHg1QUNDLCAweDA3NEYsIDB4NUFEMCwgMHgxMUZCLCAweDVBRDYsIDB4MTFGNCwgMHg1QUQ3LAorICAgIDB4MTFGMSwgMHg1QUUwLCAweDM4ODIsIDB4NUFFMSwgMHgwQkEyLCAweDVBRTMsIDB4MTFGMCwgMHg1QUU2LCAweDExRjIsCisgICAgMHg1QUU5LCAweDExRjMsIDB4NUFGQSwgMHgxMUY1LCAweDVBRkIsIDB4MTFGNiwgMHg1QjAwLCAweDM4ODMsIDB4NUIwOSwKKyAgICAweDA2MkUsIDB4NUIwQiwgMHgxMUY4LCAweDVCMEMsIDB4MTFGNywgMHg1QjE2LCAweDExRjksIDB4NUIxOSwgMHgzODg0LAorICAgIDB4NUIyMiwgMHgwOUQ2LCAweDVCMjUsIDB4Mzg4NSwgMHg1QjJBLCAweDExRkMsIDB4NUIyQywgMHgwQkY4LCAweDVCMkQsCisgICAgMHgzODg2LCAweDVCMzAsIDB4MDRFNywgMHg1QjMyLCAweDExRkEsIDB4NUIzNiwgMHgxMUZELCAweDVCM0UsIDB4MTFGRSwKKyAgICAweDVCNDAsIDB4MTIwMSwgMHg1QjQxLCAweDM4ODcsIDB4NUI0MywgMHgxMUZGLCAweDVCNDUsIDB4MTIwMCwgMHg1QjUwLAorICAgIDB4MDhBMCwgMHg1QjUxLCAweDEyMDIsIDB4NUI1NCwgMHgwN0I4LCAweDVCNTUsIDB4MTIwMywgMHg1QjU2LCAweDIwRjAsCisgICAgMHg1QjU3LCAweDA4QzgsIDB4NUI1OCwgMHgwQjE4LCAweDVCNUEsIDB4MTIwNCwgMHg1QjVCLCAweDEyMDUsIDB4NUI1QywKKyAgICAweDA4QTgsIDB4NUI1RCwgMHgwN0I5LCAweDVCNUYsIDB4MEVERSwgMHg1QjYzLCAweDA2NDIsIDB4NUI2NCwgMHgwNzdELAorICAgIDB4NUI2NSwgMHgxMjA2LCAweDVCNjYsIDB4MDVCNiwgMHg1QjY5LCAweDEyMDcsIDB4NUI2QiwgMHgwQjE5LCAweDVCNzAsCisgICAgMHgxMjA4LCAweDVCNzEsIDB4MTIzMCwgMHg1QjczLCAweDEyMDksIDB4NUI3NSwgMHgxMjBBLCAweDVCNzgsIDB4MTIwQiwKKyAgICAweDVCN0EsIDB4MTIwRCwgMHg1QjdDLCAweDM4ODgsIDB4NUI3RSwgMHgzODg5LCAweDVCN0YsIDB4Mzg4QSwgMHg1QjgwLAorICAgIDB4MTIwRSwgMHg1QjgyLCAweDM2MTAsIDB4NUI4MywgMHgxMjBGLCAweDVCODUsIDB4MEI1MCwgMHg1Qjg3LCAweDA0QzksCisgICAgMHg1Qjg4LCAweDA5MTUsIDB4NUI4OSwgMHgwNDg2LCAweDVCOEEsIDB4Mzg4QiwgMHg1QjhCLCAweDBBRDksIDB4NUI4QywKKyAgICAweDA1RUMsIDB4NUI4RCwgMHgwOEUxLCAweDVCOEYsIDB4MDdCQSwgMHg1Qjk1LCAweDBDNjAsIDB4NUI5NywgMHgwOTJCLAorICAgIDB4NUI5OCwgMHgwNUVELCAweDVCOTksIDB4MEJBNiwgMHg1QjlBLCAweDBDMDYsIDB4NUI5QiwgMHgwNDdDLCAweDVCOUMsCisgICAgMHgwNjUzLCAweDVCOUQsIDB4MEU0NSwgMHg1QjlGLCAweDA4RUUsIDB4NUJBMiwgMHgwNjZDLCAweDVCQTMsIDB4MEE4RiwKKyAgICAweDVCQTQsIDB4MDhFOCwgMHg1QkE1LCAweDBGMTIsIDB4NUJBNiwgMHgxMjEwLCAweDVCQUUsIDB4MDY3NiwgMHg1QkIwLAorICAgIDB4MDgzQiwgMHg1QkIzLCAweDA1OTAsIDB4NUJCNCwgMHgwNTA1LCAweDVCQjUsIDB4MDk5NCwgMHg1QkI2LCAweDA1NDgsCisgICAgMHg1QkI4LCAweDEyMTEsIDB4NUJCOSwgMHgwRjMwLCAweDVCQkYsIDB4MDk1MywgMHg1QkMwLCAweDIwRjEsIDB4NUJDMiwKKyAgICAweDA5MTAsIDB4NUJDMywgMHgxMjEyLCAweDVCQzQsIDB4MDYyRiwgMHg1QkM1LCAweDBDQUEsIDB4NUJDNiwgMHgwRUI1LAorICAgIDB4NUJDNywgMHgxMjEzLCAweDVCQzksIDB4MTIxNCwgMHg1QkNDLCAweDBEQ0IsIDB4NUJEMCwgMHgxMjE2LCAweDVCRDIsCisgICAgMHgwNUU0LCAweDVCRDMsIDB4MDZFRiwgMHg1QkQ0LCAweDEyMTUsIDB4NUJEOCwgMHgyMEYzLCAweDVCREIsIDB4MDVFRSwKKyAgICAweDVCREQsIDB4MDlGOCwgMHg1QkRFLCAweDEyMUEsIDB4NUJERiwgMHgwODZGLCAweDVCRTEsIDB4MDU0OSwgMHg1QkUyLAorICAgIDB4MTIxOSwgMHg1QkU0LCAweDEyMTcsIDB4NUJFNSwgMHgxMjFCLCAweDVCRTYsIDB4MTIxOCwgMHg1QkU3LCAweDBDRTEsCisgICAgMHg1QkU4LCAweDE0OEUsIDB4NUJFOSwgMHgwOUY5LCAweDVCRUIsIDB4MTIxQywgMHg1QkVDLCAweDIwRjQsIDB4NUJFRSwKKyAgICAweDBGODgsIDB4NUJGMCwgMHgxMjFELCAweDVCRjMsIDB4MTIxRiwgMHg1QkY1LCAweDBCQkMsIDB4NUJGNiwgMHgxMjFFLAorICAgIDB4NUJGOCwgMHgwQTQ3LCAweDVCRkEsIDB4MDhDOSwgMHg1QkZFLCAweDBCMzAsIDB4NUJGRiwgMHgwOTIzLCAweDVDMDEsCisgICAgMHgwREU3LCAweDVDMDIsIDB4MEE5MCwgMHg1QzA0LCAweDA4RjksIDB4NUMwNSwgMHgxMjIwLCAweDVDMDYsIDB4MDk5NSwKKyAgICAweDVDMDcsIDB4MTIyMSwgMHg1QzA4LCAweDEyMjIsIDB4NUMwOSwgMHgwNDk3LCAweDVDMEEsIDB4MEIxQSwgMHg1QzBCLAorICAgIDB4MEExOCwgMHg1QzBELCAweDEyMjMsIDB4NUMwRSwgMHgwQzhCLCAweDVDMEYsIDB4MDk5NiwgMHg1QzExLCAweDA5OTcsCisgICAgMHg1QzEzLCAweDEyMjQsIDB4NUMxNCwgMHgzNzJBLCAweDVDMTYsIDB4MEE5MSwgMHg1QzE5LCAweDM2MEIsIDB4NUMxQSwKKyAgICAweDA5OTgsIDB4NUMxRSwgMHgyMEY1LCAweDVDMjAsIDB4MTIyNSwgMHg1QzIyLCAweDEyMjYsIDB4NUMyMywgMHgzODhDLAorICAgIDB4NUMyNCwgMHgwRUVDLCAweDVDMjgsIDB4MTIyNywgMHg1QzJCLCAweDM4OEQsIDB4NUMyRCwgMHgwNkJFLCAweDVDMzAsCisgICAgMHgzODhFLCAweDVDMzEsIDB4MDkyQywgMHg1QzM4LCAweDEyMjgsIDB4NUMzOSwgMHgxMjI5LCAweDVDM0EsIDB4MDkwOCwKKyAgICAweDVDM0IsIDB4MDlGMiwgMHg1QzNDLCAweDBDQ0MsIDB4NUMzRCwgMHgwQTFBLCAweDVDM0UsIDB4MEQ4QywgMHg1QzNGLAorICAgIDB4MENEOCwgMHg1QzQwLCAweDA2QzEsIDB4NUM0MSwgMHgxMjJBLCAweDVDNDUsIDB4MDY4OSwgMHg1QzQ2LCAweDEyMkIsCisgICAgMHg1QzQ4LCAweDA2RjYsIDB4NUM0QSwgMHgwQ0E3LCAweDVDNEIsIDB4MDUzMCwgMHg1QzRELCAweDA4QTEsIDB4NUM0RSwKKyAgICAweDEyMkMsIDB4NUM0RiwgMHgxMjJGLCAweDVDNTAsIDB4MTIyRSwgMHg1QzUxLCAweDA2RjUsIDB4NUM1MywgMHgxMjJELAorICAgIDB4NUM1NSwgMHgwQzMyLCAweDVDNUIsIDB4MUU5MiwgMHg1QzVFLCAweDBCMTAsIDB4NUM2MCwgMHgwQzQ1LCAweDVDNjEsCisgICAgMHgwOEY0LCAweDVDNjIsIDB4MUUwRCwgMHg1QzYzLCAweDM4OEYsIDB4NUM2NCwgMHgwQURBLCAweDVDNjUsIDB4MEY2NCwKKyAgICAweDVDNjksIDB4Mzg5MCwgMHg1QzZDLCAweDEyMzEsIDB4NUM2RSwgMHgxMjMyLCAweDVDNkYsIDB4MENBRSwgMHg1QzcxLAorICAgIDB4MDg4MSwgMHg1Qzc2LCAweDEyMzQsIDB4NUM3OSwgMHgxMjM1LCAweDVDN0MsIDB4Mzg5MSwgMHg1QzhDLCAweDEyMzYsCisgICAgMHg1QzkwLCAweDA2MzAsIDB4NUM5MSwgMHgxMjM3LCAweDVDOTQsIDB4MTIzOCwgMHg1Q0ExLCAweDA1MkMsIDB4NUNBNiwKKyAgICAweDIwRjYsIDB4NUNBOCwgMHgwQUJELCAweDVDQTksIDB4MDYyMCwgMHg1Q0FCLCAweDEyM0EsIDB4NUNBQywgMHgwRUI0LAorICAgIDB4NUNCMSwgMHgwQjMyLCAweDVDQjMsIDB4MDVCNywgMHg1Q0I2LCAweDEyM0MsIDB4NUNCNywgMHgxMjNFLCAweDVDQjgsCisgICAgMHgwNjFCLCAweDVDQkEsIDB4MjBGNywgMHg1Q0JCLCAweDEyM0IsIDB4NUNCQywgMHgxMjNELCAweDVDQkUsIDB4MTI0MCwKKyAgICAweDVDQzUsIDB4MTIzRiwgMHg1Q0M3LCAweDEyNDEsIDB4NUNDQiwgMHgzODkyLCAweDVDRDIsIDB4Mzg5MywgMHg1Q0Q5LAorICAgIDB4MTI0MiwgMHg1Q0UwLCAweDBDOTUsIDB4NUNFMSwgMHgwNkE2LCAweDVDRTYsIDB4MzcyQywgMHg1Q0U4LCAweDA1NjUsCisgICAgMHg1Q0U5LCAweDEyNDMsIDB4NUNFQSwgMHgxMjQ4LCAweDVDRUQsIDB4MTI0NiwgMHg1Q0VGLCAweDBFNDcsIDB4NUNGMCwKKyAgICAweDBFNDYsIDB4NUNGNCwgMHgzODk0LCAweDVDRjUsIDB4MjBGOCwgMHg1Q0Y2LCAweDBDNjEsIDB4NUNGQSwgMHgxMjQ1LAorICAgIDB4NUNGQiwgMHgwOTVFLCAweDVDRkQsIDB4MTI0NCwgMHg1RDA3LCAweDBBMzgsIDB4NUQwQiwgMHgxMjQ5LCAweDVEMEUsCisgICAgMHgwODVBLCAweDVEMTEsIDB4MTI0RiwgMHg1RDE0LCAweDEyNTAsIDB4NUQxNSwgMHgxMjRBLCAweDVEMTYsIDB4MDU5MSwKKyAgICAweDVEMTcsIDB4MTI0QiwgMHg1RDE4LCAweDEyNTQsIDB4NUQxOSwgMHgxMjUzLCAweDVEMUEsIDB4MTI1MiwgMHg1RDFCLAorICAgIDB4MTI0RSwgMHg1RDFGLCAweDEyNEQsIDB4NUQyMiwgMHgxMjUxLCAweDVEMjQsIDB4Mzg5NSwgMHg1RDI2LCAweDM4OTYsCisgICAgMHg1RDI3LCAweDIwRjksIDB4NUQyOSwgMHgwRTQ4LCAweDVENDIsIDB4MjBGQywgMHg1RDQzLCAweDM4OTcsIDB4NUQ0NiwKKyAgICAweDM4OTgsIDB4NUQ0QSwgMHgzODk5LCAweDVENEIsIDB4MTI1OCwgMHg1RDRDLCAweDEyNTUsIDB4NUQ0RSwgMHgxMjU3LAorICAgIDB4NUQ1MCwgMHgwRjVDLCAweDVENTIsIDB4MTI1NiwgMHg1RDUzLCAweDIwRkEsIDB4NUQ1QywgMHgxMjRDLCAweDVENjksCisgICAgMHgwQTM5LCAweDVENkMsIDB4MTI1OSwgMHg1RDZELCAweDIwRkQsIDB4NUQ2RiwgMHgwODI3LCAweDVENzMsIDB4MTI1QSwKKyAgICAweDVENzYsIDB4MTI1QiwgMHg1RDgyLCAweDEyNUUsIDB4NUQ4NCwgMHgxMjVELCAweDVEODcsIDB4MTI1QywgMHg1RDhCLAorICAgIDB4MEM2MiwgMHg1RDhDLCAweDEyNDcsIDB4NUQ5MCwgMHgxMjY0LCAweDVEOTIsIDB4Mzg5QSwgMHg1RDk0LCAweDM4OUIsCisgICAgMHg1RDk5LCAweDM4OUMsIDB4NUQ5RCwgMHgxMjYwLCAweDVEQTAsIDB4Mzg5RCwgMHg1REEyLCAweDEyNUYsIDB4NURBQywKKyAgICAweDEyNjEsIDB4NURBRSwgMHgxMjYyLCAweDVEQjIsIDB4M0JBNSwgMHg1REI3LCAweDEyNjUsIDB4NURCOCwgMHgyMEZFLAorICAgIDB4NURCOSwgMHgyMEZGLCAweDVEQkEsIDB4MEZBRSwgMHg1REJDLCAweDEyNjYsIDB4NURCRCwgMHgxMjYzLCAweDVEQzksCisgICAgMHgxMjY3LCAweDVEQ0MsIDB4MDYxQywgMHg1RENELCAweDEyNjgsIDB4NUREMCwgMHgyMTAwLCAweDVERDIsIDB4MTI2QSwKKyAgICAweDVERDMsIDB4MTI2OSwgMHg1REQ2LCAweDEyNkIsIDB4NUREOCwgMHgzODlFLCAweDVEREIsIDB4MTI2QywgMHg1RERELAorICAgIDB4MEE5MiwgMHg1RERFLCAweDA5MkQsIDB4NURFMCwgMHgzODlGLCAweDVERTEsIDB4MDk2RSwgMHg1REUyLCAweDM0MzIsCisgICAgMHg1REUzLCAweDBBRTUsIDB4NURFNSwgMHgwN0JCLCAweDVERTYsIDB4MDgyOCwgMHg1REU3LCAweDA3QkMsIDB4NURFOCwKKyAgICAweDA2OEEsIDB4NURFQiwgMHgxMjZELCAweDVERUUsIDB4MDgyOSwgMHg1REYxLCAweDA3N0UsIDB4NURGMiwgMHgxMjZFLAorICAgIDB4NURGMywgMHgwRUIyLCAweDVERjQsIDB4MENGOSwgMHg1REY1LCAweDEyNkYsIDB4NURGNywgMHgwN0JELCAweDVERjgsCisgICAgMHgzOEEwLCAweDVERkIsIDB4MDVFOCwgMHg1REZELCAweDBCNjUsIDB4NURGRSwgMHgwNkNBLCAweDVERkYsIDB4MzVFMiwKKyAgICAweDVFMDAsIDB4MzhBMSwgMHg1RTAyLCAweDA4QTIsIDB4NUUwMywgMHgwRENELCAweDVFMDYsIDB4MEQ1NSwgMHg1RTBCLAorICAgIDB4MTI3MCwgMHg1RTBDLCAweDA2MzEsIDB4NUUxMSwgMHgxMjczLCAweDVFMTIsIDB4MzhBMiwgMHg1RTE0LCAweDM4QTMsCisgICAgMHg1RTE1LCAweDM4QTQsIDB4NUUxNiwgMHgwQkJELCAweDVFMTgsIDB4MzhBNSwgMHg1RTE5LCAweDEyNzIsIDB4NUUxQSwKKyAgICAweDEyNzEsIDB4NUUxQiwgMHgxMjc0LCAweDVFMUQsIDB4MEMwNywgMHg1RTI1LCAweDBBMjksIDB4NUUyQiwgMHgwOEEzLAorICAgIDB4NUUyRCwgMHgwQTZFLCAweDVFMkUsIDB4MzhBNiwgMHg1RTJGLCAweDBCMzMsIDB4NUUzMCwgMHgwNjNDLCAweDVFMzMsCisgICAgMHgwQkJFLCAweDVFMzYsIDB4MTI3NSwgMHg1RTM3LCAweDEyNzYsIDB4NUUzOCwgMHgwOUQ3LCAweDVFM0QsIDB4MEU2NywKKyAgICAweDVFNDAsIDB4MTI3OSwgMHg1RTQzLCAweDEyNzgsIDB4NUU0NCwgMHgxMjc3LCAweDVFNDUsIDB4MERFRiwgMHg1RTQ3LAorICAgIDB4MTI4MCwgMHg1RTRDLCAweDBFODgsIDB4NUU0RSwgMHgxMjdBLCAweDVFNTQsIDB4MTI3QywgMHg1RTU1LCAweDBFOTksCisgICAgMHg1RTU3LCAweDEyN0IsIDB4NUU1OCwgMHgzOEE3LCAweDVFNUYsIDB4MTI3RCwgMHg1RTYxLCAweDBEM0MsIDB4NUU2MiwKKyAgICAweDEyN0UsIDB4NUU2MywgMHgwRTBFLCAweDVFNjQsIDB4MTI3RiwgMHg1RTZCLCAweDM4QTgsIDB4NUU2QywgMHgzOEE5LAorICAgIDB4NUU3MiwgMHgwNUVGLCAweDVFNzMsIDB4MEUwRiwgMHg1RTc0LCAweDBDRTUsIDB4NUU3NSwgMHgxMjgxLCAweDVFNzYsCisgICAgMHgxMjgyLCAweDVFNzgsIDB4MDdCRSwgMHg1RTc5LCAweDA1RjAsIDB4NUU3QSwgMHgxMjgzLCAweDVFN0IsIDB4MDc2QywKKyAgICAweDVFN0MsIDB4MEYyRSwgMHg1RTdELCAweDBGMTMsIDB4NUU3RSwgMHgwNjMyLCAweDVFN0YsIDB4MTI4NSwgMHg1RTgxLAorICAgIDB4MEJCRiwgMHg1RTgzLCAweDA3QkYsIDB4NUU4NCwgMHgwOTk5LCAweDVFODcsIDB4MEQ3MywgMHg1RThBLCAweDA5OUEsCisgICAgMHg1RThGLCAweDA5ODIsIDB4NUU5NSwgMHgwQzA4LCAweDVFOTYsIDB4MEU0OSwgMHg1RTk3LCAweDBDMzMsIDB4NUU5OSwKKyAgICAweDM2QjAsIDB4NUU5QSwgMHgwN0MwLCAweDVFOUMsIDB4MERDRSwgMHg1RUEwLCAweDEyODYsIDB4NUVBNiwgMHgwQzUzLAorICAgIDB4NUVBNywgMHgwODMyLCAweDVFQTgsIDB4MzhBQSwgMHg1RUFBLCAweDM4QUIsIDB4NUVBQiwgMHgwNzdGLCAweDVFQUQsCisgICAgMHgwQzA5LCAweDVFQjUsIDB4MDQ4NywgMHg1RUI2LCAweDA5NzgsIDB4NUVCNywgMHgwN0MxLCAweDVFQjgsIDB4MEYzMSwKKyAgICAweDVFQkUsIDB4MzhBQywgMHg1RUJGLCAweDM4QUQsIDB4NUVDMSwgMHgxMjg3LCAweDVFQzIsIDB4MTI4OCwgMHg1RUMzLAorICAgIDB4MEQwNywgMHg1RUM4LCAweDEyODksIDB4NUVDOSwgMHgwRkJGLCAweDVFQ0EsIDB4MEZEMywgMHg1RUNCLCAweDM4QUUsCisgICAgMHg1RUNGLCAweDEyOEIsIDB4NUVEMCwgMHgxMjhBLCAweDVFRDIsIDB4MzhBRiwgMHg1RUQzLCAweDA1QTUsIDB4NUVENiwKKyAgICAweDEyOEMsIDB4NUVEQSwgMHgxMjhGLCAweDVFREIsIDB4MTI5MCwgMHg1RURELCAweDEyOEUsIDB4NUVERiwgMHgwREIyLAorICAgIDB4NUVFMCwgMHgwOTlCLCAweDVFRTEsIDB4MTI5MiwgMHg1RUUyLCAweDEyOTEsIDB4NUVFMywgMHgxMjhELCAweDVFRTgsCisgICAgMHgxMjkzLCAweDVFRTksIDB4MTI5NCwgMHg1RUVDLCAweDEyOTUsIDB4NUVGMCwgMHgxMjk4LCAweDVFRjEsIDB4MTI5NiwKKyAgICAweDVFRjMsIDB4MTI5NywgMHg1RUY0LCAweDEyOTksIDB4NUVGNiwgMHgwNTA2LCAweDVFRjcsIDB4MEMwQSwgMHg1RUY4LAorICAgIDB4MTI5QSwgMHg1RUZBLCAweDA3NTAsIDB4NUVGQiwgMHgwNTc2LCAweDVFRkMsIDB4MENFQywgMHg1RUZFLCAweDEyOUIsCisgICAgMHg1RUZGLCAweDBDRDMsIDB4NUYwMSwgMHgwRTJCLCAweDVGMDMsIDB4MTI5QywgMHg1RjA0LCAweDBGRDQsIDB4NUYwNywKKyAgICAweDM4QjAsIDB4NUYwOSwgMHgxMjlELCAweDVGMEEsIDB4MEUxMCwgMHg1RjBCLCAweDEyQTAsIDB4NUYwQywgMHgwRkZBLAorICAgIDB4NUYwRCwgMHgxMDBBLCAweDVGMEUsIDB4MzhCMSwgMHg1RjBGLCAweDA4REMsIDB4NUYxMCwgMHgwQ0NELCAweDVGMTEsCisgICAgMHgxMkExLCAweDVGMTMsIDB4MDY3NywgMHg1RjE0LCAweDBCQzAsIDB4NUYxNSwgMHgwNEJFLCAweDVGMTYsIDB4MTJBMiwKKyAgICAweDVGMTcsIDB4MERGNiwgMHg1RjE4LCAweDA3QzIsIDB4NUYxQiwgMHgwQjhFLCAweDVGMUMsIDB4MzhCMiwgMHg1RjFELAorICAgIDB4MzhCMywgMHg1RjFGLCAweDBDMEIsIDB4NUYyMSwgMHgyMTAxLCAweDVGMjIsIDB4MzhCNCwgMHg1RjI1LCAweDBFRkIsCisgICAgMHg1RjI2LCAweDA3NkQsIDB4NUYyNywgMHgwNzgwLCAweDVGMjgsIDB4MzhCNSwgMHg1RjI5LCAweDEyQTMsIDB4NUYyRCwKKyAgICAweDEyQTQsIDB4NUYyRiwgMHgxMkFBLCAweDVGMzEsIDB4MDkxMSwgMHg1RjM0LCAweDIxMDIsIDB4NUYzNSwgMHgwQkMxLAorICAgIDB4NUYzNiwgMHgzOEI2LCAweDVGMzcsIDB4MDZBNywgMHg1RjM4LCAweDEyQTUsIDB4NUYzQSwgMHgzNTk4LCAweDVGM0IsCisgICAgMHgzOEI3LCAweDVGM0MsIDB4MEQ5RCwgMHg1RjNFLCAweDBCODQsIDB4NUY0MCwgMHgzOEI4LCAweDVGNDEsIDB4MTJBNiwKKyAgICAweDVGNDUsIDB4MjBCMiwgMHg1RjQ4LCAweDEyQTcsIDB4NUY0QSwgMHgwNkE4LCAweDVGNEMsIDB4MTJBOCwgMHg1RjRFLAorICAgIDB4MTJBOSwgMHg1RjUwLCAweDM4QjksIDB4NUY1MSwgMHgxMkFCLCAweDVGNTMsIDB4MEM3MCwgMHg1RjU2LCAweDEyQUMsCisgICAgMHg1RjU3LCAweDEyQUQsIDB4NUY1OCwgMHgzOEJBLCAweDVGNTksIDB4MTJBRSwgMHg1RjVDLCAweDEyOUYsIDB4NUY1RCwKKyAgICAweDEyOUUsIDB4NUY2MSwgMHgxMkFGLCAweDVGNjIsIDB4MDcxNywgMHg1RjY0LCAweDM4QkIsIDB4NUY2NSwgMHgzNkFDLAorICAgIDB4NUY2NiwgMHgwRDk5LCAweDVGNjcsIDB4MjEwMywgMHg1RjY5LCAweDA4M0MsIDB4NUY2QSwgMHgwREE5LCAweDVGNkIsCisgICAgMHgwQkMyLCAweDVGNkMsIDB4MERCRCwgMHg1RjZELCAweDEyQjAsIDB4NUY3MCwgMHgwOTlDLCAweDVGNzEsIDB4MDRFOCwKKyAgICAweDVGNzMsIDB4MTJCMSwgMHg1Rjc3LCAweDEyQjIsIDB4NUY3OSwgMHgwRUZFLCAweDVGN0MsIDB4MEQ3NCwgMHg1RjdGLAorICAgIDB4MTJCNSwgMHg1RjgwLCAweDA1MUYsIDB4NUY4MSwgMHgwQTUwLCAweDVGODIsIDB4MTJCNCwgMHg1RjgzLCAweDEyQjMsCisgICAgMHg1Rjg0LCAweDA3MTgsIDB4NUY4NSwgMHgwQjM0LCAweDVGODcsIDB4MTJCOSwgMHg1Rjg4LCAweDEyQjcsIDB4NUY4OSwKKyAgICAweDM4QkMsIDB4NUY4QSwgMHgxMkI2LCAweDVGOEIsIDB4MEY2RiwgMHg1RjhDLCAweDA3OTksIDB4NUY5MCwgMHgwOTgzLAorICAgIDB4NUY5MSwgMHgxMkI4LCAweDVGOTIsIDB4MEM0NiwgMHg1RjkzLCAweDA5NDgsIDB4NUY5NywgMHgwQzk4LCAweDVGOTgsCisgICAgMHgxMkJDLCAweDVGOTksIDB4MTJCQiwgMHg1RjlDLCAweDM4QkQsIDB4NUY5RSwgMHgxMkJBLCAweDVGQTAsIDB4MTJCRCwKKyAgICAweDVGQTEsIDB4MDc5QSwgMHg1RkE0LCAweDM4QkYsIDB4NUZBNywgMHgzOEJFLCAweDVGQTgsIDB4MTJCRSwgMHg1RkE5LAorICAgIDB4MERFRSwgMHg1RkFBLCAweDA5NjUsIDB4NUZBRCwgMHgxMkJGLCAweDVGQUUsIDB4MEQ4RCwgMHg1RkFGLCAweDM4QzAsCisgICAgMHg1RkIzLCAweDBDOTksIDB4NUZCNCwgMHgwQkMzLCAweDVGQjUsIDB4MzQzOCwgMHg1RkI3LCAweDIxMDQsIDB4NUZCOCwKKyAgICAweDM4QzEsIDB4NUZCOSwgMHgwQzJBLCAweDVGQkMsIDB4MTJDMCwgMHg1RkJELCAweDA2NDUsIDB4NUZDMywgMHgwOUZBLAorICAgIDB4NUZDNCwgMHgzOEMyLCAweDVGQzUsIDB4MEQ5RSwgMHg1RkM5LCAweDM4QzMsIDB4NUZDQywgMHgwNjMzLCAweDVGQ0QsCisgICAgMHgwQ0RDLCAweDVGRDYsIDB4MTJDMSwgMHg1RkQ3LCAweDA4QTQsIDB4NUZEOCwgMHgwRTY4LCAweDVGRDksIDB4MEU2OSwKKyAgICAweDVGREMsIDB4MDUyMCwgMHg1RkRELCAweDEyQzYsIDB4NUZERSwgMHgyMTA1LCAweDVGRTAsIDB4MEJBNywgMHg1RkUxLAorICAgIDB4MzhDNCwgMHg1RkU0LCAweDEyQzMsIDB4NUZFOSwgMHgzOEM1LCAweDVGRUIsIDB4MDU3NywgMHg1RkVELCAweDM4QzYsCisgICAgMHg1RkYwLCAweDEyRjYsIDB4NUZGMSwgMHgxMkM1LCAweDVGRjUsIDB4MENFNiwgMHg1RkY4LCAweDEyQzQsIDB4NUZGQiwKKyAgICAweDEyQzIsIDB4NUZGQywgMHgzOEM3LCAweDVGRkQsIDB4MDgwQywgMHg1RkZGLCAweDEyQzgsIDB4NjAwRSwgMHgxMkNFLAorICAgIDB4NjAwRiwgMHgxMkQ0LCAweDYwMTAsIDB4MTJDQywgMHg2MDEyLCAweDBDNTYsIDB4NjAxNSwgMHgxMkQxLCAweDYwMTYsCisgICAgMHgwRENGLCAweDYwMTcsIDB4MzhDOCwgMHg2MDE5LCAweDEyQ0IsIDB4NjAxQSwgMHgzOEM5LCAweDYwMUIsIDB4MTJEMCwKKyAgICAweDYwMUMsIDB4MEZBRiwgMHg2MDFELCAweDA4QTUsIDB4NjAyMCwgMHgwQjM1LCAweDYwMjEsIDB4MTJDOSwgMHg2MDI1LAorICAgIDB4MDY3OCwgMHg2MDI2LCAweDEyRDMsIDB4NjAyNywgMHgwQTUxLCAweDYwMjgsIDB4MDUwNywgMHg2MDI5LCAweDEyQ0QsCisgICAgMHg2MDJBLCAweDA1NzgsIDB4NjAyQiwgMHgxMkQyLCAweDYwMkYsIDB4MDZBOSwgMHg2MDMxLCAweDEyQ0YsIDB4NjAzMywKKyAgICAweDM4Q0EsIDB4NjAzQSwgMHgxMkQ1LCAweDYwNDEsIDB4MTJENywgMHg2MDQyLCAweDEyRTEsIDB4NjA0MywgMHgxMkRGLAorICAgIDB4NjA0NiwgMHgxMkRDLCAweDYwNEEsIDB4MTJEQiwgMHg2MDRCLCAweDBGQzAsIDB4NjA0RCwgMHgxMkRELCAweDYwNTAsCisgICAgMHgwNkFBLCAweDYwNTIsIDB4MDdDMywgMHg2MDU1LCAweDA5ODQsIDB4NjA1OSwgMHgxMkU0LCAweDYwNUEsIDB4MTJENiwKKyAgICAweDYwNUQsIDB4MjEwNiwgMHg2MDVGLCAweDEyREEsIDB4NjA2MCwgMHgxMkNBLCAweDYwNjEsIDB4MzhDQiwgMHg2MDYyLAorICAgIDB4MDU3QSwgMHg2MDYzLCAweDEyREUsIDB4NjA2NCwgMHgxMkUwLCAweDYwNjUsIDB4MEI4RiwgMHg2MDY4LCAweDA4MTgsCisgICAgMHg2MDY5LCAweDA1MzgsIDB4NjA2QSwgMHgxMkQ4LCAweDYwNkIsIDB4MTJFMywgMHg2MDZDLCAweDEyRTIsIDB4NjA2RCwKKyAgICAweDA2QUIsIDB4NjA2RiwgMHgwQjA5LCAweDYwNzAsIDB4MDVDNCwgMHg2MDc1LCAweDA3MTksIDB4NjA3NywgMHgxMkQ5LAorICAgIDB4NjA3RiwgMHgzOENDLCAweDYwODEsIDB4MTJFNSwgMHg2MDgzLCAweDEyRTgsIDB4NjA4NCwgMHgxMkVBLCAweDYwODUsCisgICAgMHgyMTA3LCAweDYwODksIDB4MDhFOSwgMHg2MDhBLCAweDIxMDgsIDB4NjA4QiwgMHgxMkYwLCAweDYwOEMsIDB4MEMwQywKKyAgICAweDYwOEQsIDB4MTJFNiwgMHg2MDkyLCAweDEyRUUsIDB4NjA5NCwgMHgwNTc5LCAweDYwOTYsIDB4MTJFQywgMHg2MDk3LAorICAgIDB4MTJFRCwgMHg2MDlBLCAweDEyRTksIDB4NjA5QiwgMHgxMkVCLCAweDYwOUUsIDB4MzhDRCwgMHg2MDlGLCAweDA3OUIsCisgICAgMHg2MEEwLCAweDBGMTQsIDB4NjBBMywgMHgwNUYxLCAweDYwQTQsIDB4MzhDRSwgMHg2MEE2LCAweDA0RkIsIDB4NjBBNywKKyAgICAweDEyRUYsIDB4NjBBOSwgMHgwQ0YwLCAweDYwQUEsIDB4MDQ3MSwgMHg2MEIwLCAweDM4Q0YsIDB4NjBCMiwgMHgwRDc1LAorICAgIDB4NjBCMywgMHgxMkM3LCAweDYwQjQsIDB4MTJGNSwgMHg2MEI1LCAweDEyRjksIDB4NjBCNiwgMHgwRUYxLCAweDYwQjgsCisgICAgMHgxMkYyLCAweDYwQkMsIDB4MEM2MywgMHg2MEJELCAweDEyRjcsIDB4NjBDNSwgMHgwOUQ4LCAweDYwQzYsIDB4MTJGOCwKKyAgICAweDYwQzcsIDB4MENBRiwgMHg2MENCLCAweDM4RDAsIDB4NjBEMSwgMHgwRkVELCAweDYwRDMsIDB4MTJGNCwgMHg2MEQ1LAorICAgIDB4MjEwQSwgMHg2MEQ4LCAweDEyRkEsIDB4NjBEQSwgMHgwODBELCAweDYwREIsIDB4MzhEMSwgMHg2MERDLCAweDBBNkYsCisgICAgMHg2MERFLCAweDIxMDksIDB4NjBERiwgMHgwNDk4LCAweDYwRTAsIDB4MTJGMywgMHg2MEUxLCAweDEyRjEsIDB4NjBFMywKKyAgICAweDBBREMsIDB4NjBFNywgMHgxMkU3LCAweDYwRTgsIDB4MDg4MiwgMHg2MEYwLCAweDBCMjYsIDB4NjBGMSwgMHgxMzA2LAorICAgIDB4NjBGMiwgMHgyMTBDLCAweDYwRjMsIDB4MEFERCwgMHg2MEY0LCAweDEzMDEsIDB4NjBGNiwgMHgxMkZFLCAweDYwRjcsCisgICAgMHgxMkZGLCAweDYwRjgsIDB4MzhEMiwgMHg2MEY5LCAweDA5MTIsIDB4NjBGQSwgMHgxMzAyLCAweDYwRkIsIDB4MTMwNSwKKyAgICAweDYxMDAsIDB4MTMwMCwgMHg2MTAxLCAweDA5MkYsIDB4NjEwMywgMHgxMzAzLCAweDYxMDYsIDB4MTJGRCwgMHg2MTA4LAorICAgIDB4MEYwOCwgMHg2MTA5LCAweDBGMDcsIDB4NjEwRCwgMHgxMzA3LCAweDYxMEUsIDB4MTMwOCwgMHg2MTBGLCAweDA0OTksCisgICAgMHg2MTExLCAweDIxMEQsIDB4NjExMiwgMHgzOEQzLCAweDYxMTMsIDB4MzhENCwgMHg2MTE0LCAweDM4RDUsIDB4NjExNSwKKyAgICAweDEyRkMsIDB4NjExQSwgMHgwNkVBLCAweDYxMUIsIDB4MDQ2QSwgMHg2MTFDLCAweDM4RDYsIDB4NjExRiwgMHgwNUYyLAorICAgIDB4NjEyMCwgMHgyMTBCLCAweDYxMjEsIDB4MTMwNCwgMHg2MTI3LCAweDEzMEMsIDB4NjEyOCwgMHgxMzBCLCAweDYxMkMsCisgICAgMHgxMzEwLCAweDYxMzAsIDB4MjEwRiwgMHg2MTM0LCAweDEzMTEsIDB4NjEzNywgMHgyMTBFLCAweDYxM0MsIDB4MTMwRiwKKyAgICAweDYxM0QsIDB4MTMxMiwgMHg2MTNFLCAweDEzMEEsIDB4NjEzRiwgMHgxMzBFLCAweDYxNDIsIDB4MTMxMywgMHg2MTQ0LAorICAgIDB4MTMxNCwgMHg2MTQ3LCAweDEzMDksIDB4NjE0OCwgMHgwOENBLCAweDYxNEEsIDB4MTMwRCwgMHg2MTRCLCAweDBCMzYsCisgICAgMHg2MTRDLCAweDA3QzQsIDB4NjE0RCwgMHgxMkZCLCAweDYxNEUsIDB4MDlGQiwgMHg2MTUzLCAweDEzMjEsIDB4NjE1NSwKKyAgICAweDBFMzksIDB4NjE1OCwgMHgxMzE3LCAweDYxNTksIDB4MTMxOCwgMHg2MTVBLCAweDEzMTksIDB4NjE1RCwgMHgxMzIwLAorICAgIDB4NjE1RiwgMHgxMzFGLCAweDYxNjIsIDB4MEVBQiwgMHg2MTYzLCAweDA1RjMsIDB4NjE2NSwgMHgxMzFELCAweDYxNjcsCisgICAgMHgwNzFCLCAweDYxNjgsIDB4MDU5MiwgMHg2MTZCLCAweDEzMUEsIDB4NjE2RSwgMHgwRjgwLCAweDYxNkYsIDB4MTMxQywKKyAgICAweDYxNzAsIDB4MDQ5QSwgMHg2MTcxLCAweDEzMUUsIDB4NjE3MywgMHgxMzE1LCAweDYxNzQsIDB4MTMxQiwgMHg2MTc1LAorICAgIDB4MTMyMiwgMHg2MTc2LCAweDA3MUEsIDB4NjE3NywgMHgxMzE2LCAweDYxN0MsIDB4MzhENywgMHg2MTdFLCAweDBGNDcsCisgICAgMHg2MTgyLCAweDBGMTUsIDB4NjE4NywgMHgxMzI1LCAweDYxOEEsIDB4MTMyOSwgMHg2MThELCAweDM4RDgsIDB4NjE4RSwKKyAgICAweDBCMDAsIDB4NjE5MCwgMHgwRkMxLCAweDYxOTEsIDB4MTMyQSwgMHg2MTk0LCAweDEzMjcsIDB4NjE5NiwgMHgxMzI0LAorICAgIDB4NjE5OCwgMHgyMTEwLCAweDYxOTksIDB4MTMyMywgMHg2MTlBLCAweDEzMjgsIDB4NjE5RiwgMHgzOEQ5LCAweDYxQTQsCisgICAgMHgwRTAwLCAweDYxQTcsIDB4MEM4QywgMHg2MUE4LCAweDM4REEsIDB4NjFBOSwgMHgwNzFDLCAweDYxQUIsIDB4MTMyQiwKKyAgICAweDYxQUMsIDB4MTMyNiwgMHg2MUFFLCAweDEzMkMsIDB4NjFCMiwgMHgwNzUxLCAweDYxQjYsIDB4MDUzMSwgMHg2MUJBLAorICAgIDB4MTMzNCwgMHg2MUJFLCAweDA1RjQsIDB4NjFDMiwgMHgzOERCLCAweDYxQzMsIDB4MTMzMiwgMHg2MUM2LCAweDEzMzMsCisgICAgMHg2MUM3LCAweDA4MTksIDB4NjFDOCwgMHgxMzMxLCAweDYxQzksIDB4MTMyRiwgMHg2MUNBLCAweDEzMkUsIDB4NjFDQiwKKyAgICAweDEzMzUsIDB4NjFDQywgMHgxMzJELCAweDYxQ0QsIDB4MTMzNywgMHg2MUQwLCAweDA1N0IsIDB4NjFERiwgMHgzOERDLAorICAgIDB4NjFFMywgMHgxMzM5LCAweDYxRTYsIDB4MTMzOCwgMHg2MUYyLCAweDBCQzQsIDB4NjFGNCwgMHgxMzNDLCAweDYxRjYsCisgICAgMHgxMzNBLCAweDYxRjcsIDB4MTMzMCwgMHg2MUY4LCAweDA3NTIsIDB4NjFGQSwgMHgxMzNCLCAweDYxRkMsIDB4MTMzRiwKKyAgICAweDYxRkQsIDB4MTMzRSwgMHg2MUZFLCAweDEzNDAsIDB4NjFGRiwgMHgxMzNELCAweDYyMDAsIDB4MTM0MSwgMHg2MjA4LAorICAgIDB4MTM0MiwgMHg2MjA5LCAweDEzNDMsIDB4NjIwQSwgMHgwRTNBLCAweDYyMEMsIDB4MTM0NSwgMHg2MjBELCAweDEzNDQsCisgICAgMHg2MjBFLCAweDA5NDksIDB4NjIxMCwgMHgwQTUyLCAweDYyMTEsIDB4MDU2NiwgMHg2MjEyLCAweDA1N0MsIDB4NjIxMywKKyAgICAweDIxMTEsIDB4NjIxNCwgMHgxMzQ2LCAweDYyMTUsIDB4MzhERCwgMHg2MjE2LCAweDA0ODMsIDB4NjIxQSwgMHgwQTcwLAorICAgIDB4NjIxQiwgMHgxMzQ3LCAweDYyMUQsIDB4MUE2NCwgMHg2MjFFLCAweDEzNDgsIDB4NjIxRiwgMHgwNzM3LCAweDYyMjEsCisgICAgMHgxMzQ5LCAweDYyMjYsIDB4MEE5MywgMHg2MjI5LCAweDM4REUsIDB4NjIyQSwgMHgxMzRBLCAweDYyMkUsIDB4MTM0QiwKKyAgICAweDYyMkYsIDB4MDY1NCwgMHg2MjMwLCAweDEzNEMsIDB4NjIzMiwgMHgxMzRELCAweDYyMzMsIDB4MTM0RSwgMHg2MjM0LAorICAgIDB4MEIzNywgMHg2MjM2LCAweDM1QkQsIDB4NjIzOCwgMHgwNzgxLCAweDYyM0IsIDB4MEVFRCwgMHg2MjNFLCAweDM0NEUsCisgICAgMHg2MjNGLCAweDBFNkEsIDB4NjI0MCwgMHgwOTc0LCAweDYyNDEsIDB4MTM0RiwgMHg2MjQzLCAweDM4REYsIDB4NjI0NiwKKyAgICAweDM4RTAsIDB4NjI0NywgMHgwQTk0LCAweDYyNDgsIDB4MUIxQSwgMHg2MjQ5LCAweDBENzYsIDB4NjI0QiwgMHgwOTE2LAorICAgIDB4NjI0QywgMHgzOEUxLCAweDYyNEQsIDB4MDgzRCwgMHg2MjRFLCAweDEzNTAsIDB4NjI1MSwgMHgzOEUyLCAweDYyNTMsCisgICAgMHgwQjI3LCAweDYyNTUsIDB4MERGNywgMHg2MjU2LCAweDM4RTMsIDB4NjI1OCwgMHgwQjUxLCAweDYyNUIsIDB4MTM1MywKKyAgICAweDYyNUUsIDB4MTM1MSwgMHg2MjYwLCAweDEzNTQsIDB4NjI2MywgMHgxMzUyLCAweDYyNjgsIDB4MTM1NSwgMHg2MjZFLAorICAgIDB4MEUwMSwgMHg2MjcxLCAweDA0N0IsIDB4NjI3NiwgMHgwREQwLCAweDYyNzksIDB4MEQ3NywgMHg2MjdDLCAweDEzNTYsCisgICAgMHg2MjdFLCAweDEzNTksIDB4NjI3RiwgMHgwOTlELCAweDYyODAsIDB4MDY1NSwgMHg2MjgyLCAweDEzNTcsIDB4NjI4MywKKyAgICAweDEzNUUsIDB4NjI4NCwgMHgwOTlFLCAweDYyODUsIDB4MzVDNSwgMHg2Mjg5LCAweDEzNTgsIDB4NjI4QSwgMHgwQ0ZBLAorICAgIDB4NjI5MSwgMHgwRjQ4LCAweDYyOTIsIDB4MTM1QSwgMHg2MjkzLCAweDEzNUIsIDB4NjI5NCwgMHgxMzVGLCAweDYyOTUsCisgICAgMHgwQzY0LCAweDYyOTYsIDB4MTM1QywgMHg2Mjk3LCAweDA3QzUsIDB4NjI5OCwgMHgwQTgyLCAweDYyOUIsIDB4MTM2RCwKKyAgICAweDYyOUMsIDB4MEQ0OCwgMHg2MjlFLCAweDBCNTIsIDB4NjJBNiwgMHgyMTEyLCAweDYyQUIsIDB4MEQ3OCwgMHg2MkFDLAorICAgIDB4MTNCMiwgMHg2MkIxLCAweDBFNEEsIDB4NjJCNSwgMHgwQzBELCAweDYyQjksIDB4MEVBMywgMHg2MkJCLCAweDEzNjIsCisgICAgMHg2MkJDLCAweDA1MjEsIDB4NjJCRCwgMHgwQkE4LCAweDYyQzIsIDB4MTM2QiwgMHg2MkM0LCAweDM4RTQsIDB4NjJDNSwKKyAgICAweDBCNzIsIDB4NjJDNiwgMHgxMzY1LCAweDYyQzcsIDB4MTM2QywgMHg2MkM4LCAweDEzNjcsIDB4NjJDOSwgMHgxMzZFLAorICAgIDB4NjJDQSwgMHgxMzZBLCAweDYyQ0MsIDB4MTM2OSwgMHg2MkNELCAweDBEMjUsIDB4NjJDRiwgMHgxMzYzLCAweDYyRDAsCisgICAgMHgwNTdELCAweDYyRDEsIDB4MTM2MSwgMHg2MkQyLCAweDA2OEIsIDB4NjJEMywgMHgwQjUzLCAweDYyRDQsIDB4MTM1RCwKKyAgICAweDYyRDcsIDB4MTM2MCwgMHg2MkQ4LCAweDA3QzYsIDB4NjJEOSwgMHgwQTdGLCAweDYyREIsIDB4MDk5RiwgMHg2MkRDLAorICAgIDB4MTM2OCwgMHg2MkRELCAweDBEMDgsIDB4NjJFMCwgMHgwNjhDLCAweDYyRTEsIDB4MDVBNiwgMHg2MkVDLCAweDA1QzUsCisgICAgMHg2MkVELCAweDA5RTcsIDB4NjJFRSwgMHgxMzcwLCAweDYyRUYsIDB4MTM3NSwgMHg2MkYxLCAweDEzNzEsIDB4NjJGMywKKyAgICAweDA3NTMsIDB4NjJGNSwgMHgxMzc2LCAweDYyRjYsIDB4MDg3MCwgMHg2MkY3LCAweDA3RkIsIDB4NjJGQywgMHgzOEU1LAorICAgIDB4NjJGRSwgMHgwOTMwLCAweDYyRkYsIDB4MTM2NCwgMHg2MzAxLCAweDA4Q0IsIDB4NjMwMiwgMHgxMzczLCAweDYzMDcsCisgICAgMHgwOEE2LCAweDYzMDgsIDB4MTM3NCwgMHg2MzA5LCAweDA0ODgsIDB4NjMwQSwgMHgzOEU2LCAweDYzMEMsIDB4MTM2RiwKKyAgICAweDYzMEQsIDB4MzhFNywgMHg2MzExLCAweDBCQzUsIDB4NjMxOCwgMHgzOEU4LCAweDYzMTksIDB4MDY4RCwgMHg2MzFCLAorICAgIDB4MzczNywgMHg2MzFGLCAweDA2QUMsIDB4NjMyNywgMHgxMzcyLCAweDYzMjgsIDB4MDQ2QiwgMHg2MzJCLCAweDA4MzMsCisgICAgMHg2MzJGLCAweDA5RkMsIDB4NjMzOSwgMHgzOEU5LCAweDYzM0EsIDB4MEMwRSwgMHg2MzNELCAweDBENjgsIDB4NjMzRSwKKyAgICAweDEzNzgsIDB4NjMzRiwgMHgwQUUwLCAweDYzNDIsIDB4MzhFQSwgMHg2MzQzLCAweDM4RUIsIDB4NjM0OSwgMHgwQjBBLAorICAgIDB4NjM0QywgMHgwODc5LCAweDYzNEQsIDB4MTM3OSwgMHg2MzRGLCAweDEzN0IsIDB4NjM1MCwgMHgxMzc3LCAweDYzNTUsCisgICAgMHgwRTMxLCAweDYzNTcsIDB4MEJEOSwgMHg2MzVDLCAweDBBREUsIDB4NjM2NSwgMHgzOEVDLCAweDYzNjcsIDB4MEU0QiwKKyAgICAweDYzNjgsIDB4MDhGQSwgMHg2MzY5LCAweDEzODcsIDB4NjM2QiwgMHgxMzg2LCAweDYzNkUsIDB4MEEzRSwgMHg2MzcyLAorICAgIDB4MDc1NCwgMHg2Mzc0LCAweDM4RUQsIDB4NjM3NiwgMHgxMzgwLCAweDYzNzcsIDB4MDlBMSwgMHg2MzdBLCAweDBDQzAsCisgICAgMHg2MzdCLCAweDBDRTcsIDB4NjM3RCwgMHgzOEVFLCAweDYzODAsIDB4MTM3RSwgMHg2MzgzLCAweDBBREYsIDB4NjM4NCwKKyAgICAweDM4RUYsIDB4NjM4NywgMHgzOEYwLCAweDYzODgsIDB4MDkyNCwgMHg2Mzg5LCAweDEzODMsIDB4NjM4QywgMHgwOUEwLAorICAgIDB4NjM4RSwgMHgxMzdELCAweDYzOEYsIDB4MTM4MiwgMHg2MzkwLCAweDM4RjEsIDB4NjM5MiwgMHgwRDA5LCAweDYzOTYsCisgICAgMHgxMzdDLCAweDYzOTgsIDB4MDZGNywgMHg2MzlCLCAweDA1QkIsIDB4NjM5RSwgMHgzOEYyLCAweDYzOUYsIDB4MTM4NCwKKyAgICAweDYzQTAsIDB4MEY3MywgMHg2M0ExLCAweDA4M0UsIDB4NjNBMiwgMHgwQjczLCAweDYzQTMsIDB4MTM4MSwgMHg2M0E1LAorICAgIDB4MEE4MCwgMHg2M0E3LCAweDA3QzcsIDB4NjNBOCwgMHgwQTJBLCAweDYzQTksIDB4MDUwOCwgMHg2M0FBLCAweDBBQkUsCisgICAgMHg2M0FCLCAweDEzN0YsIDB4NjNBQywgMHgwNjVGLCAweDYzQjIsIDB4MDcxRCwgMHg2M0I0LCAweDBCRUIsIDB4NjNCNSwKKyAgICAweDEzODUsIDB4NjNCQiwgMHgwQUUxLCAweDYzQkUsIDB4MTM4OCwgMHg2M0MwLCAweDEzOEEsIDB4NjNDMywgMHgwQjE3LAorICAgIDB4NjNDNCwgMHgxMzkwLCAweDYzQzYsIDB4MTM4QiwgMHg2M0M5LCAweDEzOEQsIDB4NjNDRiwgMHgwREIzLCAweDYzRDAsCisgICAgMHgwQzBGLCAweDYzRDEsIDB4MzhGMywgMHg2M0QyLCAweDEzOEUsIDB4NjNENiwgMHgwRjE2LCAweDYzREEsIDB4MEYzMiwKKyAgICAweDYzREIsIDB4MDVGNSwgMHg2M0RDLCAweDM4RjQsIDB4NjNFMSwgMHgwNDcyLCAweDYzRTMsIDB4MTM4QywgMHg2M0U5LAorICAgIDB4MTM4OSwgMHg2M0VELCAweDM0MUMsIDB4NjNFRSwgMHgwNjM0LCAweDYzRjQsIDB4MDUwOSwgMHg2M0Y1LCAweDIxMTMsCisgICAgMHg2M0Y2LCAweDEzOEYsIDB4NjNGNywgMHgzNjQ0LCAweDYzRkEsIDB4MEYzMywgMHg2NDA2LCAweDEzOTMsIDB4NjQwOSwKKyAgICAweDM4RjUsIDB4NjQwRCwgMHgwQjFCLCAweDY0MEYsIDB4MTM5QSwgMHg2NDEwLCAweDM4RjYsIDB4NjQxMywgMHgxMzk0LAorICAgIDB4NjQxNCwgMHgxRTJDLCAweDY0MTYsIDB4MTM5MSwgMHg2NDE3LCAweDEzOTgsIDB4NjQxQywgMHgxMzdBLCAweDY0MjIsCisgICAgMHgzOEY3LCAweDY0MjYsIDB4MTM5NSwgMHg2NDI4LCAweDEzOTksIDB4NjQyQywgMHgwRDU2LCAweDY0MkQsIDB4MEM2NSwKKyAgICAweDY0MzQsIDB4MTM5MiwgMHg2NDM2LCAweDEzOTYsIDB4NjQzQSwgMHgwNzFFLCAweDY0M0UsIDB4MDg2MSwgMHg2NDQyLAorICAgIDB4MEE4MSwgMHg2NDRFLCAweDEzOUUsIDB4NjQ1MSwgMHgxRTQzLCAweDY0NTQsIDB4MzhGOCwgMHg2NDU4LCAweDBDMjAsCisgICAgMHg2NDVCLCAweDM4RjksIDB4NjQ2MCwgMHgyMTE0LCAweDY0NjcsIDB4MTM5QiwgMHg2NDY5LCAweDBFOEUsIDB4NjQ2RCwKKyAgICAweDM4RkEsIDB4NjQ2RiwgMHgxMzlDLCAweDY0NzYsIDB4MTM5RCwgMHg2NDc4LCAweDBFREEsIDB4NjQ3QSwgMHgwQTQ2LAorICAgIDB4NjQ3QiwgMHgzOEZCLCAweDY0ODMsIDB4MDczOCwgMHg2NDg4LCAweDEzQTQsIDB4NjQ5MiwgMHgwODgzLCAweDY0OTMsCisgICAgMHgxM0ExLCAweDY0OTUsIDB4MTNBMCwgMHg2NDlBLCAweDBDRTgsIDB4NjQ5RCwgMHgyMTE1LCAweDY0OUUsIDB4MEM4RCwKKyAgICAweDY0QTQsIDB4MEMyQiwgMHg2NEE1LCAweDEzQTIsIDB4NjRBOSwgMHgxM0EzLCAweDY0QUIsIDB4MERFMSwgMHg2NEFELAorICAgIDB4MENGQiwgMHg2NEFFLCAweDA4NzEsIDB4NjRCMCwgMHgwQTk1LCAweDY0QjIsIDB4MEU3RSwgMHg2NEI5LCAweDA1QTcsCisgICAgMHg2NEJCLCAweDEzQUEsIDB4NjRCQywgMHgxM0E1LCAweDY0QkUsIDB4MzhGQywgMHg2NEJGLCAweDM4RkQsIDB4NjRDMSwKKyAgICAweDBGMzQsIDB4NjRDMiwgMHgxM0FDLCAweDY0QzUsIDB4MTNBOCwgMHg2NEM3LCAweDEzQTksIDB4NjRDQSwgMHgzNDFELAorICAgIDB4NjRDRCwgMHgwQUUyLCAweDY0Q0UsIDB4MjExNiwgMHg2NEQyLCAweDEzQTcsIDB4NjRENCwgMHgxMzY2LCAweDY0RDgsCisgICAgMHgxM0FCLCAweDY0REEsIDB4MTNBNiwgMHg2NEUwLCAweDEzQjAsIDB4NjRFMSwgMHgxM0IxLCAweDY0RTIsIDB4MEMyMSwKKyAgICAweDY0RTMsIDB4MTNCMywgMHg2NEU1LCAweDM4RkUsIDB4NjRFNiwgMHgwODcyLCAweDY0RTcsIDB4MTNBRSwgMHg2NEVDLAorICAgIDB4MDY1NiwgMHg2NEVGLCAweDEzQjQsIDB4NjRGMSwgMHgxM0FELCAweDY0RjIsIDB4MTNCOCwgMHg2NEY0LCAweDEzQjcsCisgICAgMHg2NEY2LCAweDEzQjYsIDB4NjRGNywgMHgzOEZGLCAweDY0RkEsIDB4MTNCOSwgMHg2NEZCLCAweDM5MDAsIDB4NjRGRCwKKyAgICAweDEzQkIsIDB4NjRGRSwgMHgwOUQ5LCAweDY1MDAsIDB4MTNCQSwgMHg2NTA0LCAweDM5MDEsIDB4NjUwNSwgMHgxM0JFLAorICAgIDB4NjUxNiwgMHgzOTAyLCAweDY1MTgsIDB4MTNCQywgMHg2NTE5LCAweDM5MDMsIDB4NjUxQywgMHgxM0JELCAweDY1MUQsCisgICAgMHgxMzk3LCAweDY1MjIsIDB4MUU5NywgMHg2NTIzLCAweDEzQzAsIDB4NjUyNCwgMHgxM0JGLCAweDY1MkEsIDB4MTM5RiwKKyAgICAweDY1MkIsIDB4MTNDMSwgMHg2NTJDLCAweDEzQjUsIDB4NjUyRiwgMHgwOEE3LCAweDY1MzQsIDB4MTNDMiwgMHg2NTM1LAorICAgIDB4MTNDMywgMHg2NTM2LCAweDEzQzUsIDB4NjUzNywgMHgxM0M0LCAweDY1MzgsIDB4MTNDNiwgMHg2NTM5LCAweDA1N0UsCisgICAgMHg2NTNCLCAweDA3QzgsIDB4NjUzRSwgMHgwRTRDLCAweDY1M0YsIDB4MEE1MywgMHg2NTQ1LCAweDA3ODIsIDB4NjU0NywKKyAgICAweDM5MDQsIDB4NjU0OCwgMHgxM0M4LCAweDY1NEQsIDB4MTNDQiwgMHg2NTRFLCAweDIxMTcsIDB4NjU0RiwgMHgwREM0LAorICAgIDB4NjU1MSwgMHgwNjc5LCAweDY1NTUsIDB4MTNDQSwgMHg2NTU2LCAweDEzQzksIDB4NjU1NywgMHgwRDBBLCAweDY1NTgsCisgICAgMHgxM0NDLCAweDY1NTksIDB4MDZBRCwgMHg2NTVELCAweDEzQ0UsIDB4NjU1RSwgMHgxM0NELCAweDY1NjIsIDB4MDVGNiwKKyAgICAweDY1NjMsIDB4MDg4NCwgMHg2NTY2LCAweDBDQjAsIDB4NjU2NywgMHgzOTA1LCAweDY1NkMsIDB4MDcxRiwgMHg2NTcwLAorICAgIDB4MEEzQSwgMHg2NTcyLCAweDEzQ0YsIDB4NjU3NCwgMHgwQTU0LCAweDY1NzUsIDB4MEMyMiwgMHg2NTc3LCAweDBERDEsCisgICAgMHg2NTc4LCAweDEzRDAsIDB4NjU4MSwgMHgzOTA2LCAweDY1ODIsIDB4MTNEMSwgMHg2NTgzLCAweDEzRDIsIDB4NjU4NSwKKyAgICAweDM5MDcsIDB4NjU4NywgMHgwRTA4LCAweDY1ODgsIDB4MTIwQywgMHg2NTg5LCAweDBBNkEsIDB4NjU4QywgMHgwREJFLAorICAgIDB4NjU4RSwgMHgwODQ4LCAweDY1OTAsIDB4MEQ3OSwgMHg2NTkxLCAweDBENTcsIDB4NjU5NywgMHgwQzQ3LCAweDY1OTksCisgICAgMHgwRjg5LCAweDY1OUIsIDB4MTNENCwgMHg2NTlDLCAweDA4RkMsIDB4NjU5RiwgMHgxM0Q1LCAweDY1QTEsIDB4MDQ3QSwKKyAgICAweDY1QTQsIDB4MDZDQywgMHg2NUE1LCAweDBBNzEsIDB4NjVBNywgMHgwREQyLCAweDY1QUIsIDB4MTNENiwgMHg2NUFDLAorICAgIDB4MDg5MCwgMHg2NUFELCAweDBCODUsIDB4NjVBRiwgMHgwOEE5LCAweDY1QjAsIDB4MDlGRCwgMHg2NUI3LCAweDEzRDcsCisgICAgMHg2NUI5LCAweDBFNEQsIDB4NjVCQywgMHgwNTE5LCAweDY1QkQsIDB4MDhBQSwgMHg2NUMxLCAweDEzREEsIDB4NjVDMiwKKyAgICAweDM5MDgsIDB4NjVDMywgMHgxM0Q4LCAweDY1QzQsIDB4MTNEQiwgMHg2NUM1LCAweDBGODEsIDB4NjVDNiwgMHgxM0Q5LAorICAgIDB4NjVDQiwgMHgwQTlGLCAweDY1Q0MsIDB4MTNEQywgMHg2NUNGLCAweDBCMTIsIDB4NjVEMiwgMHgxM0RELCAweDY1RDcsCisgICAgMHgwNjM2LCAweDY1RDksIDB4MTNERiwgMHg2NURCLCAweDEzREUsIDB4NjVFMCwgMHgxM0UwLCAweDY1RTEsIDB4MTNFMSwKKyAgICAweDY1RTIsIDB4MDYzNywgMHg2NUUzLCAweDM1ODUsIDB4NjVFNSwgMHgwQ0Q0LCAweDY1RTYsIDB4MEI3NCwgMHg2NUU3LAorICAgIDB4MDY4NiwgMHg2NUU4LCAweDA4QUIsIDB4NjVFOSwgMHgwQUUzLCAweDY1RUMsIDB4MDk2NiwgMHg2NUVELCAweDA0NzQsCisgICAgMHg2NUYwLCAweDM5MDksIDB4NjVGMSwgMHgxM0UyLCAweDY1RjIsIDB4MzkwQSwgMHg2NUZBLCAweDA1MjIsIDB4NjVGQiwKKyAgICAweDEzRTYsIDB4NjYwMCwgMHgyMTE4LCAweDY2MDIsIDB4MDdDOSwgMHg2NjAzLCAweDEzRTUsIDB4NjYwNiwgMHgwODFCLAorICAgIDB4NjYwNywgMHgwOUEyLCAweDY2MDksIDB4MjExQSwgMHg2NjBBLCAweDEzRTQsIDB4NjYwQywgMHgwOUEzLCAweDY2MEUsCisgICAgMHgwRUNDLCAweDY2MEYsIDB4MDgxQSwgMHg2NjEzLCAweDA0OUIsIDB4NjYxNCwgMHgwQTcyLCAweDY2MTUsIDB4MjExOSwKKyAgICAweDY2MUMsIDB4MTNFQiwgMHg2NjFFLCAweDIxMUMsIDB4NjYxRiwgMHgwQTU1LCAweDY2MjAsIDB4MDRFOSwgMHg2NjI0LAorICAgIDB4MjExRCwgMHg2NjI1LCAweDA5NUYsIDB4NjYyNywgMHgwRTk0LCAweDY2MjgsIDB4MDg2MiwgMHg2NjJDLCAweDM5MEIsCisgICAgMHg2NjJELCAweDA5QTQsIDB4NjYyRSwgMHgyMTFCLCAweDY2MkYsIDB4MEE0QiwgMHg2NjMxLCAweDIwQUUsIDB4NjYzNCwKKyAgICAweDEzRUEsIDB4NjYzNSwgMHgxM0U4LCAweDY2MzYsIDB4MTNFOSwgMHg2NjNCLCAweDFFMDAsIDB4NjYzQywgMHgwQkE5LAorICAgIDB4NjYzRiwgMHgxNDA5LCAweDY2NDEsIDB4MTNFRiwgMHg2NjQyLCAweDA4Q0MsIDB4NjY0MywgMHgwN0NBLCAweDY2NDQsCisgICAgMHgxM0VELCAweDY2NDksIDB4MTNFRSwgMHg2NjRCLCAweDA5RkUsIDB4NjY0QywgMHgzOTBDLCAweDY2NEYsIDB4MTNFQywKKyAgICAweDY2NTIsIDB4MDg3RCwgMHg2NjU3LCAweDIxMUYsIDB4NjY1OSwgMHgyMTIwLCAweDY2NUIsIDB4MzkwRCwgMHg2NjVDLAorICAgIDB4MzkwRSwgMHg2NjVELCAweDEzRjEsIDB4NjY1RSwgMHgxM0YwLCAweDY2NUYsIDB4MTNGNSwgMHg2NjYxLCAweDM5MEYsCisgICAgMHg2NjYyLCAweDEzRjYsIDB4NjY2MywgMHgzNzNBLCAweDY2NjQsIDB4MTNGMiwgMHg2NjY1LCAweDIxMUUsIDB4NjY2NiwKKyAgICAweDA1ODAsIDB4NjY2NywgMHgxM0YzLCAweDY2NjgsIDB4MTNGNCwgMHg2NjY5LCAweDBENjksIDB4NjY2QiwgMHgzOTEwLAorICAgIDB4NjY2RSwgMHgwREQzLCAweDY2NkYsIDB4MDcyMCwgMHg2NjcwLCAweDEzRjcsIDB4NjY3MywgMHgyMTIyLCAweDY2NzQsCisgICAgMHgwQTU2LCAweDY2NzYsIDB4MDlBNSwgMHg2Njc3LCAweDM5MTEsIDB4NjY3QSwgMHgwQjkwLCAweDY2ODEsIDB4MDZCRiwKKyAgICAweDY2ODMsIDB4MTNGOCwgMHg2Njg0LCAweDEzRkMsIDB4NjY4NywgMHgwNTRCLCAweDY2ODgsIDB4MTNGOSwgMHg2Njg5LAorICAgIDB4MTNGQiwgMHg2NjhFLCAweDEzRkEsIDB4NjY5MSwgMHgwOTc1LCAweDY2OTYsIDB4MEI4NiwgMHg2Njk3LCAweDA0ODksCisgICAgMHg2Njk4LCAweDEzRkQsIDB4NjY5OSwgMHgyMTIzLCAweDY2OUQsIDB4MTNGRSwgMHg2NkEwLCAweDIxMjQsIDB4NjZBMiwKKyAgICAweDBCQzYsIDB4NjZBNCwgMHgzOTEyLCAweDY2QTYsIDB4MEZCOSwgMHg2NkFCLCAweDA4OTEsIDB4NjZBRSwgMHgwRTNCLAorICAgIDB4NjZCMiwgMHgyMTI1LCAweDY2QjQsIDB4MEU2QiwgMHg2NkI4LCAweDE0MDUsIDB4NjZCOSwgMHgxNDAwLCAweDY2QkMsCisgICAgMHgxNDAzLCAweDY2QkUsIDB4MTQwMiwgMHg2NkJGLCAweDIxMjYsIDB4NjZDMSwgMHgxM0ZGLCAweDY2QzQsIDB4MTQwNCwKKyAgICAweDY2QzYsIDB4MzQ1NSwgMHg2NkM3LCAweDBDQjYsIDB4NjZDOCwgMHgzOTEzLCAweDY2QzksIDB4MTQwMSwgMHg2NkQ2LAorICAgIDB4MTQwNiwgMHg2NkQ5LCAweDA5NzYsIDB4NjZEQSwgMHgxNDA3LCAweDY2REMsIDB4MEYzNSwgMHg2NkRELCAweDBEMkUsCisgICAgMHg2NkUwLCAweDE0MDgsIDB4NjZFNiwgMHgxNDBBLCAweDY2RTksIDB4MTQwQiwgMHg2NkVDLCAweDM5MTQsIDB4NjZGMCwKKyAgICAweDE0MEMsIDB4NjZGMiwgMHgwNkMyLCAweDY2RjMsIDB4MDRFQSwgMHg2NkY0LCAweDA3Q0IsIDB4NjZGNSwgMHgxNDBELAorICAgIDB4NjZGNywgMHgxNDBFLCAweDY2RjgsIDB4MDk3QiwgMHg2NkY5LCAweDBBRTQsIDB4NjZGQSwgMHgyMTI3LCAweDY2RkIsCisgICAgMHgyMEIxLCAweDY2RkMsIDB4MTBFRCwgMHg2NkZELCAweDBBQzAsIDB4NjZGRSwgMHgwQUJGLCAweDY2RkYsIDB4MEIzOCwKKyAgICAweDY3MDAsIDB4MDgzNywgMHg2NzAzLCAweDEwNEIsIDB4NjcwNSwgMHgzOTE1LCAweDY3MDgsIDB4MDc0NCwgMHg2NzA5LAorICAgIDB4MEYxNywgMHg2NzBCLCAweDBFNEUsIDB4NjcwRCwgMHgwREYwLCAweDY3MEUsIDB4MjEyOCwgMHg2NzBGLCAweDE0MEYsCisgICAgMHg2NzEzLCAweDM5MTYsIDB4NjcxNCwgMHgwODYzLCAweDY3MTUsIDB4MEJEQiwgMHg2NzE2LCAweDE0MTAsIDB4NjcxNywKKyAgICAweDBGRDUsIDB4NjcxQiwgMHgwRTZDLCAweDY3MUQsIDB4MEJDNywgMHg2NzFFLCAweDE0MTEsIDB4NjcxRiwgMHgwNjM4LAorICAgIDB4NjcyNiwgMHgxNDEyLCAweDY3MjcsIDB4MTQxMywgMHg2NzI4LCAweDBFRTYsIDB4NjcyQSwgMHgwRUIwLCAweDY3MkIsCisgICAgMHgwRUE0LCAweDY3MkMsIDB4MEU4QSwgMHg2NzJELCAweDA4NzMsIDB4NjcyRSwgMHgxNDE1LCAweDY3MzEsIDB4MDkxNywKKyAgICAweDY3MzMsIDB4MzkxNywgMHg2NzM0LCAweDBFN0YsIDB4NjczNiwgMHgxNDE3LCAweDY3MzcsIDB4MTQxQSwgMHg2NzM4LAorICAgIDB4MTQxOSwgMHg2NzNBLCAweDA2MzUsIDB4NjczRCwgMHgwNjdBLCAweDY3M0YsIDB4MTQxNiwgMHg2NzQxLCAweDE0MTgsCisgICAgMHg2NzQzLCAweDM1QjcsIDB4Njc0NiwgMHgxNDFCLCAweDY3NDgsIDB4MzkxOCwgMHg2NzQ5LCAweDBBM0YsIDB4Njc0QywKKyAgICAweDM5MTksIDB4Njc0RSwgMHgwRjY1LCAweDY3NEYsIDB4MDQ4RCwgMHg2NzUwLCAweDA4NTAsIDB4Njc1MSwgMHgwQjFDLAorICAgIDB4Njc1MywgMHgwOTA5LCAweDY3NTYsIDB4MDlEQiwgMHg2NzU5LCAweDE0MUUsIDB4Njc1QywgMHgwQzQ4LCAweDY3NUUsCisgICAgMHgxNDFDLCAweDY3NUYsIDB4MEIwQiwgMHg2NzYwLCAweDE0MUQsIDB4Njc2MSwgMHgwOURBLCAweDY3NjIsIDB4MEVFOSwKKyAgICAweDY3NjMsIDB4MTQxRiwgMHg2NzY0LCAweDE0MjAsIDB4Njc2NSwgMHgwRjUyLCAweDY3NjYsIDB4MjEyQSwgMHg2NzZBLAorICAgIDB4MTQyNSwgMHg2NzZELCAweDA3Q0MsIDB4Njc2RSwgMHgzNTcxLCAweDY3NkYsIDB4MEQwQiwgMHg2NzcwLCAweDE0MjIsCisgICAgMHg2NzcxLCAweDBDNjYsIDB4Njc3MiwgMHgxM0UzLCAweDY3NzMsIDB4MTNFNywgMHg2Nzc1LCAweDA2NjksIDB4Njc3NiwKKyAgICAweDM5MUEsIDB4Njc3NywgMHgwQ0ZELCAweDY3N0IsIDB4MzkxQiwgMHg2NzdDLCAweDE0MjQsIDB4Njc3RSwgMHgwOUE2LAorICAgIDB4Njc3RiwgMHgwRDU4LCAweDY3ODUsIDB4MTQyQSwgMHg2Nzg3LCAweDBEOEUsIDB4Njc4OSwgMHgxNDIxLCAweDY3OEIsCisgICAgMHgxNDI3LCAweDY3OEMsIDB4MTQyNiwgMHg2NzkwLCAweDBBNzMsIDB4Njc5NSwgMHgwRTlCLCAweDY3OTcsIDB4MEY5QiwKKyAgICAweDY3OUEsIDB4MEU5NSwgMHg2NzlDLCAweDA1NEMsIDB4Njc5RCwgMHgwOEFDLCAweDY3QTAsIDB4MEZFRSwgMHg2N0ExLAorICAgIDB4MTQyOSwgMHg2N0EyLCAweDBBM0IsIDB4NjdBNiwgMHgxNDI4LCAweDY3QTksIDB4MTQyMywgMHg2N0FGLCAweDA3ODMsCisgICAgMHg2N0IwLCAweDM5MUMsIDB4NjdCMiwgMHgzOTFELCAweDY3QjMsIDB4MTQyRiwgMHg2N0I0LCAweDE0MkQsIDB4NjdCNiwKKyAgICAweDA1NEQsIDB4NjdCNywgMHgxNDJCLCAweDY3QjgsIDB4MTQzMSwgMHg2N0I5LCAweDE0MzcsIDB4NjdCQiwgMHgyMTJCLAorICAgIDB4NjdDMCwgMHgyMTJELCAweDY3QzEsIDB4MEIyOCwgMHg2N0M0LCAweDBFMTEsIDB4NjdDNiwgMHgxNDM5LCAweDY3Q0EsCisgICAgMHgwRDk0LCAweDY3Q0UsIDB4MTQzOCwgMHg2N0NGLCAweDBEMjYsIDB4NjdEMCwgMHgwRTZELCAweDY3RDEsIDB4MDVGNywKKyAgICAweDY3RDMsIDB4MEE5QiwgMHg2N0Q0LCAweDA5NEEsIDB4NjdENywgMHgzOTFGLCAweDY3RDgsIDB4MEJFRiwgMHg2N0Q5LAorICAgIDB4MzkyMCwgMHg2N0RBLCAweDBGMTgsIDB4NjdERCwgMHgxNDM0LCAweDY3REUsIDB4MTQzMywgMHg2N0UyLCAweDE0MzUsCisgICAgMHg2N0U0LCAweDE0MzIsIDB4NjdFNywgMHgxNDNBLCAweDY3RTksIDB4MTQzMCwgMHg2N0VDLCAweDE0MkUsIDB4NjdFRSwKKyAgICAweDE0MzYsIDB4NjdFRiwgMHgxNDJDLCAweDY3RjAsIDB4MzkyMSwgMHg2N0YxLCAweDBCQUEsIDB4NjdGMywgMHgwRjA0LAorICAgIDB4NjdGNCwgMHgwOEYyLCAweDY3RjUsIDB4MDg2NCwgMHg2N0Y5LCAweDM5MUUsIDB4NjdGQiwgMHgwODJBLCAweDY3RkUsCisgICAgMHgwRTlELCAweDY3RkYsIDB4MDU5RiwgMHg2ODAxLCAweDIxMkUsIDB4NjgwMiwgMHgwQkVBLCAweDY4MDMsIDB4MENBMiwKKyAgICAweDY4MDQsIDB4MDRFQiwgMHg2ODA1LCAweDFFMDcsIDB4NjgxMywgMHgwQTk2LCAweDY4MTYsIDB4MEE1OCwgMHg2ODE3LAorICAgIDB4MDcwMCwgMHg2ODFFLCAweDE0M0MsIDB4NjgyMSwgMHgwN0NELCAweDY4MjIsIDB4MDVEQSwgMHg2ODI5LCAweDE0M0UsCisgICAgMHg2ODJBLCAweDA1RDIsIDB4NjgyQiwgMHgxNDQ0LCAweDY4MkMsIDB4MzkyMiwgMHg2ODMwLCAweDM5MjMsIDB4NjgzMSwKKyAgICAweDM5MjQsIDB4NjgzMiwgMHgxNDQxLCAweDY4MzQsIDB4MEE5NywgMHg2ODM4LCAweDA1QTksIDB4NjgzOSwgMHgwODFDLAorICAgIDB4NjgzQywgMHgwNUE4LCAweDY4M0QsIDB4MDgzRiwgMHg2ODQwLCAweDE0M0YsIDB4Njg0MSwgMHgwNzNCLCAweDY4NDIsCisgICAgMHgwNzIxLCAweDY4NDMsIDB4MEM2NywgMHg2ODQ0LCAweDIxMkYsIDB4Njg0NiwgMHgxNDNELCAweDY4NDgsIDB4MDQ4QSwKKyAgICAweDY4NEQsIDB4MTQ0MCwgMHg2ODRFLCAweDE0NDIsIDB4Njg1MCwgMHgwNkM1LCAweDY4NTEsIDB4MDcwMiwgMHg2ODUyLAorICAgIDB4MjEyQywgMHg2ODUzLCAweDA1RjgsIDB4Njg1NCwgMHgwNjY1LCAweDY4NTksIDB4MTQ0NSwgMHg2ODVCLCAweDM5MjUsCisgICAgMHg2ODVDLCAweDA4NjksIDB4Njg1RCwgMHgwRTlGLCAweDY4NUYsIDB4MDg4NSwgMHg2ODYzLCAweDE0NDYsIDB4Njg2NywKKyAgICAweDBEQTIsIDB4Njg3MiwgMHgzOTI2LCAweDY4NzQsIDB4MTQ1MiwgMHg2ODc1LCAweDM5MjcsIDB4Njg3NiwgMHgwNTMzLAorICAgIDB4Njg3NywgMHgxNDQ3LCAweDY4N0EsIDB4MzkyOCwgMHg2ODdFLCAweDE0NTgsIDB4Njg3RiwgMHgxNDQ4LCAweDY4ODEsCisgICAgMHgwRjhBLCAweDY4ODMsIDB4MTQ0RiwgMHg2ODg0LCAweDM5MjksIDB4Njg4NSwgMHgwRDE1LCAweDY4OEQsIDB4MTQ1NywKKyAgICAweDY4OEUsIDB4MUU5QywgMHg2ODhGLCAweDE0NEEsIDB4Njg5MywgMHgwNDc4LCAweDY4OTQsIDB4MTQ0QywgMHg2ODk3LAorICAgIDB4MDdDRSwgMHg2ODlCLCAweDE0NEUsIDB4Njg5RCwgMHgxNDRELCAweDY4OUYsIDB4MTQ0OSwgMHg2OEEwLCAweDE0NTQsCisgICAgMHg2OEEyLCAweDA5QTcsIDB4NjhBNSwgMHgzOTJBLCAweDY4QTYsIDB4MTFCRSwgMHg2OEE3LCAweDA3OUMsIDB4NjhBOCwKKyAgICAweDBGNjYsIDB4NjhBRCwgMHgxNDRCLCAweDY4QUYsIDB4MEMxMCwgMHg2OEIwLCAweDA1ODEsIDB4NjhCMSwgMHgwODFELAorICAgIDB4NjhCMiwgMHgzOTJCLCAweDY4QjMsIDB4MTQ0MywgMHg2OEI1LCAweDE0NTMsIDB4NjhCNiwgMHgwNUJGLCAweDY4QjksCisgICAgMHgxNDUxLCAweDY4QkEsIDB4MTQ1NSwgMHg2OEJDLCAweDBDNjgsIDB4NjhDNCwgMHgwNjNBLCAweDY4QzYsIDB4MTQ3MywKKyAgICAweDY4QzgsIDB4MjBBRiwgMHg2OEM5LCAweDBFRDUsIDB4NjhDQSwgMHgxNDVBLCAweDY4Q0IsIDB4MDYzOSwgMHg2OENELAorICAgIDB4MTQ2MSwgMHg2OENGLCAweDIxMzAsIDB4NjhEMCwgMHgzOTJDLCAweDY4RDIsIDB4MEU2RSwgMHg2OEQ0LCAweDE0NjIsCisgICAgMHg2OEQ1LCAweDE0NjQsIDB4NjhENiwgMHgzOTJELCAweDY4RDcsIDB4MTQ2OCwgMHg2OEQ4LCAweDE0NUMsIDB4NjhEQSwKKyAgICAweDBCNjgsIDB4NjhERiwgMHgwQzY5LCAweDY4RTAsIDB4MTQ2QywgMHg2OEUxLCAweDE0NUYsIDB4NjhFMywgMHgxNDY5LAorICAgIDB4NjhFNywgMHgxNDYzLCAweDY4RTgsIDB4MzkyRSwgMHg2OEVELCAweDM5MkYsIDB4NjhFRSwgMHgwOUZGLCAweDY4RUYsCisgICAgMHgxNDZELCAweDY4RjAsIDB4MzkzMCwgMHg2OEYxLCAweDM5MzEsIDB4NjhGMiwgMHgwQTU3LCAweDY4RjksIDB4MTQ2QiwKKyAgICAweDY4RkEsIDB4MDVGOSwgMHg2OEZDLCAweDM5MzIsIDB4NjkwMCwgMHgwRkY2LCAweDY5MDEsIDB4MTQ1OSwgMHg2OTA0LAorICAgIDB4MTQ2NywgMHg2OTA1LCAweDA0OUMsIDB4NjkwOCwgMHgxNDVCLCAweDY5MEIsIDB4MEVDNiwgMHg2OTBDLCAweDE0NjAsCisgICAgMHg2OTBELCAweDA5RTgsIDB4NjkwRSwgMHgwQkUzLCAweDY5MEYsIDB4MTQ1NiwgMHg2OTExLCAweDM5MzMsIDB4NjkxMiwKKyAgICAweDE0NjYsIDB4NjkxMywgMHgzOTM0LCAweDY5MTksIDB4MEE0MCwgMHg2OTFBLCAweDE0NzAsIDB4NjkxQiwgMHgwNUNGLAorICAgIDB4NjkxQywgMHgwNzU1LCAweDY5MjEsIDB4MTQ3MiwgMHg2OTIyLCAweDE0NUQsIDB4NjkyMywgMHgxNDcxLCAweDY5MjUsCisgICAgMHgxNDZBLCAweDY5MjYsIDB4MTQ1RSwgMHg2OTI4LCAweDE0NkUsIDB4NjkyQSwgMHgxNDZGLCAweDY5MzAsIDB4MTQ4MCwKKyAgICAweDY5MzQsIDB4MENBNiwgMHg2OTM1LCAweDM5MzUsIDB4NjkzNiwgMHgxNDY1LCAweDY5MzksIDB4MTQ3QywgMHg2OTNCLAorICAgIDB4MzkzNiwgMHg2OTNELCAweDE0N0UsIDB4NjkzRiwgMHgwQkY0LCAweDY5NEEsIDB4MEYzNiwgMHg2OTUzLCAweDBERTgsCisgICAgMHg2OTU0LCAweDE0NzksIDB4Njk1NSwgMHgwQjJBLCAweDY5NTcsIDB4MzkzNywgMHg2OTU5LCAweDE0N0YsIDB4Njk1QSwKKyAgICAweDBBQzEsIDB4Njk1QywgMHgxNDc2LCAweDY5NUQsIDB4MTQ4MywgMHg2OTVFLCAweDE0ODIsIDB4Njk2MCwgMHgwQ0M3LAorICAgIDB4Njk2MSwgMHgxNDgxLCAweDY5NjIsIDB4MENDMiwgMHg2OTYzLCAweDM5MzgsIDB4Njk2OCwgMHgyMTMyLCAweDY5NkEsCisgICAgMHgxNDg1LCAweDY5NkIsIDB4MTQ3OCwgMHg2OTZELCAweDA2QzAsIDB4Njk2RSwgMHgxNDdCLCAweDY5NkYsIDB4MDk2NywKKyAgICAweDY5NzIsIDB4MzkzOSwgMHg2OTczLCAweDBEMTYsIDB4Njk3NCwgMHgxNDdELCAweDY5NzUsIDB4MDZDMywgMHg2OTc3LAorICAgIDB4MTQ3NSwgMHg2OTc4LCAweDE0NzcsIDB4Njk3OSwgMHgxNDc0LCAweDY5N0MsIDB4MEZENiwgMHg2OTdELCAweDA1QjgsCisgICAgMHg2OTdFLCAweDE0N0EsIDB4Njk3RiwgMHgzOTNBLCAweDY5ODAsIDB4MzkzQiwgMHg2OTgxLCAweDE0ODQsIDB4Njk4MiwKKyAgICAweDA1OTMsIDB4Njk4QSwgMHgwODU3LCAweDY5OEUsIDB4MDRGRiwgMHg2OTkxLCAweDE0OTUsIDB4Njk5NCwgMHgwRkQ3LAorICAgIDB4Njk5NSwgMHgxNDk4LCAweDY5OTgsIDB4MjEzNCwgMHg2OTlCLCAweDBBMDAsIDB4Njk5QywgMHgxNDk3LCAweDY5QTAsCisgICAgMHgxNDk2LCAweDY5QTYsIDB4MzkzQywgMHg2OUE3LCAweDE0OTMsIDB4NjlBRCwgMHgzOTNELCAweDY5QUUsIDB4MTQ4NywKKyAgICAweDY5QjEsIDB4MTRBNCwgMHg2OUIyLCAweDE0ODYsIDB4NjlCNCwgMHgxNDk5LCAweDY5QjcsIDB4MzkzRSwgMHg2OUJCLAorICAgIDB4MTQ5MSwgMHg2OUJFLCAweDE0OEMsIDB4NjlCRiwgMHgxNDg5LCAweDY5QzEsIDB4MTQ4QSwgMHg2OUMzLCAweDE0OTIsCisgICAgMHg2OUM3LCAweDFEMzMsIDB4NjlDQSwgMHgxNDhGLCAweDY5Q0IsIDB4MDdDRiwgMHg2OUNDLCAweDBCRTQsIDB4NjlDRCwKKyAgICAweDBBRTYsIDB4NjlDRSwgMHgxNDhELCAweDY5RDAsIDB4MTQ4OCwgMHg2OUQzLCAweDE0OEIsIDB4NjlENiwgMHgzOTNGLAorICAgIDB4NjlENywgMHgzOTQwLCAweDY5RDgsIDB4MEYzNywgMHg2OUQ5LCAweDBFOTgsIDB4NjlERCwgMHgxNDkwLCAweDY5REUsCisgICAgMHgxNDlBLCAweDY5RTIsIDB4MjEzNSwgMHg2OUU3LCAweDE0QTIsIDB4NjlFOCwgMHgxNDlCLCAweDY5RUEsIDB4MzU2RiwKKyAgICAweDY5RUIsIDB4MTRBOCwgMHg2OUVELCAweDE0QTYsIDB4NjlGMiwgMHgxNEExLCAweDY5RjYsIDB4MzczRiwgMHg2OUY5LAorICAgIDB4MTRBMCwgMHg2OUZCLCAweDBCRUMsIDB4NjlGRCwgMHgwQUU3LCAweDY5RkYsIDB4MTQ5RSwgMHg2QTAxLCAweDM5NDEsCisgICAgMHg2QTAyLCAweDE0OUMsIDB4NkEwNSwgMHgxNEEzLCAweDZBMEEsIDB4MTRBOSwgMHg2QTBCLCAweDBEODksIDB4NkEwQywKKyAgICAweDE0QUYsIDB4NkEwRiwgMHgzOTQyLCAweDZBMTIsIDB4MTRBQSwgMHg2QTEzLCAweDE0QUQsIDB4NkExNCwgMHgxNEE3LAorICAgIDB4NkExNSwgMHgzOTQzLCAweDZBMTcsIDB4MEJCMiwgMHg2QTE5LCAweDBEQUEsIDB4NkExQiwgMHgxNDlELCAweDZBMUUsCisgICAgMHgxNEE1LCAweDZBMUYsIDB4MDlBOCwgMHg2QTIxLCAweDBFREIsIDB4NkEyMiwgMHgxNEI5LCAweDZBMjMsIDB4MTRBQywKKyAgICAweDZBMjgsIDB4Mzk0NCwgMHg2QTI5LCAweDA3NTYsIDB4NkEyQSwgMHgwNTIzLCAweDZBMkIsIDB4MDVCRCwgMHg2QTJFLAorICAgIDB4MTQ5NCwgMHg2QTMwLCAweDIxMzYsIDB4NkEzNCwgMHgzOTQ1LCAweDZBMzUsIDB4MDlBOSwgMHg2QTM2LCAweDE0QjEsCisgICAgMHg2QTM4LCAweDE0QjgsIDB4NkEzOSwgMHgwOTI1LCAweDZBM0EsIDB4MDVEMCwgMHg2QTNELCAweDBCNkMsIDB4NkEzRSwKKyAgICAweDM5NDYsIDB4NkE0NCwgMHgxNEFFLCAweDZBNDUsIDB4Mzk0NywgMHg2QTQ2LCAweDIxMzgsIDB4NkE0NywgMHgxNEIzLAorICAgIDB4NkE0OCwgMHgxNEI3LCAweDZBNEIsIDB4MDZBRSwgMHg2QTUwLCAweDM5NDgsIDB4NkE1MSwgMHgzOTQ5LCAweDZBNTQsCisgICAgMHgzQzM0LCAweDZBNTYsIDB4Mzk0QSwgMHg2QTU4LCAweDA2NjYsIDB4NkE1OSwgMHgxNEI1LCAweDZBNUIsIDB4Mzk0QiwKKyAgICAweDZBNUYsIDB4MDYzQiwgMHg2QTYxLCAweDBDQTMsIDB4NkE2MiwgMHgxNEI0LCAweDZBNjYsIDB4MTRCNiwgMHg2QTZCLAorICAgIDB4MjEzNywgMHg2QTcyLCAweDE0QjAsIDB4NkE3MywgMHgyMTM5LCAweDZBNzgsIDB4MTRCMiwgMHg2QTdFLCAweDIxM0EsCisgICAgMHg2QTdGLCAweDA1QkUsIDB4NkE4MCwgMHgwQjg3LCAweDZBODMsIDB4Mzk0QywgMHg2QTg0LCAweDE0QkQsIDB4NkE4OSwKKyAgICAweDM5NEQsIDB4NkE4RCwgMHgxNEJCLCAweDZBOEUsIDB4MDc5RCwgMHg2QTkwLCAweDE0QkEsIDB4NkE5MSwgMHgzOTRFLAorICAgIDB4NkE5NywgMHgxNEMwLCAweDZBOUMsIDB4MTQzQiwgMHg2QTlELCAweDM5NEYsIDB4NkE5RSwgMHgzOTUwLCAweDZBOUYsCisgICAgMHgzOTUxLCAweDZBQTAsIDB4MTRCQywgMHg2QUEyLCAweDE0QkUsIDB4NkFBMywgMHgxNEJGLCAweDZBQUEsIDB4MTRDQiwKKyAgICAweDZBQUMsIDB4MTRDNywgMHg2QUFFLCAweDE0NTAsIDB4NkFCMywgMHgxNEM2LCAweDZBQjgsIDB4MTRDNSwgMHg2QUJCLAorICAgIDB4MTRDMiwgMHg2QUMxLCAweDE0QUIsIDB4NkFDMiwgMHgxNEM0LCAweDZBQzMsIDB4MTRDMywgMHg2QUQxLCAweDE0QzksCisgICAgMHg2QUQzLCAweDBGQ0MsIDB4NkFEQSwgMHgxNENDLCAweDZBREIsIDB4MDZGMywgMHg2QURDLCAweDM5NTIsIDB4NkFERSwKKyAgICAweDE0QzgsIDB4NkFERiwgMHgxNENBLCAweDZBRTIsIDB4MjEzQiwgMHg2QUU0LCAweDIxM0MsIDB4NkFFNywgMHgzOTUzLAorICAgIDB4NkFFOCwgMHgwRDNCLCAweDZBRUEsIDB4MTRDRCwgMHg2QUVDLCAweDM5NTQsIDB4NkFGQSwgMHgxNEQxLCAweDZBRkIsCisgICAgMHgxNENFLCAweDZCMDQsIDB4MEY1RCwgMHg2QjA1LCAweDE0Q0YsIDB4NkIwQSwgMHgxNDlGLCAweDZCMTIsIDB4MTREMiwKKyAgICAweDZCMTYsIDB4MTREMywgMHg2QjFELCAweDA0RDcsIDB4NkIxRSwgMHgzOTU1LCAweDZCMUYsIDB4MTRENSwgMHg2QjIwLAorICAgIDB4MDczRCwgMHg2QjIxLCAweDA4Q0QsIDB4NkIyMywgMHgwNkNELCAweDZCMjQsIDB4Mzk1NiwgMHg2QjI3LCAweDA1MjQsCisgICAgMHg2QjMyLCAweDBGNDksIDB4NkIzNSwgMHgzOTU3LCAweDZCMzcsIDB4MTRENywgMHg2QjM4LCAweDE0RDYsIDB4NkIzOSwKKyAgICAweDE0RDksIDB4NkIzQSwgMHgwNjU3LCAweDZCM0QsIDB4MDZDRSwgMHg2QjNFLCAweDA1RkEsIDB4NkI0MywgMHgxNERDLAorICAgIDB4NkI0NiwgMHgzOTU4LCAweDZCNDcsIDB4MTREQiwgMHg2QjQ5LCAweDE0REQsIDB4NkI0QywgMHgwNTRFLCAweDZCNEUsCisgICAgMHgwQjc1LCAweDZCNTAsIDB4MTRERSwgMHg2QjUzLCAweDA1RkIsIDB4NkI1NCwgMHgxNEUwLCAweDZCNTYsIDB4Mzk1OSwKKyAgICAweDZCNTksIDB4MTRERiwgMHg2QjVCLCAweDE0RTEsIDB4NkI1RiwgMHgxNEUyLCAweDZCNjAsIDB4Mzk1QSwgMHg2QjYxLAorICAgIDB4MTRFMywgMHg2QjYyLCAweDA4QUQsIDB4NkI2MywgMHgwQTU5LCAweDZCNjQsIDB4MDgxMSwgMHg2QjY1LCAweDM0NEEsCisgICAgMHg2QjY2LCAweDBERTIsIDB4NkI2OSwgMHgwRTMyLCAweDZCNkEsIDB4MEZFQSwgMHg2QjZGLCAweDA4QzMsIDB4NkI3MiwKKyAgICAweDM1RDksIDB4NkI3MywgMHgwODQwLCAweDZCNzQsIDB4MEZCQSwgMHg2Qjc3LCAweDM0NTYsIDB4NkI3OCwgMHgxNEU0LAorICAgIDB4NkI3OSwgMHgxNEU1LCAweDZCN0IsIDB4MDhBRSwgMHg2QjdGLCAweDE0RTYsIDB4NkI4MCwgMHgxNEU3LCAweDZCODIsCisgICAgMHgzOTVCLCAweDZCODMsIDB4MTRFOSwgMHg2Qjg0LCAweDE0RTgsIDB4NkI4NiwgMHgwRTg2LCAweDZCODksIDB4MDk2OCwKKyAgICAweDZCOEEsIDB4MDkxOCwgMHg2QjhCLCAweDA4OTIsIDB4NkI4RCwgMHgxNEVBLCAweDZCOTUsIDB4MTRFQywgMHg2Qjk2LAorICAgIDB4MDlFOSwgMHg2Qjk4LCAweDE0RUIsIDB4NkI5RSwgMHgxNEVELCAweDZCQTQsIDB4MTRFRSwgMHg2QkFBLCAweDE0RUYsCisgICAgMHg2QkFCLCAweDE0RjAsIDB4NkJBRiwgMHgxNEYxLCAweDZCQjEsIDB4MTRGMywgMHg2QkIyLCAweDE0RjIsIDB4NkJCMywKKyAgICAweDE0RjQsIDB4NkJCNCwgMHgwNTI1LCAweDZCQjUsIDB4MEI4OCwgMHg2QkI3LCAweDE0RjUsIDB4NkJCQSwgMHgwODc0LAorICAgIDB4NkJCQiwgMHgwNUFBLCAweDZCQkMsIDB4MTRGNiwgMHg2QkJFLCAweDM5NUMsIDB4NkJCRiwgMHgwQzNDLCAweDZCQzAsCisgICAgMHgxMTlELCAweDZCQzUsIDB4MDYzRCwgMHg2QkM2LCAweDE0RjcsIDB4NkJDQiwgMHgxNEY4LCAweDZCQ0MsIDB4Mzc0NCwKKyAgICAweDZCQ0QsIDB4MEUzQywgMHg2QkNFLCAweDBFOTYsIDB4NkJDRiwgMHgzNDRDLCAweDZCRDIsIDB4MEM5RiwgMHg2QkQzLAorICAgIDB4MTRGOSwgMHg2QkQ0LCAweDBEN0EsIDB4NkJENiwgMHgyMTNELCAweDZCRDgsIDB4MEQ4RiwgMHg2QkRCLCAweDBFREYsCisgICAgMHg2QkRGLCAweDE0RkEsIDB4NkJFMSwgMHgzOTVELCAweDZCRUIsIDB4MTRGQywgMHg2QkVDLCAweDE0RkIsIDB4NkJFRiwKKyAgICAweDE0RkUsIDB4NkJGMSwgMHgzOTVFLCAweDZCRjMsIDB4MTRGRCwgMHg2QzA4LCAweDE1MDAsIDB4NkMwRiwgMHgwOEFGLAorICAgIDB4NkMxMCwgMHgzOTVGLCAweDZDMTEsIDB4MEVCRCwgMHg2QzEzLCAweDE1MDEsIDB4NkMxNCwgMHgxNTAyLCAweDZDMTcsCisgICAgMHgwNjNFLCAweDZDMUIsIDB4MTUwMywgMHg2QzIzLCAweDE1MDUsIDB4NkMyNCwgMHgxNTA0LCAweDZDMzMsIDB4Mzk2MCwKKyAgICAweDZDMzQsIDB4MEEyQiwgMHg2QzM1LCAweDM5NjEsIDB4NkMzNywgMHgwREFCLCAweDZDMzgsIDB4MDRFQywgMHg2QzNBLAorICAgIDB4Mzk2MiwgMHg2QzNFLCAweDBENTksIDB4NkMzRiwgMHgyMTNFLCAweDZDNDAsIDB4MEMxMSwgMHg2QzQxLCAweDA5NEIsCisgICAgMHg2QzQyLCAweDA2N0IsIDB4NkM0RSwgMHgwRDVBLCAweDZDNTAsIDB4MDhEQSwgMHg2QzU1LCAweDE1MDcsIDB4NkM1NywKKyAgICAweDA1RkMsIDB4NkM1OSwgMHgzOTYzLCAweDZDNUEsIDB4MDUxQSwgMHg2QzVDLCAweDIxM0YsIDB4NkM1RCwgMHgwQ0NBLAorICAgIDB4NkM1RSwgMHgxNTA2LCAweDZDNUYsIDB4MDdEMCwgMHg2QzYwLCAweDBCOTEsIDB4NkM2MiwgMHgxNTA4LCAweDZDNjgsCisgICAgMHgxNTEwLCAweDZDNkEsIDB4MTUwOSwgMHg2QzZGLCAweDIxNDEsIDB4NkM3MCwgMHgwQjIxLCAweDZDNzIsIDB4MDY3QywKKyAgICAweDZDNzMsIDB4MTUxMSwgMHg2Qzc2LCAweDM5NjQsIDB4NkM3QSwgMHgwNzNFLCAweDZDN0IsIDB4Mzk2NSwgMHg2QzdELAorICAgIDB4MDYzRiwgMHg2QzdFLCAweDE1MEYsIDB4NkM4MSwgMHgxNTBELCAweDZDODIsIDB4MTUwQSwgMHg2QzgzLCAweDBGNEEsCisgICAgMHg2Qzg1LCAweDM5NjYsIDB4NkM4NiwgMHgyMTQwLCAweDZDODgsIDB4MEJEQywgMHg2QzhDLCAweDBDQjEsIDB4NkM4RCwKKyAgICAweDE1MEIsIDB4NkM5MCwgMHgxNTEzLCAweDZDOTIsIDB4MTUxMiwgMHg2QzkzLCAweDA2RjksIDB4NkM5NSwgMHgzOTY3LAorICAgIDB4NkM5NiwgMHgwNTJELCAweDZDOTksIDB4MDgyQiwgMHg2QzlBLCAweDE1MEMsIDB4NkM5QiwgMHgxNTBFLCAweDZDOUMsCisgICAgMHgzOTY4LCAweDZDQTEsIDB4MEU4NSwgMHg2Q0EyLCAweDBCNTQsIDB4NkNBQSwgMHgzNzQ5LCAweDZDQUIsIDB4MEVBNSwKKyAgICAweDZDQUUsIDB4MTUxQiwgMHg2Q0IxLCAweDE1MUMsIDB4NkNCMywgMHgwNTRGLCAweDZDQjgsIDB4MERGOCwgMHg2Q0I5LAorICAgIDB4MEYwOSwgMHg2Q0JBLCAweDE1MUUsIDB4NkNCQiwgMHgwOENGLCAweDZDQkMsIDB4MDlBQSwgMHg2Q0JELCAweDE1MTcsCisgICAgMHg2Q0JFLCAweDE1MUQsIDB4NkNCRiwgMHgwNTBBLCAweDZDQzEsIDB4MDZBRiwgMHg2Q0M0LCAweDE1MTQsIDB4NkNDNSwKKyAgICAweDE1MTksIDB4NkNDOSwgMHgwQTk4LCAweDZDQ0EsIDB4MEQyNywgMHg2Q0NDLCAweDBEN0IsIDB4NkNEMCwgMHgzOTY5LAorICAgIDB4NkNEMywgMHgxNTE2LCAweDZDRDQsIDB4Mzk2QSwgMHg2Q0Q1LCAweDBFNEYsIDB4NkNENiwgMHgzOTZCLCAweDZDRDcsCisgICAgMHgxNTE4LCAweDZDRDksIDB4MTUyMSwgMHg2Q0RBLCAweDIxNDIsIDB4NkNEQiwgMHgxNTFGLCAweDZDREQsIDB4MTUxQSwKKyAgICAweDZDRTAsIDB4Mzk2QywgMHg2Q0UxLCAweDBFNTAsIDB4NkNFMiwgMHgwQ0ZFLCAweDZDRTMsIDB4MDY3RCwgMHg2Q0U1LAorICAgIDB4MEMxRiwgMHg2Q0U4LCAweDBCQUIsIDB4NkNFQSwgMHgxNTIyLCAweDZDRUIsIDB4Mzk2RCwgMHg2Q0VDLCAweDM5NkUsCisgICAgMHg2Q0VFLCAweDM5NkYsIDB4NkNFRiwgMHgxNTIwLCAweDZDRjAsIDB4MEIzOSwgMHg2Q0YxLCAweDE1MTUsIDB4NkNGMywKKyAgICAweDA0RUQsIDB4NkQwMSwgMHgzQzM1LCAweDZEMDQsIDB4MjE0MywgMHg2RDBBLCAweDM5NzAsIDB4NkQwQiwgMHgwRjM4LAorICAgIDB4NkQwQywgMHgxNTJELCAweDZEMEUsIDB4Mzk3MSwgMHg2RDExLCAweDM5NzIsIDB4NkQxMiwgMHgxNTJDLCAweDZEMTcsCisgICAgMHgwQTlBLCAweDZEMTksIDB4MTUyOSwgMHg2RDFCLCAweDBGNTYsIDB4NkQxRSwgMHgwQzhFLCAweDZEMUYsIDB4MTUyMywKKyAgICAweDZEMjUsIDB4MEJFMSwgMHg2RDI5LCAweDA0RUUsIDB4NkQyQSwgMHgwN0QxLCAweDZEMkIsIDB4MTUyNiwgMHg2RDJFLAorICAgIDB4Mzk3MywgMHg2RDMyLCAweDA5MzEsIDB4NkQzMywgMHgxNTJCLCAweDZEMzUsIDB4MTUyQSwgMHg2RDM2LCAweDE1MjUsCisgICAgMHg2RDM4LCAweDE1MjgsIDB4NkQzQiwgMHgwNUM2LCAweDZEM0QsIDB4MTUyNywgMHg2RDNFLCAweDBDRkYsIDB4NkQ0MSwKKyAgICAweDBGNzYsIDB4NkQ0NCwgMHgwOURDLCAweDZENDUsIDB4MEE5OSwgMHg2RDU3LCAweDM5NzQsIDB4NkQ1OSwgMHgxNTMzLAorICAgIDB4NkQ1QSwgMHgxNTMxLCAweDZENUMsIDB4MERCRiwgMHg2RDVFLCAweDM5NzUsIDB4NkQ2MywgMHgxNTJFLCAweDZENjQsCisgICAgMHgxNTMwLCAweDZENjUsIDB4Mzk3NiwgMHg2RDY2LCAweDA0REMsIDB4NkQ2OSwgMHgwN0QyLCAweDZENkEsIDB4MEZEOCwKKyAgICAweDZENkMsIDB4MDU5QiwgMHg2RDZFLCAweDBERDQsIDB4NkQ2RiwgMHgyMTQ1LCAweDZENzQsIDB4MEY0QiwgMHg2RDc3LAorICAgIDB4MDU4MiwgMHg2RDc4LCAweDBBMDEsIDB4NkQ3OSwgMHgxNTMyLCAweDZEODIsIDB4Mzk3NywgMHg2RDg1LCAweDE1MzcsCisgICAgMHg2RDg3LCAweDIxNDQsIDB4NkQ4OCwgMHgwOUFCLCAweDZEODksIDB4MzQyQSwgMHg2RDhDLCAweDBGMUEsIDB4NkQ4RSwKKyAgICAweDE1MzQsIDB4NkQ5MywgMHgxNTJGLCAweDZEOTUsIDB4MTUzNSwgMHg2RDk2LCAweDIxNDYsIDB4NkQ5OSwgMHgwRkE2LAorICAgIDB4NkQ5QiwgMHgwQzZELCAweDZEOUMsIDB4MEM5QSwgMHg2REFDLCAweDIxNDcsIDB4NkRBRiwgMHgwNTk0LCAweDZEQjIsCisgICAgMHgwNEY3LCAweDZEQjUsIDB4MTUzQiwgMHg2REI4LCAweDE1M0UsIDB4NkRCQywgMHgwRjhCLCAweDZEQkYsIDB4Mzk3OCwKKyAgICAweDZEQzAsIDB4MEY0RSwgMHg2REM0LCAweDM5NzksIDB4NkRDNSwgMHgxNTQ1LCAweDZEQzYsIDB4MTUzRiwgMHg2REM3LAorICAgIDB4MTUzQywgMHg2RENBLCAweDM5N0EsIDB4NkRDQiwgMHgwRjlDLCAweDZEQ0MsIDB4MTU0MiwgMHg2RENGLCAweDIxNDgsCisgICAgMHg2REQwLCAweDNDMzYsIDB4NkREMSwgMHgwOTU0LCAweDZERDIsIDB4MTU0NCwgMHg2REQ1LCAweDE1NDksIDB4NkRENiwKKyAgICAweDM5N0IsIDB4NkREOCwgMHgwQzZCLCAweDZERDksIDB4MTU0NywgMHg2RERBLCAweDM0NTMsIDB4NkRERSwgMHgxNTQxLAorICAgIDB4NkRFMSwgMHgwQjc2LCAweDZERTQsIDB4MTU0OCwgMHg2REU2LCAweDE1M0QsIDB4NkRFOCwgMHgxNTQzLCAweDZERTksCisgICAgMHgzOTdDLCAweDZERUEsIDB4MTU0QSwgMHg2REVCLCAweDA0QzAsIDB4NkRFQywgMHgxNTQwLCAweDZERUUsIDB4MTU0QiwKKyAgICAweDZERjEsIDB4MEEwMiwgMHg2REYyLCAweDIxNEEsIDB4NkRGMywgMHgwOTY5LCAweDZERjUsIDB4MERGNSwgMHg2REY3LAorICAgIDB4MDgxRSwgMHg2REY4LCAweDIxNDksIDB4NkRGOSwgMHgxNTM4LCAweDZERkEsIDB4MTU0NiwgMHg2REZCLCAweDBDMzQsCisgICAgMHg2REZDLCAweDIxNEIsIDB4NkUwNSwgMHgwQTVBLCAweDZFMDcsIDB4MDVDNywgMHg2RTA4LCAweDA4NDEsIDB4NkUwOSwKKyAgICAweDA5QUMsIDB4NkUwQSwgMHgxNTNBLCAweDZFMEIsIDB4MDk0QywgMHg2RTEzLCAweDA3MjIsIDB4NkUxNSwgMHgxNTM5LAorICAgIDB4NkUxNywgMHgzNzQ2LCAweDZFMTksIDB4MTU0RiwgMHg2RTFBLCAweDA5NzcsIDB4NkUxQiwgMHgwNzZFLCAweDZFMUQsCisgICAgMHgxNTVFLCAweDZFMUYsIDB4MTU1OCwgMHg2RTIwLCAweDA2OEUsIDB4NkUyMSwgMHgwQzQ5LCAweDZFMjIsIDB4Mzk3RCwKKyAgICAweDZFMjMsIDB4MTU1MywgMHg2RTI0LCAweDE1NUMsIDB4NkUyNSwgMHgwNDczLCAweDZFMjYsIDB4MDRENCwgMHg2RTI3LAorICAgIDB4MjE0RSwgMHg2RTI5LCAweDA1MzksIDB4NkUyQiwgMHgxNTU1LCAweDZFMkMsIDB4MEIwQywgMHg2RTJELCAweDE1NEMsCisgICAgMHg2RTJFLCAweDE1NEUsIDB4NkUyRiwgMHgwN0QzLCAweDZFMzQsIDB4MzQxMiwgMHg2RTM4LCAweDE1NUYsIDB4NkUzOSwKKyAgICAweDIxNEMsIDB4NkUzQSwgMHgxNTVBLCAweDZFM0MsIDB4MjE0RiwgMHg2RTNFLCAweDE1NTIsIDB4NkU0MiwgMHgzQzM3LAorICAgIDB4NkU0MywgMHgxNTU5LCAweDZFNEEsIDB4MEVCNywgMHg2RTRELCAweDE1NTcsIDB4NkU0RSwgMHgxNTVCLCAweDZFNTEsCisgICAgMHgzOTdFLCAweDZFNTYsIDB4MDc4NCwgMHg2RTU4LCAweDA5QUQsIDB4NkU1QiwgMHgwQjc3LCAweDZFNUMsIDB4MjE0RCwKKyAgICAweDZFNUYsIDB4MTU1MSwgMHg2RTY3LCAweDBGMTksIDB4NkU2QiwgMHgxNTU0LCAweDZFNkUsIDB4MTU0RCwgMHg2RTZGLAorICAgIDB4MEM2QywgMHg2RTcyLCAweDE1NTAsIDB4NkU3NiwgMHgxNTU2LCAweDZFN0UsIDB4MEZGNywgMHg2RTdGLCAweDA4RUEsCisgICAgMHg2RTgwLCAweDBFQUMsIDB4NkU4MiwgMHgxNTYwLCAweDZFOEMsIDB4MEQ0MiwgMHg2RThGLCAweDE1NkMsIDB4NkU5MCwKKyAgICAweDA3NkYsIDB4NkU5NiwgMHgwOTZBLCAweDZFOTgsIDB4MTU2MiwgMHg2RTlDLCAweDBGNzcsIDB4NkU5RCwgMHgwN0Q0LAorICAgIDB4NkU5RiwgMHgxNTZGLCAweDZFQTIsIDB4MDRCMiwgMHg2RUE1LCAweDE1NkQsIDB4NkVBQSwgMHgxNTYxLCAweDZFQUIsCisgICAgMHgzNDBDLCAweDZFQUYsIDB4MTU2NywgMHg2RUIyLCAweDE1NjksIDB4NkVCNiwgMHgwRjM5LCAweDZFQjcsIDB4MTU2NCwKKyAgICAweDZFQkEsIDB4MEMyOCwgMHg2RUJELCAweDE1NjYsIDB4NkVCRiwgMHgyMTUwLCAweDZFQzIsIDB4MTU2RSwgMHg2RUM0LAorICAgIDB4MTU2OCwgMHg2RUM1LCAweDBFRDMsIDB4NkVDNywgMHgzOTdGLCAweDZFQzksIDB4MTU2MywgMHg2RUNBLCAweDM5ODAsCisgICAgMHg2RUNCLCAweDA4Q0UsIDB4NkVDQywgMHgxNTdCLCAweDZFQ0UsIDB4Mzk4MSwgMHg2RUQxLCAweDA1QzgsIDB4NkVEMywKKyAgICAweDE1NjUsIDB4NkVENCwgMHgxNTZBLCAweDZFRDUsIDB4MTU2QiwgMHg2RUQ5LCAweDNDMzgsIDB4NkVERCwgMHgwQjRDLAorICAgIDB4NkVERSwgMHgwQjNBLCAweDZFRTYsIDB4M0MyNCwgMHg2RUVDLCAweDE1NzMsIDB4NkVFRiwgMHgxNTc5LCAweDZFRjIsCisgICAgMHgxNTc3LCAweDZFRjQsIDB4MEMyMywgMHg2RUY3LCAweDE1N0UsIDB4NkVGOCwgMHgxNTc0LCAweDZFRkQsIDB4Mzk4MiwKKyAgICAweDZFRkUsIDB4MTU3NSwgMHg2RUZGLCAweDE1NUQsIDB4NkYwMSwgMHgwNjkzLCAweDZGMDIsIDB4MERBQywgMHg2RjA2LAorICAgIDB4MDhFQiwgMHg2RjA5LCAweDA4MDksIDB4NkYwRiwgMHgwRkQ5LCAweDZGMTEsIDB4MTU3MSwgMHg2RjEzLCAweDE1N0QsCisgICAgMHg2RjE0LCAweDA1MEIsIDB4NkYxNSwgMHgwQUU4LCAweDZGMUEsIDB4Mzk4MywgMHg2RjIwLCAweDBEMkYsIDB4NkYyMiwKKyAgICAweDA1RkQsIDB4NkYyMywgMHgwRkMyLCAweDZGMkEsIDB4Mzk4NCwgMHg2RjJCLCAweDBFQUQsIDB4NkYyQywgMHgwQkVFLAorICAgIDB4NkYyRiwgMHgzOTg1LCAweDZGMzEsIDB4MTU3OCwgMHg2RjMyLCAweDE1N0EsIDB4NkYzMywgMHgzOTg2LCAweDZGMzgsCisgICAgMHgwQUI0LCAweDZGM0UsIDB4MTU3QywgMHg2RjNGLCAweDE1NzYsIDB4NkY0MSwgMHgxNTcwLCAweDZGNDUsIDB4MDVGRiwKKyAgICAweDZGNTEsIDB4MUU2MCwgMHg2RjU0LCAweDA3M0YsIDB4NkY1OCwgMHgxNThBLCAweDZGNUEsIDB4Mzk4NywgMHg2RjVCLAorICAgIDB4MTU4NSwgMHg2RjVDLCAweDBBOUMsIDB4NkY1RSwgMHgzOTg4LCAweDZGNUYsIDB4MDVDMSwgMHg2RjYyLCAweDM5ODksCisgICAgMHg2RjY0LCAweDA5NkIsIDB4NkY2NiwgMHgxNThFLCAweDZGNkQsIDB4MTU4NywgMHg2RjZFLCAweDBCQzgsIDB4NkY2RiwKKyAgICAweDE1ODQsIDB4NkY3MCwgMHgwQkY1LCAweDZGNzQsIDB4MTVBNywgMHg2Rjc4LCAweDE1ODEsIDB4NkY3QSwgMHgxNTgwLAorICAgIDB4NkY3QywgMHgxNTg5LCAweDZGN0QsIDB4Mzk4QSwgMHg2RjgwLCAweDE1ODMsIDB4NkY4MSwgMHgxNTgyLCAweDZGODIsCisgICAgMHgxNTg4LCAweDZGODQsIDB4MEE0NSwgMHg2Rjg2LCAweDE1N0YsIDB4NkY4OCwgMHgyMTUxLCAweDZGOEIsIDB4Mzk4QiwKKyAgICAweDZGOEQsIDB4Mzk4QywgMHg2RjhFLCAweDE1OEIsIDB4NkY5MSwgMHgxNThDLCAweDZGOTIsIDB4Mzk4RCwgMHg2Rjk0LAorICAgIDB4Mzk4RSwgMHg2Rjk3LCAweDA1RkUsIDB4NkY5OCwgMHgzNjNDLCAweDZGOUEsIDB4Mzk4RiwgMHg2RkExLCAweDE1OTEsCisgICAgMHg2RkEzLCAweDE1OTAsIDB4NkZBNCwgMHgxNTkyLCAweDZGQTcsIDB4Mzk5MCwgMHg2RkE4LCAweDM5OTEsIDB4NkZBQSwKKyAgICAweDE1OTUsIDB4NkZCMSwgMHgwQzNELCAweDZGQjMsIDB4MTU4RiwgMHg2RkI1LCAweDIxNTIsIDB4NkZCNiwgMHgzOTkyLAorICAgIDB4NkZCOSwgMHgxNTkzLCAweDZGQzAsIDB4MDczOSwgMHg2RkMxLCAweDBCNTksIDB4NkZDMiwgMHgxNThELCAweDZGQzMsCisgICAgMHgwQ0YxLCAweDZGQzYsIDB4MTU5NCwgMHg2RkQ0LCAweDE1OTksIDB4NkZENSwgMHgxNTk3LCAweDZGRDgsIDB4MTU5QSwKKyAgICAweDZGREEsIDB4Mzk5MywgMHg2RkRCLCAweDE1OUQsIDB4NkZERSwgMHgzOTk0LCAweDZGREYsIDB4MTU5NiwgMHg2RkUwLAorICAgIDB4MDdGQywgMHg2RkUxLCAweDBDREUsIDB4NkZFNCwgMHgxNTM2LCAweDZGRUIsIDB4MEY1RSwgMHg2RkVDLCAweDE1OTgsCisgICAgMHg2RkVFLCAweDE1OUMsIDB4NkZFRiwgMHgwQjU1LCAweDZGRjEsIDB4MTU5QiwgMHg2RkYzLCAweDE1ODYsIDB4NkZGNSwKKyAgICAweDIxNTMsIDB4NkZGNiwgMHgxQkE0LCAweDZGRjksIDB4Mzk5NSwgMHg2RkZBLCAweDE1QTAsIDB4NkZGRSwgMHgxNUE0LAorICAgIDB4NzAwMSwgMHgxNUEyLCAweDcwMDUsIDB4MjE1NCwgMHg3MDA2LCAweDFFNTAsIDB4NzAwNywgMHgyMTU1LCAweDcwMDksCisgICAgMHgxNTlFLCAweDcwMEIsIDB4MTU5RiwgMHg3MDBGLCAweDE1QTMsIDB4NzAxMSwgMHgxNUExLCAweDcwMTUsIDB4MERDMCwKKyAgICAweDcwMTgsIDB4MTVBOSwgMHg3MDFBLCAweDE1QTYsIDB4NzAxQiwgMHgxNUE1LCAweDcwMUQsIDB4MTVBOCwgMHg3MDFFLAorICAgIDB4MENBQywgMHg3MDFGLCAweDE1QUEsIDB4NzAyNiwgMHgwQkIzLCAweDcwMjcsIDB4MEI0RCwgMHg3MDI4LCAweDIxNTYsCisgICAgMHg3MDJDLCAweDBBNDksIDB4NzAzMCwgMHgxNUFCLCAweDcwMzIsIDB4MTVBRCwgMHg3MDM5LCAweDM5OTYsIDB4NzAzQywKKyAgICAweDM5OTcsIDB4NzAzRSwgMHgxNUFDLCAweDcwNEEsIDB4Mzk5OCwgMHg3MDRDLCAweDE1NzIsIDB4NzA1MSwgMHgxNUFFLAorICAgIDB4NzA1NCwgMHgzOTk5LCAweDcwNTgsIDB4MENCRiwgMHg3MDVELCAweDM5OUEsIDB4NzA1RSwgMHgzOTlCLCAweDcwNjMsCisgICAgMHgxNUFGLCAweDcwNjQsIDB4Mzk5QywgMHg3MDZCLCAweDA1NTAsIDB4NzA2QywgMHgzOTlELCAweDcwNkYsIDB4MEM2RSwKKyAgICAweDcwNzAsIDB4MDU4MywgMHg3MDc4LCAweDA2N0UsIDB4NzA3QywgMHgwOTBBLCAweDcwN0QsIDB4MDg0MiwgMHg3MDdFLAorICAgIDB4Mzk5RSwgMHg3MDgxLCAweDM5OUYsIDB4NzA4NSwgMHgyMTU3LCAweDcwODksIDB4MEZDRCwgMHg3MDhBLCAweDBBMkMsCisgICAgMHg3MDhFLCAweDA1MEMsIDB4NzA5MiwgMHgxNUIxLCAweDcwOTUsIDB4MzlBMCwgMHg3MDk5LCAweDE1QjAsIDB4NzBBQiwKKyAgICAweDIxNTgsIDB4NzBBQywgMHgxNUI0LCAweDcwQUQsIDB4MEI3OCwgMHg3MEFFLCAweDE1QjcsIDB4NzBBRiwgMHgxNUIyLAorICAgIDB4NzBCMywgMHgxNUI2LCAweDcwQjcsIDB4MzlBMSwgMHg3MEI4LCAweDE1QjUsIDB4NzBCOSwgMHgwQzNBLCAweDcwQkEsCisgICAgMHgwNDlELCAweDcwQkIsIDB4MjBBRCwgMHg3MEM4LCAweDBGQkQsIDB4NzBDQiwgMHgxNUI5LCAweDcwQ0YsIDB4MDRDQSwKKyAgICAweDcwRDMsIDB4MzlBMiwgMHg3MEQ0LCAweDM5QTMsIDB4NzBEOCwgMHgzOUE0LCAweDcwRDksIDB4MTVCQiwgMHg3MERDLAorICAgIDB4MzlBNSwgMHg3MERELCAweDE1QkEsIDB4NzBERiwgMHgxNUI4LCAweDcwRjEsIDB4MTVCMywgMHg3MEY5LCAweDBFNTEsCisgICAgMHg3MEZELCAweDE1QkQsIDB4NzEwNCwgMHgyMTVBLCAweDcxMDcsIDB4MzlBNiwgMHg3MTA5LCAweDE1QkMsIDB4NzEwRiwKKyAgICAweDIxNTksIDB4NzExNCwgMHgwNTBELCAweDcxMTksIDB4MTVCRiwgMHg3MTFBLCAweDBFMDIsIDB4NzExQywgMHgxNUJFLAorICAgIDB4NzEyMCwgMHgzOUE3LCAweDcxMjEsIDB4MEVDMSwgMHg3MTI2LCAweDA5QUYsIDB4NzEzMCwgMHgxRERDLCAweDcxMzEsCisgICAgMHgzOUE4LCAweDcxMzYsIDB4MEFCNSwgMHg3MTNDLCAweDA5QUUsIDB4NzE0NiwgMHgyMTVDLCAweDcxNDcsIDB4MjE1RCwKKyAgICAweDcxNDksIDB4MEZDMywgMHg3MTRBLCAweDM5QTksIDB4NzE0QywgMHgxNUM1LCAweDcxNEUsIDB4MEE5RCwgMHg3MTUyLAorICAgIDB4MzlBQSwgMHg3MTU1LCAweDE1QzEsIDB4NzE1NiwgMHgxNUM2LCAweDcxNTksIDB4MDUwRSwgMHg3MTVDLCAweDIxNUIsCisgICAgMHg3MTYwLCAweDM5QUIsIDB4NzE2MiwgMHgxNUM0LCAweDcxNjQsIDB4MEQxNywgMHg3MTY1LCAweDE1QzAsIDB4NzE2NiwKKyAgICAweDE1QzMsIDB4NzE2NywgMHgwOUIwLCAweDcxNjksIDB4MEQ2NSwgMHg3MTZDLCAweDE1QzcsIDB4NzE2RSwgMHgwOEZELAorICAgIDB4NzE3OSwgMHgzOUFDLCAweDcxN0QsIDB4MEE5RSwgMHg3MTg0LCAweDE1Q0EsIDB4NzE4OCwgMHgxNUMyLCAweDcxOEEsCisgICAgMHgwNkZELCAweDcxOEYsIDB4MTVDOCwgMHg3MTkyLCAweDM5QUQsIDB4NzE5NCwgMHgwRjNBLCAweDcxOTUsIDB4MTVDQiwKKyAgICAweDcxOTksIDB4MjA1RCwgMHg3MTlGLCAweDA5NTksIDB4NzFBOCwgMHgxNUNDLCAweDcxQUMsIDB4MTVDRCwgMHg3MUIxLAorICAgIDB4MENFNCwgMHg3MUIzLCAweDM5QUUsIDB4NzFCOSwgMHgxNUNGLCAweDcxQkUsIDB4MTVEMCwgMHg3MUMxLCAweDIxNUYsCisgICAgMHg3MUMzLCAweDBDRTksIDB4NzFDOCwgMHgwQzZGLCAweDcxQzksIDB4MTVEMiwgMHg3MUNCLCAweDM5QUYsIDB4NzFDRSwKKyAgICAweDE1RDQsIDB4NzFEMCwgMHgwRjlELCAweDcxRDIsIDB4MTVEMSwgMHg3MUQzLCAweDM5QjAsIDB4NzFENCwgMHgxNUQzLAorICAgIDB4NzFENSwgMHgwNTBGLCAweDcxRDYsIDB4MzlCMSwgMHg3MUQ3LCAweDE1Q0UsIDB4NzFERiwgMHgxMTRFLCAweDcxRTAsCisgICAgMHgxNUQ1LCAweDcxRTUsIDB4MEFFOSwgMHg3MUU2LCAweDA4ODYsIDB4NzFFNywgMHgxNUQ3LCAweDcxRUMsIDB4MTVENiwKKyAgICAweDcxRUQsIDB4MDlFQSwgMHg3MUVFLCAweDEwRUUsIDB4NzFGNSwgMHgxNUQ4LCAweDcxRjksIDB4MTVEQSwgMHg3MUZCLAorICAgIDB4MTVDOSwgMHg3MUZDLCAweDE1RDksIDB4NzFGRSwgMHgyMTYwLCAweDcxRkYsIDB4MTVEQiwgMHg3MjAwLCAweDM5QjIsCisgICAgMHg3MjA2LCAweDBEMzAsIDB4NzIwRCwgMHgxNURDLCAweDcyMTAsIDB4MTVERCwgMHg3MjFCLCAweDE1REUsIDB4NzIxRCwKKyAgICAweDM5QjMsIDB4NzIyOCwgMHgxNURGLCAweDcyMkEsIDB4MEJGQSwgMHg3MjJCLCAweDM5QjQsIDB4NzIyQywgMHgxNUUxLAorICAgIDB4NzIyRCwgMHgxNUUwLCAweDcyMzAsIDB4MTVFMiwgMHg3MjMyLCAweDE1RTMsIDB4NzIzNSwgMHgwOTBCLCAweDcyMzYsCisgICAgMHgwREQ1LCAweDcyMzgsIDB4MzlCNSwgMHg3MjNBLCAweDBFRjgsIDB4NzIzQiwgMHgxNUU0LCAweDcyM0MsIDB4MTVFNSwKKyAgICAweDcyM0QsIDB4MEFEOCwgMHg3MjNFLCAweDA4RDAsIDB4NzIzRiwgMHgxNUU2LCAweDcyNDAsIDB4MTVFNywgMHg3MjQxLAorICAgIDB4MzlCNiwgMHg3MjQ2LCAweDE1RTgsIDB4NzI0NywgMHgwRTIyLCAweDcyNDgsIDB4MEQ1QiwgMHg3MjRCLCAweDE1RTksCisgICAgMHg3MjRDLCAweDBEMEQsIDB4NzI1MiwgMHgwQkM5LCAweDcyNTMsIDB4MzlCNywgMHg3MjU1LCAweDM5QjgsIDB4NzI1NiwKKyAgICAweDM5QjksIDB4NzI1OCwgMHgxNUVBLCAweDcyNTksIDB4MDU2NywgMHg3MjVCLCAweDA2ODcsIDB4NzI1QywgMHgzOUJBLAorICAgIDB4NzI1RCwgMHgwRUQyLCAweDcyNUYsIDB4MEVDMiwgMHg3MjYxLCAweDA1MzQsIDB4NzI2MiwgMHgwRkRBLCAweDcyNjcsCisgICAgMHgwRTgwLCAweDcyNjksIDB4MERGQSwgMHg3MjcyLCAweDBBNUIsIDB4NzI3NCwgMHgxNUVCLCAweDcyNzksIDB4MEM5QiwKKyAgICAweDcyN0QsIDB4MDc1NywgMHg3MjdFLCAweDE1RUMsIDB4NzI4MCwgMHgwODQ0LCAweDcyODEsIDB4MTVFRSwgMHg3MjgyLAorICAgIDB4MTVFRCwgMHg3Mjg3LCAweDE1RUYsIDB4NzI4RCwgMHgzOUJCLCAweDcyOTIsIDB4MTVGMCwgMHg3Mjk2LCAweDE1RjEsCisgICAgMHg3MkEwLCAweDA2NTgsIDB4NzJBMiwgMHgxNUYyLCAweDcyQTcsIDB4MTVGMywgMHg3MkFDLCAweDA3NTgsIDB4NzJBRCwKKyAgICAweDM5QkMsIDB4NzJBRiwgMHgwRDVDLCAweDcyQjEsIDB4MjE2MSwgMHg3MkIyLCAweDE1RjUsIDB4NzJCNCwgMHgzOUJELAorICAgIDB4NzJCNiwgMHgwOURELCAweDcyQjksIDB4MTVGNCwgMHg3MkJFLCAweDIxNjIsIDB4NzJDMCwgMHgzNDJCLCAweDcyQzIsCisgICAgMHgwNkIwLCAweDcyQzMsIDB4MTVGNiwgMHg3MkM0LCAweDE1RjgsIDB4NzJDNiwgMHgxNUY3LCAweDcyQzcsIDB4MzlCRSwKKyAgICAweDcyQ0UsIDB4MTVGOSwgMHg3MkQwLCAweDA3ODUsIDB4NzJEMiwgMHgxNUZBLCAweDcyRDcsIDB4MDZFMSwgMHg3MkQ5LAorICAgIDB4MEFDMiwgMHg3MkRCLCAweDA4MEYsIDB4NzJFMCwgMHgxNUZDLCAweDcyRTEsIDB4MTVGRCwgMHg3MkUyLCAweDE1RkIsCisgICAgMHg3MkU5LCAweDA5MTksIDB4NzJFQywgMHgwQ0EwLCAweDcyRUQsIDB4MDZCMSwgMHg3MkY3LCAweDE1RkYsIDB4NzJGOCwKKyAgICAweDBCNkEsIDB4NzJGOSwgMHgxNUZFLCAweDcyRkIsIDB4MzlCRiwgMHg3MkZDLCAweDBGREIsIDB4NzJGRCwgMHgwRDE4LAorICAgIDB4NzMwNCwgMHgzOUMwLCAweDczMDUsIDB4MzlDMSwgMHg3MzBBLCAweDE2MDIsIDB4NzMxNiwgMHgxNjA0LCAweDczMTcsCisgICAgMHgxNjAxLCAweDczMUIsIDB4MEVFMCwgMHg3MzFDLCAweDE2MDMsIDB4NzMxRCwgMHgxNjA1LCAweDczMUYsIDB4MEY4QywKKyAgICAweDczMjQsIDB4MjE2MywgMHg3MzI1LCAweDE2MDksIDB4NzMyOCwgMHgzOUMyLCAweDczMjksIDB4MTYwOCwgMHg3MzJBLAorICAgIDB4MEJCNCwgMHg3MzJCLCAweDBDRTMsIDB4NzMyRSwgMHgwNzU5LCAweDczMkYsIDB4MTYwNywgMHg3MzMxLCAweDM5QzMsCisgICAgMHg3MzM0LCAweDE2MDYsIDB4NzMzNiwgMHgwRjFCLCAweDczMzcsIDB4MEYxQywgMHg3MzNFLCAweDE2MEEsIDB4NzMzRiwKKyAgICAweDA1MTAsIDB4NzM0MywgMHgzOUM0LCAweDczNDQsIDB4MDgwOCwgMHg3MzQ1LCAweDA4QjAsIDB4NzM0RSwgMHgxNjBCLAorICAgIDB4NzM0RiwgMHgxNjBDLCAweDczNTcsIDB4MTYwRSwgMHg3MzYzLCAweDA5NEQsIDB4NzM2OCwgMHgxNjEwLCAweDczNkEsCisgICAgMHgxNjBGLCAweDczNkMsIDB4MzlDNSwgMHg3MzcwLCAweDE2MTEsIDB4NzM3MiwgMHgwNUFCLCAweDczNzUsIDB4MTYxMywKKyAgICAweDczNzcsIDB4MjE2NSwgMHg3Mzc4LCAweDE2MTIsIDB4NzM3QSwgMHgxNjE1LCAweDczN0IsIDB4MTYxNCwgMHg3MzdDLAorICAgIDB4MzlDNiwgMHg3MzgzLCAweDM5QzcsIDB4NzM4NCwgMHgwNzcwLCAweDczODUsIDB4MzlDOCwgMHg3Mzg2LCAweDM5QzksCisgICAgMHg3Mzg3LCAweDBGNzAsIDB4NzM4OSwgMHgwNkM0LCAweDczOEIsIDB4MDUyNiwgMHg3Mzk1LCAweDM5Q0EsIDB4NzM5NiwKKyAgICAweDA2RTIsIDB4NzM5RSwgMHgzOUNCLCAweDczOUYsIDB4MzlDQywgMHg3M0EwLCAweDM5Q0QsIDB4NzNBNiwgMHgzOUNFLAorICAgIDB4NzNBOCwgMHgzQzNGLCAweDczQTksIDB4MDYxRCwgMHg3M0FCLCAweDM5Q0YsIDB4NzNCMiwgMHgwRkIwLCAweDczQjMsCisgICAgMHgxNjE3LCAweDczQjUsIDB4MzlEMCwgMHg3M0I3LCAweDM5RDEsIDB4NzNCQSwgMHgzNUVBLCAweDczQkIsIDB4MTYxOSwKKyAgICAweDczQkMsIDB4MzlEMiwgMHg3M0JELCAweDIxNjYsIDB4NzNDMCwgMHgxNjFBLCAweDczQzIsIDB4MDU1MSwgMHg3M0M4LAorICAgIDB4MTYxNiwgMHg3M0M5LCAweDIxNjcsIDB4NzNDQSwgMHgwODg3LCAweDczQ0QsIDB4MEJERCwgMHg3M0NFLCAweDE2MTgsCisgICAgMHg3M0NGLCAweDM5RDMsIDB4NzNEMiwgMHgyMTZBLCAweDczRDYsIDB4MjE2OCwgMHg3M0Q5LCAweDM5RDQsIDB4NzNERSwKKyAgICAweDE2MUQsIDB4NzNFMCwgMHgwOTFBLCAweDczRTMsIDB4MjE2OSwgMHg3M0U0LCAweDNDMzksIDB4NzNFNSwgMHgxNjFCLAorICAgIDB4NzNFOSwgMHgzOUQ1LCAweDczRUEsIDB4MDcxNCwgMHg3M0VELCAweDBENUQsIDB4NzNFRSwgMHgxNjFDLCAweDczRjEsCisgICAgMHgxNjM3LCAweDczRjQsIDB4MzlENiwgMHg3M0Y1LCAweDIxNkMsIDB4NzNGOCwgMHgxNjIyLCAweDczRkQsIDB4MzlENywKKyAgICAweDczRkUsIDB4MDc3MSwgMHg3NDAzLCAweDA2N0YsIDB4NzQwNCwgMHgzOUQ4LCAweDc0MDUsIDB4MTYxRiwgMHg3NDA2LAorICAgIDB4MEY2NywgMHg3NDA3LCAweDIxNkIsIDB4NzQwOSwgMHgwRjc4LCAweDc0MEEsIDB4MzlEOSwgMHg3NDFBLCAweDM5REEsCisgICAgMHg3NDFCLCAweDM5REIsIDB4NzQyMSwgMHgzQzNBLCAweDc0MjIsIDB4MEI1NiwgMHg3NDI0LCAweDM5REMsIDB4NzQyNSwKKyAgICAweDE2MjEsIDB4NzQyNiwgMHgyMTZELCAweDc0MjgsIDB4MzlERCwgMHg3NDI5LCAweDIxNkYsIDB4NzQyQSwgMHgyMTZFLAorICAgIDB4NzQyQywgMHgzOURFLCAweDc0MkUsIDB4MjE3MCwgMHg3NDJGLCAweDM5REYsIDB4NzQzMCwgMHgzOUUwLCAweDc0MzEsCisgICAgMHgzOUUxLCAweDc0MzIsIDB4MTYyMywgMHg3NDMzLCAweDBGOUUsIDB4NzQzNCwgMHgwNkNGLCAweDc0MzUsIDB4MEQ5MCwKKyAgICAweDc0MzYsIDB4MEQwMCwgMHg3NDM5LCAweDM5RTIsIDB4NzQzQSwgMHgxNjI0LCAweDc0M0YsIDB4MTYyNiwgMHg3NDQxLAorICAgIDB4MTYyOSwgMHg3NDQ0LCAweDM5RTMsIDB4NzQ0NywgMHgzOUU0LCAweDc0NEIsIDB4MzlFNSwgMHg3NDRELCAweDM5RTYsCisgICAgMHg3NDUxLCAweDM5RTcsIDB4NzQ1NSwgMHgxNjI1LCAweDc0NTcsIDB4MzlFOCwgMHg3NDU5LCAweDE2MjgsIDB4NzQ1QSwKKyAgICAweDA3OUUsIDB4NzQ1QiwgMHgwNEVGLCAweDc0NUMsIDB4MTYyQSwgMHg3NDVFLCAweDBBMzYsIDB4NzQ1RiwgMHgxNjI3LAorICAgIDB4NzQ2MCwgMHgwRkE0LCAweDc0NjIsIDB4MjE3MSwgMHg3NDYzLCAweDE2MkQsIDB4NzQ2NCwgMHgxRDM1LCAweDc0NjYsCisgICAgMHgzOUU5LCAweDc0NjksIDB4MTYyQiwgMHg3NDZBLCAweDE2MkUsIDB4NzQ2QiwgMHgzOUVBLCAweDc0NkYsIDB4MTYyMCwKKyAgICAweDc0NzAsIDB4MTYyQywgMHg3NDcxLCAweDM5RUIsIDB4NzQ3MywgMHgwODJDLCAweDc0NzYsIDB4MTYyRiwgMHg3NDdFLAorICAgIDB4MTYzMCwgMHg3NDgwLCAweDM5RUMsIDB4NzQ4MywgMHgwRjY4LCAweDc0ODUsIDB4MzlFRCwgMHg3NDg2LCAweDM5RUUsCisgICAgMHg3NDg3LCAweDM5RUYsIDB4NzQ4OSwgMHgyMTcyLCAweDc0OEIsIDB4MTYzMSwgMHg3NDkwLCAweDM5RjAsIDB4NzQ5OCwKKyAgICAweDM5RjEsIDB4NzQ5QywgMHgzOUYyLCAweDc0OUUsIDB4MTYzMiwgMHg3NDlGLCAweDIxNzMsIDB4NzRBMCwgMHgzOUYzLAorICAgIDB4NzRBMiwgMHgxNjFFLCAweDc0QTMsIDB4MzlGNCwgMHg3NEE3LCAweDE2MzMsIDB4NzRBOCwgMHgzOUY1LCAweDc0QUIsCisgICAgMHgzOUY2LCAweDc0QjAsIDB4MDYwMCwgMHg3NEI1LCAweDM5RjcsIDB4NzRCRCwgMHgwOEQxLCAweDc0QkYsIDB4MzlGOCwKKyAgICAweDc0QzgsIDB4MzlGOSwgMHg3NENBLCAweDE2MzQsIDB4NzRDRiwgMHgxNjM1LCAweDc0RDQsIDB4MTYzNiwgMHg3NERBLAorICAgIDB4MzlGQSwgMHg3NERDLCAweDA0REQsIDB4NzRERSwgMHgzOUZCLCAweDc0RTAsIDB4MTYzOCwgMHg3NEUyLCAweDBEQUQsCisgICAgMHg3NEUzLCAweDE2MzksIDB4NzRFNiwgMHgwNUUwLCAweDc0RTcsIDB4MTYzQSwgMHg3NEU5LCAweDE2M0IsIDB4NzRFRSwKKyAgICAweDE2M0MsIDB4NzRFRiwgMHgzNzUwLCAweDc0RjAsIDB4MTYzRSwgMHg3NEYxLCAweDE2M0YsIDB4NzRGMiwgMHgxNjNELAorICAgIDB4NzRGNiwgMHgwREM1LCAweDc0RjcsIDB4MTY0MSwgMHg3NEY4LCAweDE2NDAsIDB4NzUwMSwgMHgyMTc0LCAweDc1MDMsCisgICAgMHgxNjQzLCAweDc1MDQsIDB4MTY0MiwgMHg3NTA1LCAweDE2NDQsIDB4NzUwQywgMHgxNjQ1LCAweDc1MEQsIDB4MTY0NywKKyAgICAweDc1MEUsIDB4MTY0NiwgMHg3NTExLCAweDA4MEIsIDB4NzUxMywgMHgxNjQ5LCAweDc1MTUsIDB4MTY0OCwgMHg3NTE4LAorICAgIDB4MDYwMSwgMHg3NTFBLCAweDBBMTksIDB4NzUxQywgMHgwQzM2LCAweDc1MUUsIDB4MTY0QSwgMHg3NTFGLCAweDBBNUMsCisgICAgMHg3NTIyLCAweDM1REUsIDB4NzUyMywgMHgwODg4LCAweDc1MjUsIDB4MDUxQiwgMHg3NTI2LCAweDE2NEIsIDB4NzUyOCwKKyAgICAweDBGM0IsIDB4NzUyQiwgMHgwRTMzLCAweDc1MkMsIDB4MTY0QywgMHg3NTJGLCAweDIwRjIsIDB4NzUzMCwgMHgwQzNFLAorICAgIDB4NzUzMSwgMHgwRjFELCAweDc1MzIsIDB4MDdENSwgMHg3NTMzLCAweDBBMDMsIDB4NzUzNywgMHgwQjg5LCAweDc1MzgsCisgICAgMHgxMEM5LCAweDc1M0EsIDB4MEJDQSwgMHg3NTNCLCAweDA1NjgsIDB4NzUzQywgMHgxNjRELCAweDc1NDQsIDB4MTY0RSwKKyAgICAweDc1NDYsIDB4MTY1MywgMHg3NTQ5LCAweDE2NTEsIDB4NzU0QSwgMHgxNjUwLCAweDc1NEIsIDB4MTNDNywgMHg3NTRDLAorICAgIDB4MDU4NCwgMHg3NTRELCAweDE2NEYsIDB4NzU0RSwgMHgzOUZDLCAweDc1NEYsIDB4MDQ5RSwgMHg3NTUxLCAweDBEM0UsCisgICAgMHg3NTU0LCAweDBENUUsIDB4NzU1OSwgMHgwRjc5LCAweDc1NUEsIDB4MTY1NCwgMHg3NTVCLCAweDE2NTIsIDB4NzU1QywKKyAgICAweDBCOUEsIDB4NzU1RCwgMHgwQTRBLCAweDc1NjAsIDB4MEQzRiwgMHg3NTYyLCAweDBEOUYsIDB4NzU2NCwgMHgxNjU2LAorICAgIDB4NzU2NSwgMHgwRjc0LCAweDc1NjYsIDB4MDcyMywgMHg3NTY3LCAweDE2NTcsIDB4NzU2OSwgMHgxNjU1LCAweDc1NkEsCisgICAgMHgwRDZBLCAweDc1NkIsIDB4MTY1OCwgMHg3NTZDLCAweDNDM0IsIDB4NzU2RCwgMHgxNjU5LCAweDc1NkYsIDB4MjE3NSwKKyAgICAweDc1NzAsIDB4MDQ5RiwgMHg3NTczLCAweDA5REUsIDB4NzU3NCwgMHgxNjVFLCAweDc1NzUsIDB4Mzc1MSwgMHg3NTc2LAorICAgIDB4MTY1QiwgMHg3NTc3LCAweDBDQzUsIDB4NzU3OCwgMHgxNjVBLCAweDc1NzksIDB4MzlGRCwgMHg3NTdGLCAweDA2NDAsCisgICAgMHg3NTgxLCAweDM5RkUsIDB4NzU4MiwgMHgxNjYxLCAweDc1ODYsIDB4MTY1QywgMHg3NTg3LCAweDE2NUQsIDB4NzU4OSwKKyAgICAweDE2NjAsIDB4NzU4QSwgMHgxNjVGLCAweDc1OEIsIDB4MEQ5NywgMHg3NThFLCAweDBBQzQsIDB4NzU4RiwgMHgwQUMzLAorICAgIDB4NzU5MCwgMHgzOUZGLCAweDc1OTEsIDB4MDY1OSwgMHg3NTkyLCAweDNBMDAsIDB4NzU5MywgMHgzQTAxLCAweDc1OTQsCisgICAgMHgxNjYyLCAweDc1OUEsIDB4MTY2MywgMHg3NTlELCAweDE2NjQsIDB4NzVBMywgMHgxNjY2LCAweDc1QTUsIDB4MTY2NSwKKyAgICAweDc1QUIsIDB4MDRGOCwgMHg3NUIxLCAweDE2NkUsIDB4NzVCMiwgMHgwRDdDLCAweDc1QjMsIDB4MTY2OCwgMHg3NUI0LAorICAgIDB4M0EwMiwgMHg3NUI1LCAweDE2NkEsIDB4NzVCOCwgMHgxNjZDLCAweDc1QjksIDB4MEEwNCwgMHg3NUJDLCAweDE2NkQsCisgICAgMHg3NUJELCAweDE2NkIsIDB4NzVCRSwgMHgwOEVDLCAweDc1QzIsIDB4MTY2NywgMHg3NUMzLCAweDE2NjksIDB4NzVDNSwKKyAgICAweDBEQjQsIDB4NzVDNywgMHgwOUIxLCAweDc1Q0EsIDB4MTY3MCwgMHg3NUNELCAweDE2NkYsIDB4NzVEMiwgMHgxNjcxLAorICAgIDB4NzVENCwgMHgwOEQyLCAweDc1RDUsIDB4MDgxRiwgMHg3NUQ4LCAweDBDNzEsIDB4NzVEOSwgMHgxNjcyLCAweDc1REIsCisgICAgMHgwQkU3LCAweDc1REUsIDB4MTY3NCwgMHg3NUUyLCAweDBGNjksIDB4NzVFMywgMHgxNjczLCAweDc1RTQsIDB4M0EwMywKKyAgICAweDc1RTksIDB4MEFFQiwgMHg3NUVDLCAweDM3NTIsIDB4NzVGMCwgMHgxNjc5LCAweDc1RjIsIDB4MTY3QiwgMHg3NUYzLAorICAgIDB4MTY3QywgMHg3NUY0LCAweDBCOTIsIDB4NzVGOSwgMHgzQTA0LCAweDc1RkEsIDB4MTY3QSwgMHg3NUZDLCAweDE2NzcsCisgICAgMHg3NUZFLCAweDE2NzUsIDB4NzVGRiwgMHgxNjc2LCAweDc2MDAsIDB4M0EwNSwgMHg3NjAxLCAweDE2NzgsIDB4NzYwOSwKKyAgICAweDE2N0YsIDB4NzYwQSwgMHgzQTA2LCAweDc2MEIsIDB4MTY3RCwgMHg3NjBELCAweDE2N0UsIDB4NzYxNSwgMHgzQTA3LAorICAgIDB4NzYxNiwgMHgzQTA4LCAweDc2MTksIDB4M0EwOSwgMHg3NjFFLCAweDNBMEEsIDB4NzYxRiwgMHgxNjgwLCAweDc2MjAsCisgICAgMHgxNjgyLCAweDc2MjEsIDB4MTY4MywgMHg3NjIyLCAweDE2ODQsIDB4NzYyNCwgMHgxNjg1LCAweDc2MjYsIDB4MUUyRCwKKyAgICAweDc2MjcsIDB4MTY4MSwgMHg3NjJELCAweDNBMEIsIDB4NzYzMCwgMHgxNjg3LCAweDc2MzQsIDB4MTY4NiwgMHg3NjM1LAorICAgIDB4M0EwQywgMHg3NjNCLCAweDE2ODgsIDB4NzY0MiwgMHgwRjhELCAweDc2NDMsIDB4M0EwRCwgMHg3NjQ2LCAweDE2OEIsCisgICAgMHg3NjQ3LCAweDE2ODksIDB4NzY0OCwgMHgxNjhBLCAweDc2NEIsIDB4M0EwRSwgMHg3NjRDLCAweDA2MUUsIDB4NzY0RSwKKyAgICAweDM3NTMsIDB4NzY1MiwgMHgwRjBBLCAweDc2NTYsIDB4MEUxQSwgMHg3NjU4LCAweDE2OEQsIDB4NzY1QywgMHgxNjhDLAorICAgIDB4NzY2MSwgMHgxNjhFLCAweDc2NjIsIDB4MTY4RiwgMHg3NjY1LCAweDNBMEYsIDB4NzY2NywgMHgxNjkzLCAweDc2NjgsCisgICAgMHgxNjkwLCAweDc2NjksIDB4MTY5MSwgMHg3NjZBLCAweDE2OTIsIDB4NzY2QywgMHgxNjk0LCAweDc2NkQsIDB4M0ExMCwKKyAgICAweDc2NkYsIDB4M0ExMSwgMHg3NjcwLCAweDE2OTUsIDB4NzY3MSwgMHgzQTEyLCAweDc2NzIsIDB4MTY5NiwgMHg3Njc0LAorICAgIDB4M0ExMywgMHg3Njc2LCAweDE2OTcsIDB4NzY3OCwgMHgxNjk4LCAweDc2N0EsIDB4MEQ0MywgMHg3NjdCLCAweDBDNEEsCisgICAgMHg3NjdDLCAweDE2OTksIDB4NzY3RCwgMHgwRDI4LCAweDc2N0UsIDB4MERBNiwgMHg3NjgwLCAweDE2OUEsIDB4NzY4MiwKKyAgICAweDIxNzYsIDB4NzY4MywgMHgxNjlCLCAweDc2ODQsIDB4MEMyNCwgMHg3Njg2LCAweDA1ODUsIDB4NzY4NywgMHgwN0Q2LAorICAgIDB4NzY4OCwgMHgxNjlDLCAweDc2OEIsIDB4MTY5RCwgMHg3NjhFLCAweDE2OUUsIDB4NzY5MCwgMHgwODc3LCAweDc2OTMsCisgICAgMHgxNkEwLCAweDc2OTYsIDB4MTY5RiwgMHg3Njk5LCAweDE2QTEsIDB4NzY5QSwgMHgxNkEyLCAweDc2OUIsIDB4MjE3OSwKKyAgICAweDc2OUMsIDB4MjE3NywgMHg3NjlFLCAweDIxNzgsIDB4NzZBNCwgMHgzQTE0LCAweDc2QTUsIDB4M0ExNSwgMHg3NkE2LAorICAgIDB4MjE3QSwgMHg3NkFFLCAweDBEN0QsIDB4NzZCMCwgMHgxNkEzLCAweDc2QjQsIDB4MTZBNCwgMHg3NkI3LCAweDFEMUMsCisgICAgMHg3NkI4LCAweDE2QTUsIDB4NzZCOSwgMHgxNkE2LCAweDc2QkEsIDB4MTZBNywgMHg3NkJGLCAweDA4N0MsIDB4NzZDMiwKKyAgICAweDE2QTgsIDB4NzZDMywgMHgwRDBDLCAweDc2QzUsIDB4M0ExNiwgMHg3NkM2LCAweDBFOEQsIDB4NzZDOCwgMHgwNEYwLAorICAgIDB4NzZDQSwgMHgwNEY5LCAweDc2Q0MsIDB4M0ExNywgMHg3NkNELCAweDE2QTksIDB4NzZEMiwgMHgxNkFCLCAweDc2RDYsCisgICAgMHgxNkFBLCAweDc2RDcsIDB4MEM2QSwgMHg3NkRCLCAweDBBNUQsIDB4NzZEQywgMHgxNEQ4LCAweDc2REUsIDB4MTZBQywKKyAgICAweDc2REYsIDB4MEVDRCwgMHg3NkUxLCAweDE2QUQsIDB4NzZFMywgMHgwNjAyLCAweDc2RTQsIDB4MEQ2QiwgMHg3NkU1LAorICAgIDB4MTZBRSwgMHg3NkU3LCAweDE2QUYsIDB4NzZFQSwgMHgxNkIwLCAweDc2RUMsIDB4M0ExOCwgMHg3NkVFLCAweDBFRTgsCisgICAgMHg3NkYyLCAweDBFRTEsIDB4NzZGNCwgMHgwQkRBLCAweDc2RjgsIDB4MEFFQywgMHg3NkZCLCAweDE2QjIsIDB4NzZGQywKKyAgICAweDNBMTksIDB4NzZGRSwgMHgwOTZDLCAweDc3MDEsIDB4MDlCMiwgMHg3NzA0LCAweDE2QjUsIDB4NzcwNywgMHgxNkI0LAorICAgIDB4NzcwOCwgMHgxNkIzLCAweDc3MDksIDB4MEQ5MSwgMHg3NzBCLCAweDA2MDMsIDB4NzcwQywgMHgwNzVELCAweDc3MUIsCisgICAgMHgxNkJCLCAweDc3MUUsIDB4MTZCOCwgMHg3NzFGLCAweDBBMDUsIDB4NzcyMCwgMHgwRUJFLCAweDc3MjQsIDB4MTZCNywKKyAgICAweDc3MjUsIDB4MTZCOSwgMHg3NzI2LCAweDE2QkEsIDB4NzcyOSwgMHgxNkI2LCAweDc3MzQsIDB4M0ExQSwgMHg3NzM2LAorICAgIDB4M0ExQiwgMHg3NzM3LCAweDE2QkMsIDB4NzczOCwgMHgxNkJELCAweDc3M0EsIDB4MEJDQiwgMHg3NzNDLCAweDA2MUYsCisgICAgMHg3NzQwLCAweDBCQTMsIDB4Nzc0NiwgMHgyMTdDLCAweDc3NDcsIDB4MTZCRSwgMHg3NzVBLCAweDE2QkYsIDB4Nzc1QiwKKyAgICAweDE2QzIsIDB4Nzc1QywgMHgzQTFDLCAweDc3NUYsIDB4M0ExRCwgMHg3NzYwLCAweDNBMUUsIDB4Nzc2MSwgMHgwQTJELAorICAgIDB4Nzc2MiwgMHgxRUM1LCAweDc3NjMsIDB4MEM5QywgMHg3NzY1LCAweDE2QzMsIDB4Nzc2NiwgMHgwRTgxLCAweDc3NjgsCisgICAgMHgxNkMwLCAweDc3NkEsIDB4Mzc1NSwgMHg3NzZCLCAweDE2QzEsIDB4Nzc3MiwgMHgzQTFGLCAweDc3NzksIDB4MTZDNiwKKyAgICAweDc3N0QsIDB4M0EyMCwgMHg3NzdFLCAweDE2QzUsIDB4Nzc3RiwgMHgxNkM0LCAweDc3OEIsIDB4MTZDOCwgMHg3NzhFLAorICAgIDB4MTZDNywgMHg3NzkxLCAweDE2QzksIDB4Nzc5NSwgMHgzQTIxLCAweDc3OUUsIDB4MTZDQiwgMHg3N0EwLCAweDE2Q0EsCisgICAgMHg3N0E1LCAweDBFMUQsIDB4NzdBOSwgMHgzNzU2LCAweDc3QUEsIDB4M0EyMiwgMHg3N0FDLCAweDA5NjAsIDB4NzdBRCwKKyAgICAweDBGOEUsIDB4NzdCMCwgMHgxNkNDLCAweDc3QjMsIDB4MEM4RiwgMHg3N0I2LCAweDE2Q0QsIDB4NzdCOSwgMHgxNkNFLAorICAgIDB4NzdCQiwgMHgxNkQyLCAweDc3QkMsIDB4MTZEMCwgMHg3N0JELCAweDE2RDEsIDB4NzdCRiwgMHgxNkNGLCAweDc3QzcsCisgICAgMHgxNkQzLCAweDc3Q0QsIDB4MTZENCwgMHg3N0Q3LCAweDE2RDUsIDB4NzdEQSwgMHgxNkQ2LCAweDc3REIsIDB4MEVDMywKKyAgICAweDc3REMsIDB4MTZENywgMHg3N0UyLCAweDBFRkMsIDB4NzdFMywgMHgxNkQ4LCAweDc3RTUsIDB4MEI4QywgMHg3N0U2LAorICAgIDB4M0EyMywgMHg3N0U3LCAweDBEMjAsIDB4NzdFOSwgMHgwNkUzLCAweDc3RUQsIDB4MEI3OSwgMHg3N0VFLCAweDE2RDksCisgICAgMHg3N0VGLCAweDA2QjIsIDB4NzdGMCwgMHgzQTI0LCAweDc3RjMsIDB4MEE3NCwgMHg3N0Y0LCAweDNBMjUsIDB4NzdGQywKKyAgICAweDE2REEsIDB4NzgwMiwgMHgwODJELCAweDc4MDYsIDB4M0EyNiwgMHg3ODBDLCAweDE2REIsIDB4NzgxMiwgMHgxNkRDLAorICAgIDB4NzgxNCwgMHgwNzVBLCAweDc4MTUsIDB4MDg0NSwgMHg3ODIwLCAweDE2REUsIDB4NzgyMSwgMHgyMTdFLCAweDc4MjIsCisgICAgMHgzQTI3LCAweDc4MjUsIDB4MEM1MCwgMHg3ODI2LCAweDA4NDYsIDB4NzgyNywgMHgwNjY4LCAweDc4MkQsIDB4M0EyOCwKKyAgICAweDc4MkUsIDB4M0EyOSwgMHg3ODMwLCAweDNBMkEsIDB4NzgzMiwgMHgwRTUyLCAweDc4MzQsIDB4MEQwMSwgMHg3ODM1LAorICAgIDB4M0EyQiwgMHg3ODNBLCAweDBDNTEsIDB4NzgzRiwgMHgwN0VFLCAweDc4NDUsIDB4MTZFMCwgMHg3ODRFLCAweDIxN0YsCisgICAgMHg3ODRGLCAweDM0MUUsIDB4Nzg1MSwgMHgzQzNDLCAweDc4NUQsIDB4MDlCMywgMHg3ODY0LCAweDIxODAsIDB4Nzg2OCwKKyAgICAweDNBMkMsIDB4Nzg2QiwgMHgwRjdBLCAweDc4NkMsIDB4MDdENywgMHg3ODZGLCAweDA3NUIsIDB4Nzg3MiwgMHgwRDM3LAorICAgIDB4Nzg3NCwgMHgxNkUyLCAweDc4N0EsIDB4MjE4MSwgMHg3ODdDLCAweDE2RTQsIDB4Nzg4MSwgMHgwNzlGLCAweDc4ODYsCisgICAgMHgxNkUzLCAweDc4ODcsIDB4MEMxMiwgMHg3ODhDLCAweDE2RTYsIDB4Nzg4RCwgMHgwNTk1LCAweDc4OEUsIDB4MTZFMSwKKyAgICAweDc4OTEsIDB4MEQ3RSwgMHg3ODkzLCAweDA0RDIsIDB4Nzg5NSwgMHgwODVDLCAweDc4OTcsIDB4MEZGOCwgMHg3ODlBLAorICAgIDB4MTZFNSwgMHg3ODlFLCAweDNBMkQsIDB4NzhBMywgMHgxNkU3LCAweDc4QTcsIDB4MEUxQiwgMHg3OEE5LCAweDBBN0QsCisgICAgMHg3OEFBLCAweDE2RTksIDB4NzhBRiwgMHgxNkVBLCAweDc4QjUsIDB4MTZFOCwgMHg3OEJBLCAweDA1QUMsIDB4NzhCQywKKyAgICAweDE2RjAsIDB4NzhCRSwgMHgxNkVGLCAweDc4QzEsIDB4MDhEMywgMHg3OEM1LCAweDE2RjEsIDB4NzhDNiwgMHgxNkVDLAorICAgIDB4NzhDOCwgMHgzQTJFLCAweDc4Q0EsIDB4MTZGMiwgMHg3OENCLCAweDE2RUQsIDB4NzhDQywgMHgzQTJGLCAweDc4Q0UsCisgICAgMHgzQTMwLCAweDc4RDAsIDB4MEQ2QywgMHg3OEQxLCAweDE2RUIsIDB4NzhENCwgMHgxNkVFLCAweDc4REEsIDB4MTZGNSwKKyAgICAweDc4RTAsIDB4M0EzMiwgMHg3OEUxLCAweDNBMzMsIDB4NzhFNCwgMHgzQTMxLCAweDc4RTcsIDB4MTZGNCwgMHg3OEU4LAorICAgIDB4MEU4RiwgMHg3OEVDLCAweDE2RjMsIDB4NzhFRiwgMHgwNEFGLCAweDc4RjIsIDB4M0EzNCwgMHg3OEY0LCAweDE2RjcsCisgICAgMHg3OEY3LCAweDNBMzUsIDB4NzhGQiwgMHgzQTM2LCAweDc4RkQsIDB4MTZGNiwgMHg3OTAxLCAweDA5QjQsIDB4NzkwNywKKyAgICAweDE2RjgsIDB4NzkwRSwgMHgwQUM1LCAweDc5MTEsIDB4MTZGQSwgMHg3OTEyLCAweDE2RjksIDB4NzkxOSwgMHgxNkZCLAorICAgIDB4NzkyNiwgMHgxNkRELCAweDc5MkEsIDB4MTZERiwgMHg3OTJCLCAweDE2RkQsIDB4NzkyQywgMHgxNkZDLCAweDc5MzAsCisgICAgMHgyMTgyLCAweDc5MzEsIDB4M0EzNywgMHg3OTM0LCAweDNBMzgsIDB4NzkzQSwgMHgwOEQ0LCAweDc5M0IsIDB4M0EzOSwKKyAgICAweDc5M0MsIDB4MEZCMSwgMHg3OTNELCAweDNBM0EsIDB4NzkzRSwgMHgwOEZFLCAweDc5NDAsIDB4MTZGRSwgMHg3OTQxLAorICAgIDB4MDcwRCwgMHg3OTQ1LCAweDNBM0IsIDB4Nzk0NywgMHgwNjVBLCAweDc5NDgsIDB4MDY0MSwgMHg3OTQ5LCAweDA4QjEsCisgICAgMHg3OTUwLCAweDBGMUUsIDB4Nzk1MywgMHgxNzA0LCAweDc5NTUsIDB4MTcwMywgMHg3OTU2LCAweDBBQzYsIDB4Nzk1NywKKyAgICAweDE3MDAsIDB4Nzk1QSwgMHgxNzAyLCAweDc5NUIsIDB4M0EzQywgMHg3OTVDLCAweDNBM0QsIDB4Nzk1RCwgMHgwOTU1LAorICAgIDB4Nzk1RSwgMHgwQTA2LCAweDc5NUYsIDB4MTcwMSwgMHg3OTYwLCAweDE2RkYsIDB4Nzk2MiwgMHgwQ0UwLCAweDc5NjUsCisgICAgMHgwOUI1LCAweDc5NjgsIDB4MERBRSwgMHg3OTZELCAweDA4NDcsIDB4Nzk3NywgMHgwQzcyLCAweDc5N0EsIDB4MTcwNSwKKyAgICAweDc5N0YsIDB4MTcwNiwgMHg3OTgwLCAweDE3MUMsIDB4Nzk4MSwgMHgwNkQwLCAweDc5ODQsIDB4MEZFMywgMHg3OTg1LAorICAgIDB4MEFCNywgMHg3OThBLCAweDE3MDcsIDB4Nzk4QiwgMHgzQTNFLCAweDc5OEQsIDB4MDU1MiwgMHg3OThFLCAweDBDMTMsCisgICAgMHg3OThGLCAweDBERjEsIDB4Nzk5NCwgMHgyMTg2LCAweDc5OTYsIDB4M0EzRiwgMHg3OTk4LCAweDNBNDAsIDB4Nzk5QiwKKyAgICAweDIxODgsIDB4Nzk5RCwgMHgxNzA4LCAweDc5QTYsIDB4MDY5NCwgMHg3OUE3LCAweDE3MDksIDB4NzlBQSwgMHgxNzBCLAorICAgIDB4NzlBRSwgMHgxNzBDLCAweDc5QjAsIDB4MENERiwgMHg3OUIxLCAweDFFNEUsIDB4NzlCMywgMHgxNzBELCAweDc5QjgsCisgICAgMHgzQTQxLCAweDc5QjksIDB4MTcwRSwgMHg3OUJBLCAweDE3MEYsIDB4NzlCQiwgMHgzQTQyLCAweDc5QkQsIDB4MDZEMSwKKyAgICAweDc5QkUsIDB4MDU1MywgMHg3OUJGLCAweDBDOUQsIDB4NzlDMCwgMHgwOTMyLCAweDc5QzEsIDB4MDhCMiwgMHg3OUM5LAorICAgIDB4MTcxMCwgMHg3OUNBLCAweDNBNDMsIDB4NzlDQiwgMHgwOTMzLCAweDc5RDEsIDB4MDU0QSwgMHg3OUQyLCAweDBEQjUsCisgICAgMHg3OUQ1LCAweDE3MTEsIDB4NzlEOCwgMHgwRDdGLCAweDc5REEsIDB4M0E0NCwgMHg3OURGLCAweDBBQzcsIDB4NzlFMSwKKyAgICAweDE3MTQsIDB4NzlFMywgMHgxNzE1LCAweDc5RTQsIDB4MEQxRiwgMHg3OUU2LCAweDBBMDcsIDB4NzlFNywgMHgxNzEyLAorICAgIDB4NzlFOSwgMHgwQjlGLCAweDc5RUMsIDB4MTcxMywgMHg3OUYwLCAweDA5QjYsIDB4NzlGQiwgMHgwNEEwLCAweDdBMDAsCisgICAgMHgwNjQzLCAweDdBMDMsIDB4M0E0NSwgMHg3QTA1LCAweDM2MzMsIDB4N0EwOCwgMHgxNzE2LCAweDdBMDksIDB4M0E0NiwKKyAgICAweDdBMEIsIDB4MEMxNCwgMHg3QTBELCAweDE3MTcsIDB4N0EwRSwgMHgwQTZCLCAweDdBMTEsIDB4M0E0NywgMHg3QTE0LAorICAgIDB4MEVCOSwgMHg3QTE3LCAweDBEOTUsIDB4N0ExOCwgMHgxNzE4LCAweDdBMTksIDB4MTcxOSwgMHg3QTFBLCAweDBCOTMsCisgICAgMHg3QTFDLCAweDBGOEYsIDB4N0ExRSwgMHgzQTQ4LCAweDdBMUYsIDB4MTcxQiwgMHg3QTIwLCAweDE3MUEsIDB4N0EyRCwKKyAgICAweDNBNDksIDB4N0EyRSwgMHgwOTFCLCAweDdBMzEsIDB4MTcxRCwgMHg3QTMyLCAweDA0QjQsIDB4N0EzNywgMHgxNzIwLAorICAgIDB4N0EzOSwgMHgzQTRBLCAweDdBM0IsIDB4MTcxRSwgMHg3QTNDLCAweDA1NTQsIDB4N0EzRCwgMHgwNzI0LCAweDdBM0UsCisgICAgMHgxNzFGLCAweDdBM0YsIDB4MDdEOCwgMHg3QTQwLCAweDA4MDQsIDB4N0E0MiwgMHgwRTM2LCAweDdBNDMsIDB4MTcyMSwKKyAgICAweDdBNDUsIDB4M0E0QiwgMHg3QTQ2LCAweDBFODIsIDB4N0E0OSwgMHgxNzIzLCAweDdBNEMsIDB4M0E0QywgMHg3QTRELAorICAgIDB4MEE3NSwgMHg3QTRFLCAweDA0RjEsIDB4N0E0RiwgMHgwNTNBLCAweDdBNTAsIDB4MDQ3MCwgMHg3QTU3LCAweDE3MjIsCisgICAgMHg3QTVELCAweDNBNEQsIDB4N0E2MCwgMHgzQTRFLCAweDdBNjEsIDB4MTcyNCwgMHg3QTYyLCAweDE3MjUsIDB4N0E2MywKKyAgICAweDA5REYsIDB4N0E2OSwgMHgxNzI2LCAweDdBNkIsIDB4MDVBRCwgMHg3QTZELCAweDNBNEYsIDB4N0E3MCwgMHgxNzI4LAorICAgIDB4N0E3NCwgMHgwNzQwLCAweDdBNzYsIDB4MDY4MCwgMHg3QTc4LCAweDNBNTAsIDB4N0E3OSwgMHgxNzI5LCAweDdBN0EsCisgICAgMHgwNkVELCAweDdBN0QsIDB4MTcyQSwgMHg3QTdGLCAweDBBQTAsIDB4N0E4MSwgMHgwQ0E1LCAweDdBODMsIDB4MEE4NCwKKyAgICAweDdBODQsIDB4MDg2NSwgMHg3QTg4LCAweDE3MkIsIDB4N0E5MiwgMHgwQkEwLCAweDdBOTMsIDB4MEFFRCwgMHg3QTk1LAorICAgIDB4MTcyRCwgMHg3QTk2LCAweDE3MkYsIDB4N0E5NywgMHgxNzJDLCAweDdBOTgsIDB4MTcyRSwgMHg3QTlGLCAweDA2RjgsCisgICAgMHg3QUEwLCAweDNBNTEsIDB4N0FBMywgMHgzQTUyLCAweDdBQTksIDB4MTczMCwgMHg3QUFBLCAweDA2RkMsIDB4N0FBRSwKKyAgICAweDA2ODEsIDB4N0FBRiwgMHgwRjNDLCAweDdBQjAsIDB4MTczMiwgMHg3QUIzLCAweDNBNTMsIDB4N0FCNiwgMHgxNzMzLAorICAgIDB4N0FCQSwgMHgwNEQwLCAweDdBQkIsIDB4M0E1NCwgMHg3QUJDLCAweDNBNTUsIDB4N0FCRiwgMHgxNzM2LCAweDdBQzMsCisgICAgMHgwNUQ0LCAweDdBQzQsIDB4MTczNSwgMHg3QUM1LCAweDE3MzQsIDB4N0FDNiwgMHgzQTU2LCAweDdBQzcsIDB4MTczOCwKKyAgICAweDdBQzgsIDB4MTczMSwgMHg3QUNBLCAweDE3MzksIDB4N0FDQiwgMHgwRjcxLCAweDdBQ0QsIDB4MTczQSwgMHg3QUNGLAorICAgIDB4MTczQiwgMHg3QUQxLCAweDIxODksIDB4N0FEMiwgMHgxMUM1LCAweDdBRDMsIDB4MTczRCwgMHg3QUQ1LCAweDE3M0MsCisgICAgMHg3QUQ5LCAweDE3M0UsIDB4N0FEQSwgMHgxNzNGLCAweDdBREMsIDB4MEY3RCwgMHg3QURELCAweDE3NDAsIDB4N0FERiwKKyAgICAweDFDMDgsIDB4N0FFMCwgMHgwOUI3LCAweDdBRTEsIDB4MTc0MSwgMHg3QUUyLCAweDE3NDIsIDB4N0FFMywgMHgwOTYxLAorICAgIDB4N0FFNSwgMHgwQzkwLCAweDdBRTYsIDB4MTc0MywgMHg3QUU3LCAweDIxOEEsIDB4N0FFQSwgMHgwQjY2LCAweDdBRUIsCisgICAgMHgyMThDLCAweDdBRUQsIDB4MTc0NCwgMHg3QUVGLCAweDBCN0EsIDB4N0FGMCwgMHgxNzQ1LCAweDdBRjYsIDB4MDY5RCwKKyAgICAweDdBRjgsIDB4MTA3NiwgMHg3QUY5LCAweDBCOUIsIDB4N0FGQSwgMHgwOERGLCAweDdBRkYsIDB4MDYwNCwgMHg3QjAyLAorICAgIDB4MTc0NiwgMHg3QjA0LCAweDE3NTMsIDB4N0IwNiwgMHgxNzQ5LCAweDdCMDcsIDB4M0E1NywgMHg3QjA4LCAweDA2ODIsCisgICAgMHg3QjBBLCAweDE3NDgsIDB4N0IwQiwgMHgxNzU1LCAweDdCMEYsIDB4MTc0NywgMHg3QjExLCAweDA5QjgsIDB4N0IxNCwKKyAgICAweDNBNTgsIDB4N0IxOCwgMHgxNzRCLCAweDdCMTksIDB4MTc0QywgMHg3QjFCLCAweDBDMjUsIDB4N0IxRSwgMHgxNzRELAorICAgIDB4N0IyMCwgMHgwNUJDLCAweDdCMjUsIDB4MEEyMCwgMHg3QjI2LCAweDBERDYsIDB4N0IyNywgMHgzQTU5LCAweDdCMjgsCisgICAgMHgxNzRGLCAweDdCMkMsIDB4MEI0OCwgMHg3QjMxLCAweDNBNUEsIDB4N0IzMywgMHgxNzRBLCAweDdCMzUsIDB4MTc0RSwKKyAgICAweDdCMzYsIDB4MTc1MCwgMHg3QjM5LCAweDA4NkIsIDB4N0I0NSwgMHgxNzU3LCAweDdCNDYsIDB4MERBMCwgMHg3QjQ3LAorICAgIDB4M0E1QiwgMHg3QjQ4LCAweDBEM0EsIDB4N0I0OSwgMHgwQzczLCAweDdCNEIsIDB4MDZEMiwgMHg3QjRDLCAweDE3NTYsCisgICAgMHg3QjRELCAweDE3NTQsIDB4N0I0RSwgMHgzQTVDLCAweDdCNEYsIDB4MEQ0OSwgMHg3QjUwLCAweDE3NTEsIDB4N0I1MSwKKyAgICAweDBCOUMsIDB4N0I1MiwgMHgwQzc1LCAweDdCNTMsIDB4Mzc1RCwgMHg3QjU0LCAweDBDNzQsIDB4N0I1NiwgMHgwODY2LAorICAgIDB4N0I1RCwgMHgxNzY5LCAweDdCNjAsIDB4M0E1RCwgMHg3QjY1LCAweDE3NTksIDB4N0I2NywgMHgxNzVCLCAweDdCNjksCisgICAgMHgzQTVFLCAweDdCNkMsIDB4MTc1RSwgMHg3QjZELCAweDNBNUYsIDB4N0I2RSwgMHgxNzVGLCAweDdCNzAsIDB4MTc1QywKKyAgICAweDdCNzEsIDB4MTc1RCwgMHg3QjcyLCAweDNBNjAsIDB4N0I3NCwgMHgxNzVBLCAweDdCNzUsIDB4MTc1OCwgMHg3QjdBLAorICAgIDB4MTc1MiwgMHg3Qjg2LCAweDBFMUYsIDB4N0I4NywgMHgwNTU1LCAweDdCOEIsIDB4MTc2NiwgMHg3QjhELCAweDE3NjMsCisgICAgMHg3QjhGLCAweDE3NjgsIDB4N0I5MSwgMHgzQTYxLCAweDdCOTIsIDB4MTc2NywgMHg3Qjk0LCAweDBEMjksIDB4N0I5NSwKKyAgICAweDBFQjMsIDB4N0I5NywgMHgwODg5LCAweDdCOTgsIDB4MTc2MSwgMHg3Qjk5LCAweDE3NkEsIDB4N0I5QSwgMHgxNzY1LAorICAgIDB4N0I5QywgMHgxNzY0LCAweDdCOUQsIDB4MTc2MCwgMHg3QjlFLCAweDIxOEQsIDB4N0I5RiwgMHgxNzYyLCAweDdCQTEsCisgICAgMHgwNjA1LCAweDdCQUEsIDB4MEI3QiwgMHg3QkFELCAweDBBQTEsIDB4N0JBRiwgMHgzQTYyLCAweDdCQjEsIDB4MEQzNiwKKyAgICAweDdCQjQsIDB4MTc2RiwgMHg3QkI4LCAweDBEMzgsIDB4N0JDMCwgMHgwQTg1LCAweDdCQzEsIDB4MTc2QywgMHg3QkM0LAorICAgIDB4MEQ2MywgMHg3QkM2LCAweDE3NzAsIDB4N0JDNywgMHgwRTIzLCAweDdCQzksIDB4MEI5OSwgMHg3QkNCLCAweDE3NkIsCisgICAgMHg3QkNDLCAweDE3NkQsIDB4N0JDRiwgMHgxNzZFLCAweDdCRDcsIDB4M0E2MywgMHg3QkQ5LCAweDNBNjQsIDB4N0JERCwKKyAgICAweDE3NzEsIDB4N0JFMCwgMHgwOEYwLCAweDdCRTQsIDB4MEM5RSwgMHg3QkU1LCAweDE3NzYsIDB4N0JFNiwgMHgxNzc1LAorICAgIDB4N0JFOSwgMHgxNzcyLCAweDdCRUQsIDB4MEZEQywgMHg3QkYzLCAweDE3N0IsIDB4N0JGNiwgMHgxNzdGLCAweDdCRjcsCisgICAgMHgxNzdDLCAweDdDMDAsIDB4MTc3OCwgMHg3QzA3LCAweDE3NzksIDB4N0MwQiwgMHgzQTY1LCAweDdDMEQsIDB4MTc3RSwKKyAgICAweDdDMEYsIDB4M0E2NiwgMHg3QzExLCAweDE3NzMsIDB4N0MxMiwgMHgxMEVBLCAweDdDMTMsIDB4MTc3QSwgMHg3QzE0LAorICAgIDB4MTc3NCwgMHg3QzE3LCAweDE3N0QsIDB4N0MxRSwgMHgxRTNCLCAweDdDMUYsIDB4MTc4MywgMHg3QzIwLCAweDNBNjcsCisgICAgMHg3QzIxLCAweDA2MDYsIDB4N0MyMywgMHgxNzgwLCAweDdDMjYsIDB4M0E2OCwgMHg3QzI3LCAweDE3ODEsIDB4N0MyQSwKKyAgICAweDE3ODIsIDB4N0MyQiwgMHgxNzg1LCAweDdDMzEsIDB4M0E2OSwgMHg3QzM2LCAweDNBNkEsIDB4N0MzNywgMHgxNzg0LAorICAgIDB4N0MzOCwgMHgwRDhBLCAweDdDM0QsIDB4MTc4NiwgMHg3QzNFLCAweDBGQzQsIDB4N0MzRiwgMHgwRTNELCAweDdDNDAsCisgICAgMHgxNzhCLCAweDdDNDMsIDB4MTc4OCwgMHg3QzRDLCAweDE3ODcsIDB4N0M0RCwgMHgwQTc2LCAweDdDNEYsIDB4MTc4QSwKKyAgICAweDdDNTAsIDB4MTc4QywgMHg3QzUxLCAweDNBNkIsIDB4N0M1NCwgMHgxNzg5LCAweDdDNTYsIDB4MTc5MCwgMHg3QzU4LAorICAgIDB4MTc4RCwgMHg3QzU5LCAweDNBNkMsIDB4N0M1RiwgMHgxNzhFLCAweDdDNjAsIDB4MTc3NywgMHg3QzY0LCAweDE3OEYsCisgICAgMHg3QzY1LCAweDE3OTEsIDB4N0M2NywgMHgzQTZELCAweDdDNkMsIDB4MTc5MiwgMHg3QzZFLCAweDNBNkUsIDB4N0M3MCwKKyAgICAweDNBNkYsIDB4N0M3MywgMHgwRTE2LCAweDdDNzUsIDB4MTc5MywgMHg3QzdCLCAweDM3MEUsIDB4N0M3RSwgMHgwRUVFLAorICAgIDB4N0M4MSwgMHgwNkM2LCAweDdDODIsIDB4MDZGRiwgMHg3QzgzLCAweDE3OTQsIDB4N0M4OSwgMHgwRTA0LCAweDdDOEIsCisgICAgMHgwQTJFLCAweDdDOEQsIDB4MEVCQywgMHg3QzkwLCAweDE3OTUsIDB4N0M5MiwgMHgwRjdCLCAweDdDOTUsIDB4MEQyQSwKKyAgICAweDdDOTcsIDB4MEFDOCwgMHg3Qzk4LCAweDBDRUEsIDB4N0M5QiwgMHgwOTU3LCAweDdDOUYsIDB4MDQ4NCwgMHg3Q0ExLAorICAgIDB4MTc5QSwgMHg3Q0EyLCAweDE3OTgsIDB4N0NBNCwgMHgxNzk2LCAweDdDQTUsIDB4MDVERCwgMHg3Q0E3LCAweDA5QjksCisgICAgMHg3Q0E4LCAweDE3OUIsIDB4N0NBQiwgMHgxNzk5LCAweDdDQUQsIDB4MTc5NywgMHg3Q0FFLCAweDE3OUYsIDB4N0NCMSwKKyAgICAweDE3OUUsIDB4N0NCMiwgMHgxNzlELCAweDdDQjMsIDB4MTc5QywgMHg3Q0I5LCAweDE3QTAsIDB4N0NCQywgMHgzQTcwLAorICAgIDB4N0NCRCwgMHgxN0ExLCAweDdDQkUsIDB4MEE1RSwgMHg3Q0JGLCAweDNBNzEsIDB4N0NDMCwgMHgxN0EyLCAweDdDQzIsCisgICAgMHgxN0E0LCAweDdDQzUsIDB4MTdBMywgMHg3Q0M4LCAweDNBNzIsIDB4N0NDOSwgMHgzQTczLCAweDdDQ0EsIDB4MDc4NiwKKyAgICAweDdDQ0UsIDB4MEFCQSwgMHg3Q0QyLCAweDE3QTYsIDB4N0NENiwgMHgwQzc2LCAweDdDRDcsIDB4M0E3NCwgMHg3Q0Q4LAorICAgIDB4MTdBNSwgMHg3Q0Q5LCAweDNBNzUsIDB4N0NEQywgMHgxN0E3LCAweDdDREQsIDB4M0E3NiwgMHg3Q0RFLCAweDBFMDUsCisgICAgMHg3Q0RGLCAweDBBRUUsIDB4N0NFMCwgMHgwN0Q5LCAweDdDRTIsIDB4MTdBOCwgMHg3Q0U3LCAweDBGOTAsIDB4N0NFQiwKKyAgICAweDNBNzcsIDB4N0NFRiwgMHgxN0FBLCAweDdDRjIsIDB4MTdBQiwgMHg3Q0Y0LCAweDE3QUMsIDB4N0NGNiwgMHgxN0FELAorICAgIDB4N0NGOCwgMHgwOEIzLCAweDdDRkEsIDB4MTdBRSwgMHg3Q0ZCLCAweDA3MjUsIDB4N0NGRSwgMHgwNjg0LCAweDdEMDAsCisgICAgMHgwNjQ0LCAweDdEMDIsIDB4MTdCMCwgMHg3RDA0LCAweDBFRkYsIDB4N0QwNSwgMHgwN0RBLCAweDdEMDYsIDB4MTdBRiwKKyAgICAweDdEMDcsIDB4M0E3OCwgMHg3RDA4LCAweDNBNzksIDB4N0QwOSwgMHgzQTdBLCAweDdEMEEsIDB4MTdCMywgMHg3RDBCLAorICAgIDB4MEVGMiwgMHg3RDBELCAweDBDRjIsIDB4N0QxMCwgMHgwREE1LCAweDdEMTMsIDB4M0E3QiwgMHg3RDE0LCAweDA5NkQsCisgICAgMHg3RDE1LCAweDE3QjIsIDB4N0QxNywgMHgwOEZGLCAweDdEMTgsIDB4MDdEQiwgMHg3RDE5LCAweDA4QjQsIDB4N0QxQSwKKyAgICAweDA2ODMsIDB4N0QxQiwgMHgwRTA2LCAweDdEMUMsIDB4MTdCMSwgMHg3RDFELCAweDNBN0MsIDB4N0QyMCwgMHgwQUM5LAorICAgIDB4N0QyMSwgMHgwRTcwLCAweDdEMjIsIDB4MDg2NywgMHg3RDIzLCAweDNBN0QsIDB4N0QyQiwgMHgwOEI1LCAweDdEMkMsCisgICAgMHgwQkY5LCAweDdEMkUsIDB4MTdCNiwgMHg3RDJGLCAweDBGQTcsIDB4N0QzMCwgMHgwODQ5LCAweDdEMzIsIDB4MTdCNywKKyAgICAweDdEMzMsIDB4MEEwOCwgMHg3RDM1LCAweDE3QjksIDB4N0QzOSwgMHgwOUJBLCAweDdEM0EsIDB4MDgyMCwgMHg3RDNGLAorICAgIDB4MTdCOCwgMHg3RDQxLCAweDNBN0UsIDB4N0Q0MiwgMHgwOTM0LCAweDdENDMsIDB4MDc3MiwgMHg3RDQ0LCAweDBBQ0EsCisgICAgMHg3RDQ1LCAweDE3QjQsIDB4N0Q0NiwgMHgxN0JBLCAweDdENDgsIDB4MjE4RiwgMHg3RDRCLCAweDE3QjUsIDB4N0Q0QywKKyAgICAweDA3MjYsIDB4N0Q0RSwgMHgxN0JELCAweDdENEYsIDB4MTdDMSwgMHg3RDUwLCAweDA3NDEsIDB4N0Q1MywgMHgzQTdGLAorICAgIDB4N0Q1NiwgMHgxN0JDLCAweDdENTksIDB4M0E4MCwgMHg3RDVCLCAweDE3QzUsIDB4N0Q1QywgMHgyMTkwLCAweDdENUQsCisgICAgMHgzQTgxLCAweDdENUUsIDB4MDdEQywgMHg3RDYxLCAweDBGNTcsIDB4N0Q2MiwgMHgwNDgwLCAweDdENjMsIDB4MTdDMiwKKyAgICAweDdENjYsIDB4MDY4NSwgMHg3RDY4LCAweDE3QkYsIDB4N0Q2RSwgMHgxN0MwLCAweDdENzEsIDB4MEM3NywgMHg3RDcyLAorICAgIDB4MTdCRSwgMHg3RDczLCAweDE3QkIsIDB4N0Q3NSwgMHgwNTg2LCAweDdENzYsIDB4MEE4OCwgMHg3RDc5LCAweDA3NUMsCisgICAgMHg3RDdBLCAweDNBODIsIDB4N0Q3RCwgMHgxN0M3LCAweDdEODYsIDB4M0E4MywgMHg3RDg5LCAweDE3QzQsIDB4N0Q4QiwKKyAgICAweDNBODQsIDB4N0Q4QywgMHgzQTg1LCAweDdEOEYsIDB4MTdDNiwgMHg3RDkzLCAweDE3QzMsIDB4N0Q5OSwgMHgwNzI3LAorICAgIDB4N0Q5QSwgMHgwQjEzLCAweDdEOUIsIDB4MTdDOCwgMHg3RDlDLCAweDBBRjAsIDB4N0Q5RiwgMHgxN0Q1LCAweDdEQTAsCisgICAgMHgyMTkyLCAweDdEQTIsIDB4MTdEMSwgMHg3REEzLCAweDE3Q0IsIDB4N0RBQiwgMHgxN0NGLCAweDdEQUMsIDB4MDkyNiwKKyAgICAweDdEQUQsIDB4MDRBMSwgMHg3REFFLCAweDE3Q0EsIDB4N0RBRiwgMHgxN0QyLCAweDdEQjAsIDB4MTdENiwgMHg3REIxLAorICAgIDB4MDdERCwgMHg3REIyLCAweDBFRTIsIDB4N0RCNCwgMHgwQkYyLCAweDdEQjUsIDB4MTdDQywgMHg3REI3LCAweDIxOTEsCisgICAgMHg3REI4LCAweDE3RDQsIDB4N0RCQSwgMHgxN0M5LCAweDdEQkIsIDB4MEI3QywgMHg3REJELCAweDE3Q0UsIDB4N0RCRSwKKyAgICAweDA0ODEsIDB4N0RCRiwgMHgwRUQ2LCAweDdEQzcsIDB4MTdDRCwgMHg3RENBLCAweDA2RDMsIDB4N0RDQiwgMHgwRDgwLAorICAgIDB4N0RDQywgMHgzQTg2LCAweDdEQ0YsIDB4MEFFRiwgMHg3REQxLCAweDBGOTgsIDB4N0REMiwgMHgwOTc5LCAweDdERDUsCisgICAgMHgxN0ZELCAweDdERDYsIDB4MjE5MywgMHg3REQ4LCAweDE3RDcsIDB4N0REQSwgMHgwQUEyLCAweDdEREMsIDB4MTdEMywKKyAgICAweDdEREQsIDB4MTdEOCwgMHg3RERFLCAweDE3REEsIDB4N0RFMCwgMHgwQzE1LCAweDdERTEsIDB4MTdERCwgMHg3REUzLAorICAgIDB4MzQwQSwgMHg3REU0LCAweDE3RDksIDB4N0RFOCwgMHgwRTI0LCAweDdERTksIDB4MDYwNywgMHg3REVCLCAweDNBODcsCisgICAgMHg3REVDLCAweDBFRDcsIDB4N0RFRiwgMHgwNEEyLCAweDdERjEsIDB4M0E4OCwgMHg3REYyLCAweDE3REMsIDB4N0RGNCwKKyAgICAweDBGQzUsIDB4N0RGOSwgMHgzQTg5LCAweDdERkIsIDB4MTdEQiwgMHg3RTAxLCAweDA1MTEsIDB4N0UwNCwgMHgwQ0M0LAorICAgIDB4N0UwNSwgMHgxN0RFLCAweDdFMDgsIDB4M0E4QSwgMHg3RTA5LCAweDE3RTUsIDB4N0UwQSwgMHgxN0RGLCAweDdFMEIsCisgICAgMHgxN0U2LCAweDdFMTEsIDB4M0E4QiwgMHg3RTEyLCAweDE3RTIsIDB4N0UxNSwgMHgzQThDLCAweDdFMUIsIDB4MEQzMSwKKyAgICAweDdFMUUsIDB4MDhGNiwgMHg3RTFGLCAweDE3RTQsIDB4N0UyMCwgMHgzQThELCAweDdFMjEsIDB4MTdFMSwgMHg3RTIyLAorICAgIDB4MTdFNywgMHg3RTIzLCAweDE3RTAsIDB4N0UyNiwgMHgwOTRFLCAweDdFMkIsIDB4MEU1MywgMHg3RTJFLCAweDA5NTYsCisgICAgMHg3RTMxLCAweDE3RTMsIDB4N0UzMiwgMHgxN0VGLCAweDdFMzUsIDB4MTdFQiwgMHg3RTM3LCAweDE3RUUsIDB4N0UzOSwKKyAgICAweDE3RUMsIDB4N0UzQSwgMHgxN0YwLCAweDdFM0IsIDB4MTdFQSwgMHg3RTNELCAweDE3RDAsIDB4N0UzRSwgMHgwQTc3LAorICAgIDB4N0U0MSwgMHgwRDVGLCAweDdFNDMsIDB4MTdFRCwgMHg3RTQ2LCAweDE3RTgsIDB4N0U0NywgMHgzQThFLCAweDdFNDgsCisgICAgMHgzNzY3LCAweDdFNEEsIDB4MEFBMywgMHg3RTRCLCAweDA3MjgsIDB4N0U0RCwgMHgwOTM1LCAweDdFNTIsIDB4MjE5NCwKKyAgICAweDdFNTQsIDB4MDlFQiwgMHg3RTU1LCAweDBBQjgsIDB4N0U1NiwgMHgxN0YzLCAweDdFNTksIDB4MTdGNSwgMHg3RTVBLAorICAgIDB4MTdGNiwgMHg3RTVELCAweDE3RjIsIDB4N0U1RSwgMHgxN0Y0LCAweDdFNjEsIDB4MUUxMSwgMHg3RTYyLCAweDNBOEYsCisgICAgMHg3RTY2LCAweDE3RTksIDB4N0U2NywgMHgxN0YxLCAweDdFNjksIDB4MTdGOSwgMHg3RTZBLCAweDE3RjgsIDB4N0U2QiwKKyAgICAweDFERjcsIDB4N0U2RCwgMHgwRUE4LCAweDdFNkUsIDB4M0E5MCwgMHg3RTcwLCAweDA3MDEsIDB4N0U3MywgMHgzQTkxLAorICAgIDB4N0U3OSwgMHgxN0Y3LCAweDdFN0IsIDB4MTdGQiwgMHg3RTdDLCAweDE3RkEsIDB4N0U3RCwgMHgxN0ZFLCAweDdFN0YsCisgICAgMHgxODAwLCAweDdFODIsIDB4MDg4QSwgMHg3RTgzLCAweDE3RkMsIDB4N0U4OCwgMHgxODAxLCAweDdFODksIDB4MTgwMiwKKyAgICAweDdFOEEsIDB4MjBBNywgMHg3RThDLCAweDE4MDMsIDB4N0U4RCwgMHgzQTkyLCAweDdFOEUsIDB4MTgwOSwgMHg3RThGLAorICAgIDB4MEMzNSwgMHg3RTkwLCAweDE4MDUsIDB4N0U5MSwgMHgzQTkzLCAweDdFOTIsIDB4MTgwNCwgMHg3RTkzLCAweDE4MDYsCisgICAgMHg3RTk0LCAweDE4MDcsIDB4N0U5NiwgMHgxODA4LCAweDdFOTgsIDB4M0E5NCwgMHg3RTlCLCAweDE4MEEsIDB4N0U5QywKKyAgICAweDE4MEIsIDB4N0YzNiwgMHgwNjA4LCAweDdGMzgsIDB4MTgwQywgMHg3RjNBLCAweDE4MEQsIDB4N0Y0NCwgMHgzQTk1LAorICAgIDB4N0Y0NSwgMHgxODBFLCAweDdGNDcsIDB4MjE5NSwgMHg3RjRDLCAweDE4MEYsIDB4N0Y0RCwgMHgxODEwLCAweDdGNEUsCisgICAgMHgxODExLCAweDdGNEYsIDB4M0E5NiwgMHg3RjUwLCAweDE4MTIsIDB4N0Y1MSwgMHgxODEzLCAweDdGNTIsIDB4M0E5NywKKyAgICAweDdGNTMsIDB4M0E5OCwgMHg3RjU0LCAweDE4MTUsIDB4N0Y1NSwgMHgxODE0LCAweDdGNTgsIDB4MTgxNiwgMHg3RjVGLAorICAgIDB4MTgxNywgMHg3RjYwLCAweDE4MTgsIDB4N0Y2MSwgMHgzQTk5LCAweDdGNjcsIDB4MTgxQiwgMHg3RjY4LCAweDE4MTksCisgICAgMHg3RjY5LCAweDE4MUEsIDB4N0Y2QSwgMHgwODUxLCAweDdGNkIsIDB4MDcyOSwgMHg3RjZFLCAweDBCOTQsIDB4N0Y3MCwKKyAgICAweDBENDcsIDB4N0Y3MiwgMHgwOTdBLCAweDdGNzUsIDB4MEQwMywgMHg3Rjc3LCAweDBEODEsIDB4N0Y3OCwgMHgxODFDLAorICAgIDB4N0Y3OSwgMHgxMzM2LCAweDdGODIsIDB4MTgxRCwgMHg3RjgzLCAweDE4MUYsIDB4N0Y4NSwgMHgwRjRGLCAweDdGODYsCisgICAgMHgxODFFLCAweDdGODcsIDB4MTgyMSwgMHg3Rjg4LCAweDE4MjAsIDB4N0Y4QSwgMHgwRjNELCAweDdGOEMsIDB4MTgyMiwKKyAgICAweDdGOEUsIDB4MEQ5MiwgMHg3RjkxLCAweDNBOUEsIDB4N0Y5NCwgMHgxODIzLCAweDdGOUEsIDB4MTgyNiwgMHg3RjlELAorICAgIDB4MTgyNSwgMHg3RjlFLCAweDE4MjQsIDB4N0ZBMSwgMHgyMTk2LCAweDdGQTMsIDB4MTgyNywgMHg3RkE0LCAweDA3MDgsCisgICAgMHg3RkE4LCAweDBBQTQsIDB4N0ZBOSwgMHgwNjVCLCAweDdGQUUsIDB4MTgyQiwgMHg3RkFGLCAweDE4MjgsIDB4N0ZCMiwKKyAgICAweDE4MjksIDB4N0ZCNiwgMHgxODJDLCAweDdGQjgsIDB4MTgyRCwgMHg3RkI5LCAweDE4MkEsIDB4N0ZCRCwgMHgwNENCLAorICAgIDB4N0ZCRiwgMHgzQTlCLCAweDdGQzEsIDB4MDUyNywgMHg3RkM1LCAweDE4MkYsIDB4N0ZDNiwgMHgxODMwLCAweDdGQ0EsCisgICAgMHgxODMxLCAweDdGQ0MsIDB4MEY0QywgMHg3RkNFLCAweDNBOUMsIDB4N0ZEMiwgMHgwOTM2LCAweDdGRDQsIDB4MTgzMywKKyAgICAweDdGRDUsIDB4MTgzMiwgMHg3RkRGLCAweDNBOUQsIDB4N0ZFMCwgMHgwQTJGLCAweDdGRTEsIDB4MTgzNCwgMHg3RkU1LAorICAgIDB4M0E5RSwgMHg3RkU2LCAweDE4MzUsIDB4N0ZFOSwgMHgxODM2LCAweDdGRUIsIDB4MDYyMSwgMHg3RkVDLCAweDNBOUYsCisgICAgMHg3RkVFLCAweDNBQTAsIDB4N0ZFRiwgMHgzQUExLCAweDdGRjAsIDB4MDYwOSwgMHg3RkYzLCAweDE4MzcsIDB4N0ZGOSwKKyAgICAweDE4MzgsIDB4N0ZGQSwgMHgzQUEyLCAweDdGRkIsIDB4MEU4QiwgMHg3RkZDLCAweDBGNEQsIDB4ODAwMCwgMHgwRjNFLAorICAgIDB4ODAwMSwgMHgwRkRELCAweDgwMDIsIDB4MzcxMywgMHg4MDAzLCAweDA3REYsIDB4ODAwNCwgMHgxODNCLCAweDgwMDUsCisgICAgMHgwOTAwLCAweDgwMDYsIDB4MTgzQSwgMHg4MDBCLCAweDE4M0MsIDB4ODAwQywgMHgwOEQ1LCAweDgwMEUsIDB4M0FBMywKKyAgICAweDgwMTAsIDB4MEIzMSwgMHg4MDExLCAweDNBQTQsIDB4ODAxMiwgMHgxODNELCAweDgwMTQsIDB4M0FBNSwgMHg4MDE1LAorICAgIDB4MDdERSwgMHg4MDE3LCAweDBFRTMsIDB4ODAxOCwgMHgxODNFLCAweDgwMTksIDB4MTgzRiwgMHg4MDFDLCAweDE4NDAsCisgICAgMHg4MDIxLCAweDE4NDEsIDB4ODAyNCwgMHgzQUE2LCAweDgwMjYsIDB4M0FBNywgMHg4MDI4LCAweDE4NDIsIDB4ODAzMywKKyAgICAweDA4RDYsIDB4ODAzNiwgMHgwRUY5LCAweDgwM0EsIDB4M0FBOCwgMHg4MDNCLCAweDE4NDQsIDB4ODAzQywgMHgzQUE5LAorICAgIDB4ODAzRCwgMHgwQjdELCAweDgwM0YsIDB4MTg0MywgMHg4MDQ2LCAweDE4NDYsIDB4ODA0QSwgMHgxODQ1LCAweDgwNTIsCisgICAgMHgxODQ3LCAweDgwNTYsIDB4MEE1RiwgMHg4MDU4LCAweDE4NDgsIDB4ODA1QSwgMHgxODQ5LCAweDgwNUUsIDB4MEUwOSwKKyAgICAweDgwNUYsIDB4MTg0QSwgMHg4MDYwLCAweDNBQUEsIDB4ODA2MSwgMHgwQUYxLCAweDgwNjIsIDB4MTg0QiwgMHg4MDY4LAorICAgIDB4MTg0QywgMHg4MDZGLCAweDBGQzYsIDB4ODA3MCwgMHgxODRGLCAweDgwNzEsIDB4M0FBQiwgMHg4MDcyLCAweDE4NEUsCisgICAgMHg4MDczLCAweDE4NEQsIDB4ODA3NCwgMHgwQkNDLCAweDgwNzUsIDB4M0FBQywgMHg4MDc2LCAweDE4NTAsIDB4ODA3NywKKyAgICAweDA5RUMsIDB4ODA3OSwgMHgxODUxLCAweDgwN0QsIDB4MTg1MiwgMHg4MDdFLCAweDBGREUsIDB4ODA3RiwgMHgxODUzLAorICAgIDB4ODA4NCwgMHgxODU0LCAweDgwODUsIDB4MTg1NiwgMHg4MDg2LCAweDE4NTUsIDB4ODA4NywgMHgwRDM5LCAweDgwODksCisgICAgMHgwQ0QxLCAweDgwOEIsIDB4MEZFNCwgMHg4MDhDLCAweDBEM0QsIDB4ODA5MywgMHgxODU4LCAweDgwOTYsIDB4MDlCQiwKKyAgICAweDgwOTgsIDB4MEQ5QywgMHg4MDlBLCAweDE4NTksIDB4ODA5QiwgMHgxODU3LCAweDgwOUQsIDB4MDYwQSwgMHg4MDlFLAorICAgIDB4M0FBRCwgMHg4MEExLCAweDA3ODgsIDB4ODBBMiwgMHgwOEI2LCAweDgwQTUsIDB4MEQ4MiwgMHg4MEE2LCAweDNBQUUsCisgICAgMHg4MEE5LCAweDA3NUUsIDB4ODBBQSwgMHgwRTcxLCAweDgwQUIsIDB4M0FBRiwgMHg4MEFDLCAweDE4NUMsIDB4ODBBRCwKKyAgICAweDE4NUEsIDB4ODBBRiwgMHgwN0UwLCAweDgwQjEsIDB4MDdFMSwgMHg4MEIyLCAweDA0QUQsIDB4ODBCNCwgMHgwODU4LAorICAgIDB4ODBCQSwgMHgwRDBGLCAweDgwQzMsIDB4MDRBMywgMHg4MEM0LCAweDE4NjEsIDB4ODBDNiwgMHgwQjdFLCAweDgwQ0MsCisgICAgMHgwRDBFLCAweDgwQ0UsIDB4MEIzQiwgMHg4MEQ2LCAweDE4NjMsIDB4ODBENywgMHgzQUIwLCAweDgwRDgsIDB4M0FCMSwKKyAgICAweDgwRDksIDB4MTg1RiwgMHg4MERBLCAweDE4NjIsIDB4ODBEQiwgMHgxODVELCAweDgwREQsIDB4MTg2MCwgMHg4MERFLAorICAgIDB4MEU1NCwgMHg4MEUxLCAweDA3ODksIDB4ODBFNCwgMHgwNEMxLCAweDgwRTUsIDB4MTg1RSwgMHg4MEVGLCAweDE4NjUsCisgICAgMHg4MEYxLCAweDE4NjYsIDB4ODBGNCwgMHgwQzkxLCAweDgwRjgsIDB4MDZCMywgMHg4MEZDLCAweDE4NzEsIDB4ODBGRCwKKyAgICAweDBDRjMsIDB4ODEwMiwgMHgwOEI3LCAweDgxMDUsIDB4MDZCNCwgMHg4MTA2LCAweDBBNkMsIDB4ODEwNywgMHgwRkVDLAorICAgIDB4ODEwOCwgMHgwRUJBLCAweDgxMDksIDB4MTg2NCwgMHg4MTBBLCAweDBBNzgsIDB4ODExNiwgMHgzQUIyLCAweDgxMTgsCisgICAgMHgzQUIzLCAweDgxMUEsIDB4MDY2RCwgMHg4MTFCLCAweDE4NjcsIDB4ODEyMywgMHgxODY5LCAweDgxMjksIDB4MTg2OCwKKyAgICAweDgxMkIsIDB4MzY1OSwgMHg4MTJGLCAweDE4NkEsIDB4ODEzMSwgMHgwQjY0LCAweDgxMzMsIDB4MENGNCwgMHg4MTM5LAorICAgIDB4MEJDRCwgMHg4MTNBLCAweDNBQjQsIDB4ODEzRSwgMHgxODZFLCAweDgxNDEsIDB4Mzc3MiwgMHg4MTQ2LCAweDE4NkQsCisgICAgMHg4MTRBLCAweDNBQjUsIDB4ODE0QiwgMHgxODZCLCAweDgxNEMsIDB4M0FCNiwgMHg4MTRFLCAweDBBMUIsIDB4ODE1MCwKKyAgICAweDBERDcsIDB4ODE1MSwgMHgxODcwLCAweDgxNTMsIDB4MTg2RiwgMHg4MTU0LCAweDA3RTIsIDB4ODE1NSwgMHgwRkY5LAorICAgIDB4ODE1RiwgMHgxODgwLCAweDgxNjUsIDB4MTg3NCwgMHg4MTY2LCAweDE4NzUsIDB4ODE2QiwgMHgwOTFDLCAweDgxNkUsCisgICAgMHgxODczLCAweDgxNzAsIDB4MDgwQSwgMHg4MTcxLCAweDE4NzIsIDB4ODE3NCwgMHgxODc2LCAweDgxNzgsIDB4MEJDRSwKKyAgICAweDgxNzksIDB4MERGMiwgMHg4MTdBLCAweDBBQTUsIDB4ODE3RiwgMHgwQjNDLCAweDgxODAsIDB4MTg3QSwgMHg4MTgxLAorICAgIDB4M0FCNywgMHg4MTgyLCAweDE4N0IsIDB4ODE4MywgMHgxODc3LCAweDgxODQsIDB4M0FCOCwgMHg4MTg4LCAweDE4NzgsCisgICAgMHg4MThBLCAweDE4NzksIDB4ODE4RiwgMHgwN0UzLCAweDgxOTMsIDB4MTg4MSwgMHg4MTk1LCAweDE4N0QsIDB4ODE5QSwKKyAgICAweDBERDgsIDB4ODE5QywgMHgwRTlBLCAweDgxOUQsIDB4MEQ5QSwgMHg4MUEwLCAweDE4N0MsIDB4ODFBMywgMHgxODdGLAorICAgIDB4ODFBNCwgMHgxODdFLCAweDgxQTgsIDB4MEU3MiwgMHg4MUE5LCAweDE4ODIsIDB4ODFCMCwgMHgxODgzLCAweDgxQjMsCisgICAgMHgwQUI5LCAweDgxQjQsIDB4M0FCOSwgMHg4MUI1LCAweDE4ODQsIDB4ODFCOCwgMHgxODg2LCAweDgxQkEsIDB4MTg4QSwKKyAgICAweDgxQkQsIDB4MTg4NywgMHg4MUJFLCAweDE4ODUsIDB4ODFCRiwgMHgwQ0Y1LCAweDgxQzAsIDB4MTg4OCwgMHg4MUMyLAorICAgIDB4MTg4OSwgMHg4MUM2LCAweDA1MzIsIDB4ODFDOCwgMHgxODkwLCAweDgxQzksIDB4MTg4QiwgMHg4MUNELCAweDE4OEMsCisgICAgMHg4MUNGLCAweDNBQkEsIDB4ODFEMSwgMHgxODhELCAweDgxRDMsIDB4MEIwMSwgMHg4MUQ4LCAweDE4OEYsIDB4ODFEOSwKKyAgICAweDE4OEUsIDB4ODFEQSwgMHgxODkxLCAweDgxREYsIDB4MTg5MiwgMHg4MUUwLCAweDE4OTMsIDB4ODFFMywgMHgwQTA5LAorICAgIDB4ODFFNSwgMHgwNTY5LCAweDgxRTcsIDB4MTg5NCwgMHg4MUU4LCAweDBGOUYsIDB4ODFFQSwgMHgwOEQ3LCAweDgxRUQsCisgICAgMHgwOTM3LCAweDgxRjMsIDB4MDhCOCwgMHg4MUY0LCAweDBCOTUsIDB4ODFGOSwgMHgzQUJCLCAweDgxRkEsIDB4MTg5NSwKKyAgICAweDgxRkIsIDB4MTg5NiwgMHg4MUZDLCAweDA0RDMsIDB4ODFGRSwgMHgxODk3LCAweDgyMDEsIDB4MTg5OCwgMHg4MjAyLAorICAgIDB4MTg5OSwgMHg4MjAzLCAweDNBQkMsIDB4ODIwNSwgMHgxODlBLCAweDgyMDcsIDB4MTg5QiwgMHg4MjA4LCAweDA2QjUsCisgICAgMHg4MjA5LCAweDEzQUYsIDB4ODIwQSwgMHgxODlDLCAweDgyMEMsIDB4MEE4OSwgMHg4MjBELCAweDE4OUQsIDB4ODIwRSwKKyAgICAweDA4RjcsIDB4ODIxMCwgMHgxODlFLCAweDgyMTIsIDB4MTAwOSwgMHg4MjE2LCAweDE4OUYsIDB4ODIxNywgMHgwRTJFLAorICAgIDB4ODIxOCwgMHgwNjE4LCAweDgyMUIsIDB4MEFBNiwgMHg4MjFDLCAweDA5NjIsIDB4ODIxRSwgMHgwREUzLCAweDgyMUYsCisgICAgMHgwOTM4LCAweDgyMjEsIDB4M0FCRCwgMHg4MjI5LCAweDE4QTAsIDB4ODIyQSwgMHgwN0U0LCAweDgyMkIsIDB4MThBMSwKKyAgICAweDgyMkMsIDB4MEQ2MCwgMHg4MjJFLCAweDE4QUYsIDB4ODIzMiwgMHgzQUJFLCAweDgyMzMsIDB4MThBMywgMHg4MjM0LAorICAgIDB4M0FCRiwgMHg4MjM1LCAweDBCMjksIDB4ODIzNiwgMHgwRDJCLCAweDgyMzcsIDB4MDc3MywgMHg4MjM4LCAweDE4QTIsCisgICAgMHg4MjM5LCAweDBBQTcsIDB4ODI0MCwgMHgxOEE0LCAweDgyNDYsIDB4M0FDMCwgMHg4MjQ3LCAweDBDMTYsIDB4ODI0QiwKKyAgICAweDNBQzEsIDB4ODI0RiwgMHgzQUMyLCAweDgyNTgsIDB4MThBNiwgMHg4MjU5LCAweDE4QTUsIDB4ODI1QSwgMHgxOEE4LAorICAgIDB4ODI1RCwgMHgxOEE3LCAweDgyNUYsIDB4MThBOSwgMHg4MjYyLCAweDE4QUIsIDB4ODI2NCwgMHgxOEFBLCAweDgyNjYsCisgICAgMHgwNjBCLCAweDgyNjgsIDB4MThBQywgMHg4MjZBLCAweDE4QUQsIDB4ODI2QiwgMHgxOEFFLCAweDgyNkUsIDB4MDgyMSwKKyAgICAweDgyNkYsIDB4MEY5MSwgMHg4MjcxLCAweDE4QjAsIDB4ODI3MiwgMHgwOUVELCAweDgyNzYsIDB4MDUxMiwgMHg4Mjc3LAorICAgIDB4MThCMSwgMHg4Mjc4LCAweDE4QjIsIDB4ODI3OSwgMHgzNzc1LCAweDgyN0UsIDB4MThCMywgMHg4MjhCLCAweDA0QjYsCisgICAgMHg4MjhELCAweDE4QjQsIDB4ODI4RSwgMHgzQUMzLCAweDgyOTIsIDB4MThCNSwgMHg4Mjk5LCAweDBERDksIDB4ODI5RCwKKyAgICAweDA4RjMsIDB4ODI5RiwgMHgxOEI3LCAweDgyQTUsIDB4MDU4NywgMHg4MkE2LCAweDA0NzYsIDB4ODJBQiwgMHgxOEI2LAorICAgIDB4ODJBQywgMHgxOEI5LCAweDgyQUQsIDB4MEQwNCwgMHg4MkFFLCAweDNBQzQsIDB4ODJBRiwgMHgwQTBBLCAweDgyQjEsCisgICAgMHgwNTU2LCAweDgyQjMsIDB4MEU1NSwgMHg4MkI3LCAweDNBQzUsIDB4ODJCOCwgMHgwNzMzLCAweDgyQjksIDB4MDZENCwKKyAgICAweDgyQkIsIDB4MThCOCwgMHg4MkJELCAweDA1NkEsIDB4ODJCRSwgMHgzQUM2LCAweDgyQzUsIDB4MDVERiwgMHg4MkM2LAorICAgIDB4M0FDNywgMHg4MkQxLCAweDA1MTMsIDB4ODJEMiwgMHgxOEJELCAweDgyRDMsIDB4MEZCMiwgMHg4MkQ0LCAweDBCM0QsCisgICAgMHg4MkQ3LCAweDBEQjYsIDB4ODJEOSwgMHgxOEM5LCAweDgyREIsIDB4MDU1NywgMHg4MkRDLCAweDE4QzcsIDB4ODJERSwKKyAgICAweDE4QzUsIDB4ODJERiwgMHgxOEJDLCAweDgyRTEsIDB4MThCQSwgMHg4MkUzLCAweDE4QkIsIDB4ODJFNSwgMHgwOTBGLAorICAgIDB4ODJFNiwgMHgwNkU0LCAweDgyRTcsIDB4MEJCNSwgMHg4MkVCLCAweDBDQTksIDB4ODJGMSwgMHgwNEYzLCAweDgyRjMsCisgICAgMHgxOEJGLCAweDgyRjQsIDB4MThCRSwgMHg4MkY5LCAweDE4QzQsIDB4ODJGQSwgMHgxOEMwLCAweDgyRkIsIDB4MThDMywKKyAgICAweDgyRkUsIDB4M0FDOCwgMHg4MzAxLCAweDIxOTgsIDB4ODMwMiwgMHgwRURDLCAweDgzMDMsIDB4MThDMiwgMHg4MzA0LAorICAgIDB4MDU1OCwgMHg4MzA1LCAweDA1REIsIDB4ODMwNiwgMHgxOEM2LCAweDgzMDksIDB4MThDOCwgMHg4MzBFLCAweDA3MkEsCisgICAgMHg4MzE2LCAweDE4Q0MsIDB4ODMxNywgMHgxOEQ1LCAweDgzMTgsIDB4MThENiwgMHg4MzFDLCAweDA0NkYsIDB4ODMyMywKKyAgICAweDE4REQsIDB4ODMyOCwgMHgwNEI1LCAweDgzMkIsIDB4MThENCwgMHg4MzJGLCAweDE4RDMsIDB4ODMzMSwgMHgxOENFLAorICAgIDB4ODMzMiwgMHgxOENELCAweDgzMzQsIDB4MThDQiwgMHg4MzM1LCAweDE4Q0EsIDB4ODMzNiwgMHgwQkExLCAweDgzMzgsCisgICAgMHgwQjVCLCAweDgzMzksIDB4MThEMCwgMHg4MzQwLCAweDE4Q0YsIDB4ODM0MywgMHgzQUM5LCAweDgzNDUsIDB4MThEMiwKKyAgICAweDgzNDksIDB4MEFGMiwgMHg4MzRBLCAweDA3MkIsIDB4ODM0RiwgMHgwNEUzLCAweDgzNTAsIDB4MThEMSwgMHg4MzUxLAorICAgIDB4M0FDQSwgMHg4MzUyLCAweDA3RTUsIDB4ODM1NSwgMHgzQUNCLCAweDgzNTgsIDB4MEFGMywgMHg4MzYyLCAweDIxOTksCisgICAgMHg4MzczLCAweDE4RTMsIDB4ODM3NSwgMHgxOEU0LCAweDgzNzcsIDB4MDU1OSwgMHg4MzdCLCAweDA1MkUsIDB4ODM3QywKKyAgICAweDE4RTEsIDB4ODM3RiwgMHgyMTlBLCAweDgzODUsIDB4MThENywgMHg4Mzg2LCAweDNBQ0MsIDB4ODM4NywgMHgxOERGLAorICAgIDB4ODM4OSwgMHgxOEU2LCAweDgzOEEsIDB4MThFMCwgMHg4MzhELCAweDNBQ0QsIDB4ODM4RSwgMHgxOERFLCAweDgzOTIsCisgICAgMHgzQUNFLCAweDgzOTMsIDB4MThDMSwgMHg4Mzk2LCAweDE4REMsIDB4ODM5OCwgMHgzQUNGLCAweDgzOUEsIDB4MThEOCwKKyAgICAweDgzOUUsIDB4MDYwQywgMHg4MzlGLCAweDE4REEsIDB4ODNBMCwgMHgxOEU1LCAweDgzQTIsIDB4MThEQiwgMHg4M0E4LAorICAgIDB4MThFNywgMHg4M0E5LCAweDNBRDAsIDB4ODNBQSwgMHgxOEQ5LCAweDgzQUIsIDB4MEQzMiwgMHg4M0IxLCAweDBGNTMsCisgICAgMHg4M0I1LCAweDE4RTIsIDB4ODNCRCwgMHgxOEY4LCAweDgzQkYsIDB4M0FEMSwgMHg4M0MwLCAweDNBRDIsIDB4ODNDMSwKKyAgICAweDE4RjAsIDB4ODNDNSwgMHgwQTQxLCAweDgzQzcsIDB4MjE5QiwgMHg4M0NBLCAweDA2NjAsIDB4ODNDQywgMHgwNkQ1LAorICAgIDB4ODNDRSwgMHgxOEVCLCAweDgzRDMsIDB4MDU1QiwgMHg4M0Q2LCAweDA5QkMsIDB4ODNEOCwgMHgxOEVFLCAweDgzREMsCisgICAgMHgwODRBLCAweDgzREYsIDB4MEM0QiwgMHg4M0UwLCAweDE4RjMsIDB4ODNFOSwgMHgwRTNFLCAweDgzRUEsIDB4M0FEMywKKyAgICAweDgzRUIsIDB4MThFQSwgMHg4M0VGLCAweDA1NUEsIDB4ODNGMCwgMHgwNzhBLCAweDgzRjEsIDB4MEQ5QiwgMHg4M0YyLAorICAgIDB4MThGNCwgMHg4M0Y0LCAweDE4RTgsIDB4ODNGNiwgMHgyMTlDLCAweDgzRjcsIDB4MThGMSwgMHg4M0ZCLCAweDE4RkIsCisgICAgMHg4M0ZELCAweDE4RUMsIDB4ODQwMywgMHgxOEVELCAweDg0MDQsIDB4MEM5MiwgMHg4NDA3LCAweDE4RjIsIDB4ODQwQSwKKyAgICAweDFFN0YsIDB4ODQwQiwgMHgxOEVGLCAweDg0MEMsIDB4MEU1NiwgMHg4NDBELCAweDE4RjUsIDB4ODQwRSwgMHgwNEE0LAorICAgIDB4ODQwRiwgMHgzQUQ0LCAweDg0MTEsIDB4M0FENSwgMHg4NDEzLCAweDE4RTksIDB4ODQyMCwgMHgxOEY3LCAweDg0MjIsCisgICAgMHgxOEY2LCAweDg0MjksIDB4MEQyMSwgMHg4NDJBLCAweDE4RkQsIDB4ODQyQywgMHgxOTA4LCAweDg0MzEsIDB4MDVEQywKKyAgICAweDg0MzUsIDB4MTkwQiwgMHg4NDM4LCAweDE4RjksIDB4ODQzQywgMHgxOEZFLCAweDg0M0QsIDB4MEY1OCwgMHg4NDQ2LAorICAgIDB4MTkwNywgMHg4NDQ4LCAweDIxOUQsIDB4ODQ0OSwgMHgwRjNGLCAweDg0NEEsIDB4M0FENiwgMHg4NDRFLCAweDBGNzIsCisgICAgMHg4NDU3LCAweDBCQjYsIDB4ODQ1QiwgMHgwNUM5LCAweDg0NjEsIDB4MERFNCwgMHg4NDYyLCAweDE5MEQsIDB4ODQ2MywKKyAgICAweDBDNzksIDB4ODQ2NiwgMHgwNDc1LCAweDg0NjksIDB4MTkwNiwgMHg4NDZCLCAweDE5MDIsIDB4ODQ2QywgMHgwQUY0LAorICAgIDB4ODQ2RCwgMHgxOEZDLCAweDg0NkUsIDB4MTkwNCwgMHg4NDZGLCAweDE5MDksIDB4ODQ3MSwgMHgwQ0UyLCAweDg0NzUsCisgICAgMHgwNDZFLCAweDg0NzYsIDB4M0FENywgMHg4NDc3LCAweDE5MDEsIDB4ODQ3OSwgMHgxOTBBLCAweDg0N0EsIDB4MERFQSwKKyAgICAweDg0ODIsIDB4MTkwNSwgMHg4NDg0LCAweDE5MDAsIDB4ODQ4QiwgMHgwOUJELCAweDg0OTAsIDB4MDkzOSwgMHg4NDk0LAorICAgIDB4MDhEOCwgMHg4NDk5LCAweDBFRTQsIDB4ODQ5QywgMHgwREI5LCAweDg0OUYsIDB4MTkxMCwgMHg4NEExLCAweDE5MTksCisgICAgMHg4NEE4LCAweDNBRDgsIDB4ODRBRCwgMHgxOTAzLCAweDg0QUYsIDB4M0FEOSwgMHg4NEIyLCAweDA1RDUsIDB4ODRCNCwKKyAgICAweDIxOUUsIDB4ODRCOCwgMHgwOUUwLCAweDg0QjksIDB4MTkwRSwgMHg4NEJCLCAweDE5MTMsIDB4ODRCQywgMHgwQUY1LAorICAgIDB4ODRCRiwgMHgxOTBGLCAweDg0QzAsIDB4M0FEQSwgMHg4NEMxLCAweDE5MTYsIDB4ODRDMiwgMHgzQURCLCAweDg0QzQsCisgICAgMHgwQjlELCAweDg0QzYsIDB4MTkxNywgMHg4NEM5LCAweDBGNDAsIDB4ODRDQSwgMHgxOTBDLCAweDg0Q0IsIDB4MDU5NiwKKyAgICAweDg0Q0QsIDB4MTkxMiwgMHg4NEQwLCAweDE5MTUsIDB4ODREMSwgMHgwRUI4LCAweDg0RDYsIDB4MTkxOCwgMHg4NEQ5LAorICAgIDB4MTkxMSwgMHg4NERBLCAweDE5MTQsIDB4ODREQywgMHgyMEFCLCAweDg0RUMsIDB4MEU1NywgMHg4NEVFLCAweDBGQzcsCisgICAgMHg4NEYwLCAweDNBREMsIDB4ODRGNCwgMHgxOTFDLCAweDg0RkMsIDB4MTkyMywgMHg4NEZELCAweDNBREQsIDB4ODRGRiwKKyAgICAweDE5MUIsIDB4ODUwMCwgMHgwOEVGLCAweDg1MDYsIDB4MThGQSwgMHg4NTBDLCAweDNBREUsIDB4ODUxMSwgMHgwRTFFLAorICAgIDB4ODUxMywgMHgwRUFFLCAweDg1MTQsIDB4MTkyMiwgMHg4NTE1LCAweDE5MjEsIDB4ODUxNywgMHgxOTFELCAweDg1MTgsCisgICAgMHgxOTFFLCAweDg1MUEsIDB4MDREOCwgMHg4NTFGLCAweDE5MjAsIDB4ODUyMSwgMHgxOTFBLCAweDg1MjMsIDB4MUUxQSwKKyAgICAweDg1MjYsIDB4MEJGMSwgMHg4NTJDLCAweDE5MUYsIDB4ODUyRCwgMHgwNEMyLCAweDg1MzQsIDB4M0FERiwgMHg4NTM1LAorICAgIDB4MEIwMiwgMHg4NTNELCAweDBFMTMsIDB4ODUzRSwgMHgxRUI1LCAweDg1NDAsIDB4MTkyNCwgMHg4NTQxLCAweDE5MjgsCisgICAgMHg4NTQzLCAweDBENkQsIDB4ODU0OCwgMHgxOTI3LCAweDg1NDksIDB4MDlCRSwgMHg4NTRBLCAweDA4RjUsIDB4ODU0QiwKKyAgICAweDE5MkEsIDB4ODU0RSwgMHgwNkI2LCAweDg1NTMsIDB4MjE5RiwgMHg4NTU1LCAweDE5MkIsIDB4ODU1NywgMHgwREVCLAorICAgIDB4ODU1OCwgMHgxOTI2LCAweDg1NTksIDB4MjFBMCwgMHg4NTVBLCAweDE4RkYsIDB4ODU1RSwgMHgzQUUwLCAweDg1NjMsCisgICAgMHgxOTI1LCAweDg1NjgsIDB4MEZGNSwgMHg4NTY5LCAweDBDN0EsIDB4ODU2QSwgMHgwREU1LCAweDg1NkIsIDB4MjFBMSwKKyAgICAweDg1NkQsIDB4MTkzMiwgMHg4NTc3LCAweDE5MzgsIDB4ODU3RSwgMHgxOTM5LCAweDg1ODAsIDB4MTkyQywgMHg4NTg0LAorICAgIDB4MEQyQywgMHg4NTg3LCAweDE5MzYsIDB4ODU4OCwgMHgxOTJFLCAweDg1OEEsIDB4MTkzMCwgMHg4NThGLCAweDNBRTEsCisgICAgMHg4NTkwLCAweDE5M0EsIDB4ODU5MSwgMHgxOTJGLCAweDg1OTQsIDB4MTkzMywgMHg4NTk3LCAweDA1MTQsIDB4ODU5OSwKKyAgICAweDBDQkQsIDB4ODU5QiwgMHgxOTM0LCAweDg1OUMsIDB4MTkzNywgMHg4NUE0LCAweDE5MkQsIDB4ODVBNiwgMHgwQUE4LAorICAgIDB4ODVBOCwgMHgxOTMxLCAweDg1QTksIDB4MDg3NSwgMHg4NUFBLCAweDBBMEIsIDB4ODVBQiwgMHgwNzA2LCAweDg1QUMsCisgICAgMHgwRjAwLCAweDg1QUQsIDB4M0FFNCwgMHg4NUFFLCAweDBGMDUsIDB4ODVBRiwgMHgwOTdDLCAweDg1QjAsIDB4MjFBMywKKyAgICAweDg1QjcsIDB4M0FFMiwgMHg4NUI5LCAweDE5M0UsIDB4ODVCQSwgMHgxOTNDLCAweDg1QzEsIDB4MEZGNCwgMHg4NUM5LAorICAgIDB4MTkzQiwgMHg4NUNELCAweDBGNUYsIDB4ODVDRSwgMHgzQUUzLCAweDg1Q0YsIDB4MTkzRCwgMHg4NUQwLCAweDE5M0YsCisgICAgMHg4NUQ1LCAweDE5NDAsIDB4ODVEQywgMHgxOTQzLCAweDg1REQsIDB4MTk0MSwgMHg4NUU0LCAweDBDN0IsIDB4ODVFNSwKKyAgICAweDE5NDIsIDB4ODVFOSwgMHgwRDYxLCAweDg1RUEsIDB4MTkzNSwgMHg4NUY0LCAweDM3ODAsIDB4ODVGNywgMHgwOTdELAorICAgIDB4ODVGOSwgMHgxOTQ0LCAweDg1RkEsIDB4MTk0OSwgMHg4NUZCLCAweDBBRjYsIDB4ODVGRSwgMHgxOTQ4LCAweDg2MDIsCisgICAgMHgxOTI5LCAweDg2MDYsIDB4MTk0QSwgMHg4NjA3LCAweDBBQ0IsIDB4ODYwQSwgMHgxOTQ1LCAweDg2MEIsIDB4MTk0NywKKyAgICAweDg2MTIsIDB4M0FFNSwgMHg4NjEzLCAweDE5NDYsIDB4ODYxNiwgMHgxNEQwLCAweDg2MTcsIDB4MTRDMSwgMHg4NjFBLAorICAgIDB4MTk0QywgMHg4NjIyLCAweDE5NEIsIDB4ODYyOSwgMHgzQUU2LCAweDg2MkQsIDB4MEY2MCwgMHg4NjJGLCAweDE2QjEsCisgICAgMHg4NjMwLCAweDE5NEQsIDB4ODYzRiwgMHgxOTRFLCAweDg2NEQsIDB4MTk0RiwgMHg4NjRFLCAweDA3OEIsIDB4ODY1MCwKKyAgICAweDA2NkUsIDB4ODY1MiwgMHgzQUU3LCAweDg2NTQsIDB4MTk1MSwgMHg4NjU1LCAweDEwOTQsIDB4ODY1QSwgMHgwNjhGLAorICAgIDB4ODY1QiwgMHgzNDE4LCAweDg2NUMsIDB4MEY4MiwgMHg4NjVFLCAweDA2RUIsIDB4ODY1RiwgMHgxOTUyLCAweDg2NjMsCisgICAgMHgzQUU4LCAweDg2NjcsIDB4MTk1MywgMHg4NjZCLCAweDBCQUMsIDB4ODY2QywgMHgzQUU5LCAweDg2NkYsIDB4M0FFQSwKKyAgICAweDg2NzEsIDB4MTk1NCwgMHg4Njc5LCAweDBDRDIsIDB4ODY3QSwgMHgzQUVCLCAweDg2N0IsIDB4MDQ3RSwgMHg4NjdELAorICAgIDB4Mzc4NiwgMHg4NjhBLCAweDA1NjMsIDB4ODY4QiwgMHgxOTU5LCAweDg2OEMsIDB4MTk1QSwgMHg4NjhELCAweDNBRUMsCisgICAgMHg4NjkxLCAweDNBRUQsIDB4ODY5MywgMHgxOTU1LCAweDg2OTUsIDB4MDg4QiwgMHg4Njk4LCAweDNBRUUsIDB4ODZBMywKKyAgICAweDE5NTYsIDB4ODZBNCwgMHgwQ0Y4LCAweDg2QTcsIDB4M0FFRiwgMHg4NkE4LCAweDNBRjAsIDB4ODZBOSwgMHgxOTU3LAorICAgIDB4ODZBQSwgMHgxOTU4LCAweDg2QUIsIDB4MTk2MiwgMHg4NkFGLCAweDE5NUMsIDB4ODZCMCwgMHgxOTVGLCAweDg2QjYsCisgICAgMHgxOTVCLCAweDg2QzQsIDB4MTk1RCwgMHg4NkM2LCAweDE5NUUsIDB4ODZDNywgMHgwOTA0LCAweDg2QzksIDB4MTk2MCwKKyAgICAweDg2Q0IsIDB4MEI3RiwgMHg4NkNELCAweDA3MkMsIDB4ODZDRSwgMHgwNUEwLCAweDg2RDQsIDB4MTk2MywgMHg4NkQ5LAorICAgIDB4MDU5RCwgMHg4NkRCLCAweDE5NjgsIDB4ODZERSwgMHgxOTY0LCAweDg2REYsIDB4MTk2NywgMHg4NkU0LCAweDBENEUsCisgICAgMHg4NkU5LCAweDE5NjUsIDB4ODZFQywgMHgxOTY2LCAweDg2RUQsIDB4MERCQSwgMHg4NkVFLCAweDBENkUsIDB4ODZFRiwKKyAgICAweDE5NjksIDB4ODZGOCwgMHgwQjVELCAweDg2RjksIDB4MTk3MywgMHg4NkZBLCAweDNBRjEsIDB4ODZGQiwgMHgxOTZGLAorICAgIDB4ODZGRCwgMHgzQUYyLCAweDg2RkUsIDB4MDU2QiwgMHg4NzAwLCAweDE5NkQsIDB4ODcwMiwgMHgwRTU4LCAweDg3MDMsCisgICAgMHgxOTZFLCAweDg3MDYsIDB4MTk2QiwgMHg4NzA4LCAweDE5NkMsIDB4ODcwOSwgMHgxOTcxLCAweDg3MEEsIDB4MTk3NCwKKyAgICAweDg3MEIsIDB4M0FGMywgMHg4NzBELCAweDE5NzIsIDB4ODcxMSwgMHgxOTcwLCAweDg3MTIsIDB4MTk2QSwgMHg4NzEzLAorICAgIDB4M0FGNCwgMHg4NzE4LCAweDBCOTYsIDB4ODcxOSwgMHgzQUY1LCAweDg3MUEsIDB4MTk3QiwgMHg4NzFDLCAweDBFQjYsCisgICAgMHg4NzFFLCAweDNBRjYsIDB4ODcyNSwgMHgxOTc5LCAweDg3MjgsIDB4M0FGNywgMHg4NzI5LCAweDE5N0EsIDB4ODczNCwKKyAgICAweDE5NzUsIDB4ODczNywgMHgxOTc3LCAweDg3M0IsIDB4MTk3OCwgMHg4NzNFLCAweDNBRjgsIDB4ODczRiwgMHgxOTc2LAorICAgIDB4ODc0OSwgMHgwQThBLCAweDg3NEIsIDB4MEZERiwgMHg4NzRDLCAweDE5N0YsIDB4ODc0RSwgMHgxOTgwLCAweDg3NTMsCisgICAgMHgxOTg2LCAweDg3NTUsIDB4MDlGMCwgMHg4NzU3LCAweDE5ODIsIDB4ODc1OSwgMHgxOTg1LCAweDg3NUYsIDB4MTk3RCwKKyAgICAweDg3NjAsIDB4MTk3QywgMHg4NzYzLCAweDE5ODcsIDB4ODc2NiwgMHgwNTVDLCAweDg3NjgsIDB4MTk4MywgMHg4NzZBLAorICAgIDB4MTk4OCwgMHg4NzZFLCAweDE5ODQsIDB4ODc3MSwgMHgzQUY5LCAweDg3NzQsIDB4MTk4MSwgMHg4Nzc2LCAweDBCQ0YsCisgICAgMHg4Nzc4LCAweDE5N0UsIDB4ODc3RiwgMHgwRDFFLCAweDg3ODIsIDB4MTk4QywgMHg4Nzg4LCAweDNBRkEsIDB4ODc4RCwKKyAgICAweDBGMjUsIDB4ODc5OSwgMHgzQUZCLCAweDg3OUYsIDB4MTk4QiwgMHg4N0EyLCAweDE5OEEsIDB4ODdBQiwgMHgxOTkzLAorICAgIDB4ODdBQywgMHgzQUZDLCAweDg3QUQsIDB4M0FGRCwgMHg4N0FGLCAweDE5OEQsIDB4ODdCMywgMHgxOTk1LCAweDg3QjUsCisgICAgMHgzQUZFLCAweDg3QkEsIDB4MEY1MCwgMHg4N0JCLCAweDE5OTgsIDB4ODdCRCwgMHgxOThGLCAweDg3QzAsIDB4MTk5MCwKKyAgICAweDg3QzQsIDB4MTk5NCwgMHg4N0M2LCAweDE5OTcsIDB4ODdDNywgMHgxOTk2LCAweDg3Q0IsIDB4MTk4RSwgMHg4N0QwLAorICAgIDB4MTk5MSwgMHg4N0QyLCAweDE5QTIsIDB4ODdENiwgMHgzQUZGLCAweDg3RTAsIDB4MTk5QiwgMHg4N0VCLCAweDNCMDAsCisgICAgMHg4N0VDLCAweDFFMjMsIDB4ODdFRCwgMHgzQjAxLCAweDg3RUYsIDB4MTk5OSwgMHg4N0YyLCAweDE5OUEsIDB4ODdGNSwKKyAgICAweDNDM0QsIDB4ODdGNiwgMHgxOTlGLCAweDg3RjcsIDB4MTlBMCwgMHg4N0Y5LCAweDA1ODgsIDB4ODdGQiwgMHgwNjVDLAorICAgIDB4ODdGRSwgMHgxOTlFLCAweDg4MDEsIDB4M0IwMiwgMHg4ODAzLCAweDNCMDMsIDB4ODgwNSwgMHgxOTg5LCAweDg4MDYsCisgICAgMHgzQjA0LCAweDg4MDcsIDB4MjFBNiwgMHg4ODBCLCAweDNCMDUsIDB4ODgwRCwgMHgxOTlELCAweDg4MEUsIDB4MTlBMSwKKyAgICAweDg4MEYsIDB4MTk5QywgMHg4ODExLCAweDE5QTMsIDB4ODgxNCwgMHgzQjA2LCAweDg4MTUsIDB4MTlBNSwgMHg4ODE2LAorICAgIDB4MTlBNCwgMHg4ODFDLCAweDNCMDcsIDB4ODgxRiwgMHgxRTg1LCAweDg4MjEsIDB4MTlBNywgMHg4ODIyLCAweDE5QTYsCisgICAgMHg4ODIzLCAweDE5NjEsIDB4ODgyNywgMHgxOUFCLCAweDg4MzEsIDB4MTlBOCwgMHg4ODM2LCAweDE5QTksIDB4ODgzOSwKKyAgICAweDE5QUEsIDB4ODgzQiwgMHgxOUFDLCAweDg4NDAsIDB4MDc0MiwgMHg4ODQyLCAweDE5QUUsIDB4ODg0NCwgMHgxOUFELAorICAgIDB4ODg0NiwgMHgwOTNBLCAweDg4NEMsIDB4MDdFNiwgMHg4ODRELCAweDE1MjQsIDB4ODg1MiwgMHgxOUFGLCAweDg4NTMsCisgICAgMHgwOTVCLCAweDg4NTYsIDB4M0IwOCwgMHg4ODU3LCAweDA1OTcsIDB4ODg1OSwgMHgxOUIwLCAweDg4NUIsIDB4MDRGNCwKKyAgICAweDg4NUQsIDB4MDlCRiwgMHg4ODVFLCAweDE5QjEsIDB4ODg1RiwgMHgzQjA5LCAweDg4NjEsIDB4MDdFNywgMHg4ODYyLAorICAgIDB4MTlCMiwgMHg4ODYzLCAweDA0QTUsIDB4ODg2NCwgMHgzQjBBLCAweDg4NjgsIDB4MERBRiwgMHg4ODZCLCAweDE5QjMsCisgICAgMHg4ODcwLCAweDBBMzAsIDB4ODg3MiwgMHgxOUJBLCAweDg4NzUsIDB4MTlCNywgMHg4ODc3LCAweDBCQUQsIDB4ODg3RCwKKyAgICAweDE5QjgsIDB4ODg3RSwgMHgxOUI1LCAweDg4N0YsIDB4MDZENiwgMHg4ODgxLCAweDE5QjQsIDB4ODg4MiwgMHgxOUJCLAorICAgIDB4ODg4OCwgMHgwNzBDLCAweDg4OEIsIDB4MEIzRSwgMHg4ODhELCAweDE5QzEsIDB4ODg5MiwgMHgxOUJELCAweDg4OTYsCisgICAgMHgwQjE1LCAweDg4OTcsIDB4MTlCQywgMHg4ODk4LCAweDNCMEIsIDB4ODg5OSwgMHgxOUJGLCAweDg4OUUsIDB4MTlCNiwKKyAgICAweDg4QTIsIDB4MTlDMCwgMHg4OEE0LCAweDE5QzIsIDB4ODhBQSwgMHgzQjBDLCAweDg4QUIsIDB4MEQ4MywgMHg4OEFFLAorICAgIDB4MTlCRSwgMHg4OEIwLCAweDE5QzMsIDB4ODhCMSwgMHgxOUM1LCAweDg4QjQsIDB4MDc4NywgMHg4OEI1LCAweDE5QjksCisgICAgMHg4OEI3LCAweDA0ODUsIDB4ODhCRCwgMHgzQjBELCAweDg4QkUsIDB4M0IwRSwgMHg4OEJGLCAweDE5QzQsIDB4ODhDMSwKKyAgICAweDA4NEIsIDB4ODhDMiwgMHgwRkJFLCAweDg4QzMsIDB4MTlDNiwgMHg4OEM0LCAweDE5QzcsIDB4ODhDNSwgMHgwQUY3LAorICAgIDB4ODhDNiwgMHgzNzg5LCAweDg4Q0EsIDB4M0IwRiwgMHg4OENGLCAweDBGNkEsIDB4ODhEMiwgMHgzQjEwLCAweDg4RDQsCisgICAgMHgxOUM4LCAweDg4RDUsIDB4MEYxRiwgMHg4OEQ4LCAweDE5QzksIDB4ODhEOSwgMHgxOUNBLCAweDg4REIsIDB4M0IxMSwKKyAgICAweDg4REMsIDB4MEUzNCwgMHg4OERELCAweDE5Q0IsIDB4ODhERiwgMHgwODMwLCAweDg4RTEsIDB4MEY2QiwgMHg4OEU4LAorICAgIDB4MTlEMCwgMHg4OEYwLCAweDNCMTIsIDB4ODhGMSwgMHgzQjEzLCAweDg4RjIsIDB4MTlEMSwgMHg4OEYzLCAweDA5QzAsCisgICAgMHg4OEY0LCAweDE5Q0YsIDB4ODhGNSwgMHgyMUE3LCAweDg4RjgsIDB4MEY1MSwgMHg4OEY5LCAweDE5Q0MsIDB4ODhGQywKKyAgICAweDE5Q0UsIDB4ODhGRCwgMHgwQTYxLCAweDg4RkUsIDB4MEE0NCwgMHg4OTAyLCAweDE5Q0QsIDB4ODkwNCwgMHgxOUQyLAorICAgIDB4ODkwNiwgMHgzQjE0LCAweDg5MDcsIDB4MERGMywgMHg4OTBBLCAweDE5RDQsIDB4ODkwQywgMHgxOUQzLCAweDg5MTAsCisgICAgMHgwNUNBLCAweDg5MTIsIDB4MEU1OSwgMHg4OTEzLCAweDE5RDUsIDB4ODkxOCwgMHgzQjE1LCAweDg5MTksIDB4M0IxNiwKKyAgICAweDg5MUEsIDB4M0IxNywgMHg4OTFDLCAweDIwQTgsIDB4ODkxRCwgMHgxOUUxLCAweDg5MUUsIDB4MTlENywgMHg4OTI1LAorICAgIDB4MTlEOCwgMHg4OTI3LCAweDNCMTgsIDB4ODkyQSwgMHgxOUQ5LCAweDg5MkIsIDB4MTlEQSwgMHg4OTMwLCAweDNCMTksCisgICAgMHg4OTM2LCAweDE5REUsIDB4ODkzOCwgMHgxOURGLCAweDg5M0IsIDB4MTlERCwgMHg4OTNFLCAweDNCMUEsIDB4ODk0MSwKKyAgICAweDE5REIsIDB4ODk0MywgMHgxOUQ2LCAweDg5NDQsIDB4MTlEQywgMHg4OTRDLCAweDE5RTAsIDB4ODk0RCwgMHgxQkQwLAorICAgIDB4ODk1NiwgMHgwNTI4LCAweDg5NUUsIDB4MTlFMywgMHg4OTVGLCAweDA2RDcsIDB4ODk2MCwgMHgxOUUyLCAweDg5NjQsCisgICAgMHgxOUU1LCAweDg5NjYsIDB4MTlFNCwgMHg4OTZBLCAweDE5RTcsIDB4ODk2RCwgMHgxOUU2LCAweDg5NkYsIDB4MTlFOCwKKyAgICAweDg5NzIsIDB4MDkzQiwgMHg4OTc0LCAweDE5RTksIDB4ODk3NywgMHgxOUVBLCAweDg5N0IsIDB4M0IxQiwgMHg4OTdFLAorICAgIDB4MTlFQiwgMHg4OTdGLCAweDBBNjIsIDB4ODk4MCwgMHgzNjJFLCAweDg5ODEsIDB4MEY0MSwgMHg4OTgzLCAweDE5RUMsCisgICAgMHg4OTg2LCAweDBERjQsIDB4ODk4NywgMHgwQ0ZDLCAweDg5ODgsIDB4MTlFRCwgMHg4OThBLCAweDE5RUUsIDB4ODk4QiwKKyAgICAweDA3NUYsIDB4ODk4RiwgMHgwNjQ2LCAweDg5OTMsIDB4MTlFRiwgMHg4OTk2LCAweDA4QjksIDB4ODk5NywgMHgwQ0Y3LAorICAgIDB4ODk5OCwgMHgxOUYwLCAweDg5OUEsIDB4MDVBRSwgMHg4OUExLCAweDE5RjEsIDB4ODlBNiwgMHgxOUYzLCAweDg5QTcsCisgICAgMHgwRjYxLCAweDg5QTksIDB4MTlGMiwgMHg4OUFBLCAweDBBMEMsIDB4ODlBQywgMHgxOUY0LCAweDg5QUYsIDB4MTlGNSwKKyAgICAweDg5QjIsIDB4MTlGNiwgMHg4OUIzLCAweDA2MEQsIDB4ODlCQSwgMHgxOUY3LCAweDg5QkQsIDB4MTlGOCwgMHg4OUJGLAorICAgIDB4MTlGOSwgMHg4OUMwLCAweDE5RkEsIDB4ODlEMiwgMHgwNUFGLCAweDg5RDQsIDB4M0IxQywgMHg4OUQ2LCAweDNCMUQsCisgICAgMHg4OURBLCAweDE5RkIsIDB4ODlEQywgMHgxOUZDLCAweDg5REQsIDB4MTlGRCwgMHg4OUUzLCAweDA1NzIsIDB4ODlFNSwKKyAgICAweDNCMUUsIDB4ODlFNiwgMHgwOUVFLCAweDg5RTcsIDB4MTlGRSwgMHg4OUYxLCAweDNCMUYsIDB4ODlGNCwgMHgxOUZGLAorICAgIDB4ODlGOCwgMHgxQTAwLCAweDhBMDAsIDB4MDc3NCwgMHg4QTAxLCAweDM1QkMsIDB4OEEwMiwgMHgwQzE3LCAweDhBMDMsCisgICAgMHgxQTAxLCAweDhBMDcsIDB4M0IyMCwgMHg4QTA4LCAweDA3MkQsIDB4OEEwQSwgMHgwQTFDLCAweDhBMEMsIDB4MUEwNCwKKyAgICAweDhBMEUsIDB4MEM3QywgMHg4QTBGLCAweDNCMjEsIDB4OEExMCwgMHgxQTAzLCAweDhBMTIsIDB4MjFBOCwgMHg4QTEzLAorICAgIDB4MDcwNywgMHg4QTE1LCAweDNCMjIsIDB4OEExNiwgMHgxQTAyLCAweDhBMTcsIDB4MEI1NywgMHg4QTE4LCAweDA2NDcsCisgICAgMHg4QTFCLCAweDFBMDUsIDB4OEExRCwgMHgxQTA2LCAweDhBMUYsIDB4MDlDMSwgMHg4QTIyLCAweDNCMjMsIDB4OEEyMywKKyAgICAweDA3NDMsIDB4OEEyNSwgMHgxQTA3LCAweDhBMkEsIDB4MEU1QSwgMHg4QTJELCAweDBBODMsIDB4OEEzMSwgMHgwNjkwLAorICAgIDB4OEEzMywgMHgwRjAxLCAweDhBMzQsIDB4MEFDQywgMHg4QTM2LCAweDFBMDgsIDB4OEEzNywgMHgyMUE5LCAweDhBM0EsCisgICAgMHgwQTBELCAweDhBM0IsIDB4MEJBRSwgMHg4QTNDLCAweDA5QzIsIDB4OEE0MSwgMHgxQTA5LCAweDhBNDYsIDB4MUEwQywKKyAgICAweDhBNDgsIDB4MUEwRCwgMHg4QTRFLCAweDNCMjQsIDB4OEE1MCwgMHgwODJFLCAweDhBNTEsIDB4MEIyMiwgMHg4QTUyLAorICAgIDB4MUEwQiwgMHg4QTU0LCAweDA5QzMsIDB4OEE1NSwgMHgwREIwLCAweDhBNUIsIDB4MUEwQSwgMHg4QTVFLCAweDA4QkEsCisgICAgMHg4QTYwLCAweDA0RjUsIDB4OEE2MiwgMHgxQTExLCAweDhBNjMsIDB4MDcyRSwgMHg4QTY2LCAweDA4QkMsIDB4OEE2OSwKKyAgICAweDA4QkIsIDB4OEE2QiwgMHgwRkYzLCAweDhBNkMsIDB4MUExMCwgMHg4QTZELCAweDFBMEYsIDB4OEE2RSwgMHgwQUE5LAorICAgIDB4OEE3MCwgMHgwNjY3LCAweDhBNzEsIDB4MEZFOSwgMHg4QTcyLCAweDA1OTgsIDB4OEE3MywgMHgwOUM0LCAweDhBNzksCisgICAgMHgyMUFBLCAweDhBN0MsIDB4MUEwRSwgMHg4QTdGLCAweDNCMjUsIDB4OEE4MiwgMHgxQTEzLCAweDhBODQsIDB4MUExNCwKKyAgICAweDhBODUsIDB4MUExMiwgMHg4QTg3LCAweDA3OEMsIDB4OEE4OSwgMHgwRjJBLCAweDhBOEMsIDB4MDhCRCwgMHg4QThELAorICAgIDB4MENERCwgMHg4QTkxLCAweDFBMTcsIDB4OEE5MywgMHgwQTY0LCAweDhBOTUsIDB4MEI4MCwgMHg4QTk4LCAweDBGMjAsCisgICAgMHg4QTlBLCAweDFBMUEsIDB4OEE5RSwgMHgwN0EwLCAweDhBQTAsIDB4MEE2MywgMHg4QUExLCAweDFBMTYsIDB4OEFBMywKKyAgICAweDFBMUIsIDB4OEFBNCwgMHgwN0ExLCAweDhBQTUsIDB4MUExOCwgMHg4QUE2LCAweDFBMTksIDB4OEFBNywgMHgyMUFCLAorICAgIDB4OEFBOCwgMHgxQTE1LCAweDhBQUEsIDB4MzYzOCwgMHg4QUFDLCAweDBBODYsIDB4OEFBRCwgMHgwQ0ExLCAweDhBQjAsCisgICAgMHgwQjZELCAweDhBQjIsIDB4MDU1RCwgMHg4QUI5LCAweDBEODQsIDB4OEFCQywgMHgwNjVELCAweDhBQkUsIDB4MjFBQywKKyAgICAweDhBQkYsIDB4MEJEMCwgMHg4QUMyLCAweDFBMUUsIDB4OEFDNCwgMHgxQTFDLCAweDhBQzcsIDB4MEI4QSwgMHg4QUNCLAorICAgIDB4MEE2NSwgMHg4QUNDLCAweDA2MEUsIDB4OEFDRCwgMHgxQTFELCAweDhBQ0YsIDB4MEEyMSwgMHg4QUQyLCAweDBGOTIsCisgICAgMHg4QUQ2LCAweDBGRTYsIDB4OEFEQSwgMHgxQTFGLCAweDhBREIsIDB4MUEyQSwgMHg4QURDLCAweDBCRDEsIDB4OEFERSwKKyAgICAweDFBMjksIDB4OEFERiwgMHgyMUFELCAweDhBRTAsIDB4MUEyNiwgMHg4QUUxLCAweDFBMkUsIDB4OEFFMiwgMHgxQTI3LAorICAgIDB4OEFFNCwgMHgxQTIzLCAweDhBRTYsIDB4MEMxOCwgMHg4QUU3LCAweDFBMjIsIDB4OEFFQiwgMHgxQTIwLCAweDhBRUQsCisgICAgMHgwRjBCLCAweDhBRUUsIDB4MDhCRSwgMHg4QUYxLCAweDFBMjQsIDB4OEFGMywgMHgxQTIxLCAweDhBRjQsIDB4M0IyNiwKKyAgICAweDhBRjYsIDB4MjFBRiwgMHg4QUY3LCAweDFBMjgsIDB4OEFGOCwgMHgwOTdFLCAweDhBRkEsIDB4MDc3NSwgMHg4QUZFLAorICAgIDB4MEI1QSwgMHg4QjAwLCAweDBFNzMsIDB4OEIwMSwgMHgwNEZDLCAweDhCMDIsIDB4MDRBNiwgMHg4QjA0LCAweDBDN0QsCisgICAgMHg4QjA3LCAweDFBMkMsIDB4OEIwQywgMHgxQTJCLCAweDhCMEUsIDB4MENCRSwgMHg4QjEwLCAweDFBMzAsIDB4OEIxNCwKKyAgICAweDFBMjUsIDB4OEIxNiwgMHgxQTJGLCAweDhCMTcsIDB4MUEzMSwgMHg4QjE5LCAweDA3NjAsIDB4OEIxQSwgMHgxQTJELAorICAgIDB4OEIxQiwgMHgwN0U4LCAweDhCMUQsIDB4MDkwMSwgMHg4QjFGLCAweDNCMjcsIDB4OEIyMCwgMHgxQTMyLCAweDhCMjEsCisgICAgMHgwRjQyLCAweDhCMjYsIDB4MUEzNSwgMHg4QjI4LCAweDFBMzgsIDB4OEIyQiwgMHgxQTM2LCAweDhCMkMsIDB4MERBNywKKyAgICAweDhCMzMsIDB4MUEzMywgMHg4QjM3LCAweDNCMjgsIDB4OEIzOSwgMHgwNkQ4LCAweDhCM0UsIDB4MUEzNywgMHg4QjQxLAorICAgIDB4MUEzOSwgMHg4QjQzLCAweDNCMjksIDB4OEI0NCwgMHgzQjJBLCAweDhCNDksIDB4MUEzRCwgMHg4QjRDLCAweDFBM0EsCisgICAgMHg4QjRFLCAweDFBM0MsIDB4OEI0RiwgMHgxQTNCLCAweDhCNTMsIDB4MjFCMCwgMHg4QjU0LCAweDNCMkIsIDB4OEI1NiwKKyAgICAweDFBM0UsIDB4OEI1OCwgMHgwOERELCAweDhCNUEsIDB4MUE0MCwgMHg4QjVCLCAweDFBM0YsIDB4OEI1QywgMHgwRERBLAorICAgIDB4OEI1RiwgMHgxQTQyLCAweDhCNjYsIDB4MDcyRiwgMHg4QjZCLCAweDFBNDEsIDB4OEI2QywgMHgxQTQzLCAweDhCNkYsCisgICAgMHgxQTQ0LCAweDhCNzAsIDB4MDY1RSwgMHg4QjcxLCAweDE4MkUsIDB4OEI3MiwgMHgwOUUxLCAweDhCNzQsIDB4MUE0NSwKKyAgICAweDhCNzcsIDB4MDdBMiwgMHg4QjdELCAweDFBNDYsIDB4OEI3RiwgMHgyMUIxLCAweDhCODAsIDB4MUE0NywgMHg4QjgzLAorICAgIDB4MDg4QywgMHg4QjhBLCAweDEzRDMsIDB4OEI4QywgMHgxQTQ4LCAweDhCOEUsIDB4MUE0OSwgMHg4QjkwLCAweDA5M0MsCisgICAgMHg4QjkyLCAweDFBNEEsIDB4OEI5MywgMHgxQTRCLCAweDhCOTYsIDB4MUE0QywgMHg4Qjk5LCAweDFBNEQsIDB4OEI5QSwKKyAgICAweDFBNEUsIDB4OEI5QywgMHgzQjJDLCAweDhCOUUsIDB4M0IyRCwgMHg4QzM3LCAweDBCNjksIDB4OEMzQSwgMHgxQTRGLAorICAgIDB4OEMzRiwgMHgxQTUxLCAweDhDNDEsIDB4MUE1MCwgMHg4QzQ2LCAweDBDN0UsIDB4OEM0NywgMHgzQjJFLCAweDhDNDgsCisgICAgMHgxQTUyLCAweDhDNEEsIDB4MEU1QiwgMHg4QzRDLCAweDFBNTMsIDB4OEM0RSwgMHgxQTU0LCAweDhDNTAsIDB4MUE1NSwKKyAgICAweDhDNTQsIDB4M0IyRiwgMHg4QzU1LCAweDFBNTYsIDB4OEM1QSwgMHgwQ0IyLCAweDhDNjEsIDB4MDlDNSwgMHg4QzYyLAorICAgIDB4MUE1NywgMHg4QzZBLCAweDA3RkQsIDB4OEM2QiwgMHgxMDA3LCAweDhDNkMsIDB4MUE1OCwgMHg4QzczLCAweDNCMzAsCisgICAgMHg4Qzc4LCAweDFBNTksIDB4OEM3OSwgMHgwREIxLCAweDhDN0EsIDB4MUE1QSwgMHg4QzdDLCAweDFBNjIsIDB4OEM4MiwKKyAgICAweDFBNUIsIDB4OEM4NSwgMHgxQTVELCAweDhDODksIDB4MUE1QywgMHg4QzhBLCAweDFBNUUsIDB4OEM4QywgMHgwRTc0LAorICAgIDB4OEM4RCwgMHgxQTVGLCAweDhDOEUsIDB4MUE2MCwgMHg4Qzk0LCAweDFBNjEsIDB4OEM5OCwgMHgxQTYzLCAweDhDOUQsCisgICAgMHgwNThCLCAweDhDOUUsIDB4MEMwMywgMHg4Q0EwLCAweDBEREIsIDB4OENBMSwgMHgwODUyLCAweDhDQTIsIDB4MDdFOSwKKyAgICAweDhDQTQsIDB4M0IzMSwgMHg4Q0E3LCAweDBEQzEsIDB4OENBOCwgMHgwNTVGLCAweDhDQTksIDB4MEQ2MiwgMHg4Q0FBLAorICAgIDB4MUE2NiwgMHg4Q0FCLCAweDA2MEYsIDB4OENBQywgMHgwQTc5LCAweDhDQUQsIDB4MUE2NSwgMHg4Q0FFLCAweDFBNkEsCisgICAgMHg4Q0FGLCAweDBCQjcsIDB4OENCMCwgMHgwRUVGLCAweDhDQjIsIDB4MUE2OCwgMHg4Q0IzLCAweDFBNjksIDB4OENCNCwKKyAgICAweDA2NDgsIDB4OENCNiwgMHgxQTZCLCAweDhDQjcsIDB4MEQxOSwgMHg4Q0I4LCAweDBCM0YsIDB4OENCQiwgMHgwRDg1LAorICAgIDB4OENCQywgMHgwQzM3LCAweDhDQkQsIDB4MUE2NywgMHg4Q0JGLCAweDBFNzUsIDB4OENDMCwgMHgwNTZDLCAweDhDQzEsCisgICAgMHgxQTZELCAweDhDQzIsIDB4MEZDRSwgMHg4Q0MzLCAweDBCREUsIDB4OENDNCwgMHgwRkVCLCAweDhDQzcsIDB4MDhCRiwKKyAgICAweDhDQzgsIDB4MUE2QywgMHg4Q0NBLCAweDBCMTEsIDB4OENDRCwgMHgxQTdELCAweDhDQ0UsIDB4MEFBQSwgMHg4Q0QxLAorICAgIDB4MENEMCwgMHg4Q0QzLCAweDBEQzIsIDB4OENEOSwgMHgzQjMyLCAweDhDREEsIDB4MUE3MCwgMHg4Q0RCLCAweDA4OEQsCisgICAgMHg4Q0RDLCAweDA4QzAsIDB4OENERSwgMHgwOUM2LCAweDhDRTAsIDB4MEQxQiwgMHg4Q0UxLCAweDNCMzMsIDB4OENFMiwKKyAgICAweDA3NjEsIDB4OENFMywgMHgxQTZGLCAweDhDRTQsIDB4MUE2RSwgMHg4Q0U2LCAweDBEREMsIDB4OENFQSwgMHgwOEVELAorICAgIDB4OENFRCwgMHgwQzRDLCAweDhDRjAsIDB4MjFCMiwgMHg4Q0Y0LCAweDIxQjMsIDB4OENGOCwgMHgzQjM0LCAweDhDRkEsCisgICAgMHgxQTcyLCAweDhDRkIsIDB4MUE3MywgMHg4Q0ZDLCAweDA3RUEsIDB4OENGRCwgMHgxQTcxLCAweDhDRkUsIDB4M0IzNSwKKyAgICAweDhEMDQsIDB4MUE3NCwgMHg4RDA1LCAweDFBNzUsIDB4OEQwNywgMHgxQTc3LCAweDhEMDgsIDB4MEIwMywgMHg4RDBBLAorICAgIDB4MUE3NiwgMHg4RDBCLCAweDA2MjIsIDB4OEQwRCwgMHgxQTc5LCAweDhEMEYsIDB4MUE3OCwgMHg4RDEwLCAweDFBN0EsCisgICAgMHg4RDEyLCAweDIxQjQsIDB4OEQxMywgMHgxQTdDLCAweDhEMTQsIDB4MUE3RSwgMHg4RDE2LCAweDFBN0YsIDB4OEQxQiwKKyAgICAweDNCMzYsIDB4OEQ2NCwgMHgwQTdBLCAweDhENjYsIDB4MDhGQiwgMHg4RDY3LCAweDFBODAsIDB4OEQ2OSwgMHgzQjM3LAorICAgIDB4OEQ2QiwgMHgwNUIwLCAweDhENkMsIDB4M0IzOCwgMHg4RDZELCAweDFBODEsIDB4OEQ3MCwgMHgwQUY4LCAweDhENzEsCisgICAgMHgxQTgyLCAweDhENzMsIDB4MUE4MywgMHg4RDc0LCAweDBEREQsIDB4OEQ3NiwgMHgyMUI1LCAweDhENzcsIDB4MDY0OSwKKyAgICAweDhEODEsIDB4MUE4NCwgMHg4RDg0LCAweDNCMzksIDB4OEQ4NSwgMHgwQkQyLCAweDhEOEEsIDB4MDRGRCwgMHg4RDhELAorICAgIDB4M0IzQSwgMHg4RDk1LCAweDNCM0IsIDB4OEQ5OSwgMHgxQTg1LCAweDhEQTMsIDB4MDkxRCwgMHg4REE2LCAweDNCM0MsCisgICAgMHg4REE4LCAweDBBM0MsIDB4OERCMywgMHgwQjBELCAweDhEQkEsIDB4MUE4OCwgMHg4REJFLCAweDFBODcsIDB4OERDMiwKKyAgICAweDFBODYsIDB4OERDNiwgMHgzQjNELCAweDhEQ0IsIDB4MUE4RSwgMHg4RENDLCAweDFBOEMsIDB4OERDRSwgMHgzQjNFLAorICAgIDB4OERDRiwgMHgxQTg5LCAweDhERDYsIDB4MUE4QiwgMHg4RERBLCAweDFBOEEsIDB4OEREQiwgMHgxQThELCAweDhEREQsCisgICAgMHgwNjkxLCAweDhEREYsIDB4MUE5MSwgMHg4REUxLCAweDBBN0IsIDB4OERFMywgMHgxQTkyLCAweDhERTQsIDB4M0IzRiwKKyAgICAweDhERTgsIDB4MDc4RCwgMHg4REVBLCAweDFBOEYsIDB4OERFQiwgMHgxQTkwLCAweDhERUMsIDB4M0I0MCwgMHg4REVGLAorICAgIDB4MEZDRiwgMHg4REYzLCAweDBCRDMsIDB4OERGNSwgMHgwQUFCLCAweDhERkMsIDB4MUE5MywgMHg4REZGLCAweDFBOTYsCisgICAgMHg4RTA4LCAweDFBOTQsIDB4OEUwOSwgMHgxQTk1LCAweDhFMEEsIDB4MEY0MywgMHg4RTBGLCAweDBDN0YsIDB4OEUxMCwKKyAgICAweDFBOTksIDB4OEUxRCwgMHgxQTk3LCAweDhFMUUsIDB4MUE5OCwgMHg4RTFGLCAweDFBOUEsIDB4OEUyMCwgMHgzQjQxLAorICAgIDB4OEUyQSwgMHgxQUE4LCAweDhFMzAsIDB4MUE5RCwgMHg4RTM0LCAweDFBOUUsIDB4OEUzNSwgMHgxQTlDLCAweDhFNDIsCisgICAgMHgxQTlCLCAweDhFNDQsIDB4MEMxOSwgMHg4RTQ3LCAweDFBQTAsIDB4OEU0OCwgMHgxQUE0LCAweDhFNDksIDB4MUFBMSwKKyAgICAweDhFNEEsIDB4MUE5RiwgMHg4RTRCLCAweDNCNDIsIDB4OEU0QywgMHgxQUEyLCAweDhFNTAsIDB4MUFBMywgMHg4RTU1LAorICAgIDB4MUFBQSwgMHg4RTU5LCAweDFBQTUsIDB4OEU1RiwgMHgwQTdDLCAweDhFNjAsIDB4MUFBNywgMHg4RTYzLCAweDFBQTksCisgICAgMHg4RTY0LCAweDFBQTYsIDB4OEU2QywgMHgzQjQzLCAweDhFNzAsIDB4M0I0NCwgMHg4RTcyLCAweDFBQUMsIDB4OEU3NCwKKyAgICAweDA5M0QsIDB4OEU3NiwgMHgxQUFCLCAweDhFN0EsIDB4M0I0NSwgMHg4RTdDLCAweDFBQUQsIDB4OEU4MSwgMHgxQUFFLAorICAgIDB4OEU4NCwgMHgxQUIxLCAweDhFODUsIDB4MUFCMCwgMHg4RTg3LCAweDFBQUYsIDB4OEU4QSwgMHgxQUIzLCAweDhFOEIsCisgICAgMHgxQUIyLCAweDhFOEQsIDB4MEYwMiwgMHg4RTkxLCAweDFBQjUsIDB4OEU5MiwgMHgzQjQ2LCAweDhFOTMsIDB4MUFCNCwKKyAgICAweDhFOTQsIDB4MUFCNiwgMHg4RTk5LCAweDFBQjcsIDB4OEVBMSwgMHgxQUI5LCAweDhFQUEsIDB4MUFCOCwgMHg4RUFCLAorICAgIDB4MEEwRSwgMHg4RUFDLCAweDFBQkEsIDB4OEVBRSwgMHgzQjQ3LCAweDhFQUYsIDB4MDZFNSwgMHg4RUIwLCAweDFBQkIsCisgICAgMHg4RUIxLCAweDFBQkQsIDB4OEVCMywgMHgzQjQ4LCAweDhFQjYsIDB4MzcwMywgMHg4RUJFLCAweDFBQkUsIDB4OEVDMCwKKyAgICAweDFERUYsIDB4OEVDNSwgMHgxQUJGLCAweDhFQzYsIDB4MUFCQywgMHg4RUM4LCAweDFBQzAsIDB4OEVDQSwgMHgwOTAyLAorICAgIDB4OEVDQiwgMHgxQUMxLCAweDhFQ0MsIDB4MDY0QSwgMHg4RUNELCAweDA3MDksIDB4OEVDRiwgMHgyMUI3LCAweDhFRDEsCisgICAgMHgzQjQ5LCAweDhFRDIsIDB4MDc2MiwgMHg4RUQ0LCAweDNCNEEsIDB4OEVEQiwgMHgxQUMyLCAweDhFREYsIDB4MENDOCwKKyAgICAweDhFRTIsIDB4MEMzOCwgMHg4RUUzLCAweDFBQzMsIDB4OEVFQiwgMHgxQUM2LCAweDhFRjgsIDB4MDhFMCwgMHg4RUY5LAorICAgIDB4M0I0QiwgMHg4RUZCLCAweDFBQzUsIDB4OEVGQywgMHgxQUM0LCAweDhFRkQsIDB4MDczMCwgMHg4RUZFLCAweDFBQzcsCisgICAgMHg4RjAzLCAweDA1QjEsIDB4OEYwNSwgMHgxQUM5LCAweDhGMDksIDB4MDg0QywgMHg4RjBBLCAweDFBQzgsIDB4OEYwQywKKyAgICAweDFBRDEsIDB4OEYxMiwgMHgxQUNCLCAweDhGMTMsIDB4MUFDRCwgMHg4RjE0LCAweDBFMzUsIDB4OEYxNSwgMHgxQUNBLAorICAgIDB4OEYxNywgMHgzQjRDLCAweDhGMTksIDB4MUFDQywgMHg4RjFCLCAweDFBRDAsIDB4OEYxQywgMHgxQUNFLCAweDhGMUQsCisgICAgMHgwNjRCLCAweDhGMUYsIDB4MUFDRiwgMHg4RjI2LCAweDFBRDIsIDB4OEYyOSwgMHgwRDEwLCAweDhGMkEsIDB4MEZBMCwKKyAgICAweDhGMkYsIDB4MDkzRSwgMHg4RjMzLCAweDFBRDMsIDB4OEYzNiwgMHgzQjRELCAweDhGMzgsIDB4MEYwQywgMHg4RjM5LAorICAgIDB4MUFENSwgMHg4RjNCLCAweDFBRDQsIDB4OEYzRSwgMHgxQUQ4LCAweDhGM0YsIDB4MEYyQiwgMHg4RjQyLCAweDFBRDcsCisgICAgMHg4RjQ0LCAweDA1Q0IsIDB4OEY0NSwgMHgxQUQ2LCAweDhGNDYsIDB4MUFEQiwgMHg4RjQ5LCAweDFBREEsIDB4OEY0QywKKyAgICAweDFBRDksIDB4OEY0RCwgMHgwQzJDLCAweDhGNEUsIDB4MUFEQywgMHg4RjU3LCAweDFBREQsIDB4OEY1QywgMHgxQURFLAorICAgIDB4OEY1RiwgMHgwN0ZFLCAweDhGNjEsIDB4MDZGQiwgMHg4RjYyLCAweDFBREYsIDB4OEY2MywgMHgxQUUwLCAweDhGNjQsCisgICAgMHgxQUUxLCAweDhGOUIsIDB4MEEwRiwgMHg4RjlDLCAweDFBRTIsIDB4OEY5RSwgMHgwOEQ5LCAweDhGOUYsIDB4MUFFMywKKyAgICAweDhGQTMsIDB4MUFFNCwgMHg4RkE2LCAweDNCNEUsIDB4OEZBNywgMHgxMEI2LCAweDhGQTgsIDB4MTBCNSwgMHg4RkFELAorICAgIDB4MUFFNSwgMHg4RkFFLCAweDE3RkYsIDB4OEZBRiwgMHgxQUU2LCAweDhGQjAsIDB4MEI2MiwgMHg4RkIxLCAweDA5RjEsCisgICAgMHg4RkIyLCAweDBDRjYsIDB4OEZCNSwgMHgzQjRGLCAweDhGQjYsIDB4M0I1MCwgMHg4RkI3LCAweDFBRTcsIDB4OEZCQSwKKyAgICAweDBFMjUsIDB4OEZCQiwgMHgwQkYwLCAweDhGQkMsIDB4MDgxMCwgMHg4RkJGLCAweDBCNjcsIDB4OEZDMiwgMHgwNENDLAorICAgIDB4OEZDNCwgMHgwRUE2LCAweDhGQzUsIDB4MEExRCwgMHg4RkM2LCAweDNCNTEsIDB4OEZDOCwgMHgzNzk5LCAweDhGQ0UsCisgICAgMHgwNzM0LCAweDhGRDEsIDB4MDZEOSwgMHg4RkQ0LCAweDBFMjYsIDB4OEZEQSwgMHgxQUU4LCAweDhGRTAsIDB4M0I1MiwKKyAgICAweDhGRTIsIDB4MUFFQSwgMHg4RkU0LCAweDNCNTMsIDB4OEZFNSwgMHgxQUU5LCAweDhGRTYsIDB4MDU2MCwgMHg4RkU5LAorICAgIDB4MENDRSwgMHg4RkVBLCAweDFBRUIsIDB4OEZFQiwgMHgwRDJELCAweDhGRUQsIDB4MEMyRCwgMHg4RkVGLCAweDFBRUMsCisgICAgMHg4RkYwLCAweDA5NUMsIDB4OEZGNCwgMHgxQUVFLCAweDhGRjYsIDB4M0I1NCwgMHg4RkY3LCAweDBFQ0UsIDB4OEZGOCwKKyAgICAweDFBRkQsIDB4OEZGOSwgMHgxQUYwLCAweDhGRkEsIDB4MUFGMSwgMHg4RkZELCAweDBCRTUsIDB4OTAwMCwgMHgwQjQwLAorICAgIDB4OTAwMSwgMHgwQUY5LCAweDkwMDIsIDB4M0I1NSwgMHg5MDAzLCAweDBDODAsIDB4OTAwNSwgMHgxQUVGLCAweDkwMDYsCisgICAgMHgwNjZGLCAweDkwMEIsIDB4MUFGOCwgMHg5MDBELCAweDFBRjUsIDB4OTAwRSwgMHgxQjAyLCAweDkwMEYsIDB4MEM4MSwKKyAgICAweDkwMTAsIDB4MEI5RSwgMHg5MDExLCAweDFBRjIsIDB4OTAxMywgMHgwQzFBLCAweDkwMTQsIDB4MEM0RCwgMHg5MDE1LAorICAgIDB4MUFGMywgMHg5MDE2LCAweDFBRjcsIDB4OTAxNywgMHgwQTI2LCAweDkwMTksIDB4MEQxRCwgMHg5MDFBLCAweDBCRTgsCisgICAgMHg5MDFELCAweDBBNjYsIDB4OTAxRSwgMHgxQUY2LCAweDkwMUYsIDB4MEIwRSwgMHg5MDIwLCAweDBCMDQsIDB4OTAyMSwKKyAgICAweDFBRjQsIDB4OTAyMiwgMHgwNDZELCAweDkwMjMsIDB4MEZDOCwgMHg5MDI3LCAweDFBRjksIDB4OTAyQywgMHgzQjU2LAorICAgIDB4OTAyRSwgMHgwQjQxLCAweDkwMzEsIDB4MDkzRiwgMHg5MDMyLCAweDBBMTAsIDB4OTAzNSwgMHgxQUZCLCAweDkwMzYsCisgICAgMHgxQUZBLCAweDkwMzgsIDB4MDRCMywgMHg5MDM5LCAweDFBRkMsIDB4OTAzQywgMHgwREExLCAweDkwM0UsIDB4MUIwNCwKKyAgICAweDkwNDEsIDB4MENCMywgMHg5MDQyLCAweDBBMzEsIDB4OTA0NCwgMHgzQjU3LCAweDkwNDUsIDB4MEI5NywgMHg5MDQ3LAorICAgIDB4MDZGMCwgMHg5MDQ5LCAweDFCMDMsIDB4OTA0QSwgMHgwRjIxLCAweDkwNEIsIDB4MDRFMSwgMHg5MDRELCAweDBFMjcsCisgICAgMHg5MDRFLCAweDA1NjEsIDB4OTA0RiwgMHgxQUZFLCAweDkwNTAsIDB4MUFGRiwgMHg5MDUxLCAweDFCMDAsIDB4OTA1MiwKKyAgICAweDFCMDEsIDB4OTA1MywgMHgwQzkzLCAweDkwNTQsIDB4MEI2MSwgMHg5MDU1LCAweDA0QTcsIDB4OTA1NiwgMHgxQjA1LAorICAgIDB4OTA1OCwgMHgxQjA2LCAweDkwNTksIDB4MUQzNCwgMHg5MDVDLCAweDBCMUQsIDB4OTA1RSwgMHgxQjA3LCAweDkwNjAsCisgICAgMHgwNTE1LCAweDkwNjEsIDB4MEFDRSwgMHg5MDYzLCAweDA3NjMsIDB4OTA2NSwgMHgwRjQ0LCAweDkwNjcsIDB4MjFCQSwKKyAgICAweDkwNjgsIDB4MUIwOCwgMHg5MDY5LCAweDBDMjYsIDB4OTA2RCwgMHgwQUZBLCAweDkwNkUsIDB4MDkwMywgMHg5MDZGLAorICAgIDB4MUIwOSwgMHg5MDcyLCAweDFCMEMsIDB4OTA3NSwgMHgwOTZGLCAweDkwNzYsIDB4MUIwQSwgMHg5MDc3LCAweDBBQUQsCisgICAgMHg5MDc4LCAweDBBQUMsIDB4OTA3QSwgMHgwNEE4LCAweDkwN0MsIDB4MEY5MywgMHg5MDdELCAweDFCMEUsIDB4OTA3RiwKKyAgICAweDBEODYsIDB4OTA4MCwgMHgxQjEwLCAweDkwODEsIDB4MUIwRiwgMHg5MDgyLCAweDFCMEQsIDB4OTA4MywgMHgxNzM3LAorICAgIDB4OTA4NCwgMHgwNjEwLCAweDkwODcsIDB4MUFFRCwgMHg5MDg4LCAweDNCNTgsIDB4OTA4OSwgMHgxQjEyLCAweDkwOEEsCisgICAgMHgxQjExLCAweDkwOEYsIDB4MUIxMywgMHg5MDkxLCAweDBGMjIsIDB4OTA5NSwgMHgzQjU5LCAweDkwOTksIDB4M0I1QSwKKyAgICAweDkwOUIsIDB4M0I1QiwgMHg5MEEyLCAweDNCNUMsIDB4OTBBMywgMHgwQ0I5LCAweDkwQTYsIDB4MEU1QywgMHg5MEE4LAorICAgIDB4MUIxNCwgMHg5MEFBLCAweDA5MDUsIDB4OTBBRiwgMHgxQjE1LCAweDkwQjEsIDB4MUIxNiwgMHg5MEI0LCAweDNCNUQsCisgICAgMHg5MEI1LCAweDFCMTcsIDB4OTBCOCwgMHgwQzFCLCAweDkwQzEsIDB4MDRBRSwgMHg5MENBLCAweDA3RUIsIDB4OTBDRSwKKyAgICAweDBGRTAsIDB4OTBENywgMHgzQjVFLCAweDkwREIsIDB4MUIxQiwgMHg5MERELCAweDNCNUYsIDB4OTBERSwgMHgyMUJCLAorICAgIDB4OTBFMSwgMHgwNzBBLCAweDkwRTIsIDB4MUIxOCwgMHg5MEU0LCAweDFCMTksIDB4OTBFOCwgMHgwREU2LCAweDkwRUQsCisgICAgMHgwNUIyLCAweDkwRjQsIDB4M0I2MCwgMHg5MEY1LCAweDBGMjMsIDB4OTBGNywgMHgwNkI3LCAweDkwRkQsIDB4MEM0RSwKKyAgICAweDkxMDIsIDB4MUIxQywgMHg5MTEyLCAweDFCMUQsIDB4OTExNSwgMHgyMUJELCAweDkxMTcsIDB4M0I2MSwgMHg5MTE5LAorICAgIDB4MUIxRSwgMHg5MTFDLCAweDNCNjIsIDB4OTEyNywgMHgyMUJFLCAweDkxMkQsIDB4MEMxQywgMHg5MTMwLCAweDFCMjAsCisgICAgMHg5MTMxLCAweDNCNjMsIDB4OTEzMiwgMHgxQjFGLCAweDkxM0EsIDB4M0I2NCwgMHg5MTNELCAweDNCNjUsIDB4OTE0OCwKKyAgICAweDNCNjYsIDB4OTE0OSwgMHgwQ0FCLCAweDkxNEEsIDB4MUIyMSwgMHg5MTRCLCAweDA5NDAsIDB4OTE0QywgMHgwOTBDLAorICAgIDB4OTE0RCwgMHgwRDExLCAweDkxNEUsIDB4MEJBRiwgMHg5MTUyLCAweDA5MUUsIDB4OTE1NCwgMHgwQTMyLCAweDkxNTYsCisgICAgMHgxQjIyLCAweDkxNTgsIDB4MUIyMywgMHg5MTVCLCAweDNCNjcsIDB4OTE2MSwgMHgzQjY4LCAweDkxNjIsIDB4MEEyMywKKyAgICAweDkxNjMsIDB4MUIyNCwgMHg5MTY0LCAweDNCNjksIDB4OTE2NSwgMHgxQjI1LCAweDkxNjksIDB4MUIyNiwgMHg5MTZBLAorICAgIDB4MEY1OSwgMHg5MTZDLCAweDA5NDEsIDB4OTE3MiwgMHgxQjI4LCAweDkxNzMsIDB4MUIyNywgMHg5MTc1LCAweDA3RUMsCisgICAgMHg5MTc3LCAweDA4MDUsIDB4OTE3OCwgMHgwODhFLCAweDkxODIsIDB4MUIyQiwgMHg5MTg3LCAweDA5NzAsIDB4OTE4OSwKKyAgICAweDFCMkEsIDB4OTE4QiwgMHgxQjI5LCAweDkxOEQsIDB4MEI0OSwgMHg5MThFLCAweDNCNkEsIDB4OTE5MCwgMHgwN0EzLAorICAgIDB4OTE5MiwgMHgwQTY3LCAweDkxOTcsIDB4MEQ0NCwgMHg5MTlDLCAweDA5NDMsIDB4OTE5RSwgMHgzQjZCLCAweDkxQTIsCisgICAgMHgxQjJDLCAweDkxQTQsIDB4MDlDNywgMHg5MUE4LCAweDNCNkMsIDB4OTFBQSwgMHgxQjJGLCAweDkxQUIsIDB4MUIyRCwKKyAgICAweDkxQUMsIDB4MUUxQiwgMHg5MUFELCAweDNCNkQsIDB4OTFBRSwgMHgzQjZFLCAweDkxQUYsIDB4MUIyRSwgMHg5MUIxLAorICAgIDB4MUU2MSwgMHg5MUIyLCAweDNCNkYsIDB4OTFCNCwgMHgxQjMxLCAweDkxQjUsIDB4MUIzMCwgMHg5MUI4LCAweDA5RTIsCisgICAgMHg5MUJBLCAweDFCMzIsIDB4OTFCQywgMHgzQjcwLCAweDkxQzAsIDB4MUIzMywgMHg5MUMxLCAweDFCMzQsIDB4OTFDNiwKKyAgICAweDBENjQsIDB4OTFDNywgMHgwODQzLCAweDkxQzgsIDB4MDkwRCwgMHg5MUM5LCAweDFCMzUsIDB4OTFDQiwgMHgxQjM2LAorICAgIDB4OTFDQywgMHgwRjZDLCAweDkxQ0QsIDB4MDk0RiwgMHg5MUNFLCAweDBFRkEsIDB4OTFDRiwgMHgwRjk0LCAweDkxRDAsCisgICAgMHgxQjM3LCAweDkxRDEsIDB4MDZEQSwgMHg5MUQ2LCAweDFCMzgsIDB4OTFENywgMHgyMUMwLCAweDkxRDgsIDB4MEMxRCwKKyAgICAweDkxREEsIDB4MjFCRiwgMHg5MURCLCAweDFCM0IsIDB4OTFEQywgMHgwNUQ2LCAweDkxREQsIDB4MEExMSwgMHg5MURFLAorICAgIDB4MjFDMSwgMHg5MURGLCAweDFCMzksIDB4OTFFMSwgMHgxQjNBLCAweDkxRTMsIDB4MEJGQywgMHg5MUU0LCAweDIxQzQsCisgICAgMHg5MUU1LCAweDIxQzUsIDB4OTFFNiwgMHgwRTgzLCAweDkxRTcsIDB4MDZGNCwgMHg5MUVELCAweDIxQzIsIDB4OTFFRSwKKyAgICAweDIxQzMsIDB4OTFGMCwgMHgzQjcxLCAweDkxRjUsIDB4MUIzRCwgMHg5MUY2LCAweDFCM0UsIDB4OTFGNywgMHgzQjcyLAorICAgIDB4OTFGQiwgMHgzQjczLCAweDkxRkMsIDB4MUIzQywgMHg5MUZGLCAweDFCNDAsIDB4OTIwNiwgMHgyMUM2LCAweDkyMDcsCisgICAgMHgzQjc0LCAweDkyMEEsIDB4MjFDOCwgMHg5MjBELCAweDBDQjcsIDB4OTIwRSwgMHgwNUExLCAweDkyMTAsIDB4MjFDNywKKyAgICAweDkyMTEsIDB4MUI0NCwgMHg5MjE0LCAweDFCNDEsIDB4OTIxNSwgMHgxQjQzLCAweDkyMUUsIDB4MUIzRiwgMHg5MjI4LAorICAgIDB4M0I3NSwgMHg5MjI5LCAweDFCOEEsIDB4OTIyQywgMHgxQjQyLCAweDkyMzMsIDB4M0I3NiwgMHg5MjM0LCAweDBGQjMsCisgICAgMHg5MjM3LCAweDA3OEUsIDB4OTIzOCwgMHgzQjc3LCAweDkyMzksIDB4MjFDRiwgMHg5MjNBLCAweDIxQzksIDB4OTIzQywKKyAgICAweDIxQ0IsIDB4OTIzRiwgMHgxQjRDLCAweDkyNDAsIDB4MjFDQSwgMHg5MjQzLCAweDNCNzgsIDB4OTI0NCwgMHgwQzJFLAorICAgIDB4OTI0NSwgMHgxQjQ3LCAweDkyNDcsIDB4M0I3OSwgMHg5MjQ4LCAweDFCNEEsIDB4OTI0OSwgMHgxQjQ4LCAweDkyNEIsCisgICAgMHgxQjRELCAweDkyNEUsIDB4MjFDQywgMHg5MjRGLCAweDNCN0EsIDB4OTI1MCwgMHgxQjRFLCAweDkyNTEsIDB4MjFDRSwKKyAgICAweDkyNTcsIDB4MUI0NiwgMHg5MjU5LCAweDIxQ0QsIDB4OTI1QSwgMHgxQjUzLCAweDkyNUIsIDB4MDUxNiwgMHg5MjVFLAorICAgIDB4MUI0NSwgMHg5MjYwLCAweDNCN0IsIDB4OTI2MiwgMHgwRDQxLCAweDkyNjQsIDB4MUI0OSwgMHg5MjY2LCAweDA5QzgsCisgICAgMHg5MjY3LCAweDIxRDAsIDB4OTI3MSwgMHgwN0VELCAweDkyNzcsIDB4MjFEMiwgMHg5Mjc4LCAweDIxRDMsIDB4OTI3RSwKKyAgICAweDBFNzYsIDB4OTI4MCwgMHgwNkRDLCAweDkyODMsIDB4MDk1MCwgMHg5Mjg1LCAweDBDOTQsIDB4OTI4OCwgMHgyMEFBLAorICAgIDB4OTI5MSwgMHgwQUFGLCAweDkyOTMsIDB4MUI1MSwgMHg5Mjk1LCAweDFCNEIsIDB4OTI5NiwgMHgxQjUwLCAweDkyOTgsCisgICAgMHgwRUNGLCAweDkyOUEsIDB4MEJENCwgMHg5MjlCLCAweDFCNTIsIDB4OTI5QywgMHgxQjRGLCAweDkyQTcsIDB4MjFEMSwKKyAgICAweDkyQUQsIDB4MEFBRSwgMHg5MkIzLCAweDM1NTQsIDB4OTJCNywgMHgxQjU2LCAweDkyQjksIDB4MUI1NSwgMHg5MkMyLAorICAgIDB4M0I3QywgMHg5MkNCLCAweDNCN0QsIDB4OTJDQywgMHgzQjdFLCAweDkyQ0YsIDB4MUI1NCwgMHg5MkQwLCAweDIxRDcsCisgICAgMHg5MkQyLCAweDBFNUQsIDB4OTJEMywgMHgyMURCLCAweDkyRDUsIDB4MjFEOSwgMHg5MkQ3LCAweDIxRDUsIDB4OTJEOSwKKyAgICAweDIxRDYsIDB4OTJERiwgMHgzQjdGLCAweDkyRTAsIDB4MjFEQSwgMHg5MkU0LCAweDA5ODUsIDB4OTJFNywgMHgyMUQ0LAorICAgIDB4OTJFOSwgMHgxQjU3LCAweDkyRUEsIDB4MEUyRiwgMHg5MkVELCAweDA0RjYsIDB4OTJGMiwgMHgwREI4LCAweDkyRjMsCisgICAgMHgwQkIwLCAweDkyRjgsIDB4MDY5MiwgMHg5MkY5LCAweDIwQjAsIDB4OTJGQSwgMHgxQjU5LCAweDkyRkIsIDB4MjFERSwKKyAgICAweDkyRkMsIDB4MDdFRiwgMHg5MkZGLCAweDIxRTEsIDB4OTMwMiwgMHgyMUUzLCAweDkzMDQsIDB4MzQ1QSwgMHg5MzA2LAorICAgIDB4MDg3QSwgMHg5MzBELCAweDNCODAsIDB4OTMwRiwgMHgxQjU4LCAweDkzMTAsIDB4MEEzMywgMHg5MzE1LCAweDNCODEsCisgICAgMHg5MzE4LCAweDBBMzQsIDB4OTMxOSwgMHgxQjVDLCAweDkzMUEsIDB4MUI1RSwgMHg5MzFELCAweDIxRTIsIDB4OTMxRSwKKyAgICAweDIxRTAsIDB4OTMxRiwgMHgzQjgyLCAweDkzMjAsIDB4MDlFMywgMHg5MzIxLCAweDIxREQsIDB4OTMyMiwgMHgxQjVELAorICAgIDB4OTMyMywgMHgxQjVGLCAweDkzMjUsIDB4MjFEQywgMHg5MzI2LCAweDA2Q0IsIDB4OTMyNywgMHgzQjgzLCAweDkzMjgsCisgICAgMHgwREI3LCAweDkzMkIsIDB4MDkwRSwgMHg5MzJDLCAweDBGQzksIDB4OTMyRSwgMHgxQjVCLCAweDkzMkYsIDB4MDg2OCwKKyAgICAweDkzMzIsIDB4MEZFNSwgMHg5MzM1LCAweDFCNjEsIDB4OTMzQSwgMHgxQjYwLCAweDkzM0IsIDB4MUI2MiwgMHg5MzQ0LAorICAgIDB4MUI1QSwgMHg5MzQ3LCAweDNCODQsIDB4OTM0OCwgMHgyMEE5LCAweDkzNEEsIDB4MzQ1OCwgMHg5MzRCLCAweDBDQzEsCisgICAgMHg5MzRELCAweDBDNEYsIDB4OTM1MiwgMHgzQjg1LCAweDkzNTQsIDB4MEJGMywgMHg5MzU2LCAweDFCNjcsIDB4OTM1NywKKyAgICAweDIxRTUsIDB4OTM1QiwgMHgwQjgxLCAweDkzNUMsIDB4MUI2MywgMHg5MzYwLCAweDFCNjQsIDB4OTM2NSwgMHgzQjg2LAorICAgIDB4OTM2QSwgMHgzQjg3LCAweDkzNkMsIDB4MDcwMywgMHg5MzZELCAweDNCODgsIDB4OTM2RSwgMHgxQjY2LCAweDkzNzAsCisgICAgMHgyMUU0LCAweDkzNzUsIDB4MDc2NCwgMHg5MzdDLCAweDFCNjUsIDB4OTM3RSwgMHgwOUM5LCAweDkzOEMsIDB4MDVENywKKyAgICAweDkzOTQsIDB4MUI2QiwgMHg5Mzk2LCAweDA4MkYsIDB4OTM5NywgMHgwQUZCLCAweDkzOUEsIDB4MEJFNiwgMHg5MzlCLAorICAgIDB4M0I4OSwgMHg5M0E0LCAweDIxRTYsIDB4OTNBNywgMHgwNTk5LCAweDkzQTksIDB4M0I4QiwgMHg5M0FDLCAweDFCNjksCisgICAgMHg5M0FELCAweDFCNkEsIDB4OTNBRSwgMHgwQkRGLCAweDkzQjAsIDB4MUI2OCwgMHg5M0I5LCAweDFCNkMsIDB4OTNCQSwKKyAgICAweDNCOEEsIDB4OTNDMSwgMHgzQjhDLCAweDkzQzMsIDB4MUI3MiwgMHg5M0M2LCAweDIxRTcsIDB4OTNDOCwgMHgxQjc1LAorICAgIDB4OTNDQSwgMHgzQjhELCAweDkzRDAsIDB4MUI3NCwgMHg5M0QxLCAweDBDMjcsIDB4OTNENiwgMHgxQjZELCAweDkzRDcsCisgICAgMHgxQjZFLCAweDkzRDgsIDB4MUI3MSwgMHg5M0RELCAweDFCNzMsIDB4OTNERSwgMHgyMUU4LCAweDkzRTEsIDB4MDZCOCwKKyAgICAweDkzRTIsIDB4M0I4RSwgMHg5M0U0LCAweDFCNzYsIDB4OTNFNSwgMHgxQjcwLCAweDkzRTgsIDB4MUI2RiwgMHg5M0Y4LAorICAgIDB4MjFFOSwgMHg5M0ZBLCAweDNCOEYsIDB4OTNGRCwgMHgzQjkwLCAweDk0MDMsIDB4MUI3QSwgMHg5NDA3LCAweDFCN0IsCisgICAgMHg5NDBGLCAweDNCOTEsIDB4OTQxMCwgMHgxQjdDLCAweDk0MTMsIDB4MUI3OSwgMHg5NDE0LCAweDFCNzgsIDB4OTQxOCwKKyAgICAweDA5Q0EsIDB4OTQxOSwgMHgwQzgyLCAweDk0MUEsIDB4MUI3NywgMHg5NDIxLCAweDFCODAsIDB4OTQyQiwgMHgxQjdFLAorICAgIDB4OTQzMSwgMHgyMUVBLCAweDk0MzQsIDB4M0I5MiwgMHg5NDM1LCAweDFCN0YsIDB4OTQzNiwgMHgxQjdELCAweDk0MzgsCisgICAgMHgwQjU4LCAweDk0M0EsIDB4MUI4MSwgMHg5NDNGLCAweDNCOTMsIDB4OTQ0MSwgMHgxQjgyLCAweDk0NDQsIDB4MUI4NCwKKyAgICAweDk0NDUsIDB4MjFFQiwgMHg5NDQ4LCAweDIxRUMsIDB4OTQ1MSwgMHgwNjExLCAweDk0NTIsIDB4MUI4MywgMHg5NDUzLAorICAgIDB4MEYwNiwgMHg5NDU1LCAweDNCOTQsIDB4OTQ1QSwgMHgxQjhGLCAweDk0NUIsIDB4MUI4NSwgMHg5NDVFLCAweDFCODgsCisgICAgMHg5NDYwLCAweDFCODYsIDB4OTQ2MiwgMHgxQjg3LCAweDk0NkEsIDB4MUI4OSwgMHg5NDZCLCAweDNCOTUsIDB4OTQ3MCwKKyAgICAweDFCOEIsIDB4OTQ3MiwgMHgzQjk2LCAweDk0NzUsIDB4MUI4QywgMHg5NDc3LCAweDFCOEQsIDB4OTQ3QywgMHgxQjkwLAorICAgIDB4OTQ3RCwgMHgxQjhFLCAweDk0N0UsIDB4MUI5MSwgMHg5NDdGLCAweDFCOTMsIDB4OTQ4MSwgMHgxQjkyLCAweDk1NzcsCisgICAgMHgwQkQ1LCAweDk1NzgsIDB4M0I5NywgMHg5NTgwLCAweDBFRjMsIDB4OTU4MiwgMHgxQjk0LCAweDk1ODMsIDB4MEFCMCwKKyAgICAweDk1ODcsIDB4MUI5NSwgMHg5NTg5LCAweDBFMTQsIDB4OTU4QSwgMHgxQjk2LCAweDk1OEIsIDB4MDU4OSwgMHg5NThGLAorICAgIDB4MDRERSwgMHg5NTkxLCAweDA2MTMsIDB4OTU5MiwgMHgyMUVELCAweDk1OTMsIDB4MDYxMiwgMHg5NTk0LCAweDFCOTcsCisgICAgMHg5NTk2LCAweDFCOTgsIDB4OTU5OCwgMHgxQjk5LCAweDk1OTksIDB4MUI5QSwgMHg5NUEwLCAweDFCOUIsIDB4OTVBMiwKKyAgICAweDA2MTQsIDB4OTVBMywgMHgwNUIzLCAweDk1QTQsIDB4MDdGMCwgMHg5NUE1LCAweDBENEEsIDB4OTVBNiwgMHgzQjk4LAorICAgIDB4OTVBNywgMHgxQjlELCAweDk1QTgsIDB4MUI5QywgMHg5NUE5LCAweDNCOTksIDB4OTVBQiwgMHgzQjlBLCAweDk1QUQsCisgICAgMHgxQjlFLCAweDk1QjEsIDB4MzU1NSwgMHg5NUIyLCAweDA0RkUsIDB4OTVCNCwgMHgzQjlCLCAweDk1QjksIDB4MUJBMSwKKyAgICAweDk1QkIsIDB4MUJBMCwgMHg5NUJDLCAweDFCOUYsIDB4OTVCRCwgMHgzQjlDLCAweDk1QkUsIDB4MUJBMiwgMHg5NUMzLAorICAgIDB4MUJBNSwgMHg5NUM3LCAweDA0OEIsIDB4OTVDQSwgMHgxQkEzLCAweDk1Q0MsIDB4MUJBNywgMHg5NUNELCAweDFCQTYsCisgICAgMHg5NUQ0LCAweDFCQTksIDB4OTVENSwgMHgxQkE4LCAweDk1RDYsIDB4MUJBQSwgMHg5NUQ4LCAweDBDODYsIDB4OTVEQSwKKyAgICAweDNCOUQsIDB4OTVEQywgMHgxQkFCLCAweDk1RTEsIDB4MUJBQywgMHg5NUUyLCAweDFCQUUsIDB4OTVFNSwgMHgxQkFELAorICAgIDB4OTYxQywgMHgwRERFLCAweDk2MUQsIDB4M0I5RSwgMHg5NjIxLCAweDFCQUYsIDB4OTYyOCwgMHgxQkIwLCAweDk2MkEsCisgICAgMHgwODU1LCAweDk2MkUsIDB4MUJCMSwgMHg5NjJGLCAweDFCQjIsIDB4OTYzMiwgMHgwRTc3LCAweDk2M0IsIDB4MEFDRCwKKyAgICAweDk2M0YsIDB4MDQ2OCwgMHg5NjQwLCAweDBCMkIsIDB4OTY0MSwgMHgzQjlGLCAweDk2NDIsIDB4MUJCMywgMHg5NjQ0LAorICAgIDB4MERERiwgMHg5NjRCLCAweDFCQjYsIDB4OTY0QywgMHgxQkI0LCAweDk2NEQsIDB4MDdGMSwgMHg5NjRGLCAweDFCQjUsCisgICAgMHg5NjUwLCAweDA3NzYsIDB4OTY1OCwgMHgzQkEwLCAweDk2NUIsIDB4MEUxNSwgMHg5NjVDLCAweDFCQjgsIDB4OTY1RCwKKyAgICAweDFCQkEsIDB4OTY1RSwgMHgxQkI5LCAweDk2NUYsIDB4MUJCQiwgMHg5NjYyLCAweDA0QzMsIDB4OTY2MywgMHgwQTFFLAorICAgIDB4OTY2NCwgMHgwOTg2LCAweDk2NjUsIDB4MDYxNSwgMHg5NjY2LCAweDFCQkMsIDB4OTY2QSwgMHgwRDFDLCAweDk2NkMsCisgICAgMHgxQkJFLCAweDk2NzAsIDB4MDRDNCwgMHg5NjcyLCAweDFCQkQsIDB4OTY3MywgMHgwQkUwLCAweDk2NzUsIDB4MEY5NSwKKyAgICAweDk2NzYsIDB4MEM4MywgMHg5Njc3LCAweDFCQjcsIDB4OTY3OCwgMHgwRjZFLCAweDk2N0EsIDB4MDc2NSwgMHg5NjdELAorICAgIDB4MEY0NSwgMHg5Njg0LCAweDNCQTEsIDB4OTY4NSwgMHgwNkYxLCAweDk2ODYsIDB4MEY3QywgMHg5Njg4LCAweDA2RkUsCisgICAgMHg5NjhBLCAweDBCNDIsIDB4OTY4QiwgMHgxODZDLCAweDk2OEQsIDB4MUJCRiwgMHg5NjhFLCAweDA1OEEsIDB4OTY4RiwKKyAgICAweDBBMzUsIDB4OTY5NCwgMHgwNUI0LCAweDk2OTUsIDB4MUJDMSwgMHg5Njk3LCAweDFCQzIsIDB4OTY5OCwgMHgxQkMwLAorICAgIDB4OTY5OSwgMHgwNzNBLCAweDk2OUIsIDB4MDg0RCwgMHg5NjlDLCAweDA5Q0IsIDB4OTY5RCwgMHgyMUYwLCAweDk2QTAsCisgICAgMHgwNEM1LCAweDk2QTMsIDB4MEZBMSwgMHg5NkE0LCAweDNCQTIsIDB4OTZBNywgMHgxQkM0LCAweDk2QTgsIDB4MUIwQiwKKyAgICAweDk2QTksIDB4M0JBMywgMHg5NkFBLCAweDFCQzMsIDB4OTZBRiwgMHgyMUYxLCAweDk2QjAsIDB4MUJDNywgMHg5NkIxLAorICAgIDB4MUJDNSwgMHg5NkIyLCAweDFCQzYsIDB4OTZCNCwgMHgxQkM4LCAweDk2QjYsIDB4MUJDOSwgMHg5NkI3LCAweDBGQjQsCisgICAgMHg5NkI4LCAweDFCQ0EsIDB4OTZCOSwgMHgxQkNCLCAweDk2QkIsIDB4MEE2RCwgMHg5NkJDLCAweDBENEYsIDB4OTZDMCwKKyAgICAweDBBNDMsIDB4OTZDMSwgMHgwNjIzLCAweDk2QzQsIDB4MEYyNCwgMHg5NkM1LCAweDA1NkQsIDB4OTZDNiwgMHgwOTQyLAorICAgIDB4OTZDNywgMHgwNzhGLCAweDk2QzksIDB4MUJDRSwgMHg5NkNCLCAweDFCQ0QsIDB4OTZDQywgMHgwOEMxLCAweDk2Q0QsCisgICAgMHgxQkNGLCAweDk2Q0UsIDB4MUJDQywgMHg5NkQxLCAweDA4NzYsIDB4OTZEMiwgMHgzQkE0LCAweDk2RDUsIDB4MUJEMywKKyAgICAweDk2RDYsIDB4MTk5MiwgMHg5NkQ5LCAweDEwRUIsIDB4OTZEQiwgMHgwQTNELCAweDk2REMsIDB4MUJEMSwgMHg5NkRFLAorICAgIDB4M0JBNiwgMHg5NkUyLCAweDBGNkQsIDB4OTZFMywgMHgwQ0M5LCAweDk2RTgsIDB4MDRDRCwgMHg5NkU5LCAweDNCQTcsCisgICAgMHg5NkVBLCAweDBBODcsIDB4OTZFQiwgMHgwOEUyLCAweDk2RjAsIDB4MEUwNywgMHg5NkYxLCAweDNCQTgsIDB4OTZGMiwKKyAgICAweDA0RTIsIDB4OTZGNiwgMHgwRkI1LCAweDk2RjcsIDB4MEY1NSwgMHg5NkY5LCAweDFCRDQsIDB4OTZGQiwgMHgwQzNGLAorICAgIDB4OTcwMCwgMHgwOTI3LCAweDk3MDIsIDB4M0JBOSwgMHg5NzA0LCAweDFCRDUsIDB4OTcwNiwgMHgxQkQ2LCAweDk3MDcsCisgICAgMHgwQTEyLCAweDk3MDgsIDB4MUJENywgMHg5NzA5LCAweDNCQUEsIDB4OTcwQSwgMHgwRkI2LCAweDk3MEQsIDB4MUJEMiwKKyAgICAweDk3MEUsIDB4MUJEOSwgMHg5NzBGLCAweDFCREIsIDB4OTcxMSwgMHgxQkRBLCAweDk3MTMsIDB4MUJEOCwgMHg5NzE2LAorICAgIDB4MUJEQywgMHg5NzE5LCAweDFCREQsIDB4OTcxQywgMHgwQUZDLCAweDk3MUUsIDB4MDU2MiwgMHg5NzI0LCAweDFCREUsCisgICAgMHg5NzI3LCAweDBFQzQsIDB4OTcyQSwgMHgxQkRGLCAweDk3MzAsIDB4MUJFMCwgMHg5NzMyLCAweDBGRDAsIDB4OTczMywKKyAgICAweDIxRjIsIDB4OTczOCwgMHgxNDE0LCAweDk3MzksIDB4MUJFMSwgMHg5NzNCLCAweDIxRjMsIDB4OTczRCwgMHgxQkUyLAorICAgIDB4OTczRSwgMHgxQkUzLCAweDk3NDIsIDB4MUJFNywgMHg5NzQzLCAweDIxRjQsIDB4OTc0NCwgMHgxQkU0LCAweDk3NDYsCisgICAgMHgxQkU1LCAweDk3NDgsIDB4MUJFNiwgMHg5NzQ5LCAweDFCRTgsIDB4OTc0RCwgMHgyMUY1LCAweDk3NEYsIDB4MjFGNiwKKyAgICAweDk3NTEsIDB4MjFGNywgMHg5NzUyLCAweDBBNjgsIDB4OTc1NSwgMHgyMUY4LCAweDk3NTYsIDB4MEYwMywgMHg5NzU5LAorICAgIDB4MEE2OSwgMHg5NzVBLCAweDNCQUIsIDB4OTc1QywgMHgxQkU5LCAweDk3NUUsIDB4MEQ4NywgMHg5NzYwLCAweDFCRUEsCisgICAgMHg5NzYxLCAweDFEMDYsIDB4OTc2MiwgMHgwRUQ4LCAweDk3NjMsIDB4M0JBQywgMHg5NzY0LCAweDFCRUIsIDB4OTc2NiwKKyAgICAweDFCRUMsIDB4OTc2OCwgMHgxQkVELCAweDk3NjksIDB4MDVCNSwgMHg5NzZCLCAweDFCRUYsIDB4OTc2RCwgMHgwQTFGLAorICAgIDB4OTc2RSwgMHgzQkFELCAweDk3NzEsIDB4MUJGMCwgMHg5NzczLCAweDNCQUUsIDB4OTc3NCwgMHgwNkZBLCAweDk3NzksCisgICAgMHgxQkYxLCAweDk3N0EsIDB4MUJGNSwgMHg5NzdDLCAweDFCRjMsIDB4OTc4MSwgMHgxQkY0LCAweDk3ODQsIDB4MDVEMSwKKyAgICAweDk3ODUsIDB4MUJGMiwgMHg5Nzg2LCAweDFCRjYsIDB4OTc4QiwgMHgxQkY3LCAweDk3OEQsIDB4MDQ4QywgMHg5NzhGLAorICAgIDB4MUJGOCwgMHg5NzkwLCAweDFCRjksIDB4OTc5OCwgMHgwOUNDLCAweDk3OUEsIDB4M0JBRiwgMHg5NzlDLCAweDFCRkEsCisgICAgMHg5N0EwLCAweDA2NjEsIDB4OTdBMiwgMHgzQkIwLCAweDk3QTMsIDB4MUJGRCwgMHg5N0E2LCAweDFCRkMsIDB4OTdBOCwKKyAgICAweDFCRkIsIDB4OTdBQiwgMHgxQTM0LCAweDk3QUQsIDB4MEUyQywgMHg5N0IzLCAweDFCRkUsIDB4OTdCNCwgMHgxQkZGLAorICAgIDB4OTdCNSwgMHgzQkIxLCAweDk3QjYsIDB4M0JCMiwgMHg5N0MzLCAweDFDMDAsIDB4OTdDNiwgMHgxQzAxLCAweDk3QzgsCisgICAgMHgxQzAyLCAweDk3Q0IsIDB4MUMwMywgMHg5N0QzLCAweDA2MTYsIDB4OTdEOSwgMHgzQkIzLCAweDk3REMsIDB4MUMwNCwKKyAgICAweDk3REUsIDB4M0JCNCwgMHg5N0VELCAweDFDMDUsIDB4OTdFRSwgMHgwQ0Q5LCAweDk3RjIsIDB4MUMwNywgMHg5N0YzLAorICAgIDB4MDUzQiwgMHg5N0Y0LCAweDNCQjUsIDB4OTdGNSwgMHgxQzBBLCAweDk3RjYsIDB4MUMwOSwgMHg5N0ZCLCAweDA0QzYsCisgICAgMHg5N0ZGLCAweDA2QjksIDB4OTgwMSwgMHgwRTE3LCAweDk4MDIsIDB4MEJENiwgMHg5ODAzLCAweDA4MTIsIDB4OTgwNSwKKyAgICAweDA3RjIsIDB4OTgwNiwgMHgwOTcxLCAweDk4MDgsIDB4MEEyMiwgMHg5ODBBLCAweDNCQjYsIDB4OTgwQywgMHgxQzBDLAorICAgIDB4OTgwRSwgMHgzQkI3LCAweDk4MEYsIDB4MUMwQiwgMHg5ODEwLCAweDBGMkMsIDB4OTgxMSwgMHgwNjI0LCAweDk4MTIsCisgICAgMHgwRDY2LCAweDk4MTMsIDB4MENCNCwgMHg5ODE3LCAweDBBNDIsIDB4OTgxOCwgMHgwRjk2LCAweDk4MUEsIDB4MDczMSwKKyAgICAweDk4MUUsIDB4M0JCOCwgMHg5ODIxLCAweDFDMEYsIDB4OTgyMywgMHgzQkI5LCAweDk4MjQsIDB4MUMwRSwgMHg5ODJCLAorICAgIDB4M0JCQSwgMHg5ODJDLCAweDBFNzksIDB4OTgyRCwgMHgwQzg0LCAweDk4MzAsIDB4MUU3MywgMHg5ODM0LCAweDA0RjIsCisgICAgMHg5ODM3LCAweDFDMTAsIDB4OTgzOCwgMHgxQzBELCAweDk4MzksIDB4MzdCMywgMHg5ODNCLCAweDBEQzMsIDB4OTgzQywKKyAgICAweDBGNTQsIDB4OTgzRCwgMHgxQzExLCAweDk4M0UsIDB4M0JCQiwgMHg5ODQ2LCAweDFDMTIsIDB4OTg0QiwgMHgxQzE0LAorICAgIDB4OTg0QywgMHgwQjRBLCAweDk4NEQsIDB4MDVCOSwgMHg5ODRFLCAweDA1QkEsIDB4OTg0RiwgMHgxQzEzLCAweDk4NTIsCisgICAgMHgzQkJDLCAweDk4NTMsIDB4M0JCRCwgMHg5ODU0LCAweDA2MjUsIDB4OTg1NSwgMHgwNzY2LCAweDk4NTcsIDB4MjFGOSwKKyAgICAweDk4NTgsIDB4MDYyNiwgMHg5ODU5LCAweDNCQkUsIDB4OTg1QSwgMHgxRTQ4LCAweDk4NUIsIDB4MEMzOSwgMHg5ODVFLAorICAgIDB4MEZBOCwgMHg5ODY1LCAweDIxRkEsIDB4OTg2NywgMHgwNzkwLCAweDk4NkIsIDB4MUMxNSwgMHg5ODZDLCAweDNCQkYsCisgICAgMHg5ODZGLCAweDFDMTYsIDB4OTg3MCwgMHgxQzE3LCAweDk4NzEsIDB4MUMxOCwgMHg5ODczLCAweDFDMUEsIDB4OTg3NCwKKyAgICAweDFDMTksIDB4OThBOCwgMHgwREU5LCAweDk4QUEsIDB4MUMxQiwgMHg5OEFGLCAweDFDMUMsIDB4OThCMSwgMHgxQzFELAorICAgIDB4OThCNiwgMHgxQzFFLCAweDk4QjgsIDB4M0JDMCwgMHg5OEJBLCAweDNCQzEsIDB4OThCRiwgMHgzQkMyLCAweDk4QzMsCisgICAgMHgxQzIwLCAweDk4QzQsIDB4MUMxRiwgMHg5OEM2LCAweDFDMjEsIDB4OThDOCwgMHgzQkMzLCAweDk4REIsIDB4MEQ4OCwKKyAgICAweDk4REMsIDB4MTgzOSwgMHg5OERGLCAweDA5RUYsIDB4OThFMCwgMHgzNjE4LCAweDk4RTIsIDB4MDY0QywgMHg5OEU1LAorICAgIDB4M0JDNCwgMHg5OEU5LCAweDFDMjIsIDB4OThFQiwgMHgxQzIzLCAweDk4RUQsIDB4MTBDMSwgMHg5OEVFLCAweDE0REEsCisgICAgMHg5OEVGLCAweDBENjcsIDB4OThGMiwgMHgwNEJGLCAweDk4RjQsIDB4MDQ3RiwgMHg5OEZDLCAweDA4QzIsIDB4OThGRCwKKyAgICAweDBFNUUsIDB4OThGRSwgMHgwOUU2LCAweDk5MDMsIDB4MUMyNCwgMHg5OTA1LCAweDBFRUIsIDB4OTkwOSwgMHgxQzI1LAorICAgIDB4OTkwQSwgMHgwRjQ2LCAweDk5MEMsIDB4MDRFNCwgMHg5OTEwLCAweDA4OEYsIDB4OTkxMiwgMHgxQzI2LCAweDk5MTMsCisgICAgMHgwNTZFLCAweDk5MTQsIDB4MUMyNywgMHg5OTE4LCAweDFDMjgsIDB4OTkxRCwgMHgxQzJBLCAweDk5MUUsIDB4MUMyQiwKKyAgICAweDk5MjAsIDB4MUMyRCwgMHg5OTIxLCAweDFDMjksIDB4OTkyNCwgMHgxQzJDLCAweDk5MjcsIDB4MjFGRCwgMHg5OTI4LAorICAgIDB4MDYxNywgMHg5OTJDLCAweDFDMkUsIDB4OTkyRSwgMHgxQzJGLCAweDk5MzIsIDB4M0JDNSwgMHg5OTMzLCAweDNCQzYsCisgICAgMHg5OTNELCAweDFDMzAsIDB4OTkzRSwgMHgxQzMxLCAweDk5NDAsIDB4M0JDNywgMHg5OTQyLCAweDFDMzIsIDB4OTk0NSwKKyAgICAweDFDMzQsIDB4OTk0OSwgMHgxQzMzLCAweDk5NEIsIDB4MUMzNiwgMHg5OTRDLCAweDFDMzksIDB4OTk0RCwgMHgzQkM4LAorICAgIDB4OTk1MCwgMHgxQzM1LCAweDk5NTEsIDB4MUMzNywgMHg5OTUyLCAweDFDMzgsIDB4OTk1NSwgMHgxQzNBLCAweDk5NTcsCisgICAgMHgwNkJBLCAweDk5NUMsIDB4M0JDOSwgMHg5OTVGLCAweDNCQ0EsIDB4OTk5NiwgMHgwOTFGLCAweDk5OTcsIDB4MUMzQiwKKyAgICAweDk5OTgsIDB4MUMzQywgMHg5OTk5LCAweDA3RjMsIDB4OTk5RSwgMHgyMUZGLCAweDk5QTUsIDB4MUMzRCwgMHg5OUE4LAorICAgIDB4MDU5QywgMHg5OUFDLCAweDBEMDUsIDB4OTlBRCwgMHgxQzNFLCAweDk5QUUsIDB4MUMzRiwgMHg5OUIxLCAweDNCQ0IsCisgICAgMHg5OUIzLCAweDBCOTgsIDB4OTlCNCwgMHgwQ0MzLCAweDk5QjksIDB4M0JDQywgMHg5OUJBLCAweDNCQ0QsIDB4OTlCQywKKyAgICAweDFDNDAsIDB4OTlDMSwgMHgwRDMzLCAweDk5QzQsIDB4MEIyQywgMHg5OUM1LCAweDA0RkEsIDB4OTlDNiwgMHgwNkU2LAorICAgIDB4OTlDOCwgMHgwNkU3LCAweDk5QzksIDB4M0JDRSwgMHg5OUQwLCAweDBCQjEsIDB4OTlEMSwgMHgxQzQ1LCAweDk5RDIsCisgICAgMHgwNkU4LCAweDk5RDUsIDB4MDU2RiwgMHg5OUQ4LCAweDFDNDQsIDB4OTlEQiwgMHgxQzQyLCAweDk5REQsIDB4MUM0MywKKyAgICAweDk5REYsIDB4MUM0MSwgMHg5OUUyLCAweDFDNEYsIDB4OTlFRCwgMHgxQzQ2LCAweDk5RUUsIDB4MUM0NywgMHg5OUYxLAorICAgIDB4MUM0OCwgMHg5OUYyLCAweDFDNDksIDB4OTlGOCwgMHgxQzRCLCAweDk5RkIsIDB4MUM0QSwgMHg5OUZGLCAweDA5NjMsCisgICAgMHg5QTAxLCAweDFDNEMsIDB4OUEwMiwgMHgzQkNGLCAweDlBMDUsIDB4MUM0RSwgMHg5QTA4LCAweDM3QkEsIDB4OUEwRSwKKyAgICAweDA2NEQsIDB4OUEwRiwgMHgxQzRELCAweDlBMTIsIDB4MEFGRCwgMHg5QTEzLCAweDA3NjcsIDB4OUExNiwgMHgzQkQwLAorICAgIDB4OUExOSwgMHgxQzUwLCAweDlBMjQsIDB4M0JEMSwgMHg5QTI3LCAweDNCRDIsIDB4OUEyOCwgMHgwQjJELCAweDlBMkIsCisgICAgMHgxQzUxLCAweDlBMkQsIDB4M0JEMywgMHg5QTJFLCAweDNCRDQsIDB4OUEzMCwgMHgwQzg1LCAweDlBMzYsIDB4M0JENSwKKyAgICAweDlBMzcsIDB4MUM1MiwgMHg5QTM4LCAweDNCRDYsIDB4OUEzRSwgMHgxQzU3LCAweDlBNDAsIDB4MUM1NSwgMHg5QTQyLAorICAgIDB4MUM1NCwgMHg5QTQzLCAweDFDNTYsIDB4OUE0NSwgMHgxQzUzLCAweDlBNEEsIDB4M0JENywgMHg5QTRELCAweDFDNTksCisgICAgMHg5QTRFLCAweDIyMDAsIDB4OUE1MiwgMHgxRTJGLCAweDlBNTUsIDB4MUM1OCwgMHg5QTU2LCAweDNCRDgsIDB4OUE1NywKKyAgICAweDFDNUIsIDB4OUE1QSwgMHgwNkJCLCAweDlBNUIsIDB4MUM1QSwgMHg5QTVGLCAweDFDNUMsIDB4OUE2MiwgMHgxQzVELAorICAgIDB4OUE2NCwgMHgxQzVGLCAweDlBNjUsIDB4MUM1RSwgMHg5QTY5LCAweDFDNjAsIDB4OUE2QSwgMHgxQzYyLCAweDlBNkIsCisgICAgMHgxQzYxLCAweDlBQTgsIDB4MDgwRSwgMHg5QUFELCAweDFDNjMsIDB4OUFCMCwgMHgxQzY0LCAweDlBQjUsIDB4M0JEOSwKKyAgICAweDlBQjYsIDB4M0JEQSwgMHg5QUI4LCAweDA1OUEsIDB4OUFCQywgMHgxQzY1LCAweDlBQzAsIDB4MUM2NiwgMHg5QUM0LAorICAgIDB4MEEzNywgMHg5QUNGLCAweDFDNjcsIDB4OUFEMSwgMHgxQzY4LCAweDlBRDMsIDB4MUM2OSwgMHg5QUQ0LCAweDFDNkEsCisgICAgMHg5QUQ4LCAweDA3RjQsIDB4OUFEOSwgMHgyMjAxLCAweDlBREMsIDB4MjIwMiwgMHg5QURFLCAweDFDNkIsIDB4OUFERiwKKyAgICAweDFDNkMsIDB4OUFFMiwgMHgxQzZELCAweDlBRTMsIDB4MUM2RSwgMHg5QUU2LCAweDFDNkYsIDB4OUFFQSwgMHgwRDQ1LAorICAgIDB4OUFFQiwgMHgxQzcxLCAweDlBRUQsIDB4MEQ5OCwgMHg5QUVFLCAweDFDNzIsIDB4OUFFRiwgMHgxQzcwLCAweDlBRjEsCisgICAgMHgxQzc0LCAweDlBRjQsIDB4MUM3MywgMHg5QUY3LCAweDFDNzUsIDB4OUFGOSwgMHgzQkRCLCAweDlBRkIsIDB4MUM3NiwKKyAgICAweDlCMDMsIDB4M0JEQywgMHg5QjA2LCAweDFDNzcsIDB4OUIxOCwgMHgxQzc4LCAweDlCMUEsIDB4MUM3OSwgMHg5QjFGLAorICAgIDB4MUM3QSwgMHg5QjIwLCAweDNCREQsIDB4OUIyMiwgMHgxQzdCLCAweDlCMjMsIDB4MUM3QywgMHg5QjI1LCAweDFDN0QsCisgICAgMHg5QjI3LCAweDFDN0UsIDB4OUIyOCwgMHgxQzdGLCAweDlCMjksIDB4MUM4MCwgMHg5QjJBLCAweDFDODEsIDB4OUIyRCwKKyAgICAweDM0M0MsIDB4OUIyRSwgMHgxQzgyLCAweDlCMkYsIDB4MUM4MywgMHg5QjMxLCAweDE0RDQsIDB4OUIzMiwgMHgxQzg0LAorICAgIDB4OUIzMywgMHgzQkRFLCAweDlCMzQsIDB4M0JERiwgMHg5QjNCLCAweDE3QTksIDB4OUIzQywgMHgwNjRFLCAweDlCNDEsCisgICAgMHgwNTdGLCAweDlCNDIsIDB4MDgyMiwgMHg5QjQzLCAweDFDODYsIDB4OUI0NCwgMHgxQzg1LCAweDlCNDUsIDB4MEVCMSwKKyAgICAweDlCNEQsIDB4MUM4OCwgMHg5QjRFLCAweDFDODksIDB4OUI0RiwgMHgxQzg3LCAweDlCNTEsIDB4MUM4QSwgMHg5QjU0LAorICAgIDB4MEU5MCwgMHg5QjU4LCAweDFDOEIsIDB4OUI1QSwgMHgwNjk1LCAweDlCNkYsIDB4MEZDQiwgMHg5QjcyLCAweDIyMDQsCisgICAgMHg5QjczLCAweDNCRTAsIDB4OUI3NCwgMHgxQzhDLCAweDlCNzUsIDB4MjIwMywgMHg5Qjc5LCAweDNCRTEsIDB4OUI4MywKKyAgICAweDFDOEUsIDB4OUI4RSwgMHgwNDgyLCAweDlCOEYsIDB4MjIwNSwgMHg5QjkxLCAweDFDOEYsIDB4OUI5MiwgMHgwREZCLAorICAgIDB4OUI5MywgMHgxQzhELCAweDlCOTYsIDB4MUM5MCwgMHg5Qjk3LCAweDFDOTEsIDB4OUI5RiwgMHgxQzkyLCAweDlCQTAsCisgICAgMHgxQzkzLCAweDlCQTcsIDB4M0JFMiwgMHg5QkE4LCAweDFDOTQsIDB4OUJBQSwgMHgwRTlDLCAweDlCQUIsIDB4MDg3QiwKKyAgICAweDlCQUQsIDB4MDg2QSwgMHg5QkFFLCAweDBBQjEsIDB4OUJCMSwgMHgyMjA2LCAweDlCQjQsIDB4MUM5NSwgMHg5QkI5LAorICAgIDB4MUM5OCwgMHg5QkJCLCAweDIyMDcsIDB4OUJDMCwgMHgxQzk2LCAweDlCQzEsIDB4M0JFMywgMHg5QkM2LCAweDFDOTksCisgICAgMHg5QkM3LCAweDNCRTQsIDB4OUJDOSwgMHgwN0E1LCAweDlCQ0EsIDB4MUM5NywgMHg5QkNGLCAweDFDOUEsIDB4OUJEMSwKKyAgICAweDFDOUIsIDB4OUJEMiwgMHgxQzlDLCAweDlCRDQsIDB4MUNBMCwgMHg5QkQ2LCAweDA4NzgsIDB4OUJENywgMHgzQkU1LAorICAgIDB4OUJEQiwgMHgwQjQ0LCAweDlCREYsIDB4MzdCRiwgMHg5QkUxLCAweDFDQTEsIDB4OUJFMiwgMHgxQzlFLCAweDlCRTMsCisgICAgMHgxQzlELCAweDlCRTQsIDB4MUM5RiwgMHg5QkU3LCAweDNCRTYsIDB4OUJFOCwgMHgwNzM1LCAweDlCRUIsIDB4M0JFNywKKyAgICAweDlCRjAsIDB4MUNBNSwgMHg5QkYxLCAweDFDQTQsIDB4OUJGMiwgMHgxQ0EzLCAweDlCRjUsIDB4MDQ3NywgMHg5QkY3LAorICAgIDB4M0JFOCwgMHg5QkZBLCAweDNCRTksIDB4OUJGRCwgMHgzQkVBLCAweDlDMDAsIDB4MjIwOCwgMHg5QzA0LCAweDFDQUYsCisgICAgMHg5QzA2LCAweDFDQUIsIDB4OUMwOCwgMHgxQ0FDLCAweDlDMDksIDB4MUNBOCwgMHg5QzBBLCAweDFDQUUsIDB4OUMwQiwKKyAgICAweDNCRUIsIDB4OUMwQywgMHgxQ0FBLCAweDlDMEQsIDB4MDVDMCwgMHg5QzEwLCAweDBGRjIsIDB4OUMxMiwgMHgxQ0FELAorICAgIDB4OUMxMywgMHgxQ0E5LCAweDlDMTQsIDB4MUNBNywgMHg5QzE1LCAweDFDQTYsIDB4OUMxQiwgMHgxQ0IxLCAweDlDMjEsCisgICAgMHgxQ0I0LCAweDlDMjQsIDB4MUNCMywgMHg5QzI1LCAweDFDQjIsIDB4OUMyNywgMHgzQkVDLCAweDlDMkEsIDB4M0JFRCwKKyAgICAweDlDMkQsIDB4MERCQiwgMHg5QzJFLCAweDFDQjAsIDB4OUMyRiwgMHgwNEI3LCAweDlDMzAsIDB4MUNCNSwgMHg5QzMyLAorICAgIDB4MUNCNywgMHg5QzM2LCAweDNCRUUsIDB4OUMzOSwgMHgwNUNELCAweDlDM0EsIDB4MUNBMiwgMHg5QzNCLCAweDA0RDksCisgICAgMHg5QzNFLCAweDFDQjksIDB4OUM0MSwgMHgzQkVGLCAweDlDNDYsIDB4MUNCOCwgMHg5QzQ3LCAweDFDQjYsIDB4OUM0OCwKKyAgICAweDBCNkIsIDB4OUM1MiwgMHgwRTlFLCAweDlDNTMsIDB4M0JGMCwgMHg5QzU3LCAweDBGQTIsIDB4OUM1QSwgMHgxQ0JBLAorICAgIDB4OUM2MCwgMHgxQ0JCLCAweDlDNjMsIDB4M0JGMSwgMHg5QzY3LCAweDFDQkMsIDB4OUM2QSwgMHgzQkYyLCAweDlDNzYsCisgICAgMHgxQ0JELCAweDlDNzcsIDB4M0JGMywgMHg5Qzc4LCAweDFDQkUsIDB4OUNFNSwgMHgwQkQ3LCAweDlDRTcsIDB4MUNCRiwKKyAgICAweDlDRTksIDB4MEQ0QiwgMHg5Q0VCLCAweDFDQzQsIDB4OUNFQywgMHgxQ0MwLCAweDlDRjAsIDB4MUNDMSwgMHg5Q0YzLAorICAgIDB4MEU1RiwgMHg5Q0Y0LCAweDBFRDAsIDB4OUNGNiwgMHgwQ0E4LCAweDlEMDIsIDB4M0JGNCwgMHg5RDAzLCAweDFDQzUsCisgICAgMHg5RDA2LCAweDFDQzYsIDB4OUQwNywgMHgwQzk2LCAweDlEMDgsIDB4MUNDMywgMHg5RDA5LCAweDFDQzIsIDB4OUQwRSwKKyAgICAweDA1MkEsIDB4OUQxMiwgMHgxQ0NFLCAweDlEMTUsIDB4MUNDRCwgMHg5RDFCLCAweDA1MTcsIDB4OUQxRiwgMHgxQ0NCLAorICAgIDB4OUQyMywgMHgxQ0NBLCAweDlEMjYsIDB4MUNDOCwgMHg5RDI4LCAweDA1RDksIDB4OUQyQSwgMHgxQ0M3LCAweDlEMkIsCisgICAgMHgwOERFLCAweDlEMkMsIDB4MDUyOSwgMHg5RDNCLCAweDA3RjUsIDB4OUQzRSwgMHgxQ0QxLCAweDlEM0YsIDB4MUNEMCwKKyAgICAweDlENDEsIDB4MUNDRiwgMHg5RDQyLCAweDNCRjUsIDB4OUQ0NCwgMHgxQ0NDLCAweDlENDYsIDB4MUNEMiwgMHg5RDQ3LAorICAgIDB4M0JGNiwgMHg5RDQ4LCAweDFDRDMsIDB4OUQ1MCwgMHgxQ0Q4LCAweDlENTEsIDB4MUNENywgMHg5RDU5LCAweDFDRDksCisgICAgMHg5RDVDLCAweDA0Q0YsIDB4OUQ1RCwgMHgxQ0Q0LCAweDlENUUsIDB4MUNENSwgMHg5RDYwLCAweDA4MDYsIDB4OUQ2MSwKKyAgICAweDBFQzUsIDB4OUQ2MywgMHgzQkY3LCAweDlENjQsIDB4MUNENiwgMHg5RDY5LCAweDNCRjgsIDB4OUQ2QiwgMHgyMjBBLAorICAgIDB4OUQ2QywgMHgwRTYwLCAweDlENkYsIDB4MUNERSwgMHg5RDcwLCAweDIyMDksIDB4OUQ3MiwgMHgxQ0RBLCAweDlEN0EsCisgICAgMHgxQ0RGLCAweDlEN0MsIDB4M0JGOSwgMHg5RDdFLCAweDNCRkEsIDB4OUQ4NywgMHgxQ0RDLCAweDlEODksIDB4MUNEQiwKKyAgICAweDlEOEQsIDB4M0JGQiwgMHg5RDhGLCAweDA3MzIsIDB4OUQ5QSwgMHgxQ0UwLCAweDlEQTQsIDB4MUNFMSwgMHg5REE5LAorICAgIDB4MUNFMiwgMHg5REFCLCAweDFDREQsIDB4OURBRiwgMHgxQ0M5LCAweDlEQjEsIDB4M0JGQywgMHg5REIyLCAweDFDRTMsCisgICAgMHg5REI0LCAweDBCRkQsIDB4OURCOCwgMHgxQ0U3LCAweDlEQkEsIDB4MUNFOCwgMHg5REJCLCAweDFDRTYsIDB4OURDMSwKKyAgICAweDFDRTUsIDB4OURDMiwgMHgxQ0VCLCAweDlEQzMsIDB4M0JGRCwgMHg5REM0LCAweDFDRTQsIDB4OURDNiwgMHgxQ0U5LAorICAgIDB4OURDNywgMHgzQkZFLCAweDlEQ0YsIDB4MUNFQSwgMHg5REQzLCAweDFDRUQsIDB4OURENiwgMHgzQkZGLCAweDlERDcsCisgICAgMHgxRERFLCAweDlERDksIDB4MUNFQywgMHg5RERGLCAweDNDMDAsIDB4OURFNiwgMHgxQ0VGLCAweDlERUIsIDB4M0MwMSwKKyAgICAweDlERUQsIDB4MUNGMCwgMHg5REVGLCAweDFDRjEsIDB4OURGMiwgMHgwRkVGLCAweDlERjQsIDB4M0MwMiwgMHg5REY4LAorICAgIDB4MUNFRSwgMHg5REY5LCAweDBCNEIsIDB4OURGQSwgMHgwODVELCAweDlERkQsIDB4MUNGMiwgMHg5RTE1LCAweDNDMDMsCisgICAgMHg5RTE5LCAweDIyMEMsIDB4OUUxQSwgMHgxQ0YzLCAweDlFMUIsIDB4MUNGNCwgMHg5RTFELCAweDNDMDQsIDB4OUUxRSwKKyAgICAweDFDRjUsIDB4OUU3NSwgMHgxQ0Y2LCAweDlFNzgsIDB4MDc2OCwgMHg5RTc5LCAweDFDRjcsIDB4OUU3QywgMHgxREZELAorICAgIDB4OUU3RCwgMHgxQ0Y4LCAweDlFN0YsIDB4MDhEQiwgMHg5RTgxLCAweDFDRjksIDB4OUU4OCwgMHgxQ0ZBLCAweDlFOEIsCisgICAgMHgxQ0ZCLCAweDlFOEMsIDB4MUNGQywgMHg5RTkxLCAweDFDRkYsIDB4OUU5MiwgMHgxQ0ZELCAweDlFOTMsIDB4MEZFMiwKKyAgICAweDlFOTUsIDB4MUNGRSwgMHg5RTk3LCAweDBGQjcsIDB4OUU5RCwgMHgxRDAwLCAweDlFOUYsIDB4MEZBMywgMHg5RUE0LAorICAgIDB4M0MwNSwgMHg5RUE1LCAweDFEMDEsIDB4OUVBNiwgMHgwRDM0LCAweDlFQTgsIDB4M0MwNiwgMHg5RUE5LCAweDFEMDIsCisgICAgMHg5RUFBLCAweDFEMDQsIDB4OUVBQywgMHgzQzA3LCAweDlFQUQsIDB4MUQwNSwgMHg5RUI0LCAweDFFMDIsIDB4OUVCNSwKKyAgICAweDFFNzUsIDB4OUVCOCwgMHgxRDAzLCAweDlFQjksIDB4MDdGRiwgMHg5RUJBLCAweDBFRDksIDB4OUVCQiwgMHgwRTkxLAorICAgIDB4OUVCQywgMHgxMjg0LCAweDlFQkUsIDB4MTRGRiwgMHg5RUJGLCAweDBFQTksIDB4OUVDMywgMHgzNDBCLCAweDlFQzQsCisgICAgMHgwNTJCLCAweDlFQ0MsIDB4MUQwNywgMHg5RUNELCAweDA2NkEsIDB4OUVDRSwgMHgxRDA4LCAweDlFQ0YsIDB4MUQwOSwKKyAgICAweDlFRDAsIDB4MUQwQSwgMHg5RUQxLCAweDIyMEQsIDB4OUVEMiwgMHgwODA3LCAweDlFRDQsIDB4MUQwQiwgMHg5RUQ4LAorICAgIDB4MTYwRCwgMHg5RUQ5LCAweDBFRTcsIDB4OUVEQiwgMHgwQjQzLCAweDlFREMsIDB4MUQwQywgMHg5RURELCAweDFEMEUsCisgICAgMHg5RURFLCAweDFEMEQsIDB4OUVFMCwgMHgxRDBGLCAweDlFRTUsIDB4MUQxMCwgMHg5RUU3LCAweDNDMDgsIDB4OUVFOCwKKyAgICAweDFEMTEsIDB4OUVFRSwgMHgzQzA5LCAweDlFRUYsIDB4MUQxMiwgMHg5RUY0LCAweDFEMTMsIDB4OUVGNiwgMHgxRDE0LAorICAgIDB4OUVGNywgMHgxRDE1LCAweDlFRjksIDB4MUQxNiwgMHg5RUZCLCAweDFEMTcsIDB4OUVGQywgMHgxRDE4LCAweDlFRkQsCisgICAgMHgxRDE5LCAweDlGMDcsIDB4MUQxQSwgMHg5RjA4LCAweDFEMUIsIDB4OUYwRSwgMHgwQzFFLCAweDlGMTAsIDB4M0MwQSwKKyAgICAweDlGMTIsIDB4M0MwQiwgMHg5RjEzLCAweDA3OTEsIDB4OUYxNSwgMHgxRDFELCAweDlGMTcsIDB4M0MwQywgMHg5RjE5LAorICAgIDB4M0MwRCwgMHg5RjIwLCAweDBBQ0YsIDB4OUYyMSwgMHgxRDFFLCAweDlGMkMsIDB4MUQxRiwgMHg5RjJGLCAweDNDMEUsCisgICAgMHg5RjM3LCAweDNDMEYsIDB4OUYzOSwgMHgzQzEwLCAweDlGM0IsIDB4MEQ5MywgMHg5RjNFLCAweDFEMjAsIDB4OUY0MSwKKyAgICAweDNDMTEsIDB4OUY0NSwgMHgzQzEyLCAweDlGNEEsIDB4MUQyMSwgMHg5RjRCLCAweDE3MEEsIDB4OUY0RSwgMHgxQTdCLAorICAgIDB4OUY0RiwgMHgxQzA2LCAweDlGNTIsIDB4MUQyMiwgMHg5RjU0LCAweDFEMjMsIDB4OUY1NywgMHgzQzEzLCAweDlGNUYsCisgICAgMHgxRDI1LCAweDlGNjAsIDB4MUQyNiwgMHg5RjYxLCAweDFEMjcsIDB4OUY2MiwgMHgwRkI4LCAweDlGNjMsIDB4MUQyNCwKKyAgICAweDlGNjYsIDB4MUQyOCwgMHg5RjY3LCAweDFEMjksIDB4OUY2OCwgMHgzQzE0LCAweDlGNkEsIDB4MUQyQiwgMHg5RjZDLAorICAgIDB4MUQyQSwgMHg5RjcxLCAweDNDMTUsIDB4OUY3MiwgMHgxRDJELCAweDlGNzUsIDB4M0MxNiwgMHg5Rjc2LCAweDFEMkUsCisgICAgMHg5Rjc3LCAweDFEMkMsIDB4OUY4RCwgMHgwRjdFLCAweDlGOTAsIDB4M0MxNywgMHg5Rjk0LCAweDNDMTgsIDB4OUY5NSwKKyAgICAweDFEMkYsIDB4OUY5QywgMHgxRDMwLCAweDlGOUQsIDB4MTcyNywgMHg5RkEwLCAweDFEMzEsIDB4OUZBMiwgMHgzQzE5LAorICAgIDB4RjkyOSwgMHgyMTI5LCAweEY5REMsIDB4MjFFRSwgMHhGQTBFLCAweDIwREEsIDB4RkEwRiwgMHgyMEU1LCAweEZBMTAsCisgICAgMHgyMEU2LCAweEZBMTEsIDB4MjBGQiwgMHhGQTEyLCAweDIxMjEsIDB4RkExMywgMHgyMTMxLCAweEZBMTQsIDB4MjEzMywKKyAgICAweEZBMTUsIDB4MjE1RSwgMHhGQTE2LCAweDIxNjQsIDB4RkExNywgMHgyMTdCLCAweEZBMTgsIDB4MjE4MywgMHhGQTE5LAorICAgIDB4MjE4NCwgMHhGQTFBLCAweDIxODUsIDB4RkExQiwgMHgyMTg3LCAweEZBMUMsIDB4MjE4QiwgMHhGQTFELCAweDIxOEUsCisgICAgMHhGQTFFLCAweDIxOTcsIDB4RkExRiwgMHgyMUEyLCAweEZBMjAsIDB4MjFBNCwgMHhGQTIxLCAweDIxQTUsIDB4RkEyMiwKKyAgICAweDIxQUUsIDB4RkEyMywgMHgyMUI2LCAweEZBMjQsIDB4MjFCOCwgMHhGQTI1LCAweDIxQjksIDB4RkEyNiwgMHgyMUJDLAorICAgIDB4RkEyNywgMHgyMUQ4LCAweEZBMjgsIDB4MjFERiwgMHhGQTI5LCAweDIxRUYsIDB4RkEyQSwgMHgyMUZCLCAweEZBMkIsCisgICAgMHgyMUZDLCAweEZBMkMsIDB4MjFGRSwgMHhGQTJELCAweDIyMEIsIDB4RkIwMCwgMHgyNDhFLCAweEZCMDEsIDB4MDA3MCwKKyAgICAweEZCMDIsIDB4MDA3MSwgMHhGQjAzLCAweDI0OEYsIDB4RkIwNCwgMHgyNDkwLCAweEZFMzAsIDB4MUVEQSwgMHhGRTMxLAorICAgIDB4MUVENCwgMHhGRTMyLCAweDFFRDUsIDB4RkUzMywgMHgxRUQyLCAweEZFMzUsIDB4MUVEQiwgMHhGRTM2LCAweDFFREMsCisgICAgMHhGRTM3LCAweDFFRTEsIDB4RkUzOCwgMHgxRUUyLCAweEZFMzksIDB4MUVERCwgMHhGRTNBLCAweDFFREUsIDB4RkUzQiwKKyAgICAweDFFRUIsIDB4RkUzQywgMHgxRUVDLCAweEZFM0QsIDB4MUVFNSwgMHhGRTNFLCAweDFFRTYsIDB4RkUzRiwgMHgxRUUzLAorICAgIDB4RkU0MCwgMHgxRUU0LCAweEZFNDEsIDB4MUVFNywgMHhGRTQyLCAweDFFRTgsIDB4RkU0MywgMHgxRUU5LCAweEZFNDQsCisgICAgMHgxRUVBLCAweEZGMDEsIDB4MDI4MiwgMHhGRjAyLCAweDFGNDcsIDB4RkYwMywgMHgwMkNDLCAweEZGMDQsIDB4MDJDOCwKKyAgICAweEZGMDUsIDB4MDJDQiwgMHhGRjA2LCAweDAyQ0QsIDB4RkYwNywgMHgxRjQ2LCAweEZGMDgsIDB4MDJBMiwgMHhGRjA5LAorICAgIDB4MDJBMywgMHhGRjBBLCAweDAyQ0UsIDB4RkYwQiwgMHgwMkI0LCAweEZGMEMsIDB4MDI3QywgMHhGRjBELCAweDAyQjUsCisgICAgMHhGRjBFLCAweDAyN0QsIDB4RkYwRiwgMHgwMjk3LCAweEZGMTAsIDB4MDMwQywgMHhGRjExLCAweDAzMEQsIDB4RkYxMiwKKyAgICAweDAzMEUsIDB4RkYxMywgMHgwMzBGLCAweEZGMTQsIDB4MDMxMCwgMHhGRjE1LCAweDAzMTEsIDB4RkYxNiwgMHgwMzEyLAorICAgIDB4RkYxNywgMHgwMzEzLCAweEZGMTgsIDB4MDMxNCwgMHhGRjE5LCAweDAzMTUsIDB4RkYxQSwgMHgwMjdGLCAweEZGMUIsCisgICAgMHgwMjgwLCAweEZGMUMsIDB4MDJCQiwgMHhGRjFELCAweDAyQjksIDB4RkYxRSwgMHgwMkJDLCAweEZGMUYsIDB4MDI4MSwKKyAgICAweEZGMjAsIDB4MDJDRiwgMHhGRjIxLCAweDAzMTYsIDB4RkYyMiwgMHgwMzE3LCAweEZGMjMsIDB4MDMxOCwgMHhGRjI0LAorICAgIDB4MDMxOSwgMHhGRjI1LCAweDAzMUEsIDB4RkYyNiwgMHgwMzFCLCAweEZGMjcsIDB4MDMxQywgMHhGRjI4LCAweDAzMUQsCisgICAgMHhGRjI5LCAweDAzMUUsIDB4RkYyQSwgMHgwMzFGLCAweEZGMkIsIDB4MDMyMCwgMHhGRjJDLCAweDAzMjEsIDB4RkYyRCwKKyAgICAweDAzMjIsIDB4RkYyRSwgMHgwMzIzLCAweEZGMkYsIDB4MDMyNCwgMHhGRjMwLCAweDAzMjUsIDB4RkYzMSwgMHgwMzI2LAorICAgIDB4RkYzMiwgMHgwMzI3LCAweEZGMzMsIDB4MDMyOCwgMHhGRjM0LCAweDAzMjksIDB4RkYzNSwgMHgwMzJBLCAweEZGMzYsCisgICAgMHgwMzJCLCAweEZGMzcsIDB4MDMyQywgMHhGRjM4LCAweDAzMkQsIDB4RkYzOSwgMHgwMzJFLCAweEZGM0EsIDB4MDMyRiwKKyAgICAweEZGM0IsIDB4MDJBNiwgMHhGRjNDLCAweDAyOTgsIDB4RkYzRCwgMHgwMkE3LCAweEZGM0UsIDB4MDI4OCwgMHhGRjNGLAorICAgIDB4MDI4QSwgMHhGRjQwLCAweDAyODYsIDB4RkY0MSwgMHgwMzMwLCAweEZGNDIsIDB4MDMzMSwgMHhGRjQzLCAweDAzMzIsCisgICAgMHhGRjQ0LCAweDAzMzMsIDB4RkY0NSwgMHgwMzM0LCAweEZGNDYsIDB4MDMzNSwgMHhGRjQ3LCAweDAzMzYsIDB4RkY0OCwKKyAgICAweDAzMzcsIDB4RkY0OSwgMHgwMzM4LCAweEZGNEEsIDB4MDMzOSwgMHhGRjRCLCAweDAzM0EsIDB4RkY0QywgMHgwMzNCLAorICAgIDB4RkY0RCwgMHgwMzNDLCAweEZGNEUsIDB4MDMzRCwgMHhGRjRGLCAweDAzM0UsIDB4RkY1MCwgMHgwMzNGLCAweEZGNTEsCisgICAgMHgwMzQwLCAweEZGNTIsIDB4MDM0MSwgMHhGRjUzLCAweDAzNDIsIDB4RkY1NCwgMHgwMzQzLCAweEZGNTUsIDB4MDM0NCwKKyAgICAweEZGNTYsIDB4MDM0NSwgMHhGRjU3LCAweDAzNDYsIDB4RkY1OCwgMHgwMzQ3LCAweEZGNTksIDB4MDM0OCwgMHhGRjVBLAorICAgIDB4MDM0OSwgMHhGRjVCLCAweDAyQTgsIDB4RkY1QywgMHgwMjlCLCAweEZGNUQsIDB4MDJBOSwgMHhGRjVFLCAweDAyOTksCisgICAgMHhGRjYxLCAweDAxNDcsIDB4RkY2MiwgMHgwMTQ4LCAweEZGNjMsIDB4MDE0OSwgMHhGRjY0LCAweDAxNEEsIDB4RkY2NSwKKyAgICAweDAxNEIsIDB4RkY2NiwgMHgwMTRDLCAweEZGNjcsIDB4MDE0RCwgMHhGRjY4LCAweDAxNEUsIDB4RkY2OSwgMHgwMTRGLAorICAgIDB4RkY2QSwgMHgwMTUwLCAweEZGNkIsIDB4MDE1MSwgMHhGRjZDLCAweDAxNTIsIDB4RkY2RCwgMHgwMTUzLCAweEZGNkUsCisgICAgMHgwMTU0LCAweEZGNkYsIDB4MDE1NSwgMHhGRjcwLCAweDAxNTYsIDB4RkY3MSwgMHgwMTU3LCAweEZGNzIsIDB4MDE1OCwKKyAgICAweEZGNzMsIDB4MDE1OSwgMHhGRjc0LCAweDAxNUEsIDB4RkY3NSwgMHgwMTVCLCAweEZGNzYsIDB4MDE1QywgMHhGRjc3LAorICAgIDB4MDE1RCwgMHhGRjc4LCAweDAxNUUsIDB4RkY3OSwgMHgwMTVGLCAweEZGN0EsIDB4MDE2MCwgMHhGRjdCLCAweDAxNjEsCisgICAgMHhGRjdDLCAweDAxNjIsIDB4RkY3RCwgMHgwMTYzLCAweEZGN0UsIDB4MDE2NCwgMHhGRjdGLCAweDAxNjUsIDB4RkY4MCwKKyAgICAweDAxNjYsIDB4RkY4MSwgMHgwMTY3LCAweEZGODIsIDB4MDE2OCwgMHhGRjgzLCAweDAxNjksIDB4RkY4NCwgMHgwMTZBLAorICAgIDB4RkY4NSwgMHgwMTZCLCAweEZGODYsIDB4MDE2QywgMHhGRjg3LCAweDAxNkQsIDB4RkY4OCwgMHgwMTZFLCAweEZGODksCisgICAgMHgwMTZGLCAweEZGOEEsIDB4MDE3MCwgMHhGRjhCLCAweDAxNzEsIDB4RkY4QywgMHgwMTcyLCAweEZGOEQsIDB4MDE3MywKKyAgICAweEZGOEUsIDB4MDE3NCwgMHhGRjhGLCAweDAxNzUsIDB4RkY5MCwgMHgwMTc2LCAweEZGOTEsIDB4MDE3NywgMHhGRjkyLAorICAgIDB4MDE3OCwgMHhGRjkzLCAweDAxNzksIDB4RkY5NCwgMHgwMTdBLCAweEZGOTUsIDB4MDE3QiwgMHhGRjk2LCAweDAxN0MsCisgICAgMHhGRjk3LCAweDAxN0QsIDB4RkY5OCwgMHgwMTdFLCAweEZGOTksIDB4MDE3RiwgMHhGRjlBLCAweDAxODAsIDB4RkY5QiwKKyAgICAweDAxODEsIDB4RkY5QywgMHgwMTgyLCAweEZGOUQsIDB4MDE4MywgMHhGRjlFLCAweDAxODQsIDB4RkY5RiwgMHgwMTg1LAorICAgIDB4RkZFMCwgMHgwMkM5LCAweEZGRTEsIDB4MDJDQSwgMHhGRkUyLCAweDAyRUYsIDB4RkZFMywgMHgwMjg5LCAweEZGRTQsCisgICAgMHgxRjQ1LCAweEZGRTUsIDB4MDJDNywgMHhGRkU4LCAweDAxNDMsCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9VbmlKSVMtVUNTMi1WXzQuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9VbmlKSVMtVUNTMi1WXzQuY3BwCmluZGV4IDkxNjYzMWIuLjE5MDY2ZDcgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvVW5pSklTLVVDUzItVl80LmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1VuaUpJUy1VQ1MyLVZfNC5jcHAKQEAgLTEsNzEgKzEsNjYgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0IGdfRlhDTUFQX1VuaUpJU19VQ1MyX1ZfNFsyNTEgKiAyXSA9IHsKLSAgICAweDAwQjAsIDB4MjA0RCwgMHgyMDEwLCAweDFFRDUsIDB4MjAxNSwgMHgxRUQ0LCAweDIwMTYsIDB4MUVENywKLSAgICAweDIwMTgsIDB4MjA1OSwgMHgyMDE5LCAweDIwNUEsIDB4MjAxQywgMHgyMDU3LCAweDIwMUQsIDB4MjA1OCwKLSAgICAweDIwMjUsIDB4MUVEQSwgMHgyMDI2LCAweDFFRDksIDB4MjAzMiwgMHgyMDUxLCAweDIwMzMsIDB4MjA1QiwKLSAgICAweDIxOTAsIDB4MDJFMiwgMHgyMTkxLCAweDAyRTAsIDB4MjE5MiwgMHgwMkUzLCAweDIxOTMsIDB4MDJFMSwKLSAgICAweDIxOTUsIDB4MkZCNiwgMHgyMUM0LCAweDIwNzcsIDB4MjFDNSwgMHgyMDc2LCAweDIxQzYsIDB4MjA3OCwKLSAgICAweDIxRTYsIDB4MUY0QywgMHgyMUU3LCAweDFGNEUsIDB4MjFFOCwgMHgxRjRCLCAweDIxRTksIDB4MUY0RCwKLSAgICAweDIyMjUsIDB4MUVENywgMHgyMjNDLCAweDFFRDYsIDB4MjJFRiwgMHgxRUQ5LCAweDI1MDAsIDB4MUQzOSwKLSAgICAweDI1MDEsIDB4MUQzQSwgMHgyNTAyLCAweDFEMzcsIDB4MjUwMywgMHgxRDM4LCAweDI1MDQsIDB4MUQzRCwKLSAgICAweDI1MDUsIDB4MUQzRSwgMHgyNTA2LCAweDFEM0IsIDB4MjUwNywgMHgxRDNDLCAweDI1MDgsIDB4MUQ0MSwKLSAgICAweDI1MDksIDB4MUQ0MiwgMHgyNTBBLCAweDFEM0YsIDB4MjUwQiwgMHgxRDQwLCAweDI1MEMsIDB4MUQ0NywKLSAgICAweDI1MEQsIDB4MUQ0OSwgMHgyNTBFLCAweDFENDgsIDB4MjUwRiwgMHgxRDRBLCAweDI1MTAsIDB4MUQ0RiwKLSAgICAweDI1MTEsIDB4MUQ1MSwgMHgyNTEyLCAweDFENTAsIDB4MjUxMywgMHgxRDUyLCAweDI1MTQsIDB4MUQ0MywKLSAgICAweDI1MTUsIDB4MUQ0NSwgMHgyNTE2LCAweDFENDQsIDB4MjUxNywgMHgxRDQ2LCAweDI1MTgsIDB4MUQ0QiwKLSAgICAweDI1MTksIDB4MUQ0RCwgMHgyNTFBLCAweDFENEMsIDB4MjUxQiwgMHgxRDRFLCAweDI1MUMsIDB4MUQ2MywKLSAgICAweDI1MUQsIDB4MUQ2NywgMHgyNTFFLCAweDFENjUsIDB4MjUxRiwgMHgxRDY0LCAweDI1MjAsIDB4MUQ2NiwKLSAgICAweDI1MjEsIDB4MUQ2OSwgMHgyNTIyLCAweDFENjgsIDB4MjUyMywgMHgxRDZBLCAweDI1MjQsIDB4MUQ2QiwKLSAgICAweDI1MjUsIDB4MUQ2RiwgMHgyNTI2LCAweDFENkQsIDB4MjUyNywgMHgxRDZDLCAweDI1MjgsIDB4MUQ2RSwKLSAgICAweDI1MjksIDB4MUQ3MSwgMHgyNTJBLCAweDFENzAsIDB4MjUyQiwgMHgxRDcyLCAweDI1MkMsIDB4MUQ1QiwKLSAgICAweDI1MkQsIDB4MUQ1RCwgMHgyNTJFLCAweDFENUUsIDB4MjUyRiwgMHgxRDVGLCAweDI1MzAsIDB4MUQ1QywKLSAgICAweDI1MzEsIDB4MUQ2MCwgMHgyNTMyLCAweDFENjEsIDB4MjUzMywgMHgxRDYyLCAweDI1MzQsIDB4MUQ1MywKLSAgICAweDI1MzUsIDB4MUQ1NSwgMHgyNTM2LCAweDFENTYsIDB4MjUzNywgMHgxRDU3LCAweDI1MzgsIDB4MUQ1NCwKLSAgICAweDI1MzksIDB4MUQ1OCwgMHgyNTNBLCAweDFENTksIDB4MjUzQiwgMHgxRDVBLCAweDI1M0QsIDB4MUQ3NywKLSAgICAweDI1M0UsIDB4MUQ3OCwgMHgyNTNGLCAweDFENzksIDB4MjU0MCwgMHgxRDc1LCAweDI1NDEsIDB4MUQ3NCwKLSAgICAweDI1NDIsIDB4MUQ3NiwgMHgyNTQzLCAweDFEN0IsIDB4MjU0NCwgMHgxRDdELCAweDI1NDUsIDB4MUQ3QSwKLSAgICAweDI1NDYsIDB4MUQ3QywgMHgyNTQ3LCAweDFEODEsIDB4MjU0OCwgMHgxRDgwLCAweDI1NDksIDB4MUQ3RSwKLSAgICAweDI1NEEsIDB4MUQ3RiwgMHgyNjFDLCAweDIwMUQsIDB4MjYxRCwgMHgyMDFCLCAweDI2MUUsIDB4MjAxRSwKLSAgICAweDI2MUYsIDB4MjAxQywgMHgyNzAyLCAweDJGOTIsIDB4MjdBMSwgMHgyMDExLCAweDMwMDEsIDB4MUVDRiwKLSAgICAweDMwMDIsIDB4MUVEMCwgMHgzMDA4LCAweDFFRTMsIDB4MzAwOSwgMHgxRUU0LCAweDMwMEEsIDB4MUVFNSwKLSAgICAweDMwMEIsIDB4MUVFNiwgMHgzMDBDLCAweDFFRTcsIDB4MzAwRCwgMHgxRUU4LCAweDMwMEUsIDB4MUVFOSwKLSAgICAweDMwMEYsIDB4MUVFQSwgMHgzMDEwLCAweDFFRUIsIDB4MzAxMSwgMHgxRUVDLCAweDMwMTMsIDB4MjA0RSwKLSAgICAweDMwMTQsIDB4MUVERCwgMHgzMDE1LCAweDFFREUsIDB4MzAxQywgMHgxRUQ2LCAweDMwMUQsIDB4MUYxNCwKLSAgICAweDMwMUYsIDB4MUYxNSwgMHgzMDQxLCAweDFFRUUsIDB4MzA0MywgMHgxRUVGLCAweDMwNDUsIDB4MUVGMCwKLSAgICAweDMwNDcsIDB4MUVGMSwgMHgzMDQ5LCAweDFFRjIsIDB4MzA2MywgMHgxRUYzLCAweDMwODMsIDB4MUVGNCwKLSAgICAweDMwODUsIDB4MUVGNSwgMHgzMDg3LCAweDFFRjYsIDB4MzA4RSwgMHgxRUY3LCAweDMwOUIsIDB4MjA1MCwKLSAgICAweDMwOUMsIDB4MjA0RiwgMHgzMEExLCAweDFFRjgsIDB4MzBBMywgMHgxRUY5LCAweDMwQTUsIDB4MUVGQSwKLSAgICAweDMwQTcsIDB4MUVGQiwgMHgzMEE5LCAweDFFRkMsIDB4MzBDMywgMHgxRUZELCAweDMwRTMsIDB4MUVGRSwKLSAgICAweDMwRTUsIDB4MUVGRiwgMHgzMEU3LCAweDFGMDAsIDB4MzBFRSwgMHgxRjAxLCAweDMwRjUsIDB4MUYwMiwKLSAgICAweDMwRjYsIDB4MUYwMywgMHgzMEZDLCAweDFFRDMsIDB4MzMwMCwgMHgyMDlFLCAweDMzMDEsIDB4MkVCNiwKLSAgICAweDMzMDIsIDB4MkVCNywgMHgzMzAzLCAweDIwOTIsIDB4MzMwNCwgMHgyRUI4LCAweDMzMDUsIDB4MjA4RCwKLSAgICAweDMzMDYsIDB4MkVCOSwgMHgzMzA3LCAweDJFQkQsIDB4MzMwOCwgMHgyRUJCLCAweDMzMDksIDB4MkVDMCwKLSAgICAweDMzMEEsIDB4MkVCRSwgMHgzMzBCLCAweDJFQzIsIDB4MzMwQywgMHgyRUM0LCAweDMzMEQsIDB4MUYwRSwKLSAgICAweDMzMEUsIDB4MkVDNSwgMHgzMzBGLCAweDJFQzYsIDB4MzMxMCwgMHgyRUM3LCAweDMzMTEsIDB4MkVDOCwKLSAgICAweDMzMTIsIDB4MkVDOSwgMHgzMzEzLCAweDJFQ0EsIDB4MzMxNCwgMHgxRjA1LCAweDMzMTUsIDB4MjA5NCwKLSAgICAweDMzMTYsIDB4MjA4QSwgMHgzMzE3LCAweDJFQ0MsIDB4MzMxOCwgMHgyMDkzLCAweDMzMTksIDB4MkVDRSwKLSAgICAweDMzMUEsIDB4MkVEMCwgMHgzMzFCLCAweDJFRDEsIDB4MzMxQywgMHgyRUQyLCAweDMzMUQsIDB4MkVEMywKLSAgICAweDMzMUUsIDB4MjBBMSwgMHgzMzFGLCAweDJFRDQsIDB4MzMyMCwgMHgyRUQ1LCAweDMzMjEsIDB4MkVENiwKLSAgICAweDMzMjIsIDB4MjA4OSwgMHgzMzIzLCAweDIwOUMsIDB4MzMyNCwgMHgyRUQ3LCAweDMzMjUsIDB4MkVEOSwKLSAgICAweDMzMjYsIDB4MUYwRiwgMHgzMzI3LCAweDFGMDksIDB4MzMyOCwgMHgyRURDLCAweDMzMjksIDB4MkVERCwKLSAgICAweDMzMkEsIDB4MjBBNCwgMHgzMzJCLCAweDFGMTEsIDB4MzMyRCwgMHgyRURGLCAweDMzMkUsIDB4MkVFMiwKLSAgICAweDMzMkYsIDB4MkVFMywgMHgzMzMwLCAweDJFRTQsIDB4MzMzMSwgMHgyMEE2LCAweDMzMzIsIDB4MkVFNSwKLSAgICAweDMzMzMsIDB4MjA4RSwgMHgzMzM0LCAweDJFRTgsIDB4MzMzNSwgMHgyRUU5LCAweDMzMzYsIDB4MUYwQiwKLSAgICAweDMzMzcsIDB4MkVFRSwgMHgzMzM4LCAweDJFRjAsIDB4MzMzOSwgMHgyMDk3LCAweDMzM0EsIDB4MkVGMSwKLSAgICAweDMzM0IsIDB4MjA5RCwgMHgzMzNDLCAweDJFRUEsIDB4MzMzRCwgMHgyRUYyLCAweDMzM0UsIDB4MkVGNCwKLSAgICAweDMzM0YsIDB4MkVGNSwgMHgzMzQwLCAweDJFRjYsIDB4MzM0MSwgMHgyRUYzLCAweDMzNDIsIDB4MjA5QiwKLSAgICAweDMzNDMsIDB4MkVGNywgMHgzMzQ0LCAweDJFRjgsIDB4MzM0NSwgMHgyRUY5LCAweDMzNDYsIDB4MkVGQSwKLSAgICAweDMzNDcsIDB4MjBBNSwgMHgzMzQ4LCAweDJFRkIsIDB4MzM0OSwgMHgxRjA0LCAweDMzNEEsIDB4MUYxMiwKLSAgICAweDMzNEIsIDB4MkVGQywgMHgzMzRDLCAweDJFRkQsIDB4MzM0RCwgMHgxRjA3LCAweDMzNEUsIDB4MjA5MSwKLSAgICAweDMzNEYsIDB4MkVGRSwgMHgzMzUwLCAweDJFRkYsIDB4MzM1MSwgMHgxRjBDLCAweDMzNTIsIDB4MkYwMiwKLSAgICAweDMzNTMsIDB4MkYwNiwgMHgzMzU0LCAweDJGMDMsIDB4MzM1NSwgMHgyRjA3LCAweDMzNTYsIDB4MkYwOCwKLSAgICAweDMzNTcsIDB4MjA5OCwgMHgzMzdGLCAweDIwODQsIDB4RkYwOCwgMHgxRURCLCAweEZGMDksIDB4MUVEQywKLSAgICAweEZGMEMsIDB4MjA0QywgMHhGRjBFLCAweDIwNTIsIDB4RkYxRCwgMHgxRUVELCAweEZGM0IsIDB4MUVERiwKLSAgICAweEZGM0QsIDB4MUVFMCwgMHhGRjNGLCAweDFFRDIsIDB4RkY1QiwgMHgxRUUxLCAweEZGNUMsIDB4MUVEOCwKLSAgICAweEZGNUQsIDB4MUVFMiwgMHhGRjVFLCAweDFFRDYsIDB4RkZFMywgMHgxRUQxLAorI2luY2x1ZGUgImNtYXBzX2phcGFuMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQX1VuaUpJU19VQ1MyX1ZfNFsyNTEgKiAyXSA9IHsKKyAgICAweDAwQjAsIDB4MjA0RCwgMHgyMDEwLCAweDFFRDUsIDB4MjAxNSwgMHgxRUQ0LCAweDIwMTYsIDB4MUVENywgMHgyMDE4LAorICAgIDB4MjA1OSwgMHgyMDE5LCAweDIwNUEsIDB4MjAxQywgMHgyMDU3LCAweDIwMUQsIDB4MjA1OCwgMHgyMDI1LCAweDFFREEsCisgICAgMHgyMDI2LCAweDFFRDksIDB4MjAzMiwgMHgyMDUxLCAweDIwMzMsIDB4MjA1QiwgMHgyMTkwLCAweDAyRTIsIDB4MjE5MSwKKyAgICAweDAyRTAsIDB4MjE5MiwgMHgwMkUzLCAweDIxOTMsIDB4MDJFMSwgMHgyMTk1LCAweDJGQjYsIDB4MjFDNCwgMHgyMDc3LAorICAgIDB4MjFDNSwgMHgyMDc2LCAweDIxQzYsIDB4MjA3OCwgMHgyMUU2LCAweDFGNEMsIDB4MjFFNywgMHgxRjRFLCAweDIxRTgsCisgICAgMHgxRjRCLCAweDIxRTksIDB4MUY0RCwgMHgyMjI1LCAweDFFRDcsIDB4MjIzQywgMHgxRUQ2LCAweDIyRUYsIDB4MUVEOSwKKyAgICAweDI1MDAsIDB4MUQzOSwgMHgyNTAxLCAweDFEM0EsIDB4MjUwMiwgMHgxRDM3LCAweDI1MDMsIDB4MUQzOCwgMHgyNTA0LAorICAgIDB4MUQzRCwgMHgyNTA1LCAweDFEM0UsIDB4MjUwNiwgMHgxRDNCLCAweDI1MDcsIDB4MUQzQywgMHgyNTA4LCAweDFENDEsCisgICAgMHgyNTA5LCAweDFENDIsIDB4MjUwQSwgMHgxRDNGLCAweDI1MEIsIDB4MUQ0MCwgMHgyNTBDLCAweDFENDcsIDB4MjUwRCwKKyAgICAweDFENDksIDB4MjUwRSwgMHgxRDQ4LCAweDI1MEYsIDB4MUQ0QSwgMHgyNTEwLCAweDFENEYsIDB4MjUxMSwgMHgxRDUxLAorICAgIDB4MjUxMiwgMHgxRDUwLCAweDI1MTMsIDB4MUQ1MiwgMHgyNTE0LCAweDFENDMsIDB4MjUxNSwgMHgxRDQ1LCAweDI1MTYsCisgICAgMHgxRDQ0LCAweDI1MTcsIDB4MUQ0NiwgMHgyNTE4LCAweDFENEIsIDB4MjUxOSwgMHgxRDRELCAweDI1MUEsIDB4MUQ0QywKKyAgICAweDI1MUIsIDB4MUQ0RSwgMHgyNTFDLCAweDFENjMsIDB4MjUxRCwgMHgxRDY3LCAweDI1MUUsIDB4MUQ2NSwgMHgyNTFGLAorICAgIDB4MUQ2NCwgMHgyNTIwLCAweDFENjYsIDB4MjUyMSwgMHgxRDY5LCAweDI1MjIsIDB4MUQ2OCwgMHgyNTIzLCAweDFENkEsCisgICAgMHgyNTI0LCAweDFENkIsIDB4MjUyNSwgMHgxRDZGLCAweDI1MjYsIDB4MUQ2RCwgMHgyNTI3LCAweDFENkMsIDB4MjUyOCwKKyAgICAweDFENkUsIDB4MjUyOSwgMHgxRDcxLCAweDI1MkEsIDB4MUQ3MCwgMHgyNTJCLCAweDFENzIsIDB4MjUyQywgMHgxRDVCLAorICAgIDB4MjUyRCwgMHgxRDVELCAweDI1MkUsIDB4MUQ1RSwgMHgyNTJGLCAweDFENUYsIDB4MjUzMCwgMHgxRDVDLCAweDI1MzEsCisgICAgMHgxRDYwLCAweDI1MzIsIDB4MUQ2MSwgMHgyNTMzLCAweDFENjIsIDB4MjUzNCwgMHgxRDUzLCAweDI1MzUsIDB4MUQ1NSwKKyAgICAweDI1MzYsIDB4MUQ1NiwgMHgyNTM3LCAweDFENTcsIDB4MjUzOCwgMHgxRDU0LCAweDI1MzksIDB4MUQ1OCwgMHgyNTNBLAorICAgIDB4MUQ1OSwgMHgyNTNCLCAweDFENUEsIDB4MjUzRCwgMHgxRDc3LCAweDI1M0UsIDB4MUQ3OCwgMHgyNTNGLCAweDFENzksCisgICAgMHgyNTQwLCAweDFENzUsIDB4MjU0MSwgMHgxRDc0LCAweDI1NDIsIDB4MUQ3NiwgMHgyNTQzLCAweDFEN0IsIDB4MjU0NCwKKyAgICAweDFEN0QsIDB4MjU0NSwgMHgxRDdBLCAweDI1NDYsIDB4MUQ3QywgMHgyNTQ3LCAweDFEODEsIDB4MjU0OCwgMHgxRDgwLAorICAgIDB4MjU0OSwgMHgxRDdFLCAweDI1NEEsIDB4MUQ3RiwgMHgyNjFDLCAweDIwMUQsIDB4MjYxRCwgMHgyMDFCLCAweDI2MUUsCisgICAgMHgyMDFFLCAweDI2MUYsIDB4MjAxQywgMHgyNzAyLCAweDJGOTIsIDB4MjdBMSwgMHgyMDExLCAweDMwMDEsIDB4MUVDRiwKKyAgICAweDMwMDIsIDB4MUVEMCwgMHgzMDA4LCAweDFFRTMsIDB4MzAwOSwgMHgxRUU0LCAweDMwMEEsIDB4MUVFNSwgMHgzMDBCLAorICAgIDB4MUVFNiwgMHgzMDBDLCAweDFFRTcsIDB4MzAwRCwgMHgxRUU4LCAweDMwMEUsIDB4MUVFOSwgMHgzMDBGLCAweDFFRUEsCisgICAgMHgzMDEwLCAweDFFRUIsIDB4MzAxMSwgMHgxRUVDLCAweDMwMTMsIDB4MjA0RSwgMHgzMDE0LCAweDFFREQsIDB4MzAxNSwKKyAgICAweDFFREUsIDB4MzAxQywgMHgxRUQ2LCAweDMwMUQsIDB4MUYxNCwgMHgzMDFGLCAweDFGMTUsIDB4MzA0MSwgMHgxRUVFLAorICAgIDB4MzA0MywgMHgxRUVGLCAweDMwNDUsIDB4MUVGMCwgMHgzMDQ3LCAweDFFRjEsIDB4MzA0OSwgMHgxRUYyLCAweDMwNjMsCisgICAgMHgxRUYzLCAweDMwODMsIDB4MUVGNCwgMHgzMDg1LCAweDFFRjUsIDB4MzA4NywgMHgxRUY2LCAweDMwOEUsIDB4MUVGNywKKyAgICAweDMwOUIsIDB4MjA1MCwgMHgzMDlDLCAweDIwNEYsIDB4MzBBMSwgMHgxRUY4LCAweDMwQTMsIDB4MUVGOSwgMHgzMEE1LAorICAgIDB4MUVGQSwgMHgzMEE3LCAweDFFRkIsIDB4MzBBOSwgMHgxRUZDLCAweDMwQzMsIDB4MUVGRCwgMHgzMEUzLCAweDFFRkUsCisgICAgMHgzMEU1LCAweDFFRkYsIDB4MzBFNywgMHgxRjAwLCAweDMwRUUsIDB4MUYwMSwgMHgzMEY1LCAweDFGMDIsIDB4MzBGNiwKKyAgICAweDFGMDMsIDB4MzBGQywgMHgxRUQzLCAweDMzMDAsIDB4MjA5RSwgMHgzMzAxLCAweDJFQjYsIDB4MzMwMiwgMHgyRUI3LAorICAgIDB4MzMwMywgMHgyMDkyLCAweDMzMDQsIDB4MkVCOCwgMHgzMzA1LCAweDIwOEQsIDB4MzMwNiwgMHgyRUI5LCAweDMzMDcsCisgICAgMHgyRUJELCAweDMzMDgsIDB4MkVCQiwgMHgzMzA5LCAweDJFQzAsIDB4MzMwQSwgMHgyRUJFLCAweDMzMEIsIDB4MkVDMiwKKyAgICAweDMzMEMsIDB4MkVDNCwgMHgzMzBELCAweDFGMEUsIDB4MzMwRSwgMHgyRUM1LCAweDMzMEYsIDB4MkVDNiwgMHgzMzEwLAorICAgIDB4MkVDNywgMHgzMzExLCAweDJFQzgsIDB4MzMxMiwgMHgyRUM5LCAweDMzMTMsIDB4MkVDQSwgMHgzMzE0LCAweDFGMDUsCisgICAgMHgzMzE1LCAweDIwOTQsIDB4MzMxNiwgMHgyMDhBLCAweDMzMTcsIDB4MkVDQywgMHgzMzE4LCAweDIwOTMsIDB4MzMxOSwKKyAgICAweDJFQ0UsIDB4MzMxQSwgMHgyRUQwLCAweDMzMUIsIDB4MkVEMSwgMHgzMzFDLCAweDJFRDIsIDB4MzMxRCwgMHgyRUQzLAorICAgIDB4MzMxRSwgMHgyMEExLCAweDMzMUYsIDB4MkVENCwgMHgzMzIwLCAweDJFRDUsIDB4MzMyMSwgMHgyRUQ2LCAweDMzMjIsCisgICAgMHgyMDg5LCAweDMzMjMsIDB4MjA5QywgMHgzMzI0LCAweDJFRDcsIDB4MzMyNSwgMHgyRUQ5LCAweDMzMjYsIDB4MUYwRiwKKyAgICAweDMzMjcsIDB4MUYwOSwgMHgzMzI4LCAweDJFREMsIDB4MzMyOSwgMHgyRURELCAweDMzMkEsIDB4MjBBNCwgMHgzMzJCLAorICAgIDB4MUYxMSwgMHgzMzJELCAweDJFREYsIDB4MzMyRSwgMHgyRUUyLCAweDMzMkYsIDB4MkVFMywgMHgzMzMwLCAweDJFRTQsCisgICAgMHgzMzMxLCAweDIwQTYsIDB4MzMzMiwgMHgyRUU1LCAweDMzMzMsIDB4MjA4RSwgMHgzMzM0LCAweDJFRTgsIDB4MzMzNSwKKyAgICAweDJFRTksIDB4MzMzNiwgMHgxRjBCLCAweDMzMzcsIDB4MkVFRSwgMHgzMzM4LCAweDJFRjAsIDB4MzMzOSwgMHgyMDk3LAorICAgIDB4MzMzQSwgMHgyRUYxLCAweDMzM0IsIDB4MjA5RCwgMHgzMzNDLCAweDJFRUEsIDB4MzMzRCwgMHgyRUYyLCAweDMzM0UsCisgICAgMHgyRUY0LCAweDMzM0YsIDB4MkVGNSwgMHgzMzQwLCAweDJFRjYsIDB4MzM0MSwgMHgyRUYzLCAweDMzNDIsIDB4MjA5QiwKKyAgICAweDMzNDMsIDB4MkVGNywgMHgzMzQ0LCAweDJFRjgsIDB4MzM0NSwgMHgyRUY5LCAweDMzNDYsIDB4MkVGQSwgMHgzMzQ3LAorICAgIDB4MjBBNSwgMHgzMzQ4LCAweDJFRkIsIDB4MzM0OSwgMHgxRjA0LCAweDMzNEEsIDB4MUYxMiwgMHgzMzRCLCAweDJFRkMsCisgICAgMHgzMzRDLCAweDJFRkQsIDB4MzM0RCwgMHgxRjA3LCAweDMzNEUsIDB4MjA5MSwgMHgzMzRGLCAweDJFRkUsIDB4MzM1MCwKKyAgICAweDJFRkYsIDB4MzM1MSwgMHgxRjBDLCAweDMzNTIsIDB4MkYwMiwgMHgzMzUzLCAweDJGMDYsIDB4MzM1NCwgMHgyRjAzLAorICAgIDB4MzM1NSwgMHgyRjA3LCAweDMzNTYsIDB4MkYwOCwgMHgzMzU3LCAweDIwOTgsIDB4MzM3RiwgMHgyMDg0LCAweEZGMDgsCisgICAgMHgxRURCLCAweEZGMDksIDB4MUVEQywgMHhGRjBDLCAweDIwNEMsIDB4RkYwRSwgMHgyMDUyLCAweEZGMUQsIDB4MUVFRCwKKyAgICAweEZGM0IsIDB4MUVERiwgMHhGRjNELCAweDFFRTAsIDB4RkYzRiwgMHgxRUQyLCAweEZGNUIsIDB4MUVFMSwgMHhGRjVDLAorICAgIDB4MUVEOCwgMHhGRjVELCAweDFFRTIsIDB4RkY1RSwgMHgxRUQ2LCAweEZGRTMsIDB4MUVEMSwKIH07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1VuaUpJUy1VVEYxNi1IXzUuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9VbmlKSVMtVVRGMTYtSF81LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMyMmQ5OS4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1VuaUpJUy1VVEYxNi1IXzUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi1leHRlcm4gY29uc3QgdW5zaWduZWQgc2hvcnQgZ19GWENNQVBfVW5pSklTX1VURjE2X0hfNVsxMzI0MSAqIDJdID0gewotICAgIDB4MDAyMCwgMHgwMDAxLCAweDAwMjEsIDB4MDAwMiwgMHgwMDIyLCAweDAwMDMsIDB4MDAyMywgMHgwMDA0LAotICAgIDB4MDAyNCwgMHgwMDA1LCAweDAwMjUsIDB4MDAwNiwgMHgwMDI2LCAweDAwMDcsIDB4MDAyNywgMHgwMDA4LAotICAgIDB4MDAyOCwgMHgwMDA5LCAweDAwMjksIDB4MDAwQSwgMHgwMDJBLCAweDAwMEIsIDB4MDAyQiwgMHgwMDBDLAotICAgIDB4MDAyQywgMHgwMDBELCAweDAwMkQsIDB4MDAwRSwgMHgwMDJFLCAweDAwMEYsIDB4MDAyRiwgMHgwMDEwLAotICAgIDB4MDAzMCwgMHgwMDExLCAweDAwMzEsIDB4MDAxMiwgMHgwMDMyLCAweDAwMTMsIDB4MDAzMywgMHgwMDE0LAotICAgIDB4MDAzNCwgMHgwMDE1LCAweDAwMzUsIDB4MDAxNiwgMHgwMDM2LCAweDAwMTcsIDB4MDAzNywgMHgwMDE4LAotICAgIDB4MDAzOCwgMHgwMDE5LCAweDAwMzksIDB4MDAxQSwgMHgwMDNBLCAweDAwMUIsIDB4MDAzQiwgMHgwMDFDLAotICAgIDB4MDAzQywgMHgwMDFELCAweDAwM0QsIDB4MDAxRSwgMHgwMDNFLCAweDAwMUYsIDB4MDAzRiwgMHgwMDIwLAotICAgIDB4MDA0MCwgMHgwMDIxLCAweDAwNDEsIDB4MDAyMiwgMHgwMDQyLCAweDAwMjMsIDB4MDA0MywgMHgwMDI0LAotICAgIDB4MDA0NCwgMHgwMDI1LCAweDAwNDUsIDB4MDAyNiwgMHgwMDQ2LCAweDAwMjcsIDB4MDA0NywgMHgwMDI4LAotICAgIDB4MDA0OCwgMHgwMDI5LCAweDAwNDksIDB4MDAyQSwgMHgwMDRBLCAweDAwMkIsIDB4MDA0QiwgMHgwMDJDLAotICAgIDB4MDA0QywgMHgwMDJELCAweDAwNEQsIDB4MDAyRSwgMHgwMDRFLCAweDAwMkYsIDB4MDA0RiwgMHgwMDMwLAotICAgIDB4MDA1MCwgMHgwMDMxLCAweDAwNTEsIDB4MDAzMiwgMHgwMDUyLCAweDAwMzMsIDB4MDA1MywgMHgwMDM0LAotICAgIDB4MDA1NCwgMHgwMDM1LCAweDAwNTUsIDB4MDAzNiwgMHgwMDU2LCAweDAwMzcsIDB4MDA1NywgMHgwMDM4LAotICAgIDB4MDA1OCwgMHgwMDM5LCAweDAwNTksIDB4MDAzQSwgMHgwMDVBLCAweDAwM0IsIDB4MDA1QiwgMHgwMDNDLAotICAgIDB4MDA1QywgMHgwMDYxLCAweDAwNUQsIDB4MDAzRSwgMHgwMDVFLCAweDAwM0YsIDB4MDA1RiwgMHgwMDQwLAotICAgIDB4MDA2MCwgMHgwMDQxLCAweDAwNjEsIDB4MDA0MiwgMHgwMDYyLCAweDAwNDMsIDB4MDA2MywgMHgwMDQ0LAotICAgIDB4MDA2NCwgMHgwMDQ1LCAweDAwNjUsIDB4MDA0NiwgMHgwMDY2LCAweDAwNDcsIDB4MDA2NywgMHgwMDQ4LAotICAgIDB4MDA2OCwgMHgwMDQ5LCAweDAwNjksIDB4MDA0QSwgMHgwMDZBLCAweDAwNEIsIDB4MDA2QiwgMHgwMDRDLAotICAgIDB4MDA2QywgMHgwMDRELCAweDAwNkQsIDB4MDA0RSwgMHgwMDZFLCAweDAwNEYsIDB4MDA2RiwgMHgwMDUwLAotICAgIDB4MDA3MCwgMHgwMDUxLCAweDAwNzEsIDB4MDA1MiwgMHgwMDcyLCAweDAwNTMsIDB4MDA3MywgMHgwMDU0LAotICAgIDB4MDA3NCwgMHgwMDU1LCAweDAwNzUsIDB4MDA1NiwgMHgwMDc2LCAweDAwNTcsIDB4MDA3NywgMHgwMDU4LAotICAgIDB4MDA3OCwgMHgwMDU5LCAweDAwNzksIDB4MDA1QSwgMHgwMDdBLCAweDAwNUIsIDB4MDA3QiwgMHgwMDVDLAotICAgIDB4MDA3QywgMHgwMDYzLCAweDAwN0QsIDB4MDA1RSwgMHgwMDdFLCAweDAwNjQsIDB4MDBBMCwgMHgwMDAxLAotICAgIDB4MDBBMSwgMHgwMDY1LCAweDAwQTIsIDB4MDA2NiwgMHgwMEEzLCAweDAwNjcsIDB4MDBBNCwgMHgwMDZCLAotICAgIDB4MDBBNSwgMHgwMDNELCAweDAwQTYsIDB4MDA1RCwgMHgwMEE3LCAweDAyRDAsIDB4MDBBOCwgMHgwMjg3LAotICAgIDB4MDBBOSwgMHgwMDk4LCAweDAwQUEsIDB4MDA4QywgMHgwMEFCLCAweDAwNkQsIDB4MDBBQywgMHgwMDk5LAotICAgIDB4MDBBRCwgMHgwMDk3LCAweDAwQUUsIDB4MDA5QSwgMHgwMEFGLCAweDAwODEsIDB4MDBCMCwgMHgwMkMzLAotICAgIDB4MDBCMSwgMHgwMkI2LCAweDAwQjIsIDB4MDA5RCwgMHgwMEIzLCAweDAwOUUsIDB4MDBCNCwgMHgwMjg1LAotICAgIDB4MDBCNSwgMHgwMDlGLCAweDAwQjYsIDB4MDMwQSwgMHgwMEI3LCAweDAwNzUsIDB4MDBCOCwgMHgwMDg2LAotICAgIDB4MDBCOSwgMHgwMEEwLCAweDAwQkEsIDB4MDA5MCwgMHgwMEJCLCAweDAwN0IsIDB4MDBCQywgMHgwMEExLAotICAgIDB4MDBCRCwgMHgwMEEyLCAweDAwQkUsIDB4MDBBMywgMHgwMEJGLCAweDAwN0UsIDB4MDBDMCwgMHgwMEE0LAotICAgIDB4MDBDMSwgMHgwMEE1LCAweDAwQzIsIDB4MDBBNiwgMHgwMEMzLCAweDAwQTcsIDB4MDBDNCwgMHgwMEE4LAotICAgIDB4MDBDNSwgMHgwMEE5LCAweDAwQzYsIDB4MDA4QiwgMHgwMEM3LCAweDAwQUEsIDB4MDBDOCwgMHgwMEFCLAotICAgIDB4MDBDOSwgMHgwMEFDLCAweDAwQ0EsIDB4MDBBRCwgMHgwMENCLCAweDAwQUUsIDB4MDBDQywgMHgwMEFGLAotICAgIDB4MDBDRCwgMHgwMEIwLCAweDAwQ0UsIDB4MDBCMSwgMHgwMENGLCAweDAwQjIsIDB4MDBEMCwgMHgwMEIzLAotICAgIDB4MDBEMSwgMHgwMEI0LCAweDAwRDIsIDB4MDBCNSwgMHgwMEQzLCAweDAwQjYsIDB4MDBENCwgMHgwMEI3LAotICAgIDB4MDBENSwgMHgwMEI4LCAweDAwRDYsIDB4MDBCOSwgMHgwMEQ3LCAweDAyQjcsIDB4MDBEOCwgMHgwMDhFLAotICAgIDB4MDBEOSwgMHgwMEJCLCAweDAwREEsIDB4MDBCQywgMHgwMERCLCAweDAwQkQsIDB4MDBEQywgMHgwMEJFLAotICAgIDB4MDBERCwgMHgwMEJGLCAweDAwREUsIDB4MDBDMCwgMHgwMERGLCAweDAwOTYsIDB4MDBFMCwgMHgwMEMxLAotICAgIDB4MDBFMSwgMHgwMEMyLCAweDAwRTIsIDB4MDBDMywgMHgwMEUzLCAweDAwQzQsIDB4MDBFNCwgMHgwMEM1LAotICAgIDB4MDBFNSwgMHgwMEM2LCAweDAwRTYsIDB4MDA5MSwgMHgwMEU3LCAweDAwQzcsIDB4MDBFOCwgMHgwMEM4LAotICAgIDB4MDBFOSwgMHgwMEM5LCAweDAwRUEsIDB4MDBDQSwgMHgwMEVCLCAweDAwQ0IsIDB4MDBFQywgMHgwMENDLAotICAgIDB4MDBFRCwgMHgwMENELCAweDAwRUUsIDB4MDBDRSwgMHgwMEVGLCAweDAwQ0YsIDB4MDBGMCwgMHgwMEQwLAotICAgIDB4MDBGMSwgMHgwMEQxLCAweDAwRjIsIDB4MDBEMiwgMHgwMEYzLCAweDAwRDMsIDB4MDBGNCwgMHgwMEQ0LAotICAgIDB4MDBGNSwgMHgwMEQ1LCAweDAwRjYsIDB4MDBENiwgMHgwMEY3LCAweDAyQjgsIDB4MDBGOCwgMHgwMDk0LAotICAgIDB4MDBGOSwgMHgwMEQ4LCAweDAwRkEsIDB4MDBEOSwgMHgwMEZCLCAweDAwREEsIDB4MDBGQywgMHgwMERCLAotICAgIDB4MDBGRCwgMHgwMERDLCAweDAwRkUsIDB4MDBERCwgMHgwMEZGLCAweDAwREUsIDB4MDEwMCwgMHgyNDk2LAotICAgIDB4MDEwMSwgMHgyNDkxLCAweDAxMDIsIDB4M0Q4QywgMHgwMTAzLCAweDNEOTksIDB4MDEwNCwgMHgzRDc5LAotICAgIDB4MDEwNSwgMHgzRDgxLCAweDAxMDYsIDB4M0Q4RSwgMHgwMTA3LCAweDNEOUIsIDB4MDEwOCwgMHgzREE3LAotICAgIDB4MDEwOSwgMHgzREFELCAweDAxMEMsIDB4M0Q4RiwgMHgwMTBELCAweDNEOUMsIDB4MDEwRSwgMHgzRDkxLAotICAgIDB4MDEwRiwgMHgzRDlFLCAweDAxMTEsIDB4M0Q5RiwgMHgwMTEyLCAweDI0OTksIDB4MDExMywgMHgyNDk0LAotICAgIDB4MDExOCwgMHgzRDkwLCAweDAxMTksIDB4M0Q5RCwgMHgwMTFBLCAweDI0QjMsIDB4MDExQiwgMHgyNEJGLAotICAgIDB4MDExQywgMHgzREE4LCAweDAxMUQsIDB4M0RBRSwgMHgwMTI0LCAweDNEQTksIDB4MDEyNSwgMHgzREFGLAotICAgIDB4MDEyNywgMHgzREM4LCAweDAxMjgsIDB4MjRCOCwgMHgwMTI5LCAweDI0QzQsIDB4MDEyQSwgMHgyNDk3LAotICAgIDB4MDEyQiwgMHgyNDkyLCAweDAxMzEsIDB4MDA5MiwgMHgwMTM0LCAweDNEQUEsIDB4MDEzNSwgMHgzREIwLAotICAgIDB4MDEzOSwgMHgzRDhELCAweDAxM0EsIDB4M0Q5QSwgMHgwMTNELCAweDNEN0IsIDB4MDEzRSwgMHgzRDgzLAotICAgIDB4MDE0MSwgMHgwMDhELCAweDAxNDIsIDB4MDA5MywgMHgwMTQzLCAweDNEOTIsIDB4MDE0NCwgMHgzREEwLAotICAgIDB4MDE0NywgMHgzRDkzLCAweDAxNDgsIDB4M0RBMSwgMHgwMTRCLCAweDI0REMsIDB4MDE0QywgMHgyNDlBLAotICAgIDB4MDE0RCwgMHgyNDk1LCAweDAxNTAsIDB4M0Q5NCwgMHgwMTUxLCAweDNEQTIsIDB4MDE1MiwgMHgwMDhGLAotICAgIDB4MDE1MywgMHgwMDk1LCAweDAxNTQsIDB4M0Q4QiwgMHgwMTU1LCAweDNEOTgsIDB4MDE1OCwgMHgzRDk1LAotICAgIDB4MDE1OSwgMHgzREEzLCAweDAxNUEsIDB4M0Q3QywgMHgwMTVCLCAweDNEODQsIDB4MDE1QywgMHgzREFCLAotICAgIDB4MDE1RCwgMHgzREIxLCAweDAxNUUsIDB4M0Q3RCwgMHgwMTVGLCAweDNEODYsIDB4MDE2MCwgMHgwMERGLAotICAgIDB4MDE2MSwgMHgwMEUzLCAweDAxNjIsIDB4M0Q5NywgMHgwMTYzLCAweDNEQTUsIDB4MDE2NCwgMHgzRDdFLAotICAgIDB4MDE2NSwgMHgzRDg3LCAweDAxNjgsIDB4MjRCRCwgMHgwMTY5LCAweDI0QzksIDB4MDE2QSwgMHgyNDk4LAotICAgIDB4MDE2QiwgMHgyNDkzLCAweDAxNkMsIDB4M0RBQywgMHgwMTZELCAweDNEQjIsIDB4MDE2RSwgMHgyNEJDLAotICAgIDB4MDE2RiwgMHgyNEM4LCAweDAxNzAsIDB4M0Q5NiwgMHgwMTcxLCAweDNEQTQsIDB4MDE3OCwgMHgwMEUwLAotICAgIDB4MDE3OSwgMHgzRDdGLCAweDAxN0EsIDB4M0Q4OCwgMHgwMTdCLCAweDNEODAsIDB4MDE3QywgMHgzRDhBLAotICAgIDB4MDE3RCwgMHgwMEUxLCAweDAxN0UsIDB4MDBFNSwgMHgwMTkyLCAweDAwNjksIDB4MDE5MywgMHgzREQyLAotICAgIDB4MDFDMiwgMHgzRENELCAweDAxQ0QsIDB4MjRCMiwgMHgwMUNFLCAweDI0QkUsIDB4MDFDRiwgMHgyNEI2LAotICAgIDB4MDFEMCwgMHgyNEMyLCAweDAxRDEsIDB4MjRCOSwgMHgwMUQyLCAweDI0QzUsIDB4MDFEMywgMHgyNEJCLAotICAgIDB4MDFENCwgMHgyNEM3LCAweDAxRDYsIDB4M0Q3NSwgMHgwMUQ4LCAweDNENzYsIDB4MDFEQSwgMHgzRDc3LAotICAgIDB4MDFEQywgMHgzRDc4LCAweDAxRjgsIDB4M0Q3MywgMHgwMUY5LCAweDNENzQsIDB4MDFGRCwgMHgyNENELAotICAgIDB4MDI1MCwgMHgzREQ4LCAweDAyNTEsIDB4MjRDQSwgMHgwMjUyLCAweDNEREMsIDB4MDI1MywgMHgzRENFLAotICAgIDB4MDI1NCwgMHgyNENGLCAweDAyNTUsIDB4M0RFMSwgMHgwMjU2LCAweDNEQkEsIDB4MDI1NywgMHgzRENGLAotICAgIDB4MDI1OCwgMHgzREQ1LCAweDAyNTksIDB4MjREMiwgMHgwMjVBLCAweDI0RDUsIDB4MDI1QiwgMHgyNEQ4LAotICAgIDB4MDI1QywgMHgzREQ2LCAweDAyNUUsIDB4M0RENywgMHgwMjVGLCAweDNEQzEsIDB4MDI2MCwgMHgzREQxLAotICAgIDB4MDI2MSwgMHgzREM1LCAweDAyNjIsIDB4M0UwQiwgMHgwMjYzLCAweDNFMEMsIDB4MDI2NCwgMHgzRERCLAotICAgIDB4MDI2NSwgMHgzRERFLCAweDAyNjYsIDB4M0RDQiwgMHgwMjY3LCAweDNERTQsIDB4MDI2OCwgMHgzREQzLAotICAgIDB4MDI2QSwgMHgzRTBELCAweDAyNkMsIDB4M0RCNiwgMHgwMjZELCAweDNEQzAsIDB4MDI2RSwgMHgzREI3LAotICAgIDB4MDI2RiwgMHgzREQ5LCAweDAyNzAsIDB4M0RDNiwgMHgwMjcxLCAweDNEQjMsIDB4MDI3MiwgMHgzREMyLAotICAgIDB4MDI3MywgMHgzREJCLCAweDAyNzQsIDB4M0UwRSwgMHgwMjc1LCAweDI0REQsIDB4MDI3NiwgMHgzRTBGLAotICAgIDB4MDI3OCwgMHgzRTEwLCAweDAyNzksIDB4M0RCOCwgMHgwMjdBLCAweDNERTMsIDB4MDI3QiwgMHgzREJGLAotICAgIDB4MDI3RCwgMHgzREJDLCAweDAyN0UsIDB4M0RCNSwgMHgwMjgwLCAweDNFMTEsIDB4MDI4MSwgMHgzREM3LAotICAgIDB4MDI4MiwgMHgzREJELCAweDAyODMsIDB4MjRFMiwgMHgwMjg0LCAweDNERDAsIDB4MDI4OCwgMHgzREI5LAotICAgIDB4MDI4OSwgMHgzREQ0LCAweDAyOEEsIDB4M0REQSwgMHgwMjhCLCAweDNEQjQsIDB4MDI4QywgMHgyNERFLAotICAgIDB4MDI4RCwgMHgzRERELCAweDAyOEUsIDB4M0RDNCwgMHgwMjhGLCAweDNFMTIsIDB4MDI5MCwgMHgzREJFLAotICAgIDB4MDI5MSwgMHgzREUyLCAweDAyOTIsIDB4MjRFMSwgMHgwMjk0LCAweDNEQ0EsIDB4MDI5NSwgMHgzREM5LAotICAgIDB4MDI5OCwgMHgzRENDLCAweDAyOTksIDB4M0UxMywgMHgwMjlDLCAweDNFMTQsIDB4MDI5RCwgMHgzREMzLAotICAgIDB4MDI5RiwgMHgzRTE1LCAweDAyQTEsIDB4M0RFMCwgMHgwMkEyLCAweDNEREYsIDB4MDJCMCwgMHgzRTE2LAotICAgIDB4MDJCMiwgMHgzRTE3LCAweDAyQjcsIDB4M0UxOCwgMHgwMkJCLCAweDAwNjIsIDB4MDJCQywgMHgwMDYwLAotICAgIDB4MDJDMSwgMHgzRTE5LCAweDAyQzYsIDB4MDA4MCwgMHgwMkM3LCAweDNEODUsIDB4MDJDOCwgMHgzREU2LAotICAgIDB4MDJDQywgMHgzREU3LCAweDAyRDAsIDB4MjRFMywgMHgwMkQxLCAweDNERTgsIDB4MDJEOCwgMHgzRDdBLAotICAgIDB4MDJEOSwgMHgzREE2LCAweDAyREEsIDB4MDA4NSwgMHgwMkRCLCAweDNEODIsIDB4MDJEQywgMHgwMDVGLAotICAgIDB4MDJERCwgMHgzRDg5LCAweDAyREUsIDB4M0RGQiwgMHgwMkUwLCAweDNFMUEsIDB4MDJFMSwgMHgzRTFCLAotICAgIDB4MDJFNSwgMHgzREVCLCAweDAyRTYsIDB4M0RFQywgMHgwMkU3LCAweDNERUQsIDB4MDJFOCwgMHgzREVFLAotICAgIDB4MDJFOSwgMHgzREVGLCAweDAzMDAsIDB4MDA0MSwgMHgwMzAxLCAweDAwN0YsIDB4MDMwMiwgMHgwMDgwLAotICAgIDB4MDMwMywgMHgwMDVGLCAweDAzMDQsIDB4MDA4MSwgMHgwMzA1LCAweDAwRTIsIDB4MDMwNiwgMHgwMDgyLAotICAgIDB4MDMwNywgMHgwMDgzLCAweDAzMDgsIDB4MDA4NCwgMHgwMzBBLCAweDAwODUsIDB4MDMwQiwgMHgwMDg3LAotICAgIDB4MDMwQywgMHgwMDg5LCAweDAzMEYsIDB4M0RFQSwgMHgwMzE4LCAweDNFMDIsIDB4MDMxOSwgMHgzRTAzLAotICAgIDB4MDMxQSwgMHgzRTA3LCAweDAzMUMsIDB4M0RGNSwgMHgwMzFELCAweDNFMDAsIDB4MDMxRSwgMHgzRTAxLAotICAgIDB4MDMxRiwgMHgzREY2LCAweDAzMjAsIDB4M0RGNywgMHgwMzI0LCAweDNERkMsIDB4MDMyNSwgMHgzREYyLAotICAgIDB4MDMyNywgMHgwMDg2LCAweDAzMjgsIDB4MDA4OCwgMHgwMzI5LCAweDNERjksIDB4MDMyQSwgMHgzRTA0LAotICAgIDB4MDMyQywgMHgzREYzLCAweDAzMkYsIDB4M0RGQSwgMHgwMzMwLCAweDNERkQsIDB4MDMzMiwgMHgwMDQwLAotICAgIDB4MDMzNCwgMHgzREZGLCAweDAzMzYsIDB4MDA4QSwgMHgwMzM5LCAweDNERjQsIDB4MDMzQSwgMHgzRTA1LAotICAgIDB4MDMzQiwgMHgzRTA2LCAweDAzM0MsIDB4M0RGRSwgMHgwMzNELCAweDNERjgsIDB4MDM2MSwgMHgzREU1LAotICAgIDB4MDM5MSwgMHgwM0YzLCAweDAzOTIsIDB4MDNGNCwgMHgwMzkzLCAweDAzRjUsIDB4MDM5NCwgMHgwM0Y2LAotICAgIDB4MDM5NSwgMHgwM0Y3LCAweDAzOTYsIDB4MDNGOCwgMHgwMzk3LCAweDAzRjksIDB4MDM5OCwgMHgwM0ZBLAotICAgIDB4MDM5OSwgMHgwM0ZCLCAweDAzOUEsIDB4MDNGQywgMHgwMzlCLCAweDAzRkQsIDB4MDM5QywgMHgwM0ZFLAotICAgIDB4MDM5RCwgMHgwM0ZGLCAweDAzOUUsIDB4MDQwMCwgMHgwMzlGLCAweDA0MDEsIDB4MDNBMCwgMHgwNDAyLAotICAgIDB4MDNBMSwgMHgwNDAzLCAweDAzQTMsIDB4MDQwNCwgMHgwM0E0LCAweDA0MDUsIDB4MDNBNSwgMHgwNDA2LAotICAgIDB4MDNBNiwgMHgwNDA3LCAweDAzQTcsIDB4MDQwOCwgMHgwM0E4LCAweDA0MDksIDB4MDNBOSwgMHgwNDBBLAotICAgIDB4MDNCMSwgMHgwNDBCLCAweDAzQjIsIDB4MDQwQywgMHgwM0IzLCAweDA0MEQsIDB4MDNCNCwgMHgwNDBFLAotICAgIDB4MDNCNSwgMHgwNDBGLCAweDAzQjYsIDB4MDQxMCwgMHgwM0I3LCAweDA0MTEsIDB4MDNCOCwgMHgwNDEyLAotICAgIDB4MDNCOSwgMHgwNDEzLCAweDAzQkEsIDB4MDQxNCwgMHgwM0JCLCAweDA0MTUsIDB4MDNCQywgMHgwNDE2LAotICAgIDB4MDNCRCwgMHgwNDE3LCAweDAzQkUsIDB4MDQxOCwgMHgwM0JGLCAweDA0MTksIDB4MDNDMCwgMHgwNDFBLAotICAgIDB4MDNDMSwgMHgwNDFCLCAweDAzQzIsIDB4M0Y1RSwgMHgwM0MzLCAweDA0MUMsIDB4MDNDNCwgMHgwNDFELAotICAgIDB4MDNDNSwgMHgwNDFFLCAweDAzQzYsIDB4MDQxRiwgMHgwM0M3LCAweDA0MjAsIDB4MDNDOCwgMHgwNDIxLAotICAgIDB4MDNDOSwgMHgwNDIyLCAweDAzRDAsIDB4MkYzQSwgMHgwM0QxLCAweDJGNDAsIDB4MDNENSwgMHgyRjNFLAotICAgIDB4MDNEQiwgMHgyRjNGLCAweDA0MDEsIDB4MDQyOSwgMHgwNDEwLCAweDA0MjMsIDB4MDQxMSwgMHgwNDI0LAotICAgIDB4MDQxMiwgMHgwNDI1LCAweDA0MTMsIDB4MDQyNiwgMHgwNDE0LCAweDA0MjcsIDB4MDQxNSwgMHgwNDI4LAotICAgIDB4MDQxNiwgMHgwNDJBLCAweDA0MTcsIDB4MDQyQiwgMHgwNDE4LCAweDA0MkMsIDB4MDQxOSwgMHgwNDJELAotICAgIDB4MDQxQSwgMHgwNDJFLCAweDA0MUIsIDB4MDQyRiwgMHgwNDFDLCAweDA0MzAsIDB4MDQxRCwgMHgwNDMxLAotICAgIDB4MDQxRSwgMHgwNDMyLCAweDA0MUYsIDB4MDQzMywgMHgwNDIwLCAweDA0MzQsIDB4MDQyMSwgMHgwNDM1LAotICAgIDB4MDQyMiwgMHgwNDM2LCAweDA0MjMsIDB4MDQzNywgMHgwNDI0LCAweDA0MzgsIDB4MDQyNSwgMHgwNDM5LAotICAgIDB4MDQyNiwgMHgwNDNBLCAweDA0MjcsIDB4MDQzQiwgMHgwNDI4LCAweDA0M0MsIDB4MDQyOSwgMHgwNDNELAotICAgIDB4MDQyQSwgMHgwNDNFLCAweDA0MkIsIDB4MDQzRiwgMHgwNDJDLCAweDA0NDAsIDB4MDQyRCwgMHgwNDQxLAotICAgIDB4MDQyRSwgMHgwNDQyLCAweDA0MkYsIDB4MDQ0MywgMHgwNDMwLCAweDA0NDQsIDB4MDQzMSwgMHgwNDQ1LAotICAgIDB4MDQzMiwgMHgwNDQ2LCAweDA0MzMsIDB4MDQ0NywgMHgwNDM0LCAweDA0NDgsIDB4MDQzNSwgMHgwNDQ5LAotICAgIDB4MDQzNiwgMHgwNDRCLCAweDA0MzcsIDB4MDQ0QywgMHgwNDM4LCAweDA0NEQsIDB4MDQzOSwgMHgwNDRFLAotICAgIDB4MDQzQSwgMHgwNDRGLCAweDA0M0IsIDB4MDQ1MCwgMHgwNDNDLCAweDA0NTEsIDB4MDQzRCwgMHgwNDUyLAotICAgIDB4MDQzRSwgMHgwNDUzLCAweDA0M0YsIDB4MDQ1NCwgMHgwNDQwLCAweDA0NTUsIDB4MDQ0MSwgMHgwNDU2LAotICAgIDB4MDQ0MiwgMHgwNDU3LCAweDA0NDMsIDB4MDQ1OCwgMHgwNDQ0LCAweDA0NTksIDB4MDQ0NSwgMHgwNDVBLAotICAgIDB4MDQ0NiwgMHgwNDVCLCAweDA0NDcsIDB4MDQ1QywgMHgwNDQ4LCAweDA0NUQsIDB4MDQ0OSwgMHgwNDVFLAotICAgIDB4MDQ0QSwgMHgwNDVGLCAweDA0NEIsIDB4MDQ2MCwgMHgwNDRDLCAweDA0NjEsIDB4MDQ0RCwgMHgwNDYyLAotICAgIDB4MDQ0RSwgMHgwNDYzLCAweDA0NEYsIDB4MDQ2NCwgMHgwNDUxLCAweDA0NEEsIDB4MUUzRSwgMHgzRDcxLAotICAgIDB4MUUzRiwgMHgzRDcyLCAweDFFQkMsIDB4MjRCNSwgMHgxRUJELCAweDI0QzEsIDB4MUY3MCwgMHgyNENDLAotICAgIDB4MUY3MSwgMHgyNENCLCAweDFGNzIsIDB4MjREQSwgMHgxRjczLCAweDI0RDksIDB4MjAwMiwgMHgwMEU3LAotICAgIDB4MjAwMywgMHgwMjc5LCAweDIwMTAsIDB4MDI5NiwgMHgyMDExLCAweDAwMEUsIDB4MjAxMiwgMHgwMDcyLAotICAgIDB4MjAxMywgMHgwMDcyLCAweDIwMTQsIDB4MDA4QSwgMHgyMDE1LCAweDAyOTUsIDB4MjAxNiwgMHgwMjlBLAotICAgIDB4MjAxOCwgMHgwMDYyLCAweDIwMTksIDB4MDA2MCwgMHgyMDFBLCAweDAwNzgsIDB4MjAxQywgMHgwMDZDLAotICAgIDB4MjAxRCwgMHgwMDdBLCAweDIwMUUsIDB4MDA3OSwgMHgyMDIwLCAweDAzMDgsIDB4MjAyMSwgMHgwMzA5LAotICAgIDB4MjAyMiwgMHgwMDc3LCAweDIwMjUsIDB4MDI5RCwgMHgyMDI2LCAweDAyOUMsIDB4MjAzMCwgMHgwMzA0LAotICAgIDB4MjAzMiwgMHgwMkM0LCAweDIwMzMsIDB4MDJDNSwgMHgyMDM5LCAweDAwNkUsIDB4MjAzQSwgMHgwMDZGLAotICAgIDB4MjAzQiwgMHgwMkRFLCAweDIwM0MsIDB4MkY0RiwgMHgyMDNFLCAweDAwRTIsIDB4MjAzRiwgMHgzREU5LAotICAgIDB4MjA0MiwgMHgzRjlBLCAweDIwNDQsIDB4MDA2OCwgMHgyMDQ3LCAweDNGOTYsIDB4MjA0OCwgMHgzRjk3LAotICAgIDB4MjA0OSwgMHgyRjUwLCAweDIwNTEsIDB4M0Y5OSwgMHgyMDcwLCAweDI0QTEsIDB4MjA3NCwgMHgyNEEyLAotICAgIDB4MjA3NSwgMHgyNEEzLCAweDIwNzYsIDB4MjRBNCwgMHgyMDc3LCAweDI0QTUsIDB4MjA3OCwgMHgyNEE2LAotICAgIDB4MjA3OSwgMHgyNEE3LCAweDIwODAsIDB4MjRBOCwgMHgyMDgxLCAweDI0QTksIDB4MjA4MiwgMHgyNEFBLAotICAgIDB4MjA4MywgMHgyNEFCLCAweDIwODQsIDB4MjRBQywgMHgyMDg1LCAweDI0QUQsIDB4MjA4NiwgMHgyNEFFLAotICAgIDB4MjA4NywgMHgyNEFGLCAweDIwODgsIDB4MjRCMCwgMHgyMDg5LCAweDI0QjEsIDB4MjBBQywgMHgyNDhBLAotICAgIDB4MjBERCwgMHgzRkM4LCAweDIwREUsIDB4MkIxQiwgMHgyMTAwLCAweDJFNEYsIDB4MjEwMywgMHgwMkM2LAotICAgIDB4MjEwNSwgMHgyRTUzLCAweDIxMDksIDB4MjA3MSwgMHgyMTBBLCAweDIwNzAsIDB4MjEwRiwgMHgyRjNDLAotICAgIDB4MjExMywgMHgxRjU5LCAweDIxMTYsIDB4MURCQSwgMHgyMTIxLCAweDFGNzcsIDB4MjEyMiwgMHgwMEU0LAotICAgIDB4MjEyNiwgMHgyNDhCLCAweDIxMjcsIDB4M0M5QiwgMHgyMTJCLCAweDAzMDMsIDB4MjEzNSwgMHgyRjM5LAotICAgIDB4MjEzQiwgMHgyMDczLCAweDIxNTMsIDB4MjQ5RiwgMHgyMTU0LCAweDI0QTAsIDB4MjE1NSwgMHgzRDZGLAotICAgIDB4MjE1NiwgMHgyNjM5LCAweDIxNTcsIDB4MjYzQSwgMHgyMTU4LCAweDI2M0IsIDB4MjE1OSwgMHgyNjNDLAotICAgIDB4MjE1QSwgMHgyNjNELCAweDIxNUIsIDB4MjQ5QiwgMHgyMTVDLCAweDI0OUMsIDB4MjE1RCwgMHgyNDlELAotICAgIDB4MjE1RSwgMHgyNDlFLCAweDIxNjAsIDB4MUQ5NywgMHgyMTYxLCAweDFEOTgsIDB4MjE2MiwgMHgxRDk5LAotICAgIDB4MjE2MywgMHgxRDlBLCAweDIxNjQsIDB4MUQ5QiwgMHgyMTY1LCAweDFEOUMsIDB4MjE2NiwgMHgxRDlELAotICAgIDB4MjE2NywgMHgxRDlFLCAweDIxNjgsIDB4MUQ5RiwgMHgyMTY5LCAweDFEQTAsIDB4MjE2QSwgMHgyMDIxLAotICAgIDB4MjE2QiwgMHgyMDIyLCAweDIxNzAsIDB4MUY5QywgMHgyMTcxLCAweDFGOUQsIDB4MjE3MiwgMHgxRjlFLAotICAgIDB4MjE3MywgMHgxRjlGLCAweDIxNzQsIDB4MUZBMCwgMHgyMTc1LCAweDFGQTEsIDB4MjE3NiwgMHgxRkEyLAotICAgIDB4MjE3NywgMHgxRkEzLCAweDIxNzgsIDB4MUZBNCwgMHgyMTc5LCAweDFGQTUsIDB4MjE3QSwgMHgyMDZBLAotICAgIDB4MjE3QiwgMHgyMDZCLCAweDIxN0YsIDB4MjA2RiwgMHgyMTkwLCAweDAyRTEsIDB4MjE5MSwgMHgwMkUyLAotICAgIDB4MjE5MiwgMHgwMkUwLCAweDIxOTMsIDB4MDJFMywgMHgyMTk0LCAweDJGQTksIDB4MjE5NiwgMHgyRkFDLAotICAgIDB4MjE5NywgMHgyRkFELCAweDIxOTgsIDB4MkZBQSwgMHgyMTk5LCAweDJGQUIsIDB4MjFDNCwgMHgyMDc2LAotICAgIDB4MjFDNSwgMHgyMDc3LCAweDIxQzYsIDB4MjA3NSwgMHgyMUNCLCAweDJGQUYsIDB4MjFDQywgMHgyRkFFLAotICAgIDB4MjFEMCwgMHgyRkE4LCAweDIxRDIsIDB4MDJGMCwgMHgyMUQ0LCAweDAyRjEsIDB4MjFFNiwgMHgxRjRELAotICAgIDB4MjFFNywgMHgxRjRDLCAweDIxRTgsIDB4MUY0RSwgMHgyMUU5LCAweDFGNEIsIDB4MjIwMCwgMHgwMkYyLAotICAgIDB4MjIwMiwgMHgwMkY3LCAweDIyMDMsIDB4MDJGMywgMHgyMjA1LCAweDJGOTgsIDB4MjIwNywgMHgwMkY4LAotICAgIDB4MjIwOCwgMHgwMkU1LCAweDIyMDksIDB4M0M3NCwgMHgyMjBBLCAweDJGM0IsIDB4MjIwQiwgMHgwMkU2LAotICAgIDB4MjIxMSwgMHgxREM5LCAweDIyMTIsIDB4MDJCNSwgMHgyMjEzLCAweDJGNTYsIDB4MjIxOSwgMHgwMDc1LAotICAgIDB4MjIxQSwgMHgwMkZELCAweDIyMUQsIDB4MDJGRiwgMHgyMjFFLCAweDAyQkYsIDB4MjIxRiwgMHgxRENELAotICAgIDB4MjIyMCwgMHgwMkY0LCAweDIyMjUsIDB4M0M4MSwgMHgyMjI2LCAweDNDODIsIDB4MjIyNywgMHgwMkVELAotICAgIDB4MjIyOCwgMHgwMkVFLCAweDIyMjksIDB4MDJFQywgMHgyMjJBLCAweDAyRUIsIDB4MjIyQiwgMHgwMzAxLAotICAgIDB4MjIyQywgMHgwMzAyLCAweDIyMkQsIDB4MjAwMywgMHgyMjJFLCAweDFEQzgsIDB4MjIzNCwgMHgwMkMwLAotICAgIDB4MjIzNSwgMHgwMzAwLCAweDIyM0MsIDB4MDA2NCwgMHgyMjNELCAweDAyRkUsIDB4MjI0MywgMHgyRjU4LAotICAgIDB4MjI0NSwgMHgzQzkzLCAweDIyNDgsIDB4M0M5NCwgMHgyMjUyLCAweDAyRkEsIDB4MjI2MCwgMHgwMkJBLAotICAgIDB4MjI2MSwgMHgwMkY5LCAweDIyNjIsIDB4M0M5MSwgMHgyMjY2LCAweDAyQkQsIDB4MjI2NywgMHgwMkJFLAotICAgIDB4MjI2QSwgMHgwMkZCLCAweDIyNkIsIDB4MDJGQywgMHgyMjcyLCAweDJGNTksIDB4MjI3MywgMHgyRjVBLAotICAgIDB4MjI3NiwgMHgzQzk1LCAweDIyNzcsIDB4M0M5NiwgMHgyMjgyLCAweDAyRTksIDB4MjI4MywgMHgwMkVBLAotICAgIDB4MjI4NCwgMHgzQzcwLCAweDIyODUsIDB4M0M3MSwgMHgyMjg2LCAweDAyRTcsIDB4MjI4NywgMHgwMkU4LAotICAgIDB4MjI4QSwgMHgzQzcyLCAweDIyOEIsIDB4M0M3MywgMHgyMjk1LCAweDJGOUMsIDB4MjI5NiwgMHgyRjlBLAotICAgIDB4MjI5NywgMHgyRjlELCAweDIyOTgsIDB4MkY5QiwgMHgyMjlFLCAweDNFMjIsIDB4MjJBMCwgMHgyRjk5LAotICAgIDB4MjJBNSwgMHgwMkY1LCAweDIyQkYsIDB4MURDRSwgMHgyMkRBLCAweDNENkQsIDB4MjJEQiwgMHgzRDZFLAotICAgIDB4MjMwNSwgMHgzQzc2LCAweDIzMDYsIDB4M0M3NywgMHgyMzA3LCAweDJGQkIsIDB4MjMxMiwgMHgwMkY2LAotICAgIDB4MjMxOCwgMHgzRDcwLCAweDIzOUIsIDB4MkY2RiwgMHgyMzlDLCAweDJGODcsIDB4MjM5RCwgMHgyRjcwLAotICAgIDB4MjM5RSwgMHgyRjcxLCAweDIzOUYsIDB4MkY4NywgMHgyM0EwLCAweDJGNzIsIDB4MjNBMSwgMHgyRjc3LAotICAgIDB4MjNBMiwgMHgyRjg3LCAweDIzQTMsIDB4MkY3OCwgMHgyM0E0LCAweDJGNzksIDB4MjNBNSwgMHgyRjg3LAotICAgIDB4MjNBNiwgMHgyRjdBLCAweDIzQTcsIDB4MUZGMiwgMHgyM0E4LCAweDFGRjMsIDB4MjNBOSwgMHgxRkY0LAotICAgIDB4MjNBQSwgMHgyRjg3LCAweDIzQUIsIDB4MUZFRSwgMHgyM0FDLCAweDFGRUYsIDB4MjNBRCwgMHgxRkYwLAotICAgIDB4MjNCMCwgMHgzRkI4LCAweDIzQjEsIDB4M0ZCOSwgMHgyM0JFLCAweDNGN0QsIDB4MjNCRiwgMHgzRjdFLAotICAgIDB4MjNDMCwgMHgzRjdGLCAweDIzQzEsIDB4M0Y4MCwgMHgyM0MyLCAweDNGODEsIDB4MjNDMywgMHgzRjgyLAotICAgIDB4MjNDNCwgMHgzRjgzLCAweDIzQzUsIDB4M0Y4NCwgMHgyM0M2LCAweDNGODUsIDB4MjNDNywgMHgzRjg2LAotICAgIDB4MjNDOCwgMHgzRjg3LCAweDIzQzksIDB4M0Y4OCwgMHgyM0NBLCAweDNGODksIDB4MjNDQiwgMHgzRjhBLAotICAgIDB4MjNDQywgMHgzRjhCLCAweDIzQ0UsIDB4M0Y5MSwgMHgyNDIzLCAweDNGOTAsIDB4MjQ2MCwgMHgxRDgzLAotICAgIDB4MjQ2MSwgMHgxRDg0LCAweDI0NjIsIDB4MUQ4NSwgMHgyNDYzLCAweDFEODYsIDB4MjQ2NCwgMHgxRDg3LAotICAgIDB4MjQ2NSwgMHgxRDg4LCAweDI0NjYsIDB4MUQ4OSwgMHgyNDY3LCAweDFEOEEsIDB4MjQ2OCwgMHgxRDhCLAotICAgIDB4MjQ2OSwgMHgxRDhDLCAweDI0NkEsIDB4MUQ4RCwgMHgyNDZCLCAweDFEOEUsIDB4MjQ2QywgMHgxRDhGLAotICAgIDB4MjQ2RCwgMHgxRDkwLCAweDI0NkUsIDB4MUQ5MSwgMHgyNDZGLCAweDFEOTIsIDB4MjQ3MCwgMHgxRDkzLAotICAgIDB4MjQ3MSwgMHgxRDk0LCAweDI0NzIsIDB4MUQ5NSwgMHgyNDczLCAweDFEOTYsIDB4MjQ3NCwgMHgxRjg3LAotICAgIDB4MjQ3NSwgMHgxRjg4LCAweDI0NzYsIDB4MUY4OSwgMHgyNDc3LCAweDFGOEEsIDB4MjQ3OCwgMHgxRjhCLAotICAgIDB4MjQ3OSwgMHgxRjhDLCAweDI0N0EsIDB4MUY4RCwgMHgyNDdCLCAweDFGOEUsIDB4MjQ3QywgMHgxRjhGLAotICAgIDB4MjQ3RCwgMHgxRjkwLCAweDI0N0UsIDB4MUY5MSwgMHgyNDdGLCAweDFGOTIsIDB4MjQ4MCwgMHgxRjkzLAotICAgIDB4MjQ4MSwgMHgxRjk0LCAweDI0ODIsIDB4MUY5NSwgMHgyNDgzLCAweDFGOTYsIDB4MjQ4NCwgMHgxRjk3LAotICAgIDB4MjQ4NSwgMHgxRjk4LCAweDI0ODYsIDB4MUY5OSwgMHgyNDg3LCAweDFGOUEsIDB4MjQ4OCwgMHgxRjdFLAotICAgIDB4MjQ4OSwgMHgxRjdGLCAweDI0OEEsIDB4MUY4MCwgMHgyNDhCLCAweDFGODEsIDB4MjQ4QywgMHgxRjgyLAotICAgIDB4MjQ4RCwgMHgxRjgzLCAweDI0OEUsIDB4MUY4NCwgMHgyNDhGLCAweDFGODUsIDB4MjQ5MCwgMHgxRjg2LAotICAgIDB4MjQ5QywgMHgxRkIwLCAweDI0OUQsIDB4MUZCMSwgMHgyNDlFLCAweDFGQjIsIDB4MjQ5RiwgMHgxRkIzLAotICAgIDB4MjRBMCwgMHgxRkI0LCAweDI0QTEsIDB4MUZCNSwgMHgyNEEyLCAweDFGQjYsIDB4MjRBMywgMHgxRkI3LAotICAgIDB4MjRBNCwgMHgxRkI4LCAweDI0QTUsIDB4MUZCOSwgMHgyNEE2LCAweDFGQkEsIDB4MjRBNywgMHgxRkJCLAotICAgIDB4MjRBOCwgMHgxRkJDLCAweDI0QTksIDB4MUZCRCwgMHgyNEFBLCAweDFGQkUsIDB4MjRBQiwgMHgxRkJGLAotICAgIDB4MjRBQywgMHgxRkMwLCAweDI0QUQsIDB4MUZDMSwgMHgyNEFFLCAweDFGQzIsIDB4MjRBRiwgMHgxRkMzLAotICAgIDB4MjRCMCwgMHgxRkM0LCAweDI0QjEsIDB4MUZDNSwgMHgyNEIyLCAweDFGQzYsIDB4MjRCMywgMHgxRkM3LAotICAgIDB4MjRCNCwgMHgxRkM4LCAweDI0QjUsIDB4MUZDOSwgMHgyNEI2LCAweDI4NjMsIDB4MjRCNywgMHgyODY0LAotICAgIDB4MjRCOCwgMHgyODY1LCAweDI0QjksIDB4Mjg2NiwgMHgyNEJBLCAweDI4NjcsIDB4MjRCQiwgMHgyODY4LAotICAgIDB4MjRCQywgMHgyODY5LCAweDI0QkQsIDB4Mjg2QSwgMHgyNEJFLCAweDI4NkIsIDB4MjRCRiwgMHgyODZDLAotICAgIDB4MjRDMCwgMHgyODZELCAweDI0QzEsIDB4Mjg2RSwgMHgyNEMyLCAweDI4NkYsIDB4MjRDMywgMHgyODcwLAotICAgIDB4MjRDNCwgMHgyODcxLCAweDI0QzUsIDB4Mjg3MiwgMHgyNEM2LCAweDI4NzMsIDB4MjRDNywgMHgyODc0LAotICAgIDB4MjRDOCwgMHgyODc1LCAweDI0QzksIDB4Mjg3NiwgMHgyNENBLCAweDI4NzcsIDB4MjRDQiwgMHgyODc4LAotICAgIDB4MjRDQywgMHgyODc5LCAweDI0Q0QsIDB4Mjg3QSwgMHgyNENFLCAweDI4N0IsIDB4MjRDRiwgMHgyODdDLAotICAgIDB4MjREMCwgMHgyODQ5LCAweDI0RDEsIDB4Mjg0QSwgMHgyNEQyLCAweDI4NEIsIDB4MjREMywgMHgyODRDLAotICAgIDB4MjRENCwgMHgyODRELCAweDI0RDUsIDB4Mjg0RSwgMHgyNEQ2LCAweDI4NEYsIDB4MjRENywgMHgyODUwLAotICAgIDB4MjREOCwgMHgyODUxLCAweDI0RDksIDB4Mjg1MiwgMHgyNERBLCAweDI4NTMsIDB4MjREQiwgMHgyODU0LAotICAgIDB4MjREQywgMHgyODU1LCAweDI0REQsIDB4Mjg1NiwgMHgyNERFLCAweDI4NTcsIDB4MjRERiwgMHgyODU4LAotICAgIDB4MjRFMCwgMHgyODU5LCAweDI0RTEsIDB4Mjg1QSwgMHgyNEUyLCAweDI4NUIsIDB4MjRFMywgMHgyODVDLAotICAgIDB4MjRFNCwgMHgyODVELCAweDI0RTUsIDB4Mjg1RSwgMHgyNEU2LCAweDI4NUYsIDB4MjRFNywgMHgyODYwLAotICAgIDB4MjRFOCwgMHgyODYxLCAweDI0RTksIDB4Mjg2MiwgMHgyNEVBLCAweDIwMjAsIDB4MjRFQiwgMHgyOTEzLAotICAgIDB4MjRFQywgMHgyOTE0LCAweDI0RUQsIDB4MjkxNSwgMHgyNEVFLCAweDI5MTYsIDB4MjRFRiwgMHgyOTE3LAotICAgIDB4MjRGMCwgMHgyOTE4LCAweDI0RjEsIDB4MjkxOSwgMHgyNEYyLCAweDI5MUEsIDB4MjRGMywgMHgyOTFCLAotICAgIDB4MjRGNCwgMHgyOTFDLCAweDI0RjUsIDB4M0Y1RiwgMHgyNEY2LCAweDNGNjAsIDB4MjRGNywgMHgzRjYxLAotICAgIDB4MjRGOCwgMHgzRjYyLCAweDI0RjksIDB4M0Y2MywgMHgyNEZBLCAweDNGNjQsIDB4MjRGQiwgMHgzRjY1LAotICAgIDB4MjRGQywgMHgzRjY2LCAweDI0RkQsIDB4M0Y2NywgMHgyNEZFLCAweDNGNjgsIDB4MjRGRiwgMHgyOTA3LAotICAgIDB4MjUwMCwgMHgxRDM3LCAweDI1MDEsIDB4MUQzOCwgMHgyNTAyLCAweDFEMzksIDB4MjUwMywgMHgxRDNBLAotICAgIDB4MjUwNCwgMHgxRDNCLCAweDI1MDUsIDB4MUQzQywgMHgyNTA2LCAweDFEM0QsIDB4MjUwNywgMHgxRDNFLAotICAgIDB4MjUwOCwgMHgxRDNGLCAweDI1MDksIDB4MUQ0MCwgMHgyNTBBLCAweDFENDEsIDB4MjUwQiwgMHgxRDQyLAotICAgIDB4MjUwQywgMHgxRDQzLCAweDI1MEQsIDB4MUQ0NCwgMHgyNTBFLCAweDFENDUsIDB4MjUwRiwgMHgxRDQ2LAotICAgIDB4MjUxMCwgMHgxRDQ3LCAweDI1MTEsIDB4MUQ0OCwgMHgyNTEyLCAweDFENDksIDB4MjUxMywgMHgxRDRBLAotICAgIDB4MjUxNCwgMHgxRDRCLCAweDI1MTUsIDB4MUQ0QywgMHgyNTE2LCAweDFENEQsIDB4MjUxNywgMHgxRDRFLAotICAgIDB4MjUxOCwgMHgxRDRGLCAweDI1MTksIDB4MUQ1MCwgMHgyNTFBLCAweDFENTEsIDB4MjUxQiwgMHgxRDUyLAotICAgIDB4MjUxQywgMHgxRDUzLCAweDI1MUQsIDB4MUQ1NCwgMHgyNTFFLCAweDFENTUsIDB4MjUxRiwgMHgxRDU2LAotICAgIDB4MjUyMCwgMHgxRDU3LCAweDI1MjEsIDB4MUQ1OCwgMHgyNTIyLCAweDFENTksIDB4MjUyMywgMHgxRDVBLAotICAgIDB4MjUyNCwgMHgxRDVCLCAweDI1MjUsIDB4MUQ1QywgMHgyNTI2LCAweDFENUQsIDB4MjUyNywgMHgxRDVFLAotICAgIDB4MjUyOCwgMHgxRDVGLCAweDI1MjksIDB4MUQ2MCwgMHgyNTJBLCAweDFENjEsIDB4MjUyQiwgMHgxRDYyLAotICAgIDB4MjUyQywgMHgxRDYzLCAweDI1MkQsIDB4MUQ2NCwgMHgyNTJFLCAweDFENjUsIDB4MjUyRiwgMHgxRDY2LAotICAgIDB4MjUzMCwgMHgxRDY3LCAweDI1MzEsIDB4MUQ2OCwgMHgyNTMyLCAweDFENjksIDB4MjUzMywgMHgxRDZBLAotICAgIDB4MjUzNCwgMHgxRDZCLCAweDI1MzUsIDB4MUQ2QywgMHgyNTM2LCAweDFENkQsIDB4MjUzNywgMHgxRDZFLAotICAgIDB4MjUzOCwgMHgxRDZGLCAweDI1MzksIDB4MUQ3MCwgMHgyNTNBLCAweDFENzEsIDB4MjUzQiwgMHgxRDcyLAotICAgIDB4MjUzQywgMHgxRDczLCAweDI1M0QsIDB4MUQ3NCwgMHgyNTNFLCAweDFENzUsIDB4MjUzRiwgMHgxRDc2LAotICAgIDB4MjU0MCwgMHgxRDc3LCAweDI1NDEsIDB4MUQ3OCwgMHgyNTQyLCAweDFENzksIDB4MjU0MywgMHgxRDdBLAotICAgIDB4MjU0NCwgMHgxRDdCLCAweDI1NDUsIDB4MUQ3QywgMHgyNTQ2LCAweDFEN0QsIDB4MjU0NywgMHgxRDdFLAotICAgIDB4MjU0OCwgMHgxRDdGLCAweDI1NDksIDB4MUQ4MCwgMHgyNTRBLCAweDFEODEsIDB4MjU0QiwgMHgxRDgyLAotICAgIDB4MjU1MCwgMHgyMDNCLCAweDI1NUUsIDB4MjAzQywgMHgyNTYxLCAweDIwM0UsIDB4MjU2QSwgMHgyMDNELAotICAgIDB4MjU2RCwgMHgyMDM3LCAweDI1NkUsIDB4MjAzOCwgMHgyNTZGLCAweDIwM0EsIDB4MjU3MCwgMHgyMDM5LAotICAgIDB4MjU3MSwgMHgyMDQ1LCAweDI1NzIsIDB4MjA0NiwgMHgyNTczLCAweDIwNDcsIDB4MjU4MSwgMHgyMDI2LAotICAgIDB4MjU4MiwgMHgyMDI3LCAweDI1ODMsIDB4MjAyOCwgMHgyNTg0LCAweDIwMjksIDB4MjU4NSwgMHgyMDJBLAotICAgIDB4MjU4NiwgMHgyMDJCLCAweDI1ODcsIDB4MjAyQywgMHgyNTg4LCAweDIwMkQsIDB4MjU4OSwgMHgyMDM0LAotICAgIDB4MjU4QSwgMHgyMDMzLCAweDI1OEIsIDB4MjAzMiwgMHgyNThDLCAweDIwMzEsIDB4MjU4RCwgMHgyMDMwLAotICAgIDB4MjU4RSwgMHgyMDJGLCAweDI1OEYsIDB4MjAyRSwgMHgyNTk0LCAweDIwMzUsIDB4MjU5NSwgMHgyMDM2LAotICAgIDB4MjVBMCwgMHgwMkQ5LCAweDI1QTEsIDB4MDJEOCwgMHgyNUEyLCAweDFGNEYsIDB4MjVBQSwgMHgyRkNGLAotICAgIDB4MjVBQiwgMHgyRkNELCAweDI1QjEsIDB4M0Y2QiwgMHgyNUIyLCAweDAyREIsIDB4MjVCMywgMHgwMkRBLAotICAgIDB4MjVCNiwgMHgyRkEzLCAweDI1QjcsIDB4MUY0QSwgMHgyNUJDLCAweDAyREQsIDB4MjVCRCwgMHgwMkRDLAotICAgIDB4MjVDMCwgMHgyRkEyLCAweDI1QzEsIDB4MUY0OSwgMHgyNUM2LCAweDAyRDcsIDB4MjVDNywgMHgwMkQ2LAotICAgIDB4MjVDOSwgMHgyMDEyLCAweDI1Q0IsIDB4MDJEMywgMHgyNUNDLCAweDI5MDYsIDB4MjVDRSwgMHgwMkQ1LAotICAgIDB4MjVDRiwgMHgwMkQ0LCAweDI1RDAsIDB4M0Y5MiwgMHgyNUQxLCAweDNGOTMsIDB4MjVEMiwgMHgzRjk0LAotICAgIDB4MjVEMywgMHgzRjk1LCAweDI1RTIsIDB4MjAzRiwgMHgyNUUzLCAweDIwNDAsIDB4MjVFNCwgMHgyMDQyLAotICAgIDB4MjVFNSwgMHgyMDQxLCAweDI1RTYsIDB4MkZERSwgMHgyNUVGLCAweDAzMEIsIDB4MjYwMCwgMHgyMDE3LAotICAgIDB4MjYwMSwgMHgyMDE4LCAweDI2MDIsIDB4MjAxOSwgMHgyNjAzLCAweDIwMUEsIDB4MjYwNSwgMHgwMkQyLAotICAgIDB4MjYwNiwgMHgwMkQxLCAweDI2MEUsIDB4MUY3OCwgMHgyNjE2LCAweDNGNjksIDB4MjYxNywgMHgzRjZBLAotICAgIDB4MjYxQywgMHgyMDFDLCAweDI2MUQsIDB4MjAxRCwgMHgyNjFFLCAweDIwMUIsIDB4MjYxRiwgMHgyMDFFLAotICAgIDB4MjY0MCwgMHgwMkMyLCAweDI2NDIsIDB4MDJDMSwgMHgyNjYwLCAweDIwMTMsIDB4MjY2MSwgMHgxRjUxLAotICAgIDB4MjY2MiwgMHgxRjUzLCAweDI2NjMsIDB4MjAxNSwgMHgyNjY0LCAweDFGNTIsIDB4MjY2NSwgMHgyMDE0LAotICAgIDB4MjY2NiwgMHgyMDE2LCAweDI2NjcsIDB4MUY1MCwgMHgyNjY4LCAweDJGNDIsIDB4MjY2OSwgMHgyRjQzLAotICAgIDB4MjY2QSwgMHgwMzA3LCAweDI2NkIsIDB4M0Y0OCwgMHgyNjZDLCAweDJGNDQsIDB4MjY2RCwgMHgwMzA2LAotICAgIDB4MjY2RSwgMHgzRjQ3LCAweDI2NkYsIDB4MDMwNSwgMHgyNjcyLCAweDNGQkEsIDB4MjY3MywgMHgzRkJCLAotICAgIDB4MjY3NCwgMHgzRkJDLCAweDI2NzUsIDB4M0ZCRCwgMHgyNjc2LCAweDNGQkUsIDB4MjY3NywgMHgzRkJGLAotICAgIDB4MjY3OCwgMHgzRkMwLCAweDI2NzksIDB4M0ZDMSwgMHgyNjdBLCAweDNGQzIsIDB4MjY3QiwgMHgzRkMzLAotICAgIDB4MjY3QywgMHgzRkM0LCAweDI2N0QsIDB4M0ZDNSwgMHgyNkEwLCAweDJGQTAsIDB4MjcwMiwgMHgyRjkwLAotICAgIDB4MjcxMywgMHgzRjhFLCAweDI3MUEsIDB4MkZEMSwgMHgyNzNGLCAweDJGQzUsIDB4Mjc0MCwgMHgyRkM0LAotICAgIDB4Mjc1NiwgMHgyRkUzLCAweDI3NzYsIDB4MjA1RSwgMHgyNzc3LCAweDIwNUYsIDB4Mjc3OCwgMHgyMDYwLAotICAgIDB4Mjc3OSwgMHgyMDYxLCAweDI3N0EsIDB4MjA2MiwgMHgyNzdCLCAweDIwNjMsIDB4Mjc3QywgMHgyMDY0LAotICAgIDB4Mjc3RCwgMHgyMDY1LCAweDI3N0UsIDB4MjA2NiwgMHgyNzdGLCAweDI5MTIsIDB4MjdBMSwgMHgyMDBFLAotICAgIDB4MjkzNCwgMHgzRjQ5LCAweDI5MzUsIDB4M0Y0QSwgMHgyOUJGLCAweDNGNEIsIDB4MjlGQSwgMHgzRjRGLAotICAgIDB4MjlGQiwgMHgzRjUwLCAweDJCMDUsIDB4MjAwRiwgMHgyQjA2LCAweDIwMTAsIDB4MkIwNywgMHgyMDExLAotICAgIDB4MkU4MywgMHgzN0UxLCAweDJFODUsIDB4MzYyMCwgMHgyRTg3LCAweDM3MTksIDB4MkU4OSwgMHgzODE0LAotICAgIDB4MkU4QiwgMHgzNzFFLCAweDJFOEMsIDB4MzYwOSwgMHgyRThELCAweDM2MEEsIDB4MkU4RSwgMHgxMDcxLAotICAgIDB4MkU4RiwgMHgzODhDLCAweDJFOTAsIDB4MTIyNiwgMHgyRTkyLCAweDBFQjIsIDB4MkU5MywgMHgxMjgzLAotICAgIDB4MkU5NCwgMHgxMkFCLCAweDJFOTUsIDB4M0MxRiwgMHgyRTk2LCAweDM4QzIsIDB4MkU5NywgMHgzNjFDLAotICAgIDB4MkU5OCwgMHgzOEUxLCAweDJFOTksIDB4MTNDMywgMHgyRTlCLCAweDEzRTEsIDB4MkU5RSwgMHg0NUU1LAotICAgIDB4MkU5RiwgMHgwRTNDLCAweDJFQTAsIDB4MEVCRCwgMHgyRUExLCAweDM5NjEsIDB4MkVBMiwgMHgzOTYyLAotICAgIDB4MkVBMywgMHgzOTlELCAweDJFQTQsIDB4M0MyNiwgMHgyRUE2LCAweDM3NEQsIDB4MkVBOCwgMHgzOUJDLAotICAgIDB4MkVBOSwgMHgzNUExLCAweDJFQUEsIDB4MzZBQiwgMHgyRUFCLCAweDNBOTcsIDB4MkVBQywgMHg0QUJBLAotICAgIDB4MkVBRCwgMHgzQTM5LCAweDJFQUUsIDB4MzY2MiwgMHgyRUIxLCAweDNBOTgsIDB4MkVCMiwgMHgzQTk3LAotICAgIDB4MkVCMywgMHgzNzZELCAweDJFQjcsIDB4MzZGRSwgMHgyRUI5LCAweDM3MTMsIDB4MkVCQywgMHgzNUIzLAotICAgIDB4MkVCRCwgMHgzNTRFLCAweDJFQkUsIDB4Mzc3NSwgMHgyRUJGLCAweDM3NzYsIDB4MkVDMCwgMHgzNzc3LAotICAgIDB4MkVDMSwgMHgwNzhCLCAweDJFQzIsIDB4M0IwQSwgMHgyRUMzLCAweDM2MkUsIDB4MkVDNCwgMHgwQTYyLAotICAgIDB4MkVDNiwgMHgzNTcyLCAweDJFQ0EsIDB4MzY0QSwgMHgyRUNDLCAweDNDMkIsIDB4MkVDRCwgMHgzQjUwLAotICAgIDB4MkVDRiwgMHgzQjlFLCAweDJFRDEsIDB4MEJENSwgMHgyRUQyLCAweDNCOTcsIDB4MkVENiwgMHgzQjlFLAotICAgIDB4MkVENywgMHgzNTRELCAweDJFRDgsIDB4MEE2OCwgMHgyRURELCAweDM2MTcsIDB4MkVERSwgMHgzNjE5LAotICAgIDB4MkVERiwgMHgzNjE4LCAweDJFRTQsIDB4MDY0RSwgMHgyRUU4LCAweDBEMzQsIDB4MkVFOSwgMHgwNTJCLAotICAgIDB4MkVFQiwgMHgwQTZBLCAweDJFRUQsIDB4MDhDMywgMHgyRUVGLCAweDBGN0QsIDB4MkVGMiwgMHgwNjRGLAotICAgIDB4MkYwMCwgMHgwNEIwLCAweDJGMDEsIDB4MjBCMywgMHgyRjAyLCAweDBGRkYsIDB4MkYwMywgMHgxMDAxLAotICAgIDB4MkYwNCwgMHgwNTM1LCAweDJGMDUsIDB4MTAwNiwgMHgyRjA2LCAweDBDQ0IsIDB4MkYwNywgMHgxMDBFLAotICAgIDB4MkYwOCwgMHgwQTEzLCAweDJGMDksIDB4MTA3MCwgMHgyRjBBLCAweDBDRDYsIDB4MkYwQiwgMHgwRDQwLAotICAgIDB4MkYwQywgMHgxMDdCLCAweDJGMEQsIDB4MTA4MywgMHgyRjBFLCAweDEwODksIDB4MkYwRiwgMHgxMDkzLAotICAgIDB4MkYxMCwgMHgxMDk4LCAweDJGMTEsIDB4MEM1QiwgMHgyRjEyLCAweDBGOTcsIDB4MkYxMywgMHgxMEM2LAotICAgIDB4MkYxNCwgMHgxMENELCAweDJGMTUsIDB4MTBDRSwgMHgyRjE2LCAweDEwRDMsIDB4MkYxNywgMHgwOTQ3LAotICAgIDB4MkYxOCwgMHgwRTdDLCAweDJGMTksIDB4MTBEQywgMHgyRjFBLCAweDEwRTEsIDB4MkYxQiwgMHgxMEU4LAotICAgIDB4MkYxQywgMHgwRUEyLCAweDJGMUQsIDB4MDdCMSwgMHgyRjFFLCAweDExNkIsIDB4MkYxRiwgMHgwQzU0LAotICAgIDB4MkYyMCwgMHgwODlDLCAweDJGMjEsIDB4MTFCQSwgMHgyRjIyLCAweDExQkIsIDB4MkYyMywgMHgwRjI2LAotICAgIDB4MkYyNCwgMHgwQjQ3LCAweDJGMjUsIDB4MDk4MSwgMHgyRjI2LCAweDA4QTAsIDB4MkYyNywgMHgxMjBFLAotICAgIDB4MkYyOCwgMHgwQTQ3LCAweDJGMjksIDB4MDk5NiwgMHgyRjJBLCAweDEyMjYsIDB4MkYyQiwgMHgxMjI4LAotICAgIDB4MkYyQywgMHgxMjMyLCAweDJGMkQsIDB4MDg4MSwgMHgyRjJFLCAweDEyNkMsIDB4MkYyRiwgMHgwN0JCLAotICAgIDB4MkYzMCwgMHgwNzdFLCAweDJGMzEsIDB4MDZDQSwgMHgyRjMyLCAweDA1RUYsIDB4MkYzMywgMHgxMjgzLAotICAgIDB4MkYzNCwgMHgxMjg1LCAweDJGMzUsIDB4MTI5OSwgMHgyRjM2LCAweDEyOUIsIDB4MkYzNywgMHgxMkEwLAotICAgIDB4MkYzOCwgMHgwNjc3LCAweDJGMzksIDB4MzhCOSwgMHgyRjNBLCAweDEyQUYsIDB4MkYzQiwgMHgxMkIxLAotICAgIDB4MkYzQywgMHgwOUZBLCAweDJGM0QsIDB4MTM0MiwgMHgyRjNFLCAweDA3ODEsIDB4MkYzRiwgMHgwOTE2LAotICAgIDB4MkY0MCwgMHgwOEE3LCAweDJGNDEsIDB4MTNDMiwgMHgyRjQyLCAweDBFMDgsIDB4MkY0MywgMHgwQzQ3LAotICAgIDB4MkY0NCwgMHgwNkNDLCAweDJGNDUsIDB4MEU0RCwgMHgyRjQ2LCAweDEzRTAsIDB4MkY0NywgMHgwQ0Q0LAotICAgIDB4MkY0OCwgMHgxNDBDLCAweDJGNDksIDB4MDc0NCwgMHgyRjRBLCAweDBFRTYsIDB4MkY0QiwgMHgwNzNELAotICAgIDB4MkY0QywgMHgwOEFELCAweDJGNEQsIDB4MTRFNSwgMHgyRjRFLCAweDE0RjQsIDB4MkY0RiwgMHgxNEY4LAotICAgIDB4MkY1MCwgMHgwRDdBLCAweDJGNTEsIDB4MEVERiwgMHgyRjUyLCAweDA4QUYsIDB4MkY1MywgMHgxNTAyLAotICAgIDB4MkY1NCwgMHgwQTJCLCAweDJGNTUsIDB4MDU1MCwgMHgyRjU2LCAweDBCRkEsIDB4MkY1NywgMHgwREQ1LAotICAgIDB4MkY1OCwgMHgxNUU0LCAweDJGNTksIDB4MTVFNiwgMHgyRjVBLCAweDBFMjIsIDB4MkY1QiwgMHgwNTY3LAotICAgIDB4MkY1QywgMHgwNjg3LCAweDJGNUQsIDB4MDc1OCwgMHgyRjVFLCAweDA3NzAsIDB4MkY1RiwgMHgwNkM0LAotICAgIDB4MkY2MCwgMHgwNERELCAweDJGNjEsIDB4MDVFMCwgMHgyRjYyLCAweDA2MDEsIDB4MkY2MywgMHgwQTVDLAotICAgIDB4MkY2NCwgMHgwRjNCLCAweDJGNjUsIDB4MEMzRSwgMHgyRjY2LCAweDBEOTcsIDB4MkY2NywgMHgzQTAwLAotICAgIDB4MkY2OCwgMHgxNjk3LCAweDJGNjksIDB4MEQyOCwgMHgyRjZBLCAweDBEN0QsIDB4MkY2QiwgMHgwODdDLAotICAgIDB4MkY2QywgMHgwRUU4LCAweDJGNkQsIDB4MEVDMywgMHgyRjZFLCAweDBFRkMsIDB4MkY2RiwgMHgwQTc0LAotICAgIDB4MkY3MCwgMHgwOEQ0LCAweDJGNzEsIDB4M0E0MSwgMHgyRjcyLCAweDA1NTMsIDB4MkY3MywgMHgwNzQwLAotICAgIDB4MkY3NCwgMHgwRjcxLCAweDJGNzUsIDB4MEI5QiwgMHgyRjc2LCAweDBFMTYsIDB4MkY3NywgMHgwOEIzLAotICAgIDB4MkY3OCwgMHgwNjA4LCAweDJGNzksIDB4MTgxMywgMHgyRjdBLCAweDBGM0QsIDB4MkY3QiwgMHgwNENCLAotICAgIDB4MkY3QywgMHgwRkRELCAweDJGN0QsIDB4MDhENSwgMHgyRjdFLCAweDE4M0QsIDB4MkY3RiwgMHgwOEQ2LAotICAgIDB4MkY4MCwgMHgxODUzLCAweDJGODEsIDB4MENEMSwgMHgyRjgyLCAweDBBMDksIDB4MkY4MywgMHgwOEQ3LAotICAgIDB4MkY4NCwgMHgwOEI4LCAweDJGODUsIDB4MDREMywgMHgyRjg2LCAweDBBODksIDB4MkY4NywgMHgwQUE2LAotICAgIDB4MkY4OCwgMHgwOTM4LCAweDJGODksIDB4MDgyMSwgMHgyRjhBLCAweDA5RUQsIDB4MkY4QiwgMHgxOEIyLAotICAgIDB4MkY4QywgMHgxOTRGLCAweDJGOEQsIDB4MEJBQywgMHgyRjhFLCAweDA3NDIsIDB4MkY4RiwgMHgwN0U2LAotICAgIDB4MkY5MCwgMHgwNEE1LCAweDJGOTEsIDB4MTlFQiwgMHgyRjkyLCAweDA3NUYsIDB4MkY5MywgMHgwNUFGLAotICAgIDB4MkY5NCwgMHgwNzc0LCAweDJGOTUsIDB4MEI2OSwgMHgyRjk2LCAweDBDN0UsIDB4MkY5NywgMHgxQTU2LAotICAgIDB4MkY5OCwgMHgxQTU5LCAweDJGOTksIDB4MDU4QiwgMHgyRjlBLCAweDBBN0EsIDB4MkY5QiwgMHgwQUY4LAotICAgIDB4MkY5QywgMHgwQjBELCAweDJGOUQsIDB4MEEwRSwgMHgyRjlFLCAweDA5MDIsIDB4MkY5RiwgMHgwQTBGLAotICAgIDB4MkZBMCwgMHgwQjYyLCAweDJGQTEsIDB4M0I0RiwgMHgyRkEyLCAweDBGMjIsIDB4MkZBMywgMHgwQ0FCLAotICAgIDB4MkZBNCwgMHgwRDY0LCAweDJGQTUsIDB4MEY2QywgMHgyRkE2LCAweDA2REEsIDB4MkZBNywgMHgwQkQ1LAotICAgIDB4MkZBOCwgMHgwRUYzLCAweDJGQTksIDB4MERERSwgMHgyRkFBLCAweDFCQzksIDB4MkZBQiwgMHgxQkNCLAotICAgIDB4MkZBQywgMHgwNENELCAweDJGQUQsIDB4MjFGNywgMHgyRkFFLCAweDBEODcsIDB4MkZBRiwgMHgwRUQ4LAotICAgIDB4MkZCMCwgMHgwNUI1LCAweDJGQjEsIDB4MUMwMywgMHgyRkIyLCAweDFDMDUsIDB4MkZCMywgMHgwNTNCLAotICAgIDB4MkZCNCwgMHgwRTE3LCAweDJGQjUsIDB4MERFOSwgMHgyRkI2LCAweDBEODgsIDB4MkZCNywgMHgwOUVGLAotICAgIDB4MkZCOCwgMHgwOTFGLCAweDJGQjksIDB4MDdGMywgMHgyRkJBLCAweDBEMDUsIDB4MkZCQiwgMHgwODBFLAotICAgIDB4MkZCQywgMHgwN0Y0LCAweDJGQkQsIDB4MUM2QywgMHgyRkJFLCAweDFDN0QsIDB4MkZCRiwgMHgxQzgzLAotICAgIDB4MkZDMCwgMHgxQzg0LCAweDJGQzEsIDB4MDY0RSwgMHgyRkMyLCAweDA2OTUsIDB4MkZDMywgMHgwQkQ3LAotICAgIDB4MkZDNCwgMHgxQ0Y2LCAweDJGQzUsIDB4MDhEQiwgMHgyRkM2LCAweDFEMDEsIDB4MkZDNywgMHgwRTkxLAotICAgIDB4MkZDOCwgMHgzNDBCLCAweDJGQzksIDB4MDY2QSwgMHgyRkNBLCAweDA4MDcsIDB4MkZDQiwgMHgxRDE2LAotICAgIDB4MkZDQywgMHgxRDE5LCAweDJGQ0QsIDB4MEMxRSwgMHgyRkNFLCAweDA3OTEsIDB4MkZDRiwgMHgwQUNGLAotICAgIDB4MkZEMCwgMHgwRDkzLCAweDJGRDEsIDB4MUQyMSwgMHgyRkQyLCAweDFEMjIsIDB4MkZEMywgMHgwRjdFLAotICAgIDB4MkZENCwgMHgxRDMwLCAweDJGRDUsIDB4MUQzMSwgMHgzMDAwLCAweDAyNzksIDB4MzAwMSwgMHgwMjdBLAotICAgIDB4MzAwMiwgMHgwMjdCLCAweDMwMDMsIDB4MDI4RiwgMHgzMDA0LCAweDIwNzQsIDB4MzAwNSwgMHgwMjkxLAotICAgIDB4MzAwNiwgMHgwMjkyLCAweDMwMDcsIDB4MDI5MywgMHgzMDA4LCAweDAyQUEsIDB4MzAwOSwgMHgwMkFCLAotICAgIDB4MzAwQSwgMHgwMkFDLCAweDMwMEIsIDB4MDJBRCwgMHgzMDBDLCAweDAyQUUsIDB4MzAwRCwgMHgwMkFGLAotICAgIDB4MzAwRSwgMHgwMkIwLCAweDMwMEYsIDB4MDJCMSwgMHgzMDEwLCAweDAyQjIsIDB4MzAxMSwgMHgwMkIzLAotICAgIDB4MzAxMiwgMHgwMkRGLCAweDMwMTMsIDB4MDJFNCwgMHgzMDE0LCAweDAyQTQsIDB4MzAxNSwgMHgwMkE1LAotICAgIDB4MzAxNiwgMHgzRjQ1LCAweDMwMTcsIDB4M0Y0NiwgMHgzMDE4LCAweDJGNjEsIDB4MzAxOSwgMHgyRjYyLAotICAgIDB4MzAxQywgMHgwMjk5LCAweDMwMUQsIDB4MURCOCwgMHgzMDFGLCAweDFEQjksIDB4MzAyMCwgMHgxRjdBLAotICAgIDB4MzAzMCwgMHgyRkJBLCAweDMwMzMsIDB4MkY0QywgMHgzMDM0LCAweDJGNEQsIDB4MzAzNSwgMHgyRjRFLAotICAgIDB4MzAzNiwgMHgxRjc5LCAweDMwM0IsIDB4MkY0QSwgMHgzMDNDLCAweDNGNDIsIDB4MzAzRCwgMHgyRjkzLAotICAgIDB4MzA0MSwgMHgwMzRBLCAweDMwNDIsIDB4MDM0QiwgMHgzMDQzLCAweDAzNEMsIDB4MzA0NCwgMHgwMzRELAotICAgIDB4MzA0NSwgMHgwMzRFLCAweDMwNDYsIDB4MDM0RiwgMHgzMDQ3LCAweDAzNTAsIDB4MzA0OCwgMHgwMzUxLAotICAgIDB4MzA0OSwgMHgwMzUyLCAweDMwNEEsIDB4MDM1MywgMHgzMDRCLCAweDAzNTQsIDB4MzA0QywgMHgwMzU1LAotICAgIDB4MzA0RCwgMHgwMzU2LCAweDMwNEUsIDB4MDM1NywgMHgzMDRGLCAweDAzNTgsIDB4MzA1MCwgMHgwMzU5LAotICAgIDB4MzA1MSwgMHgwMzVBLCAweDMwNTIsIDB4MDM1QiwgMHgzMDUzLCAweDAzNUMsIDB4MzA1NCwgMHgwMzVELAotICAgIDB4MzA1NSwgMHgwMzVFLCAweDMwNTYsIDB4MDM1RiwgMHgzMDU3LCAweDAzNjAsIDB4MzA1OCwgMHgwMzYxLAotICAgIDB4MzA1OSwgMHgwMzYyLCAweDMwNUEsIDB4MDM2MywgMHgzMDVCLCAweDAzNjQsIDB4MzA1QywgMHgwMzY1LAotICAgIDB4MzA1RCwgMHgwMzY2LCAweDMwNUUsIDB4MDM2NywgMHgzMDVGLCAweDAzNjgsIDB4MzA2MCwgMHgwMzY5LAotICAgIDB4MzA2MSwgMHgwMzZBLCAweDMwNjIsIDB4MDM2QiwgMHgzMDYzLCAweDAzNkMsIDB4MzA2NCwgMHgwMzZELAotICAgIDB4MzA2NSwgMHgwMzZFLCAweDMwNjYsIDB4MDM2RiwgMHgzMDY3LCAweDAzNzAsIDB4MzA2OCwgMHgwMzcxLAotICAgIDB4MzA2OSwgMHgwMzcyLCAweDMwNkEsIDB4MDM3MywgMHgzMDZCLCAweDAzNzQsIDB4MzA2QywgMHgwMzc1LAotICAgIDB4MzA2RCwgMHgwMzc2LCAweDMwNkUsIDB4MDM3NywgMHgzMDZGLCAweDAzNzgsIDB4MzA3MCwgMHgwMzc5LAotICAgIDB4MzA3MSwgMHgwMzdBLCAweDMwNzIsIDB4MDM3QiwgMHgzMDczLCAweDAzN0MsIDB4MzA3NCwgMHgwMzdELAotICAgIDB4MzA3NSwgMHgwMzdFLCAweDMwNzYsIDB4MDM3RiwgMHgzMDc3LCAweDAzODAsIDB4MzA3OCwgMHgwMzgxLAotICAgIDB4MzA3OSwgMHgwMzgyLCAweDMwN0EsIDB4MDM4MywgMHgzMDdCLCAweDAzODQsIDB4MzA3QywgMHgwMzg1LAotICAgIDB4MzA3RCwgMHgwMzg2LCAweDMwN0UsIDB4MDM4NywgMHgzMDdGLCAweDAzODgsIDB4MzA4MCwgMHgwMzg5LAotICAgIDB4MzA4MSwgMHgwMzhBLCAweDMwODIsIDB4MDM4QiwgMHgzMDgzLCAweDAzOEMsIDB4MzA4NCwgMHgwMzhELAotICAgIDB4MzA4NSwgMHgwMzhFLCAweDMwODYsIDB4MDM4RiwgMHgzMDg3LCAweDAzOTAsIDB4MzA4OCwgMHgwMzkxLAotICAgIDB4MzA4OSwgMHgwMzkyLCAweDMwOEEsIDB4MDM5MywgMHgzMDhCLCAweDAzOTQsIDB4MzA4QywgMHgwMzk1LAotICAgIDB4MzA4RCwgMHgwMzk2LCAweDMwOEUsIDB4MDM5NywgMHgzMDhGLCAweDAzOTgsIDB4MzA5MCwgMHgwMzk5LAotICAgIDB4MzA5MSwgMHgwMzlBLCAweDMwOTIsIDB4MDM5QiwgMHgzMDkzLCAweDAzOUMsIDB4MzA5NCwgMHgxRjE2LAotICAgIDB4MzA5NSwgMHgxRjE3LCAweDMwOTYsIDB4MUYxOCwgMHgzMDk5LCAweDNGQzYsIDB4MzA5QSwgMHgzRkM3LAotICAgIDB4MzA5QiwgMHgwMjgzLCAweDMwOUMsIDB4MDI4NCwgMHgzMDlELCAweDAyOEQsIDB4MzA5RSwgMHgwMjhFLAotICAgIDB4MzA5RiwgMHgyRjk1LCAweDMwQTAsIDB4M0Y0RCwgMHgzMEExLCAweDAzOUQsIDB4MzBBMiwgMHgwMzlFLAotICAgIDB4MzBBMywgMHgwMzlGLCAweDMwQTQsIDB4MDNBMCwgMHgzMEE1LCAweDAzQTEsIDB4MzBBNiwgMHgwM0EyLAotICAgIDB4MzBBNywgMHgwM0EzLCAweDMwQTgsIDB4MDNBNCwgMHgzMEE5LCAweDAzQTUsIDB4MzBBQSwgMHgwM0E2LAotICAgIDB4MzBBQiwgMHgwM0E3LCAweDMwQUMsIDB4MDNBOCwgMHgzMEFELCAweDAzQTksIDB4MzBBRSwgMHgwM0FBLAotICAgIDB4MzBBRiwgMHgwM0FCLCAweDMwQjAsIDB4MDNBQywgMHgzMEIxLCAweDAzQUQsIDB4MzBCMiwgMHgwM0FFLAotICAgIDB4MzBCMywgMHgwM0FGLCAweDMwQjQsIDB4MDNCMCwgMHgzMEI1LCAweDAzQjEsIDB4MzBCNiwgMHgwM0IyLAotICAgIDB4MzBCNywgMHgwM0IzLCAweDMwQjgsIDB4MDNCNCwgMHgzMEI5LCAweDAzQjUsIDB4MzBCQSwgMHgwM0I2LAotICAgIDB4MzBCQiwgMHgwM0I3LCAweDMwQkMsIDB4MDNCOCwgMHgzMEJELCAweDAzQjksIDB4MzBCRSwgMHgwM0JBLAotICAgIDB4MzBCRiwgMHgwM0JCLCAweDMwQzAsIDB4MDNCQywgMHgzMEMxLCAweDAzQkQsIDB4MzBDMiwgMHgwM0JFLAotICAgIDB4MzBDMywgMHgwM0JGLCAweDMwQzQsIDB4MDNDMCwgMHgzMEM1LCAweDAzQzEsIDB4MzBDNiwgMHgwM0MyLAotICAgIDB4MzBDNywgMHgwM0MzLCAweDMwQzgsIDB4MDNDNCwgMHgzMEM5LCAweDAzQzUsIDB4MzBDQSwgMHgwM0M2LAotICAgIDB4MzBDQiwgMHgwM0M3LCAweDMwQ0MsIDB4MDNDOCwgMHgzMENELCAweDAzQzksIDB4MzBDRSwgMHgwM0NBLAotICAgIDB4MzBDRiwgMHgwM0NCLCAweDMwRDAsIDB4MDNDQywgMHgzMEQxLCAweDAzQ0QsIDB4MzBEMiwgMHgwM0NFLAotICAgIDB4MzBEMywgMHgwM0NGLCAweDMwRDQsIDB4MDNEMCwgMHgzMEQ1LCAweDAzRDEsIDB4MzBENiwgMHgwM0QyLAotICAgIDB4MzBENywgMHgwM0QzLCAweDMwRDgsIDB4MDNENCwgMHgzMEQ5LCAweDAzRDUsIDB4MzBEQSwgMHgwM0Q2LAotICAgIDB4MzBEQiwgMHgwM0Q3LCAweDMwREMsIDB4MDNEOCwgMHgzMERELCAweDAzRDksIDB4MzBERSwgMHgwM0RBLAotICAgIDB4MzBERiwgMHgwM0RCLCAweDMwRTAsIDB4MDNEQywgMHgzMEUxLCAweDAzREQsIDB4MzBFMiwgMHgwM0RFLAotICAgIDB4MzBFMywgMHgwM0RGLCAweDMwRTQsIDB4MDNFMCwgMHgzMEU1LCAweDAzRTEsIDB4MzBFNiwgMHgwM0UyLAotICAgIDB4MzBFNywgMHgwM0UzLCAweDMwRTgsIDB4MDNFNCwgMHgzMEU5LCAweDAzRTUsIDB4MzBFQSwgMHgwM0U2LAotICAgIDB4MzBFQiwgMHgwM0U3LCAweDMwRUMsIDB4MDNFOCwgMHgzMEVELCAweDAzRTksIDB4MzBFRSwgMHgwM0VBLAotICAgIDB4MzBFRiwgMHgwM0VCLCAweDMwRjAsIDB4MDNFQywgMHgzMEYxLCAweDAzRUQsIDB4MzBGMiwgMHgwM0VFLAotICAgIDB4MzBGMywgMHgwM0VGLCAweDMwRjQsIDB4MDNGMCwgMHgzMEY1LCAweDAzRjEsIDB4MzBGNiwgMHgwM0YyLAotICAgIDB4MzBGNywgMHgyMDc5LCAweDMwRjgsIDB4MjA3QSwgMHgzMEY5LCAweDIwN0IsIDB4MzBGQSwgMHgyMDdDLAotICAgIDB4MzBGQiwgMHgwMjdFLCAweDMwRkMsIDB4MDI5NCwgMHgzMEZELCAweDAyOEIsIDB4MzBGRSwgMHgwMjhDLAotICAgIDB4MzBGRiwgMHgzRjQzLCAweDMxOTAsIDB4M0Y5QiwgMHgzMTkxLCAweDNGOUMsIDB4MzE5MiwgMHgzRjlELAotICAgIDB4MzE5MywgMHgzRjlFLCAweDMxOTQsIDB4M0Y5RiwgMHgzMTk1LCAweDNGQTAsIDB4MzE5NiwgMHgzRkExLAotICAgIDB4MzE5NywgMHgzRkEyLCAweDMxOTgsIDB4M0ZBMywgMHgzMTk5LCAweDNGQTQsIDB4MzE5QSwgMHgzRkE1LAotICAgIDB4MzE5QiwgMHgzRkE2LCAweDMxOUMsIDB4M0ZBNywgMHgzMTlELCAweDNGQTgsIDB4MzE5RSwgMHgzRkE5LAotICAgIDB4MzE5RiwgMHgzRkFBLCAweDMxRjAsIDB4M0Y2QywgMHgzMUYxLCAweDNGNkQsIDB4MzFGMiwgMHgzRjZFLAotICAgIDB4MzFGMywgMHgzRjZGLCAweDMxRjQsIDB4M0Y3MCwgMHgzMUY1LCAweDNGNzEsIDB4MzFGNiwgMHgzRjcyLAotICAgIDB4MzFGNywgMHgzRjczLCAweDMxRjgsIDB4M0Y3NCwgMHgzMUY5LCAweDNGNzUsIDB4MzFGQSwgMHgzRjc3LAotICAgIDB4MzFGQiwgMHgzRjc4LCAweDMxRkMsIDB4M0Y3OSwgMHgzMUZELCAweDNGN0EsIDB4MzFGRSwgMHgzRjdCLAotICAgIDB4MzFGRiwgMHgzRjdDLCAweDMyMjAsIDB4Mjc4RSwgMHgzMjIxLCAweDI3OEYsIDB4MzIyMiwgMHgyNzkwLAotICAgIDB4MzIyMywgMHgyNzkxLCAweDMyMjQsIDB4Mjc5MiwgMHgzMjI1LCAweDI3OTMsIDB4MzIyNiwgMHgyNzk0LAotICAgIDB4MzIyNywgMHgyNzk1LCAweDMyMjgsIDB4Mjc5NiwgMHgzMjI5LCAweDI3OTcsIDB4MzIyQSwgMHgyMDA2LAotICAgIDB4MzIyQiwgMHgyMDA3LCAweDMyMkMsIDB4MjAwOCwgMHgzMjJELCAweDIwMDksIDB4MzIyRSwgMHgyMDBBLAotICAgIDB4MzIyRiwgMHgyMDBCLCAweDMyMzAsIDB4MjAwNSwgMHgzMjMxLCAweDFEQzIsIDB4MzIzMiwgMHgxREMzLAotICAgIDB4MzIzMywgMHgxRkNGLCAweDMyMzQsIDB4MUZDRCwgMHgzMjM1LCAweDFGRDQsIDB4MzIzNiwgMHgxRkQzLAotICAgIDB4MzIzNywgMHgyMDBDLCAweDMyMzgsIDB4MUZDRSwgMHgzMjM5LCAweDFEQzQsIDB4MzIzQSwgMHgxRkQ3LAotICAgIDB4MzIzQiwgMHgxRkQ1LCAweDMyM0MsIDB4MUZEMCwgMHgzMjNELCAweDFGQ0IsIDB4MzIzRSwgMHgxRkQyLAotICAgIDB4MzIzRiwgMHgxRkNDLCAweDMyNDAsIDB4MUZENiwgMHgzMjQxLCAweDIwMEQsIDB4MzI0MiwgMHgxRkQxLAotICAgIDB4MzI0MywgMHgxRkNBLCAweDMyNTEsIDB4MUY5QiwgMHgzMjUyLCAweDFGQTYsIDB4MzI1MywgMHgxRkE3LAotICAgIDB4MzI1NCwgMHgxRkE4LCAweDMyNTUsIDB4MUZBOSwgMHgzMjU2LCAweDFGQUEsIDB4MzI1NywgMHgxRkFCLAotICAgIDB4MzI1OCwgMHgxRkFDLCAweDMyNTksIDB4MUZBRCwgMHgzMjVBLCAweDFGQUUsIDB4MzI1QiwgMHgxRkFGLAotICAgIDB4MzI1QywgMHgyODA0LCAweDMyNUQsIDB4MjgwNSwgMHgzMjVFLCAweDI4MDYsIDB4MzI1RiwgMHgyODA3LAotICAgIDB4MzI4MCwgMHgyOERELCAweDMyODEsIDB4MjhERSwgMHgzMjgyLCAweDI4REYsIDB4MzI4MywgMHgyOEUwLAotICAgIDB4MzI4NCwgMHgyOEUxLCAweDMyODUsIDB4MjhFMiwgMHgzMjg2LCAweDI4RTMsIDB4MzI4NywgMHgyOEU0LAotICAgIDB4MzI4OCwgMHgyOEU1LCAweDMyODksIDB4MjhFNiwgMHgzMjhBLCAweDI4RTgsIDB4MzI4QiwgMHgyOEU5LAotICAgIDB4MzI4QywgMHgyOEVBLCAweDMyOEQsIDB4MjhFQiwgMHgzMjhFLCAweDI4RUMsIDB4MzI4RiwgMHgyOEVELAotICAgIDB4MzI5MCwgMHgyOEU3LCAweDMyOTEsIDB4MUZFMSwgMHgzMjkyLCAweDFGRTAsIDB4MzI5MywgMHgxRkUyLAotICAgIDB4MzI5NCwgMHgxRkRDLCAweDMyOTUsIDB4MjhGRiwgMHgzMjk2LCAweDFGRTUsIDB4MzI5NywgMHgyOEZDLAotICAgIDB4MzI5OCwgMHgxRkRFLCAweDMyOTksIDB4MjAxRiwgMHgzMjlBLCAweDI4RjksIDB4MzI5QiwgMHgyOEY4LAotICAgIDB4MzI5QywgMHgyOEZFLCAweDMyOUQsIDB4MjA3RiwgMHgzMjlFLCAweDFGRkYsIDB4MzI5RiwgMHgyOEVGLAotICAgIDB4MzJBMCwgMHgyOEY2LCAweDMyQTEsIDB4MjhGNywgMHgzMkEyLCAweDI4RkIsIDB4MzJBMywgMHgyOEZBLAotICAgIDB4MzJBNCwgMHgxREJELCAweDMyQTUsIDB4MURCRSwgMHgzMkE2LCAweDFEQkYsIDB4MzJBNywgMHgxREMwLAotICAgIDB4MzJBOCwgMHgxREMxLCAweDMyQTksIDB4MUZEQSwgMHgzMkFBLCAweDFGREQsIDB4MzJBQiwgMHgxRkRGLAotICAgIDB4MzJBQywgMHgxRkUzLCAweDMyQUQsIDB4MUZEOSwgMHgzMkFFLCAweDFGRTQsIDB4MzJBRiwgMHgxRkRCLAotICAgIDB4MzJCMCwgMHgxRkQ4LCAweDMyQjEsIDB4MjgwOCwgMHgzMkIyLCAweDI4MDksIDB4MzJCMywgMHgyODBBLAotICAgIDB4MzJCNCwgMHgyODBCLCAweDMyQjUsIDB4MjgwQywgMHgzMkI2LCAweDI4MEQsIDB4MzJCNywgMHgyODBFLAotICAgIDB4MzJCOCwgMHgyODBGLCAweDMyQjksIDB4MjgxMCwgMHgzMkJBLCAweDI4MTEsIDB4MzJCQiwgMHgyODEyLAotICAgIDB4MzJCQywgMHgyODEzLCAweDMyQkQsIDB4MjgxNCwgMHgzMkJFLCAweDI4MTUsIDB4MzJCRiwgMHgyODE2LAotICAgIDB4MzJEMCwgMHgyOEFELCAweDMyRDEsIDB4MjhBRSwgMHgzMkQyLCAweDI4QUYsIDB4MzJEMywgMHgyOEIwLAotICAgIDB4MzJENCwgMHgyOEIxLCAweDMyRDUsIDB4MjhCMiwgMHgzMkQ2LCAweDI4QjMsIDB4MzJENywgMHgyOEI0LAotICAgIDB4MzJEOCwgMHgyOEI1LCAweDMyRDksIDB4MjhCNiwgMHgzMkRBLCAweDI4QjcsIDB4MzJEQiwgMHgyOEI4LAotICAgIDB4MzJEQywgMHgyOEI5LCAweDMyREQsIDB4MjhCQSwgMHgzMkRFLCAweDI4QkIsIDB4MzJERiwgMHgyOEJDLAotICAgIDB4MzJFMCwgMHgyOEJELCAweDMyRTEsIDB4MjhCRSwgMHgzMkUyLCAweDI4QkYsIDB4MzJFMywgMHgyOEMwLAotICAgIDB4MzJFNCwgMHgyOEMxLCAweDMyRTUsIDB4MjhDMiwgMHgzMkU2LCAweDI4QzMsIDB4MzJFNywgMHgyOEM0LAotICAgIDB4MzJFOCwgMHgyOEM1LCAweDMyRTksIDB4MjhDNiwgMHgzMkVBLCAweDI4QzcsIDB4MzJFQiwgMHgyOEM4LAotICAgIDB4MzJFQywgMHgyOEM5LCAweDMyRUQsIDB4MjhDQSwgMHgzMkVFLCAweDI4Q0IsIDB4MzJFRiwgMHgyOENDLAotICAgIDB4MzJGMCwgMHgyOENELCAweDMyRjEsIDB4MjhDRSwgMHgzMkYyLCAweDI4Q0YsIDB4MzJGMywgMHgyOEQwLAotICAgIDB4MzJGNCwgMHgyOEQxLCAweDMyRjUsIDB4MjhEMiwgMHgzMkY2LCAweDI4RDMsIDB4MzJGNywgMHgyOEQ0LAotICAgIDB4MzJGOCwgMHgyOEQ1LCAweDMyRjksIDB4MjhENiwgMHgzMkZBLCAweDI4RDcsIDB4MzJGQiwgMHgyOEQ4LAotICAgIDB4MzJGQywgMHgyOEQ5LCAweDMyRkQsIDB4MjhEQSwgMHgzMkZFLCAweDI4REIsIDB4MzMwMCwgMHgxRjcwLAotICAgIDB4MzMwMSwgMHgyRTYyLCAweDMzMDIsIDB4MkU2MywgMHgzMzAzLCAweDFGNkEsIDB4MzMwNCwgMHgyRTY0LAotICAgIDB4MzMwNSwgMHgxRkY3LCAweDMzMDYsIDB4MkU2NSwgMHgzMzA3LCAweDJFNjksIDB4MzMwOCwgMHgyRTY3LAotICAgIDB4MzMwOSwgMHgyRTZDLCAweDMzMEEsIDB4MkU2QSwgMHgzMzBCLCAweDJFNkUsIDB4MzMwQywgMHgyRTcwLAotICAgIDB4MzMwRCwgMHgxREFCLCAweDMzMEUsIDB4MkU3MSwgMHgzMzBGLCAweDJFNzIsIDB4MzMxMCwgMHgyRTczLAotICAgIDB4MzMxMSwgMHgyRTc0LCAweDMzMTIsIDB4MkU3NSwgMHgzMzEzLCAweDJFNzYsIDB4MzMxNCwgMHgxREEyLAotICAgIDB4MzMxNSwgMHgxRjY5LCAweDMzMTYsIDB4MUY2NywgMHgzMzE3LCAweDJFNzgsIDB4MzMxOCwgMHgxRjY4LAotICAgIDB4MzMxOSwgMHgyRTdBLCAweDMzMUEsIDB4MkU3QywgMHgzMzFCLCAweDJFN0QsIDB4MzMxQywgMHgyRTdFLAotICAgIDB4MzMxRCwgMHgyRTdGLCAweDMzMUUsIDB4MUY3MywgMHgzMzFGLCAweDJFODAsIDB4MzMyMCwgMHgyRTgxLAotICAgIDB4MzMyMSwgMHgyRTgyLCAweDMzMjIsIDB4MUY2NiwgMHgzMzIzLCAweDFGNkIsIDB4MzMyNCwgMHgyRTgzLAotICAgIDB4MzMyNSwgMHgyRTg1LCAweDMzMjYsIDB4MURBQywgMHgzMzI3LCAweDFEQTYsIDB4MzMyOCwgMHgyRTg4LAotICAgIDB4MzMyOSwgMHgyRTg5LCAweDMzMkEsIDB4MUY3NCwgMHgzMzJCLCAweDFEQUUsIDB4MzMyRCwgMHgyRThCLAotICAgIDB4MzMyRSwgMHgyRThFLCAweDMzMkYsIDB4MkU4RiwgMHgzMzMwLCAweDJFOTAsIDB4MzMzMSwgMHgxRjcxLAotICAgIDB4MzMzMiwgMHgyRTkxLCAweDMzMzMsIDB4MjA4NywgMHgzMzM0LCAweDJFOTQsIDB4MzMzNSwgMHgyRTk1LAotICAgIDB4MzMzNiwgMHgxREE4LCAweDMzMzcsIDB4MkU5QSwgMHgzMzM4LCAweDJFOUMsIDB4MzMzOSwgMHgxRjZFLAotICAgIDB4MzMzQSwgMHgyRTlELCAweDMzM0IsIDB4MUY2RiwgMHgzMzNDLCAweDJFOTYsIDB4MzMzRCwgMHgyRTlFLAotICAgIDB4MzMzRSwgMHgyRUEwLCAweDMzM0YsIDB4MkVBMSwgMHgzMzQwLCAweDJFQTIsIDB4MzM0MSwgMHgyRTlGLAotICAgIDB4MzM0MiwgMHgxRjZELCAweDMzNDMsIDB4MkVBMywgMHgzMzQ0LCAweDJFQTQsIDB4MzM0NSwgMHgyRUE1LAotICAgIDB4MzM0NiwgMHgyRUE2LCAweDMzNDcsIDB4MUY3MiwgMHgzMzQ4LCAweDJFQTcsIDB4MzM0OSwgMHgxREExLAotICAgIDB4MzM0QSwgMHgxREFGLCAweDMzNEIsIDB4MkVBOCwgMHgzMzRDLCAweDJFQTksIDB4MzM0RCwgMHgxREE0LAotICAgIDB4MzM0RSwgMHgyMDg4LCAweDMzNEYsIDB4MkVBQSwgMHgzMzUwLCAweDJFQUIsIDB4MzM1MSwgMHgxREE5LAotICAgIDB4MzM1MiwgMHgyRUFFLCAweDMzNTMsIDB4MkVCMiwgMHgzMzU0LCAweDJFQUYsIDB4MzM1NSwgMHgyRUIzLAotICAgIDB4MzM1NiwgMHgyRUI0LCAweDMzNTcsIDB4MUY2QywgMHgzMzcxLCAweDJFNTUsIDB4MzM3QiwgMHgyMDgzLAotICAgIDB4MzM3QywgMHgxREM3LCAweDMzN0QsIDB4MURDNiwgMHgzMzdFLCAweDFEQzUsIDB4MzM3RiwgMHgxRjc2LAotICAgIDB4MzM4NSwgMHgxRjVGLCAweDMzODYsIDB4MUY2MCwgMHgzMzg3LCAweDFGNjEsIDB4MzM4OCwgMHgyMDAwLAotICAgIDB4MzM4OSwgMHgyMDAxLCAweDMzOEQsIDB4MkU1OCwgMHgzMzhFLCAweDFEQjQsIDB4MzM4RiwgMHgxREI1LAotICAgIDB4MzM5MCwgMHgxRjYzLCAweDMzOTYsIDB4MUY2NSwgMHgzMzk3LCAweDFGNTgsIDB4MzM5OCwgMHgxRjVBLAotICAgIDB4MzM5QiwgMHgyRTU5LCAweDMzOUMsIDB4MURCMSwgMHgzMzlELCAweDFEQjIsIDB4MzM5RSwgMHgxREIzLAotICAgIDB4MzM5RiwgMHgxRkZBLCAweDMzQTAsIDB4MUY1NCwgMHgzM0ExLCAweDFEQjcsIDB4MzNBMiwgMHgxRjU1LAotICAgIDB4MzNBMywgMHgxRkZCLCAweDMzQTQsIDB4MUY1NiwgMHgzM0E1LCAweDFGNTcsIDB4MzNBNiwgMHgxRkZDLAotICAgIDB4MzNCMCwgMHgxRjVFLCAweDMzQjEsIDB4MUY1RCwgMHgzM0IyLCAweDFGNUMsIDB4MzNCMywgMHgxRjVCLAotICAgIDB4MzNDMiwgMHgyRTUwLCAweDMzQzQsIDB4MURCNiwgMHgzM0M4LCAweDIwMDIsIDB4MzNDQiwgMHgxRjYyLAotICAgIDB4MzNDQywgMHgxRkY2LCAweDMzQ0QsIDB4MURCQiwgMHgzM0Q0LCAweDFGNjQsIDB4MzNENywgMHgyRTVELAotICAgIDB4MzNEOCwgMHgyRTVFLCAweDMzREEsIDB4MkU0QiwgMHgzNDAyLCAweDM1ODIsIDB4MzQwNSwgMHgzQzFCLAotICAgIDB4MzQwNiwgMHg0MzVBLCAweDM0MjcsIDB4MzY1NiwgMHgzNDJDLCAweDQzNUUsIDB4MzQyRSwgMHgzNzg4LAotICAgIDB4MzQ2OCwgMHgzNkRGLCAweDM0NkEsIDB4NDM3NSwgMHgzNDg4LCAweDNDNTIsIDB4MzQ5MiwgMHg0MzhFLAotICAgIDB4MzRCNSwgMHg0MTk5LCAweDM0QkMsIDB4NDM5NywgMHgzNEMxLCAweDQ3RDAsIDB4MzRDNywgMHg0MzlCLAotICAgIDB4MzREQiwgMHgzQzQxLCAweDM1MUYsIDB4MzYyOSwgMHgzNTNFLCAweDM3MUUsIDB4MzU1RCwgMHg0M0JELAotICAgIDB4MzU1RSwgMHg0M0JFLCAweDM1NjMsIDB4NDNDMCwgMHgzNTZFLCAweDQzQzQsIDB4MzVBNiwgMHg0M0Q5LAotICAgIDB4MzVBOCwgMHg0M0RCLCAweDM1QzUsIDB4NDNFMSwgMHgzNURBLCAweDQzRUEsIDB4MzVERSwgMHg0RTYzLAotICAgIDB4MzVGNCwgMHg0M0YzLCAweDM2MDUsIDB4NDNGQSwgMHgzNjE0LCAweDRBQkIsIDB4MzY0QSwgMHg0NDIxLAotICAgIDB4MzY5MSwgMHg0NDQxLCAweDM2OTYsIDB4NDQ0NSwgMHgzNjk5LCAweDQ0NDMsIDB4MzZDRiwgMHg0NDU2LAotICAgIDB4Mzc2MSwgMHg0NDc4LCAweDM3NjIsIDB4NDQ3OSwgMHgzNzZCLCAweDQ0N0QsIDB4Mzc2QywgMHg0NDdDLAotICAgIDB4Mzc3NSwgMHg0NDgwLCAweDM3OEQsIDB4MzYxQSwgMHgzN0MxLCAweDQ0OEUsIDB4MzdFMiwgMHgzNzJCLAotICAgIDB4MzdFOCwgMHg0NEEyLCAweDM3RjQsIDB4NDRBNSwgMHgzN0ZELCAweDQ0QTgsIDB4MzgwMCwgMHg0NEFBLAotICAgIDB4MzgyRiwgMHg0NEI0LCAweDM4MzYsIDB4NDRCNSwgMHgzODQwLCAweDQ0QjYsIDB4Mzg1QywgMHg0NEJBLAotICAgIDB4Mzg2MSwgMHg0NEJDLCAweDM4QTEsIDB4NEVDQiwgMHgzOEFELCAweDRBQkMsIDB4MzhGQSwgMHgzNjFDLAotICAgIDB4MzkxNywgMHg0NEQ5LCAweDM5MUEsIDB4NDREQywgMHgzOTZGLCAweDQ0RUIsIDB4MzlBNCwgMHg0RTlBLAotICAgIDB4MzlCOCwgMHg0RTlCLCAweDNBNUMsIDB4NEU5RiwgMHgzQTZFLCAweDQ1MzEsIDB4M0E3MywgMHg0NTM0LAotICAgIDB4M0E4NSwgMHg0RUFFLCAweDNBQzQsIDB4NEVBNywgMHgzQUNCLCAweDRFQTgsIDB4M0FENiwgMHg0NTQzLAotICAgIDB4M0FENywgMHg0NTVFLCAweDNBRUEsIDB4NDU0RCwgMHgzQUYzLCAweDNDNDAsIDB4M0IwRSwgMHg0NTU4LAotICAgIDB4M0IxQSwgMHg0NTVDLCAweDNCMUMsIDB4NDU1RCwgMHgzQjIyLCAweDNDNDksIDB4M0I2RCwgMHg0NThDLAotICAgIDB4M0I3NywgMHg0NTg1LCAweDNCODcsIDB4NDVBMiwgMHgzQjg4LCAweDM2OEQsIDB4M0I4RCwgMHg0NUE0LAotICAgIDB4M0JBNCwgMHg0NUFBLCAweDNCQjYsIDB4NDIwRSwgMHgzQkMzLCAweDQyMEYsIDB4M0JDRCwgMHg0NUI4LAotICAgIDB4M0JGMCwgMHg0NUM5LCAweDNCRjMsIDB4NEVCNywgMHgzQzBGLCAweDQyMTcsIDB4M0MyNiwgMHg0NURGLAotICAgIDB4M0NDMywgMHg0NUZDLCAweDNDRDIsIDB4NDYwMSwgMHgzRDExLCAweDQ2MjUsIDB4M0QxRSwgMHg0NjMwLAotICAgIDB4M0QzMSwgMHg0RUJFLCAweDNENEUsIDB4MURFNywgMHgzRDY0LCAweDQ2NEEsIDB4M0Q5QSwgMHg0NjU4LAotICAgIDB4M0RDMCwgMHg0NjZBLCAweDNEQ0MsIDB4NEFCRCwgMHgzREQ0LCAweDQ2NkYsIDB4M0UwNSwgMHg0NjdCLAotICAgIDB4M0UzRiwgMHg0MjQ4LCAweDNFNDAsIDB4NEVDQSwgMHgzRTYwLCAweDQ2OEIsIDB4M0U2NiwgMHg0NjhELAotICAgIDB4M0U2OCwgMHg0NjhFLCAweDNFODMsIDB4NDY5NSwgMHgzRThBLCAweDNDNDMsIDB4M0U5NCwgMHg0NjlCLAotICAgIDB4M0VEQSwgMHgzQzQ4LCAweDNGNTcsIDB4NDZDQiwgMHgzRjcyLCAweDQyNTgsIDB4M0Y3NSwgMHg0NkQ5LAotICAgIDB4M0Y3NywgMHg0NkRCLCAweDNGQUUsIDB4NDZFRCwgMHgzRkIxLCAweDM3NTQsIDB4M0ZDOSwgMHg0NkY4LAotICAgIDB4M0ZENywgMHg0NkZELCAweDNGREMsIDB4NEFCRSwgMHg0MDM5LCAweDQ3MEYsIDB4NDA1OCwgMHg0NzE2LAotICAgIDB4NDA5MywgMHgzQzRDLCAweDQxMDMsIDB4M0M0RiwgMHg0MTA1LCAweDQ3M0IsIDB4NDE0OCwgMHg0NzQ3LAotICAgIDB4NDE0RiwgMHg0NzRBLCAweDQxNjMsIDB4NDc0RSwgMHg0MUI0LCAweDQ3NUQsIDB4NDFCRiwgMHg0NzYwLAotICAgIDB4NDFFNiwgMHg0NzZCLCAweDQxRUUsIDB4NDc2RiwgMHg0MUYzLCAweDQ3NkMsIDB4NDIwNywgMHg0Nzc2LAotICAgIDB4NDIwRSwgMHg0Nzc5LCAweDQyNjQsIDB4Mzc2MCwgMHg0MjkzLCAweDNDNTAsIDB4NDJDNiwgMHg0NzlGLAotICAgIDB4NDJENiwgMHg0N0FBLCAweDQyREQsIDB4NDdBRSwgMHg0MzAyLCAweDQ3QkMsIDB4NDMyQiwgMHg0N0M5LAotICAgIDB4NDM0MywgMHg0N0NCLCAweDQzRUUsIDB4NDdGNywgMHg0M0YwLCAweDQ3RkEsIDB4NDQwOCwgMHg0ODAwLAotICAgIDB4NDQwQywgMHgzQzQyLCAweDQ0MTcsIDB4NDgwMiwgMHg0NDFDLCAweDQ4MDMsIDB4NDQyMiwgMHg0ODA1LAotICAgIDB4NDQ1MywgMHgzNzczLCAweDQ0NUIsIDB4NDJBNCwgMHg0NDc2LCAweDQ4MUMsIDB4NDQ3QSwgMHg0ODFELAotICAgIDB4NDQ5MSwgMHg0ODIzLCAweDQ0QjMsIDB4NDgzRSwgMHg0NEJFLCAweDQ4M0MsIDB4NDRENCwgMHg0ODNELAotICAgIDB4NDUwOCwgMHg0ODVDLCAweDQ1MEQsIDB4NDg1OCwgMHg0NTI1LCAweDM3N0UsIDB4NDU0MywgMHg0ODZDLAotICAgIDB4NDU3QSwgMHgzQzRCLCAweDQ1OUQsIDB4NDJENCwgMHg0NUI4LCAweDQ4QTAsIDB4NDVCRSwgMHg0QUJGLAotICAgIDB4NDVFNSwgMHg0OEJBLCAweDQ1RUEsIDB4NDJEOSwgMHg0NjBGLCAweDQ4Q0EsIDB4NDYxMCwgMHg0QUMwLAotICAgIDB4NDY0MSwgMHg0OEQ4LCAweDQ2NjUsIDB4M0M0RSwgMHg0NkExLCAweDQ4RTksIDB4NDZBRSwgMHgzQzUxLAotICAgIDB4NDZBRiwgMHg0OEVELCAweDQ3MEMsIDB4NDkwMiwgMHg0NzFGLCAweDRFRkIsIDB4NDc2NCwgMHg0OTE4LAotICAgIDB4NDdFNiwgMHgzNzkwLCAweDQ3RkQsIDB4NDkyNCwgMHg0ODE2LCAweDQ5MkUsIDB4NDgxRSwgMHg0RjAxLAotICAgIDB4NDg0NCwgMHg0MkY1LCAweDQ4NEUsIDB4NDkzQSwgMHg0OEI1LCAweDQ5NUIsIDB4NDlCMCwgMHg0MzFGLAotICAgIDB4NDlFNywgMHg0OUQyLCAweDQ5RkEsIDB4NDlENiwgMHg0QTA0LCAweDQ5REIsIDB4NEEyOSwgMHg0OURFLAotICAgIDB4NEFCQywgMHg0OUY2LCAweDRCMzgsIDB4MzVERiwgMHg0QjNCLCAweDRBMEUsIDB4NEI3RSwgMHg0QUMxLAotICAgIDB4NEJDMiwgMHg0QTMzLCAweDRCQ0EsIDB4NEEzNSwgMHg0QkQyLCAweDRBMzcsIDB4NEJFOCwgMHgzQzQ2LAotICAgIDB4NEMxNywgMHg0MzM0LCAweDRDMjAsIDB4NEE0OCwgMHg0QzM4LCAweDRBQzIsIDB4NENDNCwgMHg0QTg0LAotICAgIDB4NENEMSwgMHg0QTg3LCAweDRDRTEsIDB4NEFDMywgMHg0RDA3LCAweDRBOUIsIDB4NEQ3NywgMHg0QUFCLAotICAgIDB4NEUwMCwgMHgwNEIwLCAweDRFMDEsIDB4MEJCOCwgMHg0RTAyLCAweDQzNTIsIDB4NEUwMywgMHgwOEUzLAotICAgIDB4NEUwNCwgMHgzN0Q4LCAweDRFMDUsIDB4MzdEOSwgMHg0RTA3LCAweDBFQUEsIDB4NEUwOCwgMHgwOUNFLAotICAgIDB4NEUwOSwgMHgwODdFLCAweDRFMEEsIDB4MDlDRCwgMHg0RTBCLCAweDA1M0MsIDB4NEUwQywgMHg0QUM0LAotICAgIDB4NEUwRCwgMHgwREM2LCAweDRFMEUsIDB4MEYyOSwgMHg0RTBGLCAweDQzNTMsIDB4NEUxMCwgMHgwRkZCLAotICAgIDB4NEUxMSwgMHgwNEQxLCAweDRFMTIsIDB4NDM1NCwgMHg0RTE0LCAweDA1Q0MsIDB4NEUxNSwgMHgwRkZDLAotICAgIDB4NEUxNiwgMHgwQTQ4LCAweDRFMTcsIDB4MTBENywgMHg0RTE4LCAweDA2NzAsIDB4NEUxOSwgMHgwRTBBLAotICAgIDB4NEUxRSwgMHgwOUNGLCAweDRFMUYsIDB4MzdEQSwgMHg0RTIxLCAweDBGODYsIDB4NEUyMywgMHg0QUM1LAotICAgIDB4NEUyNCwgMHg0QUM2LCAweDRFMjYsIDB4MEUxMiwgMHg0RTI4LCAweDIwQjMsIDB4NEUyOSwgMHg0MzU1LAotICAgIDB4NEUyQSwgMHgwRkZELCAweDRFMkIsIDB4MzdEQiwgMHg0RTJDLCAweDM3NEQsIDB4NEUyRCwgMHgwQkE0LAotICAgIDB4NEUyRSwgMHg0MzU2LCAweDRFMkYsIDB4MzdEQywgMHg0RTMwLCAweDM3REQsIDB4NEUzMSwgMHgwRkZFLAotICAgIDB4NEUzMiwgMHgwNkYyLCAweDRFMzYsIDB4MEZGRiwgMHg0RTM3LCAweDM2OUQsIDB4NEUzOCwgMHgwNjE5LAotICAgIDB4NEUzOSwgMHgwQjZFLCAweDRFM0IsIDB4MDkxMywgMHg0RTNDLCAweDEwMDAsIDB4NEUzRiwgMHgxMDAxLAotICAgIDB4NEU0MCwgMHgzN0RFLCAweDRFNDEsIDB4MzdERiwgMHg0RTQyLCAweDEwMDIsIDB4NEU0MywgMHgwQ0VCLAotICAgIDB4NEU0NCwgMHgzN0UwLCAweDRFNDUsIDB4MDY3MSwgMHg0RTQ3LCAweDQzNTcsIDB4NEU0OCwgMHgzNzJFLAotICAgIDB4NEU0QiwgMHgwQ0VELCAweDRFNEQsIDB4MENCQiwgMHg0RTRFLCAweDA3NzcsIDB4NEU0RiwgMHgwRTYxLAotICAgIDB4NEU1MSwgMHg0MzU5LCAweDRFNTUsIDB4MTk1MCwgMHg0RTU2LCAweDEwMDMsIDB4NEU1NywgMHgwOUQwLAotICAgIDB4NEU1OCwgMHgxMDA0LCAweDRFNTksIDB4MDUzNSwgMHg0RTVBLCAweDM3RTEsIDB4NEU1RCwgMHgwNkRELAotICAgIDB4NEU1RSwgMHgwN0E0LCAweDRFNUYsIDB4MEVGNSwgMHg0RTYyLCAweDEyMzMsIDB4NEU2OSwgMHg0MzVDLAotICAgIDB4NEU3MSwgMHgwRjVBLCAweDRFNzMsIDB4MENENSwgMHg0RTc5LCAweDRBQzcsIDB4NEU3RSwgMHgwNUUxLAotICAgIDB4NEU3RiwgMHgzN0UyLCAweDRFODAsIDB4MDY0RiwgMHg0RTgyLCAweDEwMDUsIDB4NEU4NSwgMHgxMDA2LAotICAgIDB4NEU4NiwgMHgwRjgzLCAweDRFODgsIDB4MEYyNywgMHg0RTg5LCAweDBBRUEsIDB4NEU4QSwgMHgxMDA4LAotICAgIDB4NEU4QiwgMHgwOEM0LCAweDRFOEMsIDB4MENDQiwgMHg0RThELCAweDM3RTMsIDB4NEU4RSwgMHgxMDBCLAotICAgIDB4NEU5MSwgMHgwNEUwLCAweDRFOTIsIDB4MDc5MywgMHg0RTk0LCAweDA3OTIsIDB4NEU5NSwgMHgwNEFBLAotICAgIDB4NEU5NiwgMHgzN0U0LCAweDRFOTgsIDB4MEZGMSwgMHg0RTk5LCAweDBGRjAsIDB4NEU5QiwgMHgwODIzLAotICAgIDB4NEU5QywgMHgwNDY1LCAweDRFOUQsIDB4NDM1RCwgMHg0RTlFLCAweDEwMEMsIDB4NEU5RiwgMHgxMDBELAotICAgIDB4NEVBMCwgMHgxMDBFLCAweDRFQTEsIDB4MEU2MiwgMHg0RUEyLCAweDEwMEYsIDB4NEVBNCwgMHgwN0E2LAotICAgIDB4NEVBNSwgMHgwNEFCLCAweDRFQTYsIDB4MEVBMCwgMHg0RUE4LCAweDA2OTYsIDB4NEVBQiwgMHgwNjk3LAotICAgIDB4NEVBQywgMHgwNjk4LCAweDRFQUQsIDB4MEJGRSwgMHg0RUFFLCAweDBGODQsIDB4NEVCMCwgMHgxMDEwLAotICAgIDB4NEVCMywgMHgxMDExLCAweDRFQjYsIDB4MTAxMiwgMHg0RUI5LCAweDM3RTUsIDB4NEVCQSwgMHgwQTEzLAotICAgIDB4NEVCQiwgMHgzNjIwLCAweDRFQkMsIDB4NDM1RiwgMHg0RUMwLCAweDA5NDQsIDB4NEVDMSwgMHgwQTE0LAotICAgIDB4NEVDMiwgMHgxMDE3LCAweDRFQzMsIDB4NDM2MCwgMHg0RUM0LCAweDEwMTUsIDB4NEVDNiwgMHgxMDE2LAotICAgIDB4NEVDNywgMHgwNjcyLCAweDRFQzgsIDB4NDM2MSwgMHg0RUNBLCAweDA4MTMsIDB4NEVDQiwgMHgwNTcwLAotICAgIDB4NEVDRCwgMHgxMDE0LCAweDRFQ0UsIDB4MTAxMywgMHg0RUNGLCAweDBERjksIDB4NEVEMCwgMHgzN0U2LAotICAgIDB4NEVENCwgMHgwODk0LCAweDRFRDUsIDB4MDg5MywgMHg0RUQ2LCAweDBCMUUsIDB4NEVENywgMHgxMDE4LAotICAgIDB4NEVEOCwgMHgwREM3LCAweDRFRDksIDB4MEE4QiwgMHg0RURBLCAweDQzNjMsIDB4NEVERCwgMHgwMjkwLAotICAgIDB4NEVERSwgMHgxMDE5LCAweDRFREYsIDB4MTAxQiwgMHg0RUUwLCAweDM3RTcsIDB4NEVFMSwgMHgyMEI0LAotICAgIDB4NEVFMywgMHgwQjQ1LCAweDRFRTQsIDB4MEZBOSwgMHg0RUU1LCAweDA0OEUsIDB4NEVFQiwgMHg0MzYyLAotICAgIDB4NEVFRCwgMHgxMDFBLCAweDRFRUUsIDB4MDUzRSwgMHg0RUYwLCAweDA2QkMsIDB4NEVGMSwgMHg0MzY0LAotICAgIDB4NEVGMiwgMHgwQkE1LCAweDRFRjMsIDB4NEFDOCwgMHg0RUY1LCAweDQzNjUsIDB4NEVGNiwgMHgwNzQ1LAotICAgIDB4NEVGNywgMHgxMDFDLCAweDRFRkIsIDB4MENEQSwgMHg0RUZDLCAweDIwQjUsIDB4NEVGRCwgMHgzN0U4LAotICAgIDB4NEVGRiwgMHgzN0U5LCAweDRGMDAsIDB4MjBCNiwgMHg0RjAxLCAweDA2MjcsIDB4NEYwMywgMHgyMEI3LAotICAgIDB4NEYwOSwgMHgxMDFELCAweDRGMEEsIDB4MDQ4RiwgMHg0RjBCLCAweDM3RUEsIDB4NEYwQywgMHg0QUM5LAotICAgIDB4NEYwRCwgMHgwNzk0LCAweDRGMEUsIDB4MDYyOCwgMHg0RjBGLCAweDBERUMsIDB4NEYxMCwgMHgwRDQ2LAotICAgIDB4NEYxMSwgMHgwNjczLCAweDRGMTUsIDB4MzdFQiwgMHg0RjE2LCAweDQzNjYsIDB4NEYxOSwgMHg0QUNBLAotICAgIDB4NEYxQSwgMHgwNTcxLCAweDRGMUMsIDB4MTA0MCwgMHg0RjFELCAweDBDM0IsIDB4NEYyQiwgMHg0QUNCLAotICAgIDB4NEYyRSwgMHg0QUNDLCAweDRGMkYsIDB4MEQyMiwgMHg0RjMwLCAweDEwMUYsIDB4NEYzMSwgMHg0QUNELAotICAgIDB4NEYzNCwgMHgwRDUwLCAweDRGMzYsIDB4MEZBQSwgMHg0RjM3LCAweDQzNjgsIDB4NEYzOCwgMHgwOUYzLAotICAgIDB4NEYzOSwgMHgyMEI4LCAweDRGM0EsIDB4MDg5NSwgMHg0RjNCLCAweDM3RUQsIDB4NEYzQywgMHgwOEM1LAotICAgIDB4NEYzRCwgMHgwNTQwLCAweDRGM0UsIDB4NDM2OSwgMHg0RjQzLCAweDBCRUQsIDB4NEY0NiwgMHgwQjYwLAotICAgIDB4NEY0NywgMHgxMDIzLCAweDRGNDgsIDB4NDE4QiwgMHg0RjQ5LCAweDM3RUUsIDB4NEY0RCwgMHgwNDkwLAotICAgIDB4NEY0RSwgMHgwQkZGLCAweDRGNEYsIDB4MDk0NSwgMHg0RjUwLCAweDA4MjQsIDB4NEY1MSwgMHgwRjBFLAotICAgIDB4NEY1MywgMHgwQjJFLCAweDRGNTQsIDB4MzdFRiwgMHg0RjU1LCAweDA1M0YsIDB4NEY1NiwgMHgyMEI5LAotICAgIDB4NEY1NywgMHgxMDIyLCAweDRGNTgsIDB4NDM2QSwgMHg0RjU5LCAweDBGMjgsIDB4NEY1QSwgMHgxMDFFLAotICAgIDB4NEY1QiwgMHgxMDIwLCAweDRGNUMsIDB4MDg1RSwgMHg0RjVELCAweDEwMjEsIDB4NEY1RSwgMHgxMUQzLAotICAgIDB4NEY1RiwgMHg0MThDLCAweDRGNjAsIDB4MzdFQywgMHg0RjY0LCAweDQzNjcsIDB4NEY2OSwgMHgxMDI5LAotICAgIDB4NEY2QSwgMHg0MThELCAweDRGNkMsIDB4NDE4RSwgMHg0RjZGLCAweDEwMkMsIDB4NEY3MCwgMHgxMDJBLAotICAgIDB4NEY3MywgMHgwNTQyLCAweDRGNzUsIDB4MEUwQiwgMHg0Rjc2LCAweDEwMjQsIDB4NEY3NywgMHg0MzZDLAotICAgIDB4NEY3OCwgMHg0MzZELCAweDRGN0EsIDB4MzdGMCwgMHg0RjdCLCAweDEwMjgsIDB4NEY3QywgMHgwN0E3LAotICAgIDB4NEY3RCwgMHgzN0YxLCAweDRGN0UsIDB4MzdGMiwgMHg0RjdGLCAweDA4OTYsIDB4NEY4MiwgMHg0MzZFLAotICAgIDB4NEY4MywgMHgwNUUyLCAweDRGODQsIDB4NEFDRSwgMHg0Rjg1LCAweDQzNkYsIDB4NEY4NiwgMHgxMDJELAotICAgIDB4NEY4OCwgMHgxMDI1LCAweDRGOEEsIDB4MjBCQiwgMHg0RjhCLCAweDBGQUIsIDB4NEY4RCwgMHgwOEM2LAotICAgIDB4NEY4RiwgMHgxMDI2LCAweDRGOTEsIDB4MTAyQiwgMHg0RjkyLCAweDIwQkEsIDB4NEY5NCwgMHgyMEJELAotICAgIDB4NEY5NiwgMHgxMDJFLCAweDRGOTcsIDB4MzdGMywgMHg0Rjk4LCAweDEwMjcsIDB4NEY5QSwgMHgyMEJDLAotICAgIDB4NEY5QiwgMHgwNjk5LCAweDRGOUQsIDB4MDQ5MSwgMHg0RjlFLCAweDRBQ0YsIDB4NEZBMCwgMHgwNjlBLAotICAgIDB4NEZBMSwgMHgwNTQxLCAweDRGQUIsIDB4MTFENCwgMHg0RkFELCAweDBFQTcsIDB4NEZBRSwgMHgwREUwLAotICAgIDB4NEZBRiwgMHgwN0E4LCAweDRGQjIsIDB4NDM3MSwgMHg0RkI1LCAweDA5RjUsIDB4NEZCNiwgMHgwRjdGLAotICAgIDB4NEZCNywgMHg0QUQwLCAweDRGQkUsIDB4MzdGNCwgMHg0RkJGLCAweDBFMjgsIDB4NEZDMiwgMHgwNzBFLAotICAgIDB4NEZDMywgMHgwQjA1LCAweDRGQzQsIDB4MDU2NCwgMHg0RkM1LCAweDQzNzIsIDB4NEZDOSwgMHgyMEFDLAotICAgIDB4NEZDQSwgMHgwOTVELCAweDRGQ0IsIDB4NDM3MywgMHg0RkNELCAweDIwQkUsIDB4NEZDRSwgMHgxMDMyLAotICAgIDB4NEZDRiwgMHgzN0Y1LCAweDRGRDAsIDB4MTAzNywgMHg0RkQxLCAweDEwMzUsIDB4NEZEMiwgMHg0Mzc0LAotICAgIDB4NEZEMywgMHgzQzJGLCAweDRGRDQsIDB4MTAzMCwgMHg0RkQ3LCAweDBCMEYsIDB4NEZEOCwgMHgxMDMzLAotICAgIDB4NEZEQSwgMHgxMDM2LCAweDRGREIsIDB4MTAzNCwgMHg0RkRELCAweDBFMkQsIDB4NEZERiwgMHgxMDMxLAotICAgIDB4NEZFMCwgMHgxREVDLCAweDRGRTEsIDB4MDlGNCwgMHg0RkUzLCAweDBFQTEsIDB4NEZFNCwgMHgxMDM4LAotICAgIDB4NEZFNSwgMHgxMDM5LCAweDRGRTYsIDB4NDM3MCwgMHg0RkVFLCAweDA5MkUsIDB4NEZFRiwgMHgxMDQ2LAotICAgIDB4NEZGMSwgMHgzNUEzLCAweDRGRjIsIDB4NDM3NiwgMHg0RkYzLCAweDBEMDYsIDB4NEZGNSwgMHgwREE4LAotICAgIDB4NEZGNiwgMHgxMDQxLCAweDRGRjgsIDB4MEU0MCwgMHg0RkZBLCAweDA1MzYsIDB4NEZGRCwgMHgzN0Y2LAotICAgIDB4NEZGRSwgMHgxMDQ1LCAweDRGRkYsIDB4MjBDMSwgMHg1MDAwLCAweDM3RjcsIDB4NTAwMSwgMHgzN0Y4LAotICAgIDB4NTAwMiwgMHg0RjRCLCAweDUwMDQsIDB4NEFEMSwgMHg1MDA1LCAweDEwM0YsIDB4NTAwNiwgMHgxMDQ4LAotICAgIDB4NTAwOSwgMHgwQUQ0LCAweDUwMEIsIDB4MDc3OCwgMHg1MDBDLCAweDRBRDIsIDB4NTAwRCwgMHgwRDEyLAotICAgIDB4NTAwRSwgMHg0MThGLCAweDUwMEYsIDB4MTYwMCwgMHg1MDEwLCAweDM3RjksIDB4NTAxMSwgMHgxMDQ3LAotICAgIDB4NTAxMiwgMHgwQzU3LCAweDUwMTMsIDB4NDM3NywgMHg1MDE0LCAweDEwM0MsIDB4NTAxNiwgMHgwN0FBLAotICAgIDB4NTAxOCwgMHg0MTkwLCAweDUwMTksIDB4MDdBOSwgMHg1MDFBLCAweDEwM0EsIDB4NTAxQiwgMHgzN0ZBLAotICAgIDB4NTAxQywgMHg0Mzc4LCAweDUwMUUsIDB4MjBDMiwgMHg1MDFGLCAweDA5MDYsIDB4NTAyMSwgMHgxMDQyLAotICAgIDB4NTAyMiwgMHgyMEMwLCAweDUwMjMsIDB4MEUzRiwgMHg1MDI0LCAweDBCOEIsIDB4NTAyNSwgMHgxMDNFLAotICAgIDB4NTAyNiwgMHgwNzQ3LCAweDUwMjcsIDB4MzdGQiwgMHg1MDI4LCAweDEwM0IsIDB4NTAyOSwgMHgxMDQzLAotICAgIDB4NTAyQSwgMHgxMDNELCAweDUwMkIsIDB4MEY5OSwgMHg1MDJDLCAweDEwNDQsIDB4NTAyRCwgMHgwRkU3LAotICAgIDB4NTAyRSwgMHgzN0ZDLCAweDUwMzYsIDB4MDZERSwgMHg1MDM5LCAweDA3NDYsIDB4NTAzQiwgMHgzODAwLAotICAgIDB4NTA0MCwgMHgyMEJGLCAweDUwNDEsIDB4NDE5MSwgMHg1MDQyLCAweDIwQzUsIDB4NTA0MywgMHgxMDQ5LAotICAgIDB4NTA0NiwgMHgyMEMzLCAweDUwNDcsIDB4MTA0QSwgMHg1MDQ4LCAweDEwNEUsIDB4NTA0OSwgMHgwNDkyLAotICAgIDB4NTA0QywgMHg0QUQzLCAweDUwNEUsIDB4NDM3OSwgMHg1MDRGLCAweDBFMjAsIDB4NTA1MCwgMHgxMDRELAotICAgIDB4NTA1MywgMHg0MzdBLCAweDUwNTUsIDB4MTA0QywgMHg1MDU2LCAweDEwNTAsIDB4NTA1NywgMHgzN0ZELAotICAgIDB4NTA1QSwgMHgxMDRGLCAweDUwNUMsIDB4MEMwMCwgMHg1MDVGLCAweDRBRDQsIDB4NTA2MiwgMHg0QUQ1LAotICAgIDB4NTA2MywgMHg0MzdCLCAweDUwNjUsIDB4MDc0OCwgMHg1MDY2LCAweDM3RkUsIDB4NTA2QSwgMHgzN0ZGLAotICAgIDB4NTA2QywgMHgxMDUxLCAweDUwNzAsIDB4MjBDNCwgMHg1MDcyLCAweDA4RjEsIDB4NTA3NCwgMHgwQjA2LAotICAgIDB4NTA3NSwgMHgwQzAxLCAweDUwNzYsIDB4MDZFRSwgMHg1MDc3LCAweDRBRDYsIDB4NTA3OCwgMHgxMDUyLAotICAgIDB4NTA3RCwgMHgwNjUwLCAweDUwODAsIDB4MTA1MywgMHg1MDg1LCAweDEwNTUsIDB4NTA4OCwgMHg0MzdELAotICAgIDB4NTA4RCwgMHgwRTYzLCAweDUwOEUsIDB4NEFENywgMHg1MDhGLCAweDM4MDEsIDB4NTA5MSwgMHgwNzNDLAotICAgIDB4NTA5MiwgMHg0MzdFLCAweDUwOTMsIDB4NDM3RiwgMHg1MDk0LCAweDIwQzYsIDB4NTA5NSwgMHg0MzgwLAotICAgIDB4NTA5NiwgMHgzODAyLCAweDUwOTgsIDB4MDg3RiwgMHg1MDk5LCAweDBEOEIsIDB4NTA5QSwgMHgxMDU0LAotICAgIDB4NTA5QywgMHgzODAzLCAweDUwOUUsIDB4NEFEOCwgMHg1MEEyLCAweDRBRDksIDB4NTBBMywgMHg0MzdDLAotICAgIDB4NTBBQSwgMHg0MzgxLCAweDUwQUMsIDB4MDgzNSwgMHg1MEFELCAweDBGMkQsIDB4NTBCMSwgMHg0MzgzLAotICAgIDB4NTBCMiwgMHgxMDU3LCAweDUwQjMsIDB4MTA1QSwgMHg1MEI0LCAweDEwNTYsIDB4NTBCNSwgMHgwODM0LAotICAgIDB4NTBCNywgMHgwOTg3LCAweDUwQkEsIDB4NDM4NCwgMHg1MEJCLCAweDQzODUsIDB4NTBCRSwgMHgwNzBGLAotICAgIDB4NTBDMiwgMHgxMDVCLCAweDUwQzMsIDB4NEFEQSwgMHg1MEM0LCAweDQzODYsIDB4NTBDNSwgMHgwNkM3LAotICAgIDB4NTBDNywgMHg0Mzg3LCAweDUwQzksIDB4MTA1OCwgMHg1MENBLCAweDEwNTksIDB4NTBDQywgMHgzODA0LAotICAgIDB4NTBDRCwgMHgwQzg3LCAweDUwQ0UsIDB4NDM4QSwgMHg1MENGLCAweDBBRkUsIDB4NTBEMCwgMHg0MTkzLAotICAgIDB4NTBEMSwgMHgwNjlCLCAweDUwRDQsIDB4NDM4QywgMHg1MEQ1LCAweDBFN0IsIDB4NTBENiwgMHgxMDVDLAotICAgIDB4NTBEOCwgMHgyMEM4LCAweDUwRDksIDB4M0MzMCwgMHg1MERBLCAweDBGODUsIDB4NTBERSwgMHgxMDVELAotICAgIDB4NTBFMSwgMHg0MzhELCAweDUwRTMsIDB4MTA2MCwgMHg1MEU1LCAweDEwNUUsIDB4NTBFNiwgMHgzODA1LAotICAgIDB4NTBFNywgMHgwQUQwLCAweDUwRTgsIDB4NEFEQiwgMHg1MEU5LCAweDM4MDYsIDB4NTBFRCwgMHgxMDVGLAotICAgIDB4NTBFRSwgMHgxMDYxLCAweDUwRUYsIDB4MzgwNywgMHg1MEYwLCAweDNDMzEsIDB4NTBGMSwgMHg0QURDLAotICAgIDB4NTBGMiwgMHg0MTkyLCAweDUwRjMsIDB4NDM4OCwgMHg1MEY0LCAweDIwQzcsIDB4NTBGNSwgMHgxMDYzLAotICAgIDB4NTBGOSwgMHgxMDYyLCAweDUwRkIsIDB4MEUxOCwgMHg1MEZFLCAweDRBREQsIDB4NTEwMCwgMHgwNjUxLAotICAgIDB4NTEwMSwgMHgxMDY1LCAweDUxMDIsIDB4MTA2NiwgMHg1MTAzLCAweDQxOTUsIDB4NTEwNCwgMHgwNTJGLAotICAgIDB4NTEwNiwgMHg0MTk0LCAweDUxMDcsIDB4NEFERSwgMHg1MTA4LCAweDM4MDgsIDB4NTEwOSwgMHgxMDY0LAotICAgIDB4NTEwQiwgMHgzODA5LCAweDUxMEMsIDB4NEFERiwgMHg1MTBELCAweDRBRTAsIDB4NTEwRSwgMHg0QUUxLAotICAgIDB4NTExMCwgMHgzODBBLCAweDUxMTIsIDB4MDkyMCwgMHg1MTE0LCAweDEwNjksIDB4NTExNSwgMHgxMDY4LAotICAgIDB4NTExNiwgMHgxMDY3LCAweDUxMTcsIDB4NDM5MCwgMHg1MTE4LCAweDEwMkYsIDB4NTExQSwgMHgxMDZBLAotICAgIDB4NTExQiwgMHgzODBCLCAweDUxMUUsIDB4MzgwQywgMHg1MTFGLCAweDA5ODgsIDB4NTEyMSwgMHgxMDZCLAotICAgIDB4NTEyQSwgMHgwRjBGLCAweDUxMzIsIDB4MEVFNSwgMHg1MTMzLCAweDRBRTIsIDB4NTEzNSwgMHg0MTk2LAotICAgIDB4NTEzNywgMHgxMDZELCAweDUxMzgsIDB4NEFFMywgMHg1MTNBLCAweDEwNkMsIDB4NTEzQiwgMHgxMDZGLAotICAgIDB4NTEzQywgMHgxMDZFLCAweDUxM0YsIDB4MTA3MCwgMHg1MTQwLCAweDEwNzEsIDB4NTE0MSwgMHgwNEI4LAotICAgIDB4NTE0MywgMHgwNzY5LCAweDUxNDQsIDB4MDcxMSwgMHg1MTQ1LCAweDA5NDYsIDB4NTE0NiwgMHgwQkI5LAotICAgIDB4NTE0NywgMHgwNjlDLCAweDUxNDgsIDB4MEE4QywgMHg1MTQ5LCAweDA3QUIsIDB4NTE0QSwgMHgyMEM5LAotICAgIDB4NTE0QiwgMHgwODAwLCAweDUxNEMsIDB4MTA3MywgMHg1MTRELCAweDBFRDQsIDB4NTE0RSwgMHgwQzQwLAotICAgIDB4NTE1MCwgMHgwOEM3LCAweDUxNTIsIDB4MTA3MiwgMHg1MTU0LCAweDEwNzQsIDB4NTE1NSwgMHg0MTk3LAotICAgIDB4NTE1NywgMHg0MTk4LCAweDUxNUEsIDB4MEM1OCwgMHg1MTVDLCAweDA1RDMsIDB4NTE1RiwgMHgzODBELAotICAgIDB4NTE2MCwgMHg0MzkyLCAweDUxNjIsIDB4MTA3NSwgMHg1MTY0LCAweDIwQ0EsIDB4NTE2NSwgMHgwQ0Q2LAotICAgIDB4NTE2NywgMHgzNjhFLCAweDUxNjgsIDB4MEFCNiwgMHg1MTY5LCAweDEwNzcsIDB4NTE2QSwgMHgxMDc4LAotICAgIDB4NTE2QiwgMHgwRDQwLCAweDUxNkMsIDB4MDdBQywgMHg1MTZELCAweDBGRTEsIDB4NTE2RSwgMHgxMDc5LAotICAgIDB4NTE3MSwgMHgwNjlFLCAweDUxNzMsIDB4NDM5NCwgMHg1MTc0LCAweDRBRTQsIDB4NTE3NSwgMHgwRTBDLAotICAgIDB4NTE3NiwgMHgwQjE2LCAweDUxNzcsIDB4MDZFOSwgMHg1MTc4LCAweDBDMkYsIDB4NTE3OSwgMHgzNzc5LAotICAgIDB4NTE3QiwgMHg0N0Q5LCAweDUxN0MsIDB4MDc0OSwgMHg1MTgwLCAweDEwN0EsIDB4NTE4MiwgMHgxMDdCLAotICAgIDB4NTE4MywgMHg0Mzk1LCAweDUxODQsIDB4NEFFNSwgMHg1MTg1LCAweDBDQkEsIDB4NTE4NiwgMHgwNTAxLAotICAgIDB4NTE4OSwgMHgxMDdFLCAweDUxOEEsIDB4MDg2RCwgMHg1MThCLCAweDQzOTYsIDB4NTE4QywgMHgxMDdELAotICAgIDB4NTE4RCwgMHgwODM2LCAweDUxOEYsIDB4MTA3RiwgMHg1MTkwLCAweDE4NUIsIDB4NTE5MSwgMHgxMDgwLAotICAgIDB4NTE5MiwgMHgwRTZGLCAweDUxOTMsIDB4MTA4MSwgMHg1MTk1LCAweDEwODIsIDB4NTE5NiwgMHgxMDgzLAotICAgIDB4NTE5NywgMHgwOUQxLCAweDUxOTgsIDB4NDM5OCwgMHg1MTk5LCAweDA4RjgsIDB4NTE5RCwgMHgyMENCLAotICAgIDB4NTFBMCwgMHgwNUUzLCAweDUxQTEsIDB4MzgwRSwgMHg1MUEyLCAweDEwODYsIDB4NTFBMywgMHg0Mzk5LAotICAgIDB4NTFBNCwgMHgxMDg0LCAweDUxQTUsIDB4MEVDOSwgMHg1MUE2LCAweDEwODUsIDB4NTFBOCwgMHgwRENDLAotICAgIDB4NTFBOSwgMHgxMDg3LCAweDUxQUEsIDB4MTA4OCwgMHg1MUFCLCAweDEwODksIDB4NTFBQywgMHgwQzU5LAotICAgIDB4NTFBRCwgMHg0MzlBLCAweDUxQjAsIDB4MTA4RCwgMHg1MUIxLCAweDEwOEIsIDB4NTFCMiwgMHgxMDhDLAotICAgIDB4NTFCMywgMHgxMDhBLCAweDUxQjQsIDB4MDg1MywgMHg1MUI1LCAweDEwOEUsIDB4NTFCNiwgMHgwRUY2LAotICAgIDB4NTFCNywgMHgwRkFDLCAweDUxQjgsIDB4NEFFNiwgMHg1MUJBLCAweDRBRTcsIDB4NTFCQywgMHgzODBGLAotICAgIDB4NTFCRCwgMHgxMDhGLCAweDUxQkUsIDB4MjBDQywgMHg1MUMzLCAweDNDMzIsIDB4NTFDNCwgMHgwQTRDLAotICAgIDB4NTFDNSwgMHgxMDkwLCAweDUxQzYsIDB4MDk2NCwgMHg1MUM4LCAweDRBRTgsIDB4NTFDOSwgMHgxMDkxLAotICAgIDB4NTFDQSwgMHg0MTlBLCAweDUxQ0IsIDB4MEJCQSwgMHg1MUNDLCAweDBGODcsIDB4NTFDRCwgMHgwQzVBLAotICAgIDB4NTFDRiwgMHg0QUU5LCAweDUxRDEsIDB4NEFFQSwgMHg1MUQzLCAweDRBRUIsIDB4NTFENCwgMHg0QUVDLAotICAgIDB4NTFENiwgMHgxMERBLCAweDUxRDgsIDB4NEFFRCwgMHg1MURCLCAweDEwOTIsIDB4NTFEQywgMHgyMDVDLAotICAgIDB4NTFERCwgMHgwNkJELCAweDUxREUsIDB4NEY0QywgMHg1MURGLCAweDRBRUUsIDB4NTFFMCwgMHgxMDkzLAotICAgIDB4NTFFMSwgMHgwRThDLCAweDUxRTIsIDB4NDE5QiwgMHg1MUU2LCAweDA5NzIsIDB4NTFFNywgMHgwQjVDLAotICAgIDB4NTFFOSwgMHgxMDk1LCAweDUxRUEsIDB4MENCQywgMHg1MUVDLCAweDIwQ0QsIDB4NTFFRCwgMHgxMDk2LAotICAgIDB4NTFFRSwgMHgzODExLCAweDUxRjAsIDB4MTA5NywgMHg1MUYxLCAweDA1OEMsIDB4NTFGMywgMHg0MzlELAotICAgIDB4NTFGNCwgMHgzODEyLCAweDUxRjUsIDB4MTA5OCwgMHg1MUY2LCAweDA2OUYsIDB4NTFGOCwgMHgwQ0E0LAotICAgIDB4NTFGOSwgMHgwNTFDLCAweDUxRkEsIDB4MDk1QSwgMHg1MUZELCAweDBEMzUsIDB4NTFGRSwgMHgxMDk5LAotICAgIDB4NTIwMCwgMHgwQzVCLCAweDUyMDEsIDB4MzgxMywgMHg1MjAyLCAweDM4MTQsIDB4NTIwMywgMHgwQTE1LAotICAgIDB4NTIwNCwgMHgxMDlBLCAweDUyMDUsIDB4NEFFRiwgMHg1MjA2LCAweDBERkMsIDB4NTIwNywgMHgwQTdFLAotICAgIDB4NTIwOCwgMHgwNURFLCAweDUyMEEsIDB4MDVFNSwgMHg1MjBCLCAweDEwOUIsIDB4NTIwRSwgMHgxMDlELAotICAgIDB4NTIxMSwgMHgwNzEwLCAweDUyMTIsIDB4NDM5RSwgMHg1MjEzLCAweDM4MTUsIDB4NTIxNCwgMHgxMDlDLAotICAgIDB4NTIxNSwgMHgyMENFLCAweDUyMTYsIDB4NDM5RiwgMHg1MjE3LCAweDBGQkIsIDB4NTIxRCwgMHgwOTczLAotICAgIDB4NTIyNCwgMHgwRDUxLCAweDUyMjUsIDB4MEUxQywgMHg1MjI2LCAweDRBRjAsIDB4NTIyNywgMHgxMDlFLAotICAgIDB4NTIyOCwgMHg0QUYxLCAweDUyMjksIDB4MEY2MiwgMHg1MjJBLCAweDEwOUYsIDB4NTIyQiwgMHg0QUYyLAotICAgIDB4NTIyRSwgMHgxMEEwLCAweDUyMzAsIDB4MEM3OCwgMHg1MjMxLCAweDRBRjMsIDB4NTIzMiwgMHg0QUY0LAotICAgIDB4NTIzMywgMHgxMEExLCAweDUyMzUsIDB4NEFGNSwgMHg1MjM2LCAweDBBNEQsIDB4NTIzNywgMHgwODZFLAotICAgIDB4NTIzOCwgMHgwNzRBLCAweDUyMzksIDB4MTBBMiwgMHg1MjNBLCAweDA4OTcsIDB4NTIzQiwgMHgwODAxLAotICAgIDB4NTIzQywgMHg0QUY2LCAweDUyNDMsIDB4MEMwMiwgMHg1MjQ0LCAweDEwQTQsIDB4NTI0NywgMHgwQjA3LAotICAgIDB4NTI0OSwgMHgzODE2LCAweDUyNEEsIDB4MDg1RiwgMHg1MjRCLCAweDEwQTUsIDB4NTI0QywgMHgxMEE2LAotICAgIDB4NTI0RCwgMHgwQUIyLCAweDUyNEYsIDB4MTBBMywgMHg1MjU0LCAweDEwQTgsIDB4NTI1NSwgMHg0M0ExLAotICAgIDB4NTI1NiwgMHgwRTY0LCAweDUyNTcsIDB4NDE5QywgMHg1MjVBLCAweDRBRjcsIDB4NTI1QiwgMHgwN0Y2LAotICAgIDB4NTI1QywgMHg0M0EyLCAweDUyNUQsIDB4MUU1RSwgMHg1MjVFLCAweDEwQTcsIDB4NTI2MCwgMHg0QUY4LAotICAgIDB4NTI2MSwgMHgzODE3LCAweDUyNjMsIDB4MDc0QiwgMHg1MjY0LCAweDA4NEUsIDB4NTI2NSwgMHgwRDIzLAotICAgIDB4NTI2NiwgMHgzODE4LCAweDUyNjksIDB4MTBBQiwgMHg1MjZBLCAweDEwQTksIDB4NTI2QywgMHg0M0EzLAotICAgIDB4NTI2RSwgMHg0QUY5LCAweDUyNkYsIDB4MERFRCwgMHg1MjcwLCAweDA5RDIsIDB4NTI3MSwgMHgxMEIyLAotICAgIDB4NTI3MiwgMHgwNUMyLCAweDUyNzMsIDB4MTBBQywgMHg1Mjc0LCAweDEwQUEsIDB4NTI3NSwgMHgwQUQxLAotICAgIDB4NTI3NywgMHg0M0E0LCAweDUyNzgsIDB4NEFGQSwgMHg1Mjc5LCAweDRBRkIsIDB4NTI3RCwgMHgxMEFFLAotICAgIDB4NTI3RiwgMHgxMEFELCAweDUyODIsIDB4NDNBNiwgMHg1MjgzLCAweDA1QTIsIDB4NTI4NCwgMHg0M0E1LAotICAgIDB4NTI4NywgMHgwNzM2LCAweDUyODgsIDB4MTBCMywgMHg1Mjg5LCAweDBGNzUsIDB4NTI4QSwgMHg0QUZDLAotICAgIDB4NTI4QywgMHg0QUZELCAweDUyOEQsIDB4MTBBRiwgMHg1MjkxLCAweDEwQjQsIDB4NTI5MiwgMHgxMEIxLAotICAgIDB4NTI5MywgMHgzODE5LCAweDUyOTQsIDB4MTBCMCwgMHg1Mjk4LCAweDQzQTgsIDB4NTI5QiwgMHgwRjk3LAotICAgIDB4NTI5QywgMHgyMENGLCAweDUyOUYsIDB4MDdBRCwgMHg1MkEwLCAweDA1NDMsIDB4NTJBMywgMHgwRkJDLAotICAgIDB4NTJBNCwgMHg0M0FBLCAweDUyQTYsIDB4MjBEMCwgMHg1MkE5LCAweDA5N0YsIDB4NTJBQSwgMHgwQzUyLAotICAgIDB4NTJBQiwgMHgwN0Y3LCAweDUyQUMsIDB4MTBCNywgMHg1MkFELCAweDEwQjgsIDB4NTJBRiwgMHgyMTdELAotICAgIDB4NTJCMSwgMHgwRkFELCAweDUyQjQsIDB4MEZEMSwgMHg1MkI1LCAweDEwQkEsIDB4NTJCOSwgMHgwN0FFLAotICAgIDB4NTJCQSwgMHg0M0FCLCAweDUyQkIsIDB4NDNBQywgMHg1MkJDLCAweDEwQjksIDB4NTJCRSwgMHgwNThELAotICAgIDB4NTJDMCwgMHgyMEQxLCAweDUyQzEsIDB4MTBCQiwgMHg1MkMzLCAweDBFODQsIDB4NTJDNSwgMHgwQkQ4LAotICAgIDB4NTJDNywgMHgwRjEwLCAweDUyQzgsIDB4MzgxQSwgMHg1MkM5LCAweDBFMjksIDB4NTJDQSwgMHg0M0FELAotICAgIDB4NTJDQywgMHg0MTlELCAweDUyQ0QsIDB4MTBCQywgMHg1MkQwLCAweDM2RTgsIDB4NTJEMSwgMHg0M0FFLAotICAgIDB4NTJEMiwgMHgxQkVFLCAweDUyRDUsIDB4MEM4OCwgMHg1MkQ2LCAweDQxOUUsIDB4NTJENywgMHgxMEJELAotICAgIDB4NTJEOCwgMHgwNUU2LCAweDUyRDksIDB4MEVCRiwgMHg1MkRCLCAweDIwRDIsIDB4NTJERCwgMHgwOTg5LAotICAgIDB4NTJERSwgMHgxMEJFLCAweDUyREYsIDB4MEUzNywgMHg1MkUwLCAweDEwQzIsIDB4NTJFMSwgMHg0QUZFLAotICAgIDB4NTJFMiwgMHgwQTRFLCAweDUyRTMsIDB4MTBCRiwgMHg1MkU0LCAweDA2QzgsIDB4NTJFNiwgMHgxMEMwLAotICAgIDB4NTJFNywgMHgwNUU3LCAweDUyRTksIDB4NEFGRiwgMHg1MkYwLCAweDM4MUIsIDB4NTJGMSwgMHg0QjAwLAotICAgIDB4NTJGMiwgMHgwNzA0LCAweDUyRjMsIDB4MTBDMywgMHg1MkY1LCAweDEwQzQsIDB4NTJGNywgMHg0M0IwLAotICAgIDB4NTJGOCwgMHgxMEM1LCAweDUyRjksIDB4MTBDNiwgMHg1MkZBLCAweDA5MDcsIDB4NTJGQiwgMHg0MTlGLAotICAgIDB4NTJGRSwgMHgwN0FGLCAweDUyRkYsIDB4MEVFQSwgMHg1MzAwLCAweDIwRDMsIDB4NTMwMSwgMHgwRUY0LAotICAgIDB4NTMwMiwgMHgwQ0NGLCAweDUzMDMsIDB4NEIwMSwgMHg1MzA1LCAweDBFNDEsIDB4NTMwNiwgMHgxMEM3LAotICAgIDB4NTMwNywgMHg0RjRELCAweDUzMDgsIDB4MTBDOCwgMHg1MzBBLCAweDM4MUMsIDB4NTMwQiwgMHgzODFELAotICAgIDB4NTMwRCwgMHgxMENBLCAweDUzMEYsIDB4MTBDQywgMHg1MzEwLCAweDEwQ0IsIDB4NTMxMSwgMHg0QjAyLAotICAgIDB4NTMxNSwgMHgxMENELCAweDUzMTYsIDB4MDUzRCwgMHg1MzE3LCAweDBFN0EsIDB4NTMxOSwgMHgwODZDLAotICAgIDB4NTMxQSwgMHgxMENFLCAweDUzMUMsIDB4NDFBMCwgMHg1MzFELCAweDBBREIsIDB4NTMxRiwgMHg0QjAzLAotICAgIDB4NTMyMCwgMHgwOThBLCAweDUzMjEsIDB4MDZBMSwgMHg1MzIzLCAweDEwQ0YsIDB4NTMyNCwgMHgyMEQ1LAotICAgIDB4NTMyQSwgMHgwRDZGLCAweDUzMkQsIDB4NEIwNCwgMHg1MzJGLCAweDEwRDAsIDB4NTMzMSwgMHgxMEQxLAotICAgIDB4NTMzMiwgMHg0QjA1LCAweDUzMzMsIDB4MTBEMiwgMHg1MzM1LCAweDQzQjEsIDB4NTMzOCwgMHgxMEQzLAotICAgIDB4NTMzOSwgMHgwRDk2LCAweDUzM0EsIDB4MDZFMCwgMHg1MzNCLCAweDA0QTksIDB4NTMzRCwgMHg0QjA2LAotICAgIDB4NTMzRSwgMHgzODFFLCAweDUzM0YsIDB4MEM5NywgMHg1MzQwLCAweDEwRDQsIDB4NTM0MSwgMHgwOTQ3LAotICAgIDB4NTM0MiwgMHg0M0IyLCAweDUzNDMsIDB4MEE4RCwgMHg1MzQ1LCAweDEwRDYsIDB4NTM0NiwgMHgxMEQ1LAotICAgIDB4NTM0NywgMHgwOThCLCAweDUzNDgsIDB4MDc5NSwgMHg1MzQ5LCAweDEwRDgsIDB4NTM0QSwgMHgwRDUyLAotICAgIDB4NTM0QiwgMHgzODIwLCAweDUzNEMsIDB4MzgxRiwgMHg1MzRELCAweDEwRDksIDB4NTM1MSwgMHgwRDcwLAotICAgIDB4NTM1MiwgMHgwQjE0LCAweDUzNTMsIDB4MEI0RSwgMHg1MzU0LCAweDA2QTAsIDB4NTM1NywgMHgwQ0M2LAotICAgIDB4NTM1OCwgMHgwQjZGLCAweDUzNUEsIDB4MEQyNCwgMHg1MzVDLCAweDBFN0MsIDB4NTM1RSwgMHgxMERCLAotICAgIDB4NTM2MCwgMHgwQThFLCAweDUzNjEsIDB4MzgyMSwgMHg1MzYzLCAweDQxQTEsIDB4NTM2NSwgMHg0QjA3LAotICAgIDB4NTM2NiwgMHgwNzBCLCAweDUzNjcsIDB4NDNCNSwgMHg1MzY5LCAweDEwREMsIDB4NTM2QywgMHgzODIyLAotICAgIDB4NTM2RCwgMHg0QjA4LCAweDUzNkUsIDB4MTBERCwgMHg1MzZGLCAweDA0Q0UsIDB4NTM3MCwgMHgwNEI5LAotICAgIDB4NTM3MSwgMHgwNjI5LCAweDUzNzIsIDB4MjBENiwgMHg1MzczLCAweDBCMDgsIDB4NTM3NCwgMHgwNjZCLAotICAgIDB4NTM3NSwgMHgwRjVCLCAweDUzNzcsIDB4MTBFMCwgMHg1Mzc4LCAweDA1MzcsIDB4NTM3OSwgMHg0QjA5LAotICAgIDB4NTM3QSwgMHg0M0I2LCAweDUzN0IsIDB4MTBERiwgMHg1MzdELCAweDM0MzUsIDB4NTM3RSwgMHg0QjBBLAotICAgIDB4NTM3RiwgMHgwNkEyLCAweDUzODIsIDB4MTBFMSwgMHg1Mzg0LCAweDBFRkQsIDB4NTM4OSwgMHgzN0QwLAotICAgIDB4NTM5MywgMHgyMEQ3LCAweDUzOTQsIDB4NEIwQiwgMHg1Mzk2LCAweDEwRTIsIDB4NTM5OCwgMHgwRjlBLAotICAgIDB4NTM5OSwgMHg0QjBDLCAweDUzOUEsIDB4MDdCMCwgMHg1MzlELCAweDQxQTIsIDB4NTM5RiwgMHgwNzZBLAotICAgIDB4NTNBMCwgMHgxMEUzLCAweDUzQTQsIDB4NDNCNywgMHg1M0E1LCAweDEwRTUsIDB4NTNBNiwgMHgxMEU0LAotICAgIDB4NTNBOCwgMHgwQTI1LCAweDUzQTksIDB4MDREQiwgMHg1M0FBLCAweDRCMEQsIDB4NTNBQiwgMHgzODIzLAotICAgIDB4NTNBRCwgMHgwNTAwLCAweDUzQUUsIDB4MTBFNiwgMHg1M0FGLCAweDRCMEUsIDB4NTNCMCwgMHgxMEU3LAotICAgIDB4NTNCMiwgMHgyMEQ4LCAweDUzQjMsIDB4MDc2QiwgMHg1M0I0LCAweDQzQjgsIDB4NTNCNiwgMHgxMEU4LAotICAgIDB4NTNCNywgMHg0M0JBLCAweDUzQkEsIDB4NEIwRiwgMHg1M0JCLCAweDA2ODgsIDB4NTNDMCwgMHg0M0JCLAotICAgIDB4NTNDMSwgMHg0QjEwLCAweDUzQzIsIDB4MDg4MCwgMHg1M0MzLCAweDEwRTksIDB4NTNDNCwgMHg0QjExLAotICAgIDB4NTNDNSwgMHg0QjEyLCAweDUzQzgsIDB4MEVBMiwgMHg1M0M5LCAweDA4MjUsIDB4NTNDQSwgMHgwNjc0LAotICAgIDB4NTNDQiwgMHgwRjExLCAweDUzQ0MsIDB4MEFEMiwgMHg1M0NELCAweDBENTMsIDB4NTNDRSwgMHgwOTI5LAotICAgIDB4NTNENCwgMHgwOTUxLCAweDUzRDUsIDB4NDNCRiwgMHg1M0Q2LCAweDA5MTQsIDB4NTNENywgMHgwOTIxLAotICAgIDB4NTNEOSwgMHgwOTgwLCAweDUzREEsIDB4MzgyNCwgMHg1M0RCLCAweDBENTQsIDB4NTNERCwgMHgyMEQ5LAotICAgIDB4NTNERiwgMHgxMEVDLCAweDUzRTAsIDB4NEIxMywgMHg1M0UxLCAweDA0RTUsIDB4NTNFMiwgMHgwQUQzLAotICAgIDB4NTNFMywgMHgwN0IxLCAweDUzRTQsIDB4MDc3OSwgMHg1M0U1LCAweDA2REYsIDB4NTNFNiwgMHgzODI1LAotICAgIDB4NTNFOCwgMHgxMEYwLCAweDUzRTksIDB4MEI1RiwgMHg1M0VBLCAweDBCNUUsIDB4NTNFQiwgMHgwNkEzLAotICAgIDB4NTNFQywgMHgwOThDLCAweDUzRUQsIDB4MTBGMSwgMHg1M0VFLCAweDEwRUYsIDB4NTNFRiwgMHgwNTQ0LAotICAgIDB4NTNGMCwgMHgwQjQ2LCAweDUzRjEsIDB4MDhFNCwgMHg1M0YyLCAweDA4OTksIDB4NTNGMywgMHgwNEM4LAotICAgIDB4NTNGNCwgMHg0M0MxLCAweDUzRjUsIDB4MzgyNiwgMHg1M0Y2LCAweDA1Q0UsIDB4NTNGNywgMHgwN0Y4LAotICAgIDB4NTNGOCwgMHgwODk4LCAweDUzRkEsIDB4MTBGMiwgMHg1NDAxLCAweDEwRjMsIDB4NTQwMywgMHgwNjYzLAotICAgIDB4NTQwNCwgMHgwNUE0LCAweDU0MDgsIDB4MDdGOSwgMHg1NDA5LCAweDA2NjIsIDB4NTQwQSwgMHgwQkZCLAotICAgIDB4NTQwQiwgMHgwNEM3LCAweDU0MEMsIDB4MEM4OSwgMHg1NDBELCAweDBFQ0EsIDB4NTQwRSwgMHgwN0IzLAotICAgIDB4NTQwRiwgMHgwRjYzLCAweDU0MTAsIDB4MEM0MSwgMHg1NDExLCAweDA3QjIsIDB4NTQxMiwgMHg0MUEzLAotICAgIDB4NTQxMywgMHg0QjE0LCAweDU0MUIsIDB4MDcwNSwgMHg1NDFELCAweDEwRkMsIDB4NTQxRSwgMHgzNjhDLAotICAgIDB4NTQxRiwgMHgwNkRCLCAweDU0MjAsIDB4MEU3OCwgMHg1NDI0LCAweDQzQzIsIDB4NTQyNiwgMHgwRDcxLAotICAgIDB4NTQyNywgMHgzODI3LCAweDU0MjgsIDB4NDNDMywgMHg1NDI5LCAweDEwRkIsIDB4NTQyQSwgMHg0QjE1LAotICAgIDB4NTQyQiwgMHgwNjFBLCAweDU0MkMsIDB4MTBGNiwgMHg1NDJELCAweDEwRjcsIDB4NTQyRSwgMHgxMEY5LAotICAgIDB4NTQzMSwgMHg0QjE2LCAweDU0MzMsIDB4MzVDMCwgMHg1NDM0LCAweDRCMTcsIDB4NTQzNSwgMHg0QjE4LAotICAgIDB4NTQzNiwgMHgxMEZBLCAweDU0MzgsIDB4MDY3NSwgMHg1NDM5LCAweDBBMjcsIDB4NTQzQiwgMHgwREZELAotICAgIDB4NTQzQywgMHgxMEY4LCAweDU0M0QsIDB4MTBGNCwgMHg1NDNFLCAweDA3OTcsIDB4NTQzRiwgMHgzNUNGLAotICAgIDB4NTQ0MCwgMHgxMEY1LCAweDU0NDIsIDB4MEZDQSwgMHg1NDQzLCAweDQzQzUsIDB4NTQ0NiwgMHgwRTQyLAotICAgIDB4NTQ0OCwgMHgwQzA0LCAweDU0NDksIDB4MDc5NiwgMHg1NDRBLCAweDA4MDIsIDB4NTQ0QywgMHg0QjE5LAotICAgIDB4NTQ0RCwgMHgzODI4LCAweDU0NEUsIDB4MTBGRCwgMHg1NDUxLCAweDBDQjUsIDB4NTQ1NSwgMHgzNzIzLAotICAgIDB4NTQ1RiwgMHgxMTAxLCAweDU0NjIsIDB4NDNDNiwgMHg1NDY2LCAweDM4MjksIDB4NTQ2OCwgMHgwOTJBLAotICAgIDB4NTQ2QSwgMHgwOTIyLCAweDU0NkIsIDB4MzgyQSwgMHg1NDZDLCAweDQzQzcsIDB4NTQ3MCwgMHgxMTA0LAotICAgIDB4NTQ3MSwgMHgxMTAyLCAweDU0NzMsIDB4MEVBRiwgMHg1NDc0LCAweDM4MkIsIDB4NTQ3NSwgMHgxMEZGLAotICAgIDB4NTQ3NiwgMHgxMTA4LCAweDU0NzcsIDB4MTEwMywgMHg1NDdCLCAweDExMDYsIDB4NTQ3QywgMHgwNzdBLAotICAgIDB4NTQ3RCwgMHgwRUNCLCAweDU0N0YsIDB4NDFBNCwgMHg1NDgwLCAweDExMDcsIDB4NTQ4NCwgMHgxMTA5LAotICAgIDB4NTQ4NiwgMHgxMTBCLCAweDU0ODgsIDB4NDFBNSwgMHg1NDhBLCAweDIwREMsIDB4NTQ4QiwgMHgwODYwLAotICAgIDB4NTQ4QywgMHgwRkU4LCAweDU0OEQsIDB4MzgyQywgMHg1NDhFLCAweDExMDAsIDB4NTQ4RiwgMHgxMEZFLAotICAgIDB4NTQ5MCwgMHgxMTBBLCAweDU0OTIsIDB4MTEwNSwgMHg1NDk1LCAweDQzQzgsIDB4NTQ5NiwgMHgzODJELAotICAgIDB4NTQ5QywgMHgyMERCLCAweDU0QTAsIDB4NDNDOSwgMHg1NEExLCAweDM4MkUsIDB4NTRBMiwgMHgxMTBELAotICAgIDB4NTRBNCwgMHgxMTE2LCAweDU0QTUsIDB4MTEwRiwgMHg1NEE2LCAweDQzQ0EsIDB4NTRBNywgMHg0QjFBLAotICAgIDB4NTRBOCwgMHgxMTEzLCAweDU0QTksIDB4MjBERCwgMHg1NEFBLCAweDRCMUIsIDB4NTRBQiwgMHgxMTE0LAotICAgIDB4NTRBQywgMHgxMTEwLCAweDU0QUQsIDB4MzgyRiwgMHg1NEFFLCAweDQzQ0IsIDB4NTRBRiwgMHgxMTMxLAotICAgIDB4NTRCMSwgMHg0QjFDLCAweDU0QjIsIDB4MDg1OSwgMHg1NEIzLCAweDA1OEYsIDB4NTRCNywgMHg0M0NDLAotICAgIDB4NTRCOCwgMHgxMTBFLCAweDU0QjksIDB4MzgzMCwgMHg1NEJBLCAweDQzQ0QsIDB4NTRCQiwgMHg0QjFELAotICAgIDB4NTRCQywgMHgxMTE4LCAweDU0QkQsIDB4MDRCQSwgMHg1NEJFLCAweDExMTcsIDB4NTRCRiwgMHgzODMxLAotICAgIDB4NTRDMCwgMHgwNDY5LCAweDU0QzEsIDB4MERCQywgMHg1NEMyLCAweDExMTUsIDB4NTRDMywgMHg0M0NFLAotICAgIDB4NTRDNCwgMHgxMTExLCAweDU0QzYsIDB4MzgzMiwgMHg1NEM3LCAweDExMEMsIDB4NTRDOCwgMHgxMTEyLAotICAgIDB4NTRDOSwgMHgwODM4LCAweDU0Q0QsIDB4MzgzMywgMHg1NENFLCAweDRCMUUsIDB4NTREOCwgMHgxMTE5LAotICAgIDB4NTRFMSwgMHgwNEJCLCAweDU0RTIsIDB4MTEyMiwgMHg1NEU1LCAweDExMUEsIDB4NTRFNiwgMHgxMTFCLAotICAgIDB4NTRFOCwgMHgwOThELCAweDU0RTksIDB4MEU5NywgMHg1NEVBLCAweDRCMUYsIDB4NTRFQywgMHg0M0QwLAotICAgIDB4NTRFRCwgMHgxMTIwLCAweDU0RUUsIDB4MTExRiwgMHg1NEVGLCAweDQzRDEsIDB4NTRGMSwgMHg0M0QyLAotICAgIDB4NTRGMiwgMHgwQzI5LCAweDU0RjMsIDB4NDNEMywgMHg1NEZBLCAweDExMjEsIDB4NTRGQywgMHg0QjIwLAotICAgIDB4NTRGRCwgMHgxMTFFLCAweDU0RkYsIDB4MjBERSwgMHg1NTAwLCAweDQzRDQsIDB4NTUwMSwgMHg0M0Q1LAotICAgIDB4NTUwNCwgMHgwNEQ2LCAweDU1MDUsIDB4NEIyMSwgMHg1NTA2LCAweDA4MjYsIDB4NTUwNywgMHgwOUY2LAotICAgIDB4NTUwOCwgMHg0QjIyLCAweDU1MDksIDB4NDNENiwgMHg1NTBFLCAweDM4MzQsIDB4NTUwRiwgMHgxMTFDLAotICAgIDB4NTUxMCwgMHgwQzVDLCAweDU1MTQsIDB4MTExRCwgMHg1NTE1LCAweDRCMjMsIDB4NTUxNiwgMHgwNDY2LAotICAgIDB4NTUyNywgMHg0QjI0LCAweDU1MkEsIDB4NEIyNSwgMHg1NTJCLCAweDM4MzUsIDB4NTUyRSwgMHgxMTI3LAotICAgIDB4NTUyRiwgMHgwRjBELCAweDU1MzEsIDB4MDk4RiwgMHg1NTMzLCAweDExMkQsIDB4NTUzNSwgMHgzODM2LAotICAgIDB4NTUzNiwgMHg0QjI2LCAweDU1MzgsIDB4MTEyQywgMHg1NTM5LCAweDExMjMsIDB4NTUzQywgMHg0M0Q3LAotICAgIDB4NTUzRSwgMHgwQjIzLCAweDU1NDAsIDB4MTEyNCwgMHg1NTQxLCAweDQzRDgsIDB4NTU0NCwgMHgwQjRGLAotICAgIDB4NTU0NSwgMHgxMTI5LCAweDU1NDYsIDB4MDk4RSwgMHg1NTQ3LCAweDQzREEsIDB4NTU0QSwgMHgzODM3LAotICAgIDB4NTU0QywgMHgxMTI2LCAweDU1NEYsIDB4MEVGMCwgMHg1NTUwLCAweDQxQTYsIDB4NTU1MSwgMHg0QjI3LAotICAgIDB4NTU1MywgMHgwNzEyLCAweDU1NTYsIDB4MTEyQSwgMHg1NTU3LCAweDExMkIsIDB4NTU1QywgMHgxMTI4LAotICAgIDB4NTU1RCwgMHgxMTJFLCAweDU1NUUsIDB4MUREMSwgMHg1NTYwLCAweDM4MzgsIDB4NTU2MSwgMHg0RjU0LAotICAgIDB4NTU2MywgMHgxMTI1LCAweDU1NjQsIDB4NDNEQywgMHg1NTY2LCAweDRCMjgsIDB4NTU3QiwgMHgxMTM0LAotICAgIDB4NTU3QywgMHgxMTM5LCAweDU1N0QsIDB4NDNERSwgMHg1NTdFLCAweDExMzUsIDB4NTU4MCwgMHgxMTMwLAotICAgIDB4NTU4MSwgMHg0MUE3LCAweDU1ODIsIDB4NDNERiwgMHg1NTgzLCAweDExM0EsIDB4NTU4NCwgMHgwQUIzLAotICAgIDB4NTU4NiwgMHgyMERGLCAweDU1ODcsIDB4MTEzQywgMHg1NTg4LCAweDM4M0EsIDB4NTU4OSwgMHgwN0I0LAotICAgIDB4NTU4QSwgMHgxMTMyLCAweDU1OEIsIDB4MEJCQiwgMHg1NThFLCAweDM4M0IsIDB4NTU4RiwgMHg0QjI5LAotICAgIDB4NTU5MSwgMHg0M0UwLCAweDU1OTIsIDB4NEIyQSwgMHg1NTk0LCAweDRCMkIsIDB4NTU5OCwgMHgxMTM2LAotICAgIDB4NTU5OSwgMHgxMTJGLCAweDU1OUEsIDB4MDVFOSwgMHg1NTlDLCAweDA2MkEsIDB4NTU5RCwgMHgwNUMzLAotICAgIDB4NTU5RSwgMHgxMTM3LCAweDU1OUYsIDB4MTEzMywgMHg1NUE0LCAweDRCMkMsIDB4NTVBNywgMHgwNzRDLAotICAgIDB4NTVBOCwgMHgxMTNELCAweDU1QTksIDB4MTEzQiwgMHg1NUFBLCAweDBBRDUsIDB4NTVBQiwgMHgwNjY0LAotICAgIDB4NTVBQywgMHgwNkE0LCAweDU1QUQsIDB4NDFBOCwgMHg1NUFFLCAweDExMzgsIDB4NTVCMCwgMHgwNkVDLAotICAgIDB4NTVCMiwgMHg0QjJELCAweDU1QjYsIDB4MDRFNiwgMHg1NUJGLCAweDQzRTUsIDB4NTVDMywgMHg0QjJFLAotICAgIDB4NTVDNCwgMHgxMTQxLCAweDU1QzUsIDB4MTEzRiwgMHg1NUM2LCAweDRCMkYsIDB4NTVDNywgMHgxMTc4LAotICAgIDB4NTVDOSwgMHg0M0U2LCAweDU1Q0MsIDB4NDNFNywgMHg1NUNFLCAweDQxQTksIDB4NTVEMSwgMHg0M0U4LAotICAgIDB4NTVEMiwgMHg0M0UyLCAweDU1RDMsIDB4NEIzMCwgMHg1NUQ0LCAweDExNDQsIDB4NTVEQSwgMHgxMTNFLAotICAgIDB4NTVEQiwgMHg0QjMxLCAweDU1REMsIDB4MTE0MiwgMHg1NURELCAweDQzRTksIDB4NTVERiwgMHgxMTQwLAotICAgIDB4NTVFMiwgMHg0M0VCLCAweDU1RTMsIDB4MDg5QSwgMHg1NUU0LCAweDExNDMsIDB4NTVFOSwgMHg0M0VELAotICAgIDB4NTVFQywgMHg0QjMyLCAweDU1RUUsIDB4NEIzMywgMHg1NUYxLCAweDRCMzQsIDB4NTVGNiwgMHg0QjM1LAotICAgIDB4NTVGNywgMHgxMTQ2LCAweDU1RjgsIDB4NEIzNiwgMHg1NUY5LCAweDExNEIsIDB4NTVGRCwgMHgxMTQ5LAotICAgIDB4NTVGRSwgMHgxMTQ4LCAweDU2MDUsIDB4NEIzNywgMHg1NjA2LCAweDBCNzAsIDB4NTYwNywgMHg0M0YwLAotICAgIDB4NTYwOCwgMHgzODNDLCAweDU2MDksIDB4MDU0NSwgMHg1NjBELCAweDRCMzgsIDB4NTYwRSwgMHgzODNELAotICAgIDB4NTYwRiwgMHgzODNFLCAweDU2MTAsIDB4NDNGMSwgMHg1NjExLCAweDRCMzksIDB4NTYxMiwgMHg0QjNBLAotICAgIDB4NTYxNCwgMHgxMTQ1LCAweDU2MTYsIDB4MTE0NywgMHg1NjE3LCAweDA5OTAsIDB4NTYxOCwgMHgwNEQ1LAotICAgIDB4NTYxQiwgMHgxMTRBLCAweDU2MjAsIDB4M0MxRCwgMHg1NjI4LCAweDQzRUUsIDB4NTYyOSwgMHgwNTVFLAotICAgIDB4NTYyQywgMHg0QjNCLCAweDU2MkYsIDB4MTE1NSwgMHg1NjMwLCAweDQzRjIsIDB4NTYzMSwgMHgwOUU0LAotICAgIDB4NTYzMiwgMHgxMTUxLCAweDU2MzQsIDB4MTE0RiwgMHg1NjM1LCAweDRCM0MsIDB4NTYzNiwgMHgxMTUwLAotICAgIDB4NTYzNywgMHgzODNGLCAweDU2MzgsIDB4MTE1MiwgMHg1NjM5LCAweDRCM0QsIDB4NTYzQiwgMHg0MUFBLAotICAgIDB4NTYzRCwgMHg0M0Y0LCAweDU2M0YsIDB4Mzg0MCwgMHg1NjQwLCAweDQzRjUsIDB4NTY0MiwgMHgwNERGLAotICAgIDB4NTY0NywgMHg0M0Y2LCAweDU2NDksIDB4Mzg0MSwgMHg1NjRCLCAweDM4NDIsIDB4NTY0QywgMHgwQUJCLAotICAgIDB4NTY0RCwgMHg0QjNFLCAweDU2NEUsIDB4MTE0QywgMHg1NjRGLCAweDM4NDMsIDB4NTY1MCwgMHgxMTRELAotICAgIDB4NTY1MywgMHgxRjFCLCAweDU2NTQsIDB4NEIzRiwgMHg1NjVCLCAweDA1RDgsIDB4NTY1RSwgMHg0M0Y3LAotICAgIDB4NTY2MCwgMHg0M0Y4LCAweDU2NjQsIDB4MTE1NCwgMHg1NjY2LCAweDM4NDQsIDB4NTY2OCwgMHgwNjJCLAotICAgIDB4NTY2OSwgMHgzODQ1LCAweDU2NkEsIDB4MTE1NywgMHg1NjZCLCAweDExNTMsIDB4NTY2QywgMHgxMTU2LAotICAgIDB4NTY2RCwgMHg0M0Y5LCAweDU2NkYsIDB4Mzg0NiwgMHg1NjcxLCAweDM4NDcsIDB4NTY3MiwgMHgzODQ4LAotICAgIDB4NTY3NCwgMHgwREZFLCAweDU2NzYsIDB4M0MzMywgMHg1Njc4LCAweDBDQUQsIDB4NTY3QSwgMHgwRDRDLAotICAgIDB4NTY4MCwgMHgxMTU5LCAweDU2ODUsIDB4NEI0MCwgMHg1Njg2LCAweDExNTgsIDB4NTY4NywgMHgwNUEzLAotICAgIDB4NTY4OCwgMHg0M0ZCLCAweDU2OEEsIDB4MTE1QSwgMHg1NjhDLCAweDQzRkMsIDB4NTY4RiwgMHgxMTVELAotICAgIDB4NTY5NCwgMHgxMTVDLCAweDU2OTUsIDB4Mzg0OSwgMHg1Njk5LCAweDFERTYsIDB4NTY5QSwgMHgzODRBLAotICAgIDB4NTY5RCwgMHg0M0ZELCAweDU2OUUsIDB4NDFBQiwgMHg1NjlGLCAweDRCNDEsIDB4NTZBMCwgMHgxMTVCLAotICAgIDB4NTZBMiwgMHgwQ0VGLCAweDU2QTUsIDB4MTE1RSwgMHg1NkE2LCAweDRCNDIsIDB4NTZBOCwgMHg0M0ZFLAotICAgIDB4NTZBOSwgMHg0MUFDLCAweDU2QUMsIDB4Mzg0QiwgMHg1NkFELCAweDM4NEMsIDB4NTZBRSwgMHgxMTVGLAotICAgIDB4NTZCMSwgMHgzODRELCAweDU2QjIsIDB4NDNGRiwgMHg1NkIzLCAweDQxQUQsIDB4NTZCNCwgMHgxMTYxLAotICAgIDB4NTZCNiwgMHgxMTYwLCAweDU2QjcsIDB4NEI0MywgMHg1NkJDLCAweDExNjMsIDB4NTZDMCwgMHgxMTY2LAotICAgIDB4NTZDMSwgMHgxMTY0LCAweDU2QzIsIDB4MTE2MiwgMHg1NkMzLCAweDExNjUsIDB4NTZDNSwgMHg0NDAwLAotICAgIDB4NTZDOCwgMHgxMTY3LCAweDU2QzksIDB4Mzg0RSwgMHg1NkNBLCAweDFFNUEsIDB4NTZDQywgMHg0QjQ0LAotICAgIDB4NTZDRCwgMHg0NDAxLCAweDU2Q0UsIDB4MTE2OCwgMHg1NkNGLCAweDRCNDUsIDB4NTZEMSwgMHgxMTY5LAotICAgIDB4NTZEMywgMHgxMTZBLCAweDU2RDcsIDB4MTE2QiwgMHg1NkQ4LCAweDEwN0MsIDB4NTZEOSwgMHg0QjQ2LAotICAgIDB4NTZEQSwgMHgwOTI4LCAweDU2REIsIDB4MDg5QiwgMHg1NkRELCAweDM4NEYsIDB4NTZERSwgMHgwNTczLAotICAgIDB4NTZERiwgMHg0NDAyLCAweDU2RTAsIDB4MDRCQywgMHg1NkUxLCAweDRCNDcsIDB4NTZFMywgMHgwQjgyLAotICAgIDB4NTZFNCwgMHgzODUwLCAweDU2RTgsIDB4NDQwMywgMHg1NkVCLCAweDRCNDgsIDB4NTZFRCwgMHg0QjQ5LAotICAgIDB4NTZFRSwgMHgxMTZDLCAweDU2RjAsIDB4MDgxNCwgMHg1NkYxLCAweDRCNEEsIDB4NTZGMiwgMHgwNDkzLAotICAgIDB4NTZGMywgMHgwQTI0LCAweDU2RjYsIDB4NDQwNCwgMHg1NkY3LCAweDQ0MDUsIDB4NTZGOSwgMHgxMTZELAotICAgIDB4NTZGQSwgMHgwNzdCLCAweDU2RkQsIDB4MDgwMywgMHg1NkZGLCAweDExNkYsIDB4NTcwMCwgMHgxMTZFLAotICAgIDB4NTcwMywgMHgwRTMwLCAweDU3MDQsIDB4MTE3MCwgMHg1NzA3LCAweDRCNEIsIDB4NTcwOCwgMHgxMTcyLAotICAgIDB4NTcwOSwgMHgxMTcxLCAweDU3MEEsIDB4Mzg1MSwgMHg1NzBCLCAweDExNzMsIDB4NTcwQywgMHg0QjRDLAotICAgIDB4NTcwRCwgMHgxMTc0LCAweDU3MEYsIDB4MDc0RCwgMHg1NzEyLCAweDA1MDIsIDB4NTcxMywgMHgxMTc1LAotICAgIDB4NTcxNSwgMHgzODUyLCAweDU3MTYsIDB4MTE3NywgMHg1NzE4LCAweDExNzYsIDB4NTcxQSwgMHg0QjRELAotICAgIDB4NTcxQiwgMHg0QjRFLCAweDU3MUMsIDB4MTE3OSwgMHg1NzFELCAweDRCNEYsIDB4NTcxRiwgMHgwQzU0LAotICAgIDB4NTcyMSwgMHgzNjgwLCAweDU3MjMsIDB4Mzg1MywgMHg1NzI2LCAweDExN0EsIDB4NTcyNywgMHgwNDc5LAotICAgIDB4NTcyOCwgMHgwODRGLCAweDU3MjksIDB4NDQwOCwgMHg1NzJDLCAweDRCNTAsIDB4NTcyRCwgMHgwNzEzLAotICAgIDB4NTcyRSwgMHg0QjUxLCAweDU3MkYsIDB4Mzg1NCwgMHg1NzMwLCAweDBCOEQsIDB4NTczMywgMHgzODU1LAotICAgIDB4NTczNCwgMHgzODU2LCAweDU3MzcsIDB4MTE3QiwgMHg1NzM4LCAweDExN0MsIDB4NTczQiwgMHgxMTdFLAotICAgIDB4NTczRCwgMHg0QjUyLCAweDU3M0UsIDB4NEI1MywgMHg1NzQwLCAweDExN0YsIDB4NTc0MiwgMHgwODU0LAotICAgIDB4NTc0NSwgMHg0NDBBLCAweDU3NDYsIDB4NDQwQiwgMHg1NzQ3LCAweDA2QzksIDB4NTc0QSwgMHgwRTY1LAotICAgIDB4NTc0QywgMHgzODU3LCAweDU3NEQsIDB4NDQwQywgMHg1NzRFLCAweDExN0QsIDB4NTc0RiwgMHgxMTgwLAotICAgIDB4NTc1MCwgMHgwODMxLCAweDU3NTEsIDB4MDdCNSwgMHg1NzU5LCAweDIwRTAsIDB4NTc1RiwgMHg0QjU0LAotICAgIDB4NTc2MSwgMHgxMTg0LCAweDU3NjQsIDB4MDgxNSwgMHg1NzY1LCAweDIwRTEsIDB4NTc2NiwgMHgwQjcxLAotICAgIDB4NTc2OCwgMHg0NDBFLCAweDU3NjksIDB4MTE4MSwgMHg1NzZBLCAweDBCRjYsIDB4NTc2QiwgMHg0QjU1LAotICAgIDB4NTc2RCwgMHg0QjU2LCAweDU3NkYsIDB4NDQwRiwgMHg1NzcwLCAweDM4NTgsIDB4NTc3MywgMHg0NDEwLAotICAgIDB4NTc3NCwgMHg0NDExLCAweDU3NzUsIDB4NDQxMiwgMHg1Nzc3LCAweDQxQUUsIDB4NTc3QSwgMHg0QjU3LAotICAgIDB4NTc3QiwgMHg0NDEzLCAweDU3N0MsIDB4NDFBRiwgMHg1NzdGLCAweDExODUsIDB4NTc4MiwgMHgwQTI4LAotICAgIDB4NTc4MywgMHg0QjU4LCAweDU3ODgsIDB4MTE4MywgMHg1Nzg5LCAweDExODYsIDB4NTc4QiwgMHgwNzE1LAotICAgIDB4NTc4QywgMHgzODU5LCAweDU3OTMsIDB4MTE4NywgMHg1Nzk3LCAweDRCNTksIDB4NTc5QSwgMHg0NDE2LAotICAgIDB4NTc5QywgMHgzODVBLCAweDU3OUQsIDB4NDQxNywgMHg1NzlFLCAweDQ0MTgsIDB4NTdBMCwgMHgxMTg4LAotICAgIDB4NTdBMiwgMHgwN0I2LCAweDU3QTMsIDB4MDU5RSwgMHg1N0E0LCAweDExOEEsIDB4NTdBOCwgMHg0NDE5LAotICAgIDB4NTdBQSwgMHgxMThCLCAweDU3QUMsIDB4MjBFMiwgMHg1N0FFLCAweDRCNUEsIDB4NTdCMCwgMHgxMThDLAotICAgIDB4NTdCMywgMHgxMTg5LCAweDU3QjgsIDB4Mzg1QiwgMHg1N0MwLCAweDExODIsIDB4NTdDMywgMHgxMThELAotICAgIDB4NTdDNiwgMHgxMThFLCAweDU3QzcsIDB4MjBFNCwgMHg1N0M4LCAweDIwRTMsIDB4NTdDQiwgMHgwRTkyLAotICAgIDB4NTdDQywgMHg0NDFDLCAweDU3Q0UsIDB4MDlEMywgMHg1N0NGLCAweDQxQjEsIDB4NTdEMiwgMHgxMTkwLAotICAgIDB4NTdEMywgMHgxMTkxLCAweDU3RDQsIDB4MTE4RiwgMHg1N0Q1LCAweDRCNUIsIDB4NTdENiwgMHgxMTkzLAotICAgIDB4NTdENywgMHg0NDFBLCAweDU3REMsIDB4MENFRSwgMHg1N0RFLCAweDQ0MUYsIDB4NTdERiwgMHgwNEFDLAotICAgIDB4NTdFMCwgMHgwREM4LCAweDU3RTMsIDB4MTE5NCwgMHg1N0U0LCAweDQxQjIsIDB4NTdFNiwgMHgzODVDLAotICAgIDB4NTdFNywgMHg0QjVDLCAweDU3RUQsIDB4Mzg1RCwgMHg1N0YwLCAweDQ0MjAsIDB4NTdGNCwgMHgwOUU1LAotICAgIDB4NTdGNSwgMHgzODVFLCAweDU3RjYsIDB4Mzg1RiwgMHg1N0Y3LCAweDA4RTUsIDB4NTdGOCwgMHg0NDIyLAotICAgIDB4NTdGOSwgMHgwRDEzLCAweDU3RkEsIDB4MDYyQywgMHg1N0ZCLCAweDQ0MjMsIDB4NTdGQywgMHgwODVCLAotICAgIDB4NTdGRCwgMHg0NDI0LCAweDU3RkYsIDB4Mzg2MCwgMHg1ODAwLCAweDBFODcsIDB4NTgwMiwgMHgwQzhBLAotICAgIDB4NTgwNCwgMHg0NDI1LCAweDU4MDUsIDB4MDc0RSwgMHg1ODA2LCAweDBCMkYsIDB4NTgwOSwgMHgzODYxLAotICAgIDB4NTgwQSwgMHgxMTkyLCAweDU4MEIsIDB4MTE5NSwgMHg1ODBELCAweDRCNUQsIDB4NTgxNSwgMHgwQjI0LAotICAgIDB4NTgxOSwgMHgxMTk2LCAweDU4MUQsIDB4MTE5NywgMHg1ODFFLCAweDQ0MjYsIDB4NTgyMCwgMHgzODYyLAotICAgIDB4NTgyMSwgMHgxMTk5LCAweDU4MjQsIDB4MEMwNSwgMHg1ODI2LCAweDRCNUUsIDB4NTgyNywgMHg0NDI3LAotICAgIDB4NTgyQSwgMHgwNUVBLCAweDU4MkYsIDB4MUQzMiwgMHg1ODMwLCAweDA1MDMsIDB4NTgzMSwgMHgwRTQzLAotICAgIDB4NTgzMiwgMHgzODYzLCAweDU4MzQsIDB4MDlENCwgMHg1ODM1LCAweDBDNDIsIDB4NTgzOSwgMHg0NDI4LAotICAgIDB4NTgzQSwgMHgwODU2LCAweDU4M0QsIDB4MTE5RiwgMHg1ODQwLCAweDBFMEQsIDB4NTg0MSwgMHgwRkE1LAotICAgIDB4NTg0OSwgMHg0NDJBLCAweDU4NEEsIDB4MDU3NCwgMHg1ODRCLCAweDExOUIsIDB4NTg0QywgMHg0NDJCLAotICAgIDB4NTg0RCwgMHg0QjVGLCAweDU4NEYsIDB4NEI2MCwgMHg1ODUxLCAweDBBQkMsIDB4NTg1MiwgMHgxMTlFLAotICAgIDB4NTg1NCwgMHgwQzVELCAweDU4NTcsIDB4MEM0MywgMHg1ODU4LCAweDBDNUUsIDB4NTg1OSwgMHgwRDRELAotICAgIDB4NTg1QSwgMHgwQkU5LCAweDU4NUUsIDB4MDgzOSwgMHg1ODVGLCAweDRCNjEsIDB4NTg2MSwgMHgxRTQ3LAotICAgIDB4NTg2MiwgMHgxMTlBLCAweDU4NjQsIDB4NDFCMywgMHg1ODY3LCAweDQ0MkMsIDB4NTg2OSwgMHgwNTE4LAotICAgIDB4NTg2QiwgMHgwQzMwLCAweDU4NkQsIDB4NEI2MiwgMHg1ODcwLCAweDExOUMsIDB4NTg3MiwgMHgxMTk4LAotICAgIDB4NTg3NSwgMHgwQTE2LCAweDU4NzksIDB4MTFBMCwgMHg1ODdDLCAweDM4NjQsIDB4NTg3RSwgMHgwOTU4LAotICAgIDB4NTg3RiwgMHg0QjYzLCAweDU4ODAsIDB4Mzg2NSwgMHg1ODgxLCAweDRCNjQsIDB4NTg4MywgMHgwNkE1LAotICAgIDB4NTg4NSwgMHgxMUExLCAweDU4ODksIDB4NDFCNCwgMHg1ODhBLCAweDQ0MkQsIDB4NTg4QiwgMHg0NDJFLAotICAgIDB4NTg4RCwgMHg0NDJGLCAweDU4OEYsIDB4NDQzMCwgMHg1ODkwLCAweDQ0MzEsIDB4NTg5MywgMHgwRTM4LAotICAgIDB4NTg5NCwgMHg0NDMyLCAweDU4OTcsIDB4MEFGRiwgMHg1ODk4LCAweDRCNjUsIDB4NTg5QywgMHgwQkUyLAotICAgIDB4NTg5RCwgMHg0NDMzLCAweDU4OUUsIDB4MjBFNywgMHg1ODlGLCAweDExQTMsIDB4NThBOCwgMHgwRTdELAotICAgIDB4NThBOSwgMHgzODY2LCAweDU4QUEsIDB4NDQzNCwgMHg1OEFCLCAweDExQTQsIDB4NThBRSwgMHgxMUE5LAotICAgIDB4NThCMSwgMHg0NDM1LCAweDU4QjIsIDB4MjBFOCwgMHg1OEIzLCAweDBERkYsIDB4NThCOCwgMHgxMUE4LAotICAgIDB4NThCOSwgMHgxMUEyLCAweDU4QkEsIDB4MTFBNSwgMHg1OEJCLCAweDExQTcsIDB4NThCQywgMHg0QjY2LAotICAgIDB4NThCRSwgMHgwODE2LCAweDU4QzEsIDB4MEUxOSwgMHg1OEMzLCAweDQ0MzcsIDB4NThDNSwgMHgxMUFBLAotICAgIDB4NThDNywgMHgwQjgzLCAweDU4Q0EsIDB4MDU3NSwgMHg1OENDLCAweDA5RDUsIDB4NThDRCwgMHg0NDM4LAotICAgIDB4NThDRSwgMHgzODY3LCAweDU4RDAsIDB4Mzg2OCwgMHg1OEQxLCAweDExQUMsIDB4NThEMiwgMHg0MUI2LAotICAgIDB4NThEMywgMHgxMUFCLCAweDU4RDQsIDB4Mzg2OSwgMHg1OEQ1LCAweDA3RkEsIDB4NThENywgMHgxMUFELAotICAgIDB4NThEOCwgMHgxMUFGLCAweDU4RDksIDB4MTFBRSwgMHg1OERBLCAweDM4NkEsIDB4NThEQywgMHgxMUIxLAotICAgIDB4NThERSwgMHgxMUE2LCAweDU4REYsIDB4MTFCMywgMHg1OEUwLCAweDQxQjcsIDB4NThFMiwgMHg0NDM5LAotICAgIDB4NThFNCwgMHgxMUIyLCAweDU4RTUsIDB4MTFCMCwgMHg1OEU5LCAweDM4NkIsIDB4NThFQiwgMHgwODlDLAotICAgIDB4NThFQywgMHgwQTE3LCAweDU4RUUsIDB4MEFENiwgMHg1OEVGLCAweDExQjQsIDB4NThGMCwgMHgwQTYwLAotICAgIDB4NThGMSwgMHgwNEIxLCAweDU4RjIsIDB4MEQxQSwgMHg1OEYzLCAweDQ0M0EsIDB4NThGNCwgMHg0NDNCLAotICAgIDB4NThGNywgMHgwQkY3LCAweDU4RjksIDB4MTFCNiwgMHg1OEZBLCAweDExQjUsIDB4NThGQiwgMHgxMUI3LAotICAgIDB4NThGQywgMHgxMUI4LCAweDU4RkQsIDB4MTFCOSwgMHg1OTAyLCAweDExQkEsIDB4NTkwNSwgMHg0NDNDLAotICAgIDB4NTkwNiwgMHg0NDNELCAweDU5MDksIDB4MEUyMSwgMHg1OTBBLCAweDExQkIsIDB4NTkwQiwgMHgyMEU5LAotICAgIDB4NTkwQywgMHgzODZDLCAweDU5MEQsIDB4NDQzRSwgMHg1OTBGLCAweDA1NDYsIDB4NTkxMCwgMHgxMUJDLAotICAgIDB4NTkxNCwgMHg0NDNGLCAweDU5MTUsIDB4MEYyNiwgMHg1OTE2LCAweDA1OEUsIDB4NTkxOCwgMHgxMERFLAotICAgIDB4NTkxOSwgMHgwOTUyLCAweDU5MUEsIDB4MEIxRiwgMHg1OTFCLCAweDExQkQsIDB4NTkxQywgMHgwRUY3LAotICAgIDB4NTkxRiwgMHg0QjY3LCAweDU5MjIsIDB4MEVDMCwgMHg1OTIzLCAweDRCNjgsIDB4NTkyNCwgMHgzODZELAotICAgIDB4NTkyNSwgMHgxMUJGLCAweDU5MjcsIDB4MEI0NywgMHg1OTI5LCAweDBDMzEsIDB4NTkyQSwgMHgwQjIwLAotICAgIDB4NTkyQiwgMHgwREM5LCAweDU5MkMsIDB4MTFDMCwgMHg1OTJELCAweDExQzEsIDB4NTkyRSwgMHgwNTFELAotICAgIDB4NTkyRiwgMHgzODZFLCAweDU5MzEsIDB4MDhFNiwgMHg1OTMyLCAweDExQzIsIDB4NTkzNywgMHgwNDk0LAotICAgIDB4NTkzOCwgMHgxMUMzLCAweDU5MzksIDB4MzcyNSwgMHg1OTNELCAweDQ0NDIsIDB4NTkzRSwgMHgxMUM0LAotICAgIDB4NTk0NCwgMHgwNTA0LCAweDU5NDYsIDB4NDQ0NCwgMHg1OTQ3LCAweDA2MkQsIDB4NTk0OCwgMHgwQ0I4LAotICAgIDB4NTk0OSwgMHgwRTQ0LCAweDU5NEUsIDB4MTFDOCwgMHg1OTRGLCAweDBBRDcsIDB4NTk1MCwgMHgxMUM3LAotICAgIDB4NTk1MSwgMHgwNzE2LCAweDU5NTMsIDB4MjBFQSwgMHg1OTU0LCAweDBFODksIDB4NTk1NSwgMHgxMUM2LAotICAgIDB4NTk1NywgMHgwQzVGLCAweDU5NTgsIDB4MTFDQSwgMHg1OTU5LCAweDRCNjksIDB4NTk1QSwgMHgxMUM5LAotICAgIDB4NTk1QiwgMHgyMEVCLCAweDU5NUQsIDB4MjBFQywgMHg1OTVGLCAweDQ0NDcsIDB4NTk2MCwgMHgxMUNDLAotICAgIDB4NTk2MSwgMHgzODZGLCAweDU5NjIsIDB4MTFDQiwgMHg1OTYzLCAweDIwRUQsIDB4NTk2NSwgMHgwNTFFLAotICAgIDB4NTk2NywgMHgxMUNELCAweDU5NjgsIDB4MDk5MSwgMHg1OTY5LCAweDExQ0YsIDB4NTk2QSwgMHgwQjYzLAotICAgIDB4NTk2QywgMHgxMUNFLCAweDU5NkQsIDB4Mzg3MCwgMHg1OTZFLCAweDBFMDMsIDB4NTk3MywgMHgwOTgxLAotICAgIDB4NTk3NCwgMHgwQzU1LCAweDU5NzUsIDB4NDQ0OSwgMHg1OTc2LCAweDQ0NEEsIDB4NTk3OCwgMHgxMUQwLAotICAgIDB4NTk3OSwgMHg0QjZBLCAweDU5N0MsIDB4NDQ0QiwgMHg1OTdELCAweDA3QjcsIDB4NTk4MSwgMHgxMUQxLAotICAgIDB4NTk4MiwgMHgwQ0Q3LCAweDU5ODMsIDB4MEQ3MiwgMHg1OTg0LCAweDBFREQsIDB4NTk4QSwgMHgwQ0RCLAotICAgIDB4NTk4QiwgMHg0MUI5LCAweDU5OEQsIDB4MTFEQSwgMHg1OTkyLCAweDQxQkEsIDB4NTk5MywgMHgwNjUyLAotICAgIDB4NTk5NiwgMHgwRjJGLCAweDU5OTcsIDB4NEI2QiwgMHg1OTk5LCAweDBFQkIsIDB4NTk5QiwgMHgxMjM5LAotICAgIDB4NTk5RCwgMHgxMUQyLCAweDU5OUYsIDB4NDQ0QywgMHg1OUEzLCAweDExRDUsIDB4NTlBNCwgMHgyMEVFLAotICAgIDB4NTlBNSwgMHgwQjI1LCAweDU5QTgsIDB4MEU2NiwgMHg1OUFDLCAweDBDNDQsIDB4NTlBRSwgMHg0NDRELAotICAgIDB4NTlBRiwgMHg0QjZDLCAweDU5QjIsIDB4MTFENiwgMHg1OUIzLCAweDRCNkQsIDB4NTlCOSwgMHgwRTkzLAotICAgIDB4NTlCQSwgMHgyMEVGLCAweDU5QkIsIDB4MDgzQSwgMHg1OUJDLCAweDQ0NEUsIDB4NTlCRSwgMHgwOTkyLAotICAgIDB4NTlDMywgMHg0MUJCLCAweDU5QzYsIDB4MTFENywgMHg1OUM4LCAweDQ0NEYsIDB4NTlDOSwgMHgwODlFLAotICAgIDB4NTlDQSwgMHgzODcxLCAweDU5Q0IsIDB4MDg5RCwgMHg1OUNELCAweDQ0NTAsIDB4NTlEMCwgMHgwNDdELAotICAgIDB4NTlEMSwgMHgwNzdDLCAweDU5RDIsIDB4Mzg3MiwgMHg1OUQzLCAweDBBNEYsIDB4NTlENCwgMHgwNDk1LAotICAgIDB4NTlEOSwgMHgxMURCLCAweDU5REEsIDB4MTFEQywgMHg1OURDLCAweDExRDksIDB4NTlERCwgMHgzODczLAotICAgIDB4NTlERSwgMHg0NDUxLCAweDU5REYsIDB4NEI2RSwgMHg1OUUzLCAweDM4NzQsIDB4NTlFNCwgMHgzODc1LAotICAgIDB4NTlFNSwgMHgwNERBLCAweDU5RTYsIDB4MDVFQiwgMHg1OUU3LCAweDQ0NTIsIDB4NTlFOCwgMHgxMUQ4LAotICAgIDB4NTlFQSwgMHgwRUQxLCAweDU5RUIsIDB4MERBMywgMHg1OUVDLCAweDM2QUQsIDB4NTlFRSwgMHg0NDUzLAotICAgIDB4NTlGMSwgMHg0QjZGLCAweDU5RjYsIDB4MDQ2QywgMHg1OUY4LCAweDRCNzAsIDB4NTlGQiwgMHgwNEJELAotICAgIDB4NTlGRiwgMHgwODlGLCAweDVBMDEsIDB4MDQ5NiwgMHg1QTAzLCAweDA0NjcsIDB4NUEwNCwgMHgzODc2LAotICAgIDB4NUEwOSwgMHgxMUUxLCAweDVBMEMsIDB4Mzg3NywgMHg1QTBELCAweDQ0NTcsIDB4NUExMSwgMHgxMURGLAotICAgIDB4NUExMywgMHg0MUJDLCAweDVBMTcsIDB4NDQ1OCwgMHg1QTE4LCAweDBFQzgsIDB4NUExQSwgMHgxMUUyLAotICAgIDB4NUExQiwgMHgzNUMxLCAweDVBMUMsIDB4MTFFMCwgMHg1QTFGLCAweDExREUsIDB4NUEyMCwgMHgwOUY3LAotICAgIDB4NUEyMywgMHgzODc4LCAweDVBMjUsIDB4MTFERCwgMHg1QTI3LCAweDQ0NTksIDB4NUEyOSwgMHgwRTJBLAotICAgIDB4NUEyRCwgMHg0NDVBLCAweDVBMkYsIDB4MDc5OCwgMHg1QTM1LCAweDExRTYsIDB4NUEzNiwgMHgxMUU3LAotICAgIDB4NUEzQywgMHgwOTkzLCAweDVBNDAsIDB4MTFFMywgMHg1QTQxLCAweDBGRDIsIDB4NUE0NiwgMHgwRDAyLAotICAgIDB4NUE0NywgMHgzODc5LCAweDVBNDksIDB4MTFFNSwgMHg1QTU1LCAweDM4N0EsIDB4NUE1QSwgMHgwODE3LAotICAgIDB4NUE2MiwgMHgxMUU4LCAweDVBNjMsIDB4Mzg3QiwgMHg1QTY1LCAweDQ0NUIsIDB4NUE2NiwgMHgwRENBLAotICAgIDB4NUE2NywgMHg0MUJELCAweDVBNkEsIDB4MTFFOSwgMHg1QTZDLCAweDExRTQsIDB4NUE2RCwgMHgzODdDLAotICAgIDB4NUE3NywgMHg0MUJFLCAweDVBN0EsIDB4NDQ1QywgMHg1QTdFLCAweDM4N0QsIDB4NUE3RiwgMHgwRUM3LAotICAgIDB4NUE4NCwgMHg0MUJGLCAweDVBOEIsIDB4NDQ1RCwgMHg1QTkyLCAweDBEMTQsIDB4NUE5QSwgMHgxMUVBLAotICAgIDB4NUE5QiwgMHgwREE0LCAweDVBOUMsIDB4NDQ1RSwgMHg1QTlFLCAweDM4N0UsIDB4NUE5RiwgMHg0NDVGLAotICAgIDB4NUFBMCwgMHg0NDYwLCAweDVBQTIsIDB4NDQ2MSwgMHg1QUE3LCAweDM4N0YsIDB4NUFBQywgMHgzODgwLAotICAgIDB4NUFCMSwgMHg0NDYyLCAweDVBQjIsIDB4NEI3MSwgMHg1QUIzLCAweDM4ODEsIDB4NUFCNSwgMHg0NDYzLAotICAgIDB4NUFCOCwgMHg0QjcyLCAweDVBQkEsIDB4NDQ2NCwgMHg1QUJDLCAweDExRUIsIDB4NUFCRCwgMHgxMUVGLAotICAgIDB4NUFCRSwgMHgxMUVDLCAweDVBQkYsIDB4NDQ2NSwgMHg1QUMxLCAweDA1NDcsIDB4NUFDMiwgMHgxMUVFLAotICAgIDB4NUFDNCwgMHg0MUMwLCAweDVBQzksIDB4MDhFNywgMHg1QUNCLCAweDExRUQsIDB4NUFDQywgMHgwNzRGLAotICAgIDB4NUFEMCwgMHgxMUZCLCAweDVBRDYsIDB4MTFGNCwgMHg1QUQ3LCAweDExRjEsIDB4NUFEQSwgMHg0NDY2LAotICAgIDB4NUFEQywgMHg0NDY3LCAweDVBRTAsIDB4Mzg4MiwgMHg1QUUxLCAweDBCQTIsIDB4NUFFMywgMHgxMUYwLAotICAgIDB4NUFFNSwgMHg0NDY4LCAweDVBRTYsIDB4MTFGMiwgMHg1QUU5LCAweDExRjMsIDB4NUFFQSwgMHg0QjczLAotICAgIDB4NUFFRSwgMHg0NDZBLCAweDVBRjAsIDB4NDQ2OSwgMHg1QUY1LCAweDQ0NkIsIDB4NUFGNiwgMHg0Qjc0LAotICAgIDB4NUFGQSwgMHgxMUY1LCAweDVBRkIsIDB4MTFGNiwgMHg1QjAwLCAweDM4ODMsIDB4NUIwOCwgMHg0NDZDLAotICAgIDB4NUIwOSwgMHgwNjJFLCAweDVCMEIsIDB4MTFGOCwgMHg1QjBDLCAweDExRjcsIDB4NUIxNiwgMHgxMUY5LAotICAgIDB4NUIxNywgMHg0NDZELCAweDVCMTksIDB4Mzg4NCwgMHg1QjFCLCAweDRCNzUsIDB4NUIxRCwgMHg0Qjc2LAotICAgIDB4NUIyMSwgMHg0Qjc3LCAweDVCMjIsIDB4MDlENiwgMHg1QjI1LCAweDM4ODUsIDB4NUIyQSwgMHgxMUZDLAotICAgIDB4NUIyQywgMHgwQkY4LCAweDVCMkQsIDB4Mzg4NiwgMHg1QjMwLCAweDA0RTcsIDB4NUIzMiwgMHgxMUZBLAotICAgIDB4NUIzNCwgMHg0NDZFLCAweDVCMzYsIDB4MTFGRCwgMHg1QjM4LCAweDRCNzgsIDB4NUIzRSwgMHgxMUZFLAotICAgIDB4NUI0MCwgMHgxMjAxLCAweDVCNDEsIDB4Mzg4NywgMHg1QjQzLCAweDExRkYsIDB4NUI0NSwgMHgxMjAwLAotICAgIDB4NUI0QywgMHg0NDZGLCAweDVCNTAsIDB4MDhBMCwgMHg1QjUxLCAweDEyMDIsIDB4NUI1MiwgMHg0NDcwLAotICAgIDB4NUI1NCwgMHgwN0I4LCAweDVCNTUsIDB4MTIwMywgMHg1QjU2LCAweDIwRjAsIDB4NUI1NywgMHgwOEM4LAotICAgIDB4NUI1OCwgMHgwQjE4LCAweDVCNUEsIDB4MTIwNCwgMHg1QjVCLCAweDEyMDUsIDB4NUI1QywgMHgwOEE4LAotICAgIDB4NUI1RCwgMHgwN0I5LCAweDVCNUYsIDB4MEVERSwgMHg1QjYzLCAweDA2NDIsIDB4NUI2NCwgMHgwNzdELAotICAgIDB4NUI2NSwgMHgxMjA2LCAweDVCNjYsIDB4MDVCNiwgMHg1QjY4LCAweDQ0NzEsIDB4NUI2OSwgMHgxMjA3LAotICAgIDB4NUI2QiwgMHgwQjE5LCAweDVCNkYsIDB4NDQ3MiwgMHg1QjcwLCAweDEyMDgsIDB4NUI3MSwgMHgxMjMwLAotICAgIDB4NUI3MywgMHgxMjA5LCAweDVCNzUsIDB4MTIwQSwgMHg1Qjc2LCAweDM3MjgsIDB4NUI3OCwgMHgxMjBCLAotICAgIDB4NUI3QSwgMHgxMjBELCAweDVCN0MsIDB4Mzg4OCwgMHg1QjdELCAweDQxQzIsIDB4NUI3RSwgMHgzODg5LAotICAgIDB4NUI3RiwgMHgzODhBLCAweDVCODAsIDB4MTIwRSwgMHg1QjgxLCAweDQ0NzMsIDB4NUI4MiwgMHgzNjEwLAotICAgIDB4NUI4MywgMHgxMjBGLCAweDVCODQsIDB4NDQ3NCwgMHg1Qjg1LCAweDBCNTAsIDB4NUI4NywgMHgwNEM5LAotICAgIDB4NUI4OCwgMHgwOTE1LCAweDVCODksIDB4MDQ4NiwgMHg1QjhBLCAweDM4OEIsIDB4NUI4QiwgMHgwQUQ5LAotICAgIDB4NUI4QywgMHgwNUVDLCAweDVCOEQsIDB4MDhFMSwgMHg1QjhGLCAweDA3QkEsIDB4NUI5MywgMHg0MUMzLAotICAgIDB4NUI5NSwgMHgwQzYwLCAweDVCOTYsIDB4NDQ3NiwgMHg1Qjk3LCAweDA5MkIsIDB4NUI5OCwgMHgwNUVELAotICAgIDB4NUI5OSwgMHgwQkE2LCAweDVCOUEsIDB4MEMwNiwgMHg1QjlCLCAweDA0N0MsIDB4NUI5QywgMHgwNjUzLAotICAgIDB4NUI5RCwgMHgwRTQ1LCAweDVCOUYsIDB4MDhFRSwgMHg1QkEyLCAweDA2NkMsIDB4NUJBMywgMHgwQThGLAotICAgIDB4NUJBNCwgMHgwOEU4LCAweDVCQTUsIDB4MEYxMiwgMHg1QkE2LCAweDEyMTAsIDB4NUJBQywgMHg0NDc3LAotICAgIDB4NUJBRSwgMHgwNjc2LCAweDVCQjAsIDB4MDgzQiwgMHg1QkIzLCAweDA1OTAsIDB4NUJCNCwgMHgwNTA1LAotICAgIDB4NUJCNSwgMHgwOTk0LCAweDVCQjYsIDB4MDU0OCwgMHg1QkI3LCAweDRCNzksIDB4NUJCOCwgMHgxMjExLAotICAgIDB4NUJCOSwgMHgwRjMwLCAweDVCQkYsIDB4MDk1MywgMHg1QkMwLCAweDIwRjEsIDB4NUJDMiwgMHgwOTEwLAotICAgIDB4NUJDMywgMHgxMjEyLCAweDVCQzQsIDB4MDYyRiwgMHg1QkM1LCAweDBDQUEsIDB4NUJDNiwgMHgwRUI1LAotICAgIDB4NUJDNywgMHgxMjEzLCAweDVCQzksIDB4MTIxNCwgMHg1QkNDLCAweDBEQ0IsIDB4NUJDRSwgMHg0NDdBLAotICAgIDB4NUJEMCwgMHgxMjE2LCAweDVCRDIsIDB4MDVFNCwgMHg1QkQzLCAweDA2RUYsIDB4NUJENCwgMHgxMjE1LAotICAgIDB4NUJENiwgMHg0NDdCLCAweDVCRDcsIDB4NEI3QSwgMHg1QkQ4LCAweDIwRjMsIDB4NUJEQiwgMHgwNUVFLAotICAgIDB4NUJERCwgMHgwOUY4LCAweDVCREUsIDB4MTIxQSwgMHg1QkRGLCAweDA4NkYsIDB4NUJFMCwgMHg0QjdCLAotICAgIDB4NUJFMSwgMHgwNTQ5LCAweDVCRTIsIDB4MTIxOSwgMHg1QkU0LCAweDEyMTcsIDB4NUJFNSwgMHgxMjFCLAotICAgIDB4NUJFNiwgMHgxMjE4LCAweDVCRTcsIDB4MENFMSwgMHg1QkU4LCAweDE0OEUsIDB4NUJFOSwgMHgwOUY5LAotICAgIDB4NUJFQiwgMHgxMjFDLCAweDVCRUMsIDB4NEY0RSwgMHg1QkVFLCAweDBGODgsIDB4NUJGMCwgMHgxMjFELAotICAgIDB4NUJGMSwgMHg0NDdFLCAweDVCRjMsIDB4MTIxRiwgMHg1QkY1LCAweDBCQkMsIDB4NUJGNiwgMHgxMjFFLAotICAgIDB4NUJGOCwgMHgwQTQ3LCAweDVCRkEsIDB4MDhDOSwgMHg1QkZELCAweDQ0N0YsIDB4NUJGRSwgMHgwQjMwLAotICAgIDB4NUJGRiwgMHgwOTIzLCAweDVDMDEsIDB4MERFNywgMHg1QzAyLCAweDBBOTAsIDB4NUMwMywgMHg0NDgxLAotICAgIDB4NUMwNCwgMHgwOEY5LCAweDVDMDUsIDB4MTIyMCwgMHg1QzA2LCAweDA5OTUsIDB4NUMwNywgMHgxMjIxLAotICAgIDB4NUMwOCwgMHgxMjIyLCAweDVDMDksIDB4MDQ5NywgMHg1QzBBLCAweDBCMUEsIDB4NUMwQiwgMHgwQTE4LAotICAgIDB4NUMwRCwgMHgxMjIzLCAweDVDMEUsIDB4MEM4QiwgMHg1QzBGLCAweDA5OTYsIDB4NUMxMSwgMHgwOTk3LAotICAgIDB4NUMxMiwgMHg0MUM0LCAweDVDMTMsIDB4MTIyNCwgMHg1QzE0LCAweDM3MkEsIDB4NUMxNiwgMHgwQTkxLAotICAgIDB4NUMxOSwgMHgzNjBCLCAweDVDMUEsIDB4MDk5OCwgMHg1QzFFLCAweDIwRjUsIDB4NUMxRiwgMHg0QjdDLAotICAgIDB4NUMyMCwgMHgxMjI1LCAweDVDMjIsIDB4MTIyNiwgMHg1QzIzLCAweDM4OEMsIDB4NUMyNCwgMHgwRUVDLAotICAgIDB4NUMyOCwgMHgxMjI3LCAweDVDMjksIDB4NDQ4MiwgMHg1QzJBLCAweDRCN0QsIDB4NUMyQiwgMHgzODhELAotICAgIDB4NUMyQywgMHg0QjdFLCAweDVDMkQsIDB4MDZCRSwgMHg1QzMwLCAweDM4OEUsIDB4NUMzMSwgMHgwOTJDLAotICAgIDB4NUMzNiwgMHg0QjdGLCAweDVDMzgsIDB4MTIyOCwgMHg1QzM5LCAweDEyMjksIDB4NUMzQSwgMHgwOTA4LAotICAgIDB4NUMzQiwgMHgwOUYyLCAweDVDM0MsIDB4MENDQywgMHg1QzNELCAweDBBMUEsIDB4NUMzRSwgMHgwRDhDLAotICAgIDB4NUMzRiwgMHgwQ0Q4LCAweDVDNDAsIDB4MDZDMSwgMHg1QzQxLCAweDEyMkEsIDB4NUM0NSwgMHgwNjg5LAotICAgIDB4NUM0NiwgMHgxMjJCLCAweDVDNDgsIDB4MDZGNiwgMHg1QzRBLCAweDBDQTcsIDB4NUM0QiwgMHgwNTMwLAotICAgIDB4NUM0RCwgMHgwOEExLCAweDVDNEUsIDB4MTIyQywgMHg1QzRGLCAweDEyMkYsIDB4NUM1MCwgMHgxMjJFLAotICAgIDB4NUM1MSwgMHgwNkY1LCAweDVDNTMsIDB4MTIyRCwgMHg1QzU1LCAweDBDMzIsIDB4NUM1OSwgMHg0QjgwLAotICAgIDB4NUM1QiwgMHgxRTkyLCAweDVDNUMsIDB4NEI4MSwgMHg1QzVFLCAweDBCMTAsIDB4NUM1RiwgMHg0NDg0LAotICAgIDB4NUM2MCwgMHgwQzQ1LCAweDVDNjEsIDB4MDhGNCwgMHg1QzYyLCAweDFFMEQsIDB4NUM2MywgMHgzODhGLAotICAgIDB4NUM2NCwgMHgwQURBLCAweDVDNjUsIDB4MEY2NCwgMHg1QzY3LCAweDQ0ODUsIDB4NUM2OCwgMHg0NDg2LAotICAgIDB4NUM2OSwgMHgzODkwLCAweDVDNkMsIDB4MTIzMSwgMHg1QzZELCAweDRCODIsIDB4NUM2RSwgMHgxMjMyLAotICAgIDB4NUM2RiwgMHgwQ0FFLCAweDVDNzAsIDB4NDQ4NywgMHg1QzcxLCAweDA4ODEsIDB4NUM3NiwgMHgxMjM0LAotICAgIDB4NUM3OSwgMHgxMjM1LCAweDVDN0EsIDB4NDFDNywgMHg1QzdDLCAweDM4OTEsIDB4NUM4OCwgMHg0NDhDLAotICAgIDB4NUM4QSwgMHg0NDhELCAweDVDOEMsIDB4MTIzNiwgMHg1QzhGLCAweDQxQzgsIDB4NUM5MCwgMHgwNjMwLAotICAgIDB4NUM5MSwgMHgxMjM3LCAweDVDOTQsIDB4MTIzOCwgMHg1QzlGLCAweDQxQzksIDB4NUNBMCwgMHg0NDkxLAotICAgIDB4NUNBMSwgMHgwNTJDLCAweDVDQTIsIDB4NDQ5MiwgMHg1Q0EzLCAweDQxQ0EsIDB4NUNBNiwgMHgyMEY2LAotICAgIDB4NUNBNywgMHg0NDkzLCAweDVDQTgsIDB4MEFCRCwgMHg1Q0E5LCAweDA2MjAsIDB4NUNBQSwgMHg0MUNCLAotICAgIDB4NUNBQiwgMHgxMjNBLCAweDVDQUMsIDB4MEVCNCwgMHg1Q0FELCAweDQ0OTUsIDB4NUNCMSwgMHgwQjMyLAotICAgIDB4NUNCMywgMHgwNUI3LCAweDVDQjUsIDB4NDQ5NiwgMHg1Q0I2LCAweDEyM0MsIDB4NUNCNywgMHgxMjNFLAotICAgIDB4NUNCOCwgMHgwNjFCLCAweDVDQkEsIDB4MjBGNywgMHg1Q0JCLCAweDEyM0IsIDB4NUNCQywgMHgxMjNELAotICAgIDB4NUNCRSwgMHgxMjQwLCAweDVDQzUsIDB4MTIzRiwgMHg1Q0M3LCAweDEyNDEsIDB4NUNDOSwgMHg0NDk4LAotICAgIDB4NUNDQiwgMHgzODkyLCAweDVDRDAsIDB4NDFDQywgMHg1Q0QyLCAweDM4OTMsIDB4NUNEOSwgMHgxMjQyLAotICAgIDB4NUNERCwgMHg0QjgzLCAweDVDRTAsIDB4MEM5NSwgMHg1Q0UxLCAweDA2QTYsIDB4NUNFNiwgMHgzNzJDLAotICAgIDB4NUNFOCwgMHgwNTY1LCAweDVDRTksIDB4MTI0MywgMHg1Q0VBLCAweDEyNDgsIDB4NUNFRCwgMHgxMjQ2LAotICAgIDB4NUNFRiwgMHgwRTQ3LCAweDVDRjAsIDB4MEU0NiwgMHg1Q0Y0LCAweDM4OTQsIDB4NUNGNSwgMHgyMEY4LAotICAgIDB4NUNGNiwgMHgwQzYxLCAweDVDRkEsIDB4MTI0NSwgMHg1Q0ZCLCAweDA5NUUsIDB4NUNGRCwgMHgxMjQ0LAotICAgIDB4NUQwMSwgMHg0Qjg0LCAweDVEMDYsIDB4NDQ5QiwgMHg1RDA3LCAweDBBMzgsIDB4NUQwQiwgMHgxMjQ5LAotICAgIDB4NUQwRCwgMHg0MUNFLCAweDVEMEUsIDB4MDg1QSwgMHg1RDEwLCAweDQ0OUMsIDB4NUQxMSwgMHgxMjRGLAotICAgIDB4NUQxNCwgMHgxMjUwLCAweDVEMTUsIDB4MTI0QSwgMHg1RDE2LCAweDA1OTEsIDB4NUQxNywgMHgxMjRCLAotICAgIDB4NUQxOCwgMHgxMjU0LCAweDVEMTksIDB4MTI1MywgMHg1RDFBLCAweDEyNTIsIDB4NUQxQiwgMHgxMjRFLAotICAgIDB4NUQxRCwgMHg0NDlFLCAweDVEMUYsIDB4MTI0RCwgMHg1RDIwLCAweDQ0OUYsIDB4NUQyMiwgMHgxMjUxLAotICAgIDB4NUQyNCwgMHgzODk1LCAweDVEMjYsIDB4Mzg5NiwgMHg1RDI3LCAweDIwRjksIDB4NUQyOSwgMHgwRTQ4LAotICAgIDB4NUQyQiwgMHg0NDlELCAweDVEMzEsIDB4NDRBMCwgMHg1RDM0LCAweDRCODUsIDB4NUQzOSwgMHg0NEExLAotICAgIDB4NUQzRCwgMHg0Qjg2LCAweDVENDIsIDB4MjBGQywgMHg1RDQzLCAweDM4OTcsIDB4NUQ0NiwgMHgzODk4LAotICAgIDB4NUQ0NywgMHg0MUNGLCAweDVENEEsIDB4Mzg5OSwgMHg1RDRCLCAweDEyNTgsIDB4NUQ0QywgMHgxMjU1LAotICAgIDB4NUQ0RSwgMHgxMjU3LCAweDVENTAsIDB4MEY1QywgMHg1RDUyLCAweDEyNTYsIDB4NUQ1MywgMHgyMEZBLAotICAgIDB4NUQ1OSwgMHg0Qjg3LCAweDVENUMsIDB4MTI0QywgMHg1RDYxLCAweDQ0QTMsIDB4NUQ2OSwgMHgwQTM5LAotICAgIDB4NUQ2QSwgMHg0NEE0LCAweDVENkMsIDB4MTI1OSwgMHg1RDZELCAweDIwRkQsIDB4NUQ2RiwgMHgwODI3LAotICAgIDB4NUQ3MCwgMHg0NEE2LCAweDVENzMsIDB4MTI1QSwgMHg1RDc2LCAweDEyNUIsIDB4NUQ3RSwgMHg0Qjg4LAotICAgIDB4NUQ4MSwgMHg0MUQwLCAweDVEODIsIDB4MTI1RSwgMHg1RDgzLCAweDRCODksIDB4NUQ4NCwgMHgxMjVELAotICAgIDB4NUQ4NywgMHgxMjVDLCAweDVEODgsIDB4NDRBOSwgMHg1RDhCLCAweDBDNjIsIDB4NUQ4QywgMHgxMjQ3LAotICAgIDB4NUQ5MCwgMHgxMjY0LCAweDVEOTIsIDB4Mzg5QSwgMHg1RDk0LCAweDM4OUIsIDB4NUQ5NywgMHg0NEFCLAotICAgIDB4NUQ5OSwgMHgzODlDLCAweDVEOUQsIDB4MTI2MCwgMHg1REEwLCAweDM4OUQsIDB4NURBMiwgMHgxMjVGLAotICAgIDB4NURBNCwgMHg0MUQxLCAweDVEQTcsIDB4NDFEMiwgMHg1REFDLCAweDEyNjEsIDB4NURBRSwgMHgxMjYyLAotICAgIDB4NURCMCwgMHg0NEFDLCAweDVEQjIsIDB4M0MyRCwgMHg1REI0LCAweDQ0QUQsIDB4NURCNywgMHgxMjY1LAotICAgIDB4NURCOCwgMHgyMEZFLCAweDVEQjksIDB4MjBGRiwgMHg1REJBLCAweDBGQUUsIDB4NURCQywgMHgxMjY2LAotICAgIDB4NURCRCwgMHgxMjYzLCAweDVEQzcsIDB4NEI4QSwgMHg1REM5LCAweDEyNjcsIDB4NURDQiwgMHg0MUQzLAotICAgIDB4NURDQywgMHgwNjFDLCAweDVEQ0QsIDB4MTI2OCwgMHg1REQwLCAweDIxMDAsIDB4NUREMSwgMHg0NEFGLAotICAgIDB4NUREMiwgMHgxMjZBLCAweDVERDMsIDB4MTI2OSwgMHg1REQ2LCAweDEyNkIsIDB4NURENywgMHg0NEIwLAotICAgIDB4NUREOCwgMHgzODlFLCAweDVEREIsIDB4MTI2QywgMHg1RERELCAweDBBOTIsIDB4NURERSwgMHgwOTJELAotICAgIDB4NURFMCwgMHgzODlGLCAweDVERTEsIDB4MDk2RSwgMHg1REUyLCAweDM0MzIsIDB4NURFMywgMHgwQUU1LAotICAgIDB4NURFNCwgMHg0NEIyLCAweDVERTUsIDB4MDdCQiwgMHg1REU2LCAweDA4MjgsIDB4NURFNywgMHgwN0JDLAotICAgIDB4NURFOCwgMHgwNjhBLCAweDVERTksIDB4NDRCMywgMHg1REVCLCAweDEyNkQsIDB4NURFRSwgMHgwODI5LAotICAgIDB4NURGMSwgMHgwNzdFLCAweDVERjIsIDB4MTI2RSwgMHg1REYzLCAweDBFQjIsIDB4NURGNCwgMHgwQ0Y5LAotICAgIDB4NURGNSwgMHgxMjZGLCAweDVERjcsIDB4MDdCRCwgMHg1REY4LCAweDM4QTAsIDB4NURGOSwgMHg0QjhCLAotICAgIDB4NURGQiwgMHgwNUU4LCAweDVERkQsIDB4MEI2NSwgMHg1REZFLCAweDA2Q0EsIDB4NURGRiwgMHgzNUUyLAotICAgIDB4NUUwMCwgMHgzOEExLCAweDVFMDIsIDB4MDhBMiwgMHg1RTAzLCAweDBEQ0QsIDB4NUUwNiwgMHgwRDU1LAotICAgIDB4NUUwQiwgMHgxMjcwLCAweDVFMEMsIDB4MDYzMSwgMHg1RTExLCAweDEyNzMsIDB4NUUxMiwgMHgzOEEyLAotICAgIDB4NUUxNCwgMHgzOEEzLCAweDVFMTUsIDB4MzhBNCwgMHg1RTE2LCAweDBCQkQsIDB4NUUxOCwgMHgzOEE1LAotICAgIDB4NUUxOSwgMHgxMjcyLCAweDVFMUEsIDB4MTI3MSwgMHg1RTFCLCAweDEyNzQsIDB4NUUxRCwgMHgwQzA3LAotICAgIDB4NUUxRiwgMHg0NEI3LCAweDVFMjUsIDB4MEEyOSwgMHg1RTI4LCAweDRCOEMsIDB4NUUyQiwgMHgwOEEzLAotICAgIDB4NUUyRCwgMHgwQTZFLCAweDVFMkUsIDB4MzhBNiwgMHg1RTJGLCAweDBCMzMsIDB4NUUzMCwgMHgwNjNDLAotICAgIDB4NUUzMiwgMHg0QjhELCAweDVFMzMsIDB4MEJCRSwgMHg1RTM1LCAweDRCOEUsIDB4NUUzNiwgMHgxMjc1LAotICAgIDB4NUUzNywgMHgxMjc2LCAweDVFMzgsIDB4MDlENywgMHg1RTNELCAweDBFNjcsIDB4NUUzRSwgMHg0NEI4LAotICAgIDB4NUU0MCwgMHgxMjc5LCAweDVFNDMsIDB4MTI3OCwgMHg1RTQ0LCAweDEyNzcsIDB4NUU0NSwgMHgwREVGLAotICAgIDB4NUU0NywgMHgxMjgwLCAweDVFNDksIDB4NDRCOSwgMHg1RTRDLCAweDBFODgsIDB4NUU0RSwgMHgxMjdBLAotICAgIDB4NUU1NCwgMHgxMjdDLCAweDVFNTUsIDB4MEU5OSwgMHg1RTU2LCAweDQ0QkIsIDB4NUU1NywgMHgxMjdCLAotICAgIDB4NUU1OCwgMHgzOEE3LCAweDVFNUIsIDB4NEI4RiwgMHg1RTVFLCAweDQxRDQsIDB4NUU1RiwgMHgxMjdELAotICAgIDB4NUU2MSwgMHgwRDNDLCAweDVFNjIsIDB4MTI3RSwgMHg1RTYzLCAweDBFMEUsIDB4NUU2NCwgMHgxMjdGLAotICAgIDB4NUU2OCwgMHg0QjkwLCAweDVFNkEsIDB4NEI5MSwgMHg1RTZCLCAweDM4QTgsIDB4NUU2QywgMHgzOEE5LAotICAgIDB4NUU2RCwgMHg0NEJELCAweDVFNkUsIDB4NDRCRSwgMHg1RTcyLCAweDA1RUYsIDB4NUU3MywgMHgwRTBGLAotICAgIDB4NUU3NCwgMHgwQ0U1LCAweDVFNzUsIDB4MTI4MSwgMHg1RTc2LCAweDEyODIsIDB4NUU3NywgMHg0QjkyLAotICAgIDB4NUU3OCwgMHgwN0JFLCAweDVFNzksIDB4MDVGMCwgMHg1RTdBLCAweDEyODMsIDB4NUU3QiwgMHgwNzZDLAotICAgIDB4NUU3QywgMHgwRjJFLCAweDVFN0QsIDB4MEYxMywgMHg1RTdFLCAweDA2MzIsIDB4NUU3RiwgMHgxMjg1LAotICAgIDB4NUU4MCwgMHg0QjkzLCAweDVFODEsIDB4MEJCRiwgMHg1RTgzLCAweDA3QkYsIDB4NUU4NCwgMHgwOTk5LAotICAgIDB4NUU4NywgMHgwRDczLCAweDVFOEEsIDB4MDk5QSwgMHg1RThCLCAweDRCOTQsIDB4NUU4RiwgMHgwOTgyLAotICAgIDB4NUU5NSwgMHgwQzA4LCAweDVFOTYsIDB4MEU0OSwgMHg1RTk3LCAweDBDMzMsIDB4NUU5OSwgMHgzNkIwLAotICAgIDB4NUU5QSwgMHgwN0MwLCAweDVFOUMsIDB4MERDRSwgMHg1RUEwLCAweDEyODYsIDB4NUVBNSwgMHg0NEMwLAotICAgIDB4NUVBNiwgMHgwQzUzLCAweDVFQTcsIDB4MDgzMiwgMHg1RUE4LCAweDM4QUEsIDB4NUVBQSwgMHgzOEFCLAotICAgIDB4NUVBQiwgMHgwNzdGLCAweDVFQUMsIDB4NDRDMSwgMHg1RUFELCAweDBDMDksIDB4NUVCMywgMHg0Qjk1LAotICAgIDB4NUVCNSwgMHgwNDg3LCAweDVFQjYsIDB4MDk3OCwgMHg1RUI3LCAweDA3QzEsIDB4NUVCOCwgMHgwRjMxLAotICAgIDB4NUVCOSwgMHg0NEMyLCAweDVFQkQsIDB4NEI5NiwgMHg1RUJFLCAweDM4QUMsIDB4NUVCRiwgMHgzOEFELAotICAgIDB4NUVDMSwgMHgxMjg3LCAweDVFQzIsIDB4MTI4OCwgMHg1RUMzLCAweDBEMDcsIDB4NUVDNiwgMHg0NEMzLAotICAgIDB4NUVDOCwgMHgxMjg5LCAweDVFQzksIDB4MEZCRiwgMHg1RUNBLCAweDBGRDMsIDB4NUVDQiwgMHgzQzFFLAotICAgIDB4NUVDRiwgMHgxMjhCLCAweDVFRDAsIDB4MTI4QSwgMHg1RUQxLCAweDRCOTcsIDB4NUVEMiwgMHgzOEFGLAotICAgIDB4NUVEMywgMHgwNUE1LCAweDVFRDQsIDB4NEI5OCwgMHg1RUQ1LCAweDRCOTksIDB4NUVENiwgMHgxMjhDLAotICAgIDB4NUVEOSwgMHg0NEM0LCAweDVFREEsIDB4MTI4RiwgMHg1RURCLCAweDEyOTAsIDB4NUVERCwgMHgxMjhFLAotICAgIDB4NUVERiwgMHgwREIyLCAweDVFRTAsIDB4MDk5QiwgMHg1RUUxLCAweDEyOTIsIDB4NUVFMiwgMHgxMjkxLAotICAgIDB4NUVFMywgMHgxMjhELCAweDVFRTgsIDB4MTI5MywgMHg1RUU5LCAweDEyOTQsIDB4NUVFQywgMHgxMjk1LAotICAgIDB4NUVGMCwgMHgxMjk4LCAweDVFRjEsIDB4MTI5NiwgMHg1RUYzLCAweDEyOTcsIDB4NUVGNCwgMHgxMjk5LAotICAgIDB4NUVGNiwgMHgwNTA2LCAweDVFRjcsIDB4MEMwQSwgMHg1RUY4LCAweDEyOUEsIDB4NUVGOSwgMHg0MUQ1LAotICAgIDB4NUVGQSwgMHgwNzUwLCAweDVFRkIsIDB4MDU3NiwgMHg1RUZDLCAweDBDRUMsIDB4NUVGRCwgMHg0NEM2LAotICAgIDB4NUVGRSwgMHgxMjlCLCAweDVFRkYsIDB4MENEMywgMHg1RjAwLCAweDQxRDYsIDB4NUYwMSwgMHgwRTJCLAotICAgIDB4NUYwMiwgMHg0MUQ3LCAweDVGMDMsIDB4MTI5QywgMHg1RjA0LCAweDBGRDQsIDB4NUYwNywgMHgzOEIwLAotICAgIDB4NUYwOCwgMHg0NEM3LCAweDVGMDksIDB4MTI5RCwgMHg1RjBBLCAweDBFMTAsIDB4NUYwQiwgMHgxMkEwLAotICAgIDB4NUYwQywgMHgwRkZBLCAweDVGMEQsIDB4MTAwQSwgMHg1RjBFLCAweDM4QjEsIDB4NUYwRiwgMHgwOERDLAotICAgIDB4NUYxMCwgMHgwQ0NELCAweDVGMTEsIDB4MTJBMSwgMHg1RjEzLCAweDA2NzcsIDB4NUYxNCwgMHgwQkMwLAotICAgIDB4NUYxNSwgMHgwNEJFLCAweDVGMTYsIDB4MTJBMiwgMHg1RjE3LCAweDBERjYsIDB4NUYxOCwgMHgwN0MyLAotICAgIDB4NUYxQiwgMHgwQjhFLCAweDVGMUMsIDB4MzhCMiwgMHg1RjFELCAweDM4QjMsIDB4NUYxRSwgMHg0NEM5LAotICAgIDB4NUYxRiwgMHgwQzBCLCAweDVGMjEsIDB4MjEwMSwgMHg1RjIyLCAweDM4QjQsIDB4NUYyMywgMHg0MUQ4LAotICAgIDB4NUYyNSwgMHgwRUZCLCAweDVGMjYsIDB4MDc2RCwgMHg1RjI3LCAweDA3ODAsIDB4NUYyOCwgMHgzOEI1LAotICAgIDB4NUYyOSwgMHgxMkEzLCAweDVGMkQsIDB4MTJBNCwgMHg1RjJGLCAweDEyQUEsIDB4NUYzMSwgMHgwOTExLAotICAgIDB4NUYzNCwgMHgyMTAyLCAweDVGMzUsIDB4MEJDMSwgMHg1RjM2LCAweDM4QjYsIDB4NUYzNywgMHgwNkE3LAotICAgIDB4NUYzOCwgMHgxMkE1LCAweDVGM0EsIDB4MzU5OCwgMHg1RjNCLCAweDM4QjcsIDB4NUYzQywgMHgwRDlELAotICAgIDB4NUYzRCwgMHg0MUQ5LCAweDVGM0UsIDB4MEI4NCwgMHg1RjQwLCAweDM4QjgsIDB4NUY0MSwgMHgxMkE2LAotICAgIDB4NUY0NSwgMHgyMEIyLCAweDVGNDcsIDB4NDRDQSwgMHg1RjQ4LCAweDEyQTcsIDB4NUY0QSwgMHgwNkE4LAotICAgIDB4NUY0QywgMHgxMkE4LCAweDVGNEQsIDB4NEI5QSwgMHg1RjRFLCAweDEyQTksIDB4NUY1MCwgMHgzOEI5LAotICAgIDB4NUY1MSwgMHgxMkFCLCAweDVGNTMsIDB4MEM3MCwgMHg1RjU0LCAweDQxREEsIDB4NUY1NiwgMHgxMkFDLAotICAgIDB4NUY1NywgMHgxMkFELCAweDVGNTgsIDB4MzhCQSwgMHg1RjU5LCAweDEyQUUsIDB4NUY1QywgMHgxMjlGLAotICAgIDB4NUY1RCwgMHgxMjlFLCAweDVGNjEsIDB4MTJBRiwgMHg1RjYyLCAweDA3MTcsIDB4NUY2MywgMHg0NENCLAotICAgIDB4NUY2NCwgMHgzOEJCLCAweDVGNjUsIDB4MzZBQywgMHg1RjY2LCAweDBEOTksIDB4NUY2NywgMHgyMTAzLAotICAgIDB4NUY2OSwgMHgwODNDLCAweDVGNkEsIDB4MERBOSwgMHg1RjZCLCAweDBCQzIsIDB4NUY2QywgMHgwREJELAotICAgIDB4NUY2RCwgMHgxMkIwLCAweDVGNzAsIDB4MDk5QywgMHg1RjcxLCAweDA0RTgsIDB4NUY3MiwgMHg0NENDLAotICAgIDB4NUY3MywgMHgxMkIxLCAweDVGNzcsIDB4MTJCMiwgMHg1Rjc5LCAweDBFRkUsIDB4NUY3QywgMHgwRDc0LAotICAgIDB4NUY3RCwgMHg0MURCLCAweDVGN0UsIDB4NDRDRCwgMHg1RjdGLCAweDEyQjUsIDB4NUY4MCwgMHgwNTFGLAotICAgIDB4NUY4MSwgMHgwQTUwLCAweDVGODIsIDB4MTJCNCwgMHg1RjgzLCAweDEyQjMsIDB4NUY4NCwgMHgwNzE4LAotICAgIDB4NUY4NSwgMHgwQjM0LCAweDVGODcsIDB4MTJCOSwgMHg1Rjg4LCAweDEyQjcsIDB4NUY4OSwgMHgzOEJDLAotICAgIDB4NUY4QSwgMHgxMkI2LCAweDVGOEIsIDB4MEY2RiwgMHg1RjhDLCAweDA3OTksIDB4NUY4RiwgMHg0NENFLAotICAgIDB4NUY5MCwgMHgwOTgzLCAweDVGOTEsIDB4MTJCOCwgMHg1RjkyLCAweDBDNDYsIDB4NUY5MywgMHgwOTQ4LAotICAgIDB4NUY5NywgMHgwQzk4LCAweDVGOTgsIDB4MTJCQywgMHg1Rjk5LCAweDEyQkIsIDB4NUY5QywgMHgzOEJELAotICAgIDB4NUY5RSwgMHgxMkJBLCAweDVGQTAsIDB4MTJCRCwgMHg1RkExLCAweDA3OUEsIDB4NUZBMiwgMHg0NENGLAotICAgIDB4NUZBNCwgMHgzOEJGLCAweDVGQTcsIDB4MzhCRSwgMHg1RkE4LCAweDEyQkUsIDB4NUZBOSwgMHgwREVFLAotICAgIDB4NUZBQSwgMHgwOTY1LCAweDVGQUMsIDB4NEI5QiwgMHg1RkFELCAweDEyQkYsIDB4NUZBRSwgMHgwRDhELAotICAgIDB4NUZBRiwgMHgzOEMwLCAweDVGQjMsIDB4MEM5OSwgMHg1RkI0LCAweDBCQzMsIDB4NUZCNSwgMHgzNDM4LAotICAgIDB4NUZCNywgMHgyMTA0LCAweDVGQjgsIDB4MzhDMSwgMHg1RkI5LCAweDBDMkEsIDB4NUZCQywgMHgxMkMwLAotICAgIDB4NUZCRCwgMHgwNjQ1LCAweDVGQzMsIDB4MDlGQSwgMHg1RkM0LCAweDM4QzIsIDB4NUZDNSwgMHgwRDlFLAotICAgIDB4NUZDNywgMHg0NEQwLCAweDVGQzksIDB4MzhDMywgMHg1RkNCLCAweDQ0RDEsIDB4NUZDQywgMHgwNjMzLAotICAgIDB4NUZDRCwgMHgwQ0RDLCAweDVGRDIsIDB4NDREMiwgMHg1RkQzLCAweDQ0RDMsIDB4NUZENCwgMHg0NEQ0LAotICAgIDB4NUZENiwgMHgxMkMxLCAweDVGRDcsIDB4MDhBNCwgMHg1RkQ4LCAweDBFNjgsIDB4NUZEOSwgMHgwRTY5LAotICAgIDB4NUZEQywgMHgwNTIwLCAweDVGREQsIDB4MTJDNiwgMHg1RkRFLCAweDIxMDUsIDB4NUZFMCwgMHgwQkE3LAotICAgIDB4NUZFMSwgMHgzOEM0LCAweDVGRTIsIDB4NDRENSwgMHg1RkU0LCAweDEyQzMsIDB4NUZFOSwgMHgzOEM1LAotICAgIDB4NUZFQSwgMHg0QjlDLCAweDVGRUIsIDB4MDU3NywgMHg1RkVELCAweDM4QzYsIDB4NUZFRSwgMHg0NEQ2LAotICAgIDB4NUZFRiwgMHg0NEQ3LCAweDVGRjAsIDB4MTJGNiwgMHg1RkYxLCAweDEyQzUsIDB4NUZGMywgMHg0NEQ4LAotICAgIDB4NUZGNSwgMHgwQ0U2LCAweDVGRjgsIDB4MTJDNCwgMHg1RkZCLCAweDEyQzIsIDB4NUZGQywgMHgzOEM3LAotICAgIDB4NUZGRCwgMHgwODBDLCAweDVGRkYsIDB4MTJDOCwgMHg2MDA3LCAweDRCOUQsIDB4NjAwRCwgMHg0MURDLAotICAgIDB4NjAwRSwgMHgxMkNFLCAweDYwMEYsIDB4MTJENCwgMHg2MDEwLCAweDEyQ0MsIDB4NjAxMiwgMHgwQzU2LAotICAgIDB4NjAxNCwgMHg0MURELCAweDYwMTUsIDB4MTJEMSwgMHg2MDE2LCAweDBEQ0YsIDB4NjAxNywgMHgzOEM4LAotICAgIDB4NjAxOCwgMHg0MURFLCAweDYwMTksIDB4MTJDQiwgMHg2MDFBLCAweDM4QzksIDB4NjAxQiwgMHgxMkQwLAotICAgIDB4NjAxQywgMHgwRkFGLCAweDYwMUQsIDB4MDhBNSwgMHg2MDIwLCAweDBCMzUsIDB4NjAyMSwgMHgxMkM5LAotICAgIDB4NjAyMiwgMHg0NERBLCAweDYwMjQsIDB4NDREQiwgMHg2MDI1LCAweDA2NzgsIDB4NjAyNiwgMHgxMkQzLAotICAgIDB4NjAyNywgMHgwQTUxLCAweDYwMjgsIDB4MDUwNywgMHg2MDI5LCAweDEyQ0QsIDB4NjAyQSwgMHgwNTc4LAotICAgIDB4NjAyQiwgMHgxMkQyLCAweDYwMkYsIDB4MDZBOSwgMHg2MDMxLCAweDEyQ0YsIDB4NjAzMywgMHgzOENBLAotICAgIDB4NjAzNSwgMHg0MURGLCAweDYwM0EsIDB4MTJENSwgMHg2MDQxLCAweDEyRDcsIDB4NjA0MiwgMHgxMkUxLAotICAgIDB4NjA0MywgMHgxMkRGLCAweDYwNDYsIDB4MTJEQywgMHg2MDQ3LCAweDQxRTAsIDB4NjA0OSwgMHg0QjlFLAotICAgIDB4NjA0QSwgMHgxMkRCLCAweDYwNEIsIDB4MEZDMCwgMHg2MDRDLCAweDQ0REQsIDB4NjA0RCwgMHgxMkRELAotICAgIDB4NjA1MCwgMHgwNkFBLCAweDYwNTIsIDB4MDdDMywgMHg2MDU0LCAweDRCOUYsIDB4NjA1NSwgMHgwOTg0LAotICAgIDB4NjA1OSwgMHgxMkU0LCAweDYwNUEsIDB4MTJENiwgMHg2MDVELCAweDIxMDYsIDB4NjA1RiwgMHgxMkRBLAotICAgIDB4NjA2MCwgMHgxMkNBLCAweDYwNjEsIDB4MzhDQiwgMHg2MDYyLCAweDA1N0EsIDB4NjA2MywgMHgxMkRFLAotICAgIDB4NjA2NCwgMHgxMkUwLCAweDYwNjUsIDB4MEI4RiwgMHg2MDY3LCAweDRCQTAsIDB4NjA2OCwgMHgwODE4LAotICAgIDB4NjA2OSwgMHgwNTM4LCAweDYwNkEsIDB4MTJEOCwgMHg2MDZCLCAweDEyRTMsIDB4NjA2QywgMHgxMkUyLAotICAgIDB4NjA2RCwgMHgwNkFCLCAweDYwNkYsIDB4MEIwOSwgMHg2MDcwLCAweDA1QzQsIDB4NjA3NSwgMHgwNzE5LAotICAgIDB4NjA3NywgMHgxMkQ5LCAweDYwN0YsIDB4MzhDQywgMHg2MDgxLCAweDEyRTUsIDB4NjA4MywgMHgxMkU4LAotICAgIDB4NjA4NCwgMHgxMkVBLCAweDYwODUsIDB4MjEwNywgMHg2MDg5LCAweDA4RTksIDB4NjA4QSwgMHgyMTA4LAotICAgIDB4NjA4QiwgMHgxMkYwLCAweDYwOEMsIDB4MEMwQywgMHg2MDhELCAweDEyRTYsIDB4NjA5MiwgMHgxMkVFLAotICAgIDB4NjA5NCwgMHgwNTc5LCAweDYwOTUsIDB4NDRERSwgMHg2MDk2LCAweDEyRUMsIDB4NjA5NywgMHgxMkVELAotICAgIDB4NjA5QSwgMHgxMkU5LCAweDYwOUIsIDB4MTJFQiwgMHg2MDlELCAweDQxRTEsIDB4NjA5RSwgMHgzOENELAotICAgIDB4NjA5RiwgMHgwNzlCLCAweDYwQTAsIDB4MEYxNCwgMHg2MEEzLCAweDA1RjEsIDB4NjBBNCwgMHgzOENFLAotICAgIDB4NjBBNiwgMHgwNEZCLCAweDYwQTcsIDB4MTJFRiwgMHg2MEE4LCAweDQ0REYsIDB4NjBBOSwgMHgwQ0YwLAotICAgIDB4NjBBQSwgMHgwNDcxLCAweDYwQjAsIDB4MzhDRiwgMHg2MEIxLCAweDQ0RTEsIDB4NjBCMiwgMHgwRDc1LAotICAgIDB4NjBCMywgMHgxMkM3LCAweDYwQjQsIDB4MTJGNSwgMHg2MEI1LCAweDEyRjksIDB4NjBCNiwgMHgwRUYxLAotICAgIDB4NjBCOCwgMHgxMkYyLCAweDYwQkIsIDB4NEJBMSwgMHg2MEJDLCAweDBDNjMsIDB4NjBCRCwgMHgxMkY3LAotICAgIDB4NjBCRSwgMHg0NEUyLCAweDYwQzQsIDB4NEJBMiwgMHg2MEM1LCAweDA5RDgsIDB4NjBDNiwgMHgxMkY4LAotICAgIDB4NjBDNywgMHgwQ0FGLCAweDYwQzgsIDB4NDRFMywgMHg2MENCLCAweDM4RDAsIDB4NjBEMSwgMHgwRkVELAotICAgIDB4NjBEMywgMHgxMkY0LCAweDYwRDQsIDB4NDFFMiwgMHg2MEQ1LCAweDIxMEEsIDB4NjBEOCwgMHgxMkZBLAotICAgIDB4NjBEOSwgMHg0NEU0LCAweDYwREEsIDB4MDgwRCwgMHg2MERCLCAweDM4RDEsIDB4NjBEQywgMHgwQTZGLAotICAgIDB4NjBERCwgMHg0MUUzLCAweDYwREUsIDB4MjEwOSwgMHg2MERGLCAweDA0OTgsIDB4NjBFMCwgMHgxMkYzLAotICAgIDB4NjBFMSwgMHgxMkYxLCAweDYwRTMsIDB4MEFEQywgMHg2MEU3LCAweDEyRTcsIDB4NjBFOCwgMHgwODgyLAotICAgIDB4NjBFRSwgMHg0NEU1LCAweDYwRjAsIDB4MEIyNiwgMHg2MEYxLCAweDEzMDYsIDB4NjBGMiwgMHgyMTBDLAotICAgIDB4NjBGMywgMHgwQURELCAweDYwRjQsIDB4MTMwMSwgMHg2MEY1LCAweDQ0RTYsIDB4NjBGNiwgMHgxMkZFLAotICAgIDB4NjBGNywgMHgxMkZGLCAweDYwRjgsIDB4MzhEMiwgMHg2MEY5LCAweDA5MTIsIDB4NjBGQSwgMHgxMzAyLAotICAgIDB4NjBGQiwgMHgxMzA1LCAweDYwRkQsIDB4NEJBMywgMHg2MTAwLCAweDEzMDAsIDB4NjEwMSwgMHgwOTJGLAotICAgIDB4NjEwMywgMHgxMzAzLCAweDYxMDYsIDB4MTJGRCwgMHg2MTA4LCAweDBGMDgsIDB4NjEwOSwgMHgwRjA3LAotICAgIDB4NjEwQSwgMHg0QkE0LCAweDYxMEQsIDB4MTMwNywgMHg2MTBFLCAweDEzMDgsIDB4NjEwRiwgMHgwNDk5LAotICAgIDB4NjExMCwgMHg0NEU3LCAweDYxMTEsIDB4MjEwRCwgMHg2MTEyLCAweDM4RDMsIDB4NjExMywgMHgzOEQ0LAotICAgIDB4NjExNCwgMHgzOEQ1LCAweDYxMTUsIDB4MTJGQywgMHg2MTE2LCAweDRCQTUsIDB4NjExOSwgMHg0NEU4LAotICAgIDB4NjExQSwgMHgwNkVBLCAweDYxMUIsIDB4MDQ2QSwgMHg2MTFDLCAweDM4RDYsIDB4NjExRSwgMHg0NEU5LAotICAgIDB4NjExRiwgMHgwNUYyLCAweDYxMjAsIDB4MjEwQiwgMHg2MTIxLCAweDEzMDQsIDB4NjEyNywgMHgxMzBDLAotICAgIDB4NjEyOCwgMHgxMzBCLCAweDYxMkEsIDB4NEJBNiwgMHg2MTJCLCAweDQxRTQsIDB4NjEyQywgMHgxMzEwLAotICAgIDB4NjEzMCwgMHgyMTBGLCAweDYxMzQsIDB4MTMxMSwgMHg2MTM2LCAweDRCQTcsIDB4NjEzNywgMHgyMTBFLAotICAgIDB4NjEzQSwgMHg0NEVBLCAweDYxM0MsIDB4MTMwRiwgMHg2MTNELCAweDEzMTIsIDB4NjEzRSwgMHgxMzBBLAotICAgIDB4NjEzRiwgMHgxMzBFLCAweDYxNDEsIDB4NDRFQywgMHg2MTQyLCAweDEzMTMsIDB4NjE0NCwgMHgxMzE0LAotICAgIDB4NjE0NiwgMHg0NEVELCAweDYxNDcsIDB4MTMwOSwgMHg2MTQ4LCAweDA4Q0EsIDB4NjE0QSwgMHgxMzBELAotICAgIDB4NjE0QiwgMHgwQjM2LCAweDYxNEMsIDB4MDdDNCwgMHg2MTRELCAweDEyRkIsIDB4NjE0RSwgMHgwOUZCLAotICAgIDB4NjE1MywgMHgxMzIxLCAweDYxNTUsIDB4MEUzOSwgMHg2MTU4LCAweDEzMTcsIDB4NjE1OSwgMHgxMzE4LAotICAgIDB4NjE1QSwgMHgxMzE5LCAweDYxNUQsIDB4MTMyMCwgMHg2MTVFLCAweDRCQTgsIDB4NjE1RiwgMHgxMzFGLAotICAgIDB4NjE2MCwgMHg0NEVFLCAweDYxNjIsIDB4MEVBQiwgMHg2MTYzLCAweDA1RjMsIDB4NjE2NCwgMHg0QkE5LAotICAgIDB4NjE2NSwgMHgxMzFELCAweDYxNjcsIDB4MDcxQiwgMHg2MTY4LCAweDA1OTIsIDB4NjE2QiwgMHgxMzFBLAotICAgIDB4NjE2RSwgMHgwRjgwLCAweDYxNkYsIDB4MTMxQywgMHg2MTcwLCAweDA0OUEsIDB4NjE3MSwgMHgxMzFFLAotICAgIDB4NjE3MywgMHgxMzE1LCAweDYxNzQsIDB4MTMxQiwgMHg2MTc1LCAweDEzMjIsIDB4NjE3NiwgMHgwNzFBLAotICAgIDB4NjE3NywgMHgxMzE2LCAweDYxN0IsIDB4NEJBQSwgMHg2MTdDLCAweDM4RDcsIDB4NjE3RCwgMHg0QkFCLAotICAgIDB4NjE3RSwgMHgwRjQ3LCAweDYxN0YsIDB4NEJBQywgMHg2MTgyLCAweDBGMTUsIDB4NjE4NywgMHgxMzI1LAotICAgIDB4NjE4QSwgMHgxMzI5LCAweDYxOEQsIDB4MzhEOCwgMHg2MThFLCAweDBCMDAsIDB4NjE5MCwgMHgwRkMxLAotICAgIDB4NjE5MSwgMHgxMzJBLCAweDYxOTIsIDB4NDRGMCwgMHg2MTkzLCAweDQ0RjEsIDB4NjE5NCwgMHgxMzI3LAotICAgIDB4NjE5NiwgMHgxMzI0LCAweDYxOTcsIDB4NDRGMiwgMHg2MTk4LCAweDIxMTAsIDB4NjE5OSwgMHgxMzIzLAotICAgIDB4NjE5QSwgMHgxMzI4LCAweDYxOUQsIDB4NEJBRCwgMHg2MTlGLCAweDM4RDksIDB4NjFBNCwgMHgwRTAwLAotICAgIDB4NjFBNSwgMHg0NEYzLCAweDYxQTcsIDB4MEM4QywgMHg2MUE4LCAweDM4REEsIDB4NjFBOSwgMHgwNzFDLAotICAgIDB4NjFBQiwgMHgxMzJCLCAweDYxQUMsIDB4MTMyNiwgMHg2MUFELCAweDQ0RjQsIDB4NjFBRSwgMHgxMzJDLAotICAgIDB4NjFCMiwgMHgwNzUxLCAweDYxQjYsIDB4MDUzMSwgMHg2MUI4LCAweDRCQUUsIDB4NjFCOSwgMHg0MUU2LAotICAgIDB4NjFCQSwgMHgxMzM0LCAweDYxQkMsIDB4NDFFNSwgMHg2MUJFLCAweDA1RjQsIDB4NjFDMiwgMHgzOERCLAotICAgIDB4NjFDMywgMHgxMzMyLCAweDYxQzYsIDB4MTMzMywgMHg2MUM3LCAweDA4MTksIDB4NjFDOCwgMHgxMzMxLAotICAgIDB4NjFDOSwgMHgxMzJGLCAweDYxQ0EsIDB4MTMyRSwgMHg2MUNCLCAweDEzMzUsIDB4NjFDQywgMHgxMzJELAotICAgIDB4NjFDRCwgMHgxMzM3LCAweDYxRDAsIDB4MDU3QiwgMHg2MUQ1LCAweDQ0RjYsIDB4NjFEQywgMHg0QkFGLAotICAgIDB4NjFERCwgMHg0NEY3LCAweDYxREYsIDB4MzhEQywgMHg2MUUyLCAweDRCQjAsIDB4NjFFMywgMHgxMzM5LAotICAgIDB4NjFFNSwgMHg0QkIxLCAweDYxRTYsIDB4MTMzOCwgMHg2MUU4LCAweDRCQjIsIDB4NjFGMiwgMHgwQkM0LAotICAgIDB4NjFGNCwgMHgxMzNDLCAweDYxRjUsIDB4NDRGOCwgMHg2MUY2LCAweDEzM0EsIDB4NjFGNywgMHgxMzMwLAotICAgIDB4NjFGOCwgMHgwNzUyLCAweDYxRkEsIDB4MTMzQiwgMHg2MUZDLCAweDEzM0YsIDB4NjFGRCwgMHgxMzNFLAotICAgIDB4NjFGRSwgMHgxMzQwLCAweDYxRkYsIDB4MTMzRCwgMHg2MjAwLCAweDEzNDEsIDB4NjIwNCwgMHg0QkIzLAotICAgIDB4NjIwNywgMHg0QkI0LCAweDYyMDgsIDB4MTM0MiwgMHg2MjA5LCAweDEzNDMsIDB4NjIwQSwgMHgwRTNBLAotICAgIDB4NjIwQywgMHgxMzQ1LCAweDYyMEQsIDB4MTM0NCwgMHg2MjBFLCAweDA5NDksIDB4NjIxMCwgMHgwQTUyLAotICAgIDB4NjIxMSwgMHgwNTY2LCAweDYyMTIsIDB4MDU3QywgMHg2MjEzLCAweDIxMTEsIDB4NjIxNCwgMHgxMzQ2LAotICAgIDB4NjIxNSwgMHgzOERELCAweDYyMTYsIDB4MDQ4MywgMHg2MjFBLCAweDBBNzAsIDB4NjIxQiwgMHgxMzQ3LAotICAgIDB4NjIxRCwgMHgxQTY0LCAweDYyMUUsIDB4MTM0OCwgMHg2MjFGLCAweDA3MzcsIDB4NjIyMSwgMHgxMzQ5LAotICAgIDB4NjIyMiwgMHg0MUU3LCAweDYyMjMsIDB4NDRGQSwgMHg2MjI2LCAweDBBOTMsIDB4NjIyOSwgMHgzOERFLAotICAgIDB4NjIyQSwgMHgxMzRBLCAweDYyMkUsIDB4MTM0QiwgMHg2MjJGLCAweDA2NTQsIDB4NjIzMCwgMHgxMzRDLAotICAgIDB4NjIzMSwgMHg0QkI1LCAweDYyMzIsIDB4MTM0RCwgMHg2MjMzLCAweDEzNEUsIDB4NjIzNCwgMHgwQjM3LAotICAgIDB4NjIzNiwgMHgzNUJELCAweDYyMzgsIDB4MDc4MSwgMHg2MjM5LCAweDRCQjYsIDB4NjIzQiwgMHgwRUVELAotICAgIDB4NjIzRCwgMHg0QkI3LCAweDYyM0UsIDB4MzQ0RSwgMHg2MjNGLCAweDBFNkEsIDB4NjI0MCwgMHgwOTc0LAotICAgIDB4NjI0MSwgMHgxMzRGLCAweDYyNDMsIDB4MzhERiwgMHg2MjQ2LCAweDM4RTAsIDB4NjI0NywgMHgwQTk0LAotICAgIDB4NjI0OCwgMHgxQjFBLCAweDYyNDksIDB4MEQ3NiwgMHg2MjRCLCAweDA5MTYsIDB4NjI0QywgMHgzOEUxLAotICAgIDB4NjI0RCwgMHgwODNELCAweDYyNEUsIDB4MTM1MCwgMHg2MjUxLCAweDM4RTIsIDB4NjI1MiwgMHg0NEZCLAotICAgIDB4NjI1MywgMHgwQjI3LCAweDYyNTUsIDB4MERGNywgMHg2MjU2LCAweDM4RTMsIDB4NjI1OCwgMHgwQjUxLAotICAgIDB4NjI1QSwgMHg0MUU4LCAweDYyNUIsIDB4MTM1MywgMHg2MjVFLCAweDEzNTEsIDB4NjI2MCwgMHgxMzU0LAotICAgIDB4NjI2MSwgMHg0NEZDLCAweDYyNjMsIDB4MTM1MiwgMHg2MjY0LCAweDQ0RkQsIDB4NjI2OCwgMHgxMzU1LAotICAgIDB4NjI2RCwgMHg0NEZGLCAweDYyNkUsIDB4MEUwMSwgMHg2MjZGLCAweDQxRTksIDB4NjI3MSwgMHgwNDdCLAotICAgIDB4NjI3MywgMHg0NTAwLCAweDYyNzYsIDB4MEREMCwgMHg2Mjc5LCAweDBENzcsIDB4NjI3QSwgMHg0QkI4LAotICAgIDB4NjI3QiwgMHg0NEZFLCAweDYyN0MsIDB4MTM1NiwgMHg2MjdFLCAweDEzNTksIDB4NjI3RiwgMHgwOTlELAotICAgIDB4NjI4MCwgMHgwNjU1LCAweDYyODIsIDB4MTM1NywgMHg2MjgzLCAweDEzNUUsIDB4NjI4NCwgMHgwOTlFLAotICAgIDB4NjI4NSwgMHgzNUM1LCAweDYyODksIDB4MTM1OCwgMHg2MjhBLCAweDBDRkEsIDB4NjI5MCwgMHg0QkI5LAotICAgIDB4NjI5MSwgMHgwRjQ4LCAweDYyOTIsIDB4MTM1QSwgMHg2MjkzLCAweDEzNUIsIDB4NjI5NCwgMHgxMzVGLAotICAgIDB4NjI5NSwgMHgwQzY0LCAweDYyOTYsIDB4MTM1QywgMHg2Mjk3LCAweDA3QzUsIDB4NjI5OCwgMHgwQTgyLAotICAgIDB4NjI5OSwgMHg0NTAxLCAweDYyOUIsIDB4MTM2RCwgMHg2MjlDLCAweDBENDgsIDB4NjI5RSwgMHgwQjUyLAotICAgIDB4NjJBNiwgMHgyMTEyLCAweDYyQTgsIDB4NEJCQSwgMHg2MkFCLCAweDBENzgsIDB4NjJBQywgMHgxM0IyLAotICAgIDB4NjJCMSwgMHgwRTRBLCAweDYyQjUsIDB4MEMwRCwgMHg2MkI5LCAweDBFQTMsIDB4NjJCQiwgMHgxMzYyLAotICAgIDB4NjJCQywgMHgwNTIxLCAweDYyQkQsIDB4MEJBOCwgMHg2MkMyLCAweDEzNkIsIDB4NjJDNCwgMHgzOEU0LAotICAgIDB4NjJDNSwgMHgwQjcyLCAweDYyQzYsIDB4MTM2NSwgMHg2MkM3LCAweDEzNkMsIDB4NjJDOCwgMHgxMzY3LAotICAgIDB4NjJDOSwgMHgxMzZFLCAweDYyQ0EsIDB4MTM2QSwgMHg2MkNDLCAweDEzNjksIDB4NjJDRCwgMHgwRDI1LAotICAgIDB4NjJDRiwgMHgxMzYzLCAweDYyRDAsIDB4MDU3RCwgMHg2MkQxLCAweDEzNjEsIDB4NjJEMiwgMHgwNjhCLAotICAgIDB4NjJEMywgMHgwQjUzLCAweDYyRDQsIDB4MTM1RCwgMHg2MkQ1LCAweDQ1MDIsIDB4NjJENiwgMHg0MUVBLAotICAgIDB4NjJENywgMHgxMzYwLCAweDYyRDgsIDB4MDdDNiwgMHg2MkQ5LCAweDBBN0YsIDB4NjJEQSwgMHg0QkJCLAotICAgIDB4NjJEQiwgMHgwOTlGLCAweDYyREMsIDB4MTM2OCwgMHg2MkRELCAweDBEMDgsIDB4NjJFMCwgMHgwNjhDLAotICAgIDB4NjJFMSwgMHgwNUE2LCAweDYyRUMsIDB4MDVDNSwgMHg2MkVELCAweDA5RTcsIDB4NjJFRSwgMHgxMzcwLAotICAgIDB4NjJFRiwgMHgxMzc1LCAweDYyRjEsIDB4MTM3MSwgMHg2MkYzLCAweDA3NTMsIDB4NjJGNCwgMHg0QkJDLAotICAgIDB4NjJGNSwgMHgxMzc2LCAweDYyRjYsIDB4MDg3MCwgMHg2MkY3LCAweDA3RkIsIDB4NjJGQywgMHgzOEU1LAotICAgIDB4NjJGRCwgMHg0NTA0LCAweDYyRkUsIDB4MDkzMCwgMHg2MkZGLCAweDEzNjQsIDB4NjMwMSwgMHgwOENCLAotICAgIDB4NjMwMiwgMHgxMzczLCAweDYzMDMsIDB4NDUwNSwgMHg2MzA3LCAweDA4QTYsIDB4NjMwOCwgMHgxMzc0LAotICAgIDB4NjMwOSwgMHgwNDg4LCAweDYzMEEsIDB4MzhFNiwgMHg2MzBDLCAweDEzNkYsIDB4NjMwRCwgMHgzOEU3LAotICAgIDB4NjMxMCwgMHg0NTA2LCAweDYzMTEsIDB4MEJDNSwgMHg2MzE2LCAweDRCQkQsIDB4NjMxOCwgMHgzOEU4LAotICAgIDB4NjMxOSwgMHgwNjhELCAweDYzMUIsIDB4MzczNywgMHg2MzFGLCAweDA2QUMsIDB4NjMyNywgMHgxMzcyLAotICAgIDB4NjMyOCwgMHgwNDZCLCAweDYzMkEsIDB4NEJCRSwgMHg2MzJCLCAweDA4MzMsIDB4NjMyRiwgMHgwOUZDLAotICAgIDB4NjMzMiwgMHg0NTA5LCAweDYzMzUsIDB4NDUwQSwgMHg2MzM2LCAweDRCQkYsIDB4NjMzOSwgMHgzOEU5LAotICAgIDB4NjMzQSwgMHgwQzBFLCAweDYzM0IsIDB4NDUwQiwgMHg2MzNDLCAweDQ1MEMsIDB4NjMzRCwgMHgwRDY4LAotICAgIDB4NjMzRSwgMHgxMzc4LCAweDYzM0YsIDB4MEFFMCwgMHg2MzQxLCAweDQ1MEQsIDB4NjM0MiwgMHgzOEVBLAotICAgIDB4NjM0MywgMHgzOEVCLCAweDYzNDQsIDB4NDUwRSwgMHg2MzQ2LCAweDRCQzAsIDB4NjM0OSwgMHgwQjBBLAotICAgIDB4NjM0QiwgMHg0QkMxLCAweDYzNEMsIDB4MDg3OSwgMHg2MzRELCAweDEzNzksIDB4NjM0RSwgMHg0NTBGLAotICAgIDB4NjM0RiwgMHgxMzdCLCAweDYzNTAsIDB4MTM3NywgMHg2MzUzLCAweDRCQzIsIDB4NjM1NSwgMHgwRTMxLAotICAgIDB4NjM1NywgMHgwQkQ5LCAweDYzNTksIDB4NDUxMSwgMHg2MzVDLCAweDBBREUsIDB4NjM2NSwgMHgzOEVDLAotICAgIDB4NjM2NywgMHgwRTRCLCAweDYzNjgsIDB4MDhGQSwgMHg2MzY5LCAweDEzODcsIDB4NjM2QiwgMHgxMzg2LAotICAgIDB4NjM2QywgMHg0NTE0LCAweDYzNkUsIDB4MEEzRSwgMHg2MzcxLCAweDRCQzMsIDB4NjM3MiwgMHgwNzU0LAotICAgIDB4NjM3NCwgMHgzOEVELCAweDYzNzUsIDB4NEJDNCwgMHg2Mzc2LCAweDEzODAsIDB4NjM3NywgMHgwOUExLAotICAgIDB4NjM3QSwgMHgwQ0MwLCAweDYzN0IsIDB4MENFNywgMHg2MzdDLCAweDQxRUIsIDB4NjM3RCwgMHgzOEVFLAotICAgIDB4NjM3RiwgMHg0QkM1LCAweDYzODAsIDB4MTM3RSwgMHg2MzgyLCAweDRCQzYsIDB4NjM4MywgMHgwQURGLAotICAgIDB4NjM4NCwgMHgzOEVGLCAweDYzODcsIDB4MzhGMCwgMHg2Mzg4LCAweDA5MjQsIDB4NjM4OSwgMHgxMzgzLAotICAgIDB4NjM4QSwgMHg0QkM3LCAweDYzOEMsIDB4MDlBMCwgMHg2MzhFLCAweDEzN0QsIDB4NjM4RiwgMHgxMzgyLAotICAgIDB4NjM5MCwgMHgzOEYxLCAweDYzOTIsIDB4MEQwOSwgMHg2Mzk0LCAweDQ1MTcsIDB4NjM5NiwgMHgxMzdDLAotICAgIDB4NjM5OCwgMHgwNkY3LCAweDYzOTksIDB4NDUxNSwgMHg2MzlCLCAweDA1QkIsIDB4NjM5RSwgMHgzOEYyLAotICAgIDB4NjM5RiwgMHgxMzg0LCAweDYzQTAsIDB4MEY3MywgMHg2M0ExLCAweDA4M0UsIDB4NjNBMiwgMHgwQjczLAotICAgIDB4NjNBMywgMHgxMzgxLCAweDYzQTUsIDB4MEE4MCwgMHg2M0E3LCAweDA3QzcsIDB4NjNBOCwgMHgwQTJBLAotICAgIDB4NjNBOSwgMHgwNTA4LCAweDYzQUEsIDB4MEFCRSwgMHg2M0FCLCAweDEzN0YsIDB4NjNBQywgMHgwNjVGLAotICAgIDB4NjNBRSwgMHg0QkM4LCAweDYzQUYsIDB4NEJDOSwgMHg2M0IyLCAweDA3MUQsIDB4NjNCNCwgMHgwQkVCLAotICAgIDB4NjNCNSwgMHgxMzg1LCAweDYzQkIsIDB4MEFFMSwgMHg2M0JELCAweDQ1MTgsIDB4NjNCRSwgMHgxMzg4LAotICAgIDB4NjNDMCwgMHgxMzhBLCAweDYzQzMsIDB4MEIxNywgMHg2M0M0LCAweDEzOTAsIDB4NjNDNiwgMHgxMzhCLAotICAgIDB4NjNDOSwgMHgxMzhELCAweDYzQ0YsIDB4MERCMywgMHg2M0QwLCAweDBDMEYsIDB4NjNEMSwgMHgzOEYzLAotICAgIDB4NjNEMiwgMHgxMzhFLCAweDYzRDQsIDB4NDUxOSwgMHg2M0Q1LCAweDQ1MUEsIDB4NjNENiwgMHgwRjE2LAotICAgIDB4NjNEQSwgMHgwRjMyLCAweDYzREIsIDB4MDVGNSwgMHg2M0RDLCAweDM4RjQsIDB4NjNFMCwgMHg0NTFCLAotICAgIDB4NjNFMSwgMHgwNDcyLCAweDYzRTMsIDB4MTM4QywgMHg2M0U1LCAweDQxRUMsIDB4NjNFOSwgMHgxMzg5LAotICAgIDB4NjNFQSwgMHg0QkNBLCAweDYzRUIsIDB4NDUxQywgMHg2M0VDLCAweDQ1MUQsIDB4NjNFRCwgMHgzNDFDLAotICAgIDB4NjNFRSwgMHgwNjM0LCAweDYzRjIsIDB4NDUxRSwgMHg2M0Y0LCAweDA1MDksIDB4NjNGNSwgMHgyMTEzLAotICAgIDB4NjNGNiwgMHgxMzhGLCAweDYzRjcsIDB4MzY0NCwgMHg2M0Y4LCAweDRCQ0IsIDB4NjNGOSwgMHg0QkNDLAotICAgIDB4NjNGQSwgMHgwRjMzLCAweDY0MDYsIDB4MTM5MywgMHg2NDA5LCAweDM4RjUsIDB4NjQwRCwgMHgwQjFCLAotICAgIDB4NjQwRiwgMHgxMzlBLCAweDY0MTAsIDB4MzhGNiwgMHg2NDEyLCAweDRCQ0QsIDB4NjQxMywgMHgxMzk0LAotICAgIDB4NjQxNCwgMHgxRTJDLCAweDY0MTYsIDB4MTM5MSwgMHg2NDE3LCAweDEzOTgsIDB4NjQxOCwgMHg0QkNFLAotICAgIDB4NjQxQywgMHgxMzdBLCAweDY0MUUsIDB4NDUxRiwgMHg2NDIwLCAweDRCQ0YsIDB4NjQyMiwgMHgzOEY3LAotICAgIDB4NjQyNCwgMHg0QkQwLCAweDY0MjUsIDB4NDUyMCwgMHg2NDI2LCAweDEzOTUsIDB4NjQyOCwgMHgxMzk5LAotICAgIDB4NjQyOSwgMHg0NTIxLCAweDY0MkEsIDB4NEJEMSwgMHg2NDJDLCAweDBENTYsIDB4NjQyRCwgMHgwQzY1LAotICAgIDB4NjQyRiwgMHg0NTIyLCAweDY0MzQsIDB4MTM5MiwgMHg2NDM1LCAweDRCRDIsIDB4NjQzNiwgMHgxMzk2LAotICAgIDB4NjQzQSwgMHgwNzFFLCAweDY0M0QsIDB4NEJEMywgMHg2NDNFLCAweDA4NjEsIDB4NjQzRiwgMHg0QkQ0LAotICAgIDB4NjQ0MiwgMHgwQTgxLCAweDY0NEUsIDB4MTM5RSwgMHg2NDUxLCAweDFFNDMsIDB4NjQ1MiwgMHg0QkQ1LAotICAgIDB4NjQ1NCwgMHgzOEY4LCAweDY0NTgsIDB4MEMyMCwgMHg2NDVBLCAweDQ1MjMsIDB4NjQ1QiwgMHgzOEY5LAotICAgIDB4NjQ1RCwgMHg0NTI0LCAweDY0NUYsIDB4NEJENiwgMHg2NDYwLCAweDIxMTQsIDB4NjQ2NywgMHgxMzlCLAotICAgIDB4NjQ2OSwgMHgwRThFLCAweDY0NkQsIDB4MzhGQSwgMHg2NDZGLCAweDEzOUMsIDB4NjQ3MywgMHg0NTI1LAotICAgIDB4NjQ3NCwgMHg0QkQ3LCAweDY0NzYsIDB4MTM5RCwgMHg2NDc4LCAweDBFREEsIDB4NjQ3OSwgMHg0MUVELAotICAgIDB4NjQ3QSwgMHgwQTQ2LCAweDY0N0IsIDB4MzhGQiwgMHg2NDdELCAweDQ1MjYsIDB4NjQ4MywgMHgwNzM4LAotICAgIDB4NjQ4NywgMHg0NTI3LCAweDY0ODgsIDB4MTNBNCwgMHg2NDkwLCAweDRCRDgsIDB4NjQ5MSwgMHg0NTI4LAotICAgIDB4NjQ5MiwgMHgwODgzLCAweDY0OTMsIDB4MTNBMSwgMHg2NDk1LCAweDEzQTAsIDB4NjQ5OCwgMHg0QkQ5LAotICAgIDB4NjQ5OSwgMHg0QkRBLCAweDY0OUEsIDB4MENFOCwgMHg2NDlELCAweDIxMTUsIDB4NjQ5RSwgMHgwQzhELAotICAgIDB4NjQ5RiwgMHg0NTI5LCAweDY0QTQsIDB4MEMyQiwgMHg2NEE1LCAweDEzQTIsIDB4NjRBOSwgMHgxM0EzLAotICAgIDB4NjRBQiwgMHgwREUxLCAweDY0QUMsIDB4NEJEQiwgMHg2NEFELCAweDBDRkIsIDB4NjRBRSwgMHgwODcxLAotICAgIDB4NjRCMCwgMHgwQTk1LCAweDY0QjIsIDB4MEU3RSwgMHg2NEIzLCAweDRCREMsIDB4NjRCOSwgMHgwNUE3LAotICAgIDB4NjRCQiwgMHgxM0FBLCAweDY0QkMsIDB4MTNBNSwgMHg2NEJFLCAweDM4RkMsIDB4NjRCRiwgMHgzOEZELAotICAgIDB4NjRDMSwgMHgwRjM0LCAweDY0QzIsIDB4MTNBQywgMHg2NEM0LCAweDQxRUUsIDB4NjRDNSwgMHgxM0E4LAotICAgIDB4NjRDNywgMHgxM0E5LCAweDY0Q0EsIDB4MzQxRCwgMHg2NENCLCAweDQ1MkEsIDB4NjRDQywgMHg0NTJCLAotICAgIDB4NjRDRCwgMHgwQUUyLCAweDY0Q0UsIDB4MjExNiwgMHg2NEQwLCAweDQxRUYsIDB4NjREMiwgMHgxM0E3LAotICAgIDB4NjRENCwgMHgxMzY2LCAweDY0RDUsIDB4NDUyQywgMHg2NEQ3LCAweDQ1MkQsIDB4NjREOCwgMHgxM0FCLAotICAgIDB4NjREQSwgMHgxM0E2LCAweDY0RTAsIDB4MTNCMCwgMHg2NEUxLCAweDEzQjEsIDB4NjRFMiwgMHgwQzIxLAotICAgIDB4NjRFMywgMHgxM0IzLCAweDY0RTQsIDB4NDUyRiwgMHg2NEU1LCAweDM4RkUsIDB4NjRFNiwgMHgwODcyLAotICAgIDB4NjRFNywgMHgxM0FFLCAweDY0RUMsIDB4MDY1NiwgMHg2NEVELCAweDRCREQsIDB4NjRFRiwgMHgxM0I0LAotICAgIDB4NjRGMCwgMHg0QkRFLCAweDY0RjEsIDB4MTNBRCwgMHg2NEYyLCAweDEzQjgsIDB4NjRGNCwgMHgxM0I3LAotICAgIDB4NjRGNiwgMHgxM0I2LCAweDY0RjcsIDB4MzhGRiwgMHg2NEZBLCAweDEzQjksIDB4NjRGQiwgMHgzOTAwLAotICAgIDB4NjRGRCwgMHgxM0JCLCAweDY0RkUsIDB4MDlEOSwgMHg2NEZGLCAweDQ1MzAsIDB4NjUwMCwgMHgxM0JBLAotICAgIDB4NjUwNCwgMHgzOTAxLCAweDY1MDUsIDB4MTNCRSwgMHg2NTBGLCAweDQ1MzIsIDB4NjUxNCwgMHg0NTMzLAotICAgIDB4NjUxNiwgMHgzOTAyLCAweDY1MTgsIDB4MTNCQywgMHg2NTE5LCAweDM5MDMsIDB4NjUxQiwgMHg0QkRGLAotICAgIDB4NjUxQywgMHgxM0JELCAweDY1MUQsIDB4MTM5NywgMHg2NTFFLCAweDQ1MzUsIDB4NjUxRiwgMHg0QkUwLAotICAgIDB4NjUyMiwgMHgxRTk3LCAweDY1MjMsIDB4MTNDMCwgMHg2NTI0LCAweDEzQkYsIDB4NjUyOSwgMHg0MUYwLAotICAgIDB4NjUyQSwgMHgxMzlGLCAweDY1MkIsIDB4MTNDMSwgMHg2NTJDLCAweDEzQjUsIDB4NjUyRSwgMHg0QkUxLAotICAgIDB4NjUyRiwgMHgwOEE3LCAweDY1MzIsIDB4NDUzNiwgMHg2NTM0LCAweDEzQzIsIDB4NjUzNSwgMHgxM0MzLAotICAgIDB4NjUzNiwgMHgxM0M1LCAweDY1MzcsIDB4MTNDNCwgMHg2NTM4LCAweDEzQzYsIDB4NjUzOSwgMHgwNTdFLAotICAgIDB4NjUzQiwgMHgwN0M4LCAweDY1M0UsIDB4MEU0QywgMHg2NTNGLCAweDBBNTMsIDB4NjU0NCwgMHg0NTM3LAotICAgIDB4NjU0NSwgMHgwNzgyLCAweDY1NDcsIDB4MzkwNCwgMHg2NTQ4LCAweDEzQzgsIDB4NjU0OSwgMHg0QkUyLAotICAgIDB4NjU0RCwgMHgxM0NCLCAweDY1NEUsIDB4MjExNywgMHg2NTRGLCAweDBEQzQsIDB4NjU1MSwgMHgwNjc5LAotICAgIDB4NjU1NCwgMHg0NTM4LCAweDY1NTUsIDB4MTNDQSwgMHg2NTU2LCAweDEzQzksIDB4NjU1NywgMHgwRDBBLAotICAgIDB4NjU1OCwgMHgxM0NDLCAweDY1NTksIDB4MDZBRCwgMHg2NTVELCAweDEzQ0UsIDB4NjU1RSwgMHgxM0NELAotICAgIDB4NjU2MCwgMHg0QkUzLCAweDY1NjIsIDB4MDVGNiwgMHg2NTYzLCAweDA4ODQsIDB4NjU2NiwgMHgwQ0IwLAotICAgIDB4NjU2NywgMHgzOTA1LCAweDY1NkIsIDB4NDUzOSwgMHg2NTZDLCAweDA3MUYsIDB4NjU3MCwgMHgwQTNBLAotICAgIDB4NjU3MiwgMHgxM0NGLCAweDY1NzQsIDB4MEE1NCwgMHg2NTc1LCAweDBDMjIsIDB4NjU3NywgMHgwREQxLAotICAgIDB4NjU3OCwgMHgxM0QwLCAweDY1N0EsIDB4NDUzQSwgMHg2NTgxLCAweDM5MDYsIDB4NjU4MiwgMHgxM0QxLAotICAgIDB4NjU4MywgMHgxM0QyLCAweDY1ODQsIDB4NDUzQiwgMHg2NTg1LCAweDM5MDcsIDB4NjU4NywgMHgwRTA4LAotICAgIDB4NjU4OCwgMHgxMjBDLCAweDY1ODksIDB4MEE2QSwgMHg2NThBLCAweDQ1M0MsIDB4NjU4QywgMHgwREJFLAotICAgIDB4NjU4RSwgMHgwODQ4LCAweDY1OTAsIDB4MEQ3OSwgMHg2NTkxLCAweDBENTcsIDB4NjU5MiwgMHg0QkU0LAotICAgIDB4NjU5NSwgMHg0QkU1LCAweDY1OTcsIDB4MEM0NywgMHg2NTk5LCAweDBGODksIDB4NjU5QiwgMHgxM0Q0LAotICAgIDB4NjU5QywgMHgwOEZDLCAweDY1OUQsIDB4NDFGMSwgMHg2NTlGLCAweDEzRDUsIDB4NjVBMSwgMHgwNDdBLAotICAgIDB4NjVBNCwgMHgwNkNDLCAweDY1QTUsIDB4MEE3MSwgMHg2NUE3LCAweDBERDIsIDB4NjVBQiwgMHgxM0Q2LAotICAgIDB4NjVBQywgMHgwODkwLCAweDY1QUQsIDB4MEI4NSwgMHg2NUFGLCAweDA4QTksIDB4NjVCMCwgMHgwOUZELAotICAgIDB4NjVCMiwgMHg0NTNELCAweDY1QjQsIDB4NEJFNiwgMHg2NUI1LCAweDQ1M0UsIDB4NjVCNywgMHgxM0Q3LAotICAgIDB4NjVCOCwgMHg0NTNGLCAweDY1QjksIDB4MEU0RCwgMHg2NUJDLCAweDA1MTksIDB4NjVCRCwgMHgwOEFBLAotICAgIDB4NjVCRSwgMHg0QkU3LCAweDY1QkYsIDB4NDU0MCwgMHg2NUMxLCAweDEzREEsIDB4NjVDMiwgMHgzOTA4LAotICAgIDB4NjVDMywgMHgxM0Q4LCAweDY1QzQsIDB4MTNEQiwgMHg2NUM1LCAweDBGODEsIDB4NjVDNiwgMHgxM0Q5LAotICAgIDB4NjVDOCwgMHg0QkU4LCAweDY1QzksIDB4NDU0MSwgMHg2NUNCLCAweDBBOUYsIDB4NjVDQywgMHgxM0RDLAotICAgIDB4NjVDRSwgMHg0QkU5LCAweDY1Q0YsIDB4MEIxMiwgMHg2NUQwLCAweDRCRUEsIDB4NjVEMiwgMHgxM0RELAotICAgIDB4NjVENCwgMHg0NTQyLCAweDY1RDcsIDB4MDYzNiwgMHg2NUQ5LCAweDEzREYsIDB4NjVEQiwgMHgxM0RFLAotICAgIDB4NjVERiwgMHg0QkVCLCAweDY1RTAsIDB4MTNFMCwgMHg2NUUxLCAweDEzRTEsIDB4NjVFMiwgMHgwNjM3LAotICAgIDB4NjVFMywgMHgzNTg1LCAweDY1RTUsIDB4MENENCwgMHg2NUU2LCAweDBCNzQsIDB4NjVFNywgMHgwNjg2LAotICAgIDB4NjVFOCwgMHgwOEFCLCAweDY1RTksIDB4MEFFMywgMHg2NUVDLCAweDA5NjYsIDB4NjVFRCwgMHgwNDc0LAotICAgIDB4NjVGMCwgMHgzOTA5LCAweDY1RjEsIDB4MTNFMiwgMHg2NUYyLCAweDM5MEEsIDB4NjVGOSwgMHg0NTQ0LAotICAgIDB4NjVGQSwgMHgwNTIyLCAweDY1RkIsIDB4MTNFNiwgMHg2NUZDLCAweDQ1NDUsIDB4NjYwMCwgMHgyMTE4LAotICAgIDB4NjYwMiwgMHgwN0M5LCAweDY2MDMsIDB4MTNFNSwgMHg2NjA0LCAweDQ1NDYsIDB4NjYwNiwgMHgwODFCLAotICAgIDB4NjYwNywgMHgwOUEyLCAweDY2MDgsIDB4NDU0NywgMHg2NjA5LCAweDIxMUEsIDB4NjYwQSwgMHgxM0U0LAotICAgIDB4NjYwQywgMHgwOUEzLCAweDY2MEUsIDB4MEVDQywgMHg2NjBGLCAweDA4MUEsIDB4NjYxMywgMHgwNDlCLAotICAgIDB4NjYxNCwgMHgwQTcyLCAweDY2MTUsIDB4MjExOSwgMHg2NjFDLCAweDEzRUIsIDB4NjYxRSwgMHg0RjUwLAotICAgIDB4NjYxRiwgMHgwQTU1LCAweDY2MjAsIDB4MDRFOSwgMHg2NjIxLCAweDQ1NDgsIDB4NjYyMiwgMHg0MUYzLAotICAgIDB4NjYyNCwgMHgyMTFELCAweDY2MjUsIDB4MDk1RiwgMHg2NjI3LCAweDBFOTQsIDB4NjYyOCwgMHgwODYyLAotICAgIDB4NjYyQSwgMHg0NTQ5LCAweDY2MkIsIDB4NDFGNCwgMHg2NjJDLCAweDM5MEIsIDB4NjYyRCwgMHgwOUE0LAotICAgIDB4NjYyRSwgMHgyMTFCLCAweDY2MkYsIDB4MEE0QiwgMHg2NjMwLCAweDQxRjUsIDB4NjYzMSwgMHgyMEFFLAotICAgIDB4NjYzMywgMHg0MUY2LCAweDY2MzQsIDB4MTNFQSwgMHg2NjM1LCAweDEzRTgsIDB4NjYzNiwgMHgxM0U5LAotICAgIDB4NjYzQSwgMHg0MUYyLCAweDY2M0IsIDB4MUUwMCwgMHg2NjNDLCAweDBCQTksIDB4NjYzRiwgMHgxNDA5LAotICAgIDB4NjY0MSwgMHgxM0VGLCAweDY2NDIsIDB4MDhDQywgMHg2NjQzLCAweDA3Q0EsIDB4NjY0NCwgMHgxM0VELAotICAgIDB4NjY0NSwgMHg0NTRBLCAweDY2NDgsIDB4NDFGNywgMHg2NjQ5LCAweDEzRUUsIDB4NjY0QiwgMHgwOUZFLAotICAgIDB4NjY0QywgMHgzOTBDLCAweDY2NEUsIDB4NDU0QywgMHg2NjRGLCAweDEzRUMsIDB4NjY1MSwgMHg0NTRCLAotICAgIDB4NjY1MiwgMHgwODdELCAweDY2NTcsIDB4MjExRiwgMHg2NjU5LCAweDIxMjAsIDB4NjY1QSwgMHgzNDQxLAotICAgIDB4NjY1QiwgMHgzOTBELCAweDY2NUMsIDB4MzkwRSwgMHg2NjVELCAweDEzRjEsIDB4NjY1RSwgMHgxM0YwLAotICAgIDB4NjY1RiwgMHgxM0Y1LCAweDY2NjEsIDB4MzkwRiwgMHg2NjYyLCAweDEzRjYsIDB4NjY2MywgMHgzNzNBLAotICAgIDB4NjY2NCwgMHgxM0YyLCAweDY2NjUsIDB4MjExRSwgMHg2NjY2LCAweDA1ODAsIDB4NjY2NywgMHgxM0YzLAotICAgIDB4NjY2OCwgMHgxM0Y0LCAweDY2NjksIDB4MEQ2OSwgMHg2NjZBLCAweDQ1NTEsIDB4NjY2QiwgMHgzOTEwLAotICAgIDB4NjY2QywgMHg0NTUyLCAweDY2NkQsIDB4NDU1MywgMHg2NjZFLCAweDBERDMsIDB4NjY2RiwgMHgwNzIwLAotICAgIDB4NjY3MCwgMHgxM0Y3LCAweDY2NzMsIDB4MjEyMiwgMHg2Njc0LCAweDBBNTYsIDB4NjY3NiwgMHgwOUE1LAotICAgIDB4NjY3NywgMHg0MUY5LCAweDY2NzgsIDB4NDFGQSwgMHg2NjdBLCAweDBCOTAsIDB4NjY3QiwgMHg0NTU0LAotICAgIDB4NjY3RSwgMHg0QkVDLCAweDY2ODAsIDB4NDU1NSwgMHg2NjgxLCAweDA2QkYsIDB4NjY4MywgMHgxM0Y4LAotICAgIDB4NjY4NCwgMHgxM0ZDLCAweDY2ODcsIDB4MDU0QiwgMHg2Njg4LCAweDEzRjksIDB4NjY4OSwgMHgxM0ZCLAotICAgIDB4NjY4QiwgMHg0QkVELCAweDY2OEMsIDB4NEJFRSwgMHg2NjhELCAweDQxRkIsIDB4NjY4RSwgMHgxM0ZBLAotICAgIDB4NjY5MCwgMHg0NTU2LCAweDY2OTEsIDB4MDk3NSwgMHg2NjkyLCAweDQ1NTcsIDB4NjY5NiwgMHgwQjg2LAotICAgIDB4NjY5NywgMHgwNDg5LCAweDY2OTgsIDB4MTNGRCwgMHg2Njk5LCAweDIxMjMsIDB4NjY5RCwgMHgxM0ZFLAotICAgIDB4NjZBMCwgMHgyMTI0LCAweDY2QTIsIDB4MEJDNiwgMHg2NkE0LCAweDM5MTIsIDB4NjZBNiwgMHgwRkI5LAotICAgIDB4NjZBQiwgMHgwODkxLCAweDY2QUQsIDB4NDU1OSwgMHg2NkFFLCAweDBFM0IsIDB4NjZCMSwgMHg0NTVBLAotICAgIDB4NjZCMiwgMHgyMTI1LCAweDY2QjMsIDB4NEJFRiwgMHg2NkI0LCAweDBFNkIsIDB4NjZCNSwgMHg0NTVCLAotICAgIDB4NjZCOCwgMHgxNDA1LCAweDY2QjksIDB4MTQwMCwgMHg2NkJCLCAweDQxRkMsIDB4NjZCQywgMHgxNDAzLAotICAgIDB4NjZCRSwgMHgxNDAyLCAweDY2QkYsIDB4MjEyNiwgMHg2NkMwLCAweDRCRjAsIDB4NjZDMSwgMHgxM0ZGLAotICAgIDB4NjZDNCwgMHgxNDA0LCAweDY2QzYsIDB4MzQ1NSwgMHg2NkM3LCAweDBDQjYsIDB4NjZDOCwgMHgzOTEzLAotICAgIDB4NjZDOSwgMHgxNDAxLCAweDY2Q0YsIDB4NEJGMSwgMHg2NkQ2LCAweDE0MDYsIDB4NjZEOSwgMHgwOTc2LAotICAgIDB4NjZEQSwgMHgxNDA3LCAweDY2REIsIDB4NDFGRCwgMHg2NkRDLCAweDBGMzUsIDB4NjZERCwgMHgwRDJFLAotICAgIDB4NjZFMCwgMHgxNDA4LCAweDY2RTYsIDB4MTQwQSwgMHg2NkU4LCAweDQxRkUsIDB4NjZFOSwgMHgxNDBCLAotICAgIDB4NjZFQywgMHgzOTE0LCAweDY2RjAsIDB4MTQwQywgMHg2NkYyLCAweDA2QzIsIDB4NjZGMywgMHgwNEVBLAotICAgIDB4NjZGNCwgMHgwN0NCLCAweDY2RjUsIDB4MTQwRCwgMHg2NkY3LCAweDE0MEUsIDB4NjZGOCwgMHgwOTdCLAotICAgIDB4NjZGOSwgMHgwQUU0LCAweDY2RkEsIDB4MjEyNywgMHg2NkZCLCAweDIwQjEsIDB4NjZGQywgMHgxMEVELAotICAgIDB4NjZGRCwgMHgwQUMwLCAweDY2RkUsIDB4MEFCRiwgMHg2NkZGLCAweDBCMzgsIDB4NjcwMCwgMHgwODM3LAotICAgIDB4NjcwMSwgMHg0NTVGLCAweDY3MDMsIDB4MTA0QiwgMHg2NzA1LCAweDM5MTUsIDB4NjcwOCwgMHgwNzQ0LAotICAgIDB4NjcwOSwgMHgwRjE3LCAweDY3MEIsIDB4MEU0RSwgMHg2NzBELCAweDBERjAsIDB4NjcwRSwgMHgyMTI4LAotICAgIDB4NjcwRiwgMHgxNDBGLCAweDY3MTIsIDB4NDU2MCwgMHg2NzEzLCAweDM5MTYsIDB4NjcxNCwgMHgwODYzLAotICAgIDB4NjcxNSwgMHgwQkRCLCAweDY3MTYsIDB4MTQxMCwgMHg2NzE3LCAweDBGRDUsIDB4NjcxOSwgMHg0NTYyLAotICAgIDB4NjcxQiwgMHgwRTZDLCAweDY3MUQsIDB4MEJDNywgMHg2NzFFLCAweDE0MTEsIDB4NjcxRiwgMHgwNjM4LAotICAgIDB4NjcyNSwgMHg0QkYyLCAweDY3MjYsIDB4MTQxMiwgMHg2NzI3LCAweDE0MTMsIDB4NjcyOCwgMHgwRUU2LAotICAgIDB4NjcyQSwgMHgwRUIwLCAweDY3MkIsIDB4MEVBNCwgMHg2NzJDLCAweDBFOEEsIDB4NjcyRCwgMHgwODczLAotICAgIDB4NjcyRSwgMHgxNDE1LCAweDY3MzEsIDB4MDkxNywgMHg2NzMzLCAweDM5MTcsIDB4NjczNCwgMHgwRTdGLAotICAgIDB4NjczNSwgMHg0QkYzLCAweDY3MzYsIDB4MTQxNywgMHg2NzM3LCAweDE0MUEsIDB4NjczOCwgMHgxNDE5LAotICAgIDB4NjczQSwgMHgwNjM1LCAweDY3M0QsIDB4MDY3QSwgMHg2NzNGLCAweDE0MTYsIDB4Njc0MSwgMHgxNDE4LAotICAgIDB4Njc0MywgMHgzNUI3LCAweDY3NDYsIDB4MTQxQiwgMHg2NzQ3LCAweDQxRkYsIDB4Njc0OCwgMHgzOTE4LAotICAgIDB4Njc0OSwgMHgwQTNGLCAweDY3NEMsIDB4MzkxOSwgMHg2NzRELCAweDQ1NjUsIDB4Njc0RSwgMHgwRjY1LAotICAgIDB4Njc0RiwgMHgwNDhELCAweDY3NTAsIDB4MDg1MCwgMHg2NzUxLCAweDBCMUMsIDB4Njc1MywgMHgwOTA5LAotICAgIDB4Njc1NCwgMHg0NTY2LCAweDY3NTUsIDB4NEJGNCwgMHg2NzU2LCAweDA5REIsIDB4Njc1OSwgMHgxNDFFLAotICAgIDB4Njc1QywgMHgwQzQ4LCAweDY3NUQsIDB4NDU2NywgMHg2NzVFLCAweDE0MUMsIDB4Njc1RiwgMHgwQjBCLAotICAgIDB4Njc2MCwgMHgxNDFELCAweDY3NjEsIDB4MDlEQSwgMHg2NzYyLCAweDBFRTksIDB4Njc2MywgMHgxNDFGLAotICAgIDB4Njc2NCwgMHgxNDIwLCAweDY3NjUsIDB4MEY1MiwgMHg2NzY2LCAweDIxMkEsIDB4Njc2QSwgMHgxNDI1LAotICAgIDB4Njc2RCwgMHgwN0NDLCAweDY3NkUsIDB4MzU3MSwgMHg2NzZGLCAweDBEMEIsIDB4Njc3MCwgMHgxNDIyLAotICAgIDB4Njc3MSwgMHgwQzY2LCAweDY3NzIsIDB4MTNFMywgMHg2NzczLCAweDEzRTcsIDB4Njc3NCwgMHg0NTZCLAotICAgIDB4Njc3NSwgMHgwNjY5LCAweDY3NzYsIDB4MzkxQSwgMHg2Nzc3LCAweDBDRkQsIDB4Njc3QiwgMHgzOTFCLAotICAgIDB4Njc3QywgMHgxNDI0LCAweDY3N0UsIDB4MDlBNiwgMHg2NzdGLCAweDBENTgsIDB4Njc4MCwgMHg0QkY1LAotICAgIDB4Njc4MSwgMHg0MjAwLCAweDY3ODUsIDB4MTQyQSwgMHg2Nzg3LCAweDBEOEUsIDB4Njc4OSwgMHgxNDIxLAotICAgIDB4Njc4QiwgMHgxNDI3LCAweDY3OEMsIDB4MTQyNiwgMHg2NzhGLCAweDRCRjYsIDB4Njc5MCwgMHgwQTczLAotICAgIDB4Njc5MSwgMHg0QkY3LCAweDY3OTIsIDB4NDU2RCwgMHg2NzkzLCAweDQyMDEsIDB4Njc5NSwgMHgwRTlCLAotICAgIDB4Njc5NywgMHgwRjlCLCAweDY3OTgsIDB4NDIwMiwgMHg2NzlBLCAweDBFOTUsIDB4Njc5QiwgMHg0MjAzLAotICAgIDB4Njc5QywgMHgwNTRDLCAweDY3OUQsIDB4MDhBQywgMHg2N0EwLCAweDBGRUUsIDB4NjdBMSwgMHgxNDI5LAotICAgIDB4NjdBMiwgMHgwQTNCLCAweDY3QTQsIDB4NEJGOCwgMHg2N0E2LCAweDE0MjgsIDB4NjdBOSwgMHgxNDIzLAotICAgIDB4NjdBRiwgMHgwNzgzLCAweDY3QjAsIDB4MzkxQywgMHg2N0IxLCAweDRCRjksIDB4NjdCMiwgMHgzOTFELAotICAgIDB4NjdCMywgMHgxNDJGLCAweDY3QjQsIDB4MTQyRCwgMHg2N0I1LCAweDRCRkEsIDB4NjdCNiwgMHgwNTRELAotICAgIDB4NjdCNywgMHgxNDJCLCAweDY3QjgsIDB4MTQzMSwgMHg2N0I5LCAweDE0MzcsIDB4NjdCQiwgMHgyMTJCLAotICAgIDB4NjdCRSwgMHg0QkZCLCAweDY3QzAsIDB4MjEyRCwgMHg2N0MxLCAweDBCMjgsIDB4NjdDMywgMHg0NTcxLAotICAgIDB4NjdDNCwgMHgwRTExLCAweDY3QzYsIDB4MTQzOSwgMHg2N0M4LCAweDQ1NzIsIDB4NjdDQSwgMHgwRDk0LAotICAgIDB4NjdDRSwgMHgxNDM4LCAweDY3Q0YsIDB4MEQyNiwgMHg2N0QwLCAweDBFNkQsIDB4NjdEMSwgMHgwNUY3LAotICAgIDB4NjdEMiwgMHg0NTczLCAweDY3RDMsIDB4MEE5QiwgMHg2N0Q0LCAweDA5NEEsIDB4NjdENywgMHgzOTFGLAotICAgIDB4NjdEOCwgMHgwQkVGLCAweDY3RDksIDB4MzkyMCwgMHg2N0RBLCAweDBGMTgsIDB4NjdEQiwgMHg0NTc0LAotICAgIDB4NjdERCwgMHgxNDM0LCAweDY3REUsIDB4MTQzMywgMHg2N0UyLCAweDE0MzUsIDB4NjdFNCwgMHgxNDMyLAotICAgIDB4NjdFNywgMHgxNDNBLCAweDY3RTksIDB4MTQzMCwgMHg2N0VDLCAweDE0MkUsIDB4NjdFRSwgMHgxNDM2LAotICAgIDB4NjdFRiwgMHgxNDJDLCAweDY3RjAsIDB4MzkyMSwgMHg2N0YxLCAweDBCQUEsIDB4NjdGMywgMHgwRjA0LAotICAgIDB4NjdGNCwgMHgwOEYyLCAweDY3RjUsIDB4MDg2NCwgMHg2N0Y3LCAweDQ1NzUsIDB4NjdGOSwgMHgzOTFFLAotICAgIDB4NjdGQSwgMHgxRTlBLCAweDY3RkIsIDB4MDgyQSwgMHg2N0ZDLCAweDQyMDQsIDB4NjdGRSwgMHgwRTlELAotICAgIDB4NjdGRiwgMHgwNTlGLCAweDY4MDEsIDB4MzZGMiwgMHg2ODAyLCAweDBCRUEsIDB4NjgwMywgMHgwQ0EyLAotICAgIDB4NjgwNCwgMHgwNEVCLCAweDY4MDUsIDB4MUUwNywgMHg2ODEwLCAweDQ1NzAsIDB4NjgxMywgMHgwQTk2LAotICAgIDB4NjgxNiwgMHgwQTU4LCAweDY4MTcsIDB4MDcwMCwgMHg2ODE4LCAweDQ1NzksIDB4NjgxRCwgMHg0MjA1LAotICAgIDB4NjgxRSwgMHgxNDNDLCAweDY4MUYsIDB4NDU3QSwgMHg2ODIxLCAweDA3Q0QsIDB4NjgyMiwgMHgwNURBLAotICAgIDB4NjgyOCwgMHg0QkZDLCAweDY4MjksIDB4MTQzRSwgMHg2ODJBLCAweDA1RDIsIDB4NjgyQiwgMHgxNDQ0LAotICAgIDB4NjgyQywgMHgzOTIyLCAweDY4MkQsIDB4NDU3QiwgMHg2ODMwLCAweDM5MjMsIDB4NjgzMSwgMHgzOTI0LAotICAgIDB4NjgzMiwgMHgxNDQxLCAweDY4MzMsIDB4NDU3RCwgMHg2ODM0LCAweDBBOTcsIDB4NjgzOCwgMHgwNUE5LAotICAgIDB4NjgzOSwgMHgwODFDLCAweDY4M0IsIDB4NDU3RSwgMHg2ODNDLCAweDA1QTgsIDB4NjgzRCwgMHgwODNGLAotICAgIDB4NjgzRSwgMHg0NTdGLCAweDY4NDAsIDB4MTQzRiwgMHg2ODQxLCAweDA3M0IsIDB4Njg0MiwgMHgwNzIxLAotICAgIDB4Njg0MywgMHgwQzY3LCAweDY4NDQsIDB4MjEyRiwgMHg2ODQ1LCAweDQ1ODAsIDB4Njg0NiwgMHgxNDNELAotICAgIDB4Njg0OCwgMHgwNDhBLCAweDY4NDksIDB4NDU4MSwgMHg2ODRDLCAweDQ1ODIsIDB4Njg0RCwgMHgxNDQwLAotICAgIDB4Njg0RSwgMHgxNDQyLCAweDY4NTAsIDB4MDZDNSwgMHg2ODUxLCAweDA3MDIsIDB4Njg1MiwgMHgyMTJDLAotICAgIDB4Njg1MywgMHgwNUY4LCAweDY4NTQsIDB4MDY2NSwgMHg2ODU1LCAweDQ1ODMsIDB4Njg1NywgMHg0NTg0LAotICAgIDB4Njg1OSwgMHgxNDQ1LCAweDY4NUIsIDB4MzkyNSwgMHg2ODVDLCAweDA4NjksIDB4Njg1RCwgMHgwRTlGLAotICAgIDB4Njg1RiwgMHgwODg1LCAweDY4NjMsIDB4MTQ0NiwgMHg2ODY3LCAweDBEQTIsIDB4Njg2QiwgMHg0NTg2LAotICAgIDB4Njg2RSwgMHg0NTg3LCAweDY4NzIsIDB4MzkyNiwgMHg2ODc0LCAweDE0NTIsIDB4Njg3NSwgMHgzOTI3LAotICAgIDB4Njg3NiwgMHgwNTMzLCAweDY4NzcsIDB4MTQ0NywgMHg2ODdBLCAweDM5MjgsIDB4Njg3QywgMHg0NTg4LAotICAgIDB4Njg3RSwgMHgxNDU4LCAweDY4N0YsIDB4MTQ0OCwgMHg2ODgxLCAweDBGOEEsIDB4Njg4MiwgMHg0NTg5LAotICAgIDB4Njg4MywgMHgxNDRGLCAweDY4ODQsIDB4MzkyOSwgMHg2ODg1LCAweDBEMTUsIDB4Njg4NiwgMHg0QkZELAotICAgIDB4Njg4RCwgMHgxNDU3LCAweDY4OEUsIDB4MUU5QywgMHg2ODhGLCAweDE0NEEsIDB4Njg5MCwgMHg0NThBLAotICAgIDB4Njg5MywgMHgwNDc4LCAweDY4OTQsIDB4MTQ0QywgMHg2ODk2LCAweDQ1OEIsIDB4Njg5NywgMHgwN0NFLAotICAgIDB4Njg5OCwgMHg0NThELCAweDY4OTksIDB4NDU4RSwgMHg2ODlBLCAweDQ1OEYsIDB4Njg5QiwgMHgxNDRFLAotICAgIDB4Njg5QywgMHg0NTkwLCAweDY4OUQsIDB4MTQ0RCwgMHg2ODlGLCAweDE0NDksIDB4NjhBMCwgMHgxNDU0LAotICAgIDB4NjhBMiwgMHgwOUE3LCAweDY4QTMsIDB4NDIwNiwgMHg2OEE1LCAweDM5MkEsIDB4NjhBNiwgMHgxMUJFLAotICAgIDB4NjhBNywgMHgwNzlDLCAweDY4QTgsIDB4MEY2NiwgMHg2OEFBLCAweDQ1OTEsIDB4NjhBQiwgMHg0NTkyLAotICAgIDB4NjhBRCwgMHgxNDRCLCAweDY4QUYsIDB4MEMxMCwgMHg2OEIwLCAweDA1ODEsIDB4NjhCMSwgMHgwODFELAotICAgIDB4NjhCMiwgMHgzOTJCLCAweDY4QjMsIDB4MTQ0MywgMHg2OEI0LCAweDQ1OTMsIDB4NjhCNSwgMHgxNDUzLAotICAgIDB4NjhCNiwgMHgwNUJGLCAweDY4QjksIDB4MTQ1MSwgMHg2OEJBLCAweDE0NTUsIDB4NjhCQiwgMHg0NTk0LAotICAgIDB4NjhCQywgMHgwQzY4LCAweDY4QzMsIDB4NDU5OCwgMHg2OEM0LCAweDA2M0EsIDB4NjhDNSwgMHg0NTk5LAotICAgIDB4NjhDNiwgMHgxNDczLCAweDY4QzgsIDB4MjBBRiwgMHg2OEM5LCAweDBFRDUsIDB4NjhDQSwgMHgxNDVBLAotICAgIDB4NjhDQiwgMHgwNjM5LCAweDY4Q0MsIDB4NDU5QSwgMHg2OENELCAweDE0NjEsIDB4NjhDRiwgMHgyMTMwLAotICAgIDB4NjhEMCwgMHgzOTJDLCAweDY4RDIsIDB4MEU2RSwgMHg2OEQ0LCAweDE0NjIsIDB4NjhENSwgMHgxNDY0LAotICAgIDB4NjhENiwgMHgzOTJELCAweDY4RDcsIDB4MTQ2OCwgMHg2OEQ4LCAweDE0NUMsIDB4NjhEOSwgMHg0NTlCLAotICAgIDB4NjhEQSwgMHgwQjY4LCAweDY4REYsIDB4MEM2OSwgMHg2OEUwLCAweDE0NkMsIDB4NjhFMSwgMHgxNDVGLAotICAgIDB4NjhFMywgMHgxNDY5LCAweDY4RTQsIDB4NDU5QywgMHg2OEU1LCAweDQ1OUQsIDB4NjhFNywgMHgxNDYzLAotICAgIDB4NjhFOCwgMHgzOTJFLCAweDY4RUIsIDB4NEJGRSwgMHg2OEVDLCAweDQ1OUUsIDB4NjhFRCwgMHgzOTJGLAotICAgIDB4NjhFRSwgMHgwOUZGLCAweDY4RUYsIDB4MTQ2RCwgMHg2OEYwLCAweDM5MzAsIDB4NjhGMSwgMHgzOTMxLAotICAgIDB4NjhGMiwgMHgwQTU3LCAweDY4RjUsIDB4NEJGRiwgMHg2OEY3LCAweDQ1OUYsIDB4NjhGOSwgMHgxNDZCLAotICAgIDB4NjhGQSwgMHgwNUY5LCAweDY4RkIsIDB4NDU5NSwgMHg2OEZDLCAweDM5MzIsIDB4NjkwMCwgMHgwRkY2LAotICAgIDB4NjkwMSwgMHgxNDU5LCAweDY5MDMsIDB4NDVBMCwgMHg2OTA0LCAweDE0NjcsIDB4NjkwNSwgMHgwNDlDLAotICAgIDB4NjkwNywgMHg0NUExLCAweDY5MDgsIDB4MTQ1QiwgMHg2OTBBLCAweDQyMDcsIDB4NjkwQiwgMHgwRUM2LAotICAgIDB4NjkwQywgMHgxNDYwLCAweDY5MEQsIDB4MDlFOCwgMHg2OTBFLCAweDBCRTMsIDB4NjkwRiwgMHgxNDU2LAotICAgIDB4NjkxMSwgMHgzOTMzLCAweDY5MTIsIDB4MTQ2NiwgMHg2OTEzLCAweDM5MzQsIDB4NjkxNywgMHg0QzAwLAotICAgIDB4NjkxOSwgMHgwQTQwLCAweDY5MUEsIDB4MTQ3MCwgMHg2OTFCLCAweDA1Q0YsIDB4NjkxQywgMHgwNzU1LAotICAgIDB4NjkyMSwgMHgxNDcyLCAweDY5MjIsIDB4MTQ1RCwgMHg2OTIzLCAweDE0NzEsIDB4NjkyNSwgMHgxNDZBLAotICAgIDB4NjkyNiwgMHgxNDVFLCAweDY5MjgsIDB4MTQ2RSwgMHg2OTJBLCAweDE0NkYsIDB4NjkzMCwgMHgxNDgwLAotICAgIDB4NjkzMywgMHg0QzAxLCAweDY5MzQsIDB4MENBNiwgMHg2OTM1LCAweDM5MzUsIDB4NjkzNiwgMHgxNDY1LAotICAgIDB4NjkzOCwgMHg0QzAyLCAweDY5MzksIDB4MTQ3QywgMHg2OTNCLCAweDM5MzYsIDB4NjkzRCwgMHgxNDdFLAotICAgIDB4NjkzRiwgMHgwQkY0LCAweDY5NDIsIDB4NDIwQSwgMHg2OTQ2LCAweDQ1QTUsIDB4Njk0OSwgMHg0MjA4LAotICAgIDB4Njk0QSwgMHgwRjM2LCAweDY5NTMsIDB4MERFOCwgMHg2OTU0LCAweDE0NzksIDB4Njk1NSwgMHgwQjJBLAotICAgIDB4Njk1NywgMHgzOTM3LCAweDY5NTksIDB4MTQ3RiwgMHg2OTVBLCAweDBBQzEsIDB4Njk1QiwgMHg0QzAzLAotICAgIDB4Njk1QywgMHgxNDc2LCAweDY5NUQsIDB4MTQ4MywgMHg2OTVFLCAweDE0ODIsIDB4Njk2MCwgMHgwQ0M3LAotICAgIDB4Njk2MSwgMHgxNDgxLCAweDY5NjIsIDB4MENDMiwgMHg2OTYzLCAweDM5MzgsIDB4Njk2NCwgMHg0MjBCLAotICAgIDB4Njk2NSwgMHg0QzA0LCAweDY5NjgsIDB4MjEzMiwgMHg2OTY5LCAweDQ1QTYsIDB4Njk2QSwgMHgxNDg1LAotICAgIDB4Njk2QiwgMHgxNDc4LCAweDY5NkMsIDB4NDVBNywgMHg2OTZELCAweDA2QzAsIDB4Njk2RSwgMHgxNDdCLAotICAgIDB4Njk2RiwgMHgwOTY3LCAweDY5NzIsIDB4MzkzOSwgMHg2OTczLCAweDBEMTYsIDB4Njk3NCwgMHgxNDdELAotICAgIDB4Njk3NSwgMHgwNkMzLCAweDY5NzcsIDB4MTQ3NSwgMHg2OTc4LCAweDE0NzcsIDB4Njk3OSwgMHgxNDc0LAotICAgIDB4Njk3QSwgMHg0NUE4LCAweDY5N0MsIDB4MEZENiwgMHg2OTdELCAweDA1QjgsIDB4Njk3RSwgMHgxNDdBLAotICAgIDB4Njk3RiwgMHgzOTNBLCAweDY5ODAsIDB4MzkzQiwgMHg2OTgxLCAweDE0ODQsIDB4Njk4MiwgMHgwNTkzLAotICAgIDB4Njk4NiwgMHgzNzQwLCAweDY5OEEsIDB4MDg1NywgMHg2OThFLCAweDA0RkYsIDB4Njk5MSwgMHgxNDk1LAotICAgIDB4Njk5MiwgMHg0NUE5LCAweDY5OTQsIDB4MEZENywgMHg2OTk1LCAweDE0OTgsIDB4Njk5NiwgMHg0NUFCLAotICAgIDB4Njk5OCwgMHgyMTM0LCAweDY5OUIsIDB4MEEwMCwgMHg2OTlDLCAweDE0OTcsIDB4NjlBMCwgMHgxNDk2LAotICAgIDB4NjlBNSwgMHg0MjBDLCAweDY5QTYsIDB4MzkzQywgMHg2OUE3LCAweDE0OTMsIDB4NjlBOCwgMHg0QzA1LAotICAgIDB4NjlBQiwgMHg0QzA2LCAweDY5QUQsIDB4MzkzRCwgMHg2OUFFLCAweDE0ODcsIDB4NjlBRiwgMHg0QzA3LAotICAgIDB4NjlCMCwgMHg0NUFDLCAweDY5QjEsIDB4MTRBNCwgMHg2OUIyLCAweDE0ODYsIDB4NjlCNCwgMHgxNDk5LAotICAgIDB4NjlCNywgMHgzOTNFLCAweDY5QkEsIDB4NDVBRCwgMHg2OUJCLCAweDE0OTEsIDB4NjlCQywgMHg0NUFFLAotICAgIDB4NjlCRSwgMHgxNDhDLCAweDY5QkYsIDB4MTQ4OSwgMHg2OUMwLCAweDQ1QUYsIDB4NjlDMSwgMHgxNDhBLAotICAgIDB4NjlDMywgMHgxNDkyLCAweDY5QzcsIDB4MUQzMywgMHg2OUNBLCAweDE0OEYsIDB4NjlDQiwgMHgwN0NGLAotICAgIDB4NjlDQywgMHgwQkU0LCAweDY5Q0QsIDB4MEFFNiwgMHg2OUNFLCAweDE0OEQsIDB4NjlDRiwgMHg0MjBELAotICAgIDB4NjlEMCwgMHgxNDg4LCAweDY5RDEsIDB4NDVCMCwgMHg2OUQzLCAweDE0OEIsIDB4NjlENiwgMHgzOTNGLAotICAgIDB4NjlENywgMHgzOTQwLCAweDY5RDgsIDB4MEYzNywgMHg2OUQ5LCAweDBFOTgsIDB4NjlERCwgMHgxNDkwLAotICAgIDB4NjlERSwgMHgxNDlBLCAweDY5RTIsIDB4MjEzNSwgMHg2OUUzLCAweDQ1QjQsIDB4NjlFNSwgMHg0QzA4LAotICAgIDB4NjlFNywgMHgxNEEyLCAweDY5RTgsIDB4MTQ5QiwgMHg2OUU5LCAweDQyMTAsIDB4NjlFQSwgMHgzNDExLAotICAgIDB4NjlFQiwgMHgxNEE4LCAweDY5RUQsIDB4MTRBNiwgMHg2OUVFLCAweDQ1QjUsIDB4NjlFRiwgMHg0NUI2LAotICAgIDB4NjlGMSwgMHg0QzA5LCAweDY5RjIsIDB4MTRBMSwgMHg2OUYzLCAweDQ1QjcsIDB4NjlGNCwgMHg0NUI5LAotICAgIDB4NjlGNSwgMHg0MjExLCAweDY5RjYsIDB4MzczRiwgMHg2OUY5LCAweDE0QTAsIDB4NjlGQiwgMHgwQkVDLAotICAgIDB4NjlGRCwgMHgwQUU3LCAweDY5RkUsIDB4NDVCQSwgMHg2OUZGLCAweDE0OUUsIDB4NkEwMSwgMHgzOTQxLAotICAgIDB4NkEwMiwgMHgxNDlDLCAweDZBMDUsIDB4MTRBMywgMHg2QTBBLCAweDE0QTksIDB4NkEwQiwgMHgwRDg5LAotICAgIDB4NkEwQywgMHgxNEFGLCAweDZBMEYsIDB4Mzk0MiwgMHg2QTExLCAweDQ1QkIsIDB4NkExMiwgMHgxNEFBLAotICAgIDB4NkExMywgMHgxNEFELCAweDZBMTQsIDB4MTRBNywgMHg2QTE1LCAweDM5NDMsIDB4NkExNywgMHgwQkIyLAotICAgIDB4NkExOSwgMHgwREFBLCAweDZBMUEsIDB4NDVCQywgMHg2QTFCLCAweDE0OUQsIDB4NkExRCwgMHg0NUJELAotICAgIDB4NkExRSwgMHgxNEE1LCAweDZBMUYsIDB4MDlBOCwgMHg2QTIxLCAweDBFREIsIDB4NkEyMiwgMHgxNEI5LAotICAgIDB4NkEyMywgMHgxNEFDLCAweDZBMjgsIDB4Mzk0NCwgMHg2QTI5LCAweDA3NTYsIDB4NkEyQSwgMHgwNTIzLAotICAgIDB4NkEyQiwgMHgwNUJELCAweDZBMkUsIDB4MTQ5NCwgMHg2QTMwLCAweDIxMzYsIDB4NkEzMiwgMHg0NUJGLAotICAgIDB4NkEzMywgMHg0NUMwLCAweDZBMzQsIDB4Mzk0NSwgMHg2QTM1LCAweDA5QTksIDB4NkEzNiwgMHgxNEIxLAotICAgIDB4NkEzOCwgMHgxNEI4LCAweDZBMzksIDB4MDkyNSwgMHg2QTNBLCAweDA1RDAsIDB4NkEzQiwgMHg0MjEzLAotICAgIDB4NkEzRCwgMHgwQjZDLCAweDZBM0UsIDB4Mzk0NiwgMHg2QTNGLCAweDQ1QzEsIDB4NkE0NCwgMHgxNEFFLAotICAgIDB4NkE0NSwgMHgzOTQ3LCAweDZBNDYsIDB4MjEzOCwgMHg2QTQ3LCAweDE0QjMsIDB4NkE0OCwgMHgxNEI3LAotICAgIDB4NkE0OSwgMHg0NUMyLCAweDZBNEEsIDB4NEMwQSwgMHg2QTRCLCAweDA2QUUsIDB4NkE0RSwgMHg0NUM0LAotICAgIDB4NkE1MCwgMHgzOTQ4LCAweDZBNTEsIDB4Mzk0OSwgMHg2QTUyLCAweDQ1QzUsIDB4NkE1NCwgMHgzQzM0LAotICAgIDB4NkE1NSwgMHg0QzBCLCAweDZBNTYsIDB4Mzk0QSwgMHg2QTU4LCAweDA2NjYsIDB4NkE1OSwgMHgxNEI1LAotICAgIDB4NkE1QiwgMHgzOTRCLCAweDZBNUYsIDB4MDYzQiwgMHg2QTYxLCAweDBDQTMsIDB4NkE2MiwgMHgxNEI0LAotICAgIDB4NkE2NCwgMHg0NUM2LCAweDZBNjYsIDB4MTRCNiwgMHg2QTY3LCAweDRDMEMsIDB4NkE2QiwgMHgyMTM3LAotICAgIDB4NkE3MSwgMHg0QzBELCAweDZBNzIsIDB4MTRCMCwgMHg2QTczLCAweDIxMzksIDB4NkE3OCwgMHgxNEIyLAotICAgIDB4NkE3QSwgMHg0NUMzLCAweDZBN0UsIDB4MjEzQSwgMHg2QTdGLCAweDA1QkUsIDB4NkE4MCwgMHgwQjg3LAotICAgIDB4NkE4MywgMHgzOTRDLCAweDZBODQsIDB4MTRCRCwgMHg2QTg5LCAweDM5NEQsIDB4NkE4QiwgMHg0NUM4LAotICAgIDB4NkE4RCwgMHgxNEJCLCAweDZBOEUsIDB4MDc5RCwgMHg2QTkwLCAweDE0QkEsIDB4NkE5MSwgMHgzOTRFLAotICAgIDB4NkE5NCwgMHg0MjE1LCAweDZBOTcsIDB4MTRDMCwgMHg2QTlDLCAweDE0M0IsIDB4NkE5RCwgMHgzOTRGLAotICAgIDB4NkE5RSwgMHgzOTUwLCAweDZBOUYsIDB4Mzk1MSwgMHg2QUEwLCAweDE0QkMsIDB4NkFBMSwgMHg0NUNBLAotICAgIDB4NkFBMiwgMHgxNEJFLCAweDZBQTMsIDB4MTRCRiwgMHg2QUE1LCAweDQyMTYsIDB4NkFBQSwgMHgxNENCLAotICAgIDB4NkFBQiwgMHg0NUNDLCAweDZBQUMsIDB4MTRDNywgMHg2QUFFLCAweDE0NTAsIDB4NkFBRiwgMHg0QzBFLAotICAgIDB4NkFCMywgMHgxNEM2LCAweDZBQjgsIDB4MTRDNSwgMHg2QUJCLCAweDE0QzIsIDB4NkFCRCwgMHg0NUNELAotICAgIDB4NkFDMSwgMHgxNEFCLCAweDZBQzIsIDB4MTRDNCwgMHg2QUMzLCAweDE0QzMsIDB4NkFDNiwgMHg0NUNFLAotICAgIDB4NkFDOCwgMHg0QzBGLCAweDZBQzksIDB4NEMxMCwgMHg2QUQwLCAweDQ1RDAsIDB4NkFEMSwgMHgxNEM5LAotICAgIDB4NkFEMywgMHgwRkNDLCAweDZBRDQsIDB4NDVDRiwgMHg2QURBLCAweDE0Q0MsIDB4NkFEQiwgMHgwNkYzLAotICAgIDB4NkFEQywgMHgzOTUyLCAweDZBREQsIDB4NDVEMSwgMHg2QURFLCAweDE0QzgsIDB4NkFERiwgMHgxNENBLAotICAgIDB4NkFFMiwgMHgyMTNCLCAweDZBRTQsIDB4MjEzQywgMHg2QUU3LCAweDM5NTMsIDB4NkFFOCwgMHgwRDNCLAotICAgIDB4NkFFQSwgMHgxNENELCAweDZBRUMsIDB4Mzk1NCwgMHg2QUYxLCAweDQ1RDQsIDB4NkFGMiwgMHg0NUQ1LAotICAgIDB4NkFGMywgMHg0NUQ2LCAweDZBRjgsIDB4NEVCOCwgMHg2QUZBLCAweDE0RDEsIDB4NkFGQiwgMHgxNENFLAotICAgIDB4NkFGRCwgMHg0NUQ3LCAweDZCMDMsIDB4NEMxMSwgMHg2QjA0LCAweDBGNUQsIDB4NkIwNSwgMHgxNENGLAotICAgIDB4NkIwQSwgMHgxNDlGLCAweDZCMEIsIDB4NDVEOSwgMHg2QjBGLCAweDQ1REEsIDB4NkIxMCwgMHg0NURCLAotICAgIDB4NkIxMSwgMHg0NURDLCAweDZCMTIsIDB4MTREMiwgMHg2QjE2LCAweDE0RDMsIDB4NkIxNywgMHg0NURFLAotICAgIDB4NkIxQiwgMHg0MjE4LCAweDZCMUQsIDB4MDRENywgMHg2QjFFLCAweDM5NTUsIDB4NkIxRiwgMHgxNEQ1LAotICAgIDB4NkIyMCwgMHgwNzNELCAweDZCMjEsIDB4MDhDRCwgMHg2QjIzLCAweDA2Q0QsIDB4NkIyNCwgMHgzOTU2LAotICAgIDB4NkIyNywgMHgwNTI0LCAweDZCMkMsIDB4NDIxOSwgMHg2QjJGLCAweDQ1RTAsIDB4NkIzMiwgMHgwRjQ5LAotICAgIDB4NkIzNSwgMHgzOTU3LCAweDZCMzcsIDB4MTRENywgMHg2QjM4LCAweDE0RDYsIDB4NkIzOSwgMHgxNEQ5LAotICAgIDB4NkIzQSwgMHgwNjU3LCAweDZCM0IsIDB4NEMxMiwgMHg2QjNELCAweDA2Q0UsIDB4NkIzRSwgMHgwNUZBLAotICAgIDB4NkIzRiwgMHg0QzEzLCAweDZCNDMsIDB4MTREQywgMHg2QjQ2LCAweDM5NTgsIDB4NkI0NywgMHgxNERCLAotICAgIDB4NkI0OSwgMHgxNERELCAweDZCNEEsIDB4NDVFMSwgMHg2QjRDLCAweDA1NEUsIDB4NkI0RSwgMHgwQjc1LAotICAgIDB4NkI1MCwgMHgxNERFLCAweDZCNTMsIDB4MDVGQiwgMHg2QjU0LCAweDE0RTAsIDB4NkI1NiwgMHgzOTU5LAotICAgIDB4NkI1OCwgMHg0NUUyLCAweDZCNTksIDB4MTRERiwgMHg2QjVCLCAweDE0RTEsIDB4NkI1RiwgMHgxNEUyLAotICAgIDB4NkI2MCwgMHgzOTVBLCAweDZCNjEsIDB4MTRFMywgMHg2QjYyLCAweDA4QUQsIDB4NkI2MywgMHgwQTU5LAotICAgIDB4NkI2NCwgMHgwODExLCAweDZCNjUsIDB4MzQ0QSwgMHg2QjY2LCAweDBERTIsIDB4NkI2NywgMHg0MjFBLAotICAgIDB4NkI2OSwgMHgwRTMyLCAweDZCNkEsIDB4MEZFQSwgMHg2QjZDLCAweDQ1RTMsIDB4NkI2RiwgMHgwOEMzLAotICAgIDB4NkI3MiwgMHgzNUQ5LCAweDZCNzMsIDB4MDg0MCwgMHg2Qjc0LCAweDBGQkEsIDB4NkI3NSwgMHg0NUU0LAotICAgIDB4NkI3NywgMHgzNDU2LCAweDZCNzgsIDB4MTRFNCwgMHg2Qjc5LCAweDE0RTUsIDB4NkI3QSwgMHg0NUU1LAotICAgIDB4NkI3QiwgMHgwOEFFLCAweDZCN0QsIDB4NEMxNCwgMHg2QjdFLCAweDRDMTUsIDB4NkI3RiwgMHgxNEU2LAotICAgIDB4NkI4MCwgMHgxNEU3LCAweDZCODEsIDB4NDVFNiwgMHg2QjgyLCAweDM5NUIsIDB4NkI4MywgMHgxNEU5LAotICAgIDB4NkI4NCwgMHgxNEU4LCAweDZCODYsIDB4MEU4NiwgMHg2Qjg5LCAweDA5NjgsIDB4NkI4QSwgMHgwOTE4LAotICAgIDB4NkI4QiwgMHgwODkyLCAweDZCOEQsIDB4MTRFQSwgMHg2Qjk1LCAweDE0RUMsIDB4NkI5NiwgMHgwOUU5LAotICAgIDB4NkI5OCwgMHgxNEVCLCAweDZCOUIsIDB4NDVFNywgMHg2QjlFLCAweDE0RUQsIDB4NkJBNCwgMHgxNEVFLAotICAgIDB4NkJBOSwgMHg0MjFCLCAweDZCQUEsIDB4MTRFRiwgMHg2QkFCLCAweDE0RjAsIDB4NkJBRCwgMHg0MjFDLAotICAgIDB4NkJBRSwgMHg0NUU4LCAweDZCQUYsIDB4MTRGMSwgMHg2QkIwLCAweDRDMTYsIDB4NkJCMSwgMHgxNEYzLAotICAgIDB4NkJCMiwgMHgxNEYyLCAweDZCQjMsIDB4MTRGNCwgMHg2QkI0LCAweDA1MjUsIDB4NkJCNSwgMHgwQjg4LAotICAgIDB4NkJCNywgMHgxNEY1LCAweDZCQkEsIDB4MDg3NCwgMHg2QkJCLCAweDA1QUEsIDB4NkJCQywgMHgxNEY2LAotICAgIDB4NkJCRCwgMHg0NUVBLCAweDZCQkUsIDB4Mzk1QywgMHg2QkJGLCAweDBDM0MsIDB4NkJDMCwgMHgxMTlELAotICAgIDB4NkJDNSwgMHgwNjNELCAweDZCQzYsIDB4MTRGNywgMHg2QkM3LCAweDQ1RUIsIDB4NkJDOCwgMHg0NUVDLAotICAgIDB4NkJDOSwgMHg0NUVELCAweDZCQ0IsIDB4MTRGOCwgMHg2QkNDLCAweDM3NDQsIDB4NkJDRCwgMHgwRTNDLAotICAgIDB4NkJDRSwgMHgwRTk2LCAweDZCQ0YsIDB4MzQ0QywgMHg2QkQyLCAweDBDOUYsIDB4NkJEMywgMHgxNEY5LAotICAgIDB4NkJENCwgMHgwRDdBLCAweDZCRDYsIDB4MjEzRCwgMHg2QkQ3LCAweDQyMUQsIDB4NkJEOCwgMHgwRDhGLAotICAgIDB4NkJEQSwgMHg0NUVFLCAweDZCREIsIDB4MEVERiwgMHg2QkRGLCAweDE0RkEsIDB4NkJFMSwgMHgzOTVELAotICAgIDB4NkJFNiwgMHg0NUVGLCAweDZCRTcsIDB4NDVGMCwgMHg2QkVCLCAweDE0RkMsIDB4NkJFQywgMHgxNEZCLAotICAgIDB4NkJFRSwgMHg0NUYxLCAweDZCRUYsIDB4MTRGRSwgMHg2QkYxLCAweDM5NUUsIDB4NkJGMywgMHgxNEZELAotICAgIDB4NkJGNywgMHg0QzE3LCAweDZCRjksIDB4NEMxOCwgMHg2QkZGLCAweDQyMUUsIDB4NkMwMiwgMHg0NUYyLAotICAgIDB4NkMwNCwgMHg0QzE5LCAweDZDMDUsIDB4NDIxRiwgMHg2QzA4LCAweDE1MDAsIDB4NkMwOSwgMHg0QzFBLAotICAgIDB4NkMwQSwgMHg0NUYzLCAweDZDMEQsIDB4NEMxQiwgMHg2QzBFLCAweDQ1RjQsIDB4NkMwRiwgMHgwOEFGLAotICAgIDB4NkMxMCwgMHgzOTVGLCAweDZDMTEsIDB4MEVCRCwgMHg2QzEzLCAweDE1MDEsIDB4NkMxNCwgMHgxNTAyLAotICAgIDB4NkMxNywgMHgwNjNFLCAweDZDMUIsIDB4MTUwMywgMHg2QzIzLCAweDE1MDUsIDB4NkMyNCwgMHgxNTA0LAotICAgIDB4NkMyQywgMHg0QzFDLCAweDZDMzMsIDB4Mzk2MCwgMHg2QzM0LCAweDBBMkIsIDB4NkMzNSwgMHgzOTYxLAotICAgIDB4NkMzNiwgMHg0NUY1LCAweDZDMzcsIDB4MERBQiwgMHg2QzM4LCAweDA0RUMsIDB4NkMzQSwgMHg0RjU1LAotICAgIDB4NkMzRSwgMHgwRDU5LCAweDZDM0YsIDB4MjEzRSwgMHg2QzQwLCAweDBDMTEsIDB4NkM0MSwgMHgwOTRCLAotICAgIDB4NkM0MiwgMHgwNjdCLCAweDZDNEEsIDB4NEMxRCwgMHg2QzRELCAweDQ1RjcsIDB4NkM0RSwgMHgwRDVBLAotICAgIDB4NkM1MCwgMHgwOERBLCAweDZDNTIsIDB4NEMxRSwgMHg2QzU0LCAweDRDMUYsIDB4NkM1NSwgMHgxNTA3LAotICAgIDB4NkM1NywgMHgwNUZDLCAweDZDNTksIDB4Mzk2MywgMHg2QzVBLCAweDA1MUEsIDB4NkM1QiwgMHg0NUY4LAotICAgIDB4NkM1QywgMHgyMTNGLCAweDZDNUQsIDB4MENDQSwgMHg2QzVFLCAweDE1MDYsIDB4NkM1RiwgMHgwN0QwLAotICAgIDB4NkM2MCwgMHgwQjkxLCAweDZDNjIsIDB4MTUwOCwgMHg2QzY3LCAweDQ2MEEsIDB4NkM2OCwgMHgxNTEwLAotICAgIDB4NkM2QSwgMHgxNTA5LCAweDZDNkQsIDB4NDVGOSwgMHg2QzZGLCAweDIxNDEsIDB4NkM3MCwgMHgwQjIxLAotICAgIDB4NkM3MiwgMHgwNjdDLCAweDZDNzMsIDB4MTUxMSwgMHg2Qzc0LCAweDQyMjAsIDB4NkM3NiwgMHgzOTY0LAotICAgIDB4NkM3OSwgMHg0QzIwLCAweDZDN0EsIDB4MDczRSwgMHg2QzdCLCAweDM5NjUsIDB4NkM3RCwgMHgwNjNGLAotICAgIDB4NkM3RSwgMHgxNTBGLCAweDZDODEsIDB4MTUwRCwgMHg2QzgyLCAweDE1MEEsIDB4NkM4MywgMHgwRjRBLAotICAgIDB4NkM4NCwgMHg0NUZBLCAweDZDODUsIDB4Mzk2NiwgMHg2Qzg2LCAweDIxNDAsIDB4NkM4OCwgMHgwQkRDLAotICAgIDB4NkM4OSwgMHg0NUZCLCAweDZDOEMsIDB4MENCMSwgMHg2QzhELCAweDE1MEIsIDB4NkM5MCwgMHgxNTEzLAotICAgIDB4NkM5MiwgMHgxNTEyLCAweDZDOTMsIDB4MDZGOSwgMHg2Qzk0LCAweDQ1RkQsIDB4NkM5NSwgMHgzOTY3LAotICAgIDB4NkM5NiwgMHgwNTJELCAweDZDOTcsIDB4NDVGRSwgMHg2Qzk4LCAweDQyMjEsIDB4NkM5OSwgMHgwODJCLAotICAgIDB4NkM5QSwgMHgxNTBDLCAweDZDOUIsIDB4MTUwRSwgMHg2QzlDLCAweDM5NjgsIDB4NkNBMSwgMHgwRTg1LAotICAgIDB4NkNBMiwgMHgwQjU0LCAweDZDQUEsIDB4Mzc0OSwgMHg2Q0FCLCAweDBFQTUsIDB4NkNBQywgMHg0QzIxLAotICAgIDB4NkNBRCwgMHg0NUZGLCAweDZDQUUsIDB4MTUxQiwgMHg2Q0IxLCAweDE1MUMsIDB4NkNCMywgMHgwNTRGLAotICAgIDB4NkNCNCwgMHg0QzIyLCAweDZDQjgsIDB4MERGOCwgMHg2Q0I5LCAweDBGMDksIDB4NkNCQSwgMHgxNTFFLAotICAgIDB4NkNCQiwgMHgwOENGLCAweDZDQkMsIDB4MDlBQSwgMHg2Q0JELCAweDE1MTcsIDB4NkNCRSwgMHgxNTFELAotICAgIDB4NkNCRiwgMHgwNTBBLCAweDZDQzEsIDB4MDZBRiwgMHg2Q0MyLCAweDQ2MDAsIDB4NkNDNCwgMHgxNTE0LAotICAgIDB4NkNDNSwgMHgxNTE5LCAweDZDQzYsIDB4NDIyMywgMHg2Q0M5LCAweDBBOTgsIDB4NkNDQSwgMHgwRDI3LAotICAgIDB4NkNDQywgMHgwRDdCLCAweDZDRDAsIDB4Mzk2OSwgMHg2Q0QyLCAweDRDMjMsIDB4NkNEMywgMHgxNTE2LAotICAgIDB4NkNENCwgMHgzOTZBLCAweDZDRDUsIDB4MEU0RiwgMHg2Q0Q2LCAweDM5NkIsIDB4NkNENywgMHgxNTE4LAotICAgIDB4NkNEOSwgMHgxNTIxLCAweDZDREEsIDB4MjE0MiwgMHg2Q0RCLCAweDE1MUYsIDB4NkNEQywgMHg0NjAyLAotICAgIDB4NkNERCwgMHgxNTFBLCAweDZDRTAsIDB4Mzk2QywgMHg2Q0UxLCAweDBFNTAsIDB4NkNFMiwgMHgwQ0ZFLAotICAgIDB4NkNFMywgMHgwNjdELCAweDZDRTUsIDB4MEMxRiwgMHg2Q0U4LCAweDBCQUIsIDB4NkNFOSwgMHg0NjAzLAotICAgIDB4NkNFQSwgMHgxNTIyLCAweDZDRUIsIDB4Mzk2RCwgMHg2Q0VDLCAweDM5NkUsIDB4NkNFRCwgMHg0NjA0LAotICAgIDB4NkNFRSwgMHgzOTZGLCAweDZDRUYsIDB4MTUyMCwgMHg2Q0YwLCAweDBCMzksIDB4NkNGMSwgMHgxNTE1LAotICAgIDB4NkNGMywgMHgwNEVELCAweDZDRkIsIDB4NDIyMiwgMHg2RDAwLCAweDQ2MDYsIDB4NkQwMSwgMHgzQzM1LAotICAgIDB4NkQwNCwgMHgyMTQzLCAweDZEMEEsIDB4Mzk3MCwgMHg2RDBCLCAweDBGMzgsIDB4NkQwQywgMHgxNTJELAotICAgIDB4NkQwRSwgMHgzOTcxLCAweDZEMTEsIDB4Mzk3MiwgMHg2RDEyLCAweDE1MkMsIDB4NkQxNywgMHgwQTlBLAotICAgIDB4NkQxOSwgMHgxNTI5LCAweDZEMUIsIDB4MEY1NiwgMHg2RDFFLCAweDBDOEUsIDB4NkQxRiwgMHgxNTIzLAotICAgIDB4NkQyNCwgMHg0NjA3LCAweDZEMjUsIDB4MEJFMSwgMHg2RDI2LCAweDQ2MDgsIDB4NkQyNywgMHg0NjA5LAotICAgIDB4NkQyOSwgMHgwNEVFLCAweDZEMkEsIDB4MDdEMSwgMHg2RDJCLCAweDE1MjYsIDB4NkQyRSwgMHgzOTczLAotICAgIDB4NkQyRiwgMHg0NjBCLCAweDZEMzEsIDB4NDIyNCwgMHg2RDMyLCAweDA5MzEsIDB4NkQzMywgMHgxNTJCLAotICAgIDB4NkQzNCwgMHg0NjFFLCAweDZEMzUsIDB4MTUyQSwgMHg2RDM2LCAweDE1MjUsIDB4NkQzOCwgMHgxNTI4LAotICAgIDB4NkQzOSwgMHg0MjI1LCAweDZEM0IsIDB4MDVDNiwgMHg2RDNDLCAweDQ2MEMsIDB4NkQzRCwgMHgxNTI3LAotICAgIDB4NkQzRSwgMHgwQ0ZGLCAweDZEM0YsIDB4NDIyNiwgMHg2RDQxLCAweDBGNzYsIDB4NkQ0NCwgMHgwOURDLAotICAgIDB4NkQ0NSwgMHgwQTk5LCAweDZENTcsIDB4Mzk3NCwgMHg2RDU4LCAweDQyMjcsIDB4NkQ1OSwgMHgxNTMzLAotICAgIDB4NkQ1QSwgMHgxNTMxLCAweDZENUIsIDB4NDYwRCwgMHg2RDVDLCAweDBEQkYsIDB4NkQ1RSwgMHgzOTc1LAotICAgIDB4NkQ2MCwgMHg0NjBFLCAweDZENjEsIDB4NEMyNCwgMHg2RDYzLCAweDE1MkUsIDB4NkQ2NCwgMHgxNTMwLAotICAgIDB4NkQ2NSwgMHgzOTc2LCAweDZENjYsIDB4MDREQywgMHg2RDY5LCAweDA3RDIsIDB4NkQ2QSwgMHgwRkQ4LAotICAgIDB4NkQ2QywgMHgwNTlCLCAweDZENkUsIDB4MERENCwgMHg2RDZGLCAweDIxNDUsIDB4NkQ3MCwgMHg0NjBGLAotICAgIDB4NkQ3NCwgMHgwRjRCLCAweDZENzcsIDB4MDU4MiwgMHg2RDc4LCAweDBBMDEsIDB4NkQ3OSwgMHgxNTMyLAotICAgIDB4NkQ3QywgMHg0QzI1LCAweDZEODAsIDB4NDYxMCwgMHg2RDgxLCAweDQ2MTEsIDB4NkQ4MiwgMHgzOTc3LAotICAgIDB4NkQ4NSwgMHgxNTM3LCAweDZEODcsIDB4MjE0NCwgMHg2RDg4LCAweDA5QUIsIDB4NkQ4OSwgMHgzNDJBLAotICAgIDB4NkQ4QSwgMHg0NjEyLCAweDZEOEMsIDB4MEYxQSwgMHg2RDhELCAweDQ2MTMsIDB4NkQ4RSwgMHgxNTM0LAotICAgIDB4NkQ5MSwgMHg0NjE0LCAweDZEOTMsIDB4MTUyRiwgMHg2RDk0LCAweDQyMjgsIDB4NkQ5NSwgMHgxNTM1LAotICAgIDB4NkQ5NiwgMHgyMTQ2LCAweDZEOTgsIDB4NDYxNSwgMHg2RDk5LCAweDBGQTYsIDB4NkQ5QiwgMHgwQzZELAotICAgIDB4NkQ5QywgMHgwQzlBLCAweDZEQUEsIDB4NDIyOSwgMHg2REFCLCAweDQ2MUEsIDB4NkRBQywgMHgyMTQ3LAotICAgIDB4NkRBRSwgMHg0NjFCLCAweDZEQUYsIDB4MDU5NCwgMHg2REIyLCAweDA0RjcsIDB4NkRCNCwgMHg0NjFDLAotICAgIDB4NkRCNSwgMHgxNTNCLCAweDZEQjgsIDB4MTUzRSwgMHg2REI5LCAweDRDMjYsIDB4NkRCQywgMHgwRjhCLAotICAgIDB4NkRCRiwgMHgzOTc4LCAweDZEQzAsIDB4MEY0RSwgMHg2REMyLCAweDQ2MUQsIDB4NkRDNCwgMHgzOTc5LAotICAgIDB4NkRDNSwgMHgxNTQ1LCAweDZEQzYsIDB4MTUzRiwgMHg2REM3LCAweDE1M0MsIDB4NkRDOCwgMHg0NjFGLAotICAgIDB4NkRDQSwgMHgzOTdBLCAweDZEQ0IsIDB4MEY5QywgMHg2RENDLCAweDE1NDIsIDB4NkRDRSwgMHg0NjIwLAotICAgIDB4NkRDRiwgMHgyMTQ4LCAweDZERDAsIDB4M0MzNiwgMHg2REQxLCAweDA5NTQsIDB4NkREMiwgMHgxNTQ0LAotICAgIDB4NkRENSwgMHgxNTQ5LCAweDZERDYsIDB4Mzk3QiwgMHg2REQ4LCAweDBDNkIsIDB4NkREOSwgMHgxNTQ3LAotICAgIDB4NkREQSwgMHgzNDUzLCAweDZEREIsIDB4NDIyQSwgMHg2RERELCAweDQyMkIsIDB4NkRERSwgMHgxNTQxLAotICAgIDB4NkRERiwgMHg0NjIxLCAweDZERTEsIDB4MEI3NiwgMHg2REU0LCAweDE1NDgsIDB4NkRFNiwgMHgxNTNELAotICAgIDB4NkRFOCwgMHgxNTQzLCAweDZERTksIDB4Mzk3QywgMHg2REVBLCAweDE1NEEsIDB4NkRFQiwgMHgwNEMwLAotICAgIDB4NkRFQywgMHgxNTQwLCAweDZERUUsIDB4MTU0QiwgMHg2REYwLCAweDRDMjcsIDB4NkRGMSwgMHgwQTAyLAotICAgIDB4NkRGMiwgMHgyMTRBLCAweDZERjMsIDB4MDk2OSwgMHg2REY1LCAweDBERjUsIDB4NkRGNiwgMHg0NjIyLAotICAgIDB4NkRGNywgMHgwODFFLCAweDZERjgsIDB4MjE0OSwgMHg2REY5LCAweDE1MzgsIDB4NkRGQSwgMHgxNTQ2LAotICAgIDB4NkRGQiwgMHgwQzM0LCAweDZERkMsIDB4MjE0QiwgMHg2RTA1LCAweDBBNUEsIDB4NkUwNywgMHgwNUM3LAotICAgIDB4NkUwOCwgMHgwODQxLCAweDZFMDksIDB4MDlBQywgMHg2RTBBLCAweDE1M0EsIDB4NkUwQiwgMHgwOTRDLAotICAgIDB4NkUxMywgMHgwNzIyLCAweDZFMTUsIDB4MTUzOSwgMHg2RTE3LCAweDM3NDYsIDB4NkUxOSwgMHgxNTRGLAotICAgIDB4NkUxQSwgMHgwOTc3LCAweDZFMUIsIDB4MDc2RSwgMHg2RTFELCAweDE1NUUsIDB4NkUxRSwgMHg0NjI0LAotICAgIDB4NkUxRiwgMHgxNTU4LCAweDZFMjAsIDB4MDY4RSwgMHg2RTIxLCAweDBDNDksIDB4NkUyMiwgMHgzOTdELAotICAgIDB4NkUyMywgMHgxNTUzLCAweDZFMjQsIDB4MTU1QywgMHg2RTI1LCAweDA0NzMsIDB4NkUyNiwgMHgwNEQ0LAotICAgIDB4NkUyNywgMHgyMTRFLCAweDZFMjksIDB4MDUzOSwgMHg2RTJCLCAweDE1NTUsIDB4NkUyQywgMHgwQjBDLAotICAgIDB4NkUyRCwgMHgxNTRDLCAweDZFMkUsIDB4MTU0RSwgMHg2RTJGLCAweDA3RDMsIDB4NkUzMiwgMHg0NjI2LAotICAgIDB4NkUzNCwgMHgzNDEyLCAweDZFMzYsIDB4NDYyMywgMHg2RTM4LCAweDE1NUYsIDB4NkUzOSwgMHgyMTRDLAotICAgIDB4NkUzQSwgMHgxNTVBLCAweDZFM0MsIDB4MjE0RiwgMHg2RTNFLCAweDE1NTIsIDB4NkU0MiwgMHgzQzM3LAotICAgIDB4NkU0MywgMHgxNTU5LCAweDZFNDQsIDB4NDIyQywgMHg2RTQ1LCAweDRDMjgsIDB4NkU0OCwgMHg0NjI3LAotICAgIDB4NkU0OSwgMHg0NjI4LCAweDZFNEEsIDB4MEVCNywgMHg2RTRCLCAweDQ2MjksIDB4NkU0QywgMHg0NjJBLAotICAgIDB4NkU0RCwgMHgxNTU3LCAweDZFNEUsIDB4MTU1QiwgMHg2RTRGLCAweDQ2MkIsIDB4NkU1MSwgMHgzOTdFLAotICAgIDB4NkU1MywgMHg0NjJDLCAweDZFNTQsIDB4NDYyRCwgMHg2RTU2LCAweDA3ODQsIDB4NkU1NywgMHg0NjJFLAotICAgIDB4NkU1OCwgMHgwOUFELCAweDZFNUIsIDB4MEI3NywgMHg2RTVDLCAweDIxNEQsIDB4NkU1RSwgMHg0MjJELAotICAgIDB4NkU1RiwgMHgxNTUxLCAweDZFNjMsIDB4NDYyRiwgMHg2RTY3LCAweDBGMTksIDB4NkU2QiwgMHgxNTU0LAotICAgIDB4NkU2RSwgMHgxNTRELCAweDZFNkYsIDB4MEM2QywgMHg2RTcyLCAweDE1NTAsIDB4NkU3MywgMHg0QzI5LAotICAgIDB4NkU3NiwgMHgxNTU2LCAweDZFN0IsIDB4NEMyQSwgMHg2RTdELCAweDRDMkIsIDB4NkU3RSwgMHgwRkY3LAotICAgIDB4NkU3RiwgMHgwOEVBLCAweDZFODAsIDB4MEVBQywgMHg2RTgyLCAweDE1NjAsIDB4NkU4OSwgMHg0QzJDLAotICAgIDB4NkU4QywgMHgwRDQyLCAweDZFOEYsIDB4MTU2QywgMHg2RTkwLCAweDA3NkYsIDB4NkU5MywgMHg0NjMxLAotICAgIDB4NkU5NiwgMHgwOTZBLCAweDZFOTgsIDB4MTU2MiwgMHg2RTlDLCAweDBGNzcsIDB4NkU5RCwgMHgwN0Q0LAotICAgIDB4NkU5RiwgMHgxNTZGLCAweDZFQTIsIDB4MDRCMiwgMHg2RUE1LCAweDE1NkQsIDB4NkVBNywgMHg0NjMyLAotICAgIDB4NkVBQSwgMHgxNTYxLCAweDZFQUIsIDB4MzQwQywgMHg2RUFGLCAweDE1NjcsIDB4NkVCMSwgMHg0MjJFLAotICAgIDB4NkVCMiwgMHgxNTY5LCAweDZFQjQsIDB4NDYzMywgMHg2RUI2LCAweDBGMzksIDB4NkVCNywgMHgxNTY0LAotICAgIDB4NkVCQSwgMHgwQzI4LCAweDZFQkMsIDB4NEMyRCwgMHg2RUJELCAweDE1NjYsIDB4NkVCRiwgMHgyMTUwLAotICAgIDB4NkVDMSwgMHg0MjJGLCAweDZFQzIsIDB4MTU2RSwgMHg2RUMzLCAweDQ2MzQsIDB4NkVDNCwgMHgxNTY4LAotICAgIDB4NkVDNSwgMHgwRUQzLCAweDZFQzcsIDB4Mzk3RiwgMHg2RUM5LCAweDE1NjMsIDB4NkVDQSwgMHgzOTgwLAotICAgIDB4NkVDQiwgMHgwOENFLCAweDZFQ0MsIDB4MTU3QiwgMHg2RUNFLCAweDM5ODEsIDB4NkVEMSwgMHgwNUM4LAotICAgIDB4NkVEMywgMHgxNTY1LCAweDZFRDQsIDB4MTU2QSwgMHg2RUQ1LCAweDE1NkIsIDB4NkVEOSwgMHgzQzM4LAotICAgIDB4NkVEQSwgMHg0QzJFLCAweDZFREIsIDB4NEMyRiwgMHg2RURELCAweDBCNEMsIDB4NkVERSwgMHgwQjNBLAotICAgIDB4NkVFNiwgMHgzQzI0LCAweDZFRUIsIDB4NDYzNiwgMHg2RUVDLCAweDE1NzMsIDB4NkVFRiwgMHgxNTc5LAotICAgIDB4NkVGMiwgMHgxNTc3LCAweDZFRjQsIDB4MEMyMywgMHg2RUY3LCAweDE1N0UsIDB4NkVGOCwgMHgxNTc0LAotICAgIDB4NkVGOSwgMHg0NjM3LCAweDZFRkIsIDB4NDYzOCwgMHg2RUZELCAweDM5ODIsIDB4NkVGRSwgMHgxNTc1LAotICAgIDB4NkVGRiwgMHgxNTVELCAweDZGMDEsIDB4MDY5MywgMHg2RjAyLCAweDBEQUMsIDB4NkYwNiwgMHgwOEVCLAotICAgIDB4NkYwOSwgMHgwODA5LCAweDZGMEEsIDB4NDYzOSwgMHg2RjBDLCAweDQ2M0EsIDB4NkYwRiwgMHgwRkQ5LAotICAgIDB4NkYxMCwgMHg0MjMwLCAweDZGMTEsIDB4MTU3MSwgMHg2RjEzLCAweDE1N0QsIDB4NkYxNCwgMHgwNTBCLAotICAgIDB4NkYxNSwgMHgwQUU4LCAweDZGMTgsIDB4NDYzQiwgMHg2RjFBLCAweDM5ODMsIDB4NkYyMCwgMHgwRDJGLAotICAgIDB4NkYyMiwgMHgwNUZELCAweDZGMjMsIDB4MEZDMiwgMHg2RjI1LCAweDQ2M0MsIDB4NkYyNiwgMHg0QzMwLAotICAgIDB4NkYyOSwgMHg0QzMxLCAweDZGMkEsIDB4Mzk4NCwgMHg2RjJCLCAweDBFQUQsIDB4NkYyQywgMHgwQkVFLAotICAgIDB4NkYyRiwgMHgzOTg1LCAweDZGMzAsIDB4NEMzMiwgMHg2RjMxLCAweDE1NzgsIDB4NkYzMiwgMHgxNTdBLAotICAgIDB4NkYzMywgMHgzOTg2LCAweDZGMzUsIDB4NDYzNSwgMHg2RjM2LCAweDQ2M0QsIDB4NkYzOCwgMHgwQUI0LAotICAgIDB4NkYzQywgMHg0NjNFLCAweDZGM0UsIDB4MTU3QywgMHg2RjNGLCAweDE1NzYsIDB4NkY0MSwgMHgxNTcwLAotICAgIDB4NkY0NSwgMHgwNUZGLCAweDZGNTEsIDB4MUU2MCwgMHg2RjUyLCAweDQ2NDAsIDB4NkY1NCwgMHgwNzNGLAotICAgIDB4NkY1NywgMHg0NjQxLCAweDZGNTgsIDB4MTU4QSwgMHg2RjU5LCAweDQyMzEsIDB4NkY1QSwgMHgzOTg3LAotICAgIDB4NkY1QiwgMHgxNTg1LCAweDZGNUMsIDB4MEE5QywgMHg2RjVFLCAweDM5ODgsIDB4NkY1RiwgMHgwNUMxLAotICAgIDB4NkY2MCwgMHg0NjQyLCAweDZGNjEsIDB4NDIzMiwgMHg2RjYyLCAweDM5ODksIDB4NkY2NCwgMHgwOTZCLAotICAgIDB4NkY2NiwgMHgxNThFLCAweDZGNjgsIDB4NDY0MywgMHg2RjZELCAweDE1ODcsIDB4NkY2RSwgMHgwQkM4LAotICAgIDB4NkY2RiwgMHgxNTg0LCAweDZGNzAsIDB4MEJGNSwgMHg2Rjc0LCAweDE1QTcsIDB4NkY3OCwgMHgxNTgxLAotICAgIDB4NkY3QSwgMHgxNTgwLCAweDZGN0MsIDB4MTU4OSwgMHg2RjdELCAweDM5OEEsIDB4NkY3RSwgMHg0MjMzLAotICAgIDB4NkY4MCwgMHgxNTgzLCAweDZGODEsIDB4MTU4MiwgMHg2RjgyLCAweDE1ODgsIDB4NkY4NCwgMHgwQTQ1LAotICAgIDB4NkY4NiwgMHgxNTdGLCAweDZGODcsIDB4NEMzMywgMHg2Rjg4LCAweDIxNTEsIDB4NkY4QiwgMHgzOThCLAotICAgIDB4NkY4QywgMHg0MjM0LCAweDZGOEQsIDB4Mzk4QywgMHg2RjhFLCAweDE1OEIsIDB4NkY5MCwgMHg0NjQ0LAotICAgIDB4NkY5MSwgMHgxNThDLCAweDZGOTIsIDB4Mzk4RCwgMHg2Rjk0LCAweDM5OEUsIDB4NkY5NiwgMHg0NjQ1LAotICAgIDB4NkY5NywgMHgwNUZFLCAweDZGOTgsIDB4MzYzQywgMHg2RjlBLCAweDM5OEYsIDB4NkY5RCwgMHg0QzM0LAotICAgIDB4NkY5RiwgMHg0NjQ3LCAweDZGQTAsIDB4NDIzNSwgMHg2RkExLCAweDE1OTEsIDB4NkZBMywgMHgxNTkwLAotICAgIDB4NkZBNCwgMHgxNTkyLCAweDZGQTUsIDB4NDY0OCwgMHg2RkE3LCAweDM5OTAsIDB4NkZBOCwgMHgzOTkxLAotICAgIDB4NkZBQSwgMHgxNTk1LCAweDZGQUUsIDB4NEMzNSwgMHg2RkFGLCAweDQ2NDksIDB4NkZCMSwgMHgwQzNELAotICAgIDB4NkZCMywgMHgxNThGLCAweDZGQjUsIDB4MjE1MiwgMHg2RkI2LCAweDM5OTIsIDB4NkZCNywgMHg0QzM2LAotICAgIDB4NkZCOSwgMHgxNTkzLCAweDZGQkMsIDB4NDIzNiwgMHg2RkJFLCAweDQ2NDYsIDB4NkZDMCwgMHgwNzM5LAotICAgIDB4NkZDMSwgMHgwQjU5LCAweDZGQzIsIDB4MTU4RCwgMHg2RkMzLCAweDBDRjEsIDB4NkZDNiwgMHgxNTk0LAotICAgIDB4NkZDNywgMHg0MjM3LCAweDZGQzgsIDB4NDY0QiwgMHg2RkM5LCAweDQ2NEMsIDB4NkZDQSwgMHg0MjM4LAotICAgIDB4NkZENCwgMHgxNTk5LCAweDZGRDUsIDB4MTU5NywgMHg2RkQ4LCAweDE1OUEsIDB4NkZEQSwgMHgzOTkzLAotICAgIDB4NkZEQiwgMHgxNTlELCAweDZGREUsIDB4Mzk5NCwgMHg2RkRGLCAweDE1OTYsIDB4NkZFMCwgMHgwN0ZDLAotICAgIDB4NkZFMSwgMHgwQ0RFLCAweDZGRTQsIDB4MTUzNiwgMHg2RkU5LCAweDQ2NEQsIDB4NkZFQiwgMHgwRjVFLAotICAgIDB4NkZFQywgMHgxNTk4LCAweDZGRUUsIDB4MTU5QywgMHg2RkVGLCAweDBCNTUsIDB4NkZGMCwgMHg0MjM5LAotICAgIDB4NkZGMSwgMHgxNTlCLCAweDZGRjMsIDB4MTU4NiwgMHg2RkY1LCAweDIxNTMsIDB4NkZGNiwgMHgxQkE0LAotICAgIDB4NkZGOSwgMHgzQzIzLCAweDZGRkEsIDB4MTVBMCwgMHg2RkZDLCAweDQ2NEYsIDB4NkZGRSwgMHgxNUE0LAotICAgIDB4NzAwMCwgMHg0NjUwLCAweDcwMDEsIDB4MTVBMiwgMHg3MDA1LCAweDIxNTQsIDB4NzAwNiwgMHgxRTUwLAotICAgIDB4NzAwNywgMHgyMTU1LCAweDcwMDksIDB4MTU5RSwgMHg3MDBBLCAweDQ2NTEsIDB4NzAwQiwgMHgxNTlGLAotICAgIDB4NzAwRCwgMHg0QzM3LCAweDcwMEYsIDB4MTVBMywgMHg3MDExLCAweDE1QTEsIDB4NzAxNSwgMHgwREMwLAotICAgIDB4NzAxOCwgMHgxNUE5LCAweDcwMUEsIDB4MTVBNiwgMHg3MDFCLCAweDE1QTUsIDB4NzAxRCwgMHgxNUE4LAotICAgIDB4NzAxRSwgMHgwQ0FDLCAweDcwMUYsIDB4MTVBQSwgMHg3MDIwLCAweDRDMzgsIDB4NzAyMywgMHg0NjUyLAotICAgIDB4NzAyNiwgMHgwQkIzLCAweDcwMjcsIDB4MEI0RCwgMHg3MDI4LCAweDIxNTYsIDB4NzAyQywgMHgwQTQ5LAotICAgIDB4NzAzMCwgMHgxNUFCLCAweDcwMzIsIDB4MTVBRCwgMHg3MDM5LCAweDM5OTYsIDB4NzAzQSwgMHg0NjU0LAotICAgIDB4NzAzQywgMHgzOTk3LCAweDcwM0UsIDB4MTVBQywgMHg3MDQzLCAweDQ2NTUsIDB4NzA0NywgMHg0NjU2LAotICAgIDB4NzA0OSwgMHg0QzM5LCAweDcwNEEsIDB4NEY1MiwgMHg3MDRCLCAweDQ2NTcsIDB4NzA0QywgMHgxNTcyLAotICAgIDB4NzA0RSwgMHg0MjNBLCAweDcwNTEsIDB4MTVBRSwgMHg3MDU0LCAweDM5OTksIDB4NzA1OCwgMHgwQ0JGLAotICAgIDB4NzA1RCwgMHgzOTlBLCAweDcwNUUsIDB4Mzk5QiwgMHg3MDYzLCAweDE1QUYsIDB4NzA2NCwgMHgzOTlDLAotICAgIDB4NzA2NSwgMHg0NjU5LCAweDcwNjksIDB4NDY1QSwgMHg3MDZCLCAweDA1NTAsIDB4NzA2QywgMHgzOTlELAotICAgIDB4NzA2RSwgMHg0NjVCLCAweDcwNkYsIDB4MEM2RSwgMHg3MDcwLCAweDA1ODMsIDB4NzA3NSwgMHg0MjNCLAotICAgIDB4NzA3NiwgMHg0NjVDLCAweDcwNzgsIDB4MDY3RSwgMHg3MDdDLCAweDA5MEEsIDB4NzA3RCwgMHgwODQyLAotICAgIDB4NzA3RSwgMHgzOTlFLCAweDcwODEsIDB4Mzk5RiwgMHg3MDg1LCAweDIxNTcsIDB4NzA4NiwgMHg0NjVELAotICAgIDB4NzA4OSwgMHgwRkNELCAweDcwOEEsIDB4MEEyQywgMHg3MDhFLCAweDA1MEMsIDB4NzA5MiwgMHgxNUIxLAotICAgIDB4NzA5NSwgMHgzOUEwLCAweDcwOTcsIDB4NDY1RSwgMHg3MDk4LCAweDRDM0EsIDB4NzA5OSwgMHgxNUIwLAotICAgIDB4NzA5RiwgMHg0NjYwLCAweDcwQTQsIDB4NDIzQywgMHg3MEFCLCAweDIxNTgsIDB4NzBBQywgMHgxNUI0LAotICAgIDB4NzBBRCwgMHgwQjc4LCAweDcwQUUsIDB4MTVCNywgMHg3MEFGLCAweDE1QjIsIDB4NzBCMCwgMHg0QzNCLAotICAgIDB4NzBCMSwgMHg0NjYxLCAweDcwQjMsIDB4MTVCNiwgMHg3MEI3LCAweDM5QTEsIDB4NzBCOCwgMHgxNUI1LAotICAgIDB4NzBCOSwgMHgwQzNBLCAweDcwQkEsIDB4MDQ5RCwgMHg3MEJCLCAweDIwQUQsIDB4NzBDOCwgMHgwRkJELAotICAgIDB4NzBDQSwgMHg0NjY0LCAweDcwQ0IsIDB4MTVCOSwgMHg3MENGLCAweDA0Q0EsIDB4NzBEMSwgMHg0NjY1LAotICAgIDB4NzBEMywgMHgzOUEyLCAweDcwRDQsIDB4MzlBMywgMHg3MEQ1LCAweDRDM0MsIDB4NzBENiwgMHg0QzNELAotICAgIDB4NzBEOCwgMHgzOUE0LCAweDcwRDksIDB4MTVCQiwgMHg3MERDLCAweDM5QTUsIDB4NzBERCwgMHgxNUJBLAotICAgIDB4NzBERiwgMHgxNUI4LCAweDcwRTQsIDB4NDIzRCwgMHg3MEVDLCAweDQ2NjMsIDB4NzBGMSwgMHgxNUIzLAotICAgIDB4NzBGOSwgMHgwRTUxLCAweDcwRkQsIDB4MTVCRCwgMHg3MTAzLCAweDQ2NjYsIDB4NzEwNCwgMHgyMTVBLAotICAgIDB4NzEwNiwgMHg0NjY3LCAweDcxMDcsIDB4MzlBNiwgMHg3MTA4LCAweDQ2NjgsIDB4NzEwOSwgMHgxNUJDLAotICAgIDB4NzEwQywgMHg0NjY5LCAweDcxMEYsIDB4MjE1OSwgMHg3MTE0LCAweDA1MEQsIDB4NzExOSwgMHgxNUJGLAotICAgIDB4NzExQSwgMHgwRTAyLCAweDcxMUMsIDB4MTVCRSwgMHg3MTFFLCAweDQyM0YsIDB4NzEyMCwgMHgzOUE3LAotICAgIDB4NzEyMSwgMHgwRUMxLCAweDcxMjYsIDB4MDlBRiwgMHg3MTJCLCAweDQyM0UsIDB4NzEyRSwgMHg0MjQwLAotICAgIDB4NzEyRiwgMHg0NjZCLCAweDcxMzAsIDB4MUREQywgMHg3MTMxLCAweDM5QTgsIDB4NzEzNiwgMHgwQUI1LAotICAgIDB4NzEzQywgMHgwOUFFLCAweDcxNDUsIDB4NEMzRSwgMHg3MTQ2LCAweDIxNUMsIDB4NzE0NywgMHgyMTVELAotICAgIDB4NzE0OSwgMHgwRkMzLCAweDcxNEEsIDB4MzlBOSwgMHg3MTRDLCAweDE1QzUsIDB4NzE0RSwgMHgwQTlELAotICAgIDB4NzE1MCwgMHg0NjZDLCAweDcxNTEsIDB4NDI0MSwgMHg3MTUyLCAweDM5QUEsIDB4NzE1MywgMHg0NjZELAotICAgIDB4NzE1NSwgMHgxNUMxLCAweDcxNTYsIDB4MTVDNiwgMHg3MTU5LCAweDA1MEUsIDB4NzE1QywgMHgyMTVCLAotICAgIDB4NzE1RSwgMHg0NjZFLCAweDcxNjAsIDB4MzlBQiwgMHg3MTYyLCAweDE1QzQsIDB4NzE2NCwgMHgwRDE3LAotICAgIDB4NzE2NSwgMHgxNUMwLCAweDcxNjYsIDB4MTVDMywgMHg3MTY3LCAweDA5QjAsIDB4NzE2OCwgMHg0MjQyLAotICAgIDB4NzE2OSwgMHgwRDY1LCAweDcxNkMsIDB4MTVDNywgMHg3MTZFLCAweDA4RkQsIDB4NzE3OSwgMHgzOUFDLAotICAgIDB4NzE3RCwgMHgwQTlFLCAweDcxODAsIDB4NDY3MSwgMHg3MTg0LCAweDE1Q0EsIDB4NzE4NSwgMHg0MjQzLAotICAgIDB4NzE4NywgMHg0MjQ0LCAweDcxODgsIDB4MTVDMiwgMHg3MThBLCAweDA2RkQsIDB4NzE4RiwgMHgxNUM4LAotICAgIDB4NzE5MiwgMHgzOUFELCAweDcxOTQsIDB4MEYzQSwgMHg3MTk1LCAweDE1Q0IsIDB4NzE5NiwgMHg0NjcwLAotICAgIDB4NzE5OSwgMHgyMDVELCAweDcxOUIsIDB4NDY3MiwgMHg3MTlGLCAweDA5NTksIDB4NzFBMCwgMHg0NjczLAotICAgIDB4NzFBMiwgMHg0Njc0LCAweDcxQTgsIDB4MTVDQywgMHg3MUFDLCAweDE1Q0QsIDB4NzFBRSwgMHg0Njc1LAotICAgIDB4NzFBRiwgMHg0Njc2LCAweDcxQjEsIDB4MENFNCwgMHg3MUIyLCAweDRDM0YsIDB4NzFCMywgMHgzQzI1LAotICAgIDB4NzFCOSwgMHgxNUNGLCAweDcxQkEsIDB4NDI0NSwgMHg3MUJFLCAweDE1RDAsIDB4NzFDMSwgMHgyMTVGLAotICAgIDB4NzFDMywgMHgwQ0U5LCAweDcxQzQsIDB4NDI0NiwgMHg3MUM4LCAweDBDNkYsIDB4NzFDOSwgMHgxNUQyLAotICAgIDB4NzFDQiwgMHgzOUFGLCAweDcxQ0UsIDB4MTVENCwgMHg3MUQwLCAweDBGOUQsIDB4NzFEMiwgMHgxNUQxLAotICAgIDB4NzFEMywgMHgzOUIwLCAweDcxRDQsIDB4MTVEMywgMHg3MUQ1LCAweDA1MEYsIDB4NzFENiwgMHgzOUIxLAotICAgIDB4NzFENywgMHgxNUNFLCAweDcxRDksIDB4NDY3OCwgMHg3MURDLCAweDQ2NzksIDB4NzFERiwgMHgxMTRFLAotICAgIDB4NzFFMCwgMHgxNUQ1LCAweDcxRTUsIDB4MEFFOSwgMHg3MUU2LCAweDA4ODYsIDB4NzFFNywgMHgxNUQ3LAotICAgIDB4NzFFQywgMHgxNUQ2LCAweDcxRUQsIDB4MDlFQSwgMHg3MUVFLCAweDEwRUUsIDB4NzFGNCwgMHg0QzQwLAotICAgIDB4NzFGNSwgMHgxNUQ4LCAweDcxRjksIDB4MTVEQSwgMHg3MUZCLCAweDE1QzksIDB4NzFGQywgMHgxNUQ5LAotICAgIDB4NzFGRSwgMHgyMTYwLCAweDcxRkYsIDB4MTVEQiwgMHg3MjAwLCAweDM5QjIsIDB4NzIwNiwgMHgwRDMwLAotICAgIDB4NzIwNywgMHg0NjdBLCAweDcyMEQsIDB4MTVEQywgMHg3MjEwLCAweDE1REQsIDB4NzIxNSwgMHg0MjQ3LAotICAgIDB4NzIxNywgMHg0QzQxLCAweDcyMUIsIDB4MTVERSwgMHg3MjFELCAweDM5QjMsIDB4NzIxRiwgMHg0QzQyLAotICAgIDB4NzIyOCwgMHgxNURGLCAweDcyMkEsIDB4MEJGQSwgMHg3MjJCLCAweDM5QjQsIDB4NzIyQywgMHgxNUUxLAotICAgIDB4NzIyRCwgMHgxNUUwLCAweDcyMzAsIDB4MTVFMiwgMHg3MjMyLCAweDE1RTMsIDB4NzIzNCwgMHg0NjdDLAotICAgIDB4NzIzNSwgMHgwOTBCLCAweDcyMzYsIDB4MERENSwgMHg3MjM4LCAweDM5QjUsIDB4NzIzOSwgMHg0NjdELAotICAgIDB4NzIzQSwgMHgwRUY4LCAweDcyM0IsIDB4MTVFNCwgMHg3MjNDLCAweDE1RTUsIDB4NzIzRCwgMHgwQUQ4LAotICAgIDB4NzIzRSwgMHgwOEQwLCAweDcyM0YsIDB4MTVFNiwgMHg3MjQwLCAweDE1RTcsIDB4NzI0MSwgMHgzOUI2LAotICAgIDB4NzI0MiwgMHg0NjdFLCAweDcyNDMsIDB4NEM0MywgMHg3MjQ2LCAweDE1RTgsIDB4NzI0NywgMHgwRTIyLAotICAgIDB4NzI0OCwgMHgwRDVCLCAweDcyNEIsIDB4MTVFOSwgMHg3MjRDLCAweDBEMEQsIDB4NzI0RiwgMHg0QzQ0LAotICAgIDB4NzI1MCwgMHg0QzQ1LCAweDcyNTIsIDB4MEJDOSwgMHg3MjUzLCAweDM5QjcsIDB4NzI1NSwgMHgzOUI4LAotICAgIDB4NzI1NiwgMHgzOUI5LCAweDcyNTcsIDB4NDY3RiwgMHg3MjU4LCAweDE1RUEsIDB4NzI1OSwgMHgwNTY3LAotICAgIDB4NzI1QSwgMHg0QzQ2LCAweDcyNUIsIDB4MDY4NywgMHg3MjVDLCAweDM5QkEsIDB4NzI1RCwgMHgwRUQyLAotICAgIDB4NzI1RiwgMHgwRUMyLCAweDcyNjAsIDB4NEM0NywgMHg3MjYxLCAweDA1MzQsIDB4NzI2MiwgMHgwRkRBLAotICAgIDB4NzI2MywgMHg0NjgwLCAweDcyNjcsIDB4MEU4MCwgMHg3MjY4LCAweDRDNDgsIDB4NzI2OSwgMHgwREZBLAotICAgIDB4NzI2RSwgMHg0NjgyLCAweDcyNkYsIDB4NDY4MywgMHg3MjcyLCAweDBBNUIsIDB4NzI3NCwgMHgxNUVCLAotICAgIDB4NzI3NywgMHg0QzQ5LCAweDcyNzgsIDB4NDY4NCwgMHg3Mjc5LCAweDBDOUIsIDB4NzI3RCwgMHgwNzU3LAotICAgIDB4NzI3RSwgMHgxNUVDLCAweDcyN0YsIDB4NDY4NSwgMHg3MjgwLCAweDA4NDQsIDB4NzI4MSwgMHgxNUVFLAotICAgIDB4NzI4MiwgMHgxNUVELCAweDcyODQsIDB4NEM0QSwgMHg3Mjg3LCAweDE1RUYsIDB4NzI4RCwgMHgzOUJCLAotICAgIDB4NzI4RSwgMHg0Njg2LCAweDcyOTIsIDB4MTVGMCwgMHg3Mjk2LCAweDE1RjEsIDB4NzI5QiwgMHg0MjQ5LAotICAgIDB4NzJBMCwgMHgwNjU4LCAweDcyQTIsIDB4MTVGMiwgMHg3MkE3LCAweDE1RjMsIDB4NzJBQywgMHgwNzU4LAotICAgIDB4NzJBRCwgMHgzOUJDLCAweDcyQUUsIDB4NDY4OCwgMHg3MkFGLCAweDBENUMsIDB4NzJCMCwgMHg0Njg5LAotICAgIDB4NzJCMSwgMHgyMTYxLCAweDcyQjIsIDB4MTVGNSwgMHg3MkI0LCAweDM5QkQsIDB4NzJCNiwgMHgwOURELAotICAgIDB4NzJCOSwgMHgxNUY0LCAweDcyQkUsIDB4MjE2MiwgMHg3MkMwLCAweDM0MkIsIDB4NzJDMSwgMHg0NjhBLAotICAgIDB4NzJDMiwgMHgwNkIwLCAweDcyQzMsIDB4MTVGNiwgMHg3MkM0LCAweDE1RjgsIDB4NzJDNiwgMHgxNUY3LAotICAgIDB4NzJDNywgMHgzOUJFLCAweDcyQzksIDB4NEM0QiwgMHg3MkNDLCAweDQ2OEMsIDB4NzJDRSwgMHgxNUY5LAotICAgIDB4NzJEMCwgMHgwNzg1LCAweDcyRDIsIDB4MTVGQSwgMHg3MkQ3LCAweDA2RTEsIDB4NzJEOSwgMHgwQUMyLAotICAgIDB4NzJEQiwgMHgwODBGLCAweDcyRTAsIDB4MTVGQywgMHg3MkUxLCAweDE1RkQsIDB4NzJFMiwgMHgxNUZCLAotICAgIDB4NzJFNSwgMHg0QzRDLCAweDcyRTksIDB4MDkxOSwgMHg3MkVDLCAweDBDQTAsIDB4NzJFRCwgMHgwNkIxLAotICAgIDB4NzJGMywgMHg0NjhGLCAweDcyRjQsIDB4NEM0RCwgMHg3MkY3LCAweDE1RkYsIDB4NzJGOCwgMHgwQjZBLAotICAgIDB4NzJGOSwgMHgxNUZFLCAweDcyRkEsIDB4NDY5MCwgMHg3MkZCLCAweDM5QkYsIDB4NzJGQywgMHgwRkRCLAotICAgIDB4NzJGRCwgMHgwRDE4LCAweDczMDIsIDB4NEM0RSwgMHg3MzA0LCAweDM5QzAsIDB4NzMwNSwgMHgzOUMxLAotICAgIDB4NzMwNywgMHg0NjkxLCAweDczMEEsIDB4MTYwMiwgMHg3MzBCLCAweDRDNEYsIDB4NzMxMiwgMHg0NjkyLAotICAgIDB4NzMxNiwgMHgxNjA0LCAweDczMTcsIDB4MTYwMSwgMHg3MzE4LCAweDQ2OTMsIDB4NzMxOSwgMHg0Njk0LAotICAgIDB4NzMxQiwgMHgwRUUwLCAweDczMUMsIDB4MTYwMywgMHg3MzFELCAweDE2MDUsIDB4NzMxRSwgMHg0QzUwLAotICAgIDB4NzMxRiwgMHgwRjhDLCAweDczMjIsIDB4NEM1MSwgMHg3MzI0LCAweDIxNjMsIDB4NzMyNSwgMHgxNjA5LAotICAgIDB4NzMyNywgMHg0MjRCLCAweDczMjgsIDB4MzlDMiwgMHg3MzI5LCAweDE2MDgsIDB4NzMyQSwgMHgwQkI0LAotICAgIDB4NzMyQiwgMHgwQ0UzLCAweDczMkMsIDB4NDY5NywgMHg3MzJFLCAweDA3NTksIDB4NzMyRiwgMHgxNjA3LAotICAgIDB4NzMzMSwgMHgzOUMzLCAweDczMzMsIDB4NDY5OCwgMHg3MzM0LCAweDE2MDYsIDB4NzMzNiwgMHgwRjFCLAotICAgIDB4NzMzNywgMHgwRjFDLCAweDczMzksIDB4NDY5NiwgMHg3MzNBLCAweDRDNTIsIDB4NzMzQiwgMHg0QzUzLAotICAgIDB4NzMzRCwgMHg0Njk5LCAweDczM0UsIDB4MTYwQSwgMHg3MzNGLCAweDA1MTAsIDB4NzM0MywgMHgzOUM0LAotICAgIDB4NzM0NCwgMHgwODA4LCAweDczNDUsIDB4MDhCMCwgMHg3MzRELCAweDRDNTQsIDB4NzM0RSwgMHgxNjBCLAotICAgIDB4NzM0RiwgMHgxNjBDLCAweDczNTAsIDB4NDI0QywgMHg3MzUyLCAweDQ2OUEsIDB4NzM1NywgMHgxNjBFLAotICAgIDB4NzM1OCwgMHg0QzU1LCAweDczNjMsIDB4MDk0RCwgMHg3MzY2LCAweDQyNEQsIDB4NzM2NywgMHg0QzU2LAotICAgIDB4NzM2OCwgMHgxNjEwLCAweDczNkEsIDB4MTYwRiwgMHg3MzZCLCAweDQ2OUMsIDB4NzM2QywgMHgzOUM1LAotICAgIDB4NzM2RSwgMHg0NjlFLCAweDczNkYsIDB4NDY5RiwgMHg3MzcwLCAweDE2MTEsIDB4NzM3MSwgMHg0NkEwLAotICAgIDB4NzM3MiwgMHgwNUFCLCAweDczNzUsIDB4MTYxMywgMHg3Mzc3LCAweDIxNjUsIDB4NzM3OCwgMHgxNjEyLAotICAgIDB4NzM3QSwgMHgxNjE1LCAweDczN0IsIDB4MTYxNCwgMHg3MzdDLCAweDM5QzYsIDB4NzM4MSwgMHg0NkExLAotICAgIDB4NzM4MywgMHgzOUM3LCAweDczODQsIDB4MDc3MCwgMHg3Mzg1LCAweDM5QzgsIDB4NzM4NiwgMHgzOUM5LAotICAgIDB4NzM4NywgMHgwRjcwLCAweDczODksIDB4MDZDNCwgMHg3MzhBLCAweDQ2QTIsIDB4NzM4QiwgMHgwNTI2LAotICAgIDB4NzM5NCwgMHg0NkEzLCAweDczOTUsIDB4MzlDQSwgMHg3Mzk2LCAweDA2RTIsIDB4NzM5OCwgMHg0NkE0LAotICAgIDB4NzM5QywgMHg0NkE1LCAweDczOUUsIDB4MzlDQiwgMHg3MzlGLCAweDM5Q0MsIDB4NzNBMCwgMHgzOUNELAotICAgIDB4NzNBMiwgMHg0MjRFLCAweDczQTUsIDB4NDZBNiwgMHg3M0E2LCAweDM5Q0UsIDB4NzNBOCwgMHgzQzNGLAotICAgIDB4NzNBOSwgMHgwNjFELCAweDczQUIsIDB4MzlDRiwgMHg3M0IyLCAweDBGQjAsIDB4NzNCMywgMHgxNjE3LAotICAgIDB4NzNCNSwgMHgzOUQwLCAweDczQjcsIDB4MzlEMSwgMHg3M0I5LCAweDQ2QTcsIDB4NzNCQSwgMHgzNUVBLAotICAgIDB4NzNCQiwgMHgxNjE5LCAweDczQkMsIDB4MzlEMiwgMHg3M0JELCAweDIxNjYsIDB4NzNCRiwgMHg0NkE4LAotICAgIDB4NzNDMCwgMHgxNjFBLCAweDczQzIsIDB4MDU1MSwgMHg3M0M1LCAweDQ2QTksIDB4NzNDOCwgMHgxNjE2LAotICAgIDB4NzNDOSwgMHgyMTY3LCAweDczQ0EsIDB4MDg4NywgMHg3M0NCLCAweDQ2QUEsIDB4NzNDRCwgMHgwQkRELAotICAgIDB4NzNDRSwgMHgxNjE4LCAweDczQ0YsIDB4MzlEMywgMHg3M0QyLCAweDIxNkEsIDB4NzNENiwgMHgyMTY4LAotICAgIDB4NzNEOSwgMHgzOUQ0LCAweDczREUsIDB4MTYxRCwgMHg3M0UwLCAweDA5MUEsIDB4NzNFMSwgMHg0NkFCLAotICAgIDB4NzNFMywgMHgyMTY5LCAweDczRTQsIDB4M0MzOSwgMHg3M0U1LCAweDE2MUIsIDB4NzNFNywgMHg0NkFDLAotICAgIDB4NzNFOSwgMHgzOUQ1LCAweDczRUEsIDB4MDcxNCwgMHg3M0VELCAweDBENUQsIDB4NzNFRSwgMHgxNjFDLAotICAgIDB4NzNGMSwgMHgxNjM3LCAweDczRjQsIDB4MzlENiwgMHg3M0Y1LCAweDIxNkMsIDB4NzNGOCwgMHgxNjIyLAotICAgIDB4NzNGOSwgMHg0NkFELCAweDczRkEsIDB4NDZBRiwgMHg3M0ZELCAweDM5RDcsIDB4NzNGRSwgMHgwNzcxLAotICAgIDB4NzQwMSwgMHg0NkIwLCAweDc0MDMsIDB4MDY3RiwgMHg3NDA0LCAweDM5RDgsIDB4NzQwNSwgMHgxNjFGLAotICAgIDB4NzQwNiwgMHgwRjY3LCAweDc0MDcsIDB4MjE2QiwgMHg3NDA5LCAweDBGNzgsIDB4NzQwQSwgMHgzOUQ5LAotICAgIDB4NzQxMywgMHg0NkFFLCAweDc0MUEsIDB4MzlEQSwgMHg3NDFCLCAweDM5REIsIDB4NzQyMSwgMHgzQzNBLAotICAgIDB4NzQyMiwgMHgwQjU2LCAweDc0MjQsIDB4MzlEQywgMHg3NDI1LCAweDE2MjEsIDB4NzQyNiwgMHgyMTZELAotICAgIDB4NzQyOCwgMHgzOURELCAweDc0MjksIDB4MjE2RiwgMHg3NDJBLCAweDIxNkUsIDB4NzQyQiwgMHg0MjRGLAotICAgIDB4NzQyQywgMHgzOURFLCAweDc0MkUsIDB4MjE3MCwgMHg3NDJGLCAweDM5REYsIDB4NzQzMCwgMHgzOUUwLAotICAgIDB4NzQzMSwgMHgzOUUxLCAweDc0MzIsIDB4MTYyMywgMHg3NDMzLCAweDBGOUUsIDB4NzQzNCwgMHgwNkNGLAotICAgIDB4NzQzNSwgMHgwRDkwLCAweDc0MzYsIDB4MEQwMCwgMHg3NDM5LCAweDM5RTIsIDB4NzQzQSwgMHgxNjI0LAotICAgIDB4NzQzRiwgMHgxNjI2LCAweDc0NDAsIDB4NDZCMiwgMHg3NDQxLCAweDE2MjksIDB4NzQ0MywgMHg0NkIzLAotICAgIDB4NzQ0NCwgMHgzOUUzLCAweDc0NDYsIDB4NDI1MCwgMHg3NDQ3LCAweDM5RTQsIDB4NzQ0QiwgMHgzOUU1LAotICAgIDB4NzQ0RCwgMHgzOUU2LCAweDc0NTEsIDB4MzlFNywgMHg3NDUyLCAweDQ2QjQsIDB4NzQ1MywgMHg0NkIxLAotICAgIDB4NzQ1NSwgMHgxNjI1LCAweDc0NTcsIDB4MzlFOCwgMHg3NDU5LCAweDE2MjgsIDB4NzQ1QSwgMHgwNzlFLAotICAgIDB4NzQ1QiwgMHgwNEVGLCAweDc0NUMsIDB4MTYyQSwgMHg3NDVELCAweDQ2QjUsIDB4NzQ1RSwgMHgwQTM2LAotICAgIDB4NzQ1RiwgMHgxNjI3LCAweDc0NjAsIDB4MEZBNCwgMHg3NDYyLCAweDQyNTEsIDB4NzQ2MywgMHgxNjJELAotICAgIDB4NzQ2NCwgMHgxRDM1LCAweDc0NjYsIDB4MzlFOSwgMHg3NDY5LCAweDE2MkIsIDB4NzQ2QSwgMHgxNjJFLAotICAgIDB4NzQ2QiwgMHgzOUVBLCAweDc0NkQsIDB4NDI1MiwgMHg3NDZGLCAweDE2MjAsIDB4NzQ3MCwgMHgxNjJDLAotICAgIDB4NzQ3MSwgMHgzOUVCLCAweDc0NzIsIDB4NEM1NywgMHg3NDczLCAweDA4MkMsIDB4NzQ3NiwgMHgxNjJGLAotICAgIDB4NzQ3RSwgMHgxNjMwLCAweDc0ODAsIDB4MzlFQywgMHg3NDgxLCAweDQ2QjYsIDB4NzQ4MywgMHgwRjY4LAotICAgIDB4NzQ4NSwgMHgzOUVELCAweDc0ODYsIDB4MzlFRSwgMHg3NDg3LCAweDM5RUYsIDB4NzQ4OCwgMHg0NkI3LAotICAgIDB4NzQ4OSwgMHgyMTcyLCAweDc0OEIsIDB4MTYzMSwgMHg3NDkwLCAweDM5RjAsIDB4NzQ5MiwgMHg0NkI5LAotICAgIDB4NzQ5NywgMHg0NkJBLCAweDc0OTgsIDB4MzlGMSwgMHg3NDk5LCAweDQ2QkIsIDB4NzQ5QywgMHgzOUYyLAotICAgIDB4NzQ5RSwgMHgxNjMyLCAweDc0OUYsIDB4MjE3MywgMHg3NEEwLCAweDM5RjMsIDB4NzRBMSwgMHg0NkJDLAotICAgIDB4NzRBMiwgMHgxNjFFLCAweDc0QTMsIDB4MzlGNCwgMHg3NEE1LCAweDQ2QkQsIDB4NzRBNiwgMHg0MjUzLAotICAgIDB4NzRBNywgMHgxNjMzLCAweDc0QTgsIDB4MzlGNSwgMHg3NEE5LCAweDQyNTQsIDB4NzRBQSwgMHg0NkJFLAotICAgIDB4NzRBQiwgMHgzOUY2LCAweDc0QUYsIDB4NEM1OCwgMHg3NEIwLCAweDA2MDAsIDB4NzRCNSwgMHgzOUY3LAotICAgIDB4NzRCOSwgMHg0NkJGLCAweDc0QkEsIDB4NDZDMSwgMHg3NEJCLCAweDQ2QzAsIDB4NzRCRCwgMHgwOEQxLAotICAgIDB4NzRCRiwgMHgzOUY4LCAweDc0QzgsIDB4MzlGOSwgMHg3NEM5LCAweDQyNTUsIDB4NzRDQSwgMHgxNjM0LAotICAgIDB4NzRDRiwgMHgxNjM1LCAweDc0RDQsIDB4MTYzNiwgMHg3NEQ2LCAweDQ2QzIsIDB4NzREOCwgMHg0NkMzLAotICAgIDB4NzREQSwgMHgzOUZBLCAweDc0REMsIDB4MDRERCwgMHg3NERFLCAweDM5RkIsIDB4NzRERiwgMHg0QzU5LAotICAgIDB4NzRFMCwgMHgxNjM4LCAweDc0RTIsIDB4MERBRCwgMHg3NEUzLCAweDE2MzksIDB4NzRFNCwgMHg0QzVBLAotICAgIDB4NzRFNiwgMHgwNUUwLCAweDc0RTcsIDB4MTYzQSwgMHg3NEU5LCAweDE2M0IsIDB4NzRFQiwgMHg0NkM0LAotICAgIDB4NzRFRSwgMHgxNjNDLCAweDc0RUYsIDB4Mzc1MCwgMHg3NEYwLCAweDE2M0UsIDB4NzRGMSwgMHgxNjNGLAotICAgIDB4NzRGMiwgMHgxNjNELCAweDc0RjQsIDB4NEM1QiwgMHg3NEY2LCAweDBEQzUsIDB4NzRGNywgMHgxNjQxLAotICAgIDB4NzRGOCwgMHgxNjQwLCAweDc0RkEsIDB4NDZDNiwgMHg3NEZCLCAweDRDNUMsIDB4NzRGRiwgMHg0MjU2LAotICAgIDB4NzUwMSwgMHgyMTc0LCAweDc1MDMsIDB4MTY0MywgMHg3NTA0LCAweDE2NDIsIDB4NzUwNSwgMHgxNjQ0LAotICAgIDB4NzUwQywgMHgxNjQ1LCAweDc1MEQsIDB4MTY0NywgMHg3NTBFLCAweDE2NDYsIDB4NzUxMSwgMHgwODBCLAotICAgIDB4NzUxMywgMHgxNjQ5LCAweDc1MTUsIDB4MTY0OCwgMHg3NTE2LCAweDRDNUQsIDB4NzUxNywgMHg0MjU3LAotICAgIDB4NzUxOCwgMHgwNjAxLCAweDc1MUEsIDB4MEExOSwgMHg3NTFDLCAweDBDMzYsIDB4NzUxRSwgMHgxNjRBLAotICAgIDB4NzUxRiwgMHgwQTVDLCAweDc1MjAsIDB4NDZDOCwgMHg3NTIxLCAweDRDNUUsIDB4NzUyMiwgMHgzNURFLAotICAgIDB4NzUyMywgMHgwODg4LCAweDc1MjQsIDB4NDZDOSwgMHg3NTI1LCAweDA1MUIsIDB4NzUyNiwgMHgxNjRCLAotICAgIDB4NzUyOCwgMHgwRjNCLCAweDc1MkEsIDB4NDZDQSwgMHg3NTJCLCAweDBFMzMsIDB4NzUyQywgMHgxNjRDLAotICAgIDB4NzUyRiwgMHgyMEYyLCAweDc1MzAsIDB4MEMzRSwgMHg3NTMxLCAweDBGMUQsIDB4NzUzMiwgMHgwN0Q1LAotICAgIDB4NzUzMywgMHgwQTAzLCAweDc1MzcsIDB4MEI4OSwgMHg3NTM4LCAweDEwQzksIDB4NzUzQSwgMHgwQkNBLAotICAgIDB4NzUzQiwgMHgwNTY4LCAweDc1M0MsIDB4MTY0RCwgMHg3NTNELCAweDQ2Q0QsIDB4NzUzRSwgMHg0NkNFLAotICAgIDB4NzUzRiwgMHg0QzVGLCAweDc1NDAsIDB4NDZDRiwgMHg3NTQ0LCAweDE2NEUsIDB4NzU0NiwgMHgxNjUzLAotICAgIDB4NzU0OCwgMHg0NkQwLCAweDc1NDksIDB4MTY1MSwgMHg3NTRBLCAweDE2NTAsIDB4NzU0QiwgMHgxM0M3LAotICAgIDB4NzU0QywgMHgwNTg0LCAweDc1NEQsIDB4MTY0RiwgMHg3NTRFLCAweDM5RkMsIDB4NzU0RiwgMHgwNDlFLAotICAgIDB4NzU1MCwgMHg0NkQxLCAweDc1NTEsIDB4MEQzRSwgMHg3NTUyLCAweDQ2RDIsIDB4NzU1NCwgMHgwRDVFLAotICAgIDB4NzU1OSwgMHgwRjc5LCAweDc1NUEsIDB4MTY1NCwgMHg3NTVCLCAweDE2NTIsIDB4NzU1QywgMHgwQjlBLAotICAgIDB4NzU1RCwgMHgwQTRBLCAweDc1NUUsIDB4NEM2MCwgMHg3NTYwLCAweDBEM0YsIDB4NzU2MiwgMHgwRDlGLAotICAgIDB4NzU2NCwgMHgxNjU2LCAweDc1NjUsIDB4MEY3NCwgMHg3NTY2LCAweDA3MjMsIDB4NzU2NywgMHgxNjU3LAotICAgIDB4NzU2OSwgMHgxNjU1LCAweDc1NkEsIDB4MEQ2QSwgMHg3NTZCLCAweDE2NTgsIDB4NzU2QywgMHgzQzNCLAotICAgIDB4NzU2RCwgMHgxNjU5LCAweDc1NkYsIDB4MjE3NSwgMHg3NTcwLCAweDA0OUYsIDB4NzU3MSwgMHg0NkQ0LAotICAgIDB4NzU3MiwgMHg0NkQzLCAweDc1NzMsIDB4MDlERSwgMHg3NTc0LCAweDE2NUUsIDB4NzU3NSwgMHgzNzUxLAotICAgIDB4NzU3NiwgMHgxNjVCLCAweDc1NzcsIDB4MENDNSwgMHg3NTc4LCAweDE2NUEsIDB4NzU3OSwgMHgzOUZELAotICAgIDB4NzU3QSwgMHg0NkQ1LCAweDc1N0QsIDB4NDZENiwgMHg3NTdFLCAweDQ2RDcsIDB4NzU3RiwgMHgwNjQwLAotICAgIDB4NzU4MSwgMHgzOUZFLCAweDc1ODIsIDB4MTY2MSwgMHg3NTg2LCAweDE2NUMsIDB4NzU4NywgMHgxNjVELAotICAgIDB4NzU4OSwgMHgxNjYwLCAweDc1OEEsIDB4MTY1RiwgMHg3NThCLCAweDBEOTcsIDB4NzU4QywgMHg0NkQ4LAotICAgIDB4NzU4RSwgMHgwQUM0LCAweDc1OEYsIDB4MEFDMywgMHg3NTkwLCAweDM5RkYsIDB4NzU5MSwgMHgwNjU5LAotICAgIDB4NzU5MiwgMHgzQTAwLCAweDc1OTMsIDB4M0EwMSwgMHg3NTk0LCAweDE2NjIsIDB4NzU5OSwgMHg0QzYxLAotICAgIDB4NzU5QSwgMHgxNjYzLCAweDc1OUQsIDB4MTY2NCwgMHg3NUEyLCAweDQ2REEsIDB4NzVBMywgMHgxNjY2LAotICAgIDB4NzVBNCwgMHg0QzYyLCAweDc1QTUsIDB4MTY2NSwgMHg3NUFCLCAweDA0RjgsIDB4NzVCMCwgMHg0NkRDLAotICAgIDB4NzVCMSwgMHgxNjZFLCAweDc1QjIsIDB4MEQ3QywgMHg3NUIzLCAweDE2NjgsIDB4NzVCNCwgMHgzQTAyLAotICAgIDB4NzVCNSwgMHgxNjZBLCAweDc1QjcsIDB4NDZERCwgMHg3NUI4LCAweDE2NkMsIDB4NzVCOSwgMHgwQTA0LAotICAgIDB4NzVCQywgMHgxNjZELCAweDc1QkQsIDB4MTY2QiwgMHg3NUJFLCAweDA4RUMsIDB4NzVCRiwgMHg0NkRFLAotICAgIDB4NzVDMCwgMHg0NkRGLCAweDc1QzEsIDB4NEM2MywgMHg3NUMyLCAweDE2NjcsIDB4NzVDMywgMHgxNjY5LAotICAgIDB4NzVDNCwgMHg0QzY0LCAweDc1QzUsIDB4MERCNCwgMHg3NUM2LCAweDQ2RTAsIDB4NzVDNywgMHgwOUIxLAotICAgIDB4NzVDQSwgMHgxNjcwLCAweDc1Q0MsIDB4NEM2NSwgMHg3NUNELCAweDE2NkYsIDB4NzVDRSwgMHg0MjU5LAotICAgIDB4NzVDRiwgMHg0NkUxLCAweDc1RDIsIDB4MTY3MSwgMHg3NUQzLCAweDQ2RTIsIDB4NzVENCwgMHgwOEQyLAotICAgIDB4NzVENSwgMHgwODFGLCAweDc1RDcsIDB4NEM2NiwgMHg3NUQ4LCAweDBDNzEsIDB4NzVEOSwgMHgxNjcyLAotICAgIDB4NzVEQiwgMHgwQkU3LCAweDc1REMsIDB4NEM2NywgMHg3NURELCAweDQ2RTMsIDB4NzVERSwgMHgxNjc0LAotICAgIDB4NzVERiwgMHg0NkU0LCAweDc1RTAsIDB4NDZFNSwgMHg3NUUxLCAweDRDNjgsIDB4NzVFMiwgMHgwRjY5LAotICAgIDB4NzVFMywgMHgxNjczLCAweDc1RTQsIDB4M0EwMywgMHg3NUU3LCAweDQ2RTYsIDB4NzVFOSwgMHgwQUVCLAotICAgIDB4NzVFQywgMHgzNzUyLCAweDc1RUUsIDB4NDZFNywgMHg3NUVGLCAweDRDNjksIDB4NzVGMCwgMHgxNjc5LAotICAgIDB4NzVGMSwgMHg0NkU4LCAweDc1RjIsIDB4MTY3QiwgMHg3NUYzLCAweDE2N0MsIDB4NzVGNCwgMHgwQjkyLAotICAgIDB4NzVGOSwgMHgzQTA0LCAweDc1RkEsIDB4MTY3QSwgMHg3NUZDLCAweDE2NzcsIDB4NzVGRSwgMHgxNjc1LAotICAgIDB4NzVGRiwgMHgxNjc2LCAweDc2MDAsIDB4M0EwNSwgMHg3NjAxLCAweDE2NzgsIDB4NzYwMiwgMHg0MjVBLAotICAgIDB4NzYwMywgMHg0NkU5LCAweDc2MDQsIDB4NEM2QSwgMHg3NjA3LCAweDQ2RUIsIDB4NzYwOCwgMHg0MjVCLAotICAgIDB4NzYwOSwgMHgxNjdGLCAweDc2MEEsIDB4M0EwNiwgMHg3NjBCLCAweDE2N0QsIDB4NzYwQywgMHg0QzZCLAotICAgIDB4NzYwRCwgMHgxNjdFLCAweDc2MEYsIDB4NDZFQywgMHg3NjEzLCAweDQ2RUYsIDB4NzYxNSwgMHgzQTA3LAotICAgIDB4NzYxNiwgMHgzQTA4LCAweDc2MTgsIDB4NDZFQSwgMHg3NjE5LCAweDNBMDksIDB4NzYxQiwgMHg0NkYwLAotICAgIDB4NzYxQywgMHg0NkYxLCAweDc2MUQsIDB4NEM2QywgMHg3NjFFLCAweDNBMEEsIDB4NzYxRiwgMHgxNjgwLAotICAgIDB4NzYyMCwgMHgxNjgyLCAweDc2MjEsIDB4MTY4MywgMHg3NjIyLCAweDE2ODQsIDB4NzYyNCwgMHgxNjg1LAotICAgIDB4NzYyNSwgMHg0NkYzLCAweDc2MjYsIDB4MzY0NSwgMHg3NjI3LCAweDE2ODEsIDB4NzYyOCwgMHg0NkY0LAotICAgIDB4NzYyRCwgMHgzQTBCLCAweDc2MzAsIDB4MTY4NywgMHg3NjMyLCAweDRDNkQsIDB4NzYzMywgMHg0NkY2LAotICAgIDB4NzYzNCwgMHgxNjg2LCAweDc2MzUsIDB4M0EwQywgMHg3NjM4LCAweDRDNkUsIDB4NzYzQiwgMHgxNjg4LAotICAgIDB4NzYzQywgMHg0NkY1LCAweDc2NDEsIDB4NDZGOSwgMHg3NjQyLCAweDBGOEQsIDB4NzY0MywgMHgzQTBELAotICAgIDB4NzY0NSwgMHg0QzZGLCAweDc2NDYsIDB4MTY4QiwgMHg3NjQ3LCAweDE2ODksIDB4NzY0OCwgMHgxNjhBLAotICAgIDB4NzY0OSwgMHg0NkZCLCAweDc2NEEsIDB4NEM3MCwgMHg3NjRCLCAweDNBMEUsIDB4NzY0QywgMHgwNjFFLAotICAgIDB4NzY0RSwgMHgzNzUzLCAweDc2NTIsIDB4MEYwQSwgMHg3NjU1LCAweDQ2RkMsIDB4NzY1NiwgMHgwRTFBLAotICAgIDB4NzY1OCwgMHgxNjhELCAweDc2NUMsIDB4MTY4QywgMHg3NjVGLCAweDRDNzEsIDB4NzY2MSwgMHgxNjhFLAotICAgIDB4NzY2MiwgMHgxNjhGLCAweDc2NjQsIDB4NDI1QywgMHg3NjY1LCAweDNBMEYsIDB4NzY2NywgMHgxNjkzLAotICAgIDB4NzY2OCwgMHgxNjkwLCAweDc2NjksIDB4MTY5MSwgMHg3NjZBLCAweDE2OTIsIDB4NzY2QywgMHgxNjk0LAotICAgIDB4NzY2RCwgMHgzQTEwLCAweDc2NkUsIDB4NDZGRSwgMHg3NjZGLCAweDNBMTEsIDB4NzY3MCwgMHgxNjk1LAotICAgIDB4NzY3MSwgMHgzQTEyLCAweDc2NzIsIDB4MTY5NiwgMHg3Njc0LCAweDNBMTMsIDB4NzY3NiwgMHgxNjk3LAotICAgIDB4NzY3OCwgMHgxNjk4LCAweDc2N0EsIDB4MEQ0MywgMHg3NjdCLCAweDBDNEEsIDB4NzY3QywgMHgxNjk5LAotICAgIDB4NzY3RCwgMHgwRDI4LCAweDc2N0UsIDB4MERBNiwgMHg3NjgwLCAweDE2OUEsIDB4NzY4MSwgMHg0MjVELAotICAgIDB4NzY4MiwgMHgyMTc2LCAweDc2ODMsIDB4MTY5QiwgMHg3Njg0LCAweDBDMjQsIDB4NzY4NiwgMHgwNTg1LAotICAgIDB4NzY4NywgMHgwN0Q2LCAweDc2ODgsIDB4MTY5QywgMHg3NjhCLCAweDE2OUQsIDB4NzY4RSwgMHgxNjlFLAotICAgIDB4NzY5MCwgMHgwODc3LCAweDc2OTMsIDB4MTZBMCwgMHg3Njk1LCAweDQ2RkYsIDB4NzY5NiwgMHgxNjlGLAotICAgIDB4NzY5OSwgMHgxNkExLCAweDc2OUEsIDB4MTZBMiwgMHg3NjlCLCAweDIxNzksIDB4NzY5QywgMHgyMTc3LAotICAgIDB4NzY5RCwgMHg0MjVFLCAweDc2OUUsIDB4MjE3OCwgMHg3NkEwLCAweDQ3MDEsIDB4NzZBMSwgMHg0NzAwLAotICAgIDB4NzZBNCwgMHgzQTE0LCAweDc2QTUsIDB4M0ExNSwgMHg3NkE2LCAweDIxN0EsIDB4NzZBNywgMHg0NzAyLAotICAgIDB4NzZBOCwgMHg0NzAzLCAweDc2QUEsIDB4NDI1RiwgMHg3NkFELCAweDRDNzIsIDB4NzZBRSwgMHgwRDdELAotICAgIDB4NzZBRiwgMHg0NzA0LCAweDc2QjAsIDB4MTZBMywgMHg3NkI0LCAweDE2QTQsIDB4NzZCNiwgMHg0MjYwLAotICAgIDB4NzZCNywgMHgxRDFDLCAweDc2QjgsIDB4MTZBNSwgMHg3NkI5LCAweDE2QTYsIDB4NzZCQSwgMHgxNkE3LAotICAgIDB4NzZCRCwgMHg0QzczLCAweDc2QkYsIDB4MDg3QywgMHg3NkMyLCAweDE2QTgsIDB4NzZDMywgMHgwRDBDLAotICAgIDB4NzZDNSwgMHgzQTE2LCAweDc2QzYsIDB4MEU4RCwgMHg3NkM4LCAweDA0RjAsIDB4NzZDOSwgMHg0NzA2LAotICAgIDB4NzZDQSwgMHgwNEY5LCAweDc2Q0MsIDB4M0ExNywgMHg3NkNELCAweDE2QTksIDB4NzZDRSwgMHg0MjYxLAotICAgIDB4NzZEMiwgMHgxNkFCLCAweDc2RDQsIDB4NDI2MiwgMHg3NkQ2LCAweDE2QUEsIDB4NzZENywgMHgwQzZBLAotICAgIDB4NzZEOSwgMHg0Qzc0LCAweDc2REIsIDB4MEE1RCwgMHg3NkRDLCAweDE0RDgsIDB4NzZERSwgMHgxNkFDLAotICAgIDB4NzZERiwgMHgwRUNELCAweDc2RTEsIDB4MTZBRCwgMHg3NkUzLCAweDA2MDIsIDB4NzZFNCwgMHgwRDZCLAotICAgIDB4NzZFNSwgMHgxNkFFLCAweDc2RTYsIDB4NDI2MywgMHg3NkU3LCAweDE2QUYsIDB4NzZFOCwgMHg0NzA4LAotICAgIDB4NzZFQSwgMHgxNkIwLCAweDc2RUIsIDB4NEM3NSwgMHg3NkVDLCAweDNBMTgsIDB4NzZFRSwgMHgwRUU4LAotICAgIDB4NzZGMCwgMHg0Qzc2LCAweDc2RjEsIDB4NDI2NCwgMHg3NkYyLCAweDBFRTEsIDB4NzZGNCwgMHgwQkRBLAotICAgIDB4NzZGOCwgMHgwQUVDLCAweDc2RjksIDB4NEM3NywgMHg3NkZCLCAweDE2QjIsIDB4NzZGQywgMHgzQTE5LAotICAgIDB4NzZGRSwgMHgwOTZDLCAweDc3MDAsIDB4NEM3OCwgMHg3NzAxLCAweDA5QjIsIDB4NzcwNCwgMHgxNkI1LAotICAgIDB4NzcwNywgMHgxNkI0LCAweDc3MDgsIDB4MTZCMywgMHg3NzA5LCAweDBEOTEsIDB4NzcwQSwgMHg0MjY1LAotICAgIDB4NzcwQiwgMHgwNjAzLCAweDc3MEMsIDB4MDc1RCwgMHg3NzBFLCAweDRDNzksIDB4NzcxNywgMHg0NzBBLAotICAgIDB4NzcxOSwgMHg0MjY2LCAweDc3MUEsIDB4NDcwQiwgMHg3NzFCLCAweDE2QkIsIDB4NzcxRSwgMHgxNkI4LAotICAgIDB4NzcxRiwgMHgwQTA1LCAweDc3MjAsIDB4MEVCRSwgMHg3NzIyLCAweDRDN0EsIDB4NzcyNCwgMHgxNkI3LAotICAgIDB4NzcyNSwgMHgxNkI5LCAweDc3MjYsIDB4MTZCQSwgMHg3NzI4LCAweDRDN0IsIDB4NzcyOSwgMHgxNkI2LAotICAgIDB4NzcyRCwgMHg0NzBDLCAweDc3MkYsIDB4NEM3QywgMHg3NzM0LCAweDNBMUEsIDB4NzczNSwgMHg0NzBELAotICAgIDB4NzczNiwgMHgzQTFCLCAweDc3MzcsIDB4MTZCQywgMHg3NzM4LCAweDE2QkQsIDB4NzczOSwgMHg0QzdELAotICAgIDB4NzczQSwgMHgwQkNCLCAweDc3M0MsIDB4MDYxRiwgMHg3NzNFLCAweDRDN0UsIDB4Nzc0MCwgMHgwQkEzLAotICAgIDB4Nzc0NSwgMHg0QzdGLCAweDc3NDYsIDB4MjE3QywgMHg3NzQ3LCAweDE2QkUsIDB4Nzc0QSwgMHg0QzgwLAotICAgIDB4Nzc0RCwgMHg0MjY3LCAweDc3NEUsIDB4NDI2OCwgMHg3NzRGLCAweDRDODEsIDB4Nzc1OCwgMHg0NzEyLAotICAgIDB4Nzc1QSwgMHgxNkJGLCAweDc3NUIsIDB4MTZDMiwgMHg3NzVDLCAweDNBMUMsIDB4Nzc1RSwgMHg0QzgyLAotICAgIDB4Nzc1RiwgMHgzQTFELCAweDc3NjAsIDB4M0ExRSwgMHg3NzYxLCAweDBBMkQsIDB4Nzc2MiwgMHgxRUM1LAotICAgIDB4Nzc2MywgMHgwQzlDLCAweDc3NjQsIDB4NEM4MywgMHg3NzY1LCAweDE2QzMsIDB4Nzc2NiwgMHgwRTgxLAotICAgIDB4Nzc2NywgMHg0Qzg0LCAweDc3NjgsIDB4MTZDMCwgMHg3NzZBLCAweDM3NTUsIDB4Nzc2QiwgMHgxNkMxLAotICAgIDB4Nzc2QywgMHg0Qzg1LCAweDc3NzIsIDB4M0ExRiwgMHg3Nzc5LCAweDE2QzYsIDB4Nzc3QSwgMHg0MjY5LAotICAgIDB4Nzc3QywgMHg0NzE0LCAweDc3N0QsIDB4M0EyMCwgMHg3NzdFLCAweDE2QzUsIDB4Nzc3RiwgMHgxNkM0LAotICAgIDB4Nzc4MCwgMHg0MjZBLCAweDc3ODQsIDB4NEM4NiwgMHg3NzhCLCAweDE2QzgsIDB4Nzc4QywgMHg0Qzg3LAotICAgIDB4Nzc4RCwgMHg0Qzg4LCAweDc3OEUsIDB4MTZDNywgMHg3NzkxLCAweDE2QzksIDB4Nzc5NCwgMHg0MjZCLAotICAgIDB4Nzc5NSwgMHgzQTIxLCAweDc3OTYsIDB4NEM4OSwgMHg3NzlBLCAweDQ3MTcsIDB4Nzc5RSwgMHgxNkNCLAotICAgIDB4Nzc5RiwgMHg0NzE4LCAweDc3QTAsIDB4MTZDQSwgMHg3N0EyLCAweDQ3MTksIDB4NzdBNCwgMHg0NzFBLAotICAgIDB4NzdBNSwgMHgwRTFELCAweDc3QTcsIDB4NEM4QSwgMHg3N0E5LCAweDM3NTYsIDB4NzdBQSwgMHgzQTIyLAotICAgIDB4NzdBQywgMHgwOTYwLCAweDc3QUQsIDB4MEY4RSwgMHg3N0FGLCAweDRDOEIsIDB4NzdCMCwgMHgxNkNDLAotICAgIDB4NzdCMywgMHgwQzhGLCAweDc3QjYsIDB4MTZDRCwgMHg3N0I3LCAweDRDOEMsIDB4NzdCOSwgMHgxNkNFLAotICAgIDB4NzdCQiwgMHgxNkQyLCAweDc3QkMsIDB4MTZEMCwgMHg3N0JELCAweDE2RDEsIDB4NzdCRSwgMHg0QzhELAotICAgIDB4NzdCRiwgMHgxNkNGLCAweDc3QzcsIDB4MTZEMywgMHg3N0M5LCAweDRDOEUsIDB4NzdDRCwgMHgxNkQ0LAotICAgIDB4NzdEMSwgMHg0QzhGLCAweDc3RDcsIDB4MTZENSwgMHg3N0Q5LCAweDRDOTAsIDB4NzdEQSwgMHgxNkQ2LAotICAgIDB4NzdEQiwgMHgwRUMzLCAweDc3REMsIDB4MTZENywgMHg3N0RFLCAweDQ3MUIsIDB4NzdERiwgMHg0NzFDLAotICAgIDB4NzdFMCwgMHg0MjZDLCAweDc3RTIsIDB4MEVGQywgMHg3N0UzLCAweDE2RDgsIDB4NzdFNCwgMHg0NzFELAotICAgIDB4NzdFNSwgMHgwQjhDLCAweDc3RTYsIDB4M0EyMywgMHg3N0U3LCAweDBEMjAsIDB4NzdFOSwgMHgwNkUzLAotICAgIDB4NzdFQSwgMHg0NzFFLCAweDc3RUMsIDB4NDcxRiwgMHg3N0VELCAweDBCNzksIDB4NzdFRSwgMHgxNkQ5LAotICAgIDB4NzdFRiwgMHgwNkIyLCAweDc3RjAsIDB4M0EyNCwgMHg3N0YxLCAweDRDOTEsIDB4NzdGMywgMHgwQTc0LAotICAgIDB4NzdGNCwgMHgzQTI1LCAweDc3RkIsIDB4NDcyMCwgMHg3N0ZDLCAweDE2REEsIDB4NzgwMiwgMHgwODJELAotICAgIDB4NzgwNSwgMHg0NzIyLCAweDc4MDYsIDB4M0EyNiwgMHg3ODA5LCAweDQ3MjMsIDB4NzgwQywgMHgxNkRCLAotICAgIDB4NzgwRCwgMHg0NzI0LCAweDc4MTIsIDB4MTZEQywgMHg3ODE0LCAweDA3NUEsIDB4NzgxNSwgMHgwODQ1LAotICAgIDB4NzgxOSwgMHg0NzI1LCAweDc4MjAsIDB4MTZERSwgMHg3ODIxLCAweDIxN0UsIDB4NzgyMiwgMHgzQTI3LAotICAgIDB4NzgyNSwgMHgwQzUwLCAweDc4MjYsIDB4MDg0NiwgMHg3ODI3LCAweDA2NjgsIDB4NzgyQywgMHg0NzI2LAotICAgIDB4NzgyRCwgMHgzQTI4LCAweDc4MkUsIDB4M0EyOSwgMHg3ODMwLCAweDNBMkEsIDB4NzgzMiwgMHgwRTUyLAotICAgIDB4NzgzNCwgMHgwRDAxLCAweDc4MzUsIDB4M0EyQiwgMHg3ODM3LCAweDRDOTIsIDB4NzgzQSwgMHgwQzUxLAotICAgIDB4NzgzRiwgMHgwN0VFLCAweDc4NDMsIDB4NDI2RSwgMHg3ODQ1LCAweDE2RTAsIDB4Nzg0NywgMHg0NzI3LAotICAgIDB4Nzg0RSwgMHgyMTdGLCAweDc4NEYsIDB4MzQxRSwgMHg3ODUxLCAweDNDM0MsIDB4Nzg1QywgMHg0QzkzLAotICAgIDB4Nzg1RCwgMHgwOUIzLCAweDc4NjQsIDB4MjE4MCwgMHg3ODY4LCAweDNBMkMsIDB4Nzg2QSwgMHg0NzI4LAotICAgIDB4Nzg2QiwgMHgwRjdBLCAweDc4NkMsIDB4MDdENywgMHg3ODZFLCAweDQyNkYsIDB4Nzg2RiwgMHgwNzVCLAotICAgIDB4Nzg3MiwgMHgwRDM3LCAweDc4NzQsIDB4MTZFMiwgMHg3ODdBLCAweDIxODEsIDB4Nzg3QywgMHgxNkU0LAotICAgIDB4Nzg3RSwgMHg0Qzk0LCAweDc4ODEsIDB4MDc5RiwgMHg3ODg2LCAweDE2RTMsIDB4Nzg4NywgMHgwQzEyLAotICAgIDB4Nzg4QSwgMHg0NzJBLCAweDc4OEMsIDB4MTZFNiwgMHg3ODhELCAweDA1OTUsIDB4Nzg4RSwgMHgxNkUxLAotICAgIDB4Nzg5MSwgMHgwRDdFLCAweDc4OTMsIDB4MDREMiwgMHg3ODk0LCAweDQ3MkIsIDB4Nzg5NSwgMHgwODVDLAotICAgIDB4Nzg5NywgMHgwRkY4LCAweDc4OTgsIDB4NEM5NSwgMHg3ODlBLCAweDE2RTUsIDB4Nzg5RCwgMHg0NzJELAotICAgIDB4Nzg5RSwgMHgzQTJELCAweDc4OUYsIDB4NDcyRSwgMHg3OEExLCAweDRDOTYsIDB4NzhBMywgMHgxNkU3LAotICAgIDB4NzhBNCwgMHg0NzJDLCAweDc4QTcsIDB4MEUxQiwgMHg3OEE5LCAweDBBN0QsIDB4NzhBQSwgMHgxNkU5LAotICAgIDB4NzhBRCwgMHg0MjcyLCAweDc4QUYsIDB4MTZFQSwgMHg3OEIwLCAweDQyNzAsIDB4NzhCMSwgMHg0Qzk3LAotICAgIDB4NzhCMywgMHg0Qzk4LCAweDc4QjUsIDB4MTZFOCwgMHg3OEJBLCAweDA1QUMsIDB4NzhCQiwgMHg0NzJGLAotICAgIDB4NzhCQywgMHgxNkYwLCAweDc4QkUsIDB4MTZFRiwgMHg3OEMxLCAweDA4RDMsIDB4NzhDNSwgMHgxNkYxLAotICAgIDB4NzhDNiwgMHgxNkVDLCAweDc4QzgsIDB4M0EyRSwgMHg3OEM5LCAweDRDOTksIDB4NzhDQSwgMHgxNkYyLAotICAgIDB4NzhDQiwgMHgxNkVELCAweDc4Q0MsIDB4M0EyRiwgMHg3OENFLCAweDNBMzAsIDB4NzhEMCwgMHgwRDZDLAotICAgIDB4NzhEMSwgMHgxNkVCLCAweDc4RDMsIDB4NEM5QSwgMHg3OEQ0LCAweDE2RUUsIDB4NzhENSwgMHg0NzMwLAotICAgIDB4NzhEQSwgMHgxNkY1LCAweDc4RTAsIDB4M0EzMiwgMHg3OEUxLCAweDNBMzMsIDB4NzhFNCwgMHgzQTMxLAotICAgIDB4NzhFNiwgMHg0NzMxLCAweDc4RTcsIDB4MTZGNCwgMHg3OEU4LCAweDBFOEYsIDB4NzhFQywgMHgxNkYzLAotICAgIDB4NzhFRiwgMHgwNEFGLCAweDc4RjIsIDB4M0EzNCwgMHg3OEY0LCAweDE2RjcsIDB4NzhGNywgMHgzQTM1LAotICAgIDB4NzhGOSwgMHg0NzMyLCAweDc4RkEsIDB4NDczMywgMHg3OEZCLCAweDNBMzYsIDB4NzhGRCwgMHgxNkY2LAotICAgIDB4NzhGRSwgMHg0NzM0LCAweDc5MDAsIDB4NDI3MywgMHg3OTAxLCAweDA5QjQsIDB4NzkwNywgMHgxNkY4LAotICAgIDB4NzkwQywgMHg0QzlCLCAweDc5MEUsIDB4MEFDNSwgMHg3OTEwLCAweDQ3MzYsIDB4NzkxMSwgMHgxNkZBLAotICAgIDB4NzkxMiwgMHgxNkY5LCAweDc5MTksIDB4MTZGQiwgMHg3OTFCLCAweDQ3MzcsIDB4NzkxQywgMHg0Mjc0LAotICAgIDB4NzkxRiwgMHg0QzlDLCAweDc5MjUsIDB4NDczOCwgMHg3OTI2LCAweDE2REQsIDB4NzkyNywgMHg0QzlELAotICAgIDB4NzkyOCwgMHg0QzlFLCAweDc5MkEsIDB4MTZERiwgMHg3OTJCLCAweDE2RkQsIDB4NzkyQywgMHgxNkZDLAotICAgIDB4NzkyRSwgMHg0Mjc1LCAweDc5MzAsIDB4MjE4MiwgMHg3OTMxLCAweDNBMzcsIDB4NzkzNCwgMHg0Mjc2LAotICAgIDB4NzkzQSwgMHgwOEQ0LCAweDc5M0IsIDB4M0EzOSwgMHg3OTNDLCAweDBGQjEsIDB4NzkzRCwgMHgzQTNBLAotICAgIDB4NzkzRSwgMHgwOEZFLCAweDc5M0YsIDB4NEM5RiwgMHg3OTQwLCAweDE2RkUsIDB4Nzk0MSwgMHgwNzBELAotICAgIDB4Nzk0MiwgMHg0Q0EwLCAweDc5NDUsIDB4M0EzQiwgMHg3OTQ2LCAweDQyNzcsIDB4Nzk0NywgMHgwNjVBLAotICAgIDB4Nzk0OCwgMHgwNjQxLCAweDc5NDksIDB4MDhCMSwgMHg3OTRBLCAweDQ3MzksIDB4Nzk1MCwgMHgwRjFFLAotICAgIDB4Nzk1MywgMHgxNzA0LCAweDc5NTQsIDB4NENBMSwgMHg3OTU1LCAweDE3MDMsIDB4Nzk1NiwgMHgwQUM2LAotICAgIDB4Nzk1NywgMHgxNzAwLCAweDc5NTgsIDB4NDczQSwgMHg3OTVBLCAweDE3MDIsIDB4Nzk1QiwgMHgzQTNDLAotICAgIDB4Nzk1QywgMHgzQTNELCAweDc5NUQsIDB4MDk1NSwgMHg3OTVFLCAweDBBMDYsIDB4Nzk1RiwgMHgxNzAxLAotICAgIDB4Nzk2MCwgMHgxNkZGLCAweDc5NjIsIDB4MENFMCwgMHg3OTY1LCAweDA5QjUsIDB4Nzk2NywgMHg0NzNDLAotICAgIDB4Nzk2OCwgMHgwREFFLCAweDc5NkIsIDB4NENBMiwgMHg3OTZELCAweDA4NDcsIDB4Nzk3MiwgMHg0NzNELAotICAgIDB4Nzk3NywgMHgwQzcyLCAweDc5NzksIDB4NDI3OCwgMHg3OTdBLCAweDE3MDUsIDB4Nzk3QywgMHg0Q0EzLAotICAgIDB4Nzk3RiwgMHgxNzA2LCAweDc5ODAsIDB4MTcxQywgMHg3OTgxLCAweDA2RDAsIDB4Nzk4NCwgMHgwRkUzLAotICAgIDB4Nzk4NSwgMHgwQUI3LCAweDc5OEEsIDB4MTcwNywgMHg3OThCLCAweDNBM0UsIDB4Nzk4RCwgMHgwNTUyLAotICAgIDB4Nzk4RSwgMHgwQzEzLCAweDc5OEYsIDB4MERGMSwgMHg3OTk0LCAweDIxODYsIDB4Nzk5NSwgMHg0NzNFLAotICAgIDB4Nzk5NiwgMHgzQTNGLCAweDc5OTgsIDB4M0E0MCwgMHg3OTlCLCAweDIxODgsIDB4Nzk5RCwgMHgxNzA4LAotICAgIDB4NzlBMSwgMHg0NzNGLCAweDc5QTYsIDB4MDY5NCwgMHg3OUE3LCAweDE3MDksIDB4NzlBOSwgMHg0NzQwLAotICAgIDB4NzlBQSwgMHgxNzBCLCAweDc5QUIsIDB4NENBNCwgMHg3OUFFLCAweDE3MEMsIDB4NzlCMCwgMHgwQ0RGLAotICAgIDB4NzlCMSwgMHgxRTRFLCAweDc5QjMsIDB4MTcwRCwgMHg3OUI0LCAweDQ3NDEsIDB4NzlCOCwgMHgzQTQxLAotICAgIDB4NzlCOSwgMHgxNzBFLCAweDc5QkEsIDB4MTcwRiwgMHg3OUJCLCAweDNBNDIsIDB4NzlCRCwgMHgwNkQxLAotICAgIDB4NzlCRSwgMHgwNTUzLCAweDc5QkYsIDB4MEM5RCwgMHg3OUMwLCAweDA5MzIsIDB4NzlDMSwgMHgwOEIyLAotICAgIDB4NzlDMiwgMHg0NzQyLCAweDc5QzQsIDB4NENBNSwgMHg3OUM3LCAweDQ3NDMsIDB4NzlDOCwgMHg0Mjc5LAotICAgIDB4NzlDOSwgMHgxNzEwLCAweDc5Q0EsIDB4M0E0MywgMHg3OUNCLCAweDA5MzMsIDB4NzlDQywgMHg0NzQ0LAotICAgIDB4NzlDRCwgMHg0NzQ1LCAweDc5RDEsIDB4MDU0QSwgMHg3OUQyLCAweDBEQjUsIDB4NzlENCwgMHg0MjdCLAotICAgIDB4NzlENSwgMHgxNzExLCAweDc5RDYsIDB4NDc0NiwgMHg3OUQ4LCAweDBEN0YsIDB4NzlEQSwgMHgzQTQ0LAotICAgIDB4NzlERSwgMHg0MjdDLCAweDc5REYsIDB4MEFDNywgMHg3OUUxLCAweDE3MTQsIDB4NzlFMywgMHgxNzE1LAotICAgIDB4NzlFNCwgMHgwRDFGLCAweDc5RTYsIDB4MEEwNywgMHg3OUU3LCAweDE3MTIsIDB4NzlFOSwgMHgwQjlGLAotICAgIDB4NzlFQSwgMHg0Q0E2LCAweDc5RUIsIDB4NDI3RCwgMHg3OUVDLCAweDE3MTMsIDB4NzlFRCwgMHg0MjdFLAotICAgIDB4NzlGMCwgMHgwOUI2LCAweDc5RkIsIDB4MDRBMCwgMHg3QTAwLCAweDA2NDMsIDB4N0EwMiwgMHg0Q0E3LAotICAgIDB4N0EwMywgMHgzQTQ1LCAweDdBMDUsIDB4MzYzMywgMHg3QTA4LCAweDE3MTYsIDB4N0EwOSwgMHgzQTQ2LAotICAgIDB4N0EwQSwgMHg0NzRCLCAweDdBMEIsIDB4MEMxNCwgMHg3QTBDLCAweDRDQTgsIDB4N0EwRCwgMHgxNzE3LAotICAgIDB4N0EwRSwgMHgwQTZCLCAweDdBMTEsIDB4M0E0NywgMHg3QTE0LCAweDBFQjksIDB4N0ExNSwgMHg0NzRDLAotICAgIDB4N0ExNywgMHgwRDk1LCAweDdBMTgsIDB4MTcxOCwgMHg3QTE5LCAweDE3MTksIDB4N0ExQSwgMHgwQjkzLAotICAgIDB4N0ExQiwgMHg0NzRELCAweDdBMUMsIDB4MEY4RiwgMHg3QTFFLCAweDNBNDgsIDB4N0ExRiwgMHgxNzFCLAotICAgIDB4N0EyMCwgMHgxNzFBLCAweDdBMkQsIDB4M0E0OSwgMHg3QTJFLCAweDA5MUIsIDB4N0EzMCwgMHg0Q0E5LAotICAgIDB4N0EzMSwgMHgxNzFELCAweDdBMzIsIDB4MDRCNCwgMHg3QTM3LCAweDE3MjAsIDB4N0EzOCwgMHg0NzRGLAotICAgIDB4N0EzOSwgMHgzQTRBLCAweDdBM0EsIDB4NENBQSwgMHg3QTNCLCAweDE3MUUsIDB4N0EzQywgMHgwNTU0LAotICAgIDB4N0EzRCwgMHgwNzI0LCAweDdBM0UsIDB4MTcxRiwgMHg3QTNGLCAweDA3RDgsIDB4N0E0MCwgMHgwODA0LAotICAgIDB4N0E0MiwgMHgwRTM2LCAweDdBNDMsIDB4MTcyMSwgMHg3QTQ0LCAweDRDQUIsIDB4N0E0NSwgMHgzQTRCLAotICAgIDB4N0E0NiwgMHgwRTgyLCAweDdBNDcsIDB4NDc1MCwgMHg3QTQ5LCAweDE3MjMsIDB4N0E0QywgMHgzQTRDLAotICAgIDB4N0E0RCwgMHgwQTc1LCAweDdBNEUsIDB4MDRGMSwgMHg3QTRGLCAweDA1M0EsIDB4N0E1MCwgMHgwNDcwLAotICAgIDB4N0E1NiwgMHg0NzUxLCAweDdBNTcsIDB4MTcyMiwgMHg3QTU5LCAweDQ3NTIsIDB4N0E1QywgMHg0NzUzLAotICAgIDB4N0E1RCwgMHgzQTRELCAweDdBNUYsIDB4NDc1NCwgMHg3QTYwLCAweDRGNTYsIDB4N0E2MSwgMHgxNzI0LAotICAgIDB4N0E2MiwgMHgxNzI1LCAweDdBNjMsIDB4MDlERiwgMHg3QTY3LCAweDQ3NTUsIDB4N0E2OSwgMHgxNzI2LAotICAgIDB4N0E2QSwgMHg0NzU2LCAweDdBNkIsIDB4MDVBRCwgMHg3QTZELCAweDNBNEYsIDB4N0E3MCwgMHgxNzI4LAotICAgIDB4N0E3NCwgMHgwNzQwLCAweDdBNzUsIDB4NDc1NywgMHg3QTc2LCAweDA2ODAsIDB4N0E3OCwgMHgzQTUwLAotICAgIDB4N0E3OSwgMHgxNzI5LCAweDdBN0EsIDB4MDZFRCwgMHg3QTdELCAweDE3MkEsIDB4N0E3RiwgMHgwQUEwLAotICAgIDB4N0E4MCwgMHg0Q0FDLCAweDdBODEsIDB4MENBNSwgMHg3QTgyLCAweDQ3NTgsIDB4N0E4MywgMHgwQTg0LAotICAgIDB4N0E4NCwgMHgwODY1LCAweDdBODUsIDB4NDI3RiwgMHg3QTg2LCAweDRDQUQsIDB4N0E4OCwgMHgxNzJCLAotICAgIDB4N0E4QSwgMHg0NzU5LCAweDdBOTAsIDB4NDc1QSwgMHg3QTkyLCAweDBCQTAsIDB4N0E5MywgMHgwQUVELAotICAgIDB4N0E5NCwgMHg0Q0FFLCAweDdBOTUsIDB4MTcyRCwgMHg3QTk2LCAweDE3MkYsIDB4N0E5NywgMHgxNzJDLAotICAgIDB4N0E5OCwgMHgxNzJFLCAweDdBOUYsIDB4MDZGOCwgMHg3QUEwLCAweDNBNTEsIDB4N0FBMywgMHgzQTUyLAotICAgIDB4N0FBOSwgMHgxNzMwLCAweDdBQUEsIDB4MDZGQywgMHg3QUFDLCAweDQ3NUIsIDB4N0FBRSwgMHgwNjgxLAotICAgIDB4N0FBRiwgMHgwRjNDLCAweDdBQjAsIDB4MTczMiwgMHg3QUIzLCAweDNBNTMsIDB4N0FCNSwgMHg0Q0FGLAotICAgIDB4N0FCNiwgMHgxNzMzLCAweDdBQjksIDB4NDc1RSwgMHg3QUJBLCAweDA0RDAsIDB4N0FCQiwgMHgzQTU0LAotICAgIDB4N0FCQywgMHgzQTU1LCAweDdBQkQsIDB4NENCMCwgMHg3QUJFLCAweDQ3NUYsIDB4N0FCRiwgMHgxNzM2LAotICAgIDB4N0FDMywgMHgwNUQ0LCAweDdBQzQsIDB4MTczNSwgMHg3QUM1LCAweDE3MzQsIDB4N0FDNiwgMHgzQTU2LAotICAgIDB4N0FDNywgMHgxNzM4LCAweDdBQzgsIDB4MTczMSwgMHg3QUNBLCAweDE3MzksIDB4N0FDQiwgMHgwRjcxLAotICAgIDB4N0FDQywgMHg0NzYxLCAweDdBQ0QsIDB4MTczQSwgMHg3QUNFLCAweDQyODEsIDB4N0FDRiwgMHgxNzNCLAotICAgIDB4N0FEMSwgMHgyMTg5LCAweDdBRDIsIDB4MTFDNSwgMHg3QUQzLCAweDE3M0QsIDB4N0FENSwgMHgxNzNDLAotICAgIDB4N0FEOSwgMHgxNzNFLCAweDdBREEsIDB4MTczRiwgMHg3QURDLCAweDBGN0QsIDB4N0FERCwgMHgxNzQwLAotICAgIDB4N0FERiwgMHgxQzA4LCAweDdBRTAsIDB4MDlCNywgMHg3QUUxLCAweDE3NDEsIDB4N0FFMiwgMHgxNzQyLAotICAgIDB4N0FFMywgMHgwOTYxLCAweDdBRTUsIDB4MEM5MCwgMHg3QUU2LCAweDE3NDMsIDB4N0FFNywgMHgyMThBLAotICAgIDB4N0FFOCwgMHg0NzYyLCAweDdBRUEsIDB4MEI2NiwgMHg3QUVCLCAweDIxOEMsIDB4N0FFRCwgMHgxNzQ0LAotICAgIDB4N0FFRiwgMHgwQjdBLCAweDdBRjAsIDB4MTc0NSwgMHg3QUY0LCAweDQ3NjMsIDB4N0FGNiwgMHgwNjlELAotICAgIDB4N0FGOCwgMHgxMDc2LCAweDdBRjksIDB4MEI5QiwgMHg3QUZBLCAweDA4REYsIDB4N0FGRCwgMHg0MjgyLAotICAgIDB4N0FGRSwgMHg0Q0IxLCAweDdBRkYsIDB4MDYwNCwgMHg3QjAyLCAweDE3NDYsIDB4N0IwNCwgMHgxNzUzLAotICAgIDB4N0IwNiwgMHgxNzQ5LCAweDdCMDcsIDB4M0E1NywgMHg3QjA4LCAweDA2ODIsIDB4N0IwQSwgMHgxNzQ4LAotICAgIDB4N0IwQiwgMHgxNzU1LCAweDdCMEYsIDB4MTc0NywgMHg3QjExLCAweDA5QjgsIDB4N0IxMiwgMHg0MjgzLAotICAgIDB4N0IxNCwgMHgzQTU4LCAweDdCMTgsIDB4MTc0QiwgMHg3QjE5LCAweDE3NEMsIDB4N0IxQiwgMHgwQzI1LAotICAgIDB4N0IxRSwgMHgxNzRELCAweDdCMjAsIDB4MDVCQywgMHg3QjI1LCAweDBBMjAsIDB4N0IyNiwgMHgwREQ2LAotICAgIDB4N0IyNywgMHgzQTU5LCAweDdCMjgsIDB4MTc0RiwgMHg3QjJBLCAweDQ3NjgsIDB4N0IyQiwgMHg0Q0IyLAotICAgIDB4N0IyQywgMHgwQjQ4LCAweDdCMkQsIDB4NDI4NCwgMHg3QjJFLCAweDQ3NjksIDB4N0IyRiwgMHg0NzZBLAotICAgIDB4N0IzMSwgMHgzQTVBLCAweDdCMzMsIDB4MTc0QSwgMHg3QjM1LCAweDE3NEUsIDB4N0IzNiwgMHgxNzUwLAotICAgIDB4N0IzOSwgMHgwODZCLCAweDdCM0IsIDB4NDI4NSwgMHg3QjNELCAweDQ3NjcsIDB4N0I0MSwgMHg0NzZFLAotICAgIDB4N0I0NSwgMHgxNzU3LCAweDdCNDYsIDB4MERBMCwgMHg3QjQ3LCAweDNBNUIsIDB4N0I0OCwgMHgwRDNBLAotICAgIDB4N0I0OSwgMHgwQzczLCAweDdCNEIsIDB4MDZEMiwgMHg3QjRDLCAweDE3NTYsIDB4N0I0RCwgMHgxNzU0LAotICAgIDB4N0I0RSwgMHgzQTVDLCAweDdCNEYsIDB4MEQ0OSwgMHg3QjUwLCAweDE3NTEsIDB4N0I1MSwgMHgwQjlDLAotICAgIDB4N0I1MiwgMHgwQzc1LCAweDdCNTMsIDB4Mzc1RCwgMHg3QjU0LCAweDBDNzQsIDB4N0I1NSwgMHg0NzcwLAotICAgIDB4N0I1NiwgMHgwODY2LCAweDdCNUQsIDB4MTc2OSwgMHg3QjYwLCAweDNBNUQsIDB4N0I2NCwgMHg0NzcyLAotICAgIDB4N0I2NSwgMHgxNzU5LCAweDdCNjYsIDB4NDc3MywgMHg3QjY3LCAweDE3NUIsIDB4N0I2OSwgMHgzQTVFLAotICAgIDB4N0I2QywgMHgxNzVFLCAweDdCNkQsIDB4M0E1RiwgMHg3QjZFLCAweDE3NUYsIDB4N0I2RiwgMHg0Mjg2LAotICAgIDB4N0I3MCwgMHgxNzVDLCAweDdCNzEsIDB4MTc1RCwgMHg3QjcyLCAweDNBNjAsIDB4N0I3MywgMHg0Nzc0LAotICAgIDB4N0I3NCwgMHgxNzVBLCAweDdCNzUsIDB4MTc1OCwgMHg3Qjc3LCAweDRDQjMsIDB4N0I3OSwgMHg0NzcxLAotICAgIDB4N0I3QSwgMHgxNzUyLCAweDdCN0YsIDB4NDc2RCwgMHg3Qjg2LCAweDBFMUYsIDB4N0I4NywgMHgwNTU1LAotICAgIDB4N0I4QiwgMHgxNzY2LCAweDdCOEQsIDB4MTc2MywgMHg3QjhGLCAweDE3NjgsIDB4N0I5MCwgMHg0Nzc3LAotICAgIDB4N0I5MSwgMHgzQTYxLCAweDdCOTIsIDB4MTc2NywgMHg3Qjk0LCAweDBEMjksIDB4N0I5NSwgMHgwRUIzLAotICAgIDB4N0I5NywgMHgwODg5LCAweDdCOTgsIDB4MTc2MSwgMHg3Qjk5LCAweDE3NkEsIDB4N0I5QSwgMHgxNzY1LAotICAgIDB4N0I5QiwgMHg0Nzc4LCAweDdCOUMsIDB4MTc2NCwgMHg3QjlELCAweDE3NjAsIDB4N0I5RSwgMHgyMThELAotICAgIDB4N0I5RiwgMHgxNzYyLCAweDdCQTAsIDB4NENCNCwgMHg3QkExLCAweDA2MDUsIDB4N0JBQSwgMHgwQjdCLAotICAgIDB4N0JBQywgMHg0Q0I1LCAweDdCQUQsIDB4MEFBMSwgMHg3QkFGLCAweDNBNjIsIDB4N0JCMCwgMHg0Q0I2LAotICAgIDB4N0JCMSwgMHgwRDM2LCAweDdCQjQsIDB4MTc2RiwgMHg3QkI1LCAweDQ3N0EsIDB4N0JCOCwgMHgwRDM4LAotICAgIDB4N0JCQywgMHg0NzdCLCAweDdCQzAsIDB4MEE4NSwgMHg3QkMxLCAweDE3NkMsIDB4N0JDNCwgMHgwRDYzLAotICAgIDB4N0JDNSwgMHg0NzdDLCAweDdCQzYsIDB4MTc3MCwgMHg3QkM3LCAweDBFMjMsIDB4N0JDOSwgMHgwQjk5LAotICAgIDB4N0JDQSwgMHg0NzdELCAweDdCQ0IsIDB4MTc2QiwgMHg3QkNDLCAweDE3NkQsIDB4N0JDRiwgMHgxNzZFLAotICAgIDB4N0JENCwgMHg0NzgwLCAweDdCRDYsIDB4NDc4MSwgMHg3QkQ3LCAweDNBNjMsIDB4N0JEOSwgMHgzQTY0LAotICAgIDB4N0JEQSwgMHg0NzgyLCAweDdCREQsIDB4MTc3MSwgMHg3QkUwLCAweDA4RjAsIDB4N0JFNCwgMHgwQzlFLAotICAgIDB4N0JFNSwgMHgxNzc2LCAweDdCRTYsIDB4MTc3NSwgMHg3QkU4LCAweDRDQjcsIDB4N0JFOSwgMHgxNzcyLAotICAgIDB4N0JFQSwgMHg0NzgzLCAweDdCRUQsIDB4MEZEQywgMHg3QkYwLCAweDQ3ODQsIDB4N0JGMiwgMHg0Q0I4LAotICAgIDB4N0JGMywgMHgxNzdCLCAweDdCRjYsIDB4MTc3RiwgMHg3QkY3LCAweDE3N0MsIDB4N0JGOCwgMHg0Q0I5LAotICAgIDB4N0JGQywgMHg0Q0JBLCAweDdCRkUsIDB4NENCQiwgMHg3QzAwLCAweDE3NzgsIDB4N0MwMSwgMHg0Mjg3LAotICAgIDB4N0MwMywgMHg0Nzg1LCAweDdDMDcsIDB4MTc3OSwgMHg3QzA5LCAweDRDQkMsIDB4N0MwQiwgMHgzQTY1LAotICAgIDB4N0MwRCwgMHgxNzdFLCAweDdDMEUsIDB4NDc4NiwgMHg3QzBGLCAweDNBNjYsIDB4N0MxMSwgMHgxNzczLAotICAgIDB4N0MxMiwgMHgxMEVBLCAweDdDMTMsIDB4MTc3QSwgMHg3QzE0LCAweDE3NzQsIDB4N0MxNywgMHgxNzdELAotICAgIDB4N0MxRSwgMHgxRTNCLCAweDdDMUYsIDB4MTc4MywgMHg3QzIwLCAweDNBNjcsIDB4N0MyMSwgMHgwNjA2LAotICAgIDB4N0MyMywgMHgxNzgwLCAweDdDMjYsIDB4M0E2OCwgMHg3QzI3LCAweDE3ODEsIDB4N0MyOCwgMHg0Q0JELAotICAgIDB4N0MyQSwgMHgxNzgyLCAweDdDMkIsIDB4MTc4NSwgMHg3QzJGLCAweDRDQkUsIDB4N0MzMSwgMHgzQTY5LAotICAgIDB4N0MzMywgMHg0Mjg4LCAweDdDMzYsIDB4M0E2QSwgMHg3QzM3LCAweDE3ODQsIDB4N0MzOCwgMHgwRDhBLAotICAgIDB4N0MzRCwgMHgxNzg2LCAweDdDM0UsIDB4MEZDNCwgMHg3QzNGLCAweDBFM0QsIDB4N0M0MCwgMHgxNzhCLAotICAgIDB4N0M0MiwgMHg0Q0JGLCAweDdDNDMsIDB4MTc4OCwgMHg3QzQ1LCAweDQ3ODcsIDB4N0M0QSwgMHg0Nzg4LAotICAgIDB4N0M0QywgMHgxNzg3LCAweDdDNEQsIDB4MEE3NiwgMHg3QzRGLCAweDE3OEEsIDB4N0M1MCwgMHgxNzhDLAotICAgIDB4N0M1MSwgMHgzQTZCLCAweDdDNTIsIDB4NENDMCwgMHg3QzUzLCAweDRDQzEsIDB4N0M1NCwgMHgxNzg5LAotICAgIDB4N0M1NiwgMHgxNzkwLCAweDdDNTcsIDB4NDc4OSwgMHg3QzU4LCAweDE3OEQsIDB4N0M1OSwgMHgzQTZDLAotICAgIDB4N0M1QiwgMHg0Q0MyLCAweDdDNUMsIDB4NENDMywgMHg3QzVELCAweDRDQzQsIDB4N0M1RSwgMHg0NzhBLAotICAgIDB4N0M1RiwgMHgxNzhFLCAweDdDNjAsIDB4MTc3NywgMHg3QzYxLCAweDQ3OEIsIDB4N0M2NCwgMHgxNzhGLAotICAgIDB4N0M2NSwgMHgxNzkxLCAweDdDNjcsIDB4M0E2RCwgMHg3QzY5LCAweDQ3OEMsIDB4N0M2QywgMHgxNzkyLAotICAgIDB4N0M2RCwgMHg0MjhBLCAweDdDNkUsIDB4M0E2RSwgMHg3QzZGLCAweDQ3OEQsIDB4N0M3MCwgMHgzQTZGLAotICAgIDB4N0M3MiwgMHg0Q0M1LCAweDdDNzMsIDB4MEUxNiwgMHg3Qzc1LCAweDE3OTMsIDB4N0M3OSwgMHg0MjhCLAotICAgIDB4N0M3QiwgMHgzNzBFLCAweDdDN0QsIDB4NENDNiwgMHg3QzdFLCAweDBFRUUsIDB4N0M4MSwgMHgwNkM2LAotICAgIDB4N0M4MiwgMHgwNkZGLCAweDdDODMsIDB4MTc5NCwgMHg3Qzg3LCAweDRDQzcsIDB4N0M4OSwgMHgwRTA0LAotICAgIDB4N0M4QiwgMHgwQTJFLCAweDdDOEQsIDB4MEVCQywgMHg3QzhGLCAweDQyOEMsIDB4N0M5MCwgMHgxNzk1LAotICAgIDB4N0M5MiwgMHgwRjdCLCAweDdDOTQsIDB4NDI4RCwgMHg3Qzk1LCAweDBEMkEsIDB4N0M5NywgMHgwQUM4LAotICAgIDB4N0M5OCwgMHgwQ0VBLCAweDdDOUIsIDB4MDk1NywgMHg3QzlFLCAweDRDQzgsIDB4N0M5RiwgMHgwNDg0LAotICAgIDB4N0NBMCwgMHg0MjhFLCAweDdDQTEsIDB4MTc5QSwgMHg3Q0EyLCAweDE3OTgsIDB4N0NBNCwgMHgxNzk2LAotICAgIDB4N0NBNSwgMHgwNURELCAweDdDQTYsIDB4NDc5MSwgMHg3Q0E3LCAweDA5QjksIDB4N0NBOCwgMHgxNzlCLAotICAgIDB4N0NBQiwgMHgxNzk5LCAweDdDQUQsIDB4MTc5NywgMHg3Q0FFLCAweDE3OUYsIDB4N0NCMSwgMHgxNzlFLAotICAgIDB4N0NCMiwgMHgxNzlELCAweDdDQjMsIDB4MTc5QywgMHg3Q0I2LCAweDQ3OTMsIDB4N0NCNywgMHg0Nzk0LAotICAgIDB4N0NCOSwgMHgxN0EwLCAweDdDQkEsIDB4NENDOSwgMHg3Q0JDLCAweDNBNzAsIDB4N0NCRCwgMHgxN0ExLAotICAgIDB4N0NCRSwgMHgwQTVFLCAweDdDQkYsIDB4M0E3MSwgMHg3Q0MwLCAweDE3QTIsIDB4N0NDMiwgMHgxN0E0LAotICAgIDB4N0NDNCwgMHg0Nzk2LCAweDdDQzUsIDB4MTdBMywgMHg3Q0M3LCAweDRDQ0EsIDB4N0NDOCwgMHgzQTcyLAotICAgIDB4N0NDOSwgMHgzQTczLCAweDdDQ0EsIDB4MDc4NiwgMHg3Q0NELCAweDQ3OTgsIDB4N0NDRSwgMHgwQUJBLAotICAgIDB4N0NEMiwgMHgxN0E2LCAweDdDRDMsIDB4NENDQiwgMHg3Q0Q1LCAweDQyOEYsIDB4N0NENiwgMHgwQzc2LAotICAgIDB4N0NENywgMHgzQTc0LCAweDdDRDgsIDB4MTdBNSwgMHg3Q0Q5LCAweDNBNzUsIDB4N0NEQSwgMHg0Q0NDLAotICAgIDB4N0NEQywgMHgxN0E3LCAweDdDREQsIDB4M0E3NiwgMHg3Q0RFLCAweDBFMDUsIDB4N0NERiwgMHgwQUVFLAotICAgIDB4N0NFMCwgMHgwN0Q5LCAweDdDRTIsIDB4MTdBOCwgMHg3Q0U2LCAweDQ3OUIsIDB4N0NFNywgMHgwRjkwLAotICAgIDB4N0NFQiwgMHgzQTc3LCAweDdDRUYsIDB4MTdBQSwgMHg3Q0YyLCAweDE3QUIsIDB4N0NGNCwgMHgxN0FDLAotICAgIDB4N0NGNSwgMHg0NzlELCAweDdDRjYsIDB4MTdBRCwgMHg3Q0Y4LCAweDA4QjMsIDB4N0NGQSwgMHgxN0FFLAotICAgIDB4N0NGQiwgMHgwNzI1LCAweDdDRkUsIDB4MDY4NCwgMHg3RDAwLCAweDA2NDQsIDB4N0QwMiwgMHgxN0IwLAotICAgIDB4N0QwMywgMHg0NzlFLCAweDdEMDQsIDB4MEVGRiwgMHg3RDA1LCAweDA3REEsIDB4N0QwNiwgMHgxN0FGLAotICAgIDB4N0QwNywgMHgzQTc4LCAweDdEMDgsIDB4M0E3OSwgMHg3RDA5LCAweDNBN0EsIDB4N0QwQSwgMHgxN0IzLAotICAgIDB4N0QwQiwgMHgwRUYyLCAweDdEMEQsIDB4MENGMiwgMHg3RDEwLCAweDBEQTUsIDB4N0QxMiwgMHg0N0EwLAotICAgIDB4N0QxMywgMHgzQTdCLCAweDdEMTQsIDB4MDk2RCwgMHg3RDE1LCAweDE3QjIsIDB4N0QxNywgMHgwOEZGLAotICAgIDB4N0QxOCwgMHgwN0RCLCAweDdEMTksIDB4MDhCNCwgMHg3RDFBLCAweDA2ODMsIDB4N0QxQiwgMHgwRTA2LAotICAgIDB4N0QxQywgMHgxN0IxLCAweDdEMUQsIDB4M0E3QywgMHg3RDFFLCAweDQ3QTEsIDB4N0QyMCwgMHgwQUM5LAotICAgIDB4N0QyMSwgMHgwRTcwLCAweDdEMjIsIDB4MDg2NywgMHg3RDIzLCAweDNBN0QsIDB4N0QyQiwgMHgwOEI1LAotICAgIDB4N0QyQywgMHgwQkY5LCAweDdEMkUsIDB4MTdCNiwgMHg3RDJGLCAweDBGQTcsIDB4N0QzMCwgMHgwODQ5LAotICAgIDB4N0QzMSwgMHg0MjkwLCAweDdEMzIsIDB4MTdCNywgMHg3RDMzLCAweDBBMDgsIDB4N0QzNSwgMHgxN0I5LAotICAgIDB4N0QzOSwgMHgwOUJBLCAweDdEM0EsIDB4MDgyMCwgMHg3RDNDLCAweDRDQ0QsIDB4N0QzRCwgMHg0N0E0LAotICAgIDB4N0QzRSwgMHg0N0E1LCAweDdEM0YsIDB4MTdCOCwgMHg3RDQwLCAweDQ3QTYsIDB4N0Q0MSwgMHgzQTdFLAotICAgIDB4N0Q0MiwgMHgwOTM0LCAweDdENDMsIDB4MDc3MiwgMHg3RDQ0LCAweDBBQ0EsIDB4N0Q0NSwgMHgxN0I0LAotICAgIDB4N0Q0NiwgMHgxN0JBLCAweDdENDcsIDB4NDdBNywgMHg3RDQ4LCAweDIxOEYsIDB4N0Q0QiwgMHgxN0I1LAotICAgIDB4N0Q0QywgMHgwNzI2LCAweDdENEQsIDB4NENDRSwgMHg3RDRFLCAweDE3QkQsIDB4N0Q0RiwgMHgxN0MxLAotICAgIDB4N0Q1MCwgMHgwNzQxLCAweDdENTMsIDB4M0E3RiwgMHg3RDU1LCAweDM2M0EsIDB4N0Q1NiwgMHgxN0JDLAotICAgIDB4N0Q1OSwgMHgzQTgwLCAweDdENUEsIDB4NDdBQiwgMHg3RDVCLCAweDE3QzUsIDB4N0Q1QywgMHg0MjkxLAotICAgIDB4N0Q1RCwgMHgzQTgxLCAweDdENUUsIDB4MDdEQywgMHg3RDYxLCAweDBGNTcsIDB4N0Q2MiwgMHgwNDgwLAotICAgIDB4N0Q2MywgMHgxN0MyLCAweDdENjYsIDB4MDY4NSwgMHg3RDY4LCAweDE3QkYsIDB4N0Q2QSwgMHg0N0FDLAotICAgIDB4N0Q2RSwgMHgxN0MwLCAweDdENzAsIDB4NDdBRCwgMHg3RDcxLCAweDBDNzcsIDB4N0Q3MiwgMHgxN0JFLAotICAgIDB4N0Q3MywgMHgxN0JCLCAweDdENzUsIDB4MDU4NiwgMHg3RDc2LCAweDBBODgsIDB4N0Q3OSwgMHgwNzVDLAotICAgIDB4N0Q3QSwgMHgzQTgyLCAweDdEN0QsIDB4MTdDNywgMHg3RDdGLCAweDQ3QUYsIDB4N0Q4MiwgMHg0Q0NGLAotICAgIDB4N0Q4MywgMHg0MjkyLCAweDdEODUsIDB4NENEMCwgMHg3RDg2LCAweDNBODMsIDB4N0Q4OCwgMHg0N0IxLAotICAgIDB4N0Q4OSwgMHgxN0M0LCAweDdEOEIsIDB4M0E4NCwgMHg3RDhDLCAweDNBODUsIDB4N0Q4RCwgMHg0Q0QxLAotICAgIDB4N0Q4RiwgMHgxN0M2LCAweDdEOTEsIDB4NENEMiwgMHg3RDkzLCAweDE3QzMsIDB4N0Q5NywgMHg0N0IyLAotICAgIDB4N0Q5OSwgMHgwNzI3LCAweDdEOUEsIDB4MEIxMywgMHg3RDlCLCAweDE3QzgsIDB4N0Q5QywgMHgwQUYwLAotICAgIDB4N0Q5RCwgMHg0N0I0LCAweDdEOUUsIDB4NENEMywgMHg3RDlGLCAweDE3RDUsIDB4N0RBMCwgMHgyMTkyLAotICAgIDB4N0RBMiwgMHgxN0QxLCAweDdEQTMsIDB4MTdDQiwgMHg3REE2LCAweDQyOTMsIDB4N0RBNywgMHg0N0I1LAotICAgIDB4N0RBQSwgMHg0N0I2LCAweDdEQUIsIDB4MTdDRiwgMHg3REFDLCAweDA5MjYsIDB4N0RBRCwgMHgwNEExLAotICAgIDB4N0RBRSwgMHgxN0NBLCAweDdEQUYsIDB4MTdEMiwgMHg3REIwLCAweDE3RDYsIDB4N0RCMSwgMHgwN0RELAotICAgIDB4N0RCMiwgMHgwRUUyLCAweDdEQjMsIDB4NENENCwgMHg3REI0LCAweDBCRjIsIDB4N0RCNSwgMHgxN0NDLAotICAgIDB4N0RCNiwgMHg0N0I3LCAweDdEQjcsIDB4MjE5MSwgMHg3REI4LCAweDE3RDQsIDB4N0RCOSwgMHg0Q0Q1LAotICAgIDB4N0RCQSwgMHgxN0M5LCAweDdEQkIsIDB4MEI3QywgMHg3REJELCAweDE3Q0UsIDB4N0RCRSwgMHgwNDgxLAotICAgIDB4N0RCRiwgMHgwRUQ2LCAweDdEQzAsIDB4NDdCOCwgMHg3REMyLCAweDQyOTQsIDB4N0RDNywgMHgxN0NELAotICAgIDB4N0RDQSwgMHgwNkQzLCAweDdEQ0IsIDB4MEQ4MCwgMHg3RENDLCAweDNBODYsIDB4N0RDRiwgMHgwQUVGLAotICAgIDB4N0REMCwgMHg0Q0Q2LCAweDdERDEsIDB4MEY5OCwgMHg3REQyLCAweDA5NzksIDB4N0RENSwgMHgxN0ZELAotICAgIDB4N0RENiwgMHgyMTkzLCAweDdERDcsIDB4NDdCOSwgMHg3REQ4LCAweDE3RDcsIDB4N0REOSwgMHg0N0JBLAotICAgIDB4N0REQSwgMHgwQUEyLCAweDdEREMsIDB4MTdEMywgMHg3RERELCAweDE3RDgsIDB4N0RERSwgMHgxN0RBLAotICAgIDB4N0RFMCwgMHgwQzE1LCAweDdERTEsIDB4MTdERCwgMHg3REUzLCAweDM0MEEsIDB4N0RFNCwgMHgxN0Q5LAotICAgIDB4N0RFNSwgMHg0Q0Q3LCAweDdERTYsIDB4NDdCQiwgMHg3REU4LCAweDBFMjQsIDB4N0RFOSwgMHgwNjA3LAotICAgIDB4N0RFQiwgMHgzQTg3LCAweDdERUMsIDB4MEVENywgMHg3REVGLCAweDA0QTIsIDB4N0RGMSwgMHgzQTg4LAotICAgIDB4N0RGMiwgMHgxN0RDLCAweDdERjQsIDB4MEZDNSwgMHg3REY1LCAweDRDRDgsIDB4N0RGNiwgMHg0Q0Q5LAotICAgIDB4N0RGOSwgMHgzQTg5LCAweDdERkIsIDB4MTdEQiwgMHg3RTAxLCAweDA1MTEsIDB4N0UwNCwgMHgwQ0M0LAotICAgIDB4N0UwNSwgMHgxN0RFLCAweDdFMDgsIDB4M0E4QSwgMHg3RTA5LCAweDE3RTUsIDB4N0UwQSwgMHgxN0RGLAotICAgIDB4N0UwQiwgMHgxN0U2LCAweDdFMTAsIDB4NDdCRiwgMHg3RTExLCAweDNBOEIsIDB4N0UxMiwgMHgxN0UyLAotICAgIDB4N0UxNSwgMHgzQThDLCAweDdFMTcsIDB4NDdDMCwgMHg3RTFCLCAweDBEMzEsIDB4N0UxRCwgMHg0N0MxLAotICAgIDB4N0UxRSwgMHgwOEY2LCAweDdFMUYsIDB4MTdFNCwgMHg3RTIwLCAweDNBOEQsIDB4N0UyMSwgMHgxN0UxLAotICAgIDB4N0UyMiwgMHgxN0U3LCAweDdFMjMsIDB4MTdFMCwgMHg3RTI2LCAweDA5NEUsIDB4N0UyNywgMHg0N0MyLAotICAgIDB4N0UyOCwgMHg0Mjk1LCAweDdFMkIsIDB4MEU1MywgMHg3RTJDLCAweDQ3QzMsIDB4N0UyRSwgMHgwOTU2LAotICAgIDB4N0UyRiwgMHg0Q0RBLCAweDdFMzEsIDB4MTdFMywgMHg3RTMyLCAweDE3RUYsIDB4N0UzNSwgMHgxN0VCLAotICAgIDB4N0UzNiwgMHg0Q0RCLCAweDdFMzcsIDB4MTdFRSwgMHg3RTM5LCAweDE3RUMsIDB4N0UzQSwgMHgxN0YwLAotICAgIDB4N0UzQiwgMHgxN0VBLCAweDdFM0QsIDB4MTdEMCwgMHg3RTNFLCAweDBBNzcsIDB4N0U0MSwgMHgwRDVGLAotICAgIDB4N0U0MywgMHgxN0VELCAweDdFNDQsIDB4NENEQywgMHg3RTQ1LCAweDQ3QzQsIDB4N0U0NiwgMHgxN0U4LAotICAgIDB4N0U0NywgMHgzQThFLCAweDdFNDgsIDB4Mzc2NywgMHg3RTRBLCAweDBBQTMsIDB4N0U0QiwgMHgwNzI4LAotICAgIDB4N0U0RCwgMHgwOTM1LCAweDdFNTIsIDB4MjE5NCwgMHg3RTU0LCAweDA5RUIsIDB4N0U1NSwgMHgwQUI4LAotICAgIDB4N0U1NiwgMHgxN0YzLCAweDdFNTksIDB4MTdGNSwgMHg3RTVBLCAweDE3RjYsIDB4N0U1RCwgMHgxN0YyLAotICAgIDB4N0U1RSwgMHgxN0Y0LCAweDdFNjEsIDB4MUUxMSwgMHg3RTYyLCAweDNBOEYsIDB4N0U2NiwgMHgxN0U5LAotICAgIDB4N0U2NywgMHgxN0YxLCAweDdFNjksIDB4MTdGOSwgMHg3RTZBLCAweDE3RjgsIDB4N0U2QiwgMHgxREY3LAotICAgIDB4N0U2RCwgMHgwRUE4LCAweDdFNkUsIDB4M0E5MCwgMHg3RTZGLCAweDRDREQsIDB4N0U3MCwgMHgwNzAxLAotICAgIDB4N0U3MywgMHgzQTkxLCAweDdFNzUsIDB4NDdDNSwgMHg3RTc4LCAweDRDREUsIDB4N0U3OSwgMHgxN0Y3LAotICAgIDB4N0U3QiwgMHgxN0ZCLCAweDdFN0MsIDB4MTdGQSwgMHg3RTdELCAweDE3RkUsIDB4N0U3RSwgMHg0N0M2LAotICAgIDB4N0U3RiwgMHgxODAwLCAweDdFODEsIDB4NENERiwgMHg3RTgyLCAweDA4OEEsIDB4N0U4MywgMHgxN0ZDLAotICAgIDB4N0U4NiwgMHg0N0M3LCAweDdFODcsIDB4NDdDOCwgMHg3RTg4LCAweDE4MDEsIDB4N0U4OSwgMHgxODAyLAotICAgIDB4N0U4QSwgMHgyMEE3LCAweDdFOEMsIDB4MTgwMywgMHg3RThELCAweDNBOTIsIDB4N0U4RSwgMHgxODA5LAotICAgIDB4N0U4RiwgMHgwQzM1LCAweDdFOTAsIDB4MTgwNSwgMHg3RTkxLCAweDNBOTMsIDB4N0U5MiwgMHgxODA0LAotICAgIDB4N0U5MywgMHgxODA2LCAweDdFOTQsIDB4MTgwNywgMHg3RTk2LCAweDE4MDgsIDB4N0U5OCwgMHgzQTk0LAotICAgIDB4N0U5QSwgMHg0N0NBLCAweDdFOUIsIDB4MTgwQSwgMHg3RTlDLCAweDE4MEIsIDB4N0YzNiwgMHgwNjA4LAotICAgIDB4N0YzOCwgMHgxODBDLCAweDdGM0EsIDB4MTgwRCwgMHg3RjNCLCAweDQ3Q0QsIDB4N0YzQywgMHg0N0NDLAotICAgIDB4N0YzRCwgMHg0Q0UwLCAweDdGM0UsIDB4NDdDRSwgMHg3RjQzLCAweDQ3Q0YsIDB4N0Y0NCwgMHgzQTk1LAotICAgIDB4N0Y0NSwgMHgxODBFLCAweDdGNDcsIDB4MjE5NSwgMHg3RjRDLCAweDE4MEYsIDB4N0Y0RCwgMHgxODEwLAotICAgIDB4N0Y0RSwgMHgxODExLCAweDdGNEYsIDB4M0E5NiwgMHg3RjUwLCAweDE4MTIsIDB4N0Y1MSwgMHgxODEzLAotICAgIDB4N0Y1MiwgMHgzQTk3LCAweDdGNTMsIDB4M0E5OCwgMHg3RjU0LCAweDE4MTUsIDB4N0Y1NSwgMHgxODE0LAotICAgIDB4N0Y1OCwgMHgxODE2LCAweDdGNUIsIDB4NENFMSwgMHg3RjVELCAweDRDRTIsIDB4N0Y1RiwgMHgxODE3LAotICAgIDB4N0Y2MCwgMHgxODE4LCAweDdGNjEsIDB4M0E5OSwgMHg3RjYzLCAweDQ3RDMsIDB4N0Y2NCwgMHg0N0Q0LAotICAgIDB4N0Y2NSwgMHg0Q0UzLCAweDdGNjcsIDB4MTgxQiwgMHg3RjY4LCAweDE4MTksIDB4N0Y2OSwgMHgxODFBLAotICAgIDB4N0Y2QSwgMHgwODUxLCAweDdGNkIsIDB4MDcyOSwgMHg3RjZELCAweDQ3RDUsIDB4N0Y2RSwgMHgwQjk0LAotICAgIDB4N0Y3MCwgMHgwRDQ3LCAweDdGNzEsIDB4NENFNCwgMHg3RjcyLCAweDA5N0EsIDB4N0Y3NSwgMHgwRDAzLAotICAgIDB4N0Y3NywgMHgwRDgxLCAweDdGNzgsIDB4MTgxQywgMHg3Rjc5LCAweDEzMzYsIDB4N0Y3RCwgMHg0N0Q2LAotICAgIDB4N0Y3RSwgMHg0N0Q3LCAweDdGN0YsIDB4NENFNSwgMHg3RjgwLCAweDRDRTYsIDB4N0Y4MiwgMHgxODFELAotICAgIDB4N0Y4MywgMHgxODFGLCAweDdGODUsIDB4MEY0RiwgMHg3Rjg2LCAweDE4MUUsIDB4N0Y4NywgMHgxODIxLAotICAgIDB4N0Y4OCwgMHgxODIwLCAweDdGOEEsIDB4MEYzRCwgMHg3RjhCLCAweDRDRTcsIDB4N0Y4QywgMHgxODIyLAotICAgIDB4N0Y4RSwgMHgwRDkyLCAweDdGOTAsIDB4NDdEOCwgMHg3RjkxLCAweDNBOUEsIDB4N0Y5NCwgMHgxODIzLAotICAgIDB4N0Y5NiwgMHg0N0RCLCAweDdGOTcsIDB4NDI5NiwgMHg3RjlBLCAweDE4MjYsIDB4N0Y5QywgMHg0N0RDLAotICAgIDB4N0Y5RCwgMHgxODI1LCAweDdGOUUsIDB4MTgyNCwgMHg3RkExLCAweDIxOTYsIDB4N0ZBMiwgMHg0Q0U4LAotICAgIDB4N0ZBMywgMHgxODI3LCAweDdGQTQsIDB4MDcwOCwgMHg3RkE4LCAweDBBQTQsIDB4N0ZBOSwgMHgwNjVCLAotICAgIDB4N0ZBRCwgMHg0N0RELCAweDdGQUUsIDB4MTgyQiwgMHg3RkFGLCAweDE4MjgsIDB4N0ZCMiwgMHgxODI5LAotICAgIDB4N0ZCNiwgMHgxODJDLCAweDdGQjgsIDB4MTgyRCwgMHg3RkI5LCAweDE4MkEsIDB4N0ZCRCwgMHgwNENCLAotICAgIDB4N0ZCRiwgMHgzQTlCLCAweDdGQzEsIDB4MDUyNywgMHg3RkMzLCAweDQ3REYsIDB4N0ZDNSwgMHgxODJGLAotICAgIDB4N0ZDNiwgMHgxODMwLCAweDdGQ0EsIDB4MTgzMSwgMHg3RkNDLCAweDBGNEMsIDB4N0ZDRSwgMHgzQTlDLAotICAgIDB4N0ZDRiwgMHg0N0UwLCAweDdGRDIsIDB4MDkzNiwgMHg3RkQ0LCAweDE4MzMsIDB4N0ZENSwgMHgxODMyLAotICAgIDB4N0ZEQiwgMHg0Mjk3LCAweDdGREYsIDB4M0E5RCwgMHg3RkUwLCAweDBBMkYsIDB4N0ZFMSwgMHgxODM0LAotICAgIDB4N0ZFMywgMHg0N0UxLCAweDdGRTUsIDB4M0E5RSwgMHg3RkU2LCAweDE4MzUsIDB4N0ZFOSwgMHgxODM2LAotICAgIDB4N0ZFQiwgMHgwNjIxLCAweDdGRUMsIDB4M0E5RiwgMHg3RkVFLCAweDNBQTAsIDB4N0ZFRiwgMHgzQUExLAotICAgIDB4N0ZGMCwgMHgwNjA5LCAweDdGRjIsIDB4NDdFMiwgMHg3RkYzLCAweDE4MzcsIDB4N0ZGOSwgMHgxODM4LAotICAgIDB4N0ZGQSwgMHgzQUEyLCAweDdGRkIsIDB4MEU4QiwgMHg3RkZDLCAweDBGNEQsIDB4N0ZGRCwgMHg0Q0U5LAotICAgIDB4N0ZGRSwgMHg0Q0VBLCAweDdGRkYsIDB4NENFQiwgMHg4MDAwLCAweDBGM0UsIDB4ODAwMSwgMHgwRkRELAotICAgIDB4ODAwMiwgMHgzNzEzLCAweDgwMDMsIDB4MDdERiwgMHg4MDA0LCAweDE4M0IsIDB4ODAwNSwgMHgwOTAwLAotICAgIDB4ODAwNiwgMHgxODNBLCAweDgwMDcsIDB4NENFQywgMHg4MDA4LCAweDQ3RTQsIDB4ODAwQSwgMHg0N0UzLAotICAgIDB4ODAwQiwgMHgxODNDLCAweDgwMEMsIDB4MDhENSwgMHg4MDBELCAweDRDRUQsIDB4ODAwRSwgMHgzQUEzLAotICAgIDB4ODAxMCwgMHgwQjMxLCAweDgwMTEsIDB4M0FBNCwgMHg4MDEyLCAweDE4M0QsIDB4ODAxNCwgMHgzQUE1LAotICAgIDB4ODAxNSwgMHgwN0RFLCAweDgwMTYsIDB4NDdFNSwgMHg4MDE3LCAweDBFRTMsIDB4ODAxOCwgMHgxODNFLAotICAgIDB4ODAxOSwgMHgxODNGLCAweDgwMUMsIDB4MTg0MCwgMHg4MDFFLCAweDRDRUUsIDB4ODAyMSwgMHgxODQxLAotICAgIDB4ODAyNCwgMHgzQUE2LCAweDgwMjYsIDB4M0FBNywgMHg4MDI4LCAweDE4NDIsIDB4ODAyQywgMHg0N0U2LAotICAgIDB4ODAzMCwgMHg0N0U3LCAweDgwMzMsIDB4MDhENiwgMHg4MDM1LCAweDQyOTgsIDB4ODAzNiwgMHgwRUY5LAotICAgIDB4ODAzNywgMHg0Mjk5LCAweDgwMzksIDB4NENFRiwgMHg4MDNBLCAweDNBQTgsIDB4ODAzQiwgMHgxODQ0LAotICAgIDB4ODAzQywgMHgzQUE5LCAweDgwM0QsIDB4MEI3RCwgMHg4MDNGLCAweDE4NDMsIDB4ODA0MywgMHg0N0U4LAotICAgIDB4ODA0NiwgMHgxODQ2LCAweDgwNEEsIDB4MTg0NSwgMHg4MDUyLCAweDE4NDcsIDB4ODA1NiwgMHgwQTVGLAotICAgIDB4ODA1OCwgMHgxODQ4LCAweDgwNUEsIDB4MTg0OSwgMHg4MDVFLCAweDBFMDksIDB4ODA1RiwgMHgxODRBLAotICAgIDB4ODA2MCwgMHgzQUFBLCAweDgwNjEsIDB4MEFGMSwgMHg4MDYyLCAweDE4NEIsIDB4ODA2NiwgMHg0N0U5LAotICAgIDB4ODA2OCwgMHgxODRDLCAweDgwNkYsIDB4MEZDNiwgMHg4MDcwLCAweDE4NEYsIDB4ODA3MSwgMHgzQUFCLAotICAgIDB4ODA3MiwgMHgxODRFLCAweDgwNzMsIDB4MTg0RCwgMHg4MDc0LCAweDBCQ0MsIDB4ODA3NSwgMHgzQUFDLAotICAgIDB4ODA3NiwgMHgxODUwLCAweDgwNzcsIDB4MDlFQywgMHg4MDc5LCAweDE4NTEsIDB4ODA3QiwgMHg0N0VBLAotICAgIDB4ODA3RCwgMHgxODUyLCAweDgwN0UsIDB4MEZERSwgMHg4MDdGLCAweDE4NTMsIDB4ODA4NCwgMHgxODU0LAotICAgIDB4ODA4NSwgMHgxODU2LCAweDgwODYsIDB4MTg1NSwgMHg4MDg3LCAweDBEMzksIDB4ODA4OCwgMHg0Q0YwLAotICAgIDB4ODA4OSwgMHgwQ0QxLCAweDgwOEIsIDB4MEZFNCwgMHg4MDhDLCAweDBEM0QsIDB4ODA4RSwgMHg0Q0YxLAotICAgIDB4ODA5MywgMHgxODU4LCAweDgwOTYsIDB4MDlCQiwgMHg4MDk4LCAweDBEOUMsIDB4ODA5OSwgMHg0N0VCLAotICAgIDB4ODA5QSwgMHgxODU5LCAweDgwOUIsIDB4MTg1NywgMHg4MDlDLCAweDQ3RUMsIDB4ODA5RCwgMHgwNjBBLAotICAgIDB4ODA5RSwgMHgzQUFELCAweDgwQTEsIDB4MDc4OCwgMHg4MEEyLCAweDA4QjYsIDB4ODBBNCwgMHg0N0VELAotICAgIDB4ODBBNSwgMHgwRDgyLCAweDgwQTYsIDB4M0FBRSwgMHg4MEE3LCAweDQ3RUUsIDB4ODBBOSwgMHgwNzVFLAotICAgIDB4ODBBQSwgMHgwRTcxLCAweDgwQUIsIDB4M0FBRiwgMHg4MEFDLCAweDE4NUMsIDB4ODBBRCwgMHgxODVBLAotICAgIDB4ODBBRiwgMHgwN0UwLCAweDgwQjEsIDB4MDdFMSwgMHg4MEIyLCAweDA0QUQsIDB4ODBCNCwgMHgwODU4LAotICAgIDB4ODBCOCwgMHg0N0VGLCAweDgwQkEsIDB4MEQwRiwgMHg4MEMzLCAweDA0QTMsIDB4ODBDNCwgMHgxODYxLAotICAgIDB4ODBDNSwgMHg0N0YxLCAweDgwQzYsIDB4MEI3RSwgMHg4MENBLCAweDQyOUEsIDB4ODBDQywgMHgwRDBFLAotICAgIDB4ODBDRSwgMHgwQjNCLCAweDgwQ0YsIDB4NENGMiwgMHg4MEQ0LCAweDRDRjMsIDB4ODBENSwgMHg0N0YyLAotICAgIDB4ODBENiwgMHgxODYzLCAweDgwRDcsIDB4M0FCMCwgMHg4MEQ4LCAweDNBQjEsIDB4ODBEOSwgMHgxODVGLAotICAgIDB4ODBEQSwgMHgxODYyLCAweDgwREIsIDB4MTg1RCwgMHg4MERELCAweDE4NjAsIDB4ODBERSwgMHgwRTU0LAotICAgIDB4ODBFMCwgMHg0MjlCLCAweDgwRTEsIDB4MDc4OSwgMHg4MEU0LCAweDA0QzEsIDB4ODBFNSwgMHgxODVFLAotICAgIDB4ODBFNiwgMHg0N0YzLCAweDgwRUQsIDB4NENGNCwgMHg4MEVGLCAweDE4NjUsIDB4ODBGMCwgMHg0Q0Y1LAotICAgIDB4ODBGMSwgMHgxODY2LCAweDgwRjMsIDB4NDI5QywgMHg4MEY0LCAweDBDOTEsIDB4ODBGNSwgMHg0N0Y1LAotICAgIDB4ODBGNywgMHg0Q0Y2LCAweDgwRjgsIDB4MDZCMywgMHg4MEZBLCAweDRDRjcsIDB4ODBGQiwgMHg0N0Y2LAotICAgIDB4ODBGQywgMHgxODcxLCAweDgwRkQsIDB4MENGMywgMHg4MEZFLCAweDRDRjgsIDB4ODEwMiwgMHgwOEI3LAotICAgIDB4ODEwMywgMHg0Q0Y5LCAweDgxMDUsIDB4MDZCNCwgMHg4MTA2LCAweDBBNkMsIDB4ODEwNywgMHgwRkVDLAotICAgIDB4ODEwOCwgMHgwRUJBLCAweDgxMDksIDB4MTg2NCwgMHg4MTBBLCAweDBBNzgsIDB4ODEwRCwgMHg0N0Y0LAotICAgIDB4ODExNiwgMHgzQUIyLCAweDgxMTcsIDB4NENGQSwgMHg4MTE4LCAweDNBQjMsIDB4ODExQSwgMHgwNjZELAotICAgIDB4ODExQiwgMHgxODY3LCAweDgxMUUsIDB4NDdGOSwgMHg4MTIzLCAweDE4NjksIDB4ODEyNCwgMHg0N0ZCLAotICAgIDB4ODEyNywgMHg0N0ZDLCAweDgxMjksIDB4MTg2OCwgMHg4MTJCLCAweDM2NTksIDB4ODEyQywgMHg0N0ZELAotICAgIDB4ODEyRiwgMHgxODZBLCAweDgxMzAsIDB4NENGQiwgMHg4MTMxLCAweDBCNjQsIDB4ODEzMywgMHgwQ0Y0LAotICAgIDB4ODEzNSwgMHg0N0Y4LCAweDgxMzksIDB4MEJDRCwgMHg4MTNBLCAweDNBQjQsIDB4ODEzRCwgMHg0N0ZGLAotICAgIDB4ODEzRSwgMHgxODZFLCAweDgxNDEsIDB4Mzc3MiwgMHg4MTQ2LCAweDE4NkQsIDB4ODE0QSwgMHgzQUI1LAotICAgIDB4ODE0QiwgMHgxODZCLCAweDgxNEMsIDB4M0FCNiwgMHg4MTRFLCAweDBBMUIsIDB4ODE1MCwgMHgwREQ3LAotICAgIDB4ODE1MSwgMHgxODcwLCAweDgxNTMsIDB4MTg2RiwgMHg4MTU0LCAweDA3RTIsIDB4ODE1NSwgMHgwRkY5LAotICAgIDB4ODE1NywgMHg0Q0ZDLCAweDgxNUYsIDB4MTg4MCwgMHg4MTYwLCAweDQyOUQsIDB4ODE2NSwgMHgxODc0LAotICAgIDB4ODE2NiwgMHgxODc1LCAweDgxNjcsIDB4NDI5RSwgMHg4MTY4LCAweDQyOUYsIDB4ODE2OSwgMHg0ODAxLAotICAgIDB4ODE2QiwgMHgwOTFDLCAweDgxNkQsIDB4NDJBMCwgMHg4MTZFLCAweDE4NzMsIDB4ODE2RiwgMHg0Q0ZELAotICAgIDB4ODE3MCwgMHgwODBBLCAweDgxNzEsIDB4MTg3MiwgMHg4MTczLCAweDRDRkUsIDB4ODE3NCwgMHgxODc2LAotICAgIDB4ODE3OCwgMHgwQkNFLCAweDgxNzksIDB4MERGMiwgMHg4MTdBLCAweDBBQTUsIDB4ODE3RiwgMHgwQjNDLAotICAgIDB4ODE4MCwgMHgxODdBLCAweDgxODEsIDB4M0FCNywgMHg4MTgyLCAweDE4N0IsIDB4ODE4MywgMHgxODc3LAotICAgIDB4ODE4NCwgMHgzQUI4LCAweDgxODUsIDB4NDgwNCwgMHg4MTg4LCAweDE4NzgsIDB4ODE4QSwgMHgxODc5LAotICAgIDB4ODE4QiwgMHg0Q0ZGLCAweDgxOEYsIDB4MDdFMywgMHg4MTkwLCAweDREMDAsIDB4ODE5MywgMHgxODgxLAotICAgIDB4ODE5NSwgMHgxODdELCAweDgxOTgsIDB4NDgwNiwgMHg4MTlBLCAweDBERDgsIDB4ODE5QiwgMHg0RDAxLAotICAgIDB4ODE5QywgMHgwRTlBLCAweDgxOUQsIDB4MEQ5QSwgMHg4MTlFLCAweDREMDIsIDB4ODFBMCwgMHgxODdDLAotICAgIDB4ODFBMywgMHgxODdGLCAweDgxQTQsIDB4MTg3RSwgMHg4MUE4LCAweDBFNzIsIDB4ODFBOSwgMHgxODgyLAotICAgIDB4ODFCMCwgMHgxODgzLCAweDgxQjIsIDB4NDgwNywgMHg4MUIzLCAweDBBQjksIDB4ODFCNCwgMHgzQUI5LAotICAgIDB4ODFCNSwgMHgxODg0LCAweDgxQjgsIDB4MTg4NiwgMHg4MUJBLCAweDE4OEEsIDB4ODFCQiwgMHg0MkExLAotICAgIDB4ODFCRCwgMHgxODg3LCAweDgxQkUsIDB4MTg4NSwgMHg4MUJGLCAweDBDRjUsIDB4ODFDMCwgMHgxODg4LAotICAgIDB4ODFDMSwgMHg0ODA4LCAweDgxQzIsIDB4MTg4OSwgMHg4MUMzLCAweDQ4MDksIDB4ODFDNiwgMHgwNTMyLAotICAgIDB4ODFDOCwgMHgxODkwLCAweDgxQzksIDB4MTg4QiwgMHg4MUNBLCAweDQyQTIsIDB4ODFDQiwgMHg0RDAzLAotICAgIDB4ODFDRCwgMHgxODhDLCAweDgxQ0YsIDB4M0FCQSwgMHg4MUQxLCAweDE4OEQsIDB4ODFEMywgMHgwQjAxLAotICAgIDB4ODFENSwgMHg0RDA0LCAweDgxRDYsIDB4NDgwQSwgMHg4MUQ3LCAweDQyQTMsIDB4ODFEOCwgMHgxODhGLAotICAgIDB4ODFEOSwgMHgxODhFLCAweDgxREEsIDB4MTg5MSwgMHg4MURCLCAweDQ4MEIsIDB4ODFERCwgMHg0RDA1LAotICAgIDB4ODFERSwgMHg0RDA2LCAweDgxREYsIDB4MTg5MiwgMHg4MUUwLCAweDE4OTMsIDB4ODFFMSwgMHg0RDA3LAotICAgIDB4ODFFMywgMHgwQTA5LCAweDgxRTQsIDB4NDgwRCwgMHg4MUU1LCAweDA1NjksIDB4ODFFNywgMHgxODk0LAotICAgIDB4ODFFOCwgMHgwRjlGLCAweDgxRUEsIDB4MDhENywgMHg4MUVDLCAweDQ4MEYsIDB4ODFFRCwgMHgwOTM3LAotICAgIDB4ODFFRiwgMHg0RDA4LCAweDgxRjMsIDB4MDhCOCwgMHg4MUY0LCAweDBCOTUsIDB4ODFGNiwgMHg0RDA5LAotICAgIDB4ODFGOSwgMHgzQUJCLCAweDgxRkEsIDB4MTg5NSwgMHg4MUZCLCAweDE4OTYsIDB4ODFGQywgMHgwNEQzLAotICAgIDB4ODFGRCwgMHg0ODEwLCAweDgxRkUsIDB4MTg5NywgMHg4MUZGLCAweDQ4MTEsIDB4ODIwMCwgMHg0RDBBLAotICAgIDB4ODIwMSwgMHgxODk4LCAweDgyMDIsIDB4MTg5OSwgMHg4MjAzLCAweDNBQkMsIDB4ODIwNCwgMHg0ODEzLAotICAgIDB4ODIwNSwgMHgxODlBLCAweDgyMDcsIDB4MTg5QiwgMHg4MjA4LCAweDA2QjUsIDB4ODIwOSwgMHgxM0FGLAotICAgIDB4ODIwQSwgMHgxODlDLCAweDgyMEIsIDB4NEQwQiwgMHg4MjBDLCAweDBBODksIDB4ODIwRCwgMHgxODlELAotICAgIDB4ODIwRSwgMHgwOEY3LCAweDgyMTAsIDB4MTg5RSwgMHg4MjEyLCAweDEwMDksIDB4ODIxMywgMHg0RDBDLAotICAgIDB4ODIxNCwgMHg0RDBELCAweDgyMTYsIDB4MTg5RiwgMHg4MjE3LCAweDBFMkUsIDB4ODIxOCwgMHgwNjE4LAotICAgIDB4ODIxOSwgMHg0ODE1LCAweDgyMUEsIDB4NEQwRSwgMHg4MjFCLCAweDBBQTYsIDB4ODIxQywgMHgwOTYyLAotICAgIDB4ODIxRSwgMHgwREUzLCAweDgyMUYsIDB4MDkzOCwgMHg4MjIxLCAweDNBQkQsIDB4ODIyMiwgMHg0ODE2LAotICAgIDB4ODIyOSwgMHgxOEEwLCAweDgyMkEsIDB4MDdFNCwgMHg4MjJCLCAweDE4QTEsIDB4ODIyQywgMHgwRDYwLAotICAgIDB4ODIyRSwgMHgxOEFGLCAweDgyMzIsIDB4M0FCRSwgMHg4MjMzLCAweDE4QTMsIDB4ODIzNCwgMHgzQUJGLAotICAgIDB4ODIzNSwgMHgwQjI5LCAweDgyMzYsIDB4MEQyQiwgMHg4MjM3LCAweDA3NzMsIDB4ODIzOCwgMHgxOEEyLAotICAgIDB4ODIzOSwgMHgwQUE3LCAweDgyM0EsIDB4NEQwRiwgMHg4MjNDLCAweDQ4MTgsIDB4ODI0MCwgMHgxOEE0LAotICAgIDB4ODI0NCwgMHg0RDEwLCAweDgyNDUsIDB4NDgxQSwgMHg4MjQ2LCAweDNBQzAsIDB4ODI0NywgMHgwQzE2LAotICAgIDB4ODI0OSwgMHg0ODE5LCAweDgyNEIsIDB4M0FDMSwgMHg4MjRGLCAweDNBQzIsIDB4ODI1NywgMHg0ODFFLAotICAgIDB4ODI1OCwgMHgxOEE2LCAweDgyNTksIDB4MThBNSwgMHg4MjVBLCAweDE4QTgsIDB4ODI1QywgMHg0ODIwLAotICAgIDB4ODI1RCwgMHgxOEE3LCAweDgyNUYsIDB4MThBOSwgMHg4MjYwLCAweDQyQTUsIDB4ODI2MiwgMHgxOEFCLAotICAgIDB4ODI2MywgMHg0ODIxLCAweDgyNjQsIDB4MThBQSwgMHg4MjY2LCAweDA2MEIsIDB4ODI2OCwgMHgxOEFDLAotICAgIDB4ODI2QSwgMHgxOEFELCAweDgyNkIsIDB4MThBRSwgMHg4MjZELCAweDREMTEsIDB4ODI2RSwgMHgwODIxLAotICAgIDB4ODI2RiwgMHgwRjkxLCAweDgyNzEsIDB4MThCMCwgMHg4MjcyLCAweDA5RUQsIDB4ODI3NCwgMHg0MkE2LAotICAgIDB4ODI3NiwgMHgwNTEyLCAweDgyNzcsIDB4MThCMSwgMHg4Mjc4LCAweDE4QjIsIDB4ODI3OSwgMHgzNzc1LAotICAgIDB4ODI3RCwgMHg0ODI0LCAweDgyN0UsIDB4MThCMywgMHg4MjdGLCAweDQ4MjUsIDB4ODI4MywgMHg0ODI2LAotICAgIDB4ODI4NCwgMHg0RDEyLCAweDgyODksIDB4NEQxMywgMHg4MjhBLCAweDQ4MjcsIDB4ODI4QiwgMHgwNEI2LAotICAgIDB4ODI4RCwgMHgxOEI0LCAweDgyOEUsIDB4M0FDMywgMHg4MjkxLCAweDREMTQsIDB4ODI5MiwgMHgxOEI1LAotICAgIDB4ODI5MywgMHg0ODI4LCAweDgyOTksIDB4MEREOSwgMHg4MjlELCAweDA4RjMsIDB4ODI5RiwgMHgxOEI3LAotICAgIDB4ODJBMSwgMHg0MkE4LCAweDgyQTMsIDB4NDJBOSwgMHg4MkE0LCAweDQyQUEsIDB4ODJBNSwgMHgwNTg3LAotICAgIDB4ODJBNiwgMHgwNDc2LCAweDgyQTcsIDB4NDgyOSwgMHg4MkE4LCAweDQ4MkEsIDB4ODJBOSwgMHg0MkFCLAotICAgIDB4ODJBQSwgMHg0RDE1LCAweDgyQUIsIDB4MThCNiwgMHg4MkFDLCAweDE4QjksIDB4ODJBRCwgMHgwRDA0LAotICAgIDB4ODJBRSwgMHgzQUM0LCAweDgyQUYsIDB4MEEwQSwgMHg4MkIwLCAweDREMTYsIDB4ODJCMSwgMHgwNTU2LAotICAgIDB4ODJCMiwgMHg0ODJCLCAweDgyQjMsIDB4MEU1NSwgMHg4MkI0LCAweDQ4MkMsIDB4ODJCNywgMHgzQUM1LAotICAgIDB4ODJCOCwgMHgwNzMzLCAweDgyQjksIDB4MDZENCwgMHg4MkJBLCAweDQ4MkQsIDB4ODJCQiwgMHgxOEI4LAotICAgIDB4ODJCQywgMHg0ODJFLCAweDgyQkQsIDB4MDU2QSwgMHg4MkJFLCAweDNBQzYsIDB4ODJCRiwgMHg0MkFDLAotICAgIDB4ODJDNSwgMHgwNURGLCAweDgyQzYsIDB4M0FDNywgMHg4MkQwLCAweDREMTcsIDB4ODJEMSwgMHgwNTEzLAotICAgIDB4ODJEMiwgMHgxOEJELCAweDgyRDMsIDB4MEZCMiwgMHg4MkQ0LCAweDBCM0QsIDB4ODJENSwgMHg0MkFELAotICAgIDB4ODJENywgMHgwREI2LCAweDgyRDksIDB4MThDOSwgMHg4MkRCLCAweDA1NTcsIDB4ODJEQywgMHgxOEM3LAotICAgIDB4ODJERSwgMHgxOEM1LCAweDgyREYsIDB4MThCQywgMHg4MkUxLCAweDE4QkEsIDB4ODJFMiwgMHg0ODJGLAotICAgIDB4ODJFMywgMHgxOEJCLCAweDgyRTUsIDB4MDkwRiwgMHg4MkU2LCAweDA2RTQsIDB4ODJFNywgMHgwQkI1LAotICAgIDB4ODJFOCwgMHg0ODMwLCAweDgyRUEsIDB4NEQxOCwgMHg4MkVCLCAweDBDQTksIDB4ODJFRiwgMHg0RDE5LAotICAgIDB4ODJGMSwgMHgwNEYzLCAweDgyRjMsIDB4MThCRiwgMHg4MkY0LCAweDE4QkUsIDB4ODJGNiwgMHg0RDFBLAotICAgIDB4ODJGNywgMHg0ODMxLCAweDgyRjksIDB4MThDNCwgMHg4MkZBLCAweDE4QzAsIDB4ODJGQiwgMHgxOEMzLAotICAgIDB4ODJGRCwgMHg0MkFFLCAweDgyRkUsIDB4M0FDOCwgMHg4MzAwLCAweDQyQUYsIDB4ODMwMSwgMHgyMTk4LAotICAgIDB4ODMwMiwgMHgwRURDLCAweDgzMDMsIDB4MThDMiwgMHg4MzA0LCAweDA1NTgsIDB4ODMwNSwgMHgwNURCLAotICAgIDB4ODMwNiwgMHgxOEM2LCAweDgzMDcsIDB4NDgzMiwgMHg4MzA4LCAweDQ4MzMsIDB4ODMwOSwgMHgxOEM4LAotICAgIDB4ODMwQywgMHg0ODM0LCAweDgzMEUsIDB4MDcyQSwgMHg4MzE2LCAweDE4Q0MsIDB4ODMxNywgMHgxOEQ1LAotICAgIDB4ODMxOCwgMHgxOEQ2LCAweDgzMUIsIDB4NDgzNiwgMHg4MzFDLCAweDA0NkYsIDB4ODMxRCwgMHg0ODM3LAotICAgIDB4ODMyMiwgMHg0MkIwLCAweDgzMjMsIDB4MThERCwgMHg4MzI4LCAweDA0QjUsIDB4ODMyQiwgMHgxOEQ0LAotICAgIDB4ODMyRCwgMHg0MkIxLCAweDgzMkYsIDB4MThEMywgMHg4MzMwLCAweDQ4MzgsIDB4ODMzMSwgMHgxOENFLAotICAgIDB4ODMzMiwgMHgxOENELCAweDgzMzQsIDB4MThDQiwgMHg4MzM1LCAweDE4Q0EsIDB4ODMzNiwgMHgwQkExLAotICAgIDB4ODMzOCwgMHgwQjVCLCAweDgzMzksIDB4MThEMCwgMHg4MzNBLCAweDQyQjIsIDB4ODMzQywgMHg0ODM5LAotICAgIDB4ODM0MCwgMHgxOENGLCAweDgzNDMsIDB4M0FDOSwgMHg4MzQ0LCAweDQ4M0EsIDB4ODM0NSwgMHgxOEQyLAotICAgIDB4ODM0NiwgMHgxREY4LCAweDgzNDcsIDB4NDJCMywgMHg4MzQ5LCAweDBBRjIsIDB4ODM0QSwgMHgwNzJCLAotICAgIDB4ODM0RiwgMHgwNEUzLCAweDgzNTAsIDB4MThEMSwgMHg4MzUxLCAweDNBQ0EsIDB4ODM1MiwgMHgwN0U1LAotICAgIDB4ODM1NCwgMHg0ODM1LCAweDgzNTUsIDB4M0FDQiwgMHg4MzU2LCAweDREMUIsIDB4ODM1NywgMHg0ODNCLAotICAgIDB4ODM1OCwgMHgwQUYzLCAweDgzNUEsIDB4Mzc3QSwgMHg4MzYyLCAweDIxOTksIDB4ODM2MywgMHg0NTZGLAotICAgIDB4ODM3MywgMHgxOEUzLCAweDgzNzUsIDB4MThFNCwgMHg4Mzc3LCAweDA1NTksIDB4ODM3OCwgMHg0RDFDLAotICAgIDB4ODM3QiwgMHgwNTJFLCAweDgzN0MsIDB4MThFMSwgMHg4MzdELCAweDQyQjQsIDB4ODM3RiwgMHgyMTlBLAotICAgIDB4ODM4NSwgMHgxOEQ3LCAweDgzODYsIDB4M0FDQywgMHg4Mzg3LCAweDE4REYsIDB4ODM4OSwgMHgxOEU2LAotICAgIDB4ODM4QSwgMHgxOEUwLCAweDgzOEQsIDB4M0FDRCwgMHg4MzhFLCAweDE4REUsIDB4ODM5MiwgMHgzQUNFLAotICAgIDB4ODM5MywgMHgxOEMxLCAweDgzOTQsIDB4NDgzRiwgMHg4Mzk1LCAweDQ4NDAsIDB4ODM5NiwgMHgxOERDLAotICAgIDB4ODM5OCwgMHgzQUNGLCAweDgzOUEsIDB4MThEOCwgMHg4MzlCLCAweDQ4NDEsIDB4ODM5RCwgMHg0ODQyLAotICAgIDB4ODM5RSwgMHgwNjBDLCAweDgzOUYsIDB4MThEQSwgMHg4M0EwLCAweDE4RTUsIDB4ODNBMiwgMHgxOERCLAotICAgIDB4ODNBNywgMHg0MkI1LCAweDgzQTgsIDB4MThFNywgMHg4M0E5LCAweDNBRDAsIDB4ODNBQSwgMHgxOEQ5LAotICAgIDB4ODNBQiwgMHgwRDMyLCAweDgzQjEsIDB4MEY1MywgMHg4M0I1LCAweDE4RTIsIDB4ODNCRCwgMHgxOEY4LAotICAgIDB4ODNCRiwgMHgzQUQxLCAweDgzQzAsIDB4M0FEMiwgMHg4M0MxLCAweDE4RjAsIDB4ODNDNSwgMHgwQTQxLAotICAgIDB4ODNDNywgMHgyMTlCLCAweDgzQzksIDB4NDg0MywgMHg4M0NBLCAweDA2NjAsIDB4ODNDQywgMHgwNkQ1LAotICAgIDB4ODNDRSwgMHgxOEVCLCAweDgzQ0YsIDB4NDJCNiwgMHg4M0QwLCAweDQ4NDQsIDB4ODNEMSwgMHg0MkI3LAotICAgIDB4ODNEMywgMHgwNTVCLCAweDgzRDQsIDB4NDg0NSwgMHg4M0Q2LCAweDA5QkMsIDB4ODNEOCwgMHgxOEVFLAotICAgIDB4ODNEQywgMHgwODRBLCAweDgzREQsIDB4NDg0NiwgMHg4M0RGLCAweDBDNEIsIDB4ODNFMCwgMHgxOEYzLAotICAgIDB4ODNFMSwgMHg0MkI4LCAweDgzRTUsIDB4NDg0NywgMHg4M0U5LCAweDBFM0UsIDB4ODNFQSwgMHgzQUQzLAotICAgIDB4ODNFQiwgMHgxOEVBLCAweDgzRUYsIDB4MDU1QSwgMHg4M0YwLCAweDA3OEEsIDB4ODNGMSwgMHgwRDlCLAotICAgIDB4ODNGMiwgMHgxOEY0LCAweDgzRjQsIDB4MThFOCwgMHg4M0Y2LCAweDIxOUMsIDB4ODNGNywgMHgxOEYxLAotICAgIDB4ODNGOCwgMHg0RDFELCAweDgzRjksIDB4NDg0OCwgMHg4M0ZCLCAweDE4RkIsIDB4ODNGQywgMHg0RDFFLAotICAgIDB4ODNGRCwgMHgxOEVDLCAweDg0MDEsIDB4NDJCOSwgMHg4NDAzLCAweDE4RUQsIDB4ODQwNCwgMHgwQzkyLAotICAgIDB4ODQwNiwgMHg0MkJBLCAweDg0MDcsIDB4MThGMiwgMHg4NDBBLCAweDFFN0YsIDB4ODQwQiwgMHgxOEVGLAotICAgIDB4ODQwQywgMHgwRTU2LCAweDg0MEQsIDB4MThGNSwgMHg4NDBFLCAweDA0QTQsIDB4ODQwRiwgMHgzQUQ0LAotICAgIDB4ODQxMSwgMHgzQUQ1LCAweDg0MTMsIDB4MThFOSwgMHg4NDE1LCAweDQ4NDksIDB4ODQxNywgMHg0ODRCLAotICAgIDB4ODQyMCwgMHgxOEY3LCAweDg0MjIsIDB4MThGNiwgMHg4NDI5LCAweDBEMjEsIDB4ODQyQSwgMHgxOEZELAotICAgIDB4ODQyQywgMHgxOTA4LCAweDg0MzEsIDB4MDVEQywgMHg4NDM1LCAweDE5MEIsIDB4ODQzOCwgMHgxOEY5LAotICAgIDB4ODQzOSwgMHg0ODRDLCAweDg0M0MsIDB4MThGRSwgMHg4NDNELCAweDBGNTgsIDB4ODQ0NiwgMHgxOTA3LAotICAgIDB4ODQ0OCwgMHgyMTlELCAweDg0NDksIDB4MEYzRiwgMHg4NDRBLCAweDNBRDYsIDB4ODQ0RSwgMHgwRjcyLAotICAgIDB4ODQ0RiwgMHg0ODRELCAweDg0NTEsIDB4NDg0RSwgMHg4NDUyLCAweDQ4NEYsIDB4ODQ1NywgMHgwQkI2LAotICAgIDB4ODQ1OCwgMHg0RDFGLCAweDg0NTksIDB4NDg1MCwgMHg4NDVBLCAweDQ4NTEsIDB4ODQ1QiwgMHgwNUM5LAotICAgIDB4ODQ1QywgMHg0ODUyLCAweDg0NUYsIDB4NDJCQiwgMHg4NDYxLCAweDBERTQsIDB4ODQ2MiwgMHgxOTBELAotICAgIDB4ODQ2MywgMHgwQzc5LCAweDg0NjUsIDB4NDg1NCwgMHg4NDY2LCAweDA0NzUsIDB4ODQ2OSwgMHgxOTA2LAotICAgIDB4ODQ2QiwgMHgxOTAyLCAweDg0NkMsIDB4MEFGNCwgMHg4NDZELCAweDE4RkMsIDB4ODQ2RSwgMHgxOTA0LAotICAgIDB4ODQ2RiwgMHgxOTA5LCAweDg0NzAsIDB4NDJCQywgMHg4NDcxLCAweDBDRTIsIDB4ODQ3MywgMHg0MkJELAotICAgIDB4ODQ3NSwgMHgwNDZFLCAweDg0NzYsIDB4M0FENywgMHg4NDc3LCAweDE5MDEsIDB4ODQ3OCwgMHg0ODU1LAotICAgIDB4ODQ3OSwgMHgxOTBBLCAweDg0N0EsIDB4MERFQSwgMHg4NDdDLCAweDQ4NTYsIDB4ODQ4MSwgMHg0ODU3LAotICAgIDB4ODQ4MiwgMHgxOTA1LCAweDg0ODQsIDB4MTkwMCwgMHg4NDg1LCAweDQyQkUsIDB4ODQ4QiwgMHgwOUJELAotICAgIDB4ODQ5MCwgMHgwOTM5LCAweDg0OTMsIDB4NEQyMCwgMHg4NDk0LCAweDA4RDgsIDB4ODQ5NywgMHg0ODU5LAotICAgIDB4ODQ5OSwgMHgwRUU0LCAweDg0OUMsIDB4MERCOSwgMHg4NDlFLCAweDQyQkYsIDB4ODQ5RiwgMHgxOTEwLAotICAgIDB4ODRBMSwgMHgxOTE5LCAweDg0QTYsIDB4NDg1QSwgMHg4NEE4LCAweDNBRDgsIDB4ODRBRCwgMHgxOTAzLAotICAgIDB4ODRBRiwgMHgzQUQ5LCAweDg0QjEsIDB4NEQyMSwgMHg4NEIyLCAweDA1RDUsIDB4ODRCNCwgMHgyMTlFLAotICAgIDB4ODRCOCwgMHgwOUUwLCAweDg0QjksIDB4MTkwRSwgMHg4NEJBLCAweDQyQzAsIDB4ODRCQiwgMHgxOTEzLAotICAgIDB4ODRCQywgMHgwQUY1LCAweDg0QkQsIDB4NEQyMiwgMHg4NEJFLCAweDQ4NUIsIDB4ODRCRiwgMHgxOTBGLAotICAgIDB4ODRDMCwgMHgzQURBLCAweDg0QzEsIDB4MTkxNiwgMHg4NEMyLCAweDNBREIsIDB4ODRDNCwgMHgwQjlELAotICAgIDB4ODRDNiwgMHgxOTE3LCAweDg0QzksIDB4MEY0MCwgMHg4NENBLCAweDE5MEMsIDB4ODRDQiwgMHgwNTk2LAotICAgIDB4ODRDRCwgMHgxOTEyLCAweDg0Q0UsIDB4NDg1RCwgMHg4NENGLCAweDQ4NUUsIDB4ODREMCwgMHgxOTE1LAotICAgIDB4ODREMSwgMHgwRUI4LCAweDg0RDMsIDB4NDg1RiwgMHg4NEQ2LCAweDE5MTgsIDB4ODREOSwgMHgxOTExLAotICAgIDB4ODREQSwgMHgxOTE0LCAweDg0REMsIDB4MjBBQiwgMHg4NEU3LCAweDQ4NjEsIDB4ODRFQSwgMHg0ODYyLAotICAgIDB4ODRFQywgMHgwRTU3LCAweDg0RUUsIDB4MEZDNywgMHg4NEVGLCAweDQ4NjMsIDB4ODRGMCwgMHgzQURDLAotICAgIDB4ODRGMSwgMHg0ODY0LCAweDg0RjQsIDB4MTkxQywgMHg4NEZBLCAweDQ4NjUsIDB4ODRGQiwgMHg0RDIzLAotICAgIDB4ODRGQywgMHgxOTIzLCAweDg0RkQsIDB4M0FERCwgMHg4NEZGLCAweDE5MUIsIDB4ODUwMCwgMHgwOEVGLAotICAgIDB4ODUwNiwgMHgxOEZBLCAweDg1MEMsIDB4M0FERSwgMHg4NTExLCAweDBFMUUsIDB4ODUxMywgMHgwRUFFLAotICAgIDB4ODUxNCwgMHgxOTIyLCAweDg1MTUsIDB4MTkyMSwgMHg4NTE3LCAweDE5MUQsIDB4ODUxOCwgMHgxOTFFLAotICAgIDB4ODUxQSwgMHgwNEQ4LCAweDg1MUIsIDB4NDg2NiwgMHg4NTFFLCAweDQyQzMsIDB4ODUxRiwgMHgxOTIwLAotICAgIDB4ODUyMSwgMHgxOTFBLCAweDg1MjMsIDB4MUUxQSwgMHg4NTI0LCAweDQ4NjcsIDB4ODUyNSwgMHg0ODY4LAotICAgIDB4ODUyNiwgMHgwQkYxLCAweDg1MkIsIDB4NDg2OSwgMHg4NTJDLCAweDE5MUYsIDB4ODUyRCwgMHgwNEMyLAotICAgIDB4ODUyRiwgMHg0MkM0LCAweDg1MzIsIDB4NDJDMiwgMHg4NTM0LCAweDNBREYsIDB4ODUzNSwgMHgwQjAyLAotICAgIDB4ODUzRCwgMHgwRTEzLCAweDg1M0UsIDB4MUVCNSwgMHg4NTQwLCAweDE5MjQsIDB4ODU0MSwgMHgxOTI4LAotICAgIDB4ODU0MywgMHgwRDZELCAweDg1NDYsIDB4NEQyNCwgMHg4NTQ4LCAweDE5MjcsIDB4ODU0OSwgMHgwOUJFLAotICAgIDB4ODU0QSwgMHgwOEY1LCAweDg1NEIsIDB4MTkyQSwgMHg4NTRFLCAweDA2QjYsIDB4ODU0RiwgMHg0ODZBLAotICAgIDB4ODU1MSwgMHg0ODZELCAweDg1NTMsIDB4MjE5RiwgMHg4NTU1LCAweDE5MkIsIDB4ODU1NiwgMHg0RDI1LAotICAgIDB4ODU1NywgMHgwREVCLCAweDg1NTgsIDB4MTkyNiwgMHg4NTU5LCAweDIxQTAsIDB4ODU1QSwgMHgxOEZGLAotICAgIDB4ODU1RCwgMHg0RDI2LCAweDg1NUUsIDB4M0FFMCwgMHg4NTYxLCAweDQ4NkUsIDB4ODU2MiwgMHg0ODZGLAotICAgIDB4ODU2MywgMHgxOTI1LCAweDg1NjQsIDB4NDJDNSwgMHg4NTY4LCAweDBGRjUsIDB4ODU2OSwgMHgwQzdBLAotICAgIDB4ODU2QSwgMHgwREU1LCAweDg1NkIsIDB4MjFBMSwgMHg4NTZELCAweDE5MzIsIDB4ODU2RiwgMHg0ODZCLAotICAgIDB4ODU3NywgMHgxOTM4LCAweDg1N0EsIDB4NDJDNiwgMHg4NTdCLCAweDQ4NzEsIDB4ODU3RCwgMHg0ODcyLAotICAgIDB4ODU3RSwgMHgxOTM5LCAweDg1N0YsIDB4NDg3MywgMHg4NTgwLCAweDE5MkMsIDB4ODU4MSwgMHg0ODc0LAotICAgIDB4ODU4NCwgMHgwRDJDLCAweDg1ODUsIDB4NEQyNywgMHg4NTg2LCAweDQ4NzUsIDB4ODU4NywgMHgxOTM2LAotICAgIDB4ODU4OCwgMHgxOTJFLCAweDg1OEEsIDB4MTkzMCwgMHg4NThDLCAweDQyQzcsIDB4ODU4RiwgMHgzQUUxLAotICAgIDB4ODU5MCwgMHgxOTNBLCAweDg1OTEsIDB4MTkyRiwgMHg4NTkzLCAweDQ4NzYsIDB4ODU5NCwgMHgxOTMzLAotICAgIDB4ODU5NywgMHgwNTE0LCAweDg1OTgsIDB4NEQyOCwgMHg4NTk5LCAweDBDQkQsIDB4ODU5QiwgMHgxOTM0LAotICAgIDB4ODU5QywgMHgxOTM3LCAweDg1OUQsIDB4NDg3NywgMHg4NTlGLCAweDQ4NzgsIDB4ODVBMiwgMHg0MkM4LAotICAgIDB4ODVBNCwgMHgxOTJELCAweDg1QTYsIDB4MEFBOCwgMHg4NUE4LCAweDE5MzEsIDB4ODVBOSwgMHgwODc1LAotICAgIDB4ODVBQSwgMHgwQTBCLCAweDg1QUIsIDB4MDcwNiwgMHg4NUFDLCAweDBGMDAsIDB4ODVBRCwgMHgzQUU0LAotICAgIDB4ODVBRSwgMHgwRjA1LCAweDg1QUYsIDB4MDk3QywgMHg4NUIwLCAweDIxQTMsIDB4ODVCNywgMHgzQUUyLAotICAgIDB4ODVCOSwgMHgxOTNFLCAweDg1QkEsIDB4MTkzQywgMHg4NUJDLCAweDQ4N0MsIDB4ODVDMSwgMHgwRkY0LAotICAgIDB4ODVDNywgMHg0ODdELCAweDg1QzksIDB4MTkzQiwgMHg4NUNBLCAweDQ4N0UsIDB4ODVDQiwgMHg0MkM5LAotICAgIDB4ODVDRCwgMHgwRjVGLCAweDg1Q0UsIDB4M0FFMywgMHg4NUNGLCAweDE5M0QsIDB4ODVEMCwgMHgxOTNGLAotICAgIDB4ODVENSwgMHgxOTQwLCAweDg1RDgsIDB4NDg3RiwgMHg4NUQ5LCAweDQ4ODAsIDB4ODVEQywgMHgxOTQzLAotICAgIDB4ODVERCwgMHgxOTQxLCAweDg1REYsIDB4NDg4MSwgMHg4NUUxLCAweDQ4ODIsIDB4ODVFNCwgMHgwQzdCLAotICAgIDB4ODVFNSwgMHgxOTQyLCAweDg1RTYsIDB4NDg4MywgMHg4NUU5LCAweDBENjEsIDB4ODVFQSwgMHgxOTM1LAotICAgIDB4ODVFRCwgMHg0MkNBLCAweDg1RjQsIDB4Mzc4MCwgMHg4NUY2LCAweDQ4ODQsIDB4ODVGNywgMHgwOTdELAotICAgIDB4ODVGOSwgMHgxOTQ0LCAweDg1RkEsIDB4MTk0OSwgMHg4NUZCLCAweDBBRjYsIDB4ODVGRSwgMHgxOTQ4LAotICAgIDB4ODVGRiwgMHg0MkNCLCAweDg2MDAsIDB4NDg4NSwgMHg4NjAyLCAweDE5MjksIDB4ODYwNCwgMHg0MkNDLAotICAgIDB4ODYwNSwgMHg0MkNELCAweDg2MDYsIDB4MTk0QSwgMHg4NjA3LCAweDBBQ0IsIDB4ODYwQSwgMHgxOTQ1LAotICAgIDB4ODYwQiwgMHgxOTQ3LCAweDg2MTAsIDB4NDJDRSwgMHg4NjExLCAweDQ4ODYsIDB4ODYxMiwgMHgzQUU1LAotICAgIDB4ODYxMywgMHgxOTQ2LCAweDg2MTYsIDB4MTREMCwgMHg4NjE3LCAweDE0QzEsIDB4ODYxOCwgMHg0MkQwLAotICAgIDB4ODYxQSwgMHgxOTRDLCAweDg2MUUsIDB4NDg4NywgMHg4NjIxLCAweDQ4ODgsIDB4ODYyMiwgMHgxOTRCLAotICAgIDB4ODYyNCwgMHg0ODg5LCAweDg2MjcsIDB4NDg4QSwgMHg4NjI5LCAweDNBRTYsIDB4ODYyRCwgMHgwRjYwLAotICAgIDB4ODYyRiwgMHgxNkIxLCAweDg2MzAsIDB4MTk0RCwgMHg4NjM4LCAweDQyRDEsIDB4ODYzOSwgMHg0ODhDLAotICAgIDB4ODYzQywgMHg0ODhELCAweDg2M0YsIDB4MTk0RSwgMHg4NjQwLCAweDQ4OEYsIDB4ODY0MSwgMHg0MUI4LAotICAgIDB4ODY0MiwgMHg0RDI5LCAweDg2NDYsIDB4NEQyQSwgMHg4NjRELCAweDE5NEYsIDB4ODY0RSwgMHgwNzhCLAotICAgIDB4ODY1MCwgMHgwNjZFLCAweDg2NTIsIDB4M0FFNywgMHg4NjUzLCAweDQ4OTAsIDB4ODY1NCwgMHgxOTUxLAotICAgIDB4ODY1NSwgMHgxMDk0LCAweDg2NTYsIDB4NDg5MSwgMHg4NjU3LCAweDQyRDIsIDB4ODY1QSwgMHgwNjhGLAotICAgIDB4ODY1QiwgMHgzNDE4LCAweDg2NUMsIDB4MEY4MiwgMHg4NjVFLCAweDA2RUIsIDB4ODY1RiwgMHgxOTUyLAotICAgIDB4ODY2MiwgMHg0MkQzLCAweDg2NjMsIDB4M0FFOCwgMHg4NjY3LCAweDE5NTMsIDB4ODY2QiwgMHgwQkFDLAotICAgIDB4ODY2QywgMHgzQUU5LCAweDg2NkYsIDB4M0FFQSwgMHg4NjcxLCAweDE5NTQsIDB4ODY3NSwgMHg0MkQ1LAotICAgIDB4ODY3NywgMHg0ODkyLCAweDg2NzksIDB4MENEMiwgMHg4NjdBLCAweDNBRUIsIDB4ODY3QiwgMHgwNDdFLAotICAgIDB4ODY3RCwgMHgzNzg2LCAweDg2ODcsIDB4NDg5MywgMHg4Njg5LCAweDQ4OTQsIDB4ODY4QSwgMHgwNTYzLAotICAgIDB4ODY4QiwgMHgxOTU5LCAweDg2OEMsIDB4MTk1QSwgMHg4NjhELCAweDNBRUMsIDB4ODY5MSwgMHgzQUVELAotICAgIDB4ODY5MywgMHgxOTU1LCAweDg2OTUsIDB4MDg4QiwgMHg4Njk4LCAweDNBRUUsIDB4ODY5QywgMHg0ODk1LAotICAgIDB4ODY5RCwgMHg0ODk2LCAweDg2QTMsIDB4MTk1NiwgMHg4NkE0LCAweDBDRjgsIDB4ODZBNywgMHgzQUVGLAotICAgIDB4ODZBOCwgMHgzQUYwLCAweDg2QTksIDB4MTk1NywgMHg4NkFBLCAweDE5NTgsIDB4ODZBQiwgMHgxOTYyLAotICAgIDB4ODZBRiwgMHgxOTVDLCAweDg2QjAsIDB4MTk1RiwgMHg4NkIxLCAweDQ4OTcsIDB4ODZCMywgMHg0ODk4LAotICAgIDB4ODZCNiwgMHgxOTVCLCAweDg2QjgsIDB4NDJENiwgMHg4NkMwLCAweDREMkIsIDB4ODZDMSwgMHg0ODk5LAotICAgIDB4ODZDMywgMHg0ODlBLCAweDg2QzQsIDB4MTk1RCwgMHg4NkM2LCAweDE5NUUsIDB4ODZDNywgMHgwOTA0LAotICAgIDB4ODZDOSwgMHgxOTYwLCAweDg2Q0IsIDB4MEI3RiwgMHg4NkNELCAweDA3MkMsIDB4ODZDRSwgMHgwNUEwLAotICAgIDB4ODZEMSwgMHg0ODlCLCAweDg2RDQsIDB4MTk2MywgMHg4NkQ1LCAweDQ4OUMsIDB4ODZENywgMHg0ODlELAotICAgIDB4ODZEOSwgMHgwNTlELCAweDg2REIsIDB4MTk2OCwgMHg4NkRFLCAweDE5NjQsIDB4ODZERiwgMHgxOTY3LAotICAgIDB4ODZFMywgMHg0ODlFLCAweDg2RTQsIDB4MEQ0RSwgMHg4NkU2LCAweDQ4OUYsIDB4ODZFOSwgMHgxOTY1LAotICAgIDB4ODZFQywgMHgxOTY2LCAweDg2RUQsIDB4MERCQSwgMHg4NkVFLCAweDBENkUsIDB4ODZFRiwgMHgxOTY5LAotICAgIDB4ODZGOCwgMHgwQjVELCAweDg2RjksIDB4MTk3MywgMHg4NkZBLCAweDNBRjEsIDB4ODZGQiwgMHgxOTZGLAotICAgIDB4ODZGQywgMHg0MkQ3LCAweDg2RkQsIDB4M0FGMiwgMHg4NkZFLCAweDA1NkIsIDB4ODcwMCwgMHgxOTZELAotICAgIDB4ODcwMiwgMHgwRTU4LCAweDg3MDMsIDB4MTk2RSwgMHg4NzA1LCAweDQ4QTEsIDB4ODcwNiwgMHgxOTZCLAotICAgIDB4ODcwNywgMHg0OEEyLCAweDg3MDgsIDB4MTk2QywgMHg4NzA5LCAweDE5NzEsIDB4ODcwQSwgMHgxOTc0LAotICAgIDB4ODcwQiwgMHgzQUYzLCAweDg3MEQsIDB4MTk3MiwgMHg4NzBFLCAweDQ4QTMsIDB4ODcxMCwgMHg0OEE0LAotICAgIDB4ODcxMSwgMHgxOTcwLCAweDg3MTIsIDB4MTk2QSwgMHg4NzEzLCAweDNBRjQsIDB4ODcxNCwgMHg0RDJDLAotICAgIDB4ODcxOCwgMHgwQjk2LCAweDg3MTksIDB4M0FGNSwgMHg4NzFBLCAweDE5N0IsIDB4ODcxQywgMHgwRUI2LAotICAgIDB4ODcxRSwgMHgzQUY2LCAweDg3MUYsIDB4NDhBNSwgMHg4NzIxLCAweDQ4QTYsIDB4ODcyMiwgMHg0RDJELAotICAgIDB4ODcyMywgMHg0OEE3LCAweDg3MjUsIDB4MTk3OSwgMHg4NzI4LCAweDNBRjcsIDB4ODcyOSwgMHgxOTdBLAotICAgIDB4ODcyRSwgMHg0RDJFLCAweDg3MzEsIDB4NDhBOCwgMHg4NzM0LCAweDE5NzUsIDB4ODczNywgMHgxOTc3LAotICAgIDB4ODczOSwgMHg0RDJGLCAweDg3M0EsIDB4NDhBOSwgMHg4NzNCLCAweDE5NzgsIDB4ODczRSwgMHgzQUY4LAotICAgIDB4ODczRiwgMHgxOTc2LCAweDg3NDAsIDB4NDhBQSwgMHg4NzQzLCAweDQ4QUIsIDB4ODc0OSwgMHgwQThBLAotICAgIDB4ODc0QiwgMHgwRkRGLCAweDg3NEMsIDB4MTk3RiwgMHg4NzRFLCAweDE5ODAsIDB4ODc1MSwgMHg0OEFDLAotICAgIDB4ODc1MywgMHgxOTg2LCAweDg3NTUsIDB4MDlGMCwgMHg4NzU3LCAweDE5ODIsIDB4ODc1OCwgMHg0OEFELAotICAgIDB4ODc1OSwgMHgxOTg1LCAweDg3NUQsIDB4NEQzMCwgMHg4NzVGLCAweDE5N0QsIDB4ODc2MCwgMHgxOTdDLAotICAgIDB4ODc2MywgMHgxOTg3LCAweDg3NjQsIDB4NDhBRSwgMHg4NzY1LCAweDQ4QUYsIDB4ODc2NiwgMHgwNTVDLAotICAgIDB4ODc2OCwgMHgxOTgzLCAweDg3NkEsIDB4MTk4OCwgMHg4NzZFLCAweDE5ODQsIDB4ODc3MSwgMHgzQUY5LAotICAgIDB4ODc3MiwgMHg0OEIwLCAweDg3NzQsIDB4MTk4MSwgMHg4Nzc2LCAweDBCQ0YsIDB4ODc3OCwgMHgxOTdFLAotICAgIDB4ODc3QiwgMHg0RDMxLCAweDg3N0MsIDB4NDhCMSwgMHg4NzdGLCAweDBEMUUsIDB4ODc4MiwgMHgxOThDLAotICAgIDB4ODc4NywgMHg0MkQ4LCAweDg3ODgsIDB4M0FGQSwgMHg4Nzg5LCAweDQ4QjUsIDB4ODc4QiwgMHg0OEI2LAotICAgIDB4ODc4QywgMHg0RDMyLCAweDg3OEQsIDB4MEYyNSwgMHg4NzhFLCAweDREMzMsIDB4ODc5MywgMHg0OEI3LAotICAgIDB4ODc5NywgMHg0RDM0LCAweDg3OTgsIDB4NEQzNSwgMHg4Nzk5LCAweDNBRkIsIDB4ODc5RSwgMHg0RDM2LAotICAgIDB4ODc5RiwgMHgxOThCLCAweDg3QTAsIDB4NDhCOCwgMHg4N0EyLCAweDE5OEEsIDB4ODdBMywgMHg0RDM3LAotICAgIDB4ODdBNywgMHg0OEI0LCAweDg3QUIsIDB4MTk5MywgMHg4N0FDLCAweDNBRkMsIDB4ODdBRCwgMHgzQUZELAotICAgIDB4ODdBRSwgMHg0RDM4LCAweDg3QUYsIDB4MTk4RCwgMHg4N0IzLCAweDE5OTUsIDB4ODdCNSwgMHgzQUZFLAotICAgIDB4ODdCQSwgMHgwRjUwLCAweDg3QkIsIDB4MTk5OCwgMHg4N0JELCAweDE5OEYsIDB4ODdCRSwgMHg0OEJCLAotICAgIDB4ODdCRiwgMHg0RDM5LCAweDg3QzAsIDB4MTk5MCwgMHg4N0MxLCAweDQ4QkQsIDB4ODdDNCwgMHgxOTk0LAotICAgIDB4ODdDNiwgMHgxOTk3LCAweDg3QzcsIDB4MTk5NiwgMHg4N0M5LCAweDREM0EsIDB4ODdDQiwgMHgxOThFLAotICAgIDB4ODdDRSwgMHg0OEJFLCAweDg3RDAsIDB4MTk5MSwgMHg4N0QyLCAweDE5QTIsIDB4ODdENiwgMHgzQUZGLAotICAgIDB4ODdEQSwgMHg0RDNCLCAweDg3REYsIDB4NDhCRiwgMHg4N0UwLCAweDE5OUIsIDB4ODdFMywgMHg0OEMxLAotICAgIDB4ODdFNSwgMHg0OEMyLCAweDg3RTYsIDB4NDhDMywgMHg4N0VBLCAweDQ4QzQsIDB4ODdFQiwgMHgzQjAwLAotICAgIDB4ODdFQywgMHgxRTIzLCAweDg3RUQsIDB4M0IwMSwgMHg4N0VGLCAweDE5OTksIDB4ODdGMiwgMHgxOTlBLAotICAgIDB4ODdGNSwgMHgzQzNELCAweDg3RjYsIDB4MTk5RiwgMHg4N0Y3LCAweDE5QTAsIDB4ODdGOSwgMHgwNTg4LAotICAgIDB4ODdGQiwgMHgwNjVDLCAweDg3RkUsIDB4MTk5RSwgMHg4ODAxLCAweDNCMDIsIDB4ODgwMywgMHg0RjU4LAotICAgIDB4ODgwNSwgMHgxOTg5LCAweDg4MDYsIDB4M0IwNCwgMHg4ODA3LCAweDIxQTYsIDB4ODgwQSwgMHg0MkRBLAotICAgIDB4ODgwQiwgMHgzQjA1LCAweDg4MEQsIDB4MTk5RCwgMHg4ODBFLCAweDE5QTEsIDB4ODgwRiwgMHgxOTlDLAotICAgIDB4ODgxMCwgMHg0MkRCLCAweDg4MTEsIDB4MTlBMywgMHg4ODEzLCAweDQ4QzUsIDB4ODgxNCwgMHgzQjA2LAotICAgIDB4ODgxNSwgMHgxOUE1LCAweDg4MTYsIDB4MTlBNCwgMHg4ODE4LCAweDREM0MsIDB4ODgxQiwgMHg0RDNELAotICAgIDB4ODgxQywgMHgzQjA3LCAweDg4MUYsIDB4MUU4NSwgMHg4ODIxLCAweDE5QTcsIDB4ODgyMiwgMHgxOUE2LAotICAgIDB4ODgyMywgMHgxOTYxLCAweDg4MjcsIDB4MTlBQiwgMHg4ODI4LCAweDQ4QzYsIDB4ODgyRCwgMHg0RDNFLAotICAgIDB4ODgyRSwgMHg0OEM3LCAweDg4MzEsIDB4MTlBOCwgMHg4ODMyLCAweDQ4QzgsIDB4ODgzNiwgMHgxOUE5LAotICAgIDB4ODgzOSwgMHgxOUFBLCAweDg4M0EsIDB4NEQzRiwgMHg4ODNCLCAweDE5QUMsIDB4ODgzQywgMHg0OEM5LAotICAgIDB4ODg0MCwgMHgwNzQyLCAweDg4NDIsIDB4MTlBRSwgMHg4ODQ0LCAweDE5QUQsIDB4ODg0NSwgMHg0RDQwLAotICAgIDB4ODg0NiwgMHgwOTNBLCAweDg4NEEsIDB4NDhDQiwgMHg4ODRCLCAweDRENDEsIDB4ODg0QywgMHgwN0U2LAotICAgIDB4ODg0RCwgMHgxNTI0LCAweDg4NEUsIDB4NEQ0MiwgMHg4ODUyLCAweDE5QUYsIDB4ODg1MywgMHgwOTVCLAotICAgIDB4ODg1NSwgMHg0RDQzLCAweDg4NTYsIDB4M0IwOCwgMHg4ODU3LCAweDA1OTcsIDB4ODg1OCwgMHg0OENDLAotICAgIDB4ODg1OSwgMHgxOUIwLCAweDg4NUEsIDB4NEQ0NCwgMHg4ODVCLCAweDA0RjQsIDB4ODg1RCwgMHgwOUJGLAotICAgIDB4ODg1RSwgMHgxOUIxLCAweDg4NUYsIDB4M0IwOSwgMHg4ODYxLCAweDA3RTcsIDB4ODg2MiwgMHgxOUIyLAotICAgIDB4ODg2MywgMHgwNEE1LCAweDg4NjQsIDB4M0IwQSwgMHg4ODY4LCAweDBEQUYsIDB4ODg2OSwgMHg0OENGLAotICAgIDB4ODg2QiwgMHgxOUIzLCAweDg4NkUsIDB4NEQ0NSwgMHg4ODZGLCAweDQ4RDEsIDB4ODg3MCwgMHgwQTMwLAotICAgIDB4ODg3MiwgMHgxOUJBLCAweDg4NzUsIDB4MTlCNywgMHg4ODc3LCAweDBCQUQsIDB4ODg3RCwgMHgxOUI4LAotICAgIDB4ODg3RSwgMHgxOUI1LCAweDg4N0YsIDB4MDZENiwgMHg4ODgxLCAweDE5QjQsIDB4ODg4MiwgMHgxOUJCLAotICAgIDB4ODg4OCwgMHgwNzBDLCAweDg4OEIsIDB4MEIzRSwgMHg4ODhELCAweDE5QzEsIDB4ODg5MiwgMHgxOUJELAotICAgIDB4ODg5NiwgMHgwQjE1LCAweDg4OTcsIDB4MTlCQywgMHg4ODk4LCAweDNCMEIsIDB4ODg5OSwgMHgxOUJGLAotICAgIDB4ODg5QSwgMHg0RDQ2LCAweDg4OUIsIDB4NEQ0NywgMHg4ODlDLCAweDRENDgsIDB4ODg5RSwgMHgxOUI2LAotICAgIDB4ODhBMCwgMHg0OEQyLCAweDg4QTIsIDB4MTlDMCwgMHg4OEE0LCAweDE5QzIsIDB4ODhBQSwgMHgzQjBDLAotICAgIDB4ODhBQiwgMHgwRDgzLCAweDg4QUUsIDB4MTlCRSwgMHg4OEIwLCAweDE5QzMsIDB4ODhCMSwgMHgxOUM1LAotICAgIDB4ODhCNCwgMHgwNzg3LCAweDg4QjUsIDB4MTlCOSwgMHg4OEI3LCAweDA0ODUsIDB4ODhCQywgMHg0OEQzLAotICAgIDB4ODhCRCwgMHgzQjBELCAweDg4QkUsIDB4M0IwRSwgMHg4OEJGLCAweDE5QzQsIDB4ODhDMCwgMHg0OEQ0LAotICAgIDB4ODhDMSwgMHgwODRCLCAweDg4QzIsIDB4MEZCRSwgMHg4OEMzLCAweDE5QzYsIDB4ODhDNCwgMHgxOUM3LAotICAgIDB4ODhDNSwgMHgwQUY3LCAweDg4QzYsIDB4Mzc4OSwgMHg4OENBLCAweDNCMEYsIDB4ODhDRCwgMHg0RDQ5LAotICAgIDB4ODhDRSwgMHg0MkRDLCAweDg4Q0YsIDB4MEY2QSwgMHg4OEQxLCAweDQ4RDYsIDB4ODhEMiwgMHgzQjEwLAotICAgIDB4ODhEMywgMHg0OEQ3LCAweDg4RDQsIDB4MTlDOCwgMHg4OEQ1LCAweDBGMUYsIDB4ODhEOCwgMHgxOUM5LAotICAgIDB4ODhEOSwgMHgxOUNBLCAweDg4REIsIDB4M0IxMSwgMHg4OERDLCAweDBFMzQsIDB4ODhERCwgMHgxOUNCLAotICAgIDB4ODhERiwgMHgwODMwLCAweDg4RTAsIDB4NEQ0QSwgMHg4OEUxLCAweDBGNkIsIDB4ODhFOCwgMHgxOUQwLAotICAgIDB4ODhFRiwgMHg0RDRCLCAweDg4RjAsIDB4M0IxMiwgMHg4OEYxLCAweDNCMTMsIDB4ODhGMiwgMHgxOUQxLAotICAgIDB4ODhGMywgMHgwOUMwLCAweDg4RjQsIDB4MTlDRiwgMHg4OEY1LCAweDIxQTcsIDB4ODhGOCwgMHgwRjUxLAotICAgIDB4ODhGOSwgMHgxOUNDLCAweDg4RkMsIDB4MTlDRSwgMHg4OEZELCAweDBBNjEsIDB4ODhGRSwgMHgwQTQ0LAotICAgIDB4ODkwMSwgMHg0OEQ5LCAweDg5MDIsIDB4MTlDRCwgMHg4OTA0LCAweDE5RDIsIDB4ODkwNiwgMHgzQjE0LAotICAgIDB4ODkwNywgMHgwREYzLCAweDg5MEEsIDB4MTlENCwgMHg4OTBDLCAweDE5RDMsIDB4ODkwRSwgMHg0RDRDLAotICAgIDB4ODkwRiwgMHg0RDRELCAweDg5MTAsIDB4MDVDQSwgMHg4OTEyLCAweDBFNTksIDB4ODkxMywgMHgxOUQ1LAotICAgIDB4ODkxOCwgMHgzQjE1LCAweDg5MTksIDB4M0IxNiwgMHg4OTFBLCAweDNCMTcsIDB4ODkxQywgMHgyMEE4LAotICAgIDB4ODkxRCwgMHgxOUUxLCAweDg5MUUsIDB4MTlENywgMHg4OTI1LCAweDE5RDgsIDB4ODkyNiwgMHg0RDRFLAotICAgIDB4ODkyNywgMHgzQjE4LCAweDg5MkEsIDB4MTlEOSwgMHg4OTJCLCAweDE5REEsIDB4ODkzMCwgMHgzQjE5LAotICAgIDB4ODkzMiwgMHg0MkRFLCAweDg5MzUsIDB4NEQ0RiwgMHg4OTM2LCAweDE5REUsIDB4ODkzNywgMHg0OERCLAotICAgIDB4ODkzOCwgMHgxOURGLCAweDg5MzksIDB4NDJERiwgMHg4OTNCLCAweDE5REQsIDB4ODkzRSwgMHgzQjFBLAotICAgIDB4ODk0MCwgMHg0MkUwLCAweDg5NDEsIDB4MTlEQiwgMHg4OTQyLCAweDQ4REQsIDB4ODk0MywgMHgxOUQ2LAotICAgIDB4ODk0NCwgMHgxOURDLCAweDg5NDUsIDB4NDhERSwgMHg4OTQ5LCAweDQ4REYsIDB4ODk0QywgMHgxOUUwLAotICAgIDB4ODk0RCwgMHgxQkQwLCAweDg5NTYsIDB4MDUyOCwgMHg4OTVBLCAweDRENTAsIDB4ODk1QywgMHg0RDUxLAotICAgIDB4ODk1RSwgMHgxOUUzLCAweDg5NUYsIDB4MDZENywgMHg4OTYwLCAweDE5RTIsIDB4ODk2MiwgMHg0OEUxLAotICAgIDB4ODk2NCwgMHgxOUU1LCAweDg5NjYsIDB4MTlFNCwgMHg4OTZBLCAweDE5RTcsIDB4ODk2QiwgMHg0RDUyLAotICAgIDB4ODk2RCwgMHgxOUU2LCAweDg5NkYsIDB4MTlFOCwgMHg4OTcwLCAweDRENTMsIDB4ODk3MiwgMHgwOTNCLAotICAgIDB4ODk3NCwgMHgxOUU5LCAweDg5NzcsIDB4MTlFQSwgMHg4OTdCLCAweDNCMUIsIDB4ODk3QywgMHg0RDU0LAotICAgIDB4ODk3RSwgMHgxOUVCLCAweDg5N0YsIDB4MEE2MiwgMHg4OTgwLCAweDM2MkUsIDB4ODk4MSwgMHgwRjQxLAotICAgIDB4ODk4MywgMHgxOUVDLCAweDg5ODYsIDB4MERGNCwgMHg4OTg3LCAweDBDRkMsIDB4ODk4OCwgMHgxOUVELAotICAgIDB4ODk4OSwgMHg0OEUyLCAweDg5OEEsIDB4MTlFRSwgMHg4OThCLCAweDA3NUYsIDB4ODk4RiwgMHgwNjQ2LAotICAgIDB4ODk5MCwgMHg0OEUzLCAweDg5OTMsIDB4MTlFRiwgMHg4OTk0LCAweDQyRTEsIDB4ODk5NiwgMHgwOEI5LAotICAgIDB4ODk5NywgMHgwQ0Y3LCAweDg5OTgsIDB4MTlGMCwgMHg4OTlBLCAweDA1QUUsIDB4ODk5RiwgMHg0OEU0LAotICAgIDB4ODlBMSwgMHgxOUYxLCAweDg5QTUsIDB4NEQ1NSwgMHg4OUE2LCAweDE5RjMsIDB4ODlBNywgMHgwRjYxLAotICAgIDB4ODlBOSwgMHgxOUYyLCAweDg5QUEsIDB4MEEwQywgMHg4OUFDLCAweDE5RjQsIDB4ODlBRiwgMHgxOUY1LAotICAgIDB4ODlCMCwgMHg0OEU1LCAweDg5QjIsIDB4MTlGNiwgMHg4OUIzLCAweDA2MEQsIDB4ODlCNSwgMHg0RDU2LAotICAgIDB4ODlCNywgMHg0OEU2LCAweDg5QkEsIDB4MTlGNywgMHg4OUJDLCAweDRENTcsIDB4ODlCRCwgMHgxOUY4LAotICAgIDB4ODlCRiwgMHgxOUY5LCAweDg5QzAsIDB4MTlGQSwgMHg4OUQyLCAweDA1QUYsIDB4ODlENCwgMHgzQjFDLAotICAgIDB4ODlENSwgMHg0RDU4LCAweDg5RDYsIDB4M0IxRCwgMHg4OUQ4LCAweDQ4RTcsIDB4ODlEQSwgMHgxOUZCLAotICAgIDB4ODlEQywgMHgxOUZDLCAweDg5REQsIDB4MTlGRCwgMHg4OUUzLCAweDA1NzIsIDB4ODlFNSwgMHgzQjFFLAotICAgIDB4ODlFNiwgMHgwOUVFLCAweDg5RTcsIDB4MTlGRSwgMHg4OUVCLCAweDQ4RTgsIDB4ODlGMSwgMHgzQjFGLAotICAgIDB4ODlGMywgMHg0OEVBLCAweDg5RjQsIDB4MTlGRiwgMHg4OUY2LCAweDQyRTIsIDB4ODlGOCwgMHgxQTAwLAotICAgIDB4ODlGRCwgMHg0OEVCLCAweDg5RkYsIDB4NDhFQywgMHg4QTAwLCAweDA3NzQsIDB4OEEwMSwgMHgzNUJDLAotICAgIDB4OEEwMiwgMHgwQzE3LCAweDhBMDMsIDB4MUEwMSwgMHg4QTA3LCAweDNCMjAsIDB4OEEwOCwgMHgwNzJELAotICAgIDB4OEEwQSwgMHgwQTFDLCAweDhBMEMsIDB4MUEwNCwgMHg4QTBFLCAweDBDN0MsIDB4OEEwRiwgMHgzQjIxLAotICAgIDB4OEExMCwgMHgxQTAzLCAweDhBMTEsIDB4NDhFRSwgMHg4QTEyLCAweDIxQTgsIDB4OEExMywgMHgwNzA3LAotICAgIDB4OEExNCwgMHg0OEVGLCAweDhBMTUsIDB4M0IyMiwgMHg4QTE2LCAweDFBMDIsIDB4OEExNywgMHgwQjU3LAotICAgIDB4OEExOCwgMHgwNjQ3LCAweDhBMUIsIDB4MUEwNSwgMHg4QTFELCAweDFBMDYsIDB4OEExRiwgMHgwOUMxLAotICAgIDB4OEEyMSwgMHg0OEYxLCAweDhBMjIsIDB4M0IyMywgMHg4QTIzLCAweDA3NDMsIDB4OEEyNSwgMHgxQTA3LAotICAgIDB4OEEyQSwgMHgwRTVBLCAweDhBMkQsIDB4MEE4MywgMHg4QTMxLCAweDA2OTAsIDB4OEEzMywgMHgwRjAxLAotICAgIDB4OEEzNCwgMHgwQUNDLCAweDhBMzUsIDB4NDhGMiwgMHg4QTM2LCAweDFBMDgsIDB4OEEzNywgMHgyMUE5LAotICAgIDB4OEEzQSwgMHgwQTBELCAweDhBM0IsIDB4MEJBRSwgMHg4QTNDLCAweDA5QzIsIDB4OEEzRSwgMHg0OEYzLAotICAgIDB4OEE0MSwgMHgxQTA5LCAweDhBNDUsIDB4NDhGNCwgMHg4QTQ2LCAweDFBMEMsIDB4OEE0NywgMHg0MkUzLAotICAgIDB4OEE0OCwgMHgxQTBELCAweDhBNDksIDB4NEQ1OSwgMHg4QTRELCAweDQ4RjUsIDB4OEE0RSwgMHgzQjI0LAotICAgIDB4OEE1MCwgMHgwODJFLCAweDhBNTEsIDB4MEIyMiwgMHg4QTUyLCAweDFBMEIsIDB4OEE1NCwgMHgwOUMzLAotICAgIDB4OEE1NSwgMHgwREIwLCAweDhBNTcsIDB4NEQ1QSwgMHg4QTU4LCAweDQ4RjYsIDB4OEE1QiwgMHgxQTBBLAotICAgIDB4OEE1RCwgMHg0MkU0LCAweDhBNUUsIDB4MDhCQSwgMHg4QTYwLCAweDA0RjUsIDB4OEE2MSwgMHg0MkU1LAotICAgIDB4OEE2MiwgMHgxQTExLCAweDhBNjMsIDB4MDcyRSwgMHg4QTY2LCAweDA4QkMsIDB4OEE2NywgMHg0RDVCLAotICAgIDB4OEE2OSwgMHgwOEJCLCAweDhBNkIsIDB4MEZGMywgMHg4QTZDLCAweDFBMTAsIDB4OEE2RCwgMHgxQTBGLAotICAgIDB4OEE2RSwgMHgwQUE5LCAweDhBNzAsIDB4MDY2NywgMHg4QTcxLCAweDBGRTksIDB4OEE3MiwgMHgwNTk4LAotICAgIDB4OEE3MywgMHgwOUM0LCAweDhBNzUsIDB4NDJFNiwgMHg4QTc5LCAweDIxQUEsIDB4OEE3QywgMHgxQTBFLAotICAgIDB4OEE3RSwgMHg0RDVDLCAweDhBN0YsIDB4M0IyNSwgMHg4QTgyLCAweDFBMTMsIDB4OEE4NCwgMHgxQTE0LAotICAgIDB4OEE4NSwgMHgxQTEyLCAweDhBODYsIDB4NEQ1RCwgMHg4QTg3LCAweDA3OEMsIDB4OEE4OSwgMHgwRjJBLAotICAgIDB4OEE4QywgMHgwOEJELCAweDhBOEQsIDB4MENERCwgMHg4QTkwLCAweDQ4RjgsIDB4OEE5MSwgMHgxQTE3LAotICAgIDB4OEE5MywgMHgwQTY0LCAweDhBOTUsIDB4MEI4MCwgMHg4QTk2LCAweDRENUUsIDB4OEE5OCwgMHgwRjIwLAotICAgIDB4OEE5QSwgMHgxQTFBLCAweDhBOUUsIDB4MDdBMCwgMHg4QUEwLCAweDBBNjMsIDB4OEFBMSwgMHgxQTE2LAotICAgIDB4OEFBMywgMHgxQTFCLCAweDhBQTQsIDB4MDdBMSwgMHg4QUE1LCAweDFBMTgsIDB4OEFBNiwgMHgxQTE5LAotICAgIDB4OEFBNywgMHgyMUFCLCAweDhBQTgsIDB4MUExNSwgMHg4QUFBLCAweDM2MzgsIDB4OEFBQywgMHgwQTg2LAotICAgIDB4OEFBRCwgMHgwQ0ExLCAweDhBQUUsIDB4NDhGNywgMHg4QUIwLCAweDBCNkQsIDB4OEFCMiwgMHgwNTVELAotICAgIDB4OEFCNiwgMHg0RDVGLCAweDhBQjcsIDB4NDhGOSwgMHg4QUI5LCAweDBEODQsIDB4OEFCQywgMHgwNjVELAotICAgIDB4OEFCRSwgMHgyMUFDLCAweDhBQkYsIDB4MEJEMCwgMHg4QUMyLCAweDFBMUUsIDB4OEFDNCwgMHgxQTFDLAotICAgIDB4OEFDNywgMHgwQjhBLCAweDhBQzksIDB4NEQ2MCwgMHg4QUNCLCAweDBBNjUsIDB4OEFDQywgMHgwNjBFLAotICAgIDB4OEFDRCwgMHgxQTFELCAweDhBQ0YsIDB4MEEyMSwgMHg4QUQwLCAweDQyRTcsIDB4OEFEMSwgMHg0RDYxLAotICAgIDB4OEFEMiwgMHgwRjkyLCAweDhBRDYsIDB4MEZFNiwgMHg4QUQ3LCAweDQ4RkEsIDB4OEFEQSwgMHgxQTFGLAotICAgIDB4OEFEQiwgMHgxQTJBLCAweDhBREMsIDB4MEJEMSwgMHg4QURELCAweDRENjIsIDB4OEFERSwgMHgxQTI5LAotICAgIDB4OEFERiwgMHgyMUFELCAweDhBRTAsIDB4MUEyNiwgMHg4QUUxLCAweDFBMkUsIDB4OEFFMiwgMHgxQTI3LAotICAgIDB4OEFFNCwgMHgxQTIzLCAweDhBRTYsIDB4MEMxOCwgMHg4QUU3LCAweDFBMjIsIDB4OEFFQiwgMHgxQTIwLAotICAgIDB4OEFFQywgMHg0RDYzLCAweDhBRUQsIDB4MEYwQiwgMHg4QUVFLCAweDA4QkUsIDB4OEFGMSwgMHgxQTI0LAotICAgIDB4OEFGMywgMHgxQTIxLCAweDhBRjQsIDB4M0IyNiwgMHg4QUY1LCAweDRENjQsIDB4OEFGNiwgMHgyMUFGLAotICAgIDB4OEFGNywgMHgxQTI4LCAweDhBRjgsIDB4MDk3RSwgMHg4QUZBLCAweDA3NzUsIDB4OEFGQywgMHg0OEZCLAotICAgIDB4OEFGRSwgMHgwQjVBLCAweDhCMDAsIDB4MEU3MywgMHg4QjAxLCAweDA0RkMsIDB4OEIwMiwgMHgwNEE2LAotICAgIDB4OEIwNCwgMHgwQzdELCAweDhCMDUsIDB4NDhGRSwgMHg4QjA2LCAweDRENjUsIDB4OEIwNywgMHgxQTJDLAotICAgIDB4OEIwQSwgMHg0OEZELCAweDhCMEMsIDB4MUEyQiwgMHg4QjBELCAweDQ4RkYsIDB4OEIwRSwgMHgwQ0JFLAotICAgIDB4OEIwRiwgMHg0RDY2LCAweDhCMTAsIDB4MUEzMCwgMHg4QjExLCAweDRENjcsIDB4OEIxNCwgMHgxQTI1LAotICAgIDB4OEIxNiwgMHgxQTJGLCAweDhCMTcsIDB4MUEzMSwgMHg4QjE5LCAweDA3NjAsIDB4OEIxQSwgMHgxQTJELAotICAgIDB4OEIxQiwgMHgwN0U4LCAweDhCMUMsIDB4NDkwMCwgMHg4QjFELCAweDA5MDEsIDB4OEIxRiwgMHgzQjI3LAotICAgIDB4OEIyMCwgMHgxQTMyLCAweDhCMjEsIDB4MEY0MiwgMHg4QjI2LCAweDFBMzUsIDB4OEIyOCwgMHgxQTM4LAotICAgIDB4OEIyQiwgMHgxQTM2LCAweDhCMkMsIDB4MERBNywgMHg4QjJELCAweDQ5MDEsIDB4OEIzMywgMHgxQTMzLAotICAgIDB4OEIzNywgMHgzQjI4LCAweDhCMzksIDB4MDZEOCwgMHg4QjNFLCAweDFBMzcsIDB4OEI0MSwgMHgxQTM5LAotICAgIDB4OEI0MywgMHgzQjI5LCAweDhCNDQsIDB4M0IyQSwgMHg4QjQ1LCAweDRENjgsIDB4OEI0NiwgMHg0MkU4LAotICAgIDB4OEI0OSwgMHgxQTNELCAweDhCNEMsIDB4MUEzQSwgMHg4QjRFLCAweDFBM0MsIDB4OEI0RiwgMHgxQTNCLAotICAgIDB4OEI1MSwgMHg0OTAzLCAweDhCNTIsIDB4NEQ2OSwgMHg4QjUzLCAweDIxQjAsIDB4OEI1NCwgMHgzQjJCLAotICAgIDB4OEI1NiwgMHgxQTNFLCAweDhCNTgsIDB4MDhERCwgMHg4QjU5LCAweDQyRTksIDB4OEI1QSwgMHgxQTQwLAotICAgIDB4OEI1QiwgMHgxQTNGLCAweDhCNUMsIDB4MEREQSwgMHg4QjVFLCAweDQ5MDQsIDB4OEI1RiwgMHgxQTQyLAotICAgIDB4OEI2NiwgMHgwNzJGLCAweDhCNjksIDB4NDJFQSwgMHg4QjZCLCAweDFBNDEsIDB4OEI2QywgMHgxQTQzLAotICAgIDB4OEI2RCwgMHg0RDZBLCAweDhCNkYsIDB4MUE0NCwgMHg4QjcwLCAweDA2NUUsIDB4OEI3MSwgMHgxODJFLAotICAgIDB4OEI3MiwgMHgwOUUxLCAweDhCNzQsIDB4MUE0NSwgMHg4Qjc2LCAweDQ5MDUsIDB4OEI3NywgMHgwN0EyLAotICAgIDB4OEI3OCwgMHg0RDZCLCAweDhCN0MsIDB4NEQ2QywgMHg4QjdELCAweDFBNDYsIDB4OEI3RSwgMHg0RDZELAotICAgIDB4OEI3RiwgMHgyMUIxLCAweDhCODAsIDB4MUE0NywgMHg4QjgxLCAweDQ5MDYsIDB4OEI4MywgMHgwODhDLAotICAgIDB4OEI4NSwgMHg0RDZFLCAweDhCOEEsIDB4MTNEMywgMHg4QjhCLCAweDQ5MDcsIDB4OEI4QywgMHgxQTQ4LAotICAgIDB4OEI4RSwgMHgxQTQ5LCAweDhCOTAsIDB4MDkzQywgMHg4QjkyLCAweDFBNEEsIDB4OEI5MywgMHgxQTRCLAotICAgIDB4OEI5NCwgMHg0OTA4LCAweDhCOTUsIDB4NDkwOSwgMHg4Qjk2LCAweDFBNEMsIDB4OEI5OSwgMHgxQTRELAotICAgIDB4OEI5QSwgMHgxQTRFLCAweDhCOUMsIDB4M0IyQywgMHg4QjlELCAweDQyRUIsIDB4OEI5RSwgMHgzQjJELAotICAgIDB4OEI5RiwgMHg0RDZGLCAweDhDMzcsIDB4MEI2OSwgMHg4QzM5LCAweDQ5MEEsIDB4OEMzQSwgMHgxQTRGLAotICAgIDB4OEMzRCwgMHg0OTBDLCAweDhDM0YsIDB4MUE1MSwgMHg4QzQxLCAweDFBNTAsIDB4OEM0NSwgMHg0OTBGLAotICAgIDB4OEM0NiwgMHgwQzdFLCAweDhDNDcsIDB4M0IyRSwgMHg4QzQ4LCAweDFBNTIsIDB4OEM0OSwgMHg0MkVDLAotICAgIDB4OEM0QSwgMHgwRTVCLCAweDhDNEIsIDB4NEQ3MCwgMHg4QzRDLCAweDFBNTMsIDB4OEM0RSwgMHgxQTU0LAotICAgIDB4OEM0RiwgMHg0OTEwLCAweDhDNTAsIDB4MUE1NSwgMHg4QzUzLCAweDRENzEsIDB4OEM1NCwgMHgzQjJGLAotICAgIDB4OEM1NSwgMHgxQTU2LCAweDhDNTcsIDB4NDkxMSwgMHg4QzVBLCAweDBDQjIsIDB4OEM2MSwgMHgwOUM1LAotICAgIDB4OEM2MiwgMHgxQTU3LCAweDhDNjgsIDB4NDJFRCwgMHg4QzY5LCAweDQ5MTIsIDB4OEM2QSwgMHgwN0ZELAotICAgIDB4OEM2QiwgMHgxMDA3LCAweDhDNkMsIDB4MUE1OCwgMHg4QzZELCAweDQ5MTMsIDB4OEM3MywgMHgzQjMwLAotICAgIDB4OEM3OCwgMHgxQTU5LCAweDhDNzksIDB4MERCMSwgMHg4QzdBLCAweDFBNUEsIDB4OEM3QiwgMHg0RDcyLAotICAgIDB4OEM3QywgMHgxQTYyLCAweDhDODIsIDB4MUE1QiwgMHg4Qzg1LCAweDFBNUQsIDB4OEM4OSwgMHgxQTVDLAotICAgIDB4OEM4QSwgMHgxQTVFLCAweDhDOEMsIDB4MEU3NCwgMHg4QzhELCAweDFBNUYsIDB4OEM4RSwgMHgxQTYwLAotICAgIDB4OEM5MiwgMHg0OTE2LCAweDhDOTMsIDB4NDkxNSwgMHg4Qzk0LCAweDFBNjEsIDB4OEM5OCwgMHgxQTYzLAotICAgIDB4OEM5OSwgMHg0OTE3LCAweDhDOUIsIDB4NDkxOSwgMHg4QzlELCAweDA1OEIsIDB4OEM5RSwgMHgwQzAzLAotICAgIDB4OEM5RiwgMHgzNTRDLCAweDhDQTAsIDB4MEREQiwgMHg4Q0ExLCAweDA4NTIsIDB4OENBMiwgMHgwN0U5LAotICAgIDB4OENBNCwgMHgzQjMxLCAweDhDQTcsIDB4MERDMSwgMHg4Q0E4LCAweDA1NUYsIDB4OENBOSwgMHgwRDYyLAotICAgIDB4OENBQSwgMHgxQTY2LCAweDhDQUIsIDB4MDYwRiwgMHg4Q0FDLCAweDBBNzksIDB4OENBRCwgMHgxQTY1LAotICAgIDB4OENBRSwgMHgxQTZBLCAweDhDQUYsIDB4MEJCNywgMHg4Q0IwLCAweDBFRUYsIDB4OENCMiwgMHgxQTY4LAotICAgIDB4OENCMywgMHgxQTY5LCAweDhDQjQsIDB4MDY0OCwgMHg4Q0I2LCAweDFBNkIsIDB4OENCNywgMHgwRDE5LAotICAgIDB4OENCOCwgMHgwQjNGLCAweDhDQkEsIDB4NEQ3MywgMHg4Q0JCLCAweDBEODUsIDB4OENCQywgMHgwQzM3LAotICAgIDB4OENCRCwgMHgxQTY3LCAweDhDQkYsIDB4MEU3NSwgMHg4Q0MwLCAweDA1NkMsIDB4OENDMSwgMHgxQTZELAotICAgIDB4OENDMiwgMHgwRkNFLCAweDhDQzMsIDB4MEJERSwgMHg4Q0M0LCAweDBGRUIsIDB4OENDNSwgMHg0RDc0LAotICAgIDB4OENDNywgMHgwOEJGLCAweDhDQzgsIDB4MUE2QywgMHg4Q0M5LCAweDRENzUsIDB4OENDQSwgMHgwQjExLAotICAgIDB4OENDRCwgMHgxQTdELCAweDhDQ0UsIDB4MEFBQSwgMHg4Q0QxLCAweDBDRDAsIDB4OENEMiwgMHg0RDc2LAotICAgIDB4OENEMywgMHgwREMyLCAweDhDRDUsIDB4NDkxQiwgMHg4Q0Q2LCAweDQ5MUEsIDB4OENEOSwgMHgzQjMyLAotICAgIDB4OENEQSwgMHgxQTcwLCAweDhDREIsIDB4MDg4RCwgMHg4Q0RDLCAweDA4QzAsIDB4OENERSwgMHgwOUM2LAotICAgIDB4OENFMCwgMHgwRDFCLCAweDhDRTEsIDB4M0IzMywgMHg4Q0UyLCAweDA3NjEsIDB4OENFMywgMHgxQTZGLAotICAgIDB4OENFNCwgMHgxQTZFLCAweDhDRTYsIDB4MEREQywgMHg4Q0VBLCAweDA4RUQsIDB4OENFQywgMHg0RDc3LAotICAgIDB4OENFRCwgMHgwQzRDLCAweDhDRjAsIDB4MjFCMiwgMHg4Q0YxLCAweDQ5MUQsIDB4OENGNCwgMHgyMUIzLAotICAgIDB4OENGNSwgMHg0RDc4LCAweDhDRjcsIDB4NEQ3OSwgMHg4Q0Y4LCAweDNCMzQsIDB4OENGQSwgMHgxQTcyLAotICAgIDB4OENGQiwgMHgxQTczLCAweDhDRkMsIDB4MDdFQSwgMHg4Q0ZELCAweDFBNzEsIDB4OENGRSwgMHgzQjM1LAotICAgIDB4OEQwMSwgMHg0RDdBLCAweDhEMDMsIDB4NEQ3QiwgMHg4RDA0LCAweDFBNzQsIDB4OEQwNSwgMHgxQTc1LAotICAgIDB4OEQwNywgMHgxQTc3LCAweDhEMDgsIDB4MEIwMywgMHg4RDA5LCAweDQ5MUYsIDB4OEQwQSwgMHgxQTc2LAotICAgIDB4OEQwQiwgMHgwNjIyLCAweDhEMEQsIDB4MUE3OSwgMHg4RDBFLCAweDQ5MjAsIDB4OEQwRiwgMHgxQTc4LAotICAgIDB4OEQxMCwgMHgxQTdBLCAweDhEMTIsIDB4MjFCNCwgMHg4RDEzLCAweDFBN0MsIDB4OEQxNCwgMHgxQTdFLAotICAgIDB4OEQxNiwgMHgxQTdGLCAweDhEMTcsIDB4NEQ3QywgMHg4RDFCLCAweDNCMzYsIDB4OEQxQywgMHg0RDdELAotICAgIDB4OEQ2NCwgMHgwQTdBLCAweDhENjYsIDB4MDhGQiwgMHg4RDY3LCAweDFBODAsIDB4OEQ2OSwgMHgzQjM3LAotICAgIDB4OEQ2QiwgMHgwNUIwLCAweDhENkMsIDB4M0IzOCwgMHg4RDZELCAweDFBODEsIDB4OEQ2RSwgMHg0RDdFLAotICAgIDB4OEQ3MCwgMHgwQUY4LCAweDhENzEsIDB4MUE4MiwgMHg4RDczLCAweDFBODMsIDB4OEQ3NCwgMHgwRERELAotICAgIDB4OEQ3NiwgMHgyMUI1LCAweDhENzcsIDB4MDY0OSwgMHg4RDgxLCAweDFBODQsIDB4OEQ4NCwgMHgzQjM5LAotICAgIDB4OEQ4NSwgMHgwQkQyLCAweDhEOEEsIDB4MDRGRCwgMHg4RDhELCAweDNCM0EsIDB4OEQ5MSwgMHg0RDdGLAotICAgIDB4OEQ5NSwgMHgzQjNCLCAweDhEOTksIDB4MUE4NSwgMHg4RDlGLCAweDREODAsIDB4OERBMywgMHgwOTFELAotICAgIDB4OERBNiwgMHgzQjNDLCAweDhEQTgsIDB4MEEzQywgMHg4REFCLCAweDREODEsIDB4OERBRiwgMHg0MkVFLAotICAgIDB4OERCMiwgMHg0RDgyLCAweDhEQjMsIDB4MEIwRCwgMHg4REJBLCAweDFBODgsIDB4OERCRSwgMHgxQTg3LAotICAgIDB4OERDMiwgMHgxQTg2LCAweDhEQzYsIDB4M0IzRCwgMHg4REM4LCAweDQ5MjEsIDB4OERDQiwgMHgxQThFLAotICAgIDB4OERDQywgMHgxQThDLCAweDhEQ0UsIDB4M0IzRSwgMHg4RENGLCAweDFBODksIDB4OEREMSwgMHg0MkVGLAotICAgIDB4OERENSwgMHg0RDgzLCAweDhERDYsIDB4MUE4QiwgMHg4REQ3LCAweDQyRjAsIDB4OEREOSwgMHg0OTIyLAotICAgIDB4OEREQSwgMHgxQThBLCAweDhEREIsIDB4MUE4RCwgMHg4RERELCAweDA2OTEsIDB4OERERiwgMHgxQTkxLAotICAgIDB4OERFMSwgMHgwQTdCLCAweDhERTMsIDB4MUE5MiwgMHg4REU0LCAweDNCM0YsIDB4OERFNywgMHg0RDg0LAotICAgIDB4OERFOCwgMHgwNzhELCAweDhERUEsIDB4MUE4RiwgMHg4REVCLCAweDFBOTAsIDB4OERFQywgMHgzQjQwLAotICAgIDB4OERFRiwgMHgwRkNGLCAweDhERjEsIDB4NEQ4NSwgMHg4REYyLCAweDREODYsIDB4OERGMywgMHgwQkQzLAotICAgIDB4OERGNCwgMHg0RDg3LCAweDhERjUsIDB4MEFBQiwgMHg4REZDLCAweDFBOTMsIDB4OERGRCwgMHg0OTI1LAotICAgIDB4OERGRiwgMHgxQTk2LCAweDhFMDEsIDB4NEQ4OCwgMHg4RTA2LCAweDQ5MjYsIDB4OEUwOCwgMHgxQTk0LAotICAgIDB4OEUwOSwgMHgxQTk1LCAweDhFMEEsIDB4MEY0MywgMHg4RTBCLCAweDREODksIDB4OEUwQywgMHg0OTIzLAotICAgIDB4OEUwRiwgMHgwQzdGLCAweDhFMTAsIDB4MUE5OSwgMHg4RTE0LCAweDQ5MjgsIDB4OEUxNiwgMHg0OTI5LAotICAgIDB4OEUxRCwgMHgxQTk3LCAweDhFMUUsIDB4MUE5OCwgMHg4RTFGLCAweDFBOUEsIDB4OEUyMCwgMHgzQjQxLAotICAgIDB4OEUyMSwgMHg0OTJBLCAweDhFMjIsIDB4NDkyQiwgMHg4RTIzLCAweDQyRjEsIDB4OEUyNiwgMHg0RDhBLAotICAgIDB4OEUyNywgMHg0OTJDLCAweDhFMkEsIDB4MUFBOCwgMHg4RTMwLCAweDFBOUQsIDB4OEUzMSwgMHg0RDhCLAotICAgIDB4OEUzNCwgMHgxQTlFLCAweDhFMzUsIDB4MUE5QywgMHg4RTM2LCAweDQ5MkYsIDB4OEUzOSwgMHg0OTMwLAotICAgIDB4OEUzRCwgMHg0MkYyLCAweDhFNDAsIDB4NEQ4QywgMHg4RTQxLCAweDREOEQsIDB4OEU0MiwgMHgxQTlCLAotICAgIDB4OEU0NCwgMHgwQzE5LCAweDhFNDcsIDB4MUFBMCwgMHg4RTQ4LCAweDFBQTQsIDB4OEU0OSwgMHgxQUExLAotICAgIDB4OEU0QSwgMHgxQTlGLCAweDhFNEIsIDB4M0I0MiwgMHg4RTRDLCAweDFBQTIsIDB4OEU0RCwgMHg0RDhFLAotICAgIDB4OEU0RiwgMHg0RDhGLCAweDhFNTAsIDB4MUFBMywgMHg4RTU0LCAweDQ5MzEsIDB4OEU1NSwgMHgxQUFBLAotICAgIDB4OEU1OSwgMHgxQUE1LCAweDhFNUMsIDB4NEQ5MCwgMHg4RTVGLCAweDBBN0MsIDB4OEU2MCwgMHgxQUE3LAotICAgIDB4OEU2MSwgMHg0RDkxLCAweDhFNjIsIDB4NDkzMiwgMHg4RTYzLCAweDFBQTksIDB4OEU2NCwgMHgxQUE2LAotICAgIDB4OEU2OSwgMHg0RDkyLCAweDhFNkMsIDB4M0I0MywgMHg4RTZELCAweDQ5MzMsIDB4OEU2RiwgMHg0OTM0LAotICAgIDB4OEU3MCwgMHgzQjQ0LCAweDhFNzEsIDB4NEQ5MywgMHg4RTcyLCAweDFBQUMsIDB4OEU3NCwgMHgwOTNELAotICAgIDB4OEU3NSwgMHg0RDk0LCAweDhFNzYsIDB4MUFBQiwgMHg4RTc3LCAweDREOTUsIDB4OEU3QSwgMHgzQjQ1LAotICAgIDB4OEU3QiwgMHg0MkYzLCAweDhFN0MsIDB4MUFBRCwgMHg4RTgxLCAweDFBQUUsIDB4OEU4NCwgMHgxQUIxLAotICAgIDB4OEU4NSwgMHgxQUIwLCAweDhFODcsIDB4MUFBRiwgMHg4RTg5LCAweDREOTYsIDB4OEU4QSwgMHgxQUIzLAotICAgIDB4OEU4QiwgMHgxQUIyLCAweDhFOEQsIDB4MEYwMiwgMHg4RTkwLCAweDREOTcsIDB4OEU5MSwgMHgxQUI1LAotICAgIDB4OEU5MiwgMHgzQjQ2LCAweDhFOTMsIDB4MUFCNCwgMHg4RTk0LCAweDFBQjYsIDB4OEU5NSwgMHg0RDk4LAotICAgIDB4OEU5OCwgMHg0OTM1LCAweDhFOTksIDB4MUFCNywgMHg4RTlBLCAweDREOTksIDB4OEU5RSwgMHg0OTM2LAotICAgIDB4OEVBMSwgMHgxQUI5LCAweDhFQTcsIDB4NEQ5QSwgMHg4RUE5LCAweDREOUIsIDB4OEVBQSwgMHgxQUI4LAotICAgIDB4OEVBQiwgMHgwQTBFLCAweDhFQUMsIDB4MUFCQSwgMHg4RUFELCAweDREOUMsIDB4OEVBRSwgMHgzQjQ3LAotICAgIDB4OEVBRiwgMHgwNkU1LCAweDhFQjAsIDB4MUFCQiwgMHg4RUIxLCAweDFBQkQsIDB4OEVCMywgMHgzQjQ4LAotICAgIDB4OEVCNSwgMHg0OTM3LCAweDhFQjYsIDB4MzcwMywgMHg4RUJCLCAweDQ5MzgsIDB4OEVCRSwgMHgxQUJFLAotICAgIDB4OEVDMCwgMHgxREVGLCAweDhFQzUsIDB4MUFCRiwgMHg4RUM2LCAweDFBQkMsIDB4OEVDOCwgMHgxQUMwLAotICAgIDB4OEVDQSwgMHgwOTAyLCAweDhFQ0IsIDB4MUFDMSwgMHg4RUNDLCAweDA2NEEsIDB4OEVDRCwgMHgwNzA5LAotICAgIDB4OEVDRiwgMHgyMUI3LCAweDhFRDEsIDB4M0I0OSwgMHg4RUQyLCAweDA3NjIsIDB4OEVENCwgMHgzQjRBLAotICAgIDB4OEVEQiwgMHgxQUMyLCAweDhFREYsIDB4MENDOCwgMHg4RUUyLCAweDBDMzgsIDB4OEVFMywgMHgxQUMzLAotICAgIDB4OEVFOCwgMHg0RDlELCAweDhFRUIsIDB4MUFDNiwgMHg4RUYwLCAweDREOUUsIDB4OEVGOCwgMHgwOEUwLAotICAgIDB4OEVGOSwgMHgzQjRCLCAweDhFRkEsIDB4NDJGNiwgMHg4RUZCLCAweDFBQzUsIDB4OEVGQywgMHgxQUM0LAotICAgIDB4OEVGRCwgMHgwNzMwLCAweDhFRkUsIDB4MUFDNywgMHg4RjAwLCAweDQ5M0MsIDB4OEYwMywgMHgwNUIxLAotICAgIDB4OEYwNSwgMHgxQUM5LCAweDhGMDcsIDB4NEQ5RiwgMHg4RjA4LCAweDQ5M0QsIDB4OEYwOSwgMHgwODRDLAotICAgIDB4OEYwQSwgMHgxQUM4LCAweDhGMEMsIDB4MUFEMSwgMHg4RjEyLCAweDFBQ0IsIDB4OEYxMywgMHgxQUNELAotICAgIDB4OEYxNCwgMHgwRTM1LCAweDhGMTUsIDB4MUFDQSwgMHg4RjE3LCAweDNCNEMsIDB4OEYxOCwgMHg0REEwLAotICAgIDB4OEYxOSwgMHgxQUNDLCAweDhGMUIsIDB4MUFEMCwgMHg4RjFDLCAweDFBQ0UsIDB4OEYxRCwgMHgwNjRCLAotICAgIDB4OEYxRSwgMHg0MkY3LCAweDhGMUYsIDB4MUFDRiwgMHg4RjI1LCAweDREQTEsIDB4OEYyNiwgMHgxQUQyLAotICAgIDB4OEYyNywgMHg0REEyLCAweDhGMjksIDB4MEQxMCwgMHg4RjJBLCAweDBGQTAsIDB4OEYyQiwgMHg0OTNFLAotICAgIDB4OEYyQywgMHg0REEzLCAweDhGMkQsIDB4NDJGOCwgMHg4RjJGLCAweDA5M0UsIDB4OEYzMywgMHgxQUQzLAotICAgIDB4OEYzNSwgMHg0REE0LCAweDhGMzYsIDB4M0I0RCwgMHg4RjM4LCAweDBGMEMsIDB4OEYzOSwgMHgxQUQ1LAotICAgIDB4OEYzQSwgMHg0REE1LCAweDhGM0IsIDB4MUFENCwgMHg4RjNFLCAweDFBRDgsIDB4OEYzRiwgMHgwRjJCLAotICAgIDB4OEY0MCwgMHg0OTNGLCAweDhGNDIsIDB4MUFENywgMHg4RjQzLCAweDREQTYsIDB4OEY0NCwgMHgwNUNCLAotICAgIDB4OEY0NSwgMHgxQUQ2LCAweDhGNDYsIDB4MUFEQiwgMHg4RjQ3LCAweDREQTcsIDB4OEY0OSwgMHgxQURBLAotICAgIDB4OEY0QSwgMHg0OTQwLCAweDhGNEMsIDB4MUFEOSwgMHg4RjRELCAweDBDMkMsIDB4OEY0RSwgMHgxQURDLAotICAgIDB4OEY1MSwgMHg0REE4LCAweDhGNTQsIDB4NDJGOSwgMHg4RjU1LCAweDREQTksIDB4OEY1NywgMHgxQURELAotICAgIDB4OEY1OCwgMHg0OTQxLCAweDhGNUMsIDB4MUFERSwgMHg4RjVGLCAweDA3RkUsIDB4OEY2MSwgMHgwNkZCLAotICAgIDB4OEY2MiwgMHgxQURGLCAweDhGNjMsIDB4MUFFMCwgMHg4RjY0LCAweDFBRTEsIDB4OEY5QiwgMHgwQTBGLAotICAgIDB4OEY5QywgMHgxQUUyLCAweDhGOUUsIDB4MDhEOSwgMHg4RjlGLCAweDFBRTMsIDB4OEZBMCwgMHg0REFBLAotICAgIDB4OEZBMSwgMHg0REFCLCAweDhGQTIsIDB4NERBQywgMHg4RkEzLCAweDFBRTQsIDB4OEZBNCwgMHg0OTQzLAotICAgIDB4OEZBNSwgMHg0REFELCAweDhGQTYsIDB4M0I0RSwgMHg4RkE3LCAweDEwQjYsIDB4OEZBOCwgMHgxMEI1LAotICAgIDB4OEZBRCwgMHgxQUU1LCAweDhGQUUsIDB4MTdGRiwgMHg4RkFGLCAweDFBRTYsIDB4OEZCMCwgMHgwQjYyLAotICAgIDB4OEZCMSwgMHgwOUYxLCAweDhGQjIsIDB4MENGNiwgMHg4RkI0LCAweDQ5NDQsIDB4OEZCNSwgMHgzQjRGLAotICAgIDB4OEZCNiwgMHgzQjUwLCAweDhGQjcsIDB4MUFFNywgMHg4RkJBLCAweDBFMjUsIDB4OEZCQiwgMHgwQkYwLAotICAgIDB4OEZCQywgMHgwODEwLCAweDhGQkYsIDB4MEI2NywgMHg4RkMxLCAweDQ5NDYsIDB4OEZDMiwgMHgwNENDLAotICAgIDB4OEZDNCwgMHgwRUE2LCAweDhGQzUsIDB4MEExRCwgMHg4RkM2LCAweDQ5NDcsIDB4OEZDOCwgMHgzNzk5LAotICAgIDB4OEZDQSwgMHg0OTQ5LCAweDhGQ0QsIDB4NDk0QSwgMHg4RkNFLCAweDA3MzQsIDB4OEZEMSwgMHgwNkQ5LAotICAgIDB4OEZEMywgMHg0OTRCLCAweDhGRDQsIDB4MEUyNiwgMHg4RkQ1LCAweDQ5NEMsIDB4OEZEQSwgMHgxQUU4LAotICAgIDB4OEZFMCwgMHgzQjUyLCAweDhGRTIsIDB4MUFFQSwgMHg4RkU0LCAweDNCNTMsIDB4OEZFNSwgMHgxQUU5LAotICAgIDB4OEZFNiwgMHgwNTYwLCAweDhGRTgsIDB4NDJGQiwgMHg4RkU5LCAweDBDQ0UsIDB4OEZFQSwgMHgxQUVCLAotICAgIDB4OEZFQiwgMHgwRDJELCAweDhGRUQsIDB4MEMyRCwgMHg4RkVFLCAweDQyRkMsIDB4OEZFRiwgMHgxQUVDLAotICAgIDB4OEZGMCwgMHgwOTVDLCAweDhGRjEsIDB4NDk0RCwgMHg4RkY0LCAweDFBRUUsIDB4OEZGNSwgMHg0OTRFLAotICAgIDB4OEZGNiwgMHgzQjU0LCAweDhGRjcsIDB4MEVDRSwgMHg4RkY4LCAweDFBRkQsIDB4OEZGOSwgMHgxQUYwLAotICAgIDB4OEZGQSwgMHgxQUYxLCAweDhGRkIsIDB4NDk0RiwgMHg4RkZELCAweDBCRTUsIDB4OTAwMCwgMHgwQjQwLAotICAgIDB4OTAwMSwgMHgwQUY5LCAweDkwMDIsIDB4M0I1NSwgMHg5MDAzLCAweDBDODAsIDB4OTAwNCwgMHg0REFFLAotICAgIDB4OTAwNSwgMHgxQUVGLCAweDkwMDYsIDB4MDY2RiwgMHg5MDA4LCAweDQyRkQsIDB4OTAwQiwgMHgxQUY4LAotICAgIDB4OTAwQywgMHg0OTUwLCAweDkwMEQsIDB4MUFGNSwgMHg5MDBFLCAweDFCMDIsIDB4OTAwRiwgMHgwQzgxLAotICAgIDB4OTAxMCwgMHgwQjlFLCAweDkwMTEsIDB4MUFGMiwgMHg5MDEzLCAweDBDMUEsIDB4OTAxNCwgMHgwQzRELAotICAgIDB4OTAxNSwgMHgxQUYzLCAweDkwMTYsIDB4MUFGNywgMHg5MDE3LCAweDBBMjYsIDB4OTAxOSwgMHgwRDFELAotICAgIDB4OTAxQSwgMHgwQkU4LCAweDkwMUIsIDB4NERBRiwgMHg5MDFELCAweDBBNjYsIDB4OTAxRSwgMHgxQUY2LAotICAgIDB4OTAxRiwgMHgwQjBFLCAweDkwMjAsIDB4MEIwNCwgMHg5MDIxLCAweDFBRjQsIDB4OTAyMiwgMHgwNDZELAotICAgIDB4OTAyMywgMHgwRkM4LCAweDkwMjcsIDB4MUFGOSwgMHg5MDJDLCAweDNCNTYsIDB4OTAyRCwgMHg0MkZFLAotICAgIDB4OTAyRSwgMHgwQjQxLCAweDkwMkYsIDB4NERCMCwgMHg5MDMxLCAweDA5M0YsIDB4OTAzMiwgMHgwQTEwLAotICAgIDB4OTAzNSwgMHgxQUZCLCAweDkwMzYsIDB4MUFGQSwgMHg5MDM3LCAweDQ5NTEsIDB4OTAzOCwgMHgwNEIzLAotICAgIDB4OTAzOSwgMHgxQUZDLCAweDkwM0MsIDB4MERBMSwgMHg5MDNFLCAweDFCMDQsIDB4OTA0MSwgMHgwQ0IzLAotICAgIDB4OTA0MiwgMHgwQTMxLCAweDkwNDMsIDB4NDk1MywgMHg5MDQ0LCAweDNCNTcsIDB4OTA0NSwgMHgwQjk3LAotICAgIDB4OTA0NywgMHgwNkYwLCAweDkwNDksIDB4MUIwMywgMHg5MDRBLCAweDBGMjEsIDB4OTA0QiwgMHgwNEUxLAotICAgIDB4OTA0QywgMHg0REIxLCAweDkwNEQsIDB4MEUyNywgMHg5MDRFLCAweDA1NjEsIDB4OTA0RiwgMHgxQUZFLAotICAgIDB4OTA1MCwgMHgxQUZGLCAweDkwNTEsIDB4MUIwMCwgMHg5MDUyLCAweDFCMDEsIDB4OTA1MywgMHgwQzkzLAotICAgIDB4OTA1NCwgMHgwQjYxLCAweDkwNTUsIDB4MDRBNywgMHg5MDU2LCAweDFCMDUsIDB4OTA1OCwgMHgxQjA2LAotICAgIDB4OTA1OSwgMHgxRDM0LCAweDkwNUIsIDB4NERCMiwgMHg5MDVDLCAweDBCMUQsIDB4OTA1RCwgMHg0OTU0LAotICAgIDB4OTA1RSwgMHgxQjA3LCAweDkwNjAsIDB4MDUxNSwgMHg5MDYxLCAweDBBQ0UsIDB4OTA2MywgMHgwNzYzLAotICAgIDB4OTA2NSwgMHgwRjQ0LCAweDkwNjcsIDB4MjFCQSwgMHg5MDY4LCAweDFCMDgsIDB4OTA2OSwgMHgwQzI2LAotICAgIDB4OTA2RCwgMHgwQUZBLCAweDkwNkUsIDB4MDkwMywgMHg5MDZGLCAweDFCMDksIDB4OTA3MCwgMHg0REIzLAotICAgIDB4OTA3MiwgMHgxQjBDLCAweDkwNzQsIDB4NERCNCwgMHg5MDc1LCAweDA5NkYsIDB4OTA3NiwgMHgxQjBBLAotICAgIDB4OTA3NywgMHgwQUFELCAweDkwNzgsIDB4MEFBQywgMHg5MDc5LCAweDREQjUsIDB4OTA3QSwgMHgwNEE4LAotICAgIDB4OTA3QywgMHgwRjkzLCAweDkwN0QsIDB4MUIwRSwgMHg5MDdGLCAweDBEODYsIDB4OTA4MCwgMHgxQjEwLAotICAgIDB4OTA4MSwgMHgxQjBGLCAweDkwODIsIDB4MUIwRCwgMHg5MDgzLCAweDE3MzcsIDB4OTA4NCwgMHgwNjEwLAotICAgIDB4OTA4NSwgMHg0OTU3LCAweDkwODcsIDB4MUFFRCwgMHg5MDg4LCAweDNCNTgsIDB4OTA4OSwgMHgxQjEyLAotICAgIDB4OTA4QSwgMHgxQjExLCAweDkwOEIsIDB4NERCNiwgMHg5MDhDLCAweDQ5NTgsIDB4OTA4RiwgMHgxQjEzLAotICAgIDB4OTA5MCwgMHg0OTU5LCAweDkwOTEsIDB4MEYyMiwgMHg5MDk1LCAweDNCNTksIDB4OTA5NywgMHg0MkZGLAotICAgIDB4OTA5OCwgMHg0REI3LCAweDkwOTksIDB4M0I1QSwgMHg5MDlCLCAweDNCNUIsIDB4OTBBMCwgMHg0REI4LAotICAgIDB4OTBBMSwgMHg0OTVBLCAweDkwQTIsIDB4M0I1QywgMHg5MEEzLCAweDBDQjksIDB4OTBBNiwgMHgwRTVDLAotICAgIDB4OTBBOCwgMHgxQjE0LCAweDkwQUEsIDB4MDkwNSwgMHg5MEFGLCAweDFCMTUsIDB4OTBCMCwgMHg0OTVDLAotICAgIDB4OTBCMSwgMHgxQjE2LCAweDkwQjIsIDB4NERCOSwgMHg5MEIzLCAweDQzMDAsIDB4OTBCNCwgMHgzQjVELAotICAgIDB4OTBCNSwgMHgxQjE3LCAweDkwQjYsIDB4NDk1RCwgMHg5MEI4LCAweDBDMUIsIDB4OTBCRCwgMHg0REJBLAotICAgIDB4OTBCRSwgMHg0MzAxLCAweDkwQzEsIDB4MDRBRSwgMHg5MEMzLCAweDQ5NUUsIDB4OTBDNCwgMHg0MzAyLAotICAgIDB4OTBDNSwgMHg0MzAzLCAweDkwQzcsIDB4NDMwNCwgMHg5MEM4LCAweDQ5NUYsIDB4OTBDOSwgMHg0REJCLAotICAgIDB4OTBDQSwgMHgwN0VCLCAweDkwQ0UsIDB4MEZFMCwgMHg5MEQ3LCAweDNCNUUsIDB4OTBEQiwgMHgxQjFCLAotICAgIDB4OTBEQywgMHg0OTYxLCAweDkwREQsIDB4M0I1RiwgMHg5MERFLCAweDIxQkIsIDB4OTBERiwgMHg0OTYyLAotICAgIDB4OTBFMSwgMHgwNzBBLCAweDkwRTIsIDB4MUIxOCwgMHg5MEU0LCAweDFCMTksIDB4OTBFOCwgMHgwREU2LAotICAgIDB4OTBFQiwgMHg0OTY3LCAweDkwRUQsIDB4MDVCMiwgMHg5MEVGLCAweDQzMDUsIDB4OTBGMCwgMHg0REJDLAotICAgIDB4OTBGMiwgMHg0OTY1LCAweDkwRjQsIDB4M0I2MCwgMHg5MEY1LCAweDBGMjMsIDB4OTBGNiwgMHg0OTY0LAotICAgIDB4OTBGNywgMHgwNkI3LCAweDkwRkQsIDB4MEM0RSwgMHg5MEZFLCAweDQ5NjgsIDB4OTBGRiwgMHg0OTY5LAotICAgIDB4OTEwMCwgMHg0OTY2LCAweDkxMDIsIDB4MUIxQywgMHg5MTA0LCAweDQ5NkEsIDB4OTEwNSwgMHg0REJELAotICAgIDB4OTEwNiwgMHg0OTZCLCAweDkxMTIsIDB4MUIxRCwgMHg5MTE0LCAweDQzMDYsIDB4OTExNSwgMHgyMUJELAotICAgIDB4OTExNiwgMHg0MzA3LCAweDkxMTcsIDB4M0I2MSwgMHg5MTE4LCAweDQ5NkMsIDB4OTExOSwgMHgxQjFFLAotICAgIDB4OTExQywgMHgzQjYyLCAweDkxMUUsIDB4NDk2RCwgMHg5MTIyLCAweDQzMDgsIDB4OTEyMywgMHg0MzA5LAotICAgIDB4OTEyNSwgMHg0REJFLCAweDkxMjcsIDB4MjFCRSwgMHg5MTJELCAweDBDMUMsIDB4OTEyRiwgMHg0MzBBLAotICAgIDB4OTEzMCwgMHgxQjIwLCAweDkxMzEsIDB4M0I2MywgMHg5MTMyLCAweDFCMUYsIDB4OTEzNCwgMHg0MzBCLAotICAgIDB4OTEzNywgMHg0OTZFLCAweDkxMzksIDB4NDk2RiwgMHg5MTNBLCAweDNCNjQsIDB4OTEzRCwgMHgzQjY1LAotICAgIDB4OTE0NiwgMHg0OTcwLCAweDkxNDcsIDB4NDk3MSwgMHg5MTQ4LCAweDNCNjYsIDB4OTE0OSwgMHgwQ0FCLAotICAgIDB4OTE0QSwgMHgxQjIxLCAweDkxNEIsIDB4MDk0MCwgMHg5MTRDLCAweDA5MEMsIDB4OTE0RCwgMHgwRDExLAotICAgIDB4OTE0RSwgMHgwQkFGLCAweDkxNTIsIDB4MDkxRSwgMHg5MTU0LCAweDBBMzIsIDB4OTE1NiwgMHgxQjIyLAotICAgIDB4OTE1NywgMHg0OTcyLCAweDkxNTgsIDB4MUIyMywgMHg5MTU5LCAweDQ5NzMsIDB4OTE1QSwgMHg0REJGLAotICAgIDB4OTE1QiwgMHgzQjY3LCAweDkxNjEsIDB4M0I2OCwgMHg5MTYyLCAweDBBMjMsIDB4OTE2MywgMHgxQjI0LAotICAgIDB4OTE2NCwgMHgzQjY5LCAweDkxNjUsIDB4MUIyNSwgMHg5MTY3LCAweDREQzAsIDB4OTE2OSwgMHgxQjI2LAotICAgIDB4OTE2QSwgMHgwRjU5LCAweDkxNkMsIDB4MDk0MSwgMHg5MTcyLCAweDFCMjgsIDB4OTE3MywgMHgxQjI3LAotICAgIDB4OTE3NCwgMHg0OTc0LCAweDkxNzUsIDB4MDdFQywgMHg5MTc3LCAweDA4MDUsIDB4OTE3OCwgMHgwODhFLAotICAgIDB4OTE3OSwgMHg0OTc1LCAweDkxN0EsIDB4NERDMSwgMHg5MTgyLCAweDFCMkIsIDB4OTE4MywgMHg0MzBDLAotICAgIDB4OTE4NSwgMHg0OTc2LCAweDkxODcsIDB4MDk3MCwgMHg5MTg5LCAweDFCMkEsIDB4OTE4QSwgMHg0REMyLAotICAgIDB4OTE4QiwgMHgxQjI5LCAweDkxOEQsIDB4MEI0OSwgMHg5MThFLCAweDNCNkEsIDB4OTE5MCwgMHgwN0EzLAotICAgIDB4OTE5MSwgMHg0REMzLCAweDkxOTIsIDB4MEE2NywgMHg5MTk1LCAweDREQzQsIDB4OTE5NywgMHgwRDQ0LAotICAgIDB4OTE5QywgMHgwOTQzLCAweDkxOUUsIDB4M0I2QiwgMHg5MUEyLCAweDFCMkMsIDB4OTFBNCwgMHgwOUM3LAotICAgIDB4OTFBOCwgMHgzQjZDLCAweDkxQUEsIDB4MUIyRiwgMHg5MUFCLCAweDFCMkQsIDB4OTFBQywgMHgxRTFCLAotICAgIDB4OTFBRCwgMHgzQjZELCAweDkxQUUsIDB4M0I2RSwgMHg5MUFGLCAweDFCMkUsIDB4OTFCMCwgMHg0REM1LAotICAgIDB4OTFCMSwgMHgxRTYxLCAweDkxQjIsIDB4M0I2RiwgMHg5MUIzLCAweDQ5NzcsIDB4OTFCNCwgMHgxQjMxLAotICAgIDB4OTFCNSwgMHgxQjMwLCAweDkxQjYsIDB4NDk3OCwgMHg5MUI4LCAweDA5RTIsIDB4OTFCQSwgMHgxQjMyLAotICAgIDB4OTFCQiwgMHg0REM2LCAweDkxQkMsIDB4M0I3MCwgMHg5MUJELCAweDREQzcsIDB4OTFDMCwgMHgxQjMzLAotICAgIDB4OTFDMSwgMHgxQjM0LCAweDkxQzIsIDB4NERDOCwgMHg5MUMzLCAweDQ5NzksIDB4OTFDNCwgMHg0OTdBLAotICAgIDB4OTFDNSwgMHg0REM5LCAweDkxQzYsIDB4MEQ2NCwgMHg5MUM3LCAweDA4NDMsIDB4OTFDOCwgMHgwOTBELAotICAgIDB4OTFDOSwgMHgxQjM1LCAweDkxQ0IsIDB4MUIzNiwgMHg5MUNDLCAweDBGNkMsIDB4OTFDRCwgMHgwOTRGLAotICAgIDB4OTFDRSwgMHgwRUZBLCAweDkxQ0YsIDB4MEY5NCwgMHg5MUQwLCAweDFCMzcsIDB4OTFEMSwgMHgwNkRBLAotICAgIDB4OTFENiwgMHgxQjM4LCAweDkxRDcsIDB4MjFDMCwgMHg5MUQ4LCAweDBDMUQsIDB4OTFEQSwgMHgyMUJGLAotICAgIDB4OTFEQiwgMHgxQjNCLCAweDkxREMsIDB4MDVENiwgMHg5MURELCAweDBBMTEsIDB4OTFERSwgMHgyMUMxLAotICAgIDB4OTFERiwgMHgxQjM5LCAweDkxRTEsIDB4MUIzQSwgMHg5MUUzLCAweDBCRkMsIDB4OTFFNCwgMHgyMUM0LAotICAgIDB4OTFFNSwgMHgyMUM1LCAweDkxRTYsIDB4MEU4MywgMHg5MUU3LCAweDA2RjQsIDB4OTFFQywgMHg0OTdELAotICAgIDB4OTFFRCwgMHgyMUMyLCAweDkxRUUsIDB4MjFDMywgMHg5MUYwLCAweDNCNzEsIDB4OTFGMSwgMHg0MzBELAotICAgIDB4OTFGNSwgMHgxQjNELCAweDkxRjYsIDB4MUIzRSwgMHg5MUY3LCAweDNCNzIsIDB4OTFGQiwgMHgzQjczLAotICAgIDB4OTFGQywgMHgxQjNDLCAweDkxRkYsIDB4MUI0MCwgMHg5MjAwLCAweDREQ0EsIDB4OTIwMSwgMHg0OTdFLAotICAgIDB4OTIwNiwgMHgyMUM2LCAweDkyMDcsIDB4M0I3NCwgMHg5MjA5LCAweDREQ0IsIDB4OTIwQSwgMHgyMUM4LAotICAgIDB4OTIwRCwgMHgwQ0I3LCAweDkyMEUsIDB4MDVBMSwgMHg5MjEwLCAweDIxQzcsIDB4OTIxMSwgMHgxQjQ0LAotICAgIDB4OTIxNCwgMHgxQjQxLCAweDkyMTUsIDB4MUI0MywgMHg5MjE2LCAweDQ5N0YsIDB4OTIxNywgMHg0OTgwLAotICAgIDB4OTIxRSwgMHgxQjNGLCAweDkyMjMsIDB4NERDQywgMHg5MjI4LCAweDNCNzUsIDB4OTIyOSwgMHgxQjhBLAotICAgIDB4OTIyQywgMHgxQjQyLCAweDkyMzMsIDB4M0I3NiwgMHg5MjM0LCAweDBGQjMsIDB4OTIzNywgMHgwNzhFLAotICAgIDB4OTIzOCwgMHgzQjc3LCAweDkyMzksIDB4MjFDRiwgMHg5MjNBLCAweDIxQzksIDB4OTIzQywgMHgyMUNCLAotICAgIDB4OTIzRiwgMHgxQjRDLCAweDkyNDAsIDB4MjFDQSwgMHg5MjQyLCAweDQ5ODIsIDB4OTI0MywgMHgzQjc4LAotICAgIDB4OTI0NCwgMHgwQzJFLCAweDkyNDUsIDB4MUI0NywgMHg5MjQ3LCAweDNCNzksIDB4OTI0OCwgMHgxQjRBLAotICAgIDB4OTI0OSwgMHgxQjQ4LCAweDkyNEEsIDB4NDk4MywgMHg5MjRCLCAweDFCNEQsIDB4OTI0RSwgMHgyMUNDLAotICAgIDB4OTI0RiwgMHgzQjdBLCAweDkyNTAsIDB4MUI0RSwgMHg5MjUxLCAweDIxQ0UsIDB4OTI1NiwgMHg0OTg0LAotICAgIDB4OTI1NywgMHgxQjQ2LCAweDkyNTksIDB4MjFDRCwgMHg5MjVBLCAweDFCNTMsIDB4OTI1QiwgMHgwNTE2LAotICAgIDB4OTI1RSwgMHgxQjQ1LCAweDkyNjAsIDB4M0I3QiwgMHg5MjYxLCAweDQ5ODUsIDB4OTI2MiwgMHgwRDQxLAotICAgIDB4OTI2NCwgMHgxQjQ5LCAweDkyNjUsIDB4NDk4NiwgMHg5MjY2LCAweDA5QzgsIDB4OTI2NywgMHgyMUQwLAotICAgIDB4OTI2OCwgMHg0OTg3LCAweDkyNzEsIDB4MDdFRCwgMHg5Mjc2LCAweDREQ0QsIDB4OTI3NywgMHgyMUQyLAotICAgIDB4OTI3OCwgMHgyMUQzLCAweDkyN0MsIDB4NDk4OSwgMHg5MjdELCAweDQ5OEEsIDB4OTI3RSwgMHgwRTc2LAotICAgIDB4OTI3RiwgMHg0OThCLCAweDkyODAsIDB4MDZEQywgMHg5MjgzLCAweDA5NTAsIDB4OTI4NSwgMHgwQzk0LAotICAgIDB4OTI4OCwgMHgyMEFBLCAweDkyODksIDB4NDk4QywgMHg5MjhELCAweDQ5OEQsIDB4OTI4RSwgMHg0RENFLAotICAgIDB4OTI5MSwgMHgwQUFGLCAweDkyOTMsIDB4MUI1MSwgMHg5Mjk1LCAweDFCNEIsIDB4OTI5NiwgMHgxQjUwLAotICAgIDB4OTI5NywgMHg0OThFLCAweDkyOTgsIDB4MEVDRiwgMHg5Mjk5LCAweDQ5OEYsIDB4OTI5QSwgMHgwQkQ0LAotICAgIDB4OTI5QiwgMHgxQjUyLCAweDkyOUMsIDB4MUI0RiwgMHg5MjlGLCAweDQ5OTAsIDB4OTJBNywgMHgyMUQxLAotICAgIDB4OTJBQiwgMHg0OTkxLCAweDkyQUQsIDB4MEFBRSwgMHg5MkFGLCAweDREQ0YsIDB4OTJCMiwgMHg0OTk0LAotICAgIDB4OTJCMywgMHgzNTU0LCAweDkyQjcsIDB4MUI1NiwgMHg5MkI5LCAweDFCNTUsIDB4OTJCQiwgMHg0REQwLAotICAgIDB4OTJCQywgMHg0REQxLCAweDkyQkYsIDB4NDk5NSwgMHg5MkMwLCAweDQ5OTYsIDB4OTJDMSwgMHg0REQyLAotICAgIDB4OTJDMiwgMHgzQjdDLCAweDkyQzMsIDB4NEREMywgMHg5MkM1LCAweDRERDQsIDB4OTJDNiwgMHg0OTk3LAotICAgIDB4OTJDOCwgMHg0REQ1LCAweDkyQ0IsIDB4M0I3RCwgMHg5MkNDLCAweDNCN0UsIDB4OTJDRSwgMHg0OTk4LAotICAgIDB4OTJDRiwgMHgxQjU0LCAweDkyRDAsIDB4MjFENywgMHg5MkQyLCAweDBFNUQsIDB4OTJEMywgMHgyMURCLAotICAgIDB4OTJENSwgMHgyMUQ5LCAweDkyRDcsIDB4MjFENSwgMHg5MkQ5LCAweDIxRDYsIDB4OTJERiwgMHgzQjdGLAotICAgIDB4OTJFMCwgMHgyMURBLCAweDkyRTQsIDB4MDk4NSwgMHg5MkU1LCAweDQ5OTksIDB4OTJFNywgMHgyMUQ0LAotICAgIDB4OTJFOSwgMHgxQjU3LCAweDkyRUEsIDB4MEUyRiwgMHg5MkVELCAweDA0RjYsIDB4OTJGMiwgMHgwREI4LAotICAgIDB4OTJGMywgMHgwQkIwLCAweDkyRjcsIDB4NDk5RCwgMHg5MkY4LCAweDA2OTIsIDB4OTJGOSwgMHgyMEIwLAotICAgIDB4OTJGQSwgMHgxQjU5LCAweDkyRkIsIDB4MjFERSwgMHg5MkZDLCAweDA3RUYsIDB4OTJGRiwgMHgyMUUxLAotICAgIDB4OTMwMiwgMHgyMUUzLCAweDkzMDQsIDB4MzQ1QSwgMHg5MzA2LCAweDA4N0EsIDB4OTMwRCwgMHgzQjgwLAotICAgIDB4OTMwRiwgMHgxQjU4LCAweDkzMTAsIDB4MEEzMywgMHg5MzExLCAweDQ5OUEsIDB4OTMxNCwgMHg0REQ2LAotICAgIDB4OTMxNSwgMHgzQjgxLCAweDkzMTgsIDB4MEEzNCwgMHg5MzE5LCAweDFCNUMsIDB4OTMxQSwgMHgxQjVFLAotICAgIDB4OTMxRCwgMHgyMUUyLCAweDkzMUUsIDB4MjFFMCwgMHg5MzFGLCAweDNCODIsIDB4OTMyMCwgMHgwOUUzLAotICAgIDB4OTMyMSwgMHgyMURELCAweDkzMjIsIDB4MUI1RCwgMHg5MzIzLCAweDFCNUYsIDB4OTMyNSwgMHgyMURDLAotICAgIDB4OTMyNiwgMHgwNkNCLCAweDkzMjcsIDB4M0I4MywgMHg5MzI4LCAweDBEQjcsIDB4OTMyOSwgMHg0OTlFLAotICAgIDB4OTMyQiwgMHgwOTBFLCAweDkzMkMsIDB4MEZDOSwgMHg5MzJFLCAweDFCNUIsIDB4OTMyRiwgMHgwODY4LAotICAgIDB4OTMzMiwgMHgwRkU1LCAweDkzMzMsIDB4NERENywgMHg5MzM1LCAweDFCNjEsIDB4OTMzNiwgMHg0REQ4LAotICAgIDB4OTMzQSwgMHgxQjYwLCAweDkzM0IsIDB4MUI2MiwgMHg5MzQ0LCAweDFCNUEsIDB4OTM0NywgMHgzQjg0LAotICAgIDB4OTM0OCwgMHgyMEE5LCAweDkzNDksIDB4NDMwRSwgMHg5MzRBLCAweDM0NTgsIDB4OTM0QiwgMHgwQ0MxLAotICAgIDB4OTM0RCwgMHgwQzRGLCAweDkzNTEsIDB4NDlBMSwgMHg5MzUyLCAweDNCODUsIDB4OTM1NCwgMHgwQkYzLAotICAgIDB4OTM1NiwgMHgxQjY3LCAweDkzNTcsIDB4MjFFNSwgMHg5MzU4LCAweDRERDksIDB4OTM1QSwgMHg0OUEyLAotICAgIDB4OTM1QiwgMHgwQjgxLCAweDkzNUMsIDB4MUI2MywgMHg5MzYwLCAweDFCNjQsIDB4OTM2NCwgMHg0MzBGLAotICAgIDB4OTM2NSwgMHg0MzEwLCAweDkzNkEsIDB4M0I4NywgMHg5MzZCLCAweDQ5QTMsIDB4OTM2QywgMHgwNzAzLAotICAgIDB4OTM2RCwgMHgzQjg4LCAweDkzNkUsIDB4MUI2NiwgMHg5MzcwLCAweDIxRTQsIDB4OTM3MSwgMHg0OUE0LAotICAgIDB4OTM3MywgMHg0OUE1LCAweDkzNzUsIDB4MDc2NCwgMHg5MzdDLCAweDFCNjUsIDB4OTM3RSwgMHgwOUM5LAotICAgIDB4OTM3RiwgMHg0RERBLCAweDkzODIsIDB4NEREQiwgMHg5Mzg4LCAweDQ5QTksIDB4OTM4QSwgMHg0RERDLAotICAgIDB4OTM4QiwgMHg0OUFBLCAweDkzOEMsIDB4MDVENywgMHg5MzhGLCAweDQ5QUIsIDB4OTM5NCwgMHgxQjZCLAotICAgIDB4OTM5NiwgMHgwODJGLCAweDkzOTcsIDB4MEFGQiwgMHg5MzlBLCAweDBCRTYsIDB4OTM5QiwgMHgzQjg5LAotICAgIDB4OTM5RSwgMHg0OUFDLCAweDkzQTEsIDB4NDlBNiwgMHg5M0EzLCAweDQzMTEsIDB4OTNBNCwgMHgyMUU2LAotICAgIDB4OTNBNywgMHgwNTk5LCAweDkzQTksIDB4M0I4QiwgMHg5M0FDLCAweDFCNjksIDB4OTNBRCwgMHgxQjZBLAotICAgIDB4OTNBRSwgMHgwQkRGLCAweDkzQjAsIDB4MUI2OCwgMHg5M0I5LCAweDFCNkMsIDB4OTNCQSwgMHgzQjhBLAotICAgIDB4OTNCQiwgMHg0RERELCAweDkzQzEsIDB4M0I4QywgMHg5M0MzLCAweDFCNzIsIDB4OTNDNiwgMHgyMUU3LAotICAgIDB4OTNDNywgMHg0OUIxLCAweDkzQzgsIDB4MUI3NSwgMHg5M0NBLCAweDNCOEQsIDB4OTNDQywgMHg0RERFLAotICAgIDB4OTNEMCwgMHgxQjc0LCAweDkzRDEsIDB4MEMyNywgMHg5M0Q2LCAweDFCNkQsIDB4OTNENywgMHgxQjZFLAotICAgIDB4OTNEOCwgMHgxQjcxLCAweDkzREMsIDB4NDlCMiwgMHg5M0RELCAweDFCNzMsIDB4OTNERSwgMHgyMUU4LAotICAgIDB4OTNERiwgMHg0MzEyLCAweDkzRTEsIDB4MDZCOCwgMHg5M0UyLCAweDNCOEUsIDB4OTNFNCwgMHgxQjc2LAotICAgIDB4OTNFNSwgMHgxQjcwLCAweDkzRTYsIDB4NERERiwgMHg5M0U3LCAweDQ5QjMsIDB4OTNFOCwgMHgxQjZGLAotICAgIDB4OTNGMSwgMHg0OUIwLCAweDkzRjUsIDB4NDlBRCwgMHg5M0Y4LCAweDIxRTksIDB4OTNGOSwgMHg0REUwLAotICAgIDB4OTNGQSwgMHgzQjhGLCAweDkzRkIsIDB4NDlCNywgMHg5M0ZELCAweDNCOTAsIDB4OTQwMiwgMHg0REUxLAotICAgIDB4OTQwMywgMHgxQjdBLCAweDk0MDQsIDB4NDMxMywgMHg5NDA3LCAweDFCN0IsIDB4OTQwOSwgMHg0OUI0LAotICAgIDB4OTQwRCwgMHg0REUyLCAweDk0MEUsIDB4NERFMywgMHg5NDBGLCAweDNCOTEsIDB4OTQxMCwgMHgxQjdDLAotICAgIDB4OTQxMywgMHgxQjc5LCAweDk0MTQsIDB4MUI3OCwgMHg5NDE2LCAweDQ5QjUsIDB4OTQxNywgMHg0OUI2LAotICAgIDB4OTQxOCwgMHgwOUNBLCAweDk0MTksIDB4MEM4MiwgMHg5NDFBLCAweDFCNzcsIDB4OTQyMSwgMHgxQjgwLAotICAgIDB4OTQyQiwgMHgxQjdFLCAweDk0MkUsIDB4NERFNCwgMHg5NDMxLCAweDIxRUEsIDB4OTQzMiwgMHg0OUI4LAotICAgIDB4OTQzMywgMHg0MzE0LCAweDk0MzQsIDB4M0I5MiwgMHg5NDM1LCAweDFCN0YsIDB4OTQzNiwgMHgxQjdELAotICAgIDB4OTQzOCwgMHgwQjU4LCAweDk0M0EsIDB4MUI4MSwgMHg5NDNCLCAweDQ5QjksIDB4OTQzRiwgMHgzQjkzLAotICAgIDB4OTQ0MSwgMHgxQjgyLCAweDk0NDQsIDB4MUI4NCwgMHg5NDQ1LCAweDIxRUIsIDB4OTQ0OCwgMHgyMUVDLAotICAgIDB4OTQ0QSwgMHg0MzE1LCAweDk0NEMsIDB4NERFNSwgMHg5NDUxLCAweDA2MTEsIDB4OTQ1MiwgMHgxQjgzLAotICAgIDB4OTQ1MywgMHgwRjA2LCAweDk0NTUsIDB4M0I5NCwgMHg5NDVBLCAweDFCOEYsIDB4OTQ1QiwgMHgxQjg1LAotICAgIDB4OTQ1RSwgMHgxQjg4LCAweDk0NjAsIDB4MUI4NiwgMHg5NDYyLCAweDFCODcsIDB4OTQ2MywgMHg0MzE2LAotICAgIDB4OTQ2QSwgMHgxQjg5LCAweDk0NkIsIDB4M0I5NSwgMHg5NDZELCAweDQ5QkMsIDB4OTQ2RiwgMHg0OUJELAotICAgIDB4OTQ3MCwgMHgxQjhCLCAweDk0NzEsIDB4NDMxNywgMHg5NDcyLCAweDNCOTYsIDB4OTQ3NSwgMHgxQjhDLAotICAgIDB4OTQ3NywgMHgxQjhELCAweDk0N0MsIDB4MUI5MCwgMHg5NDdELCAweDFCOEUsIDB4OTQ3RSwgMHgxQjkxLAotICAgIDB4OTQ3RiwgMHgxQjkzLCAweDk0ODEsIDB4MUI5MiwgMHg5NTc3LCAweDBCRDUsIDB4OTU3OCwgMHgzQjk3LAotICAgIDB4OTU3OSwgMHg0OUJFLCAweDk1ODAsIDB4MEVGMywgMHg5NTgyLCAweDFCOTQsIDB4OTU4MywgMHgwQUIwLAotICAgIDB4OTU4NiwgMHg0OUJGLCAweDk1ODcsIDB4MUI5NSwgMHg5NTg4LCAweDRERTYsIDB4OTU4OSwgMHgwRTE0LAotICAgIDB4OTU4QSwgMHgxQjk2LCAweDk1OEIsIDB4MDU4OSwgMHg5NThDLCAweDQ5QzAsIDB4OTU4RCwgMHg0OUMxLAotICAgIDB4OTU4RSwgMHg0MzE4LCAweDk1OEYsIDB4MDRERSwgMHg5NTkxLCAweDA2MTMsIDB4OTU5MiwgMHgyMUVELAotICAgIDB4OTU5MywgMHgwNjEyLCAweDk1OTQsIDB4MUI5NywgMHg5NTk2LCAweDFCOTgsIDB4OTU5OCwgMHgxQjk5LAotICAgIDB4OTU5OSwgMHgxQjlBLCAweDk1OUYsIDB4NDMxOSwgMHg5NUEwLCAweDFCOUIsIDB4OTVBMSwgMHg0REU3LAotICAgIDB4OTVBMiwgMHgwNjE0LCAweDk1QTMsIDB4MDVCMywgMHg5NUE0LCAweDA3RjAsIDB4OTVBNSwgMHgwRDRBLAotICAgIDB4OTVBNiwgMHgzQjk4LCAweDk1QTcsIDB4MUI5RCwgMHg5NUE4LCAweDFCOUMsIDB4OTVBOSwgMHgzQjk5LAotICAgIDB4OTVBQiwgMHg0RjU5LCAweDk1QUMsIDB4NDMxQSwgMHg5NUFELCAweDFCOUUsIDB4OTVCMSwgMHgzNTU1LAotICAgIDB4OTVCMiwgMHgwNEZFLCAweDk1QjQsIDB4M0I5QiwgMHg5NUI2LCAweDQzMUIsIDB4OTVCOSwgMHgxQkExLAotICAgIDB4OTVCQiwgMHgxQkEwLCAweDk1QkMsIDB4MUI5RiwgMHg5NUJELCAweDNCOUMsIDB4OTVCRSwgMHgxQkEyLAotICAgIDB4OTVCRiwgMHg0REU4LCAweDk1QzMsIDB4MUJBNSwgMHg5NUM2LCAweDRERTksIDB4OTVDNywgMHgwNDhCLAotICAgIDB4OTVDOCwgMHg0OUM0LCAweDk1QzksIDB4NERFQSwgMHg5NUNBLCAweDFCQTMsIDB4OTVDQiwgMHg0MzFDLAotICAgIDB4OTVDQywgMHgxQkE3LCAweDk1Q0QsIDB4MUJBNiwgMHg5NUQwLCAweDQzMUQsIDB4OTVEMSwgMHg0REVCLAotICAgIDB4OTVEMiwgMHg0REVDLCAweDk1RDMsIDB4NDMxRSwgMHg5NUQ0LCAweDFCQTksIDB4OTVENSwgMHgxQkE4LAotICAgIDB4OTVENiwgMHgxQkFBLCAweDk1RDgsIDB4MEM4NiwgMHg5NURBLCAweDNCOUQsIDB4OTVEQywgMHgxQkFCLAotICAgIDB4OTVERSwgMHg0MzIwLCAweDk1RTAsIDB4NERFRCwgMHg5NUUxLCAweDFCQUMsIDB4OTVFMiwgMHgxQkFFLAotICAgIDB4OTVFNCwgMHg0REVFLCAweDk1RTUsIDB4MUJBRCwgMHg5NUU2LCAweDRERUYsIDB4OTYxQywgMHgwRERFLAotICAgIDB4OTYxRCwgMHgzQjlFLCAweDk2MjEsIDB4MUJBRiwgMHg5NjI0LCAweDRERjAsIDB4OTYyOCwgMHgxQkIwLAotICAgIDB4OTYyQSwgMHgwODU1LCAweDk2MkMsIDB4NDlDNywgMHg5NjJFLCAweDFCQjEsIDB4OTYyRiwgMHgxQkIyLAotICAgIDB4OTYzMSwgMHg0REYxLCAweDk2MzIsIDB4MEU3NywgMHg5NjMzLCAweDQ5QzgsIDB4OTYzNCwgMHg0OUM5LAotICAgIDB4OTYzOCwgMHg0REYyLCAweDk2M0IsIDB4MEFDRCwgMHg5NjNDLCAweDQ5Q0IsIDB4OTYzRCwgMHg0REYzLAotICAgIDB4OTYzRiwgMHgwNDY4LCAweDk2NDAsIDB4MEIyQiwgMHg5NjQxLCAweDNCOUYsIDB4OTY0MiwgMHgxQkIzLAotICAgIDB4OTY0NCwgMHgwRERGLCAweDk2NEIsIDB4MUJCNiwgMHg5NjRDLCAweDFCQjQsIDB4OTY0RCwgMHgwN0YxLAotICAgIDB4OTY0RiwgMHgxQkI1LCAweDk2NTAsIDB4MDc3NiwgMHg5NjU0LCAweDRERjQsIDB4OTY1OCwgMHgzQkEwLAotICAgIDB4OTY1QiwgMHgwRTE1LCAweDk2NUMsIDB4MUJCOCwgMHg5NjVELCAweDFCQkEsIDB4OTY1RSwgMHgxQkI5LAotICAgIDB4OTY1RiwgMHgxQkJCLCAweDk2NjEsIDB4NDlDQywgMHg5NjYyLCAweDA0QzMsIDB4OTY2MywgMHgwQTFFLAotICAgIDB4OTY2NCwgMHgwOTg2LCAweDk2NjUsIDB4MDYxNSwgMHg5NjY2LCAweDFCQkMsIDB4OTY2QSwgMHgwRDFDLAotICAgIDB4OTY2QywgMHgxQkJFLCAweDk2NzAsIDB4MDRDNCwgMHg5NjcyLCAweDFCQkQsIDB4OTY3MywgMHgwQkUwLAotICAgIDB4OTY3NCwgMHg0REY1LCAweDk2NzUsIDB4MEY5NSwgMHg5Njc2LCAweDBDODMsIDB4OTY3NywgMHgxQkI3LAotICAgIDB4OTY3OCwgMHgwRjZFLCAweDk2N0EsIDB4MDc2NSwgMHg5NjdCLCAweDRERjYsIDB4OTY3RCwgMHgwRjQ1LAotICAgIDB4OTY3RiwgMHg0REY3LCAweDk2ODEsIDB4NERGOCwgMHg5NjgyLCAweDQ5Q0UsIDB4OTY4MywgMHg0REY5LAotICAgIDB4OTY4NCwgMHgzQkExLCAweDk2ODUsIDB4MDZGMSwgMHg5Njg2LCAweDBGN0MsIDB4OTY4OCwgMHgwNkZFLAotICAgIDB4OTY4OSwgMHg0REZBLCAweDk2OEEsIDB4MEI0MiwgMHg5NjhCLCAweDE4NkMsIDB4OTY4RCwgMHgxQkJGLAotICAgIDB4OTY4RSwgMHgwNThBLCAweDk2OEYsIDB4MEEzNSwgMHg5Njk0LCAweDA1QjQsIDB4OTY5NSwgMHgxQkMxLAotICAgIDB4OTY5NiwgMHg0REZCLCAweDk2OTcsIDB4MUJDMiwgMHg5Njk4LCAweDFCQzAsIDB4OTY5OSwgMHgwNzNBLAotICAgIDB4OTY5QSwgMHg0OUQwLCAweDk2OUIsIDB4MDg0RCwgMHg5NjlDLCAweDA5Q0IsIDB4OTY5RCwgMHgyMUYwLAotICAgIDB4OTZBMCwgMHgwNEM1LCAweDk2QTMsIDB4MEZBMSwgMHg5NkE0LCAweDNCQTIsIDB4OTZBNSwgMHg0MzIxLAotICAgIDB4OTZBNywgMHgxQkM0LCAweDk2QTgsIDB4MUIwQiwgMHg5NkE5LCAweDNCQTMsIDB4OTZBQSwgMHgxQkMzLAotICAgIDB4OTZBRSwgMHg0REZDLCAweDk2QUYsIDB4MjFGMSwgMHg5NkIwLCAweDFCQzcsIDB4OTZCMSwgMHgxQkM1LAotICAgIDB4OTZCMiwgMHgxQkM2LCAweDk2QjMsIDB4NDlEMywgMHg5NkI0LCAweDFCQzgsIDB4OTZCNiwgMHgxQkM5LAotICAgIDB4OTZCNywgMHgwRkI0LCAweDk2QjgsIDB4MUJDQSwgMHg5NkI5LCAweDFCQ0IsIDB4OTZCQSwgMHg0OUQ0LAotICAgIDB4OTZCQiwgMHgwQTZELCAweDk2QkMsIDB4MEQ0RiwgMHg5NkJELCAweDQ5RDUsIDB4OTZDMCwgMHgwQTQzLAotICAgIDB4OTZDMSwgMHgwNjIzLCAweDk2QzQsIDB4MEYyNCwgMHg5NkM1LCAweDA1NkQsIDB4OTZDNiwgMHgwOTQyLAotICAgIDB4OTZDNywgMHgwNzhGLCAweDk2QzksIDB4MUJDRSwgMHg5NkNCLCAweDFCQ0QsIDB4OTZDQywgMHgwOEMxLAotICAgIDB4OTZDRCwgMHgxQkNGLCAweDk2Q0UsIDB4MUJDQywgMHg5NkQxLCAweDA4NzYsIDB4OTZEMiwgMHgzQkE0LAotICAgIDB4OTZENSwgMHgxQkQzLCAweDk2RDYsIDB4MTk5MiwgMHg5NkQ4LCAweDQ5RDgsIDB4OTZEOSwgMHgxMEVCLAotICAgIDB4OTZEQSwgMHg0OUQ5LCAweDk2REIsIDB4MEEzRCwgMHg5NkRDLCAweDFCRDEsIDB4OTZERCwgMHg0OURBLAotICAgIDB4OTZERSwgMHgzQkE2LCAweDk2RTIsIDB4MEY2RCwgMHg5NkUzLCAweDBDQzksIDB4OTZFOCwgMHgwNENELAotICAgIDB4OTZFOSwgMHgzQkE3LCAweDk2RUEsIDB4MEE4NywgMHg5NkVCLCAweDA4RTIsIDB4OTZFRiwgMHg0MzIyLAotICAgIDB4OTZGMCwgMHgwRTA3LCAweDk2RjEsIDB4M0JBOCwgMHg5NkYyLCAweDA0RTIsIDB4OTZGNiwgMHgwRkI1LAotICAgIDB4OTZGNywgMHgwRjU1LCAweDk2RjksIDB4MUJENCwgMHg5NkZCLCAweDBDM0YsIDB4OTcwMCwgMHgwOTI3LAotICAgIDB4OTcwMiwgMHgzQkE5LCAweDk3MDMsIDB4NERGRCwgMHg5NzA0LCAweDFCRDUsIDB4OTcwNiwgMHgxQkQ2LAotICAgIDB4OTcwNywgMHgwQTEyLCAweDk3MDgsIDB4MUJENywgMHg5NzA5LCAweDNCQUEsIDB4OTcwQSwgMHgwRkI2LAotICAgIDB4OTcwRCwgMHgxQkQyLCAweDk3MEUsIDB4MUJEOSwgMHg5NzBGLCAweDFCREIsIDB4OTcxMSwgMHgxQkRBLAotICAgIDB4OTcxMywgMHgxQkQ4LCAweDk3MTQsIDB4NDlEQywgMHg5NzE2LCAweDFCREMsIDB4OTcxOSwgMHgxQkRELAotICAgIDB4OTcxQiwgMHg0REZFLCAweDk3MUMsIDB4MEFGQywgMHg5NzFFLCAweDA1NjIsIDB4OTcyMSwgMHg0REZGLAotICAgIDB4OTcyMiwgMHg0RTAwLCAweDk3MjMsIDB4NDlERCwgMHg5NzI0LCAweDFCREUsIDB4OTcyNywgMHgwRUM0LAotICAgIDB4OTcyOCwgMHg0RTAxLCAweDk3MkEsIDB4MUJERiwgMHg5NzMwLCAweDFCRTAsIDB4OTczMSwgMHg0RTAyLAotICAgIDB4OTczMiwgMHgwRkQwLCAweDk3MzMsIDB4MjFGMiwgMHg5NzM2LCAweDQ5REYsIDB4OTczOCwgMHgxNDE0LAotICAgIDB4OTczOSwgMHgxQkUxLCAweDk3M0IsIDB4MjFGMywgMHg5NzNELCAweDFCRTIsIDB4OTczRSwgMHgxQkUzLAotICAgIDB4OTc0MSwgMHg0OUUwLCAweDk3NDIsIDB4MUJFNywgMHg5NzQzLCAweDIxRjQsIDB4OTc0NCwgMHgxQkU0LAotICAgIDB4OTc0NiwgMHgxQkU1LCAweDk3NDcsIDB4NDlFMSwgMHg5NzQ4LCAweDFCRTYsIDB4OTc0OSwgMHgxQkU4LAotICAgIDB4OTc0RCwgMHgyMUY1LCAweDk3NEUsIDB4NDMyMywgMHg5NzRGLCAweDIxRjYsIDB4OTc1MSwgMHgyMUY3LAotICAgIDB4OTc1MiwgMHgwQTY4LCAweDk3NTUsIDB4NEY1QSwgMHg5NzU2LCAweDBGMDMsIDB4OTc1NywgMHg0OUUyLAotICAgIDB4OTc1OSwgMHgwQTY5LCAweDk3NUEsIDB4M0JBQiwgMHg5NzVCLCAweDQ5RTMsIDB4OTc1QywgMHgxQkU5LAotICAgIDB4OTc1RSwgMHgwRDg3LCAweDk3NjAsIDB4MUJFQSwgMHg5NzYxLCAweDFEMDYsIDB4OTc2MiwgMHgwRUQ4LAotICAgIDB4OTc2MywgMHgzQkFDLCAweDk3NjQsIDB4MUJFQiwgMHg5NzY2LCAweDFCRUMsIDB4OTc2NywgMHg0RTAzLAotICAgIDB4OTc2OCwgMHgxQkVELCAweDk3NjksIDB4MDVCNSwgMHg5NzZBLCAweDQ5RTQsIDB4OTc2QiwgMHgxQkVGLAotICAgIDB4OTc2RCwgMHgwQTFGLCAweDk3NkUsIDB4M0JBRCwgMHg5NzcxLCAweDFCRjAsIDB4OTc3MywgMHgzQkFFLAotICAgIDB4OTc3NCwgMHgwNkZBLCAweDk3NzYsIDB4NEUwNCwgMHg5Nzc5LCAweDFCRjEsIDB4OTc3QSwgMHgxQkY1LAotICAgIDB4OTc3QywgMHgxQkYzLCAweDk3N0QsIDB4NEUwNSwgMHg5NzdGLCAweDRFMDYsIDB4OTc4MSwgMHgxQkY0LAotICAgIDB4OTc4NCwgMHgwNUQxLCAweDk3ODUsIDB4MUJGMiwgMHg5Nzg2LCAweDFCRjYsIDB4OTc4QiwgMHgxQkY3LAotICAgIDB4OTc4RCwgMHgwNDhDLCAweDk3OEYsIDB4MUJGOCwgMHg5NzkwLCAweDFCRjksIDB4OTc5NSwgMHg0MzI0LAotICAgIDB4OTc5NiwgMHg0OUU3LCAweDk3OTgsIDB4MDlDQywgMHg5Nzk5LCAweDRFMDcsIDB4OTc5QSwgMHgzQkFGLAotICAgIDB4OTc5QywgMHgxQkZBLCAweDk3OUUsIDB4NDlFOCwgMHg5NzlGLCAweDRFMDgsIDB4OTdBMCwgMHgwNjYxLAotICAgIDB4OTdBMiwgMHgzQkIwLCAweDk3QTMsIDB4MUJGRCwgMHg5N0E2LCAweDFCRkMsIDB4OTdBOCwgMHgxQkZCLAotICAgIDB4OTdBQiwgMHgxQTM0LCAweDk3QUMsIDB4NEUwOSwgMHg5N0FELCAweDBFMkMsIDB4OTdBRSwgMHg0MzI1LAotICAgIDB4OTdCMSwgMHg0OUU5LCAweDk3QjIsIDB4NDlFQSwgMHg5N0IzLCAweDFCRkUsIDB4OTdCNCwgMHgxQkZGLAotICAgIDB4OTdCNSwgMHgzQkIxLCAweDk3QjYsIDB4M0JCMiwgMHg5N0I5LCAweDRFMEEsIDB4OTdCQSwgMHg0MzI2LAotICAgIDB4OTdCRSwgMHg0OUVCLCAweDk3QzEsIDB4NDMyNywgMHg5N0MzLCAweDFDMDAsIDB4OTdDNiwgMHgxQzAxLAotICAgIDB4OTdDOCwgMHgxQzAyLCAweDk3QzksIDB4NDMyOCwgMHg5N0NCLCAweDFDMDMsIDB4OTdDQywgMHg0OUVDLAotICAgIDB4OTdDRCwgMHg0RTBCLCAweDk3RDEsIDB4NDlFRCwgMHg5N0QzLCAweDA2MTYsIDB4OTdENCwgMHg0OUVFLAotICAgIDB4OTdEOCwgMHg0OUVGLCAweDk3RDksIDB4M0JCMywgMHg5N0RCLCAweDQzMjksIDB4OTdEQywgMHgxQzA0LAotICAgIDB4OTdERSwgMHgzQkI0LCAweDk3RTAsIDB4NEUwQywgMHg5N0UxLCAweDQ5RjAsIDB4OTdFRCwgMHgxQzA1LAotICAgIDB4OTdFRSwgMHgwQ0Q5LCAweDk3RUYsIDB4NEUwRCwgMHg5N0YxLCAweDQ5RjEsIDB4OTdGMiwgMHgxQzA3LAotICAgIDB4OTdGMywgMHgwNTNCLCAweDk3RjQsIDB4M0JCNSwgMHg5N0Y1LCAweDFDMEEsIDB4OTdGNiwgMHgxQzA5LAotICAgIDB4OTdGQiwgMHgwNEM2LCAweDk3RkYsIDB4MDZCOSwgMHg5ODAxLCAweDBFMTcsIDB4OTgwMiwgMHgwQkQ2LAotICAgIDB4OTgwMywgMHgwODEyLCAweDk4MDQsIDB4NDlGMiwgMHg5ODA1LCAweDA3RjIsIDB4OTgwNiwgMHgwOTcxLAotICAgIDB4OTgwNywgMHg0RTBFLCAweDk4MDgsIDB4MEEyMiwgMHg5ODBBLCAweDNCQjYsIDB4OTgwQywgMHgxQzBDLAotICAgIDB4OTgwRCwgMHg0OUYzLCAweDk4MEUsIDB4M0JCNywgMHg5ODBGLCAweDFDMEIsIDB4OTgxMCwgMHgwRjJDLAotICAgIDB4OTgxMSwgMHgwNjI0LCAweDk4MTIsIDB4MEQ2NiwgMHg5ODEzLCAweDBDQjQsIDB4OTgxNCwgMHg0OUY0LAotICAgIDB4OTgxNiwgMHg0OUY1LCAweDk4MTcsIDB4MEE0MiwgMHg5ODE4LCAweDBGOTYsIDB4OTgxQSwgMHgwNzMxLAotICAgIDB4OTgxRSwgMHgzQkI4LCAweDk4MjEsIDB4MUMwRiwgMHg5ODIzLCAweDNCQjksIDB4OTgyNCwgMHgxQzBFLAotICAgIDB4OTgyNSwgMHg0OUZBLCAweDk4MjYsIDB4NEUwRiwgMHg5ODJCLCAweDNCQkEsIDB4OTgyQywgMHgwRTc5LAotICAgIDB4OTgyRCwgMHgwQzg0LCAweDk4MkUsIDB4NEUxMCwgMHg5ODMwLCAweDFFNzMsIDB4OTgzMiwgMHg0OUY4LAotICAgIDB4OTgzMywgMHg0OUY5LCAweDk4MzQsIDB4MDRGMiwgMHg5ODM3LCAweDFDMTAsIDB4OTgzOCwgMHgxQzBELAotICAgIDB4OTgzOSwgMHgzN0IzLCAweDk4M0IsIDB4MERDMywgMHg5ODNDLCAweDBGNTQsIDB4OTgzRCwgMHgxQzExLAotICAgIDB4OTgzRSwgMHgzQkJCLCAweDk4NDYsIDB4MUMxMiwgMHg5ODQ3LCAweDQ5RkIsIDB4OTg0QiwgMHgxQzE0LAotICAgIDB4OTg0QywgMHgwQjRBLCAweDk4NEQsIDB4MDVCOSwgMHg5ODRFLCAweDA1QkEsIDB4OTg0RiwgMHgxQzEzLAotICAgIDB4OTg1MiwgMHgzQkJDLCAweDk4NTMsIDB4M0JCRCwgMHg5ODU0LCAweDA2MjUsIDB4OTg1NSwgMHgwNzY2LAotICAgIDB4OTg1NiwgMHg0MzJBLCAweDk4NTcsIDB4MjFGOSwgMHg5ODU4LCAweDA2MjYsIDB4OTg1OSwgMHgzQkJFLAotICAgIDB4OTg1QSwgMHgxRTQ4LCAweDk4NUIsIDB4MEMzOSwgMHg5ODVFLCAweDBGQTgsIDB4OTg2MiwgMHg0RTExLAotICAgIDB4OTg2MywgMHg0RTEyLCAweDk4NjUsIDB4MjFGQSwgMHg5ODY2LCAweDQ5RkMsIDB4OTg2NywgMHgwNzkwLAotICAgIDB4OTg2QiwgMHgxQzE1LCAweDk4NkMsIDB4M0JCRiwgMHg5ODZGLCAweDFDMTYsIDB4OTg3MCwgMHgxQzE3LAotICAgIDB4OTg3MSwgMHgxQzE4LCAweDk4NzMsIDB4MUMxQSwgMHg5ODc0LCAweDFDMTksIDB4OThBOCwgMHgwREU5LAotICAgIDB4OThBQSwgMHgxQzFCLCAweDk4QUIsIDB4NDlGRCwgMHg5OEFELCAweDQ5RkUsIDB4OThBRiwgMHgxQzFDLAotICAgIDB4OThCMCwgMHg0OUZGLCAweDk4QjEsIDB4MUMxRCwgMHg5OEI0LCAweDRFMTMsIDB4OThCNiwgMHgxQzFFLAotICAgIDB4OThCNywgMHg0QTAxLCAweDk4QjgsIDB4M0JDMCwgMHg5OEJBLCAweDNCQzEsIDB4OThCQiwgMHg0QTAyLAotICAgIDB4OThCQywgMHg0QTAzLCAweDk4QkYsIDB4M0JDMiwgMHg5OEMyLCAweDRBMDQsIDB4OThDMywgMHgxQzIwLAotICAgIDB4OThDNCwgMHgxQzFGLCAweDk4QzUsIDB4NEUxNCwgMHg5OEM2LCAweDFDMjEsIDB4OThDNywgMHg0QTA1LAotICAgIDB4OThDOCwgMHgzQkMzLCAweDk4Q0IsIDB4NEEwNiwgMHg5OERCLCAweDBEODgsIDB4OThEQywgMHgxODM5LAotICAgIDB4OThERiwgMHgwOUVGLCAweDk4RTAsIDB4MzYxOCwgMHg5OEUxLCAweDRBMDcsIDB4OThFMiwgMHgwNjRDLAotICAgIDB4OThFMywgMHg0QTA4LCAweDk4RTUsIDB4M0JDNCwgMHg5OEU3LCAweDQzMkIsIDB4OThFOSwgMHgxQzIyLAotICAgIDB4OThFQSwgMHg0QTA5LCAweDk4RUIsIDB4MUMyMywgMHg5OEVELCAweDEwQzEsIDB4OThFRSwgMHgxNERBLAotICAgIDB4OThFRiwgMHgwRDY3LCAweDk4RjAsIDB4NEEwQSwgMHg5OEYxLCAweDRBMEIsIDB4OThGMiwgMHgwNEJGLAotICAgIDB4OThGMywgMHg0QTBDLCAweDk4RjQsIDB4MDQ3RiwgMHg5OEZDLCAweDA4QzIsIDB4OThGRCwgMHgwRTVFLAotICAgIDB4OThGRSwgMHgwOUU2LCAweDk5MDIsIDB4NEUxNSwgMHg5OTAzLCAweDFDMjQsIDB4OTkwNSwgMHgwRUVCLAotICAgIDB4OTkwOCwgMHg0QTBELCAweDk5MDksIDB4MUMyNSwgMHg5OTBBLCAweDBGNDYsIDB4OTkwQywgMHgwNEU0LAotICAgIDB4OTkxMCwgMHgwODhGLCAweDk5MTEsIDB4NEUxNiwgMHg5OTEyLCAweDFDMjYsIDB4OTkxMywgMHgwNTZFLAotICAgIDB4OTkxNCwgMHgxQzI3LCAweDk5MTUsIDB4NEUxNywgMHg5OTE2LCAweDRBMTAsIDB4OTkxNywgMHg0QTExLAotICAgIDB4OTkxOCwgMHgxQzI4LCAweDk5MUEsIDB4NEExMywgMHg5OTFCLCAweDRBMTQsIDB4OTkxQywgMHg0QTE1LAotICAgIDB4OTkxRCwgMHgxQzJBLCAweDk5MUUsIDB4MUMyQiwgMHg5OTIwLCAweDFDMkQsIDB4OTkyMSwgMHgxQzI5LAotICAgIDB4OTkyNCwgMHgxQzJDLCAweDk5MjcsIDB4MjFGRCwgMHg5OTI4LCAweDA2MTcsIDB4OTkyQywgMHgxQzJFLAotICAgIDB4OTkyRSwgMHgxQzJGLCAweDk5MzEsIDB4NEExNywgMHg5OTMyLCAweDNCQzUsIDB4OTkzMywgMHgzQkM2LAotICAgIDB4OTkzNSwgMHg0RTE4LCAweDk5M0EsIDB4NEExOCwgMHg5OTNCLCAweDRBMTksIDB4OTkzQywgMHg0QTFBLAotICAgIDB4OTkzRCwgMHgxQzMwLCAweDk5M0UsIDB4MUMzMSwgMHg5OTQwLCAweDNCQzcsIDB4OTk0MSwgMHg0QTFCLAotICAgIDB4OTk0MiwgMHgxQzMyLCAweDk5NDUsIDB4MUMzNCwgMHg5OTQ2LCAweDRBMUMsIDB4OTk0OCwgMHg0RTE5LAotICAgIDB4OTk0OSwgMHgxQzMzLCAweDk5NEIsIDB4MUMzNiwgMHg5OTRDLCAweDFDMzksIDB4OTk0RCwgMHgzQkM4LAotICAgIDB4OTk0RSwgMHg0QTFELCAweDk5NTAsIDB4MUMzNSwgMHg5OTUxLCAweDFDMzcsIDB4OTk1MiwgMHgxQzM4LAotICAgIDB4OTk1NCwgMHg0RTFBLCAweDk5NTUsIDB4MUMzQSwgMHg5OTU3LCAweDA2QkEsIDB4OTk1OCwgMHg0MzJDLAotICAgIDB4OTk1QywgMHgzQkM5LCAweDk5NUUsIDB4NEUxQiwgMHg5OTVGLCAweDNCQ0EsIDB4OTk2MCwgMHg0QTFFLAotICAgIDB4OTk5NiwgMHgwOTFGLCAweDk5OTcsIDB4MUMzQiwgMHg5OTk4LCAweDFDM0MsIDB4OTk5OSwgMHgwN0YzLAotICAgIDB4OTk5RSwgMHgyMUZGLCAweDk5QTMsIDB4NEExRiwgMHg5OUE1LCAweDFDM0QsIDB4OTlBNiwgMHg0QTIwLAotICAgIDB4OTlBOCwgMHgwNTlDLCAweDk5QUMsIDB4MEQwNSwgMHg5OUFELCAweDFDM0UsIDB4OTlBRSwgMHgxQzNGLAotICAgIDB4OTlCMSwgMHgzQkNCLCAweDk5QjMsIDB4MEI5OCwgMHg5OUI0LCAweDBDQzMsIDB4OTlCOSwgMHgzQkNDLAotICAgIDB4OTlCQSwgMHgzQkNELCAweDk5QkMsIDB4MUM0MCwgMHg5OUJELCAweDRBMjEsIDB4OTlCRiwgMHg0QTIyLAotICAgIDB4OTlDMSwgMHgwRDMzLCAweDk5QzMsIDB4NEEyMywgMHg5OUM0LCAweDBCMkMsIDB4OTlDNSwgMHgwNEZBLAotICAgIDB4OTlDNiwgMHgwNkU2LCAweDk5QzgsIDB4MDZFNywgMHg5OUM5LCAweDNCQ0UsIDB4OTlEMCwgMHgwQkIxLAotICAgIDB4OTlEMSwgMHgxQzQ1LCAweDk5RDIsIDB4MDZFOCwgMHg5OUQ0LCAweDRBMjQsIDB4OTlENSwgMHgwNTZGLAotICAgIDB4OTlEOCwgMHgxQzQ0LCAweDk5RDksIDB4NEEyNSwgMHg5OURCLCAweDFDNDIsIDB4OTlERCwgMHgxQzQzLAotICAgIDB4OTlERSwgMHg0QTI2LCAweDk5REYsIDB4MUM0MSwgMHg5OUUxLCAweDRFMUMsIDB4OTlFMiwgMHgxQzRGLAotICAgIDB4OTlFRCwgMHgxQzQ2LCAweDk5RUUsIDB4MUM0NywgMHg5OUYwLCAweDRBMjgsIDB4OTlGMSwgMHgxQzQ4LAotICAgIDB4OTlGMiwgMHgxQzQ5LCAweDk5RjgsIDB4MUM0QiwgMHg5OUY5LCAweDRBMjksIDB4OTlGQiwgMHgxQzRBLAotICAgIDB4OTlGQywgMHg0QTJBLCAweDk5RkYsIDB4MDk2MywgMHg5QTAxLCAweDFDNEMsIDB4OUEwMiwgMHgzQkNGLAotICAgIDB4OUEwMywgMHg0MzJELCAweDlBMDUsIDB4MUM0RSwgMHg5QTA4LCAweDM3QkEsIDB4OUEwQSwgMHg0QTJCLAotICAgIDB4OUEwQywgMHg0RTFELCAweDlBMEUsIDB4MDY0RCwgMHg5QTBGLCAweDFDNEQsIDB4OUExMCwgMHg0RTFFLAotICAgIDB4OUExMSwgMHg0QTJDLCAweDlBMTIsIDB4MEFGRCwgMHg5QTEzLCAweDA3NjcsIDB4OUExNiwgMHgzQkQwLAotICAgIDB4OUExOSwgMHgxQzUwLCAweDlBMUEsIDB4NEEyRCwgMHg5QTIwLCAweDRBMkUsIDB4OUEyMywgMHg0RTFGLAotICAgIDB4OUEyNCwgMHgzQkQxLCAweDlBMjcsIDB4M0JEMiwgMHg5QTI4LCAweDBCMkQsIDB4OUEyQiwgMHgxQzUxLAotICAgIDB4OUEyRCwgMHgzQkQzLCAweDlBMkUsIDB4M0JENCwgMHg5QTMwLCAweDBDODUsIDB4OUEzMSwgMHg0QTJGLAotICAgIDB4OUEzNiwgMHgzQkQ1LCAweDlBMzcsIDB4MUM1MiwgMHg5QTM4LCAweDNCRDYsIDB4OUEzRSwgMHgxQzU3LAotICAgIDB4OUE0MCwgMHgxQzU1LCAweDlBNDEsIDB4NEUyMCwgMHg5QTQyLCAweDFDNTQsIDB4OUE0MywgMHgxQzU2LAotICAgIDB4OUE0NCwgMHg0QTMwLCAweDlBNDUsIDB4MUM1MywgMHg5QTRBLCAweDNCRDcsIDB4OUE0QywgMHg0QTMxLAotICAgIDB4OUE0RCwgMHgxQzU5LCAweDlBNEUsIDB4MjIwMCwgMHg5QTUxLCAweDRFMjEsIDB4OUE1MiwgMHgxRTJGLAotICAgIDB4OUE1NSwgMHgxQzU4LCAweDlBNTYsIDB4M0JEOCwgMHg5QTU3LCAweDFDNUIsIDB4OUE1OCwgMHg0QTMyLAotICAgIDB4OUE1QSwgMHgwNkJCLCAweDlBNUIsIDB4MUM1QSwgMHg5QTVGLCAweDFDNUMsIDB4OUE2MiwgMHgxQzVELAotICAgIDB4OUE2NCwgMHgxQzVGLCAweDlBNjUsIDB4MUM1RSwgMHg5QTY5LCAweDFDNjAsIDB4OUE2QSwgMHgxQzYyLAotICAgIDB4OUE2QiwgMHgxQzYxLCAweDlBQTgsIDB4MDgwRSwgMHg5QUFELCAweDFDNjMsIDB4OUFBRiwgMHg0QTM0LAotICAgIDB4OUFCMCwgMHgxQzY0LCAweDlBQjUsIDB4M0JEOSwgMHg5QUI2LCAweDNCREEsIDB4OUFCNywgMHg0QTM2LAotICAgIDB4OUFCOCwgMHgwNTlBLCAweDlBQjksIDB4NEEzOCwgMHg5QUJDLCAweDFDNjUsIDB4OUFCRCwgMHg0RTIyLAotICAgIDB4OUFCRSwgMHg0RTIzLCAweDlBQzAsIDB4MUM2NiwgMHg5QUMxLCAweDQzMkUsIDB4OUFDMywgMHg0MzJGLAotICAgIDB4OUFDNCwgMHgwQTM3LCAweDlBQzYsIDB4NEEzQSwgMHg5QUNFLCAweDQzMzAsIDB4OUFDRiwgMHgxQzY3LAotICAgIDB4OUFEMCwgMHg0QTNCLCAweDlBRDEsIDB4MUM2OCwgMHg5QUQyLCAweDRBM0MsIDB4OUFEMywgMHgxQzY5LAotICAgIDB4OUFENCwgMHgxQzZBLCAweDlBRDUsIDB4NEEzRCwgMHg5QUQ2LCAweDQzMzEsIDB4OUFEOCwgMHgwN0Y0LAotICAgIDB4OUFEOSwgMHgyMjAxLCAweDlBREMsIDB4MjIwMiwgMHg5QURFLCAweDFDNkIsIDB4OUFERiwgMHgxQzZDLAotICAgIDB4OUFFMCwgMHg0QTNFLCAweDlBRTIsIDB4MUM2RCwgMHg5QUUzLCAweDFDNkUsIDB4OUFFNSwgMHg0QTNGLAotICAgIDB4OUFFNiwgMHgxQzZGLCAweDlBRTksIDB4NEE0MCwgMHg5QUVBLCAweDBENDUsIDB4OUFFQiwgMHgxQzcxLAotICAgIDB4OUFFRCwgMHgwRDk4LCAweDlBRUUsIDB4MUM3MiwgMHg5QUVGLCAweDFDNzAsIDB4OUFGMSwgMHgxQzc0LAotICAgIDB4OUFGNCwgMHgxQzczLCAweDlBRjcsIDB4MUM3NSwgMHg5QUY5LCAweDNCREIsIDB4OUFGQiwgMHgxQzc2LAotICAgIDB4OUIwMSwgMHg0RTI0LCAweDlCMDIsIDB4NDMzMiwgMHg5QjAzLCAweDNCREMsIDB4OUIwNiwgMHgxQzc3LAotICAgIDB4OUIwOCwgMHg0MzMzLCAweDlCMDksIDB4NEUyNSwgMHg5QjBCLCAweDRFMjYsIDB4OUIwQywgMHg0QTQxLAotICAgIDB4OUIwRCwgMHg0RTI3LCAweDlCMEUsIDB4NEUyOCwgMHg5QjEwLCAweDRBNDIsIDB4OUIxMiwgMHg0QTQzLAotICAgIDB4OUIxNiwgMHg0QTQ0LCAweDlCMTgsIDB4MUM3OCwgMHg5QjE5LCAweDRFMjksIDB4OUIxQSwgMHgxQzc5LAotICAgIDB4OUIxQywgMHg0QTQ1LCAweDlCMUQsIDB4NEY0OSwgMHg5QjFGLCAweDFDN0EsIDB4OUIyMCwgMHgzQkRELAotICAgIDB4OUIyMiwgMHgxQzdCLCAweDlCMjMsIDB4MUM3QywgMHg5QjI1LCAweDFDN0QsIDB4OUIyNywgMHgxQzdFLAotICAgIDB4OUIyOCwgMHgxQzdGLCAweDlCMjksIDB4MUM4MCwgMHg5QjJBLCAweDFDODEsIDB4OUIyQiwgMHg0QTQ2LAotICAgIDB4OUIyQywgMHg0RjRBLCAweDlCMkQsIDB4NDMzNSwgMHg5QjJFLCAweDFDODIsIDB4OUIyRiwgMHgxQzgzLAotICAgIDB4OUIzMSwgMHgxNEQ0LCAweDlCMzIsIDB4MUM4NCwgMHg5QjMzLCAweDNCREUsIDB4OUIzNCwgMHgzQkRGLAotICAgIDB4OUIzNSwgMHg0RTJBLCAweDlCM0IsIDB4MTdBOSwgMHg5QjNDLCAweDA2NEUsIDB4OUIzRCwgMHg0QTQ3LAotICAgIDB4OUI0MSwgMHgwNTdGLCAweDlCNDIsIDB4MDgyMiwgMHg5QjQzLCAweDFDODYsIDB4OUI0NCwgMHgxQzg1LAotICAgIDB4OUI0NSwgMHgwRUIxLCAweDlCNDgsIDB4NEUyQiwgMHg5QjRCLCAweDRBNDksIDB4OUI0RCwgMHgxQzg4LAotICAgIDB4OUI0RSwgMHgxQzg5LCAweDlCNEYsIDB4MUM4NywgMHg5QjUxLCAweDFDOEEsIDB4OUI1NCwgMHgwRTkwLAotICAgIDB4OUI1NSwgMHg0RTJDLCAweDlCNTgsIDB4MUM4QiwgMHg5QjVBLCAweDA2OTUsIDB4OUI1RSwgMHg0MzM2LAotICAgIDB4OUI2MywgMHg0QTRBLCAweDlCNjUsIDB4NEE0QiwgMHg5QjY2LCAweDQzMzcsIDB4OUI2OCwgMHg0RTJELAotICAgIDB4OUI2QiwgMHg0QTRDLCAweDlCNkMsIDB4NEE0RCwgMHg5QjZGLCAweDBGQ0IsIDB4OUI3MiwgMHgyMjA0LAotICAgIDB4OUI3MywgMHgzQkUwLCAweDlCNzQsIDB4MUM4QywgMHg5Qjc1LCAweDIyMDMsIDB4OUI3NiwgMHg0QTRFLAotICAgIDB4OUI3NywgMHg0QTRGLCAweDlCNzksIDB4M0JFMSwgMHg5QjgwLCAweDRFMkUsIDB4OUI4MywgMHgxQzhFLAotICAgIDB4OUI4NCwgMHg0MzM4LCAweDlCODYsIDB4NEUyRiwgMHg5QjhBLCAweDQzMzksIDB4OUI4RSwgMHgwNDgyLAotICAgIDB4OUI4RiwgMHgyMjA1LCAweDlCOTAsIDB4NEUzMCwgMHg5QjkxLCAweDFDOEYsIDB4OUI5MiwgMHgwREZCLAotICAgIDB4OUI5MywgMHgxQzhELCAweDlCOTYsIDB4MUM5MCwgMHg5Qjk3LCAweDFDOTEsIDB4OUI5RCwgMHg0RTMxLAotICAgIDB4OUI5RSwgMHg0MzNBLCAweDlCOUYsIDB4MUM5MiwgMHg5QkEwLCAweDFDOTMsIDB4OUJBNiwgMHg0QTUwLAotICAgIDB4OUJBNywgMHgzQkUyLCAweDlCQTgsIDB4MUM5NCwgMHg5QkFBLCAweDBFOUMsIDB4OUJBQiwgMHgwODdCLAotICAgIDB4OUJBQywgMHg0QTUxLCAweDlCQUQsIDB4MDg2QSwgMHg5QkFFLCAweDBBQjEsIDB4OUJCMCwgMHg0RTMyLAotICAgIDB4OUJCMSwgMHgyMjA2LCAweDlCQjIsIDB4NEE1MywgMHg5QkI0LCAweDFDOTUsIDB4OUJCOCwgMHg0QTU0LAotICAgIDB4OUJCOSwgMHgxQzk4LCAweDlCQkIsIDB4MjIwNywgMHg5QkJFLCAweDRBNTUsIDB4OUJCRiwgMHg0RTMzLAotICAgIDB4OUJDMCwgMHgxQzk2LCAweDlCQzEsIDB4M0JFMywgMHg5QkM2LCAweDFDOTksIDB4OUJDNywgMHgzQkU0LAotICAgIDB4OUJDOCwgMHg0RTM0LCAweDlCQzksIDB4MDdBNSwgMHg5QkNBLCAweDFDOTcsIDB4OUJDRSwgMHg0MzNCLAotICAgIDB4OUJDRiwgMHgxQzlBLCAweDlCRDEsIDB4MUM5QiwgMHg5QkQyLCAweDFDOUMsIDB4OUJENCwgMHgxQ0EwLAotICAgIDB4OUJENiwgMHgwODc4LCAweDlCRDcsIDB4M0JFNSwgMHg5QkQ4LCAweDRBNTcsIDB4OUJEQiwgMHgwQjQ0LAotICAgIDB4OUJERCwgMHg0QTU4LCAweDlCREYsIDB4MzdCRiwgMHg5QkUxLCAweDFDQTEsIDB4OUJFMiwgMHgxQzlFLAotICAgIDB4OUJFMywgMHgxQzlELCAweDlCRTQsIDB4MUM5RiwgMHg5QkU1LCAweDQzM0MsIDB4OUJFNywgMHgzQkU2LAotICAgIDB4OUJFOCwgMHgwNzM1LCAweDlCRUEsIDB4NEE1OSwgMHg5QkVCLCAweDNCRTcsIDB4OUJFRSwgMHg0QTVCLAotICAgIDB4OUJFRiwgMHg0QTVBLCAweDlCRjAsIDB4MUNBNSwgMHg5QkYxLCAweDFDQTQsIDB4OUJGMiwgMHgxQ0EzLAotICAgIDB4OUJGMywgMHg0QTU2LCAweDlCRjUsIDB4MDQ3NywgMHg5QkY3LCAweDNCRTgsIDB4OUJGOCwgMHg0MzNELAotICAgIDB4OUJGQSwgMHgzQkU5LCAweDlCRkQsIDB4M0JFQSwgMHg5QkZGLCAweDRFMzUsIDB4OUMwMCwgMHgyMjA4LAotICAgIDB4OUMwMiwgMHg0RTM2LCAweDlDMDQsIDB4MUNBRiwgMHg5QzA2LCAweDFDQUIsIDB4OUMwOCwgMHgxQ0FDLAotICAgIDB4OUMwOSwgMHgxQ0E4LCAweDlDMEEsIDB4MUNBRSwgMHg5QzBCLCAweDNCRUIsIDB4OUMwQywgMHgxQ0FBLAotICAgIDB4OUMwRCwgMHgwNUMwLCAweDlDMTAsIDB4MEZGMiwgMHg5QzEyLCAweDFDQUQsIDB4OUMxMywgMHgxQ0E5LAotICAgIDB4OUMxNCwgMHgxQ0E3LCAweDlDMTUsIDB4MUNBNiwgMHg5QzE2LCAweDRBNUYsIDB4OUMxOCwgMHg0QTYwLAotICAgIDB4OUMxOSwgMHg0QTYxLCAweDlDMUEsIDB4NEE2MiwgMHg5QzFCLCAweDFDQjEsIDB4OUMxQywgMHg0RTM3LAotICAgIDB4OUMxRCwgMHg0QTYzLCAweDlDMjEsIDB4MUNCNCwgMHg5QzIyLCAweDRBNjQsIDB4OUMyMywgMHg0MzNFLAotICAgIDB4OUMyNCwgMHgxQ0IzLCAweDlDMjUsIDB4MUNCMiwgMHg5QzI3LCAweDNCRUMsIDB4OUMyOSwgMHg0QTY1LAotICAgIDB4OUMyQSwgMHgzQkVELCAweDlDMkQsIDB4MERCQiwgMHg5QzJFLCAweDFDQjAsIDB4OUMyRiwgMHgwNEI3LAotICAgIDB4OUMzMCwgMHgxQ0I1LCAweDlDMzEsIDB4NEE2NywgMHg5QzMyLCAweDFDQjcsIDB4OUMzNSwgMHg0RTM4LAotICAgIDB4OUMzNiwgMHgzQkVFLCAweDlDMzcsIDB4NEE2OCwgMHg5QzM5LCAweDA1Q0QsIDB4OUMzQSwgMHgxQ0EyLAotICAgIDB4OUMzQiwgMHgwNEQ5LCAweDlDM0UsIDB4MUNCOSwgMHg5QzQxLCAweDNCRUYsIDB4OUM0NCwgMHg0RTM5LAotICAgIDB4OUM0NSwgMHg0QTY5LCAweDlDNDYsIDB4MUNCOCwgMHg5QzQ3LCAweDFDQjYsIDB4OUM0OCwgMHgwQjZCLAotICAgIDB4OUM0OSwgMHg0QTZDLCAweDlDNEEsIDB4NEE2RCwgMHg5QzRGLCAweDQzM0YsIDB4OUM1MCwgMHg0MzQwLAotICAgIDB4OUM1MiwgMHgwRTlFLCAweDlDNTMsIDB4M0JGMCwgMHg5QzU0LCAweDRBNkYsIDB4OUM1NiwgMHg0RTNBLAotICAgIDB4OUM1NywgMHgwRkEyLCAweDlDNTgsIDB4NEE3MCwgMHg5QzVBLCAweDFDQkEsIDB4OUM1QiwgMHg0QTcxLAotICAgIDB4OUM1QywgMHg0QTZBLCAweDlDNUQsIDB4NEE3MiwgMHg5QzVGLCAweDRBNzMsIDB4OUM2MCwgMHgxQ0JCLAotICAgIDB4OUM2MSwgMHg0RTNCLCAweDlDNjMsIDB4M0JGMSwgMHg5QzY1LCAweDQzNDEsIDB4OUM2NywgMHgxQ0JDLAotICAgIDB4OUM2OCwgMHg0RTNDLCAweDlDNjksIDB4NEE3NCwgMHg5QzZBLCAweDRBNzUsIDB4OUM2QiwgMHg0QTc2LAotICAgIDB4OUM2RCwgMHg0QTc3LCAweDlDNkUsIDB4NEE3OCwgMHg5QzcwLCAweDNCRjIsIDB4OUM3MiwgMHg0QTc5LAotICAgIDB4OUM3NSwgMHg0QTdBLCAweDlDNzYsIDB4MUNCRCwgMHg5Qzc3LCAweDNCRjMsIDB4OUM3OCwgMHgxQ0JFLAotICAgIDB4OUM3QSwgMHg0QTdCLCAweDlDRTUsIDB4MEJENywgMHg5Q0U2LCAweDRBN0MsIDB4OUNFNywgMHgxQ0JGLAotICAgIDB4OUNFOSwgMHgwRDRCLCAweDlDRUIsIDB4MUNDNCwgMHg5Q0VDLCAweDFDQzAsIDB4OUNGMCwgMHgxQ0MxLAotICAgIDB4OUNGMiwgMHg0QTdELCAweDlDRjMsIDB4MEU1RiwgMHg5Q0Y0LCAweDBFRDAsIDB4OUNGNiwgMHgwQ0E4LAotICAgIDB4OUQwMiwgMHgzQkY0LCAweDlEMDMsIDB4MUNDNSwgMHg5RDA2LCAweDFDQzYsIDB4OUQwNywgMHgwQzk2LAotICAgIDB4OUQwOCwgMHgxQ0MzLCAweDlEMDksIDB4MUNDMiwgMHg5RDBCLCAweDRBN0UsIDB4OUQwRSwgMHgwNTJBLAotICAgIDB4OUQxMSwgMHg0QTgwLCAweDlEMTIsIDB4MUNDRSwgMHg5RDE1LCAweDFDQ0QsIDB4OUQxNywgMHg0QTgxLAotICAgIDB4OUQxOCwgMHg0QTgyLCAweDlEMUIsIDB4MDUxNywgMHg5RDFELCAweDQzNDIsIDB4OUQxRSwgMHg0MzQzLAotICAgIDB4OUQxRiwgMHgxQ0NCLCAweDlEMjMsIDB4MUNDQSwgMHg5RDI2LCAweDFDQzgsIDB4OUQyOCwgMHgwNUQ5LAotICAgIDB4OUQyQSwgMHgxQ0M3LCAweDlEMkIsIDB4MDhERSwgMHg5RDJDLCAweDA1MjksIDB4OUQzMCwgMHg0RTNELAotICAgIDB4OUQzMiwgMHg0QTg2LCAweDlEM0IsIDB4MDdGNSwgMHg5RDNELCAweDRFM0UsIDB4OUQzRSwgMHgxQ0QxLAotICAgIDB4OUQzRiwgMHgxQ0QwLCAweDlENDEsIDB4MUNDRiwgMHg5RDQyLCAweDNCRjUsIDB4OUQ0MywgMHg0MzQ0LAotICAgIDB4OUQ0NCwgMHgxQ0NDLCAweDlENDYsIDB4MUNEMiwgMHg5RDQ3LCAweDNCRjYsIDB4OUQ0OCwgMHgxQ0QzLAotICAgIDB4OUQ0QSwgMHg0QTg4LCAweDlENTAsIDB4MUNEOCwgMHg5RDUxLCAweDFDRDcsIDB4OUQ1MiwgMHg0MzQ1LAotICAgIDB4OUQ1OSwgMHgxQ0Q5LCAweDlENUMsIDB4MDRDRiwgMHg5RDVELCAweDFDRDQsIDB4OUQ1RSwgMHgxQ0Q1LAotICAgIDB4OUQ1RiwgMHg0QTg5LCAweDlENjAsIDB4MDgwNiwgMHg5RDYxLCAweDBFQzUsIDB4OUQ2MiwgMHg0QThBLAotICAgIDB4OUQ2MywgMHgzQkY3LCAweDlENjQsIDB4MUNENiwgMHg5RDY5LCAweDNCRjgsIDB4OUQ2QSwgMHg0RTNGLAotICAgIDB4OUQ2QiwgMHgyMjBBLCAweDlENkMsIDB4MEU2MCwgMHg5RDZGLCAweDFDREUsIDB4OUQ3MCwgMHgyMjA5LAotICAgIDB4OUQ3MiwgMHgxQ0RBLCAweDlENzMsIDB4NEE4RCwgMHg5RDc2LCAweDRBOEUsIDB4OUQ3NywgMHg0QThGLAotICAgIDB4OUQ3QSwgMHgxQ0RGLCAweDlEN0IsIDB4NEU0MCwgMHg5RDdDLCAweDNCRjksIDB4OUQ3RSwgMHgzQkZBLAotICAgIDB4OUQ4NCwgMHg0QTkwLCAweDlEODcsIDB4MUNEQywgMHg5RDg5LCAweDFDREIsIDB4OUQ4QSwgMHg0MzQ2LAotICAgIDB4OUQ4RCwgMHgzQkZCLCAweDlEOEYsIDB4MDczMiwgMHg5RDk2LCAweDQzNDcsIDB4OUQ5OSwgMHg0QTkxLAotICAgIDB4OUQ5QSwgMHgxQ0UwLCAweDlEQTEsIDB4NEE5MiwgMHg5REE0LCAweDFDRTEsIDB4OURBOSwgMHgxQ0UyLAotICAgIDB4OURBQiwgMHgxQ0RELCAweDlEQUMsIDB4NDM0OSwgMHg5REFGLCAweDFDQzksIDB4OURCMSwgMHgzQkZDLAotICAgIDB4OURCMiwgMHgxQ0UzLCAweDlEQjQsIDB4MEJGRCwgMHg5REI1LCAweDRBOTQsIDB4OURCOCwgMHgxQ0U3LAotICAgIDB4OURCOSwgMHg0QTk1LCAweDlEQkEsIDB4MUNFOCwgMHg5REJCLCAweDFDRTYsIDB4OURCQywgMHg0MzRBLAotICAgIDB4OURCRCwgMHg0QTk2LCAweDlEQkYsIDB4NEE5MywgMHg5REMwLCAweDQzNDgsIDB4OURDMSwgMHgxQ0U1LAotICAgIDB4OURDMiwgMHgxQ0VCLCAweDlEQzMsIDB4M0JGRCwgMHg5REM0LCAweDFDRTQsIDB4OURDNiwgMHgxQ0U5LAotICAgIDB4OURDNywgMHgzQkZFLCAweDlEQzksIDB4NEE5NywgMHg5RENGLCAweDFDRUEsIDB4OUREMywgMHgxQ0VELAotICAgIDB4OURENiwgMHgzQkZGLCAweDlERDcsIDB4MURERSwgMHg5REQ5LCAweDFDRUMsIDB4OUREQSwgMHg0QTk4LAotICAgIDB4OURERiwgMHgzQzAwLCAweDlERTAsIDB4NEE5OSwgMHg5REUzLCAweDRBOUEsIDB4OURFNSwgMHg0RTQxLAotICAgIDB4OURFNiwgMHgxQ0VGLCAweDlERTcsIDB4NDM0QywgMHg5REU5LCAweDRFNDIsIDB4OURFQiwgMHgzQzAxLAotICAgIDB4OURFRCwgMHgxQ0YwLCAweDlERUYsIDB4MUNGMSwgMHg5REYyLCAweDBGRUYsIDB4OURGMywgMHg0RTQzLAotICAgIDB4OURGNCwgMHgzQzAyLCAweDlERjgsIDB4MUNFRSwgMHg5REY5LCAweDBCNEIsIDB4OURGQSwgMHgwODVELAotICAgIDB4OURGRCwgMHgxQ0YyLCAweDlFMDIsIDB4NEE5RCwgMHg5RTA3LCAweDQzNEQsIDB4OUUwQSwgMHg0QTlDLAotICAgIDB4OUUwRCwgMHg0QTlFLCAweDlFMTUsIDB4M0MwMywgMHg5RTE5LCAweDIyMEMsIDB4OUUxQSwgMHgxQ0YzLAotICAgIDB4OUUxQiwgMHgxQ0Y0LCAweDlFMUMsIDB4NEE5RiwgMHg5RTFELCAweDNDMDQsIDB4OUUxRSwgMHgxQ0Y1LAotICAgIDB4OUU3NSwgMHgxQ0Y2LCAweDlFNzgsIDB4MDc2OCwgMHg5RTc5LCAweDFDRjcsIDB4OUU3QSwgMHg0RTQ0LAotICAgIDB4OUU3QiwgMHg0QUEwLCAweDlFN0MsIDB4MURGRCwgMHg5RTdELCAweDFDRjgsIDB4OUU3RiwgMHgwOERCLAotICAgIDB4OUU4MCwgMHg0QUEyLCAweDlFODEsIDB4MUNGOSwgMHg5RTgyLCAweDRFNDUsIDB4OUU4MywgMHg0RTQ2LAotICAgIDB4OUU4NCwgMHg0RTQ3LCAweDlFODUsIDB4NEFBMywgMHg5RTg4LCAweDFDRkEsIDB4OUU4QiwgMHgxQ0ZCLAotICAgIDB4OUU4QywgMHgxQ0ZDLCAweDlFOTEsIDB4MUNGRiwgMHg5RTkyLCAweDFDRkQsIDB4OUU5MywgMHgwRkUyLAotICAgIDB4OUU5NSwgMHgxQ0ZFLCAweDlFOTcsIDB4MEZCNywgMHg5RTlCLCAweDRBQTQsIDB4OUU5RCwgMHgxRDAwLAotICAgIDB4OUU5RSwgMHg0MzRFLCAweDlFOUYsIDB4MEZBMywgMHg5RUE0LCAweDNDMDUsIDB4OUVBNSwgMHgxRDAxLAotICAgIDB4OUVBNiwgMHgwRDM0LCAweDlFQTgsIDB4M0MwNiwgMHg5RUE5LCAweDFEMDIsIDB4OUVBQSwgMHgxRDA0LAotICAgIDB4OUVBQywgMHgzQzA3LCAweDlFQUQsIDB4MUQwNSwgMHg5RUFGLCAweDQzNEYsIDB4OUVCMCwgMHg0RTQ4LAotICAgIDB4OUVCNCwgMHgxRTAyLCAweDlFQjUsIDB4MUU3NSwgMHg5RUI4LCAweDFEMDMsIDB4OUVCOSwgMHgwN0ZGLAotICAgIDB4OUVCQSwgMHgwRUQ5LCAweDlFQkIsIDB4MEU5MSwgMHg5RUJDLCAweDEyODQsIDB4OUVCRCwgMHg0QUE2LAotICAgIDB4OUVCRSwgMHgxNEZGLCAweDlFQkYsIDB4MEVBOSwgMHg5RUMzLCAweDM0MEIsIDB4OUVDNCwgMHgwNTJCLAotICAgIDB4OUVDQywgMHgxRDA3LCAweDlFQ0QsIDB4MDY2QSwgMHg5RUNFLCAweDFEMDgsIDB4OUVDRiwgMHgxRDA5LAotICAgIDB4OUVEMCwgMHgxRDBBLCAweDlFRDEsIDB4MjIwRCwgMHg5RUQyLCAweDA4MDcsIDB4OUVENCwgMHgxRDBCLAotICAgIDB4OUVEOCwgMHgxNjBELCAweDlFRDksIDB4MEVFNywgMHg5RURCLCAweDBCNDMsIDB4OUVEQywgMHgxRDBDLAotICAgIDB4OUVERCwgMHgxRDBFLCAweDlFREUsIDB4MUQwRCwgMHg5RURGLCAweDRBQTgsIDB4OUVFMCwgMHgxRDBGLAotICAgIDB4OUVFNCwgMHg0RTQ5LCAweDlFRTUsIDB4MUQxMCwgMHg5RUU3LCAweDNDMDgsIDB4OUVFOCwgMHgxRDExLAotICAgIDB4OUVFRSwgMHgzQzA5LCAweDlFRUYsIDB4MUQxMiwgMHg5RUYwLCAweDRFNEEsIDB4OUVGMiwgMHg0RTRCLAotICAgIDB4OUVGNCwgMHgxRDEzLCAweDlFRjYsIDB4MUQxNCwgMHg5RUY3LCAweDFEMTUsIDB4OUVGOSwgMHgxRDE2LAotICAgIDB4OUVGQiwgMHgxRDE3LCAweDlFRkMsIDB4MUQxOCwgMHg5RUZELCAweDFEMTksIDB4OUVGRiwgMHg0QUE5LAotICAgIDB4OUYwMiwgMHg0QUFBLCAweDlGMDMsIDB4NEFBQywgMHg5RjA3LCAweDFEMUEsIDB4OUYwOCwgMHgxRDFCLAotICAgIDB4OUYwOSwgMHg0RTRDLCAweDlGMEUsIDB4MEMxRSwgMHg5RjBGLCAweDRFNEQsIDB4OUYxMCwgMHgzQzBBLAotICAgIDB4OUYxMiwgMHgzQzBCLCAweDlGMTMsIDB4MDc5MSwgMHg5RjE0LCAweDRFNEUsIDB4OUYxNSwgMHgxRDFELAotICAgIDB4OUYxNywgMHgzQzBDLCAweDlGMTksIDB4M0MwRCwgMHg5RjFCLCAweDRFNEYsIDB4OUYyMCwgMHgwQUNGLAotICAgIDB4OUYyMSwgMHgxRDFFLCAweDlGMjIsIDB4NEU1MCwgMHg5RjI2LCAweDRFNTEsIDB4OUYyQSwgMHg0RTUyLAotICAgIDB4OUYyQiwgMHg0RTUzLCAweDlGMkMsIDB4MUQxRiwgMHg5RjJGLCAweDNDMEUsIDB4OUYzNCwgMHg0RTU0LAotICAgIDB4OUYzNywgMHgzQzBGLCAweDlGMzksIDB4M0MxMCwgMHg5RjNBLCAweDRBQUQsIDB4OUYzQiwgMHgwRDkzLAotICAgIDB4OUYzRCwgMHg0QUFFLCAweDlGM0UsIDB4MUQyMCwgMHg5RjQxLCAweDNDMTEsIDB4OUY0NSwgMHgzQzEyLAotICAgIDB4OUY0NiwgMHg0QUFGLCAweDlGNEEsIDB4MUQyMSwgMHg5RjRCLCAweDE3MEEsIDB4OUY0RSwgMHgxQTdCLAotICAgIDB4OUY0RiwgMHgxQzA2LCAweDlGNTIsIDB4MUQyMiwgMHg5RjUzLCAweDRBQjAsIDB4OUY1NCwgMHgxRDIzLAotICAgIDB4OUY1NSwgMHg0QUIxLCAweDlGNTcsIDB4M0MxMywgMHg5RjU4LCAweDRBQjIsIDB4OUY1QSwgMHg0RTU1LAotICAgIDB4OUY1RCwgMHg0QUI0LCAweDlGNUYsIDB4MUQyNSwgMHg5RjYwLCAweDFEMjYsIDB4OUY2MSwgMHgxRDI3LAotICAgIDB4OUY2MiwgMHgwRkI4LCAweDlGNjMsIDB4MUQyNCwgMHg5RjY2LCAweDFEMjgsIDB4OUY2NywgMHgxRDI5LAotICAgIDB4OUY2OCwgMHgzQzE0LCAweDlGNjksIDB4NEFCNiwgMHg5RjZBLCAweDFEMkIsIDB4OUY2QywgMHgxRDJBLAotICAgIDB4OUY2RCwgMHg0QUI3LCAweDlGNkYsIDB4NEU1NiwgMHg5RjcwLCAweDRBQjgsIDB4OUY3MSwgMHgzQzE1LAotICAgIDB4OUY3MiwgMHgxRDJELCAweDlGNzUsIDB4M0MxNiwgMHg5Rjc2LCAweDFEMkUsIDB4OUY3NywgMHgxRDJDLAotICAgIDB4OUY4RCwgMHgwRjdFLCAweDlGOTAsIDB4M0MxNywgMHg5Rjk0LCAweDNDMTgsIDB4OUY5NSwgMHgxRDJGLAotICAgIDB4OUY5NywgMHg0MzUwLCAweDlGOUMsIDB4MUQzMCwgMHg5RjlELCAweDE3MjcsIDB4OUY5RSwgMHg0RTU3LAotICAgIDB4OUZBMCwgMHgxRDMxLCAweDlGQTIsIDB4M0MxOSwgMHg5RkE1LCAweDRFNTgsIDB4Rjg2MCwgMHgzQzU0LAotICAgIDB4Rjg2MSwgMHgzQzU1LCAweEY4NjIsIDB4M0M1NiwgMHhGODdBLCAweDNDNTcsIDB4Rjg3RiwgMHgzQzU4LAotICAgIDB4RjkwOSwgMHgzNUFCLCAweEY5MUQsIDB4MzQ1MCwgMHhGOTFGLCAweDM3MDQsIDB4RjkyOCwgMHg0RjRGLAotICAgIDB4RjkyOSwgMHg0RjUxLCAweEY5MzYsIDB4MzQ1MiwgMHhGOTVGLCAweDM2OTMsIDB4Rjk3MCwgMHgzNDIwLAotICAgIDB4Rjk4MywgMHgzNzA4LCAweEY5OTIsIDB4MUU4MSwgMHhGOTkzLCAweDFFODIsIDB4Rjk5OSwgMHgxRTgzLAotICAgIDB4Rjk5QSwgMHgzNzExLCAweEY5QTIsIDB4MzcwRiwgMHhGOUMzLCAweDFFODAsIDB4RjlEMCwgMHgzNDU0LAotICAgIDB4RjlEQywgMHgzNDUxLCAweEY5RUMsIDB4MUU0NiwgMHhGQTAzLCAweDM2ODQsIDB4RkEwRSwgMHgyMERBLAotICAgIDB4RkEwRiwgMHgyMEU1LCAweEZBMTAsIDB4MUU0MiwgMHhGQTExLCAweDM3RDIsIDB4RkExMiwgMHgyMTIxLAotICAgIDB4RkExMywgMHgyMTMxLCAweEZBMTQsIDB4MjEzMywgMHhGQTE1LCAweDRGNTMsIDB4RkExNiwgMHgyMTY0LAotICAgIDB4RkExNywgMHgyMTdCLCAweEZBMTgsIDB4MjE4MywgMHhGQTE5LCAweDIxODQsIDB4RkExQSwgMHgyMTg1LAotICAgIDB4RkExQiwgMHgyMTg3LCAweEZBMUMsIDB4MjE4QiwgMHhGQTFELCAweDIxOEUsIDB4RkExRSwgMHgyMTk3LAotICAgIDB4RkExRiwgMHgyMUEyLCAweEZBMjAsIDB4MjFBNCwgMHhGQTIxLCAweDIxQTUsIDB4RkEyMiwgMHgyMUFFLAotICAgIDB4RkEyMywgMHgyMUI2LCAweEZBMjQsIDB4NDk0OCwgMHhGQTI1LCAweDIxQjksIDB4RkEyNiwgMHgyMUJDLAotICAgIDB4RkEyNywgMHgyMUQ4LCAweEZBMjgsIDB4MjFERiwgMHhGQTI5LCAweDIxRUYsIDB4RkEyQSwgMHgyMUZCLAotICAgIDB4RkEyQiwgMHgyMUZDLCAweEZBMkMsIDB4MjFGRSwgMHhGQTJELCAweDIyMEIsIDB4RkEzMCwgMHgzNDQ2LAotICAgIDB4RkEzMSwgMHgzNDMwLCAweEZBMzIsIDB4MzQ0RCwgMHhGQTMzLCAweDM0NDksIDB4RkEzNCwgMHgzNDFBLAotICAgIDB4RkEzNSwgMHgzNDQyLCAweEZBMzYsIDB4MURFMywgMHhGQTM3LCAweDM0MzYsIDB4RkEzOCwgMHgzNDE1LAotICAgIDB4RkEzOSwgMHgzNDQ4LCAweEZBM0EsIDB4MzQ0QiwgMHhGQTNCLCAweDM0MzEsIDB4RkEzQywgMHg0MUM1LAotICAgIDB4RkEzRCwgMHgzNDBFLCAweEZBM0UsIDB4MzQxMCwgMHhGQTNGLCAweDM0MzMsIDB4RkE0MCwgMHgzNDM5LAotICAgIDB4RkE0MSwgMHgzNDQ1LCAweEZBNDIsIDB4MzQxNiwgMHhGQTQzLCAweDM0MjgsIDB4RkE0NCwgMHgzNDNGLAotICAgIDB4RkE0NSwgMHgzNDBGLCAweEZBNDYsIDB4MUUxNCwgMHhGQTQ3LCAweDM0MTQsIDB4RkE0OCwgMHgzNDIzLAotICAgIDB4RkE0OSwgMHgzQzI2LCAweEZBNEEsIDB4MUUzNCwgMHhGQTRCLCAweDM0NDMsIDB4RkE0QywgMHgzNDI0LAotICAgIDB4RkE0RCwgMHgzNDIxLCAweEZBNEUsIDB4MzQxNywgMHhGQTRGLCAweDM0NEYsIDB4RkE1MCwgMHgzNDJGLAotICAgIDB4RkE1MSwgMHgzNDI3LCAweEZBNTIsIDB4MzQwRCwgMHhGQTUzLCAweDM0M0IsIDB4RkE1NCwgMHgzNDFGLAotICAgIDB4RkE1NSwgMHgzNDNELCAweEZBNTYsIDB4MzQyRSwgMHhGQTU3LCAweDM0NTcsIDB4RkE1OCwgMHg0N0JFLAotICAgIDB4RkE1OSwgMHgzNDQwLCAweEZBNUEsIDB4MzQyOSwgMHhGQTVCLCAweDM0MjUsIDB4RkE1QywgMHgzNDI2LAotICAgIDB4RkE1RCwgMHgzNzc3LCAweEZBNUUsIDB4Mzc3NiwgMHhGQTVGLCAweDM0MzcsIDB4RkE2MCwgMHgzNDEzLAotICAgIDB4RkE2MSwgMHgzNDIyLCAweEZBNjIsIDB4MzQwOSwgMHhGQTYzLCAweDM0MUIsIDB4RkE2NCwgMHgzNDQ0LAotICAgIDB4RkE2NSwgMHgzNDM0LCAweEZBNjYsIDB4M0MyQiwgMHhGQTY3LCAweDM0MDgsIDB4RkE2OCwgMHgzNDNFLAotICAgIDB4RkE2OSwgMHgzNDE5LCAweEZBNkEsIDB4MUU2QywgMHhGQjAwLCAweDI0OEUsIDB4RkIwMSwgMHgwMDcwLAotICAgIDB4RkIwMiwgMHgwMDcxLCAweEZCMDMsIDB4MjQ4RiwgMHhGQjA0LCAweDI0OTAsIDB4RkUzMCwgMHgxRURBLAotICAgIDB4RkUzMSwgMHgxRUQ0LCAweEZFMzIsIDB4MUVENSwgMHhGRTMzLCAweDFFRDIsIDB4RkUzNSwgMHgxRURCLAotICAgIDB4RkUzNiwgMHgxRURDLCAweEZFMzcsIDB4MUVFMSwgMHhGRTM4LCAweDFFRTIsIDB4RkUzOSwgMHgxRURELAotICAgIDB4RkUzQSwgMHgxRURFLCAweEZFM0IsIDB4MUVFQiwgMHhGRTNDLCAweDFFRUMsIDB4RkUzRCwgMHgxRUU1LAotICAgIDB4RkUzRSwgMHgxRUU2LCAweEZFM0YsIDB4MUVFMywgMHhGRTQwLCAweDFFRTQsIDB4RkU0MSwgMHgxRUU3LAotICAgIDB4RkU0MiwgMHgxRUU4LCAweEZFNDMsIDB4MUVFOSwgMHhGRTQ0LCAweDFFRUEsIDB4RkU0NSwgMHgzMTVGLAotICAgIDB4RkU0NiwgMHgzMTYwLCAweEZFNDcsIDB4MUVERiwgMHhGRTQ4LCAweDFFRTAsIDB4RkYwMSwgMHgwMjgyLAotICAgIDB4RkYwMiwgMHgxRjQ3LCAweEZGMDMsIDB4MDJDQywgMHhGRjA0LCAweDAyQzgsIDB4RkYwNSwgMHgwMkNCLAotICAgIDB4RkYwNiwgMHgwMkNELCAweEZGMDcsIDB4MUY0NiwgMHhGRjA4LCAweDAyQTIsIDB4RkYwOSwgMHgwMkEzLAotICAgIDB4RkYwQSwgMHgwMkNFLCAweEZGMEIsIDB4MDJCNCwgMHhGRjBDLCAweDAyN0MsIDB4RkYwRCwgMHgwMkI1LAotICAgIDB4RkYwRSwgMHgwMjdELCAweEZGMEYsIDB4MDI5NywgMHhGRjEwLCAweDAzMEMsIDB4RkYxMSwgMHgwMzBELAotICAgIDB4RkYxMiwgMHgwMzBFLCAweEZGMTMsIDB4MDMwRiwgMHhGRjE0LCAweDAzMTAsIDB4RkYxNSwgMHgwMzExLAotICAgIDB4RkYxNiwgMHgwMzEyLCAweEZGMTcsIDB4MDMxMywgMHhGRjE4LCAweDAzMTQsIDB4RkYxOSwgMHgwMzE1LAotICAgIDB4RkYxQSwgMHgwMjdGLCAweEZGMUIsIDB4MDI4MCwgMHhGRjFDLCAweDAyQkIsIDB4RkYxRCwgMHgwMkI5LAotICAgIDB4RkYxRSwgMHgwMkJDLCAweEZGMUYsIDB4MDI4MSwgMHhGRjIwLCAweDAyQ0YsIDB4RkYyMSwgMHgwMzE2LAotICAgIDB4RkYyMiwgMHgwMzE3LCAweEZGMjMsIDB4MDMxOCwgMHhGRjI0LCAweDAzMTksIDB4RkYyNSwgMHgwMzFBLAotICAgIDB4RkYyNiwgMHgwMzFCLCAweEZGMjcsIDB4MDMxQywgMHhGRjI4LCAweDAzMUQsIDB4RkYyOSwgMHgwMzFFLAotICAgIDB4RkYyQSwgMHgwMzFGLCAweEZGMkIsIDB4MDMyMCwgMHhGRjJDLCAweDAzMjEsIDB4RkYyRCwgMHgwMzIyLAotICAgIDB4RkYyRSwgMHgwMzIzLCAweEZGMkYsIDB4MDMyNCwgMHhGRjMwLCAweDAzMjUsIDB4RkYzMSwgMHgwMzI2LAotICAgIDB4RkYzMiwgMHgwMzI3LCAweEZGMzMsIDB4MDMyOCwgMHhGRjM0LCAweDAzMjksIDB4RkYzNSwgMHgwMzJBLAotICAgIDB4RkYzNiwgMHgwMzJCLCAweEZGMzcsIDB4MDMyQywgMHhGRjM4LCAweDAzMkQsIDB4RkYzOSwgMHgwMzJFLAotICAgIDB4RkYzQSwgMHgwMzJGLCAweEZGM0IsIDB4MDJBNiwgMHhGRjNDLCAweDAyOTgsIDB4RkYzRCwgMHgwMkE3LAotICAgIDB4RkYzRSwgMHgwMjg4LCAweEZGM0YsIDB4MDI4QSwgMHhGRjQwLCAweDAyODYsIDB4RkY0MSwgMHgwMzMwLAotICAgIDB4RkY0MiwgMHgwMzMxLCAweEZGNDMsIDB4MDMzMiwgMHhGRjQ0LCAweDAzMzMsIDB4RkY0NSwgMHgwMzM0LAotICAgIDB4RkY0NiwgMHgwMzM1LCAweEZGNDcsIDB4MDMzNiwgMHhGRjQ4LCAweDAzMzcsIDB4RkY0OSwgMHgwMzM4LAotICAgIDB4RkY0QSwgMHgwMzM5LCAweEZGNEIsIDB4MDMzQSwgMHhGRjRDLCAweDAzM0IsIDB4RkY0RCwgMHgwMzNDLAotICAgIDB4RkY0RSwgMHgwMzNELCAweEZGNEYsIDB4MDMzRSwgMHhGRjUwLCAweDAzM0YsIDB4RkY1MSwgMHgwMzQwLAotICAgIDB4RkY1MiwgMHgwMzQxLCAweEZGNTMsIDB4MDM0MiwgMHhGRjU0LCAweDAzNDMsIDB4RkY1NSwgMHgwMzQ0LAotICAgIDB4RkY1NiwgMHgwMzQ1LCAweEZGNTcsIDB4MDM0NiwgMHhGRjU4LCAweDAzNDcsIDB4RkY1OSwgMHgwMzQ4LAotICAgIDB4RkY1QSwgMHgwMzQ5LCAweEZGNUIsIDB4MDJBOCwgMHhGRjVDLCAweDAyOUIsIDB4RkY1RCwgMHgwMkE5LAotICAgIDB4RkY1RSwgMHgwMjk5LCAweEZGNUYsIDB4MkY2MywgMHhGRjYwLCAweDJGNjQsIDB4RkY2MSwgMHgwMTQ3LAotICAgIDB4RkY2MiwgMHgwMTQ4LCAweEZGNjMsIDB4MDE0OSwgMHhGRjY0LCAweDAxNEEsIDB4RkY2NSwgMHgwMTRCLAotICAgIDB4RkY2NiwgMHgwMTRDLCAweEZGNjcsIDB4MDE0RCwgMHhGRjY4LCAweDAxNEUsIDB4RkY2OSwgMHgwMTRGLAotICAgIDB4RkY2QSwgMHgwMTUwLCAweEZGNkIsIDB4MDE1MSwgMHhGRjZDLCAweDAxNTIsIDB4RkY2RCwgMHgwMTUzLAotICAgIDB4RkY2RSwgMHgwMTU0LCAweEZGNkYsIDB4MDE1NSwgMHhGRjcwLCAweDAxNTYsIDB4RkY3MSwgMHgwMTU3LAotICAgIDB4RkY3MiwgMHgwMTU4LCAweEZGNzMsIDB4MDE1OSwgMHhGRjc0LCAweDAxNUEsIDB4RkY3NSwgMHgwMTVCLAotICAgIDB4RkY3NiwgMHgwMTVDLCAweEZGNzcsIDB4MDE1RCwgMHhGRjc4LCAweDAxNUUsIDB4RkY3OSwgMHgwMTVGLAotICAgIDB4RkY3QSwgMHgwMTYwLCAweEZGN0IsIDB4MDE2MSwgMHhGRjdDLCAweDAxNjIsIDB4RkY3RCwgMHgwMTYzLAotICAgIDB4RkY3RSwgMHgwMTY0LCAweEZGN0YsIDB4MDE2NSwgMHhGRjgwLCAweDAxNjYsIDB4RkY4MSwgMHgwMTY3LAotICAgIDB4RkY4MiwgMHgwMTY4LCAweEZGODMsIDB4MDE2OSwgMHhGRjg0LCAweDAxNkEsIDB4RkY4NSwgMHgwMTZCLAotICAgIDB4RkY4NiwgMHgwMTZDLCAweEZGODcsIDB4MDE2RCwgMHhGRjg4LCAweDAxNkUsIDB4RkY4OSwgMHgwMTZGLAotICAgIDB4RkY4QSwgMHgwMTcwLCAweEZGOEIsIDB4MDE3MSwgMHhGRjhDLCAweDAxNzIsIDB4RkY4RCwgMHgwMTczLAotICAgIDB4RkY4RSwgMHgwMTc0LCAweEZGOEYsIDB4MDE3NSwgMHhGRjkwLCAweDAxNzYsIDB4RkY5MSwgMHgwMTc3LAotICAgIDB4RkY5MiwgMHgwMTc4LCAweEZGOTMsIDB4MDE3OSwgMHhGRjk0LCAweDAxN0EsIDB4RkY5NSwgMHgwMTdCLAotICAgIDB4RkY5NiwgMHgwMTdDLCAweEZGOTcsIDB4MDE3RCwgMHhGRjk4LCAweDAxN0UsIDB4RkY5OSwgMHgwMTdGLAotICAgIDB4RkY5QSwgMHgwMTgwLCAweEZGOUIsIDB4MDE4MSwgMHhGRjlDLCAweDAxODIsIDB4RkY5RCwgMHgwMTgzLAotICAgIDB4RkY5RSwgMHgwMTg0LCAweEZGOUYsIDB4MDE4NSwgMHhGRkUwLCAweDAyQzksIDB4RkZFMSwgMHgwMkNBLAotICAgIDB4RkZFMiwgMHgwMkVGLCAweEZGRTMsIDB4MDI4OSwgMHhGRkU0LCAweDFGNDUsIDB4RkZFNSwgMHgwMkM3LAotICAgIDB4RkZFOCwgMHgwMTQzLAotfTsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCBnX0ZYQ01BUF9VbmlKSVNfVVRGMTZfSF81X0RXb3JkWzM4NCAqIDNdID0gewotICAgIDB4RDg0MCwgMHhEQzBCLCAweDM2MEYsIDB4RDg0MCwgMHhEQzg5LCAweDQzNTEsIDB4RDg0MCwgMHhEQzhBLCAweDM3MUMsCi0gICAgMHhEODQwLCAweERDQTIsIDB4NDM1OCwgMHhEODQwLCAweERDQTQsIDB4NDM1QiwgMHhEODQwLCAweERDQjAsIDB4Mzc4MSwKLSAgICAweEQ4NDAsIDB4RENGNSwgMHg0RTU5LCAweEQ4NDAsIDB4REQ1OCwgMHg0RTZCLCAweEQ4NDAsIDB4RERBMiwgMHgzNjIxLAotICAgIDB4RDg0MCwgMHhERTEzLCAweDQzNkIsIDB4RDg0MCwgMHhERjJCLCAweDQzODIsIDB4RDg0MCwgMHhERjcxLCAweDQzOEIsCi0gICAgMHhEODQwLCAweERGODEsIDB4NDM4OSwgMHhEODQwLCAweERGRjksIDB4NDM4RiwgMHhEODQxLCAweERDNEEsIDB4NDM5MSwKLSAgICAweEQ4NDEsIDB4REQwOSwgMHg0MzkzLCAweEQ4NDEsIDB4RERCMSwgMHg0RTcwLCAweEQ4NDEsIDB4RERENiwgMHg0MzlDLAotICAgIDB4RDg0MSwgMHhERTExLCAweDM3RDYsIDB4RDg0MSwgMHhERTI4LCAweDM3MTksIDB4RDg0MSwgMHhERUVDLCAweDRFNzMsCi0gICAgMHhEODQxLCAweERGNEYsIDB4NDNBMCwgMHhEODQyLCAweERDMDcsIDB4NDNBNywgMHhEODQyLCAweERDM0EsIDB4NDNBOSwKLSAgICAweEQ4NDIsIDB4RENCOSwgMHg0M0FGLCAweEQ4NDIsIDB4REQwRSwgMHgzNEQzLCAweEQ4NDIsIDB4REQ3QywgMHg0M0IzLAotICAgIDB4RDg0MiwgMHhERDlELCAweDQzQjQsIDB4RDg0MiwgMHhERTY0LCAweDM1QkIsIDB4RDg0MiwgMHhERUQzLCAweDQzQjksCi0gICAgMHhEODQyLCAweERGMUQsIDB4NDNCQywgMHhEODQyLCAweERGOUYsIDB4MzVFQiwgMHhEODQyLCAweERGQjcsIDB4MzU4QSwKLSAgICAweEQ4NDMsIDB4REQ0NSwgMHg0M0NGLCAweEQ4NDMsIDB4REQ1OCwgMHg0RTdBLCAweEQ4NDMsIDB4RERFMSwgMHg0M0RELAotICAgIDB4RDg0MywgMHhERTY0LCAweDQzRUMsIDB4RDg0MywgMHhERTZELCAweDQzRTQsIDB4RDg0MywgMHhERTk1LCAweDQzRTMsCi0gICAgMHhEODQzLCAweERGNUYsIDB4NDNFRiwgMHhEODQ0LCAweERFMDEsIDB4NDQwNiwgMHhEODQ0LCAweERFM0QsIDB4MzY4MSwKLSAgICAweEQ4NDQsIDB4REU1NSwgMHg0NDA3LCAweEQ4NDQsIDB4REU3NCwgMHg0NDBELCAweEQ4NDQsIDB4REU3QiwgMHg0NDA5LAotICAgIDB4RDg0NCwgMHhERUQ3LCAweDQ0MTUsIDB4RDg0NCwgMHhERUU0LCAweDQ0MTQsIDB4RDg0NCwgMHhERUZELCAweDQ0MUIsCi0gICAgMHhEODQ0LCAweERGMUIsIDB4NDFCMCwgMHhEODQ0LCAweERGMzYsIDB4NDQxRCwgMHhEODQ0LCAweERGNDQsIDB4NDQxRSwKLSAgICAweEQ4NDQsIDB4REZDNCwgMHg0NDI5LCAweEQ4NDUsIDB4REM2RCwgMHg0NDM2LCAweEQ4NDUsIDB4REM2RSwgMHg0MUI1LAotICAgIDB4RDg0NSwgMHhEREQ3LCAweDQ0NDAsIDB4RDg0NSwgMHhERTQ3LCAweDQ0NDgsIDB4RDg0NSwgMHhERUI0LCAweDQxQzYsCi0gICAgMHhEODQ1LCAweERGMDYsIDB4NDQ1NCwgMHhEODQ1LCAweERGNDIsIDB4NDQ1NSwgMHhEODQ2LCAweERDQkQsIDB4NDFDMSwKLSAgICAweEQ4NDYsIDB4RERDMywgMHg0NDc1LCAweEQ4NDYsIDB4REUxQSwgMHgxRTkxLCAweEQ4NDcsIDB4REM1NiwgMHg0NDgzLAotICAgIDB4RDg0NywgMHhERDJELCAweDQ0ODgsIDB4RDg0NywgMHhERDQ1LCAweDQ0ODksIDB4RDg0NywgMHhERDYyLCAweDQ0OEIsCi0gICAgMHhEODQ3LCAweERENzgsIDB4NDQ4QSwgMHhEODQ3LCAweEREOTIsIDB4NDQ5NCwgMHhEODQ3LCAweEREOUMsIDB4NDQ5MCwKLSAgICAweEQ4NDcsIDB4RERBMSwgMHg0NDhGLCAweEQ4NDcsIDB4RERCNywgMHg0NDk3LCAweEQ4NDcsIDB4RERFMCwgMHg0NDk5LAotICAgIDB4RDg0NywgMHhERTMzLCAweDQ0OUEsIDB4RDg0NywgMHhERTM0LCAweDQxQ0QsIDB4RDg0NywgMHhERjFFLCAweDQ0QTcsCi0gICAgMHhEODQ3LCAweERGNzYsIDB4NDRBRSwgMHhEODQ3LCAweERGRkEsIDB4NDRCMSwgMHhEODQ4LCAweEREN0IsIDB4NDRCRiwKLSAgICAweEQ4NDgsIDB4REUxOCwgMHg0QUExLCAweEQ4NDgsIDB4REYxRSwgMHg0NEM1LCAweEQ4NDgsIDB4REZBRCwgMHg0NEM4LAotICAgIDB4RDg0OSwgMHhERTA5LCAweDNDNTMsIDB4RDg0OSwgMHhERUYzLCAweDQ0RTAsIDB4RDg0QSwgMHhEQzVCLCAweDQ0RUYsCi0gICAgMHhEODRBLCAweERDQUIsIDB4NDRGNSwgMHhEODRBLCAweEREOEYsIDB4NDRGOSwgMHhEODRBLCAweERFQjgsIDB4NDUwMywKLSAgICAweEQ4NEEsIDB4REY0NiwgMHg0NTEwLCAweEQ4NEEsIDB4REY0RiwgMHg0NTA3LCAweEQ4NEEsIDB4REY1MCwgMHg0NTA4LAotICAgIDB4RDg0QSwgMHhERkE2LCAweDQ1MTMsIDB4RDg0QiwgMHhEQzFELCAweDQ1MTIsIDB4RDg0QiwgMHhEQzI0LCAweDQ1MTYsCi0gICAgMHhEODRCLCAweERERTEsIDB4NDUyRSwgMHhEODRCLCAweERFNDIsIDB4NEU5QywgMHhEODRCLCAweERGRUIsIDB4NEVBMiwKLSAgICAweEQ4NEMsIDB4RERCNiwgMHg0NTUwLCAweEQ4NEMsIDB4RERDMywgMHg0NTRFLCAweEQ4NEMsIDB4RERDNCwgMHg0MUY4LAotICAgIDB4RDg0QywgMHhEREY1LCAweDQ1NEYsIDB4RDg0QywgMHhERjcyLCAweDQ1NjEsIDB4RDg0QywgMHhERkQwLCAweDQ1NjgsCi0gICAgMHhEODRDLCAweERGRDIsIDB4NDU2NCwgMHhEODRDLCAweERGRDMsIDB4NDU2MywgMHhEODRDLCAweERGRDUsIDB4NDU2QSwKLSAgICAweEQ4NEMsIDB4REZEQSwgMHg0NTZDLCAweEQ4NEMsIDB4REZERiwgMHg0NTZFLCAweEQ4NEMsIDB4REZFNCwgMHg0NTY5LAotICAgIDB4RDg0QywgMHhERkZFLCAweDNDM0UsIDB4RDg0RCwgMHhEQzRBLCAweDQ1NzYsIDB4RDg0RCwgMHhEQzRCLCAweDQ1NzgsCi0gICAgMHhEODRELCAweERDNTEsIDB4NDU3NywgMHhEODRELCAweERDNjUsIDB4NDU3QywgMHhEODRELCAweERDRTQsIDB4NDU5NiwKLSAgICAweEQ4NEQsIDB4REQ1QSwgMHg0NTk3LCAweEQ4NEQsIDB4REQ5NCwgMHg0NUEzLCAweEQ4NEQsIDB4RERDNCwgMHg0MjA5LAotICAgIDB4RDg0RCwgMHhERTM4LCAweDQ1QjMsIDB4RDg0RCwgMHhERTM5LCAweDQ1QjEsIDB4RDg0RCwgMHhERTNBLCAweDNDMjEsCi0gICAgMHhEODRELCAweERFNDcsIDB4NDVCMiwgMHhEODRELCAweERGMEMsIDB4NDVDNywgMHhEODRELCAweERGMUMsIDB4NDVCRSwKLSAgICAweEQ4NEQsIDB4REYzRiwgMHg0MjEyLCAweEQ4NEQsIDB4REY2MywgMHg0MjE0LCAweEQ4NEQsIDB4REY2NCwgMHg0NUNCLAotICAgIDB4RDg0RCwgMHhERkU3LCAweDQ1RDMsIDB4RDg0RCwgMHhERkZGLCAweDQ1RDIsIDB4RDg0RSwgMHhEQzI0LCAweDQ1RDgsCi0gICAgMHhEODRFLCAweERDM0QsIDB4NDVERCwgMHhEODRFLCAweERFOTgsIDB4NDVFOSwgMHhEODRGLCAweERDN0YsIDB4NDVGNiwKLSAgICAweEQ4NEYsIDB4RENCRSwgMHgzN0Q1LCAweEQ4NEYsIDB4RENGRSwgMHgzNjUwLCAweEQ4NEYsIDB4REQwMCwgMHg0NjA1LAotICAgIDB4RDg0RiwgMHhERDBFLCAweDQ3REEsIDB4RDg0RiwgMHhERDQwLCAweDQ2MTYsIDB4RDg0RiwgMHhEREQzLCAweDQ2MTksCi0gICAgMHhEODRGLCAweERERjksIDB4NDYxOCwgMHhEODRGLCAweERERkEsIDB4NDYxNywgMHhEODRGLCAweERGN0UsIDB4NDYzRiwKLSAgICAweEQ4NTAsIDB4REM0QiwgMHg0RUM4LCAweEQ4NTAsIDB4REM5NiwgMHg0NjRFLCAweEQ4NTAsIDB4REQwMywgMHg0NjUzLAotICAgIDB4RDg1MCwgMHhEREM2LCAweDQ2NUYsIDB4RDg1MCwgMHhEREZFLCAweDQ2NjIsIDB4RDg1MCwgMHhERUVFLCAweDM3Q0EsCi0gICAgMHhEODUwLCAweERGQkMsIDB4NDY3NywgMHhEODUwLCAweERGRDAsIDB4MUU5RSwgMHhEODUxLCAweERFMjksIDB4NDY4MSwKLSAgICAweEQ4NTEsIDB4REVBNSwgMHg0Njg3LCAweEQ4NTEsIDB4REZGMSwgMHg0MjRBLCAweEQ4NTIsIDB4REM5NiwgMHg0NjlELAotICAgIDB4RDg1MiwgMHhERTRELCAweDQ2QjgsIDB4RDg1MiwgMHhERjU2LCAweDQ2QzUsIDB4RDg1MiwgMHhERjZGLCAweDQ2QzcsCi0gICAgMHhEODUzLCAweERDMTYsIDB4NDZDQywgMHhEODUzLCAweEREMTQsIDB4MzZBQiwgMHhEODUzLCAweERFMDQsIDB4NEU1QSwKLSAgICAweEQ4NTMsIDB4REUwRSwgMHg0NkVFLCAweEQ4NTMsIDB4REUzNywgMHg0NkYyLCAweEQ4NTMsIDB4REU2QSwgMHg0NkY3LAotICAgIDB4RDg1MywgMHhERThCLCAweDQ2RkEsIDB4RDg1MywgMHhERkYyLCAweDRFNUIsIDB4RDg1NCwgMHhEQzRBLCAweDQ3MDUsCi0gICAgMHhEODU0LCAweERDNTUsIDB4NDcwNywgMHhEODU0LCAweEREMjIsIDB4NDcwOSwgMHhEODU0LCAweEREQTksIDB4NDcwRSwKLSAgICAweEQ4NTQsIDB4RERDRCwgMHg0NzExLCAweEQ4NTQsIDB4RERFNSwgMHg0NzEwLCAweEQ4NTQsIDB4REUxRSwgMHg0NzEzLAotICAgIDB4RDg1NCwgMHhERTRDLCAweDQ3MTUsIDB4RDg1NSwgMHhEQzJFLCAweDQ3MjEsIDB4RDg1NSwgMHhEQzhFLCAweDQyNkQsCi0gICAgMHhEODU1LCAweERDRDksIDB4NDcyOSwgMHhEODU1LCAweEREMEUsIDB4NDI3MSwgMHhEODU1LCAweEREQTcsIDB4NDczNSwKLSAgICAweEQ4NTUsIDB4REU3RiwgMHgzNkZCLCAweEQ4NTUsIDB4REY3MSwgMHg0MjdBLCAweEQ4NTUsIDB4REZBOSwgMHg0NzQ4LAotICAgIDB4RDg1NSwgMHhERkI0LCAweDQ3NDksIDB4RDg1NiwgMHhEQzc0LCAweDFERjYsIDB4RDg1NiwgMHhEREM0LCAweDQyODAsCi0gICAgMHhEODU2LCAweEREQ0MsIDB4NEU5MCwgMHhEODU2LCAweERERDQsIDB4NDc1QywgMHhEODU2LCAweERFRTMsIDB4NDc2NSwKLSAgICAweEQ4NTYsIDB4REVFNCwgMHg0NzY0LCAweEQ4NTYsIDB4REVGMSwgMHg0NzY2LCAweEQ4NTYsIDB4REZCMiwgMHg0Nzc1LAotICAgIDB4RDg1NywgMHhEQzRCLCAweDQ3N0UsIDB4RDg1NywgMHhEQzY0LCAweDQ3N0YsIDB4RDg1NywgMHhEREExLCAweDQyODksCi0gICAgMHhEODU3LCAweERFMkUsIDB4NDc4RSwgMHhEODU3LCAweERFNTYsIDB4NDc4RiwgMHhEODU3LCAweERFNjIsIDB4NDc5MiwKLSAgICAweEQ4NTcsIDB4REU2NSwgMHg0NzkwLCAweEQ4NTcsIDB4REVDMiwgMHg0Nzk3LCAweEQ4NTcsIDB4REVEOCwgMHg0Nzk1LAotICAgIDB4RDg1NywgMHhERUU4LCAweDQ3OTksIDB4RDg1NywgMHhERjIzLCAweDQ3OUEsIDB4RDg1NywgMHhERjVDLCAweDQ3OUMsCi0gICAgMHhEODU3LCAweERGRDQsIDB4NDdBMywgMHhEODU3LCAweERGRTAsIDB4NDdBMiwgMHhEODU3LCAweERGRkIsIDB4NDdBOSwKLSAgICAweEQ4NTgsIDB4REMwQywgMHg0N0E4LCAweEQ4NTgsIDB4REMxNywgMHg0N0IwLCAweEQ4NTgsIDB4REM2MCwgMHg0N0IzLAotICAgIDB4RDg1OCwgMHhEQ0VELCAweDQ3QkQsIDB4RDg1OCwgMHhERTcwLCAweDQ3RDEsIDB4RDg1OCwgMHhERTg2LCAweDQ3RDIsCi0gICAgMHhEODU4LCAweERGNEMsIDB4NEY1NywgMHhEODU5LCAweERDMDIsIDB4NDdERSwgMHhEODU5LCAweERFN0UsIDB4NDdGMCwKLSAgICAweEQ4NTksIDB4REVCMCwgMHgzNzE0LCAweEQ4NTksIDB4REYxRCwgMHg0N0ZFLCAweEQ4NUEsIDB4RENERCwgMHg0ODBDLAotICAgIDB4RDg1QSwgMHhEQ0VBLCAweDQ4MEUsIDB4RDg1QSwgMHhERDUxLCAweDM1NEUsIDB4RDg1QSwgMHhERDZGLCAweDQ4MTIsCi0gICAgMHhEODVBLCAweEREOTksIDB4MzczNiwgMHhEODVBLCAweEREREQsIDB4NDgxNCwgMHhEODVBLCAweERFMUUsIDB4NDgxNywKLSAgICAweEQ4NUEsIDB4REU1OCwgMHg0ODFCLCAweEQ4NUEsIDB4REU4QywgMHg0ODFGLCAweEQ4NUEsIDB4REVCNywgMHg0ODIyLAotICAgIDB4RDg1QSwgMHhERUZGLCAweDQyQTcsIDB4RDg1QiwgMHhEQzI5LCAweDQ0NDYsIDB4RDg1QiwgMHhEQzczLCAweDQ4NEEsCi0gICAgMHhEODVCLCAweERDOUUsIDB4NEVFRSwgMHhEODVCLCAweERDREQsIDB4NDg1MywgMHhEODVCLCAweERFNDAsIDB4NDJDMSwKLSAgICAweEQ4NUIsIDB4REU2NSwgMHg0ODYwLCAweEQ4NUIsIDB4REY5NCwgMHg0ODcwLCAweEQ4NUIsIDB4REZGNiwgMHg0ODdBLAotICAgIDB4RDg1QiwgMHhERkY3LCAweDQ4N0IsIDB4RDg1QiwgMHhERkY4LCAweDQ4NzksIDB4RDg1QywgMHhEQ0Y0LCAweDQyQ0YsCi0gICAgMHhEODVDLCAweEREMEQsIDB4NDg4QiwgMHhEODVDLCAweEREMzksIDB4NDg4RSwgMHhEODVDLCAweERGREEsIDB4NDhCMywKLSAgICAweEQ4NUMsIDB4REZEQiwgMHg0OEIyLCAweEQ4NUMsIDB4REZGRSwgMHg0OEI5LCAweEQ4NUQsIDB4REMxMCwgMHg0OEJDLAotICAgIDB4RDg1RCwgMHhEQzQ5LCAweDQ4QzAsIDB4RDg1RCwgMHhERTE0LCAweDQ4Q0UsIDB4RDg1RCwgMHhERTE1LCAweDQ4Q0QsCi0gICAgMHhEODVELCAweERFMzEsIDB4NDhEMCwgMHhEODVELCAweERFODQsIDB4NDJERCwgMHhEODVELCAweERFOTMsIDB4NDhENSwKLSAgICAweEQ4NUQsIDB4REYwRSwgMHg0OERBLCAweEQ4NUQsIDB4REYyMywgMHg0OERDLCAweEQ4NUQsIDB4REY1MiwgMHg0OEUwLAotICAgIDB4RDg1RSwgMHhERDg1LCAweDQ4RjAsIDB4RDg1RSwgMHhEREI0LCAweDRFQTUsIDB4RDg1RSwgMHhERTg0LCAweDQ4RkMsCi0gICAgMHhEODVFLCAweERGQjMsIDB4NDkwQiwgMHhEODVFLCAweERGQkUsIDB4NDkwRCwgMHhEODVFLCAweERGQzcsIDB4NDkwRSwKLSAgICAweEQ4NUYsIDB4REMzQywgMHg0RUZDLCAweEQ4NUYsIDB4RENCOCwgMHg0OTE0LCAweEQ4NUYsIDB4REQ3MywgMHg0RTVDLAotICAgIDB4RDg1RiwgMHhEREEwLCAweDQ5MUMsIDB4RDg1RiwgMHhERTEwLCAweDQ5MUUsIDB4RDg1RiwgMHhERkI3LCAweDM2NEEsCi0gICAgMHhEODYwLCAweERDOEEsIDB4NDkyNywgMHhEODYwLCAweERDQkIsIDB4NDkyRCwgMHhEODYwLCAweERFNzcsIDB4NDJGNCwKLSAgICAweEQ4NjAsIDB4REU4MiwgMHg0OTM5LCAweEQ4NjAsIDB4REVGMywgMHg0OTNCLCAweEQ4NjAsIDB4REZDRCwgMHg0MkZBLAotICAgIDB4RDg2MSwgMHhEQzBDLCAweDQ5NDIsIDB4RDg2MSwgMHhEQzU1LCAweDQ5NDUsIDB4RDg2MSwgMHhERDZCLCAweDQ5NTIsCi0gICAgMHhEODYxLCAweEREQzgsIDB4NDk1NSwgMHhEODYxLCAweEREQzksIDB4NDk1NiwgMHhEODYxLCAweERFRDcsIDB4NDk2MCwKLSAgICAweEQ4NjEsIDB4REVGQSwgMHg0OTYzLCAweEQ4NjIsIDB4REQ0NiwgMHg0OTdDLCAweEQ4NjIsIDB4REQ0OSwgMHg0OTdCLAotICAgIDB4RDg2MiwgMHhERDZCLCAweDQ5ODEsIDB4RDg2MiwgMHhERDg3LCAweDM3QUQsIDB4RDg2MiwgMHhERDg4LCAweDQ5ODgsCi0gICAgMHhEODYyLCAweEREQkEsIDB4NDk5MiwgMHhEODYyLCAweEREQkIsIDB4NDk5MywgMHhEODYyLCAweERFMUUsIDB4NDk5QiwKLSAgICAweEQ4NjIsIDB4REUyOSwgMHg0OTlDLCAweEQ4NjIsIDB4REU0MywgMHg0OUEwLCAweEQ4NjIsIDB4REU3MSwgMHg0OTlGLAotICAgIDB4RDg2MiwgMHhERTk5LCAweDQ5QTcsIDB4RDg2MiwgMHhERUNELCAweDQ5QTgsIDB4RDg2MiwgMHhERURELCAweDQ5QUYsCi0gICAgMHhEODYyLCAweERFRTQsIDB4NDlBRSwgMHhEODYyLCAweERGQzEsIDB4NDlCQSwgMHhEODYyLCAweERGRUYsIDB4NDlCQiwKLSAgICAweEQ4NjMsIDB4RENERCwgMHgxREQ5LCAweEQ4NjMsIDB4REQxMCwgMHg0OUMyLCAweEQ4NjMsIDB4REQ3MSwgMHg0OUMzLAotICAgIDB4RDg2MywgMHhEREZCLCAweDQ5QzUsIDB4RDg2MywgMHhERTE3LCAweDM3QjAsIDB4RDg2MywgMHhERTFGLCAweDQ5QzYsCi0gICAgMHhEODYzLCAweERFMzYsIDB4NDlDQSwgMHhEODYzLCAweERFODksIDB4NDlDRCwgMHhEODYzLCAweERFRUIsIDB4NDlDRiwKLSAgICAweEQ4NjMsIDB4REVGNiwgMHgxREY5LCAweEQ4NjMsIDB4REYzMiwgMHg0OUQxLCAweEQ4NjMsIDB4REZGOCwgMHg0OUQ3LAotICAgIDB4RDg2NCwgMHhERUEwLCAweDQ5RTUsIDB4RDg2NCwgMHhERUIxLCAweDQ5RTYsIDB4RDg2NSwgMHhEQzkwLCAweDQ5RjcsCi0gICAgMHhEODY1LCAweEREQ0YsIDB4NEEwMCwgMHhEODY1LCAweERFN0YsIDB4MzYxOSwgMHhEODY1LCAweERFRjAsIDB4NEEwRiwKLSAgICAweEQ4NjUsIDB4REYxOSwgMHg0QTEyLCAweEQ4NjUsIDB4REY1MCwgMHg0QTE2LCAweEQ4NjYsIDB4RENDNiwgMHg0QTI3LAotICAgIDB4RDg2NiwgMHhERTcyLCAweDRBMzksIDB4RDg2NywgMHhERDRCLCAweDM1OTUsIDB4RDg2NywgMHhERERCLCAweDRBNTIsCi0gICAgMHhEODY3LCAweERFMTUsIDB4NEE1QywgMHhEODY3LCAweERFM0QsIDB4NEY1QiwgMHhEODY3LCAweERFNDksIDB4NEE1RSwKLSAgICAweEQ4NjcsIDB4REU4QSwgMHg0QTVELCAweEQ4NjcsIDB4REVDNCwgMHg0QTY2LCAweEQ4NjcsIDB4REVEQiwgMHg0QTZFLAotICAgIDB4RDg2NywgMHhERUU5LCAweDRBNkIsIDB4RDg2NywgMHhERkNFLCAweDRBN0YsIDB4RDg2NywgMHhERkQ3LCAweDRBN0YsCi0gICAgMHhEODY4LCAweERDMUEsIDB4NEE4NSwgMHhEODY4LCAweERDMkYsIDB4NEE4MywgMHhEODY4LCAweERDODIsIDB4NEE4QywKLSAgICAweEQ4NjgsIDB4RENGOSwgMHg0QThCLCAweEQ4NjgsIDB4REQ5MCwgMHg0MzRCLCAweEQ4NjgsIDB4REVCMiwgMHg0RTY4LAotICAgIDB4RDg2OCwgMHhERjhDLCAweDRBQTUsIDB4RDg2OSwgMHhEQzM3LCAweDRBQTcsIDB4RDg2OSwgMHhEREYxLCAweDRBQjMsCi0gICAgMHhEODY5LCAweERFMDIsIDB4NEFCNSwgMHhEODY5LCAweERFMUEsIDB4NEY1QywgMHhEODY5LCAweERFQjIsIDB4NEFCOSwKLSAgICAweEQ4N0UsIDB4REMwNCwgMHgzQzFDLCAweEQ4N0UsIDB4REMwRiwgMHgxRTg2LCAweEQ4N0UsIDB4REMxNSwgMHg0RTVELAotICAgIDB4RDg3RSwgMHhEQzE4LCAweDFFODksIDB4RDg3RSwgMHhEQzFBLCAweDM2ODIsIDB4RDg3RSwgMHhEQzIyLCAweDM1NzQsCi0gICAgMHhEODdFLCAweERDMjgsIDB4MzVFRiwgMHhEODdFLCAweERDMkMsIDB4MzcxRCwgMHhEODdFLCAweERDMzMsIDB4MzU5NywKLSAgICAweEQ4N0UsIDB4REMzRiwgMHgzNUY3LCAweEQ4N0UsIDB4REM0NiwgMHg0RTVFLCAweEQ4N0UsIDB4REM1MiwgMHgzNjExLAotICAgIDB4RDg3RSwgMHhEQzYyLCAweDM2QUUsIDB4RDg3RSwgMHhEQzZELCAweDM3MjksIDB4RDg3RSwgMHhEQzczLCAweDM2MDgsCi0gICAgMHhEODdFLCAweERDNzcsIDB4MUU0QSwgMHhEODdFLCAweERDODQsIDB4MUUzNiwgMHhEODdFLCAweERDOTksIDB4NEU1RiwKLSAgICAweEQ4N0UsIDB4REM5QSwgMHgzNjY4LCAweEQ4N0UsIDB4RENBNiwgMHg0RTYwLCAweEQ4N0UsIDB4RENBQywgMHgzNUI2LAotICAgIDB4RDg3RSwgMHhEQ0IyLCAweDM2MkIsIDB4RDg3RSwgMHhEQ0I2LCAweDM3MzEsIDB4RDg3RSwgMHhEQ0QzLCAweDFFODgsCi0gICAgMHhEODdFLCAweERDREIsIDB4MzczQywgMHhEODdFLCAweERDREMsIDB4MUUwRiwgMHhEODdFLCAweERDRTEsIDB4MzdEMywKLSAgICAweEQ4N0UsIDB4RENFNSwgMHg0RTYxLCAweEQ4N0UsIDB4RENFQSwgMHgzNTZGLCAweEQ4N0UsIDB4RENFRCwgMHgxREYxLAotICAgIDB4RDg3RSwgMHhEQ0ZDLCAweDM1NTgsIDB4RDg3RSwgMHhERDAzLCAweDM1QzgsIDB4RDg3RSwgMHhERDBCLCAweDM1RTksCi0gICAgMHhEODdFLCAweEREMEYsIDB4MzY2QywgMHhEODdFLCAweEREMUEsIDB4MzY1QywgMHhEODdFLCAweEREMjAsIDB4MUU5RiwKLSAgICAweEQ4N0UsIDB4REQyMSwgMHgzNUYxLCAweEQ4N0UsIDB4REQ0NSwgMHgzNDJELCAweEQ4N0UsIDB4REQ0NywgMHgzNjFFLAotICAgIDB4RDg3RSwgMHhERDZDLCAweDM3NjQsIDB4RDg3RSwgMHhERDk1LCAweDM1NjYsIDB4RDg3RSwgMHhEREQwLCAweDM2RjQsCi0gICAgMHhEODdFLCAweEREREUsIDB4NEU2MiwgMHhEODdFLCAweEREREYsIDB4MzZGNSwgMHhEODdFLCAweERERjQsIDB4M0JBNSwKLX07CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1VuaUpJUy1VVEYxNi1WXzUuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9VbmlKSVMtVVRGMTYtVl81LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAwNzNkNy4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1VuaUpJUy1VVEYxNi1WXzUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0IGdfRlhDTUFQX1VuaUpJU19VVEYxNl9WXzVbMjg5ICogMl0gPSB7Ci0gICAgMHgwMEIwLCAweDIwNEQsIDB4MjAxMCwgMHgxRUQ1LCAweDIwMTUsIDB4MUVENCwgMHgyMDE2LCAweDFFRDcsCi0gICAgMHgyMDI1LCAweDFFREEsIDB4MjAyNiwgMHgxRUQ5LCAweDIwMzIsIDB4MjA1MSwgMHgyMDMzLCAweDIwNUIsCi0gICAgMHgyMTkwLCAweDAyRTIsIDB4MjE5MSwgMHgwMkUwLCAweDIxOTIsIDB4MDJFMywgMHgyMTkzLCAweDAyRTEsCi0gICAgMHgyMUM0LCAweDIwNzcsIDB4MjFDNSwgMHgyMDc2LCAweDIxQzYsIDB4MjA3OCwgMHgyMUU2LCAweDFGNEMsCi0gICAgMHgyMUU3LCAweDFGNEUsIDB4MjFFOCwgMHgxRjRCLCAweDIxRTksIDB4MUY0RCwgMHgyMzlCLCAweDJGNzQsCi0gICAgMHgyMzlDLCAweDJGODgsIDB4MjM5RCwgMHgyRjczLCAweDIzOUUsIDB4MkY3NiwgMHgyMzlGLCAweDJGODgsCi0gICAgMHgyM0EwLCAweDJGNzUsIDB4MjNBMSwgMHgyRjdDLCAweDIzQTIsIDB4MkY4OCwgMHgyM0EzLCAweDJGN0IsCi0gICAgMHgyM0E0LCAweDJGN0UsIDB4MjNBNSwgMHgyRjg4LCAweDIzQTYsIDB4MkY3RCwgMHgyM0E3LCAweDFGRTgsCi0gICAgMHgyM0E4LCAweDFGRTcsIDB4MjNBOSwgMHgxRkU2LCAweDIzQUEsIDB4MkY4OCwgMHgyM0FCLCAweDFGRUMsCi0gICAgMHgyM0FDLCAweDFGRUIsIDB4MjNBRCwgMHgxRkVBLCAweDIzQjAsIDB4M0ZERSwgMHgyM0IxLCAweDNGREYsCi0gICAgMHgyNTAwLCAweDFEMzksIDB4MjUwMSwgMHgxRDNBLCAweDI1MDIsIDB4MUQzNywgMHgyNTAzLCAweDFEMzgsCi0gICAgMHgyNTA0LCAweDFEM0QsIDB4MjUwNSwgMHgxRDNFLCAweDI1MDYsIDB4MUQzQiwgMHgyNTA3LCAweDFEM0MsCi0gICAgMHgyNTA4LCAweDFENDEsIDB4MjUwOSwgMHgxRDQyLCAweDI1MEEsIDB4MUQzRiwgMHgyNTBCLCAweDFENDAsCi0gICAgMHgyNTBDLCAweDFENDcsIDB4MjUwRCwgMHgxRDQ5LCAweDI1MEUsIDB4MUQ0OCwgMHgyNTBGLCAweDFENEEsCi0gICAgMHgyNTEwLCAweDFENEYsIDB4MjUxMSwgMHgxRDUxLCAweDI1MTIsIDB4MUQ1MCwgMHgyNTEzLCAweDFENTIsCi0gICAgMHgyNTE0LCAweDFENDMsIDB4MjUxNSwgMHgxRDQ1LCAweDI1MTYsIDB4MUQ0NCwgMHgyNTE3LCAweDFENDYsCi0gICAgMHgyNTE4LCAweDFENEIsIDB4MjUxOSwgMHgxRDRELCAweDI1MUEsIDB4MUQ0QywgMHgyNTFCLCAweDFENEUsCi0gICAgMHgyNTFDLCAweDFENjMsIDB4MjUxRCwgMHgxRDY3LCAweDI1MUUsIDB4MUQ2NSwgMHgyNTFGLCAweDFENjQsCi0gICAgMHgyNTIwLCAweDFENjYsIDB4MjUyMSwgMHgxRDY5LCAweDI1MjIsIDB4MUQ2OCwgMHgyNTIzLCAweDFENkEsCi0gICAgMHgyNTI0LCAweDFENkIsIDB4MjUyNSwgMHgxRDZGLCAweDI1MjYsIDB4MUQ2RCwgMHgyNTI3LCAweDFENkMsCi0gICAgMHgyNTI4LCAweDFENkUsIDB4MjUyOSwgMHgxRDcxLCAweDI1MkEsIDB4MUQ3MCwgMHgyNTJCLCAweDFENzIsCi0gICAgMHgyNTJDLCAweDFENUIsIDB4MjUyRCwgMHgxRDVELCAweDI1MkUsIDB4MUQ1RSwgMHgyNTJGLCAweDFENUYsCi0gICAgMHgyNTMwLCAweDFENUMsIDB4MjUzMSwgMHgxRDYwLCAweDI1MzIsIDB4MUQ2MSwgMHgyNTMzLCAweDFENjIsCi0gICAgMHgyNTM0LCAweDFENTMsIDB4MjUzNSwgMHgxRDU1LCAweDI1MzYsIDB4MUQ1NiwgMHgyNTM3LCAweDFENTcsCi0gICAgMHgyNTM4LCAweDFENTQsIDB4MjUzOSwgMHgxRDU4LCAweDI1M0EsIDB4MUQ1OSwgMHgyNTNCLCAweDFENUEsCi0gICAgMHgyNTNELCAweDFENzcsIDB4MjUzRSwgMHgxRDc4LCAweDI1M0YsIDB4MUQ3OSwgMHgyNTQwLCAweDFENzUsCi0gICAgMHgyNTQxLCAweDFENzQsIDB4MjU0MiwgMHgxRDc2LCAweDI1NDMsIDB4MUQ3QiwgMHgyNTQ0LCAweDFEN0QsCi0gICAgMHgyNTQ1LCAweDFEN0EsIDB4MjU0NiwgMHgxRDdDLCAweDI1NDcsIDB4MUQ4MSwgMHgyNTQ4LCAweDFEODAsCi0gICAgMHgyNTQ5LCAweDFEN0UsIDB4MjU0QSwgMHgxRDdGLCAweDI2MUMsIDB4MjAxRCwgMHgyNjFELCAweDIwMUIsCi0gICAgMHgyNjFFLCAweDIwMUUsIDB4MjYxRiwgMHgyMDFDLCAweDI3MDIsIDB4MkY5MiwgMHgyN0ExLCAweDIwMTEsCi0gICAgMHgzMDAxLCAweDFFQ0YsIDB4MzAwMiwgMHgxRUQwLCAweDMwMDgsIDB4MUVFMywgMHgzMDA5LCAweDFFRTQsCi0gICAgMHgzMDBBLCAweDFFRTUsIDB4MzAwQiwgMHgxRUU2LCAweDMwMEMsIDB4MUVFNywgMHgzMDBELCAweDFFRTgsCi0gICAgMHgzMDBFLCAweDFFRTksIDB4MzAwRiwgMHgxRUVBLCAweDMwMTAsIDB4MUVFQiwgMHgzMDExLCAweDFFRUMsCi0gICAgMHgzMDE0LCAweDFFREQsIDB4MzAxNSwgMHgxRURFLCAweDMwMTYsIDB4M0ZDOSwgMHgzMDE3LCAweDNGQ0EsCi0gICAgMHgzMDE4LCAweDJGNkIsIDB4MzAxOSwgMHgyRjZDLCAweDMwMUMsIDB4MUVENiwgMHgzMDFELCAweDFGMTQsCi0gICAgMHgzMDFGLCAweDFGMTUsIDB4MzAzQiwgMHgyRjRCLCAweDMwNDEsIDB4MUVFRSwgMHgzMDQzLCAweDFFRUYsCi0gICAgMHgzMDQ1LCAweDFFRjAsIDB4MzA0NywgMHgxRUYxLCAweDMwNDksIDB4MUVGMiwgMHgzMDYzLCAweDFFRjMsCi0gICAgMHgzMDgzLCAweDFFRjQsIDB4MzA4NSwgMHgxRUY1LCAweDMwODcsIDB4MUVGNiwgMHgzMDhFLCAweDFFRjcsCi0gICAgMHgzMDk1LCAweDIwNDgsIDB4MzA5NiwgMHgyMDQ5LCAweDMwOUIsIDB4MjA1MCwgMHgzMDlDLCAweDIwNEYsCi0gICAgMHgzMEEwLCAweDNGQ0IsIDB4MzBBMSwgMHgxRUY4LCAweDMwQTMsIDB4MUVGOSwgMHgzMEE1LCAweDFFRkEsCi0gICAgMHgzMEE3LCAweDFFRkIsIDB4MzBBOSwgMHgxRUZDLCAweDMwQzMsIDB4MUVGRCwgMHgzMEUzLCAweDFFRkUsCi0gICAgMHgzMEU1LCAweDFFRkYsIDB4MzBFNywgMHgxRjAwLCAweDMwRUUsIDB4MUYwMSwgMHgzMEY1LCAweDFGMDIsCi0gICAgMHgzMEY2LCAweDFGMDMsIDB4MzBGQywgMHgxRUQzLCAweDMxRjAsIDB4M0ZDRCwgMHgzMUYxLCAweDNGQ0UsCi0gICAgMHgzMUYyLCAweDNGQ0YsIDB4MzFGMywgMHgzRkQwLCAweDMxRjQsIDB4M0ZEMSwgMHgzMUY1LCAweDNGRDIsCi0gICAgMHgzMUY2LCAweDNGRDMsIDB4MzFGNywgMHgzRkQ0LCAweDMxRjgsIDB4M0ZENSwgMHgzMUY5LCAweDNGRDYsCi0gICAgMHgzMUZBLCAweDNGRDgsIDB4MzFGQiwgMHgzRkQ5LCAweDMxRkMsIDB4M0ZEQSwgMHgzMUZELCAweDNGREIsCi0gICAgMHgzMUZFLCAweDNGREMsIDB4MzFGRiwgMHgzRkRELCAweDMzMDAsIDB4MjA5RSwgMHgzMzAxLCAweDJFQjYsCi0gICAgMHgzMzAyLCAweDJFQjcsIDB4MzMwMywgMHgyMDkyLCAweDMzMDQsIDB4MkVCOCwgMHgzMzA1LCAweDIwOEQsCi0gICAgMHgzMzA2LCAweDJFQjksIDB4MzMwNywgMHgyRUJELCAweDMzMDgsIDB4MkVCQiwgMHgzMzA5LCAweDJFQzAsCi0gICAgMHgzMzBBLCAweDJFQkUsIDB4MzMwQiwgMHgyRUMyLCAweDMzMEMsIDB4MkVDNCwgMHgzMzBELCAweDFGMEUsCi0gICAgMHgzMzBFLCAweDJFQzUsIDB4MzMwRiwgMHgyRUM2LCAweDMzMTAsIDB4MkVDNywgMHgzMzExLCAweDJFQzgsCi0gICAgMHgzMzEyLCAweDJFQzksIDB4MzMxMywgMHgyRUNBLCAweDMzMTQsIDB4MUYwNSwgMHgzMzE1LCAweDIwOTQsCi0gICAgMHgzMzE2LCAweDIwOEEsIDB4MzMxNywgMHgyRUNDLCAweDMzMTgsIDB4MjA5MywgMHgzMzE5LCAweDJFQ0UsCi0gICAgMHgzMzFBLCAweDJFRDAsIDB4MzMxQiwgMHgyRUQxLCAweDMzMUMsIDB4MkVEMiwgMHgzMzFELCAweDJFRDMsCi0gICAgMHgzMzFFLCAweDIwQTEsIDB4MzMxRiwgMHgyRUQ0LCAweDMzMjAsIDB4MkVENSwgMHgzMzIxLCAweDJFRDYsCi0gICAgMHgzMzIyLCAweDIwODksIDB4MzMyMywgMHgyMDlDLCAweDMzMjQsIDB4MkVENywgMHgzMzI1LCAweDJFRDksCi0gICAgMHgzMzI2LCAweDFGMEYsIDB4MzMyNywgMHgxRjA5LCAweDMzMjgsIDB4MkVEQywgMHgzMzI5LCAweDJFREQsCi0gICAgMHgzMzJBLCAweDIwQTQsIDB4MzMyQiwgMHgxRjExLCAweDMzMkQsIDB4MkVERiwgMHgzMzJFLCAweDJFRTIsCi0gICAgMHgzMzJGLCAweDJFRTMsIDB4MzMzMCwgMHgyRUU0LCAweDMzMzEsIDB4MjBBNiwgMHgzMzMyLCAweDJFRTUsCi0gICAgMHgzMzMzLCAweDIwOEUsIDB4MzMzNCwgMHgyRUU4LCAweDMzMzUsIDB4MkVFOSwgMHgzMzM2LCAweDFGMEIsCi0gICAgMHgzMzM3LCAweDJFRUUsIDB4MzMzOCwgMHgyRUYwLCAweDMzMzksIDB4MjA5NywgMHgzMzNBLCAweDJFRjEsCi0gICAgMHgzMzNCLCAweDIwOUQsIDB4MzMzQywgMHgyRUVBLCAweDMzM0QsIDB4MkVGMiwgMHgzMzNFLCAweDJFRjQsCi0gICAgMHgzMzNGLCAweDJFRjUsIDB4MzM0MCwgMHgyRUY2LCAweDMzNDEsIDB4MkVGMywgMHgzMzQyLCAweDIwOUIsCi0gICAgMHgzMzQzLCAweDJFRjcsIDB4MzM0NCwgMHgyRUY4LCAweDMzNDUsIDB4MkVGOSwgMHgzMzQ2LCAweDJFRkEsCi0gICAgMHgzMzQ3LCAweDIwQTUsIDB4MzM0OCwgMHgyRUZCLCAweDMzNDksIDB4MUYwNCwgMHgzMzRBLCAweDFGMTIsCi0gICAgMHgzMzRCLCAweDJFRkMsIDB4MzM0QywgMHgyRUZELCAweDMzNEQsIDB4MUYwNywgMHgzMzRFLCAweDIwOTEsCi0gICAgMHgzMzRGLCAweDJFRkUsIDB4MzM1MCwgMHgyRUZGLCAweDMzNTEsIDB4MUYwQywgMHgzMzUyLCAweDJGMDIsCi0gICAgMHgzMzUzLCAweDJGMDYsIDB4MzM1NCwgMHgyRjAzLCAweDMzNTUsIDB4MkYwNywgMHgzMzU2LCAweDJGMDgsCi0gICAgMHgzMzU3LCAweDIwOTgsIDB4MzM3RiwgMHgyMDg0LCAweEZGMDgsIDB4MUVEQiwgMHhGRjA5LCAweDFFREMsCi0gICAgMHhGRjBDLCAweDIwNEMsIDB4RkYwRSwgMHgyMDUyLCAweEZGMUQsIDB4MUVFRCwgMHhGRjNCLCAweDFFREYsCi0gICAgMHhGRjNELCAweDFFRTAsIDB4RkYzRiwgMHgxRUQyLCAweEZGNUIsIDB4MUVFMSwgMHhGRjVDLCAweDFFRDgsCi0gICAgMHhGRjVELCAweDFFRTIsIDB4RkY1RSwgMHgxRUQ2LCAweEZGNUYsIDB4MkY2RCwgMHhGRjYwLCAweDJGNkUsCi0gICAgMHhGRkUzLCAweDFFRDEsCi19OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9WXzEuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9WXzEuY3BwCmluZGV4IGI5YzAwYjYuLjBiZWUxNDAgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvVl8xLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1ZfMS5jcHAKQEAgLTEsMTAgKzEsMTIgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0IGdfRlhDTUFQX1ZfMVsyNyAqIDNdID0geworI2luY2x1ZGUgImNtYXBzX2phcGFuMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQX1ZfMVsyNyAqIDNdID0gewogICAgIDB4MjEyMiwgMHgyMTIzLCAweDFFQ0YsIDB4MjEzMSwgMHgyMTMyLCAweDFFRDEsIDB4MjEzQywgMHgyMTNFLCAweDFFRDMsCiAgICAgMHgyMTQxLCAweDIxNDUsIDB4MUVENiwgMHgyMTRBLCAweDIxNUIsIDB4MUVEQiwgMHgyMTYxLCAweDIxNjEsIDB4MUVFRCwKICAgICAweDI0MjEsIDB4MjQyMSwgMHgxRUVFLCAweDI0MjMsIDB4MjQyMywgMHgxRUVGLCAweDI0MjUsIDB4MjQyNSwgMHgxRUYwLApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9jbWFwc19qYXBhbjEuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9jbWFwc19qYXBhbjEuY3BwCmluZGV4IDgwYTQ3Y2MuLjU5NzhmMGMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvY21hcHNfamFwYW4xLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL2NtYXBzX2phcGFuMS5jcHAKQEAgLTEsNjIgKzEsNjYgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3Jlc291cmNlLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgiCi0jaW5jbHVkZSAiLi4vLi4vZnBkZl9mb250L2ZvbnRfaW50LmgiCi0jaW5jbHVkZSAiLi4vY21hcF9pbnQuaCIKLWV4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQXzgzcHZfUktTSl9IXzFbXTsKLWV4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQXzkwbXNfUktTSl9IXzJbXTsKLWV4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQXzkwbXNfUktTSl9WXzJbXTsKLWV4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQXzkwbXNwX1JLU0pfSF8yW107Ci1leHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF85MG1zcF9SS1NKX1ZfMltdOwotZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfOTBwdl9SS1NKX0hfMVtdOwotZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfQWRkX1JLU0pfSF8xW107Ci1leHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9BZGRfUktTSl9WXzFbXTsKLWV4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0VVQ19IXzFbXTsKLWV4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0VVQ19WXzFbXTsKLWV4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0V4dF9SS1NKX0hfMltdOwotZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfRXh0X1JLU0pfVl8yW107Ci1leHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9IXzFbXTsKLWV4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX1ZfMVtdOwotZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfVW5pSklTX1VDUzJfSF80W107Ci1leHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9VbmlKSVNfVUNTMl9WXzRbXTsKLWV4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX1VuaUpJU19VQ1MyX0hXX0hfNFtdOwotZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfVW5pSklTX1VDUzJfSFdfVl80W107Ci1leHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9VbmlKSVNfVVRGMTZfSF8wW107Ci1leHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9VbmlKSVNfVVRGMTZfSF8wX0RXb3JkW107Ci1leHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9VbmlKSVNfVVRGMTZfVl8wW107Ci1leHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9KYXBhbjFDSUQyVW5pY29kZV80W107CisjaW5jbHVkZSAiY21hcHNfamFwYW4xLmgiCisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcmVzb3VyY2UuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIgIC8vIEZvciBGWF9BcnJheVNpemUoKS4KKyNpbmNsdWRlICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvY21hcF9pbnQuaCIKKyNpbmNsdWRlICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mb250X2ludC5oIgorCiBzdGF0aWMgY29uc3QgRlhDTUFQX0NNYXAgZ19GWENNQVBfSmFwYW4xX2NtYXBzW10gPSB7Ci0gICAgeyAiODNwdi1SS1NKLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQXzgzcHZfUktTSl9IXzEsIDIyMiwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDAgfSwKLSAgICB7ICI5MG1zLVJLU0otSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfOTBtc19SS1NKX0hfMiwgMTcxLCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgMCB9LAotICAgIHsgIjkwbXMtUktTSi1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF85MG1zX1JLU0pfVl8yLCA3OCwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xIH0sCi0gICAgeyAiOTBtc3AtUktTSi1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF85MG1zcF9SS1NKX0hfMiwgMTcwLCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTIgfSwKLSAgICB7ICI5MG1zcC1SS1NKLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQXzkwbXNwX1JLU0pfVl8yLCA3OCwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xIH0sCi0gICAgeyAiOTBwdi1SS1NKLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQXzkwcHZfUktTSl9IXzEsIDI2MywgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDAgfSwKLSAgICB7ICJBZGQtUktTSi1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9BZGRfUktTSl9IXzEsIDYzNSwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDAgfSwKLSAgICB7ICJBZGQtUktTSi1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9BZGRfUktTSl9WXzEsIDU3LCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTEgfSwKLSAgICB7ICJFVUMtSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfRVVDX0hfMSwgMTIwLCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgMCB9LAotICAgIHsgIkVVQy1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9FVUNfVl8xLCAyNywgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xIH0sCi0gICAgeyAiRXh0LVJLU0otSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfRXh0X1JLU0pfSF8yLCA2NjUsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtNCB9LAotICAgIHsgIkV4dC1SS1NKLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0V4dF9SS1NKX1ZfMiwgMzksIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMSB9LAotICAgIHsgIkgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0hfMSwgMTE4LCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgMCB9LAotICAgIHsgIlYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX1ZfMSwgMjcsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMSB9LAotICAgIHsgIlVuaUpJUy1VQ1MyLUgiLCBGWENNQVBfQ01hcDo6U2luZ2xlLCBnX0ZYQ01BUF9VbmlKSVNfVUNTMl9IXzQsIDk3NzIsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwIH0sCi0gICAgeyAiVW5pSklTLVVDUzItViIsIEZYQ01BUF9DTWFwOjpTaW5nbGUsIGdfRlhDTUFQX1VuaUpJU19VQ1MyX1ZfNCwgMjUxLCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTEgfSwKLSAgICB7ICJVbmlKSVMtVUNTMi1IVy1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9VbmlKSVNfVUNTMl9IV19IXzQsIDQsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMiB9LAotICAgIHsgIlVuaUpJUy1VQ1MyLUhXLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX1VuaUpJU19VQ1MyX0hXX1ZfNCwgMTk5LCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTEgfSwKLSAgICB7ICJVbmlKSVMtVVRGMTYtSCIsIEZYQ01BUF9DTWFwOjpTaW5nbGUsIGdfRlhDTUFQX1VuaUpJU19VQ1MyX0hfNCwgOTc3MiwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDAgfSwKLSAgICB7ICJVbmlKSVMtVVRGMTYtViIsIEZYQ01BUF9DTWFwOjpTaW5nbGUsIGdfRlhDTUFQX1VuaUpJU19VQ1MyX1ZfNCwgMjUxLCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTEgfSwKKyAgICB7IjgzcHYtUktTSi1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF84M3B2X1JLU0pfSF8xLCAyMjIsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwfSwKKyAgICB7IjkwbXMtUktTSi1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF85MG1zX1JLU0pfSF8yLCAxNzEsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwfSwKKyAgICB7IjkwbXMtUktTSi1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF85MG1zX1JLU0pfVl8yLCA3OCwKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xfSwKKyAgICB7IjkwbXNwLVJLU0otSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfOTBtc3BfUktTSl9IXzIsIDE3MCwKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0yfSwKKyAgICB7IjkwbXNwLVJLU0otViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfOTBtc3BfUktTSl9WXzIsIDc4LAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTF9LAorICAgIHsiOTBwdi1SS1NKLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQXzkwcHZfUktTSl9IXzEsIDI2MywKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDB9LAorICAgIHsiQWRkLVJLU0otSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfQWRkX1JLU0pfSF8xLCA2MzUsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwfSwKKyAgICB7IkFkZC1SS1NKLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0FkZF9SS1NKX1ZfMSwgNTcsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMX0sCisgICAgeyJFVUMtSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfRVVDX0hfMSwgMTIwLCBGWENNQVBfQ01hcDo6Tm9uZSwKKyAgICAgTlVMTCwgMCwgMH0sCisgICAgeyJFVUMtViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfRVVDX1ZfMSwgMjcsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLAorICAgICAwLCAtMX0sCisgICAgeyJFeHQtUktTSi1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9FeHRfUktTSl9IXzIsIDY2NSwKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC00fSwKKyAgICB7IkV4dC1SS1NKLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0V4dF9SS1NKX1ZfMiwgMzksCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMX0sCisgICAgeyJIIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9IXzEsIDExOCwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDB9LAorICAgIHsiViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfVl8xLCAyNywgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xfSwKKyAgICB7IlVuaUpJUy1VQ1MyLUgiLCBGWENNQVBfQ01hcDo6U2luZ2xlLCBnX0ZYQ01BUF9VbmlKSVNfVUNTMl9IXzQsIDk3NzIsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwfSwKKyAgICB7IlVuaUpJUy1VQ1MyLVYiLCBGWENNQVBfQ01hcDo6U2luZ2xlLCBnX0ZYQ01BUF9VbmlKSVNfVUNTMl9WXzQsIDI1MSwKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xfSwKKyAgICB7IlVuaUpJUy1VQ1MyLUhXLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX1VuaUpJU19VQ1MyX0hXX0hfNCwgNCwKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0yfSwKKyAgICB7IlVuaUpJUy1VQ1MyLUhXLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX1VuaUpJU19VQ1MyX0hXX1ZfNCwgMTk5LAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTF9LAorICAgIHsiVW5pSklTLVVURjE2LUgiLCBGWENNQVBfQ01hcDo6U2luZ2xlLCBnX0ZYQ01BUF9VbmlKSVNfVUNTMl9IXzQsIDk3NzIsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAwfSwKKyAgICB7IlVuaUpJUy1VVEYxNi1WIiwgRlhDTUFQX0NNYXA6OlNpbmdsZSwgZ19GWENNQVBfVW5pSklTX1VDUzJfVl80LCAyNTEsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMX0sCiB9Owotdm9pZCBDUERGX01vZHVsZU1ncjo6TG9hZEVtYmVkZGVkSmFwYW4xQ01hcHMoKQotewotICAgIENQREZfRm9udEdsb2JhbHMqIHBGb250R2xvYmFscyA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRGb250R2xvYmFscygpOwotICAgIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZENoYXJzZXRzW0NJRFNFVF9KQVBBTjFdLm1fcE1hcExpc3QgPSBnX0ZYQ01BUF9KYXBhbjFfY21hcHM7Ci0gICAgcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkQ2hhcnNldHNbQ0lEU0VUX0pBUEFOMV0ubV9Db3VudCA9IHNpemVvZiBnX0ZYQ01BUF9KYXBhbjFfY21hcHMgLyBzaXplb2YgKEZYQ01BUF9DTWFwKTsKLSAgICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRUb1VuaWNvZGVzW0NJRFNFVF9KQVBBTjFdLm1fcE1hcCA9IGdfRlhDTUFQX0phcGFuMUNJRDJVbmljb2RlXzQ7Ci0gICAgcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkVG9Vbmljb2Rlc1tDSURTRVRfSkFQQU4xXS5tX0NvdW50ID0gMTU0NDQ7CisKK3ZvaWQgQ1BERl9Nb2R1bGVNZ3I6OkxvYWRFbWJlZGRlZEphcGFuMUNNYXBzKCkgeworICBDUERGX0ZvbnRHbG9iYWxzKiBwRm9udEdsb2JhbHMgPQorICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCk7CisgIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZENoYXJzZXRzW0NJRFNFVF9KQVBBTjFdLm1fcE1hcExpc3QgPQorICAgICAgZ19GWENNQVBfSmFwYW4xX2NtYXBzOworICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRDaGFyc2V0c1tDSURTRVRfSkFQQU4xXS5tX0NvdW50ID0KKyAgICAgIEZYX0FycmF5U2l6ZShnX0ZYQ01BUF9KYXBhbjFfY21hcHMpOworICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRUb1VuaWNvZGVzW0NJRFNFVF9KQVBBTjFdLm1fcE1hcCA9CisgICAgICBnX0ZYQ01BUF9KYXBhbjFDSUQyVW5pY29kZV80OworICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRUb1VuaWNvZGVzW0NJRFNFVF9KQVBBTjFdLm1fQ291bnQgPSAxNTQ0NDsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvY21hcHNfamFwYW4xLmggYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL2NtYXBzX2phcGFuMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MWRkMzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL2NtYXBzX2phcGFuMS5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAyMDE1IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX1NSQ19GUERGQVBJX0ZQREZfQ01BUFNfSkFQQU4xX0NNQVBTX0pBUEFOMV9IXworI2RlZmluZSBDT1JFX1NSQ19GUERGQVBJX0ZQREZfQ01BUFNfSkFQQU4xX0NNQVBTX0pBUEFOMV9IXworCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oIiAgLy8gRm9yIEZYX1dPUkQuCisKK2V4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQXzgzcHZfUktTSl9IXzFbXTsKK2V4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQXzkwbXNfUktTSl9IXzJbXTsKK2V4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQXzkwbXNfUktTSl9WXzJbXTsKK2V4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQXzkwbXNwX1JLU0pfSF8yW107CitleHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF85MG1zcF9SS1NKX1ZfMltdOworZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfOTBwdl9SS1NKX0hfMVtdOworZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfQWRkX1JLU0pfSF8xW107CitleHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9BZGRfUktTSl9WXzFbXTsKK2V4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0VVQ19IXzFbXTsKK2V4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0VVQ19WXzFbXTsKK2V4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0V4dF9SS1NKX0hfMltdOworZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfRXh0X1JLU0pfVl8yW107CitleHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9IXzFbXTsKK2V4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX1ZfMVtdOworZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfVW5pSklTX1VDUzJfSF80W107CitleHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9VbmlKSVNfVUNTMl9WXzRbXTsKK2V4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX1VuaUpJU19VQ1MyX0hXX0hfNFtdOworZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfVW5pSklTX1VDUzJfSFdfVl80W107CitleHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9VbmlKSVNfVVRGMTZfSF8wW107CitleHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9VbmlKSVNfVVRGMTZfSF8wX0RXb3JkW107CitleHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9VbmlKSVNfVVRGMTZfVl8wW107CitleHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9KYXBhbjFDSUQyVW5pY29kZV80W107CisKKyNlbmRpZiAgLy8gQ09SRV9TUkNfRlBERkFQSV9GUERGX0NNQVBTX0pBUEFOMV9DTUFQU19KQVBBTjFfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvQWRvYmUtS29yZWExLVVDUzJfMi5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL0Fkb2JlLUtvcmVhMS1VQ1MyXzIuY3BwCmluZGV4IDgzN2IzZWEuLjdkYzg1ZmYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvQWRvYmUtS29yZWExLVVDUzJfMi5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9BZG9iZS1Lb3JlYTEtVUNTMl8yLmNwcApAQCAtMSwyMzAyICsxLDIwNTAgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0IGdfRlhDTUFQX0tvcmVhMUNJRDJVbmljb2RlXzJbMTgzNTJdID0gewotICAgIDB4RkZGRCwgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LAotICAgIDB4MDAyNywgMHgwMDI4LCAweDAwMjksIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLAotICAgIDB4MDAyRiwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LAotICAgIDB4MDAzNywgMHgwMDM4LCAweDAwMzksIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLAotICAgIDB4MDAzRiwgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LAotICAgIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLAotICAgIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LAotICAgIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgwMDVCLCAweDAwNUMsIDB4MDA1RCwgMHgwMDVFLAotICAgIDB4MDA1RiwgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LAotICAgIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLAotICAgIDB4MDA2RiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LAotICAgIDB4MDA3NywgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDdCLCAweDAwN0MsIDB4MDA3RCwgMHgwMDdFLAotICAgIDB4MjBBOSwgMHgyMDEwLCAweDAwQTksIDB4MjEyMiwgMHgyMkVGLCAweDMwMDAsIDB4MzAwMSwgMHgzMDAyLAotICAgIDB4MDBCNywgMHgyMDI1LCAweDIwMjYsIDB4MDBBOCwgMHgzMDAzLCAweDIwMTMsIDB4MjAxNCwgMHgyMDE2LAotICAgIDB4RkYzQywgMHgyMjNDLCAweDIwMTgsIDB4MjAxOSwgMHgyMDFDLCAweDIwMUQsIDB4MzAxNCwgMHgzMDE1LAotICAgIDB4MzAwOCwgMHgzMDA5LCAweDMwMEEsIDB4MzAwQiwgMHgzMDBDLCAweDMwMEQsIDB4MzAwRSwgMHgzMDBGLAotICAgIDB4MzAxMCwgMHgzMDExLCAweDAwQjEsIDB4MDBENywgMHgwMEY3LCAweDIyNjAsIDB4MjI2NCwgMHgyMjY1LAotICAgIDB4MjIxRSwgMHgyMjM0LCAweDAwQjAsIDB4MjAzMiwgMHgyMDMzLCAweDIxMDMsIDB4MjEyQiwgMHhGRkUwLAotICAgIDB4RkZFMSwgMHhGRkU1LCAweDI2NDIsIDB4MjY0MCwgMHgyMjIwLCAweDIyQTUsIDB4MjMxMiwgMHgyMjAyLAotICAgIDB4MjIwNywgMHgyMjYxLCAweDIyNTIsIDB4MDBBNywgMHgyMDNCLCAweDI2MDYsIDB4MjYwNSwgMHgyNUNCLAotICAgIDB4MjVDRiwgMHgyNUNFLCAweDI1QzcsIDB4MjVDNiwgMHgyNUExLCAweDI1QTAsIDB4MjVCMywgMHgyNUIyLAotICAgIDB4MjVCRCwgMHgyNUJDLCAweDIxOTIsIDB4MjE5MCwgMHgyMTkxLCAweDIxOTMsIDB4MjE5NCwgMHgzMDEzLAotICAgIDB4MjI2QSwgMHgyMjZCLCAweDIyMUEsIDB4MjIzRCwgMHgyMjFELCAweDIyMzUsIDB4MjIyQiwgMHgyMjJDLAotICAgIDB4MjIwOCwgMHgyMjBCLCAweDIyODYsIDB4MjI4NywgMHgyMjgyLCAweDIyODMsIDB4MjIyQSwgMHgyMjI5LAotICAgIDB4MjIyNywgMHgyMjI4LCAweEZGRTIsIDB4MjFEMiwgMHgyMUQ0LCAweDIyMDAsIDB4MjIwMywgMHgwMEI0LAotICAgIDB4MDJEQywgMHgwMkM3LCAweDAyRDgsIDB4MDJERCwgMHgwMkRBLCAweDAyRDksIDB4MDBCOCwgMHgwMkRCLAotICAgIDB4MDBBMSwgMHgwMEJGLCAweDIyMzYsIDB4MjIyRSwgMHgyMjExLCAweDIyMEYsIDB4MDBBNCwgMHgyMTA5LAotICAgIDB4MjAzMCwgMHgyNUMxLCAweDI1QzAsIDB4MjVCNywgMHgyNUI2LCAweDI2NjQsIDB4MjY2MCwgMHgyNjYxLAotICAgIDB4MjY2NSwgMHgyNjY3LCAweDI2NjMsIDB4MjI5OSwgMHgyNUM4LCAweDI1QTMsIDB4MjVEMCwgMHgyNUQxLAotICAgIDB4MjU5MiwgMHgyNUE0LCAweDI1QTUsIDB4MjVBOCwgMHgyNUE3LCAweDI1QTYsIDB4MjVBOSwgMHgyNjY4LAotICAgIDB4MjYwRiwgMHgyNjBFLCAweDI2MUMsIDB4MjYxRSwgMHgwMEI2LCAweDIwMjAsIDB4MjAyMSwgMHgyMTk1LAotICAgIDB4MjE5NywgMHgyMTk5LCAweDIxOTYsIDB4MjE5OCwgMHgyNjZELCAweDI2NjksIDB4MjY2QSwgMHgyNjZDLAotICAgIDB4MzI3RiwgMHgzMjFDLCAweDIxMTYsIDB4MzNDNywgMHgyMTIyLCAweDMzQzIsIDB4MzNEOCwgMHgyMTIxLAotICAgIDB4RkYwMSwgMHhGRjAyLCAweEZGMDMsIDB4RkYwNCwgMHhGRjA1LCAweEZGMDYsIDB4RkYwNywgMHhGRjA4LAotICAgIDB4RkYwOSwgMHhGRjBBLCAweEZGMEIsIDB4RkYwQywgMHhGRjBELCAweEZGMEUsIDB4RkYwRiwgMHhGRjEwLAotICAgIDB4RkYxMSwgMHhGRjEyLCAweEZGMTMsIDB4RkYxNCwgMHhGRjE1LCAweEZGMTYsIDB4RkYxNywgMHhGRjE4LAotICAgIDB4RkYxOSwgMHhGRjFBLCAweEZGMUIsIDB4RkYxQywgMHhGRjFELCAweEZGMUUsIDB4RkYxRiwgMHhGRjIwLAotICAgIDB4RkYyMSwgMHhGRjIyLCAweEZGMjMsIDB4RkYyNCwgMHhGRjI1LCAweEZGMjYsIDB4RkYyNywgMHhGRjI4LAotICAgIDB4RkYyOSwgMHhGRjJBLCAweEZGMkIsIDB4RkYyQywgMHhGRjJELCAweEZGMkUsIDB4RkYyRiwgMHhGRjMwLAotICAgIDB4RkYzMSwgMHhGRjMyLCAweEZGMzMsIDB4RkYzNCwgMHhGRjM1LCAweEZGMzYsIDB4RkYzNywgMHhGRjM4LAotICAgIDB4RkYzOSwgMHhGRjNBLCAweEZGM0IsIDB4RkZFNiwgMHhGRjNELCAweEZGM0UsIDB4RkYzRiwgMHhGRjQwLAotICAgIDB4RkY0MSwgMHhGRjQyLCAweEZGNDMsIDB4RkY0NCwgMHhGRjQ1LCAweEZGNDYsIDB4RkY0NywgMHhGRjQ4LAotICAgIDB4RkY0OSwgMHhGRjRBLCAweEZGNEIsIDB4RkY0QywgMHhGRjRELCAweEZGNEUsIDB4RkY0RiwgMHhGRjUwLAotICAgIDB4RkY1MSwgMHhGRjUyLCAweEZGNTMsIDB4RkY1NCwgMHhGRjU1LCAweEZGNTYsIDB4RkY1NywgMHhGRjU4LAotICAgIDB4RkY1OSwgMHhGRjVBLCAweEZGNUIsIDB4RkY1QywgMHhGRjVELCAweEZGRTMsIDB4MzEzMSwgMHgzMTMyLAotICAgIDB4MzEzMywgMHgzMTM0LCAweDMxMzUsIDB4MzEzNiwgMHgzMTM3LCAweDMxMzgsIDB4MzEzOSwgMHgzMTNBLAotICAgIDB4MzEzQiwgMHgzMTNDLCAweDMxM0QsIDB4MzEzRSwgMHgzMTNGLCAweDMxNDAsIDB4MzE0MSwgMHgzMTQyLAotICAgIDB4MzE0MywgMHgzMTQ0LCAweDMxNDUsIDB4MzE0NiwgMHgzMTQ3LCAweDMxNDgsIDB4MzE0OSwgMHgzMTRBLAotICAgIDB4MzE0QiwgMHgzMTRDLCAweDMxNEQsIDB4MzE0RSwgMHgzMTRGLCAweDMxNTAsIDB4MzE1MSwgMHgzMTUyLAotICAgIDB4MzE1MywgMHgzMTU0LCAweDMxNTUsIDB4MzE1NiwgMHgzMTU3LCAweDMxNTgsIDB4MzE1OSwgMHgzMTVBLAotICAgIDB4MzE1QiwgMHgzMTVDLCAweDMxNUQsIDB4MzE1RSwgMHgzMTVGLCAweDMxNjAsIDB4MzE2MSwgMHgzMTYyLAotICAgIDB4MzE2MywgMHgzMTY1LCAweDMxNjYsIDB4MzE2NywgMHgzMTY4LCAweDMxNjksIDB4MzE2QSwgMHgzMTZCLAotICAgIDB4MzE2QywgMHgzMTZELCAweDMxNkUsIDB4MzE2RiwgMHgzMTcwLCAweDMxNzEsIDB4MzE3MiwgMHgzMTczLAotICAgIDB4MzE3NCwgMHgzMTc1LCAweDMxNzYsIDB4MzE3NywgMHgzMTc4LCAweDMxNzksIDB4MzE3QSwgMHgzMTdCLAotICAgIDB4MzE3QywgMHgzMTdELCAweDMxN0UsIDB4MzE3RiwgMHgzMTgwLCAweDMxODEsIDB4MzE4MiwgMHgzMTgzLAotICAgIDB4MzE4NCwgMHgzMTg1LCAweDMxODYsIDB4MzE4NywgMHgzMTg4LCAweDMxODksIDB4MzE4QSwgMHgzMThCLAotICAgIDB4MzE4QywgMHgzMThELCAweDMxOEUsIDB4MjE3MCwgMHgyMTcxLCAweDIxNzIsIDB4MjE3MywgMHgyMTc0LAotICAgIDB4MjE3NSwgMHgyMTc2LCAweDIxNzcsIDB4MjE3OCwgMHgyMTc5LCAweDIxNjAsIDB4MjE2MSwgMHgyMTYyLAotICAgIDB4MjE2MywgMHgyMTY0LCAweDIxNjUsIDB4MjE2NiwgMHgyMTY3LCAweDIxNjgsIDB4MjE2OSwgMHgwMzkxLAotICAgIDB4MDM5MiwgMHgwMzkzLCAweDAzOTQsIDB4MDM5NSwgMHgwMzk2LCAweDAzOTcsIDB4MDM5OCwgMHgwMzk5LAotICAgIDB4MDM5QSwgMHgwMzlCLCAweDAzOUMsIDB4MDM5RCwgMHgwMzlFLCAweDAzOUYsIDB4MDNBMCwgMHgwM0ExLAotICAgIDB4MDNBMywgMHgwM0E0LCAweDAzQTUsIDB4MDNBNiwgMHgwM0E3LCAweDAzQTgsIDB4MDNBOSwgMHgwM0IxLAotICAgIDB4MDNCMiwgMHgwM0IzLCAweDAzQjQsIDB4MDNCNSwgMHgwM0I2LCAweDAzQjcsIDB4MDNCOCwgMHgwM0I5LAotICAgIDB4MDNCQSwgMHgwM0JCLCAweDAzQkMsIDB4MDNCRCwgMHgwM0JFLCAweDAzQkYsIDB4MDNDMCwgMHgwM0MxLAotICAgIDB4MDNDMywgMHgwM0M0LCAweDAzQzUsIDB4MDNDNiwgMHgwM0M3LCAweDAzQzgsIDB4MDNDOSwgMHgyNTAwLAotICAgIDB4MjUwMiwgMHgyNTBDLCAweDI1MTAsIDB4MjUxOCwgMHgyNTE0LCAweDI1MUMsIDB4MjUyQywgMHgyNTI0LAotICAgIDB4MjUzNCwgMHgyNTNDLCAweDI1MDEsIDB4MjUwMywgMHgyNTBGLCAweDI1MTMsIDB4MjUxQiwgMHgyNTE3LAotICAgIDB4MjUyMywgMHgyNTMzLCAweDI1MkIsIDB4MjUzQiwgMHgyNTRCLCAweDI1MjAsIDB4MjUyRiwgMHgyNTI4LAotICAgIDB4MjUzNywgMHgyNTNGLCAweDI1MUQsIDB4MjUzMCwgMHgyNTI1LCAweDI1MzgsIDB4MjU0MiwgMHgyNTEyLAotICAgIDB4MjUxMSwgMHgyNTFBLCAweDI1MTksIDB4MjUxNiwgMHgyNTE1LCAweDI1MEUsIDB4MjUwRCwgMHgyNTFFLAotICAgIDB4MjUxRiwgMHgyNTIxLCAweDI1MjIsIDB4MjUyNiwgMHgyNTI3LCAweDI1MjksIDB4MjUyQSwgMHgyNTJELAotICAgIDB4MjUyRSwgMHgyNTMxLCAweDI1MzIsIDB4MjUzNSwgMHgyNTM2LCAweDI1MzksIDB4MjUzQSwgMHgyNTNELAotICAgIDB4MjUzRSwgMHgyNTQwLCAweDI1NDEsIDB4MjU0MywgMHgyNTQ0LCAweDI1NDUsIDB4MjU0NiwgMHgyNTQ3LAotICAgIDB4MjU0OCwgMHgyNTQ5LCAweDI1NEEsIDB4MzM5NSwgMHgzMzk2LCAweDMzOTcsIDB4MjExMywgMHgzMzk4LAotICAgIDB4MzNDNCwgMHgzM0EzLCAweDMzQTQsIDB4MzNBNSwgMHgzM0E2LCAweDMzOTksIDB4MzM5QSwgMHgzMzlCLAotICAgIDB4MzM5QywgMHgzMzlELCAweDMzOUUsIDB4MzM5RiwgMHgzM0EwLCAweDMzQTEsIDB4MzNBMiwgMHgzM0NBLAotICAgIDB4MzM4RCwgMHgzMzhFLCAweDMzOEYsIDB4MzNDRiwgMHgzMzg4LCAweDMzODksIDB4MzNDOCwgMHgzM0E3LAotICAgIDB4MzNBOCwgMHgzM0IwLCAweDMzQjEsIDB4MzNCMiwgMHgzM0IzLCAweDMzQjQsIDB4MzNCNSwgMHgzM0I2LAotICAgIDB4MzNCNywgMHgzM0I4LCAweDMzQjksIDB4MzM4MCwgMHgzMzgxLCAweDMzODIsIDB4MzM4MywgMHgzMzg0LAotICAgIDB4MzNCQSwgMHgzM0JCLCAweDMzQkMsIDB4MzNCRCwgMHgzM0JFLCAweDMzQkYsIDB4MzM5MCwgMHgzMzkxLAotICAgIDB4MzM5MiwgMHgzMzkzLCAweDMzOTQsIDB4MjEyNiwgMHgzM0MwLCAweDMzQzEsIDB4MzM4QSwgMHgzMzhCLAotICAgIDB4MzM4QywgMHgzM0Q2LCAweDMzQzUsIDB4MzNBRCwgMHgzM0FFLCAweDMzQUYsIDB4MzNEQiwgMHgzM0E5LAotICAgIDB4MzNBQSwgMHgzM0FCLCAweDMzQUMsIDB4MzNERCwgMHgzM0QwLCAweDMzRDMsIDB4MzNDMywgMHgzM0M5LAotICAgIDB4MzNEQywgMHgzM0M2LCAweDAwQzYsIDB4MDBEMCwgMHgwMEFBLCAweDAxMjYsIDB4MDEzMiwgMHgwMTNGLAotICAgIDB4MDE0MSwgMHgwMEQ4LCAweDAxNTIsIDB4MDBCQSwgMHgwMERFLCAweDAxNjYsIDB4MDE0QSwgMHgzMjYwLAotICAgIDB4MzI2MSwgMHgzMjYyLCAweDMyNjMsIDB4MzI2NCwgMHgzMjY1LCAweDMyNjYsIDB4MzI2NywgMHgzMjY4LAotICAgIDB4MzI2OSwgMHgzMjZBLCAweDMyNkIsIDB4MzI2QywgMHgzMjZELCAweDMyNkUsIDB4MzI2RiwgMHgzMjcwLAotICAgIDB4MzI3MSwgMHgzMjcyLCAweDMyNzMsIDB4MzI3NCwgMHgzMjc1LCAweDMyNzYsIDB4MzI3NywgMHgzMjc4LAotICAgIDB4MzI3OSwgMHgzMjdBLCAweDMyN0IsIDB4MjREMCwgMHgyNEQxLCAweDI0RDIsIDB4MjREMywgMHgyNEQ0LAotICAgIDB4MjRENSwgMHgyNEQ2LCAweDI0RDcsIDB4MjREOCwgMHgyNEQ5LCAweDI0REEsIDB4MjREQiwgMHgyNERDLAotICAgIDB4MjRERCwgMHgyNERFLCAweDI0REYsIDB4MjRFMCwgMHgyNEUxLCAweDI0RTIsIDB4MjRFMywgMHgyNEU0LAotICAgIDB4MjRFNSwgMHgyNEU2LCAweDI0RTcsIDB4MjRFOCwgMHgyNEU5LCAweDI0NjAsIDB4MjQ2MSwgMHgyNDYyLAotICAgIDB4MjQ2MywgMHgyNDY0LCAweDI0NjUsIDB4MjQ2NiwgMHgyNDY3LCAweDI0NjgsIDB4MjQ2OSwgMHgyNDZBLAotICAgIDB4MjQ2QiwgMHgyNDZDLCAweDI0NkQsIDB4MjQ2RSwgMHgwMEJELCAweDIxNTMsIDB4MjE1NCwgMHgwMEJDLAotICAgIDB4MDBCRSwgMHgyMTVCLCAweDIxNUMsIDB4MjE1RCwgMHgyMTVFLCAweDAwRTYsIDB4MDExMSwgMHgwMEYwLAotICAgIDB4MDEyNywgMHgwMTMxLCAweDAxMzMsIDB4MDEzOCwgMHgwMTQwLCAweDAxNDIsIDB4MDBGOCwgMHgwMTUzLAotICAgIDB4MDBERiwgMHgwMEZFLCAweDAxNjcsIDB4MDE0QiwgMHgwMTQ5LCAweDMyMDAsIDB4MzIwMSwgMHgzMjAyLAotICAgIDB4MzIwMywgMHgzMjA0LCAweDMyMDUsIDB4MzIwNiwgMHgzMjA3LCAweDMyMDgsIDB4MzIwOSwgMHgzMjBBLAotICAgIDB4MzIwQiwgMHgzMjBDLCAweDMyMEQsIDB4MzIwRSwgMHgzMjBGLCAweDMyMTAsIDB4MzIxMSwgMHgzMjEyLAotICAgIDB4MzIxMywgMHgzMjE0LCAweDMyMTUsIDB4MzIxNiwgMHgzMjE3LCAweDMyMTgsIDB4MzIxOSwgMHgzMjFBLAotICAgIDB4MzIxQiwgMHgyNDlDLCAweDI0OUQsIDB4MjQ5RSwgMHgyNDlGLCAweDI0QTAsIDB4MjRBMSwgMHgyNEEyLAotICAgIDB4MjRBMywgMHgyNEE0LCAweDI0QTUsIDB4MjRBNiwgMHgyNEE3LCAweDI0QTgsIDB4MjRBOSwgMHgyNEFBLAotICAgIDB4MjRBQiwgMHgyNEFDLCAweDI0QUQsIDB4MjRBRSwgMHgyNEFGLCAweDI0QjAsIDB4MjRCMSwgMHgyNEIyLAotICAgIDB4MjRCMywgMHgyNEI0LCAweDI0QjUsIDB4MjQ3NCwgMHgyNDc1LCAweDI0NzYsIDB4MjQ3NywgMHgyNDc4LAotICAgIDB4MjQ3OSwgMHgyNDdBLCAweDI0N0IsIDB4MjQ3QywgMHgyNDdELCAweDI0N0UsIDB4MjQ3RiwgMHgyNDgwLAotICAgIDB4MjQ4MSwgMHgyNDgyLCAweDAwQjksIDB4MDBCMiwgMHgwMEIzLCAweDIwNzQsIDB4MjA3RiwgMHgyMDgxLAotICAgIDB4MjA4MiwgMHgyMDgzLCAweDIwODQsIDB4MzA0MSwgMHgzMDQyLCAweDMwNDMsIDB4MzA0NCwgMHgzMDQ1LAotICAgIDB4MzA0NiwgMHgzMDQ3LCAweDMwNDgsIDB4MzA0OSwgMHgzMDRBLCAweDMwNEIsIDB4MzA0QywgMHgzMDRELAotICAgIDB4MzA0RSwgMHgzMDRGLCAweDMwNTAsIDB4MzA1MSwgMHgzMDUyLCAweDMwNTMsIDB4MzA1NCwgMHgzMDU1LAotICAgIDB4MzA1NiwgMHgzMDU3LCAweDMwNTgsIDB4MzA1OSwgMHgzMDVBLCAweDMwNUIsIDB4MzA1QywgMHgzMDVELAotICAgIDB4MzA1RSwgMHgzMDVGLCAweDMwNjAsIDB4MzA2MSwgMHgzMDYyLCAweDMwNjMsIDB4MzA2NCwgMHgzMDY1LAotICAgIDB4MzA2NiwgMHgzMDY3LCAweDMwNjgsIDB4MzA2OSwgMHgzMDZBLCAweDMwNkIsIDB4MzA2QywgMHgzMDZELAotICAgIDB4MzA2RSwgMHgzMDZGLCAweDMwNzAsIDB4MzA3MSwgMHgzMDcyLCAweDMwNzMsIDB4MzA3NCwgMHgzMDc1LAotICAgIDB4MzA3NiwgMHgzMDc3LCAweDMwNzgsIDB4MzA3OSwgMHgzMDdBLCAweDMwN0IsIDB4MzA3QywgMHgzMDdELAotICAgIDB4MzA3RSwgMHgzMDdGLCAweDMwODAsIDB4MzA4MSwgMHgzMDgyLCAweDMwODMsIDB4MzA4NCwgMHgzMDg1LAotICAgIDB4MzA4NiwgMHgzMDg3LCAweDMwODgsIDB4MzA4OSwgMHgzMDhBLCAweDMwOEIsIDB4MzA4QywgMHgzMDhELAotICAgIDB4MzA4RSwgMHgzMDhGLCAweDMwOTAsIDB4MzA5MSwgMHgzMDkyLCAweDMwOTMsIDB4MzBBMSwgMHgzMEEyLAotICAgIDB4MzBBMywgMHgzMEE0LCAweDMwQTUsIDB4MzBBNiwgMHgzMEE3LCAweDMwQTgsIDB4MzBBOSwgMHgzMEFBLAotICAgIDB4MzBBQiwgMHgzMEFDLCAweDMwQUQsIDB4MzBBRSwgMHgzMEFGLCAweDMwQjAsIDB4MzBCMSwgMHgzMEIyLAotICAgIDB4MzBCMywgMHgzMEI0LCAweDMwQjUsIDB4MzBCNiwgMHgzMEI3LCAweDMwQjgsIDB4MzBCOSwgMHgzMEJBLAotICAgIDB4MzBCQiwgMHgzMEJDLCAweDMwQkQsIDB4MzBCRSwgMHgzMEJGLCAweDMwQzAsIDB4MzBDMSwgMHgzMEMyLAotICAgIDB4MzBDMywgMHgzMEM0LCAweDMwQzUsIDB4MzBDNiwgMHgzMEM3LCAweDMwQzgsIDB4MzBDOSwgMHgzMENBLAotICAgIDB4MzBDQiwgMHgzMENDLCAweDMwQ0QsIDB4MzBDRSwgMHgzMENGLCAweDMwRDAsIDB4MzBEMSwgMHgzMEQyLAotICAgIDB4MzBEMywgMHgzMEQ0LCAweDMwRDUsIDB4MzBENiwgMHgzMEQ3LCAweDMwRDgsIDB4MzBEOSwgMHgzMERBLAotICAgIDB4MzBEQiwgMHgzMERDLCAweDMwREQsIDB4MzBERSwgMHgzMERGLCAweDMwRTAsIDB4MzBFMSwgMHgzMEUyLAotICAgIDB4MzBFMywgMHgzMEU0LCAweDMwRTUsIDB4MzBFNiwgMHgzMEU3LCAweDMwRTgsIDB4MzBFOSwgMHgzMEVBLAotICAgIDB4MzBFQiwgMHgzMEVDLCAweDMwRUQsIDB4MzBFRSwgMHgzMEVGLCAweDMwRjAsIDB4MzBGMSwgMHgzMEYyLAotICAgIDB4MzBGMywgMHgzMEY0LCAweDMwRjUsIDB4MzBGNiwgMHgwNDEwLCAweDA0MTEsIDB4MDQxMiwgMHgwNDEzLAotICAgIDB4MDQxNCwgMHgwNDE1LCAweDA0MDEsIDB4MDQxNiwgMHgwNDE3LCAweDA0MTgsIDB4MDQxOSwgMHgwNDFBLAotICAgIDB4MDQxQiwgMHgwNDFDLCAweDA0MUQsIDB4MDQxRSwgMHgwNDFGLCAweDA0MjAsIDB4MDQyMSwgMHgwNDIyLAotICAgIDB4MDQyMywgMHgwNDI0LCAweDA0MjUsIDB4MDQyNiwgMHgwNDI3LCAweDA0MjgsIDB4MDQyOSwgMHgwNDJBLAotICAgIDB4MDQyQiwgMHgwNDJDLCAweDA0MkQsIDB4MDQyRSwgMHgwNDJGLCAweDA0MzAsIDB4MDQzMSwgMHgwNDMyLAotICAgIDB4MDQzMywgMHgwNDM0LCAweDA0MzUsIDB4MDQ1MSwgMHgwNDM2LCAweDA0MzcsIDB4MDQzOCwgMHgwNDM5LAotICAgIDB4MDQzQSwgMHgwNDNCLCAweDA0M0MsIDB4MDQzRCwgMHgwNDNFLCAweDA0M0YsIDB4MDQ0MCwgMHgwNDQxLAotICAgIDB4MDQ0MiwgMHgwNDQzLCAweDA0NDQsIDB4MDQ0NSwgMHgwNDQ2LCAweDA0NDcsIDB4MDQ0OCwgMHgwNDQ5LAotICAgIDB4MDQ0QSwgMHgwNDRCLCAweDA0NEMsIDB4MDQ0RCwgMHgwNDRFLCAweDA0NEYsIDB4QUMwMCwgMHhBQzAxLAotICAgIDB4QUMwNCwgMHhBQzA3LCAweEFDMDgsIDB4QUMwOSwgMHhBQzBBLCAweEFDMTAsIDB4QUMxMSwgMHhBQzEyLAotICAgIDB4QUMxMywgMHhBQzE0LCAweEFDMTUsIDB4QUMxNiwgMHhBQzE3LCAweEFDMTksIDB4QUMxQSwgMHhBQzFCLAotICAgIDB4QUMxQywgMHhBQzFELCAweEFDMjAsIDB4QUMyNCwgMHhBQzJDLCAweEFDMkQsIDB4QUMyRiwgMHhBQzMwLAotICAgIDB4QUMzMSwgMHhBQzM4LCAweEFDMzksIDB4QUMzQywgMHhBQzQwLCAweEFDNEIsIDB4QUM0RCwgMHhBQzU0LAotICAgIDB4QUM1OCwgMHhBQzVDLCAweEFDNzAsIDB4QUM3MSwgMHhBQzc0LCAweEFDNzcsIDB4QUM3OCwgMHhBQzdBLAotICAgIDB4QUM4MCwgMHhBQzgxLCAweEFDODMsIDB4QUM4NCwgMHhBQzg1LCAweEFDODYsIDB4QUM4OSwgMHhBQzhBLAotICAgIDB4QUM4QiwgMHhBQzhDLCAweEFDOTAsIDB4QUM5NCwgMHhBQzlDLCAweEFDOUQsIDB4QUM5RiwgMHhBQ0EwLAotICAgIDB4QUNBMSwgMHhBQ0E4LCAweEFDQTksIDB4QUNBQSwgMHhBQ0FDLCAweEFDQUYsIDB4QUNCMCwgMHhBQ0I4LAotICAgIDB4QUNCOSwgMHhBQ0JCLCAweEFDQkMsIDB4QUNCRCwgMHhBQ0MxLCAweEFDQzQsIDB4QUNDOCwgMHhBQ0NDLAotICAgIDB4QUNENSwgMHhBQ0Q3LCAweEFDRTAsIDB4QUNFMSwgMHhBQ0U0LCAweEFDRTcsIDB4QUNFOCwgMHhBQ0VBLAotICAgIDB4QUNFQywgMHhBQ0VGLCAweEFDRjAsIDB4QUNGMSwgMHhBQ0YzLCAweEFDRjUsIDB4QUNGNiwgMHhBQ0ZDLAotICAgIDB4QUNGRCwgMHhBRDAwLCAweEFEMDQsIDB4QUQwNiwgMHhBRDBDLCAweEFEMEQsIDB4QUQwRiwgMHhBRDExLAotICAgIDB4QUQxOCwgMHhBRDFDLCAweEFEMjAsIDB4QUQyOSwgMHhBRDJDLCAweEFEMkQsIDB4QUQzNCwgMHhBRDM1LAotICAgIDB4QUQzOCwgMHhBRDNDLCAweEFENDQsIDB4QUQ0NSwgMHhBRDQ3LCAweEFENDksIDB4QUQ1MCwgMHhBRDU0LAotICAgIDB4QUQ1OCwgMHhBRDYxLCAweEFENjMsIDB4QUQ2QywgMHhBRDZELCAweEFENzAsIDB4QUQ3MywgMHhBRDc0LAotICAgIDB4QUQ3NSwgMHhBRDc2LCAweEFEN0IsIDB4QUQ3QywgMHhBRDdELCAweEFEN0YsIDB4QUQ4MSwgMHhBRDgyLAotICAgIDB4QUQ4OCwgMHhBRDg5LCAweEFEOEMsIDB4QUQ5MCwgMHhBRDlDLCAweEFEOUQsIDB4QURBNCwgMHhBREI3LAotICAgIDB4QURDMCwgMHhBREMxLCAweEFEQzQsIDB4QURDOCwgMHhBREQwLCAweEFERDEsIDB4QUREMywgMHhBRERDLAotICAgIDB4QURFMCwgMHhBREU0LCAweEFERjgsIDB4QURGOSwgMHhBREZDLCAweEFERkYsIDB4QUUwMCwgMHhBRTAxLAotICAgIDB4QUUwOCwgMHhBRTA5LCAweEFFMEIsIDB4QUUwRCwgMHhBRTE0LCAweEFFMzAsIDB4QUUzMSwgMHhBRTM0LAotICAgIDB4QUUzNywgMHhBRTM4LCAweEFFM0EsIDB4QUU0MCwgMHhBRTQxLCAweEFFNDMsIDB4QUU0NSwgMHhBRTQ2LAotICAgIDB4QUU0QSwgMHhBRTRDLCAweEFFNEQsIDB4QUU0RSwgMHhBRTUwLCAweEFFNTQsIDB4QUU1NiwgMHhBRTVDLAotICAgIDB4QUU1RCwgMHhBRTVGLCAweEFFNjAsIDB4QUU2MSwgMHhBRTY1LCAweEFFNjgsIDB4QUU2OSwgMHhBRTZDLAotICAgIDB4QUU3MCwgMHhBRTc4LCAweEFFNzksIDB4QUU3QiwgMHhBRTdDLCAweEFFN0QsIDB4QUU4NCwgMHhBRTg1LAotICAgIDB4QUU4QywgMHhBRUJDLCAweEFFQkQsIDB4QUVCRSwgMHhBRUMwLCAweEFFQzQsIDB4QUVDQywgMHhBRUNELAotICAgIDB4QUVDRiwgMHhBRUQwLCAweEFFRDEsIDB4QUVEOCwgMHhBRUQ5LCAweEFFREMsIDB4QUVFOCwgMHhBRUVCLAotICAgIDB4QUVFRCwgMHhBRUY0LCAweEFFRjgsIDB4QUVGQywgMHhBRjA3LCAweEFGMDgsIDB4QUYwRCwgMHhBRjEwLAotICAgIDB4QUYyQywgMHhBRjJELCAweEFGMzAsIDB4QUYzMiwgMHhBRjM0LCAweEFGM0MsIDB4QUYzRCwgMHhBRjNGLAotICAgIDB4QUY0MSwgMHhBRjQyLCAweEFGNDMsIDB4QUY0OCwgMHhBRjQ5LCAweEFGNTAsIDB4QUY1QywgMHhBRjVELAotICAgIDB4QUY2NCwgMHhBRjY1LCAweEFGNzksIDB4QUY4MCwgMHhBRjg0LCAweEFGODgsIDB4QUY5MCwgMHhBRjkxLAotICAgIDB4QUY5NSwgMHhBRjlDLCAweEFGQjgsIDB4QUZCOSwgMHhBRkJDLCAweEFGQzAsIDB4QUZDNywgMHhBRkM4LAotICAgIDB4QUZDOSwgMHhBRkNCLCAweEFGQ0QsIDB4QUZDRSwgMHhBRkQ0LCAweEFGREMsIDB4QUZFOCwgMHhBRkU5LAotICAgIDB4QUZGMCwgMHhBRkYxLCAweEFGRjQsIDB4QUZGOCwgMHhCMDAwLCAweEIwMDEsIDB4QjAwNCwgMHhCMDBDLAotICAgIDB4QjAxMCwgMHhCMDE0LCAweEIwMUMsIDB4QjAxRCwgMHhCMDI4LCAweEIwNDQsIDB4QjA0NSwgMHhCMDQ4LAotICAgIDB4QjA0QSwgMHhCMDRDLCAweEIwNEUsIDB4QjA1MywgMHhCMDU0LCAweEIwNTUsIDB4QjA1NywgMHhCMDU5LAotICAgIDB4QjA1RCwgMHhCMDdDLCAweEIwN0QsIDB4QjA4MCwgMHhCMDg0LCAweEIwOEMsIDB4QjA4RCwgMHhCMDhGLAotICAgIDB4QjA5MSwgMHhCMDk4LCAweEIwOTksIDB4QjA5QSwgMHhCMDlDLCAweEIwOUYsIDB4QjBBMCwgMHhCMEExLAotICAgIDB4QjBBMiwgMHhCMEE4LCAweEIwQTksIDB4QjBBQiwgMHhCMEFDLCAweEIwQUQsIDB4QjBBRSwgMHhCMEFGLAotICAgIDB4QjBCMSwgMHhCMEIzLCAweEIwQjQsIDB4QjBCNSwgMHhCMEI4LCAweEIwQkMsIDB4QjBDNCwgMHhCMEM1LAotICAgIDB4QjBDNywgMHhCMEM4LCAweEIwQzksIDB4QjBEMCwgMHhCMEQxLCAweEIwRDQsIDB4QjBEOCwgMHhCMEUwLAotICAgIDB4QjBFNSwgMHhCMTA4LCAweEIxMDksIDB4QjEwQiwgMHhCMTBDLCAweEIxMTAsIDB4QjExMiwgMHhCMTEzLAotICAgIDB4QjExOCwgMHhCMTE5LCAweEIxMUIsIDB4QjExQywgMHhCMTFELCAweEIxMjMsIDB4QjEyNCwgMHhCMTI1LAotICAgIDB4QjEyOCwgMHhCMTJDLCAweEIxMzQsIDB4QjEzNSwgMHhCMTM3LCAweEIxMzgsIDB4QjEzOSwgMHhCMTQwLAotICAgIDB4QjE0MSwgMHhCMTQ0LCAweEIxNDgsIDB4QjE1MCwgMHhCMTUxLCAweEIxNTQsIDB4QjE1NSwgMHhCMTU4LAotICAgIDB4QjE1QywgMHhCMTYwLCAweEIxNzgsIDB4QjE3OSwgMHhCMTdDLCAweEIxODAsIDB4QjE4MiwgMHhCMTg4LAotICAgIDB4QjE4OSwgMHhCMThCLCAweEIxOEQsIDB4QjE5MiwgMHhCMTkzLCAweEIxOTQsIDB4QjE5OCwgMHhCMTlDLAotICAgIDB4QjFBOCwgMHhCMUNDLCAweEIxRDAsIDB4QjFENCwgMHhCMURDLCAweEIxREQsIDB4QjFERiwgMHhCMUU4LAotICAgIDB4QjFFOSwgMHhCMUVDLCAweEIxRjAsIDB4QjFGOSwgMHhCMUZCLCAweEIxRkQsIDB4QjIwNCwgMHhCMjA1LAotICAgIDB4QjIwOCwgMHhCMjBCLCAweEIyMEMsIDB4QjIxNCwgMHhCMjE1LCAweEIyMTcsIDB4QjIxOSwgMHhCMjIwLAotICAgIDB4QjIzNCwgMHhCMjNDLCAweEIyNTgsIDB4QjI1QywgMHhCMjYwLCAweEIyNjgsIDB4QjI2OSwgMHhCMjc0LAotICAgIDB4QjI3NSwgMHhCMjdDLCAweEIyODQsIDB4QjI4NSwgMHhCMjg5LCAweEIyOTAsIDB4QjI5MSwgMHhCMjk0LAotICAgIDB4QjI5OCwgMHhCMjk5LCAweEIyOUEsIDB4QjJBMCwgMHhCMkExLCAweEIyQTMsIDB4QjJBNSwgMHhCMkE2LAotICAgIDB4QjJBQSwgMHhCMkFDLCAweEIyQjAsIDB4QjJCNCwgMHhCMkM4LCAweEIyQzksIDB4QjJDQywgMHhCMkQwLAotICAgIDB4QjJEMiwgMHhCMkQ4LCAweEIyRDksIDB4QjJEQiwgMHhCMkRELCAweEIyRTIsIDB4QjJFNCwgMHhCMkU1LAotICAgIDB4QjJFNiwgMHhCMkU4LCAweEIyRUIsIDB4QjJFQywgMHhCMkVELCAweEIyRUUsIDB4QjJFRiwgMHhCMkYzLAotICAgIDB4QjJGNCwgMHhCMkY1LCAweEIyRjcsIDB4QjJGOCwgMHhCMkY5LCAweEIyRkEsIDB4QjJGQiwgMHhCMkZGLAotICAgIDB4QjMwMCwgMHhCMzAxLCAweEIzMDQsIDB4QjMwOCwgMHhCMzEwLCAweEIzMTEsIDB4QjMxMywgMHhCMzE0LAotICAgIDB4QjMxNSwgMHhCMzFDLCAweEIzNTQsIDB4QjM1NSwgMHhCMzU2LCAweEIzNTgsIDB4QjM1QiwgMHhCMzVDLAotICAgIDB4QjM1RSwgMHhCMzVGLCAweEIzNjQsIDB4QjM2NSwgMHhCMzY3LCAweEIzNjksIDB4QjM2QiwgMHhCMzZFLAotICAgIDB4QjM3MCwgMHhCMzcxLCAweEIzNzQsIDB4QjM3OCwgMHhCMzgwLCAweEIzODEsIDB4QjM4MywgMHhCMzg0LAotICAgIDB4QjM4NSwgMHhCMzhDLCAweEIzOTAsIDB4QjM5NCwgMHhCM0EwLCAweEIzQTEsIDB4QjNBOCwgMHhCM0FDLAotICAgIDB4QjNDNCwgMHhCM0M1LCAweEIzQzgsIDB4QjNDQiwgMHhCM0NDLCAweEIzQ0UsIDB4QjNEMCwgMHhCM0Q0LAotICAgIDB4QjNENSwgMHhCM0Q3LCAweEIzRDksIDB4QjNEQiwgMHhCM0RELCAweEIzRTAsIDB4QjNFNCwgMHhCM0U4LAotICAgIDB4QjNGQywgMHhCNDEwLCAweEI0MTgsIDB4QjQxQywgMHhCNDIwLCAweEI0MjgsIDB4QjQyOSwgMHhCNDJCLAotICAgIDB4QjQzNCwgMHhCNDUwLCAweEI0NTEsIDB4QjQ1NCwgMHhCNDU4LCAweEI0NjAsIDB4QjQ2MSwgMHhCNDYzLAotICAgIDB4QjQ2NSwgMHhCNDZDLCAweEI0ODAsIDB4QjQ4OCwgMHhCNDlELCAweEI0QTQsIDB4QjRBOCwgMHhCNEFDLAotICAgIDB4QjRCNSwgMHhCNEI3LCAweEI0QjksIDB4QjRDMCwgMHhCNEM0LCAweEI0QzgsIDB4QjREMCwgMHhCNEQ1LAotICAgIDB4QjREQywgMHhCNERELCAweEI0RTAsIDB4QjRFMywgMHhCNEU0LCAweEI0RTYsIDB4QjRFQywgMHhCNEVELAotICAgIDB4QjRFRiwgMHhCNEYxLCAweEI0RjgsIDB4QjUxNCwgMHhCNTE1LCAweEI1MTgsIDB4QjUxQiwgMHhCNTFDLAotICAgIDB4QjUyNCwgMHhCNTI1LCAweEI1MjcsIDB4QjUyOCwgMHhCNTI5LCAweEI1MkEsIDB4QjUzMCwgMHhCNTMxLAotICAgIDB4QjUzNCwgMHhCNTM4LCAweEI1NDAsIDB4QjU0MSwgMHhCNTQzLCAweEI1NDQsIDB4QjU0NSwgMHhCNTRCLAotICAgIDB4QjU0QywgMHhCNTRELCAweEI1NTAsIDB4QjU1NCwgMHhCNTVDLCAweEI1NUQsIDB4QjU1RiwgMHhCNTYwLAotICAgIDB4QjU2MSwgMHhCNUEwLCAweEI1QTEsIDB4QjVBNCwgMHhCNUE4LCAweEI1QUEsIDB4QjVBQiwgMHhCNUIwLAotICAgIDB4QjVCMSwgMHhCNUIzLCAweEI1QjQsIDB4QjVCNSwgMHhCNUJCLCAweEI1QkMsIDB4QjVCRCwgMHhCNUMwLAotICAgIDB4QjVDNCwgMHhCNUNDLCAweEI1Q0QsIDB4QjVDRiwgMHhCNUQwLCAweEI1RDEsIDB4QjVEOCwgMHhCNUVDLAotICAgIDB4QjYxMCwgMHhCNjExLCAweEI2MTQsIDB4QjYxOCwgMHhCNjI1LCAweEI2MkMsIDB4QjYzNCwgMHhCNjQ4LAotICAgIDB4QjY2NCwgMHhCNjY4LCAweEI2OUMsIDB4QjY5RCwgMHhCNkEwLCAweEI2QTQsIDB4QjZBQiwgMHhCNkFDLAotICAgIDB4QjZCMSwgMHhCNkQ0LCAweEI2RjAsIDB4QjZGNCwgMHhCNkY4LCAweEI3MDAsIDB4QjcwMSwgMHhCNzA1LAotICAgIDB4QjcyOCwgMHhCNzI5LCAweEI3MkMsIDB4QjcyRiwgMHhCNzMwLCAweEI3MzgsIDB4QjczOSwgMHhCNzNCLAotICAgIDB4Qjc0NCwgMHhCNzQ4LCAweEI3NEMsIDB4Qjc1NCwgMHhCNzU1LCAweEI3NjAsIDB4Qjc2NCwgMHhCNzY4LAotICAgIDB4Qjc3MCwgMHhCNzcxLCAweEI3NzMsIDB4Qjc3NSwgMHhCNzdDLCAweEI3N0QsIDB4Qjc4MCwgMHhCNzg0LAotICAgIDB4Qjc4QywgMHhCNzhELCAweEI3OEYsIDB4Qjc5MCwgMHhCNzkxLCAweEI3OTIsIDB4Qjc5NiwgMHhCNzk3LAotICAgIDB4Qjc5OCwgMHhCNzk5LCAweEI3OUMsIDB4QjdBMCwgMHhCN0E4LCAweEI3QTksIDB4QjdBQiwgMHhCN0FDLAotICAgIDB4QjdBRCwgMHhCN0I0LCAweEI3QjUsIDB4QjdCOCwgMHhCN0M3LCAweEI3QzksIDB4QjdFQywgMHhCN0VELAotICAgIDB4QjdGMCwgMHhCN0Y0LCAweEI3RkMsIDB4QjdGRCwgMHhCN0ZGLCAweEI4MDAsIDB4QjgwMSwgMHhCODA3LAotICAgIDB4QjgwOCwgMHhCODA5LCAweEI4MEMsIDB4QjgxMCwgMHhCODE4LCAweEI4MTksIDB4QjgxQiwgMHhCODFELAotICAgIDB4QjgyNCwgMHhCODI1LCAweEI4MjgsIDB4QjgyQywgMHhCODM0LCAweEI4MzUsIDB4QjgzNywgMHhCODM4LAotICAgIDB4QjgzOSwgMHhCODQwLCAweEI4NDQsIDB4Qjg1MSwgMHhCODUzLCAweEI4NUMsIDB4Qjg1RCwgMHhCODYwLAotICAgIDB4Qjg2NCwgMHhCODZDLCAweEI4NkQsIDB4Qjg2RiwgMHhCODcxLCAweEI4NzgsIDB4Qjg3QywgMHhCODhELAotICAgIDB4QjhBOCwgMHhCOEIwLCAweEI4QjQsIDB4QjhCOCwgMHhCOEMwLCAweEI4QzEsIDB4QjhDMywgMHhCOEM1LAotICAgIDB4QjhDQywgMHhCOEQwLCAweEI4RDQsIDB4QjhERCwgMHhCOERGLCAweEI4RTEsIDB4QjhFOCwgMHhCOEU5LAotICAgIDB4QjhFQywgMHhCOEYwLCAweEI4RjgsIDB4QjhGOSwgMHhCOEZCLCAweEI4RkQsIDB4QjkwNCwgMHhCOTE4LAotICAgIDB4QjkyMCwgMHhCOTNDLCAweEI5M0QsIDB4Qjk0MCwgMHhCOTQ0LCAweEI5NEMsIDB4Qjk0RiwgMHhCOTUxLAotICAgIDB4Qjk1OCwgMHhCOTU5LCAweEI5NUMsIDB4Qjk2MCwgMHhCOTY4LCAweEI5NjksIDB4Qjk2QiwgMHhCOTZELAotICAgIDB4Qjk3NCwgMHhCOTc1LCAweEI5NzgsIDB4Qjk3QywgMHhCOTg0LCAweEI5ODUsIDB4Qjk4NywgMHhCOTg5LAotICAgIDB4Qjk4QSwgMHhCOThELCAweEI5OEUsIDB4QjlBQywgMHhCOUFELCAweEI5QjAsIDB4QjlCNCwgMHhCOUJDLAotICAgIDB4QjlCRCwgMHhCOUJGLCAweEI5QzEsIDB4QjlDOCwgMHhCOUM5LCAweEI5Q0MsIDB4QjlDRSwgMHhCOUNGLAotICAgIDB4QjlEMCwgMHhCOUQxLCAweEI5RDIsIDB4QjlEOCwgMHhCOUQ5LCAweEI5REIsIDB4QjlERCwgMHhCOURFLAotICAgIDB4QjlFMSwgMHhCOUUzLCAweEI5RTQsIDB4QjlFNSwgMHhCOUU4LCAweEI5RUMsIDB4QjlGNCwgMHhCOUY1LAotICAgIDB4QjlGNywgMHhCOUY4LCAweEI5RjksIDB4QjlGQSwgMHhCQTAwLCAweEJBMDEsIDB4QkEwOCwgMHhCQTE1LAotICAgIDB4QkEzOCwgMHhCQTM5LCAweEJBM0MsIDB4QkE0MCwgMHhCQTQyLCAweEJBNDgsIDB4QkE0OSwgMHhCQTRCLAotICAgIDB4QkE0RCwgMHhCQTRFLCAweEJBNTMsIDB4QkE1NCwgMHhCQTU1LCAweEJBNTgsIDB4QkE1QywgMHhCQTY0LAotICAgIDB4QkE2NSwgMHhCQTY3LCAweEJBNjgsIDB4QkE2OSwgMHhCQTcwLCAweEJBNzEsIDB4QkE3NCwgMHhCQTc4LAotICAgIDB4QkE4MywgMHhCQTg0LCAweEJBODUsIDB4QkE4NywgMHhCQThDLCAweEJBQTgsIDB4QkFBOSwgMHhCQUFCLAotICAgIDB4QkFBQywgMHhCQUIwLCAweEJBQjIsIDB4QkFCOCwgMHhCQUI5LCAweEJBQkIsIDB4QkFCRCwgMHhCQUM0LAotICAgIDB4QkFDOCwgMHhCQUQ4LCAweEJBRDksIDB4QkFGQywgMHhCQjAwLCAweEJCMDQsIDB4QkIwRCwgMHhCQjBGLAotICAgIDB4QkIxMSwgMHhCQjE4LCAweEJCMUMsIDB4QkIyMCwgMHhCQjI5LCAweEJCMkIsIDB4QkIzNCwgMHhCQjM1LAotICAgIDB4QkIzNiwgMHhCQjM4LCAweEJCM0IsIDB4QkIzQywgMHhCQjNELCAweEJCM0UsIDB4QkI0NCwgMHhCQjQ1LAotICAgIDB4QkI0NywgMHhCQjQ5LCAweEJCNEQsIDB4QkI0RiwgMHhCQjUwLCAweEJCNTQsIDB4QkI1OCwgMHhCQjYxLAotICAgIDB4QkI2MywgMHhCQjZDLCAweEJCODgsIDB4QkI4QywgMHhCQjkwLCAweEJCQTQsIDB4QkJBOCwgMHhCQkFDLAotICAgIDB4QkJCNCwgMHhCQkI3LCAweEJCQzAsIDB4QkJDNCwgMHhCQkM4LCAweEJCRDAsIDB4QkJEMywgMHhCQkY4LAotICAgIDB4QkJGOSwgMHhCQkZDLCAweEJCRkYsIDB4QkMwMCwgMHhCQzAyLCAweEJDMDgsIDB4QkMwOSwgMHhCQzBCLAotICAgIDB4QkMwQywgMHhCQzBELCAweEJDMEYsIDB4QkMxMSwgMHhCQzE0LCAweEJDMTUsIDB4QkMxNiwgMHhCQzE3LAotICAgIDB4QkMxOCwgMHhCQzFCLCAweEJDMUMsIDB4QkMxRCwgMHhCQzFFLCAweEJDMUYsIDB4QkMyNCwgMHhCQzI1LAotICAgIDB4QkMyNywgMHhCQzI5LCAweEJDMkQsIDB4QkMzMCwgMHhCQzMxLCAweEJDMzQsIDB4QkMzOCwgMHhCQzQwLAotICAgIDB4QkM0MSwgMHhCQzQzLCAweEJDNDQsIDB4QkM0NSwgMHhCQzQ5LCAweEJDNEMsIDB4QkM0RCwgMHhCQzUwLAotICAgIDB4QkM1RCwgMHhCQzg0LCAweEJDODUsIDB4QkM4OCwgMHhCQzhCLCAweEJDOEMsIDB4QkM4RSwgMHhCQzk0LAotICAgIDB4QkM5NSwgMHhCQzk3LCAweEJDOTksIDB4QkM5QSwgMHhCQ0EwLCAweEJDQTEsIDB4QkNBNCwgMHhCQ0E3LAotICAgIDB4QkNBOCwgMHhCQ0IwLCAweEJDQjEsIDB4QkNCMywgMHhCQ0I0LCAweEJDQjUsIDB4QkNCQywgMHhCQ0JELAotICAgIDB4QkNDMCwgMHhCQ0M0LCAweEJDQ0QsIDB4QkNDRiwgMHhCQ0QwLCAweEJDRDEsIDB4QkNENSwgMHhCQ0Q4LAotICAgIDB4QkNEQywgMHhCQ0Y0LCAweEJDRjUsIDB4QkNGNiwgMHhCQ0Y4LCAweEJDRkMsIDB4QkQwNCwgMHhCRDA1LAotICAgIDB4QkQwNywgMHhCRDA5LCAweEJEMTAsIDB4QkQxNCwgMHhCRDI0LCAweEJEMkMsIDB4QkQ0MCwgMHhCRDQ4LAotICAgIDB4QkQ0OSwgMHhCRDRDLCAweEJENTAsIDB4QkQ1OCwgMHhCRDU5LCAweEJENjQsIDB4QkQ2OCwgMHhCRDgwLAotICAgIDB4QkQ4MSwgMHhCRDg0LCAweEJEODcsIDB4QkQ4OCwgMHhCRDg5LCAweEJEOEEsIDB4QkQ5MCwgMHhCRDkxLAotICAgIDB4QkQ5MywgMHhCRDk1LCAweEJEOTksIDB4QkQ5QSwgMHhCRDlDLCAweEJEQTQsIDB4QkRCMCwgMHhCREI4LAotICAgIDB4QkRENCwgMHhCREQ1LCAweEJERDgsIDB4QkREQywgMHhCREU5LCAweEJERjAsIDB4QkRGNCwgMHhCREY4LAotICAgIDB4QkUwMCwgMHhCRTAzLCAweEJFMDUsIDB4QkUwQywgMHhCRTBELCAweEJFMTAsIDB4QkUxNCwgMHhCRTFDLAotICAgIDB4QkUxRCwgMHhCRTFGLCAweEJFNDQsIDB4QkU0NSwgMHhCRTQ4LCAweEJFNEMsIDB4QkU0RSwgMHhCRTU0LAotICAgIDB4QkU1NSwgMHhCRTU3LCAweEJFNTksIDB4QkU1QSwgMHhCRTVCLCAweEJFNjAsIDB4QkU2MSwgMHhCRTY0LAotICAgIDB4QkU2OCwgMHhCRTZBLCAweEJFNzAsIDB4QkU3MSwgMHhCRTczLCAweEJFNzQsIDB4QkU3NSwgMHhCRTdCLAotICAgIDB4QkU3QywgMHhCRTdELCAweEJFODAsIDB4QkU4NCwgMHhCRThDLCAweEJFOEQsIDB4QkU4RiwgMHhCRTkwLAotICAgIDB4QkU5MSwgMHhCRTk4LCAweEJFOTksIDB4QkVBOCwgMHhCRUQwLCAweEJFRDEsIDB4QkVENCwgMHhCRUQ3LAotICAgIDB4QkVEOCwgMHhCRUUwLCAweEJFRTMsIDB4QkVFNCwgMHhCRUU1LCAweEJFRUMsIDB4QkYwMSwgMHhCRjA4LAotICAgIDB4QkYwOSwgMHhCRjE4LCAweEJGMTksIDB4QkYxQiwgMHhCRjFDLCAweEJGMUQsIDB4QkY0MCwgMHhCRjQxLAotICAgIDB4QkY0NCwgMHhCRjQ4LCAweEJGNTAsIDB4QkY1MSwgMHhCRjU1LCAweEJGOTQsIDB4QkZCMCwgMHhCRkM1LAotICAgIDB4QkZDQywgMHhCRkNELCAweEJGRDAsIDB4QkZENCwgMHhCRkRDLCAweEJGREYsIDB4QkZFMSwgMHhDMDNDLAotICAgIDB4QzA1MSwgMHhDMDU4LCAweEMwNUMsIDB4QzA2MCwgMHhDMDY4LCAweEMwNjksIDB4QzA5MCwgMHhDMDkxLAotICAgIDB4QzA5NCwgMHhDMDk4LCAweEMwQTAsIDB4QzBBMSwgMHhDMEEzLCAweEMwQTUsIDB4QzBBQywgMHhDMEFELAotICAgIDB4QzBBRiwgMHhDMEIwLCAweEMwQjMsIDB4QzBCNCwgMHhDMEI1LCAweEMwQjYsIDB4QzBCQywgMHhDMEJELAotICAgIDB4QzBCRiwgMHhDMEMwLCAweEMwQzEsIDB4QzBDNSwgMHhDMEM4LCAweEMwQzksIDB4QzBDQywgMHhDMEQwLAotICAgIDB4QzBEOCwgMHhDMEQ5LCAweEMwREIsIDB4QzBEQywgMHhDMERELCAweEMwRTQsIDB4QzBFNSwgMHhDMEU4LAotICAgIDB4QzBFQywgMHhDMEY0LCAweEMwRjUsIDB4QzBGNywgMHhDMEY5LCAweEMxMDAsIDB4QzEwNCwgMHhDMTA4LAotICAgIDB4QzExMCwgMHhDMTE1LCAweEMxMUMsIDB4QzExRCwgMHhDMTFFLCAweEMxMUYsIDB4QzEyMCwgMHhDMTIzLAotICAgIDB4QzEyNCwgMHhDMTI2LCAweEMxMjcsIDB4QzEyQywgMHhDMTJELCAweEMxMkYsIDB4QzEzMCwgMHhDMTMxLAotICAgIDB4QzEzNiwgMHhDMTM4LCAweEMxMzksIDB4QzEzQywgMHhDMTQwLCAweEMxNDgsIDB4QzE0OSwgMHhDMTRCLAotICAgIDB4QzE0QywgMHhDMTRELCAweEMxNTQsIDB4QzE1NSwgMHhDMTU4LCAweEMxNUMsIDB4QzE2NCwgMHhDMTY1LAotICAgIDB4QzE2NywgMHhDMTY4LCAweEMxNjksIDB4QzE3MCwgMHhDMTc0LCAweEMxNzgsIDB4QzE4NSwgMHhDMThDLAotICAgIDB4QzE4RCwgMHhDMThFLCAweEMxOTAsIDB4QzE5NCwgMHhDMTk2LCAweEMxOUMsIDB4QzE5RCwgMHhDMTlGLAotICAgIDB4QzFBMSwgMHhDMUE1LCAweEMxQTgsIDB4QzFBOSwgMHhDMUFDLCAweEMxQjAsIDB4QzFCRCwgMHhDMUM0LAotICAgIDB4QzFDOCwgMHhDMUNDLCAweEMxRDQsIDB4QzFENywgMHhDMUQ4LCAweEMxRTAsIDB4QzFFNCwgMHhDMUU4LAotICAgIDB4QzFGMCwgMHhDMUYxLCAweEMxRjMsIDB4QzFGQywgMHhDMUZELCAweEMyMDAsIDB4QzIwNCwgMHhDMjBDLAotICAgIDB4QzIwRCwgMHhDMjBGLCAweEMyMTEsIDB4QzIxOCwgMHhDMjE5LCAweEMyMUMsIDB4QzIxRiwgMHhDMjIwLAotICAgIDB4QzIyOCwgMHhDMjI5LCAweEMyMkIsIDB4QzIyRCwgMHhDMjJGLCAweEMyMzEsIDB4QzIzMiwgMHhDMjM0LAotICAgIDB4QzI0OCwgMHhDMjUwLCAweEMyNTEsIDB4QzI1NCwgMHhDMjU4LCAweEMyNjAsIDB4QzI2NSwgMHhDMjZDLAotICAgIDB4QzI2RCwgMHhDMjcwLCAweEMyNzQsIDB4QzI3QywgMHhDMjdELCAweEMyN0YsIDB4QzI4MSwgMHhDMjg4LAotICAgIDB4QzI4OSwgMHhDMjkwLCAweEMyOTgsIDB4QzI5QiwgMHhDMjlELCAweEMyQTQsIDB4QzJBNSwgMHhDMkE4LAotICAgIDB4QzJBQywgMHhDMkFELCAweEMyQjQsIDB4QzJCNSwgMHhDMkI3LCAweEMyQjksIDB4QzJEQywgMHhDMkRELAotICAgIDB4QzJFMCwgMHhDMkUzLCAweEMyRTQsIDB4QzJFQiwgMHhDMkVDLCAweEMyRUQsIDB4QzJFRiwgMHhDMkYxLAotICAgIDB4QzJGNiwgMHhDMkY4LCAweEMyRjksIDB4QzJGQiwgMHhDMkZDLCAweEMzMDAsIDB4QzMwOCwgMHhDMzA5LAotICAgIDB4QzMwQywgMHhDMzBELCAweEMzMTMsIDB4QzMxNCwgMHhDMzE1LCAweEMzMTgsIDB4QzMxQywgMHhDMzI0LAotICAgIDB4QzMyNSwgMHhDMzI4LCAweEMzMjksIDB4QzM0NSwgMHhDMzY4LCAweEMzNjksIDB4QzM2QywgMHhDMzcwLAotICAgIDB4QzM3MiwgMHhDMzc4LCAweEMzNzksIDB4QzM3QywgMHhDMzdELCAweEMzODQsIDB4QzM4OCwgMHhDMzhDLAotICAgIDB4QzNDMCwgMHhDM0Q4LCAweEMzRDksIDB4QzNEQywgMHhDM0RGLCAweEMzRTAsIDB4QzNFMiwgMHhDM0U4LAotICAgIDB4QzNFOSwgMHhDM0VELCAweEMzRjQsIDB4QzNGNSwgMHhDM0Y4LCAweEM0MDgsIDB4QzQxMCwgMHhDNDI0LAotICAgIDB4QzQyQywgMHhDNDMwLCAweEM0MzQsIDB4QzQzQywgMHhDNDNELCAweEM0NDgsIDB4QzQ2NCwgMHhDNDY1LAotICAgIDB4QzQ2OCwgMHhDNDZDLCAweEM0NzQsIDB4QzQ3NSwgMHhDNDc5LCAweEM0ODAsIDB4QzQ5NCwgMHhDNDlDLAotICAgIDB4QzRCOCwgMHhDNEJDLCAweEM0RTksIDB4QzRGMCwgMHhDNEYxLCAweEM0RjQsIDB4QzRGOCwgMHhDNEZBLAotICAgIDB4QzRGRiwgMHhDNTAwLCAweEM1MDEsIDB4QzUwQywgMHhDNTEwLCAweEM1MTQsIDB4QzUxQywgMHhDNTI4LAotICAgIDB4QzUyOSwgMHhDNTJDLCAweEM1MzAsIDB4QzUzOCwgMHhDNTM5LCAweEM1M0IsIDB4QzUzRCwgMHhDNTQ0LAotICAgIDB4QzU0NSwgMHhDNTQ4LCAweEM1NDksIDB4QzU0QSwgMHhDNTRDLCAweEM1NEQsIDB4QzU0RSwgMHhDNTUzLAotICAgIDB4QzU1NCwgMHhDNTU1LCAweEM1NTcsIDB4QzU1OCwgMHhDNTU5LCAweEM1NUQsIDB4QzU1RSwgMHhDNTYwLAotICAgIDB4QzU2MSwgMHhDNTY0LCAweEM1NjgsIDB4QzU3MCwgMHhDNTcxLCAweEM1NzMsIDB4QzU3NCwgMHhDNTc1LAotICAgIDB4QzU3QywgMHhDNTdELCAweEM1ODAsIDB4QzU4NCwgMHhDNTg3LCAweEM1OEMsIDB4QzU4RCwgMHhDNThGLAotICAgIDB4QzU5MSwgMHhDNTk1LCAweEM1OTcsIDB4QzU5OCwgMHhDNTlDLCAweEM1QTAsIDB4QzVBOSwgMHhDNUI0LAotICAgIDB4QzVCNSwgMHhDNUI4LCAweEM1QjksIDB4QzVCQiwgMHhDNUJDLCAweEM1QkQsIDB4QzVCRSwgMHhDNUM0LAotICAgIDB4QzVDNSwgMHhDNUM2LCAweEM1QzcsIDB4QzVDOCwgMHhDNUM5LCAweEM1Q0EsIDB4QzVDQywgMHhDNUNFLAotICAgIDB4QzVEMCwgMHhDNUQxLCAweEM1RDQsIDB4QzVEOCwgMHhDNUUwLCAweEM1RTEsIDB4QzVFMywgMHhDNUU1LAotICAgIDB4QzVFQywgMHhDNUVELCAweEM1RUUsIDB4QzVGMCwgMHhDNUY0LCAweEM1RjYsIDB4QzVGNywgMHhDNUZDLAotICAgIDB4QzVGRCwgMHhDNUZFLCAweEM1RkYsIDB4QzYwMCwgMHhDNjAxLCAweEM2MDUsIDB4QzYwNiwgMHhDNjA3LAotICAgIDB4QzYwOCwgMHhDNjBDLCAweEM2MTAsIDB4QzYxOCwgMHhDNjE5LCAweEM2MUIsIDB4QzYxQywgMHhDNjI0LAotICAgIDB4QzYyNSwgMHhDNjI4LCAweEM2MkMsIDB4QzYyRCwgMHhDNjJFLCAweEM2MzAsIDB4QzYzMywgMHhDNjM0LAotICAgIDB4QzYzNSwgMHhDNjM3LCAweEM2MzksIDB4QzYzQiwgMHhDNjQwLCAweEM2NDEsIDB4QzY0NCwgMHhDNjQ4LAotICAgIDB4QzY1MCwgMHhDNjUxLCAweEM2NTMsIDB4QzY1NCwgMHhDNjU1LCAweEM2NUMsIDB4QzY1RCwgMHhDNjYwLAotICAgIDB4QzY2QywgMHhDNjZGLCAweEM2NzEsIDB4QzY3OCwgMHhDNjc5LCAweEM2N0MsIDB4QzY4MCwgMHhDNjg4LAotICAgIDB4QzY4OSwgMHhDNjhCLCAweEM2OEQsIDB4QzY5NCwgMHhDNjk1LCAweEM2OTgsIDB4QzY5QywgMHhDNkE0LAotICAgIDB4QzZBNSwgMHhDNkE3LCAweEM2QTksIDB4QzZCMCwgMHhDNkIxLCAweEM2QjQsIDB4QzZCOCwgMHhDNkI5LAotICAgIDB4QzZCQSwgMHhDNkMwLCAweEM2QzEsIDB4QzZDMywgMHhDNkM1LCAweEM2Q0MsIDB4QzZDRCwgMHhDNkQwLAotICAgIDB4QzZENCwgMHhDNkRDLCAweEM2REQsIDB4QzZFMCwgMHhDNkUxLCAweEM2RTgsIDB4QzZFOSwgMHhDNkVDLAotICAgIDB4QzZGMCwgMHhDNkY4LCAweEM2RjksIDB4QzZGRCwgMHhDNzA0LCAweEM3MDUsIDB4QzcwOCwgMHhDNzBDLAotICAgIDB4QzcxNCwgMHhDNzE1LCAweEM3MTcsIDB4QzcxOSwgMHhDNzIwLCAweEM3MjEsIDB4QzcyNCwgMHhDNzI4LAotICAgIDB4QzczMCwgMHhDNzMxLCAweEM3MzMsIDB4QzczNSwgMHhDNzM3LCAweEM3M0MsIDB4QzczRCwgMHhDNzQwLAotICAgIDB4Qzc0NCwgMHhDNzRBLCAweEM3NEMsIDB4Qzc0RCwgMHhDNzRGLCAweEM3NTEsIDB4Qzc1MiwgMHhDNzUzLAotICAgIDB4Qzc1NCwgMHhDNzU1LCAweEM3NTYsIDB4Qzc1NywgMHhDNzU4LCAweEM3NUMsIDB4Qzc2MCwgMHhDNzY4LAotICAgIDB4Qzc2QiwgMHhDNzc0LCAweEM3NzUsIDB4Qzc3OCwgMHhDNzdDLCAweEM3N0QsIDB4Qzc3RSwgMHhDNzgzLAotICAgIDB4Qzc4NCwgMHhDNzg1LCAweEM3ODcsIDB4Qzc4OCwgMHhDNzg5LCAweEM3OEEsIDB4Qzc4RSwgMHhDNzkwLAotICAgIDB4Qzc5MSwgMHhDNzk0LCAweEM3OTYsIDB4Qzc5NywgMHhDNzk4LCAweEM3OUEsIDB4QzdBMCwgMHhDN0ExLAotICAgIDB4QzdBMywgMHhDN0E0LCAweEM3QTUsIDB4QzdBNiwgMHhDN0FDLCAweEM3QUQsIDB4QzdCMCwgMHhDN0I0LAotICAgIDB4QzdCQywgMHhDN0JELCAweEM3QkYsIDB4QzdDMCwgMHhDN0MxLCAweEM3QzgsIDB4QzdDOSwgMHhDN0NDLAotICAgIDB4QzdDRSwgMHhDN0QwLCAweEM3RDgsIDB4QzdERCwgMHhDN0U0LCAweEM3RTgsIDB4QzdFQywgMHhDODAwLAotICAgIDB4QzgwMSwgMHhDODA0LCAweEM4MDgsIDB4QzgwQSwgMHhDODEwLCAweEM4MTEsIDB4QzgxMywgMHhDODE1LAotICAgIDB4QzgxNiwgMHhDODFDLCAweEM4MUQsIDB4QzgyMCwgMHhDODI0LCAweEM4MkMsIDB4QzgyRCwgMHhDODJGLAotICAgIDB4QzgzMSwgMHhDODM4LCAweEM4M0MsIDB4Qzg0MCwgMHhDODQ4LCAweEM4NDksIDB4Qzg0QywgMHhDODRELAotICAgIDB4Qzg1NCwgMHhDODcwLCAweEM4NzEsIDB4Qzg3NCwgMHhDODc4LCAweEM4N0EsIDB4Qzg4MCwgMHhDODgxLAotICAgIDB4Qzg4MywgMHhDODg1LCAweEM4ODYsIDB4Qzg4NywgMHhDODhCLCAweEM4OEMsIDB4Qzg4RCwgMHhDODk0LAotICAgIDB4Qzg5RCwgMHhDODlGLCAweEM4QTEsIDB4QzhBOCwgMHhDOEJDLCAweEM4QkQsIDB4QzhDNCwgMHhDOEM4LAotICAgIDB4QzhDQywgMHhDOEQ0LCAweEM4RDUsIDB4QzhENywgMHhDOEQ5LCAweEM4RTAsIDB4QzhFMSwgMHhDOEU0LAotICAgIDB4QzhGNSwgMHhDOEZDLCAweEM4RkQsIDB4QzkwMCwgMHhDOTA0LCAweEM5MDUsIDB4QzkwNiwgMHhDOTBDLAotICAgIDB4QzkwRCwgMHhDOTBGLCAweEM5MTEsIDB4QzkxOCwgMHhDOTJDLCAweEM5MzQsIDB4Qzk1MCwgMHhDOTUxLAotICAgIDB4Qzk1NCwgMHhDOTU4LCAweEM5NjAsIDB4Qzk2MSwgMHhDOTYzLCAweEM5NkMsIDB4Qzk3MCwgMHhDOTc0LAotICAgIDB4Qzk3QywgMHhDOTg4LCAweEM5ODksIDB4Qzk4QywgMHhDOTkwLCAweEM5OTgsIDB4Qzk5OSwgMHhDOTlCLAotICAgIDB4Qzk5RCwgMHhDOUMwLCAweEM5QzEsIDB4QzlDNCwgMHhDOUM3LCAweEM5QzgsIDB4QzlDQSwgMHhDOUQwLAotICAgIDB4QzlEMSwgMHhDOUQzLCAweEM5RDUsIDB4QzlENiwgMHhDOUQ5LCAweEM5REEsIDB4QzlEQywgMHhDOURELAotICAgIDB4QzlFMCwgMHhDOUUyLCAweEM5RTQsIDB4QzlFNywgMHhDOUVDLCAweEM5RUQsIDB4QzlFRiwgMHhDOUYwLAotICAgIDB4QzlGMSwgMHhDOUY4LCAweEM5RjksIDB4QzlGQywgMHhDQTAwLCAweENBMDgsIDB4Q0EwOSwgMHhDQTBCLAotICAgIDB4Q0EwQywgMHhDQTBELCAweENBMTQsIDB4Q0ExOCwgMHhDQTI5LCAweENBNEMsIDB4Q0E0RCwgMHhDQTUwLAotICAgIDB4Q0E1NCwgMHhDQTVDLCAweENBNUQsIDB4Q0E1RiwgMHhDQTYwLCAweENBNjEsIDB4Q0E2OCwgMHhDQTdELAotICAgIDB4Q0E4NCwgMHhDQTk4LCAweENBQkMsIDB4Q0FCRCwgMHhDQUMwLCAweENBQzQsIDB4Q0FDQywgMHhDQUNELAotICAgIDB4Q0FDRiwgMHhDQUQxLCAweENBRDMsIDB4Q0FEOCwgMHhDQUQ5LCAweENBRTAsIDB4Q0FFQywgMHhDQUY0LAotICAgIDB4Q0IwOCwgMHhDQjEwLCAweENCMTQsIDB4Q0IxOCwgMHhDQjIwLCAweENCMjEsIDB4Q0I0MSwgMHhDQjQ4LAotICAgIDB4Q0I0OSwgMHhDQjRDLCAweENCNTAsIDB4Q0I1OCwgMHhDQjU5LCAweENCNUQsIDB4Q0I2NCwgMHhDQjc4LAotICAgIDB4Q0I3OSwgMHhDQjlDLCAweENCQjgsIDB4Q0JENCwgMHhDQkU0LCAweENCRTcsIDB4Q0JFOSwgMHhDQzBDLAotICAgIDB4Q0MwRCwgMHhDQzEwLCAweENDMTQsIDB4Q0MxQywgMHhDQzFELCAweENDMjEsIDB4Q0MyMiwgMHhDQzI3LAotICAgIDB4Q0MyOCwgMHhDQzI5LCAweENDMkMsIDB4Q0MyRSwgMHhDQzMwLCAweENDMzgsIDB4Q0MzOSwgMHhDQzNCLAotICAgIDB4Q0MzQywgMHhDQzNELCAweENDM0UsIDB4Q0M0NCwgMHhDQzQ1LCAweENDNDgsIDB4Q0M0QywgMHhDQzU0LAotICAgIDB4Q0M1NSwgMHhDQzU3LCAweENDNTgsIDB4Q0M1OSwgMHhDQzYwLCAweENDNjQsIDB4Q0M2NiwgMHhDQzY4LAotICAgIDB4Q0M3MCwgMHhDQzc1LCAweENDOTgsIDB4Q0M5OSwgMHhDQzlDLCAweENDQTAsIDB4Q0NBOCwgMHhDQ0E5LAotICAgIDB4Q0NBQiwgMHhDQ0FDLCAweENDQUQsIDB4Q0NCNCwgMHhDQ0I1LCAweENDQjgsIDB4Q0NCQywgMHhDQ0M0LAotICAgIDB4Q0NDNSwgMHhDQ0M3LCAweENDQzksIDB4Q0NEMCwgMHhDQ0Q0LCAweENDRTQsIDB4Q0NFQywgMHhDQ0YwLAotICAgIDB4Q0QwMSwgMHhDRDA4LCAweENEMDksIDB4Q0QwQywgMHhDRDEwLCAweENEMTgsIDB4Q0QxOSwgMHhDRDFCLAotICAgIDB4Q0QxRCwgMHhDRDI0LCAweENEMjgsIDB4Q0QyQywgMHhDRDM5LCAweENENUMsIDB4Q0Q2MCwgMHhDRDY0LAotICAgIDB4Q0Q2QywgMHhDRDZELCAweENENkYsIDB4Q0Q3MSwgMHhDRDc4LCAweENEODgsIDB4Q0Q5NCwgMHhDRDk1LAotICAgIDB4Q0Q5OCwgMHhDRDlDLCAweENEQTQsIDB4Q0RBNSwgMHhDREE3LCAweENEQTksIDB4Q0RCMCwgMHhDREM0LAotICAgIDB4Q0RDQywgMHhDREQwLCAweENERTgsIDB4Q0RFQywgMHhDREYwLCAweENERjgsIDB4Q0RGOSwgMHhDREZCLAotICAgIDB4Q0RGRCwgMHhDRTA0LCAweENFMDgsIDB4Q0UwQywgMHhDRTE0LCAweENFMTksIDB4Q0UyMCwgMHhDRTIxLAotICAgIDB4Q0UyNCwgMHhDRTI4LCAweENFMzAsIDB4Q0UzMSwgMHhDRTMzLCAweENFMzUsIDB4Q0U1OCwgMHhDRTU5LAotICAgIDB4Q0U1QywgMHhDRTVGLCAweENFNjAsIDB4Q0U2MSwgMHhDRTY4LCAweENFNjksIDB4Q0U2QiwgMHhDRTZELAotICAgIDB4Q0U3NCwgMHhDRTc1LCAweENFNzgsIDB4Q0U3QywgMHhDRTg0LCAweENFODUsIDB4Q0U4NywgMHhDRTg5LAotICAgIDB4Q0U5MCwgMHhDRTkxLCAweENFOTQsIDB4Q0U5OCwgMHhDRUEwLCAweENFQTEsIDB4Q0VBMywgMHhDRUE0LAotICAgIDB4Q0VBNSwgMHhDRUFDLCAweENFQUQsIDB4Q0VDMSwgMHhDRUU0LCAweENFRTUsIDB4Q0VFOCwgMHhDRUVCLAotICAgIDB4Q0VFQywgMHhDRUY0LCAweENFRjUsIDB4Q0VGNywgMHhDRUY4LCAweENFRjksIDB4Q0YwMCwgMHhDRjAxLAotICAgIDB4Q0YwNCwgMHhDRjA4LCAweENGMTAsIDB4Q0YxMSwgMHhDRjEzLCAweENGMTUsIDB4Q0YxQywgMHhDRjIwLAotICAgIDB4Q0YyNCwgMHhDRjJDLCAweENGMkQsIDB4Q0YyRiwgMHhDRjMwLCAweENGMzEsIDB4Q0YzOCwgMHhDRjU0LAotICAgIDB4Q0Y1NSwgMHhDRjU4LCAweENGNUMsIDB4Q0Y2NCwgMHhDRjY1LCAweENGNjcsIDB4Q0Y2OSwgMHhDRjcwLAotICAgIDB4Q0Y3MSwgMHhDRjc0LCAweENGNzgsIDB4Q0Y4MCwgMHhDRjg1LCAweENGOEMsIDB4Q0ZBMSwgMHhDRkE4LAotICAgIDB4Q0ZCMCwgMHhDRkM0LCAweENGRTAsIDB4Q0ZFMSwgMHhDRkU0LCAweENGRTgsIDB4Q0ZGMCwgMHhDRkYxLAotICAgIDB4Q0ZGMywgMHhDRkY1LCAweENGRkMsIDB4RDAwMCwgMHhEMDA0LCAweEQwMTEsIDB4RDAxOCwgMHhEMDJELAotICAgIDB4RDAzNCwgMHhEMDM1LCAweEQwMzgsIDB4RDAzQywgMHhEMDQ0LCAweEQwNDUsIDB4RDA0NywgMHhEMDQ5LAotICAgIDB4RDA1MCwgMHhEMDU0LCAweEQwNTgsIDB4RDA2MCwgMHhEMDZDLCAweEQwNkQsIDB4RDA3MCwgMHhEMDc0LAotICAgIDB4RDA3QywgMHhEMDdELCAweEQwODEsIDB4RDBBNCwgMHhEMEE1LCAweEQwQTgsIDB4RDBBQywgMHhEMEI0LAotICAgIDB4RDBCNSwgMHhEMEI3LCAweEQwQjksIDB4RDBDMCwgMHhEMEMxLCAweEQwQzQsIDB4RDBDOCwgMHhEMEM5LAotICAgIDB4RDBEMCwgMHhEMEQxLCAweEQwRDMsIDB4RDBENCwgMHhEMEQ1LCAweEQwREMsIDB4RDBERCwgMHhEMEUwLAotICAgIDB4RDBFNCwgMHhEMEVDLCAweEQwRUQsIDB4RDBFRiwgMHhEMEYwLCAweEQwRjEsIDB4RDBGOCwgMHhEMTBELAotICAgIDB4RDEzMCwgMHhEMTMxLCAweEQxMzQsIDB4RDEzOCwgMHhEMTNBLCAweEQxNDAsIDB4RDE0MSwgMHhEMTQzLAotICAgIDB4RDE0NCwgMHhEMTQ1LCAweEQxNEMsIDB4RDE0RCwgMHhEMTUwLCAweEQxNTQsIDB4RDE1QywgMHhEMTVELAotICAgIDB4RDE1RiwgMHhEMTYxLCAweEQxNjgsIDB4RDE2QywgMHhEMTdDLCAweEQxODQsIDB4RDE4OCwgMHhEMUEwLAotICAgIDB4RDFBMSwgMHhEMUE0LCAweEQxQTgsIDB4RDFCMCwgMHhEMUIxLCAweEQxQjMsIDB4RDFCNSwgMHhEMUJBLAotICAgIDB4RDFCQywgMHhEMUMwLCAweEQxRDgsIDB4RDFGNCwgMHhEMUY4LCAweEQyMDcsIDB4RDIwOSwgMHhEMjEwLAotICAgIDB4RDIyQywgMHhEMjJELCAweEQyMzAsIDB4RDIzNCwgMHhEMjNDLCAweEQyM0QsIDB4RDIzRiwgMHhEMjQxLAotICAgIDB4RDI0OCwgMHhEMjVDLCAweEQyNjQsIDB4RDI4MCwgMHhEMjgxLCAweEQyODQsIDB4RDI4OCwgMHhEMjkwLAotICAgIDB4RDI5MSwgMHhEMjk1LCAweEQyOUMsIDB4RDJBMCwgMHhEMkE0LCAweEQyQUMsIDB4RDJCMSwgMHhEMkI4LAotICAgIDB4RDJCOSwgMHhEMkJDLCAweEQyQkYsIDB4RDJDMCwgMHhEMkMyLCAweEQyQzgsIDB4RDJDOSwgMHhEMkNCLAotICAgIDB4RDJENCwgMHhEMkQ4LCAweEQyREMsIDB4RDJFNCwgMHhEMkU1LCAweEQyRjAsIDB4RDJGMSwgMHhEMkY0LAotICAgIDB4RDJGOCwgMHhEMzAwLCAweEQzMDEsIDB4RDMwMywgMHhEMzA1LCAweEQzMEMsIDB4RDMwRCwgMHhEMzBFLAotICAgIDB4RDMxMCwgMHhEMzE0LCAweEQzMTYsIDB4RDMxQywgMHhEMzFELCAweEQzMUYsIDB4RDMyMCwgMHhEMzIxLAotICAgIDB4RDMyNSwgMHhEMzI4LCAweEQzMjksIDB4RDMyQywgMHhEMzMwLCAweEQzMzgsIDB4RDMzOSwgMHhEMzNCLAotICAgIDB4RDMzQywgMHhEMzNELCAweEQzNDQsIDB4RDM0NSwgMHhEMzdDLCAweEQzN0QsIDB4RDM4MCwgMHhEMzg0LAotICAgIDB4RDM4QywgMHhEMzhELCAweEQzOEYsIDB4RDM5MCwgMHhEMzkxLCAweEQzOTgsIDB4RDM5OSwgMHhEMzlDLAotICAgIDB4RDNBMCwgMHhEM0E4LCAweEQzQTksIDB4RDNBQiwgMHhEM0FELCAweEQzQjQsIDB4RDNCOCwgMHhEM0JDLAotICAgIDB4RDNDNCwgMHhEM0M1LCAweEQzQzgsIDB4RDNDOSwgMHhEM0QwLCAweEQzRDgsIDB4RDNFMSwgMHhEM0UzLAotICAgIDB4RDNFQywgMHhEM0VELCAweEQzRjAsIDB4RDNGNCwgMHhEM0ZDLCAweEQzRkQsIDB4RDNGRiwgMHhENDAxLAotICAgIDB4RDQwOCwgMHhENDFELCAweEQ0NDAsIDB4RDQ0NCwgMHhENDVDLCAweEQ0NjAsIDB4RDQ2NCwgMHhENDZELAotICAgIDB4RDQ2RiwgMHhENDc4LCAweEQ0NzksIDB4RDQ3QywgMHhENDdGLCAweEQ0ODAsIDB4RDQ4MiwgMHhENDg4LAotICAgIDB4RDQ4OSwgMHhENDhCLCAweEQ0OEQsIDB4RDQ5NCwgMHhENEE5LCAweEQ0Q0MsIDB4RDREMCwgMHhENEQ0LAotICAgIDB4RDREQywgMHhENERGLCAweEQ0RTgsIDB4RDRFQywgMHhENEYwLCAweEQ0RjgsIDB4RDRGQiwgMHhENEZELAotICAgIDB4RDUwNCwgMHhENTA4LCAweEQ1MEMsIDB4RDUxNCwgMHhENTE1LCAweEQ1MTcsIDB4RDUzQywgMHhENTNELAotICAgIDB4RDU0MCwgMHhENTQ0LCAweEQ1NEMsIDB4RDU0RCwgMHhENTRGLCAweEQ1NTEsIDB4RDU1OCwgMHhENTU5LAotICAgIDB4RDU1QywgMHhENTYwLCAweEQ1NjUsIDB4RDU2OCwgMHhENTY5LCAweEQ1NkIsIDB4RDU2RCwgMHhENTc0LAotICAgIDB4RDU3NSwgMHhENTc4LCAweEQ1N0MsIDB4RDU4NCwgMHhENTg1LCAweEQ1ODcsIDB4RDU4OCwgMHhENTg5LAotICAgIDB4RDU5MCwgMHhENUE1LCAweEQ1QzgsIDB4RDVDOSwgMHhENUNDLCAweEQ1RDAsIDB4RDVEMiwgMHhENUQ4LAotICAgIDB4RDVEOSwgMHhENURCLCAweEQ1REQsIDB4RDVFNCwgMHhENUU1LCAweEQ1RTgsIDB4RDVFQywgMHhENUY0LAotICAgIDB4RDVGNSwgMHhENUY3LCAweEQ1RjksIDB4RDYwMCwgMHhENjAxLCAweEQ2MDQsIDB4RDYwOCwgMHhENjEwLAotICAgIDB4RDYxMSwgMHhENjEzLCAweEQ2MTQsIDB4RDYxNSwgMHhENjFDLCAweEQ2MjAsIDB4RDYyNCwgMHhENjJELAotICAgIDB4RDYzOCwgMHhENjM5LCAweEQ2M0MsIDB4RDY0MCwgMHhENjQ1LCAweEQ2NDgsIDB4RDY0OSwgMHhENjRCLAotICAgIDB4RDY0RCwgMHhENjUxLCAweEQ2NTQsIDB4RDY1NSwgMHhENjU4LCAweEQ2NUMsIDB4RDY2NywgMHhENjY5LAotICAgIDB4RDY3MCwgMHhENjcxLCAweEQ2NzQsIDB4RDY4MywgMHhENjg1LCAweEQ2OEMsIDB4RDY4RCwgMHhENjkwLAotICAgIDB4RDY5NCwgMHhENjlELCAweEQ2OUYsIDB4RDZBMSwgMHhENkE4LCAweEQ2QUMsIDB4RDZCMCwgMHhENkI5LAotICAgIDB4RDZCQiwgMHhENkM0LCAweEQ2QzUsIDB4RDZDOCwgMHhENkNDLCAweEQ2RDEsIDB4RDZENCwgMHhENkQ3LAotICAgIDB4RDZEOSwgMHhENkUwLCAweEQ2RTQsIDB4RDZFOCwgMHhENkYwLCAweEQ2RjUsIDB4RDZGQywgMHhENkZELAotICAgIDB4RDcwMCwgMHhENzA0LCAweEQ3MTEsIDB4RDcxOCwgMHhENzE5LCAweEQ3MUMsIDB4RDcyMCwgMHhENzI4LAotICAgIDB4RDcyOSwgMHhENzJCLCAweEQ3MkQsIDB4RDczNCwgMHhENzM1LCAweEQ3MzgsIDB4RDczQywgMHhENzQ0LAotICAgIDB4RDc0NywgMHhENzQ5LCAweEQ3NTAsIDB4RDc1MSwgMHhENzU0LCAweEQ3NTYsIDB4RDc1NywgMHhENzU4LAotICAgIDB4RDc1OSwgMHhENzYwLCAweEQ3NjEsIDB4RDc2MywgMHhENzY1LCAweEQ3NjksIDB4RDc2QywgMHhENzcwLAotICAgIDB4RDc3NCwgMHhENzdDLCAweEQ3N0QsIDB4RDc4MSwgMHhENzg4LCAweEQ3ODksIDB4RDc4QywgMHhENzkwLAotICAgIDB4RDc5OCwgMHhENzk5LCAweEQ3OUIsIDB4RDc5RCwgMHg0RjNELCAweDRGNzMsIDB4NTA0NywgMHg1MEY5LAotICAgIDB4NTJBMCwgMHg1M0VGLCAweDU0NzUsIDB4NTRFNSwgMHg1NjA5LCAweDVBQzEsIDB4NUJCNiwgMHg2Njg3LAotICAgIDB4NjdCNiwgMHg2N0I3LCAweDY3RUYsIDB4NkI0QywgMHg3M0MyLCAweDc1QzIsIDB4N0EzQywgMHg4MkRCLAotICAgIDB4ODMwNCwgMHg4ODU3LCAweDg4ODgsIDB4OEEzNiwgMHg4Q0M4LCAweDhEQ0YsIDB4OEVGQiwgMHg4RkU2LAotICAgIDB4OTlENSwgMHg1MjNCLCAweDUzNzQsIDB4NTQwNCwgMHg2MDZBLCAweDYxNjQsIDB4NkJCQywgMHg3M0NGLAotICAgIDB4ODExQSwgMHg4OUJBLCAweDg5RDIsIDB4OTVBMywgMHg0RjgzLCAweDUyMEEsIDB4NThCRSwgMHg1OTc4LAotICAgIDB4NTlFNiwgMHg1RTcyLCAweDVFNzksIDB4NjFDNywgMHg2M0MwLCAweDY3NDYsIDB4NjdFQywgMHg2ODdGLAotICAgIDB4NkY5NywgMHg3NjRFLCAweDc3MEIsIDB4NzhGNSwgMHg3QTA4LCAweDdBRkYsIDB4N0MyMSwgMHg4MDlELAotICAgIDB4ODI2RSwgMHg4MjcxLCAweDhBRUIsIDB4OTU5MywgMHg0RTZCLCAweDU1OUQsIDB4NjZGNywgMHg2RTM0LAotICAgIDB4NzhBMywgMHg3QUVELCAweDg0NUIsIDB4ODkxMCwgMHg4NzRFLCAweDk3QTgsIDB4NTJEOCwgMHg1NzRFLAotICAgIDB4NTgyQSwgMHg1RDRDLCAweDYxMUYsIDB4NjFCRSwgMHg2MjIxLCAweDY1NjIsIDB4NjdEMSwgMHg2QTQ0LAotICAgIDB4NkUxQiwgMHg3NTE4LCAweDc1QjMsIDB4NzZFMywgMHg3N0IwLCAweDdEM0EsIDB4OTBBRiwgMHg5NDUxLAotICAgIDB4OTQ1MiwgMHg5Rjk1LCAweDUzMjMsIDB4NUNBQywgMHg3NTMyLCAweDgwREIsIDB4OTI0MCwgMHg5NTk4LAotICAgIDB4NTI1QiwgMHg1ODA4LCAweDU5REMsIDB4NUNBMSwgMHg1RDE3LCAweDVFQjcsIDB4NUYzQSwgMHg1RjRBLAotICAgIDB4NjE3NywgMHg2QzVGLCAweDc1N0EsIDB4NzU4NiwgMHg3Q0UwLCAweDdENzMsIDB4N0RCMSwgMHg3RjhDLAotICAgIDB4ODE1NCwgMHg4MjIxLCAweDg1OTEsIDB4ODk0MSwgMHg4QjFCLCAweDkyRkMsIDB4OTY0RCwgMHg5QzQ3LAotICAgIDB4NEVDQiwgMHg0RUY3LCAweDUwMEIsIDB4NTFGMSwgMHg1ODRGLCAweDYxMzcsIDB4NjEzRSwgMHg2MTY4LAotICAgIDB4NjUzOSwgMHg2OUVBLCAweDZGMTEsIDB4NzVBNSwgMHg3Njg2LCAweDc2RDYsIDB4N0I4NywgMHg4MkE1LAotICAgIDB4ODRDQiwgMHg5M0E3LCAweDk1OEIsIDB4NTU4MCwgMHg1QkEyLCAweDU3NTEsIDB4N0NCMywgMHg3RkI5LAotICAgIDB4OTFCNSwgMHg1MDI4LCAweDUzQkIsIDB4NUM0NSwgMHg1REU4LCAweDYyRDIsIDB4NjM2RSwgMHg2NERBLAotICAgIDB4NjRFNywgMHg2RTIwLCAweDcwQUMsIDB4Nzk1QiwgMHg4RERELCAweDhFMUUsIDB4OTA3RCwgMHg5MjQ1LAotICAgIDB4OTJGOCwgMHg0RTdFLCAweDRFRjYsIDB4NTA2NSwgMHg1REZFLCAweDVFRkEsIDB4NjEwNiwgMHg2OTU3LAotICAgIDB4ODE3MSwgMHg4NjU0LCAweDhFNDcsIDB4OTM3NSwgMHg5QTJCLCAweDRFNUUsIDB4NTA5MSwgMHg2NzcwLAotICAgIDB4Njg0MCwgMHg1MTA5LCAweDUyOEQsIDB4NTI5MiwgMHg2QUEyLCAweDc3QkMsIDB4OTIxMCwgMHg5RUQ0LAotICAgIDB4NTJBQiwgMHg2MDJGLCAweDhGRjIsIDB4NTA0OCwgMHg2MUE5LCAweDYzRUQsIDB4NjRDQSwgMHg2ODNDLAotICAgIDB4NkE4NCwgMHg2RkMwLCAweDgxODgsIDB4ODlBMSwgMHg5Njk0LCAweDU4MDUsIDB4NzI3RCwgMHg3MkFDLAotICAgIDB4NzUwNCwgMHg3RDc5LCAweDdFNkQsIDB4ODBBOSwgMHg4OThCLCAweDhCNzQsIDB4OTA2MywgMHg5RDUxLAotICAgIDB4NjI4OSwgMHg2QzdBLCAweDZGNTQsIDB4N0Q1MCwgMHg3RjNBLCAweDhBMjMsIDB4NTE3QywgMHg2MTRBLAotICAgIDB4N0I5RCwgMHg4QjE5LCAweDkyNTcsIDB4OTM4QywgMHg0RUFDLCAweDRGRDMsIDB4NTAxRSwgMHg1MEJFLAotICAgIDB4NTEwNiwgMHg1MkMxLCAweDUyQ0QsIDB4NTM3RiwgMHg1NzcwLCAweDU4ODMsIDB4NUU5QSwgMHg1RjkxLAotICAgIDB4NjE3NiwgMHg2MUFDLCAweDY0Q0UsIDB4NjU2QywgMHg2NjZGLCAweDY2QkIsIDB4NjZGNCwgMHg2ODk3LAotICAgIDB4NkQ4NywgMHg3MDg1LCAweDcwRjEsIDB4NzQ5RiwgMHg3NEE1LCAweDc0Q0EsIDB4NzVEOSwgMHg3ODZDLAotICAgIDB4NzhFQywgMHg3QURGLCAweDdBRjYsIDB4N0Q0NSwgMHg3RDkzLCAweDgwMTUsIDB4ODAzRiwgMHg4MTFCLAotICAgIDB4ODM5NiwgMHg4QjY2LCAweDhGMTUsIDB4OTAxNSwgMHg5M0UxLCAweDk4MDMsIDB4OTgzOCwgMHg5QTVBLAotICAgIDB4OUJFOCwgMHg0RkMyLCAweDU1NTMsIDB4NTgzQSwgMHg1OTUxLCAweDVCNjMsIDB4NUM0NiwgMHg2MEI4LAotICAgIDB4NjIxMiwgMHg2ODQyLCAweDY4QjAsIDB4NjhFOCwgMHg2RUFBLCAweDc1NEMsIDB4NzY3OCwgMHg3OENFLAotICAgIDB4N0EzRCwgMHg3Q0ZCLCAweDdFNkIsIDB4N0U3QywgMHg4QTA4LCAweDhBQTEsIDB4OEMzRiwgMHg5NjhFLAotICAgIDB4OURDNCwgMHg1M0U0LCAweDUzRTksIDB4NTQ0QSwgMHg1NDcxLCAweDU2RkEsIDB4NTlEMSwgMHg1QjY0LAotICAgIDB4NUMzQiwgMHg1RUFCLCAweDYyRjcsIDB4NjUzNywgMHg2NTQ1LCAweDY1NzIsIDB4NjZBMCwgMHg2N0FGLAotICAgIDB4NjlDMSwgMHg2Q0JELCAweDc1RkMsIDB4NzY5MCwgMHg3NzdFLCAweDdBM0YsIDB4N0Y5NCwgMHg4MDAzLAotICAgIDB4ODBBMSwgMHg4MThGLCAweDgyRTYsIDB4ODJGRCwgMHg4M0YwLCAweDg1QzEsIDB4ODgzMSwgMHg4OEI0LAotICAgIDB4OEFBNSwgMHg4RjlDLCAweDkzMkUsIDB4OTZDNywgMHg5ODY3LCAweDlBRDgsIDB4OUYxMywgMHg1NEVELAotICAgIDB4NjU5QiwgMHg2NkYyLCAweDY4OEYsIDB4N0E0MCwgMHg4QzM3LCAweDlENjAsIDB4NTZGMCwgMHg1NzY0LAotICAgIDB4NUQxMSwgMHg2NjA2LCAweDY4QjEsIDB4NjhDRCwgMHg2RUZFLCAweDc0MjgsIDB4ODg5RSwgMHg5QkU0LAotICAgIDB4NkM2OCwgMHg5QUE4LCAweDRGOUIsIDB4NTE2QywgMHg1MTcxLCAweDUyOUYsIDB4NUI1NCwgMHg1REU1LAotICAgIDB4NjA1MCwgMHg2MDZELCAweDYyRjEsIDB4NjNBNywgMHg2NTNCLCAweDczRDksIDB4N0E3QSwgMHg4NkEzLAotICAgIDB4OENBMiwgMHg5NzhGLCAweDRFMzIsIDB4NUJFMSwgMHg2MjA4LCAweDY3OUMsIDB4NzREQywgMHg3OUQxLAotICAgIDB4ODNEMywgMHg4QTg3LCAweDhBQjIsIDB4OERFOCwgMHg5MDRFLCAweDkzNEIsIDB4OTg0NiwgMHg1RUQzLAotICAgIDB4NjlFOCwgMHg4NUZGLCAweDkwRUQsIDB4NTFBMCwgMHg1Qjk4LCAweDVCRUMsIDB4NjE2MywgMHg2OEZBLAotICAgIDB4NkIzRSwgMHg3MDRDLCAweDc0MkYsIDB4NzREOCwgMHg3QkExLCAweDdGNTAsIDB4ODNDNSwgMHg4OUMwLAotICAgIDB4OENBQiwgMHg5NURDLCAweDk5MjgsIDB4NTIyRSwgMHg2MDVELCAweDYyRUMsIDB4OTAwMiwgMHg0RjhBLAotICAgIDB4NTE0OSwgMHg1MzIxLCAweDU4RDksIDB4NUVFMywgMHg2NkUwLCAweDZEMzgsIDB4NzA5QSwgMHg3MkMyLAotICAgIDB4NzNENiwgMHg3QjUwLCAweDgwRjEsIDB4OTQ1QiwgMHg1MzY2LCAweDYzOUIsIDB4N0Y2QiwgMHg0RTU2LAotICAgIDB4NTA4MCwgMHg1ODRBLCAweDU4REUsIDB4NjAyQSwgMHg2MTI3LCAweDYyRDAsIDB4NjlEMCwgMHg5QjQxLAotICAgIDB4NUI4RiwgMHg3RDE4LCAweDgwQjEsIDB4OEY1RiwgMHg0RUE0LCAweDUwRDEsIDB4NTRBQywgMHg1NUFDLAotICAgIDB4NUIwQywgMHg1REEwLCAweDVERTcsIDB4NjUyQSwgMHg2NTRFLCAweDY4MjEsIDB4NkE0QiwgMHg3MkUxLAotICAgIDB4NzY4RSwgMHg3N0VGLCAweDdENUUsIDB4N0ZGOSwgMHg4MUEwLCAweDg1NEUsIDB4ODZERiwgMHg4RjAzLAotICAgIDB4OEY0RSwgMHg5MENBLCAweDk5MDMsIDB4OUE1NSwgMHg5QkFCLCAweDRFMTgsIDB4NEU0NSwgMHg0RTVELAotICAgIDB4NEVDNywgMHg0RkYxLCAweDUxNzcsIDB4NTJGRSwgMHg1MzQwLCAweDUzRTMsIDB4NTNFNSwgMHg1NDhFLAotICAgIDB4NTYxNCwgMHg1Nzc1LCAweDU3QTIsIDB4NUJDNywgMHg1RDg3LCAweDVFRDAsIDB4NjFGQywgMHg2MkQ4LAotICAgIDB4NjU1MSwgMHg2N0I4LCAweDY3RTksIDB4NjlDQiwgMHg2QjUwLCAweDZCQzYsIDB4NkJFQywgMHg2QzQyLAotICAgIDB4NkU5RCwgMHg3MDc4LCAweDcyRDcsIDB4NzM5NiwgMHg3NDAzLCAweDc3QkYsIDB4NzdFOSwgMHg3QTc2LAotICAgIDB4N0Q3RiwgMHg4MDA5LCAweDgxRkMsIDB4ODIwNSwgMHg4MjBBLCAweDgyREYsIDB4ODg2MiwgMHg4QjMzLAotICAgIDB4OENGQywgMHg4RUMwLCAweDkwMTEsIDB4OTBCMSwgMHg5MjY0LCAweDkyQjYsIDB4OTlEMiwgMHg5QTQ1LAotICAgIDB4OUNFOSwgMHg5REQ3LCAweDlGOUMsIDB4NTcwQiwgMHg1QzQwLCAweDgzQ0EsIDB4OTdBMCwgMHg5N0FCLAotICAgIDB4OUVCNCwgMHg1NDFCLCAweDdBOTgsIDB4N0ZBNCwgMHg4OEQ5LCAweDhFQ0QsIDB4OTBFMSwgMHg1ODAwLAotICAgIDB4NUM0OCwgMHg2Mzk4LCAweDdBOUYsIDB4NUJBRSwgMHg1RjEzLCAweDdBNzksIDB4N0FBRSwgMHg4MjhFLAotICAgIDB4OEVBQywgMHg1MDI2LCAweDUyMzgsIDB4NTJGOCwgMHg1Mzc3LCAweDU3MDgsIDB4NjJGMywgMHg2MzcyLAotICAgIDB4NkIwQSwgMHg2REMzLCAweDc3MzcsIDB4NTNBNSwgMHg3MzU3LCAweDg1NjgsIDB4OEU3NiwgMHg5NUQ1LAotICAgIDB4NjczQSwgMHg2QUMzLCAweDZGNzAsIDB4OEE2RCwgMHg4RUNDLCAweDk5NEIsIDB4NjY3NywgMHg2Qjc4LAotICAgIDB4OENCNCwgMHg5QjNDLCAweDUzRUIsIDB4NTcyRCwgMHg1OTRFLCAweDYzQzYsIDB4NjlGQiwgMHg3M0VBLAotICAgIDB4Nzg0NSwgMHg3QUJBLCAweDdBQzUsIDB4N0NGRSwgMHg4NDc1LCAweDg5OEYsIDB4OEQ3MywgMHg5MDM1LAotICAgIDB4OTVBOCwgMHg1MkZCLCAweDU3NDcsIDB4NzU0NywgMHg3QjYwLCAweDgzQ0MsIDB4OTIxRSwgMHg2QTU4LAotICAgIDB4NTE0QiwgMHg1MjRCLCAweDUyODcsIDB4NjIxRiwgMHg2OEQ4LCAweDY5NzUsIDB4OTY5OSwgMHg1MEM1LAotICAgIDB4NTJBNCwgMHg1MkU0LCAweDYxQzMsIDB4NjVBNCwgMHg2ODM5LCAweDY5RkYsIDB4NzQ3RSwgMHg3QjRCLAotICAgIDB4ODJCOSwgMHg4M0VCLCAweDg5QjIsIDB4OEIzOSwgMHg4RkQxLCAweDk5NDksIDB4NEVDQSwgMHg1OTk3LAotICAgIDB4NjREMiwgMHg2NjExLCAweDZBOEUsIDB4NzQzNCwgMHg3OTgxLCAweDc5QkQsIDB4ODJBOSwgMHg4ODdFLAotICAgIDB4ODg3RiwgMHg4OTVGLCAweDkzMjYsIDB4NEYwQiwgMHg1M0NBLCAweDYwMjUsIDB4NjI3MSwgMHg2QzcyLAotICAgIDB4N0QxQSwgMHg3RDY2LCAweDRFOTgsIDB4NTE2MiwgMHg3N0RDLCAweDgwQUYsIDB4NEYwMSwgMHg0RjBFLAotICAgIDB4NTE3NiwgMHg1MTgwLCAweDU1REMsIDB4NTY2OCwgMHg1NzNCLCAweDU3RkEsIDB4NTdGQywgMHg1OTE0LAotICAgIDB4NTk0NywgMHg1OTkzLCAweDVCQzQsIDB4NUM5MCwgMHg1RDBFLCAweDVERjEsIDB4NUU3RSwgMHg1RkNDLAotICAgIDB4NjI4MCwgMHg2NUQ3LCAweDY1RTMsIDB4NjcxRSwgMHg2NzFGLCAweDY3NUUsIDB4NjhDQiwgMHg2OEM0LAotICAgIDB4NkE1RiwgMHg2QjNBLCAweDZDMjMsIDB4NkM3RCwgMHg2QzgyLCAweDZEQzcsIDB4NzM5OCwgMHg3NDI2LAotICAgIDB4NzQyQSwgMHg3NDgyLCAweDc0QTMsIDB4NzU3OCwgMHg3NTdGLCAweDc4ODEsIDB4NzhFRiwgMHg3OTQxLAotICAgIDB4Nzk0NywgMHg3OTQ4LCAweDc5N0EsIDB4N0I5NSwgMHg3RDAwLCAweDdEQkEsIDB4N0Y4OCwgMHg4MDA2LAotICAgIDB4ODAyRCwgMHg4MDhDLCAweDhBMTgsIDB4OEI0RiwgMHg4QzQ4LCAweDhENzcsIDB4OTMyMSwgMHg5MzI0LAotICAgIDB4OThFMiwgMHg5OTUxLCAweDlBMEUsIDB4OUEwRiwgMHg5QTY1LCAweDlFOTIsIDB4N0RDQSwgMHg0Rjc2LAotICAgIDB4NTQwOSwgMHg2MkVFLCAweDY4NTQsIDB4OTFEMSwgMHg1NUFCLCAweDUxM0EsIDB4NUExQywgMHg2MUU2LAotICAgIDB4NjJDRiwgMHg2MkZGLCAweDkwQTMsIDB4OEFGRSwgMHg2Njk2LCAweDcxNTYsIDB4OTZFMywgMHg2MzRGLAotICAgIDB4NjM3QSwgMHg1MzU3LCAweDY3OEYsIDB4Njk2MCwgMHg2RTczLCAweDc1MzcsIDB4N0QwRCwgMHg4ODcyLAotICAgIDB4NTZDQSwgMHg1QTE4LCAweDRFNDMsIDB4NTE2NywgMHg1OTQ4LCAweDY3RjAsIDB4ODAxMCwgMHg1OTczLAotICAgIDB4NUU3NCwgMHg2NDlBLCAweDc5Q0EsIDB4NUZGNSwgMHg2MDZDLCAweDYyQzgsIDB4NjM3QiwgMHg1QkU3LAotICAgIDB4NUJENywgMHg1MkFBLCAweDU5NzQsIDB4NUYyOSwgMHg2MDEyLCAweDc0NTksIDB4OTlEMSwgMHg2RkMzLAotICAgIDB4ODFCRiwgMHg4RkIyLCAweDYwRjEsIDB4ODE2NiwgMHg1QzNGLCAweDVBRTksIDB4OEEyNSwgMHg2NzdCLAotICAgIDB4N0QxMCwgMHg4MEZELCAweDVDM0MsIDB4NkNFNSwgMHg1MzNGLCAweDZFQkEsIDB4NTkxQSwgMHg4MzM2LAotICAgIDB4NEUzOSwgMHg0RUI2LCAweDRGNDYsIDB4NTVBRSwgMHg1NzE4LCAweDU4QzcsIDB4NUY1NiwgMHg2NUI3LAotICAgIDB4NjVFNiwgMHg2QTgwLCAweDZCQjUsIDB4NkU0RCwgMHg3N0VELCAweDdBRUYsIDB4N0MxRSwgMHg3RERFLAotICAgIDB4ODZDQiwgMHg4ODkyLCAweDkxMzIsIDB4OTM1QiwgMHg2NEJCLCAweDZGQkUsIDB4NzM3QSwgMHg3NUI4LAotICAgIDB4OTA1NCwgMHg1NTU2LCAweDU3NEQsIDB4NjFCQSwgMHg2NEQ0LCAweDY2QzcsIDB4NkRFMSwgMHg2RTVCLAotICAgIDB4NkY2RCwgMHg2RkI5LCAweDc1RjAsIDB4ODA0MywgMHg4MUJELCAweDg1NDEsIDB4ODk4MywgMHg4QUM3LAotICAgIDB4OEI1QSwgMHg5MzFGLCAweDZDOTMsIDB4NzU1MywgMHg3QjU0LCAweDhFMEYsIDB4OTA1RCwgMHg1NTEwLAotICAgIDB4NTgwMiwgMHg1ODU4LCAweDVFNjIsIDB4NjIwNywgMHg2NDlFLCAweDY4RTAsIDB4NzU3NiwgMHg3Q0Q2LAotICAgIDB4ODdCMywgMHg5RUU4LCAweDRFRTMsIDB4NTc4OCwgMHg1NzZFLCAweDU5MjcsIDB4NUMwRCwgMHg1Q0IxLAotICAgIDB4NUUzNiwgMHg1Rjg1LCAweDYyMzQsIDB4NjRFMSwgMHg3M0IzLCAweDgxRkEsIDB4ODg4QiwgMHg4Q0I4LAotICAgIDB4OTY4QSwgMHg5RURCLCAweDVCODUsIDB4NUZCNywgMHg2MEIzLCAweDUwMTIsIDB4NTIwMCwgMHg1MjMwLAotICAgIDB4NTcxNiwgMHg1ODM1LCAweDU4NTcsIDB4NUMwRSwgMHg1QzYwLCAweDVDRjYsIDB4NUQ4QiwgMHg1RUE2LAotICAgIDB4NUY5MiwgMHg2MEJDLCAweDYzMTEsIDB4NjM4OSwgMHg2NDE3LCAweDY4NDMsIDB4NjhGOSwgMHg2QUMyLAotICAgIDB4NkREOCwgMHg2RTIxLCAweDZFRDQsIDB4NkZFNCwgMHg3MUZFLCAweDc2REMsIDB4Nzc3OSwgMHg3OUIxLAotICAgIDB4N0EzQiwgMHg4NDA0LCAweDg5QTksIDB4OENFRCwgMHg4REYzLCAweDhFNDgsIDB4OTAwMywgMHg5MDE0LAotICAgIDB4OTA1MywgMHg5MEZELCAweDkzNEQsIDB4OTY3NiwgMHg5N0RDLCAweDZCRDIsIDB4NzAwNiwgMHg3MjU4LAotICAgIDB4NzJBMiwgMHg3MzY4LCAweDc3NjMsIDB4NzlCRiwgMHg3QkU0LCAweDdFOUIsIDB4OEI4MCwgMHg1OEE5LAotICAgIDB4NjBDNywgMHg2NTY2LCAweDY1RkQsIDB4NjZCRSwgMHg2QzhDLCAweDcxMUUsIDB4NzFDOSwgMHg4QzVBLAotICAgIDB4OTgxMywgMHg0RTZELCAweDdBODEsIDB4NEVERCwgMHg1MUFDLCAweDUxQ0QsIDB4NTJENSwgMHg1NDBDLAotICAgIDB4NjFBNywgMHg2NzcxLCAweDY4NTAsIDB4NjhERiwgMHg2RDFFLCAweDZGN0MsIDB4NzVCQywgMHg3N0IzLAotICAgIDB4N0FFNSwgMHg4MEY0LCAweDg0NjMsIDB4OTI4NSwgMHg1MTVDLCAweDY1OTcsIDB4Njc1QywgMHg2NzkzLAotICAgIDB4NzVEOCwgMHg3QUM3LCAweDgzNzMsIDB4OEM0NiwgMHg5MDE3LCAweDk4MkQsIDB4NUM2RiwgMHg4MUMwLAotICAgIDB4ODI5QSwgMHg5MDQxLCAweDkwNkYsIDB4OTIwRCwgMHg1Rjk3LCAweDVEOUQsIDB4NkE1OSwgMHg3MUM4LAotICAgIDB4NzY3QiwgMHg3QjQ5LCAweDg1RTQsIDB4OEIwNCwgMHg5MTI3LCAweDlBMzAsIDB4NTU4NywgMHg2MUY2LAotICAgIDB4NzY2OSwgMHg3Rjg1LCAweDg2M0YsIDB4ODdCQSwgMHg4OEY4LCAweDkwOEYsIDB4NkQxQiwgMHg3MEQ5LAotICAgIDB4NzNERSwgMHg3RDYxLCAweDg0M0QsIDB4OTE2QSwgMHg5OUYxLCAweDRFODIsIDB4NTM3NSwgMHg2QjA0LAotICAgIDB4NkIxMiwgMHg3MDNFLCAweDcyMUIsIDB4ODYyRCwgMHg5RTFFLCAweDUyNEMsIDB4OEZBMywgMHg1RDUwLAotICAgIDB4NjRFNSwgMHg2NTJDLCAweDZCMTYsIDB4NkZFQiwgMHg3QzQzLCAweDdFOUMsIDB4ODVDRCwgMHg4OTY0LAotICAgIDB4ODlCRCwgMHg2MkM5LCAweDgxRDgsIDB4ODgxRiwgMHg1RUNBLCAweDY3MTcsIDB4NkQ2QSwgMHg3MkZDLAotICAgIDB4NzQwNSwgMHg3NDZGLCAweDg3ODIsIDB4OTBERSwgMHg0Rjg2LCAweDVEMEQsIDB4NUZBMCwgMHg4NDBBLAotICAgIDB4NTFCNywgMHg2M0EwLCAweDc1NjUsIDB4NEVBRSwgMHg1MDA2LCAweDUxNjksIDB4NTFDOSwgMHg2ODgxLAotICAgIDB4NkExMSwgMHg3Q0FFLCAweDdDQjEsIDB4N0NFNywgMHg4MjZGLCAweDhBRDIsIDB4OEYxQiwgMHg5MUNGLAotICAgIDB4NEZCNiwgMHg1MTM3LCAweDUyRjUsIDB4NTQ0MiwgMHg1RUVDLCAweDYxNkUsIDB4NjIzRSwgMHg2NUM1LAotICAgIDB4NkFEQSwgMHg2RkZFLCAweDc5MkEsIDB4ODVEQywgMHg4ODIzLCAweDk1QUQsIDB4OUE2MiwgMHg5QTZBLAotICAgIDB4OUU5NywgMHg5RUNFLCAweDUyOUIsIDB4NjZDNiwgMHg2Qjc3LCAweDcwMUQsIDB4NzkyQiwgMHg4RjYyLAotICAgIDB4OTc0MiwgMHg2MTkwLCAweDYyMDAsIDB4NjUyMywgMHg2RjIzLCAweDcxNDksIDB4NzQ4OSwgMHg3REY0LAotICAgIDB4ODA2RiwgMHg4NEVFLCAweDhGMjYsIDB4OTAyMywgMHg5MzRBLCAweDUxQkQsIDB4NTIxNywgMHg1MkEzLAotICAgIDB4NkQwQywgMHg3MEM4LCAweDg4QzIsIDB4NUVDOSwgMHg2NTgyLCAweDZCQUUsIDB4NkZDMiwgMHg3QzNFLAotICAgIDB4NzM3NSwgMHg0RUU0LCAweDRGMzYsIDB4NTZGOSwgMHg1Q0JBLCAweDVEQkEsIDB4NjAxQywgMHg3M0IyLAotICAgIDB4N0IyRCwgMHg3RjlBLCAweDdGQ0UsIDB4ODA0NiwgMHg5MDFFLCAweDkyMzQsIDB4OTZGNiwgMHg5NzQ4LAotICAgIDB4OTgxOCwgMHg5RjYxLCAweDRGOEIsIDB4NkZBNywgMHg3OUFFLCAweDkxQjQsIDB4OTZCNywgMHg1MkRFLAotICAgIDB4NjQ4OCwgMHg2NEM0LCAweDZBRDMsIDB4NkY1RSwgMHg3MDE4LCAweDcyMTAsIDB4NzZFNywgMHg4MDAxLAotICAgIDB4ODYwNiwgMHg4NjVDLCAweDhERUYsIDB4OEYwNSwgMHg5NzMyLCAweDlCNkYsIDB4OURGQSwgMHg5RTc1LAotICAgIDB4Nzg4QywgMHg3OTdGLCAweDdEQTAsIDB4ODNDOSwgMHg5MzA0LCAweDlFN0YsIDB4OUU5MywgMHg4QUQ2LAotICAgIDB4NThERiwgMHg1RjA0LCAweDY3MjcsIDB4NzAyNywgMHg3NENGLCAweDdDNjAsIDB4ODA3RSwgMHg1MTIxLAotICAgIDB4NzAyOCwgMHg3MjYyLCAweDc4Q0EsIDB4OENDMiwgMHg4Q0RBLCAweDhDRjQsIDB4OTZGNywgMHg0RTg2LAotICAgIDB4NTBEQSwgMHg1QkVFLCAweDVFRDYsIDB4NjU5OSwgMHg3MUNFLCAweDc2NDIsIDB4NzdBRCwgMHg4MDRBLAotICAgIDB4ODRGQywgMHg5MDdDLCAweDlCMjcsIDB4OUY4RCwgMHg1OEQ4LCAweDVBNDEsIDB4NUM2MiwgMHg2QTEzLAotICAgIDB4NkREQSwgMHg2RjBGLCAweDc2M0IsIDB4N0QyRiwgMHg3RTM3LCAweDg1MUUsIDB4ODkzOCwgMHg5M0U0LAotICAgIDB4OTY0QiwgMHg1Mjg5LCAweDY1RDIsIDB4NjdGMywgMHg2OUI0LCAweDZENDEsIDB4NkU5QywgMHg3MDBGLAotICAgIDB4NzQwOSwgMHg3NDYwLCAweDc1NTksIDB4NzYyNCwgMHg3ODZCLCAweDhCMkMsIDB4OTg1RSwgMHg1MTZELAotICAgIDB4NjIyRSwgMHg5Njc4LCAweDRGOTYsIDB4NTAyQiwgMHg1RDE5LCAweDZERUEsIDB4N0RCOCwgMHg4RjJBLAotICAgIDB4NUY4QiwgMHg2MTQ0LCAweDY4MTcsIDB4OTY4NiwgMHg1MkQyLCAweDgwOEIsIDB4NTFEQywgMHg1MUNDLAotICAgIDB4Njk1RSwgMHg3QTFDLCAweDdEQkUsIDB4ODNGMSwgMHg5Njc1LCAweDRGREEsIDB4NTIyOSwgMHg1Mzk4LAotICAgIDB4NTQwRiwgMHg1NTBFLCAweDVDNjUsIDB4NjBBNywgMHg2NzRFLCAweDY4QTgsIDB4NkQ2QywgMHg3MjgxLAotICAgIDB4NzJGOCwgMHg3NDA2LCAweDc0ODMsIDB4NzVFMiwgMHg3QzZDLCAweDdGNzksIDB4N0ZCOCwgMHg4Mzg5LAotICAgIDB4ODhDRiwgMHg4OEUxLCAweDkxQ0MsIDB4OTFEMCwgMHg5NkUyLCAweDlCQzksIDB4NTQxRCwgMHg2RjdFLAotICAgIDB4NzFEMCwgMHg3NDk4LCAweDg1RkEsIDB4OEVBQSwgMHg5NkEzLCAweDlDNTcsIDB4OUU5RiwgMHg2Nzk3LAotICAgIDB4NkRDQiwgMHg3NDMzLCAweDgxRTgsIDB4OTcxNiwgMHg3ODJDLCAweDdBQ0IsIDB4N0IyMCwgMHg3QzkyLAotICAgIDB4NjQ2OSwgMHg3NDZBLCAweDc1RjIsIDB4NzhCQywgMHg3OEU4LCAweDk5QUMsIDB4OUI1NCwgMHg5RUJCLAotICAgIDB4NUJERSwgMHg1RTU1LCAweDZGMjAsIDB4ODE5QywgMHg4M0FCLCAweDkwODgsIDB4NEUwNywgMHg1MzRELAotICAgIDB4NUEyOSwgMHg1REQyLCAweDVGNEUsIDB4NjE2MiwgMHg2MzNELCAweDY2NjksIDB4NjZGQywgMHg2RUZGLAotICAgIDB4NkYyQiwgMHg3MDYzLCAweDc3OUUsIDB4ODQyQywgMHg4NTEzLCAweDg4M0IsIDB4OEYxMywgMHg5OTQ1LAotICAgIDB4OUMzQiwgMHg1NTFDLCAweDYyQjksIDB4NjcyQiwgMHg2Q0FCLCAweDgzMDksIDB4ODk2QSwgMHg5NzdBLAotICAgIDB4NEVBMSwgMHg1OTg0LCAweDVGRDgsIDB4NUZEOSwgMHg2NzFCLCAweDdEQjIsIDB4N0Y1NCwgMHg4MjkyLAotICAgIDB4ODMyQiwgMHg4M0JELCAweDhGMUUsIDB4OTA5OSwgMHg1N0NCLCAweDU5QjksIDB4NUE5MiwgMHg1QkQwLAotICAgIDB4NjYyNywgMHg2NzlBLCAweDY4ODUsIDB4NkJDRiwgMHg3MTY0LCAweDdGNzUsIDB4OENCNywgMHg4Q0UzLAotICAgIDB4OTA4MSwgMHg5QjQ1LCAweDgxMDgsIDB4OEM4QSwgMHg5NjRDLCAweDlBNDAsIDB4OUVBNSwgMHg1QjVGLAotICAgIDB4NkMxMywgMHg3MzFCLCAweDc2RjIsIDB4NzZERiwgMHg4NDBDLCAweDUxQUEsIDB4ODk5MywgMHg1MTRELAotICAgIDB4NTE5NSwgMHg1MkM5LCAweDY4QzksIDB4NkM5NCwgMHg3NzA0LCAweDc3MjAsIDB4N0RCRiwgMHg3REVDLAotICAgIDB4OTc2MiwgMHg5RUI1LCAweDZFQzUsIDB4ODUxMSwgMHg1MUE1LCAweDU0MEQsIDB4NTQ3RCwgMHg2NjBFLAotICAgIDB4NjY5RCwgMHg2OTI3LCAweDZFOUYsIDB4NzZCRiwgMHg3NzkxLCAweDgzMTcsIDB4ODRDMiwgMHg4NzlGLAotICAgIDB4OTE2OSwgMHg5Mjk4LCAweDlDRjQsIDB4ODg4MiwgMHg0RkFFLCAweDUxOTIsIDB4NTJERiwgMHg1OUM2LAotICAgIDB4NUUzRCwgMHg2MTU1LCAweDY0NzgsIDB4NjQ3OSwgMHg2NkFFLCAweDY3RDAsIDB4NkEyMSwgMHg2QkNELAotICAgIDB4NkJEQiwgMHg3MjVGLCAweDcyNjEsIDB4NzQ0MSwgMHg3NzM4LCAweDc3REIsIDB4ODAxNywgMHg4MkJDLAotICAgIDB4ODMwNSwgMHg4QjAwLCAweDhCMjgsIDB4OEM4QywgMHg2NzI4LCAweDZDOTAsIDB4NzI2NywgMHg3NkVFLAotICAgIDB4Nzc2NiwgMHg3QTQ2LCAweDlEQTksIDB4NkI3RiwgMHg2QzkyLCAweDU5MjIsIDB4NjcyNiwgMHg4NDk5LAotICAgIDB4NTM2RiwgMHg1ODkzLCAweDU5OTksIDB4NUVERiwgMHg2M0NGLCAweDY2MzQsIDB4Njc3MywgMHg2RTNBLAotICAgIDB4NzMyQiwgMHg3QUQ3LCAweDgyRDcsIDB4OTMyOCwgMHg1MkQ5LCAweDVERUIsIDB4NjFBRSwgMHg2MUNCLAotICAgIDB4NjIwQSwgMHg2MkM3LCAweDY0QUIsIDB4NjVFMCwgMHg2OTU5LCAweDZCNjYsIDB4NkJDQiwgMHg3MTIxLAotICAgIDB4NzNGNywgMHg3NTVELCAweDdFNDYsIDB4ODIxRSwgMHg4MzAyLCAweDg1NkEsIDB4OEFBMywgMHg4Q0JGLAotICAgIDB4OTcyNywgMHg5RDYxLCAweDU4QTgsIDB4OUVEOCwgMHg1MDExLCAweDUyMEUsIDB4NTQzQiwgMHg1NTRGLAotICAgIDB4NjU4NywgMHg2Qzc2LCAweDdEMEEsIDB4N0QwQiwgMHg4MDVFLCAweDg2OEEsIDB4OTU4MCwgMHg5NkVGLAotICAgIDB4NTJGRiwgMHg2Qzk1LCAweDcyNjksIDB4NTQ3MywgMHg1QTlBLCAweDVDM0UsIDB4NUQ0QiwgMHg1RjRDLAotICAgIDB4NUZBRSwgMHg2NzJBLCAweDY4QjYsIDB4Njk2MywgMHg2RTNDLCAweDZFNDQsIDB4NzcwOSwgMHg3QzczLAotICAgIDB4N0Y4RSwgMHg4NTg3LCAweDhCMEUsIDB4OEZGNywgMHg5NzYxLCAweDlFRjQsIDB4NUNCNywgMHg2MEI2LAotICAgIDB4NjEwRCwgMHg2MUFCLCAweDY1NEYsIDB4NjVGQiwgMHg2NUZDLCAweDZDMTEsIDB4NkNFRiwgMHg3MzlGLAotICAgIDB4NzNDOSwgMHg3REUxLCAweDk1OTQsIDB4NUJDNiwgMHg4NzFDLCAweDhCMTAsIDB4NTI1RCwgMHg1MzVBLAotICAgIDB4NjJDRCwgMHg2NDBGLCAweDY0QjIsIDB4NjczNCwgMHg2QTM4LCAweDZDQ0EsIDB4NzNDMCwgMHg3NDlFLAotICAgIDB4N0I5NCwgMHg3Qzk1LCAweDdFMUIsIDB4ODE4QSwgMHg4MjM2LCAweDg1ODQsIDB4OEZFQiwgMHg5NkY5LAotICAgIDB4OTlDMSwgMHg0RjM0LCAweDUzNEEsIDB4NTNDRCwgMHg1M0RCLCAweDYyQ0MsIDB4NjQyQywgMHg2NTAwLAotICAgIDB4NjU5MSwgMHg2OUMzLCAweDZDRUUsIDB4NkY1OCwgMHg3M0VELCAweDc1NTQsIDB4NzYyMiwgMHg3NkU0LAotICAgIDB4NzZGQywgMHg3OEQwLCAweDc4RkIsIDB4NzkyQywgMHg3RDQ2LCAweDgyMkMsIDB4ODdFMCwgMHg4RkQ0LAotICAgIDB4OTgxMiwgMHg5OEVGLCAweDUyQzMsIDB4NjJENCwgMHg2NEE1LCAweDZFMjQsIDB4NkY1MSwgMHg3NjdDLAotICAgIDB4OERDQiwgMHg5MUIxLCAweDkyNjIsIDB4OUFFRSwgMHg5QjQzLCAweDUwMjMsIDB4NTA4RCwgMHg1NzRBLAotICAgIDB4NTlBOCwgMHg1QzI4LCAweDVFNDcsIDB4NUY3NywgMHg2MjNGLCAweDY1M0UsIDB4NjVCOSwgMHg2NUMxLAotICAgIDB4NjYwOSwgMHg2NzhCLCAweDY5OUMsIDB4NkVDMiwgMHg3OEM1LCAweDdEMjEsIDB4ODBBQSwgMHg4MTgwLAotICAgIDB4ODIyQiwgMHg4MkIzLCAweDg0QTEsIDB4ODY4QywgMHg4QTJBLCAweDhCMTcsIDB4OTBBNiwgMHg5NjMyLAotICAgIDB4OUY5MCwgMHg1MDBELCAweDRGRjMsIDB4NTdGOSwgMHg1Rjk4LCAweDYyREMsIDB4NjM5MiwgMHg2NzZGLAotICAgIDB4NkU0MywgMHg3MTE5LCAweDc2QzMsIDB4ODBDQywgMHg4MERBLCAweDg4RjQsIDB4ODhGNSwgMHg4OTE5LAotICAgIDB4OENFMCwgMHg4RjI5LCAweDkxNEQsIDB4OTY2QSwgMHg0RjJGLCAweDRGNzAsIDB4NUUxQiwgMHg2N0NGLAotICAgIDB4NjgyMiwgMHg3NjdELCAweDc2N0UsIDB4OUI0NCwgMHg1RTYxLCAweDZBMEEsIDB4NzE2OSwgMHg3MUQ0LAotICAgIDB4NzU2QSwgMHg3RTQxLCAweDg1NDMsIDB4ODVFOSwgMHg5OERDLCAweDRGMTAsIDB4N0I0RiwgMHg3RjcwLAotICAgIDB4OTVBNSwgMHg1MUUxLCAweDVFMDYsIDB4NjhCNSwgMHg2QzNFLCAweDZDNEUsIDB4NkNEQiwgMHg3MkFGLAotICAgIDB4N0JDNCwgMHg4MzAzLCAweDZDRDUsIDB4NzQzQSwgMHg1MEZCLCAweDUyODgsIDB4NThDMSwgMHg2NEQ4LAotICAgIDB4NkE5NywgMHg3NEE3LCAweDc2NTYsIDB4NzhBNywgMHg4NjE3LCAweDk1RTIsIDB4OTczOSwgMHg1MzVFLAotICAgIDB4NUYwMSwgMHg4QjhBLCAweDhGQTgsIDB4OEZBRiwgMHg5MDhBLCAweDUyMjUsIDB4NzdBNSwgMHg5QzQ5LAotICAgIDB4OUYwOCwgMHg0RTE5LCAweDUwMDIsIDB4NTE3NSwgMHg1QzVCLCAweDVFNzcsIDB4NjYxRSwgMHg2NjNBLAotICAgIDB4NjdDNCwgMHg2OEM1LCAweDcwQjMsIDB4NzUwMSwgMHg3NUM1LCAweDc5QzksIDB4N0FERCwgMHg4RjI3LAotICAgIDB4OTkyMCwgMHg5QTA4LCAweDRGREQsIDB4NTgyMSwgMHg1ODMxLCAweDVCRjYsIDB4NjY2RSwgMHg2QjY1LAotICAgIDB4NkQxMSwgMHg2RTdBLCAweDZGN0QsIDB4NzNFNCwgMHg3NTJCLCAweDgzRTksIDB4ODhEQywgMHg4OTEzLAotICAgIDB4OEI1QywgMHg4RjE0LCAweDRGMEYsIDB4NTBENSwgMHg1MzEwLCAweDUzNUMsIDB4NUI5MywgMHg1RkE5LAotICAgIDB4NjcwRCwgMHg3OThGLCAweDgxNzksIDB4ODMyRiwgMHg4NTE0LCAweDg5MDcsIDB4ODk4NiwgMHg4RjM5LAotICAgIDB4OEYzQiwgMHg5OUE1LCAweDlDMTIsIDB4NjcyQywgMHg0RTc2LCAweDRGRjgsIDB4NTk0OSwgMHg1QzAxLAotICAgIDB4NUNFRiwgMHg1Q0YwLCAweDYzNjcsIDB4NjhEMiwgMHg3MEZELCAweDcxQTIsIDB4NzQyQiwgMHg3RTJCLAotICAgIDB4ODRFQywgMHg4NzAyLCAweDkwMjIsIDB4OTJEMiwgMHg5Q0YzLCAweDRFMEQsIDB4NEVEOCwgMHg0RkVGLAotICAgIDB4NTA4NSwgMHg1MjU2LCAweDUyNkYsIDB4NTQyNiwgMHg1NDkwLCAweDU3RTAsIDB4NTkyQiwgMHg1QTY2LAotICAgIDB4NUI1QSwgMHg1Qjc1LCAweDVCQ0MsIDB4NUU5QywgMHg2Mjc2LCAweDY1NzcsIDB4NjVBNywgMHg2RDZFLAotICAgIDB4NkVBNSwgMHg3MjM2LCAweDdCMjYsIDB4N0MzRiwgMHg3RjM2LCAweDgxNTAsIDB4ODE1MSwgMHg4MTlBLAotICAgIDB4ODI0MCwgMHg4Mjk5LCAweDgzQTksIDB4OEEwMywgMHg4Q0EwLCAweDhDRTYsIDB4OENGQiwgMHg4RDc0LAotICAgIDB4OERCQSwgMHg5MEU4LCAweDkxREMsIDB4OTYxQywgMHg5NjQ0LCAweDk5RDksIDB4OUNFNywgMHg1MzE3LAotICAgIDB4NTIwNiwgMHg1NDI5LCAweDU2NzQsIDB4NThCMywgMHg1OTU0LCAweDU5NkUsIDB4NUZGRiwgMHg2MUE0LAotICAgIDB4NjI2RSwgMHg2NjEwLCAweDZDN0UsIDB4NzExQSwgMHg3NkM2LCAweDdDODksIDB4N0NERSwgMHg3RDFCLAotICAgIDB4ODJBQywgMHg4Q0MxLCAweDk2RjAsIDB4NEY1QiwgMHg1RjE3LCAweDVGN0YsIDB4NjJDMiwgMHg1RDI5LAotICAgIDB4NjcwQiwgMHg2OERBLCAweDc4N0MsIDB4N0U0MywgMHg5RDZDLCAweDRFMTUsIDB4NTA5OSwgMHg1MzE1LAotICAgIDB4NTMyQSwgMHg1MzUxLCAweDU5ODMsIDB4NUE2MiwgMHg1RTg3LCAweDYwQjIsIDB4NjE4QSwgMHg2MjQ5LAotICAgIDB4NjI3OSwgMHg2NTkwLCAweDY3ODcsIDB4NjlBNywgMHg2QkQ0LCAweDZCRDYsIDB4NkJENywgMHg2QkQ4LAotICAgIDB4NkNCOCwgMHg3NDM1LCAweDc1RkEsIDB4NzgxMiwgMHg3ODkxLCAweDc5RDUsIDB4NzlEOCwgMHg3QzgzLAotICAgIDB4N0RDQiwgMHg3RkUxLCAweDgwQTUsIDB4ODEzRSwgMHg4MUMyLCAweDgzRjIsIDB4ODcxQSwgMHg4OEU4LAotICAgIDB4OEFCOSwgMHg4QjZDLCAweDhDQkIsIDB4OTExOSwgMHg5NzVFLCAweDk4REIsIDB4OUYzQiwgMHg1NkFDLAotICAgIDB4NUIyQSwgMHg1RjZDLCAweDY1OEMsIDB4NkFCMywgMHg2QkFGLCAweDZENUMsIDB4NkZGMSwgMHg3MDE1LAotICAgIDB4NzI1RCwgMHg3M0FELCAweDhDQTcsIDB4OENEMywgMHg5ODNCLCAweDYxOTEsIDB4NkMzNywgMHg4MDU4LAotICAgIDB4OUEwMSwgMHg0RTRELCAweDRFOEIsIDB4NEU5QiwgMHg0RUQ1LCAweDRGM0EsIDB4NEYzQywgMHg0RjdGLAotICAgIDB4NEZERiwgMHg1MEZGLCAweDUzRjIsIDB4NTNGOCwgMHg1NTA2LCAweDU1RTMsIDB4NTZEQiwgMHg1OEVCLAotICAgIDB4NTk2MiwgMHg1QTExLCAweDVCRUIsIDB4NUJGQSwgMHg1QzA0LCAweDVERjMsIDB4NUUyQiwgMHg1Rjk5LAotICAgIDB4NjAxRCwgMHg2MzY4LCAweDY1OUMsIDB4NjVBRiwgMHg2N0Y2LCAweDY3RkIsIDB4NjhBRCwgMHg2QjdCLAotICAgIDB4NkM5OSwgMHg2Q0Q3LCAweDZFMjMsIDB4NzAwOSwgMHg3MzQ1LCAweDc4MDIsIDB4NzkzRSwgMHg3OTQwLAotICAgIDB4Nzk2MCwgMHg3OUMxLCAweDdCRTksIDB4N0QxNywgMHg3RDcyLCAweDgwODYsIDB4ODIwRCwgMHg4MzhFLAotICAgIDB4ODREMSwgMHg4NkM3LCAweDg4REYsIDB4OEE1MCwgMHg4QTVFLCAweDhCMUQsIDB4OENEQywgMHg4RDY2LAotICAgIDB4OEZBRCwgMHg5MEFBLCAweDk4RkMsIDB4OTlERiwgMHg5RTlELCAweDUyNEEsIDB4NjcxNCwgMHg1MDk4LAotICAgIDB4NTIyQSwgMHg1QzcxLCAweDY1NjMsIDB4NkM1NSwgMHg3M0NBLCAweDc1MjMsIDB4NzU5RCwgMHg3Qjk3LAotICAgIDB4ODQ5QywgMHg5MTc4LCAweDk3MzAsIDB4NEU3NywgMHg2NDkyLCAweDZCQkEsIDB4NzE1RSwgMHg4NUE5LAotICAgIDB4NEUwOSwgMHg2NzQ5LCAweDY4RUUsIDB4NkUxNywgMHg4MjlGLCAweDg1MTgsIDB4ODg2QiwgMHg2M0Y3LAotICAgIDB4NkY4MSwgMHg5MjEyLCAweDk4QUYsIDB4NEUwQSwgMHg1MEI3LCAweDUwQ0YsIDB4NTExRiwgMHg1NTQ2LAotICAgIDB4NTVBQSwgMHg1NjE3LCAweDVCNDAsIDB4NUMxOSwgMHg1Q0UwLCAweDVFMzgsIDB4NUU4QSwgMHg1RUEwLAotICAgIDB4NUVDMiwgMHg2MEYzLCAweDY4NTEsIDB4NkE2MSwgMHg2RTU4LCAweDcyM0QsIDB4NzI0MCwgMHg3MkMwLAotICAgIDB4NzZGOCwgMHg3OTY1LCAweDdCQjEsIDB4N0ZENCwgMHg4OEYzLCAweDg5RjQsIDB4OEE3MywgMHg4QzYxLAotICAgIDB4OENERSwgMHg5NzFDLCAweDU4NUUsIDB4NzRCRCwgMHg4Q0ZELCAweDU1QzcsIDB4N0E2MSwgMHg3RDIyLAotICAgIDB4ODI3MiwgMHg3MjcyLCAweDc1MUYsIDB4NzUyNSwgMHg3QjE5LCAweDU4ODUsIDB4NThGQiwgMHg1REJDLAotICAgIDB4NUU4RiwgMHg1RUI2LCAweDVGOTAsIDB4NjA1NSwgMHg2MjkyLCAweDYzN0YsIDB4NjU0RCwgMHg2NjkxLAotICAgIDB4NjZEOSwgMHg2NkY4LCAweDY4MTYsIDB4NjhGMiwgMHg3MjgwLCAweDc0NUUsIDB4N0I2RSwgMHg3RDZFLAotICAgIDB4N0RENiwgMHg3RjcyLCAweDgwRTUsIDB4ODIxMiwgMHg4NUFGLCAweDg5N0YsIDB4OEE5MywgMHg5MDFELAotICAgIDB4OTJFNCwgMHg5RUNELCAweDlGMjAsIDB4NTkxNSwgMHg1OTZELCAweDVFMkQsIDB4NjBEQywgMHg2NjE0LAotICAgIDB4NjY3MywgMHg2NzkwLCAweDZDNTAsIDB4NkRDNSwgMHg2RjVGLCAweDc3RjMsIDB4NzhBOSwgMHg4NEM2LAotICAgIDB4OTFDQiwgMHg5MzJCLCAweDRFRDksIDB4NTBDQSwgMHg1MTQ4LCAweDU1ODQsIDB4NUIwQiwgMHg1QkEzLAotICAgIDB4NjI0NywgMHg2NTdFLCAweDY1Q0IsIDB4NkUzMiwgMHg3MTdELCAweDc0MDEsIDB4NzQ0NCwgMHg3NDg3LAotICAgIDB4NzRCRiwgMHg3NjZDLCAweDc5QUEsIDB4N0REQSwgMHg3RTU1LCAweDdGQTgsIDB4ODE3QSwgMHg4MUIzLAotICAgIDB4ODIzOSwgMHg4NjFBLCAweDg3RUMsIDB4OEE3NSwgMHg4REUzLCAweDkwNzgsIDB4OTI5MSwgMHg5NDI1LAotICAgIDB4OTk0RCwgMHg5QkFFLCAweDUzNjgsIDB4NUM1MSwgMHg2OTU0LCAweDZDQzQsIDB4NkQyOSwgMHg2RTJCLAotICAgIDB4ODIwQywgMHg4NTlCLCAweDg5M0IsIDB4OEEyRCwgMHg4QUFBLCAweDk2RUEsIDB4OUY2NywgMHg1MjYxLAotICAgIDB4NjZCOSwgMHg2QkIyLCAweDdFOTYsIDB4ODdGRSwgMHg4RDBELCAweDk1ODMsIDB4OTY1RCwgMHg2NTFELAotICAgIDB4NkQ4OSwgMHg3MUVFLCAweDU3Q0UsIDB4NTlEMywgMHg1QkFDLCAweDYwMjcsIDB4NjBGQSwgMHg2MjEwLAotICAgIDB4NjYxRiwgMHg2NjVGLCAweDczMjksIDB4NzNGOSwgMHg3NkRCLCAweDc3MDEsIDB4N0I2QywgMHg4MDU2LAotICAgIDB4ODA3MiwgMHg4MTY1LCAweDhBQTAsIDB4OTE5MiwgMHg0RTE2LCAweDUyRTIsIDB4NkI3MiwgMHg2RDE3LAotICAgIDB4N0EwNSwgMHg3QjM5LCAweDdEMzAsIDB4OENCMCwgMHg1M0VDLCAweDU2MkYsIDB4NTg1MSwgMHg1QkI1LAotICAgIDB4NUMwRiwgMHg1QzExLCAweDVERTIsIDB4NjI0MCwgMHg2MzgzLCAweDY0MTQsIDB4NjYyRCwgMHg2OEIzLAotICAgIDB4NkNCQywgMHg2RDg4LCAweDZFQUYsIDB4NzAxRiwgMHg3MEE0LCAweDcxRDIsIDB4NzUyNiwgMHg3NThGLAotICAgIDB4NzU4RSwgMHg3NjE5LCAweDdCMTEsIDB4N0JFMCwgMHg3QzJCLCAweDdEMjAsIDB4N0QzOSwgMHg4NTJDLAotICAgIDB4ODU2RCwgMHg4NjA3LCAweDhBMzQsIDB4OTAwRCwgMHg5MDYxLCAweDkwQjUsIDB4OTJCNywgMHg5N0Y2LAotICAgIDB4OUEzNywgMHg0RkQ3LCAweDVDNkMsIDB4Njc1RiwgMHg2RDkxLCAweDdDOUYsIDB4N0U4QywgMHg4QjE2LAotICAgIDB4OEQxNiwgMHg5MDFGLCAweDVCNkIsIDB4NURGRCwgMHg2NDBELCAweDg0QzAsIDB4OTA1QywgMHg5OEUxLAotICAgIDB4NzM4NywgMHg1QjhCLCAweDYwOUEsIDB4Njc3RSwgMHg2RERFLCAweDhBMUYsIDB4OEFBNiwgMHg5MDAxLAotICAgIDB4OTgwQywgMHg1MjM3LCAweDcwNTEsIDB4Nzg4RSwgMHg5Mzk2LCAweDg4NzAsIDB4OTFENywgMHg0RkVFLAotICAgIDB4NTNENywgMHg1NUZELCAweDU2REEsIDB4NTc4MiwgMHg1OEZELCAweDVBQzIsIDB4NUI4OCwgMHg1Q0FCLAotICAgIDB4NUNDMCwgMHg1RTI1LCAweDYxMDEsIDB4NjIwRCwgMHg2MjRCLCAweDYzODgsIDB4NjQxQywgMHg2NTM2LAotICAgIDB4NjU3OCwgMHg2QTM5LCAweDZCOEEsIDB4NkMzNCwgMHg2RDE5LCAweDZGMzEsIDB4NzFFNywgMHg3MkU5LAotICAgIDB4NzM3OCwgMHg3NDA3LCAweDc0QjIsIDB4NzYyNiwgMHg3NzYxLCAweDc5QzAsIDB4N0E1NywgMHg3QUVBLAotICAgIDB4N0NCOSwgMHg3RDhGLCAweDdEQUMsIDB4N0U2MSwgMHg3RjlFLCAweDgxMjksIDB4ODMzMSwgMHg4NDkwLAotICAgIDB4ODREQSwgMHg4NUVBLCAweDg4OTYsIDB4OEFCMCwgMHg4QjkwLCAweDhGMzgsIDB4OTA0MiwgMHg5MDgzLAotICAgIDB4OTE2QywgMHg5Mjk2LCAweDkyQjksIDB4OTY4QiwgMHg5NkE3LCAweDk2QTgsIDB4OTZENiwgMHg5NzAwLAotICAgIDB4OTgwOCwgMHg5OTk2LCAweDlBRDMsIDB4OUIxQSwgMHg1M0Q0LCAweDU4N0UsIDB4NTkxOSwgMHg1QjcwLAotICAgIDB4NUJCRiwgMHg2REQxLCAweDZGNUEsIDB4NzE5RiwgMHg3NDIxLCAweDc0QjksIDB4ODA4NSwgMHg4M0ZELAotICAgIDB4NURFMSwgMHg1Rjg3LCAweDVGQUEsIDB4NjA0MiwgMHg2NUVDLCAweDY4MTIsIDB4Njk2RiwgMHg2QTUzLAotICAgIDB4NkI4OSwgMHg2RDM1LCAweDZERjMsIDB4NzNFMywgMHg3NkZFLCAweDc3QUMsIDB4N0I0RCwgMHg3RDE0LAotICAgIDB4ODEyMywgMHg4MjFDLCAweDgzNDAsIDB4ODRGNCwgMHg4NTYzLCAweDhBNjIsIDB4OEFDNCwgMHg5MTg3LAotICAgIDB4OTMxRSwgMHg5ODA2LCAweDk5QjQsIDB4NjIwQywgMHg4ODUzLCAweDhGRjAsIDB4OTI2NSwgMHg1RDA3LAotICAgIDB4NUQyNywgMHg1RDY5LCAweDc0NUYsIDB4ODE5RCwgMHg4NzY4LCAweDZGRDUsIDB4NjJGRSwgMHg3RkQyLAotICAgIDB4ODkzNiwgMHg4OTcyLCAweDRFMUUsIDB4NEU1OCwgMHg1MEU3LCAweDUyREQsIDB4NTM0NywgMHg2MjdGLAotICAgIDB4NjYwNywgMHg3RTY5LCAweDg4MDUsIDB4OTY1RSwgMHg0RjhELCAweDUzMTksIDB4NTYzNiwgMHg1OUNCLAotICAgIDB4NUFBNCwgMHg1QzM4LCAweDVDNEUsIDB4NUM0RCwgMHg1RTAyLCAweDVGMTEsIDB4NjA0MywgMHg2NUJELAotICAgIDB4NjYyRiwgMHg2NjQyLCAweDY3QkUsIDB4NjdGNCwgMHg3MzFDLCAweDc3RTIsIDB4NzkzQSwgMHg3RkM1LAotICAgIDB4ODQ5NCwgMHg4NENELCAweDg5OTYsIDB4OEE2NiwgMHg4QTY5LCAweDhBRTEsIDB4OEM1NSwgMHg4QzdBLAotICAgIDB4NTdGNCwgMHg1QkQ0LCAweDVGMEYsIDB4NjA2RiwgMHg2MkVELCAweDY5MEQsIDB4NkI5NiwgMHg2RTVDLAotICAgIDB4NzE4NCwgMHg3QkQyLCAweDg3NTUsIDB4OEI1OCwgMHg4RUZFLCAweDk4REYsIDB4OThGRSwgMHg0RjM4LAotICAgIDB4NEY4MSwgMHg0RkUxLCAweDU0N0IsIDB4NUEyMCwgMHg1QkI4LCAweDYxM0MsIDB4NjVCMCwgMHg2NjY4LAotICAgIDB4NzFGQywgMHg3NTMzLCAweDc5NUUsIDB4N0QzMywgMHg4MTRFLCAweDgxRTMsIDB4ODM5OCwgMHg4NUFBLAotICAgIDB4ODVDRSwgMHg4NzAzLCAweDhBMEEsIDB4OEVBQiwgMHg4RjlCLCAweDhGQzUsIDB4NTkzMSwgMHg1QkE0LAotICAgIDB4NUJFNiwgMHg2MDg5LCAweDVCRTksIDB4NUMwQiwgMHg1RkMzLCAweDZDODEsIDB4NkRGMSwgMHg3MDBCLAotICAgIDB4NzUxQSwgMHg4MkFGLCAweDhBRjYsIDB4NEVDMCwgMHg1MzQxLCAweDk2RDksIDB4NkMwRiwgMHg0RTlFLAotICAgIDB4NEZDNCwgMHg1MTUyLCAweDU1NUUsIDB4NUEyNSwgMHg1Q0U4LCAweDYyMTEsIDB4NzI1OSwgMHg4MkJELAotICAgIDB4ODNBQSwgMHg4NkZFLCAweDg4NTksIDB4OEExRCwgMHg5NjNGLCAweDk2QzUsIDB4OTkxMywgMHg5RDA5LAotICAgIDB4OUQ1RCwgMHg1ODBBLCAweDVDQjMsIDB4NURCRCwgMHg1RTQ0LCAweDYwRTEsIDB4NjExNSwgMHg2M0UxLAotICAgIDB4NkEwMiwgMHg2RTI1LCAweDkxMDIsIDB4OTM1NCwgMHg5ODRFLCAweDlDMTAsIDB4OUY3NywgMHg1Qjg5LAotICAgIDB4NUNCOCwgMHg2MzA5LCAweDY2NEYsIDB4Njg0OCwgMHg3NzNDLCAweDk2QzEsIDB4OTc4RCwgMHg5ODU0LAotICAgIDB4OUI5RiwgMHg2NUExLCAweDhCMDEsIDB4OEVDQiwgMHg5NUJDLCAweDU1MzUsIDB4NUNBOSwgMHg1REQ2LAotICAgIDB4NUVCNSwgMHg2Njk3LCAweDc2NEMsIDB4ODNGNCwgMHg5NUM3LCAweDU4RDMsIDB4NjJCQywgMHg3MkNFLAotICAgIDB4OUQyOCwgMHg0RUYwLCAweDU5MkUsIDB4NjAwRiwgMHg2NjNCLCAweDZCODMsIDB4NzlFNywgMHg5RDI2LAotICAgIDB4NTM5MywgMHg1NEMwLCAweDU3QzMsIDB4NUQxNiwgMHg2MTFCLCAweDY2RDYsIDB4NkRBRiwgMHg3ODhELAotICAgIDB4ODI3RSwgMHg5Njk4LCAweDk3NDQsIDB4NTM4NCwgMHg2MjdDLCAweDYzOTYsIDB4NkRCMiwgMHg3RTBBLAotICAgIDB4ODE0QiwgMHg5ODRELCAweDZBRkIsIDB4N0Y0QywgMHg5REFGLCAweDlFMUEsIDB4NEU1RiwgMHg1MDNCLAotICAgIDB4NTFCNiwgMHg1OTFDLCAweDYwRjksIDB4NjNGNiwgMHg2OTMwLCAweDcyM0EsIDB4ODAzNiwgMHg5MUNFLAotICAgIDB4NUYzMSwgMHg3RDA0LCAweDgyRTUsIDB4ODQ2RiwgMHg4NEJCLCAweDg1RTUsIDB4OEU4RCwgMHg0RjZGLAotICAgIDB4NThFNCwgMHg1QjQzLCAweDYwNTksIDB4NjNEQSwgMHg2NTE4LCAweDY1NkQsIDB4NjY5OCwgMHg2OTRBLAotICAgIDB4NkEyMywgMHg2RDBCLCAweDcwMDEsIDB4NzE2QywgMHg3NUQyLCAweDc2MEQsIDB4NzlCMywgMHg3QTcwLAotICAgIDB4N0Y4QSwgMHg4OTQ0LCAweDhCOTMsIDB4OTFDMCwgMHg5NjdELCAweDk5MEEsIDB4NTcwNCwgMHg1RkExLAotICAgIDB4NjVCQywgMHg2RjAxLCAweDc2MDAsIDB4NzlBNiwgMHg4QTlFLCAweDk5QUQsIDB4OUI1QSwgMHg5RjZDLAotICAgIDB4NTEwNCwgMHg2MUI2LCAweDYyOTEsIDB4NkE4RCwgMHg4MUM2LCAweDUwNDMsIDB4NTgzMCwgMHg1RjY2LAotICAgIDB4NzEwOSwgMHg4QTAwLCAweDhBRkEsIDB4NUI3QywgMHg4NjE2LCAweDRGRkEsIDB4NTEzQywgMHg1NkI0LAotICAgIDB4NTk0NCwgMHg2M0E5LCAweDZERjksIDB4NURBQSwgMHg2OTZELCAweDUxODYsIDB4NEU4OCwgMHg0RjU5LAotICAgIDB4NTk4MiwgMHg2QjVGLCAweDZDNUQsIDB4NzRCNSwgMHg3OTE2LCAweDgyMDcsIDB4ODI0NSwgMHg4MzM5LAotICAgIDB4OEYzRiwgMHg4RjVELCAweDk5MTgsIDB4NEVBNiwgMHg1N0RGLCAweDVGNzksIDB4NjYxMywgMHg3NUFCLAotICAgIDB4N0U3OSwgMHg4QjZGLCAweDkwMDYsIDB4OUE1QiwgMHg1NkE1LCAweDU4MjcsIDB4NTlGOCwgMHg1QTFGLAotICAgIDB4NUJCNCwgMHg1RUY2LCAweDYzNTAsIDB4NjMzQiwgMHg2OTNELCAweDZDODcsIDB4NkNCRiwgMHg2RDhFLAotICAgIDB4NkQ5MywgMHg2REY1LCAweDZGMTQsIDB4NzBERiwgMHg3MTM2LCAweDcxNTksIDB4NzFDMywgMHg3MUQ1LAotICAgIDB4Nzg0RiwgMHg3ODZGLCAweDdCNzUsIDB4N0RFMywgMHg3RTJGLCAweDg4NEQsIDB4OEVERiwgMHg5MjVCLAotICAgIDB4OUNGNiwgMHg2MDg1LCAweDZEODUsIDB4NzFCMSwgMHg5NUIxLCAweDUzQUQsIDB4NjdEMywgMHg3MDhFLAotICAgIDB4NzEzMCwgMHg3NDMwLCAweDgyNzYsIDB4ODJEMiwgMHg5NUJCLCAweDlBRTUsIDB4OUU3RCwgMHg2NkM0LAotICAgIDB4NzFDMSwgMHg4NDQ5LCAweDU4NEIsIDB4NURCOCwgMHg1RjcxLCAweDY2MjAsIDB4NjY4RSwgMHg2OTc5LAotICAgIDB4NjlBRSwgMHg2QzM4LCAweDZDRjMsIDB4NkUzNiwgMHg2RjQxLCAweDZGREEsIDB4NzAxQiwgMHg3MDJGLAotICAgIDB4NzE1MCwgMHg3MURGLCAweDczNzAsIDB4NzQ1QiwgMHg3NEQ0LCAweDc2QzgsIDB4N0E0RSwgMHg3RTkzLAotICAgIDB4ODJGMSwgMHg4QTYwLCAweDhGQ0UsIDB4OTM0OCwgMHg5NzE5LCAweDRFNDIsIDB4NTAyQSwgMHg1MjA4LAotICAgIDB4NTNFMSwgMHg2NkYzLCAweDZDNkQsIDB4NkZDQSwgMHg3MzBBLCAweDc3N0YsIDB4N0E2MiwgMHg4MkFFLAotICAgIDB4ODVERCwgMHg4NjAyLCAweDg4RDQsIDB4OEE2MywgMHg4QjdELCAweDhDNkIsIDB4OTJCMywgMHg5NzEzLAotICAgIDB4OTgxMCwgMHg0RTk0LCAweDRGMEQsIDB4NEZDOSwgMHg1MEIyLCAweDUzNDgsIDB4NTQzRSwgMHg1NDMzLAotICAgIDB4NTVEQSwgMHg1ODYyLCAweDU4QkEsIDB4NTk2NywgMHg1QTFCLCAweDVCRTQsIDB4NjA5RiwgMHg2MUNBLAotICAgIDB4NjU1NiwgMHg2NUZGLCAweDY2NjQsIDB4NjhBNywgMHg2QzVBLCAweDZGQjMsIDB4NzBDRiwgMHg3MUFDLAotICAgIDB4NzM1MiwgMHg3QjdELCAweDg3MDgsIDB4OEFBNCwgMHg5QzMyLCAweDlGMDcsIDB4NUM0QiwgMHg2QzgzLAotICAgIDB4NzM0NCwgMHg3Mzg5LCAweDkyM0EsIDB4NkVBQiwgMHg3NDY1LCAweDc2MUYsIDB4N0E2OSwgMHg3RTE1LAotICAgIDB4ODYwQSwgMHg1MTQwLCAweDU4QzUsIDB4NjRDMSwgMHg3NEVFLCAweDc1MTUsIDB4NzY3MCwgMHg3RkMxLAotICAgIDB4OTA5NSwgMHg5NkNELCAweDk5NTQsIDB4NkUyNiwgMHg3NEU2LCAweDdBQTksIDB4N0FBQSwgMHg4MUU1LAotICAgIDB4ODZEOSwgMHg4Nzc4LCAweDhBMUIsIDB4NUE0OSwgMHg1QjhDLCAweDVCOUIsIDB4NjhBMSwgMHg2OTAwLAotICAgIDB4NkQ2MywgMHg3M0E5LCAweDc0MTMsIDB4NzQyQywgMHg3ODk3LCAweDdERTksIDB4N0ZFQiwgMHg4MTE4LAotICAgIDB4ODE1NSwgMHg4MzlFLCAweDhDNEMsIDB4OTYyRSwgMHg5ODExLCAweDY2RjAsIDB4NUY4MCwgMHg2NUZBLAotICAgIDB4Njc4OSwgMHg2QzZBLCAweDczOEIsIDB4NTAyRCwgMHg1QTAzLCAweDZCNkEsIDB4NzdFRSwgMHg1OTE2LAotICAgIDB4NUQ2QywgMHg1RENELCAweDczMjUsIDB4NzU0RiwgMHg1MEU1LCAweDUxRjksIDB4NTgyRiwgMHg1OTJELAotICAgIDB4NTk5NiwgMHg1OURBLCAweDVCRTUsIDB4NURBMiwgMHg2MkQ3LCAweDY0MTYsIDB4NjQ5MywgMHg2NEZFLAotICAgIDB4NjZEQywgMHg2QTQ4LCAweDcxRkYsIDB4NzQ2NCwgMHg3QTg4LCAweDdBQUYsIDB4N0U0NywgMHg3RTVFLAotICAgIDB4ODAwMCwgMHg4MTcwLCAweDg3RUYsIDB4ODk4MSwgMHg4QjIwLCAweDkwNTksIDB4OTA4MCwgMHg5OTUyLAotICAgIDB4NjE3RSwgMHg2QjMyLCAweDZENzQsIDB4N0UxRiwgMHg4OTI1LCAweDhGQjEsIDB4NEZEMSwgMHg1MEFELAotICAgIDB4NTE5NywgMHg1MkM3LCAweDU3QzcsIDB4NTg4OSwgMHg1QkI5LCAweDVFQjgsIDB4NjE0MiwgMHg2OTk1LAotICAgIDB4NkQ4QywgMHg2RTY3LCAweDZFQjYsIDB4NzE5NCwgMHg3NDYyLCAweDc1MjgsIDB4NzUyQywgMHg4MDczLAotICAgIDB4ODMzOCwgMHg4NEM5LCAweDhFMEEsIDB4OTM5NCwgMHg5M0RFLCAweDRFOEUsIDB4NEY1MSwgMHg1MDc2LAotICAgIDB4NTEyQSwgMHg1M0M4LCAweDUzQ0IsIDB4NTNGMywgMHg1Qjg3LCAweDVCRDMsIDB4NUMyNCwgMHg2MTFBLAotICAgIDB4NjE4MiwgMHg2NUY0LCAweDcyNUIsIDB4NzM5NywgMHg3NDQwLCAweDc2QzIsIDB4Nzk1MCwgMHg3OTkxLAotICAgIDB4NzlCOSwgMHg3RDA2LCAweDdGQkQsIDB4ODI4QiwgMHg4NUQ1LCAweDg2NUUsIDB4OEZDMiwgMHg5MDQ3LAotICAgIDB4OTBGNSwgMHg5MUVBLCAweDk2ODUsIDB4OTZFOCwgMHg5NkU5LCAweDUyRDYsIDB4NUY2NywgMHg2NUVELAotICAgIDB4NjYzMSwgMHg2ODJGLCAweDcxNUMsIDB4N0EzNiwgMHg5MEMxLCAweDk4MEEsIDB4NEU5MSwgMHg2QTUyLAotICAgIDB4NkI5RSwgMHg2RjkwLCAweDcxODksIDB4ODAxOCwgMHg4MkI4LCAweDg1NTMsIDB4OTA0QiwgMHg5Njk1LAotICAgIDB4OTZGMiwgMHg5N0ZCLCAweDg1MUEsIDB4OUIzMSwgMHg0RTkwLCAweDcxOEEsIDB4OTZDNCwgMHg1MTQzLAotICAgIDB4NTM5RiwgMHg1NEUxLCAweDU3MTMsIDB4NTcxMiwgMHg1N0EzLCAweDVBOUIsIDB4NUFDNCwgMHg1QkMzLAotICAgIDB4NjAyOCwgMHg2MTNGLCAweDYzRjQsIDB4NkM4NSwgMHg2RDM5LCAweDZFNzIsIDB4NkU5MCwgMHg3MjMwLAotICAgIDB4NzMzRiwgMHg3NDU3LCAweDgyRDEsIDB4ODg4MSwgMHg4RjQ1LCAweDkwNjAsIDB4OTY2MiwgMHg5ODU4LAotICAgIDB4OUQxQiwgMHg2NzA4LCAweDhEOEEsIDB4OTI1RSwgMHg0RjRELCAweDUwNDksIDB4NTBERSwgMHg1MzcxLAotICAgIDB4NTcwRCwgMHg1OUQ0LCAweDVBMDEsIDB4NUMwOSwgMHg2MTcwLCAweDY2OTAsIDB4NkUyRCwgMHg3MjMyLAotICAgIDB4NzQ0QiwgMHg3REVGLCAweDgwQzMsIDB4ODQwRSwgMHg4NDY2LCAweDg1M0YsIDB4ODc1RiwgMHg4ODVCLAotICAgIDB4ODkxOCwgMHg4QjAyLCAweDkwNTUsIDB4OTdDQiwgMHg5QjRGLCAweDRFNzMsIDB4NEY5MSwgMHg1MTEyLAotICAgIDB4NTE2QSwgMHg1NTJGLCAweDU1QTksIDB4NUI3QSwgMHg1QkE1LCAweDVFN0MsIDB4NUU3RCwgMHg1RUJFLAotICAgIDB4NjBBMCwgMHg2MERGLCAweDYxMDgsIDB4NjEwOSwgMHg2M0M0LCAweDY1MzgsIDB4NjcwOSwgMHg2N0Q0LAotICAgIDB4NjdEQSwgMHg2OTYxLCAweDY5NjIsIDB4NkNCOSwgMHg2RDI3LCAweDZFMzgsIDB4NkZFMSwgMHg3MzM2LAotICAgIDB4NzMzNywgMHg3NDVDLCAweDc1MzEsIDB4NzY1MiwgMHg3REFELCAweDgxRkUsIDB4ODQzOCwgMHg4OEQ1LAotICAgIDB4OEE5OCwgMHg4QURCLCAweDhBRUQsIDB4OEUzMCwgMHg4RTQyLCAweDkwNEEsIDB4OTAzRSwgMHg5MDdBLAotICAgIDB4OTE0OSwgMHg5MUM5LCAweDkzNkUsIDB4NTgwOSwgMHg2QkQzLCAweDgwODksIDB4ODBCMiwgMHg1MTQxLAotICAgIDB4NTk2QiwgMHg1QzM5LCAweDZGNjQsIDB4NzNBNywgMHg4MEU0LCAweDhEMDcsIDB4OTIxNywgMHg5NThGLAotICAgIDB4ODA3RiwgMHg2MjBFLCAweDcwMUMsIDB4N0Q2OCwgMHg4NzhELCAweDU3QTAsIDB4NjA2OSwgMHg2MTQ3LAotICAgIDB4NkJCNywgMHg4QUJFLCAweDkyODAsIDB4OTZCMSwgMHg0RTU5LCAweDU0MUYsIDB4NkRFQiwgMHg4NTJELAotICAgIDB4OTY3MCwgMHg5N0YzLCAweDk4RUUsIDB4NjNENiwgMHg2Q0UzLCAweDkwOTEsIDB4NTFERCwgMHg2MUM5LAotICAgIDB4ODFCQSwgMHg5REY5LCAweDRGOUQsIDB4NTAxQSwgMHg1MTAwLCAweDVCOUMsIDB4NjEwRiwgMHg2MUZGLAotICAgIDB4NjRFQywgMHg2OTA1LCAweDZCQzUsIDB4NzU5MSwgMHg3N0UzLCAweDdGQTksIDB4ODI2NCwgMHg4NThGLAotICAgIDB4ODdGQiwgMHg4ODYzLCAweDhBQkMsIDB4OEI3MCwgMHg5MUFCLCAweDRFOEMsIDB4NEVFNSwgMHg0RjBBLAotICAgIDB4NTkzNywgMHg1OUU4LCAweDVERjIsIDB4NUYxQiwgMHg1RjVCLCAweDYwMjEsIDB4NzIzRSwgMHg3M0U1LAotICAgIDB4NzU3MCwgMHg3NUNELCAweDc5RkIsIDB4ODAwQywgMHg4MDMzLCAweDgwODQsIDB4ODJFMSwgMHg4MzUxLAotICAgIDB4OENCRCwgMHg4Q0IzLCAweDkwODcsIDB4OThGNCwgMHg5OTBDLCAweDcwMzcsIDB4NzZDQSwgMHg3RkNBLAotICAgIDB4N0ZDQywgMHg3RkZDLCAweDhCMUEsIDB4NEVCQSwgMHg0RUMxLCAweDUyMDMsIDB4NTM3MCwgMHg1NEJELAotICAgIDB4NTZFMCwgMHg1OUZCLCAweDVCQzUsIDB4NUYxNSwgMHg1RkNELCAweDZFNkUsIDB4N0Q2QSwgMHg4MzM1LAotICAgIDB4ODY5MywgMHg4QThELCAweDk3NkQsIDB4OTc3NywgMHg0RTAwLCAweDRGNUEsIDB4NEY3RSwgMHg1OEY5LAotICAgIDB4NjVFNSwgMHg2RUEyLCAweDkwMzgsIDB4OTNCMCwgMHg5OUI5LCAweDRFRkIsIDB4NThFQywgMHg1OThBLAotICAgIDB4NTlEOSwgMHg2MDQxLCAweDdBMTQsIDB4ODM0RiwgMHg4Q0MzLCAweDUxNjUsIDB4NTM0NCwgMHg0RUNELAotICAgIDB4NTI2OSwgMHg1QjU1LCAweDgyQkYsIDB4NEVENCwgMHg1MjNBLCAweDU0QTgsIDB4NTlDOSwgMHg1OUZGLAotICAgIDB4NUI1MCwgMHg1QjU3LCAweDVCNUMsIDB4NjA2MywgMHg2MTQ4LCAweDZFQ0IsIDB4NzA5OSwgMHg3MTZFLAotICAgIDB4NzM4NiwgMHg3NEY3LCAweDc1QjUsIDB4NzhDMSwgMHg3RDJCLCAweDgwMDUsIDB4ODFFQSwgMHg4MzI4LAotICAgIDB4ODUxNywgMHg4NUM5LCAweDhBRUUsIDB4OENDNywgMHg5NkNDLCAweDRGNUMsIDB4NTJGQSwgMHg1NkJDLAotICAgIDB4NjVBQiwgMHg2NjI4LCAweDcwN0MsIDB4NzBCOCwgMHg3MjM1LCAweDdEQkQsIDB4ODI4RCwgMHg5MTRDLAotICAgIDB4OTZDMCwgMHg5RDcyLCAweDVCNzEsIDB4NjhFNywgMHg2Qjk4LCAweDZGN0EsIDB4NzZERSwgMHg1QzkxLAotICAgIDB4NjZBQiwgMHg2RjVCLCAweDdCQjQsIDB4N0MyQSwgMHg4ODM2LCAweDk2REMsIDB4NEUwOCwgMHg0RUQ3LAotICAgIDB4NTMyMCwgMHg1ODM0LCAweDU4QkIsIDB4NThFRiwgMHg1OTZDLCAweDVDMDcsIDB4NUUzMywgMHg1RTg0LAotICAgIDB4NUYzNSwgMHg2MzhDLCAweDY2QjIsIDB4Njc1NiwgMHg2QTFGLCAweDZBQTMsIDB4NkIwQywgMHg2RjNGLAotICAgIDB4NzI0NiwgMHg3MzUwLCAweDc0OEIsIDB4N0FFMCwgMHg3Q0E3LCAweDgxNzgsIDB4ODFERiwgMHg4MUU3LAotICAgIDB4ODM4QSwgMHg4NDZDLCAweDg1MjMsIDB4ODU5NCwgMHg4NUNGLCAweDg4REQsIDB4OEQxMywgMHg5MUFDLAotICAgIDB4OTU3NywgMHg5NjlDLCAweDUxOEQsIDB4NTRDOSwgMHg1NzI4LCAweDVCQjAsIDB4NjI0RCwgMHg2NzUwLAotICAgIDB4NjgzRCwgMHg2ODkzLCAweDZFM0QsIDB4NkVEMywgMHg3MDdELCAweDdFMjEsIDB4ODhDMSwgMHg4Q0ExLAotICAgIDB4OEYwOSwgMHg5RjRCLCAweDlGNEUsIDB4NzIyRCwgMHg3QjhGLCAweDhBQ0QsIDB4OTMxQSwgMHg0RjQ3LAotICAgIDB4NEY0RSwgMHg1MTMyLCAweDU0ODAsIDB4NTlEMCwgMHg1RTk1LCAweDYyQjUsIDB4Njc3NSwgMHg2OTZFLAotICAgIDB4NkExNywgMHg2Q0FFLCAweDZFMUEsIDB4NzJEOSwgMHg3MzJBLCAweDc1QkQsIDB4N0JCOCwgMHg3RDM1LAotICAgIDB4ODJFNywgMHg4M0Y5LCAweDg0NTcsIDB4ODVGNywgMHg4QTVCLCAweDhDQUYsIDB4OEU4NywgMHg5MDE5LAotICAgIDB4OTBCOCwgMHg5NkNFLCAweDlGNUYsIDB4NTJFMywgMHg1NDBBLCAweDVBRTEsIDB4NUJDMiwgMHg2NDU4LAotICAgIDB4NjU3NSwgMHg2RUY0LCAweDcyQzQsIDB4NzY4NCwgMHg3QTRELCAweDdCMUIsIDB4N0M0RCwgMHg3RTNFLAotICAgIDB4N0ZERiwgMHg4MzdCLCAweDhCMkIsIDB4OENDQSwgMHg4RDY0LCAweDhERTEsIDB4OEU1RiwgMHg4RkVBLAotICAgIDB4OEZGOSwgMHg5MDY5LCAweDkzRDEsIDB4NEY0MywgMHg0RjdBLCAweDUwQjMsIDB4NTE2OCwgMHg1MTc4LAotICAgIDB4NTI0RCwgMHg1MjZBLCAweDU4NjEsIDB4NTg3QywgMHg1OTYwLCAweDVDMDgsIDB4NUM1NSwgMHg1RURCLAotICAgIDB4NjA5QiwgMHg2MjMwLCAweDY4MTMsIDB4NkJCRiwgMHg2QzA4LCAweDZGQjEsIDB4NzE0RSwgMHg3NDIwLAotICAgIDB4NzUzMCwgMHg3NTM4LCAweDc1NTEsIDB4NzY3MiwgMHg3QjRDLCAweDdCOEIsIDB4N0JBRCwgMHg3QkM2LAotICAgIDB4N0U4RiwgMHg4QTZFLCAweDhGM0UsIDB4OEY0OSwgMHg5MjNGLCAweDkyOTMsIDB4OTMyMiwgMHg5NDJCLAotICAgIDB4OTZGQiwgMHg5ODVBLCAweDk4NkIsIDB4OTkxRSwgMHg1MjA3LCAweDYyMkEsIDB4NjI5OCwgMHg2RDU5LAotICAgIDB4NzY2NCwgMHg3QUNBLCAweDdCQzAsIDB4N0Q3NiwgMHg1MzYwLCAweDVDQkUsIDB4NUU5NywgMHg2RjM4LAotICAgIDB4NzBCOSwgMHg3Qzk4LCAweDk3MTEsIDB4OUI4RSwgMHg5RURFLCAweDYzQTUsIDB4NjQ3QSwgMHg4Nzc2LAotICAgIDB4NEUwMSwgMHg0RTk1LCAweDRFQUQsIDB4NTA1QywgMHg1MDc1LCAweDU0NDgsIDB4NTlDMywgMHg1QjlBLAotICAgIDB4NUU0MCwgMHg1RUFELCAweDVFRjcsIDB4NUY4MSwgMHg2MEM1LCAweDYzM0EsIDB4NjUzRiwgMHg2NTc0LAotICAgIDB4NjVDQywgMHg2Njc2LCAweDY2NzgsIDB4NjdGRSwgMHg2OTY4LCAweDZBODksIDB4NkI2MywgMHg2QzQwLAotICAgIDB4NkRDMCwgMHg2REU4LCAweDZFMUYsIDB4NkU1RSwgMHg3MDFFLCAweDcwQTEsIDB4NzM4RSwgMHg3M0ZELAotICAgIDB4NzUzQSwgMHg3NzVCLCAweDc4ODcsIDB4Nzk4RSwgMHg3QTBCLCAweDdBN0QsIDB4N0NCRSwgMHg3RDhFLAotICAgIDB4ODI0NywgMHg4QTAyLCAweDhBRUEsIDB4OEM5RSwgMHg5MTJELCAweDkxNEEsIDB4OTFEOCwgMHg5MjY2LAotICAgIDB4OTJDQywgMHg5MzIwLCAweDk3MDYsIDB4OTc1NiwgMHg5NzVDLCAweDk4MDIsIDB4OUYwRSwgMHg1MjM2LAotICAgIDB4NTI5MSwgMHg1NTdDLCAweDU4MjQsIDB4NUUxRCwgMHg1RjFGLCAweDYwOEMsIDB4NjNEMCwgMHg2OEFGLAotICAgIDB4NkZERiwgMHg3OTZELCAweDdCMkMsIDB4ODFDRCwgMHg4NUJBLCAweDg4RkQsIDB4OEFGOCwgMHg4RTQ0LAotICAgIDB4OTE4RCwgMHg5NjY0LCAweDk2OUIsIDB4OTczRCwgMHg5ODRDLCAweDlGNEEsIDB4NEZDRSwgMHg1MTQ2LAotICAgIDB4NTFDQiwgMHg1MkE5LCAweDU2MzIsIDB4NUYxNCwgMHg1RjZCLCAweDYzQUEsIDB4NjRDRCwgMHg2NUU5LAotICAgIDB4NjY0MSwgMHg2NkZBLCAweDY2RjksIDB4NjcxRCwgMHg2ODlELCAweDY4RDcsIDB4NjlGRCwgMHg2RjE1LAotICAgIDB4NkY2RSwgMHg3MTY3LCAweDcxRTUsIDB4NzIyQSwgMHg3NEFBLCAweDc3M0EsIDB4Nzk1NiwgMHg3OTVBLAotICAgIDB4NzlERiwgMHg3QTIwLCAweDdBOTUsIDB4N0M5NywgMHg3Q0RGLCAweDdENDQsIDB4N0U3MCwgMHg4MDg3LAotICAgIDB4ODVGQiwgMHg4NkE0LCAweDhBNTQsIDB4OEFCRiwgMHg4RDk5LCAweDhFODEsIDB4OTAyMCwgMHg5MDZELAotICAgIDB4OTFFMywgMHg5NjNCLCAweDk2RDUsIDB4OUNFNSwgMHg2NUNGLCAweDdDMDcsIDB4OERCMywgMHg5M0MzLAotICAgIDB4NUI1OCwgMHg1QzBBLCAweDUzNTIsIDB4NjJEOSwgMHg3MzFELCAweDUwMjcsIDB4NUI5NywgMHg1RjlFLAotICAgIDB4NjBCMCwgMHg2MTZCLCAweDY4RDUsIDB4NkREOSwgMHg3NDJFLCAweDdBMkUsIDB4N0Q0MiwgMHg3RDlDLAotICAgIDB4N0UzMSwgMHg4MTZCLCAweDhFMkEsIDB4OEUzNSwgMHg5MzdFLCAweDk0MTgsIDB4NEY1MCwgMHg1NzUwLAotICAgIDB4NURFNiwgMHg1RUE3LCAweDYzMkIsIDB4N0Y2QSwgMHg0RTNCLCAweDRGNEYsIDB4NEY4RiwgMHg1MDVBLAotICAgIDB4NTlERCwgMHg4MEM0LCAweDU0NkEsIDB4NTQ2OCwgMHg1NUZFLCAweDU5NEYsIDB4NUI5OSwgMHg1RERFLAotICAgIDB4NUVEQSwgMHg2NjVELCAweDY3MzEsIDB4NjdGMSwgMHg2ODJBLCAweDZDRTgsIDB4NkQzMiwgMHg2RTRBLAotICAgIDB4NkY4RCwgMHg3MEI3LCAweDczRTAsIDB4NzU4NywgMHg3QzRDLCAweDdEMDIsIDB4N0QyQywgMHg3REEyLAotICAgIDB4ODIxRiwgMHg4NkRCLCAweDhBM0IsIDB4OEE4NSwgMHg4RDcwLCAweDhFOEEsIDB4OEYzMywgMHg5MDMxLAotICAgIDB4OTE0RSwgMHg5MTUyLCAweDk0NDQsIDB4OTlEMCwgMHg3QUY5LCAweDdDQTUsIDB4NEZDQSwgMHg1MTAxLAotICAgIDB4NTFDNiwgMHg1N0M4LCAweDVCRUYsIDB4NUNGQiwgMHg2NjU5LCAweDZBM0QsIDB4NkQ1QSwgMHg2RTk2LAotICAgIDB4NkZFQywgMHg3MTBDLCAweDc1NkYsIDB4N0FFMywgMHg4ODIyLCAweDkwMjEsIDB4OTA3NSwgMHg5NkNCLAotICAgIDB4OTlGRiwgMHg4MzAxLCAweDRFMkQsIDB4NEVGMiwgMHg4ODQ2LCAweDkxQ0QsIDB4NTM3RCwgMHg2QURCLAotICAgIDB4Njk2QiwgMHg2QzQxLCAweDg0N0EsIDB4NTg5RSwgMHg2MThFLCAweDY2RkUsIDB4NjJFRiwgMHg3MERELAotICAgIDB4NzUxMSwgMHg3NUM3LCAweDdFNTIsIDB4ODRCOCwgMHg4QjQ5LCAweDhEMDgsIDB4NEU0QiwgMHg1M0VBLAotICAgIDB4NTRBQiwgMHg1NzMwLCAweDU3NDAsIDB4NUZENywgMHg2MzAxLCAweDYzMDcsIDB4NjQ2RiwgMHg2NTJGLAotICAgIDB4NjVFOCwgMHg2NjdBLCAweDY3OUQsIDB4NjdCMywgMHg2QjYyLCAweDZDNjAsIDB4NkM5QSwgMHg2RjJDLAotICAgIDB4NzdFNSwgMHg3ODI1LCAweDc5NDksIDB4Nzk1NywgMHg3RDE5LCAweDgwQTIsIDB4ODEwMiwgMHg4MUYzLAotICAgIDB4ODI5RCwgMHg4MkI3LCAweDg3MTgsIDB4OEE4QywgMHg4RDA0LCAweDhEQkUsIDB4OTA3MiwgMHg3NkY0LAotICAgIDB4N0ExOSwgMHg3QTM3LCAweDdFNTQsIDB4ODA3NywgMHg1NTA3LCAweDU1RDQsIDB4NTg3NSwgMHg2MzJGLAotICAgIDB4NjQyMiwgMHg2NjQ5LCAweDY2NEIsIDB4Njg2RCwgMHg2OTlCLCAweDZCODQsIDB4NkQyNSwgMHg2RUIxLAotICAgIDB4NzNDRCwgMHg3NDY4LCAweDc0QTEsIDB4NzU1QiwgMHg3NUI5LCAweDc2RTEsIDB4NzcxRSwgMHg3NzhCLAotICAgIDB4NzlFNiwgMHg3RTA5LCAweDdFMUQsIDB4ODFGQiwgMHg4NTJGLCAweDg4OTcsIDB4OEEzQSwgMHg4Q0QxLAotICAgIDB4OEVFQiwgMHg4RkIwLCAweDkwMzIsIDB4OTNBRCwgMHg5NjYzLCAweDk2NzMsIDB4OTcwNywgMHg0Rjg0LAotICAgIDB4NTNGMSwgMHg1OUVBLCAweDVBQzksIDB4NUUxOSwgMHg2ODRFLCAweDc0QzYsIDB4NzVCRSwgMHg3OUU5LAotICAgIDB4N0E5MiwgMHg4MUEzLCAweDg2RUQsIDB4OENFQSwgMHg4RENDLCAweDhGRUQsIDB4NjU5RiwgMHg2NzE1LAotICAgIDB4NTdGNywgMHg2RjU3LCAweDdEREQsIDB4OEYyRiwgMHg5M0Y2LCAweDk2QzYsIDB4NUZCNSwgMHg2MUYyLAotICAgIDB4NkY4NCwgMHg0RTE0LCAweDRGOTgsIDB4NTAxRiwgMHg1M0M5LCAweDU1REYsIDB4NUQ2RiwgMHg1REVFLAotICAgIDB4NkIyMSwgMHg2QjY0LCAweDc4Q0IsIDB4N0I5QSwgMHg4RTQ5LCAweDhFQ0EsIDB4OTA2RSwgMHg2MzQ5LAotICAgIDB4NjQzRSwgMHg3NzQwLCAweDdBODQsIDB4OTMyRiwgMHg5NDdGLCAweDlGNkEsIDB4NjRCMCwgMHg2RkFGLAotICAgIDB4NzFFNiwgMHg3NEE4LCAweDc0REEsIDB4N0FDNCwgMHg3QzEyLCAweDdFODIsIDB4N0NCMiwgMHg3RTk4LAotICAgIDB4OEI5QSwgMHg4RDBBLCAweDk0N0QsIDB4OTkxMCwgMHg5OTRDLCAweDUyMzksIDB4NUJERiwgMHg2NEU2LAotICAgIDB4NjcyRCwgMHg3RDJFLCAweDUwRUQsIDB4NTNDMywgMHg1ODc5LCAweDYxNTgsIDB4NjE1OSwgMHg2MUZBLAotICAgIDB4NjVBQywgMHg3QUQ5LCAweDhCOTIsIDB4OEI5NiwgMHg1MDA5LCAweDUwMjEsIDB4NTI3NSwgMHg1NTMxLAotICAgIDB4NUEzQywgMHg1RUUwLCAweDVGNzAsIDB4NjEzNCwgMHg2NTVFLCAweDY2MEMsIDB4NjYzNiwgMHg2NkEyLAotICAgIDB4NjlDRCwgMHg2RUM0LCAweDZGMzIsIDB4NzMxNiwgMHg3NjIxLCAweDdBOTMsIDB4ODEzOSwgMHg4MjU5LAotICAgIDB4ODNENiwgMHg4NEJDLCAweDUwQjUsIDB4NTdGMCwgMHg1QkMwLCAweDVCRTgsIDB4NUY2OSwgMHg2M0ExLAotICAgIDB4NzgyNiwgMHg3REI1LCAweDgzREMsIDB4ODUyMSwgMHg5MUM3LCAweDkxRjUsIDB4NTE4QSwgMHg2N0Y1LAotICAgIDB4N0I1NiwgMHg4Q0FDLCAweDUxQzQsIDB4NTlCQiwgMHg2MEJELCAweDg2NTUsIDB4NTAxQywgMHg1MjU0LAotICAgIDB4NUMzQSwgMHg2MTdELCAweDYyMUEsIDB4NjJEMywgMHg2NEYyLCAweDY1QTUsIDB4NkVDQywgMHg3NjIwLAotICAgIDB4ODEwQSwgMHg4RTYwLCAweDk2NUYsIDB4OTZCQiwgMHg0RURGLCAweDUzNDMsIDB4NTU5OCwgMHg1OTI5LAotICAgIDB4NURERCwgMHg2NEM1LCAweDZDQzksIDB4NkRGQSwgMHg3Mzk0LCAweDdBN0YsIDB4ODIxQiwgMHg4NUE2LAotICAgIDB4OENFNCwgMHg4RTEwLCAweDkwNzcsIDB4OTFFNywgMHg5NUUxLCAweDk2MjEsIDB4OTdDNiwgMHg1MUY4LAotICAgIDB4NTRGMiwgMHg1NTg2LCAweDVGQjksIDB4NjRBNCwgMHg2Rjg4LCAweDdEQjQsIDB4OEYxRiwgMHg4RjRELAotICAgIDB4OTQzNSwgMHg1MEM5LCAweDVDMTYsIDB4NkNCRSwgMHg2REZCLCAweDc1MUIsIDB4NzdCQiwgMHg3QzNELAotICAgIDB4N0M2NCwgMHg4QTc5LCAweDhBQzIsIDB4NTgxRSwgMHg1OUJFLCAweDVFMTYsIDB4NjM3NywgMHg3MjUyLAotICAgIDB4NzU4QSwgMHg3NzZCLCAweDhBREMsIDB4OENCQywgMHg4RjEyLCAweDVFRjMsIDB4NjY3NCwgMHg2REY4LAotICAgIDB4ODA3RCwgMHg4M0MxLCAweDhBQ0IsIDB4OTc1MSwgMHg5QkQ2LCAweDUyNDMsIDB4NjZGRiwgMHg2RDk1LAotICAgIDB4NkVFRiwgMHg3REUwLCAweDhBRTYsIDB4OTAyRSwgMHg5MDVFLCAweDlBRDQsIDB4NTIxRCwgMHg1MjdGLAotICAgIDB4NTRFOCwgMHg2MTk0LCAweDYyODQsIDB4NjJEQiwgMHg2OEEyLCAweDY5MTIsIDB4Njk1QSwgMHg2QTM1LAotICAgIDB4NzA5MiwgMHg3MTI2LCAweDc4NUQsIDB4NzkwMSwgMHg3OTBFLCAweDc5RDIsIDB4N0EwRCwgMHg4MDk2LAotICAgIDB4ODI3OCwgMHg4MkQ1LCAweDgzNDksIDB4ODU0OSwgMHg4QzgyLCAweDhEODUsIDB4OTE2MiwgMHg5MThCLAotICAgIDB4OTFBRSwgMHg0RkMzLCAweDU2RDEsIDB4NzFFRCwgMHg3N0Q3LCAweDg3MDAsIDB4ODlGOCwgMHg1QkY4LAotICAgIDB4NUZENiwgMHg2NzUxLCAweDkwQTgsIDB4NTNFMiwgMHg1ODVBLCAweDVCRjUsIDB4NjBBNCwgMHg2MTgxLAotICAgIDB4NjQ2MCwgMHg3RTNELCAweDgwNzAsIDB4ODUyNSwgMHg5MjgzLCAweDY0QUUsIDB4NTBBQywgMHg1RDE0LAotICAgIDB4NjcwMCwgMHg1ODlDLCAweDYyQkQsIDB4NjNBOCwgMHg2OTBFLCAweDY5NzgsIDB4NkExRSwgMHg2RTZCLAotICAgIDB4NzZCQSwgMHg3OUNCLCAweDgyQkIsIDB4ODQyOSwgMHg4QUNGLCAweDhEQTgsIDB4OEZGRCwgMHg5MTEyLAotICAgIDB4OTE0QiwgMHg5MTlDLCAweDkzMTAsIDB4OTMxOCwgMHg5MzlBLCAweDk2REIsIDB4OUEzNiwgMHg5QzBELAotICAgIDB4NEUxMSwgMHg3NTVDLCAweDc5NUQsIDB4N0FGQSwgMHg3QjUxLCAweDdCQzksIDB4N0UyRSwgMHg4NEM0LAotICAgIDB4OEU1OSwgMHg4RTc0LCAweDhFRjgsIDB4OTAxMCwgMHg2NjI1LCAweDY5M0YsIDB4NzQ0MywgMHg1MUZBLAotICAgIDB4NjcyRSwgMHg5RURDLCAweDUxNDUsIDB4NUZFMCwgMHg2Qzk2LCAweDg3RjIsIDB4ODg1RCwgMHg4ODc3LAotICAgIDB4NjBCNCwgMHg4MUI1LCAweDg0MDMsIDB4OEQwNSwgMHg1M0Q2LCAweDU0MzksIDB4NTYzNCwgMHg1QTM2LAotICAgIDB4NUMzMSwgMHg3MDhBLCAweDdGRTAsIDB4ODA1QSwgMHg4MTA2LCAweDgxRUQsIDB4OERBMywgMHg5MTg5LAotICAgIDB4OUE1RiwgMHg5REYyLCAweDUwNzQsIDB4NEVDNCwgMHg1M0EwLCAweDYwRkIsIDB4NkUyQywgMHg1QzY0LAotICAgIDB4NEY4OCwgMHg1MDI0LCAweDU1RTQsIDB4NUNEOSwgMHg1RTVGLCAweDYwNjUsIDB4Njg5NCwgMHg2Q0JCLAotICAgIDB4NkRDNCwgMHg3MUJFLCAweDc1RDQsIDB4NzVGNCwgMHg3NjYxLCAweDdBMUEsIDB4N0E0OSwgMHg3REM3LAotICAgIDB4N0RGQiwgMHg3RjZFLCAweDgxRjQsIDB4ODZBOSwgMHg4RjFDLCAweDk2QzksIDB4OTlCMywgMHg5RjUyLAotICAgIDB4NTI0NywgMHg1MkM1LCAweDk4RUQsIDB4ODlBQSwgMHg0RTAzLCAweDY3RDIsIDB4NkYwNiwgMHg0RkI1LAotICAgIDB4NUJFMiwgMHg2Nzk1LCAweDZDODgsIDB4NkQ3OCwgMHg3NDFCLCAweDc4MjcsIDB4OTFERCwgMHg5MzdDLAotICAgIDB4ODdDNCwgMHg3OUU0LCAweDdBMzEsIDB4NUZFQiwgMHg0RUQ2LCAweDU0QTQsIDB4NTUzRSwgMHg1OEFFLAotICAgIDB4NTlBNSwgMHg2MEYwLCAweDYyNTMsIDB4NjJENiwgMHg2NzM2LCAweDY5NTUsIDB4ODIzNSwgMHg5NjQwLAotICAgIDB4OTlCMSwgMHg5OURELCAweDUwMkMsIDB4NTM1MywgMHg1NTQ0LCAweDU3N0MsIDB4NjI1OCwgMHg2NEUyLAotICAgIDB4NjY2QiwgMHg2N0RELCAweDZGQzEsIDB4NkZFRiwgMHg3NDIyLCAweDc0MzgsIDB4OEExNywgMHg5NDM4LAotICAgIDB4NTQ1MSwgMHg1NjA2LCAweDU3NjYsIDB4NUY0OCwgMHg2MTlBLCAweDZCNEUsIDB4NzA1OCwgMHg3MEFELAotICAgIDB4N0RCQiwgMHg4QTk1LCAweDU5NkEsIDB4ODEyQiwgMHg2M0EyLCAweDc3MDgsIDB4ODAzRCwgMHg4Q0FBLAotICAgIDB4NTg1NCwgMHg2NDJELCAweDY5QkIsIDB4NUI5NSwgMHg1RTExLCAweDZFNkYsIDB4ODU2OSwgMHg1MTRDLAotICAgIDB4NTNGMCwgMHg1OTJBLCAweDYwMjAsIDB4NjE0QiwgMHg2Qjg2LCAweDZDNzAsIDB4NkNGMCwgMHg3QjFFLAotICAgIDB4ODBDRSwgMHg4MkQ0LCAweDhEQzYsIDB4OTBCMCwgMHg5OEIxLCAweDY0QzcsIDB4NkZBNCwgMHg2NDkxLAotICAgIDB4NjUwNCwgMHg1MTRFLCAweDU0MTAsIDB4NTcxRiwgMHg4QTBFLCAweDYxNUYsIDB4Njg3NiwgMHg3NURCLAotICAgIDB4N0I1MiwgMHg3RDcxLCAweDkwMUEsIDB4NTgwNiwgMHg2OUNDLCAweDgxN0YsIDB4ODkyQSwgMHg5MDAwLAotICAgIDB4OTgzOSwgMHg1MDc4LCAweDU5NTcsIDB4NTlBQywgMHg2Mjk1LCAweDkwMEYsIDB4OUIyQSwgMHg2MTVELAotICAgIDB4NzI3OSwgMHg5NUQ2LCAweDU3NjEsIDB4NUE0NiwgMHg1REY0LCAweDYyOEEsIDB4NjRBRCwgMHg2NEZBLAotICAgIDB4Njc3NywgMHg2Q0UyLCAweDZEM0UsIDB4NzIyQywgMHg3NDM2LCAweDc4MzQsIDB4N0Y3NywgMHg4MkFELAotICAgIDB4OEREQiwgMHg5ODE3LCAweDUyMjQsIDB4NTc0MiwgMHg2NzdGLCAweDcyNDgsIDB4NzRFMywgMHg4Q0E5LAotICAgIDB4OEZBNiwgMHg5MjExLCAweDk2MkEsIDB4NTE2QiwgMHg1M0VELCAweDYzNEMsIDB4NEY2OSwgMHg1NTA0LAotICAgIDB4NjA5NiwgMHg2NTU3LCAweDZDOUIsIDB4NkQ3RiwgMHg3MjRDLCAweDcyRkQsIDB4N0ExNywgMHg4OTg3LAotICAgIDB4OEM5RCwgMHg1RjZELCAweDZGOEUsIDB4NzBGOSwgMHg4MUE4LCAweDYxMEUsIDB4NEZCRiwgMHg1MDRGLAotICAgIDB4NjI0MSwgMHg3MjQ3LCAweDdCQzcsIDB4N0RFOCwgMHg3RkU5LCAweDkwNEQsIDB4OTdBRCwgMHg5QTE5LAotICAgIDB4OENCNiwgMHg1NzZBLCAweDVFNzMsIDB4NjdCMCwgMHg4NDBELCAweDhBNTUsIDB4NTQyMCwgMHg1QjE2LAotICAgIDB4NUU2MywgMHg1RUUyLCAweDVGMEEsIDB4NjU4MywgMHg4MEJBLCAweDg1M0QsIDB4OTU4OSwgMHg5NjVCLAotICAgIDB4NEY0OCwgMHg1MzA1LCAweDUzMEQsIDB4NTMwRiwgMHg1NDg2LCAweDU0RkEsIDB4NTcwMywgMHg1RTAzLAotICAgIDB4NjAxNiwgMHg2MjlCLCAweDYyQjEsIDB4NjM1NSwgMHg2Q0UxLCAweDZENjYsIDB4NzVCMSwgMHg3ODMyLAotICAgIDB4ODBERSwgMHg4MTJGLCAweDgyREUsIDB4ODQ2MSwgMHg4NEIyLCAweDg4OEQsIDB4ODkxMiwgMHg5MDBCLAotICAgIDB4OTJFQSwgMHg5OEZELCAweDlCOTEsIDB4NUU0NSwgMHg2NkI0LCAweDY2REQsIDB4NzAxMSwgMHg3MjA2LAotICAgIDB4NEZGNSwgMHg1MjdELCAweDVGNkEsIDB4NjE1MywgMHg2NzUzLCAweDZBMTksIDB4NkYwMiwgMHg3NEUyLAotICAgIDB4Nzk2OCwgMHg4ODY4LCAweDhDNzksIDB4OThDNywgMHg5OEM0LCAweDlBNDMsIDB4NTRDMSwgMHg3QTFGLAotICAgIDB4Njk1MywgMHg4QUY3LCAweDhDNEEsIDB4OThBOCwgMHg5OUFFLCAweDVGN0MsIDB4NjJBQiwgMHg3NUIyLAotICAgIDB4NzZBRSwgMHg4OEFCLCAweDkwN0YsIDB4OTY0MiwgMHg1MzM5LCAweDVGM0MsIDB4NUZDNSwgMHg2Q0NDLAotICAgIDB4NzNDQywgMHg3NTYyLCAweDc1OEIsIDB4N0I0NiwgMHg4MkZFLCAweDk5OUQsIDB4NEU0RiwgMHg5MDNDLAotICAgIDB4NEUwQiwgMHg0RjU1LCAweDUzQTYsIDB4NTkwRiwgMHg1RUM4LCAweDY2MzAsIDB4NkNCMywgMHg3NDU1LAotICAgIDB4ODM3NywgMHg4NzY2LCAweDhDQzAsIDB4OTA1MCwgMHg5NzFFLCAweDlDMTUsIDB4NThEMSwgMHg1Qjc4LAotICAgIDB4ODY1MCwgMHg4QjE0LCAweDlEQjQsIDB4NUJEMiwgMHg2MDY4LCAweDYwOEQsIDB4NjVGMSwgMHg2QzU3LAotICAgIDB4NkYyMiwgMHg2RkEzLCAweDcwMUEsIDB4N0Y1NSwgMHg3RkYwLCAweDk1OTEsIDB4OTU5MiwgMHg5NjUwLAotICAgIDB4OTdEMywgMHg1MjcyLCAweDhGNDQsIDB4NTFGRCwgMHg1NDJCLCAweDU0QjgsIDB4NTU2MywgMHg1NThBLAotICAgIDB4NkFCQiwgMHg2REI1LCAweDdERDgsIDB4ODI2NiwgMHg5MjlDLCAweDk2NzcsIDB4OUU3OSwgMHg1NDA4LAotICAgIDB4NTRDOCwgMHg3NkQyLCAweDg2RTQsIDB4OTVBNCwgMHg5NUQ0LCAweDk2NUMsIDB4NEVBMiwgMHg0RjA5LAotICAgIDB4NTlFRSwgMHg1QUU2LCAweDVERjcsIDB4NjA1MiwgMHg2Mjk3LCAweDY3NkQsIDB4Njg0MSwgMHg2Qzg2LAotICAgIDB4NkUyRiwgMHg3RjM4LCAweDgwOUIsIDB4ODIyQSwgMHg5ODA1LCAweDRFQTUsIDB4NTA1NSwgMHg1NEIzLAotICAgIDB4NTc5MywgMHg1OTVBLCAweDVCNjksIDB4NUJCMywgMHg2MUM4LCAweDY5NzcsIDB4NkQ3NywgMHg3MDIzLAotICAgIDB4ODdGOSwgMHg4OUUzLCAweDhBNzIsIDB4OEFFNywgMHg5MDgyLCAweDk5RUQsIDB4OUFCOCwgMHg1MkJFLAotICAgIDB4NjgzOCwgMHg1MDE2LCAweDVFNzgsIDB4Njc0RiwgMHg4MzQ3LCAweDg4NEMsIDB4NEVBQiwgMHg1NDExLAotICAgIDB4NTZBRSwgMHg3M0U2LCAweDkxMTUsIDB4OTdGRiwgMHg5OTA5LCAweDk5NTcsIDB4OTk5OSwgMHg1NjUzLAotICAgIDB4NTg5RiwgMHg4NjVCLCAweDhBMzEsIDB4NjFCMiwgMHg2QUY2LCAweDczN0IsIDB4OEVEMiwgMHg2QjQ3LAotICAgIDB4OTZBQSwgMHg5QTU3LCAweDU5NTUsIDB4NzIwMCwgMHg4RDZCLCAweDk3NjksIDB4NEZENCwgMHg1Q0Y0LAotICAgIDB4NUYyNiwgMHg2MUY4LCAweDY2NUIsIDB4NkNFQiwgMHg3MEFCLCAweDczODQsIDB4NzNCOSwgMHg3M0ZFLAotICAgIDB4NzcyOSwgMHg3NzRELCAweDdENDMsIDB4N0Q2MiwgMHg3RTIzLCAweDgyMzcsIDB4ODg1MiwgMHg4Q0UyLAotICAgIDB4OTI0OSwgMHg5ODZGLCAweDVCNTEsIDB4N0E3NCwgMHg4ODQwLCAweDk4MDEsIDB4NUFDQywgMHg0RkUwLAotICAgIDB4NTM1NCwgMHg1OTNFLCAweDVDRkQsIDB4NjMzRSwgMHg2RDc5LCAweDcyRjksIDB4ODEwNSwgMHg4MTA3LAotICAgIDB4ODNBMiwgMHg5MkNGLCAweDk4MzAsIDB4NEVBOCwgMHg1MTQ0LCAweDUyMTEsIDB4NTc4QiwgMHg1RjYyLAotICAgIDB4NkNDMiwgMHg2RUNFLCAweDcwMDUsIDB4NzA1MCwgMHg3MEFGLCAweDcxOTIsIDB4NzNFOSwgMHg3NDY5LAotICAgIDB4ODM0QSwgMHg4N0EyLCAweDg4NjEsIDB4OTAwOCwgMHg5MEEyLCAweDkzQTMsIDB4OTlBOCwgMHg1MTZFLAotICAgIDB4NUY1NywgMHg2MEUwLCAweDYxNjcsIDB4NjZCMywgMHg4NTU5LCAweDhFNEEsIDB4OTFBRiwgMHg5NzhCLAotICAgIDB4NEU0RSwgMHg0RTkyLCAweDU0N0MsIDB4NThENSwgMHg1OEZBLCAweDU5N0QsIDB4NUNCNSwgMHg1RjI3LAotICAgIDB4NjIzNiwgMHg2MjQ4LCAweDY2MEEsIDB4NjY2NywgMHg2QkVCLCAweDZENjksIDB4NkRDRiwgMHg2RTU2LAotICAgIDB4NkVGOCwgMHg2Rjk0LCAweDZGRTAsIDB4NkZFOSwgMHg3MDVELCAweDcyRDAsIDB4NzQyNSwgMHg3NDVBLAotICAgIDB4NzRFMCwgMHg3NjkzLCAweDc5NUMsIDB4N0NDQSwgMHg3RTFFLCAweDgwRTEsIDB4ODJBNiwgMHg4NDZCLAotICAgIDB4ODRCRiwgMHg4NjRFLCAweDg2NUYsIDB4ODc3NCwgMHg4Qjc3LCAweDhDNkEsIDB4OTNBQywgMHg5ODAwLAotICAgIDB4OTg2NSwgMHg2MEQxLCAweDYyMTYsIDB4OTE3NywgMHg1QTVBLCAweDY2MEYsIDB4NkRGNywgMHg2RTNFLAotICAgIDB4NzQzRiwgMHg5QjQyLCAweDVGRkQsIDB4NjBEQSwgMHg3QjBGLCAweDU0QzQsIDB4NUYxOCwgMHg2QzVFLAotICAgIDB4NkNEMywgMHg2RDJBLCAweDcwRDgsIDB4N0QwNSwgMHg4Njc5LCAweDhBMEMsIDB4OUQzQiwgMHg1MzE2LAotICAgIDB4NTQ4QywgMHg1QjA1LCAweDZBM0EsIDB4NzA2QiwgMHg3NTc1LCAweDc5OEQsIDB4NzlCRSwgMHg4MkIxLAotICAgIDB4ODNFRiwgMHg4QTcxLCAweDhCNDEsIDB4OENBOCwgMHg5Nzc0LCAweDY0RjQsIDB4NjUyQiwgMHg3OEJBLAotICAgIDB4NzhCQiwgMHg3QTZCLCAweDRFMzgsIDB4NTU5QSwgMHg1OTUwLCAweDVCQTYsIDB4NUU3QiwgMHg2MEEzLAotICAgIDB4NjNEQiwgMHg2QjYxLCAweDY2NjUsIDB4Njg1MywgMHg2RTE5LCAweDcxNjUsIDB4NzRCMCwgMHg3RDA4LAotICAgIDB4OTA4NCwgMHg5QTY5LCAweDlDMjUsIDB4NkQzQiwgMHg2RUQxLCAweDczM0UsIDB4OEM0MSwgMHg5NUNBLAotICAgIDB4NTFGMCwgMHg1RTRDLCAweDVGQTgsIDB4NjA0RCwgMHg2MEY2LCAweDYxMzAsIDB4NjE0QywgMHg2NjQzLAotICAgIDB4NjY0NCwgMHg2OUE1LCAweDZDQzEsIDB4NkU1RiwgMHg2RUM5LCAweDZGNjIsIDB4NzE0QywgMHg3NDlDLAotICAgIDB4NzY4NywgMHg3QkMxLCAweDdDMjcsIDB4ODM1MiwgMHg4NzU3LCAweDkwNTEsIDB4OTY4RCwgMHg5RUMzLAotICAgIDB4NTMyRiwgMHg1NkRFLCAweDVFRkIsIDB4NUY4QSwgMHg2MDYyLCAweDYwOTQsIDB4NjFGNywgMHg2NjY2LAotICAgIDB4NjcwMywgMHg2QTlDLCAweDZERUUsIDB4NkZBRSwgMHg3MDcwLCAweDczNkEsIDB4N0U2QSwgMHg4MUJFLAotICAgIDB4ODMzNCwgMHg4NkQ0LCAweDhBQTgsIDB4OENDNCwgMHg1MjgzLCAweDczNzIsIDB4NUI5NiwgMHg2QTZCLAotICAgIDB4OTQwNCwgMHg1NEVFLCAweDU2ODYsIDB4NUI1RCwgMHg2NTQ4LCAweDY1ODUsIDB4NjZDOSwgMHg2ODlGLAotICAgIDB4NkQ4RCwgMHg2REM2LCAweDcyM0IsIDB4ODBCNCwgMHg5MTc1LCAweDlBNEQsIDB4NEZBRiwgMHg1MDE5LAotICAgIDB4NTM5QSwgMHg1NDBFLCAweDU0M0MsIDB4NTU4OSwgMHg1NUM1LCAweDVFM0YsIDB4NUY4QywgMHg2NzNELAotICAgIDB4NzE2NiwgMHg3M0RELCAweDkwMDUsIDB4NTJEQiwgMHg1MkYzLCAweDU4NjQsIDB4NThDRSwgMHg3MTA0LAotICAgIDB4NzE4RiwgMHg3MUZCLCAweDg1QjAsIDB4OEExMywgMHg2Njg4LCAweDg1QTgsIDB4NTVBNywgMHg2Njg0LAotICAgIDB4NzE0QSwgMHg4NDMxLCAweDUzNDksIDB4NTU5OSwgMHg2QkMxLCAweDVGNTksIDB4NUZCRCwgMHg2M0VFLAotICAgIDB4NjY4OSwgMHg3MTQ3LCAweDhBRjEsIDB4OEYxRCwgMHg5RUJFLCAweDRGMTEsIDB4NjQzQSwgMHg3MENCLAotICAgIDB4NzU2NiwgMHg4NjY3LCAweDYwNjQsIDB4OEI0RSwgMHg5REY4LCAweDUxNDcsIDB4NTFGNiwgMHg1MzA4LAotICAgIDB4NkQzNiwgMHg4MEY4LCAweDlFRDEsIDB4NjYxNSwgMHg2QjIzLCAweDcwOTgsIDB4NzVENSwgMHg1NDAzLAotICAgIDB4NUM3OSwgMHg3RDA3LCAweDhBMTYsIDB4NkIyMCwgMHg2QjNELCAweDZCNDYsIDB4NTQzOCwgMHg2MDcwLAotICAgIDB4NkQzRCwgMHg3RkQ1LCAweDgyMDgsIDB4NTBENiwgMHg1MURFLCAweDU1OUMsIDB4NTY2QiwgMHg1NkNELAotICAgIDB4NTlFQywgMHg1QjA5LCAweDVFMEMsIDB4NjE5OSwgMHg2MTk4LCAweDYyMzEsIDB4NjY1RSwgMHg2NkU2LAotICAgIDB4NzE5OSwgMHg3MUI5LCAweDcxQkEsIDB4NzJBNywgMHg3OUE3LCAweDdBMDAsIDB4N0ZCMiwgMHg4QTcwLAotICAgIDB4MzAwMSwgMHgzMDAyLCAweDIwMjUsIDB4MDBBRCwgMHgyMDE1LCAweDIyMjUsIDB4RkY1RSwgMHgzMDE0LAotICAgIDB4MzAxNSwgMHgzMDA4LCAweDMwMDksIDB4MzAwQSwgMHgzMDBCLCAweDMwMEMsIDB4MzAwRCwgMHgzMDBFLAotICAgIDB4MzAwRiwgMHgzMDEwLCAweDMwMTEsIDB4MzAxMywgMHhGRjAxLCAweEZGMDgsIDB4RkYwOSwgMHhGRjBDLAotICAgIDB4RkYwRSwgMHhGRjFBLCAweEZGMUIsIDB4RkYxQywgMHhGRjFELCAweEZGMUUsIDB4RkYxRiwgMHhGRjNCLAotICAgIDB4RkYzRCwgMHhGRjNGLCAweEZGNUIsIDB4RkY1QywgMHhGRjVELCAweEZGNUUsIDB4MDAyMCwgMHgwMDIxLAotICAgIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsIDB4MDAyOCwgMHgwMDI5LAotICAgIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLCAweDAwMkYsIDB4MDAzMCwgMHgwMDMxLAotICAgIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LAotICAgIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLCAweDAwM0YsIDB4MDA0MCwgMHgwMDQxLAotICAgIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LAotICAgIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLAotICAgIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LAotICAgIDB4MDA1QSwgMHgwMDVCLCAweDAwNUMsIDB4MDA1RCwgMHgwMDVFLCAweDAwNUYsIDB4MDA2MCwgMHgwMDYxLAotICAgIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LAotICAgIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLAotICAgIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LAotICAgIDB4MDA3QSwgMHgwMDdCLCAweDAwN0MsIDB4MDA3RCwgMHgyMDNFLCAweDAwN0UsIDB4MDA1QywgMHgyMzFDLAotICAgIDB4MjMxRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDMwMEUsIDB4MzAwRiwgMHgzMDBBLAotICAgIDB4MzAwQiwgMHgzMDA4LCAweDMwMDksIDB4MDAyOCwgMHgwMDI5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDI4LAotICAgIDB4MDAyOSwgMHgwMDI4LCAweDAwMjksIDB4MDAwMCwgMHgwMDAwLCAweDAwMjgsIDB4MDAyOSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgzMDE2LCAweDMwMTcsIDB4MzAxNiwgMHgzMDE3LCAweDMwMTgsIDB4MzAxOSwgMHgwMDVCLAotICAgIDB4MDA1RCwgMHgwMDAwLCAweDAwMDAsIDB4MjYzRSwgMHgyNjNELCAweDIwMjEsIDB4MjAyMSwgMHgyMDIwLAotICAgIDB4MjAyMSwgMHgwMDAwLCAweDIyMTcsIDB4MDAwMCwgMHgwMDAwLCAweDIwMUYsIDB4MjAxQiwgMHgwMkQ2LAotICAgIDB4MDJENywgMHgwMEQ3LCAweDIyMUUsIDB4MDAwMCwgMHgwMEIxLCAweDIyMTMsIDB4MDAzRSwgMHgwMDNDLAotICAgIDB4MDAzRCwgMHgyMjYwLCAweDIwN0QsIDB4MjA3RSwgMHgwMDdCLCAweDAwN0QsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MjIyOSwgMHgyMjJBLCAweDIyODIsIDB4MjIwOCwgMHgwM0EzLCAweDAwMjEsIDB4MDAwMCwgMHgzMDIxLAotICAgIDB4MzAyMiwgMHgzMDIzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDRFMDMsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4NTM0MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAyNywgMHgzMDE0LCAweDMwMTUsIDB4MDAyQSwgMHgwMDAwLAotICAgIDB4MjIxNywgMHgwMDJBLCAweENEQ0QsIDB4MzAwMSwgMHgzMDAyLCAweDAwMjgsIDB4MDAyOSwgMHgwMDI4LAotICAgIDB4MDAyOSwgMHgwMDI4LCAweDAwMjksIDB4MzAxNiwgMHgzMDE3LCAweDMwMTAsIDB4MzAxMSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELAotICAgIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwQjYsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MjJFRiwgMHgyMjM3LCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELAotICAgIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4Mjc4QSwgMHgyNzhCLAotICAgIDB4Mjc4QywgMHgyNzhELCAweDI3OEUsIDB4Mjc4RiwgMHgyNzkwLCAweDI3OTEsIDB4Mjc5MiwgMHgyNzkzLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgyNEI2LCAweDI0QjcsIDB4MjRCOCwgMHgyNEI5LAotICAgIDB4MjRCQSwgMHgyNEJCLCAweDI0QkMsIDB4MjRCRCwgMHgyNEJFLCAweDI0QkYsIDB4MjRDMCwgMHgyNEMxLAotICAgIDB4MjRDMiwgMHgyNEMzLCAweDI0QzQsIDB4MjRDNSwgMHgyNEM2LCAweDI0QzcsIDB4MjRDOCwgMHgyNEM5LAotICAgIDB4MjRDQSwgMHgyNENCLCAweDI0Q0MsIDB4MjRDRCwgMHgyNENFLCAweDI0Q0YsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgwMDVELAotICAgIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELAotICAgIDB4MDA1RCwgMHgwMDVELCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELAotICAgIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjJDRiwgMHgyMkNFLCAweDIyQ0YsIDB4MjJDRSwgMHgyMjgwLAotICAgIDB4MjI4MSwgMHgyMjcwLCAweDIyNzEsIDB4MjI3MiwgMHgyMjczLCAweDAwMDAsIDB4MjI4QSwgMHgwMDAwLAotICAgIDB4MjI4QiwgMHgyMjc2LCAweDIyNzcsIDB4MjI3OSwgMHgyMkRBLCAweDIyREIsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDIyMjEsIDB4MjI0NSwgMHgyMjQzLCAweDIyNDgsIDB4MDAwMCwgMHgyMkE0LAotICAgIDB4MjJBQiwgMHgwMDAwLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgwMDAwLCAweDI0NjAsIDB4MjQ2MSwgMHgyNDYyLAotICAgIDB4MjQ2MywgMHgyNDY0LCAweDI0NjUsIDB4MjQ2NiwgMHgyNDY3LCAweDI0NjgsIDB4MDAyOSwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjEsIDB4MDBCMCwgMHgwMDI3LCAweDAwMjIsIDB4MjAzNCwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAwMCwgMHgwMDAwLCAweDIwMjAsIDB4MjAyMCwgMHgyMDIxLAotICAgIDB4MjAyMCwgMHgwMEE3LCAweDAwMjMsIDB4MDAyQSwgMHgwMDJBLCAweDAwMDAsIDB4MDAwMCwgMHgyMDQyLAotICAgIDB4MDAyQSwgMHgwMDAwLCAweDAwMDAsIDB4MjA0MiwgMHgwMDJBLCAweDAwMDAsIDB4MDAwMCwgMHgyMDIyLAotICAgIDB4MjBERiwgMHgyMERGLCAweDAwMDAsIDB4MjBERiwgMHgzMDA4LCAweDMwMDksIDB4MzAwQSwgMHgzMDBCLAotICAgIDB4MjYxQywgMHgyNjFFLCAweDAwMDAsIDB4MDAwMCwgMHgyMERFLCAweDAwMDAsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMERELCAweDIwREQsIDB4MjcxQSwgMHgyNzE2LAotICAgIDB4MDAwMCwgMHgyNUVGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyNUNDLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwQTksIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MjYyRiwgMHgwMDAwLCAweDI2MkYsIDB4MjYyRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzMDIwLAotICAgIDB4MDAwMCwgMHgyNzc2LCAweDI3NzcsIDB4Mjc3OCwgMHgyNzc5LCAweDI3N0EsIDB4Mjc3QiwgMHgyNzdDLAotICAgIDB4Mjc3RCwgMHgyNzdFLCAweDI3N0YsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MjY0MiwgMHgyMkE5LCAweDMwMzYsIDB4MjVDQiwgMHgyNUQzLAotICAgIDB4MjVBMSwgMHgyMzAyLCAweDAwMDAsIDB4MjVBRCwgMHgyNUFELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MjVDNywgMHgwMDAwLCAweDAwMDAsIDB4MjIwNiwgMHgyMkJGLCAweDIzMUUsIDB4MDAwMCwgMHgyMjI1LAotICAgIDB4MjIyNiwgMHgwMDAwLCAweDIyNTMsIDB4MjI1MSwgMHgyMjY2LCAweDIyNjcsIDB4MjIxMywgMHgyMjk1LAotICAgIDB4MjI5NiwgMHgyMjk3LCAweDIwREQsIDB4MjMxNCwgMHgwMDAwLCAweDAwMDAsIDB4MjI2MiwgMHgwMDAwLAotICAgIDB4MjVCMSwgMHgwMDAwLCAweDIyMjIsIDB4MjI1MCwgMHgwMEQ4LCAweDIzNEEsIDB4MjJBMywgMHgwMzM4LAotICAgIDB4MDAwMCwgMHgyMjZFLCAweDIyNkYsIDB4MjI4NSwgMHgyMjg0LCAweDIyMDksIDB4MjIwQywgMHgyMkJCLAotICAgIDB4MDAxNiwgMHgyMjVBLCAweDIzMDYsIDB4MDAyNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgzMjlFLCAweDAwMDAsIDB4MjAzQywgMHgwMDNGLCAweDAwMDAsIDB4MDAzRiwgMHgyMkM0LAotICAgIDB4MjVDNywgMHgyMkM0LCAweDI1QzYsIDB4MjVBQiwgMHgyNUExLCAweDI1QUIsIDB4MjVBMCwgMHgyNUU2LAotICAgIDB4MjVDQiwgMHgyNUU2LCAweDI1Q0YsIDB4MjVCRCwgMHgyNUIzLCAweDI1QjcsIDB4MjVDMSwgMHgyNzI2LAotICAgIDB4MjVDRiwgMHgyNUEwLCAweDAwMDAsIDB4MjVDQSwgMHgzMjMxLCAweDMyMzksIDB4MzNDQiwgMHgyNDgzLAotICAgIDB4MjQ5NCwgMHgyNDk1LCAweDI0OTYsIDB4MjQ5NywgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MjE5MiwgMHgyMTkwLAotICAgIDB4MjE5MSwgMHgyMTkzLCAweDIxOTYsIDB4MjE5NywgMHgyMTk4LCAweDIxOTksIDB4MjFEMCwgMHgyMUNGLAotICAgIDB4MjFDRCwgMHgyMUQ0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgyNzk0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDI3OUMsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgyN0JBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjFEMSwgMHgyMUQzLAotICAgIDB4MDAwMCwgMHgyNzlFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDI3OUUsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MjFCNSwgMHgyMUIxLCAweDAwMDAsIDB4MjFCNCwgMHgyMUIwLCAweDIxQjMsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MjFFNiwgMHgyMUU4LCAweDIxRTcsIDB4MjFFOSwgMHgyMUJDLCAweDIxQzAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDIxQzAsIDB4MjFCQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MjFDNCwgMHgyMUM1LCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLAotICAgIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLAotICAgIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLAotICAgIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLAotICAgIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLAotICAgIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLAotICAgIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDI0ODMsIDB4MjQ4NCwgMHgyNDg1LCAweDI0ODYsIDB4MjQ4NywgMHgwMDI5LAotICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MzI5NCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MzJBNSwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDI3OTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjFFMCwgMHgyMUUxLAotICAgIDB4MjFFMiwgMHgyMUUzLCAweDAwMDAsIDB4MjdBMSwgMHgwMDAwLCAweDAwMDAsIDB4MjFFNiwgMHgyMUU4LAotICAgIDB4MjFFNywgMHgyMUU5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjYxRCwgMHgyNjFGLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAotICAgIDB4MjBERCwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELAotICAgIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgwMDVELAotICAgIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELAotICAgIDB4MDA1RCwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELAotICAgIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgzMjkwLCAweDMyOEEsIDB4MzI4QiwgMHgzMjhDLAotICAgIDB4MzI4RCwgMHgzMjhFLCAweDMyOEYsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAotICAgIDB4MjBERSwgMHgyMERFLCAweDMwMEMsIDB4MzAwRCwgMHgzMDBFLCAweDMwMEYsIDB4MjFFOCwgMHgyMUU2LAotICAgIDB4MjFFNywgMHgyMUU5LCAweDAwMjIsIDB4MzAxRiwgMHgzMDFELCAweDIwMzYsIDB4MDA2MCwgMHgzMDAxLAotICAgIDB4MDAwMCwgMHgwMDIxLCAweDMwMjEsIDB4MDAyQywgMHgzMDAyLCAweEFDMDIsIDB4QUMwMywgMHhBQzA1LAotICAgIDB4QUMwNiwgMHhBQzBCLCAweEFDMEMsIDB4QUMwRCwgMHhBQzBFLCAweEFDMEYsIDB4QUMxOCwgMHhBQzFFLAotICAgIDB4QUMxRiwgMHhBQzIxLCAweEFDMjIsIDB4QUMyMywgMHhBQzI1LCAweEFDMjYsIDB4QUMyNywgMHhBQzI4LAotICAgIDB4QUMyOSwgMHhBQzJBLCAweEFDMkIsIDB4QUMyRSwgMHhBQzMyLCAweEFDMzMsIDB4QUMzNCwgMHhBQzM1LAotICAgIDB4QUMzNiwgMHhBQzM3LCAweEFDM0EsIDB4QUMzQiwgMHhBQzNELCAweEFDM0UsIDB4QUMzRiwgMHhBQzQxLAotICAgIDB4QUM0MiwgMHhBQzQzLCAweEFDNDQsIDB4QUM0NSwgMHhBQzQ2LCAweEFDNDcsIDB4QUM0OCwgMHhBQzQ5LAotICAgIDB4QUM0QSwgMHhBQzRDLCAweEFDNEUsIDB4QUM0RiwgMHhBQzUwLCAweEFDNTEsIDB4QUM1MiwgMHhBQzUzLAotICAgIDB4QUM1NSwgMHhBQzU2LCAweEFDNTcsIDB4QUM1OSwgMHhBQzVBLCAweEFDNUIsIDB4QUM1RCwgMHhBQzVFLAotICAgIDB4QUM1RiwgMHhBQzYwLCAweEFDNjEsIDB4QUM2MiwgMHhBQzYzLCAweEFDNjQsIDB4QUM2NSwgMHhBQzY2LAotICAgIDB4QUM2NywgMHhBQzY4LCAweEFDNjksIDB4QUM2QSwgMHhBQzZCLCAweEFDNkMsIDB4QUM2RCwgMHhBQzZFLAotICAgIDB4QUM2RiwgMHhBQzcyLCAweEFDNzMsIDB4QUM3NSwgMHhBQzc2LCAweEFDNzksIDB4QUM3QiwgMHhBQzdDLAotICAgIDB4QUM3RCwgMHhBQzdFLCAweEFDN0YsIDB4QUM4MiwgMHhBQzg3LCAweEFDODgsIDB4QUM4RCwgMHhBQzhFLAotICAgIDB4QUM4RiwgMHhBQzkxLCAweEFDOTIsIDB4QUM5MywgMHhBQzk1LCAweEFDOTYsIDB4QUM5NywgMHhBQzk4LAotICAgIDB4QUM5OSwgMHhBQzlBLCAweEFDOUIsIDB4QUM5RSwgMHhBQ0EyLCAweEFDQTMsIDB4QUNBNCwgMHhBQ0E1LAotICAgIDB4QUNBNiwgMHhBQ0E3LCAweEFDQUIsIDB4QUNBRCwgMHhBQ0FFLCAweEFDQjEsIDB4QUNCMiwgMHhBQ0IzLAotICAgIDB4QUNCNCwgMHhBQ0I1LCAweEFDQjYsIDB4QUNCNywgMHhBQ0JBLCAweEFDQkUsIDB4QUNCRiwgMHhBQ0MwLAotICAgIDB4QUNDMiwgMHhBQ0MzLCAweEFDQzUsIDB4QUNDNiwgMHhBQ0M3LCAweEFDQzksIDB4QUNDQSwgMHhBQ0NCLAotICAgIDB4QUNDRCwgMHhBQ0NFLCAweEFDQ0YsIDB4QUNEMCwgMHhBQ0QxLCAweEFDRDIsIDB4QUNEMywgMHhBQ0Q0LAotICAgIDB4QUNENiwgMHhBQ0Q4LCAweEFDRDksIDB4QUNEQSwgMHhBQ0RCLCAweEFDREMsIDB4QUNERCwgMHhBQ0RFLAotICAgIDB4QUNERiwgMHhBQ0UyLCAweEFDRTMsIDB4QUNFNSwgMHhBQ0U2LCAweEFDRTksIDB4QUNFQiwgMHhBQ0VELAotICAgIDB4QUNFRSwgMHhBQ0YyLCAweEFDRjQsIDB4QUNGNywgMHhBQ0Y4LCAweEFDRjksIDB4QUNGQSwgMHhBQ0ZCLAotICAgIDB4QUNGRSwgMHhBQ0ZGLCAweEFEMDEsIDB4QUQwMiwgMHhBRDAzLCAweEFEMDUsIDB4QUQwNywgMHhBRDA4LAotICAgIDB4QUQwOSwgMHhBRDBBLCAweEFEMEIsIDB4QUQwRSwgMHhBRDEwLCAweEFEMTIsIDB4QUQxMywgMHhBRDE0LAotICAgIDB4QUQxNSwgMHhBRDE2LCAweEFEMTcsIDB4QUQxOSwgMHhBRDFBLCAweEFEMUIsIDB4QUQxRCwgMHhBRDFFLAotICAgIDB4QUQxRiwgMHhBRDIxLCAweEFEMjIsIDB4QUQyMywgMHhBRDI0LCAweEFEMjUsIDB4QUQyNiwgMHhBRDI3LAotICAgIDB4QUQyOCwgMHhBRDJBLCAweEFEMkIsIDB4QUQyRSwgMHhBRDJGLCAweEFEMzAsIDB4QUQzMSwgMHhBRDMyLAotICAgIDB4QUQzMywgMHhBRDM2LCAweEFEMzcsIDB4QUQzOSwgMHhBRDNBLCAweEFEM0IsIDB4QUQzRCwgMHhBRDNFLAotICAgIDB4QUQzRiwgMHhBRDQwLCAweEFENDEsIDB4QUQ0MiwgMHhBRDQzLCAweEFENDYsIDB4QUQ0OCwgMHhBRDRBLAotICAgIDB4QUQ0QiwgMHhBRDRDLCAweEFENEQsIDB4QUQ0RSwgMHhBRDRGLCAweEFENTEsIDB4QUQ1MiwgMHhBRDUzLAotICAgIDB4QUQ1NSwgMHhBRDU2LCAweEFENTcsIDB4QUQ1OSwgMHhBRDVBLCAweEFENUIsIDB4QUQ1QywgMHhBRDVELAotICAgIDB4QUQ1RSwgMHhBRDVGLCAweEFENjAsIDB4QUQ2MiwgMHhBRDY0LCAweEFENjUsIDB4QUQ2NiwgMHhBRDY3LAotICAgIDB4QUQ2OCwgMHhBRDY5LCAweEFENkEsIDB4QUQ2QiwgMHhBRDZFLCAweEFENkYsIDB4QUQ3MSwgMHhBRDcyLAotICAgIDB4QUQ3NywgMHhBRDc4LCAweEFENzksIDB4QUQ3QSwgMHhBRDdFLCAweEFEODAsIDB4QUQ4MywgMHhBRDg0LAotICAgIDB4QUQ4NSwgMHhBRDg2LCAweEFEODcsIDB4QUQ4QSwgMHhBRDhCLCAweEFEOEQsIDB4QUQ4RSwgMHhBRDhGLAotICAgIDB4QUQ5MSwgMHhBRDkyLCAweEFEOTMsIDB4QUQ5NCwgMHhBRDk1LCAweEFEOTYsIDB4QUQ5NywgMHhBRDk4LAotICAgIDB4QUQ5OSwgMHhBRDlBLCAweEFEOUIsIDB4QUQ5RSwgMHhBRDlGLCAweEFEQTAsIDB4QURBMSwgMHhBREEyLAotICAgIDB4QURBMywgMHhBREE1LCAweEFEQTYsIDB4QURBNywgMHhBREE4LCAweEFEQTksIDB4QURBQSwgMHhBREFCLAotICAgIDB4QURBQywgMHhBREFELCAweEFEQUUsIDB4QURBRiwgMHhBREIwLCAweEFEQjEsIDB4QURCMiwgMHhBREIzLAotICAgIDB4QURCNCwgMHhBREI1LCAweEFEQjYsIDB4QURCOCwgMHhBREI5LCAweEFEQkEsIDB4QURCQiwgMHhBREJDLAotICAgIDB4QURCRCwgMHhBREJFLCAweEFEQkYsIDB4QURDMiwgMHhBREMzLCAweEFEQzUsIDB4QURDNiwgMHhBREM3LAotICAgIDB4QURDOSwgMHhBRENBLCAweEFEQ0IsIDB4QURDQywgMHhBRENELCAweEFEQ0UsIDB4QURDRiwgMHhBREQyLAotICAgIDB4QURENCwgMHhBREQ1LCAweEFERDYsIDB4QURENywgMHhBREQ4LCAweEFERDksIDB4QUREQSwgMHhBRERCLAotICAgIDB4QURERCwgMHhBRERFLCAweEFEREYsIDB4QURFMSwgMHhBREUyLCAweEFERTMsIDB4QURFNSwgMHhBREU2LAotICAgIDB4QURFNywgMHhBREU4LCAweEFERTksIDB4QURFQSwgMHhBREVCLCAweEFERUMsIDB4QURFRCwgMHhBREVFLAotICAgIDB4QURFRiwgMHhBREYwLCAweEFERjEsIDB4QURGMiwgMHhBREYzLCAweEFERjQsIDB4QURGNSwgMHhBREY2LAotICAgIDB4QURGNywgMHhBREZBLCAweEFERkIsIDB4QURGRCwgMHhBREZFLCAweEFFMDIsIDB4QUUwMywgMHhBRTA0LAotICAgIDB4QUUwNSwgMHhBRTA2LCAweEFFMDcsIDB4QUUwQSwgMHhBRTBDLCAweEFFMEUsIDB4QUUwRiwgMHhBRTEwLAotICAgIDB4QUUxMSwgMHhBRTEyLCAweEFFMTMsIDB4QUUxNSwgMHhBRTE2LCAweEFFMTcsIDB4QUUxOCwgMHhBRTE5LAotICAgIDB4QUUxQSwgMHhBRTFCLCAweEFFMUMsIDB4QUUxRCwgMHhBRTFFLCAweEFFMUYsIDB4QUUyMCwgMHhBRTIxLAotICAgIDB4QUUyMiwgMHhBRTIzLCAweEFFMjQsIDB4QUUyNSwgMHhBRTI2LCAweEFFMjcsIDB4QUUyOCwgMHhBRTI5LAotICAgIDB4QUUyQSwgMHhBRTJCLCAweEFFMkMsIDB4QUUyRCwgMHhBRTJFLCAweEFFMkYsIDB4QUUzMiwgMHhBRTMzLAotICAgIDB4QUUzNSwgMHhBRTM2LCAweEFFMzksIDB4QUUzQiwgMHhBRTNDLCAweEFFM0QsIDB4QUUzRSwgMHhBRTNGLAotICAgIDB4QUU0MiwgMHhBRTQ0LCAweEFFNDcsIDB4QUU0OCwgMHhBRTQ5LCAweEFFNEIsIDB4QUU0RiwgMHhBRTUxLAotICAgIDB4QUU1MiwgMHhBRTUzLCAweEFFNTUsIDB4QUU1NywgMHhBRTU4LCAweEFFNTksIDB4QUU1QSwgMHhBRTVCLAotICAgIDB4QUU1RSwgMHhBRTYyLCAweEFFNjMsIDB4QUU2NCwgMHhBRTY2LCAweEFFNjcsIDB4QUU2QSwgMHhBRTZCLAotICAgIDB4QUU2RCwgMHhBRTZFLCAweEFFNkYsIDB4QUU3MSwgMHhBRTcyLCAweEFFNzMsIDB4QUU3NCwgMHhBRTc1LAotICAgIDB4QUU3NiwgMHhBRTc3LCAweEFFN0EsIDB4QUU3RSwgMHhBRTdGLCAweEFFODAsIDB4QUU4MSwgMHhBRTgyLAotICAgIDB4QUU4MywgMHhBRTg2LCAweEFFODcsIDB4QUU4OCwgMHhBRTg5LCAweEFFOEEsIDB4QUU4QiwgMHhBRThELAotICAgIDB4QUU4RSwgMHhBRThGLCAweEFFOTAsIDB4QUU5MSwgMHhBRTkyLCAweEFFOTMsIDB4QUU5NCwgMHhBRTk1LAotICAgIDB4QUU5NiwgMHhBRTk3LCAweEFFOTgsIDB4QUU5OSwgMHhBRTlBLCAweEFFOUIsIDB4QUU5QywgMHhBRTlELAotICAgIDB4QUU5RSwgMHhBRTlGLCAweEFFQTAsIDB4QUVBMSwgMHhBRUEyLCAweEFFQTMsIDB4QUVBNCwgMHhBRUE1LAotICAgIDB4QUVBNiwgMHhBRUE3LCAweEFFQTgsIDB4QUVBOSwgMHhBRUFBLCAweEFFQUIsIDB4QUVBQywgMHhBRUFELAotICAgIDB4QUVBRSwgMHhBRUFGLCAweEFFQjAsIDB4QUVCMSwgMHhBRUIyLCAweEFFQjMsIDB4QUVCNCwgMHhBRUI1LAotICAgIDB4QUVCNiwgMHhBRUI3LCAweEFFQjgsIDB4QUVCOSwgMHhBRUJBLCAweEFFQkIsIDB4QUVCRiwgMHhBRUMxLAotICAgIDB4QUVDMiwgMHhBRUMzLCAweEFFQzUsIDB4QUVDNiwgMHhBRUM3LCAweEFFQzgsIDB4QUVDOSwgMHhBRUNBLAotICAgIDB4QUVDQiwgMHhBRUNFLCAweEFFRDIsIDB4QUVEMywgMHhBRUQ0LCAweEFFRDUsIDB4QUVENiwgMHhBRUQ3LAotICAgIDB4QUVEQSwgMHhBRURCLCAweEFFREQsIDB4QUVERSwgMHhBRURGLCAweEFFRTAsIDB4QUVFMSwgMHhBRUUyLAotICAgIDB4QUVFMywgMHhBRUU0LCAweEFFRTUsIDB4QUVFNiwgMHhBRUU3LCAweEFFRTksIDB4QUVFQSwgMHhBRUVDLAotICAgIDB4QUVFRSwgMHhBRUVGLCAweEFFRjAsIDB4QUVGMSwgMHhBRUYyLCAweEFFRjMsIDB4QUVGNSwgMHhBRUY2LAotICAgIDB4QUVGNywgMHhBRUY5LCAweEFFRkEsIDB4QUVGQiwgMHhBRUZELCAweEFFRkUsIDB4QUVGRiwgMHhBRjAwLAotICAgIDB4QUYwMSwgMHhBRjAyLCAweEFGMDMsIDB4QUYwNCwgMHhBRjA1LCAweEFGMDYsIDB4QUYwOSwgMHhBRjBBLAotICAgIDB4QUYwQiwgMHhBRjBDLCAweEFGMEUsIDB4QUYwRiwgMHhBRjExLCAweEFGMTIsIDB4QUYxMywgMHhBRjE0LAotICAgIDB4QUYxNSwgMHhBRjE2LCAweEFGMTcsIDB4QUYxOCwgMHhBRjE5LCAweEFGMUEsIDB4QUYxQiwgMHhBRjFDLAotICAgIDB4QUYxRCwgMHhBRjFFLCAweEFGMUYsIDB4QUYyMCwgMHhBRjIxLCAweEFGMjIsIDB4QUYyMywgMHhBRjI0LAotICAgIDB4QUYyNSwgMHhBRjI2LCAweEFGMjcsIDB4QUYyOCwgMHhBRjI5LCAweEFGMkEsIDB4QUYyQiwgMHhBRjJFLAotICAgIDB4QUYyRiwgMHhBRjMxLCAweEFGMzMsIDB4QUYzNSwgMHhBRjM2LCAweEFGMzcsIDB4QUYzOCwgMHhBRjM5LAotICAgIDB4QUYzQSwgMHhBRjNCLCAweEFGM0UsIDB4QUY0MCwgMHhBRjQ0LCAweEFGNDUsIDB4QUY0NiwgMHhBRjQ3LAotICAgIDB4QUY0QSwgMHhBRjRCLCAweEFGNEMsIDB4QUY0RCwgMHhBRjRFLCAweEFGNEYsIDB4QUY1MSwgMHhBRjUyLAotICAgIDB4QUY1MywgMHhBRjU0LCAweEFGNTUsIDB4QUY1NiwgMHhBRjU3LCAweEFGNTgsIDB4QUY1OSwgMHhBRjVBLAotICAgIDB4QUY1QiwgMHhBRjVFLCAweEFGNUYsIDB4QUY2MCwgMHhBRjYxLCAweEFGNjIsIDB4QUY2MywgMHhBRjY2LAotICAgIDB4QUY2NywgMHhBRjY4LCAweEFGNjksIDB4QUY2QSwgMHhBRjZCLCAweEFGNkMsIDB4QUY2RCwgMHhBRjZFLAotICAgIDB4QUY2RiwgMHhBRjcwLCAweEFGNzEsIDB4QUY3MiwgMHhBRjczLCAweEFGNzQsIDB4QUY3NSwgMHhBRjc2LAotICAgIDB4QUY3NywgMHhBRjc4LCAweEFGN0EsIDB4QUY3QiwgMHhBRjdDLCAweEFGN0QsIDB4QUY3RSwgMHhBRjdGLAotICAgIDB4QUY4MSwgMHhBRjgyLCAweEFGODMsIDB4QUY4NSwgMHhBRjg2LCAweEFGODcsIDB4QUY4OSwgMHhBRjhBLAotICAgIDB4QUY4QiwgMHhBRjhDLCAweEFGOEQsIDB4QUY4RSwgMHhBRjhGLCAweEFGOTIsIDB4QUY5MywgMHhBRjk0LAotICAgIDB4QUY5NiwgMHhBRjk3LCAweEFGOTgsIDB4QUY5OSwgMHhBRjlBLCAweEFGOUIsIDB4QUY5RCwgMHhBRjlFLAotICAgIDB4QUY5RiwgMHhBRkEwLCAweEFGQTEsIDB4QUZBMiwgMHhBRkEzLCAweEFGQTQsIDB4QUZBNSwgMHhBRkE2LAotICAgIDB4QUZBNywgMHhBRkE4LCAweEFGQTksIDB4QUZBQSwgMHhBRkFCLCAweEFGQUMsIDB4QUZBRCwgMHhBRkFFLAotICAgIDB4QUZBRiwgMHhBRkIwLCAweEFGQjEsIDB4QUZCMiwgMHhBRkIzLCAweEFGQjQsIDB4QUZCNSwgMHhBRkI2LAotICAgIDB4QUZCNywgMHhBRkJBLCAweEFGQkIsIDB4QUZCRCwgMHhBRkJFLCAweEFGQkYsIDB4QUZDMSwgMHhBRkMyLAotICAgIDB4QUZDMywgMHhBRkM0LCAweEFGQzUsIDB4QUZDNiwgMHhBRkNBLCAweEFGQ0MsIDB4QUZDRiwgMHhBRkQwLAotICAgIDB4QUZEMSwgMHhBRkQyLCAweEFGRDMsIDB4QUZENSwgMHhBRkQ2LCAweEFGRDcsIDB4QUZEOCwgMHhBRkQ5LAotICAgIDB4QUZEQSwgMHhBRkRCLCAweEFGREQsIDB4QUZERSwgMHhBRkRGLCAweEFGRTAsIDB4QUZFMSwgMHhBRkUyLAotICAgIDB4QUZFMywgMHhBRkU0LCAweEFGRTUsIDB4QUZFNiwgMHhBRkU3LCAweEFGRUEsIDB4QUZFQiwgMHhBRkVDLAotICAgIDB4QUZFRCwgMHhBRkVFLCAweEFGRUYsIDB4QUZGMiwgMHhBRkYzLCAweEFGRjUsIDB4QUZGNiwgMHhBRkY3LAotICAgIDB4QUZGOSwgMHhBRkZBLCAweEFGRkIsIDB4QUZGQywgMHhBRkZELCAweEFGRkUsIDB4QUZGRiwgMHhCMDAyLAotICAgIDB4QjAwMywgMHhCMDA1LCAweEIwMDYsIDB4QjAwNywgMHhCMDA4LCAweEIwMDksIDB4QjAwQSwgMHhCMDBCLAotICAgIDB4QjAwRCwgMHhCMDBFLCAweEIwMEYsIDB4QjAxMSwgMHhCMDEyLCAweEIwMTMsIDB4QjAxNSwgMHhCMDE2LAotICAgIDB4QjAxNywgMHhCMDE4LCAweEIwMTksIDB4QjAxQSwgMHhCMDFCLCAweEIwMUUsIDB4QjAxRiwgMHhCMDIwLAotICAgIDB4QjAyMSwgMHhCMDIyLCAweEIwMjMsIDB4QjAyNCwgMHhCMDI1LCAweEIwMjYsIDB4QjAyNywgMHhCMDI5LAotICAgIDB4QjAyQSwgMHhCMDJCLCAweEIwMkMsIDB4QjAyRCwgMHhCMDJFLCAweEIwMkYsIDB4QjAzMCwgMHhCMDMxLAotICAgIDB4QjAzMiwgMHhCMDMzLCAweEIwMzQsIDB4QjAzNSwgMHhCMDM2LCAweEIwMzcsIDB4QjAzOCwgMHhCMDM5LAotICAgIDB4QjAzQSwgMHhCMDNCLCAweEIwM0MsIDB4QjAzRCwgMHhCMDNFLCAweEIwM0YsIDB4QjA0MCwgMHhCMDQxLAotICAgIDB4QjA0MiwgMHhCMDQzLCAweEIwNDYsIDB4QjA0NywgMHhCMDQ5LCAweEIwNEIsIDB4QjA0RCwgMHhCMDRGLAotICAgIDB4QjA1MCwgMHhCMDUxLCAweEIwNTIsIDB4QjA1NiwgMHhCMDU4LCAweEIwNUEsIDB4QjA1QiwgMHhCMDVDLAotICAgIDB4QjA1RSwgMHhCMDVGLCAweEIwNjAsIDB4QjA2MSwgMHhCMDYyLCAweEIwNjMsIDB4QjA2NCwgMHhCMDY1LAotICAgIDB4QjA2NiwgMHhCMDY3LCAweEIwNjgsIDB4QjA2OSwgMHhCMDZBLCAweEIwNkIsIDB4QjA2QywgMHhCMDZELAotICAgIDB4QjA2RSwgMHhCMDZGLCAweEIwNzAsIDB4QjA3MSwgMHhCMDcyLCAweEIwNzMsIDB4QjA3NCwgMHhCMDc1LAotICAgIDB4QjA3NiwgMHhCMDc3LCAweEIwNzgsIDB4QjA3OSwgMHhCMDdBLCAweEIwN0IsIDB4QjA3RSwgMHhCMDdGLAotICAgIDB4QjA4MSwgMHhCMDgyLCAweEIwODMsIDB4QjA4NSwgMHhCMDg2LCAweEIwODcsIDB4QjA4OCwgMHhCMDg5LAotICAgIDB4QjA4QSwgMHhCMDhCLCAweEIwOEUsIDB4QjA5MCwgMHhCMDkyLCAweEIwOTMsIDB4QjA5NCwgMHhCMDk1LAotICAgIDB4QjA5NiwgMHhCMDk3LCAweEIwOUIsIDB4QjA5RCwgMHhCMDlFLCAweEIwQTMsIDB4QjBBNCwgMHhCMEE1LAotICAgIDB4QjBBNiwgMHhCMEE3LCAweEIwQUEsIDB4QjBCMCwgMHhCMEIyLCAweEIwQjYsIDB4QjBCNywgMHhCMEI5LAotICAgIDB4QjBCQSwgMHhCMEJCLCAweEIwQkQsIDB4QjBCRSwgMHhCMEJGLCAweEIwQzAsIDB4QjBDMSwgMHhCMEMyLAotICAgIDB4QjBDMywgMHhCMEM2LCAweEIwQ0EsIDB4QjBDQiwgMHhCMENDLCAweEIwQ0QsIDB4QjBDRSwgMHhCMENGLAotICAgIDB4QjBEMiwgMHhCMEQzLCAweEIwRDUsIDB4QjBENiwgMHhCMEQ3LCAweEIwRDksIDB4QjBEQSwgMHhCMERCLAotICAgIDB4QjBEQywgMHhCMERELCAweEIwREUsIDB4QjBERiwgMHhCMEUxLCAweEIwRTIsIDB4QjBFMywgMHhCMEU0LAotICAgIDB4QjBFNiwgMHhCMEU3LCAweEIwRTgsIDB4QjBFOSwgMHhCMEVBLCAweEIwRUIsIDB4QjBFQywgMHhCMEVELAotICAgIDB4QjBFRSwgMHhCMEVGLCAweEIwRjAsIDB4QjBGMSwgMHhCMEYyLCAweEIwRjMsIDB4QjBGNCwgMHhCMEY1LAotICAgIDB4QjBGNiwgMHhCMEY3LCAweEIwRjgsIDB4QjBGOSwgMHhCMEZBLCAweEIwRkIsIDB4QjBGQywgMHhCMEZELAotICAgIDB4QjBGRSwgMHhCMEZGLCAweEIxMDAsIDB4QjEwMSwgMHhCMTAyLCAweEIxMDMsIDB4QjEwNCwgMHhCMTA1LAotICAgIDB4QjEwNiwgMHhCMTA3LCAweEIxMEEsIDB4QjEwRCwgMHhCMTBFLCAweEIxMEYsIDB4QjExMSwgMHhCMTE0LAotICAgIDB4QjExNSwgMHhCMTE2LCAweEIxMTcsIDB4QjExQSwgMHhCMTFFLCAweEIxMUYsIDB4QjEyMCwgMHhCMTIxLAotICAgIDB4QjEyMiwgMHhCMTI2LCAweEIxMjcsIDB4QjEyOSwgMHhCMTJBLCAweEIxMkIsIDB4QjEyRCwgMHhCMTJFLAotICAgIDB4QjEyRiwgMHhCMTMwLCAweEIxMzEsIDB4QjEzMiwgMHhCMTMzLCAweEIxMzYsIDB4QjEzQSwgMHhCMTNCLAotICAgIDB4QjEzQywgMHhCMTNELCAweEIxM0UsIDB4QjEzRiwgMHhCMTQyLCAweEIxNDMsIDB4QjE0NSwgMHhCMTQ2LAotICAgIDB4QjE0NywgMHhCMTQ5LCAweEIxNEEsIDB4QjE0QiwgMHhCMTRDLCAweEIxNEQsIDB4QjE0RSwgMHhCMTRGLAotICAgIDB4QjE1MiwgMHhCMTUzLCAweEIxNTYsIDB4QjE1NywgMHhCMTU5LCAweEIxNUEsIDB4QjE1QiwgMHhCMTVELAotICAgIDB4QjE1RSwgMHhCMTVGLCAweEIxNjEsIDB4QjE2MiwgMHhCMTYzLCAweEIxNjQsIDB4QjE2NSwgMHhCMTY2LAotICAgIDB4QjE2NywgMHhCMTY4LCAweEIxNjksIDB4QjE2QSwgMHhCMTZCLCAweEIxNkMsIDB4QjE2RCwgMHhCMTZFLAotICAgIDB4QjE2RiwgMHhCMTcwLCAweEIxNzEsIDB4QjE3MiwgMHhCMTczLCAweEIxNzQsIDB4QjE3NSwgMHhCMTc2LAotICAgIDB4QjE3NywgMHhCMTdBLCAweEIxN0IsIDB4QjE3RCwgMHhCMTdFLCAweEIxN0YsIDB4QjE4MSwgMHhCMTgzLAotICAgIDB4QjE4NCwgMHhCMTg1LCAweEIxODYsIDB4QjE4NywgMHhCMThBLCAweEIxOEMsIDB4QjE4RSwgMHhCMThGLAotICAgIDB4QjE5MCwgMHhCMTkxLCAweEIxOTUsIDB4QjE5NiwgMHhCMTk3LCAweEIxOTksIDB4QjE5QSwgMHhCMTlCLAotICAgIDB4QjE5RCwgMHhCMTlFLCAweEIxOUYsIDB4QjFBMCwgMHhCMUExLCAweEIxQTIsIDB4QjFBMywgMHhCMUE0LAotICAgIDB4QjFBNSwgMHhCMUE2LCAweEIxQTcsIDB4QjFBOSwgMHhCMUFBLCAweEIxQUIsIDB4QjFBQywgMHhCMUFELAotICAgIDB4QjFBRSwgMHhCMUFGLCAweEIxQjAsIDB4QjFCMSwgMHhCMUIyLCAweEIxQjMsIDB4QjFCNCwgMHhCMUI1LAotICAgIDB4QjFCNiwgMHhCMUI3LCAweEIxQjgsIDB4QjFCOSwgMHhCMUJBLCAweEIxQkIsIDB4QjFCQywgMHhCMUJELAotICAgIDB4QjFCRSwgMHhCMUJGLCAweEIxQzAsIDB4QjFDMSwgMHhCMUMyLCAweEIxQzMsIDB4QjFDNCwgMHhCMUM1LAotICAgIDB4QjFDNiwgMHhCMUM3LCAweEIxQzgsIDB4QjFDOSwgMHhCMUNBLCAweEIxQ0IsIDB4QjFDRCwgMHhCMUNFLAotICAgIDB4QjFDRiwgMHhCMUQxLCAweEIxRDIsIDB4QjFEMywgMHhCMUQ1LCAweEIxRDYsIDB4QjFENywgMHhCMUQ4LAotICAgIDB4QjFEOSwgMHhCMURBLCAweEIxREIsIDB4QjFERSwgMHhCMUUwLCAweEIxRTEsIDB4QjFFMiwgMHhCMUUzLAotICAgIDB4QjFFNCwgMHhCMUU1LCAweEIxRTYsIDB4QjFFNywgMHhCMUVBLCAweEIxRUIsIDB4QjFFRCwgMHhCMUVFLAotICAgIDB4QjFFRiwgMHhCMUYxLCAweEIxRjIsIDB4QjFGMywgMHhCMUY0LCAweEIxRjUsIDB4QjFGNiwgMHhCMUY3LAotICAgIDB4QjFGOCwgMHhCMUZBLCAweEIxRkMsIDB4QjFGRSwgMHhCMUZGLCAweEIyMDAsIDB4QjIwMSwgMHhCMjAyLAotICAgIDB4QjIwMywgMHhCMjA2LCAweEIyMDcsIDB4QjIwOSwgMHhCMjBBLCAweEIyMEQsIDB4QjIwRSwgMHhCMjBGLAotICAgIDB4QjIxMCwgMHhCMjExLCAweEIyMTIsIDB4QjIxMywgMHhCMjE2LCAweEIyMTgsIDB4QjIxQSwgMHhCMjFCLAotICAgIDB4QjIxQywgMHhCMjFELCAweEIyMUUsIDB4QjIxRiwgMHhCMjIxLCAweEIyMjIsIDB4QjIyMywgMHhCMjI0LAotICAgIDB4QjIyNSwgMHhCMjI2LCAweEIyMjcsIDB4QjIyOCwgMHhCMjI5LCAweEIyMkEsIDB4QjIyQiwgMHhCMjJDLAotICAgIDB4QjIyRCwgMHhCMjJFLCAweEIyMkYsIDB4QjIzMCwgMHhCMjMxLCAweEIyMzIsIDB4QjIzMywgMHhCMjM1LAotICAgIDB4QjIzNiwgMHhCMjM3LCAweEIyMzgsIDB4QjIzOSwgMHhCMjNBLCAweEIyM0IsIDB4QjIzRCwgMHhCMjNFLAotICAgIDB4QjIzRiwgMHhCMjQwLCAweEIyNDEsIDB4QjI0MiwgMHhCMjQzLCAweEIyNDQsIDB4QjI0NSwgMHhCMjQ2LAotICAgIDB4QjI0NywgMHhCMjQ4LCAweEIyNDksIDB4QjI0QSwgMHhCMjRCLCAweEIyNEMsIDB4QjI0RCwgMHhCMjRFLAotICAgIDB4QjI0RiwgMHhCMjUwLCAweEIyNTEsIDB4QjI1MiwgMHhCMjUzLCAweEIyNTQsIDB4QjI1NSwgMHhCMjU2LAotICAgIDB4QjI1NywgMHhCMjU5LCAweEIyNUEsIDB4QjI1QiwgMHhCMjVELCAweEIyNUUsIDB4QjI1RiwgMHhCMjYxLAotICAgIDB4QjI2MiwgMHhCMjYzLCAweEIyNjQsIDB4QjI2NSwgMHhCMjY2LCAweEIyNjcsIDB4QjI2QSwgMHhCMjZCLAotICAgIDB4QjI2QywgMHhCMjZELCAweEIyNkUsIDB4QjI2RiwgMHhCMjcwLCAweEIyNzEsIDB4QjI3MiwgMHhCMjczLAotICAgIDB4QjI3NiwgMHhCMjc3LCAweEIyNzgsIDB4QjI3OSwgMHhCMjdBLCAweEIyN0IsIDB4QjI3RCwgMHhCMjdFLAotICAgIDB4QjI3RiwgMHhCMjgwLCAweEIyODEsIDB4QjI4MiwgMHhCMjgzLCAweEIyODYsIDB4QjI4NywgMHhCMjg4LAotICAgIDB4QjI4QSwgMHhCMjhCLCAweEIyOEMsIDB4QjI4RCwgMHhCMjhFLCAweEIyOEYsIDB4QjI5MiwgMHhCMjkzLAotICAgIDB4QjI5NSwgMHhCMjk2LCAweEIyOTcsIDB4QjI5QiwgMHhCMjlDLCAweEIyOUQsIDB4QjI5RSwgMHhCMjlGLAotICAgIDB4QjJBMiwgMHhCMkE0LCAweEIyQTcsIDB4QjJBOCwgMHhCMkE5LCAweEIyQUIsIDB4QjJBRCwgMHhCMkFFLAotICAgIDB4QjJBRiwgMHhCMkIxLCAweEIyQjIsIDB4QjJCMywgMHhCMkI1LCAweEIyQjYsIDB4QjJCNywgMHhCMkI4LAotICAgIDB4QjJCOSwgMHhCMkJBLCAweEIyQkIsIDB4QjJCQywgMHhCMkJELCAweEIyQkUsIDB4QjJCRiwgMHhCMkMwLAotICAgIDB4QjJDMSwgMHhCMkMyLCAweEIyQzMsIDB4QjJDNCwgMHhCMkM1LCAweEIyQzYsIDB4QjJDNywgMHhCMkNBLAotICAgIDB4QjJDQiwgMHhCMkNELCAweEIyQ0UsIDB4QjJDRiwgMHhCMkQxLCAweEIyRDMsIDB4QjJENCwgMHhCMkQ1LAotICAgIDB4QjJENiwgMHhCMkQ3LCAweEIyREEsIDB4QjJEQywgMHhCMkRFLCAweEIyREYsIDB4QjJFMCwgMHhCMkUxLAotICAgIDB4QjJFMywgMHhCMkU3LCAweEIyRTksIDB4QjJFQSwgMHhCMkYwLCAweEIyRjEsIDB4QjJGMiwgMHhCMkY2LAotICAgIDB4QjJGQywgMHhCMkZELCAweEIyRkUsIDB4QjMwMiwgMHhCMzAzLCAweEIzMDUsIDB4QjMwNiwgMHhCMzA3LAotICAgIDB4QjMwOSwgMHhCMzBBLCAweEIzMEIsIDB4QjMwQywgMHhCMzBELCAweEIzMEUsIDB4QjMwRiwgMHhCMzEyLAotICAgIDB4QjMxNiwgMHhCMzE3LCAweEIzMTgsIDB4QjMxOSwgMHhCMzFBLCAweEIzMUIsIDB4QjMxRCwgMHhCMzFFLAotICAgIDB4QjMxRiwgMHhCMzIwLCAweEIzMjEsIDB4QjMyMiwgMHhCMzIzLCAweEIzMjQsIDB4QjMyNSwgMHhCMzI2LAotICAgIDB4QjMyNywgMHhCMzI4LCAweEIzMjksIDB4QjMyQSwgMHhCMzJCLCAweEIzMkMsIDB4QjMyRCwgMHhCMzJFLAotICAgIDB4QjMyRiwgMHhCMzMwLCAweEIzMzEsIDB4QjMzMiwgMHhCMzMzLCAweEIzMzQsIDB4QjMzNSwgMHhCMzM2LAotICAgIDB4QjMzNywgMHhCMzM4LCAweEIzMzksIDB4QjMzQSwgMHhCMzNCLCAweEIzM0MsIDB4QjMzRCwgMHhCMzNFLAotICAgIDB4QjMzRiwgMHhCMzQwLCAweEIzNDEsIDB4QjM0MiwgMHhCMzQzLCAweEIzNDQsIDB4QjM0NSwgMHhCMzQ2LAotICAgIDB4QjM0NywgMHhCMzQ4LCAweEIzNDksIDB4QjM0QSwgMHhCMzRCLCAweEIzNEMsIDB4QjM0RCwgMHhCMzRFLAotICAgIDB4QjM0RiwgMHhCMzUwLCAweEIzNTEsIDB4QjM1MiwgMHhCMzUzLCAweEIzNTcsIDB4QjM1OSwgMHhCMzVBLAotICAgIDB4QjM1RCwgMHhCMzYwLCAweEIzNjEsIDB4QjM2MiwgMHhCMzYzLCAweEIzNjYsIDB4QjM2OCwgMHhCMzZBLAotICAgIDB4QjM2QywgMHhCMzZELCAweEIzNkYsIDB4QjM3MiwgMHhCMzczLCAweEIzNzUsIDB4QjM3NiwgMHhCMzc3LAotICAgIDB4QjM3OSwgMHhCMzdBLCAweEIzN0IsIDB4QjM3QywgMHhCMzdELCAweEIzN0UsIDB4QjM3RiwgMHhCMzgyLAotICAgIDB4QjM4NiwgMHhCMzg3LCAweEIzODgsIDB4QjM4OSwgMHhCMzhBLCAweEIzOEIsIDB4QjM4RCwgMHhCMzhFLAotICAgIDB4QjM4RiwgMHhCMzkxLCAweEIzOTIsIDB4QjM5MywgMHhCMzk1LCAweEIzOTYsIDB4QjM5NywgMHhCMzk4LAotICAgIDB4QjM5OSwgMHhCMzlBLCAweEIzOUIsIDB4QjM5QywgMHhCMzlELCAweEIzOUUsIDB4QjM5RiwgMHhCM0EyLAotICAgIDB4QjNBMywgMHhCM0E0LCAweEIzQTUsIDB4QjNBNiwgMHhCM0E3LCAweEIzQTksIDB4QjNBQSwgMHhCM0FCLAotICAgIDB4QjNBRCwgMHhCM0FFLCAweEIzQUYsIDB4QjNCMCwgMHhCM0IxLCAweEIzQjIsIDB4QjNCMywgMHhCM0I0LAotICAgIDB4QjNCNSwgMHhCM0I2LCAweEIzQjcsIDB4QjNCOCwgMHhCM0I5LCAweEIzQkEsIDB4QjNCQiwgMHhCM0JDLAotICAgIDB4QjNCRCwgMHhCM0JFLCAweEIzQkYsIDB4QjNDMCwgMHhCM0MxLCAweEIzQzIsIDB4QjNDMywgMHhCM0M2LAotICAgIDB4QjNDNywgMHhCM0M5LCAweEIzQ0EsIDB4QjNDRCwgMHhCM0NGLCAweEIzRDEsIDB4QjNEMiwgMHhCM0QzLAotICAgIDB4QjNENiwgMHhCM0Q4LCAweEIzREEsIDB4QjNEQywgMHhCM0RFLCAweEIzREYsIDB4QjNFMSwgMHhCM0UyLAotICAgIDB4QjNFMywgMHhCM0U1LCAweEIzRTYsIDB4QjNFNywgMHhCM0U5LCAweEIzRUEsIDB4QjNFQiwgMHhCM0VDLAotICAgIDB4QjNFRCwgMHhCM0VFLCAweEIzRUYsIDB4QjNGMCwgMHhCM0YxLCAweEIzRjIsIDB4QjNGMywgMHhCM0Y0LAotICAgIDB4QjNGNSwgMHhCM0Y2LCAweEIzRjcsIDB4QjNGOCwgMHhCM0Y5LCAweEIzRkEsIDB4QjNGQiwgMHhCM0ZELAotICAgIDB4QjNGRSwgMHhCM0ZGLCAweEI0MDAsIDB4QjQwMSwgMHhCNDAyLCAweEI0MDMsIDB4QjQwNCwgMHhCNDA1LAotICAgIDB4QjQwNiwgMHhCNDA3LCAweEI0MDgsIDB4QjQwOSwgMHhCNDBBLCAweEI0MEIsIDB4QjQwQywgMHhCNDBELAotICAgIDB4QjQwRSwgMHhCNDBGLCAweEI0MTEsIDB4QjQxMiwgMHhCNDEzLCAweEI0MTQsIDB4QjQxNSwgMHhCNDE2LAotICAgIDB4QjQxNywgMHhCNDE5LCAweEI0MUEsIDB4QjQxQiwgMHhCNDFELCAweEI0MUUsIDB4QjQxRiwgMHhCNDIxLAotICAgIDB4QjQyMiwgMHhCNDIzLCAweEI0MjQsIDB4QjQyNSwgMHhCNDI2LCAweEI0MjcsIDB4QjQyQSwgMHhCNDJDLAotICAgIDB4QjQyRCwgMHhCNDJFLCAweEI0MkYsIDB4QjQzMCwgMHhCNDMxLCAweEI0MzIsIDB4QjQzMywgMHhCNDM1LAotICAgIDB4QjQzNiwgMHhCNDM3LCAweEI0MzgsIDB4QjQzOSwgMHhCNDNBLCAweEI0M0IsIDB4QjQzQywgMHhCNDNELAotICAgIDB4QjQzRSwgMHhCNDNGLCAweEI0NDAsIDB4QjQ0MSwgMHhCNDQyLCAweEI0NDMsIDB4QjQ0NCwgMHhCNDQ1LAotICAgIDB4QjQ0NiwgMHhCNDQ3LCAweEI0NDgsIDB4QjQ0OSwgMHhCNDRBLCAweEI0NEIsIDB4QjQ0QywgMHhCNDRELAotICAgIDB4QjQ0RSwgMHhCNDRGLCAweEI0NTIsIDB4QjQ1MywgMHhCNDU1LCAweEI0NTYsIDB4QjQ1NywgMHhCNDU5LAotICAgIDB4QjQ1QSwgMHhCNDVCLCAweEI0NUMsIDB4QjQ1RCwgMHhCNDVFLCAweEI0NUYsIDB4QjQ2MiwgMHhCNDY0LAotICAgIDB4QjQ2NiwgMHhCNDY3LCAweEI0NjgsIDB4QjQ2OSwgMHhCNDZBLCAweEI0NkIsIDB4QjQ2RCwgMHhCNDZFLAotICAgIDB4QjQ2RiwgMHhCNDcwLCAweEI0NzEsIDB4QjQ3MiwgMHhCNDczLCAweEI0NzQsIDB4QjQ3NSwgMHhCNDc2LAotICAgIDB4QjQ3NywgMHhCNDc4LCAweEI0NzksIDB4QjQ3QSwgMHhCNDdCLCAweEI0N0MsIDB4QjQ3RCwgMHhCNDdFLAotICAgIDB4QjQ3RiwgMHhCNDgxLCAweEI0ODIsIDB4QjQ4MywgMHhCNDg0LCAweEI0ODUsIDB4QjQ4NiwgMHhCNDg3LAotICAgIDB4QjQ4OSwgMHhCNDhBLCAweEI0OEIsIDB4QjQ4QywgMHhCNDhELCAweEI0OEUsIDB4QjQ4RiwgMHhCNDkwLAotICAgIDB4QjQ5MSwgMHhCNDkyLCAweEI0OTMsIDB4QjQ5NCwgMHhCNDk1LCAweEI0OTYsIDB4QjQ5NywgMHhCNDk4LAotICAgIDB4QjQ5OSwgMHhCNDlBLCAweEI0OUIsIDB4QjQ5QywgMHhCNDlFLCAweEI0OUYsIDB4QjRBMCwgMHhCNEExLAotICAgIDB4QjRBMiwgMHhCNEEzLCAweEI0QTUsIDB4QjRBNiwgMHhCNEE3LCAweEI0QTksIDB4QjRBQSwgMHhCNEFCLAotICAgIDB4QjRBRCwgMHhCNEFFLCAweEI0QUYsIDB4QjRCMCwgMHhCNEIxLCAweEI0QjIsIDB4QjRCMywgMHhCNEI0LAotICAgIDB4QjRCNiwgMHhCNEI4LCAweEI0QkEsIDB4QjRCQiwgMHhCNEJDLCAweEI0QkQsIDB4QjRCRSwgMHhCNEJGLAotICAgIDB4QjRDMSwgMHhCNEMyLCAweEI0QzMsIDB4QjRDNSwgMHhCNEM2LCAweEI0QzcsIDB4QjRDOSwgMHhCNENBLAotICAgIDB4QjRDQiwgMHhCNENDLCAweEI0Q0QsIDB4QjRDRSwgMHhCNENGLCAweEI0RDEsIDB4QjREMiwgMHhCNEQzLAotICAgIDB4QjRENCwgMHhCNEQ2LCAweEI0RDcsIDB4QjREOCwgMHhCNEQ5LCAweEI0REEsIDB4QjREQiwgMHhCNERFLAotICAgIDB4QjRERiwgMHhCNEUxLCAweEI0RTIsIDB4QjRFNSwgMHhCNEU3LCAweEI0RTgsIDB4QjRFOSwgMHhCNEVBLAotICAgIDB4QjRFQiwgMHhCNEVFLCAweEI0RjAsIDB4QjRGMiwgMHhCNEYzLCAweEI0RjQsIDB4QjRGNSwgMHhCNEY2LAotICAgIDB4QjRGNywgMHhCNEY5LCAweEI0RkEsIDB4QjRGQiwgMHhCNEZDLCAweEI0RkQsIDB4QjRGRSwgMHhCNEZGLAotICAgIDB4QjUwMCwgMHhCNTAxLCAweEI1MDIsIDB4QjUwMywgMHhCNTA0LCAweEI1MDUsIDB4QjUwNiwgMHhCNTA3LAotICAgIDB4QjUwOCwgMHhCNTA5LCAweEI1MEEsIDB4QjUwQiwgMHhCNTBDLCAweEI1MEQsIDB4QjUwRSwgMHhCNTBGLAotICAgIDB4QjUxMCwgMHhCNTExLCAweEI1MTIsIDB4QjUxMywgMHhCNTE2LCAweEI1MTcsIDB4QjUxOSwgMHhCNTFBLAotICAgIDB4QjUxRCwgMHhCNTFFLCAweEI1MUYsIDB4QjUyMCwgMHhCNTIxLCAweEI1MjIsIDB4QjUyMywgMHhCNTI2LAotICAgIDB4QjUyQiwgMHhCNTJDLCAweEI1MkQsIDB4QjUyRSwgMHhCNTJGLCAweEI1MzIsIDB4QjUzMywgMHhCNTM1LAotICAgIDB4QjUzNiwgMHhCNTM3LCAweEI1MzksIDB4QjUzQSwgMHhCNTNCLCAweEI1M0MsIDB4QjUzRCwgMHhCNTNFLAotICAgIDB4QjUzRiwgMHhCNTQyLCAweEI1NDYsIDB4QjU0NywgMHhCNTQ4LCAweEI1NDksIDB4QjU0QSwgMHhCNTRFLAotICAgIDB4QjU0RiwgMHhCNTUxLCAweEI1NTIsIDB4QjU1MywgMHhCNTU1LCAweEI1NTYsIDB4QjU1NywgMHhCNTU4LAotICAgIDB4QjU1OSwgMHhCNTVBLCAweEI1NUIsIDB4QjU1RSwgMHhCNTYyLCAweEI1NjMsIDB4QjU2NCwgMHhCNTY1LAotICAgIDB4QjU2NiwgMHhCNTY3LCAweEI1NjgsIDB4QjU2OSwgMHhCNTZBLCAweEI1NkIsIDB4QjU2QywgMHhCNTZELAotICAgIDB4QjU2RSwgMHhCNTZGLCAweEI1NzAsIDB4QjU3MSwgMHhCNTcyLCAweEI1NzMsIDB4QjU3NCwgMHhCNTc1LAotICAgIDB4QjU3NiwgMHhCNTc3LCAweEI1NzgsIDB4QjU3OSwgMHhCNTdBLCAweEI1N0IsIDB4QjU3QywgMHhCNTdELAotICAgIDB4QjU3RSwgMHhCNTdGLCAweEI1ODAsIDB4QjU4MSwgMHhCNTgyLCAweEI1ODMsIDB4QjU4NCwgMHhCNTg1LAotICAgIDB4QjU4NiwgMHhCNTg3LCAweEI1ODgsIDB4QjU4OSwgMHhCNThBLCAweEI1OEIsIDB4QjU4QywgMHhCNThELAotICAgIDB4QjU4RSwgMHhCNThGLCAweEI1OTAsIDB4QjU5MSwgMHhCNTkyLCAweEI1OTMsIDB4QjU5NCwgMHhCNTk1LAotICAgIDB4QjU5NiwgMHhCNTk3LCAweEI1OTgsIDB4QjU5OSwgMHhCNTlBLCAweEI1OUIsIDB4QjU5QywgMHhCNTlELAotICAgIDB4QjU5RSwgMHhCNTlGLCAweEI1QTIsIDB4QjVBMywgMHhCNUE1LCAweEI1QTYsIDB4QjVBNywgMHhCNUE5LAotICAgIDB4QjVBQywgMHhCNUFELCAweEI1QUUsIDB4QjVBRiwgMHhCNUIyLCAweEI1QjYsIDB4QjVCNywgMHhCNUI4LAotICAgIDB4QjVCOSwgMHhCNUJBLCAweEI1QkUsIDB4QjVCRiwgMHhCNUMxLCAweEI1QzIsIDB4QjVDMywgMHhCNUM1LAotICAgIDB4QjVDNiwgMHhCNUM3LCAweEI1QzgsIDB4QjVDOSwgMHhCNUNBLCAweEI1Q0IsIDB4QjVDRSwgMHhCNUQyLAotICAgIDB4QjVEMywgMHhCNUQ0LCAweEI1RDUsIDB4QjVENiwgMHhCNUQ3LCAweEI1RDksIDB4QjVEQSwgMHhCNURCLAotICAgIDB4QjVEQywgMHhCNURELCAweEI1REUsIDB4QjVERiwgMHhCNUUwLCAweEI1RTEsIDB4QjVFMiwgMHhCNUUzLAotICAgIDB4QjVFNCwgMHhCNUU1LCAweEI1RTYsIDB4QjVFNywgMHhCNUU4LCAweEI1RTksIDB4QjVFQSwgMHhCNUVCLAotICAgIDB4QjVFRCwgMHhCNUVFLCAweEI1RUYsIDB4QjVGMCwgMHhCNUYxLCAweEI1RjIsIDB4QjVGMywgMHhCNUY0LAotICAgIDB4QjVGNSwgMHhCNUY2LCAweEI1RjcsIDB4QjVGOCwgMHhCNUY5LCAweEI1RkEsIDB4QjVGQiwgMHhCNUZDLAotICAgIDB4QjVGRCwgMHhCNUZFLCAweEI1RkYsIDB4QjYwMCwgMHhCNjAxLCAweEI2MDIsIDB4QjYwMywgMHhCNjA0LAotICAgIDB4QjYwNSwgMHhCNjA2LCAweEI2MDcsIDB4QjYwOCwgMHhCNjA5LCAweEI2MEEsIDB4QjYwQiwgMHhCNjBDLAotICAgIDB4QjYwRCwgMHhCNjBFLCAweEI2MEYsIDB4QjYxMiwgMHhCNjEzLCAweEI2MTUsIDB4QjYxNiwgMHhCNjE3LAotICAgIDB4QjYxOSwgMHhCNjFBLCAweEI2MUIsIDB4QjYxQywgMHhCNjFELCAweEI2MUUsIDB4QjYxRiwgMHhCNjIwLAotICAgIDB4QjYyMSwgMHhCNjIyLCAweEI2MjMsIDB4QjYyNCwgMHhCNjI2LCAweEI2MjcsIDB4QjYyOCwgMHhCNjI5LAotICAgIDB4QjYyQSwgMHhCNjJCLCAweEI2MkQsIDB4QjYyRSwgMHhCNjJGLCAweEI2MzAsIDB4QjYzMSwgMHhCNjMyLAotICAgIDB4QjYzMywgMHhCNjM1LCAweEI2MzYsIDB4QjYzNywgMHhCNjM4LCAweEI2MzksIDB4QjYzQSwgMHhCNjNCLAotICAgIDB4QjYzQywgMHhCNjNELCAweEI2M0UsIDB4QjYzRiwgMHhCNjQwLCAweEI2NDEsIDB4QjY0MiwgMHhCNjQzLAotICAgIDB4QjY0NCwgMHhCNjQ1LCAweEI2NDYsIDB4QjY0NywgMHhCNjQ5LCAweEI2NEEsIDB4QjY0QiwgMHhCNjRDLAotICAgIDB4QjY0RCwgMHhCNjRFLCAweEI2NEYsIDB4QjY1MCwgMHhCNjUxLCAweEI2NTIsIDB4QjY1MywgMHhCNjU0LAotICAgIDB4QjY1NSwgMHhCNjU2LCAweEI2NTcsIDB4QjY1OCwgMHhCNjU5LCAweEI2NUEsIDB4QjY1QiwgMHhCNjVDLAotICAgIDB4QjY1RCwgMHhCNjVFLCAweEI2NUYsIDB4QjY2MCwgMHhCNjYxLCAweEI2NjIsIDB4QjY2MywgMHhCNjY1LAotICAgIDB4QjY2NiwgMHhCNjY3LCAweEI2NjksIDB4QjY2QSwgMHhCNjZCLCAweEI2NkMsIDB4QjY2RCwgMHhCNjZFLAotICAgIDB4QjY2RiwgMHhCNjcwLCAweEI2NzEsIDB4QjY3MiwgMHhCNjczLCAweEI2NzQsIDB4QjY3NSwgMHhCNjc2LAotICAgIDB4QjY3NywgMHhCNjc4LCAweEI2NzksIDB4QjY3QSwgMHhCNjdCLCAweEI2N0MsIDB4QjY3RCwgMHhCNjdFLAotICAgIDB4QjY3RiwgMHhCNjgwLCAweEI2ODEsIDB4QjY4MiwgMHhCNjgzLCAweEI2ODQsIDB4QjY4NSwgMHhCNjg2LAotICAgIDB4QjY4NywgMHhCNjg4LCAweEI2ODksIDB4QjY4QSwgMHhCNjhCLCAweEI2OEMsIDB4QjY4RCwgMHhCNjhFLAotICAgIDB4QjY4RiwgMHhCNjkwLCAweEI2OTEsIDB4QjY5MiwgMHhCNjkzLCAweEI2OTQsIDB4QjY5NSwgMHhCNjk2LAotICAgIDB4QjY5NywgMHhCNjk4LCAweEI2OTksIDB4QjY5QSwgMHhCNjlCLCAweEI2OUUsIDB4QjY5RiwgMHhCNkExLAotICAgIDB4QjZBMiwgMHhCNkEzLCAweEI2QTUsIDB4QjZBNiwgMHhCNkE3LCAweEI2QTgsIDB4QjZBOSwgMHhCNkFBLAotICAgIDB4QjZBRCwgMHhCNkFFLCAweEI2QUYsIDB4QjZCMCwgMHhCNkIyLCAweEI2QjMsIDB4QjZCNCwgMHhCNkI1LAotICAgIDB4QjZCNiwgMHhCNkI3LCAweEI2QjgsIDB4QjZCOSwgMHhCNkJBLCAweEI2QkIsIDB4QjZCQywgMHhCNkJELAotICAgIDB4QjZCRSwgMHhCNkJGLCAweEI2QzAsIDB4QjZDMSwgMHhCNkMyLCAweEI2QzMsIDB4QjZDNCwgMHhCNkM1LAotICAgIDB4QjZDNiwgMHhCNkM3LCAweEI2QzgsIDB4QjZDOSwgMHhCNkNBLCAweEI2Q0IsIDB4QjZDQywgMHhCNkNELAotICAgIDB4QjZDRSwgMHhCNkNGLCAweEI2RDAsIDB4QjZEMSwgMHhCNkQyLCAweEI2RDMsIDB4QjZENSwgMHhCNkQ2LAotICAgIDB4QjZENywgMHhCNkQ4LCAweEI2RDksIDB4QjZEQSwgMHhCNkRCLCAweEI2REMsIDB4QjZERCwgMHhCNkRFLAotICAgIDB4QjZERiwgMHhCNkUwLCAweEI2RTEsIDB4QjZFMiwgMHhCNkUzLCAweEI2RTQsIDB4QjZFNSwgMHhCNkU2LAotICAgIDB4QjZFNywgMHhCNkU4LCAweEI2RTksIDB4QjZFQSwgMHhCNkVCLCAweEI2RUMsIDB4QjZFRCwgMHhCNkVFLAotICAgIDB4QjZFRiwgMHhCNkYxLCAweEI2RjIsIDB4QjZGMywgMHhCNkY1LCAweEI2RjYsIDB4QjZGNywgMHhCNkY5LAotICAgIDB4QjZGQSwgMHhCNkZCLCAweEI2RkMsIDB4QjZGRCwgMHhCNkZFLCAweEI2RkYsIDB4QjcwMiwgMHhCNzAzLAotICAgIDB4QjcwNCwgMHhCNzA2LCAweEI3MDcsIDB4QjcwOCwgMHhCNzA5LCAweEI3MEEsIDB4QjcwQiwgMHhCNzBDLAotICAgIDB4QjcwRCwgMHhCNzBFLCAweEI3MEYsIDB4QjcxMCwgMHhCNzExLCAweEI3MTIsIDB4QjcxMywgMHhCNzE0LAotICAgIDB4QjcxNSwgMHhCNzE2LCAweEI3MTcsIDB4QjcxOCwgMHhCNzE5LCAweEI3MUEsIDB4QjcxQiwgMHhCNzFDLAotICAgIDB4QjcxRCwgMHhCNzFFLCAweEI3MUYsIDB4QjcyMCwgMHhCNzIxLCAweEI3MjIsIDB4QjcyMywgMHhCNzI0LAotICAgIDB4QjcyNSwgMHhCNzI2LCAweEI3MjcsIDB4QjcyQSwgMHhCNzJCLCAweEI3MkQsIDB4QjcyRSwgMHhCNzMxLAotICAgIDB4QjczMiwgMHhCNzMzLCAweEI3MzQsIDB4QjczNSwgMHhCNzM2LCAweEI3MzcsIDB4QjczQSwgMHhCNzNDLAotICAgIDB4QjczRCwgMHhCNzNFLCAweEI3M0YsIDB4Qjc0MCwgMHhCNzQxLCAweEI3NDIsIDB4Qjc0MywgMHhCNzQ1LAotICAgIDB4Qjc0NiwgMHhCNzQ3LCAweEI3NDksIDB4Qjc0QSwgMHhCNzRCLCAweEI3NEQsIDB4Qjc0RSwgMHhCNzRGLAotICAgIDB4Qjc1MCwgMHhCNzUxLCAweEI3NTIsIDB4Qjc1MywgMHhCNzU2LCAweEI3NTcsIDB4Qjc1OCwgMHhCNzU5LAotICAgIDB4Qjc1QSwgMHhCNzVCLCAweEI3NUMsIDB4Qjc1RCwgMHhCNzVFLCAweEI3NUYsIDB4Qjc2MSwgMHhCNzYyLAotICAgIDB4Qjc2MywgMHhCNzY1LCAweEI3NjYsIDB4Qjc2NywgMHhCNzY5LCAweEI3NkEsIDB4Qjc2QiwgMHhCNzZDLAotICAgIDB4Qjc2RCwgMHhCNzZFLCAweEI3NkYsIDB4Qjc3MiwgMHhCNzc0LCAweEI3NzYsIDB4Qjc3NywgMHhCNzc4LAotICAgIDB4Qjc3OSwgMHhCNzdBLCAweEI3N0IsIDB4Qjc3RSwgMHhCNzdGLCAweEI3ODEsIDB4Qjc4MiwgMHhCNzgzLAotICAgIDB4Qjc4NSwgMHhCNzg2LCAweEI3ODcsIDB4Qjc4OCwgMHhCNzg5LCAweEI3OEEsIDB4Qjc4QiwgMHhCNzhFLAotICAgIDB4Qjc5MywgMHhCNzk0LCAweEI3OTUsIDB4Qjc5QSwgMHhCNzlCLCAweEI3OUQsIDB4Qjc5RSwgMHhCNzlGLAotICAgIDB4QjdBMSwgMHhCN0EyLCAweEI3QTMsIDB4QjdBNCwgMHhCN0E1LCAweEI3QTYsIDB4QjdBNywgMHhCN0FBLAotICAgIDB4QjdBRSwgMHhCN0FGLCAweEI3QjAsIDB4QjdCMSwgMHhCN0IyLCAweEI3QjMsIDB4QjdCNiwgMHhCN0I3LAotICAgIDB4QjdCOSwgMHhCN0JBLCAweEI3QkIsIDB4QjdCQywgMHhCN0JELCAweEI3QkUsIDB4QjdCRiwgMHhCN0MwLAotICAgIDB4QjdDMSwgMHhCN0MyLCAweEI3QzMsIDB4QjdDNCwgMHhCN0M1LCAweEI3QzYsIDB4QjdDOCwgMHhCN0NBLAotICAgIDB4QjdDQiwgMHhCN0NDLCAweEI3Q0QsIDB4QjdDRSwgMHhCN0NGLCAweEI3RDAsIDB4QjdEMSwgMHhCN0QyLAotICAgIDB4QjdEMywgMHhCN0Q0LCAweEI3RDUsIDB4QjdENiwgMHhCN0Q3LCAweEI3RDgsIDB4QjdEOSwgMHhCN0RBLAotICAgIDB4QjdEQiwgMHhCN0RDLCAweEI3REQsIDB4QjdERSwgMHhCN0RGLCAweEI3RTAsIDB4QjdFMSwgMHhCN0UyLAotICAgIDB4QjdFMywgMHhCN0U0LCAweEI3RTUsIDB4QjdFNiwgMHhCN0U3LCAweEI3RTgsIDB4QjdFOSwgMHhCN0VBLAotICAgIDB4QjdFQiwgMHhCN0VFLCAweEI3RUYsIDB4QjdGMSwgMHhCN0YyLCAweEI3RjMsIDB4QjdGNSwgMHhCN0Y2LAotICAgIDB4QjdGNywgMHhCN0Y4LCAweEI3RjksIDB4QjdGQSwgMHhCN0ZCLCAweEI3RkUsIDB4QjgwMiwgMHhCODAzLAotICAgIDB4QjgwNCwgMHhCODA1LCAweEI4MDYsIDB4QjgwQSwgMHhCODBCLCAweEI4MEQsIDB4QjgwRSwgMHhCODBGLAotICAgIDB4QjgxMSwgMHhCODEyLCAweEI4MTMsIDB4QjgxNCwgMHhCODE1LCAweEI4MTYsIDB4QjgxNywgMHhCODFBLAotICAgIDB4QjgxQywgMHhCODFFLCAweEI4MUYsIDB4QjgyMCwgMHhCODIxLCAweEI4MjIsIDB4QjgyMywgMHhCODI2LAotICAgIDB4QjgyNywgMHhCODI5LCAweEI4MkEsIDB4QjgyQiwgMHhCODJELCAweEI4MkUsIDB4QjgyRiwgMHhCODMwLAotICAgIDB4QjgzMSwgMHhCODMyLCAweEI4MzMsIDB4QjgzNiwgMHhCODNBLCAweEI4M0IsIDB4QjgzQywgMHhCODNELAotICAgIDB4QjgzRSwgMHhCODNGLCAweEI4NDEsIDB4Qjg0MiwgMHhCODQzLCAweEI4NDUsIDB4Qjg0NiwgMHhCODQ3LAotICAgIDB4Qjg0OCwgMHhCODQ5LCAweEI4NEEsIDB4Qjg0QiwgMHhCODRDLCAweEI4NEQsIDB4Qjg0RSwgMHhCODRGLAotICAgIDB4Qjg1MCwgMHhCODUyLCAweEI4NTQsIDB4Qjg1NSwgMHhCODU2LCAweEI4NTcsIDB4Qjg1OCwgMHhCODU5LAotICAgIDB4Qjg1QSwgMHhCODVCLCAweEI4NUUsIDB4Qjg1RiwgMHhCODYxLCAweEI4NjIsIDB4Qjg2MywgMHhCODY1LAotICAgIDB4Qjg2NiwgMHhCODY3LCAweEI4NjgsIDB4Qjg2OSwgMHhCODZBLCAweEI4NkIsIDB4Qjg2RSwgMHhCODcwLAotICAgIDB4Qjg3MiwgMHhCODczLCAweEI4NzQsIDB4Qjg3NSwgMHhCODc2LCAweEI4NzcsIDB4Qjg3OSwgMHhCODdBLAotICAgIDB4Qjg3QiwgMHhCODdELCAweEI4N0UsIDB4Qjg3RiwgMHhCODgwLCAweEI4ODEsIDB4Qjg4MiwgMHhCODgzLAotICAgIDB4Qjg4NCwgMHhCODg1LCAweEI4ODYsIDB4Qjg4NywgMHhCODg4LCAweEI4ODksIDB4Qjg4QSwgMHhCODhCLAotICAgIDB4Qjg4QywgMHhCODhFLCAweEI4OEYsIDB4Qjg5MCwgMHhCODkxLCAweEI4OTIsIDB4Qjg5MywgMHhCODk0LAotICAgIDB4Qjg5NSwgMHhCODk2LCAweEI4OTcsIDB4Qjg5OCwgMHhCODk5LCAweEI4OUEsIDB4Qjg5QiwgMHhCODlDLAotICAgIDB4Qjg5RCwgMHhCODlFLCAweEI4OUYsIDB4QjhBMCwgMHhCOEExLCAweEI4QTIsIDB4QjhBMywgMHhCOEE0LAotICAgIDB4QjhBNSwgMHhCOEE2LCAweEI4QTcsIDB4QjhBOSwgMHhCOEFBLCAweEI4QUIsIDB4QjhBQywgMHhCOEFELAotICAgIDB4QjhBRSwgMHhCOEFGLCAweEI4QjEsIDB4QjhCMiwgMHhCOEIzLCAweEI4QjUsIDB4QjhCNiwgMHhCOEI3LAotICAgIDB4QjhCOSwgMHhCOEJBLCAweEI4QkIsIDB4QjhCQywgMHhCOEJELCAweEI4QkUsIDB4QjhCRiwgMHhCOEMyLAotICAgIDB4QjhDNCwgMHhCOEM2LCAweEI4QzcsIDB4QjhDOCwgMHhCOEM5LCAweEI4Q0EsIDB4QjhDQiwgMHhCOENELAotICAgIDB4QjhDRSwgMHhCOENGLCAweEI4RDEsIDB4QjhEMiwgMHhCOEQzLCAweEI4RDUsIDB4QjhENiwgMHhCOEQ3LAotICAgIDB4QjhEOCwgMHhCOEQ5LCAweEI4REEsIDB4QjhEQiwgMHhCOERDLCAweEI4REUsIDB4QjhFMCwgMHhCOEUyLAotICAgIDB4QjhFMywgMHhCOEU0LCAweEI4RTUsIDB4QjhFNiwgMHhCOEU3LCAweEI4RUEsIDB4QjhFQiwgMHhCOEVELAotICAgIDB4QjhFRSwgMHhCOEVGLCAweEI4RjEsIDB4QjhGMiwgMHhCOEYzLCAweEI4RjQsIDB4QjhGNSwgMHhCOEY2LAotICAgIDB4QjhGNywgMHhCOEZBLCAweEI4RkMsIDB4QjhGRSwgMHhCOEZGLCAweEI5MDAsIDB4QjkwMSwgMHhCOTAyLAotICAgIDB4QjkwMywgMHhCOTA1LCAweEI5MDYsIDB4QjkwNywgMHhCOTA4LCAweEI5MDksIDB4QjkwQSwgMHhCOTBCLAotICAgIDB4QjkwQywgMHhCOTBELCAweEI5MEUsIDB4QjkwRiwgMHhCOTEwLCAweEI5MTEsIDB4QjkxMiwgMHhCOTEzLAotICAgIDB4QjkxNCwgMHhCOTE1LCAweEI5MTYsIDB4QjkxNywgMHhCOTE5LCAweEI5MUEsIDB4QjkxQiwgMHhCOTFDLAotICAgIDB4QjkxRCwgMHhCOTFFLCAweEI5MUYsIDB4QjkyMSwgMHhCOTIyLCAweEI5MjMsIDB4QjkyNCwgMHhCOTI1LAotICAgIDB4QjkyNiwgMHhCOTI3LCAweEI5MjgsIDB4QjkyOSwgMHhCOTJBLCAweEI5MkIsIDB4QjkyQywgMHhCOTJELAotICAgIDB4QjkyRSwgMHhCOTJGLCAweEI5MzAsIDB4QjkzMSwgMHhCOTMyLCAweEI5MzMsIDB4QjkzNCwgMHhCOTM1LAotICAgIDB4QjkzNiwgMHhCOTM3LCAweEI5MzgsIDB4QjkzOSwgMHhCOTNBLCAweEI5M0IsIDB4QjkzRSwgMHhCOTNGLAotICAgIDB4Qjk0MSwgMHhCOTQyLCAweEI5NDMsIDB4Qjk0NSwgMHhCOTQ2LCAweEI5NDcsIDB4Qjk0OCwgMHhCOTQ5LAotICAgIDB4Qjk0QSwgMHhCOTRCLCAweEI5NEQsIDB4Qjk0RSwgMHhCOTUwLCAweEI5NTIsIDB4Qjk1MywgMHhCOTU0LAotICAgIDB4Qjk1NSwgMHhCOTU2LCAweEI5NTcsIDB4Qjk1QSwgMHhCOTVCLCAweEI5NUQsIDB4Qjk1RSwgMHhCOTVGLAotICAgIDB4Qjk2MSwgMHhCOTYyLCAweEI5NjMsIDB4Qjk2NCwgMHhCOTY1LCAweEI5NjYsIDB4Qjk2NywgMHhCOTZBLAotICAgIDB4Qjk2QywgMHhCOTZFLCAweEI5NkYsIDB4Qjk3MCwgMHhCOTcxLCAweEI5NzIsIDB4Qjk3MywgMHhCOTc2LAotICAgIDB4Qjk3NywgMHhCOTc5LCAweEI5N0EsIDB4Qjk3QiwgMHhCOTdELCAweEI5N0UsIDB4Qjk3RiwgMHhCOTgwLAotICAgIDB4Qjk4MSwgMHhCOTgyLCAweEI5ODMsIDB4Qjk4NiwgMHhCOTg4LCAweEI5OEIsIDB4Qjk4QywgMHhCOThGLAotICAgIDB4Qjk5MCwgMHhCOTkxLCAweEI5OTIsIDB4Qjk5MywgMHhCOTk0LCAweEI5OTUsIDB4Qjk5NiwgMHhCOTk3LAotICAgIDB4Qjk5OCwgMHhCOTk5LCAweEI5OUEsIDB4Qjk5QiwgMHhCOTlDLCAweEI5OUQsIDB4Qjk5RSwgMHhCOTlGLAotICAgIDB4QjlBMCwgMHhCOUExLCAweEI5QTIsIDB4QjlBMywgMHhCOUE0LCAweEI5QTUsIDB4QjlBNiwgMHhCOUE3LAotICAgIDB4QjlBOCwgMHhCOUE5LCAweEI5QUEsIDB4QjlBQiwgMHhCOUFFLCAweEI5QUYsIDB4QjlCMSwgMHhCOUIyLAotICAgIDB4QjlCMywgMHhCOUI1LCAweEI5QjYsIDB4QjlCNywgMHhCOUI4LCAweEI5QjksIDB4QjlCQSwgMHhCOUJCLAotICAgIDB4QjlCRSwgMHhCOUMwLCAweEI5QzIsIDB4QjlDMywgMHhCOUM0LCAweEI5QzUsIDB4QjlDNiwgMHhCOUM3LAotICAgIDB4QjlDQSwgMHhCOUNCLCAweEI5Q0QsIDB4QjlEMywgMHhCOUQ0LCAweEI5RDUsIDB4QjlENiwgMHhCOUQ3LAotICAgIDB4QjlEQSwgMHhCOURDLCAweEI5REYsIDB4QjlFMCwgMHhCOUUyLCAweEI5RTYsIDB4QjlFNywgMHhCOUU5LAotICAgIDB4QjlFQSwgMHhCOUVCLCAweEI5RUQsIDB4QjlFRSwgMHhCOUVGLCAweEI5RjAsIDB4QjlGMSwgMHhCOUYyLAotICAgIDB4QjlGMywgMHhCOUY2LCAweEI5RkIsIDB4QjlGQywgMHhCOUZELCAweEI5RkUsIDB4QjlGRiwgMHhCQTAyLAotICAgIDB4QkEwMywgMHhCQTA0LCAweEJBMDUsIDB4QkEwNiwgMHhCQTA3LCAweEJBMDksIDB4QkEwQSwgMHhCQTBCLAotICAgIDB4QkEwQywgMHhCQTBELCAweEJBMEUsIDB4QkEwRiwgMHhCQTEwLCAweEJBMTEsIDB4QkExMiwgMHhCQTEzLAotICAgIDB4QkExNCwgMHhCQTE2LCAweEJBMTcsIDB4QkExOCwgMHhCQTE5LCAweEJBMUEsIDB4QkExQiwgMHhCQTFDLAotICAgIDB4QkExRCwgMHhCQTFFLCAweEJBMUYsIDB4QkEyMCwgMHhCQTIxLCAweEJBMjIsIDB4QkEyMywgMHhCQTI0LAotICAgIDB4QkEyNSwgMHhCQTI2LCAweEJBMjcsIDB4QkEyOCwgMHhCQTI5LCAweEJBMkEsIDB4QkEyQiwgMHhCQTJDLAotICAgIDB4QkEyRCwgMHhCQTJFLCAweEJBMkYsIDB4QkEzMCwgMHhCQTMxLCAweEJBMzIsIDB4QkEzMywgMHhCQTM0LAotICAgIDB4QkEzNSwgMHhCQTM2LCAweEJBMzcsIDB4QkEzQSwgMHhCQTNCLCAweEJBM0QsIDB4QkEzRSwgMHhCQTNGLAotICAgIDB4QkE0MSwgMHhCQTQzLCAweEJBNDQsIDB4QkE0NSwgMHhCQTQ2LCAweEJBNDcsIDB4QkE0QSwgMHhCQTRDLAotICAgIDB4QkE0RiwgMHhCQTUwLCAweEJBNTEsIDB4QkE1MiwgMHhCQTU2LCAweEJBNTcsIDB4QkE1OSwgMHhCQTVBLAotICAgIDB4QkE1QiwgMHhCQTVELCAweEJBNUUsIDB4QkE1RiwgMHhCQTYwLCAweEJBNjEsIDB4QkE2MiwgMHhCQTYzLAotICAgIDB4QkE2NiwgMHhCQTZBLCAweEJBNkIsIDB4QkE2QywgMHhCQTZELCAweEJBNkUsIDB4QkE2RiwgMHhCQTcyLAotICAgIDB4QkE3MywgMHhCQTc1LCAweEJBNzYsIDB4QkE3NywgMHhCQTc5LCAweEJBN0EsIDB4QkE3QiwgMHhCQTdDLAotICAgIDB4QkE3RCwgMHhCQTdFLCAweEJBN0YsIDB4QkE4MCwgMHhCQTgxLCAweEJBODIsIDB4QkE4NiwgMHhCQTg4LAotICAgIDB4QkE4OSwgMHhCQThBLCAweEJBOEIsIDB4QkE4RCwgMHhCQThFLCAweEJBOEYsIDB4QkE5MCwgMHhCQTkxLAotICAgIDB4QkE5MiwgMHhCQTkzLCAweEJBOTQsIDB4QkE5NSwgMHhCQTk2LCAweEJBOTcsIDB4QkE5OCwgMHhCQTk5LAotICAgIDB4QkE5QSwgMHhCQTlCLCAweEJBOUMsIDB4QkE5RCwgMHhCQTlFLCAweEJBOUYsIDB4QkFBMCwgMHhCQUExLAotICAgIDB4QkFBMiwgMHhCQUEzLCAweEJBQTQsIDB4QkFBNSwgMHhCQUE2LCAweEJBQTcsIDB4QkFBQSwgMHhCQUFELAotICAgIDB4QkFBRSwgMHhCQUFGLCAweEJBQjEsIDB4QkFCMywgMHhCQUI0LCAweEJBQjUsIDB4QkFCNiwgMHhCQUI3LAotICAgIDB4QkFCQSwgMHhCQUJDLCAweEJBQkUsIDB4QkFCRiwgMHhCQUMwLCAweEJBQzEsIDB4QkFDMiwgMHhCQUMzLAotICAgIDB4QkFDNSwgMHhCQUM2LCAweEJBQzcsIDB4QkFDOSwgMHhCQUNBLCAweEJBQ0IsIDB4QkFDQywgMHhCQUNELAotICAgIDB4QkFDRSwgMHhCQUNGLCAweEJBRDAsIDB4QkFEMSwgMHhCQUQyLCAweEJBRDMsIDB4QkFENCwgMHhCQUQ1LAotICAgIDB4QkFENiwgMHhCQUQ3LCAweEJBREEsIDB4QkFEQiwgMHhCQURDLCAweEJBREQsIDB4QkFERSwgMHhCQURGLAotICAgIDB4QkFFMCwgMHhCQUUxLCAweEJBRTIsIDB4QkFFMywgMHhCQUU0LCAweEJBRTUsIDB4QkFFNiwgMHhCQUU3LAotICAgIDB4QkFFOCwgMHhCQUU5LCAweEJBRUEsIDB4QkFFQiwgMHhCQUVDLCAweEJBRUQsIDB4QkFFRSwgMHhCQUVGLAotICAgIDB4QkFGMCwgMHhCQUYxLCAweEJBRjIsIDB4QkFGMywgMHhCQUY0LCAweEJBRjUsIDB4QkFGNiwgMHhCQUY3LAotICAgIDB4QkFGOCwgMHhCQUY5LCAweEJBRkEsIDB4QkFGQiwgMHhCQUZELCAweEJBRkUsIDB4QkFGRiwgMHhCQjAxLAotICAgIDB4QkIwMiwgMHhCQjAzLCAweEJCMDUsIDB4QkIwNiwgMHhCQjA3LCAweEJCMDgsIDB4QkIwOSwgMHhCQjBBLAotICAgIDB4QkIwQiwgMHhCQjBDLCAweEJCMEUsIDB4QkIxMCwgMHhCQjEyLCAweEJCMTMsIDB4QkIxNCwgMHhCQjE1LAotICAgIDB4QkIxNiwgMHhCQjE3LCAweEJCMTksIDB4QkIxQSwgMHhCQjFCLCAweEJCMUQsIDB4QkIxRSwgMHhCQjFGLAotICAgIDB4QkIyMSwgMHhCQjIyLCAweEJCMjMsIDB4QkIyNCwgMHhCQjI1LCAweEJCMjYsIDB4QkIyNywgMHhCQjI4LAotICAgIDB4QkIyQSwgMHhCQjJDLCAweEJCMkQsIDB4QkIyRSwgMHhCQjJGLCAweEJCMzAsIDB4QkIzMSwgMHhCQjMyLAotICAgIDB4QkIzMywgMHhCQjM3LCAweEJCMzksIDB4QkIzQSwgMHhCQjNGLCAweEJCNDAsIDB4QkI0MSwgMHhCQjQyLAotICAgIDB4QkI0MywgMHhCQjQ2LCAweEJCNDgsIDB4QkI0QSwgMHhCQjRCLCAweEJCNEMsIDB4QkI0RSwgMHhCQjUxLAotICAgIDB4QkI1MiwgMHhCQjUzLCAweEJCNTUsIDB4QkI1NiwgMHhCQjU3LCAweEJCNTksIDB4QkI1QSwgMHhCQjVCLAotICAgIDB4QkI1QywgMHhCQjVELCAweEJCNUUsIDB4QkI1RiwgMHhCQjYwLCAweEJCNjIsIDB4QkI2NCwgMHhCQjY1LAotICAgIDB4QkI2NiwgMHhCQjY3LCAweEJCNjgsIDB4QkI2OSwgMHhCQjZBLCAweEJCNkIsIDB4QkI2RCwgMHhCQjZFLAotICAgIDB4QkI2RiwgMHhCQjcwLCAweEJCNzEsIDB4QkI3MiwgMHhCQjczLCAweEJCNzQsIDB4QkI3NSwgMHhCQjc2LAotICAgIDB4QkI3NywgMHhCQjc4LCAweEJCNzksIDB4QkI3QSwgMHhCQjdCLCAweEJCN0MsIDB4QkI3RCwgMHhCQjdFLAotICAgIDB4QkI3RiwgMHhCQjgwLCAweEJCODEsIDB4QkI4MiwgMHhCQjgzLCAweEJCODQsIDB4QkI4NSwgMHhCQjg2LAotICAgIDB4QkI4NywgMHhCQjg5LCAweEJCOEEsIDB4QkI4QiwgMHhCQjhELCAweEJCOEUsIDB4QkI4RiwgMHhCQjkxLAotICAgIDB4QkI5MiwgMHhCQjkzLCAweEJCOTQsIDB4QkI5NSwgMHhCQjk2LCAweEJCOTcsIDB4QkI5OCwgMHhCQjk5LAotICAgIDB4QkI5QSwgMHhCQjlCLCAweEJCOUMsIDB4QkI5RCwgMHhCQjlFLCAweEJCOUYsIDB4QkJBMCwgMHhCQkExLAotICAgIDB4QkJBMiwgMHhCQkEzLCAweEJCQTUsIDB4QkJBNiwgMHhCQkE3LCAweEJCQTksIDB4QkJBQSwgMHhCQkFCLAotICAgIDB4QkJBRCwgMHhCQkFFLCAweEJCQUYsIDB4QkJCMCwgMHhCQkIxLCAweEJCQjIsIDB4QkJCMywgMHhCQkI1LAotICAgIDB4QkJCNiwgMHhCQkI4LCAweEJCQjksIDB4QkJCQSwgMHhCQkJCLCAweEJCQkMsIDB4QkJCRCwgMHhCQkJFLAotICAgIDB4QkJCRiwgMHhCQkMxLCAweEJCQzIsIDB4QkJDMywgMHhCQkM1LCAweEJCQzYsIDB4QkJDNywgMHhCQkM5LAotICAgIDB4QkJDQSwgMHhCQkNCLCAweEJCQ0MsIDB4QkJDRCwgMHhCQkNFLCAweEJCQ0YsIDB4QkJEMSwgMHhCQkQyLAotICAgIDB4QkJENCwgMHhCQkQ1LCAweEJCRDYsIDB4QkJENywgMHhCQkQ4LCAweEJCRDksIDB4QkJEQSwgMHhCQkRCLAotICAgIDB4QkJEQywgMHhCQkRELCAweEJCREUsIDB4QkJERiwgMHhCQkUwLCAweEJCRTEsIDB4QkJFMiwgMHhCQkUzLAotICAgIDB4QkJFNCwgMHhCQkU1LCAweEJCRTYsIDB4QkJFNywgMHhCQkU4LCAweEJCRTksIDB4QkJFQSwgMHhCQkVCLAotICAgIDB4QkJFQywgMHhCQkVELCAweEJCRUUsIDB4QkJFRiwgMHhCQkYwLCAweEJCRjEsIDB4QkJGMiwgMHhCQkYzLAotICAgIDB4QkJGNCwgMHhCQkY1LCAweEJCRjYsIDB4QkJGNywgMHhCQkZBLCAweEJCRkIsIDB4QkJGRCwgMHhCQkZFLAotICAgIDB4QkMwMSwgMHhCQzAzLCAweEJDMDQsIDB4QkMwNSwgMHhCQzA2LCAweEJDMDcsIDB4QkMwQSwgMHhCQzBFLAotICAgIDB4QkMxMCwgMHhCQzEyLCAweEJDMTMsIDB4QkMxOSwgMHhCQzFBLCAweEJDMjAsIDB4QkMyMSwgMHhCQzIyLAotICAgIDB4QkMyMywgMHhCQzI2LCAweEJDMjgsIDB4QkMyQSwgMHhCQzJCLCAweEJDMkMsIDB4QkMyRSwgMHhCQzJGLAotICAgIDB4QkMzMiwgMHhCQzMzLCAweEJDMzUsIDB4QkMzNiwgMHhCQzM3LCAweEJDMzksIDB4QkMzQSwgMHhCQzNCLAotICAgIDB4QkMzQywgMHhCQzNELCAweEJDM0UsIDB4QkMzRiwgMHhCQzQyLCAweEJDNDYsIDB4QkM0NywgMHhCQzQ4LAotICAgIDB4QkM0QSwgMHhCQzRCLCAweEJDNEUsIDB4QkM0RiwgMHhCQzUxLCAweEJDNTIsIDB4QkM1MywgMHhCQzU0LAotICAgIDB4QkM1NSwgMHhCQzU2LCAweEJDNTcsIDB4QkM1OCwgMHhCQzU5LCAweEJDNUEsIDB4QkM1QiwgMHhCQzVDLAotICAgIDB4QkM1RSwgMHhCQzVGLCAweEJDNjAsIDB4QkM2MSwgMHhCQzYyLCAweEJDNjMsIDB4QkM2NCwgMHhCQzY1LAotICAgIDB4QkM2NiwgMHhCQzY3LCAweEJDNjgsIDB4QkM2OSwgMHhCQzZBLCAweEJDNkIsIDB4QkM2QywgMHhCQzZELAotICAgIDB4QkM2RSwgMHhCQzZGLCAweEJDNzAsIDB4QkM3MSwgMHhCQzcyLCAweEJDNzMsIDB4QkM3NCwgMHhCQzc1LAotICAgIDB4QkM3NiwgMHhCQzc3LCAweEJDNzgsIDB4QkM3OSwgMHhCQzdBLCAweEJDN0IsIDB4QkM3QywgMHhCQzdELAotICAgIDB4QkM3RSwgMHhCQzdGLCAweEJDODAsIDB4QkM4MSwgMHhCQzgyLCAweEJDODMsIDB4QkM4NiwgMHhCQzg3LAotICAgIDB4QkM4OSwgMHhCQzhBLCAweEJDOEQsIDB4QkM4RiwgMHhCQzkwLCAweEJDOTEsIDB4QkM5MiwgMHhCQzkzLAotICAgIDB4QkM5NiwgMHhCQzk4LCAweEJDOUIsIDB4QkM5QywgMHhCQzlELCAweEJDOUUsIDB4QkM5RiwgMHhCQ0EyLAotICAgIDB4QkNBMywgMHhCQ0E1LCAweEJDQTYsIDB4QkNBOSwgMHhCQ0FBLCAweEJDQUIsIDB4QkNBQywgMHhCQ0FELAotICAgIDB4QkNBRSwgMHhCQ0FGLCAweEJDQjIsIDB4QkNCNiwgMHhCQ0I3LCAweEJDQjgsIDB4QkNCOSwgMHhCQ0JBLAotICAgIDB4QkNCQiwgMHhCQ0JFLCAweEJDQkYsIDB4QkNDMSwgMHhCQ0MyLCAweEJDQzMsIDB4QkNDNSwgMHhCQ0M2LAotICAgIDB4QkNDNywgMHhCQ0M4LCAweEJDQzksIDB4QkNDQSwgMHhCQ0NCLCAweEJDQ0MsIDB4QkNDRSwgMHhCQ0QyLAotICAgIDB4QkNEMywgMHhCQ0Q0LCAweEJDRDYsIDB4QkNENywgMHhCQ0Q5LCAweEJDREEsIDB4QkNEQiwgMHhCQ0RELAotICAgIDB4QkNERSwgMHhCQ0RGLCAweEJDRTAsIDB4QkNFMSwgMHhCQ0UyLCAweEJDRTMsIDB4QkNFNCwgMHhCQ0U1LAotICAgIDB4QkNFNiwgMHhCQ0U3LCAweEJDRTgsIDB4QkNFOSwgMHhCQ0VBLCAweEJDRUIsIDB4QkNFQywgMHhCQ0VELAotICAgIDB4QkNFRSwgMHhCQ0VGLCAweEJDRjAsIDB4QkNGMSwgMHhCQ0YyLCAweEJDRjMsIDB4QkNGNywgMHhCQ0Y5LAotICAgIDB4QkNGQSwgMHhCQ0ZCLCAweEJDRkQsIDB4QkNGRSwgMHhCQ0ZGLCAweEJEMDAsIDB4QkQwMSwgMHhCRDAyLAotICAgIDB4QkQwMywgMHhCRDA2LCAweEJEMDgsIDB4QkQwQSwgMHhCRDBCLCAweEJEMEMsIDB4QkQwRCwgMHhCRDBFLAotICAgIDB4QkQwRiwgMHhCRDExLCAweEJEMTIsIDB4QkQxMywgMHhCRDE1LCAweEJEMTYsIDB4QkQxNywgMHhCRDE4LAotICAgIDB4QkQxOSwgMHhCRDFBLCAweEJEMUIsIDB4QkQxQywgMHhCRDFELCAweEJEMUUsIDB4QkQxRiwgMHhCRDIwLAotICAgIDB4QkQyMSwgMHhCRDIyLCAweEJEMjMsIDB4QkQyNSwgMHhCRDI2LCAweEJEMjcsIDB4QkQyOCwgMHhCRDI5LAotICAgIDB4QkQyQSwgMHhCRDJCLCAweEJEMkQsIDB4QkQyRSwgMHhCRDJGLCAweEJEMzAsIDB4QkQzMSwgMHhCRDMyLAotICAgIDB4QkQzMywgMHhCRDM0LCAweEJEMzUsIDB4QkQzNiwgMHhCRDM3LCAweEJEMzgsIDB4QkQzOSwgMHhCRDNBLAotICAgIDB4QkQzQiwgMHhCRDNDLCAweEJEM0QsIDB4QkQzRSwgMHhCRDNGLCAweEJENDEsIDB4QkQ0MiwgMHhCRDQzLAotICAgIDB4QkQ0NCwgMHhCRDQ1LCAweEJENDYsIDB4QkQ0NywgMHhCRDRBLCAweEJENEIsIDB4QkQ0RCwgMHhCRDRFLAotICAgIDB4QkQ0RiwgMHhCRDUxLCAweEJENTIsIDB4QkQ1MywgMHhCRDU0LCAweEJENTUsIDB4QkQ1NiwgMHhCRDU3LAotICAgIDB4QkQ1QSwgMHhCRDVCLCAweEJENUMsIDB4QkQ1RCwgMHhCRDVFLCAweEJENUYsIDB4QkQ2MCwgMHhCRDYxLAotICAgIDB4QkQ2MiwgMHhCRDYzLCAweEJENjUsIDB4QkQ2NiwgMHhCRDY3LCAweEJENjksIDB4QkQ2QSwgMHhCRDZCLAotICAgIDB4QkQ2QywgMHhCRDZELCAweEJENkUsIDB4QkQ2RiwgMHhCRDcwLCAweEJENzEsIDB4QkQ3MiwgMHhCRDczLAotICAgIDB4QkQ3NCwgMHhCRDc1LCAweEJENzYsIDB4QkQ3NywgMHhCRDc4LCAweEJENzksIDB4QkQ3QSwgMHhCRDdCLAotICAgIDB4QkQ3QywgMHhCRDdELCAweEJEN0UsIDB4QkQ3RiwgMHhCRDgyLCAweEJEODMsIDB4QkQ4NSwgMHhCRDg2LAotICAgIDB4QkQ4QiwgMHhCRDhDLCAweEJEOEQsIDB4QkQ4RSwgMHhCRDhGLCAweEJEOTIsIDB4QkQ5NCwgMHhCRDk2LAotICAgIDB4QkQ5NywgMHhCRDk4LCAweEJEOUIsIDB4QkQ5RCwgMHhCRDlFLCAweEJEOUYsIDB4QkRBMCwgMHhCREExLAotICAgIDB4QkRBMiwgMHhCREEzLCAweEJEQTUsIDB4QkRBNiwgMHhCREE3LCAweEJEQTgsIDB4QkRBOSwgMHhCREFBLAotICAgIDB4QkRBQiwgMHhCREFDLCAweEJEQUQsIDB4QkRBRSwgMHhCREFGLCAweEJEQjEsIDB4QkRCMiwgMHhCREIzLAotICAgIDB4QkRCNCwgMHhCREI1LCAweEJEQjYsIDB4QkRCNywgMHhCREI5LCAweEJEQkEsIDB4QkRCQiwgMHhCREJDLAotICAgIDB4QkRCRCwgMHhCREJFLCAweEJEQkYsIDB4QkRDMCwgMHhCREMxLCAweEJEQzIsIDB4QkRDMywgMHhCREM0LAotICAgIDB4QkRDNSwgMHhCREM2LCAweEJEQzcsIDB4QkRDOCwgMHhCREM5LCAweEJEQ0EsIDB4QkRDQiwgMHhCRENDLAotICAgIDB4QkRDRCwgMHhCRENFLCAweEJEQ0YsIDB4QkREMCwgMHhCREQxLCAweEJERDIsIDB4QkREMywgMHhCREQ2LAotICAgIDB4QkRENywgMHhCREQ5LCAweEJEREEsIDB4QkREQiwgMHhCRERELCAweEJEREUsIDB4QkRERiwgMHhCREUwLAotICAgIDB4QkRFMSwgMHhCREUyLCAweEJERTMsIDB4QkRFNCwgMHhCREU1LCAweEJERTYsIDB4QkRFNywgMHhCREU4LAotICAgIDB4QkRFQSwgMHhCREVCLCAweEJERUMsIDB4QkRFRCwgMHhCREVFLCAweEJERUYsIDB4QkRGMSwgMHhCREYyLAotICAgIDB4QkRGMywgMHhCREY1LCAweEJERjYsIDB4QkRGNywgMHhCREY5LCAweEJERkEsIDB4QkRGQiwgMHhCREZDLAotICAgIDB4QkRGRCwgMHhCREZFLCAweEJERkYsIDB4QkUwMSwgMHhCRTAyLCAweEJFMDQsIDB4QkUwNiwgMHhCRTA3LAotICAgIDB4QkUwOCwgMHhCRTA5LCAweEJFMEEsIDB4QkUwQiwgMHhCRTBFLCAweEJFMEYsIDB4QkUxMSwgMHhCRTEyLAotICAgIDB4QkUxMywgMHhCRTE1LCAweEJFMTYsIDB4QkUxNywgMHhCRTE4LCAweEJFMTksIDB4QkUxQSwgMHhCRTFCLAotICAgIDB4QkUxRSwgMHhCRTIwLCAweEJFMjEsIDB4QkUyMiwgMHhCRTIzLCAweEJFMjQsIDB4QkUyNSwgMHhCRTI2LAotICAgIDB4QkUyNywgMHhCRTI4LCAweEJFMjksIDB4QkUyQSwgMHhCRTJCLCAweEJFMkMsIDB4QkUyRCwgMHhCRTJFLAotICAgIDB4QkUyRiwgMHhCRTMwLCAweEJFMzEsIDB4QkUzMiwgMHhCRTMzLCAweEJFMzQsIDB4QkUzNSwgMHhCRTM2LAotICAgIDB4QkUzNywgMHhCRTM4LCAweEJFMzksIDB4QkUzQSwgMHhCRTNCLCAweEJFM0MsIDB4QkUzRCwgMHhCRTNFLAotICAgIDB4QkUzRiwgMHhCRTQwLCAweEJFNDEsIDB4QkU0MiwgMHhCRTQzLCAweEJFNDYsIDB4QkU0NywgMHhCRTQ5LAotICAgIDB4QkU0QSwgMHhCRTRCLCAweEJFNEQsIDB4QkU0RiwgMHhCRTUwLCAweEJFNTEsIDB4QkU1MiwgMHhCRTUzLAotICAgIDB4QkU1NiwgMHhCRTU4LCAweEJFNUMsIDB4QkU1RCwgMHhCRTVFLCAweEJFNUYsIDB4QkU2MiwgMHhCRTYzLAotICAgIDB4QkU2NSwgMHhCRTY2LCAweEJFNjcsIDB4QkU2OSwgMHhCRTZCLCAweEJFNkMsIDB4QkU2RCwgMHhCRTZFLAotICAgIDB4QkU2RiwgMHhCRTcyLCAweEJFNzYsIDB4QkU3NywgMHhCRTc4LCAweEJFNzksIDB4QkU3QSwgMHhCRTdFLAotICAgIDB4QkU3RiwgMHhCRTgxLCAweEJFODIsIDB4QkU4MywgMHhCRTg1LCAweEJFODYsIDB4QkU4NywgMHhCRTg4LAotICAgIDB4QkU4OSwgMHhCRThBLCAweEJFOEIsIDB4QkU4RSwgMHhCRTkyLCAweEJFOTMsIDB4QkU5NCwgMHhCRTk1LAotICAgIDB4QkU5NiwgMHhCRTk3LCAweEJFOUEsIDB4QkU5QiwgMHhCRTlDLCAweEJFOUQsIDB4QkU5RSwgMHhCRTlGLAotICAgIDB4QkVBMCwgMHhCRUExLCAweEJFQTIsIDB4QkVBMywgMHhCRUE0LCAweEJFQTUsIDB4QkVBNiwgMHhCRUE3LAotICAgIDB4QkVBOSwgMHhCRUFBLCAweEJFQUIsIDB4QkVBQywgMHhCRUFELCAweEJFQUUsIDB4QkVBRiwgMHhCRUIwLAotICAgIDB4QkVCMSwgMHhCRUIyLCAweEJFQjMsIDB4QkVCNCwgMHhCRUI1LCAweEJFQjYsIDB4QkVCNywgMHhCRUI4LAotICAgIDB4QkVCOSwgMHhCRUJBLCAweEJFQkIsIDB4QkVCQywgMHhCRUJELCAweEJFQkUsIDB4QkVCRiwgMHhCRUMwLAotICAgIDB4QkVDMSwgMHhCRUMyLCAweEJFQzMsIDB4QkVDNCwgMHhCRUM1LCAweEJFQzYsIDB4QkVDNywgMHhCRUM4LAotICAgIDB4QkVDOSwgMHhCRUNBLCAweEJFQ0IsIDB4QkVDQywgMHhCRUNELCAweEJFQ0UsIDB4QkVDRiwgMHhCRUQyLAotICAgIDB4QkVEMywgMHhCRUQ1LCAweEJFRDYsIDB4QkVEOSwgMHhCRURBLCAweEJFREIsIDB4QkVEQywgMHhCRURELAotICAgIDB4QkVERSwgMHhCRURGLCAweEJFRTEsIDB4QkVFMiwgMHhCRUU2LCAweEJFRTcsIDB4QkVFOCwgMHhCRUU5LAotICAgIDB4QkVFQSwgMHhCRUVCLCAweEJFRUQsIDB4QkVFRSwgMHhCRUVGLCAweEJFRjAsIDB4QkVGMSwgMHhCRUYyLAotICAgIDB4QkVGMywgMHhCRUY0LCAweEJFRjUsIDB4QkVGNiwgMHhCRUY3LCAweEJFRjgsIDB4QkVGOSwgMHhCRUZBLAotICAgIDB4QkVGQiwgMHhCRUZDLCAweEJFRkQsIDB4QkVGRSwgMHhCRUZGLCAweEJGMDAsIDB4QkYwMiwgMHhCRjAzLAotICAgIDB4QkYwNCwgMHhCRjA1LCAweEJGMDYsIDB4QkYwNywgMHhCRjBBLCAweEJGMEIsIDB4QkYwQywgMHhCRjBELAotICAgIDB4QkYwRSwgMHhCRjBGLCAweEJGMTAsIDB4QkYxMSwgMHhCRjEyLCAweEJGMTMsIDB4QkYxNCwgMHhCRjE1LAotICAgIDB4QkYxNiwgMHhCRjE3LCAweEJGMUEsIDB4QkYxRSwgMHhCRjFGLCAweEJGMjAsIDB4QkYyMSwgMHhCRjIyLAotICAgIDB4QkYyMywgMHhCRjI0LCAweEJGMjUsIDB4QkYyNiwgMHhCRjI3LCAweEJGMjgsIDB4QkYyOSwgMHhCRjJBLAotICAgIDB4QkYyQiwgMHhCRjJDLCAweEJGMkQsIDB4QkYyRSwgMHhCRjJGLCAweEJGMzAsIDB4QkYzMSwgMHhCRjMyLAotICAgIDB4QkYzMywgMHhCRjM0LCAweEJGMzUsIDB4QkYzNiwgMHhCRjM3LCAweEJGMzgsIDB4QkYzOSwgMHhCRjNBLAotICAgIDB4QkYzQiwgMHhCRjNDLCAweEJGM0QsIDB4QkYzRSwgMHhCRjNGLCAweEJGNDIsIDB4QkY0MywgMHhCRjQ1LAotICAgIDB4QkY0NiwgMHhCRjQ3LCAweEJGNDksIDB4QkY0QSwgMHhCRjRCLCAweEJGNEMsIDB4QkY0RCwgMHhCRjRFLAotICAgIDB4QkY0RiwgMHhCRjUyLCAweEJGNTMsIDB4QkY1NCwgMHhCRjU2LCAweEJGNTcsIDB4QkY1OCwgMHhCRjU5LAotICAgIDB4QkY1QSwgMHhCRjVCLCAweEJGNUMsIDB4QkY1RCwgMHhCRjVFLCAweEJGNUYsIDB4QkY2MCwgMHhCRjYxLAotICAgIDB4QkY2MiwgMHhCRjYzLCAweEJGNjQsIDB4QkY2NSwgMHhCRjY2LCAweEJGNjcsIDB4QkY2OCwgMHhCRjY5LAotICAgIDB4QkY2QSwgMHhCRjZCLCAweEJGNkMsIDB4QkY2RCwgMHhCRjZFLCAweEJGNkYsIDB4QkY3MCwgMHhCRjcxLAotICAgIDB4QkY3MiwgMHhCRjczLCAweEJGNzQsIDB4QkY3NSwgMHhCRjc2LCAweEJGNzcsIDB4QkY3OCwgMHhCRjc5LAotICAgIDB4QkY3QSwgMHhCRjdCLCAweEJGN0MsIDB4QkY3RCwgMHhCRjdFLCAweEJGN0YsIDB4QkY4MCwgMHhCRjgxLAotICAgIDB4QkY4MiwgMHhCRjgzLCAweEJGODQsIDB4QkY4NSwgMHhCRjg2LCAweEJGODcsIDB4QkY4OCwgMHhCRjg5LAotICAgIDB4QkY4QSwgMHhCRjhCLCAweEJGOEMsIDB4QkY4RCwgMHhCRjhFLCAweEJGOEYsIDB4QkY5MCwgMHhCRjkxLAotICAgIDB4QkY5MiwgMHhCRjkzLCAweEJGOTUsIDB4QkY5NiwgMHhCRjk3LCAweEJGOTgsIDB4QkY5OSwgMHhCRjlBLAotICAgIDB4QkY5QiwgMHhCRjlDLCAweEJGOUQsIDB4QkY5RSwgMHhCRjlGLCAweEJGQTAsIDB4QkZBMSwgMHhCRkEyLAotICAgIDB4QkZBMywgMHhCRkE0LCAweEJGQTUsIDB4QkZBNiwgMHhCRkE3LCAweEJGQTgsIDB4QkZBOSwgMHhCRkFBLAotICAgIDB4QkZBQiwgMHhCRkFDLCAweEJGQUQsIDB4QkZBRSwgMHhCRkFGLCAweEJGQjEsIDB4QkZCMiwgMHhCRkIzLAotICAgIDB4QkZCNCwgMHhCRkI1LCAweEJGQjYsIDB4QkZCNywgMHhCRkI4LCAweEJGQjksIDB4QkZCQSwgMHhCRkJCLAotICAgIDB4QkZCQywgMHhCRkJELCAweEJGQkUsIDB4QkZCRiwgMHhCRkMwLCAweEJGQzEsIDB4QkZDMiwgMHhCRkMzLAotICAgIDB4QkZDNCwgMHhCRkM2LCAweEJGQzcsIDB4QkZDOCwgMHhCRkM5LCAweEJGQ0EsIDB4QkZDQiwgMHhCRkNFLAotICAgIDB4QkZDRiwgMHhCRkQxLCAweEJGRDIsIDB4QkZEMywgMHhCRkQ1LCAweEJGRDYsIDB4QkZENywgMHhCRkQ4LAotICAgIDB4QkZEOSwgMHhCRkRBLCAweEJGREIsIDB4QkZERCwgMHhCRkRFLCAweEJGRTAsIDB4QkZFMiwgMHhCRkUzLAotICAgIDB4QkZFNCwgMHhCRkU1LCAweEJGRTYsIDB4QkZFNywgMHhCRkU4LCAweEJGRTksIDB4QkZFQSwgMHhCRkVCLAotICAgIDB4QkZFQywgMHhCRkVELCAweEJGRUUsIDB4QkZFRiwgMHhCRkYwLCAweEJGRjEsIDB4QkZGMiwgMHhCRkYzLAotICAgIDB4QkZGNCwgMHhCRkY1LCAweEJGRjYsIDB4QkZGNywgMHhCRkY4LCAweEJGRjksIDB4QkZGQSwgMHhCRkZCLAotICAgIDB4QkZGQywgMHhCRkZELCAweEJGRkUsIDB4QkZGRiwgMHhDMDAwLCAweEMwMDEsIDB4QzAwMiwgMHhDMDAzLAotICAgIDB4QzAwNCwgMHhDMDA1LCAweEMwMDYsIDB4QzAwNywgMHhDMDA4LCAweEMwMDksIDB4QzAwQSwgMHhDMDBCLAotICAgIDB4QzAwQywgMHhDMDBELCAweEMwMEUsIDB4QzAwRiwgMHhDMDEwLCAweEMwMTEsIDB4QzAxMiwgMHhDMDEzLAotICAgIDB4QzAxNCwgMHhDMDE1LCAweEMwMTYsIDB4QzAxNywgMHhDMDE4LCAweEMwMTksIDB4QzAxQSwgMHhDMDFCLAotICAgIDB4QzAxQywgMHhDMDFELCAweEMwMUUsIDB4QzAxRiwgMHhDMDIwLCAweEMwMjEsIDB4QzAyMiwgMHhDMDIzLAotICAgIDB4QzAyNCwgMHhDMDI1LCAweEMwMjYsIDB4QzAyNywgMHhDMDI4LCAweEMwMjksIDB4QzAyQSwgMHhDMDJCLAotICAgIDB4QzAyQywgMHhDMDJELCAweEMwMkUsIDB4QzAyRiwgMHhDMDMwLCAweEMwMzEsIDB4QzAzMiwgMHhDMDMzLAotICAgIDB4QzAzNCwgMHhDMDM1LCAweEMwMzYsIDB4QzAzNywgMHhDMDM4LCAweEMwMzksIDB4QzAzQSwgMHhDMDNCLAotICAgIDB4QzAzRCwgMHhDMDNFLCAweEMwM0YsIDB4QzA0MCwgMHhDMDQxLCAweEMwNDIsIDB4QzA0MywgMHhDMDQ0LAotICAgIDB4QzA0NSwgMHhDMDQ2LCAweEMwNDcsIDB4QzA0OCwgMHhDMDQ5LCAweEMwNEEsIDB4QzA0QiwgMHhDMDRDLAotICAgIDB4QzA0RCwgMHhDMDRFLCAweEMwNEYsIDB4QzA1MCwgMHhDMDUyLCAweEMwNTMsIDB4QzA1NCwgMHhDMDU1LAotICAgIDB4QzA1NiwgMHhDMDU3LCAweEMwNTksIDB4QzA1QSwgMHhDMDVCLCAweEMwNUQsIDB4QzA1RSwgMHhDMDVGLAotICAgIDB4QzA2MSwgMHhDMDYyLCAweEMwNjMsIDB4QzA2NCwgMHhDMDY1LCAweEMwNjYsIDB4QzA2NywgMHhDMDZBLAotICAgIDB4QzA2QiwgMHhDMDZDLCAweEMwNkQsIDB4QzA2RSwgMHhDMDZGLCAweEMwNzAsIDB4QzA3MSwgMHhDMDcyLAotICAgIDB4QzA3MywgMHhDMDc0LCAweEMwNzUsIDB4QzA3NiwgMHhDMDc3LCAweEMwNzgsIDB4QzA3OSwgMHhDMDdBLAotICAgIDB4QzA3QiwgMHhDMDdDLCAweEMwN0QsIDB4QzA3RSwgMHhDMDdGLCAweEMwODAsIDB4QzA4MSwgMHhDMDgyLAotICAgIDB4QzA4MywgMHhDMDg0LCAweEMwODUsIDB4QzA4NiwgMHhDMDg3LCAweEMwODgsIDB4QzA4OSwgMHhDMDhBLAotICAgIDB4QzA4QiwgMHhDMDhDLCAweEMwOEQsIDB4QzA4RSwgMHhDMDhGLCAweEMwOTIsIDB4QzA5MywgMHhDMDk1LAotICAgIDB4QzA5NiwgMHhDMDk3LCAweEMwOTksIDB4QzA5QSwgMHhDMDlCLCAweEMwOUMsIDB4QzA5RCwgMHhDMDlFLAotICAgIDB4QzA5RiwgMHhDMEEyLCAweEMwQTQsIDB4QzBBNiwgMHhDMEE3LCAweEMwQTgsIDB4QzBBOSwgMHhDMEFBLAotICAgIDB4QzBBQiwgMHhDMEFFLCAweEMwQjEsIDB4QzBCMiwgMHhDMEI3LCAweEMwQjgsIDB4QzBCOSwgMHhDMEJBLAotICAgIDB4QzBCQiwgMHhDMEJFLCAweEMwQzIsIDB4QzBDMywgMHhDMEM0LCAweEMwQzYsIDB4QzBDNywgMHhDMENBLAotICAgIDB4QzBDQiwgMHhDMENELCAweEMwQ0UsIDB4QzBDRiwgMHhDMEQxLCAweEMwRDIsIDB4QzBEMywgMHhDMEQ0LAotICAgIDB4QzBENSwgMHhDMEQ2LCAweEMwRDcsIDB4QzBEQSwgMHhDMERFLCAweEMwREYsIDB4QzBFMCwgMHhDMEUxLAotICAgIDB4QzBFMiwgMHhDMEUzLCAweEMwRTYsIDB4QzBFNywgMHhDMEU5LCAweEMwRUEsIDB4QzBFQiwgMHhDMEVELAotICAgIDB4QzBFRSwgMHhDMEVGLCAweEMwRjAsIDB4QzBGMSwgMHhDMEYyLCAweEMwRjMsIDB4QzBGNiwgMHhDMEY4LAotICAgIDB4QzBGQSwgMHhDMEZCLCAweEMwRkMsIDB4QzBGRCwgMHhDMEZFLCAweEMwRkYsIDB4QzEwMSwgMHhDMTAyLAotICAgIDB4QzEwMywgMHhDMTA1LCAweEMxMDYsIDB4QzEwNywgMHhDMTA5LCAweEMxMEEsIDB4QzEwQiwgMHhDMTBDLAotICAgIDB4QzEwRCwgMHhDMTBFLCAweEMxMEYsIDB4QzExMSwgMHhDMTEyLCAweEMxMTMsIDB4QzExNCwgMHhDMTE2LAotICAgIDB4QzExNywgMHhDMTE4LCAweEMxMTksIDB4QzExQSwgMHhDMTFCLCAweEMxMjEsIDB4QzEyMiwgMHhDMTI1LAotICAgIDB4QzEyOCwgMHhDMTI5LCAweEMxMkEsIDB4QzEyQiwgMHhDMTJFLCAweEMxMzIsIDB4QzEzMywgMHhDMTM0LAotICAgIDB4QzEzNSwgMHhDMTM3LCAweEMxM0EsIDB4QzEzQiwgMHhDMTNELCAweEMxM0UsIDB4QzEzRiwgMHhDMTQxLAotICAgIDB4QzE0MiwgMHhDMTQzLCAweEMxNDQsIDB4QzE0NSwgMHhDMTQ2LCAweEMxNDcsIDB4QzE0QSwgMHhDMTRFLAotICAgIDB4QzE0RiwgMHhDMTUwLCAweEMxNTEsIDB4QzE1MiwgMHhDMTUzLCAweEMxNTYsIDB4QzE1NywgMHhDMTU5LAotICAgIDB4QzE1QSwgMHhDMTVCLCAweEMxNUQsIDB4QzE1RSwgMHhDMTVGLCAweEMxNjAsIDB4QzE2MSwgMHhDMTYyLAotICAgIDB4QzE2MywgMHhDMTY2LCAweEMxNkEsIDB4QzE2QiwgMHhDMTZDLCAweEMxNkQsIDB4QzE2RSwgMHhDMTZGLAotICAgIDB4QzE3MSwgMHhDMTcyLCAweEMxNzMsIDB4QzE3NSwgMHhDMTc2LCAweEMxNzcsIDB4QzE3OSwgMHhDMTdBLAotICAgIDB4QzE3QiwgMHhDMTdDLCAweEMxN0QsIDB4QzE3RSwgMHhDMTdGLCAweEMxODAsIDB4QzE4MSwgMHhDMTgyLAotICAgIDB4QzE4MywgMHhDMTg0LCAweEMxODYsIDB4QzE4NywgMHhDMTg4LCAweEMxODksIDB4QzE4QSwgMHhDMThCLAotICAgIDB4QzE4RiwgMHhDMTkxLCAweEMxOTIsIDB4QzE5MywgMHhDMTk1LCAweEMxOTcsIDB4QzE5OCwgMHhDMTk5LAotICAgIDB4QzE5QSwgMHhDMTlCLCAweEMxOUUsIDB4QzFBMCwgMHhDMUEyLCAweEMxQTMsIDB4QzFBNCwgMHhDMUE2LAotICAgIDB4QzFBNywgMHhDMUFBLCAweEMxQUIsIDB4QzFBRCwgMHhDMUFFLCAweEMxQUYsIDB4QzFCMSwgMHhDMUIyLAotICAgIDB4QzFCMywgMHhDMUI0LCAweEMxQjUsIDB4QzFCNiwgMHhDMUI3LCAweEMxQjgsIDB4QzFCOSwgMHhDMUJBLAotICAgIDB4QzFCQiwgMHhDMUJDLCAweEMxQkUsIDB4QzFCRiwgMHhDMUMwLCAweEMxQzEsIDB4QzFDMiwgMHhDMUMzLAotICAgIDB4QzFDNSwgMHhDMUM2LCAweEMxQzcsIDB4QzFDOSwgMHhDMUNBLCAweEMxQ0IsIDB4QzFDRCwgMHhDMUNFLAotICAgIDB4QzFDRiwgMHhDMUQwLCAweEMxRDEsIDB4QzFEMiwgMHhDMUQzLCAweEMxRDUsIDB4QzFENiwgMHhDMUQ5LAotICAgIDB4QzFEQSwgMHhDMURCLCAweEMxREMsIDB4QzFERCwgMHhDMURFLCAweEMxREYsIDB4QzFFMSwgMHhDMUUyLAotICAgIDB4QzFFMywgMHhDMUU1LCAweEMxRTYsIDB4QzFFNywgMHhDMUU5LCAweEMxRUEsIDB4QzFFQiwgMHhDMUVDLAotICAgIDB4QzFFRCwgMHhDMUVFLCAweEMxRUYsIDB4QzFGMiwgMHhDMUY0LCAweEMxRjUsIDB4QzFGNiwgMHhDMUY3LAotICAgIDB4QzFGOCwgMHhDMUY5LCAweEMxRkEsIDB4QzFGQiwgMHhDMUZFLCAweEMxRkYsIDB4QzIwMSwgMHhDMjAyLAotICAgIDB4QzIwMywgMHhDMjA1LCAweEMyMDYsIDB4QzIwNywgMHhDMjA4LCAweEMyMDksIDB4QzIwQSwgMHhDMjBCLAotICAgIDB4QzIwRSwgMHhDMjEwLCAweEMyMTIsIDB4QzIxMywgMHhDMjE0LCAweEMyMTUsIDB4QzIxNiwgMHhDMjE3LAotICAgIDB4QzIxQSwgMHhDMjFCLCAweEMyMUQsIDB4QzIxRSwgMHhDMjIxLCAweEMyMjIsIDB4QzIyMywgMHhDMjI0LAotICAgIDB4QzIyNSwgMHhDMjI2LCAweEMyMjcsIDB4QzIyQSwgMHhDMjJDLCAweEMyMkUsIDB4QzIzMCwgMHhDMjMzLAotICAgIDB4QzIzNSwgMHhDMjM2LCAweEMyMzcsIDB4QzIzOCwgMHhDMjM5LCAweEMyM0EsIDB4QzIzQiwgMHhDMjNDLAotICAgIDB4QzIzRCwgMHhDMjNFLCAweEMyM0YsIDB4QzI0MCwgMHhDMjQxLCAweEMyNDIsIDB4QzI0MywgMHhDMjQ0LAotICAgIDB4QzI0NSwgMHhDMjQ2LCAweEMyNDcsIDB4QzI0OSwgMHhDMjRBLCAweEMyNEIsIDB4QzI0QywgMHhDMjRELAotICAgIDB4QzI0RSwgMHhDMjRGLCAweEMyNTIsIDB4QzI1MywgMHhDMjU1LCAweEMyNTYsIDB4QzI1NywgMHhDMjU5LAotICAgIDB4QzI1QSwgMHhDMjVCLCAweEMyNUMsIDB4QzI1RCwgMHhDMjVFLCAweEMyNUYsIDB4QzI2MSwgMHhDMjYyLAotICAgIDB4QzI2MywgMHhDMjY0LCAweEMyNjYsIDB4QzI2NywgMHhDMjY4LCAweEMyNjksIDB4QzI2QSwgMHhDMjZCLAotICAgIDB4QzI2RSwgMHhDMjZGLCAweEMyNzEsIDB4QzI3MiwgMHhDMjczLCAweEMyNzUsIDB4QzI3NiwgMHhDMjc3LAotICAgIDB4QzI3OCwgMHhDMjc5LCAweEMyN0EsIDB4QzI3QiwgMHhDMjdFLCAweEMyODAsIDB4QzI4MiwgMHhDMjgzLAotICAgIDB4QzI4NCwgMHhDMjg1LCAweEMyODYsIDB4QzI4NywgMHhDMjhBLCAweEMyOEIsIDB4QzI4QywgMHhDMjhELAotICAgIDB4QzI4RSwgMHhDMjhGLCAweEMyOTEsIDB4QzI5MiwgMHhDMjkzLCAweEMyOTQsIDB4QzI5NSwgMHhDMjk2LAotICAgIDB4QzI5NywgMHhDMjk5LCAweEMyOUEsIDB4QzI5QywgMHhDMjlFLCAweEMyOUYsIDB4QzJBMCwgMHhDMkExLAotICAgIDB4QzJBMiwgMHhDMkEzLCAweEMyQTYsIDB4QzJBNywgMHhDMkE5LCAweEMyQUEsIDB4QzJBQiwgMHhDMkFFLAotICAgIDB4QzJBRiwgMHhDMkIwLCAweEMyQjEsIDB4QzJCMiwgMHhDMkIzLCAweEMyQjYsIDB4QzJCOCwgMHhDMkJBLAotICAgIDB4QzJCQiwgMHhDMkJDLCAweEMyQkQsIDB4QzJCRSwgMHhDMkJGLCAweEMyQzAsIDB4QzJDMSwgMHhDMkMyLAotICAgIDB4QzJDMywgMHhDMkM0LCAweEMyQzUsIDB4QzJDNiwgMHhDMkM3LCAweEMyQzgsIDB4QzJDOSwgMHhDMkNBLAotICAgIDB4QzJDQiwgMHhDMkNDLCAweEMyQ0QsIDB4QzJDRSwgMHhDMkNGLCAweEMyRDAsIDB4QzJEMSwgMHhDMkQyLAotICAgIDB4QzJEMywgMHhDMkQ0LCAweEMyRDUsIDB4QzJENiwgMHhDMkQ3LCAweEMyRDgsIDB4QzJEOSwgMHhDMkRBLAotICAgIDB4QzJEQiwgMHhDMkRFLCAweEMyREYsIDB4QzJFMSwgMHhDMkUyLCAweEMyRTUsIDB4QzJFNiwgMHhDMkU3LAotICAgIDB4QzJFOCwgMHhDMkU5LCAweEMyRUEsIDB4QzJFRSwgMHhDMkYwLCAweEMyRjIsIDB4QzJGMywgMHhDMkY0LAotICAgIDB4QzJGNSwgMHhDMkY3LCAweEMyRkEsIDB4QzJGRCwgMHhDMkZFLCAweEMyRkYsIDB4QzMwMSwgMHhDMzAyLAotICAgIDB4QzMwMywgMHhDMzA0LCAweEMzMDUsIDB4QzMwNiwgMHhDMzA3LCAweEMzMEEsIDB4QzMwQiwgMHhDMzBFLAotICAgIDB4QzMwRiwgMHhDMzEwLCAweEMzMTEsIDB4QzMxMiwgMHhDMzE2LCAweEMzMTcsIDB4QzMxOSwgMHhDMzFBLAotICAgIDB4QzMxQiwgMHhDMzFELCAweEMzMUUsIDB4QzMxRiwgMHhDMzIwLCAweEMzMjEsIDB4QzMyMiwgMHhDMzIzLAotICAgIDB4QzMyNiwgMHhDMzI3LCAweEMzMkEsIDB4QzMyQiwgMHhDMzJDLCAweEMzMkQsIDB4QzMyRSwgMHhDMzJGLAotICAgIDB4QzMzMCwgMHhDMzMxLCAweEMzMzIsIDB4QzMzMywgMHhDMzM0LCAweEMzMzUsIDB4QzMzNiwgMHhDMzM3LAotICAgIDB4QzMzOCwgMHhDMzM5LCAweEMzM0EsIDB4QzMzQiwgMHhDMzNDLCAweEMzM0QsIDB4QzMzRSwgMHhDMzNGLAotICAgIDB4QzM0MCwgMHhDMzQxLCAweEMzNDIsIDB4QzM0MywgMHhDMzQ0LCAweEMzNDYsIDB4QzM0NywgMHhDMzQ4LAotICAgIDB4QzM0OSwgMHhDMzRBLCAweEMzNEIsIDB4QzM0QywgMHhDMzRELCAweEMzNEUsIDB4QzM0RiwgMHhDMzUwLAotICAgIDB4QzM1MSwgMHhDMzUyLCAweEMzNTMsIDB4QzM1NCwgMHhDMzU1LCAweEMzNTYsIDB4QzM1NywgMHhDMzU4LAotICAgIDB4QzM1OSwgMHhDMzVBLCAweEMzNUIsIDB4QzM1QywgMHhDMzVELCAweEMzNUUsIDB4QzM1RiwgMHhDMzYwLAotICAgIDB4QzM2MSwgMHhDMzYyLCAweEMzNjMsIDB4QzM2NCwgMHhDMzY1LCAweEMzNjYsIDB4QzM2NywgMHhDMzZBLAotICAgIDB4QzM2QiwgMHhDMzZELCAweEMzNkUsIDB4QzM2RiwgMHhDMzcxLCAweEMzNzMsIDB4QzM3NCwgMHhDMzc1LAotICAgIDB4QzM3NiwgMHhDMzc3LCAweEMzN0EsIDB4QzM3QiwgMHhDMzdFLCAweEMzN0YsIDB4QzM4MCwgMHhDMzgxLAotICAgIDB4QzM4MiwgMHhDMzgzLCAweEMzODUsIDB4QzM4NiwgMHhDMzg3LCAweEMzODksIDB4QzM4QSwgMHhDMzhCLAotICAgIDB4QzM4RCwgMHhDMzhFLCAweEMzOEYsIDB4QzM5MCwgMHhDMzkxLCAweEMzOTIsIDB4QzM5MywgMHhDMzk0LAotICAgIDB4QzM5NSwgMHhDMzk2LCAweEMzOTcsIDB4QzM5OCwgMHhDMzk5LCAweEMzOUEsIDB4QzM5QiwgMHhDMzlDLAotICAgIDB4QzM5RCwgMHhDMzlFLCAweEMzOUYsIDB4QzNBMCwgMHhDM0ExLCAweEMzQTIsIDB4QzNBMywgMHhDM0E0LAotICAgIDB4QzNBNSwgMHhDM0E2LCAweEMzQTcsIDB4QzNBOCwgMHhDM0E5LCAweEMzQUEsIDB4QzNBQiwgMHhDM0FDLAotICAgIDB4QzNBRCwgMHhDM0FFLCAweEMzQUYsIDB4QzNCMCwgMHhDM0IxLCAweEMzQjIsIDB4QzNCMywgMHhDM0I0LAotICAgIDB4QzNCNSwgMHhDM0I2LCAweEMzQjcsIDB4QzNCOCwgMHhDM0I5LCAweEMzQkEsIDB4QzNCQiwgMHhDM0JDLAotICAgIDB4QzNCRCwgMHhDM0JFLCAweEMzQkYsIDB4QzNDMSwgMHhDM0MyLCAweEMzQzMsIDB4QzNDNCwgMHhDM0M1LAotICAgIDB4QzNDNiwgMHhDM0M3LCAweEMzQzgsIDB4QzNDOSwgMHhDM0NBLCAweEMzQ0IsIDB4QzNDQywgMHhDM0NELAotICAgIDB4QzNDRSwgMHhDM0NGLCAweEMzRDAsIDB4QzNEMSwgMHhDM0QyLCAweEMzRDMsIDB4QzNENCwgMHhDM0Q1LAotICAgIDB4QzNENiwgMHhDM0Q3LCAweEMzREEsIDB4QzNEQiwgMHhDM0RELCAweEMzREUsIDB4QzNFMSwgMHhDM0UzLAotICAgIDB4QzNFNCwgMHhDM0U1LCAweEMzRTYsIDB4QzNFNywgMHhDM0VBLCAweEMzRUIsIDB4QzNFQywgMHhDM0VFLAotICAgIDB4QzNFRiwgMHhDM0YwLCAweEMzRjEsIDB4QzNGMiwgMHhDM0YzLCAweEMzRjYsIDB4QzNGNywgMHhDM0Y5LAotICAgIDB4QzNGQSwgMHhDM0ZCLCAweEMzRkMsIDB4QzNGRCwgMHhDM0ZFLCAweEMzRkYsIDB4QzQwMCwgMHhDNDAxLAotICAgIDB4QzQwMiwgMHhDNDAzLCAweEM0MDQsIDB4QzQwNSwgMHhDNDA2LCAweEM0MDcsIDB4QzQwOSwgMHhDNDBBLAotICAgIDB4QzQwQiwgMHhDNDBDLCAweEM0MEQsIDB4QzQwRSwgMHhDNDBGLCAweEM0MTEsIDB4QzQxMiwgMHhDNDEzLAotICAgIDB4QzQxNCwgMHhDNDE1LCAweEM0MTYsIDB4QzQxNywgMHhDNDE4LCAweEM0MTksIDB4QzQxQSwgMHhDNDFCLAotICAgIDB4QzQxQywgMHhDNDFELCAweEM0MUUsIDB4QzQxRiwgMHhDNDIwLCAweEM0MjEsIDB4QzQyMiwgMHhDNDIzLAotICAgIDB4QzQyNSwgMHhDNDI2LCAweEM0MjcsIDB4QzQyOCwgMHhDNDI5LCAweEM0MkEsIDB4QzQyQiwgMHhDNDJELAotICAgIDB4QzQyRSwgMHhDNDJGLCAweEM0MzEsIDB4QzQzMiwgMHhDNDMzLCAweEM0MzUsIDB4QzQzNiwgMHhDNDM3LAotICAgIDB4QzQzOCwgMHhDNDM5LCAweEM0M0EsIDB4QzQzQiwgMHhDNDNFLCAweEM0M0YsIDB4QzQ0MCwgMHhDNDQxLAotICAgIDB4QzQ0MiwgMHhDNDQzLCAweEM0NDQsIDB4QzQ0NSwgMHhDNDQ2LCAweEM0NDcsIDB4QzQ0OSwgMHhDNDRBLAotICAgIDB4QzQ0QiwgMHhDNDRDLCAweEM0NEQsIDB4QzQ0RSwgMHhDNDRGLCAweEM0NTAsIDB4QzQ1MSwgMHhDNDUyLAotICAgIDB4QzQ1MywgMHhDNDU0LCAweEM0NTUsIDB4QzQ1NiwgMHhDNDU3LCAweEM0NTgsIDB4QzQ1OSwgMHhDNDVBLAotICAgIDB4QzQ1QiwgMHhDNDVDLCAweEM0NUQsIDB4QzQ1RSwgMHhDNDVGLCAweEM0NjAsIDB4QzQ2MSwgMHhDNDYyLAotICAgIDB4QzQ2MywgMHhDNDY2LCAweEM0NjcsIDB4QzQ2OSwgMHhDNDZBLCAweEM0NkIsIDB4QzQ2RCwgMHhDNDZFLAotICAgIDB4QzQ2RiwgMHhDNDcwLCAweEM0NzEsIDB4QzQ3MiwgMHhDNDczLCAweEM0NzYsIDB4QzQ3NywgMHhDNDc4LAotICAgIDB4QzQ3QSwgMHhDNDdCLCAweEM0N0MsIDB4QzQ3RCwgMHhDNDdFLCAweEM0N0YsIDB4QzQ4MSwgMHhDNDgyLAotICAgIDB4QzQ4MywgMHhDNDg0LCAweEM0ODUsIDB4QzQ4NiwgMHhDNDg3LCAweEM0ODgsIDB4QzQ4OSwgMHhDNDhBLAotICAgIDB4QzQ4QiwgMHhDNDhDLCAweEM0OEQsIDB4QzQ4RSwgMHhDNDhGLCAweEM0OTAsIDB4QzQ5MSwgMHhDNDkyLAotICAgIDB4QzQ5MywgMHhDNDk1LCAweEM0OTYsIDB4QzQ5NywgMHhDNDk4LCAweEM0OTksIDB4QzQ5QSwgMHhDNDlCLAotICAgIDB4QzQ5RCwgMHhDNDlFLCAweEM0OUYsIDB4QzRBMCwgMHhDNEExLCAweEM0QTIsIDB4QzRBMywgMHhDNEE0LAotICAgIDB4QzRBNSwgMHhDNEE2LCAweEM0QTcsIDB4QzRBOCwgMHhDNEE5LCAweEM0QUEsIDB4QzRBQiwgMHhDNEFDLAotICAgIDB4QzRBRCwgMHhDNEFFLCAweEM0QUYsIDB4QzRCMCwgMHhDNEIxLCAweEM0QjIsIDB4QzRCMywgMHhDNEI0LAotICAgIDB4QzRCNSwgMHhDNEI2LCAweEM0QjcsIDB4QzRCOSwgMHhDNEJBLCAweEM0QkIsIDB4QzRCRCwgMHhDNEJFLAotICAgIDB4QzRCRiwgMHhDNEMwLCAweEM0QzEsIDB4QzRDMiwgMHhDNEMzLCAweEM0QzQsIDB4QzRDNSwgMHhDNEM2LAotICAgIDB4QzRDNywgMHhDNEM4LCAweEM0QzksIDB4QzRDQSwgMHhDNENCLCAweEM0Q0MsIDB4QzRDRCwgMHhDNENFLAotICAgIDB4QzRDRiwgMHhDNEQwLCAweEM0RDEsIDB4QzREMiwgMHhDNEQzLCAweEM0RDQsIDB4QzRENSwgMHhDNEQ2LAotICAgIDB4QzRENywgMHhDNEQ4LCAweEM0RDksIDB4QzREQSwgMHhDNERCLCAweEM0REMsIDB4QzRERCwgMHhDNERFLAotICAgIDB4QzRERiwgMHhDNEUwLCAweEM0RTEsIDB4QzRFMiwgMHhDNEUzLCAweEM0RTQsIDB4QzRFNSwgMHhDNEU2LAotICAgIDB4QzRFNywgMHhDNEU4LCAweEM0RUEsIDB4QzRFQiwgMHhDNEVDLCAweEM0RUQsIDB4QzRFRSwgMHhDNEVGLAotICAgIDB4QzRGMiwgMHhDNEYzLCAweEM0RjUsIDB4QzRGNiwgMHhDNEY3LCAweEM0RjksIDB4QzRGQiwgMHhDNEZDLAotICAgIDB4QzRGRCwgMHhDNEZFLCAweEM1MDIsIDB4QzUwMywgMHhDNTA0LCAweEM1MDUsIDB4QzUwNiwgMHhDNTA3LAotICAgIDB4QzUwOCwgMHhDNTA5LCAweEM1MEEsIDB4QzUwQiwgMHhDNTBELCAweEM1MEUsIDB4QzUwRiwgMHhDNTExLAotICAgIDB4QzUxMiwgMHhDNTEzLCAweEM1MTUsIDB4QzUxNiwgMHhDNTE3LCAweEM1MTgsIDB4QzUxOSwgMHhDNTFBLAotICAgIDB4QzUxQiwgMHhDNTFELCAweEM1MUUsIDB4QzUxRiwgMHhDNTIwLCAweEM1MjEsIDB4QzUyMiwgMHhDNTIzLAotICAgIDB4QzUyNCwgMHhDNTI1LCAweEM1MjYsIDB4QzUyNywgMHhDNTJBLCAweEM1MkIsIDB4QzUyRCwgMHhDNTJFLAotICAgIDB4QzUyRiwgMHhDNTMxLCAweEM1MzIsIDB4QzUzMywgMHhDNTM0LCAweEM1MzUsIDB4QzUzNiwgMHhDNTM3LAotICAgIDB4QzUzQSwgMHhDNTNDLCAweEM1M0UsIDB4QzUzRiwgMHhDNTQwLCAweEM1NDEsIDB4QzU0MiwgMHhDNTQzLAotICAgIDB4QzU0NiwgMHhDNTQ3LCAweEM1NEIsIDB4QzU0RiwgMHhDNTUwLCAweEM1NTEsIDB4QzU1MiwgMHhDNTU2LAotICAgIDB4QzU1QSwgMHhDNTVCLCAweEM1NUMsIDB4QzU1RiwgMHhDNTYyLCAweEM1NjMsIDB4QzU2NSwgMHhDNTY2LAotICAgIDB4QzU2NywgMHhDNTY5LCAweEM1NkEsIDB4QzU2QiwgMHhDNTZDLCAweEM1NkQsIDB4QzU2RSwgMHhDNTZGLAotICAgIDB4QzU3MiwgMHhDNTc2LCAweEM1NzcsIDB4QzU3OCwgMHhDNTc5LCAweEM1N0EsIDB4QzU3QiwgMHhDNTdFLAotICAgIDB4QzU3RiwgMHhDNTgxLCAweEM1ODIsIDB4QzU4MywgMHhDNTg1LCAweEM1ODYsIDB4QzU4OCwgMHhDNTg5LAotICAgIDB4QzU4QSwgMHhDNThCLCAweEM1OEUsIDB4QzU5MCwgMHhDNTkyLCAweEM1OTMsIDB4QzU5NCwgMHhDNTk2LAotICAgIDB4QzU5OSwgMHhDNTlBLCAweEM1OUIsIDB4QzU5RCwgMHhDNTlFLCAweEM1OUYsIDB4QzVBMSwgMHhDNUEyLAotICAgIDB4QzVBMywgMHhDNUE0LCAweEM1QTUsIDB4QzVBNiwgMHhDNUE3LCAweEM1QTgsIDB4QzVBQSwgMHhDNUFCLAotICAgIDB4QzVBQywgMHhDNUFELCAweEM1QUUsIDB4QzVBRiwgMHhDNUIwLCAweEM1QjEsIDB4QzVCMiwgMHhDNUIzLAotICAgIDB4QzVCNiwgMHhDNUI3LCAweEM1QkEsIDB4QzVCRiwgMHhDNUMwLCAweEM1QzEsIDB4QzVDMiwgMHhDNUMzLAotICAgIDB4QzVDQiwgMHhDNUNELCAweEM1Q0YsIDB4QzVEMiwgMHhDNUQzLCAweEM1RDUsIDB4QzVENiwgMHhDNUQ3LAotICAgIDB4QzVEOSwgMHhDNURBLCAweEM1REIsIDB4QzVEQywgMHhDNURELCAweEM1REUsIDB4QzVERiwgMHhDNUUyLAotICAgIDB4QzVFNCwgMHhDNUU2LCAweEM1RTcsIDB4QzVFOCwgMHhDNUU5LCAweEM1RUEsIDB4QzVFQiwgMHhDNUVGLAotICAgIDB4QzVGMSwgMHhDNUYyLCAweEM1RjMsIDB4QzVGNSwgMHhDNUY4LCAweEM1RjksIDB4QzVGQSwgMHhDNUZCLAotICAgIDB4QzYwMiwgMHhDNjAzLCAweEM2MDQsIDB4QzYwOSwgMHhDNjBBLCAweEM2MEIsIDB4QzYwRCwgMHhDNjBFLAotICAgIDB4QzYwRiwgMHhDNjExLCAweEM2MTIsIDB4QzYxMywgMHhDNjE0LCAweEM2MTUsIDB4QzYxNiwgMHhDNjE3LAotICAgIDB4QzYxQSwgMHhDNjFELCAweEM2MUUsIDB4QzYxRiwgMHhDNjIwLCAweEM2MjEsIDB4QzYyMiwgMHhDNjIzLAotICAgIDB4QzYyNiwgMHhDNjI3LCAweEM2MjksIDB4QzYyQSwgMHhDNjJCLCAweEM2MkYsIDB4QzYzMSwgMHhDNjMyLAotICAgIDB4QzYzNiwgMHhDNjM4LCAweEM2M0EsIDB4QzYzQywgMHhDNjNELCAweEM2M0UsIDB4QzYzRiwgMHhDNjQyLAotICAgIDB4QzY0MywgMHhDNjQ1LCAweEM2NDYsIDB4QzY0NywgMHhDNjQ5LCAweEM2NEEsIDB4QzY0QiwgMHhDNjRDLAotICAgIDB4QzY0RCwgMHhDNjRFLCAweEM2NEYsIDB4QzY1MiwgMHhDNjU2LCAweEM2NTcsIDB4QzY1OCwgMHhDNjU5LAotICAgIDB4QzY1QSwgMHhDNjVCLCAweEM2NUUsIDB4QzY1RiwgMHhDNjYxLCAweEM2NjIsIDB4QzY2MywgMHhDNjY0LAotICAgIDB4QzY2NSwgMHhDNjY2LCAweEM2NjcsIDB4QzY2OCwgMHhDNjY5LCAweEM2NkEsIDB4QzY2QiwgMHhDNjZELAotICAgIDB4QzY2RSwgMHhDNjcwLCAweEM2NzIsIDB4QzY3MywgMHhDNjc0LCAweEM2NzUsIDB4QzY3NiwgMHhDNjc3LAotICAgIDB4QzY3QSwgMHhDNjdCLCAweEM2N0QsIDB4QzY3RSwgMHhDNjdGLCAweEM2ODEsIDB4QzY4MiwgMHhDNjgzLAotICAgIDB4QzY4NCwgMHhDNjg1LCAweEM2ODYsIDB4QzY4NywgMHhDNjhBLCAweEM2OEMsIDB4QzY4RSwgMHhDNjhGLAotICAgIDB4QzY5MCwgMHhDNjkxLCAweEM2OTIsIDB4QzY5MywgMHhDNjk2LCAweEM2OTcsIDB4QzY5OSwgMHhDNjlBLAotICAgIDB4QzY5QiwgMHhDNjlELCAweEM2OUUsIDB4QzY5RiwgMHhDNkEwLCAweEM2QTEsIDB4QzZBMiwgMHhDNkEzLAotICAgIDB4QzZBNiwgMHhDNkE4LCAweEM2QUEsIDB4QzZBQiwgMHhDNkFDLCAweEM2QUQsIDB4QzZBRSwgMHhDNkFGLAotICAgIDB4QzZCMiwgMHhDNkIzLCAweEM2QjUsIDB4QzZCNiwgMHhDNkI3LCAweEM2QkIsIDB4QzZCQywgMHhDNkJELAotICAgIDB4QzZCRSwgMHhDNkJGLCAweEM2QzIsIDB4QzZDNCwgMHhDNkM2LCAweEM2QzcsIDB4QzZDOCwgMHhDNkM5LAotICAgIDB4QzZDQSwgMHhDNkNCLCAweEM2Q0UsIDB4QzZDRiwgMHhDNkQxLCAweEM2RDIsIDB4QzZEMywgMHhDNkQ1LAotICAgIDB4QzZENiwgMHhDNkQ3LCAweEM2RDgsIDB4QzZEOSwgMHhDNkRBLCAweEM2REIsIDB4QzZERSwgMHhDNkRGLAotICAgIDB4QzZFMiwgMHhDNkUzLCAweEM2RTQsIDB4QzZFNSwgMHhDNkU2LCAweEM2RTcsIDB4QzZFQSwgMHhDNkVCLAotICAgIDB4QzZFRCwgMHhDNkVFLCAweEM2RUYsIDB4QzZGMSwgMHhDNkYyLCAweEM2RjMsIDB4QzZGNCwgMHhDNkY1LAotICAgIDB4QzZGNiwgMHhDNkY3LCAweEM2RkEsIDB4QzZGQiwgMHhDNkZDLCAweEM2RkUsIDB4QzZGRiwgMHhDNzAwLAotICAgIDB4QzcwMSwgMHhDNzAyLCAweEM3MDMsIDB4QzcwNiwgMHhDNzA3LCAweEM3MDksIDB4QzcwQSwgMHhDNzBCLAotICAgIDB4QzcwRCwgMHhDNzBFLCAweEM3MEYsIDB4QzcxMCwgMHhDNzExLCAweEM3MTIsIDB4QzcxMywgMHhDNzE2LAotICAgIDB4QzcxOCwgMHhDNzFBLCAweEM3MUIsIDB4QzcxQywgMHhDNzFELCAweEM3MUUsIDB4QzcxRiwgMHhDNzIyLAotICAgIDB4QzcyMywgMHhDNzI1LCAweEM3MjYsIDB4QzcyNywgMHhDNzI5LCAweEM3MkEsIDB4QzcyQiwgMHhDNzJDLAotICAgIDB4QzcyRCwgMHhDNzJFLCAweEM3MkYsIDB4QzczMiwgMHhDNzM0LCAweEM3MzYsIDB4QzczOCwgMHhDNzM5LAotICAgIDB4QzczQSwgMHhDNzNCLCAweEM3M0UsIDB4QzczRiwgMHhDNzQxLCAweEM3NDIsIDB4Qzc0MywgMHhDNzQ1LAotICAgIDB4Qzc0NiwgMHhDNzQ3LCAweEM3NDgsIDB4Qzc0OSwgMHhDNzRCLCAweEM3NEUsIDB4Qzc1MCwgMHhDNzU5LAotICAgIDB4Qzc1QSwgMHhDNzVCLCAweEM3NUQsIDB4Qzc1RSwgMHhDNzVGLCAweEM3NjEsIDB4Qzc2MiwgMHhDNzYzLAotICAgIDB4Qzc2NCwgMHhDNzY1LCAweEM3NjYsIDB4Qzc2NywgMHhDNzY5LCAweEM3NkEsIDB4Qzc2QywgMHhDNzZELAotICAgIDB4Qzc2RSwgMHhDNzZGLCAweEM3NzAsIDB4Qzc3MSwgMHhDNzcyLCAweEM3NzMsIDB4Qzc3NiwgMHhDNzc3LAotICAgIDB4Qzc3OSwgMHhDNzdBLCAweEM3N0IsIDB4Qzc3RiwgMHhDNzgwLCAweEM3ODEsIDB4Qzc4MiwgMHhDNzg2LAotICAgIDB4Qzc4QiwgMHhDNzhDLCAweEM3OEQsIDB4Qzc4RiwgMHhDNzkyLCAweEM3OTMsIDB4Qzc5NSwgMHhDNzk5LAotICAgIDB4Qzc5QiwgMHhDNzlDLCAweEM3OUQsIDB4Qzc5RSwgMHhDNzlGLCAweEM3QTIsIDB4QzdBNywgMHhDN0E4LAotICAgIDB4QzdBOSwgMHhDN0FBLCAweEM3QUIsIDB4QzdBRSwgMHhDN0FGLCAweEM3QjEsIDB4QzdCMiwgMHhDN0IzLAotICAgIDB4QzdCNSwgMHhDN0I2LCAweEM3QjcsIDB4QzdCOCwgMHhDN0I5LCAweEM3QkEsIDB4QzdCQiwgMHhDN0JFLAotICAgIDB4QzdDMiwgMHhDN0MzLCAweEM3QzQsIDB4QzdDNSwgMHhDN0M2LCAweEM3QzcsIDB4QzdDQSwgMHhDN0NCLAotICAgIDB4QzdDRCwgMHhDN0NGLCAweEM3RDEsIDB4QzdEMiwgMHhDN0QzLCAweEM3RDQsIDB4QzdENSwgMHhDN0Q2LAotICAgIDB4QzdENywgMHhDN0Q5LCAweEM3REEsIDB4QzdEQiwgMHhDN0RDLCAweEM3REUsIDB4QzdERiwgMHhDN0UwLAotICAgIDB4QzdFMSwgMHhDN0UyLCAweEM3RTMsIDB4QzdFNSwgMHhDN0U2LCAweEM3RTcsIDB4QzdFOSwgMHhDN0VBLAotICAgIDB4QzdFQiwgMHhDN0VELCAweEM3RUUsIDB4QzdFRiwgMHhDN0YwLCAweEM3RjEsIDB4QzdGMiwgMHhDN0YzLAotICAgIDB4QzdGNCwgMHhDN0Y1LCAweEM3RjYsIDB4QzdGNywgMHhDN0Y4LCAweEM3RjksIDB4QzdGQSwgMHhDN0ZCLAotICAgIDB4QzdGQywgMHhDN0ZELCAweEM3RkUsIDB4QzdGRiwgMHhDODAyLCAweEM4MDMsIDB4QzgwNSwgMHhDODA2LAotICAgIDB4QzgwNywgMHhDODA5LCAweEM4MEIsIDB4QzgwQywgMHhDODBELCAweEM4MEUsIDB4QzgwRiwgMHhDODEyLAotICAgIDB4QzgxNCwgMHhDODE3LCAweEM4MTgsIDB4QzgxOSwgMHhDODFBLCAweEM4MUIsIDB4QzgxRSwgMHhDODFGLAotICAgIDB4QzgyMSwgMHhDODIyLCAweEM4MjMsIDB4QzgyNSwgMHhDODI2LCAweEM4MjcsIDB4QzgyOCwgMHhDODI5LAotICAgIDB4QzgyQSwgMHhDODJCLCAweEM4MkUsIDB4QzgzMCwgMHhDODMyLCAweEM4MzMsIDB4QzgzNCwgMHhDODM1LAotICAgIDB4QzgzNiwgMHhDODM3LCAweEM4MzksIDB4QzgzQSwgMHhDODNCLCAweEM4M0QsIDB4QzgzRSwgMHhDODNGLAotICAgIDB4Qzg0MSwgMHhDODQyLCAweEM4NDMsIDB4Qzg0NCwgMHhDODQ1LCAweEM4NDYsIDB4Qzg0NywgMHhDODRBLAotICAgIDB4Qzg0QiwgMHhDODRFLCAweEM4NEYsIDB4Qzg1MCwgMHhDODUxLCAweEM4NTIsIDB4Qzg1MywgMHhDODU1LAotICAgIDB4Qzg1NiwgMHhDODU3LCAweEM4NTgsIDB4Qzg1OSwgMHhDODVBLCAweEM4NUIsIDB4Qzg1QywgMHhDODVELAotICAgIDB4Qzg1RSwgMHhDODVGLCAweEM4NjAsIDB4Qzg2MSwgMHhDODYyLCAweEM4NjMsIDB4Qzg2NCwgMHhDODY1LAotICAgIDB4Qzg2NiwgMHhDODY3LCAweEM4NjgsIDB4Qzg2OSwgMHhDODZBLCAweEM4NkIsIDB4Qzg2QywgMHhDODZELAotICAgIDB4Qzg2RSwgMHhDODZGLCAweEM4NzIsIDB4Qzg3MywgMHhDODc1LCAweEM4NzYsIDB4Qzg3NywgMHhDODc5LAotICAgIDB4Qzg3QiwgMHhDODdDLCAweEM4N0QsIDB4Qzg3RSwgMHhDODdGLCAweEM4ODIsIDB4Qzg4NCwgMHhDODg4LAotICAgIDB4Qzg4OSwgMHhDODhBLCAweEM4OEUsIDB4Qzg4RiwgMHhDODkwLCAweEM4OTEsIDB4Qzg5MiwgMHhDODkzLAotICAgIDB4Qzg5NSwgMHhDODk2LCAweEM4OTcsIDB4Qzg5OCwgMHhDODk5LCAweEM4OUEsIDB4Qzg5QiwgMHhDODlDLAotICAgIDB4Qzg5RSwgMHhDOEEwLCAweEM4QTIsIDB4QzhBMywgMHhDOEE0LCAweEM4QTUsIDB4QzhBNiwgMHhDOEE3LAotICAgIDB4QzhBOSwgMHhDOEFBLCAweEM4QUIsIDB4QzhBQywgMHhDOEFELCAweEM4QUUsIDB4QzhBRiwgMHhDOEIwLAotICAgIDB4QzhCMSwgMHhDOEIyLCAweEM4QjMsIDB4QzhCNCwgMHhDOEI1LCAweEM4QjYsIDB4QzhCNywgMHhDOEI4LAotICAgIDB4QzhCOSwgMHhDOEJBLCAweEM4QkIsIDB4QzhCRSwgMHhDOEJGLCAweEM4QzAsIDB4QzhDMSwgMHhDOEMyLAotICAgIDB4QzhDMywgMHhDOEM1LCAweEM4QzYsIDB4QzhDNywgMHhDOEM5LCAweEM4Q0EsIDB4QzhDQiwgMHhDOENELAotICAgIDB4QzhDRSwgMHhDOENGLCAweEM4RDAsIDB4QzhEMSwgMHhDOEQyLCAweEM4RDMsIDB4QzhENiwgMHhDOEQ4LAotICAgIDB4QzhEQSwgMHhDOERCLCAweEM4REMsIDB4QzhERCwgMHhDOERFLCAweEM4REYsIDB4QzhFMiwgMHhDOEUzLAotICAgIDB4QzhFNSwgMHhDOEU2LCAweEM4RTcsIDB4QzhFOCwgMHhDOEU5LCAweEM4RUEsIDB4QzhFQiwgMHhDOEVDLAotICAgIDB4QzhFRCwgMHhDOEVFLCAweEM4RUYsIDB4QzhGMCwgMHhDOEYxLCAweEM4RjIsIDB4QzhGMywgMHhDOEY0LAotICAgIDB4QzhGNiwgMHhDOEY3LCAweEM4RjgsIDB4QzhGOSwgMHhDOEZBLCAweEM4RkIsIDB4QzhGRSwgMHhDOEZGLAotICAgIDB4QzkwMSwgMHhDOTAyLCAweEM5MDMsIDB4QzkwNywgMHhDOTA4LCAweEM5MDksIDB4QzkwQSwgMHhDOTBCLAotICAgIDB4QzkwRSwgMHhDOTEwLCAweEM5MTIsIDB4QzkxMywgMHhDOTE0LCAweEM5MTUsIDB4QzkxNiwgMHhDOTE3LAotICAgIDB4QzkxOSwgMHhDOTFBLCAweEM5MUIsIDB4QzkxQywgMHhDOTFELCAweEM5MUUsIDB4QzkxRiwgMHhDOTIwLAotICAgIDB4QzkyMSwgMHhDOTIyLCAweEM5MjMsIDB4QzkyNCwgMHhDOTI1LCAweEM5MjYsIDB4QzkyNywgMHhDOTI4LAotICAgIDB4QzkyOSwgMHhDOTJBLCAweEM5MkIsIDB4QzkyRCwgMHhDOTJFLCAweEM5MkYsIDB4QzkzMCwgMHhDOTMxLAotICAgIDB4QzkzMiwgMHhDOTMzLCAweEM5MzUsIDB4QzkzNiwgMHhDOTM3LCAweEM5MzgsIDB4QzkzOSwgMHhDOTNBLAotICAgIDB4QzkzQiwgMHhDOTNDLCAweEM5M0QsIDB4QzkzRSwgMHhDOTNGLCAweEM5NDAsIDB4Qzk0MSwgMHhDOTQyLAotICAgIDB4Qzk0MywgMHhDOTQ0LCAweEM5NDUsIDB4Qzk0NiwgMHhDOTQ3LCAweEM5NDgsIDB4Qzk0OSwgMHhDOTRBLAotICAgIDB4Qzk0QiwgMHhDOTRDLCAweEM5NEQsIDB4Qzk0RSwgMHhDOTRGLCAweEM5NTIsIDB4Qzk1MywgMHhDOTU1LAotICAgIDB4Qzk1NiwgMHhDOTU3LCAweEM5NTksIDB4Qzk1QSwgMHhDOTVCLCAweEM5NUMsIDB4Qzk1RCwgMHhDOTVFLAotICAgIDB4Qzk1RiwgMHhDOTYyLCAweEM5NjQsIDB4Qzk2NSwgMHhDOTY2LCAweEM5NjcsIDB4Qzk2OCwgMHhDOTY5LAotICAgIDB4Qzk2QSwgMHhDOTZCLCAweEM5NkQsIDB4Qzk2RSwgMHhDOTZGLCAweEM5NzEsIDB4Qzk3MiwgMHhDOTczLAotICAgIDB4Qzk3NSwgMHhDOTc2LCAweEM5NzcsIDB4Qzk3OCwgMHhDOTc5LCAweEM5N0EsIDB4Qzk3QiwgMHhDOTdELAotICAgIDB4Qzk3RSwgMHhDOTdGLCAweEM5ODAsIDB4Qzk4MSwgMHhDOTgyLCAweEM5ODMsIDB4Qzk4NCwgMHhDOTg1LAotICAgIDB4Qzk4NiwgMHhDOTg3LCAweEM5OEEsIDB4Qzk4QiwgMHhDOThELCAweEM5OEUsIDB4Qzk4RiwgMHhDOTkxLAotICAgIDB4Qzk5MiwgMHhDOTkzLCAweEM5OTQsIDB4Qzk5NSwgMHhDOTk2LCAweEM5OTcsIDB4Qzk5QSwgMHhDOTlDLAotICAgIDB4Qzk5RSwgMHhDOTlGLCAweEM5QTAsIDB4QzlBMSwgMHhDOUEyLCAweEM5QTMsIDB4QzlBNCwgMHhDOUE1LAotICAgIDB4QzlBNiwgMHhDOUE3LCAweEM5QTgsIDB4QzlBOSwgMHhDOUFBLCAweEM5QUIsIDB4QzlBQywgMHhDOUFELAotICAgIDB4QzlBRSwgMHhDOUFGLCAweEM5QjAsIDB4QzlCMSwgMHhDOUIyLCAweEM5QjMsIDB4QzlCNCwgMHhDOUI1LAotICAgIDB4QzlCNiwgMHhDOUI3LCAweEM5QjgsIDB4QzlCOSwgMHhDOUJBLCAweEM5QkIsIDB4QzlCQywgMHhDOUJELAotICAgIDB4QzlCRSwgMHhDOUJGLCAweEM5QzIsIDB4QzlDMywgMHhDOUM1LCAweEM5QzYsIDB4QzlDOSwgMHhDOUNCLAotICAgIDB4QzlDQywgMHhDOUNELCAweEM5Q0UsIDB4QzlDRiwgMHhDOUQyLCAweEM5RDQsIDB4QzlENywgMHhDOUQ4LAotICAgIDB4QzlEQiwgMHhDOURFLCAweEM5REYsIDB4QzlFMSwgMHhDOUUzLCAweEM5RTUsIDB4QzlFNiwgMHhDOUU4LAotICAgIDB4QzlFOSwgMHhDOUVBLCAweEM5RUIsIDB4QzlFRSwgMHhDOUYyLCAweEM5RjMsIDB4QzlGNCwgMHhDOUY1LAotICAgIDB4QzlGNiwgMHhDOUY3LCAweEM5RkEsIDB4QzlGQiwgMHhDOUZELCAweEM5RkUsIDB4QzlGRiwgMHhDQTAxLAotICAgIDB4Q0EwMiwgMHhDQTAzLCAweENBMDQsIDB4Q0EwNSwgMHhDQTA2LCAweENBMDcsIDB4Q0EwQSwgMHhDQTBFLAotICAgIDB4Q0EwRiwgMHhDQTEwLCAweENBMTEsIDB4Q0ExMiwgMHhDQTEzLCAweENBMTUsIDB4Q0ExNiwgMHhDQTE3LAotICAgIDB4Q0ExOSwgMHhDQTFBLCAweENBMUIsIDB4Q0ExQywgMHhDQTFELCAweENBMUUsIDB4Q0ExRiwgMHhDQTIwLAotICAgIDB4Q0EyMSwgMHhDQTIyLCAweENBMjMsIDB4Q0EyNCwgMHhDQTI1LCAweENBMjYsIDB4Q0EyNywgMHhDQTI4LAotICAgIDB4Q0EyQSwgMHhDQTJCLCAweENBMkMsIDB4Q0EyRCwgMHhDQTJFLCAweENBMkYsIDB4Q0EzMCwgMHhDQTMxLAotICAgIDB4Q0EzMiwgMHhDQTMzLCAweENBMzQsIDB4Q0EzNSwgMHhDQTM2LCAweENBMzcsIDB4Q0EzOCwgMHhDQTM5LAotICAgIDB4Q0EzQSwgMHhDQTNCLCAweENBM0MsIDB4Q0EzRCwgMHhDQTNFLCAweENBM0YsIDB4Q0E0MCwgMHhDQTQxLAotICAgIDB4Q0E0MiwgMHhDQTQzLCAweENBNDQsIDB4Q0E0NSwgMHhDQTQ2LCAweENBNDcsIDB4Q0E0OCwgMHhDQTQ5LAotICAgIDB4Q0E0QSwgMHhDQTRCLCAweENBNEUsIDB4Q0E0RiwgMHhDQTUxLCAweENBNTIsIDB4Q0E1MywgMHhDQTU1LAotICAgIDB4Q0E1NiwgMHhDQTU3LCAweENBNTgsIDB4Q0E1OSwgMHhDQTVBLCAweENBNUIsIDB4Q0E1RSwgMHhDQTYyLAotICAgIDB4Q0E2MywgMHhDQTY0LCAweENBNjUsIDB4Q0E2NiwgMHhDQTY3LCAweENBNjksIDB4Q0E2QSwgMHhDQTZCLAotICAgIDB4Q0E2QywgMHhDQTZELCAweENBNkUsIDB4Q0E2RiwgMHhDQTcwLCAweENBNzEsIDB4Q0E3MiwgMHhDQTczLAotICAgIDB4Q0E3NCwgMHhDQTc1LCAweENBNzYsIDB4Q0E3NywgMHhDQTc4LCAweENBNzksIDB4Q0E3QSwgMHhDQTdCLAotICAgIDB4Q0E3QywgMHhDQTdFLCAweENBN0YsIDB4Q0E4MCwgMHhDQTgxLCAweENBODIsIDB4Q0E4MywgMHhDQTg1LAotICAgIDB4Q0E4NiwgMHhDQTg3LCAweENBODgsIDB4Q0E4OSwgMHhDQThBLCAweENBOEIsIDB4Q0E4QywgMHhDQThELAotICAgIDB4Q0E4RSwgMHhDQThGLCAweENBOTAsIDB4Q0E5MSwgMHhDQTkyLCAweENBOTMsIDB4Q0E5NCwgMHhDQTk1LAotICAgIDB4Q0E5NiwgMHhDQTk3LCAweENBOTksIDB4Q0E5QSwgMHhDQTlCLCAweENBOUMsIDB4Q0E5RCwgMHhDQTlFLAotICAgIDB4Q0E5RiwgMHhDQUEwLCAweENBQTEsIDB4Q0FBMiwgMHhDQUEzLCAweENBQTQsIDB4Q0FBNSwgMHhDQUE2LAotICAgIDB4Q0FBNywgMHhDQUE4LCAweENBQTksIDB4Q0FBQSwgMHhDQUFCLCAweENBQUMsIDB4Q0FBRCwgMHhDQUFFLAotICAgIDB4Q0FBRiwgMHhDQUIwLCAweENBQjEsIDB4Q0FCMiwgMHhDQUIzLCAweENBQjQsIDB4Q0FCNSwgMHhDQUI2LAotICAgIDB4Q0FCNywgMHhDQUI4LCAweENBQjksIDB4Q0FCQSwgMHhDQUJCLCAweENBQkUsIDB4Q0FCRiwgMHhDQUMxLAotICAgIDB4Q0FDMiwgMHhDQUMzLCAweENBQzUsIDB4Q0FDNiwgMHhDQUM3LCAweENBQzgsIDB4Q0FDOSwgMHhDQUNBLAotICAgIDB4Q0FDQiwgMHhDQUNFLCAweENBRDAsIDB4Q0FEMiwgMHhDQUQ0LCAweENBRDUsIDB4Q0FENiwgMHhDQUQ3LAotICAgIDB4Q0FEQSwgMHhDQURCLCAweENBREMsIDB4Q0FERCwgMHhDQURFLCAweENBREYsIDB4Q0FFMSwgMHhDQUUyLAotICAgIDB4Q0FFMywgMHhDQUU0LCAweENBRTUsIDB4Q0FFNiwgMHhDQUU3LCAweENBRTgsIDB4Q0FFOSwgMHhDQUVBLAotICAgIDB4Q0FFQiwgMHhDQUVELCAweENBRUUsIDB4Q0FFRiwgMHhDQUYwLCAweENBRjEsIDB4Q0FGMiwgMHhDQUYzLAotICAgIDB4Q0FGNSwgMHhDQUY2LCAweENBRjcsIDB4Q0FGOCwgMHhDQUY5LCAweENBRkEsIDB4Q0FGQiwgMHhDQUZDLAotICAgIDB4Q0FGRCwgMHhDQUZFLCAweENBRkYsIDB4Q0IwMCwgMHhDQjAxLCAweENCMDIsIDB4Q0IwMywgMHhDQjA0LAotICAgIDB4Q0IwNSwgMHhDQjA2LCAweENCMDcsIDB4Q0IwOSwgMHhDQjBBLCAweENCMEIsIDB4Q0IwQywgMHhDQjBELAotICAgIDB4Q0IwRSwgMHhDQjBGLCAweENCMTEsIDB4Q0IxMiwgMHhDQjEzLCAweENCMTUsIDB4Q0IxNiwgMHhDQjE3LAotICAgIDB4Q0IxOSwgMHhDQjFBLCAweENCMUIsIDB4Q0IxQywgMHhDQjFELCAweENCMUUsIDB4Q0IxRiwgMHhDQjIyLAotICAgIDB4Q0IyMywgMHhDQjI0LCAweENCMjUsIDB4Q0IyNiwgMHhDQjI3LCAweENCMjgsIDB4Q0IyOSwgMHhDQjJBLAotICAgIDB4Q0IyQiwgMHhDQjJDLCAweENCMkQsIDB4Q0IyRSwgMHhDQjJGLCAweENCMzAsIDB4Q0IzMSwgMHhDQjMyLAotICAgIDB4Q0IzMywgMHhDQjM0LCAweENCMzUsIDB4Q0IzNiwgMHhDQjM3LCAweENCMzgsIDB4Q0IzOSwgMHhDQjNBLAotICAgIDB4Q0IzQiwgMHhDQjNDLCAweENCM0QsIDB4Q0IzRSwgMHhDQjNGLCAweENCNDAsIDB4Q0I0MiwgMHhDQjQzLAotICAgIDB4Q0I0NCwgMHhDQjQ1LCAweENCNDYsIDB4Q0I0NywgMHhDQjRBLCAweENCNEIsIDB4Q0I0RCwgMHhDQjRFLAotICAgIDB4Q0I0RiwgMHhDQjUxLCAweENCNTIsIDB4Q0I1MywgMHhDQjU0LCAweENCNTUsIDB4Q0I1NiwgMHhDQjU3LAotICAgIDB4Q0I1QSwgMHhDQjVCLCAweENCNUMsIDB4Q0I1RSwgMHhDQjVGLCAweENCNjAsIDB4Q0I2MSwgMHhDQjYyLAotICAgIDB4Q0I2MywgMHhDQjY1LCAweENCNjYsIDB4Q0I2NywgMHhDQjY4LCAweENCNjksIDB4Q0I2QSwgMHhDQjZCLAotICAgIDB4Q0I2QywgMHhDQjZELCAweENCNkUsIDB4Q0I2RiwgMHhDQjcwLCAweENCNzEsIDB4Q0I3MiwgMHhDQjczLAotICAgIDB4Q0I3NCwgMHhDQjc1LCAweENCNzYsIDB4Q0I3NywgMHhDQjdBLCAweENCN0IsIDB4Q0I3QywgMHhDQjdELAotICAgIDB4Q0I3RSwgMHhDQjdGLCAweENCODAsIDB4Q0I4MSwgMHhDQjgyLCAweENCODMsIDB4Q0I4NCwgMHhDQjg1LAotICAgIDB4Q0I4NiwgMHhDQjg3LCAweENCODgsIDB4Q0I4OSwgMHhDQjhBLCAweENCOEIsIDB4Q0I4QywgMHhDQjhELAotICAgIDB4Q0I4RSwgMHhDQjhGLCAweENCOTAsIDB4Q0I5MSwgMHhDQjkyLCAweENCOTMsIDB4Q0I5NCwgMHhDQjk1LAotICAgIDB4Q0I5NiwgMHhDQjk3LCAweENCOTgsIDB4Q0I5OSwgMHhDQjlBLCAweENCOUIsIDB4Q0I5RCwgMHhDQjlFLAotICAgIDB4Q0I5RiwgMHhDQkEwLCAweENCQTEsIDB4Q0JBMiwgMHhDQkEzLCAweENCQTQsIDB4Q0JBNSwgMHhDQkE2LAotICAgIDB4Q0JBNywgMHhDQkE4LCAweENCQTksIDB4Q0JBQSwgMHhDQkFCLCAweENCQUMsIDB4Q0JBRCwgMHhDQkFFLAotICAgIDB4Q0JBRiwgMHhDQkIwLCAweENCQjEsIDB4Q0JCMiwgMHhDQkIzLCAweENCQjQsIDB4Q0JCNSwgMHhDQkI2LAotICAgIDB4Q0JCNywgMHhDQkI5LCAweENCQkEsIDB4Q0JCQiwgMHhDQkJDLCAweENCQkQsIDB4Q0JCRSwgMHhDQkJGLAotICAgIDB4Q0JDMCwgMHhDQkMxLCAweENCQzIsIDB4Q0JDMywgMHhDQkM0LCAweENCQzUsIDB4Q0JDNiwgMHhDQkM3LAotICAgIDB4Q0JDOCwgMHhDQkM5LCAweENCQ0EsIDB4Q0JDQiwgMHhDQkNDLCAweENCQ0QsIDB4Q0JDRSwgMHhDQkNGLAotICAgIDB4Q0JEMCwgMHhDQkQxLCAweENCRDIsIDB4Q0JEMywgMHhDQkQ1LCAweENCRDYsIDB4Q0JENywgMHhDQkQ4LAotICAgIDB4Q0JEOSwgMHhDQkRBLCAweENCREIsIDB4Q0JEQywgMHhDQkRELCAweENCREUsIDB4Q0JERiwgMHhDQkUwLAotICAgIDB4Q0JFMSwgMHhDQkUyLCAweENCRTMsIDB4Q0JFNSwgMHhDQkU2LCAweENCRTgsIDB4Q0JFQSwgMHhDQkVCLAotICAgIDB4Q0JFQywgMHhDQkVELCAweENCRUUsIDB4Q0JFRiwgMHhDQkYwLCAweENCRjEsIDB4Q0JGMiwgMHhDQkYzLAotICAgIDB4Q0JGNCwgMHhDQkY1LCAweENCRjYsIDB4Q0JGNywgMHhDQkY4LCAweENCRjksIDB4Q0JGQSwgMHhDQkZCLAotICAgIDB4Q0JGQywgMHhDQkZELCAweENCRkUsIDB4Q0JGRiwgMHhDQzAwLCAweENDMDEsIDB4Q0MwMiwgMHhDQzAzLAotICAgIDB4Q0MwNCwgMHhDQzA1LCAweENDMDYsIDB4Q0MwNywgMHhDQzA4LCAweENDMDksIDB4Q0MwQSwgMHhDQzBCLAotICAgIDB4Q0MwRSwgMHhDQzBGLCAweENDMTEsIDB4Q0MxMiwgMHhDQzEzLCAweENDMTUsIDB4Q0MxNiwgMHhDQzE3LAotICAgIDB4Q0MxOCwgMHhDQzE5LCAweENDMUEsIDB4Q0MxQiwgMHhDQzFFLCAweENDMUYsIDB4Q0MyMCwgMHhDQzIzLAotICAgIDB4Q0MyNCwgMHhDQzI1LCAweENDMjYsIDB4Q0MyQSwgMHhDQzJCLCAweENDMkQsIDB4Q0MyRiwgMHhDQzMxLAotICAgIDB4Q0MzMiwgMHhDQzMzLCAweENDMzQsIDB4Q0MzNSwgMHhDQzM2LCAweENDMzcsIDB4Q0MzQSwgMHhDQzNGLAotICAgIDB4Q0M0MCwgMHhDQzQxLCAweENDNDIsIDB4Q0M0MywgMHhDQzQ2LCAweENDNDcsIDB4Q0M0OSwgMHhDQzRBLAotICAgIDB4Q0M0QiwgMHhDQzRELCAweENDNEUsIDB4Q0M0RiwgMHhDQzUwLCAweENDNTEsIDB4Q0M1MiwgMHhDQzUzLAotICAgIDB4Q0M1NiwgMHhDQzVBLCAweENDNUIsIDB4Q0M1QywgMHhDQzVELCAweENDNUUsIDB4Q0M1RiwgMHhDQzYxLAotICAgIDB4Q0M2MiwgMHhDQzYzLCAweENDNjUsIDB4Q0M2NywgMHhDQzY5LCAweENDNkEsIDB4Q0M2QiwgMHhDQzZDLAotICAgIDB4Q0M2RCwgMHhDQzZFLCAweENDNkYsIDB4Q0M3MSwgMHhDQzcyLCAweENDNzMsIDB4Q0M3NCwgMHhDQzc2LAotICAgIDB4Q0M3NywgMHhDQzc4LCAweENDNzksIDB4Q0M3QSwgMHhDQzdCLCAweENDN0MsIDB4Q0M3RCwgMHhDQzdFLAotICAgIDB4Q0M3RiwgMHhDQzgwLCAweENDODEsIDB4Q0M4MiwgMHhDQzgzLCAweENDODQsIDB4Q0M4NSwgMHhDQzg2LAotICAgIDB4Q0M4NywgMHhDQzg4LCAweENDODksIDB4Q0M4QSwgMHhDQzhCLCAweENDOEMsIDB4Q0M4RCwgMHhDQzhFLAotICAgIDB4Q0M4RiwgMHhDQzkwLCAweENDOTEsIDB4Q0M5MiwgMHhDQzkzLCAweENDOTQsIDB4Q0M5NSwgMHhDQzk2LAotICAgIDB4Q0M5NywgMHhDQzlBLCAweENDOUIsIDB4Q0M5RCwgMHhDQzlFLCAweENDOUYsIDB4Q0NBMSwgMHhDQ0EyLAotICAgIDB4Q0NBMywgMHhDQ0E0LCAweENDQTUsIDB4Q0NBNiwgMHhDQ0E3LCAweENDQUEsIDB4Q0NBRSwgMHhDQ0FGLAotICAgIDB4Q0NCMCwgMHhDQ0IxLCAweENDQjIsIDB4Q0NCMywgMHhDQ0I2LCAweENDQjcsIDB4Q0NCOSwgMHhDQ0JBLAotICAgIDB4Q0NCQiwgMHhDQ0JELCAweENDQkUsIDB4Q0NCRiwgMHhDQ0MwLCAweENDQzEsIDB4Q0NDMiwgMHhDQ0MzLAotICAgIDB4Q0NDNiwgMHhDQ0M4LCAweENDQ0EsIDB4Q0NDQiwgMHhDQ0NDLCAweENDQ0QsIDB4Q0NDRSwgMHhDQ0NGLAotICAgIDB4Q0NEMSwgMHhDQ0QyLCAweENDRDMsIDB4Q0NENSwgMHhDQ0Q2LCAweENDRDcsIDB4Q0NEOCwgMHhDQ0Q5LAotICAgIDB4Q0NEQSwgMHhDQ0RCLCAweENDREMsIDB4Q0NERCwgMHhDQ0RFLCAweENDREYsIDB4Q0NFMCwgMHhDQ0UxLAotICAgIDB4Q0NFMiwgMHhDQ0UzLCAweENDRTUsIDB4Q0NFNiwgMHhDQ0U3LCAweENDRTgsIDB4Q0NFOSwgMHhDQ0VBLAotICAgIDB4Q0NFQiwgMHhDQ0VELCAweENDRUUsIDB4Q0NFRiwgMHhDQ0YxLCAweENDRjIsIDB4Q0NGMywgMHhDQ0Y0LAotICAgIDB4Q0NGNSwgMHhDQ0Y2LCAweENDRjcsIDB4Q0NGOCwgMHhDQ0Y5LCAweENDRkEsIDB4Q0NGQiwgMHhDQ0ZDLAotICAgIDB4Q0NGRCwgMHhDQ0ZFLCAweENDRkYsIDB4Q0QwMCwgMHhDRDAyLCAweENEMDMsIDB4Q0QwNCwgMHhDRDA1LAotICAgIDB4Q0QwNiwgMHhDRDA3LCAweENEMEEsIDB4Q0QwQiwgMHhDRDBELCAweENEMEUsIDB4Q0QwRiwgMHhDRDExLAotICAgIDB4Q0QxMiwgMHhDRDEzLCAweENEMTQsIDB4Q0QxNSwgMHhDRDE2LCAweENEMTcsIDB4Q0QxQSwgMHhDRDFDLAotICAgIDB4Q0QxRSwgMHhDRDFGLCAweENEMjAsIDB4Q0QyMSwgMHhDRDIyLCAweENEMjMsIDB4Q0QyNSwgMHhDRDI2LAotICAgIDB4Q0QyNywgMHhDRDI5LCAweENEMkEsIDB4Q0QyQiwgMHhDRDJELCAweENEMkUsIDB4Q0QyRiwgMHhDRDMwLAotICAgIDB4Q0QzMSwgMHhDRDMyLCAweENEMzMsIDB4Q0QzNCwgMHhDRDM1LCAweENEMzYsIDB4Q0QzNywgMHhDRDM4LAotICAgIDB4Q0QzQSwgMHhDRDNCLCAweENEM0MsIDB4Q0QzRCwgMHhDRDNFLCAweENEM0YsIDB4Q0Q0MCwgMHhDRDQxLAotICAgIDB4Q0Q0MiwgMHhDRDQzLCAweENENDQsIDB4Q0Q0NSwgMHhDRDQ2LCAweENENDcsIDB4Q0Q0OCwgMHhDRDQ5LAotICAgIDB4Q0Q0QSwgMHhDRDRCLCAweENENEMsIDB4Q0Q0RCwgMHhDRDRFLCAweENENEYsIDB4Q0Q1MCwgMHhDRDUxLAotICAgIDB4Q0Q1MiwgMHhDRDUzLCAweENENTQsIDB4Q0Q1NSwgMHhDRDU2LCAweENENTcsIDB4Q0Q1OCwgMHhDRDU5LAotICAgIDB4Q0Q1QSwgMHhDRDVCLCAweENENUQsIDB4Q0Q1RSwgMHhDRDVGLCAweENENjEsIDB4Q0Q2MiwgMHhDRDYzLAotICAgIDB4Q0Q2NSwgMHhDRDY2LCAweENENjcsIDB4Q0Q2OCwgMHhDRDY5LCAweENENkEsIDB4Q0Q2QiwgMHhDRDZFLAotICAgIDB4Q0Q3MCwgMHhDRDcyLCAweENENzMsIDB4Q0Q3NCwgMHhDRDc1LCAweENENzYsIDB4Q0Q3NywgMHhDRDc5LAotICAgIDB4Q0Q3QSwgMHhDRDdCLCAweENEN0MsIDB4Q0Q3RCwgMHhDRDdFLCAweENEN0YsIDB4Q0Q4MCwgMHhDRDgxLAotICAgIDB4Q0Q4MiwgMHhDRDgzLCAweENEODQsIDB4Q0Q4NSwgMHhDRDg2LCAweENEODcsIDB4Q0Q4OSwgMHhDRDhBLAotICAgIDB4Q0Q4QiwgMHhDRDhDLCAweENEOEQsIDB4Q0Q4RSwgMHhDRDhGLCAweENEOTAsIDB4Q0Q5MSwgMHhDRDkyLAotICAgIDB4Q0Q5MywgMHhDRDk2LCAweENEOTcsIDB4Q0Q5OSwgMHhDRDlBLCAweENEOUIsIDB4Q0Q5RCwgMHhDRDlFLAotICAgIDB4Q0Q5RiwgMHhDREEwLCAweENEQTEsIDB4Q0RBMiwgMHhDREEzLCAweENEQTYsIDB4Q0RBOCwgMHhDREFBLAotICAgIDB4Q0RBQiwgMHhDREFDLCAweENEQUQsIDB4Q0RBRSwgMHhDREFGLCAweENEQjEsIDB4Q0RCMiwgMHhDREIzLAotICAgIDB4Q0RCNCwgMHhDREI1LCAweENEQjYsIDB4Q0RCNywgMHhDREI4LCAweENEQjksIDB4Q0RCQSwgMHhDREJCLAotICAgIDB4Q0RCQywgMHhDREJELCAweENEQkUsIDB4Q0RCRiwgMHhDREMwLCAweENEQzEsIDB4Q0RDMiwgMHhDREMzLAotICAgIDB4Q0RDNSwgMHhDREM2LCAweENEQzcsIDB4Q0RDOCwgMHhDREM5LCAweENEQ0EsIDB4Q0RDQiwgMHhDRENELAotICAgIDB4Q0RDRSwgMHhDRENGLCAweENERDEsIDB4Q0REMiwgMHhDREQzLCAweENERDQsIDB4Q0RENSwgMHhDREQ2LAotICAgIDB4Q0RENywgMHhDREQ4LCAweENERDksIDB4Q0REQSwgMHhDRERCLCAweENEREMsIDB4Q0RERCwgMHhDRERFLAotICAgIDB4Q0RERiwgMHhDREUwLCAweENERTEsIDB4Q0RFMiwgMHhDREUzLCAweENERTQsIDB4Q0RFNSwgMHhDREU2LAotICAgIDB4Q0RFNywgMHhDREU5LCAweENERUEsIDB4Q0RFQiwgMHhDREVELCAweENERUUsIDB4Q0RFRiwgMHhDREYxLAotICAgIDB4Q0RGMiwgMHhDREYzLCAweENERjQsIDB4Q0RGNSwgMHhDREY2LCAweENERjcsIDB4Q0RGQSwgMHhDREZDLAotICAgIDB4Q0RGRSwgMHhDREZGLCAweENFMDAsIDB4Q0UwMSwgMHhDRTAyLCAweENFMDMsIDB4Q0UwNSwgMHhDRTA2LAotICAgIDB4Q0UwNywgMHhDRTA5LCAweENFMEEsIDB4Q0UwQiwgMHhDRTBELCAweENFMEUsIDB4Q0UwRiwgMHhDRTEwLAotICAgIDB4Q0UxMSwgMHhDRTEyLCAweENFMTMsIDB4Q0UxNSwgMHhDRTE2LCAweENFMTcsIDB4Q0UxOCwgMHhDRTFBLAotICAgIDB4Q0UxQiwgMHhDRTFDLCAweENFMUQsIDB4Q0UxRSwgMHhDRTFGLCAweENFMjIsIDB4Q0UyMywgMHhDRTI1LAotICAgIDB4Q0UyNiwgMHhDRTI3LCAweENFMjksIDB4Q0UyQSwgMHhDRTJCLCAweENFMkMsIDB4Q0UyRCwgMHhDRTJFLAotICAgIDB4Q0UyRiwgMHhDRTMyLCAweENFMzQsIDB4Q0UzNiwgMHhDRTM3LCAweENFMzgsIDB4Q0UzOSwgMHhDRTNBLAotICAgIDB4Q0UzQiwgMHhDRTNDLCAweENFM0QsIDB4Q0UzRSwgMHhDRTNGLCAweENFNDAsIDB4Q0U0MSwgMHhDRTQyLAotICAgIDB4Q0U0MywgMHhDRTQ0LCAweENFNDUsIDB4Q0U0NiwgMHhDRTQ3LCAweENFNDgsIDB4Q0U0OSwgMHhDRTRBLAotICAgIDB4Q0U0QiwgMHhDRTRDLCAweENFNEQsIDB4Q0U0RSwgMHhDRTRGLCAweENFNTAsIDB4Q0U1MSwgMHhDRTUyLAotICAgIDB4Q0U1MywgMHhDRTU0LCAweENFNTUsIDB4Q0U1NiwgMHhDRTU3LCAweENFNUEsIDB4Q0U1QiwgMHhDRTVELAotICAgIDB4Q0U1RSwgMHhDRTYyLCAweENFNjMsIDB4Q0U2NCwgMHhDRTY1LCAweENFNjYsIDB4Q0U2NywgMHhDRTZBLAotICAgIDB4Q0U2QywgMHhDRTZFLCAweENFNkYsIDB4Q0U3MCwgMHhDRTcxLCAweENFNzIsIDB4Q0U3MywgMHhDRTc2LAotICAgIDB4Q0U3NywgMHhDRTc5LCAweENFN0EsIDB4Q0U3QiwgMHhDRTdELCAweENFN0UsIDB4Q0U3RiwgMHhDRTgwLAotICAgIDB4Q0U4MSwgMHhDRTgyLCAweENFODMsIDB4Q0U4NiwgMHhDRTg4LCAweENFOEEsIDB4Q0U4QiwgMHhDRThDLAotICAgIDB4Q0U4RCwgMHhDRThFLCAweENFOEYsIDB4Q0U5MiwgMHhDRTkzLCAweENFOTUsIDB4Q0U5NiwgMHhDRTk3LAotICAgIDB4Q0U5OSwgMHhDRTlBLCAweENFOUIsIDB4Q0U5QywgMHhDRTlELCAweENFOUUsIDB4Q0U5RiwgMHhDRUEyLAotICAgIDB4Q0VBNiwgMHhDRUE3LCAweENFQTgsIDB4Q0VBOSwgMHhDRUFBLCAweENFQUIsIDB4Q0VBRSwgMHhDRUFGLAotICAgIDB4Q0VCMCwgMHhDRUIxLCAweENFQjIsIDB4Q0VCMywgMHhDRUI0LCAweENFQjUsIDB4Q0VCNiwgMHhDRUI3LAotICAgIDB4Q0VCOCwgMHhDRUI5LCAweENFQkEsIDB4Q0VCQiwgMHhDRUJDLCAweENFQkQsIDB4Q0VCRSwgMHhDRUJGLAotICAgIDB4Q0VDMCwgMHhDRUMyLCAweENFQzMsIDB4Q0VDNCwgMHhDRUM1LCAweENFQzYsIDB4Q0VDNywgMHhDRUM4LAotICAgIDB4Q0VDOSwgMHhDRUNBLCAweENFQ0IsIDB4Q0VDQywgMHhDRUNELCAweENFQ0UsIDB4Q0VDRiwgMHhDRUQwLAotICAgIDB4Q0VEMSwgMHhDRUQyLCAweENFRDMsIDB4Q0VENCwgMHhDRUQ1LCAweENFRDYsIDB4Q0VENywgMHhDRUQ4LAotICAgIDB4Q0VEOSwgMHhDRURBLCAweENFREIsIDB4Q0VEQywgMHhDRURELCAweENFREUsIDB4Q0VERiwgMHhDRUUwLAotICAgIDB4Q0VFMSwgMHhDRUUyLCAweENFRTMsIDB4Q0VFNiwgMHhDRUU3LCAweENFRTksIDB4Q0VFQSwgMHhDRUVELAotICAgIDB4Q0VFRSwgMHhDRUVGLCAweENFRjAsIDB4Q0VGMSwgMHhDRUYyLCAweENFRjMsIDB4Q0VGNiwgMHhDRUZBLAotICAgIDB4Q0VGQiwgMHhDRUZDLCAweENFRkQsIDB4Q0VGRSwgMHhDRUZGLCAweENGMDIsIDB4Q0YwMywgMHhDRjA1LAotICAgIDB4Q0YwNiwgMHhDRjA3LCAweENGMDksIDB4Q0YwQSwgMHhDRjBCLCAweENGMEMsIDB4Q0YwRCwgMHhDRjBFLAotICAgIDB4Q0YwRiwgMHhDRjEyLCAweENGMTQsIDB4Q0YxNiwgMHhDRjE3LCAweENGMTgsIDB4Q0YxOSwgMHhDRjFBLAotICAgIDB4Q0YxQiwgMHhDRjFELCAweENGMUUsIDB4Q0YxRiwgMHhDRjIxLCAweENGMjIsIDB4Q0YyMywgMHhDRjI1LAotICAgIDB4Q0YyNiwgMHhDRjI3LCAweENGMjgsIDB4Q0YyOSwgMHhDRjJBLCAweENGMkIsIDB4Q0YyRSwgMHhDRjMyLAotICAgIDB4Q0YzMywgMHhDRjM0LCAweENGMzUsIDB4Q0YzNiwgMHhDRjM3LCAweENGMzksIDB4Q0YzQSwgMHhDRjNCLAotICAgIDB4Q0YzQywgMHhDRjNELCAweENGM0UsIDB4Q0YzRiwgMHhDRjQwLCAweENGNDEsIDB4Q0Y0MiwgMHhDRjQzLAotICAgIDB4Q0Y0NCwgMHhDRjQ1LCAweENGNDYsIDB4Q0Y0NywgMHhDRjQ4LCAweENGNDksIDB4Q0Y0QSwgMHhDRjRCLAotICAgIDB4Q0Y0QywgMHhDRjRELCAweENGNEUsIDB4Q0Y0RiwgMHhDRjUwLCAweENGNTEsIDB4Q0Y1MiwgMHhDRjUzLAotICAgIDB4Q0Y1NiwgMHhDRjU3LCAweENGNTksIDB4Q0Y1QSwgMHhDRjVCLCAweENGNUQsIDB4Q0Y1RSwgMHhDRjVGLAotICAgIDB4Q0Y2MCwgMHhDRjYxLCAweENGNjIsIDB4Q0Y2MywgMHhDRjY2LCAweENGNjgsIDB4Q0Y2QSwgMHhDRjZCLAotICAgIDB4Q0Y2QywgMHhDRjZELCAweENGNkUsIDB4Q0Y2RiwgMHhDRjcyLCAweENGNzMsIDB4Q0Y3NSwgMHhDRjc2LAotICAgIDB4Q0Y3NywgMHhDRjc5LCAweENGN0EsIDB4Q0Y3QiwgMHhDRjdDLCAweENGN0QsIDB4Q0Y3RSwgMHhDRjdGLAotICAgIDB4Q0Y4MSwgMHhDRjgyLCAweENGODMsIDB4Q0Y4NCwgMHhDRjg2LCAweENGODcsIDB4Q0Y4OCwgMHhDRjg5LAotICAgIDB4Q0Y4QSwgMHhDRjhCLCAweENGOEQsIDB4Q0Y4RSwgMHhDRjhGLCAweENGOTAsIDB4Q0Y5MSwgMHhDRjkyLAotICAgIDB4Q0Y5MywgMHhDRjk0LCAweENGOTUsIDB4Q0Y5NiwgMHhDRjk3LCAweENGOTgsIDB4Q0Y5OSwgMHhDRjlBLAotICAgIDB4Q0Y5QiwgMHhDRjlDLCAweENGOUQsIDB4Q0Y5RSwgMHhDRjlGLCAweENGQTAsIDB4Q0ZBMiwgMHhDRkEzLAotICAgIDB4Q0ZBNCwgMHhDRkE1LCAweENGQTYsIDB4Q0ZBNywgMHhDRkE5LCAweENGQUEsIDB4Q0ZBQiwgMHhDRkFDLAotICAgIDB4Q0ZBRCwgMHhDRkFFLCAweENGQUYsIDB4Q0ZCMSwgMHhDRkIyLCAweENGQjMsIDB4Q0ZCNCwgMHhDRkI1LAotICAgIDB4Q0ZCNiwgMHhDRkI3LCAweENGQjgsIDB4Q0ZCOSwgMHhDRkJBLCAweENGQkIsIDB4Q0ZCQywgMHhDRkJELAotICAgIDB4Q0ZCRSwgMHhDRkJGLCAweENGQzAsIDB4Q0ZDMSwgMHhDRkMyLCAweENGQzMsIDB4Q0ZDNSwgMHhDRkM2LAotICAgIDB4Q0ZDNywgMHhDRkM4LCAweENGQzksIDB4Q0ZDQSwgMHhDRkNCLCAweENGQ0MsIDB4Q0ZDRCwgMHhDRkNFLAotICAgIDB4Q0ZDRiwgMHhDRkQwLCAweENGRDEsIDB4Q0ZEMiwgMHhDRkQzLCAweENGRDQsIDB4Q0ZENSwgMHhDRkQ2LAotICAgIDB4Q0ZENywgMHhDRkQ4LCAweENGRDksIDB4Q0ZEQSwgMHhDRkRCLCAweENGREMsIDB4Q0ZERCwgMHhDRkRFLAotICAgIDB4Q0ZERiwgMHhDRkUyLCAweENGRTMsIDB4Q0ZFNSwgMHhDRkU2LCAweENGRTcsIDB4Q0ZFOSwgMHhDRkVBLAotICAgIDB4Q0ZFQiwgMHhDRkVDLCAweENGRUQsIDB4Q0ZFRSwgMHhDRkVGLCAweENGRjIsIDB4Q0ZGNCwgMHhDRkY2LAotICAgIDB4Q0ZGNywgMHhDRkY4LCAweENGRjksIDB4Q0ZGQSwgMHhDRkZCLCAweENGRkQsIDB4Q0ZGRSwgMHhDRkZGLAotICAgIDB4RDAwMSwgMHhEMDAyLCAweEQwMDMsIDB4RDAwNSwgMHhEMDA2LCAweEQwMDcsIDB4RDAwOCwgMHhEMDA5LAotICAgIDB4RDAwQSwgMHhEMDBCLCAweEQwMEMsIDB4RDAwRCwgMHhEMDBFLCAweEQwMEYsIDB4RDAxMCwgMHhEMDEyLAotICAgIDB4RDAxMywgMHhEMDE0LCAweEQwMTUsIDB4RDAxNiwgMHhEMDE3LCAweEQwMTksIDB4RDAxQSwgMHhEMDFCLAotICAgIDB4RDAxQywgMHhEMDFELCAweEQwMUUsIDB4RDAxRiwgMHhEMDIwLCAweEQwMjEsIDB4RDAyMiwgMHhEMDIzLAotICAgIDB4RDAyNCwgMHhEMDI1LCAweEQwMjYsIDB4RDAyNywgMHhEMDI4LCAweEQwMjksIDB4RDAyQSwgMHhEMDJCLAotICAgIDB4RDAyQywgMHhEMDJFLCAweEQwMkYsIDB4RDAzMCwgMHhEMDMxLCAweEQwMzIsIDB4RDAzMywgMHhEMDM2LAotICAgIDB4RDAzNywgMHhEMDM5LCAweEQwM0EsIDB4RDAzQiwgMHhEMDNELCAweEQwM0UsIDB4RDAzRiwgMHhEMDQwLAotICAgIDB4RDA0MSwgMHhEMDQyLCAweEQwNDMsIDB4RDA0NiwgMHhEMDQ4LCAweEQwNEEsIDB4RDA0QiwgMHhEMDRDLAotICAgIDB4RDA0RCwgMHhEMDRFLCAweEQwNEYsIDB4RDA1MSwgMHhEMDUyLCAweEQwNTMsIDB4RDA1NSwgMHhEMDU2LAotICAgIDB4RDA1NywgMHhEMDU5LCAweEQwNUEsIDB4RDA1QiwgMHhEMDVDLCAweEQwNUQsIDB4RDA1RSwgMHhEMDVGLAotICAgIDB4RDA2MSwgMHhEMDYyLCAweEQwNjMsIDB4RDA2NCwgMHhEMDY1LCAweEQwNjYsIDB4RDA2NywgMHhEMDY4LAotICAgIDB4RDA2OSwgMHhEMDZBLCAweEQwNkIsIDB4RDA2RSwgMHhEMDZGLCAweEQwNzEsIDB4RDA3MiwgMHhEMDczLAotICAgIDB4RDA3NSwgMHhEMDc2LCAweEQwNzcsIDB4RDA3OCwgMHhEMDc5LCAweEQwN0EsIDB4RDA3QiwgMHhEMDdFLAotICAgIDB4RDA3RiwgMHhEMDgwLCAweEQwODIsIDB4RDA4MywgMHhEMDg0LCAweEQwODUsIDB4RDA4NiwgMHhEMDg3LAotICAgIDB4RDA4OCwgMHhEMDg5LCAweEQwOEEsIDB4RDA4QiwgMHhEMDhDLCAweEQwOEQsIDB4RDA4RSwgMHhEMDhGLAotICAgIDB4RDA5MCwgMHhEMDkxLCAweEQwOTIsIDB4RDA5MywgMHhEMDk0LCAweEQwOTUsIDB4RDA5NiwgMHhEMDk3LAotICAgIDB4RDA5OCwgMHhEMDk5LCAweEQwOUEsIDB4RDA5QiwgMHhEMDlDLCAweEQwOUQsIDB4RDA5RSwgMHhEMDlGLAotICAgIDB4RDBBMCwgMHhEMEExLCAweEQwQTIsIDB4RDBBMywgMHhEMEE2LCAweEQwQTcsIDB4RDBBOSwgMHhEMEFBLAotICAgIDB4RDBBQiwgMHhEMEFELCAweEQwQUUsIDB4RDBBRiwgMHhEMEIwLCAweEQwQjEsIDB4RDBCMiwgMHhEMEIzLAotICAgIDB4RDBCNiwgMHhEMEI4LCAweEQwQkEsIDB4RDBCQiwgMHhEMEJDLCAweEQwQkQsIDB4RDBCRSwgMHhEMEJGLAotICAgIDB4RDBDMiwgMHhEMEMzLCAweEQwQzUsIDB4RDBDNiwgMHhEMEM3LCAweEQwQ0EsIDB4RDBDQiwgMHhEMENDLAotICAgIDB4RDBDRCwgMHhEMENFLCAweEQwQ0YsIDB4RDBEMiwgMHhEMEQ2LCAweEQwRDcsIDB4RDBEOCwgMHhEMEQ5LAotICAgIDB4RDBEQSwgMHhEMERCLCAweEQwREUsIDB4RDBERiwgMHhEMEUxLCAweEQwRTIsIDB4RDBFMywgMHhEMEU1LAotICAgIDB4RDBFNiwgMHhEMEU3LCAweEQwRTgsIDB4RDBFOSwgMHhEMEVBLCAweEQwRUIsIDB4RDBFRSwgMHhEMEYyLAotICAgIDB4RDBGMywgMHhEMEY0LCAweEQwRjUsIDB4RDBGNiwgMHhEMEY3LCAweEQwRjksIDB4RDBGQSwgMHhEMEZCLAotICAgIDB4RDBGQywgMHhEMEZELCAweEQwRkUsIDB4RDBGRiwgMHhEMTAwLCAweEQxMDEsIDB4RDEwMiwgMHhEMTAzLAotICAgIDB4RDEwNCwgMHhEMTA1LCAweEQxMDYsIDB4RDEwNywgMHhEMTA4LCAweEQxMDksIDB4RDEwQSwgMHhEMTBCLAotICAgIDB4RDEwQywgMHhEMTBFLCAweEQxMEYsIDB4RDExMCwgMHhEMTExLCAweEQxMTIsIDB4RDExMywgMHhEMTE0LAotICAgIDB4RDExNSwgMHhEMTE2LCAweEQxMTcsIDB4RDExOCwgMHhEMTE5LCAweEQxMUEsIDB4RDExQiwgMHhEMTFDLAotICAgIDB4RDExRCwgMHhEMTFFLCAweEQxMUYsIDB4RDEyMCwgMHhEMTIxLCAweEQxMjIsIDB4RDEyMywgMHhEMTI0LAotICAgIDB4RDEyNSwgMHhEMTI2LCAweEQxMjcsIDB4RDEyOCwgMHhEMTI5LCAweEQxMkEsIDB4RDEyQiwgMHhEMTJDLAotICAgIDB4RDEyRCwgMHhEMTJFLCAweEQxMkYsIDB4RDEzMiwgMHhEMTMzLCAweEQxMzUsIDB4RDEzNiwgMHhEMTM3LAotICAgIDB4RDEzOSwgMHhEMTNCLCAweEQxM0MsIDB4RDEzRCwgMHhEMTNFLCAweEQxM0YsIDB4RDE0MiwgMHhEMTQ2LAotICAgIDB4RDE0NywgMHhEMTQ4LCAweEQxNDksIDB4RDE0QSwgMHhEMTRCLCAweEQxNEUsIDB4RDE0RiwgMHhEMTUxLAotICAgIDB4RDE1MiwgMHhEMTUzLCAweEQxNTUsIDB4RDE1NiwgMHhEMTU3LCAweEQxNTgsIDB4RDE1OSwgMHhEMTVBLAotICAgIDB4RDE1QiwgMHhEMTVFLCAweEQxNjAsIDB4RDE2MiwgMHhEMTYzLCAweEQxNjQsIDB4RDE2NSwgMHhEMTY2LAotICAgIDB4RDE2NywgMHhEMTY5LCAweEQxNkEsIDB4RDE2QiwgMHhEMTZELCAweEQxNkUsIDB4RDE2RiwgMHhEMTcwLAotICAgIDB4RDE3MSwgMHhEMTcyLCAweEQxNzMsIDB4RDE3NCwgMHhEMTc1LCAweEQxNzYsIDB4RDE3NywgMHhEMTc4LAotICAgIDB4RDE3OSwgMHhEMTdBLCAweEQxN0IsIDB4RDE3RCwgMHhEMTdFLCAweEQxN0YsIDB4RDE4MCwgMHhEMTgxLAotICAgIDB4RDE4MiwgMHhEMTgzLCAweEQxODUsIDB4RDE4NiwgMHhEMTg3LCAweEQxODksIDB4RDE4QSwgMHhEMThCLAotICAgIDB4RDE4QywgMHhEMThELCAweEQxOEUsIDB4RDE4RiwgMHhEMTkwLCAweEQxOTEsIDB4RDE5MiwgMHhEMTkzLAotICAgIDB4RDE5NCwgMHhEMTk1LCAweEQxOTYsIDB4RDE5NywgMHhEMTk4LCAweEQxOTksIDB4RDE5QSwgMHhEMTlCLAotICAgIDB4RDE5QywgMHhEMTlELCAweEQxOUUsIDB4RDE5RiwgMHhEMUEyLCAweEQxQTMsIDB4RDFBNSwgMHhEMUE2LAotICAgIDB4RDFBNywgMHhEMUE5LCAweEQxQUEsIDB4RDFBQiwgMHhEMUFDLCAweEQxQUQsIDB4RDFBRSwgMHhEMUFGLAotICAgIDB4RDFCMiwgMHhEMUI0LCAweEQxQjYsIDB4RDFCNywgMHhEMUI4LCAweEQxQjksIDB4RDFCQiwgMHhEMUJELAotICAgIDB4RDFCRSwgMHhEMUJGLCAweEQxQzEsIDB4RDFDMiwgMHhEMUMzLCAweEQxQzQsIDB4RDFDNSwgMHhEMUM2LAotICAgIDB4RDFDNywgMHhEMUM4LCAweEQxQzksIDB4RDFDQSwgMHhEMUNCLCAweEQxQ0MsIDB4RDFDRCwgMHhEMUNFLAotICAgIDB4RDFDRiwgMHhEMUQwLCAweEQxRDEsIDB4RDFEMiwgMHhEMUQzLCAweEQxRDQsIDB4RDFENSwgMHhEMUQ2LAotICAgIDB4RDFENywgMHhEMUQ5LCAweEQxREEsIDB4RDFEQiwgMHhEMURDLCAweEQxREQsIDB4RDFERSwgMHhEMURGLAotICAgIDB4RDFFMCwgMHhEMUUxLCAweEQxRTIsIDB4RDFFMywgMHhEMUU0LCAweEQxRTUsIDB4RDFFNiwgMHhEMUU3LAotICAgIDB4RDFFOCwgMHhEMUU5LCAweEQxRUEsIDB4RDFFQiwgMHhEMUVDLCAweEQxRUQsIDB4RDFFRSwgMHhEMUVGLAotICAgIDB4RDFGMCwgMHhEMUYxLCAweEQxRjIsIDB4RDFGMywgMHhEMUY1LCAweEQxRjYsIDB4RDFGNywgMHhEMUY5LAotICAgIDB4RDFGQSwgMHhEMUZCLCAweEQxRkMsIDB4RDFGRCwgMHhEMUZFLCAweEQxRkYsIDB4RDIwMCwgMHhEMjAxLAotICAgIDB4RDIwMiwgMHhEMjAzLCAweEQyMDQsIDB4RDIwNSwgMHhEMjA2LCAweEQyMDgsIDB4RDIwQSwgMHhEMjBCLAotICAgIDB4RDIwQywgMHhEMjBELCAweEQyMEUsIDB4RDIwRiwgMHhEMjExLCAweEQyMTIsIDB4RDIxMywgMHhEMjE0LAotICAgIDB4RDIxNSwgMHhEMjE2LCAweEQyMTcsIDB4RDIxOCwgMHhEMjE5LCAweEQyMUEsIDB4RDIxQiwgMHhEMjFDLAotICAgIDB4RDIxRCwgMHhEMjFFLCAweEQyMUYsIDB4RDIyMCwgMHhEMjIxLCAweEQyMjIsIDB4RDIyMywgMHhEMjI0LAotICAgIDB4RDIyNSwgMHhEMjI2LCAweEQyMjcsIDB4RDIyOCwgMHhEMjI5LCAweEQyMkEsIDB4RDIyQiwgMHhEMjJFLAotICAgIDB4RDIyRiwgMHhEMjMxLCAweEQyMzIsIDB4RDIzMywgMHhEMjM1LCAweEQyMzYsIDB4RDIzNywgMHhEMjM4LAotICAgIDB4RDIzOSwgMHhEMjNBLCAweEQyM0IsIDB4RDIzRSwgMHhEMjQwLCAweEQyNDIsIDB4RDI0MywgMHhEMjQ0LAotICAgIDB4RDI0NSwgMHhEMjQ2LCAweEQyNDcsIDB4RDI0OSwgMHhEMjRBLCAweEQyNEIsIDB4RDI0QywgMHhEMjRELAotICAgIDB4RDI0RSwgMHhEMjRGLCAweEQyNTAsIDB4RDI1MSwgMHhEMjUyLCAweEQyNTMsIDB4RDI1NCwgMHhEMjU1LAotICAgIDB4RDI1NiwgMHhEMjU3LCAweEQyNTgsIDB4RDI1OSwgMHhEMjVBLCAweEQyNUIsIDB4RDI1RCwgMHhEMjVFLAotICAgIDB4RDI1RiwgMHhEMjYwLCAweEQyNjEsIDB4RDI2MiwgMHhEMjYzLCAweEQyNjUsIDB4RDI2NiwgMHhEMjY3LAotICAgIDB4RDI2OCwgMHhEMjY5LCAweEQyNkEsIDB4RDI2QiwgMHhEMjZDLCAweEQyNkQsIDB4RDI2RSwgMHhEMjZGLAotICAgIDB4RDI3MCwgMHhEMjcxLCAweEQyNzIsIDB4RDI3MywgMHhEMjc0LCAweEQyNzUsIDB4RDI3NiwgMHhEMjc3LAotICAgIDB4RDI3OCwgMHhEMjc5LCAweEQyN0EsIDB4RDI3QiwgMHhEMjdDLCAweEQyN0QsIDB4RDI3RSwgMHhEMjdGLAotICAgIDB4RDI4MiwgMHhEMjgzLCAweEQyODUsIDB4RDI4NiwgMHhEMjg3LCAweEQyODksIDB4RDI4QSwgMHhEMjhCLAotICAgIDB4RDI4QywgMHhEMjhELCAweEQyOEUsIDB4RDI4RiwgMHhEMjkyLCAweEQyOTMsIDB4RDI5NCwgMHhEMjk2LAotICAgIDB4RDI5NywgMHhEMjk4LCAweEQyOTksIDB4RDI5QSwgMHhEMjlCLCAweEQyOUQsIDB4RDI5RSwgMHhEMjlGLAotICAgIDB4RDJBMSwgMHhEMkEyLCAweEQyQTMsIDB4RDJBNSwgMHhEMkE2LCAweEQyQTcsIDB4RDJBOCwgMHhEMkE5LAotICAgIDB4RDJBQSwgMHhEMkFCLCAweEQyQUQsIDB4RDJBRSwgMHhEMkFGLCAweEQyQjAsIDB4RDJCMiwgMHhEMkIzLAotICAgIDB4RDJCNCwgMHhEMkI1LCAweEQyQjYsIDB4RDJCNywgMHhEMkJBLCAweEQyQkIsIDB4RDJCRCwgMHhEMkJFLAotICAgIDB4RDJDMSwgMHhEMkMzLCAweEQyQzQsIDB4RDJDNSwgMHhEMkM2LCAweEQyQzcsIDB4RDJDQSwgMHhEMkNDLAotICAgIDB4RDJDRCwgMHhEMkNFLCAweEQyQ0YsIDB4RDJEMCwgMHhEMkQxLCAweEQyRDIsIDB4RDJEMywgMHhEMkQ1LAotICAgIDB4RDJENiwgMHhEMkQ3LCAweEQyRDksIDB4RDJEQSwgMHhEMkRCLCAweEQyREQsIDB4RDJERSwgMHhEMkRGLAotICAgIDB4RDJFMCwgMHhEMkUxLCAweEQyRTIsIDB4RDJFMywgMHhEMkU2LCAweEQyRTcsIDB4RDJFOCwgMHhEMkU5LAotICAgIDB4RDJFQSwgMHhEMkVCLCAweEQyRUMsIDB4RDJFRCwgMHhEMkVFLCAweEQyRUYsIDB4RDJGMiwgMHhEMkYzLAotICAgIDB4RDJGNSwgMHhEMkY2LCAweEQyRjcsIDB4RDJGOSwgMHhEMkZBLCAweEQyRkIsIDB4RDJGQywgMHhEMkZELAotICAgIDB4RDJGRSwgMHhEMkZGLCAweEQzMDIsIDB4RDMwNCwgMHhEMzA2LCAweEQzMDcsIDB4RDMwOCwgMHhEMzA5LAotICAgIDB4RDMwQSwgMHhEMzBCLCAweEQzMEYsIDB4RDMxMSwgMHhEMzEyLCAweEQzMTMsIDB4RDMxNSwgMHhEMzE3LAotICAgIDB4RDMxOCwgMHhEMzE5LCAweEQzMUEsIDB4RDMxQiwgMHhEMzFFLCAweEQzMjIsIDB4RDMyMywgMHhEMzI0LAotICAgIDB4RDMyNiwgMHhEMzI3LCAweEQzMkEsIDB4RDMyQiwgMHhEMzJELCAweEQzMkUsIDB4RDMyRiwgMHhEMzMxLAotICAgIDB4RDMzMiwgMHhEMzMzLCAweEQzMzQsIDB4RDMzNSwgMHhEMzM2LCAweEQzMzcsIDB4RDMzQSwgMHhEMzNFLAotICAgIDB4RDMzRiwgMHhEMzQwLCAweEQzNDEsIDB4RDM0MiwgMHhEMzQzLCAweEQzNDYsIDB4RDM0NywgMHhEMzQ4LAotICAgIDB4RDM0OSwgMHhEMzRBLCAweEQzNEIsIDB4RDM0QywgMHhEMzRELCAweEQzNEUsIDB4RDM0RiwgMHhEMzUwLAotICAgIDB4RDM1MSwgMHhEMzUyLCAweEQzNTMsIDB4RDM1NCwgMHhEMzU1LCAweEQzNTYsIDB4RDM1NywgMHhEMzU4LAotICAgIDB4RDM1OSwgMHhEMzVBLCAweEQzNUIsIDB4RDM1QywgMHhEMzVELCAweEQzNUUsIDB4RDM1RiwgMHhEMzYwLAotICAgIDB4RDM2MSwgMHhEMzYyLCAweEQzNjMsIDB4RDM2NCwgMHhEMzY1LCAweEQzNjYsIDB4RDM2NywgMHhEMzY4LAotICAgIDB4RDM2OSwgMHhEMzZBLCAweEQzNkIsIDB4RDM2QywgMHhEMzZELCAweEQzNkUsIDB4RDM2RiwgMHhEMzcwLAotICAgIDB4RDM3MSwgMHhEMzcyLCAweEQzNzMsIDB4RDM3NCwgMHhEMzc1LCAweEQzNzYsIDB4RDM3NywgMHhEMzc4LAotICAgIDB4RDM3OSwgMHhEMzdBLCAweEQzN0IsIDB4RDM3RSwgMHhEMzdGLCAweEQzODEsIDB4RDM4MiwgMHhEMzgzLAotICAgIDB4RDM4NSwgMHhEMzg2LCAweEQzODcsIDB4RDM4OCwgMHhEMzg5LCAweEQzOEEsIDB4RDM4QiwgMHhEMzhFLAotICAgIDB4RDM5MiwgMHhEMzkzLCAweEQzOTQsIDB4RDM5NSwgMHhEMzk2LCAweEQzOTcsIDB4RDM5QSwgMHhEMzlCLAotICAgIDB4RDM5RCwgMHhEMzlFLCAweEQzOUYsIDB4RDNBMSwgMHhEM0EyLCAweEQzQTMsIDB4RDNBNCwgMHhEM0E1LAotICAgIDB4RDNBNiwgMHhEM0E3LCAweEQzQUEsIDB4RDNBQywgMHhEM0FFLCAweEQzQUYsIDB4RDNCMCwgMHhEM0IxLAotICAgIDB4RDNCMiwgMHhEM0IzLCAweEQzQjUsIDB4RDNCNiwgMHhEM0I3LCAweEQzQjksIDB4RDNCQSwgMHhEM0JCLAotICAgIDB4RDNCRCwgMHhEM0JFLCAweEQzQkYsIDB4RDNDMCwgMHhEM0MxLCAweEQzQzIsIDB4RDNDMywgMHhEM0M2LAotICAgIDB4RDNDNywgMHhEM0NBLCAweEQzQ0IsIDB4RDNDQywgMHhEM0NELCAweEQzQ0UsIDB4RDNDRiwgMHhEM0QxLAotICAgIDB4RDNEMiwgMHhEM0QzLCAweEQzRDQsIDB4RDNENSwgMHhEM0Q2LCAweEQzRDcsIDB4RDNEOSwgMHhEM0RBLAotICAgIDB4RDNEQiwgMHhEM0RDLCAweEQzREQsIDB4RDNERSwgMHhEM0RGLCAweEQzRTAsIDB4RDNFMiwgMHhEM0U0LAotICAgIDB4RDNFNSwgMHhEM0U2LCAweEQzRTcsIDB4RDNFOCwgMHhEM0U5LCAweEQzRUEsIDB4RDNFQiwgMHhEM0VFLAotICAgIDB4RDNFRiwgMHhEM0YxLCAweEQzRjIsIDB4RDNGMywgMHhEM0Y1LCAweEQzRjYsIDB4RDNGNywgMHhEM0Y4LAotICAgIDB4RDNGOSwgMHhEM0ZBLCAweEQzRkIsIDB4RDNGRSwgMHhENDAwLCAweEQ0MDIsIDB4RDQwMywgMHhENDA0LAotICAgIDB4RDQwNSwgMHhENDA2LCAweEQ0MDcsIDB4RDQwOSwgMHhENDBBLCAweEQ0MEIsIDB4RDQwQywgMHhENDBELAotICAgIDB4RDQwRSwgMHhENDBGLCAweEQ0MTAsIDB4RDQxMSwgMHhENDEyLCAweEQ0MTMsIDB4RDQxNCwgMHhENDE1LAotICAgIDB4RDQxNiwgMHhENDE3LCAweEQ0MTgsIDB4RDQxOSwgMHhENDFBLCAweEQ0MUIsIDB4RDQxQywgMHhENDFFLAotICAgIDB4RDQxRiwgMHhENDIwLCAweEQ0MjEsIDB4RDQyMiwgMHhENDIzLCAweEQ0MjQsIDB4RDQyNSwgMHhENDI2LAotICAgIDB4RDQyNywgMHhENDI4LCAweEQ0MjksIDB4RDQyQSwgMHhENDJCLCAweEQ0MkMsIDB4RDQyRCwgMHhENDJFLAotICAgIDB4RDQyRiwgMHhENDMwLCAweEQ0MzEsIDB4RDQzMiwgMHhENDMzLCAweEQ0MzQsIDB4RDQzNSwgMHhENDM2LAotICAgIDB4RDQzNywgMHhENDM4LCAweEQ0MzksIDB4RDQzQSwgMHhENDNCLCAweEQ0M0MsIDB4RDQzRCwgMHhENDNFLAotICAgIDB4RDQzRiwgMHhENDQxLCAweEQ0NDIsIDB4RDQ0MywgMHhENDQ1LCAweEQ0NDYsIDB4RDQ0NywgMHhENDQ4LAotICAgIDB4RDQ0OSwgMHhENDRBLCAweEQ0NEIsIDB4RDQ0QywgMHhENDRELCAweEQ0NEUsIDB4RDQ0RiwgMHhENDUwLAotICAgIDB4RDQ1MSwgMHhENDUyLCAweEQ0NTMsIDB4RDQ1NCwgMHhENDU1LCAweEQ0NTYsIDB4RDQ1NywgMHhENDU4LAotICAgIDB4RDQ1OSwgMHhENDVBLCAweEQ0NUIsIDB4RDQ1RCwgMHhENDVFLCAweEQ0NUYsIDB4RDQ2MSwgMHhENDYyLAotICAgIDB4RDQ2MywgMHhENDY1LCAweEQ0NjYsIDB4RDQ2NywgMHhENDY4LCAweEQ0NjksIDB4RDQ2QSwgMHhENDZCLAotICAgIDB4RDQ2QywgMHhENDZFLCAweEQ0NzAsIDB4RDQ3MSwgMHhENDcyLCAweEQ0NzMsIDB4RDQ3NCwgMHhENDc1LAotICAgIDB4RDQ3NiwgMHhENDc3LCAweEQ0N0EsIDB4RDQ3QiwgMHhENDdELCAweEQ0N0UsIDB4RDQ4MSwgMHhENDgzLAotICAgIDB4RDQ4NCwgMHhENDg1LCAweEQ0ODYsIDB4RDQ4NywgMHhENDhBLCAweEQ0OEMsIDB4RDQ4RSwgMHhENDhGLAotICAgIDB4RDQ5MCwgMHhENDkxLCAweEQ0OTIsIDB4RDQ5MywgMHhENDk1LCAweEQ0OTYsIDB4RDQ5NywgMHhENDk4LAotICAgIDB4RDQ5OSwgMHhENDlBLCAweEQ0OUIsIDB4RDQ5QywgMHhENDlELCAweEQ0OUUsIDB4RDQ5RiwgMHhENEEwLAotICAgIDB4RDRBMSwgMHhENEEyLCAweEQ0QTMsIDB4RDRBNCwgMHhENEE1LCAweEQ0QTYsIDB4RDRBNywgMHhENEE4LAotICAgIDB4RDRBQSwgMHhENEFCLCAweEQ0QUMsIDB4RDRBRCwgMHhENEFFLCAweEQ0QUYsIDB4RDRCMCwgMHhENEIxLAotICAgIDB4RDRCMiwgMHhENEIzLCAweEQ0QjQsIDB4RDRCNSwgMHhENEI2LCAweEQ0QjcsIDB4RDRCOCwgMHhENEI5LAotICAgIDB4RDRCQSwgMHhENEJCLCAweEQ0QkMsIDB4RDRCRCwgMHhENEJFLCAweEQ0QkYsIDB4RDRDMCwgMHhENEMxLAotICAgIDB4RDRDMiwgMHhENEMzLCAweEQ0QzQsIDB4RDRDNSwgMHhENEM2LCAweEQ0QzcsIDB4RDRDOCwgMHhENEM5LAotICAgIDB4RDRDQSwgMHhENENCLCAweEQ0Q0QsIDB4RDRDRSwgMHhENENGLCAweEQ0RDEsIDB4RDREMiwgMHhENEQzLAotICAgIDB4RDRENSwgMHhENEQ2LCAweEQ0RDcsIDB4RDREOCwgMHhENEQ5LCAweEQ0REEsIDB4RDREQiwgMHhENERELAotICAgIDB4RDRERSwgMHhENEUwLCAweEQ0RTEsIDB4RDRFMiwgMHhENEUzLCAweEQ0RTQsIDB4RDRFNSwgMHhENEU2LAotICAgIDB4RDRFNywgMHhENEU5LCAweEQ0RUEsIDB4RDRFQiwgMHhENEVELCAweEQ0RUUsIDB4RDRFRiwgMHhENEYxLAotICAgIDB4RDRGMiwgMHhENEYzLCAweEQ0RjQsIDB4RDRGNSwgMHhENEY2LCAweEQ0RjcsIDB4RDRGOSwgMHhENEZBLAotICAgIDB4RDRGQywgMHhENEZFLCAweEQ0RkYsIDB4RDUwMCwgMHhENTAxLCAweEQ1MDIsIDB4RDUwMywgMHhENTA1LAotICAgIDB4RDUwNiwgMHhENTA3LCAweEQ1MDksIDB4RDUwQSwgMHhENTBCLCAweEQ1MEQsIDB4RDUwRSwgMHhENTBGLAotICAgIDB4RDUxMCwgMHhENTExLCAweEQ1MTIsIDB4RDUxMywgMHhENTE2LCAweEQ1MTgsIDB4RDUxOSwgMHhENTFBLAotICAgIDB4RDUxQiwgMHhENTFDLCAweEQ1MUQsIDB4RDUxRSwgMHhENTFGLCAweEQ1MjAsIDB4RDUyMSwgMHhENTIyLAotICAgIDB4RDUyMywgMHhENTI0LCAweEQ1MjUsIDB4RDUyNiwgMHhENTI3LCAweEQ1MjgsIDB4RDUyOSwgMHhENTJBLAotICAgIDB4RDUyQiwgMHhENTJDLCAweEQ1MkQsIDB4RDUyRSwgMHhENTJGLCAweEQ1MzAsIDB4RDUzMSwgMHhENTMyLAotICAgIDB4RDUzMywgMHhENTM0LCAweEQ1MzUsIDB4RDUzNiwgMHhENTM3LCAweEQ1MzgsIDB4RDUzOSwgMHhENTNBLAotICAgIDB4RDUzQiwgMHhENTNFLCAweEQ1M0YsIDB4RDU0MSwgMHhENTQyLCAweEQ1NDMsIDB4RDU0NSwgMHhENTQ2LAotICAgIDB4RDU0NywgMHhENTQ4LCAweEQ1NDksIDB4RDU0QSwgMHhENTRCLCAweEQ1NEUsIDB4RDU1MCwgMHhENTUyLAotICAgIDB4RDU1MywgMHhENTU0LCAweEQ1NTUsIDB4RDU1NiwgMHhENTU3LCAweEQ1NUEsIDB4RDU1QiwgMHhENTVELAotICAgIDB4RDU1RSwgMHhENTVGLCAweEQ1NjEsIDB4RDU2MiwgMHhENTYzLCAweEQ1NjQsIDB4RDU2NiwgMHhENTY3LAotICAgIDB4RDU2QSwgMHhENTZDLCAweEQ1NkUsIDB4RDU2RiwgMHhENTcwLCAweEQ1NzEsIDB4RDU3MiwgMHhENTczLAotICAgIDB4RDU3NiwgMHhENTc3LCAweEQ1NzksIDB4RDU3QSwgMHhENTdCLCAweEQ1N0QsIDB4RDU3RSwgMHhENTdGLAotICAgIDB4RDU4MCwgMHhENTgxLCAweEQ1ODIsIDB4RDU4MywgMHhENTg2LCAweEQ1OEEsIDB4RDU4QiwgMHhENThDLAotICAgIDB4RDU4RCwgMHhENThFLCAweEQ1OEYsIDB4RDU5MSwgMHhENTkyLCAweEQ1OTMsIDB4RDU5NCwgMHhENTk1LAotICAgIDB4RDU5NiwgMHhENTk3LCAweEQ1OTgsIDB4RDU5OSwgMHhENTlBLCAweEQ1OUIsIDB4RDU5QywgMHhENTlELAotICAgIDB4RDU5RSwgMHhENTlGLCAweEQ1QTAsIDB4RDVBMSwgMHhENUEyLCAweEQ1QTMsIDB4RDVBNCwgMHhENUE2LAotICAgIDB4RDVBNywgMHhENUE4LCAweEQ1QTksIDB4RDVBQSwgMHhENUFCLCAweEQ1QUMsIDB4RDVBRCwgMHhENUFFLAotICAgIDB4RDVBRiwgMHhENUIwLCAweEQ1QjEsIDB4RDVCMiwgMHhENUIzLCAweEQ1QjQsIDB4RDVCNSwgMHhENUI2LAotICAgIDB4RDVCNywgMHhENUI4LCAweEQ1QjksIDB4RDVCQSwgMHhENUJCLCAweEQ1QkMsIDB4RDVCRCwgMHhENUJFLAotICAgIDB4RDVCRiwgMHhENUMwLCAweEQ1QzEsIDB4RDVDMiwgMHhENUMzLCAweEQ1QzQsIDB4RDVDNSwgMHhENUM2LAotICAgIDB4RDVDNywgMHhENUNBLCAweEQ1Q0IsIDB4RDVDRCwgMHhENUNFLCAweEQ1Q0YsIDB4RDVEMSwgMHhENUQzLAotICAgIDB4RDVENCwgMHhENUQ1LCAweEQ1RDYsIDB4RDVENywgMHhENURBLCAweEQ1REMsIDB4RDVERSwgMHhENURGLAotICAgIDB4RDVFMCwgMHhENUUxLCAweEQ1RTIsIDB4RDVFMywgMHhENUU2LCAweEQ1RTcsIDB4RDVFOSwgMHhENUVBLAotICAgIDB4RDVFQiwgMHhENUVELCAweEQ1RUUsIDB4RDVFRiwgMHhENUYwLCAweEQ1RjEsIDB4RDVGMiwgMHhENUYzLAotICAgIDB4RDVGNiwgMHhENUY4LCAweEQ1RkEsIDB4RDVGQiwgMHhENUZDLCAweEQ1RkQsIDB4RDVGRSwgMHhENUZGLAotICAgIDB4RDYwMiwgMHhENjAzLCAweEQ2MDUsIDB4RDYwNiwgMHhENjA3LCAweEQ2MDksIDB4RDYwQSwgMHhENjBCLAotICAgIDB4RDYwQywgMHhENjBELCAweEQ2MEUsIDB4RDYwRiwgMHhENjEyLCAweEQ2MTYsIDB4RDYxNywgMHhENjE4LAotICAgIDB4RDYxOSwgMHhENjFBLCAweEQ2MUIsIDB4RDYxRCwgMHhENjFFLCAweEQ2MUYsIDB4RDYyMSwgMHhENjIyLAotICAgIDB4RDYyMywgMHhENjI1LCAweEQ2MjYsIDB4RDYyNywgMHhENjI4LCAweEQ2MjksIDB4RDYyQSwgMHhENjJCLAotICAgIDB4RDYyQywgMHhENjJFLCAweEQ2MkYsIDB4RDYzMCwgMHhENjMxLCAweEQ2MzIsIDB4RDYzMywgMHhENjM0LAotICAgIDB4RDYzNSwgMHhENjM2LCAweEQ2MzcsIDB4RDYzQSwgMHhENjNCLCAweEQ2M0QsIDB4RDYzRSwgMHhENjNGLAotICAgIDB4RDY0MSwgMHhENjQyLCAweEQ2NDMsIDB4RDY0NCwgMHhENjQ2LCAweEQ2NDcsIDB4RDY0QSwgMHhENjRDLAotICAgIDB4RDY0RSwgMHhENjRGLCAweEQ2NTAsIDB4RDY1MiwgMHhENjUzLCAweEQ2NTYsIDB4RDY1NywgMHhENjU5LAotICAgIDB4RDY1QSwgMHhENjVCLCAweEQ2NUQsIDB4RDY1RSwgMHhENjVGLCAweEQ2NjAsIDB4RDY2MSwgMHhENjYyLAotICAgIDB4RDY2MywgMHhENjY0LCAweEQ2NjUsIDB4RDY2NiwgMHhENjY4LCAweEQ2NkEsIDB4RDY2QiwgMHhENjZDLAotICAgIDB4RDY2RCwgMHhENjZFLCAweEQ2NkYsIDB4RDY3MiwgMHhENjczLCAweEQ2NzUsIDB4RDY3NiwgMHhENjc3LAotICAgIDB4RDY3OCwgMHhENjc5LCAweEQ2N0EsIDB4RDY3QiwgMHhENjdDLCAweEQ2N0QsIDB4RDY3RSwgMHhENjdGLAotICAgIDB4RDY4MCwgMHhENjgxLCAweEQ2ODIsIDB4RDY4NCwgMHhENjg2LCAweEQ2ODcsIDB4RDY4OCwgMHhENjg5LAotICAgIDB4RDY4QSwgMHhENjhCLCAweEQ2OEUsIDB4RDY4RiwgMHhENjkxLCAweEQ2OTIsIDB4RDY5MywgMHhENjk1LAotICAgIDB4RDY5NiwgMHhENjk3LCAweEQ2OTgsIDB4RDY5OSwgMHhENjlBLCAweEQ2OUIsIDB4RDY5QywgMHhENjlFLAotICAgIDB4RDZBMCwgMHhENkEyLCAweEQ2QTMsIDB4RDZBNCwgMHhENkE1LCAweEQ2QTYsIDB4RDZBNywgMHhENkE5LAotICAgIDB4RDZBQSwgMHhENkFCLCAweEQ2QUQsIDB4RDZBRSwgMHhENkFGLCAweEQ2QjEsIDB4RDZCMiwgMHhENkIzLAotICAgIDB4RDZCNCwgMHhENkI1LCAweEQ2QjYsIDB4RDZCNywgMHhENkI4LCAweEQ2QkEsIDB4RDZCQywgMHhENkJELAotICAgIDB4RDZCRSwgMHhENkJGLCAweEQ2QzAsIDB4RDZDMSwgMHhENkMyLCAweEQ2QzMsIDB4RDZDNiwgMHhENkM3LAotICAgIDB4RDZDOSwgMHhENkNBLCAweEQ2Q0IsIDB4RDZDRCwgMHhENkNFLCAweEQ2Q0YsIDB4RDZEMCwgMHhENkQyLAotICAgIDB4RDZEMywgMHhENkQ1LCAweEQ2RDYsIDB4RDZEOCwgMHhENkRBLCAweEQ2REIsIDB4RDZEQywgMHhENkRELAotICAgIDB4RDZERSwgMHhENkRGLCAweEQ2RTEsIDB4RDZFMiwgMHhENkUzLCAweEQ2RTUsIDB4RDZFNiwgMHhENkU3LAotICAgIDB4RDZFOSwgMHhENkVBLCAweEQ2RUIsIDB4RDZFQywgMHhENkVELCAweEQ2RUUsIDB4RDZFRiwgMHhENkYxLAotICAgIDB4RDZGMiwgMHhENkYzLCAweEQ2RjQsIDB4RDZGNiwgMHhENkY3LCAweEQ2RjgsIDB4RDZGOSwgMHhENkZBLAotICAgIDB4RDZGQiwgMHhENkZFLCAweEQ2RkYsIDB4RDcwMSwgMHhENzAyLCAweEQ3MDMsIDB4RDcwNSwgMHhENzA2LAotICAgIDB4RDcwNywgMHhENzA4LCAweEQ3MDksIDB4RDcwQSwgMHhENzBCLCAweEQ3MEMsIDB4RDcwRCwgMHhENzBFLAotICAgIDB4RDcwRiwgMHhENzEwLCAweEQ3MTIsIDB4RDcxMywgMHhENzE0LCAweEQ3MTUsIDB4RDcxNiwgMHhENzE3LAotICAgIDB4RDcxQSwgMHhENzFCLCAweEQ3MUQsIDB4RDcxRSwgMHhENzFGLCAweEQ3MjEsIDB4RDcyMiwgMHhENzIzLAotICAgIDB4RDcyNCwgMHhENzI1LCAweEQ3MjYsIDB4RDcyNywgMHhENzJBLCAweEQ3MkMsIDB4RDcyRSwgMHhENzJGLAotICAgIDB4RDczMCwgMHhENzMxLCAweEQ3MzIsIDB4RDczMywgMHhENzM2LCAweEQ3MzcsIDB4RDczOSwgMHhENzNBLAotICAgIDB4RDczQiwgMHhENzNELCAweEQ3M0UsIDB4RDczRiwgMHhENzQwLCAweEQ3NDEsIDB4RDc0MiwgMHhENzQzLAotICAgIDB4RDc0NSwgMHhENzQ2LCAweEQ3NDgsIDB4RDc0QSwgMHhENzRCLCAweEQ3NEMsIDB4RDc0RCwgMHhENzRFLAotICAgIDB4RDc0RiwgMHhENzUyLCAweEQ3NTMsIDB4RDc1NSwgMHhENzVBLCAweEQ3NUIsIDB4RDc1QywgMHhENzVELAotICAgIDB4RDc1RSwgMHhENzVGLCAweEQ3NjIsIDB4RDc2NCwgMHhENzY2LCAweEQ3NjcsIDB4RDc2OCwgMHhENzZBLAotICAgIDB4RDc2QiwgMHhENzZELCAweEQ3NkUsIDB4RDc2RiwgMHhENzcxLCAweEQ3NzIsIDB4RDc3MywgMHhENzc1LAotICAgIDB4RDc3NiwgMHhENzc3LCAweEQ3NzgsIDB4RDc3OSwgMHhENzdBLCAweEQ3N0IsIDB4RDc3RSwgMHhENzdGLAotICAgIDB4RDc4MCwgMHhENzgyLCAweEQ3ODMsIDB4RDc4NCwgMHhENzg1LCAweEQ3ODYsIDB4RDc4NywgMHhENzhBLAotICAgIDB4RDc4QiwgMHhENzhELCAweEQ3OEUsIDB4RDc4RiwgMHhENzkxLCAweEQ3OTIsIDB4RDc5MywgMHhENzk0LAotICAgIDB4RDc5NSwgMHhENzk2LCAweEQ3OTcsIDB4RDc5QSwgMHhENzlDLCAweEQ3OUUsIDB4RDc5RiwgMHhEN0EwLAotICAgIDB4RDdBMSwgMHhEN0EyLCAweEQ3QTMsIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LAotICAgIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsIDB4MDAyOCwgMHgwMDI5LCAweDAwMkEsIDB4MDAyQiwgMHgwMDJDLAotICAgIDB4MDAyRCwgMHgwMDJFLCAweDAwMkYsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LAotICAgIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLAotICAgIDB4MDAzRCwgMHgwMDNFLCAweDAwM0YsIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LAotICAgIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLAotICAgIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LAotICAgIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MDA1QiwgMHgwMDVDLAotICAgIDB4MDA1RCwgMHgwMDVFLCAweDAwNUYsIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LAotICAgIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLAotICAgIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LAotICAgIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LCAweDAwN0EsIDB4MDA3QiwgMHgwMDdDLAotICAgIDB4MDA3RCwgMHgwMDdFLCAweDIwQTksIDB4MjAxMCwgMHgwMEE5LCAweDIxMjIsIDB4MjJFRiwgMHgwMDIwLAotICAgIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywgMHgwMDI4LAotICAgIDB4MDAyOSwgMHgwMDJBLCAweDAwMkIsIDB4MDAyQywgMHgwMDJELCAweDAwMkUsIDB4MDAyRiwgMHgwMDMwLAotICAgIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgMHgwMDM4LAotICAgIDB4MDAzOSwgMHgwMDNBLCAweDAwM0IsIDB4MDAzQywgMHgwMDNELCAweDAwM0UsIDB4MDAzRiwgMHgwMDQwLAotICAgIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LAotICAgIDB4MDA0OSwgMHgwMDRBLCAweDAwNEIsIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLAotICAgIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LAotICAgIDB4MDA1OSwgMHgwMDVBLCAweDAwNUIsIDB4MDA1QywgMHgwMDVELCAweDAwNUUsIDB4MDA1RiwgMHgwMDYwLAotICAgIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywgMHgwMDY4LAotICAgIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywgMHgwMDZELCAweDAwNkUsIDB4MDA2RiwgMHgwMDcwLAotICAgIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywgMHgwMDc4LAotICAgIDB4MDA3OSwgMHgwMDdBLCAweDAwN0IsIDB4MDA3QywgMHgwMDdELCAweDIwM0UsIDB4MDA3RSwgMHgwMDVDLAorI2luY2x1ZGUgImNtYXBzX2tvcmVhMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0tvcmVhMUNJRDJVbmljb2RlXzJbMTgzNTJdID0geworICAgIDB4RkZGRCwgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisgICAgMHgwMDI4LCAweDAwMjksIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLCAweDAwMkYsIDB4MDAzMCwKKyAgICAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LAorICAgIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLCAweDAwM0YsIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsCisgICAgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwKKyAgICAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LAorICAgIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MDA1QiwgMHgwMDVDLCAweDAwNUQsCisgICAgMHgwMDVFLCAweDAwNUYsIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwKKyAgICAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsIDB4MDA2RSwgMHgwMDZGLAorICAgIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LCAweDAwNzgsCisgICAgMHgwMDc5LCAweDAwN0EsIDB4MDA3QiwgMHgwMDdDLCAweDAwN0QsIDB4MDA3RSwgMHgyMEE5LCAweDIwMTAsIDB4MDBBOSwKKyAgICAweDIxMjIsIDB4MjJFRiwgMHgzMDAwLCAweDMwMDEsIDB4MzAwMiwgMHgwMEI3LCAweDIwMjUsIDB4MjAyNiwgMHgwMEE4LAorICAgIDB4MzAwMywgMHgyMDEzLCAweDIwMTQsIDB4MjAxNiwgMHhGRjNDLCAweDIyM0MsIDB4MjAxOCwgMHgyMDE5LCAweDIwMUMsCisgICAgMHgyMDFELCAweDMwMTQsIDB4MzAxNSwgMHgzMDA4LCAweDMwMDksIDB4MzAwQSwgMHgzMDBCLCAweDMwMEMsIDB4MzAwRCwKKyAgICAweDMwMEUsIDB4MzAwRiwgMHgzMDEwLCAweDMwMTEsIDB4MDBCMSwgMHgwMEQ3LCAweDAwRjcsIDB4MjI2MCwgMHgyMjY0LAorICAgIDB4MjI2NSwgMHgyMjFFLCAweDIyMzQsIDB4MDBCMCwgMHgyMDMyLCAweDIwMzMsIDB4MjEwMywgMHgyMTJCLCAweEZGRTAsCisgICAgMHhGRkUxLCAweEZGRTUsIDB4MjY0MiwgMHgyNjQwLCAweDIyMjAsIDB4MjJBNSwgMHgyMzEyLCAweDIyMDIsIDB4MjIwNywKKyAgICAweDIyNjEsIDB4MjI1MiwgMHgwMEE3LCAweDIwM0IsIDB4MjYwNiwgMHgyNjA1LCAweDI1Q0IsIDB4MjVDRiwgMHgyNUNFLAorICAgIDB4MjVDNywgMHgyNUM2LCAweDI1QTEsIDB4MjVBMCwgMHgyNUIzLCAweDI1QjIsIDB4MjVCRCwgMHgyNUJDLCAweDIxOTIsCisgICAgMHgyMTkwLCAweDIxOTEsIDB4MjE5MywgMHgyMTk0LCAweDMwMTMsIDB4MjI2QSwgMHgyMjZCLCAweDIyMUEsIDB4MjIzRCwKKyAgICAweDIyMUQsIDB4MjIzNSwgMHgyMjJCLCAweDIyMkMsIDB4MjIwOCwgMHgyMjBCLCAweDIyODYsIDB4MjI4NywgMHgyMjgyLAorICAgIDB4MjI4MywgMHgyMjJBLCAweDIyMjksIDB4MjIyNywgMHgyMjI4LCAweEZGRTIsIDB4MjFEMiwgMHgyMUQ0LCAweDIyMDAsCisgICAgMHgyMjAzLCAweDAwQjQsIDB4MDJEQywgMHgwMkM3LCAweDAyRDgsIDB4MDJERCwgMHgwMkRBLCAweDAyRDksIDB4MDBCOCwKKyAgICAweDAyREIsIDB4MDBBMSwgMHgwMEJGLCAweDIyMzYsIDB4MjIyRSwgMHgyMjExLCAweDIyMEYsIDB4MDBBNCwgMHgyMTA5LAorICAgIDB4MjAzMCwgMHgyNUMxLCAweDI1QzAsIDB4MjVCNywgMHgyNUI2LCAweDI2NjQsIDB4MjY2MCwgMHgyNjYxLCAweDI2NjUsCisgICAgMHgyNjY3LCAweDI2NjMsIDB4MjI5OSwgMHgyNUM4LCAweDI1QTMsIDB4MjVEMCwgMHgyNUQxLCAweDI1OTIsIDB4MjVBNCwKKyAgICAweDI1QTUsIDB4MjVBOCwgMHgyNUE3LCAweDI1QTYsIDB4MjVBOSwgMHgyNjY4LCAweDI2MEYsIDB4MjYwRSwgMHgyNjFDLAorICAgIDB4MjYxRSwgMHgwMEI2LCAweDIwMjAsIDB4MjAyMSwgMHgyMTk1LCAweDIxOTcsIDB4MjE5OSwgMHgyMTk2LCAweDIxOTgsCisgICAgMHgyNjZELCAweDI2NjksIDB4MjY2QSwgMHgyNjZDLCAweDMyN0YsIDB4MzIxQywgMHgyMTE2LCAweDMzQzcsIDB4MjEyMiwKKyAgICAweDMzQzIsIDB4MzNEOCwgMHgyMTIxLCAweEZGMDEsIDB4RkYwMiwgMHhGRjAzLCAweEZGMDQsIDB4RkYwNSwgMHhGRjA2LAorICAgIDB4RkYwNywgMHhGRjA4LCAweEZGMDksIDB4RkYwQSwgMHhGRjBCLCAweEZGMEMsIDB4RkYwRCwgMHhGRjBFLCAweEZGMEYsCisgICAgMHhGRjEwLCAweEZGMTEsIDB4RkYxMiwgMHhGRjEzLCAweEZGMTQsIDB4RkYxNSwgMHhGRjE2LCAweEZGMTcsIDB4RkYxOCwKKyAgICAweEZGMTksIDB4RkYxQSwgMHhGRjFCLCAweEZGMUMsIDB4RkYxRCwgMHhGRjFFLCAweEZGMUYsIDB4RkYyMCwgMHhGRjIxLAorICAgIDB4RkYyMiwgMHhGRjIzLCAweEZGMjQsIDB4RkYyNSwgMHhGRjI2LCAweEZGMjcsIDB4RkYyOCwgMHhGRjI5LCAweEZGMkEsCisgICAgMHhGRjJCLCAweEZGMkMsIDB4RkYyRCwgMHhGRjJFLCAweEZGMkYsIDB4RkYzMCwgMHhGRjMxLCAweEZGMzIsIDB4RkYzMywKKyAgICAweEZGMzQsIDB4RkYzNSwgMHhGRjM2LCAweEZGMzcsIDB4RkYzOCwgMHhGRjM5LCAweEZGM0EsIDB4RkYzQiwgMHhGRkU2LAorICAgIDB4RkYzRCwgMHhGRjNFLCAweEZGM0YsIDB4RkY0MCwgMHhGRjQxLCAweEZGNDIsIDB4RkY0MywgMHhGRjQ0LCAweEZGNDUsCisgICAgMHhGRjQ2LCAweEZGNDcsIDB4RkY0OCwgMHhGRjQ5LCAweEZGNEEsIDB4RkY0QiwgMHhGRjRDLCAweEZGNEQsIDB4RkY0RSwKKyAgICAweEZGNEYsIDB4RkY1MCwgMHhGRjUxLCAweEZGNTIsIDB4RkY1MywgMHhGRjU0LCAweEZGNTUsIDB4RkY1NiwgMHhGRjU3LAorICAgIDB4RkY1OCwgMHhGRjU5LCAweEZGNUEsIDB4RkY1QiwgMHhGRjVDLCAweEZGNUQsIDB4RkZFMywgMHgzMTMxLCAweDMxMzIsCisgICAgMHgzMTMzLCAweDMxMzQsIDB4MzEzNSwgMHgzMTM2LCAweDMxMzcsIDB4MzEzOCwgMHgzMTM5LCAweDMxM0EsIDB4MzEzQiwKKyAgICAweDMxM0MsIDB4MzEzRCwgMHgzMTNFLCAweDMxM0YsIDB4MzE0MCwgMHgzMTQxLCAweDMxNDIsIDB4MzE0MywgMHgzMTQ0LAorICAgIDB4MzE0NSwgMHgzMTQ2LCAweDMxNDcsIDB4MzE0OCwgMHgzMTQ5LCAweDMxNEEsIDB4MzE0QiwgMHgzMTRDLCAweDMxNEQsCisgICAgMHgzMTRFLCAweDMxNEYsIDB4MzE1MCwgMHgzMTUxLCAweDMxNTIsIDB4MzE1MywgMHgzMTU0LCAweDMxNTUsIDB4MzE1NiwKKyAgICAweDMxNTcsIDB4MzE1OCwgMHgzMTU5LCAweDMxNUEsIDB4MzE1QiwgMHgzMTVDLCAweDMxNUQsIDB4MzE1RSwgMHgzMTVGLAorICAgIDB4MzE2MCwgMHgzMTYxLCAweDMxNjIsIDB4MzE2MywgMHgzMTY1LCAweDMxNjYsIDB4MzE2NywgMHgzMTY4LCAweDMxNjksCisgICAgMHgzMTZBLCAweDMxNkIsIDB4MzE2QywgMHgzMTZELCAweDMxNkUsIDB4MzE2RiwgMHgzMTcwLCAweDMxNzEsIDB4MzE3MiwKKyAgICAweDMxNzMsIDB4MzE3NCwgMHgzMTc1LCAweDMxNzYsIDB4MzE3NywgMHgzMTc4LCAweDMxNzksIDB4MzE3QSwgMHgzMTdCLAorICAgIDB4MzE3QywgMHgzMTdELCAweDMxN0UsIDB4MzE3RiwgMHgzMTgwLCAweDMxODEsIDB4MzE4MiwgMHgzMTgzLCAweDMxODQsCisgICAgMHgzMTg1LCAweDMxODYsIDB4MzE4NywgMHgzMTg4LCAweDMxODksIDB4MzE4QSwgMHgzMThCLCAweDMxOEMsIDB4MzE4RCwKKyAgICAweDMxOEUsIDB4MjE3MCwgMHgyMTcxLCAweDIxNzIsIDB4MjE3MywgMHgyMTc0LCAweDIxNzUsIDB4MjE3NiwgMHgyMTc3LAorICAgIDB4MjE3OCwgMHgyMTc5LCAweDIxNjAsIDB4MjE2MSwgMHgyMTYyLCAweDIxNjMsIDB4MjE2NCwgMHgyMTY1LCAweDIxNjYsCisgICAgMHgyMTY3LCAweDIxNjgsIDB4MjE2OSwgMHgwMzkxLCAweDAzOTIsIDB4MDM5MywgMHgwMzk0LCAweDAzOTUsIDB4MDM5NiwKKyAgICAweDAzOTcsIDB4MDM5OCwgMHgwMzk5LCAweDAzOUEsIDB4MDM5QiwgMHgwMzlDLCAweDAzOUQsIDB4MDM5RSwgMHgwMzlGLAorICAgIDB4MDNBMCwgMHgwM0ExLCAweDAzQTMsIDB4MDNBNCwgMHgwM0E1LCAweDAzQTYsIDB4MDNBNywgMHgwM0E4LCAweDAzQTksCisgICAgMHgwM0IxLCAweDAzQjIsIDB4MDNCMywgMHgwM0I0LCAweDAzQjUsIDB4MDNCNiwgMHgwM0I3LCAweDAzQjgsIDB4MDNCOSwKKyAgICAweDAzQkEsIDB4MDNCQiwgMHgwM0JDLCAweDAzQkQsIDB4MDNCRSwgMHgwM0JGLCAweDAzQzAsIDB4MDNDMSwgMHgwM0MzLAorICAgIDB4MDNDNCwgMHgwM0M1LCAweDAzQzYsIDB4MDNDNywgMHgwM0M4LCAweDAzQzksIDB4MjUwMCwgMHgyNTAyLCAweDI1MEMsCisgICAgMHgyNTEwLCAweDI1MTgsIDB4MjUxNCwgMHgyNTFDLCAweDI1MkMsIDB4MjUyNCwgMHgyNTM0LCAweDI1M0MsIDB4MjUwMSwKKyAgICAweDI1MDMsIDB4MjUwRiwgMHgyNTEzLCAweDI1MUIsIDB4MjUxNywgMHgyNTIzLCAweDI1MzMsIDB4MjUyQiwgMHgyNTNCLAorICAgIDB4MjU0QiwgMHgyNTIwLCAweDI1MkYsIDB4MjUyOCwgMHgyNTM3LCAweDI1M0YsIDB4MjUxRCwgMHgyNTMwLCAweDI1MjUsCisgICAgMHgyNTM4LCAweDI1NDIsIDB4MjUxMiwgMHgyNTExLCAweDI1MUEsIDB4MjUxOSwgMHgyNTE2LCAweDI1MTUsIDB4MjUwRSwKKyAgICAweDI1MEQsIDB4MjUxRSwgMHgyNTFGLCAweDI1MjEsIDB4MjUyMiwgMHgyNTI2LCAweDI1MjcsIDB4MjUyOSwgMHgyNTJBLAorICAgIDB4MjUyRCwgMHgyNTJFLCAweDI1MzEsIDB4MjUzMiwgMHgyNTM1LCAweDI1MzYsIDB4MjUzOSwgMHgyNTNBLCAweDI1M0QsCisgICAgMHgyNTNFLCAweDI1NDAsIDB4MjU0MSwgMHgyNTQzLCAweDI1NDQsIDB4MjU0NSwgMHgyNTQ2LCAweDI1NDcsIDB4MjU0OCwKKyAgICAweDI1NDksIDB4MjU0QSwgMHgzMzk1LCAweDMzOTYsIDB4MzM5NywgMHgyMTEzLCAweDMzOTgsIDB4MzNDNCwgMHgzM0EzLAorICAgIDB4MzNBNCwgMHgzM0E1LCAweDMzQTYsIDB4MzM5OSwgMHgzMzlBLCAweDMzOUIsIDB4MzM5QywgMHgzMzlELCAweDMzOUUsCisgICAgMHgzMzlGLCAweDMzQTAsIDB4MzNBMSwgMHgzM0EyLCAweDMzQ0EsIDB4MzM4RCwgMHgzMzhFLCAweDMzOEYsIDB4MzNDRiwKKyAgICAweDMzODgsIDB4MzM4OSwgMHgzM0M4LCAweDMzQTcsIDB4MzNBOCwgMHgzM0IwLCAweDMzQjEsIDB4MzNCMiwgMHgzM0IzLAorICAgIDB4MzNCNCwgMHgzM0I1LCAweDMzQjYsIDB4MzNCNywgMHgzM0I4LCAweDMzQjksIDB4MzM4MCwgMHgzMzgxLCAweDMzODIsCisgICAgMHgzMzgzLCAweDMzODQsIDB4MzNCQSwgMHgzM0JCLCAweDMzQkMsIDB4MzNCRCwgMHgzM0JFLCAweDMzQkYsIDB4MzM5MCwKKyAgICAweDMzOTEsIDB4MzM5MiwgMHgzMzkzLCAweDMzOTQsIDB4MjEyNiwgMHgzM0MwLCAweDMzQzEsIDB4MzM4QSwgMHgzMzhCLAorICAgIDB4MzM4QywgMHgzM0Q2LCAweDMzQzUsIDB4MzNBRCwgMHgzM0FFLCAweDMzQUYsIDB4MzNEQiwgMHgzM0E5LCAweDMzQUEsCisgICAgMHgzM0FCLCAweDMzQUMsIDB4MzNERCwgMHgzM0QwLCAweDMzRDMsIDB4MzNDMywgMHgzM0M5LCAweDMzREMsIDB4MzNDNiwKKyAgICAweDAwQzYsIDB4MDBEMCwgMHgwMEFBLCAweDAxMjYsIDB4MDEzMiwgMHgwMTNGLCAweDAxNDEsIDB4MDBEOCwgMHgwMTUyLAorICAgIDB4MDBCQSwgMHgwMERFLCAweDAxNjYsIDB4MDE0QSwgMHgzMjYwLCAweDMyNjEsIDB4MzI2MiwgMHgzMjYzLCAweDMyNjQsCisgICAgMHgzMjY1LCAweDMyNjYsIDB4MzI2NywgMHgzMjY4LCAweDMyNjksIDB4MzI2QSwgMHgzMjZCLCAweDMyNkMsIDB4MzI2RCwKKyAgICAweDMyNkUsIDB4MzI2RiwgMHgzMjcwLCAweDMyNzEsIDB4MzI3MiwgMHgzMjczLCAweDMyNzQsIDB4MzI3NSwgMHgzMjc2LAorICAgIDB4MzI3NywgMHgzMjc4LCAweDMyNzksIDB4MzI3QSwgMHgzMjdCLCAweDI0RDAsIDB4MjREMSwgMHgyNEQyLCAweDI0RDMsCisgICAgMHgyNEQ0LCAweDI0RDUsIDB4MjRENiwgMHgyNEQ3LCAweDI0RDgsIDB4MjREOSwgMHgyNERBLCAweDI0REIsIDB4MjREQywKKyAgICAweDI0REQsIDB4MjRERSwgMHgyNERGLCAweDI0RTAsIDB4MjRFMSwgMHgyNEUyLCAweDI0RTMsIDB4MjRFNCwgMHgyNEU1LAorICAgIDB4MjRFNiwgMHgyNEU3LCAweDI0RTgsIDB4MjRFOSwgMHgyNDYwLCAweDI0NjEsIDB4MjQ2MiwgMHgyNDYzLCAweDI0NjQsCisgICAgMHgyNDY1LCAweDI0NjYsIDB4MjQ2NywgMHgyNDY4LCAweDI0NjksIDB4MjQ2QSwgMHgyNDZCLCAweDI0NkMsIDB4MjQ2RCwKKyAgICAweDI0NkUsIDB4MDBCRCwgMHgyMTUzLCAweDIxNTQsIDB4MDBCQywgMHgwMEJFLCAweDIxNUIsIDB4MjE1QywgMHgyMTVELAorICAgIDB4MjE1RSwgMHgwMEU2LCAweDAxMTEsIDB4MDBGMCwgMHgwMTI3LCAweDAxMzEsIDB4MDEzMywgMHgwMTM4LCAweDAxNDAsCisgICAgMHgwMTQyLCAweDAwRjgsIDB4MDE1MywgMHgwMERGLCAweDAwRkUsIDB4MDE2NywgMHgwMTRCLCAweDAxNDksIDB4MzIwMCwKKyAgICAweDMyMDEsIDB4MzIwMiwgMHgzMjAzLCAweDMyMDQsIDB4MzIwNSwgMHgzMjA2LCAweDMyMDcsIDB4MzIwOCwgMHgzMjA5LAorICAgIDB4MzIwQSwgMHgzMjBCLCAweDMyMEMsIDB4MzIwRCwgMHgzMjBFLCAweDMyMEYsIDB4MzIxMCwgMHgzMjExLCAweDMyMTIsCisgICAgMHgzMjEzLCAweDMyMTQsIDB4MzIxNSwgMHgzMjE2LCAweDMyMTcsIDB4MzIxOCwgMHgzMjE5LCAweDMyMUEsIDB4MzIxQiwKKyAgICAweDI0OUMsIDB4MjQ5RCwgMHgyNDlFLCAweDI0OUYsIDB4MjRBMCwgMHgyNEExLCAweDI0QTIsIDB4MjRBMywgMHgyNEE0LAorICAgIDB4MjRBNSwgMHgyNEE2LCAweDI0QTcsIDB4MjRBOCwgMHgyNEE5LCAweDI0QUEsIDB4MjRBQiwgMHgyNEFDLCAweDI0QUQsCisgICAgMHgyNEFFLCAweDI0QUYsIDB4MjRCMCwgMHgyNEIxLCAweDI0QjIsIDB4MjRCMywgMHgyNEI0LCAweDI0QjUsIDB4MjQ3NCwKKyAgICAweDI0NzUsIDB4MjQ3NiwgMHgyNDc3LCAweDI0NzgsIDB4MjQ3OSwgMHgyNDdBLCAweDI0N0IsIDB4MjQ3QywgMHgyNDdELAorICAgIDB4MjQ3RSwgMHgyNDdGLCAweDI0ODAsIDB4MjQ4MSwgMHgyNDgyLCAweDAwQjksIDB4MDBCMiwgMHgwMEIzLCAweDIwNzQsCisgICAgMHgyMDdGLCAweDIwODEsIDB4MjA4MiwgMHgyMDgzLCAweDIwODQsIDB4MzA0MSwgMHgzMDQyLCAweDMwNDMsIDB4MzA0NCwKKyAgICAweDMwNDUsIDB4MzA0NiwgMHgzMDQ3LCAweDMwNDgsIDB4MzA0OSwgMHgzMDRBLCAweDMwNEIsIDB4MzA0QywgMHgzMDRELAorICAgIDB4MzA0RSwgMHgzMDRGLCAweDMwNTAsIDB4MzA1MSwgMHgzMDUyLCAweDMwNTMsIDB4MzA1NCwgMHgzMDU1LCAweDMwNTYsCisgICAgMHgzMDU3LCAweDMwNTgsIDB4MzA1OSwgMHgzMDVBLCAweDMwNUIsIDB4MzA1QywgMHgzMDVELCAweDMwNUUsIDB4MzA1RiwKKyAgICAweDMwNjAsIDB4MzA2MSwgMHgzMDYyLCAweDMwNjMsIDB4MzA2NCwgMHgzMDY1LCAweDMwNjYsIDB4MzA2NywgMHgzMDY4LAorICAgIDB4MzA2OSwgMHgzMDZBLCAweDMwNkIsIDB4MzA2QywgMHgzMDZELCAweDMwNkUsIDB4MzA2RiwgMHgzMDcwLCAweDMwNzEsCisgICAgMHgzMDcyLCAweDMwNzMsIDB4MzA3NCwgMHgzMDc1LCAweDMwNzYsIDB4MzA3NywgMHgzMDc4LCAweDMwNzksIDB4MzA3QSwKKyAgICAweDMwN0IsIDB4MzA3QywgMHgzMDdELCAweDMwN0UsIDB4MzA3RiwgMHgzMDgwLCAweDMwODEsIDB4MzA4MiwgMHgzMDgzLAorICAgIDB4MzA4NCwgMHgzMDg1LCAweDMwODYsIDB4MzA4NywgMHgzMDg4LCAweDMwODksIDB4MzA4QSwgMHgzMDhCLCAweDMwOEMsCisgICAgMHgzMDhELCAweDMwOEUsIDB4MzA4RiwgMHgzMDkwLCAweDMwOTEsIDB4MzA5MiwgMHgzMDkzLCAweDMwQTEsIDB4MzBBMiwKKyAgICAweDMwQTMsIDB4MzBBNCwgMHgzMEE1LCAweDMwQTYsIDB4MzBBNywgMHgzMEE4LCAweDMwQTksIDB4MzBBQSwgMHgzMEFCLAorICAgIDB4MzBBQywgMHgzMEFELCAweDMwQUUsIDB4MzBBRiwgMHgzMEIwLCAweDMwQjEsIDB4MzBCMiwgMHgzMEIzLCAweDMwQjQsCisgICAgMHgzMEI1LCAweDMwQjYsIDB4MzBCNywgMHgzMEI4LCAweDMwQjksIDB4MzBCQSwgMHgzMEJCLCAweDMwQkMsIDB4MzBCRCwKKyAgICAweDMwQkUsIDB4MzBCRiwgMHgzMEMwLCAweDMwQzEsIDB4MzBDMiwgMHgzMEMzLCAweDMwQzQsIDB4MzBDNSwgMHgzMEM2LAorICAgIDB4MzBDNywgMHgzMEM4LCAweDMwQzksIDB4MzBDQSwgMHgzMENCLCAweDMwQ0MsIDB4MzBDRCwgMHgzMENFLCAweDMwQ0YsCisgICAgMHgzMEQwLCAweDMwRDEsIDB4MzBEMiwgMHgzMEQzLCAweDMwRDQsIDB4MzBENSwgMHgzMEQ2LCAweDMwRDcsIDB4MzBEOCwKKyAgICAweDMwRDksIDB4MzBEQSwgMHgzMERCLCAweDMwREMsIDB4MzBERCwgMHgzMERFLCAweDMwREYsIDB4MzBFMCwgMHgzMEUxLAorICAgIDB4MzBFMiwgMHgzMEUzLCAweDMwRTQsIDB4MzBFNSwgMHgzMEU2LCAweDMwRTcsIDB4MzBFOCwgMHgzMEU5LCAweDMwRUEsCisgICAgMHgzMEVCLCAweDMwRUMsIDB4MzBFRCwgMHgzMEVFLCAweDMwRUYsIDB4MzBGMCwgMHgzMEYxLCAweDMwRjIsIDB4MzBGMywKKyAgICAweDMwRjQsIDB4MzBGNSwgMHgzMEY2LCAweDA0MTAsIDB4MDQxMSwgMHgwNDEyLCAweDA0MTMsIDB4MDQxNCwgMHgwNDE1LAorICAgIDB4MDQwMSwgMHgwNDE2LCAweDA0MTcsIDB4MDQxOCwgMHgwNDE5LCAweDA0MUEsIDB4MDQxQiwgMHgwNDFDLCAweDA0MUQsCisgICAgMHgwNDFFLCAweDA0MUYsIDB4MDQyMCwgMHgwNDIxLCAweDA0MjIsIDB4MDQyMywgMHgwNDI0LCAweDA0MjUsIDB4MDQyNiwKKyAgICAweDA0MjcsIDB4MDQyOCwgMHgwNDI5LCAweDA0MkEsIDB4MDQyQiwgMHgwNDJDLCAweDA0MkQsIDB4MDQyRSwgMHgwNDJGLAorICAgIDB4MDQzMCwgMHgwNDMxLCAweDA0MzIsIDB4MDQzMywgMHgwNDM0LCAweDA0MzUsIDB4MDQ1MSwgMHgwNDM2LCAweDA0MzcsCisgICAgMHgwNDM4LCAweDA0MzksIDB4MDQzQSwgMHgwNDNCLCAweDA0M0MsIDB4MDQzRCwgMHgwNDNFLCAweDA0M0YsIDB4MDQ0MCwKKyAgICAweDA0NDEsIDB4MDQ0MiwgMHgwNDQzLCAweDA0NDQsIDB4MDQ0NSwgMHgwNDQ2LCAweDA0NDcsIDB4MDQ0OCwgMHgwNDQ5LAorICAgIDB4MDQ0QSwgMHgwNDRCLCAweDA0NEMsIDB4MDQ0RCwgMHgwNDRFLCAweDA0NEYsIDB4QUMwMCwgMHhBQzAxLCAweEFDMDQsCisgICAgMHhBQzA3LCAweEFDMDgsIDB4QUMwOSwgMHhBQzBBLCAweEFDMTAsIDB4QUMxMSwgMHhBQzEyLCAweEFDMTMsIDB4QUMxNCwKKyAgICAweEFDMTUsIDB4QUMxNiwgMHhBQzE3LCAweEFDMTksIDB4QUMxQSwgMHhBQzFCLCAweEFDMUMsIDB4QUMxRCwgMHhBQzIwLAorICAgIDB4QUMyNCwgMHhBQzJDLCAweEFDMkQsIDB4QUMyRiwgMHhBQzMwLCAweEFDMzEsIDB4QUMzOCwgMHhBQzM5LCAweEFDM0MsCisgICAgMHhBQzQwLCAweEFDNEIsIDB4QUM0RCwgMHhBQzU0LCAweEFDNTgsIDB4QUM1QywgMHhBQzcwLCAweEFDNzEsIDB4QUM3NCwKKyAgICAweEFDNzcsIDB4QUM3OCwgMHhBQzdBLCAweEFDODAsIDB4QUM4MSwgMHhBQzgzLCAweEFDODQsIDB4QUM4NSwgMHhBQzg2LAorICAgIDB4QUM4OSwgMHhBQzhBLCAweEFDOEIsIDB4QUM4QywgMHhBQzkwLCAweEFDOTQsIDB4QUM5QywgMHhBQzlELCAweEFDOUYsCisgICAgMHhBQ0EwLCAweEFDQTEsIDB4QUNBOCwgMHhBQ0E5LCAweEFDQUEsIDB4QUNBQywgMHhBQ0FGLCAweEFDQjAsIDB4QUNCOCwKKyAgICAweEFDQjksIDB4QUNCQiwgMHhBQ0JDLCAweEFDQkQsIDB4QUNDMSwgMHhBQ0M0LCAweEFDQzgsIDB4QUNDQywgMHhBQ0Q1LAorICAgIDB4QUNENywgMHhBQ0UwLCAweEFDRTEsIDB4QUNFNCwgMHhBQ0U3LCAweEFDRTgsIDB4QUNFQSwgMHhBQ0VDLCAweEFDRUYsCisgICAgMHhBQ0YwLCAweEFDRjEsIDB4QUNGMywgMHhBQ0Y1LCAweEFDRjYsIDB4QUNGQywgMHhBQ0ZELCAweEFEMDAsIDB4QUQwNCwKKyAgICAweEFEMDYsIDB4QUQwQywgMHhBRDBELCAweEFEMEYsIDB4QUQxMSwgMHhBRDE4LCAweEFEMUMsIDB4QUQyMCwgMHhBRDI5LAorICAgIDB4QUQyQywgMHhBRDJELCAweEFEMzQsIDB4QUQzNSwgMHhBRDM4LCAweEFEM0MsIDB4QUQ0NCwgMHhBRDQ1LCAweEFENDcsCisgICAgMHhBRDQ5LCAweEFENTAsIDB4QUQ1NCwgMHhBRDU4LCAweEFENjEsIDB4QUQ2MywgMHhBRDZDLCAweEFENkQsIDB4QUQ3MCwKKyAgICAweEFENzMsIDB4QUQ3NCwgMHhBRDc1LCAweEFENzYsIDB4QUQ3QiwgMHhBRDdDLCAweEFEN0QsIDB4QUQ3RiwgMHhBRDgxLAorICAgIDB4QUQ4MiwgMHhBRDg4LCAweEFEODksIDB4QUQ4QywgMHhBRDkwLCAweEFEOUMsIDB4QUQ5RCwgMHhBREE0LCAweEFEQjcsCisgICAgMHhBREMwLCAweEFEQzEsIDB4QURDNCwgMHhBREM4LCAweEFERDAsIDB4QUREMSwgMHhBREQzLCAweEFEREMsIDB4QURFMCwKKyAgICAweEFERTQsIDB4QURGOCwgMHhBREY5LCAweEFERkMsIDB4QURGRiwgMHhBRTAwLCAweEFFMDEsIDB4QUUwOCwgMHhBRTA5LAorICAgIDB4QUUwQiwgMHhBRTBELCAweEFFMTQsIDB4QUUzMCwgMHhBRTMxLCAweEFFMzQsIDB4QUUzNywgMHhBRTM4LCAweEFFM0EsCisgICAgMHhBRTQwLCAweEFFNDEsIDB4QUU0MywgMHhBRTQ1LCAweEFFNDYsIDB4QUU0QSwgMHhBRTRDLCAweEFFNEQsIDB4QUU0RSwKKyAgICAweEFFNTAsIDB4QUU1NCwgMHhBRTU2LCAweEFFNUMsIDB4QUU1RCwgMHhBRTVGLCAweEFFNjAsIDB4QUU2MSwgMHhBRTY1LAorICAgIDB4QUU2OCwgMHhBRTY5LCAweEFFNkMsIDB4QUU3MCwgMHhBRTc4LCAweEFFNzksIDB4QUU3QiwgMHhBRTdDLCAweEFFN0QsCisgICAgMHhBRTg0LCAweEFFODUsIDB4QUU4QywgMHhBRUJDLCAweEFFQkQsIDB4QUVCRSwgMHhBRUMwLCAweEFFQzQsIDB4QUVDQywKKyAgICAweEFFQ0QsIDB4QUVDRiwgMHhBRUQwLCAweEFFRDEsIDB4QUVEOCwgMHhBRUQ5LCAweEFFREMsIDB4QUVFOCwgMHhBRUVCLAorICAgIDB4QUVFRCwgMHhBRUY0LCAweEFFRjgsIDB4QUVGQywgMHhBRjA3LCAweEFGMDgsIDB4QUYwRCwgMHhBRjEwLCAweEFGMkMsCisgICAgMHhBRjJELCAweEFGMzAsIDB4QUYzMiwgMHhBRjM0LCAweEFGM0MsIDB4QUYzRCwgMHhBRjNGLCAweEFGNDEsIDB4QUY0MiwKKyAgICAweEFGNDMsIDB4QUY0OCwgMHhBRjQ5LCAweEFGNTAsIDB4QUY1QywgMHhBRjVELCAweEFGNjQsIDB4QUY2NSwgMHhBRjc5LAorICAgIDB4QUY4MCwgMHhBRjg0LCAweEFGODgsIDB4QUY5MCwgMHhBRjkxLCAweEFGOTUsIDB4QUY5QywgMHhBRkI4LCAweEFGQjksCisgICAgMHhBRkJDLCAweEFGQzAsIDB4QUZDNywgMHhBRkM4LCAweEFGQzksIDB4QUZDQiwgMHhBRkNELCAweEFGQ0UsIDB4QUZENCwKKyAgICAweEFGREMsIDB4QUZFOCwgMHhBRkU5LCAweEFGRjAsIDB4QUZGMSwgMHhBRkY0LCAweEFGRjgsIDB4QjAwMCwgMHhCMDAxLAorICAgIDB4QjAwNCwgMHhCMDBDLCAweEIwMTAsIDB4QjAxNCwgMHhCMDFDLCAweEIwMUQsIDB4QjAyOCwgMHhCMDQ0LCAweEIwNDUsCisgICAgMHhCMDQ4LCAweEIwNEEsIDB4QjA0QywgMHhCMDRFLCAweEIwNTMsIDB4QjA1NCwgMHhCMDU1LCAweEIwNTcsIDB4QjA1OSwKKyAgICAweEIwNUQsIDB4QjA3QywgMHhCMDdELCAweEIwODAsIDB4QjA4NCwgMHhCMDhDLCAweEIwOEQsIDB4QjA4RiwgMHhCMDkxLAorICAgIDB4QjA5OCwgMHhCMDk5LCAweEIwOUEsIDB4QjA5QywgMHhCMDlGLCAweEIwQTAsIDB4QjBBMSwgMHhCMEEyLCAweEIwQTgsCisgICAgMHhCMEE5LCAweEIwQUIsIDB4QjBBQywgMHhCMEFELCAweEIwQUUsIDB4QjBBRiwgMHhCMEIxLCAweEIwQjMsIDB4QjBCNCwKKyAgICAweEIwQjUsIDB4QjBCOCwgMHhCMEJDLCAweEIwQzQsIDB4QjBDNSwgMHhCMEM3LCAweEIwQzgsIDB4QjBDOSwgMHhCMEQwLAorICAgIDB4QjBEMSwgMHhCMEQ0LCAweEIwRDgsIDB4QjBFMCwgMHhCMEU1LCAweEIxMDgsIDB4QjEwOSwgMHhCMTBCLCAweEIxMEMsCisgICAgMHhCMTEwLCAweEIxMTIsIDB4QjExMywgMHhCMTE4LCAweEIxMTksIDB4QjExQiwgMHhCMTFDLCAweEIxMUQsIDB4QjEyMywKKyAgICAweEIxMjQsIDB4QjEyNSwgMHhCMTI4LCAweEIxMkMsIDB4QjEzNCwgMHhCMTM1LCAweEIxMzcsIDB4QjEzOCwgMHhCMTM5LAorICAgIDB4QjE0MCwgMHhCMTQxLCAweEIxNDQsIDB4QjE0OCwgMHhCMTUwLCAweEIxNTEsIDB4QjE1NCwgMHhCMTU1LCAweEIxNTgsCisgICAgMHhCMTVDLCAweEIxNjAsIDB4QjE3OCwgMHhCMTc5LCAweEIxN0MsIDB4QjE4MCwgMHhCMTgyLCAweEIxODgsIDB4QjE4OSwKKyAgICAweEIxOEIsIDB4QjE4RCwgMHhCMTkyLCAweEIxOTMsIDB4QjE5NCwgMHhCMTk4LCAweEIxOUMsIDB4QjFBOCwgMHhCMUNDLAorICAgIDB4QjFEMCwgMHhCMUQ0LCAweEIxREMsIDB4QjFERCwgMHhCMURGLCAweEIxRTgsIDB4QjFFOSwgMHhCMUVDLCAweEIxRjAsCisgICAgMHhCMUY5LCAweEIxRkIsIDB4QjFGRCwgMHhCMjA0LCAweEIyMDUsIDB4QjIwOCwgMHhCMjBCLCAweEIyMEMsIDB4QjIxNCwKKyAgICAweEIyMTUsIDB4QjIxNywgMHhCMjE5LCAweEIyMjAsIDB4QjIzNCwgMHhCMjNDLCAweEIyNTgsIDB4QjI1QywgMHhCMjYwLAorICAgIDB4QjI2OCwgMHhCMjY5LCAweEIyNzQsIDB4QjI3NSwgMHhCMjdDLCAweEIyODQsIDB4QjI4NSwgMHhCMjg5LCAweEIyOTAsCisgICAgMHhCMjkxLCAweEIyOTQsIDB4QjI5OCwgMHhCMjk5LCAweEIyOUEsIDB4QjJBMCwgMHhCMkExLCAweEIyQTMsIDB4QjJBNSwKKyAgICAweEIyQTYsIDB4QjJBQSwgMHhCMkFDLCAweEIyQjAsIDB4QjJCNCwgMHhCMkM4LCAweEIyQzksIDB4QjJDQywgMHhCMkQwLAorICAgIDB4QjJEMiwgMHhCMkQ4LCAweEIyRDksIDB4QjJEQiwgMHhCMkRELCAweEIyRTIsIDB4QjJFNCwgMHhCMkU1LCAweEIyRTYsCisgICAgMHhCMkU4LCAweEIyRUIsIDB4QjJFQywgMHhCMkVELCAweEIyRUUsIDB4QjJFRiwgMHhCMkYzLCAweEIyRjQsIDB4QjJGNSwKKyAgICAweEIyRjcsIDB4QjJGOCwgMHhCMkY5LCAweEIyRkEsIDB4QjJGQiwgMHhCMkZGLCAweEIzMDAsIDB4QjMwMSwgMHhCMzA0LAorICAgIDB4QjMwOCwgMHhCMzEwLCAweEIzMTEsIDB4QjMxMywgMHhCMzE0LCAweEIzMTUsIDB4QjMxQywgMHhCMzU0LCAweEIzNTUsCisgICAgMHhCMzU2LCAweEIzNTgsIDB4QjM1QiwgMHhCMzVDLCAweEIzNUUsIDB4QjM1RiwgMHhCMzY0LCAweEIzNjUsIDB4QjM2NywKKyAgICAweEIzNjksIDB4QjM2QiwgMHhCMzZFLCAweEIzNzAsIDB4QjM3MSwgMHhCMzc0LCAweEIzNzgsIDB4QjM4MCwgMHhCMzgxLAorICAgIDB4QjM4MywgMHhCMzg0LCAweEIzODUsIDB4QjM4QywgMHhCMzkwLCAweEIzOTQsIDB4QjNBMCwgMHhCM0ExLCAweEIzQTgsCisgICAgMHhCM0FDLCAweEIzQzQsIDB4QjNDNSwgMHhCM0M4LCAweEIzQ0IsIDB4QjNDQywgMHhCM0NFLCAweEIzRDAsIDB4QjNENCwKKyAgICAweEIzRDUsIDB4QjNENywgMHhCM0Q5LCAweEIzREIsIDB4QjNERCwgMHhCM0UwLCAweEIzRTQsIDB4QjNFOCwgMHhCM0ZDLAorICAgIDB4QjQxMCwgMHhCNDE4LCAweEI0MUMsIDB4QjQyMCwgMHhCNDI4LCAweEI0MjksIDB4QjQyQiwgMHhCNDM0LCAweEI0NTAsCisgICAgMHhCNDUxLCAweEI0NTQsIDB4QjQ1OCwgMHhCNDYwLCAweEI0NjEsIDB4QjQ2MywgMHhCNDY1LCAweEI0NkMsIDB4QjQ4MCwKKyAgICAweEI0ODgsIDB4QjQ5RCwgMHhCNEE0LCAweEI0QTgsIDB4QjRBQywgMHhCNEI1LCAweEI0QjcsIDB4QjRCOSwgMHhCNEMwLAorICAgIDB4QjRDNCwgMHhCNEM4LCAweEI0RDAsIDB4QjRENSwgMHhCNERDLCAweEI0REQsIDB4QjRFMCwgMHhCNEUzLCAweEI0RTQsCisgICAgMHhCNEU2LCAweEI0RUMsIDB4QjRFRCwgMHhCNEVGLCAweEI0RjEsIDB4QjRGOCwgMHhCNTE0LCAweEI1MTUsIDB4QjUxOCwKKyAgICAweEI1MUIsIDB4QjUxQywgMHhCNTI0LCAweEI1MjUsIDB4QjUyNywgMHhCNTI4LCAweEI1MjksIDB4QjUyQSwgMHhCNTMwLAorICAgIDB4QjUzMSwgMHhCNTM0LCAweEI1MzgsIDB4QjU0MCwgMHhCNTQxLCAweEI1NDMsIDB4QjU0NCwgMHhCNTQ1LCAweEI1NEIsCisgICAgMHhCNTRDLCAweEI1NEQsIDB4QjU1MCwgMHhCNTU0LCAweEI1NUMsIDB4QjU1RCwgMHhCNTVGLCAweEI1NjAsIDB4QjU2MSwKKyAgICAweEI1QTAsIDB4QjVBMSwgMHhCNUE0LCAweEI1QTgsIDB4QjVBQSwgMHhCNUFCLCAweEI1QjAsIDB4QjVCMSwgMHhCNUIzLAorICAgIDB4QjVCNCwgMHhCNUI1LCAweEI1QkIsIDB4QjVCQywgMHhCNUJELCAweEI1QzAsIDB4QjVDNCwgMHhCNUNDLCAweEI1Q0QsCisgICAgMHhCNUNGLCAweEI1RDAsIDB4QjVEMSwgMHhCNUQ4LCAweEI1RUMsIDB4QjYxMCwgMHhCNjExLCAweEI2MTQsIDB4QjYxOCwKKyAgICAweEI2MjUsIDB4QjYyQywgMHhCNjM0LCAweEI2NDgsIDB4QjY2NCwgMHhCNjY4LCAweEI2OUMsIDB4QjY5RCwgMHhCNkEwLAorICAgIDB4QjZBNCwgMHhCNkFCLCAweEI2QUMsIDB4QjZCMSwgMHhCNkQ0LCAweEI2RjAsIDB4QjZGNCwgMHhCNkY4LCAweEI3MDAsCisgICAgMHhCNzAxLCAweEI3MDUsIDB4QjcyOCwgMHhCNzI5LCAweEI3MkMsIDB4QjcyRiwgMHhCNzMwLCAweEI3MzgsIDB4QjczOSwKKyAgICAweEI3M0IsIDB4Qjc0NCwgMHhCNzQ4LCAweEI3NEMsIDB4Qjc1NCwgMHhCNzU1LCAweEI3NjAsIDB4Qjc2NCwgMHhCNzY4LAorICAgIDB4Qjc3MCwgMHhCNzcxLCAweEI3NzMsIDB4Qjc3NSwgMHhCNzdDLCAweEI3N0QsIDB4Qjc4MCwgMHhCNzg0LCAweEI3OEMsCisgICAgMHhCNzhELCAweEI3OEYsIDB4Qjc5MCwgMHhCNzkxLCAweEI3OTIsIDB4Qjc5NiwgMHhCNzk3LCAweEI3OTgsIDB4Qjc5OSwKKyAgICAweEI3OUMsIDB4QjdBMCwgMHhCN0E4LCAweEI3QTksIDB4QjdBQiwgMHhCN0FDLCAweEI3QUQsIDB4QjdCNCwgMHhCN0I1LAorICAgIDB4QjdCOCwgMHhCN0M3LCAweEI3QzksIDB4QjdFQywgMHhCN0VELCAweEI3RjAsIDB4QjdGNCwgMHhCN0ZDLCAweEI3RkQsCisgICAgMHhCN0ZGLCAweEI4MDAsIDB4QjgwMSwgMHhCODA3LCAweEI4MDgsIDB4QjgwOSwgMHhCODBDLCAweEI4MTAsIDB4QjgxOCwKKyAgICAweEI4MTksIDB4QjgxQiwgMHhCODFELCAweEI4MjQsIDB4QjgyNSwgMHhCODI4LCAweEI4MkMsIDB4QjgzNCwgMHhCODM1LAorICAgIDB4QjgzNywgMHhCODM4LCAweEI4MzksIDB4Qjg0MCwgMHhCODQ0LCAweEI4NTEsIDB4Qjg1MywgMHhCODVDLCAweEI4NUQsCisgICAgMHhCODYwLCAweEI4NjQsIDB4Qjg2QywgMHhCODZELCAweEI4NkYsIDB4Qjg3MSwgMHhCODc4LCAweEI4N0MsIDB4Qjg4RCwKKyAgICAweEI4QTgsIDB4QjhCMCwgMHhCOEI0LCAweEI4QjgsIDB4QjhDMCwgMHhCOEMxLCAweEI4QzMsIDB4QjhDNSwgMHhCOENDLAorICAgIDB4QjhEMCwgMHhCOEQ0LCAweEI4REQsIDB4QjhERiwgMHhCOEUxLCAweEI4RTgsIDB4QjhFOSwgMHhCOEVDLCAweEI4RjAsCisgICAgMHhCOEY4LCAweEI4RjksIDB4QjhGQiwgMHhCOEZELCAweEI5MDQsIDB4QjkxOCwgMHhCOTIwLCAweEI5M0MsIDB4QjkzRCwKKyAgICAweEI5NDAsIDB4Qjk0NCwgMHhCOTRDLCAweEI5NEYsIDB4Qjk1MSwgMHhCOTU4LCAweEI5NTksIDB4Qjk1QywgMHhCOTYwLAorICAgIDB4Qjk2OCwgMHhCOTY5LCAweEI5NkIsIDB4Qjk2RCwgMHhCOTc0LCAweEI5NzUsIDB4Qjk3OCwgMHhCOTdDLCAweEI5ODQsCisgICAgMHhCOTg1LCAweEI5ODcsIDB4Qjk4OSwgMHhCOThBLCAweEI5OEQsIDB4Qjk4RSwgMHhCOUFDLCAweEI5QUQsIDB4QjlCMCwKKyAgICAweEI5QjQsIDB4QjlCQywgMHhCOUJELCAweEI5QkYsIDB4QjlDMSwgMHhCOUM4LCAweEI5QzksIDB4QjlDQywgMHhCOUNFLAorICAgIDB4QjlDRiwgMHhCOUQwLCAweEI5RDEsIDB4QjlEMiwgMHhCOUQ4LCAweEI5RDksIDB4QjlEQiwgMHhCOURELCAweEI5REUsCisgICAgMHhCOUUxLCAweEI5RTMsIDB4QjlFNCwgMHhCOUU1LCAweEI5RTgsIDB4QjlFQywgMHhCOUY0LCAweEI5RjUsIDB4QjlGNywKKyAgICAweEI5RjgsIDB4QjlGOSwgMHhCOUZBLCAweEJBMDAsIDB4QkEwMSwgMHhCQTA4LCAweEJBMTUsIDB4QkEzOCwgMHhCQTM5LAorICAgIDB4QkEzQywgMHhCQTQwLCAweEJBNDIsIDB4QkE0OCwgMHhCQTQ5LCAweEJBNEIsIDB4QkE0RCwgMHhCQTRFLCAweEJBNTMsCisgICAgMHhCQTU0LCAweEJBNTUsIDB4QkE1OCwgMHhCQTVDLCAweEJBNjQsIDB4QkE2NSwgMHhCQTY3LCAweEJBNjgsIDB4QkE2OSwKKyAgICAweEJBNzAsIDB4QkE3MSwgMHhCQTc0LCAweEJBNzgsIDB4QkE4MywgMHhCQTg0LCAweEJBODUsIDB4QkE4NywgMHhCQThDLAorICAgIDB4QkFBOCwgMHhCQUE5LCAweEJBQUIsIDB4QkFBQywgMHhCQUIwLCAweEJBQjIsIDB4QkFCOCwgMHhCQUI5LCAweEJBQkIsCisgICAgMHhCQUJELCAweEJBQzQsIDB4QkFDOCwgMHhCQUQ4LCAweEJBRDksIDB4QkFGQywgMHhCQjAwLCAweEJCMDQsIDB4QkIwRCwKKyAgICAweEJCMEYsIDB4QkIxMSwgMHhCQjE4LCAweEJCMUMsIDB4QkIyMCwgMHhCQjI5LCAweEJCMkIsIDB4QkIzNCwgMHhCQjM1LAorICAgIDB4QkIzNiwgMHhCQjM4LCAweEJCM0IsIDB4QkIzQywgMHhCQjNELCAweEJCM0UsIDB4QkI0NCwgMHhCQjQ1LCAweEJCNDcsCisgICAgMHhCQjQ5LCAweEJCNEQsIDB4QkI0RiwgMHhCQjUwLCAweEJCNTQsIDB4QkI1OCwgMHhCQjYxLCAweEJCNjMsIDB4QkI2QywKKyAgICAweEJCODgsIDB4QkI4QywgMHhCQjkwLCAweEJCQTQsIDB4QkJBOCwgMHhCQkFDLCAweEJCQjQsIDB4QkJCNywgMHhCQkMwLAorICAgIDB4QkJDNCwgMHhCQkM4LCAweEJCRDAsIDB4QkJEMywgMHhCQkY4LCAweEJCRjksIDB4QkJGQywgMHhCQkZGLCAweEJDMDAsCisgICAgMHhCQzAyLCAweEJDMDgsIDB4QkMwOSwgMHhCQzBCLCAweEJDMEMsIDB4QkMwRCwgMHhCQzBGLCAweEJDMTEsIDB4QkMxNCwKKyAgICAweEJDMTUsIDB4QkMxNiwgMHhCQzE3LCAweEJDMTgsIDB4QkMxQiwgMHhCQzFDLCAweEJDMUQsIDB4QkMxRSwgMHhCQzFGLAorICAgIDB4QkMyNCwgMHhCQzI1LCAweEJDMjcsIDB4QkMyOSwgMHhCQzJELCAweEJDMzAsIDB4QkMzMSwgMHhCQzM0LCAweEJDMzgsCisgICAgMHhCQzQwLCAweEJDNDEsIDB4QkM0MywgMHhCQzQ0LCAweEJDNDUsIDB4QkM0OSwgMHhCQzRDLCAweEJDNEQsIDB4QkM1MCwKKyAgICAweEJDNUQsIDB4QkM4NCwgMHhCQzg1LCAweEJDODgsIDB4QkM4QiwgMHhCQzhDLCAweEJDOEUsIDB4QkM5NCwgMHhCQzk1LAorICAgIDB4QkM5NywgMHhCQzk5LCAweEJDOUEsIDB4QkNBMCwgMHhCQ0ExLCAweEJDQTQsIDB4QkNBNywgMHhCQ0E4LCAweEJDQjAsCisgICAgMHhCQ0IxLCAweEJDQjMsIDB4QkNCNCwgMHhCQ0I1LCAweEJDQkMsIDB4QkNCRCwgMHhCQ0MwLCAweEJDQzQsIDB4QkNDRCwKKyAgICAweEJDQ0YsIDB4QkNEMCwgMHhCQ0QxLCAweEJDRDUsIDB4QkNEOCwgMHhCQ0RDLCAweEJDRjQsIDB4QkNGNSwgMHhCQ0Y2LAorICAgIDB4QkNGOCwgMHhCQ0ZDLCAweEJEMDQsIDB4QkQwNSwgMHhCRDA3LCAweEJEMDksIDB4QkQxMCwgMHhCRDE0LCAweEJEMjQsCisgICAgMHhCRDJDLCAweEJENDAsIDB4QkQ0OCwgMHhCRDQ5LCAweEJENEMsIDB4QkQ1MCwgMHhCRDU4LCAweEJENTksIDB4QkQ2NCwKKyAgICAweEJENjgsIDB4QkQ4MCwgMHhCRDgxLCAweEJEODQsIDB4QkQ4NywgMHhCRDg4LCAweEJEODksIDB4QkQ4QSwgMHhCRDkwLAorICAgIDB4QkQ5MSwgMHhCRDkzLCAweEJEOTUsIDB4QkQ5OSwgMHhCRDlBLCAweEJEOUMsIDB4QkRBNCwgMHhCREIwLCAweEJEQjgsCisgICAgMHhCREQ0LCAweEJERDUsIDB4QkREOCwgMHhCRERDLCAweEJERTksIDB4QkRGMCwgMHhCREY0LCAweEJERjgsIDB4QkUwMCwKKyAgICAweEJFMDMsIDB4QkUwNSwgMHhCRTBDLCAweEJFMEQsIDB4QkUxMCwgMHhCRTE0LCAweEJFMUMsIDB4QkUxRCwgMHhCRTFGLAorICAgIDB4QkU0NCwgMHhCRTQ1LCAweEJFNDgsIDB4QkU0QywgMHhCRTRFLCAweEJFNTQsIDB4QkU1NSwgMHhCRTU3LCAweEJFNTksCisgICAgMHhCRTVBLCAweEJFNUIsIDB4QkU2MCwgMHhCRTYxLCAweEJFNjQsIDB4QkU2OCwgMHhCRTZBLCAweEJFNzAsIDB4QkU3MSwKKyAgICAweEJFNzMsIDB4QkU3NCwgMHhCRTc1LCAweEJFN0IsIDB4QkU3QywgMHhCRTdELCAweEJFODAsIDB4QkU4NCwgMHhCRThDLAorICAgIDB4QkU4RCwgMHhCRThGLCAweEJFOTAsIDB4QkU5MSwgMHhCRTk4LCAweEJFOTksIDB4QkVBOCwgMHhCRUQwLCAweEJFRDEsCisgICAgMHhCRUQ0LCAweEJFRDcsIDB4QkVEOCwgMHhCRUUwLCAweEJFRTMsIDB4QkVFNCwgMHhCRUU1LCAweEJFRUMsIDB4QkYwMSwKKyAgICAweEJGMDgsIDB4QkYwOSwgMHhCRjE4LCAweEJGMTksIDB4QkYxQiwgMHhCRjFDLCAweEJGMUQsIDB4QkY0MCwgMHhCRjQxLAorICAgIDB4QkY0NCwgMHhCRjQ4LCAweEJGNTAsIDB4QkY1MSwgMHhCRjU1LCAweEJGOTQsIDB4QkZCMCwgMHhCRkM1LCAweEJGQ0MsCisgICAgMHhCRkNELCAweEJGRDAsIDB4QkZENCwgMHhCRkRDLCAweEJGREYsIDB4QkZFMSwgMHhDMDNDLCAweEMwNTEsIDB4QzA1OCwKKyAgICAweEMwNUMsIDB4QzA2MCwgMHhDMDY4LCAweEMwNjksIDB4QzA5MCwgMHhDMDkxLCAweEMwOTQsIDB4QzA5OCwgMHhDMEEwLAorICAgIDB4QzBBMSwgMHhDMEEzLCAweEMwQTUsIDB4QzBBQywgMHhDMEFELCAweEMwQUYsIDB4QzBCMCwgMHhDMEIzLCAweEMwQjQsCisgICAgMHhDMEI1LCAweEMwQjYsIDB4QzBCQywgMHhDMEJELCAweEMwQkYsIDB4QzBDMCwgMHhDMEMxLCAweEMwQzUsIDB4QzBDOCwKKyAgICAweEMwQzksIDB4QzBDQywgMHhDMEQwLCAweEMwRDgsIDB4QzBEOSwgMHhDMERCLCAweEMwREMsIDB4QzBERCwgMHhDMEU0LAorICAgIDB4QzBFNSwgMHhDMEU4LCAweEMwRUMsIDB4QzBGNCwgMHhDMEY1LCAweEMwRjcsIDB4QzBGOSwgMHhDMTAwLCAweEMxMDQsCisgICAgMHhDMTA4LCAweEMxMTAsIDB4QzExNSwgMHhDMTFDLCAweEMxMUQsIDB4QzExRSwgMHhDMTFGLCAweEMxMjAsIDB4QzEyMywKKyAgICAweEMxMjQsIDB4QzEyNiwgMHhDMTI3LCAweEMxMkMsIDB4QzEyRCwgMHhDMTJGLCAweEMxMzAsIDB4QzEzMSwgMHhDMTM2LAorICAgIDB4QzEzOCwgMHhDMTM5LCAweEMxM0MsIDB4QzE0MCwgMHhDMTQ4LCAweEMxNDksIDB4QzE0QiwgMHhDMTRDLCAweEMxNEQsCisgICAgMHhDMTU0LCAweEMxNTUsIDB4QzE1OCwgMHhDMTVDLCAweEMxNjQsIDB4QzE2NSwgMHhDMTY3LCAweEMxNjgsIDB4QzE2OSwKKyAgICAweEMxNzAsIDB4QzE3NCwgMHhDMTc4LCAweEMxODUsIDB4QzE4QywgMHhDMThELCAweEMxOEUsIDB4QzE5MCwgMHhDMTk0LAorICAgIDB4QzE5NiwgMHhDMTlDLCAweEMxOUQsIDB4QzE5RiwgMHhDMUExLCAweEMxQTUsIDB4QzFBOCwgMHhDMUE5LCAweEMxQUMsCisgICAgMHhDMUIwLCAweEMxQkQsIDB4QzFDNCwgMHhDMUM4LCAweEMxQ0MsIDB4QzFENCwgMHhDMUQ3LCAweEMxRDgsIDB4QzFFMCwKKyAgICAweEMxRTQsIDB4QzFFOCwgMHhDMUYwLCAweEMxRjEsIDB4QzFGMywgMHhDMUZDLCAweEMxRkQsIDB4QzIwMCwgMHhDMjA0LAorICAgIDB4QzIwQywgMHhDMjBELCAweEMyMEYsIDB4QzIxMSwgMHhDMjE4LCAweEMyMTksIDB4QzIxQywgMHhDMjFGLCAweEMyMjAsCisgICAgMHhDMjI4LCAweEMyMjksIDB4QzIyQiwgMHhDMjJELCAweEMyMkYsIDB4QzIzMSwgMHhDMjMyLCAweEMyMzQsIDB4QzI0OCwKKyAgICAweEMyNTAsIDB4QzI1MSwgMHhDMjU0LCAweEMyNTgsIDB4QzI2MCwgMHhDMjY1LCAweEMyNkMsIDB4QzI2RCwgMHhDMjcwLAorICAgIDB4QzI3NCwgMHhDMjdDLCAweEMyN0QsIDB4QzI3RiwgMHhDMjgxLCAweEMyODgsIDB4QzI4OSwgMHhDMjkwLCAweEMyOTgsCisgICAgMHhDMjlCLCAweEMyOUQsIDB4QzJBNCwgMHhDMkE1LCAweEMyQTgsIDB4QzJBQywgMHhDMkFELCAweEMyQjQsIDB4QzJCNSwKKyAgICAweEMyQjcsIDB4QzJCOSwgMHhDMkRDLCAweEMyREQsIDB4QzJFMCwgMHhDMkUzLCAweEMyRTQsIDB4QzJFQiwgMHhDMkVDLAorICAgIDB4QzJFRCwgMHhDMkVGLCAweEMyRjEsIDB4QzJGNiwgMHhDMkY4LCAweEMyRjksIDB4QzJGQiwgMHhDMkZDLCAweEMzMDAsCisgICAgMHhDMzA4LCAweEMzMDksIDB4QzMwQywgMHhDMzBELCAweEMzMTMsIDB4QzMxNCwgMHhDMzE1LCAweEMzMTgsIDB4QzMxQywKKyAgICAweEMzMjQsIDB4QzMyNSwgMHhDMzI4LCAweEMzMjksIDB4QzM0NSwgMHhDMzY4LCAweEMzNjksIDB4QzM2QywgMHhDMzcwLAorICAgIDB4QzM3MiwgMHhDMzc4LCAweEMzNzksIDB4QzM3QywgMHhDMzdELCAweEMzODQsIDB4QzM4OCwgMHhDMzhDLCAweEMzQzAsCisgICAgMHhDM0Q4LCAweEMzRDksIDB4QzNEQywgMHhDM0RGLCAweEMzRTAsIDB4QzNFMiwgMHhDM0U4LCAweEMzRTksIDB4QzNFRCwKKyAgICAweEMzRjQsIDB4QzNGNSwgMHhDM0Y4LCAweEM0MDgsIDB4QzQxMCwgMHhDNDI0LCAweEM0MkMsIDB4QzQzMCwgMHhDNDM0LAorICAgIDB4QzQzQywgMHhDNDNELCAweEM0NDgsIDB4QzQ2NCwgMHhDNDY1LCAweEM0NjgsIDB4QzQ2QywgMHhDNDc0LCAweEM0NzUsCisgICAgMHhDNDc5LCAweEM0ODAsIDB4QzQ5NCwgMHhDNDlDLCAweEM0QjgsIDB4QzRCQywgMHhDNEU5LCAweEM0RjAsIDB4QzRGMSwKKyAgICAweEM0RjQsIDB4QzRGOCwgMHhDNEZBLCAweEM0RkYsIDB4QzUwMCwgMHhDNTAxLCAweEM1MEMsIDB4QzUxMCwgMHhDNTE0LAorICAgIDB4QzUxQywgMHhDNTI4LCAweEM1MjksIDB4QzUyQywgMHhDNTMwLCAweEM1MzgsIDB4QzUzOSwgMHhDNTNCLCAweEM1M0QsCisgICAgMHhDNTQ0LCAweEM1NDUsIDB4QzU0OCwgMHhDNTQ5LCAweEM1NEEsIDB4QzU0QywgMHhDNTRELCAweEM1NEUsIDB4QzU1MywKKyAgICAweEM1NTQsIDB4QzU1NSwgMHhDNTU3LCAweEM1NTgsIDB4QzU1OSwgMHhDNTVELCAweEM1NUUsIDB4QzU2MCwgMHhDNTYxLAorICAgIDB4QzU2NCwgMHhDNTY4LCAweEM1NzAsIDB4QzU3MSwgMHhDNTczLCAweEM1NzQsIDB4QzU3NSwgMHhDNTdDLCAweEM1N0QsCisgICAgMHhDNTgwLCAweEM1ODQsIDB4QzU4NywgMHhDNThDLCAweEM1OEQsIDB4QzU4RiwgMHhDNTkxLCAweEM1OTUsIDB4QzU5NywKKyAgICAweEM1OTgsIDB4QzU5QywgMHhDNUEwLCAweEM1QTksIDB4QzVCNCwgMHhDNUI1LCAweEM1QjgsIDB4QzVCOSwgMHhDNUJCLAorICAgIDB4QzVCQywgMHhDNUJELCAweEM1QkUsIDB4QzVDNCwgMHhDNUM1LCAweEM1QzYsIDB4QzVDNywgMHhDNUM4LCAweEM1QzksCisgICAgMHhDNUNBLCAweEM1Q0MsIDB4QzVDRSwgMHhDNUQwLCAweEM1RDEsIDB4QzVENCwgMHhDNUQ4LCAweEM1RTAsIDB4QzVFMSwKKyAgICAweEM1RTMsIDB4QzVFNSwgMHhDNUVDLCAweEM1RUQsIDB4QzVFRSwgMHhDNUYwLCAweEM1RjQsIDB4QzVGNiwgMHhDNUY3LAorICAgIDB4QzVGQywgMHhDNUZELCAweEM1RkUsIDB4QzVGRiwgMHhDNjAwLCAweEM2MDEsIDB4QzYwNSwgMHhDNjA2LCAweEM2MDcsCisgICAgMHhDNjA4LCAweEM2MEMsIDB4QzYxMCwgMHhDNjE4LCAweEM2MTksIDB4QzYxQiwgMHhDNjFDLCAweEM2MjQsIDB4QzYyNSwKKyAgICAweEM2MjgsIDB4QzYyQywgMHhDNjJELCAweEM2MkUsIDB4QzYzMCwgMHhDNjMzLCAweEM2MzQsIDB4QzYzNSwgMHhDNjM3LAorICAgIDB4QzYzOSwgMHhDNjNCLCAweEM2NDAsIDB4QzY0MSwgMHhDNjQ0LCAweEM2NDgsIDB4QzY1MCwgMHhDNjUxLCAweEM2NTMsCisgICAgMHhDNjU0LCAweEM2NTUsIDB4QzY1QywgMHhDNjVELCAweEM2NjAsIDB4QzY2QywgMHhDNjZGLCAweEM2NzEsIDB4QzY3OCwKKyAgICAweEM2NzksIDB4QzY3QywgMHhDNjgwLCAweEM2ODgsIDB4QzY4OSwgMHhDNjhCLCAweEM2OEQsIDB4QzY5NCwgMHhDNjk1LAorICAgIDB4QzY5OCwgMHhDNjlDLCAweEM2QTQsIDB4QzZBNSwgMHhDNkE3LCAweEM2QTksIDB4QzZCMCwgMHhDNkIxLCAweEM2QjQsCisgICAgMHhDNkI4LCAweEM2QjksIDB4QzZCQSwgMHhDNkMwLCAweEM2QzEsIDB4QzZDMywgMHhDNkM1LCAweEM2Q0MsIDB4QzZDRCwKKyAgICAweEM2RDAsIDB4QzZENCwgMHhDNkRDLCAweEM2REQsIDB4QzZFMCwgMHhDNkUxLCAweEM2RTgsIDB4QzZFOSwgMHhDNkVDLAorICAgIDB4QzZGMCwgMHhDNkY4LCAweEM2RjksIDB4QzZGRCwgMHhDNzA0LCAweEM3MDUsIDB4QzcwOCwgMHhDNzBDLCAweEM3MTQsCisgICAgMHhDNzE1LCAweEM3MTcsIDB4QzcxOSwgMHhDNzIwLCAweEM3MjEsIDB4QzcyNCwgMHhDNzI4LCAweEM3MzAsIDB4QzczMSwKKyAgICAweEM3MzMsIDB4QzczNSwgMHhDNzM3LCAweEM3M0MsIDB4QzczRCwgMHhDNzQwLCAweEM3NDQsIDB4Qzc0QSwgMHhDNzRDLAorICAgIDB4Qzc0RCwgMHhDNzRGLCAweEM3NTEsIDB4Qzc1MiwgMHhDNzUzLCAweEM3NTQsIDB4Qzc1NSwgMHhDNzU2LCAweEM3NTcsCisgICAgMHhDNzU4LCAweEM3NUMsIDB4Qzc2MCwgMHhDNzY4LCAweEM3NkIsIDB4Qzc3NCwgMHhDNzc1LCAweEM3NzgsIDB4Qzc3QywKKyAgICAweEM3N0QsIDB4Qzc3RSwgMHhDNzgzLCAweEM3ODQsIDB4Qzc4NSwgMHhDNzg3LCAweEM3ODgsIDB4Qzc4OSwgMHhDNzhBLAorICAgIDB4Qzc4RSwgMHhDNzkwLCAweEM3OTEsIDB4Qzc5NCwgMHhDNzk2LCAweEM3OTcsIDB4Qzc5OCwgMHhDNzlBLCAweEM3QTAsCisgICAgMHhDN0ExLCAweEM3QTMsIDB4QzdBNCwgMHhDN0E1LCAweEM3QTYsIDB4QzdBQywgMHhDN0FELCAweEM3QjAsIDB4QzdCNCwKKyAgICAweEM3QkMsIDB4QzdCRCwgMHhDN0JGLCAweEM3QzAsIDB4QzdDMSwgMHhDN0M4LCAweEM3QzksIDB4QzdDQywgMHhDN0NFLAorICAgIDB4QzdEMCwgMHhDN0Q4LCAweEM3REQsIDB4QzdFNCwgMHhDN0U4LCAweEM3RUMsIDB4QzgwMCwgMHhDODAxLCAweEM4MDQsCisgICAgMHhDODA4LCAweEM4MEEsIDB4QzgxMCwgMHhDODExLCAweEM4MTMsIDB4QzgxNSwgMHhDODE2LCAweEM4MUMsIDB4QzgxRCwKKyAgICAweEM4MjAsIDB4QzgyNCwgMHhDODJDLCAweEM4MkQsIDB4QzgyRiwgMHhDODMxLCAweEM4MzgsIDB4QzgzQywgMHhDODQwLAorICAgIDB4Qzg0OCwgMHhDODQ5LCAweEM4NEMsIDB4Qzg0RCwgMHhDODU0LCAweEM4NzAsIDB4Qzg3MSwgMHhDODc0LCAweEM4NzgsCisgICAgMHhDODdBLCAweEM4ODAsIDB4Qzg4MSwgMHhDODgzLCAweEM4ODUsIDB4Qzg4NiwgMHhDODg3LCAweEM4OEIsIDB4Qzg4QywKKyAgICAweEM4OEQsIDB4Qzg5NCwgMHhDODlELCAweEM4OUYsIDB4QzhBMSwgMHhDOEE4LCAweEM4QkMsIDB4QzhCRCwgMHhDOEM0LAorICAgIDB4QzhDOCwgMHhDOENDLCAweEM4RDQsIDB4QzhENSwgMHhDOEQ3LCAweEM4RDksIDB4QzhFMCwgMHhDOEUxLCAweEM4RTQsCisgICAgMHhDOEY1LCAweEM4RkMsIDB4QzhGRCwgMHhDOTAwLCAweEM5MDQsIDB4QzkwNSwgMHhDOTA2LCAweEM5MEMsIDB4QzkwRCwKKyAgICAweEM5MEYsIDB4QzkxMSwgMHhDOTE4LCAweEM5MkMsIDB4QzkzNCwgMHhDOTUwLCAweEM5NTEsIDB4Qzk1NCwgMHhDOTU4LAorICAgIDB4Qzk2MCwgMHhDOTYxLCAweEM5NjMsIDB4Qzk2QywgMHhDOTcwLCAweEM5NzQsIDB4Qzk3QywgMHhDOTg4LCAweEM5ODksCisgICAgMHhDOThDLCAweEM5OTAsIDB4Qzk5OCwgMHhDOTk5LCAweEM5OUIsIDB4Qzk5RCwgMHhDOUMwLCAweEM5QzEsIDB4QzlDNCwKKyAgICAweEM5QzcsIDB4QzlDOCwgMHhDOUNBLCAweEM5RDAsIDB4QzlEMSwgMHhDOUQzLCAweEM5RDUsIDB4QzlENiwgMHhDOUQ5LAorICAgIDB4QzlEQSwgMHhDOURDLCAweEM5REQsIDB4QzlFMCwgMHhDOUUyLCAweEM5RTQsIDB4QzlFNywgMHhDOUVDLCAweEM5RUQsCisgICAgMHhDOUVGLCAweEM5RjAsIDB4QzlGMSwgMHhDOUY4LCAweEM5RjksIDB4QzlGQywgMHhDQTAwLCAweENBMDgsIDB4Q0EwOSwKKyAgICAweENBMEIsIDB4Q0EwQywgMHhDQTBELCAweENBMTQsIDB4Q0ExOCwgMHhDQTI5LCAweENBNEMsIDB4Q0E0RCwgMHhDQTUwLAorICAgIDB4Q0E1NCwgMHhDQTVDLCAweENBNUQsIDB4Q0E1RiwgMHhDQTYwLCAweENBNjEsIDB4Q0E2OCwgMHhDQTdELCAweENBODQsCisgICAgMHhDQTk4LCAweENBQkMsIDB4Q0FCRCwgMHhDQUMwLCAweENBQzQsIDB4Q0FDQywgMHhDQUNELCAweENBQ0YsIDB4Q0FEMSwKKyAgICAweENBRDMsIDB4Q0FEOCwgMHhDQUQ5LCAweENBRTAsIDB4Q0FFQywgMHhDQUY0LCAweENCMDgsIDB4Q0IxMCwgMHhDQjE0LAorICAgIDB4Q0IxOCwgMHhDQjIwLCAweENCMjEsIDB4Q0I0MSwgMHhDQjQ4LCAweENCNDksIDB4Q0I0QywgMHhDQjUwLCAweENCNTgsCisgICAgMHhDQjU5LCAweENCNUQsIDB4Q0I2NCwgMHhDQjc4LCAweENCNzksIDB4Q0I5QywgMHhDQkI4LCAweENCRDQsIDB4Q0JFNCwKKyAgICAweENCRTcsIDB4Q0JFOSwgMHhDQzBDLCAweENDMEQsIDB4Q0MxMCwgMHhDQzE0LCAweENDMUMsIDB4Q0MxRCwgMHhDQzIxLAorICAgIDB4Q0MyMiwgMHhDQzI3LCAweENDMjgsIDB4Q0MyOSwgMHhDQzJDLCAweENDMkUsIDB4Q0MzMCwgMHhDQzM4LCAweENDMzksCisgICAgMHhDQzNCLCAweENDM0MsIDB4Q0MzRCwgMHhDQzNFLCAweENDNDQsIDB4Q0M0NSwgMHhDQzQ4LCAweENDNEMsIDB4Q0M1NCwKKyAgICAweENDNTUsIDB4Q0M1NywgMHhDQzU4LCAweENDNTksIDB4Q0M2MCwgMHhDQzY0LCAweENDNjYsIDB4Q0M2OCwgMHhDQzcwLAorICAgIDB4Q0M3NSwgMHhDQzk4LCAweENDOTksIDB4Q0M5QywgMHhDQ0EwLCAweENDQTgsIDB4Q0NBOSwgMHhDQ0FCLCAweENDQUMsCisgICAgMHhDQ0FELCAweENDQjQsIDB4Q0NCNSwgMHhDQ0I4LCAweENDQkMsIDB4Q0NDNCwgMHhDQ0M1LCAweENDQzcsIDB4Q0NDOSwKKyAgICAweENDRDAsIDB4Q0NENCwgMHhDQ0U0LCAweENDRUMsIDB4Q0NGMCwgMHhDRDAxLCAweENEMDgsIDB4Q0QwOSwgMHhDRDBDLAorICAgIDB4Q0QxMCwgMHhDRDE4LCAweENEMTksIDB4Q0QxQiwgMHhDRDFELCAweENEMjQsIDB4Q0QyOCwgMHhDRDJDLCAweENEMzksCisgICAgMHhDRDVDLCAweENENjAsIDB4Q0Q2NCwgMHhDRDZDLCAweENENkQsIDB4Q0Q2RiwgMHhDRDcxLCAweENENzgsIDB4Q0Q4OCwKKyAgICAweENEOTQsIDB4Q0Q5NSwgMHhDRDk4LCAweENEOUMsIDB4Q0RBNCwgMHhDREE1LCAweENEQTcsIDB4Q0RBOSwgMHhDREIwLAorICAgIDB4Q0RDNCwgMHhDRENDLCAweENERDAsIDB4Q0RFOCwgMHhDREVDLCAweENERjAsIDB4Q0RGOCwgMHhDREY5LCAweENERkIsCisgICAgMHhDREZELCAweENFMDQsIDB4Q0UwOCwgMHhDRTBDLCAweENFMTQsIDB4Q0UxOSwgMHhDRTIwLCAweENFMjEsIDB4Q0UyNCwKKyAgICAweENFMjgsIDB4Q0UzMCwgMHhDRTMxLCAweENFMzMsIDB4Q0UzNSwgMHhDRTU4LCAweENFNTksIDB4Q0U1QywgMHhDRTVGLAorICAgIDB4Q0U2MCwgMHhDRTYxLCAweENFNjgsIDB4Q0U2OSwgMHhDRTZCLCAweENFNkQsIDB4Q0U3NCwgMHhDRTc1LCAweENFNzgsCisgICAgMHhDRTdDLCAweENFODQsIDB4Q0U4NSwgMHhDRTg3LCAweENFODksIDB4Q0U5MCwgMHhDRTkxLCAweENFOTQsIDB4Q0U5OCwKKyAgICAweENFQTAsIDB4Q0VBMSwgMHhDRUEzLCAweENFQTQsIDB4Q0VBNSwgMHhDRUFDLCAweENFQUQsIDB4Q0VDMSwgMHhDRUU0LAorICAgIDB4Q0VFNSwgMHhDRUU4LCAweENFRUIsIDB4Q0VFQywgMHhDRUY0LCAweENFRjUsIDB4Q0VGNywgMHhDRUY4LCAweENFRjksCisgICAgMHhDRjAwLCAweENGMDEsIDB4Q0YwNCwgMHhDRjA4LCAweENGMTAsIDB4Q0YxMSwgMHhDRjEzLCAweENGMTUsIDB4Q0YxQywKKyAgICAweENGMjAsIDB4Q0YyNCwgMHhDRjJDLCAweENGMkQsIDB4Q0YyRiwgMHhDRjMwLCAweENGMzEsIDB4Q0YzOCwgMHhDRjU0LAorICAgIDB4Q0Y1NSwgMHhDRjU4LCAweENGNUMsIDB4Q0Y2NCwgMHhDRjY1LCAweENGNjcsIDB4Q0Y2OSwgMHhDRjcwLCAweENGNzEsCisgICAgMHhDRjc0LCAweENGNzgsIDB4Q0Y4MCwgMHhDRjg1LCAweENGOEMsIDB4Q0ZBMSwgMHhDRkE4LCAweENGQjAsIDB4Q0ZDNCwKKyAgICAweENGRTAsIDB4Q0ZFMSwgMHhDRkU0LCAweENGRTgsIDB4Q0ZGMCwgMHhDRkYxLCAweENGRjMsIDB4Q0ZGNSwgMHhDRkZDLAorICAgIDB4RDAwMCwgMHhEMDA0LCAweEQwMTEsIDB4RDAxOCwgMHhEMDJELCAweEQwMzQsIDB4RDAzNSwgMHhEMDM4LCAweEQwM0MsCisgICAgMHhEMDQ0LCAweEQwNDUsIDB4RDA0NywgMHhEMDQ5LCAweEQwNTAsIDB4RDA1NCwgMHhEMDU4LCAweEQwNjAsIDB4RDA2QywKKyAgICAweEQwNkQsIDB4RDA3MCwgMHhEMDc0LCAweEQwN0MsIDB4RDA3RCwgMHhEMDgxLCAweEQwQTQsIDB4RDBBNSwgMHhEMEE4LAorICAgIDB4RDBBQywgMHhEMEI0LCAweEQwQjUsIDB4RDBCNywgMHhEMEI5LCAweEQwQzAsIDB4RDBDMSwgMHhEMEM0LCAweEQwQzgsCisgICAgMHhEMEM5LCAweEQwRDAsIDB4RDBEMSwgMHhEMEQzLCAweEQwRDQsIDB4RDBENSwgMHhEMERDLCAweEQwREQsIDB4RDBFMCwKKyAgICAweEQwRTQsIDB4RDBFQywgMHhEMEVELCAweEQwRUYsIDB4RDBGMCwgMHhEMEYxLCAweEQwRjgsIDB4RDEwRCwgMHhEMTMwLAorICAgIDB4RDEzMSwgMHhEMTM0LCAweEQxMzgsIDB4RDEzQSwgMHhEMTQwLCAweEQxNDEsIDB4RDE0MywgMHhEMTQ0LCAweEQxNDUsCisgICAgMHhEMTRDLCAweEQxNEQsIDB4RDE1MCwgMHhEMTU0LCAweEQxNUMsIDB4RDE1RCwgMHhEMTVGLCAweEQxNjEsIDB4RDE2OCwKKyAgICAweEQxNkMsIDB4RDE3QywgMHhEMTg0LCAweEQxODgsIDB4RDFBMCwgMHhEMUExLCAweEQxQTQsIDB4RDFBOCwgMHhEMUIwLAorICAgIDB4RDFCMSwgMHhEMUIzLCAweEQxQjUsIDB4RDFCQSwgMHhEMUJDLCAweEQxQzAsIDB4RDFEOCwgMHhEMUY0LCAweEQxRjgsCisgICAgMHhEMjA3LCAweEQyMDksIDB4RDIxMCwgMHhEMjJDLCAweEQyMkQsIDB4RDIzMCwgMHhEMjM0LCAweEQyM0MsIDB4RDIzRCwKKyAgICAweEQyM0YsIDB4RDI0MSwgMHhEMjQ4LCAweEQyNUMsIDB4RDI2NCwgMHhEMjgwLCAweEQyODEsIDB4RDI4NCwgMHhEMjg4LAorICAgIDB4RDI5MCwgMHhEMjkxLCAweEQyOTUsIDB4RDI5QywgMHhEMkEwLCAweEQyQTQsIDB4RDJBQywgMHhEMkIxLCAweEQyQjgsCisgICAgMHhEMkI5LCAweEQyQkMsIDB4RDJCRiwgMHhEMkMwLCAweEQyQzIsIDB4RDJDOCwgMHhEMkM5LCAweEQyQ0IsIDB4RDJENCwKKyAgICAweEQyRDgsIDB4RDJEQywgMHhEMkU0LCAweEQyRTUsIDB4RDJGMCwgMHhEMkYxLCAweEQyRjQsIDB4RDJGOCwgMHhEMzAwLAorICAgIDB4RDMwMSwgMHhEMzAzLCAweEQzMDUsIDB4RDMwQywgMHhEMzBELCAweEQzMEUsIDB4RDMxMCwgMHhEMzE0LCAweEQzMTYsCisgICAgMHhEMzFDLCAweEQzMUQsIDB4RDMxRiwgMHhEMzIwLCAweEQzMjEsIDB4RDMyNSwgMHhEMzI4LCAweEQzMjksIDB4RDMyQywKKyAgICAweEQzMzAsIDB4RDMzOCwgMHhEMzM5LCAweEQzM0IsIDB4RDMzQywgMHhEMzNELCAweEQzNDQsIDB4RDM0NSwgMHhEMzdDLAorICAgIDB4RDM3RCwgMHhEMzgwLCAweEQzODQsIDB4RDM4QywgMHhEMzhELCAweEQzOEYsIDB4RDM5MCwgMHhEMzkxLCAweEQzOTgsCisgICAgMHhEMzk5LCAweEQzOUMsIDB4RDNBMCwgMHhEM0E4LCAweEQzQTksIDB4RDNBQiwgMHhEM0FELCAweEQzQjQsIDB4RDNCOCwKKyAgICAweEQzQkMsIDB4RDNDNCwgMHhEM0M1LCAweEQzQzgsIDB4RDNDOSwgMHhEM0QwLCAweEQzRDgsIDB4RDNFMSwgMHhEM0UzLAorICAgIDB4RDNFQywgMHhEM0VELCAweEQzRjAsIDB4RDNGNCwgMHhEM0ZDLCAweEQzRkQsIDB4RDNGRiwgMHhENDAxLCAweEQ0MDgsCisgICAgMHhENDFELCAweEQ0NDAsIDB4RDQ0NCwgMHhENDVDLCAweEQ0NjAsIDB4RDQ2NCwgMHhENDZELCAweEQ0NkYsIDB4RDQ3OCwKKyAgICAweEQ0NzksIDB4RDQ3QywgMHhENDdGLCAweEQ0ODAsIDB4RDQ4MiwgMHhENDg4LCAweEQ0ODksIDB4RDQ4QiwgMHhENDhELAorICAgIDB4RDQ5NCwgMHhENEE5LCAweEQ0Q0MsIDB4RDREMCwgMHhENEQ0LCAweEQ0REMsIDB4RDRERiwgMHhENEU4LCAweEQ0RUMsCisgICAgMHhENEYwLCAweEQ0RjgsIDB4RDRGQiwgMHhENEZELCAweEQ1MDQsIDB4RDUwOCwgMHhENTBDLCAweEQ1MTQsIDB4RDUxNSwKKyAgICAweEQ1MTcsIDB4RDUzQywgMHhENTNELCAweEQ1NDAsIDB4RDU0NCwgMHhENTRDLCAweEQ1NEQsIDB4RDU0RiwgMHhENTUxLAorICAgIDB4RDU1OCwgMHhENTU5LCAweEQ1NUMsIDB4RDU2MCwgMHhENTY1LCAweEQ1NjgsIDB4RDU2OSwgMHhENTZCLCAweEQ1NkQsCisgICAgMHhENTc0LCAweEQ1NzUsIDB4RDU3OCwgMHhENTdDLCAweEQ1ODQsIDB4RDU4NSwgMHhENTg3LCAweEQ1ODgsIDB4RDU4OSwKKyAgICAweEQ1OTAsIDB4RDVBNSwgMHhENUM4LCAweEQ1QzksIDB4RDVDQywgMHhENUQwLCAweEQ1RDIsIDB4RDVEOCwgMHhENUQ5LAorICAgIDB4RDVEQiwgMHhENURELCAweEQ1RTQsIDB4RDVFNSwgMHhENUU4LCAweEQ1RUMsIDB4RDVGNCwgMHhENUY1LCAweEQ1RjcsCisgICAgMHhENUY5LCAweEQ2MDAsIDB4RDYwMSwgMHhENjA0LCAweEQ2MDgsIDB4RDYxMCwgMHhENjExLCAweEQ2MTMsIDB4RDYxNCwKKyAgICAweEQ2MTUsIDB4RDYxQywgMHhENjIwLCAweEQ2MjQsIDB4RDYyRCwgMHhENjM4LCAweEQ2MzksIDB4RDYzQywgMHhENjQwLAorICAgIDB4RDY0NSwgMHhENjQ4LCAweEQ2NDksIDB4RDY0QiwgMHhENjRELCAweEQ2NTEsIDB4RDY1NCwgMHhENjU1LCAweEQ2NTgsCisgICAgMHhENjVDLCAweEQ2NjcsIDB4RDY2OSwgMHhENjcwLCAweEQ2NzEsIDB4RDY3NCwgMHhENjgzLCAweEQ2ODUsIDB4RDY4QywKKyAgICAweEQ2OEQsIDB4RDY5MCwgMHhENjk0LCAweEQ2OUQsIDB4RDY5RiwgMHhENkExLCAweEQ2QTgsIDB4RDZBQywgMHhENkIwLAorICAgIDB4RDZCOSwgMHhENkJCLCAweEQ2QzQsIDB4RDZDNSwgMHhENkM4LCAweEQ2Q0MsIDB4RDZEMSwgMHhENkQ0LCAweEQ2RDcsCisgICAgMHhENkQ5LCAweEQ2RTAsIDB4RDZFNCwgMHhENkU4LCAweEQ2RjAsIDB4RDZGNSwgMHhENkZDLCAweEQ2RkQsIDB4RDcwMCwKKyAgICAweEQ3MDQsIDB4RDcxMSwgMHhENzE4LCAweEQ3MTksIDB4RDcxQywgMHhENzIwLCAweEQ3MjgsIDB4RDcyOSwgMHhENzJCLAorICAgIDB4RDcyRCwgMHhENzM0LCAweEQ3MzUsIDB4RDczOCwgMHhENzNDLCAweEQ3NDQsIDB4RDc0NywgMHhENzQ5LCAweEQ3NTAsCisgICAgMHhENzUxLCAweEQ3NTQsIDB4RDc1NiwgMHhENzU3LCAweEQ3NTgsIDB4RDc1OSwgMHhENzYwLCAweEQ3NjEsIDB4RDc2MywKKyAgICAweEQ3NjUsIDB4RDc2OSwgMHhENzZDLCAweEQ3NzAsIDB4RDc3NCwgMHhENzdDLCAweEQ3N0QsIDB4RDc4MSwgMHhENzg4LAorICAgIDB4RDc4OSwgMHhENzhDLCAweEQ3OTAsIDB4RDc5OCwgMHhENzk5LCAweEQ3OUIsIDB4RDc5RCwgMHg0RjNELCAweDRGNzMsCisgICAgMHg1MDQ3LCAweDUwRjksIDB4NTJBMCwgMHg1M0VGLCAweDU0NzUsIDB4NTRFNSwgMHg1NjA5LCAweDVBQzEsIDB4NUJCNiwKKyAgICAweDY2ODcsIDB4NjdCNiwgMHg2N0I3LCAweDY3RUYsIDB4NkI0QywgMHg3M0MyLCAweDc1QzIsIDB4N0EzQywgMHg4MkRCLAorICAgIDB4ODMwNCwgMHg4ODU3LCAweDg4ODgsIDB4OEEzNiwgMHg4Q0M4LCAweDhEQ0YsIDB4OEVGQiwgMHg4RkU2LCAweDk5RDUsCisgICAgMHg1MjNCLCAweDUzNzQsIDB4NTQwNCwgMHg2MDZBLCAweDYxNjQsIDB4NkJCQywgMHg3M0NGLCAweDgxMUEsIDB4ODlCQSwKKyAgICAweDg5RDIsIDB4OTVBMywgMHg0RjgzLCAweDUyMEEsIDB4NThCRSwgMHg1OTc4LCAweDU5RTYsIDB4NUU3MiwgMHg1RTc5LAorICAgIDB4NjFDNywgMHg2M0MwLCAweDY3NDYsIDB4NjdFQywgMHg2ODdGLCAweDZGOTcsIDB4NzY0RSwgMHg3NzBCLCAweDc4RjUsCisgICAgMHg3QTA4LCAweDdBRkYsIDB4N0MyMSwgMHg4MDlELCAweDgyNkUsIDB4ODI3MSwgMHg4QUVCLCAweDk1OTMsIDB4NEU2QiwKKyAgICAweDU1OUQsIDB4NjZGNywgMHg2RTM0LCAweDc4QTMsIDB4N0FFRCwgMHg4NDVCLCAweDg5MTAsIDB4ODc0RSwgMHg5N0E4LAorICAgIDB4NTJEOCwgMHg1NzRFLCAweDU4MkEsIDB4NUQ0QywgMHg2MTFGLCAweDYxQkUsIDB4NjIyMSwgMHg2NTYyLCAweDY3RDEsCisgICAgMHg2QTQ0LCAweDZFMUIsIDB4NzUxOCwgMHg3NUIzLCAweDc2RTMsIDB4NzdCMCwgMHg3RDNBLCAweDkwQUYsIDB4OTQ1MSwKKyAgICAweDk0NTIsIDB4OUY5NSwgMHg1MzIzLCAweDVDQUMsIDB4NzUzMiwgMHg4MERCLCAweDkyNDAsIDB4OTU5OCwgMHg1MjVCLAorICAgIDB4NTgwOCwgMHg1OURDLCAweDVDQTEsIDB4NUQxNywgMHg1RUI3LCAweDVGM0EsIDB4NUY0QSwgMHg2MTc3LCAweDZDNUYsCisgICAgMHg3NTdBLCAweDc1ODYsIDB4N0NFMCwgMHg3RDczLCAweDdEQjEsIDB4N0Y4QywgMHg4MTU0LCAweDgyMjEsIDB4ODU5MSwKKyAgICAweDg5NDEsIDB4OEIxQiwgMHg5MkZDLCAweDk2NEQsIDB4OUM0NywgMHg0RUNCLCAweDRFRjcsIDB4NTAwQiwgMHg1MUYxLAorICAgIDB4NTg0RiwgMHg2MTM3LCAweDYxM0UsIDB4NjE2OCwgMHg2NTM5LCAweDY5RUEsIDB4NkYxMSwgMHg3NUE1LCAweDc2ODYsCisgICAgMHg3NkQ2LCAweDdCODcsIDB4ODJBNSwgMHg4NENCLCAweDkzQTcsIDB4OTU4QiwgMHg1NTgwLCAweDVCQTIsIDB4NTc1MSwKKyAgICAweDdDQjMsIDB4N0ZCOSwgMHg5MUI1LCAweDUwMjgsIDB4NTNCQiwgMHg1QzQ1LCAweDVERTgsIDB4NjJEMiwgMHg2MzZFLAorICAgIDB4NjREQSwgMHg2NEU3LCAweDZFMjAsIDB4NzBBQywgMHg3OTVCLCAweDhEREQsIDB4OEUxRSwgMHg5MDdELCAweDkyNDUsCisgICAgMHg5MkY4LCAweDRFN0UsIDB4NEVGNiwgMHg1MDY1LCAweDVERkUsIDB4NUVGQSwgMHg2MTA2LCAweDY5NTcsIDB4ODE3MSwKKyAgICAweDg2NTQsIDB4OEU0NywgMHg5Mzc1LCAweDlBMkIsIDB4NEU1RSwgMHg1MDkxLCAweDY3NzAsIDB4Njg0MCwgMHg1MTA5LAorICAgIDB4NTI4RCwgMHg1MjkyLCAweDZBQTIsIDB4NzdCQywgMHg5MjEwLCAweDlFRDQsIDB4NTJBQiwgMHg2MDJGLCAweDhGRjIsCisgICAgMHg1MDQ4LCAweDYxQTksIDB4NjNFRCwgMHg2NENBLCAweDY4M0MsIDB4NkE4NCwgMHg2RkMwLCAweDgxODgsIDB4ODlBMSwKKyAgICAweDk2OTQsIDB4NTgwNSwgMHg3MjdELCAweDcyQUMsIDB4NzUwNCwgMHg3RDc5LCAweDdFNkQsIDB4ODBBOSwgMHg4OThCLAorICAgIDB4OEI3NCwgMHg5MDYzLCAweDlENTEsIDB4NjI4OSwgMHg2QzdBLCAweDZGNTQsIDB4N0Q1MCwgMHg3RjNBLCAweDhBMjMsCisgICAgMHg1MTdDLCAweDYxNEEsIDB4N0I5RCwgMHg4QjE5LCAweDkyNTcsIDB4OTM4QywgMHg0RUFDLCAweDRGRDMsIDB4NTAxRSwKKyAgICAweDUwQkUsIDB4NTEwNiwgMHg1MkMxLCAweDUyQ0QsIDB4NTM3RiwgMHg1NzcwLCAweDU4ODMsIDB4NUU5QSwgMHg1RjkxLAorICAgIDB4NjE3NiwgMHg2MUFDLCAweDY0Q0UsIDB4NjU2QywgMHg2NjZGLCAweDY2QkIsIDB4NjZGNCwgMHg2ODk3LCAweDZEODcsCisgICAgMHg3MDg1LCAweDcwRjEsIDB4NzQ5RiwgMHg3NEE1LCAweDc0Q0EsIDB4NzVEOSwgMHg3ODZDLCAweDc4RUMsIDB4N0FERiwKKyAgICAweDdBRjYsIDB4N0Q0NSwgMHg3RDkzLCAweDgwMTUsIDB4ODAzRiwgMHg4MTFCLCAweDgzOTYsIDB4OEI2NiwgMHg4RjE1LAorICAgIDB4OTAxNSwgMHg5M0UxLCAweDk4MDMsIDB4OTgzOCwgMHg5QTVBLCAweDlCRTgsIDB4NEZDMiwgMHg1NTUzLCAweDU4M0EsCisgICAgMHg1OTUxLCAweDVCNjMsIDB4NUM0NiwgMHg2MEI4LCAweDYyMTIsIDB4Njg0MiwgMHg2OEIwLCAweDY4RTgsIDB4NkVBQSwKKyAgICAweDc1NEMsIDB4NzY3OCwgMHg3OENFLCAweDdBM0QsIDB4N0NGQiwgMHg3RTZCLCAweDdFN0MsIDB4OEEwOCwgMHg4QUExLAorICAgIDB4OEMzRiwgMHg5NjhFLCAweDlEQzQsIDB4NTNFNCwgMHg1M0U5LCAweDU0NEEsIDB4NTQ3MSwgMHg1NkZBLCAweDU5RDEsCisgICAgMHg1QjY0LCAweDVDM0IsIDB4NUVBQiwgMHg2MkY3LCAweDY1MzcsIDB4NjU0NSwgMHg2NTcyLCAweDY2QTAsIDB4NjdBRiwKKyAgICAweDY5QzEsIDB4NkNCRCwgMHg3NUZDLCAweDc2OTAsIDB4Nzc3RSwgMHg3QTNGLCAweDdGOTQsIDB4ODAwMywgMHg4MEExLAorICAgIDB4ODE4RiwgMHg4MkU2LCAweDgyRkQsIDB4ODNGMCwgMHg4NUMxLCAweDg4MzEsIDB4ODhCNCwgMHg4QUE1LCAweDhGOUMsCisgICAgMHg5MzJFLCAweDk2QzcsIDB4OTg2NywgMHg5QUQ4LCAweDlGMTMsIDB4NTRFRCwgMHg2NTlCLCAweDY2RjIsIDB4Njg4RiwKKyAgICAweDdBNDAsIDB4OEMzNywgMHg5RDYwLCAweDU2RjAsIDB4NTc2NCwgMHg1RDExLCAweDY2MDYsIDB4NjhCMSwgMHg2OENELAorICAgIDB4NkVGRSwgMHg3NDI4LCAweDg4OUUsIDB4OUJFNCwgMHg2QzY4LCAweDlBQTgsIDB4NEY5QiwgMHg1MTZDLCAweDUxNzEsCisgICAgMHg1MjlGLCAweDVCNTQsIDB4NURFNSwgMHg2MDUwLCAweDYwNkQsIDB4NjJGMSwgMHg2M0E3LCAweDY1M0IsIDB4NzNEOSwKKyAgICAweDdBN0EsIDB4ODZBMywgMHg4Q0EyLCAweDk3OEYsIDB4NEUzMiwgMHg1QkUxLCAweDYyMDgsIDB4Njc5QywgMHg3NERDLAorICAgIDB4NzlEMSwgMHg4M0QzLCAweDhBODcsIDB4OEFCMiwgMHg4REU4LCAweDkwNEUsIDB4OTM0QiwgMHg5ODQ2LCAweDVFRDMsCisgICAgMHg2OUU4LCAweDg1RkYsIDB4OTBFRCwgMHg1MUEwLCAweDVCOTgsIDB4NUJFQywgMHg2MTYzLCAweDY4RkEsIDB4NkIzRSwKKyAgICAweDcwNEMsIDB4NzQyRiwgMHg3NEQ4LCAweDdCQTEsIDB4N0Y1MCwgMHg4M0M1LCAweDg5QzAsIDB4OENBQiwgMHg5NURDLAorICAgIDB4OTkyOCwgMHg1MjJFLCAweDYwNUQsIDB4NjJFQywgMHg5MDAyLCAweDRGOEEsIDB4NTE0OSwgMHg1MzIxLCAweDU4RDksCisgICAgMHg1RUUzLCAweDY2RTAsIDB4NkQzOCwgMHg3MDlBLCAweDcyQzIsIDB4NzNENiwgMHg3QjUwLCAweDgwRjEsIDB4OTQ1QiwKKyAgICAweDUzNjYsIDB4NjM5QiwgMHg3RjZCLCAweDRFNTYsIDB4NTA4MCwgMHg1ODRBLCAweDU4REUsIDB4NjAyQSwgMHg2MTI3LAorICAgIDB4NjJEMCwgMHg2OUQwLCAweDlCNDEsIDB4NUI4RiwgMHg3RDE4LCAweDgwQjEsIDB4OEY1RiwgMHg0RUE0LCAweDUwRDEsCisgICAgMHg1NEFDLCAweDU1QUMsIDB4NUIwQywgMHg1REEwLCAweDVERTcsIDB4NjUyQSwgMHg2NTRFLCAweDY4MjEsIDB4NkE0QiwKKyAgICAweDcyRTEsIDB4NzY4RSwgMHg3N0VGLCAweDdENUUsIDB4N0ZGOSwgMHg4MUEwLCAweDg1NEUsIDB4ODZERiwgMHg4RjAzLAorICAgIDB4OEY0RSwgMHg5MENBLCAweDk5MDMsIDB4OUE1NSwgMHg5QkFCLCAweDRFMTgsIDB4NEU0NSwgMHg0RTVELCAweDRFQzcsCisgICAgMHg0RkYxLCAweDUxNzcsIDB4NTJGRSwgMHg1MzQwLCAweDUzRTMsIDB4NTNFNSwgMHg1NDhFLCAweDU2MTQsIDB4NTc3NSwKKyAgICAweDU3QTIsIDB4NUJDNywgMHg1RDg3LCAweDVFRDAsIDB4NjFGQywgMHg2MkQ4LCAweDY1NTEsIDB4NjdCOCwgMHg2N0U5LAorICAgIDB4NjlDQiwgMHg2QjUwLCAweDZCQzYsIDB4NkJFQywgMHg2QzQyLCAweDZFOUQsIDB4NzA3OCwgMHg3MkQ3LCAweDczOTYsCisgICAgMHg3NDAzLCAweDc3QkYsIDB4NzdFOSwgMHg3QTc2LCAweDdEN0YsIDB4ODAwOSwgMHg4MUZDLCAweDgyMDUsIDB4ODIwQSwKKyAgICAweDgyREYsIDB4ODg2MiwgMHg4QjMzLCAweDhDRkMsIDB4OEVDMCwgMHg5MDExLCAweDkwQjEsIDB4OTI2NCwgMHg5MkI2LAorICAgIDB4OTlEMiwgMHg5QTQ1LCAweDlDRTksIDB4OURENywgMHg5RjlDLCAweDU3MEIsIDB4NUM0MCwgMHg4M0NBLCAweDk3QTAsCisgICAgMHg5N0FCLCAweDlFQjQsIDB4NTQxQiwgMHg3QTk4LCAweDdGQTQsIDB4ODhEOSwgMHg4RUNELCAweDkwRTEsIDB4NTgwMCwKKyAgICAweDVDNDgsIDB4NjM5OCwgMHg3QTlGLCAweDVCQUUsIDB4NUYxMywgMHg3QTc5LCAweDdBQUUsIDB4ODI4RSwgMHg4RUFDLAorICAgIDB4NTAyNiwgMHg1MjM4LCAweDUyRjgsIDB4NTM3NywgMHg1NzA4LCAweDYyRjMsIDB4NjM3MiwgMHg2QjBBLCAweDZEQzMsCisgICAgMHg3NzM3LCAweDUzQTUsIDB4NzM1NywgMHg4NTY4LCAweDhFNzYsIDB4OTVENSwgMHg2NzNBLCAweDZBQzMsIDB4NkY3MCwKKyAgICAweDhBNkQsIDB4OEVDQywgMHg5OTRCLCAweDY2NzcsIDB4NkI3OCwgMHg4Q0I0LCAweDlCM0MsIDB4NTNFQiwgMHg1NzJELAorICAgIDB4NTk0RSwgMHg2M0M2LCAweDY5RkIsIDB4NzNFQSwgMHg3ODQ1LCAweDdBQkEsIDB4N0FDNSwgMHg3Q0ZFLCAweDg0NzUsCisgICAgMHg4OThGLCAweDhENzMsIDB4OTAzNSwgMHg5NUE4LCAweDUyRkIsIDB4NTc0NywgMHg3NTQ3LCAweDdCNjAsIDB4ODNDQywKKyAgICAweDkyMUUsIDB4NkE1OCwgMHg1MTRCLCAweDUyNEIsIDB4NTI4NywgMHg2MjFGLCAweDY4RDgsIDB4Njk3NSwgMHg5Njk5LAorICAgIDB4NTBDNSwgMHg1MkE0LCAweDUyRTQsIDB4NjFDMywgMHg2NUE0LCAweDY4MzksIDB4NjlGRiwgMHg3NDdFLCAweDdCNEIsCisgICAgMHg4MkI5LCAweDgzRUIsIDB4ODlCMiwgMHg4QjM5LCAweDhGRDEsIDB4OTk0OSwgMHg0RUNBLCAweDU5OTcsIDB4NjREMiwKKyAgICAweDY2MTEsIDB4NkE4RSwgMHg3NDM0LCAweDc5ODEsIDB4NzlCRCwgMHg4MkE5LCAweDg4N0UsIDB4ODg3RiwgMHg4OTVGLAorICAgIDB4OTMyNiwgMHg0RjBCLCAweDUzQ0EsIDB4NjAyNSwgMHg2MjcxLCAweDZDNzIsIDB4N0QxQSwgMHg3RDY2LCAweDRFOTgsCisgICAgMHg1MTYyLCAweDc3REMsIDB4ODBBRiwgMHg0RjAxLCAweDRGMEUsIDB4NTE3NiwgMHg1MTgwLCAweDU1REMsIDB4NTY2OCwKKyAgICAweDU3M0IsIDB4NTdGQSwgMHg1N0ZDLCAweDU5MTQsIDB4NTk0NywgMHg1OTkzLCAweDVCQzQsIDB4NUM5MCwgMHg1RDBFLAorICAgIDB4NURGMSwgMHg1RTdFLCAweDVGQ0MsIDB4NjI4MCwgMHg2NUQ3LCAweDY1RTMsIDB4NjcxRSwgMHg2NzFGLCAweDY3NUUsCisgICAgMHg2OENCLCAweDY4QzQsIDB4NkE1RiwgMHg2QjNBLCAweDZDMjMsIDB4NkM3RCwgMHg2QzgyLCAweDZEQzcsIDB4NzM5OCwKKyAgICAweDc0MjYsIDB4NzQyQSwgMHg3NDgyLCAweDc0QTMsIDB4NzU3OCwgMHg3NTdGLCAweDc4ODEsIDB4NzhFRiwgMHg3OTQxLAorICAgIDB4Nzk0NywgMHg3OTQ4LCAweDc5N0EsIDB4N0I5NSwgMHg3RDAwLCAweDdEQkEsIDB4N0Y4OCwgMHg4MDA2LCAweDgwMkQsCisgICAgMHg4MDhDLCAweDhBMTgsIDB4OEI0RiwgMHg4QzQ4LCAweDhENzcsIDB4OTMyMSwgMHg5MzI0LCAweDk4RTIsIDB4OTk1MSwKKyAgICAweDlBMEUsIDB4OUEwRiwgMHg5QTY1LCAweDlFOTIsIDB4N0RDQSwgMHg0Rjc2LCAweDU0MDksIDB4NjJFRSwgMHg2ODU0LAorICAgIDB4OTFEMSwgMHg1NUFCLCAweDUxM0EsIDB4NUExQywgMHg2MUU2LCAweDYyQ0YsIDB4NjJGRiwgMHg5MEEzLCAweDhBRkUsCisgICAgMHg2Njk2LCAweDcxNTYsIDB4OTZFMywgMHg2MzRGLCAweDYzN0EsIDB4NTM1NywgMHg2NzhGLCAweDY5NjAsIDB4NkU3MywKKyAgICAweDc1MzcsIDB4N0QwRCwgMHg4ODcyLCAweDU2Q0EsIDB4NUExOCwgMHg0RTQzLCAweDUxNjcsIDB4NTk0OCwgMHg2N0YwLAorICAgIDB4ODAxMCwgMHg1OTczLCAweDVFNzQsIDB4NjQ5QSwgMHg3OUNBLCAweDVGRjUsIDB4NjA2QywgMHg2MkM4LCAweDYzN0IsCisgICAgMHg1QkU3LCAweDVCRDcsIDB4NTJBQSwgMHg1OTc0LCAweDVGMjksIDB4NjAxMiwgMHg3NDU5LCAweDk5RDEsIDB4NkZDMywKKyAgICAweDgxQkYsIDB4OEZCMiwgMHg2MEYxLCAweDgxNjYsIDB4NUMzRiwgMHg1QUU5LCAweDhBMjUsIDB4Njc3QiwgMHg3RDEwLAorICAgIDB4ODBGRCwgMHg1QzNDLCAweDZDRTUsIDB4NTMzRiwgMHg2RUJBLCAweDU5MUEsIDB4ODMzNiwgMHg0RTM5LCAweDRFQjYsCisgICAgMHg0RjQ2LCAweDU1QUUsIDB4NTcxOCwgMHg1OEM3LCAweDVGNTYsIDB4NjVCNywgMHg2NUU2LCAweDZBODAsIDB4NkJCNSwKKyAgICAweDZFNEQsIDB4NzdFRCwgMHg3QUVGLCAweDdDMUUsIDB4N0RERSwgMHg4NkNCLCAweDg4OTIsIDB4OTEzMiwgMHg5MzVCLAorICAgIDB4NjRCQiwgMHg2RkJFLCAweDczN0EsIDB4NzVCOCwgMHg5MDU0LCAweDU1NTYsIDB4NTc0RCwgMHg2MUJBLCAweDY0RDQsCisgICAgMHg2NkM3LCAweDZERTEsIDB4NkU1QiwgMHg2RjZELCAweDZGQjksIDB4NzVGMCwgMHg4MDQzLCAweDgxQkQsIDB4ODU0MSwKKyAgICAweDg5ODMsIDB4OEFDNywgMHg4QjVBLCAweDkzMUYsIDB4NkM5MywgMHg3NTUzLCAweDdCNTQsIDB4OEUwRiwgMHg5MDVELAorICAgIDB4NTUxMCwgMHg1ODAyLCAweDU4NTgsIDB4NUU2MiwgMHg2MjA3LCAweDY0OUUsIDB4NjhFMCwgMHg3NTc2LCAweDdDRDYsCisgICAgMHg4N0IzLCAweDlFRTgsIDB4NEVFMywgMHg1Nzg4LCAweDU3NkUsIDB4NTkyNywgMHg1QzBELCAweDVDQjEsIDB4NUUzNiwKKyAgICAweDVGODUsIDB4NjIzNCwgMHg2NEUxLCAweDczQjMsIDB4ODFGQSwgMHg4ODhCLCAweDhDQjgsIDB4OTY4QSwgMHg5RURCLAorICAgIDB4NUI4NSwgMHg1RkI3LCAweDYwQjMsIDB4NTAxMiwgMHg1MjAwLCAweDUyMzAsIDB4NTcxNiwgMHg1ODM1LCAweDU4NTcsCisgICAgMHg1QzBFLCAweDVDNjAsIDB4NUNGNiwgMHg1RDhCLCAweDVFQTYsIDB4NUY5MiwgMHg2MEJDLCAweDYzMTEsIDB4NjM4OSwKKyAgICAweDY0MTcsIDB4Njg0MywgMHg2OEY5LCAweDZBQzIsIDB4NkREOCwgMHg2RTIxLCAweDZFRDQsIDB4NkZFNCwgMHg3MUZFLAorICAgIDB4NzZEQywgMHg3Nzc5LCAweDc5QjEsIDB4N0EzQiwgMHg4NDA0LCAweDg5QTksIDB4OENFRCwgMHg4REYzLCAweDhFNDgsCisgICAgMHg5MDAzLCAweDkwMTQsIDB4OTA1MywgMHg5MEZELCAweDkzNEQsIDB4OTY3NiwgMHg5N0RDLCAweDZCRDIsIDB4NzAwNiwKKyAgICAweDcyNTgsIDB4NzJBMiwgMHg3MzY4LCAweDc3NjMsIDB4NzlCRiwgMHg3QkU0LCAweDdFOUIsIDB4OEI4MCwgMHg1OEE5LAorICAgIDB4NjBDNywgMHg2NTY2LCAweDY1RkQsIDB4NjZCRSwgMHg2QzhDLCAweDcxMUUsIDB4NzFDOSwgMHg4QzVBLCAweDk4MTMsCisgICAgMHg0RTZELCAweDdBODEsIDB4NEVERCwgMHg1MUFDLCAweDUxQ0QsIDB4NTJENSwgMHg1NDBDLCAweDYxQTcsIDB4Njc3MSwKKyAgICAweDY4NTAsIDB4NjhERiwgMHg2RDFFLCAweDZGN0MsIDB4NzVCQywgMHg3N0IzLCAweDdBRTUsIDB4ODBGNCwgMHg4NDYzLAorICAgIDB4OTI4NSwgMHg1MTVDLCAweDY1OTcsIDB4Njc1QywgMHg2NzkzLCAweDc1RDgsIDB4N0FDNywgMHg4MzczLCAweDhDNDYsCisgICAgMHg5MDE3LCAweDk4MkQsIDB4NUM2RiwgMHg4MUMwLCAweDgyOUEsIDB4OTA0MSwgMHg5MDZGLCAweDkyMEQsIDB4NUY5NywKKyAgICAweDVEOUQsIDB4NkE1OSwgMHg3MUM4LCAweDc2N0IsIDB4N0I0OSwgMHg4NUU0LCAweDhCMDQsIDB4OTEyNywgMHg5QTMwLAorICAgIDB4NTU4NywgMHg2MUY2LCAweDc2NjksIDB4N0Y4NSwgMHg4NjNGLCAweDg3QkEsIDB4ODhGOCwgMHg5MDhGLCAweDZEMUIsCisgICAgMHg3MEQ5LCAweDczREUsIDB4N0Q2MSwgMHg4NDNELCAweDkxNkEsIDB4OTlGMSwgMHg0RTgyLCAweDUzNzUsIDB4NkIwNCwKKyAgICAweDZCMTIsIDB4NzAzRSwgMHg3MjFCLCAweDg2MkQsIDB4OUUxRSwgMHg1MjRDLCAweDhGQTMsIDB4NUQ1MCwgMHg2NEU1LAorICAgIDB4NjUyQywgMHg2QjE2LCAweDZGRUIsIDB4N0M0MywgMHg3RTlDLCAweDg1Q0QsIDB4ODk2NCwgMHg4OUJELCAweDYyQzksCisgICAgMHg4MUQ4LCAweDg4MUYsIDB4NUVDQSwgMHg2NzE3LCAweDZENkEsIDB4NzJGQywgMHg3NDA1LCAweDc0NkYsIDB4ODc4MiwKKyAgICAweDkwREUsIDB4NEY4NiwgMHg1RDBELCAweDVGQTAsIDB4ODQwQSwgMHg1MUI3LCAweDYzQTAsIDB4NzU2NSwgMHg0RUFFLAorICAgIDB4NTAwNiwgMHg1MTY5LCAweDUxQzksIDB4Njg4MSwgMHg2QTExLCAweDdDQUUsIDB4N0NCMSwgMHg3Q0U3LCAweDgyNkYsCisgICAgMHg4QUQyLCAweDhGMUIsIDB4OTFDRiwgMHg0RkI2LCAweDUxMzcsIDB4NTJGNSwgMHg1NDQyLCAweDVFRUMsIDB4NjE2RSwKKyAgICAweDYyM0UsIDB4NjVDNSwgMHg2QURBLCAweDZGRkUsIDB4NzkyQSwgMHg4NURDLCAweDg4MjMsIDB4OTVBRCwgMHg5QTYyLAorICAgIDB4OUE2QSwgMHg5RTk3LCAweDlFQ0UsIDB4NTI5QiwgMHg2NkM2LCAweDZCNzcsIDB4NzAxRCwgMHg3OTJCLCAweDhGNjIsCisgICAgMHg5NzQyLCAweDYxOTAsIDB4NjIwMCwgMHg2NTIzLCAweDZGMjMsIDB4NzE0OSwgMHg3NDg5LCAweDdERjQsIDB4ODA2RiwKKyAgICAweDg0RUUsIDB4OEYyNiwgMHg5MDIzLCAweDkzNEEsIDB4NTFCRCwgMHg1MjE3LCAweDUyQTMsIDB4NkQwQywgMHg3MEM4LAorICAgIDB4ODhDMiwgMHg1RUM5LCAweDY1ODIsIDB4NkJBRSwgMHg2RkMyLCAweDdDM0UsIDB4NzM3NSwgMHg0RUU0LCAweDRGMzYsCisgICAgMHg1NkY5LCAweDVDQkEsIDB4NURCQSwgMHg2MDFDLCAweDczQjIsIDB4N0IyRCwgMHg3RjlBLCAweDdGQ0UsIDB4ODA0NiwKKyAgICAweDkwMUUsIDB4OTIzNCwgMHg5NkY2LCAweDk3NDgsIDB4OTgxOCwgMHg5RjYxLCAweDRGOEIsIDB4NkZBNywgMHg3OUFFLAorICAgIDB4OTFCNCwgMHg5NkI3LCAweDUyREUsIDB4NjQ4OCwgMHg2NEM0LCAweDZBRDMsIDB4NkY1RSwgMHg3MDE4LCAweDcyMTAsCisgICAgMHg3NkU3LCAweDgwMDEsIDB4ODYwNiwgMHg4NjVDLCAweDhERUYsIDB4OEYwNSwgMHg5NzMyLCAweDlCNkYsIDB4OURGQSwKKyAgICAweDlFNzUsIDB4Nzg4QywgMHg3OTdGLCAweDdEQTAsIDB4ODNDOSwgMHg5MzA0LCAweDlFN0YsIDB4OUU5MywgMHg4QUQ2LAorICAgIDB4NThERiwgMHg1RjA0LCAweDY3MjcsIDB4NzAyNywgMHg3NENGLCAweDdDNjAsIDB4ODA3RSwgMHg1MTIxLCAweDcwMjgsCisgICAgMHg3MjYyLCAweDc4Q0EsIDB4OENDMiwgMHg4Q0RBLCAweDhDRjQsIDB4OTZGNywgMHg0RTg2LCAweDUwREEsIDB4NUJFRSwKKyAgICAweDVFRDYsIDB4NjU5OSwgMHg3MUNFLCAweDc2NDIsIDB4NzdBRCwgMHg4MDRBLCAweDg0RkMsIDB4OTA3QywgMHg5QjI3LAorICAgIDB4OUY4RCwgMHg1OEQ4LCAweDVBNDEsIDB4NUM2MiwgMHg2QTEzLCAweDZEREEsIDB4NkYwRiwgMHg3NjNCLCAweDdEMkYsCisgICAgMHg3RTM3LCAweDg1MUUsIDB4ODkzOCwgMHg5M0U0LCAweDk2NEIsIDB4NTI4OSwgMHg2NUQyLCAweDY3RjMsIDB4NjlCNCwKKyAgICAweDZENDEsIDB4NkU5QywgMHg3MDBGLCAweDc0MDksIDB4NzQ2MCwgMHg3NTU5LCAweDc2MjQsIDB4Nzg2QiwgMHg4QjJDLAorICAgIDB4OTg1RSwgMHg1MTZELCAweDYyMkUsIDB4OTY3OCwgMHg0Rjk2LCAweDUwMkIsIDB4NUQxOSwgMHg2REVBLCAweDdEQjgsCisgICAgMHg4RjJBLCAweDVGOEIsIDB4NjE0NCwgMHg2ODE3LCAweDk2ODYsIDB4NTJEMiwgMHg4MDhCLCAweDUxREMsIDB4NTFDQywKKyAgICAweDY5NUUsIDB4N0ExQywgMHg3REJFLCAweDgzRjEsIDB4OTY3NSwgMHg0RkRBLCAweDUyMjksIDB4NTM5OCwgMHg1NDBGLAorICAgIDB4NTUwRSwgMHg1QzY1LCAweDYwQTcsIDB4Njc0RSwgMHg2OEE4LCAweDZENkMsIDB4NzI4MSwgMHg3MkY4LCAweDc0MDYsCisgICAgMHg3NDgzLCAweDc1RTIsIDB4N0M2QywgMHg3Rjc5LCAweDdGQjgsIDB4ODM4OSwgMHg4OENGLCAweDg4RTEsIDB4OTFDQywKKyAgICAweDkxRDAsIDB4OTZFMiwgMHg5QkM5LCAweDU0MUQsIDB4NkY3RSwgMHg3MUQwLCAweDc0OTgsIDB4ODVGQSwgMHg4RUFBLAorICAgIDB4OTZBMywgMHg5QzU3LCAweDlFOUYsIDB4Njc5NywgMHg2RENCLCAweDc0MzMsIDB4ODFFOCwgMHg5NzE2LCAweDc4MkMsCisgICAgMHg3QUNCLCAweDdCMjAsIDB4N0M5MiwgMHg2NDY5LCAweDc0NkEsIDB4NzVGMiwgMHg3OEJDLCAweDc4RTgsIDB4OTlBQywKKyAgICAweDlCNTQsIDB4OUVCQiwgMHg1QkRFLCAweDVFNTUsIDB4NkYyMCwgMHg4MTlDLCAweDgzQUIsIDB4OTA4OCwgMHg0RTA3LAorICAgIDB4NTM0RCwgMHg1QTI5LCAweDVERDIsIDB4NUY0RSwgMHg2MTYyLCAweDYzM0QsIDB4NjY2OSwgMHg2NkZDLCAweDZFRkYsCisgICAgMHg2RjJCLCAweDcwNjMsIDB4Nzc5RSwgMHg4NDJDLCAweDg1MTMsIDB4ODgzQiwgMHg4RjEzLCAweDk5NDUsIDB4OUMzQiwKKyAgICAweDU1MUMsIDB4NjJCOSwgMHg2NzJCLCAweDZDQUIsIDB4ODMwOSwgMHg4OTZBLCAweDk3N0EsIDB4NEVBMSwgMHg1OTg0LAorICAgIDB4NUZEOCwgMHg1RkQ5LCAweDY3MUIsIDB4N0RCMiwgMHg3RjU0LCAweDgyOTIsIDB4ODMyQiwgMHg4M0JELCAweDhGMUUsCisgICAgMHg5MDk5LCAweDU3Q0IsIDB4NTlCOSwgMHg1QTkyLCAweDVCRDAsIDB4NjYyNywgMHg2NzlBLCAweDY4ODUsIDB4NkJDRiwKKyAgICAweDcxNjQsIDB4N0Y3NSwgMHg4Q0I3LCAweDhDRTMsIDB4OTA4MSwgMHg5QjQ1LCAweDgxMDgsIDB4OEM4QSwgMHg5NjRDLAorICAgIDB4OUE0MCwgMHg5RUE1LCAweDVCNUYsIDB4NkMxMywgMHg3MzFCLCAweDc2RjIsIDB4NzZERiwgMHg4NDBDLCAweDUxQUEsCisgICAgMHg4OTkzLCAweDUxNEQsIDB4NTE5NSwgMHg1MkM5LCAweDY4QzksIDB4NkM5NCwgMHg3NzA0LCAweDc3MjAsIDB4N0RCRiwKKyAgICAweDdERUMsIDB4OTc2MiwgMHg5RUI1LCAweDZFQzUsIDB4ODUxMSwgMHg1MUE1LCAweDU0MEQsIDB4NTQ3RCwgMHg2NjBFLAorICAgIDB4NjY5RCwgMHg2OTI3LCAweDZFOUYsIDB4NzZCRiwgMHg3NzkxLCAweDgzMTcsIDB4ODRDMiwgMHg4NzlGLCAweDkxNjksCisgICAgMHg5Mjk4LCAweDlDRjQsIDB4ODg4MiwgMHg0RkFFLCAweDUxOTIsIDB4NTJERiwgMHg1OUM2LCAweDVFM0QsIDB4NjE1NSwKKyAgICAweDY0NzgsIDB4NjQ3OSwgMHg2NkFFLCAweDY3RDAsIDB4NkEyMSwgMHg2QkNELCAweDZCREIsIDB4NzI1RiwgMHg3MjYxLAorICAgIDB4NzQ0MSwgMHg3NzM4LCAweDc3REIsIDB4ODAxNywgMHg4MkJDLCAweDgzMDUsIDB4OEIwMCwgMHg4QjI4LCAweDhDOEMsCisgICAgMHg2NzI4LCAweDZDOTAsIDB4NzI2NywgMHg3NkVFLCAweDc3NjYsIDB4N0E0NiwgMHg5REE5LCAweDZCN0YsIDB4NkM5MiwKKyAgICAweDU5MjIsIDB4NjcyNiwgMHg4NDk5LCAweDUzNkYsIDB4NTg5MywgMHg1OTk5LCAweDVFREYsIDB4NjNDRiwgMHg2NjM0LAorICAgIDB4Njc3MywgMHg2RTNBLCAweDczMkIsIDB4N0FENywgMHg4MkQ3LCAweDkzMjgsIDB4NTJEOSwgMHg1REVCLCAweDYxQUUsCisgICAgMHg2MUNCLCAweDYyMEEsIDB4NjJDNywgMHg2NEFCLCAweDY1RTAsIDB4Njk1OSwgMHg2QjY2LCAweDZCQ0IsIDB4NzEyMSwKKyAgICAweDczRjcsIDB4NzU1RCwgMHg3RTQ2LCAweDgyMUUsIDB4ODMwMiwgMHg4NTZBLCAweDhBQTMsIDB4OENCRiwgMHg5NzI3LAorICAgIDB4OUQ2MSwgMHg1OEE4LCAweDlFRDgsIDB4NTAxMSwgMHg1MjBFLCAweDU0M0IsIDB4NTU0RiwgMHg2NTg3LCAweDZDNzYsCisgICAgMHg3RDBBLCAweDdEMEIsIDB4ODA1RSwgMHg4NjhBLCAweDk1ODAsIDB4OTZFRiwgMHg1MkZGLCAweDZDOTUsIDB4NzI2OSwKKyAgICAweDU0NzMsIDB4NUE5QSwgMHg1QzNFLCAweDVENEIsIDB4NUY0QywgMHg1RkFFLCAweDY3MkEsIDB4NjhCNiwgMHg2OTYzLAorICAgIDB4NkUzQywgMHg2RTQ0LCAweDc3MDksIDB4N0M3MywgMHg3RjhFLCAweDg1ODcsIDB4OEIwRSwgMHg4RkY3LCAweDk3NjEsCisgICAgMHg5RUY0LCAweDVDQjcsIDB4NjBCNiwgMHg2MTBELCAweDYxQUIsIDB4NjU0RiwgMHg2NUZCLCAweDY1RkMsIDB4NkMxMSwKKyAgICAweDZDRUYsIDB4NzM5RiwgMHg3M0M5LCAweDdERTEsIDB4OTU5NCwgMHg1QkM2LCAweDg3MUMsIDB4OEIxMCwgMHg1MjVELAorICAgIDB4NTM1QSwgMHg2MkNELCAweDY0MEYsIDB4NjRCMiwgMHg2NzM0LCAweDZBMzgsIDB4NkNDQSwgMHg3M0MwLCAweDc0OUUsCisgICAgMHg3Qjk0LCAweDdDOTUsIDB4N0UxQiwgMHg4MThBLCAweDgyMzYsIDB4ODU4NCwgMHg4RkVCLCAweDk2RjksIDB4OTlDMSwKKyAgICAweDRGMzQsIDB4NTM0QSwgMHg1M0NELCAweDUzREIsIDB4NjJDQywgMHg2NDJDLCAweDY1MDAsIDB4NjU5MSwgMHg2OUMzLAorICAgIDB4NkNFRSwgMHg2RjU4LCAweDczRUQsIDB4NzU1NCwgMHg3NjIyLCAweDc2RTQsIDB4NzZGQywgMHg3OEQwLCAweDc4RkIsCisgICAgMHg3OTJDLCAweDdENDYsIDB4ODIyQywgMHg4N0UwLCAweDhGRDQsIDB4OTgxMiwgMHg5OEVGLCAweDUyQzMsIDB4NjJENCwKKyAgICAweDY0QTUsIDB4NkUyNCwgMHg2RjUxLCAweDc2N0MsIDB4OERDQiwgMHg5MUIxLCAweDkyNjIsIDB4OUFFRSwgMHg5QjQzLAorICAgIDB4NTAyMywgMHg1MDhELCAweDU3NEEsIDB4NTlBOCwgMHg1QzI4LCAweDVFNDcsIDB4NUY3NywgMHg2MjNGLCAweDY1M0UsCisgICAgMHg2NUI5LCAweDY1QzEsIDB4NjYwOSwgMHg2NzhCLCAweDY5OUMsIDB4NkVDMiwgMHg3OEM1LCAweDdEMjEsIDB4ODBBQSwKKyAgICAweDgxODAsIDB4ODIyQiwgMHg4MkIzLCAweDg0QTEsIDB4ODY4QywgMHg4QTJBLCAweDhCMTcsIDB4OTBBNiwgMHg5NjMyLAorICAgIDB4OUY5MCwgMHg1MDBELCAweDRGRjMsIDB4NTdGOSwgMHg1Rjk4LCAweDYyREMsIDB4NjM5MiwgMHg2NzZGLCAweDZFNDMsCisgICAgMHg3MTE5LCAweDc2QzMsIDB4ODBDQywgMHg4MERBLCAweDg4RjQsIDB4ODhGNSwgMHg4OTE5LCAweDhDRTAsIDB4OEYyOSwKKyAgICAweDkxNEQsIDB4OTY2QSwgMHg0RjJGLCAweDRGNzAsIDB4NUUxQiwgMHg2N0NGLCAweDY4MjIsIDB4NzY3RCwgMHg3NjdFLAorICAgIDB4OUI0NCwgMHg1RTYxLCAweDZBMEEsIDB4NzE2OSwgMHg3MUQ0LCAweDc1NkEsIDB4N0U0MSwgMHg4NTQzLCAweDg1RTksCisgICAgMHg5OERDLCAweDRGMTAsIDB4N0I0RiwgMHg3RjcwLCAweDk1QTUsIDB4NTFFMSwgMHg1RTA2LCAweDY4QjUsIDB4NkMzRSwKKyAgICAweDZDNEUsIDB4NkNEQiwgMHg3MkFGLCAweDdCQzQsIDB4ODMwMywgMHg2Q0Q1LCAweDc0M0EsIDB4NTBGQiwgMHg1Mjg4LAorICAgIDB4NThDMSwgMHg2NEQ4LCAweDZBOTcsIDB4NzRBNywgMHg3NjU2LCAweDc4QTcsIDB4ODYxNywgMHg5NUUyLCAweDk3MzksCisgICAgMHg1MzVFLCAweDVGMDEsIDB4OEI4QSwgMHg4RkE4LCAweDhGQUYsIDB4OTA4QSwgMHg1MjI1LCAweDc3QTUsIDB4OUM0OSwKKyAgICAweDlGMDgsIDB4NEUxOSwgMHg1MDAyLCAweDUxNzUsIDB4NUM1QiwgMHg1RTc3LCAweDY2MUUsIDB4NjYzQSwgMHg2N0M0LAorICAgIDB4NjhDNSwgMHg3MEIzLCAweDc1MDEsIDB4NzVDNSwgMHg3OUM5LCAweDdBREQsIDB4OEYyNywgMHg5OTIwLCAweDlBMDgsCisgICAgMHg0RkRELCAweDU4MjEsIDB4NTgzMSwgMHg1QkY2LCAweDY2NkUsIDB4NkI2NSwgMHg2RDExLCAweDZFN0EsIDB4NkY3RCwKKyAgICAweDczRTQsIDB4NzUyQiwgMHg4M0U5LCAweDg4REMsIDB4ODkxMywgMHg4QjVDLCAweDhGMTQsIDB4NEYwRiwgMHg1MEQ1LAorICAgIDB4NTMxMCwgMHg1MzVDLCAweDVCOTMsIDB4NUZBOSwgMHg2NzBELCAweDc5OEYsIDB4ODE3OSwgMHg4MzJGLCAweDg1MTQsCisgICAgMHg4OTA3LCAweDg5ODYsIDB4OEYzOSwgMHg4RjNCLCAweDk5QTUsIDB4OUMxMiwgMHg2NzJDLCAweDRFNzYsIDB4NEZGOCwKKyAgICAweDU5NDksIDB4NUMwMSwgMHg1Q0VGLCAweDVDRjAsIDB4NjM2NywgMHg2OEQyLCAweDcwRkQsIDB4NzFBMiwgMHg3NDJCLAorICAgIDB4N0UyQiwgMHg4NEVDLCAweDg3MDIsIDB4OTAyMiwgMHg5MkQyLCAweDlDRjMsIDB4NEUwRCwgMHg0RUQ4LCAweDRGRUYsCisgICAgMHg1MDg1LCAweDUyNTYsIDB4NTI2RiwgMHg1NDI2LCAweDU0OTAsIDB4NTdFMCwgMHg1OTJCLCAweDVBNjYsIDB4NUI1QSwKKyAgICAweDVCNzUsIDB4NUJDQywgMHg1RTlDLCAweDYyNzYsIDB4NjU3NywgMHg2NUE3LCAweDZENkUsIDB4NkVBNSwgMHg3MjM2LAorICAgIDB4N0IyNiwgMHg3QzNGLCAweDdGMzYsIDB4ODE1MCwgMHg4MTUxLCAweDgxOUEsIDB4ODI0MCwgMHg4Mjk5LCAweDgzQTksCisgICAgMHg4QTAzLCAweDhDQTAsIDB4OENFNiwgMHg4Q0ZCLCAweDhENzQsIDB4OERCQSwgMHg5MEU4LCAweDkxREMsIDB4OTYxQywKKyAgICAweDk2NDQsIDB4OTlEOSwgMHg5Q0U3LCAweDUzMTcsIDB4NTIwNiwgMHg1NDI5LCAweDU2NzQsIDB4NThCMywgMHg1OTU0LAorICAgIDB4NTk2RSwgMHg1RkZGLCAweDYxQTQsIDB4NjI2RSwgMHg2NjEwLCAweDZDN0UsIDB4NzExQSwgMHg3NkM2LCAweDdDODksCisgICAgMHg3Q0RFLCAweDdEMUIsIDB4ODJBQywgMHg4Q0MxLCAweDk2RjAsIDB4NEY1QiwgMHg1RjE3LCAweDVGN0YsIDB4NjJDMiwKKyAgICAweDVEMjksIDB4NjcwQiwgMHg2OERBLCAweDc4N0MsIDB4N0U0MywgMHg5RDZDLCAweDRFMTUsIDB4NTA5OSwgMHg1MzE1LAorICAgIDB4NTMyQSwgMHg1MzUxLCAweDU5ODMsIDB4NUE2MiwgMHg1RTg3LCAweDYwQjIsIDB4NjE4QSwgMHg2MjQ5LCAweDYyNzksCisgICAgMHg2NTkwLCAweDY3ODcsIDB4NjlBNywgMHg2QkQ0LCAweDZCRDYsIDB4NkJENywgMHg2QkQ4LCAweDZDQjgsIDB4NzQzNSwKKyAgICAweDc1RkEsIDB4NzgxMiwgMHg3ODkxLCAweDc5RDUsIDB4NzlEOCwgMHg3QzgzLCAweDdEQ0IsIDB4N0ZFMSwgMHg4MEE1LAorICAgIDB4ODEzRSwgMHg4MUMyLCAweDgzRjIsIDB4ODcxQSwgMHg4OEU4LCAweDhBQjksIDB4OEI2QywgMHg4Q0JCLCAweDkxMTksCisgICAgMHg5NzVFLCAweDk4REIsIDB4OUYzQiwgMHg1NkFDLCAweDVCMkEsIDB4NUY2QywgMHg2NThDLCAweDZBQjMsIDB4NkJBRiwKKyAgICAweDZENUMsIDB4NkZGMSwgMHg3MDE1LCAweDcyNUQsIDB4NzNBRCwgMHg4Q0E3LCAweDhDRDMsIDB4OTgzQiwgMHg2MTkxLAorICAgIDB4NkMzNywgMHg4MDU4LCAweDlBMDEsIDB4NEU0RCwgMHg0RThCLCAweDRFOUIsIDB4NEVENSwgMHg0RjNBLCAweDRGM0MsCisgICAgMHg0RjdGLCAweDRGREYsIDB4NTBGRiwgMHg1M0YyLCAweDUzRjgsIDB4NTUwNiwgMHg1NUUzLCAweDU2REIsIDB4NThFQiwKKyAgICAweDU5NjIsIDB4NUExMSwgMHg1QkVCLCAweDVCRkEsIDB4NUMwNCwgMHg1REYzLCAweDVFMkIsIDB4NUY5OSwgMHg2MDFELAorICAgIDB4NjM2OCwgMHg2NTlDLCAweDY1QUYsIDB4NjdGNiwgMHg2N0ZCLCAweDY4QUQsIDB4NkI3QiwgMHg2Qzk5LCAweDZDRDcsCisgICAgMHg2RTIzLCAweDcwMDksIDB4NzM0NSwgMHg3ODAyLCAweDc5M0UsIDB4Nzk0MCwgMHg3OTYwLCAweDc5QzEsIDB4N0JFOSwKKyAgICAweDdEMTcsIDB4N0Q3MiwgMHg4MDg2LCAweDgyMEQsIDB4ODM4RSwgMHg4NEQxLCAweDg2QzcsIDB4ODhERiwgMHg4QTUwLAorICAgIDB4OEE1RSwgMHg4QjFELCAweDhDREMsIDB4OEQ2NiwgMHg4RkFELCAweDkwQUEsIDB4OThGQywgMHg5OURGLCAweDlFOUQsCisgICAgMHg1MjRBLCAweDY3MTQsIDB4NTA5OCwgMHg1MjJBLCAweDVDNzEsIDB4NjU2MywgMHg2QzU1LCAweDczQ0EsIDB4NzUyMywKKyAgICAweDc1OUQsIDB4N0I5NywgMHg4NDlDLCAweDkxNzgsIDB4OTczMCwgMHg0RTc3LCAweDY0OTIsIDB4NkJCQSwgMHg3MTVFLAorICAgIDB4ODVBOSwgMHg0RTA5LCAweDY3NDksIDB4NjhFRSwgMHg2RTE3LCAweDgyOUYsIDB4ODUxOCwgMHg4ODZCLCAweDYzRjcsCisgICAgMHg2RjgxLCAweDkyMTIsIDB4OThBRiwgMHg0RTBBLCAweDUwQjcsIDB4NTBDRiwgMHg1MTFGLCAweDU1NDYsIDB4NTVBQSwKKyAgICAweDU2MTcsIDB4NUI0MCwgMHg1QzE5LCAweDVDRTAsIDB4NUUzOCwgMHg1RThBLCAweDVFQTAsIDB4NUVDMiwgMHg2MEYzLAorICAgIDB4Njg1MSwgMHg2QTYxLCAweDZFNTgsIDB4NzIzRCwgMHg3MjQwLCAweDcyQzAsIDB4NzZGOCwgMHg3OTY1LCAweDdCQjEsCisgICAgMHg3RkQ0LCAweDg4RjMsIDB4ODlGNCwgMHg4QTczLCAweDhDNjEsIDB4OENERSwgMHg5NzFDLCAweDU4NUUsIDB4NzRCRCwKKyAgICAweDhDRkQsIDB4NTVDNywgMHg3QTYxLCAweDdEMjIsIDB4ODI3MiwgMHg3MjcyLCAweDc1MUYsIDB4NzUyNSwgMHg3QjE5LAorICAgIDB4NTg4NSwgMHg1OEZCLCAweDVEQkMsIDB4NUU4RiwgMHg1RUI2LCAweDVGOTAsIDB4NjA1NSwgMHg2MjkyLCAweDYzN0YsCisgICAgMHg2NTRELCAweDY2OTEsIDB4NjZEOSwgMHg2NkY4LCAweDY4MTYsIDB4NjhGMiwgMHg3MjgwLCAweDc0NUUsIDB4N0I2RSwKKyAgICAweDdENkUsIDB4N0RENiwgMHg3RjcyLCAweDgwRTUsIDB4ODIxMiwgMHg4NUFGLCAweDg5N0YsIDB4OEE5MywgMHg5MDFELAorICAgIDB4OTJFNCwgMHg5RUNELCAweDlGMjAsIDB4NTkxNSwgMHg1OTZELCAweDVFMkQsIDB4NjBEQywgMHg2NjE0LCAweDY2NzMsCisgICAgMHg2NzkwLCAweDZDNTAsIDB4NkRDNSwgMHg2RjVGLCAweDc3RjMsIDB4NzhBOSwgMHg4NEM2LCAweDkxQ0IsIDB4OTMyQiwKKyAgICAweDRFRDksIDB4NTBDQSwgMHg1MTQ4LCAweDU1ODQsIDB4NUIwQiwgMHg1QkEzLCAweDYyNDcsIDB4NjU3RSwgMHg2NUNCLAorICAgIDB4NkUzMiwgMHg3MTdELCAweDc0MDEsIDB4NzQ0NCwgMHg3NDg3LCAweDc0QkYsIDB4NzY2QywgMHg3OUFBLCAweDdEREEsCisgICAgMHg3RTU1LCAweDdGQTgsIDB4ODE3QSwgMHg4MUIzLCAweDgyMzksIDB4ODYxQSwgMHg4N0VDLCAweDhBNzUsIDB4OERFMywKKyAgICAweDkwNzgsIDB4OTI5MSwgMHg5NDI1LCAweDk5NEQsIDB4OUJBRSwgMHg1MzY4LCAweDVDNTEsIDB4Njk1NCwgMHg2Q0M0LAorICAgIDB4NkQyOSwgMHg2RTJCLCAweDgyMEMsIDB4ODU5QiwgMHg4OTNCLCAweDhBMkQsIDB4OEFBQSwgMHg5NkVBLCAweDlGNjcsCisgICAgMHg1MjYxLCAweDY2QjksIDB4NkJCMiwgMHg3RTk2LCAweDg3RkUsIDB4OEQwRCwgMHg5NTgzLCAweDk2NUQsIDB4NjUxRCwKKyAgICAweDZEODksIDB4NzFFRSwgMHg1N0NFLCAweDU5RDMsIDB4NUJBQywgMHg2MDI3LCAweDYwRkEsIDB4NjIxMCwgMHg2NjFGLAorICAgIDB4NjY1RiwgMHg3MzI5LCAweDczRjksIDB4NzZEQiwgMHg3NzAxLCAweDdCNkMsIDB4ODA1NiwgMHg4MDcyLCAweDgxNjUsCisgICAgMHg4QUEwLCAweDkxOTIsIDB4NEUxNiwgMHg1MkUyLCAweDZCNzIsIDB4NkQxNywgMHg3QTA1LCAweDdCMzksIDB4N0QzMCwKKyAgICAweDhDQjAsIDB4NTNFQywgMHg1NjJGLCAweDU4NTEsIDB4NUJCNSwgMHg1QzBGLCAweDVDMTEsIDB4NURFMiwgMHg2MjQwLAorICAgIDB4NjM4MywgMHg2NDE0LCAweDY2MkQsIDB4NjhCMywgMHg2Q0JDLCAweDZEODgsIDB4NkVBRiwgMHg3MDFGLCAweDcwQTQsCisgICAgMHg3MUQyLCAweDc1MjYsIDB4NzU4RiwgMHg3NThFLCAweDc2MTksIDB4N0IxMSwgMHg3QkUwLCAweDdDMkIsIDB4N0QyMCwKKyAgICAweDdEMzksIDB4ODUyQywgMHg4NTZELCAweDg2MDcsIDB4OEEzNCwgMHg5MDBELCAweDkwNjEsIDB4OTBCNSwgMHg5MkI3LAorICAgIDB4OTdGNiwgMHg5QTM3LCAweDRGRDcsIDB4NUM2QywgMHg2NzVGLCAweDZEOTEsIDB4N0M5RiwgMHg3RThDLCAweDhCMTYsCisgICAgMHg4RDE2LCAweDkwMUYsIDB4NUI2QiwgMHg1REZELCAweDY0MEQsIDB4ODRDMCwgMHg5MDVDLCAweDk4RTEsIDB4NzM4NywKKyAgICAweDVCOEIsIDB4NjA5QSwgMHg2NzdFLCAweDZEREUsIDB4OEExRiwgMHg4QUE2LCAweDkwMDEsIDB4OTgwQywgMHg1MjM3LAorICAgIDB4NzA1MSwgMHg3ODhFLCAweDkzOTYsIDB4ODg3MCwgMHg5MUQ3LCAweDRGRUUsIDB4NTNENywgMHg1NUZELCAweDU2REEsCisgICAgMHg1NzgyLCAweDU4RkQsIDB4NUFDMiwgMHg1Qjg4LCAweDVDQUIsIDB4NUNDMCwgMHg1RTI1LCAweDYxMDEsIDB4NjIwRCwKKyAgICAweDYyNEIsIDB4NjM4OCwgMHg2NDFDLCAweDY1MzYsIDB4NjU3OCwgMHg2QTM5LCAweDZCOEEsIDB4NkMzNCwgMHg2RDE5LAorICAgIDB4NkYzMSwgMHg3MUU3LCAweDcyRTksIDB4NzM3OCwgMHg3NDA3LCAweDc0QjIsIDB4NzYyNiwgMHg3NzYxLCAweDc5QzAsCisgICAgMHg3QTU3LCAweDdBRUEsIDB4N0NCOSwgMHg3RDhGLCAweDdEQUMsIDB4N0U2MSwgMHg3RjlFLCAweDgxMjksIDB4ODMzMSwKKyAgICAweDg0OTAsIDB4ODREQSwgMHg4NUVBLCAweDg4OTYsIDB4OEFCMCwgMHg4QjkwLCAweDhGMzgsIDB4OTA0MiwgMHg5MDgzLAorICAgIDB4OTE2QywgMHg5Mjk2LCAweDkyQjksIDB4OTY4QiwgMHg5NkE3LCAweDk2QTgsIDB4OTZENiwgMHg5NzAwLCAweDk4MDgsCisgICAgMHg5OTk2LCAweDlBRDMsIDB4OUIxQSwgMHg1M0Q0LCAweDU4N0UsIDB4NTkxOSwgMHg1QjcwLCAweDVCQkYsIDB4NkREMSwKKyAgICAweDZGNUEsIDB4NzE5RiwgMHg3NDIxLCAweDc0QjksIDB4ODA4NSwgMHg4M0ZELCAweDVERTEsIDB4NUY4NywgMHg1RkFBLAorICAgIDB4NjA0MiwgMHg2NUVDLCAweDY4MTIsIDB4Njk2RiwgMHg2QTUzLCAweDZCODksIDB4NkQzNSwgMHg2REYzLCAweDczRTMsCisgICAgMHg3NkZFLCAweDc3QUMsIDB4N0I0RCwgMHg3RDE0LCAweDgxMjMsIDB4ODIxQywgMHg4MzQwLCAweDg0RjQsIDB4ODU2MywKKyAgICAweDhBNjIsIDB4OEFDNCwgMHg5MTg3LCAweDkzMUUsIDB4OTgwNiwgMHg5OUI0LCAweDYyMEMsIDB4ODg1MywgMHg4RkYwLAorICAgIDB4OTI2NSwgMHg1RDA3LCAweDVEMjcsIDB4NUQ2OSwgMHg3NDVGLCAweDgxOUQsIDB4ODc2OCwgMHg2RkQ1LCAweDYyRkUsCisgICAgMHg3RkQyLCAweDg5MzYsIDB4ODk3MiwgMHg0RTFFLCAweDRFNTgsIDB4NTBFNywgMHg1MkRELCAweDUzNDcsIDB4NjI3RiwKKyAgICAweDY2MDcsIDB4N0U2OSwgMHg4ODA1LCAweDk2NUUsIDB4NEY4RCwgMHg1MzE5LCAweDU2MzYsIDB4NTlDQiwgMHg1QUE0LAorICAgIDB4NUMzOCwgMHg1QzRFLCAweDVDNEQsIDB4NUUwMiwgMHg1RjExLCAweDYwNDMsIDB4NjVCRCwgMHg2NjJGLCAweDY2NDIsCisgICAgMHg2N0JFLCAweDY3RjQsIDB4NzMxQywgMHg3N0UyLCAweDc5M0EsIDB4N0ZDNSwgMHg4NDk0LCAweDg0Q0QsIDB4ODk5NiwKKyAgICAweDhBNjYsIDB4OEE2OSwgMHg4QUUxLCAweDhDNTUsIDB4OEM3QSwgMHg1N0Y0LCAweDVCRDQsIDB4NUYwRiwgMHg2MDZGLAorICAgIDB4NjJFRCwgMHg2OTBELCAweDZCOTYsIDB4NkU1QywgMHg3MTg0LCAweDdCRDIsIDB4ODc1NSwgMHg4QjU4LCAweDhFRkUsCisgICAgMHg5OERGLCAweDk4RkUsIDB4NEYzOCwgMHg0RjgxLCAweDRGRTEsIDB4NTQ3QiwgMHg1QTIwLCAweDVCQjgsIDB4NjEzQywKKyAgICAweDY1QjAsIDB4NjY2OCwgMHg3MUZDLCAweDc1MzMsIDB4Nzk1RSwgMHg3RDMzLCAweDgxNEUsIDB4ODFFMywgMHg4Mzk4LAorICAgIDB4ODVBQSwgMHg4NUNFLCAweDg3MDMsIDB4OEEwQSwgMHg4RUFCLCAweDhGOUIsIDB4OEZDNSwgMHg1OTMxLCAweDVCQTQsCisgICAgMHg1QkU2LCAweDYwODksIDB4NUJFOSwgMHg1QzBCLCAweDVGQzMsIDB4NkM4MSwgMHg2REYxLCAweDcwMEIsIDB4NzUxQSwKKyAgICAweDgyQUYsIDB4OEFGNiwgMHg0RUMwLCAweDUzNDEsIDB4OTZEOSwgMHg2QzBGLCAweDRFOUUsIDB4NEZDNCwgMHg1MTUyLAorICAgIDB4NTU1RSwgMHg1QTI1LCAweDVDRTgsIDB4NjIxMSwgMHg3MjU5LCAweDgyQkQsIDB4ODNBQSwgMHg4NkZFLCAweDg4NTksCisgICAgMHg4QTFELCAweDk2M0YsIDB4OTZDNSwgMHg5OTEzLCAweDlEMDksIDB4OUQ1RCwgMHg1ODBBLCAweDVDQjMsIDB4NURCRCwKKyAgICAweDVFNDQsIDB4NjBFMSwgMHg2MTE1LCAweDYzRTEsIDB4NkEwMiwgMHg2RTI1LCAweDkxMDIsIDB4OTM1NCwgMHg5ODRFLAorICAgIDB4OUMxMCwgMHg5Rjc3LCAweDVCODksIDB4NUNCOCwgMHg2MzA5LCAweDY2NEYsIDB4Njg0OCwgMHg3NzNDLCAweDk2QzEsCisgICAgMHg5NzhELCAweDk4NTQsIDB4OUI5RiwgMHg2NUExLCAweDhCMDEsIDB4OEVDQiwgMHg5NUJDLCAweDU1MzUsIDB4NUNBOSwKKyAgICAweDVERDYsIDB4NUVCNSwgMHg2Njk3LCAweDc2NEMsIDB4ODNGNCwgMHg5NUM3LCAweDU4RDMsIDB4NjJCQywgMHg3MkNFLAorICAgIDB4OUQyOCwgMHg0RUYwLCAweDU5MkUsIDB4NjAwRiwgMHg2NjNCLCAweDZCODMsIDB4NzlFNywgMHg5RDI2LCAweDUzOTMsCisgICAgMHg1NEMwLCAweDU3QzMsIDB4NUQxNiwgMHg2MTFCLCAweDY2RDYsIDB4NkRBRiwgMHg3ODhELCAweDgyN0UsIDB4OTY5OCwKKyAgICAweDk3NDQsIDB4NTM4NCwgMHg2MjdDLCAweDYzOTYsIDB4NkRCMiwgMHg3RTBBLCAweDgxNEIsIDB4OTg0RCwgMHg2QUZCLAorICAgIDB4N0Y0QywgMHg5REFGLCAweDlFMUEsIDB4NEU1RiwgMHg1MDNCLCAweDUxQjYsIDB4NTkxQywgMHg2MEY5LCAweDYzRjYsCisgICAgMHg2OTMwLCAweDcyM0EsIDB4ODAzNiwgMHg5MUNFLCAweDVGMzEsIDB4N0QwNCwgMHg4MkU1LCAweDg0NkYsIDB4ODRCQiwKKyAgICAweDg1RTUsIDB4OEU4RCwgMHg0RjZGLCAweDU4RTQsIDB4NUI0MywgMHg2MDU5LCAweDYzREEsIDB4NjUxOCwgMHg2NTZELAorICAgIDB4NjY5OCwgMHg2OTRBLCAweDZBMjMsIDB4NkQwQiwgMHg3MDAxLCAweDcxNkMsIDB4NzVEMiwgMHg3NjBELCAweDc5QjMsCisgICAgMHg3QTcwLCAweDdGOEEsIDB4ODk0NCwgMHg4QjkzLCAweDkxQzAsIDB4OTY3RCwgMHg5OTBBLCAweDU3MDQsIDB4NUZBMSwKKyAgICAweDY1QkMsIDB4NkYwMSwgMHg3NjAwLCAweDc5QTYsIDB4OEE5RSwgMHg5OUFELCAweDlCNUEsIDB4OUY2QywgMHg1MTA0LAorICAgIDB4NjFCNiwgMHg2MjkxLCAweDZBOEQsIDB4ODFDNiwgMHg1MDQzLCAweDU4MzAsIDB4NUY2NiwgMHg3MTA5LCAweDhBMDAsCisgICAgMHg4QUZBLCAweDVCN0MsIDB4ODYxNiwgMHg0RkZBLCAweDUxM0MsIDB4NTZCNCwgMHg1OTQ0LCAweDYzQTksIDB4NkRGOSwKKyAgICAweDVEQUEsIDB4Njk2RCwgMHg1MTg2LCAweDRFODgsIDB4NEY1OSwgMHg1OTgyLCAweDZCNUYsIDB4NkM1RCwgMHg3NEI1LAorICAgIDB4NzkxNiwgMHg4MjA3LCAweDgyNDUsIDB4ODMzOSwgMHg4RjNGLCAweDhGNUQsIDB4OTkxOCwgMHg0RUE2LCAweDU3REYsCisgICAgMHg1Rjc5LCAweDY2MTMsIDB4NzVBQiwgMHg3RTc5LCAweDhCNkYsIDB4OTAwNiwgMHg5QTVCLCAweDU2QTUsIDB4NTgyNywKKyAgICAweDU5RjgsIDB4NUExRiwgMHg1QkI0LCAweDVFRjYsIDB4NjM1MCwgMHg2MzNCLCAweDY5M0QsIDB4NkM4NywgMHg2Q0JGLAorICAgIDB4NkQ4RSwgMHg2RDkzLCAweDZERjUsIDB4NkYxNCwgMHg3MERGLCAweDcxMzYsIDB4NzE1OSwgMHg3MUMzLCAweDcxRDUsCisgICAgMHg3ODRGLCAweDc4NkYsIDB4N0I3NSwgMHg3REUzLCAweDdFMkYsIDB4ODg0RCwgMHg4RURGLCAweDkyNUIsIDB4OUNGNiwKKyAgICAweDYwODUsIDB4NkQ4NSwgMHg3MUIxLCAweDk1QjEsIDB4NTNBRCwgMHg2N0QzLCAweDcwOEUsIDB4NzEzMCwgMHg3NDMwLAorICAgIDB4ODI3NiwgMHg4MkQyLCAweDk1QkIsIDB4OUFFNSwgMHg5RTdELCAweDY2QzQsIDB4NzFDMSwgMHg4NDQ5LCAweDU4NEIsCisgICAgMHg1REI4LCAweDVGNzEsIDB4NjYyMCwgMHg2NjhFLCAweDY5NzksIDB4NjlBRSwgMHg2QzM4LCAweDZDRjMsIDB4NkUzNiwKKyAgICAweDZGNDEsIDB4NkZEQSwgMHg3MDFCLCAweDcwMkYsIDB4NzE1MCwgMHg3MURGLCAweDczNzAsIDB4NzQ1QiwgMHg3NEQ0LAorICAgIDB4NzZDOCwgMHg3QTRFLCAweDdFOTMsIDB4ODJGMSwgMHg4QTYwLCAweDhGQ0UsIDB4OTM0OCwgMHg5NzE5LCAweDRFNDIsCisgICAgMHg1MDJBLCAweDUyMDgsIDB4NTNFMSwgMHg2NkYzLCAweDZDNkQsIDB4NkZDQSwgMHg3MzBBLCAweDc3N0YsIDB4N0E2MiwKKyAgICAweDgyQUUsIDB4ODVERCwgMHg4NjAyLCAweDg4RDQsIDB4OEE2MywgMHg4QjdELCAweDhDNkIsIDB4OTJCMywgMHg5NzEzLAorICAgIDB4OTgxMCwgMHg0RTk0LCAweDRGMEQsIDB4NEZDOSwgMHg1MEIyLCAweDUzNDgsIDB4NTQzRSwgMHg1NDMzLCAweDU1REEsCisgICAgMHg1ODYyLCAweDU4QkEsIDB4NTk2NywgMHg1QTFCLCAweDVCRTQsIDB4NjA5RiwgMHg2MUNBLCAweDY1NTYsIDB4NjVGRiwKKyAgICAweDY2NjQsIDB4NjhBNywgMHg2QzVBLCAweDZGQjMsIDB4NzBDRiwgMHg3MUFDLCAweDczNTIsIDB4N0I3RCwgMHg4NzA4LAorICAgIDB4OEFBNCwgMHg5QzMyLCAweDlGMDcsIDB4NUM0QiwgMHg2QzgzLCAweDczNDQsIDB4NzM4OSwgMHg5MjNBLCAweDZFQUIsCisgICAgMHg3NDY1LCAweDc2MUYsIDB4N0E2OSwgMHg3RTE1LCAweDg2MEEsIDB4NTE0MCwgMHg1OEM1LCAweDY0QzEsIDB4NzRFRSwKKyAgICAweDc1MTUsIDB4NzY3MCwgMHg3RkMxLCAweDkwOTUsIDB4OTZDRCwgMHg5OTU0LCAweDZFMjYsIDB4NzRFNiwgMHg3QUE5LAorICAgIDB4N0FBQSwgMHg4MUU1LCAweDg2RDksIDB4ODc3OCwgMHg4QTFCLCAweDVBNDksIDB4NUI4QywgMHg1QjlCLCAweDY4QTEsCisgICAgMHg2OTAwLCAweDZENjMsIDB4NzNBOSwgMHg3NDEzLCAweDc0MkMsIDB4Nzg5NywgMHg3REU5LCAweDdGRUIsIDB4ODExOCwKKyAgICAweDgxNTUsIDB4ODM5RSwgMHg4QzRDLCAweDk2MkUsIDB4OTgxMSwgMHg2NkYwLCAweDVGODAsIDB4NjVGQSwgMHg2Nzg5LAorICAgIDB4NkM2QSwgMHg3MzhCLCAweDUwMkQsIDB4NUEwMywgMHg2QjZBLCAweDc3RUUsIDB4NTkxNiwgMHg1RDZDLCAweDVEQ0QsCisgICAgMHg3MzI1LCAweDc1NEYsIDB4NTBFNSwgMHg1MUY5LCAweDU4MkYsIDB4NTkyRCwgMHg1OTk2LCAweDU5REEsIDB4NUJFNSwKKyAgICAweDVEQTIsIDB4NjJENywgMHg2NDE2LCAweDY0OTMsIDB4NjRGRSwgMHg2NkRDLCAweDZBNDgsIDB4NzFGRiwgMHg3NDY0LAorICAgIDB4N0E4OCwgMHg3QUFGLCAweDdFNDcsIDB4N0U1RSwgMHg4MDAwLCAweDgxNzAsIDB4ODdFRiwgMHg4OTgxLCAweDhCMjAsCisgICAgMHg5MDU5LCAweDkwODAsIDB4OTk1MiwgMHg2MTdFLCAweDZCMzIsIDB4NkQ3NCwgMHg3RTFGLCAweDg5MjUsIDB4OEZCMSwKKyAgICAweDRGRDEsIDB4NTBBRCwgMHg1MTk3LCAweDUyQzcsIDB4NTdDNywgMHg1ODg5LCAweDVCQjksIDB4NUVCOCwgMHg2MTQyLAorICAgIDB4Njk5NSwgMHg2RDhDLCAweDZFNjcsIDB4NkVCNiwgMHg3MTk0LCAweDc0NjIsIDB4NzUyOCwgMHg3NTJDLCAweDgwNzMsCisgICAgMHg4MzM4LCAweDg0QzksIDB4OEUwQSwgMHg5Mzk0LCAweDkzREUsIDB4NEU4RSwgMHg0RjUxLCAweDUwNzYsIDB4NTEyQSwKKyAgICAweDUzQzgsIDB4NTNDQiwgMHg1M0YzLCAweDVCODcsIDB4NUJEMywgMHg1QzI0LCAweDYxMUEsIDB4NjE4MiwgMHg2NUY0LAorICAgIDB4NzI1QiwgMHg3Mzk3LCAweDc0NDAsIDB4NzZDMiwgMHg3OTUwLCAweDc5OTEsIDB4NzlCOSwgMHg3RDA2LCAweDdGQkQsCisgICAgMHg4MjhCLCAweDg1RDUsIDB4ODY1RSwgMHg4RkMyLCAweDkwNDcsIDB4OTBGNSwgMHg5MUVBLCAweDk2ODUsIDB4OTZFOCwKKyAgICAweDk2RTksIDB4NTJENiwgMHg1RjY3LCAweDY1RUQsIDB4NjYzMSwgMHg2ODJGLCAweDcxNUMsIDB4N0EzNiwgMHg5MEMxLAorICAgIDB4OTgwQSwgMHg0RTkxLCAweDZBNTIsIDB4NkI5RSwgMHg2RjkwLCAweDcxODksIDB4ODAxOCwgMHg4MkI4LCAweDg1NTMsCisgICAgMHg5MDRCLCAweDk2OTUsIDB4OTZGMiwgMHg5N0ZCLCAweDg1MUEsIDB4OUIzMSwgMHg0RTkwLCAweDcxOEEsIDB4OTZDNCwKKyAgICAweDUxNDMsIDB4NTM5RiwgMHg1NEUxLCAweDU3MTMsIDB4NTcxMiwgMHg1N0EzLCAweDVBOUIsIDB4NUFDNCwgMHg1QkMzLAorICAgIDB4NjAyOCwgMHg2MTNGLCAweDYzRjQsIDB4NkM4NSwgMHg2RDM5LCAweDZFNzIsIDB4NkU5MCwgMHg3MjMwLCAweDczM0YsCisgICAgMHg3NDU3LCAweDgyRDEsIDB4ODg4MSwgMHg4RjQ1LCAweDkwNjAsIDB4OTY2MiwgMHg5ODU4LCAweDlEMUIsIDB4NjcwOCwKKyAgICAweDhEOEEsIDB4OTI1RSwgMHg0RjRELCAweDUwNDksIDB4NTBERSwgMHg1MzcxLCAweDU3MEQsIDB4NTlENCwgMHg1QTAxLAorICAgIDB4NUMwOSwgMHg2MTcwLCAweDY2OTAsIDB4NkUyRCwgMHg3MjMyLCAweDc0NEIsIDB4N0RFRiwgMHg4MEMzLCAweDg0MEUsCisgICAgMHg4NDY2LCAweDg1M0YsIDB4ODc1RiwgMHg4ODVCLCAweDg5MTgsIDB4OEIwMiwgMHg5MDU1LCAweDk3Q0IsIDB4OUI0RiwKKyAgICAweDRFNzMsIDB4NEY5MSwgMHg1MTEyLCAweDUxNkEsIDB4NTUyRiwgMHg1NUE5LCAweDVCN0EsIDB4NUJBNSwgMHg1RTdDLAorICAgIDB4NUU3RCwgMHg1RUJFLCAweDYwQTAsIDB4NjBERiwgMHg2MTA4LCAweDYxMDksIDB4NjNDNCwgMHg2NTM4LCAweDY3MDksCisgICAgMHg2N0Q0LCAweDY3REEsIDB4Njk2MSwgMHg2OTYyLCAweDZDQjksIDB4NkQyNywgMHg2RTM4LCAweDZGRTEsIDB4NzMzNiwKKyAgICAweDczMzcsIDB4NzQ1QywgMHg3NTMxLCAweDc2NTIsIDB4N0RBRCwgMHg4MUZFLCAweDg0MzgsIDB4ODhENSwgMHg4QTk4LAorICAgIDB4OEFEQiwgMHg4QUVELCAweDhFMzAsIDB4OEU0MiwgMHg5MDRBLCAweDkwM0UsIDB4OTA3QSwgMHg5MTQ5LCAweDkxQzksCisgICAgMHg5MzZFLCAweDU4MDksIDB4NkJEMywgMHg4MDg5LCAweDgwQjIsIDB4NTE0MSwgMHg1OTZCLCAweDVDMzksIDB4NkY2NCwKKyAgICAweDczQTcsIDB4ODBFNCwgMHg4RDA3LCAweDkyMTcsIDB4OTU4RiwgMHg4MDdGLCAweDYyMEUsIDB4NzAxQywgMHg3RDY4LAorICAgIDB4ODc4RCwgMHg1N0EwLCAweDYwNjksIDB4NjE0NywgMHg2QkI3LCAweDhBQkUsIDB4OTI4MCwgMHg5NkIxLCAweDRFNTksCisgICAgMHg1NDFGLCAweDZERUIsIDB4ODUyRCwgMHg5NjcwLCAweDk3RjMsIDB4OThFRSwgMHg2M0Q2LCAweDZDRTMsIDB4OTA5MSwKKyAgICAweDUxREQsIDB4NjFDOSwgMHg4MUJBLCAweDlERjksIDB4NEY5RCwgMHg1MDFBLCAweDUxMDAsIDB4NUI5QywgMHg2MTBGLAorICAgIDB4NjFGRiwgMHg2NEVDLCAweDY5MDUsIDB4NkJDNSwgMHg3NTkxLCAweDc3RTMsIDB4N0ZBOSwgMHg4MjY0LCAweDg1OEYsCisgICAgMHg4N0ZCLCAweDg4NjMsIDB4OEFCQywgMHg4QjcwLCAweDkxQUIsIDB4NEU4QywgMHg0RUU1LCAweDRGMEEsIDB4NTkzNywKKyAgICAweDU5RTgsIDB4NURGMiwgMHg1RjFCLCAweDVGNUIsIDB4NjAyMSwgMHg3MjNFLCAweDczRTUsIDB4NzU3MCwgMHg3NUNELAorICAgIDB4NzlGQiwgMHg4MDBDLCAweDgwMzMsIDB4ODA4NCwgMHg4MkUxLCAweDgzNTEsIDB4OENCRCwgMHg4Q0IzLCAweDkwODcsCisgICAgMHg5OEY0LCAweDk5MEMsIDB4NzAzNywgMHg3NkNBLCAweDdGQ0EsIDB4N0ZDQywgMHg3RkZDLCAweDhCMUEsIDB4NEVCQSwKKyAgICAweDRFQzEsIDB4NTIwMywgMHg1MzcwLCAweDU0QkQsIDB4NTZFMCwgMHg1OUZCLCAweDVCQzUsIDB4NUYxNSwgMHg1RkNELAorICAgIDB4NkU2RSwgMHg3RDZBLCAweDgzMzUsIDB4ODY5MywgMHg4QThELCAweDk3NkQsIDB4OTc3NywgMHg0RTAwLCAweDRGNUEsCisgICAgMHg0RjdFLCAweDU4RjksIDB4NjVFNSwgMHg2RUEyLCAweDkwMzgsIDB4OTNCMCwgMHg5OUI5LCAweDRFRkIsIDB4NThFQywKKyAgICAweDU5OEEsIDB4NTlEOSwgMHg2MDQxLCAweDdBMTQsIDB4ODM0RiwgMHg4Q0MzLCAweDUxNjUsIDB4NTM0NCwgMHg0RUNELAorICAgIDB4NTI2OSwgMHg1QjU1LCAweDgyQkYsIDB4NEVENCwgMHg1MjNBLCAweDU0QTgsIDB4NTlDOSwgMHg1OUZGLCAweDVCNTAsCisgICAgMHg1QjU3LCAweDVCNUMsIDB4NjA2MywgMHg2MTQ4LCAweDZFQ0IsIDB4NzA5OSwgMHg3MTZFLCAweDczODYsIDB4NzRGNywKKyAgICAweDc1QjUsIDB4NzhDMSwgMHg3RDJCLCAweDgwMDUsIDB4ODFFQSwgMHg4MzI4LCAweDg1MTcsIDB4ODVDOSwgMHg4QUVFLAorICAgIDB4OENDNywgMHg5NkNDLCAweDRGNUMsIDB4NTJGQSwgMHg1NkJDLCAweDY1QUIsIDB4NjYyOCwgMHg3MDdDLCAweDcwQjgsCisgICAgMHg3MjM1LCAweDdEQkQsIDB4ODI4RCwgMHg5MTRDLCAweDk2QzAsIDB4OUQ3MiwgMHg1QjcxLCAweDY4RTcsIDB4NkI5OCwKKyAgICAweDZGN0EsIDB4NzZERSwgMHg1QzkxLCAweDY2QUIsIDB4NkY1QiwgMHg3QkI0LCAweDdDMkEsIDB4ODgzNiwgMHg5NkRDLAorICAgIDB4NEUwOCwgMHg0RUQ3LCAweDUzMjAsIDB4NTgzNCwgMHg1OEJCLCAweDU4RUYsIDB4NTk2QywgMHg1QzA3LCAweDVFMzMsCisgICAgMHg1RTg0LCAweDVGMzUsIDB4NjM4QywgMHg2NkIyLCAweDY3NTYsIDB4NkExRiwgMHg2QUEzLCAweDZCMEMsIDB4NkYzRiwKKyAgICAweDcyNDYsIDB4NzM1MCwgMHg3NDhCLCAweDdBRTAsIDB4N0NBNywgMHg4MTc4LCAweDgxREYsIDB4ODFFNywgMHg4MzhBLAorICAgIDB4ODQ2QywgMHg4NTIzLCAweDg1OTQsIDB4ODVDRiwgMHg4OERELCAweDhEMTMsIDB4OTFBQywgMHg5NTc3LCAweDk2OUMsCisgICAgMHg1MThELCAweDU0QzksIDB4NTcyOCwgMHg1QkIwLCAweDYyNEQsIDB4Njc1MCwgMHg2ODNELCAweDY4OTMsIDB4NkUzRCwKKyAgICAweDZFRDMsIDB4NzA3RCwgMHg3RTIxLCAweDg4QzEsIDB4OENBMSwgMHg4RjA5LCAweDlGNEIsIDB4OUY0RSwgMHg3MjJELAorICAgIDB4N0I4RiwgMHg4QUNELCAweDkzMUEsIDB4NEY0NywgMHg0RjRFLCAweDUxMzIsIDB4NTQ4MCwgMHg1OUQwLCAweDVFOTUsCisgICAgMHg2MkI1LCAweDY3NzUsIDB4Njk2RSwgMHg2QTE3LCAweDZDQUUsIDB4NkUxQSwgMHg3MkQ5LCAweDczMkEsIDB4NzVCRCwKKyAgICAweDdCQjgsIDB4N0QzNSwgMHg4MkU3LCAweDgzRjksIDB4ODQ1NywgMHg4NUY3LCAweDhBNUIsIDB4OENBRiwgMHg4RTg3LAorICAgIDB4OTAxOSwgMHg5MEI4LCAweDk2Q0UsIDB4OUY1RiwgMHg1MkUzLCAweDU0MEEsIDB4NUFFMSwgMHg1QkMyLCAweDY0NTgsCisgICAgMHg2NTc1LCAweDZFRjQsIDB4NzJDNCwgMHg3Njg0LCAweDdBNEQsIDB4N0IxQiwgMHg3QzRELCAweDdFM0UsIDB4N0ZERiwKKyAgICAweDgzN0IsIDB4OEIyQiwgMHg4Q0NBLCAweDhENjQsIDB4OERFMSwgMHg4RTVGLCAweDhGRUEsIDB4OEZGOSwgMHg5MDY5LAorICAgIDB4OTNEMSwgMHg0RjQzLCAweDRGN0EsIDB4NTBCMywgMHg1MTY4LCAweDUxNzgsIDB4NTI0RCwgMHg1MjZBLCAweDU4NjEsCisgICAgMHg1ODdDLCAweDU5NjAsIDB4NUMwOCwgMHg1QzU1LCAweDVFREIsIDB4NjA5QiwgMHg2MjMwLCAweDY4MTMsIDB4NkJCRiwKKyAgICAweDZDMDgsIDB4NkZCMSwgMHg3MTRFLCAweDc0MjAsIDB4NzUzMCwgMHg3NTM4LCAweDc1NTEsIDB4NzY3MiwgMHg3QjRDLAorICAgIDB4N0I4QiwgMHg3QkFELCAweDdCQzYsIDB4N0U4RiwgMHg4QTZFLCAweDhGM0UsIDB4OEY0OSwgMHg5MjNGLCAweDkyOTMsCisgICAgMHg5MzIyLCAweDk0MkIsIDB4OTZGQiwgMHg5ODVBLCAweDk4NkIsIDB4OTkxRSwgMHg1MjA3LCAweDYyMkEsIDB4NjI5OCwKKyAgICAweDZENTksIDB4NzY2NCwgMHg3QUNBLCAweDdCQzAsIDB4N0Q3NiwgMHg1MzYwLCAweDVDQkUsIDB4NUU5NywgMHg2RjM4LAorICAgIDB4NzBCOSwgMHg3Qzk4LCAweDk3MTEsIDB4OUI4RSwgMHg5RURFLCAweDYzQTUsIDB4NjQ3QSwgMHg4Nzc2LCAweDRFMDEsCisgICAgMHg0RTk1LCAweDRFQUQsIDB4NTA1QywgMHg1MDc1LCAweDU0NDgsIDB4NTlDMywgMHg1QjlBLCAweDVFNDAsIDB4NUVBRCwKKyAgICAweDVFRjcsIDB4NUY4MSwgMHg2MEM1LCAweDYzM0EsIDB4NjUzRiwgMHg2NTc0LCAweDY1Q0MsIDB4NjY3NiwgMHg2Njc4LAorICAgIDB4NjdGRSwgMHg2OTY4LCAweDZBODksIDB4NkI2MywgMHg2QzQwLCAweDZEQzAsIDB4NkRFOCwgMHg2RTFGLCAweDZFNUUsCisgICAgMHg3MDFFLCAweDcwQTEsIDB4NzM4RSwgMHg3M0ZELCAweDc1M0EsIDB4Nzc1QiwgMHg3ODg3LCAweDc5OEUsIDB4N0EwQiwKKyAgICAweDdBN0QsIDB4N0NCRSwgMHg3RDhFLCAweDgyNDcsIDB4OEEwMiwgMHg4QUVBLCAweDhDOUUsIDB4OTEyRCwgMHg5MTRBLAorICAgIDB4OTFEOCwgMHg5MjY2LCAweDkyQ0MsIDB4OTMyMCwgMHg5NzA2LCAweDk3NTYsIDB4OTc1QywgMHg5ODAyLCAweDlGMEUsCisgICAgMHg1MjM2LCAweDUyOTEsIDB4NTU3QywgMHg1ODI0LCAweDVFMUQsIDB4NUYxRiwgMHg2MDhDLCAweDYzRDAsIDB4NjhBRiwKKyAgICAweDZGREYsIDB4Nzk2RCwgMHg3QjJDLCAweDgxQ0QsIDB4ODVCQSwgMHg4OEZELCAweDhBRjgsIDB4OEU0NCwgMHg5MThELAorICAgIDB4OTY2NCwgMHg5NjlCLCAweDk3M0QsIDB4OTg0QywgMHg5RjRBLCAweDRGQ0UsIDB4NTE0NiwgMHg1MUNCLCAweDUyQTksCisgICAgMHg1NjMyLCAweDVGMTQsIDB4NUY2QiwgMHg2M0FBLCAweDY0Q0QsIDB4NjVFOSwgMHg2NjQxLCAweDY2RkEsIDB4NjZGOSwKKyAgICAweDY3MUQsIDB4Njg5RCwgMHg2OEQ3LCAweDY5RkQsIDB4NkYxNSwgMHg2RjZFLCAweDcxNjcsIDB4NzFFNSwgMHg3MjJBLAorICAgIDB4NzRBQSwgMHg3NzNBLCAweDc5NTYsIDB4Nzk1QSwgMHg3OURGLCAweDdBMjAsIDB4N0E5NSwgMHg3Qzk3LCAweDdDREYsCisgICAgMHg3RDQ0LCAweDdFNzAsIDB4ODA4NywgMHg4NUZCLCAweDg2QTQsIDB4OEE1NCwgMHg4QUJGLCAweDhEOTksIDB4OEU4MSwKKyAgICAweDkwMjAsIDB4OTA2RCwgMHg5MUUzLCAweDk2M0IsIDB4OTZENSwgMHg5Q0U1LCAweDY1Q0YsIDB4N0MwNywgMHg4REIzLAorICAgIDB4OTNDMywgMHg1QjU4LCAweDVDMEEsIDB4NTM1MiwgMHg2MkQ5LCAweDczMUQsIDB4NTAyNywgMHg1Qjk3LCAweDVGOUUsCisgICAgMHg2MEIwLCAweDYxNkIsIDB4NjhENSwgMHg2REQ5LCAweDc0MkUsIDB4N0EyRSwgMHg3RDQyLCAweDdEOUMsIDB4N0UzMSwKKyAgICAweDgxNkIsIDB4OEUyQSwgMHg4RTM1LCAweDkzN0UsIDB4OTQxOCwgMHg0RjUwLCAweDU3NTAsIDB4NURFNiwgMHg1RUE3LAorICAgIDB4NjMyQiwgMHg3RjZBLCAweDRFM0IsIDB4NEY0RiwgMHg0RjhGLCAweDUwNUEsIDB4NTlERCwgMHg4MEM0LCAweDU0NkEsCisgICAgMHg1NDY4LCAweDU1RkUsIDB4NTk0RiwgMHg1Qjk5LCAweDVEREUsIDB4NUVEQSwgMHg2NjVELCAweDY3MzEsIDB4NjdGMSwKKyAgICAweDY4MkEsIDB4NkNFOCwgMHg2RDMyLCAweDZFNEEsIDB4NkY4RCwgMHg3MEI3LCAweDczRTAsIDB4NzU4NywgMHg3QzRDLAorICAgIDB4N0QwMiwgMHg3RDJDLCAweDdEQTIsIDB4ODIxRiwgMHg4NkRCLCAweDhBM0IsIDB4OEE4NSwgMHg4RDcwLCAweDhFOEEsCisgICAgMHg4RjMzLCAweDkwMzEsIDB4OTE0RSwgMHg5MTUyLCAweDk0NDQsIDB4OTlEMCwgMHg3QUY5LCAweDdDQTUsIDB4NEZDQSwKKyAgICAweDUxMDEsIDB4NTFDNiwgMHg1N0M4LCAweDVCRUYsIDB4NUNGQiwgMHg2NjU5LCAweDZBM0QsIDB4NkQ1QSwgMHg2RTk2LAorICAgIDB4NkZFQywgMHg3MTBDLCAweDc1NkYsIDB4N0FFMywgMHg4ODIyLCAweDkwMjEsIDB4OTA3NSwgMHg5NkNCLCAweDk5RkYsCisgICAgMHg4MzAxLCAweDRFMkQsIDB4NEVGMiwgMHg4ODQ2LCAweDkxQ0QsIDB4NTM3RCwgMHg2QURCLCAweDY5NkIsIDB4NkM0MSwKKyAgICAweDg0N0EsIDB4NTg5RSwgMHg2MThFLCAweDY2RkUsIDB4NjJFRiwgMHg3MERELCAweDc1MTEsIDB4NzVDNywgMHg3RTUyLAorICAgIDB4ODRCOCwgMHg4QjQ5LCAweDhEMDgsIDB4NEU0QiwgMHg1M0VBLCAweDU0QUIsIDB4NTczMCwgMHg1NzQwLCAweDVGRDcsCisgICAgMHg2MzAxLCAweDYzMDcsIDB4NjQ2RiwgMHg2NTJGLCAweDY1RTgsIDB4NjY3QSwgMHg2NzlELCAweDY3QjMsIDB4NkI2MiwKKyAgICAweDZDNjAsIDB4NkM5QSwgMHg2RjJDLCAweDc3RTUsIDB4NzgyNSwgMHg3OTQ5LCAweDc5NTcsIDB4N0QxOSwgMHg4MEEyLAorICAgIDB4ODEwMiwgMHg4MUYzLCAweDgyOUQsIDB4ODJCNywgMHg4NzE4LCAweDhBOEMsIDB4OEQwNCwgMHg4REJFLCAweDkwNzIsCisgICAgMHg3NkY0LCAweDdBMTksIDB4N0EzNywgMHg3RTU0LCAweDgwNzcsIDB4NTUwNywgMHg1NUQ0LCAweDU4NzUsIDB4NjMyRiwKKyAgICAweDY0MjIsIDB4NjY0OSwgMHg2NjRCLCAweDY4NkQsIDB4Njk5QiwgMHg2Qjg0LCAweDZEMjUsIDB4NkVCMSwgMHg3M0NELAorICAgIDB4NzQ2OCwgMHg3NEExLCAweDc1NUIsIDB4NzVCOSwgMHg3NkUxLCAweDc3MUUsIDB4Nzc4QiwgMHg3OUU2LCAweDdFMDksCisgICAgMHg3RTFELCAweDgxRkIsIDB4ODUyRiwgMHg4ODk3LCAweDhBM0EsIDB4OENEMSwgMHg4RUVCLCAweDhGQjAsIDB4OTAzMiwKKyAgICAweDkzQUQsIDB4OTY2MywgMHg5NjczLCAweDk3MDcsIDB4NEY4NCwgMHg1M0YxLCAweDU5RUEsIDB4NUFDOSwgMHg1RTE5LAorICAgIDB4Njg0RSwgMHg3NEM2LCAweDc1QkUsIDB4NzlFOSwgMHg3QTkyLCAweDgxQTMsIDB4ODZFRCwgMHg4Q0VBLCAweDhEQ0MsCisgICAgMHg4RkVELCAweDY1OUYsIDB4NjcxNSwgMHg1N0Y3LCAweDZGNTcsIDB4N0RERCwgMHg4RjJGLCAweDkzRjYsIDB4OTZDNiwKKyAgICAweDVGQjUsIDB4NjFGMiwgMHg2Rjg0LCAweDRFMTQsIDB4NEY5OCwgMHg1MDFGLCAweDUzQzksIDB4NTVERiwgMHg1RDZGLAorICAgIDB4NURFRSwgMHg2QjIxLCAweDZCNjQsIDB4NzhDQiwgMHg3QjlBLCAweDhFNDksIDB4OEVDQSwgMHg5MDZFLCAweDYzNDksCisgICAgMHg2NDNFLCAweDc3NDAsIDB4N0E4NCwgMHg5MzJGLCAweDk0N0YsIDB4OUY2QSwgMHg2NEIwLCAweDZGQUYsIDB4NzFFNiwKKyAgICAweDc0QTgsIDB4NzREQSwgMHg3QUM0LCAweDdDMTIsIDB4N0U4MiwgMHg3Q0IyLCAweDdFOTgsIDB4OEI5QSwgMHg4RDBBLAorICAgIDB4OTQ3RCwgMHg5OTEwLCAweDk5NEMsIDB4NTIzOSwgMHg1QkRGLCAweDY0RTYsIDB4NjcyRCwgMHg3RDJFLCAweDUwRUQsCisgICAgMHg1M0MzLCAweDU4NzksIDB4NjE1OCwgMHg2MTU5LCAweDYxRkEsIDB4NjVBQywgMHg3QUQ5LCAweDhCOTIsIDB4OEI5NiwKKyAgICAweDUwMDksIDB4NTAyMSwgMHg1Mjc1LCAweDU1MzEsIDB4NUEzQywgMHg1RUUwLCAweDVGNzAsIDB4NjEzNCwgMHg2NTVFLAorICAgIDB4NjYwQywgMHg2NjM2LCAweDY2QTIsIDB4NjlDRCwgMHg2RUM0LCAweDZGMzIsIDB4NzMxNiwgMHg3NjIxLCAweDdBOTMsCisgICAgMHg4MTM5LCAweDgyNTksIDB4ODNENiwgMHg4NEJDLCAweDUwQjUsIDB4NTdGMCwgMHg1QkMwLCAweDVCRTgsIDB4NUY2OSwKKyAgICAweDYzQTEsIDB4NzgyNiwgMHg3REI1LCAweDgzREMsIDB4ODUyMSwgMHg5MUM3LCAweDkxRjUsIDB4NTE4QSwgMHg2N0Y1LAorICAgIDB4N0I1NiwgMHg4Q0FDLCAweDUxQzQsIDB4NTlCQiwgMHg2MEJELCAweDg2NTUsIDB4NTAxQywgMHg1MjU0LCAweDVDM0EsCisgICAgMHg2MTdELCAweDYyMUEsIDB4NjJEMywgMHg2NEYyLCAweDY1QTUsIDB4NkVDQywgMHg3NjIwLCAweDgxMEEsIDB4OEU2MCwKKyAgICAweDk2NUYsIDB4OTZCQiwgMHg0RURGLCAweDUzNDMsIDB4NTU5OCwgMHg1OTI5LCAweDVEREQsIDB4NjRDNSwgMHg2Q0M5LAorICAgIDB4NkRGQSwgMHg3Mzk0LCAweDdBN0YsIDB4ODIxQiwgMHg4NUE2LCAweDhDRTQsIDB4OEUxMCwgMHg5MDc3LCAweDkxRTcsCisgICAgMHg5NUUxLCAweDk2MjEsIDB4OTdDNiwgMHg1MUY4LCAweDU0RjIsIDB4NTU4NiwgMHg1RkI5LCAweDY0QTQsIDB4NkY4OCwKKyAgICAweDdEQjQsIDB4OEYxRiwgMHg4RjRELCAweDk0MzUsIDB4NTBDOSwgMHg1QzE2LCAweDZDQkUsIDB4NkRGQiwgMHg3NTFCLAorICAgIDB4NzdCQiwgMHg3QzNELCAweDdDNjQsIDB4OEE3OSwgMHg4QUMyLCAweDU4MUUsIDB4NTlCRSwgMHg1RTE2LCAweDYzNzcsCisgICAgMHg3MjUyLCAweDc1OEEsIDB4Nzc2QiwgMHg4QURDLCAweDhDQkMsIDB4OEYxMiwgMHg1RUYzLCAweDY2NzQsIDB4NkRGOCwKKyAgICAweDgwN0QsIDB4ODNDMSwgMHg4QUNCLCAweDk3NTEsIDB4OUJENiwgMHg1MjQzLCAweDY2RkYsIDB4NkQ5NSwgMHg2RUVGLAorICAgIDB4N0RFMCwgMHg4QUU2LCAweDkwMkUsIDB4OTA1RSwgMHg5QUQ0LCAweDUyMUQsIDB4NTI3RiwgMHg1NEU4LCAweDYxOTQsCisgICAgMHg2Mjg0LCAweDYyREIsIDB4NjhBMiwgMHg2OTEyLCAweDY5NUEsIDB4NkEzNSwgMHg3MDkyLCAweDcxMjYsIDB4Nzg1RCwKKyAgICAweDc5MDEsIDB4NzkwRSwgMHg3OUQyLCAweDdBMEQsIDB4ODA5NiwgMHg4Mjc4LCAweDgyRDUsIDB4ODM0OSwgMHg4NTQ5LAorICAgIDB4OEM4MiwgMHg4RDg1LCAweDkxNjIsIDB4OTE4QiwgMHg5MUFFLCAweDRGQzMsIDB4NTZEMSwgMHg3MUVELCAweDc3RDcsCisgICAgMHg4NzAwLCAweDg5RjgsIDB4NUJGOCwgMHg1RkQ2LCAweDY3NTEsIDB4OTBBOCwgMHg1M0UyLCAweDU4NUEsIDB4NUJGNSwKKyAgICAweDYwQTQsIDB4NjE4MSwgMHg2NDYwLCAweDdFM0QsIDB4ODA3MCwgMHg4NTI1LCAweDkyODMsIDB4NjRBRSwgMHg1MEFDLAorICAgIDB4NUQxNCwgMHg2NzAwLCAweDU4OUMsIDB4NjJCRCwgMHg2M0E4LCAweDY5MEUsIDB4Njk3OCwgMHg2QTFFLCAweDZFNkIsCisgICAgMHg3NkJBLCAweDc5Q0IsIDB4ODJCQiwgMHg4NDI5LCAweDhBQ0YsIDB4OERBOCwgMHg4RkZELCAweDkxMTIsIDB4OTE0QiwKKyAgICAweDkxOUMsIDB4OTMxMCwgMHg5MzE4LCAweDkzOUEsIDB4OTZEQiwgMHg5QTM2LCAweDlDMEQsIDB4NEUxMSwgMHg3NTVDLAorICAgIDB4Nzk1RCwgMHg3QUZBLCAweDdCNTEsIDB4N0JDOSwgMHg3RTJFLCAweDg0QzQsIDB4OEU1OSwgMHg4RTc0LCAweDhFRjgsCisgICAgMHg5MDEwLCAweDY2MjUsIDB4NjkzRiwgMHg3NDQzLCAweDUxRkEsIDB4NjcyRSwgMHg5RURDLCAweDUxNDUsIDB4NUZFMCwKKyAgICAweDZDOTYsIDB4ODdGMiwgMHg4ODVELCAweDg4NzcsIDB4NjBCNCwgMHg4MUI1LCAweDg0MDMsIDB4OEQwNSwgMHg1M0Q2LAorICAgIDB4NTQzOSwgMHg1NjM0LCAweDVBMzYsIDB4NUMzMSwgMHg3MDhBLCAweDdGRTAsIDB4ODA1QSwgMHg4MTA2LCAweDgxRUQsCisgICAgMHg4REEzLCAweDkxODksIDB4OUE1RiwgMHg5REYyLCAweDUwNzQsIDB4NEVDNCwgMHg1M0EwLCAweDYwRkIsIDB4NkUyQywKKyAgICAweDVDNjQsIDB4NEY4OCwgMHg1MDI0LCAweDU1RTQsIDB4NUNEOSwgMHg1RTVGLCAweDYwNjUsIDB4Njg5NCwgMHg2Q0JCLAorICAgIDB4NkRDNCwgMHg3MUJFLCAweDc1RDQsIDB4NzVGNCwgMHg3NjYxLCAweDdBMUEsIDB4N0E0OSwgMHg3REM3LCAweDdERkIsCisgICAgMHg3RjZFLCAweDgxRjQsIDB4ODZBOSwgMHg4RjFDLCAweDk2QzksIDB4OTlCMywgMHg5RjUyLCAweDUyNDcsIDB4NTJDNSwKKyAgICAweDk4RUQsIDB4ODlBQSwgMHg0RTAzLCAweDY3RDIsIDB4NkYwNiwgMHg0RkI1LCAweDVCRTIsIDB4Njc5NSwgMHg2Qzg4LAorICAgIDB4NkQ3OCwgMHg3NDFCLCAweDc4MjcsIDB4OTFERCwgMHg5MzdDLCAweDg3QzQsIDB4NzlFNCwgMHg3QTMxLCAweDVGRUIsCisgICAgMHg0RUQ2LCAweDU0QTQsIDB4NTUzRSwgMHg1OEFFLCAweDU5QTUsIDB4NjBGMCwgMHg2MjUzLCAweDYyRDYsIDB4NjczNiwKKyAgICAweDY5NTUsIDB4ODIzNSwgMHg5NjQwLCAweDk5QjEsIDB4OTlERCwgMHg1MDJDLCAweDUzNTMsIDB4NTU0NCwgMHg1NzdDLAorICAgIDB4NjI1OCwgMHg2NEUyLCAweDY2NkIsIDB4NjdERCwgMHg2RkMxLCAweDZGRUYsIDB4NzQyMiwgMHg3NDM4LCAweDhBMTcsCisgICAgMHg5NDM4LCAweDU0NTEsIDB4NTYwNiwgMHg1NzY2LCAweDVGNDgsIDB4NjE5QSwgMHg2QjRFLCAweDcwNTgsIDB4NzBBRCwKKyAgICAweDdEQkIsIDB4OEE5NSwgMHg1OTZBLCAweDgxMkIsIDB4NjNBMiwgMHg3NzA4LCAweDgwM0QsIDB4OENBQSwgMHg1ODU0LAorICAgIDB4NjQyRCwgMHg2OUJCLCAweDVCOTUsIDB4NUUxMSwgMHg2RTZGLCAweDg1NjksIDB4NTE0QywgMHg1M0YwLCAweDU5MkEsCisgICAgMHg2MDIwLCAweDYxNEIsIDB4NkI4NiwgMHg2QzcwLCAweDZDRjAsIDB4N0IxRSwgMHg4MENFLCAweDgyRDQsIDB4OERDNiwKKyAgICAweDkwQjAsIDB4OThCMSwgMHg2NEM3LCAweDZGQTQsIDB4NjQ5MSwgMHg2NTA0LCAweDUxNEUsIDB4NTQxMCwgMHg1NzFGLAorICAgIDB4OEEwRSwgMHg2MTVGLCAweDY4NzYsIDB4NzVEQiwgMHg3QjUyLCAweDdENzEsIDB4OTAxQSwgMHg1ODA2LCAweDY5Q0MsCisgICAgMHg4MTdGLCAweDg5MkEsIDB4OTAwMCwgMHg5ODM5LCAweDUwNzgsIDB4NTk1NywgMHg1OUFDLCAweDYyOTUsIDB4OTAwRiwKKyAgICAweDlCMkEsIDB4NjE1RCwgMHg3Mjc5LCAweDk1RDYsIDB4NTc2MSwgMHg1QTQ2LCAweDVERjQsIDB4NjI4QSwgMHg2NEFELAorICAgIDB4NjRGQSwgMHg2Nzc3LCAweDZDRTIsIDB4NkQzRSwgMHg3MjJDLCAweDc0MzYsIDB4NzgzNCwgMHg3Rjc3LCAweDgyQUQsCisgICAgMHg4RERCLCAweDk4MTcsIDB4NTIyNCwgMHg1NzQyLCAweDY3N0YsIDB4NzI0OCwgMHg3NEUzLCAweDhDQTksIDB4OEZBNiwKKyAgICAweDkyMTEsIDB4OTYyQSwgMHg1MTZCLCAweDUzRUQsIDB4NjM0QywgMHg0RjY5LCAweDU1MDQsIDB4NjA5NiwgMHg2NTU3LAorICAgIDB4NkM5QiwgMHg2RDdGLCAweDcyNEMsIDB4NzJGRCwgMHg3QTE3LCAweDg5ODcsIDB4OEM5RCwgMHg1RjZELCAweDZGOEUsCisgICAgMHg3MEY5LCAweDgxQTgsIDB4NjEwRSwgMHg0RkJGLCAweDUwNEYsIDB4NjI0MSwgMHg3MjQ3LCAweDdCQzcsIDB4N0RFOCwKKyAgICAweDdGRTksIDB4OTA0RCwgMHg5N0FELCAweDlBMTksIDB4OENCNiwgMHg1NzZBLCAweDVFNzMsIDB4NjdCMCwgMHg4NDBELAorICAgIDB4OEE1NSwgMHg1NDIwLCAweDVCMTYsIDB4NUU2MywgMHg1RUUyLCAweDVGMEEsIDB4NjU4MywgMHg4MEJBLCAweDg1M0QsCisgICAgMHg5NTg5LCAweDk2NUIsIDB4NEY0OCwgMHg1MzA1LCAweDUzMEQsIDB4NTMwRiwgMHg1NDg2LCAweDU0RkEsIDB4NTcwMywKKyAgICAweDVFMDMsIDB4NjAxNiwgMHg2MjlCLCAweDYyQjEsIDB4NjM1NSwgMHg2Q0UxLCAweDZENjYsIDB4NzVCMSwgMHg3ODMyLAorICAgIDB4ODBERSwgMHg4MTJGLCAweDgyREUsIDB4ODQ2MSwgMHg4NEIyLCAweDg4OEQsIDB4ODkxMiwgMHg5MDBCLCAweDkyRUEsCisgICAgMHg5OEZELCAweDlCOTEsIDB4NUU0NSwgMHg2NkI0LCAweDY2REQsIDB4NzAxMSwgMHg3MjA2LCAweDRGRjUsIDB4NTI3RCwKKyAgICAweDVGNkEsIDB4NjE1MywgMHg2NzUzLCAweDZBMTksIDB4NkYwMiwgMHg3NEUyLCAweDc5NjgsIDB4ODg2OCwgMHg4Qzc5LAorICAgIDB4OThDNywgMHg5OEM0LCAweDlBNDMsIDB4NTRDMSwgMHg3QTFGLCAweDY5NTMsIDB4OEFGNywgMHg4QzRBLCAweDk4QTgsCisgICAgMHg5OUFFLCAweDVGN0MsIDB4NjJBQiwgMHg3NUIyLCAweDc2QUUsIDB4ODhBQiwgMHg5MDdGLCAweDk2NDIsIDB4NTMzOSwKKyAgICAweDVGM0MsIDB4NUZDNSwgMHg2Q0NDLCAweDczQ0MsIDB4NzU2MiwgMHg3NThCLCAweDdCNDYsIDB4ODJGRSwgMHg5OTlELAorICAgIDB4NEU0RiwgMHg5MDNDLCAweDRFMEIsIDB4NEY1NSwgMHg1M0E2LCAweDU5MEYsIDB4NUVDOCwgMHg2NjMwLCAweDZDQjMsCisgICAgMHg3NDU1LCAweDgzNzcsIDB4ODc2NiwgMHg4Q0MwLCAweDkwNTAsIDB4OTcxRSwgMHg5QzE1LCAweDU4RDEsIDB4NUI3OCwKKyAgICAweDg2NTAsIDB4OEIxNCwgMHg5REI0LCAweDVCRDIsIDB4NjA2OCwgMHg2MDhELCAweDY1RjEsIDB4NkM1NywgMHg2RjIyLAorICAgIDB4NkZBMywgMHg3MDFBLCAweDdGNTUsIDB4N0ZGMCwgMHg5NTkxLCAweDk1OTIsIDB4OTY1MCwgMHg5N0QzLCAweDUyNzIsCisgICAgMHg4RjQ0LCAweDUxRkQsIDB4NTQyQiwgMHg1NEI4LCAweDU1NjMsIDB4NTU4QSwgMHg2QUJCLCAweDZEQjUsIDB4N0REOCwKKyAgICAweDgyNjYsIDB4OTI5QywgMHg5Njc3LCAweDlFNzksIDB4NTQwOCwgMHg1NEM4LCAweDc2RDIsIDB4ODZFNCwgMHg5NUE0LAorICAgIDB4OTVENCwgMHg5NjVDLCAweDRFQTIsIDB4NEYwOSwgMHg1OUVFLCAweDVBRTYsIDB4NURGNywgMHg2MDUyLCAweDYyOTcsCisgICAgMHg2NzZELCAweDY4NDEsIDB4NkM4NiwgMHg2RTJGLCAweDdGMzgsIDB4ODA5QiwgMHg4MjJBLCAweDk4MDUsIDB4NEVBNSwKKyAgICAweDUwNTUsIDB4NTRCMywgMHg1NzkzLCAweDU5NUEsIDB4NUI2OSwgMHg1QkIzLCAweDYxQzgsIDB4Njk3NywgMHg2RDc3LAorICAgIDB4NzAyMywgMHg4N0Y5LCAweDg5RTMsIDB4OEE3MiwgMHg4QUU3LCAweDkwODIsIDB4OTlFRCwgMHg5QUI4LCAweDUyQkUsCisgICAgMHg2ODM4LCAweDUwMTYsIDB4NUU3OCwgMHg2NzRGLCAweDgzNDcsIDB4ODg0QywgMHg0RUFCLCAweDU0MTEsIDB4NTZBRSwKKyAgICAweDczRTYsIDB4OTExNSwgMHg5N0ZGLCAweDk5MDksIDB4OTk1NywgMHg5OTk5LCAweDU2NTMsIDB4NTg5RiwgMHg4NjVCLAorICAgIDB4OEEzMSwgMHg2MUIyLCAweDZBRjYsIDB4NzM3QiwgMHg4RUQyLCAweDZCNDcsIDB4OTZBQSwgMHg5QTU3LCAweDU5NTUsCisgICAgMHg3MjAwLCAweDhENkIsIDB4OTc2OSwgMHg0RkQ0LCAweDVDRjQsIDB4NUYyNiwgMHg2MUY4LCAweDY2NUIsIDB4NkNFQiwKKyAgICAweDcwQUIsIDB4NzM4NCwgMHg3M0I5LCAweDczRkUsIDB4NzcyOSwgMHg3NzRELCAweDdENDMsIDB4N0Q2MiwgMHg3RTIzLAorICAgIDB4ODIzNywgMHg4ODUyLCAweDhDRTIsIDB4OTI0OSwgMHg5ODZGLCAweDVCNTEsIDB4N0E3NCwgMHg4ODQwLCAweDk4MDEsCisgICAgMHg1QUNDLCAweDRGRTAsIDB4NTM1NCwgMHg1OTNFLCAweDVDRkQsIDB4NjMzRSwgMHg2RDc5LCAweDcyRjksIDB4ODEwNSwKKyAgICAweDgxMDcsIDB4ODNBMiwgMHg5MkNGLCAweDk4MzAsIDB4NEVBOCwgMHg1MTQ0LCAweDUyMTEsIDB4NTc4QiwgMHg1RjYyLAorICAgIDB4NkNDMiwgMHg2RUNFLCAweDcwMDUsIDB4NzA1MCwgMHg3MEFGLCAweDcxOTIsIDB4NzNFOSwgMHg3NDY5LCAweDgzNEEsCisgICAgMHg4N0EyLCAweDg4NjEsIDB4OTAwOCwgMHg5MEEyLCAweDkzQTMsIDB4OTlBOCwgMHg1MTZFLCAweDVGNTcsIDB4NjBFMCwKKyAgICAweDYxNjcsIDB4NjZCMywgMHg4NTU5LCAweDhFNEEsIDB4OTFBRiwgMHg5NzhCLCAweDRFNEUsIDB4NEU5MiwgMHg1NDdDLAorICAgIDB4NThENSwgMHg1OEZBLCAweDU5N0QsIDB4NUNCNSwgMHg1RjI3LCAweDYyMzYsIDB4NjI0OCwgMHg2NjBBLCAweDY2NjcsCisgICAgMHg2QkVCLCAweDZENjksIDB4NkRDRiwgMHg2RTU2LCAweDZFRjgsIDB4NkY5NCwgMHg2RkUwLCAweDZGRTksIDB4NzA1RCwKKyAgICAweDcyRDAsIDB4NzQyNSwgMHg3NDVBLCAweDc0RTAsIDB4NzY5MywgMHg3OTVDLCAweDdDQ0EsIDB4N0UxRSwgMHg4MEUxLAorICAgIDB4ODJBNiwgMHg4NDZCLCAweDg0QkYsIDB4ODY0RSwgMHg4NjVGLCAweDg3NzQsIDB4OEI3NywgMHg4QzZBLCAweDkzQUMsCisgICAgMHg5ODAwLCAweDk4NjUsIDB4NjBEMSwgMHg2MjE2LCAweDkxNzcsIDB4NUE1QSwgMHg2NjBGLCAweDZERjcsIDB4NkUzRSwKKyAgICAweDc0M0YsIDB4OUI0MiwgMHg1RkZELCAweDYwREEsIDB4N0IwRiwgMHg1NEM0LCAweDVGMTgsIDB4NkM1RSwgMHg2Q0QzLAorICAgIDB4NkQyQSwgMHg3MEQ4LCAweDdEMDUsIDB4ODY3OSwgMHg4QTBDLCAweDlEM0IsIDB4NTMxNiwgMHg1NDhDLCAweDVCMDUsCisgICAgMHg2QTNBLCAweDcwNkIsIDB4NzU3NSwgMHg3OThELCAweDc5QkUsIDB4ODJCMSwgMHg4M0VGLCAweDhBNzEsIDB4OEI0MSwKKyAgICAweDhDQTgsIDB4OTc3NCwgMHg2NEY0LCAweDY1MkIsIDB4NzhCQSwgMHg3OEJCLCAweDdBNkIsIDB4NEUzOCwgMHg1NTlBLAorICAgIDB4NTk1MCwgMHg1QkE2LCAweDVFN0IsIDB4NjBBMywgMHg2M0RCLCAweDZCNjEsIDB4NjY2NSwgMHg2ODUzLCAweDZFMTksCisgICAgMHg3MTY1LCAweDc0QjAsIDB4N0QwOCwgMHg5MDg0LCAweDlBNjksIDB4OUMyNSwgMHg2RDNCLCAweDZFRDEsIDB4NzMzRSwKKyAgICAweDhDNDEsIDB4OTVDQSwgMHg1MUYwLCAweDVFNEMsIDB4NUZBOCwgMHg2MDRELCAweDYwRjYsIDB4NjEzMCwgMHg2MTRDLAorICAgIDB4NjY0MywgMHg2NjQ0LCAweDY5QTUsIDB4NkNDMSwgMHg2RTVGLCAweDZFQzksIDB4NkY2MiwgMHg3MTRDLCAweDc0OUMsCisgICAgMHg3Njg3LCAweDdCQzEsIDB4N0MyNywgMHg4MzUyLCAweDg3NTcsIDB4OTA1MSwgMHg5NjhELCAweDlFQzMsIDB4NTMyRiwKKyAgICAweDU2REUsIDB4NUVGQiwgMHg1RjhBLCAweDYwNjIsIDB4NjA5NCwgMHg2MUY3LCAweDY2NjYsIDB4NjcwMywgMHg2QTlDLAorICAgIDB4NkRFRSwgMHg2RkFFLCAweDcwNzAsIDB4NzM2QSwgMHg3RTZBLCAweDgxQkUsIDB4ODMzNCwgMHg4NkQ0LCAweDhBQTgsCisgICAgMHg4Q0M0LCAweDUyODMsIDB4NzM3MiwgMHg1Qjk2LCAweDZBNkIsIDB4OTQwNCwgMHg1NEVFLCAweDU2ODYsIDB4NUI1RCwKKyAgICAweDY1NDgsIDB4NjU4NSwgMHg2NkM5LCAweDY4OUYsIDB4NkQ4RCwgMHg2REM2LCAweDcyM0IsIDB4ODBCNCwgMHg5MTc1LAorICAgIDB4OUE0RCwgMHg0RkFGLCAweDUwMTksIDB4NTM5QSwgMHg1NDBFLCAweDU0M0MsIDB4NTU4OSwgMHg1NUM1LCAweDVFM0YsCisgICAgMHg1RjhDLCAweDY3M0QsIDB4NzE2NiwgMHg3M0RELCAweDkwMDUsIDB4NTJEQiwgMHg1MkYzLCAweDU4NjQsIDB4NThDRSwKKyAgICAweDcxMDQsIDB4NzE4RiwgMHg3MUZCLCAweDg1QjAsIDB4OEExMywgMHg2Njg4LCAweDg1QTgsIDB4NTVBNywgMHg2Njg0LAorICAgIDB4NzE0QSwgMHg4NDMxLCAweDUzNDksIDB4NTU5OSwgMHg2QkMxLCAweDVGNTksIDB4NUZCRCwgMHg2M0VFLCAweDY2ODksCisgICAgMHg3MTQ3LCAweDhBRjEsIDB4OEYxRCwgMHg5RUJFLCAweDRGMTEsIDB4NjQzQSwgMHg3MENCLCAweDc1NjYsIDB4ODY2NywKKyAgICAweDYwNjQsIDB4OEI0RSwgMHg5REY4LCAweDUxNDcsIDB4NTFGNiwgMHg1MzA4LCAweDZEMzYsIDB4ODBGOCwgMHg5RUQxLAorICAgIDB4NjYxNSwgMHg2QjIzLCAweDcwOTgsIDB4NzVENSwgMHg1NDAzLCAweDVDNzksIDB4N0QwNywgMHg4QTE2LCAweDZCMjAsCisgICAgMHg2QjNELCAweDZCNDYsIDB4NTQzOCwgMHg2MDcwLCAweDZEM0QsIDB4N0ZENSwgMHg4MjA4LCAweDUwRDYsIDB4NTFERSwKKyAgICAweDU1OUMsIDB4NTY2QiwgMHg1NkNELCAweDU5RUMsIDB4NUIwOSwgMHg1RTBDLCAweDYxOTksIDB4NjE5OCwgMHg2MjMxLAorICAgIDB4NjY1RSwgMHg2NkU2LCAweDcxOTksIDB4NzFCOSwgMHg3MUJBLCAweDcyQTcsIDB4NzlBNywgMHg3QTAwLCAweDdGQjIsCisgICAgMHg4QTcwLCAweDMwMDEsIDB4MzAwMiwgMHgyMDI1LCAweDAwQUQsIDB4MjAxNSwgMHgyMjI1LCAweEZGNUUsIDB4MzAxNCwKKyAgICAweDMwMTUsIDB4MzAwOCwgMHgzMDA5LCAweDMwMEEsIDB4MzAwQiwgMHgzMDBDLCAweDMwMEQsIDB4MzAwRSwgMHgzMDBGLAorICAgIDB4MzAxMCwgMHgzMDExLCAweDMwMTMsIDB4RkYwMSwgMHhGRjA4LCAweEZGMDksIDB4RkYwQywgMHhGRjBFLCAweEZGMUEsCisgICAgMHhGRjFCLCAweEZGMUMsIDB4RkYxRCwgMHhGRjFFLCAweEZGMUYsIDB4RkYzQiwgMHhGRjNELCAweEZGM0YsIDB4RkY1QiwKKyAgICAweEZGNUMsIDB4RkY1RCwgMHhGRjVFLCAweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LAorICAgIDB4MDAyNiwgMHgwMDI3LCAweDAwMjgsIDB4MDAyOSwgMHgwMDJBLCAweDAwMkIsIDB4MDAyQywgMHgwMDJELCAweDAwMkUsCisgICAgMHgwMDJGLCAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKyAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDNBLCAweDAwM0IsIDB4MDAzQywgMHgwMDNELCAweDAwM0UsIDB4MDAzRiwgMHgwMDQwLAorICAgIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksCisgICAgMHgwMDRBLCAweDAwNEIsIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwKKyAgICAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgwMDVCLAorICAgIDB4MDA1QywgMHgwMDVELCAweDAwNUUsIDB4MDA1RiwgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsCisgICAgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwKKyAgICAweDAwNkUsIDB4MDA2RiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LAorICAgIDB4MDA3NywgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDdCLCAweDAwN0MsIDB4MDA3RCwgMHgyMDNFLCAweDAwN0UsCisgICAgMHgwMDVDLCAweDIzMUMsIDB4MjMxRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDMwMEUsIDB4MzAwRiwKKyAgICAweDMwMEEsIDB4MzAwQiwgMHgzMDA4LCAweDMwMDksIDB4MDAyOCwgMHgwMDI5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDI4LAorICAgIDB4MDAyOSwgMHgwMDI4LCAweDAwMjksIDB4MDAwMCwgMHgwMDAwLCAweDAwMjgsIDB4MDAyOSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgzMDE2LCAweDMwMTcsIDB4MzAxNiwgMHgzMDE3LCAweDMwMTgsIDB4MzAxOSwgMHgwMDVCLCAweDAwNUQsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MjYzRSwgMHgyNjNELCAweDIwMjEsIDB4MjAyMSwgMHgyMDIwLCAweDIwMjEsIDB4MDAwMCwgMHgyMjE3LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDIwMUYsIDB4MjAxQiwgMHgwMkQ2LCAweDAyRDcsIDB4MDBENywgMHgyMjFFLCAweDAwMDAsCisgICAgMHgwMEIxLCAweDIyMTMsIDB4MDAzRSwgMHgwMDNDLCAweDAwM0QsIDB4MjI2MCwgMHgyMDdELCAweDIwN0UsIDB4MDA3QiwKKyAgICAweDAwN0QsIDB4MDAwMCwgMHgwMDAwLCAweDIyMjksIDB4MjIyQSwgMHgyMjgyLCAweDIyMDgsIDB4MDNBMywgMHgwMDIxLAorICAgIDB4MDAwMCwgMHgzMDIxLCAweDMwMjIsIDB4MzAyMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg0RTAzLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDUzNDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMjcsIDB4MzAxNCwgMHgzMDE1LCAweDAwMkEsIDB4MDAwMCwKKyAgICAweDIyMTcsIDB4MDAyQSwgMHhDRENELCAweDMwMDEsIDB4MzAwMiwgMHgwMDI4LCAweDAwMjksIDB4MDAyOCwgMHgwMDI5LAorICAgIDB4MDAyOCwgMHgwMDI5LCAweDMwMTYsIDB4MzAxNywgMHgzMDEwLCAweDMwMTEsIDB4MDAwMCwgMHgwMDAwLCAweDIwREUsCisgICAgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MDA1RCwKKyAgICAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELAorICAgIDB4MDA1RCwgMHgwMEI2LCAweDAwMDAsIDB4MDAwMCwgMHgyMkVGLCAweDIyMzcsIDB4MjBERSwgMHgyMERFLCAweDIwREUsCisgICAgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwKKyAgICAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgyNzhBLAorICAgIDB4Mjc4QiwgMHgyNzhDLCAweDI3OEQsIDB4Mjc4RSwgMHgyNzhGLCAweDI3OTAsIDB4Mjc5MSwgMHgyNzkyLCAweDI3OTMsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAorICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksCisgICAgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwKKyAgICAweDI0QjYsIDB4MjRCNywgMHgyNEI4LCAweDI0QjksIDB4MjRCQSwgMHgyNEJCLCAweDI0QkMsIDB4MjRCRCwgMHgyNEJFLAorICAgIDB4MjRCRiwgMHgyNEMwLCAweDI0QzEsIDB4MjRDMiwgMHgyNEMzLCAweDI0QzQsIDB4MjRDNSwgMHgyNEM2LCAweDI0QzcsCisgICAgMHgyNEM4LCAweDI0QzksIDB4MjRDQSwgMHgyNENCLCAweDI0Q0MsIDB4MjRDRCwgMHgyNENFLCAweDI0Q0YsIDB4MjBERSwKKyAgICAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgwMDVELAorICAgIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsCisgICAgMHgwMDVELCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwKKyAgICAweDIwREUsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELAorICAgIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIyQ0YsIDB4MjJDRSwgMHgyMkNGLAorICAgIDB4MjJDRSwgMHgyMjgwLCAweDIyODEsIDB4MjI3MCwgMHgyMjcxLCAweDIyNzIsIDB4MjI3MywgMHgwMDAwLCAweDIyOEEsCisgICAgMHgwMDAwLCAweDIyOEIsIDB4MjI3NiwgMHgyMjc3LCAweDIyNzksIDB4MjJEQSwgMHgyMkRCLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgyMjIxLCAweDIyNDUsIDB4MjI0MywgMHgyMjQ4LCAweDAwMDAsIDB4MjJBNCwgMHgyMkFCLAorICAgIDB4MDAwMCwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsCisgICAgMHgyMERFLCAweDIwREUsIDB4MDAwMCwgMHgyNDYwLCAweDI0NjEsIDB4MjQ2MiwgMHgyNDYzLCAweDI0NjQsIDB4MjQ2NSwKKyAgICAweDI0NjYsIDB4MjQ2NywgMHgyNDY4LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAorICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksCisgICAgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwKKyAgICAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAorICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksCisgICAgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwKKyAgICAweDAwMjksIDB4MDAyMSwgMHgwMEIwLCAweDAwMjcsIDB4MDAyMiwgMHgyMDM0LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAorICAgIDB4MDAyOSwgMHgwMDAwLCAweDAwMDAsIDB4MjAyMCwgMHgyMDIwLCAweDIwMjEsIDB4MjAyMCwgMHgwMEE3LCAweDAwMjMsCisgICAgMHgwMDJBLCAweDAwMkEsIDB4MDAwMCwgMHgwMDAwLCAweDIwNDIsIDB4MDAyQSwgMHgwMDAwLCAweDAwMDAsIDB4MjA0MiwKKyAgICAweDAwMkEsIDB4MDAwMCwgMHgwMDAwLCAweDIwMjIsIDB4MjBERiwgMHgyMERGLCAweDAwMDAsIDB4MjBERiwgMHgzMDA4LAorICAgIDB4MzAwOSwgMHgzMDBBLCAweDMwMEIsIDB4MjYxQywgMHgyNjFFLCAweDAwMDAsIDB4MDAwMCwgMHgyMERFLCAweDAwMDAsCisgICAgMHgyMERFLCAweDIwREUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMERELCAweDIwREQsIDB4MjcxQSwKKyAgICAweDI3MTYsIDB4MDAwMCwgMHgyNUVGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyNUNDLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwQTksIDB4MDAwMCwgMHgwMDAwLCAweDI2MkYsIDB4MDAwMCwgMHgyNjJGLAorICAgIDB4MjYyRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzMDIwLCAweDAwMDAsIDB4Mjc3NiwgMHgyNzc3LCAweDI3NzgsCisgICAgMHgyNzc5LCAweDI3N0EsIDB4Mjc3QiwgMHgyNzdDLCAweDI3N0QsIDB4Mjc3RSwgMHgyNzdGLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDI5LAorICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDI2NDIsIDB4MjJBOSwgMHgzMDM2LCAweDI1Q0IsCisgICAgMHgyNUQzLCAweDI1QTEsIDB4MjMwMiwgMHgwMDAwLCAweDI1QUQsIDB4MjVBRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDI1QzcsIDB4MDAwMCwgMHgwMDAwLCAweDIyMDYsIDB4MjJCRiwgMHgyMzFFLCAweDAwMDAsIDB4MjIyNSwgMHgyMjI2LAorICAgIDB4MDAwMCwgMHgyMjUzLCAweDIyNTEsIDB4MjI2NiwgMHgyMjY3LCAweDIyMTMsIDB4MjI5NSwgMHgyMjk2LCAweDIyOTcsCisgICAgMHgyMERELCAweDIzMTQsIDB4MDAwMCwgMHgwMDAwLCAweDIyNjIsIDB4MDAwMCwgMHgyNUIxLCAweDAwMDAsIDB4MjIyMiwKKyAgICAweDIyNTAsIDB4MDBEOCwgMHgyMzRBLCAweDIyQTMsIDB4MDMzOCwgMHgwMDAwLCAweDIyNkUsIDB4MjI2RiwgMHgyMjg1LAorICAgIDB4MjI4NCwgMHgyMjA5LCAweDIyMEMsIDB4MjJCQiwgMHgwMDE2LCAweDIyNUEsIDB4MjMwNiwgMHgwMDI0LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDMyOUUsIDB4MDAwMCwgMHgyMDNDLCAweDAwM0YsIDB4MDAwMCwKKyAgICAweDAwM0YsIDB4MjJDNCwgMHgyNUM3LCAweDIyQzQsIDB4MjVDNiwgMHgyNUFCLCAweDI1QTEsIDB4MjVBQiwgMHgyNUEwLAorICAgIDB4MjVFNiwgMHgyNUNCLCAweDI1RTYsIDB4MjVDRiwgMHgyNUJELCAweDI1QjMsIDB4MjVCNywgMHgyNUMxLCAweDI3MjYsCisgICAgMHgyNUNGLCAweDI1QTAsIDB4MDAwMCwgMHgyNUNBLCAweDMyMzEsIDB4MzIzOSwgMHgzM0NCLCAweDI0ODMsIDB4MjQ5NCwKKyAgICAweDI0OTUsIDB4MjQ5NiwgMHgyNDk3LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LAorICAgIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgyMTkyLCAweDIxOTAsIDB4MjE5MSwgMHgyMTkzLCAweDIxOTYsCisgICAgMHgyMTk3LCAweDIxOTgsIDB4MjE5OSwgMHgyMUQwLCAweDIxQ0YsIDB4MjFDRCwgMHgyMUQ0LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyNzk0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDI3OUMsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgyN0JBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjFEMSwgMHgyMUQzLAorICAgIDB4MDAwMCwgMHgyNzlFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDI3OUUsIDB4MDAwMCwgMHgwMDAwLCAweDIxQjUsCisgICAgMHgyMUIxLCAweDAwMDAsIDB4MjFCNCwgMHgyMUIwLCAweDIxQjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIxRTYsIDB4MjFFOCwgMHgyMUU3LAorICAgIDB4MjFFOSwgMHgyMUJDLCAweDIxQzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMUMwLCAweDIxQkMsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIxQzQsIDB4MjFDNSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwKKyAgICAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLAorICAgIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsCisgICAgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwKKyAgICAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLAorICAgIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsCisgICAgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgwMDJFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwKKyAgICAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAorICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsCisgICAgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwKKyAgICAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAorICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsCisgICAgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwKKyAgICAweDIwREUsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAorICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsCisgICAgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwKKyAgICAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDI0ODMsIDB4MjQ4NCwgMHgyNDg1LAorICAgIDB4MjQ4NiwgMHgyNDg3LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDI5LCAweDIwREQsCisgICAgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwKKyAgICAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAorICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDMyOTQsCisgICAgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwKKyAgICAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDMyQTUsIDB4MjBERCwgMHgyMERELAorICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsCisgICAgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwKKyAgICAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELAorICAgIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsCisgICAgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwKKyAgICAweDIwREQsIDB4MDAyOSwgMHgwMDI5LCAweDAwMjksIDB4MDAyOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4Mjc5NCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDIxRTAsIDB4MjFFMSwgMHgyMUUyLCAweDIxRTMsIDB4MDAwMCwgMHgyN0ExLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDIxRTYsIDB4MjFFOCwgMHgyMUU3LCAweDIxRTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyNjFELCAweDI2MUYsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERELCAweDIwREQsIDB4MjBERCwgMHgyMERFLAorICAgIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDAwNUQsCisgICAgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwKKyAgICAweDAwNUQsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLAorICAgIDB4MjBERSwgMHgyMERFLCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsCisgICAgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwKKyAgICAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELAorICAgIDB4MDA1RCwgMHgwMDVELCAweDAwNUQsIDB4MDA1RCwgMHgwMDVELCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsCisgICAgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgzMjkwLCAweDMyOEEsIDB4MzI4QiwgMHgzMjhDLCAweDMyOEQsIDB4MzI4RSwKKyAgICAweDMyOEYsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgyMERFLCAweDIwREUsIDB4MjBERSwgMHgzMDBDLAorICAgIDB4MzAwRCwgMHgzMDBFLCAweDMwMEYsIDB4MjFFOCwgMHgyMUU2LCAweDIxRTcsIDB4MjFFOSwgMHgwMDIyLCAweDMwMUYsCisgICAgMHgzMDFELCAweDIwMzYsIDB4MDA2MCwgMHgzMDAxLCAweDAwMDAsIDB4MDAyMSwgMHgzMDIxLCAweDAwMkMsIDB4MzAwMiwKKyAgICAweEFDMDIsIDB4QUMwMywgMHhBQzA1LCAweEFDMDYsIDB4QUMwQiwgMHhBQzBDLCAweEFDMEQsIDB4QUMwRSwgMHhBQzBGLAorICAgIDB4QUMxOCwgMHhBQzFFLCAweEFDMUYsIDB4QUMyMSwgMHhBQzIyLCAweEFDMjMsIDB4QUMyNSwgMHhBQzI2LCAweEFDMjcsCisgICAgMHhBQzI4LCAweEFDMjksIDB4QUMyQSwgMHhBQzJCLCAweEFDMkUsIDB4QUMzMiwgMHhBQzMzLCAweEFDMzQsIDB4QUMzNSwKKyAgICAweEFDMzYsIDB4QUMzNywgMHhBQzNBLCAweEFDM0IsIDB4QUMzRCwgMHhBQzNFLCAweEFDM0YsIDB4QUM0MSwgMHhBQzQyLAorICAgIDB4QUM0MywgMHhBQzQ0LCAweEFDNDUsIDB4QUM0NiwgMHhBQzQ3LCAweEFDNDgsIDB4QUM0OSwgMHhBQzRBLCAweEFDNEMsCisgICAgMHhBQzRFLCAweEFDNEYsIDB4QUM1MCwgMHhBQzUxLCAweEFDNTIsIDB4QUM1MywgMHhBQzU1LCAweEFDNTYsIDB4QUM1NywKKyAgICAweEFDNTksIDB4QUM1QSwgMHhBQzVCLCAweEFDNUQsIDB4QUM1RSwgMHhBQzVGLCAweEFDNjAsIDB4QUM2MSwgMHhBQzYyLAorICAgIDB4QUM2MywgMHhBQzY0LCAweEFDNjUsIDB4QUM2NiwgMHhBQzY3LCAweEFDNjgsIDB4QUM2OSwgMHhBQzZBLCAweEFDNkIsCisgICAgMHhBQzZDLCAweEFDNkQsIDB4QUM2RSwgMHhBQzZGLCAweEFDNzIsIDB4QUM3MywgMHhBQzc1LCAweEFDNzYsIDB4QUM3OSwKKyAgICAweEFDN0IsIDB4QUM3QywgMHhBQzdELCAweEFDN0UsIDB4QUM3RiwgMHhBQzgyLCAweEFDODcsIDB4QUM4OCwgMHhBQzhELAorICAgIDB4QUM4RSwgMHhBQzhGLCAweEFDOTEsIDB4QUM5MiwgMHhBQzkzLCAweEFDOTUsIDB4QUM5NiwgMHhBQzk3LCAweEFDOTgsCisgICAgMHhBQzk5LCAweEFDOUEsIDB4QUM5QiwgMHhBQzlFLCAweEFDQTIsIDB4QUNBMywgMHhBQ0E0LCAweEFDQTUsIDB4QUNBNiwKKyAgICAweEFDQTcsIDB4QUNBQiwgMHhBQ0FELCAweEFDQUUsIDB4QUNCMSwgMHhBQ0IyLCAweEFDQjMsIDB4QUNCNCwgMHhBQ0I1LAorICAgIDB4QUNCNiwgMHhBQ0I3LCAweEFDQkEsIDB4QUNCRSwgMHhBQ0JGLCAweEFDQzAsIDB4QUNDMiwgMHhBQ0MzLCAweEFDQzUsCisgICAgMHhBQ0M2LCAweEFDQzcsIDB4QUNDOSwgMHhBQ0NBLCAweEFDQ0IsIDB4QUNDRCwgMHhBQ0NFLCAweEFDQ0YsIDB4QUNEMCwKKyAgICAweEFDRDEsIDB4QUNEMiwgMHhBQ0QzLCAweEFDRDQsIDB4QUNENiwgMHhBQ0Q4LCAweEFDRDksIDB4QUNEQSwgMHhBQ0RCLAorICAgIDB4QUNEQywgMHhBQ0RELCAweEFDREUsIDB4QUNERiwgMHhBQ0UyLCAweEFDRTMsIDB4QUNFNSwgMHhBQ0U2LCAweEFDRTksCisgICAgMHhBQ0VCLCAweEFDRUQsIDB4QUNFRSwgMHhBQ0YyLCAweEFDRjQsIDB4QUNGNywgMHhBQ0Y4LCAweEFDRjksIDB4QUNGQSwKKyAgICAweEFDRkIsIDB4QUNGRSwgMHhBQ0ZGLCAweEFEMDEsIDB4QUQwMiwgMHhBRDAzLCAweEFEMDUsIDB4QUQwNywgMHhBRDA4LAorICAgIDB4QUQwOSwgMHhBRDBBLCAweEFEMEIsIDB4QUQwRSwgMHhBRDEwLCAweEFEMTIsIDB4QUQxMywgMHhBRDE0LCAweEFEMTUsCisgICAgMHhBRDE2LCAweEFEMTcsIDB4QUQxOSwgMHhBRDFBLCAweEFEMUIsIDB4QUQxRCwgMHhBRDFFLCAweEFEMUYsIDB4QUQyMSwKKyAgICAweEFEMjIsIDB4QUQyMywgMHhBRDI0LCAweEFEMjUsIDB4QUQyNiwgMHhBRDI3LCAweEFEMjgsIDB4QUQyQSwgMHhBRDJCLAorICAgIDB4QUQyRSwgMHhBRDJGLCAweEFEMzAsIDB4QUQzMSwgMHhBRDMyLCAweEFEMzMsIDB4QUQzNiwgMHhBRDM3LCAweEFEMzksCisgICAgMHhBRDNBLCAweEFEM0IsIDB4QUQzRCwgMHhBRDNFLCAweEFEM0YsIDB4QUQ0MCwgMHhBRDQxLCAweEFENDIsIDB4QUQ0MywKKyAgICAweEFENDYsIDB4QUQ0OCwgMHhBRDRBLCAweEFENEIsIDB4QUQ0QywgMHhBRDRELCAweEFENEUsIDB4QUQ0RiwgMHhBRDUxLAorICAgIDB4QUQ1MiwgMHhBRDUzLCAweEFENTUsIDB4QUQ1NiwgMHhBRDU3LCAweEFENTksIDB4QUQ1QSwgMHhBRDVCLCAweEFENUMsCisgICAgMHhBRDVELCAweEFENUUsIDB4QUQ1RiwgMHhBRDYwLCAweEFENjIsIDB4QUQ2NCwgMHhBRDY1LCAweEFENjYsIDB4QUQ2NywKKyAgICAweEFENjgsIDB4QUQ2OSwgMHhBRDZBLCAweEFENkIsIDB4QUQ2RSwgMHhBRDZGLCAweEFENzEsIDB4QUQ3MiwgMHhBRDc3LAorICAgIDB4QUQ3OCwgMHhBRDc5LCAweEFEN0EsIDB4QUQ3RSwgMHhBRDgwLCAweEFEODMsIDB4QUQ4NCwgMHhBRDg1LCAweEFEODYsCisgICAgMHhBRDg3LCAweEFEOEEsIDB4QUQ4QiwgMHhBRDhELCAweEFEOEUsIDB4QUQ4RiwgMHhBRDkxLCAweEFEOTIsIDB4QUQ5MywKKyAgICAweEFEOTQsIDB4QUQ5NSwgMHhBRDk2LCAweEFEOTcsIDB4QUQ5OCwgMHhBRDk5LCAweEFEOUEsIDB4QUQ5QiwgMHhBRDlFLAorICAgIDB4QUQ5RiwgMHhBREEwLCAweEFEQTEsIDB4QURBMiwgMHhBREEzLCAweEFEQTUsIDB4QURBNiwgMHhBREE3LCAweEFEQTgsCisgICAgMHhBREE5LCAweEFEQUEsIDB4QURBQiwgMHhBREFDLCAweEFEQUQsIDB4QURBRSwgMHhBREFGLCAweEFEQjAsIDB4QURCMSwKKyAgICAweEFEQjIsIDB4QURCMywgMHhBREI0LCAweEFEQjUsIDB4QURCNiwgMHhBREI4LCAweEFEQjksIDB4QURCQSwgMHhBREJCLAorICAgIDB4QURCQywgMHhBREJELCAweEFEQkUsIDB4QURCRiwgMHhBREMyLCAweEFEQzMsIDB4QURDNSwgMHhBREM2LCAweEFEQzcsCisgICAgMHhBREM5LCAweEFEQ0EsIDB4QURDQiwgMHhBRENDLCAweEFEQ0QsIDB4QURDRSwgMHhBRENGLCAweEFERDIsIDB4QURENCwKKyAgICAweEFERDUsIDB4QURENiwgMHhBREQ3LCAweEFERDgsIDB4QUREOSwgMHhBRERBLCAweEFEREIsIDB4QURERCwgMHhBRERFLAorICAgIDB4QURERiwgMHhBREUxLCAweEFERTIsIDB4QURFMywgMHhBREU1LCAweEFERTYsIDB4QURFNywgMHhBREU4LCAweEFERTksCisgICAgMHhBREVBLCAweEFERUIsIDB4QURFQywgMHhBREVELCAweEFERUUsIDB4QURFRiwgMHhBREYwLCAweEFERjEsIDB4QURGMiwKKyAgICAweEFERjMsIDB4QURGNCwgMHhBREY1LCAweEFERjYsIDB4QURGNywgMHhBREZBLCAweEFERkIsIDB4QURGRCwgMHhBREZFLAorICAgIDB4QUUwMiwgMHhBRTAzLCAweEFFMDQsIDB4QUUwNSwgMHhBRTA2LCAweEFFMDcsIDB4QUUwQSwgMHhBRTBDLCAweEFFMEUsCisgICAgMHhBRTBGLCAweEFFMTAsIDB4QUUxMSwgMHhBRTEyLCAweEFFMTMsIDB4QUUxNSwgMHhBRTE2LCAweEFFMTcsIDB4QUUxOCwKKyAgICAweEFFMTksIDB4QUUxQSwgMHhBRTFCLCAweEFFMUMsIDB4QUUxRCwgMHhBRTFFLCAweEFFMUYsIDB4QUUyMCwgMHhBRTIxLAorICAgIDB4QUUyMiwgMHhBRTIzLCAweEFFMjQsIDB4QUUyNSwgMHhBRTI2LCAweEFFMjcsIDB4QUUyOCwgMHhBRTI5LCAweEFFMkEsCisgICAgMHhBRTJCLCAweEFFMkMsIDB4QUUyRCwgMHhBRTJFLCAweEFFMkYsIDB4QUUzMiwgMHhBRTMzLCAweEFFMzUsIDB4QUUzNiwKKyAgICAweEFFMzksIDB4QUUzQiwgMHhBRTNDLCAweEFFM0QsIDB4QUUzRSwgMHhBRTNGLCAweEFFNDIsIDB4QUU0NCwgMHhBRTQ3LAorICAgIDB4QUU0OCwgMHhBRTQ5LCAweEFFNEIsIDB4QUU0RiwgMHhBRTUxLCAweEFFNTIsIDB4QUU1MywgMHhBRTU1LCAweEFFNTcsCisgICAgMHhBRTU4LCAweEFFNTksIDB4QUU1QSwgMHhBRTVCLCAweEFFNUUsIDB4QUU2MiwgMHhBRTYzLCAweEFFNjQsIDB4QUU2NiwKKyAgICAweEFFNjcsIDB4QUU2QSwgMHhBRTZCLCAweEFFNkQsIDB4QUU2RSwgMHhBRTZGLCAweEFFNzEsIDB4QUU3MiwgMHhBRTczLAorICAgIDB4QUU3NCwgMHhBRTc1LCAweEFFNzYsIDB4QUU3NywgMHhBRTdBLCAweEFFN0UsIDB4QUU3RiwgMHhBRTgwLCAweEFFODEsCisgICAgMHhBRTgyLCAweEFFODMsIDB4QUU4NiwgMHhBRTg3LCAweEFFODgsIDB4QUU4OSwgMHhBRThBLCAweEFFOEIsIDB4QUU4RCwKKyAgICAweEFFOEUsIDB4QUU4RiwgMHhBRTkwLCAweEFFOTEsIDB4QUU5MiwgMHhBRTkzLCAweEFFOTQsIDB4QUU5NSwgMHhBRTk2LAorICAgIDB4QUU5NywgMHhBRTk4LCAweEFFOTksIDB4QUU5QSwgMHhBRTlCLCAweEFFOUMsIDB4QUU5RCwgMHhBRTlFLCAweEFFOUYsCisgICAgMHhBRUEwLCAweEFFQTEsIDB4QUVBMiwgMHhBRUEzLCAweEFFQTQsIDB4QUVBNSwgMHhBRUE2LCAweEFFQTcsIDB4QUVBOCwKKyAgICAweEFFQTksIDB4QUVBQSwgMHhBRUFCLCAweEFFQUMsIDB4QUVBRCwgMHhBRUFFLCAweEFFQUYsIDB4QUVCMCwgMHhBRUIxLAorICAgIDB4QUVCMiwgMHhBRUIzLCAweEFFQjQsIDB4QUVCNSwgMHhBRUI2LCAweEFFQjcsIDB4QUVCOCwgMHhBRUI5LCAweEFFQkEsCisgICAgMHhBRUJCLCAweEFFQkYsIDB4QUVDMSwgMHhBRUMyLCAweEFFQzMsIDB4QUVDNSwgMHhBRUM2LCAweEFFQzcsIDB4QUVDOCwKKyAgICAweEFFQzksIDB4QUVDQSwgMHhBRUNCLCAweEFFQ0UsIDB4QUVEMiwgMHhBRUQzLCAweEFFRDQsIDB4QUVENSwgMHhBRUQ2LAorICAgIDB4QUVENywgMHhBRURBLCAweEFFREIsIDB4QUVERCwgMHhBRURFLCAweEFFREYsIDB4QUVFMCwgMHhBRUUxLCAweEFFRTIsCisgICAgMHhBRUUzLCAweEFFRTQsIDB4QUVFNSwgMHhBRUU2LCAweEFFRTcsIDB4QUVFOSwgMHhBRUVBLCAweEFFRUMsIDB4QUVFRSwKKyAgICAweEFFRUYsIDB4QUVGMCwgMHhBRUYxLCAweEFFRjIsIDB4QUVGMywgMHhBRUY1LCAweEFFRjYsIDB4QUVGNywgMHhBRUY5LAorICAgIDB4QUVGQSwgMHhBRUZCLCAweEFFRkQsIDB4QUVGRSwgMHhBRUZGLCAweEFGMDAsIDB4QUYwMSwgMHhBRjAyLCAweEFGMDMsCisgICAgMHhBRjA0LCAweEFGMDUsIDB4QUYwNiwgMHhBRjA5LCAweEFGMEEsIDB4QUYwQiwgMHhBRjBDLCAweEFGMEUsIDB4QUYwRiwKKyAgICAweEFGMTEsIDB4QUYxMiwgMHhBRjEzLCAweEFGMTQsIDB4QUYxNSwgMHhBRjE2LCAweEFGMTcsIDB4QUYxOCwgMHhBRjE5LAorICAgIDB4QUYxQSwgMHhBRjFCLCAweEFGMUMsIDB4QUYxRCwgMHhBRjFFLCAweEFGMUYsIDB4QUYyMCwgMHhBRjIxLCAweEFGMjIsCisgICAgMHhBRjIzLCAweEFGMjQsIDB4QUYyNSwgMHhBRjI2LCAweEFGMjcsIDB4QUYyOCwgMHhBRjI5LCAweEFGMkEsIDB4QUYyQiwKKyAgICAweEFGMkUsIDB4QUYyRiwgMHhBRjMxLCAweEFGMzMsIDB4QUYzNSwgMHhBRjM2LCAweEFGMzcsIDB4QUYzOCwgMHhBRjM5LAorICAgIDB4QUYzQSwgMHhBRjNCLCAweEFGM0UsIDB4QUY0MCwgMHhBRjQ0LCAweEFGNDUsIDB4QUY0NiwgMHhBRjQ3LCAweEFGNEEsCisgICAgMHhBRjRCLCAweEFGNEMsIDB4QUY0RCwgMHhBRjRFLCAweEFGNEYsIDB4QUY1MSwgMHhBRjUyLCAweEFGNTMsIDB4QUY1NCwKKyAgICAweEFGNTUsIDB4QUY1NiwgMHhBRjU3LCAweEFGNTgsIDB4QUY1OSwgMHhBRjVBLCAweEFGNUIsIDB4QUY1RSwgMHhBRjVGLAorICAgIDB4QUY2MCwgMHhBRjYxLCAweEFGNjIsIDB4QUY2MywgMHhBRjY2LCAweEFGNjcsIDB4QUY2OCwgMHhBRjY5LCAweEFGNkEsCisgICAgMHhBRjZCLCAweEFGNkMsIDB4QUY2RCwgMHhBRjZFLCAweEFGNkYsIDB4QUY3MCwgMHhBRjcxLCAweEFGNzIsIDB4QUY3MywKKyAgICAweEFGNzQsIDB4QUY3NSwgMHhBRjc2LCAweEFGNzcsIDB4QUY3OCwgMHhBRjdBLCAweEFGN0IsIDB4QUY3QywgMHhBRjdELAorICAgIDB4QUY3RSwgMHhBRjdGLCAweEFGODEsIDB4QUY4MiwgMHhBRjgzLCAweEFGODUsIDB4QUY4NiwgMHhBRjg3LCAweEFGODksCisgICAgMHhBRjhBLCAweEFGOEIsIDB4QUY4QywgMHhBRjhELCAweEFGOEUsIDB4QUY4RiwgMHhBRjkyLCAweEFGOTMsIDB4QUY5NCwKKyAgICAweEFGOTYsIDB4QUY5NywgMHhBRjk4LCAweEFGOTksIDB4QUY5QSwgMHhBRjlCLCAweEFGOUQsIDB4QUY5RSwgMHhBRjlGLAorICAgIDB4QUZBMCwgMHhBRkExLCAweEFGQTIsIDB4QUZBMywgMHhBRkE0LCAweEFGQTUsIDB4QUZBNiwgMHhBRkE3LCAweEFGQTgsCisgICAgMHhBRkE5LCAweEFGQUEsIDB4QUZBQiwgMHhBRkFDLCAweEFGQUQsIDB4QUZBRSwgMHhBRkFGLCAweEFGQjAsIDB4QUZCMSwKKyAgICAweEFGQjIsIDB4QUZCMywgMHhBRkI0LCAweEFGQjUsIDB4QUZCNiwgMHhBRkI3LCAweEFGQkEsIDB4QUZCQiwgMHhBRkJELAorICAgIDB4QUZCRSwgMHhBRkJGLCAweEFGQzEsIDB4QUZDMiwgMHhBRkMzLCAweEFGQzQsIDB4QUZDNSwgMHhBRkM2LCAweEFGQ0EsCisgICAgMHhBRkNDLCAweEFGQ0YsIDB4QUZEMCwgMHhBRkQxLCAweEFGRDIsIDB4QUZEMywgMHhBRkQ1LCAweEFGRDYsIDB4QUZENywKKyAgICAweEFGRDgsIDB4QUZEOSwgMHhBRkRBLCAweEFGREIsIDB4QUZERCwgMHhBRkRFLCAweEFGREYsIDB4QUZFMCwgMHhBRkUxLAorICAgIDB4QUZFMiwgMHhBRkUzLCAweEFGRTQsIDB4QUZFNSwgMHhBRkU2LCAweEFGRTcsIDB4QUZFQSwgMHhBRkVCLCAweEFGRUMsCisgICAgMHhBRkVELCAweEFGRUUsIDB4QUZFRiwgMHhBRkYyLCAweEFGRjMsIDB4QUZGNSwgMHhBRkY2LCAweEFGRjcsIDB4QUZGOSwKKyAgICAweEFGRkEsIDB4QUZGQiwgMHhBRkZDLCAweEFGRkQsIDB4QUZGRSwgMHhBRkZGLCAweEIwMDIsIDB4QjAwMywgMHhCMDA1LAorICAgIDB4QjAwNiwgMHhCMDA3LCAweEIwMDgsIDB4QjAwOSwgMHhCMDBBLCAweEIwMEIsIDB4QjAwRCwgMHhCMDBFLCAweEIwMEYsCisgICAgMHhCMDExLCAweEIwMTIsIDB4QjAxMywgMHhCMDE1LCAweEIwMTYsIDB4QjAxNywgMHhCMDE4LCAweEIwMTksIDB4QjAxQSwKKyAgICAweEIwMUIsIDB4QjAxRSwgMHhCMDFGLCAweEIwMjAsIDB4QjAyMSwgMHhCMDIyLCAweEIwMjMsIDB4QjAyNCwgMHhCMDI1LAorICAgIDB4QjAyNiwgMHhCMDI3LCAweEIwMjksIDB4QjAyQSwgMHhCMDJCLCAweEIwMkMsIDB4QjAyRCwgMHhCMDJFLCAweEIwMkYsCisgICAgMHhCMDMwLCAweEIwMzEsIDB4QjAzMiwgMHhCMDMzLCAweEIwMzQsIDB4QjAzNSwgMHhCMDM2LCAweEIwMzcsIDB4QjAzOCwKKyAgICAweEIwMzksIDB4QjAzQSwgMHhCMDNCLCAweEIwM0MsIDB4QjAzRCwgMHhCMDNFLCAweEIwM0YsIDB4QjA0MCwgMHhCMDQxLAorICAgIDB4QjA0MiwgMHhCMDQzLCAweEIwNDYsIDB4QjA0NywgMHhCMDQ5LCAweEIwNEIsIDB4QjA0RCwgMHhCMDRGLCAweEIwNTAsCisgICAgMHhCMDUxLCAweEIwNTIsIDB4QjA1NiwgMHhCMDU4LCAweEIwNUEsIDB4QjA1QiwgMHhCMDVDLCAweEIwNUUsIDB4QjA1RiwKKyAgICAweEIwNjAsIDB4QjA2MSwgMHhCMDYyLCAweEIwNjMsIDB4QjA2NCwgMHhCMDY1LCAweEIwNjYsIDB4QjA2NywgMHhCMDY4LAorICAgIDB4QjA2OSwgMHhCMDZBLCAweEIwNkIsIDB4QjA2QywgMHhCMDZELCAweEIwNkUsIDB4QjA2RiwgMHhCMDcwLCAweEIwNzEsCisgICAgMHhCMDcyLCAweEIwNzMsIDB4QjA3NCwgMHhCMDc1LCAweEIwNzYsIDB4QjA3NywgMHhCMDc4LCAweEIwNzksIDB4QjA3QSwKKyAgICAweEIwN0IsIDB4QjA3RSwgMHhCMDdGLCAweEIwODEsIDB4QjA4MiwgMHhCMDgzLCAweEIwODUsIDB4QjA4NiwgMHhCMDg3LAorICAgIDB4QjA4OCwgMHhCMDg5LCAweEIwOEEsIDB4QjA4QiwgMHhCMDhFLCAweEIwOTAsIDB4QjA5MiwgMHhCMDkzLCAweEIwOTQsCisgICAgMHhCMDk1LCAweEIwOTYsIDB4QjA5NywgMHhCMDlCLCAweEIwOUQsIDB4QjA5RSwgMHhCMEEzLCAweEIwQTQsIDB4QjBBNSwKKyAgICAweEIwQTYsIDB4QjBBNywgMHhCMEFBLCAweEIwQjAsIDB4QjBCMiwgMHhCMEI2LCAweEIwQjcsIDB4QjBCOSwgMHhCMEJBLAorICAgIDB4QjBCQiwgMHhCMEJELCAweEIwQkUsIDB4QjBCRiwgMHhCMEMwLCAweEIwQzEsIDB4QjBDMiwgMHhCMEMzLCAweEIwQzYsCisgICAgMHhCMENBLCAweEIwQ0IsIDB4QjBDQywgMHhCMENELCAweEIwQ0UsIDB4QjBDRiwgMHhCMEQyLCAweEIwRDMsIDB4QjBENSwKKyAgICAweEIwRDYsIDB4QjBENywgMHhCMEQ5LCAweEIwREEsIDB4QjBEQiwgMHhCMERDLCAweEIwREQsIDB4QjBERSwgMHhCMERGLAorICAgIDB4QjBFMSwgMHhCMEUyLCAweEIwRTMsIDB4QjBFNCwgMHhCMEU2LCAweEIwRTcsIDB4QjBFOCwgMHhCMEU5LCAweEIwRUEsCisgICAgMHhCMEVCLCAweEIwRUMsIDB4QjBFRCwgMHhCMEVFLCAweEIwRUYsIDB4QjBGMCwgMHhCMEYxLCAweEIwRjIsIDB4QjBGMywKKyAgICAweEIwRjQsIDB4QjBGNSwgMHhCMEY2LCAweEIwRjcsIDB4QjBGOCwgMHhCMEY5LCAweEIwRkEsIDB4QjBGQiwgMHhCMEZDLAorICAgIDB4QjBGRCwgMHhCMEZFLCAweEIwRkYsIDB4QjEwMCwgMHhCMTAxLCAweEIxMDIsIDB4QjEwMywgMHhCMTA0LCAweEIxMDUsCisgICAgMHhCMTA2LCAweEIxMDcsIDB4QjEwQSwgMHhCMTBELCAweEIxMEUsIDB4QjEwRiwgMHhCMTExLCAweEIxMTQsIDB4QjExNSwKKyAgICAweEIxMTYsIDB4QjExNywgMHhCMTFBLCAweEIxMUUsIDB4QjExRiwgMHhCMTIwLCAweEIxMjEsIDB4QjEyMiwgMHhCMTI2LAorICAgIDB4QjEyNywgMHhCMTI5LCAweEIxMkEsIDB4QjEyQiwgMHhCMTJELCAweEIxMkUsIDB4QjEyRiwgMHhCMTMwLCAweEIxMzEsCisgICAgMHhCMTMyLCAweEIxMzMsIDB4QjEzNiwgMHhCMTNBLCAweEIxM0IsIDB4QjEzQywgMHhCMTNELCAweEIxM0UsIDB4QjEzRiwKKyAgICAweEIxNDIsIDB4QjE0MywgMHhCMTQ1LCAweEIxNDYsIDB4QjE0NywgMHhCMTQ5LCAweEIxNEEsIDB4QjE0QiwgMHhCMTRDLAorICAgIDB4QjE0RCwgMHhCMTRFLCAweEIxNEYsIDB4QjE1MiwgMHhCMTUzLCAweEIxNTYsIDB4QjE1NywgMHhCMTU5LCAweEIxNUEsCisgICAgMHhCMTVCLCAweEIxNUQsIDB4QjE1RSwgMHhCMTVGLCAweEIxNjEsIDB4QjE2MiwgMHhCMTYzLCAweEIxNjQsIDB4QjE2NSwKKyAgICAweEIxNjYsIDB4QjE2NywgMHhCMTY4LCAweEIxNjksIDB4QjE2QSwgMHhCMTZCLCAweEIxNkMsIDB4QjE2RCwgMHhCMTZFLAorICAgIDB4QjE2RiwgMHhCMTcwLCAweEIxNzEsIDB4QjE3MiwgMHhCMTczLCAweEIxNzQsIDB4QjE3NSwgMHhCMTc2LCAweEIxNzcsCisgICAgMHhCMTdBLCAweEIxN0IsIDB4QjE3RCwgMHhCMTdFLCAweEIxN0YsIDB4QjE4MSwgMHhCMTgzLCAweEIxODQsIDB4QjE4NSwKKyAgICAweEIxODYsIDB4QjE4NywgMHhCMThBLCAweEIxOEMsIDB4QjE4RSwgMHhCMThGLCAweEIxOTAsIDB4QjE5MSwgMHhCMTk1LAorICAgIDB4QjE5NiwgMHhCMTk3LCAweEIxOTksIDB4QjE5QSwgMHhCMTlCLCAweEIxOUQsIDB4QjE5RSwgMHhCMTlGLCAweEIxQTAsCisgICAgMHhCMUExLCAweEIxQTIsIDB4QjFBMywgMHhCMUE0LCAweEIxQTUsIDB4QjFBNiwgMHhCMUE3LCAweEIxQTksIDB4QjFBQSwKKyAgICAweEIxQUIsIDB4QjFBQywgMHhCMUFELCAweEIxQUUsIDB4QjFBRiwgMHhCMUIwLCAweEIxQjEsIDB4QjFCMiwgMHhCMUIzLAorICAgIDB4QjFCNCwgMHhCMUI1LCAweEIxQjYsIDB4QjFCNywgMHhCMUI4LCAweEIxQjksIDB4QjFCQSwgMHhCMUJCLCAweEIxQkMsCisgICAgMHhCMUJELCAweEIxQkUsIDB4QjFCRiwgMHhCMUMwLCAweEIxQzEsIDB4QjFDMiwgMHhCMUMzLCAweEIxQzQsIDB4QjFDNSwKKyAgICAweEIxQzYsIDB4QjFDNywgMHhCMUM4LCAweEIxQzksIDB4QjFDQSwgMHhCMUNCLCAweEIxQ0QsIDB4QjFDRSwgMHhCMUNGLAorICAgIDB4QjFEMSwgMHhCMUQyLCAweEIxRDMsIDB4QjFENSwgMHhCMUQ2LCAweEIxRDcsIDB4QjFEOCwgMHhCMUQ5LCAweEIxREEsCisgICAgMHhCMURCLCAweEIxREUsIDB4QjFFMCwgMHhCMUUxLCAweEIxRTIsIDB4QjFFMywgMHhCMUU0LCAweEIxRTUsIDB4QjFFNiwKKyAgICAweEIxRTcsIDB4QjFFQSwgMHhCMUVCLCAweEIxRUQsIDB4QjFFRSwgMHhCMUVGLCAweEIxRjEsIDB4QjFGMiwgMHhCMUYzLAorICAgIDB4QjFGNCwgMHhCMUY1LCAweEIxRjYsIDB4QjFGNywgMHhCMUY4LCAweEIxRkEsIDB4QjFGQywgMHhCMUZFLCAweEIxRkYsCisgICAgMHhCMjAwLCAweEIyMDEsIDB4QjIwMiwgMHhCMjAzLCAweEIyMDYsIDB4QjIwNywgMHhCMjA5LCAweEIyMEEsIDB4QjIwRCwKKyAgICAweEIyMEUsIDB4QjIwRiwgMHhCMjEwLCAweEIyMTEsIDB4QjIxMiwgMHhCMjEzLCAweEIyMTYsIDB4QjIxOCwgMHhCMjFBLAorICAgIDB4QjIxQiwgMHhCMjFDLCAweEIyMUQsIDB4QjIxRSwgMHhCMjFGLCAweEIyMjEsIDB4QjIyMiwgMHhCMjIzLCAweEIyMjQsCisgICAgMHhCMjI1LCAweEIyMjYsIDB4QjIyNywgMHhCMjI4LCAweEIyMjksIDB4QjIyQSwgMHhCMjJCLCAweEIyMkMsIDB4QjIyRCwKKyAgICAweEIyMkUsIDB4QjIyRiwgMHhCMjMwLCAweEIyMzEsIDB4QjIzMiwgMHhCMjMzLCAweEIyMzUsIDB4QjIzNiwgMHhCMjM3LAorICAgIDB4QjIzOCwgMHhCMjM5LCAweEIyM0EsIDB4QjIzQiwgMHhCMjNELCAweEIyM0UsIDB4QjIzRiwgMHhCMjQwLCAweEIyNDEsCisgICAgMHhCMjQyLCAweEIyNDMsIDB4QjI0NCwgMHhCMjQ1LCAweEIyNDYsIDB4QjI0NywgMHhCMjQ4LCAweEIyNDksIDB4QjI0QSwKKyAgICAweEIyNEIsIDB4QjI0QywgMHhCMjRELCAweEIyNEUsIDB4QjI0RiwgMHhCMjUwLCAweEIyNTEsIDB4QjI1MiwgMHhCMjUzLAorICAgIDB4QjI1NCwgMHhCMjU1LCAweEIyNTYsIDB4QjI1NywgMHhCMjU5LCAweEIyNUEsIDB4QjI1QiwgMHhCMjVELCAweEIyNUUsCisgICAgMHhCMjVGLCAweEIyNjEsIDB4QjI2MiwgMHhCMjYzLCAweEIyNjQsIDB4QjI2NSwgMHhCMjY2LCAweEIyNjcsIDB4QjI2QSwKKyAgICAweEIyNkIsIDB4QjI2QywgMHhCMjZELCAweEIyNkUsIDB4QjI2RiwgMHhCMjcwLCAweEIyNzEsIDB4QjI3MiwgMHhCMjczLAorICAgIDB4QjI3NiwgMHhCMjc3LCAweEIyNzgsIDB4QjI3OSwgMHhCMjdBLCAweEIyN0IsIDB4QjI3RCwgMHhCMjdFLCAweEIyN0YsCisgICAgMHhCMjgwLCAweEIyODEsIDB4QjI4MiwgMHhCMjgzLCAweEIyODYsIDB4QjI4NywgMHhCMjg4LCAweEIyOEEsIDB4QjI4QiwKKyAgICAweEIyOEMsIDB4QjI4RCwgMHhCMjhFLCAweEIyOEYsIDB4QjI5MiwgMHhCMjkzLCAweEIyOTUsIDB4QjI5NiwgMHhCMjk3LAorICAgIDB4QjI5QiwgMHhCMjlDLCAweEIyOUQsIDB4QjI5RSwgMHhCMjlGLCAweEIyQTIsIDB4QjJBNCwgMHhCMkE3LCAweEIyQTgsCisgICAgMHhCMkE5LCAweEIyQUIsIDB4QjJBRCwgMHhCMkFFLCAweEIyQUYsIDB4QjJCMSwgMHhCMkIyLCAweEIyQjMsIDB4QjJCNSwKKyAgICAweEIyQjYsIDB4QjJCNywgMHhCMkI4LCAweEIyQjksIDB4QjJCQSwgMHhCMkJCLCAweEIyQkMsIDB4QjJCRCwgMHhCMkJFLAorICAgIDB4QjJCRiwgMHhCMkMwLCAweEIyQzEsIDB4QjJDMiwgMHhCMkMzLCAweEIyQzQsIDB4QjJDNSwgMHhCMkM2LCAweEIyQzcsCisgICAgMHhCMkNBLCAweEIyQ0IsIDB4QjJDRCwgMHhCMkNFLCAweEIyQ0YsIDB4QjJEMSwgMHhCMkQzLCAweEIyRDQsIDB4QjJENSwKKyAgICAweEIyRDYsIDB4QjJENywgMHhCMkRBLCAweEIyREMsIDB4QjJERSwgMHhCMkRGLCAweEIyRTAsIDB4QjJFMSwgMHhCMkUzLAorICAgIDB4QjJFNywgMHhCMkU5LCAweEIyRUEsIDB4QjJGMCwgMHhCMkYxLCAweEIyRjIsIDB4QjJGNiwgMHhCMkZDLCAweEIyRkQsCisgICAgMHhCMkZFLCAweEIzMDIsIDB4QjMwMywgMHhCMzA1LCAweEIzMDYsIDB4QjMwNywgMHhCMzA5LCAweEIzMEEsIDB4QjMwQiwKKyAgICAweEIzMEMsIDB4QjMwRCwgMHhCMzBFLCAweEIzMEYsIDB4QjMxMiwgMHhCMzE2LCAweEIzMTcsIDB4QjMxOCwgMHhCMzE5LAorICAgIDB4QjMxQSwgMHhCMzFCLCAweEIzMUQsIDB4QjMxRSwgMHhCMzFGLCAweEIzMjAsIDB4QjMyMSwgMHhCMzIyLCAweEIzMjMsCisgICAgMHhCMzI0LCAweEIzMjUsIDB4QjMyNiwgMHhCMzI3LCAweEIzMjgsIDB4QjMyOSwgMHhCMzJBLCAweEIzMkIsIDB4QjMyQywKKyAgICAweEIzMkQsIDB4QjMyRSwgMHhCMzJGLCAweEIzMzAsIDB4QjMzMSwgMHhCMzMyLCAweEIzMzMsIDB4QjMzNCwgMHhCMzM1LAorICAgIDB4QjMzNiwgMHhCMzM3LCAweEIzMzgsIDB4QjMzOSwgMHhCMzNBLCAweEIzM0IsIDB4QjMzQywgMHhCMzNELCAweEIzM0UsCisgICAgMHhCMzNGLCAweEIzNDAsIDB4QjM0MSwgMHhCMzQyLCAweEIzNDMsIDB4QjM0NCwgMHhCMzQ1LCAweEIzNDYsIDB4QjM0NywKKyAgICAweEIzNDgsIDB4QjM0OSwgMHhCMzRBLCAweEIzNEIsIDB4QjM0QywgMHhCMzRELCAweEIzNEUsIDB4QjM0RiwgMHhCMzUwLAorICAgIDB4QjM1MSwgMHhCMzUyLCAweEIzNTMsIDB4QjM1NywgMHhCMzU5LCAweEIzNUEsIDB4QjM1RCwgMHhCMzYwLCAweEIzNjEsCisgICAgMHhCMzYyLCAweEIzNjMsIDB4QjM2NiwgMHhCMzY4LCAweEIzNkEsIDB4QjM2QywgMHhCMzZELCAweEIzNkYsIDB4QjM3MiwKKyAgICAweEIzNzMsIDB4QjM3NSwgMHhCMzc2LCAweEIzNzcsIDB4QjM3OSwgMHhCMzdBLCAweEIzN0IsIDB4QjM3QywgMHhCMzdELAorICAgIDB4QjM3RSwgMHhCMzdGLCAweEIzODIsIDB4QjM4NiwgMHhCMzg3LCAweEIzODgsIDB4QjM4OSwgMHhCMzhBLCAweEIzOEIsCisgICAgMHhCMzhELCAweEIzOEUsIDB4QjM4RiwgMHhCMzkxLCAweEIzOTIsIDB4QjM5MywgMHhCMzk1LCAweEIzOTYsIDB4QjM5NywKKyAgICAweEIzOTgsIDB4QjM5OSwgMHhCMzlBLCAweEIzOUIsIDB4QjM5QywgMHhCMzlELCAweEIzOUUsIDB4QjM5RiwgMHhCM0EyLAorICAgIDB4QjNBMywgMHhCM0E0LCAweEIzQTUsIDB4QjNBNiwgMHhCM0E3LCAweEIzQTksIDB4QjNBQSwgMHhCM0FCLCAweEIzQUQsCisgICAgMHhCM0FFLCAweEIzQUYsIDB4QjNCMCwgMHhCM0IxLCAweEIzQjIsIDB4QjNCMywgMHhCM0I0LCAweEIzQjUsIDB4QjNCNiwKKyAgICAweEIzQjcsIDB4QjNCOCwgMHhCM0I5LCAweEIzQkEsIDB4QjNCQiwgMHhCM0JDLCAweEIzQkQsIDB4QjNCRSwgMHhCM0JGLAorICAgIDB4QjNDMCwgMHhCM0MxLCAweEIzQzIsIDB4QjNDMywgMHhCM0M2LCAweEIzQzcsIDB4QjNDOSwgMHhCM0NBLCAweEIzQ0QsCisgICAgMHhCM0NGLCAweEIzRDEsIDB4QjNEMiwgMHhCM0QzLCAweEIzRDYsIDB4QjNEOCwgMHhCM0RBLCAweEIzREMsIDB4QjNERSwKKyAgICAweEIzREYsIDB4QjNFMSwgMHhCM0UyLCAweEIzRTMsIDB4QjNFNSwgMHhCM0U2LCAweEIzRTcsIDB4QjNFOSwgMHhCM0VBLAorICAgIDB4QjNFQiwgMHhCM0VDLCAweEIzRUQsIDB4QjNFRSwgMHhCM0VGLCAweEIzRjAsIDB4QjNGMSwgMHhCM0YyLCAweEIzRjMsCisgICAgMHhCM0Y0LCAweEIzRjUsIDB4QjNGNiwgMHhCM0Y3LCAweEIzRjgsIDB4QjNGOSwgMHhCM0ZBLCAweEIzRkIsIDB4QjNGRCwKKyAgICAweEIzRkUsIDB4QjNGRiwgMHhCNDAwLCAweEI0MDEsIDB4QjQwMiwgMHhCNDAzLCAweEI0MDQsIDB4QjQwNSwgMHhCNDA2LAorICAgIDB4QjQwNywgMHhCNDA4LCAweEI0MDksIDB4QjQwQSwgMHhCNDBCLCAweEI0MEMsIDB4QjQwRCwgMHhCNDBFLCAweEI0MEYsCisgICAgMHhCNDExLCAweEI0MTIsIDB4QjQxMywgMHhCNDE0LCAweEI0MTUsIDB4QjQxNiwgMHhCNDE3LCAweEI0MTksIDB4QjQxQSwKKyAgICAweEI0MUIsIDB4QjQxRCwgMHhCNDFFLCAweEI0MUYsIDB4QjQyMSwgMHhCNDIyLCAweEI0MjMsIDB4QjQyNCwgMHhCNDI1LAorICAgIDB4QjQyNiwgMHhCNDI3LCAweEI0MkEsIDB4QjQyQywgMHhCNDJELCAweEI0MkUsIDB4QjQyRiwgMHhCNDMwLCAweEI0MzEsCisgICAgMHhCNDMyLCAweEI0MzMsIDB4QjQzNSwgMHhCNDM2LCAweEI0MzcsIDB4QjQzOCwgMHhCNDM5LCAweEI0M0EsIDB4QjQzQiwKKyAgICAweEI0M0MsIDB4QjQzRCwgMHhCNDNFLCAweEI0M0YsIDB4QjQ0MCwgMHhCNDQxLCAweEI0NDIsIDB4QjQ0MywgMHhCNDQ0LAorICAgIDB4QjQ0NSwgMHhCNDQ2LCAweEI0NDcsIDB4QjQ0OCwgMHhCNDQ5LCAweEI0NEEsIDB4QjQ0QiwgMHhCNDRDLCAweEI0NEQsCisgICAgMHhCNDRFLCAweEI0NEYsIDB4QjQ1MiwgMHhCNDUzLCAweEI0NTUsIDB4QjQ1NiwgMHhCNDU3LCAweEI0NTksIDB4QjQ1QSwKKyAgICAweEI0NUIsIDB4QjQ1QywgMHhCNDVELCAweEI0NUUsIDB4QjQ1RiwgMHhCNDYyLCAweEI0NjQsIDB4QjQ2NiwgMHhCNDY3LAorICAgIDB4QjQ2OCwgMHhCNDY5LCAweEI0NkEsIDB4QjQ2QiwgMHhCNDZELCAweEI0NkUsIDB4QjQ2RiwgMHhCNDcwLCAweEI0NzEsCisgICAgMHhCNDcyLCAweEI0NzMsIDB4QjQ3NCwgMHhCNDc1LCAweEI0NzYsIDB4QjQ3NywgMHhCNDc4LCAweEI0NzksIDB4QjQ3QSwKKyAgICAweEI0N0IsIDB4QjQ3QywgMHhCNDdELCAweEI0N0UsIDB4QjQ3RiwgMHhCNDgxLCAweEI0ODIsIDB4QjQ4MywgMHhCNDg0LAorICAgIDB4QjQ4NSwgMHhCNDg2LCAweEI0ODcsIDB4QjQ4OSwgMHhCNDhBLCAweEI0OEIsIDB4QjQ4QywgMHhCNDhELCAweEI0OEUsCisgICAgMHhCNDhGLCAweEI0OTAsIDB4QjQ5MSwgMHhCNDkyLCAweEI0OTMsIDB4QjQ5NCwgMHhCNDk1LCAweEI0OTYsIDB4QjQ5NywKKyAgICAweEI0OTgsIDB4QjQ5OSwgMHhCNDlBLCAweEI0OUIsIDB4QjQ5QywgMHhCNDlFLCAweEI0OUYsIDB4QjRBMCwgMHhCNEExLAorICAgIDB4QjRBMiwgMHhCNEEzLCAweEI0QTUsIDB4QjRBNiwgMHhCNEE3LCAweEI0QTksIDB4QjRBQSwgMHhCNEFCLCAweEI0QUQsCisgICAgMHhCNEFFLCAweEI0QUYsIDB4QjRCMCwgMHhCNEIxLCAweEI0QjIsIDB4QjRCMywgMHhCNEI0LCAweEI0QjYsIDB4QjRCOCwKKyAgICAweEI0QkEsIDB4QjRCQiwgMHhCNEJDLCAweEI0QkQsIDB4QjRCRSwgMHhCNEJGLCAweEI0QzEsIDB4QjRDMiwgMHhCNEMzLAorICAgIDB4QjRDNSwgMHhCNEM2LCAweEI0QzcsIDB4QjRDOSwgMHhCNENBLCAweEI0Q0IsIDB4QjRDQywgMHhCNENELCAweEI0Q0UsCisgICAgMHhCNENGLCAweEI0RDEsIDB4QjREMiwgMHhCNEQzLCAweEI0RDQsIDB4QjRENiwgMHhCNEQ3LCAweEI0RDgsIDB4QjREOSwKKyAgICAweEI0REEsIDB4QjREQiwgMHhCNERFLCAweEI0REYsIDB4QjRFMSwgMHhCNEUyLCAweEI0RTUsIDB4QjRFNywgMHhCNEU4LAorICAgIDB4QjRFOSwgMHhCNEVBLCAweEI0RUIsIDB4QjRFRSwgMHhCNEYwLCAweEI0RjIsIDB4QjRGMywgMHhCNEY0LCAweEI0RjUsCisgICAgMHhCNEY2LCAweEI0RjcsIDB4QjRGOSwgMHhCNEZBLCAweEI0RkIsIDB4QjRGQywgMHhCNEZELCAweEI0RkUsIDB4QjRGRiwKKyAgICAweEI1MDAsIDB4QjUwMSwgMHhCNTAyLCAweEI1MDMsIDB4QjUwNCwgMHhCNTA1LCAweEI1MDYsIDB4QjUwNywgMHhCNTA4LAorICAgIDB4QjUwOSwgMHhCNTBBLCAweEI1MEIsIDB4QjUwQywgMHhCNTBELCAweEI1MEUsIDB4QjUwRiwgMHhCNTEwLCAweEI1MTEsCisgICAgMHhCNTEyLCAweEI1MTMsIDB4QjUxNiwgMHhCNTE3LCAweEI1MTksIDB4QjUxQSwgMHhCNTFELCAweEI1MUUsIDB4QjUxRiwKKyAgICAweEI1MjAsIDB4QjUyMSwgMHhCNTIyLCAweEI1MjMsIDB4QjUyNiwgMHhCNTJCLCAweEI1MkMsIDB4QjUyRCwgMHhCNTJFLAorICAgIDB4QjUyRiwgMHhCNTMyLCAweEI1MzMsIDB4QjUzNSwgMHhCNTM2LCAweEI1MzcsIDB4QjUzOSwgMHhCNTNBLCAweEI1M0IsCisgICAgMHhCNTNDLCAweEI1M0QsIDB4QjUzRSwgMHhCNTNGLCAweEI1NDIsIDB4QjU0NiwgMHhCNTQ3LCAweEI1NDgsIDB4QjU0OSwKKyAgICAweEI1NEEsIDB4QjU0RSwgMHhCNTRGLCAweEI1NTEsIDB4QjU1MiwgMHhCNTUzLCAweEI1NTUsIDB4QjU1NiwgMHhCNTU3LAorICAgIDB4QjU1OCwgMHhCNTU5LCAweEI1NUEsIDB4QjU1QiwgMHhCNTVFLCAweEI1NjIsIDB4QjU2MywgMHhCNTY0LCAweEI1NjUsCisgICAgMHhCNTY2LCAweEI1NjcsIDB4QjU2OCwgMHhCNTY5LCAweEI1NkEsIDB4QjU2QiwgMHhCNTZDLCAweEI1NkQsIDB4QjU2RSwKKyAgICAweEI1NkYsIDB4QjU3MCwgMHhCNTcxLCAweEI1NzIsIDB4QjU3MywgMHhCNTc0LCAweEI1NzUsIDB4QjU3NiwgMHhCNTc3LAorICAgIDB4QjU3OCwgMHhCNTc5LCAweEI1N0EsIDB4QjU3QiwgMHhCNTdDLCAweEI1N0QsIDB4QjU3RSwgMHhCNTdGLCAweEI1ODAsCisgICAgMHhCNTgxLCAweEI1ODIsIDB4QjU4MywgMHhCNTg0LCAweEI1ODUsIDB4QjU4NiwgMHhCNTg3LCAweEI1ODgsIDB4QjU4OSwKKyAgICAweEI1OEEsIDB4QjU4QiwgMHhCNThDLCAweEI1OEQsIDB4QjU4RSwgMHhCNThGLCAweEI1OTAsIDB4QjU5MSwgMHhCNTkyLAorICAgIDB4QjU5MywgMHhCNTk0LCAweEI1OTUsIDB4QjU5NiwgMHhCNTk3LCAweEI1OTgsIDB4QjU5OSwgMHhCNTlBLCAweEI1OUIsCisgICAgMHhCNTlDLCAweEI1OUQsIDB4QjU5RSwgMHhCNTlGLCAweEI1QTIsIDB4QjVBMywgMHhCNUE1LCAweEI1QTYsIDB4QjVBNywKKyAgICAweEI1QTksIDB4QjVBQywgMHhCNUFELCAweEI1QUUsIDB4QjVBRiwgMHhCNUIyLCAweEI1QjYsIDB4QjVCNywgMHhCNUI4LAorICAgIDB4QjVCOSwgMHhCNUJBLCAweEI1QkUsIDB4QjVCRiwgMHhCNUMxLCAweEI1QzIsIDB4QjVDMywgMHhCNUM1LCAweEI1QzYsCisgICAgMHhCNUM3LCAweEI1QzgsIDB4QjVDOSwgMHhCNUNBLCAweEI1Q0IsIDB4QjVDRSwgMHhCNUQyLCAweEI1RDMsIDB4QjVENCwKKyAgICAweEI1RDUsIDB4QjVENiwgMHhCNUQ3LCAweEI1RDksIDB4QjVEQSwgMHhCNURCLCAweEI1REMsIDB4QjVERCwgMHhCNURFLAorICAgIDB4QjVERiwgMHhCNUUwLCAweEI1RTEsIDB4QjVFMiwgMHhCNUUzLCAweEI1RTQsIDB4QjVFNSwgMHhCNUU2LCAweEI1RTcsCisgICAgMHhCNUU4LCAweEI1RTksIDB4QjVFQSwgMHhCNUVCLCAweEI1RUQsIDB4QjVFRSwgMHhCNUVGLCAweEI1RjAsIDB4QjVGMSwKKyAgICAweEI1RjIsIDB4QjVGMywgMHhCNUY0LCAweEI1RjUsIDB4QjVGNiwgMHhCNUY3LCAweEI1RjgsIDB4QjVGOSwgMHhCNUZBLAorICAgIDB4QjVGQiwgMHhCNUZDLCAweEI1RkQsIDB4QjVGRSwgMHhCNUZGLCAweEI2MDAsIDB4QjYwMSwgMHhCNjAyLCAweEI2MDMsCisgICAgMHhCNjA0LCAweEI2MDUsIDB4QjYwNiwgMHhCNjA3LCAweEI2MDgsIDB4QjYwOSwgMHhCNjBBLCAweEI2MEIsIDB4QjYwQywKKyAgICAweEI2MEQsIDB4QjYwRSwgMHhCNjBGLCAweEI2MTIsIDB4QjYxMywgMHhCNjE1LCAweEI2MTYsIDB4QjYxNywgMHhCNjE5LAorICAgIDB4QjYxQSwgMHhCNjFCLCAweEI2MUMsIDB4QjYxRCwgMHhCNjFFLCAweEI2MUYsIDB4QjYyMCwgMHhCNjIxLCAweEI2MjIsCisgICAgMHhCNjIzLCAweEI2MjQsIDB4QjYyNiwgMHhCNjI3LCAweEI2MjgsIDB4QjYyOSwgMHhCNjJBLCAweEI2MkIsIDB4QjYyRCwKKyAgICAweEI2MkUsIDB4QjYyRiwgMHhCNjMwLCAweEI2MzEsIDB4QjYzMiwgMHhCNjMzLCAweEI2MzUsIDB4QjYzNiwgMHhCNjM3LAorICAgIDB4QjYzOCwgMHhCNjM5LCAweEI2M0EsIDB4QjYzQiwgMHhCNjNDLCAweEI2M0QsIDB4QjYzRSwgMHhCNjNGLCAweEI2NDAsCisgICAgMHhCNjQxLCAweEI2NDIsIDB4QjY0MywgMHhCNjQ0LCAweEI2NDUsIDB4QjY0NiwgMHhCNjQ3LCAweEI2NDksIDB4QjY0QSwKKyAgICAweEI2NEIsIDB4QjY0QywgMHhCNjRELCAweEI2NEUsIDB4QjY0RiwgMHhCNjUwLCAweEI2NTEsIDB4QjY1MiwgMHhCNjUzLAorICAgIDB4QjY1NCwgMHhCNjU1LCAweEI2NTYsIDB4QjY1NywgMHhCNjU4LCAweEI2NTksIDB4QjY1QSwgMHhCNjVCLCAweEI2NUMsCisgICAgMHhCNjVELCAweEI2NUUsIDB4QjY1RiwgMHhCNjYwLCAweEI2NjEsIDB4QjY2MiwgMHhCNjYzLCAweEI2NjUsIDB4QjY2NiwKKyAgICAweEI2NjcsIDB4QjY2OSwgMHhCNjZBLCAweEI2NkIsIDB4QjY2QywgMHhCNjZELCAweEI2NkUsIDB4QjY2RiwgMHhCNjcwLAorICAgIDB4QjY3MSwgMHhCNjcyLCAweEI2NzMsIDB4QjY3NCwgMHhCNjc1LCAweEI2NzYsIDB4QjY3NywgMHhCNjc4LCAweEI2NzksCisgICAgMHhCNjdBLCAweEI2N0IsIDB4QjY3QywgMHhCNjdELCAweEI2N0UsIDB4QjY3RiwgMHhCNjgwLCAweEI2ODEsIDB4QjY4MiwKKyAgICAweEI2ODMsIDB4QjY4NCwgMHhCNjg1LCAweEI2ODYsIDB4QjY4NywgMHhCNjg4LCAweEI2ODksIDB4QjY4QSwgMHhCNjhCLAorICAgIDB4QjY4QywgMHhCNjhELCAweEI2OEUsIDB4QjY4RiwgMHhCNjkwLCAweEI2OTEsIDB4QjY5MiwgMHhCNjkzLCAweEI2OTQsCisgICAgMHhCNjk1LCAweEI2OTYsIDB4QjY5NywgMHhCNjk4LCAweEI2OTksIDB4QjY5QSwgMHhCNjlCLCAweEI2OUUsIDB4QjY5RiwKKyAgICAweEI2QTEsIDB4QjZBMiwgMHhCNkEzLCAweEI2QTUsIDB4QjZBNiwgMHhCNkE3LCAweEI2QTgsIDB4QjZBOSwgMHhCNkFBLAorICAgIDB4QjZBRCwgMHhCNkFFLCAweEI2QUYsIDB4QjZCMCwgMHhCNkIyLCAweEI2QjMsIDB4QjZCNCwgMHhCNkI1LCAweEI2QjYsCisgICAgMHhCNkI3LCAweEI2QjgsIDB4QjZCOSwgMHhCNkJBLCAweEI2QkIsIDB4QjZCQywgMHhCNkJELCAweEI2QkUsIDB4QjZCRiwKKyAgICAweEI2QzAsIDB4QjZDMSwgMHhCNkMyLCAweEI2QzMsIDB4QjZDNCwgMHhCNkM1LCAweEI2QzYsIDB4QjZDNywgMHhCNkM4LAorICAgIDB4QjZDOSwgMHhCNkNBLCAweEI2Q0IsIDB4QjZDQywgMHhCNkNELCAweEI2Q0UsIDB4QjZDRiwgMHhCNkQwLCAweEI2RDEsCisgICAgMHhCNkQyLCAweEI2RDMsIDB4QjZENSwgMHhCNkQ2LCAweEI2RDcsIDB4QjZEOCwgMHhCNkQ5LCAweEI2REEsIDB4QjZEQiwKKyAgICAweEI2REMsIDB4QjZERCwgMHhCNkRFLCAweEI2REYsIDB4QjZFMCwgMHhCNkUxLCAweEI2RTIsIDB4QjZFMywgMHhCNkU0LAorICAgIDB4QjZFNSwgMHhCNkU2LCAweEI2RTcsIDB4QjZFOCwgMHhCNkU5LCAweEI2RUEsIDB4QjZFQiwgMHhCNkVDLCAweEI2RUQsCisgICAgMHhCNkVFLCAweEI2RUYsIDB4QjZGMSwgMHhCNkYyLCAweEI2RjMsIDB4QjZGNSwgMHhCNkY2LCAweEI2RjcsIDB4QjZGOSwKKyAgICAweEI2RkEsIDB4QjZGQiwgMHhCNkZDLCAweEI2RkQsIDB4QjZGRSwgMHhCNkZGLCAweEI3MDIsIDB4QjcwMywgMHhCNzA0LAorICAgIDB4QjcwNiwgMHhCNzA3LCAweEI3MDgsIDB4QjcwOSwgMHhCNzBBLCAweEI3MEIsIDB4QjcwQywgMHhCNzBELCAweEI3MEUsCisgICAgMHhCNzBGLCAweEI3MTAsIDB4QjcxMSwgMHhCNzEyLCAweEI3MTMsIDB4QjcxNCwgMHhCNzE1LCAweEI3MTYsIDB4QjcxNywKKyAgICAweEI3MTgsIDB4QjcxOSwgMHhCNzFBLCAweEI3MUIsIDB4QjcxQywgMHhCNzFELCAweEI3MUUsIDB4QjcxRiwgMHhCNzIwLAorICAgIDB4QjcyMSwgMHhCNzIyLCAweEI3MjMsIDB4QjcyNCwgMHhCNzI1LCAweEI3MjYsIDB4QjcyNywgMHhCNzJBLCAweEI3MkIsCisgICAgMHhCNzJELCAweEI3MkUsIDB4QjczMSwgMHhCNzMyLCAweEI3MzMsIDB4QjczNCwgMHhCNzM1LCAweEI3MzYsIDB4QjczNywKKyAgICAweEI3M0EsIDB4QjczQywgMHhCNzNELCAweEI3M0UsIDB4QjczRiwgMHhCNzQwLCAweEI3NDEsIDB4Qjc0MiwgMHhCNzQzLAorICAgIDB4Qjc0NSwgMHhCNzQ2LCAweEI3NDcsIDB4Qjc0OSwgMHhCNzRBLCAweEI3NEIsIDB4Qjc0RCwgMHhCNzRFLCAweEI3NEYsCisgICAgMHhCNzUwLCAweEI3NTEsIDB4Qjc1MiwgMHhCNzUzLCAweEI3NTYsIDB4Qjc1NywgMHhCNzU4LCAweEI3NTksIDB4Qjc1QSwKKyAgICAweEI3NUIsIDB4Qjc1QywgMHhCNzVELCAweEI3NUUsIDB4Qjc1RiwgMHhCNzYxLCAweEI3NjIsIDB4Qjc2MywgMHhCNzY1LAorICAgIDB4Qjc2NiwgMHhCNzY3LCAweEI3NjksIDB4Qjc2QSwgMHhCNzZCLCAweEI3NkMsIDB4Qjc2RCwgMHhCNzZFLCAweEI3NkYsCisgICAgMHhCNzcyLCAweEI3NzQsIDB4Qjc3NiwgMHhCNzc3LCAweEI3NzgsIDB4Qjc3OSwgMHhCNzdBLCAweEI3N0IsIDB4Qjc3RSwKKyAgICAweEI3N0YsIDB4Qjc4MSwgMHhCNzgyLCAweEI3ODMsIDB4Qjc4NSwgMHhCNzg2LCAweEI3ODcsIDB4Qjc4OCwgMHhCNzg5LAorICAgIDB4Qjc4QSwgMHhCNzhCLCAweEI3OEUsIDB4Qjc5MywgMHhCNzk0LCAweEI3OTUsIDB4Qjc5QSwgMHhCNzlCLCAweEI3OUQsCisgICAgMHhCNzlFLCAweEI3OUYsIDB4QjdBMSwgMHhCN0EyLCAweEI3QTMsIDB4QjdBNCwgMHhCN0E1LCAweEI3QTYsIDB4QjdBNywKKyAgICAweEI3QUEsIDB4QjdBRSwgMHhCN0FGLCAweEI3QjAsIDB4QjdCMSwgMHhCN0IyLCAweEI3QjMsIDB4QjdCNiwgMHhCN0I3LAorICAgIDB4QjdCOSwgMHhCN0JBLCAweEI3QkIsIDB4QjdCQywgMHhCN0JELCAweEI3QkUsIDB4QjdCRiwgMHhCN0MwLCAweEI3QzEsCisgICAgMHhCN0MyLCAweEI3QzMsIDB4QjdDNCwgMHhCN0M1LCAweEI3QzYsIDB4QjdDOCwgMHhCN0NBLCAweEI3Q0IsIDB4QjdDQywKKyAgICAweEI3Q0QsIDB4QjdDRSwgMHhCN0NGLCAweEI3RDAsIDB4QjdEMSwgMHhCN0QyLCAweEI3RDMsIDB4QjdENCwgMHhCN0Q1LAorICAgIDB4QjdENiwgMHhCN0Q3LCAweEI3RDgsIDB4QjdEOSwgMHhCN0RBLCAweEI3REIsIDB4QjdEQywgMHhCN0RELCAweEI3REUsCisgICAgMHhCN0RGLCAweEI3RTAsIDB4QjdFMSwgMHhCN0UyLCAweEI3RTMsIDB4QjdFNCwgMHhCN0U1LCAweEI3RTYsIDB4QjdFNywKKyAgICAweEI3RTgsIDB4QjdFOSwgMHhCN0VBLCAweEI3RUIsIDB4QjdFRSwgMHhCN0VGLCAweEI3RjEsIDB4QjdGMiwgMHhCN0YzLAorICAgIDB4QjdGNSwgMHhCN0Y2LCAweEI3RjcsIDB4QjdGOCwgMHhCN0Y5LCAweEI3RkEsIDB4QjdGQiwgMHhCN0ZFLCAweEI4MDIsCisgICAgMHhCODAzLCAweEI4MDQsIDB4QjgwNSwgMHhCODA2LCAweEI4MEEsIDB4QjgwQiwgMHhCODBELCAweEI4MEUsIDB4QjgwRiwKKyAgICAweEI4MTEsIDB4QjgxMiwgMHhCODEzLCAweEI4MTQsIDB4QjgxNSwgMHhCODE2LCAweEI4MTcsIDB4QjgxQSwgMHhCODFDLAorICAgIDB4QjgxRSwgMHhCODFGLCAweEI4MjAsIDB4QjgyMSwgMHhCODIyLCAweEI4MjMsIDB4QjgyNiwgMHhCODI3LCAweEI4MjksCisgICAgMHhCODJBLCAweEI4MkIsIDB4QjgyRCwgMHhCODJFLCAweEI4MkYsIDB4QjgzMCwgMHhCODMxLCAweEI4MzIsIDB4QjgzMywKKyAgICAweEI4MzYsIDB4QjgzQSwgMHhCODNCLCAweEI4M0MsIDB4QjgzRCwgMHhCODNFLCAweEI4M0YsIDB4Qjg0MSwgMHhCODQyLAorICAgIDB4Qjg0MywgMHhCODQ1LCAweEI4NDYsIDB4Qjg0NywgMHhCODQ4LCAweEI4NDksIDB4Qjg0QSwgMHhCODRCLCAweEI4NEMsCisgICAgMHhCODRELCAweEI4NEUsIDB4Qjg0RiwgMHhCODUwLCAweEI4NTIsIDB4Qjg1NCwgMHhCODU1LCAweEI4NTYsIDB4Qjg1NywKKyAgICAweEI4NTgsIDB4Qjg1OSwgMHhCODVBLCAweEI4NUIsIDB4Qjg1RSwgMHhCODVGLCAweEI4NjEsIDB4Qjg2MiwgMHhCODYzLAorICAgIDB4Qjg2NSwgMHhCODY2LCAweEI4NjcsIDB4Qjg2OCwgMHhCODY5LCAweEI4NkEsIDB4Qjg2QiwgMHhCODZFLCAweEI4NzAsCisgICAgMHhCODcyLCAweEI4NzMsIDB4Qjg3NCwgMHhCODc1LCAweEI4NzYsIDB4Qjg3NywgMHhCODc5LCAweEI4N0EsIDB4Qjg3QiwKKyAgICAweEI4N0QsIDB4Qjg3RSwgMHhCODdGLCAweEI4ODAsIDB4Qjg4MSwgMHhCODgyLCAweEI4ODMsIDB4Qjg4NCwgMHhCODg1LAorICAgIDB4Qjg4NiwgMHhCODg3LCAweEI4ODgsIDB4Qjg4OSwgMHhCODhBLCAweEI4OEIsIDB4Qjg4QywgMHhCODhFLCAweEI4OEYsCisgICAgMHhCODkwLCAweEI4OTEsIDB4Qjg5MiwgMHhCODkzLCAweEI4OTQsIDB4Qjg5NSwgMHhCODk2LCAweEI4OTcsIDB4Qjg5OCwKKyAgICAweEI4OTksIDB4Qjg5QSwgMHhCODlCLCAweEI4OUMsIDB4Qjg5RCwgMHhCODlFLCAweEI4OUYsIDB4QjhBMCwgMHhCOEExLAorICAgIDB4QjhBMiwgMHhCOEEzLCAweEI4QTQsIDB4QjhBNSwgMHhCOEE2LCAweEI4QTcsIDB4QjhBOSwgMHhCOEFBLCAweEI4QUIsCisgICAgMHhCOEFDLCAweEI4QUQsIDB4QjhBRSwgMHhCOEFGLCAweEI4QjEsIDB4QjhCMiwgMHhCOEIzLCAweEI4QjUsIDB4QjhCNiwKKyAgICAweEI4QjcsIDB4QjhCOSwgMHhCOEJBLCAweEI4QkIsIDB4QjhCQywgMHhCOEJELCAweEI4QkUsIDB4QjhCRiwgMHhCOEMyLAorICAgIDB4QjhDNCwgMHhCOEM2LCAweEI4QzcsIDB4QjhDOCwgMHhCOEM5LCAweEI4Q0EsIDB4QjhDQiwgMHhCOENELCAweEI4Q0UsCisgICAgMHhCOENGLCAweEI4RDEsIDB4QjhEMiwgMHhCOEQzLCAweEI4RDUsIDB4QjhENiwgMHhCOEQ3LCAweEI4RDgsIDB4QjhEOSwKKyAgICAweEI4REEsIDB4QjhEQiwgMHhCOERDLCAweEI4REUsIDB4QjhFMCwgMHhCOEUyLCAweEI4RTMsIDB4QjhFNCwgMHhCOEU1LAorICAgIDB4QjhFNiwgMHhCOEU3LCAweEI4RUEsIDB4QjhFQiwgMHhCOEVELCAweEI4RUUsIDB4QjhFRiwgMHhCOEYxLCAweEI4RjIsCisgICAgMHhCOEYzLCAweEI4RjQsIDB4QjhGNSwgMHhCOEY2LCAweEI4RjcsIDB4QjhGQSwgMHhCOEZDLCAweEI4RkUsIDB4QjhGRiwKKyAgICAweEI5MDAsIDB4QjkwMSwgMHhCOTAyLCAweEI5MDMsIDB4QjkwNSwgMHhCOTA2LCAweEI5MDcsIDB4QjkwOCwgMHhCOTA5LAorICAgIDB4QjkwQSwgMHhCOTBCLCAweEI5MEMsIDB4QjkwRCwgMHhCOTBFLCAweEI5MEYsIDB4QjkxMCwgMHhCOTExLCAweEI5MTIsCisgICAgMHhCOTEzLCAweEI5MTQsIDB4QjkxNSwgMHhCOTE2LCAweEI5MTcsIDB4QjkxOSwgMHhCOTFBLCAweEI5MUIsIDB4QjkxQywKKyAgICAweEI5MUQsIDB4QjkxRSwgMHhCOTFGLCAweEI5MjEsIDB4QjkyMiwgMHhCOTIzLCAweEI5MjQsIDB4QjkyNSwgMHhCOTI2LAorICAgIDB4QjkyNywgMHhCOTI4LCAweEI5MjksIDB4QjkyQSwgMHhCOTJCLCAweEI5MkMsIDB4QjkyRCwgMHhCOTJFLCAweEI5MkYsCisgICAgMHhCOTMwLCAweEI5MzEsIDB4QjkzMiwgMHhCOTMzLCAweEI5MzQsIDB4QjkzNSwgMHhCOTM2LCAweEI5MzcsIDB4QjkzOCwKKyAgICAweEI5MzksIDB4QjkzQSwgMHhCOTNCLCAweEI5M0UsIDB4QjkzRiwgMHhCOTQxLCAweEI5NDIsIDB4Qjk0MywgMHhCOTQ1LAorICAgIDB4Qjk0NiwgMHhCOTQ3LCAweEI5NDgsIDB4Qjk0OSwgMHhCOTRBLCAweEI5NEIsIDB4Qjk0RCwgMHhCOTRFLCAweEI5NTAsCisgICAgMHhCOTUyLCAweEI5NTMsIDB4Qjk1NCwgMHhCOTU1LCAweEI5NTYsIDB4Qjk1NywgMHhCOTVBLCAweEI5NUIsIDB4Qjk1RCwKKyAgICAweEI5NUUsIDB4Qjk1RiwgMHhCOTYxLCAweEI5NjIsIDB4Qjk2MywgMHhCOTY0LCAweEI5NjUsIDB4Qjk2NiwgMHhCOTY3LAorICAgIDB4Qjk2QSwgMHhCOTZDLCAweEI5NkUsIDB4Qjk2RiwgMHhCOTcwLCAweEI5NzEsIDB4Qjk3MiwgMHhCOTczLCAweEI5NzYsCisgICAgMHhCOTc3LCAweEI5NzksIDB4Qjk3QSwgMHhCOTdCLCAweEI5N0QsIDB4Qjk3RSwgMHhCOTdGLCAweEI5ODAsIDB4Qjk4MSwKKyAgICAweEI5ODIsIDB4Qjk4MywgMHhCOTg2LCAweEI5ODgsIDB4Qjk4QiwgMHhCOThDLCAweEI5OEYsIDB4Qjk5MCwgMHhCOTkxLAorICAgIDB4Qjk5MiwgMHhCOTkzLCAweEI5OTQsIDB4Qjk5NSwgMHhCOTk2LCAweEI5OTcsIDB4Qjk5OCwgMHhCOTk5LCAweEI5OUEsCisgICAgMHhCOTlCLCAweEI5OUMsIDB4Qjk5RCwgMHhCOTlFLCAweEI5OUYsIDB4QjlBMCwgMHhCOUExLCAweEI5QTIsIDB4QjlBMywKKyAgICAweEI5QTQsIDB4QjlBNSwgMHhCOUE2LCAweEI5QTcsIDB4QjlBOCwgMHhCOUE5LCAweEI5QUEsIDB4QjlBQiwgMHhCOUFFLAorICAgIDB4QjlBRiwgMHhCOUIxLCAweEI5QjIsIDB4QjlCMywgMHhCOUI1LCAweEI5QjYsIDB4QjlCNywgMHhCOUI4LCAweEI5QjksCisgICAgMHhCOUJBLCAweEI5QkIsIDB4QjlCRSwgMHhCOUMwLCAweEI5QzIsIDB4QjlDMywgMHhCOUM0LCAweEI5QzUsIDB4QjlDNiwKKyAgICAweEI5QzcsIDB4QjlDQSwgMHhCOUNCLCAweEI5Q0QsIDB4QjlEMywgMHhCOUQ0LCAweEI5RDUsIDB4QjlENiwgMHhCOUQ3LAorICAgIDB4QjlEQSwgMHhCOURDLCAweEI5REYsIDB4QjlFMCwgMHhCOUUyLCAweEI5RTYsIDB4QjlFNywgMHhCOUU5LCAweEI5RUEsCisgICAgMHhCOUVCLCAweEI5RUQsIDB4QjlFRSwgMHhCOUVGLCAweEI5RjAsIDB4QjlGMSwgMHhCOUYyLCAweEI5RjMsIDB4QjlGNiwKKyAgICAweEI5RkIsIDB4QjlGQywgMHhCOUZELCAweEI5RkUsIDB4QjlGRiwgMHhCQTAyLCAweEJBMDMsIDB4QkEwNCwgMHhCQTA1LAorICAgIDB4QkEwNiwgMHhCQTA3LCAweEJBMDksIDB4QkEwQSwgMHhCQTBCLCAweEJBMEMsIDB4QkEwRCwgMHhCQTBFLCAweEJBMEYsCisgICAgMHhCQTEwLCAweEJBMTEsIDB4QkExMiwgMHhCQTEzLCAweEJBMTQsIDB4QkExNiwgMHhCQTE3LCAweEJBMTgsIDB4QkExOSwKKyAgICAweEJBMUEsIDB4QkExQiwgMHhCQTFDLCAweEJBMUQsIDB4QkExRSwgMHhCQTFGLCAweEJBMjAsIDB4QkEyMSwgMHhCQTIyLAorICAgIDB4QkEyMywgMHhCQTI0LCAweEJBMjUsIDB4QkEyNiwgMHhCQTI3LCAweEJBMjgsIDB4QkEyOSwgMHhCQTJBLCAweEJBMkIsCisgICAgMHhCQTJDLCAweEJBMkQsIDB4QkEyRSwgMHhCQTJGLCAweEJBMzAsIDB4QkEzMSwgMHhCQTMyLCAweEJBMzMsIDB4QkEzNCwKKyAgICAweEJBMzUsIDB4QkEzNiwgMHhCQTM3LCAweEJBM0EsIDB4QkEzQiwgMHhCQTNELCAweEJBM0UsIDB4QkEzRiwgMHhCQTQxLAorICAgIDB4QkE0MywgMHhCQTQ0LCAweEJBNDUsIDB4QkE0NiwgMHhCQTQ3LCAweEJBNEEsIDB4QkE0QywgMHhCQTRGLCAweEJBNTAsCisgICAgMHhCQTUxLCAweEJBNTIsIDB4QkE1NiwgMHhCQTU3LCAweEJBNTksIDB4QkE1QSwgMHhCQTVCLCAweEJBNUQsIDB4QkE1RSwKKyAgICAweEJBNUYsIDB4QkE2MCwgMHhCQTYxLCAweEJBNjIsIDB4QkE2MywgMHhCQTY2LCAweEJBNkEsIDB4QkE2QiwgMHhCQTZDLAorICAgIDB4QkE2RCwgMHhCQTZFLCAweEJBNkYsIDB4QkE3MiwgMHhCQTczLCAweEJBNzUsIDB4QkE3NiwgMHhCQTc3LCAweEJBNzksCisgICAgMHhCQTdBLCAweEJBN0IsIDB4QkE3QywgMHhCQTdELCAweEJBN0UsIDB4QkE3RiwgMHhCQTgwLCAweEJBODEsIDB4QkE4MiwKKyAgICAweEJBODYsIDB4QkE4OCwgMHhCQTg5LCAweEJBOEEsIDB4QkE4QiwgMHhCQThELCAweEJBOEUsIDB4QkE4RiwgMHhCQTkwLAorICAgIDB4QkE5MSwgMHhCQTkyLCAweEJBOTMsIDB4QkE5NCwgMHhCQTk1LCAweEJBOTYsIDB4QkE5NywgMHhCQTk4LCAweEJBOTksCisgICAgMHhCQTlBLCAweEJBOUIsIDB4QkE5QywgMHhCQTlELCAweEJBOUUsIDB4QkE5RiwgMHhCQUEwLCAweEJBQTEsIDB4QkFBMiwKKyAgICAweEJBQTMsIDB4QkFBNCwgMHhCQUE1LCAweEJBQTYsIDB4QkFBNywgMHhCQUFBLCAweEJBQUQsIDB4QkFBRSwgMHhCQUFGLAorICAgIDB4QkFCMSwgMHhCQUIzLCAweEJBQjQsIDB4QkFCNSwgMHhCQUI2LCAweEJBQjcsIDB4QkFCQSwgMHhCQUJDLCAweEJBQkUsCisgICAgMHhCQUJGLCAweEJBQzAsIDB4QkFDMSwgMHhCQUMyLCAweEJBQzMsIDB4QkFDNSwgMHhCQUM2LCAweEJBQzcsIDB4QkFDOSwKKyAgICAweEJBQ0EsIDB4QkFDQiwgMHhCQUNDLCAweEJBQ0QsIDB4QkFDRSwgMHhCQUNGLCAweEJBRDAsIDB4QkFEMSwgMHhCQUQyLAorICAgIDB4QkFEMywgMHhCQUQ0LCAweEJBRDUsIDB4QkFENiwgMHhCQUQ3LCAweEJBREEsIDB4QkFEQiwgMHhCQURDLCAweEJBREQsCisgICAgMHhCQURFLCAweEJBREYsIDB4QkFFMCwgMHhCQUUxLCAweEJBRTIsIDB4QkFFMywgMHhCQUU0LCAweEJBRTUsIDB4QkFFNiwKKyAgICAweEJBRTcsIDB4QkFFOCwgMHhCQUU5LCAweEJBRUEsIDB4QkFFQiwgMHhCQUVDLCAweEJBRUQsIDB4QkFFRSwgMHhCQUVGLAorICAgIDB4QkFGMCwgMHhCQUYxLCAweEJBRjIsIDB4QkFGMywgMHhCQUY0LCAweEJBRjUsIDB4QkFGNiwgMHhCQUY3LCAweEJBRjgsCisgICAgMHhCQUY5LCAweEJBRkEsIDB4QkFGQiwgMHhCQUZELCAweEJBRkUsIDB4QkFGRiwgMHhCQjAxLCAweEJCMDIsIDB4QkIwMywKKyAgICAweEJCMDUsIDB4QkIwNiwgMHhCQjA3LCAweEJCMDgsIDB4QkIwOSwgMHhCQjBBLCAweEJCMEIsIDB4QkIwQywgMHhCQjBFLAorICAgIDB4QkIxMCwgMHhCQjEyLCAweEJCMTMsIDB4QkIxNCwgMHhCQjE1LCAweEJCMTYsIDB4QkIxNywgMHhCQjE5LCAweEJCMUEsCisgICAgMHhCQjFCLCAweEJCMUQsIDB4QkIxRSwgMHhCQjFGLCAweEJCMjEsIDB4QkIyMiwgMHhCQjIzLCAweEJCMjQsIDB4QkIyNSwKKyAgICAweEJCMjYsIDB4QkIyNywgMHhCQjI4LCAweEJCMkEsIDB4QkIyQywgMHhCQjJELCAweEJCMkUsIDB4QkIyRiwgMHhCQjMwLAorICAgIDB4QkIzMSwgMHhCQjMyLCAweEJCMzMsIDB4QkIzNywgMHhCQjM5LCAweEJCM0EsIDB4QkIzRiwgMHhCQjQwLCAweEJCNDEsCisgICAgMHhCQjQyLCAweEJCNDMsIDB4QkI0NiwgMHhCQjQ4LCAweEJCNEEsIDB4QkI0QiwgMHhCQjRDLCAweEJCNEUsIDB4QkI1MSwKKyAgICAweEJCNTIsIDB4QkI1MywgMHhCQjU1LCAweEJCNTYsIDB4QkI1NywgMHhCQjU5LCAweEJCNUEsIDB4QkI1QiwgMHhCQjVDLAorICAgIDB4QkI1RCwgMHhCQjVFLCAweEJCNUYsIDB4QkI2MCwgMHhCQjYyLCAweEJCNjQsIDB4QkI2NSwgMHhCQjY2LCAweEJCNjcsCisgICAgMHhCQjY4LCAweEJCNjksIDB4QkI2QSwgMHhCQjZCLCAweEJCNkQsIDB4QkI2RSwgMHhCQjZGLCAweEJCNzAsIDB4QkI3MSwKKyAgICAweEJCNzIsIDB4QkI3MywgMHhCQjc0LCAweEJCNzUsIDB4QkI3NiwgMHhCQjc3LCAweEJCNzgsIDB4QkI3OSwgMHhCQjdBLAorICAgIDB4QkI3QiwgMHhCQjdDLCAweEJCN0QsIDB4QkI3RSwgMHhCQjdGLCAweEJCODAsIDB4QkI4MSwgMHhCQjgyLCAweEJCODMsCisgICAgMHhCQjg0LCAweEJCODUsIDB4QkI4NiwgMHhCQjg3LCAweEJCODksIDB4QkI4QSwgMHhCQjhCLCAweEJCOEQsIDB4QkI4RSwKKyAgICAweEJCOEYsIDB4QkI5MSwgMHhCQjkyLCAweEJCOTMsIDB4QkI5NCwgMHhCQjk1LCAweEJCOTYsIDB4QkI5NywgMHhCQjk4LAorICAgIDB4QkI5OSwgMHhCQjlBLCAweEJCOUIsIDB4QkI5QywgMHhCQjlELCAweEJCOUUsIDB4QkI5RiwgMHhCQkEwLCAweEJCQTEsCisgICAgMHhCQkEyLCAweEJCQTMsIDB4QkJBNSwgMHhCQkE2LCAweEJCQTcsIDB4QkJBOSwgMHhCQkFBLCAweEJCQUIsIDB4QkJBRCwKKyAgICAweEJCQUUsIDB4QkJBRiwgMHhCQkIwLCAweEJCQjEsIDB4QkJCMiwgMHhCQkIzLCAweEJCQjUsIDB4QkJCNiwgMHhCQkI4LAorICAgIDB4QkJCOSwgMHhCQkJBLCAweEJCQkIsIDB4QkJCQywgMHhCQkJELCAweEJCQkUsIDB4QkJCRiwgMHhCQkMxLCAweEJCQzIsCisgICAgMHhCQkMzLCAweEJCQzUsIDB4QkJDNiwgMHhCQkM3LCAweEJCQzksIDB4QkJDQSwgMHhCQkNCLCAweEJCQ0MsIDB4QkJDRCwKKyAgICAweEJCQ0UsIDB4QkJDRiwgMHhCQkQxLCAweEJCRDIsIDB4QkJENCwgMHhCQkQ1LCAweEJCRDYsIDB4QkJENywgMHhCQkQ4LAorICAgIDB4QkJEOSwgMHhCQkRBLCAweEJCREIsIDB4QkJEQywgMHhCQkRELCAweEJCREUsIDB4QkJERiwgMHhCQkUwLCAweEJCRTEsCisgICAgMHhCQkUyLCAweEJCRTMsIDB4QkJFNCwgMHhCQkU1LCAweEJCRTYsIDB4QkJFNywgMHhCQkU4LCAweEJCRTksIDB4QkJFQSwKKyAgICAweEJCRUIsIDB4QkJFQywgMHhCQkVELCAweEJCRUUsIDB4QkJFRiwgMHhCQkYwLCAweEJCRjEsIDB4QkJGMiwgMHhCQkYzLAorICAgIDB4QkJGNCwgMHhCQkY1LCAweEJCRjYsIDB4QkJGNywgMHhCQkZBLCAweEJCRkIsIDB4QkJGRCwgMHhCQkZFLCAweEJDMDEsCisgICAgMHhCQzAzLCAweEJDMDQsIDB4QkMwNSwgMHhCQzA2LCAweEJDMDcsIDB4QkMwQSwgMHhCQzBFLCAweEJDMTAsIDB4QkMxMiwKKyAgICAweEJDMTMsIDB4QkMxOSwgMHhCQzFBLCAweEJDMjAsIDB4QkMyMSwgMHhCQzIyLCAweEJDMjMsIDB4QkMyNiwgMHhCQzI4LAorICAgIDB4QkMyQSwgMHhCQzJCLCAweEJDMkMsIDB4QkMyRSwgMHhCQzJGLCAweEJDMzIsIDB4QkMzMywgMHhCQzM1LCAweEJDMzYsCisgICAgMHhCQzM3LCAweEJDMzksIDB4QkMzQSwgMHhCQzNCLCAweEJDM0MsIDB4QkMzRCwgMHhCQzNFLCAweEJDM0YsIDB4QkM0MiwKKyAgICAweEJDNDYsIDB4QkM0NywgMHhCQzQ4LCAweEJDNEEsIDB4QkM0QiwgMHhCQzRFLCAweEJDNEYsIDB4QkM1MSwgMHhCQzUyLAorICAgIDB4QkM1MywgMHhCQzU0LCAweEJDNTUsIDB4QkM1NiwgMHhCQzU3LCAweEJDNTgsIDB4QkM1OSwgMHhCQzVBLCAweEJDNUIsCisgICAgMHhCQzVDLCAweEJDNUUsIDB4QkM1RiwgMHhCQzYwLCAweEJDNjEsIDB4QkM2MiwgMHhCQzYzLCAweEJDNjQsIDB4QkM2NSwKKyAgICAweEJDNjYsIDB4QkM2NywgMHhCQzY4LCAweEJDNjksIDB4QkM2QSwgMHhCQzZCLCAweEJDNkMsIDB4QkM2RCwgMHhCQzZFLAorICAgIDB4QkM2RiwgMHhCQzcwLCAweEJDNzEsIDB4QkM3MiwgMHhCQzczLCAweEJDNzQsIDB4QkM3NSwgMHhCQzc2LCAweEJDNzcsCisgICAgMHhCQzc4LCAweEJDNzksIDB4QkM3QSwgMHhCQzdCLCAweEJDN0MsIDB4QkM3RCwgMHhCQzdFLCAweEJDN0YsIDB4QkM4MCwKKyAgICAweEJDODEsIDB4QkM4MiwgMHhCQzgzLCAweEJDODYsIDB4QkM4NywgMHhCQzg5LCAweEJDOEEsIDB4QkM4RCwgMHhCQzhGLAorICAgIDB4QkM5MCwgMHhCQzkxLCAweEJDOTIsIDB4QkM5MywgMHhCQzk2LCAweEJDOTgsIDB4QkM5QiwgMHhCQzlDLCAweEJDOUQsCisgICAgMHhCQzlFLCAweEJDOUYsIDB4QkNBMiwgMHhCQ0EzLCAweEJDQTUsIDB4QkNBNiwgMHhCQ0E5LCAweEJDQUEsIDB4QkNBQiwKKyAgICAweEJDQUMsIDB4QkNBRCwgMHhCQ0FFLCAweEJDQUYsIDB4QkNCMiwgMHhCQ0I2LCAweEJDQjcsIDB4QkNCOCwgMHhCQ0I5LAorICAgIDB4QkNCQSwgMHhCQ0JCLCAweEJDQkUsIDB4QkNCRiwgMHhCQ0MxLCAweEJDQzIsIDB4QkNDMywgMHhCQ0M1LCAweEJDQzYsCisgICAgMHhCQ0M3LCAweEJDQzgsIDB4QkNDOSwgMHhCQ0NBLCAweEJDQ0IsIDB4QkNDQywgMHhCQ0NFLCAweEJDRDIsIDB4QkNEMywKKyAgICAweEJDRDQsIDB4QkNENiwgMHhCQ0Q3LCAweEJDRDksIDB4QkNEQSwgMHhCQ0RCLCAweEJDREQsIDB4QkNERSwgMHhCQ0RGLAorICAgIDB4QkNFMCwgMHhCQ0UxLCAweEJDRTIsIDB4QkNFMywgMHhCQ0U0LCAweEJDRTUsIDB4QkNFNiwgMHhCQ0U3LCAweEJDRTgsCisgICAgMHhCQ0U5LCAweEJDRUEsIDB4QkNFQiwgMHhCQ0VDLCAweEJDRUQsIDB4QkNFRSwgMHhCQ0VGLCAweEJDRjAsIDB4QkNGMSwKKyAgICAweEJDRjIsIDB4QkNGMywgMHhCQ0Y3LCAweEJDRjksIDB4QkNGQSwgMHhCQ0ZCLCAweEJDRkQsIDB4QkNGRSwgMHhCQ0ZGLAorICAgIDB4QkQwMCwgMHhCRDAxLCAweEJEMDIsIDB4QkQwMywgMHhCRDA2LCAweEJEMDgsIDB4QkQwQSwgMHhCRDBCLCAweEJEMEMsCisgICAgMHhCRDBELCAweEJEMEUsIDB4QkQwRiwgMHhCRDExLCAweEJEMTIsIDB4QkQxMywgMHhCRDE1LCAweEJEMTYsIDB4QkQxNywKKyAgICAweEJEMTgsIDB4QkQxOSwgMHhCRDFBLCAweEJEMUIsIDB4QkQxQywgMHhCRDFELCAweEJEMUUsIDB4QkQxRiwgMHhCRDIwLAorICAgIDB4QkQyMSwgMHhCRDIyLCAweEJEMjMsIDB4QkQyNSwgMHhCRDI2LCAweEJEMjcsIDB4QkQyOCwgMHhCRDI5LCAweEJEMkEsCisgICAgMHhCRDJCLCAweEJEMkQsIDB4QkQyRSwgMHhCRDJGLCAweEJEMzAsIDB4QkQzMSwgMHhCRDMyLCAweEJEMzMsIDB4QkQzNCwKKyAgICAweEJEMzUsIDB4QkQzNiwgMHhCRDM3LCAweEJEMzgsIDB4QkQzOSwgMHhCRDNBLCAweEJEM0IsIDB4QkQzQywgMHhCRDNELAorICAgIDB4QkQzRSwgMHhCRDNGLCAweEJENDEsIDB4QkQ0MiwgMHhCRDQzLCAweEJENDQsIDB4QkQ0NSwgMHhCRDQ2LCAweEJENDcsCisgICAgMHhCRDRBLCAweEJENEIsIDB4QkQ0RCwgMHhCRDRFLCAweEJENEYsIDB4QkQ1MSwgMHhCRDUyLCAweEJENTMsIDB4QkQ1NCwKKyAgICAweEJENTUsIDB4QkQ1NiwgMHhCRDU3LCAweEJENUEsIDB4QkQ1QiwgMHhCRDVDLCAweEJENUQsIDB4QkQ1RSwgMHhCRDVGLAorICAgIDB4QkQ2MCwgMHhCRDYxLCAweEJENjIsIDB4QkQ2MywgMHhCRDY1LCAweEJENjYsIDB4QkQ2NywgMHhCRDY5LCAweEJENkEsCisgICAgMHhCRDZCLCAweEJENkMsIDB4QkQ2RCwgMHhCRDZFLCAweEJENkYsIDB4QkQ3MCwgMHhCRDcxLCAweEJENzIsIDB4QkQ3MywKKyAgICAweEJENzQsIDB4QkQ3NSwgMHhCRDc2LCAweEJENzcsIDB4QkQ3OCwgMHhCRDc5LCAweEJEN0EsIDB4QkQ3QiwgMHhCRDdDLAorICAgIDB4QkQ3RCwgMHhCRDdFLCAweEJEN0YsIDB4QkQ4MiwgMHhCRDgzLCAweEJEODUsIDB4QkQ4NiwgMHhCRDhCLCAweEJEOEMsCisgICAgMHhCRDhELCAweEJEOEUsIDB4QkQ4RiwgMHhCRDkyLCAweEJEOTQsIDB4QkQ5NiwgMHhCRDk3LCAweEJEOTgsIDB4QkQ5QiwKKyAgICAweEJEOUQsIDB4QkQ5RSwgMHhCRDlGLCAweEJEQTAsIDB4QkRBMSwgMHhCREEyLCAweEJEQTMsIDB4QkRBNSwgMHhCREE2LAorICAgIDB4QkRBNywgMHhCREE4LCAweEJEQTksIDB4QkRBQSwgMHhCREFCLCAweEJEQUMsIDB4QkRBRCwgMHhCREFFLCAweEJEQUYsCisgICAgMHhCREIxLCAweEJEQjIsIDB4QkRCMywgMHhCREI0LCAweEJEQjUsIDB4QkRCNiwgMHhCREI3LCAweEJEQjksIDB4QkRCQSwKKyAgICAweEJEQkIsIDB4QkRCQywgMHhCREJELCAweEJEQkUsIDB4QkRCRiwgMHhCREMwLCAweEJEQzEsIDB4QkRDMiwgMHhCREMzLAorICAgIDB4QkRDNCwgMHhCREM1LCAweEJEQzYsIDB4QkRDNywgMHhCREM4LCAweEJEQzksIDB4QkRDQSwgMHhCRENCLCAweEJEQ0MsCisgICAgMHhCRENELCAweEJEQ0UsIDB4QkRDRiwgMHhCREQwLCAweEJERDEsIDB4QkREMiwgMHhCREQzLCAweEJERDYsIDB4QkRENywKKyAgICAweEJERDksIDB4QkREQSwgMHhCRERCLCAweEJEREQsIDB4QkRERSwgMHhCRERGLCAweEJERTAsIDB4QkRFMSwgMHhCREUyLAorICAgIDB4QkRFMywgMHhCREU0LCAweEJERTUsIDB4QkRFNiwgMHhCREU3LCAweEJERTgsIDB4QkRFQSwgMHhCREVCLCAweEJERUMsCisgICAgMHhCREVELCAweEJERUUsIDB4QkRFRiwgMHhCREYxLCAweEJERjIsIDB4QkRGMywgMHhCREY1LCAweEJERjYsIDB4QkRGNywKKyAgICAweEJERjksIDB4QkRGQSwgMHhCREZCLCAweEJERkMsIDB4QkRGRCwgMHhCREZFLCAweEJERkYsIDB4QkUwMSwgMHhCRTAyLAorICAgIDB4QkUwNCwgMHhCRTA2LCAweEJFMDcsIDB4QkUwOCwgMHhCRTA5LCAweEJFMEEsIDB4QkUwQiwgMHhCRTBFLCAweEJFMEYsCisgICAgMHhCRTExLCAweEJFMTIsIDB4QkUxMywgMHhCRTE1LCAweEJFMTYsIDB4QkUxNywgMHhCRTE4LCAweEJFMTksIDB4QkUxQSwKKyAgICAweEJFMUIsIDB4QkUxRSwgMHhCRTIwLCAweEJFMjEsIDB4QkUyMiwgMHhCRTIzLCAweEJFMjQsIDB4QkUyNSwgMHhCRTI2LAorICAgIDB4QkUyNywgMHhCRTI4LCAweEJFMjksIDB4QkUyQSwgMHhCRTJCLCAweEJFMkMsIDB4QkUyRCwgMHhCRTJFLCAweEJFMkYsCisgICAgMHhCRTMwLCAweEJFMzEsIDB4QkUzMiwgMHhCRTMzLCAweEJFMzQsIDB4QkUzNSwgMHhCRTM2LCAweEJFMzcsIDB4QkUzOCwKKyAgICAweEJFMzksIDB4QkUzQSwgMHhCRTNCLCAweEJFM0MsIDB4QkUzRCwgMHhCRTNFLCAweEJFM0YsIDB4QkU0MCwgMHhCRTQxLAorICAgIDB4QkU0MiwgMHhCRTQzLCAweEJFNDYsIDB4QkU0NywgMHhCRTQ5LCAweEJFNEEsIDB4QkU0QiwgMHhCRTRELCAweEJFNEYsCisgICAgMHhCRTUwLCAweEJFNTEsIDB4QkU1MiwgMHhCRTUzLCAweEJFNTYsIDB4QkU1OCwgMHhCRTVDLCAweEJFNUQsIDB4QkU1RSwKKyAgICAweEJFNUYsIDB4QkU2MiwgMHhCRTYzLCAweEJFNjUsIDB4QkU2NiwgMHhCRTY3LCAweEJFNjksIDB4QkU2QiwgMHhCRTZDLAorICAgIDB4QkU2RCwgMHhCRTZFLCAweEJFNkYsIDB4QkU3MiwgMHhCRTc2LCAweEJFNzcsIDB4QkU3OCwgMHhCRTc5LCAweEJFN0EsCisgICAgMHhCRTdFLCAweEJFN0YsIDB4QkU4MSwgMHhCRTgyLCAweEJFODMsIDB4QkU4NSwgMHhCRTg2LCAweEJFODcsIDB4QkU4OCwKKyAgICAweEJFODksIDB4QkU4QSwgMHhCRThCLCAweEJFOEUsIDB4QkU5MiwgMHhCRTkzLCAweEJFOTQsIDB4QkU5NSwgMHhCRTk2LAorICAgIDB4QkU5NywgMHhCRTlBLCAweEJFOUIsIDB4QkU5QywgMHhCRTlELCAweEJFOUUsIDB4QkU5RiwgMHhCRUEwLCAweEJFQTEsCisgICAgMHhCRUEyLCAweEJFQTMsIDB4QkVBNCwgMHhCRUE1LCAweEJFQTYsIDB4QkVBNywgMHhCRUE5LCAweEJFQUEsIDB4QkVBQiwKKyAgICAweEJFQUMsIDB4QkVBRCwgMHhCRUFFLCAweEJFQUYsIDB4QkVCMCwgMHhCRUIxLCAweEJFQjIsIDB4QkVCMywgMHhCRUI0LAorICAgIDB4QkVCNSwgMHhCRUI2LCAweEJFQjcsIDB4QkVCOCwgMHhCRUI5LCAweEJFQkEsIDB4QkVCQiwgMHhCRUJDLCAweEJFQkQsCisgICAgMHhCRUJFLCAweEJFQkYsIDB4QkVDMCwgMHhCRUMxLCAweEJFQzIsIDB4QkVDMywgMHhCRUM0LCAweEJFQzUsIDB4QkVDNiwKKyAgICAweEJFQzcsIDB4QkVDOCwgMHhCRUM5LCAweEJFQ0EsIDB4QkVDQiwgMHhCRUNDLCAweEJFQ0QsIDB4QkVDRSwgMHhCRUNGLAorICAgIDB4QkVEMiwgMHhCRUQzLCAweEJFRDUsIDB4QkVENiwgMHhCRUQ5LCAweEJFREEsIDB4QkVEQiwgMHhCRURDLCAweEJFREQsCisgICAgMHhCRURFLCAweEJFREYsIDB4QkVFMSwgMHhCRUUyLCAweEJFRTYsIDB4QkVFNywgMHhCRUU4LCAweEJFRTksIDB4QkVFQSwKKyAgICAweEJFRUIsIDB4QkVFRCwgMHhCRUVFLCAweEJFRUYsIDB4QkVGMCwgMHhCRUYxLCAweEJFRjIsIDB4QkVGMywgMHhCRUY0LAorICAgIDB4QkVGNSwgMHhCRUY2LCAweEJFRjcsIDB4QkVGOCwgMHhCRUY5LCAweEJFRkEsIDB4QkVGQiwgMHhCRUZDLCAweEJFRkQsCisgICAgMHhCRUZFLCAweEJFRkYsIDB4QkYwMCwgMHhCRjAyLCAweEJGMDMsIDB4QkYwNCwgMHhCRjA1LCAweEJGMDYsIDB4QkYwNywKKyAgICAweEJGMEEsIDB4QkYwQiwgMHhCRjBDLCAweEJGMEQsIDB4QkYwRSwgMHhCRjBGLCAweEJGMTAsIDB4QkYxMSwgMHhCRjEyLAorICAgIDB4QkYxMywgMHhCRjE0LCAweEJGMTUsIDB4QkYxNiwgMHhCRjE3LCAweEJGMUEsIDB4QkYxRSwgMHhCRjFGLCAweEJGMjAsCisgICAgMHhCRjIxLCAweEJGMjIsIDB4QkYyMywgMHhCRjI0LCAweEJGMjUsIDB4QkYyNiwgMHhCRjI3LCAweEJGMjgsIDB4QkYyOSwKKyAgICAweEJGMkEsIDB4QkYyQiwgMHhCRjJDLCAweEJGMkQsIDB4QkYyRSwgMHhCRjJGLCAweEJGMzAsIDB4QkYzMSwgMHhCRjMyLAorICAgIDB4QkYzMywgMHhCRjM0LCAweEJGMzUsIDB4QkYzNiwgMHhCRjM3LCAweEJGMzgsIDB4QkYzOSwgMHhCRjNBLCAweEJGM0IsCisgICAgMHhCRjNDLCAweEJGM0QsIDB4QkYzRSwgMHhCRjNGLCAweEJGNDIsIDB4QkY0MywgMHhCRjQ1LCAweEJGNDYsIDB4QkY0NywKKyAgICAweEJGNDksIDB4QkY0QSwgMHhCRjRCLCAweEJGNEMsIDB4QkY0RCwgMHhCRjRFLCAweEJGNEYsIDB4QkY1MiwgMHhCRjUzLAorICAgIDB4QkY1NCwgMHhCRjU2LCAweEJGNTcsIDB4QkY1OCwgMHhCRjU5LCAweEJGNUEsIDB4QkY1QiwgMHhCRjVDLCAweEJGNUQsCisgICAgMHhCRjVFLCAweEJGNUYsIDB4QkY2MCwgMHhCRjYxLCAweEJGNjIsIDB4QkY2MywgMHhCRjY0LCAweEJGNjUsIDB4QkY2NiwKKyAgICAweEJGNjcsIDB4QkY2OCwgMHhCRjY5LCAweEJGNkEsIDB4QkY2QiwgMHhCRjZDLCAweEJGNkQsIDB4QkY2RSwgMHhCRjZGLAorICAgIDB4QkY3MCwgMHhCRjcxLCAweEJGNzIsIDB4QkY3MywgMHhCRjc0LCAweEJGNzUsIDB4QkY3NiwgMHhCRjc3LCAweEJGNzgsCisgICAgMHhCRjc5LCAweEJGN0EsIDB4QkY3QiwgMHhCRjdDLCAweEJGN0QsIDB4QkY3RSwgMHhCRjdGLCAweEJGODAsIDB4QkY4MSwKKyAgICAweEJGODIsIDB4QkY4MywgMHhCRjg0LCAweEJGODUsIDB4QkY4NiwgMHhCRjg3LCAweEJGODgsIDB4QkY4OSwgMHhCRjhBLAorICAgIDB4QkY4QiwgMHhCRjhDLCAweEJGOEQsIDB4QkY4RSwgMHhCRjhGLCAweEJGOTAsIDB4QkY5MSwgMHhCRjkyLCAweEJGOTMsCisgICAgMHhCRjk1LCAweEJGOTYsIDB4QkY5NywgMHhCRjk4LCAweEJGOTksIDB4QkY5QSwgMHhCRjlCLCAweEJGOUMsIDB4QkY5RCwKKyAgICAweEJGOUUsIDB4QkY5RiwgMHhCRkEwLCAweEJGQTEsIDB4QkZBMiwgMHhCRkEzLCAweEJGQTQsIDB4QkZBNSwgMHhCRkE2LAorICAgIDB4QkZBNywgMHhCRkE4LCAweEJGQTksIDB4QkZBQSwgMHhCRkFCLCAweEJGQUMsIDB4QkZBRCwgMHhCRkFFLCAweEJGQUYsCisgICAgMHhCRkIxLCAweEJGQjIsIDB4QkZCMywgMHhCRkI0LCAweEJGQjUsIDB4QkZCNiwgMHhCRkI3LCAweEJGQjgsIDB4QkZCOSwKKyAgICAweEJGQkEsIDB4QkZCQiwgMHhCRkJDLCAweEJGQkQsIDB4QkZCRSwgMHhCRkJGLCAweEJGQzAsIDB4QkZDMSwgMHhCRkMyLAorICAgIDB4QkZDMywgMHhCRkM0LCAweEJGQzYsIDB4QkZDNywgMHhCRkM4LCAweEJGQzksIDB4QkZDQSwgMHhCRkNCLCAweEJGQ0UsCisgICAgMHhCRkNGLCAweEJGRDEsIDB4QkZEMiwgMHhCRkQzLCAweEJGRDUsIDB4QkZENiwgMHhCRkQ3LCAweEJGRDgsIDB4QkZEOSwKKyAgICAweEJGREEsIDB4QkZEQiwgMHhCRkRELCAweEJGREUsIDB4QkZFMCwgMHhCRkUyLCAweEJGRTMsIDB4QkZFNCwgMHhCRkU1LAorICAgIDB4QkZFNiwgMHhCRkU3LCAweEJGRTgsIDB4QkZFOSwgMHhCRkVBLCAweEJGRUIsIDB4QkZFQywgMHhCRkVELCAweEJGRUUsCisgICAgMHhCRkVGLCAweEJGRjAsIDB4QkZGMSwgMHhCRkYyLCAweEJGRjMsIDB4QkZGNCwgMHhCRkY1LCAweEJGRjYsIDB4QkZGNywKKyAgICAweEJGRjgsIDB4QkZGOSwgMHhCRkZBLCAweEJGRkIsIDB4QkZGQywgMHhCRkZELCAweEJGRkUsIDB4QkZGRiwgMHhDMDAwLAorICAgIDB4QzAwMSwgMHhDMDAyLCAweEMwMDMsIDB4QzAwNCwgMHhDMDA1LCAweEMwMDYsIDB4QzAwNywgMHhDMDA4LCAweEMwMDksCisgICAgMHhDMDBBLCAweEMwMEIsIDB4QzAwQywgMHhDMDBELCAweEMwMEUsIDB4QzAwRiwgMHhDMDEwLCAweEMwMTEsIDB4QzAxMiwKKyAgICAweEMwMTMsIDB4QzAxNCwgMHhDMDE1LCAweEMwMTYsIDB4QzAxNywgMHhDMDE4LCAweEMwMTksIDB4QzAxQSwgMHhDMDFCLAorICAgIDB4QzAxQywgMHhDMDFELCAweEMwMUUsIDB4QzAxRiwgMHhDMDIwLCAweEMwMjEsIDB4QzAyMiwgMHhDMDIzLCAweEMwMjQsCisgICAgMHhDMDI1LCAweEMwMjYsIDB4QzAyNywgMHhDMDI4LCAweEMwMjksIDB4QzAyQSwgMHhDMDJCLCAweEMwMkMsIDB4QzAyRCwKKyAgICAweEMwMkUsIDB4QzAyRiwgMHhDMDMwLCAweEMwMzEsIDB4QzAzMiwgMHhDMDMzLCAweEMwMzQsIDB4QzAzNSwgMHhDMDM2LAorICAgIDB4QzAzNywgMHhDMDM4LCAweEMwMzksIDB4QzAzQSwgMHhDMDNCLCAweEMwM0QsIDB4QzAzRSwgMHhDMDNGLCAweEMwNDAsCisgICAgMHhDMDQxLCAweEMwNDIsIDB4QzA0MywgMHhDMDQ0LCAweEMwNDUsIDB4QzA0NiwgMHhDMDQ3LCAweEMwNDgsIDB4QzA0OSwKKyAgICAweEMwNEEsIDB4QzA0QiwgMHhDMDRDLCAweEMwNEQsIDB4QzA0RSwgMHhDMDRGLCAweEMwNTAsIDB4QzA1MiwgMHhDMDUzLAorICAgIDB4QzA1NCwgMHhDMDU1LCAweEMwNTYsIDB4QzA1NywgMHhDMDU5LCAweEMwNUEsIDB4QzA1QiwgMHhDMDVELCAweEMwNUUsCisgICAgMHhDMDVGLCAweEMwNjEsIDB4QzA2MiwgMHhDMDYzLCAweEMwNjQsIDB4QzA2NSwgMHhDMDY2LCAweEMwNjcsIDB4QzA2QSwKKyAgICAweEMwNkIsIDB4QzA2QywgMHhDMDZELCAweEMwNkUsIDB4QzA2RiwgMHhDMDcwLCAweEMwNzEsIDB4QzA3MiwgMHhDMDczLAorICAgIDB4QzA3NCwgMHhDMDc1LCAweEMwNzYsIDB4QzA3NywgMHhDMDc4LCAweEMwNzksIDB4QzA3QSwgMHhDMDdCLCAweEMwN0MsCisgICAgMHhDMDdELCAweEMwN0UsIDB4QzA3RiwgMHhDMDgwLCAweEMwODEsIDB4QzA4MiwgMHhDMDgzLCAweEMwODQsIDB4QzA4NSwKKyAgICAweEMwODYsIDB4QzA4NywgMHhDMDg4LCAweEMwODksIDB4QzA4QSwgMHhDMDhCLCAweEMwOEMsIDB4QzA4RCwgMHhDMDhFLAorICAgIDB4QzA4RiwgMHhDMDkyLCAweEMwOTMsIDB4QzA5NSwgMHhDMDk2LCAweEMwOTcsIDB4QzA5OSwgMHhDMDlBLCAweEMwOUIsCisgICAgMHhDMDlDLCAweEMwOUQsIDB4QzA5RSwgMHhDMDlGLCAweEMwQTIsIDB4QzBBNCwgMHhDMEE2LCAweEMwQTcsIDB4QzBBOCwKKyAgICAweEMwQTksIDB4QzBBQSwgMHhDMEFCLCAweEMwQUUsIDB4QzBCMSwgMHhDMEIyLCAweEMwQjcsIDB4QzBCOCwgMHhDMEI5LAorICAgIDB4QzBCQSwgMHhDMEJCLCAweEMwQkUsIDB4QzBDMiwgMHhDMEMzLCAweEMwQzQsIDB4QzBDNiwgMHhDMEM3LCAweEMwQ0EsCisgICAgMHhDMENCLCAweEMwQ0QsIDB4QzBDRSwgMHhDMENGLCAweEMwRDEsIDB4QzBEMiwgMHhDMEQzLCAweEMwRDQsIDB4QzBENSwKKyAgICAweEMwRDYsIDB4QzBENywgMHhDMERBLCAweEMwREUsIDB4QzBERiwgMHhDMEUwLCAweEMwRTEsIDB4QzBFMiwgMHhDMEUzLAorICAgIDB4QzBFNiwgMHhDMEU3LCAweEMwRTksIDB4QzBFQSwgMHhDMEVCLCAweEMwRUQsIDB4QzBFRSwgMHhDMEVGLCAweEMwRjAsCisgICAgMHhDMEYxLCAweEMwRjIsIDB4QzBGMywgMHhDMEY2LCAweEMwRjgsIDB4QzBGQSwgMHhDMEZCLCAweEMwRkMsIDB4QzBGRCwKKyAgICAweEMwRkUsIDB4QzBGRiwgMHhDMTAxLCAweEMxMDIsIDB4QzEwMywgMHhDMTA1LCAweEMxMDYsIDB4QzEwNywgMHhDMTA5LAorICAgIDB4QzEwQSwgMHhDMTBCLCAweEMxMEMsIDB4QzEwRCwgMHhDMTBFLCAweEMxMEYsIDB4QzExMSwgMHhDMTEyLCAweEMxMTMsCisgICAgMHhDMTE0LCAweEMxMTYsIDB4QzExNywgMHhDMTE4LCAweEMxMTksIDB4QzExQSwgMHhDMTFCLCAweEMxMjEsIDB4QzEyMiwKKyAgICAweEMxMjUsIDB4QzEyOCwgMHhDMTI5LCAweEMxMkEsIDB4QzEyQiwgMHhDMTJFLCAweEMxMzIsIDB4QzEzMywgMHhDMTM0LAorICAgIDB4QzEzNSwgMHhDMTM3LCAweEMxM0EsIDB4QzEzQiwgMHhDMTNELCAweEMxM0UsIDB4QzEzRiwgMHhDMTQxLCAweEMxNDIsCisgICAgMHhDMTQzLCAweEMxNDQsIDB4QzE0NSwgMHhDMTQ2LCAweEMxNDcsIDB4QzE0QSwgMHhDMTRFLCAweEMxNEYsIDB4QzE1MCwKKyAgICAweEMxNTEsIDB4QzE1MiwgMHhDMTUzLCAweEMxNTYsIDB4QzE1NywgMHhDMTU5LCAweEMxNUEsIDB4QzE1QiwgMHhDMTVELAorICAgIDB4QzE1RSwgMHhDMTVGLCAweEMxNjAsIDB4QzE2MSwgMHhDMTYyLCAweEMxNjMsIDB4QzE2NiwgMHhDMTZBLCAweEMxNkIsCisgICAgMHhDMTZDLCAweEMxNkQsIDB4QzE2RSwgMHhDMTZGLCAweEMxNzEsIDB4QzE3MiwgMHhDMTczLCAweEMxNzUsIDB4QzE3NiwKKyAgICAweEMxNzcsIDB4QzE3OSwgMHhDMTdBLCAweEMxN0IsIDB4QzE3QywgMHhDMTdELCAweEMxN0UsIDB4QzE3RiwgMHhDMTgwLAorICAgIDB4QzE4MSwgMHhDMTgyLCAweEMxODMsIDB4QzE4NCwgMHhDMTg2LCAweEMxODcsIDB4QzE4OCwgMHhDMTg5LCAweEMxOEEsCisgICAgMHhDMThCLCAweEMxOEYsIDB4QzE5MSwgMHhDMTkyLCAweEMxOTMsIDB4QzE5NSwgMHhDMTk3LCAweEMxOTgsIDB4QzE5OSwKKyAgICAweEMxOUEsIDB4QzE5QiwgMHhDMTlFLCAweEMxQTAsIDB4QzFBMiwgMHhDMUEzLCAweEMxQTQsIDB4QzFBNiwgMHhDMUE3LAorICAgIDB4QzFBQSwgMHhDMUFCLCAweEMxQUQsIDB4QzFBRSwgMHhDMUFGLCAweEMxQjEsIDB4QzFCMiwgMHhDMUIzLCAweEMxQjQsCisgICAgMHhDMUI1LCAweEMxQjYsIDB4QzFCNywgMHhDMUI4LCAweEMxQjksIDB4QzFCQSwgMHhDMUJCLCAweEMxQkMsIDB4QzFCRSwKKyAgICAweEMxQkYsIDB4QzFDMCwgMHhDMUMxLCAweEMxQzIsIDB4QzFDMywgMHhDMUM1LCAweEMxQzYsIDB4QzFDNywgMHhDMUM5LAorICAgIDB4QzFDQSwgMHhDMUNCLCAweEMxQ0QsIDB4QzFDRSwgMHhDMUNGLCAweEMxRDAsIDB4QzFEMSwgMHhDMUQyLCAweEMxRDMsCisgICAgMHhDMUQ1LCAweEMxRDYsIDB4QzFEOSwgMHhDMURBLCAweEMxREIsIDB4QzFEQywgMHhDMURELCAweEMxREUsIDB4QzFERiwKKyAgICAweEMxRTEsIDB4QzFFMiwgMHhDMUUzLCAweEMxRTUsIDB4QzFFNiwgMHhDMUU3LCAweEMxRTksIDB4QzFFQSwgMHhDMUVCLAorICAgIDB4QzFFQywgMHhDMUVELCAweEMxRUUsIDB4QzFFRiwgMHhDMUYyLCAweEMxRjQsIDB4QzFGNSwgMHhDMUY2LCAweEMxRjcsCisgICAgMHhDMUY4LCAweEMxRjksIDB4QzFGQSwgMHhDMUZCLCAweEMxRkUsIDB4QzFGRiwgMHhDMjAxLCAweEMyMDIsIDB4QzIwMywKKyAgICAweEMyMDUsIDB4QzIwNiwgMHhDMjA3LCAweEMyMDgsIDB4QzIwOSwgMHhDMjBBLCAweEMyMEIsIDB4QzIwRSwgMHhDMjEwLAorICAgIDB4QzIxMiwgMHhDMjEzLCAweEMyMTQsIDB4QzIxNSwgMHhDMjE2LCAweEMyMTcsIDB4QzIxQSwgMHhDMjFCLCAweEMyMUQsCisgICAgMHhDMjFFLCAweEMyMjEsIDB4QzIyMiwgMHhDMjIzLCAweEMyMjQsIDB4QzIyNSwgMHhDMjI2LCAweEMyMjcsIDB4QzIyQSwKKyAgICAweEMyMkMsIDB4QzIyRSwgMHhDMjMwLCAweEMyMzMsIDB4QzIzNSwgMHhDMjM2LCAweEMyMzcsIDB4QzIzOCwgMHhDMjM5LAorICAgIDB4QzIzQSwgMHhDMjNCLCAweEMyM0MsIDB4QzIzRCwgMHhDMjNFLCAweEMyM0YsIDB4QzI0MCwgMHhDMjQxLCAweEMyNDIsCisgICAgMHhDMjQzLCAweEMyNDQsIDB4QzI0NSwgMHhDMjQ2LCAweEMyNDcsIDB4QzI0OSwgMHhDMjRBLCAweEMyNEIsIDB4QzI0QywKKyAgICAweEMyNEQsIDB4QzI0RSwgMHhDMjRGLCAweEMyNTIsIDB4QzI1MywgMHhDMjU1LCAweEMyNTYsIDB4QzI1NywgMHhDMjU5LAorICAgIDB4QzI1QSwgMHhDMjVCLCAweEMyNUMsIDB4QzI1RCwgMHhDMjVFLCAweEMyNUYsIDB4QzI2MSwgMHhDMjYyLCAweEMyNjMsCisgICAgMHhDMjY0LCAweEMyNjYsIDB4QzI2NywgMHhDMjY4LCAweEMyNjksIDB4QzI2QSwgMHhDMjZCLCAweEMyNkUsIDB4QzI2RiwKKyAgICAweEMyNzEsIDB4QzI3MiwgMHhDMjczLCAweEMyNzUsIDB4QzI3NiwgMHhDMjc3LCAweEMyNzgsIDB4QzI3OSwgMHhDMjdBLAorICAgIDB4QzI3QiwgMHhDMjdFLCAweEMyODAsIDB4QzI4MiwgMHhDMjgzLCAweEMyODQsIDB4QzI4NSwgMHhDMjg2LCAweEMyODcsCisgICAgMHhDMjhBLCAweEMyOEIsIDB4QzI4QywgMHhDMjhELCAweEMyOEUsIDB4QzI4RiwgMHhDMjkxLCAweEMyOTIsIDB4QzI5MywKKyAgICAweEMyOTQsIDB4QzI5NSwgMHhDMjk2LCAweEMyOTcsIDB4QzI5OSwgMHhDMjlBLCAweEMyOUMsIDB4QzI5RSwgMHhDMjlGLAorICAgIDB4QzJBMCwgMHhDMkExLCAweEMyQTIsIDB4QzJBMywgMHhDMkE2LCAweEMyQTcsIDB4QzJBOSwgMHhDMkFBLCAweEMyQUIsCisgICAgMHhDMkFFLCAweEMyQUYsIDB4QzJCMCwgMHhDMkIxLCAweEMyQjIsIDB4QzJCMywgMHhDMkI2LCAweEMyQjgsIDB4QzJCQSwKKyAgICAweEMyQkIsIDB4QzJCQywgMHhDMkJELCAweEMyQkUsIDB4QzJCRiwgMHhDMkMwLCAweEMyQzEsIDB4QzJDMiwgMHhDMkMzLAorICAgIDB4QzJDNCwgMHhDMkM1LCAweEMyQzYsIDB4QzJDNywgMHhDMkM4LCAweEMyQzksIDB4QzJDQSwgMHhDMkNCLCAweEMyQ0MsCisgICAgMHhDMkNELCAweEMyQ0UsIDB4QzJDRiwgMHhDMkQwLCAweEMyRDEsIDB4QzJEMiwgMHhDMkQzLCAweEMyRDQsIDB4QzJENSwKKyAgICAweEMyRDYsIDB4QzJENywgMHhDMkQ4LCAweEMyRDksIDB4QzJEQSwgMHhDMkRCLCAweEMyREUsIDB4QzJERiwgMHhDMkUxLAorICAgIDB4QzJFMiwgMHhDMkU1LCAweEMyRTYsIDB4QzJFNywgMHhDMkU4LCAweEMyRTksIDB4QzJFQSwgMHhDMkVFLCAweEMyRjAsCisgICAgMHhDMkYyLCAweEMyRjMsIDB4QzJGNCwgMHhDMkY1LCAweEMyRjcsIDB4QzJGQSwgMHhDMkZELCAweEMyRkUsIDB4QzJGRiwKKyAgICAweEMzMDEsIDB4QzMwMiwgMHhDMzAzLCAweEMzMDQsIDB4QzMwNSwgMHhDMzA2LCAweEMzMDcsIDB4QzMwQSwgMHhDMzBCLAorICAgIDB4QzMwRSwgMHhDMzBGLCAweEMzMTAsIDB4QzMxMSwgMHhDMzEyLCAweEMzMTYsIDB4QzMxNywgMHhDMzE5LCAweEMzMUEsCisgICAgMHhDMzFCLCAweEMzMUQsIDB4QzMxRSwgMHhDMzFGLCAweEMzMjAsIDB4QzMyMSwgMHhDMzIyLCAweEMzMjMsIDB4QzMyNiwKKyAgICAweEMzMjcsIDB4QzMyQSwgMHhDMzJCLCAweEMzMkMsIDB4QzMyRCwgMHhDMzJFLCAweEMzMkYsIDB4QzMzMCwgMHhDMzMxLAorICAgIDB4QzMzMiwgMHhDMzMzLCAweEMzMzQsIDB4QzMzNSwgMHhDMzM2LCAweEMzMzcsIDB4QzMzOCwgMHhDMzM5LCAweEMzM0EsCisgICAgMHhDMzNCLCAweEMzM0MsIDB4QzMzRCwgMHhDMzNFLCAweEMzM0YsIDB4QzM0MCwgMHhDMzQxLCAweEMzNDIsIDB4QzM0MywKKyAgICAweEMzNDQsIDB4QzM0NiwgMHhDMzQ3LCAweEMzNDgsIDB4QzM0OSwgMHhDMzRBLCAweEMzNEIsIDB4QzM0QywgMHhDMzRELAorICAgIDB4QzM0RSwgMHhDMzRGLCAweEMzNTAsIDB4QzM1MSwgMHhDMzUyLCAweEMzNTMsIDB4QzM1NCwgMHhDMzU1LCAweEMzNTYsCisgICAgMHhDMzU3LCAweEMzNTgsIDB4QzM1OSwgMHhDMzVBLCAweEMzNUIsIDB4QzM1QywgMHhDMzVELCAweEMzNUUsIDB4QzM1RiwKKyAgICAweEMzNjAsIDB4QzM2MSwgMHhDMzYyLCAweEMzNjMsIDB4QzM2NCwgMHhDMzY1LCAweEMzNjYsIDB4QzM2NywgMHhDMzZBLAorICAgIDB4QzM2QiwgMHhDMzZELCAweEMzNkUsIDB4QzM2RiwgMHhDMzcxLCAweEMzNzMsIDB4QzM3NCwgMHhDMzc1LCAweEMzNzYsCisgICAgMHhDMzc3LCAweEMzN0EsIDB4QzM3QiwgMHhDMzdFLCAweEMzN0YsIDB4QzM4MCwgMHhDMzgxLCAweEMzODIsIDB4QzM4MywKKyAgICAweEMzODUsIDB4QzM4NiwgMHhDMzg3LCAweEMzODksIDB4QzM4QSwgMHhDMzhCLCAweEMzOEQsIDB4QzM4RSwgMHhDMzhGLAorICAgIDB4QzM5MCwgMHhDMzkxLCAweEMzOTIsIDB4QzM5MywgMHhDMzk0LCAweEMzOTUsIDB4QzM5NiwgMHhDMzk3LCAweEMzOTgsCisgICAgMHhDMzk5LCAweEMzOUEsIDB4QzM5QiwgMHhDMzlDLCAweEMzOUQsIDB4QzM5RSwgMHhDMzlGLCAweEMzQTAsIDB4QzNBMSwKKyAgICAweEMzQTIsIDB4QzNBMywgMHhDM0E0LCAweEMzQTUsIDB4QzNBNiwgMHhDM0E3LCAweEMzQTgsIDB4QzNBOSwgMHhDM0FBLAorICAgIDB4QzNBQiwgMHhDM0FDLCAweEMzQUQsIDB4QzNBRSwgMHhDM0FGLCAweEMzQjAsIDB4QzNCMSwgMHhDM0IyLCAweEMzQjMsCisgICAgMHhDM0I0LCAweEMzQjUsIDB4QzNCNiwgMHhDM0I3LCAweEMzQjgsIDB4QzNCOSwgMHhDM0JBLCAweEMzQkIsIDB4QzNCQywKKyAgICAweEMzQkQsIDB4QzNCRSwgMHhDM0JGLCAweEMzQzEsIDB4QzNDMiwgMHhDM0MzLCAweEMzQzQsIDB4QzNDNSwgMHhDM0M2LAorICAgIDB4QzNDNywgMHhDM0M4LCAweEMzQzksIDB4QzNDQSwgMHhDM0NCLCAweEMzQ0MsIDB4QzNDRCwgMHhDM0NFLCAweEMzQ0YsCisgICAgMHhDM0QwLCAweEMzRDEsIDB4QzNEMiwgMHhDM0QzLCAweEMzRDQsIDB4QzNENSwgMHhDM0Q2LCAweEMzRDcsIDB4QzNEQSwKKyAgICAweEMzREIsIDB4QzNERCwgMHhDM0RFLCAweEMzRTEsIDB4QzNFMywgMHhDM0U0LCAweEMzRTUsIDB4QzNFNiwgMHhDM0U3LAorICAgIDB4QzNFQSwgMHhDM0VCLCAweEMzRUMsIDB4QzNFRSwgMHhDM0VGLCAweEMzRjAsIDB4QzNGMSwgMHhDM0YyLCAweEMzRjMsCisgICAgMHhDM0Y2LCAweEMzRjcsIDB4QzNGOSwgMHhDM0ZBLCAweEMzRkIsIDB4QzNGQywgMHhDM0ZELCAweEMzRkUsIDB4QzNGRiwKKyAgICAweEM0MDAsIDB4QzQwMSwgMHhDNDAyLCAweEM0MDMsIDB4QzQwNCwgMHhDNDA1LCAweEM0MDYsIDB4QzQwNywgMHhDNDA5LAorICAgIDB4QzQwQSwgMHhDNDBCLCAweEM0MEMsIDB4QzQwRCwgMHhDNDBFLCAweEM0MEYsIDB4QzQxMSwgMHhDNDEyLCAweEM0MTMsCisgICAgMHhDNDE0LCAweEM0MTUsIDB4QzQxNiwgMHhDNDE3LCAweEM0MTgsIDB4QzQxOSwgMHhDNDFBLCAweEM0MUIsIDB4QzQxQywKKyAgICAweEM0MUQsIDB4QzQxRSwgMHhDNDFGLCAweEM0MjAsIDB4QzQyMSwgMHhDNDIyLCAweEM0MjMsIDB4QzQyNSwgMHhDNDI2LAorICAgIDB4QzQyNywgMHhDNDI4LCAweEM0MjksIDB4QzQyQSwgMHhDNDJCLCAweEM0MkQsIDB4QzQyRSwgMHhDNDJGLCAweEM0MzEsCisgICAgMHhDNDMyLCAweEM0MzMsIDB4QzQzNSwgMHhDNDM2LCAweEM0MzcsIDB4QzQzOCwgMHhDNDM5LCAweEM0M0EsIDB4QzQzQiwKKyAgICAweEM0M0UsIDB4QzQzRiwgMHhDNDQwLCAweEM0NDEsIDB4QzQ0MiwgMHhDNDQzLCAweEM0NDQsIDB4QzQ0NSwgMHhDNDQ2LAorICAgIDB4QzQ0NywgMHhDNDQ5LCAweEM0NEEsIDB4QzQ0QiwgMHhDNDRDLCAweEM0NEQsIDB4QzQ0RSwgMHhDNDRGLCAweEM0NTAsCisgICAgMHhDNDUxLCAweEM0NTIsIDB4QzQ1MywgMHhDNDU0LCAweEM0NTUsIDB4QzQ1NiwgMHhDNDU3LCAweEM0NTgsIDB4QzQ1OSwKKyAgICAweEM0NUEsIDB4QzQ1QiwgMHhDNDVDLCAweEM0NUQsIDB4QzQ1RSwgMHhDNDVGLCAweEM0NjAsIDB4QzQ2MSwgMHhDNDYyLAorICAgIDB4QzQ2MywgMHhDNDY2LCAweEM0NjcsIDB4QzQ2OSwgMHhDNDZBLCAweEM0NkIsIDB4QzQ2RCwgMHhDNDZFLCAweEM0NkYsCisgICAgMHhDNDcwLCAweEM0NzEsIDB4QzQ3MiwgMHhDNDczLCAweEM0NzYsIDB4QzQ3NywgMHhDNDc4LCAweEM0N0EsIDB4QzQ3QiwKKyAgICAweEM0N0MsIDB4QzQ3RCwgMHhDNDdFLCAweEM0N0YsIDB4QzQ4MSwgMHhDNDgyLCAweEM0ODMsIDB4QzQ4NCwgMHhDNDg1LAorICAgIDB4QzQ4NiwgMHhDNDg3LCAweEM0ODgsIDB4QzQ4OSwgMHhDNDhBLCAweEM0OEIsIDB4QzQ4QywgMHhDNDhELCAweEM0OEUsCisgICAgMHhDNDhGLCAweEM0OTAsIDB4QzQ5MSwgMHhDNDkyLCAweEM0OTMsIDB4QzQ5NSwgMHhDNDk2LCAweEM0OTcsIDB4QzQ5OCwKKyAgICAweEM0OTksIDB4QzQ5QSwgMHhDNDlCLCAweEM0OUQsIDB4QzQ5RSwgMHhDNDlGLCAweEM0QTAsIDB4QzRBMSwgMHhDNEEyLAorICAgIDB4QzRBMywgMHhDNEE0LCAweEM0QTUsIDB4QzRBNiwgMHhDNEE3LCAweEM0QTgsIDB4QzRBOSwgMHhDNEFBLCAweEM0QUIsCisgICAgMHhDNEFDLCAweEM0QUQsIDB4QzRBRSwgMHhDNEFGLCAweEM0QjAsIDB4QzRCMSwgMHhDNEIyLCAweEM0QjMsIDB4QzRCNCwKKyAgICAweEM0QjUsIDB4QzRCNiwgMHhDNEI3LCAweEM0QjksIDB4QzRCQSwgMHhDNEJCLCAweEM0QkQsIDB4QzRCRSwgMHhDNEJGLAorICAgIDB4QzRDMCwgMHhDNEMxLCAweEM0QzIsIDB4QzRDMywgMHhDNEM0LCAweEM0QzUsIDB4QzRDNiwgMHhDNEM3LCAweEM0QzgsCisgICAgMHhDNEM5LCAweEM0Q0EsIDB4QzRDQiwgMHhDNENDLCAweEM0Q0QsIDB4QzRDRSwgMHhDNENGLCAweEM0RDAsIDB4QzREMSwKKyAgICAweEM0RDIsIDB4QzREMywgMHhDNEQ0LCAweEM0RDUsIDB4QzRENiwgMHhDNEQ3LCAweEM0RDgsIDB4QzREOSwgMHhDNERBLAorICAgIDB4QzREQiwgMHhDNERDLCAweEM0REQsIDB4QzRERSwgMHhDNERGLCAweEM0RTAsIDB4QzRFMSwgMHhDNEUyLCAweEM0RTMsCisgICAgMHhDNEU0LCAweEM0RTUsIDB4QzRFNiwgMHhDNEU3LCAweEM0RTgsIDB4QzRFQSwgMHhDNEVCLCAweEM0RUMsIDB4QzRFRCwKKyAgICAweEM0RUUsIDB4QzRFRiwgMHhDNEYyLCAweEM0RjMsIDB4QzRGNSwgMHhDNEY2LCAweEM0RjcsIDB4QzRGOSwgMHhDNEZCLAorICAgIDB4QzRGQywgMHhDNEZELCAweEM0RkUsIDB4QzUwMiwgMHhDNTAzLCAweEM1MDQsIDB4QzUwNSwgMHhDNTA2LCAweEM1MDcsCisgICAgMHhDNTA4LCAweEM1MDksIDB4QzUwQSwgMHhDNTBCLCAweEM1MEQsIDB4QzUwRSwgMHhDNTBGLCAweEM1MTEsIDB4QzUxMiwKKyAgICAweEM1MTMsIDB4QzUxNSwgMHhDNTE2LCAweEM1MTcsIDB4QzUxOCwgMHhDNTE5LCAweEM1MUEsIDB4QzUxQiwgMHhDNTFELAorICAgIDB4QzUxRSwgMHhDNTFGLCAweEM1MjAsIDB4QzUyMSwgMHhDNTIyLCAweEM1MjMsIDB4QzUyNCwgMHhDNTI1LCAweEM1MjYsCisgICAgMHhDNTI3LCAweEM1MkEsIDB4QzUyQiwgMHhDNTJELCAweEM1MkUsIDB4QzUyRiwgMHhDNTMxLCAweEM1MzIsIDB4QzUzMywKKyAgICAweEM1MzQsIDB4QzUzNSwgMHhDNTM2LCAweEM1MzcsIDB4QzUzQSwgMHhDNTNDLCAweEM1M0UsIDB4QzUzRiwgMHhDNTQwLAorICAgIDB4QzU0MSwgMHhDNTQyLCAweEM1NDMsIDB4QzU0NiwgMHhDNTQ3LCAweEM1NEIsIDB4QzU0RiwgMHhDNTUwLCAweEM1NTEsCisgICAgMHhDNTUyLCAweEM1NTYsIDB4QzU1QSwgMHhDNTVCLCAweEM1NUMsIDB4QzU1RiwgMHhDNTYyLCAweEM1NjMsIDB4QzU2NSwKKyAgICAweEM1NjYsIDB4QzU2NywgMHhDNTY5LCAweEM1NkEsIDB4QzU2QiwgMHhDNTZDLCAweEM1NkQsIDB4QzU2RSwgMHhDNTZGLAorICAgIDB4QzU3MiwgMHhDNTc2LCAweEM1NzcsIDB4QzU3OCwgMHhDNTc5LCAweEM1N0EsIDB4QzU3QiwgMHhDNTdFLCAweEM1N0YsCisgICAgMHhDNTgxLCAweEM1ODIsIDB4QzU4MywgMHhDNTg1LCAweEM1ODYsIDB4QzU4OCwgMHhDNTg5LCAweEM1OEEsIDB4QzU4QiwKKyAgICAweEM1OEUsIDB4QzU5MCwgMHhDNTkyLCAweEM1OTMsIDB4QzU5NCwgMHhDNTk2LCAweEM1OTksIDB4QzU5QSwgMHhDNTlCLAorICAgIDB4QzU5RCwgMHhDNTlFLCAweEM1OUYsIDB4QzVBMSwgMHhDNUEyLCAweEM1QTMsIDB4QzVBNCwgMHhDNUE1LCAweEM1QTYsCisgICAgMHhDNUE3LCAweEM1QTgsIDB4QzVBQSwgMHhDNUFCLCAweEM1QUMsIDB4QzVBRCwgMHhDNUFFLCAweEM1QUYsIDB4QzVCMCwKKyAgICAweEM1QjEsIDB4QzVCMiwgMHhDNUIzLCAweEM1QjYsIDB4QzVCNywgMHhDNUJBLCAweEM1QkYsIDB4QzVDMCwgMHhDNUMxLAorICAgIDB4QzVDMiwgMHhDNUMzLCAweEM1Q0IsIDB4QzVDRCwgMHhDNUNGLCAweEM1RDIsIDB4QzVEMywgMHhDNUQ1LCAweEM1RDYsCisgICAgMHhDNUQ3LCAweEM1RDksIDB4QzVEQSwgMHhDNURCLCAweEM1REMsIDB4QzVERCwgMHhDNURFLCAweEM1REYsIDB4QzVFMiwKKyAgICAweEM1RTQsIDB4QzVFNiwgMHhDNUU3LCAweEM1RTgsIDB4QzVFOSwgMHhDNUVBLCAweEM1RUIsIDB4QzVFRiwgMHhDNUYxLAorICAgIDB4QzVGMiwgMHhDNUYzLCAweEM1RjUsIDB4QzVGOCwgMHhDNUY5LCAweEM1RkEsIDB4QzVGQiwgMHhDNjAyLCAweEM2MDMsCisgICAgMHhDNjA0LCAweEM2MDksIDB4QzYwQSwgMHhDNjBCLCAweEM2MEQsIDB4QzYwRSwgMHhDNjBGLCAweEM2MTEsIDB4QzYxMiwKKyAgICAweEM2MTMsIDB4QzYxNCwgMHhDNjE1LCAweEM2MTYsIDB4QzYxNywgMHhDNjFBLCAweEM2MUQsIDB4QzYxRSwgMHhDNjFGLAorICAgIDB4QzYyMCwgMHhDNjIxLCAweEM2MjIsIDB4QzYyMywgMHhDNjI2LCAweEM2MjcsIDB4QzYyOSwgMHhDNjJBLCAweEM2MkIsCisgICAgMHhDNjJGLCAweEM2MzEsIDB4QzYzMiwgMHhDNjM2LCAweEM2MzgsIDB4QzYzQSwgMHhDNjNDLCAweEM2M0QsIDB4QzYzRSwKKyAgICAweEM2M0YsIDB4QzY0MiwgMHhDNjQzLCAweEM2NDUsIDB4QzY0NiwgMHhDNjQ3LCAweEM2NDksIDB4QzY0QSwgMHhDNjRCLAorICAgIDB4QzY0QywgMHhDNjRELCAweEM2NEUsIDB4QzY0RiwgMHhDNjUyLCAweEM2NTYsIDB4QzY1NywgMHhDNjU4LCAweEM2NTksCisgICAgMHhDNjVBLCAweEM2NUIsIDB4QzY1RSwgMHhDNjVGLCAweEM2NjEsIDB4QzY2MiwgMHhDNjYzLCAweEM2NjQsIDB4QzY2NSwKKyAgICAweEM2NjYsIDB4QzY2NywgMHhDNjY4LCAweEM2NjksIDB4QzY2QSwgMHhDNjZCLCAweEM2NkQsIDB4QzY2RSwgMHhDNjcwLAorICAgIDB4QzY3MiwgMHhDNjczLCAweEM2NzQsIDB4QzY3NSwgMHhDNjc2LCAweEM2NzcsIDB4QzY3QSwgMHhDNjdCLCAweEM2N0QsCisgICAgMHhDNjdFLCAweEM2N0YsIDB4QzY4MSwgMHhDNjgyLCAweEM2ODMsIDB4QzY4NCwgMHhDNjg1LCAweEM2ODYsIDB4QzY4NywKKyAgICAweEM2OEEsIDB4QzY4QywgMHhDNjhFLCAweEM2OEYsIDB4QzY5MCwgMHhDNjkxLCAweEM2OTIsIDB4QzY5MywgMHhDNjk2LAorICAgIDB4QzY5NywgMHhDNjk5LCAweEM2OUEsIDB4QzY5QiwgMHhDNjlELCAweEM2OUUsIDB4QzY5RiwgMHhDNkEwLCAweEM2QTEsCisgICAgMHhDNkEyLCAweEM2QTMsIDB4QzZBNiwgMHhDNkE4LCAweEM2QUEsIDB4QzZBQiwgMHhDNkFDLCAweEM2QUQsIDB4QzZBRSwKKyAgICAweEM2QUYsIDB4QzZCMiwgMHhDNkIzLCAweEM2QjUsIDB4QzZCNiwgMHhDNkI3LCAweEM2QkIsIDB4QzZCQywgMHhDNkJELAorICAgIDB4QzZCRSwgMHhDNkJGLCAweEM2QzIsIDB4QzZDNCwgMHhDNkM2LCAweEM2QzcsIDB4QzZDOCwgMHhDNkM5LCAweEM2Q0EsCisgICAgMHhDNkNCLCAweEM2Q0UsIDB4QzZDRiwgMHhDNkQxLCAweEM2RDIsIDB4QzZEMywgMHhDNkQ1LCAweEM2RDYsIDB4QzZENywKKyAgICAweEM2RDgsIDB4QzZEOSwgMHhDNkRBLCAweEM2REIsIDB4QzZERSwgMHhDNkRGLCAweEM2RTIsIDB4QzZFMywgMHhDNkU0LAorICAgIDB4QzZFNSwgMHhDNkU2LCAweEM2RTcsIDB4QzZFQSwgMHhDNkVCLCAweEM2RUQsIDB4QzZFRSwgMHhDNkVGLCAweEM2RjEsCisgICAgMHhDNkYyLCAweEM2RjMsIDB4QzZGNCwgMHhDNkY1LCAweEM2RjYsIDB4QzZGNywgMHhDNkZBLCAweEM2RkIsIDB4QzZGQywKKyAgICAweEM2RkUsIDB4QzZGRiwgMHhDNzAwLCAweEM3MDEsIDB4QzcwMiwgMHhDNzAzLCAweEM3MDYsIDB4QzcwNywgMHhDNzA5LAorICAgIDB4QzcwQSwgMHhDNzBCLCAweEM3MEQsIDB4QzcwRSwgMHhDNzBGLCAweEM3MTAsIDB4QzcxMSwgMHhDNzEyLCAweEM3MTMsCisgICAgMHhDNzE2LCAweEM3MTgsIDB4QzcxQSwgMHhDNzFCLCAweEM3MUMsIDB4QzcxRCwgMHhDNzFFLCAweEM3MUYsIDB4QzcyMiwKKyAgICAweEM3MjMsIDB4QzcyNSwgMHhDNzI2LCAweEM3MjcsIDB4QzcyOSwgMHhDNzJBLCAweEM3MkIsIDB4QzcyQywgMHhDNzJELAorICAgIDB4QzcyRSwgMHhDNzJGLCAweEM3MzIsIDB4QzczNCwgMHhDNzM2LCAweEM3MzgsIDB4QzczOSwgMHhDNzNBLCAweEM3M0IsCisgICAgMHhDNzNFLCAweEM3M0YsIDB4Qzc0MSwgMHhDNzQyLCAweEM3NDMsIDB4Qzc0NSwgMHhDNzQ2LCAweEM3NDcsIDB4Qzc0OCwKKyAgICAweEM3NDksIDB4Qzc0QiwgMHhDNzRFLCAweEM3NTAsIDB4Qzc1OSwgMHhDNzVBLCAweEM3NUIsIDB4Qzc1RCwgMHhDNzVFLAorICAgIDB4Qzc1RiwgMHhDNzYxLCAweEM3NjIsIDB4Qzc2MywgMHhDNzY0LCAweEM3NjUsIDB4Qzc2NiwgMHhDNzY3LCAweEM3NjksCisgICAgMHhDNzZBLCAweEM3NkMsIDB4Qzc2RCwgMHhDNzZFLCAweEM3NkYsIDB4Qzc3MCwgMHhDNzcxLCAweEM3NzIsIDB4Qzc3MywKKyAgICAweEM3NzYsIDB4Qzc3NywgMHhDNzc5LCAweEM3N0EsIDB4Qzc3QiwgMHhDNzdGLCAweEM3ODAsIDB4Qzc4MSwgMHhDNzgyLAorICAgIDB4Qzc4NiwgMHhDNzhCLCAweEM3OEMsIDB4Qzc4RCwgMHhDNzhGLCAweEM3OTIsIDB4Qzc5MywgMHhDNzk1LCAweEM3OTksCisgICAgMHhDNzlCLCAweEM3OUMsIDB4Qzc5RCwgMHhDNzlFLCAweEM3OUYsIDB4QzdBMiwgMHhDN0E3LCAweEM3QTgsIDB4QzdBOSwKKyAgICAweEM3QUEsIDB4QzdBQiwgMHhDN0FFLCAweEM3QUYsIDB4QzdCMSwgMHhDN0IyLCAweEM3QjMsIDB4QzdCNSwgMHhDN0I2LAorICAgIDB4QzdCNywgMHhDN0I4LCAweEM3QjksIDB4QzdCQSwgMHhDN0JCLCAweEM3QkUsIDB4QzdDMiwgMHhDN0MzLCAweEM3QzQsCisgICAgMHhDN0M1LCAweEM3QzYsIDB4QzdDNywgMHhDN0NBLCAweEM3Q0IsIDB4QzdDRCwgMHhDN0NGLCAweEM3RDEsIDB4QzdEMiwKKyAgICAweEM3RDMsIDB4QzdENCwgMHhDN0Q1LCAweEM3RDYsIDB4QzdENywgMHhDN0Q5LCAweEM3REEsIDB4QzdEQiwgMHhDN0RDLAorICAgIDB4QzdERSwgMHhDN0RGLCAweEM3RTAsIDB4QzdFMSwgMHhDN0UyLCAweEM3RTMsIDB4QzdFNSwgMHhDN0U2LCAweEM3RTcsCisgICAgMHhDN0U5LCAweEM3RUEsIDB4QzdFQiwgMHhDN0VELCAweEM3RUUsIDB4QzdFRiwgMHhDN0YwLCAweEM3RjEsIDB4QzdGMiwKKyAgICAweEM3RjMsIDB4QzdGNCwgMHhDN0Y1LCAweEM3RjYsIDB4QzdGNywgMHhDN0Y4LCAweEM3RjksIDB4QzdGQSwgMHhDN0ZCLAorICAgIDB4QzdGQywgMHhDN0ZELCAweEM3RkUsIDB4QzdGRiwgMHhDODAyLCAweEM4MDMsIDB4QzgwNSwgMHhDODA2LCAweEM4MDcsCisgICAgMHhDODA5LCAweEM4MEIsIDB4QzgwQywgMHhDODBELCAweEM4MEUsIDB4QzgwRiwgMHhDODEyLCAweEM4MTQsIDB4QzgxNywKKyAgICAweEM4MTgsIDB4QzgxOSwgMHhDODFBLCAweEM4MUIsIDB4QzgxRSwgMHhDODFGLCAweEM4MjEsIDB4QzgyMiwgMHhDODIzLAorICAgIDB4QzgyNSwgMHhDODI2LCAweEM4MjcsIDB4QzgyOCwgMHhDODI5LCAweEM4MkEsIDB4QzgyQiwgMHhDODJFLCAweEM4MzAsCisgICAgMHhDODMyLCAweEM4MzMsIDB4QzgzNCwgMHhDODM1LCAweEM4MzYsIDB4QzgzNywgMHhDODM5LCAweEM4M0EsIDB4QzgzQiwKKyAgICAweEM4M0QsIDB4QzgzRSwgMHhDODNGLCAweEM4NDEsIDB4Qzg0MiwgMHhDODQzLCAweEM4NDQsIDB4Qzg0NSwgMHhDODQ2LAorICAgIDB4Qzg0NywgMHhDODRBLCAweEM4NEIsIDB4Qzg0RSwgMHhDODRGLCAweEM4NTAsIDB4Qzg1MSwgMHhDODUyLCAweEM4NTMsCisgICAgMHhDODU1LCAweEM4NTYsIDB4Qzg1NywgMHhDODU4LCAweEM4NTksIDB4Qzg1QSwgMHhDODVCLCAweEM4NUMsIDB4Qzg1RCwKKyAgICAweEM4NUUsIDB4Qzg1RiwgMHhDODYwLCAweEM4NjEsIDB4Qzg2MiwgMHhDODYzLCAweEM4NjQsIDB4Qzg2NSwgMHhDODY2LAorICAgIDB4Qzg2NywgMHhDODY4LCAweEM4NjksIDB4Qzg2QSwgMHhDODZCLCAweEM4NkMsIDB4Qzg2RCwgMHhDODZFLCAweEM4NkYsCisgICAgMHhDODcyLCAweEM4NzMsIDB4Qzg3NSwgMHhDODc2LCAweEM4NzcsIDB4Qzg3OSwgMHhDODdCLCAweEM4N0MsIDB4Qzg3RCwKKyAgICAweEM4N0UsIDB4Qzg3RiwgMHhDODgyLCAweEM4ODQsIDB4Qzg4OCwgMHhDODg5LCAweEM4OEEsIDB4Qzg4RSwgMHhDODhGLAorICAgIDB4Qzg5MCwgMHhDODkxLCAweEM4OTIsIDB4Qzg5MywgMHhDODk1LCAweEM4OTYsIDB4Qzg5NywgMHhDODk4LCAweEM4OTksCisgICAgMHhDODlBLCAweEM4OUIsIDB4Qzg5QywgMHhDODlFLCAweEM4QTAsIDB4QzhBMiwgMHhDOEEzLCAweEM4QTQsIDB4QzhBNSwKKyAgICAweEM4QTYsIDB4QzhBNywgMHhDOEE5LCAweEM4QUEsIDB4QzhBQiwgMHhDOEFDLCAweEM4QUQsIDB4QzhBRSwgMHhDOEFGLAorICAgIDB4QzhCMCwgMHhDOEIxLCAweEM4QjIsIDB4QzhCMywgMHhDOEI0LCAweEM4QjUsIDB4QzhCNiwgMHhDOEI3LCAweEM4QjgsCisgICAgMHhDOEI5LCAweEM4QkEsIDB4QzhCQiwgMHhDOEJFLCAweEM4QkYsIDB4QzhDMCwgMHhDOEMxLCAweEM4QzIsIDB4QzhDMywKKyAgICAweEM4QzUsIDB4QzhDNiwgMHhDOEM3LCAweEM4QzksIDB4QzhDQSwgMHhDOENCLCAweEM4Q0QsIDB4QzhDRSwgMHhDOENGLAorICAgIDB4QzhEMCwgMHhDOEQxLCAweEM4RDIsIDB4QzhEMywgMHhDOEQ2LCAweEM4RDgsIDB4QzhEQSwgMHhDOERCLCAweEM4REMsCisgICAgMHhDOERELCAweEM4REUsIDB4QzhERiwgMHhDOEUyLCAweEM4RTMsIDB4QzhFNSwgMHhDOEU2LCAweEM4RTcsIDB4QzhFOCwKKyAgICAweEM4RTksIDB4QzhFQSwgMHhDOEVCLCAweEM4RUMsIDB4QzhFRCwgMHhDOEVFLCAweEM4RUYsIDB4QzhGMCwgMHhDOEYxLAorICAgIDB4QzhGMiwgMHhDOEYzLCAweEM4RjQsIDB4QzhGNiwgMHhDOEY3LCAweEM4RjgsIDB4QzhGOSwgMHhDOEZBLCAweEM4RkIsCisgICAgMHhDOEZFLCAweEM4RkYsIDB4QzkwMSwgMHhDOTAyLCAweEM5MDMsIDB4QzkwNywgMHhDOTA4LCAweEM5MDksIDB4QzkwQSwKKyAgICAweEM5MEIsIDB4QzkwRSwgMHhDOTEwLCAweEM5MTIsIDB4QzkxMywgMHhDOTE0LCAweEM5MTUsIDB4QzkxNiwgMHhDOTE3LAorICAgIDB4QzkxOSwgMHhDOTFBLCAweEM5MUIsIDB4QzkxQywgMHhDOTFELCAweEM5MUUsIDB4QzkxRiwgMHhDOTIwLCAweEM5MjEsCisgICAgMHhDOTIyLCAweEM5MjMsIDB4QzkyNCwgMHhDOTI1LCAweEM5MjYsIDB4QzkyNywgMHhDOTI4LCAweEM5MjksIDB4QzkyQSwKKyAgICAweEM5MkIsIDB4QzkyRCwgMHhDOTJFLCAweEM5MkYsIDB4QzkzMCwgMHhDOTMxLCAweEM5MzIsIDB4QzkzMywgMHhDOTM1LAorICAgIDB4QzkzNiwgMHhDOTM3LCAweEM5MzgsIDB4QzkzOSwgMHhDOTNBLCAweEM5M0IsIDB4QzkzQywgMHhDOTNELCAweEM5M0UsCisgICAgMHhDOTNGLCAweEM5NDAsIDB4Qzk0MSwgMHhDOTQyLCAweEM5NDMsIDB4Qzk0NCwgMHhDOTQ1LCAweEM5NDYsIDB4Qzk0NywKKyAgICAweEM5NDgsIDB4Qzk0OSwgMHhDOTRBLCAweEM5NEIsIDB4Qzk0QywgMHhDOTRELCAweEM5NEUsIDB4Qzk0RiwgMHhDOTUyLAorICAgIDB4Qzk1MywgMHhDOTU1LCAweEM5NTYsIDB4Qzk1NywgMHhDOTU5LCAweEM5NUEsIDB4Qzk1QiwgMHhDOTVDLCAweEM5NUQsCisgICAgMHhDOTVFLCAweEM5NUYsIDB4Qzk2MiwgMHhDOTY0LCAweEM5NjUsIDB4Qzk2NiwgMHhDOTY3LCAweEM5NjgsIDB4Qzk2OSwKKyAgICAweEM5NkEsIDB4Qzk2QiwgMHhDOTZELCAweEM5NkUsIDB4Qzk2RiwgMHhDOTcxLCAweEM5NzIsIDB4Qzk3MywgMHhDOTc1LAorICAgIDB4Qzk3NiwgMHhDOTc3LCAweEM5NzgsIDB4Qzk3OSwgMHhDOTdBLCAweEM5N0IsIDB4Qzk3RCwgMHhDOTdFLCAweEM5N0YsCisgICAgMHhDOTgwLCAweEM5ODEsIDB4Qzk4MiwgMHhDOTgzLCAweEM5ODQsIDB4Qzk4NSwgMHhDOTg2LCAweEM5ODcsIDB4Qzk4QSwKKyAgICAweEM5OEIsIDB4Qzk4RCwgMHhDOThFLCAweEM5OEYsIDB4Qzk5MSwgMHhDOTkyLCAweEM5OTMsIDB4Qzk5NCwgMHhDOTk1LAorICAgIDB4Qzk5NiwgMHhDOTk3LCAweEM5OUEsIDB4Qzk5QywgMHhDOTlFLCAweEM5OUYsIDB4QzlBMCwgMHhDOUExLCAweEM5QTIsCisgICAgMHhDOUEzLCAweEM5QTQsIDB4QzlBNSwgMHhDOUE2LCAweEM5QTcsIDB4QzlBOCwgMHhDOUE5LCAweEM5QUEsIDB4QzlBQiwKKyAgICAweEM5QUMsIDB4QzlBRCwgMHhDOUFFLCAweEM5QUYsIDB4QzlCMCwgMHhDOUIxLCAweEM5QjIsIDB4QzlCMywgMHhDOUI0LAorICAgIDB4QzlCNSwgMHhDOUI2LCAweEM5QjcsIDB4QzlCOCwgMHhDOUI5LCAweEM5QkEsIDB4QzlCQiwgMHhDOUJDLCAweEM5QkQsCisgICAgMHhDOUJFLCAweEM5QkYsIDB4QzlDMiwgMHhDOUMzLCAweEM5QzUsIDB4QzlDNiwgMHhDOUM5LCAweEM5Q0IsIDB4QzlDQywKKyAgICAweEM5Q0QsIDB4QzlDRSwgMHhDOUNGLCAweEM5RDIsIDB4QzlENCwgMHhDOUQ3LCAweEM5RDgsIDB4QzlEQiwgMHhDOURFLAorICAgIDB4QzlERiwgMHhDOUUxLCAweEM5RTMsIDB4QzlFNSwgMHhDOUU2LCAweEM5RTgsIDB4QzlFOSwgMHhDOUVBLCAweEM5RUIsCisgICAgMHhDOUVFLCAweEM5RjIsIDB4QzlGMywgMHhDOUY0LCAweEM5RjUsIDB4QzlGNiwgMHhDOUY3LCAweEM5RkEsIDB4QzlGQiwKKyAgICAweEM5RkQsIDB4QzlGRSwgMHhDOUZGLCAweENBMDEsIDB4Q0EwMiwgMHhDQTAzLCAweENBMDQsIDB4Q0EwNSwgMHhDQTA2LAorICAgIDB4Q0EwNywgMHhDQTBBLCAweENBMEUsIDB4Q0EwRiwgMHhDQTEwLCAweENBMTEsIDB4Q0ExMiwgMHhDQTEzLCAweENBMTUsCisgICAgMHhDQTE2LCAweENBMTcsIDB4Q0ExOSwgMHhDQTFBLCAweENBMUIsIDB4Q0ExQywgMHhDQTFELCAweENBMUUsIDB4Q0ExRiwKKyAgICAweENBMjAsIDB4Q0EyMSwgMHhDQTIyLCAweENBMjMsIDB4Q0EyNCwgMHhDQTI1LCAweENBMjYsIDB4Q0EyNywgMHhDQTI4LAorICAgIDB4Q0EyQSwgMHhDQTJCLCAweENBMkMsIDB4Q0EyRCwgMHhDQTJFLCAweENBMkYsIDB4Q0EzMCwgMHhDQTMxLCAweENBMzIsCisgICAgMHhDQTMzLCAweENBMzQsIDB4Q0EzNSwgMHhDQTM2LCAweENBMzcsIDB4Q0EzOCwgMHhDQTM5LCAweENBM0EsIDB4Q0EzQiwKKyAgICAweENBM0MsIDB4Q0EzRCwgMHhDQTNFLCAweENBM0YsIDB4Q0E0MCwgMHhDQTQxLCAweENBNDIsIDB4Q0E0MywgMHhDQTQ0LAorICAgIDB4Q0E0NSwgMHhDQTQ2LCAweENBNDcsIDB4Q0E0OCwgMHhDQTQ5LCAweENBNEEsIDB4Q0E0QiwgMHhDQTRFLCAweENBNEYsCisgICAgMHhDQTUxLCAweENBNTIsIDB4Q0E1MywgMHhDQTU1LCAweENBNTYsIDB4Q0E1NywgMHhDQTU4LCAweENBNTksIDB4Q0E1QSwKKyAgICAweENBNUIsIDB4Q0E1RSwgMHhDQTYyLCAweENBNjMsIDB4Q0E2NCwgMHhDQTY1LCAweENBNjYsIDB4Q0E2NywgMHhDQTY5LAorICAgIDB4Q0E2QSwgMHhDQTZCLCAweENBNkMsIDB4Q0E2RCwgMHhDQTZFLCAweENBNkYsIDB4Q0E3MCwgMHhDQTcxLCAweENBNzIsCisgICAgMHhDQTczLCAweENBNzQsIDB4Q0E3NSwgMHhDQTc2LCAweENBNzcsIDB4Q0E3OCwgMHhDQTc5LCAweENBN0EsIDB4Q0E3QiwKKyAgICAweENBN0MsIDB4Q0E3RSwgMHhDQTdGLCAweENBODAsIDB4Q0E4MSwgMHhDQTgyLCAweENBODMsIDB4Q0E4NSwgMHhDQTg2LAorICAgIDB4Q0E4NywgMHhDQTg4LCAweENBODksIDB4Q0E4QSwgMHhDQThCLCAweENBOEMsIDB4Q0E4RCwgMHhDQThFLCAweENBOEYsCisgICAgMHhDQTkwLCAweENBOTEsIDB4Q0E5MiwgMHhDQTkzLCAweENBOTQsIDB4Q0E5NSwgMHhDQTk2LCAweENBOTcsIDB4Q0E5OSwKKyAgICAweENBOUEsIDB4Q0E5QiwgMHhDQTlDLCAweENBOUQsIDB4Q0E5RSwgMHhDQTlGLCAweENBQTAsIDB4Q0FBMSwgMHhDQUEyLAorICAgIDB4Q0FBMywgMHhDQUE0LCAweENBQTUsIDB4Q0FBNiwgMHhDQUE3LCAweENBQTgsIDB4Q0FBOSwgMHhDQUFBLCAweENBQUIsCisgICAgMHhDQUFDLCAweENBQUQsIDB4Q0FBRSwgMHhDQUFGLCAweENBQjAsIDB4Q0FCMSwgMHhDQUIyLCAweENBQjMsIDB4Q0FCNCwKKyAgICAweENBQjUsIDB4Q0FCNiwgMHhDQUI3LCAweENBQjgsIDB4Q0FCOSwgMHhDQUJBLCAweENBQkIsIDB4Q0FCRSwgMHhDQUJGLAorICAgIDB4Q0FDMSwgMHhDQUMyLCAweENBQzMsIDB4Q0FDNSwgMHhDQUM2LCAweENBQzcsIDB4Q0FDOCwgMHhDQUM5LCAweENBQ0EsCisgICAgMHhDQUNCLCAweENBQ0UsIDB4Q0FEMCwgMHhDQUQyLCAweENBRDQsIDB4Q0FENSwgMHhDQUQ2LCAweENBRDcsIDB4Q0FEQSwKKyAgICAweENBREIsIDB4Q0FEQywgMHhDQURELCAweENBREUsIDB4Q0FERiwgMHhDQUUxLCAweENBRTIsIDB4Q0FFMywgMHhDQUU0LAorICAgIDB4Q0FFNSwgMHhDQUU2LCAweENBRTcsIDB4Q0FFOCwgMHhDQUU5LCAweENBRUEsIDB4Q0FFQiwgMHhDQUVELCAweENBRUUsCisgICAgMHhDQUVGLCAweENBRjAsIDB4Q0FGMSwgMHhDQUYyLCAweENBRjMsIDB4Q0FGNSwgMHhDQUY2LCAweENBRjcsIDB4Q0FGOCwKKyAgICAweENBRjksIDB4Q0FGQSwgMHhDQUZCLCAweENBRkMsIDB4Q0FGRCwgMHhDQUZFLCAweENBRkYsIDB4Q0IwMCwgMHhDQjAxLAorICAgIDB4Q0IwMiwgMHhDQjAzLCAweENCMDQsIDB4Q0IwNSwgMHhDQjA2LCAweENCMDcsIDB4Q0IwOSwgMHhDQjBBLCAweENCMEIsCisgICAgMHhDQjBDLCAweENCMEQsIDB4Q0IwRSwgMHhDQjBGLCAweENCMTEsIDB4Q0IxMiwgMHhDQjEzLCAweENCMTUsIDB4Q0IxNiwKKyAgICAweENCMTcsIDB4Q0IxOSwgMHhDQjFBLCAweENCMUIsIDB4Q0IxQywgMHhDQjFELCAweENCMUUsIDB4Q0IxRiwgMHhDQjIyLAorICAgIDB4Q0IyMywgMHhDQjI0LCAweENCMjUsIDB4Q0IyNiwgMHhDQjI3LCAweENCMjgsIDB4Q0IyOSwgMHhDQjJBLCAweENCMkIsCisgICAgMHhDQjJDLCAweENCMkQsIDB4Q0IyRSwgMHhDQjJGLCAweENCMzAsIDB4Q0IzMSwgMHhDQjMyLCAweENCMzMsIDB4Q0IzNCwKKyAgICAweENCMzUsIDB4Q0IzNiwgMHhDQjM3LCAweENCMzgsIDB4Q0IzOSwgMHhDQjNBLCAweENCM0IsIDB4Q0IzQywgMHhDQjNELAorICAgIDB4Q0IzRSwgMHhDQjNGLCAweENCNDAsIDB4Q0I0MiwgMHhDQjQzLCAweENCNDQsIDB4Q0I0NSwgMHhDQjQ2LCAweENCNDcsCisgICAgMHhDQjRBLCAweENCNEIsIDB4Q0I0RCwgMHhDQjRFLCAweENCNEYsIDB4Q0I1MSwgMHhDQjUyLCAweENCNTMsIDB4Q0I1NCwKKyAgICAweENCNTUsIDB4Q0I1NiwgMHhDQjU3LCAweENCNUEsIDB4Q0I1QiwgMHhDQjVDLCAweENCNUUsIDB4Q0I1RiwgMHhDQjYwLAorICAgIDB4Q0I2MSwgMHhDQjYyLCAweENCNjMsIDB4Q0I2NSwgMHhDQjY2LCAweENCNjcsIDB4Q0I2OCwgMHhDQjY5LCAweENCNkEsCisgICAgMHhDQjZCLCAweENCNkMsIDB4Q0I2RCwgMHhDQjZFLCAweENCNkYsIDB4Q0I3MCwgMHhDQjcxLCAweENCNzIsIDB4Q0I3MywKKyAgICAweENCNzQsIDB4Q0I3NSwgMHhDQjc2LCAweENCNzcsIDB4Q0I3QSwgMHhDQjdCLCAweENCN0MsIDB4Q0I3RCwgMHhDQjdFLAorICAgIDB4Q0I3RiwgMHhDQjgwLCAweENCODEsIDB4Q0I4MiwgMHhDQjgzLCAweENCODQsIDB4Q0I4NSwgMHhDQjg2LCAweENCODcsCisgICAgMHhDQjg4LCAweENCODksIDB4Q0I4QSwgMHhDQjhCLCAweENCOEMsIDB4Q0I4RCwgMHhDQjhFLCAweENCOEYsIDB4Q0I5MCwKKyAgICAweENCOTEsIDB4Q0I5MiwgMHhDQjkzLCAweENCOTQsIDB4Q0I5NSwgMHhDQjk2LCAweENCOTcsIDB4Q0I5OCwgMHhDQjk5LAorICAgIDB4Q0I5QSwgMHhDQjlCLCAweENCOUQsIDB4Q0I5RSwgMHhDQjlGLCAweENCQTAsIDB4Q0JBMSwgMHhDQkEyLCAweENCQTMsCisgICAgMHhDQkE0LCAweENCQTUsIDB4Q0JBNiwgMHhDQkE3LCAweENCQTgsIDB4Q0JBOSwgMHhDQkFBLCAweENCQUIsIDB4Q0JBQywKKyAgICAweENCQUQsIDB4Q0JBRSwgMHhDQkFGLCAweENCQjAsIDB4Q0JCMSwgMHhDQkIyLCAweENCQjMsIDB4Q0JCNCwgMHhDQkI1LAorICAgIDB4Q0JCNiwgMHhDQkI3LCAweENCQjksIDB4Q0JCQSwgMHhDQkJCLCAweENCQkMsIDB4Q0JCRCwgMHhDQkJFLCAweENCQkYsCisgICAgMHhDQkMwLCAweENCQzEsIDB4Q0JDMiwgMHhDQkMzLCAweENCQzQsIDB4Q0JDNSwgMHhDQkM2LCAweENCQzcsIDB4Q0JDOCwKKyAgICAweENCQzksIDB4Q0JDQSwgMHhDQkNCLCAweENCQ0MsIDB4Q0JDRCwgMHhDQkNFLCAweENCQ0YsIDB4Q0JEMCwgMHhDQkQxLAorICAgIDB4Q0JEMiwgMHhDQkQzLCAweENCRDUsIDB4Q0JENiwgMHhDQkQ3LCAweENCRDgsIDB4Q0JEOSwgMHhDQkRBLCAweENCREIsCisgICAgMHhDQkRDLCAweENCREQsIDB4Q0JERSwgMHhDQkRGLCAweENCRTAsIDB4Q0JFMSwgMHhDQkUyLCAweENCRTMsIDB4Q0JFNSwKKyAgICAweENCRTYsIDB4Q0JFOCwgMHhDQkVBLCAweENCRUIsIDB4Q0JFQywgMHhDQkVELCAweENCRUUsIDB4Q0JFRiwgMHhDQkYwLAorICAgIDB4Q0JGMSwgMHhDQkYyLCAweENCRjMsIDB4Q0JGNCwgMHhDQkY1LCAweENCRjYsIDB4Q0JGNywgMHhDQkY4LCAweENCRjksCisgICAgMHhDQkZBLCAweENCRkIsIDB4Q0JGQywgMHhDQkZELCAweENCRkUsIDB4Q0JGRiwgMHhDQzAwLCAweENDMDEsIDB4Q0MwMiwKKyAgICAweENDMDMsIDB4Q0MwNCwgMHhDQzA1LCAweENDMDYsIDB4Q0MwNywgMHhDQzA4LCAweENDMDksIDB4Q0MwQSwgMHhDQzBCLAorICAgIDB4Q0MwRSwgMHhDQzBGLCAweENDMTEsIDB4Q0MxMiwgMHhDQzEzLCAweENDMTUsIDB4Q0MxNiwgMHhDQzE3LCAweENDMTgsCisgICAgMHhDQzE5LCAweENDMUEsIDB4Q0MxQiwgMHhDQzFFLCAweENDMUYsIDB4Q0MyMCwgMHhDQzIzLCAweENDMjQsIDB4Q0MyNSwKKyAgICAweENDMjYsIDB4Q0MyQSwgMHhDQzJCLCAweENDMkQsIDB4Q0MyRiwgMHhDQzMxLCAweENDMzIsIDB4Q0MzMywgMHhDQzM0LAorICAgIDB4Q0MzNSwgMHhDQzM2LCAweENDMzcsIDB4Q0MzQSwgMHhDQzNGLCAweENDNDAsIDB4Q0M0MSwgMHhDQzQyLCAweENDNDMsCisgICAgMHhDQzQ2LCAweENDNDcsIDB4Q0M0OSwgMHhDQzRBLCAweENDNEIsIDB4Q0M0RCwgMHhDQzRFLCAweENDNEYsIDB4Q0M1MCwKKyAgICAweENDNTEsIDB4Q0M1MiwgMHhDQzUzLCAweENDNTYsIDB4Q0M1QSwgMHhDQzVCLCAweENDNUMsIDB4Q0M1RCwgMHhDQzVFLAorICAgIDB4Q0M1RiwgMHhDQzYxLCAweENDNjIsIDB4Q0M2MywgMHhDQzY1LCAweENDNjcsIDB4Q0M2OSwgMHhDQzZBLCAweENDNkIsCisgICAgMHhDQzZDLCAweENDNkQsIDB4Q0M2RSwgMHhDQzZGLCAweENDNzEsIDB4Q0M3MiwgMHhDQzczLCAweENDNzQsIDB4Q0M3NiwKKyAgICAweENDNzcsIDB4Q0M3OCwgMHhDQzc5LCAweENDN0EsIDB4Q0M3QiwgMHhDQzdDLCAweENDN0QsIDB4Q0M3RSwgMHhDQzdGLAorICAgIDB4Q0M4MCwgMHhDQzgxLCAweENDODIsIDB4Q0M4MywgMHhDQzg0LCAweENDODUsIDB4Q0M4NiwgMHhDQzg3LCAweENDODgsCisgICAgMHhDQzg5LCAweENDOEEsIDB4Q0M4QiwgMHhDQzhDLCAweENDOEQsIDB4Q0M4RSwgMHhDQzhGLCAweENDOTAsIDB4Q0M5MSwKKyAgICAweENDOTIsIDB4Q0M5MywgMHhDQzk0LCAweENDOTUsIDB4Q0M5NiwgMHhDQzk3LCAweENDOUEsIDB4Q0M5QiwgMHhDQzlELAorICAgIDB4Q0M5RSwgMHhDQzlGLCAweENDQTEsIDB4Q0NBMiwgMHhDQ0EzLCAweENDQTQsIDB4Q0NBNSwgMHhDQ0E2LCAweENDQTcsCisgICAgMHhDQ0FBLCAweENDQUUsIDB4Q0NBRiwgMHhDQ0IwLCAweENDQjEsIDB4Q0NCMiwgMHhDQ0IzLCAweENDQjYsIDB4Q0NCNywKKyAgICAweENDQjksIDB4Q0NCQSwgMHhDQ0JCLCAweENDQkQsIDB4Q0NCRSwgMHhDQ0JGLCAweENDQzAsIDB4Q0NDMSwgMHhDQ0MyLAorICAgIDB4Q0NDMywgMHhDQ0M2LCAweENDQzgsIDB4Q0NDQSwgMHhDQ0NCLCAweENDQ0MsIDB4Q0NDRCwgMHhDQ0NFLCAweENDQ0YsCisgICAgMHhDQ0QxLCAweENDRDIsIDB4Q0NEMywgMHhDQ0Q1LCAweENDRDYsIDB4Q0NENywgMHhDQ0Q4LCAweENDRDksIDB4Q0NEQSwKKyAgICAweENDREIsIDB4Q0NEQywgMHhDQ0RELCAweENDREUsIDB4Q0NERiwgMHhDQ0UwLCAweENDRTEsIDB4Q0NFMiwgMHhDQ0UzLAorICAgIDB4Q0NFNSwgMHhDQ0U2LCAweENDRTcsIDB4Q0NFOCwgMHhDQ0U5LCAweENDRUEsIDB4Q0NFQiwgMHhDQ0VELCAweENDRUUsCisgICAgMHhDQ0VGLCAweENDRjEsIDB4Q0NGMiwgMHhDQ0YzLCAweENDRjQsIDB4Q0NGNSwgMHhDQ0Y2LCAweENDRjcsIDB4Q0NGOCwKKyAgICAweENDRjksIDB4Q0NGQSwgMHhDQ0ZCLCAweENDRkMsIDB4Q0NGRCwgMHhDQ0ZFLCAweENDRkYsIDB4Q0QwMCwgMHhDRDAyLAorICAgIDB4Q0QwMywgMHhDRDA0LCAweENEMDUsIDB4Q0QwNiwgMHhDRDA3LCAweENEMEEsIDB4Q0QwQiwgMHhDRDBELCAweENEMEUsCisgICAgMHhDRDBGLCAweENEMTEsIDB4Q0QxMiwgMHhDRDEzLCAweENEMTQsIDB4Q0QxNSwgMHhDRDE2LCAweENEMTcsIDB4Q0QxQSwKKyAgICAweENEMUMsIDB4Q0QxRSwgMHhDRDFGLCAweENEMjAsIDB4Q0QyMSwgMHhDRDIyLCAweENEMjMsIDB4Q0QyNSwgMHhDRDI2LAorICAgIDB4Q0QyNywgMHhDRDI5LCAweENEMkEsIDB4Q0QyQiwgMHhDRDJELCAweENEMkUsIDB4Q0QyRiwgMHhDRDMwLCAweENEMzEsCisgICAgMHhDRDMyLCAweENEMzMsIDB4Q0QzNCwgMHhDRDM1LCAweENEMzYsIDB4Q0QzNywgMHhDRDM4LCAweENEM0EsIDB4Q0QzQiwKKyAgICAweENEM0MsIDB4Q0QzRCwgMHhDRDNFLCAweENEM0YsIDB4Q0Q0MCwgMHhDRDQxLCAweENENDIsIDB4Q0Q0MywgMHhDRDQ0LAorICAgIDB4Q0Q0NSwgMHhDRDQ2LCAweENENDcsIDB4Q0Q0OCwgMHhDRDQ5LCAweENENEEsIDB4Q0Q0QiwgMHhDRDRDLCAweENENEQsCisgICAgMHhDRDRFLCAweENENEYsIDB4Q0Q1MCwgMHhDRDUxLCAweENENTIsIDB4Q0Q1MywgMHhDRDU0LCAweENENTUsIDB4Q0Q1NiwKKyAgICAweENENTcsIDB4Q0Q1OCwgMHhDRDU5LCAweENENUEsIDB4Q0Q1QiwgMHhDRDVELCAweENENUUsIDB4Q0Q1RiwgMHhDRDYxLAorICAgIDB4Q0Q2MiwgMHhDRDYzLCAweENENjUsIDB4Q0Q2NiwgMHhDRDY3LCAweENENjgsIDB4Q0Q2OSwgMHhDRDZBLCAweENENkIsCisgICAgMHhDRDZFLCAweENENzAsIDB4Q0Q3MiwgMHhDRDczLCAweENENzQsIDB4Q0Q3NSwgMHhDRDc2LCAweENENzcsIDB4Q0Q3OSwKKyAgICAweENEN0EsIDB4Q0Q3QiwgMHhDRDdDLCAweENEN0QsIDB4Q0Q3RSwgMHhDRDdGLCAweENEODAsIDB4Q0Q4MSwgMHhDRDgyLAorICAgIDB4Q0Q4MywgMHhDRDg0LCAweENEODUsIDB4Q0Q4NiwgMHhDRDg3LCAweENEODksIDB4Q0Q4QSwgMHhDRDhCLCAweENEOEMsCisgICAgMHhDRDhELCAweENEOEUsIDB4Q0Q4RiwgMHhDRDkwLCAweENEOTEsIDB4Q0Q5MiwgMHhDRDkzLCAweENEOTYsIDB4Q0Q5NywKKyAgICAweENEOTksIDB4Q0Q5QSwgMHhDRDlCLCAweENEOUQsIDB4Q0Q5RSwgMHhDRDlGLCAweENEQTAsIDB4Q0RBMSwgMHhDREEyLAorICAgIDB4Q0RBMywgMHhDREE2LCAweENEQTgsIDB4Q0RBQSwgMHhDREFCLCAweENEQUMsIDB4Q0RBRCwgMHhDREFFLCAweENEQUYsCisgICAgMHhDREIxLCAweENEQjIsIDB4Q0RCMywgMHhDREI0LCAweENEQjUsIDB4Q0RCNiwgMHhDREI3LCAweENEQjgsIDB4Q0RCOSwKKyAgICAweENEQkEsIDB4Q0RCQiwgMHhDREJDLCAweENEQkQsIDB4Q0RCRSwgMHhDREJGLCAweENEQzAsIDB4Q0RDMSwgMHhDREMyLAorICAgIDB4Q0RDMywgMHhDREM1LCAweENEQzYsIDB4Q0RDNywgMHhDREM4LCAweENEQzksIDB4Q0RDQSwgMHhDRENCLCAweENEQ0QsCisgICAgMHhDRENFLCAweENEQ0YsIDB4Q0REMSwgMHhDREQyLCAweENERDMsIDB4Q0RENCwgMHhDREQ1LCAweENERDYsIDB4Q0RENywKKyAgICAweENERDgsIDB4Q0REOSwgMHhDRERBLCAweENEREIsIDB4Q0REQywgMHhDRERELCAweENEREUsIDB4Q0RERiwgMHhDREUwLAorICAgIDB4Q0RFMSwgMHhDREUyLCAweENERTMsIDB4Q0RFNCwgMHhDREU1LCAweENERTYsIDB4Q0RFNywgMHhDREU5LCAweENERUEsCisgICAgMHhDREVCLCAweENERUQsIDB4Q0RFRSwgMHhDREVGLCAweENERjEsIDB4Q0RGMiwgMHhDREYzLCAweENERjQsIDB4Q0RGNSwKKyAgICAweENERjYsIDB4Q0RGNywgMHhDREZBLCAweENERkMsIDB4Q0RGRSwgMHhDREZGLCAweENFMDAsIDB4Q0UwMSwgMHhDRTAyLAorICAgIDB4Q0UwMywgMHhDRTA1LCAweENFMDYsIDB4Q0UwNywgMHhDRTA5LCAweENFMEEsIDB4Q0UwQiwgMHhDRTBELCAweENFMEUsCisgICAgMHhDRTBGLCAweENFMTAsIDB4Q0UxMSwgMHhDRTEyLCAweENFMTMsIDB4Q0UxNSwgMHhDRTE2LCAweENFMTcsIDB4Q0UxOCwKKyAgICAweENFMUEsIDB4Q0UxQiwgMHhDRTFDLCAweENFMUQsIDB4Q0UxRSwgMHhDRTFGLCAweENFMjIsIDB4Q0UyMywgMHhDRTI1LAorICAgIDB4Q0UyNiwgMHhDRTI3LCAweENFMjksIDB4Q0UyQSwgMHhDRTJCLCAweENFMkMsIDB4Q0UyRCwgMHhDRTJFLCAweENFMkYsCisgICAgMHhDRTMyLCAweENFMzQsIDB4Q0UzNiwgMHhDRTM3LCAweENFMzgsIDB4Q0UzOSwgMHhDRTNBLCAweENFM0IsIDB4Q0UzQywKKyAgICAweENFM0QsIDB4Q0UzRSwgMHhDRTNGLCAweENFNDAsIDB4Q0U0MSwgMHhDRTQyLCAweENFNDMsIDB4Q0U0NCwgMHhDRTQ1LAorICAgIDB4Q0U0NiwgMHhDRTQ3LCAweENFNDgsIDB4Q0U0OSwgMHhDRTRBLCAweENFNEIsIDB4Q0U0QywgMHhDRTRELCAweENFNEUsCisgICAgMHhDRTRGLCAweENFNTAsIDB4Q0U1MSwgMHhDRTUyLCAweENFNTMsIDB4Q0U1NCwgMHhDRTU1LCAweENFNTYsIDB4Q0U1NywKKyAgICAweENFNUEsIDB4Q0U1QiwgMHhDRTVELCAweENFNUUsIDB4Q0U2MiwgMHhDRTYzLCAweENFNjQsIDB4Q0U2NSwgMHhDRTY2LAorICAgIDB4Q0U2NywgMHhDRTZBLCAweENFNkMsIDB4Q0U2RSwgMHhDRTZGLCAweENFNzAsIDB4Q0U3MSwgMHhDRTcyLCAweENFNzMsCisgICAgMHhDRTc2LCAweENFNzcsIDB4Q0U3OSwgMHhDRTdBLCAweENFN0IsIDB4Q0U3RCwgMHhDRTdFLCAweENFN0YsIDB4Q0U4MCwKKyAgICAweENFODEsIDB4Q0U4MiwgMHhDRTgzLCAweENFODYsIDB4Q0U4OCwgMHhDRThBLCAweENFOEIsIDB4Q0U4QywgMHhDRThELAorICAgIDB4Q0U4RSwgMHhDRThGLCAweENFOTIsIDB4Q0U5MywgMHhDRTk1LCAweENFOTYsIDB4Q0U5NywgMHhDRTk5LCAweENFOUEsCisgICAgMHhDRTlCLCAweENFOUMsIDB4Q0U5RCwgMHhDRTlFLCAweENFOUYsIDB4Q0VBMiwgMHhDRUE2LCAweENFQTcsIDB4Q0VBOCwKKyAgICAweENFQTksIDB4Q0VBQSwgMHhDRUFCLCAweENFQUUsIDB4Q0VBRiwgMHhDRUIwLCAweENFQjEsIDB4Q0VCMiwgMHhDRUIzLAorICAgIDB4Q0VCNCwgMHhDRUI1LCAweENFQjYsIDB4Q0VCNywgMHhDRUI4LCAweENFQjksIDB4Q0VCQSwgMHhDRUJCLCAweENFQkMsCisgICAgMHhDRUJELCAweENFQkUsIDB4Q0VCRiwgMHhDRUMwLCAweENFQzIsIDB4Q0VDMywgMHhDRUM0LCAweENFQzUsIDB4Q0VDNiwKKyAgICAweENFQzcsIDB4Q0VDOCwgMHhDRUM5LCAweENFQ0EsIDB4Q0VDQiwgMHhDRUNDLCAweENFQ0QsIDB4Q0VDRSwgMHhDRUNGLAorICAgIDB4Q0VEMCwgMHhDRUQxLCAweENFRDIsIDB4Q0VEMywgMHhDRUQ0LCAweENFRDUsIDB4Q0VENiwgMHhDRUQ3LCAweENFRDgsCisgICAgMHhDRUQ5LCAweENFREEsIDB4Q0VEQiwgMHhDRURDLCAweENFREQsIDB4Q0VERSwgMHhDRURGLCAweENFRTAsIDB4Q0VFMSwKKyAgICAweENFRTIsIDB4Q0VFMywgMHhDRUU2LCAweENFRTcsIDB4Q0VFOSwgMHhDRUVBLCAweENFRUQsIDB4Q0VFRSwgMHhDRUVGLAorICAgIDB4Q0VGMCwgMHhDRUYxLCAweENFRjIsIDB4Q0VGMywgMHhDRUY2LCAweENFRkEsIDB4Q0VGQiwgMHhDRUZDLCAweENFRkQsCisgICAgMHhDRUZFLCAweENFRkYsIDB4Q0YwMiwgMHhDRjAzLCAweENGMDUsIDB4Q0YwNiwgMHhDRjA3LCAweENGMDksIDB4Q0YwQSwKKyAgICAweENGMEIsIDB4Q0YwQywgMHhDRjBELCAweENGMEUsIDB4Q0YwRiwgMHhDRjEyLCAweENGMTQsIDB4Q0YxNiwgMHhDRjE3LAorICAgIDB4Q0YxOCwgMHhDRjE5LCAweENGMUEsIDB4Q0YxQiwgMHhDRjFELCAweENGMUUsIDB4Q0YxRiwgMHhDRjIxLCAweENGMjIsCisgICAgMHhDRjIzLCAweENGMjUsIDB4Q0YyNiwgMHhDRjI3LCAweENGMjgsIDB4Q0YyOSwgMHhDRjJBLCAweENGMkIsIDB4Q0YyRSwKKyAgICAweENGMzIsIDB4Q0YzMywgMHhDRjM0LCAweENGMzUsIDB4Q0YzNiwgMHhDRjM3LCAweENGMzksIDB4Q0YzQSwgMHhDRjNCLAorICAgIDB4Q0YzQywgMHhDRjNELCAweENGM0UsIDB4Q0YzRiwgMHhDRjQwLCAweENGNDEsIDB4Q0Y0MiwgMHhDRjQzLCAweENGNDQsCisgICAgMHhDRjQ1LCAweENGNDYsIDB4Q0Y0NywgMHhDRjQ4LCAweENGNDksIDB4Q0Y0QSwgMHhDRjRCLCAweENGNEMsIDB4Q0Y0RCwKKyAgICAweENGNEUsIDB4Q0Y0RiwgMHhDRjUwLCAweENGNTEsIDB4Q0Y1MiwgMHhDRjUzLCAweENGNTYsIDB4Q0Y1NywgMHhDRjU5LAorICAgIDB4Q0Y1QSwgMHhDRjVCLCAweENGNUQsIDB4Q0Y1RSwgMHhDRjVGLCAweENGNjAsIDB4Q0Y2MSwgMHhDRjYyLCAweENGNjMsCisgICAgMHhDRjY2LCAweENGNjgsIDB4Q0Y2QSwgMHhDRjZCLCAweENGNkMsIDB4Q0Y2RCwgMHhDRjZFLCAweENGNkYsIDB4Q0Y3MiwKKyAgICAweENGNzMsIDB4Q0Y3NSwgMHhDRjc2LCAweENGNzcsIDB4Q0Y3OSwgMHhDRjdBLCAweENGN0IsIDB4Q0Y3QywgMHhDRjdELAorICAgIDB4Q0Y3RSwgMHhDRjdGLCAweENGODEsIDB4Q0Y4MiwgMHhDRjgzLCAweENGODQsIDB4Q0Y4NiwgMHhDRjg3LCAweENGODgsCisgICAgMHhDRjg5LCAweENGOEEsIDB4Q0Y4QiwgMHhDRjhELCAweENGOEUsIDB4Q0Y4RiwgMHhDRjkwLCAweENGOTEsIDB4Q0Y5MiwKKyAgICAweENGOTMsIDB4Q0Y5NCwgMHhDRjk1LCAweENGOTYsIDB4Q0Y5NywgMHhDRjk4LCAweENGOTksIDB4Q0Y5QSwgMHhDRjlCLAorICAgIDB4Q0Y5QywgMHhDRjlELCAweENGOUUsIDB4Q0Y5RiwgMHhDRkEwLCAweENGQTIsIDB4Q0ZBMywgMHhDRkE0LCAweENGQTUsCisgICAgMHhDRkE2LCAweENGQTcsIDB4Q0ZBOSwgMHhDRkFBLCAweENGQUIsIDB4Q0ZBQywgMHhDRkFELCAweENGQUUsIDB4Q0ZBRiwKKyAgICAweENGQjEsIDB4Q0ZCMiwgMHhDRkIzLCAweENGQjQsIDB4Q0ZCNSwgMHhDRkI2LCAweENGQjcsIDB4Q0ZCOCwgMHhDRkI5LAorICAgIDB4Q0ZCQSwgMHhDRkJCLCAweENGQkMsIDB4Q0ZCRCwgMHhDRkJFLCAweENGQkYsIDB4Q0ZDMCwgMHhDRkMxLCAweENGQzIsCisgICAgMHhDRkMzLCAweENGQzUsIDB4Q0ZDNiwgMHhDRkM3LCAweENGQzgsIDB4Q0ZDOSwgMHhDRkNBLCAweENGQ0IsIDB4Q0ZDQywKKyAgICAweENGQ0QsIDB4Q0ZDRSwgMHhDRkNGLCAweENGRDAsIDB4Q0ZEMSwgMHhDRkQyLCAweENGRDMsIDB4Q0ZENCwgMHhDRkQ1LAorICAgIDB4Q0ZENiwgMHhDRkQ3LCAweENGRDgsIDB4Q0ZEOSwgMHhDRkRBLCAweENGREIsIDB4Q0ZEQywgMHhDRkRELCAweENGREUsCisgICAgMHhDRkRGLCAweENGRTIsIDB4Q0ZFMywgMHhDRkU1LCAweENGRTYsIDB4Q0ZFNywgMHhDRkU5LCAweENGRUEsIDB4Q0ZFQiwKKyAgICAweENGRUMsIDB4Q0ZFRCwgMHhDRkVFLCAweENGRUYsIDB4Q0ZGMiwgMHhDRkY0LCAweENGRjYsIDB4Q0ZGNywgMHhDRkY4LAorICAgIDB4Q0ZGOSwgMHhDRkZBLCAweENGRkIsIDB4Q0ZGRCwgMHhDRkZFLCAweENGRkYsIDB4RDAwMSwgMHhEMDAyLCAweEQwMDMsCisgICAgMHhEMDA1LCAweEQwMDYsIDB4RDAwNywgMHhEMDA4LCAweEQwMDksIDB4RDAwQSwgMHhEMDBCLCAweEQwMEMsIDB4RDAwRCwKKyAgICAweEQwMEUsIDB4RDAwRiwgMHhEMDEwLCAweEQwMTIsIDB4RDAxMywgMHhEMDE0LCAweEQwMTUsIDB4RDAxNiwgMHhEMDE3LAorICAgIDB4RDAxOSwgMHhEMDFBLCAweEQwMUIsIDB4RDAxQywgMHhEMDFELCAweEQwMUUsIDB4RDAxRiwgMHhEMDIwLCAweEQwMjEsCisgICAgMHhEMDIyLCAweEQwMjMsIDB4RDAyNCwgMHhEMDI1LCAweEQwMjYsIDB4RDAyNywgMHhEMDI4LCAweEQwMjksIDB4RDAyQSwKKyAgICAweEQwMkIsIDB4RDAyQywgMHhEMDJFLCAweEQwMkYsIDB4RDAzMCwgMHhEMDMxLCAweEQwMzIsIDB4RDAzMywgMHhEMDM2LAorICAgIDB4RDAzNywgMHhEMDM5LCAweEQwM0EsIDB4RDAzQiwgMHhEMDNELCAweEQwM0UsIDB4RDAzRiwgMHhEMDQwLCAweEQwNDEsCisgICAgMHhEMDQyLCAweEQwNDMsIDB4RDA0NiwgMHhEMDQ4LCAweEQwNEEsIDB4RDA0QiwgMHhEMDRDLCAweEQwNEQsIDB4RDA0RSwKKyAgICAweEQwNEYsIDB4RDA1MSwgMHhEMDUyLCAweEQwNTMsIDB4RDA1NSwgMHhEMDU2LCAweEQwNTcsIDB4RDA1OSwgMHhEMDVBLAorICAgIDB4RDA1QiwgMHhEMDVDLCAweEQwNUQsIDB4RDA1RSwgMHhEMDVGLCAweEQwNjEsIDB4RDA2MiwgMHhEMDYzLCAweEQwNjQsCisgICAgMHhEMDY1LCAweEQwNjYsIDB4RDA2NywgMHhEMDY4LCAweEQwNjksIDB4RDA2QSwgMHhEMDZCLCAweEQwNkUsIDB4RDA2RiwKKyAgICAweEQwNzEsIDB4RDA3MiwgMHhEMDczLCAweEQwNzUsIDB4RDA3NiwgMHhEMDc3LCAweEQwNzgsIDB4RDA3OSwgMHhEMDdBLAorICAgIDB4RDA3QiwgMHhEMDdFLCAweEQwN0YsIDB4RDA4MCwgMHhEMDgyLCAweEQwODMsIDB4RDA4NCwgMHhEMDg1LCAweEQwODYsCisgICAgMHhEMDg3LCAweEQwODgsIDB4RDA4OSwgMHhEMDhBLCAweEQwOEIsIDB4RDA4QywgMHhEMDhELCAweEQwOEUsIDB4RDA4RiwKKyAgICAweEQwOTAsIDB4RDA5MSwgMHhEMDkyLCAweEQwOTMsIDB4RDA5NCwgMHhEMDk1LCAweEQwOTYsIDB4RDA5NywgMHhEMDk4LAorICAgIDB4RDA5OSwgMHhEMDlBLCAweEQwOUIsIDB4RDA5QywgMHhEMDlELCAweEQwOUUsIDB4RDA5RiwgMHhEMEEwLCAweEQwQTEsCisgICAgMHhEMEEyLCAweEQwQTMsIDB4RDBBNiwgMHhEMEE3LCAweEQwQTksIDB4RDBBQSwgMHhEMEFCLCAweEQwQUQsIDB4RDBBRSwKKyAgICAweEQwQUYsIDB4RDBCMCwgMHhEMEIxLCAweEQwQjIsIDB4RDBCMywgMHhEMEI2LCAweEQwQjgsIDB4RDBCQSwgMHhEMEJCLAorICAgIDB4RDBCQywgMHhEMEJELCAweEQwQkUsIDB4RDBCRiwgMHhEMEMyLCAweEQwQzMsIDB4RDBDNSwgMHhEMEM2LCAweEQwQzcsCisgICAgMHhEMENBLCAweEQwQ0IsIDB4RDBDQywgMHhEMENELCAweEQwQ0UsIDB4RDBDRiwgMHhEMEQyLCAweEQwRDYsIDB4RDBENywKKyAgICAweEQwRDgsIDB4RDBEOSwgMHhEMERBLCAweEQwREIsIDB4RDBERSwgMHhEMERGLCAweEQwRTEsIDB4RDBFMiwgMHhEMEUzLAorICAgIDB4RDBFNSwgMHhEMEU2LCAweEQwRTcsIDB4RDBFOCwgMHhEMEU5LCAweEQwRUEsIDB4RDBFQiwgMHhEMEVFLCAweEQwRjIsCisgICAgMHhEMEYzLCAweEQwRjQsIDB4RDBGNSwgMHhEMEY2LCAweEQwRjcsIDB4RDBGOSwgMHhEMEZBLCAweEQwRkIsIDB4RDBGQywKKyAgICAweEQwRkQsIDB4RDBGRSwgMHhEMEZGLCAweEQxMDAsIDB4RDEwMSwgMHhEMTAyLCAweEQxMDMsIDB4RDEwNCwgMHhEMTA1LAorICAgIDB4RDEwNiwgMHhEMTA3LCAweEQxMDgsIDB4RDEwOSwgMHhEMTBBLCAweEQxMEIsIDB4RDEwQywgMHhEMTBFLCAweEQxMEYsCisgICAgMHhEMTEwLCAweEQxMTEsIDB4RDExMiwgMHhEMTEzLCAweEQxMTQsIDB4RDExNSwgMHhEMTE2LCAweEQxMTcsIDB4RDExOCwKKyAgICAweEQxMTksIDB4RDExQSwgMHhEMTFCLCAweEQxMUMsIDB4RDExRCwgMHhEMTFFLCAweEQxMUYsIDB4RDEyMCwgMHhEMTIxLAorICAgIDB4RDEyMiwgMHhEMTIzLCAweEQxMjQsIDB4RDEyNSwgMHhEMTI2LCAweEQxMjcsIDB4RDEyOCwgMHhEMTI5LCAweEQxMkEsCisgICAgMHhEMTJCLCAweEQxMkMsIDB4RDEyRCwgMHhEMTJFLCAweEQxMkYsIDB4RDEzMiwgMHhEMTMzLCAweEQxMzUsIDB4RDEzNiwKKyAgICAweEQxMzcsIDB4RDEzOSwgMHhEMTNCLCAweEQxM0MsIDB4RDEzRCwgMHhEMTNFLCAweEQxM0YsIDB4RDE0MiwgMHhEMTQ2LAorICAgIDB4RDE0NywgMHhEMTQ4LCAweEQxNDksIDB4RDE0QSwgMHhEMTRCLCAweEQxNEUsIDB4RDE0RiwgMHhEMTUxLCAweEQxNTIsCisgICAgMHhEMTUzLCAweEQxNTUsIDB4RDE1NiwgMHhEMTU3LCAweEQxNTgsIDB4RDE1OSwgMHhEMTVBLCAweEQxNUIsIDB4RDE1RSwKKyAgICAweEQxNjAsIDB4RDE2MiwgMHhEMTYzLCAweEQxNjQsIDB4RDE2NSwgMHhEMTY2LCAweEQxNjcsIDB4RDE2OSwgMHhEMTZBLAorICAgIDB4RDE2QiwgMHhEMTZELCAweEQxNkUsIDB4RDE2RiwgMHhEMTcwLCAweEQxNzEsIDB4RDE3MiwgMHhEMTczLCAweEQxNzQsCisgICAgMHhEMTc1LCAweEQxNzYsIDB4RDE3NywgMHhEMTc4LCAweEQxNzksIDB4RDE3QSwgMHhEMTdCLCAweEQxN0QsIDB4RDE3RSwKKyAgICAweEQxN0YsIDB4RDE4MCwgMHhEMTgxLCAweEQxODIsIDB4RDE4MywgMHhEMTg1LCAweEQxODYsIDB4RDE4NywgMHhEMTg5LAorICAgIDB4RDE4QSwgMHhEMThCLCAweEQxOEMsIDB4RDE4RCwgMHhEMThFLCAweEQxOEYsIDB4RDE5MCwgMHhEMTkxLCAweEQxOTIsCisgICAgMHhEMTkzLCAweEQxOTQsIDB4RDE5NSwgMHhEMTk2LCAweEQxOTcsIDB4RDE5OCwgMHhEMTk5LCAweEQxOUEsIDB4RDE5QiwKKyAgICAweEQxOUMsIDB4RDE5RCwgMHhEMTlFLCAweEQxOUYsIDB4RDFBMiwgMHhEMUEzLCAweEQxQTUsIDB4RDFBNiwgMHhEMUE3LAorICAgIDB4RDFBOSwgMHhEMUFBLCAweEQxQUIsIDB4RDFBQywgMHhEMUFELCAweEQxQUUsIDB4RDFBRiwgMHhEMUIyLCAweEQxQjQsCisgICAgMHhEMUI2LCAweEQxQjcsIDB4RDFCOCwgMHhEMUI5LCAweEQxQkIsIDB4RDFCRCwgMHhEMUJFLCAweEQxQkYsIDB4RDFDMSwKKyAgICAweEQxQzIsIDB4RDFDMywgMHhEMUM0LCAweEQxQzUsIDB4RDFDNiwgMHhEMUM3LCAweEQxQzgsIDB4RDFDOSwgMHhEMUNBLAorICAgIDB4RDFDQiwgMHhEMUNDLCAweEQxQ0QsIDB4RDFDRSwgMHhEMUNGLCAweEQxRDAsIDB4RDFEMSwgMHhEMUQyLCAweEQxRDMsCisgICAgMHhEMUQ0LCAweEQxRDUsIDB4RDFENiwgMHhEMUQ3LCAweEQxRDksIDB4RDFEQSwgMHhEMURCLCAweEQxREMsIDB4RDFERCwKKyAgICAweEQxREUsIDB4RDFERiwgMHhEMUUwLCAweEQxRTEsIDB4RDFFMiwgMHhEMUUzLCAweEQxRTQsIDB4RDFFNSwgMHhEMUU2LAorICAgIDB4RDFFNywgMHhEMUU4LCAweEQxRTksIDB4RDFFQSwgMHhEMUVCLCAweEQxRUMsIDB4RDFFRCwgMHhEMUVFLCAweEQxRUYsCisgICAgMHhEMUYwLCAweEQxRjEsIDB4RDFGMiwgMHhEMUYzLCAweEQxRjUsIDB4RDFGNiwgMHhEMUY3LCAweEQxRjksIDB4RDFGQSwKKyAgICAweEQxRkIsIDB4RDFGQywgMHhEMUZELCAweEQxRkUsIDB4RDFGRiwgMHhEMjAwLCAweEQyMDEsIDB4RDIwMiwgMHhEMjAzLAorICAgIDB4RDIwNCwgMHhEMjA1LCAweEQyMDYsIDB4RDIwOCwgMHhEMjBBLCAweEQyMEIsIDB4RDIwQywgMHhEMjBELCAweEQyMEUsCisgICAgMHhEMjBGLCAweEQyMTEsIDB4RDIxMiwgMHhEMjEzLCAweEQyMTQsIDB4RDIxNSwgMHhEMjE2LCAweEQyMTcsIDB4RDIxOCwKKyAgICAweEQyMTksIDB4RDIxQSwgMHhEMjFCLCAweEQyMUMsIDB4RDIxRCwgMHhEMjFFLCAweEQyMUYsIDB4RDIyMCwgMHhEMjIxLAorICAgIDB4RDIyMiwgMHhEMjIzLCAweEQyMjQsIDB4RDIyNSwgMHhEMjI2LCAweEQyMjcsIDB4RDIyOCwgMHhEMjI5LCAweEQyMkEsCisgICAgMHhEMjJCLCAweEQyMkUsIDB4RDIyRiwgMHhEMjMxLCAweEQyMzIsIDB4RDIzMywgMHhEMjM1LCAweEQyMzYsIDB4RDIzNywKKyAgICAweEQyMzgsIDB4RDIzOSwgMHhEMjNBLCAweEQyM0IsIDB4RDIzRSwgMHhEMjQwLCAweEQyNDIsIDB4RDI0MywgMHhEMjQ0LAorICAgIDB4RDI0NSwgMHhEMjQ2LCAweEQyNDcsIDB4RDI0OSwgMHhEMjRBLCAweEQyNEIsIDB4RDI0QywgMHhEMjRELCAweEQyNEUsCisgICAgMHhEMjRGLCAweEQyNTAsIDB4RDI1MSwgMHhEMjUyLCAweEQyNTMsIDB4RDI1NCwgMHhEMjU1LCAweEQyNTYsIDB4RDI1NywKKyAgICAweEQyNTgsIDB4RDI1OSwgMHhEMjVBLCAweEQyNUIsIDB4RDI1RCwgMHhEMjVFLCAweEQyNUYsIDB4RDI2MCwgMHhEMjYxLAorICAgIDB4RDI2MiwgMHhEMjYzLCAweEQyNjUsIDB4RDI2NiwgMHhEMjY3LCAweEQyNjgsIDB4RDI2OSwgMHhEMjZBLCAweEQyNkIsCisgICAgMHhEMjZDLCAweEQyNkQsIDB4RDI2RSwgMHhEMjZGLCAweEQyNzAsIDB4RDI3MSwgMHhEMjcyLCAweEQyNzMsIDB4RDI3NCwKKyAgICAweEQyNzUsIDB4RDI3NiwgMHhEMjc3LCAweEQyNzgsIDB4RDI3OSwgMHhEMjdBLCAweEQyN0IsIDB4RDI3QywgMHhEMjdELAorICAgIDB4RDI3RSwgMHhEMjdGLCAweEQyODIsIDB4RDI4MywgMHhEMjg1LCAweEQyODYsIDB4RDI4NywgMHhEMjg5LCAweEQyOEEsCisgICAgMHhEMjhCLCAweEQyOEMsIDB4RDI4RCwgMHhEMjhFLCAweEQyOEYsIDB4RDI5MiwgMHhEMjkzLCAweEQyOTQsIDB4RDI5NiwKKyAgICAweEQyOTcsIDB4RDI5OCwgMHhEMjk5LCAweEQyOUEsIDB4RDI5QiwgMHhEMjlELCAweEQyOUUsIDB4RDI5RiwgMHhEMkExLAorICAgIDB4RDJBMiwgMHhEMkEzLCAweEQyQTUsIDB4RDJBNiwgMHhEMkE3LCAweEQyQTgsIDB4RDJBOSwgMHhEMkFBLCAweEQyQUIsCisgICAgMHhEMkFELCAweEQyQUUsIDB4RDJBRiwgMHhEMkIwLCAweEQyQjIsIDB4RDJCMywgMHhEMkI0LCAweEQyQjUsIDB4RDJCNiwKKyAgICAweEQyQjcsIDB4RDJCQSwgMHhEMkJCLCAweEQyQkQsIDB4RDJCRSwgMHhEMkMxLCAweEQyQzMsIDB4RDJDNCwgMHhEMkM1LAorICAgIDB4RDJDNiwgMHhEMkM3LCAweEQyQ0EsIDB4RDJDQywgMHhEMkNELCAweEQyQ0UsIDB4RDJDRiwgMHhEMkQwLCAweEQyRDEsCisgICAgMHhEMkQyLCAweEQyRDMsIDB4RDJENSwgMHhEMkQ2LCAweEQyRDcsIDB4RDJEOSwgMHhEMkRBLCAweEQyREIsIDB4RDJERCwKKyAgICAweEQyREUsIDB4RDJERiwgMHhEMkUwLCAweEQyRTEsIDB4RDJFMiwgMHhEMkUzLCAweEQyRTYsIDB4RDJFNywgMHhEMkU4LAorICAgIDB4RDJFOSwgMHhEMkVBLCAweEQyRUIsIDB4RDJFQywgMHhEMkVELCAweEQyRUUsIDB4RDJFRiwgMHhEMkYyLCAweEQyRjMsCisgICAgMHhEMkY1LCAweEQyRjYsIDB4RDJGNywgMHhEMkY5LCAweEQyRkEsIDB4RDJGQiwgMHhEMkZDLCAweEQyRkQsIDB4RDJGRSwKKyAgICAweEQyRkYsIDB4RDMwMiwgMHhEMzA0LCAweEQzMDYsIDB4RDMwNywgMHhEMzA4LCAweEQzMDksIDB4RDMwQSwgMHhEMzBCLAorICAgIDB4RDMwRiwgMHhEMzExLCAweEQzMTIsIDB4RDMxMywgMHhEMzE1LCAweEQzMTcsIDB4RDMxOCwgMHhEMzE5LCAweEQzMUEsCisgICAgMHhEMzFCLCAweEQzMUUsIDB4RDMyMiwgMHhEMzIzLCAweEQzMjQsIDB4RDMyNiwgMHhEMzI3LCAweEQzMkEsIDB4RDMyQiwKKyAgICAweEQzMkQsIDB4RDMyRSwgMHhEMzJGLCAweEQzMzEsIDB4RDMzMiwgMHhEMzMzLCAweEQzMzQsIDB4RDMzNSwgMHhEMzM2LAorICAgIDB4RDMzNywgMHhEMzNBLCAweEQzM0UsIDB4RDMzRiwgMHhEMzQwLCAweEQzNDEsIDB4RDM0MiwgMHhEMzQzLCAweEQzNDYsCisgICAgMHhEMzQ3LCAweEQzNDgsIDB4RDM0OSwgMHhEMzRBLCAweEQzNEIsIDB4RDM0QywgMHhEMzRELCAweEQzNEUsIDB4RDM0RiwKKyAgICAweEQzNTAsIDB4RDM1MSwgMHhEMzUyLCAweEQzNTMsIDB4RDM1NCwgMHhEMzU1LCAweEQzNTYsIDB4RDM1NywgMHhEMzU4LAorICAgIDB4RDM1OSwgMHhEMzVBLCAweEQzNUIsIDB4RDM1QywgMHhEMzVELCAweEQzNUUsIDB4RDM1RiwgMHhEMzYwLCAweEQzNjEsCisgICAgMHhEMzYyLCAweEQzNjMsIDB4RDM2NCwgMHhEMzY1LCAweEQzNjYsIDB4RDM2NywgMHhEMzY4LCAweEQzNjksIDB4RDM2QSwKKyAgICAweEQzNkIsIDB4RDM2QywgMHhEMzZELCAweEQzNkUsIDB4RDM2RiwgMHhEMzcwLCAweEQzNzEsIDB4RDM3MiwgMHhEMzczLAorICAgIDB4RDM3NCwgMHhEMzc1LCAweEQzNzYsIDB4RDM3NywgMHhEMzc4LCAweEQzNzksIDB4RDM3QSwgMHhEMzdCLCAweEQzN0UsCisgICAgMHhEMzdGLCAweEQzODEsIDB4RDM4MiwgMHhEMzgzLCAweEQzODUsIDB4RDM4NiwgMHhEMzg3LCAweEQzODgsIDB4RDM4OSwKKyAgICAweEQzOEEsIDB4RDM4QiwgMHhEMzhFLCAweEQzOTIsIDB4RDM5MywgMHhEMzk0LCAweEQzOTUsIDB4RDM5NiwgMHhEMzk3LAorICAgIDB4RDM5QSwgMHhEMzlCLCAweEQzOUQsIDB4RDM5RSwgMHhEMzlGLCAweEQzQTEsIDB4RDNBMiwgMHhEM0EzLCAweEQzQTQsCisgICAgMHhEM0E1LCAweEQzQTYsIDB4RDNBNywgMHhEM0FBLCAweEQzQUMsIDB4RDNBRSwgMHhEM0FGLCAweEQzQjAsIDB4RDNCMSwKKyAgICAweEQzQjIsIDB4RDNCMywgMHhEM0I1LCAweEQzQjYsIDB4RDNCNywgMHhEM0I5LCAweEQzQkEsIDB4RDNCQiwgMHhEM0JELAorICAgIDB4RDNCRSwgMHhEM0JGLCAweEQzQzAsIDB4RDNDMSwgMHhEM0MyLCAweEQzQzMsIDB4RDNDNiwgMHhEM0M3LCAweEQzQ0EsCisgICAgMHhEM0NCLCAweEQzQ0MsIDB4RDNDRCwgMHhEM0NFLCAweEQzQ0YsIDB4RDNEMSwgMHhEM0QyLCAweEQzRDMsIDB4RDNENCwKKyAgICAweEQzRDUsIDB4RDNENiwgMHhEM0Q3LCAweEQzRDksIDB4RDNEQSwgMHhEM0RCLCAweEQzREMsIDB4RDNERCwgMHhEM0RFLAorICAgIDB4RDNERiwgMHhEM0UwLCAweEQzRTIsIDB4RDNFNCwgMHhEM0U1LCAweEQzRTYsIDB4RDNFNywgMHhEM0U4LCAweEQzRTksCisgICAgMHhEM0VBLCAweEQzRUIsIDB4RDNFRSwgMHhEM0VGLCAweEQzRjEsIDB4RDNGMiwgMHhEM0YzLCAweEQzRjUsIDB4RDNGNiwKKyAgICAweEQzRjcsIDB4RDNGOCwgMHhEM0Y5LCAweEQzRkEsIDB4RDNGQiwgMHhEM0ZFLCAweEQ0MDAsIDB4RDQwMiwgMHhENDAzLAorICAgIDB4RDQwNCwgMHhENDA1LCAweEQ0MDYsIDB4RDQwNywgMHhENDA5LCAweEQ0MEEsIDB4RDQwQiwgMHhENDBDLCAweEQ0MEQsCisgICAgMHhENDBFLCAweEQ0MEYsIDB4RDQxMCwgMHhENDExLCAweEQ0MTIsIDB4RDQxMywgMHhENDE0LCAweEQ0MTUsIDB4RDQxNiwKKyAgICAweEQ0MTcsIDB4RDQxOCwgMHhENDE5LCAweEQ0MUEsIDB4RDQxQiwgMHhENDFDLCAweEQ0MUUsIDB4RDQxRiwgMHhENDIwLAorICAgIDB4RDQyMSwgMHhENDIyLCAweEQ0MjMsIDB4RDQyNCwgMHhENDI1LCAweEQ0MjYsIDB4RDQyNywgMHhENDI4LCAweEQ0MjksCisgICAgMHhENDJBLCAweEQ0MkIsIDB4RDQyQywgMHhENDJELCAweEQ0MkUsIDB4RDQyRiwgMHhENDMwLCAweEQ0MzEsIDB4RDQzMiwKKyAgICAweEQ0MzMsIDB4RDQzNCwgMHhENDM1LCAweEQ0MzYsIDB4RDQzNywgMHhENDM4LCAweEQ0MzksIDB4RDQzQSwgMHhENDNCLAorICAgIDB4RDQzQywgMHhENDNELCAweEQ0M0UsIDB4RDQzRiwgMHhENDQxLCAweEQ0NDIsIDB4RDQ0MywgMHhENDQ1LCAweEQ0NDYsCisgICAgMHhENDQ3LCAweEQ0NDgsIDB4RDQ0OSwgMHhENDRBLCAweEQ0NEIsIDB4RDQ0QywgMHhENDRELCAweEQ0NEUsIDB4RDQ0RiwKKyAgICAweEQ0NTAsIDB4RDQ1MSwgMHhENDUyLCAweEQ0NTMsIDB4RDQ1NCwgMHhENDU1LCAweEQ0NTYsIDB4RDQ1NywgMHhENDU4LAorICAgIDB4RDQ1OSwgMHhENDVBLCAweEQ0NUIsIDB4RDQ1RCwgMHhENDVFLCAweEQ0NUYsIDB4RDQ2MSwgMHhENDYyLCAweEQ0NjMsCisgICAgMHhENDY1LCAweEQ0NjYsIDB4RDQ2NywgMHhENDY4LCAweEQ0NjksIDB4RDQ2QSwgMHhENDZCLCAweEQ0NkMsIDB4RDQ2RSwKKyAgICAweEQ0NzAsIDB4RDQ3MSwgMHhENDcyLCAweEQ0NzMsIDB4RDQ3NCwgMHhENDc1LCAweEQ0NzYsIDB4RDQ3NywgMHhENDdBLAorICAgIDB4RDQ3QiwgMHhENDdELCAweEQ0N0UsIDB4RDQ4MSwgMHhENDgzLCAweEQ0ODQsIDB4RDQ4NSwgMHhENDg2LCAweEQ0ODcsCisgICAgMHhENDhBLCAweEQ0OEMsIDB4RDQ4RSwgMHhENDhGLCAweEQ0OTAsIDB4RDQ5MSwgMHhENDkyLCAweEQ0OTMsIDB4RDQ5NSwKKyAgICAweEQ0OTYsIDB4RDQ5NywgMHhENDk4LCAweEQ0OTksIDB4RDQ5QSwgMHhENDlCLCAweEQ0OUMsIDB4RDQ5RCwgMHhENDlFLAorICAgIDB4RDQ5RiwgMHhENEEwLCAweEQ0QTEsIDB4RDRBMiwgMHhENEEzLCAweEQ0QTQsIDB4RDRBNSwgMHhENEE2LCAweEQ0QTcsCisgICAgMHhENEE4LCAweEQ0QUEsIDB4RDRBQiwgMHhENEFDLCAweEQ0QUQsIDB4RDRBRSwgMHhENEFGLCAweEQ0QjAsIDB4RDRCMSwKKyAgICAweEQ0QjIsIDB4RDRCMywgMHhENEI0LCAweEQ0QjUsIDB4RDRCNiwgMHhENEI3LCAweEQ0QjgsIDB4RDRCOSwgMHhENEJBLAorICAgIDB4RDRCQiwgMHhENEJDLCAweEQ0QkQsIDB4RDRCRSwgMHhENEJGLCAweEQ0QzAsIDB4RDRDMSwgMHhENEMyLCAweEQ0QzMsCisgICAgMHhENEM0LCAweEQ0QzUsIDB4RDRDNiwgMHhENEM3LCAweEQ0QzgsIDB4RDRDOSwgMHhENENBLCAweEQ0Q0IsIDB4RDRDRCwKKyAgICAweEQ0Q0UsIDB4RDRDRiwgMHhENEQxLCAweEQ0RDIsIDB4RDREMywgMHhENEQ1LCAweEQ0RDYsIDB4RDRENywgMHhENEQ4LAorICAgIDB4RDREOSwgMHhENERBLCAweEQ0REIsIDB4RDRERCwgMHhENERFLCAweEQ0RTAsIDB4RDRFMSwgMHhENEUyLCAweEQ0RTMsCisgICAgMHhENEU0LCAweEQ0RTUsIDB4RDRFNiwgMHhENEU3LCAweEQ0RTksIDB4RDRFQSwgMHhENEVCLCAweEQ0RUQsIDB4RDRFRSwKKyAgICAweEQ0RUYsIDB4RDRGMSwgMHhENEYyLCAweEQ0RjMsIDB4RDRGNCwgMHhENEY1LCAweEQ0RjYsIDB4RDRGNywgMHhENEY5LAorICAgIDB4RDRGQSwgMHhENEZDLCAweEQ0RkUsIDB4RDRGRiwgMHhENTAwLCAweEQ1MDEsIDB4RDUwMiwgMHhENTAzLCAweEQ1MDUsCisgICAgMHhENTA2LCAweEQ1MDcsIDB4RDUwOSwgMHhENTBBLCAweEQ1MEIsIDB4RDUwRCwgMHhENTBFLCAweEQ1MEYsIDB4RDUxMCwKKyAgICAweEQ1MTEsIDB4RDUxMiwgMHhENTEzLCAweEQ1MTYsIDB4RDUxOCwgMHhENTE5LCAweEQ1MUEsIDB4RDUxQiwgMHhENTFDLAorICAgIDB4RDUxRCwgMHhENTFFLCAweEQ1MUYsIDB4RDUyMCwgMHhENTIxLCAweEQ1MjIsIDB4RDUyMywgMHhENTI0LCAweEQ1MjUsCisgICAgMHhENTI2LCAweEQ1MjcsIDB4RDUyOCwgMHhENTI5LCAweEQ1MkEsIDB4RDUyQiwgMHhENTJDLCAweEQ1MkQsIDB4RDUyRSwKKyAgICAweEQ1MkYsIDB4RDUzMCwgMHhENTMxLCAweEQ1MzIsIDB4RDUzMywgMHhENTM0LCAweEQ1MzUsIDB4RDUzNiwgMHhENTM3LAorICAgIDB4RDUzOCwgMHhENTM5LCAweEQ1M0EsIDB4RDUzQiwgMHhENTNFLCAweEQ1M0YsIDB4RDU0MSwgMHhENTQyLCAweEQ1NDMsCisgICAgMHhENTQ1LCAweEQ1NDYsIDB4RDU0NywgMHhENTQ4LCAweEQ1NDksIDB4RDU0QSwgMHhENTRCLCAweEQ1NEUsIDB4RDU1MCwKKyAgICAweEQ1NTIsIDB4RDU1MywgMHhENTU0LCAweEQ1NTUsIDB4RDU1NiwgMHhENTU3LCAweEQ1NUEsIDB4RDU1QiwgMHhENTVELAorICAgIDB4RDU1RSwgMHhENTVGLCAweEQ1NjEsIDB4RDU2MiwgMHhENTYzLCAweEQ1NjQsIDB4RDU2NiwgMHhENTY3LCAweEQ1NkEsCisgICAgMHhENTZDLCAweEQ1NkUsIDB4RDU2RiwgMHhENTcwLCAweEQ1NzEsIDB4RDU3MiwgMHhENTczLCAweEQ1NzYsIDB4RDU3NywKKyAgICAweEQ1NzksIDB4RDU3QSwgMHhENTdCLCAweEQ1N0QsIDB4RDU3RSwgMHhENTdGLCAweEQ1ODAsIDB4RDU4MSwgMHhENTgyLAorICAgIDB4RDU4MywgMHhENTg2LCAweEQ1OEEsIDB4RDU4QiwgMHhENThDLCAweEQ1OEQsIDB4RDU4RSwgMHhENThGLCAweEQ1OTEsCisgICAgMHhENTkyLCAweEQ1OTMsIDB4RDU5NCwgMHhENTk1LCAweEQ1OTYsIDB4RDU5NywgMHhENTk4LCAweEQ1OTksIDB4RDU5QSwKKyAgICAweEQ1OUIsIDB4RDU5QywgMHhENTlELCAweEQ1OUUsIDB4RDU5RiwgMHhENUEwLCAweEQ1QTEsIDB4RDVBMiwgMHhENUEzLAorICAgIDB4RDVBNCwgMHhENUE2LCAweEQ1QTcsIDB4RDVBOCwgMHhENUE5LCAweEQ1QUEsIDB4RDVBQiwgMHhENUFDLCAweEQ1QUQsCisgICAgMHhENUFFLCAweEQ1QUYsIDB4RDVCMCwgMHhENUIxLCAweEQ1QjIsIDB4RDVCMywgMHhENUI0LCAweEQ1QjUsIDB4RDVCNiwKKyAgICAweEQ1QjcsIDB4RDVCOCwgMHhENUI5LCAweEQ1QkEsIDB4RDVCQiwgMHhENUJDLCAweEQ1QkQsIDB4RDVCRSwgMHhENUJGLAorICAgIDB4RDVDMCwgMHhENUMxLCAweEQ1QzIsIDB4RDVDMywgMHhENUM0LCAweEQ1QzUsIDB4RDVDNiwgMHhENUM3LCAweEQ1Q0EsCisgICAgMHhENUNCLCAweEQ1Q0QsIDB4RDVDRSwgMHhENUNGLCAweEQ1RDEsIDB4RDVEMywgMHhENUQ0LCAweEQ1RDUsIDB4RDVENiwKKyAgICAweEQ1RDcsIDB4RDVEQSwgMHhENURDLCAweEQ1REUsIDB4RDVERiwgMHhENUUwLCAweEQ1RTEsIDB4RDVFMiwgMHhENUUzLAorICAgIDB4RDVFNiwgMHhENUU3LCAweEQ1RTksIDB4RDVFQSwgMHhENUVCLCAweEQ1RUQsIDB4RDVFRSwgMHhENUVGLCAweEQ1RjAsCisgICAgMHhENUYxLCAweEQ1RjIsIDB4RDVGMywgMHhENUY2LCAweEQ1RjgsIDB4RDVGQSwgMHhENUZCLCAweEQ1RkMsIDB4RDVGRCwKKyAgICAweEQ1RkUsIDB4RDVGRiwgMHhENjAyLCAweEQ2MDMsIDB4RDYwNSwgMHhENjA2LCAweEQ2MDcsIDB4RDYwOSwgMHhENjBBLAorICAgIDB4RDYwQiwgMHhENjBDLCAweEQ2MEQsIDB4RDYwRSwgMHhENjBGLCAweEQ2MTIsIDB4RDYxNiwgMHhENjE3LCAweEQ2MTgsCisgICAgMHhENjE5LCAweEQ2MUEsIDB4RDYxQiwgMHhENjFELCAweEQ2MUUsIDB4RDYxRiwgMHhENjIxLCAweEQ2MjIsIDB4RDYyMywKKyAgICAweEQ2MjUsIDB4RDYyNiwgMHhENjI3LCAweEQ2MjgsIDB4RDYyOSwgMHhENjJBLCAweEQ2MkIsIDB4RDYyQywgMHhENjJFLAorICAgIDB4RDYyRiwgMHhENjMwLCAweEQ2MzEsIDB4RDYzMiwgMHhENjMzLCAweEQ2MzQsIDB4RDYzNSwgMHhENjM2LCAweEQ2MzcsCisgICAgMHhENjNBLCAweEQ2M0IsIDB4RDYzRCwgMHhENjNFLCAweEQ2M0YsIDB4RDY0MSwgMHhENjQyLCAweEQ2NDMsIDB4RDY0NCwKKyAgICAweEQ2NDYsIDB4RDY0NywgMHhENjRBLCAweEQ2NEMsIDB4RDY0RSwgMHhENjRGLCAweEQ2NTAsIDB4RDY1MiwgMHhENjUzLAorICAgIDB4RDY1NiwgMHhENjU3LCAweEQ2NTksIDB4RDY1QSwgMHhENjVCLCAweEQ2NUQsIDB4RDY1RSwgMHhENjVGLCAweEQ2NjAsCisgICAgMHhENjYxLCAweEQ2NjIsIDB4RDY2MywgMHhENjY0LCAweEQ2NjUsIDB4RDY2NiwgMHhENjY4LCAweEQ2NkEsIDB4RDY2QiwKKyAgICAweEQ2NkMsIDB4RDY2RCwgMHhENjZFLCAweEQ2NkYsIDB4RDY3MiwgMHhENjczLCAweEQ2NzUsIDB4RDY3NiwgMHhENjc3LAorICAgIDB4RDY3OCwgMHhENjc5LCAweEQ2N0EsIDB4RDY3QiwgMHhENjdDLCAweEQ2N0QsIDB4RDY3RSwgMHhENjdGLCAweEQ2ODAsCisgICAgMHhENjgxLCAweEQ2ODIsIDB4RDY4NCwgMHhENjg2LCAweEQ2ODcsIDB4RDY4OCwgMHhENjg5LCAweEQ2OEEsIDB4RDY4QiwKKyAgICAweEQ2OEUsIDB4RDY4RiwgMHhENjkxLCAweEQ2OTIsIDB4RDY5MywgMHhENjk1LCAweEQ2OTYsIDB4RDY5NywgMHhENjk4LAorICAgIDB4RDY5OSwgMHhENjlBLCAweEQ2OUIsIDB4RDY5QywgMHhENjlFLCAweEQ2QTAsIDB4RDZBMiwgMHhENkEzLCAweEQ2QTQsCisgICAgMHhENkE1LCAweEQ2QTYsIDB4RDZBNywgMHhENkE5LCAweEQ2QUEsIDB4RDZBQiwgMHhENkFELCAweEQ2QUUsIDB4RDZBRiwKKyAgICAweEQ2QjEsIDB4RDZCMiwgMHhENkIzLCAweEQ2QjQsIDB4RDZCNSwgMHhENkI2LCAweEQ2QjcsIDB4RDZCOCwgMHhENkJBLAorICAgIDB4RDZCQywgMHhENkJELCAweEQ2QkUsIDB4RDZCRiwgMHhENkMwLCAweEQ2QzEsIDB4RDZDMiwgMHhENkMzLCAweEQ2QzYsCisgICAgMHhENkM3LCAweEQ2QzksIDB4RDZDQSwgMHhENkNCLCAweEQ2Q0QsIDB4RDZDRSwgMHhENkNGLCAweEQ2RDAsIDB4RDZEMiwKKyAgICAweEQ2RDMsIDB4RDZENSwgMHhENkQ2LCAweEQ2RDgsIDB4RDZEQSwgMHhENkRCLCAweEQ2REMsIDB4RDZERCwgMHhENkRFLAorICAgIDB4RDZERiwgMHhENkUxLCAweEQ2RTIsIDB4RDZFMywgMHhENkU1LCAweEQ2RTYsIDB4RDZFNywgMHhENkU5LCAweEQ2RUEsCisgICAgMHhENkVCLCAweEQ2RUMsIDB4RDZFRCwgMHhENkVFLCAweEQ2RUYsIDB4RDZGMSwgMHhENkYyLCAweEQ2RjMsIDB4RDZGNCwKKyAgICAweEQ2RjYsIDB4RDZGNywgMHhENkY4LCAweEQ2RjksIDB4RDZGQSwgMHhENkZCLCAweEQ2RkUsIDB4RDZGRiwgMHhENzAxLAorICAgIDB4RDcwMiwgMHhENzAzLCAweEQ3MDUsIDB4RDcwNiwgMHhENzA3LCAweEQ3MDgsIDB4RDcwOSwgMHhENzBBLCAweEQ3MEIsCisgICAgMHhENzBDLCAweEQ3MEQsIDB4RDcwRSwgMHhENzBGLCAweEQ3MTAsIDB4RDcxMiwgMHhENzEzLCAweEQ3MTQsIDB4RDcxNSwKKyAgICAweEQ3MTYsIDB4RDcxNywgMHhENzFBLCAweEQ3MUIsIDB4RDcxRCwgMHhENzFFLCAweEQ3MUYsIDB4RDcyMSwgMHhENzIyLAorICAgIDB4RDcyMywgMHhENzI0LCAweEQ3MjUsIDB4RDcyNiwgMHhENzI3LCAweEQ3MkEsIDB4RDcyQywgMHhENzJFLCAweEQ3MkYsCisgICAgMHhENzMwLCAweEQ3MzEsIDB4RDczMiwgMHhENzMzLCAweEQ3MzYsIDB4RDczNywgMHhENzM5LCAweEQ3M0EsIDB4RDczQiwKKyAgICAweEQ3M0QsIDB4RDczRSwgMHhENzNGLCAweEQ3NDAsIDB4RDc0MSwgMHhENzQyLCAweEQ3NDMsIDB4RDc0NSwgMHhENzQ2LAorICAgIDB4RDc0OCwgMHhENzRBLCAweEQ3NEIsIDB4RDc0QywgMHhENzRELCAweEQ3NEUsIDB4RDc0RiwgMHhENzUyLCAweEQ3NTMsCisgICAgMHhENzU1LCAweEQ3NUEsIDB4RDc1QiwgMHhENzVDLCAweEQ3NUQsIDB4RDc1RSwgMHhENzVGLCAweEQ3NjIsIDB4RDc2NCwKKyAgICAweEQ3NjYsIDB4RDc2NywgMHhENzY4LCAweEQ3NkEsIDB4RDc2QiwgMHhENzZELCAweEQ3NkUsIDB4RDc2RiwgMHhENzcxLAorICAgIDB4RDc3MiwgMHhENzczLCAweEQ3NzUsIDB4RDc3NiwgMHhENzc3LCAweEQ3NzgsIDB4RDc3OSwgMHhENzdBLCAweEQ3N0IsCisgICAgMHhENzdFLCAweEQ3N0YsIDB4RDc4MCwgMHhENzgyLCAweEQ3ODMsIDB4RDc4NCwgMHhENzg1LCAweEQ3ODYsIDB4RDc4NywKKyAgICAweEQ3OEEsIDB4RDc4QiwgMHhENzhELCAweEQ3OEUsIDB4RDc4RiwgMHhENzkxLCAweEQ3OTIsIDB4RDc5MywgMHhENzk0LAorICAgIDB4RDc5NSwgMHhENzk2LCAweEQ3OTcsIDB4RDc5QSwgMHhENzlDLCAweEQ3OUUsIDB4RDc5RiwgMHhEN0EwLCAweEQ3QTEsCisgICAgMHhEN0EyLCAweEQ3QTMsIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwKKyAgICAweDAwMjcsIDB4MDAyOCwgMHgwMDI5LCAweDAwMkEsIDB4MDAyQiwgMHgwMDJDLCAweDAwMkQsIDB4MDAyRSwgMHgwMDJGLAorICAgIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsCisgICAgMHgwMDM5LCAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLCAweDAwM0QsIDB4MDAzRSwgMHgwMDNGLCAweDAwNDAsIDB4MDA0MSwKKyAgICAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LCAweDAwNDgsIDB4MDA0OSwgMHgwMDRBLAorICAgIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLCAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsCisgICAgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwgMHgwMDVBLCAweDAwNUIsIDB4MDA1QywKKyAgICAweDAwNUQsIDB4MDA1RSwgMHgwMDVGLCAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LAorICAgIDB4MDA2NiwgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywgMHgwMDZELCAweDAwNkUsCisgICAgMHgwMDZGLCAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKyAgICAweDAwNzgsIDB4MDA3OSwgMHgwMDdBLCAweDAwN0IsIDB4MDA3QywgMHgwMDdELCAweDAwN0UsIDB4MjBBOSwgMHgyMDEwLAorICAgIDB4MDBBOSwgMHgyMTIyLCAweDIyRUYsIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsCisgICAgMHgwMDI2LCAweDAwMjcsIDB4MDAyOCwgMHgwMDI5LCAweDAwMkEsIDB4MDAyQiwgMHgwMDJDLCAweDAwMkQsIDB4MDAyRSwKKyAgICAweDAwMkYsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorICAgIDB4MDAzOCwgMHgwMDM5LCAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLCAweDAwM0QsIDB4MDAzRSwgMHgwMDNGLCAweDAwNDAsCisgICAgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LCAweDAwNDgsIDB4MDA0OSwKKyAgICAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLCAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLAorICAgIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwgMHgwMDVBLCAweDAwNUIsCisgICAgMHgwMDVDLCAweDAwNUQsIDB4MDA1RSwgMHgwMDVGLCAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwKKyAgICAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywgMHgwMDZELAorICAgIDB4MDA2RSwgMHgwMDZGLCAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsCisgICAgMHgwMDc3LCAweDAwNzgsIDB4MDA3OSwgMHgwMDdBLCAweDAwN0IsIDB4MDA3QywgMHgwMDdELCAweDIwM0UsIDB4MDA3RSwKKyAgICAweDAwNUMsCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9LU0MtRVVDLUhfMC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL0tTQy1FVUMtSF8wLmNwcAppbmRleCA4MGVjMzVmLi4wZThmMDA1IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL0tTQy1FVUMtSF8wLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL0tTQy1FVUMtSF8wLmNwcApAQCAtMSwxMCArMSwxMiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi1leHRlcm4gY29uc3QgdW5zaWduZWQgc2hvcnQgZ19GWENNQVBfS1NDX0VVQ19IXzBbNDY3ICogM10gPSB7CisjaW5jbHVkZSAiY21hcHNfa29yZWExLmgiCisKK2NvbnN0IEZYX1dPUkQgZ19GWENNQVBfS1NDX0VVQ19IXzBbNDY3ICogM10gPSB7CiAgICAgMHgwMDIwLCAweDAwN0UsIDB4MUY5RSwgMHhBMUExLCAweEExRkUsIDB4MDA2NSwgMHhBMkExLCAweEEyRTUsIDB4MDBDMywKICAgICAweEEzQTEsIDB4QTNGRSwgMHgwMTA4LCAweEE0QTEsIDB4QTREMywgMHgwMTY2LCAweEE0RDUsIDB4QTRGRSwgMHgwMTk5LAogICAgIDB4QTVBMSwgMHhBNUFBLCAweDAxQzMsIDB4QTVCMCwgMHhBNUI5LCAweDAxQ0QsIDB4QTVDMSwgMHhBNUQ4LCAweDAxRDcsCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL0tTQy1FVUMtVl8wLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvS1NDLUVVQy1WXzAuY3BwCmluZGV4IDVmZjQ0MTUuLjYyNDA2NmQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvS1NDLUVVQy1WXzAuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvS1NDLUVVQy1WXzAuY3BwCkBAIC0xLDE0ICsxLDE2IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCBnX0ZYQ01BUF9LU0NfRVVDX1ZfMFsxNiAqIDNdID0gewotICAgIDB4QTFBMiwgMHhBMUEzLCAweDFGNzgsIDB4QTFBNSwgMHhBMUE1LCAweDFGN0EsIDB4QTFBNiwgMHhBMUE2LCAweDIwODAsCi0gICAgMHhBMUE5LCAweEExQUIsIDB4MUY3QiwgMHhBMUFELCAweEExQUQsIDB4MUY3RSwgMHhBMUIyLCAweEExQkQsIDB4MUY3RiwKLSAgICAweEExRUIsIDB4QTFFQiwgMHgxRjhCLCAweEEzQTEsIDB4QTNBMSwgMHgxRjhDLCAweEEzQTgsIDB4QTNBOSwgMHgxRjhELAotICAgIDB4QTNBQywgMHhBM0FDLCAweDFGOEYsIDB4QTNBRSwgMHhBM0FFLCAweDFGOTAsIDB4QTNCQSwgMHhBM0JGLCAweDFGOTEsCi0gICAgMHhBM0RCLCAweEEzREIsIDB4MUY5NywgMHhBM0RELCAweEEzREQsIDB4MUY5OCwgMHhBM0RGLCAweEEzREYsIDB4MUY5OSwKLSAgICAweEEzRkIsIDB4QTNGRSwgMHgxRjlBLAorI2luY2x1ZGUgImNtYXBzX2tvcmVhMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0tTQ19FVUNfVl8wWzE2ICogM10gPSB7CisgICAgMHhBMUEyLCAweEExQTMsIDB4MUY3OCwgMHhBMUE1LCAweEExQTUsIDB4MUY3QSwgMHhBMUE2LCAweEExQTYsCisgICAgMHgyMDgwLCAweEExQTksIDB4QTFBQiwgMHgxRjdCLCAweEExQUQsIDB4QTFBRCwgMHgxRjdFLCAweEExQjIsCisgICAgMHhBMUJELCAweDFGN0YsIDB4QTFFQiwgMHhBMUVCLCAweDFGOEIsIDB4QTNBMSwgMHhBM0ExLCAweDFGOEMsCisgICAgMHhBM0E4LCAweEEzQTksIDB4MUY4RCwgMHhBM0FDLCAweEEzQUMsIDB4MUY4RiwgMHhBM0FFLCAweEEzQUUsCisgICAgMHgxRjkwLCAweEEzQkEsIDB4QTNCRiwgMHgxRjkxLCAweEEzREIsIDB4QTNEQiwgMHgxRjk3LCAweEEzREQsCisgICAgMHhBM0RELCAweDFGOTgsIDB4QTNERiwgMHhBM0RGLCAweDFGOTksIDB4QTNGQiwgMHhBM0ZFLCAweDFGOUEsCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9LU0Ntcy1VSEMtSFctSF8xLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvS1NDbXMtVUhDLUhXLUhfMS5jcHAKaW5kZXggZDQ5ZTlmNC4uZGQ0MGRhZSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9LU0Ntcy1VSEMtSFctSF8xLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL0tTQ21zLVVIQy1IVy1IXzEuY3BwCkBAIC0xLDEwICsxLDEyIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCBnX0ZYQ01BUF9LU0Ntc19VSENfSFdfSF8xWzY3NSAqIDNdID0geworI2luY2x1ZGUgImNtYXBzX2tvcmVhMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0tTQ21zX1VIQ19IV19IXzFbNjc1ICogM10gPSB7CiAgICAgMHgwMDIwLCAweDAwN0UsIDB4MUY5RSwgMHg4MTQxLCAweDgxNUEsIDB4MjQ3NSwgMHg4MTYxLCAweDgxN0EsIDB4MjQ4RiwKICAgICAweDgxODEsIDB4ODFGRSwgMHgyNEE5LCAweDgyNDEsIDB4ODI1QSwgMHgyNTI3LCAweDgyNjEsIDB4ODI3QSwgMHgyNTQxLAogICAgIDB4ODI4MSwgMHg4MkZFLCAweDI1NUIsIDB4ODM0MSwgMHg4MzVBLCAweDI1RDksIDB4ODM2MSwgMHg4MzdBLCAweDI1RjMsCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL0tTQ21zLVVIQy1IVy1WXzEuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9LU0Ntcy1VSEMtSFctVl8xLmNwcAppbmRleCAwNzMwNTYxLi45NzQyYmFmIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL0tTQ21zLVVIQy1IVy1WXzEuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvS1NDbXMtVUhDLUhXLVZfMS5jcHAKQEAgLTEsMTQgKzEsMTYgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0IGdfRlhDTUFQX0tTQ21zX1VIQ19IV19WXzFbMTYgKiAzXSA9IHsKLSAgICAweEExQTIsIDB4QTFBMywgMHgxRjc4LCAweEExQTUsIDB4QTFBNSwgMHgxRjdBLCAweEExQTYsIDB4QTFBNiwgMHgyMDgwLAotICAgIDB4QTFBOSwgMHhBMUFCLCAweDFGN0IsIDB4QTFBRCwgMHhBMUFELCAweDFGN0UsIDB4QTFCMiwgMHhBMUJELCAweDFGN0YsCi0gICAgMHhBMUVCLCAweEExRUIsIDB4MUY4QiwgMHhBM0ExLCAweEEzQTEsIDB4MUY4QywgMHhBM0E4LCAweEEzQTksIDB4MUY4RCwKLSAgICAweEEzQUMsIDB4QTNBQywgMHgxRjhGLCAweEEzQUUsIDB4QTNBRSwgMHgxRjkwLCAweEEzQkEsIDB4QTNCRiwgMHgxRjkxLAotICAgIDB4QTNEQiwgMHhBM0RCLCAweDFGOTcsIDB4QTNERCwgMHhBM0RELCAweDFGOTgsIDB4QTNERiwgMHhBM0RGLCAweDFGOTksCi0gICAgMHhBM0ZCLCAweEEzRkUsIDB4MUY5QSwKKyNpbmNsdWRlICJjbWFwc19rb3JlYTEuaCIKKworY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9LU0Ntc19VSENfSFdfVl8xWzE2ICogM10gPSB7CisgICAgMHhBMUEyLCAweEExQTMsIDB4MUY3OCwgMHhBMUE1LCAweEExQTUsIDB4MUY3QSwgMHhBMUE2LCAweEExQTYsCisgICAgMHgyMDgwLCAweEExQTksIDB4QTFBQiwgMHgxRjdCLCAweEExQUQsIDB4QTFBRCwgMHgxRjdFLCAweEExQjIsCisgICAgMHhBMUJELCAweDFGN0YsIDB4QTFFQiwgMHhBMUVCLCAweDFGOEIsIDB4QTNBMSwgMHhBM0ExLCAweDFGOEMsCisgICAgMHhBM0E4LCAweEEzQTksIDB4MUY4RCwgMHhBM0FDLCAweEEzQUMsIDB4MUY4RiwgMHhBM0FFLCAweEEzQUUsCisgICAgMHgxRjkwLCAweEEzQkEsIDB4QTNCRiwgMHgxRjkxLCAweEEzREIsIDB4QTNEQiwgMHgxRjk3LCAweEEzREQsCisgICAgMHhBM0RELCAweDFGOTgsIDB4QTNERiwgMHhBM0RGLCAweDFGOTksIDB4QTNGQiwgMHhBM0ZFLCAweDFGOUEsCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9LU0Ntcy1VSEMtSF8xLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvS1NDbXMtVUhDLUhfMS5jcHAKaW5kZXggYWYyOGE0ZC4uNjlkYjgxMSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9LU0Ntcy1VSEMtSF8xLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL0tTQ21zLVVIQy1IXzEuY3BwCkBAIC0xLDEwICsxLDEyIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCBnX0ZYQ01BUF9LU0Ntc19VSENfSF8xWzY3NSAqIDNdID0geworI2luY2x1ZGUgImNtYXBzX2tvcmVhMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0tTQ21zX1VIQ19IXzFbNjc1ICogM10gPSB7CiAgICAgMHgwMDIwLCAweDAwN0UsIDB4MDAwMSwgMHg4MTQxLCAweDgxNUEsIDB4MjQ3NSwgMHg4MTYxLCAweDgxN0EsIDB4MjQ4RiwKICAgICAweDgxODEsIDB4ODFGRSwgMHgyNEE5LCAweDgyNDEsIDB4ODI1QSwgMHgyNTI3LCAweDgyNjEsIDB4ODI3QSwgMHgyNTQxLAogICAgIDB4ODI4MSwgMHg4MkZFLCAweDI1NUIsIDB4ODM0MSwgMHg4MzVBLCAweDI1RDksIDB4ODM2MSwgMHg4MzdBLCAweDI1RjMsCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL0tTQ21zLVVIQy1WXzEuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9LU0Ntcy1VSEMtVl8xLmNwcAppbmRleCA3MGYxZDQ1Li5iYzY5MzlhIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL0tTQ21zLVVIQy1WXzEuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvS1NDbXMtVUhDLVZfMS5jcHAKQEAgLTEsMTQgKzEsMTYgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0IGdfRlhDTUFQX0tTQ21zX1VIQ19WXzFbMTYgKiAzXSA9IHsKLSAgICAweEExQTIsIDB4QTFBMywgMHgxRjc4LCAweEExQTUsIDB4QTFBNSwgMHgxRjdBLCAweEExQTYsIDB4QTFBNiwgMHgyMDgwLAotICAgIDB4QTFBOSwgMHhBMUFCLCAweDFGN0IsIDB4QTFBRCwgMHhBMUFELCAweDFGN0UsIDB4QTFCMiwgMHhBMUJELCAweDFGN0YsCi0gICAgMHhBMUVCLCAweEExRUIsIDB4MUY4QiwgMHhBM0ExLCAweEEzQTEsIDB4MUY4QywgMHhBM0E4LCAweEEzQTksIDB4MUY4RCwKLSAgICAweEEzQUMsIDB4QTNBQywgMHgxRjhGLCAweEEzQUUsIDB4QTNBRSwgMHgxRjkwLCAweEEzQkEsIDB4QTNCRiwgMHgxRjkxLAotICAgIDB4QTNEQiwgMHhBM0RCLCAweDFGOTcsIDB4QTNERCwgMHhBM0RELCAweDFGOTgsIDB4QTNERiwgMHhBM0RGLCAweDFGOTksCi0gICAgMHhBM0ZCLCAweEEzRkUsIDB4MUY5QSwKKyNpbmNsdWRlICJjbWFwc19rb3JlYTEuaCIKKworY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9LU0Ntc19VSENfVl8xWzE2ICogM10gPSB7CisgICAgMHhBMUEyLCAweEExQTMsIDB4MUY3OCwgMHhBMUE1LCAweEExQTUsIDB4MUY3QSwgMHhBMUE2LCAweEExQTYsCisgICAgMHgyMDgwLCAweEExQTksIDB4QTFBQiwgMHgxRjdCLCAweEExQUQsIDB4QTFBRCwgMHgxRjdFLCAweEExQjIsCisgICAgMHhBMUJELCAweDFGN0YsIDB4QTFFQiwgMHhBMUVCLCAweDFGOEIsIDB4QTNBMSwgMHhBM0ExLCAweDFGOEMsCisgICAgMHhBM0E4LCAweEEzQTksIDB4MUY4RCwgMHhBM0FDLCAweEEzQUMsIDB4MUY4RiwgMHhBM0FFLCAweEEzQUUsCisgICAgMHgxRjkwLCAweEEzQkEsIDB4QTNCRiwgMHgxRjkxLCAweEEzREIsIDB4QTNEQiwgMHgxRjk3LCAweEEzREQsCisgICAgMHhBM0RELCAweDFGOTgsIDB4QTNERiwgMHhBM0RGLCAweDFGOTksIDB4QTNGQiwgMHhBM0ZFLCAweDFGOUEsCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9LU0NwYy1FVUMtSF8wLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvS1NDcGMtRVVDLUhfMC5jcHAKaW5kZXggOWNiNDIwZC4uMTcwZmE1NSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9LU0NwYy1FVUMtSF8wLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL0tTQ3BjLUVVQy1IXzAuY3BwCkBAIC0xLDEwICsxLDEyIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCBnX0ZYQ01BUF9LU0NwY19FVUNfSF8wWzUwOSAqIDNdID0geworI2luY2x1ZGUgImNtYXBzX2tvcmVhMS5oIgorCitjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0tTQ3BjX0VVQ19IXzBbNTA5ICogM10gPSB7CiAgICAgMHgwMDIwLCAweDAwN0UsIDB4MDAwMSwgMHgwMDgxLCAweDAwODMsIDB4MDA2MCwgMHgwMEZFLCAweDAwRkYsIDB4MDA2MywKICAgICAweEExNDEsIDB4QTE3RCwgMHgxRkZGLCAweEExODEsIDB4QTE5QSwgMHgyMDNDLCAweEExOUMsIDB4QTFBMCwgMHgyMDU2LAogICAgIDB4QTFBMSwgMHhBMUExLCAweDAwNjUsIDB4QTFBMiwgMHhBMUEzLCAweDIwNUIsIDB4QTFBNCwgMHhBMUZFLCAweDAwNjgsCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL1VuaUtTLVVDUzItSF8xLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvVW5pS1MtVUNTMi1IXzEuY3BwCmluZGV4IGRhZjk4MjcuLjFmNzRlZmYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvVW5pS1MtVUNTMi1IXzEuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvVW5pS1MtVUNTMi1IXzEuY3BwCkBAIC0xLDEwICsxLDEyIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCBnX0ZYQ01BUF9VbmlLU19VQ1MyX0hfMVs4Mzk0ICogM10gPSB7CisjaW5jbHVkZSAiY21hcHNfa29yZWExLmgiCisKK2NvbnN0IEZYX1dPUkQgZ19GWENNQVBfVW5pS1NfVUNTMl9IXzFbODM5NCAqIDNdID0gewogICAgIDB4MDAyMCwgMHgwMDdFLCAweDAwMDEsIDB4MDBBMSwgMHgwMEExLCAweDAwRDAsIDB4MDBBNCwgMHgwMEE0LCAweDAwRDYsCiAgICAgMHgwMEE3LCAweDAwQTcsIDB4MDA5QiwgMHgwMEE4LCAweDAwQTgsIDB4MDA2QiwgMHgwMEFBLCAweDAwQUEsIDB4MDI5QywKICAgICAweDAwQUIsIDB4MDBBQiwgMHgwMEIwLCAweDAwQjAsIDB4MDBCMCwgMHgwMDhBLCAweDAwQjEsIDB4MDBCMSwgMHgwMDgyLApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9VbmlLUy1VQ1MyLVZfMS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL1VuaUtTLVVDUzItVl8xLmNwcAppbmRleCAwMTQ2OTdiLi41Y2E3MDE4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL1VuaUtTLVVDUzItVl8xLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL1VuaUtTLVVDUzItVl8xLmNwcApAQCAtMSwxMCArMSwxMiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi1leHRlcm4gY29uc3QgdW5zaWduZWQgc2hvcnQgZ19GWENNQVBfVW5pS1NfVUNTMl9WXzFbMTggKiAzXSA9IHsKKyNpbmNsdWRlICJjbWFwc19rb3JlYTEuaCIKKworY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9VbmlLU19VQ1MyX1ZfMVsxOCAqIDNdID0gewogICAgIDB4MjAxMywgMHgyMDE0LCAweDFGN0IsIDB4MjAxNiwgMHgyMDE2LCAweDFGN0QsIDB4MjAyNSwgMHgyMDI1LCAweDFGN0EsCiAgICAgMHgzMDAxLCAweDMwMDIsIDB4MUY3OCwgMHgzMDA4LCAweDMwMTEsIDB4MUY4MSwgMHgzMDEzLCAweDMwMTMsIDB4MUY4QiwKICAgICAweDMwMTQsIDB4MzAxNSwgMHgxRjdGLCAweEZGMDEsIDB4RkYwMSwgMHgxRjhDLCAweEZGMDgsIDB4RkYwOSwgMHgxRjhELApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9VbmlLUy1VVEYxNi1IXzAuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9VbmlLUy1VVEYxNi1IXzAuY3BwCmluZGV4IGM5NzdlODYuLjc2ZGM1YTcgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvVW5pS1MtVVRGMTYtSF8wLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL1VuaUtTLVVURjE2LUhfMC5jcHAKQEAgLTEsNDggKzEsNDYgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIHNob3J0IGdfRlhDTUFQX1VuaUtTX1VURjE2X0hfMFsxNTggKiAyXSA9IHsKLSAgICAweDAwQTksIDB4MDA2MiwgMHgyMDEwLCAweDAwNjEsIDB4MjBBOSwgMHgwMDYwLCAweDJGMDAsIDB4MTkzQywKLSAgICAweDJGMDQsIDB4MThFQywgMHgyRjA2LCAweDE5MEQsIDB4MkYwOCwgMHgxOTJCLCAweDJGMEEsIDB4MTk0RCwKLSAgICAweDJGMEIsIDB4MUQ0QiwgMHgyRjExLCAweDEwQUUsIDB4MkYxMiwgMHgxMTZBLCAweDJGMTQsIDB4MTQzRiwKLSAgICAweDJGMTcsIDB4MTY4QywgMHgyRjE4LCAweDEzRDUsIDB4MkYxQywgMHgxODM5LCAweDJGMUQsIDB4MEYzRCwKLSAgICAweDJGMUYsIDB4MUQxQiwgMHgyRjIwLCAweDE0ODcsIDB4MkYyMywgMHgxNTFCLCAweDJGMjQsIDB4MTA5RCwKLSAgICAweDJGMjUsIDB4MTAzRiwgMHgyRjI2LCAweDE5NTgsIDB4MkYyOCwgMHgxQzRGLCAweDJGMjksIDB4MTU4MCwKLSAgICAweDJGMkIsIDB4MTY0MSwgMHgyRjJELCAweDE0QjksIDB4MkYyRiwgMHgwRUNGLCAweDJGMzAsIDB4MEZFRCwKLSAgICAweDJGMzEsIDB4MEUxNCwgMHgyRjMyLCAweDBEOTksIDB4MkYzOCwgMHgwRjdDLCAweDJGM0MsIDB4MTY4NCwKLSAgICAweDJGM0QsIDB4MEVEQywgMHgyRjNFLCAweDFFODAsIDB4MkYzRiwgMHgxNUNDLCAweDJGNDAsIDB4MUIyNywKLSAgICAweDJGNDIsIDB4MTJFOCwgMHgyRjQzLCAweDEwRkQsIDB4MkY0NCwgMHgwRkJCLCAweDJGNDUsIDB4MTM1NiwKLSAgICAweDJGNDYsIDB4MTJEMywgMHgyRjQ3LCAweDE5NDAsIDB4MkY0OCwgMHgxN0VELCAweDJGNDksIDB4MTg4OSwKLSAgICAweDJGNEEsIDB4MTJCNCwgMHgyRjRCLCAweDFGNUIsIDB4MkY0QywgMHgxQjJDLCAweDJGNEYsIDB4MTJENiwKLSAgICAweDJGNTAsIDB4MTQ0QywgMHgyRjUxLCAweDEyQTgsIDB4MkY1MiwgMHgxNjhFLCAweDJGNTQsIDB4MTVEMywKLSAgICAweDJGNTUsIDB4MUVCQiwgMHgyRjU2LCAweDFBOTMsIDB4MkY1NywgMHgxNDA5LCAweDJGNTgsIDB4MUYxQSwKLSAgICAweDJGNUEsIDB4MUQ2MSwgMHgyRjVCLCAweDE2OTYsIDB4MkY1QywgMHgxODQyLCAweDJGNUQsIDB4MEUzNywKLSAgICAweDJGNUUsIDB4MUUzRCwgMHgyRjVGLCAweDE3QzEsIDB4MkY2MCwgMHgwRURFLCAweDJGNjEsIDB4MTdENCwKLSAgICAweDJGNjIsIDB4MERDMSwgMHgyRjYzLCAweDE0RkEsIDB4MkY2NCwgMHgxODJELCAweDJGNjUsIDB4MUEwOCwKLSAgICAweDJGNjYsIDB4MURCQSwgMHgyRjY5LCAweDEzODEsIDB4MkY2QSwgMHgxREIwLCAweDJGNkIsIDB4MTI5MywKLSAgICAweDJGNkMsIDB4MTJCNywgMHgyRjZELCAweDEyQUQsIDB4MkY2RSwgMHgxNjRELCAweDJGNkYsIDB4MTUyNSwKLSAgICAweDJGNzAsIDB4MTY0RSwgMHgyRjcyLCAweDFFQkUsIDB4MkY3MywgMHgxRTRCLCAweDJGNzQsIDB4MTIyRCwKLSAgICAweDJGNzUsIDB4MUFGNCwgMHgyRjc2LCAweDEyRkYsIDB4MkY3OCwgMHgxNDBDLCAweDJGN0EsIDB4MTcwOCwKLSAgICAweDJGN0IsIDB4MTg0QSwgMHgyRjdDLCAweDExQTcsIDB4MkY3RCwgMHgxOTFCLCAweDJGN0YsIDB4MTkxQywKLSAgICAweDJGODAsIDB4MThFMCwgMHgyRjgxLCAweDE4RDUsIDB4MkY4MiwgMHgxNjc1LCAweDJGODMsIDB4MTk2NiwKLSAgICAweDJGODQsIDB4MUIzNywgMHgyRjg1LCAweDBGNUEsIDB4MkY4NiwgMHgxNTUwLCAweDJGODcsIDB4MUJGNiwKLSAgICAweDJGODgsIDB4MUFFOCwgMHgyRjg5LCAweDBEQTgsIDB4MkY4QSwgMHgxNEY4LCAweDJGOEIsIDB4MUM0MCwKLSAgICAweDJGOEUsIDB4MUU0QywgMHgyRjhGLCAweDFFMUQsIDB4MkY5MCwgMHgxOTA5LCAweDJGOTIsIDB4MEUzQywKLSAgICAweDJGOTMsIDB4MEQ5MiwgMHgyRjk0LCAweDE3MjEsIDB4MkY5NSwgMHgwRUJDLCAweDJGOTYsIDB4MTEwMywKLSAgICAweDJGOTcsIDB4MTY1NiwgMHgyRjk5LCAweDFENTgsIDB4MkY5QSwgMHgxOUVDLCAweDJGOUIsIDB4MUFFQywKLSAgICAweDJGOUMsIDB4MUFBRSwgMHgyRjlELCAweDE2N0IsIDB4MkY5RSwgMHgxQjhELCAweDJGOUYsIDB4MTY3QywKLSAgICAweDJGQTAsIDB4MUI2MSwgMHgyRkEyLCAweDE4RjUsIDB4MkZBMywgMHgxOEQwLCAweDJGQTUsIDB4MTIxQSwKLSAgICAweDJGQTYsIDB4MTAyMywgMHgyRkE3LCAweDE5QTgsIDB4MkZBOCwgMHgxMkVFLCAweDJGQTksIDB4MTQxQiwKLSAgICAweDJGQUMsIDB4MTg1MywgMHgyRkFELCAweDFDMjMsIDB4MkZBRSwgMHgxNDY0LCAweDJGQUYsIDB4MTI4OCwKLSAgICAweDJGQjAsIDB4MUUzNSwgMHgyRkIxLCAweDE4QTMsIDB4MkZCMywgMHgxOEYxLCAweDJGQjQsIDB4MUU0RCwKLSAgICAweDJGQjUsIDB4MURBQiwgMHgyRkI2LCAweDE0NjUsIDB4MkZCNywgMHgxNjY1LCAweDJGQjgsIDB4MTVGOSwKLSAgICAweDJGQjksIDB4MUUyNiwgMHgyRkJBLCAweDEyMzUsIDB4MkZCQiwgMHgwRUM5LCAweDJGQkMsIDB4MEVCNSwKLSAgICAweDJGQzEsIDB4MEY5OSwgMHgyRkMyLCAweDE3MTYsIDB4MkZDMywgMHgxQUFCLCAweDJGQzQsIDB4MTFBRiwKLSAgICAweDJGQzUsIDB4MTFCNSwgMHgyRkM2LCAweDEyNzYsIDB4MkZDNywgMHgxMjM3LCAweDJGQzgsIDB4MUVGNywKLSAgICAweDJGQzksIDB4MTUxOSwgMHgyRkNBLCAweDFGNTIsIDB4MkZDRCwgMHgxQTY2LCAweDJGQ0UsIDB4MEVCNiwKLSAgICAweDJGQ0YsIDB4MTUxQSwgMHgyRkQwLCAweDE0NjYsIDB4MkZEMSwgMHgxQTdELCAweDJGRDIsIDB4MUNCRiwKLSAgICAweDJGRDMsIDB4MTFEMywgMHgyRkQ0LCAweDBGNkEsCisjaW5jbHVkZSAiY21hcHNfa29yZWExLmgiCisKK2NvbnN0IEZYX1dPUkQgZ19GWENNQVBfVW5pS1NfVVRGMTZfSF8wWzE1OCAqIDJdID0geworICAgIDB4MDBBOSwgMHgwMDYyLCAweDIwMTAsIDB4MDA2MSwgMHgyMEE5LCAweDAwNjAsIDB4MkYwMCwgMHgxOTNDLCAweDJGMDQsCisgICAgMHgxOEVDLCAweDJGMDYsIDB4MTkwRCwgMHgyRjA4LCAweDE5MkIsIDB4MkYwQSwgMHgxOTRELCAweDJGMEIsIDB4MUQ0QiwKKyAgICAweDJGMTEsIDB4MTBBRSwgMHgyRjEyLCAweDExNkEsIDB4MkYxNCwgMHgxNDNGLCAweDJGMTcsIDB4MTY4QywgMHgyRjE4LAorICAgIDB4MTNENSwgMHgyRjFDLCAweDE4MzksIDB4MkYxRCwgMHgwRjNELCAweDJGMUYsIDB4MUQxQiwgMHgyRjIwLCAweDE0ODcsCisgICAgMHgyRjIzLCAweDE1MUIsIDB4MkYyNCwgMHgxMDlELCAweDJGMjUsIDB4MTAzRiwgMHgyRjI2LCAweDE5NTgsIDB4MkYyOCwKKyAgICAweDFDNEYsIDB4MkYyOSwgMHgxNTgwLCAweDJGMkIsIDB4MTY0MSwgMHgyRjJELCAweDE0QjksIDB4MkYyRiwgMHgwRUNGLAorICAgIDB4MkYzMCwgMHgwRkVELCAweDJGMzEsIDB4MEUxNCwgMHgyRjMyLCAweDBEOTksIDB4MkYzOCwgMHgwRjdDLCAweDJGM0MsCisgICAgMHgxNjg0LCAweDJGM0QsIDB4MEVEQywgMHgyRjNFLCAweDFFODAsIDB4MkYzRiwgMHgxNUNDLCAweDJGNDAsIDB4MUIyNywKKyAgICAweDJGNDIsIDB4MTJFOCwgMHgyRjQzLCAweDEwRkQsIDB4MkY0NCwgMHgwRkJCLCAweDJGNDUsIDB4MTM1NiwgMHgyRjQ2LAorICAgIDB4MTJEMywgMHgyRjQ3LCAweDE5NDAsIDB4MkY0OCwgMHgxN0VELCAweDJGNDksIDB4MTg4OSwgMHgyRjRBLCAweDEyQjQsCisgICAgMHgyRjRCLCAweDFGNUIsIDB4MkY0QywgMHgxQjJDLCAweDJGNEYsIDB4MTJENiwgMHgyRjUwLCAweDE0NEMsIDB4MkY1MSwKKyAgICAweDEyQTgsIDB4MkY1MiwgMHgxNjhFLCAweDJGNTQsIDB4MTVEMywgMHgyRjU1LCAweDFFQkIsIDB4MkY1NiwgMHgxQTkzLAorICAgIDB4MkY1NywgMHgxNDA5LCAweDJGNTgsIDB4MUYxQSwgMHgyRjVBLCAweDFENjEsIDB4MkY1QiwgMHgxNjk2LCAweDJGNUMsCisgICAgMHgxODQyLCAweDJGNUQsIDB4MEUzNywgMHgyRjVFLCAweDFFM0QsIDB4MkY1RiwgMHgxN0MxLCAweDJGNjAsIDB4MEVERSwKKyAgICAweDJGNjEsIDB4MTdENCwgMHgyRjYyLCAweDBEQzEsIDB4MkY2MywgMHgxNEZBLCAweDJGNjQsIDB4MTgyRCwgMHgyRjY1LAorICAgIDB4MUEwOCwgMHgyRjY2LCAweDFEQkEsIDB4MkY2OSwgMHgxMzgxLCAweDJGNkEsIDB4MURCMCwgMHgyRjZCLCAweDEyOTMsCisgICAgMHgyRjZDLCAweDEyQjcsIDB4MkY2RCwgMHgxMkFELCAweDJGNkUsIDB4MTY0RCwgMHgyRjZGLCAweDE1MjUsIDB4MkY3MCwKKyAgICAweDE2NEUsIDB4MkY3MiwgMHgxRUJFLCAweDJGNzMsIDB4MUU0QiwgMHgyRjc0LCAweDEyMkQsIDB4MkY3NSwgMHgxQUY0LAorICAgIDB4MkY3NiwgMHgxMkZGLCAweDJGNzgsIDB4MTQwQywgMHgyRjdBLCAweDE3MDgsIDB4MkY3QiwgMHgxODRBLCAweDJGN0MsCisgICAgMHgxMUE3LCAweDJGN0QsIDB4MTkxQiwgMHgyRjdGLCAweDE5MUMsIDB4MkY4MCwgMHgxOEUwLCAweDJGODEsIDB4MThENSwKKyAgICAweDJGODIsIDB4MTY3NSwgMHgyRjgzLCAweDE5NjYsIDB4MkY4NCwgMHgxQjM3LCAweDJGODUsIDB4MEY1QSwgMHgyRjg2LAorICAgIDB4MTU1MCwgMHgyRjg3LCAweDFCRjYsIDB4MkY4OCwgMHgxQUU4LCAweDJGODksIDB4MERBOCwgMHgyRjhBLCAweDE0RjgsCisgICAgMHgyRjhCLCAweDFDNDAsIDB4MkY4RSwgMHgxRTRDLCAweDJGOEYsIDB4MUUxRCwgMHgyRjkwLCAweDE5MDksIDB4MkY5MiwKKyAgICAweDBFM0MsIDB4MkY5MywgMHgwRDkyLCAweDJGOTQsIDB4MTcyMSwgMHgyRjk1LCAweDBFQkMsIDB4MkY5NiwgMHgxMTAzLAorICAgIDB4MkY5NywgMHgxNjU2LCAweDJGOTksIDB4MUQ1OCwgMHgyRjlBLCAweDE5RUMsIDB4MkY5QiwgMHgxQUVDLCAweDJGOUMsCisgICAgMHgxQUFFLCAweDJGOUQsIDB4MTY3QiwgMHgyRjlFLCAweDFCOEQsIDB4MkY5RiwgMHgxNjdDLCAweDJGQTAsIDB4MUI2MSwKKyAgICAweDJGQTIsIDB4MThGNSwgMHgyRkEzLCAweDE4RDAsIDB4MkZBNSwgMHgxMjFBLCAweDJGQTYsIDB4MTAyMywgMHgyRkE3LAorICAgIDB4MTlBOCwgMHgyRkE4LCAweDEyRUUsIDB4MkZBOSwgMHgxNDFCLCAweDJGQUMsIDB4MTg1MywgMHgyRkFELCAweDFDMjMsCisgICAgMHgyRkFFLCAweDE0NjQsIDB4MkZBRiwgMHgxMjg4LCAweDJGQjAsIDB4MUUzNSwgMHgyRkIxLCAweDE4QTMsIDB4MkZCMywKKyAgICAweDE4RjEsIDB4MkZCNCwgMHgxRTRELCAweDJGQjUsIDB4MURBQiwgMHgyRkI2LCAweDE0NjUsIDB4MkZCNywgMHgxNjY1LAorICAgIDB4MkZCOCwgMHgxNUY5LCAweDJGQjksIDB4MUUyNiwgMHgyRkJBLCAweDEyMzUsIDB4MkZCQiwgMHgwRUM5LCAweDJGQkMsCisgICAgMHgwRUI1LCAweDJGQzEsIDB4MEY5OSwgMHgyRkMyLCAweDE3MTYsIDB4MkZDMywgMHgxQUFCLCAweDJGQzQsIDB4MTFBRiwKKyAgICAweDJGQzUsIDB4MTFCNSwgMHgyRkM2LCAweDEyNzYsIDB4MkZDNywgMHgxMjM3LCAweDJGQzgsIDB4MUVGNywgMHgyRkM5LAorICAgIDB4MTUxOSwgMHgyRkNBLCAweDFGNTIsIDB4MkZDRCwgMHgxQTY2LCAweDJGQ0UsIDB4MEVCNiwgMHgyRkNGLCAweDE1MUEsCisgICAgMHgyRkQwLCAweDE0NjYsIDB4MkZEMSwgMHgxQTdELCAweDJGRDIsIDB4MUNCRiwgMHgyRkQzLCAweDExRDMsIDB4MkZENCwKKyAgICAweDBGNkEsCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9jbWFwc19rb3JlYTEuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9jbWFwc19rb3JlYTEuY3BwCmluZGV4IGM4MGI3NDMuLmY2YWU3MGEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvY21hcHNfa29yZWExLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL2NtYXBzX2tvcmVhMS5jcHAKQEAgLTEsNDIgKzEsNTAgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3Jlc291cmNlLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgiCi0jaW5jbHVkZSAiLi4vLi4vZnBkZl9mb250L2ZvbnRfaW50LmgiCi0jaW5jbHVkZSAiLi4vY21hcF9pbnQuaCIKLWV4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0tTQ19FVUNfSF8wW107Ci1leHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9LU0NfRVVDX1ZfMFtdOwotZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfS1NDbXNfVUhDX0hfMVtdOwotZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfS1NDbXNfVUhDX1ZfMVtdOwotZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfS1NDbXNfVUhDX0hXX0hfMVtdOwotZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfS1NDbXNfVUhDX0hXX1ZfMVtdOwotZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfS1NDcGNfRVVDX0hfMFtdOwotZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfVW5pS1NfVUNTMl9IXzFbXTsKLWV4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX1VuaUtTX1VDUzJfVl8xW107Ci1leHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9VbmlLU19VVEYxNl9IXzBbXTsKLWV4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0tvcmVhMUNJRDJVbmljb2RlXzJbXTsKLWNvbnN0IEZYQ01BUF9DTWFwIGdfRlhDTUFQX0tvcmVhMV9jbWFwc1tdID0gewotICAgIHsgIktTQy1FVUMtSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfS1NDX0VVQ19IXzAsIDQ2NywgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDAgfSwKLSAgICB7ICJLU0MtRVVDLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0tTQ19FVUNfVl8wLCAxNiwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xIH0sCi0gICAgeyAiS1NDbXMtVUhDLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0tTQ21zX1VIQ19IXzEsIDY3NSwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0yIH0sCi0gICAgeyAiS1NDbXMtVUhDLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0tTQ21zX1VIQ19WXzEsIDE2LCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTEgfSwKLSAgICB7ICJLU0Ntcy1VSEMtSFctSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfS1NDbXNfVUhDX0hXX0hfMSwgNjc1LCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgMCB9LAotICAgIHsgIktTQ21zLVVIQy1IVy1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9LU0Ntc19VSENfSFdfVl8xLCAxNiwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xIH0sCi0gICAgeyAiS1NDcGMtRVVDLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0tTQ3BjX0VVQ19IXzAsIDUwOSwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC02IH0sCi0gICAgeyAiVW5pS1MtVUNTMi1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9VbmlLU19VQ1MyX0hfMSwgODM5NCwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDAgfSwKLSAgICB7ICJVbmlLUy1VQ1MyLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX1VuaUtTX1VDUzJfVl8xLCAxOCwgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xIH0sCi0gICAgeyAiVW5pS1MtVVRGMTYtSCIsIEZYQ01BUF9DTWFwOjpTaW5nbGUsIGdfRlhDTUFQX1VuaUtTX1VURjE2X0hfMCwgMTU4LCBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTIgfSwKLSAgICB7ICJVbmlLUy1VVEYxNi1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9VbmlLU19VQ1MyX1ZfMSwgMTgsIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMSB9LAorI2luY2x1ZGUgImNtYXBzX2tvcmVhMS5oIgorCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3Jlc291cmNlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiICAvLyBGb3IgRlhfQXJyYXlTaXplKCkuCisjaW5jbHVkZSAiY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL2NtYXBfaW50LmgiCisjaW5jbHVkZSAiY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZm9udF9pbnQuaCIKKworc3RhdGljIGNvbnN0IEZYQ01BUF9DTWFwIGdfRlhDTUFQX0tvcmVhMV9jbWFwc1tdID0geworICAgIHsiS1NDLUVVQy1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9LU0NfRVVDX0hfMCwgNDY3LAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgMH0sCisgICAgeyJLU0MtRVVDLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0tTQ19FVUNfVl8wLCAxNiwKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIC0xfSwKKyAgICB7IktTQ21zLVVIQy1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9LU0Ntc19VSENfSF8xLCA2NzUsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMn0sCisgICAgeyJLU0Ntcy1VSEMtViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfS1NDbXNfVUhDX1ZfMSwgMTYsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMX0sCisgICAgeyJLU0Ntcy1VSEMtSFctSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfS1NDbXNfVUhDX0hXX0hfMSwgNjc1LAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgMH0sCisgICAgeyJLU0Ntcy1VSEMtSFctViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfS1NDbXNfVUhDX0hXX1ZfMSwgMTYsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMX0sCisgICAgeyJLU0NwYy1FVUMtSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfS1NDcGNfRVVDX0hfMCwgNTA5LAorICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgTlVMTCwgMCwgLTZ9LAorICAgIHsiVW5pS1MtVUNTMi1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9VbmlLU19VQ1MyX0hfMSwgODM5NCwKKyAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIE5VTEwsIDAsIDB9LAorICAgIHsiVW5pS1MtVUNTMi1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9VbmlLU19VQ1MyX1ZfMSwgMTgsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMX0sCisgICAgeyJVbmlLUy1VVEYxNi1IIiwgRlhDTUFQX0NNYXA6OlNpbmdsZSwgZ19GWENNQVBfVW5pS1NfVVRGMTZfSF8wLCAxNTgsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMn0sCisgICAgeyJVbmlLUy1VVEYxNi1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9VbmlLU19VQ1MyX1ZfMSwgMTgsCisgICAgIEZYQ01BUF9DTWFwOjpOb25lLCBOVUxMLCAwLCAtMX0sCiB9Owotdm9pZCBDUERGX01vZHVsZU1ncjo6TG9hZEVtYmVkZGVkS29yZWExQ01hcHMoKQotewotICAgIENQREZfRm9udEdsb2JhbHMqIHBGb250R2xvYmFscyA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRGb250R2xvYmFscygpOwotICAgIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZENoYXJzZXRzW0NJRFNFVF9LT1JFQTFdLm1fcE1hcExpc3QgPSBnX0ZYQ01BUF9Lb3JlYTFfY21hcHM7Ci0gICAgcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkQ2hhcnNldHNbQ0lEU0VUX0tPUkVBMV0ubV9Db3VudCA9IHNpemVvZiBnX0ZYQ01BUF9Lb3JlYTFfY21hcHMgLyBzaXplb2YgKEZYQ01BUF9DTWFwKTsKLSAgICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRUb1VuaWNvZGVzW0NJRFNFVF9LT1JFQTFdLm1fcE1hcCA9IGdfRlhDTUFQX0tvcmVhMUNJRDJVbmljb2RlXzI7Ci0gICAgcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkVG9Vbmljb2Rlc1tDSURTRVRfS09SRUExXS5tX0NvdW50ID0gMTgzNTI7CisKK3ZvaWQgQ1BERl9Nb2R1bGVNZ3I6OkxvYWRFbWJlZGRlZEtvcmVhMUNNYXBzKCkgeworICBDUERGX0ZvbnRHbG9iYWxzKiBwRm9udEdsb2JhbHMgPQorICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCk7CisgIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZENoYXJzZXRzW0NJRFNFVF9LT1JFQTFdLm1fcE1hcExpc3QgPQorICAgICAgZ19GWENNQVBfS29yZWExX2NtYXBzOworICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRDaGFyc2V0c1tDSURTRVRfS09SRUExXS5tX0NvdW50ID0KKyAgICAgIEZYX0FycmF5U2l6ZShnX0ZYQ01BUF9Lb3JlYTFfY21hcHMpOworICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRUb1VuaWNvZGVzW0NJRFNFVF9LT1JFQTFdLm1fcE1hcCA9CisgICAgICBnX0ZYQ01BUF9Lb3JlYTFDSUQyVW5pY29kZV8yOworICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRUb1VuaWNvZGVzW0NJRFNFVF9LT1JFQTFdLm1fQ291bnQgPSAxODM1MjsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvY21hcHNfa29yZWExLmggYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL2NtYXBzX2tvcmVhMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NmE5YjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvS29yZWExL2NtYXBzX2tvcmVhMS5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE1IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX1NSQ19GUERGQVBJX0ZQREZfQ01BUFNfS09SRUExX0NNQVBTX0tPUkVBMV9IXworI2RlZmluZSBDT1JFX1NSQ19GUERGQVBJX0ZQREZfQ01BUFNfS09SRUExX0NNQVBTX0tPUkVBMV9IXworCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oIiAgLy8gRm9yIEZYX1dPUkQuCisKK2V4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0tTQ19FVUNfSF8wW107CitleHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9LU0NfRVVDX1ZfMFtdOworZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfS1NDbXNfVUhDX0hfMVtdOworZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfS1NDbXNfVUhDX1ZfMVtdOworZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfS1NDbXNfVUhDX0hXX0hfMVtdOworZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfS1NDbXNfVUhDX0hXX1ZfMVtdOworZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfS1NDcGNfRVVDX0hfMFtdOworZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19GWENNQVBfVW5pS1NfVUNTMl9IXzFbXTsKK2V4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX1VuaUtTX1VDUzJfVl8xW107CitleHRlcm4gY29uc3QgRlhfV09SRCBnX0ZYQ01BUF9VbmlLU19VVEYxNl9IXzBbXTsKK2V4dGVybiBjb25zdCBGWF9XT1JEIGdfRlhDTUFQX0tvcmVhMUNJRDJVbmljb2RlXzJbXTsKKworI2VuZGlmICAvLyBDT1JFX1NSQ19GUERGQVBJX0ZQREZfQ01BUFNfS09SRUExX0NNQVBTX0tPUkVBMV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL2NtYXBfaW50LmggYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvY21hcF9pbnQuaAppbmRleCAxZDNlZDE0Li5hNDg2YWMzIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvY21hcF9pbnQuaAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvY21hcF9pbnQuaApAQCAtMSwyMiArMSwzMiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIENPUkVfU1JDX0ZQREZBUElfRlBERl9DTUFQU19DTUFQX0lOVF9IXwogI2RlZmluZSBDT1JFX1NSQ19GUERGQVBJX0ZQREZfQ01BUFNfQ01BUF9JTlRfSF8KIAorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaCIgIC8vIEZvciBGWF9XT1JELgorCiBzdHJ1Y3QgRlhDTUFQX0NNYXAgewotICAgIHR5cGVkZWYgZW51bSB7IE5vbmUsIFNpbmdsZSwgUmFuZ2UsIFJldmVyc2UgfSBNYXBUeXBlOwotICAgIGNvbnN0IGNoYXIqCQltX05hbWU7Ci0gICAgTWFwVHlwZQkJCW1fV29yZE1hcFR5cGU7Ci0gICAgY29uc3QgRlhfV09SRCoJbV9wV29yZE1hcDsKLSAgICBpbnQJCQkJbV9Xb3JkQ291bnQ7Ci0gICAgTWFwVHlwZQkJCW1fRFdvcmRNYXBUeXBlOwotICAgIGNvbnN0IEZYX1dPUkQqCW1fcERXb3JkTWFwOwotICAgIGludAkJCQltX0RXb3JkQ291bnQ7Ci0gICAgaW50CQkJCW1fVXNlT2Zmc2V0OworICBlbnVtIE1hcFR5cGUgeyBOb25lLCBTaW5nbGUsIFJhbmdlLCBSZXZlcnNlIH07CisKKyAgY29uc3QgY2hhciogbV9OYW1lOworICBNYXBUeXBlIG1fV29yZE1hcFR5cGU7CisgIGNvbnN0IEZYX1dPUkQqIG1fcFdvcmRNYXA7CisgIGludCBtX1dvcmRDb3VudDsKKyAgTWFwVHlwZSBtX0RXb3JkTWFwVHlwZTsKKyAgY29uc3QgRlhfV09SRCogbV9wRFdvcmRNYXA7CisgIGludCBtX0RXb3JkQ291bnQ7CisgIGludCBtX1VzZU9mZnNldDsKIH07CiAKK3ZvaWQgRlBERkFQSV9GaW5kRW1iZWRkZWRDTWFwKGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWENNQVBfQ01hcComIHBNYXApOworRlhfV09SRCBGUERGQVBJX0NJREZyb21DaGFyQ29kZShjb25zdCBGWENNQVBfQ01hcCogcE1hcCwgRlhfRFdPUkQgY2hhcmNvZGUpOworRlhfRFdPUkQgRlBERkFQSV9DaGFyQ29kZUZyb21DSUQoY29uc3QgRlhDTUFQX0NNYXAqIHBNYXAsIEZYX1dPUkQgY2lkKTsKKwogI2VuZGlmICAvLyBDT1JFX1NSQ19GUERGQVBJX0ZQREZfQ01BUFNfQ01BUF9JTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9mcGRmX2NtYXBzLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9mcGRmX2NtYXBzLmNwcAppbmRleCBhZmE1MTMxLi45MDA5MWRlIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvZnBkZl9jbWFwcy5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL2ZwZGZfY21hcHMuY3BwCkBAIC0xLDE4MyArMSwxOTIgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3Jlc291cmNlLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgiCi0jaW5jbHVkZSAiLi4vZnBkZl9mb250L2ZvbnRfaW50LmgiCiAjaW5jbHVkZSAiY21hcF9pbnQuaCIKLXZvaWQgRlBERkFQSV9GaW5kRW1iZWRkZWRDTWFwKGNvbnN0IGNoYXIqIG5hbWUsIGludCBjaGFyc2V0LCBpbnQgY29kaW5nLCBjb25zdCBGWENNQVBfQ01hcComIHBNYXApCi17Ci0gICAgcE1hcCA9IE5VTEw7Ci0gICAgQ1BERl9Gb250R2xvYmFscyogcEZvbnRHbG9iYWxzID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCk7Ci0gICAgY29uc3QgRlhDTUFQX0NNYXAqIHBDTWFwcyA9IHBGb250R2xvYmFscy0+bV9FbWJlZGRlZENoYXJzZXRzW2NoYXJzZXRdLm1fcE1hcExpc3Q7Ci0gICAgaW50IG5DTWFwcyA9IHBGb250R2xvYmFscy0+bV9FbWJlZGRlZENoYXJzZXRzW2NoYXJzZXRdLm1fQ291bnQ7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ01hcHM7IGkgKyspIHsKLSAgICAgICAgaWYgKEZYU1lTX3N0cmNtcChuYW1lLCBwQ01hcHNbaV0ubV9OYW1lKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgcE1hcCA9ICZwQ01hcHNbaV07Ci0gICAgICAgIGJyZWFrOworCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3Jlc291cmNlLmgiCisjaW5jbHVkZSAiY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZm9udF9pbnQuaCIKKwordm9pZCBGUERGQVBJX0ZpbmRFbWJlZGRlZENNYXAoY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYQ01BUF9DTWFwKiYgcE1hcCkgeworICBwTWFwID0gTlVMTDsKKyAgQ1BERl9Gb250R2xvYmFscyogcEZvbnRHbG9iYWxzID0KKyAgICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRGb250R2xvYmFscygpOworICBjb25zdCBGWENNQVBfQ01hcCogcENNYXBzID0KKyAgICAgIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZENoYXJzZXRzW2NoYXJzZXRdLm1fcE1hcExpc3Q7CisgIGludCBuQ01hcHMgPSBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRDaGFyc2V0c1tjaGFyc2V0XS5tX0NvdW50OworICBmb3IgKGludCBpID0gMDsgaSA8IG5DTWFwczsgaSsrKSB7CisgICAgaWYgKEZYU1lTX3N0cmNtcChuYW1lLCBwQ01hcHNbaV0ubV9OYW1lKSkgeworICAgICAgY29udGludWU7CiAgICAgfQorICAgIHBNYXAgPSAmcENNYXBzW2ldOworICAgIGJyZWFrOworICB9CiB9CiBleHRlcm4gIkMiIHsKLSAgICBzdGF0aWMgaW50IGNvbXBhcmVXb3JkKGNvbnN0IHZvaWQqIHAxLCBjb25zdCB2b2lkKiBwMikKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKihGWF9XT1JEKilwMSkgLSAoKihGWF9XT1JEKilwMik7Ci0gICAgfQorc3RhdGljIGludCBjb21wYXJlV29yZChjb25zdCB2b2lkKiBwMSwgY29uc3Qgdm9pZCogcDIpIHsKKyAgcmV0dXJuICgqKEZYX1dPUkQqKXAxKSAtICgqKEZYX1dPUkQqKXAyKTsKK30KIH07CiBleHRlcm4gIkMiIHsKLSAgICBzdGF0aWMgaW50IGNvbXBhcmVXb3JkUmFuZ2UoY29uc3Qgdm9pZCoga2V5LCBjb25zdCB2b2lkKiBlbGVtZW50KQotICAgIHsKLSAgICAgICAgaWYgKCooRlhfV09SRCopa2V5IDwgKiAoRlhfV09SRCopZWxlbWVudCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmICgqKEZYX1dPUkQqKWtleSA+ICgoRlhfV09SRCopZWxlbWVudClbMV0pIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KK3N0YXRpYyBpbnQgY29tcGFyZVdvcmRSYW5nZShjb25zdCB2b2lkKiBrZXksIGNvbnN0IHZvaWQqIGVsZW1lbnQpIHsKKyAgaWYgKCooRlhfV09SRCopa2V5IDwgKihGWF9XT1JEKillbGVtZW50KSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmICgqKEZYX1dPUkQqKWtleSA+ICgoRlhfV09SRCopZWxlbWVudClbMV0pIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KIH07CiBleHRlcm4gIkMiIHsKLSAgICBzdGF0aWMgaW50IGNvbXBhcmVEV29yZFJhbmdlKGNvbnN0IHZvaWQqIHAxLCBjb25zdCB2b2lkKiBwMikKLSAgICB7Ci0gICAgICAgIEZYX0RXT1JEIGtleSA9ICooRlhfRFdPUkQqKXAxOwotICAgICAgICBGWF9XT1JEIGhpd29yZCA9IChGWF9XT1JEKShrZXkgPj4gMTYpOwotICAgICAgICBGWF9XT1JEKiBlbGVtZW50ID0gKEZYX1dPUkQqKXAyOwotICAgICAgICBpZiAoaGl3b3JkIDwgZWxlbWVudFswXSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoaXdvcmQgPiBlbGVtZW50WzBdKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBGWF9XT1JEIGxvd29yZCA9IChGWF9XT1JEKWtleTsKLSAgICAgICAgaWYgKGxvd29yZCA8IGVsZW1lbnRbMV0pIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAobG93b3JkID4gZWxlbWVudFsyXSkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorc3RhdGljIGludCBjb21wYXJlRFdvcmRSYW5nZShjb25zdCB2b2lkKiBwMSwgY29uc3Qgdm9pZCogcDIpIHsKKyAgRlhfRFdPUkQga2V5ID0gKihGWF9EV09SRCopcDE7CisgIEZYX1dPUkQgaGl3b3JkID0gKEZYX1dPUkQpKGtleSA+PiAxNik7CisgIEZYX1dPUkQqIGVsZW1lbnQgPSAoRlhfV09SRCopcDI7CisgIGlmIChoaXdvcmQgPCBlbGVtZW50WzBdKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChoaXdvcmQgPiBlbGVtZW50WzBdKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgRlhfV09SRCBsb3dvcmQgPSAoRlhfV09SRClrZXk7CisgIGlmIChsb3dvcmQgPCBlbGVtZW50WzFdKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChsb3dvcmQgPiBlbGVtZW50WzJdKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CiB9OwogZXh0ZXJuICJDIiB7Ci0gICAgc3RhdGljIGludCBjb21wYXJlRFdvcmRTaW5nbGUoY29uc3Qgdm9pZCogcDEsIGNvbnN0IHZvaWQqIHAyKQotICAgIHsKLSAgICAgICAgRlhfRFdPUkQga2V5ID0gKihGWF9EV09SRCopcDE7Ci0gICAgICAgIEZYX0RXT1JEIHZhbHVlID0gKCgqKEZYX1dPUkQqKXAyKSA8PCAxNikgfCAoKEZYX1dPUkQqKXAyKVsxXTsKLSAgICAgICAgaWYgKGtleSA8IHZhbHVlKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGtleSA+IHZhbHVlKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9CitzdGF0aWMgaW50IGNvbXBhcmVEV29yZFNpbmdsZShjb25zdCB2b2lkKiBwMSwgY29uc3Qgdm9pZCogcDIpIHsKKyAgRlhfRFdPUkQga2V5ID0gKihGWF9EV09SRCopcDE7CisgIEZYX0RXT1JEIHZhbHVlID0gKCgqKEZYX1dPUkQqKXAyKSA8PCAxNikgfCAoKEZYX1dPUkQqKXAyKVsxXTsKKyAgaWYgKGtleSA8IHZhbHVlKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChrZXkgPiB2YWx1ZSkgeworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQogfTsKLUZYX1dPUkQgRlBERkFQSV9DSURGcm9tQ2hhckNvZGUoY29uc3QgRlhDTUFQX0NNYXAqIHBNYXAsIEZYX0RXT1JEIGNoYXJjb2RlKQotewotICAgIGlmIChjaGFyY29kZSA+PiAxNikgewotICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgaWYgKHBNYXAtPm1fRFdvcmRNYXBUeXBlID09IEZYQ01BUF9DTWFwOjpSYW5nZSkgewotICAgICAgICAgICAgICAgIEZYX1dPUkQqIGZvdW5kID0gKEZYX1dPUkQqKUZYU1lTX2JzZWFyY2goJmNoYXJjb2RlLCBwTWFwLT5tX3BEV29yZE1hcCwgcE1hcC0+bV9EV29yZENvdW50LCA4LCBjb21wYXJlRFdvcmRSYW5nZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZFszXSArIChGWF9XT1JEKWNoYXJjb2RlIC0gZm91bmRbMV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChwTWFwLT5tX0RXb3JkTWFwVHlwZSA9PSBGWENNQVBfQ01hcDo6U2luZ2xlKSB7Ci0gICAgICAgICAgICAgICAgRlhfV09SRCogZm91bmQgPSAoRlhfV09SRCopRlhTWVNfYnNlYXJjaCgmY2hhcmNvZGUsIHBNYXAtPm1fcERXb3JkTWFwLCBwTWFwLT5tX0RXb3JkQ291bnQsIDYsIGNvbXBhcmVEV29yZFNpbmdsZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZFsyXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocE1hcC0+bV9Vc2VPZmZzZXQgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcE1hcCA9IHBNYXAgKyBwTWFwLT5tX1VzZU9mZnNldDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgRlhfV09SRCBjb2RlID0gKEZYX1dPUkQpY2hhcmNvZGU7CitGWF9XT1JEIEZQREZBUElfQ0lERnJvbUNoYXJDb2RlKGNvbnN0IEZYQ01BUF9DTWFwKiBwTWFwLCBGWF9EV09SRCBjaGFyY29kZSkgeworICBpZiAoY2hhcmNvZGUgPj4gMTYpIHsKICAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAocE1hcC0+bV9wV29yZE1hcCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgIGlmIChwTWFwLT5tX0RXb3JkTWFwVHlwZSA9PSBGWENNQVBfQ01hcDo6UmFuZ2UpIHsKKyAgICAgICAgRlhfV09SRCogZm91bmQgPQorICAgICAgICAgICAgKEZYX1dPUkQqKUZYU1lTX2JzZWFyY2goJmNoYXJjb2RlLCBwTWFwLT5tX3BEV29yZE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYXAtPm1fRFdvcmRDb3VudCwgOCwgY29tcGFyZURXb3JkUmFuZ2UpOworICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICByZXR1cm4gZm91bmRbM10gKyAoRlhfV09SRCljaGFyY29kZSAtIGZvdW5kWzFdOwogICAgICAgICB9Ci0gICAgICAgIGlmIChwTWFwLT5tX1dvcmRNYXBUeXBlID09IEZYQ01BUF9DTWFwOjpTaW5nbGUpIHsKLSAgICAgICAgICAgIEZYX1dPUkQqIGZvdW5kID0gKEZYX1dPUkQqKUZYU1lTX2JzZWFyY2goJmNvZGUsIHBNYXAtPm1fcFdvcmRNYXAsIHBNYXAtPm1fV29yZENvdW50LCA0LCBjb21wYXJlV29yZCk7Ci0gICAgICAgICAgICBpZiAoZm91bmQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRbMV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocE1hcC0+bV9Xb3JkTWFwVHlwZSA9PSBGWENNQVBfQ01hcDo6UmFuZ2UpIHsKLSAgICAgICAgICAgIEZYX1dPUkQqIGZvdW5kID0gKEZYX1dPUkQqKUZYU1lTX2JzZWFyY2goJmNvZGUsIHBNYXAtPm1fcFdvcmRNYXAsIHBNYXAtPm1fV29yZENvdW50LCA2LCBjb21wYXJlV29yZFJhbmdlKTsKLSAgICAgICAgICAgIGlmIChmb3VuZCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZFsyXSArIGNvZGUgLSBmb3VuZFswXTsKLSAgICAgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAocE1hcC0+bV9EV29yZE1hcFR5cGUgPT0gRlhDTUFQX0NNYXA6OlNpbmdsZSkgeworICAgICAgICBGWF9XT1JEKiBmb3VuZCA9CisgICAgICAgICAgICAoRlhfV09SRCopRlhTWVNfYnNlYXJjaCgmY2hhcmNvZGUsIHBNYXAtPm1fcERXb3JkTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hcC0+bV9EV29yZENvdW50LCA2LCBjb21wYXJlRFdvcmRTaW5nbGUpOworICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICByZXR1cm4gZm91bmRbMl07CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBNYXAtPm1fVXNlT2Zmc2V0ID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHBNYXAgPSBwTWFwICsgcE1hcC0+bV9Vc2VPZmZzZXQ7CisgICAgICB9CisgICAgICBpZiAocE1hcC0+bV9Vc2VPZmZzZXQgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIHBNYXAgPSBwTWFwICsgcE1hcC0+bV9Vc2VPZmZzZXQ7CiAgICAgfQogICAgIHJldHVybiAwOwotfQotRlhfRFdPUkQgRlBERkFQSV9DaGFyQ29kZUZyb21DSUQoY29uc3QgRlhDTUFQX0NNYXAqIHBNYXAsIEZYX1dPUkQgY2lkKQotewotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmIChwTWFwLT5tX1dvcmRNYXBUeXBlID09IEZYQ01BUF9DTWFwOjpTaW5nbGUpIHsKLSAgICAgICAgICAgIGNvbnN0IEZYX1dPUkQgKnBDdXIgPSBwTWFwLT5tX3BXb3JkTWFwOwotICAgICAgICAgICAgY29uc3QgRlhfV09SRCAqcEVuZCA9IHBNYXAtPm1fcFdvcmRNYXAgKyBwTWFwLT5tX1dvcmRDb3VudCAqIDI7Ci0gICAgICAgICAgICB3aGlsZSAocEN1ciA8IHBFbmQpIHsKLSAgICAgICAgICAgICAgICBpZiAocEN1clsxXSA9PSBjaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBDdXJbMF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBDdXIgKz0gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwTWFwLT5tX1dvcmRNYXBUeXBlID09IEZYQ01BUF9DTWFwOjpSYW5nZSkgewotICAgICAgICAgICAgY29uc3QgRlhfV09SRCAqcEN1ciA9IHBNYXAtPm1fcFdvcmRNYXA7Ci0gICAgICAgICAgICBjb25zdCBGWF9XT1JEICpwRW5kID0gcE1hcC0+bV9wV29yZE1hcCArIHBNYXAtPm1fV29yZENvdW50ICogMzsKLSAgICAgICAgICAgIHdoaWxlIChwQ3VyIDwgcEVuZCkgewotICAgICAgICAgICAgICAgIGlmIChjaWQgPj0gcEN1clsyXSAmJiBjaWQgPD0gcEN1clsyXSArIHBDdXJbMV0gLSBwQ3VyWzBdKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwQ3VyWzBdICsgY2lkIC0gcEN1clsyXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEN1ciArPSAzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwTWFwLT5tX1VzZU9mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBwTWFwID0gcE1hcCArIHBNYXAtPm1fVXNlT2Zmc2V0OworICB9CisgIEZYX1dPUkQgY29kZSA9IChGWF9XT1JEKWNoYXJjb2RlOworICB3aGlsZSAoMSkgeworICAgIGlmICghcE1hcC0+bV9wV29yZE1hcCkgeworICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmIChwTWFwLT5tX0RXb3JkTWFwVHlwZSA9PSBGWENNQVBfQ01hcDo6UmFuZ2UpIHsKLSAgICAgICAgICAgIGNvbnN0IEZYX1dPUkQgKnBDdXIgPSBwTWFwLT5tX3BEV29yZE1hcDsKLSAgICAgICAgICAgIGNvbnN0IEZYX1dPUkQgKnBFbmQgPSBwTWFwLT5tX3BEV29yZE1hcCArIHBNYXAtPm1fRFdvcmRDb3VudCAqIDQ7Ci0gICAgICAgICAgICB3aGlsZSAocEN1ciA8IHBFbmQpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2lkID49IHBDdXJbM10gJiYgY2lkIDw9IHBDdXJbM10gKyBwQ3VyWzJdIC0gcEN1clsxXSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCgoRlhfRFdPUkQpcEN1clswXSA8PCAxNikgfCBwQ3VyWzFdKSArIGNpZCAtIHBDdXJbM107Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBDdXIgKz0gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwTWFwLT5tX0RXb3JkTWFwVHlwZSA9PSBGWENNQVBfQ01hcDo6U2luZ2xlKSB7Ci0gICAgICAgICAgICBjb25zdCBGWF9XT1JEICpwQ3VyID0gcE1hcC0+bV9wRFdvcmRNYXA7Ci0gICAgICAgICAgICBjb25zdCBGWF9XT1JEICpwRW5kID0gcE1hcC0+bV9wRFdvcmRNYXAgKyBwTWFwLT5tX0RXb3JkQ291bnQgKiAzOwotICAgICAgICAgICAgd2hpbGUgKHBDdXIgPCBwRW5kKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBDdXJbMl0gPT0gY2lkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKEZYX0RXT1JEKXBDdXJbMF0gPDwgMTYpIHwgcEN1clsxXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcEN1ciArPSAzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwTWFwLT5tX1VzZU9mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBwTWFwID0gcE1hcCArIHBNYXAtPm1fVXNlT2Zmc2V0OworICAgIGlmIChwTWFwLT5tX1dvcmRNYXBUeXBlID09IEZYQ01BUF9DTWFwOjpTaW5nbGUpIHsKKyAgICAgIEZYX1dPUkQqIGZvdW5kID0gKEZYX1dPUkQqKUZYU1lTX2JzZWFyY2goCisgICAgICAgICAgJmNvZGUsIHBNYXAtPm1fcFdvcmRNYXAsIHBNYXAtPm1fV29yZENvdW50LCA0LCBjb21wYXJlV29yZCk7CisgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgcmV0dXJuIGZvdW5kWzFdOworICAgICAgfQorICAgIH0gZWxzZSBpZiAocE1hcC0+bV9Xb3JkTWFwVHlwZSA9PSBGWENNQVBfQ01hcDo6UmFuZ2UpIHsKKyAgICAgIEZYX1dPUkQqIGZvdW5kID0gKEZYX1dPUkQqKUZYU1lTX2JzZWFyY2goCisgICAgICAgICAgJmNvZGUsIHBNYXAtPm1fcFdvcmRNYXAsIHBNYXAtPm1fV29yZENvdW50LCA2LCBjb21wYXJlV29yZFJhbmdlKTsKKyAgICAgIGlmIChmb3VuZCkgeworICAgICAgICByZXR1cm4gZm91bmRbMl0gKyBjb2RlIC0gZm91bmRbMF07CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiAwOworICAgIGlmIChwTWFwLT5tX1VzZU9mZnNldCA9PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcE1hcCA9IHBNYXAgKyBwTWFwLT5tX1VzZU9mZnNldDsKKyAgfQorICByZXR1cm4gMDsKIH0KLXZvaWQgRlBERkFQSV9Mb2FkQ0lEMlVuaWNvZGVNYXAoaW50IGNoYXJzZXQsIGNvbnN0IEZYX1dPUkQqJiBwTWFwLCBGWF9EV09SRCYgY291bnQpCi17Ci0gICAgQ1BERl9Gb250R2xvYmFscyogcEZvbnRHbG9iYWxzID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCk7Ci0gICAgcE1hcCA9IHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbY2hhcnNldF0ubV9wTWFwOwotICAgIGNvdW50ID0gcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkVG9Vbmljb2Rlc1tjaGFyc2V0XS5tX0NvdW50OworRlhfRFdPUkQgRlBERkFQSV9DaGFyQ29kZUZyb21DSUQoY29uc3QgRlhDTUFQX0NNYXAqIHBNYXAsIEZYX1dPUkQgY2lkKSB7CisgIHdoaWxlICgxKSB7CisgICAgaWYgKHBNYXAtPm1fV29yZE1hcFR5cGUgPT0gRlhDTUFQX0NNYXA6OlNpbmdsZSkgeworICAgICAgY29uc3QgRlhfV09SRCogcEN1ciA9IHBNYXAtPm1fcFdvcmRNYXA7CisgICAgICBjb25zdCBGWF9XT1JEKiBwRW5kID0gcE1hcC0+bV9wV29yZE1hcCArIHBNYXAtPm1fV29yZENvdW50ICogMjsKKyAgICAgIHdoaWxlIChwQ3VyIDwgcEVuZCkgeworICAgICAgICBpZiAocEN1clsxXSA9PSBjaWQpIHsKKyAgICAgICAgICByZXR1cm4gcEN1clswXTsKKyAgICAgICAgfQorICAgICAgICBwQ3VyICs9IDI7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChwTWFwLT5tX1dvcmRNYXBUeXBlID09IEZYQ01BUF9DTWFwOjpSYW5nZSkgeworICAgICAgY29uc3QgRlhfV09SRCogcEN1ciA9IHBNYXAtPm1fcFdvcmRNYXA7CisgICAgICBjb25zdCBGWF9XT1JEKiBwRW5kID0gcE1hcC0+bV9wV29yZE1hcCArIHBNYXAtPm1fV29yZENvdW50ICogMzsKKyAgICAgIHdoaWxlIChwQ3VyIDwgcEVuZCkgeworICAgICAgICBpZiAoY2lkID49IHBDdXJbMl0gJiYgY2lkIDw9IHBDdXJbMl0gKyBwQ3VyWzFdIC0gcEN1clswXSkgeworICAgICAgICAgIHJldHVybiBwQ3VyWzBdICsgY2lkIC0gcEN1clsyXTsKKyAgICAgICAgfQorICAgICAgICBwQ3VyICs9IDM7CisgICAgICB9CisgICAgfQorICAgIGlmIChwTWFwLT5tX1VzZU9mZnNldCA9PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcE1hcCA9IHBNYXAgKyBwTWFwLT5tX1VzZU9mZnNldDsKKyAgfQorICB3aGlsZSAoMSkgeworICAgIGlmIChwTWFwLT5tX0RXb3JkTWFwVHlwZSA9PSBGWENNQVBfQ01hcDo6UmFuZ2UpIHsKKyAgICAgIGNvbnN0IEZYX1dPUkQqIHBDdXIgPSBwTWFwLT5tX3BEV29yZE1hcDsKKyAgICAgIGNvbnN0IEZYX1dPUkQqIHBFbmQgPSBwTWFwLT5tX3BEV29yZE1hcCArIHBNYXAtPm1fRFdvcmRDb3VudCAqIDQ7CisgICAgICB3aGlsZSAocEN1ciA8IHBFbmQpIHsKKyAgICAgICAgaWYgKGNpZCA+PSBwQ3VyWzNdICYmIGNpZCA8PSBwQ3VyWzNdICsgcEN1clsyXSAtIHBDdXJbMV0pIHsKKyAgICAgICAgICByZXR1cm4gKCgoRlhfRFdPUkQpcEN1clswXSA8PCAxNikgfCBwQ3VyWzFdKSArIGNpZCAtIHBDdXJbM107CisgICAgICAgIH0KKyAgICAgICAgcEN1ciArPSA0OworICAgICAgfQorICAgIH0gZWxzZSBpZiAocE1hcC0+bV9EV29yZE1hcFR5cGUgPT0gRlhDTUFQX0NNYXA6OlNpbmdsZSkgeworICAgICAgY29uc3QgRlhfV09SRCogcEN1ciA9IHBNYXAtPm1fcERXb3JkTWFwOworICAgICAgY29uc3QgRlhfV09SRCogcEVuZCA9IHBNYXAtPm1fcERXb3JkTWFwICsgcE1hcC0+bV9EV29yZENvdW50ICogMzsKKyAgICAgIHdoaWxlIChwQ3VyIDwgcEVuZCkgeworICAgICAgICBpZiAocEN1clsyXSA9PSBjaWQpIHsKKyAgICAgICAgICByZXR1cm4gKChGWF9EV09SRClwQ3VyWzBdIDw8IDE2KSB8IHBDdXJbMV07CisgICAgICAgIH0KKyAgICAgICAgcEN1ciArPSAzOworICAgICAgfQorICAgIH0KKyAgICBpZiAocE1hcC0+bV9Vc2VPZmZzZXQgPT0gMCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHBNYXAgPSBwTWFwICsgcE1hcC0+bV9Vc2VPZmZzZXQ7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgRlBERkFQSV9Mb2FkQ0lEMlVuaWNvZGVNYXAoQ0lEU2V0IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dPUkQqJiBwTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgY291bnQpIHsKKyAgQ1BERl9Gb250R2xvYmFscyogcEZvbnRHbG9iYWxzID0KKyAgICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRGb250R2xvYmFscygpOworICBwTWFwID0gcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkVG9Vbmljb2Rlc1tjaGFyc2V0XS5tX3BNYXA7CisgIGNvdW50ID0gcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkVG9Vbmljb2Rlc1tjaGFyc2V0XS5tX0NvdW50OwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZWRpdGludC5oIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZWRpdGludC5oCmluZGV4IGZhYTIzZjkuLmU4MGZkZDMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2VkaXRpbnQuaAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9lZGl0aW50LmgKQEAgLTEsNjEgKzEsNzEgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBDT1JFX1NSQ19GUERGQVBJX0ZQREZfRURJVF9FRElUSU5UX0hfCiAjZGVmaW5lIENPUkVfU1JDX0ZQREZBUElfRlBERl9FRElUX0VESVRJTlRfSF8KIAotY2xhc3MgQ1BERl9PYmplY3RTdHJlYW0gCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9PYmplY3RTdHJlYW0oKTsKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyZWFtLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgogCi0gICAgRlhfQk9PTAkJCQlTdGFydCgpOworY2xhc3MgQ1BERl9DcmVhdG9yOworY2xhc3MgQ1BERl9PYmplY3Q7CiAKLSAgICBGWF9JTlQzMgkJCUNvbXByZXNzSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgZHdPYmpOdW0sIGNvbnN0IENQREZfT2JqZWN0ICpwT2JqKTsKLSAgICBGWF9JTlQzMgkJCUNvbXByZXNzSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgZHdPYmpOdW0sIEZYX0xQQ0JZVEUgcEJ1ZmZlciwgRlhfRFdPUkQgZHdTaXplKTsKK2NsYXNzIENQREZfT2JqZWN0U3RyZWFtIHsKKyBwdWJsaWM6CisgIENQREZfT2JqZWN0U3RyZWFtKCk7CiAKLSAgICBGWF9GSUxFU0laRQkJCUVuZChDUERGX0NyZWF0b3IqIHBDcmVhdG9yKTsKKyAgRlhfQk9PTCBTdGFydCgpOwogCi0gICAgQ0ZYX0RXb3JkQXJyYXkJCW1fT2JqTnVtQXJyYXk7CisgIGludDMyX3QgQ29tcHJlc3NJbmRpcmVjdE9iamVjdChGWF9EV09SRCBkd09iak51bSwgY29uc3QgQ1BERl9PYmplY3QqIHBPYmopOworICBpbnQzMl90IENvbXByZXNzSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgZHdPYmpOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTaXplKTsKIAotICAgIENGWF9CeXRlVGV4dEJ1ZgkJbV9CdWZmZXI7Ci0gICAgRlhfRFdPUkQJCQltX2R3T2JqTnVtOwotICAgIEZYX0lOVDMyCQkJbV9pbmRleDsKLXByb3RlY3RlZDoKKyAgRlhfRklMRVNJWkUgRW5kKENQREZfQ3JlYXRvciogcENyZWF0b3IpOwogCi0gICAgQ0ZYX0RXb3JkQXJyYXkJCW1fT2Zmc2V0QXJyYXk7CisgIENGWF9EV29yZEFycmF5IG1fT2JqTnVtQXJyYXk7CisKKyAgQ0ZYX0J5dGVUZXh0QnVmIG1fQnVmZmVyOworICBGWF9EV09SRCBtX2R3T2JqTnVtOworICBpbnQzMl90IG1faW5kZXg7CisKKyBwcm90ZWN0ZWQ6CisgIENGWF9EV29yZEFycmF5IG1fT2Zmc2V0QXJyYXk7CiB9OwotY2xhc3MgQ1BERl9YUmVmU3RyZWFtIAotewotcHVibGljOgorY2xhc3MgQ1BERl9YUmVmU3RyZWFtIHsKKyBwdWJsaWM6CisgIENQREZfWFJlZlN0cmVhbSgpOwogCi0gICAgQ1BERl9YUmVmU3RyZWFtKCk7CisgIEZYX0JPT0wgU3RhcnQoKTsKIAotICAgIEZYX0JPT0wJCQkJU3RhcnQoKTsKKyAgaW50MzJfdCBDb21wcmVzc0luZGlyZWN0T2JqZWN0KEZYX0RXT1JEIGR3T2JqTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9PYmplY3QqIHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0NyZWF0b3IqIHBDcmVhdG9yKTsKIAotICAgIEZYX0lOVDMyCQkJQ29tcHJlc3NJbmRpcmVjdE9iamVjdChGWF9EV09SRCBkd09iak51bSwgY29uc3QgQ1BERl9PYmplY3QgKnBPYmosIENQREZfQ3JlYXRvciAqcENyZWF0b3IpOworICBpbnQzMl90IENvbXByZXNzSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgZHdPYmpOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9DcmVhdG9yKiBwQ3JlYXRvcik7CiAKLSAgICBGWF9JTlQzMgkJCUNvbXByZXNzSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgZHdPYmpOdW0sIEZYX0xQQ0JZVEUgcEJ1ZmZlciwgRlhfRFdPUkQgZHdTaXplLCBDUERGX0NyZWF0b3IgKnBDcmVhdG9yKTsKKyAgRlhfQk9PTCBFbmQoQ1BERl9DcmVhdG9yKiBwQ3JlYXRvciwgRlhfQk9PTCBiRU9GID0gRkFMU0UpOworICBGWF9CT09MIEFkZE9iamVjdE51bWJlclRvSW5kZXhBcnJheShGWF9EV09SRCBvYmpudW0pOworICBGWF9CT09MIEVuZFhSZWZTdHJlYW0oQ1BERl9DcmVhdG9yKiBwQ3JlYXRvcik7CiAKLSAgICBGWF9CT09MCQkJCUVuZChDUERGX0NyZWF0b3IgKnBDcmVhdG9yLCBGWF9CT09MIGJFT0YgPSBGQUxTRSk7Ci0gICAgRlhfQk9PTAkJCQlBZGRPYmplY3ROdW1iZXJUb0luZGV4QXJyYXkoRlhfRFdPUkQgb2JqbnVtKTsKLSAgICBGWF9CT09MCQkJCUVuZFhSZWZTdHJlYW0oQ1BERl9DcmVhdG9yKiBwQ3JlYXRvcik7CisgIENGWF9EV29yZEFycmF5IG1fSW5kZXhBcnJheTsKIAorICBGWF9GSUxFU0laRSBtX1ByZXZPZmZzZXQ7CisgIEZYX0RXT1JEIG1fZHdUZW1wT2JqTnVtOwogCi0gICAgQ0ZYX0RXb3JkQXJyYXkJCW1fSW5kZXhBcnJheTsKLQotICAgIEZYX0ZJTEVTSVpFCQkJbV9QcmV2T2Zmc2V0OwotICAgIEZYX0RXT1JECQkJbV9kd1RlbXBPYmpOdW07Ci0KLXByb3RlY3RlZDoKLSAgICBGWF9JTlQzMgkJCUVuZE9iamVjdFN0cmVhbShDUERGX0NyZWF0b3IgKnBDcmVhdG9yLCBGWF9CT09MIGJFT0YgPSBUUlVFKTsKLSAgICBGWF9CT09MCQkJCUdlbmVyYXRlWFJlZlN0cmVhbShDUERGX0NyZWF0b3IqIHBDcmVhdG9yLCBGWF9CT09MIGJFT0YpOwotICAgIEZYX0lOVDMyCQkJbV9pU2VnOwotICAgIENQREZfT2JqZWN0U3RyZWFtCW1fT2JqU3RyZWFtOwotICAgIENGWF9CeXRlVGV4dEJ1ZgkJbV9CdWZmZXI7CisgcHJvdGVjdGVkOgorICBpbnQzMl90IEVuZE9iamVjdFN0cmVhbShDUERGX0NyZWF0b3IqIHBDcmVhdG9yLCBGWF9CT09MIGJFT0YgPSBUUlVFKTsKKyAgRlhfQk9PTCBHZW5lcmF0ZVhSZWZTdHJlYW0oQ1BERl9DcmVhdG9yKiBwQ3JlYXRvciwgRlhfQk9PTCBiRU9GKTsKKyAgaW50MzJfdCBtX2lTZWc7CisgIENQREZfT2JqZWN0U3RyZWFtIG1fT2JqU3RyZWFtOworICBDRlhfQnl0ZVRleHRCdWYgbV9CdWZmZXI7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfU1JDX0ZQREZBUElfRlBERl9FRElUX0VESVRJTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9jb250ZW50LmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9jb250ZW50LmNwcAppbmRleCBiNjQxNTFhLi5mMDBjZjVmIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfY29udGVudC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2NvbnRlbnQuY3BwCkBAIC00LDE2MSArNCwxNjIgQEAKIAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2UuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9zZXJpYWwuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCIKLSNpbmNsdWRlICIuLi9mcGRmX3BhZ2UvcGFnZWludC5oIgotQ0ZYX0J5dGVUZXh0QnVmJiBvcGVyYXRvciA8PCAoQ0ZYX0J5dGVUZXh0QnVmJiBhciwgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KQotewotICAgIGFyIDw8IG1hdHJpeC5hIDw8ICIgIiA8PCBtYXRyaXguYiA8PCAiICIgPDwgbWF0cml4LmMgPDwgIiAiIDw8IG1hdHJpeC5kIDw8ICIgIiA8PCBtYXRyaXguZSA8PCAiICIgPDwgbWF0cml4LmY7Ci0gICAgcmV0dXJuIGFyOworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9zZXJpYWwuaCIKKyNpbmNsdWRlICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9wYWdlaW50LmgiCisKK0NGWF9CeXRlVGV4dEJ1ZiYgb3BlcmF0b3I8PChDRlhfQnl0ZVRleHRCdWYmIGFyLCBDRlhfTWF0cml4JiBtYXRyaXgpIHsKKyAgYXIgPDwgbWF0cml4LmEgPDwgIiAiIDw8IG1hdHJpeC5iIDw8ICIgIiA8PCBtYXRyaXguYyA8PCAiICIgPDwgbWF0cml4LmQgPDwgIiAiCisgICAgIDw8IG1hdHJpeC5lIDw8ICIgIiA8PCBtYXRyaXguZjsKKyAgcmV0dXJuIGFyOwogfQotQ1BERl9QYWdlQ29udGVudEdlbmVyYXRlOjpDUERGX1BhZ2VDb250ZW50R2VuZXJhdGUoQ1BERl9QYWdlKiBwUGFnZSkgOiBtX3BQYWdlKHBQYWdlKQotewotICAgIG1fcERvY3VtZW50ID0gTlVMTDsKLSAgICBpZiAobV9wUGFnZSkgewotICAgICAgICBtX3BEb2N1bWVudCA9IG1fcFBhZ2UtPm1fcERvY3VtZW50OwotICAgIH0KLSAgICBGWF9QT1NJVElPTiBwb3MgPSBwUGFnZS0+R2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgSW5zZXJ0UGFnZU9iamVjdChwUGFnZS0+R2V0TmV4dE9iamVjdChwb3MpKTsKLSAgICB9CitDUERGX1BhZ2VDb250ZW50R2VuZXJhdGU6OkNQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZShDUERGX1BhZ2UqIHBQYWdlKQorICAgIDogbV9wUGFnZShwUGFnZSkgeworICBtX3BEb2N1bWVudCA9IE5VTEw7CisgIGlmIChtX3BQYWdlKSB7CisgICAgbV9wRG9jdW1lbnQgPSBtX3BQYWdlLT5tX3BEb2N1bWVudDsKKyAgfQorICBGWF9QT1NJVElPTiBwb3MgPSBwUGFnZS0+R2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpOworICB3aGlsZSAocG9zKSB7CisgICAgSW5zZXJ0UGFnZU9iamVjdChwUGFnZS0+R2V0TmV4dE9iamVjdChwb3MpKTsKKyAgfQogfQotQ1BERl9QYWdlQ29udGVudEdlbmVyYXRlOjp+Q1BERl9QYWdlQ29udGVudEdlbmVyYXRlKCkKLXsKK0NQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZTo6fkNQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZSgpIHt9CitGWF9CT09MIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZTo6SW5zZXJ0UGFnZU9iamVjdCgKKyAgICBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqZWN0KSB7CisgIGlmICghcFBhZ2VPYmplY3QpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIG1fcGFnZU9iamVjdHMuQWRkKHBQYWdlT2JqZWN0KTsKIH0KLUZYX0JPT0wgQ1BERl9QYWdlQ29udGVudEdlbmVyYXRlOjpJbnNlcnRQYWdlT2JqZWN0KENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmplY3QpCi17Ci0gICAgaWYgKCFwUGFnZU9iamVjdCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Cit2b2lkIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZTo6R2VuZXJhdGVDb250ZW50KCkgeworICBDRlhfQnl0ZVRleHRCdWYgYnVmOworICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IG1fcFBhZ2UtPm1fcEZvcm1EaWN0OworICBmb3IgKGludCBpID0gMDsgaSA8IG1fcGFnZU9iamVjdHMuR2V0U2l6ZSgpOyArK2kpIHsKKyAgICBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqID0gbV9wYWdlT2JqZWN0c1tpXTsKKyAgICBpZiAoIXBQYWdlT2JqIHx8IHBQYWdlT2JqLT5tX1R5cGUgIT0gUERGUEFHRV9JTUFHRSkgeworICAgICAgY29udGludWU7CiAgICAgfQotICAgIHJldHVybiBtX3BhZ2VPYmplY3RzLkFkZChwUGFnZU9iamVjdCk7CisgICAgUHJvY2Vzc0ltYWdlKGJ1ZiwgKENQREZfSW1hZ2VPYmplY3QqKXBQYWdlT2JqKTsKKyAgfQorICBDUERGX09iamVjdCogcENvbnRlbnQgPQorICAgICAgcFBhZ2VEaWN0ID8gcFBhZ2VEaWN0LT5HZXRFbGVtZW50VmFsdWUoIkNvbnRlbnRzIikgOiBOVUxMOworICBpZiAocENvbnRlbnQpIHsKKyAgICBwUGFnZURpY3QtPlJlbW92ZUF0KCJDb250ZW50cyIpOworICB9CisgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gbmV3IENQREZfU3RyZWFtKE5VTEwsIDAsIE5VTEwpOworICBwU3RyZWFtLT5TZXREYXRhKGJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldExlbmd0aCgpLCBGQUxTRSwgRkFMU0UpOworICBtX3BEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocFN0cmVhbSk7CisgIHBQYWdlRGljdC0+U2V0QXRSZWZlcmVuY2UoIkNvbnRlbnRzIiwgbV9wRG9jdW1lbnQsIHBTdHJlYW0tPkdldE9iak51bSgpKTsKIH0KLXZvaWQgQ1BERl9QYWdlQ29udGVudEdlbmVyYXRlOjpHZW5lcmF0ZUNvbnRlbnQoKQotewotICAgIENGWF9CeXRlVGV4dEJ1ZiBidWY7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBtX3BQYWdlLT5tX3BGb3JtRGljdDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fcGFnZU9iamVjdHMuR2V0U2l6ZSgpOyArK2kpIHsKLSAgICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiA9IChDUERGX1BhZ2VPYmplY3QqKW1fcGFnZU9iamVjdHNbaV07Ci0gICAgICAgIGlmICghcFBhZ2VPYmogfHwgcFBhZ2VPYmotPm1fVHlwZSAhPSBQREZQQUdFX0lNQUdFKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBQcm9jZXNzSW1hZ2UoYnVmLCAoQ1BERl9JbWFnZU9iamVjdCopcFBhZ2VPYmopOworQ0ZYX0J5dGVTdHJpbmcgQ1BERl9QYWdlQ29udGVudEdlbmVyYXRlOjpSZWFsaXplUmVzb3VyY2UoCisgICAgQ1BERl9PYmplY3QqIHBSZXNvdXJjZU9iaiwKKyAgICBjb25zdCBGWF9DSEFSKiBzelR5cGUpIHsKKyAgaWYgKCFtX3BQYWdlLT5tX3BSZXNvdXJjZXMpIHsKKyAgICBtX3BQYWdlLT5tX3BSZXNvdXJjZXMgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICAgIGludCBvYmpudW0gPSBtX3BEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QobV9wUGFnZS0+bV9wUmVzb3VyY2VzKTsKKyAgICBtX3BQYWdlLT5tX3BGb3JtRGljdC0+U2V0QXRSZWZlcmVuY2UoIlJlc291cmNlcyIsIG1fcERvY3VtZW50LCBvYmpudW0pOworICB9CisgIENQREZfRGljdGlvbmFyeSogcFJlc0xpc3QgPSBtX3BQYWdlLT5tX3BSZXNvdXJjZXMtPkdldERpY3Qoc3pUeXBlKTsKKyAgaWYgKCFwUmVzTGlzdCkgeworICAgIHBSZXNMaXN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgICBtX3BQYWdlLT5tX3BSZXNvdXJjZXMtPlNldEF0KHN6VHlwZSwgcFJlc0xpc3QpOworICB9CisgIG1fcERvY3VtZW50LT5BZGRJbmRpcmVjdE9iamVjdChwUmVzb3VyY2VPYmopOworICBDRlhfQnl0ZVN0cmluZyBuYW1lOworICBpbnQgaWRudW0gPSAxOworICB3aGlsZSAoMSkgeworICAgIG5hbWUuRm9ybWF0KCJGWCVjJWQiLCBzelR5cGVbMF0sIGlkbnVtKTsKKyAgICBpZiAoIXBSZXNMaXN0LT5LZXlFeGlzdChuYW1lKSkgeworICAgICAgYnJlYWs7CiAgICAgfQotICAgIENQREZfT2JqZWN0KiBwQ29udGVudCA9IHBQYWdlRGljdCA/IHBQYWdlRGljdC0+R2V0RWxlbWVudFZhbHVlKCJDb250ZW50cyIpIDogTlVMTDsKLSAgICBpZiAocENvbnRlbnQgIT0gTlVMTCkgewotICAgICAgICBwUGFnZURpY3QtPlJlbW92ZUF0KCJDb250ZW50cyIpOwotICAgIH0KLSAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbShOVUxMLCAwLCBOVUxMKTsKLSAgICBwU3RyZWFtLT5TZXREYXRhKGJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldExlbmd0aCgpLCBGQUxTRSwgRkFMU0UpOwotICAgIG1fcERvY3VtZW50LT5BZGRJbmRpcmVjdE9iamVjdChwU3RyZWFtKTsKLSAgICBwUGFnZURpY3QtPlNldEF0UmVmZXJlbmNlKCJDb250ZW50cyIsIG1fcERvY3VtZW50LCBwU3RyZWFtLT5HZXRPYmpOdW0oKSk7CisgICAgaWRudW0rKzsKKyAgfQorICBwUmVzTGlzdC0+QWRkUmVmZXJlbmNlKG5hbWUsIG1fcERvY3VtZW50LCBwUmVzb3VyY2VPYmotPkdldE9iak51bSgpKTsKKyAgcmV0dXJuIG5hbWU7CiB9Ci1DRlhfQnl0ZVN0cmluZyBDUERGX1BhZ2VDb250ZW50R2VuZXJhdGU6OlJlYWxpemVSZXNvdXJjZShDUERGX09iamVjdCogcFJlc291cmNlT2JqLCBjb25zdCBGWF9DSEFSKiBzelR5cGUpCi17Ci0gICAgaWYgKG1fcFBhZ2UtPm1fcFJlc291cmNlcyA9PSBOVUxMKSB7Ci0gICAgICAgIG1fcFBhZ2UtPm1fcFJlc291cmNlcyA9IG5ldyBDUERGX0RpY3Rpb25hcnk7Ci0gICAgICAgIGludCBvYmpudW0gPSBtX3BEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QobV9wUGFnZS0+bV9wUmVzb3VyY2VzKTsKLSAgICAgICAgbV9wUGFnZS0+bV9wRm9ybURpY3QtPlNldEF0UmVmZXJlbmNlKCJSZXNvdXJjZXMiLCBtX3BEb2N1bWVudCwgb2JqbnVtKTsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzTGlzdCA9IG1fcFBhZ2UtPm1fcFJlc291cmNlcy0+R2V0RGljdChzelR5cGUpOwotICAgIGlmIChwUmVzTGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgIHBSZXNMaXN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKLSAgICAgICAgbV9wUGFnZS0+bV9wUmVzb3VyY2VzLT5TZXRBdChzelR5cGUsIHBSZXNMaXN0KTsKLSAgICB9Ci0gICAgbV9wRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBSZXNvdXJjZU9iaik7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZTsKLSAgICBpbnQgaWRudW0gPSAxOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIG5hbWUuRm9ybWF0KCJGWCVjJWQiLCBzelR5cGVbMF0sIGlkbnVtKTsKLSAgICAgICAgaWYgKCFwUmVzTGlzdC0+S2V5RXhpc3QobmFtZSkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlkbnVtICsrOwotICAgIH0KLSAgICBwUmVzTGlzdC0+QWRkUmVmZXJlbmNlKG5hbWUsIG1fcERvY3VtZW50LCBwUmVzb3VyY2VPYmotPkdldE9iak51bSgpKTsKLSAgICByZXR1cm4gbmFtZTsKLX0KLXZvaWQgQ1BERl9QYWdlQ29udGVudEdlbmVyYXRlOjpQcm9jZXNzSW1hZ2UoQ0ZYX0J5dGVUZXh0QnVmJiBidWYsIENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaikKLXsKLSAgICBpZiAoKHBJbWFnZU9iai0+bV9NYXRyaXguYSA9PSAwICYmIHBJbWFnZU9iai0+bV9NYXRyaXguYiA9PSAwKSB8fAotICAgICAgICAgICAgKHBJbWFnZU9iai0+bV9NYXRyaXguYyA9PSAwICYmIHBJbWFnZU9iai0+bV9NYXRyaXguZCA9PSAwKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGJ1ZiA8PCAicSAiIDw8IHBJbWFnZU9iai0+bV9NYXRyaXggPDwgIiBjbSAiOwotICAgIGlmICghcEltYWdlT2JqLT5tX3BJbWFnZS0+SXNJbmxpbmUoKSkgewotICAgICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IHBJbWFnZU9iai0+bV9wSW1hZ2UtPkdldFN0cmVhbSgpOwotICAgICAgICBGWF9EV09SRCBkd1NhdmVkT2JqTnVtID0gcFN0cmVhbS0+R2V0T2JqTnVtKCk7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIG5hbWUgPSBSZWFsaXplUmVzb3VyY2UocFN0cmVhbSwgIlhPYmplY3QiKTsKLSAgICAgICAgaWYgKGR3U2F2ZWRPYmpOdW0gPT0gMCkgewotICAgICAgICAgICAgaWYgKHBJbWFnZU9iai0+bV9wSW1hZ2UpCi0gICAgICAgICAgICAgICAgcEltYWdlT2JqLT5tX3BJbWFnZS0+UmVsZWFzZSgpOwotICAgICAgICAgICAgcEltYWdlT2JqLT5tX3BJbWFnZSA9IG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5HZXRJbWFnZShwU3RyZWFtKTsKLSAgICAgICAgfQotICAgICAgICBidWYgPDwgIi8iIDw8IFBERl9OYW1lRW5jb2RlKG5hbWUpIDw8ICIgRG8gUVxuIjsKLSAgICB9Ci19Ci12b2lkIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZTo6UHJvY2Vzc0Zvcm0oQ0ZYX0J5dGVUZXh0QnVmJiBidWYsIEZYX0xQQ0JZVEUgZGF0YSwgRlhfRFdPUkQgc2l6ZSwgQ0ZYX01hdHJpeCYgbWF0cml4KQotewotICAgIGlmICghZGF0YSB8fCAhc2l6ZSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gbmV3IENQREZfU3RyZWFtKE5VTEwsIDAsIE5VTEwpOwotICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0ID0gQ1BERl9EaWN0aW9uYXJ5OjpDcmVhdGUoKTsKLSAgICBwRm9ybURpY3QtPlNldEF0TmFtZShGWF9CU1RSKCJUeXBlIiksIEZYX0JTVFIoIlhPYmplY3QiKSk7Ci0gICAgcEZvcm1EaWN0LT5TZXRBdE5hbWUoRlhfQlNUUigiU3VidHlwZSIpLCBGWF9CU1RSKCJGb3JtIikpOwotICAgIENGWF9GbG9hdFJlY3QgYmJveCA9IG1fcFBhZ2UtPkdldFBhZ2VCQm94KCk7Ci0gICAgbWF0cml4LlRyYW5zZm9ybVJlY3QoYmJveCk7Ci0gICAgcEZvcm1EaWN0LT5TZXRBdFJlY3QoRlhfQlNUUigiQkJveCIpLCBiYm94KTsKLSAgICBwU3RyZWFtLT5Jbml0U3RyZWFtKChGWF9MUEJZVEUpZGF0YSwgc2l6ZSwgcEZvcm1EaWN0KTsKLSAgICBidWYgPDwgInEgIiA8PCBtYXRyaXggPDwgIiBjbSAiOwordm9pZCBDUERGX1BhZ2VDb250ZW50R2VuZXJhdGU6OlByb2Nlc3NJbWFnZShDRlhfQnl0ZVRleHRCdWYmIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqKSB7CisgIGlmICgocEltYWdlT2JqLT5tX01hdHJpeC5hID09IDAgJiYgcEltYWdlT2JqLT5tX01hdHJpeC5iID09IDApIHx8CisgICAgICAocEltYWdlT2JqLT5tX01hdHJpeC5jID09IDAgJiYgcEltYWdlT2JqLT5tX01hdHJpeC5kID09IDApKSB7CisgICAgcmV0dXJuOworICB9CisgIGJ1ZiA8PCAicSAiIDw8IHBJbWFnZU9iai0+bV9NYXRyaXggPDwgIiBjbSAiOworICBpZiAoIXBJbWFnZU9iai0+bV9wSW1hZ2UtPklzSW5saW5lKCkpIHsKKyAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IHBJbWFnZU9iai0+bV9wSW1hZ2UtPkdldFN0cmVhbSgpOworICAgIEZYX0RXT1JEIGR3U2F2ZWRPYmpOdW0gPSBwU3RyZWFtLT5HZXRPYmpOdW0oKTsKICAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gUmVhbGl6ZVJlc291cmNlKHBTdHJlYW0sICJYT2JqZWN0Iik7CisgICAgaWYgKGR3U2F2ZWRPYmpOdW0gPT0gMCkgeworICAgICAgaWYgKHBJbWFnZU9iai0+bV9wSW1hZ2UpCisgICAgICAgIHBJbWFnZU9iai0+bV9wSW1hZ2UtPlJlbGVhc2UoKTsKKyAgICAgIHBJbWFnZU9iai0+bV9wSW1hZ2UgPSBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+R2V0SW1hZ2UocFN0cmVhbSk7CisgICAgfQogICAgIGJ1ZiA8PCAiLyIgPDwgUERGX05hbWVFbmNvZGUobmFtZSkgPDwgIiBEbyBRXG4iOworICB9CiB9Ci12b2lkIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZTo6VHJhbnNmb3JtQ29udGVudChDRlhfTWF0cml4JiBtYXRyaXgpCi17Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcFBhZ2UtPm1fcEZvcm1EaWN0OwotICAgIENQREZfT2JqZWN0KiBwQ29udGVudCA9IHBEaWN0ID8gcERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiQ29udGVudHMiKSA6IE5VTEw7Ci0gICAgaWYgKCFwQ29udGVudCkgewotICAgICAgICByZXR1cm47Cit2b2lkIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0ZTo6UHJvY2Vzc0Zvcm0oQ0ZYX0J5dGVUZXh0QnVmJiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgmIG1hdHJpeCkgeworICBpZiAoIWRhdGEgfHwgIXNpemUpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW0oTlVMTCwgMCwgTlVMTCk7CisgIENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgcEZvcm1EaWN0LT5TZXRBdE5hbWUoIlR5cGUiLCAiWE9iamVjdCIpOworICBwRm9ybURpY3QtPlNldEF0TmFtZSgiU3VidHlwZSIsICJGb3JtIik7CisgIENGWF9GbG9hdFJlY3QgYmJveCA9IG1fcFBhZ2UtPkdldFBhZ2VCQm94KCk7CisgIG1hdHJpeC5UcmFuc2Zvcm1SZWN0KGJib3gpOworICBwRm9ybURpY3QtPlNldEF0UmVjdCgiQkJveCIsIGJib3gpOworICBwU3RyZWFtLT5Jbml0U3RyZWFtKCh1aW50OF90KilkYXRhLCBzaXplLCBwRm9ybURpY3QpOworICBidWYgPDwgInEgIiA8PCBtYXRyaXggPDwgIiBjbSAiOworICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gUmVhbGl6ZVJlc291cmNlKHBTdHJlYW0sICJYT2JqZWN0Iik7CisgIGJ1ZiA8PCAiLyIgPDwgUERGX05hbWVFbmNvZGUobmFtZSkgPDwgIiBEbyBRXG4iOworfQordm9pZCBDUERGX1BhZ2VDb250ZW50R2VuZXJhdGU6OlRyYW5zZm9ybUNvbnRlbnQoQ0ZYX01hdHJpeCYgbWF0cml4KSB7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BQYWdlLT5tX3BGb3JtRGljdDsKKyAgQ1BERl9PYmplY3QqIHBDb250ZW50ID0gcERpY3QgPyBwRGljdC0+R2V0RWxlbWVudFZhbHVlKCJDb250ZW50cyIpIDogTlVMTDsKKyAgaWYgKCFwQ29udGVudCkKKyAgICByZXR1cm47CisKKyAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKKyAgaWYgKENQREZfQXJyYXkqIHBBcnJheSA9IHBDb250ZW50LT5Bc0FycmF5KCkpIHsKKyAgICBpbnQgaUNvdW50ID0gcEFycmF5LT5HZXRDb3VudCgpOworICAgIENQREZfU3RyZWFtQWNjKiogcENvbnRlbnRBcnJheSA9IEZYX0FsbG9jKENQREZfU3RyZWFtQWNjKiwgaUNvdW50KTsKKyAgICBpbnQgc2l6ZSA9IDA7CisgICAgaW50IGkgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7ICsraSkgeworICAgICAgcENvbnRlbnQgPSBwQXJyYXktPkdldEVsZW1lbnQoaSk7CisgICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IFRvU3RyZWFtKHBDb250ZW50KTsKKyAgICAgIGlmICghcFN0cmVhbSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIENQREZfU3RyZWFtQWNjKiBwU3RyZWFtQWNjID0gbmV3IENQREZfU3RyZWFtQWNjKCk7CisgICAgICBwU3RyZWFtQWNjLT5Mb2FkQWxsRGF0YShwU3RyZWFtKTsKKyAgICAgIHBDb250ZW50QXJyYXlbaV0gPSBwU3RyZWFtQWNjOworICAgICAgc2l6ZSArPSBwQ29udGVudEFycmF5W2ldLT5HZXRTaXplKCkgKyAxOwogICAgIH0KLSAgICBDRlhfQnl0ZVRleHRCdWYgYnVmOwotICAgIGludCB0eXBlID0gcENvbnRlbnQtPkdldFR5cGUoKTsKLSAgICBpZiAodHlwZSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBDb250ZW50OwotICAgICAgICBpbnQgaUNvdW50ID0gcEFycmF5LT5HZXRDb3VudCgpOwotICAgICAgICBDUERGX1N0cmVhbUFjYyoqIHBDb250ZW50QXJyYXkgPSAoQ1BERl9TdHJlYW1BY2MqKilGWF9BbGxvYyhDUERGX1N0cmVhbUFjYyosIGlDb3VudCk7Ci0gICAgICAgIGludCBzaXplID0gMDsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyArK2kpIHsKLSAgICAgICAgICAgIHBDb250ZW50ID0gcEFycmF5LT5HZXRFbGVtZW50KGkpOwotICAgICAgICAgICAgaWYgKCFwQ29udGVudCB8fCBwQ29udGVudC0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENQREZfU3RyZWFtQWNjKiBwU3RyZWFtID0gbmV3IENQREZfU3RyZWFtQWNjKCk7Ci0gICAgICAgICAgICBwU3RyZWFtLT5Mb2FkQWxsRGF0YSgoQ1BERl9TdHJlYW0qKXBDb250ZW50KTsKLSAgICAgICAgICAgIHBDb250ZW50QXJyYXlbaV0gPSBwU3RyZWFtOwotICAgICAgICAgICAgc2l6ZSArPSBwQ29udGVudEFycmF5W2ldLT5HZXRTaXplKCkgKyAxOwotICAgICAgICB9Ci0gICAgICAgIGludCBwb3MgPSAwOwotICAgICAgICBGWF9MUEJZVEUgcEJ1ZiA9IEZYX0FsbG9jKEZYX0JZVEUsIHNpemUpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyArK2kpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKHBCdWYgKyBwb3MsIHBDb250ZW50QXJyYXlbaV0tPkdldERhdGEoKSwgcENvbnRlbnRBcnJheVtpXS0+R2V0U2l6ZSgpKTsKLSAgICAgICAgICAgIHBvcyArPSBwQ29udGVudEFycmF5W2ldLT5HZXRTaXplKCkgKyAxOwotICAgICAgICAgICAgcEJ1Zltwb3MgLSAxXSA9ICcgJzsKLSAgICAgICAgICAgIGRlbGV0ZSBwQ29udGVudEFycmF5W2ldOwotICAgICAgICB9Ci0gICAgICAgIFByb2Nlc3NGb3JtKGJ1ZiwgcEJ1Ziwgc2l6ZSwgbWF0cml4KTsKLSAgICAgICAgRlhfRnJlZShwQnVmKTsKLSAgICAgICAgRlhfRnJlZShwQ29udGVudEFycmF5KTsKLSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gUERGT0JKX1NUUkVBTSkgewotICAgICAgICBDUERGX1N0cmVhbUFjYyBjb250ZW50U3RyZWFtOwotICAgICAgICBjb250ZW50U3RyZWFtLkxvYWRBbGxEYXRhKChDUERGX1N0cmVhbSopcENvbnRlbnQpOwotICAgICAgICBQcm9jZXNzRm9ybShidWYsIGNvbnRlbnRTdHJlYW0uR2V0RGF0YSgpLCBjb250ZW50U3RyZWFtLkdldFNpemUoKSwgbWF0cml4KTsKKyAgICBpbnQgcG9zID0gMDsKKyAgICB1aW50OF90KiBwQnVmID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7CisgICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgKytpKSB7CisgICAgICBGWFNZU19tZW1jcHkocEJ1ZiArIHBvcywgcENvbnRlbnRBcnJheVtpXS0+R2V0RGF0YSgpLAorICAgICAgICAgICAgICAgICAgIHBDb250ZW50QXJyYXlbaV0tPkdldFNpemUoKSk7CisgICAgICBwb3MgKz0gcENvbnRlbnRBcnJheVtpXS0+R2V0U2l6ZSgpICsgMTsKKyAgICAgIHBCdWZbcG9zIC0gMV0gPSAnICc7CisgICAgICBkZWxldGUgcENvbnRlbnRBcnJheVtpXTsKICAgICB9Ci0gICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW0oTlVMTCwgMCwgTlVMTCk7Ci0gICAgcFN0cmVhbS0+U2V0RGF0YShidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRMZW5ndGgoKSwgRkFMU0UsIEZBTFNFKTsKLSAgICBtX3BEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocFN0cmVhbSk7Ci0gICAgbV9wUGFnZS0+bV9wRm9ybURpY3QtPlNldEF0UmVmZXJlbmNlKCJDb250ZW50cyIsIG1fcERvY3VtZW50LCBwU3RyZWFtLT5HZXRPYmpOdW0oKSk7CisgICAgUHJvY2Vzc0Zvcm0oYnVmLCBwQnVmLCBzaXplLCBtYXRyaXgpOworICAgIEZYX0ZyZWUocEJ1Zik7CisgICAgRlhfRnJlZShwQ29udGVudEFycmF5KTsKKyAgfSBlbHNlIGlmIChDUERGX1N0cmVhbSogcFN0cmVhbSA9IHBDb250ZW50LT5Bc1N0cmVhbSgpKSB7CisgICAgQ1BERl9TdHJlYW1BY2MgY29udGVudFN0cmVhbTsKKyAgICBjb250ZW50U3RyZWFtLkxvYWRBbGxEYXRhKHBTdHJlYW0pOworICAgIFByb2Nlc3NGb3JtKGJ1ZiwgY29udGVudFN0cmVhbS5HZXREYXRhKCksIGNvbnRlbnRTdHJlYW0uR2V0U2l6ZSgpLCBtYXRyaXgpOworICB9CisgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gbmV3IENQREZfU3RyZWFtKE5VTEwsIDAsIE5VTEwpOworICBwU3RyZWFtLT5TZXREYXRhKGJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldExlbmd0aCgpLCBGQUxTRSwgRkFMU0UpOworICBtX3BEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocFN0cmVhbSk7CisgIG1fcFBhZ2UtPm1fcEZvcm1EaWN0LT5TZXRBdFJlZmVyZW5jZSgiQ29udGVudHMiLCBtX3BEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW0tPkdldE9iak51bSgpKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9jcmVhdGUuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2NyZWF0ZS5jcHAKaW5kZXggM2FiYmNlZS4uMWZmY2ZiZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2NyZWF0ZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2NyZWF0ZS5jcHAKQEAgLTQsMjEzMyArNCwyMDg0IEBACiAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9zZXJpYWwuaCIKLSNpbmNsdWRlICJlZGl0aW50LmgiCi0jZGVmaW5lIFBERl9PQkpFQ1RTVFJFQU1fTUFYTEVOR1RICSgyNTYgKiAxMDI0KQotI2RlZmluZSBQREZfWFJFRlNUUkVBTV9NQVhTSVpFCQkxMDAwMAotZXh0ZXJuIHZvaWQgRmxhdGVFbmNvZGUoY29uc3QgRlhfQllURSogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX2RhdGEsIEZYX0xQQllURSYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpOwotZXh0ZXJuIHZvaWQgRmxhdGVFbmNvZGUoRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHByZWRpY3RvciwgaW50IENvbG9ycywgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBCWVRFJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7Ci1leHRlcm4gRlhfQk9PTCBJc1NpZ25hdHVyZURpY3QoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7Ci1GWF9JTlQzMiBQREZfQ3JlYXRvckFwcGVuZE9iamVjdChjb25zdCBDUERGX09iamVjdCogcE9iaiwgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlICpwRmlsZSwgRlhfRklMRVNJWkUmIG9mZnNldCkKLXsKLSAgICBGWF9JTlQzMiBsZW4gPSAwOwotICAgIGlmIChwT2JqID09IE5VTEwpIHsKLSAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiBudWxsIikpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIG9mZnNldCArPSA1OwotICAgICAgICByZXR1cm4gMTsKKyNpbmNsdWRlICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9lZGl0aW50LmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfZXh0LmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9zZXJpYWwuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhcnNlci5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKKworI2RlZmluZSBQREZfT0JKRUNUU1RSRUFNX01BWExFTkdUSCAoMjU2ICogMTAyNCkKKyNkZWZpbmUgUERGX1hSRUZTVFJFQU1fTUFYU0laRSAxMDAwMAorCisvLyBUT0RPKG9jaGFuZyk6IE1ha2UgaGVscGVyIGZvciBhcHBlbmRpbmcgIm9iam51bSAwIFIgIi4KKworbmFtZXNwYWNlIHsKKworaW50MzJfdCBQREZfQ3JlYXRvckFwcGVuZE9iamVjdChjb25zdCBDUERGX09iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlKiBwRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUmIG9mZnNldCkgeworICBpbnQzMl90IGxlbiA9IDA7CisgIGlmICghcE9iaikgeworICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKCIgbnVsbCIpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBzd2l0Y2ggKHBPYmotPkdldFR5cGUoKSkgewotICAgICAgICBjYXNlIFBERk9CSl9OVUxMOgotICAgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiBudWxsIikpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9mZnNldCArPSA1OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUERGT0JKX0JPT0xFQU46Ci0gICAgICAgIGNhc2UgUERGT0JKX05VTUJFUjoKLSAgICAgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZyhwT2JqLT5HZXRTdHJpbmcoKSkpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9mZnNldCArPSBsZW4gKyAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUERGT0JKX1NUUklORzogewotICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IHBPYmotPkdldFN0cmluZygpOwotICAgICAgICAgICAgICAgIEZYX0JPT0wgYkhleCA9ICgoQ1BERl9TdHJpbmcqKXBPYmopLT5Jc0hleCgpOwotICAgICAgICAgICAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZyhQREZfRW5jb2RlU3RyaW5nKHN0ciwgYkhleCkpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGVuOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIFBERk9CSl9OQU1FOiB7Ci0gICAgICAgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIi8iKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gcE9iai0+R2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKFBERl9OYW1lRW5jb2RlKHN0cikpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGVuICsgMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOiB7Ci0gICAgICAgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAiKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ1BERl9SZWZlcmVuY2UqIHAgPSAoQ1BERl9SZWZlcmVuY2UqKXBPYmo7Ci0gICAgICAgICAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQocC0+R2V0UmVmT2JqTnVtKCkpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIDAgUiAiKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxlbiArIDY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgUERGT0JKX0FSUkFZOiB7Ci0gICAgICAgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIlsiKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7Ci0gICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcCA9IChDUERGX0FycmF5KilwT2JqOwotICAgICAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwLT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwRWxlbWVudCA9IHAtPkdldEVsZW1lbnQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwRWxlbWVudC0+R2V0T2JqTnVtKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKHBFbGVtZW50LT5HZXRPYmpOdW0oKSkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgMCBSIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsZW4gKyA1OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KHBFbGVtZW50LCBwRmlsZSwgb2Zmc2V0KSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIl0iKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgUERGT0JKX0RJQ1RJT05BUlk6IHsKLSAgICAgICAgICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiPDwiKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDI7Ci0gICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwID0gKENQREZfRGljdGlvbmFyeSopcE9iajsKLSAgICAgICAgICAgICAgICBGWF9QT1NJVElPTiBwb3MgPSBwLT5HZXRTdGFydFBvcygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5OwotICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcFZhbHVlID0gcC0+R2V0TmV4dEVsZW1lbnQocG9zLCBrZXkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiLyIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoUERGX05hbWVFbmNvZGUoa2V5KSkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsZW4gKyAxOwotICAgICAgICAgICAgICAgICAgICBpZiAocFZhbHVlLT5HZXRPYmpOdW0oKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAiKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQocFZhbHVlLT5HZXRPYmpOdW0oKSkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgMCBSIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBsZW4gKyA1OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KHBWYWx1ZSwgcEZpbGUsIG9mZnNldCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCI+PiIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBQREZPQkpfU1RSRUFNOiB7Ci0gICAgICAgICAgICAgICAgQ1BERl9TdHJlYW0qIHAgPSAoQ1BERl9TdHJlYW0qKXBPYmo7Ci0gICAgICAgICAgICAgICAgaWYgKFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KHAtPkdldERpY3QoKSwgcEZpbGUsIG9mZnNldCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoInN0cmVhbVxyXG4iKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDg7Ci0gICAgICAgICAgICAgICAgQ1BERl9TdHJlYW1BY2MgYWNjOwotICAgICAgICAgICAgICAgIGFjYy5Mb2FkQWxsRGF0YShwLCBUUlVFKTsKLSAgICAgICAgICAgICAgICBpZiAocEZpbGUtPkFwcGVuZEJsb2NrKGFjYy5HZXREYXRhKCksIGFjYy5HZXRTaXplKCkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9mZnNldCArPSBhY2MuR2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXHJcbmVuZHN0cmVhbSIpKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxlbjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFTU0VSVChGQUxTRSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9CisgICAgb2Zmc2V0ICs9IDU7CiAgICAgcmV0dXJuIDE7CisgIH0KKyAgc3dpdGNoIChwT2JqLT5HZXRUeXBlKCkpIHsKKyAgICBjYXNlIFBERk9CSl9OVUxMOgorICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoIiBudWxsIikgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIG9mZnNldCArPSA1OworICAgICAgYnJlYWs7CisgICAgY2FzZSBQREZPQkpfQk9PTEVBTjoKKyAgICBjYXNlIFBERk9CSl9OVU1CRVI6CisgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygiICIpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcocE9iai0+R2V0U3RyaW5nKCkpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgb2Zmc2V0ICs9IGxlbiArIDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBERk9CSl9TVFJJTkc6IHsKKyAgICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IHBPYmotPkdldFN0cmluZygpOworICAgICAgRlhfQk9PTCBiSGV4ID0gcE9iai0+QXNTdHJpbmcoKS0+SXNIZXgoKTsKKyAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZyhQREZfRW5jb2RlU3RyaW5nKHN0ciwgYkhleCkpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgb2Zmc2V0ICs9IGxlbjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBERk9CSl9OQU1FOiB7CisgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygiLyIpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBwT2JqLT5HZXRTdHJpbmcoKTsKKyAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZyhQREZfTmFtZUVuY29kZShzdHIpKSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIG9mZnNldCArPSBsZW4gKyAxOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUERGT0JKX1JFRkVSRU5DRTogeworICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoIiAiKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKHBPYmotPkFzUmVmZXJlbmNlKCktPkdldFJlZk9iak51bSgpKSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygiIDAgUiAiKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIG9mZnNldCArPSBsZW4gKyA2OworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUERGT0JKX0FSUkFZOiB7CisgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygiWyIpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBvZmZzZXQgKz0gMTsKKyAgICAgIGNvbnN0IENQREZfQXJyYXkqIHAgPSBwT2JqLT5Bc0FycmF5KCk7CisgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcC0+R2V0Q291bnQoKTsgaSsrKSB7CisgICAgICAgIENQREZfT2JqZWN0KiBwRWxlbWVudCA9IHAtPkdldEVsZW1lbnQoaSk7CisgICAgICAgIGlmIChwRWxlbWVudC0+R2V0T2JqTnVtKCkpIHsKKyAgICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygiICIpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChwRWxlbWVudC0+R2V0T2JqTnVtKCkpKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoIiAwIFIiKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CisgICAgICAgICAgb2Zmc2V0ICs9IGxlbiArIDU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KHBFbGVtZW50LCBwRmlsZSwgb2Zmc2V0KSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKCJdIikgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIG9mZnNldCArPSAxOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUERGT0JKX0RJQ1RJT05BUlk6IHsKKyAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKCI8PCIpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcCA9IHBPYmotPkFzRGljdGlvbmFyeSgpOworICAgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6ICpwKSB7CisgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXkgPSBpdC5maXJzdDsKKyAgICAgICAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IGl0LnNlY29uZDsKKyAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoIi8iKSA8IDApIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKFBERl9OYW1lRW5jb2RlKGtleSkpKSA8IDApIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IGxlbiArIDE7CisgICAgICAgIGlmIChwVmFsdWUtPkdldE9iak51bSgpKSB7CisgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoIiAiKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQocFZhbHVlLT5HZXRPYmpOdW0oKSkpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygiIDAgUiIpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgICBvZmZzZXQgKz0gbGVuICsgNTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoUERGX0NyZWF0b3JBcHBlbmRPYmplY3QocFZhbHVlLCBwRmlsZSwgb2Zmc2V0KSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKCI+PiIpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBERk9CSl9TVFJFQU06IHsKKyAgICAgIGNvbnN0IENQREZfU3RyZWFtKiBwID0gcE9iai0+QXNTdHJlYW0oKTsKKyAgICAgIGlmIChQREZfQ3JlYXRvckFwcGVuZE9iamVjdChwLT5HZXREaWN0KCksIHBGaWxlLCBvZmZzZXQpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygic3RyZWFtXHJcbiIpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBvZmZzZXQgKz0gODsKKyAgICAgIENQREZfU3RyZWFtQWNjIGFjYzsKKyAgICAgIGFjYy5Mb2FkQWxsRGF0YShwLCBUUlVFKTsKKyAgICAgIGlmIChwRmlsZS0+QXBwZW5kQmxvY2soYWNjLkdldERhdGEoKSwgYWNjLkdldFNpemUoKSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIG9mZnNldCArPSBhY2MuR2V0U2l6ZSgpOworICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKCJcclxuZW5kc3RyZWFtIikpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBvZmZzZXQgKz0gbGVuOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBBU1NFUlQoRkFMU0UpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDE7CiB9Ci1GWF9JTlQzMiBQREZfQ3JlYXRvcldyaXRlVHJhaWxlcihDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9GaWxlQnVmZmVyQXJjaGl2ZSogcEZpbGUsIENQREZfQXJyYXkqIHBJREFycmF5LCBGWF9CT09MIGJDb21wcmVzcykKLXsKLSAgICBGWF9GSUxFU0laRSBvZmZzZXQgPSAwOwotICAgIEZYX0lOVDMyIGxlbiA9IDA7Ci0gICAgRlhTWVNfYXNzZXJ0KHBEb2N1bWVudCAmJiBwRmlsZSk7Ci0gICAgQ1BERl9QYXJzZXIgKnBQYXJzZXIgPSAoQ1BERl9QYXJzZXIqKXBEb2N1bWVudC0+R2V0UGFyc2VyKCk7Ci0gICAgaWYgKHBQYXJzZXIpIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwID0gcFBhcnNlci0+R2V0VHJhaWxlcigpOwotICAgICAgICBGWF9QT1NJVElPTiBwb3MgPSBwLT5HZXRTdGFydFBvcygpOwotICAgICAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBrZXk7Ci0gICAgICAgICAgICBDUERGX09iamVjdCogcFZhbHVlID0gcC0+R2V0TmV4dEVsZW1lbnQocG9zLCBrZXkpOwotICAgICAgICAgICAgaWYgKGtleSA9PSBGWF9CU1RSQygiRW5jcnlwdCIpIHx8IGtleSA9PSBGWF9CU1RSQygiU2l6ZSIpIHx8IGtleSA9PSBGWF9CU1RSQygiRmlsdGVyIikgfHwKLSAgICAgICAgICAgICAgICAgICAga2V5ID09IEZYX0JTVFJDKCJJbmRleCIpIHx8IGtleSA9PSBGWF9CU1RSQygiTGVuZ3RoIikgfHwga2V5ID09IEZYX0JTVFJDKCJQcmV2IikgfHwKLSAgICAgICAgICAgICAgICAgICAga2V5ID09IEZYX0JTVFJDKCJXIikgfHwga2V5ID09IEZYX0JTVFJDKCJYUmVmU3RtIikgfHwga2V5ID09IEZYX0JTVFJDKCJUeXBlIikgfHwga2V5ID09IEZYX0JTVFJDKCJJRCIpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYkNvbXByZXNzICYmIGtleSA9PSBGWF9CU1RSQygiRGVjb2RlUGFybXMiKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoKEZYX0JTVFJDKCIvIikpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoUERGX05hbWVFbmNvZGUoa2V5KSkpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9mZnNldCArPSBsZW4gKyAxOwotICAgICAgICAgICAgaWYgKHBWYWx1ZS0+R2V0T2JqTnVtKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiICIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChwVmFsdWUtPkdldE9iak51bSgpKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAwIFIgIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9mZnNldCArPSBsZW4gKyA2OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoUERGX0NyZWF0b3JBcHBlbmRPYmplY3QocFZhbHVlLCBwRmlsZSwgb2Zmc2V0KSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocElEQXJyYXkpIHsKLSAgICAgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKChGWF9CU1RSQygiL0lEIikpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvZmZzZXQgKz0gMzsKLSAgICAgICAgICAgIGlmIChQREZfQ3JlYXRvckFwcGVuZE9iamVjdChwSURBcnJheSwgcEZpbGUsIG9mZnNldCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvZmZzZXQ7Ci0gICAgfQotICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJcclxuL1Jvb3QgIikpIDwgMCkgeworCitpbnQzMl90IFBERl9DcmVhdG9yV3JpdGVUcmFpbGVyKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlKiBwRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcElEQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNvbXByZXNzKSB7CisgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IDA7CisgIGludDMyX3QgbGVuID0gMDsKKyAgRlhTWVNfYXNzZXJ0KHBEb2N1bWVudCAmJiBwRmlsZSk7CisgIENQREZfUGFyc2VyKiBwUGFyc2VyID0gKENQREZfUGFyc2VyKilwRG9jdW1lbnQtPkdldFBhcnNlcigpOworICBpZiAocFBhcnNlcikgeworICAgIENQREZfRGljdGlvbmFyeSogcCA9IHBQYXJzZXItPkdldFRyYWlsZXIoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogKnApIHsKKyAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXkgPSBpdC5maXJzdDsKKyAgICAgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBpdC5zZWNvbmQ7CisgICAgICBpZiAoa2V5ID09ICJFbmNyeXB0IiB8fCBrZXkgPT0gIlNpemUiIHx8IGtleSA9PSAiRmlsdGVyIiB8fAorICAgICAgICAgIGtleSA9PSAiSW5kZXgiIHx8IGtleSA9PSAiTGVuZ3RoIiB8fCBrZXkgPT0gIlByZXYiIHx8IGtleSA9PSAiVyIgfHwKKyAgICAgICAgICBrZXkgPT0gIlhSZWZTdG0iIHx8IGtleSA9PSAiVHlwZSIgfHwga2V5ID09ICJJRCIpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoYkNvbXByZXNzICYmIGtleSA9PSAiRGVjb2RlUGFybXMiKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoKCIvIikpIDwgMCkgewogICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKHBEb2N1bWVudC0+R2V0Um9vdCgpLT5HZXRPYmpOdW0oKSkpIDwgMCkgeworICAgICAgfQorICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKFBERl9OYW1lRW5jb2RlKGtleSkpKSA8IDApIHsKICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIDAgUlxyXG4iKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgb2Zmc2V0ICs9IGxlbiArIDE0OwotICAgIGlmIChwRG9jdW1lbnQtPkdldEluZm8oKSkgewotICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiL0luZm8gIikpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgb2Zmc2V0ICs9IGxlbiArIDE7CisgICAgICBpZiAocFZhbHVlLT5HZXRPYmpOdW0oKSkgeworICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygiICIpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotICAgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChwRG9jdW1lbnQtPkdldEluZm8oKS0+R2V0T2JqTnVtKCkpKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQocFZhbHVlLT5HZXRPYmpOdW0oKSkpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIDAgUlxyXG4iKSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKCIgMCBSICIpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotICAgICAgICBvZmZzZXQgKz0gbGVuICsgMTI7CisgICAgICAgIG9mZnNldCArPSBsZW4gKyA2OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KHBWYWx1ZSwgcEZpbGUsIG9mZnNldCkgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICB9CiAgICAgfQogICAgIGlmIChwSURBcnJheSkgewotICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygoRlhfQlNUUkMoIi9JRCIpKSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0ICs9IDM7Ci0gICAgICAgIGlmIChQREZfQ3JlYXRvckFwcGVuZE9iamVjdChwSURBcnJheSwgcEZpbGUsIG9mZnNldCkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KKyAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKCgiL0lEIikpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBvZmZzZXQgKz0gMzsKKyAgICAgIGlmIChQREZfQ3JlYXRvckFwcGVuZE9iamVjdChwSURBcnJheSwgcEZpbGUsIG9mZnNldCkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIG9mZnNldDsKKyAgfQorICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygiXHJcbi9Sb290ICIpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChwRG9jdW1lbnQtPkdldFJvb3QoKS0+R2V0T2JqTnVtKCkpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoIiAwIFJcclxuIikgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIG9mZnNldCArPSBsZW4gKyAxNDsKKyAgaWYgKHBEb2N1bWVudC0+R2V0SW5mbygpKSB7CisgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoIi9JbmZvICIpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChwRG9jdW1lbnQtPkdldEluZm8oKS0+R2V0T2JqTnVtKCkpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoIiAwIFJcclxuIikgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG9mZnNldCArPSBsZW4gKyAxMjsKKyAgfQorICBpZiAocElEQXJyYXkpIHsKKyAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygoIi9JRCIpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgb2Zmc2V0ICs9IDM7CisgICAgaWYgKFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KHBJREFycmF5LCBwRmlsZSwgb2Zmc2V0KSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG9mZnNldDsKIH0KLUZYX0lOVDMyIFBERl9DcmVhdG9yV3JpdGVFbmNyeXB0KGNvbnN0IENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBGWF9EV09SRCBkd09iak51bSwgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlICpwRmlsZSkKLXsKLSAgICBpZiAoIXBFbmNyeXB0RGljdCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgRlhTWVNfYXNzZXJ0KHBGaWxlKTsKLSAgICBGWF9GSUxFU0laRSBvZmZzZXQgPSAwOwotICAgIEZYX0lOVDMyIGxlbiA9IDA7Ci0gICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIi9FbmNyeXB0IikpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIG9mZnNldCArPSA4OwotICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKGR3T2JqTnVtKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAwIFIgIikpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIG9mZnNldCArPSBsZW4gKyA2OwotICAgIHJldHVybiBvZmZzZXQ7CisKK2ludDMyX3QgUERGX0NyZWF0b3JXcml0ZUVuY3J5cHQoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3T2JqTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRmlsZUJ1ZmZlckFyY2hpdmUqIHBGaWxlKSB7CisgIGlmICghcEVuY3J5cHREaWN0KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgRlhTWVNfYXNzZXJ0KHBGaWxlKTsKKyAgRlhfRklMRVNJWkUgb2Zmc2V0ID0gMDsKKyAgaW50MzJfdCBsZW4gPSAwOworICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygiL0VuY3J5cHQiKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgb2Zmc2V0ICs9IDg7CisgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKCIgIikgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKGR3T2JqTnVtKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKCIgMCBSICIpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBvZmZzZXQgKz0gbGVuICsgNjsKKyAgcmV0dXJuIG9mZnNldDsKIH0KLUZYX0JPT0wgUERGX0dlbmVyYXRlRmlsZUlEKEZYX0RXT1JEIGR3U2VlZDEsIEZYX0RXT1JEIGR3U2VlZDIsIEZYX0xQRFdPUkQgcEJ1ZmZlcikKLXsKLSAgICBpZiAoIXBCdWZmZXIpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9MUFZPSUQgcENvbnRleHQgPSBGWF9SYW5kb21fTVRfU3RhcnQoZHdTZWVkMSk7Ci0gICAgRlhfSU5UMzIgaSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgICAqcEJ1ZmZlcisrID0gRlhfUmFuZG9tX01UX0dlbmVyYXRlKHBDb250ZXh0KTsKLSAgICB9Ci0gICAgRlhfUmFuZG9tX01UX0Nsb3NlKHBDb250ZXh0KTsKLSAgICBwQ29udGV4dCA9IEZYX1JhbmRvbV9NVF9TdGFydChkd1NlZWQyKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0gICAgICAgICpwQnVmZmVyKysgPSBGWF9SYW5kb21fTVRfR2VuZXJhdGUocENvbnRleHQpOwotICAgIH0KLSAgICBGWF9SYW5kb21fTVRfQ2xvc2UocENvbnRleHQpOwotICAgIHJldHVybiBUUlVFOworCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBQREZfR2VuZXJhdGVGaWxlSUQoRlhfRFdPUkQgZHdTZWVkMSwgRlhfRFdPUkQgZHdTZWVkMikgeworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXIoc2l6ZW9mKEZYX0RXT1JEKSAqIDQpOworICBGWF9EV09SRCogcEJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8RlhfRFdPUkQqPihidWZmZXIuZGF0YSgpKTsKKyAgdm9pZCogcENvbnRleHQgPSBGWF9SYW5kb21fTVRfU3RhcnQoZHdTZWVkMSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKQorICAgICpwQnVmZmVyKysgPSBGWF9SYW5kb21fTVRfR2VuZXJhdGUocENvbnRleHQpOworICBGWF9SYW5kb21fTVRfQ2xvc2UocENvbnRleHQpOworICBwQ29udGV4dCA9IEZYX1JhbmRvbV9NVF9TdGFydChkd1NlZWQyKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpCisgICAgKnBCdWZmZXIrKyA9IEZYX1JhbmRvbV9NVF9HZW5lcmF0ZShwQ29udGV4dCk7CisgIEZYX1JhbmRvbV9NVF9DbG9zZShwQ29udGV4dCk7CisgIHJldHVybiBidWZmZXI7CiB9Ci1jbGFzcyBDUERGX0ZsYXRlRW5jb2RlcgotewotcHVibGljOgotICAgIENQREZfRmxhdGVFbmNvZGVyKCk7Ci0gICAgfkNQREZfRmxhdGVFbmNvZGVyKCk7Ci0gICAgRlhfQk9PTAkJSW5pdGlhbGl6ZShDUERGX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiRmxhdGVFbmNvZGUpOwotICAgIEZYX0JPT0wJCUluaXRpYWxpemUoRlhfTFBDQllURSBwQnVmZmVyLCBGWF9EV09SRCBzaXplLCBGWF9CT09MIGJGbGF0ZUVuY29kZSwgRlhfQk9PTCBiWFJlZlN0cmVhbSA9IEZBTFNFKTsKLSAgICB2b2lkCQlDbG9uZURpY3QoKTsKLSAgICBGWF9MUEJZVEUJCQltX3BEYXRhOwotICAgIEZYX0RXT1JECQkJbV9kd1NpemU7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KgltX3BEaWN0OwotICAgIEZYX0JPT0wJCQkJbV9iQ2xvbmVkOwotICAgIEZYX0JPT0wJCQkJbV9iTmV3RGF0YTsKLSAgICBDUERGX1N0cmVhbUFjYwkJbV9BY2M7CisKK3ZvaWQgQXBwZW5kSW5kZXgwKENGWF9CeXRlVGV4dEJ1ZiYgYnVmZmVyLCBib29sIGJGaXJzdE9iamVjdCkgeworICBidWZmZXIuQXBwZW5kQnl0ZSgwKTsKKyAgYnVmZmVyLkFwcGVuZEJ5dGUoMCk7CisgIGJ1ZmZlci5BcHBlbmRCeXRlKDApOworICBidWZmZXIuQXBwZW5kQnl0ZSgwKTsKKyAgYnVmZmVyLkFwcGVuZEJ5dGUoMCk7CisgIGNvbnN0IHVpbnQ4X3QgYnl0ZSA9IGJGaXJzdE9iamVjdCA/IDB4RkYgOiAwOworICBidWZmZXIuQXBwZW5kQnl0ZShieXRlKTsKKyAgYnVmZmVyLkFwcGVuZEJ5dGUoYnl0ZSk7Cit9CisKK3ZvaWQgQXBwZW5kSW5kZXgxKENGWF9CeXRlVGV4dEJ1ZiYgYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQpIHsKKyAgYnVmZmVyLkFwcGVuZEJ5dGUoMSk7CisgIGJ1ZmZlci5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQyNChvZmZzZXQpKTsKKyAgYnVmZmVyLkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDE2KG9mZnNldCkpOworICBidWZmZXIuQXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUOChvZmZzZXQpKTsKKyAgYnVmZmVyLkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDAob2Zmc2V0KSk7CisgIGJ1ZmZlci5BcHBlbmRCeXRlKDApOworICBidWZmZXIuQXBwZW5kQnl0ZSgwKTsKK30KKwordm9pZCBBcHBlbmRJbmRleDIoQ0ZYX0J5dGVUZXh0QnVmJiBidWZmZXIsIEZYX0RXT1JEIG9iam51bSwgaW50MzJfdCBpbmRleCkgeworICBidWZmZXIuQXBwZW5kQnl0ZSgyKTsKKyAgYnVmZmVyLkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDI0KG9iam51bSkpOworICBidWZmZXIuQXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUMTYob2JqbnVtKSk7CisgIGJ1ZmZlci5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQ4KG9iam51bSkpOworICBidWZmZXIuQXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUMChvYmpudW0pKTsKKyAgYnVmZmVyLkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDgoaW5kZXgpKTsKKyAgYnVmZmVyLkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDAoaW5kZXgpKTsKK30KKworYm9vbCBJc1hSZWZOZWVkRW5kKENQREZfWFJlZlN0cmVhbSogcFhSZWYsIEZYX0RXT1JEIGZsYWcpIHsKKyAgaWYgKCEoZmxhZyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpbnQzMl90IGlTaXplID0gcFhSZWYtPm1fSW5kZXhBcnJheS5HZXRTaXplKCkgLyAyOworICBpbnQzMl90IGlDb3VudCA9IDA7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTaXplOyArK2kpCisgICAgaUNvdW50ICs9IHBYUmVmLT5tX0luZGV4QXJyYXkuRWxlbWVudEF0KGkgKiAyICsgMSk7CisgIHJldHVybiBpQ291bnQgPj0gUERGX1hSRUZTVFJFQU1fTUFYU0laRTsKK30KKworaW50MzJfdCBPdXRwdXRJbmRleChDRlhfRmlsZUJ1ZmZlckFyY2hpdmUqIHBGaWxlLCBGWF9GSUxFU0laRSBvZmZzZXQpIHsKKyAgaWYgKHNpemVvZihvZmZzZXQpID4gNCkgeworICAgIGlmIChGWF9HRVRCWVRFT0ZGU0VUMzIob2Zmc2V0KSkgeworICAgICAgaWYgKHBGaWxlLT5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQ1NihvZmZzZXQpKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGlmIChwRmlsZS0+QXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUNDgob2Zmc2V0KSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICBpZiAocEZpbGUtPkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDQwKG9mZnNldCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgaWYgKHBGaWxlLT5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQzMihvZmZzZXQpKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgaWYgKHBGaWxlLT5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQyNChvZmZzZXQpKSA8IDApCisgICAgcmV0dXJuIC0xOworICBpZiAocEZpbGUtPkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDE2KG9mZnNldCkpIDwgMCkKKyAgICByZXR1cm4gLTE7CisgIGlmIChwRmlsZS0+QXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUOChvZmZzZXQpKSA8IDApCisgICAgcmV0dXJuIC0xOworICBpZiAocEZpbGUtPkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDAob2Zmc2V0KSkgPCAwKQorICAgIHJldHVybiAtMTsKKyAgaWYgKHBGaWxlLT5BcHBlbmRCeXRlKDApIDwgMCkKKyAgICByZXR1cm4gLTE7CisgIHJldHVybiAwOworfQorCitjbGFzcyBDUERGX0ZsYXRlRW5jb2RlciB7CisgcHVibGljOgorICBDUERGX0ZsYXRlRW5jb2RlcigpOworICB+Q1BERl9GbGF0ZUVuY29kZXIoKTsKKyAgRlhfQk9PTCBJbml0aWFsaXplKENQREZfU3RyZWFtKiBwU3RyZWFtLCBGWF9CT09MIGJGbGF0ZUVuY29kZSk7CisgIEZYX0JPT0wgSW5pdGlhbGl6ZShjb25zdCB1aW50OF90KiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZsYXRlRW5jb2RlLAorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiWFJlZlN0cmVhbSA9IEZBTFNFKTsKKyAgdm9pZCBDbG9uZURpY3QoKTsKKyAgdWludDhfdCogbV9wRGF0YTsKKyAgRlhfRFdPUkQgbV9kd1NpemU7CisgIENQREZfRGljdGlvbmFyeSogbV9wRGljdDsKKyAgRlhfQk9PTCBtX2JDbG9uZWQ7CisgIEZYX0JPT0wgbV9iTmV3RGF0YTsKKyAgQ1BERl9TdHJlYW1BY2MgbV9BY2M7CiB9OwotQ1BERl9GbGF0ZUVuY29kZXI6OkNQREZfRmxhdGVFbmNvZGVyKCkKLXsKLSAgICBtX3BEYXRhID0gTlVMTDsKLSAgICBtX2R3U2l6ZSA9IDA7Ci0gICAgbV9wRGljdCA9IE5VTEw7Ci0gICAgbV9iQ2xvbmVkID0gRkFMU0U7Ci0gICAgbV9iTmV3RGF0YSA9IEZBTFNFOworQ1BERl9GbGF0ZUVuY29kZXI6OkNQREZfRmxhdGVFbmNvZGVyKCkgeworICBtX3BEYXRhID0gTlVMTDsKKyAgbV9kd1NpemUgPSAwOworICBtX3BEaWN0ID0gTlVMTDsKKyAgbV9iQ2xvbmVkID0gRkFMU0U7CisgIG1fYk5ld0RhdGEgPSBGQUxTRTsKIH0KLXZvaWQgQ1BERl9GbGF0ZUVuY29kZXI6OkNsb25lRGljdCgpCi17Ci0gICAgaWYgKCFtX2JDbG9uZWQpIHsKLSAgICAgICAgbV9wRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKW1fcERpY3QtPkNsb25lKCk7Ci0gICAgICAgIG1fYkNsb25lZCA9IFRSVUU7Ci0gICAgfQotfQotRlhfQk9PTCBDUERGX0ZsYXRlRW5jb2Rlcjo6SW5pdGlhbGl6ZShDUERGX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiRmxhdGVFbmNvZGUpCi17Ci0gICAgbV9BY2MuTG9hZEFsbERhdGEocFN0cmVhbSwgVFJVRSk7Ci0gICAgaWYgKChwU3RyZWFtICYmIHBTdHJlYW0tPkdldERpY3QoKSAmJiBwU3RyZWFtLT5HZXREaWN0KCktPktleUV4aXN0KCJGaWx0ZXIiKSkgfHwgIWJGbGF0ZUVuY29kZSkgewotICAgICAgICBpZiAocFN0cmVhbS0+R2V0RGljdCgpLT5LZXlFeGlzdCgiRmlsdGVyIikgJiYgIWJGbGF0ZUVuY29kZSkgewotICAgICAgICAgICAgQ1BERl9TdHJlYW1BY2MgZGVzdEFjYzsKLSAgICAgICAgICAgIGRlc3RBY2MuTG9hZEFsbERhdGEocFN0cmVhbSk7Ci0gICAgICAgICAgICBtX2R3U2l6ZSA9IGRlc3RBY2MuR2V0U2l6ZSgpOwotICAgICAgICAgICAgbV9wRGF0YSA9IChGWF9MUEJZVEUpZGVzdEFjYy5EZXRhY2hEYXRhKCk7Ci0gICAgICAgICAgICBtX3BEaWN0ID0gKENQREZfRGljdGlvbmFyeSopcFN0cmVhbS0+R2V0RGljdCgpLT5DbG9uZSgpOwotICAgICAgICAgICAgbV9wRGljdC0+UmVtb3ZlQXQoRlhfQlNUUkMoIkZpbHRlciIpKTsKLSAgICAgICAgICAgIG1fYk5ld0RhdGEgPSBUUlVFOwotICAgICAgICAgICAgbV9iQ2xvbmVkID0gVFJVRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fcERhdGEgPSAoRlhfTFBCWVRFKW1fQWNjLkdldERhdGEoKTsKLSAgICAgICAgICAgIG1fZHdTaXplID0gbV9BY2MuR2V0U2l6ZSgpOwotICAgICAgICAgICAgbV9wRGljdCA9IHBTdHJlYW0tPkdldERpY3QoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgbV9wRGF0YSA9IE5VTEw7Ci0gICAgbV9kd1NpemUgPSAwOwotICAgIG1fYk5ld0RhdGEgPSBUUlVFOwordm9pZCBDUERGX0ZsYXRlRW5jb2Rlcjo6Q2xvbmVEaWN0KCkgeworICBpZiAoIW1fYkNsb25lZCkgeworICAgIG1fcERpY3QgPSBUb0RpY3Rpb25hcnkobV9wRGljdC0+Q2xvbmUoKSk7CisgICAgQVNTRVJUKG1fcERpY3QpOwogICAgIG1fYkNsb25lZCA9IFRSVUU7Ci0gICAgOjpGbGF0ZUVuY29kZShtX0FjYy5HZXREYXRhKCksIG1fQWNjLkdldFNpemUoKSwgbV9wRGF0YSwgbV9kd1NpemUpOwotICAgIG1fcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwU3RyZWFtLT5HZXREaWN0KCktPkNsb25lKCk7Ci0gICAgbV9wRGljdC0+U2V0QXRJbnRlZ2VyKCJMZW5ndGgiLCBtX2R3U2l6ZSk7Ci0gICAgbV9wRGljdC0+U2V0QXROYW1lKCJGaWx0ZXIiLCAiRmxhdGVEZWNvZGUiKTsKLSAgICBtX3BEaWN0LT5SZW1vdmVBdCgiRGVjb2RlUGFybXMiKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgfQogfQotRlhfQk9PTCBDUERGX0ZsYXRlRW5jb2Rlcjo6SW5pdGlhbGl6ZShGWF9MUENCWVRFIHBCdWZmZXIsIEZYX0RXT1JEIHNpemUsIEZYX0JPT0wgYkZsYXRlRW5jb2RlLCBGWF9CT09MIGJYUmVmU3RyZWFtKQotewotICAgIGlmICghYkZsYXRlRW5jb2RlKSB7Ci0gICAgICAgIG1fcERhdGEgPSAoRlhfTFBCWVRFKXBCdWZmZXI7Ci0gICAgICAgIG1fZHdTaXplID0gc2l6ZTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIG1fYk5ld0RhdGEgPSBUUlVFOwotICAgIGlmIChiWFJlZlN0cmVhbSkgewotICAgICAgICA6OkZsYXRlRW5jb2RlKHBCdWZmZXIsIHNpemUsIDEyLCAxLCA4LCA3LCBtX3BEYXRhLCBtX2R3U2l6ZSk7CitGWF9CT09MIENQREZfRmxhdGVFbmNvZGVyOjpJbml0aWFsaXplKENQREZfU3RyZWFtKiBwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGbGF0ZUVuY29kZSkgeworICBtX0FjYy5Mb2FkQWxsRGF0YShwU3RyZWFtLCBUUlVFKTsKKyAgaWYgKChwU3RyZWFtICYmIHBTdHJlYW0tPkdldERpY3QoKSAmJgorICAgICAgIHBTdHJlYW0tPkdldERpY3QoKS0+S2V5RXhpc3QoIkZpbHRlciIpKSB8fAorICAgICAgIWJGbGF0ZUVuY29kZSkgeworICAgIGlmIChwU3RyZWFtLT5HZXREaWN0KCktPktleUV4aXN0KCJGaWx0ZXIiKSAmJiAhYkZsYXRlRW5jb2RlKSB7CisgICAgICBDUERGX1N0cmVhbUFjYyBkZXN0QWNjOworICAgICAgZGVzdEFjYy5Mb2FkQWxsRGF0YShwU3RyZWFtKTsKKyAgICAgIG1fZHdTaXplID0gZGVzdEFjYy5HZXRTaXplKCk7CisgICAgICBtX3BEYXRhID0gKHVpbnQ4X3QqKWRlc3RBY2MuRGV0YWNoRGF0YSgpOworICAgICAgbV9wRGljdCA9IFRvRGljdGlvbmFyeShwU3RyZWFtLT5HZXREaWN0KCktPkNsb25lKCkpOworICAgICAgbV9wRGljdC0+UmVtb3ZlQXQoIkZpbHRlciIpOworICAgICAgbV9iTmV3RGF0YSA9IFRSVUU7CisgICAgICBtX2JDbG9uZWQgPSBUUlVFOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIDo6RmxhdGVFbmNvZGUocEJ1ZmZlciwgc2l6ZSwgbV9wRGF0YSwgbV9kd1NpemUpOworICAgICAgbV9wRGF0YSA9ICh1aW50OF90KiltX0FjYy5HZXREYXRhKCk7CisgICAgICBtX2R3U2l6ZSA9IG1fQWNjLkdldFNpemUoKTsKKyAgICAgIG1fcERpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7CiAgICAgfQogICAgIHJldHVybiBUUlVFOworICB9CisgIG1fcERhdGEgPSBOVUxMOworICBtX2R3U2l6ZSA9IDA7CisgIG1fYk5ld0RhdGEgPSBUUlVFOworICBtX2JDbG9uZWQgPSBUUlVFOworICA6OkZsYXRlRW5jb2RlKG1fQWNjLkdldERhdGEoKSwgbV9BY2MuR2V0U2l6ZSgpLCBtX3BEYXRhLCBtX2R3U2l6ZSk7CisgIG1fcERpY3QgPSBUb0RpY3Rpb25hcnkocFN0cmVhbS0+R2V0RGljdCgpLT5DbG9uZSgpKTsKKyAgbV9wRGljdC0+U2V0QXRJbnRlZ2VyKCJMZW5ndGgiLCBtX2R3U2l6ZSk7CisgIG1fcERpY3QtPlNldEF0TmFtZSgiRmlsdGVyIiwgIkZsYXRlRGVjb2RlIik7CisgIG1fcERpY3QtPlJlbW92ZUF0KCJEZWNvZGVQYXJtcyIpOworICByZXR1cm4gVFJVRTsKIH0KLUNQREZfRmxhdGVFbmNvZGVyOjp+Q1BERl9GbGF0ZUVuY29kZXIoKQotewotICAgIGlmIChtX2JDbG9uZWQgJiYgbV9wRGljdCkgewotICAgICAgICBtX3BEaWN0LT5SZWxlYXNlKCk7Ci0gICAgfQotICAgIGlmIChtX2JOZXdEYXRhICYmIG1fcERhdGEpIHsKLSAgICAgICAgRlhfRnJlZShtX3BEYXRhKTsKLSAgICB9CitGWF9CT09MIENQREZfRmxhdGVFbmNvZGVyOjpJbml0aWFsaXplKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZsYXRlRW5jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJYUmVmU3RyZWFtKSB7CisgIGlmICghYkZsYXRlRW5jb2RlKSB7CisgICAgbV9wRGF0YSA9ICh1aW50OF90KilwQnVmZmVyOworICAgIG1fZHdTaXplID0gc2l6ZTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBtX2JOZXdEYXRhID0gVFJVRTsKKyAgaWYgKGJYUmVmU3RyZWFtKSB7CisgICAgOjpGbGF0ZUVuY29kZShwQnVmZmVyLCBzaXplLCAxMiwgMSwgOCwgNywgbV9wRGF0YSwgbV9kd1NpemUpOworICB9IGVsc2UgeworICAgIDo6RmxhdGVFbmNvZGUocEJ1ZmZlciwgc2l6ZSwgbV9wRGF0YSwgbV9kd1NpemUpOworICB9CisgIHJldHVybiBUUlVFOwogfQotY2xhc3MgQ1BERl9FbmNyeXB0b3IKLXsKLXB1YmxpYzoKLSAgICBDUERGX0VuY3J5cHRvcigpOwotICAgIH5DUERGX0VuY3J5cHRvcigpOwotICAgIEZYX0JPT0wJCUluaXRpYWxpemUoQ1BERl9DcnlwdG9IYW5kbGVyKiBwSGFuZGxlciwgaW50IG9iam51bSwgRlhfTFBCWVRFIHNyY19kYXRhLCBGWF9EV09SRCBzcmNfc2l6ZSk7Ci0gICAgRlhfTFBCWVRFCQkJbV9wRGF0YTsKLSAgICBGWF9EV09SRAkJCW1fZHdTaXplOwotICAgIEZYX0JPT0wJCQkJbV9iTmV3QnVmOworQ1BERl9GbGF0ZUVuY29kZXI6On5DUERGX0ZsYXRlRW5jb2RlcigpIHsKKyAgaWYgKG1fYkNsb25lZCAmJiBtX3BEaWN0KSB7CisgICAgbV9wRGljdC0+UmVsZWFzZSgpOworICB9CisgIGlmIChtX2JOZXdEYXRhKSB7CisgICAgRlhfRnJlZShtX3BEYXRhKTsKKyAgfQorfQorY2xhc3MgQ1BERl9FbmNyeXB0b3IgeworIHB1YmxpYzoKKyAgQ1BERl9FbmNyeXB0b3IoKTsKKyAgfkNQREZfRW5jcnlwdG9yKCk7CisgIEZYX0JPT0wgSW5pdGlhbGl6ZShDUERGX0NyeXB0b0hhbmRsZXIqIHBIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgaW50IG9iam51bSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUpOworICB1aW50OF90KiBtX3BEYXRhOworICBGWF9EV09SRCBtX2R3U2l6ZTsKKyAgRlhfQk9PTCBtX2JOZXdCdWY7CiB9OwotQ1BERl9FbmNyeXB0b3I6OkNQREZfRW5jcnlwdG9yKCkKLXsKLSAgICBtX3BEYXRhID0gTlVMTDsKLSAgICBtX2R3U2l6ZSA9IDA7CitDUERGX0VuY3J5cHRvcjo6Q1BERl9FbmNyeXB0b3IoKSB7CisgIG1fcERhdGEgPSBOVUxMOworICBtX2R3U2l6ZSA9IDA7CisgIG1fYk5ld0J1ZiA9IEZBTFNFOworfQorRlhfQk9PTCBDUERGX0VuY3J5cHRvcjo6SW5pdGlhbGl6ZShDUERGX0NyeXB0b0hhbmRsZXIqIHBIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUpIHsKKyAgaWYgKHNyY19zaXplID09IDApIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoIXBIYW5kbGVyKSB7CisgICAgbV9wRGF0YSA9ICh1aW50OF90KilzcmNfZGF0YTsKKyAgICBtX2R3U2l6ZSA9IHNyY19zaXplOwogICAgIG1fYk5ld0J1ZiA9IEZBTFNFOwotfQotRlhfQk9PTCBDUERGX0VuY3J5cHRvcjo6SW5pdGlhbGl6ZShDUERGX0NyeXB0b0hhbmRsZXIqIHBIYW5kbGVyLCBpbnQgb2JqbnVtLCBGWF9MUEJZVEUgc3JjX2RhdGEsIEZYX0RXT1JEIHNyY19zaXplKQotewotICAgIGlmIChzcmNfc2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAocEhhbmRsZXIgPT0gTlVMTCkgewotICAgICAgICBtX3BEYXRhID0gKEZYX0xQQllURSlzcmNfZGF0YTsKLSAgICAgICAgbV9kd1NpemUgPSBzcmNfc2l6ZTsKLSAgICAgICAgbV9iTmV3QnVmID0gRkFMU0U7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBtX2R3U2l6ZSA9IHBIYW5kbGVyLT5FbmNyeXB0R2V0U2l6ZShvYmpudW0sIDAsIHNyY19kYXRhLCBzcmNfc2l6ZSk7Ci0gICAgbV9wRGF0YSA9IEZYX0FsbG9jKEZYX0JZVEUsIG1fZHdTaXplKTsKLSAgICBwSGFuZGxlci0+RW5jcnlwdENvbnRlbnQob2JqbnVtLCAwLCBzcmNfZGF0YSwgc3JjX3NpemUsIG1fcERhdGEsIG1fZHdTaXplKTsKLSAgICBtX2JOZXdCdWYgPSBUUlVFOwogICAgIHJldHVybiBUUlVFOworICB9CisgIG1fZHdTaXplID0gcEhhbmRsZXItPkVuY3J5cHRHZXRTaXplKG9iam51bSwgMCwgc3JjX2RhdGEsIHNyY19zaXplKTsKKyAgbV9wRGF0YSA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fZHdTaXplKTsKKyAgcEhhbmRsZXItPkVuY3J5cHRDb250ZW50KG9iam51bSwgMCwgc3JjX2RhdGEsIHNyY19zaXplLCBtX3BEYXRhLCBtX2R3U2l6ZSk7CisgIG1fYk5ld0J1ZiA9IFRSVUU7CisgIHJldHVybiBUUlVFOwogfQotQ1BERl9FbmNyeXB0b3I6On5DUERGX0VuY3J5cHRvcigpCi17Ci0gICAgaWYgKG1fYk5ld0J1ZikgewotICAgICAgICBGWF9GcmVlKG1fcERhdGEpOwotICAgIH0KK0NQREZfRW5jcnlwdG9yOjp+Q1BERl9FbmNyeXB0b3IoKSB7CisgIGlmIChtX2JOZXdCdWYpIHsKKyAgICBGWF9GcmVlKG1fcERhdGEpOworICB9CiB9Ci1DUERGX09iamVjdFN0cmVhbTo6Q1BERl9PYmplY3RTdHJlYW0oKQotICAgIDogbV9kd09iak51bSgwKQotICAgICwgbV9pbmRleCgwKQoteworCit9ICAvLyBuYW1lc3BhY2UKKworQ1BERl9PYmplY3RTdHJlYW06OkNQREZfT2JqZWN0U3RyZWFtKCkgOiBtX2R3T2JqTnVtKDApLCBtX2luZGV4KDApIHt9CitGWF9CT09MIENQREZfT2JqZWN0U3RyZWFtOjpTdGFydCgpIHsKKyAgbV9PYmpOdW1BcnJheS5SZW1vdmVBbGwoKTsKKyAgbV9PZmZzZXRBcnJheS5SZW1vdmVBbGwoKTsKKyAgbV9CdWZmZXIuQ2xlYXIoKTsKKyAgbV9kd09iak51bSA9IDA7CisgIG1faW5kZXggPSAwOworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ1BERl9PYmplY3RTdHJlYW06OlN0YXJ0KCkKLXsKLSAgICBtX09iak51bUFycmF5LlJlbW92ZUFsbCgpOwotICAgIG1fT2Zmc2V0QXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgbV9CdWZmZXIuQ2xlYXIoKTsKLSAgICBtX2R3T2JqTnVtID0gMDsKLSAgICBtX2luZGV4ID0gMDsKLSAgICByZXR1cm4gVFJVRTsKK2ludDMyX3QgQ1BERl9PYmplY3RTdHJlYW06OkNvbXByZXNzSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgZHdPYmpOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfT2JqZWN0KiBwT2JqKSB7CisgIG1fT2JqTnVtQXJyYXkuQWRkKGR3T2JqTnVtKTsKKyAgbV9PZmZzZXRBcnJheS5BZGQobV9CdWZmZXIuR2V0TGVuZ3RoKCkpOworICBtX0J1ZmZlciA8PCBwT2JqOworICByZXR1cm4gMTsKIH0KLUZYX0lOVDMyIENQREZfT2JqZWN0U3RyZWFtOjpDb21wcmVzc0luZGlyZWN0T2JqZWN0KEZYX0RXT1JEIGR3T2JqTnVtLCBjb25zdCBDUERGX09iamVjdCAqcE9iaikKLXsKLSAgICBtX09iak51bUFycmF5LkFkZChkd09iak51bSk7Ci0gICAgbV9PZmZzZXRBcnJheS5BZGQobV9CdWZmZXIuR2V0TGVuZ3RoKCkpOwotICAgIG1fQnVmZmVyIDw8IHBPYmo7Ci0gICAgcmV0dXJuIDE7CitpbnQzMl90IENQREZfT2JqZWN0U3RyZWFtOjpDb21wcmVzc0luZGlyZWN0T2JqZWN0KEZYX0RXT1JEIGR3T2JqTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1NpemUpIHsKKyAgbV9PYmpOdW1BcnJheS5BZGQoZHdPYmpOdW0pOworICBtX09mZnNldEFycmF5LkFkZChtX0J1ZmZlci5HZXRMZW5ndGgoKSk7CisgIG1fQnVmZmVyLkFwcGVuZEJsb2NrKHBCdWZmZXIsIGR3U2l6ZSk7CisgIHJldHVybiAxOwogfQotRlhfSU5UMzIgQ1BERl9PYmplY3RTdHJlYW06OkNvbXByZXNzSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgZHdPYmpOdW0sIEZYX0xQQ0JZVEUgcEJ1ZmZlciwgRlhfRFdPUkQgZHdTaXplKQotewotICAgIG1fT2JqTnVtQXJyYXkuQWRkKGR3T2JqTnVtKTsKLSAgICBtX09mZnNldEFycmF5LkFkZChtX0J1ZmZlci5HZXRMZW5ndGgoKSk7Ci0gICAgbV9CdWZmZXIuQXBwZW5kQmxvY2socEJ1ZmZlciwgZHdTaXplKTsKLSAgICByZXR1cm4gMTsKLX0KLUZYX0ZJTEVTSVpFIENQREZfT2JqZWN0U3RyZWFtOjpFbmQoQ1BERl9DcmVhdG9yKiBwQ3JlYXRvcikKLXsKLSAgICBGWFNZU19hc3NlcnQocENyZWF0b3IpOwotICAgIGlmIChtX09iak51bUFycmF5LkdldFNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBDRlhfRmlsZUJ1ZmZlckFyY2hpdmUgKnBGaWxlID0gJnBDcmVhdG9yLT5tX0ZpbGU7Ci0gICAgQ1BERl9DcnlwdG9IYW5kbGVyICpwSGFuZGxlciA9IHBDcmVhdG9yLT5tX3BDcnlwdG9IYW5kbGVyOwotICAgIEZYX0ZJTEVTSVpFIE9iak9mZnNldCA9IHBDcmVhdG9yLT5tX09mZnNldDsKLSAgICBpZiAoIW1fZHdPYmpOdW0pIHsKLSAgICAgICAgbV9kd09iak51bSA9ICsrcENyZWF0b3ItPm1fZHdMYXN0T2JqTnVtOwotICAgIH0KLSAgICBDRlhfQnl0ZVRleHRCdWYgdGVtcEJ1ZmZlcjsKLSAgICBGWF9JTlQzMiBpQ291bnQgPSBtX09iak51bUFycmF5LkdldFNpemUoKTsKLSAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKLSAgICAgICAgdGVtcEJ1ZmZlciA8PCBtX09iak51bUFycmF5LkVsZW1lbnRBdChpKSA8PCBGWF9CU1RSQygiICIpIDw8IG1fT2Zmc2V0QXJyYXkuRWxlbWVudEF0KGkpIDw8IEZYX0JTVFJDKCIgIik7Ci0gICAgfQotICAgIEZYX0ZJTEVTSVpFICZvZmZzZXQgPSBwQ3JlYXRvci0+bV9PZmZzZXQ7Ci0gICAgRlhfSU5UMzIgbGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKG1fZHdPYmpOdW0pOwotICAgIGlmIChsZW4gPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKK0ZYX0ZJTEVTSVpFIENQREZfT2JqZWN0U3RyZWFtOjpFbmQoQ1BERl9DcmVhdG9yKiBwQ3JlYXRvcikgeworICBGWFNZU19hc3NlcnQocENyZWF0b3IpOworICBpZiAobV9PYmpOdW1BcnJheS5HZXRTaXplKCkgPT0gMCkgeworICAgIHJldHVybiAwOworICB9CisgIENGWF9GaWxlQnVmZmVyQXJjaGl2ZSogcEZpbGUgPSAmcENyZWF0b3ItPm1fRmlsZTsKKyAgQ1BERl9DcnlwdG9IYW5kbGVyKiBwSGFuZGxlciA9IHBDcmVhdG9yLT5tX3BDcnlwdG9IYW5kbGVyOworICBGWF9GSUxFU0laRSBPYmpPZmZzZXQgPSBwQ3JlYXRvci0+bV9PZmZzZXQ7CisgIGlmICghbV9kd09iak51bSkgeworICAgIG1fZHdPYmpOdW0gPSArK3BDcmVhdG9yLT5tX2R3TGFzdE9iak51bTsKKyAgfQorICBDRlhfQnl0ZVRleHRCdWYgdGVtcEJ1ZmZlcjsKKyAgaW50MzJfdCBpQ291bnQgPSBtX09iak51bUFycmF5LkdldFNpemUoKTsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKKyAgICB0ZW1wQnVmZmVyIDw8IG1fT2JqTnVtQXJyYXkuRWxlbWVudEF0KGkpIDw8ICIgIgorICAgICAgICAgICAgICAgPDwgbV9PZmZzZXRBcnJheS5FbGVtZW50QXQoaSkgPDwgIiAiOworICB9CisgIEZYX0ZJTEVTSVpFJiBvZmZzZXQgPSBwQ3JlYXRvci0+bV9PZmZzZXQ7CisgIGludDMyX3QgbGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKG1fZHdPYmpOdW0pOworICBpZiAobGVuIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBvZmZzZXQgKz0gbGVuOworICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoIiAwIG9ialxyXG48PC9UeXBlIC9PYmpTdG0gL04gIikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBvZmZzZXQgKz0gbGVuOworICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZCgoRlhfRFdPUkQpaUNvdW50KSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIG9mZnNldCArPSBsZW47CisgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKCIvRmlyc3QgIikgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKChGWF9EV09SRCl0ZW1wQnVmZmVyLkdldExlbmd0aCgpKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKCIvTGVuZ3RoICIpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBvZmZzZXQgKz0gbGVuICsgMTU7CisgIGlmICghcENyZWF0b3ItPm1fYkNvbXByZXNzICYmICFwSGFuZGxlcikgeworICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKAorICAgICAgICAgICAgIChGWF9EV09SRCkodGVtcEJ1ZmZlci5HZXRMZW5ndGgoKSArIG1fQnVmZmVyLkdldExlbmd0aCgpKSkpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBvZmZzZXQgKz0gbGVuOwotICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIDAgb2JqXHJcbjw8L1R5cGUgL09ialN0bSAvTiAiKSkpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKCI+PnN0cmVhbVxyXG4iKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChwRmlsZS0+QXBwZW5kQmxvY2sodGVtcEJ1ZmZlci5HZXRCdWZmZXIoKSwgdGVtcEJ1ZmZlci5HZXRMZW5ndGgoKSkgPAorICAgICAgICAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChwRmlsZS0+QXBwZW5kQmxvY2sobV9CdWZmZXIuR2V0QnVmZmVyKCksIG1fQnVmZmVyLkdldExlbmd0aCgpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgb2Zmc2V0ICs9IGxlbiArIHRlbXBCdWZmZXIuR2V0TGVuZ3RoKCkgKyBtX0J1ZmZlci5HZXRMZW5ndGgoKTsKKyAgfSBlbHNlIHsKKyAgICB0ZW1wQnVmZmVyIDw8IG1fQnVmZmVyOworICAgIENQREZfRmxhdGVFbmNvZGVyIGVuY29kZXI7CisgICAgZW5jb2Rlci5Jbml0aWFsaXplKHRlbXBCdWZmZXIuR2V0QnVmZmVyKCksIHRlbXBCdWZmZXIuR2V0TGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdG9yLT5tX2JDb21wcmVzcyk7CisgICAgQ1BERl9FbmNyeXB0b3IgZW5jcnlwdG9yOworICAgIGVuY3J5cHRvci5Jbml0aWFsaXplKHBIYW5kbGVyLCBtX2R3T2JqTnVtLCBlbmNvZGVyLm1fcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rlci5tX2R3U2l6ZSk7CisgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQoZW5jcnlwdG9yLm1fZHdTaXplKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIG9mZnNldCArPSBsZW47Ci0gICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQoKEZYX0RXT1JEKWlDb3VudCkpIDwgMCkgeworICAgIGlmIChwQ3JlYXRvci0+bV9iQ29tcHJlc3MpIHsKKyAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKCIvRmlsdGVyIC9GbGF0ZURlY29kZSIpIDwgMCkgewogICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBvZmZzZXQgKz0gMjA7CiAgICAgfQotICAgIG9mZnNldCArPSBsZW47Ci0gICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIi9GaXJzdCAiKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoIj4+c3RyZWFtXHJcbiIpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQoKEZYX0RXT1JEKXRlbXBCdWZmZXIuR2V0TGVuZ3RoKCkpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChwRmlsZS0+QXBwZW5kQmxvY2soZW5jcnlwdG9yLm1fcERhdGEsIGVuY3J5cHRvci5tX2R3U2l6ZSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIvTGVuZ3RoICIpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBvZmZzZXQgKz0gbGVuICsgMTU7Ci0gICAgaWYgKCFwQ3JlYXRvci0+bV9iQ29tcHJlc3MgJiYgIXBIYW5kbGVyKSB7Ci0gICAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKChGWF9EV09SRCkodGVtcEJ1ZmZlci5HZXRMZW5ndGgoKSArIG1fQnVmZmVyLkdldExlbmd0aCgpKSkpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIG9mZnNldCArPSBsZW47Ci0gICAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiPj5zdHJlYW1cclxuIikpKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAocEZpbGUtPkFwcGVuZEJsb2NrKHRlbXBCdWZmZXIuR2V0QnVmZmVyKCksIHRlbXBCdWZmZXIuR2V0TGVuZ3RoKCkpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwRmlsZS0+QXBwZW5kQmxvY2sobV9CdWZmZXIuR2V0QnVmZmVyKCksIG1fQnVmZmVyLkdldExlbmd0aCgpKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBvZmZzZXQgKz0gbGVuICsgdGVtcEJ1ZmZlci5HZXRMZW5ndGgoKSArIG1fQnVmZmVyLkdldExlbmd0aCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHRlbXBCdWZmZXIgPDwgbV9CdWZmZXI7Ci0gICAgICAgIENQREZfRmxhdGVFbmNvZGVyIGVuY29kZXI7Ci0gICAgICAgIGVuY29kZXIuSW5pdGlhbGl6ZSh0ZW1wQnVmZmVyLkdldEJ1ZmZlcigpLCB0ZW1wQnVmZmVyLkdldExlbmd0aCgpLCBwQ3JlYXRvci0+bV9iQ29tcHJlc3MpOwotICAgICAgICBDUERGX0VuY3J5cHRvciBlbmNyeXB0b3I7Ci0gICAgICAgIGVuY3J5cHRvci5Jbml0aWFsaXplKHBIYW5kbGVyLCBtX2R3T2JqTnVtLCBlbmNvZGVyLm1fcERhdGEsIGVuY29kZXIubV9kd1NpemUpOwotICAgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChlbmNyeXB0b3IubV9kd1NpemUpKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBvZmZzZXQgKz0gbGVuOwotICAgICAgICBpZiAocENyZWF0b3ItPm1fYkNvbXByZXNzKSB7Ci0gICAgICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiL0ZpbHRlciAvRmxhdGVEZWNvZGUiKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2Zmc2V0ICs9IDIwOwotICAgICAgICB9Ci0gICAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiPj5zdHJlYW1cclxuIikpKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAocEZpbGUtPkFwcGVuZEJsb2NrKGVuY3J5cHRvci5tX3BEYXRhLCBlbmNyeXB0b3IubV9kd1NpemUpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIG9mZnNldCArPSBsZW4gKyBlbmNyeXB0b3IubV9kd1NpemU7Ci0gICAgfQotICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXHJcbmVuZHN0cmVhbVxyXG5lbmRvYmpcclxuIikpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBvZmZzZXQgKz0gbGVuOwotICAgIHJldHVybiBPYmpPZmZzZXQ7CisgICAgb2Zmc2V0ICs9IGxlbiArIGVuY3J5cHRvci5tX2R3U2l6ZTsKKyAgfQorICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoIlxyXG5lbmRzdHJlYW1cclxuZW5kb2JqXHJcbiIpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgb2Zmc2V0ICs9IGxlbjsKKyAgcmV0dXJuIE9iak9mZnNldDsKIH0KIENQREZfWFJlZlN0cmVhbTo6Q1BERl9YUmVmU3RyZWFtKCkKLSAgICA6IG1fUHJldk9mZnNldCgwKQotICAgICwgbV9kd1RlbXBPYmpOdW0oMCkKLSAgICAsIG1faVNlZygwKQoteworICAgIDogbV9QcmV2T2Zmc2V0KDApLCBtX2R3VGVtcE9iak51bSgwKSwgbV9pU2VnKDApIHt9CitGWF9CT09MIENQREZfWFJlZlN0cmVhbTo6U3RhcnQoKSB7CisgIG1fSW5kZXhBcnJheS5SZW1vdmVBbGwoKTsKKyAgbV9CdWZmZXIuQ2xlYXIoKTsKKyAgbV9pU2VnID0gMDsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENQREZfWFJlZlN0cmVhbTo6U3RhcnQoKQotewotICAgIG1fSW5kZXhBcnJheS5SZW1vdmVBbGwoKTsKLSAgICBtX0J1ZmZlci5DbGVhcigpOwotICAgIG1faVNlZyA9IDA7Ci0gICAgcmV0dXJuIFRSVUU7CitpbnQzMl90IENQREZfWFJlZlN0cmVhbTo6Q29tcHJlc3NJbmRpcmVjdE9iamVjdChGWF9EV09SRCBkd09iak51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfT2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9DcmVhdG9yKiBwQ3JlYXRvcikgeworICBpZiAoIXBDcmVhdG9yKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgbV9PYmpTdHJlYW0uQ29tcHJlc3NJbmRpcmVjdE9iamVjdChkd09iak51bSwgcE9iaik7CisgIGlmIChtX09ialN0cmVhbS5tX09iak51bUFycmF5LkdldFNpemUoKSA8IHBDcmVhdG9yLT5tX09iamVjdFN0cmVhbVNpemUgJiYKKyAgICAgIG1fT2JqU3RyZWFtLm1fQnVmZmVyLkdldExlbmd0aCgpIDwgUERGX09CSkVDVFNUUkVBTV9NQVhMRU5HVEgpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gRW5kT2JqZWN0U3RyZWFtKHBDcmVhdG9yKTsKIH0KLUZYX0lOVDMyIENQREZfWFJlZlN0cmVhbTo6Q29tcHJlc3NJbmRpcmVjdE9iamVjdChGWF9EV09SRCBkd09iak51bSwgY29uc3QgQ1BERl9PYmplY3QgKnBPYmosIENQREZfQ3JlYXRvciAqcENyZWF0b3IpCi17Ci0gICAgaWYgKCFwQ3JlYXRvcikgewotICAgICAgICByZXR1cm4gMDsKK2ludDMyX3QgQ1BERl9YUmVmU3RyZWFtOjpDb21wcmVzc0luZGlyZWN0T2JqZWN0KEZYX0RXT1JEIGR3T2JqTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQ3JlYXRvciogcENyZWF0b3IpIHsKKyAgaWYgKCFwQ3JlYXRvcikgeworICAgIHJldHVybiAwOworICB9CisgIG1fT2JqU3RyZWFtLkNvbXByZXNzSW5kaXJlY3RPYmplY3QoZHdPYmpOdW0sIHBCdWZmZXIsIGR3U2l6ZSk7CisgIGlmIChtX09ialN0cmVhbS5tX09iak51bUFycmF5LkdldFNpemUoKSA8IHBDcmVhdG9yLT5tX09iamVjdFN0cmVhbVNpemUgJiYKKyAgICAgIG1fT2JqU3RyZWFtLm1fQnVmZmVyLkdldExlbmd0aCgpIDwgUERGX09CSkVDVFNUUkVBTV9NQVhMRU5HVEgpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gRW5kT2JqZWN0U3RyZWFtKHBDcmVhdG9yKTsKK30KKworaW50MzJfdCBDUERGX1hSZWZTdHJlYW06OkVuZE9iamVjdFN0cmVhbShDUERGX0NyZWF0b3IqIHBDcmVhdG9yLCBGWF9CT09MIGJFT0YpIHsKKyAgRlhfRklMRVNJWkUgb2JqT2Zmc2V0ID0gMDsKKyAgaWYgKGJFT0YpIHsKKyAgICBvYmpPZmZzZXQgPSBtX09ialN0cmVhbS5FbmQocENyZWF0b3IpOworICAgIGlmIChvYmpPZmZzZXQgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIG1fT2JqU3RyZWFtLkNvbXByZXNzSW5kaXJlY3RPYmplY3QoZHdPYmpOdW0sIHBPYmopOwotICAgIGlmIChtX09ialN0cmVhbS5tX09iak51bUFycmF5LkdldFNpemUoKSA8IHBDcmVhdG9yLT5tX09iamVjdFN0cmVhbVNpemUgJiYKLSAgICAgICAgICAgIG1fT2JqU3RyZWFtLm1fQnVmZmVyLkdldExlbmd0aCgpIDwgUERGX09CSkVDVFNUUkVBTV9NQVhMRU5HVEgpIHsKLSAgICAgICAgcmV0dXJuIDE7CisgIH0KKyAgRlhfRFdPUkQmIGR3T2JqU3RtTnVtID0gbV9PYmpTdHJlYW0ubV9kd09iak51bTsKKyAgaWYgKCFkd09ialN0bU51bSkgeworICAgIGR3T2JqU3RtTnVtID0gKytwQ3JlYXRvci0+bV9kd0xhc3RPYmpOdW07CisgIH0KKyAgaW50MzJfdCBpU2l6ZSA9IG1fT2JqU3RyZWFtLm1fT2JqTnVtQXJyYXkuR2V0U2l6ZSgpOworICBpbnQzMl90IGlTZWcgPSBtX0luZGV4QXJyYXkuR2V0U2l6ZSgpIC8gMjsKKyAgaWYgKCEocENyZWF0b3ItPm1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpKSB7CisgICAgaWYgKG1fZHdUZW1wT2JqTnVtID09IDApIHsKKyAgICAgIEFwcGVuZEluZGV4MChtX0J1ZmZlciwgdHJ1ZSk7CisgICAgICBtX2R3VGVtcE9iak51bSsrOwogICAgIH0KLSAgICByZXR1cm4gRW5kT2JqZWN0U3RyZWFtKHBDcmVhdG9yKTsKLX0KLUZYX0lOVDMyIENQREZfWFJlZlN0cmVhbTo6Q29tcHJlc3NJbmRpcmVjdE9iamVjdChGWF9EV09SRCBkd09iak51bSwgRlhfTFBDQllURSBwQnVmZmVyLCBGWF9EV09SRCBkd1NpemUsIENQREZfQ3JlYXRvciAqcENyZWF0b3IpCi17Ci0gICAgaWYgKCFwQ3JlYXRvcikgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgbV9PYmpTdHJlYW0uQ29tcHJlc3NJbmRpcmVjdE9iamVjdChkd09iak51bSwgcEJ1ZmZlciwgZHdTaXplKTsKLSAgICBpZiAobV9PYmpTdHJlYW0ubV9PYmpOdW1BcnJheS5HZXRTaXplKCkgPCBwQ3JlYXRvci0+bV9PYmplY3RTdHJlYW1TaXplICYmCi0gICAgICAgICAgICBtX09ialN0cmVhbS5tX0J1ZmZlci5HZXRMZW5ndGgoKSA8IFBERl9PQkpFQ1RTVFJFQU1fTUFYTEVOR1RIKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gRW5kT2JqZWN0U3RyZWFtKHBDcmVhdG9yKTsKLX0KLXN0YXRpYyB2b2lkIF9BcHBlbmRJbmRleDAoQ0ZYX0J5dGVUZXh0QnVmJiBidWZmZXIsIEZYX0JPT0wgYkZpcnN0T2JqZWN0ID0gIFRSVUUpCi17Ci0gICAgYnVmZmVyLkFwcGVuZEJ5dGUoMCk7Ci0gICAgYnVmZmVyLkFwcGVuZEJ5dGUoMCk7Ci0gICAgYnVmZmVyLkFwcGVuZEJ5dGUoMCk7Ci0gICAgYnVmZmVyLkFwcGVuZEJ5dGUoMCk7Ci0gICAgYnVmZmVyLkFwcGVuZEJ5dGUoMCk7Ci0gICAgaWYgKGJGaXJzdE9iamVjdCkgewotICAgICAgICBidWZmZXIuQXBwZW5kQnl0ZSgweEZGKTsKLSAgICAgICAgYnVmZmVyLkFwcGVuZEJ5dGUoMHhGRik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYnVmZmVyLkFwcGVuZEJ5dGUoMCk7Ci0gICAgICAgIGJ1ZmZlci5BcHBlbmRCeXRlKDApOwotICAgIH0KLX0KLXN0YXRpYyB2b2lkIF9BcHBlbmRJbmRleDEoQ0ZYX0J5dGVUZXh0QnVmJiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCkKLXsKLSAgICBidWZmZXIuQXBwZW5kQnl0ZSgxKTsKLSAgICBidWZmZXIuQXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUMjQob2Zmc2V0KSk7Ci0gICAgYnVmZmVyLkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDE2KG9mZnNldCkpOwotICAgIGJ1ZmZlci5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQ4KG9mZnNldCkpOwotICAgIGJ1ZmZlci5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQwKG9mZnNldCkpOwotICAgIGJ1ZmZlci5BcHBlbmRCeXRlKDApOwotICAgIGJ1ZmZlci5BcHBlbmRCeXRlKDApOwotfQotc3RhdGljIHZvaWQgX0FwcGVuZEluZGV4MihDRlhfQnl0ZVRleHRCdWYmIGJ1ZmZlciwgRlhfRFdPUkQgb2JqbnVtLCBGWF9JTlQzMiBpbmRleCkKLXsKLSAgICBidWZmZXIuQXBwZW5kQnl0ZSgyKTsKLSAgICBidWZmZXIuQXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUMjQob2JqbnVtKSk7Ci0gICAgYnVmZmVyLkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDE2KG9iam51bSkpOwotICAgIGJ1ZmZlci5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQ4KG9iam51bSkpOwotICAgIGJ1ZmZlci5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQwKG9iam51bSkpOwotICAgIGJ1ZmZlci5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQ4KGluZGV4KSk7Ci0gICAgYnVmZmVyLkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDAoaW5kZXgpKTsKLX0KLUZYX0lOVDMyIENQREZfWFJlZlN0cmVhbTo6RW5kT2JqZWN0U3RyZWFtKENQREZfQ3JlYXRvciAqcENyZWF0b3IsIEZYX0JPT0wgYkVPRikKLXsKLSAgICBGWF9GSUxFU0laRSBvYmpPZmZzZXQgPSAwOwotICAgIGlmIChiRU9GKSB7Ci0gICAgICAgIG9iak9mZnNldCA9IG1fT2JqU3RyZWFtLkVuZChwQ3JlYXRvcik7Ci0gICAgICAgIGlmIChvYmpPZmZzZXQgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgRlhfRFdPUkQgZW5kX251bSA9IG1fSW5kZXhBcnJheS5HZXRBdCgoaVNlZyAtIDEpICogMikgKworICAgICAgICAgICAgICAgICAgICAgICBtX0luZGV4QXJyYXkuR2V0QXQoKGlTZWcgLSAxKSAqIDIgKyAxKTsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIGZvciAoOyBtX2R3VGVtcE9iak51bSA8IGVuZF9udW07IG1fZHdUZW1wT2JqTnVtKyspIHsKKyAgICAgIEZYX0ZJTEVTSVpFKiBvZmZzZXQgPSBwQ3JlYXRvci0+bV9PYmplY3RPZmZzZXQuR2V0UHRyQXQobV9kd1RlbXBPYmpOdW0pOworICAgICAgaWYgKG9mZnNldCkgeworICAgICAgICBpZiAoaW5kZXggPj0gaVNpemUgfHwKKyAgICAgICAgICAgIG1fZHdUZW1wT2JqTnVtICE9IG1fT2JqU3RyZWFtLm1fT2JqTnVtQXJyYXlbaW5kZXhdKSB7CisgICAgICAgICAgQXBwZW5kSW5kZXgxKG1fQnVmZmVyLCAqb2Zmc2V0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBBcHBlbmRJbmRleDIobV9CdWZmZXIsIGR3T2JqU3RtTnVtLCBpbmRleCsrKTsKICAgICAgICAgfQotICAgIH0KLSAgICBGWF9EV09SRCAmZHdPYmpTdG1OdW0gPSBtX09ialN0cmVhbS5tX2R3T2JqTnVtOwotICAgIGlmICghZHdPYmpTdG1OdW0pIHsKLSAgICAgICAgZHdPYmpTdG1OdW0gPSArK3BDcmVhdG9yLT5tX2R3TGFzdE9iak51bTsKLSAgICB9Ci0gICAgRlhfSU5UMzIgaVNpemUgPSBtX09ialN0cmVhbS5tX09iak51bUFycmF5LkdldFNpemUoKTsKLSAgICBGWF9JTlQzMiBpU2VnID0gbV9JbmRleEFycmF5LkdldFNpemUoKSAvIDI7Ci0gICAgaWYgKCEocENyZWF0b3ItPm1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpKSB7Ci0gICAgICAgIGlmIChtX2R3VGVtcE9iak51bSA9PSAwKSB7Ci0gICAgICAgICAgICBfQXBwZW5kSW5kZXgwKG1fQnVmZmVyKTsKLSAgICAgICAgICAgIG1fZHdUZW1wT2JqTnVtKys7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRFdPUkQgZW5kX251bSA9IG1fSW5kZXhBcnJheS5HZXRBdCgoaVNlZyAtIDEpICogMikgKyBtX0luZGV4QXJyYXkuR2V0QXQoKGlTZWcgLSAxKSAqIDIgKyAxKTsKLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgZm9yICg7IG1fZHdUZW1wT2JqTnVtIDwgZW5kX251bTsgbV9kd1RlbXBPYmpOdW0rKykgewotICAgICAgICAgICAgRlhfRklMRVNJWkUqIG9mZnNldCA9IHBDcmVhdG9yLT5tX09iamVjdE9mZnNldC5HZXRQdHJBdChtX2R3VGVtcE9iak51bSk7Ci0gICAgICAgICAgICBpZiAob2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IGlTaXplIHx8IG1fZHdUZW1wT2JqTnVtICE9IG1fT2JqU3RyZWFtLm1fT2JqTnVtQXJyYXlbaW5kZXhdKSB7Ci0gICAgICAgICAgICAgICAgICAgIF9BcHBlbmRJbmRleDEobV9CdWZmZXIsICpvZmZzZXQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIF9BcHBlbmRJbmRleDIobV9CdWZmZXIsIGR3T2JqU3RtTnVtLCBpbmRleCsrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIF9BcHBlbmRJbmRleDAobV9CdWZmZXIsIEZBTFNFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaVNpemUgPiAwICYmIGJFT0YpIHsKLSAgICAgICAgICAgIHBDcmVhdG9yLT5tX09iamVjdE9mZnNldC5BZGQoZHdPYmpTdG1OdW0sIDEpOwotICAgICAgICAgICAgcENyZWF0b3ItPm1fT2JqZWN0U2l6ZS5BZGQoZHdPYmpTdG1OdW0sIDEpOwotICAgICAgICAgICAgcENyZWF0b3ItPm1fT2JqZWN0T2Zmc2V0W2R3T2JqU3RtTnVtXSA9IG9iak9mZnNldDsKLSAgICAgICAgfQotICAgICAgICBtX2lTZWcgPSBpU2VnOwotICAgICAgICBpZiAoYkVPRikgewotICAgICAgICAgICAgbV9PYmpTdHJlYW0uU3RhcnQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgRlhfSU5UMzIgJmogPSBtX09ialN0cmVhbS5tX2luZGV4OwotICAgIGZvciAoaW50IGkgPSBtX2lTZWc7IGkgPCBpU2VnOyBpKyspIHsKLSAgICAgICAgRlhfRFdPUkQgc3RhcnQgPSBtX0luZGV4QXJyYXkuRWxlbWVudEF0KGkgKiAyKTsKLSAgICAgICAgRlhfRFdPUkQgZW5kID0gbV9JbmRleEFycmF5LkVsZW1lbnRBdChpICogMiArIDEpICsgc3RhcnQ7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgbSA9IHN0YXJ0OyBtIDwgZW5kOyBtKyspIHsKLSAgICAgICAgICAgIGlmIChqID49IGlTaXplIHx8IG0gIT0gbV9PYmpTdHJlYW0ubV9PYmpOdW1BcnJheS5FbGVtZW50QXQoaikpIHsKLSAgICAgICAgICAgICAgICBfQXBwZW5kSW5kZXgxKG1fQnVmZmVyLCBwQ3JlYXRvci0+bV9PYmplY3RPZmZzZXRbbV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBfQXBwZW5kSW5kZXgyKG1fQnVmZmVyLCBkd09ialN0bU51bSwgaisrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgQXBwZW5kSW5kZXgwKG1fQnVmZmVyLCBmYWxzZSk7CisgICAgICB9CiAgICAgfQogICAgIGlmIChpU2l6ZSA+IDAgJiYgYkVPRikgewotICAgICAgICBfQXBwZW5kSW5kZXgxKG1fQnVmZmVyLCBvYmpPZmZzZXQpOwotICAgICAgICBtX0luZGV4QXJyYXkuQWRkKGR3T2JqU3RtTnVtKTsKLSAgICAgICAgbV9JbmRleEFycmF5LkFkZCgxKTsKLSAgICAgICAgaVNlZyArPSAxOworICAgICAgcENyZWF0b3ItPm1fT2JqZWN0T2Zmc2V0LkFkZChkd09ialN0bU51bSwgMSk7CisgICAgICBwQ3JlYXRvci0+bV9PYmplY3RPZmZzZXRbZHdPYmpTdG1OdW1dID0gb2JqT2Zmc2V0OwogICAgIH0KICAgICBtX2lTZWcgPSBpU2VnOwogICAgIGlmIChiRU9GKSB7Ci0gICAgICAgIG1fT2JqU3RyZWFtLlN0YXJ0KCk7CisgICAgICBtX09ialN0cmVhbS5TdGFydCgpOwogICAgIH0KICAgICByZXR1cm4gMTsKKyAgfQorICBpbnQzMl90JiBqID0gbV9PYmpTdHJlYW0ubV9pbmRleDsKKyAgZm9yIChpbnQgaSA9IG1faVNlZzsgaSA8IGlTZWc7IGkrKykgeworICAgIEZYX0RXT1JEIHN0YXJ0ID0gbV9JbmRleEFycmF5LkVsZW1lbnRBdChpICogMik7CisgICAgRlhfRFdPUkQgZW5kID0gbV9JbmRleEFycmF5LkVsZW1lbnRBdChpICogMiArIDEpICsgc3RhcnQ7CisgICAgZm9yIChGWF9EV09SRCBtID0gc3RhcnQ7IG0gPCBlbmQ7IG0rKykgeworICAgICAgaWYgKGogPj0gaVNpemUgfHwgbSAhPSBtX09ialN0cmVhbS5tX09iak51bUFycmF5LkVsZW1lbnRBdChqKSkgeworICAgICAgICBBcHBlbmRJbmRleDEobV9CdWZmZXIsIHBDcmVhdG9yLT5tX09iamVjdE9mZnNldFttXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBBcHBlbmRJbmRleDIobV9CdWZmZXIsIGR3T2JqU3RtTnVtLCBqKyspOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoaVNpemUgPiAwICYmIGJFT0YpIHsKKyAgICBBcHBlbmRJbmRleDEobV9CdWZmZXIsIG9iak9mZnNldCk7CisgICAgbV9JbmRleEFycmF5LkFkZChkd09ialN0bU51bSk7CisgICAgbV9JbmRleEFycmF5LkFkZCgxKTsKKyAgICBpU2VnICs9IDE7CisgIH0KKyAgbV9pU2VnID0gaVNlZzsKKyAgaWYgKGJFT0YpIHsKKyAgICBtX09ialN0cmVhbS5TdGFydCgpOworICB9CisgIHJldHVybiAxOwogfQotRlhfQk9PTCBDUERGX1hSZWZTdHJlYW06OkdlbmVyYXRlWFJlZlN0cmVhbShDUERGX0NyZWF0b3IqIHBDcmVhdG9yLCBGWF9CT09MIGJFT0YpCi17Ci0gICAgRlhfRklMRVNJWkUgb2Zmc2V0X3RtcCA9IHBDcmVhdG9yLT5tX09mZnNldDsKLSAgICBGWF9EV09SRCBvYmpudW0gPSArK3BDcmVhdG9yLT5tX2R3TGFzdE9iak51bTsKLSAgICBDRlhfRmlsZUJ1ZmZlckFyY2hpdmUgKnBGaWxlID0gJnBDcmVhdG9yLT5tX0ZpbGU7Ci0gICAgRlhfQk9PTCBiSW5jcmVtZW50YWwgPSAocENyZWF0b3ItPm1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpICE9IDA7Ci0gICAgaWYgKGJJbmNyZW1lbnRhbCkgewotICAgICAgICBBZGRPYmplY3ROdW1iZXJUb0luZGV4QXJyYXkob2JqbnVtKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKDsgbV9kd1RlbXBPYmpOdW0gPCBwQ3JlYXRvci0+bV9kd0xhc3RPYmpOdW07IG1fZHdUZW1wT2JqTnVtKyspIHsKLSAgICAgICAgICAgIEZYX0ZJTEVTSVpFKiBvZmZzZXQgPSBwQ3JlYXRvci0+bV9PYmplY3RPZmZzZXQuR2V0UHRyQXQobV9kd1RlbXBPYmpOdW0pOwotICAgICAgICAgICAgaWYgKG9mZnNldCkgewotICAgICAgICAgICAgICAgIF9BcHBlbmRJbmRleDEobV9CdWZmZXIsICpvZmZzZXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBfQXBwZW5kSW5kZXgwKG1fQnVmZmVyLCBGQUxTRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KK0ZYX0JPT0wgQ1BERl9YUmVmU3RyZWFtOjpHZW5lcmF0ZVhSZWZTdHJlYW0oQ1BERl9DcmVhdG9yKiBwQ3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRU9GKSB7CisgIEZYX0ZJTEVTSVpFIG9mZnNldF90bXAgPSBwQ3JlYXRvci0+bV9PZmZzZXQ7CisgIEZYX0RXT1JEIG9iam51bSA9ICsrcENyZWF0b3ItPm1fZHdMYXN0T2JqTnVtOworICBDRlhfRmlsZUJ1ZmZlckFyY2hpdmUqIHBGaWxlID0gJnBDcmVhdG9yLT5tX0ZpbGU7CisgIEZYX0JPT0wgYkluY3JlbWVudGFsID0gKHBDcmVhdG9yLT5tX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSAhPSAwOworICBpZiAoYkluY3JlbWVudGFsKSB7CisgICAgQWRkT2JqZWN0TnVtYmVyVG9JbmRleEFycmF5KG9iam51bSk7CisgIH0gZWxzZSB7CisgICAgZm9yICg7IG1fZHdUZW1wT2JqTnVtIDwgcENyZWF0b3ItPm1fZHdMYXN0T2JqTnVtOyBtX2R3VGVtcE9iak51bSsrKSB7CisgICAgICBGWF9GSUxFU0laRSogb2Zmc2V0ID0gcENyZWF0b3ItPm1fT2JqZWN0T2Zmc2V0LkdldFB0ckF0KG1fZHdUZW1wT2JqTnVtKTsKKyAgICAgIGlmIChvZmZzZXQpIHsKKyAgICAgICAgQXBwZW5kSW5kZXgxKG1fQnVmZmVyLCAqb2Zmc2V0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFwcGVuZEluZGV4MChtX0J1ZmZlciwgZmFsc2UpOworICAgICAgfQogICAgIH0KLSAgICBfQXBwZW5kSW5kZXgxKG1fQnVmZmVyLCBvZmZzZXRfdG1wKTsKLSAgICBGWF9GSUxFU0laRSAmb2Zmc2V0ID0gcENyZWF0b3ItPm1fT2Zmc2V0OwotICAgIEZYX0lOVDMyIGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChvYmpudW0pOwotICAgIGlmIChsZW4gPCAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBBcHBlbmRJbmRleDEobV9CdWZmZXIsIG9mZnNldF90bXApOworICBGWF9GSUxFU0laRSYgb2Zmc2V0ID0gcENyZWF0b3ItPm1fT2Zmc2V0OworICBpbnQzMl90IGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChvYmpudW0pOworICBpZiAobGVuIDwgMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBvZmZzZXQgKz0gbGVuOworICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoIiAwIG9ialxyXG48PC9UeXBlIC9YUmVmL1dbMSA0IDJdL0luZGV4WyIpKSA8CisgICAgICAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG9mZnNldCArPSBsZW47CisgIGlmICghYkluY3JlbWVudGFsKSB7CisgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQoMCkpIDwgMCkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBvZmZzZXQgKz0gbGVuOwotICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIDAgb2JqXHJcbjw8L1R5cGUgL1hSZWYvV1sxIDQgMl0vSW5kZXhbIikpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZygiICIpKSA8IDApIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgb2Zmc2V0ICs9IGxlbjsKLSAgICBpZiAoIWJJbmNyZW1lbnRhbCkgewotICAgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZCgwKSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBvZmZzZXQgKz0gbGVuICsgMTsKLSAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQob2JqbnVtICsgMSkpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIG9mZnNldCArPSBsZW47Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRlhfSU5UMzIgaVNlZyA9IG1fSW5kZXhBcnJheS5HZXRTaXplKCkgLyAyOwotICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaVNlZzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChtX0luZGV4QXJyYXkuRWxlbWVudEF0KGkgKiAyKSkpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9mZnNldCArPSBsZW4gKyAxOwotICAgICAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQobV9JbmRleEFycmF5LkVsZW1lbnRBdChpICogMiArIDEpKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAiKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2Zmc2V0ICs9IGxlbiArIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIl0vU2l6ZSAiKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9CisgICAgb2Zmc2V0ICs9IGxlbiArIDE7CiAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQob2JqbnVtICsgMSkpIDwgMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG9mZnNldCArPSBsZW4gKyA3OwotICAgIGlmIChtX1ByZXZPZmZzZXQgPiAwKSB7Ci0gICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIvUHJldiAiKSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfQ0hBUiBvZmZzZXRfYnVmWzIwXTsKLSAgICAgICAgRlhTWVNfbWVtc2V0MzIob2Zmc2V0X2J1ZiwgMCwgc2l6ZW9mKG9mZnNldF9idWYpKTsKLSAgICAgICAgRlhTWVNfaTY0dG9hKG1fUHJldk9mZnNldCwgb2Zmc2V0X2J1ZiwgMTApOwotICAgICAgICBGWF9JTlQzMiBsZW4gPSAoRlhfSU5UMzIpRlhTWVNfc3RybGVuKG9mZnNldF9idWYpOwotICAgICAgICBpZiAocEZpbGUtPkFwcGVuZEJsb2NrKG9mZnNldF9idWYsIGxlbikgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0ICs9IGxlbiArIDY7Ci0gICAgfQotICAgIEZYX0JPT0wgYlByZWRpY3RvciA9IFRSVUU7Ci0gICAgQ1BERl9GbGF0ZUVuY29kZXIgZW5jb2RlcjsKLSAgICBlbmNvZGVyLkluaXRpYWxpemUobV9CdWZmZXIuR2V0QnVmZmVyKCksIG1fQnVmZmVyLkdldExlbmd0aCgpLCBwQ3JlYXRvci0+bV9iQ29tcHJlc3MsIGJQcmVkaWN0b3IpOwotICAgIGlmIChwQ3JlYXRvci0+bV9iQ29tcHJlc3MpIHsKLSAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIi9GaWx0ZXIgL0ZsYXRlRGVjb2RlIikpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIG9mZnNldCArPSAyMDsKLSAgICAgICAgaWYgKGJQcmVkaWN0b3IpIHsKLSAgICAgICAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiL0RlY29kZVBhcm1zPDwvQ29sdW1ucyA3L1ByZWRpY3RvciAxMj4+IikpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvZmZzZXQgKz0gbGVuOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIvTGVuZ3RoICIpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChlbmNvZGVyLm1fZHdTaXplKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgb2Zmc2V0ICs9IGxlbiArIDg7Ci0gICAgaWYgKGJFT0YpIHsKLSAgICAgICAgaWYgKChsZW4gPSBQREZfQ3JlYXRvcldyaXRlVHJhaWxlcihwQ3JlYXRvci0+bV9wRG9jdW1lbnQsIHBGaWxlLCBwQ3JlYXRvci0+bV9wSURBcnJheSwgcENyZWF0b3ItPm1fYkNvbXByZXNzKSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0ICs9IGxlbjsKLSAgICAgICAgaWYgKHBDcmVhdG9yLT5tX3BFbmNyeXB0RGljdCkgewotICAgICAgICAgICAgRlhfRFdPUkQgZHdFbmNyeXB0T2JqTnVtID0gcENyZWF0b3ItPm1fcEVuY3J5cHREaWN0LT5HZXRPYmpOdW0oKTsKLSAgICAgICAgICAgIGlmIChkd0VuY3J5cHRPYmpOdW0gPT0gMCkgewotICAgICAgICAgICAgICAgIGR3RW5jcnlwdE9iak51bSA9IHBDcmVhdG9yLT5tX2R3RW5yeXB0T2JqTnVtOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChsZW4gPSBQREZfQ3JlYXRvcldyaXRlRW5jcnlwdChwQ3JlYXRvci0+bV9wRW5jcnlwdERpY3QsIGR3RW5jcnlwdE9iak51bSwgcEZpbGUpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvZmZzZXQgKz0gbGVuOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZyhGWF9CU1RSQygiPj5zdHJlYW1cclxuIikpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBvZmZzZXQgKz0gbGVuOwotICAgIGlmIChwRmlsZS0+QXBwZW5kQmxvY2soZW5jb2Rlci5tX3BEYXRhLCBlbmNvZGVyLm1fZHdTaXplKSA8IDApIHsKKyAgfSBlbHNlIHsKKyAgICBpbnQzMl90IGlTZWcgPSBtX0luZGV4QXJyYXkuR2V0U2l6ZSgpIC8gMjsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2VnOyBpKyspIHsKKyAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKG1fSW5kZXhBcnJheS5FbGVtZW50QXQoaSAqIDIpKSkgPCAwKSB7CiAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJcclxuZW5kc3RyZWFtXHJcbmVuZG9ialxyXG4iKSkpIDwgMCkgeworICAgICAgfQorICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoIiAiKSA8IDApIHsKICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBvZmZzZXQgKz0gZW5jb2Rlci5tX2R3U2l6ZSArIGxlbjsKLSAgICBtX1ByZXZPZmZzZXQgPSBvZmZzZXRfdG1wOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX1hSZWZTdHJlYW06OkVuZChDUERGX0NyZWF0b3IgKnBDcmVhdG9yLCBGWF9CT09MIGJFT0YgKQotewotICAgIGlmIChFbmRPYmplY3RTdHJlYW0ocENyZWF0b3IsIGJFT0YpIDwgMCkgeworICAgICAgfQorICAgICAgb2Zmc2V0ICs9IGxlbiArIDE7CisgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChtX0luZGV4QXJyYXkuRWxlbWVudEF0KGkgKiAyICsgMSkpKSA8IDApIHsKICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gR2VuZXJhdGVYUmVmU3RyZWFtKHBDcmVhdG9yLCBiRU9GKTsKLX0KLUZYX0JPT0wgQ1BERl9YUmVmU3RyZWFtOjpFbmRYUmVmU3RyZWFtKENQREZfQ3JlYXRvciogcENyZWF0b3IpCi17Ci0gICAgaWYgKCEocENyZWF0b3ItPm1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpKSB7Ci0gICAgICAgIF9BcHBlbmRJbmRleDAobV9CdWZmZXIpOwotICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAxOyBpIDwgcENyZWF0b3ItPm1fZHdMYXN0T2JqTnVtICsgMTsgaSsrKSB7Ci0gICAgICAgICAgICBGWF9GSUxFU0laRSogb2Zmc2V0ID0gcENyZWF0b3ItPm1fT2JqZWN0T2Zmc2V0LkdldFB0ckF0KGkpOwotICAgICAgICAgICAgaWYgKG9mZnNldCkgewotICAgICAgICAgICAgICAgIF9BcHBlbmRJbmRleDEobV9CdWZmZXIsICpvZmZzZXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBfQXBwZW5kSW5kZXgwKG1fQnVmZmVyLCBGQUxTRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBGWF9JTlQzMiBpU2VnID0gbV9JbmRleEFycmF5LkdldFNpemUoKSAvIDI7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaVNlZzsgaSsrKSB7Ci0gICAgICAgICAgICBGWF9EV09SRCBzdGFydCA9IG1fSW5kZXhBcnJheS5FbGVtZW50QXQoaSAqIDIpOwotICAgICAgICAgICAgRlhfRFdPUkQgZW5kID0gbV9JbmRleEFycmF5LkVsZW1lbnRBdChpICogMiArIDEpICsgc3RhcnQ7Ci0gICAgICAgICAgICBmb3IgKEZYX0RXT1JEIGogPSBzdGFydDsgaiA8IGVuZDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgX0FwcGVuZEluZGV4MShtX0J1ZmZlciwgcENyZWF0b3ItPm1fT2JqZWN0T2Zmc2V0W2pdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gR2VuZXJhdGVYUmVmU3RyZWFtKHBDcmVhdG9yLCBGQUxTRSk7Ci19Ci1GWF9CT09MIENQREZfWFJlZlN0cmVhbTo6QWRkT2JqZWN0TnVtYmVyVG9JbmRleEFycmF5KEZYX0RXT1JEIG9iam51bSkKLXsKLSAgICBGWF9JTlQzMiBpU2l6ZSA9IG1fSW5kZXhBcnJheS5HZXRTaXplKCk7Ci0gICAgaWYgKGlTaXplID09IDApIHsKLSAgICAgICAgbV9JbmRleEFycmF5LkFkZChvYmpudW0pOwotICAgICAgICBtX0luZGV4QXJyYXkuQWRkKDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYU1lTX2Fzc2VydChpU2l6ZSA+IDEpOwotICAgICAgICBGWF9EV09SRCBzdGFydG9iam51bSA9IG1fSW5kZXhBcnJheS5FbGVtZW50QXQoaVNpemUgLSAyKTsKLSAgICAgICAgRlhfSU5UMzIgaUNvdW50ID0gbV9JbmRleEFycmF5LkVsZW1lbnRBdChpU2l6ZSAtIDEpOwotICAgICAgICBpZiAob2JqbnVtID09IHN0YXJ0b2JqbnVtICsgaUNvdW50KSB7Ci0gICAgICAgICAgICBtX0luZGV4QXJyYXlbaVNpemUgLSAxXSA9IGlDb3VudCArIDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX0luZGV4QXJyYXkuQWRkKG9iam51bSk7Ci0gICAgICAgICAgICBtX0luZGV4QXJyYXkuQWRkKDEpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotQ1BERl9DcmVhdG9yOjpDUERGX0NyZWF0b3IoQ1BERl9Eb2N1bWVudCogcERvYykKLXsKLSAgICBtX3BEb2N1bWVudCA9IHBEb2M7Ci0gICAgbV9wUGFyc2VyID0gKENQREZfUGFyc2VyKilwRG9jLT5tX3BQYXJzZXI7Ci0gICAgbV9iQ29tcHJlc3MgPSBUUlVFOwotICAgIGlmIChtX3BQYXJzZXIpIHsKLSAgICAgICAgbV9wRW5jcnlwdERpY3QgPSBtX3BQYXJzZXItPkdldEVuY3J5cHREaWN0KCk7Ci0gICAgICAgIG1fcENyeXB0b0hhbmRsZXIgPSBtX3BQYXJzZXItPkdldENyeXB0b0hhbmRsZXIoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX3BFbmNyeXB0RGljdCA9IE5VTEw7Ci0gICAgICAgIG1fcENyeXB0b0hhbmRsZXIgPSBOVUxMOwotICAgIH0KLSAgICBtX2JTZWN1cml0eUNoYW5nZWQgPSBGQUxTRTsKLSAgICBtX2JTdGFuZGFyZFNlY3VyaXR5ID0gRkFMU0U7Ci0gICAgbV9wTWV0YWRhdGEgPSBOVUxMOwotICAgIG1fYkVuY3J5cHRDbG9uZWQgPSBGQUxTRTsKLSAgICBtX2JFbmNyeXB0TWV0YWRhdGEgPSBGQUxTRTsKLSAgICBtX09mZnNldCA9IDA7Ci0gICAgbV9pU3RhZ2UgPSAtMTsKLSAgICBtX2R3RmxhZ3MgPSAwOwotICAgIG1fUG9zID0gTlVMTDsKLSAgICBtX1hyZWZTdGFydCA9IDA7Ci0gICAgbV9wWFJlZlN0cmVhbSA9IE5VTEw7Ci0gICAgbV9PYmplY3RTdHJlYW1TaXplID0gMjAwOwotICAgIG1fZHdMYXN0T2JqTnVtID0gbV9wRG9jdW1lbnQtPkdldExhc3RPYmpOdW0oKTsKLSAgICBtX3BJREFycmF5ID0gTlVMTDsKLSAgICBtX0ZpbGVWZXJzaW9uID0gMDsKLSAgICBtX2R3RW5yeXB0T2JqTnVtID0gMDsKLSAgICBtX2JOZXdDcnlwdG8gPSBGQUxTRTsKLX0KLUNQREZfQ3JlYXRvcjo6fkNQREZfQ3JlYXRvcigpCi17Ci0gICAgUmVzZXRTdGFuZGFyZFNlY3VyaXR5KCk7Ci0gICAgaWYgKG1fYkVuY3J5cHRDbG9uZWQgJiYgbV9wRW5jcnlwdERpY3QpIHsKLSAgICAgICAgbV9wRW5jcnlwdERpY3QtPlJlbGVhc2UoKTsKLSAgICAgICAgbV9wRW5jcnlwdERpY3QgPSBOVUxMOwotICAgIH0KLSAgICBDbGVhcigpOwotfQotc3RhdGljIEZYX0JPT0wgX0lzWFJlZk5lZWRFbmQoQ1BERl9YUmVmU3RyZWFtKiBwWFJlZiwgRlhfRFdPUkQgZmxhZykKLXsKLSAgICBpZiAoIShmbGFnICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkpIHsKKyAgICAgIH0KKyAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKCIgIikgPCAwKSB7CiAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIG9mZnNldCArPSBsZW4gKyAxOwogICAgIH0KLSAgICBGWF9JTlQzMiBpU2l6ZSA9IHBYUmVmLT5tX0luZGV4QXJyYXkuR2V0U2l6ZSgpIC8gMjsKLSAgICBGWF9JTlQzMiBpQ291bnQgPSAwOwotICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpU2l6ZTsgaSsrKSB7Ci0gICAgICAgIGlDb3VudCArPSBwWFJlZi0+bV9JbmRleEFycmF5LkVsZW1lbnRBdChpICogMiArIDEpOwotICAgIH0KLSAgICByZXR1cm4gKGlDb3VudCA+PSBQREZfWFJFRlNUUkVBTV9NQVhTSVpFKTsKLX0KLUZYX0lOVDMyIENQREZfQ3JlYXRvcjo6V3JpdGVJbmRpcmVjdE9iamVjdFRvU3RyZWFtKGNvbnN0IENQREZfT2JqZWN0KiBwT2JqKQotewotICAgIGlmICghbV9wWFJlZlN0cmVhbSkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgRlhfRFdPUkQgb2JqbnVtID0gcE9iai0+R2V0T2JqTnVtKCk7Ci0gICAgaWYgKG1fcFBhcnNlciAmJiBtX3BQYXJzZXItPm1fT2JqVmVyc2lvbi5HZXRTaXplKCkgPiAoRlhfSU5UMzIpb2JqbnVtICYmIG1fcFBhcnNlci0+bV9PYmpWZXJzaW9uW29iam51bV0gPiAwKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpZiAocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSAqcERpY3QgPSBwT2JqLT5HZXREaWN0KCk7Ci0gICAgaWYgKHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIGlmIChwRGljdCAmJiBwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJUeXBlIikpID09IEZYX0JTVFJDKCJYUmVmIikpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpZiAocERpY3QpIHsKLSAgICAgICAgaWYgKHBEaWN0ID09IG1fcERvY3VtZW50LT5tX3BSb290RGljdCB8fCBwRGljdCA9PSBtX3BFbmNyeXB0RGljdCkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKElzU2lnbmF0dXJlRGljdChwRGljdCkpIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJUeXBlIikpID09IEZYX0JTVFJDKCJQYWdlIikpIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotICAgIG1fcFhSZWZTdHJlYW0tPkFkZE9iamVjdE51bWJlclRvSW5kZXhBcnJheShvYmpudW0pOwotICAgIGlmIChtX3BYUmVmU3RyZWFtLT5Db21wcmVzc0luZGlyZWN0T2JqZWN0KG9iam51bSwgcE9iaiwgdGhpcykgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKCFfSXNYUmVmTmVlZEVuZChtX3BYUmVmU3RyZWFtLCBtX2R3RmxhZ3MpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoIW1fcFhSZWZTdHJlYW0tPkVuZCh0aGlzKSkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmICghbV9wWFJlZlN0cmVhbS0+U3RhcnQoKSkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotRlhfSU5UMzIgQ1BERl9DcmVhdG9yOjpXcml0ZUluZGlyZWN0T2JqZWN0VG9TdHJlYW0oRlhfRFdPUkQgb2JqbnVtLCBGWF9MUENCWVRFIHBCdWZmZXIsIEZYX0RXT1JEIGR3U2l6ZSkKLXsKLSAgICBpZiAoIW1fcFhSZWZTdHJlYW0pIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIG1fcFhSZWZTdHJlYW0tPkFkZE9iamVjdE51bWJlclRvSW5kZXhBcnJheShvYmpudW0pOwotICAgIEZYX0lOVDMyIGlSZXQgPSBtX3BYUmVmU3RyZWFtLT5Db21wcmVzc0luZGlyZWN0T2JqZWN0KG9iam51bSwgcEJ1ZmZlciwgZHdTaXplLCB0aGlzKTsKLSAgICBpZiAoaVJldCA8IDEpIHsKLSAgICAgICAgcmV0dXJuIGlSZXQ7Ci0gICAgfQotICAgIGlmICghX0lzWFJlZk5lZWRFbmQobV9wWFJlZlN0cmVhbSwgbV9kd0ZsYWdzKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKCFtX3BYUmVmU3RyZWFtLT5FbmQodGhpcykpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAoIW1fcFhSZWZTdHJlYW0tPlN0YXJ0KCkpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLUZYX0lOVDMyIENQREZfQ3JlYXRvcjo6QXBwZW5kT2JqZWN0TnVtYmVyVG9YUmVmKEZYX0RXT1JEIG9iam51bSkKLXsKLSAgICBpZiAoIW1fcFhSZWZTdHJlYW0pIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIG1fcFhSZWZTdHJlYW0tPkFkZE9iamVjdE51bWJlclRvSW5kZXhBcnJheShvYmpudW0pOwotICAgIGlmICghX0lzWFJlZk5lZWRFbmQobV9wWFJlZlN0cmVhbSwgbV9kd0ZsYWdzKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKCFtX3BYUmVmU3RyZWFtLT5FbmQodGhpcykpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAoIW1fcFhSZWZTdHJlYW0tPlN0YXJ0KCkpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLUZYX0lOVDMyIENQREZfQ3JlYXRvcjo6V3JpdGVTdHJlYW0oY29uc3QgQ1BERl9PYmplY3QqIHBTdHJlYW0sIEZYX0RXT1JEIG9iam51bSwgQ1BERl9DcnlwdG9IYW5kbGVyKiBwQ3J5cHRvKQotewotICAgIENQREZfRmxhdGVFbmNvZGVyIGVuY29kZXI7Ci0gICAgZW5jb2Rlci5Jbml0aWFsaXplKChDUERGX1N0cmVhbSopcFN0cmVhbSwgcFN0cmVhbSA9PSBtX3BNZXRhZGF0YSA/IEZBTFNFIDogbV9iQ29tcHJlc3MpOwotICAgIENQREZfRW5jcnlwdG9yIGVuY3J5cHRvcjsKLSAgICBpZighZW5jcnlwdG9yLkluaXRpYWxpemUocENyeXB0bywgb2JqbnVtLCBlbmNvZGVyLm1fcERhdGEsIGVuY29kZXIubV9kd1NpemUpKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKChGWF9EV09SRCllbmNvZGVyLm1fcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkxlbmd0aCIpKSAhPSBlbmNyeXB0b3IubV9kd1NpemUpIHsKLSAgICAgICAgZW5jb2Rlci5DbG9uZURpY3QoKTsKLSAgICAgICAgZW5jb2Rlci5tX3BEaWN0LT5TZXRBdEludGVnZXIoRlhfQlNUUkMoIkxlbmd0aCIpLCBlbmNyeXB0b3IubV9kd1NpemUpOwotICAgIH0KLSAgICBpZiAoV3JpdGVEaXJlY3RPYmoob2JqbnVtLCBlbmNvZGVyLm1fcERpY3QpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGludCBsZW4gPSBtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJzdHJlYW1cclxuIikpOwotICAgIGlmIChsZW4gPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgbV9PZmZzZXQgKz0gbGVuOwotICAgIGlmIChtX0ZpbGUuQXBwZW5kQmxvY2soZW5jcnlwdG9yLm1fcERhdGEsIGVuY3J5cHRvci5tX2R3U2l6ZSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgbV9PZmZzZXQgKz0gZW5jcnlwdG9yLm1fZHdTaXplOwotICAgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXHJcbmVuZHN0cmVhbSIpKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgbV9PZmZzZXQgKz0gbGVuOwotICAgIHJldHVybiAxOwotfQotRlhfSU5UMzIgQ1BERl9DcmVhdG9yOjpXcml0ZUluZGlyZWN0T2JqKEZYX0RXT1JEIG9iam51bSwgY29uc3QgQ1BERl9PYmplY3QqIHBPYmopCi17Ci0gICAgRlhfSU5UMzIgbGVuID0gbV9GaWxlLkFwcGVuZERXb3JkKG9iam51bSk7Ci0gICAgaWYgKGxlbiA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBtX09mZnNldCArPSBsZW47Ci0gICAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgMCBvYmpcclxuIikpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBtX09mZnNldCArPSBsZW47Ci0gICAgaWYgKHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIENQREZfQ3J5cHRvSGFuZGxlciAqcEhhbmRsZXIgPSBOVUxMOwotICAgICAgICBwSGFuZGxlciA9IChwT2JqID09IG1fcE1ldGFkYXRhICYmICFtX2JFbmNyeXB0TWV0YWRhdGEpID8gTlVMTCA6IG1fcENyeXB0b0hhbmRsZXI7Ci0gICAgICAgIGlmIChXcml0ZVN0cmVhbShwT2JqLCBvYmpudW0sIHBIYW5kbGVyKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChXcml0ZURpcmVjdE9iaihvYmpudW0sIHBPYmopIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXHJcbmVuZG9ialxyXG4iKSkpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIG1fT2Zmc2V0ICs9IGxlbjsKLSAgICBpZiAoQXBwZW5kT2JqZWN0TnVtYmVyVG9YUmVmKG9iam51bSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci1GWF9JTlQzMiBDUERGX0NyZWF0b3I6OldyaXRlSW5kaXJlY3RPYmooY29uc3QgQ1BERl9PYmplY3QqIHBPYmopCi17Ci0gICAgRlhfSU5UMzIgaVJldCA9IFdyaXRlSW5kaXJlY3RPYmplY3RUb1N0cmVhbShwT2JqKTsKLSAgICBpZiAoaVJldCA8IDEpIHsKLSAgICAgICAgcmV0dXJuIGlSZXQ7Ci0gICAgfQotICAgIHJldHVybiBXcml0ZUluZGlyZWN0T2JqKHBPYmotPkdldE9iak51bSgpLCBwT2JqKTsKLX0KLUZYX0lOVDMyIENQREZfQ3JlYXRvcjo6V3JpdGVEaXJlY3RPYmooRlhfRFdPUkQgb2JqbnVtLCBjb25zdCBDUERGX09iamVjdCogcE9iaiwgRlhfQk9PTCBiRW5jcnlwdCkKLXsKLSAgICBGWF9JTlQzMiBsZW4gPSAwOwotICAgIGlmIChwT2JqID09IE5VTEwpIHsKLSAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiBudWxsIikpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIG1fT2Zmc2V0ICs9IDU7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBzd2l0Y2ggKHBPYmotPkdldFR5cGUoKSkgewotICAgICAgICBjYXNlIFBERk9CSl9OVUxMOgotICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiBudWxsIikpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fT2Zmc2V0ICs9IDU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQREZPQkpfQk9PTEVBTjoKLSAgICAgICAgY2FzZSBQREZPQkpfTlVNQkVSOgotICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAiKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kU3RyaW5nKHBPYmotPkdldFN0cmluZygpKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9PZmZzZXQgKz0gbGVuICsgMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBERk9CSl9TVFJJTkc6IHsKLSAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBwT2JqLT5HZXRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBGWF9CT09MIGJIZXggPSAoKENQREZfU3RyaW5nKilwT2JqKS0+SXNIZXgoKTsKLSAgICAgICAgICAgICAgICBpZiAobV9wQ3J5cHRvSGFuZGxlciA9PSBOVUxMIHx8ICFiRW5jcnlwdCkgewotICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBjb250ZW50ID0gUERGX0VuY29kZVN0cmluZyhzdHIsIGJIZXgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGxlbiA9IG1fRmlsZS5BcHBlbmRTdHJpbmcoY29udGVudCkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1fT2Zmc2V0ICs9IGxlbjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENQREZfRW5jcnlwdG9yIGVuY3J5cHRvcjsKLSAgICAgICAgICAgICAgICBlbmNyeXB0b3IuSW5pdGlhbGl6ZShtX3BDcnlwdG9IYW5kbGVyLCBvYmpudW0sIChGWF9MUEJZVEUpc3RyLmNfc3RyKCksIHN0ci5HZXRMZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY29udGVudCA9IFBERl9FbmNvZGVTdHJpbmcoQ0ZYX0J5dGVTdHJpbmcoKEZYX0xQQ1NUUillbmNyeXB0b3IubV9wRGF0YSwgZW5jcnlwdG9yLm1fZHdTaXplKSwgYkhleCk7Ci0gICAgICAgICAgICAgICAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kU3RyaW5nKGNvbnRlbnQpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX09mZnNldCArPSBsZW47Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgUERGT0JKX1NUUkVBTTogewotICAgICAgICAgICAgICAgIENQREZfRmxhdGVFbmNvZGVyIGVuY29kZXI7Ci0gICAgICAgICAgICAgICAgZW5jb2Rlci5Jbml0aWFsaXplKChDUERGX1N0cmVhbSopcE9iaiwgbV9iQ29tcHJlc3MpOwotICAgICAgICAgICAgICAgIENQREZfRW5jcnlwdG9yIGVuY3J5cHRvcjsKLSAgICAgICAgICAgICAgICBDUERGX0NyeXB0b0hhbmRsZXIqIHBIYW5kbGVyID0gbV9wQ3J5cHRvSGFuZGxlcjsKLSAgICAgICAgICAgICAgICBlbmNyeXB0b3IuSW5pdGlhbGl6ZShwSGFuZGxlciwgb2JqbnVtLCBlbmNvZGVyLm1fcERhdGEsIGVuY29kZXIubV9kd1NpemUpOwotICAgICAgICAgICAgICAgIGlmICgoRlhfRFdPUkQpZW5jb2Rlci5tX3BEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJMZW5ndGgiKSkgIT0gZW5jcnlwdG9yLm1fZHdTaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZXIuQ2xvbmVEaWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZXIubV9wRGljdC0+U2V0QXRJbnRlZ2VyKEZYX0JTVFJDKCJMZW5ndGgiKSwgZW5jcnlwdG9yLm1fZHdTaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFdyaXRlRGlyZWN0T2JqKG9iam51bSwgZW5jb2Rlci5tX3BEaWN0KSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKGxlbiA9IG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoInN0cmVhbVxyXG4iKSkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fT2Zmc2V0ICs9IGxlbjsKLSAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZEJsb2NrKGVuY3J5cHRvci5tX3BEYXRhLCBlbmNyeXB0b3IubV9kd1NpemUpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fT2Zmc2V0ICs9IGVuY3J5cHRvci5tX2R3U2l6ZTsKLSAgICAgICAgICAgICAgICBpZiAoKGxlbiA9IG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIlxyXG5lbmRzdHJlYW0iKSkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fT2Zmc2V0ICs9IGxlbjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBQREZPQkpfTkFNRTogewotICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIvIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IHBPYmotPkdldFN0cmluZygpOwotICAgICAgICAgICAgICAgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZFN0cmluZyhQREZfTmFtZUVuY29kZShzdHIpKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9PZmZzZXQgKz0gbGVuICsgMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOiB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAiKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ1BERl9SZWZlcmVuY2UqIHAgPSAoQ1BERl9SZWZlcmVuY2UqKXBPYmo7Ci0gICAgICAgICAgICAgICAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kRFdvcmQocC0+R2V0UmVmT2JqTnVtKCkpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIDAgUiIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX09mZnNldCArPSBsZW4gKyA1OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIFBERk9CSl9BUlJBWTogewotICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJbIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fT2Zmc2V0ICs9IDE7Ci0gICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcCA9IChDUERGX0FycmF5KilwT2JqOwotICAgICAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwLT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwRWxlbWVudCA9IHAtPkdldEVsZW1lbnQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwRWxlbWVudC0+R2V0T2JqTnVtKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZERXb3JkKHBFbGVtZW50LT5HZXRPYmpOdW0oKSkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgMCBSIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fT2Zmc2V0ICs9IGxlbiArIDU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoV3JpdGVEaXJlY3RPYmoob2JqbnVtLCBwRWxlbWVudCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJdIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fT2Zmc2V0ICs9IDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgUERGT0JKX0RJQ1RJT05BUlk6IHsKLSAgICAgICAgICAgICAgICBpZiAobV9wQ3J5cHRvSGFuZGxlciA9PSBOVUxMIHx8IHBPYmogPT0gbV9wRW5jcnlwdERpY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KHBPYmosICZtX0ZpbGUsIG1fT2Zmc2V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIjw8IikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fT2Zmc2V0ICs9IDI7Ci0gICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwID0gKENQREZfRGljdGlvbmFyeSopcE9iajsKLSAgICAgICAgICAgICAgICBGWF9CT09MIGJTaWduRGljdCA9IElzU2lnbmF0dXJlRGljdChwKTsKLSAgICAgICAgICAgICAgICBGWF9QT1NJVElPTiBwb3MgPSBwLT5HZXRTdGFydFBvcygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2lnblZhbHVlID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGtleTsKLSAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IHAtPkdldE5leHRFbGVtZW50KHBvcywga2V5KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIi8iKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kU3RyaW5nKFBERl9OYW1lRW5jb2RlKGtleSkpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtX09mZnNldCArPSBsZW4gKyAxOwotICAgICAgICAgICAgICAgICAgICBpZiAoYlNpZ25EaWN0ICYmIGtleSA9PSBGWF9CU1RSQygiQ29udGVudHMiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYlNpZ25WYWx1ZSA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBWYWx1ZS0+R2V0T2JqTnVtKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZERXb3JkKHBWYWx1ZS0+R2V0T2JqTnVtKCkpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIDAgUiAiKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbV9PZmZzZXQgKz0gbGVuICsgNjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChXcml0ZURpcmVjdE9iaihvYmpudW0sIHBWYWx1ZSwgIWJTaWduVmFsdWUpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiPj4iKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9PZmZzZXQgKz0gMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci1GWF9JTlQzMiBDUERGX0NyZWF0b3I6OldyaXRlT2xkSW5kaXJlY3RPYmplY3QoRlhfRFdPUkQgb2JqbnVtKQotewotICAgIGlmKG1fcFBhcnNlci0+bV9WNVR5cGVbb2JqbnVtXSA9PSAwIHx8IG1fcFBhcnNlci0+bV9WNVR5cGVbb2JqbnVtXSA9PSAyNTUpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIG1fT2JqZWN0T2Zmc2V0W29iam51bV0gPSBtX09mZnNldDsKLSAgICBGWF9MUFZPSUQgdmFsdWV0ZW1wID0gTlVMTDsKLSAgICBGWF9CT09MIGJFeGlzdEluTWFwID0gbV9wRG9jdW1lbnQtPm1fSW5kaXJlY3RPYmpzLkxvb2t1cCgoRlhfTFBWT0lEKShGWF9VSU5UUFRSKW9iam51bSwgdmFsdWV0ZW1wKTsKLSAgICBGWF9CT09MIGJPYmpTdG0gPSAobV9wUGFyc2VyLT5tX1Y1VHlwZVtvYmpudW1dID09IDIpICYmIG1fcEVuY3J5cHREaWN0ICYmICFtX3BYUmVmU3RyZWFtOwotICAgIGlmKG1fcFBhcnNlci0+bV9iVmVyc2lvblVwZGF0ZWQgfHwgbV9iU2VjdXJpdHlDaGFuZ2VkIHx8IGJFeGlzdEluTWFwIHx8IGJPYmpTdG0pIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBtX3BEb2N1bWVudC0+R2V0SW5kaXJlY3RPYmplY3Qob2JqbnVtKTsKLSAgICAgICAgaWYgKHBPYmogPT0gTlVMTCkgewotICAgICAgICAgICAgbV9PYmplY3RPZmZzZXRbb2JqbnVtXSA9IDA7Ci0gICAgICAgICAgICBtX09iamVjdFNpemVbb2JqbnVtXSA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoV3JpdGVJbmRpcmVjdE9iaihwT2JqKSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmICghYkV4aXN0SW5NYXApIHsKLSAgICAgICAgICAgIG1fcERvY3VtZW50LT5SZWxlYXNlSW5kaXJlY3RPYmplY3Qob2JqbnVtKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYX0JZVEUqIHBCdWZmZXI7Ci0gICAgICAgIEZYX0RXT1JEIHNpemU7Ci0gICAgICAgIG1fcFBhcnNlci0+R2V0SW5kaXJlY3RCaW5hcnkob2JqbnVtLCBwQnVmZmVyLCBzaXplKTsKLSAgICAgICAgaWYgKHBCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fcFBhcnNlci0+bV9WNVR5cGVbb2JqbnVtXSA9PSAyKSB7Ci0gICAgICAgICAgICBpZiAobV9wWFJlZlN0cmVhbSkgewotICAgICAgICAgICAgICAgIGlmIChXcml0ZUluZGlyZWN0T2JqZWN0VG9TdHJlYW0ob2JqbnVtLCBwQnVmZmVyLCBzaXplKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfRnJlZShwQnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgRlhfSU5UMzIgbGVuID0gbV9GaWxlLkFwcGVuZERXb3JkKG9iam51bSk7Ci0gICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiIDAgb2JqICIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX09mZnNldCArPSBsZW4gKyA3OwotICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kQmxvY2socEJ1ZmZlciwgc2l6ZSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9PZmZzZXQgKz0gc2l6ZTsKLSAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXHJcbmVuZG9ialxyXG4iKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9PZmZzZXQgKz0gMTA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZEJsb2NrKHBCdWZmZXIsIHNpemUpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fT2Zmc2V0ICs9IHNpemU7Ci0gICAgICAgICAgICBpZihBcHBlbmRPYmplY3ROdW1iZXJUb1hSZWYob2JqbnVtKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRnJlZShwQnVmZmVyKTsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci1GWF9JTlQzMiBDUERGX0NyZWF0b3I6OldyaXRlT2xkT2JqcyhJRlhfUGF1c2UgKnBQYXVzZSkKLXsKLSAgICBGWF9EV09SRCBuT2xkU2l6ZSA9IG1fcFBhcnNlci0+bV9Dcm9zc1JlZi5HZXRTaXplKCk7Ci0gICAgRlhfRFdPUkQgb2JqbnVtID0gKEZYX0RXT1JEKShGWF9VSU5UUFRSKW1fUG9zOwotICAgIGZvcig7IG9iam51bSA8IG5PbGRTaXplOyBvYmpudW0gKyspIHsKLSAgICAgICAgRlhfSU5UMzIgaVJldCA9IFdyaXRlT2xkSW5kaXJlY3RPYmplY3Qob2JqbnVtKTsKLSAgICAgICAgaWYgKCFpUmV0KSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaVJldCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBpUmV0OwotICAgICAgICB9Ci0gICAgICAgIG1fT2JqZWN0U2l6ZVtvYmpudW1dID0gKEZYX0RXT1JEKShtX09mZnNldCAtIG1fT2JqZWN0T2Zmc2V0W29iam51bV0pOwotICAgICAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewotICAgICAgICAgICAgbV9Qb3MgPSAoRlhfTFBWT0lEKShGWF9VSU5UUFRSKShvYmpudW0gKyAxKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotRlhfSU5UMzIgQ1BERl9DcmVhdG9yOjpXcml0ZU5ld09ianMoRlhfQk9PTCBiSW5jcmVtZW50YWwsIElGWF9QYXVzZSAqcFBhdXNlKQotewotICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fTmV3T2JqTnVtQXJyYXkuR2V0U2l6ZSgpOwotICAgIEZYX0lOVDMyIGluZGV4ID0gKEZYX0lOVDMyKShGWF9VSU5UUFRSKW1fUG9zOwotICAgIHdoaWxlIChpbmRleCA8IGlDb3VudCkgewotICAgICAgICBGWF9EV09SRCBvYmpudW0gPSBtX05ld09iak51bUFycmF5LkVsZW1lbnRBdChpbmRleCk7Ci0gICAgICAgIENQREZfT2JqZWN0ICpwT2JqID0gTlVMTDsKLSAgICAgICAgbV9wRG9jdW1lbnQtPm1fSW5kaXJlY3RPYmpzLkxvb2t1cCgoRlhfTFBWT0lEKShGWF9VSU5UUFRSKW9iam51bSwgKEZYX0xQVk9JRCYpcE9iaik7Ci0gICAgICAgIGlmIChOVUxMID09IHBPYmopIHsKLSAgICAgICAgICAgICsraW5kZXg7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBtX09iamVjdE9mZnNldFtvYmpudW1dID0gbV9PZmZzZXQ7Ci0gICAgICAgIGlmIChXcml0ZUluZGlyZWN0T2JqKHBPYmopKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgbV9PYmplY3RTaXplW29iam51bV0gPSAoRlhfRFdPUkQpKG1fT2Zmc2V0IC0gbV9PYmplY3RPZmZzZXRbb2JqbnVtXSk7Ci0gICAgICAgIGluZGV4Kys7Ci0gICAgICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7Ci0gICAgICAgICAgICBtX1BvcyA9IChGWF9QT1NJVElPTikoRlhfVUlOVFBUUilpbmRleDsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotdm9pZCBDUERGX0NyZWF0b3I6OkluaXRPbGRPYmpOdW1PZmZzZXRzKCkKLXsKLSAgICBpZiAoIW1fcFBhcnNlcikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYX0RXT1JEIGogPSAwOwotICAgIEZYX0RXT1JEIGR3U3RhcnQgPSAwOwotICAgIEZYX0RXT1JEIGR3RW5kID0gbV9wUGFyc2VyLT5HZXRMYXN0T2JqTnVtKCk7Ci0gICAgd2hpbGUgKGR3U3RhcnQgPD0gZHdFbmQpIHsKLSAgICAgICAgd2hpbGUgKGR3U3RhcnQgPD0gZHdFbmQgJiYgKG1fcFBhcnNlci0+bV9WNVR5cGVbZHdTdGFydF0gPT0gMCB8fCBtX3BQYXJzZXItPm1fVjVUeXBlW2R3U3RhcnRdID09IDI1NSkpIHsKLSAgICAgICAgICAgIGR3U3RhcnQrKzsKLSAgICAgICAgfQotICAgICAgICBpZiAoZHdTdGFydCA+IGR3RW5kKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBqID0gZHdTdGFydDsKLSAgICAgICAgd2hpbGUgKGogPD0gZHdFbmQgJiYgbV9wUGFyc2VyLT5tX1Y1VHlwZVtqXSAhPSAwICYmIG1fcFBhcnNlci0+bV9WNVR5cGVbal0gIT0gMjU1KSB7Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgIH0KLSAgICAgICAgbV9PYmplY3RPZmZzZXQuQWRkKGR3U3RhcnQsIGogLSBkd1N0YXJ0KTsKLSAgICAgICAgbV9PYmplY3RTaXplLkFkZChkd1N0YXJ0LCBqIC0gZHdTdGFydCk7Ci0gICAgICAgIGR3U3RhcnQgPSBqOwotICAgIH0KLX0KLXZvaWQgQ1BERl9DcmVhdG9yOjpJbml0TmV3T2JqTnVtT2Zmc2V0cygpCi17Ci0gICAgRlhfQk9PTCBiSW5jcmVtZW50YWwgPSAobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgIT0gMDsKLSAgICBGWF9CT09MIGJOb09yaWdpbmFsID0gKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfTk9fT1JJR0lOQUwpICE9IDA7Ci0gICAgRlhfRFdPUkQgbk9sZFNpemUgPSBtX3BQYXJzZXIgPyBtX3BQYXJzZXItPm1fQ3Jvc3NSZWYuR2V0U2l6ZSgpIDogMDsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBtX3BEb2N1bWVudC0+bV9JbmRpcmVjdE9ianMuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgc2l6ZV90IGtleSA9IDA7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwT2JqOwotICAgICAgICBtX3BEb2N1bWVudC0+bV9JbmRpcmVjdE9ianMuR2V0TmV4dEFzc29jKHBvcywgKEZYX0xQVk9JRCYpa2V5LCAoRlhfTFBWT0lEJilwT2JqKTsKLSAgICAgICAgRlhfRFdPUkQgb2JqbnVtID0gKEZYX0RXT1JEKWtleTsKLSAgICAgICAgaWYgKHBPYmotPkdldE9iak51bSgpID09IC0xKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYkluY3JlbWVudGFsKSB7Ci0gICAgICAgICAgICBpZiAoIXBPYmotPklzTW9kaWZpZWQoKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG9iam51bSA8IG5PbGRTaXplICYmIG1fcFBhcnNlci0+bV9WNVR5cGVbb2JqbnVtXSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQXBwZW5kTmV3T2JqTnVtKG9iam51bSk7Ci0gICAgfQotICAgIEZYX0lOVDMyIGlDb3VudCA9IG1fTmV3T2JqTnVtQXJyYXkuR2V0U2l6ZSgpOwotICAgIGlmIChpQ291bnQgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYX0lOVDMyIGkgPSAwOwotICAgIEZYX0RXT1JEIGR3U3RhcnRPYmpOdW0gPSAwOwotICAgIEZYX0JPT0wgYkNyb3NzUmVmVmFsaWQgPSBtX3BQYXJzZXIgJiYgbV9wUGFyc2VyLT5HZXRMYXN0WFJlZk9mZnNldCgpID4gMDsKLSAgICB3aGlsZSAoaSA8IGlDb3VudCkgewotICAgICAgICBkd1N0YXJ0T2JqTnVtID0gbV9OZXdPYmpOdW1BcnJheS5FbGVtZW50QXQoaSk7Ci0gICAgICAgIGlmICgoYkluY3JlbWVudGFsICYmIChiTm9PcmlnaW5hbCB8fCBiQ3Jvc3NSZWZWYWxpZCkpIHx8ICFtX09iamVjdE9mZnNldC5HZXRQdHJBdChkd1N0YXJ0T2JqTnVtKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaSsrOwotICAgIH0KLSAgICBpZiAoaSA+PSBpQ291bnQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9EV09SRCBkd0xhc3RPYmpOdW0gPSBkd1N0YXJ0T2JqTnVtOwotICAgIGkrKzsKLSAgICBGWF9CT09MIGJOZXdTdGFydCA9IEZBTFNFOwotICAgIGZvciAoOyBpIDwgaUNvdW50OyBpKyspIHsKLSAgICAgICAgRlhfRFdPUkQgZHdDdXJPYmpOdW0gPSBtX05ld09iak51bUFycmF5LkVsZW1lbnRBdChpKTsKLSAgICAgICAgRlhfQk9PTCBiRXhpc3QgPSAoZHdDdXJPYmpOdW0gPCBuT2xkU2l6ZSAmJiBtX09iamVjdE9mZnNldC5HZXRQdHJBdChkd0N1ck9iak51bSkgIT0gTlVMTCk7Ci0gICAgICAgIGlmIChiRXhpc3QgfHwgZHdDdXJPYmpOdW0gLSBkd0xhc3RPYmpOdW0gPiAxKSB7Ci0gICAgICAgICAgICBpZiAoIWJOZXdTdGFydCkgewotICAgICAgICAgICAgICAgIG1fT2JqZWN0T2Zmc2V0LkFkZChkd1N0YXJ0T2JqTnVtLCBkd0xhc3RPYmpOdW0gLSBkd1N0YXJ0T2JqTnVtICsgMSk7Ci0gICAgICAgICAgICAgICAgbV9PYmplY3RTaXplLkFkZChkd1N0YXJ0T2JqTnVtLCBkd0xhc3RPYmpOdW0gLSBkd1N0YXJ0T2JqTnVtICsgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkd1N0YXJ0T2JqTnVtID0gZHdDdXJPYmpOdW07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJOZXdTdGFydCkgewotICAgICAgICAgICAgZHdTdGFydE9iak51bSA9IGR3Q3VyT2JqTnVtOwotICAgICAgICB9Ci0gICAgICAgIGJOZXdTdGFydCA9IGJFeGlzdDsKLSAgICAgICAgZHdMYXN0T2JqTnVtID0gZHdDdXJPYmpOdW07Ci0gICAgfQotICAgIG1fT2JqZWN0T2Zmc2V0LkFkZChkd1N0YXJ0T2JqTnVtLCBkd0xhc3RPYmpOdW0gLSBkd1N0YXJ0T2JqTnVtICsgMSk7Ci0gICAgbV9PYmplY3RTaXplLkFkZChkd1N0YXJ0T2JqTnVtLCBkd0xhc3RPYmpOdW0gLSBkd1N0YXJ0T2JqTnVtICsgMSk7Ci19Ci12b2lkIENQREZfQ3JlYXRvcjo6QXBwZW5kTmV3T2JqTnVtKEZYX0RXT1JEIG9iamJ1bSkKLXsKLSAgICBGWF9JTlQzMiBpU3RhcnQgPSAwLCBpRmluZCA9IDA7Ci0gICAgRlhfSU5UMzIgaUVuZCA9IG1fTmV3T2JqTnVtQXJyYXkuR2V0VXBwZXJCb3VuZCgpOwotICAgIHdoaWxlIChpU3RhcnQgPD0gaUVuZCkgewotICAgICAgICBGWF9JTlQzMiBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsKLSAgICAgICAgRlhfRFdPUkQgZHdNaWQgPSBtX05ld09iak51bUFycmF5LkVsZW1lbnRBdChpTWlkKTsKLSAgICAgICAgaWYgKG9iamJ1bSA8IGR3TWlkKSB7Ci0gICAgICAgICAgICBpRW5kID0gaU1pZCAtIDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoaU1pZCA9PSBpRW5kKSB7Ci0gICAgICAgICAgICAgICAgaUZpbmQgPSBpTWlkICsgMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX0RXT1JEIGR3TmV4dCA9IG1fTmV3T2JqTnVtQXJyYXkuRWxlbWVudEF0KGlNaWQgKyAxKTsKLSAgICAgICAgICAgIGlmIChvYmpidW0gPCBkd05leHQpIHsKLSAgICAgICAgICAgICAgICBpRmluZCA9IGlNaWQgKyAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9OZXdPYmpOdW1BcnJheS5JbnNlcnRBdChpRmluZCwgb2JqYnVtKTsKLX0KLUZYX0lOVDMyIENQREZfQ3JlYXRvcjo6V3JpdGVEb2NfU3RhZ2UxKElGWF9QYXVzZSAqcFBhdXNlKQotewotICAgIEZYU1lTX2Fzc2VydChtX2lTdGFnZSA+IC0xIHx8IG1faVN0YWdlIDwgMjApOwotICAgIGlmIChtX2lTdGFnZSA9PSAwKSB7Ci0gICAgICAgIGlmIChtX3BQYXJzZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgbV9kd0ZsYWdzICY9IH5GUERGQ1JFQVRFX0lOQ1JFTUVOVEFMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX2JTZWN1cml0eUNoYW5nZWQgJiYgKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfTk9fT1JJR0lOQUwpID09IDApIHsKLSAgICAgICAgICAgIG1fZHdGbGFncyAmPSB+RlBERkNSRUFURV9JTkNSRU1FTlRBTDsKLSAgICAgICAgfQotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKTsKLSAgICAgICAgbV9wTWV0YWRhdGEgPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIk1ldGFkYXRhIikpIDogTlVMTDsKLSAgICAgICAgaWYgKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfT0JKRUNUU1RSRUFNKSB7Ci0gICAgICAgICAgICBtX3BYUmVmU3RyZWFtID0gbmV3IENQREZfWFJlZlN0cmVhbTsKLSAgICAgICAgICAgIG1fcFhSZWZTdHJlYW0tPlN0YXJ0KCk7Ci0gICAgICAgICAgICBpZiAoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpICE9IDAgJiYgbV9wUGFyc2VyKSB7Ci0gICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgcHJldiA9IG1fcFBhcnNlci0+R2V0TGFzdFhSZWZPZmZzZXQoKTsKLSAgICAgICAgICAgICAgICBtX3BYUmVmU3RyZWFtLT5tX1ByZXZPZmZzZXQgPSBwcmV2OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1faVN0YWdlID0gMTA7Ci0gICAgfQotICAgIGlmIChtX2lTdGFnZSA9PSAxMCkgewotICAgICAgICBpZiAoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpID09IDApIHsKLSAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIlUERGLTEuIikpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fT2Zmc2V0ICs9IDc7Ci0gICAgICAgICAgICBGWF9JTlQzMiB2ZXJzaW9uID0gNzsKLSAgICAgICAgICAgIGlmIChtX0ZpbGVWZXJzaW9uKSB7Ci0gICAgICAgICAgICAgICAgdmVyc2lvbiA9IG1fRmlsZVZlcnNpb247Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1fcFBhcnNlcikgewotICAgICAgICAgICAgICAgIHZlcnNpb24gPSBtX3BQYXJzZXItPkdldEZpbGVWZXJzaW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9JTlQzMiBsZW4gPSBtX0ZpbGUuQXBwZW5kRFdvcmQodmVyc2lvbiAlIDEwKTsKLSAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9PZmZzZXQgKz0gbGVuOwotICAgICAgICAgICAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCJcclxuJVx4QTFceEIzXHhDNVx4RDdcclxuIikpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX09mZnNldCArPSBsZW47Ci0gICAgICAgICAgICBJbml0T2xkT2JqTnVtT2Zmc2V0cygpOwotICAgICAgICAgICAgbV9pU3RhZ2UgPSAyMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIElGWF9GaWxlUmVhZCogcFNyY0ZpbGUgPSBtX3BQYXJzZXItPkdldEZpbGVBY2Nlc3MoKTsKLSAgICAgICAgICAgIG1fT2Zmc2V0ID0gcFNyY0ZpbGUtPkdldFNpemUoKTsKLSAgICAgICAgICAgIG1fUG9zID0gKEZYX0xQVk9JRCkoRlhfVUlOVFBUUiltX09mZnNldDsKLSAgICAgICAgICAgIG1faVN0YWdlID0gMTU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1faVN0YWdlID09IDE1KSB7Ci0gICAgICAgIGlmICgobV9kd0ZsYWdzICYgRlBERkNSRUFURV9OT19PUklHSU5BTCkgPT0gMCAmJiBtX1BvcykgewotICAgICAgICAgICAgSUZYX0ZpbGVSZWFkKiBwU3JjRmlsZSA9IG1fcFBhcnNlci0+R2V0RmlsZUFjY2VzcygpOwotICAgICAgICAgICAgRlhfQllURSBidWZmZXJbNDA5Nl07Ci0gICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSA9IChGWF9EV09SRCkoRlhfVUlOVFBUUiltX1BvczsKLSAgICAgICAgICAgIHdoaWxlIChzcmNfc2l6ZSkgewotICAgICAgICAgICAgICAgIEZYX0RXT1JEIGJsb2NrX3NpemUgPSBzcmNfc2l6ZSA+IDQwOTYgPyA0MDk2IDogc3JjX3NpemU7Ci0gICAgICAgICAgICAgICAgaWYgKCFwU3JjRmlsZS0+UmVhZEJsb2NrKGJ1ZmZlciwgbV9PZmZzZXQgLSBzcmNfc2l6ZSwgYmxvY2tfc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZEJsb2NrKGJ1ZmZlciwgYmxvY2tfc2l6ZSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3JjX3NpemUgLT0gYmxvY2tfc2l6ZTsKLSAgICAgICAgICAgICAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewotICAgICAgICAgICAgICAgICAgICBtX1BvcyA9IChGWF9MUFZPSUQpKEZYX1VJTlRQVFIpc3JjX3NpemU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfTk9fT1JJR0lOQUwpID09IDAgJiYgbV9wUGFyc2VyLT5HZXRMYXN0WFJlZk9mZnNldCgpID09IDApIHsKLSAgICAgICAgICAgIEluaXRPbGRPYmpOdW1PZmZzZXRzKCk7Ci0gICAgICAgICAgICBGWF9EV09SRCBkd0VuZCA9IG1fcFBhcnNlci0+R2V0TGFzdE9iak51bSgpOwotICAgICAgICAgICAgRlhfQk9PTCBiT2JqU3RtID0gKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfT0JKRUNUU1RSRUFNKSAhPSAwOwotICAgICAgICAgICAgZm9yIChGWF9EV09SRCBvYmpudW0gPSAwOyBvYmpudW0gPD0gZHdFbmQ7IG9iam51bSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fcFBhcnNlci0+bV9WNVR5cGVbb2JqbnVtXSA9PSAwIHx8IG1fcFBhcnNlci0+bV9WNVR5cGVbb2JqbnVtXSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fT2JqZWN0T2Zmc2V0W29iam51bV0gPSBtX3BQYXJzZXItPm1fQ3Jvc3NSZWZbb2JqbnVtXTsKLSAgICAgICAgICAgICAgICBpZiAoYk9ialN0bSkgewotICAgICAgICAgICAgICAgICAgICBtX3BYUmVmU3RyZWFtLT5BZGRPYmplY3ROdW1iZXJUb0luZGV4QXJyYXkob2JqbnVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYk9ialN0bSkgewotICAgICAgICAgICAgICAgIG1fcFhSZWZTdHJlYW0tPkVuZFhSZWZTdHJlYW0odGhpcyk7Ci0gICAgICAgICAgICAgICAgbV9wWFJlZlN0cmVhbS0+U3RhcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX2lTdGFnZSA9IDIwOwotICAgIH0KLSAgICBJbml0TmV3T2JqTnVtT2Zmc2V0cygpOwotICAgIHJldHVybiBtX2lTdGFnZTsKLX0KLUZYX0lOVDMyIENQREZfQ3JlYXRvcjo6V3JpdGVEb2NfU3RhZ2UyKElGWF9QYXVzZSAqcFBhdXNlKQotewotICAgIEZYU1lTX2Fzc2VydChtX2lTdGFnZSA+PSAyMCB8fCBtX2lTdGFnZSA8IDMwKTsKLSAgICBpZiAobV9pU3RhZ2UgPT0gMjApIHsKLSAgICAgICAgaWYgKChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSA9PSAwICYmIG1fcFBhcnNlcikgewotICAgICAgICAgICAgbV9Qb3MgPSAoRlhfTFBWT0lEKShGWF9VSU5UUFRSKTA7Ci0gICAgICAgICAgICBtX2lTdGFnZSA9IDIxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9pU3RhZ2UgPSAyNTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9pU3RhZ2UgPT0gMjEpIHsKLSAgICAgICAgRlhfSU5UMzIgaVJldCA9IFdyaXRlT2xkT2JqcyhwUGF1c2UpOwotICAgICAgICBpZiAoaVJldCkgewotICAgICAgICAgICAgcmV0dXJuIGlSZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgbV9pU3RhZ2UgPSAyNTsKLSAgICB9Ci0gICAgaWYgKG1faVN0YWdlID09IDI1KSB7Ci0gICAgICAgIG1fUG9zID0gKEZYX0xQVk9JRCkoRlhfVUlOVFBUUikwOwotICAgICAgICBtX2lTdGFnZSA9IDI2OwotICAgIH0KLSAgICBpZiAobV9pU3RhZ2UgPT0gMjYpIHsKLSAgICAgICAgRlhfSU5UMzIgaVJldCA9IFdyaXRlTmV3T2JqcygobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgIT0gMCwgcFBhdXNlKTsKLSAgICAgICAgaWYgKGlSZXQpIHsKLSAgICAgICAgICAgIHJldHVybiBpUmV0OwotICAgICAgICB9Ci0gICAgICAgIG1faVN0YWdlID0gMjc7Ci0gICAgfQotICAgIGlmIChtX2lTdGFnZSA9PSAyNykgewotICAgICAgICBpZiAoTlVMTCAhPSBtX3BFbmNyeXB0RGljdCAmJiAwID09IG1fcEVuY3J5cHREaWN0LT5HZXRPYmpOdW0oKSkgewotICAgICAgICAgICAgbV9kd0xhc3RPYmpOdW0gKz0gMTsKLSAgICAgICAgICAgIEZYX0ZJTEVTSVpFIHNhdmVPZmZzZXQgPSBtX09mZnNldDsKLSAgICAgICAgICAgIGlmIChXcml0ZUluZGlyZWN0T2JqKG1fZHdMYXN0T2JqTnVtLCBtX3BFbmNyeXB0RGljdCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9PYmplY3RPZmZzZXQuQWRkKG1fZHdMYXN0T2JqTnVtLCAxKTsKLSAgICAgICAgICAgIG1fT2JqZWN0T2Zmc2V0W21fZHdMYXN0T2JqTnVtXSA9IHNhdmVPZmZzZXQ7Ci0gICAgICAgICAgICBtX09iamVjdFNpemUuQWRkKG1fZHdMYXN0T2JqTnVtLCAxKTsKLSAgICAgICAgICAgIG1fT2JqZWN0U2l6ZVttX2R3TGFzdE9iak51bV0gPSBtX09mZnNldCAtIHNhdmVPZmZzZXQ7Ci0gICAgICAgICAgICBtX2R3RW5yeXB0T2JqTnVtID0gbV9kd0xhc3RPYmpOdW07Ci0gICAgICAgICAgICBpZiAobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgewotICAgICAgICAgICAgICAgIG1fTmV3T2JqTnVtQXJyYXkuQWRkKG1fZHdMYXN0T2JqTnVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX2lTdGFnZSA9IDgwOwotICAgIH0KLSAgICByZXR1cm4gbV9pU3RhZ2U7Ci19Ci1GWF9JTlQzMiBDUERGX0NyZWF0b3I6OldyaXRlRG9jX1N0YWdlMyhJRlhfUGF1c2UgKnBQYXVzZSkKLXsKLSAgICBGWFNZU19hc3NlcnQobV9pU3RhZ2UgPj0gODAgfHwgbV9pU3RhZ2UgPCA5MCk7Ci0gICAgRlhfRFdPUkQgZHdMYXN0T2JqTnVtID0gbV9kd0xhc3RPYmpOdW07Ci0gICAgaWYgKG1faVN0YWdlID09IDgwKSB7Ci0gICAgICAgIG1fWHJlZlN0YXJ0ID0gbV9PZmZzZXQ7Ci0gICAgICAgIGlmIChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX09CSkVDVFNUUkVBTSkgewotICAgICAgICAgICAgbV9wWFJlZlN0cmVhbS0+RW5kKHRoaXMsIFRSVUUpOwotICAgICAgICAgICAgbV9YcmVmU3RhcnQgPSBtX3BYUmVmU3RyZWFtLT5tX1ByZXZPZmZzZXQ7Ci0gICAgICAgICAgICBtX2lTdGFnZSA9IDkwOwotICAgICAgICB9IGVsc2UgaWYgKChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSA9PSAwIHx8ICFtX3BQYXJzZXItPklzWFJlZlN0cmVhbSgpKSB7Ci0gICAgICAgICAgICBpZiAoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpID09IDAgfHwgbV9wUGFyc2VyLT5HZXRMYXN0WFJlZk9mZnNldCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHI7Ci0gICAgICAgICAgICAgICAgc3RyID0gbV9PYmplY3RPZmZzZXQuR2V0UHRyQXQoMSkgPyBGWF9CU1RSQygieHJlZlxyXG4iKSA6IEZYX0JTVFJDKCJ4cmVmXHJcbjAgMVxyXG4wMDAwMDAwMDAwIDY1NTM2IGZcclxuIik7Ci0gICAgICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoc3RyKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX1BvcyA9IChGWF9MUFZPSUQpKEZYX1VJTlRQVFIpMTsKLSAgICAgICAgICAgICAgICBtX2lTdGFnZSA9IDgxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygieHJlZlxyXG4iKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9Qb3MgPSAoRlhfTFBWT0lEKShGWF9VSU5UUFRSKTA7Ci0gICAgICAgICAgICAgICAgbV9pU3RhZ2UgPSA4MjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1faVN0YWdlID0gOTA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1faVN0YWdlID09IDgxKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKLSAgICAgICAgRlhfRFdPUkQgaSA9IChGWF9EV09SRCkoRlhfVUlOVFBUUiltX1BvcywgajsKLSAgICAgICAgd2hpbGUgKGkgPD0gZHdMYXN0T2JqTnVtKSB7Ci0gICAgICAgICAgICB3aGlsZSAoaSA8PSBkd0xhc3RPYmpOdW0gJiYgIW1fT2JqZWN0T2Zmc2V0LkdldFB0ckF0KGkpKSB7Ci0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkgPiBkd0xhc3RPYmpOdW0pIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGogPSBpOwotICAgICAgICAgICAgd2hpbGUgKGogPD0gZHdMYXN0T2JqTnVtICYmIG1fT2JqZWN0T2Zmc2V0LkdldFB0ckF0KGopKSB7Ci0gICAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkgPT0gMSkgewotICAgICAgICAgICAgICAgIHN0ci5Gb3JtYXQoIjAgJWRcclxuMDAwMDAwMDAwMCA2NTUzNiBmXHJcbiIsIGopOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHIuRm9ybWF0KCIlZCAlZFxyXG4iLCBpLCBqIC0gaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZEJsb2NrKHN0ci5jX3N0cigpLCBzdHIuR2V0TGVuZ3RoKCkpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChpIDwgaikgewotICAgICAgICAgICAgICAgIHN0ci5Gb3JtYXQoIiUwMTBkIDAwMDAwIG5cclxuIiwgbV9PYmplY3RPZmZzZXRbaSArK10pOwotICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kQmxvY2soc3RyLmNfc3RyKCksIHN0ci5HZXRMZW5ndGgoKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaSA+IGR3TGFzdE9iak51bSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgICAgICBtX1BvcyA9IChGWF9MUFZPSUQpKEZYX1VJTlRQVFIpaTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX2lTdGFnZSA9IDkwOwotICAgIH0KLSAgICBpZiAobV9pU3RhZ2UgPT0gODIpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyOwotICAgICAgICBGWF9JTlQzMiBpQ291bnQgPSBtX05ld09iak51bUFycmF5LkdldFNpemUoKTsKLSAgICAgICAgRlhfSU5UMzIgaSA9IChGWF9JTlQzMikoRlhfVUlOVFBUUiltX1BvczsKLSAgICAgICAgd2hpbGUgKGkgPCBpQ291bnQpIHsKLSAgICAgICAgICAgIEZYX0lOVDMyIGogPSBpOwotICAgICAgICAgICAgRlhfRFdPUkQgb2JqbnVtID0gbV9OZXdPYmpOdW1BcnJheS5FbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICB3aGlsZSAoaiA8IGlDb3VudCkgewotICAgICAgICAgICAgICAgIGlmICgrK2ogPT0gaUNvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0N1cnJlbnQgPSBtX05ld09iak51bUFycmF5LkVsZW1lbnRBdChqKTsKLSAgICAgICAgICAgICAgICBpZiAoZHdDdXJyZW50IC0gb2JqbnVtID4gMSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2JqbnVtID0gZHdDdXJyZW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2JqbnVtID0gbV9OZXdPYmpOdW1BcnJheS5FbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICBpZiAob2JqbnVtID09IDEpIHsKLSAgICAgICAgICAgICAgICBzdHIuRm9ybWF0KCIwICVkXHJcbjAwMDAwMDAwMDAgNjU1MzYgZlxyXG4iLCBqIC0gaSArIDEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHIuRm9ybWF0KCIlZCAlZFxyXG4iLCBvYmpudW0sIGogLSBpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kQmxvY2soc3RyLmNfc3RyKCksIHN0ci5HZXRMZW5ndGgoKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKGkgPCBqKSB7Ci0gICAgICAgICAgICAgICAgb2JqbnVtID0gbV9OZXdPYmpOdW1BcnJheS5FbGVtZW50QXQoaSsrKTsKLSAgICAgICAgICAgICAgICBzdHIuRm9ybWF0KCIlMDEwZCAwMDAwMCBuXHJcbiIsIG1fT2JqZWN0T2Zmc2V0W29iam51bV0pOwotICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kQmxvY2soc3RyLmNfc3RyKCksIHN0ci5HZXRMZW5ndGgoKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocFBhdXNlICYmIChpICUgMTAwKSA9PSAwICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewotICAgICAgICAgICAgICAgIG1fUG9zID0gKEZYX0xQVk9JRCkoRlhfVUlOVFBUUilpOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1faVN0YWdlID0gOTA7Ci0gICAgfQotICAgIHJldHVybiBtX2lTdGFnZTsKLX0KLXN0YXRpYyBGWF9JTlQzMiBfT3V0UHV0SW5kZXgoQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlKiBwRmlsZSwgRlhfRklMRVNJWkUgb2Zmc2V0KQotewotICAgIEZYU1lTX2Fzc2VydChwRmlsZSk7Ci0gICAgaWYgKHNpemVvZihvZmZzZXQpID4gNCkgewotICAgICAgICBpZiAoRlhfR0VUQllURU9GRlNFVDMyKG9mZnNldCkpIHsKLSAgICAgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUNTYob2Zmc2V0KSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQ0OChvZmZzZXQpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocEZpbGUtPkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDQwKG9mZnNldCkpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUMzIob2Zmc2V0KSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwRmlsZS0+QXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUMjQob2Zmc2V0KSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKHBGaWxlLT5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQxNihvZmZzZXQpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAocEZpbGUtPkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDgob2Zmc2V0KSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKHBGaWxlLT5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQwKG9mZnNldCkpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChwRmlsZS0+QXBwZW5kQnl0ZSgwKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLUZYX0lOVDMyIENQREZfQ3JlYXRvcjo6V3JpdGVEb2NfU3RhZ2U0KElGWF9QYXVzZSAqcFBhdXNlKQotewotICAgIEZYU1lTX2Fzc2VydChtX2lTdGFnZSA+PSA5MCk7Ci0gICAgaWYgKChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX09CSkVDVFNUUkVBTSkgPT0gMCkgewotICAgICAgICBGWF9CT09MIGJYUmVmU3RyZWFtID0gKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpICE9IDAgJiYgbV9wUGFyc2VyLT5Jc1hSZWZTdHJlYW0oKTsKLSAgICAgICAgaWYgKCFiWFJlZlN0cmVhbSkgewotICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoInRyYWlsZXJcclxuPDwiKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmREV29yZChtX3BEb2N1bWVudC0+bV9MYXN0T2JqTnVtICsgMSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAwIG9iaiA8PCIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fcFBhcnNlcikgewotICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwID0gbV9wUGFyc2VyLT5tX3BUcmFpbGVyOwotICAgICAgICAgICAgRlhfUE9TSVRJT04gcG9zID0gcC0+R2V0U3RhcnRQb3MoKTsKLSAgICAgICAgICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBrZXk7Ci0gICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IHAtPkdldE5leHRFbGVtZW50KHBvcywga2V5KTsKLSAgICAgICAgICAgICAgICBpZiAoa2V5ID09IEZYX0JTVFJDKCJFbmNyeXB0IikgfHwga2V5ID09IEZYX0JTVFJDKCJTaXplIikgfHwga2V5ID09IEZYX0JTVFJDKCJGaWx0ZXIiKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAga2V5ID09IEZYX0JTVFJDKCJJbmRleCIpIHx8IGtleSA9PSBGWF9CU1RSQygiTGVuZ3RoIikgfHwga2V5ID09IEZYX0JTVFJDKCJQcmV2IikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9PSBGWF9CU1RSQygiVyIpIHx8IGtleSA9PSBGWF9CU1RSQygiWFJlZlN0bSIpIHx8IGtleSA9PSBGWF9CU1RSQygiSUQiKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoKEZYX0JTVFJDKCIvIikpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhQREZfTmFtZUVuY29kZShrZXkpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocFZhbHVlLT5HZXRPYmpOdW0oKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiICIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZERXb3JkKHBWYWx1ZS0+R2V0T2JqTnVtKCkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgMCBSICIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChQREZfQ3JlYXRvckFwcGVuZE9iamVjdChwVmFsdWUsICZtX0ZpbGUsIG9mZnNldCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXHJcbi9Sb290ICIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZERXb3JkKG1fcERvY3VtZW50LT5tX3BSb290RGljdC0+R2V0T2JqTnVtKCkpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgMCBSXHJcbiIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9wRG9jdW1lbnQtPm1fcEluZm9EaWN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIi9JbmZvICIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZERXb3JkKG1fcERvY3VtZW50LT5tX3BJbmZvRGljdC0+R2V0T2JqTnVtKCkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgMCBSXHJcbiIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobV9wRW5jcnlwdERpY3QpIHsKLSAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIvRW5jcnlwdCIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9EV09SRCBkd09iak51bSA9IG1fcEVuY3J5cHREaWN0LT5HZXRPYmpOdW0oKTsKLSAgICAgICAgICAgIGlmIChkd09iak51bSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZHdPYmpOdW0gPSBtX3BEb2N1bWVudC0+R2V0TGFzdE9iak51bSgpICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgIikpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kRFdvcmQoZHdPYmpOdW0pIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIgMCBSICIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIi9TaXplICIpKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9GaWxlLkFwcGVuZERXb3JkKG1fZHdMYXN0T2JqTnVtICsgKGJYUmVmU3RyZWFtID8gMiA6IDEpKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpICE9IDApIHsKLSAgICAgICAgICAgIEZYX0ZJTEVTSVpFIHByZXYgPSBtX3BQYXJzZXItPkdldExhc3RYUmVmT2Zmc2V0KCk7Ci0gICAgICAgICAgICBpZiAocHJldikgewotICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKEZYX0JTVFJDKCIvUHJldiAiKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhfQ0hBUiBvZmZzZXRfYnVmWzIwXTsKLSAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQzMihvZmZzZXRfYnVmLCAwLCBzaXplb2Yob2Zmc2V0X2J1ZikpOwotICAgICAgICAgICAgICAgIEZYU1lTX2k2NHRvYShwcmV2LCBvZmZzZXRfYnVmLCAxMCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRCbG9jayhvZmZzZXRfYnVmLCBGWFNZU19zdHJsZW4ob2Zmc2V0X2J1ZikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtX3BJREFycmF5KSB7Ci0gICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygoRlhfQlNUUkMoIi9JRCIpKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIGlmIChQREZfQ3JlYXRvckFwcGVuZE9iamVjdChtX3BJREFycmF5LCAmbV9GaWxlLCBvZmZzZXQpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWJYUmVmU3RyZWFtKSB7Ci0gICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiPj4iKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIi9XWzAgNCAxXS9JbmRleFsiKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSAhPSAwICYmIG1fcFBhcnNlciAmJiBtX3BQYXJzZXItPkdldExhc3RYUmVmT2Zmc2V0KCkgPT0gMCkgewotICAgICAgICAgICAgICAgIEZYX0RXT1JEIGkgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtX2R3TGFzdE9iak51bTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbV9PYmplY3RPZmZzZXQuR2V0UHRyQXQoaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kRFdvcmQoaSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAxICIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXS9MZW5ndGggIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kRFdvcmQobV9kd0xhc3RPYmpOdW0gKiA1KSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiPj5zdHJlYW1cclxuIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtX2R3TGFzdE9iak51bTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFKiBvZmZzZXQgPSBtX09iamVjdE9mZnNldC5HZXRQdHJBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFvZmZzZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIF9PdXRQdXRJbmRleCgmbV9GaWxlLCAqb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCBjb3VudCA9IG1fTmV3T2JqTnVtQXJyYXkuR2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgIEZYX0lOVDMyIGkgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG9iam51bSA9IG1fTmV3T2JqTnVtQXJyYXkuRWxlbWVudEF0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZERXb3JkKG9iam51bSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIiAxICIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXS9MZW5ndGggIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kRFdvcmQoY291bnQgKiA1KSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiPj5zdHJlYW1cclxuIikpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG9iam51bSA9IG1fTmV3T2JqTnVtQXJyYXkuRWxlbWVudEF0KGkpOwotICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQgPSBtX09iamVjdE9mZnNldFtvYmpudW1dOwotICAgICAgICAgICAgICAgICAgICBfT3V0UHV0SW5kZXgoJm1fRmlsZSwgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXHJcbmVuZHN0cmVhbSIpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoRlhfQlNUUkMoIlxyXG5zdGFydHhyZWZcclxuIikpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoIl0vU2l6ZSAiKSA8IDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQob2JqbnVtICsgMSkpIDwgMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBvZmZzZXQgKz0gbGVuICsgNzsKKyAgaWYgKG1fUHJldk9mZnNldCA+IDApIHsKKyAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygiL1ByZXYgIikgPCAwKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEZYX0NIQVIgb2Zmc2V0X2J1ZlsyMF07Ci0gICAgRlhTWVNfbWVtc2V0MzIob2Zmc2V0X2J1ZiwgMCwgc2l6ZW9mKG9mZnNldF9idWYpKTsKLSAgICBGWFNZU19pNjR0b2EobV9YcmVmU3RhcnQsIG9mZnNldF9idWYsIDEwKTsKLSAgICBpZiAobV9GaWxlLkFwcGVuZEJsb2NrKG9mZnNldF9idWYsIEZYU1lTX3N0cmxlbihvZmZzZXRfYnVmKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICBGWFNZU19tZW1zZXQob2Zmc2V0X2J1ZiwgMCwgc2l6ZW9mKG9mZnNldF9idWYpKTsKKyAgICBGWFNZU19pNjR0b2EobV9QcmV2T2Zmc2V0LCBvZmZzZXRfYnVmLCAxMCk7CisgICAgaW50MzJfdCBsZW4gPSAoaW50MzJfdClGWFNZU19zdHJsZW4ob2Zmc2V0X2J1Zik7CisgICAgaWYgKHBGaWxlLT5BcHBlbmRCbG9jayhvZmZzZXRfYnVmLCBsZW4pIDwgMCkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZyhGWF9CU1RSQygiXHJcbiUlRU9GXHJcbiIpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOworICAgIG9mZnNldCArPSBsZW4gKyA2OworICB9CisgIEZYX0JPT0wgYlByZWRpY3RvciA9IFRSVUU7CisgIENQREZfRmxhdGVFbmNvZGVyIGVuY29kZXI7CisgIGVuY29kZXIuSW5pdGlhbGl6ZShtX0J1ZmZlci5HZXRCdWZmZXIoKSwgbV9CdWZmZXIuR2V0TGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRvci0+bV9iQ29tcHJlc3MsIGJQcmVkaWN0b3IpOworICBpZiAocENyZWF0b3ItPm1fYkNvbXByZXNzKSB7CisgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoIi9GaWx0ZXIgL0ZsYXRlRGVjb2RlIikgPCAwKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIG1fRmlsZS5GbHVzaCgpOwotICAgIHJldHVybiBtX2lTdGFnZSA9IDEwMDsKLX0KLXZvaWQgQ1BERl9DcmVhdG9yOjpDbGVhcigpCi17Ci0gICAgaWYgKG1fcFhSZWZTdHJlYW0pIHsKLSAgICAgICAgZGVsZXRlIG1fcFhSZWZTdHJlYW07Ci0gICAgICAgIG1fcFhSZWZTdHJlYW0gPSBOVUxMOwotICAgIH0KLSAgICBtX0ZpbGUuQ2xlYXIoKTsKLSAgICBtX05ld09iak51bUFycmF5LlJlbW92ZUFsbCgpOwotICAgIGlmIChtX3BJREFycmF5KSB7Ci0gICAgICAgIG1fcElEQXJyYXktPlJlbGVhc2UoKTsKLSAgICAgICAgbV9wSURBcnJheSA9IE5VTEw7Ci0gICAgfQotfQotRlhfQk9PTCBDUERGX0NyZWF0b3I6OkNyZWF0ZShGWF9MUENTVFIgZmlsZW5hbWUsIEZYX0RXT1JEIGZsYWdzKQotewotICAgIGlmICghbV9GaWxlLkF0dGFjaEZpbGUoZmlsZW5hbWUpKSB7CisgICAgb2Zmc2V0ICs9IDIwOworICAgIGlmIChiUHJlZGljdG9yKSB7CisgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoCisgICAgICAgICAgICAgICAiL0RlY29kZVBhcm1zPDwvQ29sdW1ucyA3L1ByZWRpY3RvciAxMj4+IikpIDwgMCkgewogICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBvZmZzZXQgKz0gbGVuOwogICAgIH0KLSAgICBGWF9CT09MIGJSZXQgPSBDcmVhdGUoZmxhZ3MpOwotICAgIGlmICghYlJldCB8fCAhKGZsYWdzICYgRlBERkNSRUFURV9QUk9HUkVTU0lWRSkpIHsKLSAgICAgICAgQ2xlYXIoKTsKKyAgfQorICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygiL0xlbmd0aCAiKSA8IDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQoZW5jb2Rlci5tX2R3U2l6ZSkpIDwgMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBvZmZzZXQgKz0gbGVuICsgODsKKyAgaWYgKGJFT0YpIHsKKyAgICBpZiAoKGxlbiA9IFBERl9DcmVhdG9yV3JpdGVUcmFpbGVyKHBDcmVhdG9yLT5tX3BEb2N1bWVudCwgcEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3JlYXRvci0+bV9wSURBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdG9yLT5tX2JDb21wcmVzcykpIDwgMCkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICByZXR1cm4gYlJldDsKLX0KLUZYX0JPT0wgQ1BERl9DcmVhdG9yOjpDcmVhdGUoRlhfTFBDV1NUUiBmaWxlbmFtZSwgRlhfRFdPUkQgZmxhZ3MpCi17Ci0gICAgaWYgKCFtX0ZpbGUuQXR0YWNoRmlsZShmaWxlbmFtZSkpIHsKKyAgICBvZmZzZXQgKz0gbGVuOworICAgIGlmIChwQ3JlYXRvci0+bV9wRW5jcnlwdERpY3QpIHsKKyAgICAgIEZYX0RXT1JEIGR3RW5jcnlwdE9iak51bSA9IHBDcmVhdG9yLT5tX3BFbmNyeXB0RGljdC0+R2V0T2JqTnVtKCk7CisgICAgICBpZiAoZHdFbmNyeXB0T2JqTnVtID09IDApIHsKKyAgICAgICAgZHdFbmNyeXB0T2JqTnVtID0gcENyZWF0b3ItPm1fZHdFbnJ5cHRPYmpOdW07CisgICAgICB9CisgICAgICBpZiAoKGxlbiA9IFBERl9DcmVhdG9yV3JpdGVFbmNyeXB0KHBDcmVhdG9yLT5tX3BFbmNyeXB0RGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdFbmNyeXB0T2JqTnVtLCBwRmlsZSkpIDwgMCkgewogICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBvZmZzZXQgKz0gbGVuOwogICAgIH0KLSAgICBGWF9CT09MIGJSZXQgPSBDcmVhdGUoZmxhZ3MpOwotICAgIGlmICghYlJldCB8fCAhKGZsYWdzICYgRlBERkNSRUFURV9QUk9HUkVTU0lWRSkpIHsKLSAgICAgICAgQ2xlYXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGJSZXQ7CisgIH0KKyAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKCI+PnN0cmVhbVxyXG4iKSkgPCAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG9mZnNldCArPSBsZW47CisgIGlmIChwRmlsZS0+QXBwZW5kQmxvY2soZW5jb2Rlci5tX3BEYXRhLCBlbmNvZGVyLm1fZHdTaXplKSA8IDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKCJcclxuZW5kc3RyZWFtXHJcbmVuZG9ialxyXG4iKSkgPCAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG9mZnNldCArPSBlbmNvZGVyLm1fZHdTaXplICsgbGVuOworICBtX1ByZXZPZmZzZXQgPSBvZmZzZXRfdG1wOworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ1BERl9DcmVhdG9yOjpDcmVhdGUoSUZYX1N0cmVhbVdyaXRlKiBwRmlsZSwgRlhfRFdPUkQgZmxhZ3MpCi17Ci0gICAgaWYgKCFwRmlsZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmICghbV9GaWxlLkF0dGFjaEZpbGUocEZpbGUsIEZBTFNFKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBDcmVhdGUoZmxhZ3MpOworRlhfQk9PTCBDUERGX1hSZWZTdHJlYW06OkVuZChDUERGX0NyZWF0b3IqIHBDcmVhdG9yLCBGWF9CT09MIGJFT0YpIHsKKyAgaWYgKEVuZE9iamVjdFN0cmVhbShwQ3JlYXRvciwgYkVPRikgPCAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBHZW5lcmF0ZVhSZWZTdHJlYW0ocENyZWF0b3IsIGJFT0YpOwogfQotRlhfQk9PTCBDUERGX0NyZWF0b3I6OkNyZWF0ZShGWF9EV09SRCBmbGFncykKLXsKLSAgICBtX2R3RmxhZ3MgPSBmbGFnczsKLSAgICBtX2lTdGFnZSA9IDA7Ci0gICAgbV9PZmZzZXQgPSAwOwotICAgIG1fZHdMYXN0T2JqTnVtID0gbV9wRG9jdW1lbnQtPkdldExhc3RPYmpOdW0oKTsKLSAgICBtX09iamVjdE9mZnNldC5DbGVhcigpOwotICAgIG1fT2JqZWN0U2l6ZS5DbGVhcigpOwotICAgIG1fTmV3T2JqTnVtQXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgSW5pdElEKCk7Ci0gICAgaWYgKGZsYWdzICYgRlBERkNSRUFURV9QUk9HUkVTU0lWRSkgewotICAgICAgICByZXR1cm4gVFJVRTsKK0ZYX0JPT0wgQ1BERl9YUmVmU3RyZWFtOjpFbmRYUmVmU3RyZWFtKENQREZfQ3JlYXRvciogcENyZWF0b3IpIHsKKyAgaWYgKCEocENyZWF0b3ItPm1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpKSB7CisgICAgQXBwZW5kSW5kZXgwKG1fQnVmZmVyLCB0cnVlKTsKKyAgICBmb3IgKEZYX0RXT1JEIGkgPSAxOyBpIDwgcENyZWF0b3ItPm1fZHdMYXN0T2JqTnVtICsgMTsgaSsrKSB7CisgICAgICBGWF9GSUxFU0laRSogb2Zmc2V0ID0gcENyZWF0b3ItPm1fT2JqZWN0T2Zmc2V0LkdldFB0ckF0KGkpOworICAgICAgaWYgKG9mZnNldCkgeworICAgICAgICBBcHBlbmRJbmRleDEobV9CdWZmZXIsICpvZmZzZXQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQXBwZW5kSW5kZXgwKG1fQnVmZmVyLCBmYWxzZSk7CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiBDb250aW51ZShOVUxMKSA+IC0xOworICB9IGVsc2UgeworICAgIGludDMyX3QgaVNlZyA9IG1fSW5kZXhBcnJheS5HZXRTaXplKCkgLyAyOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaVNlZzsgaSsrKSB7CisgICAgICBGWF9EV09SRCBzdGFydCA9IG1fSW5kZXhBcnJheS5FbGVtZW50QXQoaSAqIDIpOworICAgICAgRlhfRFdPUkQgZW5kID0gbV9JbmRleEFycmF5LkVsZW1lbnRBdChpICogMiArIDEpICsgc3RhcnQ7CisgICAgICBmb3IgKEZYX0RXT1JEIGogPSBzdGFydDsgaiA8IGVuZDsgaisrKSB7CisgICAgICAgIEFwcGVuZEluZGV4MShtX0J1ZmZlciwgcENyZWF0b3ItPm1fT2JqZWN0T2Zmc2V0W2pdKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIEdlbmVyYXRlWFJlZlN0cmVhbShwQ3JlYXRvciwgRkFMU0UpOwogfQotdm9pZCBDUERGX0NyZWF0b3I6OkluaXRJRChGWF9CT09MIGJEZWZhdWx0ICkKLXsKLSAgICBDUERGX0FycmF5KiBwT2xkSURBcnJheSA9IG1fcFBhcnNlciA/IG1fcFBhcnNlci0+R2V0SURBcnJheSgpIDogTlVMTDsKLSAgICBGWF9CT09MIGJOZXdJZCA9ICFtX3BJREFycmF5OwotICAgIGlmICghbV9wSURBcnJheSkgewotICAgICAgICBGWF9MUERXT1JEIHBCdWZmZXIgPSBOVUxMOwotICAgICAgICBtX3BJREFycmF5ID0gQ1BERl9BcnJheTo6Q3JlYXRlKCk7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwSUQxID0gcE9sZElEQXJyYXkgPyBwT2xkSURBcnJheS0+R2V0RWxlbWVudCgwKSA6IE5VTEw7Ci0gICAgICAgIGlmIChwSUQxKSB7Ci0gICAgICAgICAgICBtX3BJREFycmF5LT5BZGQocElEMS0+Q2xvbmUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwQnVmZmVyID0gRlhfQWxsb2MoRlhfRFdPUkQsIDQpOwotICAgICAgICAgICAgUERGX0dlbmVyYXRlRmlsZUlEKChGWF9EV09SRCkoRlhfVUlOVFBUUil0aGlzLCBtX2R3TGFzdE9iak51bSwgcEJ1ZmZlcik7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0MgYnNCdWZmZXIoKEZYX0xQQ0JZVEUpcEJ1ZmZlciwgNCAqIHNpemVvZihGWF9EV09SRCkpOwotICAgICAgICAgICAgbV9wSURBcnJheS0+QWRkKENQREZfU3RyaW5nOjpDcmVhdGUoYnNCdWZmZXIsIFRSVUUpLCBtX3BEb2N1bWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBCdWZmZXIpIHsKLSAgICAgICAgICAgIEZYX0ZyZWUocEJ1ZmZlcik7Ci0gICAgICAgIH0KK0ZYX0JPT0wgQ1BERl9YUmVmU3RyZWFtOjpBZGRPYmplY3ROdW1iZXJUb0luZGV4QXJyYXkoRlhfRFdPUkQgb2JqbnVtKSB7CisgIGludDMyX3QgaVNpemUgPSBtX0luZGV4QXJyYXkuR2V0U2l6ZSgpOworICBpZiAoaVNpemUgPT0gMCkgeworICAgIG1fSW5kZXhBcnJheS5BZGQob2JqbnVtKTsKKyAgICBtX0luZGV4QXJyYXkuQWRkKDEpOworICB9IGVsc2UgeworICAgIEZYU1lTX2Fzc2VydChpU2l6ZSA+IDEpOworICAgIEZYX0RXT1JEIHN0YXJ0b2JqbnVtID0gbV9JbmRleEFycmF5LkVsZW1lbnRBdChpU2l6ZSAtIDIpOworICAgIGludDMyX3QgaUNvdW50ID0gbV9JbmRleEFycmF5LkVsZW1lbnRBdChpU2l6ZSAtIDEpOworICAgIGlmIChvYmpudW0gPT0gc3RhcnRvYmpudW0gKyBpQ291bnQpIHsKKyAgICAgIG1fSW5kZXhBcnJheVtpU2l6ZSAtIDFdID0gaUNvdW50ICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgbV9JbmRleEFycmF5LkFkZChvYmpudW0pOworICAgICAgbV9JbmRleEFycmF5LkFkZCgxKTsKICAgICB9Ci0gICAgaWYgKCFiRGVmYXVsdCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwT2xkSURBcnJheSkgewotICAgICAgICBDUERGX09iamVjdCogcElEMiA9IHBPbGRJREFycmF5LT5HZXRFbGVtZW50KDEpOwotICAgICAgICBpZiAoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpICYmIG1fcEVuY3J5cHREaWN0ICYmIHBJRDIpIHsKLSAgICAgICAgICAgIG1fcElEQXJyYXktPkFkZChwSUQyLT5DbG9uZSgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBGWF9MUERXT1JEIHBCdWZmZXIgPSBGWF9BbGxvYyhGWF9EV09SRCwgNCk7Ci0gICAgICAgIFBERl9HZW5lcmF0ZUZpbGVJRCgoRlhfRFdPUkQpKEZYX1VJTlRQVFIpdGhpcywgbV9kd0xhc3RPYmpOdW0sIHBCdWZmZXIpOwotICAgICAgICBDRlhfQnl0ZVN0cmluZ0MgYnNCdWZmZXIoKEZYX0xQQ0JZVEUpcEJ1ZmZlciwgNCAqIHNpemVvZihGWF9EV09SRCkpOwotICAgICAgICBtX3BJREFycmF5LT5BZGQoQ1BERl9TdHJpbmc6OkNyZWF0ZShic0J1ZmZlciwgVFJVRSksIG1fcERvY3VtZW50KTsKLSAgICAgICAgRlhfRnJlZShwQnVmZmVyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX3BJREFycmF5LT5BZGQobV9wSURBcnJheS0+R2V0RWxlbWVudCgwKS0+Q2xvbmUoKSk7Ci0gICAgaWYgKG1fcEVuY3J5cHREaWN0ICYmICFwT2xkSURBcnJheSAmJiBtX3BQYXJzZXIgJiYgYk5ld0lkKSB7Ci0gICAgICAgIGlmIChtX3BFbmNyeXB0RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJGaWx0ZXIiKSkgPT0gRlhfQlNUUkMoIlN0YW5kYXJkIikpIHsKLSAgICAgICAgICAgIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXIgaGFuZGxlcjsKLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHVzZXJfcGFzcyA9IG1fcFBhcnNlci0+R2V0UGFzc3dvcmQoKTsKLSAgICAgICAgICAgIEZYX0RXT1JEIGZsYWcgPSBQREZfRU5DUllQVF9DT05URU5UOwotICAgICAgICAgICAgaGFuZGxlci5PbkNyZWF0ZShtX3BFbmNyeXB0RGljdCwgbV9wSURBcnJheSwgKEZYX0xQQ0JZVEUpdXNlcl9wYXNzLCB1c2VyX3Bhc3MuR2V0TGVuZ3RoKCksIGZsYWcpOwotICAgICAgICAgICAgaWYgKG1fcENyeXB0b0hhbmRsZXIgJiYgbV9iTmV3Q3J5cHRvKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIG1fcENyeXB0b0hhbmRsZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX3BDcnlwdG9IYW5kbGVyID0gbmV3IENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOwotICAgICAgICAgICAgbV9wQ3J5cHRvSGFuZGxlci0+SW5pdChtX3BFbmNyeXB0RGljdCwgJmhhbmRsZXIpOwotICAgICAgICAgICAgbV9iTmV3Q3J5cHRvID0gVFJVRTsKLSAgICAgICAgICAgIG1fYlNlY3VyaXR5Q2hhbmdlZCA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9JTlQzMiBDUERGX0NyZWF0b3I6OkNvbnRpbnVlKElGWF9QYXVzZSAqcFBhdXNlKQotewotICAgIGlmIChtX2lTdGFnZSA8IDApIHsKLSAgICAgICAgcmV0dXJuIG1faVN0YWdlOwotICAgIH0KLSAgICBGWF9JTlQzMiBpUmV0ID0gMDsKLSAgICB3aGlsZSAobV9pU3RhZ2UgPCAxMDApIHsKLSAgICAgICAgaWYgKG1faVN0YWdlIDwgMjApIHsKLSAgICAgICAgICAgIGlSZXQgPSBXcml0ZURvY19TdGFnZTEocFBhdXNlKTsKLSAgICAgICAgfSBlbHNlIGlmIChtX2lTdGFnZSA8IDMwKSB7Ci0gICAgICAgICAgICBpUmV0ID0gV3JpdGVEb2NfU3RhZ2UyKHBQYXVzZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobV9pU3RhZ2UgPCA5MCkgewotICAgICAgICAgICAgaVJldCA9IFdyaXRlRG9jX1N0YWdlMyhwUGF1c2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaVJldCA9IFdyaXRlRG9jX1N0YWdlNChwUGF1c2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpUmV0IDwgbV9pU3RhZ2UpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChpUmV0IDwgMSB8fCBtX2lTdGFnZSA9PSAxMDApIHsKLSAgICAgICAgbV9pU3RhZ2UgPSAtMTsKLSAgICAgICAgQ2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIGlSZXQgPiA5OSA/IDAgOiAoaVJldCA8IDEgPyAtMSA6IGlSZXQpOwotICAgIH0KLSAgICByZXR1cm4gbV9pU3RhZ2U7Ci19Ci1GWF9CT09MIENQREZfQ3JlYXRvcjo6U2V0RmlsZVZlcnNpb24oRlhfSU5UMzIgZmlsZVZlcnNpb24gKQotewotICAgIGlmIChmaWxlVmVyc2lvbiA8IDEwIHx8IGZpbGVWZXJzaW9uID4gMTcpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX0ZpbGVWZXJzaW9uID0gZmlsZVZlcnNpb247Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci12b2lkIENQREZfQ3JlYXRvcjo6UmVtb3ZlU2VjdXJpdHkoKQotewotICAgIFJlc2V0U3RhbmRhcmRTZWN1cml0eSgpOwotICAgIG1fYlNlY3VyaXR5Q2hhbmdlZCA9IFRSVUU7CitDUERGX0NyZWF0b3I6OkNQREZfQ3JlYXRvcihDUERGX0RvY3VtZW50KiBwRG9jKSB7CisgIG1fcERvY3VtZW50ID0gcERvYzsKKyAgbV9wUGFyc2VyID0gKENQREZfUGFyc2VyKilwRG9jLT5tX3BQYXJzZXI7CisgIG1fYkNvbXByZXNzID0gVFJVRTsKKyAgaWYgKG1fcFBhcnNlcikgeworICAgIG1fcEVuY3J5cHREaWN0ID0gbV9wUGFyc2VyLT5HZXRFbmNyeXB0RGljdCgpOworICAgIG1fcENyeXB0b0hhbmRsZXIgPSBtX3BQYXJzZXItPkdldENyeXB0b0hhbmRsZXIoKTsKKyAgfSBlbHNlIHsKICAgICBtX3BFbmNyeXB0RGljdCA9IE5VTEw7CiAgICAgbV9wQ3J5cHRvSGFuZGxlciA9IE5VTEw7CisgIH0KKyAgbV9iU2VjdXJpdHlDaGFuZ2VkID0gRkFMU0U7CisgIG1fYlN0YW5kYXJkU2VjdXJpdHkgPSBGQUxTRTsKKyAgbV9wTWV0YWRhdGEgPSBOVUxMOworICBtX2JFbmNyeXB0Q2xvbmVkID0gRkFMU0U7CisgIG1fYkVuY3J5cHRNZXRhZGF0YSA9IEZBTFNFOworICBtX09mZnNldCA9IDA7CisgIG1faVN0YWdlID0gLTE7CisgIG1fZHdGbGFncyA9IDA7CisgIG1fUG9zID0gTlVMTDsKKyAgbV9YcmVmU3RhcnQgPSAwOworICBtX3BYUmVmU3RyZWFtID0gTlVMTDsKKyAgbV9PYmplY3RTdHJlYW1TaXplID0gMjAwOworICBtX2R3TGFzdE9iak51bSA9IG1fcERvY3VtZW50LT5HZXRMYXN0T2JqTnVtKCk7CisgIG1fcElEQXJyYXkgPSBOVUxMOworICBtX0ZpbGVWZXJzaW9uID0gMDsKKyAgbV9kd0VucnlwdE9iak51bSA9IDA7CisgIG1fYk5ld0NyeXB0byA9IEZBTFNFOwogfQotdm9pZCBDUERGX0NyZWF0b3I6OlJlc2V0U3RhbmRhcmRTZWN1cml0eSgpCi17Ci0gICAgaWYgKChtX2JTdGFuZGFyZFNlY3VyaXR5IHx8IG1fYk5ld0NyeXB0bykgJiYgbV9wQ3J5cHRvSGFuZGxlcikgewotICAgICAgICBkZWxldGUgbV9wQ3J5cHRvSGFuZGxlcjsKLSAgICAgICAgbV9wQ3J5cHRvSGFuZGxlciA9IE5VTEw7CitDUERGX0NyZWF0b3I6On5DUERGX0NyZWF0b3IoKSB7CisgIFJlc2V0U3RhbmRhcmRTZWN1cml0eSgpOworICBpZiAobV9iRW5jcnlwdENsb25lZCAmJiBtX3BFbmNyeXB0RGljdCkgeworICAgIG1fcEVuY3J5cHREaWN0LT5SZWxlYXNlKCk7CisgICAgbV9wRW5jcnlwdERpY3QgPSBOVUxMOworICB9CisgIENsZWFyKCk7Cit9CisKK2ludDMyX3QgQ1BERl9DcmVhdG9yOjpXcml0ZUluZGlyZWN0T2JqZWN0VG9TdHJlYW0oY29uc3QgQ1BERl9PYmplY3QqIHBPYmopIHsKKyAgaWYgKCFtX3BYUmVmU3RyZWFtKQorICAgIHJldHVybiAxOworCisgIEZYX0RXT1JEIG9iam51bSA9IHBPYmotPkdldE9iak51bSgpOworICBpZiAobV9wUGFyc2VyICYmIG1fcFBhcnNlci0+bV9PYmpWZXJzaW9uLkdldFNpemUoKSA+IChpbnQzMl90KW9iam51bSAmJgorICAgICAgbV9wUGFyc2VyLT5tX09ialZlcnNpb25bb2JqbnVtXSA+IDApIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmIChwT2JqLT5Jc051bWJlcigpKQorICAgIHJldHVybiAxOworCisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwT2JqLT5HZXREaWN0KCk7CisgIGlmIChwT2JqLT5Jc1N0cmVhbSgpKSB7CisgICAgaWYgKHBEaWN0ICYmIHBEaWN0LT5HZXRTdHJpbmcoIlR5cGUiKSA9PSAiWFJlZiIpCisgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmIChwRGljdCkgeworICAgIGlmIChwRGljdCA9PSBtX3BEb2N1bWVudC0+bV9wUm9vdERpY3QgfHwgcERpY3QgPT0gbV9wRW5jcnlwdERpY3QpCisgICAgICByZXR1cm4gMTsKKyAgICBpZiAoSXNTaWduYXR1cmVEaWN0KHBEaWN0KSkKKyAgICAgIHJldHVybiAxOworICAgIGlmIChwRGljdC0+R2V0U3RyaW5nKCJUeXBlIikgPT0gIlBhZ2UiKQorICAgICAgcmV0dXJuIDE7CisgIH0KKworICBtX3BYUmVmU3RyZWFtLT5BZGRPYmplY3ROdW1iZXJUb0luZGV4QXJyYXkob2JqbnVtKTsKKyAgaWYgKG1fcFhSZWZTdHJlYW0tPkNvbXByZXNzSW5kaXJlY3RPYmplY3Qob2JqbnVtLCBwT2JqLCB0aGlzKSA8IDApCisgICAgcmV0dXJuIC0xOworICBpZiAoIUlzWFJlZk5lZWRFbmQobV9wWFJlZlN0cmVhbSwgbV9kd0ZsYWdzKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKCFtX3BYUmVmU3RyZWFtLT5FbmQodGhpcykpCisgICAgcmV0dXJuIC0xOworICBpZiAoIW1fcFhSZWZTdHJlYW0tPlN0YXJ0KCkpCisgICAgcmV0dXJuIC0xOworICByZXR1cm4gMDsKK30KK2ludDMyX3QgQ1BERl9DcmVhdG9yOjpXcml0ZUluZGlyZWN0T2JqZWN0VG9TdHJlYW0oRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1NpemUpIHsKKyAgaWYgKCFtX3BYUmVmU3RyZWFtKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgbV9wWFJlZlN0cmVhbS0+QWRkT2JqZWN0TnVtYmVyVG9JbmRleEFycmF5KG9iam51bSk7CisgIGludDMyX3QgaVJldCA9CisgICAgICBtX3BYUmVmU3RyZWFtLT5Db21wcmVzc0luZGlyZWN0T2JqZWN0KG9iam51bSwgcEJ1ZmZlciwgZHdTaXplLCB0aGlzKTsKKyAgaWYgKGlSZXQgPCAxKSB7CisgICAgcmV0dXJuIGlSZXQ7CisgIH0KKyAgaWYgKCFJc1hSZWZOZWVkRW5kKG1fcFhSZWZTdHJlYW0sIG1fZHdGbGFncykpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIW1fcFhSZWZTdHJlYW0tPkVuZCh0aGlzKSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoIW1fcFhSZWZTdHJlYW0tPlN0YXJ0KCkpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CitpbnQzMl90IENQREZfQ3JlYXRvcjo6QXBwZW5kT2JqZWN0TnVtYmVyVG9YUmVmKEZYX0RXT1JEIG9iam51bSkgeworICBpZiAoIW1fcFhSZWZTdHJlYW0pIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICBtX3BYUmVmU3RyZWFtLT5BZGRPYmplY3ROdW1iZXJUb0luZGV4QXJyYXkob2JqbnVtKTsKKyAgaWYgKCFJc1hSZWZOZWVkRW5kKG1fcFhSZWZTdHJlYW0sIG1fZHdGbGFncykpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIW1fcFhSZWZTdHJlYW0tPkVuZCh0aGlzKSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoIW1fcFhSZWZTdHJlYW0tPlN0YXJ0KCkpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CitpbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVTdHJlYW0oY29uc3QgQ1BERl9PYmplY3QqIHBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQ3J5cHRvSGFuZGxlciogcENyeXB0bykgeworICBDUERGX0ZsYXRlRW5jb2RlciBlbmNvZGVyOworICBlbmNvZGVyLkluaXRpYWxpemUoY29uc3RfY2FzdDxDUERGX1N0cmVhbSo+KHBTdHJlYW0tPkFzU3RyZWFtKCkpLAorICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbSA9PSBtX3BNZXRhZGF0YSA/IEZBTFNFIDogbV9iQ29tcHJlc3MpOworICBDUERGX0VuY3J5cHRvciBlbmNyeXB0b3I7CisgIGlmICghZW5jcnlwdG9yLkluaXRpYWxpemUocENyeXB0bywgb2JqbnVtLCBlbmNvZGVyLm1fcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rlci5tX2R3U2l6ZSkpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKChGWF9EV09SRCllbmNvZGVyLm1fcERpY3QtPkdldEludGVnZXIoIkxlbmd0aCIpICE9IGVuY3J5cHRvci5tX2R3U2l6ZSkgeworICAgIGVuY29kZXIuQ2xvbmVEaWN0KCk7CisgICAgZW5jb2Rlci5tX3BEaWN0LT5TZXRBdEludGVnZXIoIkxlbmd0aCIsIGVuY3J5cHRvci5tX2R3U2l6ZSk7CisgIH0KKyAgaWYgKFdyaXRlRGlyZWN0T2JqKG9iam51bSwgZW5jb2Rlci5tX3BEaWN0KSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaW50IGxlbiA9IG1fRmlsZS5BcHBlbmRTdHJpbmcoInN0cmVhbVxyXG4iKTsKKyAgaWYgKGxlbiA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgbV9PZmZzZXQgKz0gbGVuOworICBpZiAobV9GaWxlLkFwcGVuZEJsb2NrKGVuY3J5cHRvci5tX3BEYXRhLCBlbmNyeXB0b3IubV9kd1NpemUpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBtX09mZnNldCArPSBlbmNyeXB0b3IubV9kd1NpemU7CisgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZFN0cmluZygiXHJcbmVuZHN0cmVhbSIpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgbV9PZmZzZXQgKz0gbGVuOworICByZXR1cm4gMTsKK30KK2ludDMyX3QgQ1BERl9DcmVhdG9yOjpXcml0ZUluZGlyZWN0T2JqKEZYX0RXT1JEIG9iam51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfT2JqZWN0KiBwT2JqKSB7CisgIGludDMyX3QgbGVuID0gbV9GaWxlLkFwcGVuZERXb3JkKG9iam51bSk7CisgIGlmIChsZW4gPCAwKQorICAgIHJldHVybiAtMTsKKworICBtX09mZnNldCArPSBsZW47CisgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZFN0cmluZygiIDAgb2JqXHJcbiIpKSA8IDApCisgICAgcmV0dXJuIC0xOworCisgIG1fT2Zmc2V0ICs9IGxlbjsKKyAgaWYgKHBPYmotPklzU3RyZWFtKCkpIHsKKyAgICBDUERGX0NyeXB0b0hhbmRsZXIqIHBIYW5kbGVyID0gbnVsbHB0cjsKKyAgICBwSGFuZGxlciA9CisgICAgICAgIChwT2JqID09IG1fcE1ldGFkYXRhICYmICFtX2JFbmNyeXB0TWV0YWRhdGEpID8gTlVMTCA6IG1fcENyeXB0b0hhbmRsZXI7CisgICAgaWYgKFdyaXRlU3RyZWFtKHBPYmosIG9iam51bSwgcEhhbmRsZXIpIDwgMCkKKyAgICAgIHJldHVybiAtMTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoV3JpdGVEaXJlY3RPYmoob2JqbnVtLCBwT2JqKSA8IDApCisgICAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kU3RyaW5nKCJcclxuZW5kb2JqXHJcbiIpKSA8IDApCisgICAgcmV0dXJuIC0xOworCisgIG1fT2Zmc2V0ICs9IGxlbjsKKyAgaWYgKEFwcGVuZE9iamVjdE51bWJlclRvWFJlZihvYmpudW0pIDwgMCkKKyAgICByZXR1cm4gLTE7CisgIHJldHVybiAwOworfQoraW50MzJfdCBDUERGX0NyZWF0b3I6OldyaXRlSW5kaXJlY3RPYmooY29uc3QgQ1BERl9PYmplY3QqIHBPYmopIHsKKyAgaW50MzJfdCBpUmV0ID0gV3JpdGVJbmRpcmVjdE9iamVjdFRvU3RyZWFtKHBPYmopOworICBpZiAoaVJldCA8IDEpIHsKKyAgICByZXR1cm4gaVJldDsKKyAgfQorICByZXR1cm4gV3JpdGVJbmRpcmVjdE9iaihwT2JqLT5HZXRPYmpOdW0oKSwgcE9iaik7Cit9CitpbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVEaXJlY3RPYmooRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfT2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkVuY3J5cHQpIHsKKyAgaW50MzJfdCBsZW4gPSAwOworICBpZiAoIXBPYmopIHsKKyAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiIG51bGwiKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgbV9iTmV3Q3J5cHRvID0gRkFMU0U7Ci0gICAgaWYgKCFtX2JTdGFuZGFyZFNlY3VyaXR5KSB7Ci0gICAgICAgIHJldHVybjsKKyAgICBtX09mZnNldCArPSA1OworICAgIHJldHVybiAxOworICB9CisgIHN3aXRjaCAocE9iai0+R2V0VHlwZSgpKSB7CisgICAgY2FzZSBQREZPQkpfTlVMTDoKKyAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCIgbnVsbCIpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBtX09mZnNldCArPSA1OworICAgICAgYnJlYWs7CisgICAgY2FzZSBQREZPQkpfQk9PTEVBTjoKKyAgICBjYXNlIFBERk9CSl9OVU1CRVI6CisgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiICIpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBpZiAoKGxlbiA9IG1fRmlsZS5BcHBlbmRTdHJpbmcocE9iai0+R2V0U3RyaW5nKCkpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgbV9PZmZzZXQgKz0gbGVuICsgMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUERGT0JKX1NUUklORzogeworICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gcE9iai0+R2V0U3RyaW5nKCk7CisgICAgICBGWF9CT09MIGJIZXggPSBwT2JqLT5Bc1N0cmluZygpLT5Jc0hleCgpOworICAgICAgaWYgKCFtX3BDcnlwdG9IYW5kbGVyIHx8ICFiRW5jcnlwdCkgeworICAgICAgICBDRlhfQnl0ZVN0cmluZyBjb250ZW50ID0gUERGX0VuY29kZVN0cmluZyhzdHIsIGJIZXgpOworICAgICAgICBpZiAoKGxlbiA9IG1fRmlsZS5BcHBlbmRTdHJpbmcoY29udGVudCkpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBtX09mZnNldCArPSBsZW47CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgQ1BERl9FbmNyeXB0b3IgZW5jcnlwdG9yOworICAgICAgZW5jcnlwdG9yLkluaXRpYWxpemUobV9wQ3J5cHRvSGFuZGxlciwgb2JqbnVtLCAodWludDhfdCopc3RyLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIuR2V0TGVuZ3RoKCkpOworICAgICAgQ0ZYX0J5dGVTdHJpbmcgY29udGVudCA9IFBERl9FbmNvZGVTdHJpbmcoCisgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcoKGNvbnN0IEZYX0NIQVIqKWVuY3J5cHRvci5tX3BEYXRhLCBlbmNyeXB0b3IubV9kd1NpemUpLAorICAgICAgICAgIGJIZXgpOworICAgICAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kU3RyaW5nKGNvbnRlbnQpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgbV9PZmZzZXQgKz0gbGVuOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUERGT0JKX1NUUkVBTTogeworICAgICAgQ1BERl9GbGF0ZUVuY29kZXIgZW5jb2RlcjsKKyAgICAgIGVuY29kZXIuSW5pdGlhbGl6ZShjb25zdF9jYXN0PENQREZfU3RyZWFtKj4ocE9iai0+QXNTdHJlYW0oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgbV9iQ29tcHJlc3MpOworICAgICAgQ1BERl9FbmNyeXB0b3IgZW5jcnlwdG9yOworICAgICAgQ1BERl9DcnlwdG9IYW5kbGVyKiBwSGFuZGxlciA9IG1fcENyeXB0b0hhbmRsZXI7CisgICAgICBlbmNyeXB0b3IuSW5pdGlhbGl6ZShwSGFuZGxlciwgb2JqbnVtLCBlbmNvZGVyLm1fcERhdGEsIGVuY29kZXIubV9kd1NpemUpOworICAgICAgaWYgKChGWF9EV09SRCllbmNvZGVyLm1fcERpY3QtPkdldEludGVnZXIoIkxlbmd0aCIpICE9CisgICAgICAgICAgZW5jcnlwdG9yLm1fZHdTaXplKSB7CisgICAgICAgIGVuY29kZXIuQ2xvbmVEaWN0KCk7CisgICAgICAgIGVuY29kZXIubV9wRGljdC0+U2V0QXRJbnRlZ2VyKCJMZW5ndGgiLCBlbmNyeXB0b3IubV9kd1NpemUpOworICAgICAgfQorICAgICAgaWYgKFdyaXRlRGlyZWN0T2JqKG9iam51bSwgZW5jb2Rlci5tX3BEaWN0KSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kU3RyaW5nKCJzdHJlYW1cclxuIikpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBtX09mZnNldCArPSBsZW47CisgICAgICBpZiAobV9GaWxlLkFwcGVuZEJsb2NrKGVuY3J5cHRvci5tX3BEYXRhLCBlbmNyeXB0b3IubV9kd1NpemUpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBtX09mZnNldCArPSBlbmNyeXB0b3IubV9kd1NpemU7CisgICAgICBpZiAoKGxlbiA9IG1fRmlsZS5BcHBlbmRTdHJpbmcoIlxyXG5lbmRzdHJlYW0iKSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIG1fT2Zmc2V0ICs9IGxlbjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBERk9CSl9OQU1FOiB7CisgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiLyIpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBwT2JqLT5HZXRTdHJpbmcoKTsKKyAgICAgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZFN0cmluZyhQREZfTmFtZUVuY29kZShzdHIpKSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIG1fT2Zmc2V0ICs9IGxlbiArIDE7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOiB7CisgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiICIpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kRFdvcmQocE9iai0+QXNSZWZlcmVuY2UoKS0+R2V0UmVmT2JqTnVtKCkpKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCIgMCBSIikgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICBtX09mZnNldCArPSBsZW4gKyA1OworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUERGT0JKX0FSUkFZOiB7CisgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiWyIpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBtX09mZnNldCArPSAxOworICAgICAgY29uc3QgQ1BERl9BcnJheSogcCA9IHBPYmotPkFzQXJyYXkoKTsKKyAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwLT5HZXRDb3VudCgpOyBpKyspIHsKKyAgICAgICAgQ1BERl9PYmplY3QqIHBFbGVtZW50ID0gcC0+R2V0RWxlbWVudChpKTsKKyAgICAgICAgaWYgKHBFbGVtZW50LT5HZXRPYmpOdW0oKSkgeworICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCIgIikgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZERXb3JkKHBFbGVtZW50LT5HZXRPYmpOdW0oKSkpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiIDAgUiIpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgICBtX09mZnNldCArPSBsZW4gKyA1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChXcml0ZURpcmVjdE9iaihvYmpudW0sIHBFbGVtZW50KSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCJdIikgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIG1fT2Zmc2V0ICs9IDE7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQREZPQkpfRElDVElPTkFSWTogeworICAgICAgaWYgKCFtX3BDcnlwdG9IYW5kbGVyIHx8IHBPYmogPT0gbV9wRW5jcnlwdERpY3QpIHsKKyAgICAgICAgcmV0dXJuIFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KHBPYmosICZtX0ZpbGUsIG1fT2Zmc2V0KTsKKyAgICAgIH0KKyAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCI8PCIpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBtX09mZnNldCArPSAyOworICAgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwID0gcE9iai0+QXNEaWN0aW9uYXJ5KCk7CisgICAgICBib29sIGJTaWduRGljdCA9IElzU2lnbmF0dXJlRGljdChwKTsKKyAgICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiAqcCkgeworICAgICAgICBGWF9CT09MIGJTaWduVmFsdWUgPSBGQUxTRTsKKyAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGtleSA9IGl0LmZpcnN0OworICAgICAgICBDUERGX09iamVjdCogcFZhbHVlID0gaXQuc2Vjb25kOworICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiLyIpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGxlbiA9IG1fRmlsZS5BcHBlbmRTdHJpbmcoUERGX05hbWVFbmNvZGUoa2V5KSkpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBtX09mZnNldCArPSBsZW4gKyAxOworICAgICAgICBpZiAoYlNpZ25EaWN0ICYmIGtleSA9PSAiQ29udGVudHMiKSB7CisgICAgICAgICAgYlNpZ25WYWx1ZSA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBWYWx1ZS0+R2V0T2JqTnVtKCkpIHsKKyAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiICIpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoKGxlbiA9IG1fRmlsZS5BcHBlbmREV29yZChwVmFsdWUtPkdldE9iak51bSgpKSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCIgMCBSICIpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgICBtX09mZnNldCArPSBsZW4gKyA2OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChXcml0ZURpcmVjdE9iaihvYmpudW0sIHBWYWx1ZSwgIWJTaWduVmFsdWUpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoIj4+IikgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIG1fT2Zmc2V0ICs9IDI7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CitpbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVPbGRJbmRpcmVjdE9iamVjdChGWF9EV09SRCBvYmpudW0pIHsKKyAgaWYgKG1fcFBhcnNlci0+bV9WNVR5cGVbb2JqbnVtXSA9PSAwIHx8IG1fcFBhcnNlci0+bV9WNVR5cGVbb2JqbnVtXSA9PSAyNTUpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBtX09iamVjdE9mZnNldFtvYmpudW1dID0gbV9PZmZzZXQ7CisgIEZYX0JPT0wgYkV4aXN0SW5NYXAgPQorICAgICAgcGRmaXVtOjpDb250YWluc0tleShtX3BEb2N1bWVudC0+bV9JbmRpcmVjdE9ianMsIG9iam51bSk7CisgIEZYX0JPT0wgYk9ialN0bSA9CisgICAgICAobV9wUGFyc2VyLT5tX1Y1VHlwZVtvYmpudW1dID09IDIpICYmIG1fcEVuY3J5cHREaWN0ICYmICFtX3BYUmVmU3RyZWFtOworICBpZiAobV9wUGFyc2VyLT5tX2JWZXJzaW9uVXBkYXRlZCB8fCBtX2JTZWN1cml0eUNoYW5nZWQgfHwgYkV4aXN0SW5NYXAgfHwKKyAgICAgIGJPYmpTdG0pIHsKKyAgICBDUERGX09iamVjdCogcE9iaiA9IG1fcERvY3VtZW50LT5HZXRJbmRpcmVjdE9iamVjdChvYmpudW0sIG51bGxwdHIpOworICAgIGlmICghcE9iaikgeworICAgICAgbV9PYmplY3RPZmZzZXRbb2JqbnVtXSA9IDA7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKFdyaXRlSW5kaXJlY3RPYmoocE9iaikpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFiRXhpc3RJbk1hcCkgeworICAgICAgbV9wRG9jdW1lbnQtPlJlbGVhc2VJbmRpcmVjdE9iamVjdChvYmpudW0pOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB1aW50OF90KiBwQnVmZmVyOworICAgIEZYX0RXT1JEIHNpemU7CisgICAgbV9wUGFyc2VyLT5HZXRJbmRpcmVjdEJpbmFyeShvYmpudW0sIHBCdWZmZXIsIHNpemUpOworICAgIGlmICghcEJ1ZmZlcikgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChtX3BQYXJzZXItPm1fVjVUeXBlW29iam51bV0gPT0gMikgeworICAgICAgaWYgKG1fcFhSZWZTdHJlYW0pIHsKKyAgICAgICAgaWYgKFdyaXRlSW5kaXJlY3RPYmplY3RUb1N0cmVhbShvYmpudW0sIHBCdWZmZXIsIHNpemUpIDwgMCkgeworICAgICAgICAgIEZYX0ZyZWUocEJ1ZmZlcik7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQzMl90IGxlbiA9IG1fRmlsZS5BcHBlbmREV29yZChvYmpudW0pOworICAgICAgICBpZiAobGVuIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiIDAgb2JqICIpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBtX09mZnNldCArPSBsZW4gKyA3OworICAgICAgICBpZiAobV9GaWxlLkFwcGVuZEJsb2NrKHBCdWZmZXIsIHNpemUpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBtX09mZnNldCArPSBzaXplOworICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiXHJcbmVuZG9ialxyXG4iKSA8IDApIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgbV9PZmZzZXQgKz0gMTA7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtX0ZpbGUuQXBwZW5kQmxvY2socEJ1ZmZlciwgc2l6ZSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIG1fT2Zmc2V0ICs9IHNpemU7CisgICAgICBpZiAoQXBwZW5kT2JqZWN0TnVtYmVyVG9YUmVmKG9iam51bSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICB9CisgICAgRlhfRnJlZShwQnVmZmVyKTsKKyAgfQorICByZXR1cm4gMTsKK30KK2ludDMyX3QgQ1BERl9DcmVhdG9yOjpXcml0ZU9sZE9ianMoSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgRlhfRFdPUkQgbkxhc3RPYmpOdW0gPSBtX3BQYXJzZXItPkdldExhc3RPYmpOdW0oKTsKKyAgaWYgKCFtX3BQYXJzZXItPklzVmFsaWRPYmplY3ROdW1iZXIobkxhc3RPYmpOdW0pKQorICAgIHJldHVybiAwOworCisgIEZYX0RXT1JEIG9iam51bSA9IChGWF9EV09SRCkodWludHB0cl90KW1fUG9zOworICBmb3IgKDsgb2JqbnVtIDw9IG5MYXN0T2JqTnVtOyArK29iam51bSkgeworICAgIGludDMyX3QgaVJldCA9IFdyaXRlT2xkSW5kaXJlY3RPYmplY3Qob2JqbnVtKTsKKyAgICBpZiAoaVJldCA8IDApCisgICAgICByZXR1cm4gaVJldDsKKworICAgIGlmICghaVJldCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKKyAgICAgIG1fUG9zID0gKHZvaWQqKSh1aW50cHRyX3QpKG9iam51bSArIDEpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQoraW50MzJfdCBDUERGX0NyZWF0b3I6OldyaXRlTmV3T2JqcyhGWF9CT09MIGJJbmNyZW1lbnRhbCwgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgaW50MzJfdCBpQ291bnQgPSBtX05ld09iak51bUFycmF5LkdldFNpemUoKTsKKyAgaW50MzJfdCBpbmRleCA9IChpbnQzMl90KSh1aW50cHRyX3QpbV9Qb3M7CisgIHdoaWxlIChpbmRleCA8IGlDb3VudCkgeworICAgIEZYX0RXT1JEIG9iam51bSA9IG1fTmV3T2JqTnVtQXJyYXkuRWxlbWVudEF0KGluZGV4KTsKKyAgICBhdXRvIGl0ID0gbV9wRG9jdW1lbnQtPm1fSW5kaXJlY3RPYmpzLmZpbmQob2JqbnVtKTsKKyAgICBpZiAoaXQgPT0gbV9wRG9jdW1lbnQtPm1fSW5kaXJlY3RPYmpzLmVuZCgpKSB7CisgICAgICArK2luZGV4OworICAgICAgY29udGludWU7CisgICAgfQorICAgIG1fT2JqZWN0T2Zmc2V0W29iam51bV0gPSBtX09mZnNldDsKKyAgICBpZiAoV3JpdGVJbmRpcmVjdE9iaihpdC0+c2Vjb25kKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpbmRleCsrOworICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7CisgICAgICBtX1BvcyA9IChGWF9QT1NJVElPTikodWludHB0cl90KWluZGV4OworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQordm9pZCBDUERGX0NyZWF0b3I6OkluaXRPbGRPYmpOdW1PZmZzZXRzKCkgeworICBpZiAoIW1fcFBhcnNlcikgeworICAgIHJldHVybjsKKyAgfQorICBGWF9EV09SRCBqID0gMDsKKyAgRlhfRFdPUkQgZHdTdGFydCA9IDA7CisgIEZYX0RXT1JEIGR3RW5kID0gbV9wUGFyc2VyLT5HZXRMYXN0T2JqTnVtKCk7CisgIHdoaWxlIChkd1N0YXJ0IDw9IGR3RW5kKSB7CisgICAgd2hpbGUgKGR3U3RhcnQgPD0gZHdFbmQgJiYgKG1fcFBhcnNlci0+bV9WNVR5cGVbZHdTdGFydF0gPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BQYXJzZXItPm1fVjVUeXBlW2R3U3RhcnRdID09IDI1NSkpIHsKKyAgICAgIGR3U3RhcnQrKzsKKyAgICB9CisgICAgaWYgKGR3U3RhcnQgPiBkd0VuZCkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGogPSBkd1N0YXJ0OworICAgIHdoaWxlIChqIDw9IGR3RW5kICYmIG1fcFBhcnNlci0+bV9WNVR5cGVbal0gIT0gMCAmJgorICAgICAgICAgICBtX3BQYXJzZXItPm1fVjVUeXBlW2pdICE9IDI1NSkgeworICAgICAgaisrOworICAgIH0KKyAgICBtX09iamVjdE9mZnNldC5BZGQoZHdTdGFydCwgaiAtIGR3U3RhcnQpOworICAgIGR3U3RhcnQgPSBqOworICB9Cit9Cit2b2lkIENQREZfQ3JlYXRvcjo6SW5pdE5ld09iak51bU9mZnNldHMoKSB7CisgIEZYX0JPT0wgYkluY3JlbWVudGFsID0gKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpICE9IDA7CisgIEZYX0JPT0wgYk5vT3JpZ2luYWwgPSAobV9kd0ZsYWdzICYgRlBERkNSRUFURV9OT19PUklHSU5BTCkgIT0gMDsKKyAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbV9wRG9jdW1lbnQtPm1fSW5kaXJlY3RPYmpzKSB7CisgICAgaWYgKHBhaXIuc2Vjb25kLT5HZXRPYmpOdW0oKSA9PSAtMSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChiSW5jcmVtZW50YWwpIHsKKyAgICAgIGlmICghcGFpci5zZWNvbmQtPklzTW9kaWZpZWQoKSkKKyAgICAgICAgY29udGludWU7CisgICAgfSBlbHNlIGlmIChtX3BQYXJzZXIgJiYgbV9wUGFyc2VyLT5Jc1ZhbGlkT2JqZWN0TnVtYmVyKHBhaXIuZmlyc3QpICYmCisgICAgICAgICAgICAgICBtX3BQYXJzZXItPm1fVjVUeXBlW3BhaXIuZmlyc3RdKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgQXBwZW5kTmV3T2JqTnVtKHBhaXIuZmlyc3QpOworICB9CisgIGludDMyX3QgaUNvdW50ID0gbV9OZXdPYmpOdW1BcnJheS5HZXRTaXplKCk7CisgIGlmIChpQ291bnQgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBpbnQzMl90IGkgPSAwOworICBGWF9EV09SRCBkd1N0YXJ0T2JqTnVtID0gMDsKKyAgRlhfQk9PTCBiQ3Jvc3NSZWZWYWxpZCA9IG1fcFBhcnNlciAmJiBtX3BQYXJzZXItPkdldExhc3RYUmVmT2Zmc2V0KCkgPiAwOworICB3aGlsZSAoaSA8IGlDb3VudCkgeworICAgIGR3U3RhcnRPYmpOdW0gPSBtX05ld09iak51bUFycmF5LkVsZW1lbnRBdChpKTsKKyAgICBpZiAoKGJJbmNyZW1lbnRhbCAmJiAoYk5vT3JpZ2luYWwgfHwgYkNyb3NzUmVmVmFsaWQpKSB8fAorICAgICAgICAhbV9PYmplY3RPZmZzZXQuR2V0UHRyQXQoZHdTdGFydE9iak51bSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpKys7CisgIH0KKyAgaWYgKGkgPj0gaUNvdW50KSB7CisgICAgcmV0dXJuOworICB9CisgIEZYX0RXT1JEIGR3TGFzdE9iak51bSA9IGR3U3RhcnRPYmpOdW07CisgIGkrKzsKKyAgRlhfQk9PTCBiTmV3U3RhcnQgPSBGQUxTRTsKKyAgZm9yICg7IGkgPCBpQ291bnQ7IGkrKykgeworICAgIEZYX0RXT1JEIGR3Q3VyT2JqTnVtID0gbV9OZXdPYmpOdW1BcnJheS5FbGVtZW50QXQoaSk7CisgICAgYm9vbCBiRXhpc3QgPSBtX3BQYXJzZXIgJiYgbV9wUGFyc2VyLT5Jc1ZhbGlkT2JqZWN0TnVtYmVyKGR3Q3VyT2JqTnVtKSAmJgorICAgICAgICAgICAgICAgICAgbV9PYmplY3RPZmZzZXQuR2V0UHRyQXQoZHdDdXJPYmpOdW0pOworICAgIGlmIChiRXhpc3QgfHwgZHdDdXJPYmpOdW0gLSBkd0xhc3RPYmpOdW0gPiAxKSB7CisgICAgICBpZiAoIWJOZXdTdGFydCkKKyAgICAgICAgbV9PYmplY3RPZmZzZXQuQWRkKGR3U3RhcnRPYmpOdW0sIGR3TGFzdE9iak51bSAtIGR3U3RhcnRPYmpOdW0gKyAxKTsKKyAgICAgIGR3U3RhcnRPYmpOdW0gPSBkd0N1ck9iak51bTsKKyAgICB9CisgICAgaWYgKGJOZXdTdGFydCkgeworICAgICAgZHdTdGFydE9iak51bSA9IGR3Q3VyT2JqTnVtOworICAgIH0KKyAgICBiTmV3U3RhcnQgPSBiRXhpc3Q7CisgICAgZHdMYXN0T2JqTnVtID0gZHdDdXJPYmpOdW07CisgIH0KKyAgbV9PYmplY3RPZmZzZXQuQWRkKGR3U3RhcnRPYmpOdW0sIGR3TGFzdE9iak51bSAtIGR3U3RhcnRPYmpOdW0gKyAxKTsKK30KK3ZvaWQgQ1BERl9DcmVhdG9yOjpBcHBlbmROZXdPYmpOdW0oRlhfRFdPUkQgb2JqYnVtKSB7CisgIGludDMyX3QgaVN0YXJ0ID0gMCwgaUZpbmQgPSAwOworICBpbnQzMl90IGlFbmQgPSBtX05ld09iak51bUFycmF5LkdldFVwcGVyQm91bmQoKTsKKyAgd2hpbGUgKGlTdGFydCA8PSBpRW5kKSB7CisgICAgaW50MzJfdCBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsKKyAgICBGWF9EV09SRCBkd01pZCA9IG1fTmV3T2JqTnVtQXJyYXkuRWxlbWVudEF0KGlNaWQpOworICAgIGlmIChvYmpidW0gPCBkd01pZCkgeworICAgICAgaUVuZCA9IGlNaWQgLSAxOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoaU1pZCA9PSBpRW5kKSB7CisgICAgICAgIGlGaW5kID0gaU1pZCArIDE7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgRlhfRFdPUkQgZHdOZXh0ID0gbV9OZXdPYmpOdW1BcnJheS5FbGVtZW50QXQoaU1pZCArIDEpOworICAgICAgaWYgKG9iamJ1bSA8IGR3TmV4dCkgeworICAgICAgICBpRmluZCA9IGlNaWQgKyAxOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOworICAgIH0KKyAgfQorICBtX05ld09iak51bUFycmF5Lkluc2VydEF0KGlGaW5kLCBvYmpidW0pOworfQoraW50MzJfdCBDUERGX0NyZWF0b3I6OldyaXRlRG9jX1N0YWdlMShJRlhfUGF1c2UqIHBQYXVzZSkgeworICBGWFNZU19hc3NlcnQobV9pU3RhZ2UgPiAtMSB8fCBtX2lTdGFnZSA8IDIwKTsKKyAgaWYgKG1faVN0YWdlID09IDApIHsKKyAgICBpZiAoIW1fcFBhcnNlcikgeworICAgICAgbV9kd0ZsYWdzICY9IH5GUERGQ1JFQVRFX0lOQ1JFTUVOVEFMOworICAgIH0KKyAgICBpZiAobV9iU2VjdXJpdHlDaGFuZ2VkICYmIChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX05PX09SSUdJTkFMKSA9PSAwKSB7CisgICAgICBtX2R3RmxhZ3MgJj0gfkZQREZDUkVBVEVfSU5DUkVNRU5UQUw7CisgICAgfQorICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpOworICAgIG1fcE1ldGFkYXRhID0gcERpY3QgPyBwRGljdC0+R2V0RWxlbWVudFZhbHVlKCJNZXRhZGF0YSIpIDogTlVMTDsKKyAgICBpZiAobV9kd0ZsYWdzICYgRlBERkNSRUFURV9PQkpFQ1RTVFJFQU0pIHsKKyAgICAgIG1fcFhSZWZTdHJlYW0gPSBuZXcgQ1BERl9YUmVmU3RyZWFtOworICAgICAgbV9wWFJlZlN0cmVhbS0+U3RhcnQoKTsKKyAgICAgIGlmICgobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgIT0gMCAmJiBtX3BQYXJzZXIpIHsKKyAgICAgICAgRlhfRklMRVNJWkUgcHJldiA9IG1fcFBhcnNlci0+R2V0TGFzdFhSZWZPZmZzZXQoKTsKKyAgICAgICAgbV9wWFJlZlN0cmVhbS0+bV9QcmV2T2Zmc2V0ID0gcHJldjsKKyAgICAgIH0KKyAgICB9CisgICAgbV9pU3RhZ2UgPSAxMDsKKyAgfQorICBpZiAobV9pU3RhZ2UgPT0gMTApIHsKKyAgICBpZiAoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpID09IDApIHsKKyAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCIlUERGLTEuIikgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIG1fT2Zmc2V0ICs9IDc7CisgICAgICBpbnQzMl90IHZlcnNpb24gPSA3OworICAgICAgaWYgKG1fRmlsZVZlcnNpb24pIHsKKyAgICAgICAgdmVyc2lvbiA9IG1fRmlsZVZlcnNpb247CisgICAgICB9IGVsc2UgaWYgKG1fcFBhcnNlcikgeworICAgICAgICB2ZXJzaW9uID0gbV9wUGFyc2VyLT5HZXRGaWxlVmVyc2lvbigpOworICAgICAgfQorICAgICAgaW50MzJfdCBsZW4gPSBtX0ZpbGUuQXBwZW5kRFdvcmQodmVyc2lvbiAlIDEwKTsKKyAgICAgIGlmIChsZW4gPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIG1fT2Zmc2V0ICs9IGxlbjsKKyAgICAgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZFN0cmluZygiXHJcbiVceEExXHhCM1x4QzVceEQ3XHJcbiIpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgbV9PZmZzZXQgKz0gbGVuOworICAgICAgSW5pdE9sZE9iak51bU9mZnNldHMoKTsKKyAgICAgIG1faVN0YWdlID0gMjA7CisgICAgfSBlbHNlIHsKKyAgICAgIElGWF9GaWxlUmVhZCogcFNyY0ZpbGUgPSBtX3BQYXJzZXItPkdldEZpbGVBY2Nlc3MoKTsKKyAgICAgIG1fT2Zmc2V0ID0gcFNyY0ZpbGUtPkdldFNpemUoKTsKKyAgICAgIG1fUG9zID0gKHZvaWQqKSh1aW50cHRyX3QpbV9PZmZzZXQ7CisgICAgICBtX2lTdGFnZSA9IDE1OworICAgIH0KKyAgfQorICBpZiAobV9pU3RhZ2UgPT0gMTUpIHsKKyAgICBpZiAoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfTk9fT1JJR0lOQUwpID09IDAgJiYgbV9Qb3MpIHsKKyAgICAgIElGWF9GaWxlUmVhZCogcFNyY0ZpbGUgPSBtX3BQYXJzZXItPkdldEZpbGVBY2Nlc3MoKTsKKyAgICAgIHVpbnQ4X3QgYnVmZmVyWzQwOTZdOworICAgICAgRlhfRFdPUkQgc3JjX3NpemUgPSAoRlhfRFdPUkQpKHVpbnRwdHJfdCltX1BvczsKKyAgICAgIHdoaWxlIChzcmNfc2l6ZSkgeworICAgICAgICBGWF9EV09SRCBibG9ja19zaXplID0gc3JjX3NpemUgPiA0MDk2ID8gNDA5NiA6IHNyY19zaXplOworICAgICAgICBpZiAoIXBTcmNGaWxlLT5SZWFkQmxvY2soYnVmZmVyLCBtX09mZnNldCAtIHNyY19zaXplLCBibG9ja19zaXplKSkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobV9GaWxlLkFwcGVuZEJsb2NrKGJ1ZmZlciwgYmxvY2tfc2l6ZSkgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHNyY19zaXplIC09IGJsb2NrX3NpemU7CisgICAgICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7CisgICAgICAgICAgbV9Qb3MgPSAodm9pZCopKHVpbnRwdHJfdClzcmNfc2l6ZTsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfTk9fT1JJR0lOQUwpID09IDAgJiYKKyAgICAgICAgbV9wUGFyc2VyLT5HZXRMYXN0WFJlZk9mZnNldCgpID09IDApIHsKKyAgICAgIEluaXRPbGRPYmpOdW1PZmZzZXRzKCk7CisgICAgICBGWF9EV09SRCBkd0VuZCA9IG1fcFBhcnNlci0+R2V0TGFzdE9iak51bSgpOworICAgICAgRlhfQk9PTCBiT2JqU3RtID0gKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfT0JKRUNUU1RSRUFNKSAhPSAwOworICAgICAgZm9yIChGWF9EV09SRCBvYmpudW0gPSAwOyBvYmpudW0gPD0gZHdFbmQ7IG9iam51bSsrKSB7CisgICAgICAgIGlmIChtX3BQYXJzZXItPm1fVjVUeXBlW29iam51bV0gPT0gMCB8fAorICAgICAgICAgICAgbV9wUGFyc2VyLT5tX1Y1VHlwZVtvYmpudW1dID09IDI1NSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG1fT2JqZWN0T2Zmc2V0W29iam51bV0gPSBtX3BQYXJzZXItPm1fT2JqZWN0SW5mb1tvYmpudW1dLnBvczsKKyAgICAgICAgaWYgKGJPYmpTdG0pIHsKKyAgICAgICAgICBtX3BYUmVmU3RyZWFtLT5BZGRPYmplY3ROdW1iZXJUb0luZGV4QXJyYXkob2JqbnVtKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGJPYmpTdG0pIHsKKyAgICAgICAgbV9wWFJlZlN0cmVhbS0+RW5kWFJlZlN0cmVhbSh0aGlzKTsKKyAgICAgICAgbV9wWFJlZlN0cmVhbS0+U3RhcnQoKTsKKyAgICAgIH0KKyAgICB9CisgICAgbV9pU3RhZ2UgPSAyMDsKKyAgfQorICBJbml0TmV3T2JqTnVtT2Zmc2V0cygpOworICByZXR1cm4gbV9pU3RhZ2U7Cit9CitpbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVEb2NfU3RhZ2UyKElGWF9QYXVzZSogcFBhdXNlKSB7CisgIEZYU1lTX2Fzc2VydChtX2lTdGFnZSA+PSAyMCB8fCBtX2lTdGFnZSA8IDMwKTsKKyAgaWYgKG1faVN0YWdlID09IDIwKSB7CisgICAgaWYgKChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSA9PSAwICYmIG1fcFBhcnNlcikgeworICAgICAgbV9Qb3MgPSAodm9pZCopKHVpbnRwdHJfdCkwOworICAgICAgbV9pU3RhZ2UgPSAyMTsKKyAgICB9IGVsc2UgeworICAgICAgbV9pU3RhZ2UgPSAyNTsKKyAgICB9CisgIH0KKyAgaWYgKG1faVN0YWdlID09IDIxKSB7CisgICAgaW50MzJfdCBpUmV0ID0gV3JpdGVPbGRPYmpzKHBQYXVzZSk7CisgICAgaWYgKGlSZXQpIHsKKyAgICAgIHJldHVybiBpUmV0OworICAgIH0KKyAgICBtX2lTdGFnZSA9IDI1OworICB9CisgIGlmIChtX2lTdGFnZSA9PSAyNSkgeworICAgIG1fUG9zID0gKHZvaWQqKSh1aW50cHRyX3QpMDsKKyAgICBtX2lTdGFnZSA9IDI2OworICB9CisgIGlmIChtX2lTdGFnZSA9PSAyNikgeworICAgIGludDMyX3QgaVJldCA9CisgICAgICAgIFdyaXRlTmV3T2JqcygobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgIT0gMCwgcFBhdXNlKTsKKyAgICBpZiAoaVJldCkgeworICAgICAgcmV0dXJuIGlSZXQ7CisgICAgfQorICAgIG1faVN0YWdlID0gMjc7CisgIH0KKyAgaWYgKG1faVN0YWdlID09IDI3KSB7CisgICAgaWYgKE5VTEwgIT0gbV9wRW5jcnlwdERpY3QgJiYgMCA9PSBtX3BFbmNyeXB0RGljdC0+R2V0T2JqTnVtKCkpIHsKKyAgICAgIG1fZHdMYXN0T2JqTnVtICs9IDE7CisgICAgICBGWF9GSUxFU0laRSBzYXZlT2Zmc2V0ID0gbV9PZmZzZXQ7CisgICAgICBpZiAoV3JpdGVJbmRpcmVjdE9iaihtX2R3TGFzdE9iak51bSwgbV9wRW5jcnlwdERpY3QpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBtX09iamVjdE9mZnNldC5BZGQobV9kd0xhc3RPYmpOdW0sIDEpOworICAgICAgbV9PYmplY3RPZmZzZXRbbV9kd0xhc3RPYmpOdW1dID0gc2F2ZU9mZnNldDsKKyAgICAgIG1fZHdFbnJ5cHRPYmpOdW0gPSBtX2R3TGFzdE9iak51bTsKKyAgICAgIGlmIChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSB7CisgICAgICAgIG1fTmV3T2JqTnVtQXJyYXkuQWRkKG1fZHdMYXN0T2JqTnVtKTsKKyAgICAgIH0KKyAgICB9CisgICAgbV9pU3RhZ2UgPSA4MDsKKyAgfQorICByZXR1cm4gbV9pU3RhZ2U7Cit9CitpbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVEb2NfU3RhZ2UzKElGWF9QYXVzZSogcFBhdXNlKSB7CisgIEZYU1lTX2Fzc2VydChtX2lTdGFnZSA+PSA4MCB8fCBtX2lTdGFnZSA8IDkwKTsKKyAgRlhfRFdPUkQgZHdMYXN0T2JqTnVtID0gbV9kd0xhc3RPYmpOdW07CisgIGlmIChtX2lTdGFnZSA9PSA4MCkgeworICAgIG1fWHJlZlN0YXJ0ID0gbV9PZmZzZXQ7CisgICAgaWYgKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfT0JKRUNUU1RSRUFNKSB7CisgICAgICBtX3BYUmVmU3RyZWFtLT5FbmQodGhpcywgVFJVRSk7CisgICAgICBtX1hyZWZTdGFydCA9IG1fcFhSZWZTdHJlYW0tPm1fUHJldk9mZnNldDsKKyAgICAgIG1faVN0YWdlID0gOTA7CisgICAgfSBlbHNlIGlmICgobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgPT0gMCB8fAorICAgICAgICAgICAgICAgIW1fcFBhcnNlci0+SXNYUmVmU3RyZWFtKCkpIHsKKyAgICAgIGlmICgobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgPT0gMCB8fAorICAgICAgICAgIG1fcFBhcnNlci0+R2V0TGFzdFhSZWZPZmZzZXQoKSA9PSAwKSB7CisgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKKyAgICAgICAgc3RyID0gbV9PYmplY3RPZmZzZXQuR2V0UHRyQXQoMSkKKyAgICAgICAgICAgICAgICAgID8gInhyZWZcclxuIgorICAgICAgICAgICAgICAgICAgOiAieHJlZlxyXG4wIDFcclxuMDAwMDAwMDAwMCA2NTUzNSBmXHJcbiI7CisgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKHN0cikgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG1fUG9zID0gKHZvaWQqKSh1aW50cHRyX3QpMTsKKyAgICAgICAgbV9pU3RhZ2UgPSA4MTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCJ4cmVmXHJcbiIpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBtX1BvcyA9ICh2b2lkKikodWludHB0cl90KTA7CisgICAgICAgIG1faVN0YWdlID0gODI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG1faVN0YWdlID0gOTA7CisgICAgfQorICB9CisgIGlmIChtX2lTdGFnZSA9PSA4MSkgeworICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKKyAgICBGWF9EV09SRCBpID0gKEZYX0RXT1JEKSh1aW50cHRyX3QpbV9Qb3MsIGo7CisgICAgd2hpbGUgKGkgPD0gZHdMYXN0T2JqTnVtKSB7CisgICAgICB3aGlsZSAoaSA8PSBkd0xhc3RPYmpOdW0gJiYgIW1fT2JqZWN0T2Zmc2V0LkdldFB0ckF0KGkpKSB7CisgICAgICAgIGkrKzsKKyAgICAgIH0KKyAgICAgIGlmIChpID4gZHdMYXN0T2JqTnVtKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaiA9IGk7CisgICAgICB3aGlsZSAoaiA8PSBkd0xhc3RPYmpOdW0gJiYgbV9PYmplY3RPZmZzZXQuR2V0UHRyQXQoaikpIHsKKyAgICAgICAgaisrOworICAgICAgfQorICAgICAgaWYgKGkgPT0gMSkgeworICAgICAgICBzdHIuRm9ybWF0KCIwICVkXHJcbjAwMDAwMDAwMDAgNjU1MzUgZlxyXG4iLCBqKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0ci5Gb3JtYXQoIiVkICVkXHJcbiIsIGksIGogLSBpKTsKKyAgICAgIH0KKyAgICAgIGlmIChtX0ZpbGUuQXBwZW5kQmxvY2soc3RyLmNfc3RyKCksIHN0ci5HZXRMZW5ndGgoKSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChpIDwgaikgeworICAgICAgICBzdHIuRm9ybWF0KCIlMDEwZCAwMDAwMCBuXHJcbiIsIG1fT2JqZWN0T2Zmc2V0W2krK10pOworICAgICAgICBpZiAobV9GaWxlLkFwcGVuZEJsb2NrKHN0ci5jX3N0cigpLCBzdHIuR2V0TGVuZ3RoKCkpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGkgPiBkd0xhc3RPYmpOdW0pIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgeworICAgICAgICBtX1BvcyA9ICh2b2lkKikodWludHB0cl90KWk7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKyAgICBtX2lTdGFnZSA9IDkwOworICB9CisgIGlmIChtX2lTdGFnZSA9PSA4MikgeworICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKKyAgICBpbnQzMl90IGlDb3VudCA9IG1fTmV3T2JqTnVtQXJyYXkuR2V0U2l6ZSgpOworICAgIGludDMyX3QgaSA9IChpbnQzMl90KSh1aW50cHRyX3QpbV9Qb3M7CisgICAgd2hpbGUgKGkgPCBpQ291bnQpIHsKKyAgICAgIGludDMyX3QgaiA9IGk7CisgICAgICBGWF9EV09SRCBvYmpudW0gPSBtX05ld09iak51bUFycmF5LkVsZW1lbnRBdChpKTsKKyAgICAgIHdoaWxlIChqIDwgaUNvdW50KSB7CisgICAgICAgIGlmICgrK2ogPT0gaUNvdW50KSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgRlhfRFdPUkQgZHdDdXJyZW50ID0gbV9OZXdPYmpOdW1BcnJheS5FbGVtZW50QXQoaik7CisgICAgICAgIGlmIChkd0N1cnJlbnQgLSBvYmpudW0gPiAxKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgb2JqbnVtID0gZHdDdXJyZW50OworICAgICAgfQorICAgICAgb2JqbnVtID0gbV9OZXdPYmpOdW1BcnJheS5FbGVtZW50QXQoaSk7CisgICAgICBpZiAob2JqbnVtID09IDEpIHsKKyAgICAgICAgc3RyLkZvcm1hdCgiMCAlZFxyXG4wMDAwMDAwMDAwIDY1NTM1IGZcclxuIiwgaiAtIGkgKyAxKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0ci5Gb3JtYXQoIiVkICVkXHJcbiIsIG9iam51bSwgaiAtIGkpOworICAgICAgfQorICAgICAgaWYgKG1fRmlsZS5BcHBlbmRCbG9jayhzdHIuY19zdHIoKSwgc3RyLkdldExlbmd0aCgpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgd2hpbGUgKGkgPCBqKSB7CisgICAgICAgIG9iam51bSA9IG1fTmV3T2JqTnVtQXJyYXkuRWxlbWVudEF0KGkrKyk7CisgICAgICAgIHN0ci5Gb3JtYXQoIiUwMTBkIDAwMDAwIG5cclxuIiwgbV9PYmplY3RPZmZzZXRbb2JqbnVtXSk7CisgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kQmxvY2soc3RyLmNfc3RyKCksIHN0ci5HZXRMZW5ndGgoKSkgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAocFBhdXNlICYmIChpICUgMTAwKSA9PSAwICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgeworICAgICAgICBtX1BvcyA9ICh2b2lkKikodWludHB0cl90KWk7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKyAgICBtX2lTdGFnZSA9IDkwOworICB9CisgIHJldHVybiBtX2lTdGFnZTsKK30KKworaW50MzJfdCBDUERGX0NyZWF0b3I6OldyaXRlRG9jX1N0YWdlNChJRlhfUGF1c2UqIHBQYXVzZSkgeworICBGWFNZU19hc3NlcnQobV9pU3RhZ2UgPj0gOTApOworICBpZiAoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfT0JKRUNUU1RSRUFNKSA9PSAwKSB7CisgICAgRlhfQk9PTCBiWFJlZlN0cmVhbSA9CisgICAgICAgIChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSAhPSAwICYmIG1fcFBhcnNlci0+SXNYUmVmU3RyZWFtKCk7CisgICAgaWYgKCFiWFJlZlN0cmVhbSkgeworICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoInRyYWlsZXJcclxuPDwiKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAobV9GaWxlLkFwcGVuZERXb3JkKG1fcERvY3VtZW50LT5tX0xhc3RPYmpOdW0gKyAxKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoIiAwIG9iaiA8PCIpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgfQorICAgIGlmIChtX3BQYXJzZXIpIHsKKyAgICAgIENQREZfRGljdGlvbmFyeSogcCA9IG1fcFBhcnNlci0+bV9wVHJhaWxlcjsKKyAgICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiAqcCkgeworICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYga2V5ID0gaXQuZmlyc3Q7CisgICAgICAgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBpdC5zZWNvbmQ7CisgICAgICAgIC8vIFRPRE8ob2NoYW5nKTogQ29uc29saWRhdGUgd2l0aCBzaW1pbGFyIGNoZWNrIGluCisgICAgICAgIC8vIFBERl9DcmVhdG9yV3JpdGVUcmFpbGVyLgorICAgICAgICBpZiAoa2V5ID09ICJFbmNyeXB0IiB8fCBrZXkgPT0gIlNpemUiIHx8IGtleSA9PSAiRmlsdGVyIiB8fAorICAgICAgICAgICAga2V5ID09ICJJbmRleCIgfHwga2V5ID09ICJMZW5ndGgiIHx8IGtleSA9PSAiUHJldiIgfHwga2V5ID09ICJXIiB8fAorICAgICAgICAgICAga2V5ID09ICJYUmVmU3RtIiB8fCBrZXkgPT0gIklEIikgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCgiLyIpKSA8IDApIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoUERGX05hbWVFbmNvZGUoa2V5KSkgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChwVmFsdWUtPkdldE9iak51bSgpKSB7CisgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoIiAiKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmREV29yZChwVmFsdWUtPkdldE9iak51bSgpKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoIiAwIFIgIikgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IDA7CisgICAgICAgICAgaWYgKFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KHBWYWx1ZSwgJm1fRmlsZSwgb2Zmc2V0KSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoIlxyXG4vUm9vdCAiKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKG1fRmlsZS5BcHBlbmREV29yZChtX3BEb2N1bWVudC0+bV9wUm9vdERpY3QtPkdldE9iak51bSgpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoIiAwIFJcclxuIikgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGlmIChtX3BEb2N1bWVudC0+bV9wSW5mb0RpY3QpIHsKKyAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoIi9JbmZvICIpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobV9GaWxlLkFwcGVuZERXb3JkKG1fcERvY3VtZW50LT5tX3BJbmZvRGljdC0+R2V0T2JqTnVtKCkpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiIDAgUlxyXG4iKSA8IDApIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgIH0KICAgICB9CiAgICAgaWYgKG1fcEVuY3J5cHREaWN0KSB7Ci0gICAgICAgIG1fcEVuY3J5cHREaWN0LT5SZWxlYXNlKCk7Ci0gICAgICAgIG1fcEVuY3J5cHREaWN0ID0gTlVMTDsKKyAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCIvRW5jcnlwdCIpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBGWF9EV09SRCBkd09iak51bSA9IG1fcEVuY3J5cHREaWN0LT5HZXRPYmpOdW0oKTsKKyAgICAgIGlmIChkd09iak51bSA9PSAwKSB7CisgICAgICAgIGR3T2JqTnVtID0gbV9wRG9jdW1lbnQtPkdldExhc3RPYmpOdW0oKSArIDE7CisgICAgICB9CisgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiICIpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBpZiAobV9GaWxlLkFwcGVuZERXb3JkKGR3T2JqTnVtKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoIiAwIFIgIikgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KICAgICB9Ci0gICAgbV9iU3RhbmRhcmRTZWN1cml0eSA9IEZBTFNFOworICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCIvU2l6ZSAiKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKG1fRmlsZS5BcHBlbmREV29yZChtX2R3TGFzdE9iak51bSArIChiWFJlZlN0cmVhbSA/IDIgOiAxKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICgobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgIT0gMCkgeworICAgICAgRlhfRklMRVNJWkUgcHJldiA9IG1fcFBhcnNlci0+R2V0TGFzdFhSZWZPZmZzZXQoKTsKKyAgICAgIGlmIChwcmV2KSB7CisgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCIvUHJldiAiKSA8IDApIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgRlhfQ0hBUiBvZmZzZXRfYnVmWzIwXTsKKyAgICAgICAgRlhTWVNfbWVtc2V0KG9mZnNldF9idWYsIDAsIHNpemVvZihvZmZzZXRfYnVmKSk7CisgICAgICAgIEZYU1lTX2k2NHRvYShwcmV2LCBvZmZzZXRfYnVmLCAxMCk7CisgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kQmxvY2sob2Zmc2V0X2J1ZiwgRlhTWVNfc3RybGVuKG9mZnNldF9idWYpKSA8IDApIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG1fcElEQXJyYXkpIHsKKyAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCgiL0lEIikpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBGWF9GSUxFU0laRSBvZmZzZXQgPSAwOworICAgICAgaWYgKFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KG1fcElEQXJyYXksICZtX0ZpbGUsIG9mZnNldCkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFiWFJlZlN0cmVhbSkgeworICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoIj4+IikgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoIi9XWzAgNCAxXS9JbmRleFsiKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSAhPSAwICYmIG1fcFBhcnNlciAmJgorICAgICAgICAgIG1fcFBhcnNlci0+R2V0TGFzdFhSZWZPZmZzZXQoKSA9PSAwKSB7CisgICAgICAgIEZYX0RXT1JEIGkgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9kd0xhc3RPYmpOdW07IGkrKykgeworICAgICAgICAgIGlmICghbV9PYmplY3RPZmZzZXQuR2V0UHRyQXQoaSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZERXb3JkKGkpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiIDEgIikgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCJdL0xlbmd0aCAiKSA8IDApIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmREV29yZChtX2R3TGFzdE9iak51bSAqIDUpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiPj5zdHJlYW1cclxuIikgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtX2R3TGFzdE9iak51bTsgaSsrKSB7CisgICAgICAgICAgRlhfRklMRVNJWkUqIG9mZnNldCA9IG1fT2JqZWN0T2Zmc2V0LkdldFB0ckF0KGkpOworICAgICAgICAgIGlmICghb2Zmc2V0KSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgT3V0cHV0SW5kZXgoJm1fRmlsZSwgKm9mZnNldCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCBjb3VudCA9IG1fTmV3T2JqTnVtQXJyYXkuR2V0U2l6ZSgpOworICAgICAgICBpbnQzMl90IGkgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgIEZYX0RXT1JEIG9iam51bSA9IG1fTmV3T2JqTnVtQXJyYXkuRWxlbWVudEF0KGkpOworICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kRFdvcmQob2JqbnVtKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoIiAxICIpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiXS9MZW5ndGggIikgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kRFdvcmQoY291bnQgKiA1KSA8IDApIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoIj4+c3RyZWFtXHJcbiIpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgIEZYX0RXT1JEIG9iam51bSA9IG1fTmV3T2JqTnVtQXJyYXkuRWxlbWVudEF0KGkpOworICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IG1fT2JqZWN0T2Zmc2V0W29iam51bV07CisgICAgICAgICAgT3V0cHV0SW5kZXgoJm1fRmlsZSwgb2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoIlxyXG5lbmRzdHJlYW0iKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiXHJcbnN0YXJ0eHJlZlxyXG4iKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgRlhfQ0hBUiBvZmZzZXRfYnVmWzIwXTsKKyAgRlhTWVNfbWVtc2V0KG9mZnNldF9idWYsIDAsIHNpemVvZihvZmZzZXRfYnVmKSk7CisgIEZYU1lTX2k2NHRvYShtX1hyZWZTdGFydCwgb2Zmc2V0X2J1ZiwgMTApOworICBpZiAobV9GaWxlLkFwcGVuZEJsb2NrKG9mZnNldF9idWYsIEZYU1lTX3N0cmxlbihvZmZzZXRfYnVmKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCJcclxuJSVFT0ZcclxuIikgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIG1fRmlsZS5GbHVzaCgpOworICByZXR1cm4gbV9pU3RhZ2UgPSAxMDA7Cit9Cit2b2lkIENQREZfQ3JlYXRvcjo6Q2xlYXIoKSB7CisgIGRlbGV0ZSBtX3BYUmVmU3RyZWFtOworICBtX3BYUmVmU3RyZWFtID0gTlVMTDsKKyAgbV9GaWxlLkNsZWFyKCk7CisgIG1fTmV3T2JqTnVtQXJyYXkuUmVtb3ZlQWxsKCk7CisgIGlmIChtX3BJREFycmF5KSB7CisgICAgbV9wSURBcnJheS0+UmVsZWFzZSgpOworICAgIG1fcElEQXJyYXkgPSBOVUxMOworICB9Cit9CitGWF9CT09MIENQREZfQ3JlYXRvcjo6Q3JlYXRlKElGWF9TdHJlYW1Xcml0ZSogcEZpbGUsIEZYX0RXT1JEIGZsYWdzKSB7CisgIGlmICghcEZpbGUpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKCFtX0ZpbGUuQXR0YWNoRmlsZShwRmlsZSwgRkFMU0UpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBDcmVhdGUoZmxhZ3MpOworfQorRlhfQk9PTCBDUERGX0NyZWF0b3I6OkNyZWF0ZShGWF9EV09SRCBmbGFncykgeworICBtX2R3RmxhZ3MgPSBmbGFnczsKKyAgbV9pU3RhZ2UgPSAwOworICBtX09mZnNldCA9IDA7CisgIG1fZHdMYXN0T2JqTnVtID0gbV9wRG9jdW1lbnQtPkdldExhc3RPYmpOdW0oKTsKKyAgbV9PYmplY3RPZmZzZXQuQ2xlYXIoKTsKKyAgbV9OZXdPYmpOdW1BcnJheS5SZW1vdmVBbGwoKTsKKyAgSW5pdElEKCk7CisgIGlmIChmbGFncyAmIEZQREZDUkVBVEVfUFJPR1JFU1NJVkUpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gQ29udGludWUoTlVMTCkgPiAtMTsKK30KK3ZvaWQgQ1BERl9DcmVhdG9yOjpJbml0SUQoRlhfQk9PTCBiRGVmYXVsdCkgeworICBDUERGX0FycmF5KiBwT2xkSURBcnJheSA9IG1fcFBhcnNlciA/IG1fcFBhcnNlci0+R2V0SURBcnJheSgpIDogTlVMTDsKKyAgRlhfQk9PTCBiTmV3SWQgPSAhbV9wSURBcnJheTsKKyAgaWYgKCFtX3BJREFycmF5KSB7CisgICAgbV9wSURBcnJheSA9IG5ldyBDUERGX0FycmF5OworICAgIENQREZfT2JqZWN0KiBwSUQxID0gcE9sZElEQXJyYXkgPyBwT2xkSURBcnJheS0+R2V0RWxlbWVudCgwKSA6IE5VTEw7CisgICAgaWYgKHBJRDEpIHsKKyAgICAgIG1fcElEQXJyYXktPkFkZChwSUQxLT5DbG9uZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmZmVyID0KKyAgICAgICAgICBQREZfR2VuZXJhdGVGaWxlSUQoKEZYX0RXT1JEKSh1aW50cHRyX3QpIHRoaXMsIG1fZHdMYXN0T2JqTnVtKTsKKyAgICAgIENGWF9CeXRlU3RyaW5nQyBic0J1ZmZlcihidWZmZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpKTsKKyAgICAgIG1fcElEQXJyYXktPkFkZChuZXcgQ1BERl9TdHJpbmcoYnNCdWZmZXIsIFRSVUUpLCBtX3BEb2N1bWVudCk7CisgICAgfQorICB9CisgIGlmICghYkRlZmF1bHQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHBPbGRJREFycmF5KSB7CisgICAgQ1BERl9PYmplY3QqIHBJRDIgPSBwT2xkSURBcnJheS0+R2V0RWxlbWVudCgxKTsKKyAgICBpZiAoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpICYmIG1fcEVuY3J5cHREaWN0ICYmIHBJRDIpIHsKKyAgICAgIG1fcElEQXJyYXktPkFkZChwSUQyLT5DbG9uZSgpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmZmVyID0KKyAgICAgICAgUERGX0dlbmVyYXRlRmlsZUlEKChGWF9EV09SRCkodWludHB0cl90KSB0aGlzLCBtX2R3TGFzdE9iak51bSk7CisgICAgQ0ZYX0J5dGVTdHJpbmdDIGJzQnVmZmVyKGJ1ZmZlci5kYXRhKCksIGJ1ZmZlci5zaXplKCkpOworICAgIG1fcElEQXJyYXktPkFkZChuZXcgQ1BERl9TdHJpbmcoYnNCdWZmZXIsIFRSVUUpLCBtX3BEb2N1bWVudCk7CisgICAgcmV0dXJuOworICB9CisgIG1fcElEQXJyYXktPkFkZChtX3BJREFycmF5LT5HZXRFbGVtZW50KDApLT5DbG9uZSgpKTsKKyAgaWYgKG1fcEVuY3J5cHREaWN0ICYmICFwT2xkSURBcnJheSAmJiBtX3BQYXJzZXIgJiYgYk5ld0lkKSB7CisgICAgaWYgKG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoIkZpbHRlciIpID09ICJTdGFuZGFyZCIpIHsKKyAgICAgIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXIgaGFuZGxlcjsKKyAgICAgIENGWF9CeXRlU3RyaW5nIHVzZXJfcGFzcyA9IG1fcFBhcnNlci0+R2V0UGFzc3dvcmQoKTsKKyAgICAgIEZYX0RXT1JEIGZsYWcgPSBQREZfRU5DUllQVF9DT05URU5UOworICAgICAgaGFuZGxlci5PbkNyZWF0ZShtX3BFbmNyeXB0RGljdCwgbV9wSURBcnJheSwgKGNvbnN0IHVpbnQ4X3QqKXVzZXJfcGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9wYXNzLkdldExlbmd0aCgpLCBmbGFnKTsKKyAgICAgIGlmIChtX2JOZXdDcnlwdG8pIHsKKyAgICAgICAgZGVsZXRlIG1fcENyeXB0b0hhbmRsZXI7CisgICAgICB9CisgICAgICBtX3BDcnlwdG9IYW5kbGVyID0gbmV3IENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOworICAgICAgbV9wQ3J5cHRvSGFuZGxlci0+SW5pdChtX3BFbmNyeXB0RGljdCwgJmhhbmRsZXIpOworICAgICAgbV9iTmV3Q3J5cHRvID0gVFJVRTsKKyAgICAgIG1fYlNlY3VyaXR5Q2hhbmdlZCA9IFRSVUU7CisgICAgfQorICB9Cit9CitpbnQzMl90IENQREZfQ3JlYXRvcjo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgaWYgKG1faVN0YWdlIDwgMCkgeworICAgIHJldHVybiBtX2lTdGFnZTsKKyAgfQorICBpbnQzMl90IGlSZXQgPSAwOworICB3aGlsZSAobV9pU3RhZ2UgPCAxMDApIHsKKyAgICBpZiAobV9pU3RhZ2UgPCAyMCkgeworICAgICAgaVJldCA9IFdyaXRlRG9jX1N0YWdlMShwUGF1c2UpOworICAgIH0gZWxzZSBpZiAobV9pU3RhZ2UgPCAzMCkgeworICAgICAgaVJldCA9IFdyaXRlRG9jX1N0YWdlMihwUGF1c2UpOworICAgIH0gZWxzZSBpZiAobV9pU3RhZ2UgPCA5MCkgeworICAgICAgaVJldCA9IFdyaXRlRG9jX1N0YWdlMyhwUGF1c2UpOworICAgIH0gZWxzZSB7CisgICAgICBpUmV0ID0gV3JpdGVEb2NfU3RhZ2U0KHBQYXVzZSk7CisgICAgfQorICAgIGlmIChpUmV0IDwgbV9pU3RhZ2UpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoaVJldCA8IDEgfHwgbV9pU3RhZ2UgPT0gMTAwKSB7CisgICAgbV9pU3RhZ2UgPSAtMTsKKyAgICBDbGVhcigpOworICAgIHJldHVybiBpUmV0ID4gOTkgPyAwIDogKGlSZXQgPCAxID8gLTEgOiBpUmV0KTsKKyAgfQorICByZXR1cm4gbV9pU3RhZ2U7Cit9CitGWF9CT09MIENQREZfQ3JlYXRvcjo6U2V0RmlsZVZlcnNpb24oaW50MzJfdCBmaWxlVmVyc2lvbikgeworICBpZiAoZmlsZVZlcnNpb24gPCAxMCB8fCBmaWxlVmVyc2lvbiA+IDE3KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fRmlsZVZlcnNpb24gPSBmaWxlVmVyc2lvbjsKKyAgcmV0dXJuIFRSVUU7Cit9Cit2b2lkIENQREZfQ3JlYXRvcjo6UmVtb3ZlU2VjdXJpdHkoKSB7CisgIFJlc2V0U3RhbmRhcmRTZWN1cml0eSgpOworICBtX2JTZWN1cml0eUNoYW5nZWQgPSBUUlVFOworICBtX3BFbmNyeXB0RGljdCA9IE5VTEw7CisgIG1fcENyeXB0b0hhbmRsZXIgPSBOVUxMOworfQordm9pZCBDUERGX0NyZWF0b3I6OlJlc2V0U3RhbmRhcmRTZWN1cml0eSgpIHsKKyAgaWYgKG1fYlN0YW5kYXJkU2VjdXJpdHkgfHwgbV9iTmV3Q3J5cHRvKSB7CisgICAgZGVsZXRlIG1fcENyeXB0b0hhbmRsZXI7CisgICAgbV9wQ3J5cHRvSGFuZGxlciA9IE5VTEw7CisgIH0KKyAgbV9iTmV3Q3J5cHRvID0gRkFMU0U7CisgIGlmICghbV9iU3RhbmRhcmRTZWN1cml0eSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9wRW5jcnlwdERpY3QpIHsKKyAgICBtX3BFbmNyeXB0RGljdC0+UmVsZWFzZSgpOworICAgIG1fcEVuY3J5cHREaWN0ID0gTlVMTDsKKyAgfQorICBtX2JTdGFuZGFyZFNlY3VyaXR5ID0gRkFMU0U7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfZG9jLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9kb2MuY3BwCmluZGV4IDlkMDk2NzkuLjlmYTE5NmYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9kb2MuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9kb2MuY3BwCkBAIC0xLDExODMgKzEsMTE1MCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oIgotI2luY2x1ZGUgIi4uL2ZwZGZfcGFnZS9wYWdlaW50LmgiCiAjaW5jbHVkZSA8bGltaXRzLmg+Ci1DUERGX0RvY3VtZW50OjpDUERGX0RvY3VtZW50KCkgOiBDUERGX0luZGlyZWN0T2JqZWN0cyhOVUxMKQotewotICAgIG1fcFJvb3REaWN0ID0gTlVMTDsKLSAgICBtX3BJbmZvRGljdCA9IE5VTEw7Ci0gICAgbV9iTGluZWFyaXplZCA9IEZBTFNFOwotICAgIG1fZHdGaXJzdFBhZ2VObyA9IDA7Ci0gICAgbV9kd0ZpcnN0UGFnZU9iak51bSA9IDA7Ci0gICAgbV9wRG9jUGFnZSA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5DcmVhdGVEb2NEYXRhKHRoaXMpOwotICAgIG1fcERvY1JlbmRlciA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UmVuZGVyTW9kdWxlKCktPkNyZWF0ZURvY0RhdGEodGhpcyk7CisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oIgorI2luY2x1ZGUgImNvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL3BhZ2VpbnQuaCIKKworQ1BERl9Eb2N1bWVudDo6Q1BERl9Eb2N1bWVudCgpIDogQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlcihOVUxMKSB7CisgIG1fcFJvb3REaWN0ID0gTlVMTDsKKyAgbV9wSW5mb0RpY3QgPSBOVUxMOworICBtX2JMaW5lYXJpemVkID0gRkFMU0U7CisgIG1fZHdGaXJzdFBhZ2VObyA9IDA7CisgIG1fZHdGaXJzdFBhZ2VPYmpOdW0gPSAwOworICBtX3BEb2NQYWdlID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkNyZWF0ZURvY0RhdGEodGhpcyk7CisgIG1fcERvY1JlbmRlciA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UmVuZGVyTW9kdWxlKCktPkNyZWF0ZURvY0RhdGEodGhpcyk7CiB9Ci12b2lkIENQREZfRG9jdW1lbnQ6OkNyZWF0ZU5ld0RvYygpCi17Ci0gICAgQVNTRVJUKG1fcFJvb3REaWN0ID09IE5VTEwgJiYgbV9wSW5mb0RpY3QgPT0gTlVMTCk7Ci0gICAgbV9wUm9vdERpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgIG1fcFJvb3REaWN0LT5TZXRBdE5hbWUoIlR5cGUiLCAiQ2F0YWxvZyIpOwotICAgIGludCBvYmpudW0gPSBBZGRJbmRpcmVjdE9iamVjdChtX3BSb290RGljdCk7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZXMgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgIHBQYWdlcy0+U2V0QXROYW1lKCJUeXBlIiwgIlBhZ2VzIik7Ci0gICAgcFBhZ2VzLT5TZXRBdE51bWJlcigiQ291bnQiLCAwKTsKLSAgICBwUGFnZXMtPlNldEF0KCJLaWRzIiwgbmV3IENQREZfQXJyYXkpOwotICAgIG9iam51bSA9IEFkZEluZGlyZWN0T2JqZWN0KHBQYWdlcyk7Ci0gICAgbV9wUm9vdERpY3QtPlNldEF0UmVmZXJlbmNlKCJQYWdlcyIsIHRoaXMsIG9iam51bSk7Ci0gICAgbV9wSW5mb0RpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgIEFkZEluZGlyZWN0T2JqZWN0KG1fcEluZm9EaWN0KTsKK3ZvaWQgQ1BERl9Eb2N1bWVudDo6Q3JlYXRlTmV3RG9jKCkgeworICBBU1NFUlQoIW1fcFJvb3REaWN0ICYmICFtX3BJbmZvRGljdCk7CisgIG1fcFJvb3REaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgbV9wUm9vdERpY3QtPlNldEF0TmFtZSgiVHlwZSIsICJDYXRhbG9nIik7CisgIGludCBvYmpudW0gPSBBZGRJbmRpcmVjdE9iamVjdChtX3BSb290RGljdCk7CisgIENQREZfRGljdGlvbmFyeSogcFBhZ2VzID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgcFBhZ2VzLT5TZXRBdE5hbWUoIlR5cGUiLCAiUGFnZXMiKTsKKyAgcFBhZ2VzLT5TZXRBdE51bWJlcigiQ291bnQiLCAwKTsKKyAgcFBhZ2VzLT5TZXRBdCgiS2lkcyIsIG5ldyBDUERGX0FycmF5KTsKKyAgb2JqbnVtID0gQWRkSW5kaXJlY3RPYmplY3QocFBhZ2VzKTsKKyAgbV9wUm9vdERpY3QtPlNldEF0UmVmZXJlbmNlKCJQYWdlcyIsIHRoaXMsIG9iam51bSk7CisgIG1fcEluZm9EaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgQWRkSW5kaXJlY3RPYmplY3QobV9wSW5mb0RpY3QpOwogfQogc3RhdGljIGNvbnN0IEZYX1dDSEFSIGdfRlhfQ1A4NzRVbmljb2Rlc1sxMjhdID0gewotICAgIDB4MjBBQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwMjYsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgyMDE4LCAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDBBMCwgMHgwRTAxLCAweDBFMDIsIDB4MEUwMywgMHgwRTA0LCAweDBFMDUsIDB4MEUwNiwgMHgwRTA3LAotICAgIDB4MEUwOCwgMHgwRTA5LCAweDBFMEEsIDB4MEUwQiwgMHgwRTBDLCAweDBFMEQsIDB4MEUwRSwgMHgwRTBGLAotICAgIDB4MEUxMCwgMHgwRTExLCAweDBFMTIsIDB4MEUxMywgMHgwRTE0LCAweDBFMTUsIDB4MEUxNiwgMHgwRTE3LAotICAgIDB4MEUxOCwgMHgwRTE5LCAweDBFMUEsIDB4MEUxQiwgMHgwRTFDLCAweDBFMUQsIDB4MEUxRSwgMHgwRTFGLAotICAgIDB4MEUyMCwgMHgwRTIxLCAweDBFMjIsIDB4MEUyMywgMHgwRTI0LCAweDBFMjUsIDB4MEUyNiwgMHgwRTI3LAotICAgIDB4MEUyOCwgMHgwRTI5LCAweDBFMkEsIDB4MEUyQiwgMHgwRTJDLCAweDBFMkQsIDB4MEUyRSwgMHgwRTJGLAotICAgIDB4MEUzMCwgMHgwRTMxLCAweDBFMzIsIDB4MEUzMywgMHgwRTM0LCAweDBFMzUsIDB4MEUzNiwgMHgwRTM3LAotICAgIDB4MEUzOCwgMHgwRTM5LCAweDBFM0EsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwRTNGLAotICAgIDB4MEU0MCwgMHgwRTQxLCAweDBFNDIsIDB4MEU0MywgMHgwRTQ0LCAweDBFNDUsIDB4MEU0NiwgMHgwRTQ3LAotICAgIDB4MEU0OCwgMHgwRTQ5LCAweDBFNEEsIDB4MEU0QiwgMHgwRTRDLCAweDBFNEQsIDB4MEU0RSwgMHgwRTRGLAotICAgIDB4MEU1MCwgMHgwRTUxLCAweDBFNTIsIDB4MEU1MywgMHgwRTU0LCAweDBFNTUsIDB4MEU1NiwgMHgwRTU3LAotICAgIDB4MEU1OCwgMHgwRTU5LCAweDBFNUEsIDB4MEU1QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MjBBQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwMjYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjAxOCwKKyAgICAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwQTAsIDB4MEUwMSwgMHgwRTAyLCAweDBFMDMsCisgICAgMHgwRTA0LCAweDBFMDUsIDB4MEUwNiwgMHgwRTA3LCAweDBFMDgsIDB4MEUwOSwgMHgwRTBBLCAweDBFMEIsIDB4MEUwQywKKyAgICAweDBFMEQsIDB4MEUwRSwgMHgwRTBGLCAweDBFMTAsIDB4MEUxMSwgMHgwRTEyLCAweDBFMTMsIDB4MEUxNCwgMHgwRTE1LAorICAgIDB4MEUxNiwgMHgwRTE3LCAweDBFMTgsIDB4MEUxOSwgMHgwRTFBLCAweDBFMUIsIDB4MEUxQywgMHgwRTFELCAweDBFMUUsCisgICAgMHgwRTFGLCAweDBFMjAsIDB4MEUyMSwgMHgwRTIyLCAweDBFMjMsIDB4MEUyNCwgMHgwRTI1LCAweDBFMjYsIDB4MEUyNywKKyAgICAweDBFMjgsIDB4MEUyOSwgMHgwRTJBLCAweDBFMkIsIDB4MEUyQywgMHgwRTJELCAweDBFMkUsIDB4MEUyRiwgMHgwRTMwLAorICAgIDB4MEUzMSwgMHgwRTMyLCAweDBFMzMsIDB4MEUzNCwgMHgwRTM1LCAweDBFMzYsIDB4MEUzNywgMHgwRTM4LCAweDBFMzksCisgICAgMHgwRTNBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MEUzRiwgMHgwRTQwLCAweDBFNDEsIDB4MEU0MiwKKyAgICAweDBFNDMsIDB4MEU0NCwgMHgwRTQ1LCAweDBFNDYsIDB4MEU0NywgMHgwRTQ4LCAweDBFNDksIDB4MEU0QSwgMHgwRTRCLAorICAgIDB4MEU0QywgMHgwRTRELCAweDBFNEUsIDB4MEU0RiwgMHgwRTUwLCAweDBFNTEsIDB4MEU1MiwgMHgwRTUzLCAweDBFNTQsCisgICAgMHgwRTU1LCAweDBFNTYsIDB4MEU1NywgMHgwRTU4LCAweDBFNTksIDB4MEU1QSwgMHgwRTVCLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwKIH07CiBzdGF0aWMgY29uc3QgRlhfV0NIQVIgZ19GWF9DUDEyNTBVbmljb2Rlc1sxMjhdID0gewotICAgIDB4MjBBQywgMHgwMDAwLCAweDIwMUEsIDB4MDAwMCwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLAotICAgIDB4MDAwMCwgMHgyMDMwLCAweDAxNjAsIDB4MjAzOSwgMHgwMTVBLCAweDAxNjQsIDB4MDE3RCwgMHgwMTc5LAotICAgIDB4MDAwMCwgMHgyMDE4LCAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LAotICAgIDB4MDAwMCwgMHgyMTIyLCAweDAxNjEsIDB4MjAzQSwgMHgwMTVCLCAweDAxNjUsIDB4MDE3RSwgMHgwMTdBLAotICAgIDB4MDBBMCwgMHgwMkM3LCAweDAyRDgsIDB4MDE0MSwgMHgwMEE0LCAweDAxMDQsIDB4MDBBNiwgMHgwMEE3LAotICAgIDB4MDBBOCwgMHgwMEE5LCAweDAxNUUsIDB4MDBBQiwgMHgwMEFDLCAweDAwQUQsIDB4MDBBRSwgMHgwMTdCLAotICAgIDB4MDBCMCwgMHgwMEIxLCAweDAyREIsIDB4MDE0MiwgMHgwMEI0LCAweDAwQjUsIDB4MDBCNiwgMHgwMEI3LAotICAgIDB4MDBCOCwgMHgwMTA1LCAweDAxNUYsIDB4MDBCQiwgMHgwMTNELCAweDAyREQsIDB4MDEzRSwgMHgwMTdDLAotICAgIDB4MDE1NCwgMHgwMEMxLCAweDAwQzIsIDB4MDEwMiwgMHgwMEM0LCAweDAxMzksIDB4MDEwNiwgMHgwMEM3LAotICAgIDB4MDEwQywgMHgwMEM5LCAweDAxMTgsIDB4MDBDQiwgMHgwMTFBLCAweDAwQ0QsIDB4MDBDRSwgMHgwMTBFLAotICAgIDB4MDExMCwgMHgwMTQzLCAweDAxNDcsIDB4MDBEMywgMHgwMEQ0LCAweDAxNTAsIDB4MDBENiwgMHgwMEQ3LAotICAgIDB4MDE1OCwgMHgwMTZFLCAweDAwREEsIDB4MDE3MCwgMHgwMERDLCAweDAwREQsIDB4MDE2MiwgMHgwMERGLAotICAgIDB4MDE1NSwgMHgwMEUxLCAweDAwRTIsIDB4MDEwMywgMHgwMEU0LCAweDAxM0EsIDB4MDEwNywgMHgwMEU3LAotICAgIDB4MDEwRCwgMHgwMEU5LCAweDAxMTksIDB4MDBFQiwgMHgwMTFCLCAweDAwRUQsIDB4MDBFRSwgMHgwMTBGLAotICAgIDB4MDExMSwgMHgwMTQ0LCAweDAxNDgsIDB4MDBGMywgMHgwMEY0LCAweDAxNTEsIDB4MDBGNiwgMHgwMEY3LAotICAgIDB4MDE1OSwgMHgwMTZGLCAweDAwRkEsIDB4MDE3MSwgMHgwMEZDLCAweDAwRkQsIDB4MDE2MywgMHgwMkQ5LAorICAgIDB4MjBBQywgMHgwMDAwLCAweDIwMUEsIDB4MDAwMCwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLCAweDAwMDAsCisgICAgMHgyMDMwLCAweDAxNjAsIDB4MjAzOSwgMHgwMTVBLCAweDAxNjQsIDB4MDE3RCwgMHgwMTc5LCAweDAwMDAsIDB4MjAxOCwKKyAgICAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LCAweDAwMDAsIDB4MjEyMiwgMHgwMTYxLAorICAgIDB4MjAzQSwgMHgwMTVCLCAweDAxNjUsIDB4MDE3RSwgMHgwMTdBLCAweDAwQTAsIDB4MDJDNywgMHgwMkQ4LCAweDAxNDEsCisgICAgMHgwMEE0LCAweDAxMDQsIDB4MDBBNiwgMHgwMEE3LCAweDAwQTgsIDB4MDBBOSwgMHgwMTVFLCAweDAwQUIsIDB4MDBBQywKKyAgICAweDAwQUQsIDB4MDBBRSwgMHgwMTdCLCAweDAwQjAsIDB4MDBCMSwgMHgwMkRCLCAweDAxNDIsIDB4MDBCNCwgMHgwMEI1LAorICAgIDB4MDBCNiwgMHgwMEI3LCAweDAwQjgsIDB4MDEwNSwgMHgwMTVGLCAweDAwQkIsIDB4MDEzRCwgMHgwMkRELCAweDAxM0UsCisgICAgMHgwMTdDLCAweDAxNTQsIDB4MDBDMSwgMHgwMEMyLCAweDAxMDIsIDB4MDBDNCwgMHgwMTM5LCAweDAxMDYsIDB4MDBDNywKKyAgICAweDAxMEMsIDB4MDBDOSwgMHgwMTE4LCAweDAwQ0IsIDB4MDExQSwgMHgwMENELCAweDAwQ0UsIDB4MDEwRSwgMHgwMTEwLAorICAgIDB4MDE0MywgMHgwMTQ3LCAweDAwRDMsIDB4MDBENCwgMHgwMTUwLCAweDAwRDYsIDB4MDBENywgMHgwMTU4LCAweDAxNkUsCisgICAgMHgwMERBLCAweDAxNzAsIDB4MDBEQywgMHgwMERELCAweDAxNjIsIDB4MDBERiwgMHgwMTU1LCAweDAwRTEsIDB4MDBFMiwKKyAgICAweDAxMDMsIDB4MDBFNCwgMHgwMTNBLCAweDAxMDcsIDB4MDBFNywgMHgwMTBELCAweDAwRTksIDB4MDExOSwgMHgwMEVCLAorICAgIDB4MDExQiwgMHgwMEVELCAweDAwRUUsIDB4MDEwRiwgMHgwMTExLCAweDAxNDQsIDB4MDE0OCwgMHgwMEYzLCAweDAwRjQsCisgICAgMHgwMTUxLCAweDAwRjYsIDB4MDBGNywgMHgwMTU5LCAweDAxNkYsIDB4MDBGQSwgMHgwMTcxLCAweDAwRkMsIDB4MDBGRCwKKyAgICAweDAxNjMsIDB4MDJEOSwKIH07CiBzdGF0aWMgY29uc3QgRlhfV0NIQVIgZ19GWF9DUDEyNTFVbmljb2Rlc1sxMjhdID0gewotICAgIDB4MDQwMiwgMHgwNDAzLCAweDIwMUEsIDB4MDQ1MywgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLAotICAgIDB4MjBBQywgMHgyMDMwLCAweDA0MDksIDB4MjAzOSwgMHgwNDBBLCAweDA0MEMsIDB4MDQwQiwgMHgwNDBGLAotICAgIDB4MDQ1MiwgMHgyMDE4LCAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LAotICAgIDB4MDAwMCwgMHgyMTIyLCAweDA0NTksIDB4MjAzQSwgMHgwNDVBLCAweDA0NUMsIDB4MDQ1QiwgMHgwNDVGLAotICAgIDB4MDBBMCwgMHgwNDBFLCAweDA0NUUsIDB4MDQwOCwgMHgwMEE0LCAweDA0OTAsIDB4MDBBNiwgMHgwMEE3LAotICAgIDB4MDQwMSwgMHgwMEE5LCAweDA0MDQsIDB4MDBBQiwgMHgwMEFDLCAweDAwQUQsIDB4MDBBRSwgMHgwNDA3LAotICAgIDB4MDBCMCwgMHgwMEIxLCAweDA0MDYsIDB4MDQ1NiwgMHgwNDkxLCAweDAwQjUsIDB4MDBCNiwgMHgwMEI3LAotICAgIDB4MDQ1MSwgMHgyMTE2LCAweDA0NTQsIDB4MDBCQiwgMHgwNDU4LCAweDA0MDUsIDB4MDQ1NSwgMHgwNDU3LAotICAgIDB4MDQxMCwgMHgwNDExLCAweDA0MTIsIDB4MDQxMywgMHgwNDE0LCAweDA0MTUsIDB4MDQxNiwgMHgwNDE3LAotICAgIDB4MDQxOCwgMHgwNDE5LCAweDA0MUEsIDB4MDQxQiwgMHgwNDFDLCAweDA0MUQsIDB4MDQxRSwgMHgwNDFGLAotICAgIDB4MDQyMCwgMHgwNDIxLCAweDA0MjIsIDB4MDQyMywgMHgwNDI0LCAweDA0MjUsIDB4MDQyNiwgMHgwNDI3LAotICAgIDB4MDQyOCwgMHgwNDI5LCAweDA0MkEsIDB4MDQyQiwgMHgwNDJDLCAweDA0MkQsIDB4MDQyRSwgMHgwNDJGLAotICAgIDB4MDQzMCwgMHgwNDMxLCAweDA0MzIsIDB4MDQzMywgMHgwNDM0LCAweDA0MzUsIDB4MDQzNiwgMHgwNDM3LAotICAgIDB4MDQzOCwgMHgwNDM5LCAweDA0M0EsIDB4MDQzQiwgMHgwNDNDLCAweDA0M0QsIDB4MDQzRSwgMHgwNDNGLAotICAgIDB4MDQ0MCwgMHgwNDQxLCAweDA0NDIsIDB4MDQ0MywgMHgwNDQ0LCAweDA0NDUsIDB4MDQ0NiwgMHgwNDQ3LAotICAgIDB4MDQ0OCwgMHgwNDQ5LCAweDA0NEEsIDB4MDQ0QiwgMHgwNDRDLCAweDA0NEQsIDB4MDQ0RSwgMHgwNDRGLAorICAgIDB4MDQwMiwgMHgwNDAzLCAweDIwMUEsIDB4MDQ1MywgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLCAweDIwQUMsCisgICAgMHgyMDMwLCAweDA0MDksIDB4MjAzOSwgMHgwNDBBLCAweDA0MEMsIDB4MDQwQiwgMHgwNDBGLCAweDA0NTIsIDB4MjAxOCwKKyAgICAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LCAweDAwMDAsIDB4MjEyMiwgMHgwNDU5LAorICAgIDB4MjAzQSwgMHgwNDVBLCAweDA0NUMsIDB4MDQ1QiwgMHgwNDVGLCAweDAwQTAsIDB4MDQwRSwgMHgwNDVFLCAweDA0MDgsCisgICAgMHgwMEE0LCAweDA0OTAsIDB4MDBBNiwgMHgwMEE3LCAweDA0MDEsIDB4MDBBOSwgMHgwNDA0LCAweDAwQUIsIDB4MDBBQywKKyAgICAweDAwQUQsIDB4MDBBRSwgMHgwNDA3LCAweDAwQjAsIDB4MDBCMSwgMHgwNDA2LCAweDA0NTYsIDB4MDQ5MSwgMHgwMEI1LAorICAgIDB4MDBCNiwgMHgwMEI3LCAweDA0NTEsIDB4MjExNiwgMHgwNDU0LCAweDAwQkIsIDB4MDQ1OCwgMHgwNDA1LCAweDA0NTUsCisgICAgMHgwNDU3LCAweDA0MTAsIDB4MDQxMSwgMHgwNDEyLCAweDA0MTMsIDB4MDQxNCwgMHgwNDE1LCAweDA0MTYsIDB4MDQxNywKKyAgICAweDA0MTgsIDB4MDQxOSwgMHgwNDFBLCAweDA0MUIsIDB4MDQxQywgMHgwNDFELCAweDA0MUUsIDB4MDQxRiwgMHgwNDIwLAorICAgIDB4MDQyMSwgMHgwNDIyLCAweDA0MjMsIDB4MDQyNCwgMHgwNDI1LCAweDA0MjYsIDB4MDQyNywgMHgwNDI4LCAweDA0MjksCisgICAgMHgwNDJBLCAweDA0MkIsIDB4MDQyQywgMHgwNDJELCAweDA0MkUsIDB4MDQyRiwgMHgwNDMwLCAweDA0MzEsIDB4MDQzMiwKKyAgICAweDA0MzMsIDB4MDQzNCwgMHgwNDM1LCAweDA0MzYsIDB4MDQzNywgMHgwNDM4LCAweDA0MzksIDB4MDQzQSwgMHgwNDNCLAorICAgIDB4MDQzQywgMHgwNDNELCAweDA0M0UsIDB4MDQzRiwgMHgwNDQwLCAweDA0NDEsIDB4MDQ0MiwgMHgwNDQzLCAweDA0NDQsCisgICAgMHgwNDQ1LCAweDA0NDYsIDB4MDQ0NywgMHgwNDQ4LCAweDA0NDksIDB4MDQ0QSwgMHgwNDRCLCAweDA0NEMsIDB4MDQ0RCwKKyAgICAweDA0NEUsIDB4MDQ0RiwKIH07CiBzdGF0aWMgY29uc3QgRlhfV0NIQVIgZ19GWF9DUDEyNTNVbmljb2Rlc1sxMjhdID0gewotICAgIDB4MjBBQywgMHgwMDAwLCAweDIwMUEsIDB4MDE5MiwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLAotICAgIDB4MDAwMCwgMHgyMDMwLCAweDAwMDAsIDB4MjAzOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgyMDE4LCAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LAotICAgIDB4MDAwMCwgMHgyMTIyLCAweDAwMDAsIDB4MjAzQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDBBMCwgMHgwMzg1LCAweDAzODYsIDB4MDBBMywgMHgwMEE0LCAweDAwQTUsIDB4MDBBNiwgMHgwMEE3LAotICAgIDB4MDBBOCwgMHgwMEE5LCAweDAwMDAsIDB4MDBBQiwgMHgwMEFDLCAweDAwQUQsIDB4MDBBRSwgMHgyMDE1LAotICAgIDB4MDBCMCwgMHgwMEIxLCAweDAwQjIsIDB4MDBCMywgMHgwMzg0LCAweDAwQjUsIDB4MDBCNiwgMHgwMEI3LAotICAgIDB4MDM4OCwgMHgwMzg5LCAweDAzOEEsIDB4MDBCQiwgMHgwMzhDLCAweDAwQkQsIDB4MDM4RSwgMHgwMzhGLAotICAgIDB4MDM5MCwgMHgwMzkxLCAweDAzOTIsIDB4MDM5MywgMHgwMzk0LCAweDAzOTUsIDB4MDM5NiwgMHgwMzk3LAotICAgIDB4MDM5OCwgMHgwMzk5LCAweDAzOUEsIDB4MDM5QiwgMHgwMzlDLCAweDAzOUQsIDB4MDM5RSwgMHgwMzlGLAotICAgIDB4MDNBMCwgMHgwM0ExLCAweDAwMDAsIDB4MDNBMywgMHgwM0E0LCAweDAzQTUsIDB4MDNBNiwgMHgwM0E3LAotICAgIDB4MDNBOCwgMHgwM0E5LCAweDAzQUEsIDB4MDNBQiwgMHgwM0FDLCAweDAzQUQsIDB4MDNBRSwgMHgwM0FGLAotICAgIDB4MDNCMCwgMHgwM0IxLCAweDAzQjIsIDB4MDNCMywgMHgwM0I0LCAweDAzQjUsIDB4MDNCNiwgMHgwM0I3LAotICAgIDB4MDNCOCwgMHgwM0I5LCAweDAzQkEsIDB4MDNCQiwgMHgwM0JDLCAweDAzQkQsIDB4MDNCRSwgMHgwM0JGLAotICAgIDB4MDNDMCwgMHgwM0MxLCAweDAzQzIsIDB4MDNDMywgMHgwM0M0LCAweDAzQzUsIDB4MDNDNiwgMHgwM0M3LAotICAgIDB4MDNDOCwgMHgwM0M5LCAweDAzQ0EsIDB4MDNDQiwgMHgwM0NDLCAweDAzQ0QsIDB4MDNDRSwgMHgwMDAwLAorICAgIDB4MjBBQywgMHgwMDAwLCAweDIwMUEsIDB4MDE5MiwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLCAweDAwMDAsCisgICAgMHgyMDMwLCAweDAwMDAsIDB4MjAzOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjAxOCwKKyAgICAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LCAweDAwMDAsIDB4MjEyMiwgMHgwMDAwLAorICAgIDB4MjAzQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwQTAsIDB4MDM4NSwgMHgwMzg2LCAweDAwQTMsCisgICAgMHgwMEE0LCAweDAwQTUsIDB4MDBBNiwgMHgwMEE3LCAweDAwQTgsIDB4MDBBOSwgMHgwMDAwLCAweDAwQUIsIDB4MDBBQywKKyAgICAweDAwQUQsIDB4MDBBRSwgMHgyMDE1LCAweDAwQjAsIDB4MDBCMSwgMHgwMEIyLCAweDAwQjMsIDB4MDM4NCwgMHgwMEI1LAorICAgIDB4MDBCNiwgMHgwMEI3LCAweDAzODgsIDB4MDM4OSwgMHgwMzhBLCAweDAwQkIsIDB4MDM4QywgMHgwMEJELCAweDAzOEUsCisgICAgMHgwMzhGLCAweDAzOTAsIDB4MDM5MSwgMHgwMzkyLCAweDAzOTMsIDB4MDM5NCwgMHgwMzk1LCAweDAzOTYsIDB4MDM5NywKKyAgICAweDAzOTgsIDB4MDM5OSwgMHgwMzlBLCAweDAzOUIsIDB4MDM5QywgMHgwMzlELCAweDAzOUUsIDB4MDM5RiwgMHgwM0EwLAorICAgIDB4MDNBMSwgMHgwMDAwLCAweDAzQTMsIDB4MDNBNCwgMHgwM0E1LCAweDAzQTYsIDB4MDNBNywgMHgwM0E4LCAweDAzQTksCisgICAgMHgwM0FBLCAweDAzQUIsIDB4MDNBQywgMHgwM0FELCAweDAzQUUsIDB4MDNBRiwgMHgwM0IwLCAweDAzQjEsIDB4MDNCMiwKKyAgICAweDAzQjMsIDB4MDNCNCwgMHgwM0I1LCAweDAzQjYsIDB4MDNCNywgMHgwM0I4LCAweDAzQjksIDB4MDNCQSwgMHgwM0JCLAorICAgIDB4MDNCQywgMHgwM0JELCAweDAzQkUsIDB4MDNCRiwgMHgwM0MwLCAweDAzQzEsIDB4MDNDMiwgMHgwM0MzLCAweDAzQzQsCisgICAgMHgwM0M1LCAweDAzQzYsIDB4MDNDNywgMHgwM0M4LCAweDAzQzksIDB4MDNDQSwgMHgwM0NCLCAweDAzQ0MsIDB4MDNDRCwKKyAgICAweDAzQ0UsIDB4MDAwMCwKIH07CiBzdGF0aWMgY29uc3QgRlhfV0NIQVIgZ19GWF9DUDEyNTRVbmljb2Rlc1sxMjhdID0gewotICAgIDB4MjBBQywgMHgwMDAwLCAweDIwMUEsIDB4MDE5MiwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLAotICAgIDB4MDJDNiwgMHgyMDMwLCAweDAxNjAsIDB4MjAzOSwgMHgwMTUyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgyMDE4LCAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LAotICAgIDB4MDJEQywgMHgyMTIyLCAweDAxNjEsIDB4MjAzQSwgMHgwMTUzLCAweDAwMDAsIDB4MDAwMCwgMHgwMTc4LAotICAgIDB4MDBBMCwgMHgwMEExLCAweDAwQTIsIDB4MDBBMywgMHgwMEE0LCAweDAwQTUsIDB4MDBBNiwgMHgwMEE3LAotICAgIDB4MDBBOCwgMHgwMEE5LCAweDAwQUEsIDB4MDBBQiwgMHgwMEFDLCAweDAwQUQsIDB4MDBBRSwgMHgwMEFGLAotICAgIDB4MDBCMCwgMHgwMEIxLCAweDAwQjIsIDB4MDBCMywgMHgwMEI0LCAweDAwQjUsIDB4MDBCNiwgMHgwMEI3LAotICAgIDB4MDBCOCwgMHgwMEI5LCAweDAwQkEsIDB4MDBCQiwgMHgwMEJDLCAweDAwQkQsIDB4MDBCRSwgMHgwMEJGLAotICAgIDB4MDBDMCwgMHgwMEMxLCAweDAwQzIsIDB4MDBDMywgMHgwMEM0LCAweDAwQzUsIDB4MDBDNiwgMHgwMEM3LAotICAgIDB4MDBDOCwgMHgwMEM5LCAweDAwQ0EsIDB4MDBDQiwgMHgwMENDLCAweDAwQ0QsIDB4MDBDRSwgMHgwMENGLAotICAgIDB4MDExRSwgMHgwMEQxLCAweDAwRDIsIDB4MDBEMywgMHgwMEQ0LCAweDAwRDUsIDB4MDBENiwgMHgwMEQ3LAotICAgIDB4MDBEOCwgMHgwMEQ5LCAweDAwREEsIDB4MDBEQiwgMHgwMERDLCAweDAxMzAsIDB4MDE1RSwgMHgwMERGLAotICAgIDB4MDBFMCwgMHgwMEUxLCAweDAwRTIsIDB4MDBFMywgMHgwMEU0LCAweDAwRTUsIDB4MDBFNiwgMHgwMEU3LAotICAgIDB4MDBFOCwgMHgwMEU5LCAweDAwRUEsIDB4MDBFQiwgMHgwMEVDLCAweDAwRUQsIDB4MDBFRSwgMHgwMEVGLAotICAgIDB4MDExRiwgMHgwMEYxLCAweDAwRjIsIDB4MDBGMywgMHgwMEY0LCAweDAwRjUsIDB4MDBGNiwgMHgwMEY3LAotICAgIDB4MDBGOCwgMHgwMEY5LCAweDAwRkEsIDB4MDBGQiwgMHgwMEZDLCAweDAxMzEsIDB4MDE1RiwgMHgwMEZGLAorICAgIDB4MjBBQywgMHgwMDAwLCAweDIwMUEsIDB4MDE5MiwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLCAweDAyQzYsCisgICAgMHgyMDMwLCAweDAxNjAsIDB4MjAzOSwgMHgwMTUyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjAxOCwKKyAgICAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LCAweDAyREMsIDB4MjEyMiwgMHgwMTYxLAorICAgIDB4MjAzQSwgMHgwMTUzLCAweDAwMDAsIDB4MDAwMCwgMHgwMTc4LCAweDAwQTAsIDB4MDBBMSwgMHgwMEEyLCAweDAwQTMsCisgICAgMHgwMEE0LCAweDAwQTUsIDB4MDBBNiwgMHgwMEE3LCAweDAwQTgsIDB4MDBBOSwgMHgwMEFBLCAweDAwQUIsIDB4MDBBQywKKyAgICAweDAwQUQsIDB4MDBBRSwgMHgwMEFGLCAweDAwQjAsIDB4MDBCMSwgMHgwMEIyLCAweDAwQjMsIDB4MDBCNCwgMHgwMEI1LAorICAgIDB4MDBCNiwgMHgwMEI3LCAweDAwQjgsIDB4MDBCOSwgMHgwMEJBLCAweDAwQkIsIDB4MDBCQywgMHgwMEJELCAweDAwQkUsCisgICAgMHgwMEJGLCAweDAwQzAsIDB4MDBDMSwgMHgwMEMyLCAweDAwQzMsIDB4MDBDNCwgMHgwMEM1LCAweDAwQzYsIDB4MDBDNywKKyAgICAweDAwQzgsIDB4MDBDOSwgMHgwMENBLCAweDAwQ0IsIDB4MDBDQywgMHgwMENELCAweDAwQ0UsIDB4MDBDRiwgMHgwMTFFLAorICAgIDB4MDBEMSwgMHgwMEQyLCAweDAwRDMsIDB4MDBENCwgMHgwMEQ1LCAweDAwRDYsIDB4MDBENywgMHgwMEQ4LCAweDAwRDksCisgICAgMHgwMERBLCAweDAwREIsIDB4MDBEQywgMHgwMTMwLCAweDAxNUUsIDB4MDBERiwgMHgwMEUwLCAweDAwRTEsIDB4MDBFMiwKKyAgICAweDAwRTMsIDB4MDBFNCwgMHgwMEU1LCAweDAwRTYsIDB4MDBFNywgMHgwMEU4LCAweDAwRTksIDB4MDBFQSwgMHgwMEVCLAorICAgIDB4MDBFQywgMHgwMEVELCAweDAwRUUsIDB4MDBFRiwgMHgwMTFGLCAweDAwRjEsIDB4MDBGMiwgMHgwMEYzLCAweDAwRjQsCisgICAgMHgwMEY1LCAweDAwRjYsIDB4MDBGNywgMHgwMEY4LCAweDAwRjksIDB4MDBGQSwgMHgwMEZCLCAweDAwRkMsIDB4MDEzMSwKKyAgICAweDAxNUYsIDB4MDBGRiwKIH07CiBzdGF0aWMgY29uc3QgRlhfV0NIQVIgZ19GWF9DUDEyNTVVbmljb2Rlc1sxMjhdID0gewotICAgIDB4MjBBQywgMHgwMDAwLCAweDIwMUEsIDB4MDE5MiwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLAotICAgIDB4MDJDNiwgMHgyMDMwLCAweDAwMDAsIDB4MjAzOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgyMDE4LCAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LAotICAgIDB4MDJEQywgMHgyMTIyLCAweDAwMDAsIDB4MjAzQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDBBMCwgMHgwMEExLCAweDAwQTIsIDB4MDBBMywgMHgyMEFBLCAweDAwQTUsIDB4MDBBNiwgMHgwMEE3LAotICAgIDB4MDBBOCwgMHgwMEE5LCAweDAwRDcsIDB4MDBBQiwgMHgwMEFDLCAweDAwQUQsIDB4MDBBRSwgMHgwMEFGLAotICAgIDB4MDBCMCwgMHgwMEIxLCAweDAwQjIsIDB4MDBCMywgMHgwMEI0LCAweDAwQjUsIDB4MDBCNiwgMHgwMEI3LAotICAgIDB4MDBCOCwgMHgwMEI5LCAweDAwRjcsIDB4MDBCQiwgMHgwMEJDLCAweDAwQkQsIDB4MDBCRSwgMHgwMEJGLAotICAgIDB4MDVCMCwgMHgwNUIxLCAweDA1QjIsIDB4MDVCMywgMHgwNUI0LCAweDA1QjUsIDB4MDVCNiwgMHgwNUI3LAotICAgIDB4MDVCOCwgMHgwNUI5LCAweDAwMDAsIDB4MDVCQiwgMHgwNUJDLCAweDA1QkQsIDB4MDVCRSwgMHgwNUJGLAotICAgIDB4MDVDMCwgMHgwNUMxLCAweDA1QzIsIDB4MDVDMywgMHgwNUYwLCAweDA1RjEsIDB4MDVGMiwgMHgwNUYzLAotICAgIDB4MDVGNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDVEMCwgMHgwNUQxLCAweDA1RDIsIDB4MDVEMywgMHgwNUQ0LCAweDA1RDUsIDB4MDVENiwgMHgwNUQ3LAotICAgIDB4MDVEOCwgMHgwNUQ5LCAweDA1REEsIDB4MDVEQiwgMHgwNURDLCAweDA1REQsIDB4MDVERSwgMHgwNURGLAotICAgIDB4MDVFMCwgMHgwNUUxLCAweDA1RTIsIDB4MDVFMywgMHgwNUU0LCAweDA1RTUsIDB4MDVFNiwgMHgwNUU3LAotICAgIDB4MDVFOCwgMHgwNUU5LCAweDA1RUEsIDB4MDAwMCwgMHgwMDAwLCAweDIwMEUsIDB4MjAwRiwgMHgwMDAwLAorICAgIDB4MjBBQywgMHgwMDAwLCAweDIwMUEsIDB4MDE5MiwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLCAweDAyQzYsCisgICAgMHgyMDMwLCAweDAwMDAsIDB4MjAzOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjAxOCwKKyAgICAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LCAweDAyREMsIDB4MjEyMiwgMHgwMDAwLAorICAgIDB4MjAzQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwQTAsIDB4MDBBMSwgMHgwMEEyLCAweDAwQTMsCisgICAgMHgyMEFBLCAweDAwQTUsIDB4MDBBNiwgMHgwMEE3LCAweDAwQTgsIDB4MDBBOSwgMHgwMEQ3LCAweDAwQUIsIDB4MDBBQywKKyAgICAweDAwQUQsIDB4MDBBRSwgMHgwMEFGLCAweDAwQjAsIDB4MDBCMSwgMHgwMEIyLCAweDAwQjMsIDB4MDBCNCwgMHgwMEI1LAorICAgIDB4MDBCNiwgMHgwMEI3LCAweDAwQjgsIDB4MDBCOSwgMHgwMEY3LCAweDAwQkIsIDB4MDBCQywgMHgwMEJELCAweDAwQkUsCisgICAgMHgwMEJGLCAweDA1QjAsIDB4MDVCMSwgMHgwNUIyLCAweDA1QjMsIDB4MDVCNCwgMHgwNUI1LCAweDA1QjYsIDB4MDVCNywKKyAgICAweDA1QjgsIDB4MDVCOSwgMHgwMDAwLCAweDA1QkIsIDB4MDVCQywgMHgwNUJELCAweDA1QkUsIDB4MDVCRiwgMHgwNUMwLAorICAgIDB4MDVDMSwgMHgwNUMyLCAweDA1QzMsIDB4MDVGMCwgMHgwNUYxLCAweDA1RjIsIDB4MDVGMywgMHgwNUY0LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwNUQwLCAweDA1RDEsIDB4MDVEMiwKKyAgICAweDA1RDMsIDB4MDVENCwgMHgwNUQ1LCAweDA1RDYsIDB4MDVENywgMHgwNUQ4LCAweDA1RDksIDB4MDVEQSwgMHgwNURCLAorICAgIDB4MDVEQywgMHgwNURELCAweDA1REUsIDB4MDVERiwgMHgwNUUwLCAweDA1RTEsIDB4MDVFMiwgMHgwNUUzLCAweDA1RTQsCisgICAgMHgwNUU1LCAweDA1RTYsIDB4MDVFNywgMHgwNUU4LCAweDA1RTksIDB4MDVFQSwgMHgwMDAwLCAweDAwMDAsIDB4MjAwRSwKKyAgICAweDIwMEYsIDB4MDAwMCwKIH07CiBzdGF0aWMgY29uc3QgRlhfV0NIQVIgZ19GWF9DUDEyNTZVbmljb2Rlc1sxMjhdID0gewotICAgIDB4MjBBQywgMHgwNjdFLCAweDIwMUEsIDB4MDE5MiwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLAotICAgIDB4MDJDNiwgMHgyMDMwLCAweDA2NzksIDB4MjAzOSwgMHgwMTUyLCAweDA2ODYsIDB4MDY5OCwgMHgwNjg4LAotICAgIDB4MDZBRiwgMHgyMDE4LCAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LAotICAgIDB4MDZBOSwgMHgyMTIyLCAweDA2OTEsIDB4MjAzQSwgMHgwMTUzLCAweDIwMEMsIDB4MjAwRCwgMHgwNkJBLAotICAgIDB4MDBBMCwgMHgwNjBDLCAweDAwQTIsIDB4MDBBMywgMHgwMEE0LCAweDAwQTUsIDB4MDBBNiwgMHgwMEE3LAotICAgIDB4MDBBOCwgMHgwMEE5LCAweDA2QkUsIDB4MDBBQiwgMHgwMEFDLCAweDAwQUQsIDB4MDBBRSwgMHgwMEFGLAotICAgIDB4MDBCMCwgMHgwMEIxLCAweDAwQjIsIDB4MDBCMywgMHgwMEI0LCAweDAwQjUsIDB4MDBCNiwgMHgwMEI3LAotICAgIDB4MDBCOCwgMHgwMEI5LCAweDA2MUIsIDB4MDBCQiwgMHgwMEJDLCAweDAwQkQsIDB4MDBCRSwgMHgwNjFGLAotICAgIDB4MDZDMSwgMHgwNjIxLCAweDA2MjIsIDB4MDYyMywgMHgwNjI0LCAweDA2MjUsIDB4MDYyNiwgMHgwNjI3LAotICAgIDB4MDYyOCwgMHgwNjI5LCAweDA2MkEsIDB4MDYyQiwgMHgwNjJDLCAweDA2MkQsIDB4MDYyRSwgMHgwNjJGLAotICAgIDB4MDYzMCwgMHgwNjMxLCAweDA2MzIsIDB4MDYzMywgMHgwNjM0LCAweDA2MzUsIDB4MDYzNiwgMHgwMEQ3LAotICAgIDB4MDYzNywgMHgwNjM4LCAweDA2MzksIDB4MDYzQSwgMHgwNjQwLCAweDA2NDEsIDB4MDY0MiwgMHgwNjQzLAotICAgIDB4MDBFMCwgMHgwNjQ0LCAweDAwRTIsIDB4MDY0NSwgMHgwNjQ2LCAweDA2NDcsIDB4MDY0OCwgMHgwMEU3LAotICAgIDB4MDBFOCwgMHgwMEU5LCAweDAwRUEsIDB4MDBFQiwgMHgwNjQ5LCAweDA2NEEsIDB4MDBFRSwgMHgwMEVGLAotICAgIDB4MDY0QiwgMHgwNjRDLCAweDA2NEQsIDB4MDY0RSwgMHgwMEY0LCAweDA2NEYsIDB4MDY1MCwgMHgwMEY3LAotICAgIDB4MDY1MSwgMHgwMEY5LCAweDA2NTIsIDB4MDBGQiwgMHgwMEZDLCAweDIwMEUsIDB4MjAwRiwgMHgwNkQyLAorICAgIDB4MjBBQywgMHgwNjdFLCAweDIwMUEsIDB4MDE5MiwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLCAweDAyQzYsCisgICAgMHgyMDMwLCAweDA2NzksIDB4MjAzOSwgMHgwMTUyLCAweDA2ODYsIDB4MDY5OCwgMHgwNjg4LCAweDA2QUYsIDB4MjAxOCwKKyAgICAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LCAweDA2QTksIDB4MjEyMiwgMHgwNjkxLAorICAgIDB4MjAzQSwgMHgwMTUzLCAweDIwMEMsIDB4MjAwRCwgMHgwNkJBLCAweDAwQTAsIDB4MDYwQywgMHgwMEEyLCAweDAwQTMsCisgICAgMHgwMEE0LCAweDAwQTUsIDB4MDBBNiwgMHgwMEE3LCAweDAwQTgsIDB4MDBBOSwgMHgwNkJFLCAweDAwQUIsIDB4MDBBQywKKyAgICAweDAwQUQsIDB4MDBBRSwgMHgwMEFGLCAweDAwQjAsIDB4MDBCMSwgMHgwMEIyLCAweDAwQjMsIDB4MDBCNCwgMHgwMEI1LAorICAgIDB4MDBCNiwgMHgwMEI3LCAweDAwQjgsIDB4MDBCOSwgMHgwNjFCLCAweDAwQkIsIDB4MDBCQywgMHgwMEJELCAweDAwQkUsCisgICAgMHgwNjFGLCAweDA2QzEsIDB4MDYyMSwgMHgwNjIyLCAweDA2MjMsIDB4MDYyNCwgMHgwNjI1LCAweDA2MjYsIDB4MDYyNywKKyAgICAweDA2MjgsIDB4MDYyOSwgMHgwNjJBLCAweDA2MkIsIDB4MDYyQywgMHgwNjJELCAweDA2MkUsIDB4MDYyRiwgMHgwNjMwLAorICAgIDB4MDYzMSwgMHgwNjMyLCAweDA2MzMsIDB4MDYzNCwgMHgwNjM1LCAweDA2MzYsIDB4MDBENywgMHgwNjM3LCAweDA2MzgsCisgICAgMHgwNjM5LCAweDA2M0EsIDB4MDY0MCwgMHgwNjQxLCAweDA2NDIsIDB4MDY0MywgMHgwMEUwLCAweDA2NDQsIDB4MDBFMiwKKyAgICAweDA2NDUsIDB4MDY0NiwgMHgwNjQ3LCAweDA2NDgsIDB4MDBFNywgMHgwMEU4LCAweDAwRTksIDB4MDBFQSwgMHgwMEVCLAorICAgIDB4MDY0OSwgMHgwNjRBLCAweDAwRUUsIDB4MDBFRiwgMHgwNjRCLCAweDA2NEMsIDB4MDY0RCwgMHgwNjRFLCAweDAwRjQsCisgICAgMHgwNjRGLCAweDA2NTAsIDB4MDBGNywgMHgwNjUxLCAweDAwRjksIDB4MDY1MiwgMHgwMEZCLCAweDAwRkMsIDB4MjAwRSwKKyAgICAweDIwMEYsIDB4MDZEMiwKIH07CiBzdGF0aWMgY29uc3QgRlhfV0NIQVIgZ19GWF9DUDEyNTdVbmljb2Rlc1sxMjhdID0gewotICAgIDB4MjBBQywgMHgwMDAwLCAweDIwMUEsIDB4MDAwMCwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLAotICAgIDB4MDAwMCwgMHgyMDMwLCAweDAwMDAsIDB4MjAzOSwgMHgwMDAwLCAweDAwQTgsIDB4MDJDNywgMHgwMEI4LAotICAgIDB4MDAwMCwgMHgyMDE4LCAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LAotICAgIDB4MDAwMCwgMHgyMTIyLCAweDAwMDAsIDB4MjAzQSwgMHgwMDAwLCAweDAwQUYsIDB4MDJEQiwgMHgwMDAwLAotICAgIDB4MDBBMCwgMHgwMDAwLCAweDAwQTIsIDB4MDBBMywgMHgwMEE0LCAweDAwMDAsIDB4MDBBNiwgMHgwMEE3LAotICAgIDB4MDBEOCwgMHgwMEE5LCAweDAxNTYsIDB4MDBBQiwgMHgwMEFDLCAweDAwQUQsIDB4MDBBRSwgMHgwMEM2LAotICAgIDB4MDBCMCwgMHgwMEIxLCAweDAwQjIsIDB4MDBCMywgMHgwMEI0LCAweDAwQjUsIDB4MDBCNiwgMHgwMEI3LAotICAgIDB4MDBGOCwgMHgwMEI5LCAweDAxNTcsIDB4MDBCQiwgMHgwMEJDLCAweDAwQkQsIDB4MDBCRSwgMHgwMEU2LAotICAgIDB4MDEwNCwgMHgwMTJFLCAweDAxMDAsIDB4MDEwNiwgMHgwMEM0LCAweDAwQzUsIDB4MDExOCwgMHgwMTEyLAotICAgIDB4MDEwQywgMHgwMEM5LCAweDAxNzksIDB4MDExNiwgMHgwMTIyLCAweDAxMzYsIDB4MDEyQSwgMHgwMTNCLAotICAgIDB4MDE2MCwgMHgwMTQzLCAweDAxNDUsIDB4MDBEMywgMHgwMTRDLCAweDAwRDUsIDB4MDBENiwgMHgwMEQ3LAotICAgIDB4MDE3MiwgMHgwMTQxLCAweDAxNUEsIDB4MDE2QSwgMHgwMERDLCAweDAxN0IsIDB4MDE3RCwgMHgwMERGLAotICAgIDB4MDEwNSwgMHgwMTJGLCAweDAxMDEsIDB4MDEwNywgMHgwMEU0LCAweDAwRTUsIDB4MDExOSwgMHgwMTEzLAotICAgIDB4MDEwRCwgMHgwMEU5LCAweDAxN0EsIDB4MDExNywgMHgwMTIzLCAweDAxMzcsIDB4MDEyQiwgMHgwMTNDLAotICAgIDB4MDE2MSwgMHgwMTQ0LCAweDAxNDYsIDB4MDBGMywgMHgwMTRELCAweDAwRjUsIDB4MDBGNiwgMHgwMEY3LAotICAgIDB4MDE3MywgMHgwMTQyLCAweDAxNUIsIDB4MDE2QiwgMHgwMEZDLCAweDAxN0MsIDB4MDE3RSwgMHgwMkQ5LAorICAgIDB4MjBBQywgMHgwMDAwLCAweDIwMUEsIDB4MDAwMCwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLCAweDAwMDAsCisgICAgMHgyMDMwLCAweDAwMDAsIDB4MjAzOSwgMHgwMDAwLCAweDAwQTgsIDB4MDJDNywgMHgwMEI4LCAweDAwMDAsIDB4MjAxOCwKKyAgICAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LCAweDAwMDAsIDB4MjEyMiwgMHgwMDAwLAorICAgIDB4MjAzQSwgMHgwMDAwLCAweDAwQUYsIDB4MDJEQiwgMHgwMDAwLCAweDAwQTAsIDB4MDAwMCwgMHgwMEEyLCAweDAwQTMsCisgICAgMHgwMEE0LCAweDAwMDAsIDB4MDBBNiwgMHgwMEE3LCAweDAwRDgsIDB4MDBBOSwgMHgwMTU2LCAweDAwQUIsIDB4MDBBQywKKyAgICAweDAwQUQsIDB4MDBBRSwgMHgwMEM2LCAweDAwQjAsIDB4MDBCMSwgMHgwMEIyLCAweDAwQjMsIDB4MDBCNCwgMHgwMEI1LAorICAgIDB4MDBCNiwgMHgwMEI3LCAweDAwRjgsIDB4MDBCOSwgMHgwMTU3LCAweDAwQkIsIDB4MDBCQywgMHgwMEJELCAweDAwQkUsCisgICAgMHgwMEU2LCAweDAxMDQsIDB4MDEyRSwgMHgwMTAwLCAweDAxMDYsIDB4MDBDNCwgMHgwMEM1LCAweDAxMTgsIDB4MDExMiwKKyAgICAweDAxMEMsIDB4MDBDOSwgMHgwMTc5LCAweDAxMTYsIDB4MDEyMiwgMHgwMTM2LCAweDAxMkEsIDB4MDEzQiwgMHgwMTYwLAorICAgIDB4MDE0MywgMHgwMTQ1LCAweDAwRDMsIDB4MDE0QywgMHgwMEQ1LCAweDAwRDYsIDB4MDBENywgMHgwMTcyLCAweDAxNDEsCisgICAgMHgwMTVBLCAweDAxNkEsIDB4MDBEQywgMHgwMTdCLCAweDAxN0QsIDB4MDBERiwgMHgwMTA1LCAweDAxMkYsIDB4MDEwMSwKKyAgICAweDAxMDcsIDB4MDBFNCwgMHgwMEU1LCAweDAxMTksIDB4MDExMywgMHgwMTBELCAweDAwRTksIDB4MDE3QSwgMHgwMTE3LAorICAgIDB4MDEyMywgMHgwMTM3LCAweDAxMkIsIDB4MDEzQywgMHgwMTYxLCAweDAxNDQsIDB4MDE0NiwgMHgwMEYzLCAweDAxNEQsCisgICAgMHgwMEY1LCAweDAwRjYsIDB4MDBGNywgMHgwMTczLCAweDAxNDIsIDB4MDE1QiwgMHgwMTZCLCAweDAwRkMsIDB4MDE3QywKKyAgICAweDAxN0UsIDB4MDJEOSwKIH07CiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgRlhfQllURQkJbV9DaGFyc2V0OwotICAgIGNvbnN0IEZYX1dDSEFSKgltX3BVbmljb2RlczsKKyAgdWludDhfdCBtX0NoYXJzZXQ7CisgIGNvbnN0IEZYX1dDSEFSKiBtX3BVbmljb2RlczsKIH0gRlhfQ2hhcnNldFVuaWNvZGVzOwogY29uc3QgRlhfQ2hhcnNldFVuaWNvZGVzIGdfRlhfQ2hhcnNldFVuaWNvZGVzW10gPSB7Ci0gICAgeyBGWEZPTlRfVEhBSV9DSEFSU0VULCBnX0ZYX0NQODc0VW5pY29kZXMgfSwKLSAgICB7IEZYRk9OVF9FQVNURVVST1BFX0NIQVJTRVQsIGdfRlhfQ1AxMjUwVW5pY29kZXMgfSwKLSAgICB7IEZYRk9OVF9SVVNTSUFOX0NIQVJTRVQsIGdfRlhfQ1AxMjUxVW5pY29kZXMgfSwKLSAgICB7IEZYRk9OVF9HUkVFS19DSEFSU0VULCBnX0ZYX0NQMTI1M1VuaWNvZGVzIH0sCi0gICAgeyBGWEZPTlRfVFVSS0lTSF9DSEFSU0VULCBnX0ZYX0NQMTI1NFVuaWNvZGVzIH0sCi0gICAgeyBGWEZPTlRfSEVCUkVXX0NIQVJTRVQsIGdfRlhfQ1AxMjU1VW5pY29kZXMgfSwKLSAgICB7IEZYRk9OVF9BUkFCSUNfQ0hBUlNFVCwgZ19GWF9DUDEyNTZVbmljb2RlcyB9LAotICAgIHsgRlhGT05UX0JBTFRJQ19DSEFSU0VULCBnX0ZYX0NQMTI1N1VuaWNvZGVzIH0sCisgICAge0ZYRk9OVF9USEFJX0NIQVJTRVQsIGdfRlhfQ1A4NzRVbmljb2Rlc30sCisgICAge0ZYRk9OVF9FQVNURVVST1BFX0NIQVJTRVQsIGdfRlhfQ1AxMjUwVW5pY29kZXN9LAorICAgIHtGWEZPTlRfUlVTU0lBTl9DSEFSU0VULCBnX0ZYX0NQMTI1MVVuaWNvZGVzfSwKKyAgICB7RlhGT05UX0dSRUVLX0NIQVJTRVQsIGdfRlhfQ1AxMjUzVW5pY29kZXN9LAorICAgIHtGWEZPTlRfVFVSS0lTSF9DSEFSU0VULCBnX0ZYX0NQMTI1NFVuaWNvZGVzfSwKKyAgICB7RlhGT05UX0hFQlJFV19DSEFSU0VULCBnX0ZYX0NQMTI1NVVuaWNvZGVzfSwKKyAgICB7RlhGT05UX0FSQUJJQ19DSEFSU0VULCBnX0ZYX0NQMTI1NlVuaWNvZGVzfSwKKyAgICB7RlhGT05UX0JBTFRJQ19DSEFSU0VULCBnX0ZYX0NQMTI1N1VuaWNvZGVzfSwKIH07Ci0jaWYgKF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjMyX01PQklMRV8gfHwgX0ZYX09TXyA9PSBfRlhfV0lONjRfKQotc3RhdGljIHZvaWQgX0luc2VydFdpZHRoQXJyYXkoSERDIGhEQywgaW50IHN0YXJ0LCBpbnQgZW5kLCBDUERGX0FycmF5KiBwV2lkdGhBcnJheSkKLXsKLSAgICBpbnQgc2l6ZSA9IGVuZCAtIHN0YXJ0ICsgMTsKLSAgICBpbnQqIHdpZHRocyA9IEZYX0FsbG9jKGludCwgc2l6ZSk7Ci0gICAgR2V0Q2hhcldpZHRoKGhEQywgc3RhcnQsIGVuZCwgd2lkdGhzKTsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAxOyBpIDwgc2l6ZTsgaSArKykKLSAgICAgICAgaWYgKHdpZHRoc1tpXSAhPSAqd2lkdGhzKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIGlmIChpID09IHNpemUpIHsKLSAgICAgICAgaW50IGZpcnN0ID0gcFdpZHRoQXJyYXktPkdldEludGVnZXIocFdpZHRoQXJyYXktPkdldENvdW50KCkgLSAxKTsKLSAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoZmlyc3QgKyBzaXplIC0gMSk7Ci0gICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKCp3aWR0aHMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIENQREZfQXJyYXkqIHBXaWR0aEFycmF5MSA9IG5ldyBDUERGX0FycmF5OwotICAgICAgICBwV2lkdGhBcnJheS0+QWRkKHBXaWR0aEFycmF5MSk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpICsrKSB7Ci0gICAgICAgICAgICBwV2lkdGhBcnJheTEtPkFkZEludGVnZXIod2lkdGhzW2ldKTsKLSAgICAgICAgfQorI2lmIChfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU42NF9ERVNLVE9QXykKK3N0YXRpYyB2b2lkIF9JbnNlcnRXaWR0aEFycmF5KEhEQyBoREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcFdpZHRoQXJyYXkpIHsKKyAgaW50IHNpemUgPSBlbmQgLSBzdGFydCArIDE7CisgIGludCogd2lkdGhzID0gRlhfQWxsb2MoaW50LCBzaXplKTsKKyAgR2V0Q2hhcldpZHRoKGhEQywgc3RhcnQsIGVuZCwgd2lkdGhzKTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDE7IGkgPCBzaXplOyBpKyspCisgICAgaWYgKHdpZHRoc1tpXSAhPSAqd2lkdGhzKSB7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgRlhfRnJlZSh3aWR0aHMpOworICBpZiAoaSA9PSBzaXplKSB7CisgICAgaW50IGZpcnN0ID0gcFdpZHRoQXJyYXktPkdldEludGVnZXIocFdpZHRoQXJyYXktPkdldENvdW50KCkgLSAxKTsKKyAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcihmaXJzdCArIHNpemUgLSAxKTsKKyAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigqd2lkdGhzKTsKKyAgfSBlbHNlIHsKKyAgICBDUERGX0FycmF5KiBwV2lkdGhBcnJheTEgPSBuZXcgQ1BERl9BcnJheTsKKyAgICBwV2lkdGhBcnJheS0+QWRkKHBXaWR0aEFycmF5MSk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgcFdpZHRoQXJyYXkxLT5BZGRJbnRlZ2VyKHdpZHRoc1tpXSk7CisgICAgfQorICB9CisgIEZYX0ZyZWUod2lkdGhzKTsKIH0KLUNQREZfRm9udCogQ1BERl9Eb2N1bWVudDo6QWRkV2luZG93c0ZvbnQoTE9HRk9OVFcqIHBMb2dGb250LCBGWF9CT09MIGJWZXJ0LCBGWF9CT09MIGJUcmFuc2xhdGVOYW1lKQotewotICAgIExPR0ZPTlRBIGxmYTsKLSAgICBGWFNZU19tZW1jcHkzMigmbGZhLCBwTG9nRm9udCwgKGNoYXIqKWxmYS5sZkZhY2VOYW1lIC0gKGNoYXIqKSZsZmEpOwotICAgIENGWF9CeXRlU3RyaW5nIGZhY2UgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocExvZ0ZvbnQtPmxmRmFjZU5hbWUpOwotICAgIGlmIChmYWNlLkdldExlbmd0aCgpID49IExGX0ZBQ0VTSVpFKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBGWFNZU19zdHJjcHkobGZhLmxmRmFjZU5hbWUsIGZhY2UuY19zdHIoKSk7Ci0gICAgcmV0dXJuIEFkZFdpbmRvd3NGb250KCZsZmEsIGJWZXJ0LCBiVHJhbnNsYXRlTmFtZSk7CitDUERGX0ZvbnQqIENQREZfRG9jdW1lbnQ6OkFkZFdpbmRvd3NGb250KExPR0ZPTlRXKiBwTG9nRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJhbnNsYXRlTmFtZSkgeworICBMT0dGT05UQSBsZmE7CisgIEZYU1lTX21lbWNweSgmbGZhLCBwTG9nRm9udCwgKGNoYXIqKWxmYS5sZkZhY2VOYW1lIC0gKGNoYXIqKSZsZmEpOworICBDRlhfQnl0ZVN0cmluZyBmYWNlID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHBMb2dGb250LT5sZkZhY2VOYW1lKTsKKyAgaWYgKGZhY2UuR2V0TGVuZ3RoKCkgPj0gTEZfRkFDRVNJWkUpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBGWFNZU19zdHJjcHkobGZhLmxmRmFjZU5hbWUsIGZhY2UuY19zdHIoKSk7CisgIHJldHVybiBBZGRXaW5kb3dzRm9udCgmbGZhLCBiVmVydCwgYlRyYW5zbGF0ZU5hbWUpOwogfQotZXh0ZXJuIENGWF9CeXRlU3RyaW5nIF9GUERGX0dldE5hbWVGcm9tVFQoRlhfTFBDQllURSBuYW1lX3RhYmxlLCBGWF9EV09SRCBuYW1lKTsKLUNGWF9CeXRlU3RyaW5nIF9GUERGX0dldFBTTmFtZUZyb21UVChIREMgaERDKQotewotICAgIENGWF9CeXRlU3RyaW5nIHJlc3VsdDsKLSAgICBEV09SRCBzaXplID0gOjpHZXRGb250RGF0YShoREMsICdlbWFuJywgMCwgTlVMTCwgMCk7Ci0gICAgaWYgKHNpemUgIT0gR0RJX0VSUk9SKSB7Ci0gICAgICAgIExQQllURSBidWZmZXIgPSBGWF9BbGxvYyhCWVRFLCBzaXplKTsKLSAgICAgICAgOjpHZXRGb250RGF0YShoREMsICdlbWFuJywgMCwgYnVmZmVyLCBzaXplKTsKLSAgICAgICAgcmVzdWx0ID0gX0ZQREZfR2V0TmFtZUZyb21UVChidWZmZXIsIDYpOwotICAgICAgICBGWF9GcmVlKGJ1ZmZlcik7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7CitDRlhfQnl0ZVN0cmluZyBfRlBERl9HZXRQU05hbWVGcm9tVFQoSERDIGhEQykgeworICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7CisgIERXT1JEIHNpemUgPSA6OkdldEZvbnREYXRhKGhEQywgJ2VtYW4nLCAwLCBOVUxMLCAwKTsKKyAgaWYgKHNpemUgIT0gR0RJX0VSUk9SKSB7CisgICAgTFBCWVRFIGJ1ZmZlciA9IEZYX0FsbG9jKEJZVEUsIHNpemUpOworICAgIDo6R2V0Rm9udERhdGEoaERDLCAnZW1hbicsIDAsIGJ1ZmZlciwgc2l6ZSk7CisgICAgcmVzdWx0ID0gR2V0TmFtZUZyb21UVChidWZmZXIsIDYpOworICAgIEZYX0ZyZWUoYnVmZmVyKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OwogfQotQ1BERl9Gb250KiBDUERGX0RvY3VtZW50OjpBZGRXaW5kb3dzRm9udChMT0dGT05UQSogcExvZ0ZvbnQsIEZYX0JPT0wgYlZlcnQsIEZYX0JPT0wgYlRyYW5zbGF0ZU5hbWUpCi17Ci0gICAgcExvZ0ZvbnQtPmxmSGVpZ2h0ID0gLTEwMDA7Ci0gICAgcExvZ0ZvbnQtPmxmV2lkdGggPSAwOwotICAgIEhHRElPQkogaEZvbnQgPSBDcmVhdGVGb250SW5kaXJlY3RBKHBMb2dGb250KTsKLSAgICBIREMgaERDID0gQ3JlYXRlQ29tcGF0aWJsZURDKE5VTEwpOwotICAgIGhGb250ID0gU2VsZWN0T2JqZWN0KGhEQywgaEZvbnQpOwotICAgIGludCB0bV9zaXplID0gR2V0T3V0bGluZVRleHRNZXRyaWNzKGhEQywgMCwgTlVMTCk7Ci0gICAgaWYgKHRtX3NpemUgPT0gMCkgewotICAgICAgICBoRm9udCA9IFNlbGVjdE9iamVjdChoREMsIGhGb250KTsKLSAgICAgICAgRGVsZXRlT2JqZWN0KGhGb250KTsKLSAgICAgICAgRGVsZXRlREMoaERDKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIExQQllURSB0bV9idWYgPSBGWF9BbGxvYyhCWVRFLCB0bV9zaXplKTsKLSAgICBPVVRMSU5FVEVYVE1FVFJJQyogcHRtID0gKE9VVExJTkVURVhUTUVUUklDKil0bV9idWY7Ci0gICAgR2V0T3V0bGluZVRleHRNZXRyaWNzKGhEQywgdG1fc2l6ZSwgcHRtKTsKLSAgICBpbnQgZmxhZ3MgPSAwLCBpdGFsaWNhbmdsZSwgYXNjZW5kLCBkZXNjZW5kLCBjYXBoZWlnaHQsIGJib3hbNF07Ci0gICAgaWYgKHBMb2dGb250LT5sZkl0YWxpYykgewotICAgICAgICBmbGFncyB8PSBQREZGT05UX0lUQUxJQzsKLSAgICB9Ci0gICAgaWYgKChwTG9nRm9udC0+bGZQaXRjaEFuZEZhbWlseSAmIDMpID09IEZJWEVEX1BJVENIKSB7Ci0gICAgICAgIGZsYWdzIHw9IFBERkZPTlRfRklYRURQSVRDSDsKLSAgICB9Ci0gICAgaWYgKChwTG9nRm9udC0+bGZQaXRjaEFuZEZhbWlseSAmIDB4ZjgpID09IEZGX1JPTUFOKSB7Ci0gICAgICAgIGZsYWdzIHw9IFBERkZPTlRfU0VSSUY7Ci0gICAgfQotICAgIGlmICgocExvZ0ZvbnQtPmxmUGl0Y2hBbmRGYW1pbHkgJiAweGY4KSA9PSBGRl9TQ1JJUFQpIHsKLSAgICAgICAgZmxhZ3MgfD0gUERGRk9OVF9TQ1JJUFQ7Ci0gICAgfQotICAgIEZYX0JPT0wgYkNKSyA9IHBMb2dGb250LT5sZkNoYXJTZXQgPT0gQ0hJTkVTRUJJRzVfQ0hBUlNFVCB8fCBwTG9nRm9udC0+bGZDaGFyU2V0ID09IEdCMjMxMl9DSEFSU0VUIHx8Ci0gICAgICAgICAgICAgICAgICAgcExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBIQU5HRVVMX0NIQVJTRVQgfHwgcExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBTSElGVEpJU19DSEFSU0VUOwotICAgIENGWF9CeXRlU3RyaW5nIGJhc2Vmb250OwotICAgIGlmIChiVHJhbnNsYXRlTmFtZSAmJiBiQ0pLKSB7Ci0gICAgICAgIGJhc2Vmb250ID0gX0ZQREZfR2V0UFNOYW1lRnJvbVRUKGhEQyk7Ci0gICAgfQotICAgIGlmIChiYXNlZm9udC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgYmFzZWZvbnQgPSBwTG9nRm9udC0+bGZGYWNlTmFtZTsKLSAgICB9Ci0gICAgaXRhbGljYW5nbGUgPSBwdG0tPm90bUl0YWxpY0FuZ2xlIC8gMTA7Ci0gICAgYXNjZW5kID0gcHRtLT5vdG1yY0ZvbnRCb3gudG9wOwotICAgIGRlc2NlbmQgPSBwdG0tPm90bXJjRm9udEJveC5ib3R0b207Ci0gICAgY2FwaGVpZ2h0ID0gcHRtLT5vdG1zQ2FwRW1IZWlnaHQ7Ci0gICAgYmJveFswXSA9IHB0bS0+b3RtcmNGb250Qm94LmxlZnQ7Ci0gICAgYmJveFsxXSA9IHB0bS0+b3RtcmNGb250Qm94LmJvdHRvbTsKLSAgICBiYm94WzJdID0gcHRtLT5vdG1yY0ZvbnRCb3gucmlnaHQ7Ci0gICAgYmJveFszXSA9IHB0bS0+b3RtcmNGb250Qm94LnRvcDsKLSAgICBGWF9GcmVlKHRtX2J1Zik7Ci0gICAgYmFzZWZvbnQuUmVwbGFjZSgiICIsICIiKTsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBCYXNlRGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7Ci0gICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIlR5cGUiLCAiRm9udCIpOwotICAgIENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0ID0gcEJhc2VEaWN0OwotICAgIGlmICghYkNKSykgewotICAgICAgICBpZiAocExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBBTlNJX0NIQVJTRVQgfHwgcExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBERUZBVUxUX0NIQVJTRVQgfHwKLSAgICAgICAgICAgICAgICBwTG9nRm9udC0+bGZDaGFyU2V0ID09IFNZTUJPTF9DSEFSU0VUKSB7Ci0gICAgICAgICAgICBpZiAocExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBTWU1CT0xfQ0hBUlNFVCkgewotICAgICAgICAgICAgICAgIGZsYWdzIHw9IFBERkZPTlRfU1lNQk9MSUM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZsYWdzIHw9IFBERkZPTlRfTk9OU1lNQk9MSUM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQmFzZURpY3QtPlNldEF0TmFtZShGWF9CU1RSQygiRW5jb2RpbmciKSwgIldpbkFuc2lFbmNvZGluZyIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmxhZ3MgfD0gUERGRk9OVF9OT05TWU1CT0xJQzsKLSAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiBnX0ZYX0NoYXJzZXRVbmljb2RlcyAvIHNpemVvZihGWF9DaGFyc2V0VW5pY29kZXMpOyBpICsrKQotICAgICAgICAgICAgICAgIGlmIChnX0ZYX0NoYXJzZXRVbmljb2Rlc1tpXS5tX0NoYXJzZXQgPT0gcExvZ0ZvbnQtPmxmQ2hhclNldCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaSA8IHNpemVvZiBnX0ZYX0NoYXJzZXRVbmljb2RlcyAvIHNpemVvZihGWF9DaGFyc2V0VW5pY29kZXMpKSB7Ci0gICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRW5jb2RpbmcgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgICAgICAgICAgICAgIHBFbmNvZGluZy0+U2V0QXROYW1lKEZYX0JTVFJDKCJCYXNlRW5jb2RpbmciKSwgIldpbkFuc2lFbmNvZGluZyIpOwotICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IG5ldyBDUERGX0FycmF5OwotICAgICAgICAgICAgICAgIHBBcnJheS0+QWRkSW50ZWdlcigxMjgpOwotICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwVW5pY29kZXMgPSBnX0ZYX0NoYXJzZXRVbmljb2Rlc1tpXS5tX3BVbmljb2RlczsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEyODsgaiArKykgewotICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gUERGX0Fkb2JlTmFtZUZyb21Vbmljb2RlKHBVbmljb2Rlc1tqXSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLklzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcEFycmF5LT5BZGROYW1lKEZYX0JTVFJDKCIubm90ZGVmIikpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcEFycmF5LT5BZGROYW1lKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBFbmNvZGluZy0+U2V0QXQoRlhfQlNUUkMoIkRpZmZlcmVuY2VzIiksIHBBcnJheSk7Ci0gICAgICAgICAgICAgICAgQWRkSW5kaXJlY3RPYmplY3QocEVuY29kaW5nKTsKLSAgICAgICAgICAgICAgICBwQmFzZURpY3QtPlNldEF0UmVmZXJlbmNlKEZYX0JTVFJDKCJFbmNvZGluZyIpLCB0aGlzLCBwRW5jb2RpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwTG9nRm9udC0+bGZXZWlnaHQgPiBGV19NRURJVU0gJiYgcExvZ0ZvbnQtPmxmSXRhbGljKSB7Ci0gICAgICAgICAgICBiYXNlZm9udCArPSAiLEJvbGRJdGFsaWMiOwotICAgICAgICB9IGVsc2UgaWYgKHBMb2dGb250LT5sZldlaWdodCA+IEZXX01FRElVTSkgewotICAgICAgICAgICAgYmFzZWZvbnQgKz0gIixCb2xkIjsKLSAgICAgICAgfSBlbHNlIGlmIChwTG9nRm9udC0+bGZJdGFsaWMpIHsKLSAgICAgICAgICAgIGJhc2Vmb250ICs9ICIsSXRhbGljIjsKLSAgICAgICAgfQotICAgICAgICBwQmFzZURpY3QtPlNldEF0TmFtZSgiU3VidHlwZSIsICJUcnVlVHlwZSIpOwotICAgICAgICBwQmFzZURpY3QtPlNldEF0TmFtZSgiQmFzZUZvbnQiLCBiYXNlZm9udCk7Ci0gICAgICAgIHBCYXNlRGljdC0+U2V0QXROdW1iZXIoIkZpcnN0Q2hhciIsIDMyKTsKLSAgICAgICAgcEJhc2VEaWN0LT5TZXRBdE51bWJlcigiTGFzdENoYXIiLCAyNTUpOwotICAgICAgICBpbnQgY2hhcl93aWR0aHNbMjI0XTsKLSAgICAgICAgR2V0Q2hhcldpZHRoKGhEQywgMzIsIDI1NSwgY2hhcl93aWR0aHMpOwotICAgICAgICBDUERGX0FycmF5KiBwV2lkdGhzID0gbmV3IENQREZfQXJyYXk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjI0OyBpICsrKSB7Ci0gICAgICAgICAgICBwV2lkdGhzLT5BZGRJbnRlZ2VyKGNoYXJfd2lkdGhzW2ldKTsKLSAgICAgICAgfQotICAgICAgICBwQmFzZURpY3QtPlNldEF0KCJXaWR0aHMiLCBwV2lkdGhzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmbGFncyB8PSBQREZGT05UX05PTlNZTUJPTElDOwotICAgICAgICBwRm9udERpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgICAgICBDRlhfQnl0ZVN0cmluZyBjbWFwOwotICAgICAgICBDRlhfQnl0ZVN0cmluZyBvcmRlcmluZzsKLSAgICAgICAgaW50IHN1cHBsZW1lbnQ7Ci0gICAgICAgIENQREZfQXJyYXkqIHBXaWR0aEFycmF5ID0gbmV3IENQREZfQXJyYXk7Ci0gICAgICAgIHN3aXRjaCAocExvZ0ZvbnQtPmxmQ2hhclNldCkgewotICAgICAgICAgICAgY2FzZSBDSElORVNFQklHNV9DSEFSU0VUOgotICAgICAgICAgICAgICAgIGNtYXAgPSBiVmVydCA/ICJFVGVubXMtQjUtViIgOiAiRVRlbm1zLUI1LUgiOwotICAgICAgICAgICAgICAgIG9yZGVyaW5nID0gIkNOUzEiOwotICAgICAgICAgICAgICAgIHN1cHBsZW1lbnQgPSA0OwotICAgICAgICAgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDEpOwotICAgICAgICAgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGhEQywgMHgyMCwgMHg3ZSwgcFdpZHRoQXJyYXkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBHQjIzMTJfQ0hBUlNFVDoKLSAgICAgICAgICAgICAgICBjbWFwID0gYlZlcnQgPyAiR0JLLUVVQy1WIiA6ICJHQkstRVVDLUgiOwotICAgICAgICAgICAgICAgIG9yZGVyaW5nID0gIkdCMSIsIHN1cHBsZW1lbnQgPSAyOwotICAgICAgICAgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDc3MTYpOwotICAgICAgICAgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGhEQywgMHgyMCwgMHgyMCwgcFdpZHRoQXJyYXkpOwotICAgICAgICAgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDgxNCk7Ci0gICAgICAgICAgICAgICAgX0luc2VydFdpZHRoQXJyYXkoaERDLCAweDIxLCAweDdlLCBwV2lkdGhBcnJheSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEhBTkdFVUxfQ0hBUlNFVDoKLSAgICAgICAgICAgICAgICBjbWFwID0gYlZlcnQgPyAiS1NDbXMtVUhDLVYiIDogIktTQ21zLVVIQy1IIjsKLSAgICAgICAgICAgICAgICBvcmRlcmluZyA9ICJLb3JlYTEiOwotICAgICAgICAgICAgICAgIHN1cHBsZW1lbnQgPSAyOwotICAgICAgICAgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDEpOwotICAgICAgICAgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGhEQywgMHgyMCwgMHg3ZSwgcFdpZHRoQXJyYXkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTSElGVEpJU19DSEFSU0VUOgotICAgICAgICAgICAgICAgIGNtYXAgPSBiVmVydCA/ICI5MG1zLVJLU0otViIgOiAiOTBtcy1SS1NKLUgiOwotICAgICAgICAgICAgICAgIG9yZGVyaW5nID0gIkphcGFuMSI7Ci0gICAgICAgICAgICAgICAgc3VwcGxlbWVudCA9IDU7Ci0gICAgICAgICAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoMjMxKTsKLSAgICAgICAgICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheShoREMsIDB4MjAsIDB4N2QsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigzMjYpOwotICAgICAgICAgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGhEQywgMHhhMCwgMHhhMCwgcFdpZHRoQXJyYXkpOwotICAgICAgICAgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDMyNyk7Ci0gICAgICAgICAgICAgICAgX0luc2VydFdpZHRoQXJyYXkoaERDLCAweGExLCAweGRmLCBwV2lkdGhBcnJheSk7Ci0gICAgICAgICAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoNjMxKTsKLSAgICAgICAgICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheShoREMsIDB4N2UsIDB4N2UsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBwQmFzZURpY3QtPlNldEF0TmFtZSgiU3VidHlwZSIsICJUeXBlMCIpOwotICAgICAgICBwQmFzZURpY3QtPlNldEF0TmFtZSgiQmFzZUZvbnQiLCBiYXNlZm9udCk7Ci0gICAgICAgIHBCYXNlRGljdC0+U2V0QXROYW1lKCJFbmNvZGluZyIsIGNtYXApOwotICAgICAgICBwRm9udERpY3QtPlNldEF0KCJXIiwgcFdpZHRoQXJyYXkpOwotICAgICAgICBwRm9udERpY3QtPlNldEF0TmFtZSgiVHlwZSIsICJGb250Iik7Ci0gICAgICAgIHBGb250RGljdC0+U2V0QXROYW1lKCJTdWJ0eXBlIiwgIkNJREZvbnRUeXBlMiIpOwotICAgICAgICBwRm9udERpY3QtPlNldEF0TmFtZSgiQmFzZUZvbnQiLCBiYXNlZm9udCk7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcENJRFN5c0luZm8gPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgICAgICBwQ0lEU3lzSW5mby0+U2V0QXRTdHJpbmcoIlJlZ2lzdHJ5IiwgIkFkb2JlIik7Ci0gICAgICAgIHBDSURTeXNJbmZvLT5TZXRBdFN0cmluZygiT3JkZXJpbmciLCBvcmRlcmluZyk7Ci0gICAgICAgIHBDSURTeXNJbmZvLT5TZXRBdEludGVnZXIoIlN1cHBsZW1lbnQiLCBzdXBwbGVtZW50KTsKLSAgICAgICAgcEZvbnREaWN0LT5TZXRBdCgiQ0lEU3lzdGVtSW5mbyIsIHBDSURTeXNJbmZvKTsKLSAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gbmV3IENQREZfQXJyYXk7Ci0gICAgICAgIHBCYXNlRGljdC0+U2V0QXQoIkRlc2NlbmRhbnRGb250cyIsIHBBcnJheSk7Ci0gICAgICAgIEFkZEluZGlyZWN0T2JqZWN0KHBGb250RGljdCk7Ci0gICAgICAgIHBBcnJheS0+QWRkUmVmZXJlbmNlKHRoaXMsIHBGb250RGljdCk7Ci0gICAgfQotICAgIEFkZEluZGlyZWN0T2JqZWN0KHBCYXNlRGljdCk7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERlc2MgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgIHBGb250RGVzYy0+U2V0QXROYW1lKCJUeXBlIiwgIkZvbnREZXNjcmlwdG9yIik7Ci0gICAgcEZvbnREZXNjLT5TZXRBdE5hbWUoIkZvbnROYW1lIiwgYmFzZWZvbnQpOwotICAgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJGbGFncyIsIGZsYWdzKTsKLSAgICBDUERGX0FycmF5KiBwQkJveCA9IG5ldyBDUERGX0FycmF5OwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSArKykgewotICAgICAgICBwQkJveC0+QWRkSW50ZWdlcihiYm94W2ldKTsKLSAgICB9Ci0gICAgcEZvbnREZXNjLT5TZXRBdCgiRm9udEJCb3giLCBwQkJveCk7Ci0gICAgcEZvbnREZXNjLT5TZXRBdEludGVnZXIoIkl0YWxpY0FuZ2xlIiwgaXRhbGljYW5nbGUpOwotICAgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJBc2NlbnQiLCBhc2NlbmQpOwotICAgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJEZXNjZW50IiwgZGVzY2VuZCk7Ci0gICAgcEZvbnREZXNjLT5TZXRBdEludGVnZXIoIkNhcEhlaWdodCIsIGNhcGhlaWdodCk7Ci0gICAgcEZvbnREZXNjLT5TZXRBdEludGVnZXIoIlN0ZW1WIiwgcExvZ0ZvbnQtPmxmV2VpZ2h0IC8gNSk7Ci0gICAgQWRkSW5kaXJlY3RPYmplY3QocEZvbnREZXNjKTsKLSAgICBwRm9udERpY3QtPlNldEF0UmVmZXJlbmNlKCJGb250RGVzY3JpcHRvciIsIHRoaXMsIHBGb250RGVzYyk7CitDUERGX0ZvbnQqIENQREZfRG9jdW1lbnQ6OkFkZFdpbmRvd3NGb250KExPR0ZPTlRBKiBwTG9nRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJhbnNsYXRlTmFtZSkgeworICBwTG9nRm9udC0+bGZIZWlnaHQgPSAtMTAwMDsKKyAgcExvZ0ZvbnQtPmxmV2lkdGggPSAwOworICBIR0RJT0JKIGhGb250ID0gQ3JlYXRlRm9udEluZGlyZWN0QShwTG9nRm9udCk7CisgIEhEQyBoREMgPSBDcmVhdGVDb21wYXRpYmxlREMoTlVMTCk7CisgIGhGb250ID0gU2VsZWN0T2JqZWN0KGhEQywgaEZvbnQpOworICBpbnQgdG1fc2l6ZSA9IEdldE91dGxpbmVUZXh0TWV0cmljcyhoREMsIDAsIE5VTEwpOworICBpZiAodG1fc2l6ZSA9PSAwKSB7CiAgICAgaEZvbnQgPSBTZWxlY3RPYmplY3QoaERDLCBoRm9udCk7CiAgICAgRGVsZXRlT2JqZWN0KGhGb250KTsKICAgICBEZWxldGVEQyhoREMpOwotICAgIHJldHVybiBMb2FkRm9udChwQmFzZURpY3QpOworICAgIHJldHVybiBOVUxMOworICB9CisgIExQQllURSB0bV9idWYgPSBGWF9BbGxvYyhCWVRFLCB0bV9zaXplKTsKKyAgT1VUTElORVRFWFRNRVRSSUMqIHB0bSA9IChPVVRMSU5FVEVYVE1FVFJJQyopdG1fYnVmOworICBHZXRPdXRsaW5lVGV4dE1ldHJpY3MoaERDLCB0bV9zaXplLCBwdG0pOworICBpbnQgZmxhZ3MgPSAwLCBpdGFsaWNhbmdsZSwgYXNjZW5kLCBkZXNjZW5kLCBjYXBoZWlnaHQsIGJib3hbNF07CisgIGlmIChwTG9nRm9udC0+bGZJdGFsaWMpIHsKKyAgICBmbGFncyB8PSBQREZGT05UX0lUQUxJQzsKKyAgfQorICBpZiAoKHBMb2dGb250LT5sZlBpdGNoQW5kRmFtaWx5ICYgMykgPT0gRklYRURfUElUQ0gpIHsKKyAgICBmbGFncyB8PSBQREZGT05UX0ZJWEVEUElUQ0g7CisgIH0KKyAgaWYgKChwTG9nRm9udC0+bGZQaXRjaEFuZEZhbWlseSAmIDB4ZjgpID09IEZGX1JPTUFOKSB7CisgICAgZmxhZ3MgfD0gUERGRk9OVF9TRVJJRjsKKyAgfQorICBpZiAoKHBMb2dGb250LT5sZlBpdGNoQW5kRmFtaWx5ICYgMHhmOCkgPT0gRkZfU0NSSVBUKSB7CisgICAgZmxhZ3MgfD0gUERGRk9OVF9TQ1JJUFQ7CisgIH0KKyAgRlhfQk9PTCBiQ0pLID0gcExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBDSElORVNFQklHNV9DSEFSU0VUIHx8CisgICAgICAgICAgICAgICAgIHBMb2dGb250LT5sZkNoYXJTZXQgPT0gR0IyMzEyX0NIQVJTRVQgfHwKKyAgICAgICAgICAgICAgICAgcExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBIQU5HRVVMX0NIQVJTRVQgfHwKKyAgICAgICAgICAgICAgICAgcExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBTSElGVEpJU19DSEFSU0VUOworICBDRlhfQnl0ZVN0cmluZyBiYXNlZm9udDsKKyAgaWYgKGJUcmFuc2xhdGVOYW1lICYmIGJDSkspIHsKKyAgICBiYXNlZm9udCA9IF9GUERGX0dldFBTTmFtZUZyb21UVChoREMpOworICB9CisgIGlmIChiYXNlZm9udC5Jc0VtcHR5KCkpIHsKKyAgICBiYXNlZm9udCA9IHBMb2dGb250LT5sZkZhY2VOYW1lOworICB9CisgIGl0YWxpY2FuZ2xlID0gcHRtLT5vdG1JdGFsaWNBbmdsZSAvIDEwOworICBhc2NlbmQgPSBwdG0tPm90bXJjRm9udEJveC50b3A7CisgIGRlc2NlbmQgPSBwdG0tPm90bXJjRm9udEJveC5ib3R0b207CisgIGNhcGhlaWdodCA9IHB0bS0+b3Rtc0NhcEVtSGVpZ2h0OworICBiYm94WzBdID0gcHRtLT5vdG1yY0ZvbnRCb3gubGVmdDsKKyAgYmJveFsxXSA9IHB0bS0+b3RtcmNGb250Qm94LmJvdHRvbTsKKyAgYmJveFsyXSA9IHB0bS0+b3RtcmNGb250Qm94LnJpZ2h0OworICBiYm94WzNdID0gcHRtLT5vdG1yY0ZvbnRCb3gudG9wOworICBGWF9GcmVlKHRtX2J1Zik7CisgIGJhc2Vmb250LlJlcGxhY2UoIiAiLCAiIik7CisgIENQREZfRGljdGlvbmFyeSogcEJhc2VEaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIlR5cGUiLCAiRm9udCIpOworICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCA9IHBCYXNlRGljdDsKKyAgaWYgKCFiQ0pLKSB7CisgICAgaWYgKHBMb2dGb250LT5sZkNoYXJTZXQgPT0gQU5TSV9DSEFSU0VUIHx8CisgICAgICAgIHBMb2dGb250LT5sZkNoYXJTZXQgPT0gREVGQVVMVF9DSEFSU0VUIHx8CisgICAgICAgIHBMb2dGb250LT5sZkNoYXJTZXQgPT0gU1lNQk9MX0NIQVJTRVQpIHsKKyAgICAgIGlmIChwTG9nRm9udC0+bGZDaGFyU2V0ID09IFNZTUJPTF9DSEFSU0VUKSB7CisgICAgICAgIGZsYWdzIHw9IFBERkZPTlRfU1lNQk9MSUM7CisgICAgICB9IGVsc2UgeworICAgICAgICBmbGFncyB8PSBQREZGT05UX05PTlNZTUJPTElDOworICAgICAgfQorICAgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIkVuY29kaW5nIiwgIldpbkFuc2lFbmNvZGluZyIpOworICAgIH0gZWxzZSB7CisgICAgICBmbGFncyB8PSBQREZGT05UX05PTlNZTUJPTElDOworICAgICAgaW50IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIGdfRlhfQ2hhcnNldFVuaWNvZGVzIC8gc2l6ZW9mKEZYX0NoYXJzZXRVbmljb2Rlcyk7CisgICAgICAgICAgIGkrKykKKyAgICAgICAgaWYgKGdfRlhfQ2hhcnNldFVuaWNvZGVzW2ldLm1fQ2hhcnNldCA9PSBwTG9nRm9udC0+bGZDaGFyU2V0KSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIGlmIChpIDwgc2l6ZW9mIGdfRlhfQ2hhcnNldFVuaWNvZGVzIC8gc2l6ZW9mKEZYX0NoYXJzZXRVbmljb2RlcykpIHsKKyAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRW5jb2RpbmcgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICAgICAgICBwRW5jb2RpbmctPlNldEF0TmFtZSgiQmFzZUVuY29kaW5nIiwgIldpbkFuc2lFbmNvZGluZyIpOworICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBuZXcgQ1BERl9BcnJheTsKKyAgICAgICAgcEFycmF5LT5BZGRJbnRlZ2VyKDEyOCk7CisgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwVW5pY29kZXMgPSBnX0ZYX0NoYXJzZXRVbmljb2Rlc1tpXS5tX3BVbmljb2RlczsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMjg7IGorKykgeworICAgICAgICAgIENGWF9CeXRlU3RyaW5nIG5hbWUgPSBQREZfQWRvYmVOYW1lRnJvbVVuaWNvZGUocFVuaWNvZGVzW2pdKTsKKyAgICAgICAgICBpZiAobmFtZS5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHBBcnJheS0+QWRkTmFtZSgiLm5vdGRlZiIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwQXJyYXktPkFkZE5hbWUobmFtZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBFbmNvZGluZy0+U2V0QXQoIkRpZmZlcmVuY2VzIiwgcEFycmF5KTsKKyAgICAgICAgQWRkSW5kaXJlY3RPYmplY3QocEVuY29kaW5nKTsKKyAgICAgICAgcEJhc2VEaWN0LT5TZXRBdFJlZmVyZW5jZSgiRW5jb2RpbmciLCB0aGlzLCBwRW5jb2RpbmcpOworICAgICAgfQorICAgIH0KKyAgICBpZiAocExvZ0ZvbnQtPmxmV2VpZ2h0ID4gRldfTUVESVVNICYmIHBMb2dGb250LT5sZkl0YWxpYykgeworICAgICAgYmFzZWZvbnQgKz0gIixCb2xkSXRhbGljIjsKKyAgICB9IGVsc2UgaWYgKHBMb2dGb250LT5sZldlaWdodCA+IEZXX01FRElVTSkgeworICAgICAgYmFzZWZvbnQgKz0gIixCb2xkIjsKKyAgICB9IGVsc2UgaWYgKHBMb2dGb250LT5sZkl0YWxpYykgeworICAgICAgYmFzZWZvbnQgKz0gIixJdGFsaWMiOworICAgIH0KKyAgICBwQmFzZURpY3QtPlNldEF0TmFtZSgiU3VidHlwZSIsICJUcnVlVHlwZSIpOworICAgIHBCYXNlRGljdC0+U2V0QXROYW1lKCJCYXNlRm9udCIsIGJhc2Vmb250KTsKKyAgICBwQmFzZURpY3QtPlNldEF0TnVtYmVyKCJGaXJzdENoYXIiLCAzMik7CisgICAgcEJhc2VEaWN0LT5TZXRBdE51bWJlcigiTGFzdENoYXIiLCAyNTUpOworICAgIGludCBjaGFyX3dpZHRoc1syMjRdOworICAgIEdldENoYXJXaWR0aChoREMsIDMyLCAyNTUsIGNoYXJfd2lkdGhzKTsKKyAgICBDUERGX0FycmF5KiBwV2lkdGhzID0gbmV3IENQREZfQXJyYXk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMjQ7IGkrKykgeworICAgICAgcFdpZHRocy0+QWRkSW50ZWdlcihjaGFyX3dpZHRoc1tpXSk7CisgICAgfQorICAgIHBCYXNlRGljdC0+U2V0QXQoIldpZHRocyIsIHBXaWR0aHMpOworICB9IGVsc2UgeworICAgIGZsYWdzIHw9IFBERkZPTlRfTk9OU1lNQk9MSUM7CisgICAgcEZvbnREaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgICBDRlhfQnl0ZVN0cmluZyBjbWFwOworICAgIENGWF9CeXRlU3RyaW5nIG9yZGVyaW5nOworICAgIGludCBzdXBwbGVtZW50OworICAgIENQREZfQXJyYXkqIHBXaWR0aEFycmF5ID0gbmV3IENQREZfQXJyYXk7CisgICAgc3dpdGNoIChwTG9nRm9udC0+bGZDaGFyU2V0KSB7CisgICAgICBjYXNlIENISU5FU0VCSUc1X0NIQVJTRVQ6CisgICAgICAgIGNtYXAgPSBiVmVydCA/ICJFVGVubXMtQjUtViIgOiAiRVRlbm1zLUI1LUgiOworICAgICAgICBvcmRlcmluZyA9ICJDTlMxIjsKKyAgICAgICAgc3VwcGxlbWVudCA9IDQ7CisgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDEpOworICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheShoREMsIDB4MjAsIDB4N2UsIHBXaWR0aEFycmF5KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdCMjMxMl9DSEFSU0VUOgorICAgICAgICBjbWFwID0gYlZlcnQgPyAiR0JLLUVVQy1WIiA6ICJHQkstRVVDLUgiOworICAgICAgICBvcmRlcmluZyA9ICJHQjEiLCBzdXBwbGVtZW50ID0gMjsKKyAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoNzcxNik7CisgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGhEQywgMHgyMCwgMHgyMCwgcFdpZHRoQXJyYXkpOworICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcig4MTQpOworICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheShoREMsIDB4MjEsIDB4N2UsIHBXaWR0aEFycmF5KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEhBTkdFVUxfQ0hBUlNFVDoKKyAgICAgICAgY21hcCA9IGJWZXJ0ID8gIktTQ21zLVVIQy1WIiA6ICJLU0Ntcy1VSEMtSCI7CisgICAgICAgIG9yZGVyaW5nID0gIktvcmVhMSI7CisgICAgICAgIHN1cHBsZW1lbnQgPSAyOworICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigxKTsKKyAgICAgICAgX0luc2VydFdpZHRoQXJyYXkoaERDLCAweDIwLCAweDdlLCBwV2lkdGhBcnJheSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTSElGVEpJU19DSEFSU0VUOgorICAgICAgICBjbWFwID0gYlZlcnQgPyAiOTBtcy1SS1NKLVYiIDogIjkwbXMtUktTSi1IIjsKKyAgICAgICAgb3JkZXJpbmcgPSAiSmFwYW4xIjsKKyAgICAgICAgc3VwcGxlbWVudCA9IDU7CisgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDIzMSk7CisgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGhEQywgMHgyMCwgMHg3ZCwgcFdpZHRoQXJyYXkpOworICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigzMjYpOworICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheShoREMsIDB4YTAsIDB4YTAsIHBXaWR0aEFycmF5KTsKKyAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoMzI3KTsKKyAgICAgICAgX0luc2VydFdpZHRoQXJyYXkoaERDLCAweGExLCAweGRmLCBwV2lkdGhBcnJheSk7CisgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDYzMSk7CisgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGhEQywgMHg3ZSwgMHg3ZSwgcFdpZHRoQXJyYXkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIlN1YnR5cGUiLCAiVHlwZTAiKTsKKyAgICBwQmFzZURpY3QtPlNldEF0TmFtZSgiQmFzZUZvbnQiLCBiYXNlZm9udCk7CisgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIkVuY29kaW5nIiwgY21hcCk7CisgICAgcEZvbnREaWN0LT5TZXRBdCgiVyIsIHBXaWR0aEFycmF5KTsKKyAgICBwRm9udERpY3QtPlNldEF0TmFtZSgiVHlwZSIsICJGb250Iik7CisgICAgcEZvbnREaWN0LT5TZXRBdE5hbWUoIlN1YnR5cGUiLCAiQ0lERm9udFR5cGUyIik7CisgICAgcEZvbnREaWN0LT5TZXRBdE5hbWUoIkJhc2VGb250IiwgYmFzZWZvbnQpOworICAgIENQREZfRGljdGlvbmFyeSogcENJRFN5c0luZm8gPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICAgIHBDSURTeXNJbmZvLT5TZXRBdFN0cmluZygiUmVnaXN0cnkiLCAiQWRvYmUiKTsKKyAgICBwQ0lEU3lzSW5mby0+U2V0QXRTdHJpbmcoIk9yZGVyaW5nIiwgb3JkZXJpbmcpOworICAgIHBDSURTeXNJbmZvLT5TZXRBdEludGVnZXIoIlN1cHBsZW1lbnQiLCBzdXBwbGVtZW50KTsKKyAgICBwRm9udERpY3QtPlNldEF0KCJDSURTeXN0ZW1JbmZvIiwgcENJRFN5c0luZm8pOworICAgIENQREZfQXJyYXkqIHBBcnJheSA9IG5ldyBDUERGX0FycmF5OworICAgIHBCYXNlRGljdC0+U2V0QXQoIkRlc2NlbmRhbnRGb250cyIsIHBBcnJheSk7CisgICAgQWRkSW5kaXJlY3RPYmplY3QocEZvbnREaWN0KTsKKyAgICBwQXJyYXktPkFkZFJlZmVyZW5jZSh0aGlzLCBwRm9udERpY3QpOworICB9CisgIEFkZEluZGlyZWN0T2JqZWN0KHBCYXNlRGljdCk7CisgIENQREZfRGljdGlvbmFyeSogcEZvbnREZXNjID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgcEZvbnREZXNjLT5TZXRBdE5hbWUoIlR5cGUiLCAiRm9udERlc2NyaXB0b3IiKTsKKyAgcEZvbnREZXNjLT5TZXRBdE5hbWUoIkZvbnROYW1lIiwgYmFzZWZvbnQpOworICBwRm9udERlc2MtPlNldEF0SW50ZWdlcigiRmxhZ3MiLCBmbGFncyk7CisgIENQREZfQXJyYXkqIHBCQm94ID0gbmV3IENQREZfQXJyYXk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgcEJCb3gtPkFkZEludGVnZXIoYmJveFtpXSk7CisgIH0KKyAgcEZvbnREZXNjLT5TZXRBdCgiRm9udEJCb3giLCBwQkJveCk7CisgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJJdGFsaWNBbmdsZSIsIGl0YWxpY2FuZ2xlKTsKKyAgcEZvbnREZXNjLT5TZXRBdEludGVnZXIoIkFzY2VudCIsIGFzY2VuZCk7CisgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJEZXNjZW50IiwgZGVzY2VuZCk7CisgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJDYXBIZWlnaHQiLCBjYXBoZWlnaHQpOworICBwRm9udERlc2MtPlNldEF0SW50ZWdlcigiU3RlbVYiLCBwTG9nRm9udC0+bGZXZWlnaHQgLyA1KTsKKyAgQWRkSW5kaXJlY3RPYmplY3QocEZvbnREZXNjKTsKKyAgcEZvbnREaWN0LT5TZXRBdFJlZmVyZW5jZSgiRm9udERlc2NyaXB0b3IiLCB0aGlzLCBwRm9udERlc2MpOworICBoRm9udCA9IFNlbGVjdE9iamVjdChoREMsIGhGb250KTsKKyAgRGVsZXRlT2JqZWN0KGhGb250KTsKKyAgRGVsZXRlREMoaERDKTsKKyAgcmV0dXJuIExvYWRGb250KHBCYXNlRGljdCk7CiB9CiAjZW5kaWYKLSNpZiAoX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfKQotRlhfVUlOVDMyIEZYX0dldExhbmdIYXNoQ29kZSggRlhfTFBDU1RSIHBTdHIpCi17Ci0gICAgRlhTWVNfYXNzZXJ0KCBwU3RyICE9IE5VTEwpOwotICAgIEZYX0lOVDMyIGlMZW5ndGggPSBGWFNZU19zdHJsZW4ocFN0cik7Ci0gICAgRlhfTFBDU1RSIHBTdHJFbmQgPSBwU3RyICsgaUxlbmd0aDsKLSAgICBGWF9VSU5UMzIgdUhhc2hDb2RlID0gMDsKLSAgICB3aGlsZSAoIHBTdHIgPCBwU3RyRW5kKSB7Ci0gICAgICAgIHVIYXNoQ29kZSA9IDMxICogdUhhc2hDb2RlICsgdG9sb3dlcigqcFN0cisrKTsKLSAgICB9Ci0gICAgcmV0dXJuIHVIYXNoQ29kZTsKKworI2lmIChfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXykKK3VpbnQzMl90IEZYX0dldExhbmdIYXNoQ29kZShjb25zdCBGWF9DSEFSKiBwU3RyKSB7CisgIEZYU1lTX2Fzc2VydChwU3RyKTsKKyAgaW50MzJfdCBpTGVuZ3RoID0gRlhTWVNfc3RybGVuKHBTdHIpOworICBjb25zdCBGWF9DSEFSKiBwU3RyRW5kID0gcFN0ciArIGlMZW5ndGg7CisgIHVpbnQzMl90IHVIYXNoQ29kZSA9IDA7CisgIHdoaWxlIChwU3RyIDwgcFN0ckVuZCkgeworICAgIHVIYXNoQ29kZSA9IDMxICogdUhhc2hDb2RlICsgdG9sb3dlcigqcFN0cisrKTsKKyAgfQorICByZXR1cm4gdUhhc2hDb2RlOwogfQogc3RydWN0IEZYX0xBTkcyQ1MgewotICAgIEZYX0RXT1JEICAgIHVMYW5nOwotICAgIGludCAgICAgICAgIHVDaGFyc2V0OwotfSpGWF9MUExBTkcyQ1M7CisgIEZYX0RXT1JEIHVMYW5nOworICBpbnQgdUNoYXJzZXQ7Cit9ICogRlhfTFBMQU5HMkNTOwogc3RhdGljIGNvbnN0IEZYX0xBTkcyQ1MgZ3NfRlhMYW5nMkNoYXJzZXRUYWJsZVtdID0gewotICAgIHszMTA5LCAwfSwKLSAgICB7MzEyMSwgMTc4fSwKLSAgICB7MzEyOSwgMTYyfSwKLSAgICB7MzEzOSwgMjA0fSwKLSAgICB7MzE0MSwgMjA0fSwKLSAgICB7MzE2NiwgMH0sCi0gICAgezMxODQsIDIzOH0sCi0gICAgezMxOTcsIDB9LAotICAgIHszMjAxLCAwfSwKLSAgICB7MzIzOSwgMTYxfSwKLSAgICB7MzI0MSwgMH0sCi0gICAgezMyNDYsIDB9LAotICAgIHszMjQ3LCAxODZ9LAotICAgIHszMjQ4LCAwfSwKLSAgICB7MzI1OSwgMTc4fSwKLSAgICB7MzI2NywgMH0sCi0gICAgezMyNzMsIDB9LAotICAgIHszMjc2LCAwfSwKLSAgICB7MzMwMSwgMH0sCi0gICAgezMzMTAsIDF9LAotICAgIHszMzI1LCAxNzd9LAotICAgIHszMzI5LCAxfSwKLSAgICB7MzMzOCwgMjM4fSwKLSAgICB7MzM0MSwgMjM4fSwKLSAgICB7MzM0NSwgMX0sCi0gICAgezMzNTUsIDB9LAotICAgIHszMzcwLCAwfSwKLSAgICB7MzM3MSwgMH0sCi0gICAgezMzODMsIDEyOH0sCi0gICAgezM0MjQsIDIwNH0sCi0gICAgezM0MjcsIDF9LAotICAgIHszNDI4LCAxMjl9LAotICAgIHszNDM2LCAxNzh9LAotICAgIHszNDY0LCAxODZ9LAotICAgIHszNDY2LCAxODZ9LAotICAgIHszNDg2LCAyMDR9LAotICAgIHszNDg3LCAwfSwKLSAgICB7MzQ5MywgMX0sCi0gICAgezM0OTQsIDB9LAotICAgIHszNTA4LCAwfSwKLSAgICB7MzUxOCwgMH0sCi0gICAgezM1MjAsIDB9LAotICAgIHszNTY5LCAxfSwKLSAgICB7MzU4MCwgMjM4fSwKLSAgICB7MzU4OCwgMH0sCi0gICAgezM2NDUsIDIzOH0sCi0gICAgezM2NTEsIDIwNH0sCi0gICAgezM2NzIsIDIzOH0sCi0gICAgezM2NzMsIDIzOH0sCi0gICAgezM2NzgsIDIzOH0sCi0gICAgezM2NzksIDIzOH0sCi0gICAgezM2ODMsIDB9LAotICAgIHszNjg0LCAwfSwKLSAgICB7MzY5MywgMX0sCi0gICAgezM2OTcsIDF9LAotICAgIHszNzAwLCAyMjJ9LAotICAgIHszNzEwLCAxNjJ9LAotICAgIHszNzM0LCAyMDR9LAotICAgIHszNzQxLCAxNzh9LAotICAgIHszNzQ5LCAxNjJ9LAotICAgIHszNzYzLCAxNjN9LAotICAgIHszODg2LCAxMzR9LAotICAgIHsxMDU5NDMsIDB9LAotICAgIHsxMDYzNzUsIDF9LAotICAgIHszOTIzNDUxODM3LCAxMzR9LAorICAgIHszMTA5LCAwfSwgICAgICAgICB7MzEyMSwgMTc4fSwgezMxMjksIDE2Mn0sIHszMTM5LCAyMDR9LCB7MzE0MSwgMjA0fSwKKyAgICB7MzE2NiwgMH0sICAgICAgICAgezMxODQsIDIzOH0sIHszMTk3LCAwfSwgICB7MzIwMSwgMH0sICAgezMyMzksIDE2MX0sCisgICAgezMyNDEsIDB9LCAgICAgICAgIHszMjQ2LCAwfSwgICB7MzI0NywgMTg2fSwgezMyNDgsIDB9LCAgIHszMjU5LCAxNzh9LAorICAgIHszMjY3LCAwfSwgICAgICAgICB7MzI3MywgMH0sICAgezMyNzYsIDB9LCAgIHszMzAxLCAwfSwgICB7MzMxMCwgMX0sCisgICAgezMzMjUsIDE3N30sICAgICAgIHszMzI5LCAxfSwgICB7MzMzOCwgMjM4fSwgezMzNDEsIDIzOH0sIHszMzQ1LCAxfSwKKyAgICB7MzM1NSwgMH0sICAgICAgICAgezMzNzAsIDB9LCAgIHszMzcxLCAwfSwgICB7MzM4MywgMTI4fSwgezM0MjQsIDIwNH0sCisgICAgezM0MjcsIDF9LCAgICAgICAgIHszNDI4LCAxMjl9LCB7MzQzNiwgMTc4fSwgezM0NjQsIDE4Nn0sIHszNDY2LCAxODZ9LAorICAgIHszNDg2LCAyMDR9LCAgICAgICB7MzQ4NywgMH0sICAgezM0OTMsIDF9LCAgIHszNDk0LCAwfSwgICB7MzUwOCwgMH0sCisgICAgezM1MTgsIDB9LCAgICAgICAgIHszNTIwLCAwfSwgICB7MzU2OSwgMX0sICAgezM1ODAsIDIzOH0sIHszNTg4LCAwfSwKKyAgICB7MzY0NSwgMjM4fSwgICAgICAgezM2NTEsIDIwNH0sIHszNjcyLCAyMzh9LCB7MzY3MywgMjM4fSwgezM2NzgsIDIzOH0sCisgICAgezM2NzksIDIzOH0sICAgICAgIHszNjgzLCAwfSwgICB7MzY4NCwgMH0sICAgezM2OTMsIDF9LCAgIHszNjk3LCAxfSwKKyAgICB7MzcwMCwgMjIyfSwgICAgICAgezM3MTAsIDE2Mn0sIHszNzM0LCAyMDR9LCB7Mzc0MSwgMTc4fSwgezM3NDksIDE2Mn0sCisgICAgezM3NjMsIDE2M30sICAgICAgIHszODg2LCAxMzR9LCB7MTA1OTQzLCAwfSwgezEwNjM3NSwgMX0sIHszOTIzNDUxODM3LCAxMzR9LAogICAgIHszOTIzNDUxODM4LCAxMzZ9LAogfTsKLXN0YXRpYyBGWF9XT1JEIEZYX0dldENzRnJvbUxhbmdDb2RlKEZYX1VJTlQzMiB1Q29kZSkKLXsKLSAgICBGWF9JTlQzMiBpU3RhcnQgPSAwOwotICAgIEZYX0lOVDMyIGlFbmQgPSBzaXplb2YoZ3NfRlhMYW5nMkNoYXJzZXRUYWJsZSkgLyBzaXplb2YoRlhfTEFORzJDUykgLSAxOwotICAgIHdoaWxlIChpU3RhcnQgPD0gaUVuZCkgewotICAgICAgICBGWF9JTlQzMiBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsKLSAgICAgICAgY29uc3QgRlhfTEFORzJDUyAmY2hhcnNldCA9IGdzX0ZYTGFuZzJDaGFyc2V0VGFibGVbaU1pZF07Ci0gICAgICAgIGlmICh1Q29kZSA9PSBjaGFyc2V0LnVMYW5nKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hhcnNldC51Q2hhcnNldDsKLSAgICAgICAgfSBlbHNlIGlmICh1Q29kZSA8IGNoYXJzZXQudUxhbmcpIHsKLSAgICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOwotICAgICAgICB9Ci0gICAgfTsKLSAgICByZXR1cm4gMDsKLX0KLXN0YXRpYyBGWF9XT1JEIEZYX0dldENoYXJzZXRGcm9tTGFuZyhGWF9MUENTVFIgcExhbmcsIEZYX0lOVDMyIGlMZW5ndGgpCi17Ci0gICAgRlhTWVNfYXNzZXJ0KHBMYW5nKTsKLSAgICBpZiAoaUxlbmd0aCA8IDApIHsKLSAgICAgICAgaUxlbmd0aCA9IEZYU1lTX3N0cmxlbihwTGFuZyk7CitzdGF0aWMgRlhfV09SRCBGWF9HZXRDc0Zyb21MYW5nQ29kZSh1aW50MzJfdCB1Q29kZSkgeworICBpbnQzMl90IGlTdGFydCA9IDA7CisgIGludDMyX3QgaUVuZCA9IHNpemVvZihnc19GWExhbmcyQ2hhcnNldFRhYmxlKSAvIHNpemVvZihGWF9MQU5HMkNTKSAtIDE7CisgIHdoaWxlIChpU3RhcnQgPD0gaUVuZCkgeworICAgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7CisgICAgY29uc3QgRlhfTEFORzJDUyYgY2hhcnNldCA9IGdzX0ZYTGFuZzJDaGFyc2V0VGFibGVbaU1pZF07CisgICAgaWYgKHVDb2RlID09IGNoYXJzZXQudUxhbmcpIHsKKyAgICAgIHJldHVybiBjaGFyc2V0LnVDaGFyc2V0OwogICAgIH0KLSAgICBGWF9VSU5UMzIgdUhhc2ggPSBGWF9HZXRMYW5nSGFzaENvZGUocExhbmcpOwotICAgIHJldHVybiBGWF9HZXRDc0Zyb21MYW5nQ29kZSh1SGFzaCk7Ci19Ci1zdGF0aWMgdm9pZCBfQ0ZTdHJpbmcyQ0ZYQnl0ZVN0cmluZyhDRlN0cmluZ1JlZiBzcmMsIENGWF9CeXRlU3RyaW5nICZkZXN0KQotewotICAgIFNJbnQzMiBsZW4gPSAgQ0ZTdHJpbmdHZXRMZW5ndGgoc3JjKTsKLSAgICBDRlJhbmdlIHJhbmdlID0gQ0ZSYW5nZU1ha2UoMCwgbGVuKTsKLSAgICBDRkluZGV4IHVzZWQgPSAwOwotICAgIFVJbnQ4KiBwQnVmZmVyID0gKFVJbnQ4KiljYWxsb2MobGVuKzEsIHNpemVvZihVSW50OCkpOwotICAgIENGU3RyaW5nR2V0Qnl0ZXMoc3JjLCByYW5nZSwga0NGU3RyaW5nRW5jb2RpbmdBU0NJSSwgMCwgZmFsc2UsIHBCdWZmZXIsIGxlbiwgJnVzZWQpOwotICAgIGRlc3QgPSAoRlhfTFBTVFIpcEJ1ZmZlcjsKLSAgICBmcmVlKHBCdWZmZXIpOwotfQotRlhfQk9PTCBJc0hhc0NoYXJTZXQoQ0ZBcnJheVJlZiBsYW5ndWFnZXMsIGNvbnN0IENGWF9EV29yZEFycmF5ICZjaGFyU2V0cykKLXsKLSAgICBpbnQgaUNvdW50ID0gY2hhclNldHMuR2V0U2l6ZSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ0ZBcnJheUdldENvdW50KGxhbmd1YWdlcyk7ICsraSkgewotICAgICAgICBDRlN0cmluZ1JlZiBsYW5ndWFnZSA9IChDRlN0cmluZ1JlZilDRkFycmF5R2V0VmFsdWVBdEluZGV4KGxhbmd1YWdlcywgaSk7Ci0gICAgICAgIEZYX0RXT1JEIENoYXJTZXQgPSBGWF9HZXRDaGFyc2V0RnJvbUxhbmcoQ0ZTdHJpbmdHZXRDU3RyaW5nUHRyKGxhbmd1YWdlLCBrQ0ZTdHJpbmdFbmNvZGluZ01hY1JvbWFuKSwgLTEpOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGlDb3VudDsgKytqKSB7Ci0gICAgICAgICAgICBpZiAoQ2hhclNldCA9PSBjaGFyU2V0c1tqXSkgewotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLXZvaWQgRlhfR2V0Q2hhcldpZHRoKENURm9udFJlZiBmb250LCBVbmlDaGFyIHN0YXJ0LCBVbmlDaGFyIGVuZCwgaW50KiB3aWR0aCkKLXsKLSAgICBDR0Zsb2F0IHNpemUgPSBDVEZvbnRHZXRTaXplKGZvbnQpOwotICAgIGZvciAoOyBzdGFydCA8PSBlbmQ7ICsrc3RhcnQpIHsKLSAgICAgICAgQ0dHbHlwaCBwR2x5cGggPSAwOwotICAgICAgICBDRkluZGV4IGNvdW50ID0gMTsKLSAgICAgICAgQ1RGb250R2V0R2x5cGhzRm9yQ2hhcmFjdGVycyhmb250LCAmc3RhcnQsICZwR2x5cGgsIGNvdW50KTsKLSAgICAgICAgQ0dTaXplIGFkdmFuY2VzOwotICAgICAgICBDVEZvbnRHZXRBZHZhbmNlc0ZvckdseXBocyhmb250LCBrQ1RGb250RGVmYXVsdE9yaWVudGF0aW9uLCAmcEdseXBoLCAmYWR2YW5jZXMsIDEpOwotICAgICAgICAqd2lkdGggPSAoaW50KShhZHZhbmNlcy53aWR0aCAvIHNpemUgKiAxMDAwKSA7Ci0gICAgICAgIHdpZHRoKys7Ci0gICAgfQotfQotc3RhdGljIHZvaWQgX0luc2VydFdpZHRoQXJyYXkoQ1RGb250UmVmIGZvbnQsIGludCBzdGFydCwgaW50IGVuZCwgQ1BERl9BcnJheSogcFdpZHRoQXJyYXkpCi17Ci0gICAgaW50IHNpemUgPSBlbmQgLSBzdGFydCArIDE7Ci0gICAgaW50KiB3aWR0aHMgPSBGWF9BbGxvYyhpbnQsIHNpemUpOwotICAgIEZYX0dldENoYXJXaWR0aChmb250LCBzdGFydCwgZW5kLCB3aWR0aHMpOwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDE7IGkgPCBzaXplOyBpICsrKQotICAgICAgICBpZiAod2lkdGhzW2ldICE9ICp3aWR0aHMpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgaWYgKGkgPT0gc2l6ZSkgewotICAgICAgICBpbnQgZmlyc3QgPSBwV2lkdGhBcnJheS0+R2V0SW50ZWdlcihwV2lkdGhBcnJheS0+R2V0Q291bnQoKSAtIDEpOwotICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcihmaXJzdCArIHNpemUgLSAxKTsKLSAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoKndpZHRocyk7CisgICAgaWYgKHVDb2RlIDwgY2hhcnNldC51TGFuZykgeworICAgICAgaUVuZCA9IGlNaWQgLSAxOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIENQREZfQXJyYXkqIHBXaWR0aEFycmF5MSA9IG5ldyBDUERGX0FycmF5OwotICAgICAgICBwV2lkdGhBcnJheS0+QWRkKHBXaWR0aEFycmF5MSk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpICsrKSB7Ci0gICAgICAgICAgICBwV2lkdGhBcnJheTEtPkFkZEludGVnZXIod2lkdGhzW2ldKTsKLSAgICAgICAgfQorICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7CiAgICAgfQotICAgIEZYX0ZyZWUod2lkdGhzKTsKKyAgfTsKKyAgcmV0dXJuIDA7CiB9Ci1DUERGX0ZvbnQqIENQREZfRG9jdW1lbnQ6OkFkZE1hY0ZvbnQoQ1RGb250UmVmIHBGb250LCBGWF9CT09MIGJWZXJ0LCBGWF9CT09MIGJUcmFuc2xhdGVOYW1lKQotewotICAgIENURm9udFJlZiBmb250ID0gKENURm9udFJlZilwRm9udDsKLSAgICBDVEZvbnREZXNjcmlwdG9yUmVmIGRlc2NyaXB0b3IgPSBDVEZvbnRDb3B5Rm9udERlc2NyaXB0b3IoZm9udCk7Ci0gICAgaWYgKGRlc2NyaXB0b3IgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKK3N0YXRpYyBGWF9XT1JEIEZYX0dldENoYXJzZXRGcm9tTGFuZyhjb25zdCBGWF9DSEFSKiBwTGFuZywgaW50MzJfdCBpTGVuZ3RoKSB7CisgIEZYU1lTX2Fzc2VydChwTGFuZyk7CisgIGlmIChpTGVuZ3RoIDwgMCkgeworICAgIGlMZW5ndGggPSBGWFNZU19zdHJsZW4ocExhbmcpOworICB9CisgIHVpbnQzMl90IHVIYXNoID0gRlhfR2V0TGFuZ0hhc2hDb2RlKHBMYW5nKTsKKyAgcmV0dXJuIEZYX0dldENzRnJvbUxhbmdDb2RlKHVIYXNoKTsKK30KK3N0YXRpYyB2b2lkIF9DRlN0cmluZzJDRlhCeXRlU3RyaW5nKENGU3RyaW5nUmVmIHNyYywgQ0ZYX0J5dGVTdHJpbmcmIGRlc3QpIHsKKyAgU0ludDMyIGxlbiA9IENGU3RyaW5nR2V0TGVuZ3RoKHNyYyk7CisgIENGUmFuZ2UgcmFuZ2UgPSBDRlJhbmdlTWFrZSgwLCBsZW4pOworICBDRkluZGV4IHVzZWQgPSAwOworICBVSW50OCogcEJ1ZmZlciA9IChVSW50OCopY2FsbG9jKGxlbiArIDEsIHNpemVvZihVSW50OCkpOworICBDRlN0cmluZ0dldEJ5dGVzKHNyYywgcmFuZ2UsIGtDRlN0cmluZ0VuY29kaW5nQVNDSUksIDAsIGZhbHNlLCBwQnVmZmVyLCBsZW4sCisgICAgICAgICAgICAgICAgICAgJnVzZWQpOworICBkZXN0ID0gKEZYX0NIQVIqKXBCdWZmZXI7CisgIGZyZWUocEJ1ZmZlcik7Cit9CitGWF9CT09MIElzSGFzQ2hhclNldChDRkFycmF5UmVmIGxhbmd1YWdlcywgY29uc3QgQ0ZYX0RXb3JkQXJyYXkmIGNoYXJTZXRzKSB7CisgIGludCBpQ291bnQgPSBjaGFyU2V0cy5HZXRTaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgQ0ZBcnJheUdldENvdW50KGxhbmd1YWdlcyk7ICsraSkgeworICAgIENGU3RyaW5nUmVmIGxhbmd1YWdlID0gKENGU3RyaW5nUmVmKUNGQXJyYXlHZXRWYWx1ZUF0SW5kZXgobGFuZ3VhZ2VzLCBpKTsKKyAgICBGWF9EV09SRCBDaGFyU2V0ID0gRlhfR2V0Q2hhcnNldEZyb21MYW5nKAorICAgICAgICBDRlN0cmluZ0dldENTdHJpbmdQdHIobGFuZ3VhZ2UsIGtDRlN0cmluZ0VuY29kaW5nTWFjUm9tYW4pLCAtMSk7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpQ291bnQ7ICsraikgeworICAgICAgaWYgKENoYXJTZXQgPT0gY2hhclNldHNbal0pIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9CiAgICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGJhc2Vmb250OwotICAgIEZYX0JPT0wgYkNKSyA9IEZBTFNFOwotICAgIGludCBmbGFncyA9IDAsIGl0YWxpY2FuZ2xlID0gMCwgYXNjZW5kID0gMCwgZGVzY2VuZCA9IDAsIGNhcGhlaWdodCA9IDAsIGJib3hbNF07Ci0gICAgRlhTWVNfbWVtc2V0MzIoYmJveCwgMCwgc2l6ZW9mKGludCkgKiA0KTsKLSAgICBDRkFycmF5UmVmIGxhbmd1YWdlcyA9IChDRkFycmF5UmVmKUNURm9udERlc2NyaXB0b3JDb3B5QXR0cmlidXRlKGRlc2NyaXB0b3IsIGtDVEZvbnRMYW5ndWFnZXNBdHRyaWJ1dGUpOwotICAgIGlmIChsYW5ndWFnZXMgPT0gTlVMTCkgewotICAgICAgICBDRlJlbGVhc2UoZGVzY3JpcHRvcik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBGQUxTRTsKK30KK3ZvaWQgRlhfR2V0Q2hhcldpZHRoKENURm9udFJlZiBmb250LCBVbmlDaGFyIHN0YXJ0LCBVbmlDaGFyIGVuZCwgaW50KiB3aWR0aCkgeworICBDR0Zsb2F0IHNpemUgPSBDVEZvbnRHZXRTaXplKGZvbnQpOworICBmb3IgKDsgc3RhcnQgPD0gZW5kOyArK3N0YXJ0KSB7CisgICAgQ0dHbHlwaCBwR2x5cGggPSAwOworICAgIENGSW5kZXggY291bnQgPSAxOworICAgIENURm9udEdldEdseXBoc0ZvckNoYXJhY3RlcnMoZm9udCwgJnN0YXJ0LCAmcEdseXBoLCBjb3VudCk7CisgICAgQ0dTaXplIGFkdmFuY2VzOworICAgIENURm9udEdldEFkdmFuY2VzRm9yR2x5cGhzKGZvbnQsIGtDVEZvbnREZWZhdWx0T3JpZW50YXRpb24sICZwR2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkdmFuY2VzLCAxKTsKKyAgICAqd2lkdGggPSAoaW50KShhZHZhbmNlcy53aWR0aCAvIHNpemUgKiAxMDAwKTsKKyAgICB3aWR0aCsrOworICB9Cit9CitzdGF0aWMgdm9pZCBfSW5zZXJ0V2lkdGhBcnJheShDVEZvbnRSZWYgZm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwV2lkdGhBcnJheSkgeworICBpbnQgc2l6ZSA9IGVuZCAtIHN0YXJ0ICsgMTsKKyAgaW50KiB3aWR0aHMgPSBGWF9BbGxvYyhpbnQsIHNpemUpOworICBGWF9HZXRDaGFyV2lkdGgoZm9udCwgc3RhcnQsIGVuZCwgd2lkdGhzKTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDE7IGkgPCBzaXplOyBpKyspCisgICAgaWYgKHdpZHRoc1tpXSAhPSAqd2lkdGhzKSB7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgQ0ZYX0RXb3JkQXJyYXkgY2hhclNldHM7Ci0gICAgY2hhclNldHMuQWRkKEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUKTsKLSAgICBjaGFyU2V0cy5BZGQoRlhGT05UX0dCMjMxMl9DSEFSU0VUKTsKLSAgICBjaGFyU2V0cy5BZGQoRlhGT05UX0hBTkdFVUxfQ0hBUlNFVCk7Ci0gICAgY2hhclNldHMuQWRkKEZYRk9OVF9TSElGVEpJU19DSEFSU0VUKTsKLSAgICBpZiAoSXNIYXNDaGFyU2V0KGxhbmd1YWdlcywgY2hhclNldHMpKSB7Ci0gICAgICAgIGJDSksgPSBUUlVFOworICBpZiAoaSA9PSBzaXplKSB7CisgICAgaW50IGZpcnN0ID0gcFdpZHRoQXJyYXktPkdldEludGVnZXIocFdpZHRoQXJyYXktPkdldENvdW50KCkgLSAxKTsKKyAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcihmaXJzdCArIHNpemUgLSAxKTsKKyAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigqd2lkdGhzKTsKKyAgfSBlbHNlIHsKKyAgICBDUERGX0FycmF5KiBwV2lkdGhBcnJheTEgPSBuZXcgQ1BERl9BcnJheTsKKyAgICBwV2lkdGhBcnJheS0+QWRkKHBXaWR0aEFycmF5MSk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgcFdpZHRoQXJyYXkxLT5BZGRJbnRlZ2VyKHdpZHRoc1tpXSk7CiAgICAgfQorICB9CisgIEZYX0ZyZWUod2lkdGhzKTsKK30KK0NQREZfRm9udCogQ1BERl9Eb2N1bWVudDo6QWRkTWFjRm9udChDVEZvbnRSZWYgcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUcmFuc2xhdGVOYW1lKSB7CisgIENURm9udFJlZiBmb250ID0gKENURm9udFJlZilwRm9udDsKKyAgQ1RGb250RGVzY3JpcHRvclJlZiBkZXNjcmlwdG9yID0gQ1RGb250Q29weUZvbnREZXNjcmlwdG9yKGZvbnQpOworICBpZiAoIWRlc2NyaXB0b3IpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBiYXNlZm9udDsKKyAgRlhfQk9PTCBiQ0pLID0gRkFMU0U7CisgIGludCBmbGFncyA9IDAsIGl0YWxpY2FuZ2xlID0gMCwgYXNjZW5kID0gMCwgZGVzY2VuZCA9IDAsIGNhcGhlaWdodCA9IDAsCisgICAgICBiYm94WzRdOworICBGWFNZU19tZW1zZXQoYmJveCwgMCwgc2l6ZW9mKGludCkgKiA0KTsKKyAgQ0ZBcnJheVJlZiBsYW5ndWFnZXMgPSAoQ0ZBcnJheVJlZilDVEZvbnREZXNjcmlwdG9yQ29weUF0dHJpYnV0ZSgKKyAgICAgIGRlc2NyaXB0b3IsIGtDVEZvbnRMYW5ndWFnZXNBdHRyaWJ1dGUpOworICBpZiAoIWxhbmd1YWdlcykgewogICAgIENGUmVsZWFzZShkZXNjcmlwdG9yKTsKLSAgICBDRkRpY3Rpb25hcnlSZWYgdHJhaXRzID0gKENGRGljdGlvbmFyeVJlZilDVEZvbnRDb3B5VHJhaXRzKGZvbnQpOwotICAgIGlmICh0cmFpdHMgPT0gTlVMTCkgewotICAgICAgICBDRlJlbGVhc2UobGFuZ3VhZ2VzKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENGTnVtYmVyUmVmIHN5Ym9saWNUcmFpdCA9IChDRk51bWJlclJlZilDRkRpY3Rpb25hcnlHZXRWYWx1ZSh0cmFpdHMsIGtDVEZvbnRTeW1ib2xpY1RyYWl0KTsKLSAgICBDVEZvbnRTeW1ib2xpY1RyYWl0cyB0cmFpdCA9IDA7Ci0gICAgQ0ZOdW1iZXJHZXRWYWx1ZShzeWJvbGljVHJhaXQsIGtDRk51bWJlclNJbnQzMlR5cGUsICZ0cmFpdCk7Ci0gICAgaWYgKHRyYWl0ICYga0NURm9udEl0YWxpY1RyYWl0KSB7Ci0gICAgICAgIGZsYWdzIHw9IFBERkZPTlRfSVRBTElDOwotICAgIH0KLSAgICBpZiAodHJhaXQgJiBrQ1RGb250TW9ub1NwYWNlVHJhaXQpIHsKLSAgICAgICAgZmxhZ3MgfD0gUERGRk9OVF9GSVhFRFBJVENIOwotICAgIH0KLSAgICBpZiAodHJhaXQgJiBrQ1RGb250TW9kZXJuU2VyaWZzQ2xhc3MpIHsKLSAgICAgICAgZmxhZ3MgfD0gUERGRk9OVF9TRVJJRjsKLSAgICB9Ci0gICAgaWYgKHRyYWl0ICYga0NURm9udFNjcmlwdHNDbGFzcykgewotICAgICAgICBmbGFncyB8PSBQREZGT05UX1NDUklQVDsKLSAgICB9Ci0gICAgQ0ZOdW1iZXJSZWYgd2VpZ2h0VHJhaXQgPSAoQ0ZOdW1iZXJSZWYpQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUodHJhaXRzLCBrQ1RGb250V2VpZ2h0VHJhaXQpOwotICAgIEZsb2F0MzIgd2VpZ2h0ID0gMDsKLSAgICBDRk51bWJlckdldFZhbHVlKHdlaWdodFRyYWl0LCBrQ0ZOdW1iZXJGbG9hdDMyVHlwZSwgJndlaWdodCk7Ci0gICAgaXRhbGljYW5nbGUgPSBDVEZvbnRHZXRTbGFudEFuZ2xlKGZvbnQpOwotICAgIGFzY2VuZCAgICAgID0gQ1RGb250R2V0QXNjZW50KGZvbnQpOwotICAgIGRlc2NlbmQgICAgID0gQ1RGb250R2V0RGVzY2VudChmb250KTsKLSAgICBjYXBoZWlnaHQgICA9IENURm9udEdldENhcEhlaWdodChmb250KTsKLSAgICBDR1JlY3QgYm94ICA9IENURm9udEdldEJvdW5kaW5nQm94KGZvbnQpOwotICAgIGJib3hbMF0gICAgID0gYm94Lm9yaWdpbi54OwotICAgIGJib3hbMV0gICAgID0gYm94Lm9yaWdpbi55OwotICAgIGJib3hbMl0gICAgID0gYm94Lm9yaWdpbi54ICsgYm94LnNpemUud2lkdGg7Ci0gICAgYmJveFszXSAgICAgPSBib3gub3JpZ2luLnkgKyBib3guc2l6ZS5oZWlnaHQ7Ci0gICAgaWYgKGJUcmFuc2xhdGVOYW1lICYmIGJDSkspIHsKLSAgICAgICAgQ0ZTdHJpbmdSZWYgcG9zdE5hbWUgPSBDVEZvbnRDb3B5UG9zdFNjcmlwdE5hbWUoZm9udCk7Ci0gICAgICAgIF9DRlN0cmluZzJDRlhCeXRlU3RyaW5nKHBvc3ROYW1lLCBiYXNlZm9udCk7Ci0gICAgICAgIENGUmVsZWFzZShwb3N0TmFtZSk7Ci0gICAgfQotICAgIGlmIChiYXNlZm9udC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgQ0ZTdHJpbmdSZWYgZnVsbE5hbWUgPSBDVEZvbnRDb3B5RnVsbE5hbWUoZm9udCk7Ci0gICAgICAgIF9DRlN0cmluZzJDRlhCeXRlU3RyaW5nKGZ1bGxOYW1lLCBiYXNlZm9udCk7Ci0gICAgICAgIENGUmVsZWFzZShmdWxsTmFtZSk7Ci0gICAgfQotICAgIGJhc2Vmb250LlJlcGxhY2UoIiAiLCAiIik7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwQmFzZURpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgIENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0ID0gcEJhc2VEaWN0OwotICAgIGlmICghYkNKSykgewotICAgICAgICBjaGFyU2V0cy5SZW1vdmVBbGwoKTsKLSAgICAgICAgY2hhclNldHMuQWRkKEZYRk9OVF9BTlNJX0NIQVJTRVQpOwotICAgICAgICBjaGFyU2V0cy5BZGQoRlhGT05UX0RFRkFVTFRfQ0hBUlNFVCk7Ci0gICAgICAgIGNoYXJTZXRzLkFkZChGWEZPTlRfU1lNQk9MX0NIQVJTRVQpOwotICAgICAgICBpZiAoSXNIYXNDaGFyU2V0KGxhbmd1YWdlcywgY2hhclNldHMpKSB7Ci0gICAgICAgICAgICBjaGFyU2V0cy5SZW1vdmVBbGwoKTsKLSAgICAgICAgICAgIGNoYXJTZXRzLkFkZChGWEZPTlRfU1lNQk9MX0NIQVJTRVQpOwotICAgICAgICAgICAgaWYgKElzSGFzQ2hhclNldChsYW5ndWFnZXMsIGNoYXJTZXRzKSkgewotICAgICAgICAgICAgICAgIGZsYWdzIHw9IFBERkZPTlRfU1lNQk9MSUM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZsYWdzIHw9IFBERkZPTlRfTk9OU1lNQk9MSUM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQmFzZURpY3QtPlNldEF0TmFtZShGWF9CU1RSQygiRW5jb2RpbmciKSwgIldpbkFuc2lFbmNvZGluZyIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmxhZ3MgfD0gUERGRk9OVF9OT05TWU1CT0xJQzsKLSAgICAgICAgICAgIHNpemVfdCBpOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiBnX0ZYX0NoYXJzZXRVbmljb2RlcyAvIHNpemVvZihGWF9DaGFyc2V0VW5pY29kZXMpOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgY2hhclNldHMuUmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICAgICAgY2hhclNldHMuQWRkKGdfRlhfQ2hhcnNldFVuaWNvZGVzW2ldLm1fQ2hhcnNldCk7Ci0gICAgICAgICAgICAgICAgaWYgKElzSGFzQ2hhclNldChsYW5ndWFnZXMsIGNoYXJTZXRzKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaSA8IHNpemVvZiBnX0ZYX0NoYXJzZXRVbmljb2RlcyAvIHNpemVvZihGWF9DaGFyc2V0VW5pY29kZXMpKSB7Ci0gICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRW5jb2RpbmcgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgICAgICAgICAgICAgIHBFbmNvZGluZy0+U2V0QXROYW1lKEZYX0JTVFJDKCJCYXNlRW5jb2RpbmciKSwgIldpbkFuc2lFbmNvZGluZyIpOwotICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IG5ldyBDUERGX0FycmF5OwotICAgICAgICAgICAgICAgIHBBcnJheS0+QWRkSW50ZWdlcigxMjgpOwotICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwVW5pY29kZXMgPSBnX0ZYX0NoYXJzZXRVbmljb2Rlc1tpXS5tX3BVbmljb2RlczsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEyODsgaiArKykgewotICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gUERGX0Fkb2JlTmFtZUZyb21Vbmljb2RlKHBVbmljb2Rlc1tqXSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLklzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcEFycmF5LT5BZGROYW1lKEZYX0JTVFJDKCIubm90ZGVmIikpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcEFycmF5LT5BZGROYW1lKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBFbmNvZGluZy0+U2V0QXQoRlhfQlNUUkMoIkRpZmZlcmVuY2VzIiksIHBBcnJheSk7Ci0gICAgICAgICAgICAgICAgQWRkSW5kaXJlY3RPYmplY3QocEVuY29kaW5nKTsKLSAgICAgICAgICAgICAgICBwQmFzZURpY3QtPlNldEF0UmVmZXJlbmNlKEZYX0JTVFJDKCJFbmNvZGluZyIpLCB0aGlzLCBwRW5jb2RpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh3ZWlnaHQgPiAwLjAgJiYgdHJhaXQgJiBrQ1RGb250SXRhbGljVHJhaXQpIHsKLSAgICAgICAgICAgIGJhc2Vmb250ICs9ICIsQm9sZEl0YWxpYyI7Ci0gICAgICAgIH0gZWxzZSBpZiAod2VpZ2h0ID4gMC4wKSB7Ci0gICAgICAgICAgICBiYXNlZm9udCArPSAiLEJvbGQiOwotICAgICAgICB9IGVsc2UgaWYgKHRyYWl0ICYga0NURm9udEl0YWxpY1RyYWl0KSB7Ci0gICAgICAgICAgICBiYXNlZm9udCArPSAiLEl0YWxpYyI7Ci0gICAgICAgIH0KLSAgICAgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIlN1YnR5cGUiLCAiVHJ1ZVR5cGUiKTsKLSAgICAgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIkJhc2VGb250IiwgYmFzZWZvbnQpOwotICAgICAgICBwQmFzZURpY3QtPlNldEF0TnVtYmVyKCJGaXJzdENoYXIiLCAzMik7Ci0gICAgICAgIHBCYXNlRGljdC0+U2V0QXROdW1iZXIoIkxhc3RDaGFyIiwgMjU1KTsKLSAgICAgICAgaW50IGNoYXJfd2lkdGhzWzIyNF07Ci0gICAgICAgIEZYX0dldENoYXJXaWR0aChmb250LCAzMiwgMjU1LCBjaGFyX3dpZHRocyk7Ci0gICAgICAgIENQREZfQXJyYXkqIHBXaWR0aHMgPSBuZXcgQ1BERl9BcnJheTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMjQ7IGkgKyspIHsKLSAgICAgICAgICAgIHBXaWR0aHMtPkFkZEludGVnZXIoY2hhcl93aWR0aHNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIHBCYXNlRGljdC0+U2V0QXQoIldpZHRocyIsIHBXaWR0aHMpOwotICAgIH0gIGVsc2UgewotICAgICAgICBmbGFncyB8PSBQREZGT05UX05PTlNZTUJPTElDOwotICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBOVUxMOwotICAgICAgICBwRm9udERpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgICAgICBDRlhfQnl0ZVN0cmluZyBjbWFwOwotICAgICAgICBDRlhfQnl0ZVN0cmluZyBvcmRlcmluZzsKLSAgICAgICAgaW50IHN1cHBsZW1lbnQ7Ci0gICAgICAgIEZYX0JPT0wgYkZvdW5kID0gRkFMU0U7Ci0gICAgICAgIENQREZfQXJyYXkqIHBXaWR0aEFycmF5ID0gbmV3IENQREZfQXJyYXk7Ci0gICAgICAgIGNoYXJTZXRzLlJlbW92ZUFsbCgpOwotICAgICAgICBjaGFyU2V0cy5BZGQoRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQpOwotICAgICAgICBpZiAoSXNIYXNDaGFyU2V0KGxhbmd1YWdlcywgY2hhclNldHMpKSB7Ci0gICAgICAgICAgICBjbWFwID0gYlZlcnQgPyAiRVRlbm1zLUI1LVYiIDogIkVUZW5tcy1CNS1IIjsKLSAgICAgICAgICAgIG9yZGVyaW5nID0gIkNOUzEiOwotICAgICAgICAgICAgc3VwcGxlbWVudCA9IDQ7Ci0gICAgICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigxKTsKLSAgICAgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGZvbnQsIDB4MjAsIDB4N2UsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgICAgIGJGb3VuZCA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgY2hhclNldHMuUmVtb3ZlQWxsKCk7Ci0gICAgICAgIGNoYXJTZXRzLkFkZChGWEZPTlRfR0IyMzEyX0NIQVJTRVQpOwotICAgICAgICBpZiAoIWJGb3VuZCAmJiBJc0hhc0NoYXJTZXQobGFuZ3VhZ2VzLCBjaGFyU2V0cykpIHsKLSAgICAgICAgICAgIGNtYXAgPSBiVmVydCA/ICJHQkstRVVDLVYiIDogIkdCSy1FVUMtSCI7Ci0gICAgICAgICAgICBvcmRlcmluZyA9ICJHQjEiLCBzdXBwbGVtZW50ID0gMjsKLSAgICAgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDc3MTYpOwotICAgICAgICAgICAgX0luc2VydFdpZHRoQXJyYXkoZm9udCwgMHgyMCwgMHgyMCwgcFdpZHRoQXJyYXkpOwotICAgICAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoODE0KTsKLSAgICAgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGZvbnQsIDB4MjEsIDB4N2UsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgICAgIGJGb3VuZCA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgY2hhclNldHMuUmVtb3ZlQWxsKCk7Ci0gICAgICAgIGNoYXJTZXRzLkFkZChGWEZPTlRfSEFOR0VVTF9DSEFSU0VUKTsKLSAgICAgICAgaWYgKCFiRm91bmQgJiYgSXNIYXNDaGFyU2V0KGxhbmd1YWdlcywgY2hhclNldHMpKSB7Ci0gICAgICAgICAgICBjbWFwID0gYlZlcnQgPyAiS1NDbXMtVUhDLVYiIDogIktTQ21zLVVIQy1IIjsKLSAgICAgICAgICAgIG9yZGVyaW5nID0gIktvcmVhMSI7Ci0gICAgICAgICAgICBzdXBwbGVtZW50ID0gMjsKLSAgICAgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDEpOwotICAgICAgICAgICAgX0luc2VydFdpZHRoQXJyYXkoZm9udCwgMHgyMCwgMHg3ZSwgcFdpZHRoQXJyYXkpOwotICAgICAgICAgICAgYkZvdW5kID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBjaGFyU2V0cy5SZW1vdmVBbGwoKTsKLSAgICAgICAgY2hhclNldHMuQWRkKEZYRk9OVF9TSElGVEpJU19DSEFSU0VUKTsKLSAgICAgICAgaWYgKCFiRm91bmQgJiYgSXNIYXNDaGFyU2V0KGxhbmd1YWdlcywgY2hhclNldHMpKSB7Ci0gICAgICAgICAgICBjbWFwID0gYlZlcnQgPyAiOTBtcy1SS1NKLVYiIDogIjkwbXMtUktTSi1IIjsKLSAgICAgICAgICAgIG9yZGVyaW5nID0gIkphcGFuMSI7Ci0gICAgICAgICAgICBzdXBwbGVtZW50ID0gNTsKLSAgICAgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDIzMSk7Ci0gICAgICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheShmb250LCAweDIwLCAweDdkLCBwV2lkdGhBcnJheSk7Ci0gICAgICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigzMjYpOwotICAgICAgICAgICAgX0luc2VydFdpZHRoQXJyYXkoZm9udCwgMHhhMCwgMHhhMCwgcFdpZHRoQXJyYXkpOwotICAgICAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoMzI3KTsKLSAgICAgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGZvbnQsIDB4YTEsIDB4ZGYsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDYzMSk7Ci0gICAgICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheShmb250LCAweDdlLCAweDdlLCBwV2lkdGhBcnJheSk7Ci0gICAgICAgIH0KLSAgICAgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIlN1YnR5cGUiLCAiVHlwZTAiKTsKLSAgICAgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIkJhc2VGb250IiwgYmFzZWZvbnQpOwotICAgICAgICBwQmFzZURpY3QtPlNldEF0TmFtZSgiRW5jb2RpbmciLCBjbWFwKTsKLSAgICAgICAgcEZvbnREaWN0LT5TZXRBdCgiVyIsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgcEZvbnREaWN0LT5TZXRBdE5hbWUoIlR5cGUiLCAiRm9udCIpOwotICAgICAgICBwRm9udERpY3QtPlNldEF0TmFtZSgiU3VidHlwZSIsICJDSURGb250VHlwZTIiKTsKLSAgICAgICAgcEZvbnREaWN0LT5TZXRBdE5hbWUoIkJhc2VGb250IiwgYmFzZWZvbnQpOwotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBDSURTeXNJbmZvID0gbmV3IENQREZfRGljdGlvbmFyeTsKLSAgICAgICAgcENJRFN5c0luZm8tPlNldEF0U3RyaW5nKCJSZWdpc3RyeSIsICJBZG9iZSIpOwotICAgICAgICBwQ0lEU3lzSW5mby0+U2V0QXRTdHJpbmcoIk9yZGVyaW5nIiwgb3JkZXJpbmcpOwotICAgICAgICBwQ0lEU3lzSW5mby0+U2V0QXRJbnRlZ2VyKCJTdXBwbGVtZW50Iiwgc3VwcGxlbWVudCk7Ci0gICAgICAgIHBGb250RGljdC0+U2V0QXQoIkNJRFN5c3RlbUluZm8iLCBwQ0lEU3lzSW5mbyk7Ci0gICAgICAgIHBBcnJheSA9IG5ldyBDUERGX0FycmF5OwotICAgICAgICBwQmFzZURpY3QtPlNldEF0KCJEZXNjZW5kYW50Rm9udHMiLCBwQXJyYXkpOwotICAgICAgICBBZGRJbmRpcmVjdE9iamVjdChwRm9udERpY3QpOwotICAgICAgICBwQXJyYXktPkFkZFJlZmVyZW5jZSh0aGlzLCBwRm9udERpY3QpOwotICAgIH0KLSAgICBBZGRJbmRpcmVjdE9iamVjdChwQmFzZURpY3QpOwotICAgIENQREZfRGljdGlvbmFyeSogcEZvbnREZXNjID0gbmV3IENQREZfRGljdGlvbmFyeTsKLSAgICBwRm9udERlc2MtPlNldEF0TmFtZSgiVHlwZSIsICJGb250RGVzY3JpcHRvciIpOwotICAgIHBGb250RGVzYy0+U2V0QXROYW1lKCJGb250TmFtZSIsIGJhc2Vmb250KTsKLSAgICBwRm9udERlc2MtPlNldEF0SW50ZWdlcigiRmxhZ3MiLCBmbGFncyk7Ci0gICAgQ1BERl9BcnJheSogcEJCb3ggPSBuZXcgQ1BERl9BcnJheTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkgKyspIHsKLSAgICAgICAgcEJCb3gtPkFkZEludGVnZXIoYmJveFtpXSk7Ci0gICAgfQotICAgIHBGb250RGVzYy0+U2V0QXQoIkZvbnRCQm94IiwgcEJCb3gpOwotICAgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJJdGFsaWNBbmdsZSIsIGl0YWxpY2FuZ2xlKTsKLSAgICBwRm9udERlc2MtPlNldEF0SW50ZWdlcigiQXNjZW50IiwgYXNjZW5kKTsKLSAgICBwRm9udERlc2MtPlNldEF0SW50ZWdlcigiRGVzY2VudCIsIGRlc2NlbmQpOwotICAgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJDYXBIZWlnaHQiLCBjYXBoZWlnaHQpOwotICAgIENHRmxvYXQgZlN0ZW1WID0gMDsKLSAgICBpbnQxNl90IG1pbl93aWR0aCA9IFNIUlRfTUFYOwotICAgIHN0YXRpYyBjb25zdCBVbmlDaGFyIHN0ZW1fY2hhcnNbXSA9IHsnaScsICdJJywgJyEnLCAnMSd9OwotICAgIGNvbnN0IHNpemVfdCBjb3VudCA9IHNpemVvZihzdGVtX2NoYXJzKSAvIHNpemVvZihzdGVtX2NoYXJzWzBdKTsKLSAgICBDR0dseXBoIGdseXBoc1tjb3VudF07Ci0gICAgQ0dSZWN0IGJvdW5kaW5nUmVjdHNbY291bnRdOwotICAgIGlmIChDVEZvbnRHZXRHbHlwaHNGb3JDaGFyYWN0ZXJzKGZvbnQsIHN0ZW1fY2hhcnMsIGdseXBocywgY291bnQpKSB7Ci0gICAgICAgIENURm9udEdldEJvdW5kaW5nUmVjdHNGb3JHbHlwaHMoZm9udCwga0NURm9udEhvcml6b250YWxPcmllbnRhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHMsIGJvdW5kaW5nUmVjdHMsIGNvdW50KTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQxNl90IHdpZHRoID0gYm91bmRpbmdSZWN0c1tpXS5zaXplLndpZHRoOwotICAgICAgICAgICAgaWYgKHdpZHRoID4gMCAmJiB3aWR0aCA8IG1pbl93aWR0aCkgewotICAgICAgICAgICAgICAgIG1pbl93aWR0aCA9IHdpZHRoOwotICAgICAgICAgICAgICAgIGZTdGVtViA9IG1pbl93aWR0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBwRm9udERlc2MtPlNldEF0SW50ZWdlcigiU3RlbVYiLCBmU3RlbVYpOwotICAgIEFkZEluZGlyZWN0T2JqZWN0KHBGb250RGVzYyk7Ci0gICAgcEZvbnREaWN0LT5TZXRBdFJlZmVyZW5jZSgiRm9udERlc2NyaXB0b3IiLCB0aGlzLCBwRm9udERlc2MpOwotICAgIENGUmVsZWFzZSh0cmFpdHMpOworICAgIHJldHVybiBOVUxMOworICB9CisgIENGWF9EV29yZEFycmF5IGNoYXJTZXRzOworICBjaGFyU2V0cy5BZGQoRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQpOworICBjaGFyU2V0cy5BZGQoRlhGT05UX0dCMjMxMl9DSEFSU0VUKTsKKyAgY2hhclNldHMuQWRkKEZYRk9OVF9IQU5HRVVMX0NIQVJTRVQpOworICBjaGFyU2V0cy5BZGQoRlhGT05UX1NISUZUSklTX0NIQVJTRVQpOworICBpZiAoSXNIYXNDaGFyU2V0KGxhbmd1YWdlcywgY2hhclNldHMpKSB7CisgICAgYkNKSyA9IFRSVUU7CisgIH0KKyAgQ0ZSZWxlYXNlKGRlc2NyaXB0b3IpOworICBDRkRpY3Rpb25hcnlSZWYgdHJhaXRzID0gKENGRGljdGlvbmFyeVJlZilDVEZvbnRDb3B5VHJhaXRzKGZvbnQpOworICBpZiAoIXRyYWl0cykgewogICAgIENGUmVsZWFzZShsYW5ndWFnZXMpOwotICAgIHJldHVybiBMb2FkRm9udChwQmFzZURpY3QpOwotfQotI2VuZGlmCi1zdGF0aWMgdm9pZCBfSW5zZXJ0V2lkdGhBcnJheTEoQ0ZYX0ZvbnQqIHBGb250LCBJRlhfRm9udEVuY29kaW5nKiBwRW5jb2RpbmcsIEZYX1dDSEFSIHN0YXJ0LCBGWF9XQ0hBUiBlbmQsIENQREZfQXJyYXkqIHBXaWR0aEFycmF5KQotewotICAgIGludCBzaXplID0gZW5kIC0gc3RhcnQgKyAxOwotICAgIGludCogd2lkdGhzID0gRlhfQWxsb2MoaW50LCBzaXplKTsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArKykgewotICAgICAgICBpbnQgZ2x5cGhfaW5kZXggPSBwRW5jb2RpbmctPkdseXBoRnJvbUNoYXJDb2RlKHN0YXJ0ICsgaSk7Ci0gICAgICAgIHdpZHRoc1tpXSA9IHBGb250LT5HZXRHbHlwaFdpZHRoKGdseXBoX2luZGV4KTsKLSAgICB9Ci0gICAgZm9yIChpID0gMTsgaSA8IHNpemU7IGkgKyspCi0gICAgICAgIGlmICh3aWR0aHNbaV0gIT0gKndpZHRocykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICBpZiAoaSA9PSBzaXplKSB7Ci0gICAgICAgIGludCBmaXJzdCA9IHBXaWR0aEFycmF5LT5HZXRJbnRlZ2VyKHBXaWR0aEFycmF5LT5HZXRDb3VudCgpIC0gMSk7Ci0gICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKGZpcnN0ICsgc2l6ZSAtIDEpOwotICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigqd2lkdGhzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBDUERGX0FycmF5KiBwV2lkdGhBcnJheTEgPSBuZXcgQ1BERl9BcnJheTsKLSAgICAgICAgcFdpZHRoQXJyYXktPkFkZChwV2lkdGhBcnJheTEpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArKykgewotICAgICAgICAgICAgcFdpZHRoQXJyYXkxLT5BZGRJbnRlZ2VyKHdpZHRoc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlhfRnJlZSh3aWR0aHMpOwotfQotQ1BERl9Gb250KiBDUERGX0RvY3VtZW50OjpBZGRGb250KENGWF9Gb250KiBwRm9udCwgaW50IGNoYXJzZXQsIEZYX0JPT0wgYlZlcnQpCi17Ci0gICAgaWYgKHBGb250ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYX0JPT0wgYkNKSyA9IGNoYXJzZXQgPT0gRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQgfHwgY2hhcnNldCA9PSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQgfHwKLSAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID09IEZYRk9OVF9IQU5HRVVMX0NIQVJTRVQgfHwgY2hhcnNldCA9PSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVDsKLSAgICBDRlhfQnl0ZVN0cmluZyBiYXNlZm9udCA9IHBGb250LT5HZXRGYW1pbHlOYW1lKCk7Ci0gICAgYmFzZWZvbnQuUmVwbGFjZSgiICIsICIiKTsKLSAgICBpbnQgZmxhZ3MgPSAwOwotICAgIGlmIChwRm9udC0+SXNCb2xkKCkpIHsKLSAgICAgICAgZmxhZ3MgfD0gUERGRk9OVF9GT1JDRUJPTEQ7Ci0gICAgfQotICAgIGlmIChwRm9udC0+SXNJdGFsaWMoKSkgewotICAgICAgICBmbGFncyB8PSBQREZGT05UX0lUQUxJQzsKLSAgICB9Ci0gICAgaWYgKHBGb250LT5Jc0ZpeGVkV2lkdGgoKSkgewotICAgICAgICBmbGFncyB8PSBQREZGT05UX0ZJWEVEUElUQ0g7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcEJhc2VEaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKLSAgICBwQmFzZURpY3QtPlNldEF0TmFtZSgiVHlwZSIsICJGb250Iik7Ci0gICAgSUZYX0ZvbnRFbmNvZGluZyogcEVuY29kaW5nID0gRlhHRV9DcmVhdGVVbmljb2RlRW5jb2RpbmcocEZvbnQpOwotICAgIENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0ID0gcEJhc2VEaWN0OwotICAgIGlmICghYkNKSykgewotICAgICAgICBDUERGX0FycmF5KiBwV2lkdGhzID0gbmV3IENQREZfQXJyYXk7Ci0gICAgICAgIGludCBjaGFyY29kZTsKLSAgICAgICAgZm9yIChjaGFyY29kZSA9IDMyOyBjaGFyY29kZSA8IDEyODsgY2hhcmNvZGUgKyspIHsKLSAgICAgICAgICAgIGludCBnbHlwaF9pbmRleCA9IHBFbmNvZGluZy0+R2x5cGhGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOwotICAgICAgICAgICAgaW50IGNoYXJfd2lkdGggPSBwRm9udC0+R2V0R2x5cGhXaWR0aChnbHlwaF9pbmRleCk7Ci0gICAgICAgICAgICBwV2lkdGhzLT5BZGRJbnRlZ2VyKGNoYXJfd2lkdGgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjaGFyc2V0ID09IEZYRk9OVF9BTlNJX0NIQVJTRVQgfHwgY2hhcnNldCA9PSBGWEZPTlRfREVGQVVMVF9DSEFSU0VUIHx8Ci0gICAgICAgICAgICAgICAgY2hhcnNldCA9PSBGWEZPTlRfU1lNQk9MX0NIQVJTRVQpIHsKLSAgICAgICAgICAgIGlmIChjaGFyc2V0ID09IEZYRk9OVF9TWU1CT0xfQ0hBUlNFVCkgewotICAgICAgICAgICAgICAgIGZsYWdzIHw9IFBERkZPTlRfU1lNQk9MSUM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZsYWdzIHw9IFBERkZPTlRfTk9OU1lNQk9MSUM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQmFzZURpY3QtPlNldEF0TmFtZShGWF9CU1RSQygiRW5jb2RpbmciKSwgIldpbkFuc2lFbmNvZGluZyIpOwotICAgICAgICAgICAgZm9yIChjaGFyY29kZSA9IDEyODsgY2hhcmNvZGUgPD0gMjU1OyBjaGFyY29kZSArKykgewotICAgICAgICAgICAgICAgIGludCBnbHlwaF9pbmRleCA9IHBFbmNvZGluZy0+R2x5cGhGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOwotICAgICAgICAgICAgICAgIGludCBjaGFyX3dpZHRoID0gcEZvbnQtPkdldEdseXBoV2lkdGgoZ2x5cGhfaW5kZXgpOwotICAgICAgICAgICAgICAgIHBXaWR0aHMtPkFkZEludGVnZXIoY2hhcl93aWR0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmbGFncyB8PSBQREZGT05UX05PTlNZTUJPTElDOwotICAgICAgICAgICAgc2l6ZV90IGk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIGdfRlhfQ2hhcnNldFVuaWNvZGVzIC8gc2l6ZW9mKEZYX0NoYXJzZXRVbmljb2Rlcyk7IGkgKyspCi0gICAgICAgICAgICAgICAgaWYgKGdfRlhfQ2hhcnNldFVuaWNvZGVzW2ldLm1fQ2hhcnNldCA9PSBjaGFyc2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpIDwgc2l6ZW9mIGdfRlhfQ2hhcnNldFVuaWNvZGVzIC8gc2l6ZW9mKEZYX0NoYXJzZXRVbmljb2RlcykpIHsKLSAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBFbmNvZGluZ0RpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgICAgICAgICAgICAgIHBFbmNvZGluZ0RpY3QtPlNldEF0TmFtZShGWF9CU1RSQygiQmFzZUVuY29kaW5nIiksICJXaW5BbnNpRW5jb2RpbmciKTsKLSAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBuZXcgQ1BERl9BcnJheTsKLSAgICAgICAgICAgICAgICBwQXJyYXktPkFkZEludGVnZXIoMTI4KTsKLSAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcFVuaWNvZGVzID0gZ19GWF9DaGFyc2V0VW5pY29kZXNbaV0ubV9wVW5pY29kZXM7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMjg7IGogKyspIHsKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9IFBERl9BZG9iZU5hbWVGcm9tVW5pY29kZShwVW5pY29kZXNbal0pOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBcnJheS0+QWRkTmFtZShGWF9CU1RSQygiLm5vdGRlZiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBcnJheS0+QWRkTmFtZShuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbnQgZ2x5cGhfaW5kZXggPSBwRW5jb2RpbmctPkdseXBoRnJvbUNoYXJDb2RlKHBVbmljb2Rlc1tqXSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjaGFyX3dpZHRoID0gcEZvbnQtPkdldEdseXBoV2lkdGgoZ2x5cGhfaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBwV2lkdGhzLT5BZGRJbnRlZ2VyKGNoYXJfd2lkdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwRW5jb2RpbmdEaWN0LT5TZXRBdChGWF9CU1RSQygiRGlmZmVyZW5jZXMiKSwgcEFycmF5KTsKLSAgICAgICAgICAgICAgICBBZGRJbmRpcmVjdE9iamVjdChwRW5jb2RpbmdEaWN0KTsKLSAgICAgICAgICAgICAgICBwQmFzZURpY3QtPlNldEF0UmVmZXJlbmNlKEZYX0JTVFJDKCJFbmNvZGluZyIpLCB0aGlzLCBwRW5jb2RpbmdEaWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocEZvbnQtPklzQm9sZCgpICYmIHBGb250LT5Jc0l0YWxpYygpKSB7Ci0gICAgICAgICAgICBiYXNlZm9udCArPSAiLEJvbGRJdGFsaWMiOwotICAgICAgICB9IGVsc2UgaWYgKHBGb250LT5Jc0JvbGQoKSkgewotICAgICAgICAgICAgYmFzZWZvbnQgKz0gIixCb2xkIjsKLSAgICAgICAgfSBlbHNlIGlmIChwRm9udC0+SXNJdGFsaWMoKSkgewotICAgICAgICAgICAgYmFzZWZvbnQgKz0gIixJdGFsaWMiOwotICAgICAgICB9Ci0gICAgICAgIHBCYXNlRGljdC0+U2V0QXROYW1lKCJTdWJ0eXBlIiwgIlRydWVUeXBlIik7Ci0gICAgICAgIHBCYXNlRGljdC0+U2V0QXROYW1lKCJCYXNlRm9udCIsIGJhc2Vmb250KTsKLSAgICAgICAgcEJhc2VEaWN0LT5TZXRBdE51bWJlcigiRmlyc3RDaGFyIiwgMzIpOwotICAgICAgICBwQmFzZURpY3QtPlNldEF0TnVtYmVyKCJMYXN0Q2hhciIsIDI1NSk7Ci0gICAgICAgIHBCYXNlRGljdC0+U2V0QXQoIldpZHRocyIsIHBXaWR0aHMpOwotICAgIH0gZWxzZSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ0ZOdW1iZXJSZWYgc3lib2xpY1RyYWl0ID0KKyAgICAgIChDRk51bWJlclJlZilDRkRpY3Rpb25hcnlHZXRWYWx1ZSh0cmFpdHMsIGtDVEZvbnRTeW1ib2xpY1RyYWl0KTsKKyAgQ1RGb250U3ltYm9saWNUcmFpdHMgdHJhaXQgPSAwOworICBDRk51bWJlckdldFZhbHVlKHN5Ym9saWNUcmFpdCwga0NGTnVtYmVyU0ludDMyVHlwZSwgJnRyYWl0KTsKKyAgaWYgKHRyYWl0ICYga0NURm9udEl0YWxpY1RyYWl0KSB7CisgICAgZmxhZ3MgfD0gUERGRk9OVF9JVEFMSUM7CisgIH0KKyAgaWYgKHRyYWl0ICYga0NURm9udE1vbm9TcGFjZVRyYWl0KSB7CisgICAgZmxhZ3MgfD0gUERGRk9OVF9GSVhFRFBJVENIOworICB9CisgIGlmICh0cmFpdCAmIGtDVEZvbnRNb2Rlcm5TZXJpZnNDbGFzcykgeworICAgIGZsYWdzIHw9IFBERkZPTlRfU0VSSUY7CisgIH0KKyAgaWYgKHRyYWl0ICYga0NURm9udFNjcmlwdHNDbGFzcykgeworICAgIGZsYWdzIHw9IFBERkZPTlRfU0NSSVBUOworICB9CisgIENGTnVtYmVyUmVmIHdlaWdodFRyYWl0ID0KKyAgICAgIChDRk51bWJlclJlZilDRkRpY3Rpb25hcnlHZXRWYWx1ZSh0cmFpdHMsIGtDVEZvbnRXZWlnaHRUcmFpdCk7CisgIEZsb2F0MzIgd2VpZ2h0ID0gMDsKKyAgQ0ZOdW1iZXJHZXRWYWx1ZSh3ZWlnaHRUcmFpdCwga0NGTnVtYmVyRmxvYXQzMlR5cGUsICZ3ZWlnaHQpOworICBpdGFsaWNhbmdsZSA9IENURm9udEdldFNsYW50QW5nbGUoZm9udCk7CisgIGFzY2VuZCA9IENURm9udEdldEFzY2VudChmb250KTsKKyAgZGVzY2VuZCA9IENURm9udEdldERlc2NlbnQoZm9udCk7CisgIGNhcGhlaWdodCA9IENURm9udEdldENhcEhlaWdodChmb250KTsKKyAgQ0dSZWN0IGJveCA9IENURm9udEdldEJvdW5kaW5nQm94KGZvbnQpOworICBiYm94WzBdID0gYm94Lm9yaWdpbi54OworICBiYm94WzFdID0gYm94Lm9yaWdpbi55OworICBiYm94WzJdID0gYm94Lm9yaWdpbi54ICsgYm94LnNpemUud2lkdGg7CisgIGJib3hbM10gPSBib3gub3JpZ2luLnkgKyBib3guc2l6ZS5oZWlnaHQ7CisgIGlmIChiVHJhbnNsYXRlTmFtZSAmJiBiQ0pLKSB7CisgICAgQ0ZTdHJpbmdSZWYgcG9zdE5hbWUgPSBDVEZvbnRDb3B5UG9zdFNjcmlwdE5hbWUoZm9udCk7CisgICAgX0NGU3RyaW5nMkNGWEJ5dGVTdHJpbmcocG9zdE5hbWUsIGJhc2Vmb250KTsKKyAgICBDRlJlbGVhc2UocG9zdE5hbWUpOworICB9CisgIGlmIChiYXNlZm9udC5Jc0VtcHR5KCkpIHsKKyAgICBDRlN0cmluZ1JlZiBmdWxsTmFtZSA9IENURm9udENvcHlGdWxsTmFtZShmb250KTsKKyAgICBfQ0ZTdHJpbmcyQ0ZYQnl0ZVN0cmluZyhmdWxsTmFtZSwgYmFzZWZvbnQpOworICAgIENGUmVsZWFzZShmdWxsTmFtZSk7CisgIH0KKyAgYmFzZWZvbnQuUmVwbGFjZSgiICIsICIiKTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQmFzZURpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCA9IHBCYXNlRGljdDsKKyAgaWYgKCFiQ0pLKSB7CisgICAgY2hhclNldHMuUmVtb3ZlQWxsKCk7CisgICAgY2hhclNldHMuQWRkKEZYRk9OVF9BTlNJX0NIQVJTRVQpOworICAgIGNoYXJTZXRzLkFkZChGWEZPTlRfREVGQVVMVF9DSEFSU0VUKTsKKyAgICBjaGFyU2V0cy5BZGQoRlhGT05UX1NZTUJPTF9DSEFSU0VUKTsKKyAgICBpZiAoSXNIYXNDaGFyU2V0KGxhbmd1YWdlcywgY2hhclNldHMpKSB7CisgICAgICBjaGFyU2V0cy5SZW1vdmVBbGwoKTsKKyAgICAgIGNoYXJTZXRzLkFkZChGWEZPTlRfU1lNQk9MX0NIQVJTRVQpOworICAgICAgaWYgKElzSGFzQ2hhclNldChsYW5ndWFnZXMsIGNoYXJTZXRzKSkgeworICAgICAgICBmbGFncyB8PSBQREZGT05UX1NZTUJPTElDOworICAgICAgfSBlbHNlIHsKICAgICAgICAgZmxhZ3MgfD0gUERGRk9OVF9OT05TWU1CT0xJQzsKLSAgICAgICAgcEZvbnREaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY21hcDsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgb3JkZXJpbmc7Ci0gICAgICAgIGludCBzdXBwbGVtZW50OwotICAgICAgICBDUERGX0FycmF5KiBwV2lkdGhBcnJheSA9IG5ldyBDUERGX0FycmF5OwotICAgICAgICBzd2l0Y2ggKGNoYXJzZXQpIHsKLSAgICAgICAgICAgIGNhc2UgRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQ6Ci0gICAgICAgICAgICAgICAgY21hcCA9IGJWZXJ0ID8gIkVUZW5tcy1CNS1WIiA6ICJFVGVubXMtQjUtSCI7Ci0gICAgICAgICAgICAgICAgb3JkZXJpbmcgPSAiQ05TMSI7Ci0gICAgICAgICAgICAgICAgc3VwcGxlbWVudCA9IDQ7Ci0gICAgICAgICAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoMSk7Ci0gICAgICAgICAgICAgICAgX0luc2VydFdpZHRoQXJyYXkxKHBGb250LCBwRW5jb2RpbmcsIDB4MjAsIDB4N2UsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRlhGT05UX0dCMjMxMl9DSEFSU0VUOgotICAgICAgICAgICAgICAgIGNtYXAgPSBiVmVydCA/ICJHQkstRVVDLVYiIDogIkdCSy1FVUMtSCI7Ci0gICAgICAgICAgICAgICAgb3JkZXJpbmcgPSAiR0IxIiwgc3VwcGxlbWVudCA9IDI7Ci0gICAgICAgICAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoNzcxNik7Ci0gICAgICAgICAgICAgICAgX0luc2VydFdpZHRoQXJyYXkxKHBGb250LCBwRW5jb2RpbmcsIDB4MjAsIDB4MjAsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcig4MTQpOwotICAgICAgICAgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5MShwRm9udCwgcEVuY29kaW5nLCAweDIxLCAweDdlLCBwV2lkdGhBcnJheSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZYRk9OVF9IQU5HRVVMX0NIQVJTRVQ6Ci0gICAgICAgICAgICAgICAgY21hcCA9IGJWZXJ0ID8gIktTQ21zLVVIQy1WIiA6ICJLU0Ntcy1VSEMtSCI7Ci0gICAgICAgICAgICAgICAgb3JkZXJpbmcgPSAiS29yZWExIjsKLSAgICAgICAgICAgICAgICBzdXBwbGVtZW50ID0gMjsKLSAgICAgICAgICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigxKTsKLSAgICAgICAgICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheTEocEZvbnQsIHBFbmNvZGluZywgMHgyMCwgMHg3ZSwgcFdpZHRoQXJyYXkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVDoKLSAgICAgICAgICAgICAgICBjbWFwID0gYlZlcnQgPyAiOTBtcy1SS1NKLVYiIDogIjkwbXMtUktTSi1IIjsKLSAgICAgICAgICAgICAgICBvcmRlcmluZyA9ICJKYXBhbjEiOwotICAgICAgICAgICAgICAgIHN1cHBsZW1lbnQgPSA1OwotICAgICAgICAgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDIzMSk7Ci0gICAgICAgICAgICAgICAgX0luc2VydFdpZHRoQXJyYXkxKHBGb250LCBwRW5jb2RpbmcsIDB4MjAsIDB4N2QsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgICAgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigzMjYpOwotICAgICAgICAgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5MShwRm9udCwgcEVuY29kaW5nLCAweGEwLCAweGEwLCBwV2lkdGhBcnJheSk7Ci0gICAgICAgICAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoMzI3KTsKLSAgICAgICAgICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheTEocEZvbnQsIHBFbmNvZGluZywgMHhhMSwgMHhkZiwgcFdpZHRoQXJyYXkpOwotICAgICAgICAgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDYzMSk7Ci0gICAgICAgICAgICAgICAgX0luc2VydFdpZHRoQXJyYXkxKHBGb250LCBwRW5jb2RpbmcsIDB4N2UsIDB4N2UsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHBCYXNlRGljdC0+U2V0QXROYW1lKCJFbmNvZGluZyIsICJXaW5BbnNpRW5jb2RpbmciKTsKKyAgICB9IGVsc2UgeworICAgICAgZmxhZ3MgfD0gUERGRk9OVF9OT05TWU1CT0xJQzsKKyAgICAgIHNpemVfdCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiBnX0ZYX0NoYXJzZXRVbmljb2RlcyAvIHNpemVvZihGWF9DaGFyc2V0VW5pY29kZXMpOworICAgICAgICAgICBpKyspIHsKKyAgICAgICAgY2hhclNldHMuUmVtb3ZlQWxsKCk7CisgICAgICAgIGNoYXJTZXRzLkFkZChnX0ZYX0NoYXJzZXRVbmljb2Rlc1tpXS5tX0NoYXJzZXQpOworICAgICAgICBpZiAoSXNIYXNDaGFyU2V0KGxhbmd1YWdlcywgY2hhclNldHMpKSB7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIlN1YnR5cGUiLCAiVHlwZTAiKTsKLSAgICAgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIkJhc2VGb250IiwgYmFzZWZvbnQpOwotICAgICAgICBwQmFzZURpY3QtPlNldEF0TmFtZSgiRW5jb2RpbmciLCBjbWFwKTsKLSAgICAgICAgcEZvbnREaWN0LT5TZXRBdCgiVyIsIHBXaWR0aEFycmF5KTsKLSAgICAgICAgcEZvbnREaWN0LT5TZXRBdE5hbWUoIlR5cGUiLCAiRm9udCIpOwotICAgICAgICBwRm9udERpY3QtPlNldEF0TmFtZSgiU3VidHlwZSIsICJDSURGb250VHlwZTIiKTsKLSAgICAgICAgcEZvbnREaWN0LT5TZXRBdE5hbWUoIkJhc2VGb250IiwgYmFzZWZvbnQpOwotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBDSURTeXNJbmZvID0gbmV3IENQREZfRGljdGlvbmFyeTsKLSAgICAgICAgcENJRFN5c0luZm8tPlNldEF0U3RyaW5nKCJSZWdpc3RyeSIsICJBZG9iZSIpOwotICAgICAgICBwQ0lEU3lzSW5mby0+U2V0QXRTdHJpbmcoIk9yZGVyaW5nIiwgb3JkZXJpbmcpOwotICAgICAgICBwQ0lEU3lzSW5mby0+U2V0QXRJbnRlZ2VyKCJTdXBwbGVtZW50Iiwgc3VwcGxlbWVudCk7Ci0gICAgICAgIHBGb250RGljdC0+U2V0QXQoIkNJRFN5c3RlbUluZm8iLCBwQ0lEU3lzSW5mbyk7CisgICAgICB9CisgICAgICBpZiAoaSA8IHNpemVvZiBnX0ZYX0NoYXJzZXRVbmljb2RlcyAvIHNpemVvZihGWF9DaGFyc2V0VW5pY29kZXMpKSB7CisgICAgICAgIENQREZfRGljdGlvbmFyeSogcEVuY29kaW5nID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgICAgICAgcEVuY29kaW5nLT5TZXRBdE5hbWUoIkJhc2VFbmNvZGluZyIsICJXaW5BbnNpRW5jb2RpbmciKTsKICAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gbmV3IENQREZfQXJyYXk7Ci0gICAgICAgIHBCYXNlRGljdC0+U2V0QXQoIkRlc2NlbmRhbnRGb250cyIsIHBBcnJheSk7Ci0gICAgICAgIEFkZEluZGlyZWN0T2JqZWN0KHBGb250RGljdCk7Ci0gICAgICAgIHBBcnJheS0+QWRkUmVmZXJlbmNlKHRoaXMsIHBGb250RGljdCk7Ci0gICAgfQotICAgIEFkZEluZGlyZWN0T2JqZWN0KHBCYXNlRGljdCk7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERlc2MgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgIHBGb250RGVzYy0+U2V0QXROYW1lKCJUeXBlIiwgIkZvbnREZXNjcmlwdG9yIik7Ci0gICAgcEZvbnREZXNjLT5TZXRBdE5hbWUoIkZvbnROYW1lIiwgYmFzZWZvbnQpOwotICAgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJGbGFncyIsIGZsYWdzKTsKLSAgICBwRm9udERlc2MtPlNldEF0SW50ZWdlcigiSXRhbGljQW5nbGUiLCBwRm9udC0+bV9wU3Vic3RGb250ID8gcEZvbnQtPm1fcFN1YnN0Rm9udC0+bV9JdGFsaWNBbmdsZSA6IDApOwotICAgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJBc2NlbnQiLCBwRm9udC0+R2V0QXNjZW50KCkpOwotICAgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJEZXNjZW50IiwgcEZvbnQtPkdldERlc2NlbnQoKSk7Ci0gICAgRlhfUkVDVCBiYm94OwotICAgIHBGb250LT5HZXRCQm94KGJib3gpOwotICAgIENQREZfQXJyYXkqIHBCQm94ID0gbmV3IENQREZfQXJyYXk7Ci0gICAgcEJCb3gtPkFkZEludGVnZXIoYmJveC5sZWZ0KTsKLSAgICBwQkJveC0+QWRkSW50ZWdlcihiYm94LmJvdHRvbSk7Ci0gICAgcEJCb3gtPkFkZEludGVnZXIoYmJveC5yaWdodCk7Ci0gICAgcEJCb3gtPkFkZEludGVnZXIoYmJveC50b3ApOwotICAgIHBGb250RGVzYy0+U2V0QXQoIkZvbnRCQm94IiwgcEJCb3gpOwotICAgIEZYX0lOVDMyIG5TdGVtViA9IDA7Ci0gICAgaWYgKHBGb250LT5tX3BTdWJzdEZvbnQpIHsKLSAgICAgICAgblN0ZW1WID0gcEZvbnQtPm1fcFN1YnN0Rm9udC0+bV9XZWlnaHQgLyA1OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBGWF9DSEFSIHN0ZW1fY2hhcnNbXSA9IHsnaScsICdJJywgJyEnLCAnMSd9OwotICAgICAgICBjb25zdCBzaXplX3QgY291bnQgPSBzaXplb2Yoc3RlbV9jaGFycykgLyBzaXplb2Yoc3RlbV9jaGFyc1swXSk7Ci0gICAgICAgIEZYX0RXT1JEIGdseXBoID0gcEVuY29kaW5nLT5HbHlwaEZyb21DaGFyQ29kZShzdGVtX2NoYXJzWzBdKTsKLSAgICAgICAgblN0ZW1WID0gcEZvbnQtPkdldEdseXBoV2lkdGgoZ2x5cGgpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGdseXBoID0gcEVuY29kaW5nLT5HbHlwaEZyb21DaGFyQ29kZShzdGVtX2NoYXJzW2ldKTsKLSAgICAgICAgICAgIGludCB3aWR0aCA9IHBGb250LT5HZXRHbHlwaFdpZHRoKGdseXBoKTsKLSAgICAgICAgICAgIGlmICh3aWR0aCA+IDAgJiYgd2lkdGggPCBuU3RlbVYpIHsKLSAgICAgICAgICAgICAgICBuU3RlbVYgPSB3aWR0aDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgcEFycmF5LT5BZGRJbnRlZ2VyKDEyOCk7CisgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwVW5pY29kZXMgPSBnX0ZYX0NoYXJzZXRVbmljb2Rlc1tpXS5tX3BVbmljb2RlczsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMjg7IGorKykgeworICAgICAgICAgIENGWF9CeXRlU3RyaW5nIG5hbWUgPSBQREZfQWRvYmVOYW1lRnJvbVVuaWNvZGUocFVuaWNvZGVzW2pdKTsKKyAgICAgICAgICBpZiAobmFtZS5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHBBcnJheS0+QWRkTmFtZSgiLm5vdGRlZiIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwQXJyYXktPkFkZE5hbWUobmFtZSk7CisgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIHBFbmNvZGluZy0+U2V0QXQoIkRpZmZlcmVuY2VzIiwgcEFycmF5KTsKKyAgICAgICAgQWRkSW5kaXJlY3RPYmplY3QocEVuY29kaW5nKTsKKyAgICAgICAgcEJhc2VEaWN0LT5TZXRBdFJlZmVyZW5jZSgiRW5jb2RpbmciLCB0aGlzLCBwRW5jb2RpbmcpOworICAgICAgfQogICAgIH0KLSAgICBpZiAocEVuY29kaW5nKSB7Ci0gICAgICAgIGRlbGV0ZSBwRW5jb2Rpbmc7CisgICAgaWYgKHdlaWdodCA+IDAuMCAmJiB0cmFpdCAmIGtDVEZvbnRJdGFsaWNUcmFpdCkgeworICAgICAgYmFzZWZvbnQgKz0gIixCb2xkSXRhbGljIjsKKyAgICB9IGVsc2UgaWYgKHdlaWdodCA+IDAuMCkgeworICAgICAgYmFzZWZvbnQgKz0gIixCb2xkIjsKKyAgICB9IGVsc2UgaWYgKHRyYWl0ICYga0NURm9udEl0YWxpY1RyYWl0KSB7CisgICAgICBiYXNlZm9udCArPSAiLEl0YWxpYyI7CiAgICAgfQotICAgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJTdGVtViIsIG5TdGVtVik7Ci0gICAgQWRkSW5kaXJlY3RPYmplY3QocEZvbnREZXNjKTsKLSAgICBwRm9udERpY3QtPlNldEF0UmVmZXJlbmNlKCJGb250RGVzY3JpcHRvciIsIHRoaXMsIHBGb250RGVzYyk7Ci0gICAgcmV0dXJuIExvYWRGb250KHBCYXNlRGljdCk7CisgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIlN1YnR5cGUiLCAiVHJ1ZVR5cGUiKTsKKyAgICBwQmFzZURpY3QtPlNldEF0TmFtZSgiQmFzZUZvbnQiLCBiYXNlZm9udCk7CisgICAgcEJhc2VEaWN0LT5TZXRBdE51bWJlcigiRmlyc3RDaGFyIiwgMzIpOworICAgIHBCYXNlRGljdC0+U2V0QXROdW1iZXIoIkxhc3RDaGFyIiwgMjU1KTsKKyAgICBpbnQgY2hhcl93aWR0aHNbMjI0XTsKKyAgICBGWF9HZXRDaGFyV2lkdGgoZm9udCwgMzIsIDI1NSwgY2hhcl93aWR0aHMpOworICAgIENQREZfQXJyYXkqIHBXaWR0aHMgPSBuZXcgQ1BERl9BcnJheTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDIyNDsgaSsrKSB7CisgICAgICBwV2lkdGhzLT5BZGRJbnRlZ2VyKGNoYXJfd2lkdGhzW2ldKTsKKyAgICB9CisgICAgcEJhc2VEaWN0LT5TZXRBdCgiV2lkdGhzIiwgcFdpZHRocyk7CisgIH0gZWxzZSB7CisgICAgZmxhZ3MgfD0gUERGRk9OVF9OT05TWU1CT0xJQzsKKyAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBOVUxMOworICAgIHBGb250RGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgICAgQ0ZYX0J5dGVTdHJpbmcgY21hcDsKKyAgICBDRlhfQnl0ZVN0cmluZyBvcmRlcmluZzsKKyAgICBpbnQgc3VwcGxlbWVudDsKKyAgICBGWF9CT09MIGJGb3VuZCA9IEZBTFNFOworICAgIENQREZfQXJyYXkqIHBXaWR0aEFycmF5ID0gbmV3IENQREZfQXJyYXk7CisgICAgY2hhclNldHMuUmVtb3ZlQWxsKCk7CisgICAgY2hhclNldHMuQWRkKEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUKTsKKyAgICBpZiAoSXNIYXNDaGFyU2V0KGxhbmd1YWdlcywgY2hhclNldHMpKSB7CisgICAgICBjbWFwID0gYlZlcnQgPyAiRVRlbm1zLUI1LVYiIDogIkVUZW5tcy1CNS1IIjsKKyAgICAgIG9yZGVyaW5nID0gIkNOUzEiOworICAgICAgc3VwcGxlbWVudCA9IDQ7CisgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigxKTsKKyAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGZvbnQsIDB4MjAsIDB4N2UsIHBXaWR0aEFycmF5KTsKKyAgICAgIGJGb3VuZCA9IFRSVUU7CisgICAgfQorICAgIGNoYXJTZXRzLlJlbW92ZUFsbCgpOworICAgIGNoYXJTZXRzLkFkZChGWEZPTlRfR0IyMzEyX0NIQVJTRVQpOworICAgIGlmICghYkZvdW5kICYmIElzSGFzQ2hhclNldChsYW5ndWFnZXMsIGNoYXJTZXRzKSkgeworICAgICAgY21hcCA9IGJWZXJ0ID8gIkdCSy1FVUMtViIgOiAiR0JLLUVVQy1IIjsKKyAgICAgIG9yZGVyaW5nID0gIkdCMSIsIHN1cHBsZW1lbnQgPSAyOworICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoNzcxNik7CisgICAgICBfSW5zZXJ0V2lkdGhBcnJheShmb250LCAweDIwLCAweDIwLCBwV2lkdGhBcnJheSk7CisgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcig4MTQpOworICAgICAgX0luc2VydFdpZHRoQXJyYXkoZm9udCwgMHgyMSwgMHg3ZSwgcFdpZHRoQXJyYXkpOworICAgICAgYkZvdW5kID0gVFJVRTsKKyAgICB9CisgICAgY2hhclNldHMuUmVtb3ZlQWxsKCk7CisgICAgY2hhclNldHMuQWRkKEZYRk9OVF9IQU5HRVVMX0NIQVJTRVQpOworICAgIGlmICghYkZvdW5kICYmIElzSGFzQ2hhclNldChsYW5ndWFnZXMsIGNoYXJTZXRzKSkgeworICAgICAgY21hcCA9IGJWZXJ0ID8gIktTQ21zLVVIQy1WIiA6ICJLU0Ntcy1VSEMtSCI7CisgICAgICBvcmRlcmluZyA9ICJLb3JlYTEiOworICAgICAgc3VwcGxlbWVudCA9IDI7CisgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigxKTsKKyAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGZvbnQsIDB4MjAsIDB4N2UsIHBXaWR0aEFycmF5KTsKKyAgICAgIGJGb3VuZCA9IFRSVUU7CisgICAgfQorICAgIGNoYXJTZXRzLlJlbW92ZUFsbCgpOworICAgIGNoYXJTZXRzLkFkZChGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVCk7CisgICAgaWYgKCFiRm91bmQgJiYgSXNIYXNDaGFyU2V0KGxhbmd1YWdlcywgY2hhclNldHMpKSB7CisgICAgICBjbWFwID0gYlZlcnQgPyAiOTBtcy1SS1NKLVYiIDogIjkwbXMtUktTSi1IIjsKKyAgICAgIG9yZGVyaW5nID0gIkphcGFuMSI7CisgICAgICBzdXBwbGVtZW50ID0gNTsKKyAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDIzMSk7CisgICAgICBfSW5zZXJ0V2lkdGhBcnJheShmb250LCAweDIwLCAweDdkLCBwV2lkdGhBcnJheSk7CisgICAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigzMjYpOworICAgICAgX0luc2VydFdpZHRoQXJyYXkoZm9udCwgMHhhMCwgMHhhMCwgcFdpZHRoQXJyYXkpOworICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoMzI3KTsKKyAgICAgIF9JbnNlcnRXaWR0aEFycmF5KGZvbnQsIDB4YTEsIDB4ZGYsIHBXaWR0aEFycmF5KTsKKyAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDYzMSk7CisgICAgICBfSW5zZXJ0V2lkdGhBcnJheShmb250LCAweDdlLCAweDdlLCBwV2lkdGhBcnJheSk7CisgICAgfQorICAgIHBCYXNlRGljdC0+U2V0QXROYW1lKCJTdWJ0eXBlIiwgIlR5cGUwIik7CisgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIkJhc2VGb250IiwgYmFzZWZvbnQpOworICAgIHBCYXNlRGljdC0+U2V0QXROYW1lKCJFbmNvZGluZyIsIGNtYXApOworICAgIHBGb250RGljdC0+U2V0QXQoIlciLCBwV2lkdGhBcnJheSk7CisgICAgcEZvbnREaWN0LT5TZXRBdE5hbWUoIlR5cGUiLCAiRm9udCIpOworICAgIHBGb250RGljdC0+U2V0QXROYW1lKCJTdWJ0eXBlIiwgIkNJREZvbnRUeXBlMiIpOworICAgIHBGb250RGljdC0+U2V0QXROYW1lKCJCYXNlRm9udCIsIGJhc2Vmb250KTsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBDSURTeXNJbmZvID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgICBwQ0lEU3lzSW5mby0+U2V0QXRTdHJpbmcoIlJlZ2lzdHJ5IiwgIkFkb2JlIik7CisgICAgcENJRFN5c0luZm8tPlNldEF0U3RyaW5nKCJPcmRlcmluZyIsIG9yZGVyaW5nKTsKKyAgICBwQ0lEU3lzSW5mby0+U2V0QXRJbnRlZ2VyKCJTdXBwbGVtZW50Iiwgc3VwcGxlbWVudCk7CisgICAgcEZvbnREaWN0LT5TZXRBdCgiQ0lEU3lzdGVtSW5mbyIsIHBDSURTeXNJbmZvKTsKKyAgICBwQXJyYXkgPSBuZXcgQ1BERl9BcnJheTsKKyAgICBwQmFzZURpY3QtPlNldEF0KCJEZXNjZW5kYW50Rm9udHMiLCBwQXJyYXkpOworICAgIEFkZEluZGlyZWN0T2JqZWN0KHBGb250RGljdCk7CisgICAgcEFycmF5LT5BZGRSZWZlcmVuY2UodGhpcywgcEZvbnREaWN0KTsKKyAgfQorICBBZGRJbmRpcmVjdE9iamVjdChwQmFzZURpY3QpOworICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGVzYyA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgIHBGb250RGVzYy0+U2V0QXROYW1lKCJUeXBlIiwgIkZvbnREZXNjcmlwdG9yIik7CisgIHBGb250RGVzYy0+U2V0QXROYW1lKCJGb250TmFtZSIsIGJhc2Vmb250KTsKKyAgcEZvbnREZXNjLT5TZXRBdEludGVnZXIoIkZsYWdzIiwgZmxhZ3MpOworICBDUERGX0FycmF5KiBwQkJveCA9IG5ldyBDUERGX0FycmF5OworICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgIHBCQm94LT5BZGRJbnRlZ2VyKGJib3hbaV0pOworICB9CisgIHBGb250RGVzYy0+U2V0QXQoIkZvbnRCQm94IiwgcEJCb3gpOworICBwRm9udERlc2MtPlNldEF0SW50ZWdlcigiSXRhbGljQW5nbGUiLCBpdGFsaWNhbmdsZSk7CisgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJBc2NlbnQiLCBhc2NlbmQpOworICBwRm9udERlc2MtPlNldEF0SW50ZWdlcigiRGVzY2VudCIsIGRlc2NlbmQpOworICBwRm9udERlc2MtPlNldEF0SW50ZWdlcigiQ2FwSGVpZ2h0IiwgY2FwaGVpZ2h0KTsKKyAgQ0dGbG9hdCBmU3RlbVYgPSAwOworICBpbnQxNl90IG1pbl93aWR0aCA9IFNIUlRfTUFYOworICBzdGF0aWMgY29uc3QgVW5pQ2hhciBzdGVtX2NoYXJzW10gPSB7J2knLCAnSScsICchJywgJzEnfTsKKyAgY29uc3Qgc2l6ZV90IGNvdW50ID0gc2l6ZW9mKHN0ZW1fY2hhcnMpIC8gc2l6ZW9mKHN0ZW1fY2hhcnNbMF0pOworICBDR0dseXBoIGdseXBoc1tjb3VudF07CisgIENHUmVjdCBib3VuZGluZ1JlY3RzW2NvdW50XTsKKyAgaWYgKENURm9udEdldEdseXBoc0ZvckNoYXJhY3RlcnMoZm9udCwgc3RlbV9jaGFycywgZ2x5cGhzLCBjb3VudCkpIHsKKyAgICBDVEZvbnRHZXRCb3VuZGluZ1JlY3RzRm9yR2x5cGhzKGZvbnQsIGtDVEZvbnRIb3Jpem9udGFsT3JpZW50YXRpb24sIGdseXBocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kaW5nUmVjdHMsIGNvdW50KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgIGludDE2X3Qgd2lkdGggPSBib3VuZGluZ1JlY3RzW2ldLnNpemUud2lkdGg7CisgICAgICBpZiAod2lkdGggPiAwICYmIHdpZHRoIDwgbWluX3dpZHRoKSB7CisgICAgICAgIG1pbl93aWR0aCA9IHdpZHRoOworICAgICAgICBmU3RlbVYgPSBtaW5fd2lkdGg7CisgICAgICB9CisgICAgfQorICB9CisgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJTdGVtViIsIGZTdGVtVik7CisgIEFkZEluZGlyZWN0T2JqZWN0KHBGb250RGVzYyk7CisgIHBGb250RGljdC0+U2V0QXRSZWZlcmVuY2UoIkZvbnREZXNjcmlwdG9yIiwgdGhpcywgcEZvbnREZXNjKTsKKyAgQ0ZSZWxlYXNlKHRyYWl0cyk7CisgIENGUmVsZWFzZShsYW5ndWFnZXMpOworICByZXR1cm4gTG9hZEZvbnQocEJhc2VEaWN0KTsKIH0KLXN0YXRpYyBpbnQgSW5zZXJ0RGVsZXRlUERGUGFnZShDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblBhZ2VzVG9HbywgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZSwgRlhfQk9PTCBiSW5zZXJ0LCBDRlhfUHRyQXJyYXkmIHN0YWNrTGlzdCkKLXsKLSAgICBDUERGX0FycmF5KiBwS2lkTGlzdCA9IHBQYWdlcy0+R2V0QXJyYXkoIktpZHMiKTsKLSAgICBpZiAoIXBLaWRMaXN0KSB7Ci0gICAgICAgIHJldHVybiAtMTsKKyNlbmRpZiAgLy8gKF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfKQorCitzdGF0aWMgdm9pZCBfSW5zZXJ0V2lkdGhBcnJheTEoQ0ZYX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Vbmljb2RlRW5jb2RpbmcqIHBFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcFdpZHRoQXJyYXkpIHsKKyAgaW50IHNpemUgPSBlbmQgLSBzdGFydCArIDE7CisgIGludCogd2lkdGhzID0gRlhfQWxsb2MoaW50LCBzaXplKTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBpbnQgZ2x5cGhfaW5kZXggPSBwRW5jb2RpbmctPkdseXBoRnJvbUNoYXJDb2RlKHN0YXJ0ICsgaSk7CisgICAgd2lkdGhzW2ldID0gcEZvbnQtPkdldEdseXBoV2lkdGgoZ2x5cGhfaW5kZXgpOworICB9CisgIGZvciAoaSA9IDE7IGkgPCBzaXplOyBpKyspCisgICAgaWYgKHdpZHRoc1tpXSAhPSAqd2lkdGhzKSB7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgaW50IG5LaWRzID0gcEtpZExpc3QtPkdldENvdW50KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuS2lkczsgaSArKykgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBLaWQgPSBwS2lkTGlzdC0+R2V0RGljdChpKTsKLSAgICAgICAgaWYgKHBLaWQtPkdldFN0cmluZygiVHlwZSIpID09IEZYX0JTVFJDKCJQYWdlIikpIHsKLSAgICAgICAgICAgIGlmIChuUGFnZXNUb0dvID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoYkluc2VydCkgewotICAgICAgICAgICAgICAgICAgICBwS2lkTGlzdC0+SW5zZXJ0QXQoaSwgQ1BERl9SZWZlcmVuY2U6OkNyZWF0ZShwRG9jLCBwUGFnZS0+R2V0T2JqTnVtKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgcFBhZ2UtPlNldEF0UmVmZXJlbmNlKCJQYXJlbnQiLCBwRG9jLCBwUGFnZXMtPkdldE9iak51bSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwS2lkTGlzdC0+UmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBQYWdlcy0+U2V0QXRJbnRlZ2VyKCJDb3VudCIsIHBQYWdlcy0+R2V0SW50ZWdlcigiQ291bnQiKSArIChiSW5zZXJ0ID8gMSA6IC0xKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuUGFnZXNUb0dvIC0tOworICBpZiAoaSA9PSBzaXplKSB7CisgICAgaW50IGZpcnN0ID0gcFdpZHRoQXJyYXktPkdldEludGVnZXIocFdpZHRoQXJyYXktPkdldENvdW50KCkgLSAxKTsKKyAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcihmaXJzdCArIHNpemUgLSAxKTsKKyAgICBwV2lkdGhBcnJheS0+QWRkSW50ZWdlcigqd2lkdGhzKTsKKyAgfSBlbHNlIHsKKyAgICBDUERGX0FycmF5KiBwV2lkdGhBcnJheTEgPSBuZXcgQ1BERl9BcnJheTsKKyAgICBwV2lkdGhBcnJheS0+QWRkKHBXaWR0aEFycmF5MSk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgcFdpZHRoQXJyYXkxLT5BZGRJbnRlZ2VyKHdpZHRoc1tpXSk7CisgICAgfQorICB9CisgIEZYX0ZyZWUod2lkdGhzKTsKK30KKworQ1BERl9Gb250KiBDUERGX0RvY3VtZW50OjpBZGRGb250KENGWF9Gb250KiBwRm9udCwgaW50IGNoYXJzZXQsIEZYX0JPT0wgYlZlcnQpIHsKKyAgaWYgKCFwRm9udCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEZYX0JPT0wgYkNKSyA9IGNoYXJzZXQgPT0gRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQgfHwKKyAgICAgICAgICAgICAgICAgY2hhcnNldCA9PSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQgfHwKKyAgICAgICAgICAgICAgICAgY2hhcnNldCA9PSBGWEZPTlRfSEFOR0VVTF9DSEFSU0VUIHx8CisgICAgICAgICAgICAgICAgIGNoYXJzZXQgPT0gRlhGT05UX1NISUZUSklTX0NIQVJTRVQ7CisgIENGWF9CeXRlU3RyaW5nIGJhc2Vmb250ID0gcEZvbnQtPkdldEZhbWlseU5hbWUoKTsKKyAgYmFzZWZvbnQuUmVwbGFjZSgiICIsICIiKTsKKyAgaW50IGZsYWdzID0gMDsKKyAgaWYgKHBGb250LT5Jc0JvbGQoKSkgeworICAgIGZsYWdzIHw9IFBERkZPTlRfRk9SQ0VCT0xEOworICB9CisgIGlmIChwRm9udC0+SXNJdGFsaWMoKSkgeworICAgIGZsYWdzIHw9IFBERkZPTlRfSVRBTElDOworICB9CisgIGlmIChwRm9udC0+SXNGaXhlZFdpZHRoKCkpIHsKKyAgICBmbGFncyB8PSBQREZGT05UX0ZJWEVEUElUQ0g7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQmFzZURpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICBwQmFzZURpY3QtPlNldEF0TmFtZSgiVHlwZSIsICJGb250Iik7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfVW5pY29kZUVuY29kaW5nPiBwRW5jb2RpbmcoCisgICAgICBuZXcgQ0ZYX1VuaWNvZGVFbmNvZGluZyhwRm9udCkpOworICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCA9IHBCYXNlRGljdDsKKyAgaWYgKCFiQ0pLKSB7CisgICAgQ1BERl9BcnJheSogcFdpZHRocyA9IG5ldyBDUERGX0FycmF5OworICAgIGludCBjaGFyY29kZTsKKyAgICBmb3IgKGNoYXJjb2RlID0gMzI7IGNoYXJjb2RlIDwgMTI4OyBjaGFyY29kZSsrKSB7CisgICAgICBpbnQgZ2x5cGhfaW5kZXggPSBwRW5jb2RpbmctPkdseXBoRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKyAgICAgIGludCBjaGFyX3dpZHRoID0gcEZvbnQtPkdldEdseXBoV2lkdGgoZ2x5cGhfaW5kZXgpOworICAgICAgcFdpZHRocy0+QWRkSW50ZWdlcihjaGFyX3dpZHRoKTsKKyAgICB9CisgICAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX0FOU0lfQ0hBUlNFVCB8fCBjaGFyc2V0ID09IEZYRk9OVF9ERUZBVUxUX0NIQVJTRVQgfHwKKyAgICAgICAgY2hhcnNldCA9PSBGWEZPTlRfU1lNQk9MX0NIQVJTRVQpIHsKKyAgICAgIGlmIChjaGFyc2V0ID09IEZYRk9OVF9TWU1CT0xfQ0hBUlNFVCkgeworICAgICAgICBmbGFncyB8PSBQREZGT05UX1NZTUJPTElDOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmxhZ3MgfD0gUERGRk9OVF9OT05TWU1CT0xJQzsKKyAgICAgIH0KKyAgICAgIHBCYXNlRGljdC0+U2V0QXROYW1lKCJFbmNvZGluZyIsICJXaW5BbnNpRW5jb2RpbmciKTsKKyAgICAgIGZvciAoY2hhcmNvZGUgPSAxMjg7IGNoYXJjb2RlIDw9IDI1NTsgY2hhcmNvZGUrKykgeworICAgICAgICBpbnQgZ2x5cGhfaW5kZXggPSBwRW5jb2RpbmctPkdseXBoRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKyAgICAgICAgaW50IGNoYXJfd2lkdGggPSBwRm9udC0+R2V0R2x5cGhXaWR0aChnbHlwaF9pbmRleCk7CisgICAgICAgIHBXaWR0aHMtPkFkZEludGVnZXIoY2hhcl93aWR0aCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZsYWdzIHw9IFBERkZPTlRfTk9OU1lNQk9MSUM7CisgICAgICBzaXplX3QgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgZ19GWF9DaGFyc2V0VW5pY29kZXMgLyBzaXplb2YoRlhfQ2hhcnNldFVuaWNvZGVzKTsKKyAgICAgICAgICAgaSsrKQorICAgICAgICBpZiAoZ19GWF9DaGFyc2V0VW5pY29kZXNbaV0ubV9DaGFyc2V0ID09IGNoYXJzZXQpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgaWYgKGkgPCBzaXplb2YgZ19GWF9DaGFyc2V0VW5pY29kZXMgLyBzaXplb2YoRlhfQ2hhcnNldFVuaWNvZGVzKSkgeworICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBFbmNvZGluZ0RpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICAgICAgICBwRW5jb2RpbmdEaWN0LT5TZXRBdE5hbWUoIkJhc2VFbmNvZGluZyIsICJXaW5BbnNpRW5jb2RpbmciKTsKKyAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gbmV3IENQREZfQXJyYXk7CisgICAgICAgIHBBcnJheS0+QWRkSW50ZWdlcigxMjgpOworICAgICAgICBjb25zdCBGWF9XQ0hBUiogcFVuaWNvZGVzID0gZ19GWF9DaGFyc2V0VW5pY29kZXNbaV0ubV9wVW5pY29kZXM7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTI4OyBqKyspIHsKKyAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gUERGX0Fkb2JlTmFtZUZyb21Vbmljb2RlKHBVbmljb2Rlc1tqXSk7CisgICAgICAgICAgaWYgKG5hbWUuSXNFbXB0eSgpKSB7CisgICAgICAgICAgICBwQXJyYXktPkFkZE5hbWUoIi5ub3RkZWYiKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcEFycmF5LT5BZGROYW1lKG5hbWUpOworICAgICAgICAgIH0KKyAgICAgICAgICBpbnQgZ2x5cGhfaW5kZXggPSBwRW5jb2RpbmctPkdseXBoRnJvbUNoYXJDb2RlKHBVbmljb2Rlc1tqXSk7CisgICAgICAgICAgaW50IGNoYXJfd2lkdGggPSBwRm9udC0+R2V0R2x5cGhXaWR0aChnbHlwaF9pbmRleCk7CisgICAgICAgICAgcFdpZHRocy0+QWRkSW50ZWdlcihjaGFyX3dpZHRoKTsKKyAgICAgICAgfQorICAgICAgICBwRW5jb2RpbmdEaWN0LT5TZXRBdCgiRGlmZmVyZW5jZXMiLCBwQXJyYXkpOworICAgICAgICBBZGRJbmRpcmVjdE9iamVjdChwRW5jb2RpbmdEaWN0KTsKKyAgICAgICAgcEJhc2VEaWN0LT5TZXRBdFJlZmVyZW5jZSgiRW5jb2RpbmciLCB0aGlzLCBwRW5jb2RpbmdEaWN0KTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHBGb250LT5Jc0JvbGQoKSAmJiBwRm9udC0+SXNJdGFsaWMoKSkgeworICAgICAgYmFzZWZvbnQgKz0gIixCb2xkSXRhbGljIjsKKyAgICB9IGVsc2UgaWYgKHBGb250LT5Jc0JvbGQoKSkgeworICAgICAgYmFzZWZvbnQgKz0gIixCb2xkIjsKKyAgICB9IGVsc2UgaWYgKHBGb250LT5Jc0l0YWxpYygpKSB7CisgICAgICBiYXNlZm9udCArPSAiLEl0YWxpYyI7CisgICAgfQorICAgIHBCYXNlRGljdC0+U2V0QXROYW1lKCJTdWJ0eXBlIiwgIlRydWVUeXBlIik7CisgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIkJhc2VGb250IiwgYmFzZWZvbnQpOworICAgIHBCYXNlRGljdC0+U2V0QXROdW1iZXIoIkZpcnN0Q2hhciIsIDMyKTsKKyAgICBwQmFzZURpY3QtPlNldEF0TnVtYmVyKCJMYXN0Q2hhciIsIDI1NSk7CisgICAgcEJhc2VEaWN0LT5TZXRBdCgiV2lkdGhzIiwgcFdpZHRocyk7CisgIH0gZWxzZSB7CisgICAgZmxhZ3MgfD0gUERGRk9OVF9OT05TWU1CT0xJQzsKKyAgICBwRm9udERpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICAgIENGWF9CeXRlU3RyaW5nIGNtYXA7CisgICAgQ0ZYX0J5dGVTdHJpbmcgb3JkZXJpbmc7CisgICAgaW50IHN1cHBsZW1lbnQ7CisgICAgQ1BERl9BcnJheSogcFdpZHRoQXJyYXkgPSBuZXcgQ1BERl9BcnJheTsKKyAgICBzd2l0Y2ggKGNoYXJzZXQpIHsKKyAgICAgIGNhc2UgRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQ6CisgICAgICAgIGNtYXAgPSBiVmVydCA/ICJFVGVubXMtQjUtViIgOiAiRVRlbm1zLUI1LUgiOworICAgICAgICBvcmRlcmluZyA9ICJDTlMxIjsKKyAgICAgICAgc3VwcGxlbWVudCA9IDQ7CisgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDEpOworICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheTEocEZvbnQsIHBFbmNvZGluZy5nZXQoKSwgMHgyMCwgMHg3ZSwgcFdpZHRoQXJyYXkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRlhGT05UX0dCMjMxMl9DSEFSU0VUOgorICAgICAgICBjbWFwID0gYlZlcnQgPyAiR0JLLUVVQy1WIiA6ICJHQkstRVVDLUgiOworICAgICAgICBvcmRlcmluZyA9ICJHQjEiLCBzdXBwbGVtZW50ID0gMjsKKyAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoNzcxNik7CisgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5MShwRm9udCwgcEVuY29kaW5nLmdldCgpLCAweDIwLCAweDIwLCBwV2lkdGhBcnJheSk7CisgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDgxNCk7CisgICAgICAgIF9JbnNlcnRXaWR0aEFycmF5MShwRm9udCwgcEVuY29kaW5nLmdldCgpLCAweDIxLCAweDdlLCBwV2lkdGhBcnJheSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWEZPTlRfSEFOR0VVTF9DSEFSU0VUOgorICAgICAgICBjbWFwID0gYlZlcnQgPyAiS1NDbXMtVUhDLVYiIDogIktTQ21zLVVIQy1IIjsKKyAgICAgICAgb3JkZXJpbmcgPSAiS29yZWExIjsKKyAgICAgICAgc3VwcGxlbWVudCA9IDI7CisgICAgICAgIHBXaWR0aEFycmF5LT5BZGRJbnRlZ2VyKDEpOworICAgICAgICBfSW5zZXJ0V2lkdGhBcnJheTEocEZvbnQsIHBFbmNvZGluZy5nZXQoKSwgMHgyMCwgMHg3ZSwgcFdpZHRoQXJyYXkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRlhGT05UX1NISUZUSklTX0NIQVJTRVQ6CisgICAgICAgIGNtYXAgPSBiVmVydCA/ICI5MG1zLVJLU0otViIgOiAiOTBtcy1SS1NKLUgiOworICAgICAgICBvcmRlcmluZyA9ICJKYXBhbjEiOworICAgICAgICBzdXBwbGVtZW50ID0gNTsKKyAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoMjMxKTsKKyAgICAgICAgX0luc2VydFdpZHRoQXJyYXkxKHBGb250LCBwRW5jb2RpbmcuZ2V0KCksIDB4MjAsIDB4N2QsIHBXaWR0aEFycmF5KTsKKyAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoMzI2KTsKKyAgICAgICAgX0luc2VydFdpZHRoQXJyYXkxKHBGb250LCBwRW5jb2RpbmcuZ2V0KCksIDB4YTAsIDB4YTAsIHBXaWR0aEFycmF5KTsKKyAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoMzI3KTsKKyAgICAgICAgX0luc2VydFdpZHRoQXJyYXkxKHBGb250LCBwRW5jb2RpbmcuZ2V0KCksIDB4YTEsIDB4ZGYsIHBXaWR0aEFycmF5KTsKKyAgICAgICAgcFdpZHRoQXJyYXktPkFkZEludGVnZXIoNjMxKTsKKyAgICAgICAgX0luc2VydFdpZHRoQXJyYXkxKHBGb250LCBwRW5jb2RpbmcuZ2V0KCksIDB4N2UsIDB4N2UsIHBXaWR0aEFycmF5KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHBCYXNlRGljdC0+U2V0QXROYW1lKCJTdWJ0eXBlIiwgIlR5cGUwIik7CisgICAgcEJhc2VEaWN0LT5TZXRBdE5hbWUoIkJhc2VGb250IiwgYmFzZWZvbnQpOworICAgIHBCYXNlRGljdC0+U2V0QXROYW1lKCJFbmNvZGluZyIsIGNtYXApOworICAgIHBGb250RGljdC0+U2V0QXQoIlciLCBwV2lkdGhBcnJheSk7CisgICAgcEZvbnREaWN0LT5TZXRBdE5hbWUoIlR5cGUiLCAiRm9udCIpOworICAgIHBGb250RGljdC0+U2V0QXROYW1lKCJTdWJ0eXBlIiwgIkNJREZvbnRUeXBlMiIpOworICAgIHBGb250RGljdC0+U2V0QXROYW1lKCJCYXNlRm9udCIsIGJhc2Vmb250KTsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBDSURTeXNJbmZvID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgICBwQ0lEU3lzSW5mby0+U2V0QXRTdHJpbmcoIlJlZ2lzdHJ5IiwgIkFkb2JlIik7CisgICAgcENJRFN5c0luZm8tPlNldEF0U3RyaW5nKCJPcmRlcmluZyIsIG9yZGVyaW5nKTsKKyAgICBwQ0lEU3lzSW5mby0+U2V0QXRJbnRlZ2VyKCJTdXBwbGVtZW50Iiwgc3VwcGxlbWVudCk7CisgICAgcEZvbnREaWN0LT5TZXRBdCgiQ0lEU3lzdGVtSW5mbyIsIHBDSURTeXNJbmZvKTsKKyAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBuZXcgQ1BERl9BcnJheTsKKyAgICBwQmFzZURpY3QtPlNldEF0KCJEZXNjZW5kYW50Rm9udHMiLCBwQXJyYXkpOworICAgIEFkZEluZGlyZWN0T2JqZWN0KHBGb250RGljdCk7CisgICAgcEFycmF5LT5BZGRSZWZlcmVuY2UodGhpcywgcEZvbnREaWN0KTsKKyAgfQorICBBZGRJbmRpcmVjdE9iamVjdChwQmFzZURpY3QpOworICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGVzYyA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgIHBGb250RGVzYy0+U2V0QXROYW1lKCJUeXBlIiwgIkZvbnREZXNjcmlwdG9yIik7CisgIHBGb250RGVzYy0+U2V0QXROYW1lKCJGb250TmFtZSIsIGJhc2Vmb250KTsKKyAgcEZvbnREZXNjLT5TZXRBdEludGVnZXIoIkZsYWdzIiwgZmxhZ3MpOworICBwRm9udERlc2MtPlNldEF0SW50ZWdlcigKKyAgICAgICJJdGFsaWNBbmdsZSIsCisgICAgICBwRm9udC0+R2V0U3Vic3RGb250KCkgPyBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fSXRhbGljQW5nbGUgOiAwKTsKKyAgcEZvbnREZXNjLT5TZXRBdEludGVnZXIoIkFzY2VudCIsIHBGb250LT5HZXRBc2NlbnQoKSk7CisgIHBGb250RGVzYy0+U2V0QXRJbnRlZ2VyKCJEZXNjZW50IiwgcEZvbnQtPkdldERlc2NlbnQoKSk7CisgIEZYX1JFQ1QgYmJveDsKKyAgcEZvbnQtPkdldEJCb3goYmJveCk7CisgIENQREZfQXJyYXkqIHBCQm94ID0gbmV3IENQREZfQXJyYXk7CisgIHBCQm94LT5BZGRJbnRlZ2VyKGJib3gubGVmdCk7CisgIHBCQm94LT5BZGRJbnRlZ2VyKGJib3guYm90dG9tKTsKKyAgcEJCb3gtPkFkZEludGVnZXIoYmJveC5yaWdodCk7CisgIHBCQm94LT5BZGRJbnRlZ2VyKGJib3gudG9wKTsKKyAgcEZvbnREZXNjLT5TZXRBdCgiRm9udEJCb3giLCBwQkJveCk7CisgIGludDMyX3QgblN0ZW1WID0gMDsKKyAgaWYgKHBGb250LT5HZXRTdWJzdEZvbnQoKSkgeworICAgIG5TdGVtViA9IHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9XZWlnaHQgLyA1OworICB9IGVsc2UgeworICAgIHN0YXRpYyBjb25zdCBGWF9DSEFSIHN0ZW1fY2hhcnNbXSA9IHsnaScsICdJJywgJyEnLCAnMSd9OworICAgIGNvbnN0IHNpemVfdCBjb3VudCA9IHNpemVvZihzdGVtX2NoYXJzKSAvIHNpemVvZihzdGVtX2NoYXJzWzBdKTsKKyAgICBGWF9EV09SRCBnbHlwaCA9IHBFbmNvZGluZy0+R2x5cGhGcm9tQ2hhckNvZGUoc3RlbV9jaGFyc1swXSk7CisgICAgblN0ZW1WID0gcEZvbnQtPkdldEdseXBoV2lkdGgoZ2x5cGgpOworICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgZ2x5cGggPSBwRW5jb2RpbmctPkdseXBoRnJvbUNoYXJDb2RlKHN0ZW1fY2hhcnNbaV0pOworICAgICAgaW50IHdpZHRoID0gcEZvbnQtPkdldEdseXBoV2lkdGgoZ2x5cGgpOworICAgICAgaWYgKHdpZHRoID4gMCAmJiB3aWR0aCA8IG5TdGVtVikgeworICAgICAgICBuU3RlbVYgPSB3aWR0aDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcEZvbnREZXNjLT5TZXRBdEludGVnZXIoIlN0ZW1WIiwgblN0ZW1WKTsKKyAgQWRkSW5kaXJlY3RPYmplY3QocEZvbnREZXNjKTsKKyAgcEZvbnREaWN0LT5TZXRBdFJlZmVyZW5jZSgiRm9udERlc2NyaXB0b3IiLCB0aGlzLCBwRm9udERlc2MpOworICByZXR1cm4gTG9hZEZvbnQocEJhc2VEaWN0KTsKK30KK3N0YXRpYyBpbnQgSW5zZXJ0RGVsZXRlUERGUGFnZShDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuUGFnZXNUb0dvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW5zZXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BcnJheVRlbXBsYXRlPENQREZfRGljdGlvbmFyeSo+JiBzdGFja0xpc3QpIHsKKyAgQ1BERl9BcnJheSogcEtpZExpc3QgPSBwUGFnZXMtPkdldEFycmF5KCJLaWRzIik7CisgIGlmICghcEtpZExpc3QpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaW50IG5LaWRzID0gcEtpZExpc3QtPkdldENvdW50KCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbktpZHM7IGkrKykgeworICAgIENQREZfRGljdGlvbmFyeSogcEtpZCA9IHBLaWRMaXN0LT5HZXREaWN0KGkpOworICAgIGlmIChwS2lkLT5HZXRTdHJpbmcoIlR5cGUiKSA9PSAiUGFnZSIpIHsKKyAgICAgIGlmIChuUGFnZXNUb0dvID09IDApIHsKKyAgICAgICAgaWYgKGJJbnNlcnQpIHsKKyAgICAgICAgICBwS2lkTGlzdC0+SW5zZXJ0QXQoaSwgbmV3IENQREZfUmVmZXJlbmNlKHBEb2MsIHBQYWdlLT5HZXRPYmpOdW0oKSkpOworICAgICAgICAgIHBQYWdlLT5TZXRBdFJlZmVyZW5jZSgiUGFyZW50IiwgcERvYywgcFBhZ2VzLT5HZXRPYmpOdW0oKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgblBhZ2VzID0gcEtpZC0+R2V0SW50ZWdlcigiQ291bnQiKTsKLSAgICAgICAgICAgIGlmIChuUGFnZXNUb0dvIDwgblBhZ2VzKSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0YWNrQ291bnQgPSBzdGFja0xpc3QuR2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3RhY2tDb3VudDsgKytqKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwS2lkID09IHN0YWNrTGlzdFtqXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0YWNrTGlzdC5BZGQocEtpZCk7Ci0gICAgICAgICAgICAgICAgaWYgKEluc2VydERlbGV0ZVBERlBhZ2UocERvYywgcEtpZCwgblBhZ2VzVG9HbywgcFBhZ2UsIGJJbnNlcnQsIHN0YWNrTGlzdCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RhY2tMaXN0LlJlbW92ZUF0KHN0YWNrQ291bnQpOwotICAgICAgICAgICAgICAgIHBQYWdlcy0+U2V0QXRJbnRlZ2VyKCJDb3VudCIsIHBQYWdlcy0+R2V0SW50ZWdlcigiQ291bnQiKSArIChiSW5zZXJ0ID8gMSA6IC0xKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuUGFnZXNUb0dvIC09IG5QYWdlczsKKyAgICAgICAgICBwS2lkTGlzdC0+UmVtb3ZlQXQoaSk7CiAgICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW50IEluc2VydE5ld1BhZ2UoQ1BERl9Eb2N1bWVudCogcERvYywgaW50IGlQYWdlLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCwgQ0ZYX0RXb3JkQXJyYXkgJnBhZ2VMaXN0KQotewotICAgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBwRG9jLT5HZXRSb290KCk7Ci0gICAgaWYgKCFwUm9vdCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VzID0gcFJvb3QtPkdldERpY3QoRlhfQlNUUkMoIlBhZ2VzIikpOwotICAgIGlmICghcFBhZ2VzKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaW50IG5QYWdlcyA9IHBEb2MtPkdldFBhZ2VDb3VudCgpOwotICAgIGlmIChpUGFnZSA8IDAgfHwgaVBhZ2UgPiBuUGFnZXMpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAoaVBhZ2UgPT0gblBhZ2VzKSB7Ci0gICAgICAgIENQREZfQXJyYXkqIHBQYWdlc0xpc3QgPSBwUGFnZXMtPkdldEFycmF5KEZYX0JTVFJDKCJLaWRzIikpOwotICAgICAgICBpZiAoIXBQYWdlc0xpc3QpIHsKLSAgICAgICAgICAgIHBQYWdlc0xpc3QgPSBuZXcgQ1BERl9BcnJheTsKLSAgICAgICAgICAgIHBQYWdlcy0+U2V0QXQoRlhfQlNUUkMoIktpZHMiKSwgcFBhZ2VzTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcFBhZ2VzTGlzdC0+QWRkKHBQYWdlRGljdCwgcERvYyk7Ci0gICAgICAgIHBQYWdlcy0+U2V0QXRJbnRlZ2VyKEZYX0JTVFJDKCJDb3VudCIpLCBuUGFnZXMgKyAxKTsKLSAgICAgICAgcFBhZ2VEaWN0LT5TZXRBdFJlZmVyZW5jZShGWF9CU1RSQygiUGFyZW50IiksIHBEb2MsIHBQYWdlcy0+R2V0T2JqTnVtKCkpOworICAgICAgICBwUGFnZXMtPlNldEF0SW50ZWdlcigiQ291bnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFnZXMtPkdldEludGVnZXIoIkNvdW50IikgKyAoYkluc2VydCA/IDEgOiAtMSkpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIG5QYWdlc1RvR28tLTsKICAgICB9IGVsc2UgewotICAgICAgICBDRlhfUHRyQXJyYXkgc3RhY2s7Ci0gICAgICAgIHN0YWNrLkFkZChwUGFnZXMpOwotICAgICAgICBpZiAoSW5zZXJ0RGVsZXRlUERGUGFnZShwRG9jLCBwUGFnZXMsIGlQYWdlLCBwUGFnZURpY3QsIFRSVUUsIHN0YWNrKSA8IDApIHsKKyAgICAgIGludCBuUGFnZXMgPSBwS2lkLT5HZXRJbnRlZ2VyKCJDb3VudCIpOworICAgICAgaWYgKG5QYWdlc1RvR28gPCBuUGFnZXMpIHsKKyAgICAgICAgaW50IHN0YWNrQ291bnQgPSBzdGFja0xpc3QuR2V0U2l6ZSgpOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHN0YWNrQ291bnQ7ICsraikgeworICAgICAgICAgIGlmIChwS2lkID09IHN0YWNrTGlzdFtqXSkgewogICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBzdGFja0xpc3QuQWRkKHBLaWQpOworICAgICAgICBpZiAoSW5zZXJ0RGVsZXRlUERGUGFnZShwRG9jLCBwS2lkLCBuUGFnZXNUb0dvLCBwUGFnZSwgYkluc2VydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tMaXN0KSA8IDApIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgc3RhY2tMaXN0LlJlbW92ZUF0KHN0YWNrQ291bnQpOworICAgICAgICBwUGFnZXMtPlNldEF0SW50ZWdlcigiQ291bnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFnZXMtPkdldEludGVnZXIoIkNvdW50IikgKyAoYkluc2VydCA/IDEgOiAtMSkpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIG5QYWdlc1RvR28gLT0gblBhZ2VzOwogICAgIH0KLSAgICBwYWdlTGlzdC5JbnNlcnRBdChpUGFnZSwgcFBhZ2VEaWN0LT5HZXRPYmpOdW0oKSk7Ci0gICAgcmV0dXJuIGlQYWdlOworICB9CisgIHJldHVybiAwOwogfQotQ1BERl9EaWN0aW9uYXJ5KiBDUERGX0RvY3VtZW50OjpDcmVhdGVOZXdQYWdlKGludCBpUGFnZSkKLXsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKLSAgICBwRGljdC0+U2V0QXROYW1lKCJUeXBlIiwgIlBhZ2UiKTsKLSAgICBGWF9EV09SRCBkd09iak51bSA9IEFkZEluZGlyZWN0T2JqZWN0KHBEaWN0KTsKLSAgICBpZiAoSW5zZXJ0TmV3UGFnZSh0aGlzLCBpUGFnZSwgcERpY3QsIG1fUGFnZUxpc3QpIDwgMCkgewotICAgICAgICBSZWxlYXNlSW5kaXJlY3RPYmplY3QoZHdPYmpOdW0pOwotICAgICAgICByZXR1cm4gTlVMTDsKK3N0YXRpYyBpbnQgSW5zZXJ0TmV3UGFnZShDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRFdvcmRBcnJheSYgcGFnZUxpc3QpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IHBEb2MtPkdldFJvb3QoKTsKKyAgaWYgKCFwUm9vdCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlcyA9IHBSb290LT5HZXREaWN0KCJQYWdlcyIpOworICBpZiAoIXBQYWdlcykgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpbnQgblBhZ2VzID0gcERvYy0+R2V0UGFnZUNvdW50KCk7CisgIGlmIChpUGFnZSA8IDAgfHwgaVBhZ2UgPiBuUGFnZXMpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKGlQYWdlID09IG5QYWdlcykgeworICAgIENQREZfQXJyYXkqIHBQYWdlc0xpc3QgPSBwUGFnZXMtPkdldEFycmF5KCJLaWRzIik7CisgICAgaWYgKCFwUGFnZXNMaXN0KSB7CisgICAgICBwUGFnZXNMaXN0ID0gbmV3IENQREZfQXJyYXk7CisgICAgICBwUGFnZXMtPlNldEF0KCJLaWRzIiwgcFBhZ2VzTGlzdCk7CiAgICAgfQotICAgIHJldHVybiBwRGljdDsKLX0KLWludCBfUERGX0dldFN0YW5kYXJkRm9udE5hbWUoQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOwotQ1BERl9Gb250KiBDUERGX0RvY3VtZW50OjpBZGRTdGFuZGFyZEZvbnQoRlhfTFBDU1RSIGZvbnQsIENQREZfRm9udEVuY29kaW5nKiBwRW5jb2RpbmcpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZShmb250LCAtMSk7Ci0gICAgaWYgKF9QREZfR2V0U3RhbmRhcmRGb250TmFtZShuYW1lKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBHZXRQYWdlRGF0YSgpLT5HZXRTdGFuZGFyZEZvbnQobmFtZSwgcEVuY29kaW5nKTsKLX0KLXZvaWQgQ1BERl9Eb2N1bWVudDo6RGVsZXRlUGFnZShpbnQgaVBhZ2UpCi17Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IEdldFJvb3QoKTsKLSAgICBpZiAocFJvb3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VzID0gcFJvb3QtPkdldERpY3QoIlBhZ2VzIik7Ci0gICAgaWYgKHBQYWdlcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IG5QYWdlcyA9IHBQYWdlcy0+R2V0SW50ZWdlcigiQ291bnQiKTsKLSAgICBpZiAoaVBhZ2UgPCAwIHx8IGlQYWdlID49IG5QYWdlcykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENGWF9QdHJBcnJheSBzdGFjazsKKyAgICBwUGFnZXNMaXN0LT5BZGQocFBhZ2VEaWN0LCBwRG9jKTsKKyAgICBwUGFnZXMtPlNldEF0SW50ZWdlcigiQ291bnQiLCBuUGFnZXMgKyAxKTsKKyAgICBwUGFnZURpY3QtPlNldEF0UmVmZXJlbmNlKCJQYXJlbnQiLCBwRG9jLCBwUGFnZXMtPkdldE9iak51bSgpKTsKKyAgfSBlbHNlIHsKKyAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX0RpY3Rpb25hcnkqPiBzdGFjazsKICAgICBzdGFjay5BZGQocFBhZ2VzKTsKLSAgICBpZiAoSW5zZXJ0RGVsZXRlUERGUGFnZSh0aGlzLCBwUGFnZXMsIGlQYWdlLCBOVUxMLCBGQUxTRSwgc3RhY2spIDwgMCkgewotICAgICAgICByZXR1cm47CisgICAgaWYgKEluc2VydERlbGV0ZVBERlBhZ2UocERvYywgcFBhZ2VzLCBpUGFnZSwgcFBhZ2VEaWN0LCBUUlVFLCBzdGFjaykgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIG1fUGFnZUxpc3QuUmVtb3ZlQXQoaVBhZ2UpOworICB9CisgIHBhZ2VMaXN0Lkluc2VydEF0KGlQYWdlLCBwUGFnZURpY3QtPkdldE9iak51bSgpKTsKKyAgcmV0dXJuIGlQYWdlOwogfQotQ1BERl9PYmplY3QqIEZQREZBUElfR2V0UGFnZUF0dHIoQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QsIEZYX0JTVFIgbmFtZSk7Ci12b2lkIEZQREZBUElfRmxhdFBhZ2VBdHRyKENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0LCBGWF9CU1RSIG5hbWUpCi17Ci0gICAgaWYgKHBQYWdlRGljdC0+S2V5RXhpc3QobmFtZSkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcE9iaiA9IEZQREZBUElfR2V0UGFnZUF0dHIocFBhZ2VEaWN0LCBuYW1lKTsKLSAgICBpZiAocE9iaikgewotICAgICAgICBwUGFnZURpY3QtPlNldEF0KG5hbWUsIHBPYmotPkNsb25lKCkpOwotICAgIH0KK0NQREZfRGljdGlvbmFyeSogQ1BERl9Eb2N1bWVudDo6Q3JlYXRlTmV3UGFnZShpbnQgaVBhZ2UpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgIHBEaWN0LT5TZXRBdE5hbWUoIlR5cGUiLCAiUGFnZSIpOworICBGWF9EV09SRCBkd09iak51bSA9IEFkZEluZGlyZWN0T2JqZWN0KHBEaWN0KTsKKyAgaWYgKEluc2VydE5ld1BhZ2UodGhpcywgaVBhZ2UsIHBEaWN0LCBtX1BhZ2VMaXN0KSA8IDApIHsKKyAgICBSZWxlYXNlSW5kaXJlY3RPYmplY3QoZHdPYmpOdW0pOworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBwRGljdDsKK30KKworQ1BERl9Gb250KiBDUERGX0RvY3VtZW50OjpBZGRTdGFuZGFyZEZvbnQoY29uc3QgRlhfQ0hBUiogZm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udEVuY29kaW5nKiBwRW5jb2RpbmcpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgbmFtZShmb250KTsKKyAgaWYgKFBERl9HZXRTdGFuZGFyZEZvbnROYW1lKCZuYW1lKSA8IDApCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiBHZXRQYWdlRGF0YSgpLT5HZXRTdGFuZGFyZEZvbnQobmFtZSwgcEVuY29kaW5nKTsKK30KKwordm9pZCBDUERGX0RvY3VtZW50OjpEZWxldGVQYWdlKGludCBpUGFnZSkgeworICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gR2V0Um9vdCgpOworICBpZiAoIXBSb290KSB7CisgICAgcmV0dXJuOworICB9CisgIENQREZfRGljdGlvbmFyeSogcFBhZ2VzID0gcFJvb3QtPkdldERpY3QoIlBhZ2VzIik7CisgIGlmICghcFBhZ2VzKSB7CisgICAgcmV0dXJuOworICB9CisgIGludCBuUGFnZXMgPSBwUGFnZXMtPkdldEludGVnZXIoIkNvdW50Iik7CisgIGlmIChpUGFnZSA8IDAgfHwgaVBhZ2UgPj0gblBhZ2VzKSB7CisgICAgcmV0dXJuOworICB9CisgIENGWF9BcnJheVRlbXBsYXRlPENQREZfRGljdGlvbmFyeSo+IHN0YWNrOworICBzdGFjay5BZGQocFBhZ2VzKTsKKyAgaWYgKEluc2VydERlbGV0ZVBERlBhZ2UodGhpcywgcFBhZ2VzLCBpUGFnZSwgTlVMTCwgRkFMU0UsIHN0YWNrKSA8IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9QYWdlTGlzdC5SZW1vdmVBdChpUGFnZSk7Cit9CitDUERGX09iamVjdCogRlBERkFQSV9HZXRQYWdlQXR0cihDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSk7Cit2b2lkIEZQREZBUElfRmxhdFBhZ2VBdHRyKENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIHsKKyAgaWYgKHBQYWdlRGljdC0+S2V5RXhpc3QobmFtZSkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9PYmplY3QqIHBPYmogPSBGUERGQVBJX0dldFBhZ2VBdHRyKHBQYWdlRGljdCwgbmFtZSk7CisgIGlmIChwT2JqKSB7CisgICAgcFBhZ2VEaWN0LT5TZXRBdChuYW1lLCBwT2JqLT5DbG9uZSgpKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2ltYWdlLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9lZGl0L2ZwZGZfZWRpdF9pbWFnZS5jcHAKaW5kZXggOTA5NmJmOS4uMmI2OGEwNCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2ltYWdlLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZWRpdC9mcGRmX2VkaXRfaW1hZ2UuY3BwCkBAIC0xLDM2NSArMSwzODYgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2UuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZW5kZXIuaCIKLSNpbmNsdWRlICIuLi9mcGRmX3BhZ2UvcGFnZWludC5oIgotI2luY2x1ZGUgIi4uL2ZwZGZfcmVuZGVyL3JlbmRlcl9pbnQuaCIKLUNQREZfRGljdGlvbmFyeSogQ1BERl9JbWFnZTo6SW5pdEpQRUcoRlhfTFBCWVRFIHBEYXRhLCBGWF9EV09SRCBzaXplKQotewotICAgIEZYX0lOVDMyIHdpZHRoLCBoZWlnaHQsIGNvbG9yX3RyYW5zLCBudW1fY29tcHMsIGJpdHM7Ci0gICAgaWYgKCFDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKS0+Ci0gICAgICAgICAgICBMb2FkSW5mbyhwRGF0YSwgc2l6ZSwgd2lkdGgsIGhlaWdodCwgbnVtX2NvbXBzLCBiaXRzLCBjb2xvcl90cmFucykpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2UuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3JlbmRlci5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCisjaW5jbHVkZSAiY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvcGFnZWludC5oIgorI2luY2x1ZGUgImNvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvcmVuZGVyX2ludC5oIgorCitDUERGX0RpY3Rpb25hcnkqIENQREZfSW1hZ2U6OkluaXRKUEVHKHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplKSB7CisgIGludDMyX3Qgd2lkdGg7CisgIGludDMyX3QgaGVpZ2h0OworICBpbnQzMl90IG51bV9jb21wczsKKyAgaW50MzJfdCBiaXRzOworICBGWF9CT09MIGNvbG9yX3RyYW5zOworICBpZiAoIUNQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SnBlZ01vZHVsZSgpLT5Mb2FkSW5mbygKKyAgICAgICAgICBwRGF0YSwgc2l6ZSwgd2lkdGgsIGhlaWdodCwgbnVtX2NvbXBzLCBiaXRzLCBjb2xvcl90cmFucykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgcERpY3QtPlNldEF0TmFtZSgiVHlwZSIsICJYT2JqZWN0Iik7CisgIHBEaWN0LT5TZXRBdE5hbWUoIlN1YnR5cGUiLCAiSW1hZ2UiKTsKKyAgcERpY3QtPlNldEF0SW50ZWdlcigiV2lkdGgiLCB3aWR0aCk7CisgIHBEaWN0LT5TZXRBdEludGVnZXIoIkhlaWdodCIsIGhlaWdodCk7CisgIGNvbnN0IEZYX0NIQVIqIGNzbmFtZSA9IE5VTEw7CisgIGlmIChudW1fY29tcHMgPT0gMSkgeworICAgIGNzbmFtZSA9ICJEZXZpY2VHcmF5IjsKKyAgfSBlbHNlIGlmIChudW1fY29tcHMgPT0gMykgeworICAgIGNzbmFtZSA9ICJEZXZpY2VSR0IiOworICB9IGVsc2UgaWYgKG51bV9jb21wcyA9PSA0KSB7CisgICAgY3NuYW1lID0gIkRldmljZUNNWUsiOworICAgIENQREZfQXJyYXkqIHBEZWNvZGUgPSBuZXcgQ1BERl9BcnJheTsKKyAgICBmb3IgKGludCBuID0gMDsgbiA8IDQ7IG4rKykgeworICAgICAgcERlY29kZS0+QWRkSW50ZWdlcigxKTsKKyAgICAgIHBEZWNvZGUtPkFkZEludGVnZXIoMCk7CiAgICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgIHBEaWN0LT5TZXRBdE5hbWUoIlR5cGUiLCAiWE9iamVjdCIpOwotICAgIHBEaWN0LT5TZXRBdE5hbWUoIlN1YnR5cGUiLCAiSW1hZ2UiKTsKLSAgICBwRGljdC0+U2V0QXRJbnRlZ2VyKCJXaWR0aCIsIHdpZHRoKTsKLSAgICBwRGljdC0+U2V0QXRJbnRlZ2VyKCJIZWlnaHQiLCBoZWlnaHQpOwotICAgIEZYX0xQQ1NUUiBjc25hbWUgPSBOVUxMOwotICAgIGlmIChudW1fY29tcHMgPT0gMSkgewotICAgICAgICBjc25hbWUgPSAiRGV2aWNlR3JheSI7Ci0gICAgfSBlbHNlIGlmIChudW1fY29tcHMgPT0gMykgewotICAgICAgICBjc25hbWUgPSAiRGV2aWNlUkdCIjsKLSAgICB9IGVsc2UgaWYgKG51bV9jb21wcyA9PSA0KSB7Ci0gICAgICAgIGNzbmFtZSA9ICJEZXZpY2VDTVlLIjsKLSAgICAgICAgQ1BERl9BcnJheSogcERlY29kZSA9IENQREZfQXJyYXk6OkNyZWF0ZSgpOwotICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IDQ7IG4gKyspIHsKLSAgICAgICAgICAgIHBEZWNvZGUtPkFkZEludGVnZXIoMSk7Ci0gICAgICAgICAgICBwRGVjb2RlLT5BZGRJbnRlZ2VyKDApOwotICAgICAgICB9Ci0gICAgICAgIHBEaWN0LT5TZXRBdChGWF9CU1RSQygiRGVjb2RlIiksIHBEZWNvZGUpOwotICAgIH0KLSAgICBwRGljdC0+U2V0QXROYW1lKCJDb2xvclNwYWNlIiwgY3NuYW1lKTsKLSAgICBwRGljdC0+U2V0QXRJbnRlZ2VyKCJCaXRzUGVyQ29tcG9uZW50IiwgYml0cyk7Ci0gICAgcERpY3QtPlNldEF0TmFtZSgiRmlsdGVyIiwgIkRDVERlY29kZSIpOwotICAgIGlmICghY29sb3JfdHJhbnMpIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFybXMgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgICAgICBwRGljdC0+U2V0QXQoIkRlY29kZVBhcm1zIiwgcFBhcm1zKTsKLSAgICAgICAgcFBhcm1zLT5TZXRBdEludGVnZXIoIkNvbG9yVHJhbnNmb3JtIiwgMCk7Ci0gICAgfQotICAgIG1fYklzTWFzayA9IEZBTFNFOwotICAgIG1fV2lkdGggPSB3aWR0aDsKLSAgICBtX0hlaWdodCA9IGhlaWdodDsKLSAgICBpZiAobV9wU3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgbV9wU3RyZWFtID0gbmV3IENQREZfU3RyZWFtKE5VTEwsIDAsIE5VTEwpOwotICAgIH0KLSAgICByZXR1cm4gcERpY3Q7CisgICAgcERpY3QtPlNldEF0KCJEZWNvZGUiLCBwRGVjb2RlKTsKKyAgfQorICBwRGljdC0+U2V0QXROYW1lKCJDb2xvclNwYWNlIiwgY3NuYW1lKTsKKyAgcERpY3QtPlNldEF0SW50ZWdlcigiQml0c1BlckNvbXBvbmVudCIsIGJpdHMpOworICBwRGljdC0+U2V0QXROYW1lKCJGaWx0ZXIiLCAiRENURGVjb2RlIik7CisgIGlmICghY29sb3JfdHJhbnMpIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBQYXJtcyA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgICAgcERpY3QtPlNldEF0KCJEZWNvZGVQYXJtcyIsIHBQYXJtcyk7CisgICAgcFBhcm1zLT5TZXRBdEludGVnZXIoIkNvbG9yVHJhbnNmb3JtIiwgMCk7CisgIH0KKyAgbV9iSXNNYXNrID0gRkFMU0U7CisgIG1fV2lkdGggPSB3aWR0aDsKKyAgbV9IZWlnaHQgPSBoZWlnaHQ7CisgIGlmICghbV9wU3RyZWFtKSB7CisgICAgbV9wU3RyZWFtID0gbmV3IENQREZfU3RyZWFtKE5VTEwsIDAsIE5VTEwpOworICB9CisgIHJldHVybiBwRGljdDsKIH0KLXZvaWQgQ1BERl9JbWFnZTo6U2V0SnBlZ0ltYWdlKEZYX0xQQllURSBwRGF0YSwgRlhfRFdPUkQgc2l6ZSkKLXsKLSAgICBDUERGX0RpY3Rpb25hcnkgKnBEaWN0ID0gSW5pdEpQRUcocERhdGEsIHNpemUpOwotICAgIGlmICghcERpY3QpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX3BTdHJlYW0tPkluaXRTdHJlYW0ocERhdGEsIHNpemUsIHBEaWN0KTsKK3ZvaWQgQ1BERl9JbWFnZTo6U2V0SnBlZ0ltYWdlKHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplKSB7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBJbml0SlBFRyhwRGF0YSwgc2l6ZSk7CisgIGlmICghcERpY3QpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wU3RyZWFtLT5Jbml0U3RyZWFtKHBEYXRhLCBzaXplLCBwRGljdCk7CiB9Ci12b2lkIENQREZfSW1hZ2U6OlNldEpwZWdJbWFnZShJRlhfRmlsZVJlYWQgKnBGaWxlKQotewotICAgIEZYX0RXT1JEIHNpemUgPSAoRlhfRFdPUkQpcEZpbGUtPkdldFNpemUoKTsKLSAgICBpZiAoIXNpemUpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9EV09SRCBkd0VzdGltYXRlU2l6ZSA9IHNpemU7Ci0gICAgaWYgKGR3RXN0aW1hdGVTaXplID4gODE5MikgewotICAgICAgICBkd0VzdGltYXRlU2l6ZSA9IDgxOTI7Ci0gICAgfQotICAgIEZYX0xQQllURSBwRGF0YSA9IEZYX0FsbG9jKEZYX0JZVEUsIGR3RXN0aW1hdGVTaXplKTsKLSAgICBwRmlsZS0+UmVhZEJsb2NrKHBEYXRhLCAwLCBkd0VzdGltYXRlU2l6ZSk7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5ICpwRGljdCA9IEluaXRKUEVHKHBEYXRhLCBkd0VzdGltYXRlU2l6ZSk7Cit2b2lkIENQREZfSW1hZ2U6OlNldEpwZWdJbWFnZShJRlhfRmlsZVJlYWQqIHBGaWxlKSB7CisgIEZYX0RXT1JEIHNpemUgPSAoRlhfRFdPUkQpcEZpbGUtPkdldFNpemUoKTsKKyAgaWYgKCFzaXplKSB7CisgICAgcmV0dXJuOworICB9CisgIEZYX0RXT1JEIGR3RXN0aW1hdGVTaXplID0gc2l6ZTsKKyAgaWYgKGR3RXN0aW1hdGVTaXplID4gODE5MikgeworICAgIGR3RXN0aW1hdGVTaXplID0gODE5MjsKKyAgfQorICB1aW50OF90KiBwRGF0YSA9IEZYX0FsbG9jKHVpbnQ4X3QsIGR3RXN0aW1hdGVTaXplKTsKKyAgcEZpbGUtPlJlYWRCbG9jayhwRGF0YSwgMCwgZHdFc3RpbWF0ZVNpemUpOworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gSW5pdEpQRUcocERhdGEsIGR3RXN0aW1hdGVTaXplKTsKKyAgRlhfRnJlZShwRGF0YSk7CisgIGlmICghcERpY3QgJiYgc2l6ZSA+IGR3RXN0aW1hdGVTaXplKSB7CisgICAgcERhdGEgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsKKyAgICBwRmlsZS0+UmVhZEJsb2NrKHBEYXRhLCAwLCBzaXplKTsKKyAgICBwRGljdCA9IEluaXRKUEVHKHBEYXRhLCBzaXplKTsKICAgICBGWF9GcmVlKHBEYXRhKTsKLSAgICBpZiAoIXBEaWN0ICYmIHNpemUgPiBkd0VzdGltYXRlU2l6ZSkgewotICAgICAgICBwRGF0YSA9IEZYX0FsbG9jKEZYX0JZVEUsIHNpemUpOwotICAgICAgICBwRmlsZS0+UmVhZEJsb2NrKHBEYXRhLCAwLCBzaXplKTsKLSAgICAgICAgcERpY3QgPSBJbml0SlBFRyhwRGF0YSwgc2l6ZSk7Ci0gICAgICAgIEZYX0ZyZWUocERhdGEpOwotICAgIH0KLSAgICBpZiAoIXBEaWN0KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wU3RyZWFtLT5Jbml0U3RyZWFtKHBGaWxlLCBwRGljdCk7CisgIH0KKyAgaWYgKCFwRGljdCkgeworICAgIHJldHVybjsKKyAgfQorICBtX3BTdHJlYW0tPkluaXRTdHJlYW1Gcm9tRmlsZShwRmlsZSwgcERpY3QpOwogfQotdm9pZCBfRENURW5jb2RlQml0bWFwKENQREZfRGljdGlvbmFyeSAqcEJpdG1hcERpY3QsIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IHF1YWxpdHksIEZYX0xQQllURSAmYnVmLCBGWF9TVFJTSVpFICZzaXplKQotewotfQotdm9pZCBfSkJJRzJFbmNvZGVCaXRtYXAoQ1BERl9EaWN0aW9uYXJ5ICpwQml0bWFwRGljdCwgY29uc3QgQ0ZYX0RJQml0bWFwICpwQml0bWFwLCBDUERGX0RvY3VtZW50ICpwRG9jLCBGWF9MUEJZVEUgJmJ1ZiwgRlhfU1RSU0laRSAmc2l6ZSwgRlhfQk9PTCBiTG9zc0xlc3MpCi17Ci19Ci12b2lkIENQREZfSW1hZ2U6OlNldEltYWdlKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgRlhfSU5UMzIgaUNvbXByZXNzLCBJRlhfRmlsZVdyaXRlICpwRmlsZVdyaXRlLCBJRlhfRmlsZVJlYWQgKnBGaWxlUmVhZCwgY29uc3QgQ0ZYX0RJQml0bWFwKiBwTWFzaywgY29uc3QgQ1BERl9JbWFnZVNldFBhcmFtKiBwUGFyYW0pCi17Ci0gICAgRlhfSU5UMzIgQml0bWFwV2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpOwotICAgIEZYX0lOVDMyIEJpdG1hcEhlaWdodCA9IHBCaXRtYXAtPkdldEhlaWdodCgpOwotICAgIGlmIChCaXRtYXBXaWR0aCA8IDEgfHwgQml0bWFwSGVpZ2h0IDwgMSkgewotICAgICAgICByZXR1cm47Cit2b2lkIF9EQ1RFbmNvZGVCaXRtYXAoQ1BERl9EaWN0aW9uYXJ5KiBwQml0bWFwRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFJiBzaXplKSB7fQordm9pZCBfSkJJRzJFbmNvZGVCaXRtYXAoQ1BERl9EaWN0aW9uYXJ5KiBwQml0bWFwRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSYgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxvc3NMZXNzKSB7fQordm9pZCBDUERGX0ltYWdlOjpTZXRJbWFnZShjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvbXByZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRmlsZVdyaXRlKiBwRmlsZVdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9JbWFnZVNldFBhcmFtKiBwUGFyYW0pIHsKKyAgaW50MzJfdCBCaXRtYXBXaWR0aCA9IHBCaXRtYXAtPkdldFdpZHRoKCk7CisgIGludDMyX3QgQml0bWFwSGVpZ2h0ID0gcEJpdG1hcC0+R2V0SGVpZ2h0KCk7CisgIGlmIChCaXRtYXBXaWR0aCA8IDEgfHwgQml0bWFwSGVpZ2h0IDwgMSkgeworICAgIHJldHVybjsKKyAgfQorICB1aW50OF90KiBzcmNfYnVmID0gcEJpdG1hcC0+R2V0QnVmZmVyKCk7CisgIGludDMyX3Qgc3JjX3BpdGNoID0gcEJpdG1hcC0+R2V0UGl0Y2goKTsKKyAgaW50MzJfdCBicHAgPSBwQml0bWFwLT5HZXRCUFAoKTsKKyAgRlhfQk9PTCBiVXNlTWF0dGUgPQorICAgICAgcFBhcmFtICYmIHBQYXJhbS0+cE1hdHRlQ29sb3IgJiYgKHBCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpOworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgcERpY3QtPlNldEF0TmFtZSgiVHlwZSIsICJYT2JqZWN0Iik7CisgIHBEaWN0LT5TZXRBdE5hbWUoIlN1YnR5cGUiLCAiSW1hZ2UiKTsKKyAgcERpY3QtPlNldEF0SW50ZWdlcigiV2lkdGgiLCBCaXRtYXBXaWR0aCk7CisgIHBEaWN0LT5TZXRBdEludGVnZXIoIkhlaWdodCIsIEJpdG1hcEhlaWdodCk7CisgIHVpbnQ4X3QqIGRlc3RfYnVmID0gTlVMTDsKKyAgRlhfU1RSU0laRSBkZXN0X3BpdGNoID0gMCwgZGVzdF9zaXplID0gMCwgb3BUeXBlID0gLTE7CisgIGlmIChicHAgPT0gMSkgeworICAgIGludDMyX3QgcmVzZXRfYSA9IDAsIHJlc2V0X3IgPSAwLCByZXNldF9nID0gMCwgcmVzZXRfYiA9IDA7CisgICAgaW50MzJfdCBzZXRfYSA9IDAsIHNldF9yID0gMCwgc2V0X2cgPSAwLCBzZXRfYiA9IDA7CisgICAgaWYgKCFwQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7CisgICAgICBBcmdiRGVjb2RlKHBCaXRtYXAtPkdldFBhbGV0dGVBcmdiKDApLCByZXNldF9hLCByZXNldF9yLCByZXNldF9nLAorICAgICAgICAgICAgICAgICByZXNldF9iKTsKKyAgICAgIEFyZ2JEZWNvZGUocEJpdG1hcC0+R2V0UGFsZXR0ZUFyZ2IoMSksIHNldF9hLCBzZXRfciwgc2V0X2csIHNldF9iKTsKICAgICB9Ci0gICAgRlhfTFBCWVRFIHNyY19idWYgPSBwQml0bWFwLT5HZXRCdWZmZXIoKTsKLSAgICBGWF9JTlQzMiBzcmNfcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpOwotICAgIEZYX0lOVDMyIGJwcCA9IHBCaXRtYXAtPkdldEJQUCgpOwotICAgIEZYX0JPT0wgYlVzZU1hdHRlID0gcFBhcmFtICYmIHBQYXJhbS0+cE1hdHRlQ29sb3IgJiYgKHBCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpOwotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotICAgIHBEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIlR5cGUiKSwgRlhfQlNUUkMoIlhPYmplY3QiKSk7Ci0gICAgcERpY3QtPlNldEF0TmFtZShGWF9CU1RSQygiU3VidHlwZSIpLCBGWF9CU1RSQygiSW1hZ2UiKSk7Ci0gICAgcERpY3QtPlNldEF0SW50ZWdlcihGWF9CU1RSQygiV2lkdGgiKSwgQml0bWFwV2lkdGgpOwotICAgIHBEaWN0LT5TZXRBdEludGVnZXIoRlhfQlNUUkMoIkhlaWdodCIpLCBCaXRtYXBIZWlnaHQpOwotICAgIEZYX0xQQllURSBkZXN0X2J1ZiA9IE5VTEw7Ci0gICAgRlhfU1RSU0laRSBkZXN0X3BpdGNoID0gMCwgZGVzdF9zaXplID0gMCwgb3BUeXBlID0gLTE7Ci0gICAgaWYgKGJwcCA9PSAxKSB7Ci0gICAgICAgIEZYX0lOVDMyIHJlc2V0X2EgPSAwLCByZXNldF9yID0gMCwgcmVzZXRfZyA9IDAsIHJlc2V0X2IgPSAwOwotICAgICAgICBGWF9JTlQzMiBzZXRfYSA9IDAsIHNldF9yID0gMCwgc2V0X2cgPSAwLCBzZXRfYiA9IDA7Ci0gICAgICAgIGlmICghcEJpdG1hcC0+SXNBbHBoYU1hc2soKSkgewotICAgICAgICAgICAgQXJnYkRlY29kZShwQml0bWFwLT5HZXRQYWxldHRlQXJnYigwKSwgcmVzZXRfYSwgcmVzZXRfciwgcmVzZXRfZywgcmVzZXRfYik7Ci0gICAgICAgICAgICBBcmdiRGVjb2RlKHBCaXRtYXAtPkdldFBhbGV0dGVBcmdiKDEpLCBzZXRfYSwgc2V0X3IsIHNldF9nLCBzZXRfYik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNldF9hID09IDAgfHwgcmVzZXRfYSA9PSAwKSB7Ci0gICAgICAgICAgICBwRGljdC0+U2V0QXQoRlhfQlNUUkMoIkltYWdlTWFzayIpLCBuZXcgQ1BERl9Cb29sZWFuKFRSVUUpKTsKLSAgICAgICAgICAgIGlmIChyZXNldF9hID09IDApIHsKLSAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBuZXcgQ1BERl9BcnJheTsKLSAgICAgICAgICAgICAgICBwQXJyYXktPkFkZEludGVnZXIoMSk7Ci0gICAgICAgICAgICAgICAgcEFycmF5LT5BZGRJbnRlZ2VyKDApOwotICAgICAgICAgICAgICAgIHBEaWN0LT5TZXRBdChGWF9CU1RSQygiRGVjb2RlIiksIHBBcnJheSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDUERGX0FycmF5KiBwQ1MgPSBuZXcgQ1BERl9BcnJheTsKLSAgICAgICAgICAgIHBDUy0+QWRkTmFtZShGWF9CU1RSQygiSW5kZXhlZCIpKTsKLSAgICAgICAgICAgIHBDUy0+QWRkTmFtZShGWF9CU1RSQygiRGV2aWNlUkdCIikpOwotICAgICAgICAgICAgcENTLT5BZGRJbnRlZ2VyKDEpOwotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3Q7Ci0gICAgICAgICAgICBGWF9MUFNUUiBwQnVmID0gY3QuR2V0QnVmZmVyKDYpOwotICAgICAgICAgICAgcEJ1ZlswXSA9IChGWF9DSEFSKXJlc2V0X3I7Ci0gICAgICAgICAgICBwQnVmWzFdID0gKEZYX0NIQVIpcmVzZXRfZzsKLSAgICAgICAgICAgIHBCdWZbMl0gPSAoRlhfQ0hBUilyZXNldF9iOwotICAgICAgICAgICAgcEJ1ZlszXSA9IChGWF9DSEFSKXNldF9yOwotICAgICAgICAgICAgcEJ1Zls0XSA9IChGWF9DSEFSKXNldF9nOwotICAgICAgICAgICAgcEJ1Zls1XSA9IChGWF9DSEFSKXNldF9iOwotICAgICAgICAgICAgY3QuUmVsZWFzZUJ1ZmZlcig2KTsKLSAgICAgICAgICAgIHBDUy0+QWRkKENQREZfU3RyaW5nOjpDcmVhdGUoY3QsIFRSVUUpKTsKLSAgICAgICAgICAgIHBEaWN0LT5TZXRBdChGWF9CU1RSQygiQ29sb3JTcGFjZSIpLCBwQ1MpOwotICAgICAgICB9Ci0gICAgICAgIHBEaWN0LT5TZXRBdEludGVnZXIoRlhfQlNUUkMoIkJpdHNQZXJDb21wb25lbnQiKSwgMSk7Ci0gICAgICAgIGRlc3RfcGl0Y2ggPSAoQml0bWFwV2lkdGggKyA3KSAvIDg7Ci0gICAgICAgIGlmICgoaUNvbXByZXNzICYgMHgwMykgPT0gUERGX0lNQUdFX05PX0NPTVBSRVNTKSB7Ci0gICAgICAgICAgICBvcFR5cGUgPSAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3BUeXBlID0gMDsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoYnBwID09IDgpIHsKLSAgICAgICAgRlhfSU5UMzIgaVBhbGV0dGUgPSBwQml0bWFwLT5HZXRQYWxldHRlU2l6ZSgpOwotICAgICAgICBpZiAoaVBhbGV0dGUgPiAwKSB7Ci0gICAgICAgICAgICBDUERGX0FycmF5KiBwQ1MgPSBuZXcgQ1BERl9BcnJheTsKLSAgICAgICAgICAgIG1fcERvY3VtZW50LT5BZGRJbmRpcmVjdE9iamVjdChwQ1MpOwotICAgICAgICAgICAgcENTLT5BZGROYW1lKEZYX0JTVFJDKCJJbmRleGVkIikpOwotICAgICAgICAgICAgcENTLT5BZGROYW1lKEZYX0JTVFJDKCJEZXZpY2VSR0IiKSk7Ci0gICAgICAgICAgICBwQ1MtPkFkZEludGVnZXIoaVBhbGV0dGUgLSAxKTsKLSAgICAgICAgICAgIEZYX0xQQllURSBwQ29sb3JUYWJsZSA9IEZYX0FsbG9jMkQoRlhfQllURSwgaVBhbGV0dGUsIDMpOwotICAgICAgICAgICAgRlhfTFBCWVRFIHB0ciA9IHBDb2xvclRhYmxlOwotICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlQYWxldHRlOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgRlhfRFdPUkQgYXJnYiA9IHBCaXRtYXAtPkdldFBhbGV0dGVBcmdiKGkpOwotICAgICAgICAgICAgICAgIHB0clswXSA9IChGWF9CWVRFKShhcmdiID4+IDE2KTsKLSAgICAgICAgICAgICAgICBwdHJbMV0gPSAoRlhfQllURSkoYXJnYiA+PiA4KTsKLSAgICAgICAgICAgICAgICBwdHJbMl0gPSAoRlhfQllURSlhcmdiOwotICAgICAgICAgICAgICAgIHB0ciArPSAzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ1BERl9TdHJlYW0gKnBDVFMgPSBDUERGX1N0cmVhbTo6Q3JlYXRlKHBDb2xvclRhYmxlLCBpUGFsZXR0ZSAqIDMsIENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCkpOwotICAgICAgICAgICAgbV9wRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBDVFMpOwotICAgICAgICAgICAgcENTLT5BZGRSZWZlcmVuY2UobV9wRG9jdW1lbnQsIHBDVFMpOwotICAgICAgICAgICAgcERpY3QtPlNldEF0UmVmZXJlbmNlKEZYX0JTVFJDKCJDb2xvclNwYWNlIiksIG1fcERvY3VtZW50LCBwQ1MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcERpY3QtPlNldEF0TmFtZShGWF9CU1RSQygiQ29sb3JTcGFjZSIpLCBGWF9CU1RSQygiRGV2aWNlR3JheSIpKTsKLSAgICAgICAgfQotICAgICAgICBwRGljdC0+U2V0QXRJbnRlZ2VyKEZYX0JTVFJDKCJCaXRzUGVyQ29tcG9uZW50IiksIDgpOwotICAgICAgICBpZiAoKGlDb21wcmVzcyAmIDB4MDMpID09IFBERl9JTUFHRV9OT19DT01QUkVTUykgewotICAgICAgICAgICAgZGVzdF9waXRjaCA9IEJpdG1hcFdpZHRoOwotICAgICAgICAgICAgb3BUeXBlID0gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9wVHlwZSA9IDA7Ci0gICAgICAgIH0KKyAgICBpZiAoc2V0X2EgPT0gMCB8fCByZXNldF9hID09IDApIHsKKyAgICAgIHBEaWN0LT5TZXRBdCgiSW1hZ2VNYXNrIiwgbmV3IENQREZfQm9vbGVhbihUUlVFKSk7CisgICAgICBpZiAocmVzZXRfYSA9PSAwKSB7CisgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IG5ldyBDUERGX0FycmF5OworICAgICAgICBwQXJyYXktPkFkZEludGVnZXIoMSk7CisgICAgICAgIHBBcnJheS0+QWRkSW50ZWdlcigwKTsKKyAgICAgICAgcERpY3QtPlNldEF0KCJEZWNvZGUiLCBwQXJyYXkpOworICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIHBEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIkNvbG9yU3BhY2UiKSwgRlhfQlNUUkMoIkRldmljZVJHQiIpKTsKLSAgICAgICAgcERpY3QtPlNldEF0SW50ZWdlcihGWF9CU1RSQygiQml0c1BlckNvbXBvbmVudCIpLCA4KTsKLSAgICAgICAgaWYgKChpQ29tcHJlc3MgJiAweDAzKSA9PSBQREZfSU1BR0VfTk9fQ09NUFJFU1MpIHsKLSAgICAgICAgICAgIGRlc3RfcGl0Y2ggPSBCaXRtYXBXaWR0aCAqIDM7Ci0gICAgICAgICAgICBvcFR5cGUgPSAyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3BUeXBlID0gMDsKLSAgICAgICAgfQorICAgICAgQ1BERl9BcnJheSogcENTID0gbmV3IENQREZfQXJyYXk7CisgICAgICBwQ1MtPkFkZE5hbWUoIkluZGV4ZWQiKTsKKyAgICAgIHBDUy0+QWRkTmFtZSgiRGV2aWNlUkdCIik7CisgICAgICBwQ1MtPkFkZEludGVnZXIoMSk7CisgICAgICBDRlhfQnl0ZVN0cmluZyBjdDsKKyAgICAgIEZYX0NIQVIqIHBCdWYgPSBjdC5HZXRCdWZmZXIoNik7CisgICAgICBwQnVmWzBdID0gKEZYX0NIQVIpcmVzZXRfcjsKKyAgICAgIHBCdWZbMV0gPSAoRlhfQ0hBUilyZXNldF9nOworICAgICAgcEJ1ZlsyXSA9IChGWF9DSEFSKXJlc2V0X2I7CisgICAgICBwQnVmWzNdID0gKEZYX0NIQVIpc2V0X3I7CisgICAgICBwQnVmWzRdID0gKEZYX0NIQVIpc2V0X2c7CisgICAgICBwQnVmWzVdID0gKEZYX0NIQVIpc2V0X2I7CisgICAgICBjdC5SZWxlYXNlQnVmZmVyKDYpOworICAgICAgcENTLT5BZGQobmV3IENQREZfU3RyaW5nKGN0LCBUUlVFKSk7CisgICAgICBwRGljdC0+U2V0QXQoIkNvbG9yU3BhY2UiLCBwQ1MpOwogICAgIH0KLSAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBNYXNrQml0bWFwID0gTlVMTDsKLSAgICBGWF9CT09MIGJEZWxldGVNYXNrID0gRkFMU0U7Ci0gICAgaWYgKHBCaXRtYXAtPkhhc0FscGhhKCkpIHsKLSAgICAgICAgcE1hc2tCaXRtYXAgPSBwQml0bWFwLT5HZXRBbHBoYU1hc2soKTsKLSAgICAgICAgYkRlbGV0ZU1hc2sgPSBUUlVFOwotICAgIH0KLSAgICBpZiAoIXBNYXNrQml0bWFwICYmIHBNYXNrKSB7Ci0gICAgICAgIEZYRElCX0Zvcm1hdCBtYXNrRm9ybWF0ID0gcE1hc2stPkdldEZvcm1hdCgpOwotICAgICAgICBpZiAobWFza0Zvcm1hdCA9PSBGWERJQl8xYnBwTWFzayB8fCBtYXNrRm9ybWF0ID09IEZYRElCXzhicHBNYXNrKSB7Ci0gICAgICAgICAgICBwTWFza0JpdG1hcCA9IHBNYXNrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwTWFza0JpdG1hcCkgewotICAgICAgICBGWF9JTlQzMiBtYXNrV2lkdGggPSBwTWFza0JpdG1hcC0+R2V0V2lkdGgoKTsKLSAgICAgICAgRlhfSU5UMzIgbWFza0hlaWdodCA9IHBNYXNrQml0bWFwLT5HZXRIZWlnaHQoKTsKLSAgICAgICAgRlhfTFBCWVRFIG1hc2tfYnVmID0gTlVMTDsKLSAgICAgICAgRlhfU1RSU0laRSBtYXNrX3NpemU7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcE1hc2tEaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKLSAgICAgICAgcE1hc2tEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIlR5cGUiKSwgRlhfQlNUUkMoIlhPYmplY3QiKSk7Ci0gICAgICAgIHBNYXNrRGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJTdWJ0eXBlIiksIEZYX0JTVFJDKCJJbWFnZSIpKTsKLSAgICAgICAgcE1hc2tEaWN0LT5TZXRBdEludGVnZXIoRlhfQlNUUkMoIldpZHRoIiksIG1hc2tXaWR0aCk7Ci0gICAgICAgIHBNYXNrRGljdC0+U2V0QXRJbnRlZ2VyKEZYX0JTVFJDKCJIZWlnaHQiKSwgbWFza0hlaWdodCk7Ci0gICAgICAgIHBNYXNrRGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJDb2xvclNwYWNlIiksIEZYX0JTVFJDKCJEZXZpY2VHcmF5IikpOwotICAgICAgICBwTWFza0RpY3QtPlNldEF0SW50ZWdlcihGWF9CU1RSQygiQml0c1BlckNvbXBvbmVudCIpLCA4KTsKLSAgICAgICAgaWYgKHBNYXNrQml0bWFwLT5HZXRCUFAoKSA9PSA4ICYmIChpQ29tcHJlc3MgJiBQREZfSU1BR0VfTUFTS19MT1NTWV9DT01QUkVTUykgIT0gMCkgewotICAgICAgICAgICAgX0RDVEVuY29kZUJpdG1hcChwTWFza0RpY3QsIHBNYXNrQml0bWFwLCBwUGFyYW0gPyBwUGFyYW0tPm5RdWFsaXR5IDogNzUsIG1hc2tfYnVmLCBtYXNrX3NpemUpOwotICAgICAgICB9IGVsc2UgaWYgKHBNYXNrQml0bWFwLT5HZXRGb3JtYXQoKSA9PSBGWERJQl8xYnBwTWFzaykgewotICAgICAgICAgICAgX0pCSUcyRW5jb2RlQml0bWFwKHBNYXNrRGljdCwgcE1hc2tCaXRtYXAsIG1fcERvY3VtZW50LCBtYXNrX2J1ZiwgbWFza19zaXplLCBUUlVFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1hc2tfYnVmID0gRlhfQWxsb2MyRChGWF9CWVRFLCBtYXNrSGVpZ2h0LCBtYXNrV2lkdGgpOwotICAgICAgICAgICAgbWFza19zaXplID0gbWFza0hlaWdodCAqIG1hc2tXaWR0aDsgIC8vIFNhZmUgc2luY2UgY2hlY2tlZCBhbGxvYyByZXR1cm5lZC4KLSAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgYSA9IDA7IGEgPCBtYXNrSGVpZ2h0OyBhICsrKSB7Ci0gICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIobWFza19idWYgKyBhICogbWFza1dpZHRoLCBwTWFza0JpdG1hcC0+R2V0U2NhbmxpbmUoYSksIG1hc2tXaWR0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcE1hc2tEaWN0LT5TZXRBdEludGVnZXIoRlhfQlNUUkMoIkxlbmd0aCIpLCBtYXNrX3NpemUpOwotICAgICAgICBpZiAoYlVzZU1hdHRlKSB7Ci0gICAgICAgICAgICBpbnQgYSwgciwgZywgYjsKLSAgICAgICAgICAgIEFyZ2JEZWNvZGUoKihwUGFyYW0tPnBNYXR0ZUNvbG9yKSwgYSwgciwgZywgYik7Ci0gICAgICAgICAgICBDUERGX0FycmF5KiBwTWF0dGUgPSBuZXcgQ1BERl9BcnJheTsKLSAgICAgICAgICAgIHBNYXR0ZS0+QWRkSW50ZWdlcihyKTsKLSAgICAgICAgICAgIHBNYXR0ZS0+QWRkSW50ZWdlcihnKTsKLSAgICAgICAgICAgIHBNYXR0ZS0+QWRkSW50ZWdlcihiKTsKLSAgICAgICAgICAgIHBNYXNrRGljdC0+U2V0QXQoRlhfQlNUUkMoIk1hdHRlIiksIHBNYXR0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9TdHJlYW0qIHBNYXNrU3RyZWFtID0gbmV3IENQREZfU3RyZWFtKG1hc2tfYnVmLCBtYXNrX3NpemUsIHBNYXNrRGljdCk7Ci0gICAgICAgIG1fcERvY3VtZW50LT5BZGRJbmRpcmVjdE9iamVjdChwTWFza1N0cmVhbSk7Ci0gICAgICAgIHBEaWN0LT5TZXRBdFJlZmVyZW5jZShGWF9CU1RSQygiU01hc2siKSwgbV9wRG9jdW1lbnQsIHBNYXNrU3RyZWFtKTsKLSAgICAgICAgaWYgKGJEZWxldGVNYXNrKSB7Ci0gICAgICAgICAgICBkZWxldGUgcE1hc2tCaXRtYXA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlhfQk9PTCBiU3RyZWFtID0gcEZpbGVXcml0ZSAhPSBOVUxMICYmIHBGaWxlUmVhZCAhPSBOVUxMOwotICAgIGlmIChvcFR5cGUgPT0gMCkgewotICAgICAgICBpZiAoaUNvbXByZXNzICYgUERGX0lNQUdFX0xPU1NMRVNTX0NPTVBSRVNTKSB7Ci0gICAgICAgICAgICBpZiAocEJpdG1hcC0+R2V0QlBQKCkgPT0gMSkgewotICAgICAgICAgICAgICAgIF9KQklHMkVuY29kZUJpdG1hcChwRGljdCwgcEJpdG1hcCwgbV9wRG9jdW1lbnQsIGRlc3RfYnVmLCBkZXN0X3NpemUsIFRSVUUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHBCaXRtYXAtPkdldEJQUCgpID09IDEpIHsKLSAgICAgICAgICAgICAgICBfSkJJRzJFbmNvZGVCaXRtYXAocERpY3QsIHBCaXRtYXAsIG1fcERvY3VtZW50LCBkZXN0X2J1ZiwgZGVzdF9zaXplLCBGQUxTRSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBCaXRtYXAtPkdldEJQUCgpID49IDggJiYgcEJpdG1hcC0+R2V0UGFsZXR0ZSgpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAgKnBOZXdCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwKCk7Ci0gICAgICAgICAgICAgICAgcE5ld0JpdG1hcC0+Q29weShwQml0bWFwKTsKLSAgICAgICAgICAgICAgICBwTmV3Qml0bWFwLT5Db252ZXJ0Rm9ybWF0KEZYRElCX1JnYik7Ci0gICAgICAgICAgICAgICAgU2V0SW1hZ2UocE5ld0JpdG1hcCwgaUNvbXByZXNzLCBwRmlsZVdyaXRlLCBwRmlsZVJlYWQpOwotICAgICAgICAgICAgICAgIGlmIChwRGljdCkgewotICAgICAgICAgICAgICAgICAgICBwRGljdC0+UmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBwRGljdCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChkZXN0X2J1ZikgewotICAgICAgICAgICAgICAgICAgICBGWF9GcmVlKGRlc3RfYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9idWYgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0X3NpemUgPSAwOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBwTmV3Qml0bWFwOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJVc2VNYXR0ZSkgewotICAgICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAgKnBOZXdCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwKCk7Ci0gICAgICAgICAgICAgICAgICAgIHBOZXdCaXRtYXAtPkNyZWF0ZShCaXRtYXBXaWR0aCwgQml0bWFwSGVpZ2h0LCBGWERJQl9BcmdiKTsKLSAgICAgICAgICAgICAgICAgICAgRlhfTFBCWVRFIGRzdF9idWYgPSBwTmV3Qml0bWFwLT5HZXRCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgc3JjX29mZnNldCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgcm93ID0gMDsgcm93IDwgQml0bWFwSGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19vZmZzZXQgPSByb3cgKiBzcmNfcGl0Y2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGNvbHVtbiA9IDA7IGNvbHVtbiA8IEJpdG1hcFdpZHRoOyBjb2x1bW4gKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBhbHBoYSA9IHNyY19idWZbc3JjX29mZnNldCArIDNdIC8gMjU1LjBmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9idWZbc3JjX29mZnNldF0gPSAoRlhfQllURSkoc3JjX2J1ZltzcmNfb2Zmc2V0XSAqIGFscGhhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYnVmW3NyY19vZmZzZXQgKyAxXSA9IChGWF9CWVRFKShzcmNfYnVmW3NyY19vZmZzZXQgKyAxXSAqIGFscGhhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYnVmW3NyY19vZmZzZXQgKyAyXSA9IChGWF9CWVRFKShzcmNfYnVmW3NyY19vZmZzZXQgKyAyXSAqIGFscGhhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYnVmW3NyY19vZmZzZXQgKyAzXSA9IChGWF9CWVRFKShzcmNfYnVmW3NyY19vZmZzZXQgKyAzXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX29mZnNldCArPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIF9EQ1RFbmNvZGVCaXRtYXAocERpY3QsIHBOZXdCaXRtYXAsIHBQYXJhbSA/IHBQYXJhbS0+blF1YWxpdHkgOiA3NSwgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwTmV3Qml0bWFwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIF9EQ1RFbmNvZGVCaXRtYXAocERpY3QsIHBCaXRtYXAsIHBQYXJhbSA/IHBQYXJhbS0+blF1YWxpdHkgOiA3NSwgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChiU3RyZWFtKSB7Ci0gICAgICAgICAgICBwRmlsZVdyaXRlLT5Xcml0ZUJsb2NrKGRlc3RfYnVmLCBkZXN0X3NpemUpOwotICAgICAgICAgICAgRlhfRnJlZShkZXN0X2J1Zik7Ci0gICAgICAgICAgICBkZXN0X2J1ZiA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG9wVHlwZSA9PSAxKSB7Ci0gICAgICAgIGlmICghYlN0cmVhbSkgewotICAgICAgICAgICAgZGVzdF9idWYgPSBGWF9BbGxvYzJEKEZYX0JZVEUsIGRlc3RfcGl0Y2gsIEJpdG1hcEhlaWdodCk7Ci0gICAgICAgICAgICBkZXN0X3NpemUgPSBkZXN0X3BpdGNoICogQml0bWFwSGVpZ2h0OyAgLy8gU2FmZSBzaW5jZSBjaGVja2VkIGFsbG9jIHJldHVybmVkLgotICAgICAgICB9Ci0gICAgICAgIEZYX0xQQllURSBwRGVzdCA9IGRlc3RfYnVmOwotICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgQml0bWFwSGVpZ2h0OyBpICsrKSB7Ci0gICAgICAgICAgICBpZiAoIWJTdHJlYW0pIHsKLSAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkzMihwRGVzdCwgc3JjX2J1ZiwgZGVzdF9waXRjaCk7Ci0gICAgICAgICAgICAgICAgcERlc3QgKz0gZGVzdF9waXRjaDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcEZpbGVXcml0ZS0+V3JpdGVCbG9jayhzcmNfYnVmLCBkZXN0X3BpdGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNyY19idWYgKz0gc3JjX3BpdGNoOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChvcFR5cGUgPT0gMikgewotICAgICAgICBpZiAoIWJTdHJlYW0pIHsKLSAgICAgICAgICAgIGRlc3RfYnVmID0gRlhfQWxsb2MyRChGWF9CWVRFLCBkZXN0X3BpdGNoLCBCaXRtYXBIZWlnaHQpOwotICAgICAgICAgICAgZGVzdF9zaXplID0gZGVzdF9waXRjaCAqIEJpdG1hcEhlaWdodDsgIC8vIFNhZmUgc2luY2UgY2hlY2tlZCBhbGxvYyByZXR1cm5lZC4KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlc3RfYnVmID0gRlhfQWxsb2MoRlhfQllURSwgZGVzdF9waXRjaCk7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfTFBCWVRFIHBEZXN0ID0gZGVzdF9idWY7Ci0gICAgICAgIEZYX0lOVDMyIHNyY19vZmZzZXQgPSAwOwotICAgICAgICBGWF9JTlQzMiBkZXN0X29mZnNldCA9IDA7Ci0gICAgICAgIGZvciAoRlhfSU5UMzIgcm93ID0gMDsgcm93IDwgQml0bWFwSGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgIHNyY19vZmZzZXQgPSByb3cgKiBzcmNfcGl0Y2g7Ci0gICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGNvbHVtbiA9IDA7IGNvbHVtbiA8IEJpdG1hcFdpZHRoOyBjb2x1bW4gKyspIHsKLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBhbHBoYSA9IGJVc2VNYXR0ZSA/IHNyY19idWZbc3JjX29mZnNldCArIDNdIC8gMjU1LjBmIDogMTsKLSAgICAgICAgICAgICAgICBwRGVzdFtkZXN0X29mZnNldF0gPSAoRlhfQllURSkoc3JjX2J1ZltzcmNfb2Zmc2V0ICsgMl0gKiBhbHBoYSk7Ci0gICAgICAgICAgICAgICAgcERlc3RbZGVzdF9vZmZzZXQgKyAxXSA9IChGWF9CWVRFKShzcmNfYnVmW3NyY19vZmZzZXQgKyAxXSAqIGFscGhhKTsKLSAgICAgICAgICAgICAgICBwRGVzdFtkZXN0X29mZnNldCArIDJdID0gKEZYX0JZVEUpKHNyY19idWZbc3JjX29mZnNldF0gKiBhbHBoYSk7Ci0gICAgICAgICAgICAgICAgZGVzdF9vZmZzZXQgKz0gMzsKLSAgICAgICAgICAgICAgICBzcmNfb2Zmc2V0ICs9IGJwcCA9PSAyNCA/IDMgOiA0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJTdHJlYW0pIHsKLSAgICAgICAgICAgICAgICBwRmlsZVdyaXRlLT5Xcml0ZUJsb2NrKHBEZXN0LCBkZXN0X3BpdGNoKTsKLSAgICAgICAgICAgICAgICBwRGVzdCA9IGRlc3RfYnVmOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwRGVzdCArPSBkZXN0X3BpdGNoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9vZmZzZXQgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiU3RyZWFtKSB7Ci0gICAgICAgICAgICBGWF9GcmVlKGRlc3RfYnVmKTsKLSAgICAgICAgICAgIGRlc3RfYnVmID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9wU3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgbV9wU3RyZWFtID0gbmV3IENQREZfU3RyZWFtKE5VTEwsIDAsIE5VTEwpOwotICAgIH0KLSAgICBpZiAoIWJTdHJlYW0pIHsKLSAgICAgICAgbV9wU3RyZWFtLT5Jbml0U3RyZWFtKGRlc3RfYnVmLCBkZXN0X3NpemUsIHBEaWN0KTsKKyAgICBwRGljdC0+U2V0QXRJbnRlZ2VyKCJCaXRzUGVyQ29tcG9uZW50IiwgMSk7CisgICAgZGVzdF9waXRjaCA9IChCaXRtYXBXaWR0aCArIDcpIC8gODsKKyAgICBpZiAoKGlDb21wcmVzcyAmIDB4MDMpID09IFBERl9JTUFHRV9OT19DT01QUkVTUykgeworICAgICAgb3BUeXBlID0gMTsKICAgICB9IGVsc2UgewotICAgICAgICBwRmlsZVdyaXRlLT5GbHVzaCgpOwotICAgICAgICBtX3BTdHJlYW0tPkluaXRTdHJlYW0ocEZpbGVSZWFkLCBwRGljdCk7CisgICAgICBvcFR5cGUgPSAwOwogICAgIH0KLSAgICBtX2JJc01hc2sgPSBwQml0bWFwLT5Jc0FscGhhTWFzaygpOwotICAgIG1fV2lkdGggPSBCaXRtYXBXaWR0aDsKLSAgICBtX0hlaWdodCA9IEJpdG1hcEhlaWdodDsKLSAgICBpZiAoZGVzdF9idWYpIHsKKyAgfSBlbHNlIGlmIChicHAgPT0gOCkgeworICAgIGludDMyX3QgaVBhbGV0dGUgPSBwQml0bWFwLT5HZXRQYWxldHRlU2l6ZSgpOworICAgIGlmIChpUGFsZXR0ZSA+IDApIHsKKyAgICAgIENQREZfQXJyYXkqIHBDUyA9IG5ldyBDUERGX0FycmF5OworICAgICAgbV9wRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBDUyk7CisgICAgICBwQ1MtPkFkZE5hbWUoIkluZGV4ZWQiKTsKKyAgICAgIHBDUy0+QWRkTmFtZSgiRGV2aWNlUkdCIik7CisgICAgICBwQ1MtPkFkZEludGVnZXIoaVBhbGV0dGUgLSAxKTsKKyAgICAgIHVpbnQ4X3QqIHBDb2xvclRhYmxlID0gRlhfQWxsb2MyRCh1aW50OF90LCBpUGFsZXR0ZSwgMyk7CisgICAgICB1aW50OF90KiBwdHIgPSBwQ29sb3JUYWJsZTsKKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlQYWxldHRlOyBpKyspIHsKKyAgICAgICAgRlhfRFdPUkQgYXJnYiA9IHBCaXRtYXAtPkdldFBhbGV0dGVBcmdiKGkpOworICAgICAgICBwdHJbMF0gPSAodWludDhfdCkoYXJnYiA+PiAxNik7CisgICAgICAgIHB0clsxXSA9ICh1aW50OF90KShhcmdiID4+IDgpOworICAgICAgICBwdHJbMl0gPSAodWludDhfdClhcmdiOworICAgICAgICBwdHIgKz0gMzsKKyAgICAgIH0KKyAgICAgIENQREZfU3RyZWFtKiBwQ1RTID0KKyAgICAgICAgICBuZXcgQ1BERl9TdHJlYW0ocENvbG9yVGFibGUsIGlQYWxldHRlICogMywgbmV3IENQREZfRGljdGlvbmFyeSk7CisgICAgICBtX3BEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocENUUyk7CisgICAgICBwQ1MtPkFkZFJlZmVyZW5jZShtX3BEb2N1bWVudCwgcENUUyk7CisgICAgICBwRGljdC0+U2V0QXRSZWZlcmVuY2UoIkNvbG9yU3BhY2UiLCBtX3BEb2N1bWVudCwgcENTKTsKKyAgICB9IGVsc2UgeworICAgICAgcERpY3QtPlNldEF0TmFtZSgiQ29sb3JTcGFjZSIsICJEZXZpY2VHcmF5Iik7CisgICAgfQorICAgIHBEaWN0LT5TZXRBdEludGVnZXIoIkJpdHNQZXJDb21wb25lbnQiLCA4KTsKKyAgICBpZiAoKGlDb21wcmVzcyAmIDB4MDMpID09IFBERl9JTUFHRV9OT19DT01QUkVTUykgeworICAgICAgZGVzdF9waXRjaCA9IEJpdG1hcFdpZHRoOworICAgICAgb3BUeXBlID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgb3BUeXBlID0gMDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcERpY3QtPlNldEF0TmFtZSgiQ29sb3JTcGFjZSIsICJEZXZpY2VSR0IiKTsKKyAgICBwRGljdC0+U2V0QXRJbnRlZ2VyKCJCaXRzUGVyQ29tcG9uZW50IiwgOCk7CisgICAgaWYgKChpQ29tcHJlc3MgJiAweDAzKSA9PSBQREZfSU1BR0VfTk9fQ09NUFJFU1MpIHsKKyAgICAgIGRlc3RfcGl0Y2ggPSBCaXRtYXBXaWR0aCAqIDM7CisgICAgICBvcFR5cGUgPSAyOworICAgIH0gZWxzZSB7CisgICAgICBvcFR5cGUgPSAwOworICAgIH0KKyAgfQorICBjb25zdCBDRlhfRElCaXRtYXAqIHBNYXNrQml0bWFwID0gTlVMTDsKKyAgRlhfQk9PTCBiRGVsZXRlTWFzayA9IEZBTFNFOworICBpZiAocEJpdG1hcC0+SGFzQWxwaGEoKSkgeworICAgIHBNYXNrQml0bWFwID0gcEJpdG1hcC0+R2V0QWxwaGFNYXNrKCk7CisgICAgYkRlbGV0ZU1hc2sgPSBUUlVFOworICB9CisgIGlmICghcE1hc2tCaXRtYXAgJiYgcE1hc2spIHsKKyAgICBGWERJQl9Gb3JtYXQgbWFza0Zvcm1hdCA9IHBNYXNrLT5HZXRGb3JtYXQoKTsKKyAgICBpZiAobWFza0Zvcm1hdCA9PSBGWERJQl8xYnBwTWFzayB8fCBtYXNrRm9ybWF0ID09IEZYRElCXzhicHBNYXNrKSB7CisgICAgICBwTWFza0JpdG1hcCA9IHBNYXNrOworICAgIH0KKyAgfQorICBpZiAocE1hc2tCaXRtYXApIHsKKyAgICBpbnQzMl90IG1hc2tXaWR0aCA9IHBNYXNrQml0bWFwLT5HZXRXaWR0aCgpOworICAgIGludDMyX3QgbWFza0hlaWdodCA9IHBNYXNrQml0bWFwLT5HZXRIZWlnaHQoKTsKKyAgICB1aW50OF90KiBtYXNrX2J1ZiA9IE5VTEw7CisgICAgRlhfU1RSU0laRSBtYXNrX3NpemUgPSAwOworICAgIENQREZfRGljdGlvbmFyeSogcE1hc2tEaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgICBwTWFza0RpY3QtPlNldEF0TmFtZSgiVHlwZSIsICJYT2JqZWN0Iik7CisgICAgcE1hc2tEaWN0LT5TZXRBdE5hbWUoIlN1YnR5cGUiLCAiSW1hZ2UiKTsKKyAgICBwTWFza0RpY3QtPlNldEF0SW50ZWdlcigiV2lkdGgiLCBtYXNrV2lkdGgpOworICAgIHBNYXNrRGljdC0+U2V0QXRJbnRlZ2VyKCJIZWlnaHQiLCBtYXNrSGVpZ2h0KTsKKyAgICBwTWFza0RpY3QtPlNldEF0TmFtZSgiQ29sb3JTcGFjZSIsICJEZXZpY2VHcmF5Iik7CisgICAgcE1hc2tEaWN0LT5TZXRBdEludGVnZXIoIkJpdHNQZXJDb21wb25lbnQiLCA4KTsKKyAgICBpZiAocE1hc2tCaXRtYXAtPkdldEJQUCgpID09IDggJiYKKyAgICAgICAgKGlDb21wcmVzcyAmIFBERl9JTUFHRV9NQVNLX0xPU1NZX0NPTVBSRVNTKSAhPSAwKSB7CisgICAgICBfRENURW5jb2RlQml0bWFwKHBNYXNrRGljdCwgcE1hc2tCaXRtYXAsIHBQYXJhbSA/IHBQYXJhbS0+blF1YWxpdHkgOiA3NSwKKyAgICAgICAgICAgICAgICAgICAgICAgbWFza19idWYsIG1hc2tfc2l6ZSk7CisgICAgfSBlbHNlIGlmIChwTWFza0JpdG1hcC0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfMWJwcE1hc2spIHsKKyAgICAgIF9KQklHMkVuY29kZUJpdG1hcChwTWFza0RpY3QsIHBNYXNrQml0bWFwLCBtX3BEb2N1bWVudCwgbWFza19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWFza19zaXplLCBUUlVFKTsKKyAgICB9IGVsc2UgeworICAgICAgbWFza19idWYgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIG1hc2tIZWlnaHQsIG1hc2tXaWR0aCk7CisgICAgICBtYXNrX3NpemUgPSBtYXNrSGVpZ2h0ICogbWFza1dpZHRoOyAgLy8gU2FmZSBzaW5jZSBjaGVja2VkIGFsbG9jIHJldHVybmVkLgorICAgICAgZm9yIChpbnQzMl90IGEgPSAwOyBhIDwgbWFza0hlaWdodDsgYSsrKSB7CisgICAgICAgIEZYU1lTX21lbWNweShtYXNrX2J1ZiArIGEgKiBtYXNrV2lkdGgsIHBNYXNrQml0bWFwLT5HZXRTY2FubGluZShhKSwKKyAgICAgICAgICAgICAgICAgICAgIG1hc2tXaWR0aCk7CisgICAgICB9CisgICAgfQorICAgIHBNYXNrRGljdC0+U2V0QXRJbnRlZ2VyKCJMZW5ndGgiLCBtYXNrX3NpemUpOworICAgIGlmIChiVXNlTWF0dGUpIHsKKyAgICAgIGludCBhLCByLCBnLCBiOworICAgICAgQXJnYkRlY29kZSgqKHBQYXJhbS0+cE1hdHRlQ29sb3IpLCBhLCByLCBnLCBiKTsKKyAgICAgIENQREZfQXJyYXkqIHBNYXR0ZSA9IG5ldyBDUERGX0FycmF5OworICAgICAgcE1hdHRlLT5BZGRJbnRlZ2VyKHIpOworICAgICAgcE1hdHRlLT5BZGRJbnRlZ2VyKGcpOworICAgICAgcE1hdHRlLT5BZGRJbnRlZ2VyKGIpOworICAgICAgcE1hc2tEaWN0LT5TZXRBdCgiTWF0dGUiLCBwTWF0dGUpOworICAgIH0KKyAgICBDUERGX1N0cmVhbSogcE1hc2tTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW0obWFza19idWYsIG1hc2tfc2l6ZSwgcE1hc2tEaWN0KTsKKyAgICBtX3BEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocE1hc2tTdHJlYW0pOworICAgIHBEaWN0LT5TZXRBdFJlZmVyZW5jZSgiU01hc2siLCBtX3BEb2N1bWVudCwgcE1hc2tTdHJlYW0pOworICAgIGlmIChiRGVsZXRlTWFzaykgeworICAgICAgZGVsZXRlIHBNYXNrQml0bWFwOworICAgIH0KKyAgfQorICBGWF9CT09MIGJTdHJlYW0gPSBwRmlsZVdyaXRlICYmIHBGaWxlUmVhZDsKKyAgaWYgKG9wVHlwZSA9PSAwKSB7CisgICAgaWYgKGlDb21wcmVzcyAmIFBERl9JTUFHRV9MT1NTTEVTU19DT01QUkVTUykgeworICAgICAgaWYgKHBCaXRtYXAtPkdldEJQUCgpID09IDEpIHsKKyAgICAgICAgX0pCSUcyRW5jb2RlQml0bWFwKHBEaWN0LCBwQml0bWFwLCBtX3BEb2N1bWVudCwgZGVzdF9idWYsIGRlc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAocEJpdG1hcC0+R2V0QlBQKCkgPT0gMSkgeworICAgICAgICBfSkJJRzJFbmNvZGVCaXRtYXAocERpY3QsIHBCaXRtYXAsIG1fcERvY3VtZW50LCBkZXN0X2J1ZiwgZGVzdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOworICAgICAgfSBlbHNlIGlmIChwQml0bWFwLT5HZXRCUFAoKSA+PSA4ICYmIHBCaXRtYXAtPkdldFBhbGV0dGUoKSkgeworICAgICAgICBDRlhfRElCaXRtYXAqIHBOZXdCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwKCk7CisgICAgICAgIHBOZXdCaXRtYXAtPkNvcHkocEJpdG1hcCk7CisgICAgICAgIHBOZXdCaXRtYXAtPkNvbnZlcnRGb3JtYXQoRlhESUJfUmdiKTsKKyAgICAgICAgU2V0SW1hZ2UocE5ld0JpdG1hcCwgaUNvbXByZXNzLCBwRmlsZVdyaXRlLCBwRmlsZVJlYWQpOworICAgICAgICBpZiAocERpY3QpIHsKKyAgICAgICAgICBwRGljdC0+UmVsZWFzZSgpOworICAgICAgICAgIHBEaWN0ID0gTlVMTDsKKyAgICAgICAgfQogICAgICAgICBGWF9GcmVlKGRlc3RfYnVmKTsKKyAgICAgICAgZGVzdF9idWYgPSBOVUxMOworICAgICAgICBkZXN0X3NpemUgPSAwOworICAgICAgICBkZWxldGUgcE5ld0JpdG1hcDsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGJVc2VNYXR0ZSkgeworICAgICAgICAgIENGWF9ESUJpdG1hcCogcE5ld0JpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXAoKTsKKyAgICAgICAgICBwTmV3Qml0bWFwLT5DcmVhdGUoQml0bWFwV2lkdGgsIEJpdG1hcEhlaWdodCwgRlhESUJfQXJnYik7CisgICAgICAgICAgdWludDhfdCogZHN0X2J1ZiA9IHBOZXdCaXRtYXAtPkdldEJ1ZmZlcigpOworICAgICAgICAgIGludDMyX3Qgc3JjX29mZnNldCA9IDA7CisgICAgICAgICAgZm9yIChpbnQzMl90IHJvdyA9IDA7IHJvdyA8IEJpdG1hcEhlaWdodDsgcm93KyspIHsKKyAgICAgICAgICAgIHNyY19vZmZzZXQgPSByb3cgKiBzcmNfcGl0Y2g7CisgICAgICAgICAgICBmb3IgKGludDMyX3QgY29sdW1uID0gMDsgY29sdW1uIDwgQml0bWFwV2lkdGg7IGNvbHVtbisrKSB7CisgICAgICAgICAgICAgIEZYX0ZMT0FUIGFscGhhID0gc3JjX2J1ZltzcmNfb2Zmc2V0ICsgM10gLyAyNTUuMGY7CisgICAgICAgICAgICAgIGRzdF9idWZbc3JjX29mZnNldF0gPSAodWludDhfdCkoc3JjX2J1ZltzcmNfb2Zmc2V0XSAqIGFscGhhKTsKKyAgICAgICAgICAgICAgZHN0X2J1ZltzcmNfb2Zmc2V0ICsgMV0gPQorICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QpKHNyY19idWZbc3JjX29mZnNldCArIDFdICogYWxwaGEpOworICAgICAgICAgICAgICBkc3RfYnVmW3NyY19vZmZzZXQgKyAyXSA9CisgICAgICAgICAgICAgICAgICAodWludDhfdCkoc3JjX2J1ZltzcmNfb2Zmc2V0ICsgMl0gKiBhbHBoYSk7CisgICAgICAgICAgICAgIGRzdF9idWZbc3JjX29mZnNldCArIDNdID0gKHVpbnQ4X3QpKHNyY19idWZbc3JjX29mZnNldCArIDNdKTsKKyAgICAgICAgICAgICAgc3JjX29mZnNldCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBfRENURW5jb2RlQml0bWFwKHBEaWN0LCBwTmV3Qml0bWFwLCBwUGFyYW0gPyBwUGFyYW0tPm5RdWFsaXR5IDogNzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKKyAgICAgICAgICBkZWxldGUgcE5ld0JpdG1hcDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBfRENURW5jb2RlQml0bWFwKHBEaWN0LCBwQml0bWFwLCBwUGFyYW0gPyBwUGFyYW0tPm5RdWFsaXR5IDogNzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKKyAgICAgICAgfQorICAgICAgfQogICAgIH0KKyAgICBpZiAoYlN0cmVhbSkgeworICAgICAgcEZpbGVXcml0ZS0+V3JpdGVCbG9jayhkZXN0X2J1ZiwgZGVzdF9zaXplKTsKKyAgICAgIEZYX0ZyZWUoZGVzdF9idWYpOworICAgICAgZGVzdF9idWYgPSBOVUxMOworICAgIH0KKyAgfSBlbHNlIGlmIChvcFR5cGUgPT0gMSkgeworICAgIGlmICghYlN0cmVhbSkgeworICAgICAgZGVzdF9idWYgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIGRlc3RfcGl0Y2gsIEJpdG1hcEhlaWdodCk7CisgICAgICBkZXN0X3NpemUgPQorICAgICAgICAgIGRlc3RfcGl0Y2ggKiBCaXRtYXBIZWlnaHQ7ICAvLyBTYWZlIHNpbmNlIGNoZWNrZWQgYWxsb2MgcmV0dXJuZWQuCisgICAgfQorICAgIHVpbnQ4X3QqIHBEZXN0ID0gZGVzdF9idWY7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgQml0bWFwSGVpZ2h0OyBpKyspIHsKKyAgICAgIGlmICghYlN0cmVhbSkgeworICAgICAgICBGWFNZU19tZW1jcHkocERlc3QsIHNyY19idWYsIGRlc3RfcGl0Y2gpOworICAgICAgICBwRGVzdCArPSBkZXN0X3BpdGNoOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcEZpbGVXcml0ZS0+V3JpdGVCbG9jayhzcmNfYnVmLCBkZXN0X3BpdGNoKTsKKyAgICAgIH0KKyAgICAgIHNyY19idWYgKz0gc3JjX3BpdGNoOworICAgIH0KKyAgfSBlbHNlIGlmIChvcFR5cGUgPT0gMikgeworICAgIGlmICghYlN0cmVhbSkgeworICAgICAgZGVzdF9idWYgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIGRlc3RfcGl0Y2gsIEJpdG1hcEhlaWdodCk7CisgICAgICBkZXN0X3NpemUgPQorICAgICAgICAgIGRlc3RfcGl0Y2ggKiBCaXRtYXBIZWlnaHQ7ICAvLyBTYWZlIHNpbmNlIGNoZWNrZWQgYWxsb2MgcmV0dXJuZWQuCisgICAgfSBlbHNlIHsKKyAgICAgIGRlc3RfYnVmID0gRlhfQWxsb2ModWludDhfdCwgZGVzdF9waXRjaCk7CisgICAgfQorICAgIHVpbnQ4X3QqIHBEZXN0ID0gZGVzdF9idWY7CisgICAgaW50MzJfdCBzcmNfb2Zmc2V0ID0gMDsKKyAgICBpbnQzMl90IGRlc3Rfb2Zmc2V0ID0gMDsKKyAgICBmb3IgKGludDMyX3Qgcm93ID0gMDsgcm93IDwgQml0bWFwSGVpZ2h0OyByb3crKykgeworICAgICAgc3JjX29mZnNldCA9IHJvdyAqIHNyY19waXRjaDsKKyAgICAgIGZvciAoaW50MzJfdCBjb2x1bW4gPSAwOyBjb2x1bW4gPCBCaXRtYXBXaWR0aDsgY29sdW1uKyspIHsKKyAgICAgICAgRlhfRkxPQVQgYWxwaGEgPSBiVXNlTWF0dGUgPyBzcmNfYnVmW3NyY19vZmZzZXQgKyAzXSAvIDI1NS4wZiA6IDE7CisgICAgICAgIHBEZXN0W2Rlc3Rfb2Zmc2V0XSA9ICh1aW50OF90KShzcmNfYnVmW3NyY19vZmZzZXQgKyAyXSAqIGFscGhhKTsKKyAgICAgICAgcERlc3RbZGVzdF9vZmZzZXQgKyAxXSA9ICh1aW50OF90KShzcmNfYnVmW3NyY19vZmZzZXQgKyAxXSAqIGFscGhhKTsKKyAgICAgICAgcERlc3RbZGVzdF9vZmZzZXQgKyAyXSA9ICh1aW50OF90KShzcmNfYnVmW3NyY19vZmZzZXRdICogYWxwaGEpOworICAgICAgICBkZXN0X29mZnNldCArPSAzOworICAgICAgICBzcmNfb2Zmc2V0ICs9IGJwcCA9PSAyNCA/IDMgOiA0OworICAgICAgfQorICAgICAgaWYgKGJTdHJlYW0pIHsKKyAgICAgICAgcEZpbGVXcml0ZS0+V3JpdGVCbG9jayhwRGVzdCwgZGVzdF9waXRjaCk7CisgICAgICAgIHBEZXN0ID0gZGVzdF9idWY7CisgICAgICB9IGVsc2UgeworICAgICAgICBwRGVzdCArPSBkZXN0X3BpdGNoOworICAgICAgfQorICAgICAgZGVzdF9vZmZzZXQgPSAwOworICAgIH0KKyAgICBpZiAoYlN0cmVhbSkgeworICAgICAgRlhfRnJlZShkZXN0X2J1Zik7CisgICAgICBkZXN0X2J1ZiA9IE5VTEw7CisgICAgfQorICB9CisgIGlmICghbV9wU3RyZWFtKSB7CisgICAgbV9wU3RyZWFtID0gbmV3IENQREZfU3RyZWFtKE5VTEwsIDAsIE5VTEwpOworICB9CisgIGlmICghYlN0cmVhbSkgeworICAgIG1fcFN0cmVhbS0+SW5pdFN0cmVhbShkZXN0X2J1ZiwgZGVzdF9zaXplLCBwRGljdCk7CisgIH0gZWxzZSB7CisgICAgcEZpbGVXcml0ZS0+Rmx1c2goKTsKKyAgICBtX3BTdHJlYW0tPkluaXRTdHJlYW1Gcm9tRmlsZShwRmlsZVJlYWQsIHBEaWN0KTsKKyAgfQorICBtX2JJc01hc2sgPSBwQml0bWFwLT5Jc0FscGhhTWFzaygpOworICBtX1dpZHRoID0gQml0bWFwV2lkdGg7CisgIG1fSGVpZ2h0ID0gQml0bWFwSGVpZ2h0OworICBGWF9GcmVlKGRlc3RfYnVmKTsKIH0KLXZvaWQgQ1BERl9JbWFnZTo6UmVzZXRDYWNoZShDUERGX1BhZ2UqIHBQYWdlLCBjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXApCi17Ci0gICAgcFBhZ2UtPkdldFJlbmRlckNhY2hlKCktPlJlc2V0Qml0bWFwKG1fcFN0cmVhbSwgcEJpdG1hcCk7Cit2b2lkIENQREZfSW1hZ2U6OlJlc2V0Q2FjaGUoQ1BERl9QYWdlKiBwUGFnZSwgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwKSB7CisgIHBQYWdlLT5HZXRSZW5kZXJDYWNoZSgpLT5SZXNldEJpdG1hcChtX3BTdHJlYW0sIHBCaXRtYXApOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvY29tbW9uLmggYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9jb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIzYTM5NC4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgQ09SRV9TUkNfRlBERkFQSV9GUERGX0ZPTlRfQ09NTU9OX0hfCi0jZGVmaW5lIENPUkVfU1JDX0ZQREZBUElfRlBERl9GT05UX0NPTU1PTl9IXwotCi10eXBlZGVmIHNpZ25lZCBjaGFyIFRUX2ludDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBUVF91aW50OF90OwotdHlwZWRlZiBzaWduZWQgc2hvcnQgVFRfaW50MTZfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgVFRfdWludDE2X3Q7Ci10eXBlZGVmIEZYX0lOVDMyIFRUX2ludDMyX3Q7Ci10eXBlZGVmIEZYX0RXT1JEIFRUX3VpbnQzMl90OwotdHlwZWRlZiBGWF9JTlQ2NCBUVF9pbnQ2NF90OwotdHlwZWRlZiBGWF9VSU5UNjQgVFRfdWludDY0X3Q7Ci0KLSNlbmRpZiAgLy8gQ09SRV9TUkNfRlBERkFQSV9GUERGX0ZPTlRfQ09NTU9OX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mb250X2ludC5oIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZm9udF9pbnQuaAppbmRleCA2OTdjY2ZmLi4zM2ZhOTI2IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mb250X2ludC5oCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZvbnRfaW50LmgKQEAgLTEsMTc2ICsxLDIyMCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCiAjaWZuZGVmIENPUkVfU1JDX0ZQREZBUElfRlBERl9GT05UX0ZPTlRfSU5UX0hfCiAjZGVmaW5lIENPUkVfU1JDX0ZQREZBUElfRlBERl9GT05UX0ZPTlRfSU5UX0hfCiAKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZXNvdXJjZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgorCitjbGFzcyBDUERGX0NJRDJVbmljb2RlTWFwOworY2xhc3MgQ1BERl9DTWFwOworY2xhc3MgQ1BERl9Gb250OworY2xhc3MgQ1BERl9TdHJlYW07CisKIHR5cGVkZWYgdm9pZCogRlhGVF9MaWJyYXJ5OwotY2xhc3MgQ1BERl9DTWFwTWFuYWdlciAKLXsKLXB1YmxpYzoKLSAgICBDUERGX0NNYXBNYW5hZ2VyKCk7Ci0gICAgfkNQREZfQ01hcE1hbmFnZXIoKTsKLSAgICBGWF9MUFZPSUQJCQkJR2V0UGFja2FnZShGWF9CT09MIGJQcm9tcHQpOwotICAgIENQREZfQ01hcCoJCQkJR2V0UHJlZGVmaW5lZENNYXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsIEZYX0JPT0wgYlByb21wdCk7Ci0gICAgQ1BERl9DSUQyVW5pY29kZU1hcCoJR2V0Q0lEMlVuaWNvZGVNYXAoaW50IGNoYXJzZXQsIEZYX0JPT0wgYlByb21wdCk7Ci0gICAgdm9pZAkJCQkJUmVsb2FkQWxsKCk7Ci1wcml2YXRlOgotICAgIENQREZfQ01hcCoJCQkJTG9hZFByZWRlZmluZWRDTWFwKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCAgRlhfQk9PTCBiUHJvbXB0KTsKLSAgICBDUERGX0NJRDJVbmljb2RlTWFwKglMb2FkQ0lEMlVuaWNvZGVNYXAoaW50IGNoYXJzZXQsIEZYX0JPT0wgYlByb21wdCk7Ci0gICAgdm9pZAkJCQkJRHJvcEFsbChGWF9CT09MIGJSZWxvYWQpOwotICAgIEZYX0JPT0wJCQkJCW1fYlByb21wdGVkOwotICAgIENGWF9NYXBCeXRlU3RyaW5nVG9QdHIJbV9DTWFwczsKLSAgICBDUERGX0NJRDJVbmljb2RlTWFwKgltX0NJRDJVbmljb2RlTWFwc1s2XTsKKworc2hvcnQgVFQyUERGKGludCBtLCBGWEZUX0ZhY2UgZmFjZSk7CitGWF9CT09MIEZUX1VzZVRUQ2hhcm1hcChGWEZUX0ZhY2UgZmFjZSwgaW50IHBsYXRmb3JtX2lkLCBpbnQgZW5jb2RpbmdfaWQpOworCitjbGFzcyBDUERGX0NNYXBNYW5hZ2VyIHsKKyBwdWJsaWM6CisgIENQREZfQ01hcE1hbmFnZXIoKTsKKyAgfkNQREZfQ01hcE1hbmFnZXIoKTsKKyAgdm9pZCogR2V0UGFja2FnZShGWF9CT09MIGJQcm9tcHQpOworICBDUERGX0NNYXAqIEdldFByZWRlZmluZWRDTWFwKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBGWF9CT09MIGJQcm9tcHRDSkspOworICBDUERGX0NJRDJVbmljb2RlTWFwKiBHZXRDSUQyVW5pY29kZU1hcChDSURTZXQgY2hhcnNldCwgRlhfQk9PTCBiUHJvbXB0Q0pLKTsKKyAgdm9pZCBSZWxvYWRBbGwoKTsKKworIHByaXZhdGU6CisgIENQREZfQ01hcCogTG9hZFByZWRlZmluZWRDTWFwKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBGWF9CT09MIGJQcm9tcHRDSkspOworICBDUERGX0NJRDJVbmljb2RlTWFwKiBMb2FkQ0lEMlVuaWNvZGVNYXAoQ0lEU2V0IGNoYXJzZXQsIEZYX0JPT0wgYlByb21wdENKSyk7CisKKyAgRlhfQk9PTCBtX2JQcm9tcHRlZDsKKyAgc3RkOjptYXA8Q0ZYX0J5dGVTdHJpbmcsIENQREZfQ01hcCo+IG1fQ01hcHM7CisgIENQREZfQ0lEMlVuaWNvZGVNYXAqIG1fQ0lEMlVuaWNvZGVNYXBzWzZdOwogfTsKLWNsYXNzIENQREZfRm9udEdsb2JhbHMgCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9Gb250R2xvYmFscygpOwotICAgIH5DUERGX0ZvbnRHbG9iYWxzKCk7Ci0gICAgdm9pZAkJCQlDbGVhckFsbCgpOwotICAgIHZvaWQJCQkJQ2xlYXIodm9pZCoga2V5KTsKLSAgICBDUERGX0ZvbnQqCQkJRmluZCh2b2lkKiBrZXksIGludCBpbmRleCk7Ci0gICAgdm9pZAkJCQlTZXQodm9pZCoga2V5LCBpbnQgaW5kZXgsIENQREZfRm9udCogcEZvbnQpOwotICAgIENQREZfQ01hcE1hbmFnZXIJbV9DTWFwTWFuYWdlcjsKLSAgICBzdHJ1Y3QgewotICAgICAgICBjb25zdCBzdHJ1Y3QgRlhDTUFQX0NNYXAqCW1fcE1hcExpc3Q7Ci0gICAgICAgIGludAkJCQltX0NvdW50OwotICAgIH0gbV9FbWJlZGRlZENoYXJzZXRzW05VTUJFUl9PRl9DSURTRVRTXTsKLSAgICBzdHJ1Y3QgewotICAgICAgICBjb25zdCBGWF9XT1JEKgltX3BNYXA7Ci0gICAgICAgIGludAkJCQltX0NvdW50OwotICAgIH0gbV9FbWJlZGRlZFRvVW5pY29kZXNbTlVNQkVSX09GX0NJRFNFVFNdOwotcHJpdmF0ZToKLSAgICBDRlhfTWFwUHRyVG9QdHIJCW1fcFN0b2NrTWFwOwotICAgIEZYX0xQQllURQkJCW1fcENvbnRyYXN0UmFtcHM7CisKK2NsYXNzIENGWF9TdG9ja0ZvbnRBcnJheSB7CisgcHVibGljOgorICBDRlhfU3RvY2tGb250QXJyYXkoKTsKKyAgfkNGWF9TdG9ja0ZvbnRBcnJheSgpOworCisgIC8vIFRha2VzIG93bmVyc2hpcCBvZiB8cEZvbnR8LgorICB2b2lkIFNldEZvbnQoaW50IGluZGV4LCBDUERGX0ZvbnQqIHBGb250KTsKKyAgQ1BERl9Gb250KiBHZXRGb250KGludCBpbmRleCkgY29uc3Q7CisKKyBwcml2YXRlOgorICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Gb250PiBtX1N0b2NrRm9udHNbMTRdOwogfTsKLXN0cnVjdCBfQ01hcF9Db2RlUmFuZ2UgewotICAgIGludAkJCW1fQ2hhclNpemU7Ci0gICAgRlhfQllURQkJbV9Mb3dlcls0XTsKLSAgICBGWF9CWVRFCQltX1VwcGVyWzRdOworCitjbGFzcyBDUERGX0ZvbnRHbG9iYWxzIHsKKyBwdWJsaWM6CisgIENQREZfRm9udEdsb2JhbHMoKTsKKyAgfkNQREZfRm9udEdsb2JhbHMoKTsKKworICB2b2lkIENsZWFyKENQREZfRG9jdW1lbnQqIHBEb2MpOworICBDUERGX0ZvbnQqIEZpbmQoQ1BERl9Eb2N1bWVudCogcERvYywgaW50IGluZGV4KTsKKworICAvLyBUYWtlcyBvd25lcnNoaXAgb2YgfHBGb250fC4KKyAgdm9pZCBTZXQoQ1BERl9Eb2N1bWVudCoga2V5LCBpbnQgaW5kZXgsIENQREZfRm9udCogcEZvbnQpOworCisgIENQREZfQ01hcE1hbmFnZXIgbV9DTWFwTWFuYWdlcjsKKyAgc3RydWN0IHsKKyAgICBjb25zdCBzdHJ1Y3QgRlhDTUFQX0NNYXAqIG1fcE1hcExpc3Q7CisgICAgaW50IG1fQ291bnQ7CisgIH0gbV9FbWJlZGRlZENoYXJzZXRzW0NJRFNFVF9OVU1fU0VUU107CisgIHN0cnVjdCB7CisgICAgY29uc3QgRlhfV09SRCogbV9wTWFwOworICAgIGludCBtX0NvdW50OworICB9IG1fRW1iZWRkZWRUb1VuaWNvZGVzW0NJRFNFVF9OVU1fU0VUU107CisKKyBwcml2YXRlOgorICBzdGQ6Om1hcDxDUERGX0RvY3VtZW50Kiwgc3RkOjp1bmlxdWVfcHRyPENGWF9TdG9ja0ZvbnRBcnJheT4+IG1fU3RvY2tNYXA7CiB9OwotY2xhc3MgQ1BERl9DTWFwUGFyc2VyIAotewotcHVibGljOgotICAgIENQREZfQ01hcFBhcnNlcigpOwotICAgIH5DUERGX0NNYXBQYXJzZXIoKSB7fQotICAgIEZYX0JPT0wJSW5pdGlhbGl6ZShDUERGX0NNYXAqKTsKLSAgICB2b2lkCVBhcnNlV29yZChGWF9CU1RSIHN0cik7Ci0gICAgQ0ZYX0JpbmFyeUJ1ZgltX0FkZE1hcHM7Ci1wcml2YXRlOgotICAgIENQREZfQ01hcCoJbV9wQ01hcDsKLSAgICBpbnQJCQkJbV9TdGF0dXM7Ci0gICAgaW50CQkJCW1fQ29kZVNlcTsKLSAgICBGWF9EV09SRAkJbV9Db2RlUG9pbnRzWzRdOwotICAgIENGWF9BcnJheVRlbXBsYXRlPF9DTWFwX0NvZGVSYW5nZT4JbV9Db2RlUmFuZ2VzOwotICAgIENGWF9CeXRlU3RyaW5nCW1fUmVnaXN0cnksIG1fT3JkZXJpbmcsIG1fU3VwcGxlbWVudDsKLSAgICBDRlhfQnl0ZVN0cmluZwltX0xhc3RXb3JkOworCitzdHJ1Y3QgQ01hcF9Db2RlUmFuZ2UgeworICBpbnQgbV9DaGFyU2l6ZTsKKyAgdWludDhfdCBtX0xvd2VyWzRdOworICB1aW50OF90IG1fVXBwZXJbNF07CiB9OwotI2RlZmluZSBDSURDT0RJTkdfVU5LTk9XTgkwCi0jZGVmaW5lIENJRENPRElOR19HQgkJMQotI2RlZmluZSBDSURDT0RJTkdfQklHNQkJMgotI2RlZmluZSBDSURDT0RJTkdfSklTCQkzCi0jZGVmaW5lIENJRENPRElOR19LT1JFQQkJNAotI2RlZmluZSBDSURDT0RJTkdfVUNTMgkJNQotI2RlZmluZSBDSURDT0RJTkdfQ0lECQk2Ci0jZGVmaW5lIENJRENPRElOR19VVEYxNgkJNwotY2xhc3MgQ1BERl9DTWFwIAotewotcHVibGljOgotICAgIENQREZfQ01hcCgpOwotICAgIEZYX0JPT0wJCQkJCUxvYWRQcmVkZWZpbmVkKENQREZfQ01hcE1hbmFnZXIqIHBNZ3IsIGNvbnN0IEZYX0NIQVIqIG5hbWUsIEZYX0JPT0wgYlByb21wdENKSyk7Ci0gICAgRlhfQk9PTAkJCQkJTG9hZEVtYmVkZGVkKEZYX0xQQ0JZVEUgcERhdGEsIEZYX0RXT1JEIGR3U2l6ZSk7Ci0gICAgdm9pZAkJCQkJUmVsZWFzZSgpOwotICAgIEZYX0JPT0wJCQkJCUlzTG9hZGVkKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2JMb2FkZWQ7Ci0gICAgfQotICAgIGludAkJCQkJCUdldENoYXJzZXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fQ2hhcnNldDsKLSAgICB9Ci0gICAgRlhfQk9PTAkJCQkJSXNWZXJ0V3JpdGluZygpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9iVmVydGljYWw7Ci0gICAgfQotICAgIEZYX1dPUkQJCQkJCUNJREZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3Q7Ci0gICAgRlhfRFdPUkQJCQkJQ2hhckNvZGVGcm9tQ0lEKEZYX1dPUkQgQ0lEKSBjb25zdDsKLSAgICBpbnQJCQkJCQlHZXRDaGFyU2l6ZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3Q7Ci0gICAgRlhfRFdPUkQJCQkJR2V0TmV4dENoYXIoRlhfTFBDU1RSIHBTdHJpbmcsIGludCBuU3RyTGVuLCBpbnQmIG9mZnNldCkgY29uc3Q7Ci0gICAgaW50CQkJCQkJQ291bnRDaGFyKEZYX0xQQ1NUUiBwU3RyaW5nLCBpbnQgc2l6ZSkgY29uc3Q7Ci0gICAgaW50CQkJCQkJQXBwZW5kQ2hhcihGWF9MUFNUUiBzdHIsIEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdDsKLSAgICB0eXBlZGVmIGVudW0ge09uZUJ5dGUsIFR3b0J5dGVzLCBNaXhlZFR3b0J5dGVzLCBNaXhlZEZvdXJCeXRlc30gQ29kaW5nU2NoZW1lOwotcHJvdGVjdGVkOgotICAgIH5DUERGX0NNYXAoKTsKLSAgICBmcmllbmQgY2xhc3MJCQlDUERGX0NNYXBQYXJzZXI7Ci0gICAgZnJpZW5kIGNsYXNzCQkJQ1BERl9DTWFwTWFuYWdlcjsKLSAgICBmcmllbmQgY2xhc3MJCQlDUERGX0NJREZvbnQ7Ci1wcm90ZWN0ZWQ6Ci0gICAgQ0ZYX0J5dGVTdHJpbmcJCQltX1ByZWRlZmluZWRDTWFwOwotICAgIEZYX0JPT0wJCQkJCW1fYlZlcnRpY2FsOwotICAgIGludAkJCQkJCW1fQ2hhcnNldCwgbV9Db2Rpbmc7Ci0gICAgQ29kaW5nU2NoZW1lCQkJbV9Db2RpbmdTY2hlbWU7Ci0gICAgaW50CQkJCQkJbV9uQ29kZVJhbmdlczsKLSAgICBGWF9CWVRFKgkJCQltX3BMZWFkaW5nQnl0ZXM7Ci0gICAgRlhfV09SRCoJCQkJbV9wTWFwcGluZzsKLSAgICBGWF9MUEJZVEUJCQkJbV9wQWRkTWFwcGluZzsKLSAgICBGWF9CT09MCQkJCQltX2JMb2FkZWQ7Ci0gICAgY29uc3QgRlhDTUFQX0NNYXAqCQltX3BFbWJlZE1hcDsKLSAgICBDUERGX0NNYXAqCQkJCW1fcFVzZU1hcDsKKworY2xhc3MgQ1BERl9DTWFwUGFyc2VyIHsKKyBwdWJsaWM6CisgIENQREZfQ01hcFBhcnNlcigpOworICB+Q1BERl9DTWFwUGFyc2VyKCkge30KKyAgRlhfQk9PTCBJbml0aWFsaXplKENQREZfQ01hcCopOworICB2b2lkIFBhcnNlV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7CisgIENGWF9CaW5hcnlCdWYgbV9BZGRNYXBzOworCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIGZwZGZfZm9udF9jaWRfQ01hcF9HZXRDb2RlX1Rlc3Q7CisgIGZyaWVuZCBjbGFzcyBmcGRmX2ZvbnRfY2lkX0NNYXBfR2V0Q29kZVJhbmdlX1Rlc3Q7CisKKyAgc3RhdGljIEZYX0RXT1JEIENNYXBfR2V0Q29kZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHdvcmQpOworICBzdGF0aWMgYm9vbCBDTWFwX0dldENvZGVSYW5nZShDTWFwX0NvZGVSYW5nZSYgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc2Vjb25kKTsKKworICBDUERGX0NNYXAqIG1fcENNYXA7CisgIGludCBtX1N0YXR1czsKKyAgaW50IG1fQ29kZVNlcTsKKyAgRlhfRFdPUkQgbV9Db2RlUG9pbnRzWzRdOworICBDRlhfQXJyYXlUZW1wbGF0ZTxDTWFwX0NvZGVSYW5nZT4gbV9Db2RlUmFuZ2VzOworICBDRlhfQnl0ZVN0cmluZyBtX1JlZ2lzdHJ5LCBtX09yZGVyaW5nLCBtX1N1cHBsZW1lbnQ7CisgIENGWF9CeXRlU3RyaW5nIG1fTGFzdFdvcmQ7CiB9OwotY2xhc3MgQ1BERl9QcmVkZWZpbmVkQ01hcAotewotcHVibGljOgotICAgIEZYX0xQQ1NUUgltX3BOYW1lOwotICAgIGludAkJCW1fQ2hhcnNldDsKLSAgICBpbnQJCQltX0NvZGluZzsKLSAgICBDUERGX0NNYXA6OkNvZGluZ1NjaGVtZQltX0NvZGluZ1NjaGVtZTsKLSAgICBGWF9EV09SRAltX0xlYWRpbmdTZWdDb3VudDsKLSAgICBGWF9CWVRFCQltX0xlYWRpbmdTZWdzWzRdOworI2RlZmluZSBDSURDT0RJTkdfVU5LTk9XTiAwCisjZGVmaW5lIENJRENPRElOR19HQiAxCisjZGVmaW5lIENJRENPRElOR19CSUc1IDIKKyNkZWZpbmUgQ0lEQ09ESU5HX0pJUyAzCisjZGVmaW5lIENJRENPRElOR19LT1JFQSA0CisjZGVmaW5lIENJRENPRElOR19VQ1MyIDUKKyNkZWZpbmUgQ0lEQ09ESU5HX0NJRCA2CisjZGVmaW5lIENJRENPRElOR19VVEYxNiA3CitjbGFzcyBDUERGX0NNYXAgeworIHB1YmxpYzoKKyAgQ1BERl9DTWFwKCk7CisgIEZYX0JPT0wgTG9hZFByZWRlZmluZWQoQ1BERl9DTWFwTWFuYWdlciogcE1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlByb21wdENKSyk7CisgIEZYX0JPT0wgTG9hZEVtYmVkZGVkKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBkd1NpemUpOworICB2b2lkIFJlbGVhc2UoKTsKKyAgRlhfQk9PTCBJc0xvYWRlZCgpIGNvbnN0IHsgcmV0dXJuIG1fYkxvYWRlZDsgfQorICBGWF9CT09MIElzVmVydFdyaXRpbmcoKSBjb25zdCB7IHJldHVybiBtX2JWZXJ0aWNhbDsgfQorICBGWF9XT1JEIENJREZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3Q7CisgIEZYX0RXT1JEIENoYXJDb2RlRnJvbUNJRChGWF9XT1JEIENJRCkgY29uc3Q7CisgIGludCBHZXRDaGFyU2l6ZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3Q7CisgIEZYX0RXT1JEIEdldE5leHRDaGFyKGNvbnN0IEZYX0NIQVIqIHBTdHJpbmcsIGludCBuU3RyTGVuLCBpbnQmIG9mZnNldCkgY29uc3Q7CisgIGludCBDb3VudENoYXIoY29uc3QgRlhfQ0hBUiogcFN0cmluZywgaW50IHNpemUpIGNvbnN0OworICBpbnQgQXBwZW5kQ2hhcihGWF9DSEFSKiBzdHIsIEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdDsKKyAgdHlwZWRlZiBlbnVtIHsKKyAgICBPbmVCeXRlLAorICAgIFR3b0J5dGVzLAorICAgIE1peGVkVHdvQnl0ZXMsCisgICAgTWl4ZWRGb3VyQnl0ZXMKKyAgfSBDb2RpbmdTY2hlbWU7CisKKyBwcm90ZWN0ZWQ6CisgIH5DUERGX0NNYXAoKTsKKyAgZnJpZW5kIGNsYXNzIENQREZfQ01hcFBhcnNlcjsKKyAgZnJpZW5kIGNsYXNzIENQREZfQ01hcE1hbmFnZXI7CisgIGZyaWVuZCBjbGFzcyBDUERGX0NJREZvbnQ7CisKKyBwcm90ZWN0ZWQ6CisgIENGWF9CeXRlU3RyaW5nIG1fUHJlZGVmaW5lZENNYXA7CisgIEZYX0JPT0wgbV9iVmVydGljYWw7CisgIENJRFNldCBtX0NoYXJzZXQ7CisgIGludCBtX0NvZGluZzsKKyAgQ29kaW5nU2NoZW1lIG1fQ29kaW5nU2NoZW1lOworICBpbnQgbV9uQ29kZVJhbmdlczsKKyAgdWludDhfdCogbV9wTGVhZGluZ0J5dGVzOworICBGWF9XT1JEKiBtX3BNYXBwaW5nOworICB1aW50OF90KiBtX3BBZGRNYXBwaW5nOworICBGWF9CT09MIG1fYkxvYWRlZDsKKyAgY29uc3QgRlhDTUFQX0NNYXAqIG1fcEVtYmVkTWFwOworICBDUERGX0NNYXAqIG1fcFVzZU1hcDsKIH07CisKIHR5cGVkZWYgc3RydWN0IF9GaWxlSGVhZGVyIHsKLSAgICBGWF9CWVRFCQlidFRhZ1s0XTsKLSAgICBGWF9CWVRFCQlidFZlcnNpb247Ci0gICAgRlhfQllURQkJYnRGb3JtYXQ7Ci0gICAgRlhfQllURQkJYnRSZXNlcnZlZDFbMl07Ci0gICAgRlhfRFdPUkQJZHdTdGFydEluZGV4OwotICAgIEZYX0RXT1JECWR3RW5kSW5kZXg7Ci0gICAgRlhfRFdPUkQJZHdEYXRhU2l6ZTsKLSAgICBGWF9EV09SRAlkd0RhdGFPZmZzZXQ7Ci0gICAgRlhfRFdPUkQJZHdSZWNvcmRTaXplOworICB1aW50OF90IGJ0VGFnWzRdOworICB1aW50OF90IGJ0VmVyc2lvbjsKKyAgdWludDhfdCBidEZvcm1hdDsKKyAgdWludDhfdCBidFJlc2VydmVkMVsyXTsKKyAgRlhfRFdPUkQgZHdTdGFydEluZGV4OworICBGWF9EV09SRCBkd0VuZEluZGV4OworICBGWF9EV09SRCBkd0RhdGFTaXplOworICBGWF9EV09SRCBkd0RhdGFPZmZzZXQ7CisgIEZYX0RXT1JEIGR3UmVjb3JkU2l6ZTsKIH0gRlhNUF9GSUxFSEVBREVSOwotY2xhc3MgQ1BERl9DSUQyVW5pY29kZU1hcCAKLXsKLXB1YmxpYzoKLSAgICBDUERGX0NJRDJVbmljb2RlTWFwKCk7Ci0gICAgfkNQREZfQ0lEMlVuaWNvZGVNYXAoKTsKLSAgICBGWF9CT09MCQlJbml0aWFsaXplKCk7Ci0gICAgRlhfQk9PTAkJSXNMb2FkZWQoKTsKLSAgICB2b2lkCQlMb2FkKENQREZfQ01hcE1hbmFnZXIqIHBNZ3IsIGludCBjaGFyc2V0LCBGWF9CT09MIGJQcm9tcHRDSkspOwotICAgIEZYX1dDSEFSCVVuaWNvZGVGcm9tQ0lEKEZYX1dPUkQgQ0lEKTsKLXByb3RlY3RlZDoKLSAgICBpbnQJCQltX0NoYXJzZXQ7Ci0gICAgY29uc3QgRlhfV09SRCoJbV9wRW1iZWRkZWRNYXA7Ci0gICAgRlhfRFdPUkQJbV9FbWJlZGRlZENvdW50OworCitjbGFzcyBDUERGX0NJRDJVbmljb2RlTWFwIHsKKyBwdWJsaWM6CisgIENQREZfQ0lEMlVuaWNvZGVNYXAoKTsKKyAgfkNQREZfQ0lEMlVuaWNvZGVNYXAoKTsKKyAgRlhfQk9PTCBJbml0aWFsaXplKCk7CisgIEZYX0JPT0wgSXNMb2FkZWQoKTsKKyAgdm9pZCBMb2FkKENQREZfQ01hcE1hbmFnZXIqIHBNZ3IsIENJRFNldCBjaGFyc2V0LCBGWF9CT09MIGJQcm9tcHRDSkspOworICBGWF9XQ0hBUiBVbmljb2RlRnJvbUNJRChGWF9XT1JEIENJRCk7CisKKyBwcm90ZWN0ZWQ6CisgIENJRFNldCBtX0NoYXJzZXQ7CisgIGNvbnN0IEZYX1dPUkQqIG1fcEVtYmVkZGVkTWFwOworICBGWF9EV09SRCBtX0VtYmVkZGVkQ291bnQ7CiB9OwotY2xhc3MgQ1BERl9Ub1VuaWNvZGVNYXAgCi17Ci1wdWJsaWM6Ci0gICAgdm9pZAkJCQkJTG9hZChDUERGX1N0cmVhbSogcFN0cmVhbSk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcJCQlMb29rdXAoRlhfRFdPUkQgY2hhcmNvZGUpOwotICAgIEZYX0RXT1JECQkJCVJldmVyc2VMb29rdXAoRlhfV0NIQVIgdW5pY29kZSk7Ci1wcm90ZWN0ZWQ6Ci0gICAgQ0ZYX0NNYXBEV29yZFRvRFdvcmQJbV9NYXA7Ci0gICAgQ1BERl9DSUQyVW5pY29kZU1hcCoJbV9wQmFzZU1hcDsKLSAgICBDRlhfV2lkZVRleHRCdWYJCQltX011bHRpQ2hhckJ1ZjsKKworY2xhc3MgQ1BERl9Ub1VuaWNvZGVNYXAgeworIHB1YmxpYzoKKyAgdm9pZCBMb2FkKENQREZfU3RyZWFtKiBwU3RyZWFtKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgTG9va3VwKEZYX0RXT1JEIGNoYXJjb2RlKTsKKyAgRlhfRFdPUkQgUmV2ZXJzZUxvb2t1cChGWF9XQ0hBUiB1bmljb2RlKTsKKworIHByb3RlY3RlZDoKKyAgc3RkOjptYXA8RlhfRFdPUkQsIEZYX0RXT1JEPiBtX01hcDsKKyAgQ1BERl9DSUQyVW5pY29kZU1hcCogbV9wQmFzZU1hcDsKKyAgQ0ZYX1dpZGVUZXh0QnVmIG1fTXVsdGlDaGFyQnVmOworCisgcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIGZwZGZfZm9udF9TdHJpbmdUb0NvZGVfVGVzdDsKKyAgZnJpZW5kIGNsYXNzIGZwZGZfZm9udF9TdHJpbmdUb1dpZGVTdHJpbmdfVGVzdDsKKworICBzdGF0aWMgRlhfRFdPUkQgU3RyaW5nVG9Db2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKTsKKyAgc3RhdGljIENGWF9XaWRlU3RyaW5nIFN0cmluZ1RvV2lkZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7CiB9OwotY2xhc3MgQ1BERl9Gb250Q2hhck1hcCA6IHB1YmxpYyBDRlhfQ2hhck1hcAotewotcHVibGljOgotICAgIENQREZfRm9udENoYXJNYXAoQ1BERl9Gb250KiBwRm9udCk7Ci0gICAgQ1BERl9Gb250KgkJbV9wRm9udDsKK2NsYXNzIENQREZfRm9udENoYXJNYXAgOiBwdWJsaWMgQ0ZYX0NoYXJNYXAgeworIHB1YmxpYzoKKyAgQ1BERl9Gb250Q2hhck1hcChDUERGX0ZvbnQqIHBGb250KTsKKyAgQ1BERl9Gb250KiBtX3BGb250OwogfTsKIAordm9pZCBGUERGQVBJX0xvYWRDSUQyVW5pY29kZU1hcChDSURTZXQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV09SRComIHBNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBjb3VudCk7CisKICNlbmRpZiAgLy8gQ09SRV9TUkNfRlBERkFQSV9GUERGX0ZPTlRfRk9OVF9JTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZwZGZfZm9udC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnQuY3BwCmluZGV4IDgwZGQxZGYuLmI5MGQxMTQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZwZGZfZm9udC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZnBkZl9mb250LmNwcApAQCAtMSwxNzUxICsxLDE3NDMgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2UuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlb2JqLmgiCiAjaW5jbHVkZSAiZm9udF9pbnQuaCIKLSNpbmNsdWRlICIuLi9mcGRmX3BhZ2UvcGFnZWludC5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhnZS9meF9mcmVldHlwZS5oIgogCi1GWF9CT09MIEZUX1VzZVRUQ2hhcm1hcChGWEZUX0ZhY2UgZmFjZSwgaW50IHBsYXRmb3JtX2lkLCBpbnQgZW5jb2RpbmdfaWQpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGWEZUX0dldF9GYWNlX0NoYXJtYXBDb3VudChmYWNlKTsgaSArKykgewotICAgICAgICBpZiAoRlhGVF9HZXRfQ2hhcm1hcF9QbGF0Zm9ybUlEKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbaV0pID09IHBsYXRmb3JtX2lkICYmCi0gICAgICAgICAgICAgICAgRlhGVF9HZXRfQ2hhcm1hcF9FbmNvZGluZ0lEKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbaV0pID09IGVuY29kaW5nX2lkKSB7Ci0gICAgICAgICAgICBGWEZUX1NldF9DaGFybWFwKGZhY2UsIEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbaV0pOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotZXh0ZXJuIGNvbnN0IEZYX1dPUkQqIFBERl9Vbmljb2Rlc0ZvclByZWRlZmluZWRDaGFyU2V0KGludCk7Ci1DUERGX0ZvbnRHbG9iYWxzOjpDUERGX0ZvbnRHbG9iYWxzKCkKLSAgICA6IG1fcENvbnRyYXN0UmFtcHMoTlVMTCkKLXsKLSAgICBGWFNZU19tZW1zZXQzMihtX0VtYmVkZGVkQ2hhcnNldHMsIDAsIHNpemVvZihtX0VtYmVkZGVkQ2hhcnNldHMpKTsKLSAgICBGWFNZU19tZW1zZXQzMihtX0VtYmVkZGVkVG9Vbmljb2RlcywgMCwgc2l6ZW9mKG1fRW1iZWRkZWRUb1VuaWNvZGVzKSk7Ci19Ci1DUERGX0ZvbnRHbG9iYWxzOjp+Q1BERl9Gb250R2xvYmFscygpCi17Ci0gICAgQ2xlYXJBbGwoKTsKLSAgICBpZiAobV9wQ29udHJhc3RSYW1wcykgewotICAgICAgICBGWF9GcmVlKG1fcENvbnRyYXN0UmFtcHMpOwotICAgIH0KLX0KLWNsYXNzIENGWF9TdG9ja0ZvbnRBcnJheQotewotcHVibGljOgotICAgIENGWF9TdG9ja0ZvbnRBcnJheSgpCi0gICAgewotICAgICAgICBGWFNZU19tZW1zZXQzMihtX3BTdG9ja0ZvbnRzLCAwLCBzaXplb2YobV9wU3RvY2tGb250cykpOwotICAgIH0KLSAgICB+Q0ZYX1N0b2NrRm9udEFycmF5KCkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKG1fcFN0b2NrRm9udHMpOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghbV9wU3RvY2tGb250c1tpXSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0ID0gbV9wU3RvY2tGb250c1tpXS0+R2V0Rm9udERpY3QoKTsKLSAgICAgICAgICAgIGlmIChwRm9udERpY3QpCi0gICAgICAgICAgICAgICAgcEZvbnREaWN0LT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICBkZWxldGUgbV9wU3RvY2tGb250c1tpXTsKLSAgICAgICAgfQotICAgIH0KLSAgICBDUERGX0ZvbnQqIEdldEZvbnQoaW50IGluZGV4KSBjb25zdAotICAgIHsKLSAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBGWF9BcnJheVNpemUobV9wU3RvY2tGb250cykpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgcmV0dXJuIG1fcFN0b2NrRm9udHNbaW5kZXhdOwotICAgIH0KLSAgICB2b2lkIFNldEZvbnQoaW50IGluZGV4LCBDUERGX0ZvbnQqIGZvbnQpCi0gICAgewotICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IEZYX0FycmF5U2l6ZShtX3BTdG9ja0ZvbnRzKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgZGVsZXRlIG1fcFN0b2NrRm9udHNbaW5kZXhdOwotICAgICAgICBtX3BTdG9ja0ZvbnRzW2luZGV4XSA9IGZvbnQ7Ci0gICAgfQotcHJpdmF0ZToKLSAgICBDUERGX0ZvbnQqIG1fcFN0b2NrRm9udHNbMTRdOwotfTsKLUNQREZfRm9udCogQ1BERl9Gb250R2xvYmFsczo6RmluZCh2b2lkKiBrZXksIGludCBpbmRleCkKLXsKLSAgICB2b2lkKiB2YWx1ZSA9IE5VTEw7Ci0gICAgaWYgKCFtX3BTdG9ja01hcC5Mb29rdXAoa2V5LCB2YWx1ZSkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmICghdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDRlhfU3RvY2tGb250QXJyYXkqPih2YWx1ZSktPkdldEZvbnQoaW5kZXgpOwotfQotdm9pZCBDUERGX0ZvbnRHbG9iYWxzOjpTZXQodm9pZCoga2V5LCBpbnQgaW5kZXgsIENQREZfRm9udCogcEZvbnQpCi17Ci0gICAgdm9pZCogdmFsdWUgPSBOVUxMOwotICAgIENGWF9TdG9ja0ZvbnRBcnJheSogZm9udF9hcnJheSA9IE5VTEw7Ci0gICAgaWYgKG1fcFN0b2NrTWFwLkxvb2t1cChrZXksIHZhbHVlKSkgewotICAgICAgICBmb250X2FycmF5ID0gc3RhdGljX2Nhc3Q8Q0ZYX1N0b2NrRm9udEFycmF5Kj4odmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvbnRfYXJyYXkgPSBuZXcgQ0ZYX1N0b2NrRm9udEFycmF5KCk7Ci0gICAgICAgIG1fcFN0b2NrTWFwLlNldEF0KGtleSwgZm9udF9hcnJheSk7Ci0gICAgfQotICAgIGZvbnRfYXJyYXktPlNldEZvbnQoaW5kZXgsIHBGb250KTsKLX0KLXZvaWQgQ1BERl9Gb250R2xvYmFsczo6Q2xlYXIodm9pZCoga2V5KQotewotICAgIHZvaWQqIHZhbHVlID0gTlVMTDsKLSAgICBpZiAoIW1fcFN0b2NrTWFwLkxvb2t1cChrZXksIHZhbHVlKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGRlbGV0ZSBzdGF0aWNfY2FzdDxDRlhfU3RvY2tGb250QXJyYXkqPih2YWx1ZSk7Ci0gICAgbV9wU3RvY2tNYXAuUmVtb3ZlS2V5KGtleSk7Ci19Ci12b2lkIENQREZfRm9udEdsb2JhbHM6OkNsZWFyQWxsKCkKLXsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBtX3BTdG9ja01hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICB2b2lkKiBrZXkgPSBOVUxMOwotICAgICAgICB2b2lkKiB2YWx1ZSA9IE5VTEw7Ci0gICAgICAgIG1fcFN0b2NrTWFwLkdldE5leHRBc3NvYyhwb3MsIGtleSwgdmFsdWUpOwotICAgICAgICBkZWxldGUgc3RhdGljX2Nhc3Q8Q0ZYX1N0b2NrRm9udEFycmF5Kj4odmFsdWUpOwotICAgICAgICBtX3BTdG9ja01hcC5SZW1vdmVLZXkoa2V5KTsKLSAgICB9Ci19Ci1DUERGX0ZvbnQ6OkNQREZfRm9udChpbnQgZm9udHR5cGUpIDogbV9Gb250VHlwZShmb250dHlwZSkKLXsKLSAgICBtX0ZvbnRCQm94LmxlZnQgPSBtX0ZvbnRCQm94LnJpZ2h0ID0gbV9Gb250QkJveC50b3AgPSBtX0ZvbnRCQm94LmJvdHRvbSA9IDA7Ci0gICAgbV9TdGVtViA9IG1fQXNjZW50ID0gbV9EZXNjZW50ID0gbV9JdGFsaWNBbmdsZSA9IDA7Ci0gICAgbV9wRm9udEZpbGUgPSBOVUxMOwotICAgIG1fRmxhZ3MgPSAwOwotICAgIG1fcFRvVW5pY29kZU1hcCA9IE5VTEw7Ci0gICAgbV9iVG9Vbmljb2RlTG9hZGVkID0gRkFMU0U7Ci0gICAgbV9wQ2hhck1hcCA9IG5ldyBDUERGX0ZvbnRDaGFyTWFwKHRoaXMpOwotfQotQ1BERl9Gb250Ojp+Q1BERl9Gb250KCkKLXsKLSAgICBkZWxldGUgbV9wQ2hhck1hcDsKLSAgICBtX3BDaGFyTWFwID0gTlVMTDsKKyNpbmNsdWRlICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9wYWdlaW50LmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2UuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2VvYmouaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3Jlc291cmNlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2V4dC5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2ZyZWV0eXBlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgogCi0gICAgZGVsZXRlIG1fcFRvVW5pY29kZU1hcDsKLSAgICBtX3BUb1VuaWNvZGVNYXAgPSBOVUxMOwotCi0gICAgaWYgKG1fcEZvbnRGaWxlKSB7Ci0gICAgICAgIG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlRm9udEZpbGVTdHJlYW1BY2MoKENQREZfU3RyZWFtKiltX3BGb250RmlsZS0+R2V0U3RyZWFtKCkpOwotICAgIH0KLX0KLUZYX0JPT0wgQ1BERl9Gb250OjpJc1ZlcnRXcml0aW5nKCkgY29uc3QKLXsKLSAgICBGWF9CT09MIGJWZXJ0V3JpdGluZyA9IEZBTFNFOwotICAgIENQREZfQ0lERm9udCogcENJREZvbnQgPSBHZXRDSURGb250KCk7Ci0gICAgaWYgKHBDSURGb250KSB7Ci0gICAgICAgIGJWZXJ0V3JpdGluZyA9IHBDSURGb250LT5Jc1ZlcnRXcml0aW5nKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYlZlcnRXcml0aW5nID0gbV9Gb250LklzVmVydGljYWwoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGJWZXJ0V3JpdGluZzsKLX0KLUNGWF9CeXRlU3RyaW5nIENQREZfRm9udDo6R2V0Rm9udFR5cGVOYW1lKCkgY29uc3QKLXsKLSAgICBzd2l0Y2ggKG1fRm9udFR5cGUpIHsKLSAgICAgICAgY2FzZSBQREZGT05UX1RZUEUxOgotICAgICAgICAgICAgcmV0dXJuIEZYX0JTVFJDKCJUeXBlMSIpOwotICAgICAgICBjYXNlIFBERkZPTlRfVFJVRVRZUEU6Ci0gICAgICAgICAgICByZXR1cm4gRlhfQlNUUkMoIlRydWVUeXBlIik7Ci0gICAgICAgIGNhc2UgUERGRk9OVF9UWVBFMzoKLSAgICAgICAgICAgIHJldHVybiBGWF9CU1RSQygiVHlwZTMiKTsKLSAgICAgICAgY2FzZSBQREZGT05UX0NJREZPTlQ6Ci0gICAgICAgICAgICByZXR1cm4gRlhfQlNUUkMoIlR5cGUwIik7Ci0gICAgfQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwotfQotdm9pZCBDUERGX0ZvbnQ6OkFwcGVuZENoYXIoQ0ZYX0J5dGVTdHJpbmcmIHN0ciwgRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0Ci17Ci0gICAgY2hhciBidWZbNF07Ci0gICAgaW50IGxlbiA9IEFwcGVuZENoYXIoYnVmLCBjaGFyY29kZSk7Ci0gICAgaWYgKGxlbiA9PSAxKSB7Ci0gICAgICAgIHN0ciArPSBidWZbMF07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RyICs9IENGWF9CeXRlU3RyaW5nKGJ1ZiwgbGVuKTsKLSAgICB9Ci19Ci1DRlhfV2lkZVN0cmluZyBDUERGX0ZvbnQ6OlVuaWNvZGVGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX2JUb1VuaWNvZGVMb2FkZWQpIHsKLSAgICAgICAgKChDUERGX0ZvbnQqKXRoaXMpLT5Mb2FkVW5pY29kZU1hcCgpOwotICAgIH0KLSAgICBpZiAobV9wVG9Vbmljb2RlTWFwKSB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzUmV0ID0gbV9wVG9Vbmljb2RlTWFwLT5Mb29rdXAoY2hhcmNvZGUpOwotICAgICAgICBpZiAoIXdzUmV0LklzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIHdzUmV0OwotICAgICAgICB9Ci0gICAgfQotICAgIEZYX1dDSEFSIHVuaWNvZGUgPSBfVW5pY29kZUZyb21DaGFyQ29kZShjaGFyY29kZSk7Ci0gICAgaWYgKHVuaWNvZGUgPT0gMCkgewotICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHVuaWNvZGU7Ci19Ci1GWF9EV09SRCBDUERGX0ZvbnQ6OkNoYXJDb2RlRnJvbVVuaWNvZGUoRlhfV0NIQVIgdW5pY29kZSkgY29uc3QKLXsKLSAgICBpZiAoIW1fYlRvVW5pY29kZUxvYWRlZCkgewotICAgICAgICAoKENQREZfRm9udCopdGhpcyktPkxvYWRVbmljb2RlTWFwKCk7Ci0gICAgfQotICAgIGlmIChtX3BUb1VuaWNvZGVNYXApIHsKLSAgICAgICAgRlhfRFdPUkQgY2hhcmNvZGUgPSBtX3BUb1VuaWNvZGVNYXAtPlJldmVyc2VMb29rdXAodW5pY29kZSk7Ci0gICAgICAgIGlmIChjaGFyY29kZSkgewotICAgICAgICAgICAgcmV0dXJuIGNoYXJjb2RlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBfQ2hhckNvZGVGcm9tVW5pY29kZSh1bmljb2RlKTsKLX0KLUNGWF9XaWRlU3RyaW5nIENQREZfRm9udDo6RGVjb2RlU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpIGNvbnN0Ci17Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0OwotICAgIGludCBzcmNfbGVuID0gc3RyLkdldExlbmd0aCgpOwotICAgIHJlc3VsdC5SZXNlcnZlKHNyY19sZW4pOwotICAgIEZYX0xQQ1NUUiBzcmNfYnVmID0gc3RyOwotICAgIGludCBzcmNfcG9zID0gMDsKLSAgICB3aGlsZSAoc3JjX3BvcyA8IHNyY19sZW4pIHsKLSAgICAgICAgRlhfRFdPUkQgY2hhcmNvZGUgPSBHZXROZXh0Q2hhcihzcmNfYnVmLCBzcmNfbGVuLCBzcmNfcG9zKTsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgdW5pY29kZSA9IFVuaWNvZGVGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOwotICAgICAgICBpZiAoIXVuaWNvZGUuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXN1bHQgKz0gdW5pY29kZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCArPSAoRlhfV0NIQVIpY2hhcmNvZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLUNGWF9CeXRlU3RyaW5nIENQREZfRm9udDo6RW5jb2RlU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIGNvbnN0Ci17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0OwotICAgIGludCBzcmNfbGVuID0gc3RyLkdldExlbmd0aCgpOwotICAgIEZYX0xQU1RSIGRlc3RfYnVmID0gcmVzdWx0LkdldEJ1ZmZlcihzcmNfbGVuICogMik7Ci0gICAgRlhfTFBDV1NUUiBzcmNfYnVmID0gc3RyLmNfc3RyKCk7Ci0gICAgaW50IGRlc3RfcG9zID0gMDsKLSAgICBmb3IgKGludCBzcmNfcG9zID0gMDsgc3JjX3BvcyA8IHNyY19sZW47IHNyY19wb3MgKyspIHsKLSAgICAgICAgRlhfRFdPUkQgY2hhcmNvZGUgPSBDaGFyQ29kZUZyb21Vbmljb2RlKHNyY19idWZbc3JjX3Bvc10pOwotICAgICAgICBkZXN0X3BvcyArPSBBcHBlbmRDaGFyKGRlc3RfYnVmICsgZGVzdF9wb3MsIGNoYXJjb2RlKTsKLSAgICB9Ci0gICAgcmVzdWx0LlJlbGVhc2VCdWZmZXIoZGVzdF9wb3MpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci12b2lkIENQREZfRm9udDo6TG9hZEZvbnREZXNjcmlwdG9yKENQREZfRGljdGlvbmFyeSogcEZvbnREZXNjKQotewotICAgIG1fRmxhZ3MgPSBwRm9udERlc2MtPkdldEludGVnZXIoRlhfQlNUUkMoIkZsYWdzIiksIFBERkZPTlRfTk9OU1lNQk9MSUMpOwotICAgIGludCBJdGFsaWNBbmdsZSA9IDA7Ci0gICAgRlhfQk9PTCBiRXhpc3RJdGFsaWNBbmdsZSA9IEZBTFNFOwotICAgIGlmIChwRm9udERlc2MtPktleUV4aXN0KEZYX0JTVFJDKCJJdGFsaWNBbmdsZSIpKSkgewotICAgICAgICBJdGFsaWNBbmdsZSA9IHBGb250RGVzYy0+R2V0SW50ZWdlcihGWF9CU1RSQygiSXRhbGljQW5nbGUiKSk7Ci0gICAgICAgIGJFeGlzdEl0YWxpY0FuZ2xlID0gVFJVRTsKLSAgICB9Ci0gICAgaWYgKEl0YWxpY0FuZ2xlIDwgMCkgewotICAgICAgICBtX0ZsYWdzIHw9IFBERkZPTlRfSVRBTElDOwotICAgICAgICBtX0l0YWxpY0FuZ2xlID0gSXRhbGljQW5nbGU7Ci0gICAgfQotICAgIEZYX0JPT0wgYkV4aXN0U3RlbVYgPSBGQUxTRTsKLSAgICBpZiAocEZvbnREZXNjLT5LZXlFeGlzdChGWF9CU1RSQygiU3RlbVYiKSkpIHsKLSAgICAgICAgbV9TdGVtViA9IHBGb250RGVzYy0+R2V0SW50ZWdlcihGWF9CU1RSQygiU3RlbVYiKSk7Ci0gICAgICAgIGJFeGlzdFN0ZW1WID0gVFJVRTsKLSAgICB9Ci0gICAgRlhfQk9PTCBiRXhpc3RBc2NlbnQgPSBGQUxTRTsKLSAgICBpZiAocEZvbnREZXNjLT5LZXlFeGlzdChGWF9CU1RSQygiQXNjZW50IikpKSB7Ci0gICAgICAgIG1fQXNjZW50ID0gcEZvbnREZXNjLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJBc2NlbnQiKSk7Ci0gICAgICAgIGJFeGlzdEFzY2VudCA9IFRSVUU7Ci0gICAgfQotICAgIEZYX0JPT0wgYkV4aXN0RGVzY2VudCA9IEZBTFNFOwotICAgIGlmIChwRm9udERlc2MtPktleUV4aXN0KEZYX0JTVFJDKCJEZXNjZW50IikpKSB7Ci0gICAgICAgIG1fRGVzY2VudCA9IHBGb250RGVzYy0+R2V0SW50ZWdlcihGWF9CU1RSQygiRGVzY2VudCIpKTsKLSAgICAgICAgYkV4aXN0RGVzY2VudCA9IFRSVUU7Ci0gICAgfQotICAgIEZYX0JPT0wgYkV4aXN0Q2FwSGVpZ2h0ID0gRkFMU0U7Ci0gICAgaWYgKHBGb250RGVzYy0+S2V5RXhpc3QoRlhfQlNUUkMoIkNhcEhlaWdodCIpKSkgewotICAgICAgICBiRXhpc3RDYXBIZWlnaHQgPSBUUlVFOwotICAgIH0KLSAgICBpZiAoYkV4aXN0SXRhbGljQW5nbGUgJiYgYkV4aXN0QXNjZW50ICYmIGJFeGlzdENhcEhlaWdodCAmJiBiRXhpc3REZXNjZW50ICYmIGJFeGlzdFN0ZW1WKSB7Ci0gICAgICAgIG1fRmxhZ3MgfD0gUERGRk9OVF9VU0VFWFRFUk5BVFRSOwotICAgIH0KLSAgICBpZiAobV9EZXNjZW50ID4gMTApIHsKLSAgICAgICAgbV9EZXNjZW50ID0gLW1fRGVzY2VudDsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcEJCb3ggPSBwRm9udERlc2MtPkdldEFycmF5KEZYX0JTVFJDKCJGb250QkJveCIpKTsKLSAgICBpZiAocEJCb3gpIHsKLSAgICAgICAgbV9Gb250QkJveC5sZWZ0ID0gcEJCb3gtPkdldEludGVnZXIoMCk7Ci0gICAgICAgIG1fRm9udEJCb3guYm90dG9tID0gcEJCb3gtPkdldEludGVnZXIoMSk7Ci0gICAgICAgIG1fRm9udEJCb3gucmlnaHQgPSBwQkJveC0+R2V0SW50ZWdlcigyKTsKLSAgICAgICAgbV9Gb250QkJveC50b3AgPSBwQkJveC0+R2V0SW50ZWdlcigzKTsKLSAgICB9Ci0gICAgQ1BERl9TdHJlYW0qIHBGb250RmlsZSA9IHBGb250RGVzYy0+R2V0U3RyZWFtKEZYX0JTVFJDKCJGb250RmlsZSIpKTsKLSAgICBpZiAocEZvbnRGaWxlID09IE5VTEwpIHsKLSAgICAgICAgcEZvbnRGaWxlID0gcEZvbnREZXNjLT5HZXRTdHJlYW0oRlhfQlNUUkMoIkZvbnRGaWxlMiIpKTsKLSAgICB9Ci0gICAgaWYgKHBGb250RmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHBGb250RmlsZSA9IHBGb250RGVzYy0+R2V0U3RyZWFtKEZYX0JTVFJDKCJGb250RmlsZTMiKSk7Ci0gICAgfQotICAgIGlmIChwRm9udEZpbGUpIHsKLSAgICAgICAgbV9wRm9udEZpbGUgPSBtX3BEb2N1bWVudC0+TG9hZEZvbnRGaWxlKHBGb250RmlsZSk7Ci0gICAgICAgIGlmIChtX3BGb250RmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgRlhfTFBDQllURSBwRm9udERhdGEgPSBtX3BGb250RmlsZS0+R2V0RGF0YSgpOwotICAgICAgICBGWF9EV09SRCBkd0ZvbnRTaXplID0gbV9wRm9udEZpbGUtPkdldFNpemUoKTsKLSAgICAgICAgbV9Gb250LkxvYWRFbWJlZGRlZChwRm9udERhdGEsIGR3Rm9udFNpemUpOwotICAgICAgICBpZiAobV9Gb250Lm1fRmFjZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtX3BGb250RmlsZSA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1zaG9ydCBUVDJQREYoaW50IG0sIEZYRlRfRmFjZSBmYWNlKQotewotICAgIGludCB1cG0gPSBGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0oZmFjZSk7Ci0gICAgaWYgKHVwbSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAoc2hvcnQpbTsKLSAgICB9Ci0gICAgcmV0dXJuIChtICogMTAwMCArIHVwbSAvIDIpIC8gdXBtOwotfQotdm9pZCBDUERGX0ZvbnQ6OkNoZWNrRm9udE1ldHJpY3MoKQotewotICAgIGlmIChtX0ZvbnRCQm94LnRvcCA9PSAwICYmIG1fRm9udEJCb3guYm90dG9tID09IDAgJiYgbV9Gb250QkJveC5sZWZ0ID09IDAgJiYgbV9Gb250QkJveC5yaWdodCA9PSAwKSB7Ci0gICAgICAgIGlmIChtX0ZvbnQubV9GYWNlKSB7Ci0gICAgICAgICAgICBtX0ZvbnRCQm94LmxlZnQgPSBUVDJQREYoRlhGVF9HZXRfRmFjZV94TWluKG1fRm9udC5tX0ZhY2UpLCBtX0ZvbnQubV9GYWNlKTsKLSAgICAgICAgICAgIG1fRm9udEJCb3guYm90dG9tID0gVFQyUERGKEZYRlRfR2V0X0ZhY2VfeU1pbihtX0ZvbnQubV9GYWNlKSwgbV9Gb250Lm1fRmFjZSk7Ci0gICAgICAgICAgICBtX0ZvbnRCQm94LnJpZ2h0ID0gVFQyUERGKEZYRlRfR2V0X0ZhY2VfeE1heChtX0ZvbnQubV9GYWNlKSwgbV9Gb250Lm1fRmFjZSk7Ci0gICAgICAgICAgICBtX0ZvbnRCQm94LnRvcCA9IFRUMlBERihGWEZUX0dldF9GYWNlX3lNYXgobV9Gb250Lm1fRmFjZSksIG1fRm9udC5tX0ZhY2UpOwotICAgICAgICAgICAgbV9Bc2NlbnQgPSBUVDJQREYoRlhGVF9HZXRfRmFjZV9Bc2NlbmRlcihtX0ZvbnQubV9GYWNlKSwgbV9Gb250Lm1fRmFjZSk7Ci0gICAgICAgICAgICBtX0Rlc2NlbnQgPSBUVDJQREYoRlhGVF9HZXRfRmFjZV9EZXNjZW5kZXIobV9Gb250Lm1fRmFjZSksIG1fRm9udC5tX0ZhY2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRlhfQk9PTCBiRmlyc3QgPSBUUlVFOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBGWF9SRUNUIHJlY3Q7Ci0gICAgICAgICAgICAgICAgR2V0Q2hhckJCb3goaSwgcmVjdCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlY3QubGVmdCA9PSByZWN0LnJpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYkZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fRm9udEJCb3ggPSByZWN0OwotICAgICAgICAgICAgICAgICAgICBiRmlyc3QgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAobV9Gb250QkJveC50b3AgPCByZWN0LnRvcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9Gb250QkJveC50b3AgPSByZWN0LnRvcDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobV9Gb250QkJveC5yaWdodCA8IHJlY3QucmlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fRm9udEJCb3gucmlnaHQgPSByZWN0LnJpZ2h0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX0ZvbnRCQm94LmxlZnQgPiByZWN0LmxlZnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fRm9udEJCb3gubGVmdCA9IHJlY3QubGVmdDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobV9Gb250QkJveC5ib3R0b20gPiByZWN0LmJvdHRvbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9Gb250QkJveC5ib3R0b20gPSByZWN0LmJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9Bc2NlbnQgPT0gMCAmJiBtX0Rlc2NlbnQgPT0gMCkgewotICAgICAgICBGWF9SRUNUIHJlY3Q7Ci0gICAgICAgIEdldENoYXJCQm94KCdBJywgcmVjdCk7Ci0gICAgICAgIGlmIChyZWN0LmJvdHRvbSA9PSByZWN0LnRvcCkgewotICAgICAgICAgICAgbV9Bc2NlbnQgPSBtX0ZvbnRCQm94LnRvcDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fQXNjZW50ID0gcmVjdC50b3A7Ci0gICAgICAgIH0KLSAgICAgICAgR2V0Q2hhckJCb3goJ2cnLCByZWN0KTsKLSAgICAgICAgaWYgKHJlY3QuYm90dG9tID09IHJlY3QudG9wKSB7Ci0gICAgICAgICAgICBtX0Rlc2NlbnQgPSBtX0ZvbnRCQm94LmJvdHRvbTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fRGVzY2VudCA9IHJlY3QuYm90dG9tOwotICAgICAgICB9Ci0gICAgfQotfQotdm9pZCBDUERGX0ZvbnQ6OkxvYWRVbmljb2RlTWFwKCkKLXsKLSAgICBtX2JUb1VuaWNvZGVMb2FkZWQgPSBUUlVFOwotICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gbV9wRm9udERpY3QtPkdldFN0cmVhbShGWF9CU1RSQygiVG9Vbmljb2RlIikpOwotICAgIGlmIChwU3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX3BUb1VuaWNvZGVNYXAgPSBuZXcgQ1BERl9Ub1VuaWNvZGVNYXA7Ci0gICAgbV9wVG9Vbmljb2RlTWFwLT5Mb2FkKHBTdHJlYW0pOwotfQotaW50IENQREZfRm9udDo6R2V0U3RyaW5nV2lkdGgoRlhfTFBDU1RSIHBTdHJpbmcsIGludCBzaXplKQotewotICAgIGludCBvZmZzZXQgPSAwOwotICAgIGludCB3aWR0aCA9IDA7Ci0gICAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKLSAgICAgICAgRlhfRFdPUkQgY2hhcmNvZGUgPSBHZXROZXh0Q2hhcihwU3RyaW5nLCBzaXplLCBvZmZzZXQpOwotICAgICAgICB3aWR0aCArPSBHZXRDaGFyV2lkdGhGKGNoYXJjb2RlKTsKLSAgICB9Ci0gICAgcmV0dXJuIHdpZHRoOwotfQotaW50IENQREZfRm9udDo6R2V0Q2hhclR5cGVXaWR0aChGWF9EV09SRCBjaGFyY29kZSkKLXsKLSAgICBpZiAobV9Gb250Lm1fRmFjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpbnQgZ2x5cGhfaW5kZXggPSBHbHlwaEZyb21DaGFyQ29kZShjaGFyY29kZSk7Ci0gICAgaWYgKGdseXBoX2luZGV4ID09IDB4ZmZmZikgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIG1fRm9udC5HZXRHbHlwaFdpZHRoKGdseXBoX2luZGV4KTsKLX0KLWludCBfUERGX0dldFN0YW5kYXJkRm9udE5hbWUoQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOwotQ1BERl9Gb250KiBDUERGX0ZvbnQ6OkdldFN0b2NrRm9udChDUERGX0RvY3VtZW50KiBwRG9jLCBGWF9CU1RSIG5hbWUpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgZm9udG5hbWUobmFtZSk7Ci0gICAgaW50IGZvbnRfaWQgPSBfUERGX0dldFN0YW5kYXJkRm9udE5hbWUoZm9udG5hbWUpOwotICAgIGlmIChmb250X2lkIDwgMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9Gb250R2xvYmFscyogcEZvbnRHbG9iYWxzID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCk7Ci0gICAgQ1BERl9Gb250KiBwRm9udCA9IHBGb250R2xvYmFscy0+RmluZChwRG9jLCBmb250X2lkKTsKLSAgICBpZiAocEZvbnQpIHsKLSAgICAgICAgcmV0dXJuIHBGb250OwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gQ1BERl9EaWN0aW9uYXJ5OjpDcmVhdGUoKTsKLSAgICBwRGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJUeXBlIiksIEZYX0JTVFJDKCJGb250IikpOwotICAgIHBEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIlN1YnR5cGUiKSwgRlhfQlNUUkMoIlR5cGUxIikpOwotICAgIHBEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIkJhc2VGb250IiksIGZvbnRuYW1lKTsKLSAgICBwRGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJFbmNvZGluZyIpLCBGWF9CU1RSQygiV2luQW5zaUVuY29kaW5nIikpOwotICAgIHBGb250ID0gQ1BERl9Gb250OjpDcmVhdGVGb250RihOVUxMLCBwRGljdCk7Ci0gICAgcEZvbnRHbG9iYWxzLT5TZXQocERvYywgZm9udF9pZCwgcEZvbnQpOwotICAgIHJldHVybiBwRm9udDsKLX0KLWNvbnN0IEZYX0JZVEUgQ2hpbmVzZUZvbnROYW1lc1tdWzVdID0gewotICAgIHsweENCLCAweENFLCAweENDLCAweEU1LCAweDAwfSwKLSAgICB7MHhCRiwgMHhBQywgMHhDQywgMHhFNSwgMHgwMH0sCi0gICAgezB4QkEsIDB4REEsIDB4Q0MsIDB4RTUsIDB4MDB9LAotICAgIHsweEI3LCAweEMyLCAweENCLCAweENFLCAweDAwfSwKLSAgICB7MHhEMCwgMHhDMiwgMHhDQiwgMHhDRSwgMHgwMH0KLX07Ci1DUERGX0ZvbnQqIENQREZfRm9udDo6Q3JlYXRlRm9udEYoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgdHlwZSA9IHBGb250RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJTdWJ0eXBlIikpOwotICAgIENQREZfRm9udCogcEZvbnQ7Ci0gICAgaWYgKHR5cGUgPT0gRlhfQlNUUkMoIlRydWVUeXBlIikpIHsKLSAgICAgICAgewotI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfIHx8IF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fTElOVVhfIHx8IF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQU5EUk9JRF8gfHwgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJhc2Vmb250ID0gcEZvbnREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkJhc2VGb250IikpOwotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgdGFnID0gYmFzZWZvbnQuTGVmdCg0KTsKLSAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgaW50IGNvdW50ID0gc2l6ZW9mKENoaW5lc2VGb250TmFtZXMpIC8gc2l6ZW9mKENoaW5lc2VGb250TmFtZXNbMF0pOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgICAgICAgICBpZiAodGFnID09IENGWF9CeXRlU3RyaW5nKChGWF9MUENTVFIpQ2hpbmVzZUZvbnROYW1lc1tpXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkgPCBjb3VudCkgewotICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEZvbnREZXNjID0gcEZvbnREaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJGb250RGVzY3JpcHRvciIpKTsKLSAgICAgICAgICAgICAgICBpZiAocEZvbnREZXNjID09IE5VTEwgfHwgIXBGb250RGVzYy0+S2V5RXhpc3QoRlhfQlNUUkMoIkZvbnRGaWxlMiIpKSkgewotICAgICAgICAgICAgICAgICAgICBwRm9udCA9IG5ldyBDUERGX0NJREZvbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHBGb250LT5tX3BGb250RGljdCA9IHBGb250RGljdDsKLSAgICAgICAgICAgICAgICAgICAgcEZvbnQtPm1fcERvY3VtZW50ID0gcERvYzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwRm9udC0+TG9hZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcEZvbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcEZvbnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisjaW5jbHVkZSAiY29yZS9zcmMvZnhnZS9hcHBsZS9hcHBsZV9pbnQuaCIKICNlbmRpZgotICAgICAgICB9Ci0gICAgICAgIHBGb250ID0gbmV3IENQREZfVHJ1ZVR5cGVGb250OwotICAgIH0gZWxzZSBpZiAodHlwZSA9PSBGWF9CU1RSQygiVHlwZTMiKSkgewotICAgICAgICBwRm9udCA9IG5ldyBDUERGX1R5cGUzRm9udDsKLSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gRlhfQlNUUkMoIlR5cGUwIikpIHsKLSAgICAgICAgcEZvbnQgPSBuZXcgQ1BERl9DSURGb250OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBGb250ID0gbmV3IENQREZfVHlwZTFGb250OworCitGWF9CT09MIEZUX1VzZVRUQ2hhcm1hcChGWEZUX0ZhY2UgZmFjZSwgaW50IHBsYXRmb3JtX2lkLCBpbnQgZW5jb2RpbmdfaWQpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBGWEZUX0dldF9GYWNlX0NoYXJtYXBDb3VudChmYWNlKTsgaSsrKSB7CisgICAgaWYgKEZYRlRfR2V0X0NoYXJtYXBfUGxhdGZvcm1JRChGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpW2ldKSA9PQorICAgICAgICAgICAgcGxhdGZvcm1faWQgJiYKKyAgICAgICAgRlhGVF9HZXRfQ2hhcm1hcF9FbmNvZGluZ0lEKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbaV0pID09CisgICAgICAgICAgICBlbmNvZGluZ19pZCkgeworICAgICAgRlhGVF9TZXRfQ2hhcm1hcChmYWNlLCBGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpW2ldKTsKKyAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICBwRm9udC0+bV9wRm9udERpY3QgPSBwRm9udERpY3Q7Ci0gICAgcEZvbnQtPm1fcERvY3VtZW50ID0gcERvYzsKLSAgICBpZiAoIXBGb250LT5Mb2FkKCkpIHsKLSAgICAgICAgZGVsZXRlIHBGb250OwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIHBGb250OworICB9CisgIHJldHVybiBGQUxTRTsKIH0KLUZYX0JPT0wgQ1BERl9Gb250OjpMb2FkKCkKLXsKLSAgICBpZiAobV9wRm9udERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIHR5cGUgPSBtX3BGb250RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJTdWJ0eXBlIikpOwotICAgIG1fQmFzZUZvbnQgPSBtX3BGb250RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJCYXNlRm9udCIpKTsKLSAgICBpZiAodHlwZSA9PSBGWF9CU1RSQygiTU1UeXBlMSIpKSB7Ci0gICAgICAgIHR5cGUgPSBGWF9CU1RSQygiVHlwZTEiKTsKLSAgICB9Ci0gICAgcmV0dXJuIF9Mb2FkKCk7CisKK0NGWF9TdG9ja0ZvbnRBcnJheTo6Q0ZYX1N0b2NrRm9udEFycmF5KCkge30KKworQ0ZYX1N0b2NrRm9udEFycmF5Ojp+Q0ZYX1N0b2NrRm9udEFycmF5KCkgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShtX1N0b2NrRm9udHMpOyArK2kpIHsKKyAgICBpZiAoIW1fU3RvY2tGb250c1tpXSkKKyAgICAgIGNvbnRpbnVlOworICAgIENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0ID0gbV9TdG9ja0ZvbnRzW2ldLT5HZXRGb250RGljdCgpOworICAgIGlmIChwRm9udERpY3QpCisgICAgICBwRm9udERpY3QtPlJlbGVhc2UoKTsKKyAgfQogfQotc3RhdGljIENGWF9XaWRlU3RyaW5nIF9Gb250TWFwX0dldFdpZGVTdHJpbmcoQ0ZYX0NoYXJNYXAqIHBNYXAsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBieXRlc3RyKQotewotICAgIHJldHVybiAoKENQREZfRm9udENoYXJNYXAqKXBNYXApLT5tX3BGb250LT5EZWNvZGVTdHJpbmcoYnl0ZXN0cik7CisKK0NQREZfRm9udCogQ0ZYX1N0b2NrRm9udEFycmF5OjpHZXRGb250KGludCBpbmRleCkgY29uc3QgeworICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IEZYX0FycmF5U2l6ZShtX1N0b2NrRm9udHMpKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gbV9TdG9ja0ZvbnRzW2luZGV4XS5nZXQoKTsKIH0KLXN0YXRpYyBDRlhfQnl0ZVN0cmluZyBfRm9udE1hcF9HZXRCeXRlU3RyaW5nKENGWF9DaGFyTWFwKiBwTWFwLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd2lkZXN0cikKLXsKLSAgICByZXR1cm4gKChDUERGX0ZvbnRDaGFyTWFwKilwTWFwKS0+bV9wRm9udC0+RW5jb2RlU3RyaW5nKHdpZGVzdHIpOworCit2b2lkIENGWF9TdG9ja0ZvbnRBcnJheTo6U2V0Rm9udChpbnQgaW5kZXgsIENQREZfRm9udCogZm9udCkgeworICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IEZYX0FycmF5U2l6ZShtX1N0b2NrRm9udHMpKQorICAgIHJldHVybjsKKyAgbV9TdG9ja0ZvbnRzW2luZGV4XS5yZXNldChmb250KTsKIH0KLUNQREZfRm9udENoYXJNYXA6OkNQREZfRm9udENoYXJNYXAoQ1BERl9Gb250KiBwRm9udCkKLXsKLSAgICBtX0dldEJ5dGVTdHJpbmcgPSBfRm9udE1hcF9HZXRCeXRlU3RyaW5nOwotICAgIG1fR2V0V2lkZVN0cmluZyA9IF9Gb250TWFwX0dldFdpZGVTdHJpbmc7Ci0gICAgbV9wRm9udCA9IHBGb250OworCitDUERGX0ZvbnRHbG9iYWxzOjpDUERGX0ZvbnRHbG9iYWxzKCkgeworICBGWFNZU19tZW1zZXQobV9FbWJlZGRlZENoYXJzZXRzLCAwLCBzaXplb2YobV9FbWJlZGRlZENoYXJzZXRzKSk7CisgIEZYU1lTX21lbXNldChtX0VtYmVkZGVkVG9Vbmljb2RlcywgMCwgc2l6ZW9mKG1fRW1iZWRkZWRUb1VuaWNvZGVzKSk7CiB9Ci1DRlhfV2lkZVN0cmluZyBDUERGX1RvVW5pY29kZU1hcDo6TG9va3VwKEZYX0RXT1JEIGNoYXJjb2RlKQotewotICAgIEZYX0RXT1JEIHZhbHVlOwotICAgIGlmIChtX01hcC5Mb29rdXAoY2hhcmNvZGUsIHZhbHVlKSkgewotICAgICAgICBGWF9XQ0hBUiB1bmljb2RlID0gKEZYX1dDSEFSKSh2YWx1ZSAmIDB4ZmZmZik7Ci0gICAgICAgIGlmICh1bmljb2RlICE9IDB4ZmZmZikgewotICAgICAgICAgICAgcmV0dXJuIHVuaWNvZGU7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfTFBDV1NUUiBidWYgPSBtX011bHRpQ2hhckJ1Zi5HZXRCdWZmZXIoKTsKLSAgICAgICAgRlhfRFdPUkQgYnVmX2xlbiA9IG1fTXVsdGlDaGFyQnVmLkdldExlbmd0aCgpOwotICAgICAgICBpZiAoYnVmID09IE5VTEwgfHwgYnVmX2xlbiA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBGWF9EV09SRCBpbmRleCA9IHZhbHVlID4+IDE2OwotICAgICAgICBpZiAoaW5kZXggPj0gYnVmX2xlbikgewotICAgICAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRFdPUkQgbGVuID0gYnVmW2luZGV4XTsKLSAgICAgICAgaWYgKGluZGV4ICsgbGVuIDwgaW5kZXggfHwgaW5kZXggKyBsZW4gPj0gYnVmX2xlbikgewotICAgICAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKGJ1ZiArIGluZGV4ICsgMSwgbGVuKTsKKworQ1BERl9Gb250R2xvYmFsczo6fkNQREZfRm9udEdsb2JhbHMoKSB7Cit9CisKK0NQREZfRm9udCogQ1BERl9Gb250R2xvYmFsczo6RmluZChDUERGX0RvY3VtZW50KiBwRG9jLCBpbnQgaW5kZXgpIHsKKyAgYXV0byBpdCA9IG1fU3RvY2tNYXAuZmluZChwRG9jKTsKKyAgaWYgKGl0ID09IG1fU3RvY2tNYXAuZW5kKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiBpdC0+c2Vjb25kID8gaXQtPnNlY29uZC0+R2V0Rm9udChpbmRleCkgOiBudWxscHRyOworfQorCit2b2lkIENQREZfRm9udEdsb2JhbHM6OlNldChDUERGX0RvY3VtZW50KiBwRG9jLCBpbnQgaW5kZXgsIENQREZfRm9udCogcEZvbnQpIHsKKyAgaWYgKCFwZGZpdW06OkNvbnRhaW5zS2V5KG1fU3RvY2tNYXAsIHBEb2MpKQorICAgIG1fU3RvY2tNYXBbcERvY10ucmVzZXQobmV3IENGWF9TdG9ja0ZvbnRBcnJheSk7CisgIG1fU3RvY2tNYXBbcERvY10tPlNldEZvbnQoaW5kZXgsIHBGb250KTsKK30KKwordm9pZCBDUERGX0ZvbnRHbG9iYWxzOjpDbGVhcihDUERGX0RvY3VtZW50KiBwRG9jKSB7CisgIG1fU3RvY2tNYXAuZXJhc2UocERvYyk7Cit9CisKK0NQREZfRm9udDo6Q1BERl9Gb250KGludCBmb250dHlwZSkgOiBtX0ZvbnRUeXBlKGZvbnR0eXBlKSB7CisgIG1fRm9udEJCb3gubGVmdCA9IG1fRm9udEJCb3gucmlnaHQgPSBtX0ZvbnRCQm94LnRvcCA9IG1fRm9udEJCb3guYm90dG9tID0gMDsKKyAgbV9TdGVtViA9IG1fQXNjZW50ID0gbV9EZXNjZW50ID0gbV9JdGFsaWNBbmdsZSA9IDA7CisgIG1fcEZvbnRGaWxlID0gTlVMTDsKKyAgbV9GbGFncyA9IDA7CisgIG1fcFRvVW5pY29kZU1hcCA9IE5VTEw7CisgIG1fYlRvVW5pY29kZUxvYWRlZCA9IEZBTFNFOworICBtX3BDaGFyTWFwID0gbmV3IENQREZfRm9udENoYXJNYXAodGhpcyk7Cit9CitDUERGX0ZvbnQ6On5DUERGX0ZvbnQoKSB7CisgIGRlbGV0ZSBtX3BDaGFyTWFwOworICBtX3BDaGFyTWFwID0gTlVMTDsKKworICBkZWxldGUgbV9wVG9Vbmljb2RlTWFwOworICBtX3BUb1VuaWNvZGVNYXAgPSBOVUxMOworCisgIGlmIChtX3BGb250RmlsZSkgeworICAgIG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlRm9udEZpbGVTdHJlYW1BY2MoCisgICAgICAgIGNvbnN0X2Nhc3Q8Q1BERl9TdHJlYW0qPihtX3BGb250RmlsZS0+R2V0U3RyZWFtKCktPkFzU3RyZWFtKCkpKTsKKyAgfQorfQorRlhfQk9PTCBDUERGX0ZvbnQ6OklzVmVydFdyaXRpbmcoKSBjb25zdCB7CisgIEZYX0JPT0wgYlZlcnRXcml0aW5nID0gRkFMU0U7CisgIENQREZfQ0lERm9udCogcENJREZvbnQgPSBHZXRDSURGb250KCk7CisgIGlmIChwQ0lERm9udCkgeworICAgIGJWZXJ0V3JpdGluZyA9IHBDSURGb250LT5Jc1ZlcnRXcml0aW5nKCk7CisgIH0gZWxzZSB7CisgICAgYlZlcnRXcml0aW5nID0gbV9Gb250LklzVmVydGljYWwoKTsKKyAgfQorICByZXR1cm4gYlZlcnRXcml0aW5nOworfQorQ0ZYX0J5dGVTdHJpbmcgQ1BERl9Gb250OjpHZXRGb250VHlwZU5hbWUoKSBjb25zdCB7CisgIHN3aXRjaCAobV9Gb250VHlwZSkgeworICAgIGNhc2UgUERGRk9OVF9UWVBFMToKKyAgICAgIHJldHVybiAiVHlwZTEiOworICAgIGNhc2UgUERGRk9OVF9UUlVFVFlQRToKKyAgICAgIHJldHVybiAiVHJ1ZVR5cGUiOworICAgIGNhc2UgUERGRk9OVF9UWVBFMzoKKyAgICAgIHJldHVybiAiVHlwZTMiOworICAgIGNhc2UgUERGRk9OVF9DSURGT05UOgorICAgICAgcmV0dXJuICJUeXBlMCI7CisgIH0KKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Cit9Cit2b2lkIENQREZfRm9udDo6QXBwZW5kQ2hhcihDRlhfQnl0ZVN0cmluZyYgc3RyLCBGWF9EV09SRCBjaGFyY29kZSkgY29uc3QgeworICBjaGFyIGJ1Zls0XTsKKyAgaW50IGxlbiA9IEFwcGVuZENoYXIoYnVmLCBjaGFyY29kZSk7CisgIGlmIChsZW4gPT0gMSkgeworICAgIHN0ciArPSBidWZbMF07CisgIH0gZWxzZSB7CisgICAgc3RyICs9IENGWF9CeXRlU3RyaW5nKGJ1ZiwgbGVuKTsKKyAgfQorfQorQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb250OjpVbmljb2RlRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdCB7CisgIGlmICghbV9iVG9Vbmljb2RlTG9hZGVkKSB7CisgICAgKChDUERGX0ZvbnQqKXRoaXMpLT5Mb2FkVW5pY29kZU1hcCgpOworICB9CisgIGlmIChtX3BUb1VuaWNvZGVNYXApIHsKKyAgICBDRlhfV2lkZVN0cmluZyB3c1JldCA9IG1fcFRvVW5pY29kZU1hcC0+TG9va3VwKGNoYXJjb2RlKTsKKyAgICBpZiAoIXdzUmV0LklzRW1wdHkoKSkgeworICAgICAgcmV0dXJuIHdzUmV0OwogICAgIH0KLSAgICBpZiAobV9wQmFzZU1hcCkgewotICAgICAgICByZXR1cm4gbV9wQmFzZU1hcC0+VW5pY29kZUZyb21DSUQoKEZYX1dPUkQpY2hhcmNvZGUpOwotICAgIH0KKyAgfQorICBGWF9XQ0hBUiB1bmljb2RlID0gX1VuaWNvZGVGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOworICBpZiAodW5pY29kZSA9PSAwKSB7CiAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7CisgIH0KKyAgcmV0dXJuIHVuaWNvZGU7CiB9Ci1GWF9EV09SRCBDUERGX1RvVW5pY29kZU1hcDo6UmV2ZXJzZUxvb2t1cChGWF9XQ0hBUiB1bmljb2RlKQotewotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIEZYX0RXT1JEIGtleSwgdmFsdWU7Ci0gICAgICAgIG1fTWFwLkdldE5leHRBc3NvYyhwb3MsIGtleSwgdmFsdWUpOwotICAgICAgICBpZiAoKEZYX1dDSEFSKXZhbHVlID09IHVuaWNvZGUpIHsKLSAgICAgICAgICAgIHJldHVybiBrZXk7Ci0gICAgICAgIH0KK0ZYX0RXT1JEIENQREZfRm9udDo6Q2hhckNvZGVGcm9tVW5pY29kZShGWF9XQ0hBUiB1bmljb2RlKSBjb25zdCB7CisgIGlmICghbV9iVG9Vbmljb2RlTG9hZGVkKSB7CisgICAgKChDUERGX0ZvbnQqKXRoaXMpLT5Mb2FkVW5pY29kZU1hcCgpOworICB9CisgIGlmIChtX3BUb1VuaWNvZGVNYXApIHsKKyAgICBGWF9EV09SRCBjaGFyY29kZSA9IG1fcFRvVW5pY29kZU1hcC0+UmV2ZXJzZUxvb2t1cCh1bmljb2RlKTsKKyAgICBpZiAoY2hhcmNvZGUpIHsKKyAgICAgIHJldHVybiBjaGFyY29kZTsKICAgICB9CisgIH0KKyAgcmV0dXJuIF9DaGFyQ29kZUZyb21Vbmljb2RlKHVuaWNvZGUpOworfQorQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb250OjpEZWNvZGVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cikgY29uc3QgeworICBDRlhfV2lkZVN0cmluZyByZXN1bHQ7CisgIGludCBzcmNfbGVuID0gc3RyLkdldExlbmd0aCgpOworICByZXN1bHQuUmVzZXJ2ZShzcmNfbGVuKTsKKyAgY29uc3QgRlhfQ0hBUiogc3JjX2J1ZiA9IHN0cjsKKyAgaW50IHNyY19wb3MgPSAwOworICB3aGlsZSAoc3JjX3BvcyA8IHNyY19sZW4pIHsKKyAgICBGWF9EV09SRCBjaGFyY29kZSA9IEdldE5leHRDaGFyKHNyY19idWYsIHNyY19sZW4sIHNyY19wb3MpOworICAgIENGWF9XaWRlU3RyaW5nIHVuaWNvZGUgPSBVbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKyAgICBpZiAoIXVuaWNvZGUuSXNFbXB0eSgpKSB7CisgICAgICByZXN1bHQgKz0gdW5pY29kZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9IChGWF9XQ0hBUiljaGFyY29kZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KK0NGWF9CeXRlU3RyaW5nIENQREZfRm9udDo6RW5jb2RlU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIGNvbnN0IHsKKyAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0OworICBpbnQgc3JjX2xlbiA9IHN0ci5HZXRMZW5ndGgoKTsKKyAgRlhfQ0hBUiogZGVzdF9idWYgPSByZXN1bHQuR2V0QnVmZmVyKHNyY19sZW4gKiAyKTsKKyAgY29uc3QgRlhfV0NIQVIqIHNyY19idWYgPSBzdHIuY19zdHIoKTsKKyAgaW50IGRlc3RfcG9zID0gMDsKKyAgZm9yIChpbnQgc3JjX3BvcyA9IDA7IHNyY19wb3MgPCBzcmNfbGVuOyBzcmNfcG9zKyspIHsKKyAgICBGWF9EV09SRCBjaGFyY29kZSA9IENoYXJDb2RlRnJvbVVuaWNvZGUoc3JjX2J1ZltzcmNfcG9zXSk7CisgICAgZGVzdF9wb3MgKz0gQXBwZW5kQ2hhcihkZXN0X2J1ZiArIGRlc3RfcG9zLCBjaGFyY29kZSk7CisgIH0KKyAgcmVzdWx0LlJlbGVhc2VCdWZmZXIoZGVzdF9wb3MpOworICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIENQREZfRm9udDo6TG9hZEZvbnREZXNjcmlwdG9yKENQREZfRGljdGlvbmFyeSogcEZvbnREZXNjKSB7CisgIG1fRmxhZ3MgPSBwRm9udERlc2MtPkdldEludGVnZXIoIkZsYWdzIiwgUERGRk9OVF9OT05TWU1CT0xJQyk7CisgIGludCBJdGFsaWNBbmdsZSA9IDA7CisgIEZYX0JPT0wgYkV4aXN0SXRhbGljQW5nbGUgPSBGQUxTRTsKKyAgaWYgKHBGb250RGVzYy0+S2V5RXhpc3QoIkl0YWxpY0FuZ2xlIikpIHsKKyAgICBJdGFsaWNBbmdsZSA9IHBGb250RGVzYy0+R2V0SW50ZWdlcigiSXRhbGljQW5nbGUiKTsKKyAgICBiRXhpc3RJdGFsaWNBbmdsZSA9IFRSVUU7CisgIH0KKyAgaWYgKEl0YWxpY0FuZ2xlIDwgMCkgeworICAgIG1fRmxhZ3MgfD0gUERGRk9OVF9JVEFMSUM7CisgICAgbV9JdGFsaWNBbmdsZSA9IEl0YWxpY0FuZ2xlOworICB9CisgIEZYX0JPT0wgYkV4aXN0U3RlbVYgPSBGQUxTRTsKKyAgaWYgKHBGb250RGVzYy0+S2V5RXhpc3QoIlN0ZW1WIikpIHsKKyAgICBtX1N0ZW1WID0gcEZvbnREZXNjLT5HZXRJbnRlZ2VyKCJTdGVtViIpOworICAgIGJFeGlzdFN0ZW1WID0gVFJVRTsKKyAgfQorICBGWF9CT09MIGJFeGlzdEFzY2VudCA9IEZBTFNFOworICBpZiAocEZvbnREZXNjLT5LZXlFeGlzdCgiQXNjZW50IikpIHsKKyAgICBtX0FzY2VudCA9IHBGb250RGVzYy0+R2V0SW50ZWdlcigiQXNjZW50Iik7CisgICAgYkV4aXN0QXNjZW50ID0gVFJVRTsKKyAgfQorICBGWF9CT09MIGJFeGlzdERlc2NlbnQgPSBGQUxTRTsKKyAgaWYgKHBGb250RGVzYy0+S2V5RXhpc3QoIkRlc2NlbnQiKSkgeworICAgIG1fRGVzY2VudCA9IHBGb250RGVzYy0+R2V0SW50ZWdlcigiRGVzY2VudCIpOworICAgIGJFeGlzdERlc2NlbnQgPSBUUlVFOworICB9CisgIEZYX0JPT0wgYkV4aXN0Q2FwSGVpZ2h0ID0gRkFMU0U7CisgIGlmIChwRm9udERlc2MtPktleUV4aXN0KCJDYXBIZWlnaHQiKSkgeworICAgIGJFeGlzdENhcEhlaWdodCA9IFRSVUU7CisgIH0KKyAgaWYgKGJFeGlzdEl0YWxpY0FuZ2xlICYmIGJFeGlzdEFzY2VudCAmJiBiRXhpc3RDYXBIZWlnaHQgJiYgYkV4aXN0RGVzY2VudCAmJgorICAgICAgYkV4aXN0U3RlbVYpIHsKKyAgICBtX0ZsYWdzIHw9IFBERkZPTlRfVVNFRVhURVJOQVRUUjsKKyAgfQorICBpZiAobV9EZXNjZW50ID4gMTApIHsKKyAgICBtX0Rlc2NlbnQgPSAtbV9EZXNjZW50OworICB9CisgIENQREZfQXJyYXkqIHBCQm94ID0gcEZvbnREZXNjLT5HZXRBcnJheSgiRm9udEJCb3giKTsKKyAgaWYgKHBCQm94KSB7CisgICAgbV9Gb250QkJveC5sZWZ0ID0gcEJCb3gtPkdldEludGVnZXIoMCk7CisgICAgbV9Gb250QkJveC5ib3R0b20gPSBwQkJveC0+R2V0SW50ZWdlcigxKTsKKyAgICBtX0ZvbnRCQm94LnJpZ2h0ID0gcEJCb3gtPkdldEludGVnZXIoMik7CisgICAgbV9Gb250QkJveC50b3AgPSBwQkJveC0+R2V0SW50ZWdlcigzKTsKKyAgfQorCisgIENQREZfU3RyZWFtKiBwRm9udEZpbGUgPSBwRm9udERlc2MtPkdldFN0cmVhbSgiRm9udEZpbGUiKTsKKyAgaWYgKCFwRm9udEZpbGUpCisgICAgcEZvbnRGaWxlID0gcEZvbnREZXNjLT5HZXRTdHJlYW0oIkZvbnRGaWxlMiIpOworICBpZiAoIXBGb250RmlsZSkKKyAgICBwRm9udEZpbGUgPSBwRm9udERlc2MtPkdldFN0cmVhbSgiRm9udEZpbGUzIik7CisgIGlmICghcEZvbnRGaWxlKQorICAgIHJldHVybjsKKworICBtX3BGb250RmlsZSA9IG1fcERvY3VtZW50LT5Mb2FkRm9udEZpbGUocEZvbnRGaWxlKTsKKyAgaWYgKCFtX3BGb250RmlsZSkKKyAgICByZXR1cm47CisKKyAgY29uc3QgdWludDhfdCogcEZvbnREYXRhID0gbV9wRm9udEZpbGUtPkdldERhdGEoKTsKKyAgRlhfRFdPUkQgZHdGb250U2l6ZSA9IG1fcEZvbnRGaWxlLT5HZXRTaXplKCk7CisgIGlmICghbV9Gb250LkxvYWRFbWJlZGRlZChwRm9udERhdGEsIGR3Rm9udFNpemUpKSB7CisgICAgbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VGb250RmlsZVN0cmVhbUFjYygKKyAgICAgICAgY29uc3RfY2FzdDxDUERGX1N0cmVhbSo+KG1fcEZvbnRGaWxlLT5HZXRTdHJlYW0oKS0+QXNTdHJlYW0oKSkpOworICAgIG1fcEZvbnRGaWxlID0gbnVsbHB0cjsKKyAgfQorfQorCitzaG9ydCBUVDJQREYoaW50IG0sIEZYRlRfRmFjZSBmYWNlKSB7CisgIGludCB1cG0gPSBGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0oZmFjZSk7CisgIGlmICh1cG0gPT0gMCkgeworICAgIHJldHVybiAoc2hvcnQpbTsKKyAgfQorICByZXR1cm4gKG0gKiAxMDAwICsgdXBtIC8gMikgLyB1cG07Cit9Cit2b2lkIENQREZfRm9udDo6Q2hlY2tGb250TWV0cmljcygpIHsKKyAgaWYgKG1fRm9udEJCb3gudG9wID09IDAgJiYgbV9Gb250QkJveC5ib3R0b20gPT0gMCAmJiBtX0ZvbnRCQm94LmxlZnQgPT0gMCAmJgorICAgICAgbV9Gb250QkJveC5yaWdodCA9PSAwKSB7CisgICAgRlhGVF9GYWNlIGZhY2UgPSBtX0ZvbnQuR2V0RmFjZSgpOworICAgIGlmIChmYWNlKSB7CisgICAgICBtX0ZvbnRCQm94LmxlZnQgPSBUVDJQREYoRlhGVF9HZXRfRmFjZV94TWluKGZhY2UpLCBmYWNlKTsKKyAgICAgIG1fRm9udEJCb3guYm90dG9tID0gVFQyUERGKEZYRlRfR2V0X0ZhY2VfeU1pbihmYWNlKSwgZmFjZSk7CisgICAgICBtX0ZvbnRCQm94LnJpZ2h0ID0gVFQyUERGKEZYRlRfR2V0X0ZhY2VfeE1heChmYWNlKSwgZmFjZSk7CisgICAgICBtX0ZvbnRCQm94LnRvcCA9IFRUMlBERihGWEZUX0dldF9GYWNlX3lNYXgoZmFjZSksIGZhY2UpOworICAgICAgbV9Bc2NlbnQgPSBUVDJQREYoRlhGVF9HZXRfRmFjZV9Bc2NlbmRlcihmYWNlKSwgZmFjZSk7CisgICAgICBtX0Rlc2NlbnQgPSBUVDJQREYoRlhGVF9HZXRfRmFjZV9EZXNjZW5kZXIoZmFjZSksIGZhY2UpOworICAgIH0gZWxzZSB7CisgICAgICBGWF9CT09MIGJGaXJzdCA9IFRSVUU7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIEZYX1JFQ1QgcmVjdDsKKyAgICAgICAgR2V0Q2hhckJCb3goaSwgcmVjdCk7CisgICAgICAgIGlmIChyZWN0LmxlZnQgPT0gcmVjdC5yaWdodCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChiRmlyc3QpIHsKKyAgICAgICAgICBtX0ZvbnRCQm94ID0gcmVjdDsKKyAgICAgICAgICBiRmlyc3QgPSBGQUxTRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAobV9Gb250QkJveC50b3AgPCByZWN0LnRvcCkgeworICAgICAgICAgICAgbV9Gb250QkJveC50b3AgPSByZWN0LnRvcDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG1fRm9udEJCb3gucmlnaHQgPCByZWN0LnJpZ2h0KSB7CisgICAgICAgICAgICBtX0ZvbnRCQm94LnJpZ2h0ID0gcmVjdC5yaWdodDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG1fRm9udEJCb3gubGVmdCA+IHJlY3QubGVmdCkgeworICAgICAgICAgICAgbV9Gb250QkJveC5sZWZ0ID0gcmVjdC5sZWZ0OworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobV9Gb250QkJveC5ib3R0b20gPiByZWN0LmJvdHRvbSkgeworICAgICAgICAgICAgbV9Gb250QkJveC5ib3R0b20gPSByZWN0LmJvdHRvbTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKG1fQXNjZW50ID09IDAgJiYgbV9EZXNjZW50ID09IDApIHsKKyAgICBGWF9SRUNUIHJlY3Q7CisgICAgR2V0Q2hhckJCb3goJ0EnLCByZWN0KTsKKyAgICBpZiAocmVjdC5ib3R0b20gPT0gcmVjdC50b3ApIHsKKyAgICAgIG1fQXNjZW50ID0gbV9Gb250QkJveC50b3A7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fQXNjZW50ID0gcmVjdC50b3A7CisgICAgfQorICAgIEdldENoYXJCQm94KCdnJywgcmVjdCk7CisgICAgaWYgKHJlY3QuYm90dG9tID09IHJlY3QudG9wKSB7CisgICAgICBtX0Rlc2NlbnQgPSBtX0ZvbnRCQm94LmJvdHRvbTsKKyAgICB9IGVsc2UgeworICAgICAgbV9EZXNjZW50ID0gcmVjdC5ib3R0b207CisgICAgfQorICB9Cit9Cit2b2lkIENQREZfRm9udDo6TG9hZFVuaWNvZGVNYXAoKSB7CisgIG1fYlRvVW5pY29kZUxvYWRlZCA9IFRSVUU7CisgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gbV9wRm9udERpY3QtPkdldFN0cmVhbSgiVG9Vbmljb2RlIik7CisgIGlmICghcFN0cmVhbSkgeworICAgIHJldHVybjsKKyAgfQorICBtX3BUb1VuaWNvZGVNYXAgPSBuZXcgQ1BERl9Ub1VuaWNvZGVNYXA7CisgIG1fcFRvVW5pY29kZU1hcC0+TG9hZChwU3RyZWFtKTsKK30KK2ludCBDUERGX0ZvbnQ6OkdldFN0cmluZ1dpZHRoKGNvbnN0IEZYX0NIQVIqIHBTdHJpbmcsIGludCBzaXplKSB7CisgIGludCBvZmZzZXQgPSAwOworICBpbnQgd2lkdGggPSAwOworICB3aGlsZSAob2Zmc2V0IDwgc2l6ZSkgeworICAgIEZYX0RXT1JEIGNoYXJjb2RlID0gR2V0TmV4dENoYXIocFN0cmluZywgc2l6ZSwgb2Zmc2V0KTsKKyAgICB3aWR0aCArPSBHZXRDaGFyV2lkdGhGKGNoYXJjb2RlKTsKKyAgfQorICByZXR1cm4gd2lkdGg7Cit9CitpbnQgQ1BERl9Gb250OjpHZXRDaGFyVHlwZVdpZHRoKEZYX0RXT1JEIGNoYXJjb2RlKSB7CisgIGlmICghbV9Gb250LkdldEZhY2UoKSkKICAgICByZXR1cm4gMDsKKworICBpbnQgZ2x5cGhfaW5kZXggPSBHbHlwaEZyb21DaGFyQ29kZShjaGFyY29kZSk7CisgIGlmIChnbHlwaF9pbmRleCA9PSAweGZmZmYpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gbV9Gb250LkdldEdseXBoV2lkdGgoZ2x5cGhfaW5kZXgpOwogfQotc3RhdGljIEZYX0RXT1JEIF9TdHJpbmdUb0NvZGUoRlhfQlNUUiBzdHIpCi17Ci0gICAgRlhfTFBDU1RSIGJ1ZiA9IHN0ci5HZXRDU3RyKCk7Ci0gICAgaW50IGxlbiA9IHN0ci5HZXRMZW5ndGgoKTsKLSAgICBpZiAobGVuID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGludCByZXN1bHQgPSAwOwotICAgIGlmIChidWZbMF0gPT0gJzwnKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuOyBpICsrKSB7Ci0gICAgICAgICAgICBpbnQgZGlnaXQ7Ci0gICAgICAgICAgICBpZiAoYnVmW2ldID49ICcwJyAmJiBidWZbaV0gPD0gJzknKSB7Ci0gICAgICAgICAgICAgICAgZGlnaXQgPSBidWZbaV0gLSAnMCc7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGJ1ZltpXSA+PSAnYScgJiYgYnVmW2ldIDw9ICdmJykgewotICAgICAgICAgICAgICAgIGRpZ2l0ID0gYnVmW2ldIC0gJ2EnICsgMTA7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGJ1ZltpXSA+PSAnQScgJiYgYnVmW2ldIDw9ICdGJykgewotICAgICAgICAgICAgICAgIGRpZ2l0ID0gYnVmW2ldIC0gJ0EnICsgMTA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICogMTYgKyBkaWdpdDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpICsrKSB7Ci0gICAgICAgICAgICBpZiAoYnVmW2ldIDwgJzAnIHx8IGJ1ZltpXSA+ICc5JykgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICogMTAgKyBidWZbaV0gLSAnMCc7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKKworQ1BERl9Gb250KiBDUERGX0ZvbnQ6OkdldFN0b2NrRm9udChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgZm9udG5hbWUobmFtZSk7CisgIGludCBmb250X2lkID0gUERGX0dldFN0YW5kYXJkRm9udE5hbWUoJmZvbnRuYW1lKTsKKyAgaWYgKGZvbnRfaWQgPCAwKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgQ1BERl9Gb250R2xvYmFscyogcEZvbnRHbG9iYWxzID0KKyAgICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRGb250R2xvYmFscygpOworICBDUERGX0ZvbnQqIHBGb250ID0gcEZvbnRHbG9iYWxzLT5GaW5kKHBEb2MsIGZvbnRfaWQpOworICBpZiAocEZvbnQpIHsKKyAgICByZXR1cm4gcEZvbnQ7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgIHBEaWN0LT5TZXRBdE5hbWUoIlR5cGUiLCAiRm9udCIpOworICBwRGljdC0+U2V0QXROYW1lKCJTdWJ0eXBlIiwgIlR5cGUxIik7CisgIHBEaWN0LT5TZXRBdE5hbWUoIkJhc2VGb250IiwgZm9udG5hbWUpOworICBwRGljdC0+U2V0QXROYW1lKCJFbmNvZGluZyIsICJXaW5BbnNpRW5jb2RpbmciKTsKKyAgcEZvbnQgPSBDUERGX0ZvbnQ6OkNyZWF0ZUZvbnRGKE5VTEwsIHBEaWN0KTsKKyAgcEZvbnRHbG9iYWxzLT5TZXQocERvYywgZm9udF9pZCwgcEZvbnQpOworICByZXR1cm4gcEZvbnQ7CiB9Ci1zdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgX1N0cmluZ0RhdGFBZGQoQ0ZYX1dpZGVTdHJpbmcgc3RyKQotewotICAgIENGWF9XaWRlU3RyaW5nIHJldDsKLSAgICBpbnQgbGVuID0gc3RyLkdldExlbmd0aCgpOwotICAgIEZYX1dDSEFSIHZhbHVlID0gMTsKLSAgICBmb3IgKGludCBpID0gbGVuIC0gMTsgaSA+PSAwIDsgLS1pKSB7Ci0gICAgICAgIEZYX1dDSEFSIGNoID0gc3RyW2ldICsgdmFsdWU7Ci0gICAgICAgIGlmIChjaCA8IHN0cltpXSkgewotICAgICAgICAgICAgcmV0Lkluc2VydCgwLCAwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldC5JbnNlcnQoMCwgY2gpOwotICAgICAgICAgICAgdmFsdWUgPSAwOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICh2YWx1ZSkgewotICAgICAgICByZXQuSW5zZXJ0KDAsIHZhbHVlKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLXN0YXRpYyBDRlhfV2lkZVN0cmluZyBfU3RyaW5nVG9XaWRlU3RyaW5nKEZYX0JTVFIgc3RyKQotewotICAgIEZYX0xQQ1NUUiBidWYgPSBzdHIuR2V0Q1N0cigpOwotICAgIGludCBsZW4gPSBzdHIuR2V0TGVuZ3RoKCk7Ci0gICAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotICAgIH0KLSAgICBDRlhfV2lkZVN0cmluZyByZXN1bHQ7Ci0gICAgaWYgKGJ1ZlswXSA9PSAnPCcpIHsKLSAgICAgICAgaW50IGJ5dGVfcG9zID0gMDsKLSAgICAgICAgRlhfV0NIQVIgY2ggPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGxlbjsgaSArKykgewotICAgICAgICAgICAgaW50IGRpZ2l0OwotICAgICAgICAgICAgaWYgKGJ1ZltpXSA+PSAnMCcgJiYgYnVmW2ldIDw9ICc5JykgewotICAgICAgICAgICAgICAgIGRpZ2l0ID0gYnVmW2ldIC0gJzAnOwotICAgICAgICAgICAgfSBlbHNlIGlmIChidWZbaV0gPj0gJ2EnICYmIGJ1ZltpXSA8PSAnZicpIHsKLSAgICAgICAgICAgICAgICBkaWdpdCA9IGJ1ZltpXSAtICdhJyArIDEwOwotICAgICAgICAgICAgfSBlbHNlIGlmIChidWZbaV0gPj0gJ0EnICYmIGJ1ZltpXSA8PSAnRicpIHsKLSAgICAgICAgICAgICAgICBkaWdpdCA9IGJ1ZltpXSAtICdBJyArIDEwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoID0gY2ggKiAxNiArIGRpZ2l0OwotICAgICAgICAgICAgYnl0ZV9wb3MgKys7Ci0gICAgICAgICAgICBpZiAoYnl0ZV9wb3MgPT0gNCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCArPSBjaDsKLSAgICAgICAgICAgICAgICBieXRlX3BvcyA9IDA7Ci0gICAgICAgICAgICAgICAgY2ggPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGlmIChidWZbMF0gPT0gJygnKSB7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci12b2lkIENQREZfVG9Vbmljb2RlTWFwOjpMb2FkKENQREZfU3RyZWFtKiBwU3RyZWFtKQotewotICAgIGludCBDSURTZXQgPSAwOwotICAgIENQREZfU3RyZWFtQWNjIHN0cmVhbTsKLSAgICBzdHJlYW0uTG9hZEFsbERhdGEocFN0cmVhbSwgRkFMU0UpOwotICAgIENQREZfU2ltcGxlUGFyc2VyIHBhcnNlcihzdHJlYW0uR2V0RGF0YSgpLCBzdHJlYW0uR2V0U2l6ZSgpKTsKLSAgICBtX01hcC5Fc3RpbWF0ZVNpemUoc3RyZWFtLkdldFNpemUoKSAvIDgsIDEwMjQpOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nQyB3b3JkID0gcGFyc2VyLkdldFdvcmQoKTsKLSAgICAgICAgaWYgKHdvcmQuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAod29yZCA9PSBGWF9CU1RSQygiYmVnaW5iZmNoYXIiKSkgewotICAgICAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgICAgICB3b3JkID0gcGFyc2VyLkdldFdvcmQoKTsKLSAgICAgICAgICAgICAgICBpZiAod29yZC5Jc0VtcHR5KCkgfHwgd29yZCA9PSBGWF9CU1RSQygiZW5kYmZjaGFyIikpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY2NvZGUgPSBfU3RyaW5nVG9Db2RlKHdvcmQpOwotICAgICAgICAgICAgICAgIHdvcmQgPSBwYXJzZXIuR2V0V29yZCgpOwotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGRlc3Rjb2RlID0gX1N0cmluZ1RvV2lkZVN0cmluZyh3b3JkKTsKLSAgICAgICAgICAgICAgICBpbnQgbGVuID0gZGVzdGNvZGUuR2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobGVuID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9NYXAuU2V0QXQoc3JjY29kZSwgZGVzdGNvZGUuR2V0QXQoMCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fTWFwLlNldEF0KHNyY2NvZGUsIG1fTXVsdGlDaGFyQnVmLkdldExlbmd0aCgpICogMHgxMDAwMCArIDB4ZmZmZik7Ci0gICAgICAgICAgICAgICAgICAgIG1fTXVsdGlDaGFyQnVmLkFwcGVuZENoYXIoZGVzdGNvZGUuR2V0TGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICBtX011bHRpQ2hhckJ1ZiA8PCBkZXN0Y29kZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAod29yZCA9PSBGWF9CU1RSQygiYmVnaW5iZnJhbmdlIikpIHsKLSAgICAgICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbG93LCBoaWdoOwotICAgICAgICAgICAgICAgIGxvdyA9IHBhcnNlci5HZXRXb3JkKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxvdy5Jc0VtcHR5KCkgfHwgbG93ID09IEZYX0JTVFJDKCJlbmRiZnJhbmdlIikpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGhpZ2ggPSBwYXJzZXIuR2V0V29yZCgpOwotICAgICAgICAgICAgICAgIEZYX0RXT1JEIGxvd2NvZGUgPSBfU3RyaW5nVG9Db2RlKGxvdyk7Ci0gICAgICAgICAgICAgICAgRlhfRFdPUkQgaGlnaGNvZGUgPSAobG93Y29kZSAmIDB4ZmZmZmZmMDApIHwgKF9TdHJpbmdUb0NvZGUoaGlnaCkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICBpZiAoaGlnaGNvZGUgPT0gKEZYX0RXT1JEKSAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0YXJ0ID0gcGFyc2VyLkdldFdvcmQoKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPT0gRlhfQlNUUkMoIlsiKSkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKEZYX0RXT1JEIGNvZGUgPSBsb3djb2RlOyBjb2RlIDw9IGhpZ2hjb2RlOyBjb2RlICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBkZXN0ID0gcGFyc2VyLkdldFdvcmQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGRlc3Rjb2RlID0gX1N0cmluZ1RvV2lkZVN0cmluZyhkZXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSBkZXN0Y29kZS5HZXRMZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9NYXAuU2V0QXQoY29kZSwgZGVzdGNvZGUuR2V0QXQoMCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX01hcC5TZXRBdChjb2RlLCBtX011bHRpQ2hhckJ1Zi5HZXRMZW5ndGgoKSAqIDB4MTAwMDAgKyAweGZmZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fTXVsdGlDaGFyQnVmLkFwcGVuZENoYXIoZGVzdGNvZGUuR2V0TGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fTXVsdGlDaGFyQnVmIDw8IGRlc3Rjb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBhcnNlci5HZXRXb3JkKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgZGVzdGNvZGUgPSBfU3RyaW5nVG9XaWRlU3RyaW5nKHN0YXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IGRlc3Rjb2RlLkdldExlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCB2YWx1ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBfU3RyaW5nVG9Db2RlKHN0YXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgY29kZSA9IGxvd2NvZGU7IGNvZGUgPD0gaGlnaGNvZGU7IGNvZGUgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX01hcC5TZXRBdChjb2RlLCB2YWx1ZSsrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgY29kZSA9IGxvd2NvZGU7IGNvZGUgPD0gaGlnaGNvZGU7IGNvZGUgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyByZXRjb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IGxvd2NvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0Y29kZSA9IGRlc3Rjb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldGNvZGUgPSBfU3RyaW5nRGF0YUFkZChkZXN0Y29kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fTWFwLlNldEF0KGNvZGUsIG1fTXVsdGlDaGFyQnVmLkdldExlbmd0aCgpICogMHgxMDAwMCArIDB4ZmZmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9NdWx0aUNoYXJCdWYuQXBwZW5kQ2hhcihyZXRjb2RlLkdldExlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX011bHRpQ2hhckJ1ZiA8PCByZXRjb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rjb2RlID0gcmV0Y29kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh3b3JkID09IEZYX0JTVFJDKCIvQWRvYmUtS29yZWExLVVDUzIiKSkgewotICAgICAgICAgICAgQ0lEU2V0ID0gQ0lEU0VUX0tPUkVBMTsKLSAgICAgICAgfSBlbHNlIGlmICh3b3JkID09IEZYX0JTVFJDKCIvQWRvYmUtSmFwYW4xLVVDUzIiKSkgewotICAgICAgICAgICAgQ0lEU2V0ID0gQ0lEU0VUX0pBUEFOMTsKLSAgICAgICAgfSBlbHNlIGlmICh3b3JkID09IEZYX0JTVFJDKCIvQWRvYmUtQ05TMS1VQ1MyIikpIHsKLSAgICAgICAgICAgIENJRFNldCA9IENJRFNFVF9DTlMxOwotICAgICAgICB9IGVsc2UgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIi9BZG9iZS1HQjEtVUNTMiIpKSB7Ci0gICAgICAgICAgICBDSURTZXQgPSBDSURTRVRfR0IxOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChDSURTZXQpIHsKLSAgICAgICAgbV9wQmFzZU1hcCA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRGb250R2xvYmFscygpLT5tX0NNYXBNYW5hZ2VyLkdldENJRDJVbmljb2RlTWFwKENJRFNldCwgRkFMU0UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcEJhc2VNYXAgPSBOVUxMOwotICAgIH0KLX0KLXN0YXRpYyBGWF9CT09MIEdldFByZWRlZmluZWRFbmNvZGluZyhpbnQmIGJhc2VtYXAsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiB2YWx1ZSkKLXsKLSAgICBpZiAodmFsdWUgPT0gRlhfQlNUUkMoIldpbkFuc2lFbmNvZGluZyIpKSB7Ci0gICAgICAgIGJhc2VtYXAgPSBQREZGT05UX0VOQ09ESU5HX1dJTkFOU0k7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBGWF9CU1RSQygiTWFjUm9tYW5FbmNvZGluZyIpKSB7Ci0gICAgICAgIGJhc2VtYXAgPSBQREZGT05UX0VOQ09ESU5HX01BQ1JPTUFOOwotICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gRlhfQlNUUkMoIk1hY0V4cGVydEVuY29kaW5nIikpIHsKLSAgICAgICAgYmFzZW1hcCA9IFBERkZPTlRfRU5DT0RJTkdfTUFDRVhQRVJUOwotICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gRlhfQlNUUkMoIlBERkRvY0VuY29kaW5nIikpIHsKLSAgICAgICAgYmFzZW1hcCA9IFBERkZPTlRfRU5DT0RJTkdfUERGRE9DOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci12b2lkIENQREZfRm9udDo6TG9hZFBERkVuY29kaW5nKENQREZfT2JqZWN0KiBwRW5jb2RpbmcsIGludCYgaUJhc2VFbmNvZGluZywgQ0ZYX0J5dGVTdHJpbmcqJiBwQ2hhck5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJFbWJlZGRlZCwgRlhfQk9PTCBiVHJ1ZVR5cGUpCi17Ci0gICAgaWYgKHBFbmNvZGluZyA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChtX0Jhc2VGb250ID09IEZYX0JTVFJDKCJTeW1ib2wiKSkgewotICAgICAgICAgICAgaUJhc2VFbmNvZGluZyA9IGJUcnVlVHlwZSA/IFBERkZPTlRfRU5DT0RJTkdfTVNfU1lNQk9MIDogUERGRk9OVF9FTkNPRElOR19BRE9CRV9TWU1CT0w7Ci0gICAgICAgIH0gZWxzZSBpZiAoIWJFbWJlZGRlZCAmJiBpQmFzZUVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfQlVJTFRJTikgewotICAgICAgICAgICAgaUJhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfV0lOQU5TSTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwRW5jb2RpbmctPkdldFR5cGUoKSA9PSBQREZPQkpfTkFNRSkgewotICAgICAgICBpZiAoaUJhc2VFbmNvZGluZyA9PSBQREZGT05UX0VOQ09ESU5HX0FET0JFX1NZTUJPTCB8fCBpQmFzZUVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfWkFQRkRJTkdCQVRTKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChtX0ZsYWdzICYgUERGRk9OVF9TWU1CT0xJQykgJiYgbV9CYXNlRm9udCA9PSBGWF9CU1RSQygiU3ltYm9sIikpIHsKLSAgICAgICAgICAgIGlmICghYlRydWVUeXBlKSB7Ci0gICAgICAgICAgICAgICAgaUJhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfQURPQkVfU1lNQk9MOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzRW5jb2RpbmcgPSBwRW5jb2RpbmctPkdldFN0cmluZygpOwotICAgICAgICBpZiAoYnNFbmNvZGluZy5Db21wYXJlKEZYX0JTVFJDKCJNYWNFeHBlcnRFbmNvZGluZyIpKSA9PSAwKSB7Ci0gICAgICAgICAgICBic0VuY29kaW5nID0gRlhfQlNUUkMoIldpbkFuc2lFbmNvZGluZyIpOwotICAgICAgICB9Ci0gICAgICAgIEdldFByZWRlZmluZWRFbmNvZGluZyhpQmFzZUVuY29kaW5nLCBic0VuY29kaW5nKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAocEVuY29kaW5nLT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gKENQREZfRGljdGlvbmFyeSopcEVuY29kaW5nOwotICAgIGlmIChpQmFzZUVuY29kaW5nICE9IFBERkZPTlRfRU5DT0RJTkdfQURPQkVfU1lNQk9MICYmIGlCYXNlRW5jb2RpbmcgIT0gUERGRk9OVF9FTkNPRElOR19aQVBGRElOR0JBVFMpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNFbmNvZGluZyA9IHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkJhc2VFbmNvZGluZyIpKTsKLSAgICAgICAgaWYgKGJzRW5jb2RpbmcuQ29tcGFyZShGWF9CU1RSQygiTWFjRXhwZXJ0RW5jb2RpbmciKSkgPT0gMCAmJiBiVHJ1ZVR5cGUpIHsKLSAgICAgICAgICAgIGJzRW5jb2RpbmcgPSBGWF9CU1RSQygiV2luQW5zaUVuY29kaW5nIik7Ci0gICAgICAgIH0KLSAgICAgICAgR2V0UHJlZGVmaW5lZEVuY29kaW5nKGlCYXNlRW5jb2RpbmcsIGJzRW5jb2RpbmcpOwotICAgIH0KLSAgICBpZiAoKCFiRW1iZWRkZWQgfHwgYlRydWVUeXBlKSAmJiBpQmFzZUVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfQlVJTFRJTikgewotICAgICAgICBpQmFzZUVuY29kaW5nID0gUERGRk9OVF9FTkNPRElOR19TVEFOREFSRDsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcERpZmZzID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJEaWZmZXJlbmNlcyIpKTsKLSAgICBpZiAocERpZmZzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwQ2hhck5hbWVzID0gbmV3IENGWF9CeXRlU3RyaW5nWzI1Nl07Ci0gICAgRlhfRFdPUkQgY3VyX2NvZGUgPSAwOwotICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwRGlmZnMtPkdldENvdW50KCk7IGkgKyspIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBFbGVtZW50ID0gcERpZmZzLT5HZXRFbGVtZW50VmFsdWUoaSk7Ci0gICAgICAgIGlmIChwRWxlbWVudCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocEVsZW1lbnQtPkdldFR5cGUoKSA9PSBQREZPQkpfTkFNRSkgewotICAgICAgICAgICAgaWYgKGN1cl9jb2RlIDwgMjU2KSB7Ci0gICAgICAgICAgICAgICAgcENoYXJOYW1lc1tjdXJfY29kZV0gPSAoKENQREZfTmFtZSopcEVsZW1lbnQpLT5HZXRTdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGN1cl9jb2RlICsrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY3VyX2NvZGUgPSBwRWxlbWVudC0+R2V0SW50ZWdlcigpOwotICAgICAgICB9Ci0gICAgfQotfQotRlhfQk9PTCBDUERGX0ZvbnQ6OklzU3RhbmRhcmRGb250KCkgY29uc3QKLXsKLSAgICBpZiAobV9Gb250VHlwZSAhPSBQREZGT05UX1RZUEUxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG1fcEZvbnRGaWxlICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoKChDUERGX1R5cGUxRm9udCopdGhpcyktPkdldEJhc2UxNEZvbnQoKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLWV4dGVybiBGWF9MUENTVFIgUERGX0NoYXJOYW1lRnJvbVByZWRlZmluZWRDaGFyU2V0KGludCBlbmNvZGluZywgRlhfQllURSBjaGFyY29kZSk7Ci1DUERGX1NpbXBsZUZvbnQ6OkNQREZfU2ltcGxlRm9udChpbnQgZm9udHR5cGUpIDogQ1BERl9Gb250KGZvbnR0eXBlKQotewotICAgIEZYU1lTX21lbXNldDgobV9DaGFyQkJveCwgMHhmZiwgc2l6ZW9mIG1fQ2hhckJCb3gpOwotICAgIEZYU1lTX21lbXNldDgobV9DaGFyV2lkdGgsIDB4ZmYsIHNpemVvZiBtX0NoYXJXaWR0aCk7Ci0gICAgRlhTWVNfbWVtc2V0OChtX0dseXBoSW5kZXgsIDB4ZmYsIHNpemVvZiBtX0dseXBoSW5kZXgpOwotICAgIEZYU1lTX21lbXNldDgobV9FeHRHSUQsIDB4ZmYsIHNpemVvZiBtX0V4dEdJRCk7Ci0gICAgbV9wQ2hhck5hbWVzID0gTlVMTDsKLSAgICBtX0Jhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfQlVJTFRJTjsKLX0KLUNQREZfU2ltcGxlRm9udDo6fkNQREZfU2ltcGxlRm9udCgpCi17Ci0gICAgZGVsZXRlW10gbV9wQ2hhck5hbWVzOwotfQotaW50IENQREZfU2ltcGxlRm9udDo6R2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUsIEZYX0JPT0wgKnBWZXJ0R2x5cGgpCi17Ci0gICAgaWYgKHBWZXJ0R2x5cGgpIHsKLSAgICAgICAgKnBWZXJ0R2x5cGggPSBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKGNoYXJjb2RlID4gMHhmZikgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGludCBpbmRleCA9IG1fR2x5cGhJbmRleFsoRlhfQllURSljaGFyY29kZV07Ci0gICAgaWYgKGluZGV4ID09IDB4ZmZmZikgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHJldHVybiBpbmRleDsKLX0KLXZvaWQgQ1BERl9TaW1wbGVGb250OjpMb2FkQ2hhck1ldHJpY3MoaW50IGNoYXJjb2RlKQotewotICAgIGlmIChtX0ZvbnQubV9GYWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoY2hhcmNvZGUgPCAwIHx8IGNoYXJjb2RlID4gMHhmZikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludCBnbHlwaF9pbmRleCA9IG1fR2x5cGhJbmRleFtjaGFyY29kZV07Ci0gICAgaWYgKGdseXBoX2luZGV4ID09IDB4ZmZmZikgewotICAgICAgICBpZiAobV9wRm9udEZpbGUgPT0gTlVMTCAmJiBjaGFyY29kZSAhPSAzMikgewotICAgICAgICAgICAgTG9hZENoYXJNZXRyaWNzKDMyKTsKLSAgICAgICAgICAgIG1fQ2hhckJCb3hbY2hhcmNvZGVdID0gbV9DaGFyQkJveFszMl07Ci0gICAgICAgICAgICBpZiAobV9iVXNlRm9udFdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgbV9DaGFyV2lkdGhbY2hhcmNvZGVdID0gbV9DaGFyV2lkdGhbMzJdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IGVyciA9IEZYRlRfTG9hZF9HbHlwaChtX0ZvbnQubV9GYWNlLCBnbHlwaF9pbmRleCwgRlhGVF9MT0FEX05PX1NDQUxFIHwgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCk7Ci0gICAgaWYgKGVycikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fQ2hhckJCb3hbY2hhcmNvZGVdLkxlZnQgPSBUVDJQREYoRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdYKG1fRm9udC5tX0ZhY2UpLCBtX0ZvbnQubV9GYWNlKTsKLSAgICBtX0NoYXJCQm94W2NoYXJjb2RlXS5SaWdodCA9IFRUMlBERihGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1gobV9Gb250Lm1fRmFjZSkgKyBGWEZUX0dldF9HbHlwaF9XaWR0aChtX0ZvbnQubV9GYWNlKSwgbV9Gb250Lm1fRmFjZSk7Ci0gICAgbV9DaGFyQkJveFtjaGFyY29kZV0uVG9wID0gVFQyUERGKEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWShtX0ZvbnQubV9GYWNlKSwgbV9Gb250Lm1fRmFjZSk7Ci0gICAgbV9DaGFyQkJveFtjaGFyY29kZV0uQm90dG9tID0gVFQyUERGKEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWShtX0ZvbnQubV9GYWNlKSAtIEZYRlRfR2V0X0dseXBoX0hlaWdodChtX0ZvbnQubV9GYWNlKSwgbV9Gb250Lm1fRmFjZSk7Ci0gICAgaWYgKG1fYlVzZUZvbnRXaWR0aCkgewotICAgICAgICBpbnQgVFRfV2lkdGggPSBUVDJQREYoRlhGVF9HZXRfR2x5cGhfSG9yaUFkdmFuY2UobV9Gb250Lm1fRmFjZSksIG1fRm9udC5tX0ZhY2UpOwotICAgICAgICBpZiAobV9DaGFyV2lkdGhbY2hhcmNvZGVdID09IDB4ZmZmZikgewotICAgICAgICAgICAgbV9DaGFyV2lkdGhbY2hhcmNvZGVdID0gVFRfV2lkdGg7Ci0gICAgICAgIH0gZWxzZSBpZiAoVFRfV2lkdGggJiYgIUlzRW1iZWRkZWQoKSkgewotICAgICAgICAgICAgbV9DaGFyQkJveFtjaGFyY29kZV0uUmlnaHQgPSBtX0NoYXJCQm94W2NoYXJjb2RlXS5SaWdodCAqIG1fQ2hhcldpZHRoW2NoYXJjb2RlXSAvIFRUX1dpZHRoOwotICAgICAgICAgICAgbV9DaGFyQkJveFtjaGFyY29kZV0uTGVmdCA9IG1fQ2hhckJCb3hbY2hhcmNvZGVdLkxlZnQgKiBtX0NoYXJXaWR0aFtjaGFyY29kZV0gLyBUVF9XaWR0aDsKLSAgICAgICAgfQotICAgIH0KLX0KLWludCBDUERGX1NpbXBsZUZvbnQ6OkdldENoYXJXaWR0aEYoRlhfRFdPUkQgY2hhcmNvZGUsIGludCBsZXZlbCkKLXsKLSAgICBpZiAoY2hhcmNvZGUgPiAweGZmKSB7Ci0gICAgICAgIGNoYXJjb2RlID0gMDsKLSAgICB9Ci0gICAgaWYgKG1fQ2hhcldpZHRoW2NoYXJjb2RlXSA9PSAweGZmZmYpIHsKLSAgICAgICAgTG9hZENoYXJNZXRyaWNzKGNoYXJjb2RlKTsKLSAgICAgICAgaWYgKG1fQ2hhcldpZHRoW2NoYXJjb2RlXSA9PSAweGZmZmYpIHsKLSAgICAgICAgICAgIG1fQ2hhcldpZHRoW2NoYXJjb2RlXSA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChGWF9JTlQxNiltX0NoYXJXaWR0aFtjaGFyY29kZV07Ci19Ci12b2lkIENQREZfU2ltcGxlRm9udDo6R2V0Q2hhckJCb3goRlhfRFdPUkQgY2hhcmNvZGUsIEZYX1JFQ1QmIHJlY3QsIGludCBsZXZlbCkKLXsKLSAgICBpZiAoY2hhcmNvZGUgPiAweGZmKSB7Ci0gICAgICAgIGNoYXJjb2RlID0gMDsKLSAgICB9Ci0gICAgaWYgKG1fQ2hhckJCb3hbY2hhcmNvZGVdLkxlZnQgPT0gKEZYX1NIT1JUKTB4ZmZmZikgewotICAgICAgICBMb2FkQ2hhck1ldHJpY3MoY2hhcmNvZGUpOwotICAgIH0KLSAgICByZWN0LmxlZnQgPSBtX0NoYXJCQm94W2NoYXJjb2RlXS5MZWZ0OwotICAgIHJlY3QucmlnaHQgPSBtX0NoYXJCQm94W2NoYXJjb2RlXS5SaWdodDsKLSAgICByZWN0LmJvdHRvbSA9IG1fQ2hhckJCb3hbY2hhcmNvZGVdLkJvdHRvbTsKLSAgICByZWN0LnRvcCA9IG1fQ2hhckJCb3hbY2hhcmNvZGVdLlRvcDsKLX0KLUZYX0xQQ1NUUiBHZXRBZG9iZUNoYXJOYW1lKGludCBpQmFzZUVuY29kaW5nLCBjb25zdCBDRlhfQnl0ZVN0cmluZyogcENoYXJOYW1lcywgaW50IGNoYXJjb2RlKQotewotICAgIEFTU0VSVChjaGFyY29kZSA+PSAwICYmIGNoYXJjb2RlIDwgMjU2KTsKLSAgICBpZiAoY2hhcmNvZGUgPCAwIHx8IGNoYXJjb2RlID49IDI1NikgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgRlhfTFBDU1RSIG5hbWUgPSBOVUxMOwotICAgIGlmIChwQ2hhck5hbWVzKSB7Ci0gICAgICAgIG5hbWUgPSBwQ2hhck5hbWVzW2NoYXJjb2RlXTsKLSAgICB9Ci0gICAgaWYgKChuYW1lID09IE5VTEwgfHwgbmFtZVswXSA9PSAwKSAmJiBpQmFzZUVuY29kaW5nKSB7Ci0gICAgICAgIG5hbWUgPSBQREZfQ2hhck5hbWVGcm9tUHJlZGVmaW5lZENoYXJTZXQoaUJhc2VFbmNvZGluZywgY2hhcmNvZGUpOwotICAgIH0KLSAgICBpZiAobmFtZSA9PSBOVUxMIHx8IG5hbWVbMF0gPT0gMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIG5hbWU7Ci19Ci1GWF9CT09MIENQREZfU2ltcGxlRm9udDo6TG9hZENvbW1vbigpCi17Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERlc2MgPSBtX3BGb250RGljdC0+R2V0RGljdChGWF9CU1RSQygiRm9udERlc2NyaXB0b3IiKSk7Ci0gICAgaWYgKHBGb250RGVzYykgewotICAgICAgICBMb2FkRm9udERlc2NyaXB0b3IocEZvbnREZXNjKTsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcFdpZHRoQXJyYXkgPSBtX3BGb250RGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIldpZHRocyIpKTsKLSAgICBpbnQgd2lkdGhfc3RhcnQgPSAwLCB3aWR0aF9lbmQgPSAtMTsKLSAgICBtX2JVc2VGb250V2lkdGggPSBUUlVFOwotICAgIGlmIChwV2lkdGhBcnJheSkgewotICAgICAgICBtX2JVc2VGb250V2lkdGggPSBGQUxTRTsKLSAgICAgICAgaWYgKHBGb250RGVzYyAmJiBwRm9udERlc2MtPktleUV4aXN0KEZYX0JTVFJDKCJNaXNzaW5nV2lkdGgiKSkpIHsKLSAgICAgICAgICAgIGludCBNaXNzaW5nV2lkdGggPSBwRm9udERlc2MtPkdldEludGVnZXIoRlhfQlNUUkMoIk1pc3NpbmdXaWR0aCIpKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgbV9DaGFyV2lkdGhbaV0gPSBNaXNzaW5nV2lkdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd2lkdGhfc3RhcnQgPSBtX3BGb250RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiRmlyc3RDaGFyIiksIDApOwotICAgICAgICB3aWR0aF9lbmQgPSBtX3BGb250RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiTGFzdENoYXIiKSwgMCk7Ci0gICAgICAgIGlmICh3aWR0aF9zdGFydCA+PSAwICYmIHdpZHRoX3N0YXJ0IDw9IDI1NSkgewotICAgICAgICAgICAgaWYgKHdpZHRoX2VuZCA8PSAwIHx8IHdpZHRoX2VuZCA+PSB3aWR0aF9zdGFydCArIChpbnQpcFdpZHRoQXJyYXktPkdldENvdW50KCkpIHsKLSAgICAgICAgICAgICAgICB3aWR0aF9lbmQgPSB3aWR0aF9zdGFydCArIHBXaWR0aEFycmF5LT5HZXRDb3VudCgpIC0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh3aWR0aF9lbmQgPiAyNTUpIHsKLSAgICAgICAgICAgICAgICB3aWR0aF9lbmQgPSAyNTU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gd2lkdGhfc3RhcnQ7IGkgPD0gd2lkdGhfZW5kOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgbV9DaGFyV2lkdGhbaV0gPSBwV2lkdGhBcnJheS0+R2V0SW50ZWdlcihpIC0gd2lkdGhfc3RhcnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtX3BGb250RmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgIExvYWRTdWJzdEZvbnQoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAobV9CYXNlRm9udC5HZXRMZW5ndGgoKSA+IDggJiYgbV9CYXNlRm9udFs3XSA9PSAnKycpIHsKLSAgICAgICAgICAgIG1fQmFzZUZvbnQgPSBtX0Jhc2VGb250Lk1pZCg4KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIShtX0ZsYWdzICYgUERGRk9OVF9TWU1CT0xJQykpIHsKLSAgICAgICAgbV9CYXNlRW5jb2RpbmcgPSBQREZGT05UX0VOQ09ESU5HX1NUQU5EQVJEOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcEVuY29kaW5nID0gbV9wRm9udERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRW5jb2RpbmciKSk7Ci0gICAgTG9hZFBERkVuY29kaW5nKHBFbmNvZGluZywgbV9CYXNlRW5jb2RpbmcsIG1fcENoYXJOYW1lcywgbV9wRm9udEZpbGUgIT0gTlVMTCwgbV9Gb250LklzVFRGb250KCkpOwotICAgIExvYWRHbHlwaE1hcCgpOwotICAgIGRlbGV0ZVtdIG1fcENoYXJOYW1lczsKLSAgICBtX3BDaGFyTmFtZXMgPSBOVUxMOwotICAgIGlmIChtX0ZvbnQubV9GYWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmIChtX0ZsYWdzICYgUERGRk9OVF9BTExDQVApIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciBsb3dlcmNhc2VzW10gPSB7J2EnLCAneicsIDB4ZTAsIDB4ZjYsIDB4ZjgsIDB4ZmR9OwotICAgICAgICBmb3IgKHNpemVfdCByYW5nZSA9IDA7IHJhbmdlIDwgc2l6ZW9mIGxvd2VyY2FzZXMgLyAyOyByYW5nZSArKykgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IGxvd2VyY2FzZXNbcmFuZ2UgKiAyXTsgaSA8PSBsb3dlcmNhc2VzW3JhbmdlICogMiArIDFdOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtpXSAhPSAweGZmZmYgJiYgbV9wRm9udEZpbGUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9HbHlwaEluZGV4W2ldID0gbV9HbHlwaEluZGV4W2kgLSAzMl07Ci0gICAgICAgICAgICAgICAgaWYgKG1fQ2hhcldpZHRoW2kgLSAzMl0pIHsKLSAgICAgICAgICAgICAgICAgICAgbV9DaGFyV2lkdGhbaV0gPSBtX0NoYXJXaWR0aFtpIC0gMzJdOwotICAgICAgICAgICAgICAgICAgICBtX0NoYXJCQm94W2ldID0gbV9DaGFyQkJveFtpIC0gMzJdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBDaGVja0ZvbnRNZXRyaWNzKCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci12b2lkIENQREZfU2ltcGxlRm9udDo6TG9hZFN1YnN0Rm9udCgpCi17Ci0gICAgaWYgKCFtX2JVc2VGb250V2lkdGggJiYgIShtX0ZsYWdzICYgUERGRk9OVF9GSVhFRFBJVENIKSkgewotICAgICAgICBpbnQgd2lkdGggPSAwLCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpICsrKSB7Ci0gICAgICAgICAgICBpZiAobV9DaGFyV2lkdGhbaV0gPT0gMCB8fCBtX0NoYXJXaWR0aFtpXSA9PSAweGZmZmYpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh3aWR0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgd2lkdGggPSBtX0NoYXJXaWR0aFtpXTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2lkdGggIT0gbV9DaGFyV2lkdGhbaV0pIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaSA9PSAyNTYgJiYgd2lkdGgpIHsKLSAgICAgICAgICAgIG1fRmxhZ3MgfD0gUERGRk9OVF9GSVhFRFBJVENIOwotICAgICAgICB9Ci0gICAgfQotICAgIGludCB3ZWlnaHQgPSBtX1N0ZW1WIDwgMTQwID8gbV9TdGVtViAqIDUgOiAobV9TdGVtViAqIDQgKyAxNDApOwotICAgIG1fRm9udC5Mb2FkU3Vic3QobV9CYXNlRm9udCwgSXNGb250VHlwZShQREZGT05UX1RSVUVUWVBFKSwgbV9GbGFncywgd2VpZ2h0LCBtX0l0YWxpY0FuZ2xlLCAwKTsKLSAgICBpZiAobV9Gb250Lm1fcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX05PTlNZTUJPTCkgewotICAgIH0KLX0KLUZYX0JPT0wgQ1BERl9TaW1wbGVGb250OjpJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9CYXNlRW5jb2RpbmcgIT0gUERGRk9OVF9FTkNPRElOR19CVUlMVElOICYmIG1fQmFzZUVuY29kaW5nICE9IFBERkZPTlRfRU5DT0RJTkdfQURPQkVfU1lNQk9MICYmCi0gICAgICAgICAgIG1fQmFzZUVuY29kaW5nICE9IFBERkZPTlRfRU5DT0RJTkdfWkFQRkRJTkdCQVRTOwotfQotQ1BERl9UeXBlMUZvbnQ6OkNQREZfVHlwZTFGb250KCkgOiBDUERGX1NpbXBsZUZvbnQoUERGRk9OVF9UWVBFMSkKLXsKLSAgICBtX0Jhc2UxNEZvbnQgPSAtMTsKLX0KLUZYX0JPT0wgQ1BERl9UeXBlMUZvbnQ6Ol9Mb2FkKCkKLXsKLSAgICBtX0Jhc2UxNEZvbnQgPSBfUERGX0dldFN0YW5kYXJkRm9udE5hbWUobV9CYXNlRm9udCk7Ci0gICAgaWYgKG1fQmFzZTE0Rm9udCA+PSAwKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcEZvbnREZXNjID0gbV9wRm9udERpY3QtPkdldERpY3QoRlhfQlNUUkMoIkZvbnREZXNjcmlwdG9yIikpOwotICAgICAgICBpZiAocEZvbnREZXNjICYmIHBGb250RGVzYy0+S2V5RXhpc3QoRlhfQlNUUkMoIkZsYWdzIikpKSB7Ci0gICAgICAgICAgICBtX0ZsYWdzID0gcEZvbnREZXNjLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJGbGFncyIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fRmxhZ3MgPSBtX0Jhc2UxNEZvbnQgPj0gMTIgPyBQREZGT05UX1NZTUJPTElDIDogUERGRk9OVF9OT05TWU1CT0xJQzsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9CYXNlMTRGb250IDwgNCkKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgbV9DaGFyV2lkdGhbaV0gPSA2MDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGlmIChtX0Jhc2UxNEZvbnQgPT0gMTIpIHsKLSAgICAgICAgICAgIG1fQmFzZUVuY29kaW5nID0gUERGRk9OVF9FTkNPRElOR19BRE9CRV9TWU1CT0w7Ci0gICAgICAgIH0gZWxzZSBpZiAobV9CYXNlMTRGb250ID09IDEzKSB7Ci0gICAgICAgICAgICBtX0Jhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfWkFQRkRJTkdCQVRTOwotICAgICAgICB9IGVsc2UgaWYgKG1fRmxhZ3MgJiBQREZGT05UX05PTlNZTUJPTElDKSB7Ci0gICAgICAgICAgICBtX0Jhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfU1RBTkRBUkQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIExvYWRDb21tb24oKTsKLX0KLXN0YXRpYyBGWF9CT09MIEZUX1VzZVR5cGUxQ2hhcm1hcChGWEZUX0ZhY2UgZmFjZSkKLXsKLSAgICBpZiAoRlhGVF9HZXRfRmFjZV9DaGFybWFwQ291bnQoZmFjZSkgPT0gMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChGWEZUX0dldF9GYWNlX0NoYXJtYXBDb3VudChmYWNlKSA9PSAxICYmCi0gICAgICAgICAgICBGWEZUX0dldF9DaGFybWFwX0VuY29kaW5nKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbMF0pID09IEZYRlRfRU5DT0RJTkdfVU5JQ09ERSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChGWEZUX0dldF9DaGFybWFwX0VuY29kaW5nKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbMF0pID09IEZYRlRfRU5DT0RJTkdfVU5JQ09ERSkgewotICAgICAgICBGWEZUX1NldF9DaGFybWFwKGZhY2UsIEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbMV0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYRlRfU2V0X0NoYXJtYXAoZmFjZSwgRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKVswXSk7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotZXh0ZXJuIEZYX1dDSEFSIEZUX1VuaWNvZGVGcm9tQ2hhckNvZGUoaW50IGVuY29kaW5nLCBGWF9EV09SRCBjaGFyY29kZSk7Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0jaW5jbHVkZSAiLi4vLi4vZnhnZS9hcHBsZS9hcHBsZV9pbnQuaCIKLSNlbmRpZgotaW50IENQREZfVHlwZTFGb250OjpHbHlwaEZyb21DaGFyQ29kZUV4dChGWF9EV09SRCBjaGFyY29kZSkKLXsKLSAgICBpZiAoY2hhcmNvZGUgPiAweGZmKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaW50IGluZGV4ID0gbV9FeHRHSURbKEZYX0JZVEUpY2hhcmNvZGVdOwotICAgIGlmIChpbmRleCA9PSAweGZmZmYpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICByZXR1cm4gaW5kZXg7Ci19Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi1zdHJ1Y3QgX0dseXBoTmFtZU1hcCB7Ci0gICAgRlhfTFBDU1RSIG1fcFN0ckFkb2JlOwotICAgIEZYX0xQQ1NUUiBtX3BTdHJVbmljb2RlOwotfTsKLXN0YXRpYyBjb25zdCBfR2x5cGhOYW1lTWFwIGdfR2x5cGhOYW1lU3Vic3RzW10gPSB7Ci0gICAgeyJmZiIsICJ1bmlGQjAwIn0sCi0gICAgeyJmaSIsICJ1bmlGQjAxIn0sCi0gICAgeyJmbCIsICJ1bmlGQjAyIn0sCi0gICAgeyJmZmkiLCAidW5pRkIwMyJ9LAotICAgIHsiZmZsIiwgInVuaUZCMDQifQotfTsKLWV4dGVybiAiQyIgewotICAgIHN0YXRpYyBpbnQgY29tcGFyZVN0cmluZyhjb25zdCB2b2lkKiBrZXksIGNvbnN0IHZvaWQqIGVsZW1lbnQpCitjb25zdCB1aW50OF90IENoaW5lc2VGb250TmFtZXNbXVs1XSA9IHt7MHhDQiwgMHhDRSwgMHhDQywgMHhFNSwgMHgwMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHhCRiwgMHhBQywgMHhDQywgMHhFNSwgMHgwMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHhCQSwgMHhEQSwgMHhDQywgMHhFNSwgMHgwMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHhCNywgMHhDMiwgMHhDQiwgMHhDRSwgMHgwMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHhEMCwgMHhDMiwgMHhDQiwgMHhDRSwgMHgwMH19OworQ1BERl9Gb250KiBDUERGX0ZvbnQ6OkNyZWF0ZUZvbnRGKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgdHlwZSA9IHBGb250RGljdC0+R2V0U3RyaW5nKCJTdWJ0eXBlIik7CisgIENQREZfRm9udCogcEZvbnQ7CisgIGlmICh0eXBlID09ICJUcnVlVHlwZSIpIHsKICAgICB7Ci0gICAgICAgIHJldHVybiBGWFNZU19zdHJpY21wKChGWF9MUENTVFIpa2V5LCAoKF9HbHlwaE5hbWVNYXAqKWVsZW1lbnQpLT5tX3BTdHJBZG9iZSk7CisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXyB8fCBcCisgICAgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9MSU5VWF8gfHwgICBcCisgICAgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BTkRST0lEXyB8fCBcCisgICAgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyAgICAgIENGWF9CeXRlU3RyaW5nIGJhc2Vmb250ID0gcEZvbnREaWN0LT5HZXRTdHJpbmcoIkJhc2VGb250Iik7CisgICAgICBDRlhfQnl0ZVN0cmluZyB0YWcgPSBiYXNlZm9udC5MZWZ0KDQpOworICAgICAgaW50IGk7CisgICAgICBpbnQgY291bnQgPSBzaXplb2YoQ2hpbmVzZUZvbnROYW1lcykgLyBzaXplb2YoQ2hpbmVzZUZvbnROYW1lc1swXSk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICBpZiAodGFnID09IENGWF9CeXRlU3RyaW5nKChjb25zdCBGWF9DSEFSKilDaGluZXNlRm9udE5hbWVzW2ldKSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoaSA8IGNvdW50KSB7CisgICAgICAgIENQREZfRGljdGlvbmFyeSogcEZvbnREZXNjID0gcEZvbnREaWN0LT5HZXREaWN0KCJGb250RGVzY3JpcHRvciIpOworICAgICAgICBpZiAoIXBGb250RGVzYyB8fCAhcEZvbnREZXNjLT5LZXlFeGlzdCgiRm9udEZpbGUyIikpIHsKKyAgICAgICAgICBwRm9udCA9IG5ldyBDUERGX0NJREZvbnQ7CisgICAgICAgICAgcEZvbnQtPm1fcEZvbnREaWN0ID0gcEZvbnREaWN0OworICAgICAgICAgIHBGb250LT5tX3BEb2N1bWVudCA9IHBEb2M7CisgICAgICAgICAgaWYgKCFwRm9udC0+TG9hZCgpKSB7CisgICAgICAgICAgICBkZWxldGUgcEZvbnQ7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIHBGb250OworICAgICAgICB9CisgICAgICB9CisjZW5kaWYKICAgICB9Ci19Ci1zdGF0aWMgRlhfTFBDU1RSIF9HbHlwaE5hbWVSZW1hcChGWF9MUENTVFIgcFN0ckFkb2JlKQotewotICAgIF9HbHlwaE5hbWVNYXAqIGZvdW5kID0gKF9HbHlwaE5hbWVNYXAqKUZYU1lTX2JzZWFyY2gocFN0ckFkb2JlLCBnX0dseXBoTmFtZVN1YnN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiBnX0dseXBoTmFtZVN1YnN0cyAvIHNpemVvZihfR2x5cGhOYW1lTWFwKSwgc2l6ZW9mKF9HbHlwaE5hbWVNYXApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZVN0cmluZyk7Ci0gICAgaWYgKGZvdW5kKSB7Ci0gICAgICAgIHJldHVybiBmb3VuZC0+bV9wU3RyVW5pY29kZTsKLSAgICB9CisgICAgcEZvbnQgPSBuZXcgQ1BERl9UcnVlVHlwZUZvbnQ7CisgIH0gZWxzZSBpZiAodHlwZSA9PSAiVHlwZTMiKSB7CisgICAgcEZvbnQgPSBuZXcgQ1BERl9UeXBlM0ZvbnQ7CisgIH0gZWxzZSBpZiAodHlwZSA9PSAiVHlwZTAiKSB7CisgICAgcEZvbnQgPSBuZXcgQ1BERl9DSURGb250OworICB9IGVsc2UgeworICAgIHBGb250ID0gbmV3IENQREZfVHlwZTFGb250OworICB9CisgIHBGb250LT5tX3BGb250RGljdCA9IHBGb250RGljdDsKKyAgcEZvbnQtPm1fcERvY3VtZW50ID0gcERvYzsKKyAgaWYgKCFwRm9udC0+TG9hZCgpKSB7CisgICAgZGVsZXRlIHBGb250OwogICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBwRm9udDsKK30KK0ZYX0JPT0wgQ1BERl9Gb250OjpMb2FkKCkgeworICBpZiAoIW1fcEZvbnREaWN0KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENGWF9CeXRlU3RyaW5nIHR5cGUgPSBtX3BGb250RGljdC0+R2V0U3RyaW5nKCJTdWJ0eXBlIik7CisgIG1fQmFzZUZvbnQgPSBtX3BGb250RGljdC0+R2V0U3RyaW5nKCJCYXNlRm9udCIpOworICBpZiAodHlwZSA9PSAiTU1UeXBlMSIpIHsKKyAgICB0eXBlID0gIlR5cGUxIjsKKyAgfQorICByZXR1cm4gX0xvYWQoKTsKK30KK3N0YXRpYyBDRlhfV2lkZVN0cmluZyBfRm9udE1hcF9HZXRXaWRlU3RyaW5nKENGWF9DaGFyTWFwKiBwTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJ5dGVzdHIpIHsKKyAgcmV0dXJuICgoQ1BERl9Gb250Q2hhck1hcCopcE1hcCktPm1fcEZvbnQtPkRlY29kZVN0cmluZyhieXRlc3RyKTsKK30KK3N0YXRpYyBDRlhfQnl0ZVN0cmluZyBfRm9udE1hcF9HZXRCeXRlU3RyaW5nKENGWF9DaGFyTWFwKiBwTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdpZGVzdHIpIHsKKyAgcmV0dXJuICgoQ1BERl9Gb250Q2hhck1hcCopcE1hcCktPm1fcEZvbnQtPkVuY29kZVN0cmluZyh3aWRlc3RyKTsKK30KK0NQREZfRm9udENoYXJNYXA6OkNQREZfRm9udENoYXJNYXAoQ1BERl9Gb250KiBwRm9udCkgeworICBtX0dldEJ5dGVTdHJpbmcgPSBfRm9udE1hcF9HZXRCeXRlU3RyaW5nOworICBtX0dldFdpZGVTdHJpbmcgPSBfRm9udE1hcF9HZXRXaWRlU3RyaW5nOworICBtX3BGb250ID0gcEZvbnQ7Cit9CitDRlhfV2lkZVN0cmluZyBDUERGX1RvVW5pY29kZU1hcDo6TG9va3VwKEZYX0RXT1JEIGNoYXJjb2RlKSB7CisgIGF1dG8gaXQgPSBtX01hcC5maW5kKGNoYXJjb2RlKTsKKyAgaWYgKGl0ICE9IG1fTWFwLmVuZCgpKSB7CisgICAgRlhfRFdPUkQgdmFsdWUgPSBpdC0+c2Vjb25kOworICAgIEZYX1dDSEFSIHVuaWNvZGUgPSAoRlhfV0NIQVIpKHZhbHVlICYgMHhmZmZmKTsKKyAgICBpZiAodW5pY29kZSAhPSAweGZmZmYpIHsKKyAgICAgIHJldHVybiB1bmljb2RlOworICAgIH0KKyAgICBjb25zdCBGWF9XQ0hBUiogYnVmID0gbV9NdWx0aUNoYXJCdWYuR2V0QnVmZmVyKCk7CisgICAgRlhfRFdPUkQgYnVmX2xlbiA9IG1fTXVsdGlDaGFyQnVmLkdldExlbmd0aCgpOworICAgIGlmICghYnVmIHx8IGJ1Zl9sZW4gPT0gMCkgeworICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7CisgICAgfQorICAgIEZYX0RXT1JEIGluZGV4ID0gdmFsdWUgPj4gMTY7CisgICAgaWYgKGluZGV4ID49IGJ1Zl9sZW4pIHsKKyAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICAgIH0KKyAgICBGWF9EV09SRCBsZW4gPSBidWZbaW5kZXhdOworICAgIGlmIChpbmRleCArIGxlbiA8IGluZGV4IHx8IGluZGV4ICsgbGVuID49IGJ1Zl9sZW4pIHsKKyAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICAgIH0KKyAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoYnVmICsgaW5kZXggKyAxLCBsZW4pOworICB9CisgIGlmIChtX3BCYXNlTWFwKSB7CisgICAgcmV0dXJuIG1fcEJhc2VNYXAtPlVuaWNvZGVGcm9tQ0lEKChGWF9XT1JEKWNoYXJjb2RlKTsKKyAgfQorICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKK30KK0ZYX0RXT1JEIENQREZfVG9Vbmljb2RlTWFwOjpSZXZlcnNlTG9va3VwKEZYX1dDSEFSIHVuaWNvZGUpIHsKKyAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbV9NYXApIHsKKyAgICBpZiAocGFpci5zZWNvbmQgPT0gdW5pY29kZSkKKyAgICAgIHJldHVybiBwYWlyLmZpcnN0OworICB9CisgIHJldHVybiAwOworfQorCisvLyBTdGF0aWMuCitGWF9EV09SRCBDUERGX1RvVW5pY29kZU1hcDo6U3RyaW5nVG9Db2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSB7CisgIGNvbnN0IEZYX0NIQVIqIGJ1ZiA9IHN0ci5HZXRDU3RyKCk7CisgIGludCBsZW4gPSBzdHIuR2V0TGVuZ3RoKCk7CisgIGlmIChsZW4gPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBpbnQgcmVzdWx0ID0gMDsKKyAgaWYgKGJ1ZlswXSA9PSAnPCcpIHsKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IGxlbiAmJiBzdGQ6OmlzeGRpZ2l0KGJ1ZltpXSk7ICsraSkKKyAgICAgIHJlc3VsdCA9IHJlc3VsdCAqIDE2ICsgRlhTWVNfdG9IZXhEaWdpdChidWZbaV0pOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGxlbiAmJiBzdGQ6OmlzZGlnaXQoYnVmW2ldKTsgKytpKQorICAgIHJlc3VsdCA9IHJlc3VsdCAqIDEwICsgRlhTWVNfdG9EZWNpbWFsRGlnaXQoYnVmW2ldKTsKKworICByZXR1cm4gcmVzdWx0OworfQorc3RhdGljIENGWF9XaWRlU3RyaW5nIFN0cmluZ0RhdGFBZGQoQ0ZYX1dpZGVTdHJpbmcgc3RyKSB7CisgIENGWF9XaWRlU3RyaW5nIHJldDsKKyAgaW50IGxlbiA9IHN0ci5HZXRMZW5ndGgoKTsKKyAgRlhfV0NIQVIgdmFsdWUgPSAxOworICBmb3IgKGludCBpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICBGWF9XQ0hBUiBjaCA9IHN0cltpXSArIHZhbHVlOworICAgIGlmIChjaCA8IHN0cltpXSkgeworICAgICAgcmV0Lkluc2VydCgwLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0Lkluc2VydCgwLCBjaCk7CisgICAgICB2YWx1ZSA9IDA7CisgICAgfQorICB9CisgIGlmICh2YWx1ZSkgeworICAgIHJldC5JbnNlcnQoMCwgdmFsdWUpOworICB9CisgIHJldHVybiByZXQ7Cit9CisKKy8vIFN0YXRpYy4KK0NGWF9XaWRlU3RyaW5nIENQREZfVG9Vbmljb2RlTWFwOjpTdHJpbmdUb1dpZGVTdHJpbmcoCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpIHsKKyAgY29uc3QgRlhfQ0hBUiogYnVmID0gc3RyLkdldENTdHIoKTsKKyAgaW50IGxlbiA9IHN0ci5HZXRMZW5ndGgoKTsKKyAgaWYgKGxlbiA9PSAwKQorICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworCisgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKKyAgaWYgKGJ1ZlswXSA9PSAnPCcpIHsKKyAgICBpbnQgYnl0ZV9wb3MgPSAwOworICAgIEZYX1dDSEFSIGNoID0gMDsKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IGxlbiAmJiBzdGQ6OmlzeGRpZ2l0KGJ1ZltpXSk7ICsraSkgeworICAgICAgY2ggPSBjaCAqIDE2ICsgRlhTWVNfdG9IZXhEaWdpdChidWZbaV0pOworICAgICAgYnl0ZV9wb3MrKzsKKyAgICAgIGlmIChieXRlX3BvcyA9PSA0KSB7CisgICAgICAgIHJlc3VsdCArPSBjaDsKKyAgICAgICAgYnl0ZV9wb3MgPSAwOworICAgICAgICBjaCA9IDA7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KK3ZvaWQgQ1BERl9Ub1VuaWNvZGVNYXA6OkxvYWQoQ1BERl9TdHJlYW0qIHBTdHJlYW0pIHsKKyAgQ0lEU2V0IGNpZF9zZXQgPSBDSURTRVRfVU5LTk9XTjsKKyAgQ1BERl9TdHJlYW1BY2Mgc3RyZWFtOworICBzdHJlYW0uTG9hZEFsbERhdGEocFN0cmVhbSwgRkFMU0UpOworICBDUERGX1NpbXBsZVBhcnNlciBwYXJzZXIoc3RyZWFtLkdldERhdGEoKSwgc3RyZWFtLkdldFNpemUoKSk7CisgIHdoaWxlICgxKSB7CisgICAgQ0ZYX0J5dGVTdHJpbmdDIHdvcmQgPSBwYXJzZXIuR2V0V29yZCgpOworICAgIGlmICh3b3JkLklzRW1wdHkoKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICh3b3JkID09ICJiZWdpbmJmY2hhciIpIHsKKyAgICAgIHdoaWxlICgxKSB7CisgICAgICAgIHdvcmQgPSBwYXJzZXIuR2V0V29yZCgpOworICAgICAgICBpZiAod29yZC5Jc0VtcHR5KCkgfHwgd29yZCA9PSAiZW5kYmZjaGFyIikgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIEZYX0RXT1JEIHNyY2NvZGUgPSBTdHJpbmdUb0NvZGUod29yZCk7CisgICAgICAgIHdvcmQgPSBwYXJzZXIuR2V0V29yZCgpOworICAgICAgICBDRlhfV2lkZVN0cmluZyBkZXN0Y29kZSA9IFN0cmluZ1RvV2lkZVN0cmluZyh3b3JkKTsKKyAgICAgICAgaW50IGxlbiA9IGRlc3Rjb2RlLkdldExlbmd0aCgpOworICAgICAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGVuID09IDEpIHsKKyAgICAgICAgICBtX01hcFtzcmNjb2RlXSA9IGRlc3Rjb2RlLkdldEF0KDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1fTWFwW3NyY2NvZGVdID0gbV9NdWx0aUNoYXJCdWYuR2V0TGVuZ3RoKCkgKiAweDEwMDAwICsgMHhmZmZmOworICAgICAgICAgIG1fTXVsdGlDaGFyQnVmLkFwcGVuZENoYXIoZGVzdGNvZGUuR2V0TGVuZ3RoKCkpOworICAgICAgICAgIG1fTXVsdGlDaGFyQnVmIDw8IGRlc3Rjb2RlOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmICh3b3JkID09ICJiZWdpbmJmcmFuZ2UiKSB7CisgICAgICB3aGlsZSAoMSkgeworICAgICAgICBDRlhfQnl0ZVN0cmluZyBsb3csIGhpZ2g7CisgICAgICAgIGxvdyA9IHBhcnNlci5HZXRXb3JkKCk7CisgICAgICAgIGlmIChsb3cuSXNFbXB0eSgpIHx8IGxvdyA9PSAiZW5kYmZyYW5nZSIpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBoaWdoID0gcGFyc2VyLkdldFdvcmQoKTsKKyAgICAgICAgRlhfRFdPUkQgbG93Y29kZSA9IFN0cmluZ1RvQ29kZShsb3cpOworICAgICAgICBGWF9EV09SRCBoaWdoY29kZSA9CisgICAgICAgICAgICAobG93Y29kZSAmIDB4ZmZmZmZmMDApIHwgKFN0cmluZ1RvQ29kZShoaWdoKSAmIDB4ZmYpOworICAgICAgICBpZiAoaGlnaGNvZGUgPT0gKEZYX0RXT1JEKS0xKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RhcnQgPSBwYXJzZXIuR2V0V29yZCgpOworICAgICAgICBpZiAoc3RhcnQgPT0gIlsiKSB7CisgICAgICAgICAgZm9yIChGWF9EV09SRCBjb2RlID0gbG93Y29kZTsgY29kZSA8PSBoaWdoY29kZTsgY29kZSsrKSB7CisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBkZXN0ID0gcGFyc2VyLkdldFdvcmQoKTsKKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGRlc3Rjb2RlID0gU3RyaW5nVG9XaWRlU3RyaW5nKGRlc3QpOworICAgICAgICAgICAgaW50IGxlbiA9IGRlc3Rjb2RlLkdldExlbmd0aCgpOworICAgICAgICAgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxlbiA9PSAxKSB7CisgICAgICAgICAgICAgIG1fTWFwW2NvZGVdID0gZGVzdGNvZGUuR2V0QXQoMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBtX01hcFtjb2RlXSA9IG1fTXVsdGlDaGFyQnVmLkdldExlbmd0aCgpICogMHgxMDAwMCArIDB4ZmZmZjsKKyAgICAgICAgICAgICAgbV9NdWx0aUNoYXJCdWYuQXBwZW5kQ2hhcihkZXN0Y29kZS5HZXRMZW5ndGgoKSk7CisgICAgICAgICAgICAgIG1fTXVsdGlDaGFyQnVmIDw8IGRlc3Rjb2RlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBwYXJzZXIuR2V0V29yZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGRlc3Rjb2RlID0gU3RyaW5nVG9XaWRlU3RyaW5nKHN0YXJ0KTsKKyAgICAgICAgICBpbnQgbGVuID0gZGVzdGNvZGUuR2V0TGVuZ3RoKCk7CisgICAgICAgICAgRlhfRFdPUkQgdmFsdWUgPSAwOworICAgICAgICAgIGlmIChsZW4gPT0gMSkgeworICAgICAgICAgICAgdmFsdWUgPSBTdHJpbmdUb0NvZGUoc3RhcnQpOworICAgICAgICAgICAgZm9yIChGWF9EV09SRCBjb2RlID0gbG93Y29kZTsgY29kZSA8PSBoaWdoY29kZTsgY29kZSsrKSB7CisgICAgICAgICAgICAgIG1fTWFwW2NvZGVdID0gdmFsdWUrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChGWF9EV09SRCBjb2RlID0gbG93Y29kZTsgY29kZSA8PSBoaWdoY29kZTsgY29kZSsrKSB7CisgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHJldGNvZGU7CisgICAgICAgICAgICAgIGlmIChjb2RlID09IGxvd2NvZGUpIHsKKyAgICAgICAgICAgICAgICByZXRjb2RlID0gZGVzdGNvZGU7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0Y29kZSA9IFN0cmluZ0RhdGFBZGQoZGVzdGNvZGUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIG1fTWFwW2NvZGVdID0gbV9NdWx0aUNoYXJCdWYuR2V0TGVuZ3RoKCkgKiAweDEwMDAwICsgMHhmZmZmOworICAgICAgICAgICAgICBtX011bHRpQ2hhckJ1Zi5BcHBlbmRDaGFyKHJldGNvZGUuR2V0TGVuZ3RoKCkpOworICAgICAgICAgICAgICBtX011bHRpQ2hhckJ1ZiA8PCByZXRjb2RlOworICAgICAgICAgICAgICBkZXN0Y29kZSA9IHJldGNvZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmICh3b3JkID09ICIvQWRvYmUtS29yZWExLVVDUzIiKSB7CisgICAgICBjaWRfc2V0ID0gQ0lEU0VUX0tPUkVBMTsKKyAgICB9IGVsc2UgaWYgKHdvcmQgPT0gIi9BZG9iZS1KYXBhbjEtVUNTMiIpIHsKKyAgICAgIGNpZF9zZXQgPSBDSURTRVRfSkFQQU4xOworICAgIH0gZWxzZSBpZiAod29yZCA9PSAiL0Fkb2JlLUNOUzEtVUNTMiIpIHsKKyAgICAgIGNpZF9zZXQgPSBDSURTRVRfQ05TMTsKKyAgICB9IGVsc2UgaWYgKHdvcmQgPT0gIi9BZG9iZS1HQjEtVUNTMiIpIHsKKyAgICAgIGNpZF9zZXQgPSBDSURTRVRfR0IxOworICAgIH0KKyAgfQorICBpZiAoY2lkX3NldCkgeworICAgIG1fcEJhc2VNYXAgPSBDUERGX01vZHVsZU1ncjo6R2V0KCkKKyAgICAgICAgICAgICAgICAgICAgIC0+R2V0UGFnZU1vZHVsZSgpCisgICAgICAgICAgICAgICAgICAgICAtPkdldEZvbnRHbG9iYWxzKCkKKyAgICAgICAgICAgICAgICAgICAgIC0+bV9DTWFwTWFuYWdlci5HZXRDSUQyVW5pY29kZU1hcChjaWRfc2V0LCBGQUxTRSk7CisgIH0gZWxzZSB7CisgICAgbV9wQmFzZU1hcCA9IE5VTEw7CisgIH0KK30KK3N0YXRpYyBGWF9CT09MIEdldFByZWRlZmluZWRFbmNvZGluZyhpbnQmIGJhc2VtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHZhbHVlKSB7CisgIGlmICh2YWx1ZSA9PSAiV2luQW5zaUVuY29kaW5nIikgeworICAgIGJhc2VtYXAgPSBQREZGT05UX0VOQ09ESU5HX1dJTkFOU0k7CisgIH0gZWxzZSBpZiAodmFsdWUgPT0gIk1hY1JvbWFuRW5jb2RpbmciKSB7CisgICAgYmFzZW1hcCA9IFBERkZPTlRfRU5DT0RJTkdfTUFDUk9NQU47CisgIH0gZWxzZSBpZiAodmFsdWUgPT0gIk1hY0V4cGVydEVuY29kaW5nIikgeworICAgIGJhc2VtYXAgPSBQREZGT05UX0VOQ09ESU5HX01BQ0VYUEVSVDsKKyAgfSBlbHNlIGlmICh2YWx1ZSA9PSAiUERGRG9jRW5jb2RpbmciKSB7CisgICAgYmFzZW1hcCA9IFBERkZPTlRfRU5DT0RJTkdfUERGRE9DOworICB9IGVsc2UgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK3ZvaWQgQ1BERl9Gb250OjpMb2FkUERGRW5jb2RpbmcoQ1BERl9PYmplY3QqIHBFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBpQmFzZUVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyomIHBDaGFyTmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkVtYmVkZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUcnVlVHlwZSkgeworICBpZiAoIXBFbmNvZGluZykgeworICAgIGlmIChtX0Jhc2VGb250ID09ICJTeW1ib2wiKSB7CisgICAgICBpQmFzZUVuY29kaW5nID0gYlRydWVUeXBlID8gUERGRk9OVF9FTkNPRElOR19NU19TWU1CT0wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQREZGT05UX0VOQ09ESU5HX0FET0JFX1NZTUJPTDsKKyAgICB9IGVsc2UgaWYgKCFiRW1iZWRkZWQgJiYgaUJhc2VFbmNvZGluZyA9PSBQREZGT05UX0VOQ09ESU5HX0JVSUxUSU4pIHsKKyAgICAgIGlCYXNlRW5jb2RpbmcgPSBQREZGT05UX0VOQ09ESU5HX1dJTkFOU0k7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBpZiAocEVuY29kaW5nLT5Jc05hbWUoKSkgeworICAgIGlmIChpQmFzZUVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfQURPQkVfU1lNQk9MIHx8CisgICAgICAgIGlCYXNlRW5jb2RpbmcgPT0gUERGRk9OVF9FTkNPRElOR19aQVBGRElOR0JBVFMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKChtX0ZsYWdzICYgUERGRk9OVF9TWU1CT0xJQykgJiYgbV9CYXNlRm9udCA9PSAiU3ltYm9sIikgeworICAgICAgaWYgKCFiVHJ1ZVR5cGUpIHsKKyAgICAgICAgaUJhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfQURPQkVfU1lNQk9MOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDRlhfQnl0ZVN0cmluZyBic0VuY29kaW5nID0gcEVuY29kaW5nLT5HZXRTdHJpbmcoKTsKKyAgICBpZiAoYnNFbmNvZGluZy5Db21wYXJlKCJNYWNFeHBlcnRFbmNvZGluZyIpID09IDApIHsKKyAgICAgIGJzRW5jb2RpbmcgPSAiV2luQW5zaUVuY29kaW5nIjsKKyAgICB9CisgICAgR2V0UHJlZGVmaW5lZEVuY29kaW5nKGlCYXNlRW5jb2RpbmcsIGJzRW5jb2RpbmcpOworICAgIHJldHVybjsKKyAgfQorCisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwRW5jb2RpbmctPkFzRGljdGlvbmFyeSgpOworICBpZiAoIXBEaWN0KQorICAgIHJldHVybjsKKworICBpZiAoaUJhc2VFbmNvZGluZyAhPSBQREZGT05UX0VOQ09ESU5HX0FET0JFX1NZTUJPTCAmJgorICAgICAgaUJhc2VFbmNvZGluZyAhPSBQREZGT05UX0VOQ09ESU5HX1pBUEZESU5HQkFUUykgeworICAgIENGWF9CeXRlU3RyaW5nIGJzRW5jb2RpbmcgPSBwRGljdC0+R2V0U3RyaW5nKCJCYXNlRW5jb2RpbmciKTsKKyAgICBpZiAoYnNFbmNvZGluZy5Db21wYXJlKCJNYWNFeHBlcnRFbmNvZGluZyIpID09IDAgJiYgYlRydWVUeXBlKSB7CisgICAgICBic0VuY29kaW5nID0gIldpbkFuc2lFbmNvZGluZyI7CisgICAgfQorICAgIEdldFByZWRlZmluZWRFbmNvZGluZyhpQmFzZUVuY29kaW5nLCBic0VuY29kaW5nKTsKKyAgfQorICBpZiAoKCFiRW1iZWRkZWQgfHwgYlRydWVUeXBlKSAmJiBpQmFzZUVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfQlVJTFRJTikgeworICAgIGlCYXNlRW5jb2RpbmcgPSBQREZGT05UX0VOQ09ESU5HX1NUQU5EQVJEOworICB9CisgIENQREZfQXJyYXkqIHBEaWZmcyA9IHBEaWN0LT5HZXRBcnJheSgiRGlmZmVyZW5jZXMiKTsKKyAgaWYgKCFwRGlmZnMpIHsKKyAgICByZXR1cm47CisgIH0KKyAgcENoYXJOYW1lcyA9IG5ldyBDRlhfQnl0ZVN0cmluZ1syNTZdOworICBGWF9EV09SRCBjdXJfY29kZSA9IDA7CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwRGlmZnMtPkdldENvdW50KCk7IGkrKykgeworICAgIENQREZfT2JqZWN0KiBwRWxlbWVudCA9IHBEaWZmcy0+R2V0RWxlbWVudFZhbHVlKGkpOworICAgIGlmICghcEVsZW1lbnQpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChDUERGX05hbWUqIHBOYW1lID0gcEVsZW1lbnQtPkFzTmFtZSgpKSB7CisgICAgICBpZiAoY3VyX2NvZGUgPCAyNTYpCisgICAgICAgIHBDaGFyTmFtZXNbY3VyX2NvZGVdID0gcE5hbWUtPkdldFN0cmluZygpOworICAgICAgY3VyX2NvZGUrKzsKKyAgICB9IGVsc2UgeworICAgICAgY3VyX2NvZGUgPSBwRWxlbWVudC0+R2V0SW50ZWdlcigpOworICAgIH0KKyAgfQorfQorCitGWF9CT09MIENQREZfRm9udDo6SXNTdGFuZGFyZEZvbnQoKSBjb25zdCB7CisgIGlmIChtX0ZvbnRUeXBlICE9IFBERkZPTlRfVFlQRTEpCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAobV9wRm9udEZpbGUpCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAoKChDUERGX1R5cGUxRm9udCopdGhpcyktPkdldEJhc2UxNEZvbnQoKSA8IDApCisgICAgcmV0dXJuIEZBTFNFOworICByZXR1cm4gVFJVRTsKK30KK0NQREZfU2ltcGxlRm9udDo6Q1BERl9TaW1wbGVGb250KGludCBmb250dHlwZSkgOiBDUERGX0ZvbnQoZm9udHR5cGUpIHsKKyAgRlhTWVNfbWVtc2V0KG1fQ2hhckJCb3gsIDB4ZmYsIHNpemVvZiBtX0NoYXJCQm94KTsKKyAgRlhTWVNfbWVtc2V0KG1fQ2hhcldpZHRoLCAweGZmLCBzaXplb2YgbV9DaGFyV2lkdGgpOworICBGWFNZU19tZW1zZXQobV9HbHlwaEluZGV4LCAweGZmLCBzaXplb2YgbV9HbHlwaEluZGV4KTsKKyAgRlhTWVNfbWVtc2V0KG1fRXh0R0lELCAweGZmLCBzaXplb2YgbV9FeHRHSUQpOworICBtX3BDaGFyTmFtZXMgPSBOVUxMOworICBtX0Jhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfQlVJTFRJTjsKK30KK0NQREZfU2ltcGxlRm9udDo6fkNQREZfU2ltcGxlRm9udCgpIHsKKyAgZGVsZXRlW10gbV9wQ2hhck5hbWVzOworfQoraW50IENQREZfU2ltcGxlRm9udDo6R2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUsIEZYX0JPT0wqIHBWZXJ0R2x5cGgpIHsKKyAgaWYgKHBWZXJ0R2x5cGgpIHsKKyAgICAqcFZlcnRHbHlwaCA9IEZBTFNFOworICB9CisgIGlmIChjaGFyY29kZSA+IDB4ZmYpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaW50IGluZGV4ID0gbV9HbHlwaEluZGV4Wyh1aW50OF90KWNoYXJjb2RlXTsKKyAgaWYgKGluZGV4ID09IDB4ZmZmZikgeworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gaW5kZXg7Cit9Cit2b2lkIENQREZfU2ltcGxlRm9udDo6TG9hZENoYXJNZXRyaWNzKGludCBjaGFyY29kZSkgeworICBpZiAoIW1fRm9udC5HZXRGYWNlKCkpCisgICAgcmV0dXJuOworCisgIGlmIChjaGFyY29kZSA8IDAgfHwgY2hhcmNvZGUgPiAweGZmKSB7CisgICAgcmV0dXJuOworICB9CisgIGludCBnbHlwaF9pbmRleCA9IG1fR2x5cGhJbmRleFtjaGFyY29kZV07CisgIGlmIChnbHlwaF9pbmRleCA9PSAweGZmZmYpIHsKKyAgICBpZiAoIW1fcEZvbnRGaWxlICYmIGNoYXJjb2RlICE9IDMyKSB7CisgICAgICBMb2FkQ2hhck1ldHJpY3MoMzIpOworICAgICAgbV9DaGFyQkJveFtjaGFyY29kZV0gPSBtX0NoYXJCQm94WzMyXTsKKyAgICAgIGlmIChtX2JVc2VGb250V2lkdGgpIHsKKyAgICAgICAgbV9DaGFyV2lkdGhbY2hhcmNvZGVdID0gbV9DaGFyV2lkdGhbMzJdOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgRlhGVF9GYWNlIGZhY2UgPSBtX0ZvbnQuR2V0RmFjZSgpOworICBpbnQgZXJyID0gRlhGVF9Mb2FkX0dseXBoKAorICAgICAgZmFjZSwgZ2x5cGhfaW5kZXgsCisgICAgICBGWEZUX0xPQURfTk9fU0NBTEUgfCBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKTsKKyAgaWYgKGVycikgeworICAgIHJldHVybjsKKyAgfQorICBtX0NoYXJCQm94W2NoYXJjb2RlXS5MZWZ0ID0gVFQyUERGKEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWChmYWNlKSwgZmFjZSk7CisgIG1fQ2hhckJCb3hbY2hhcmNvZGVdLlJpZ2h0ID0gVFQyUERGKAorICAgICAgRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdYKGZhY2UpICsgRlhGVF9HZXRfR2x5cGhfV2lkdGgoZmFjZSksIGZhY2UpOworICBtX0NoYXJCQm94W2NoYXJjb2RlXS5Ub3AgPSBUVDJQREYoRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdZKGZhY2UpLCBmYWNlKTsKKyAgbV9DaGFyQkJveFtjaGFyY29kZV0uQm90dG9tID0gVFQyUERGKAorICAgICAgRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdZKGZhY2UpIC0gRlhGVF9HZXRfR2x5cGhfSGVpZ2h0KGZhY2UpLCBmYWNlKTsKKyAgaWYgKG1fYlVzZUZvbnRXaWR0aCkgeworICAgIGludCBUVF9XaWR0aCA9IFRUMlBERihGWEZUX0dldF9HbHlwaF9Ib3JpQWR2YW5jZShmYWNlKSwgZmFjZSk7CisgICAgaWYgKG1fQ2hhcldpZHRoW2NoYXJjb2RlXSA9PSAweGZmZmYpIHsKKyAgICAgIG1fQ2hhcldpZHRoW2NoYXJjb2RlXSA9IFRUX1dpZHRoOworICAgIH0gZWxzZSBpZiAoVFRfV2lkdGggJiYgIUlzRW1iZWRkZWQoKSkgeworICAgICAgbV9DaGFyQkJveFtjaGFyY29kZV0uUmlnaHQgPQorICAgICAgICAgIG1fQ2hhckJCb3hbY2hhcmNvZGVdLlJpZ2h0ICogbV9DaGFyV2lkdGhbY2hhcmNvZGVdIC8gVFRfV2lkdGg7CisgICAgICBtX0NoYXJCQm94W2NoYXJjb2RlXS5MZWZ0ID0KKyAgICAgICAgICBtX0NoYXJCQm94W2NoYXJjb2RlXS5MZWZ0ICogbV9DaGFyV2lkdGhbY2hhcmNvZGVdIC8gVFRfV2lkdGg7CisgICAgfQorICB9Cit9CitpbnQgQ1BERl9TaW1wbGVGb250OjpHZXRDaGFyV2lkdGhGKEZYX0RXT1JEIGNoYXJjb2RlLCBpbnQgbGV2ZWwpIHsKKyAgaWYgKGNoYXJjb2RlID4gMHhmZikgeworICAgIGNoYXJjb2RlID0gMDsKKyAgfQorICBpZiAobV9DaGFyV2lkdGhbY2hhcmNvZGVdID09IDB4ZmZmZikgeworICAgIExvYWRDaGFyTWV0cmljcyhjaGFyY29kZSk7CisgICAgaWYgKG1fQ2hhcldpZHRoW2NoYXJjb2RlXSA9PSAweGZmZmYpIHsKKyAgICAgIG1fQ2hhcldpZHRoW2NoYXJjb2RlXSA9IDA7CisgICAgfQorICB9CisgIHJldHVybiAoaW50MTZfdCltX0NoYXJXaWR0aFtjaGFyY29kZV07Cit9Cit2b2lkIENQREZfU2ltcGxlRm9udDo6R2V0Q2hhckJCb3goRlhfRFdPUkQgY2hhcmNvZGUsIEZYX1JFQ1QmIHJlY3QsIGludCBsZXZlbCkgeworICBpZiAoY2hhcmNvZGUgPiAweGZmKSB7CisgICAgY2hhcmNvZGUgPSAwOworICB9CisgIGlmIChtX0NoYXJCQm94W2NoYXJjb2RlXS5MZWZ0ID09IChpbnQxNl90KTB4ZmZmZikgeworICAgIExvYWRDaGFyTWV0cmljcyhjaGFyY29kZSk7CisgIH0KKyAgcmVjdC5sZWZ0ID0gbV9DaGFyQkJveFtjaGFyY29kZV0uTGVmdDsKKyAgcmVjdC5yaWdodCA9IG1fQ2hhckJCb3hbY2hhcmNvZGVdLlJpZ2h0OworICByZWN0LmJvdHRvbSA9IG1fQ2hhckJCb3hbY2hhcmNvZGVdLkJvdHRvbTsKKyAgcmVjdC50b3AgPSBtX0NoYXJCQm94W2NoYXJjb2RlXS5Ub3A7Cit9Citjb25zdCBGWF9DSEFSKiBHZXRBZG9iZUNoYXJOYW1lKGludCBpQmFzZUVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyogcENoYXJOYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYXJjb2RlKSB7CisgIEFTU0VSVChjaGFyY29kZSA+PSAwICYmIGNoYXJjb2RlIDwgMjU2KTsKKyAgaWYgKGNoYXJjb2RlIDwgMCB8fCBjaGFyY29kZSA+PSAyNTYpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBjb25zdCBGWF9DSEFSKiBuYW1lID0gTlVMTDsKKyAgaWYgKHBDaGFyTmFtZXMpIHsKKyAgICBuYW1lID0gcENoYXJOYW1lc1tjaGFyY29kZV07CisgIH0KKyAgaWYgKCghbmFtZSB8fCBuYW1lWzBdID09IDApICYmIGlCYXNlRW5jb2RpbmcpIHsKKyAgICBuYW1lID0gUERGX0NoYXJOYW1lRnJvbVByZWRlZmluZWRDaGFyU2V0KGlCYXNlRW5jb2RpbmcsIGNoYXJjb2RlKTsKKyAgfQorICByZXR1cm4gbmFtZSAmJiBuYW1lWzBdID8gbmFtZSA6IG51bGxwdHI7Cit9CitGWF9CT09MIENQREZfU2ltcGxlRm9udDo6TG9hZENvbW1vbigpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERlc2MgPSBtX3BGb250RGljdC0+R2V0RGljdCgiRm9udERlc2NyaXB0b3IiKTsKKyAgaWYgKHBGb250RGVzYykgeworICAgIExvYWRGb250RGVzY3JpcHRvcihwRm9udERlc2MpOworICB9CisgIENQREZfQXJyYXkqIHBXaWR0aEFycmF5ID0gbV9wRm9udERpY3QtPkdldEFycmF5KCJXaWR0aHMiKTsKKyAgaW50IHdpZHRoX3N0YXJ0ID0gMCwgd2lkdGhfZW5kID0gLTE7CisgIG1fYlVzZUZvbnRXaWR0aCA9IFRSVUU7CisgIGlmIChwV2lkdGhBcnJheSkgeworICAgIG1fYlVzZUZvbnRXaWR0aCA9IEZBTFNFOworICAgIGlmIChwRm9udERlc2MgJiYgcEZvbnREZXNjLT5LZXlFeGlzdCgiTWlzc2luZ1dpZHRoIikpIHsKKyAgICAgIGludCBNaXNzaW5nV2lkdGggPSBwRm9udERlc2MtPkdldEludGVnZXIoIk1pc3NpbmdXaWR0aCIpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBtX0NoYXJXaWR0aFtpXSA9IE1pc3NpbmdXaWR0aDsKKyAgICAgIH0KKyAgICB9CisgICAgd2lkdGhfc3RhcnQgPSBtX3BGb250RGljdC0+R2V0SW50ZWdlcigiRmlyc3RDaGFyIiwgMCk7CisgICAgd2lkdGhfZW5kID0gbV9wRm9udERpY3QtPkdldEludGVnZXIoIkxhc3RDaGFyIiwgMCk7CisgICAgaWYgKHdpZHRoX3N0YXJ0ID49IDAgJiYgd2lkdGhfc3RhcnQgPD0gMjU1KSB7CisgICAgICBpZiAod2lkdGhfZW5kIDw9IDAgfHwKKyAgICAgICAgICB3aWR0aF9lbmQgPj0gd2lkdGhfc3RhcnQgKyAoaW50KXBXaWR0aEFycmF5LT5HZXRDb3VudCgpKSB7CisgICAgICAgIHdpZHRoX2VuZCA9IHdpZHRoX3N0YXJ0ICsgcFdpZHRoQXJyYXktPkdldENvdW50KCkgLSAxOworICAgICAgfQorICAgICAgaWYgKHdpZHRoX2VuZCA+IDI1NSkgeworICAgICAgICB3aWR0aF9lbmQgPSAyNTU7CisgICAgICB9CisgICAgICBmb3IgKGludCBpID0gd2lkdGhfc3RhcnQ7IGkgPD0gd2lkdGhfZW5kOyBpKyspIHsKKyAgICAgICAgbV9DaGFyV2lkdGhbaV0gPSBwV2lkdGhBcnJheS0+R2V0SW50ZWdlcihpIC0gd2lkdGhfc3RhcnQpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAobV9wRm9udEZpbGUpIHsKKyAgICBpZiAobV9CYXNlRm9udC5HZXRMZW5ndGgoKSA+IDggJiYgbV9CYXNlRm9udFs3XSA9PSAnKycpIHsKKyAgICAgIG1fQmFzZUZvbnQgPSBtX0Jhc2VGb250Lk1pZCg4KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgTG9hZFN1YnN0Rm9udCgpOworICB9CisgIGlmICghKG1fRmxhZ3MgJiBQREZGT05UX1NZTUJPTElDKSkgeworICAgIG1fQmFzZUVuY29kaW5nID0gUERGRk9OVF9FTkNPRElOR19TVEFOREFSRDsKKyAgfQorICBDUERGX09iamVjdCogcEVuY29kaW5nID0gbV9wRm9udERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiRW5jb2RpbmciKTsKKyAgTG9hZFBERkVuY29kaW5nKHBFbmNvZGluZywgbV9CYXNlRW5jb2RpbmcsIG1fcENoYXJOYW1lcywgbV9wRm9udEZpbGUgIT0gTlVMTCwKKyAgICAgICAgICAgICAgICAgIG1fRm9udC5Jc1RURm9udCgpKTsKKyAgTG9hZEdseXBoTWFwKCk7CisgIGRlbGV0ZVtdIG1fcENoYXJOYW1lczsKKyAgbV9wQ2hhck5hbWVzID0gTlVMTDsKKyAgaWYgKCFtX0ZvbnQuR2V0RmFjZSgpKQorICAgIHJldHVybiBUUlVFOworCisgIGlmIChtX0ZsYWdzICYgUERGRk9OVF9BTExDQVApIHsKKyAgICB1bnNpZ25lZCBjaGFyIGxvd2VyY2FzZXNbXSA9IHsnYScsICd6JywgMHhlMCwgMHhmNiwgMHhmOCwgMHhmZH07CisgICAgZm9yIChzaXplX3QgcmFuZ2UgPSAwOyByYW5nZSA8IHNpemVvZiBsb3dlcmNhc2VzIC8gMjsgcmFuZ2UrKykgeworICAgICAgZm9yIChpbnQgaSA9IGxvd2VyY2FzZXNbcmFuZ2UgKiAyXTsgaSA8PSBsb3dlcmNhc2VzW3JhbmdlICogMiArIDFdOyBpKyspIHsKKyAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtpXSAhPSAweGZmZmYgJiYgbV9wRm9udEZpbGUpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBtX0dseXBoSW5kZXhbaV0gPSBtX0dseXBoSW5kZXhbaSAtIDMyXTsKKyAgICAgICAgaWYgKG1fQ2hhcldpZHRoW2kgLSAzMl0pIHsKKyAgICAgICAgICBtX0NoYXJXaWR0aFtpXSA9IG1fQ2hhcldpZHRoW2kgLSAzMl07CisgICAgICAgICAgbV9DaGFyQkJveFtpXSA9IG1fQ2hhckJCb3hbaSAtIDMyXTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBDaGVja0ZvbnRNZXRyaWNzKCk7CisgIHJldHVybiBUUlVFOworfQordm9pZCBDUERGX1NpbXBsZUZvbnQ6OkxvYWRTdWJzdEZvbnQoKSB7CisgIGlmICghbV9iVXNlRm9udFdpZHRoICYmICEobV9GbGFncyAmIFBERkZPTlRfRklYRURQSVRDSCkpIHsKKyAgICBpbnQgd2lkdGggPSAwLCBpOworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgaWYgKG1fQ2hhcldpZHRoW2ldID09IDAgfHwgbV9DaGFyV2lkdGhbaV0gPT0gMHhmZmZmKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHdpZHRoID09IDApIHsKKyAgICAgICAgd2lkdGggPSBtX0NoYXJXaWR0aFtpXTsKKyAgICAgIH0gZWxzZSBpZiAod2lkdGggIT0gbV9DaGFyV2lkdGhbaV0pIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmIChpID09IDI1NiAmJiB3aWR0aCkgeworICAgICAgbV9GbGFncyB8PSBQREZGT05UX0ZJWEVEUElUQ0g7CisgICAgfQorICB9CisgIGludCB3ZWlnaHQgPSBtX1N0ZW1WIDwgMTQwID8gbV9TdGVtViAqIDUgOiAobV9TdGVtViAqIDQgKyAxNDApOworICBtX0ZvbnQuTG9hZFN1YnN0KG1fQmFzZUZvbnQsIElzRm9udFR5cGUoUERGRk9OVF9UUlVFVFlQRSksIG1fRmxhZ3MsIHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICBtX0l0YWxpY0FuZ2xlLCAwKTsKKyAgaWYgKG1fRm9udC5HZXRTdWJzdEZvbnQoKS0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX05PTlNZTUJPTCkgeworICB9Cit9CitGWF9CT09MIENQREZfU2ltcGxlRm9udDo6SXNVbmljb2RlQ29tcGF0aWJsZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fQmFzZUVuY29kaW5nICE9IFBERkZPTlRfRU5DT0RJTkdfQlVJTFRJTiAmJgorICAgICAgICAgbV9CYXNlRW5jb2RpbmcgIT0gUERGRk9OVF9FTkNPRElOR19BRE9CRV9TWU1CT0wgJiYKKyAgICAgICAgIG1fQmFzZUVuY29kaW5nICE9IFBERkZPTlRfRU5DT0RJTkdfWkFQRkRJTkdCQVRTOworfQorQ1BERl9UeXBlMUZvbnQ6OkNQREZfVHlwZTFGb250KCkgOiBDUERGX1NpbXBsZUZvbnQoUERGRk9OVF9UWVBFMSkgeworICBtX0Jhc2UxNEZvbnQgPSAtMTsKK30KK0ZYX0JPT0wgQ1BERl9UeXBlMUZvbnQ6Ol9Mb2FkKCkgeworICBtX0Jhc2UxNEZvbnQgPSBQREZfR2V0U3RhbmRhcmRGb250TmFtZSgmbV9CYXNlRm9udCk7CisgIGlmIChtX0Jhc2UxNEZvbnQgPj0gMCkgeworICAgIENQREZfRGljdGlvbmFyeSogcEZvbnREZXNjID0gbV9wRm9udERpY3QtPkdldERpY3QoIkZvbnREZXNjcmlwdG9yIik7CisgICAgaWYgKHBGb250RGVzYyAmJiBwRm9udERlc2MtPktleUV4aXN0KCJGbGFncyIpKSB7CisgICAgICBtX0ZsYWdzID0gcEZvbnREZXNjLT5HZXRJbnRlZ2VyKCJGbGFncyIpOworICAgIH0gZWxzZSB7CisgICAgICBtX0ZsYWdzID0gbV9CYXNlMTRGb250ID49IDEyID8gUERGRk9OVF9TWU1CT0xJQyA6IFBERkZPTlRfTk9OU1lNQk9MSUM7CisgICAgfQorICAgIGlmIChtX0Jhc2UxNEZvbnQgPCA0KQorICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBtX0NoYXJXaWR0aFtpXSA9IDYwMDsKKyAgICAgIH0KKyAgICBpZiAobV9CYXNlMTRGb250ID09IDEyKSB7CisgICAgICBtX0Jhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfQURPQkVfU1lNQk9MOworICAgIH0gZWxzZSBpZiAobV9CYXNlMTRGb250ID09IDEzKSB7CisgICAgICBtX0Jhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfWkFQRkRJTkdCQVRTOworICAgIH0gZWxzZSBpZiAobV9GbGFncyAmIFBERkZPTlRfTk9OU1lNQk9MSUMpIHsKKyAgICAgIG1fQmFzZUVuY29kaW5nID0gUERGRk9OVF9FTkNPRElOR19TVEFOREFSRDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIExvYWRDb21tb24oKTsKK30KK3N0YXRpYyBGWF9CT09MIEZUX1VzZVR5cGUxQ2hhcm1hcChGWEZUX0ZhY2UgZmFjZSkgeworICBpZiAoRlhGVF9HZXRfRmFjZV9DaGFybWFwQ291bnQoZmFjZSkgPT0gMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoRlhGVF9HZXRfRmFjZV9DaGFybWFwQ291bnQoZmFjZSkgPT0gMSAmJgorICAgICAgRlhGVF9HZXRfQ2hhcm1hcF9FbmNvZGluZyhGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpWzBdKSA9PQorICAgICAgICAgIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoRlhGVF9HZXRfQ2hhcm1hcF9FbmNvZGluZyhGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpWzBdKSA9PQorICAgICAgRlhGVF9FTkNPRElOR19VTklDT0RFKSB7CisgICAgRlhGVF9TZXRfQ2hhcm1hcChmYWNlLCBGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpWzFdKTsKKyAgfSBlbHNlIHsKKyAgICBGWEZUX1NldF9DaGFybWFwKGZhY2UsIEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbMF0pOworICB9CisgIHJldHVybiBUUlVFOworfQoraW50IENQREZfVHlwZTFGb250OjpHbHlwaEZyb21DaGFyQ29kZUV4dChGWF9EV09SRCBjaGFyY29kZSkgeworICBpZiAoY2hhcmNvZGUgPiAweGZmKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGludCBpbmRleCA9IG1fRXh0R0lEWyh1aW50OF90KWNoYXJjb2RlXTsKKyAgaWYgKGluZGV4ID09IDB4ZmZmZikgeworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gaW5kZXg7Cit9CisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KK3N0cnVjdCBfR2x5cGhOYW1lTWFwIHsKKyAgY29uc3QgRlhfQ0hBUiogbV9wU3RyQWRvYmU7CisgIGNvbnN0IEZYX0NIQVIqIG1fcFN0clVuaWNvZGU7Cit9Oworc3RhdGljIGNvbnN0IF9HbHlwaE5hbWVNYXAgZ19HbHlwaE5hbWVTdWJzdHNbXSA9IHt7ImZmIiwgInVuaUZCMDAifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJmaSIsICJ1bmlGQjAxIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiZmwiLCAidW5pRkIwMiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImZmaSIsICJ1bmlGQjAzIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiZmZsIiwgInVuaUZCMDQifX07CitleHRlcm4gIkMiIHsKK3N0YXRpYyBpbnQgY29tcGFyZVN0cmluZyhjb25zdCB2b2lkKiBrZXksIGNvbnN0IHZvaWQqIGVsZW1lbnQpIHsKKyAgcmV0dXJuIEZYU1lTX3N0cmljbXAoKGNvbnN0IEZYX0NIQVIqKWtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChfR2x5cGhOYW1lTWFwKillbGVtZW50KS0+bV9wU3RyQWRvYmUpOworfQorfQorc3RhdGljIGNvbnN0IEZYX0NIQVIqIF9HbHlwaE5hbWVSZW1hcChjb25zdCBGWF9DSEFSKiBwU3RyQWRvYmUpIHsKKyAgX0dseXBoTmFtZU1hcCogZm91bmQgPSAoX0dseXBoTmFtZU1hcCopRlhTWVNfYnNlYXJjaCgKKyAgICAgIHBTdHJBZG9iZSwgZ19HbHlwaE5hbWVTdWJzdHMsCisgICAgICBzaXplb2YgZ19HbHlwaE5hbWVTdWJzdHMgLyBzaXplb2YoX0dseXBoTmFtZU1hcCksIHNpemVvZihfR2x5cGhOYW1lTWFwKSwKKyAgICAgIGNvbXBhcmVTdHJpbmcpOworICBpZiAoZm91bmQpIHsKKyAgICByZXR1cm4gZm91bmQtPm1fcFN0clVuaWNvZGU7CisgIH0KKyAgcmV0dXJuIE5VTEw7CiB9CiAjZW5kaWYKLXZvaWQgQ1BERl9UeXBlMUZvbnQ6OkxvYWRHbHlwaE1hcCgpCi17Ci0gICAgaWYgKG1fRm9udC5tX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Cit2b2lkIENQREZfVHlwZTFGb250OjpMb2FkR2x5cGhNYXAoKSB7CisgIGlmICghbV9Gb250LkdldEZhY2UoKSkKKyAgICByZXR1cm47CisKKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworICBGWF9CT09MIGJDb3JlVGV4dCA9IFRSVUU7CisgIENRdWFydHoyRCYgcXVhcnR6MmQgPQorICAgICAgKChDQXBwbGVQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5fcXVhcnR6MmQ7CisgIGlmICghbV9Gb250LkdldFBsYXRmb3JtRm9udCgpKSB7CisgICAgaWYgKG1fRm9udC5HZXRQc05hbWUoKSA9PSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKCJERkhlaVN0ZC1XNSIpKSB7CisgICAgICBiQ29yZVRleHQgPSBGQUxTRTsKICAgICB9Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgRlhfQk9PTCBiQ29yZVRleHQgPSBUUlVFOwotICAgIENRdWFydHoyRCAmIHF1YXJ0ejJkID0gKChDQXBwbGVQbGF0Zm9ybSAqKSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPl9xdWFydHoyZDsKLSAgICBpZiAoIW1fRm9udC5tX3BQbGF0Zm9ybUZvbnQpIHsKLSAgICAgICAgaWYgKG1fRm9udC5HZXRQc05hbWUoKSA9PSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKCJERkhlaVN0ZC1XNSIpKSB7Ci0gICAgICAgICAgICBiQ29yZVRleHQgPSBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBtX0ZvbnQubV9wUGxhdGZvcm1Gb250ID0gcXVhcnR6MmQuQ3JlYXRlRm9udChtX0ZvbnQubV9wRm9udERhdGEsIG1fRm9udC5tX2R3U2l6ZSk7Ci0gICAgICAgIGlmIChOVUxMID09IG1fRm9udC5tX3BQbGF0Zm9ybUZvbnQpIHsKLSAgICAgICAgICAgIGJDb3JlVGV4dCA9IEZBTFNFOwotICAgICAgICB9CisgICAgbV9Gb250LlNldFBsYXRmb3JtRm9udCgKKyAgICAgICAgcXVhcnR6MmQuQ3JlYXRlRm9udChtX0ZvbnQuR2V0Rm9udERhdGEoKSwgbV9Gb250LkdldFNpemUoKSkpOworICAgIGlmICghbV9Gb250LkdldFBsYXRmb3JtRm9udCgpKSB7CisgICAgICBiQ29yZVRleHQgPSBGQUxTRTsKICAgICB9CisgIH0KICNlbmRpZgotICAgIGlmICghSXNFbWJlZGRlZCgpICYmIChtX0Jhc2UxNEZvbnQgPCAxMikgJiYgbV9Gb250LklzVFRGb250KCkpIHsKLSAgICAgICAgaWYgKEZUX1VzZVRUQ2hhcm1hcChtX0ZvbnQubV9GYWNlLCAzLCAwKSkgewotICAgICAgICAgICAgRlhfQk9PTCBiR290T25lID0gRkFMU0U7Ci0gICAgICAgICAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSArKykgewotICAgICAgICAgICAgICAgIGNvbnN0IEZYX0JZVEUgcHJlZml4WzRdID0gezB4MDAsIDB4ZjAsIDB4ZjEsIDB4ZjJ9OwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgaiArKykgewotICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHVuaWNvZGUgPSBwcmVmaXhbal0gKiAyNTYgKyBjaGFyY29kZTsKLSAgICAgICAgICAgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250Lm1fRmFjZSwgdW5pY29kZSk7Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgICAgICAgICAgICAgICAgIEZYX0NIQVIgbmFtZV9nbHlwaFsyNTZdOwotICAgICAgICAgICAgICAgICAgICBGWEZUX0dldF9HbHlwaF9OYW1lKG1fRm9udC5tX0ZhY2UsIG1fR2x5cGhJbmRleFtjaGFyY29kZV0sIG5hbWVfZ2x5cGgsIDI1Nik7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVfZ2x5cGhbMjU1XSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmIG5hbWVfY3QgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KGtDRkFsbG9jYXRvckRlZmF1bHQsIG5hbWVfZ2x5cGgsIGtDRlN0cmluZ0VuY29kaW5nQVNDSUksIGtDRkFsbG9jYXRvck51bGwpOwotICAgICAgICAgICAgICAgICAgICBtX0V4dEdJRFtjaGFyY29kZV0gPSBDR0ZvbnRHZXRHbHlwaFdpdGhHbHlwaE5hbWUoKENHRm9udFJlZiltX0ZvbnQubV9wUGxhdGZvcm1Gb250LCBuYW1lX2N0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVfY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENGUmVsZWFzZShuYW1lX2N0KTsKLSAgICAgICAgICAgICAgICAgICAgfQorICBpZiAoIUlzRW1iZWRkZWQoKSAmJiAobV9CYXNlMTRGb250IDwgMTIpICYmIG1fRm9udC5Jc1RURm9udCgpKSB7CisgICAgaWYgKEZUX1VzZVRUQ2hhcm1hcChtX0ZvbnQuR2V0RmFjZSgpLCAzLCAwKSkgeworICAgICAgRlhfQk9PTCBiR290T25lID0gRkFMU0U7CisgICAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSsrKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgcHJlZml4WzRdID0gezB4MDAsIDB4ZjAsIDB4ZjEsIDB4ZjJ9OworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICAgIEZYX1dPUkQgdW5pY29kZSA9IHByZWZpeFtqXSAqIDI1NiArIGNoYXJjb2RlOworICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPQorICAgICAgICAgICAgICBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5HZXRGYWNlKCksIHVuaWNvZGUpOworI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisgICAgICAgICAgRlhfQ0hBUiBuYW1lX2dseXBoWzI1Nl07CisgICAgICAgICAgRlhGVF9HZXRfR2x5cGhfTmFtZShtX0ZvbnQuR2V0RmFjZSgpLCBtX0dseXBoSW5kZXhbY2hhcmNvZGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9nbHlwaCwgMjU2KTsKKyAgICAgICAgICBuYW1lX2dseXBoWzI1NV0gPSAwOworICAgICAgICAgIENGU3RyaW5nUmVmIG5hbWVfY3QgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KAorICAgICAgICAgICAgICBrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBuYW1lX2dseXBoLCBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJLAorICAgICAgICAgICAgICBrQ0ZBbGxvY2F0b3JOdWxsKTsKKyAgICAgICAgICBtX0V4dEdJRFtjaGFyY29kZV0gPSBDR0ZvbnRHZXRHbHlwaFdpdGhHbHlwaE5hbWUoCisgICAgICAgICAgICAgIChDR0ZvbnRSZWYpbV9Gb250LkdldFBsYXRmb3JtRm9udCgpLCBuYW1lX2N0KTsKKyAgICAgICAgICBpZiAobmFtZV9jdCkgeworICAgICAgICAgICAgQ0ZSZWxlYXNlKG5hbWVfY3QpOworICAgICAgICAgIH0KICNlbmRpZgotICAgICAgICAgICAgICAgICAgICBpZiAobV9HbHlwaEluZGV4W2NoYXJjb2RlXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYkdvdE9uZSA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiR290T25lKSB7Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgICAgICAgICAgICAgaWYgKCFiQ29yZVRleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIobV9FeHRHSUQsIG1fR2x5cGhJbmRleCwgMjU2KTsKLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9CisgICAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0pIHsKKyAgICAgICAgICAgIGJHb3RPbmUgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIEZYRlRfU2VsZWN0X0NoYXJtYXAobV9Gb250Lm1fRmFjZSwgRlhGVF9FTkNPRElOR19VTklDT0RFKTsKLSAgICAgICAgaWYgKG1fQmFzZUVuY29kaW5nID09IDApIHsKLSAgICAgICAgICAgIG1fQmFzZUVuY29kaW5nID0gUERGRk9OVF9FTkNPRElOR19TVEFOREFSRDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSArKykgewotICAgICAgICAgICAgRlhfTFBDU1RSIG5hbWUgPSBHZXRBZG9iZUNoYXJOYW1lKG1fQmFzZUVuY29kaW5nLCBtX3BDaGFyTmFtZXMsIGNoYXJjb2RlKTsKLSAgICAgICAgICAgIGlmIChuYW1lID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSBQREZfVW5pY29kZUZyb21BZG9iZU5hbWUobmFtZSk7Ci0gICAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQubV9GYWNlLCBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdKTsKLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICAgICAgICAgIEZYX0NIQVIgbmFtZV9nbHlwaFsyNTZdOwotICAgICAgICAgICAgRlhGVF9HZXRfR2x5cGhfTmFtZShtX0ZvbnQubV9GYWNlLCBtX0dseXBoSW5kZXhbY2hhcmNvZGVdLCBuYW1lX2dseXBoLCAyNTYpOwotICAgICAgICAgICAgbmFtZV9nbHlwaFsyNTVdID0gMDsKLSAgICAgICAgICAgIENGU3RyaW5nUmVmIG5hbWVfY3QgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KGtDRkFsbG9jYXRvckRlZmF1bHQsIG5hbWVfZ2x5cGgsIGtDRlN0cmluZ0VuY29kaW5nQVNDSUksIGtDRkFsbG9jYXRvck51bGwpOwotICAgICAgICAgICAgbV9FeHRHSURbY2hhcmNvZGVdID0gQ0dGb250R2V0R2x5cGhXaXRoR2x5cGhOYW1lKChDR0ZvbnRSZWYpbV9Gb250Lm1fcFBsYXRmb3JtRm9udCwgbmFtZV9jdCk7Ci0gICAgICAgICAgICBpZiAobmFtZV9jdCkgewotICAgICAgICAgICAgICAgIENGUmVsZWFzZShuYW1lX2N0KTsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPT0gMCAmJiBGWFNZU19zdHJjbXAobmFtZSwgIi5ub3RkZWYiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IDB4MjA7Ci0gICAgICAgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250Lm1fRmFjZSwgMHgyMCk7Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgICAgICAgICAgICAgRlhfQ0hBUiBuYW1lX2dseXBoWzI1Nl07Ci0gICAgICAgICAgICAgICAgRlhGVF9HZXRfR2x5cGhfTmFtZShtX0ZvbnQubV9GYWNlLCBtX0dseXBoSW5kZXhbY2hhcmNvZGVdLCBuYW1lX2dseXBoLCAyNTYpOwotICAgICAgICAgICAgICAgIG5hbWVfZ2x5cGhbMjU1XSA9IDA7Ci0gICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWYgbmFtZV9jdCA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmdOb0NvcHkoa0NGQWxsb2NhdG9yRGVmYXVsdCwgbmFtZV9nbHlwaCwga0NGU3RyaW5nRW5jb2RpbmdBU0NJSSwga0NGQWxsb2NhdG9yTnVsbCk7Ci0gICAgICAgICAgICAgICAgbV9FeHRHSURbY2hhcmNvZGVdID0gQ0dGb250R2V0R2x5cGhXaXRoR2x5cGhOYW1lKChDR0ZvbnRSZWYpbV9Gb250Lm1fcFBsYXRmb3JtRm9udCwgbmFtZV9jdCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVfY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgQ0ZSZWxlYXNlKG5hbWVfY3QpOwotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisgICAgICB9CisgICAgICBpZiAoYkdvdE9uZSkgeworI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCiAgICAgICAgIGlmICghYkNvcmVUZXh0KSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkzMihtX0V4dEdJRCwgbV9HbHlwaEluZGV4LCAyNTYpOworICAgICAgICAgIEZYU1lTX21lbWNweShtX0V4dEdJRCwgbV9HbHlwaEluZGV4LCAyNTYpOwogICAgICAgICB9CiAjZW5kaWYKICAgICAgICAgcmV0dXJuOworICAgICAgfQogICAgIH0KLSAgICBGVF9Vc2VUeXBlMUNoYXJtYXAobV9Gb250Lm1fRmFjZSk7Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgaWYgKGJDb3JlVGV4dCkgewotICAgICAgICBpZiAobV9GbGFncyAmIFBERkZPTlRfU1lNQk9MSUMpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGNoYXJjb2RlID0gMDsgY2hhcmNvZGUgPCAyNTY7IGNoYXJjb2RlICsrKSB7Ci0gICAgICAgICAgICAgICAgRlhfTFBDU1RSIG5hbWUgPSBHZXRBZG9iZUNoYXJOYW1lKG1fQmFzZUVuY29kaW5nLCBtX3BDaGFyTmFtZXMsIGNoYXJjb2RlKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZSkgewotICAgICAgICAgICAgICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gUERGX1VuaWNvZGVGcm9tQWRvYmVOYW1lKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfTmFtZV9JbmRleChtX0ZvbnQubV9GYWNlLCAoY2hhciopbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmIG5hbWVfY3QgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KGtDRkFsbG9jYXRvckRlZmF1bHQsIG5hbWUsIGtDRlN0cmluZ0VuY29kaW5nQVNDSUksIGtDRkFsbG9jYXRvck51bGwpOwotICAgICAgICAgICAgICAgICAgICBtX0V4dEdJRFtjaGFyY29kZV0gPSBDR0ZvbnRHZXRHbHlwaFdpdGhHbHlwaE5hbWUoKENHRm9udFJlZiltX0ZvbnQubV9wUGxhdGZvcm1Gb250LCBuYW1lX2N0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVfY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENGUmVsZWFzZShuYW1lX2N0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIGNoYXJjb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgdW5pY29kZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX0dseXBoSW5kZXhbY2hhcmNvZGVdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlID0gRlRfVW5pY29kZUZyb21DaGFyQ29kZShQREZGT05UX0VOQ09ESU5HX1NUQU5EQVJELCBjaGFyY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgRlhfQ0hBUiBuYW1lX2dseXBoWzI1Nl07Ci0gICAgICAgICAgICAgICAgICAgIEZYU1lTX21lbXNldDMyKG5hbWVfZ2x5cGgsIDAsIHNpemVvZihuYW1lX2dseXBoKSk7Ci0gICAgICAgICAgICAgICAgICAgIEZYRlRfR2V0X0dseXBoX05hbWUobV9Gb250Lm1fRmFjZSwgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSwgbmFtZV9nbHlwaCwgMjU2KTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZV9nbHlwaFsyNTVdID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVuaWNvZGUgPT0gMCAmJiBuYW1lX2dseXBoWzBdICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGUgPSBQREZfVW5pY29kZUZyb21BZG9iZU5hbWUobmFtZV9nbHlwaCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IHVuaWNvZGU7Ci0gICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmIG5hbWVfY3QgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KGtDRkFsbG9jYXRvckRlZmF1bHQsIG5hbWVfZ2x5cGgsIGtDRlN0cmluZ0VuY29kaW5nQVNDSUksIGtDRkFsbG9jYXRvck51bGwpOwotICAgICAgICAgICAgICAgICAgICBtX0V4dEdJRFtjaGFyY29kZV0gPSBDR0ZvbnRHZXRHbHlwaFdpdGhHbHlwaE5hbWUoKENHRm9udFJlZiltX0ZvbnQubV9wUGxhdGZvcm1Gb250LCBuYW1lX2N0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVfY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENGUmVsZWFzZShuYW1lX2N0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKKyAgICBGWEZUX1NlbGVjdF9DaGFybWFwKG1fRm9udC5HZXRGYWNlKCksIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSk7CisgICAgaWYgKG1fQmFzZUVuY29kaW5nID09IDApIHsKKyAgICAgIG1fQmFzZUVuY29kaW5nID0gUERGRk9OVF9FTkNPRElOR19TVEFOREFSRDsKKyAgICB9CisgICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUrKykgeworICAgICAgY29uc3QgRlhfQ0hBUiogbmFtZSA9CisgICAgICAgICAgR2V0QWRvYmVDaGFyTmFtZShtX0Jhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBjaGFyY29kZSk7CisgICAgICBpZiAoIW5hbWUpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gUERGX1VuaWNvZGVGcm9tQWRvYmVOYW1lKG5hbWUpOworICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IEZYRlRfR2V0X0NoYXJfSW5kZXgoCisgICAgICAgICAgbV9Gb250LkdldEZhY2UoKSwgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSk7CisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyAgICAgIEZYX0NIQVIgbmFtZV9nbHlwaFsyNTZdOworICAgICAgRlhGVF9HZXRfR2x5cGhfTmFtZShtX0ZvbnQuR2V0RmFjZSgpLCBtX0dseXBoSW5kZXhbY2hhcmNvZGVdLCBuYW1lX2dseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAyNTYpOworICAgICAgbmFtZV9nbHlwaFsyNTVdID0gMDsKKyAgICAgIENGU3RyaW5nUmVmIG5hbWVfY3QgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KAorICAgICAgICAgIGtDRkFsbG9jYXRvckRlZmF1bHQsIG5hbWVfZ2x5cGgsIGtDRlN0cmluZ0VuY29kaW5nQVNDSUksCisgICAgICAgICAga0NGQWxsb2NhdG9yTnVsbCk7CisgICAgICBtX0V4dEdJRFtjaGFyY29kZV0gPSBDR0ZvbnRHZXRHbHlwaFdpdGhHbHlwaE5hbWUoCisgICAgICAgICAgKENHRm9udFJlZiltX0ZvbnQuR2V0UGxhdGZvcm1Gb250KCksIG5hbWVfY3QpOworICAgICAgaWYgKG5hbWVfY3QpIHsKKyAgICAgICAgQ0ZSZWxlYXNlKG5hbWVfY3QpOworICAgICAgfQorI2VuZGlmCisgICAgICBpZiAobV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9PSAwICYmIEZYU1lTX3N0cmNtcChuYW1lLCAiLm5vdGRlZiIpID09IDApIHsKKyAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IDB4MjA7CisgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5HZXRGYWNlKCksIDB4MjApOworI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisgICAgICAgIEZYX0NIQVIgbmFtZV9nbHlwaFsyNTZdOworICAgICAgICBGWEZUX0dldF9HbHlwaF9OYW1lKG1fRm9udC5HZXRGYWNlKCksIG1fR2x5cGhJbmRleFtjaGFyY29kZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9nbHlwaCwgMjU2KTsKKyAgICAgICAgbmFtZV9nbHlwaFsyNTVdID0gMDsKKyAgICAgICAgQ0ZTdHJpbmdSZWYgbmFtZV9jdCA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmdOb0NvcHkoCisgICAgICAgICAgICBrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBuYW1lX2dseXBoLCBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJLAorICAgICAgICAgICAga0NGQWxsb2NhdG9yTnVsbCk7CisgICAgICAgIG1fRXh0R0lEW2NoYXJjb2RlXSA9IENHRm9udEdldEdseXBoV2l0aEdseXBoTmFtZSgKKyAgICAgICAgICAgIChDR0ZvbnRSZWYpbV9Gb250LkdldFBsYXRmb3JtRm9udCgpLCBuYW1lX2N0KTsKKyAgICAgICAgaWYgKG5hbWVfY3QpIHsKKyAgICAgICAgICBDRlJlbGVhc2UobmFtZV9jdCk7CiAgICAgICAgIH0KLSAgICAgICAgRlhfQk9PTCBiVW5pY29kZSA9IEZBTFNFOwotICAgICAgICBpZiAoMCA9PSBGWEZUX1NlbGVjdF9DaGFybWFwKG1fRm9udC5tX0ZhY2UsIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSkpIHsKLSAgICAgICAgICAgIGJVbmljb2RlID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSArKykgewotICAgICAgICAgICAgRlhfTFBDU1RSIG5hbWUgPSBHZXRBZG9iZUNoYXJOYW1lKG1fQmFzZUVuY29kaW5nLCBtX3BDaGFyTmFtZXMsIGNoYXJjb2RlKTsKLSAgICAgICAgICAgIGlmIChuYW1lID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSBQREZfVW5pY29kZUZyb21BZG9iZU5hbWUobmFtZSk7Ci0gICAgICAgICAgICBGWF9MUENTVFIgcFN0clVuaWNvZGUgPSBfR2x5cGhOYW1lUmVtYXAobmFtZSk7Ci0gICAgICAgICAgICBpZiAocFN0clVuaWNvZGUgJiYgMCA9PSBGWEZUX0dldF9OYW1lX0luZGV4KG1fRm9udC5tX0ZhY2UsIChjaGFyKiluYW1lKSkgewotICAgICAgICAgICAgICAgIG5hbWUgPSBwU3RyVW5pY29kZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9OYW1lX0luZGV4KG1fRm9udC5tX0ZhY2UsIChjaGFyKiluYW1lKTsKLSAgICAgICAgICAgIENGU3RyaW5nUmVmIG5hbWVfY3QgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KGtDRkFsbG9jYXRvckRlZmF1bHQsIG5hbWUsIGtDRlN0cmluZ0VuY29kaW5nQVNDSUksIGtDRkFsbG9jYXRvck51bGwpOwotICAgICAgICAgICAgbV9FeHRHSURbY2hhcmNvZGVdID0gQ0dGb250R2V0R2x5cGhXaXRoR2x5cGhOYW1lKChDR0ZvbnRSZWYpbV9Gb250Lm1fcFBsYXRmb3JtRm9udCwgbmFtZV9jdCk7Ci0gICAgICAgICAgICBpZiAobmFtZV9jdCkgewotICAgICAgICAgICAgICAgIENGUmVsZWFzZShuYW1lX2N0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX0dseXBoSW5kZXhbY2hhcmNvZGVdID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoRlhTWVNfc3RyY21wKG5hbWUsICIubm90ZGVmIikgIT0gMCAmJiBGWFNZU19zdHJjbXAobmFtZSwgInNwYWNlIikgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQubV9GYWNlLCBiVW5pY29kZSA/IG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gOiBjaGFyY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0NIQVIgbmFtZV9nbHlwaFsyNTZdOwotICAgICAgICAgICAgICAgICAgICBGWEZUX0dldF9HbHlwaF9OYW1lKG1fRm9udC5tX0ZhY2UsIG1fR2x5cGhJbmRleFtjaGFyY29kZV0sIG5hbWVfZ2x5cGgsIDI1Nik7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVfZ2x5cGhbMjU1XSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmIG5hbWVfY3QgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KGtDRkFsbG9jYXRvckRlZmF1bHQsIG5hbWVfZ2x5cGgsIGtDRlN0cmluZ0VuY29kaW5nQVNDSUksIGtDRkFsbG9jYXRvck51bGwpOwotICAgICAgICAgICAgICAgICAgICBtX0V4dEdJRFtjaGFyY29kZV0gPSBDR0ZvbnRHZXRHbHlwaFdpdGhHbHlwaE5hbWUoKENHRm9udFJlZiltX0ZvbnQubV9wUGxhdGZvcm1Gb250LCBuYW1lX2N0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVfY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENGUmVsZWFzZShuYW1lX2N0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSAweDIwOwotICAgICAgICAgICAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gYlVuaWNvZGUgPyBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIDB4MjApIDogMHhmZmZmOwotICAgICAgICAgICAgICAgICAgICBGWF9DSEFSIG5hbWVfZ2x5cGhbMjU2XTsKLSAgICAgICAgICAgICAgICAgICAgRlhGVF9HZXRfR2x5cGhfTmFtZShtX0ZvbnQubV9GYWNlLCBtX0dseXBoSW5kZXhbY2hhcmNvZGVdLCBuYW1lX2dseXBoLCAyNTYpOwotICAgICAgICAgICAgICAgICAgICBuYW1lX2dseXBoWzI1NV0gPSAwOwotICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZiBuYW1lX2N0ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZ05vQ29weShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBuYW1lX2dseXBoLCBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJLCBrQ0ZBbGxvY2F0b3JOdWxsKTsKLSAgICAgICAgICAgICAgICAgICAgbV9FeHRHSURbY2hhcmNvZGVdID0gQ0dGb250R2V0R2x5cGhXaXRoR2x5cGhOYW1lKChDR0ZvbnRSZWYpbV9Gb250Lm1fcFBsYXRmb3JtRm9udCwgbmFtZV9jdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lX2N0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDRlJlbGVhc2UobmFtZV9jdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOworI2VuZGlmCisgICAgICB9CisgICAgfQorI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisgICAgaWYgKCFiQ29yZVRleHQpIHsKKyAgICAgIEZYU1lTX21lbWNweShtX0V4dEdJRCwgbV9HbHlwaEluZGV4LCAyNTYpOwogICAgIH0KICNlbmRpZgorICAgIHJldHVybjsKKyAgfQorICBGVF9Vc2VUeXBlMUNoYXJtYXAobV9Gb250LkdldEZhY2UoKSk7CisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyAgaWYgKGJDb3JlVGV4dCkgewogICAgIGlmIChtX0ZsYWdzICYgUERGRk9OVF9TWU1CT0xJQykgewotICAgICAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSArKykgewotICAgICAgICAgICAgRlhfTFBDU1RSIG5hbWUgPSBHZXRBZG9iZUNoYXJOYW1lKG1fQmFzZUVuY29kaW5nLCBtX3BDaGFyTmFtZXMsIGNoYXJjb2RlKTsKLSAgICAgICAgICAgIGlmIChuYW1lKSB7Ci0gICAgICAgICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IFBERl9Vbmljb2RlRnJvbUFkb2JlTmFtZShuYW1lKTsKLSAgICAgICAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfTmFtZV9JbmRleChtX0ZvbnQubV9GYWNlLCAoY2hhciopbmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIGNoYXJjb2RlKTsKLSAgICAgICAgICAgICAgICBpZiAobV9HbHlwaEluZGV4W2NoYXJjb2RlXSkgewotICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiB1bmljb2RlID0gRlRfVW5pY29kZUZyb21DaGFyQ29kZShQREZGT05UX0VOQ09ESU5HX1NUQU5EQVJELCBjaGFyY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1bmljb2RlID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NIQVIgbmFtZV9nbHlwaFsyNTZdOwotICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0MzIobmFtZV9nbHlwaCwgMCwgc2l6ZW9mKG5hbWVfZ2x5cGgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYRlRfR2V0X0dseXBoX05hbWUobV9Gb250Lm1fRmFjZSwgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSwgbmFtZV9nbHlwaCwgMjU2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfZ2x5cGhbMjU1XSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZV9nbHlwaFswXSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZSA9IFBERl9Vbmljb2RlRnJvbUFkb2JlTmFtZShuYW1lX2dseXBoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gdW5pY29kZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSsrKSB7CisgICAgICAgIGNvbnN0IEZYX0NIQVIqIG5hbWUgPQorICAgICAgICAgICAgR2V0QWRvYmVDaGFyTmFtZShtX0Jhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBjaGFyY29kZSk7CisgICAgICAgIGlmIChuYW1lKSB7CisgICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IFBERl9Vbmljb2RlRnJvbUFkb2JlTmFtZShuYW1lKTsKKyAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0KKyAgICAgICAgICAgICAgRlhGVF9HZXRfTmFtZV9JbmRleChtX0ZvbnQuR2V0RmFjZSgpLCAoY2hhciopbmFtZSk7CisgICAgICAgICAgQ0ZTdHJpbmdSZWYgbmFtZV9jdCA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmdOb0NvcHkoCisgICAgICAgICAgICAgIGtDRkFsbG9jYXRvckRlZmF1bHQsIG5hbWUsIGtDRlN0cmluZ0VuY29kaW5nQVNDSUksCisgICAgICAgICAgICAgIGtDRkFsbG9jYXRvck51bGwpOworICAgICAgICAgIG1fRXh0R0lEW2NoYXJjb2RlXSA9IENHRm9udEdldEdseXBoV2l0aEdseXBoTmFtZSgKKyAgICAgICAgICAgICAgKENHRm9udFJlZiltX0ZvbnQuR2V0UGxhdGZvcm1Gb250KCksIG5hbWVfY3QpOworICAgICAgICAgIGlmIChuYW1lX2N0KSB7CisgICAgICAgICAgICBDRlJlbGVhc2UobmFtZV9jdCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPQorICAgICAgICAgICAgICBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5HZXRGYWNlKCksIGNoYXJjb2RlKTsKKyAgICAgICAgICBGWF9XQ0hBUiB1bmljb2RlID0gMDsKKyAgICAgICAgICBpZiAobV9HbHlwaEluZGV4W2NoYXJjb2RlXSkgeworICAgICAgICAgICAgdW5pY29kZSA9CisgICAgICAgICAgICAgICAgRlRfVW5pY29kZUZyb21DaGFyQ29kZShQREZGT05UX0VOQ09ESU5HX1NUQU5EQVJELCBjaGFyY29kZSk7CisgICAgICAgICAgfQorICAgICAgICAgIEZYX0NIQVIgbmFtZV9nbHlwaFsyNTZdOworICAgICAgICAgIEZYU1lTX21lbXNldChuYW1lX2dseXBoLCAwLCBzaXplb2YobmFtZV9nbHlwaCkpOworICAgICAgICAgIEZYRlRfR2V0X0dseXBoX05hbWUobV9Gb250LkdldEZhY2UoKSwgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfZ2x5cGgsIDI1Nik7CisgICAgICAgICAgbmFtZV9nbHlwaFsyNTVdID0gMDsKKyAgICAgICAgICBpZiAodW5pY29kZSA9PSAwICYmIG5hbWVfZ2x5cGhbMF0gIT0gMCkgeworICAgICAgICAgICAgdW5pY29kZSA9IFBERl9Vbmljb2RlRnJvbUFkb2JlTmFtZShuYW1lX2dseXBoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IHVuaWNvZGU7CisgICAgICAgICAgQ0ZTdHJpbmdSZWYgbmFtZV9jdCA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmdOb0NvcHkoCisgICAgICAgICAgICAgIGtDRkFsbG9jYXRvckRlZmF1bHQsIG5hbWVfZ2x5cGgsIGtDRlN0cmluZ0VuY29kaW5nQVNDSUksCisgICAgICAgICAgICAgIGtDRkFsbG9jYXRvck51bGwpOworICAgICAgICAgIG1fRXh0R0lEW2NoYXJjb2RlXSA9IENHRm9udEdldEdseXBoV2l0aEdseXBoTmFtZSgKKyAgICAgICAgICAgICAgKENHRm9udFJlZiltX0ZvbnQuR2V0UGxhdGZvcm1Gb250KCksIG5hbWVfY3QpOworICAgICAgICAgIGlmIChuYW1lX2N0KSB7CisgICAgICAgICAgICBDRlJlbGVhc2UobmFtZV9jdCk7CisgICAgICAgICAgfQogICAgICAgICB9Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgICAgIGlmICghYkNvcmVUZXh0KSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkzMihtX0V4dEdJRCwgbV9HbHlwaEluZGV4LCAyNTYpOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgcmV0dXJuOwogICAgIH0KICAgICBGWF9CT09MIGJVbmljb2RlID0gRkFMU0U7Ci0gICAgaWYgKDAgPT0gRlhGVF9TZWxlY3RfQ2hhcm1hcChtX0ZvbnQubV9GYWNlLCBGWEZUX0VOQ09ESU5HX1VOSUNPREUpKSB7Ci0gICAgICAgIGJVbmljb2RlID0gVFJVRTsKKyAgICBpZiAoMCA9PSBGWEZUX1NlbGVjdF9DaGFybWFwKG1fRm9udC5HZXRGYWNlKCksIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSkpIHsKKyAgICAgIGJVbmljb2RlID0gVFJVRTsKICAgICB9Ci0gICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUgKyspIHsKLSAgICAgICAgRlhfTFBDU1RSIG5hbWUgPSBHZXRBZG9iZUNoYXJOYW1lKG1fQmFzZUVuY29kaW5nLCBtX3BDaGFyTmFtZXMsIGNoYXJjb2RlKTsKLSAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7CisgICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUrKykgeworICAgICAgY29uc3QgRlhfQ0hBUiogbmFtZSA9CisgICAgICAgICAgR2V0QWRvYmVDaGFyTmFtZShtX0Jhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBjaGFyY29kZSk7CisgICAgICBpZiAoIW5hbWUpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gUERGX1VuaWNvZGVGcm9tQWRvYmVOYW1lKG5hbWUpOworICAgICAgY29uc3QgRlhfQ0hBUiogcFN0clVuaWNvZGUgPSBfR2x5cGhOYW1lUmVtYXAobmFtZSk7CisgICAgICBpZiAocFN0clVuaWNvZGUgJiYKKyAgICAgICAgICAwID09IEZYRlRfR2V0X05hbWVfSW5kZXgobV9Gb250LkdldEZhY2UoKSwgKGNoYXIqKW5hbWUpKSB7CisgICAgICAgIG5hbWUgPSBwU3RyVW5pY29kZTsKKyAgICAgIH0KKyAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPQorICAgICAgICAgIEZYRlRfR2V0X05hbWVfSW5kZXgobV9Gb250LkdldEZhY2UoKSwgKGNoYXIqKW5hbWUpOworICAgICAgQ0ZTdHJpbmdSZWYgbmFtZV9jdCA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmdOb0NvcHkoCisgICAgICAgICAga0NGQWxsb2NhdG9yRGVmYXVsdCwgbmFtZSwga0NGU3RyaW5nRW5jb2RpbmdBU0NJSSwga0NGQWxsb2NhdG9yTnVsbCk7CisgICAgICBtX0V4dEdJRFtjaGFyY29kZV0gPSBDR0ZvbnRHZXRHbHlwaFdpdGhHbHlwaE5hbWUoCisgICAgICAgICAgKENHRm9udFJlZiltX0ZvbnQuR2V0UGxhdGZvcm1Gb250KCksIG5hbWVfY3QpOworICAgICAgaWYgKG5hbWVfY3QpIHsKKyAgICAgICAgQ0ZSZWxlYXNlKG5hbWVfY3QpOworICAgICAgfQorICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPT0gMCkgeworICAgICAgICBpZiAoRlhTWVNfc3RyY21wKG5hbWUsICIubm90ZGVmIikgIT0gMCAmJgorICAgICAgICAgICAgRlhTWVNfc3RyY21wKG5hbWUsICJzcGFjZSIpICE9IDApIHsKKyAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfQ2hhcl9JbmRleCgKKyAgICAgICAgICAgICAgbV9Gb250LkdldEZhY2UoKSwKKyAgICAgICAgICAgICAgYlVuaWNvZGUgPyBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdIDogY2hhcmNvZGUpOworICAgICAgICAgIEZYX0NIQVIgbmFtZV9nbHlwaFsyNTZdOworICAgICAgICAgIEZYRlRfR2V0X0dseXBoX05hbWUobV9Gb250LkdldEZhY2UoKSwgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfZ2x5cGgsIDI1Nik7CisgICAgICAgICAgbmFtZV9nbHlwaFsyNTVdID0gMDsKKyAgICAgICAgICBDRlN0cmluZ1JlZiBuYW1lX2N0ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZ05vQ29weSgKKyAgICAgICAgICAgICAga0NGQWxsb2NhdG9yRGVmYXVsdCwgbmFtZV9nbHlwaCwga0NGU3RyaW5nRW5jb2RpbmdBU0NJSSwKKyAgICAgICAgICAgICAga0NGQWxsb2NhdG9yTnVsbCk7CisgICAgICAgICAgbV9FeHRHSURbY2hhcmNvZGVdID0gQ0dGb250R2V0R2x5cGhXaXRoR2x5cGhOYW1lKAorICAgICAgICAgICAgICAoQ0dGb250UmVmKW1fRm9udC5HZXRQbGF0Zm9ybUZvbnQoKSwgbmFtZV9jdCk7CisgICAgICAgICAgaWYgKG5hbWVfY3QpIHsKKyAgICAgICAgICAgIENGUmVsZWFzZShuYW1lX2N0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IDB4MjA7CisgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9CisgICAgICAgICAgICAgIGJVbmljb2RlID8gRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQuR2V0RmFjZSgpLCAweDIwKSA6IDB4ZmZmZjsKKyAgICAgICAgICBGWF9DSEFSIG5hbWVfZ2x5cGhbMjU2XTsKKyAgICAgICAgICBGWEZUX0dldF9HbHlwaF9OYW1lKG1fRm9udC5HZXRGYWNlKCksIG1fR2x5cGhJbmRleFtjaGFyY29kZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2dseXBoLCAyNTYpOworICAgICAgICAgIG5hbWVfZ2x5cGhbMjU1XSA9IDA7CisgICAgICAgICAgQ0ZTdHJpbmdSZWYgbmFtZV9jdCA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmdOb0NvcHkoCisgICAgICAgICAgICAgIGtDRkFsbG9jYXRvckRlZmF1bHQsIG5hbWVfZ2x5cGgsIGtDRlN0cmluZ0VuY29kaW5nQVNDSUksCisgICAgICAgICAgICAgIGtDRkFsbG9jYXRvck51bGwpOworICAgICAgICAgIG1fRXh0R0lEW2NoYXJjb2RlXSA9IENHRm9udEdldEdseXBoV2l0aEdseXBoTmFtZSgKKyAgICAgICAgICAgICAgKENHRm9udFJlZiltX0ZvbnQuR2V0UGxhdGZvcm1Gb250KCksIG5hbWVfY3QpOworICAgICAgICAgIGlmIChuYW1lX2N0KSB7CisgICAgICAgICAgICBDRlJlbGVhc2UobmFtZV9jdCk7CisgICAgICAgICAgfQogICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybjsKKyAgfQorI2VuZGlmCisgIGlmIChtX0ZsYWdzICYgUERGRk9OVF9TWU1CT0xJQykgeworICAgIGZvciAoaW50IGNoYXJjb2RlID0gMDsgY2hhcmNvZGUgPCAyNTY7IGNoYXJjb2RlKyspIHsKKyAgICAgIGNvbnN0IEZYX0NIQVIqIG5hbWUgPQorICAgICAgICAgIEdldEFkb2JlQ2hhck5hbWUobV9CYXNlRW5jb2RpbmcsIG1fcENoYXJOYW1lcywgY2hhcmNvZGUpOworICAgICAgaWYgKG5hbWUpIHsKICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IFBERl9Vbmljb2RlRnJvbUFkb2JlTmFtZShuYW1lKTsKLSAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IEZYRlRfR2V0X05hbWVfSW5kZXgobV9Gb250Lm1fRmFjZSwgKGNoYXIqKW5hbWUpOwotICAgICAgICBpZiAobV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoRlhTWVNfc3RyY21wKG5hbWUsICIubm90ZGVmIikgIT0gMCAmJiBGWFNZU19zdHJjbXAobmFtZSwgInNwYWNlIikgIT0gMCkgewotICAgICAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIGJVbmljb2RlID8gbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA6IGNoYXJjb2RlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IDB4MjA7Ci0gICAgICAgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IDB4ZmZmZjsKKyAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9CisgICAgICAgICAgICBGWEZUX0dldF9OYW1lX0luZGV4KG1fRm9udC5HZXRGYWNlKCksIChjaGFyKiluYW1lKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPQorICAgICAgICAgICAgRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQuR2V0RmFjZSgpLCBjaGFyY29kZSk7CisgICAgICAgIGlmIChtX0dseXBoSW5kZXhbY2hhcmNvZGVdKSB7CisgICAgICAgICAgRlhfV0NIQVIgdW5pY29kZSA9CisgICAgICAgICAgICAgIEZUX1VuaWNvZGVGcm9tQ2hhckNvZGUoUERGRk9OVF9FTkNPRElOR19TVEFOREFSRCwgY2hhcmNvZGUpOworICAgICAgICAgIGlmICh1bmljb2RlID09IDApIHsKKyAgICAgICAgICAgIEZYX0NIQVIgbmFtZV9nbHlwaFsyNTZdOworICAgICAgICAgICAgRlhTWVNfbWVtc2V0KG5hbWVfZ2x5cGgsIDAsIHNpemVvZihuYW1lX2dseXBoKSk7CisgICAgICAgICAgICBGWEZUX0dldF9HbHlwaF9OYW1lKG1fRm9udC5HZXRGYWNlKCksIG1fR2x5cGhJbmRleFtjaGFyY29kZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfZ2x5cGgsIDI1Nik7CisgICAgICAgICAgICBuYW1lX2dseXBoWzI1NV0gPSAwOworICAgICAgICAgICAgaWYgKG5hbWVfZ2x5cGhbMF0gIT0gMCkgeworICAgICAgICAgICAgICB1bmljb2RlID0gUERGX1VuaWNvZGVGcm9tQWRvYmVOYW1lKG5hbWVfZ2x5cGgpOwogICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gdW5pY29kZTsKICAgICAgICAgfQorICAgICAgfQogICAgIH0KLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwogICAgIGlmICghYkNvcmVUZXh0KSB7Ci0gICAgICAgIEZYU1lTX21lbWNweTMyKG1fRXh0R0lELCBtX0dseXBoSW5kZXgsIDI1Nik7CisgICAgICBGWFNZU19tZW1jcHkobV9FeHRHSUQsIG1fR2x5cGhJbmRleCwgMjU2KTsKICAgICB9CiAjZW5kaWYKLX0KLUNQREZfRm9udEVuY29kaW5nOjpDUERGX0ZvbnRFbmNvZGluZygpCi17Ci0gICAgRlhTWVNfbWVtc2V0MzIobV9Vbmljb2RlcywgMCwgc2l6ZW9mKG1fVW5pY29kZXMpKTsKLX0KLWludCBDUERGX0ZvbnRFbmNvZGluZzo6Q2hhckNvZGVGcm9tVW5pY29kZShGWF9XQ0hBUiB1bmljb2RlKSBjb25zdAotewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpICsrKQotICAgICAgICBpZiAobV9Vbmljb2Rlc1tpXSA9PSB1bmljb2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotICAgIHJldHVybiAtMTsKLX0KLUNQREZfRm9udEVuY29kaW5nOjpDUERGX0ZvbnRFbmNvZGluZyhpbnQgUHJlZGVmaW5lZEVuY29kaW5nKQotewotICAgIGNvbnN0IEZYX1dPUkQqIHBTcmMgPSBQREZfVW5pY29kZXNGb3JQcmVkZWZpbmVkQ2hhclNldChQcmVkZWZpbmVkRW5jb2RpbmcpOwotICAgIGlmICghcFNyYykgewotICAgICAgICBGWFNZU19tZW1zZXQzMihtX1VuaWNvZGVzLCAwLCBzaXplb2YobV9Vbmljb2RlcykpOwotICAgIH0gZWxzZQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0gICAgICAgICAgICBtX1VuaWNvZGVzW2ldID0gcFNyY1tpXTsKLSAgICAgICAgfQotfQotRlhfQk9PTCBDUERGX0ZvbnRFbmNvZGluZzo6SXNJZGVudGljYWwoQ1BERl9Gb250RW5jb2RpbmcqIHBBbm90aGVyKSBjb25zdAotewotICAgIHJldHVybiBGWFNZU19tZW1jbXAzMihtX1VuaWNvZGVzLCBwQW5vdGhlci0+bV9Vbmljb2Rlcywgc2l6ZW9mKG1fVW5pY29kZXMpKSA9PSAwOwotfQotQ1BERl9PYmplY3QqIENQREZfRm9udEVuY29kaW5nOjpSZWFsaXplKCkKLXsKLSAgICBpbnQgcHJlZGVmaW5lZCA9IDA7Ci0gICAgZm9yIChpbnQgY3MgPSBQREZGT05UX0VOQ09ESU5HX1dJTkFOU0k7IGNzIDwgUERGRk9OVF9FTkNPRElOR19aQVBGRElOR0JBVFM7IGNzICsrKSB7Ci0gICAgICAgIGNvbnN0IEZYX1dPUkQqIHBTcmMgPSBQREZfVW5pY29kZXNGb3JQcmVkZWZpbmVkQ2hhclNldChjcyk7Ci0gICAgICAgIEZYX0JPT0wgbWF0Y2ggPSBUUlVFOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgKytpKSB7Ci0gICAgICAgICAgICBpZiAobV9Vbmljb2Rlc1tpXSAhPSBwU3JjW2ldKSB7Ci0gICAgICAgICAgICAgICAgbWF0Y2ggPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobWF0Y2gpIHsKLSAgICAgICAgICAgIHByZWRlZmluZWQgPSBjczsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisgICAgcmV0dXJuOworICB9CisgIEZYX0JPT0wgYlVuaWNvZGUgPSBGQUxTRTsKKyAgaWYgKDAgPT0gRlhGVF9TZWxlY3RfQ2hhcm1hcChtX0ZvbnQuR2V0RmFjZSgpLCBGWEZUX0VOQ09ESU5HX1VOSUNPREUpKSB7CisgICAgYlVuaWNvZGUgPSBUUlVFOworICB9CisgIGZvciAoaW50IGNoYXJjb2RlID0gMDsgY2hhcmNvZGUgPCAyNTY7IGNoYXJjb2RlKyspIHsKKyAgICBjb25zdCBGWF9DSEFSKiBuYW1lID0KKyAgICAgICAgR2V0QWRvYmVDaGFyTmFtZShtX0Jhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBjaGFyY29kZSk7CisgICAgaWYgKCFuYW1lKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgaWYgKHByZWRlZmluZWQpIHsKLSAgICAgICAgaWYgKHByZWRlZmluZWQgPT0gUERGRk9OVF9FTkNPRElOR19XSU5BTlNJKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ1BERl9OYW1lOjpDcmVhdGUoIldpbkFuc2lFbmNvZGluZyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmVkZWZpbmVkID09IFBERkZPTlRfRU5DT0RJTkdfTUFDUk9NQU4pIHsKLSAgICAgICAgICAgIHJldHVybiBDUERGX05hbWU6OkNyZWF0ZSgiTWFjUm9tYW5FbmNvZGluZyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmVkZWZpbmVkID09IFBERkZPTlRfRU5DT0RJTkdfTUFDRVhQRVJUKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ1BERl9OYW1lOjpDcmVhdGUoIk1hY0V4cGVydEVuY29kaW5nIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IFBERl9Vbmljb2RlRnJvbUFkb2JlTmFtZShuYW1lKTsKKyAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfTmFtZV9JbmRleChtX0ZvbnQuR2V0RmFjZSgpLCAoY2hhciopbmFtZSk7CisgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPT0gMCkgeworICAgICAgaWYgKEZYU1lTX3N0cmNtcChuYW1lLCAiLm5vdGRlZiIpICE9IDAgJiYKKyAgICAgICAgICBGWFNZU19zdHJjbXAobmFtZSwgInNwYWNlIikgIT0gMCkgeworICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfQ2hhcl9JbmRleCgKKyAgICAgICAgICAgIG1fRm9udC5HZXRGYWNlKCksCisgICAgICAgICAgICBiVW5pY29kZSA/IG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gOiBjaGFyY29kZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gMHgyMDsKKyAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IDB4ZmZmZjsKKyAgICAgIH0KICAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCk7Ci0gICAgcERpY3QtPlNldEF0TmFtZShGWF9CU1RSQygiQmFzZUVuY29kaW5nIiksIEZYX0JTVFJDKCJXaW5BbnNpRW5jb2RpbmciKSk7Ci0gICAgY29uc3QgRlhfV09SRCogcFN0YW5kYXJkID0gUERGX1VuaWNvZGVzRm9yUHJlZGVmaW5lZENoYXJTZXQoUERGRk9OVF9FTkNPRElOR19XSU5BTlNJKTsKLSAgICBDUERGX0FycmF5KiBwRGlmZiA9IENQREZfQXJyYXk6OkNyZWF0ZSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpICsrKSB7Ci0gICAgICAgIGlmIChwU3RhbmRhcmRbaV0gPT0gbV9Vbmljb2Rlc1tpXSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgcERpZmYtPkFkZChDUERGX051bWJlcjo6Q3JlYXRlKGkpKTsKLSAgICAgICAgcERpZmYtPkFkZChDUERGX05hbWU6OkNyZWF0ZShQREZfQWRvYmVOYW1lRnJvbVVuaWNvZGUobV9Vbmljb2Rlc1tpXSkpKTsKLSAgICB9Ci0gICAgcERpY3QtPlNldEF0KEZYX0JTVFJDKCJEaWZmZXJlbmNlcyIpLCBwRGlmZik7Ci0gICAgcmV0dXJuIHBEaWN0OworICB9CisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyAgaWYgKCFiQ29yZVRleHQpIHsKKyAgICBGWFNZU19tZW1jcHkobV9FeHRHSUQsIG1fR2x5cGhJbmRleCwgMjU2KTsKKyAgfQorI2VuZGlmCiB9Ci1DUERGX1RydWVUeXBlRm9udDo6Q1BERl9UcnVlVHlwZUZvbnQoKSA6IENQREZfU2ltcGxlRm9udChQREZGT05UX1RSVUVUWVBFKQotewotfQotRlhfQk9PTCBDUERGX1RydWVUeXBlRm9udDo6X0xvYWQoKQotewotICAgIHJldHVybiBMb2FkQ29tbW9uKCk7Ci19Ci1leHRlcm4gRlhfRFdPUkQgRlRfQ2hhckNvZGVGcm9tVW5pY29kZShpbnQgZW5jb2RpbmcsIEZYX1dDSEFSIHVuaWNvZGUpOwotdm9pZCBDUERGX1RydWVUeXBlRm9udDo6TG9hZEdseXBoTWFwKCkKLXsKLSAgICBpZiAobV9Gb250Lm1fRmFjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IGJhc2VFbmNvZGluZyA9IG1fQmFzZUVuY29kaW5nOwotICAgIGlmIChtX3BGb250RmlsZSAmJiBtX0ZvbnQubV9GYWNlLT5udW1fY2hhcm1hcHMgPiAwCi0gICAgICAgICAgICAmJiAoYmFzZUVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfTUFDUk9NQU4gfHwgYmFzZUVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfV0lOQU5TSSkKLSAgICAgICAgICAgICYmIChtX0ZsYWdzICYgUERGRk9OVF9TWU1CT0xJQykpIHsKLSAgICAgICAgRlhfQk9PTCBiU3VwcG9ydFdpbiA9IEZBTFNFOwotICAgICAgICBGWF9CT09MIGJTdXBwb3J0TWFjID0gRkFMU0U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRlhGVF9HZXRfRmFjZV9DaGFybWFwQ291bnQobV9Gb250Lm1fRmFjZSk7IGkrKykgewotICAgICAgICAgICAgaW50IHBsYXRmb3JtX2lkID0gRlhGVF9HZXRfQ2hhcm1hcF9QbGF0Zm9ybUlEKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMobV9Gb250Lm1fRmFjZSlbaV0pOwotICAgICAgICAgICAgaWYgKHBsYXRmb3JtX2lkID09IDAgfHwgcGxhdGZvcm1faWQgPT0gMykgewotICAgICAgICAgICAgICAgIGJTdXBwb3J0V2luID0gVFJVRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGxhdGZvcm1faWQgPT0gMCB8fCBwbGF0Zm9ybV9pZCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgYlN1cHBvcnRNYWMgPSBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChiYXNlRW5jb2RpbmcgPT0gUERGRk9OVF9FTkNPRElOR19XSU5BTlNJICYmICFiU3VwcG9ydFdpbikgewotICAgICAgICAgICAgYmFzZUVuY29kaW5nID0gYlN1cHBvcnRNYWMgPyBQREZGT05UX0VOQ09ESU5HX01BQ1JPTUFOIDogUERGRk9OVF9FTkNPRElOR19CVUlMVElOOwotICAgICAgICB9IGVsc2UgaWYgKGJhc2VFbmNvZGluZyA9PSBQREZGT05UX0VOQ09ESU5HX01BQ1JPTUFOICYmICFiU3VwcG9ydE1hYykgewotICAgICAgICAgICAgYmFzZUVuY29kaW5nID0gYlN1cHBvcnRXaW4gPyBQREZGT05UX0VOQ09ESU5HX1dJTkFOU0kgOiBQREZGT05UX0VOQ09ESU5HX0JVSUxUSU47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCgoYmFzZUVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfTUFDUk9NQU4gfHwgYmFzZUVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfV0lOQU5TSSkKLSAgICAgICAgICAgICYmIG1fcENoYXJOYW1lcyA9PSBOVUxMKSB8fCAobV9GbGFncyAmIFBERkZPTlRfTk9OU1lNQk9MSUMpKSB7Ci0gICAgICAgIGlmICghRlhGVF9IYXNfR2x5cGhfTmFtZXMobV9Gb250Lm1fRmFjZSkgJiYgKCFtX0ZvbnQubV9GYWNlLT5udW1fY2hhcm1hcHMgfHwgIW1fRm9udC5tX0ZhY2UtPmNoYXJtYXBzKSkgewotICAgICAgICAgICAgaW50IG5TdGFydENoYXIgPSBtX3BGb250RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiRmlyc3RDaGFyIikpOwotICAgICAgICAgICAgaWYoblN0YXJ0Q2hhciA8IDAgfHwgblN0YXJ0Q2hhciA+IDI1NSkKLSAgICAgICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgICAgIGludCBjaGFyY29kZSA9IDA7Ci0gICAgICAgICAgICBmb3IgKDsgY2hhcmNvZGUgPCBuU3RhcnRDaGFyOyBjaGFyY29kZSArKykgewotICAgICAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfV09SRCBuR2x5cGggPSBjaGFyY29kZSAtIG5TdGFydENoYXIgKyAzOwotICAgICAgICAgICAgZm9yICg7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSArKywgbkdseXBoICsrKSB7Ci0gICAgICAgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IG5HbHlwaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBGWF9CT09MIGJNU1VuaWNvZGUgPSBGVF9Vc2VUVENoYXJtYXAobV9Gb250Lm1fRmFjZSwgMywgMSk7Ci0gICAgICAgIEZYX0JPT0wgYk1hY1JvbWFuID0gRkFMU0UsIGJNU1N5bWJvbCA9IEZBTFNFOwotICAgICAgICBpZiAoIWJNU1VuaWNvZGUpIHsKLSAgICAgICAgICAgIGlmIChtX0ZsYWdzICYgUERGRk9OVF9OT05TWU1CT0xJQykgewotICAgICAgICAgICAgICAgIGJNYWNSb21hbiA9IEZUX1VzZVRUQ2hhcm1hcChtX0ZvbnQubV9GYWNlLCAxLCAwKTsKLSAgICAgICAgICAgICAgICBiTVNTeW1ib2wgPSAhYk1hY1JvbWFuICYmIEZUX1VzZVRUQ2hhcm1hcChtX0ZvbnQubV9GYWNlLCAzLCAwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYk1TU3ltYm9sID0gRlRfVXNlVFRDaGFybWFwKG1fRm9udC5tX0ZhY2UsIDMsIDApOwotICAgICAgICAgICAgICAgIGJNYWNSb21hbiA9ICFiTVNTeW1ib2wgJiYgRlRfVXNlVFRDaGFybWFwKG1fRm9udC5tX0ZhY2UsIDEsIDApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEZYX0JPT0wgYlRvVW5pY29kZSA9IG1fcEZvbnREaWN0LT5LZXlFeGlzdChGWF9CU1RSQygiVG9Vbmljb2RlIikpOwotICAgICAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSArKykgewotICAgICAgICAgICAgRlhfTFBDU1RSIG5hbWUgPSBHZXRBZG9iZUNoYXJOYW1lKGJhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBjaGFyY29kZSk7Ci0gICAgICAgICAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IG1fcEZvbnRGaWxlID8gRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQubV9GYWNlLCBjaGFyY29kZSkgOiAtMTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSBQREZfVW5pY29kZUZyb21BZG9iZU5hbWUobmFtZSk7Ci0gICAgICAgICAgICBpZiAoYk1TU3ltYm9sKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgRlhfQllURSBwcmVmaXhbNF0gPSB7MHgwMCwgMHhmMCwgMHhmMSwgMHhmMn07Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgdW5pY29kZSA9IHByZWZpeFtqXSAqIDI1NiArIGNoYXJjb2RlOwotICAgICAgICAgICAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQubV9GYWNlLCB1bmljb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJNU1VuaWNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250Lm1fRmFjZSwgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiTWFjUm9tYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFjY29kZSA9IEZUX0NoYXJDb2RlRnJvbVVuaWNvZGUoRlhGVF9FTkNPRElOR19BUFBMRV9ST01BTiwgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbWFjY29kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IEZYRlRfR2V0X05hbWVfSW5kZXgobV9Gb250Lm1fRmFjZSwgKGNoYXIgKiluYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIG1hY2NvZGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChtX0dseXBoSW5kZXhbY2hhcmNvZGVdID09IDAgfHwgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9PSAweGZmZmYpICYmIG5hbWUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmIChuYW1lWzBdID09ICcuJyAmJiBGWFNZU19zdHJjbXAobmFtZSwgIi5ub3RkZWYiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIDMyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfTmFtZV9JbmRleChtX0ZvbnQubV9GYWNlLCAoY2hhciopbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX0dseXBoSW5kZXhbY2hhcmNvZGVdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiVG9Vbmljb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NVbmljb2RlID0gVW5pY29kZUZyb21DaGFyQ29kZShjaGFyY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3c1VuaWNvZGUuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIHdzVW5pY29kZVswXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSB3c1VuaWNvZGVbMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIGNoYXJjb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorQ1BERl9Gb250RW5jb2Rpbmc6OkNQREZfRm9udEVuY29kaW5nKCkgeworICBGWFNZU19tZW1zZXQobV9Vbmljb2RlcywgMCwgc2l6ZW9mKG1fVW5pY29kZXMpKTsKK30KK2ludCBDUERGX0ZvbnRFbmNvZGluZzo6Q2hhckNvZGVGcm9tVW5pY29kZShGWF9XQ0hBUiB1bmljb2RlKSBjb25zdCB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgaWYgKG1fVW5pY29kZXNbaV0gPT0gdW5pY29kZSkgeworICAgICAgcmV0dXJuIGk7CisgICAgfQorICByZXR1cm4gLTE7Cit9CitDUERGX0ZvbnRFbmNvZGluZzo6Q1BERl9Gb250RW5jb2RpbmcoaW50IFByZWRlZmluZWRFbmNvZGluZykgeworICBjb25zdCBGWF9XT1JEKiBwU3JjID0gUERGX1VuaWNvZGVzRm9yUHJlZGVmaW5lZENoYXJTZXQoUHJlZGVmaW5lZEVuY29kaW5nKTsKKyAgaWYgKCFwU3JjKSB7CisgICAgRlhTWVNfbWVtc2V0KG1fVW5pY29kZXMsIDAsIHNpemVvZihtX1VuaWNvZGVzKSk7CisgIH0gZWxzZQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgIG1fVW5pY29kZXNbaV0gPSBwU3JjW2ldOworICAgIH0KK30KK0ZYX0JPT0wgQ1BERl9Gb250RW5jb2Rpbmc6OklzSWRlbnRpY2FsKENQREZfRm9udEVuY29kaW5nKiBwQW5vdGhlcikgY29uc3QgeworICByZXR1cm4gRlhTWVNfbWVtY21wKG1fVW5pY29kZXMsIHBBbm90aGVyLT5tX1VuaWNvZGVzLCBzaXplb2YobV9Vbmljb2RlcykpID09CisgICAgICAgICAwOworfQorQ1BERl9PYmplY3QqIENQREZfRm9udEVuY29kaW5nOjpSZWFsaXplKCkgeworICBpbnQgcHJlZGVmaW5lZCA9IDA7CisgIGZvciAoaW50IGNzID0gUERGRk9OVF9FTkNPRElOR19XSU5BTlNJOyBjcyA8IFBERkZPTlRfRU5DT0RJTkdfWkFQRkRJTkdCQVRTOworICAgICAgIGNzKyspIHsKKyAgICBjb25zdCBGWF9XT1JEKiBwU3JjID0gUERGX1VuaWNvZGVzRm9yUHJlZGVmaW5lZENoYXJTZXQoY3MpOworICAgIEZYX0JPT0wgbWF0Y2ggPSBUUlVFOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgIGlmIChtX1VuaWNvZGVzW2ldICE9IHBTcmNbaV0pIHsKKyAgICAgICAgbWF0Y2ggPSBGQUxTRTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmIChtYXRjaCkgeworICAgICAgcHJlZGVmaW5lZCA9IGNzOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChwcmVkZWZpbmVkKSB7CisgICAgaWYgKHByZWRlZmluZWQgPT0gUERGRk9OVF9FTkNPRElOR19XSU5BTlNJKSB7CisgICAgICByZXR1cm4gbmV3IENQREZfTmFtZSgiV2luQW5zaUVuY29kaW5nIik7CisgICAgfQorICAgIGlmIChwcmVkZWZpbmVkID09IFBERkZPTlRfRU5DT0RJTkdfTUFDUk9NQU4pIHsKKyAgICAgIHJldHVybiBuZXcgQ1BERl9OYW1lKCJNYWNSb21hbkVuY29kaW5nIik7CisgICAgfQorICAgIGlmIChwcmVkZWZpbmVkID09IFBERkZPTlRfRU5DT0RJTkdfTUFDRVhQRVJUKSB7CisgICAgICByZXR1cm4gbmV3IENQREZfTmFtZSgiTWFjRXhwZXJ0RW5jb2RpbmciKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgY29uc3QgRlhfV09SRCogcFN0YW5kYXJkID0KKyAgICAgIFBERl9Vbmljb2Rlc0ZvclByZWRlZmluZWRDaGFyU2V0KFBERkZPTlRfRU5DT0RJTkdfV0lOQU5TSSk7CisgIENQREZfQXJyYXkqIHBEaWZmID0gbmV3IENQREZfQXJyYXk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICBpZiAocFN0YW5kYXJkW2ldID09IG1fVW5pY29kZXNbaV0pIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBwRGlmZi0+QWRkKG5ldyBDUERGX051bWJlcihpKSk7CisgICAgcERpZmYtPkFkZChuZXcgQ1BERl9OYW1lKFBERl9BZG9iZU5hbWVGcm9tVW5pY29kZShtX1VuaWNvZGVzW2ldKSkpOworICB9CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgIHBEaWN0LT5TZXRBdE5hbWUoIkJhc2VFbmNvZGluZyIsICJXaW5BbnNpRW5jb2RpbmciKTsKKyAgcERpY3QtPlNldEF0KCJEaWZmZXJlbmNlcyIsIHBEaWZmKTsKKyAgcmV0dXJuIHBEaWN0OworfQorQ1BERl9UcnVlVHlwZUZvbnQ6OkNQREZfVHJ1ZVR5cGVGb250KCkgOiBDUERGX1NpbXBsZUZvbnQoUERGRk9OVF9UUlVFVFlQRSkge30KK0ZYX0JPT0wgQ1BERl9UcnVlVHlwZUZvbnQ6Ol9Mb2FkKCkgeworICByZXR1cm4gTG9hZENvbW1vbigpOworfQordm9pZCBDUERGX1RydWVUeXBlRm9udDo6TG9hZEdseXBoTWFwKCkgeworICBpZiAoIW1fRm9udC5HZXRGYWNlKCkpCisgICAgcmV0dXJuOworCisgIGludCBiYXNlRW5jb2RpbmcgPSBtX0Jhc2VFbmNvZGluZzsKKyAgaWYgKG1fcEZvbnRGaWxlICYmIG1fRm9udC5HZXRGYWNlKCktPm51bV9jaGFybWFwcyA+IDAgJiYKKyAgICAgIChiYXNlRW5jb2RpbmcgPT0gUERGRk9OVF9FTkNPRElOR19NQUNST01BTiB8fAorICAgICAgIGJhc2VFbmNvZGluZyA9PSBQREZGT05UX0VOQ09ESU5HX1dJTkFOU0kpICYmCisgICAgICAobV9GbGFncyAmIFBERkZPTlRfU1lNQk9MSUMpKSB7CisgICAgRlhfQk9PTCBiU3VwcG9ydFdpbiA9IEZBTFNFOworICAgIEZYX0JPT0wgYlN1cHBvcnRNYWMgPSBGQUxTRTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcENvdW50KG1fRm9udC5HZXRGYWNlKCkpOyBpKyspIHsKKyAgICAgIGludCBwbGF0Zm9ybV9pZCA9IEZYRlRfR2V0X0NoYXJtYXBfUGxhdGZvcm1JRCgKKyAgICAgICAgICBGWEZUX0dldF9GYWNlX0NoYXJtYXBzKG1fRm9udC5HZXRGYWNlKCkpW2ldKTsKKyAgICAgIGlmIChwbGF0Zm9ybV9pZCA9PSAwIHx8IHBsYXRmb3JtX2lkID09IDMpIHsKKyAgICAgICAgYlN1cHBvcnRXaW4gPSBUUlVFOworICAgICAgfSBlbHNlIGlmIChwbGF0Zm9ybV9pZCA9PSAwIHx8IHBsYXRmb3JtX2lkID09IDEpIHsKKyAgICAgICAgYlN1cHBvcnRNYWMgPSBUUlVFOworICAgICAgfQorICAgIH0KKyAgICBpZiAoYmFzZUVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfV0lOQU5TSSAmJiAhYlN1cHBvcnRXaW4pIHsKKyAgICAgIGJhc2VFbmNvZGluZyA9CisgICAgICAgICAgYlN1cHBvcnRNYWMgPyBQREZGT05UX0VOQ09ESU5HX01BQ1JPTUFOIDogUERGRk9OVF9FTkNPRElOR19CVUlMVElOOworICAgIH0gZWxzZSBpZiAoYmFzZUVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfTUFDUk9NQU4gJiYgIWJTdXBwb3J0TWFjKSB7CisgICAgICBiYXNlRW5jb2RpbmcgPQorICAgICAgICAgIGJTdXBwb3J0V2luID8gUERGRk9OVF9FTkNPRElOR19XSU5BTlNJIDogUERGRk9OVF9FTkNPRElOR19CVUlMVElOOworICAgIH0KKyAgfQorICBpZiAoKChiYXNlRW5jb2RpbmcgPT0gUERGRk9OVF9FTkNPRElOR19NQUNST01BTiB8fAorICAgICAgICBiYXNlRW5jb2RpbmcgPT0gUERGRk9OVF9FTkNPRElOR19XSU5BTlNJKSAmJgorICAgICAgICFtX3BDaGFyTmFtZXMpIHx8CisgICAgICAobV9GbGFncyAmIFBERkZPTlRfTk9OU1lNQk9MSUMpKSB7CisgICAgaWYgKCFGWEZUX0hhc19HbHlwaF9OYW1lcyhtX0ZvbnQuR2V0RmFjZSgpKSAmJgorICAgICAgICAoIW1fRm9udC5HZXRGYWNlKCktPm51bV9jaGFybWFwcyB8fCAhbV9Gb250LkdldEZhY2UoKS0+Y2hhcm1hcHMpKSB7CisgICAgICBpbnQgblN0YXJ0Q2hhciA9IG1fcEZvbnREaWN0LT5HZXRJbnRlZ2VyKCJGaXJzdENoYXIiKTsKKyAgICAgIGlmIChuU3RhcnRDaGFyIDwgMCB8fCBuU3RhcnRDaGFyID4gMjU1KQogICAgICAgICByZXR1cm47CisKKyAgICAgIGludCBjaGFyY29kZSA9IDA7CisgICAgICBmb3IgKDsgY2hhcmNvZGUgPCBuU3RhcnRDaGFyOyBjaGFyY29kZSsrKSB7CisgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSAwOworICAgICAgfQorICAgICAgRlhfV09SRCBuR2x5cGggPSBjaGFyY29kZSAtIG5TdGFydENoYXIgKyAzOworICAgICAgZm9yICg7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSsrLCBuR2x5cGgrKykgeworICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gbkdseXBoOworICAgICAgfQorICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBpZiAoRlRfVXNlVFRDaGFybWFwKG1fRm9udC5tX0ZhY2UsIDMsIDApKSB7Ci0gICAgICAgIGNvbnN0IEZYX0JZVEUgcHJlZml4WzRdID0gezB4MDAsIDB4ZjAsIDB4ZjEsIDB4ZjJ9OwotICAgICAgICBGWF9CT09MIGJHb3RPbmUgPSBGQUxTRTsKLSAgICAgICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUgKyspIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgaiArKykgewotICAgICAgICAgICAgICAgIEZYX1dPUkQgdW5pY29kZSA9IHByZWZpeFtqXSAqIDI1NiArIGNoYXJjb2RlOwotICAgICAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIHVuaWNvZGUpOwotICAgICAgICAgICAgICAgIGlmIChtX0dseXBoSW5kZXhbY2hhcmNvZGVdKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJHb3RPbmUgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9CisgICAgRlhfQk9PTCBiTVNVbmljb2RlID0gRlRfVXNlVFRDaGFybWFwKG1fRm9udC5HZXRGYWNlKCksIDMsIDEpOworICAgIEZYX0JPT0wgYk1hY1JvbWFuID0gRkFMU0UsIGJNU1N5bWJvbCA9IEZBTFNFOworICAgIGlmICghYk1TVW5pY29kZSkgeworICAgICAgaWYgKG1fRmxhZ3MgJiBQREZGT05UX05PTlNZTUJPTElDKSB7CisgICAgICAgIGJNYWNSb21hbiA9IEZUX1VzZVRUQ2hhcm1hcChtX0ZvbnQuR2V0RmFjZSgpLCAxLCAwKTsKKyAgICAgICAgYk1TU3ltYm9sID0gIWJNYWNSb21hbiAmJiBGVF9Vc2VUVENoYXJtYXAobV9Gb250LkdldEZhY2UoKSwgMywgMCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBiTVNTeW1ib2wgPSBGVF9Vc2VUVENoYXJtYXAobV9Gb250LkdldEZhY2UoKSwgMywgMCk7CisgICAgICAgIGJNYWNSb21hbiA9ICFiTVNTeW1ib2wgJiYgRlRfVXNlVFRDaGFybWFwKG1fRm9udC5HZXRGYWNlKCksIDEsIDApOworICAgICAgfQorICAgIH0KKyAgICBGWF9CT09MIGJUb1VuaWNvZGUgPSBtX3BGb250RGljdC0+S2V5RXhpc3QoIlRvVW5pY29kZSIpOworICAgIGZvciAoaW50IGNoYXJjb2RlID0gMDsgY2hhcmNvZGUgPCAyNTY7IGNoYXJjb2RlKyspIHsKKyAgICAgIGNvbnN0IEZYX0NIQVIqIG5hbWUgPQorICAgICAgICAgIEdldEFkb2JlQ2hhck5hbWUoYmFzZUVuY29kaW5nLCBtX3BDaGFyTmFtZXMsIGNoYXJjb2RlKTsKKyAgICAgIGlmICghbmFtZSkgeworICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0KKyAgICAgICAgICAgIG1fcEZvbnRGaWxlID8gRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQuR2V0RmFjZSgpLCBjaGFyY29kZSkgOiAtMTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gUERGX1VuaWNvZGVGcm9tQWRvYmVOYW1lKG5hbWUpOworICAgICAgaWYgKGJNU1N5bWJvbCkgeworICAgICAgICBjb25zdCB1aW50OF90IHByZWZpeFs0XSA9IHsweDAwLCAweGYwLCAweGYxLCAweGYyfTsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgICAgICBGWF9XT1JEIHVuaWNvZGUgPSBwcmVmaXhbal0gKiAyNTYgKyBjaGFyY29kZTsKKyAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0KKyAgICAgICAgICAgICAgRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQuR2V0RmFjZSgpLCB1bmljb2RlKTsKKyAgICAgICAgICBpZiAobV9HbHlwaEluZGV4W2NoYXJjb2RlXSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0pIHsKKyAgICAgICAgaWYgKGJNU1VuaWNvZGUpIHsKKyAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfQ2hhcl9JbmRleCgKKyAgICAgICAgICAgICAgbV9Gb250LkdldEZhY2UoKSwgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSk7CisgICAgICAgIH0gZWxzZSBpZiAoYk1hY1JvbWFuKSB7CisgICAgICAgICAgRlhfRFdPUkQgbWFjY29kZSA9IEZUX0NoYXJDb2RlRnJvbVVuaWNvZGUoCisgICAgICAgICAgICAgIEZYRlRfRU5DT0RJTkdfQVBQTEVfUk9NQU4sIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0pOworICAgICAgICAgIGlmICghbWFjY29kZSkgeworICAgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9CisgICAgICAgICAgICAgICAgRlhGVF9HZXRfTmFtZV9JbmRleChtX0ZvbnQuR2V0RmFjZSgpLCAoY2hhciopbmFtZSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPQorICAgICAgICAgICAgICAgIEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250LkdldEZhY2UoKSwgbWFjY29kZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoKG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPT0gMCB8fCBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID09IDB4ZmZmZikgJiYKKyAgICAgICAgICBuYW1lKSB7CisgICAgICAgIGlmIChuYW1lWzBdID09ICcuJyAmJiBGWFNZU19zdHJjbXAobmFtZSwgIi5ub3RkZWYiKSA9PSAwKSB7CisgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250LkdldEZhY2UoKSwgMzIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPQorICAgICAgICAgICAgICBGWEZUX0dldF9OYW1lX0luZGV4KG1fRm9udC5HZXRGYWNlKCksIChjaGFyKiluYW1lKTsKKyAgICAgICAgICBpZiAobV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoYlRvVW5pY29kZSkgeworICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1VuaWNvZGUgPSBVbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKyAgICAgICAgICAgICAgaWYgKCF3c1VuaWNvZGUuSXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9CisgICAgICAgICAgICAgICAgICAgIEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250LkdldEZhY2UoKSwgd3NVbmljb2RlWzBdKTsKKyAgICAgICAgICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gd3NVbmljb2RlWzBdOworICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJHb3RPbmUpIHsKLSAgICAgICAgICAgIGlmIChiYXNlRW5jb2RpbmcgIT0gUERGRk9OVF9FTkNPRElOR19CVUlMVElOKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfTFBDU1RSIG5hbWUgPSBHZXRBZG9iZUNoYXJOYW1lKGJhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBjaGFyY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSBQREZfVW5pY29kZUZyb21BZG9iZU5hbWUobmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChGVF9Vc2VUVENoYXJtYXAobV9Gb250Lm1fRmFjZSwgMSwgMCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSArKykgewotICAgICAgICAgICAgICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gRlRfVW5pY29kZUZyb21DaGFyQ29kZShGWEZUX0VOQ09ESU5HX0FQUExFX1JPTUFOLCBjaGFyY29kZSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPT0gMCkgeworICAgICAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0KKyAgICAgICAgICAgICAgICAgIEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250LkdldEZhY2UoKSwgY2hhcmNvZGUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgfQogICAgIH0KLSAgICBpZiAoRlRfVXNlVFRDaGFybWFwKG1fRm9udC5tX0ZhY2UsIDEsIDApKSB7Ci0gICAgICAgIEZYX0JPT0wgYkdvdE9uZSA9IEZBTFNFOwotICAgICAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSArKykgewotICAgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250Lm1fRmFjZSwgY2hhcmNvZGUpOwotICAgICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IEZUX1VuaWNvZGVGcm9tQ2hhckNvZGUoRlhGVF9FTkNPRElOR19BUFBMRV9ST01BTiwgY2hhcmNvZGUpOwotICAgICAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0pIHsKLSAgICAgICAgICAgICAgICBiR290T25lID0gVFJVRTsKLSAgICAgICAgICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWYgKEZUX1VzZVRUQ2hhcm1hcChtX0ZvbnQuR2V0RmFjZSgpLCAzLCAwKSkgeworICAgIGNvbnN0IHVpbnQ4X3QgcHJlZml4WzRdID0gezB4MDAsIDB4ZjAsIDB4ZjEsIDB4ZjJ9OworICAgIEZYX0JPT0wgYkdvdE9uZSA9IEZBTFNFOworICAgIGZvciAoaW50IGNoYXJjb2RlID0gMDsgY2hhcmNvZGUgPCAyNTY7IGNoYXJjb2RlKyspIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgIEZYX1dPUkQgdW5pY29kZSA9IHByZWZpeFtqXSAqIDI1NiArIGNoYXJjb2RlOworICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQuR2V0RmFjZSgpLCB1bmljb2RlKTsKKyAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0pIHsKKyAgICAgICAgICBiR290T25lID0gVFJVRTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBpZiAobV9wRm9udEZpbGUgfHwgYkdvdE9uZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CisgICAgICB9CiAgICAgfQotICAgIGlmIChGWEZUX1NlbGVjdF9DaGFybWFwKG1fRm9udC5tX0ZhY2UsIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSkgPT0gMCkgewotICAgICAgICBGWF9CT09MIGJHb3RPbmUgPSBGQUxTRTsKLSAgICAgICAgY29uc3QgRlhfV09SRCogcFVuaWNvZGVzID0gUERGX1VuaWNvZGVzRm9yUHJlZGVmaW5lZENoYXJTZXQoYmFzZUVuY29kaW5nKTsKLSAgICAgICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUgKyspIHsKLSAgICAgICAgICAgIGlmIChtX3BGb250RmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgRlhfTFBDU1RSIG5hbWUgPSBHZXRBZG9iZUNoYXJOYW1lKDAsIG1fcENoYXJOYW1lcywgY2hhcmNvZGUpOwotICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IFBERl9Vbmljb2RlRnJvbUFkb2JlTmFtZShuYW1lKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBVbmljb2RlcykgewotICAgICAgICAgICAgICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gcFVuaWNvZGVzW2NoYXJjb2RlXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSBjaGFyY29kZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0pOwotICAgICAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0pIHsKLSAgICAgICAgICAgICAgICBiR290T25lID0gVFJVRTsKLSAgICAgICAgICAgIH0KKyAgICBpZiAoYkdvdE9uZSkgeworICAgICAgaWYgKGJhc2VFbmNvZGluZyAhPSBQREZGT05UX0VOQ09ESU5HX0JVSUxUSU4pIHsKKyAgICAgICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUrKykgeworICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIG5hbWUgPQorICAgICAgICAgICAgICBHZXRBZG9iZUNoYXJOYW1lKGJhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBjaGFyY29kZSk7CisgICAgICAgICAgaWYgKCFuYW1lKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IFBERl9Vbmljb2RlRnJvbUFkb2JlTmFtZShuYW1lKTsKICAgICAgICAgfQotICAgICAgICBpZiAoYkdvdE9uZSkgewotICAgICAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIGlmIChGVF9Vc2VUVENoYXJtYXAobV9Gb250LkdldEZhY2UoKSwgMSwgMCkpIHsKKyAgICAgICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUrKykgeworICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPQorICAgICAgICAgICAgICBGVF9Vbmljb2RlRnJvbUNoYXJDb2RlKEZYRlRfRU5DT0RJTkdfQVBQTEVfUk9NQU4sIGNoYXJjb2RlKTsKICAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSArKykgewotICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gY2hhcmNvZGU7CisgIH0KKyAgaWYgKEZUX1VzZVRUQ2hhcm1hcChtX0ZvbnQuR2V0RmFjZSgpLCAxLCAwKSkgeworICAgIEZYX0JPT0wgYkdvdE9uZSA9IEZBTFNFOworICAgIGZvciAoaW50IGNoYXJjb2RlID0gMDsgY2hhcmNvZGUgPCAyNTY7IGNoYXJjb2RlKyspIHsKKyAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5HZXRGYWNlKCksIGNoYXJjb2RlKTsKKyAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPQorICAgICAgICAgIEZUX1VuaWNvZGVGcm9tQ2hhckNvZGUoRlhGVF9FTkNPRElOR19BUFBMRV9ST01BTiwgY2hhcmNvZGUpOworICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0pIHsKKyAgICAgICAgYkdvdE9uZSA9IFRSVUU7CisgICAgICB9CiAgICAgfQorICAgIGlmIChtX3BGb250RmlsZSB8fCBiR290T25lKSB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIGlmIChGWEZUX1NlbGVjdF9DaGFybWFwKG1fRm9udC5HZXRGYWNlKCksIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSkgPT0gMCkgeworICAgIEZYX0JPT0wgYkdvdE9uZSA9IEZBTFNFOworICAgIGNvbnN0IEZYX1dPUkQqIHBVbmljb2RlcyA9IFBERl9Vbmljb2Rlc0ZvclByZWRlZmluZWRDaGFyU2V0KGJhc2VFbmNvZGluZyk7CisgICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUrKykgeworICAgICAgaWYgKG1fcEZvbnRGaWxlKSB7CisgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSBjaGFyY29kZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IEZYX0NIQVIqIG5hbWUgPSBHZXRBZG9iZUNoYXJOYW1lKDAsIG1fcENoYXJOYW1lcywgY2hhcmNvZGUpOworICAgICAgICBpZiAobmFtZSkgeworICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSBQREZfVW5pY29kZUZyb21BZG9iZU5hbWUobmFtZSk7CisgICAgICAgIH0gZWxzZSBpZiAocFVuaWNvZGVzKSB7CisgICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IHBVbmljb2Rlc1tjaGFyY29kZV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KAorICAgICAgICAgIG1fRm9udC5HZXRGYWNlKCksIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0pOworICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0pIHsKKyAgICAgICAgYkdvdE9uZSA9IFRSVUU7CisgICAgICB9CisgICAgfQorICAgIGlmIChiR290T25lKSB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIGZvciAoaW50IGNoYXJjb2RlID0gMDsgY2hhcmNvZGUgPCAyNTY7IGNoYXJjb2RlKyspIHsKKyAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gY2hhcmNvZGU7CisgIH0KIH0KLUNQREZfVHlwZTNGb250OjpDUERGX1R5cGUzRm9udCgpIDogQ1BERl9TaW1wbGVGb250KFBERkZPTlRfVFlQRTMpCi17Ci0gICAgbV9wUGFnZVJlc291cmNlcyA9IE5VTEw7Ci0gICAgRlhTWVNfbWVtc2V0MzIobV9DaGFyV2lkdGhMLCAwLCBzaXplb2YgbV9DaGFyV2lkdGhMKTsKKworQ1BERl9UeXBlM0ZvbnQ6OkNQREZfVHlwZTNGb250KCkKKyAgICA6IENQREZfU2ltcGxlRm9udChQREZGT05UX1RZUEUzKSwKKyAgICAgIG1fcENoYXJQcm9jcyhudWxscHRyKSwKKyAgICAgIG1fcFBhZ2VSZXNvdXJjZXMobnVsbHB0ciksCisgICAgICBtX3BGb250UmVzb3VyY2VzKG51bGxwdHIpIHsKKyAgRlhTWVNfbWVtc2V0KG1fQ2hhcldpZHRoTCwgMCwgc2l6ZW9mKG1fQ2hhcldpZHRoTCkpOwogfQotQ1BERl9UeXBlM0ZvbnQ6On5DUERGX1R5cGUzRm9udCgpCi17Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9DYWNoZU1hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBGWF9MUFZPSUQga2V5LCB2YWx1ZTsKLSAgICAgICAgbV9DYWNoZU1hcC5HZXROZXh0QXNzb2MocG9zLCBrZXksIHZhbHVlKTsKLSAgICAgICAgZGVsZXRlIChDUERGX1R5cGUzQ2hhciopdmFsdWU7Ci0gICAgfQotICAgIG1fQ2FjaGVNYXAuUmVtb3ZlQWxsKCk7Ci0gICAgcG9zID0gbV9EZWxldGVkTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIEZYX0xQVk9JRCBrZXksIHZhbHVlOwotICAgICAgICBtX0RlbGV0ZWRNYXAuR2V0TmV4dEFzc29jKHBvcywga2V5LCB2YWx1ZSk7Ci0gICAgICAgIGRlbGV0ZSAoQ1BERl9UeXBlM0NoYXIqKWtleTsKLSAgICB9CisKK0NQREZfVHlwZTNGb250Ojp+Q1BERl9UeXBlM0ZvbnQoKSB7CisgIGZvciAoYXV0byBpdCA6IG1fQ2FjaGVNYXApCisgICAgZGVsZXRlIGl0LnNlY29uZDsKIH0KLUZYX0JPT0wgQ1BERl9UeXBlM0ZvbnQ6Ol9Mb2FkKCkKLXsKLSAgICBtX3BGb250UmVzb3VyY2VzID0gbV9wRm9udERpY3QtPkdldERpY3QoRlhfQlNUUkMoIlJlc291cmNlcyIpKTsKLSAgICBDUERGX0FycmF5KiBwTWF0cml4ID0gbV9wRm9udERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJGb250TWF0cml4IikpOwotICAgIEZYX0ZMT0FUIHhzY2FsZSA9IDEuMGYsIHlzY2FsZSA9IDEuMGY7Ci0gICAgaWYgKHBNYXRyaXgpIHsKLSAgICAgICAgbV9Gb250TWF0cml4ID0gcE1hdHJpeC0+R2V0TWF0cml4KCk7Ci0gICAgICAgIHhzY2FsZSA9IG1fRm9udE1hdHJpeC5hOwotICAgICAgICB5c2NhbGUgPSBtX0ZvbnRNYXRyaXguZDsKKworRlhfQk9PTCBDUERGX1R5cGUzRm9udDo6X0xvYWQoKSB7CisgIG1fcEZvbnRSZXNvdXJjZXMgPSBtX3BGb250RGljdC0+R2V0RGljdCgiUmVzb3VyY2VzIik7CisgIENQREZfQXJyYXkqIHBNYXRyaXggPSBtX3BGb250RGljdC0+R2V0QXJyYXkoIkZvbnRNYXRyaXgiKTsKKyAgRlhfRkxPQVQgeHNjYWxlID0gMS4wZiwgeXNjYWxlID0gMS4wZjsKKyAgaWYgKHBNYXRyaXgpIHsKKyAgICBtX0ZvbnRNYXRyaXggPSBwTWF0cml4LT5HZXRNYXRyaXgoKTsKKyAgICB4c2NhbGUgPSBtX0ZvbnRNYXRyaXguYTsKKyAgICB5c2NhbGUgPSBtX0ZvbnRNYXRyaXguZDsKKyAgfQorICBDUERGX0FycmF5KiBwQkJveCA9IG1fcEZvbnREaWN0LT5HZXRBcnJheSgiRm9udEJCb3giKTsKKyAgaWYgKHBCQm94KSB7CisgICAgbV9Gb250QkJveC5sZWZ0ID0gKGludDMyX3QpKEZYU1lTX011bChwQkJveC0+R2V0TnVtYmVyKDApLCB4c2NhbGUpICogMTAwMCk7CisgICAgbV9Gb250QkJveC5ib3R0b20gPQorICAgICAgICAoaW50MzJfdCkoRlhTWVNfTXVsKHBCQm94LT5HZXROdW1iZXIoMSksIHlzY2FsZSkgKiAxMDAwKTsKKyAgICBtX0ZvbnRCQm94LnJpZ2h0ID0gKGludDMyX3QpKEZYU1lTX011bChwQkJveC0+R2V0TnVtYmVyKDIpLCB4c2NhbGUpICogMTAwMCk7CisgICAgbV9Gb250QkJveC50b3AgPSAoaW50MzJfdCkoRlhTWVNfTXVsKHBCQm94LT5HZXROdW1iZXIoMyksIHlzY2FsZSkgKiAxMDAwKTsKKyAgfQorICBpbnQgU3RhcnRDaGFyID0gbV9wRm9udERpY3QtPkdldEludGVnZXIoIkZpcnN0Q2hhciIpOworICBDUERGX0FycmF5KiBwV2lkdGhBcnJheSA9IG1fcEZvbnREaWN0LT5HZXRBcnJheSgiV2lkdGhzIik7CisgIGlmIChwV2lkdGhBcnJheSAmJiAoU3RhcnRDaGFyID49IDAgJiYgU3RhcnRDaGFyIDwgMjU2KSkgeworICAgIEZYX0RXT1JEIGNvdW50ID0gcFdpZHRoQXJyYXktPkdldENvdW50KCk7CisgICAgaWYgKGNvdW50ID4gMjU2KSB7CisgICAgICBjb3VudCA9IDI1NjsKICAgICB9Ci0gICAgQ1BERl9BcnJheSogcEJCb3ggPSBtX3BGb250RGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkZvbnRCQm94IikpOwotICAgIGlmIChwQkJveCkgewotICAgICAgICBtX0ZvbnRCQm94LmxlZnQgPSAoRlhfSU5UMzIpKEZYU1lTX011bChwQkJveC0+R2V0TnVtYmVyKDApLCB4c2NhbGUpICogMTAwMCk7Ci0gICAgICAgIG1fRm9udEJCb3guYm90dG9tID0gKEZYX0lOVDMyKShGWFNZU19NdWwocEJCb3gtPkdldE51bWJlcigxKSwgeXNjYWxlKSAqIDEwMDApOwotICAgICAgICBtX0ZvbnRCQm94LnJpZ2h0ID0gKEZYX0lOVDMyKShGWFNZU19NdWwocEJCb3gtPkdldE51bWJlcigyKSwgeHNjYWxlKSAqIDEwMDApOwotICAgICAgICBtX0ZvbnRCQm94LnRvcCA9IChGWF9JTlQzMikoRlhTWVNfTXVsKHBCQm94LT5HZXROdW1iZXIoMyksIHlzY2FsZSkgKiAxMDAwKTsKKyAgICBpZiAoU3RhcnRDaGFyICsgY291bnQgPiAyNTYpIHsKKyAgICAgIGNvdW50ID0gMjU2IC0gU3RhcnRDaGFyOwogICAgIH0KLSAgICBpbnQgU3RhcnRDaGFyID0gbV9wRm9udERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkZpcnN0Q2hhciIpKTsKLSAgICBDUERGX0FycmF5KiBwV2lkdGhBcnJheSA9IG1fcEZvbnREaWN0LT5HZXRBcnJheShGWF9CU1RSQygiV2lkdGhzIikpOwotICAgIGlmIChwV2lkdGhBcnJheSAmJiAoU3RhcnRDaGFyID49IDAgJiYgU3RhcnRDaGFyIDwgMjU2KSkgewotICAgICAgICBGWF9EV09SRCBjb3VudCA9IHBXaWR0aEFycmF5LT5HZXRDb3VudCgpOwotICAgICAgICBpZiAoY291bnQgPiAyNTYpIHsKLSAgICAgICAgICAgIGNvdW50ID0gMjU2OworICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICBtX0NoYXJXaWR0aExbU3RhcnRDaGFyICsgaV0gPQorICAgICAgICAgIEZYU1lTX3JvdW5kKEZYU1lTX011bChwV2lkdGhBcnJheS0+R2V0TnVtYmVyKGkpLCB4c2NhbGUpICogMTAwMCk7CisgICAgfQorICB9CisgIG1fcENoYXJQcm9jcyA9IG1fcEZvbnREaWN0LT5HZXREaWN0KCJDaGFyUHJvY3MiKTsKKyAgQ1BERl9PYmplY3QqIHBFbmNvZGluZyA9IG1fcEZvbnREaWN0LT5HZXRFbGVtZW50VmFsdWUoIkVuY29kaW5nIik7CisgIGlmIChwRW5jb2RpbmcpIHsKKyAgICBMb2FkUERGRW5jb2RpbmcocEVuY29kaW5nLCBtX0Jhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBGQUxTRSwgRkFMU0UpOworICAgIGlmIChtX3BDaGFyTmFtZXMpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2ldID0gUERGX1VuaWNvZGVGcm9tQWRvYmVOYW1lKG1fcENoYXJOYW1lc1tpXSk7CisgICAgICAgIGlmIChtX0VuY29kaW5nLm1fVW5pY29kZXNbaV0gPT0gMCkgeworICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tpXSA9IGk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKFN0YXJ0Q2hhciArIGNvdW50ID4gMjU2KSB7Ci0gICAgICAgICAgICBjb3VudCA9IDI1NiAtIFN0YXJ0Q2hhcjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgY291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIG1fQ2hhcldpZHRoTFtTdGFydENoYXIgKyBpXSA9IEZYU1lTX3JvdW5kKEZYU1lTX011bChwV2lkdGhBcnJheS0+R2V0TnVtYmVyKGkpLCB4c2NhbGUpICogMTAwMCk7Ci0gICAgICAgIH0KKyAgICAgIH0KICAgICB9Ci0gICAgbV9wQ2hhclByb2NzID0gbV9wRm9udERpY3QtPkdldERpY3QoRlhfQlNUUkMoIkNoYXJQcm9jcyIpKTsKLSAgICBDUERGX09iamVjdCogcEVuY29kaW5nID0gbV9wRm9udERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRW5jb2RpbmciKSk7Ci0gICAgaWYgKHBFbmNvZGluZykgewotICAgICAgICBMb2FkUERGRW5jb2RpbmcocEVuY29kaW5nLCBtX0Jhc2VFbmNvZGluZywgbV9wQ2hhck5hbWVzLCBGQUxTRSwgRkFMU0UpOwotICAgICAgICBpZiAobV9wQ2hhck5hbWVzKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSArKykgewotICAgICAgICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tpXSA9IFBERl9Vbmljb2RlRnJvbUFkb2JlTmFtZShtX3BDaGFyTmFtZXNbaV0pOwotICAgICAgICAgICAgICAgIGlmIChtX0VuY29kaW5nLm1fVW5pY29kZXNbaV0gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbaV0gPSBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLXZvaWQgQ1BERl9UeXBlM0ZvbnQ6OkNoZWNrVHlwZTNGb250TWV0cmljcygpCi17Ci0gICAgQ2hlY2tGb250TWV0cmljcygpOwordm9pZCBDUERGX1R5cGUzRm9udDo6Q2hlY2tUeXBlM0ZvbnRNZXRyaWNzKCkgeworICBDaGVja0ZvbnRNZXRyaWNzKCk7CiB9Ci1DUERGX1R5cGUzQ2hhciogQ1BERl9UeXBlM0ZvbnQ6OkxvYWRDaGFyKEZYX0RXT1JEIGNoYXJjb2RlLCBpbnQgbGV2ZWwpCi17Ci0gICAgaWYgKGxldmVsID49IF9GUERGX01BWF9UWVBFM19GT1JNX0xFVkVMXykgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9UeXBlM0NoYXIqIHBDaGFyID0gTlVMTDsKLSAgICBpZiAobV9DYWNoZU1hcC5Mb29rdXAoKEZYX0xQVk9JRCkoRlhfVUlOVFBUUiljaGFyY29kZSwgKEZYX0xQVk9JRCYpcENoYXIpKSB7Ci0gICAgICAgIGlmIChwQ2hhci0+bV9iUGFnZVJlcXVpcmVkICYmIG1fcFBhZ2VSZXNvdXJjZXMpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwQ2hhcjsKLSAgICAgICAgICAgIG1fQ2FjaGVNYXAuUmVtb3ZlS2V5KChGWF9MUFZPSUQpKEZYX1VJTlRQVFIpY2hhcmNvZGUpOwotICAgICAgICAgICAgcmV0dXJuIExvYWRDaGFyKGNoYXJjb2RlLCBsZXZlbCArIDEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwQ2hhcjsKLSAgICB9Ci0gICAgRlhfTFBDU1RSIG5hbWUgPSBHZXRBZG9iZUNoYXJOYW1lKG1fQmFzZUVuY29kaW5nLCBtX3BDaGFyTmFtZXMsIGNoYXJjb2RlKTsKLSAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IChDUERGX1N0cmVhbSopKG1fcENoYXJQcm9jcyA/IG1fcENoYXJQcm9jcy0+R2V0RWxlbWVudFZhbHVlKG5hbWUpIDogTlVMTCk7Ci0gICAgaWYgKHBTdHJlYW0gPT0gTlVMTCB8fCBwU3RyZWFtLT5HZXRUeXBlKCkgIT0gUERGT0JKX1NUUkVBTSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcENoYXIgPSBuZXcgQ1BERl9UeXBlM0NoYXI7Ci0gICAgcENoYXItPm1fcEZvcm0gPSBuZXcgQ1BERl9Gb3JtKG1fcERvY3VtZW50LCBtX3BGb250UmVzb3VyY2VzID8gbV9wRm9udFJlc291cmNlcyA6IG1fcFBhZ2VSZXNvdXJjZXMsIHBTdHJlYW0sIE5VTEwpOwotICAgIHBDaGFyLT5tX3BGb3JtLT5QYXJzZUNvbnRlbnQoTlVMTCwgTlVMTCwgcENoYXIsIE5VTEwsIGxldmVsICsgMSk7Ci0gICAgRlhfRkxPQVQgc2NhbGUgPSBtX0ZvbnRNYXRyaXguR2V0WFVuaXQoKTsKLSAgICBwQ2hhci0+bV9XaWR0aCA9IChGWF9JTlQzMikocENoYXItPm1fV2lkdGggKiBzY2FsZSArIDAuNWYpOwotICAgIEZYX1JFQ1QgJnJjQkJveCA9IHBDaGFyLT5tX0JCb3g7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCBjaGFyX3JlY3QoKEZYX0ZMT0FUKXJjQkJveC5sZWZ0IC8gMTAwMC4wZiwgKEZYX0ZMT0FUKXJjQkJveC5ib3R0b20gLyAxMDAwLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClyY0JCb3gucmlnaHQgLyAxMDAwLjBmLCAoRlhfRkxPQVQpcmNCQm94LnRvcCAvIDEwMDAuMGYpOwotICAgIGlmIChyY0JCb3gucmlnaHQgPD0gcmNCQm94LmxlZnQgfHwgcmNCQm94LmJvdHRvbSA+PSByY0JCb3gudG9wKSB7Ci0gICAgICAgIGNoYXJfcmVjdCA9IHBDaGFyLT5tX3BGb3JtLT5DYWxjQm91bmRpbmdCb3goKTsKLSAgICB9Ci0gICAgY2hhcl9yZWN0LlRyYW5zZm9ybSgmbV9Gb250TWF0cml4KTsKLSAgICByY0JCb3gubGVmdCA9IEZYU1lTX3JvdW5kKGNoYXJfcmVjdC5sZWZ0ICogMTAwMCk7Ci0gICAgcmNCQm94LnJpZ2h0ID0gRlhTWVNfcm91bmQoY2hhcl9yZWN0LnJpZ2h0ICogMTAwMCk7Ci0gICAgcmNCQm94LnRvcCA9IEZYU1lTX3JvdW5kKGNoYXJfcmVjdC50b3AgKiAxMDAwKTsKLSAgICByY0JCb3guYm90dG9tID0gRlhTWVNfcm91bmQoY2hhcl9yZWN0LmJvdHRvbSAqIDEwMDApOwotICAgIG1fQ2FjaGVNYXAuU2V0QXQoKEZYX0xQVk9JRCkoRlhfVUlOVFBUUiljaGFyY29kZSwgcENoYXIpOwotICAgIGlmIChwQ2hhci0+bV9wRm9ybS0+Q291bnRPYmplY3RzKCkgPT0gMCkgewotICAgICAgICBkZWxldGUgcENoYXItPm1fcEZvcm07Ci0gICAgICAgIHBDaGFyLT5tX3BGb3JtID0gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIHBDaGFyOworCitDUERGX1R5cGUzQ2hhciogQ1BERl9UeXBlM0ZvbnQ6OkxvYWRDaGFyKEZYX0RXT1JEIGNoYXJjb2RlLCBpbnQgbGV2ZWwpIHsKKyAgaWYgKGxldmVsID49IF9GUERGX01BWF9UWVBFM19GT1JNX0xFVkVMXykKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBhdXRvIGl0ID0gbV9DYWNoZU1hcC5maW5kKGNoYXJjb2RlKTsKKyAgaWYgKGl0ICE9IG1fQ2FjaGVNYXAuZW5kKCkpCisgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisKKyAgY29uc3QgRlhfQ0hBUiogbmFtZSA9CisgICAgICBHZXRBZG9iZUNoYXJOYW1lKG1fQmFzZUVuY29kaW5nLCBtX3BDaGFyTmFtZXMsIGNoYXJjb2RlKTsKKyAgaWYgKCFuYW1lKQorICAgIHJldHVybiBudWxscHRyOworCisgIENQREZfU3RyZWFtKiBwU3RyZWFtID0KKyAgICAgIFRvU3RyZWFtKG1fcENoYXJQcm9jcyA/IG1fcENoYXJQcm9jcy0+R2V0RWxlbWVudFZhbHVlKG5hbWUpIDogbnVsbHB0cik7CisgIGlmICghcFN0cmVhbSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9UeXBlM0NoYXI+IHBOZXdDaGFyKG5ldyBDUERGX1R5cGUzQ2hhcihuZXcgQ1BERl9Gb3JtKAorICAgICAgbV9wRG9jdW1lbnQsIG1fcEZvbnRSZXNvdXJjZXMgPyBtX3BGb250UmVzb3VyY2VzIDogbV9wUGFnZVJlc291cmNlcywKKyAgICAgIHBTdHJlYW0sIG51bGxwdHIpKSk7CisKKyAgLy8gVGhpcyBjYW4gdHJpZ2dlciByZWN1cnNpb24gaW50byB0aGlzIG1ldGhvZC4gVGhlIGNvbnRlbnQgb2YgfG1fQ2FjaGVNYXB8CisgIC8vIGNhbiBjaGFuZ2UgYXMgYSByZXN1bHQuIFRodXMgYWZ0ZXIgaXQgcmV0dXJucywgY2hlY2sgdGhlIGNhY2hlIGFnYWluIGZvcgorICAvLyBhIGNhY2hlIGhpdC4KKyAgcE5ld0NoYXItPm1fcEZvcm0tPlBhcnNlQ29udGVudChudWxscHRyLCBudWxscHRyLCBwTmV3Q2hhci5nZXQoKSwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCArIDEpOworICBpdCA9IG1fQ2FjaGVNYXAuZmluZChjaGFyY29kZSk7CisgIGlmIChpdCAhPSBtX0NhY2hlTWFwLmVuZCgpKQorICAgIHJldHVybiBpdC0+c2Vjb25kOworCisgIEZYX0ZMT0FUIHNjYWxlID0gbV9Gb250TWF0cml4LkdldFhVbml0KCk7CisgIHBOZXdDaGFyLT5tX1dpZHRoID0gKGludDMyX3QpKHBOZXdDaGFyLT5tX1dpZHRoICogc2NhbGUgKyAwLjVmKTsKKyAgRlhfUkVDVCYgcmNCQm94ID0gcE5ld0NoYXItPm1fQkJveDsKKyAgQ0ZYX0Zsb2F0UmVjdCBjaGFyX3JlY3QoCisgICAgICAoRlhfRkxPQVQpcmNCQm94LmxlZnQgLyAxMDAwLjBmLCAoRlhfRkxPQVQpcmNCQm94LmJvdHRvbSAvIDEwMDAuMGYsCisgICAgICAoRlhfRkxPQVQpcmNCQm94LnJpZ2h0IC8gMTAwMC4wZiwgKEZYX0ZMT0FUKXJjQkJveC50b3AgLyAxMDAwLjBmKTsKKyAgaWYgKHJjQkJveC5yaWdodCA8PSByY0JCb3gubGVmdCB8fCByY0JCb3guYm90dG9tID49IHJjQkJveC50b3ApCisgICAgY2hhcl9yZWN0ID0gcE5ld0NoYXItPm1fcEZvcm0tPkNhbGNCb3VuZGluZ0JveCgpOworCisgIGNoYXJfcmVjdC5UcmFuc2Zvcm0oJm1fRm9udE1hdHJpeCk7CisgIHJjQkJveC5sZWZ0ID0gRlhTWVNfcm91bmQoY2hhcl9yZWN0LmxlZnQgKiAxMDAwKTsKKyAgcmNCQm94LnJpZ2h0ID0gRlhTWVNfcm91bmQoY2hhcl9yZWN0LnJpZ2h0ICogMTAwMCk7CisgIHJjQkJveC50b3AgPSBGWFNZU19yb3VuZChjaGFyX3JlY3QudG9wICogMTAwMCk7CisgIHJjQkJveC5ib3R0b20gPSBGWFNZU19yb3VuZChjaGFyX3JlY3QuYm90dG9tICogMTAwMCk7CisKKyAgQVNTRVJUKCFwZGZpdW06OkNvbnRhaW5zS2V5KG1fQ2FjaGVNYXAsIGNoYXJjb2RlKSk7CisgIENQREZfVHlwZTNDaGFyKiBwQ2FjaGVkQ2hhciA9IHBOZXdDaGFyLnJlbGVhc2UoKTsKKyAgbV9DYWNoZU1hcFtjaGFyY29kZV0gPSBwQ2FjaGVkQ2hhcjsKKyAgaWYgKHBDYWNoZWRDaGFyLT5tX3BGb3JtLT5Db3VudE9iamVjdHMoKSA9PSAwKSB7CisgICAgZGVsZXRlIHBDYWNoZWRDaGFyLT5tX3BGb3JtOworICAgIHBDYWNoZWRDaGFyLT5tX3BGb3JtID0gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gcENhY2hlZENoYXI7CiB9Ci1pbnQgQ1BERl9UeXBlM0ZvbnQ6OkdldENoYXJXaWR0aEYoRlhfRFdPUkQgY2hhcmNvZGUsIGludCBsZXZlbCkKLXsKLSAgICBpZiAoY2hhcmNvZGUgPiAweGZmKSB7Ci0gICAgICAgIGNoYXJjb2RlID0gMDsKLSAgICB9Ci0gICAgaWYgKG1fQ2hhcldpZHRoTFtjaGFyY29kZV0pIHsKLSAgICAgICAgcmV0dXJuIG1fQ2hhcldpZHRoTFtjaGFyY29kZV07Ci0gICAgfQotICAgIENQREZfVHlwZTNDaGFyKiBwQ2hhciA9IExvYWRDaGFyKGNoYXJjb2RlLCBsZXZlbCk7Ci0gICAgaWYgKHBDaGFyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBwQ2hhci0+bV9XaWR0aDsKKworaW50IENQREZfVHlwZTNGb250OjpHZXRDaGFyV2lkdGhGKEZYX0RXT1JEIGNoYXJjb2RlLCBpbnQgbGV2ZWwpIHsKKyAgaWYgKGNoYXJjb2RlID49IEZYX0FycmF5U2l6ZShtX0NoYXJXaWR0aEwpKQorICAgIGNoYXJjb2RlID0gMDsKKworICBpZiAobV9DaGFyV2lkdGhMW2NoYXJjb2RlXSkKKyAgICByZXR1cm4gbV9DaGFyV2lkdGhMW2NoYXJjb2RlXTsKKworICBjb25zdCBDUERGX1R5cGUzQ2hhciogcENoYXIgPSBMb2FkQ2hhcihjaGFyY29kZSwgbGV2ZWwpOworICByZXR1cm4gcENoYXIgPyBwQ2hhci0+bV9XaWR0aCA6IDA7CiB9Ci12b2lkIENQREZfVHlwZTNGb250OjpHZXRDaGFyQkJveChGWF9EV09SRCBjaGFyY29kZSwgRlhfUkVDVCYgcmVjdCwgaW50IGxldmVsKQotewotICAgIENQREZfVHlwZTNDaGFyKiBwQ2hhciA9IExvYWRDaGFyKGNoYXJjb2RlLCBsZXZlbCk7Ci0gICAgaWYgKHBDaGFyID09IE5VTEwpIHsKLSAgICAgICAgcmVjdC5sZWZ0ID0gcmVjdC5yaWdodCA9IHJlY3QudG9wID0gcmVjdC5ib3R0b20gPSAwOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHJlY3QgPSBwQ2hhci0+bV9CQm94OworCit2b2lkIENQREZfVHlwZTNGb250OjpHZXRDaGFyQkJveChGWF9EV09SRCBjaGFyY29kZSwgRlhfUkVDVCYgcmVjdCwgaW50IGxldmVsKSB7CisgIGNvbnN0IENQREZfVHlwZTNDaGFyKiBwQ2hhciA9IExvYWRDaGFyKGNoYXJjb2RlLCBsZXZlbCk7CisgIGlmICghcENoYXIpIHsKKyAgICByZWN0LmxlZnQgPSAwOworICAgIHJlY3QucmlnaHQgPSAwOworICAgIHJlY3QudG9wID0gMDsKKyAgICByZWN0LmJvdHRvbSA9IDA7CisgICAgcmV0dXJuOworICB9CisgIHJlY3QgPSBwQ2hhci0+bV9CQm94OwogfQotQ1BERl9UeXBlM0NoYXI6OkNQREZfVHlwZTNDaGFyKCkKLXsKLSAgICBtX3BGb3JtID0gTlVMTDsKLSAgICBtX3BCaXRtYXAgPSBOVUxMOwotICAgIG1fYlBhZ2VSZXF1aXJlZCA9IEZBTFNFOwotICAgIG1fYkNvbG9yZWQgPSBGQUxTRTsKLX0KLUNQREZfVHlwZTNDaGFyOjp+Q1BERl9UeXBlM0NoYXIoKQotewotICAgIGlmIChtX3BGb3JtKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BGb3JtOwotICAgIH0KLSAgICBpZiAobV9wQml0bWFwKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BCaXRtYXA7Ci0gICAgfQorCitDUERGX1R5cGUzQ2hhcjo6Q1BERl9UeXBlM0NoYXIoQ1BERl9Gb3JtKiBwRm9ybSkKKyAgICA6IG1fcEZvcm0ocEZvcm0pLCBtX3BCaXRtYXAobnVsbHB0ciksIG1fYkNvbG9yZWQoRkFMU0UpIHt9CisKK0NQREZfVHlwZTNDaGFyOjp+Q1BERl9UeXBlM0NoYXIoKSB7CisgIGRlbGV0ZSBtX3BGb3JtOworICBkZWxldGUgbV9wQml0bWFwOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZnBkZl9mb250X2NoYXJzZXQuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZnBkZl9mb250X2NoYXJzZXQuY3BwCmluZGV4IGM3MTEwZDMuLmY2ZDFlMmEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZwZGZfZm9udF9jaGFyc2V0LmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnRfY2hhcnNldC5jcHAKQEAgLTEsNjI2ICsxLDE3ODIgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2UuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKLWV4dGVybiBGWF9XQ0hBUiBQREZfVW5pY29kZUZyb21BZG9iZU5hbWUoY29uc3QgRlhfQ0hBUiopOwotY29uc3Qgc3RydWN0IF9Vbmljb2RlQWx0IHsKLSAgICBGWF9XT1JECW1fVW5pY29kZTsKLSAgICBjb25zdCBGWF9DSEFSKiBtX0FsdGVyOwotfQotVW5pY29kZUFsdHNbXSA9IHsKLSAgICB7MHgwMGEwLCAiICJ9LCB7MHgwMGExLCAiISJ9LCB7MHgwMGEyLCAiYyJ9LCB7MHgwMGEzLCAiUCJ9LCB7MHgwMGE0LCAibyJ9LAotICAgIHsweDAwYTUsICJZIn0sIHsweDAwYTYsICJ8In0sIHsweDAwYTcsICJTIn0sIHsweDAwYTksICIoQykifSwgezB4MDBhYSwgImEifSwKLSAgICB7MHgwMGFiLCAiPDwifSwgezB4MDBhYywgIi18In0sIHsweDAwYWUsICIoUikifSwgezB4MDBhZiwgIi0ifSwKLSAgICB7MHgwMGIwLCAibyJ9LCB7MHgwMGIxLCAiKy8tIn0sIHsweDAwYjIsICJeMiJ9LCB7IDB4MDBiMywgIl4zIn0sCi0gICAgezB4MDBiNCwgIicifSwgezB4MDBiNSwgInUifSwgezB4MDBiNiwgIlAifSwgezB4MDBiNywgIi4ifSwKLSAgICB7MHgwMGI5LCAiXjEifSwgezB4MDBiYSwgIm8ifSwgezB4MDBiYiwgIj4+In0sIHsweDAwYmMsICIxLzQifSwKLSAgICB7MHgwMGJkLCAiMS8yIn0sIHsweDAwYmUsICIzLzQifSwgIHsweDAwYmYsICI/In0sIHsweDAwYzAsICJBIn0sCi0gICAgezB4MDBjMSwgIkEifSwgezB4MDBjMiwgIkEifSwgezB4MDBjMywgIkEifSwgezB4MDBjNCwgIkEifSwKLSAgICB7MHgwMGM1LCAiQSJ9LCB7MHgwMGM2LCAiQUUifSwgezB4MDBjNywgIkMifSwgezB4MDBjOCwgIkUifSwKLSAgICB7MHgwMGM5LCAiRSJ9LCB7MHgwMGNhLCAiRSJ9LCB7MHgwMGNiLCAiRSJ9LCB7MHgwMGNjLCAiSSJ9LAotICAgIHsweDAwY2QsICJJIn0sIHsweDAwY2UsICJJIn0sIHsweDAwY2YsICJJIn0sCi0gICAgezB4MDBkMSwgIk4ifSwgezB4MDBkMiwgIk8ifSwgezB4MDBkMywgIk8ifSwgezB4MDBkNCwgIk8ifSwKLSAgICB7MHgwMGQ1LCAiTyJ9LCB7MHgwMGQ2LCAiTyJ9LCB7MHgwMGQ3LCAieCJ9LCB7MHgwMGQ4LCAiTyJ9LAotICAgIHsweDAwZDksICJVIn0sIHsweDAwZGEsICJVIn0sIHsweDAwZGIsICJVIn0sIHsweDAwZGMsICJVIn0sCi0gICAgezB4MDBkZCwgIlkifSwgezB4MDBkZiwgIlMifSwgezB4MDBlMCwgImEifSwKLSAgICB7MHgwMGUxLCAiYSJ9LCB7MHgwMGUyLCAiYSJ9LCB7MHgwMGUzLCAiYSJ9LCB7MHgwMGU0LCAiYSJ9LAotICAgIHsweDAwZTUsICJhIn0sIHsweDAwZTYsICJhZSJ9LCB7MHgwMGU3LCAiYyJ9LCB7MHgwMGU4LCAiZSJ9LAotICAgIHsweDAwZTksICJlIn0sIHsweDAwZWEsICJlIn0sIHsweDAwZWIsICJlIn0sIHsweDAwZWMsICJpIn0sCi0gICAgezB4MDBlZCwgImkifSwgezB4MDBlZSwgImkifSwgezB4MDBlZiwgImkifSwKLSAgICB7MHgwMGYxLCAibiJ9LCB7MHgwMGYyLCAibyJ9LCB7MHgwMGYzLCAibyJ9LCB7MHgwMGY0LCAibyJ9LAotICAgIHsweDAwZjUsICJvIn0sIHsweDAwZjYsICJvIn0sIHsweDAwZjcsICIvIn0sIHsweDAwZjgsICJvIn0sCi0gICAgezB4MDBmOSwgInUifSwgezB4MDBmYSwgInUifSwgezB4MDBmYiwgInUifSwgezB4MDBmYywgInUifSwKLSAgICB7MHgwMGZkLCAieSJ9LCB7MHgwMGZmLCAieSJ9LAotICAgIHsweDAyYjAsICJoIn0sIHsweDAyYjIsICJqIn0sIHsweDAyYjMsICJyIn0sIHsweDAyYjcsICJ3In0sCi0gICAgezB4MDJiOCwgInkifSwgezB4MDJiOSwgIicifSwgezB4MDJiYSwgIlwiIn0sIHsweDAyYmIsICInIn0sCi0gICAgezB4MDJiYywgIicifSwgezB4MDJiZCwgIicifSwgezB4MDJiZSwgIicifSwgezB4MDJiZiwgIicifSwKLSAgICB7MHgwMmMyLCAiPCJ9LCB7MHgwMmMzLCAiPiJ9LCB7MHgwMmM0LCAiXiJ9LCB7MHgwMmM1LCAidiJ9LAotICAgIHsweDAyYzYsICJeIn0sIHsweDAyYzcsICJ2In0sIHsweDAyYzgsICInIn0sIHsweDAyYzksICItIn0sCi0gICAgezB4MDJjYSwgIicifSwgezB4MDJjYiwgIicifSwgezB4MDJjYywgIi4ifSwgezB4MDJjZCwgIl8ifSwKLSAgICB7MHgyMDEwLCAiLSJ9LCB7MHgyMDEyLCAiLSJ9LCB7MHgyMDEzLCAiLSJ9LCB7MHgyMDE0LCAiLS0ifSwKLSAgICB7MHgyMDE1LCAiLS0ifSwgezB4MjAxNiwgInwifSwgezB4MjAxNywgIl8ifSwKLSAgICB7MHgyMDE4LCAiJyJ9LCB7MHgyMDE5LCAiJyJ9LCB7MHgyMDFhLCAiLCJ9LCB7MHgyMDFiLCAiJyJ9LAotICAgIHsweDIwMWMsICJcIiJ9LCB7MHgyMDFkLCAiXCIifSwgezB4MjAxZSwgIiwifSwgezB4MjAxZiwgIicifSwKLSAgICB7MHgyMDIwLCAiKyJ9LCB7MHgyMDIxLCAiKyJ9LCB7MHgyMDIyLCAiKiJ9LCB7MHgyMDIzLCAiPiJ9LAotICAgIHsweDIwMjQsICIuIn0sIHsweDIwMjUsICIuLiJ9LCB7MHgyMDI3LCAiLiJ9LCB7MHgyMDMyLCAiJyJ9LAotICAgIHsweDIwMzMsICJcIiJ9LCB7MHgyMDM1LCAiJyJ9LCB7MHgyMDM2LCAiXCIifSwgezB4MjAzOCwgIl4ifSwKLSAgICB7MHgyMDM5LCAiPCJ9LCB7MHgyMDNhLCAiPiJ9LCB7MHgyMDNiLCAiKiJ9LCB7MHgyMDNjLCAiISEifSwKLSAgICB7MHgyMDNkLCAiPyEifSwgezB4MjAzZSwgIi0ifSwgezB4MjA0NCwgIi8ifSwgezB4MjA0NywgIj8/In0sCi0gICAgezB4MjA0OCwgIj8hIn0sIHsweDIwNDksICIhPyJ9LCB7MHgyMDRlLCAiKiJ9LCB7MHgyMDUyLCAiJSJ9LAotICAgIHsweDIxMjIsICIoVE0pIn0sCi0gICAgezB4MjIxMiwgIi0ifSwgezB4MjIxNSwgIi8ifSwgezB4MjIxNiwgIlxcIn0sIHsweDIyMTcsICIqIn0sCi0gICAgezB4MjIxOCwgIioifSwgezB4MjIxOSwgIioifSwgezB4MjIyMywgInwifSwgezB4MjJjNSwgIi4ifSwKLSAgICB7MHgyNjZmLCAiIyJ9LAotICAgIHswWEY2RDksICIoQykifSwgezBYRjZEQSwgIihDKSJ9LCB7MFhGNkRCLCAiKFRNKSJ9LAotICAgIHswWEY4RTgsICIoQykifSwgezB4ZjhlOSwgIihDKSJ9LCB7MFhGOEVBLCAiKFRNKSJ9LAorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFyc2VyLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZXNvdXJjZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2ZyZWV0eXBlLmgiCiAKLSAgICB7MHhmYjAxLCAiZmkifSwgezB4ZmIwMiwgImZsIn0KLX07Ci1jb25zdCBGWF9DSEFSKiBGQ1NfR2V0QWx0U3RyKEZYX1dDSEFSIHVuaWNvZGUpCi17Ci0gICAgaW50IGJlZ2luID0gMDsKLSAgICBpbnQgZW5kID0gc2l6ZW9mIFVuaWNvZGVBbHRzIC8gc2l6ZW9mKHN0cnVjdCBfVW5pY29kZUFsdCkgLSAxOwotICAgIHdoaWxlIChiZWdpbiA8PSBlbmQpIHsKLSAgICAgICAgaW50IG1pZGRsZSA9IChiZWdpbiArIGVuZCkgLyAyOwotICAgICAgICBGWF9XT1JEIG1pZGRsZWNvZGUgPSBVbmljb2RlQWx0c1ttaWRkbGVdLm1fVW5pY29kZTsKLSAgICAgICAgaWYgKG1pZGRsZWNvZGUgPiB1bmljb2RlKSB7Ci0gICAgICAgICAgICBlbmQgPSBtaWRkbGUgLSAxOwotICAgICAgICB9IGVsc2UgaWYgKG1pZGRsZWNvZGUgPCB1bmljb2RlKSB7Ci0gICAgICAgICAgICBiZWdpbiA9IG1pZGRsZSArIDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gVW5pY29kZUFsdHNbbWlkZGxlXS5tX0FsdGVyOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotY29uc3QgRlhfV09SRCBTdGFuZGFyZEVuY29kaW5nWzI1Nl0gPSB7Ci0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgyMDE5LAotICAgIDB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwgMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLCAweDAwMzAsIDB4MDAzMSwKLSAgICAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsCi0gICAgMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwgMHgwMDNmLCAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LAotICAgIDB4MDA0NiwgMHgwMDQ3LCAweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsIDB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKLSAgICAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksCi0gICAgMHgwMDVhLCAweDAwNWIsIDB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwgMHgyMDE4LCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLAotICAgIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLCAweDAwNmMsIDB4MDA2ZCwKLSAgICAweDAwNmUsIDB4MDA2ZiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCi0gICAgMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLCAweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMGExLCAweDAwYTIsIDB4MDBhMywgMHgyMDQ0LCAweDAwYTUsIDB4MDE5MiwgMHgwMGE3LCAweDAwYTQsIDB4MDAyNywKLSAgICAweDIwMWMsIDB4MDBhYiwgMHgyMDM5LCAweDIwM2EsIDB4ZmIwMSwgMHhmYjAyLCAweDAwMDAsIDB4MjAxMywgMHgyMDIwLCAweDIwMjEsCi0gICAgMHgwMGI3LCAweDAwMDAsIDB4MDBiNiwgMHgyMDIyLCAweDIwMWEsIDB4MjAxZSwgMHgyMDFkLCAweDAwYmIsIDB4MjAyNiwgMHgyMDMwLAotICAgIDB4MDAwMCwgMHgwMGJmLCAweDAwMDAsIDB4MDA2MCwgMHgwMGI0LCAweDAyYzYsIDB4MDJkYywgMHgwMGFmLCAweDAyZDgsIDB4MDJkOSwKLSAgICAweDAwYTgsIDB4MDAwMCwgMHgwMmRhLCAweDAwYjgsIDB4MDAwMCwgMHgwMmRkLCAweDAyZGIsIDB4MDJjNywgMHgyMDE0LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwYzYsIDB4MDAwMCwgMHgwMGFhLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMTQxLCAweDAwZDgsIDB4MDE1MiwgMHgwMGJhLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwZTYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDEzMSwgMHgwMDAwLCAweDAwMDAsIDB4MDE0MiwgMHgwMGY4LAotICAgIDB4MDE1MywgMHgwMGRmLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAKLX07Ci1jb25zdCBGWF9XT1JEIE1hY1JvbWFuRW5jb2RpbmdbMjU2XSA9IHsKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCi0gICAgMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLCAweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsIDB4MDAzMCwgMHgwMDMxLAotICAgIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKLSAgICAweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsCi0gICAgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwgMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAotICAgIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwKLSAgICAweDAwNWEsIDB4MDA1YiwgMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLCAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCi0gICAgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsIDB4MDA2YywgMHgwMDZkLAotICAgIDB4MDA2ZSwgMHgwMDZmLCAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKLSAgICAweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsIDB4MDA3YywgMHgwMDdkLCAweDAwN2UsIDB4MDAwMCwgMHgwMGM0LCAweDAwYzUsCi0gICAgMHgwMGM3LCAweDAwYzksIDB4MDBkMSwgMHgwMGQ2LCAweDAwZGMsIDB4MDBlMSwgMHgwMGUwLCAweDAwZTIsIDB4MDBlNCwgMHgwMGUzLAotICAgIDB4MDBlNSwgMHgwMGU3LCAweDAwZTksIDB4MDBlOCwgMHgwMGVhLCAweDAwZWIsIDB4MDBlZCwgMHgwMGVjLCAweDAwZWUsIDB4MDBlZiwKLSAgICAweDAwZjEsIDB4MDBmMywgMHgwMGYyLCAweDAwZjQsIDB4MDBmNiwgMHgwMGY1LCAweDAwZmEsIDB4MDBmOSwgMHgwMGZiLCAweDAwZmMsCi0gICAgMHgyMDIwLCAweDAwYjAsIDB4MDBhMiwgMHgwMGEzLCAweDAwYTcsIDB4MjAyMiwgMHgwMGI2LCAweDAwZGYsIDB4MDBhZSwgMHgwMGE5LAotICAgIDB4MjEyMiwgMHgwMGI0LCAweDAwYTgsIDB4MDAwMCwgMHgwMGM2LCAweDAwZDgsIDB4MDAwMCwgMHgwMGIxLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwYTUsIDB4MDBiNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDBhYSwgMHgwMGJhLCAweDAwMDAsCi0gICAgMHgwMGU2LCAweDAwZjgsIDB4MDBiZiwgMHgwMGEzLCAweDAwYWMsIDB4MDAwMCwgMHgwMTkyLCAweDAwMDAsIDB4MDAwMCwgMHgwMGFiLAotICAgIDB4MDBiYiwgMHgyMDI2LCAweDAwMjAsIDB4MDBjMCwgMHgwMGMzLCAweDAwZDUsIDB4MDE1MiwgMHgwMTUzLCAweDIwMTMsIDB4MjAxNCwKLSAgICAweDIwMWMsIDB4MjAxZCwgMHgyMDE4LCAweDIwMTksIDB4MDBmNywgMHgwMDAwLCAweDAwZmYsIDB4MDE3OCwgMHgyMDQ0LCAweDAwYTQsCi0gICAgMHgyMDM5LCAweDIwM2EsIDB4ZmIwMSwgMHhmYjAyLCAweDIwMjEsIDB4MDBiNywgMHgyMDFhLCAweDIwMWUsIDB4MjAzMCwgMHgwMGMyLAotICAgIDB4MDBjYSwgMHgwMGMxLCAweDAwY2IsIDB4MDBjOCwgMHgwMGNkLCAweDAwY2UsIDB4MDBjZiwgMHgwMGNjLCAweDAwZDMsIDB4MDBkNCwKLSAgICAweDAwMDAsIDB4MDBkMiwgMHgwMGRhLCAweDAwZGIsIDB4MDBkOSwgMHgwMTMxLCAweDAyYzYsIDB4MDJkYywgMHgwMGFmLCAweDAyZDgsCi0gICAgMHgwMmQ5LCAweDAyZGEsIDB4MDBiOCwgMHgwMmRkLCAweDAyZGIsIDB4MDJjNwotfTsKLWNvbnN0IEZYX1dPUkQgQWRvYmVXaW5BbnNpRW5jb2RpbmdbMjU2XSA9IHsKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKLSAgICAweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsIDB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKLSAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKLSAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsIDB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKLSAgICAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKLSAgICAweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsIDB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKLSAgICAweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKLSAgICAweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsIDB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKLSAgICAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKLSAgICAweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsIDB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKLSAgICAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKLSAgICAweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsIDB4MDA3YywgMHgwMDdkLCAweDAwN2UsIDB4MjAyMiwKLSAgICAweDIwYWMsIDB4MjAyMiwgMHgyMDFhLCAweDAxOTIsIDB4MjAxZSwgMHgyMDI2LCAweDIwMjAsIDB4MjAyMSwKLSAgICAweDAyYzYsIDB4MjAzMCwgMHgwMTYwLCAweDIwMzksCTB4MDE1MiwgMHgyMDIyLCAweDAxN2QsIDB4MjAyMiwKLSAgICAweDIwMjIsIDB4MjAxOCwgMHgyMDE5LCAweDIwMWMsIDB4MjAxZCwgMHgyMDIyLCAweDIwMTMsIDB4MjAxNCwKLSAgICAweDAyZGMsIDB4MjEyMiwgMHgwMTYxLCAweDIwM2EsIDB4MDE1MywgMHgyMDIyLCAweDAxN2UsIDB4MDE3OCwKLSAgICAweDAwMjAsIDB4MDBhMSwgMHgwMGEyLCAweDAwYTMsIDB4MDBhNCwgMHgwMGE1LCAweDAwYTYsIDB4MDBhNywKLSAgICAweDAwYTgsIDB4MDBhOSwgMHgwMGFhLCAweDAwYWIsIDB4MDBhYywgMHgwMDJkLCAweDAwYWUsIDB4MDBhZiwKLSAgICAweDAwYjAsIDB4MDBiMSwgMHgwMGIyLCAweDAwYjMsIDB4MDBiNCwgMHgwMGI1LCAweDAwYjYsIDB4MDBiNywKLSAgICAweDAwYjgsIDB4MDBiOSwgMHgwMGJhLCAweDAwYmIsIDB4MDBiYywgMHgwMGJkLCAweDAwYmUsIDB4MDBiZiwKLSAgICAweDAwYzAsIDB4MDBjMSwgMHgwMGMyLCAweDAwYzMsIDB4MDBjNCwgMHgwMGM1LCAweDAwYzYsIDB4MDBjNywKLSAgICAweDAwYzgsIDB4MDBjOSwgMHgwMGNhLCAweDAwY2IsIDB4MDBjYywgMHgwMGNkLCAweDAwY2UsIDB4MDBjZiwKLSAgICAweDAwZDAsIDB4MDBkMSwgMHgwMGQyLCAweDAwZDMsIDB4MDBkNCwgMHgwMGQ1LCAweDAwZDYsIDB4MDBkNywKLSAgICAweDAwZDgsIDB4MDBkOSwgMHgwMGRhLCAweDAwZGIsIDB4MDBkYywgMHgwMGRkLCAweDAwZGUsIDB4MDBkZiwKLSAgICAweDAwZTAsIDB4MDBlMSwgMHgwMGUyLCAweDAwZTMsIDB4MDBlNCwgMHgwMGU1LCAweDAwZTYsIDB4MDBlNywKLSAgICAweDAwZTgsIDB4MDBlOSwgMHgwMGVhLCAweDAwZWIsIDB4MDBlYywgMHgwMGVkLCAweDAwZWUsIDB4MDBlZiwKLSAgICAweDAwZjAsIDB4MDBmMSwgMHgwMGYyLCAweDAwZjMsIDB4MDBmNCwgMHgwMGY1LCAweDAwZjYsIDB4MDBmNywKLSAgICAweDAwZjgsIDB4MDBmOSwgMHgwMGZhLCAweDAwZmIsIDB4MDBmYywgMHgwMGZkLCAweDAwZmUsIDB4MDBmZgotfTsKLWV4dGVybiBjb25zdCBGWF9XT1JEIFBERkRvY0VuY29kaW5nWzI1Nl07Ci1jb25zdCBGWF9XT1JEIE1hY0V4cGVydEVuY29kaW5nWzI1Nl0gPSB7Ci0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAyMCwgMHhmNzIxLCAweGY2ZjgsIDB4ZjdhMiwgMHhmNzI0LCAweGY2ZTQsIDB4ZjcyNiwgMHhmN2I0LAotICAgIDB4MjA3ZCwgMHgyMDdlLCAweDIwMjUsIDB4MjAyNCwgMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgyMDQ0LCAweGY3MzAsIDB4ZjczMSwKLSAgICAweGY3MzIsIDB4ZjczMywgMHhmNzM0LCAweGY3MzUsIDB4ZjczNiwgMHhmNzM3LCAweGY3MzgsIDB4ZjczOSwgMHgwMDNhLCAweDAwM2IsCi0gICAgMHgwMDAwLCAweGY2ZGUsIDB4MDAwMCwgMHhmNzNmLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ZjdmMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMGJjLCAweDAwYmQsIDB4MDBiZSwgMHgyMTViLCAweDIxNWMsIDB4MjE1ZCwgMHgyMTVlLCAweDIxNTMsIDB4MjE1NCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweGZiMDAsIDB4ZmIwMSwgMHhmYjAyLCAweGZiMDMsCi0gICAgMHhmYjA0LCAweDIwOGQsIDB4MDAwMCwgMHgyMDhlLCAweGY2ZjYsIDB4ZjZlNSwgMHhmNzYwLCAweGY3NjEsIDB4Zjc2MiwgMHhmNzYzLAotICAgIDB4Zjc2NCwgMHhmNzY1LCAweGY3NjYsIDB4Zjc2NywgMHhmNzY4LCAweGY3NjksIDB4Zjc2YSwgMHhmNzZiLCAweGY3NmMsIDB4Zjc2ZCwKLSAgICAweGY3NmUsIDB4Zjc2ZiwgMHhmNzcwLCAweGY3NzEsIDB4Zjc3MiwgMHhmNzczLCAweGY3NzQsIDB4Zjc3NSwgMHhmNzc2LCAweGY3NzcsCi0gICAgMHhmNzc4LCAweGY3NzksIDB4Zjc3YSwgMHgyMGExLCAweGY2ZGMsIDB4ZjZkZCwgMHhmNmZlLCAweDAwMDAsIDB4MDAwMCwgMHhmNmU5LAotICAgIDB4ZjZlMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweGY3ZTEsIDB4ZjdlMCwgMHhmN2UyLCAweGY3ZTQsIDB4ZjdlMywKLSAgICAweGY3ZTUsIDB4ZjdlNywgMHhmN2U5LCAweGY3ZTgsIDB4ZjdlYSwgMHhmN2ViLCAweGY3ZWQsIDB4ZjdlYywgMHhmN2VlLCAweGY3ZWYsCi0gICAgMHhmN2YxLCAweGY3ZjMsIDB4ZjdmMiwgMHhmN2Y0LCAweGY3ZjYsIDB4ZjdmNSwgMHhmN2ZhLCAweGY3ZjksIDB4ZjdmYiwgMHhmN2ZjLAotICAgIDB4MDAwMCwgMHgyMDc4LCAweDIwODQsIDB4MjA4MywgMHgyMDg2LCAweDIwODgsIDB4MjA4NywgMHhmNmZkLCAweDAwMDAsIDB4ZjZkZiwKLSAgICAweDIwODIsIDB4MDAwMCwgMHhmN2E4LCAweDAwMDAsIDB4ZjZmNSwgMHhmNmZkLCAweDIwODUsIDB4MDAwMCwgMHhmNmUxLCAweGY2ZTcsCi0gICAgMHhmN2ZkLCAweDAwMDAsIDB4ZjZlMywgMHgwMDAwLCAweDAwMDAsIDB4ZjdmZSwgMHgwMDAwLCAweDIwODksIDB4MjA4MCwgMHhmNmZmLAotICAgIDB4ZjdlNiwgMHhmN2Y4LCAweGY3YmYsIDB4MjA4MSwgMHhmNmU5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ZjdiOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ZjZmYSwgMHgyMDEyLCAweGY2ZTYsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweGY3YTEsIDB4MDAwMCwgMHhmN2ZmLCAweDAwMDAsIDB4MDBiOSwgMHgwMGIyLAotICAgIDB4MDBiMywgMHgyMDc0LCAweDIwNzUsIDB4MjA3NiwgMHgyMDc3LCAweDIwNzksIDB4MjA3MCwgMHgwMDAwLCAweGY2ZWMsIDB4ZjZmMSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweGY2ZWQsIDB4ZjZmMiwgMHhmNmViLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweGY2ZWUsIDB4ZjZmYiwgMHhmNmY0LCAweGY3YWYsIDB4ZjZlYSwgMHgyMDdmLCAweGY2ZWYsIDB4ZjZlMiwgMHhmNmU4LAotICAgIDB4ZjZmNywgMHhmNmZjLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAKLX07Ci1jb25zdCBGWF9XT1JEIEFkb2JlU3ltYm9sRW5jb2RpbmdbMjU2XSA9IHsKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMjAsIDB4MDAyMSwgMHgyMjAwLCAweDAwMjMsIDB4MjIwMywgMHgwMDI1LCAweDAwMjYsIDB4MjIwQiwKLSAgICAweDAwMjgsIDB4MDAyOSwgMHgyMjE3LCAweDAwMkIsIDB4MDAyQywgMHgyMjEyLCAweDAwMkUsIDB4MDAyRiwKLSAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKLSAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDNBLCAweDAwM0IsIDB4MDAzQywgMHgwMDNELCAweDAwM0UsIDB4MDAzRiwKLSAgICAweDIyNDUsIDB4MDM5MSwgMHgwMzkyLCAweDAzQTcsIDB4MDM5NCwgMHgwMzk1LCAweDAzQTYsIDB4MDM5MywKLSAgICAweDAzOTcsIDB4MDM5OSwgMHgwM0QxLCAweDAzOUEsIDB4MDM5QiwgMHgwMzlDLCAweDAzOUQsIDB4MDM5RiwKLSAgICAweDAzQTAsIDB4MDM5OCwgMHgwM0ExLCAweDAzQTMsIDB4MDNBNCwgMHgwM0E1LCAweDAzQzIsIDB4MDNBOSwKLSAgICAweDAzOUUsIDB4MDNBOCwgMHgwMzk2LCAweDAwNUIsIDB4MjIzNCwgMHgwMDVELCAweDIyQTUsIDB4MDA1RiwKLSAgICAweEY4RTUsIDB4MDNCMSwgMHgwM0IyLCAweDAzQzcsIDB4MDNCNCwgMHgwM0I1LCAweDAzQzYsIDB4MDNCMywKLSAgICAweDAzQjcsIDB4MDNCOSwgMHgwM0Q1LCAweDAzQkEsIDB4MDNCQiwgMHgwM0JDLCAweDAzQkQsIDB4MDNCRiwKLSAgICAweDAzQzAsIDB4MDNCOCwgMHgwM0MxLCAweDAzQzMsIDB4MDNDNCwgMHgwM0M1LCAweDAzRDYsIDB4MDNDOSwKLSAgICAweDAzQkUsIDB4MDNDOCwgMHgwM0I2LCAweDAwN0IsIDB4MDA3QywgMHgwMDdELCAweDIyM0MsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDIwQUMsIDB4MDNEMiwgMHgyMDMyLCAweDIyNjQsIDB4MjA0NCwgMHgyMjFFLCAweDAxOTIsIDB4MjY2MywKLSAgICAweDI2NjYsIDB4MjY2NSwgMHgyNjYwLCAweDIxOTQsIDB4MjE5MCwgMHgyMTkxLCAweDIxOTIsIDB4MjE5MywKLSAgICAweDAwQjAsIDB4MDBCMSwgMHgyMDMzLCAweDIyNjUsIDB4MDBENywgMHgyMjFELCAweDIyMDIsIDB4MjAyMiwKLSAgICAweDAwRjcsIDB4MjI2MCwgMHgyMjYxLCAweDIyNDgsIDB4MjAyNiwgMHhGOEU2LCAweEY4RTcsIDB4MjFCNSwKLSAgICAweDIxMzUsIDB4MjExMSwgMHgyMTFDLCAweDIxMTgsIDB4MjI5NywgMHgyMjk1LCAweDIyMDUsIDB4MjIyOSwKLSAgICAweDIyMkEsIDB4MjI4MywgMHgyMjg3LCAweDIyODQsIDB4MjI4MiwgMHgyMjg2LCAweDIyMDgsIDB4MjIwOSwKLSAgICAweDIyMjAsIDB4MjIwNywgMHhGNkRBLCAweEY2RDksIDB4RjZEQiwgMHgyMjBGLCAweDIyMUEsIDB4MjJDNSwKLSAgICAweDAwQUMsIDB4MjIyNywgMHgyMjI4LCAweDIxRDQsIDB4MjFEMCwgMHgyMUQxLCAweDIxRDIsIDB4MjFEMywKLSAgICAweDI1Q0EsIDB4MjMyOSwgMHhGOEU4LCAweEY4RTksIDB4RjhFQSwgMHgyMjExLCAweEY4RUIsIDB4RjhFQywKLSAgICAweEY4RUQsIDB4RjhFRSwgMHhGOEVGLCAweEY4RjAsIDB4RjhGMSwgMHhGOEYyLCAweEY4RjMsIDB4RjhGNCwKLSAgICAweDAwMDAsIDB4MjMyQSwgMHgyMjJCLCAweDIzMjAsIDB4RjhGNSwgMHgyMzIxLCAweEY4RjYsIDB4RjhGNywKLSAgICAweEY4RjgsIDB4RjhGOSwgMHhGOEZBLCAweEY4RkIsIDB4RjhGQywgMHhGOEZELCAweEY4RkUsIDB4MDAwMCwKLX07Ci1jb25zdCBGWF9XT1JEIFphcGZFbmNvZGluZ1syNTZdID0gewotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAyMCwgMHgyNzAxLCAweDI3MDIsIDB4MjcwMywgMHgyNzA0LCAweDI2MEUsIDB4MjcwNiwgMHgyNzA3LAotICAgIDB4MjcwOCwgMHgyNzA5LCAweDI2MUIsIDB4MjYxRSwgMHgyNzBDLCAweDI3MEQsIDB4MjcwRSwgMHgyNzBGLAotICAgIDB4MjcxMCwgMHgyNzExLCAweDI3MTIsIDB4MjcxMywgMHgyNzE0LCAweDI3MTUsIDB4MjcxNiwgMHgyNzE3LAotICAgIDB4MjcxOCwgMHgyNzE5LCAweDI3MUEsIDB4MjcxQiwgMHgyNzFDLCAweDI3MUQsIDB4MjcxRSwgMHgyNzFGLAotICAgIDB4MjcyMCwgMHgyNzIxLCAweDI3MjIsIDB4MjcyMywgMHgyNzI0LCAweDI3MjUsIDB4MjcyNiwgMHgyNzI3LAotICAgIDB4MjYwNSwgMHgyNzI5LCAweDI3MkEsIDB4MjcyQiwgMHgyNzJDLCAweDI3MkQsIDB4MjcyRSwgMHgyNzJGLAotICAgIDB4MjczMCwgMHgyNzMxLCAweDI3MzIsIDB4MjczMywgMHgyNzM0LCAweDI3MzUsIDB4MjczNiwgMHgyNzM3LAotICAgIDB4MjczOCwgMHgyNzM5LCAweDI3M0EsIDB4MjczQiwgMHgyNzNDLCAweDI3M0QsIDB4MjczRSwgMHgyNzNGLAotICAgIDB4Mjc0MCwgMHgyNzQxLCAweDI3NDIsIDB4Mjc0MywgMHgyNzQ0LCAweDI3NDUsIDB4Mjc0NiwgMHgyNzQ3LAotICAgIDB4Mjc0OCwgMHgyNzQ5LCAweDI3NEEsIDB4Mjc0QiwgMHgyNUNGLCAweDI3NEQsIDB4MjVBMCwgMHgyNzRGLAotICAgIDB4Mjc1MCwgMHgyNzUxLCAweDI3NTIsIDB4MjVCMiwgMHgyNUJDLCAweDI1QzYsIDB4Mjc1NiwgMHgyNUQ3LAotICAgIDB4Mjc1OCwgMHgyNzU5LCAweDI3NUEsIDB4Mjc1QiwgMHgyNzVDLCAweDI3NUQsIDB4Mjc1RSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgyNzYxLCAweDI3NjIsIDB4Mjc2MywgMHgyNzY0LCAweDI3NjUsIDB4Mjc2NiwgMHgyNzY3LAotICAgIDB4MjY2MywgMHgyNjY2LCAweDI2NjUsIDB4MjY2MCwgMHgyNDYwLCAweDI0NjEsIDB4MjQ2MiwgMHgyNDYzLAotICAgIDB4MjQ2NCwgMHgyNDY1LCAweDI0NjYsIDB4MjQ2NywgMHgyNDY4LCAweDI0NjksIDB4Mjc3NiwgMHgyNzc3LAotICAgIDB4Mjc3OCwgMHgyNzc5LCAweDI3N0EsIDB4Mjc3QiwgMHgyNzdDLCAweDI3N0QsIDB4Mjc3RSwgMHgyNzdGLAotICAgIDB4Mjc4MCwgMHgyNzgxLCAweDI3ODIsIDB4Mjc4MywgMHgyNzg0LCAweDI3ODUsIDB4Mjc4NiwgMHgyNzg3LAotICAgIDB4Mjc4OCwgMHgyNzg5LCAweDI3OEEsIDB4Mjc4QiwgMHgyNzhDLCAweDI3OEQsIDB4Mjc4RSwgMHgyNzhGLAotICAgIDB4Mjc5MCwgMHgyNzkxLCAweDI3OTIsIDB4Mjc5MywgMHgyNzk0LCAweDIxOTIsIDB4MjE5NCwgMHgyMTk1LAotICAgIDB4Mjc5OCwgMHgyNzk5LCAweDI3OUEsIDB4Mjc5QiwgMHgyNzlDLCAweDI3OUQsIDB4Mjc5RSwgMHgyNzlGLAotICAgIDB4MjdBMCwgMHgyN0ExLCAweDI3QTIsIDB4MjdBMywgMHgyN0E0LCAweDI3QTUsIDB4MjdBNiwgMHgyN0E3LAotICAgIDB4MjdBOCwgMHgyN0E5LCAweDI3QUEsIDB4MjdBQiwgMHgyN0FDLCAweDI3QUQsIDB4MjdBRSwgMHgyN0FGLAotICAgIDB4MDAwMCwgMHgyN0IxLCAweDI3QjIsIDB4MjdCMywgMHgyN0I0LCAweDI3QjUsIDB4MjdCNiwgMHgyN0I3LAotICAgIDB4MjdCOCwgMHgyN0I5LCAweDI3QkEsIDB4MjdCQiwgMHgyN0JDLCAweDI3QkQsIDB4MjdCRSwgMHgwMDAwLAotfTsKLWNvbnN0IEZYX0xQQ1NUUiBTdGFuZGFyZEVuY29kaW5nTmFtZXNbMjI0XSA9IHsKLSAgICAic3BhY2UiLCAiZXhjbGFtIiwgInF1b3RlZGJsIiwgIm51bWJlcnNpZ24iLCAiZG9sbGFyIiwgInBlcmNlbnQiLCAiYW1wZXJzYW5kIiwgInF1b3RlcmlnaHQiLAotICAgICJwYXJlbmxlZnQiLCAicGFyZW5yaWdodCIsICJhc3RlcmlzayIsICJwbHVzIiwgImNvbW1hIiwgImh5cGhlbiIsICJwZXJpb2QiLCAic2xhc2giLAotICAgICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsCi0gICAgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLCAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsCi0gICAgImF0IiwgIkEiLCAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiwgIkciLAotICAgICJIIiwgIkkiLCAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwgIk8iLAotICAgICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiVSIsICJWIiwgIlciLAotICAgICJYIiwgIlkiLCAiWiIsICJicmFja2V0bGVmdCIsICJiYWNrc2xhc2giLCAiYnJhY2tldHJpZ2h0IiwgImFzY2lpY2lyY3VtIiwgInVuZGVyc2NvcmUiLAotICAgICJxdW90ZWxlZnQiLCAiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsCi0gICAgImgiLCAiaSIsICJqIiwgImsiLCAibCIsICJtIiwgIm4iLCAibyIsCi0gICAgInAiLCAicSIsICJyIiwgInMiLCAidCIsICJ1IiwgInYiLCAidyIsCi0gICAgIngiLCAieSIsICJ6IiwgImJyYWNlbGVmdCIsICJiYXIiLCAiYnJhY2VyaWdodCIsICJhc2NpaXRpbGRlIiwgTlVMTCwKLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgIE5VTEwsICJleGNsYW1kb3duIiwgImNlbnQiLCAic3RlcmxpbmciLCAiZnJhY3Rpb24iLCAieWVuIiwgImZsb3JpbiIsICJzZWN0aW9uIiwKLSAgICAiY3VycmVuY3kiLCAicXVvdGVzaW5nbGUiLCAicXVvdGVkYmxsZWZ0IiwgImd1aWxsZW1vdGxlZnQiLCAiZ3VpbHNpbmdsbGVmdCIsICJndWlsc2luZ2xyaWdodCIsICJmaSIsICJmbCIsCi0gICAgTlVMTCwgImVuZGFzaCIsICJkYWdnZXIiLCAiZGFnZ2VyZGJsIiwgInBlcmlvZGNlbnRlcmVkIiwgTlVMTCwgInBhcmFncmFwaCIsICJidWxsZXQiLAotICAgICJxdW90ZXNpbmdsYmFzZSIsICJxdW90ZWRibGJhc2UiLCAicXVvdGVkYmxyaWdodCIsICJndWlsbGVtb3RyaWdodCIsICJlbGxpcHNpcyIsICJwZXJ0aG91c2FuZCIsIE5VTEwsICJxdWVzdGlvbmRvd24iLAotICAgIE5VTEwsICJncmF2ZSIsICJhY3V0ZSIsICJjaXJjdW1mbGV4IiwgInRpbGRlIiwgIm1hY3JvbiIsICJicmV2ZSIsICJkb3RhY2NlbnQiLAotICAgICJkaWVyZXNpcyIsIE5VTEwsICJyaW5nIiwgImNlZGlsbGEiLCBOVUxMLCAiaHVuZ2FydW1sYXV0IiwgIm9nb25layIsICJjYXJvbiIsCi0gICAgImVtZGFzaCIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICBOVUxMLCAiQUUiLCBOVUxMLCAib3JkZmVtaW5pbmUiLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgICJMc2xhc2giLCAiT3NsYXNoIiwgIk9FIiwgIm9yZG1hc2N1bGluZSIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgTlVMTCwgImFlIiwgTlVMTCwgTlVMTCwgTlVMTCwgImRvdGxlc3NpIiwgTlVMTCwgTlVMTCwKLSAgICAibHNsYXNoIiwgIm9zbGFzaCIsICJvZSIsICJnZXJtYW5kYmxzIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLX07Ci1jb25zdCBGWF9MUENTVFIgQWRvYmVXaW5BbnNpRW5jb2RpbmdOYW1lc1syMjRdID0gewotICAgICJzcGFjZSIsICJleGNsYW0iLCAicXVvdGVkYmwiLCAibnVtYmVyc2lnbiIsICJkb2xsYXIiLCAicGVyY2VudCIsICJhbXBlcnNhbmQiLCAicXVvdGVzaW5nbGUiLAotICAgICJwYXJlbmxlZnQiLCAicGFyZW5yaWdodCIsICJhc3RlcmlzayIsICJwbHVzIiwgImNvbW1hIiwgImh5cGhlbiIsICJwZXJpb2QiLCAic2xhc2giLAotICAgICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsCi0gICAgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLCAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsCi0gICAgImF0IiwgIkEiLCAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiwgIkciLAotICAgICJIIiwgIkkiLCAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwgIk8iLAotICAgICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiVSIsICJWIiwgIlciLAotICAgICJYIiwgIlkiLCAiWiIsICJicmFja2V0bGVmdCIsICJiYWNrc2xhc2giLCAiYnJhY2tldHJpZ2h0IiwgImFzY2lpY2lyY3VtIiwgInVuZGVyc2NvcmUiLAotICAgICJncmF2ZSIsICJhIiwgImIiLCAiYyIsICJkIiwgImUiLCAiZiIsICJnIiwKLSAgICAiaCIsICJpIiwgImoiLCAiayIsICJsIiwgIm0iLCAibiIsICJvIiwKLSAgICAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwKLSAgICAieCIsICJ5IiwgInoiLCAiYnJhY2VsZWZ0IiwgImJhciIsICJicmFjZXJpZ2h0IiwgImFzY2lpdGlsZGUiLCAiYnVsbGV0IiwKLSAgICAiRXVybyIsICJidWxsZXQiLCAicXVvdGVzaW5nbGJhc2UiLCAiZmxvcmluIiwgInF1b3RlZGJsYmFzZSIsICJlbGxpcHNpcyIsICJkYWdnZXIiLCAiZGFnZ2VyZGJsIiwKLSAgICAiY2lyY3VtZmxleCIsICJwZXJ0aG91c2FuZCIsICJTY2Fyb24iLCAiZ3VpbHNpbmdsbGVmdCIsICJPRSIsICJidWxsZXQiLCAiWmNhcm9uIiwgImJ1bGxldCIsCi0gICAgImJ1bGxldCIsICJxdW90ZWxlZnQiLCAicXVvdGVyaWdodCIsICJxdW90ZWRibGxlZnQiLCAicXVvdGVkYmxyaWdodCIsICJidWxsZXQiLCAiZW5kYXNoIiwgImVtZGFzaCIsCi0gICAgInRpbGRlIiwgInRyYWRlbWFyayIsICJzY2Fyb24iLCAiZ3VpbHNpbmdscmlnaHQiLCAib2UiLCAiYnVsbGV0IiwgInpjYXJvbiIsICJZZGllcmVzaXMiLAotICAgICJzcGFjZSIsICJleGNsYW1kb3duIiwgImNlbnQiLCAic3RlcmxpbmciLCAiY3VycmVuY3kiLCAieWVuIiwgImJyb2tlbmJhciIsICJzZWN0aW9uIiwKLSAgICAiZGllcmVzaXMiLCAiY29weXJpZ2h0IiwgIm9yZGZlbWluaW5lIiwgImd1aWxsZW1vdGxlZnQiLCAibG9naWNhbG5vdCIsICJoeXBoZW4iLCAicmVnaXN0ZXJlZCIsICJtYWNyb24iLAotICAgICJkZWdyZWUiLCAicGx1c21pbnVzIiwgInR3b3N1cGVyaW9yIiwgInRocmVlc3VwZXJpb3IiLCAiYWN1dGUiLCAibXUiLCAicGFyYWdyYXBoIiwgInBlcmlvZGNlbnRlcmVkIiwKLSAgICAiY2VkaWxsYSIsICJvbmVzdXBlcmlvciIsICJvcmRtYXNjdWxpbmUiLCAiZ3VpbGxlbW90cmlnaHQiLCAib25lcXVhcnRlciIsICJvbmVoYWxmIiwgInRocmVlcXVhcnRlcnMiLCAicXVlc3Rpb25kb3duIiwKLSAgICAiQWdyYXZlIiwgIkFhY3V0ZSIsICJBY2lyY3VtZmxleCIsICJBdGlsZGUiLCAiQWRpZXJlc2lzIiwgIkFyaW5nIiwgIkFFIiwgIkNjZWRpbGxhIiwKLSAgICAiRWdyYXZlIiwgIkVhY3V0ZSIsICJFY2lyY3VtZmxleCIsICJFZGllcmVzaXMiLCAiSWdyYXZlIiwgIklhY3V0ZSIsICJJY2lyY3VtZmxleCIsICJJZGllcmVzaXMiLAotICAgICJFdGgiLCAiTnRpbGRlIiwgIk9ncmF2ZSIsICJPYWN1dGUiLCAiT2NpcmN1bWZsZXgiLCAiT3RpbGRlIiwgIk9kaWVyZXNpcyIsICJtdWx0aXBseSIsCi0gICAgIk9zbGFzaCIsICJVZ3JhdmUiLCAiVWFjdXRlIiwgIlVjaXJjdW1mbGV4IiwgIlVkaWVyZXNpcyIsICJZYWN1dGUiLCAiVGhvcm4iLCAiZ2VybWFuZGJscyIsCi0gICAgImFncmF2ZSIsICJhYWN1dGUiLCAiYWNpcmN1bWZsZXgiLCAiYXRpbGRlIiwgImFkaWVyZXNpcyIsICJhcmluZyIsICJhZSIsICJjY2VkaWxsYSIsCi0gICAgImVncmF2ZSIsICJlYWN1dGUiLCAiZWNpcmN1bWZsZXgiLCAiZWRpZXJlc2lzIiwgImlncmF2ZSIsICJpYWN1dGUiLCAiaWNpcmN1bWZsZXgiLCAiaWRpZXJlc2lzIiwKLSAgICAiZXRoIiwgIm50aWxkZSIsICJvZ3JhdmUiLCAib2FjdXRlIiwgIm9jaXJjdW1mbGV4IiwgIm90aWxkZSIsICJvZGllcmVzaXMiLCAiZGl2aWRlIiwKLSAgICAib3NsYXNoIiwgInVncmF2ZSIsICJ1YWN1dGUiLCAidWNpcmN1bWZsZXgiLCAidWRpZXJlc2lzIiwgInlhY3V0ZSIsICJ0aG9ybiIsICJ5ZGllcmVzaXMiLAotfTsKLWNvbnN0IEZYX0xQQ1NUUiAgTWFjUm9tYW5FbmNvZGluZ05hbWVzWzIyNF0gPSB7Ci0gICAgInNwYWNlIiwgImV4Y2xhbSIsICJxdW90ZWRibCIsICJudW1iZXJzaWduIiwgImRvbGxhciIsICJwZXJjZW50IiwgImFtcGVyc2FuZCIsICJxdW90ZXNpbmdsZSIsCi0gICAgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImFzdGVyaXNrIiwgInBsdXMiLCAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJzbGFzaCIsCi0gICAgInplcm8iLCAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLCAic2l4IiwgInNldmVuIiwKLSAgICAiZWlnaHQiLCAibmluZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCAibGVzcyIsICJlcXVhbCIsICJncmVhdGVyIiwgInF1ZXN0aW9uIiwKLSAgICAiYXQiLCAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiLCAiRyIsCi0gICAgIkgiLCAiSSIsICJKIiwgIksiLCAiTCIsICJNIiwgIk4iLCAiTyIsCi0gICAgIlAiLCAiUSIsICJSIiwgIlMiLCAiVCIsICJVIiwgIlYiLCAiVyIsCi0gICAgIlgiLCAiWSIsICJaIiwgImJyYWNrZXRsZWZ0IiwgImJhY2tzbGFzaCIsICJicmFja2V0cmlnaHQiLCAiYXNjaWljaXJjdW0iLCAidW5kZXJzY29yZSIsCi0gICAgImdyYXZlIiwgImEiLCAiYiIsICJjIiwgImQiLCAiZSIsICJmIiwgImciLAotICAgICJoIiwgImkiLCAiaiIsICJrIiwgImwiLCAibSIsICJuIiwgIm8iLAotICAgICJwIiwgInEiLCAiciIsICJzIiwgInQiLCAidSIsICJ2IiwgInciLAotICAgICJ4IiwgInkiLCAieiIsICJicmFjZWxlZnQiLCAiYmFyIiwgImJyYWNlcmlnaHQiLCAiYXNjaWl0aWxkZSIsIE5VTEwsCi0gICAgIkFkaWVyZXNpcyIsICJBcmluZyIsICJDY2VkaWxsYSIsICJFYWN1dGUiLCAiTnRpbGRlIiwgIk9kaWVyZXNpcyIsICJVZGllcmVzaXMiLCAiYWFjdXRlIiwKLSAgICAiYWdyYXZlIiwgImFjaXJjdW1mbGV4IiwgImFkaWVyZXNpcyIsICJhdGlsZGUiLCAiYXJpbmciLCAiY2NlZGlsbGEiLCAiZWFjdXRlIiwgImVncmF2ZSIsCi0gICAgImVjaXJjdW1mbGV4IiwgImVkaWVyZXNpcyIsICJpYWN1dGUiLCAiaWdyYXZlIiwgImljaXJjdW1mbGV4IiwgImlkaWVyZXNpcyIsICJudGlsZGUiLCAib2FjdXRlIiwKLSAgICAib2dyYXZlIiwgIm9jaXJjdW1mbGV4IiwgIm9kaWVyZXNpcyIsICJvdGlsZGUiLCAidWFjdXRlIiwgInVncmF2ZSIsICJ1Y2lyY3VtZmxleCIsICJ1ZGllcmVzaXMiLAotICAgICJkYWdnZXIiLCAiZGVncmVlIiwgImNlbnQiLCAic3RlcmxpbmciLCAic2VjdGlvbiIsICJidWxsZXQiLCAicGFyYWdyYXBoIiwgImdlcm1hbmRibHMiLAotICAgICJyZWdpc3RlcmVkIiwgImNvcHlyaWdodCIsICJ0cmFkZW1hcmsiLCAiYWN1dGUiLCAiZGllcmVzaXMiLCAibm90ZXF1YWwiLCAiQUUiLCAiT3NsYXNoIiwKLSAgICAiaW5maW5pdHkiLCAicGx1c21pbnVzIiwgImxlc3NlcXVhbCIsICJncmVhdGVyZXF1YWwiLCAieWVuIiwgIm11IiwgInBhcnRpYWxkaWZmIiwgInN1bW1hdGlvbiIsCi0gICAgInByb2R1Y3QiLCAicGkiLCAiaW50ZWdyYWwiLCAib3JkZmVtaW5pbmUiLCAib3JkbWFzY3VsaW5lIiwgIk9tZWdhIiwgImFlIiwgIm9zbGFzaCIsCi0gICAgInF1ZXN0aW9uZG93biIsICJleGNsYW1kb3duIiwgImxvZ2ljYWxub3QiLCAicmFkaWNhbCIsICJmbG9yaW4iLCAiYXBwcm94ZXF1YWwiLCAiRGVsdGEiLCAiZ3VpbGxlbW90bGVmdCIsCi0gICAgImd1aWxsZW1vdHJpZ2h0IiwgImVsbGlwc2lzIiwgInNwYWNlIiwgIkFncmF2ZSIsICJBdGlsZGUiLCAiT3RpbGRlIiwgIk9FIiwgIm9lIiwKLSAgICAiZW5kYXNoIiwgImVtZGFzaCIsICJxdW90ZWRibGxlZnQiLCAicXVvdGVkYmxyaWdodCIsICJxdW90ZWxlZnQiLCAicXVvdGVyaWdodCIsICJkaXZpZGUiLCAibG96ZW5nZSIsCi0gICAgInlkaWVyZXNpcyIsICJZZGllcmVzaXMiLCAiZnJhY3Rpb24iLCAiY3VycmVuY3kiLCAiZ3VpbHNpbmdsbGVmdCIsICJndWlsc2luZ2xyaWdodCIsICJmaSIsICJmbCIsCi0gICAgImRhZ2dlcmRibCIsICJwZXJpb2RjZW50ZXJlZCIsICJxdW90ZXNpbmdsYmFzZSIsICJxdW90ZWRibGJhc2UiLCAicGVydGhvdXNhbmQiLCAiQWNpcmN1bWZsZXgiLCAiRWNpcmN1bWZsZXgiLCAiQWFjdXRlIiwKLSAgICAiRWRpZXJlc2lzIiwgIkVncmF2ZSIsICJJYWN1dGUiLCAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwgIklncmF2ZSIsICJPYWN1dGUiLCAiT2NpcmN1bWZsZXgiLAotICAgICJhcHBsZSIsICJPZ3JhdmUiLCAiVWFjdXRlIiwgIlVjaXJjdW1mbGV4IiwgIlVncmF2ZSIsICJkb3RsZXNzaSIsICJjaXJjdW1mbGV4IiwgInRpbGRlIiwKLSAgICAibWFjcm9uIiwgImJyZXZlIiwgImRvdGFjY2VudCIsICJyaW5nIiwgImNlZGlsbGEiLCAiaHVuZ2FydW1sYXV0IiwgIm9nb25layIsICJjYXJvbiIsCi19OwotY29uc3QgRlhfTFBDU1RSICBNYWNFeHBlcnRFbmNvZGluZ05hbWVzWzIyNF0gPSB7Ci0gICAgInNwYWNlIiwgImV4Y2xhbXNtYWxsIiwgIkh1bmdhcnVtbGF1dHNtYWxsIiwgImNlbnRvbGRzdHlsZSIsICJkb2xsYXJvbGRzdHlsZSIsICJkb2xsYXJzdXBlcmlvciIsICJhbXBlcnNhbmRzbWFsbCIsICJBY3V0ZXNtYWxsIiwKLSAgICAicGFyZW5sZWZ0c3VwZXJpb3IiLCAicGFyZW5yaWdodHN1cGVyaW9yIiwgInR3b2RvdGVubGVhZGVyIiwgIm9uZWRvdGVubGVhZGVyIiwgImNvbW1hIiwgImh5cGhlbiIsICJwZXJpb2QiLCAiZnJhY3Rpb24iLAotICAgICJ6ZXJvb2xkc3R5bGUiLCAib25lb2xkc3R5bGUiLCAidHdvb2xkc3R5bGUiLCAidGhyZWVvbGRzdHlsZSIsICJmb3Vyb2xkc3R5bGUiLCAiZml2ZW9sZHN0eWxlIiwgInNpeG9sZHN0eWxlIiwgInNldmVub2xkc3R5bGUiLAotICAgICJlaWdodG9sZHN0eWxlIiwgIm5pbmVvbGRzdHlsZSIsICJjb2xvbiIsICJzZW1pY29sb24iLCBOVUxMLCAidGhyZWVxdWFydGVyc2VtZGFzaCIsIE5VTEwsICJxdWVzdGlvbnNtYWxsIiwKLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAiRXRoc21hbGwiLCBOVUxMLCBOVUxMLCAib25lcXVhcnRlciIsCi0gICAgIm9uZWhhbGYiLCAidGhyZWVxdWFydGVycyIsICJvbmVlaWdodGgiLCAidGhyZWVlaWdodGhzIiwgImZpdmVlaWdodGhzIiwgInNldmVuZWlnaHRocyIsICJvbmV0aGlyZCIsICJ0d290aGlyZHMiLAotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsICJmZiIsICJmaSIsCi0gICAgImZsIiwgImZmaSIsICJmZmwiLCAicGFyZW5sZWZ0aW5mZXJpb3IiLCBOVUxMLCAicGFyZW5yaWdodGluZmVyaW9yIiwgIkNpcmN1bWZsZXhzbWFsbCIsICJoeXBoZW5pbmZlcmlvciIsCi0gICAgIkdyYXZlc21hbGwiLCAiQXNtYWxsIiwgIkJzbWFsbCIsICJDc21hbGwiLCAiRHNtYWxsIiwgIkVzbWFsbCIsICJGc21hbGwiLCAiR3NtYWxsIiwKLSAgICAiSHNtYWxsIiwgIklzbWFsbCIsICJKc21hbGwiLCAiS3NtYWxsIiwgIkxzbWFsbCIsICJNc21hbGwiLCAiTnNtYWxsIiwgIk9zbWFsbCIsCi0gICAgIlBzbWFsbCIsICJRc21hbGwiLCAiUnNtYWxsIiwgIlNzbWFsbCIsICJUc21hbGwiLCAiVXNtYWxsIiwgIlZzbWFsbCIsICJXc21hbGwiLAotICAgICJYc21hbGwiLCAiWXNtYWxsIiwgIlpzbWFsbCIsICJjb2xvbm1vbmV0YXJ5IiwgIm9uZWZpdHRlZCIsICJydXBpYWgiLCAiVGlsZGVzbWFsbCIsIE5VTEwsCi0gICAgTlVMTCwgImFzdXBlcmlvciIsICJjZW50c3VwZXJpb3IiLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAiQWFjdXRlc21hbGwiLAotICAgICJBZ3JhdmVzbWFsbCIsICJBY2lyY3VtZmxleHNtYWxsIiwgIkFkaWVyZXNpc3NtYWxsIiwgIkF0aWxkZXNtYWxsIiwgIkFyaW5nc21hbGwiLCAiQ2NlZGlsbGFzbWFsbCIsICJFYWN1dGVzbWFsbCIsICJFZ3JhdmVzbWFsbCIsCi0gICAgIkVjaXJjdW1mbGV4c21hbGwiLCAiRWRpZXJlc2lzc21hbGwiLCAiSWFjdXRlc21hbGwiLCAiSWdyYXZlc21hbGwiLCAiSWNpcmN1bWZsZXhzbWFsbCIsICJJZGllcmVzaXNzbWFsbCIsICJOdGlsZGVzbWFsbCIsICJPYWN1dGVzbWFsbCIsCi0gICAgIk9ncmF2ZXNtYWxsIiwgIk9jaXJjdW1mbGV4c21hbGwiLCAiT2RpZXJlc2lzc21hbGwiLCAiT3RpbGRlc21hbGwiLCAiVWFjdXRlc21hbGwiLCAiVWdyYXZlc21hbGwiLCAiVWNpcmN1bWZsZXhzbWFsbCIsICJVZGllcmVzaXNzbWFsbCIsCi0gICAgTlVMTCwgImVpZ2h0c3VwZXJpb3IiLCAiZm91cmluZmVyaW9yIiwgInRocmVlaW5mZXJpb3IiLCAic2l4aW5mZXJpb3IiLCAiZWlnaHRpbmZlcmlvciIsICJzZXZlbmluZmVyaW9yIiwgIlNjYXJvbnNtYWxsIiwKLSAgICBOVUxMLCAiY2VudGluZmVyaW9yIiwgInR3b2luZmVyaW9yIiwgTlVMTCwgIkRpZXJlc2lzc21hbGwiLCBOVUxMLCAiQ2Fyb25zbWFsbCIsICJTY2Fyb25zbWFsbCIsCi0gICAgImZpdmVpbmZlcmlvciIsIE5VTEwsICJjb21tYWluZmVyaW9yIiwgInBlcmlvZGluZmVyaW9yIiwgIllhY3V0ZXNtYWxsIiwgTlVMTCwgImRvbGxhcmluZmVyaW9yIiwgTlVMTCwKLSAgICBOVUxMLCAiVGhvcm5zbWFsbCIsIE5VTEwsICJuaW5laW5mZXJpb3IiLCAiemVyb2luZmVyaW9yIiwgIlpjYXJvbnNtYWxsIiwgIkFFc21hbGwiLCAiT3NsYXNoc21hbGwiLAotICAgICJxdWVzdGlvbmRvd25zbWFsbCIsICJvbmVpbmZlcmlvciIsICJhc3VwZXJpb3IiLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgIE5VTEwsICJDZWRpbGxhc21hbGwiLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAiT0VzbWFsbCIsCi0gICAgImZpZ3VyZWRhc2giLCAiaHlwaGVuc3VwZXJpb3IiLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAiZXhjbGFtZG93bnNtYWxsIiwgTlVMTCwKLSAgICAiWWRpZXJlc2lzc21hbGwiLCBOVUxMLCAib25lc3VwZXJpb3IiLCAidHdvc3VwZXJpb3IiLCAidGhyZWVzdXBlcmlvciIsICJmb3Vyc3VwZXJpb3IiLCAiZml2ZXN1cGVyaW9yIiwgInNpeHN1cGVyaW9yIiwKLSAgICAic2V2ZW5zdXBlcmlvciIsICJuaW5lc3VwZXJpb3IiLCAiemVyb3N1cGVyaW9yIiwgTlVMTCwgImVzdXBlcmlvciIsICJyc3VwZXJpb3IiLCBOVUxMLCBOVUxMLAotICAgIE5VTEwsICJpc3VwZXJpb3IiLCAic3N1cGVyaW9yIiwgImRzdXBlcmlvciIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgTlVMTCwgImxzdXBlcmlvciIsICJPZ29uZWtzbWFsbCIsICJCcmV2ZXNtYWxsIiwgIk1hY3JvbnNtYWxsIiwgImJzdXBlcmlvciIsICJuc3VwZXJpb3IiLCAibXN1cGVyaW9yIiwKLSAgICAiY29tbWFzdXBlcmlvciIsICJwZXJpb2RzdXBlcmlvciIsICJEb3RhY2NlbnRzbWFsbCIsICJSaW5nc21hbGwiLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotfTsKLWNvbnN0IEZYX0xQQ1NUUiAgUERGRG9jRW5jb2RpbmdOYW1lc1syMzJdID0gewotICAgICJicmV2ZSIsICJjYXJvbiIsICJjaXJjdW1mbGV4IiwgImRvdGFjY2VudCIsICJodW5nYXJ1bWxhdXQiLCAib2dvbmVrIiwgInJpbmciLCAidGlsZGUiLAotICAgICJzcGFjZSIsICJleGNsYW0iLCAicXVvdGVkYmwiLCAibnVtYmVyc2lnbiIsICJkb2xsYXIiLCAicGVyY2VudCIsICJhbXBlcnNhbmQiLCAicXVvdGVzaW5nbGUiLAotICAgICJwYXJlbmxlZnQiLCAicGFyZW5yaWdodCIsICJhc3RlcmlzayIsICJwbHVzIiwgImNvbW1hIiwgImh5cGhlbiIsICJwZXJpb2QiLCAic2xhc2giLAotICAgICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsCi0gICAgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLCAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsCi0gICAgImF0IiwgIkEiLCAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiwgIkciLAotICAgICJIIiwgIkkiLCAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwgIk8iLAotICAgICJQIiwgIlEiLCAiUiIsICJTIiwgIlQiLCAiVSIsICJWIiwgIlciLAotICAgICJYIiwgIlkiLCAiWiIsICJicmFja2V0bGVmdCIsICJiYWNrc2xhc2giLCAiYnJhY2tldHJpZ2h0IiwgImFzY2lpY2lyY3VtIiwgInVuZGVyc2NvcmUiLAotICAgICJncmF2ZSIsICJhIiwgImIiLCAiYyIsICJkIiwgImUiLCAiZiIsICJnIiwKLSAgICAiaCIsICJpIiwgImoiLCAiayIsICJsIiwgIm0iLCAibiIsICJvIiwKLSAgICAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwKLSAgICAieCIsICJ5IiwgInoiLCAiYnJhY2VsZWZ0IiwgImJhciIsICJicmFjZXJpZ2h0IiwgImFzY2lpdGlsZGUiLCBOVUxMLAotICAgICJidWxsZXQzIiwgImRhZ2dlciIsICJkYWdnZXJkYmwiLCAiZWxsaXBzaXMiLCAiZW1kYXNoIiwgImVuZGFzaCIsICJmbG9yaW4iLCAiZnJhY3Rpb24iLAotICAgICJndWlsc2luZ2xsZWZ0IiwgImd1aWxzaW5nbHJpZ2h0IiwgIm1pbnVzIiwgInBlcnRob3VzYW5kIiwgInF1b3RlZGJsYmFzZSIsICJxdW90ZWRibGxlZnQiLCAicXVvdGVkYmxyaWdodCIsICJxdW90ZWxlZnQiLAotICAgICJxdW90ZXJpZ2h0IiwgInF1b3Rlc2luZ2xiYXNlIiwgInRyYWRlbWFyayIsICJmaSIsICJmbCIsICJMc2xhc2giLCAiT0UiLCAiU2Nhcm9uIiwKLSAgICAiWWRpZXJlc2lzIiwgIlpjYXJvbjIiLCAiZG90bGVzc2kiLCAibHNsYXNoIiwgIm9lIiwgInNjYXJvbiIsICJ6Y2Fyb24yIiwgTlVMTCwKLSAgICAiRXVybyIsICJleGNsYW1kb3duIiwgImNlbnQiLCAic3RlcmxpbmciLCAiY3VycmVuY3kiLCAieWVuIiwgImJyb2tlbmJhciIsICJzZWN0aW9uIiwKLSAgICAiZGllcmVzaXMiLCAiY29weXJpZ2h0IiwgIm9yZGZlbWluaW5lIiwgImd1aWxsZW1vdGxlZnQ0IiwgImxvZ2ljYWxub3QiLCBOVUxMLCAicmVnaXN0ZXJlZCIsICJtYWNyb24iLAotICAgICJkZWdyZWUiLCAicGx1c21pbnVzIiwgInR3b3N1cGVyaW9yIiwgInRocmVlc3VwZXJpb3IiLCAiYWN1dGUiLCAibXUiLCAicGFyYWdyYXBoIiwgInBlcmlvZGNlbnRlcmVkIiwKLSAgICAiY2VkaWxsYSIsICJvbmVzdXBlcmlvciIsICJvcmRtYXNjdWxpbmUiLCAiZ3VpbGxlbW90cmlnaHQ0IiwgIm9uZXF1YXJ0ZXIiLCAib25laGFsZiIsICJ0aHJlZXF1YXJ0ZXJzIiwgInF1ZXN0aW9uZG93biIsCi0gICAgIkFncmF2ZSIsICJBYWN1dGUiLCAiQWNpcmN1bWZsZXgiLCAiQXRpbGRlIiwgIkFkaWVyZXNpcyIsICJBcmluZyIsICJBRSIsICJDY2VkaWxsYSIsCi0gICAgIkVncmF2ZSIsICJFYWN1dGUiLCAiRWNpcmN1bWZsZXgiLCAiRWRpZXJlc2lzIiwgIklncmF2ZSIsICJJYWN1dGUiLCAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwKLSAgICAiRXRoIiwgIk50aWxkZSIsICJPZ3JhdmUiLCAiT2FjdXRlIiwgIk9jaXJjdW1mbGV4IiwgIk90aWxkZSIsICJPZGllcmVzaXMiLCAibXVsdGlwbHkiLAotICAgICJPc2xhc2giLCAiVWdyYXZlIiwgIlVhY3V0ZSIsICJVY2lyY3VtZmxleCIsICJVZGllcmVzaXMiLCAiWWFjdXRlIiwgIlRob3JuIiwgImdlcm1hbmRibHMiLAotICAgICJhZ3JhdmUiLCAiYWFjdXRlIiwgImFjaXJjdW1mbGV4IiwgImF0aWxkZSIsICJhZGllcmVzaXMiLCAiYXJpbmciLCAiYWUiLCAiY2NlZGlsbGEiLAotICAgICJlZ3JhdmUiLCAiZWFjdXRlIiwgImVjaXJjdW1mbGV4IiwgImVkaWVyZXNpcyIsICJpZ3JhdmUiLCAiaWFjdXRlIiwgImljaXJjdW1mbGV4IiwgImlkaWVyZXNpcyIsCi0gICAgImV0aCIsICJudGlsZGUiLCAib2dyYXZlIiwgIm9hY3V0ZSIsICJvY2lyY3VtZmxleCIsICJvdGlsZGUiLCAib2RpZXJlc2lzIiwgImRpdmlkZSIsCi0gICAgIm9zbGFzaCIsICJ1Z3JhdmUiLCAidWFjdXRlIiwgInVjaXJjdW1mbGV4IiwgInVkaWVyZXNpcyIsICJ5YWN1dGUiLCAidGhvcm4iLCAieWRpZXJlc2lzIiwKLX07Ci1jb25zdCBGWF9MUENTVFIgIEFkb2JlU3ltYm9sRW5jb2RpbmdOYW1lc1syMjRdID0gewotICAgICJzcGFjZSIsICJleGNsYW0iLCAidW5pdmVyc2FsIiwgIm51bWJlcnNpZ24iLCAiZXhpc3RlbnRpYWwiLCAicGVyY2VudCIsICJhbXBlcnNhbmQiLCAic3VjaHRoYXQiLAotICAgICJwYXJlbmxlZnQiLCAicGFyZW5yaWdodCIsICJhc3Rlcmlza21hdGgiLCAicGx1cyIsICJjb21tYSIsICJtaW51cyIsICJwZXJpb2QiLCAic2xhc2giLAotICAgICJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsCi0gICAgImVpZ2h0IiwgIm5pbmUiLCAiY29sb24iLCAic2VtaWNvbG9uIiwgImxlc3MiLCAiZXF1YWwiLCAiZ3JlYXRlciIsICJxdWVzdGlvbiIsCi0gICAgImNvbmdydWVudCIsICJBbHBoYSIsICJCZXRhIiwgIkNoaSIsICJEZWx0YSIsICJFcHNpbG9uIiwgIlBoaSIsICJHYW1tYSIsCi0gICAgIkV0YSIsICJJb3RhIiwgInRoZXRhMSIsICJLYXBwYSIsICJMYW1iZGEiLCAiTXUiLCAiTnUiLCAiT21pY3JvbiIsCi0gICAgIlBpIiwgIlRoZXRhIiwgIlJobyIsICJTaWdtYSIsICJUYXUiLCAiVXBzaWxvbiIsICJzaWdtYTEiLCAiT21lZ2EiLAotICAgICJYaSIsICJQc2kiLCAiWmV0YSIsICJicmFja2V0bGVmdCIsICJ0aGVyZWZvcmUiLCAiYnJhY2tldHJpZ2h0IiwgInBlcnBlbmRpY3VsYXIiLCAidW5kZXJzY29yZSIsCi0gICAgInJhZGljYWxleCIsICJhbHBoYSIsICJiZXRhIiwgImNoaSIsICJkZWx0YSIsICJlcHNpbG9uIiwgInBoaSIsICJnYW1tYSIsCi0gICAgImV0YSIsICJpb3RhIiwgInBoaTEiLCAia2FwcGEiLCAibGFtYmRhIiwgIm11IiwgIm51IiwgIm9taWNyb24iLAotICAgICJwaSIsICJ0aGV0YSIsICJyaG8iLCAic2lnbWEiLCAidGF1IiwgInVwc2lsb24iLCAib21lZ2ExIiwgIm9tZWdhIiwKLSAgICAieGkiLCAicHNpIiwgInpldGEiLCAiYnJhY2VsZWZ0IiwgImJhciIsICJicmFjZXJpZ2h0IiwgInNpbWlsYXIiLCBOVUxMLAotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgIkV1cm8iLCAiVXBzaWxvbjEiLCAibWludXRlIiwgImxlc3NlcXVhbCIsICJmcmFjdGlvbiIsICJpbmZpbml0eSIsICJmbG9yaW4iLCAiY2x1YiIsCi0gICAgImRpYW1vbmQiLCAiaGVhcnQiLCAic3BhZGUiLCAiYXJyb3dib3RoIiwgImFycm93bGVmdCIsICJhcnJvd3VwIiwgImFycm93cmlnaHQiLCAiYXJyb3dkb3duIiwKLSAgICAiZGVncmVlIiwgInBsdXNtaW51cyIsICJzZWNvbmQiLCAiZ3JlYXRlcmVxdWFsIiwgIm11bHRpcGx5IiwgInByb3BvcnRpb25hbCIsICJwYXJ0aWFsZGlmZiIsICJidWxsZXQiLAotICAgICJkaXZpZGUiLCAibm90ZXF1YWwiLCAiZXF1aXZhbGVuY2UiLCAiYXBwcm94ZXF1YWwiLCAiZWxsaXBzaXMiLCAiYXJyb3d2ZXJ0ZXgiLCAiYXJyb3dob3JpemV4IiwgImNhcnJpYWdlcmV0dXJuIiwKLSAgICAiYWxlcGgiLCAiSWZyYWt0dXIiLCAiUmZyYWt0dXIiLCAid2VpZXJzdHJhc3MiLCAiY2lyY2xlbXVsdGlwbHkiLCAiY2lyY2xlcGx1cyIsICJlbXB0eXNldCIsICJpbnRlcnNlY3Rpb24iLAotICAgICJ1bmlvbiIsICJwcm9wZXJzdXBlcnNldCIsICJyZWZsZXhzdXBlcnNldCIsICJub3RzdWJzZXQiLCAicHJvcGVyc3Vic2V0IiwgInJlZmxleHN1YnNldCIsICJlbGVtZW50IiwgIm5vdGVsZW1lbnQiLAotICAgICJhbmdsZSIsICJncmFkaWVudCIsICJyZWdpc3RlcnNlcmlmIiwgImNvcHlyaWdodHNlcmlmIiwgInRyYWRlbWFya3NlcmlmIiwgInByb2R1Y3QiLCAicmFkaWNhbCIsICJkb3RtYXRoIiwKLSAgICAibG9naWNhbG5vdCIsICJsb2dpY2FsYW5kIiwgImxvZ2ljYWxvciIsICJhcnJvd2RibGJvdGgiLCAiYXJyb3dkYmxsZWZ0IiwgImFycm93ZGJsdXAiLCAiYXJyb3dkYmxyaWdodCIsICJhcnJvd2RibGRvd24iLAotICAgICJsb3plbmdlIiwgImFuZ2xlbGVmdCIsICJyZWdpc3RlcnNhbnMiLCAiY29weXJpZ2h0c2FucyIsICJ0cmFkZW1hcmtzYW5zIiwgInN1bW1hdGlvbiIsICJwYXJlbmxlZnR0cCIsICJwYXJlbmxlZnRleCIsCi0gICAgInBhcmVubGVmdGJ0IiwgImJyYWNrZXRsZWZ0dHAiLCAiYnJhY2tldGxlZnRleCIsICJicmFja2V0bGVmdGJ0IiwgImJyYWNlbGVmdHRwIiwgImJyYWNlbGVmdG1pZCIsICJicmFjZWxlZnRidCIsICJicmFjZWV4IiwKLSAgICBOVUxMLCAiYW5nbGVyaWdodCIsICJpbnRlZ3JhbCIsICJpbnRlZ3JhbHRwIiwgImludGVncmFsZXgiLCAiaW50ZWdyYWxidCIsICJwYXJlbnJpZ2h0dHAiLCAicGFyZW5yaWdodGV4IiwKLSAgICAicGFyZW5yaWdodGJ0IiwgImJyYWNrZXRyaWdodHRwIiwgImJyYWNrZXRyaWdodGV4IiwgImJyYWNrZXRyaWdodGJ0IiwgImJyYWNlcmlnaHR0cCIsICJicmFjZXJpZ2h0bWlkIiwgImJyYWNlcmlnaHRidCIsIE5VTEwsCi19OwotY29uc3QgRlhfTFBDU1RSICBaYXBmRW5jb2RpbmdOYW1lc1syMjRdID0gewotICAgICJzcGFjZSIsICJhMSIsICJhMiIsICJhMjAyIiwgImEzIiwgImE0IiwgImE1IiwgImExMTkiLAotICAgICJhMTE4IiwgImExMTciLCAiYTExIiwgImExMiIsICJhMTMiLCAiYTE0IiwgImExNSIsICJhMTYiLAotICAgICJhMTA1IiwgImExNyIsICJhMTgiLCAiYTE5IiwgImEyMCIsICJhMjEiLCAiYTIyIiwgImEyMyIsCi0gICAgImEyNCIsICJhMjUiLCAiYTI2IiwgImEyNyIsICJhMjgiLCAiYTYiLCAiYTciLCAiYTgiLAotICAgICJhOSIsICJhMTAiLCAiYTI5IiwgImEzMCIsICJhMzEiLCAiYTMyIiwgImEzMyIsICJhMzQiLAotICAgICJhMzUiLCAiYTM2IiwgImEzNyIsICJhMzgiLCAiYTM5IiwgImE0MCIsICJhNDEiLCAiYTQyIiwKLSAgICAiYTQzIiwgImE0NCIsICJhNDUiLCAiYTQ2IiwgImE0NyIsICJhNDgiLCAiYTQ5IiwgImE1MCIsCi0gICAgImE1MSIsICJhNTIiLCAiYTUzIiwgImE1NCIsICJhNTUiLCAiYTU2IiwgImE1NyIsICJhNTgiLAotICAgICJhNTkiLCAiYTYwIiwgImE2MSIsICJhNjIiLCAiYTYzIiwgImE2NCIsICJhNjUiLCAiYTY2IiwKLSAgICAiYTY3IiwgImE2OCIsICJhNjkiLCAiYTcwIiwgImE3MSIsICJhNzIiLCAiYTczIiwgImE3NCIsCi0gICAgImEyMDMiLCAiYTc1IiwgImEyMDQiLCAiYTc2IiwgImE3NyIsICJhNzgiLCAiYTc5IiwgImE4MSIsCi0gICAgImE4MiIsICJhODMiLCAiYTg0IiwgImE5NyIsICJhOTgiLCAiYTk5IiwgImExMDAiLCBOVUxMLAotICAgICJhODkiLCAiYTkwIiwgImE5MyIsICJhOTQiLCAiYTkxIiwgImE5MiIsICJhMjA1IiwgImE4NSIsCi0gICAgImEyMDYiLCAiYTg2IiwgImE4NyIsICJhODgiLCAiYTk1IiwgImE5NiIsIE5VTEwsIE5VTEwsCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgIE5VTEwsICJhMTAxIiwgImExMDIiLCAiYTEwMyIsICJhMTA0IiwgImExMDYiLCAiYTEwNyIsICJhMTA4IiwKLSAgICAiYTExMiIsICJhMTExIiwgImExMTAiLCAiYTEwOSIsICJhMTIwIiwgImExMjEiLCAiYTEyMiIsICJhMTIzIiwKLSAgICAiYTEyNCIsICJhMTI1IiwgImExMjYiLCAiYTEyNyIsICJhMTI4IiwgImExMjkiLCAiYTEzMCIsICJhMTMxIiwKLSAgICAiYTEzMiIsICJhMTMzIiwgImExMzQiLCAiYTEzNSIsICJhMTM2IiwgImExMzciLCAiYTEzOCIsICJhMTM5IiwKLSAgICAiYTE0MCIsICJhMTQxIiwgImExNDIiLCAiYTE0MyIsICJhMTQ0IiwgImExNDUiLCAiYTE0NiIsICJhMTQ3IiwKLSAgICAiYTE0OCIsICJhMTQ5IiwgImExNTAiLCAiYTE1MSIsICJhMTUyIiwgImExNTMiLCAiYTE1NCIsICJhMTU1IiwKLSAgICAiYTE1NiIsICJhMTU3IiwgImExNTgiLCAiYTE1OSIsICJhMTYwIiwgImExNjEiLCAiYTE2MyIsICJhMTY0IiwKLSAgICAiYTE5NiIsICJhMTY1IiwgImExOTIiLCAiYTE2NiIsICJhMTY3IiwgImExNjgiLCAiYTE2OSIsICJhMTcwIiwKLSAgICAiYTE3MSIsICJhMTcyIiwgImExNzMiLCAiYTE2MiIsICJhMTc0IiwgImExNzUiLCAiYTE3NiIsICJhMTc3IiwKLSAgICAiYTE3OCIsICJhMTc5IiwgImExOTMiLCAiYTE4MCIsICJhMTk5IiwgImExODEiLCAiYTIwMCIsICJhMTgyIiwKLSAgICBOVUxMLCAiYTIwMSIsICJhMTgzIiwgImExODQiLCAiYTE5NyIsICJhMTg1IiwgImExOTQiLCAiYTE5OCIsCi0gICAgImExODYiLCAiYTE5NSIsICJhMTg3IiwgImExODgiLCAiYTE4OSIsICJhMTkwIiwgImExOTEiLCBOVUxMCi19OwotY29uc3QgRlhfQ0hBUiogIFBERl9DaGFyTmFtZUZyb21QcmVkZWZpbmVkQ2hhclNldChpbnQgZW5jb2RpbmcsIEZYX0JZVEUgY2hhcmNvZGUpCi17Ci0gICAgaWYgKGVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfUERGRE9DKSB7Ci0gICAgICAgIGlmIChjaGFyY29kZSA8IDI0KSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBjaGFyY29kZSAtPSAyNDsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgX1VuaWNvZGVBbHQgeworICBGWF9XT1JEIG1fVW5pY29kZTsKKyAgY29uc3QgRlhfQ0hBUiogbV9BbHRlcjsKK30gVW5pY29kZUFsdHNbXSA9IHsKKyAgICB7MHgwMGEwLCAiICJ9LCAgICB7MHgwMGExLCAiISJ9LCAgIHsweDAwYTIsICJjIn0sICAgezB4MDBhMywgIlAifSwKKyAgICB7MHgwMGE0LCAibyJ9LCAgICB7MHgwMGE1LCAiWSJ9LCAgIHsweDAwYTYsICJ8In0sICAgezB4MDBhNywgIlMifSwKKyAgICB7MHgwMGE5LCAiKEMpIn0sICB7MHgwMGFhLCAiYSJ9LCAgIHsweDAwYWIsICI8PCJ9LCAgezB4MDBhYywgIi18In0sCisgICAgezB4MDBhZSwgIihSKSJ9LCAgezB4MDBhZiwgIi0ifSwgICB7MHgwMGIwLCAibyJ9LCAgIHsweDAwYjEsICIrLy0ifSwKKyAgICB7MHgwMGIyLCAiXjIifSwgICB7MHgwMGIzLCAiXjMifSwgIHsweDAwYjQsICInIn0sICAgezB4MDBiNSwgInUifSwKKyAgICB7MHgwMGI2LCAiUCJ9LCAgICB7MHgwMGI3LCAiLiJ9LCAgIHsweDAwYjksICJeMSJ9LCAgezB4MDBiYSwgIm8ifSwKKyAgICB7MHgwMGJiLCAiPj4ifSwgICB7MHgwMGJjLCAiMS80In0sIHsweDAwYmQsICIxLzIifSwgezB4MDBiZSwgIjMvNCJ9LAorICAgIHsweDAwYmYsICI/In0sICAgIHsweDAwYzAsICJBIn0sICAgezB4MDBjMSwgIkEifSwgICB7MHgwMGMyLCAiQSJ9LAorICAgIHsweDAwYzMsICJBIn0sICAgIHsweDAwYzQsICJBIn0sICAgezB4MDBjNSwgIkEifSwgICB7MHgwMGM2LCAiQUUifSwKKyAgICB7MHgwMGM3LCAiQyJ9LCAgICB7MHgwMGM4LCAiRSJ9LCAgIHsweDAwYzksICJFIn0sICAgezB4MDBjYSwgIkUifSwKKyAgICB7MHgwMGNiLCAiRSJ9LCAgICB7MHgwMGNjLCAiSSJ9LCAgIHsweDAwY2QsICJJIn0sICAgezB4MDBjZSwgIkkifSwKKyAgICB7MHgwMGNmLCAiSSJ9LCAgICB7MHgwMGQxLCAiTiJ9LCAgIHsweDAwZDIsICJPIn0sICAgezB4MDBkMywgIk8ifSwKKyAgICB7MHgwMGQ0LCAiTyJ9LCAgICB7MHgwMGQ1LCAiTyJ9LCAgIHsweDAwZDYsICJPIn0sICAgezB4MDBkNywgIngifSwKKyAgICB7MHgwMGQ4LCAiTyJ9LCAgICB7MHgwMGQ5LCAiVSJ9LCAgIHsweDAwZGEsICJVIn0sICAgezB4MDBkYiwgIlUifSwKKyAgICB7MHgwMGRjLCAiVSJ9LCAgICB7MHgwMGRkLCAiWSJ9LCAgIHsweDAwZGYsICJTIn0sICAgezB4MDBlMCwgImEifSwKKyAgICB7MHgwMGUxLCAiYSJ9LCAgICB7MHgwMGUyLCAiYSJ9LCAgIHsweDAwZTMsICJhIn0sICAgezB4MDBlNCwgImEifSwKKyAgICB7MHgwMGU1LCAiYSJ9LCAgICB7MHgwMGU2LCAiYWUifSwgIHsweDAwZTcsICJjIn0sICAgezB4MDBlOCwgImUifSwKKyAgICB7MHgwMGU5LCAiZSJ9LCAgICB7MHgwMGVhLCAiZSJ9LCAgIHsweDAwZWIsICJlIn0sICAgezB4MDBlYywgImkifSwKKyAgICB7MHgwMGVkLCAiaSJ9LCAgICB7MHgwMGVlLCAiaSJ9LCAgIHsweDAwZWYsICJpIn0sICAgezB4MDBmMSwgIm4ifSwKKyAgICB7MHgwMGYyLCAibyJ9LCAgICB7MHgwMGYzLCAibyJ9LCAgIHsweDAwZjQsICJvIn0sICAgezB4MDBmNSwgIm8ifSwKKyAgICB7MHgwMGY2LCAibyJ9LCAgICB7MHgwMGY3LCAiLyJ9LCAgIHsweDAwZjgsICJvIn0sICAgezB4MDBmOSwgInUifSwKKyAgICB7MHgwMGZhLCAidSJ9LCAgICB7MHgwMGZiLCAidSJ9LCAgIHsweDAwZmMsICJ1In0sICAgezB4MDBmZCwgInkifSwKKyAgICB7MHgwMGZmLCAieSJ9LCAgICB7MHgwMmIwLCAiaCJ9LCAgIHsweDAyYjIsICJqIn0sICAgezB4MDJiMywgInIifSwKKyAgICB7MHgwMmI3LCAidyJ9LCAgICB7MHgwMmI4LCAieSJ9LCAgIHsweDAyYjksICInIn0sICAgezB4MDJiYSwgIlwiIn0sCisgICAgezB4MDJiYiwgIicifSwgICAgezB4MDJiYywgIicifSwgICB7MHgwMmJkLCAiJyJ9LCAgIHsweDAyYmUsICInIn0sCisgICAgezB4MDJiZiwgIicifSwgICAgezB4MDJjMiwgIjwifSwgICB7MHgwMmMzLCAiPiJ9LCAgIHsweDAyYzQsICJeIn0sCisgICAgezB4MDJjNSwgInYifSwgICAgezB4MDJjNiwgIl4ifSwgICB7MHgwMmM3LCAidiJ9LCAgIHsweDAyYzgsICInIn0sCisgICAgezB4MDJjOSwgIi0ifSwgICAgezB4MDJjYSwgIicifSwgICB7MHgwMmNiLCAiJyJ9LCAgIHsweDAyY2MsICIuIn0sCisgICAgezB4MDJjZCwgIl8ifSwgICAgezB4MjAxMCwgIi0ifSwgICB7MHgyMDEyLCAiLSJ9LCAgIHsweDIwMTMsICItIn0sCisgICAgezB4MjAxNCwgIi0tIn0sICAgezB4MjAxNSwgIi0tIn0sICB7MHgyMDE2LCAifCJ9LCAgIHsweDIwMTcsICJfIn0sCisgICAgezB4MjAxOCwgIicifSwgICAgezB4MjAxOSwgIicifSwgICB7MHgyMDFhLCAiLCJ9LCAgIHsweDIwMWIsICInIn0sCisgICAgezB4MjAxYywgIlwiIn0sICAgezB4MjAxZCwgIlwiIn0sICB7MHgyMDFlLCAiLCJ9LCAgIHsweDIwMWYsICInIn0sCisgICAgezB4MjAyMCwgIisifSwgICAgezB4MjAyMSwgIisifSwgICB7MHgyMDIyLCAiKiJ9LCAgIHsweDIwMjMsICI+In0sCisgICAgezB4MjAyNCwgIi4ifSwgICAgezB4MjAyNSwgIi4uIn0sICB7MHgyMDI3LCAiLiJ9LCAgIHsweDIwMzIsICInIn0sCisgICAgezB4MjAzMywgIlwiIn0sICAgezB4MjAzNSwgIicifSwgICB7MHgyMDM2LCAiXCIifSwgIHsweDIwMzgsICJeIn0sCisgICAgezB4MjAzOSwgIjwifSwgICAgezB4MjAzYSwgIj4ifSwgICB7MHgyMDNiLCAiKiJ9LCAgIHsweDIwM2MsICIhISJ9LAorICAgIHsweDIwM2QsICI/ISJ9LCAgIHsweDIwM2UsICItIn0sICAgezB4MjA0NCwgIi8ifSwgICB7MHgyMDQ3LCAiPz8ifSwKKyAgICB7MHgyMDQ4LCAiPyEifSwgICB7MHgyMDQ5LCAiIT8ifSwgIHsweDIwNGUsICIqIn0sICAgezB4MjA1MiwgIiUifSwKKyAgICB7MHgyMTIyLCAiKFRNKSJ9LCB7MHgyMjEyLCAiLSJ9LCAgIHsweDIyMTUsICIvIn0sICAgezB4MjIxNiwgIlxcIn0sCisgICAgezB4MjIxNywgIioifSwgICAgezB4MjIxOCwgIioifSwgICB7MHgyMjE5LCAiKiJ9LCAgIHsweDIyMjMsICJ8In0sCisgICAgezB4MjJjNSwgIi4ifSwgICAgezB4MjY2ZiwgIiMifSwgICB7MFhGNkQ5LCAiKEMpIn0sIHswWEY2REEsICIoQykifSwKKyAgICB7MFhGNkRCLCAiKFRNKSJ9LCB7MFhGOEU4LCAiKEMpIn0sIHsweGY4ZTksICIoQykifSwgezBYRjhFQSwgIihUTSkifSwKKyAgICB7MHhmYjAxLCAiZmkifSwgICB7MHhmYjAyLCAiZmwifX07Citjb25zdCBGWF9DSEFSKiBGQ1NfR2V0QWx0U3RyKEZYX1dDSEFSIHVuaWNvZGUpIHsKKyAgaW50IGJlZ2luID0gMDsKKyAgaW50IGVuZCA9IHNpemVvZiBVbmljb2RlQWx0cyAvIHNpemVvZihzdHJ1Y3QgX1VuaWNvZGVBbHQpIC0gMTsKKyAgd2hpbGUgKGJlZ2luIDw9IGVuZCkgeworICAgIGludCBtaWRkbGUgPSAoYmVnaW4gKyBlbmQpIC8gMjsKKyAgICBGWF9XT1JEIG1pZGRsZWNvZGUgPSBVbmljb2RlQWx0c1ttaWRkbGVdLm1fVW5pY29kZTsKKyAgICBpZiAobWlkZGxlY29kZSA+IHVuaWNvZGUpIHsKKyAgICAgIGVuZCA9IG1pZGRsZSAtIDE7CisgICAgfSBlbHNlIGlmIChtaWRkbGVjb2RlIDwgdW5pY29kZSkgeworICAgICAgYmVnaW4gPSBtaWRkbGUgKyAxOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChjaGFyY29kZSA8IDMyKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBjaGFyY29kZSAtPSAzMjsKKyAgICAgIHJldHVybiBVbmljb2RlQWx0c1ttaWRkbGVdLm1fQWx0ZXI7CiAgICAgfQotICAgIHN3aXRjaCAoZW5jb2RpbmcpIHsKLSAgICAgICAgY2FzZSBQREZGT05UX0VOQ09ESU5HX1dJTkFOU0k6Ci0gICAgICAgICAgICByZXR1cm4gQWRvYmVXaW5BbnNpRW5jb2RpbmdOYW1lc1tjaGFyY29kZV07Ci0gICAgICAgIGNhc2UgUERGRk9OVF9FTkNPRElOR19NQUNST01BTjoKLSAgICAgICAgICAgIHJldHVybiBNYWNSb21hbkVuY29kaW5nTmFtZXNbY2hhcmNvZGVdOwotICAgICAgICBjYXNlIFBERkZPTlRfRU5DT0RJTkdfTUFDRVhQRVJUOgotICAgICAgICAgICAgcmV0dXJuIE1hY0V4cGVydEVuY29kaW5nTmFtZXNbY2hhcmNvZGVdOwotICAgICAgICBjYXNlIFBERkZPTlRfRU5DT0RJTkdfU1RBTkRBUkQ6Ci0gICAgICAgICAgICByZXR1cm4gU3RhbmRhcmRFbmNvZGluZ05hbWVzW2NoYXJjb2RlXTsKLSAgICAgICAgY2FzZSBQREZGT05UX0VOQ09ESU5HX0FET0JFX1NZTUJPTDoKLSAgICAgICAgICAgIHJldHVybiBBZG9iZVN5bWJvbEVuY29kaW5nTmFtZXNbY2hhcmNvZGVdOwotICAgICAgICBjYXNlIFBERkZPTlRfRU5DT0RJTkdfWkFQRkRJTkdCQVRTOgotICAgICAgICAgICAgcmV0dXJuIFphcGZFbmNvZGluZ05hbWVzW2NoYXJjb2RlXTsKLSAgICAgICAgY2FzZSBQREZGT05UX0VOQ09ESU5HX1BERkRPQzoKLSAgICAgICAgICAgIHJldHVybiBQREZEb2NFbmNvZGluZ05hbWVzW2NoYXJjb2RlXTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIE5VTEw7CiB9Ci1GWF9XQ0hBUiBGVF9Vbmljb2RlRnJvbUNoYXJDb2RlKGludCBlbmNvZGluZywgRlhfRFdPUkQgY2hhcmNvZGUpCi17Ci0gICAgc3dpdGNoIChlbmNvZGluZykgewotICAgICAgICBjYXNlIEZYRlRfRU5DT0RJTkdfVU5JQ09ERToKLSAgICAgICAgICAgIHJldHVybiAoRlhfV09SRCljaGFyY29kZTsKLSAgICAgICAgY2FzZSBGWEZUX0VOQ09ESU5HX0FET0JFX1NUQU5EQVJEOgotICAgICAgICAgICAgcmV0dXJuIFN0YW5kYXJkRW5jb2RpbmdbKEZYX0JZVEUpY2hhcmNvZGVdOwotICAgICAgICBjYXNlIEZYRlRfRU5DT0RJTkdfQURPQkVfRVhQRVJUOgotICAgICAgICAgICAgcmV0dXJuIE1hY0V4cGVydEVuY29kaW5nWyhGWF9CWVRFKWNoYXJjb2RlXTsKLSAgICAgICAgY2FzZSBGWEZUX0VOQ09ESU5HX0FET0JFX0xBVElOXzE6Ci0gICAgICAgICAgICByZXR1cm4gQWRvYmVXaW5BbnNpRW5jb2RpbmdbKEZYX0JZVEUpY2hhcmNvZGVdOwotICAgICAgICBjYXNlIEZYRlRfRU5DT0RJTkdfQVBQTEVfUk9NQU46Ci0gICAgICAgICAgICByZXR1cm4gTWFjUm9tYW5FbmNvZGluZ1soRlhfQllURSljaGFyY29kZV07Ci0gICAgICAgIGNhc2UgUERGRk9OVF9FTkNPRElOR19QREZET0M6Ci0gICAgICAgICAgICByZXR1cm4gUERGRG9jRW5jb2RpbmdbKEZYX0JZVEUpY2hhcmNvZGVdOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLXN0YXRpYyBGWF9EV09SRCBQREZfRmluZENvZGUoY29uc3QgRlhfV09SRCogcENvZGVzLCBGWF9XT1JEIHVuaWNvZGUpCi17Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IDI1NjsgaSArKykKLSAgICAgICAgaWYgKHBDb2Rlc1tpXSA9PSB1bmljb2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotICAgIHJldHVybiAwOwotfQotY29uc3QgRlhfV09SRCBNU1N5bWJvbEVuY29kaW5nWzI1Nl0gPSB7Ci0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDMyLCAzMywgODcwNCwgMzUsIDg3MDcsIDM3LCAzOCwgODcxNSwKLSAgICA0MCwgNDEsIDg3MjcsIDQzLCA0NCwgODcyMiwgNDYsIDQ3LCA0OCwgNDksCi0gICAgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksCi0gICAgNjAsIDYxLCA2MiwgNjMsIDg3NzMsIDkxMywgOTE0LCA5MzUsIDkxNiwgOTE3LAotICAgIDkzNCwgOTE1LCA5MTksIDkyMSwgOTc3LCA5MjIsIDkyMywgOTI0LCA5MjUsIDkyNywKLSAgICA5MjgsIDkyMCwgOTI5LCA5MzEsIDkzMiwgOTMzLCA5NjIsIDkzNywgOTI2LCA5MzYsCi0gICAgOTE4LCA5MSwgODc1NiwgOTMsIDg4NjksIDk1LCA4MjU0LCA5NDUsIDk0NiwgOTY3LAotICAgIDk0OCwgOTQ5LCA5NjYsIDk0NywgOTUxLCA5NTMsIDk4MSwgOTU0LCA5NTUsIDk1NiwKLSAgICA5NTcsIDk1OSwgOTYwLCA5NTIsIDk2MSwgOTYzLCA5NjQsIDk2NSwgOTgyLCA5NjksCi0gICAgOTU4LCA5NjgsIDk1MCwgMTIzLCAxMjQsIDEyNSwgODc2NCwgMCwgMCwgMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDk3OCwgODI0MiwgODgwNCwgODcyNSwgODczNCwgNDAyLCA5ODI3LCA5ODMwLCA5ODI4LAotICAgIDk4MjQsIDg1OTYsIDg1OTIsIDg1OTMsIDg1OTQsIDg1OTUsIDE3NiwgMTc3LCA4MjQzLCA4ODA1LAotICAgIDIxNSwgODczMywgODcwNiwgODcyOSwgMjQ3LCA4ODAwLCA4ODAxLCA4Nzc2LCA4OTQzLCAwLAotICAgIDAsIDg2MjksIDAsIDg0NjUsIDg0NzYsIDg0NzIsIDg4NTUsIDg4NTMsIDg3MDksIDg3NDUsCi0gICAgODc0NiwgODgzNSwgODgzOSwgODgzNiwgODgzNCwgODgzOCwgODcxMiwgODcxMywgODczNiwgODcxMSwKLSAgICAxNzQsIDE2OSwgODQ4MiwgODcxOSwgODczMCwgODkwMSwgMTcyLCA4NzQzLCA4NzQ0LCA4NjYwLAotICAgIDg2NTYsIDg2NTcsIDg2NTgsIDg2NTksIDk2NzQsIDkwMDEsIDAsIDAsIDAsIDg3MjEsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAweDAwMDAsIDkwMDIsIDg3NDcsIDg5OTIsIDAsIDg5OTMsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwCitzdGF0aWMgY29uc3QgRlhfV09SRCBTdGFuZGFyZEVuY29kaW5nWzI1Nl0gPSB7CisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKyAgICAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDIwMTksIDB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwgMHgwMDJjLAorICAgIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsCisgICAgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwgMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwKKyAgICAweDAwM2YsIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorICAgIDB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwgMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLCAweDAwNTAsCisgICAgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwKKyAgICAweDAwNWEsIDB4MDA1YiwgMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLCAweDIwMTgsIDB4MDA2MSwgMHgwMDYyLAorICAgIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsCisgICAgMHgwMDZjLCAweDAwNmQsIDB4MDA2ZSwgMHgwMDZmLCAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwKKyAgICAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LCAweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsIDB4MDA3YywgMHgwMDdkLAorICAgIDB4MDA3ZSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwYTEsCisgICAgMHgwMGEyLCAweDAwYTMsIDB4MjA0NCwgMHgwMGE1LCAweDAxOTIsIDB4MDBhNywgMHgwMGE0LCAweDAwMjcsIDB4MjAxYywKKyAgICAweDAwYWIsIDB4MjAzOSwgMHgyMDNhLCAweGZiMDEsIDB4ZmIwMiwgMHgwMDAwLCAweDIwMTMsIDB4MjAyMCwgMHgyMDIxLAorICAgIDB4MDBiNywgMHgwMDAwLCAweDAwYjYsIDB4MjAyMiwgMHgyMDFhLCAweDIwMWUsIDB4MjAxZCwgMHgwMGJiLCAweDIwMjYsCisgICAgMHgyMDMwLCAweDAwMDAsIDB4MDBiZiwgMHgwMDAwLCAweDAwNjAsIDB4MDBiNCwgMHgwMmM2LCAweDAyZGMsIDB4MDBhZiwKKyAgICAweDAyZDgsIDB4MDJkOSwgMHgwMGE4LCAweDAwMDAsIDB4MDJkYSwgMHgwMGI4LCAweDAwMDAsIDB4MDJkZCwgMHgwMmRiLAorICAgIDB4MDJjNywgMHgyMDE0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwYzYsIDB4MDAwMCwgMHgwMGFhLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDE0MSwgMHgwMGQ4LAorICAgIDB4MDE1MiwgMHgwMGJhLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMGU2LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDEzMSwgMHgwMDAwLCAweDAwMDAsIDB4MDE0MiwgMHgwMGY4LCAweDAxNTMsIDB4MDBkZiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDB9Oworc3RhdGljIGNvbnN0IEZYX1dPUkQgTWFjUm9tYW5FbmNvZGluZ1syNTZdID0geworICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsCisgICAgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LCAweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsIDB4MDAyYywKKyAgICAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLCAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LAorICAgIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsIDB4MDAzYywgMHgwMDNkLCAweDAwM2UsCisgICAgMHgwMDNmLCAweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKyAgICAweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsIDB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwgMHgwMDUwLAorICAgIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksCisgICAgMHgwMDVhLCAweDAwNWIsIDB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwKKyAgICAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLAorICAgIDB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsCisgICAgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywgMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLCAweDAwN2MsIDB4MDA3ZCwKKyAgICAweDAwN2UsIDB4MDAwMCwgMHgwMGM0LCAweDAwYzUsIDB4MDBjNywgMHgwMGM5LCAweDAwZDEsIDB4MDBkNiwgMHgwMGRjLAorICAgIDB4MDBlMSwgMHgwMGUwLCAweDAwZTIsIDB4MDBlNCwgMHgwMGUzLCAweDAwZTUsIDB4MDBlNywgMHgwMGU5LCAweDAwZTgsCisgICAgMHgwMGVhLCAweDAwZWIsIDB4MDBlZCwgMHgwMGVjLCAweDAwZWUsIDB4MDBlZiwgMHgwMGYxLCAweDAwZjMsIDB4MDBmMiwKKyAgICAweDAwZjQsIDB4MDBmNiwgMHgwMGY1LCAweDAwZmEsIDB4MDBmOSwgMHgwMGZiLCAweDAwZmMsIDB4MjAyMCwgMHgwMGIwLAorICAgIDB4MDBhMiwgMHgwMGEzLCAweDAwYTcsIDB4MjAyMiwgMHgwMGI2LCAweDAwZGYsIDB4MDBhZSwgMHgwMGE5LCAweDIxMjIsCisgICAgMHgwMGI0LCAweDAwYTgsIDB4MDAwMCwgMHgwMGM2LCAweDAwZDgsIDB4MDAwMCwgMHgwMGIxLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwYTUsIDB4MDBiNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDBhYSwgMHgwMGJhLAorICAgIDB4MDAwMCwgMHgwMGU2LCAweDAwZjgsIDB4MDBiZiwgMHgwMGEzLCAweDAwYWMsIDB4MDAwMCwgMHgwMTkyLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwYWIsIDB4MDBiYiwgMHgyMDI2LCAweDAwMjAsIDB4MDBjMCwgMHgwMGMzLCAweDAwZDUsIDB4MDE1MiwKKyAgICAweDAxNTMsIDB4MjAxMywgMHgyMDE0LCAweDIwMWMsIDB4MjAxZCwgMHgyMDE4LCAweDIwMTksIDB4MDBmNywgMHgwMDAwLAorICAgIDB4MDBmZiwgMHgwMTc4LCAweDIwNDQsIDB4MDBhNCwgMHgyMDM5LCAweDIwM2EsIDB4ZmIwMSwgMHhmYjAyLCAweDIwMjEsCisgICAgMHgwMGI3LCAweDIwMWEsIDB4MjAxZSwgMHgyMDMwLCAweDAwYzIsIDB4MDBjYSwgMHgwMGMxLCAweDAwY2IsIDB4MDBjOCwKKyAgICAweDAwY2QsIDB4MDBjZSwgMHgwMGNmLCAweDAwY2MsIDB4MDBkMywgMHgwMGQ0LCAweDAwMDAsIDB4MDBkMiwgMHgwMGRhLAorICAgIDB4MDBkYiwgMHgwMGQ5LCAweDAxMzEsIDB4MDJjNiwgMHgwMmRjLCAweDAwYWYsIDB4MDJkOCwgMHgwMmQ5LCAweDAyZGEsCisgICAgMHgwMGI4LCAweDAyZGQsIDB4MDJkYiwgMHgwMmM3fTsKK3N0YXRpYyBjb25zdCBGWF9XT1JEIEFkb2JlV2luQW5zaUVuY29kaW5nWzI1Nl0gPSB7CisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKyAgICAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsIDB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwgMHgwMDJjLAorICAgIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsCisgICAgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwgMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwKKyAgICAweDAwM2YsIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorICAgIDB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwgMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLCAweDAwNTAsCisgICAgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwKKyAgICAweDAwNWEsIDB4MDA1YiwgMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLCAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLAorICAgIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsCisgICAgMHgwMDZjLCAweDAwNmQsIDB4MDA2ZSwgMHgwMDZmLCAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwKKyAgICAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LCAweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsIDB4MDA3YywgMHgwMDdkLAorICAgIDB4MDA3ZSwgMHgyMDIyLCAweDIwYWMsIDB4MjAyMiwgMHgyMDFhLCAweDAxOTIsIDB4MjAxZSwgMHgyMDI2LCAweDIwMjAsCisgICAgMHgyMDIxLCAweDAyYzYsIDB4MjAzMCwgMHgwMTYwLCAweDIwMzksIDB4MDE1MiwgMHgyMDIyLCAweDAxN2QsIDB4MjAyMiwKKyAgICAweDIwMjIsIDB4MjAxOCwgMHgyMDE5LCAweDIwMWMsIDB4MjAxZCwgMHgyMDIyLCAweDIwMTMsIDB4MjAxNCwgMHgwMmRjLAorICAgIDB4MjEyMiwgMHgwMTYxLCAweDIwM2EsIDB4MDE1MywgMHgyMDIyLCAweDAxN2UsIDB4MDE3OCwgMHgwMDIwLCAweDAwYTEsCisgICAgMHgwMGEyLCAweDAwYTMsIDB4MDBhNCwgMHgwMGE1LCAweDAwYTYsIDB4MDBhNywgMHgwMGE4LCAweDAwYTksIDB4MDBhYSwKKyAgICAweDAwYWIsIDB4MDBhYywgMHgwMDJkLCAweDAwYWUsIDB4MDBhZiwgMHgwMGIwLCAweDAwYjEsIDB4MDBiMiwgMHgwMGIzLAorICAgIDB4MDBiNCwgMHgwMGI1LCAweDAwYjYsIDB4MDBiNywgMHgwMGI4LCAweDAwYjksIDB4MDBiYSwgMHgwMGJiLCAweDAwYmMsCisgICAgMHgwMGJkLCAweDAwYmUsIDB4MDBiZiwgMHgwMGMwLCAweDAwYzEsIDB4MDBjMiwgMHgwMGMzLCAweDAwYzQsIDB4MDBjNSwKKyAgICAweDAwYzYsIDB4MDBjNywgMHgwMGM4LCAweDAwYzksIDB4MDBjYSwgMHgwMGNiLCAweDAwY2MsIDB4MDBjZCwgMHgwMGNlLAorICAgIDB4MDBjZiwgMHgwMGQwLCAweDAwZDEsIDB4MDBkMiwgMHgwMGQzLCAweDAwZDQsIDB4MDBkNSwgMHgwMGQ2LCAweDAwZDcsCisgICAgMHgwMGQ4LCAweDAwZDksIDB4MDBkYSwgMHgwMGRiLCAweDAwZGMsIDB4MDBkZCwgMHgwMGRlLCAweDAwZGYsIDB4MDBlMCwKKyAgICAweDAwZTEsIDB4MDBlMiwgMHgwMGUzLCAweDAwZTQsIDB4MDBlNSwgMHgwMGU2LCAweDAwZTcsIDB4MDBlOCwgMHgwMGU5LAorICAgIDB4MDBlYSwgMHgwMGViLCAweDAwZWMsIDB4MDBlZCwgMHgwMGVlLCAweDAwZWYsIDB4MDBmMCwgMHgwMGYxLCAweDAwZjIsCisgICAgMHgwMGYzLCAweDAwZjQsIDB4MDBmNSwgMHgwMGY2LCAweDAwZjcsIDB4MDBmOCwgMHgwMGY5LCAweDAwZmEsIDB4MDBmYiwKKyAgICAweDAwZmMsIDB4MDBmZCwgMHgwMGZlLCAweDAwZmZ9Oworc3RhdGljIGNvbnN0IEZYX1dPUkQgTWFjRXhwZXJ0RW5jb2RpbmdbMjU2XSA9IHsKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDIwLCAweGY3MjEsIDB4ZjZmOCwgMHhmN2EyLAorICAgIDB4ZjcyNCwgMHhmNmU0LCAweGY3MjYsIDB4ZjdiNCwgMHgyMDdkLCAweDIwN2UsIDB4MjAyNSwgMHgyMDI0LCAweDAwMmMsCisgICAgMHgwMDJkLCAweDAwMmUsIDB4MjA0NCwgMHhmNzMwLCAweGY3MzEsIDB4ZjczMiwgMHhmNzMzLCAweGY3MzQsIDB4ZjczNSwKKyAgICAweGY3MzYsIDB4ZjczNywgMHhmNzM4LCAweGY3MzksIDB4MDAzYSwgMHgwMDNiLCAweDAwMDAsIDB4ZjZkZSwgMHgwMDAwLAorICAgIDB4ZjczZiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweGY3ZjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwYmMsCisgICAgMHgwMGJkLCAweDAwYmUsIDB4MjE1YiwgMHgyMTVjLCAweDIxNWQsIDB4MjE1ZSwgMHgyMTUzLCAweDIxNTQsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHhmYjAwLCAweGZiMDEsIDB4ZmIwMiwgMHhmYjAzLAorICAgIDB4ZmIwNCwgMHgyMDhkLCAweDAwMDAsIDB4MjA4ZSwgMHhmNmY2LCAweGY2ZTUsIDB4Zjc2MCwgMHhmNzYxLCAweGY3NjIsCisgICAgMHhmNzYzLCAweGY3NjQsIDB4Zjc2NSwgMHhmNzY2LCAweGY3NjcsIDB4Zjc2OCwgMHhmNzY5LCAweGY3NmEsIDB4Zjc2YiwKKyAgICAweGY3NmMsIDB4Zjc2ZCwgMHhmNzZlLCAweGY3NmYsIDB4Zjc3MCwgMHhmNzcxLCAweGY3NzIsIDB4Zjc3MywgMHhmNzc0LAorICAgIDB4Zjc3NSwgMHhmNzc2LCAweGY3NzcsIDB4Zjc3OCwgMHhmNzc5LCAweGY3N2EsIDB4MjBhMSwgMHhmNmRjLCAweGY2ZGQsCisgICAgMHhmNmZlLCAweDAwMDAsIDB4MDAwMCwgMHhmNmU5LCAweGY2ZTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweGY3ZTEsIDB4ZjdlMCwgMHhmN2UyLCAweGY3ZTQsIDB4ZjdlMywgMHhmN2U1LCAweGY3ZTcsIDB4ZjdlOSwgMHhmN2U4LAorICAgIDB4ZjdlYSwgMHhmN2ViLCAweGY3ZWQsIDB4ZjdlYywgMHhmN2VlLCAweGY3ZWYsIDB4ZjdmMSwgMHhmN2YzLCAweGY3ZjIsCisgICAgMHhmN2Y0LCAweGY3ZjYsIDB4ZjdmNSwgMHhmN2ZhLCAweGY3ZjksIDB4ZjdmYiwgMHhmN2ZjLCAweDAwMDAsIDB4MjA3OCwKKyAgICAweDIwODQsIDB4MjA4MywgMHgyMDg2LCAweDIwODgsIDB4MjA4NywgMHhmNmZkLCAweDAwMDAsIDB4ZjZkZiwgMHgyMDgyLAorICAgIDB4MDAwMCwgMHhmN2E4LCAweDAwMDAsIDB4ZjZmNSwgMHhmNmZkLCAweDIwODUsIDB4MDAwMCwgMHhmNmUxLCAweGY2ZTcsCisgICAgMHhmN2ZkLCAweDAwMDAsIDB4ZjZlMywgMHgwMDAwLCAweDAwMDAsIDB4ZjdmZSwgMHgwMDAwLCAweDIwODksIDB4MjA4MCwKKyAgICAweGY2ZmYsIDB4ZjdlNiwgMHhmN2Y4LCAweGY3YmYsIDB4MjA4MSwgMHhmNmU5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ZjdiOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHhmNmZhLCAweDIwMTIsIDB4ZjZlNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweGY3YTEsIDB4MDAwMCwKKyAgICAweGY3ZmYsIDB4MDAwMCwgMHgwMGI5LCAweDAwYjIsIDB4MDBiMywgMHgyMDc0LCAweDIwNzUsIDB4MjA3NiwgMHgyMDc3LAorICAgIDB4MjA3OSwgMHgyMDcwLCAweDAwMDAsIDB4ZjZlYywgMHhmNmYxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweGY2ZWQsCisgICAgMHhmNmYyLCAweGY2ZWIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweGY2ZWUsIDB4ZjZmYiwKKyAgICAweGY2ZjQsIDB4ZjdhZiwgMHhmNmVhLCAweDIwN2YsIDB4ZjZlZiwgMHhmNmUyLCAweGY2ZTgsIDB4ZjZmNywgMHhmNmZjLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMH07CitzdGF0aWMgY29uc3QgRlhfV09SRCBBZG9iZVN5bWJvbEVuY29kaW5nWzI1Nl0gPSB7CisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAyMCwgMHgwMDIxLCAweDIyMDAsIDB4MDAyMywKKyAgICAweDIyMDMsIDB4MDAyNSwgMHgwMDI2LCAweDIyMEIsIDB4MDAyOCwgMHgwMDI5LCAweDIyMTcsIDB4MDAyQiwgMHgwMDJDLAorICAgIDB4MjIxMiwgMHgwMDJFLCAweDAwMkYsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsCisgICAgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLCAweDAwM0QsIDB4MDAzRSwKKyAgICAweDAwM0YsIDB4MjI0NSwgMHgwMzkxLCAweDAzOTIsIDB4MDNBNywgMHgwMzk0LCAweDAzOTUsIDB4MDNBNiwgMHgwMzkzLAorICAgIDB4MDM5NywgMHgwMzk5LCAweDAzRDEsIDB4MDM5QSwgMHgwMzlCLCAweDAzOUMsIDB4MDM5RCwgMHgwMzlGLCAweDAzQTAsCisgICAgMHgwMzk4LCAweDAzQTEsIDB4MDNBMywgMHgwM0E0LCAweDAzQTUsIDB4MDNDMiwgMHgwM0E5LCAweDAzOUUsIDB4MDNBOCwKKyAgICAweDAzOTYsIDB4MDA1QiwgMHgyMjM0LCAweDAwNUQsIDB4MjJBNSwgMHgwMDVGLCAweEY4RTUsIDB4MDNCMSwgMHgwM0IyLAorICAgIDB4MDNDNywgMHgwM0I0LCAweDAzQjUsIDB4MDNDNiwgMHgwM0IzLCAweDAzQjcsIDB4MDNCOSwgMHgwM0Q1LCAweDAzQkEsCisgICAgMHgwM0JCLCAweDAzQkMsIDB4MDNCRCwgMHgwM0JGLCAweDAzQzAsIDB4MDNCOCwgMHgwM0MxLCAweDAzQzMsIDB4MDNDNCwKKyAgICAweDAzQzUsIDB4MDNENiwgMHgwM0M5LCAweDAzQkUsIDB4MDNDOCwgMHgwM0I2LCAweDAwN0IsIDB4MDA3QywgMHgwMDdELAorICAgIDB4MjIzQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMEFDLCAweDAzRDIsCisgICAgMHgyMDMyLCAweDIyNjQsIDB4MjA0NCwgMHgyMjFFLCAweDAxOTIsIDB4MjY2MywgMHgyNjY2LCAweDI2NjUsIDB4MjY2MCwKKyAgICAweDIxOTQsIDB4MjE5MCwgMHgyMTkxLCAweDIxOTIsIDB4MjE5MywgMHgwMEIwLCAweDAwQjEsIDB4MjAzMywgMHgyMjY1LAorICAgIDB4MDBENywgMHgyMjFELCAweDIyMDIsIDB4MjAyMiwgMHgwMEY3LCAweDIyNjAsIDB4MjI2MSwgMHgyMjQ4LCAweDIwMjYsCisgICAgMHhGOEU2LCAweEY4RTcsIDB4MjFCNSwgMHgyMTM1LCAweDIxMTEsIDB4MjExQywgMHgyMTE4LCAweDIyOTcsIDB4MjI5NSwKKyAgICAweDIyMDUsIDB4MjIyOSwgMHgyMjJBLCAweDIyODMsIDB4MjI4NywgMHgyMjg0LCAweDIyODIsIDB4MjI4NiwgMHgyMjA4LAorICAgIDB4MjIwOSwgMHgyMjIwLCAweDIyMDcsIDB4RjZEQSwgMHhGNkQ5LCAweEY2REIsIDB4MjIwRiwgMHgyMjFBLCAweDIyQzUsCisgICAgMHgwMEFDLCAweDIyMjcsIDB4MjIyOCwgMHgyMUQ0LCAweDIxRDAsIDB4MjFEMSwgMHgyMUQyLCAweDIxRDMsIDB4MjVDQSwKKyAgICAweDIzMjksIDB4RjhFOCwgMHhGOEU5LCAweEY4RUEsIDB4MjIxMSwgMHhGOEVCLCAweEY4RUMsIDB4RjhFRCwgMHhGOEVFLAorICAgIDB4RjhFRiwgMHhGOEYwLCAweEY4RjEsIDB4RjhGMiwgMHhGOEYzLCAweEY4RjQsIDB4MDAwMCwgMHgyMzJBLCAweDIyMkIsCisgICAgMHgyMzIwLCAweEY4RjUsIDB4MjMyMSwgMHhGOEY2LCAweEY4RjcsIDB4RjhGOCwgMHhGOEY5LCAweEY4RkEsIDB4RjhGQiwKKyAgICAweEY4RkMsIDB4RjhGRCwgMHhGOEZFLCAweDAwMDAsCiB9OwotRlhfRFdPUkQgRlRfQ2hhckNvZGVGcm9tVW5pY29kZShpbnQgZW5jb2RpbmcsIEZYX1dDSEFSIHVuaWNvZGUpCi17Ci0gICAgc3dpdGNoIChlbmNvZGluZykgewotICAgICAgICBjYXNlIEZYRlRfRU5DT0RJTkdfVU5JQ09ERToKLSAgICAgICAgICAgIHJldHVybiB1bmljb2RlOwotICAgICAgICBjYXNlIEZYRlRfRU5DT0RJTkdfQURPQkVfU1RBTkRBUkQ6Ci0gICAgICAgICAgICByZXR1cm4gUERGX0ZpbmRDb2RlKFN0YW5kYXJkRW5jb2RpbmcsIHVuaWNvZGUpOwotICAgICAgICBjYXNlIEZYRlRfRU5DT0RJTkdfQURPQkVfRVhQRVJUOgotICAgICAgICAgICAgcmV0dXJuIFBERl9GaW5kQ29kZShNYWNFeHBlcnRFbmNvZGluZywgdW5pY29kZSk7Ci0gICAgICAgIGNhc2UgRlhGVF9FTkNPRElOR19BRE9CRV9MQVRJTl8xOgotICAgICAgICAgICAgcmV0dXJuIFBERl9GaW5kQ29kZShBZG9iZVdpbkFuc2lFbmNvZGluZywgdW5pY29kZSk7Ci0gICAgICAgIGNhc2UgRlhGVF9FTkNPRElOR19BUFBMRV9ST01BTjoKLSAgICAgICAgICAgIHJldHVybiBQREZfRmluZENvZGUoTWFjUm9tYW5FbmNvZGluZywgdW5pY29kZSk7Ci0gICAgICAgIGNhc2UgRlhGVF9FTkNPRElOR19BRE9CRV9DVVNUT006Ci0gICAgICAgICAgICByZXR1cm4gUERGX0ZpbmRDb2RlKFBERkRvY0VuY29kaW5nLCB1bmljb2RlKTsKLSAgICAgICAgY2FzZSBGWEZUX0VOQ09ESU5HX01TX1NZTUJPTDoKLSAgICAgICAgICAgIHJldHVybiBQREZfRmluZENvZGUoTVNTeW1ib2xFbmNvZGluZywgdW5pY29kZSk7CitzdGF0aWMgY29uc3QgRlhfV09SRCBaYXBmRW5jb2RpbmdbMjU2XSA9IHsKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDIwLCAweDI3MDEsIDB4MjcwMiwgMHgyNzAzLAorICAgIDB4MjcwNCwgMHgyNjBFLCAweDI3MDYsIDB4MjcwNywgMHgyNzA4LCAweDI3MDksIDB4MjYxQiwgMHgyNjFFLCAweDI3MEMsCisgICAgMHgyNzBELCAweDI3MEUsIDB4MjcwRiwgMHgyNzEwLCAweDI3MTEsIDB4MjcxMiwgMHgyNzEzLCAweDI3MTQsIDB4MjcxNSwKKyAgICAweDI3MTYsIDB4MjcxNywgMHgyNzE4LCAweDI3MTksIDB4MjcxQSwgMHgyNzFCLCAweDI3MUMsIDB4MjcxRCwgMHgyNzFFLAorICAgIDB4MjcxRiwgMHgyNzIwLCAweDI3MjEsIDB4MjcyMiwgMHgyNzIzLCAweDI3MjQsIDB4MjcyNSwgMHgyNzI2LCAweDI3MjcsCisgICAgMHgyNjA1LCAweDI3MjksIDB4MjcyQSwgMHgyNzJCLCAweDI3MkMsIDB4MjcyRCwgMHgyNzJFLCAweDI3MkYsIDB4MjczMCwKKyAgICAweDI3MzEsIDB4MjczMiwgMHgyNzMzLCAweDI3MzQsIDB4MjczNSwgMHgyNzM2LCAweDI3MzcsIDB4MjczOCwgMHgyNzM5LAorICAgIDB4MjczQSwgMHgyNzNCLCAweDI3M0MsIDB4MjczRCwgMHgyNzNFLCAweDI3M0YsIDB4Mjc0MCwgMHgyNzQxLCAweDI3NDIsCisgICAgMHgyNzQzLCAweDI3NDQsIDB4Mjc0NSwgMHgyNzQ2LCAweDI3NDcsIDB4Mjc0OCwgMHgyNzQ5LCAweDI3NEEsIDB4Mjc0QiwKKyAgICAweDI1Q0YsIDB4Mjc0RCwgMHgyNUEwLCAweDI3NEYsIDB4Mjc1MCwgMHgyNzUxLCAweDI3NTIsIDB4MjVCMiwgMHgyNUJDLAorICAgIDB4MjVDNiwgMHgyNzU2LCAweDI1RDcsIDB4Mjc1OCwgMHgyNzU5LCAweDI3NUEsIDB4Mjc1QiwgMHgyNzVDLCAweDI3NUQsCisgICAgMHgyNzVFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4Mjc2MSwKKyAgICAweDI3NjIsIDB4Mjc2MywgMHgyNzY0LCAweDI3NjUsIDB4Mjc2NiwgMHgyNzY3LCAweDI2NjMsIDB4MjY2NiwgMHgyNjY1LAorICAgIDB4MjY2MCwgMHgyNDYwLCAweDI0NjEsIDB4MjQ2MiwgMHgyNDYzLCAweDI0NjQsIDB4MjQ2NSwgMHgyNDY2LCAweDI0NjcsCisgICAgMHgyNDY4LCAweDI0NjksIDB4Mjc3NiwgMHgyNzc3LCAweDI3NzgsIDB4Mjc3OSwgMHgyNzdBLCAweDI3N0IsIDB4Mjc3QywKKyAgICAweDI3N0QsIDB4Mjc3RSwgMHgyNzdGLCAweDI3ODAsIDB4Mjc4MSwgMHgyNzgyLCAweDI3ODMsIDB4Mjc4NCwgMHgyNzg1LAorICAgIDB4Mjc4NiwgMHgyNzg3LCAweDI3ODgsIDB4Mjc4OSwgMHgyNzhBLCAweDI3OEIsIDB4Mjc4QywgMHgyNzhELCAweDI3OEUsCisgICAgMHgyNzhGLCAweDI3OTAsIDB4Mjc5MSwgMHgyNzkyLCAweDI3OTMsIDB4Mjc5NCwgMHgyMTkyLCAweDIxOTQsIDB4MjE5NSwKKyAgICAweDI3OTgsIDB4Mjc5OSwgMHgyNzlBLCAweDI3OUIsIDB4Mjc5QywgMHgyNzlELCAweDI3OUUsIDB4Mjc5RiwgMHgyN0EwLAorICAgIDB4MjdBMSwgMHgyN0EyLCAweDI3QTMsIDB4MjdBNCwgMHgyN0E1LCAweDI3QTYsIDB4MjdBNywgMHgyN0E4LCAweDI3QTksCisgICAgMHgyN0FBLCAweDI3QUIsIDB4MjdBQywgMHgyN0FELCAweDI3QUUsIDB4MjdBRiwgMHgwMDAwLCAweDI3QjEsIDB4MjdCMiwKKyAgICAweDI3QjMsIDB4MjdCNCwgMHgyN0I1LCAweDI3QjYsIDB4MjdCNywgMHgyN0I4LCAweDI3QjksIDB4MjdCQSwgMHgyN0JCLAorICAgIDB4MjdCQywgMHgyN0JELCAweDI3QkUsIDB4MDAwMCwKK307CitzdGF0aWMgY29uc3QgRlhfQ0hBUiogY29uc3QgU3RhbmRhcmRFbmNvZGluZ05hbWVzWzIyNF0gPSB7CisgICAgInNwYWNlIiwKKyAgICAiZXhjbGFtIiwKKyAgICAicXVvdGVkYmwiLAorICAgICJudW1iZXJzaWduIiwKKyAgICAiZG9sbGFyIiwKKyAgICAicGVyY2VudCIsCisgICAgImFtcGVyc2FuZCIsCisgICAgInF1b3RlcmlnaHQiLAorICAgICJwYXJlbmxlZnQiLAorICAgICJwYXJlbnJpZ2h0IiwKKyAgICAiYXN0ZXJpc2siLAorICAgICJwbHVzIiwKKyAgICAiY29tbWEiLAorICAgICJoeXBoZW4iLAorICAgICJwZXJpb2QiLAorICAgICJzbGFzaCIsCisgICAgInplcm8iLAorICAgICJvbmUiLAorICAgICJ0d28iLAorICAgICJ0aHJlZSIsCisgICAgImZvdXIiLAorICAgICJmaXZlIiwKKyAgICAic2l4IiwKKyAgICAic2V2ZW4iLAorICAgICJlaWdodCIsCisgICAgIm5pbmUiLAorICAgICJjb2xvbiIsCisgICAgInNlbWljb2xvbiIsCisgICAgImxlc3MiLAorICAgICJlcXVhbCIsCisgICAgImdyZWF0ZXIiLAorICAgICJxdWVzdGlvbiIsCisgICAgImF0IiwKKyAgICAiQSIsCisgICAgIkIiLAorICAgICJDIiwKKyAgICAiRCIsCisgICAgIkUiLAorICAgICJGIiwKKyAgICAiRyIsCisgICAgIkgiLAorICAgICJJIiwKKyAgICAiSiIsCisgICAgIksiLAorICAgICJMIiwKKyAgICAiTSIsCisgICAgIk4iLAorICAgICJPIiwKKyAgICAiUCIsCisgICAgIlEiLAorICAgICJSIiwKKyAgICAiUyIsCisgICAgIlQiLAorICAgICJVIiwKKyAgICAiViIsCisgICAgIlciLAorICAgICJYIiwKKyAgICAiWSIsCisgICAgIloiLAorICAgICJicmFja2V0bGVmdCIsCisgICAgImJhY2tzbGFzaCIsCisgICAgImJyYWNrZXRyaWdodCIsCisgICAgImFzY2lpY2lyY3VtIiwKKyAgICAidW5kZXJzY29yZSIsCisgICAgInF1b3RlbGVmdCIsCisgICAgImEiLAorICAgICJiIiwKKyAgICAiYyIsCisgICAgImQiLAorICAgICJlIiwKKyAgICAiZiIsCisgICAgImciLAorICAgICJoIiwKKyAgICAiaSIsCisgICAgImoiLAorICAgICJrIiwKKyAgICAibCIsCisgICAgIm0iLAorICAgICJuIiwKKyAgICAibyIsCisgICAgInAiLAorICAgICJxIiwKKyAgICAiciIsCisgICAgInMiLAorICAgICJ0IiwKKyAgICAidSIsCisgICAgInYiLAorICAgICJ3IiwKKyAgICAieCIsCisgICAgInkiLAorICAgICJ6IiwKKyAgICAiYnJhY2VsZWZ0IiwKKyAgICAiYmFyIiwKKyAgICAiYnJhY2VyaWdodCIsCisgICAgImFzY2lpdGlsZGUiLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgImV4Y2xhbWRvd24iLAorICAgICJjZW50IiwKKyAgICAic3RlcmxpbmciLAorICAgICJmcmFjdGlvbiIsCisgICAgInllbiIsCisgICAgImZsb3JpbiIsCisgICAgInNlY3Rpb24iLAorICAgICJjdXJyZW5jeSIsCisgICAgInF1b3Rlc2luZ2xlIiwKKyAgICAicXVvdGVkYmxsZWZ0IiwKKyAgICAiZ3VpbGxlbW90bGVmdCIsCisgICAgImd1aWxzaW5nbGxlZnQiLAorICAgICJndWlsc2luZ2xyaWdodCIsCisgICAgImZpIiwKKyAgICAiZmwiLAorICAgIE5VTEwsCisgICAgImVuZGFzaCIsCisgICAgImRhZ2dlciIsCisgICAgImRhZ2dlcmRibCIsCisgICAgInBlcmlvZGNlbnRlcmVkIiwKKyAgICBOVUxMLAorICAgICJwYXJhZ3JhcGgiLAorICAgICJidWxsZXQiLAorICAgICJxdW90ZXNpbmdsYmFzZSIsCisgICAgInF1b3RlZGJsYmFzZSIsCisgICAgInF1b3RlZGJscmlnaHQiLAorICAgICJndWlsbGVtb3RyaWdodCIsCisgICAgImVsbGlwc2lzIiwKKyAgICAicGVydGhvdXNhbmQiLAorICAgIE5VTEwsCisgICAgInF1ZXN0aW9uZG93biIsCisgICAgTlVMTCwKKyAgICAiZ3JhdmUiLAorICAgICJhY3V0ZSIsCisgICAgImNpcmN1bWZsZXgiLAorICAgICJ0aWxkZSIsCisgICAgIm1hY3JvbiIsCisgICAgImJyZXZlIiwKKyAgICAiZG90YWNjZW50IiwKKyAgICAiZGllcmVzaXMiLAorICAgIE5VTEwsCisgICAgInJpbmciLAorICAgICJjZWRpbGxhIiwKKyAgICBOVUxMLAorICAgICJodW5nYXJ1bWxhdXQiLAorICAgICJvZ29uZWsiLAorICAgICJjYXJvbiIsCisgICAgImVtZGFzaCIsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICAiQUUiLAorICAgIE5VTEwsCisgICAgIm9yZGZlbWluaW5lIiwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgICJMc2xhc2giLAorICAgICJPc2xhc2giLAorICAgICJPRSIsCisgICAgIm9yZG1hc2N1bGluZSIsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgICJhZSIsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgImRvdGxlc3NpIiwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgImxzbGFzaCIsCisgICAgIm9zbGFzaCIsCisgICAgIm9lIiwKKyAgICAiZ2VybWFuZGJscyIsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKK307CitzdGF0aWMgY29uc3QgRlhfQ0hBUiogY29uc3QgQWRvYmVXaW5BbnNpRW5jb2RpbmdOYW1lc1syMjRdID0geworICAgICJzcGFjZSIsCisgICAgImV4Y2xhbSIsCisgICAgInF1b3RlZGJsIiwKKyAgICAibnVtYmVyc2lnbiIsCisgICAgImRvbGxhciIsCisgICAgInBlcmNlbnQiLAorICAgICJhbXBlcnNhbmQiLAorICAgICJxdW90ZXNpbmdsZSIsCisgICAgInBhcmVubGVmdCIsCisgICAgInBhcmVucmlnaHQiLAorICAgICJhc3RlcmlzayIsCisgICAgInBsdXMiLAorICAgICJjb21tYSIsCisgICAgImh5cGhlbiIsCisgICAgInBlcmlvZCIsCisgICAgInNsYXNoIiwKKyAgICAiemVybyIsCisgICAgIm9uZSIsCisgICAgInR3byIsCisgICAgInRocmVlIiwKKyAgICAiZm91ciIsCisgICAgImZpdmUiLAorICAgICJzaXgiLAorICAgICJzZXZlbiIsCisgICAgImVpZ2h0IiwKKyAgICAibmluZSIsCisgICAgImNvbG9uIiwKKyAgICAic2VtaWNvbG9uIiwKKyAgICAibGVzcyIsCisgICAgImVxdWFsIiwKKyAgICAiZ3JlYXRlciIsCisgICAgInF1ZXN0aW9uIiwKKyAgICAiYXQiLAorICAgICJBIiwKKyAgICAiQiIsCisgICAgIkMiLAorICAgICJEIiwKKyAgICAiRSIsCisgICAgIkYiLAorICAgICJHIiwKKyAgICAiSCIsCisgICAgIkkiLAorICAgICJKIiwKKyAgICAiSyIsCisgICAgIkwiLAorICAgICJNIiwKKyAgICAiTiIsCisgICAgIk8iLAorICAgICJQIiwKKyAgICAiUSIsCisgICAgIlIiLAorICAgICJTIiwKKyAgICAiVCIsCisgICAgIlUiLAorICAgICJWIiwKKyAgICAiVyIsCisgICAgIlgiLAorICAgICJZIiwKKyAgICAiWiIsCisgICAgImJyYWNrZXRsZWZ0IiwKKyAgICAiYmFja3NsYXNoIiwKKyAgICAiYnJhY2tldHJpZ2h0IiwKKyAgICAiYXNjaWljaXJjdW0iLAorICAgICJ1bmRlcnNjb3JlIiwKKyAgICAiZ3JhdmUiLAorICAgICJhIiwKKyAgICAiYiIsCisgICAgImMiLAorICAgICJkIiwKKyAgICAiZSIsCisgICAgImYiLAorICAgICJnIiwKKyAgICAiaCIsCisgICAgImkiLAorICAgICJqIiwKKyAgICAiayIsCisgICAgImwiLAorICAgICJtIiwKKyAgICAibiIsCisgICAgIm8iLAorICAgICJwIiwKKyAgICAicSIsCisgICAgInIiLAorICAgICJzIiwKKyAgICAidCIsCisgICAgInUiLAorICAgICJ2IiwKKyAgICAidyIsCisgICAgIngiLAorICAgICJ5IiwKKyAgICAieiIsCisgICAgImJyYWNlbGVmdCIsCisgICAgImJhciIsCisgICAgImJyYWNlcmlnaHQiLAorICAgICJhc2NpaXRpbGRlIiwKKyAgICAiYnVsbGV0IiwKKyAgICAiRXVybyIsCisgICAgImJ1bGxldCIsCisgICAgInF1b3Rlc2luZ2xiYXNlIiwKKyAgICAiZmxvcmluIiwKKyAgICAicXVvdGVkYmxiYXNlIiwKKyAgICAiZWxsaXBzaXMiLAorICAgICJkYWdnZXIiLAorICAgICJkYWdnZXJkYmwiLAorICAgICJjaXJjdW1mbGV4IiwKKyAgICAicGVydGhvdXNhbmQiLAorICAgICJTY2Fyb24iLAorICAgICJndWlsc2luZ2xsZWZ0IiwKKyAgICAiT0UiLAorICAgICJidWxsZXQiLAorICAgICJaY2Fyb24iLAorICAgICJidWxsZXQiLAorICAgICJidWxsZXQiLAorICAgICJxdW90ZWxlZnQiLAorICAgICJxdW90ZXJpZ2h0IiwKKyAgICAicXVvdGVkYmxsZWZ0IiwKKyAgICAicXVvdGVkYmxyaWdodCIsCisgICAgImJ1bGxldCIsCisgICAgImVuZGFzaCIsCisgICAgImVtZGFzaCIsCisgICAgInRpbGRlIiwKKyAgICAidHJhZGVtYXJrIiwKKyAgICAic2Nhcm9uIiwKKyAgICAiZ3VpbHNpbmdscmlnaHQiLAorICAgICJvZSIsCisgICAgImJ1bGxldCIsCisgICAgInpjYXJvbiIsCisgICAgIllkaWVyZXNpcyIsCisgICAgInNwYWNlIiwKKyAgICAiZXhjbGFtZG93biIsCisgICAgImNlbnQiLAorICAgICJzdGVybGluZyIsCisgICAgImN1cnJlbmN5IiwKKyAgICAieWVuIiwKKyAgICAiYnJva2VuYmFyIiwKKyAgICAic2VjdGlvbiIsCisgICAgImRpZXJlc2lzIiwKKyAgICAiY29weXJpZ2h0IiwKKyAgICAib3JkZmVtaW5pbmUiLAorICAgICJndWlsbGVtb3RsZWZ0IiwKKyAgICAibG9naWNhbG5vdCIsCisgICAgImh5cGhlbiIsCisgICAgInJlZ2lzdGVyZWQiLAorICAgICJtYWNyb24iLAorICAgICJkZWdyZWUiLAorICAgICJwbHVzbWludXMiLAorICAgICJ0d29zdXBlcmlvciIsCisgICAgInRocmVlc3VwZXJpb3IiLAorICAgICJhY3V0ZSIsCisgICAgIm11IiwKKyAgICAicGFyYWdyYXBoIiwKKyAgICAicGVyaW9kY2VudGVyZWQiLAorICAgICJjZWRpbGxhIiwKKyAgICAib25lc3VwZXJpb3IiLAorICAgICJvcmRtYXNjdWxpbmUiLAorICAgICJndWlsbGVtb3RyaWdodCIsCisgICAgIm9uZXF1YXJ0ZXIiLAorICAgICJvbmVoYWxmIiwKKyAgICAidGhyZWVxdWFydGVycyIsCisgICAgInF1ZXN0aW9uZG93biIsCisgICAgIkFncmF2ZSIsCisgICAgIkFhY3V0ZSIsCisgICAgIkFjaXJjdW1mbGV4IiwKKyAgICAiQXRpbGRlIiwKKyAgICAiQWRpZXJlc2lzIiwKKyAgICAiQXJpbmciLAorICAgICJBRSIsCisgICAgIkNjZWRpbGxhIiwKKyAgICAiRWdyYXZlIiwKKyAgICAiRWFjdXRlIiwKKyAgICAiRWNpcmN1bWZsZXgiLAorICAgICJFZGllcmVzaXMiLAorICAgICJJZ3JhdmUiLAorICAgICJJYWN1dGUiLAorICAgICJJY2lyY3VtZmxleCIsCisgICAgIklkaWVyZXNpcyIsCisgICAgIkV0aCIsCisgICAgIk50aWxkZSIsCisgICAgIk9ncmF2ZSIsCisgICAgIk9hY3V0ZSIsCisgICAgIk9jaXJjdW1mbGV4IiwKKyAgICAiT3RpbGRlIiwKKyAgICAiT2RpZXJlc2lzIiwKKyAgICAibXVsdGlwbHkiLAorICAgICJPc2xhc2giLAorICAgICJVZ3JhdmUiLAorICAgICJVYWN1dGUiLAorICAgICJVY2lyY3VtZmxleCIsCisgICAgIlVkaWVyZXNpcyIsCisgICAgIllhY3V0ZSIsCisgICAgIlRob3JuIiwKKyAgICAiZ2VybWFuZGJscyIsCisgICAgImFncmF2ZSIsCisgICAgImFhY3V0ZSIsCisgICAgImFjaXJjdW1mbGV4IiwKKyAgICAiYXRpbGRlIiwKKyAgICAiYWRpZXJlc2lzIiwKKyAgICAiYXJpbmciLAorICAgICJhZSIsCisgICAgImNjZWRpbGxhIiwKKyAgICAiZWdyYXZlIiwKKyAgICAiZWFjdXRlIiwKKyAgICAiZWNpcmN1bWZsZXgiLAorICAgICJlZGllcmVzaXMiLAorICAgICJpZ3JhdmUiLAorICAgICJpYWN1dGUiLAorICAgICJpY2lyY3VtZmxleCIsCisgICAgImlkaWVyZXNpcyIsCisgICAgImV0aCIsCisgICAgIm50aWxkZSIsCisgICAgIm9ncmF2ZSIsCisgICAgIm9hY3V0ZSIsCisgICAgIm9jaXJjdW1mbGV4IiwKKyAgICAib3RpbGRlIiwKKyAgICAib2RpZXJlc2lzIiwKKyAgICAiZGl2aWRlIiwKKyAgICAib3NsYXNoIiwKKyAgICAidWdyYXZlIiwKKyAgICAidWFjdXRlIiwKKyAgICAidWNpcmN1bWZsZXgiLAorICAgICJ1ZGllcmVzaXMiLAorICAgICJ5YWN1dGUiLAorICAgICJ0aG9ybiIsCisgICAgInlkaWVyZXNpcyIsCit9Oworc3RhdGljIGNvbnN0IEZYX0NIQVIqIGNvbnN0IE1hY1JvbWFuRW5jb2RpbmdOYW1lc1syMjRdID0geworICAgICJzcGFjZSIsCisgICAgImV4Y2xhbSIsCisgICAgInF1b3RlZGJsIiwKKyAgICAibnVtYmVyc2lnbiIsCisgICAgImRvbGxhciIsCisgICAgInBlcmNlbnQiLAorICAgICJhbXBlcnNhbmQiLAorICAgICJxdW90ZXNpbmdsZSIsCisgICAgInBhcmVubGVmdCIsCisgICAgInBhcmVucmlnaHQiLAorICAgICJhc3RlcmlzayIsCisgICAgInBsdXMiLAorICAgICJjb21tYSIsCisgICAgImh5cGhlbiIsCisgICAgInBlcmlvZCIsCisgICAgInNsYXNoIiwKKyAgICAiemVybyIsCisgICAgIm9uZSIsCisgICAgInR3byIsCisgICAgInRocmVlIiwKKyAgICAiZm91ciIsCisgICAgImZpdmUiLAorICAgICJzaXgiLAorICAgICJzZXZlbiIsCisgICAgImVpZ2h0IiwKKyAgICAibmluZSIsCisgICAgImNvbG9uIiwKKyAgICAic2VtaWNvbG9uIiwKKyAgICAibGVzcyIsCisgICAgImVxdWFsIiwKKyAgICAiZ3JlYXRlciIsCisgICAgInF1ZXN0aW9uIiwKKyAgICAiYXQiLAorICAgICJBIiwKKyAgICAiQiIsCisgICAgIkMiLAorICAgICJEIiwKKyAgICAiRSIsCisgICAgIkYiLAorICAgICJHIiwKKyAgICAiSCIsCisgICAgIkkiLAorICAgICJKIiwKKyAgICAiSyIsCisgICAgIkwiLAorICAgICJNIiwKKyAgICAiTiIsCisgICAgIk8iLAorICAgICJQIiwKKyAgICAiUSIsCisgICAgIlIiLAorICAgICJTIiwKKyAgICAiVCIsCisgICAgIlUiLAorICAgICJWIiwKKyAgICAiVyIsCisgICAgIlgiLAorICAgICJZIiwKKyAgICAiWiIsCisgICAgImJyYWNrZXRsZWZ0IiwKKyAgICAiYmFja3NsYXNoIiwKKyAgICAiYnJhY2tldHJpZ2h0IiwKKyAgICAiYXNjaWljaXJjdW0iLAorICAgICJ1bmRlcnNjb3JlIiwKKyAgICAiZ3JhdmUiLAorICAgICJhIiwKKyAgICAiYiIsCisgICAgImMiLAorICAgICJkIiwKKyAgICAiZSIsCisgICAgImYiLAorICAgICJnIiwKKyAgICAiaCIsCisgICAgImkiLAorICAgICJqIiwKKyAgICAiayIsCisgICAgImwiLAorICAgICJtIiwKKyAgICAibiIsCisgICAgIm8iLAorICAgICJwIiwKKyAgICAicSIsCisgICAgInIiLAorICAgICJzIiwKKyAgICAidCIsCisgICAgInUiLAorICAgICJ2IiwKKyAgICAidyIsCisgICAgIngiLAorICAgICJ5IiwKKyAgICAieiIsCisgICAgImJyYWNlbGVmdCIsCisgICAgImJhciIsCisgICAgImJyYWNlcmlnaHQiLAorICAgICJhc2NpaXRpbGRlIiwKKyAgICBOVUxMLAorICAgICJBZGllcmVzaXMiLAorICAgICJBcmluZyIsCisgICAgIkNjZWRpbGxhIiwKKyAgICAiRWFjdXRlIiwKKyAgICAiTnRpbGRlIiwKKyAgICAiT2RpZXJlc2lzIiwKKyAgICAiVWRpZXJlc2lzIiwKKyAgICAiYWFjdXRlIiwKKyAgICAiYWdyYXZlIiwKKyAgICAiYWNpcmN1bWZsZXgiLAorICAgICJhZGllcmVzaXMiLAorICAgICJhdGlsZGUiLAorICAgICJhcmluZyIsCisgICAgImNjZWRpbGxhIiwKKyAgICAiZWFjdXRlIiwKKyAgICAiZWdyYXZlIiwKKyAgICAiZWNpcmN1bWZsZXgiLAorICAgICJlZGllcmVzaXMiLAorICAgICJpYWN1dGUiLAorICAgICJpZ3JhdmUiLAorICAgICJpY2lyY3VtZmxleCIsCisgICAgImlkaWVyZXNpcyIsCisgICAgIm50aWxkZSIsCisgICAgIm9hY3V0ZSIsCisgICAgIm9ncmF2ZSIsCisgICAgIm9jaXJjdW1mbGV4IiwKKyAgICAib2RpZXJlc2lzIiwKKyAgICAib3RpbGRlIiwKKyAgICAidWFjdXRlIiwKKyAgICAidWdyYXZlIiwKKyAgICAidWNpcmN1bWZsZXgiLAorICAgICJ1ZGllcmVzaXMiLAorICAgICJkYWdnZXIiLAorICAgICJkZWdyZWUiLAorICAgICJjZW50IiwKKyAgICAic3RlcmxpbmciLAorICAgICJzZWN0aW9uIiwKKyAgICAiYnVsbGV0IiwKKyAgICAicGFyYWdyYXBoIiwKKyAgICAiZ2VybWFuZGJscyIsCisgICAgInJlZ2lzdGVyZWQiLAorICAgICJjb3B5cmlnaHQiLAorICAgICJ0cmFkZW1hcmsiLAorICAgICJhY3V0ZSIsCisgICAgImRpZXJlc2lzIiwKKyAgICAibm90ZXF1YWwiLAorICAgICJBRSIsCisgICAgIk9zbGFzaCIsCisgICAgImluZmluaXR5IiwKKyAgICAicGx1c21pbnVzIiwKKyAgICAibGVzc2VxdWFsIiwKKyAgICAiZ3JlYXRlcmVxdWFsIiwKKyAgICAieWVuIiwKKyAgICAibXUiLAorICAgICJwYXJ0aWFsZGlmZiIsCisgICAgInN1bW1hdGlvbiIsCisgICAgInByb2R1Y3QiLAorICAgICJwaSIsCisgICAgImludGVncmFsIiwKKyAgICAib3JkZmVtaW5pbmUiLAorICAgICJvcmRtYXNjdWxpbmUiLAorICAgICJPbWVnYSIsCisgICAgImFlIiwKKyAgICAib3NsYXNoIiwKKyAgICAicXVlc3Rpb25kb3duIiwKKyAgICAiZXhjbGFtZG93biIsCisgICAgImxvZ2ljYWxub3QiLAorICAgICJyYWRpY2FsIiwKKyAgICAiZmxvcmluIiwKKyAgICAiYXBwcm94ZXF1YWwiLAorICAgICJEZWx0YSIsCisgICAgImd1aWxsZW1vdGxlZnQiLAorICAgICJndWlsbGVtb3RyaWdodCIsCisgICAgImVsbGlwc2lzIiwKKyAgICAic3BhY2UiLAorICAgICJBZ3JhdmUiLAorICAgICJBdGlsZGUiLAorICAgICJPdGlsZGUiLAorICAgICJPRSIsCisgICAgIm9lIiwKKyAgICAiZW5kYXNoIiwKKyAgICAiZW1kYXNoIiwKKyAgICAicXVvdGVkYmxsZWZ0IiwKKyAgICAicXVvdGVkYmxyaWdodCIsCisgICAgInF1b3RlbGVmdCIsCisgICAgInF1b3RlcmlnaHQiLAorICAgICJkaXZpZGUiLAorICAgICJsb3plbmdlIiwKKyAgICAieWRpZXJlc2lzIiwKKyAgICAiWWRpZXJlc2lzIiwKKyAgICAiZnJhY3Rpb24iLAorICAgICJjdXJyZW5jeSIsCisgICAgImd1aWxzaW5nbGxlZnQiLAorICAgICJndWlsc2luZ2xyaWdodCIsCisgICAgImZpIiwKKyAgICAiZmwiLAorICAgICJkYWdnZXJkYmwiLAorICAgICJwZXJpb2RjZW50ZXJlZCIsCisgICAgInF1b3Rlc2luZ2xiYXNlIiwKKyAgICAicXVvdGVkYmxiYXNlIiwKKyAgICAicGVydGhvdXNhbmQiLAorICAgICJBY2lyY3VtZmxleCIsCisgICAgIkVjaXJjdW1mbGV4IiwKKyAgICAiQWFjdXRlIiwKKyAgICAiRWRpZXJlc2lzIiwKKyAgICAiRWdyYXZlIiwKKyAgICAiSWFjdXRlIiwKKyAgICAiSWNpcmN1bWZsZXgiLAorICAgICJJZGllcmVzaXMiLAorICAgICJJZ3JhdmUiLAorICAgICJPYWN1dGUiLAorICAgICJPY2lyY3VtZmxleCIsCisgICAgImFwcGxlIiwKKyAgICAiT2dyYXZlIiwKKyAgICAiVWFjdXRlIiwKKyAgICAiVWNpcmN1bWZsZXgiLAorICAgICJVZ3JhdmUiLAorICAgICJkb3RsZXNzaSIsCisgICAgImNpcmN1bWZsZXgiLAorICAgICJ0aWxkZSIsCisgICAgIm1hY3JvbiIsCisgICAgImJyZXZlIiwKKyAgICAiZG90YWNjZW50IiwKKyAgICAicmluZyIsCisgICAgImNlZGlsbGEiLAorICAgICJodW5nYXJ1bWxhdXQiLAorICAgICJvZ29uZWsiLAorICAgICJjYXJvbiIsCit9Oworc3RhdGljIGNvbnN0IEZYX0NIQVIqIGNvbnN0IE1hY0V4cGVydEVuY29kaW5nTmFtZXNbMjI0XSA9IHsKKyAgICAic3BhY2UiLAorICAgICJleGNsYW1zbWFsbCIsCisgICAgIkh1bmdhcnVtbGF1dHNtYWxsIiwKKyAgICAiY2VudG9sZHN0eWxlIiwKKyAgICAiZG9sbGFyb2xkc3R5bGUiLAorICAgICJkb2xsYXJzdXBlcmlvciIsCisgICAgImFtcGVyc2FuZHNtYWxsIiwKKyAgICAiQWN1dGVzbWFsbCIsCisgICAgInBhcmVubGVmdHN1cGVyaW9yIiwKKyAgICAicGFyZW5yaWdodHN1cGVyaW9yIiwKKyAgICAidHdvZG90ZW5sZWFkZXIiLAorICAgICJvbmVkb3RlbmxlYWRlciIsCisgICAgImNvbW1hIiwKKyAgICAiaHlwaGVuIiwKKyAgICAicGVyaW9kIiwKKyAgICAiZnJhY3Rpb24iLAorICAgICJ6ZXJvb2xkc3R5bGUiLAorICAgICJvbmVvbGRzdHlsZSIsCisgICAgInR3b29sZHN0eWxlIiwKKyAgICAidGhyZWVvbGRzdHlsZSIsCisgICAgImZvdXJvbGRzdHlsZSIsCisgICAgImZpdmVvbGRzdHlsZSIsCisgICAgInNpeG9sZHN0eWxlIiwKKyAgICAic2V2ZW5vbGRzdHlsZSIsCisgICAgImVpZ2h0b2xkc3R5bGUiLAorICAgICJuaW5lb2xkc3R5bGUiLAorICAgICJjb2xvbiIsCisgICAgInNlbWljb2xvbiIsCisgICAgTlVMTCwKKyAgICAidGhyZWVxdWFydGVyc2VtZGFzaCIsCisgICAgTlVMTCwKKyAgICAicXVlc3Rpb25zbWFsbCIsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICAiRXRoc21hbGwiLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICAib25lcXVhcnRlciIsCisgICAgIm9uZWhhbGYiLAorICAgICJ0aHJlZXF1YXJ0ZXJzIiwKKyAgICAib25lZWlnaHRoIiwKKyAgICAidGhyZWVlaWdodGhzIiwKKyAgICAiZml2ZWVpZ2h0aHMiLAorICAgICJzZXZlbmVpZ2h0aHMiLAorICAgICJvbmV0aGlyZCIsCisgICAgInR3b3RoaXJkcyIsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgImZmIiwKKyAgICAiZmkiLAorICAgICJmbCIsCisgICAgImZmaSIsCisgICAgImZmbCIsCisgICAgInBhcmVubGVmdGluZmVyaW9yIiwKKyAgICBOVUxMLAorICAgICJwYXJlbnJpZ2h0aW5mZXJpb3IiLAorICAgICJDaXJjdW1mbGV4c21hbGwiLAorICAgICJoeXBoZW5pbmZlcmlvciIsCisgICAgIkdyYXZlc21hbGwiLAorICAgICJBc21hbGwiLAorICAgICJCc21hbGwiLAorICAgICJDc21hbGwiLAorICAgICJEc21hbGwiLAorICAgICJFc21hbGwiLAorICAgICJGc21hbGwiLAorICAgICJHc21hbGwiLAorICAgICJIc21hbGwiLAorICAgICJJc21hbGwiLAorICAgICJKc21hbGwiLAorICAgICJLc21hbGwiLAorICAgICJMc21hbGwiLAorICAgICJNc21hbGwiLAorICAgICJOc21hbGwiLAorICAgICJPc21hbGwiLAorICAgICJQc21hbGwiLAorICAgICJRc21hbGwiLAorICAgICJSc21hbGwiLAorICAgICJTc21hbGwiLAorICAgICJUc21hbGwiLAorICAgICJVc21hbGwiLAorICAgICJWc21hbGwiLAorICAgICJXc21hbGwiLAorICAgICJYc21hbGwiLAorICAgICJZc21hbGwiLAorICAgICJac21hbGwiLAorICAgICJjb2xvbm1vbmV0YXJ5IiwKKyAgICAib25lZml0dGVkIiwKKyAgICAicnVwaWFoIiwKKyAgICAiVGlsZGVzbWFsbCIsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgICJhc3VwZXJpb3IiLAorICAgICJjZW50c3VwZXJpb3IiLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgIkFhY3V0ZXNtYWxsIiwKKyAgICAiQWdyYXZlc21hbGwiLAorICAgICJBY2lyY3VtZmxleHNtYWxsIiwKKyAgICAiQWRpZXJlc2lzc21hbGwiLAorICAgICJBdGlsZGVzbWFsbCIsCisgICAgIkFyaW5nc21hbGwiLAorICAgICJDY2VkaWxsYXNtYWxsIiwKKyAgICAiRWFjdXRlc21hbGwiLAorICAgICJFZ3JhdmVzbWFsbCIsCisgICAgIkVjaXJjdW1mbGV4c21hbGwiLAorICAgICJFZGllcmVzaXNzbWFsbCIsCisgICAgIklhY3V0ZXNtYWxsIiwKKyAgICAiSWdyYXZlc21hbGwiLAorICAgICJJY2lyY3VtZmxleHNtYWxsIiwKKyAgICAiSWRpZXJlc2lzc21hbGwiLAorICAgICJOdGlsZGVzbWFsbCIsCisgICAgIk9hY3V0ZXNtYWxsIiwKKyAgICAiT2dyYXZlc21hbGwiLAorICAgICJPY2lyY3VtZmxleHNtYWxsIiwKKyAgICAiT2RpZXJlc2lzc21hbGwiLAorICAgICJPdGlsZGVzbWFsbCIsCisgICAgIlVhY3V0ZXNtYWxsIiwKKyAgICAiVWdyYXZlc21hbGwiLAorICAgICJVY2lyY3VtZmxleHNtYWxsIiwKKyAgICAiVWRpZXJlc2lzc21hbGwiLAorICAgIE5VTEwsCisgICAgImVpZ2h0c3VwZXJpb3IiLAorICAgICJmb3VyaW5mZXJpb3IiLAorICAgICJ0aHJlZWluZmVyaW9yIiwKKyAgICAic2l4aW5mZXJpb3IiLAorICAgICJlaWdodGluZmVyaW9yIiwKKyAgICAic2V2ZW5pbmZlcmlvciIsCisgICAgIlNjYXJvbnNtYWxsIiwKKyAgICBOVUxMLAorICAgICJjZW50aW5mZXJpb3IiLAorICAgICJ0d29pbmZlcmlvciIsCisgICAgTlVMTCwKKyAgICAiRGllcmVzaXNzbWFsbCIsCisgICAgTlVMTCwKKyAgICAiQ2Fyb25zbWFsbCIsCisgICAgIlNjYXJvbnNtYWxsIiwKKyAgICAiZml2ZWluZmVyaW9yIiwKKyAgICBOVUxMLAorICAgICJjb21tYWluZmVyaW9yIiwKKyAgICAicGVyaW9kaW5mZXJpb3IiLAorICAgICJZYWN1dGVzbWFsbCIsCisgICAgTlVMTCwKKyAgICAiZG9sbGFyaW5mZXJpb3IiLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICAiVGhvcm5zbWFsbCIsCisgICAgTlVMTCwKKyAgICAibmluZWluZmVyaW9yIiwKKyAgICAiemVyb2luZmVyaW9yIiwKKyAgICAiWmNhcm9uc21hbGwiLAorICAgICJBRXNtYWxsIiwKKyAgICAiT3NsYXNoc21hbGwiLAorICAgICJxdWVzdGlvbmRvd25zbWFsbCIsCisgICAgIm9uZWluZmVyaW9yIiwKKyAgICAiYXN1cGVyaW9yIiwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICAiQ2VkaWxsYXNtYWxsIiwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgIk9Fc21hbGwiLAorICAgICJmaWd1cmVkYXNoIiwKKyAgICAiaHlwaGVuc3VwZXJpb3IiLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgImV4Y2xhbWRvd25zbWFsbCIsCisgICAgTlVMTCwKKyAgICAiWWRpZXJlc2lzc21hbGwiLAorICAgIE5VTEwsCisgICAgIm9uZXN1cGVyaW9yIiwKKyAgICAidHdvc3VwZXJpb3IiLAorICAgICJ0aHJlZXN1cGVyaW9yIiwKKyAgICAiZm91cnN1cGVyaW9yIiwKKyAgICAiZml2ZXN1cGVyaW9yIiwKKyAgICAic2l4c3VwZXJpb3IiLAorICAgICJzZXZlbnN1cGVyaW9yIiwKKyAgICAibmluZXN1cGVyaW9yIiwKKyAgICAiemVyb3N1cGVyaW9yIiwKKyAgICBOVUxMLAorICAgICJlc3VwZXJpb3IiLAorICAgICJyc3VwZXJpb3IiLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgICJpc3VwZXJpb3IiLAorICAgICJzc3VwZXJpb3IiLAorICAgICJkc3VwZXJpb3IiLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICAibHN1cGVyaW9yIiwKKyAgICAiT2dvbmVrc21hbGwiLAorICAgICJCcmV2ZXNtYWxsIiwKKyAgICAiTWFjcm9uc21hbGwiLAorICAgICJic3VwZXJpb3IiLAorICAgICJuc3VwZXJpb3IiLAorICAgICJtc3VwZXJpb3IiLAorICAgICJjb21tYXN1cGVyaW9yIiwKKyAgICAicGVyaW9kc3VwZXJpb3IiLAorICAgICJEb3RhY2NlbnRzbWFsbCIsCisgICAgIlJpbmdzbWFsbCIsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKK307CitzdGF0aWMgY29uc3QgRlhfQ0hBUiogY29uc3QgUERGRG9jRW5jb2RpbmdOYW1lc1syMzJdID0geworICAgICJicmV2ZSIsCisgICAgImNhcm9uIiwKKyAgICAiY2lyY3VtZmxleCIsCisgICAgImRvdGFjY2VudCIsCisgICAgImh1bmdhcnVtbGF1dCIsCisgICAgIm9nb25layIsCisgICAgInJpbmciLAorICAgICJ0aWxkZSIsCisgICAgInNwYWNlIiwKKyAgICAiZXhjbGFtIiwKKyAgICAicXVvdGVkYmwiLAorICAgICJudW1iZXJzaWduIiwKKyAgICAiZG9sbGFyIiwKKyAgICAicGVyY2VudCIsCisgICAgImFtcGVyc2FuZCIsCisgICAgInF1b3Rlc2luZ2xlIiwKKyAgICAicGFyZW5sZWZ0IiwKKyAgICAicGFyZW5yaWdodCIsCisgICAgImFzdGVyaXNrIiwKKyAgICAicGx1cyIsCisgICAgImNvbW1hIiwKKyAgICAiaHlwaGVuIiwKKyAgICAicGVyaW9kIiwKKyAgICAic2xhc2giLAorICAgICJ6ZXJvIiwKKyAgICAib25lIiwKKyAgICAidHdvIiwKKyAgICAidGhyZWUiLAorICAgICJmb3VyIiwKKyAgICAiZml2ZSIsCisgICAgInNpeCIsCisgICAgInNldmVuIiwKKyAgICAiZWlnaHQiLAorICAgICJuaW5lIiwKKyAgICAiY29sb24iLAorICAgICJzZW1pY29sb24iLAorICAgICJsZXNzIiwKKyAgICAiZXF1YWwiLAorICAgICJncmVhdGVyIiwKKyAgICAicXVlc3Rpb24iLAorICAgICJhdCIsCisgICAgIkEiLAorICAgICJCIiwKKyAgICAiQyIsCisgICAgIkQiLAorICAgICJFIiwKKyAgICAiRiIsCisgICAgIkciLAorICAgICJIIiwKKyAgICAiSSIsCisgICAgIkoiLAorICAgICJLIiwKKyAgICAiTCIsCisgICAgIk0iLAorICAgICJOIiwKKyAgICAiTyIsCisgICAgIlAiLAorICAgICJRIiwKKyAgICAiUiIsCisgICAgIlMiLAorICAgICJUIiwKKyAgICAiVSIsCisgICAgIlYiLAorICAgICJXIiwKKyAgICAiWCIsCisgICAgIlkiLAorICAgICJaIiwKKyAgICAiYnJhY2tldGxlZnQiLAorICAgICJiYWNrc2xhc2giLAorICAgICJicmFja2V0cmlnaHQiLAorICAgICJhc2NpaWNpcmN1bSIsCisgICAgInVuZGVyc2NvcmUiLAorICAgICJncmF2ZSIsCisgICAgImEiLAorICAgICJiIiwKKyAgICAiYyIsCisgICAgImQiLAorICAgICJlIiwKKyAgICAiZiIsCisgICAgImciLAorICAgICJoIiwKKyAgICAiaSIsCisgICAgImoiLAorICAgICJrIiwKKyAgICAibCIsCisgICAgIm0iLAorICAgICJuIiwKKyAgICAibyIsCisgICAgInAiLAorICAgICJxIiwKKyAgICAiciIsCisgICAgInMiLAorICAgICJ0IiwKKyAgICAidSIsCisgICAgInYiLAorICAgICJ3IiwKKyAgICAieCIsCisgICAgInkiLAorICAgICJ6IiwKKyAgICAiYnJhY2VsZWZ0IiwKKyAgICAiYmFyIiwKKyAgICAiYnJhY2VyaWdodCIsCisgICAgImFzY2lpdGlsZGUiLAorICAgIE5VTEwsCisgICAgImJ1bGxldDMiLAorICAgICJkYWdnZXIiLAorICAgICJkYWdnZXJkYmwiLAorICAgICJlbGxpcHNpcyIsCisgICAgImVtZGFzaCIsCisgICAgImVuZGFzaCIsCisgICAgImZsb3JpbiIsCisgICAgImZyYWN0aW9uIiwKKyAgICAiZ3VpbHNpbmdsbGVmdCIsCisgICAgImd1aWxzaW5nbHJpZ2h0IiwKKyAgICAibWludXMiLAorICAgICJwZXJ0aG91c2FuZCIsCisgICAgInF1b3RlZGJsYmFzZSIsCisgICAgInF1b3RlZGJsbGVmdCIsCisgICAgInF1b3RlZGJscmlnaHQiLAorICAgICJxdW90ZWxlZnQiLAorICAgICJxdW90ZXJpZ2h0IiwKKyAgICAicXVvdGVzaW5nbGJhc2UiLAorICAgICJ0cmFkZW1hcmsiLAorICAgICJmaSIsCisgICAgImZsIiwKKyAgICAiTHNsYXNoIiwKKyAgICAiT0UiLAorICAgICJTY2Fyb24iLAorICAgICJZZGllcmVzaXMiLAorICAgICJaY2Fyb24yIiwKKyAgICAiZG90bGVzc2kiLAorICAgICJsc2xhc2giLAorICAgICJvZSIsCisgICAgInNjYXJvbiIsCisgICAgInpjYXJvbjIiLAorICAgIE5VTEwsCisgICAgIkV1cm8iLAorICAgICJleGNsYW1kb3duIiwKKyAgICAiY2VudCIsCisgICAgInN0ZXJsaW5nIiwKKyAgICAiY3VycmVuY3kiLAorICAgICJ5ZW4iLAorICAgICJicm9rZW5iYXIiLAorICAgICJzZWN0aW9uIiwKKyAgICAiZGllcmVzaXMiLAorICAgICJjb3B5cmlnaHQiLAorICAgICJvcmRmZW1pbmluZSIsCisgICAgImd1aWxsZW1vdGxlZnQ0IiwKKyAgICAibG9naWNhbG5vdCIsCisgICAgTlVMTCwKKyAgICAicmVnaXN0ZXJlZCIsCisgICAgIm1hY3JvbiIsCisgICAgImRlZ3JlZSIsCisgICAgInBsdXNtaW51cyIsCisgICAgInR3b3N1cGVyaW9yIiwKKyAgICAidGhyZWVzdXBlcmlvciIsCisgICAgImFjdXRlIiwKKyAgICAibXUiLAorICAgICJwYXJhZ3JhcGgiLAorICAgICJwZXJpb2RjZW50ZXJlZCIsCisgICAgImNlZGlsbGEiLAorICAgICJvbmVzdXBlcmlvciIsCisgICAgIm9yZG1hc2N1bGluZSIsCisgICAgImd1aWxsZW1vdHJpZ2h0NCIsCisgICAgIm9uZXF1YXJ0ZXIiLAorICAgICJvbmVoYWxmIiwKKyAgICAidGhyZWVxdWFydGVycyIsCisgICAgInF1ZXN0aW9uZG93biIsCisgICAgIkFncmF2ZSIsCisgICAgIkFhY3V0ZSIsCisgICAgIkFjaXJjdW1mbGV4IiwKKyAgICAiQXRpbGRlIiwKKyAgICAiQWRpZXJlc2lzIiwKKyAgICAiQXJpbmciLAorICAgICJBRSIsCisgICAgIkNjZWRpbGxhIiwKKyAgICAiRWdyYXZlIiwKKyAgICAiRWFjdXRlIiwKKyAgICAiRWNpcmN1bWZsZXgiLAorICAgICJFZGllcmVzaXMiLAorICAgICJJZ3JhdmUiLAorICAgICJJYWN1dGUiLAorICAgICJJY2lyY3VtZmxleCIsCisgICAgIklkaWVyZXNpcyIsCisgICAgIkV0aCIsCisgICAgIk50aWxkZSIsCisgICAgIk9ncmF2ZSIsCisgICAgIk9hY3V0ZSIsCisgICAgIk9jaXJjdW1mbGV4IiwKKyAgICAiT3RpbGRlIiwKKyAgICAiT2RpZXJlc2lzIiwKKyAgICAibXVsdGlwbHkiLAorICAgICJPc2xhc2giLAorICAgICJVZ3JhdmUiLAorICAgICJVYWN1dGUiLAorICAgICJVY2lyY3VtZmxleCIsCisgICAgIlVkaWVyZXNpcyIsCisgICAgIllhY3V0ZSIsCisgICAgIlRob3JuIiwKKyAgICAiZ2VybWFuZGJscyIsCisgICAgImFncmF2ZSIsCisgICAgImFhY3V0ZSIsCisgICAgImFjaXJjdW1mbGV4IiwKKyAgICAiYXRpbGRlIiwKKyAgICAiYWRpZXJlc2lzIiwKKyAgICAiYXJpbmciLAorICAgICJhZSIsCisgICAgImNjZWRpbGxhIiwKKyAgICAiZWdyYXZlIiwKKyAgICAiZWFjdXRlIiwKKyAgICAiZWNpcmN1bWZsZXgiLAorICAgICJlZGllcmVzaXMiLAorICAgICJpZ3JhdmUiLAorICAgICJpYWN1dGUiLAorICAgICJpY2lyY3VtZmxleCIsCisgICAgImlkaWVyZXNpcyIsCisgICAgImV0aCIsCisgICAgIm50aWxkZSIsCisgICAgIm9ncmF2ZSIsCisgICAgIm9hY3V0ZSIsCisgICAgIm9jaXJjdW1mbGV4IiwKKyAgICAib3RpbGRlIiwKKyAgICAib2RpZXJlc2lzIiwKKyAgICAiZGl2aWRlIiwKKyAgICAib3NsYXNoIiwKKyAgICAidWdyYXZlIiwKKyAgICAidWFjdXRlIiwKKyAgICAidWNpcmN1bWZsZXgiLAorICAgICJ1ZGllcmVzaXMiLAorICAgICJ5YWN1dGUiLAorICAgICJ0aG9ybiIsCisgICAgInlkaWVyZXNpcyIsCit9Oworc3RhdGljIGNvbnN0IEZYX0NIQVIqIGNvbnN0IEFkb2JlU3ltYm9sRW5jb2RpbmdOYW1lc1syMjRdID0geworICAgICJzcGFjZSIsCisgICAgImV4Y2xhbSIsCisgICAgInVuaXZlcnNhbCIsCisgICAgIm51bWJlcnNpZ24iLAorICAgICJleGlzdGVudGlhbCIsCisgICAgInBlcmNlbnQiLAorICAgICJhbXBlcnNhbmQiLAorICAgICJzdWNodGhhdCIsCisgICAgInBhcmVubGVmdCIsCisgICAgInBhcmVucmlnaHQiLAorICAgICJhc3Rlcmlza21hdGgiLAorICAgICJwbHVzIiwKKyAgICAiY29tbWEiLAorICAgICJtaW51cyIsCisgICAgInBlcmlvZCIsCisgICAgInNsYXNoIiwKKyAgICAiemVybyIsCisgICAgIm9uZSIsCisgICAgInR3byIsCisgICAgInRocmVlIiwKKyAgICAiZm91ciIsCisgICAgImZpdmUiLAorICAgICJzaXgiLAorICAgICJzZXZlbiIsCisgICAgImVpZ2h0IiwKKyAgICAibmluZSIsCisgICAgImNvbG9uIiwKKyAgICAic2VtaWNvbG9uIiwKKyAgICAibGVzcyIsCisgICAgImVxdWFsIiwKKyAgICAiZ3JlYXRlciIsCisgICAgInF1ZXN0aW9uIiwKKyAgICAiY29uZ3J1ZW50IiwKKyAgICAiQWxwaGEiLAorICAgICJCZXRhIiwKKyAgICAiQ2hpIiwKKyAgICAiRGVsdGEiLAorICAgICJFcHNpbG9uIiwKKyAgICAiUGhpIiwKKyAgICAiR2FtbWEiLAorICAgICJFdGEiLAorICAgICJJb3RhIiwKKyAgICAidGhldGExIiwKKyAgICAiS2FwcGEiLAorICAgICJMYW1iZGEiLAorICAgICJNdSIsCisgICAgIk51IiwKKyAgICAiT21pY3JvbiIsCisgICAgIlBpIiwKKyAgICAiVGhldGEiLAorICAgICJSaG8iLAorICAgICJTaWdtYSIsCisgICAgIlRhdSIsCisgICAgIlVwc2lsb24iLAorICAgICJzaWdtYTEiLAorICAgICJPbWVnYSIsCisgICAgIlhpIiwKKyAgICAiUHNpIiwKKyAgICAiWmV0YSIsCisgICAgImJyYWNrZXRsZWZ0IiwKKyAgICAidGhlcmVmb3JlIiwKKyAgICAiYnJhY2tldHJpZ2h0IiwKKyAgICAicGVycGVuZGljdWxhciIsCisgICAgInVuZGVyc2NvcmUiLAorICAgICJyYWRpY2FsZXgiLAorICAgICJhbHBoYSIsCisgICAgImJldGEiLAorICAgICJjaGkiLAorICAgICJkZWx0YSIsCisgICAgImVwc2lsb24iLAorICAgICJwaGkiLAorICAgICJnYW1tYSIsCisgICAgImV0YSIsCisgICAgImlvdGEiLAorICAgICJwaGkxIiwKKyAgICAia2FwcGEiLAorICAgICJsYW1iZGEiLAorICAgICJtdSIsCisgICAgIm51IiwKKyAgICAib21pY3JvbiIsCisgICAgInBpIiwKKyAgICAidGhldGEiLAorICAgICJyaG8iLAorICAgICJzaWdtYSIsCisgICAgInRhdSIsCisgICAgInVwc2lsb24iLAorICAgICJvbWVnYTEiLAorICAgICJvbWVnYSIsCisgICAgInhpIiwKKyAgICAicHNpIiwKKyAgICAiemV0YSIsCisgICAgImJyYWNlbGVmdCIsCisgICAgImJhciIsCisgICAgImJyYWNlcmlnaHQiLAorICAgICJzaW1pbGFyIiwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICAiRXVybyIsCisgICAgIlVwc2lsb24xIiwKKyAgICAibWludXRlIiwKKyAgICAibGVzc2VxdWFsIiwKKyAgICAiZnJhY3Rpb24iLAorICAgICJpbmZpbml0eSIsCisgICAgImZsb3JpbiIsCisgICAgImNsdWIiLAorICAgICJkaWFtb25kIiwKKyAgICAiaGVhcnQiLAorICAgICJzcGFkZSIsCisgICAgImFycm93Ym90aCIsCisgICAgImFycm93bGVmdCIsCisgICAgImFycm93dXAiLAorICAgICJhcnJvd3JpZ2h0IiwKKyAgICAiYXJyb3dkb3duIiwKKyAgICAiZGVncmVlIiwKKyAgICAicGx1c21pbnVzIiwKKyAgICAic2Vjb25kIiwKKyAgICAiZ3JlYXRlcmVxdWFsIiwKKyAgICAibXVsdGlwbHkiLAorICAgICJwcm9wb3J0aW9uYWwiLAorICAgICJwYXJ0aWFsZGlmZiIsCisgICAgImJ1bGxldCIsCisgICAgImRpdmlkZSIsCisgICAgIm5vdGVxdWFsIiwKKyAgICAiZXF1aXZhbGVuY2UiLAorICAgICJhcHByb3hlcXVhbCIsCisgICAgImVsbGlwc2lzIiwKKyAgICAiYXJyb3d2ZXJ0ZXgiLAorICAgICJhcnJvd2hvcml6ZXgiLAorICAgICJjYXJyaWFnZXJldHVybiIsCisgICAgImFsZXBoIiwKKyAgICAiSWZyYWt0dXIiLAorICAgICJSZnJha3R1ciIsCisgICAgIndlaWVyc3RyYXNzIiwKKyAgICAiY2lyY2xlbXVsdGlwbHkiLAorICAgICJjaXJjbGVwbHVzIiwKKyAgICAiZW1wdHlzZXQiLAorICAgICJpbnRlcnNlY3Rpb24iLAorICAgICJ1bmlvbiIsCisgICAgInByb3BlcnN1cGVyc2V0IiwKKyAgICAicmVmbGV4c3VwZXJzZXQiLAorICAgICJub3RzdWJzZXQiLAorICAgICJwcm9wZXJzdWJzZXQiLAorICAgICJyZWZsZXhzdWJzZXQiLAorICAgICJlbGVtZW50IiwKKyAgICAibm90ZWxlbWVudCIsCisgICAgImFuZ2xlIiwKKyAgICAiZ3JhZGllbnQiLAorICAgICJyZWdpc3RlcnNlcmlmIiwKKyAgICAiY29weXJpZ2h0c2VyaWYiLAorICAgICJ0cmFkZW1hcmtzZXJpZiIsCisgICAgInByb2R1Y3QiLAorICAgICJyYWRpY2FsIiwKKyAgICAiZG90bWF0aCIsCisgICAgImxvZ2ljYWxub3QiLAorICAgICJsb2dpY2FsYW5kIiwKKyAgICAibG9naWNhbG9yIiwKKyAgICAiYXJyb3dkYmxib3RoIiwKKyAgICAiYXJyb3dkYmxsZWZ0IiwKKyAgICAiYXJyb3dkYmx1cCIsCisgICAgImFycm93ZGJscmlnaHQiLAorICAgICJhcnJvd2RibGRvd24iLAorICAgICJsb3plbmdlIiwKKyAgICAiYW5nbGVsZWZ0IiwKKyAgICAicmVnaXN0ZXJzYW5zIiwKKyAgICAiY29weXJpZ2h0c2FucyIsCisgICAgInRyYWRlbWFya3NhbnMiLAorICAgICJzdW1tYXRpb24iLAorICAgICJwYXJlbmxlZnR0cCIsCisgICAgInBhcmVubGVmdGV4IiwKKyAgICAicGFyZW5sZWZ0YnQiLAorICAgICJicmFja2V0bGVmdHRwIiwKKyAgICAiYnJhY2tldGxlZnRleCIsCisgICAgImJyYWNrZXRsZWZ0YnQiLAorICAgICJicmFjZWxlZnR0cCIsCisgICAgImJyYWNlbGVmdG1pZCIsCisgICAgImJyYWNlbGVmdGJ0IiwKKyAgICAiYnJhY2VleCIsCisgICAgTlVMTCwKKyAgICAiYW5nbGVyaWdodCIsCisgICAgImludGVncmFsIiwKKyAgICAiaW50ZWdyYWx0cCIsCisgICAgImludGVncmFsZXgiLAorICAgICJpbnRlZ3JhbGJ0IiwKKyAgICAicGFyZW5yaWdodHRwIiwKKyAgICAicGFyZW5yaWdodGV4IiwKKyAgICAicGFyZW5yaWdodGJ0IiwKKyAgICAiYnJhY2tldHJpZ2h0dHAiLAorICAgICJicmFja2V0cmlnaHRleCIsCisgICAgImJyYWNrZXRyaWdodGJ0IiwKKyAgICAiYnJhY2VyaWdodHRwIiwKKyAgICAiYnJhY2VyaWdodG1pZCIsCisgICAgImJyYWNlcmlnaHRidCIsCisgICAgTlVMTCwKK307CitzdGF0aWMgY29uc3QgRlhfQ0hBUiogY29uc3QgWmFwZkVuY29kaW5nTmFtZXNbMjI0XSA9IHsKKyAgICAic3BhY2UiLCAiYTEiLCAgICJhMiIsICAgImEyMDIiLCAiYTMiLCAgICJhNCIsICAgImE1IiwgICAiYTExOSIsICJhMTE4IiwKKyAgICAiYTExNyIsICAiYTExIiwgICJhMTIiLCAgImExMyIsICAiYTE0IiwgICJhMTUiLCAgImExNiIsICAiYTEwNSIsICJhMTciLAorICAgICJhMTgiLCAgICJhMTkiLCAgImEyMCIsICAiYTIxIiwgICJhMjIiLCAgImEyMyIsICAiYTI0IiwgICJhMjUiLCAgImEyNiIsCisgICAgImEyNyIsICAgImEyOCIsICAiYTYiLCAgICJhNyIsICAgImE4IiwgICAiYTkiLCAgICJhMTAiLCAgImEyOSIsICAiYTMwIiwKKyAgICAiYTMxIiwgICAiYTMyIiwgICJhMzMiLCAgImEzNCIsICAiYTM1IiwgICJhMzYiLCAgImEzNyIsICAiYTM4IiwgICJhMzkiLAorICAgICJhNDAiLCAgICJhNDEiLCAgImE0MiIsICAiYTQzIiwgICJhNDQiLCAgImE0NSIsICAiYTQ2IiwgICJhNDciLCAgImE0OCIsCisgICAgImE0OSIsICAgImE1MCIsICAiYTUxIiwgICJhNTIiLCAgImE1MyIsICAiYTU0IiwgICJhNTUiLCAgImE1NiIsICAiYTU3IiwKKyAgICAiYTU4IiwgICAiYTU5IiwgICJhNjAiLCAgImE2MSIsICAiYTYyIiwgICJhNjMiLCAgImE2NCIsICAiYTY1IiwgICJhNjYiLAorICAgICJhNjciLCAgICJhNjgiLCAgImE2OSIsICAiYTcwIiwgICJhNzEiLCAgImE3MiIsICAiYTczIiwgICJhNzQiLCAgImEyMDMiLAorICAgICJhNzUiLCAgICJhMjA0IiwgImE3NiIsICAiYTc3IiwgICJhNzgiLCAgImE3OSIsICAiYTgxIiwgICJhODIiLCAgImE4MyIsCisgICAgImE4NCIsICAgImE5NyIsICAiYTk4IiwgICJhOTkiLCAgImExMDAiLCBOVUxMLCAgICJhODkiLCAgImE5MCIsICAiYTkzIiwKKyAgICAiYTk0IiwgICAiYTkxIiwgICJhOTIiLCAgImEyMDUiLCAiYTg1IiwgICJhMjA2IiwgImE4NiIsICAiYTg3IiwgICJhODgiLAorICAgICJhOTUiLCAgICJhOTYiLCAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwKKyAgICBOVUxMLCAgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsCisgICAgTlVMTCwgICAgTlVMTCwgICBOVUxMLCAgICJhMTAxIiwgImExMDIiLCAiYTEwMyIsICJhMTA0IiwgImExMDYiLCAiYTEwNyIsCisgICAgImExMDgiLCAgImExMTIiLCAiYTExMSIsICJhMTEwIiwgImExMDkiLCAiYTEyMCIsICJhMTIxIiwgImExMjIiLCAiYTEyMyIsCisgICAgImExMjQiLCAgImExMjUiLCAiYTEyNiIsICJhMTI3IiwgImExMjgiLCAiYTEyOSIsICJhMTMwIiwgImExMzEiLCAiYTEzMiIsCisgICAgImExMzMiLCAgImExMzQiLCAiYTEzNSIsICJhMTM2IiwgImExMzciLCAiYTEzOCIsICJhMTM5IiwgImExNDAiLCAiYTE0MSIsCisgICAgImExNDIiLCAgImExNDMiLCAiYTE0NCIsICJhMTQ1IiwgImExNDYiLCAiYTE0NyIsICJhMTQ4IiwgImExNDkiLCAiYTE1MCIsCisgICAgImExNTEiLCAgImExNTIiLCAiYTE1MyIsICJhMTU0IiwgImExNTUiLCAiYTE1NiIsICJhMTU3IiwgImExNTgiLCAiYTE1OSIsCisgICAgImExNjAiLCAgImExNjEiLCAiYTE2MyIsICJhMTY0IiwgImExOTYiLCAiYTE2NSIsICJhMTkyIiwgImExNjYiLCAiYTE2NyIsCisgICAgImExNjgiLCAgImExNjkiLCAiYTE3MCIsICJhMTcxIiwgImExNzIiLCAiYTE3MyIsICJhMTYyIiwgImExNzQiLCAiYTE3NSIsCisgICAgImExNzYiLCAgImExNzciLCAiYTE3OCIsICJhMTc5IiwgImExOTMiLCAiYTE4MCIsICJhMTk5IiwgImExODEiLCAiYTIwMCIsCisgICAgImExODIiLCAgTlVMTCwgICAiYTIwMSIsICJhMTgzIiwgImExODQiLCAiYTE5NyIsICJhMTg1IiwgImExOTQiLCAiYTE5OCIsCisgICAgImExODYiLCAgImExOTUiLCAiYTE4NyIsICJhMTg4IiwgImExODkiLCAiYTE5MCIsICJhMTkxIiwgTlVMTH07Citjb25zdCBGWF9DSEFSKiBQREZfQ2hhck5hbWVGcm9tUHJlZGVmaW5lZENoYXJTZXQoaW50IGVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2hhcmNvZGUpIHsKKyAgaWYgKGVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfUERGRE9DKSB7CisgICAgaWYgKGNoYXJjb2RlIDwgMjQpIHsKKyAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLWNvbnN0IEZYX1dPUkQqIFBERl9Vbmljb2Rlc0ZvclByZWRlZmluZWRDaGFyU2V0KGludCBlbmNvZGluZykKLXsKLSAgICBzd2l0Y2ggKGVuY29kaW5nKSB7Ci0gICAgICAgIGNhc2UgUERGRk9OVF9FTkNPRElOR19XSU5BTlNJOgotICAgICAgICAgICAgcmV0dXJuIEFkb2JlV2luQW5zaUVuY29kaW5nOwotICAgICAgICBjYXNlIFBERkZPTlRfRU5DT0RJTkdfTUFDUk9NQU46Ci0gICAgICAgICAgICByZXR1cm4gTWFjUm9tYW5FbmNvZGluZzsKLSAgICAgICAgY2FzZSBQREZGT05UX0VOQ09ESU5HX01BQ0VYUEVSVDoKLSAgICAgICAgICAgIHJldHVybiBNYWNFeHBlcnRFbmNvZGluZzsKLSAgICAgICAgY2FzZSBQREZGT05UX0VOQ09ESU5HX1NUQU5EQVJEOgotICAgICAgICAgICAgcmV0dXJuIFN0YW5kYXJkRW5jb2Rpbmc7Ci0gICAgICAgIGNhc2UgUERGRk9OVF9FTkNPRElOR19BRE9CRV9TWU1CT0w6Ci0gICAgICAgICAgICByZXR1cm4gQWRvYmVTeW1ib2xFbmNvZGluZzsKLSAgICAgICAgY2FzZSBQREZGT05UX0VOQ09ESU5HX1pBUEZESU5HQkFUUzoKLSAgICAgICAgICAgIHJldHVybiBaYXBmRW5jb2Rpbmc7Ci0gICAgICAgIGNhc2UgUERGRk9OVF9FTkNPRElOR19QREZET0M6Ci0gICAgICAgICAgICByZXR1cm4gUERGRG9jRW5jb2Rpbmc7Ci0gICAgICAgIGNhc2UgUERGRk9OVF9FTkNPRElOR19NU19TWU1CT0w6Ci0gICAgICAgICAgICByZXR1cm4gTVNTeW1ib2xFbmNvZGluZzsKKyAgICBjaGFyY29kZSAtPSAyNDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoY2hhcmNvZGUgPCAzMikgeworICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHJldHVybiBOVUxMOworICAgIGNoYXJjb2RlIC09IDMyOworICB9CisgIHN3aXRjaCAoZW5jb2RpbmcpIHsKKyAgICBjYXNlIFBERkZPTlRfRU5DT0RJTkdfV0lOQU5TSToKKyAgICAgIHJldHVybiBBZG9iZVdpbkFuc2lFbmNvZGluZ05hbWVzW2NoYXJjb2RlXTsKKyAgICBjYXNlIFBERkZPTlRfRU5DT0RJTkdfTUFDUk9NQU46CisgICAgICByZXR1cm4gTWFjUm9tYW5FbmNvZGluZ05hbWVzW2NoYXJjb2RlXTsKKyAgICBjYXNlIFBERkZPTlRfRU5DT0RJTkdfTUFDRVhQRVJUOgorICAgICAgcmV0dXJuIE1hY0V4cGVydEVuY29kaW5nTmFtZXNbY2hhcmNvZGVdOworICAgIGNhc2UgUERGRk9OVF9FTkNPRElOR19TVEFOREFSRDoKKyAgICAgIHJldHVybiBTdGFuZGFyZEVuY29kaW5nTmFtZXNbY2hhcmNvZGVdOworICAgIGNhc2UgUERGRk9OVF9FTkNPRElOR19BRE9CRV9TWU1CT0w6CisgICAgICByZXR1cm4gQWRvYmVTeW1ib2xFbmNvZGluZ05hbWVzW2NoYXJjb2RlXTsKKyAgICBjYXNlIFBERkZPTlRfRU5DT0RJTkdfWkFQRkRJTkdCQVRTOgorICAgICAgcmV0dXJuIFphcGZFbmNvZGluZ05hbWVzW2NoYXJjb2RlXTsKKyAgICBjYXNlIFBERkZPTlRfRU5DT0RJTkdfUERGRE9DOgorICAgICAgcmV0dXJuIFBERkRvY0VuY29kaW5nTmFtZXNbY2hhcmNvZGVdOworICB9CisgIHJldHVybiBOVUxMOwogfQotRlhfRFdPUkQgUERGX1ByZWRlZmluZWRDaGFyQ29kZUZyb21Vbmljb2RlKGludCBlbmNvZGluZywgRlhfV0NIQVIgdW5pY29kZSkKLXsKLSAgICByZXR1cm4gUERGX0ZpbmRDb2RlKFBERl9Vbmljb2Rlc0ZvclByZWRlZmluZWRDaGFyU2V0KGVuY29kaW5nKSwgdW5pY29kZSk7CitGWF9XQ0hBUiBGVF9Vbmljb2RlRnJvbUNoYXJDb2RlKGludCBlbmNvZGluZywgRlhfRFdPUkQgY2hhcmNvZGUpIHsKKyAgc3dpdGNoIChlbmNvZGluZykgeworICAgIGNhc2UgRlhGVF9FTkNPRElOR19VTklDT0RFOgorICAgICAgcmV0dXJuIChGWF9XT1JEKWNoYXJjb2RlOworICAgIGNhc2UgRlhGVF9FTkNPRElOR19BRE9CRV9TVEFOREFSRDoKKyAgICAgIHJldHVybiBTdGFuZGFyZEVuY29kaW5nWyh1aW50OF90KWNoYXJjb2RlXTsKKyAgICBjYXNlIEZYRlRfRU5DT0RJTkdfQURPQkVfRVhQRVJUOgorICAgICAgcmV0dXJuIE1hY0V4cGVydEVuY29kaW5nWyh1aW50OF90KWNoYXJjb2RlXTsKKyAgICBjYXNlIEZYRlRfRU5DT0RJTkdfQURPQkVfTEFUSU5fMToKKyAgICAgIHJldHVybiBBZG9iZVdpbkFuc2lFbmNvZGluZ1sodWludDhfdCljaGFyY29kZV07CisgICAgY2FzZSBGWEZUX0VOQ09ESU5HX0FQUExFX1JPTUFOOgorICAgICAgcmV0dXJuIE1hY1JvbWFuRW5jb2RpbmdbKHVpbnQ4X3QpY2hhcmNvZGVdOworICAgIGNhc2UgUERGRk9OVF9FTkNPRElOR19QREZET0M6CisgICAgICByZXR1cm4gUERGRG9jRW5jb2RpbmdbKHVpbnQ4X3QpY2hhcmNvZGVdOworICB9CisgIHJldHVybiAwOwogfQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotZXh0ZXJuIGludCBGWEZUX3VuaWNvZGVfZnJvbV9hZG9iZV9uYW1lKGNvbnN0IGNoYXIqIG5hbWUpOwotZXh0ZXJuIHZvaWQgRlhGVF9hZG9iZV9uYW1lX2Zyb21fdW5pY29kZShjaGFyKiBnbHlwaF9uYW1lLCBGWF9XQ0hBUiB1bmljb2RlKTsKLSNpZmRlZiBfX2NwbHVzcGx1cworc3RhdGljIEZYX0RXT1JEIFBERl9GaW5kQ29kZShjb25zdCBGWF9XT1JEKiBwQ29kZXMsIEZYX1dPUkQgdW5pY29kZSkgeworICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgaWYgKHBDb2Rlc1tpXSA9PSB1bmljb2RlKSB7CisgICAgICByZXR1cm4gaTsKKyAgICB9CisgIHJldHVybiAwOwogfQotI2VuZGlmCi1GWF9XQ0hBUiBQREZfVW5pY29kZUZyb21BZG9iZU5hbWUoY29uc3QgRlhfQ0hBUiogbmFtZSkKLXsKLSAgICByZXR1cm4gKEZYX1dDSEFSKShGWEZUX3VuaWNvZGVfZnJvbV9hZG9iZV9uYW1lKG5hbWUpICYgMHg3RkZGRkZGRik7CitzdGF0aWMgY29uc3QgRlhfV09SRCBNU1N5bWJvbEVuY29kaW5nWzI1Nl0gPSB7CisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDMyLCAgICAgMzMsICAgICA4NzA0LCAgIDM1LAorICAgIDg3MDcsICAgMzcsICAgICAzOCwgICAgIDg3MTUsICAgNDAsICAgICA0MSwgICAgIDg3MjcsICAgNDMsICAgICA0NCwKKyAgICA4NzIyLCAgIDQ2LCAgICAgNDcsICAgICA0OCwgICAgIDQ5LCAgICAgNTAsICAgICA1MSwgICAgIDUyLCAgICAgNTMsCisgICAgNTQsICAgICA1NSwgICAgIDU2LCAgICAgNTcsICAgICA1OCwgICAgIDU5LCAgICAgNjAsICAgICA2MSwgICAgIDYyLAorICAgIDYzLCAgICAgODc3MywgICA5MTMsICAgIDkxNCwgICAgOTM1LCAgICA5MTYsICAgIDkxNywgICAgOTM0LCAgICA5MTUsCisgICAgOTE5LCAgICA5MjEsICAgIDk3NywgICAgOTIyLCAgICA5MjMsICAgIDkyNCwgICAgOTI1LCAgICA5MjcsICAgIDkyOCwKKyAgICA5MjAsICAgIDkyOSwgICAgOTMxLCAgICA5MzIsICAgIDkzMywgICAgOTYyLCAgICA5MzcsICAgIDkyNiwgICAgOTM2LAorICAgIDkxOCwgICAgOTEsICAgICA4NzU2LCAgIDkzLCAgICAgODg2OSwgICA5NSwgICAgIDgyNTQsICAgOTQ1LCAgICA5NDYsCisgICAgOTY3LCAgICA5NDgsICAgIDk0OSwgICAgOTY2LCAgICA5NDcsICAgIDk1MSwgICAgOTUzLCAgICA5ODEsICAgIDk1NCwKKyAgICA5NTUsICAgIDk1NiwgICAgOTU3LCAgICA5NTksICAgIDk2MCwgICAgOTUyLCAgICA5NjEsICAgIDk2MywgICAgOTY0LAorICAgIDk2NSwgICAgOTgyLCAgICA5NjksICAgIDk1OCwgICAgOTY4LCAgICA5NTAsICAgIDEyMywgICAgMTI0LCAgICAxMjUsCisgICAgODc2NCwgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDk3OCwKKyAgICA4MjQyLCAgIDg4MDQsICAgODcyNSwgICA4NzM0LCAgIDQwMiwgICAgOTgyNywgICA5ODMwLCAgIDk4MjgsICAgOTgyNCwKKyAgICA4NTk2LCAgIDg1OTIsICAgODU5MywgICA4NTk0LCAgIDg1OTUsICAgMTc2LCAgICAxNzcsICAgIDgyNDMsICAgODgwNSwKKyAgICAyMTUsICAgIDg3MzMsICAgODcwNiwgICA4NzI5LCAgIDI0NywgICAgODgwMCwgICA4ODAxLCAgIDg3NzYsICAgODk0MywKKyAgICAwLCAgICAgIDAsICAgICAgODYyOSwgICAwLCAgICAgIDg0NjUsICAgODQ3NiwgICA4NDcyLCAgIDg4NTUsICAgODg1MywKKyAgICA4NzA5LCAgIDg3NDUsICAgODc0NiwgICA4ODM1LCAgIDg4MzksICAgODgzNiwgICA4ODM0LCAgIDg4MzgsICAgODcxMiwKKyAgICA4NzEzLCAgIDg3MzYsICAgODcxMSwgICAxNzQsICAgIDE2OSwgICAgODQ4MiwgICA4NzE5LCAgIDg3MzAsICAgODkwMSwKKyAgICAxNzIsICAgIDg3NDMsICAgODc0NCwgICA4NjYwLCAgIDg2NTYsICAgODY1NywgICA4NjU4LCAgIDg2NTksICAgOTY3NCwKKyAgICA5MDAxLCAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDg3MjEsICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAweDAwMDAsIDkwMDIsICAgODc0NywKKyAgICA4OTkyLCAgIDAsICAgICAgODk5MywgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDB9OworRlhfRFdPUkQgRlRfQ2hhckNvZGVGcm9tVW5pY29kZShpbnQgZW5jb2RpbmcsIEZYX1dDSEFSIHVuaWNvZGUpIHsKKyAgc3dpdGNoIChlbmNvZGluZykgeworICAgIGNhc2UgRlhGVF9FTkNPRElOR19VTklDT0RFOgorICAgICAgcmV0dXJuIHVuaWNvZGU7CisgICAgY2FzZSBGWEZUX0VOQ09ESU5HX0FET0JFX1NUQU5EQVJEOgorICAgICAgcmV0dXJuIFBERl9GaW5kQ29kZShTdGFuZGFyZEVuY29kaW5nLCB1bmljb2RlKTsKKyAgICBjYXNlIEZYRlRfRU5DT0RJTkdfQURPQkVfRVhQRVJUOgorICAgICAgcmV0dXJuIFBERl9GaW5kQ29kZShNYWNFeHBlcnRFbmNvZGluZywgdW5pY29kZSk7CisgICAgY2FzZSBGWEZUX0VOQ09ESU5HX0FET0JFX0xBVElOXzE6CisgICAgICByZXR1cm4gUERGX0ZpbmRDb2RlKEFkb2JlV2luQW5zaUVuY29kaW5nLCB1bmljb2RlKTsKKyAgICBjYXNlIEZYRlRfRU5DT0RJTkdfQVBQTEVfUk9NQU46CisgICAgICByZXR1cm4gUERGX0ZpbmRDb2RlKE1hY1JvbWFuRW5jb2RpbmcsIHVuaWNvZGUpOworICAgIGNhc2UgRlhGVF9FTkNPRElOR19BRE9CRV9DVVNUT006CisgICAgICByZXR1cm4gUERGX0ZpbmRDb2RlKFBERkRvY0VuY29kaW5nLCB1bmljb2RlKTsKKyAgICBjYXNlIEZYRlRfRU5DT0RJTkdfTVNfU1lNQk9MOgorICAgICAgcmV0dXJuIFBERl9GaW5kQ29kZShNU1N5bWJvbEVuY29kaW5nLCB1bmljb2RlKTsKKyAgfQorICByZXR1cm4gMDsKIH0KLUNGWF9CeXRlU3RyaW5nIFBERl9BZG9iZU5hbWVGcm9tVW5pY29kZShGWF9XQ0hBUiB1bmljb2RlKQotewotICAgIGNoYXIgZ2x5cGhfbmFtZVs2NF07Ci0gICAgRlhGVF9hZG9iZV9uYW1lX2Zyb21fdW5pY29kZShnbHlwaF9uYW1lLCB1bmljb2RlKTsKLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoZ2x5cGhfbmFtZSwgLTEpOworY29uc3QgRlhfV09SRCogUERGX1VuaWNvZGVzRm9yUHJlZGVmaW5lZENoYXJTZXQoaW50IGVuY29kaW5nKSB7CisgIHN3aXRjaCAoZW5jb2RpbmcpIHsKKyAgICBjYXNlIFBERkZPTlRfRU5DT0RJTkdfV0lOQU5TSToKKyAgICAgIHJldHVybiBBZG9iZVdpbkFuc2lFbmNvZGluZzsKKyAgICBjYXNlIFBERkZPTlRfRU5DT0RJTkdfTUFDUk9NQU46CisgICAgICByZXR1cm4gTWFjUm9tYW5FbmNvZGluZzsKKyAgICBjYXNlIFBERkZPTlRfRU5DT0RJTkdfTUFDRVhQRVJUOgorICAgICAgcmV0dXJuIE1hY0V4cGVydEVuY29kaW5nOworICAgIGNhc2UgUERGRk9OVF9FTkNPRElOR19TVEFOREFSRDoKKyAgICAgIHJldHVybiBTdGFuZGFyZEVuY29kaW5nOworICAgIGNhc2UgUERGRk9OVF9FTkNPRElOR19BRE9CRV9TWU1CT0w6CisgICAgICByZXR1cm4gQWRvYmVTeW1ib2xFbmNvZGluZzsKKyAgICBjYXNlIFBERkZPTlRfRU5DT0RJTkdfWkFQRkRJTkdCQVRTOgorICAgICAgcmV0dXJuIFphcGZFbmNvZGluZzsKKyAgICBjYXNlIFBERkZPTlRfRU5DT0RJTkdfUERGRE9DOgorICAgICAgcmV0dXJuIFBERkRvY0VuY29kaW5nOworICAgIGNhc2UgUERGRk9OVF9FTkNPRElOR19NU19TWU1CT0w6CisgICAgICByZXR1cm4gTVNTeW1ib2xFbmNvZGluZzsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KK0ZYX0RXT1JEIFBERl9QcmVkZWZpbmVkQ2hhckNvZGVGcm9tVW5pY29kZShpbnQgZW5jb2RpbmcsIEZYX1dDSEFSIHVuaWNvZGUpIHsKKyAgcmV0dXJuIFBERl9GaW5kQ29kZShQREZfVW5pY29kZXNGb3JQcmVkZWZpbmVkQ2hhclNldChlbmNvZGluZyksIHVuaWNvZGUpOworfQorRlhfV0NIQVIgUERGX1VuaWNvZGVGcm9tQWRvYmVOYW1lKGNvbnN0IEZYX0NIQVIqIG5hbWUpIHsKKyAgcmV0dXJuIChGWF9XQ0hBUikoRlhGVF91bmljb2RlX2Zyb21fYWRvYmVfbmFtZShuYW1lKSAmIDB4N0ZGRkZGRkYpOworfQorQ0ZYX0J5dGVTdHJpbmcgUERGX0Fkb2JlTmFtZUZyb21Vbmljb2RlKEZYX1dDSEFSIHVuaWNvZGUpIHsKKyAgY2hhciBnbHlwaF9uYW1lWzY0XTsKKyAgRlhGVF9hZG9iZV9uYW1lX2Zyb21fdW5pY29kZShnbHlwaF9uYW1lLCB1bmljb2RlKTsKKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKGdseXBoX25hbWUpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZnBkZl9mb250X2NpZC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnRfY2lkLmNwcAppbmRleCBhMDg2NjBjLi42ZTdhMDUxIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnRfY2lkLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnRfY2lkLmNwcApAQCAtMSwxNDI5ICsxLDM2NyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oIgogI2luY2x1ZGUgImZvbnRfaW50LmgiCi0jaW5jbHVkZSAiLi4vZnBkZl9jbWFwcy9jbWFwX2ludC5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhnZS9meF9nZS5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhnZS9meF9mcmVldHlwZS5oIgotZXh0ZXJuIEZYX0RXT1JEIEZUX0NoYXJDb2RlRnJvbVVuaWNvZGUoaW50IGVuY29kaW5nLCBGWF9XQ0hBUiB1bmljb2RlKTsKLWV4dGVybiBzaG9ydCBUVDJQREYoaW50IG0sIEZYRlRfRmFjZSBmYWNlKTsKLWV4dGVybiBGWF9CT09MIEZUX1VzZVRUQ2hhcm1hcChGWEZUX0ZhY2UgZmFjZSwgaW50IHBsYXRmb3JtX2lkLCBpbnQgZW5jb2RpbmdfaWQpOwotZXh0ZXJuIEZYX0xQQ1NUUiBHZXRBZG9iZUNoYXJOYW1lKGludCBpQmFzZUVuY29kaW5nLCBjb25zdCBDRlhfQnl0ZVN0cmluZyogcENoYXJOYW1lcywgaW50IGNoYXJjb2RlKTsKLUNQREZfQ01hcE1hbmFnZXI6OkNQREZfQ01hcE1hbmFnZXIoKQotewotICAgIG1fYlByb21wdGVkID0gRkFMU0U7Ci0gICAgRlhTWVNfbWVtc2V0MzIobV9DSUQyVW5pY29kZU1hcHMsIDAsIHNpemVvZiBtX0NJRDJVbmljb2RlTWFwcyk7Ci19Ci1DUERGX0NNYXBNYW5hZ2VyOjp+Q1BERl9DTWFwTWFuYWdlcigpCi17Ci0gICAgRHJvcEFsbChGQUxTRSk7Ci19Ci1DUERGX0NNYXAqIENQREZfQ01hcE1hbmFnZXI6OkdldFByZWRlZmluZWRDTWFwKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBGWF9CT09MIGJQcm9tcHRDSkspCi17Ci0gICAgQ1BERl9DTWFwKiBwQ01hcDsKLSAgICBpZiAobV9DTWFwcy5Mb29rdXAobmFtZSwgKEZYX0xQVk9JRCYpcENNYXApKSB7Ci0gICAgICAgIHJldHVybiBwQ01hcDsKLSAgICB9Ci0gICAgcENNYXAgPSBMb2FkUHJlZGVmaW5lZENNYXAobmFtZSwgYlByb21wdENKSyk7Ci0gICAgaWYgKG5hbWUuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBwQ01hcDsKLSAgICB9Ci0gICAgbV9DTWFwcy5TZXRBdChuYW1lLCBwQ01hcCk7Ci0gICAgcmV0dXJuIHBDTWFwOwotfQotQ1BERl9DTWFwKiBDUERGX0NNYXBNYW5hZ2VyOjpMb2FkUHJlZGVmaW5lZENNYXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsIEZYX0JPT0wgYlByb21wdENKSykKLXsKLSAgICBDUERGX0NNYXAqIHBDTWFwID0gbmV3IENQREZfQ01hcDsKLSAgICBGWF9MUENTVFIgcG5hbWUgPSBuYW1lOwotICAgIGlmICgqcG5hbWUgPT0gJy8nKSB7Ci0gICAgICAgIHBuYW1lICsrOwotICAgIH0KLSAgICBwQ01hcC0+TG9hZFByZWRlZmluZWQodGhpcywgcG5hbWUsIGJQcm9tcHRDSkspOwotICAgIHJldHVybiBwQ01hcDsKLX0KLXN0YXRpYyBjb25zdCBGWF9MUENTVFIgZ19DaGFyc2V0TmFtZXNbTlVNQkVSX09GX0NJRFNFVFNdID0ge05VTEwsICJHQjEiLCAiQ05TMSIsICJKYXBhbjEiLCAiS29yZWExIiwgIlVDUyIgfTsKLXN0YXRpYyBjb25zdCBpbnQgZ19DaGFyc2V0Q1BzW05VTUJFUl9PRl9DSURTRVRTXSA9IHswLCA5MzYsIDk1MCwgOTMyLCA5NDksIDEyMDAgfTsKLWludCBfQ2hhcnNldEZyb21PcmRlcmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgT3JkZXJpbmcpCi17Ci0JZm9yIChpbnQgY2hhcnNldCA9IDE7IGNoYXJzZXQgPCBOVU1CRVJfT0ZfQ0lEU0VUUzsgY2hhcnNldCsrKSB7Ci0JCWlmIChPcmRlcmluZyA9PSBDRlhfQnl0ZVN0cmluZ0MoZ19DaGFyc2V0TmFtZXNbY2hhcnNldF0pKQotCQkJcmV0dXJuIGNoYXJzZXQ7Ci0JfQotCXJldHVybiBDSURTRVRfVU5LTk9XTjsKLX0KLXZvaWQgQ1BERl9DTWFwTWFuYWdlcjo6UmVsb2FkQWxsKCkKLXsKLSAgICBEcm9wQWxsKFRSVUUpOwotfQotdm9pZCBDUERGX0NNYXBNYW5hZ2VyOjpEcm9wQWxsKEZYX0JPT0wgYlJlbG9hZCkKLXsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBtX0NNYXBzLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIG5hbWU7Ci0gICAgICAgIENQREZfQ01hcCogcENNYXA7Ci0gICAgICAgIG1fQ01hcHMuR2V0TmV4dEFzc29jKHBvcywgbmFtZSwgKEZYX0xQVk9JRCYpcENNYXApOwotICAgICAgICBpZiAocENNYXAgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJSZWxvYWQpIHsKLSAgICAgICAgICAgIHBDTWFwLT5Mb2FkUHJlZGVmaW5lZCh0aGlzLCBuYW1lLCBGQUxTRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZWxldGUgcENNYXA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplb2YgbV9DSUQyVW5pY29kZU1hcHMgLyBzaXplb2YoQ1BERl9DSUQyVW5pY29kZU1hcCopOyBpICsrKSB7Ci0gICAgICAgIENQREZfQ0lEMlVuaWNvZGVNYXAqIHBNYXAgPSBtX0NJRDJVbmljb2RlTWFwc1tpXTsKLSAgICAgICAgaWYgKHBNYXAgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJSZWxvYWQpIHsKLSAgICAgICAgICAgIHBNYXAtPkxvYWQodGhpcywgaSwgRkFMU0UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVsZXRlIHBNYXA7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1DUERGX0NJRDJVbmljb2RlTWFwKiBDUERGX0NNYXBNYW5hZ2VyOjpHZXRDSUQyVW5pY29kZU1hcChpbnQgY2hhcnNldCwgRlhfQk9PTCBiUHJvbXB0Q0pLKQotewotICAgIGlmIChtX0NJRDJVbmljb2RlTWFwc1tjaGFyc2V0XSA9PSBOVUxMKSB7Ci0gICAgICAgIG1fQ0lEMlVuaWNvZGVNYXBzW2NoYXJzZXRdID0gTG9hZENJRDJVbmljb2RlTWFwKGNoYXJzZXQsIGJQcm9tcHRDSkspOwotICAgIH0KLSAgICByZXR1cm4gbV9DSUQyVW5pY29kZU1hcHNbY2hhcnNldF07Ci19Ci1DUERGX0NJRDJVbmljb2RlTWFwKiBDUERGX0NNYXBNYW5hZ2VyOjpMb2FkQ0lEMlVuaWNvZGVNYXAoaW50IGNoYXJzZXQsIEZYX0JPT0wgYlByb21wdENKSykKLXsKLSAgICBDUERGX0NJRDJVbmljb2RlTWFwKiBwTWFwID0gbmV3IENQREZfQ0lEMlVuaWNvZGVNYXAoKTsKLSAgICBpZiAoIXBNYXAtPkluaXRpYWxpemUoKSkgewotICAgICAgICBkZWxldGUgcE1hcDsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHBNYXAtPkxvYWQodGhpcywgY2hhcnNldCwgYlByb21wdENKSyk7Ci0gICAgcmV0dXJuIHBNYXA7Ci19Ci1DUERGX0NNYXBQYXJzZXI6OkNQREZfQ01hcFBhcnNlcigpCi17Ci0gICAgbV9wQ01hcCA9IE5VTEw7Ci0gICAgbV9TdGF0dXMgPSAwOwotICAgIG1fQ29kZVNlcSA9IDA7Ci19Ci1GWF9CT09MCUNQREZfQ01hcFBhcnNlcjo6SW5pdGlhbGl6ZShDUERGX0NNYXAqIHBDTWFwKQotewotICAgIG1fcENNYXAgPSBwQ01hcDsKLSAgICBtX1N0YXR1cyA9IDA7Ci0gICAgbV9Db2RlU2VxID0gMDsKLSAgICBtX0FkZE1hcHMuRXN0aW1hdGVTaXplKDAsIDEwMjQwKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLXN0YXRpYyBGWF9EV09SRCBDTWFwX0dldENvZGUoRlhfQlNUUiB3b3JkKQotewotICAgIGludCBudW0gPSAwOwotICAgIGlmICh3b3JkLkdldEF0KDApID09ICc8JykgewotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHdvcmQuR2V0TGVuZ3RoKCk7IGkgKyspIHsKLSAgICAgICAgICAgIEZYX0JZVEUgZGlnaXQgPSB3b3JkLkdldEF0KGkpOwotICAgICAgICAgICAgaWYgKGRpZ2l0ID49ICcwJyAmJiBkaWdpdCA8PSAnOScpIHsKLSAgICAgICAgICAgICAgICBkaWdpdCA9IGRpZ2l0IC0gJzAnOwotICAgICAgICAgICAgfSBlbHNlIGlmIChkaWdpdCA+PSAnYScgJiYgZGlnaXQgPD0gJ2YnKSB7Ci0gICAgICAgICAgICAgICAgZGlnaXQgPSBkaWdpdCAtICdhJyArIDEwOwotICAgICAgICAgICAgfSBlbHNlIGlmIChkaWdpdCA+PSAnQScgJiYgZGlnaXQgPD0gJ0YnKSB7Ci0gICAgICAgICAgICAgICAgZGlnaXQgPSBkaWdpdCAtICdBJyArIDEwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVtOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbnVtID0gbnVtICogMTYgKyBkaWdpdDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd29yZC5HZXRMZW5ndGgoKTsgaSArKykgewotICAgICAgICAgICAgaWYgKHdvcmQuR2V0QXQoaSkgPCAnMCcgfHwgd29yZC5HZXRBdChpKSA+ICc5JykgewotICAgICAgICAgICAgICAgIHJldHVybiBudW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBudW0gPSBudW0gKiAxMCArIHdvcmQuR2V0QXQoaSkgLSAnMCc7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bTsKLX0KLXN0YXRpYyBGWF9CT09MIF9DTWFwX0dldENvZGVSYW5nZShfQ01hcF9Db2RlUmFuZ2UmIHJhbmdlLCBGWF9CU1RSIGZpcnN0LCBGWF9CU1RSIHNlY29uZCkKLXsKLSAgICBpZiAoZmlyc3QuR2V0TGVuZ3RoKCkgPT0gMCB8fCBmaXJzdC5HZXRBdCgwKSAhPSAnPCcpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAxOyBpIDwgZmlyc3QuR2V0TGVuZ3RoKCk7IGkgKyspCi0gICAgICAgIGlmIChmaXJzdC5HZXRBdChpKSA9PSAnPicpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgcmFuZ2UubV9DaGFyU2l6ZSA9IChpIC0gMSkgLyAyOwotICAgIGlmIChyYW5nZS5tX0NoYXJTaXplID4gNCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCByYW5nZS5tX0NoYXJTaXplOyBpICsrKSB7Ci0gICAgICAgIEZYX0JZVEUgZGlnaXQxID0gZmlyc3QuR2V0QXQoaSAqIDIgKyAxKTsKLSAgICAgICAgRlhfQllURSBkaWdpdDIgPSBmaXJzdC5HZXRBdChpICogMiArIDIpOwotICAgICAgICBGWF9CWVRFIGJ5dGUgPSAoZGlnaXQxID49ICcwJyAmJiBkaWdpdDEgPD0gJzknKSA/IChkaWdpdDEgLSAnMCcpIDogKChkaWdpdDEgJiAweGRmKSAtICdBJyArIDEwKTsKLSAgICAgICAgYnl0ZSA9IGJ5dGUgKiAxNiArICgoZGlnaXQyID49ICcwJyAmJiBkaWdpdDIgPD0gJzknKSA/IChkaWdpdDIgLSAnMCcpIDogKChkaWdpdDIgJiAweGRmKSAtICdBJyArIDEwKSk7Ci0gICAgICAgIHJhbmdlLm1fTG93ZXJbaV0gPSBieXRlOwotICAgIH0KLSAgICBGWF9EV09SRCBzaXplID0gc2Vjb25kLkdldExlbmd0aCgpOwotICAgIGZvciAoaSA9IDA7IGkgPCByYW5nZS5tX0NoYXJTaXplOyBpICsrKSB7Ci0gICAgICAgIEZYX0JZVEUgZGlnaXQxID0gKChGWF9EV09SRClpICogMiArIDEgPCBzaXplKSA/IHNlY29uZC5HZXRBdCgoRlhfU1RSU0laRSlpICogMiArIDEpIDogMDsKLSAgICAgICAgRlhfQllURSBkaWdpdDIgPSAoKEZYX0RXT1JEKWkgKiAyICsgMiA8IHNpemUpID8gc2Vjb25kLkdldEF0KChGWF9TVFJTSVpFKWkgKiAyICsgMikgOiAwOwotICAgICAgICBGWF9CWVRFIGJ5dGUgPSAoZGlnaXQxID49ICcwJyAmJiBkaWdpdDEgPD0gJzknKSA/IChkaWdpdDEgLSAnMCcpIDogKChkaWdpdDEgJiAweGRmKSAtICdBJyArIDEwKTsKLSAgICAgICAgYnl0ZSA9IGJ5dGUgKiAxNiArICgoZGlnaXQyID49ICcwJyAmJiBkaWdpdDIgPD0gJzknKSA/IChkaWdpdDIgLSAnMCcpIDogKChkaWdpdDIgJiAweGRmKSAtICdBJyArIDEwKSk7Ci0gICAgICAgIHJhbmdlLm1fVXBwZXJbaV0gPSBieXRlOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLXN0YXRpYyBDRlhfQnl0ZVN0cmluZyBDTWFwX0dldFN0cmluZyhGWF9CU1RSIHdvcmQpCi17Ci0gICAgcmV0dXJuIHdvcmQuTWlkKDEsIHdvcmQuR2V0TGVuZ3RoKCkgLSAyKTsKLX0KLXZvaWQgQ1BERl9DTWFwUGFyc2VyOjpQYXJzZVdvcmQoRlhfQlNUUiB3b3JkKQotewotICAgIGlmICh3b3JkLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh3b3JkID09IEZYX0JTVFJDKCJiZWdpbmNpZGNoYXIiKSkgewotICAgICAgICBtX1N0YXR1cyA9IDE7Ci0gICAgICAgIG1fQ29kZVNlcSA9IDA7Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IEZYX0JTVFJDKCJiZWdpbmNpZHJhbmdlIikpIHsKLSAgICAgICAgbV9TdGF0dXMgPSAyOwotICAgICAgICBtX0NvZGVTZXEgPSAwOwotICAgIH0gZWxzZSBpZiAod29yZCA9PSBGWF9CU1RSQygiZW5kY2lkcmFuZ2UiKSB8fCB3b3JkID09IEZYX0JTVFJDKCJlbmRjaWRjaGFyIikpIHsKLSAgICAgICAgbV9TdGF0dXMgPSAwOwotICAgIH0gZWxzZSBpZiAod29yZCA9PSBGWF9CU1RSQygiL1dNb2RlIikpIHsKLSAgICAgICAgbV9TdGF0dXMgPSA2OwotICAgIH0gZWxzZSBpZiAod29yZCA9PSBGWF9CU1RSQygiL1JlZ2lzdHJ5IikpIHsKLSAgICAgICAgbV9TdGF0dXMgPSAzOwotICAgIH0gZWxzZSBpZiAod29yZCA9PSBGWF9CU1RSQygiL09yZGVyaW5nIikpIHsKLSAgICAgICAgbV9TdGF0dXMgPSA0OwotICAgIH0gZWxzZSBpZiAod29yZCA9PSBGWF9CU1RSQygiL1N1cHBsZW1lbnQiKSkgewotICAgICAgICBtX1N0YXR1cyA9IDU7Ci0gICAgfSBlbHNlIGlmICh3b3JkID09IEZYX0JTVFJDKCJiZWdpbmNvZGVzcGFjZXJhbmdlIikpIHsKLSAgICAgICAgbV9TdGF0dXMgPSA3OwotICAgICAgICBtX0NvZGVTZXEgPSAwOwotICAgIH0gZWxzZSBpZiAod29yZCA9PSBGWF9CU1RSQygidXNlY21hcCIpKSB7Ci0gICAgfSBlbHNlIGlmIChtX1N0YXR1cyA9PSAxIHx8IG1fU3RhdHVzID09IDIpIHsKLSAgICAgICAgbV9Db2RlUG9pbnRzW21fQ29kZVNlcV0gPSBDTWFwX0dldENvZGUod29yZCk7Ci0gICAgICAgIG1fQ29kZVNlcSArKzsKLSAgICAgICAgRlhfRFdPUkQgU3RhcnRDb2RlLCBFbmRDb2RlOwotICAgICAgICBGWF9XT1JEIFN0YXJ0Q0lEOwotICAgICAgICBpZiAobV9TdGF0dXMgPT0gMSkgewotICAgICAgICAgICAgaWYgKG1fQ29kZVNlcSA8IDIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFbmRDb2RlID0gU3RhcnRDb2RlID0gbV9Db2RlUG9pbnRzWzBdOwotICAgICAgICAgICAgU3RhcnRDSUQgPSAoRlhfV09SRCltX0NvZGVQb2ludHNbMV07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobV9Db2RlU2VxIDwgMykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0YXJ0Q29kZSA9IG1fQ29kZVBvaW50c1swXTsKLSAgICAgICAgICAgIEVuZENvZGUgPSBtX0NvZGVQb2ludHNbMV07Ci0gICAgICAgICAgICBTdGFydENJRCA9IChGWF9XT1JEKW1fQ29kZVBvaW50c1syXTsKLSAgICAgICAgfQotICAgICAgICBpZiAoRW5kQ29kZSA8IDB4MTAwMDApIHsKLSAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgY29kZSA9IFN0YXJ0Q29kZTsgY29kZSA8PSBFbmRDb2RlOyBjb2RlICsrKSB7Ci0gICAgICAgICAgICAgICAgbV9wQ01hcC0+bV9wTWFwcGluZ1tjb2RlXSA9IChGWF9XT1JEKShTdGFydENJRCArIGNvZGUgLSBTdGFydENvZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRlhfRFdPUkQgYnVmWzJdOwotICAgICAgICAgICAgYnVmWzBdID0gU3RhcnRDb2RlOwotICAgICAgICAgICAgYnVmWzFdID0gKChFbmRDb2RlIC0gU3RhcnRDb2RlKSA8PCAxNikgKyBTdGFydENJRDsKLSAgICAgICAgICAgIG1fQWRkTWFwcy5BcHBlbmRCbG9jayhidWYsIHNpemVvZiBidWYpOwotICAgICAgICB9Ci0gICAgICAgIG1fQ29kZVNlcSA9IDA7Ci0gICAgfSBlbHNlIGlmIChtX1N0YXR1cyA9PSAzKSB7Ci0gICAgICAgIENNYXBfR2V0U3RyaW5nKHdvcmQpOwotICAgICAgICBtX1N0YXR1cyA9IDA7Ci0gICAgfSBlbHNlIGlmIChtX1N0YXR1cyA9PSA0KSB7Ci0gICAgICAgIG1fcENNYXAtPm1fQ2hhcnNldCA9IF9DaGFyc2V0RnJvbU9yZGVyaW5nKENNYXBfR2V0U3RyaW5nKHdvcmQpKTsKLSAgICAgICAgbV9TdGF0dXMgPSAwOwotICAgIH0gZWxzZSBpZiAobV9TdGF0dXMgPT0gNSkgewotICAgICAgICBDTWFwX0dldENvZGUod29yZCk7Ci0gICAgICAgIG1fU3RhdHVzID0gMDsKLSAgICB9IGVsc2UgaWYgKG1fU3RhdHVzID09IDYpIHsKLSAgICAgICAgbV9wQ01hcC0+bV9iVmVydGljYWwgPSBDTWFwX0dldENvZGUod29yZCk7Ci0gICAgICAgIG1fU3RhdHVzID0gMDsKLSAgICB9IGVsc2UgaWYgKG1fU3RhdHVzID09IDcpIHsKLSAgICAgICAgaWYgKHdvcmQgPT0gRlhfQlNUUkMoImVuZGNvZGVzcGFjZXJhbmdlIikpIHsKLSAgICAgICAgICAgIGludCBuU2VncyA9IG1fQ29kZVJhbmdlcy5HZXRTaXplKCk7Ci0gICAgICAgICAgICBpZiAoblNlZ3MgPiAxKSB7Ci0gICAgICAgICAgICAgICAgbV9wQ01hcC0+bV9Db2RpbmdTY2hlbWUgPSBDUERGX0NNYXA6Ok1peGVkRm91ckJ5dGVzOwotICAgICAgICAgICAgICAgIG1fcENNYXAtPm1fbkNvZGVSYW5nZXMgPSBuU2VnczsKLSAgICAgICAgICAgICAgICBtX3BDTWFwLT5tX3BMZWFkaW5nQnl0ZXMgPSBGWF9BbGxvYzJEKEZYX0JZVEUsIG5TZWdzLCBzaXplb2YoX0NNYXBfQ29kZVJhbmdlKSk7Ci0gICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIobV9wQ01hcC0+bV9wTGVhZGluZ0J5dGVzLCBtX0NvZGVSYW5nZXMuR2V0RGF0YSgpLCBuU2VncyAqIHNpemVvZihfQ01hcF9Db2RlUmFuZ2UpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoblNlZ3MgPT0gMSkgewotICAgICAgICAgICAgICAgIG1fcENNYXAtPm1fQ29kaW5nU2NoZW1lID0gKG1fQ29kZVJhbmdlc1swXS5tX0NoYXJTaXplID09IDIpID8gQ1BERl9DTWFwOjpUd29CeXRlcyA6IENQREZfQ01hcDo6T25lQnl0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fU3RhdHVzID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICh3b3JkLkdldExlbmd0aCgpID09IDAgfHwgd29yZC5HZXRBdCgwKSAhPSAnPCcpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9Db2RlU2VxICUgMikgewotICAgICAgICAgICAgICAgIF9DTWFwX0NvZGVSYW5nZSByYW5nZTsKLSAgICAgICAgICAgICAgICBpZiAoX0NNYXBfR2V0Q29kZVJhbmdlKHJhbmdlLCBtX0xhc3RXb3JkLCB3b3JkKSkgewotICAgICAgICAgICAgICAgICAgICBtX0NvZGVSYW5nZXMuQWRkKHJhbmdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX0NvZGVTZXEgKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9MYXN0V29yZCA9IHdvcmQ7Ci19Ci1DUERGX0NNYXA6OkNQREZfQ01hcCgpCi17Ci0gICAgbV9DaGFyc2V0ID0gQ0lEU0VUX1VOS05PV047Ci0gICAgbV9Db2RpbmcgPSBDSURDT0RJTkdfVU5LTk9XTjsKLSAgICBtX0NvZGluZ1NjaGVtZSA9IFR3b0J5dGVzOwotICAgIG1fYlZlcnRpY2FsID0gMDsKLSAgICBtX2JMb2FkZWQgPSBGQUxTRTsKLSAgICBtX3BNYXBwaW5nID0gTlVMTDsKLSAgICBtX3BMZWFkaW5nQnl0ZXMgPSBOVUxMOwotICAgIG1fcEFkZE1hcHBpbmcgPSBOVUxMOwotICAgIG1fcEVtYmVkTWFwID0gTlVMTDsKLSAgICBtX3BVc2VNYXAgPSBOVUxMOwotICAgIG1fbkNvZGVSYW5nZXMgPSAwOwotfQotQ1BERl9DTWFwOjp+Q1BERl9DTWFwKCkKLXsKLSAgICBpZiAobV9wTWFwcGluZykgewotICAgICAgICBGWF9GcmVlKG1fcE1hcHBpbmcpOwotICAgIH0KLSAgICBpZiAobV9wQWRkTWFwcGluZykgewotICAgICAgICBGWF9GcmVlKG1fcEFkZE1hcHBpbmcpOwotICAgIH0KLSAgICBpZiAobV9wTGVhZGluZ0J5dGVzKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wTGVhZGluZ0J5dGVzKTsKLSAgICB9Ci0gICAgaWYgKG1fcFVzZU1hcCkgewotICAgICAgICBkZWxldGUgbV9wVXNlTWFwOwotICAgIH0KLX0KLXZvaWQgQ1BERl9DTWFwOjpSZWxlYXNlKCkKLXsKLSAgICBpZiAobV9QcmVkZWZpbmVkQ01hcC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgfQotfQorCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2UuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3Jlc291cmNlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2V4dC5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2ZyZWV0eXBlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKKyNpbmNsdWRlICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvY21hcF9pbnQuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgRlhfQ0hBUiogY29uc3QgZ19DaGFyc2V0TmFtZXNbQ0lEU0VUX05VTV9TRVRTXSA9CisgICAge251bGxwdHIsICJHQjEiLCAiQ05TMSIsICJKYXBhbjEiLCAiS29yZWExIiwgIlVDUyJ9OworCitjb25zdCBpbnQgZ19DaGFyc2V0Q1BzW0NJRFNFVF9OVU1fU0VUU10gPSB7MCwgOTM2LCA5NTAsIDkzMiwgOTQ5LCAxMjAwfTsKKworY2xhc3MgQ1BERl9QcmVkZWZpbmVkQ01hcCB7CisgcHVibGljOgorICBjb25zdCBGWF9DSEFSKiBtX3BOYW1lOworICBDSURTZXQgbV9DaGFyc2V0OworICBpbnQgbV9Db2Rpbmc7CisgIENQREZfQ01hcDo6Q29kaW5nU2NoZW1lIG1fQ29kaW5nU2NoZW1lOworICBGWF9EV09SRCBtX0xlYWRpbmdTZWdDb3VudDsKKyAgdWludDhfdCBtX0xlYWRpbmdTZWdzWzRdOworfTsKKwogY29uc3QgQ1BERl9QcmVkZWZpbmVkQ01hcCBnX1ByZWRlZmluZWRDTWFwc1tdID0gewotICAgIHsgIkdCLUVVQyIsIENJRFNFVF9HQjEsIENJRENPRElOR19HQiwgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLCAxLCB7MHhhMSwgMHhmZX0gfSwKLSAgICB7ICJHQnBjLUVVQyIsIENJRFNFVF9HQjEsIENJRENPRElOR19HQiwgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLCAxLCB7MHhhMSwgMHhmY30gfSwKLSAgICB7ICJHQkstRVVDIiwgQ0lEU0VUX0dCMSwgQ0lEQ09ESU5HX0dCLCBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsIDEsIHsweDgxLCAweGZlfSB9LAotICAgIHsgIkdCS3AtRVVDIiwgQ0lEU0VUX0dCMSwgQ0lEQ09ESU5HX0dCLCBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsIDEsIHsweDgxLCAweGZlfSB9LAotICAgIHsgIkdCSzJLLUVVQyIsIENJRFNFVF9HQjEsIENJRENPRElOR19HQiwgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLCAxLCB7MHg4MSwgMHhmZX0gfSwKLSAgICB7ICJHQksySyIsIENJRFNFVF9HQjEsIENJRENPRElOR19HQiwgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLCAxLCB7MHg4MSwgMHhmZX0gfSwKLSAgICB7ICJVbmlHQi1VQ1MyIiwgQ0lEU0VUX0dCMSwgQ0lEQ09ESU5HX1VDUzIsIENQREZfQ01hcDo6VHdvQnl0ZXMgfSwKLSAgICB7ICJVbmlHQi1VVEYxNiIsIENJRFNFVF9HQjEsIENJRENPRElOR19VVEYxNiwgQ1BERl9DTWFwOjpUd29CeXRlcyB9LAotICAgIHsgIkI1cGMiLCBDSURTRVRfQ05TMSwgQ0lEQ09ESU5HX0JJRzUsIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywgMSwgezB4YTEsIDB4ZmN9IH0sCi0gICAgeyAiSEtzY3MtQjUiLCBDSURTRVRfQ05TMSwgQ0lEQ09ESU5HX0JJRzUsIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywgMSwgezB4ODgsIDB4ZmV9IH0sCi0gICAgeyAiRVRlbi1CNSIsIENJRFNFVF9DTlMxLCBDSURDT0RJTkdfQklHNSwgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLCAxLCB7MHhhMSwgMHhmZX0gfSwKLSAgICB7ICJFVGVubXMtQjUiLCBDSURTRVRfQ05TMSwgQ0lEQ09ESU5HX0JJRzUsIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywgMSwgezB4YTEsIDB4ZmV9IH0sCi0gICAgeyAiVW5pQ05TLVVDUzIiLCBDSURTRVRfQ05TMSwgQ0lEQ09ESU5HX1VDUzIsIENQREZfQ01hcDo6VHdvQnl0ZXMgfSwKLSAgICB7ICJVbmlDTlMtVVRGMTYiLCBDSURTRVRfQ05TMSwgQ0lEQ09ESU5HX1VURjE2LCBDUERGX0NNYXA6OlR3b0J5dGVzIH0sCi0gICAgeyAiODNwdi1SS1NKIiwgQ0lEU0VUX0pBUEFOMSwgQ0lEQ09ESU5HX0pJUywgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLCAyLCB7MHg4MSwgMHg5ZiwgMHhlMCwgMHhmY30gfSwKLSAgICB7ICI5MG1zLVJLU0oiLCBDSURTRVRfSkFQQU4xLCBDSURDT0RJTkdfSklTLCBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsIDIsIHsweDgxLCAweDlmLCAweGUwLCAweGZjfSB9LAotICAgIHsgIjkwbXNwLVJLU0oiLCBDSURTRVRfSkFQQU4xLCBDSURDT0RJTkdfSklTLCBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsIDIsIHsweDgxLCAweDlmLCAweGUwLCAweGZjfSB9LAotICAgIHsgIjkwcHYtUktTSiIsIENJRFNFVF9KQVBBTjEsIENJRENPRElOR19KSVMsIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywgMiwgezB4ODEsIDB4OWYsIDB4ZTAsIDB4ZmN9IH0sCi0gICAgeyAiQWRkLVJLU0oiLCBDSURTRVRfSkFQQU4xLCBDSURDT0RJTkdfSklTLCBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsIDIsIHsweDgxLCAweDlmLCAweGUwLCAweGZjfSB9LAotICAgIHsgIkVVQyIsIENJRFNFVF9KQVBBTjEsIENJRENPRElOR19KSVMsIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywgMiwgezB4OGUsIDB4OGUsIDB4YTEsIDB4ZmV9IH0sCi0gICAgeyAiSCIsIENJRFNFVF9KQVBBTjEsIENJRENPRElOR19KSVMsIENQREZfQ01hcDo6VHdvQnl0ZXMsIDEsIHsweDIxLCAweDdlfSB9LAotICAgIHsgIlYiLCBDSURTRVRfSkFQQU4xLCBDSURDT0RJTkdfSklTLCBDUERGX0NNYXA6OlR3b0J5dGVzLCAxLCB7MHgyMSwgMHg3ZX0gfSwKLSAgICB7ICJFeHQtUktTSiIsIENJRFNFVF9KQVBBTjEsIENJRENPRElOR19KSVMsIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywgMiwgezB4ODEsIDB4OWYsIDB4ZTAsIDB4ZmN9IH0sCi0gICAgeyAiVW5pSklTLVVDUzIiLCBDSURTRVRfSkFQQU4xLCBDSURDT0RJTkdfVUNTMiwgQ1BERl9DTWFwOjpUd29CeXRlcyB9LAotICAgIHsgIlVuaUpJUy1VQ1MyLUhXIiwgQ0lEU0VUX0pBUEFOMSwgQ0lEQ09ESU5HX1VDUzIsIENQREZfQ01hcDo6VHdvQnl0ZXMgfSwKLSAgICB7ICJVbmlKSVMtVVRGMTYiLCBDSURTRVRfSkFQQU4xLCBDSURDT0RJTkdfVVRGMTYsIENQREZfQ01hcDo6VHdvQnl0ZXMgfSwKLSAgICB7ICJLU0MtRVVDIiwgQ0lEU0VUX0tPUkVBMSwgQ0lEQ09ESU5HX0tPUkVBLCBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsIDEsIHsweGExLCAweGZlfSB9LAotICAgIHsgIktTQ21zLVVIQyIsIENJRFNFVF9LT1JFQTEsIENJRENPRElOR19LT1JFQSwgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLCAxLCB7MHg4MSwgMHhmZX0gfSwKLSAgICB7ICJLU0Ntcy1VSEMtSFciLCBDSURTRVRfS09SRUExLCBDSURDT0RJTkdfS09SRUEsIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywgMSwgezB4ODEsIDB4ZmV9IH0sCi0gICAgeyAiS1NDcGMtRVVDIiwgQ0lEU0VUX0tPUkVBMSwgQ0lEQ09ESU5HX0tPUkVBLCBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsIDEsIHsweGExLCAweGZkfSB9LAotICAgIHsgIlVuaUtTLVVDUzIiLCBDSURTRVRfS09SRUExLCBDSURDT0RJTkdfVUNTMiwgQ1BERl9DTWFwOjpUd29CeXRlcyB9LAotICAgIHsgIlVuaUtTLVVURjE2IiwgQ0lEU0VUX0tPUkVBMSwgQ0lEQ09ESU5HX1VURjE2LCBDUERGX0NNYXA6OlR3b0J5dGVzIH0sCi0gICAgeyBOVUxMLCAwLCAwIH0KKyAgICB7IkdCLUVVQyIsCisgICAgIENJRFNFVF9HQjEsCisgICAgIENJRENPRElOR19HQiwKKyAgICAgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLAorICAgICAxLAorICAgICB7MHhhMSwgMHhmZX19LAorICAgIHsiR0JwYy1FVUMiLAorICAgICBDSURTRVRfR0IxLAorICAgICBDSURDT0RJTkdfR0IsCisgICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKKyAgICAgMSwKKyAgICAgezB4YTEsIDB4ZmN9fSwKKyAgICB7IkdCSy1FVUMiLAorICAgICBDSURTRVRfR0IxLAorICAgICBDSURDT0RJTkdfR0IsCisgICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKKyAgICAgMSwKKyAgICAgezB4ODEsIDB4ZmV9fSwKKyAgICB7IkdCS3AtRVVDIiwKKyAgICAgQ0lEU0VUX0dCMSwKKyAgICAgQ0lEQ09ESU5HX0dCLAorICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCisgICAgIDEsCisgICAgIHsweDgxLCAweGZlfX0sCisgICAgeyJHQksySy1FVUMiLAorICAgICBDSURTRVRfR0IxLAorICAgICBDSURDT0RJTkdfR0IsCisgICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKKyAgICAgMSwKKyAgICAgezB4ODEsIDB4ZmV9fSwKKyAgICB7IkdCSzJLIiwKKyAgICAgQ0lEU0VUX0dCMSwKKyAgICAgQ0lEQ09ESU5HX0dCLAorICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCisgICAgIDEsCisgICAgIHsweDgxLCAweGZlfX0sCisgICAgeyJVbmlHQi1VQ1MyIiwgQ0lEU0VUX0dCMSwgQ0lEQ09ESU5HX1VDUzIsIENQREZfQ01hcDo6VHdvQnl0ZXN9LAorICAgIHsiVW5pR0ItVVRGMTYiLCBDSURTRVRfR0IxLCBDSURDT0RJTkdfVVRGMTYsIENQREZfQ01hcDo6VHdvQnl0ZXN9LAorICAgIHsiQjVwYyIsCisgICAgIENJRFNFVF9DTlMxLAorICAgICBDSURDT0RJTkdfQklHNSwKKyAgICAgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLAorICAgICAxLAorICAgICB7MHhhMSwgMHhmY319LAorICAgIHsiSEtzY3MtQjUiLAorICAgICBDSURTRVRfQ05TMSwKKyAgICAgQ0lEQ09ESU5HX0JJRzUsCisgICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKKyAgICAgMSwKKyAgICAgezB4ODgsIDB4ZmV9fSwKKyAgICB7IkVUZW4tQjUiLAorICAgICBDSURTRVRfQ05TMSwKKyAgICAgQ0lEQ09ESU5HX0JJRzUsCisgICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKKyAgICAgMSwKKyAgICAgezB4YTEsIDB4ZmV9fSwKKyAgICB7IkVUZW5tcy1CNSIsCisgICAgIENJRFNFVF9DTlMxLAorICAgICBDSURDT0RJTkdfQklHNSwKKyAgICAgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLAorICAgICAxLAorICAgICB7MHhhMSwgMHhmZX19LAorICAgIHsiVW5pQ05TLVVDUzIiLCBDSURTRVRfQ05TMSwgQ0lEQ09ESU5HX1VDUzIsIENQREZfQ01hcDo6VHdvQnl0ZXN9LAorICAgIHsiVW5pQ05TLVVURjE2IiwgQ0lEU0VUX0NOUzEsIENJRENPRElOR19VVEYxNiwgQ1BERl9DTWFwOjpUd29CeXRlc30sCisgICAgeyI4M3B2LVJLU0oiLAorICAgICBDSURTRVRfSkFQQU4xLAorICAgICBDSURDT0RJTkdfSklTLAorICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCisgICAgIDIsCisgICAgIHsweDgxLCAweDlmLCAweGUwLCAweGZjfX0sCisgICAgeyI5MG1zLVJLU0oiLAorICAgICBDSURTRVRfSkFQQU4xLAorICAgICBDSURDT0RJTkdfSklTLAorICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCisgICAgIDIsCisgICAgIHsweDgxLCAweDlmLCAweGUwLCAweGZjfX0sCisgICAgeyI5MG1zcC1SS1NKIiwKKyAgICAgQ0lEU0VUX0pBUEFOMSwKKyAgICAgQ0lEQ09ESU5HX0pJUywKKyAgICAgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLAorICAgICAyLAorICAgICB7MHg4MSwgMHg5ZiwgMHhlMCwgMHhmY319LAorICAgIHsiOTBwdi1SS1NKIiwKKyAgICAgQ0lEU0VUX0pBUEFOMSwKKyAgICAgQ0lEQ09ESU5HX0pJUywKKyAgICAgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLAorICAgICAyLAorICAgICB7MHg4MSwgMHg5ZiwgMHhlMCwgMHhmY319LAorICAgIHsiQWRkLVJLU0oiLAorICAgICBDSURTRVRfSkFQQU4xLAorICAgICBDSURDT0RJTkdfSklTLAorICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCisgICAgIDIsCisgICAgIHsweDgxLCAweDlmLCAweGUwLCAweGZjfX0sCisgICAgeyJFVUMiLAorICAgICBDSURTRVRfSkFQQU4xLAorICAgICBDSURDT0RJTkdfSklTLAorICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCisgICAgIDIsCisgICAgIHsweDhlLCAweDhlLCAweGExLCAweGZlfX0sCisgICAgeyJIIiwgQ0lEU0VUX0pBUEFOMSwgQ0lEQ09ESU5HX0pJUywgQ1BERl9DTWFwOjpUd29CeXRlcywgMSwgezB4MjEsIDB4N2V9fSwKKyAgICB7IlYiLCBDSURTRVRfSkFQQU4xLCBDSURDT0RJTkdfSklTLCBDUERGX0NNYXA6OlR3b0J5dGVzLCAxLCB7MHgyMSwgMHg3ZX19LAorICAgIHsiRXh0LVJLU0oiLAorICAgICBDSURTRVRfSkFQQU4xLAorICAgICBDSURDT0RJTkdfSklTLAorICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCisgICAgIDIsCisgICAgIHsweDgxLCAweDlmLCAweGUwLCAweGZjfX0sCisgICAgeyJVbmlKSVMtVUNTMiIsIENJRFNFVF9KQVBBTjEsIENJRENPRElOR19VQ1MyLCBDUERGX0NNYXA6OlR3b0J5dGVzfSwKKyAgICB7IlVuaUpJUy1VQ1MyLUhXIiwgQ0lEU0VUX0pBUEFOMSwgQ0lEQ09ESU5HX1VDUzIsIENQREZfQ01hcDo6VHdvQnl0ZXN9LAorICAgIHsiVW5pSklTLVVURjE2IiwgQ0lEU0VUX0pBUEFOMSwgQ0lEQ09ESU5HX1VURjE2LCBDUERGX0NNYXA6OlR3b0J5dGVzfSwKKyAgICB7IktTQy1FVUMiLAorICAgICBDSURTRVRfS09SRUExLAorICAgICBDSURDT0RJTkdfS09SRUEsCisgICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKKyAgICAgMSwKKyAgICAgezB4YTEsIDB4ZmV9fSwKKyAgICB7IktTQ21zLVVIQyIsCisgICAgIENJRFNFVF9LT1JFQTEsCisgICAgIENJRENPRElOR19LT1JFQSwKKyAgICAgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLAorICAgICAxLAorICAgICB7MHg4MSwgMHhmZX19LAorICAgIHsiS1NDbXMtVUhDLUhXIiwKKyAgICAgQ0lEU0VUX0tPUkVBMSwKKyAgICAgQ0lEQ09ESU5HX0tPUkVBLAorICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCisgICAgIDEsCisgICAgIHsweDgxLCAweGZlfX0sCisgICAgeyJLU0NwYy1FVUMiLAorICAgICBDSURTRVRfS09SRUExLAorICAgICBDSURDT0RJTkdfS09SRUEsCisgICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKKyAgICAgMSwKKyAgICAgezB4YTEsIDB4ZmR9fSwKKyAgICB7IlVuaUtTLVVDUzIiLCBDSURTRVRfS09SRUExLCBDSURDT0RJTkdfVUNTMiwgQ1BERl9DTWFwOjpUd29CeXRlc30sCisgICAgeyJVbmlLUy1VVEYxNiIsIENJRFNFVF9LT1JFQTEsIENJRENPRElOR19VVEYxNiwgQ1BERl9DTWFwOjpUd29CeXRlc30sCiB9OwotZXh0ZXJuIHZvaWQgRlBERkFQSV9GaW5kRW1iZWRkZWRDTWFwKGNvbnN0IGNoYXIqIG5hbWUsIGludCBjaGFyc2V0LCBpbnQgY29kaW5nLCBjb25zdCBGWENNQVBfQ01hcComIHBNYXApOwotZXh0ZXJuIEZYX1dPUkQgRlBERkFQSV9DSURGcm9tQ2hhckNvZGUoY29uc3QgRlhDTUFQX0NNYXAqIHBNYXAsIEZYX0RXT1JEIGNoYXJjb2RlKTsKLUZYX0JPT0wgQ1BERl9DTWFwOjpMb2FkUHJlZGVmaW5lZChDUERGX0NNYXBNYW5hZ2VyKiBwTWdyLCBGWF9MUENTVFIgcE5hbWUsIEZYX0JPT0wgYlByb21wdENKSykKLXsKLSAgICBtX1ByZWRlZmluZWRDTWFwID0gcE5hbWU7Ci0gICAgaWYgKG1fUHJlZGVmaW5lZENNYXAgPT0gRlhfQlNUUkMoIklkZW50aXR5LUgiKSB8fCBtX1ByZWRlZmluZWRDTWFwID09IEZYX0JTVFJDKCJJZGVudGl0eS1WIikpIHsKLSAgICAgICAgbV9Db2RpbmcgPSBDSURDT0RJTkdfQ0lEOwotICAgICAgICBtX2JWZXJ0aWNhbCA9IHBOYW1lWzldID09ICdWJzsKLSAgICAgICAgbV9iTG9hZGVkID0gVFJVRTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGNtYXBpZCA9IG1fUHJlZGVmaW5lZENNYXA7Ci0gICAgbV9iVmVydGljYWwgPSBjbWFwaWQuUmlnaHQoMSkgPT0gRlhfQlNUUkMoIlYiKTsKLSAgICBpZiAoY21hcGlkLkdldExlbmd0aCgpID4gMikgewotICAgICAgICBjbWFwaWQgPSBjbWFwaWQuTGVmdChjbWFwaWQuR2V0TGVuZ3RoKCkgLSAyKTsKLSAgICB9Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoZ19QcmVkZWZpbmVkQ01hcHNbaW5kZXhdLm1fcE5hbWUgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjbWFwaWQgPT0gQ0ZYX0J5dGVTdHJpbmdDKGdfUHJlZGVmaW5lZENNYXBzW2luZGV4XS5tX3BOYW1lKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaW5kZXggKys7Ci0gICAgfQotICAgIGNvbnN0IENQREZfUHJlZGVmaW5lZENNYXAmIG1hcCA9IGdfUHJlZGVmaW5lZENNYXBzW2luZGV4XTsKLSAgICBtX0NoYXJzZXQgPSBtYXAubV9DaGFyc2V0OwotICAgIG1fQ29kaW5nID0gbWFwLm1fQ29kaW5nOwotICAgIG1fQ29kaW5nU2NoZW1lID0gbWFwLm1fQ29kaW5nU2NoZW1lOwotICAgIGlmIChtX0NvZGluZ1NjaGVtZSA9PSBNaXhlZFR3b0J5dGVzKSB7Ci0gICAgICAgIG1fcExlYWRpbmdCeXRlcyA9IEZYX0FsbG9jKEZYX0JZVEUsIDI1Nik7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBtYXAubV9MZWFkaW5nU2VnQ291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIGZvciAoaW50IGIgPSBtYXAubV9MZWFkaW5nU2Vnc1tpICogMl07IGIgPD0gbWFwLm1fTGVhZGluZ1NlZ3NbaSAqIDIgKyAxXTsgYiArKykgewotICAgICAgICAgICAgICAgIG1fcExlYWRpbmdCeXRlc1tiXSA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlBERkFQSV9GaW5kRW1iZWRkZWRDTWFwKHBOYW1lLCBtX0NoYXJzZXQsIG1fQ29kaW5nLCBtX3BFbWJlZE1hcCk7Ci0gICAgaWYgKG1fcEVtYmVkTWFwKSB7Ci0gICAgICAgIG1fYkxvYWRlZCA9IFRSVUU7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisKK0NJRFNldCBDSURTZXRGcm9tU2l6ZVQoc2l6ZV90IGluZGV4KSB7CisgIGlmIChpbmRleCA+PSBDSURTRVRfTlVNX1NFVFMpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIENJRFNFVF9VTktOT1dOOworICB9CisgIHJldHVybiBzdGF0aWNfY2FzdDxDSURTZXQ+KGluZGV4KTsKIH0KLWV4dGVybiAiQyIgewotICAgIHN0YXRpYyBpbnQgY29tcGFyZV9kd29yZChjb25zdCB2b2lkKiBkYXRhMSwgY29uc3Qgdm9pZCogZGF0YTIpCi0gICAgewotICAgICAgICByZXR1cm4gKCooRlhfRFdPUkQqKWRhdGExKSAtICgqKEZYX0RXT1JEKilkYXRhMik7Ci0gICAgfQotfTsKLUZYX0JPT0wgQ1BERl9DTWFwOjpMb2FkRW1iZWRkZWQoRlhfTFBDQllURSBwRGF0YSwgRlhfRFdPUkQgc2l6ZSkKLXsKLSAgICBtX3BNYXBwaW5nID0gRlhfQWxsb2MoRlhfV09SRCwgNjU1MzYpOwotICAgIENQREZfQ01hcFBhcnNlciBwYXJzZXI7Ci0gICAgcGFyc2VyLkluaXRpYWxpemUodGhpcyk7Ci0gICAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KHBEYXRhLCBzaXplKTsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBDRlhfQnl0ZVN0cmluZ0Mgd29yZCA9IHN5bnRheC5HZXRXb3JkKCk7Ci0gICAgICAgIGlmICh3b3JkLklzRW1wdHkoKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyc2VyLlBhcnNlV29yZCh3b3JkKTsKLSAgICB9Ci0gICAgaWYgKG1fQ29kaW5nU2NoZW1lID09IE1peGVkRm91ckJ5dGVzICYmIHBhcnNlci5tX0FkZE1hcHMuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIG1fcEFkZE1hcHBpbmcgPSBGWF9BbGxvYyhGWF9CWVRFLCBwYXJzZXIubV9BZGRNYXBzLkdldFNpemUoKSArIDQpOwotICAgICAgICAqKEZYX0RXT1JEKiltX3BBZGRNYXBwaW5nID0gcGFyc2VyLm1fQWRkTWFwcy5HZXRTaXplKCkgLyA4OwotICAgICAgICBGWFNZU19tZW1jcHkzMihtX3BBZGRNYXBwaW5nICsgNCwgcGFyc2VyLm1fQWRkTWFwcy5HZXRCdWZmZXIoKSwgcGFyc2VyLm1fQWRkTWFwcy5HZXRTaXplKCkpOwotICAgICAgICBGWFNZU19xc29ydChtX3BBZGRNYXBwaW5nICsgNCwgcGFyc2VyLm1fQWRkTWFwcy5HZXRTaXplKCkgLyA4LCA4LCBjb21wYXJlX2R3b3JkKTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisKK0NJRFNldCBDaGFyc2V0RnJvbU9yZGVyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvcmRlcmluZykgeworICBmb3IgKHNpemVfdCBjaGFyc2V0ID0gMTsgY2hhcnNldCA8IEZYX0FycmF5U2l6ZShnX0NoYXJzZXROYW1lcyk7ICsrY2hhcnNldCkgeworICAgIGlmIChvcmRlcmluZyA9PSBDRlhfQnl0ZVN0cmluZ0MoZ19DaGFyc2V0TmFtZXNbY2hhcnNldF0pKQorICAgICAgcmV0dXJuIENJRFNldEZyb21TaXplVChjaGFyc2V0KTsKKyAgfQorICByZXR1cm4gQ0lEU0VUX1VOS05PV047CiB9Ci1leHRlcm4gIkMiIHsKLSAgICBzdGF0aWMgaW50IGNvbXBhcmVDSUQoY29uc3Qgdm9pZCoga2V5LCBjb25zdCB2b2lkKiBlbGVtZW50KQotICAgIHsKLSAgICAgICAgaWYgKCgqKEZYX0RXT1JEKilrZXkpIDwgKCooRlhfRFdPUkQqKWVsZW1lbnQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCgqKEZYX0RXT1JEKilrZXkpID4gKCooRlhfRFdPUkQqKWVsZW1lbnQpICsgKChGWF9EV09SRCopZWxlbWVudClbMV0gLyA2NTUzNikgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfTsKLUZYX1dPUkQgQ1BERl9DTWFwOjpDSURGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0Ci17Ci0gICAgaWYgKG1fQ29kaW5nID09IENJRENPRElOR19DSUQpIHsKLSAgICAgICAgcmV0dXJuIChGWF9XT1JEKWNoYXJjb2RlOwotICAgIH0KLSAgICBpZiAobV9wRW1iZWRNYXApIHsKLSAgICAgICAgcmV0dXJuIEZQREZBUElfQ0lERnJvbUNoYXJDb2RlKG1fcEVtYmVkTWFwLCBjaGFyY29kZSk7Ci0gICAgfQotICAgIGlmIChtX3BNYXBwaW5nID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIChGWF9XT1JEKWNoYXJjb2RlOwotICAgIH0KLSAgICBpZiAoY2hhcmNvZGUgPj4gMTYpIHsKLSAgICAgICAgaWYgKG1fcEFkZE1hcHBpbmcpIHsKLSAgICAgICAgICAgIHZvaWQqIGZvdW5kID0gRlhTWVNfYnNlYXJjaCgmY2hhcmNvZGUsIG1fcEFkZE1hcHBpbmcgKyA0LCAqKEZYX0RXT1JEKiltX3BBZGRNYXBwaW5nLCA4LCBjb21wYXJlQ0lEKTsKLSAgICAgICAgICAgIGlmIChmb3VuZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fcFVzZU1hcCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9wVXNlTWFwLT5DSURGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAoRlhfV09SRCkoKChGWF9EV09SRCopZm91bmQpWzFdICUgNjU1MzYgKyBjaGFyY29kZSAtICogKEZYX0RXT1JEKilmb3VuZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fcFVzZU1hcCkgewotICAgICAgICAgICAgcmV0dXJuIG1fcFVzZU1hcC0+Q0lERnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgRlhfRFdPUkQgQ0lEID0gbV9wTWFwcGluZ1tjaGFyY29kZV07Ci0gICAgaWYgKCFDSUQgJiYgbV9wVXNlTWFwKSB7Ci0gICAgICAgIHJldHVybiBtX3BVc2VNYXAtPkNJREZyb21DaGFyQ29kZShjaGFyY29kZSk7Ci0gICAgfQotICAgIHJldHVybiAoRlhfV09SRClDSUQ7CisKK0NGWF9CeXRlU3RyaW5nIENNYXBfR2V0U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgd29yZCkgeworICByZXR1cm4gd29yZC5NaWQoMSwgd29yZC5HZXRMZW5ndGgoKSAtIDIpOwogfQotc3RhdGljIGludCBfQ2hlY2tDb2RlUmFuZ2UoRlhfTFBCWVRFIGNvZGVzLCBpbnQgc2l6ZSwgX0NNYXBfQ29kZVJhbmdlKiBwUmFuZ2VzLCBpbnQgblJhbmdlcykKLXsKLSAgICBpbnQgaVNlZyA9IG5SYW5nZXMgLSAxOworCitpbnQgQ29tcGFyZURXT1JEKGNvbnN0IHZvaWQqIGRhdGExLCBjb25zdCB2b2lkKiBkYXRhMikgeworICByZXR1cm4gKCooRlhfRFdPUkQqKWRhdGExKSAtICgqKEZYX0RXT1JEKilkYXRhMik7Cit9CisKK2ludCBDb21wYXJlQ0lEKGNvbnN0IHZvaWQqIGtleSwgY29uc3Qgdm9pZCogZWxlbWVudCkgeworICBpZiAoKCooRlhfRFdPUkQqKWtleSkgPCAoKihGWF9EV09SRCopZWxlbWVudCkpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKCgqKEZYX0RXT1JEKilrZXkpID4KKyAgICAgICgqKEZYX0RXT1JEKillbGVtZW50KSArICgoRlhfRFdPUkQqKWVsZW1lbnQpWzFdIC8gNjU1MzYpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IENoZWNrQ29kZVJhbmdlKHVpbnQ4X3QqIGNvZGVzLAorICAgICAgICAgICAgICAgICAgIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgIENNYXBfQ29kZVJhbmdlKiBwUmFuZ2VzLAorICAgICAgICAgICAgICAgICAgIGludCBuUmFuZ2VzKSB7CisgIGludCBpU2VnID0gblJhbmdlcyAtIDE7CisgIHdoaWxlIChpU2VnID49IDApIHsKKyAgICBpZiAocFJhbmdlc1tpU2VnXS5tX0NoYXJTaXplIDwgc2l6ZSkgeworICAgICAgLS1pU2VnOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGludCBpQ2hhciA9IDA7CisgICAgd2hpbGUgKGlDaGFyIDwgc2l6ZSkgeworICAgICAgaWYgKGNvZGVzW2lDaGFyXSA8IHBSYW5nZXNbaVNlZ10ubV9Mb3dlcltpQ2hhcl0gfHwKKyAgICAgICAgICBjb2Rlc1tpQ2hhcl0gPiBwUmFuZ2VzW2lTZWddLm1fVXBwZXJbaUNoYXJdKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgKytpQ2hhcjsKKyAgICB9CisgICAgaWYgKGlDaGFyID09IHBSYW5nZXNbaVNlZ10ubV9DaGFyU2l6ZSkKKyAgICAgIHJldHVybiAyOworCisgICAgaWYgKGlDaGFyKQorICAgICAgcmV0dXJuIChzaXplID09IHBSYW5nZXNbaVNlZ10ubV9DaGFyU2l6ZSkgPyAyIDogMTsKKyAgICBpU2VnLS07CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBHZXRDaGFyU2l6ZUltcGwoRlhfRFdPUkQgY2hhcmNvZGUsCisgICAgICAgICAgICAgICAgICAgIENNYXBfQ29kZVJhbmdlKiBwUmFuZ2VzLAorICAgICAgICAgICAgICAgICAgICBpbnQgaVJhbmdlc1NpemUpIHsKKyAgaWYgKCFpUmFuZ2VzU2l6ZSkKKyAgICByZXR1cm4gMTsKKworICB1aW50OF90IGNvZGVzWzRdOworICBjb2Rlc1swXSA9IGNvZGVzWzFdID0gMHgwMDsKKyAgY29kZXNbMl0gPSAodWludDhfdCkoY2hhcmNvZGUgPj4gOCAmIDB4RkYpOworICBjb2Rlc1szXSA9ICh1aW50OF90KWNoYXJjb2RlOworICBpbnQgb2Zmc2V0ID0gMDsKKyAgaW50IHNpemUgPSA0OworICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgIGludCBpU2VnID0gaVJhbmdlc1NpemUgLSAxOwogICAgIHdoaWxlIChpU2VnID49IDApIHsKLSAgICAgICAgaWYgKHBSYW5nZXNbaVNlZ10ubV9DaGFyU2l6ZSA8IHNpemUpIHsKLSAgICAgICAgICAgIGlTZWcgLS07Ci0gICAgICAgICAgICBjb250aW51ZTsKKyAgICAgIGlmIChwUmFuZ2VzW2lTZWddLm1fQ2hhclNpemUgPCBzaXplKSB7CisgICAgICAgIC0taVNlZzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpbnQgaUNoYXIgPSAwOworICAgICAgd2hpbGUgKGlDaGFyIDwgc2l6ZSkgeworICAgICAgICBpZiAoY29kZXNbb2Zmc2V0ICsgaUNoYXJdIDwgcFJhbmdlc1tpU2VnXS5tX0xvd2VyW2lDaGFyXSB8fAorICAgICAgICAgICAgY29kZXNbb2Zmc2V0ICsgaUNoYXJdID4gcFJhbmdlc1tpU2VnXS5tX1VwcGVyW2lDaGFyXSkgeworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGludCBpQ2hhciA9IDA7Ci0gICAgICAgIHdoaWxlIChpQ2hhciA8IHNpemUpIHsKLSAgICAgICAgICAgIGlmIChjb2Rlc1tpQ2hhcl0gPCBwUmFuZ2VzW2lTZWddLm1fTG93ZXJbaUNoYXJdIHx8Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVzW2lDaGFyXSA+IHBSYW5nZXNbaVNlZ10ubV9VcHBlcltpQ2hhcl0pIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlDaGFyICsrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpQ2hhciA9PSBwUmFuZ2VzW2lTZWddLm1fQ2hhclNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpQ2hhcikgewotICAgICAgICAgICAgaWYgKHNpemUgPT0gcFJhbmdlc1tpU2VnXS5tX0NoYXJTaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBpU2VnIC0tOworICAgICAgICArK2lDaGFyOworICAgICAgfQorICAgICAgaWYgKGlDaGFyID09IHBSYW5nZXNbaVNlZ10ubV9DaGFyU2l6ZSkKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAtLWlTZWc7CiAgICAgfQorICAgIC0tc2l6ZTsKKyAgICArK29mZnNldDsKKyAgfQorICByZXR1cm4gMTsKK30KKworYm9vbCBJc1ZhbGlkRW1iZWRkZWRDaGFyY29kZUZyb21Vbmljb2RlQ2hhcnNldChDSURTZXQgY2hhcnNldCkgeworICBzd2l0Y2ggKGNoYXJzZXQpIHsKKyAgICBjYXNlIENJRFNFVF9HQjE6CisgICAgY2FzZSBDSURTRVRfQ05TMToKKyAgICBjYXNlIENJRFNFVF9KQVBBTjE6CisgICAgY2FzZSBDSURTRVRfS09SRUExOgorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKyNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCitGWF9EV09SRCBFbWJlZGRlZENoYXJjb2RlRnJvbVVuaWNvZGUoY29uc3QgRlhDTUFQX0NNYXAqIHBFbWJlZE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSURTZXQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiB1bmljb2RlKSB7CisgIGlmICghSXNWYWxpZEVtYmVkZGVkQ2hhcmNvZGVGcm9tVW5pY29kZUNoYXJzZXQoY2hhcnNldCkpCiAgICAgcmV0dXJuIDA7Ci19Ci1GWF9EV09SRCBDUERGX0NNYXA6OkdldE5leHRDaGFyKEZYX0xQQ1NUUiBwU3RyaW5nLCBpbnQgblN0ckxlbiwgaW50JiBvZmZzZXQpIGNvbnN0Ci17Ci0gICAgc3dpdGNoIChtX0NvZGluZ1NjaGVtZSkgewotICAgICAgICBjYXNlIE9uZUJ5dGU6Ci0gICAgICAgICAgICByZXR1cm4gKChGWF9MUEJZVEUpcFN0cmluZylbb2Zmc2V0KytdOwotICAgICAgICBjYXNlIFR3b0J5dGVzOgotICAgICAgICAgICAgb2Zmc2V0ICs9IDI7Ci0gICAgICAgICAgICByZXR1cm4gKChGWF9MUEJZVEUpcFN0cmluZylbb2Zmc2V0IC0gMl0gKiAyNTYgKyAoKEZYX0xQQllURSlwU3RyaW5nKVtvZmZzZXQgLSAxXTsKLSAgICAgICAgY2FzZSBNaXhlZFR3b0J5dGVzOiB7Ci0gICAgICAgICAgICAgICAgRlhfQllURSBieXRlMSA9ICgoRlhfTFBCWVRFKXBTdHJpbmcpW29mZnNldCsrXTsKLSAgICAgICAgICAgICAgICBpZiAoIW1fcExlYWRpbmdCeXRlc1tieXRlMV0pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ5dGUxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGWF9CWVRFIGJ5dGUyID0gKChGWF9MUEJZVEUpcFN0cmluZylbb2Zmc2V0KytdOwotICAgICAgICAgICAgICAgIHJldHVybiBieXRlMSAqIDI1NiArIGJ5dGUyOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIE1peGVkRm91ckJ5dGVzOiB7Ci0gICAgICAgICAgICAgICAgRlhfQllURSBjb2Rlc1s0XTsKLSAgICAgICAgICAgICAgICBpbnQgY2hhcl9zaXplID0gMTsKLSAgICAgICAgICAgICAgICBjb2Rlc1swXSA9ICgoRlhfTFBCWVRFKXBTdHJpbmcpW29mZnNldCsrXTsKLSAgICAgICAgICAgICAgICBfQ01hcF9Db2RlUmFuZ2UqIHBSYW5nZXMgPSAoX0NNYXBfQ29kZVJhbmdlKiltX3BMZWFkaW5nQnl0ZXM7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IF9DaGVja0NvZGVSYW5nZShjb2RlcywgY2hhcl9zaXplLCBwUmFuZ2VzLCBtX25Db2RlUmFuZ2VzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNoYXJjb2RlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhcl9zaXplOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmNvZGUgPSAoY2hhcmNvZGUgPDwgOCkgKyBjb2Rlc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFyY29kZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoY2hhcl9zaXplID09IDQgfHwgb2Zmc2V0ID09IG5TdHJMZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVzW2NoYXJfc2l6ZSArK10gPSAoKEZYX0xQQllURSlwU3RyaW5nKVtvZmZzZXQrK107Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgIH0KKworICBDUERGX0ZvbnRHbG9iYWxzKiBwRm9udEdsb2JhbHMgPQorICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCk7CisgIGNvbnN0IEZYX1dPUkQqIHBDb2RlcyA9IHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbY2hhcnNldF0ubV9wTWFwOworICBpZiAoIXBDb2RlcykKICAgICByZXR1cm4gMDsKKworICBpbnQgbkNvZGVzID0gcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkVG9Vbmljb2Rlc1tjaGFyc2V0XS5tX0NvdW50OworICBmb3IgKGludCBpID0gMDsgaSA8IG5Db2RlczsgKytpKSB7CisgICAgaWYgKHBDb2Rlc1tpXSA9PSB1bmljb2RlKSB7CisgICAgICBGWF9EV09SRCBDaGFyQ29kZSA9IEZQREZBUElfQ2hhckNvZGVGcm9tQ0lEKHBFbWJlZE1hcCwgaSk7CisgICAgICBpZiAoQ2hhckNvZGUgIT0gMCkgeworICAgICAgICByZXR1cm4gQ2hhckNvZGU7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAwOwogfQotaW50IENQREZfQ01hcDo6R2V0Q2hhclNpemUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0Ci17Ci0gICAgc3dpdGNoIChtX0NvZGluZ1NjaGVtZSkgewotICAgICAgICBjYXNlIE9uZUJ5dGU6Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgY2FzZSBUd29CeXRlczoKLSAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICBjYXNlIE1peGVkVHdvQnl0ZXM6Ci0gICAgICAgIGNhc2UgTWl4ZWRGb3VyQnl0ZXM6Ci0gICAgICAgICAgICBpZiAoY2hhcmNvZGUgPCAweDEwMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNoYXJjb2RlIDwgMHgxMDAwMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNoYXJjb2RlIDwgMHgxMDAwMDAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gNDsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci1pbnQgQ1BERl9DTWFwOjpDb3VudENoYXIoRlhfTFBDU1RSIHBTdHJpbmcsIGludCBzaXplKSBjb25zdAotewotICAgIHN3aXRjaCAobV9Db2RpbmdTY2hlbWUpIHsKLSAgICAgICAgY2FzZSBPbmVCeXRlOgotICAgICAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgICAgIGNhc2UgVHdvQnl0ZXM6Ci0gICAgICAgICAgICByZXR1cm4gKHNpemUgKyAxKSAvIDI7Ci0gICAgICAgIGNhc2UgTWl4ZWRUd29CeXRlczogewotICAgICAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50ICsrOwotICAgICAgICAgICAgICAgICAgICBpZiAobV9wTGVhZGluZ0J5dGVzWygoRlhfTFBCWVRFKXBTdHJpbmcpW2ldXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaSArKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gY291bnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgTWl4ZWRGb3VyQnl0ZXM6IHsKLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAwLCBvZmZzZXQgPSAwOwotICAgICAgICAgICAgICAgIHdoaWxlIChvZmZzZXQgPCBzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIEdldE5leHRDaGFyKHBTdHJpbmcsIHNpemUsIG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50ICsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gY291bnQ7Ci0gICAgICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzaXplOwotfQotaW50IF9HZXRDaGFyU2l6ZShGWF9EV09SRCBjaGFyY29kZSwgX0NNYXBfQ29kZVJhbmdlKiBwUmFuZ2VzLCBpbnQgaVJhbmdlc1NpemUpCi17Ci0gICAgaWYgKCFpUmFuZ2VzU2l6ZSkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgRlhfQllURSBjb2Rlc1s0XTsKLSAgICBjb2Rlc1swXSA9IGNvZGVzWzFdID0gMHgwMDsKLSAgICBjb2Rlc1syXSA9IChGWF9CWVRFKShjaGFyY29kZSA+PiA4ICYgMHhGRik7Ci0gICAgY29kZXNbM10gPSAoRlhfQllURSljaGFyY29kZTsKLSAgICBpbnQgb2Zmc2V0ID0gMCwgc2l6ZSA9IDQ7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsKLSAgICAgICAgaW50IGlTZWcgPSBpUmFuZ2VzU2l6ZSAtIDE7Ci0gICAgICAgIHdoaWxlIChpU2VnID49IDApIHsKLSAgICAgICAgICAgIGlmIChwUmFuZ2VzW2lTZWddLm1fQ2hhclNpemUgPCBzaXplKSB7Ci0gICAgICAgICAgICAgICAgaVNlZyAtLTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBpQ2hhciA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoaUNoYXIgPCBzaXplKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvZGVzW29mZnNldCArIGlDaGFyXSA8IHBSYW5nZXNbaVNlZ10ubV9Mb3dlcltpQ2hhcl0gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzW29mZnNldCArIGlDaGFyXSA+IHBSYW5nZXNbaVNlZ10ubV9VcHBlcltpQ2hhcl0pIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlDaGFyICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlDaGFyID09IHBSYW5nZXNbaVNlZ10ubV9DaGFyU2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBzaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaVNlZyAtLTsKLSAgICAgICAgfQotICAgICAgICBzaXplIC0tOwotICAgICAgICBvZmZzZXQgKys7Ci0gICAgfQotICAgIHJldHVybiAxOwotfQotaW50IENQREZfQ01hcDo6QXBwZW5kQ2hhcihGWF9MUFNUUiBzdHIsIEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdAotewotICAgIHN3aXRjaCAobV9Db2RpbmdTY2hlbWUpIHsKLSAgICAgICAgY2FzZSBPbmVCeXRlOgotICAgICAgICAgICAgc3RyWzBdID0gKEZYX0JZVEUpY2hhcmNvZGU7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgY2FzZSBUd29CeXRlczoKLSAgICAgICAgICAgIHN0clswXSA9IChGWF9CWVRFKShjaGFyY29kZSAvIDI1Nik7Ci0gICAgICAgICAgICBzdHJbMV0gPSAoRlhfQllURSkoY2hhcmNvZGUgJSAyNTYpOwotICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgIGNhc2UgTWl4ZWRUd29CeXRlczoKLSAgICAgICAgY2FzZSBNaXhlZEZvdXJCeXRlczoKLSAgICAgICAgICAgIGlmIChjaGFyY29kZSA8IDB4MTAwKSB7Ci0gICAgICAgICAgICAgICAgX0NNYXBfQ29kZVJhbmdlKiBwUmFuZ2VzID0gKF9DTWFwX0NvZGVSYW5nZSopbV9wTGVhZGluZ0J5dGVzOwotICAgICAgICAgICAgICAgIGludCBpU2l6ZSA9IF9HZXRDaGFyU2l6ZShjaGFyY29kZSwgcFJhbmdlcywgbV9uQ29kZVJhbmdlcyk7Ci0gICAgICAgICAgICAgICAgaWYgKGlTaXplID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaVNpemUgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaVNpemUgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYU1lTX21lbXNldDMyKHN0ciwgMCwgc2l6ZW9mKEZYX0JZVEUpICogaVNpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdHJbaVNpemUgLSAxXSA9IChGWF9CWVRFKWNoYXJjb2RlOwotICAgICAgICAgICAgICAgIHJldHVybiBpU2l6ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhcmNvZGUgPCAweDEwMDAwKSB7Ci0gICAgICAgICAgICAgICAgc3RyWzBdID0gKEZYX0JZVEUpKGNoYXJjb2RlID4+IDgpOwotICAgICAgICAgICAgICAgIHN0clsxXSA9IChGWF9CWVRFKWNoYXJjb2RlOwotICAgICAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyY29kZSA8IDB4MTAwMDAwMCkgewotICAgICAgICAgICAgICAgIHN0clswXSA9IChGWF9CWVRFKShjaGFyY29kZSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgc3RyWzFdID0gKEZYX0JZVEUpKGNoYXJjb2RlID4+IDgpOwotICAgICAgICAgICAgICAgIHN0clsyXSA9IChGWF9CWVRFKWNoYXJjb2RlOwotICAgICAgICAgICAgICAgIHJldHVybiAzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJbMF0gPSAoRlhfQllURSkoY2hhcmNvZGUgPj4gMjQpOwotICAgICAgICAgICAgICAgIHN0clsxXSA9IChGWF9CWVRFKShjaGFyY29kZSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgc3RyWzJdID0gKEZYX0JZVEUpKGNoYXJjb2RlID4+IDgpOwotICAgICAgICAgICAgICAgIHN0clszXSA9IChGWF9CWVRFKWNoYXJjb2RlOwotICAgICAgICAgICAgICAgIHJldHVybiA0OwotICAgICAgICAgICAgfQotICAgIH0KKyNlbmRpZiAgLy8gX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXworCitGWF9XQ0hBUiBFbWJlZGRlZFVuaWNvZGVGcm9tQ2hhcmNvZGUoY29uc3QgRlhDTUFQX0NNYXAqIHBFbWJlZE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSURTZXQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjaGFyY29kZSkgeworICBpZiAoIUlzVmFsaWRFbWJlZGRlZENoYXJjb2RlRnJvbVVuaWNvZGVDaGFyc2V0KGNoYXJzZXQpKQogICAgIHJldHVybiAwOwotfQotQ1BERl9DSUQyVW5pY29kZU1hcDo6Q1BERl9DSUQyVW5pY29kZU1hcCgpCi17Ci0gICAgbV9FbWJlZGRlZENvdW50ID0gMDsKLX0KLUNQREZfQ0lEMlVuaWNvZGVNYXA6On5DUERGX0NJRDJVbmljb2RlTWFwKCkKLXsKLX0KLUZYX0JPT0wgQ1BERl9DSUQyVW5pY29kZU1hcDo6SW5pdGlhbGl6ZSgpCi17Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENQREZfQ0lEMlVuaWNvZGVNYXA6OklzTG9hZGVkKCkKLXsKLSAgICByZXR1cm4gbV9FbWJlZGRlZENvdW50ICE9IDA7Ci19Ci1GWF9XQ0hBUiBDUERGX0NJRDJVbmljb2RlTWFwOjpVbmljb2RlRnJvbUNJRChGWF9XT1JEIENJRCkKLXsKLSAgICBpZiAobV9DaGFyc2V0ID09IENJRFNFVF9VTklDT0RFKSB7Ci0gICAgICAgIHJldHVybiBDSUQ7Ci0gICAgfQotICAgIGlmIChDSUQgPCBtX0VtYmVkZGVkQ291bnQpIHsKLSAgICAgICAgcmV0dXJuIG1fcEVtYmVkZGVkTWFwW0NJRF07Ci0gICAgfQorCisgIEZYX1dPUkQgY2lkID0gRlBERkFQSV9DSURGcm9tQ2hhckNvZGUocEVtYmVkTWFwLCBjaGFyY29kZSk7CisgIGlmIChjaWQgPT0gMCkKICAgICByZXR1cm4gMDsKLX0KLXZvaWQgRlBERkFQSV9Mb2FkQ0lEMlVuaWNvZGVNYXAoaW50IGNoYXJzZXQsIGNvbnN0IEZYX1dPUkQqJiBwTWFwLCBGWF9EV09SRCYgY291bnQpOwotdm9pZCBDUERGX0NJRDJVbmljb2RlTWFwOjpMb2FkKENQREZfQ01hcE1hbmFnZXIqIHBNZ3IsIGludCBjaGFyc2V0LCBGWF9CT09MIGJQcm9tcHRDSkspCi17Ci0gICAgbV9DaGFyc2V0ID0gY2hhcnNldDsKLSAgICBGUERGQVBJX0xvYWRDSUQyVW5pY29kZU1hcChjaGFyc2V0LCBtX3BFbWJlZGRlZE1hcCwgbV9FbWJlZGRlZENvdW50KTsKLX0KLSNpbmNsdWRlICJ0dGdzdWJ0YWJsZS5oIgotQ1BERl9DSURGb250OjpDUERGX0NJREZvbnQoKSA6IENQREZfRm9udChQREZGT05UX0NJREZPTlQpCi17Ci0gICAgbV9wQ01hcCA9IE5VTEw7Ci0gICAgbV9wQWxsb2NhdGVkQ01hcCA9IE5VTEw7Ci0gICAgbV9wQ0lEMlVuaWNvZGVNYXAgPSBOVUxMOwotICAgIG1fcEFuc2lXaWR0aHMgPSBOVUxMOwotICAgIG1fcENJRFRvR0lETWFwID0gTlVMTDsKLSAgICBtX2JDSURJc0dJRCA9IEZBTFNFOwotICAgIG1fYkFkb2JlQ291cmllclN0ZCA9IEZBTFNFOwotICAgIG1fcFRUR1NVQlRhYmxlID0gTlVMTDsKLSAgICBGWFNZU19tZW1zZXQ4KG1fQ2hhckJCb3gsIDB4ZmYsIDI1NiAqIHNpemVvZihGWF9TTUFMTF9SRUNUKSk7Ci19Ci1DUERGX0NJREZvbnQ6On5DUERGX0NJREZvbnQoKQotewotICAgIGlmIChtX3BBbnNpV2lkdGhzKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wQW5zaVdpZHRocyk7Ci0gICAgfQotICAgIGlmIChtX3BBbGxvY2F0ZWRDTWFwKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BBbGxvY2F0ZWRDTWFwOwotICAgIH0KLSAgICBpZiAobV9wQ0lEVG9HSURNYXApIHsKLSAgICAgICAgZGVsZXRlIG1fcENJRFRvR0lETWFwOwotICAgIH0KLSAgICBpZiAobV9wVFRHU1VCVGFibGUpIHsKLSAgICAgICAgZGVsZXRlIG1fcFRUR1NVQlRhYmxlOwotICAgIH0KLX0KLUZYX1dPUkQgQ1BERl9DSURGb250OjpDSURGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcENNYXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gKEZYX1dPUkQpY2hhcmNvZGU7Ci0gICAgfQotICAgIHJldHVybiBtX3BDTWFwLT5DSURGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOwotfQotRlhfQk9PTCBDUERGX0NJREZvbnQ6OklzVmVydFdyaXRpbmcoKSBjb25zdAotewotICAgIHJldHVybiBtX3BDTWFwID8gbV9wQ01hcC0+SXNWZXJ0V3JpdGluZygpIDogRkFMU0U7Ci19Ci1leHRlcm4gRlhfRFdPUkQgRlBERkFQSV9DaGFyQ29kZUZyb21DSUQoY29uc3QgRlhDTUFQX0NNYXAqIHBNYXAsIEZYX1dPUkQgY2lkKTsKLXN0YXRpYyBGWF9EV09SRCBfRW1iZWRkZWRDaGFyY29kZUZyb21Vbmljb2RlKGNvbnN0IEZYQ01BUF9DTWFwKiBwRW1iZWRNYXAsIGludCBjaGFyc2V0LCBGWF9XQ0hBUiB1bmljb2RlKQotewotICAgIGlmIChjaGFyc2V0IDw9IDAgfHwgY2hhcnNldCA+IDQpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENQREZfRm9udEdsb2JhbHMqIHBGb250R2xvYmFscyA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRGb250R2xvYmFscygpOwotICAgIGNvbnN0IEZYX1dPUkQqIHBDb2RlcyA9IHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbY2hhcnNldF0ubV9wTWFwOwotICAgIGlmIChwQ29kZXMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW50IG5Db2RlcyA9IHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbY2hhcnNldF0ubV9Db3VudDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Db2RlczsgaSsrKSB7Ci0gICAgICAgIGlmIChwQ29kZXNbaV0gPT0gdW5pY29kZSkgewotICAgICAgICAgICAgRlhfRFdPUkQgQ2hhckNvZGUgPSBGUERGQVBJX0NoYXJDb2RlRnJvbUNJRChwRW1iZWRNYXAsIGkpOwotICAgICAgICAgICAgaWYgKENoYXJDb2RlID09IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBDaGFyQ29kZTsKLSAgICAgICAgfQotICAgIH0KKworICBDUERGX0ZvbnRHbG9iYWxzKiBwRm9udEdsb2JhbHMgPQorICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCk7CisgIGNvbnN0IEZYX1dPUkQqIHBDb2RlcyA9IHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbY2hhcnNldF0ubV9wTWFwOworICBpZiAoIXBDb2RlcykKICAgICByZXR1cm4gMDsKKworICBpZiAoY2lkIDwgcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkVG9Vbmljb2Rlc1tjaGFyc2V0XS5tX0NvdW50KQorICAgIHJldHVybiBwQ29kZXNbY2lkXTsKKyAgcmV0dXJuIDA7CiB9Ci1zdGF0aWMgRlhfV0NIQVIgX0VtYmVkZGVkVW5pY29kZUZyb21DaGFyY29kZShjb25zdCBGWENNQVBfQ01hcCogcEVtYmVkTWFwLCBpbnQgY2hhcnNldCwgRlhfRFdPUkQgY2hhcmNvZGUpCi17Ci0gICAgaWYgKGNoYXJzZXQgPD0gMCB8fCBjaGFyc2V0ID4gNCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgRlhfV09SRCBjaWQgPSBGUERGQVBJX0NJREZyb21DaGFyQ29kZShwRW1iZWRNYXAsIGNoYXJjb2RlKTsKLSAgICBpZiAoY2lkID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENQREZfRm9udEdsb2JhbHMqIHBGb250R2xvYmFscyA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRGb250R2xvYmFscygpOwotICAgIGNvbnN0IEZYX1dPUkQqIHBDb2RlcyA9IHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbY2hhcnNldF0ubV9wTWFwOwotICAgIGlmIChwQ29kZXMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGNpZCA8IHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbY2hhcnNldF0ubV9Db3VudCkgewotICAgICAgICByZXR1cm4gcENvZGVzW2NpZF07Ci0gICAgfQotICAgIHJldHVybiAwOworCit2b2lkIEZUX1VzZUNJRENoYXJtYXAoRlhGVF9GYWNlIGZhY2UsIGludCBjb2RpbmcpIHsKKyAgaW50IGVuY29kaW5nOworICBzd2l0Y2ggKGNvZGluZykgeworICAgIGNhc2UgQ0lEQ09ESU5HX0dCOgorICAgICAgZW5jb2RpbmcgPSBGWEZUX0VOQ09ESU5HX0dCMjMxMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0lEQ09ESU5HX0JJRzU6CisgICAgICBlbmNvZGluZyA9IEZYRlRfRU5DT0RJTkdfQklHNTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0lEQ09ESU5HX0pJUzoKKyAgICAgIGVuY29kaW5nID0gRlhGVF9FTkNPRElOR19TSklTOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDSURDT0RJTkdfS09SRUE6CisgICAgICBlbmNvZGluZyA9IEZYRlRfRU5DT0RJTkdfSk9IQUI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZW5jb2RpbmcgPSBGWEZUX0VOQ09ESU5HX1VOSUNPREU7CisgIH0KKyAgaW50IGVyciA9IEZYRlRfU2VsZWN0X0NoYXJtYXAoZmFjZSwgZW5jb2RpbmcpOworICBpZiAoZXJyKSB7CisgICAgZXJyID0gRlhGVF9TZWxlY3RfQ2hhcm1hcChmYWNlLCBGWEZUX0VOQ09ESU5HX1VOSUNPREUpOworICB9CisgIGlmIChlcnIgJiYgRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKSkgeworICAgIEZYRlRfU2V0X0NoYXJtYXAoZmFjZSwgKkZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSkpOworICB9CiB9Ci1GWF9XQ0hBUiBDUERGX0NJREZvbnQ6Ol9Vbmljb2RlRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdAotewotICAgIHN3aXRjaCAobV9wQ01hcC0+bV9Db2RpbmcpIHsKLSAgICAgICAgY2FzZSBDSURDT0RJTkdfVUNTMjoKLSAgICAgICAgY2FzZSBDSURDT0RJTkdfVVRGMTY6Ci0gICAgICAgICAgICByZXR1cm4gKEZYX1dDSEFSKWNoYXJjb2RlOwotICAgICAgICBjYXNlIENJRENPRElOR19DSUQ6Ci0gICAgICAgICAgICBpZiAobV9wQ0lEMlVuaWNvZGVNYXAgPT0gTlVMTCB8fCAhbV9wQ0lEMlVuaWNvZGVNYXAtPklzTG9hZGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtX3BDSUQyVW5pY29kZU1hcC0+VW5pY29kZUZyb21DSUQoKEZYX1dPUkQpY2hhcmNvZGUpOwotICAgIH0KLSAgICBpZiAoIW1fcENNYXAtPklzTG9hZGVkKCkgfHwgbV9wQ0lEMlVuaWNvZGVNYXAgPT0gTlVMTCB8fCAhbV9wQ0lEMlVuaWNvZGVNYXAtPklzTG9hZGVkKCkpIHsKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0gICAgICAgIEZYX1dDSEFSIHVuaWNvZGU7Ci0gICAgICAgIGludCBjaGFyc2l6ZSA9IDE7Ci0gICAgICAgIGlmIChjaGFyY29kZSA+IDI1NSkgewotICAgICAgICAgICAgY2hhcmNvZGUgPSAoY2hhcmNvZGUgJSAyNTYpICogMjU2ICsgKGNoYXJjb2RlIC8gMjU2KTsKLSAgICAgICAgICAgIGNoYXJzaXplID0gMjsKLSAgICAgICAgfQotICAgICAgICBpbnQgcmV0ID0gRlhTWVNfTXVsdGlCeXRlVG9XaWRlQ2hhcihnX0NoYXJzZXRDUHNbbV9wQ01hcC0+bV9Db2RpbmddLCAwLCAoRlhfTFBDU1RSKSZjaGFyY29kZSwgY2hhcnNpemUsICZ1bmljb2RlLCAxKTsKLSAgICAgICAgaWYgKHJldCAhPSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdW5pY29kZTsKLSNlbmRpZgotICAgICAgICBpZiAobV9wQ01hcC0+bV9wRW1iZWRNYXApIHsKLSAgICAgICAgICAgIHJldHVybiBfRW1iZWRkZWRVbmljb2RlRnJvbUNoYXJjb2RlKG1fcENNYXAtPm1fcEVtYmVkTWFwLCBtX3BDTWFwLT5tX0NoYXJzZXQsIGNoYXJjb2RlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtX3BDSUQyVW5pY29kZU1hcC0+VW5pY29kZUZyb21DSUQoQ0lERnJvbUNoYXJDb2RlKGNoYXJjb2RlKSk7Ci19Ci1GWF9EV09SRCBDUERGX0NJREZvbnQ6Ol9DaGFyQ29kZUZyb21Vbmljb2RlKEZYX1dDSEFSIHVuaWNvZGUpIGNvbnN0Ci17Ci0gICAgc3dpdGNoIChtX3BDTWFwLT5tX0NvZGluZykgewotICAgICAgICBjYXNlIENJRENPRElOR19VTktOT1dOOgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGNhc2UgQ0lEQ09ESU5HX1VDUzI6Ci0gICAgICAgIGNhc2UgQ0lEQ09ESU5HX1VURjE2OgotICAgICAgICAgICAgcmV0dXJuIHVuaWNvZGU7Ci0gICAgICAgIGNhc2UgQ0lEQ09ESU5HX0NJRDogewotICAgICAgICAgICAgICAgIGlmIChtX3BDSUQyVW5pY29kZU1hcCA9PSBOVUxMIHx8ICFtX3BDSUQyVW5pY29kZU1hcC0+SXNMb2FkZWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhfRFdPUkQgQ0lEID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAoQ0lEIDwgNjU1MzYpIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgdGhpc191bmljb2RlID0gbV9wQ0lEMlVuaWNvZGVNYXAtPlVuaWNvZGVGcm9tQ0lEKChGWF9XT1JEKUNJRCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzX3VuaWNvZGUgPT0gdW5pY29kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENJRDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBDSUQgKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgIH0KLQkKLSAgICBpZiAodW5pY29kZSA8IDB4ODApIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEZYX0RXT1JEPih1bmljb2RlKTsKLSAgICB9IGVsc2UgaWYgKG1fcENNYXAtPm1fQ29kaW5nID09IENJRENPRElOR19DSUQpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgICBGWF9CWVRFIGJ1ZmZlclszMl07Ci0gICAgaW50IHJldCA9IEZYU1lTX1dpZGVDaGFyVG9NdWx0aUJ5dGUoZ19DaGFyc2V0Q1BzW21fcENNYXAtPm1fQ29kaW5nXSwgMCwgJnVuaWNvZGUsIDEsIChjaGFyKilidWZmZXIsIDQsIE5VTEwsIE5VTEwpOwotICAgIGlmIChyZXQgPT0gMSkgewotICAgICAgICByZXR1cm4gYnVmZmVyWzBdOwotICAgIH0gZWxzZSBpZiAocmV0ID09IDIpIHsKLSAgICAgICAgcmV0dXJuIGJ1ZmZlclswXSAqIDI1NiArIGJ1ZmZlclsxXTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci0jZW5kaWYKLSAgICBpZiAobV9wQ01hcC0+bV9wRW1iZWRNYXApIHsKLSAgICAgICAgcmV0dXJuIF9FbWJlZGRlZENoYXJjb2RlRnJvbVVuaWNvZGUobV9wQ01hcC0+bV9wRW1iZWRNYXAsIG1fcENNYXAtPm1fQ2hhcnNldCwgdW5pY29kZSk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotc3RhdGljIHZvaWQgRlRfVXNlQ0lEQ2hhcm1hcChGWEZUX0ZhY2UgZmFjZSwgaW50IGNvZGluZykKLXsKLSAgICBpbnQgZW5jb2Rpbmc7Ci0gICAgc3dpdGNoIChjb2RpbmcpIHsKLSAgICAgICAgY2FzZSBDSURDT0RJTkdfR0I6Ci0gICAgICAgICAgICBlbmNvZGluZyA9IEZYRlRfRU5DT0RJTkdfR0IyMzEyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0lEQ09ESU5HX0JJRzU6Ci0gICAgICAgICAgICBlbmNvZGluZyA9IEZYRlRfRU5DT0RJTkdfQklHNTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENJRENPRElOR19KSVM6Ci0gICAgICAgICAgICBlbmNvZGluZyA9IEZYRlRfRU5DT0RJTkdfU0pJUzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENJRENPRElOR19LT1JFQToKLSAgICAgICAgICAgIGVuY29kaW5nID0gRlhGVF9FTkNPRElOR19KT0hBQjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZW5jb2RpbmcgPSBGWEZUX0VOQ09ESU5HX1VOSUNPREU7Ci0gICAgfQotICAgIGludCBlcnIgPSBGWEZUX1NlbGVjdF9DaGFybWFwKGZhY2UsIGVuY29kaW5nKTsKLSAgICBpZiAoZXJyKSB7Ci0gICAgICAgIGVyciA9IEZYRlRfU2VsZWN0X0NoYXJtYXAoZmFjZSwgRlhGVF9FTkNPRElOR19VTklDT0RFKTsKLSAgICB9Ci0gICAgaWYgKGVyciAmJiBGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpKSB7Ci0gICAgICAgIEZYRlRfU2V0X0NoYXJtYXAoZmFjZSwgKkZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSkpOwotICAgIH0KLX0KLUZYX0JPT0wgQ1BERl9DSURGb250OjpfTG9hZCgpCi17Ci0gICAgaWYgKG1fcEZvbnREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlN1YnR5cGUiKSkgPT0gRlhfQlNUUkMoIlRydWVUeXBlIikpIHsKLSAgICAgICAgcmV0dXJuIExvYWRHQjIzMTIoKTsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcEZvbnRzID0gbV9wRm9udERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJEZXNjZW5kYW50Rm9udHMiKSk7Ci0gICAgaWYgKHBGb250cyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKHBGb250cy0+R2V0Q291bnQoKSAhPSAxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwQ0lERm9udERpY3QgPSBwRm9udHMtPkdldERpY3QoMCk7Ci0gICAgaWYgKHBDSURGb250RGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9CYXNlRm9udCA9IHBDSURGb250RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJCYXNlRm9udCIpKTsKLSAgICBpZiAoKG1fQmFzZUZvbnQuQ29tcGFyZSgiQ291cmllclN0ZCIpID09IDAgfHwgbV9CYXNlRm9udC5Db21wYXJlKCJDb3VyaWVyU3RkLUJvbGQiKSA9PSAwCi0gICAgICAgICAgICB8fCBtX0Jhc2VGb250LkNvbXBhcmUoIkNvdXJpZXJTdGQtQm9sZE9ibGlxdWUiKSA9PSAwIHx8IG1fQmFzZUZvbnQuQ29tcGFyZSgiQ291cmllclN0ZC1PYmxpcXVlIikgPT0gMCkKLSAgICAgICAgICAgICYmICFJc0VtYmVkZGVkKCkpIHsKLSAgICAgICAgbV9iQWRvYmVDb3VyaWVyU3RkID0gVFJVRTsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERlc2MgPSBwQ0lERm9udERpY3QtPkdldERpY3QoRlhfQlNUUkMoIkZvbnREZXNjcmlwdG9yIikpOwotICAgIGlmIChwRm9udERlc2MpIHsKLSAgICAgICAgTG9hZEZvbnREZXNjcmlwdG9yKHBGb250RGVzYyk7Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwRW5jb2RpbmcgPSBtX3BGb250RGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJFbmNvZGluZyIpKTsKLSAgICBpZiAocEVuY29kaW5nID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBzdWJ0eXBlID0gcENJREZvbnREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlN1YnR5cGUiKSk7Ci0gICAgbV9iVHlwZTEgPSBGQUxTRTsKLSAgICBpZiAoc3VidHlwZSA9PSBGWF9CU1RSQygiQ0lERm9udFR5cGUwIikpIHsKLSAgICAgICAgbV9iVHlwZTEgPSBUUlVFOwotICAgIH0KLSAgICBpZiAocEVuY29kaW5nLT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY21hcCA9IHBFbmNvZGluZy0+R2V0U3RyaW5nKCk7Ci0gICAgICAgIG1fcENNYXAgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+R2V0Rm9udEdsb2JhbHMoKS0+bV9DTWFwTWFuYWdlci5HZXRQcmVkZWZpbmVkQ01hcChjbWFwLAotICAgICAgICAgICAgICAgICAgbV9wRm9udEZpbGUgJiYgbV9iVHlwZTEpOwotICAgIH0gZWxzZSBpZiAocEVuY29kaW5nLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgewotICAgICAgICBtX3BBbGxvY2F0ZWRDTWFwID0gbV9wQ01hcCA9IG5ldyBDUERGX0NNYXA7Ci0gICAgICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gKENQREZfU3RyZWFtKilwRW5jb2Rpbmc7Ci0gICAgICAgIENQREZfU3RyZWFtQWNjIGFjYzsKLSAgICAgICAgYWNjLkxvYWRBbGxEYXRhKHBTdHJlYW0sIEZBTFNFKTsKLSAgICAgICAgbV9wQ01hcC0+TG9hZEVtYmVkZGVkKGFjYy5HZXREYXRhKCksIGFjYy5HZXRTaXplKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG1fcENNYXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fQ2hhcnNldCA9IG1fcENNYXAtPm1fQ2hhcnNldDsKLSAgICBpZiAobV9DaGFyc2V0ID09IENJRFNFVF9VTktOT1dOKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcENJREluZm8gPSBwQ0lERm9udERpY3QtPkdldERpY3QoRlhfQlNUUkMoIkNJRFN5c3RlbUluZm8iKSk7Ci0gICAgICAgIGlmIChwQ0lESW5mbykgewotICAgICAgICAgICAgbV9DaGFyc2V0ID0gX0NoYXJzZXRGcm9tT3JkZXJpbmcocENJREluZm8tPkdldFN0cmluZyhGWF9CU1RSQygiT3JkZXJpbmciKSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtX0NoYXJzZXQgIT0gQ0lEU0VUX1VOS05PV04pCi0gICAgICAgIG1fcENJRDJVbmljb2RlTWFwID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCktPm1fQ01hcE1hbmFnZXIuR2V0Q0lEMlVuaWNvZGVNYXAobV9DaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZvbnRGaWxlID09IE5VTEwgJiYgKG1fcENNYXAtPm1fQ29kaW5nID09IENJRENPRElOR19DSUQgfHwgcENJREZvbnREaWN0LT5LZXlFeGlzdChGWF9CU1RSQygiVyIpKSkpOwotICAgIGlmIChtX0ZvbnQuR2V0RmFjZSgpKSB7Ci0gICAgICAgIGlmIChtX2JUeXBlMSkgewotICAgICAgICAgICAgRlhGVF9TZWxlY3RfQ2hhcm1hcChtX0ZvbnQuR2V0RmFjZSgpLCBGWEZUX0VOQ09ESU5HX1VOSUNPREUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRlRfVXNlQ0lEQ2hhcm1hcChtX0ZvbnQuR2V0RmFjZSgpLCBtX3BDTWFwLT5tX0NvZGluZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9EZWZhdWx0V2lkdGggPSBwQ0lERm9udERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkRXIiksIDEwMDApOwotICAgIENQREZfQXJyYXkqIHBXaWR0aEFycmF5ID0gcENJREZvbnREaWN0LT5HZXRBcnJheShGWF9CU1RSQygiVyIpKTsKLSAgICBpZiAocFdpZHRoQXJyYXkpIHsKLSAgICAgICAgTG9hZE1ldHJpY3NBcnJheShwV2lkdGhBcnJheSwgbV9XaWR0aExpc3QsIDEpOwotICAgIH0KLSAgICBpZiAoIUlzRW1iZWRkZWQoKSkgewotICAgICAgICBMb2FkU3Vic3RGb250KCk7Ci0gICAgfQotICAgIGlmICgxKSB7Ci0gICAgICAgIGlmIChtX3BGb250RmlsZSB8fCAoR2V0U3Vic3RGb250KCktPm1fU3Vic3RGbGFncyAmIEZYRk9OVF9TVUJTVF9FWEFDVCkpIHsKLSAgICAgICAgICAgIENQREZfT2JqZWN0KiBwbWFwID0gcENJREZvbnREaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkNJRFRvR0lETWFwIikpOwotICAgICAgICAgICAgaWYgKHBtYXApIHsKLSAgICAgICAgICAgICAgICBpZiAocG1hcC0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICAgICAgbV9wQ0lEVG9HSURNYXAgPSBuZXcgQ1BERl9TdHJlYW1BY2M7Ci0gICAgICAgICAgICAgICAgICAgIG1fcENJRFRvR0lETWFwLT5Mb2FkQWxsRGF0YSgoQ1BERl9TdHJlYW0qKXBtYXAsIEZBTFNFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBtYXAtPkdldFN0cmluZygpID09IEZYX0JTVFJDKCJJZGVudGl0eSIpKSB7Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgICAgICAgICAgICAgICAgIGlmIChtX3BGb250RmlsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9iQ0lESXNHSUQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICBtX2JDSURJc0dJRCA9IFRSVUU7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQ2hlY2tGb250TWV0cmljcygpOwotICAgIGlmIChJc1ZlcnRXcml0aW5nKCkpIHsKLSAgICAgICAgcFdpZHRoQXJyYXkgPSBwQ0lERm9udERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJXMiIpKTsKLSAgICAgICAgaWYgKHBXaWR0aEFycmF5KSB7Ci0gICAgICAgICAgICBMb2FkTWV0cmljc0FycmF5KHBXaWR0aEFycmF5LCBtX1ZlcnRNZXRyaWNzLCAzKTsKLSAgICAgICAgfQotICAgICAgICBDUERGX0FycmF5KiBwRGVmYXVsdEFycmF5ID0gcENJREZvbnREaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRFcyIikpOwotICAgICAgICBpZiAocERlZmF1bHRBcnJheSkgewotICAgICAgICAgICAgbV9EZWZhdWx0VlkgPSBwRGVmYXVsdEFycmF5LT5HZXRJbnRlZ2VyKDApOwotICAgICAgICAgICAgbV9EZWZhdWx0VzEgPSBwRGVmYXVsdEFycmF5LT5HZXRJbnRlZ2VyKDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9EZWZhdWx0VlkgPSA4ODA7Ci0gICAgICAgICAgICBtX0RlZmF1bHRXMSA9IC0xMDAwOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfRkxPQVQgX0NJRFRyYW5zZm9ybVRvRmxvYXQoRlhfQllURSBjaCkKLXsKLSAgICBpZiAoY2ggPCAxMjgpIHsKLSAgICAgICAgcmV0dXJuIGNoICogMS4wZiAvIDEyNzsKLSAgICB9Ci0gICAgcmV0dXJuICgtMjU1ICsgY2gpICogMS4wZiAvIDEyNzsKLX0KLXZvaWQgQ1BERl9DSURGb250OjpHZXRDaGFyQkJveChGWF9EV09SRCBjaGFyY29kZSwgRlhfUkVDVCYgcmVjdCwgaW50IGxldmVsKQotewotICAgIGlmIChjaGFyY29kZSA8IDI1NiAmJiBtX0NoYXJCQm94W2NoYXJjb2RlXS5SaWdodCAhPSAtMSkgewotICAgICAgICByZWN0LmJvdHRvbSA9IG1fQ2hhckJCb3hbY2hhcmNvZGVdLkJvdHRvbTsKLSAgICAgICAgcmVjdC5sZWZ0ID0gbV9DaGFyQkJveFtjaGFyY29kZV0uTGVmdDsKLSAgICAgICAgcmVjdC5yaWdodCA9IG1fQ2hhckJCb3hbY2hhcmNvZGVdLlJpZ2h0OwotICAgICAgICByZWN0LnRvcCA9IG1fQ2hhckJCb3hbY2hhcmNvZGVdLlRvcDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9CT09MIGJWZXJ0ID0gRkFMU0U7Ci0gICAgaW50IGdseXBoX2luZGV4ID0gR2x5cGhGcm9tQ2hhckNvZGUoY2hhcmNvZGUsICZiVmVydCk7Ci0gICAgaWYgKG1fRm9udC5tX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZWN0ID0gRlhfUkVDVCgwLCAwLCAwLCAwKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZWN0LmxlZnQgPSByZWN0LmJvdHRvbSA9IHJlY3QucmlnaHQgPSByZWN0LnRvcCA9IDA7Ci0gICAgICAgIEZYRlRfRmFjZSBmYWNlID0gbV9Gb250Lm1fRmFjZTsKLSAgICAgICAgaWYgKEZYRlRfSXNfRmFjZV9Ucmlja3koZmFjZSkpIHsKLSAgICAgICAgICAgIGludCBlcnIgPSBGWEZUX0xvYWRfR2x5cGgoZmFjZSwgZ2x5cGhfaW5kZXgsIEZYRlRfTE9BRF9JR05PUkVfR0xPQkFMX0FEVkFOQ0VfV0lEVEgpOwotICAgICAgICAgICAgaWYgKCFlcnIpIHsKLSAgICAgICAgICAgICAgICBGWEZUX0JCb3ggY2JveDsKLSAgICAgICAgICAgICAgICBGWEZUX0dseXBoIGdseXBoOwotICAgICAgICAgICAgICAgIGVyciA9IEZYRlRfR2V0X0dseXBoKCgoRlhGVF9GYWNlKWZhY2UpLT5nbHlwaCwgJmdseXBoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWVycikgewotICAgICAgICAgICAgICAgICAgICBGWEZUX0dseXBoX0dldF9DQm94KGdseXBoLCBGWEZUX0dMWVBIX0JCT1hfUElYRUxTLCAmY2JveCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9zaXplX3ggPSAoKEZYRlRfRmFjZSlmYWNlKS0+c2l6ZS0+bWV0cmljcy54X3BwZW07Ci0gICAgICAgICAgICAgICAgICAgIGludAlwaXhlbF9zaXplX3kgPSAoKEZYRlRfRmFjZSlmYWNlKS0+c2l6ZS0+bWV0cmljcy55X3BwZW07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwaXhlbF9zaXplX3ggPT0gMCB8fCBwaXhlbF9zaXplX3kgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5sZWZ0ID0gY2JveC54TWluOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5yaWdodCA9IGNib3gueE1heDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QudG9wID0gY2JveC55TWF4OwotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5ib3R0b20gPSBjYm94LnlNaW47Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWN0LmxlZnQgPSBjYm94LnhNaW4gKiAxMDAwIC8gcGl4ZWxfc2l6ZV94OwotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5yaWdodCA9IGNib3gueE1heCAqIDEwMDAgLyBwaXhlbF9zaXplX3g7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWN0LnRvcCA9IGNib3gueU1heCAqIDEwMDAgLyBwaXhlbF9zaXplX3k7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWN0LmJvdHRvbSA9IGNib3gueU1pbiAqIDEwMDAgLyBwaXhlbF9zaXplX3k7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3QudG9wID4gRlhGVF9HZXRfRmFjZV9Bc2NlbmRlcihmYWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC50b3AgPSBGWEZUX0dldF9GYWNlX0FzY2VuZGVyKGZhY2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWN0LmJvdHRvbSA8IEZYRlRfR2V0X0ZhY2VfRGVzY2VuZGVyKGZhY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWN0LmJvdHRvbSA9IEZYRlRfR2V0X0ZhY2VfRGVzY2VuZGVyKGZhY2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEZYRlRfRG9uZV9HbHlwaChnbHlwaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IGVyciA9IEZYRlRfTG9hZF9HbHlwaChmYWNlLCBnbHlwaF9pbmRleCwgRlhGVF9MT0FEX05PX1NDQUxFKTsKLSAgICAgICAgICAgIGlmIChlcnIgPT0gMCkgewotICAgICAgICAgICAgICAgIHJlY3QubGVmdCA9IFRUMlBERihGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1goZmFjZSksIGZhY2UpOwotICAgICAgICAgICAgICAgIHJlY3QucmlnaHQgPSBUVDJQREYoRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdYKGZhY2UpICsgRlhGVF9HZXRfR2x5cGhfV2lkdGgoZmFjZSksIGZhY2UpOwotICAgICAgICAgICAgICAgIHJlY3QudG9wID0gVFQyUERGKEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWShmYWNlKSwgZmFjZSk7Ci0gICAgICAgICAgICAgICAgcmVjdC50b3AgKz0gcmVjdC50b3AgLyA2NDsKLSAgICAgICAgICAgICAgICByZWN0LmJvdHRvbSA9IFRUMlBERihGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1koZmFjZSkgLSBGWEZUX0dldF9HbHlwaF9IZWlnaHQoZmFjZSksIGZhY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtX3BGb250RmlsZSA9PSBOVUxMICYmIG1fQ2hhcnNldCA9PSBDSURTRVRfSkFQQU4xKSB7Ci0gICAgICAgIEZYX1dPUkQgQ0lEID0gQ0lERnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKLSAgICAgICAgRlhfTFBDQllURSBwVHJhbnNmb3JtID0gR2V0Q0lEVHJhbnNmb3JtKENJRCk7Ci0gICAgICAgIGlmIChwVHJhbnNmb3JtICYmICFiVmVydCkgewotICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXgoX0NJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVswXSksIF9DSURUcmFuc2Zvcm1Ub0Zsb2F0KHBUcmFuc2Zvcm1bMV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVsyXSksIF9DSURUcmFuc2Zvcm1Ub0Zsb2F0KHBUcmFuc2Zvcm1bM10pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVs0XSkgKiAxMDAwICwgX0NJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVs1XSkgKiAxMDAwKTsKLSAgICAgICAgICAgIENGWF9GbG9hdFJlY3QgcmVjdF9mKHJlY3QpOwotICAgICAgICAgICAgcmVjdF9mLlRyYW5zZm9ybSgmbWF0cml4KTsKLSAgICAgICAgICAgIHJlY3QgPSByZWN0X2YuR2V0T3V0dGVyUmVjdCgpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChjaGFyY29kZSA8IDI1NikgewotICAgICAgICBtX0NoYXJCQm94W2NoYXJjb2RlXS5Cb3R0b20gPSAoc2hvcnQpcmVjdC5ib3R0b207Ci0gICAgICAgIG1fQ2hhckJCb3hbY2hhcmNvZGVdLkxlZnQgPSAoc2hvcnQpcmVjdC5sZWZ0OwotICAgICAgICBtX0NoYXJCQm94W2NoYXJjb2RlXS5SaWdodCA9IChzaG9ydClyZWN0LnJpZ2h0OwotICAgICAgICBtX0NoYXJCQm94W2NoYXJjb2RlXS5Ub3AgPSAoc2hvcnQpcmVjdC50b3A7Ci0gICAgfQotfQotaW50IENQREZfQ0lERm9udDo6R2V0Q2hhcldpZHRoRihGWF9EV09SRCBjaGFyY29kZSwgaW50IGxldmVsKQotewotICAgIGlmIChtX3BBbnNpV2lkdGhzICYmIGNoYXJjb2RlIDwgMHg4MCkgewotICAgICAgICByZXR1cm4gbV9wQW5zaVdpZHRoc1tjaGFyY29kZV07Ci0gICAgfQotICAgIEZYX1dPUkQgY2lkID0gQ0lERnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKLSAgICBpbnQgc2l6ZSA9IG1fV2lkdGhMaXN0LkdldFNpemUoKTsKLSAgICBGWF9EV09SRCogbGlzdCA9IG1fV2lkdGhMaXN0LkdldERhdGEoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkgKz0gMykgewotICAgICAgICBpZiAoY2lkID49IGxpc3RbaV0gJiYgY2lkIDw9IGxpc3RbaSArIDFdKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGludClsaXN0W2kgKyAyXTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbV9EZWZhdWx0V2lkdGg7Ci19Ci1zaG9ydCBDUERGX0NJREZvbnQ6OkdldFZlcnRXaWR0aChGWF9XT1JEIENJRCkgY29uc3QKLXsKLSAgICBGWF9EV09SRCB2ZXJ0c2l6ZSA9IG1fVmVydE1ldHJpY3MuR2V0U2l6ZSgpIC8gNTsKLSAgICBpZiAodmVydHNpemUgPT0gMCkgewotICAgICAgICByZXR1cm4gbV9EZWZhdWx0VzE7Ci0gICAgfQotICAgIGNvbnN0IEZYX0RXT1JEKiBwVGFibGUgPSBtX1ZlcnRNZXRyaWNzLkdldERhdGEoKTsKLSAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgdmVydHNpemU7IGkgKyspCi0gICAgICAgIGlmIChwVGFibGVbaSAqIDVdIDw9IENJRCAmJiBwVGFibGVbaSAqIDUgKyAxXSA+PSBDSUQpIHsKLSAgICAgICAgICAgIHJldHVybiAoc2hvcnQpKGludClwVGFibGVbaSAqIDUgKyAyXTsKLSAgICAgICAgfQotICAgIHJldHVybiBtX0RlZmF1bHRXMTsKLX0KLXZvaWQgQ1BERl9DSURGb250OjpHZXRWZXJ0T3JpZ2luKEZYX1dPUkQgQ0lELCBzaG9ydCYgdngsIHNob3J0ICZ2eSkgY29uc3QKLXsKLSAgICBGWF9EV09SRCB2ZXJ0c2l6ZSA9IG1fVmVydE1ldHJpY3MuR2V0U2l6ZSgpIC8gNTsKLSAgICBpZiAodmVydHNpemUpIHsKLSAgICAgICAgY29uc3QgRlhfRFdPUkQqIHBUYWJsZSA9IG1fVmVydE1ldHJpY3MuR2V0RGF0YSgpOwotICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgdmVydHNpemU7IGkgKyspCi0gICAgICAgICAgICBpZiAocFRhYmxlW2kgKiA1XSA8PSBDSUQgJiYgcFRhYmxlW2kgKiA1ICsgMV0gPj0gQ0lEKSB7Ci0gICAgICAgICAgICAgICAgdnggPSAoc2hvcnQpKGludClwVGFibGVbaSAqIDUgKyAzXTsKLSAgICAgICAgICAgICAgICB2eSA9IChzaG9ydCkoaW50KXBUYWJsZVtpICogNSArIDRdOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0gICAgRlhfRFdPUkQgZHdXaWR0aCA9IG1fRGVmYXVsdFdpZHRoOwotICAgIGludCBzaXplID0gbV9XaWR0aExpc3QuR2V0U2l6ZSgpOwotICAgIGNvbnN0IEZYX0RXT1JEKiBsaXN0ID0gbV9XaWR0aExpc3QuR2V0RGF0YSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSArPSAzKSB7Ci0gICAgICAgIGlmIChDSUQgPj0gbGlzdFtpXSAmJiBDSUQgPD0gbGlzdFtpICsgMV0pIHsKLSAgICAgICAgICAgIGR3V2lkdGggPSAoRlhfV09SRClsaXN0W2kgKyAyXTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHZ4ID0gKHNob3J0KWR3V2lkdGggLyAyOwotICAgIHZ5ID0gKHNob3J0KW1fRGVmYXVsdFZZOwotfQotaW50CUNQREZfQ0lERm9udDo6R2V0R2x5cGhJbmRleChGWF9EV09SRCB1bmljb2RlLCBGWF9CT09MICpwVmVydEdseXBoKQotewotICAgIGlmIChwVmVydEdseXBoKSB7Ci0gICAgICAgICpwVmVydEdseXBoID0gRkFMU0U7Ci0gICAgfQotICAgIGludCBpbmRleCA9IEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250Lm1fRmFjZSwgdW5pY29kZSApOwotICAgIGlmICh1bmljb2RlID09IDB4MjUwMikgewotICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotICAgIGlmIChpbmRleCAmJiBJc1ZlcnRXcml0aW5nKCkpIHsKLSAgICAgICAgaWYgKG1fcFRUR1NVQlRhYmxlKSB7Ci0gICAgICAgICAgICBUVF91aW50MzJfdCB2aW5kZXggPSAwOwotICAgICAgICAgICAgbV9wVFRHU1VCVGFibGUtPkdldFZlcnRpY2FsR2x5cGgoaW5kZXgsICZ2aW5kZXgpOwotICAgICAgICAgICAgaWYgKHZpbmRleCkgewotICAgICAgICAgICAgICAgIGluZGV4ID0gdmluZGV4OwotICAgICAgICAgICAgICAgIGlmIChwVmVydEdseXBoKSB7Ci0gICAgICAgICAgICAgICAgICAgICpwVmVydEdseXBoID0gVFJVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE5VTEwgPT0gbV9Gb250Lm1fcEdzdWJEYXRhKSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aCA9IDA7Ci0gICAgICAgICAgICBpbnQgZXJyb3IgPSBGWEZUX0xvYWRfU2ZudF9UYWJsZSggbV9Gb250Lm1fRmFjZSwgRlRfTUFLRV9UQUcoJ0cnLCAnUycsICdVJywgJ0InKSwgMCwgTlVMTCwgJmxlbmd0aCk7Ci0gICAgICAgICAgICBpZiAoIWVycm9yKSB7Ci0gICAgICAgICAgICAgICAgbV9Gb250Lm1fcEdzdWJEYXRhID0gKHVuc2lnbmVkIGNoYXIqKUZYX0FsbG9jKEZYX0JZVEUsIGxlbmd0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGVycm9yID0gRlhGVF9Mb2FkX1NmbnRfVGFibGUoIG1fRm9udC5tX0ZhY2UsIEZUX01BS0VfVEFHKCdHJywgJ1MnLCAnVScsICdCJyksIDAsIG1fRm9udC5tX3BHc3ViRGF0YSwgTlVMTCk7Ci0gICAgICAgIGlmICghZXJyb3IgJiYgbV9Gb250Lm1fcEdzdWJEYXRhKSB7Ci0gICAgICAgICAgICBtX3BUVEdTVUJUYWJsZSA9IG5ldyBDRlhfQ1RUR1NVQlRhYmxlOwotICAgICAgICAgICAgbV9wVFRHU1VCVGFibGUtPkxvYWRHU1VCVGFibGUoKEZUX0J5dGVzKW1fRm9udC5tX3BHc3ViRGF0YSk7Ci0gICAgICAgICAgICBUVF91aW50MzJfdCB2aW5kZXggPSAwOwotICAgICAgICAgICAgbV9wVFRHU1VCVGFibGUtPkdldFZlcnRpY2FsR2x5cGgoaW5kZXgsICZ2aW5kZXgpOwotICAgICAgICAgICAgaWYgKHZpbmRleCkgewotICAgICAgICAgICAgICAgIGluZGV4ID0gdmluZGV4OwotICAgICAgICAgICAgICAgIGlmIChwVmVydEdseXBoKSB7Ci0gICAgICAgICAgICAgICAgICAgICpwVmVydEdseXBoID0gVFJVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLSAgICBpZiAocFZlcnRHbHlwaCkgewotICAgICAgICAqcFZlcnRHbHlwaCA9IEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gaW5kZXg7Ci19Ci1pbnQgQ1BERl9DSURGb250OjpHbHlwaEZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSwgRlhfQk9PTCAqcFZlcnRHbHlwaCkKLXsKLSAgICBpZiAocFZlcnRHbHlwaCkgewotICAgICAgICAqcFZlcnRHbHlwaCA9IEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9wRm9udEZpbGUgPT0gTlVMTCAmJiBtX3BDSURUb0dJRE1hcCA9PSBOVUxMKSB7Ci0gICAgICAgIEZYX1dPUkQgY2lkID0gQ0lERnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKLSAgICAgICAgRlhfV0NIQVIgdW5pY29kZSA9IDA7Ci0gICAgICAgIGlmIChtX2JDSURJc0dJRCkgewotI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgICAgICAgICByZXR1cm4gY2lkOwotI2Vsc2UKLSAgICAgICAgICAgIGlmIChtX0ZsYWdzICYgUERGRk9OVF9TWU1CT0xJQykgewotICAgICAgICAgICAgICAgIHJldHVybiBjaWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB1bmlfc3RyID0gVW5pY29kZUZyb21DaGFyQ29kZShjaGFyY29kZSk7Ci0gICAgICAgICAgICBpZiAodW5pX3N0ci5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY2lkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5pY29kZSA9IHVuaV9zdHIuR2V0QXQoMCk7Ci0jZW5kaWYKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChjaWQgJiYgbV9wQ0lEMlVuaWNvZGVNYXAgJiYgbV9wQ0lEMlVuaWNvZGVNYXAtPklzTG9hZGVkKCkpIHsKLSAgICAgICAgICAgICAgICB1bmljb2RlID0gbV9wQ0lEMlVuaWNvZGVNYXAtPlVuaWNvZGVGcm9tQ0lEKGNpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodW5pY29kZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdW5pY29kZSA9IF9Vbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh1bmljb2RlID09IDAgJiYgIShtX0ZsYWdzICYgUERGRk9OVF9TWU1CT0xJQykpIHsKLSAgICAgICAgICAgICAgICB1bmljb2RlID0gVW5pY29kZUZyb21DaGFyQ29kZShjaGFyY29kZSkuR2V0QXQoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVuaWNvZGUgPT0gMCkgewotICAgICAgICAgICAgaWYgKCFtX2JBZG9iZUNvdXJpZXJTdGQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY2hhcmNvZGUgPT0gMCA/IC0xIDogKGludCljaGFyY29kZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoYXJjb2RlICs9IDMxOwotICAgICAgICAgICAgaW50IGluZGV4ID0gMCwgaUJhc2VFbmNvZGluZzsKLSAgICAgICAgICAgIEZYX0JPT0wgYk1TVW5pY29kZSA9IEZUX1VzZVRUQ2hhcm1hcChtX0ZvbnQubV9GYWNlLCAzLCAxKTsKLSAgICAgICAgICAgIEZYX0JPT0wgYk1hY1JvbWFuID0gRkFMU0U7Ci0gICAgICAgICAgICBpZiAoIWJNU1VuaWNvZGUpIHsKLSAgICAgICAgICAgICAgICBiTWFjUm9tYW4gPSBGVF9Vc2VUVENoYXJtYXAobV9Gb250Lm1fRmFjZSwgMSwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpQmFzZUVuY29kaW5nID0gUERGRk9OVF9FTkNPRElOR19TVEFOREFSRDsKLSAgICAgICAgICAgIGlmIChiTVNVbmljb2RlKSB7Ci0gICAgICAgICAgICAgICAgaUJhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfV0lOQU5TSTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYk1hY1JvbWFuKSB7Ci0gICAgICAgICAgICAgICAgaUJhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfTUFDUk9NQU47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9MUENTVFIgbmFtZSA9IEdldEFkb2JlQ2hhck5hbWUoaUJhc2VFbmNvZGluZywgTlVMTCwgY2hhcmNvZGUpOwotICAgICAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjaGFyY29kZSA9PSAwID8gLTEgOiAoaW50KWNoYXJjb2RlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfV09SRCB1bmljb2RlID0gUERGX1VuaWNvZGVGcm9tQWRvYmVOYW1lKG5hbWUpOwotICAgICAgICAgICAgaWYgKHVuaWNvZGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoYk1TVW5pY29kZSkgewotICAgICAgICAgICAgICAgICAgICBpbmRleCA9IEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250Lm1fRmFjZSwgdW5pY29kZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiTWFjUm9tYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFjY29kZSA9IEZUX0NoYXJDb2RlRnJvbVVuaWNvZGUoRlhGVF9FTkNPRElOR19BUFBMRV9ST01BTiwgdW5pY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gIW1hY2NvZGUgPyBGWEZUX0dldF9OYW1lX0luZGV4KG1fRm9udC5tX0ZhY2UsIChjaGFyICopbmFtZSkgOiBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIG1hY2NvZGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5tX0ZhY2UsIHVuaWNvZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNoYXJjb2RlID09IDAgPyAtMSA6IChpbnQpY2hhcmNvZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaW5kZXggPT0gMCB8fCBpbmRleCA9PSAweGZmZmYpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY2hhcmNvZGUgPT0gMCA/IC0xIDogKGludCljaGFyY29kZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtX0NoYXJzZXQgPT0gQ0lEU0VUX0pBUEFOMSkgewotICAgICAgICAgICAgaWYgKHVuaWNvZGUgPT0gJ1xcJykgewotICAgICAgICAgICAgICAgIHVuaWNvZGUgPSAnLyc7Ci0gICAgICAgICAgICB9Ci0jaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICAgICAgICAgIGVsc2UgaWYgKHVuaWNvZGUgPT0gMHhhNSkgewotICAgICAgICAgICAgICAgIHVuaWNvZGUgPSAweDVjOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fRm9udC5tX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIHVuaWNvZGU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGVyciA9IEZYRlRfU2VsZWN0X0NoYXJtYXAobV9Gb250Lm1fRmFjZSwgRlhGVF9FTkNPRElOR19VTklDT0RFKTsKLSAgICAgICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGWEZUX0dldF9GYWNlX0NoYXJtYXBDb3VudChtX0ZvbnQubV9GYWNlKTsgaSArKykgewotICAgICAgICAgICAgICAgIEZYX0RXT1JEIHJldCA9IEZUX0NoYXJDb2RlRnJvbVVuaWNvZGUoRlhGVF9HZXRfQ2hhcm1hcF9FbmNvZGluZyhGWEZUX0dldF9GYWNlX0NoYXJtYXBzKG1fRm9udC5tX0ZhY2UpW2ldKSwgKEZYX1dDSEFSKWNoYXJjb2RlKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZYRlRfU2V0X0NoYXJtYXAobV9Gb250Lm1fRmFjZSwgRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhtX0ZvbnQubV9GYWNlKVtpXSk7Ci0gICAgICAgICAgICAgICAgdW5pY29kZSA9IChGWF9XQ0hBUilyZXQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaSA9PSBGWEZUX0dldF9GYWNlX0NoYXJtYXBDb3VudChtX0ZvbnQubV9GYWNlKSAmJiBpKSB7Ci0gICAgICAgICAgICAgICAgRlhGVF9TZXRfQ2hhcm1hcChtX0ZvbnQubV9GYWNlLCBGWEZUX0dldF9GYWNlX0NoYXJtYXBzKG1fRm9udC5tX0ZhY2UpWzBdKTsKLSAgICAgICAgICAgICAgICB1bmljb2RlID0gKEZYX1dDSEFSKWNoYXJjb2RlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChGWEZUX0dldF9GYWNlX0NoYXJtYXAobV9Gb250Lm1fRmFjZSkpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IEdldEdseXBoSW5kZXgodW5pY29kZSwgcFZlcnRHbHlwaCk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdW5pY29kZSA7Ci0gICAgfQotICAgIGlmIChtX0ZvbnQubV9GYWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBGWF9XT1JEIGNpZCA9IENJREZyb21DaGFyQ29kZShjaGFyY29kZSk7Ci0gICAgaWYgKG1fYlR5cGUxKSB7Ci0gICAgICAgIGlmIChOVUxMID09IG1fcENJRFRvR0lETWFwKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2lkOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1fcENJRFRvR0lETWFwID09IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChtX3BGb250RmlsZSAmJiBtX3BDTWFwLT5tX3BNYXBwaW5nID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY2lkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1fcENNYXAtPm1fQ29kaW5nID09IENJRENPRElOR19VTktOT1dOIHx8IEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcChtX0ZvbnQubV9GYWNlKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNpZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChGWEZUX0dldF9DaGFybWFwX0VuY29kaW5nKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcChtX0ZvbnQubV9GYWNlKSkgPT0gRlhGVF9FTkNPRElOR19VTklDT0RFKSB7Ci0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgdW5pY29kZV9zdHIgPSBVbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKLSAgICAgICAgICAgICAgICBpZiAodW5pY29kZV9zdHIuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hhcmNvZGUgPSB1bmljb2RlX3N0ci5HZXRBdCgwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBHZXRHbHlwaEluZGV4KGNoYXJjb2RlLCBwVmVydEdseXBoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBGWF9EV09SRCBieXRlX3BvcyA9IGNpZCAqIDI7Ci0gICAgaWYgKGJ5dGVfcG9zICsgMiA+IG1fcENJRFRvR0lETWFwLT5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBGWF9MUENCWVRFIHBkYXRhID0gbV9wQ0lEVG9HSURNYXAtPkdldERhdGEoKSArIGJ5dGVfcG9zOwotICAgIHJldHVybiBwZGF0YVswXSAqIDI1NiArIHBkYXRhWzFdOwotfQotRlhfRFdPUkQgQ1BERl9DSURGb250OjpHZXROZXh0Q2hhcihGWF9MUENTVFIgcFN0cmluZywgaW50IG5TdHJMZW4sIGludCYgb2Zmc2V0KSBjb25zdAotewotICAgIHJldHVybiBtX3BDTWFwLT5HZXROZXh0Q2hhcihwU3RyaW5nLCBuU3RyTGVuLCBvZmZzZXQpOwotfQotaW50IENQREZfQ0lERm9udDo6R2V0Q2hhclNpemUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcENNYXAtPkdldENoYXJTaXplKGNoYXJjb2RlKTsKLX0KLWludCBDUERGX0NJREZvbnQ6OkNvdW50Q2hhcihGWF9MUENTVFIgcFN0cmluZywgaW50IHNpemUpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcENNYXAtPkNvdW50Q2hhcihwU3RyaW5nLCBzaXplKTsKLX0KLWludCBDUERGX0NJREZvbnQ6OkFwcGVuZENoYXIoRlhfTFBTVFIgc3RyLCBGWF9EV09SRCBjaGFyY29kZSkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wQ01hcC0+QXBwZW5kQ2hhcihzdHIsIGNoYXJjb2RlKTsKLX0KLUZYX0JPT0wgQ1BERl9DSURGb250OjpJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3QKLXsKLSAgICBpZiAoIW1fcENNYXAtPklzTG9hZGVkKCkgfHwgbV9wQ0lEMlVuaWNvZGVNYXAgPT0gTlVMTCB8fCAhbV9wQ0lEMlVuaWNvZGVNYXAtPklzTG9hZGVkKCkpIHsKLSAgICAgICAgcmV0dXJuIG1fcENNYXAtPm1fQ29kaW5nICE9IENJRENPRElOR19VTktOT1dOOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ1BERl9DSURGb250OjpJc0ZvbnRTdHlsZUZyb21DaGFyQ29kZShGWF9EV09SRCBjaGFyY29kZSkgY29uc3QKLXsKLSAgICByZXR1cm4gVFJVRTsKLX0KLXZvaWQgQ1BERl9DSURGb250OjpMb2FkU3Vic3RGb250KCkKLXsKLSAgICBtX0ZvbnQuTG9hZFN1YnN0KG1fQmFzZUZvbnQsICFtX2JUeXBlMSwgbV9GbGFncywgbV9TdGVtViAqIDUsIG1fSXRhbGljQW5nbGUsIGdfQ2hhcnNldENQc1ttX0NoYXJzZXRdLCBJc1ZlcnRXcml0aW5nKCkpOwotfQotdm9pZCBDUERGX0NJREZvbnQ6OkxvYWRNZXRyaWNzQXJyYXkoQ1BERl9BcnJheSogcEFycmF5LCBDRlhfRFdvcmRBcnJheSYgcmVzdWx0LCBpbnQgbkVsZW1lbnRzKQotewotICAgIGludCB3aWR0aF9zdGF0dXMgPSAwOwotICAgIGludCBpQ3VyRWxlbWVudCA9IDA7Ci0gICAgaW50IGZpcnN0X2NvZGUgPSAwLCBsYXN0X2NvZGU7Ci0gICAgRlhfRFdPUkQgY291bnQgPSBwQXJyYXktPkdldENvdW50KCk7Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGNvdW50OyBpICsrKSB7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoaSk7Ci0gICAgICAgIGlmIChwT2JqID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgICAgICBpZiAod2lkdGhfc3RhdHVzICE9IDEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcE9iajsKLSAgICAgICAgICAgIEZYX0RXT1JEIGNvdW50ID0gcEFycmF5LT5HZXRDb3VudCgpOwotICAgICAgICAgICAgZm9yIChGWF9EV09SRCBqID0gMDsgaiA8IGNvdW50OyBqICs9IG5FbGVtZW50cykgewotICAgICAgICAgICAgICAgIHJlc3VsdC5BZGQoZmlyc3RfY29kZSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LkFkZChmaXJzdF9jb2RlKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IG5FbGVtZW50czsgayArKykgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuQWRkKHBBcnJheS0+R2V0SW50ZWdlcihqICsgaykpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaXJzdF9jb2RlICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2lkdGhfc3RhdHVzID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICh3aWR0aF9zdGF0dXMgPT0gMCkgewotICAgICAgICAgICAgICAgIGZpcnN0X2NvZGUgPSBwT2JqLT5HZXRJbnRlZ2VyKCk7Ci0gICAgICAgICAgICAgICAgd2lkdGhfc3RhdHVzID0gMTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2lkdGhfc3RhdHVzID09IDEpIHsKLSAgICAgICAgICAgICAgICBsYXN0X2NvZGUgPSBwT2JqLT5HZXRJbnRlZ2VyKCk7Ci0gICAgICAgICAgICAgICAgd2lkdGhfc3RhdHVzID0gMjsKLSAgICAgICAgICAgICAgICBpQ3VyRWxlbWVudCA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICghaUN1ckVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LkFkZChmaXJzdF9jb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LkFkZChsYXN0X2NvZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXN1bHQuQWRkKHBPYmotPkdldEludGVnZXIoKSk7Ci0gICAgICAgICAgICAgICAgaUN1ckVsZW1lbnQgKys7Ci0gICAgICAgICAgICAgICAgaWYgKGlDdXJFbGVtZW50ID09IG5FbGVtZW50cykgewotICAgICAgICAgICAgICAgICAgICB3aWR0aF9zdGF0dXMgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLUZYX0JPT0wgQ1BERl9DSURGb250OjpMb2FkR0IyMzEyKCkKLXsKLSAgICBtX0Jhc2VGb250ID0gbV9wRm9udERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiQmFzZUZvbnQiKSk7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERlc2MgPSBtX3BGb250RGljdC0+R2V0RGljdChGWF9CU1RSQygiRm9udERlc2NyaXB0b3IiKSk7Ci0gICAgaWYgKHBGb250RGVzYykgewotICAgICAgICBMb2FkRm9udERlc2NyaXB0b3IocEZvbnREZXNjKTsKLSAgICB9Ci0gICAgbV9DaGFyc2V0ID0gQ0lEU0VUX0dCMTsKLSAgICBtX2JUeXBlMSA9IEZBTFNFOwotICAgIG1fcENNYXAgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+R2V0Rm9udEdsb2JhbHMoKS0+bV9DTWFwTWFuYWdlci5HZXRQcmVkZWZpbmVkQ01hcCgKLSAgICAgICAgICAgICAgICAgIEZYX0JTVFJDKCJHQkstRVVDLUgiKSwgRkFMU0UpOwotICAgIG1fcENJRDJVbmljb2RlTWFwID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCktPm1fQ01hcE1hbmFnZXIuR2V0Q0lEMlVuaWNvZGVNYXAobV9DaGFyc2V0LCBGQUxTRSk7Ci0gICAgaWYgKCFJc0VtYmVkZGVkKCkpIHsKLSAgICAgICAgTG9hZFN1YnN0Rm9udCgpOwotICAgIH0KLSAgICBDaGVja0ZvbnRNZXRyaWNzKCk7Ci0gICAgbV9EZWZhdWx0V2lkdGggPSAxMDAwOwotICAgIG1fcEFuc2lXaWR0aHMgPSBGWF9BbGxvYyhGWF9XT1JELCAxMjgpOwotICAgIGZvciAoaW50IGkgPSAzMjsgaSA8IDEyNzsgaSArKykgewotICAgICAgICBtX3BBbnNpV2lkdGhzW2ldID0gNTAwOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLWNvbnN0IHN0cnVjdCBfQ0lEVHJhbnNmb3JtIHsKLSAgICBGWF9XT1JECQlDSUQ7Ci0gICAgRlhfQllURQkJYSwgYiwgYywgZCwgZSwgZjsKLX0KLUphcGFuMV9WZXJ0Q0lEc1tdID0geworCitjb25zdCBzdHJ1Y3QgQ0lEVHJhbnNmb3JtIHsKKyAgRlhfV09SRCBDSUQ7CisgIHVpbnQ4X3QgYSwgYiwgYywgZCwgZSwgZjsKK30gZ19KYXBhbjFfVmVydENJRHNbXSA9IHsKICAgICB7OTcsIDEyOSwgMCwgMCwgMTI3LCA1NSwgMH0sCiAgICAgezc4ODcsIDEyNywgMCwgMCwgMTI3LCA3NiwgODl9LAogICAgIHs3ODg4LCAxMjcsIDAsIDAsIDEyNywgNzksIDk0fSwKQEAgLTE1NzksMjMgKzUxNywxMjA5IEBACiAgICAgezg4MTgsIDAsIDEyOSwgMTI3LCAwLCAxOSwgMTE0fSwKICAgICB7ODgxOSwgMCwgMTI5LCAxMjcsIDAsIDIxOCwgMTA4fSwKIH07Ci1GWF9MUENCWVRFIENQREZfQ0lERm9udDo6R2V0Q0lEVHJhbnNmb3JtKEZYX1dPUkQgQ0lEKSBjb25zdAotewotICAgIGlmIChtX0NoYXJzZXQgIT0gQ0lEU0VUX0pBUEFOMSB8fCBtX3BGb250RmlsZSAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworCitpbnQgQ29tcGFyZUNJRFRyYW5zZm9ybShjb25zdCB2b2lkKiBrZXksIGNvbnN0IHZvaWQqIGVsZW1lbnQpIHsKKyAgRlhfV09SRCBDSUQgPSAqc3RhdGljX2Nhc3Q8Y29uc3QgRlhfV09SRCo+KGtleSk7CisgIHJldHVybiBDSUQgLSBzdGF0aWNfY2FzdDxjb25zdCBzdHJ1Y3QgQ0lEVHJhbnNmb3JtKj4oZWxlbWVudCktPkNJRDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0NQREZfQ01hcE1hbmFnZXI6OkNQREZfQ01hcE1hbmFnZXIoKSB7CisgIG1fYlByb21wdGVkID0gRkFMU0U7CisgIEZYU1lTX21lbXNldChtX0NJRDJVbmljb2RlTWFwcywgMCwgc2l6ZW9mIG1fQ0lEMlVuaWNvZGVNYXBzKTsKK30KK0NQREZfQ01hcE1hbmFnZXI6On5DUERGX0NNYXBNYW5hZ2VyKCkgeworICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBtX0NNYXBzKSB7CisgICAgZGVsZXRlIHBhaXIuc2Vjb25kOworICB9CisgIG1fQ01hcHMuY2xlYXIoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUobV9DSUQyVW5pY29kZU1hcHMpOyArK2kpIHsKKyAgICBkZWxldGUgbV9DSUQyVW5pY29kZU1hcHNbaV07CisgIH0KK30KK0NQREZfQ01hcCogQ1BERl9DTWFwTWFuYWdlcjo6R2V0UHJlZGVmaW5lZENNYXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlByb21wdENKSykgeworICBhdXRvIGl0ID0gbV9DTWFwcy5maW5kKG5hbWUpOworICBpZiAoaXQgIT0gbV9DTWFwcy5lbmQoKSkgeworICAgIHJldHVybiBpdC0+c2Vjb25kOworICB9CisgIENQREZfQ01hcCogcENNYXAgPSBMb2FkUHJlZGVmaW5lZENNYXAobmFtZSwgYlByb21wdENKSyk7CisgIGlmICghbmFtZS5Jc0VtcHR5KCkpIHsKKyAgICBtX0NNYXBzW25hbWVdID0gcENNYXA7CisgIH0KKyAgcmV0dXJuIHBDTWFwOworfQorQ1BERl9DTWFwKiBDUERGX0NNYXBNYW5hZ2VyOjpMb2FkUHJlZGVmaW5lZENNYXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcm9tcHRDSkspIHsKKyAgQ1BERl9DTWFwKiBwQ01hcCA9IG5ldyBDUERGX0NNYXA7CisgIGNvbnN0IEZYX0NIQVIqIHBuYW1lID0gbmFtZTsKKyAgaWYgKCpwbmFtZSA9PSAnLycpIHsKKyAgICBwbmFtZSsrOworICB9CisgIHBDTWFwLT5Mb2FkUHJlZGVmaW5lZCh0aGlzLCBwbmFtZSwgYlByb21wdENKSyk7CisgIHJldHVybiBwQ01hcDsKK30KKwordm9pZCBDUERGX0NNYXBNYW5hZ2VyOjpSZWxvYWRBbGwoKSB7CisgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG1fQ01hcHMpIHsKKyAgICBDUERGX0NNYXAqIHBDTWFwID0gcGFpci5zZWNvbmQ7CisgICAgcENNYXAtPkxvYWRQcmVkZWZpbmVkKHRoaXMsIHBhaXIuZmlyc3QsIEZBTFNFKTsKKyAgfQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShtX0NJRDJVbmljb2RlTWFwcyk7ICsraSkgeworICAgIGlmIChDUERGX0NJRDJVbmljb2RlTWFwKiBwTWFwID0gbV9DSUQyVW5pY29kZU1hcHNbaV0pIHsKKyAgICAgIHBNYXAtPkxvYWQodGhpcywgQ0lEU2V0RnJvbVNpemVUKGkpLCBGQUxTRSk7CiAgICAgfQotICAgIGludCBiZWdpbiA9IDA7Ci0gICAgaW50IGVuZCA9IHNpemVvZiBKYXBhbjFfVmVydENJRHMgLyBzaXplb2Yoc3RydWN0IF9DSURUcmFuc2Zvcm0pIC0gMTsKLSAgICB3aGlsZSAoYmVnaW4gPD0gZW5kKSB7Ci0gICAgICAgIGludCBtaWRkbGUgPSAoYmVnaW4gKyBlbmQpIC8gMjsKLSAgICAgICAgRlhfV09SRCBtaWRkbGVjb2RlID0gSmFwYW4xX1ZlcnRDSURzW21pZGRsZV0uQ0lEOwotICAgICAgICBpZiAobWlkZGxlY29kZSA+IENJRCkgewotICAgICAgICAgICAgZW5kID0gbWlkZGxlIC0gMTsKLSAgICAgICAgfSBlbHNlIGlmIChtaWRkbGVjb2RlIDwgQ0lEKSB7Ci0gICAgICAgICAgICBiZWdpbiA9IG1pZGRsZSArIDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gJkphcGFuMV9WZXJ0Q0lEc1ttaWRkbGVdLmE7Ci0gICAgICAgIH0KLSAgICB9CisgIH0KK30KK0NQREZfQ0lEMlVuaWNvZGVNYXAqIENQREZfQ01hcE1hbmFnZXI6OkdldENJRDJVbmljb2RlTWFwKENJRFNldCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJvbXB0Q0pLKSB7CisgIGlmICghbV9DSUQyVW5pY29kZU1hcHNbY2hhcnNldF0pCisgICAgbV9DSUQyVW5pY29kZU1hcHNbY2hhcnNldF0gPSBMb2FkQ0lEMlVuaWNvZGVNYXAoY2hhcnNldCwgYlByb21wdENKSyk7CisgIHJldHVybiBtX0NJRDJVbmljb2RlTWFwc1tjaGFyc2V0XTsKK30KK0NQREZfQ0lEMlVuaWNvZGVNYXAqIENQREZfQ01hcE1hbmFnZXI6OkxvYWRDSUQyVW5pY29kZU1hcChDSURTZXQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcm9tcHRDSkspIHsKKyAgQ1BERl9DSUQyVW5pY29kZU1hcCogcE1hcCA9IG5ldyBDUERGX0NJRDJVbmljb2RlTWFwKCk7CisgIGlmICghcE1hcC0+SW5pdGlhbGl6ZSgpKSB7CisgICAgZGVsZXRlIHBNYXA7CiAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcE1hcC0+TG9hZCh0aGlzLCBjaGFyc2V0LCBiUHJvbXB0Q0pLKTsKKyAgcmV0dXJuIHBNYXA7Cit9CitDUERGX0NNYXBQYXJzZXI6OkNQREZfQ01hcFBhcnNlcigpIHsKKyAgbV9wQ01hcCA9IE5VTEw7CisgIG1fU3RhdHVzID0gMDsKKyAgbV9Db2RlU2VxID0gMDsKK30KK0ZYX0JPT0wgQ1BERl9DTWFwUGFyc2VyOjpJbml0aWFsaXplKENQREZfQ01hcCogcENNYXApIHsKKyAgbV9wQ01hcCA9IHBDTWFwOworICBtX1N0YXR1cyA9IDA7CisgIG1fQ29kZVNlcSA9IDA7CisgIG1fQWRkTWFwcy5Fc3RpbWF0ZVNpemUoMCwgMTAyNDApOworICByZXR1cm4gVFJVRTsKK30KKwordm9pZCBDUERGX0NNYXBQYXJzZXI6OlBhcnNlV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHdvcmQpIHsKKyAgaWYgKHdvcmQuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmICh3b3JkID09ICJiZWdpbmNpZGNoYXIiKSB7CisgICAgbV9TdGF0dXMgPSAxOworICAgIG1fQ29kZVNlcSA9IDA7CisgIH0gZWxzZSBpZiAod29yZCA9PSAiYmVnaW5jaWRyYW5nZSIpIHsKKyAgICBtX1N0YXR1cyA9IDI7CisgICAgbV9Db2RlU2VxID0gMDsKKyAgfSBlbHNlIGlmICh3b3JkID09ICJlbmRjaWRyYW5nZSIgfHwgd29yZCA9PSAiZW5kY2lkY2hhciIpIHsKKyAgICBtX1N0YXR1cyA9IDA7CisgIH0gZWxzZSBpZiAod29yZCA9PSAiL1dNb2RlIikgeworICAgIG1fU3RhdHVzID0gNjsKKyAgfSBlbHNlIGlmICh3b3JkID09ICIvUmVnaXN0cnkiKSB7CisgICAgbV9TdGF0dXMgPSAzOworICB9IGVsc2UgaWYgKHdvcmQgPT0gIi9PcmRlcmluZyIpIHsKKyAgICBtX1N0YXR1cyA9IDQ7CisgIH0gZWxzZSBpZiAod29yZCA9PSAiL1N1cHBsZW1lbnQiKSB7CisgICAgbV9TdGF0dXMgPSA1OworICB9IGVsc2UgaWYgKHdvcmQgPT0gImJlZ2luY29kZXNwYWNlcmFuZ2UiKSB7CisgICAgbV9TdGF0dXMgPSA3OworICAgIG1fQ29kZVNlcSA9IDA7CisgIH0gZWxzZSBpZiAod29yZCA9PSAidXNlY21hcCIpIHsKKyAgfSBlbHNlIGlmIChtX1N0YXR1cyA9PSAxIHx8IG1fU3RhdHVzID09IDIpIHsKKyAgICBtX0NvZGVQb2ludHNbbV9Db2RlU2VxXSA9IENNYXBfR2V0Q29kZSh3b3JkKTsKKyAgICBtX0NvZGVTZXErKzsKKyAgICBGWF9EV09SRCBTdGFydENvZGUsIEVuZENvZGU7CisgICAgRlhfV09SRCBTdGFydENJRDsKKyAgICBpZiAobV9TdGF0dXMgPT0gMSkgeworICAgICAgaWYgKG1fQ29kZVNlcSA8IDIpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgRW5kQ29kZSA9IFN0YXJ0Q29kZSA9IG1fQ29kZVBvaW50c1swXTsKKyAgICAgIFN0YXJ0Q0lEID0gKEZYX1dPUkQpbV9Db2RlUG9pbnRzWzFdOworICAgIH0gZWxzZSB7CisgICAgICBpZiAobV9Db2RlU2VxIDwgMykgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBTdGFydENvZGUgPSBtX0NvZGVQb2ludHNbMF07CisgICAgICBFbmRDb2RlID0gbV9Db2RlUG9pbnRzWzFdOworICAgICAgU3RhcnRDSUQgPSAoRlhfV09SRCltX0NvZGVQb2ludHNbMl07CisgICAgfQorICAgIGlmIChFbmRDb2RlIDwgMHgxMDAwMCkgeworICAgICAgZm9yIChGWF9EV09SRCBjb2RlID0gU3RhcnRDb2RlOyBjb2RlIDw9IEVuZENvZGU7IGNvZGUrKykgeworICAgICAgICBtX3BDTWFwLT5tX3BNYXBwaW5nW2NvZGVdID0gKEZYX1dPUkQpKFN0YXJ0Q0lEICsgY29kZSAtIFN0YXJ0Q29kZSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEZYX0RXT1JEIGJ1ZlsyXTsKKyAgICAgIGJ1ZlswXSA9IFN0YXJ0Q29kZTsKKyAgICAgIGJ1ZlsxXSA9ICgoRW5kQ29kZSAtIFN0YXJ0Q29kZSkgPDwgMTYpICsgU3RhcnRDSUQ7CisgICAgICBtX0FkZE1hcHMuQXBwZW5kQmxvY2soYnVmLCBzaXplb2YgYnVmKTsKKyAgICB9CisgICAgbV9Db2RlU2VxID0gMDsKKyAgfSBlbHNlIGlmIChtX1N0YXR1cyA9PSAzKSB7CisgICAgQ01hcF9HZXRTdHJpbmcod29yZCk7CisgICAgbV9TdGF0dXMgPSAwOworICB9IGVsc2UgaWYgKG1fU3RhdHVzID09IDQpIHsKKyAgICBtX3BDTWFwLT5tX0NoYXJzZXQgPSBDaGFyc2V0RnJvbU9yZGVyaW5nKENNYXBfR2V0U3RyaW5nKHdvcmQpKTsKKyAgICBtX1N0YXR1cyA9IDA7CisgIH0gZWxzZSBpZiAobV9TdGF0dXMgPT0gNSkgeworICAgIENNYXBfR2V0Q29kZSh3b3JkKTsKKyAgICBtX1N0YXR1cyA9IDA7CisgIH0gZWxzZSBpZiAobV9TdGF0dXMgPT0gNikgeworICAgIG1fcENNYXAtPm1fYlZlcnRpY2FsID0gQ01hcF9HZXRDb2RlKHdvcmQpOworICAgIG1fU3RhdHVzID0gMDsKKyAgfSBlbHNlIGlmIChtX1N0YXR1cyA9PSA3KSB7CisgICAgaWYgKHdvcmQgPT0gImVuZGNvZGVzcGFjZXJhbmdlIikgeworICAgICAgaW50IG5TZWdzID0gbV9Db2RlUmFuZ2VzLkdldFNpemUoKTsKKyAgICAgIGlmIChuU2VncyA+IDEpIHsKKyAgICAgICAgbV9wQ01hcC0+bV9Db2RpbmdTY2hlbWUgPSBDUERGX0NNYXA6Ok1peGVkRm91ckJ5dGVzOworICAgICAgICBtX3BDTWFwLT5tX25Db2RlUmFuZ2VzID0gblNlZ3M7CisgICAgICAgIG1fcENNYXAtPm1fcExlYWRpbmdCeXRlcyA9CisgICAgICAgICAgICBGWF9BbGxvYzJEKHVpbnQ4X3QsIG5TZWdzLCBzaXplb2YoQ01hcF9Db2RlUmFuZ2UpKTsKKyAgICAgICAgRlhTWVNfbWVtY3B5KG1fcENNYXAtPm1fcExlYWRpbmdCeXRlcywgbV9Db2RlUmFuZ2VzLkdldERhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgIG5TZWdzICogc2l6ZW9mKENNYXBfQ29kZVJhbmdlKSk7CisgICAgICB9IGVsc2UgaWYgKG5TZWdzID09IDEpIHsKKyAgICAgICAgbV9wQ01hcC0+bV9Db2RpbmdTY2hlbWUgPSAobV9Db2RlUmFuZ2VzWzBdLm1fQ2hhclNpemUgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDUERGX0NNYXA6OlR3b0J5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ1BERl9DTWFwOjpPbmVCeXRlOworICAgICAgfQorICAgICAgbV9TdGF0dXMgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBpZiAod29yZC5HZXRMZW5ndGgoKSA9PSAwIHx8IHdvcmQuR2V0QXQoMCkgIT0gJzwnKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmIChtX0NvZGVTZXEgJSAyKSB7CisgICAgICAgIENNYXBfQ29kZVJhbmdlIHJhbmdlOworICAgICAgICBpZiAoQ01hcF9HZXRDb2RlUmFuZ2UocmFuZ2UsIG1fTGFzdFdvcmQsIHdvcmQpKSB7CisgICAgICAgICAgbV9Db2RlUmFuZ2VzLkFkZChyYW5nZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG1fQ29kZVNlcSsrOworICAgIH0KKyAgfQorICBtX0xhc3RXb3JkID0gd29yZDsKK30KKworLy8gU3RhdGljLgorRlhfRFdPUkQgQ1BERl9DTWFwUGFyc2VyOjpDTWFwX0dldENvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB3b3JkKSB7CisgIGludCBudW0gPSAwOworICBpZiAod29yZC5HZXRBdCgwKSA9PSAnPCcpIHsKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IHdvcmQuR2V0TGVuZ3RoKCkgJiYgc3RkOjppc3hkaWdpdCh3b3JkLkdldEF0KGkpKTsgKytpKQorICAgICAgbnVtID0gbnVtICogMTYgKyBGWFNZU190b0hleERpZ2l0KHdvcmQuR2V0QXQoaSkpOworICAgIHJldHVybiBudW07CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IHdvcmQuR2V0TGVuZ3RoKCkgJiYgc3RkOjppc2RpZ2l0KHdvcmQuR2V0QXQoaSkpOyArK2kpCisgICAgbnVtID0gbnVtICogMTAgKyBGWFNZU190b0RlY2ltYWxEaWdpdCh3b3JkLkdldEF0KGkpKTsKKyAgcmV0dXJuIG51bTsKK30KKworLy8gU3RhdGljLgorYm9vbCBDUERGX0NNYXBQYXJzZXI6OkNNYXBfR2V0Q29kZVJhbmdlKENNYXBfQ29kZVJhbmdlJiByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc2Vjb25kKSB7CisgIGlmIChmaXJzdC5HZXRMZW5ndGgoKSA9PSAwIHx8IGZpcnN0LkdldEF0KDApICE9ICc8JykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW50IGk7CisgIGZvciAoaSA9IDE7IGkgPCBmaXJzdC5HZXRMZW5ndGgoKTsgKytpKSB7CisgICAgaWYgKGZpcnN0LkdldEF0KGkpID09ICc+JykgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJhbmdlLm1fQ2hhclNpemUgPSAoaSAtIDEpIC8gMjsKKyAgaWYgKHJhbmdlLm1fQ2hhclNpemUgPiA0KQorICAgIHJldHVybiBmYWxzZTsKKworICBmb3IgKGkgPSAwOyBpIDwgcmFuZ2UubV9DaGFyU2l6ZTsgKytpKSB7CisgICAgdWludDhfdCBkaWdpdDEgPSBmaXJzdC5HZXRBdChpICogMiArIDEpOworICAgIHVpbnQ4X3QgZGlnaXQyID0gZmlyc3QuR2V0QXQoaSAqIDIgKyAyKTsKKyAgICByYW5nZS5tX0xvd2VyW2ldID0gRlhTWVNfdG9IZXhEaWdpdChkaWdpdDEpICogMTYgKyBGWFNZU190b0hleERpZ2l0KGRpZ2l0Mik7CisgIH0KKworICBGWF9EV09SRCBzaXplID0gc2Vjb25kLkdldExlbmd0aCgpOworICBmb3IgKGkgPSAwOyBpIDwgcmFuZ2UubV9DaGFyU2l6ZTsgKytpKSB7CisgICAgdWludDhfdCBkaWdpdDEgPSAoKEZYX0RXT1JEKWkgKiAyICsgMSA8IHNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgPyBzZWNvbmQuR2V0QXQoKEZYX1NUUlNJWkUpaSAqIDIgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgIDogJzAnOworICAgIHVpbnQ4X3QgZGlnaXQyID0gKChGWF9EV09SRClpICogMiArIDIgPCBzaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgID8gc2Vjb25kLkdldEF0KChGWF9TVFJTSVpFKWkgKiAyICsgMikKKyAgICAgICAgICAgICAgICAgICAgICAgICA6ICcwJzsKKyAgICByYW5nZS5tX1VwcGVyW2ldID0gRlhTWVNfdG9IZXhEaWdpdChkaWdpdDEpICogMTYgKyBGWFNZU190b0hleERpZ2l0KGRpZ2l0Mik7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK0NQREZfQ01hcDo6Q1BERl9DTWFwKCkgeworICBtX0NoYXJzZXQgPSBDSURTRVRfVU5LTk9XTjsKKyAgbV9Db2RpbmcgPSBDSURDT0RJTkdfVU5LTk9XTjsKKyAgbV9Db2RpbmdTY2hlbWUgPSBUd29CeXRlczsKKyAgbV9iVmVydGljYWwgPSAwOworICBtX2JMb2FkZWQgPSBGQUxTRTsKKyAgbV9wTWFwcGluZyA9IE5VTEw7CisgIG1fcExlYWRpbmdCeXRlcyA9IE5VTEw7CisgIG1fcEFkZE1hcHBpbmcgPSBOVUxMOworICBtX3BFbWJlZE1hcCA9IE5VTEw7CisgIG1fcFVzZU1hcCA9IE5VTEw7CisgIG1fbkNvZGVSYW5nZXMgPSAwOworfQorQ1BERl9DTWFwOjp+Q1BERl9DTWFwKCkgeworICBGWF9GcmVlKG1fcE1hcHBpbmcpOworICBGWF9GcmVlKG1fcEFkZE1hcHBpbmcpOworICBGWF9GcmVlKG1fcExlYWRpbmdCeXRlcyk7CisgIGRlbGV0ZSBtX3BVc2VNYXA7Cit9Cit2b2lkIENQREZfQ01hcDo6UmVsZWFzZSgpIHsKKyAgaWYgKG1fUHJlZGVmaW5lZENNYXAuSXNFbXB0eSgpKSB7CisgICAgZGVsZXRlIHRoaXM7CisgIH0KK30KKworRlhfQk9PTCBDUERGX0NNYXA6OkxvYWRQcmVkZWZpbmVkKENQREZfQ01hcE1hbmFnZXIqIHBNZ3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogcE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJvbXB0Q0pLKSB7CisgIG1fUHJlZGVmaW5lZENNYXAgPSBwTmFtZTsKKyAgaWYgKG1fUHJlZGVmaW5lZENNYXAgPT0gIklkZW50aXR5LUgiIHx8IG1fUHJlZGVmaW5lZENNYXAgPT0gIklkZW50aXR5LVYiKSB7CisgICAgbV9Db2RpbmcgPSBDSURDT0RJTkdfQ0lEOworICAgIG1fYlZlcnRpY2FsID0gcE5hbWVbOV0gPT0gJ1YnOworICAgIG1fYkxvYWRlZCA9IFRSVUU7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgY21hcGlkID0gbV9QcmVkZWZpbmVkQ01hcDsKKyAgbV9iVmVydGljYWwgPSBjbWFwaWQuUmlnaHQoMSkgPT0gIlYiOworICBpZiAoY21hcGlkLkdldExlbmd0aCgpID4gMikgeworICAgIGNtYXBpZCA9IGNtYXBpZC5MZWZ0KGNtYXBpZC5HZXRMZW5ndGgoKSAtIDIpOworICB9CisgIGNvbnN0IENQREZfUHJlZGVmaW5lZENNYXAqIG1hcCA9IG51bGxwdHI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGdfUHJlZGVmaW5lZENNYXBzKTsgKytpKSB7CisgICAgaWYgKGNtYXBpZCA9PSBDRlhfQnl0ZVN0cmluZ0MoZ19QcmVkZWZpbmVkQ01hcHNbaV0ubV9wTmFtZSkpIHsKKyAgICAgIG1hcCA9ICZnX1ByZWRlZmluZWRDTWFwc1tpXTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoIW1hcCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbV9DaGFyc2V0ID0gbWFwLT5tX0NoYXJzZXQ7CisgIG1fQ29kaW5nID0gbWFwLT5tX0NvZGluZzsKKyAgbV9Db2RpbmdTY2hlbWUgPSBtYXAtPm1fQ29kaW5nU2NoZW1lOworICBpZiAobV9Db2RpbmdTY2hlbWUgPT0gTWl4ZWRUd29CeXRlcykgeworICAgIG1fcExlYWRpbmdCeXRlcyA9IEZYX0FsbG9jKHVpbnQ4X3QsIDI1Nik7CisgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG1hcC0+bV9MZWFkaW5nU2VnQ291bnQ7ICsraSkgeworICAgICAgY29uc3QgdWludDhfdCogc2VncyA9IG1hcC0+bV9MZWFkaW5nU2VnczsKKyAgICAgIGZvciAoaW50IGIgPSBzZWdzW2kgKiAyXTsgYiA8PSBzZWdzW2kgKiAyICsgMV07ICsrYikgeworICAgICAgICBtX3BMZWFkaW5nQnl0ZXNbYl0gPSAxOworICAgICAgfQorICAgIH0KKyAgfQorICBGUERGQVBJX0ZpbmRFbWJlZGRlZENNYXAocE5hbWUsIG1fQ2hhcnNldCwgbV9Db2RpbmcsIG1fcEVtYmVkTWFwKTsKKyAgaWYgKG1fcEVtYmVkTWFwKSB7CisgICAgbV9iTG9hZGVkID0gVFJVRTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIENQREZfQ01hcDo6TG9hZEVtYmVkZGVkKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplKSB7CisgIG1fcE1hcHBpbmcgPSBGWF9BbGxvYyhGWF9XT1JELCA2NTUzNik7CisgIENQREZfQ01hcFBhcnNlciBwYXJzZXI7CisgIHBhcnNlci5Jbml0aWFsaXplKHRoaXMpOworICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgocERhdGEsIHNpemUpOworICB3aGlsZSAoMSkgeworICAgIENGWF9CeXRlU3RyaW5nQyB3b3JkID0gc3ludGF4LkdldFdvcmQoKTsKKyAgICBpZiAod29yZC5Jc0VtcHR5KCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBwYXJzZXIuUGFyc2VXb3JkKHdvcmQpOworICB9CisgIGlmIChtX0NvZGluZ1NjaGVtZSA9PSBNaXhlZEZvdXJCeXRlcyAmJiBwYXJzZXIubV9BZGRNYXBzLkdldFNpemUoKSkgeworICAgIG1fcEFkZE1hcHBpbmcgPSBGWF9BbGxvYyh1aW50OF90LCBwYXJzZXIubV9BZGRNYXBzLkdldFNpemUoKSArIDQpOworICAgICooRlhfRFdPUkQqKW1fcEFkZE1hcHBpbmcgPSBwYXJzZXIubV9BZGRNYXBzLkdldFNpemUoKSAvIDg7CisgICAgRlhTWVNfbWVtY3B5KG1fcEFkZE1hcHBpbmcgKyA0LCBwYXJzZXIubV9BZGRNYXBzLkdldEJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICBwYXJzZXIubV9BZGRNYXBzLkdldFNpemUoKSk7CisgICAgRlhTWVNfcXNvcnQobV9wQWRkTWFwcGluZyArIDQsIHBhcnNlci5tX0FkZE1hcHMuR2V0U2l6ZSgpIC8gOCwgOCwKKyAgICAgICAgICAgICAgICBDb21wYXJlRFdPUkQpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitGWF9XT1JEIENQREZfQ01hcDo6Q0lERnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdCB7CisgIGlmIChtX0NvZGluZyA9PSBDSURDT0RJTkdfQ0lEKSB7CisgICAgcmV0dXJuIChGWF9XT1JEKWNoYXJjb2RlOworICB9CisgIGlmIChtX3BFbWJlZE1hcCkgeworICAgIHJldHVybiBGUERGQVBJX0NJREZyb21DaGFyQ29kZShtX3BFbWJlZE1hcCwgY2hhcmNvZGUpOworICB9CisgIGlmICghbV9wTWFwcGluZykgeworICAgIHJldHVybiAoRlhfV09SRCljaGFyY29kZTsKKyAgfQorICBpZiAoY2hhcmNvZGUgPj4gMTYpIHsKKyAgICBpZiAobV9wQWRkTWFwcGluZykgeworICAgICAgdm9pZCogZm91bmQgPSBGWFNZU19ic2VhcmNoKCZjaGFyY29kZSwgbV9wQWRkTWFwcGluZyArIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopbV9wQWRkTWFwcGluZywgOCwgQ29tcGFyZUNJRCk7CisgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgIGlmIChtX3BVc2VNYXApIHsKKyAgICAgICAgICByZXR1cm4gbV9wVXNlTWFwLT5DSURGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgcmV0dXJuIChGWF9XT1JEKSgoKEZYX0RXT1JEKilmb3VuZClbMV0gJSA2NTUzNiArIGNoYXJjb2RlIC0KKyAgICAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZm91bmQpOworICAgIH0KKyAgICBpZiAobV9wVXNlTWFwKQorICAgICAgcmV0dXJuIG1fcFVzZU1hcC0+Q0lERnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBGWF9EV09SRCBDSUQgPSBtX3BNYXBwaW5nW2NoYXJjb2RlXTsKKyAgaWYgKCFDSUQgJiYgbV9wVXNlTWFwKQorICAgIHJldHVybiBtX3BVc2VNYXAtPkNJREZyb21DaGFyQ29kZShjaGFyY29kZSk7CisgIHJldHVybiAoRlhfV09SRClDSUQ7Cit9CisKK0ZYX0RXT1JEIENQREZfQ01hcDo6R2V0TmV4dENoYXIoY29uc3QgRlhfQ0hBUiogcFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5TdHJMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgb2Zmc2V0KSBjb25zdCB7CisgIHN3aXRjaCAobV9Db2RpbmdTY2hlbWUpIHsKKyAgICBjYXNlIE9uZUJ5dGU6CisgICAgICByZXR1cm4gKCh1aW50OF90KilwU3RyaW5nKVtvZmZzZXQrK107CisgICAgY2FzZSBUd29CeXRlczoKKyAgICAgIG9mZnNldCArPSAyOworICAgICAgcmV0dXJuICgodWludDhfdCopcFN0cmluZylbb2Zmc2V0IC0gMl0gKiAyNTYgKworICAgICAgICAgICAgICgodWludDhfdCopcFN0cmluZylbb2Zmc2V0IC0gMV07CisgICAgY2FzZSBNaXhlZFR3b0J5dGVzOiB7CisgICAgICB1aW50OF90IGJ5dGUxID0gKCh1aW50OF90KilwU3RyaW5nKVtvZmZzZXQrK107CisgICAgICBpZiAoIW1fcExlYWRpbmdCeXRlc1tieXRlMV0pIHsKKyAgICAgICAgcmV0dXJuIGJ5dGUxOworICAgICAgfQorICAgICAgdWludDhfdCBieXRlMiA9ICgodWludDhfdCopcFN0cmluZylbb2Zmc2V0KytdOworICAgICAgcmV0dXJuIGJ5dGUxICogMjU2ICsgYnl0ZTI7CisgICAgfQorICAgIGNhc2UgTWl4ZWRGb3VyQnl0ZXM6IHsKKyAgICAgIHVpbnQ4X3QgY29kZXNbNF07CisgICAgICBpbnQgY2hhcl9zaXplID0gMTsKKyAgICAgIGNvZGVzWzBdID0gKCh1aW50OF90KilwU3RyaW5nKVtvZmZzZXQrK107CisgICAgICBDTWFwX0NvZGVSYW5nZSogcFJhbmdlcyA9IChDTWFwX0NvZGVSYW5nZSopbV9wTGVhZGluZ0J5dGVzOworICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaW50IHJldCA9IENoZWNrQ29kZVJhbmdlKGNvZGVzLCBjaGFyX3NpemUsIHBSYW5nZXMsIG1fbkNvZGVSYW5nZXMpOworICAgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ID09IDIpIHsKKyAgICAgICAgICBGWF9EV09SRCBjaGFyY29kZSA9IDA7CisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFyX3NpemU7IGkrKykgeworICAgICAgICAgICAgY2hhcmNvZGUgPSAoY2hhcmNvZGUgPDwgOCkgKyBjb2Rlc1tpXTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIGNoYXJjb2RlOworICAgICAgICB9CisgICAgICAgIGlmIChjaGFyX3NpemUgPT0gNCB8fCBvZmZzZXQgPT0gblN0ckxlbikgeworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGNvZGVzW2NoYXJfc2l6ZSsrXSA9ICgodWludDhfdCopcFN0cmluZylbb2Zmc2V0KytdOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQoraW50IENQREZfQ01hcDo6R2V0Q2hhclNpemUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0IHsKKyAgc3dpdGNoIChtX0NvZGluZ1NjaGVtZSkgeworICAgIGNhc2UgT25lQnl0ZToKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgVHdvQnl0ZXM6CisgICAgICByZXR1cm4gMjsKKyAgICBjYXNlIE1peGVkVHdvQnl0ZXM6CisgICAgY2FzZSBNaXhlZEZvdXJCeXRlczoKKyAgICAgIGlmIChjaGFyY29kZSA8IDB4MTAwKSB7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgaWYgKGNoYXJjb2RlIDwgMHgxMDAwMCkgeworICAgICAgICByZXR1cm4gMjsKKyAgICAgIH0KKyAgICAgIGlmIChjaGFyY29kZSA8IDB4MTAwMDAwMCkgeworICAgICAgICByZXR1cm4gMzsKKyAgICAgIH0KKyAgICAgIHJldHVybiA0OworICB9CisgIHJldHVybiAxOworfQoraW50IENQREZfQ01hcDo6Q291bnRDaGFyKGNvbnN0IEZYX0NIQVIqIHBTdHJpbmcsIGludCBzaXplKSBjb25zdCB7CisgIHN3aXRjaCAobV9Db2RpbmdTY2hlbWUpIHsKKyAgICBjYXNlIE9uZUJ5dGU6CisgICAgICByZXR1cm4gc2l6ZTsKKyAgICBjYXNlIFR3b0J5dGVzOgorICAgICAgcmV0dXJuIChzaXplICsgMSkgLyAyOworICAgIGNhc2UgTWl4ZWRUd29CeXRlczogeworICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGNvdW50Kys7CisgICAgICAgIGlmIChtX3BMZWFkaW5nQnl0ZXNbKCh1aW50OF90KilwU3RyaW5nKVtpXV0pIHsKKyAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CisgICAgY2FzZSBNaXhlZEZvdXJCeXRlczogeworICAgICAgaW50IGNvdW50ID0gMCwgb2Zmc2V0ID0gMDsKKyAgICAgIHdoaWxlIChvZmZzZXQgPCBzaXplKSB7CisgICAgICAgIEdldE5leHRDaGFyKHBTdHJpbmcsIHNpemUsIG9mZnNldCk7CisgICAgICAgIGNvdW50Kys7CisgICAgICB9CisgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorICB9CisgIHJldHVybiBzaXplOworfQorCitpbnQgQ1BERl9DTWFwOjpBcHBlbmRDaGFyKEZYX0NIQVIqIHN0ciwgRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0IHsKKyAgc3dpdGNoIChtX0NvZGluZ1NjaGVtZSkgeworICAgIGNhc2UgT25lQnl0ZToKKyAgICAgIHN0clswXSA9ICh1aW50OF90KWNoYXJjb2RlOworICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBUd29CeXRlczoKKyAgICAgIHN0clswXSA9ICh1aW50OF90KShjaGFyY29kZSAvIDI1Nik7CisgICAgICBzdHJbMV0gPSAodWludDhfdCkoY2hhcmNvZGUgJSAyNTYpOworICAgICAgcmV0dXJuIDI7CisgICAgY2FzZSBNaXhlZFR3b0J5dGVzOgorICAgIGNhc2UgTWl4ZWRGb3VyQnl0ZXM6CisgICAgICBpZiAoY2hhcmNvZGUgPCAweDEwMCkgeworICAgICAgICBDTWFwX0NvZGVSYW5nZSogcFJhbmdlcyA9IChDTWFwX0NvZGVSYW5nZSopbV9wTGVhZGluZ0J5dGVzOworICAgICAgICBpbnQgaVNpemUgPSBHZXRDaGFyU2l6ZUltcGwoY2hhcmNvZGUsIHBSYW5nZXMsIG1fbkNvZGVSYW5nZXMpOworICAgICAgICBpZiAoaVNpemUgPT0gMCkgeworICAgICAgICAgIGlTaXplID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaVNpemUgPiAxKSB7CisgICAgICAgICAgRlhTWVNfbWVtc2V0KHN0ciwgMCwgc2l6ZW9mKHVpbnQ4X3QpICogaVNpemUpOworICAgICAgICB9CisgICAgICAgIHN0cltpU2l6ZSAtIDFdID0gKHVpbnQ4X3QpY2hhcmNvZGU7CisgICAgICAgIHJldHVybiBpU2l6ZTsKKyAgICAgIH0KKyAgICAgIGlmIChjaGFyY29kZSA8IDB4MTAwMDApIHsKKyAgICAgICAgc3RyWzBdID0gKHVpbnQ4X3QpKGNoYXJjb2RlID4+IDgpOworICAgICAgICBzdHJbMV0gPSAodWludDhfdCljaGFyY29kZTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgICB9CisgICAgICBpZiAoY2hhcmNvZGUgPCAweDEwMDAwMDApIHsKKyAgICAgICAgc3RyWzBdID0gKHVpbnQ4X3QpKGNoYXJjb2RlID4+IDE2KTsKKyAgICAgICAgc3RyWzFdID0gKHVpbnQ4X3QpKGNoYXJjb2RlID4+IDgpOworICAgICAgICBzdHJbMl0gPSAodWludDhfdCljaGFyY29kZTsKKyAgICAgICAgcmV0dXJuIDM7CisgICAgICB9CisgICAgICBzdHJbMF0gPSAodWludDhfdCkoY2hhcmNvZGUgPj4gMjQpOworICAgICAgc3RyWzFdID0gKHVpbnQ4X3QpKGNoYXJjb2RlID4+IDE2KTsKKyAgICAgIHN0clsyXSA9ICh1aW50OF90KShjaGFyY29kZSA+PiA4KTsKKyAgICAgIHN0clszXSA9ICh1aW50OF90KWNoYXJjb2RlOworICAgICAgcmV0dXJuIDQ7CisgIH0KKyAgcmV0dXJuIDA7Cit9CitDUERGX0NJRDJVbmljb2RlTWFwOjpDUERGX0NJRDJVbmljb2RlTWFwKCkgeworICBtX0VtYmVkZGVkQ291bnQgPSAwOworfQorQ1BERl9DSUQyVW5pY29kZU1hcDo6fkNQREZfQ0lEMlVuaWNvZGVNYXAoKSB7fQorRlhfQk9PTCBDUERGX0NJRDJVbmljb2RlTWFwOjpJbml0aWFsaXplKCkgeworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9DSUQyVW5pY29kZU1hcDo6SXNMb2FkZWQoKSB7CisgIHJldHVybiBtX0VtYmVkZGVkQ291bnQgIT0gMDsKK30KK0ZYX1dDSEFSIENQREZfQ0lEMlVuaWNvZGVNYXA6OlVuaWNvZGVGcm9tQ0lEKEZYX1dPUkQgQ0lEKSB7CisgIGlmIChtX0NoYXJzZXQgPT0gQ0lEU0VUX1VOSUNPREUpIHsKKyAgICByZXR1cm4gQ0lEOworICB9CisgIGlmIChDSUQgPCBtX0VtYmVkZGVkQ291bnQpIHsKKyAgICByZXR1cm4gbV9wRW1iZWRkZWRNYXBbQ0lEXTsKKyAgfQorICByZXR1cm4gMDsKK30KKwordm9pZCBDUERGX0NJRDJVbmljb2RlTWFwOjpMb2FkKENQREZfQ01hcE1hbmFnZXIqIHBNZ3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0lEU2V0IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJvbXB0Q0pLKSB7CisgIG1fQ2hhcnNldCA9IGNoYXJzZXQ7CisgIEZQREZBUElfTG9hZENJRDJVbmljb2RlTWFwKGNoYXJzZXQsIG1fcEVtYmVkZGVkTWFwLCBtX0VtYmVkZGVkQ291bnQpOworfQorCisjaW5jbHVkZSAidHRnc3VidGFibGUuaCIKK0NQREZfQ0lERm9udDo6Q1BERl9DSURGb250KCkgOiBDUERGX0ZvbnQoUERGRk9OVF9DSURGT05UKSB7CisgIG1fcENNYXAgPSBOVUxMOworICBtX3BBbGxvY2F0ZWRDTWFwID0gTlVMTDsKKyAgbV9wQ0lEMlVuaWNvZGVNYXAgPSBOVUxMOworICBtX3BBbnNpV2lkdGhzID0gTlVMTDsKKyAgbV9wQ0lEVG9HSURNYXAgPSBOVUxMOworICBtX2JDSURJc0dJRCA9IEZBTFNFOworICBtX2JBZG9iZUNvdXJpZXJTdGQgPSBGQUxTRTsKKyAgbV9wVFRHU1VCVGFibGUgPSBOVUxMOworICBGWFNZU19tZW1zZXQobV9DaGFyQkJveCwgMHhmZiwgMjU2ICogc2l6ZW9mKEZYX1NNQUxMX1JFQ1QpKTsKK30KK0NQREZfQ0lERm9udDo6fkNQREZfQ0lERm9udCgpIHsKKyAgaWYgKG1fcEFuc2lXaWR0aHMpIHsKKyAgICBGWF9GcmVlKG1fcEFuc2lXaWR0aHMpOworICB9CisgIGRlbGV0ZSBtX3BBbGxvY2F0ZWRDTWFwOworICBkZWxldGUgbV9wQ0lEVG9HSURNYXA7CisgIGRlbGV0ZSBtX3BUVEdTVUJUYWJsZTsKK30KK0ZYX1dPUkQgQ1BERl9DSURGb250OjpDSURGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0IHsKKyAgaWYgKCFtX3BDTWFwKSB7CisgICAgcmV0dXJuIChGWF9XT1JEKWNoYXJjb2RlOworICB9CisgIHJldHVybiBtX3BDTWFwLT5DSURGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOworfQorRlhfQk9PTCBDUERGX0NJREZvbnQ6OklzVmVydFdyaXRpbmcoKSBjb25zdCB7CisgIHJldHVybiBtX3BDTWFwID8gbV9wQ01hcC0+SXNWZXJ0V3JpdGluZygpIDogRkFMU0U7Cit9CisKK0ZYX1dDSEFSIENQREZfQ0lERm9udDo6X1VuaWNvZGVGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0IHsKKyAgc3dpdGNoIChtX3BDTWFwLT5tX0NvZGluZykgeworICAgIGNhc2UgQ0lEQ09ESU5HX1VDUzI6CisgICAgY2FzZSBDSURDT0RJTkdfVVRGMTY6CisgICAgICByZXR1cm4gKEZYX1dDSEFSKWNoYXJjb2RlOworICAgIGNhc2UgQ0lEQ09ESU5HX0NJRDoKKyAgICAgIGlmICghbV9wQ0lEMlVuaWNvZGVNYXAgfHwgIW1fcENJRDJVbmljb2RlTWFwLT5Jc0xvYWRlZCgpKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgcmV0dXJuIG1fcENJRDJVbmljb2RlTWFwLT5Vbmljb2RlRnJvbUNJRCgoRlhfV09SRCljaGFyY29kZSk7CisgIH0KKyAgaWYgKCFtX3BDTWFwLT5Jc0xvYWRlZCgpIHx8ICFtX3BDSUQyVW5pY29kZU1hcCB8fAorICAgICAgIW1fcENJRDJVbmljb2RlTWFwLT5Jc0xvYWRlZCgpKSB7CisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXworICAgIEZYX1dDSEFSIHVuaWNvZGU7CisgICAgaW50IGNoYXJzaXplID0gMTsKKyAgICBpZiAoY2hhcmNvZGUgPiAyNTUpIHsKKyAgICAgIGNoYXJjb2RlID0gKGNoYXJjb2RlICUgMjU2KSAqIDI1NiArIChjaGFyY29kZSAvIDI1Nik7CisgICAgICBjaGFyc2l6ZSA9IDI7CisgICAgfQorICAgIGludCByZXQgPSBGWFNZU19NdWx0aUJ5dGVUb1dpZGVDaGFyKGdfQ2hhcnNldENQc1ttX3BDTWFwLT5tX0NvZGluZ10sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IEZYX0NIQVIqKSZjaGFyY29kZSwgY2hhcnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVuaWNvZGUsIDEpOworICAgIGlmIChyZXQgIT0gMSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiB1bmljb2RlOworI2VuZGlmCisgICAgaWYgKG1fcENNYXAtPm1fcEVtYmVkTWFwKSB7CisgICAgICByZXR1cm4gRW1iZWRkZWRVbmljb2RlRnJvbUNoYXJjb2RlKG1fcENNYXAtPm1fcEVtYmVkTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDTWFwLT5tX0NoYXJzZXQsIGNoYXJjb2RlKTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIG1fcENJRDJVbmljb2RlTWFwLT5Vbmljb2RlRnJvbUNJRChDSURGcm9tQ2hhckNvZGUoY2hhcmNvZGUpKTsKK30KK0ZYX0RXT1JEIENQREZfQ0lERm9udDo6X0NoYXJDb2RlRnJvbVVuaWNvZGUoRlhfV0NIQVIgdW5pY29kZSkgY29uc3QgeworICBzd2l0Y2ggKG1fcENNYXAtPm1fQ29kaW5nKSB7CisgICAgY2FzZSBDSURDT0RJTkdfVU5LTk9XTjoKKyAgICAgIHJldHVybiAwOworICAgIGNhc2UgQ0lEQ09ESU5HX1VDUzI6CisgICAgY2FzZSBDSURDT0RJTkdfVVRGMTY6CisgICAgICByZXR1cm4gdW5pY29kZTsKKyAgICBjYXNlIENJRENPRElOR19DSUQ6IHsKKyAgICAgIGlmICghbV9wQ0lEMlVuaWNvZGVNYXAgfHwgIW1fcENJRDJVbmljb2RlTWFwLT5Jc0xvYWRlZCgpKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgRlhfRFdPUkQgQ0lEID0gMDsKKyAgICAgIHdoaWxlIChDSUQgPCA2NTUzNikgeworICAgICAgICBGWF9XQ0hBUiB0aGlzX3VuaWNvZGUgPSBtX3BDSUQyVW5pY29kZU1hcC0+VW5pY29kZUZyb21DSUQoKEZYX1dPUkQpQ0lEKTsKKyAgICAgICAgaWYgKHRoaXNfdW5pY29kZSA9PSB1bmljb2RlKSB7CisgICAgICAgICAgcmV0dXJuIENJRDsKKyAgICAgICAgfQorICAgICAgICBDSUQrKzsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmICh1bmljb2RlIDwgMHg4MCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxGWF9EV09SRD4odW5pY29kZSk7CisgIH0KKyAgaWYgKG1fcENNYXAtPm1fQ29kaW5nID09IENJRENPRElOR19DSUQpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyAgdWludDhfdCBidWZmZXJbMzJdOworICBpbnQgcmV0ID0KKyAgICAgIEZYU1lTX1dpZGVDaGFyVG9NdWx0aUJ5dGUoZ19DaGFyc2V0Q1BzW21fcENNYXAtPm1fQ29kaW5nXSwgMCwgJnVuaWNvZGUsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKilidWZmZXIsIDQsIE5VTEwsIE5VTEwpOworICBpZiAocmV0ID09IDEpIHsKKyAgICByZXR1cm4gYnVmZmVyWzBdOworICB9CisgIGlmIChyZXQgPT0gMikgeworICAgIHJldHVybiBidWZmZXJbMF0gKiAyNTYgKyBidWZmZXJbMV07CisgIH0KKyNlbHNlCisgIGlmIChtX3BDTWFwLT5tX3BFbWJlZE1hcCkgeworICAgIHJldHVybiBFbWJlZGRlZENoYXJjb2RlRnJvbVVuaWNvZGUobV9wQ01hcC0+bV9wRW1iZWRNYXAsIG1fcENNYXAtPm1fQ2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGUpOworICB9CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisKK0ZYX0JPT0wgQ1BERl9DSURGb250OjpfTG9hZCgpIHsKKyAgaWYgKG1fcEZvbnREaWN0LT5HZXRTdHJpbmcoIlN1YnR5cGUiKSA9PSAiVHJ1ZVR5cGUiKSB7CisgICAgcmV0dXJuIExvYWRHQjIzMTIoKTsKKyAgfQorICBDUERGX0FycmF5KiBwRm9udHMgPSBtX3BGb250RGljdC0+R2V0QXJyYXkoIkRlc2NlbmRhbnRGb250cyIpOworICBpZiAoIXBGb250cykgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAocEZvbnRzLT5HZXRDb3VudCgpICE9IDEpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQ0lERm9udERpY3QgPSBwRm9udHMtPkdldERpY3QoMCk7CisgIGlmICghcENJREZvbnREaWN0KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fQmFzZUZvbnQgPSBwQ0lERm9udERpY3QtPkdldFN0cmluZygiQmFzZUZvbnQiKTsKKyAgaWYgKChtX0Jhc2VGb250LkNvbXBhcmUoIkNvdXJpZXJTdGQiKSA9PSAwIHx8CisgICAgICAgbV9CYXNlRm9udC5Db21wYXJlKCJDb3VyaWVyU3RkLUJvbGQiKSA9PSAwIHx8CisgICAgICAgbV9CYXNlRm9udC5Db21wYXJlKCJDb3VyaWVyU3RkLUJvbGRPYmxpcXVlIikgPT0gMCB8fAorICAgICAgIG1fQmFzZUZvbnQuQ29tcGFyZSgiQ291cmllclN0ZC1PYmxpcXVlIikgPT0gMCkgJiYKKyAgICAgICFJc0VtYmVkZGVkKCkpIHsKKyAgICBtX2JBZG9iZUNvdXJpZXJTdGQgPSBUUlVFOworICB9CisgIENQREZfRGljdGlvbmFyeSogcEZvbnREZXNjID0gcENJREZvbnREaWN0LT5HZXREaWN0KCJGb250RGVzY3JpcHRvciIpOworICBpZiAocEZvbnREZXNjKSB7CisgICAgTG9hZEZvbnREZXNjcmlwdG9yKHBGb250RGVzYyk7CisgIH0KKyAgQ1BERl9PYmplY3QqIHBFbmNvZGluZyA9IG1fcEZvbnREaWN0LT5HZXRFbGVtZW50VmFsdWUoIkVuY29kaW5nIik7CisgIGlmICghcEVuY29kaW5nKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENGWF9CeXRlU3RyaW5nIHN1YnR5cGUgPSBwQ0lERm9udERpY3QtPkdldFN0cmluZygiU3VidHlwZSIpOworICBtX2JUeXBlMSA9IChzdWJ0eXBlID09ICJDSURGb250VHlwZTAiKTsKKworICBpZiAocEVuY29kaW5nLT5Jc05hbWUoKSkgeworICAgIENGWF9CeXRlU3RyaW5nIGNtYXAgPSBwRW5jb2RpbmctPkdldFN0cmluZygpOworICAgIG1fcENNYXAgPQorICAgICAgICBDUERGX01vZHVsZU1ncjo6R2V0KCkKKyAgICAgICAgICAgIC0+R2V0UGFnZU1vZHVsZSgpCisgICAgICAgICAgICAtPkdldEZvbnRHbG9iYWxzKCkKKyAgICAgICAgICAgIC0+bV9DTWFwTWFuYWdlci5HZXRQcmVkZWZpbmVkQ01hcChjbWFwLCBtX3BGb250RmlsZSAmJiBtX2JUeXBlMSk7CisgIH0gZWxzZSBpZiAoQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwRW5jb2RpbmctPkFzU3RyZWFtKCkpIHsKKyAgICBtX3BBbGxvY2F0ZWRDTWFwID0gbV9wQ01hcCA9IG5ldyBDUERGX0NNYXA7CisgICAgQ1BERl9TdHJlYW1BY2MgYWNjOworICAgIGFjYy5Mb2FkQWxsRGF0YShwU3RyZWFtLCBGQUxTRSk7CisgICAgbV9wQ01hcC0+TG9hZEVtYmVkZGVkKGFjYy5HZXREYXRhKCksIGFjYy5HZXRTaXplKCkpOworICB9IGVsc2UgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoIW1fcENNYXApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9DaGFyc2V0ID0gbV9wQ01hcC0+bV9DaGFyc2V0OworICBpZiAobV9DaGFyc2V0ID09IENJRFNFVF9VTktOT1dOKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQ0lESW5mbyA9IHBDSURGb250RGljdC0+R2V0RGljdCgiQ0lEU3lzdGVtSW5mbyIpOworICAgIGlmIChwQ0lESW5mbykgeworICAgICAgbV9DaGFyc2V0ID0gQ2hhcnNldEZyb21PcmRlcmluZyhwQ0lESW5mby0+R2V0U3RyaW5nKCJPcmRlcmluZyIpKTsKKyAgICB9CisgIH0KKyAgaWYgKG1fQ2hhcnNldCAhPSBDSURTRVRfVU5LTk9XTikKKyAgICBtX3BDSUQyVW5pY29kZU1hcCA9CisgICAgICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKQorICAgICAgICAgICAgLT5HZXRQYWdlTW9kdWxlKCkKKyAgICAgICAgICAgIC0+R2V0Rm9udEdsb2JhbHMoKQorICAgICAgICAgICAgLT5tX0NNYXBNYW5hZ2VyLkdldENJRDJVbmljb2RlTWFwKAorICAgICAgICAgICAgICAgIG1fQ2hhcnNldCwKKyAgICAgICAgICAgICAgICAhbV9wRm9udEZpbGUgJiYgKG1fcENNYXAtPm1fQ29kaW5nID09IENJRENPRElOR19DSUQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDSURGb250RGljdC0+S2V5RXhpc3QoIlciKSkpOworICBpZiAobV9Gb250LkdldEZhY2UoKSkgeworICAgIGlmIChtX2JUeXBlMSkgeworICAgICAgRlhGVF9TZWxlY3RfQ2hhcm1hcChtX0ZvbnQuR2V0RmFjZSgpLCBGWEZUX0VOQ09ESU5HX1VOSUNPREUpOworICAgIH0gZWxzZSB7CisgICAgICBGVF9Vc2VDSURDaGFybWFwKG1fRm9udC5HZXRGYWNlKCksIG1fcENNYXAtPm1fQ29kaW5nKTsKKyAgICB9CisgIH0KKyAgbV9EZWZhdWx0V2lkdGggPSBwQ0lERm9udERpY3QtPkdldEludGVnZXIoIkRXIiwgMTAwMCk7CisgIENQREZfQXJyYXkqIHBXaWR0aEFycmF5ID0gcENJREZvbnREaWN0LT5HZXRBcnJheSgiVyIpOworICBpZiAocFdpZHRoQXJyYXkpIHsKKyAgICBMb2FkTWV0cmljc0FycmF5KHBXaWR0aEFycmF5LCBtX1dpZHRoTGlzdCwgMSk7CisgIH0KKyAgaWYgKCFJc0VtYmVkZGVkKCkpIHsKKyAgICBMb2FkU3Vic3RGb250KCk7CisgIH0KKyAgaWYgKDEpIHsKKyAgICBpZiAobV9wRm9udEZpbGUgfHwgKEdldFN1YnN0Rm9udCgpLT5tX1N1YnN0RmxhZ3MgJiBGWEZPTlRfU1VCU1RfRVhBQ1QpKSB7CisgICAgICBDUERGX09iamVjdCogcG1hcCA9IHBDSURGb250RGljdC0+R2V0RWxlbWVudFZhbHVlKCJDSURUb0dJRE1hcCIpOworICAgICAgaWYgKHBtYXApIHsKKyAgICAgICAgaWYgKENQREZfU3RyZWFtKiBwU3RyZWFtID0gcG1hcC0+QXNTdHJlYW0oKSkgeworICAgICAgICAgIG1fcENJRFRvR0lETWFwID0gbmV3IENQREZfU3RyZWFtQWNjOworICAgICAgICAgIG1fcENJRFRvR0lETWFwLT5Mb2FkQWxsRGF0YShwU3RyZWFtLCBGQUxTRSk7CisgICAgICAgIH0gZWxzZSBpZiAocG1hcC0+R2V0U3RyaW5nKCkgPT0gIklkZW50aXR5IikgeworI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisgICAgICAgICAgaWYgKG1fcEZvbnRGaWxlKSB7CisgICAgICAgICAgICBtX2JDSURJc0dJRCA9IFRSVUU7CisgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICBtX2JDSURJc0dJRCA9IFRSVUU7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBDaGVja0ZvbnRNZXRyaWNzKCk7CisgIGlmIChJc1ZlcnRXcml0aW5nKCkpIHsKKyAgICBwV2lkdGhBcnJheSA9IHBDSURGb250RGljdC0+R2V0QXJyYXkoIlcyIik7CisgICAgaWYgKHBXaWR0aEFycmF5KSB7CisgICAgICBMb2FkTWV0cmljc0FycmF5KHBXaWR0aEFycmF5LCBtX1ZlcnRNZXRyaWNzLCAzKTsKKyAgICB9CisgICAgQ1BERl9BcnJheSogcERlZmF1bHRBcnJheSA9IHBDSURGb250RGljdC0+R2V0QXJyYXkoIkRXMiIpOworICAgIGlmIChwRGVmYXVsdEFycmF5KSB7CisgICAgICBtX0RlZmF1bHRWWSA9IHBEZWZhdWx0QXJyYXktPkdldEludGVnZXIoMCk7CisgICAgICBtX0RlZmF1bHRXMSA9IHBEZWZhdWx0QXJyYXktPkdldEludGVnZXIoMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fRGVmYXVsdFZZID0gODgwOworICAgICAgbV9EZWZhdWx0VzEgPSAtMTAwMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQgQ1BERl9DSURGb250OjpHZXRDaGFyQkJveChGWF9EV09SRCBjaGFyY29kZSwgRlhfUkVDVCYgcmVjdCwgaW50IGxldmVsKSB7CisgIGlmIChjaGFyY29kZSA8IDI1NiAmJiBtX0NoYXJCQm94W2NoYXJjb2RlXS5SaWdodCAhPSAtMSkgeworICAgIHJlY3QuYm90dG9tID0gbV9DaGFyQkJveFtjaGFyY29kZV0uQm90dG9tOworICAgIHJlY3QubGVmdCA9IG1fQ2hhckJCb3hbY2hhcmNvZGVdLkxlZnQ7CisgICAgcmVjdC5yaWdodCA9IG1fQ2hhckJCb3hbY2hhcmNvZGVdLlJpZ2h0OworICAgIHJlY3QudG9wID0gbV9DaGFyQkJveFtjaGFyY29kZV0uVG9wOworICAgIHJldHVybjsKKyAgfQorICBGWF9CT09MIGJWZXJ0ID0gRkFMU0U7CisgIGludCBnbHlwaF9pbmRleCA9IEdseXBoRnJvbUNoYXJDb2RlKGNoYXJjb2RlLCAmYlZlcnQpOworICBGWEZUX0ZhY2UgZmFjZSA9IG1fRm9udC5HZXRGYWNlKCk7CisgIGlmIChmYWNlKSB7CisgICAgcmVjdC5sZWZ0ID0gcmVjdC5ib3R0b20gPSByZWN0LnJpZ2h0ID0gcmVjdC50b3AgPSAwOworICAgIGlmIChGWEZUX0lzX0ZhY2VfVHJpY2t5KGZhY2UpKSB7CisgICAgICBpbnQgZXJyID0gRlhGVF9Mb2FkX0dseXBoKGZhY2UsIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKTsKKyAgICAgIGlmICghZXJyKSB7CisgICAgICAgIEZYRlRfQkJveCBjYm94OworICAgICAgICBGWEZUX0dseXBoIGdseXBoOworICAgICAgICBlcnIgPSBGWEZUX0dldF9HbHlwaCgoKEZYRlRfRmFjZSlmYWNlKS0+Z2x5cGgsICZnbHlwaCk7CisgICAgICAgIGlmICghZXJyKSB7CisgICAgICAgICAgRlhGVF9HbHlwaF9HZXRfQ0JveChnbHlwaCwgRlhGVF9HTFlQSF9CQk9YX1BJWEVMUywgJmNib3gpOworICAgICAgICAgIGludCBwaXhlbF9zaXplX3ggPSAoKEZYRlRfRmFjZSlmYWNlKS0+c2l6ZS0+bWV0cmljcy54X3BwZW07CisgICAgICAgICAgaW50IHBpeGVsX3NpemVfeSA9ICgoRlhGVF9GYWNlKWZhY2UpLT5zaXplLT5tZXRyaWNzLnlfcHBlbTsKKyAgICAgICAgICBpZiAocGl4ZWxfc2l6ZV94ID09IDAgfHwgcGl4ZWxfc2l6ZV95ID09IDApIHsKKyAgICAgICAgICAgIHJlY3QubGVmdCA9IGNib3gueE1pbjsKKyAgICAgICAgICAgIHJlY3QucmlnaHQgPSBjYm94LnhNYXg7CisgICAgICAgICAgICByZWN0LnRvcCA9IGNib3gueU1heDsKKyAgICAgICAgICAgIHJlY3QuYm90dG9tID0gY2JveC55TWluOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWN0LmxlZnQgPSBjYm94LnhNaW4gKiAxMDAwIC8gcGl4ZWxfc2l6ZV94OworICAgICAgICAgICAgcmVjdC5yaWdodCA9IGNib3gueE1heCAqIDEwMDAgLyBwaXhlbF9zaXplX3g7CisgICAgICAgICAgICByZWN0LnRvcCA9IGNib3gueU1heCAqIDEwMDAgLyBwaXhlbF9zaXplX3k7CisgICAgICAgICAgICByZWN0LmJvdHRvbSA9IGNib3gueU1pbiAqIDEwMDAgLyBwaXhlbF9zaXplX3k7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChyZWN0LnRvcCA+IEZYRlRfR2V0X0ZhY2VfQXNjZW5kZXIoZmFjZSkpIHsKKyAgICAgICAgICAgIHJlY3QudG9wID0gRlhGVF9HZXRfRmFjZV9Bc2NlbmRlcihmYWNlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHJlY3QuYm90dG9tIDwgRlhGVF9HZXRfRmFjZV9EZXNjZW5kZXIoZmFjZSkpIHsKKyAgICAgICAgICAgIHJlY3QuYm90dG9tID0gRlhGVF9HZXRfRmFjZV9EZXNjZW5kZXIoZmFjZSk7CisgICAgICAgICAgfQorICAgICAgICAgIEZYRlRfRG9uZV9HbHlwaChnbHlwaCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaW50IGVyciA9IEZYRlRfTG9hZF9HbHlwaChmYWNlLCBnbHlwaF9pbmRleCwgRlhGVF9MT0FEX05PX1NDQUxFKTsKKyAgICAgIGlmIChlcnIgPT0gMCkgeworICAgICAgICByZWN0LmxlZnQgPSBUVDJQREYoRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdYKGZhY2UpLCBmYWNlKTsKKyAgICAgICAgcmVjdC5yaWdodCA9IFRUMlBERigKKyAgICAgICAgICAgIEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWChmYWNlKSArIEZYRlRfR2V0X0dseXBoX1dpZHRoKGZhY2UpLAorICAgICAgICAgICAgZmFjZSk7CisgICAgICAgIHJlY3QudG9wID0gVFQyUERGKEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWShmYWNlKSwgZmFjZSk7CisgICAgICAgIHJlY3QudG9wICs9IHJlY3QudG9wIC8gNjQ7CisgICAgICAgIHJlY3QuYm90dG9tID0gVFQyUERGKAorICAgICAgICAgICAgRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdZKGZhY2UpIC0gRlhGVF9HZXRfR2x5cGhfSGVpZ2h0KGZhY2UpLAorICAgICAgICAgICAgZmFjZSk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIHJlY3QgPSBGWF9SRUNUKDAsIDAsIDAsIDApOworICB9CisgIGlmICghbV9wRm9udEZpbGUgJiYgbV9DaGFyc2V0ID09IENJRFNFVF9KQVBBTjEpIHsKKyAgICBGWF9XT1JEIENJRCA9IENJREZyb21DaGFyQ29kZShjaGFyY29kZSk7CisgICAgY29uc3QgdWludDhfdCogcFRyYW5zZm9ybSA9IEdldENJRFRyYW5zZm9ybShDSUQpOworICAgIGlmIChwVHJhbnNmb3JtICYmICFiVmVydCkgeworICAgICAgQ0ZYX01hdHJpeCBtYXRyaXgoQ0lEVHJhbnNmb3JtVG9GbG9hdChwVHJhbnNmb3JtWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICBDSURUcmFuc2Zvcm1Ub0Zsb2F0KHBUcmFuc2Zvcm1bMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0lEVHJhbnNmb3JtVG9GbG9hdChwVHJhbnNmb3JtWzNdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVs0XSkgKiAxMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0lEVHJhbnNmb3JtVG9GbG9hdChwVHJhbnNmb3JtWzVdKSAqIDEwMDApOworICAgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0X2YocmVjdCk7CisgICAgICByZWN0X2YuVHJhbnNmb3JtKCZtYXRyaXgpOworICAgICAgcmVjdCA9IHJlY3RfZi5HZXRPdXR0ZXJSZWN0KCk7CisgICAgfQorICB9CisgIGlmIChjaGFyY29kZSA8IDI1NikgeworICAgIG1fQ2hhckJCb3hbY2hhcmNvZGVdLkJvdHRvbSA9IChzaG9ydClyZWN0LmJvdHRvbTsKKyAgICBtX0NoYXJCQm94W2NoYXJjb2RlXS5MZWZ0ID0gKHNob3J0KXJlY3QubGVmdDsKKyAgICBtX0NoYXJCQm94W2NoYXJjb2RlXS5SaWdodCA9IChzaG9ydClyZWN0LnJpZ2h0OworICAgIG1fQ2hhckJCb3hbY2hhcmNvZGVdLlRvcCA9IChzaG9ydClyZWN0LnRvcDsKKyAgfQorfQoraW50IENQREZfQ0lERm9udDo6R2V0Q2hhcldpZHRoRihGWF9EV09SRCBjaGFyY29kZSwgaW50IGxldmVsKSB7CisgIGlmIChtX3BBbnNpV2lkdGhzICYmIGNoYXJjb2RlIDwgMHg4MCkgeworICAgIHJldHVybiBtX3BBbnNpV2lkdGhzW2NoYXJjb2RlXTsKKyAgfQorICBGWF9XT1JEIGNpZCA9IENJREZyb21DaGFyQ29kZShjaGFyY29kZSk7CisgIGludCBzaXplID0gbV9XaWR0aExpc3QuR2V0U2l6ZSgpOworICBGWF9EV09SRCogbGlzdCA9IG1fV2lkdGhMaXN0LkdldERhdGEoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpICs9IDMpIHsKKyAgICBpZiAoY2lkID49IGxpc3RbaV0gJiYgY2lkIDw9IGxpc3RbaSArIDFdKSB7CisgICAgICByZXR1cm4gKGludClsaXN0W2kgKyAyXTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG1fRGVmYXVsdFdpZHRoOworfQorc2hvcnQgQ1BERl9DSURGb250OjpHZXRWZXJ0V2lkdGgoRlhfV09SRCBDSUQpIGNvbnN0IHsKKyAgRlhfRFdPUkQgdmVydHNpemUgPSBtX1ZlcnRNZXRyaWNzLkdldFNpemUoKSAvIDU7CisgIGlmICh2ZXJ0c2l6ZSA9PSAwKSB7CisgICAgcmV0dXJuIG1fRGVmYXVsdFcxOworICB9CisgIGNvbnN0IEZYX0RXT1JEKiBwVGFibGUgPSBtX1ZlcnRNZXRyaWNzLkdldERhdGEoKTsKKyAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHZlcnRzaXplOyBpKyspCisgICAgaWYgKHBUYWJsZVtpICogNV0gPD0gQ0lEICYmIHBUYWJsZVtpICogNSArIDFdID49IENJRCkgeworICAgICAgcmV0dXJuIChzaG9ydCkoaW50KXBUYWJsZVtpICogNSArIDJdOworICAgIH0KKyAgcmV0dXJuIG1fRGVmYXVsdFcxOworfQordm9pZCBDUERGX0NJREZvbnQ6OkdldFZlcnRPcmlnaW4oRlhfV09SRCBDSUQsIHNob3J0JiB2eCwgc2hvcnQmIHZ5KSBjb25zdCB7CisgIEZYX0RXT1JEIHZlcnRzaXplID0gbV9WZXJ0TWV0cmljcy5HZXRTaXplKCkgLyA1OworICBpZiAodmVydHNpemUpIHsKKyAgICBjb25zdCBGWF9EV09SRCogcFRhYmxlID0gbV9WZXJ0TWV0cmljcy5HZXREYXRhKCk7CisgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHZlcnRzaXplOyBpKyspCisgICAgICBpZiAocFRhYmxlW2kgKiA1XSA8PSBDSUQgJiYgcFRhYmxlW2kgKiA1ICsgMV0gPj0gQ0lEKSB7CisgICAgICAgIHZ4ID0gKHNob3J0KShpbnQpcFRhYmxlW2kgKiA1ICsgM107CisgICAgICAgIHZ5ID0gKHNob3J0KShpbnQpcFRhYmxlW2kgKiA1ICsgNF07CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgfQorICBGWF9EV09SRCBkd1dpZHRoID0gbV9EZWZhdWx0V2lkdGg7CisgIGludCBzaXplID0gbV9XaWR0aExpc3QuR2V0U2l6ZSgpOworICBjb25zdCBGWF9EV09SRCogbGlzdCA9IG1fV2lkdGhMaXN0LkdldERhdGEoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpICs9IDMpIHsKKyAgICBpZiAoQ0lEID49IGxpc3RbaV0gJiYgQ0lEIDw9IGxpc3RbaSArIDFdKSB7CisgICAgICBkd1dpZHRoID0gKEZYX1dPUkQpbGlzdFtpICsgMl07CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgdnggPSAoc2hvcnQpZHdXaWR0aCAvIDI7CisgIHZ5ID0gKHNob3J0KW1fRGVmYXVsdFZZOworfQoraW50IENQREZfQ0lERm9udDo6R2V0R2x5cGhJbmRleChGWF9EV09SRCB1bmljb2RlLCBGWF9CT09MKiBwVmVydEdseXBoKSB7CisgIGlmIChwVmVydEdseXBoKSB7CisgICAgKnBWZXJ0R2x5cGggPSBGQUxTRTsKKyAgfQorICBGWEZUX0ZhY2UgZmFjZSA9IG1fRm9udC5HZXRGYWNlKCk7CisgIGludCBpbmRleCA9IEZYRlRfR2V0X0NoYXJfSW5kZXgoZmFjZSwgdW5pY29kZSk7CisgIGlmICh1bmljb2RlID09IDB4MjUwMikgeworICAgIHJldHVybiBpbmRleDsKKyAgfQorICBpZiAoaW5kZXggJiYgSXNWZXJ0V3JpdGluZygpKSB7CisgICAgaWYgKG1fcFRUR1NVQlRhYmxlKSB7CisgICAgICB1aW50MzJfdCB2aW5kZXggPSAwOworICAgICAgbV9wVFRHU1VCVGFibGUtPkdldFZlcnRpY2FsR2x5cGgoaW5kZXgsICZ2aW5kZXgpOworICAgICAgaWYgKHZpbmRleCkgeworICAgICAgICBpbmRleCA9IHZpbmRleDsKKyAgICAgICAgaWYgKHBWZXJ0R2x5cGgpIHsKKyAgICAgICAgICAqcFZlcnRHbHlwaCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBpbmRleDsKKyAgICB9CisgICAgaWYgKCFtX0ZvbnQuR2V0U3ViRGF0YSgpKSB7CisgICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aCA9IDA7CisgICAgICBpbnQgZXJyb3IgPSBGWEZUX0xvYWRfU2ZudF9UYWJsZShmYWNlLCBGVF9NQUtFX1RBRygnRycsICdTJywgJ1UnLCAnQicpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJmxlbmd0aCk7CisgICAgICBpZiAoIWVycm9yKSB7CisgICAgICAgIG1fRm9udC5TZXRTdWJEYXRhKEZYX0FsbG9jKHVpbnQ4X3QsIGxlbmd0aCkpOworICAgICAgfQorICAgIH0KKyAgICBpbnQgZXJyb3IgPSBGWEZUX0xvYWRfU2ZudF9UYWJsZShmYWNlLCBGVF9NQUtFX1RBRygnRycsICdTJywgJ1UnLCAnQicpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fRm9udC5HZXRTdWJEYXRhKCksIE5VTEwpOworICAgIGlmICghZXJyb3IgJiYgbV9Gb250LkdldFN1YkRhdGEoKSkgeworICAgICAgbV9wVFRHU1VCVGFibGUgPSBuZXcgQ0ZYX0NUVEdTVUJUYWJsZTsKKyAgICAgIG1fcFRUR1NVQlRhYmxlLT5Mb2FkR1NVQlRhYmxlKChGVF9CeXRlcyltX0ZvbnQuR2V0U3ViRGF0YSgpKTsKKyAgICAgIHVpbnQzMl90IHZpbmRleCA9IDA7CisgICAgICBtX3BUVEdTVUJUYWJsZS0+R2V0VmVydGljYWxHbHlwaChpbmRleCwgJnZpbmRleCk7CisgICAgICBpZiAodmluZGV4KSB7CisgICAgICAgIGluZGV4ID0gdmluZGV4OworICAgICAgICBpZiAocFZlcnRHbHlwaCkgeworICAgICAgICAgICpwVmVydEdseXBoID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW5kZXg7CisgIH0KKyAgaWYgKHBWZXJ0R2x5cGgpIHsKKyAgICAqcFZlcnRHbHlwaCA9IEZBTFNFOworICB9CisgIHJldHVybiBpbmRleDsKK30KK2ludCBDUERGX0NJREZvbnQ6OkdseXBoRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlLCBGWF9CT09MKiBwVmVydEdseXBoKSB7CisgIGlmIChwVmVydEdseXBoKSB7CisgICAgKnBWZXJ0R2x5cGggPSBGQUxTRTsKKyAgfQorICBpZiAoIW1fcEZvbnRGaWxlICYmICFtX3BDSURUb0dJRE1hcCkgeworICAgIEZYX1dPUkQgY2lkID0gQ0lERnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKyAgICBGWF9XQ0hBUiB1bmljb2RlID0gMDsKKyAgICBpZiAobV9iQ0lESXNHSUQpIHsKKyNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX0FQUExFXworICAgICAgcmV0dXJuIGNpZDsKKyNlbHNlCisgICAgICBpZiAobV9GbGFncyAmIFBERkZPTlRfU1lNQk9MSUMpIHsKKyAgICAgICAgcmV0dXJuIGNpZDsKKyAgICAgIH0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHVuaV9zdHIgPSBVbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKyAgICAgIGlmICh1bmlfc3RyLklzRW1wdHkoKSkgeworICAgICAgICByZXR1cm4gY2lkOworICAgICAgfQorICAgICAgdW5pY29kZSA9IHVuaV9zdHIuR2V0QXQoMCk7CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGNpZCAmJiBtX3BDSUQyVW5pY29kZU1hcCAmJiBtX3BDSUQyVW5pY29kZU1hcC0+SXNMb2FkZWQoKSkgeworICAgICAgICB1bmljb2RlID0gbV9wQ0lEMlVuaWNvZGVNYXAtPlVuaWNvZGVGcm9tQ0lEKGNpZCk7CisgICAgICB9CisgICAgICBpZiAodW5pY29kZSA9PSAwKSB7CisgICAgICAgIHVuaWNvZGUgPSBfVW5pY29kZUZyb21DaGFyQ29kZShjaGFyY29kZSk7CisgICAgICB9CisgICAgICBpZiAodW5pY29kZSA9PSAwICYmICEobV9GbGFncyAmIFBERkZPTlRfU1lNQk9MSUMpKSB7CisgICAgICAgIHVuaWNvZGUgPSBVbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKS5HZXRBdCgwKTsKKyAgICAgIH0KKyAgICB9CisgICAgRlhGVF9GYWNlIGZhY2UgPSBtX0ZvbnQuR2V0RmFjZSgpOworICAgIGlmICh1bmljb2RlID09IDApIHsKKyAgICAgIGlmICghbV9iQWRvYmVDb3VyaWVyU3RkKSB7CisgICAgICAgIHJldHVybiBjaGFyY29kZSA9PSAwID8gLTEgOiAoaW50KWNoYXJjb2RlOworICAgICAgfQorICAgICAgY2hhcmNvZGUgKz0gMzE7CisgICAgICBpbnQgaW5kZXggPSAwLCBpQmFzZUVuY29kaW5nOworICAgICAgRlhfQk9PTCBiTVNVbmljb2RlID0gRlRfVXNlVFRDaGFybWFwKGZhY2UsIDMsIDEpOworICAgICAgRlhfQk9PTCBiTWFjUm9tYW4gPSBGQUxTRTsKKyAgICAgIGlmICghYk1TVW5pY29kZSkgeworICAgICAgICBiTWFjUm9tYW4gPSBGVF9Vc2VUVENoYXJtYXAoZmFjZSwgMSwgMCk7CisgICAgICB9CisgICAgICBpQmFzZUVuY29kaW5nID0gUERGRk9OVF9FTkNPRElOR19TVEFOREFSRDsKKyAgICAgIGlmIChiTVNVbmljb2RlKSB7CisgICAgICAgIGlCYXNlRW5jb2RpbmcgPSBQREZGT05UX0VOQ09ESU5HX1dJTkFOU0k7CisgICAgICB9IGVsc2UgaWYgKGJNYWNSb21hbikgeworICAgICAgICBpQmFzZUVuY29kaW5nID0gUERGRk9OVF9FTkNPRElOR19NQUNST01BTjsKKyAgICAgIH0KKyAgICAgIGNvbnN0IEZYX0NIQVIqIG5hbWUgPSBHZXRBZG9iZUNoYXJOYW1lKGlCYXNlRW5jb2RpbmcsIE5VTEwsIGNoYXJjb2RlKTsKKyAgICAgIGlmICghbmFtZSkgeworICAgICAgICByZXR1cm4gY2hhcmNvZGUgPT0gMCA/IC0xIDogKGludCljaGFyY29kZTsKKyAgICAgIH0KKyAgICAgIEZYX1dPUkQgdW5pY29kZSA9IFBERl9Vbmljb2RlRnJvbUFkb2JlTmFtZShuYW1lKTsKKyAgICAgIGlmICh1bmljb2RlKSB7CisgICAgICAgIGlmIChiTVNVbmljb2RlKSB7CisgICAgICAgICAgaW5kZXggPSBGWEZUX0dldF9DaGFyX0luZGV4KGZhY2UsIHVuaWNvZGUpOworICAgICAgICB9IGVsc2UgaWYgKGJNYWNSb21hbikgeworICAgICAgICAgIEZYX0RXT1JEIG1hY2NvZGUgPQorICAgICAgICAgICAgICBGVF9DaGFyQ29kZUZyb21Vbmljb2RlKEZYRlRfRU5DT0RJTkdfQVBQTEVfUk9NQU4sIHVuaWNvZGUpOworICAgICAgICAgIGluZGV4ID0gIW1hY2NvZGUgPyBGWEZUX0dldF9OYW1lX0luZGV4KGZhY2UsIChjaGFyKiluYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGWEZUX0dldF9DaGFyX0luZGV4KGZhY2UsIG1hY2NvZGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiBGWEZUX0dldF9DaGFyX0luZGV4KGZhY2UsIHVuaWNvZGUpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gY2hhcmNvZGUgPT0gMCA/IC0xIDogKGludCljaGFyY29kZTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmRleCA9PSAwIHx8IGluZGV4ID09IDB4ZmZmZikgeworICAgICAgICByZXR1cm4gY2hhcmNvZGUgPT0gMCA/IC0xIDogKGludCljaGFyY29kZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBpbmRleDsKKyAgICB9CisgICAgaWYgKG1fQ2hhcnNldCA9PSBDSURTRVRfSkFQQU4xKSB7CisgICAgICBpZiAodW5pY29kZSA9PSAnXFwnKSB7CisgICAgICAgIHVuaWNvZGUgPSAnLyc7CisgICAgICB9CisjaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyAgICAgIGVsc2UgaWYgKHVuaWNvZGUgPT0gMHhhNSkgeworICAgICAgICB1bmljb2RlID0gMHg1YzsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICBpZiAoIWZhY2UpCisgICAgICByZXR1cm4gdW5pY29kZTsKKworICAgIGludCBlcnIgPSBGWEZUX1NlbGVjdF9DaGFybWFwKGZhY2UsIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSk7CisgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICBpbnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBGWEZUX0dldF9GYWNlX0NoYXJtYXBDb3VudChmYWNlKTsgaSsrKSB7CisgICAgICAgIEZYX0RXT1JEIHJldCA9IEZUX0NoYXJDb2RlRnJvbVVuaWNvZGUoCisgICAgICAgICAgICBGWEZUX0dldF9DaGFybWFwX0VuY29kaW5nKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbaV0pLAorICAgICAgICAgICAgKEZYX1dDSEFSKWNoYXJjb2RlKTsKKyAgICAgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgRlhGVF9TZXRfQ2hhcm1hcChmYWNlLCBGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpW2ldKTsKKyAgICAgICAgdW5pY29kZSA9IChGWF9XQ0hBUilyZXQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKGkgPT0gRlhGVF9HZXRfRmFjZV9DaGFybWFwQ291bnQoZmFjZSkgJiYgaSkgeworICAgICAgICBGWEZUX1NldF9DaGFybWFwKGZhY2UsIEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbMF0pOworICAgICAgICB1bmljb2RlID0gKEZYX1dDSEFSKWNoYXJjb2RlOworICAgICAgfQorICAgIH0KKyAgICBpZiAoRlhGVF9HZXRfRmFjZV9DaGFybWFwKGZhY2UpKSB7CisgICAgICBpbnQgaW5kZXggPSBHZXRHbHlwaEluZGV4KHVuaWNvZGUsIHBWZXJ0R2x5cGgpOworICAgICAgaWYgKGluZGV4ID09IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIHJldHVybiBpbmRleDsKKyAgICB9CisgICAgcmV0dXJuIHVuaWNvZGU7CisgIH0KKyAgaWYgKCFtX0ZvbnQuR2V0RmFjZSgpKQorICAgIHJldHVybiAtMTsKKworICBGWF9XT1JEIGNpZCA9IENJREZyb21DaGFyQ29kZShjaGFyY29kZSk7CisgIGlmIChtX2JUeXBlMSkgeworICAgIGlmICghbV9wQ0lEVG9HSURNYXApIHsKKyAgICAgIHJldHVybiBjaWQ7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICghbV9wQ0lEVG9HSURNYXApIHsKKyAgICAgIGlmIChtX3BGb250RmlsZSAmJiAhbV9wQ01hcC0+bV9wTWFwcGluZykKKyAgICAgICAgcmV0dXJuIGNpZDsKKyAgICAgIGlmIChtX3BDTWFwLT5tX0NvZGluZyA9PSBDSURDT0RJTkdfVU5LTk9XTiB8fAorICAgICAgICAgICFGWEZUX0dldF9GYWNlX0NoYXJtYXAobV9Gb250LkdldEZhY2UoKSkpIHsKKyAgICAgICAgcmV0dXJuIGNpZDsKKyAgICAgIH0KKyAgICAgIGlmIChGWEZUX0dldF9DaGFybWFwX0VuY29kaW5nKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcChtX0ZvbnQuR2V0RmFjZSgpKSkgPT0KKyAgICAgICAgICBGWEZUX0VOQ09ESU5HX1VOSUNPREUpIHsKKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgdW5pY29kZV9zdHIgPSBVbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKyAgICAgICAgaWYgKHVuaWNvZGVfc3RyLklzRW1wdHkoKSkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBjaGFyY29kZSA9IHVuaWNvZGVfc3RyLkdldEF0KDApOworICAgICAgfQorICAgICAgcmV0dXJuIEdldEdseXBoSW5kZXgoY2hhcmNvZGUsIHBWZXJ0R2x5cGgpOworICAgIH0KKyAgfQorICBGWF9EV09SRCBieXRlX3BvcyA9IGNpZCAqIDI7CisgIGlmIChieXRlX3BvcyArIDIgPiBtX3BDSURUb0dJRE1hcC0+R2V0U2l6ZSgpKQorICAgIHJldHVybiAtMTsKKworICBjb25zdCB1aW50OF90KiBwZGF0YSA9IG1fcENJRFRvR0lETWFwLT5HZXREYXRhKCkgKyBieXRlX3BvczsKKyAgcmV0dXJuIHBkYXRhWzBdICogMjU2ICsgcGRhdGFbMV07Cit9CitGWF9EV09SRCBDUERGX0NJREZvbnQ6OkdldE5leHRDaGFyKGNvbnN0IEZYX0NIQVIqIHBTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuU3RyTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG9mZnNldCkgY29uc3QgeworICByZXR1cm4gbV9wQ01hcC0+R2V0TmV4dENoYXIocFN0cmluZywgblN0ckxlbiwgb2Zmc2V0KTsKK30KK2ludCBDUERGX0NJREZvbnQ6OkdldENoYXJTaXplKEZYX0RXT1JEIGNoYXJjb2RlKSBjb25zdCB7CisgIHJldHVybiBtX3BDTWFwLT5HZXRDaGFyU2l6ZShjaGFyY29kZSk7Cit9CitpbnQgQ1BERl9DSURGb250OjpDb3VudENoYXIoY29uc3QgRlhfQ0hBUiogcFN0cmluZywgaW50IHNpemUpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcENNYXAtPkNvdW50Q2hhcihwU3RyaW5nLCBzaXplKTsKK30KK2ludCBDUERGX0NJREZvbnQ6OkFwcGVuZENoYXIoRlhfQ0hBUiogc3RyLCBGWF9EV09SRCBjaGFyY29kZSkgY29uc3QgeworICByZXR1cm4gbV9wQ01hcC0+QXBwZW5kQ2hhcihzdHIsIGNoYXJjb2RlKTsKK30KK0ZYX0JPT0wgQ1BERl9DSURGb250OjpJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3QgeworICBpZiAoIW1fcENNYXAtPklzTG9hZGVkKCkgfHwgIW1fcENJRDJVbmljb2RlTWFwIHx8CisgICAgICAhbV9wQ0lEMlVuaWNvZGVNYXAtPklzTG9hZGVkKCkpIHsKKyAgICByZXR1cm4gbV9wQ01hcC0+bV9Db2RpbmcgIT0gQ0lEQ09ESU5HX1VOS05PV047CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENQREZfQ0lERm9udDo6SXNGb250U3R5bGVGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0IHsKKyAgcmV0dXJuIFRSVUU7Cit9Cit2b2lkIENQREZfQ0lERm9udDo6TG9hZFN1YnN0Rm9udCgpIHsKKyAgbV9Gb250LkxvYWRTdWJzdChtX0Jhc2VGb250LCAhbV9iVHlwZTEsIG1fRmxhZ3MsIG1fU3RlbVYgKiA1LCBtX0l0YWxpY0FuZ2xlLAorICAgICAgICAgICAgICAgICAgIGdfQ2hhcnNldENQc1ttX0NoYXJzZXRdLCBJc1ZlcnRXcml0aW5nKCkpOworfQordm9pZCBDUERGX0NJREZvbnQ6OkxvYWRNZXRyaWNzQXJyYXkoQ1BERl9BcnJheSogcEFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RXb3JkQXJyYXkmIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuRWxlbWVudHMpIHsKKyAgaW50IHdpZHRoX3N0YXR1cyA9IDA7CisgIGludCBpQ3VyRWxlbWVudCA9IDA7CisgIGludCBmaXJzdF9jb2RlID0gMCwgbGFzdF9jb2RlOworICBGWF9EV09SRCBjb3VudCA9IHBBcnJheS0+R2V0Q291bnQoKTsKKyAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBDUERGX09iamVjdCogcE9iaiA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKGkpOworICAgIGlmICghcE9iaikKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKENQREZfQXJyYXkqIHBBcnJheSA9IHBPYmotPkFzQXJyYXkoKSkgeworICAgICAgaWYgKHdpZHRoX3N0YXR1cyAhPSAxKQorICAgICAgICByZXR1cm47CisKKyAgICAgIEZYX0RXT1JEIGNvdW50ID0gcEFycmF5LT5HZXRDb3VudCgpOworICAgICAgZm9yIChGWF9EV09SRCBqID0gMDsgaiA8IGNvdW50OyBqICs9IG5FbGVtZW50cykgeworICAgICAgICByZXN1bHQuQWRkKGZpcnN0X2NvZGUpOworICAgICAgICByZXN1bHQuQWRkKGZpcnN0X2NvZGUpOworICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IG5FbGVtZW50czsgaysrKSB7CisgICAgICAgICAgcmVzdWx0LkFkZChwQXJyYXktPkdldEludGVnZXIoaiArIGspKTsKKyAgICAgICAgfQorICAgICAgICBmaXJzdF9jb2RlKys7CisgICAgICB9CisgICAgICB3aWR0aF9zdGF0dXMgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBpZiAod2lkdGhfc3RhdHVzID09IDApIHsKKyAgICAgICAgZmlyc3RfY29kZSA9IHBPYmotPkdldEludGVnZXIoKTsKKyAgICAgICAgd2lkdGhfc3RhdHVzID0gMTsKKyAgICAgIH0gZWxzZSBpZiAod2lkdGhfc3RhdHVzID09IDEpIHsKKyAgICAgICAgbGFzdF9jb2RlID0gcE9iai0+R2V0SW50ZWdlcigpOworICAgICAgICB3aWR0aF9zdGF0dXMgPSAyOworICAgICAgICBpQ3VyRWxlbWVudCA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWlDdXJFbGVtZW50KSB7CisgICAgICAgICAgcmVzdWx0LkFkZChmaXJzdF9jb2RlKTsKKyAgICAgICAgICByZXN1bHQuQWRkKGxhc3RfY29kZSk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LkFkZChwT2JqLT5HZXRJbnRlZ2VyKCkpOworICAgICAgICBpQ3VyRWxlbWVudCsrOworICAgICAgICBpZiAoaUN1ckVsZW1lbnQgPT0gbkVsZW1lbnRzKSB7CisgICAgICAgICAgd2lkdGhfc3RhdHVzID0gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLyBzdGF0aWMKK0ZYX0ZMT0FUIENQREZfQ0lERm9udDo6Q0lEVHJhbnNmb3JtVG9GbG9hdCh1aW50OF90IGNoKSB7CisgIGlmIChjaCA8IDEyOCkgeworICAgIHJldHVybiBjaCAqIDEuMGYgLyAxMjc7CisgIH0KKyAgcmV0dXJuICgtMjU1ICsgY2gpICogMS4wZiAvIDEyNzsKK30KKworRlhfQk9PTCBDUERGX0NJREZvbnQ6OkxvYWRHQjIzMTIoKSB7CisgIG1fQmFzZUZvbnQgPSBtX3BGb250RGljdC0+R2V0U3RyaW5nKCJCYXNlRm9udCIpOworICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGVzYyA9IG1fcEZvbnREaWN0LT5HZXREaWN0KCJGb250RGVzY3JpcHRvciIpOworICBpZiAocEZvbnREZXNjKSB7CisgICAgTG9hZEZvbnREZXNjcmlwdG9yKHBGb250RGVzYyk7CisgIH0KKyAgbV9DaGFyc2V0ID0gQ0lEU0VUX0dCMTsKKyAgbV9iVHlwZTEgPSBGQUxTRTsKKyAgbV9wQ01hcCA9IENQREZfTW9kdWxlTWdyOjpHZXQoKQorICAgICAgICAgICAgICAgIC0+R2V0UGFnZU1vZHVsZSgpCisgICAgICAgICAgICAgICAgLT5HZXRGb250R2xvYmFscygpCisgICAgICAgICAgICAgICAgLT5tX0NNYXBNYW5hZ2VyLkdldFByZWRlZmluZWRDTWFwKCJHQkstRVVDLUgiLCBGQUxTRSk7CisgIG1fcENJRDJVbmljb2RlTWFwID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0UGFnZU1vZHVsZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0Rm9udEdsb2JhbHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAtPm1fQ01hcE1hbmFnZXIuR2V0Q0lEMlVuaWNvZGVNYXAobV9DaGFyc2V0LCBGQUxTRSk7CisgIGlmICghSXNFbWJlZGRlZCgpKSB7CisgICAgTG9hZFN1YnN0Rm9udCgpOworICB9CisgIENoZWNrRm9udE1ldHJpY3MoKTsKKyAgbV9EZWZhdWx0V2lkdGggPSAxMDAwOworICBtX3BBbnNpV2lkdGhzID0gRlhfQWxsb2MoRlhfV09SRCwgMTI4KTsKKyAgZm9yIChpbnQgaSA9IDMyOyBpIDwgMTI3OyBpKyspIHsKKyAgICBtX3BBbnNpV2lkdGhzW2ldID0gNTAwOworICB9CisgIHJldHVybiBUUlVFOworfQorCitjb25zdCB1aW50OF90KiBDUERGX0NJREZvbnQ6OkdldENJRFRyYW5zZm9ybShGWF9XT1JEIENJRCkgY29uc3QgeworICBpZiAobV9DaGFyc2V0ICE9IENJRFNFVF9KQVBBTjEgfHwgbV9wRm9udEZpbGUpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgY29uc3Qgc3RydWN0IENJRFRyYW5zZm9ybSogZm91bmQgPSAoY29uc3Qgc3RydWN0IENJRFRyYW5zZm9ybSopRlhTWVNfYnNlYXJjaCgKKyAgICAgICZDSUQsIGdfSmFwYW4xX1ZlcnRDSURzLCBGWF9BcnJheVNpemUoZ19KYXBhbjFfVmVydENJRHMpLAorICAgICAgc2l6ZW9mKGdfSmFwYW4xX1ZlcnRDSURzWzBdKSwgQ29tcGFyZUNJRFRyYW5zZm9ybSk7CisgIHJldHVybiBmb3VuZCA/ICZmb3VuZC0+YSA6IG51bGxwdHI7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnRfY2lkX3VuaXR0ZXN0LmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZwZGZfZm9udF9jaWRfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhODA4NmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnRfY2lkX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDY2IEBACisvLyBDb3B5cmlnaHQgMjAxNSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKworI2luY2x1ZGUgImZvbnRfaW50LmgiCisKK25hbWVzcGFjZSB7CisKK2Jvb2wgdWludF9yYW5nZXNfZXF1YWwodWludDhfdCogYSwgdWludDhfdCogYiwgc2l6ZV90IGNvdW50KSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgIGlmIChhW2ldICE9IGJbaV0pCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitURVNUKGZwZGZfZm9udF9jaWQsIENNYXBfR2V0Q29kZSkgeworICBFWFBFQ1RfRVEoMCwgQ1BERl9DTWFwUGFyc2VyOjpDTWFwX0dldENvZGUoIiIpKTsKKyAgRVhQRUNUX0VRKDAsIENQREZfQ01hcFBhcnNlcjo6Q01hcF9HZXRDb2RlKCI8IikpOworICBFWFBFQ1RfRVEoMTk0LCBDUERGX0NNYXBQYXJzZXI6OkNNYXBfR2V0Q29kZSgiPGMyIikpOworICBFWFBFQ1RfRVEoMTYyLCBDUERGX0NNYXBQYXJzZXI6OkNNYXBfR2V0Q29kZSgiPEEyIikpOworICBFWFBFQ1RfRVEoMjgwMiwgQ1BERl9DTWFwUGFyc2VyOjpDTWFwX0dldENvZGUoIjxBZjIiKSk7CisgIEVYUEVDVF9FUSgxNjIsIENQREZfQ01hcFBhcnNlcjo6Q01hcF9HZXRDb2RlKCI8QTJ6IikpOworCisgIEVYUEVDVF9FUSgxMiwgQ1BERl9DTWFwUGFyc2VyOjpDTWFwX0dldENvZGUoIjEyIikpOworICBFWFBFQ1RfRVEoMTIsIENQREZfQ01hcFBhcnNlcjo6Q01hcF9HZXRDb2RlKCIxMmQiKSk7CisgIEVYUEVDVF9FUSgxMjgsIENQREZfQ01hcFBhcnNlcjo6Q01hcF9HZXRDb2RlKCIxMjgiKSk7Cit9CisKK1RFU1QoZnBkZl9mb250X2NpZCwgQ01hcF9HZXRDb2RlUmFuZ2UpIHsKKyAgQ01hcF9Db2RlUmFuZ2UgcmFuZ2U7CisKKyAgLy8gTXVzdCBzdGFydCB3aXRoIGEgPAorICBFWFBFQ1RfRkFMU0UoQ1BERl9DTWFwUGFyc2VyOjpDTWFwX0dldENvZGVSYW5nZShyYW5nZSwgIiIsICIiKSk7CisgIEVYUEVDVF9GQUxTRShDUERGX0NNYXBQYXJzZXI6OkNNYXBfR2V0Q29kZVJhbmdlKHJhbmdlLCAiQSIsICIiKSk7CisKKyAgLy8gbV9DaGFyU2l6ZSBtdXN0IGJlIDw9IDQKKyAgRVhQRUNUX0ZBTFNFKENQREZfQ01hcFBhcnNlcjo6Q01hcF9HZXRDb2RlUmFuZ2UocmFuZ2UsICI8YWFhYWFhYWFhYT4iLCAiIikpOworICBFWFBFQ1RfRVEoNSwgcmFuZ2UubV9DaGFyU2l6ZSk7CisKKyAgRVhQRUNUX1RSVUUoCisgICAgICBDUERGX0NNYXBQYXJzZXI6OkNNYXBfR2V0Q29kZVJhbmdlKHJhbmdlLCAiPDEyMzQ1Njc4PiIsICI8ODc2NTQzMjE+IikpOworICBFWFBFQ1RfRVEoNCwgcmFuZ2UubV9DaGFyU2l6ZSk7CisgIHsKKyAgICB1aW50OF90IGxvd2VyWzRdID0gezE4LCA1MiwgODYsIDEyMH07CisgICAgdWludDhfdCB1cHBlcls0XSA9IHsxMzUsIDEwMSwgNjcsIDMzfTsKKyAgICBFWFBFQ1RfVFJVRSh1aW50X3Jhbmdlc19lcXVhbChsb3dlciwgcmFuZ2UubV9Mb3dlciwgcmFuZ2UubV9DaGFyU2l6ZSkpOworICAgIEVYUEVDVF9UUlVFKHVpbnRfcmFuZ2VzX2VxdWFsKHVwcGVyLCByYW5nZS5tX1VwcGVyLCByYW5nZS5tX0NoYXJTaXplKSk7CisgIH0KKworICAvLyBIZXggY2hhcmFjdGVycworICBFWFBFQ1RfVFJVRShDUERGX0NNYXBQYXJzZXI6OkNNYXBfR2V0Q29kZVJhbmdlKHJhbmdlLCAiPGExPiIsICI8RjM+IikpOworICBFWFBFQ1RfRVEoMSwgcmFuZ2UubV9DaGFyU2l6ZSk7CisgIEVYUEVDVF9FUSgxNjEsIHJhbmdlLm1fTG93ZXJbMF0pOworICBFWFBFQ1RfRVEoMjQzLCByYW5nZS5tX1VwcGVyWzBdKTsKKworICAvLyBUaGUgc2Vjb25kIHN0cmluZyBzaG91bGQgcmV0dXJuIDAncyBpZiBpdCBpcyBzaG9ydGVyCisgIEVYUEVDVF9UUlVFKENQREZfQ01hcFBhcnNlcjo6Q01hcF9HZXRDb2RlUmFuZ2UocmFuZ2UsICI8YTE+IiwgIiIpKTsKKyAgRVhQRUNUX0VRKDEsIHJhbmdlLm1fQ2hhclNpemUpOworICBFWFBFQ1RfRVEoMTYxLCByYW5nZS5tX0xvd2VyWzBdKTsKKyAgRVhQRUNUX0VRKDAsIHJhbmdlLm1fVXBwZXJbMF0pOworfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZnBkZl9mb250X3VuaXR0ZXN0LmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZwZGZfZm9udF91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNjNTI5YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZwZGZfZm9udF91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKKyNpbmNsdWRlICJmb250X2ludC5oIgorCitURVNUKGZwZGZfZm9udCwgU3RyaW5nVG9Db2RlKSB7CisgIEVYUEVDVF9FUSgwLCBDUERGX1RvVW5pY29kZU1hcDo6U3RyaW5nVG9Db2RlKCIiKSk7CisgIEVYUEVDVF9FUSgxOTQsIENQREZfVG9Vbmljb2RlTWFwOjpTdHJpbmdUb0NvZGUoIjxjMiIpKTsKKyAgRVhQRUNUX0VRKDE2MiwgQ1BERl9Ub1VuaWNvZGVNYXA6OlN0cmluZ1RvQ29kZSgiPEEyIikpOworICBFWFBFQ1RfRVEoMjgwMiwgQ1BERl9Ub1VuaWNvZGVNYXA6OlN0cmluZ1RvQ29kZSgiPEFmMiIpKTsKKyAgRVhQRUNUX0VRKDEyLCBDUERGX1RvVW5pY29kZU1hcDo6U3RyaW5nVG9Db2RlKCIxMiIpKTsKKyAgRVhQRUNUX0VRKDEyOCwgQ1BERl9Ub1VuaWNvZGVNYXA6OlN0cmluZ1RvQ29kZSgiMTI4IikpOworfQorCitURVNUKGZwZGZfZm9udCwgU3RyaW5nVG9XaWRlU3RyaW5nKSB7CisgIEVYUEVDVF9FUShMIiIsIENQREZfVG9Vbmljb2RlTWFwOjpTdHJpbmdUb1dpZGVTdHJpbmcoIiIpKTsKKyAgRVhQRUNUX0VRKEwiIiwgQ1BERl9Ub1VuaWNvZGVNYXA6OlN0cmluZ1RvV2lkZVN0cmluZygiMTIzNCIpKTsKKworICBFWFBFQ1RfRVEoTCIiLCBDUERGX1RvVW5pY29kZU1hcDo6U3RyaW5nVG9XaWRlU3RyaW5nKCI8YzIiKSk7CisKKyAgQ0ZYX1dpZGVTdHJpbmcgcmVzID0gTCJceGMyYWIiOworICBFWFBFQ1RfRVEocmVzLCBDUERGX1RvVW5pY29kZU1hcDo6U3RyaW5nVG9XaWRlU3RyaW5nKCI8YzJhYiIpKTsKKyAgRVhQRUNUX0VRKHJlcywgQ1BERl9Ub1VuaWNvZGVNYXA6OlN0cmluZ1RvV2lkZVN0cmluZygiPGMyYWJhYiIpKTsKKyAgRVhQRUNUX0VRKHJlcywgQ1BERl9Ub1VuaWNvZGVNYXA6OlN0cmluZ1RvV2lkZVN0cmluZygiPGMyYWIgMTIzNCIpKTsKKworICByZXMgKz0gTCJceGZhYWIiOworICBFWFBFQ1RfRVEocmVzLCBDUERGX1RvVW5pY29kZU1hcDo6U3RyaW5nVG9XaWRlU3RyaW5nKCI8YzJhYkZhQWIiKSk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC90dGdzdWJ0YWJsZS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC90dGdzdWJ0YWJsZS5jcHAKaW5kZXggYWU2N2QyZi4uMDk5MzBiZSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvdHRnc3VidGFibGUuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L3R0Z3N1YnRhYmxlLmNwcApAQCAtMSw0NDkgKzEsNDE1IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKICNpbmNsdWRlICJ0dGdzdWJ0YWJsZS5oIgotQ0ZYX0dseXBoTWFwOjpDRlhfR2x5cGhNYXAoKQotewotfQotQ0ZYX0dseXBoTWFwOjp+Q0ZYX0dseXBoTWFwKCkKLXsKLX0KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2ZyZWV0eXBlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCisKK0NGWF9HbHlwaE1hcDo6Q0ZYX0dseXBoTWFwKCkge30KK0NGWF9HbHlwaE1hcDo6fkNGWF9HbHlwaE1hcCgpIHt9CiBleHRlcm4gIkMiIHsKLSAgICBzdGF0aWMgaW50IF9Db21wYXJlSW50KGNvbnN0IHZvaWQqIHAxLCBjb25zdCB2b2lkKiBwMikKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKihGWF9EV09SRCopcDEpIC0gKCooRlhfRFdPUkQqKXAyKTsKLSAgICB9CitzdGF0aWMgaW50IF9Db21wYXJlSW50KGNvbnN0IHZvaWQqIHAxLCBjb25zdCB2b2lkKiBwMikgeworICByZXR1cm4gKCooRlhfRFdPUkQqKXAxKSAtICgqKEZYX0RXT1JEKilwMik7Cit9CiB9Owogc3RydWN0IF9JbnRQYWlyIHsKLSAgICBGWF9JTlQzMiBrZXk7Ci0gICAgRlhfSU5UMzIgdmFsdWU7CisgIGludDMyX3Qga2V5OworICBpbnQzMl90IHZhbHVlOwogfTsKLXZvaWQgQ0ZYX0dseXBoTWFwOjpTZXRBdChpbnQga2V5LCBpbnQgdmFsdWUpCi17Ci0gICAgRlhfRFdPUkQgY291bnQgPSBtX0J1ZmZlci5HZXRTaXplKCkgLyBzaXplb2YoX0ludFBhaXIpOwotICAgIF9JbnRQYWlyKiBidWYgPSAoX0ludFBhaXIqKW1fQnVmZmVyLkdldEJ1ZmZlcigpOwotICAgIF9JbnRQYWlyIHBhaXIgPSB7a2V5LCB2YWx1ZX07Ci0gICAgaWYgKGNvdW50ID09IDAgfHwga2V5ID4gYnVmW2NvdW50IC0gMV0ua2V5KSB7Ci0gICAgICAgIG1fQnVmZmVyLkFwcGVuZEJsb2NrKCZwYWlyLCBzaXplb2YoX0ludFBhaXIpKTsKLSAgICAgICAgcmV0dXJuOwordm9pZCBDRlhfR2x5cGhNYXA6OlNldEF0KGludCBrZXksIGludCB2YWx1ZSkgeworICBGWF9EV09SRCBjb3VudCA9IG1fQnVmZmVyLkdldFNpemUoKSAvIHNpemVvZihfSW50UGFpcik7CisgIF9JbnRQYWlyKiBidWYgPSAoX0ludFBhaXIqKW1fQnVmZmVyLkdldEJ1ZmZlcigpOworICBfSW50UGFpciBwYWlyID0ge2tleSwgdmFsdWV9OworICBpZiAoY291bnQgPT0gMCB8fCBrZXkgPiBidWZbY291bnQgLSAxXS5rZXkpIHsKKyAgICBtX0J1ZmZlci5BcHBlbmRCbG9jaygmcGFpciwgc2l6ZW9mKF9JbnRQYWlyKSk7CisgICAgcmV0dXJuOworICB9CisgIGludCBsb3cgPSAwLCBoaWdoID0gY291bnQgLSAxOworICB3aGlsZSAobG93IDw9IGhpZ2gpIHsKKyAgICBpbnQgbWlkID0gKGxvdyArIGhpZ2gpIC8gMjsKKyAgICBpZiAoYnVmW21pZF0ua2V5IDwga2V5KSB7CisgICAgICBsb3cgPSBtaWQgKyAxOworICAgIH0gZWxzZSBpZiAoYnVmW21pZF0ua2V5ID4ga2V5KSB7CisgICAgICBoaWdoID0gbWlkIC0gMTsKKyAgICB9IGVsc2UgeworICAgICAgYnVmW21pZF0udmFsdWUgPSB2YWx1ZTsKKyAgICAgIHJldHVybjsKICAgICB9Ci0gICAgaW50IGxvdyA9IDAsIGhpZ2ggPSBjb3VudCAtIDE7Ci0gICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7Ci0gICAgICAgIGludCBtaWQgPSAobG93ICsgaGlnaCkgLyAyOwotICAgICAgICBpZiAoYnVmW21pZF0ua2V5IDwga2V5KSB7Ci0gICAgICAgICAgICBsb3cgPSBtaWQgKyAxOwotICAgICAgICB9IGVsc2UgaWYgKGJ1ZlttaWRdLmtleSA+IGtleSkgewotICAgICAgICAgICAgaGlnaCA9IG1pZCAtIDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidWZbbWlkXS52YWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotICAgIG1fQnVmZmVyLkluc2VydEJsb2NrKGxvdyAqIHNpemVvZihfSW50UGFpciksICZwYWlyLCBzaXplb2YoX0ludFBhaXIpKTsKKyAgfQorICBtX0J1ZmZlci5JbnNlcnRCbG9jayhsb3cgKiBzaXplb2YoX0ludFBhaXIpLCAmcGFpciwgc2l6ZW9mKF9JbnRQYWlyKSk7CiB9Ci1GWF9CT09MIENGWF9HbHlwaE1hcDo6TG9va3VwKGludCBrZXksIGludCAmdmFsdWUpCi17Ci0gICAgRlhfTFBWT0lEIHBSZXN1bHQgPSBGWFNZU19ic2VhcmNoKCZrZXksIG1fQnVmZmVyLkdldEJ1ZmZlcigpLCBtX0J1ZmZlci5HZXRTaXplKCkgLyBzaXplb2YoX0ludFBhaXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoX0ludFBhaXIpLCBfQ29tcGFyZUludCk7Ci0gICAgaWYgKHBSZXN1bHQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHZhbHVlID0gKChGWF9EV09SRCopcFJlc3VsdClbMV07Ci0gICAgcmV0dXJuIFRSVUU7CitGWF9CT09MIENGWF9HbHlwaE1hcDo6TG9va3VwKGludCBrZXksIGludCYgdmFsdWUpIHsKKyAgdm9pZCogcFJlc3VsdCA9IEZYU1lTX2JzZWFyY2goJmtleSwgbV9CdWZmZXIuR2V0QnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQnVmZmVyLkdldFNpemUoKSAvIHNpemVvZihfSW50UGFpciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihfSW50UGFpciksIF9Db21wYXJlSW50KTsKKyAgaWYgKCFwUmVzdWx0KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHZhbHVlID0gKChGWF9EV09SRCopcFJlc3VsdClbMV07CisgIHJldHVybiBUUlVFOwogfQotYm9vbCBDRlhfQ1RUR1NVQlRhYmxlOjpMb2FkR1NVQlRhYmxlKEZUX0J5dGVzIGdzdWIpCi17Ci0gICAgaGVhZGVyLlZlcnNpb24gPSBnc3ViWzBdIDw8IDI0IHwgZ3N1YlsxXSA8PCAxNiB8IGdzdWJbMl0gPDwgOCB8IGdzdWJbM107Ci0gICAgaWYoaGVhZGVyLlZlcnNpb24gIT0gMHgwMDAxMDAwMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGhlYWRlci5TY3JpcHRMaXN0ICA9IGdzdWJbNF0gPDwgOCB8IGdzdWJbNV07Ci0gICAgaGVhZGVyLkZlYXR1cmVMaXN0ID0gZ3N1Yls2XSA8PCA4IHwgZ3N1Yls3XTsKLSAgICBoZWFkZXIuTG9va3VwTGlzdCAgPSBnc3ViWzhdIDw8IDggfCBnc3ViWzldOwotICAgIHJldHVybiBQYXJzZSgKLSAgICAgICAgICAgICAgICZnc3ViW2hlYWRlci5TY3JpcHRMaXN0XSwKLSAgICAgICAgICAgICAgICZnc3ViW2hlYWRlci5GZWF0dXJlTGlzdF0sCitib29sIENGWF9DVFRHU1VCVGFibGU6OkxvYWRHU1VCVGFibGUoRlRfQnl0ZXMgZ3N1YikgeworICBoZWFkZXIuVmVyc2lvbiA9IGdzdWJbMF0gPDwgMjQgfCBnc3ViWzFdIDw8IDE2IHwgZ3N1YlsyXSA8PCA4IHwgZ3N1YlszXTsKKyAgaWYgKGhlYWRlci5WZXJzaW9uICE9IDB4MDAwMTAwMDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaGVhZGVyLlNjcmlwdExpc3QgPSBnc3ViWzRdIDw8IDggfCBnc3ViWzVdOworICBoZWFkZXIuRmVhdHVyZUxpc3QgPSBnc3ViWzZdIDw8IDggfCBnc3ViWzddOworICBoZWFkZXIuTG9va3VwTGlzdCA9IGdzdWJbOF0gPDwgOCB8IGdzdWJbOV07CisgIHJldHVybiBQYXJzZSgmZ3N1YltoZWFkZXIuU2NyaXB0TGlzdF0sICZnc3ViW2hlYWRlci5GZWF0dXJlTGlzdF0sCiAgICAgICAgICAgICAgICAmZ3N1YltoZWFkZXIuTG9va3VwTGlzdF0pOwogfQotYm9vbCBDRlhfQ1RUR1NVQlRhYmxlOjpHZXRWZXJ0aWNhbEdseXBoKFRUX3VpbnQzMl90IGdseXBobnVtLCBUVF91aW50MzJfdCAqdmdseXBobnVtKQotewotICAgIFRUX3VpbnQzMl90IHRhZ1tdID0gewotICAgICAgICAoVFRfdWludDhfdCkndicgPDwgMjQgfAotICAgICAgICAoVFRfdWludDhfdCkncicgPDwgMTYgfAotICAgICAgICAoVFRfdWludDhfdCkndCcgPDwgIDggfAotICAgICAgICAoVFRfdWludDhfdCknMicsCi0gICAgICAgIChUVF91aW50OF90KSd2JyA8PCAyNCB8Ci0gICAgICAgIChUVF91aW50OF90KSdlJyA8PCAxNiB8Ci0gICAgICAgIChUVF91aW50OF90KSdyJyA8PCAgOCB8Ci0gICAgICAgIChUVF91aW50OF90KSd0JywKLSAgICB9OwotICAgIGlmICghbV9iRmVhdXR1cmVNYXBMb2FkKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU2NyaXB0TGlzdC5TY3JpcHRDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8CShTY3JpcHRMaXN0LlNjcmlwdFJlY29yZCArIGkpLT5TY3JpcHQuTGFuZ1N5c0NvdW50OyArK2opIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8ICgoU2NyaXB0TGlzdC5TY3JpcHRSZWNvcmQgKyBpKS0+U2NyaXB0LkxhbmdTeXNSZWNvcmQgKyBqKS0+TGFuZ1N5cy5GZWF0dXJlQ291bnQ7ICsraykgewotICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBpbmRleCA9ICooKChTY3JpcHRMaXN0LlNjcmlwdFJlY29yZCArIGkpLT5TY3JpcHQuTGFuZ1N5c1JlY29yZCArIGopLT5MYW5nU3lzLkZlYXR1cmVJbmRleCArIGspOwotICAgICAgICAgICAgICAgICAgICBpZiAoRmVhdHVyZUxpc3QuRmVhdHVyZVJlY29yZFtpbmRleF0uRmVhdHVyZVRhZyA9PSB0YWdbMF0gfHwgRmVhdHVyZUxpc3QuRmVhdHVyZVJlY29yZFtpbmRleF0uRmVhdHVyZVRhZyA9PSB0YWdbMV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtX2ZlYXR1cmVNYXAuTG9va3VwKGluZGV4LCB2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZlYXR1cmVNYXAuU2V0QXQoaW5kZXgsIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KK2Jvb2wgQ0ZYX0NUVEdTVUJUYWJsZTo6R2V0VmVydGljYWxHbHlwaCh1aW50MzJfdCBnbHlwaG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogdmdseXBobnVtKSB7CisgIHVpbnQzMl90IHRhZ1tdID0geworICAgICAgKHVpbnQ4X3QpJ3YnIDw8IDI0IHwgKHVpbnQ4X3QpJ3InIDw8IDE2IHwgKHVpbnQ4X3QpJ3QnIDw8IDggfAorICAgICAgICAgICh1aW50OF90KScyJywKKyAgICAgICh1aW50OF90KSd2JyA8PCAyNCB8ICh1aW50OF90KSdlJyA8PCAxNiB8ICh1aW50OF90KSdyJyA8PCA4IHwKKyAgICAgICAgICAodWludDhfdCkndCcsCisgIH07CisgIGlmICghbV9iRmVhdXR1cmVNYXBMb2FkKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTY3JpcHRMaXN0LlNjcmlwdENvdW50OyBpKyspIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgKFNjcmlwdExpc3QuU2NyaXB0UmVjb3JkICsgaSktPlNjcmlwdC5MYW5nU3lzQ291bnQ7CisgICAgICAgICAgICsraikgeworICAgICAgICBmb3IgKGludCBrID0gMDsKKyAgICAgICAgICAgICBrIDwgKChTY3JpcHRMaXN0LlNjcmlwdFJlY29yZCArIGkpLT5TY3JpcHQuTGFuZ1N5c1JlY29yZCArIGopCisgICAgICAgICAgICAgICAgICAgICAtPkxhbmdTeXMuRmVhdHVyZUNvdW50OworICAgICAgICAgICAgICsraykgeworICAgICAgICAgIEZYX0RXT1JEIGluZGV4ID0KKyAgICAgICAgICAgICAgKigoKFNjcmlwdExpc3QuU2NyaXB0UmVjb3JkICsgaSktPlNjcmlwdC5MYW5nU3lzUmVjb3JkICsgaikKKyAgICAgICAgICAgICAgICAgICAgLT5MYW5nU3lzLkZlYXR1cmVJbmRleCArCisgICAgICAgICAgICAgICAgayk7CisgICAgICAgICAgaWYgKEZlYXR1cmVMaXN0LkZlYXR1cmVSZWNvcmRbaW5kZXhdLkZlYXR1cmVUYWcgPT0gdGFnWzBdIHx8CisgICAgICAgICAgICAgIEZlYXR1cmVMaXN0LkZlYXR1cmVSZWNvcmRbaW5kZXhdLkZlYXR1cmVUYWcgPT0gdGFnWzFdKSB7CisgICAgICAgICAgICBpZiAoIXBkZml1bTo6Q29udGFpbnNLZXkobV9mZWF0dXJlTWFwLCBpbmRleCkpIHsKKyAgICAgICAgICAgICAgbV9mZWF0dXJlTWFwW2luZGV4XSA9IGluZGV4OwogICAgICAgICAgICAgfQorICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoIW1fZmVhdHVyZU1hcC5HZXRTdGFydFBvc2l0aW9uKCkpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRmVhdHVyZUxpc3QuRmVhdHVyZUNvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKEZlYXR1cmVMaXN0LkZlYXR1cmVSZWNvcmRbaV0uRmVhdHVyZVRhZyA9PSB0YWdbMF0gfHwgRmVhdHVyZUxpc3QuRmVhdHVyZVJlY29yZFtpXS5GZWF0dXJlVGFnID09IHRhZ1sxXSkgewotICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtX2ZlYXR1cmVNYXAuTG9va3VwKGksIHZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9mZWF0dXJlTWFwLlNldEF0KGksIGkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1fYkZlYXV0dXJlTWFwTG9hZCA9IFRSVUU7CisgICAgICB9CiAgICAgfQotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fZmVhdHVyZU1hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBGWF9EV09SRCBpbmRleCwgdmFsdWU7Ci0gICAgICAgIG1fZmVhdHVyZU1hcC5HZXROZXh0QXNzb2MocG9zLCBpbmRleCwgdmFsdWUpOwotICAgICAgICBpZihHZXRWZXJ0aWNhbEdseXBoU3ViKGdseXBobnVtLCB2Z2x5cGhudW0sCSZGZWF0dXJlTGlzdC5GZWF0dXJlUmVjb3JkW3ZhbHVlXS5GZWF0dXJlKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKG1fZmVhdHVyZU1hcC5lbXB0eSgpKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZlYXR1cmVMaXN0LkZlYXR1cmVDb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChGZWF0dXJlTGlzdC5GZWF0dXJlUmVjb3JkW2ldLkZlYXR1cmVUYWcgPT0gdGFnWzBdIHx8CisgICAgICAgICAgICBGZWF0dXJlTGlzdC5GZWF0dXJlUmVjb3JkW2ldLkZlYXR1cmVUYWcgPT0gdGFnWzFdKSB7CisgICAgICAgICAgbV9mZWF0dXJlTWFwW2ldID0gaTsKICAgICAgICAgfQorICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgbV9iRmVhdXR1cmVNYXBMb2FkID0gVFJVRTsKKyAgfQorICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBtX2ZlYXR1cmVNYXApIHsKKyAgICBpZiAoR2V0VmVydGljYWxHbHlwaFN1YihnbHlwaG51bSwgdmdseXBobnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZGZWF0dXJlTGlzdC5GZWF0dXJlUmVjb3JkW3BhaXIuc2Vjb25kXS5GZWF0dXJlKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKIH0KLWJvb2wgQ0ZYX0NUVEdTVUJUYWJsZTo6R2V0VmVydGljYWxHbHlwaFN1YigKLSAgICBUVF91aW50MzJfdCBnbHlwaG51bSwKLSAgICBUVF91aW50MzJfdCAqdmdseXBobnVtLAotICAgIHN0cnVjdCBURmVhdHVyZSAqRmVhdHVyZSkKLXsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgRmVhdHVyZS0+TG9va3VwQ291bnQ7IGkrKykgewotICAgICAgICBpbnQgaW5kZXggPSBGZWF0dXJlLT5Mb29rdXBMaXN0SW5kZXhbaV07Ci0gICAgICAgIGlmKGluZGV4IDwgMCB8fCBMb29rdXBMaXN0Lkxvb2t1cENvdW50IDwgaW5kZXgpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmKExvb2t1cExpc3QuTG9va3VwW2luZGV4XS5Mb29rdXBUeXBlID09IDEpIHsKLSAgICAgICAgICAgIGlmKEdldFZlcnRpY2FsR2x5cGhTdWIyKAotICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICB2Z2x5cGhudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmTG9va3VwTGlzdC5Mb29rdXBbaW5kZXhdKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Citib29sIENGWF9DVFRHU1VCVGFibGU6OkdldFZlcnRpY2FsR2x5cGhTdWIodWludDMyX3QgZ2x5cGhudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHZnbHlwaG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgVEZlYXR1cmUqIEZlYXR1cmUpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBGZWF0dXJlLT5Mb29rdXBDb3VudDsgaSsrKSB7CisgICAgaW50IGluZGV4ID0gRmVhdHVyZS0+TG9va3VwTGlzdEluZGV4W2ldOworICAgIGlmIChpbmRleCA8IDAgfHwgTG9va3VwTGlzdC5Mb29rdXBDb3VudCA8IGluZGV4KSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChMb29rdXBMaXN0Lkxvb2t1cFtpbmRleF0uTG9va3VwVHlwZSA9PSAxKSB7CisgICAgICBpZiAoR2V0VmVydGljYWxHbHlwaFN1YjIoZ2x5cGhudW0sIHZnbHlwaG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTG9va3VwTGlzdC5Mb29rdXBbaW5kZXhdKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOwogfQotYm9vbCBDRlhfQ1RUR1NVQlRhYmxlOjpHZXRWZXJ0aWNhbEdseXBoU3ViMigKLSAgICBUVF91aW50MzJfdCBnbHlwaG51bSwKLSAgICBUVF91aW50MzJfdCAqdmdseXBobnVtLAotICAgIHN0cnVjdCBUTG9va3VwICpMb29rdXApCi17Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IExvb2t1cC0+U3ViVGFibGVDb3VudDsgaSsrKSB7Ci0gICAgICAgIHN3aXRjaChMb29rdXAtPlN1YlRhYmxlW2ldLT5TdWJzdEZvcm1hdCkgewotICAgICAgICAgICAgY2FzZSAxOiB7Ci0gICAgICAgICAgICAgICAgICAgIFRTaW5nbGVTdWJzdEZvcm1hdDEgKnRibDEgPSAoVFNpbmdsZVN1YnN0Rm9ybWF0MSopTG9va3VwLT5TdWJUYWJsZVtpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYoR2V0Q292ZXJhZ2VJbmRleCh0YmwxLT5Db3ZlcmFnZSwgZ2x5cGhudW0pID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICp2Z2x5cGhudW0gPSBnbHlwaG51bSArIHRibDEtPkRlbHRhR2x5cGhJRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgMjogewotICAgICAgICAgICAgICAgICAgICBUU2luZ2xlU3Vic3RGb3JtYXQyICp0YmwyID0gKFRTaW5nbGVTdWJzdEZvcm1hdDIqKUxvb2t1cC0+U3ViVGFibGVbaV07Ci0gICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IC0xOwotICAgICAgICAgICAgICAgICAgICBpbmRleCA9IEdldENvdmVyYWdlSW5kZXgodGJsMi0+Q292ZXJhZ2UsIGdseXBobnVtKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoMCA8PSBpbmRleCAmJiBpbmRleCA8IHRibDItPkdseXBoQ291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICp2Z2x5cGhudW0gPSB0YmwyLT5TdWJzdGl0dXRlW2luZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KK2Jvb2wgQ0ZYX0NUVEdTVUJUYWJsZTo6R2V0VmVydGljYWxHbHlwaFN1YjIodWludDMyX3QgZ2x5cGhudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiB2Z2x5cGhudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBUTG9va3VwKiBMb29rdXApIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBMb29rdXAtPlN1YlRhYmxlQ291bnQ7IGkrKykgeworICAgIHN3aXRjaCAoTG9va3VwLT5TdWJUYWJsZVtpXS0+U3Vic3RGb3JtYXQpIHsKKyAgICAgIGNhc2UgMTogeworICAgICAgICBUU2luZ2xlU3Vic3RGb3JtYXQxKiB0YmwxID0gKFRTaW5nbGVTdWJzdEZvcm1hdDEqKUxvb2t1cC0+U3ViVGFibGVbaV07CisgICAgICAgIGlmIChHZXRDb3ZlcmFnZUluZGV4KHRibDEtPkNvdmVyYWdlLCBnbHlwaG51bSkgPj0gMCkgeworICAgICAgICAgICp2Z2x5cGhudW0gPSBnbHlwaG51bSArIHRibDEtPkRlbHRhR2x5cGhJRDsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgMjogeworICAgICAgICBUU2luZ2xlU3Vic3RGb3JtYXQyKiB0YmwyID0gKFRTaW5nbGVTdWJzdEZvcm1hdDIqKUxvb2t1cC0+U3ViVGFibGVbaV07CisgICAgICAgIGludCBpbmRleCA9IC0xOworICAgICAgICBpbmRleCA9IEdldENvdmVyYWdlSW5kZXgodGJsMi0+Q292ZXJhZ2UsIGdseXBobnVtKTsKKyAgICAgICAgaWYgKDAgPD0gaW5kZXggJiYgaW5kZXggPCB0YmwyLT5HbHlwaENvdW50KSB7CisgICAgICAgICAgKnZnbHlwaG51bSA9IHRibDItPlN1YnN0aXR1dGVbaW5kZXhdOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIGZhbHNlOwogfQotaW50IENGWF9DVFRHU1VCVGFibGU6OkdldENvdmVyYWdlSW5kZXgoc3RydWN0IFRDb3ZlcmFnZUZvcm1hdEJhc2UgKkNvdmVyYWdlLCBUVF91aW50MzJfdCBnKQotewotICAgIGludCBpID0gMDsKLSAgICBpZihDb3ZlcmFnZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgc3dpdGNoKENvdmVyYWdlLT5Db3ZlcmFnZUZvcm1hdCkgewotICAgICAgICBjYXNlIDE6IHsKLSAgICAgICAgICAgICAgICBUQ292ZXJhZ2VGb3JtYXQxICpjMSA9IChUQ292ZXJhZ2VGb3JtYXQxKilDb3ZlcmFnZTsKLSAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBjMS0+R2x5cGhDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKChUVF91aW50MzJfdCljMS0+R2x5cGhBcnJheVtpXSA9PSBnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjogewotICAgICAgICAgICAgICAgIFRDb3ZlcmFnZUZvcm1hdDIgKmMyID0gKFRDb3ZlcmFnZUZvcm1hdDIqKUNvdmVyYWdlOwotICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IGMyLT5SYW5nZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgVFRfdWludDMyX3QgcyA9IGMyLT5SYW5nZVJlY29yZFtpXS5TdGFydDsKLSAgICAgICAgICAgICAgICAgICAgVFRfdWludDMyX3QgZSA9IGMyLT5SYW5nZVJlY29yZFtpXS5FbmQ7Ci0gICAgICAgICAgICAgICAgICAgIFRUX3VpbnQzMl90IHNpID0gYzItPlJhbmdlUmVjb3JkW2ldLlN0YXJ0Q292ZXJhZ2VJbmRleDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHMgPD0gZyAmJiBnIDw9IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaSArIGcgLSBzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICB9CitpbnQgQ0ZYX0NUVEdTVUJUYWJsZTo6R2V0Q292ZXJhZ2VJbmRleChzdHJ1Y3QgVENvdmVyYWdlRm9ybWF0QmFzZSogQ292ZXJhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnKSB7CisgIGludCBpID0gMDsKKyAgaWYgKCFDb3ZlcmFnZSkgewogICAgIHJldHVybiAtMTsKLX0KLWJvb2wgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2UoCi0gICAgRlRfQnl0ZXMgc2NyaXB0bGlzdCwKLSAgICBGVF9CeXRlcyBmZWF0dXJlbGlzdCwKLSAgICBGVF9CeXRlcyBsb29rdXBsaXN0KQotewotICAgIFBhcnNlU2NyaXB0TGlzdChzY3JpcHRsaXN0LCAmU2NyaXB0TGlzdCk7Ci0gICAgUGFyc2VGZWF0dXJlTGlzdChmZWF0dXJlbGlzdCwgJkZlYXR1cmVMaXN0KTsKLSAgICBQYXJzZUxvb2t1cExpc3QobG9va3VwbGlzdCwgJkxvb2t1cExpc3QpOwotICAgIHJldHVybiB0cnVlOwotfQotdm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZVNjcmlwdExpc3QoRlRfQnl0ZXMgcmF3LCBzdHJ1Y3QgVFNjcmlwdExpc3QgKnJlYykKLXsKLSAgICBpbnQgaTsKLSAgICBGVF9CeXRlcyBzcCA9IHJhdzsKLSAgICByZWMtPlNjcmlwdENvdW50ID0gR2V0VUludDE2KHNwKTsKLSAgICBpZihyZWMtPlNjcmlwdENvdW50IDw9IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZWMtPlNjcmlwdFJlY29yZCA9IG5ldyBzdHJ1Y3QgVFNjcmlwdFJlY29yZFtyZWMtPlNjcmlwdENvdW50XTsKLSAgICBmb3IoaSA9IDA7IGkgPCByZWMtPlNjcmlwdENvdW50OyBpKyspIHsKLSAgICAgICAgcmVjLT5TY3JpcHRSZWNvcmRbaV0uU2NyaXB0VGFnID0gR2V0VUludDMyKHNwKTsKLSAgICAgICAgVFRfdWludDE2X3Qgb2Zmc2V0ID0gR2V0VUludDE2KHNwKTsKLSAgICAgICAgUGFyc2VTY3JpcHQoCi0gICAgICAgICAgICAmcmF3W29mZnNldF0sCi0gICAgICAgICAgICAmcmVjLT5TY3JpcHRSZWNvcmRbaV0uU2NyaXB0KTsKLSAgICB9Ci19Ci12b2lkIENGWF9DVFRHU1VCVGFibGU6OlBhcnNlU2NyaXB0KEZUX0J5dGVzIHJhdywgc3RydWN0IFRTY3JpcHQgKnJlYykKLXsKLSAgICBpbnQgaTsKLSAgICBGVF9CeXRlcyBzcCA9IHJhdzsKLSAgICByZWMtPkRlZmF1bHRMYW5nU3lzID0gR2V0VUludDE2KHNwKTsKLSAgICByZWMtPkxhbmdTeXNDb3VudCA9IEdldFVJbnQxNihzcCk7Ci0gICAgaWYocmVjLT5MYW5nU3lzQ291bnQgPD0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHJlYy0+TGFuZ1N5c1JlY29yZCA9IG5ldyBzdHJ1Y3QgVExhbmdTeXNSZWNvcmRbcmVjLT5MYW5nU3lzQ291bnRdOwotICAgIGZvcihpID0gMDsgaSA8IHJlYy0+TGFuZ1N5c0NvdW50OyBpKyspIHsKLSAgICAgICAgcmVjLT5MYW5nU3lzUmVjb3JkW2ldLkxhbmdTeXNUYWcgPSBHZXRVSW50MzIoc3ApOwotICAgICAgICBUVF91aW50MTZfdCBvZmZzZXQgPSBHZXRVSW50MTYoc3ApOwotICAgICAgICBQYXJzZUxhbmdTeXMoCi0gICAgICAgICAgICAmcmF3W29mZnNldF0sCi0gICAgICAgICAgICAmcmVjLT5MYW5nU3lzUmVjb3JkW2ldLkxhbmdTeXMpOwotICAgIH0KLX0KLXZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VMYW5nU3lzKEZUX0J5dGVzIHJhdywgc3RydWN0IFRMYW5nU3lzICpyZWMpCi17Ci0gICAgRlRfQnl0ZXMgc3AgPSByYXc7Ci0gICAgcmVjLT5Mb29rdXBPcmRlciA9IEdldFVJbnQxNihzcCk7Ci0gICAgcmVjLT5SZXFGZWF0dXJlSW5kZXggPSBHZXRVSW50MTYoc3ApOwotICAgIHJlYy0+RmVhdHVyZUNvdW50ID0gR2V0VUludDE2KHNwKTsKLSAgICBpZihyZWMtPkZlYXR1cmVDb3VudCA8PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcmVjLT5GZWF0dXJlSW5kZXggPSBuZXcgVFRfdWludDE2X3RbcmVjLT5GZWF0dXJlQ291bnRdOwotICAgIEZYU1lTX21lbXNldDMyKHJlYy0+RmVhdHVyZUluZGV4LCAwLCBzaXplb2YoVFRfdWludDE2X3QpICogcmVjLT5GZWF0dXJlQ291bnQpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVjLT5GZWF0dXJlQ291bnQ7ICsraSkgewotICAgICAgICByZWMtPkZlYXR1cmVJbmRleFtpXSA9IEdldFVJbnQxNihzcCk7Ci0gICAgfQotfQotdm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZUZlYXR1cmVMaXN0KEZUX0J5dGVzIHJhdywgVEZlYXR1cmVMaXN0ICpyZWMpCi17Ci0gICAgaW50IGk7Ci0gICAgRlRfQnl0ZXMgc3AgPSByYXc7Ci0gICAgcmVjLT5GZWF0dXJlQ291bnQgPSBHZXRVSW50MTYoc3ApOwotICAgIGlmKHJlYy0+RmVhdHVyZUNvdW50IDw9IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZWMtPkZlYXR1cmVSZWNvcmQgPSBuZXcgc3RydWN0IFRGZWF0dXJlUmVjb3JkW3JlYy0+RmVhdHVyZUNvdW50XTsKLSAgICBmb3IoaSA9IDA7IGkgPCByZWMtPkZlYXR1cmVDb3VudDsgaSsrKSB7Ci0gICAgICAgIHJlYy0+RmVhdHVyZVJlY29yZFtpXS5GZWF0dXJlVGFnID0gR2V0VUludDMyKHNwKTsKLSAgICAgICAgVFRfdWludDE2X3Qgb2Zmc2V0ID0gR2V0VUludDE2KHNwKTsKLSAgICAgICAgUGFyc2VGZWF0dXJlKAotICAgICAgICAgICAgJnJhd1tvZmZzZXRdLAotICAgICAgICAgICAgJnJlYy0+RmVhdHVyZVJlY29yZFtpXS5GZWF0dXJlKTsKLSAgICB9Ci19Ci12b2lkIENGWF9DVFRHU1VCVGFibGU6OlBhcnNlRmVhdHVyZShGVF9CeXRlcyByYXcsIFRGZWF0dXJlICpyZWMpCi17Ci0gICAgaW50IGk7Ci0gICAgRlRfQnl0ZXMgc3AgPSByYXc7Ci0gICAgcmVjLT5GZWF0dXJlUGFyYW1zID0gR2V0VUludDE2KHNwKTsKLSAgICByZWMtPkxvb2t1cENvdW50ID0gR2V0VUludDE2KHNwKTsKLSAgICBpZihyZWMtPkxvb2t1cENvdW50IDw9IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZWMtPkxvb2t1cExpc3RJbmRleCA9IG5ldyBUVF91aW50MTZfdFtyZWMtPkxvb2t1cENvdW50XTsKLSAgICBmb3IoaSA9IDA7IGkgPCByZWMtPkxvb2t1cENvdW50OyBpKyspIHsKLSAgICAgICAgcmVjLT5Mb29rdXBMaXN0SW5kZXhbaV0gPSBHZXRVSW50MTYoc3ApOwotICAgIH0KLX0KLXZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VMb29rdXBMaXN0KEZUX0J5dGVzIHJhdywgVExvb2t1cExpc3QgKnJlYykKLXsKLSAgICBpbnQgaTsKLSAgICBGVF9CeXRlcyBzcCA9IHJhdzsKLSAgICByZWMtPkxvb2t1cENvdW50ID0gR2V0VUludDE2KHNwKTsKLSAgICBpZihyZWMtPkxvb2t1cENvdW50IDw9IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZWMtPkxvb2t1cCA9IG5ldyBzdHJ1Y3QgVExvb2t1cFtyZWMtPkxvb2t1cENvdW50XTsKLSAgICBmb3IoaSA9IDA7IGkgPCByZWMtPkxvb2t1cENvdW50OyBpKyspIHsKLSAgICAgICAgVFRfdWludDE2X3Qgb2Zmc2V0ID0gR2V0VUludDE2KHNwKTsKLSAgICAgICAgUGFyc2VMb29rdXAoCi0gICAgICAgICAgICAmcmF3W29mZnNldF0sCi0gICAgICAgICAgICAmcmVjLT5Mb29rdXBbaV0pOwotICAgIH0KLX0KLXZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VMb29rdXAoRlRfQnl0ZXMgcmF3LCBUTG9va3VwICpyZWMpCi17Ci0gICAgaW50IGk7Ci0gICAgRlRfQnl0ZXMgc3AgPSByYXc7Ci0gICAgcmVjLT5Mb29rdXBUeXBlID0gR2V0VUludDE2KHNwKTsKLSAgICByZWMtPkxvb2t1cEZsYWcgPSBHZXRVSW50MTYoc3ApOwotICAgIHJlYy0+U3ViVGFibGVDb3VudCA9IEdldFVJbnQxNihzcCk7Ci0gICAgaWYocmVjLT5TdWJUYWJsZUNvdW50IDw9IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZWMtPlN1YlRhYmxlID0gbmV3IHN0cnVjdCBUU3ViVGFibGVCYXNlKltyZWMtPlN1YlRhYmxlQ291bnRdOwotICAgIGZvcihpID0gMDsgaSA8IHJlYy0+U3ViVGFibGVDb3VudDsgaSsrKSB7Ci0gICAgICAgIHJlYy0+U3ViVGFibGVbaV0gPSBOVUxMOwotICAgIH0KLSAgICBpZihyZWMtPkxvb2t1cFR5cGUgIT0gMSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvcihpID0gMDsgaSA8IHJlYy0+U3ViVGFibGVDb3VudDsgaSsrKSB7Ci0gICAgICAgIFRUX3VpbnQxNl90IG9mZnNldCA9IEdldFVJbnQxNihzcCk7Ci0gICAgICAgIFBhcnNlU2luZ2xlU3Vic3QoCi0gICAgICAgICAgICAmcmF3W29mZnNldF0sCi0gICAgICAgICAgICAmcmVjLT5TdWJUYWJsZVtpXSk7Ci0gICAgfQotfQotdm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZUNvdmVyYWdlKEZUX0J5dGVzIHJhdywgVENvdmVyYWdlRm9ybWF0QmFzZSAqKnJlYykKLXsKLSAgICBGVF9CeXRlcyBzcCA9IHJhdzsKLSAgICBUVF91aW50MTZfdCBGb3JtYXQgPSBHZXRVSW50MTYoc3ApOwotICAgIHN3aXRjaChGb3JtYXQpIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgKnJlYyA9IG5ldyBUQ292ZXJhZ2VGb3JtYXQxKCk7Ci0gICAgICAgICAgICBQYXJzZUNvdmVyYWdlRm9ybWF0MShyYXcsIChUQ292ZXJhZ2VGb3JtYXQxKikqcmVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAqcmVjID0gbmV3IFRDb3ZlcmFnZUZvcm1hdDIoKTsKLSAgICAgICAgICAgIFBhcnNlQ292ZXJhZ2VGb3JtYXQyKHJhdywgKFRDb3ZlcmFnZUZvcm1hdDIqKSpyZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotdm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZUNvdmVyYWdlRm9ybWF0MShGVF9CeXRlcyByYXcsIFRDb3ZlcmFnZUZvcm1hdDEgKnJlYykKLXsKLSAgICBpbnQgaTsKLSAgICBGVF9CeXRlcyBzcCA9IHJhdzsKLSAgICBHZXRVSW50MTYoc3ApOwotICAgIHJlYy0+R2x5cGhDb3VudCA9IEdldFVJbnQxNihzcCk7Ci0gICAgaWYocmVjLT5HbHlwaENvdW50IDw9IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZWMtPkdseXBoQXJyYXkgPSBuZXcgVFRfdWludDE2X3RbcmVjLT5HbHlwaENvdW50XTsKLSAgICBmb3IoaSA9IDA7IGkgPCByZWMtPkdseXBoQ291bnQ7IGkrKykgewotICAgICAgICByZWMtPkdseXBoQXJyYXlbaV0gPSBHZXRVSW50MTYoc3ApOwotICAgIH0KLX0KLXZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VDb3ZlcmFnZUZvcm1hdDIoRlRfQnl0ZXMgcmF3LCBUQ292ZXJhZ2VGb3JtYXQyICpyZWMpCi17Ci0gICAgaW50IGk7Ci0gICAgRlRfQnl0ZXMgc3AgPSByYXc7Ci0gICAgR2V0VUludDE2KHNwKTsKLSAgICByZWMtPlJhbmdlQ291bnQgPSBHZXRVSW50MTYoc3ApOwotICAgIGlmKHJlYy0+UmFuZ2VDb3VudCA8PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcmVjLT5SYW5nZVJlY29yZCA9IG5ldyBUUmFuZ2VSZWNvcmRbcmVjLT5SYW5nZUNvdW50XTsKLSAgICBmb3IoaSA9IDA7IGkgPCByZWMtPlJhbmdlQ291bnQ7IGkrKykgewotICAgICAgICByZWMtPlJhbmdlUmVjb3JkW2ldLlN0YXJ0ID0gR2V0VUludDE2KHNwKTsKLSAgICAgICAgcmVjLT5SYW5nZVJlY29yZFtpXS5FbmQgPSBHZXRVSW50MTYoc3ApOwotICAgICAgICByZWMtPlJhbmdlUmVjb3JkW2ldLlN0YXJ0Q292ZXJhZ2VJbmRleCA9IEdldFVJbnQxNihzcCk7Ci0gICAgfQotfQotdm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZVNpbmdsZVN1YnN0KEZUX0J5dGVzIHJhdywgVFN1YlRhYmxlQmFzZSAqKnJlYykKLXsKLSAgICBGVF9CeXRlcyBzcCA9IHJhdzsKLSAgICBUVF91aW50MTZfdCBGb3JtYXQgPSBHZXRVSW50MTYoc3ApOwotICAgIHN3aXRjaChGb3JtYXQpIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgKnJlYyA9IG5ldyBUU2luZ2xlU3Vic3RGb3JtYXQxKCk7Ci0gICAgICAgICAgICBQYXJzZVNpbmdsZVN1YnN0Rm9ybWF0MShyYXcsIChUU2luZ2xlU3Vic3RGb3JtYXQxKikqcmVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAqcmVjID0gbmV3IFRTaW5nbGVTdWJzdEZvcm1hdDIoKTsKLSAgICAgICAgICAgIFBhcnNlU2luZ2xlU3Vic3RGb3JtYXQyKHJhdywgKFRTaW5nbGVTdWJzdEZvcm1hdDIqKSpyZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotdm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZVNpbmdsZVN1YnN0Rm9ybWF0MShGVF9CeXRlcyByYXcsIFRTaW5nbGVTdWJzdEZvcm1hdDEgKnJlYykKLXsKLSAgICBGVF9CeXRlcyBzcCA9IHJhdzsKLSAgICBHZXRVSW50MTYoc3ApOwotICAgIFRUX3VpbnQxNl90IG9mZnNldCA9IEdldFVJbnQxNihzcCk7Ci0gICAgUGFyc2VDb3ZlcmFnZSgKLSAgICAgICAgJnJhd1tvZmZzZXRdLAotICAgICAgICAmcmVjLT5Db3ZlcmFnZSk7Ci0gICAgcmVjLT5EZWx0YUdseXBoSUQgPSBHZXRJbnQxNihzcCk7Ci19Ci12b2lkIENGWF9DVFRHU1VCVGFibGU6OlBhcnNlU2luZ2xlU3Vic3RGb3JtYXQyKEZUX0J5dGVzIHJhdywgVFNpbmdsZVN1YnN0Rm9ybWF0MiAqcmVjKQotewotICAgIGludCBpOwotICAgIEZUX0J5dGVzIHNwID0gcmF3OwotICAgIEdldFVJbnQxNihzcCk7Ci0gICAgVFRfdWludDE2X3Qgb2Zmc2V0ID0gR2V0VUludDE2KHNwKTsKLSAgICBQYXJzZUNvdmVyYWdlKAotICAgICAgICAmcmF3W29mZnNldF0sCi0gICAgICAgICZyZWMtPkNvdmVyYWdlKTsKLSAgICByZWMtPkdseXBoQ291bnQgPSBHZXRVSW50MTYoc3ApOwotICAgIGlmKHJlYy0+R2x5cGhDb3VudCA8PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcmVjLT5TdWJzdGl0dXRlID0gbmV3IFRUX3VpbnQxNl90W3JlYy0+R2x5cGhDb3VudF07Ci0gICAgZm9yKGkgPSAwOyBpIDwgcmVjLT5HbHlwaENvdW50OyBpKyspIHsKLSAgICAgICAgcmVjLT5TdWJzdGl0dXRlW2ldID0gR2V0VUludDE2KHNwKTsKLSAgICB9Ci19Ci1GWF9CT09MIENGWF9HU1VCVGFibGU6OkdldFZlcnRpY2FsR2x5cGgoRlhfRFdPUkQgZ2x5cGhudW0sIEZYX0RXT1JEKiB2Z2x5cGhudW0pCi17Ci0gICAgcmV0dXJuIG1fR3N1YkltcC5HZXRWZXJ0aWNhbEdseXBoKGdseXBobnVtLCB2Z2x5cGhudW0pOwotfQotSUZYX0dTVUJUYWJsZSogRlhHRV9DcmVhdGVHU1VCVGFibGUoQ0ZYX0ZvbnQqIHBGb250KQotewotICAgIGlmICghcEZvbnQpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChOVUxMID09IHBGb250LT5tX3BHc3ViRGF0YSkgewotICAgICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aCA9IDA7Ci0gICAgICAgIGludCBlcnJvciA9IEZYRlRfTG9hZF9TZm50X1RhYmxlKHBGb250LT5tX0ZhY2UsIEZUX01BS0VfVEFHKCdHJywgJ1MnLCAnVScsICdCJyksIDAsIE5VTEwsICZsZW5ndGgpOwotICAgICAgICBpZiAoIWVycm9yKSB7Ci0gICAgICAgICAgICBwRm9udC0+bV9wR3N1YkRhdGEgPSAodW5zaWduZWQgY2hhciopRlhfQWxsb2MoRlhfQllURSwgbGVuZ3RoKTsKKyAgfQorICBzd2l0Y2ggKENvdmVyYWdlLT5Db3ZlcmFnZUZvcm1hdCkgeworICAgIGNhc2UgMTogeworICAgICAgVENvdmVyYWdlRm9ybWF0MSogYzEgPSAoVENvdmVyYWdlRm9ybWF0MSopQ292ZXJhZ2U7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgYzEtPkdseXBoQ291bnQ7IGkrKykgeworICAgICAgICBpZiAoKHVpbnQzMl90KWMxLT5HbHlwaEFycmF5W2ldID09IGcpIHsKKyAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgfQotICAgICAgICBpZiAoIXBGb250LT5tX3BHc3ViRGF0YSkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgaW50IGVycm9yID0gRlhGVF9Mb2FkX1NmbnRfVGFibGUocEZvbnQtPm1fRmFjZSwgRlRfTUFLRV9UQUcoJ0cnLCAnUycsICdVJywgJ0InKSwgMCwgcEZvbnQtPm1fcEdzdWJEYXRhLCBOVUxMKTsKLSAgICBpZiAoIWVycm9yICYmIHBGb250LT5tX3BHc3ViRGF0YSkgewotICAgICAgICBDRlhfR1NVQlRhYmxlKiBwR3N1YlRhYmxlID0gbmV3IENGWF9HU1VCVGFibGU7Ci0gICAgICAgIGlmIChwR3N1YlRhYmxlLT5tX0dzdWJJbXAuTG9hZEdTVUJUYWJsZSgoRlRfQnl0ZXMpcEZvbnQtPm1fcEdzdWJEYXRhKSkgewotICAgICAgICAgICAgcmV0dXJuIHBHc3ViVGFibGU7CisgICAgY2FzZSAyOiB7CisgICAgICBUQ292ZXJhZ2VGb3JtYXQyKiBjMiA9IChUQ292ZXJhZ2VGb3JtYXQyKilDb3ZlcmFnZTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBjMi0+UmFuZ2VDb3VudDsgaSsrKSB7CisgICAgICAgIHVpbnQzMl90IHMgPSBjMi0+UmFuZ2VSZWNvcmRbaV0uU3RhcnQ7CisgICAgICAgIHVpbnQzMl90IGUgPSBjMi0+UmFuZ2VSZWNvcmRbaV0uRW5kOworICAgICAgICB1aW50MzJfdCBzaSA9IGMyLT5SYW5nZVJlY29yZFtpXS5TdGFydENvdmVyYWdlSW5kZXg7CisgICAgICAgIGlmIChzIDw9IGcgJiYgZyA8PSBlKSB7CisgICAgICAgICAgcmV0dXJuIHNpICsgZyAtIHM7CiAgICAgICAgIH0KLSAgICAgICAgcEdzdWJUYWJsZS0+UmVsZWFzZSgpOworICAgICAgfQorICAgICAgcmV0dXJuIC0xOwogICAgIH0KKyAgfQorICByZXR1cm4gLTE7Cit9Citib29sIENGWF9DVFRHU1VCVGFibGU6OlBhcnNlKEZUX0J5dGVzIHNjcmlwdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzIGZlYXR1cmVsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyBsb29rdXBsaXN0KSB7CisgIFBhcnNlU2NyaXB0TGlzdChzY3JpcHRsaXN0LCAmU2NyaXB0TGlzdCk7CisgIFBhcnNlRmVhdHVyZUxpc3QoZmVhdHVyZWxpc3QsICZGZWF0dXJlTGlzdCk7CisgIFBhcnNlTG9va3VwTGlzdChsb29rdXBsaXN0LCAmTG9va3VwTGlzdCk7CisgIHJldHVybiB0cnVlOworfQordm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZVNjcmlwdExpc3QoRlRfQnl0ZXMgcmF3LCBzdHJ1Y3QgVFNjcmlwdExpc3QqIHJlYykgeworICBpbnQgaTsKKyAgRlRfQnl0ZXMgc3AgPSByYXc7CisgIHJlYy0+U2NyaXB0Q291bnQgPSBHZXRVSW50MTYoc3ApOworICBpZiAocmVjLT5TY3JpcHRDb3VudCA8PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIHJlYy0+U2NyaXB0UmVjb3JkID0gbmV3IHN0cnVjdCBUU2NyaXB0UmVjb3JkW3JlYy0+U2NyaXB0Q291bnRdOworICBmb3IgKGkgPSAwOyBpIDwgcmVjLT5TY3JpcHRDb3VudDsgaSsrKSB7CisgICAgcmVjLT5TY3JpcHRSZWNvcmRbaV0uU2NyaXB0VGFnID0gR2V0VUludDMyKHNwKTsKKyAgICB1aW50MTZfdCBvZmZzZXQgPSBHZXRVSW50MTYoc3ApOworICAgIFBhcnNlU2NyaXB0KCZyYXdbb2Zmc2V0XSwgJnJlYy0+U2NyaXB0UmVjb3JkW2ldLlNjcmlwdCk7CisgIH0KK30KK3ZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VTY3JpcHQoRlRfQnl0ZXMgcmF3LCBzdHJ1Y3QgVFNjcmlwdCogcmVjKSB7CisgIGludCBpOworICBGVF9CeXRlcyBzcCA9IHJhdzsKKyAgcmVjLT5EZWZhdWx0TGFuZ1N5cyA9IEdldFVJbnQxNihzcCk7CisgIHJlYy0+TGFuZ1N5c0NvdW50ID0gR2V0VUludDE2KHNwKTsKKyAgaWYgKHJlYy0+TGFuZ1N5c0NvdW50IDw9IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgcmVjLT5MYW5nU3lzUmVjb3JkID0gbmV3IHN0cnVjdCBUTGFuZ1N5c1JlY29yZFtyZWMtPkxhbmdTeXNDb3VudF07CisgIGZvciAoaSA9IDA7IGkgPCByZWMtPkxhbmdTeXNDb3VudDsgaSsrKSB7CisgICAgcmVjLT5MYW5nU3lzUmVjb3JkW2ldLkxhbmdTeXNUYWcgPSBHZXRVSW50MzIoc3ApOworICAgIHVpbnQxNl90IG9mZnNldCA9IEdldFVJbnQxNihzcCk7CisgICAgUGFyc2VMYW5nU3lzKCZyYXdbb2Zmc2V0XSwgJnJlYy0+TGFuZ1N5c1JlY29yZFtpXS5MYW5nU3lzKTsKKyAgfQorfQordm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZUxhbmdTeXMoRlRfQnl0ZXMgcmF3LCBzdHJ1Y3QgVExhbmdTeXMqIHJlYykgeworICBGVF9CeXRlcyBzcCA9IHJhdzsKKyAgcmVjLT5Mb29rdXBPcmRlciA9IEdldFVJbnQxNihzcCk7CisgIHJlYy0+UmVxRmVhdHVyZUluZGV4ID0gR2V0VUludDE2KHNwKTsKKyAgcmVjLT5GZWF0dXJlQ291bnQgPSBHZXRVSW50MTYoc3ApOworICBpZiAocmVjLT5GZWF0dXJlQ291bnQgPD0gMCkgeworICAgIHJldHVybjsKKyAgfQorICByZWMtPkZlYXR1cmVJbmRleCA9IG5ldyB1aW50MTZfdFtyZWMtPkZlYXR1cmVDb3VudF07CisgIEZYU1lTX21lbXNldChyZWMtPkZlYXR1cmVJbmRleCwgMCwgc2l6ZW9mKHVpbnQxNl90KSAqIHJlYy0+RmVhdHVyZUNvdW50KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWMtPkZlYXR1cmVDb3VudDsgKytpKSB7CisgICAgcmVjLT5GZWF0dXJlSW5kZXhbaV0gPSBHZXRVSW50MTYoc3ApOworICB9Cit9Cit2b2lkIENGWF9DVFRHU1VCVGFibGU6OlBhcnNlRmVhdHVyZUxpc3QoRlRfQnl0ZXMgcmF3LCBURmVhdHVyZUxpc3QqIHJlYykgeworICBpbnQgaTsKKyAgRlRfQnl0ZXMgc3AgPSByYXc7CisgIHJlYy0+RmVhdHVyZUNvdW50ID0gR2V0VUludDE2KHNwKTsKKyAgaWYgKHJlYy0+RmVhdHVyZUNvdW50IDw9IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgcmVjLT5GZWF0dXJlUmVjb3JkID0gbmV3IHN0cnVjdCBURmVhdHVyZVJlY29yZFtyZWMtPkZlYXR1cmVDb3VudF07CisgIGZvciAoaSA9IDA7IGkgPCByZWMtPkZlYXR1cmVDb3VudDsgaSsrKSB7CisgICAgcmVjLT5GZWF0dXJlUmVjb3JkW2ldLkZlYXR1cmVUYWcgPSBHZXRVSW50MzIoc3ApOworICAgIHVpbnQxNl90IG9mZnNldCA9IEdldFVJbnQxNihzcCk7CisgICAgUGFyc2VGZWF0dXJlKCZyYXdbb2Zmc2V0XSwgJnJlYy0+RmVhdHVyZVJlY29yZFtpXS5GZWF0dXJlKTsKKyAgfQorfQordm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZUZlYXR1cmUoRlRfQnl0ZXMgcmF3LCBURmVhdHVyZSogcmVjKSB7CisgIGludCBpOworICBGVF9CeXRlcyBzcCA9IHJhdzsKKyAgcmVjLT5GZWF0dXJlUGFyYW1zID0gR2V0VUludDE2KHNwKTsKKyAgcmVjLT5Mb29rdXBDb3VudCA9IEdldFVJbnQxNihzcCk7CisgIGlmIChyZWMtPkxvb2t1cENvdW50IDw9IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgcmVjLT5Mb29rdXBMaXN0SW5kZXggPSBuZXcgdWludDE2X3RbcmVjLT5Mb29rdXBDb3VudF07CisgIGZvciAoaSA9IDA7IGkgPCByZWMtPkxvb2t1cENvdW50OyBpKyspIHsKKyAgICByZWMtPkxvb2t1cExpc3RJbmRleFtpXSA9IEdldFVJbnQxNihzcCk7CisgIH0KK30KK3ZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VMb29rdXBMaXN0KEZUX0J5dGVzIHJhdywgVExvb2t1cExpc3QqIHJlYykgeworICBpbnQgaTsKKyAgRlRfQnl0ZXMgc3AgPSByYXc7CisgIHJlYy0+TG9va3VwQ291bnQgPSBHZXRVSW50MTYoc3ApOworICBpZiAocmVjLT5Mb29rdXBDb3VudCA8PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIHJlYy0+TG9va3VwID0gbmV3IHN0cnVjdCBUTG9va3VwW3JlYy0+TG9va3VwQ291bnRdOworICBmb3IgKGkgPSAwOyBpIDwgcmVjLT5Mb29rdXBDb3VudDsgaSsrKSB7CisgICAgdWludDE2X3Qgb2Zmc2V0ID0gR2V0VUludDE2KHNwKTsKKyAgICBQYXJzZUxvb2t1cCgmcmF3W29mZnNldF0sICZyZWMtPkxvb2t1cFtpXSk7CisgIH0KK30KK3ZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VMb29rdXAoRlRfQnl0ZXMgcmF3LCBUTG9va3VwKiByZWMpIHsKKyAgaW50IGk7CisgIEZUX0J5dGVzIHNwID0gcmF3OworICByZWMtPkxvb2t1cFR5cGUgPSBHZXRVSW50MTYoc3ApOworICByZWMtPkxvb2t1cEZsYWcgPSBHZXRVSW50MTYoc3ApOworICByZWMtPlN1YlRhYmxlQ291bnQgPSBHZXRVSW50MTYoc3ApOworICBpZiAocmVjLT5TdWJUYWJsZUNvdW50IDw9IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgcmVjLT5TdWJUYWJsZSA9IG5ldyBzdHJ1Y3QgVFN1YlRhYmxlQmFzZSpbcmVjLT5TdWJUYWJsZUNvdW50XTsKKyAgZm9yIChpID0gMDsgaSA8IHJlYy0+U3ViVGFibGVDb3VudDsgaSsrKSB7CisgICAgcmVjLT5TdWJUYWJsZVtpXSA9IE5VTEw7CisgIH0KKyAgaWYgKHJlYy0+TG9va3VwVHlwZSAhPSAxKSB7CisgICAgcmV0dXJuOworICB9CisgIGZvciAoaSA9IDA7IGkgPCByZWMtPlN1YlRhYmxlQ291bnQ7IGkrKykgeworICAgIHVpbnQxNl90IG9mZnNldCA9IEdldFVJbnQxNihzcCk7CisgICAgUGFyc2VTaW5nbGVTdWJzdCgmcmF3W29mZnNldF0sICZyZWMtPlN1YlRhYmxlW2ldKTsKKyAgfQorfQordm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZUNvdmVyYWdlKEZUX0J5dGVzIHJhdywgVENvdmVyYWdlRm9ybWF0QmFzZSoqIHJlYykgeworICBGVF9CeXRlcyBzcCA9IHJhdzsKKyAgdWludDE2X3QgRm9ybWF0ID0gR2V0VUludDE2KHNwKTsKKyAgc3dpdGNoIChGb3JtYXQpIHsKKyAgICBjYXNlIDE6CisgICAgICAqcmVjID0gbmV3IFRDb3ZlcmFnZUZvcm1hdDEoKTsKKyAgICAgIFBhcnNlQ292ZXJhZ2VGb3JtYXQxKHJhdywgKFRDb3ZlcmFnZUZvcm1hdDEqKSpyZWMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgKnJlYyA9IG5ldyBUQ292ZXJhZ2VGb3JtYXQyKCk7CisgICAgICBQYXJzZUNvdmVyYWdlRm9ybWF0MihyYXcsIChUQ292ZXJhZ2VGb3JtYXQyKikqcmVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9Cit2b2lkIENGWF9DVFRHU1VCVGFibGU6OlBhcnNlQ292ZXJhZ2VGb3JtYXQxKEZUX0J5dGVzIHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENvdmVyYWdlRm9ybWF0MSogcmVjKSB7CisgIGludCBpOworICBGVF9CeXRlcyBzcCA9IHJhdzsKKyAgR2V0VUludDE2KHNwKTsKKyAgcmVjLT5HbHlwaENvdW50ID0gR2V0VUludDE2KHNwKTsKKyAgaWYgKHJlYy0+R2x5cGhDb3VudCA8PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIHJlYy0+R2x5cGhBcnJheSA9IG5ldyB1aW50MTZfdFtyZWMtPkdseXBoQ291bnRdOworICBmb3IgKGkgPSAwOyBpIDwgcmVjLT5HbHlwaENvdW50OyBpKyspIHsKKyAgICByZWMtPkdseXBoQXJyYXlbaV0gPSBHZXRVSW50MTYoc3ApOworICB9Cit9Cit2b2lkIENGWF9DVFRHU1VCVGFibGU6OlBhcnNlQ292ZXJhZ2VGb3JtYXQyKEZUX0J5dGVzIHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENvdmVyYWdlRm9ybWF0MiogcmVjKSB7CisgIGludCBpOworICBGVF9CeXRlcyBzcCA9IHJhdzsKKyAgR2V0VUludDE2KHNwKTsKKyAgcmVjLT5SYW5nZUNvdW50ID0gR2V0VUludDE2KHNwKTsKKyAgaWYgKHJlYy0+UmFuZ2VDb3VudCA8PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIHJlYy0+UmFuZ2VSZWNvcmQgPSBuZXcgVFJhbmdlUmVjb3JkW3JlYy0+UmFuZ2VDb3VudF07CisgIGZvciAoaSA9IDA7IGkgPCByZWMtPlJhbmdlQ291bnQ7IGkrKykgeworICAgIHJlYy0+UmFuZ2VSZWNvcmRbaV0uU3RhcnQgPSBHZXRVSW50MTYoc3ApOworICAgIHJlYy0+UmFuZ2VSZWNvcmRbaV0uRW5kID0gR2V0VUludDE2KHNwKTsKKyAgICByZWMtPlJhbmdlUmVjb3JkW2ldLlN0YXJ0Q292ZXJhZ2VJbmRleCA9IEdldFVJbnQxNihzcCk7CisgIH0KK30KK3ZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VTaW5nbGVTdWJzdChGVF9CeXRlcyByYXcsIFRTdWJUYWJsZUJhc2UqKiByZWMpIHsKKyAgRlRfQnl0ZXMgc3AgPSByYXc7CisgIHVpbnQxNl90IEZvcm1hdCA9IEdldFVJbnQxNihzcCk7CisgIHN3aXRjaCAoRm9ybWF0KSB7CisgICAgY2FzZSAxOgorICAgICAgKnJlYyA9IG5ldyBUU2luZ2xlU3Vic3RGb3JtYXQxKCk7CisgICAgICBQYXJzZVNpbmdsZVN1YnN0Rm9ybWF0MShyYXcsIChUU2luZ2xlU3Vic3RGb3JtYXQxKikqcmVjKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICpyZWMgPSBuZXcgVFNpbmdsZVN1YnN0Rm9ybWF0MigpOworICAgICAgUGFyc2VTaW5nbGVTdWJzdEZvcm1hdDIocmF3LCAoVFNpbmdsZVN1YnN0Rm9ybWF0MiopKnJlYyk7CisgICAgICBicmVhazsKKyAgfQorfQordm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZVNpbmdsZVN1YnN0Rm9ybWF0MShGVF9CeXRlcyByYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTaW5nbGVTdWJzdEZvcm1hdDEqIHJlYykgeworICBGVF9CeXRlcyBzcCA9IHJhdzsKKyAgR2V0VUludDE2KHNwKTsKKyAgdWludDE2X3Qgb2Zmc2V0ID0gR2V0VUludDE2KHNwKTsKKyAgUGFyc2VDb3ZlcmFnZSgmcmF3W29mZnNldF0sICZyZWMtPkNvdmVyYWdlKTsKKyAgcmVjLT5EZWx0YUdseXBoSUQgPSBHZXRJbnQxNihzcCk7Cit9Cit2b2lkIENGWF9DVFRHU1VCVGFibGU6OlBhcnNlU2luZ2xlU3Vic3RGb3JtYXQyKEZUX0J5dGVzIHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFNpbmdsZVN1YnN0Rm9ybWF0MiogcmVjKSB7CisgIGludCBpOworICBGVF9CeXRlcyBzcCA9IHJhdzsKKyAgR2V0VUludDE2KHNwKTsKKyAgdWludDE2X3Qgb2Zmc2V0ID0gR2V0VUludDE2KHNwKTsKKyAgUGFyc2VDb3ZlcmFnZSgmcmF3W29mZnNldF0sICZyZWMtPkNvdmVyYWdlKTsKKyAgcmVjLT5HbHlwaENvdW50ID0gR2V0VUludDE2KHNwKTsKKyAgaWYgKHJlYy0+R2x5cGhDb3VudCA8PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIHJlYy0+U3Vic3RpdHV0ZSA9IG5ldyB1aW50MTZfdFtyZWMtPkdseXBoQ291bnRdOworICBmb3IgKGkgPSAwOyBpIDwgcmVjLT5HbHlwaENvdW50OyBpKyspIHsKKyAgICByZWMtPlN1YnN0aXR1dGVbaV0gPSBHZXRVSW50MTYoc3ApOworICB9Cit9CitGWF9CT09MIENGWF9HU1VCVGFibGU6OkdldFZlcnRpY2FsR2x5cGgoRlhfRFdPUkQgZ2x5cGhudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHZnbHlwaG51bSkgeworICByZXR1cm4gbV9Hc3ViSW1wLkdldFZlcnRpY2FsR2x5cGgoZ2x5cGhudW0sIHZnbHlwaG51bSk7Cit9CisvLyBzdGF0aWMKK0lGWF9HU1VCVGFibGUqIElGWF9HU1VCVGFibGU6OkNyZWF0ZShDRlhfRm9udCogcEZvbnQpIHsKKyAgaWYgKCFwRm9udCkgewogICAgIHJldHVybiBOVUxMOworICB9CisgIGlmICghcEZvbnQtPkdldFN1YkRhdGEoKSkgeworICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoID0gMDsKKyAgICBpbnQgZXJyb3IgPSBGWEZUX0xvYWRfU2ZudF9UYWJsZSgKKyAgICAgICAgcEZvbnQtPkdldEZhY2UoKSwgRlRfTUFLRV9UQUcoJ0cnLCAnUycsICdVJywgJ0InKSwgMCwgTlVMTCwgJmxlbmd0aCk7CisgICAgaWYgKCFlcnJvcikgeworICAgICAgcEZvbnQtPlNldFN1YkRhdGEoRlhfQWxsb2ModWludDhfdCwgbGVuZ3RoKSk7CisgICAgfQorICAgIGlmICghcEZvbnQtPkdldFN1YkRhdGEoKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisgIGludCBlcnJvciA9CisgICAgICBGWEZUX0xvYWRfU2ZudF9UYWJsZShwRm9udC0+R2V0RmFjZSgpLCBGVF9NQUtFX1RBRygnRycsICdTJywgJ1UnLCAnQicpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvbnQtPkdldFN1YkRhdGEoKSwgTlVMTCk7CisgIGlmICghZXJyb3IgJiYgcEZvbnQtPkdldFN1YkRhdGEoKSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfR1NVQlRhYmxlPiBwR3N1YlRhYmxlKG5ldyBDRlhfR1NVQlRhYmxlKTsKKyAgICBpZiAocEdzdWJUYWJsZS0+bV9Hc3ViSW1wLkxvYWRHU1VCVGFibGUoKEZUX0J5dGVzKXBGb250LT5HZXRTdWJEYXRhKCkpKSB7CisgICAgICByZXR1cm4gcEdzdWJUYWJsZS5yZWxlYXNlKCk7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvdHRnc3VidGFibGUuaCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L3R0Z3N1YnRhYmxlLmgKaW5kZXggYWRmZmY2Ny4uNjA1ZDI1ZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvdHRnc3VidGFibGUuaAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC90dGdzdWJ0YWJsZS5oCkBAIC0xLDQyNiArMSwzNjMgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBDT1JFX1NSQ19GUERGQVBJX0ZQREZfRk9OVF9UVEdTVUJUQUJMRV9IXwogI2RlZmluZSBDT1JFX1NSQ19GUERGQVBJX0ZQREZfRk9OVF9UVEdTVUJUQUJMRV9IXwogCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGdlL2Z4X2ZyZWV0eXBlLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgotI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgPHN0ZGludC5oPgogCi1jbGFzcyBDRlhfR2x5cGhNYXAKLXsKLXB1YmxpYzoKLSAgICBDRlhfR2x5cGhNYXAoKTsKLSAgICB+Q0ZYX0dseXBoTWFwKCk7Ci0gICAgdm9pZAlTZXRBdChpbnQga2V5LCBpbnQgdmFsdWUpOwotICAgIEZYX0JPT0wJTG9va3VwKGludCBrZXksIGludCAmdmFsdWUpOwotcHJvdGVjdGVkOgotICAgIENGWF9CaW5hcnlCdWYJbV9CdWZmZXI7CisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZm9udC5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2ZyZWV0eXBlLmgiCisKK2NsYXNzIENGWF9HbHlwaE1hcCB7CisgcHVibGljOgorICBDRlhfR2x5cGhNYXAoKTsKKyAgfkNGWF9HbHlwaE1hcCgpOworICB2b2lkIFNldEF0KGludCBrZXksIGludCB2YWx1ZSk7CisgIEZYX0JPT0wgTG9va3VwKGludCBrZXksIGludCYgdmFsdWUpOworCisgcHJvdGVjdGVkOgorICBDRlhfQmluYXJ5QnVmIG1fQnVmZmVyOwogfTsKLWNsYXNzIENGWF9DVFRHU1VCVGFibGUgCi17Ci1wdWJsaWM6Ci0gICAgQ0ZYX0NUVEdTVUJUYWJsZSh2b2lkKTogbV9iRmVhdXR1cmVNYXBMb2FkKEZBTFNFKSwgbG9hZGVkKGZhbHNlKSB7fTsKLSAgICBDRlhfQ1RUR1NVQlRhYmxlKEZUX0J5dGVzIGdzdWIpOiBtX2JGZWF1dHVyZU1hcExvYWQoRkFMU0UpLCBsb2FkZWQoZmFsc2UpCi0gICAgewotICAgICAgICBMb2FkR1NVQlRhYmxlKGdzdWIpOworY2xhc3MgQ0ZYX0NUVEdTVUJUYWJsZSB7CisgcHVibGljOgorICBDRlhfQ1RUR1NVQlRhYmxlKHZvaWQpIDogbV9iRmVhdXR1cmVNYXBMb2FkKEZBTFNFKSwgbG9hZGVkKGZhbHNlKSB7fQorICBDRlhfQ1RUR1NVQlRhYmxlKEZUX0J5dGVzIGdzdWIpIDogbV9iRmVhdXR1cmVNYXBMb2FkKEZBTFNFKSwgbG9hZGVkKGZhbHNlKSB7CisgICAgTG9hZEdTVUJUYWJsZShnc3ViKTsKKyAgfQorICB2aXJ0dWFsIH5DRlhfQ1RUR1NVQlRhYmxlKCkge30KKyAgYm9vbCBJc09rKHZvaWQpIGNvbnN0IHsgcmV0dXJuIGxvYWRlZDsgfQorICBib29sIExvYWRHU1VCVGFibGUoRlRfQnl0ZXMgZ3N1Yik7CisgIGJvb2wgR2V0VmVydGljYWxHbHlwaCh1aW50MzJfdCBnbHlwaG51bSwgdWludDMyX3QqIHZnbHlwaG51bSk7CisKKyBwcml2YXRlOgorICBzdHJ1Y3QgdHRfZ3N1Yl9oZWFkZXIgeworICAgIHVpbnQzMl90IFZlcnNpb247CisgICAgdWludDE2X3QgU2NyaXB0TGlzdDsKKyAgICB1aW50MTZfdCBGZWF0dXJlTGlzdDsKKyAgICB1aW50MTZfdCBMb29rdXBMaXN0OworICB9OworICBzdHJ1Y3QgVExhbmdTeXMgeworICAgIHVpbnQxNl90IExvb2t1cE9yZGVyOworICAgIHVpbnQxNl90IFJlcUZlYXR1cmVJbmRleDsKKyAgICB1aW50MTZfdCBGZWF0dXJlQ291bnQ7CisgICAgdWludDE2X3QqIEZlYXR1cmVJbmRleDsKKyAgICBUTGFuZ1N5cygpCisgICAgICAgIDogTG9va3VwT3JkZXIoMCksCisgICAgICAgICAgUmVxRmVhdHVyZUluZGV4KDApLAorICAgICAgICAgIEZlYXR1cmVDb3VudCgwKSwKKyAgICAgICAgICBGZWF0dXJlSW5kZXgoTlVMTCkge30KKyAgICB+VExhbmdTeXMoKSB7IGRlbGV0ZVtdIEZlYXR1cmVJbmRleDsgfQorCisgICBwcml2YXRlOgorICAgIFRMYW5nU3lzKGNvbnN0IFRMYW5nU3lzJik7CisgICAgVExhbmdTeXMmIG9wZXJhdG9yPShjb25zdCBUTGFuZ1N5cyYpOworICB9OworICBzdHJ1Y3QgVExhbmdTeXNSZWNvcmQgeworICAgIHVpbnQzMl90IExhbmdTeXNUYWc7CisgICAgc3RydWN0IFRMYW5nU3lzIExhbmdTeXM7CisgICAgVExhbmdTeXNSZWNvcmQoKSA6IExhbmdTeXNUYWcoMCkge30KKworICAgcHJpdmF0ZToKKyAgICBUTGFuZ1N5c1JlY29yZChjb25zdCBUTGFuZ1N5c1JlY29yZCYpOworICAgIFRMYW5nU3lzUmVjb3JkJiBvcGVyYXRvcj0oY29uc3QgVExhbmdTeXNSZWNvcmQmKTsKKyAgfTsKKyAgc3RydWN0IFRTY3JpcHQgeworICAgIHVpbnQxNl90IERlZmF1bHRMYW5nU3lzOworICAgIHVpbnQxNl90IExhbmdTeXNDb3VudDsKKyAgICBzdHJ1Y3QgVExhbmdTeXNSZWNvcmQqIExhbmdTeXNSZWNvcmQ7CisgICAgVFNjcmlwdCgpIDogRGVmYXVsdExhbmdTeXMoMCksIExhbmdTeXNDb3VudCgwKSwgTGFuZ1N5c1JlY29yZChOVUxMKSB7fQorICAgIH5UU2NyaXB0KCkgeyBkZWxldGVbXSBMYW5nU3lzUmVjb3JkOyB9CisKKyAgIHByaXZhdGU6CisgICAgVFNjcmlwdChjb25zdCBUU2NyaXB0Jik7CisgICAgVFNjcmlwdCYgb3BlcmF0b3I9KGNvbnN0IFRTY3JpcHQmKTsKKyAgfTsKKyAgc3RydWN0IFRTY3JpcHRSZWNvcmQgeworICAgIHVpbnQzMl90IFNjcmlwdFRhZzsKKyAgICBzdHJ1Y3QgVFNjcmlwdCBTY3JpcHQ7CisgICAgVFNjcmlwdFJlY29yZCgpIDogU2NyaXB0VGFnKDApIHt9CisKKyAgIHByaXZhdGU6CisgICAgVFNjcmlwdFJlY29yZChjb25zdCBUU2NyaXB0UmVjb3JkJik7CisgICAgVFNjcmlwdFJlY29yZCYgb3BlcmF0b3I9KGNvbnN0IFRTY3JpcHRSZWNvcmQmKTsKKyAgfTsKKyAgc3RydWN0IFRTY3JpcHRMaXN0IHsKKyAgICB1aW50MTZfdCBTY3JpcHRDb3VudDsKKyAgICBzdHJ1Y3QgVFNjcmlwdFJlY29yZCogU2NyaXB0UmVjb3JkOworICAgIFRTY3JpcHRMaXN0KCkgOiBTY3JpcHRDb3VudCgwKSwgU2NyaXB0UmVjb3JkKE5VTEwpIHt9CisgICAgflRTY3JpcHRMaXN0KCkgeyBkZWxldGVbXSBTY3JpcHRSZWNvcmQ7IH0KKworICAgcHJpdmF0ZToKKyAgICBUU2NyaXB0TGlzdChjb25zdCBUU2NyaXB0TGlzdCYpOworICAgIFRTY3JpcHRMaXN0JiBvcGVyYXRvcj0oY29uc3QgVFNjcmlwdExpc3QmKTsKKyAgfTsKKyAgc3RydWN0IFRGZWF0dXJlIHsKKyAgICB1aW50MTZfdCBGZWF0dXJlUGFyYW1zOworICAgIGludCBMb29rdXBDb3VudDsKKyAgICB1aW50MTZfdCogTG9va3VwTGlzdEluZGV4OworICAgIFRGZWF0dXJlKCkgOiBGZWF0dXJlUGFyYW1zKDApLCBMb29rdXBDb3VudCgwKSwgTG9va3VwTGlzdEluZGV4KE5VTEwpIHt9CisgICAgflRGZWF0dXJlKCkgeyBkZWxldGVbXSBMb29rdXBMaXN0SW5kZXg7IH0KKworICAgcHJpdmF0ZToKKyAgICBURmVhdHVyZShjb25zdCBURmVhdHVyZSYpOworICAgIFRGZWF0dXJlJiBvcGVyYXRvcj0oY29uc3QgVEZlYXR1cmUmKTsKKyAgfTsKKyAgc3RydWN0IFRGZWF0dXJlUmVjb3JkIHsKKyAgICB1aW50MzJfdCBGZWF0dXJlVGFnOworICAgIHN0cnVjdCBURmVhdHVyZSBGZWF0dXJlOworICAgIFRGZWF0dXJlUmVjb3JkKCkgOiBGZWF0dXJlVGFnKDApIHt9CisKKyAgIHByaXZhdGU6CisgICAgVEZlYXR1cmVSZWNvcmQoY29uc3QgVEZlYXR1cmVSZWNvcmQmKTsKKyAgICBURmVhdHVyZVJlY29yZCYgb3BlcmF0b3I9KGNvbnN0IFRGZWF0dXJlUmVjb3JkJik7CisgIH07CisgIHN0cnVjdCBURmVhdHVyZUxpc3QgeworICAgIGludCBGZWF0dXJlQ291bnQ7CisgICAgc3RydWN0IFRGZWF0dXJlUmVjb3JkKiBGZWF0dXJlUmVjb3JkOworICAgIFRGZWF0dXJlTGlzdCgpIDogRmVhdHVyZUNvdW50KDApLCBGZWF0dXJlUmVjb3JkKE5VTEwpIHt9CisgICAgflRGZWF0dXJlTGlzdCgpIHsgZGVsZXRlW10gRmVhdHVyZVJlY29yZDsgfQorCisgICBwcml2YXRlOgorICAgIFRGZWF0dXJlTGlzdChjb25zdCBURmVhdHVyZUxpc3QmKTsKKyAgICBURmVhdHVyZUxpc3QmIG9wZXJhdG9yPShjb25zdCBURmVhdHVyZUxpc3QmKTsKKyAgfTsKKyAgZW51bSBUTG9va3VwRmxhZyB7CisgICAgTE9PS1VQRkxBR19SaWdodFRvTGVmdCA9IDB4MDAwMSwKKyAgICBMT09LVVBGTEFHX0lnbm9yZUJhc2VHbHlwaHMgPSAweDAwMDIsCisgICAgTE9PS1VQRkxBR19JZ25vcmVMaWdhdHVyZXMgPSAweDAwMDQsCisgICAgTE9PS1VQRkxBR19JZ25vcmVNYXJrcyA9IDB4MDAwOCwKKyAgICBMT09LVVBGTEFHX1Jlc2VydmVkID0gMHgwMEYwLAorICAgIExPT0tVUEZMQUdfTWFya0F0dGFjaG1lbnRUeXBlID0gMHhGRjAwLAorICB9OworICBzdHJ1Y3QgVENvdmVyYWdlRm9ybWF0QmFzZSB7CisgICAgdWludDE2X3QgQ292ZXJhZ2VGb3JtYXQ7CisgICAgQ0ZYX0dseXBoTWFwIG1fZ2x5cGhNYXA7CisgICAgVENvdmVyYWdlRm9ybWF0QmFzZSgpIDogQ292ZXJhZ2VGb3JtYXQoMCkge30KKyAgICB2aXJ0dWFsIH5UQ292ZXJhZ2VGb3JtYXRCYXNlKCkge30KKworICAgcHJpdmF0ZToKKyAgICBUQ292ZXJhZ2VGb3JtYXRCYXNlKGNvbnN0IFRDb3ZlcmFnZUZvcm1hdEJhc2UmKTsKKyAgICBUQ292ZXJhZ2VGb3JtYXRCYXNlJiBvcGVyYXRvcj0oY29uc3QgVENvdmVyYWdlRm9ybWF0QmFzZSYpOworICB9OworICBzdHJ1Y3QgVENvdmVyYWdlRm9ybWF0MSA6IHB1YmxpYyBUQ292ZXJhZ2VGb3JtYXRCYXNlIHsKKyAgICB1aW50MTZfdCBHbHlwaENvdW50OworICAgIHVpbnQxNl90KiBHbHlwaEFycmF5OworICAgIFRDb3ZlcmFnZUZvcm1hdDEoKSA6IEdseXBoQ291bnQoMCksIEdseXBoQXJyYXkoTlVMTCkgeyBDb3ZlcmFnZUZvcm1hdCA9IDE7IH0KKyAgICB+VENvdmVyYWdlRm9ybWF0MSgpIG92ZXJyaWRlIHsgZGVsZXRlW10gR2x5cGhBcnJheTsgfQorCisgICBwcml2YXRlOgorICAgIFRDb3ZlcmFnZUZvcm1hdDEoY29uc3QgVENvdmVyYWdlRm9ybWF0MSYpOworICAgIFRDb3ZlcmFnZUZvcm1hdDEmIG9wZXJhdG9yPShjb25zdCBUQ292ZXJhZ2VGb3JtYXQxJik7CisgIH07CisgIHN0cnVjdCBUUmFuZ2VSZWNvcmQgeworICAgIHVpbnQxNl90IFN0YXJ0OworICAgIHVpbnQxNl90IEVuZDsKKyAgICB1aW50MTZfdCBTdGFydENvdmVyYWdlSW5kZXg7CisgICAgVFJhbmdlUmVjb3JkKCkgOiBTdGFydCgwKSwgRW5kKDApLCBTdGFydENvdmVyYWdlSW5kZXgoMCkge30KKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj4oY29uc3QgVFJhbmdlUmVjb3JkJiByMSwgY29uc3QgVFJhbmdlUmVjb3JkJiByMikgeworICAgICAgcmV0dXJuIHIxLlN0YXJ0ID4gcjIuU3RhcnQ7CiAgICAgfQotICAgIHZpcnR1YWwgfkNGWF9DVFRHU1VCVGFibGUoKSB7fQotICAgIGJvb2wgSXNPayh2b2lkKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGxvYWRlZDsKKworICAgcHJpdmF0ZToKKyAgICBUUmFuZ2VSZWNvcmQoY29uc3QgVFJhbmdlUmVjb3JkJik7CisgIH07CisgIHN0cnVjdCBUQ292ZXJhZ2VGb3JtYXQyIDogcHVibGljIFRDb3ZlcmFnZUZvcm1hdEJhc2UgeworICAgIHVpbnQxNl90IFJhbmdlQ291bnQ7CisgICAgc3RydWN0IFRSYW5nZVJlY29yZCogUmFuZ2VSZWNvcmQ7CisgICAgVENvdmVyYWdlRm9ybWF0MigpIDogUmFuZ2VDb3VudCgwKSwgUmFuZ2VSZWNvcmQoTlVMTCkgeworICAgICAgQ292ZXJhZ2VGb3JtYXQgPSAyOwogICAgIH0KLSAgICBib29sIExvYWRHU1VCVGFibGUoRlRfQnl0ZXMgZ3N1Yik7Ci0gICAgYm9vbCBHZXRWZXJ0aWNhbEdseXBoKFRUX3VpbnQzMl90IGdseXBobnVtLCBUVF91aW50MzJfdCAqdmdseXBobnVtKTsKLXByaXZhdGU6Ci0gICAgc3RydWN0IHR0X2dzdWJfaGVhZGVyIHsKLSAgICAgICAgVFRfdWludDMyX3QgVmVyc2lvbjsKLSAgICAgICAgVFRfdWludDE2X3QgU2NyaXB0TGlzdDsKLSAgICAgICAgVFRfdWludDE2X3QgRmVhdHVyZUxpc3Q7Ci0gICAgICAgIFRUX3VpbnQxNl90IExvb2t1cExpc3Q7Ci0gICAgfTsKLSAgICBzdHJ1Y3QgVExhbmdTeXMgewotICAgICAgICBUVF91aW50MTZfdCBMb29rdXBPcmRlcjsKLSAgICAgICAgVFRfdWludDE2X3QgUmVxRmVhdHVyZUluZGV4OwotICAgICAgICBUVF91aW50MTZfdCBGZWF0dXJlQ291bnQ7Ci0gICAgICAgIFRUX3VpbnQxNl90ICpGZWF0dXJlSW5kZXg7Ci0gICAgICAgIFRMYW5nU3lzKCk6IExvb2t1cE9yZGVyKDApLCBSZXFGZWF0dXJlSW5kZXgoMCksIEZlYXR1cmVDb3VudCgwKSwgRmVhdHVyZUluZGV4KE5VTEwpIHt9Ci0gICAgICAgIH5UTGFuZ1N5cygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKEZlYXR1cmVJbmRleCkgewotICAgICAgICAgICAgICAgIGRlbGV0ZVtdIEZlYXR1cmVJbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIHByaXZhdGU6Ci0gICAgICAgIFRMYW5nU3lzKGNvbnN0IFRMYW5nU3lzJik7Ci0gICAgICAgIFRMYW5nU3lzJiBvcGVyYXRvcj0oY29uc3QgVExhbmdTeXMmKTsKLSAgICB9OwotICAgIHN0cnVjdCBUTGFuZ1N5c1JlY29yZCB7Ci0gICAgICAgIFRUX3VpbnQzMl90IExhbmdTeXNUYWc7Ci0gICAgICAgIHN0cnVjdCBUTGFuZ1N5cyBMYW5nU3lzOwotICAgICAgICBUTGFuZ1N5c1JlY29yZCgpOiBMYW5nU3lzVGFnKDApIHt9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgVExhbmdTeXNSZWNvcmQoY29uc3QgVExhbmdTeXNSZWNvcmQmKTsKLSAgICAgICAgVExhbmdTeXNSZWNvcmQmIG9wZXJhdG9yPShjb25zdCBUTGFuZ1N5c1JlY29yZCYpOwotICAgIH07Ci0gICAgc3RydWN0IFRTY3JpcHQgewotICAgICAgICBUVF91aW50MTZfdCBEZWZhdWx0TGFuZ1N5czsKLSAgICAgICAgVFRfdWludDE2X3QgTGFuZ1N5c0NvdW50OwotICAgICAgICBzdHJ1Y3QgVExhbmdTeXNSZWNvcmQgKkxhbmdTeXNSZWNvcmQ7Ci0gICAgICAgIFRTY3JpcHQoKTogRGVmYXVsdExhbmdTeXMoMCksIExhbmdTeXNDb3VudCgwKSwgTGFuZ1N5c1JlY29yZChOVUxMKSB7fQotICAgICAgICB+VFNjcmlwdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKExhbmdTeXNSZWNvcmQpIHsKLSAgICAgICAgICAgICAgICBkZWxldGVbXSBMYW5nU3lzUmVjb3JkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgVFNjcmlwdChjb25zdCBUU2NyaXB0Jik7Ci0gICAgICAgIFRTY3JpcHQmIG9wZXJhdG9yPShjb25zdCBUU2NyaXB0Jik7Ci0gICAgfTsKLSAgICBzdHJ1Y3QgVFNjcmlwdFJlY29yZCB7Ci0gICAgICAgIFRUX3VpbnQzMl90IFNjcmlwdFRhZzsKLSAgICAgICAgc3RydWN0IFRTY3JpcHQgU2NyaXB0OwotICAgICAgICBUU2NyaXB0UmVjb3JkKCk6IFNjcmlwdFRhZygwKSB7fQotICAgIHByaXZhdGU6Ci0gICAgICAgIFRTY3JpcHRSZWNvcmQoY29uc3QgVFNjcmlwdFJlY29yZCYpOwotICAgICAgICBUU2NyaXB0UmVjb3JkJiBvcGVyYXRvcj0oY29uc3QgVFNjcmlwdFJlY29yZCYpOwotICAgIH07Ci0gICAgc3RydWN0IFRTY3JpcHRMaXN0IHsKLSAgICAgICAgVFRfdWludDE2X3QgU2NyaXB0Q291bnQ7Ci0gICAgICAgIHN0cnVjdCBUU2NyaXB0UmVjb3JkICpTY3JpcHRSZWNvcmQ7Ci0gICAgICAgIFRTY3JpcHRMaXN0KCk6IFNjcmlwdENvdW50KDApLCBTY3JpcHRSZWNvcmQoTlVMTCkge30KLSAgICAgICAgflRTY3JpcHRMaXN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoU2NyaXB0UmVjb3JkKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlW10gU2NyaXB0UmVjb3JkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgVFNjcmlwdExpc3QoY29uc3QgVFNjcmlwdExpc3QmKTsKLSAgICAgICAgVFNjcmlwdExpc3QmIG9wZXJhdG9yPShjb25zdCBUU2NyaXB0TGlzdCYpOwotICAgIH07Ci0gICAgc3RydWN0IFRGZWF0dXJlIHsKLSAgICAgICAgVFRfdWludDE2X3QgRmVhdHVyZVBhcmFtczsKLSAgICAgICAgaW50IExvb2t1cENvdW50OwotICAgICAgICBUVF91aW50MTZfdCAqTG9va3VwTGlzdEluZGV4OwotICAgICAgICBURmVhdHVyZSgpOiBGZWF0dXJlUGFyYW1zKDApLCBMb29rdXBDb3VudCgwKSwgTG9va3VwTGlzdEluZGV4KE5VTEwpIHt9Ci0gICAgICAgIH5URmVhdHVyZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKExvb2t1cExpc3RJbmRleCkgewotICAgICAgICAgICAgICAgIGRlbGV0ZVtdIExvb2t1cExpc3RJbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIHByaXZhdGU6Ci0gICAgICAgIFRGZWF0dXJlKGNvbnN0IFRGZWF0dXJlJik7Ci0gICAgICAgIFRGZWF0dXJlJiBvcGVyYXRvcj0oY29uc3QgVEZlYXR1cmUmKTsKLSAgICB9OwotICAgIHN0cnVjdCBURmVhdHVyZVJlY29yZCB7Ci0gICAgICAgIFRUX3VpbnQzMl90IEZlYXR1cmVUYWc7Ci0gICAgICAgIHN0cnVjdCBURmVhdHVyZSBGZWF0dXJlOwotICAgICAgICBURmVhdHVyZVJlY29yZCgpOiBGZWF0dXJlVGFnKDApIHt9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgVEZlYXR1cmVSZWNvcmQoY29uc3QgVEZlYXR1cmVSZWNvcmQmKTsKLSAgICAgICAgVEZlYXR1cmVSZWNvcmQmIG9wZXJhdG9yPShjb25zdCBURmVhdHVyZVJlY29yZCYpOwotICAgIH07Ci0gICAgc3RydWN0IFRGZWF0dXJlTGlzdCB7Ci0gICAgICAgIGludCBGZWF0dXJlQ291bnQ7Ci0gICAgICAgIHN0cnVjdCBURmVhdHVyZVJlY29yZCAqRmVhdHVyZVJlY29yZDsKLSAgICAgICAgVEZlYXR1cmVMaXN0KCk6IEZlYXR1cmVDb3VudCgwKSwgRmVhdHVyZVJlY29yZChOVUxMKSB7fQotICAgICAgICB+VEZlYXR1cmVMaXN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoRmVhdHVyZVJlY29yZCkgewotICAgICAgICAgICAgICAgIGRlbGV0ZVtdIEZlYXR1cmVSZWNvcmQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICBwcml2YXRlOgotICAgICAgICBURmVhdHVyZUxpc3QoY29uc3QgVEZlYXR1cmVMaXN0Jik7Ci0gICAgICAgIFRGZWF0dXJlTGlzdCYgb3BlcmF0b3I9KGNvbnN0IFRGZWF0dXJlTGlzdCYpOwotICAgIH07Ci0gICAgZW51bSBUTG9va3VwRmxhZyB7Ci0gICAgICAgIExPT0tVUEZMQUdfUmlnaHRUb0xlZnQgPSAweDAwMDEsCi0gICAgICAgIExPT0tVUEZMQUdfSWdub3JlQmFzZUdseXBocyA9IDB4MDAwMiwKLSAgICAgICAgTE9PS1VQRkxBR19JZ25vcmVMaWdhdHVyZXMgPSAweDAwMDQsCi0gICAgICAgIExPT0tVUEZMQUdfSWdub3JlTWFya3MgPSAweDAwMDgsCi0gICAgICAgIExPT0tVUEZMQUdfUmVzZXJ2ZWQgPSAweDAwRjAsCi0gICAgICAgIExPT0tVUEZMQUdfTWFya0F0dGFjaG1lbnRUeXBlID0gMHhGRjAwLAotICAgIH07Ci0gICAgc3RydWN0IFRDb3ZlcmFnZUZvcm1hdEJhc2UgewotICAgICAgICBUVF91aW50MTZfdCBDb3ZlcmFnZUZvcm1hdDsKLSAgICAgICAgQ0ZYX0dseXBoTWFwIG1fZ2x5cGhNYXA7Ci0gICAgICAgIFRDb3ZlcmFnZUZvcm1hdEJhc2UoKTogQ292ZXJhZ2VGb3JtYXQoMCkge30KLSAgICAgICAgdmlydHVhbCB+VENvdmVyYWdlRm9ybWF0QmFzZSgpIHt9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgVENvdmVyYWdlRm9ybWF0QmFzZShjb25zdCBUQ292ZXJhZ2VGb3JtYXRCYXNlJik7Ci0gICAgICAgIFRDb3ZlcmFnZUZvcm1hdEJhc2UmIG9wZXJhdG9yPShjb25zdCBUQ292ZXJhZ2VGb3JtYXRCYXNlJik7Ci0gICAgfTsKLSAgICBzdHJ1Y3QgVENvdmVyYWdlRm9ybWF0MTogcHVibGljIFRDb3ZlcmFnZUZvcm1hdEJhc2UgewotICAgICAgICBUVF91aW50MTZfdCBHbHlwaENvdW50OwotICAgICAgICBUVF91aW50MTZfdCAqR2x5cGhBcnJheTsKLSAgICAgICAgVENvdmVyYWdlRm9ybWF0MSgpOiBHbHlwaENvdW50KDApLCBHbHlwaEFycmF5KE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvdmVyYWdlRm9ybWF0ID0gMTsKLSAgICAgICAgfQotICAgICAgICB+VENvdmVyYWdlRm9ybWF0MSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKEdseXBoQXJyYXkpIHsKLSAgICAgICAgICAgICAgICBkZWxldGVbXSBHbHlwaEFycmF5OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgVENvdmVyYWdlRm9ybWF0MShjb25zdCBUQ292ZXJhZ2VGb3JtYXQxJik7Ci0gICAgICAgIFRDb3ZlcmFnZUZvcm1hdDEmIG9wZXJhdG9yPShjb25zdCBUQ292ZXJhZ2VGb3JtYXQxJik7Ci0gICAgfTsKLSAgICBzdHJ1Y3QgVFJhbmdlUmVjb3JkIHsKLSAgICAgICAgVFRfdWludDE2X3QgU3RhcnQ7Ci0gICAgICAgIFRUX3VpbnQxNl90IEVuZDsKLSAgICAgICAgVFRfdWludDE2X3QgU3RhcnRDb3ZlcmFnZUluZGV4OwotICAgICAgICBUUmFuZ2VSZWNvcmQoKTogU3RhcnQoMCksIEVuZCgwKSwgU3RhcnRDb3ZlcmFnZUluZGV4KDApIHt9Ci0gICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yID4gKGNvbnN0IFRSYW5nZVJlY29yZCAmcjEsIGNvbnN0IFRSYW5nZVJlY29yZCAmcjIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByMS5TdGFydCA+IHIyLlN0YXJ0OwotICAgICAgICB9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgVFJhbmdlUmVjb3JkKGNvbnN0IFRSYW5nZVJlY29yZCYpOwotICAgIH07Ci0gICAgc3RydWN0IFRDb3ZlcmFnZUZvcm1hdDI6IHB1YmxpYyBUQ292ZXJhZ2VGb3JtYXRCYXNlIHsKLSAgICAgICAgVFRfdWludDE2X3QgUmFuZ2VDb3VudDsKLSAgICAgICAgc3RydWN0IFRSYW5nZVJlY29yZCAqUmFuZ2VSZWNvcmQ7Ci0gICAgICAgIFRDb3ZlcmFnZUZvcm1hdDIoKTogUmFuZ2VDb3VudCgwKSwgUmFuZ2VSZWNvcmQoTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgQ292ZXJhZ2VGb3JtYXQgPSAyOwotICAgICAgICB9Ci0gICAgICAgIH5UQ292ZXJhZ2VGb3JtYXQyKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoUmFuZ2VSZWNvcmQpIHsKLSAgICAgICAgICAgICAgICBkZWxldGVbXSBSYW5nZVJlY29yZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIHByaXZhdGU6Ci0gICAgICAgIFRDb3ZlcmFnZUZvcm1hdDIoY29uc3QgVENvdmVyYWdlRm9ybWF0MiYpOwotICAgICAgICBUQ292ZXJhZ2VGb3JtYXQyJiBvcGVyYXRvcj0oY29uc3QgVENvdmVyYWdlRm9ybWF0MiYpOwotICAgIH07Ci0gICAgc3RydWN0IFRDbGFzc0RlZkZvcm1hdEJhc2UgewotICAgICAgICBUVF91aW50MTZfdCBDbGFzc0Zvcm1hdDsKLSAgICAgICAgVENsYXNzRGVmRm9ybWF0QmFzZSgpOiBDbGFzc0Zvcm1hdCgwKSB7fQotICAgICAgICB2aXJ0dWFsIH5UQ2xhc3NEZWZGb3JtYXRCYXNlKCkge30KLSAgICBwcml2YXRlOgotICAgICAgICBUQ2xhc3NEZWZGb3JtYXRCYXNlKGNvbnN0IFRDbGFzc0RlZkZvcm1hdEJhc2UmKTsKLSAgICAgICAgVENsYXNzRGVmRm9ybWF0QmFzZSYgb3BlcmF0b3I9KGNvbnN0IFRDbGFzc0RlZkZvcm1hdEJhc2UmKTsKLSAgICB9OwotICAgIHN0cnVjdCBUQ2xhc3NEZWZGb3JtYXQxOiBwdWJsaWMgVENsYXNzRGVmRm9ybWF0QmFzZSB7Ci0gICAgICAgIFRUX3VpbnQxNl90IFN0YXJ0R2x5cGg7Ci0gICAgICAgIFRUX3VpbnQxNl90IEdseXBoQ291bnQ7Ci0gICAgICAgIFRUX3VpbnQxNl90ICpDbGFzc1ZhbHVlQXJyYXk7Ci0gICAgICAgIFRDbGFzc0RlZkZvcm1hdDEoKTogU3RhcnRHbHlwaCgwKSwgR2x5cGhDb3VudCgwKSwgQ2xhc3NWYWx1ZUFycmF5KE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENsYXNzRm9ybWF0ID0gMTsKLSAgICAgICAgfQotICAgICAgICB+VENsYXNzRGVmRm9ybWF0MSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKENsYXNzVmFsdWVBcnJheSkgewotICAgICAgICAgICAgICAgIGRlbGV0ZVtdIENsYXNzVmFsdWVBcnJheTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIHByaXZhdGU6Ci0gICAgICAgIFRDbGFzc0RlZkZvcm1hdDEoY29uc3QgVENsYXNzRGVmRm9ybWF0MSYpOwotICAgICAgICBUQ2xhc3NEZWZGb3JtYXQxJiBvcGVyYXRvcj0oY29uc3QgVENsYXNzRGVmRm9ybWF0MSYpOwotICAgIH07Ci0gICAgc3RydWN0IFRDbGFzc1JhbmdlUmVjb3JkIHsKLSAgICAgICAgVFRfdWludDE2X3QgU3RhcnQ7Ci0gICAgICAgIFRUX3VpbnQxNl90IEVuZDsKLSAgICAgICAgVFRfdWludDE2X3QgQ2xhc3M7Ci0gICAgICAgIFRDbGFzc1JhbmdlUmVjb3JkKCk6IFN0YXJ0KDApLCBFbmQoMCksIENsYXNzKDApIHt9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgVENsYXNzUmFuZ2VSZWNvcmQoY29uc3QgVENsYXNzUmFuZ2VSZWNvcmQmKTsKLSAgICAgICAgVENsYXNzUmFuZ2VSZWNvcmQmIG9wZXJhdG9yPShjb25zdCBUQ2xhc3NSYW5nZVJlY29yZCYpOwotICAgIH07Ci0gICAgc3RydWN0IFRDbGFzc0RlZkZvcm1hdDI6IHB1YmxpYyBUQ2xhc3NEZWZGb3JtYXRCYXNlIHsKLSAgICAgICAgVFRfdWludDE2X3QgQ2xhc3NSYW5nZUNvdW50OwotICAgICAgICBzdHJ1Y3QgVENsYXNzUmFuZ2VSZWNvcmQgKkNsYXNzUmFuZ2VSZWNvcmQ7Ci0gICAgICAgIFRDbGFzc0RlZkZvcm1hdDIoKTogQ2xhc3NSYW5nZUNvdW50KDApLCBDbGFzc1JhbmdlUmVjb3JkKE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENsYXNzRm9ybWF0ID0gMjsKLSAgICAgICAgfQotICAgICAgICB+VENsYXNzRGVmRm9ybWF0MigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKENsYXNzUmFuZ2VSZWNvcmQpIHsKLSAgICAgICAgICAgICAgICBkZWxldGVbXSBDbGFzc1JhbmdlUmVjb3JkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgVENsYXNzRGVmRm9ybWF0Mihjb25zdCBUQ2xhc3NEZWZGb3JtYXQyJik7Ci0gICAgICAgIFRDbGFzc0RlZkZvcm1hdDImIG9wZXJhdG9yPShjb25zdCBUQ2xhc3NEZWZGb3JtYXQyJik7Ci0gICAgfTsKLSAgICBzdHJ1Y3QgVERldmljZSB7Ci0gICAgICAgIFRUX3VpbnQxNl90IFN0YXJ0U2l6ZTsKLSAgICAgICAgVFRfdWludDE2X3QgRW5kU2l6ZTsKLSAgICAgICAgVFRfdWludDE2X3QgRGVsdGFGb3JtYXQ7Ci0gICAgICAgIFREZXZpY2UoKTogU3RhcnRTaXplKDApLCBFbmRTaXplKDApLCBEZWx0YUZvcm1hdCgwKSB7fQotICAgIHByaXZhdGU6Ci0gICAgICAgIFREZXZpY2UoY29uc3QgVERldmljZSYpOwotICAgICAgICBURGV2aWNlJiBvcGVyYXRvcj0oY29uc3QgVERldmljZSYpOwotICAgIH07Ci0gICAgc3RydWN0IFRTdWJUYWJsZUJhc2UgewotICAgICAgICBUVF91aW50MTZfdCBTdWJzdEZvcm1hdDsKLSAgICAgICAgVFN1YlRhYmxlQmFzZSgpOiBTdWJzdEZvcm1hdCgwKSB7fQotICAgICAgICB2aXJ0dWFsIH5UU3ViVGFibGVCYXNlKCkge30KLSAgICBwcml2YXRlOgotICAgICAgICBUU3ViVGFibGVCYXNlKGNvbnN0IFRTdWJUYWJsZUJhc2UmKTsKLSAgICAgICAgVFN1YlRhYmxlQmFzZSYgb3BlcmF0b3I9KGNvbnN0IFRTdWJUYWJsZUJhc2UmKTsKLSAgICB9OwotICAgIHN0cnVjdCBUU2luZ2xlU3Vic3RGb3JtYXQxOiBwdWJsaWMgVFN1YlRhYmxlQmFzZSB7Ci0gICAgICAgIFRDb3ZlcmFnZUZvcm1hdEJhc2UgKkNvdmVyYWdlOwotICAgICAgICBUVF9pbnQxNl90IERlbHRhR2x5cGhJRDsKLSAgICAgICAgVFNpbmdsZVN1YnN0Rm9ybWF0MSgpOiBDb3ZlcmFnZShOVUxMKSwgRGVsdGFHbHlwaElEKDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN1YnN0Rm9ybWF0ID0gMTsKLSAgICAgICAgfQotICAgICAgICB+VFNpbmdsZVN1YnN0Rm9ybWF0MSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKENvdmVyYWdlKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIENvdmVyYWdlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgVFNpbmdsZVN1YnN0Rm9ybWF0MShjb25zdCBUU2luZ2xlU3Vic3RGb3JtYXQxJik7Ci0gICAgICAgIFRTaW5nbGVTdWJzdEZvcm1hdDEmIG9wZXJhdG9yPShjb25zdCBUU2luZ2xlU3Vic3RGb3JtYXQxJik7Ci0gICAgfTsKLSAgICBzdHJ1Y3QgVFNpbmdsZVN1YnN0Rm9ybWF0MjogcHVibGljIFRTdWJUYWJsZUJhc2UgewotICAgICAgICBUQ292ZXJhZ2VGb3JtYXRCYXNlICpDb3ZlcmFnZTsKLSAgICAgICAgVFRfdWludDE2X3QgR2x5cGhDb3VudDsKLSAgICAgICAgVFRfdWludDE2X3QgKlN1YnN0aXR1dGU7Ci0gICAgICAgIFRTaW5nbGVTdWJzdEZvcm1hdDIoKTogQ292ZXJhZ2UoTlVMTCksIEdseXBoQ291bnQoMCksIFN1YnN0aXR1dGUoTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgU3Vic3RGb3JtYXQgPSAyOwotICAgICAgICB9Ci0gICAgICAgIH5UU2luZ2xlU3Vic3RGb3JtYXQyKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoQ292ZXJhZ2UpIHsKLSAgICAgICAgICAgICAgICBkZWxldGUgQ292ZXJhZ2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihTdWJzdGl0dXRlKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlW10gU3Vic3RpdHV0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIHByaXZhdGU6Ci0gICAgICAgIFRTaW5nbGVTdWJzdEZvcm1hdDIoY29uc3QgVFNpbmdsZVN1YnN0Rm9ybWF0MiYpOwotICAgICAgICBUU2luZ2xlU3Vic3RGb3JtYXQyJiBvcGVyYXRvcj0oY29uc3QgVFNpbmdsZVN1YnN0Rm9ybWF0MiYpOwotICAgIH07Ci0gICAgc3RydWN0IFRMb29rdXAgewotICAgICAgICBUVF91aW50MTZfdCBMb29rdXBUeXBlOwotICAgICAgICBUVF91aW50MTZfdCBMb29rdXBGbGFnOwotICAgICAgICBUVF91aW50MTZfdCBTdWJUYWJsZUNvdW50OwotICAgICAgICBzdHJ1Y3QgVFN1YlRhYmxlQmFzZSAqKlN1YlRhYmxlOwotICAgICAgICBUTG9va3VwKCk6IExvb2t1cFR5cGUoMCksIExvb2t1cEZsYWcoMCksIFN1YlRhYmxlQ291bnQoMCksIFN1YlRhYmxlKE5VTEwpIHt9Ci0gICAgICAgIH5UTG9va3VwKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoU3ViVGFibGVDb3VudCA+IDAgJiYgU3ViVGFibGUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBTdWJUYWJsZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFN1YlRhYmxlW2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZWxldGVbXSBTdWJUYWJsZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIHByaXZhdGU6Ci0gICAgICAgIFRMb29rdXAoY29uc3QgVExvb2t1cCYpOwotICAgICAgICBUTG9va3VwJiBvcGVyYXRvcj0oY29uc3QgVExvb2t1cCYpOwotICAgIH07Ci0gICAgc3RydWN0IFRMb29rdXBMaXN0IHsKLSAgICAgICAgaW50IExvb2t1cENvdW50OwotICAgICAgICBzdHJ1Y3QgVExvb2t1cCAqTG9va3VwOwotICAgICAgICBUTG9va3VwTGlzdCgpOiBMb29rdXBDb3VudCgwKSwgTG9va3VwKE5VTEwpIHt9Ci0gICAgICAgIH5UTG9va3VwTGlzdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKExvb2t1cCkgewotICAgICAgICAgICAgICAgIGRlbGV0ZVtdIExvb2t1cDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIHByaXZhdGU6Ci0gICAgICAgIFRMb29rdXBMaXN0KGNvbnN0IFRMb29rdXBMaXN0Jik7Ci0gICAgICAgIFRMb29rdXBMaXN0JiBvcGVyYXRvcj0oY29uc3QgVExvb2t1cExpc3QmKTsKLSAgICB9OwotICAgIGJvb2wgUGFyc2UoCi0gICAgICAgIEZUX0J5dGVzIHNjcmlwdGxpc3QsCi0gICAgICAgIEZUX0J5dGVzIGZlYXR1cmVsaXN0LAotICAgICAgICBGVF9CeXRlcyBsb29rdXBsaXN0KTsKLSAgICB2b2lkIFBhcnNlU2NyaXB0TGlzdChGVF9CeXRlcyByYXcsIFRTY3JpcHRMaXN0ICpyZWMpOwotICAgIHZvaWQgUGFyc2VTY3JpcHQoRlRfQnl0ZXMgcmF3LCBUU2NyaXB0ICpyZWMpOwotICAgIHZvaWQgUGFyc2VMYW5nU3lzKEZUX0J5dGVzIHJhdywgVExhbmdTeXMgKnJlYyk7Ci0gICAgdm9pZCBQYXJzZUZlYXR1cmVMaXN0KEZUX0J5dGVzIHJhdywgVEZlYXR1cmVMaXN0ICpyZWMpOwotICAgIHZvaWQgUGFyc2VGZWF0dXJlKEZUX0J5dGVzIHJhdywgVEZlYXR1cmUgKnJlYyk7Ci0gICAgdm9pZCBQYXJzZUxvb2t1cExpc3QoRlRfQnl0ZXMgcmF3LCBUTG9va3VwTGlzdCAqcmVjKTsKLSAgICB2b2lkIFBhcnNlTG9va3VwKEZUX0J5dGVzIHJhdywgVExvb2t1cCAqcmVjKTsKLSAgICB2b2lkIFBhcnNlQ292ZXJhZ2UoRlRfQnl0ZXMgcmF3LCBUQ292ZXJhZ2VGb3JtYXRCYXNlICoqcmVjKTsKLSAgICB2b2lkIFBhcnNlQ292ZXJhZ2VGb3JtYXQxKEZUX0J5dGVzIHJhdywgVENvdmVyYWdlRm9ybWF0MSAqcmVjKTsKLSAgICB2b2lkIFBhcnNlQ292ZXJhZ2VGb3JtYXQyKEZUX0J5dGVzIHJhdywgVENvdmVyYWdlRm9ybWF0MiAqcmVjKTsKLSAgICB2b2lkIFBhcnNlU2luZ2xlU3Vic3QoRlRfQnl0ZXMgcmF3LCBUU3ViVGFibGVCYXNlICoqcmVjKTsKLSAgICB2b2lkIFBhcnNlU2luZ2xlU3Vic3RGb3JtYXQxKEZUX0J5dGVzIHJhdywgVFNpbmdsZVN1YnN0Rm9ybWF0MSAqcmVjKTsKLSAgICB2b2lkIFBhcnNlU2luZ2xlU3Vic3RGb3JtYXQyKEZUX0J5dGVzIHJhdywgVFNpbmdsZVN1YnN0Rm9ybWF0MiAqcmVjKTsKLSAgICBib29sIEdldFZlcnRpY2FsR2x5cGhTdWIoCi0gICAgICAgIFRUX3VpbnQzMl90IGdseXBobnVtLAotICAgICAgICBUVF91aW50MzJfdCAqdmdseXBobnVtLAotICAgICAgICBzdHJ1Y3QgVEZlYXR1cmUgKkZlYXR1cmUpOwotICAgIGJvb2wgR2V0VmVydGljYWxHbHlwaFN1YjIoCi0gICAgICAgIFRUX3VpbnQzMl90IGdseXBobnVtLAotICAgICAgICBUVF91aW50MzJfdCAqdmdseXBobnVtLAotICAgICAgICBzdHJ1Y3QgVExvb2t1cCAqTG9va3VwKTsKLSAgICBpbnQgR2V0Q292ZXJhZ2VJbmRleChzdHJ1Y3QgVENvdmVyYWdlRm9ybWF0QmFzZSAqQ292ZXJhZ2UsIFRUX3VpbnQzMl90IGcpOwotICAgIFRUX3VpbnQ4X3QgR2V0VUludDgoRlRfQnl0ZXMmIHApIGNvbnN0Ci0gICAgewotICAgICAgICBUVF91aW50OF90IHJldCA9IHBbMF07Ci0gICAgICAgIHAgKz0gMTsKLSAgICAgICAgcmV0dXJuIHJldDsKKyAgICB+VENvdmVyYWdlRm9ybWF0MigpIG92ZXJyaWRlIHsgZGVsZXRlW10gUmFuZ2VSZWNvcmQ7IH0KKworICAgcHJpdmF0ZToKKyAgICBUQ292ZXJhZ2VGb3JtYXQyKGNvbnN0IFRDb3ZlcmFnZUZvcm1hdDImKTsKKyAgICBUQ292ZXJhZ2VGb3JtYXQyJiBvcGVyYXRvcj0oY29uc3QgVENvdmVyYWdlRm9ybWF0MiYpOworICB9OworICBzdHJ1Y3QgVENsYXNzRGVmRm9ybWF0QmFzZSB7CisgICAgdWludDE2X3QgQ2xhc3NGb3JtYXQ7CisgICAgVENsYXNzRGVmRm9ybWF0QmFzZSgpIDogQ2xhc3NGb3JtYXQoMCkge30KKyAgICB2aXJ0dWFsIH5UQ2xhc3NEZWZGb3JtYXRCYXNlKCkge30KKworICAgcHJpdmF0ZToKKyAgICBUQ2xhc3NEZWZGb3JtYXRCYXNlKGNvbnN0IFRDbGFzc0RlZkZvcm1hdEJhc2UmKTsKKyAgICBUQ2xhc3NEZWZGb3JtYXRCYXNlJiBvcGVyYXRvcj0oY29uc3QgVENsYXNzRGVmRm9ybWF0QmFzZSYpOworICB9OworICBzdHJ1Y3QgVENsYXNzRGVmRm9ybWF0MSA6IHB1YmxpYyBUQ2xhc3NEZWZGb3JtYXRCYXNlIHsKKyAgICB1aW50MTZfdCBTdGFydEdseXBoOworICAgIHVpbnQxNl90IEdseXBoQ291bnQ7CisgICAgdWludDE2X3QqIENsYXNzVmFsdWVBcnJheTsKKyAgICBUQ2xhc3NEZWZGb3JtYXQxKCkgOiBTdGFydEdseXBoKDApLCBHbHlwaENvdW50KDApLCBDbGFzc1ZhbHVlQXJyYXkoTlVMTCkgeworICAgICAgQ2xhc3NGb3JtYXQgPSAxOwogICAgIH0KLSAgICBUVF9pbnQxNl90IEdldEludDE2KEZUX0J5dGVzJiBwKSBjb25zdAotICAgIHsKLSAgICAgICAgVFRfdWludDE2X3QgcmV0ID0gcFswXSA8PCA4IHwgcFsxXTsKLSAgICAgICAgcCArPSAyOwotICAgICAgICByZXR1cm4gKihUVF9pbnQxNl90KikmcmV0OworICAgIH5UQ2xhc3NEZWZGb3JtYXQxKCkgb3ZlcnJpZGUgeyBkZWxldGVbXSBDbGFzc1ZhbHVlQXJyYXk7IH0KKworICAgcHJpdmF0ZToKKyAgICBUQ2xhc3NEZWZGb3JtYXQxKGNvbnN0IFRDbGFzc0RlZkZvcm1hdDEmKTsKKyAgICBUQ2xhc3NEZWZGb3JtYXQxJiBvcGVyYXRvcj0oY29uc3QgVENsYXNzRGVmRm9ybWF0MSYpOworICB9OworICBzdHJ1Y3QgVENsYXNzUmFuZ2VSZWNvcmQgeworICAgIHVpbnQxNl90IFN0YXJ0OworICAgIHVpbnQxNl90IEVuZDsKKyAgICB1aW50MTZfdCBDbGFzczsKKyAgICBUQ2xhc3NSYW5nZVJlY29yZCgpIDogU3RhcnQoMCksIEVuZCgwKSwgQ2xhc3MoMCkge30KKworICAgcHJpdmF0ZToKKyAgICBUQ2xhc3NSYW5nZVJlY29yZChjb25zdCBUQ2xhc3NSYW5nZVJlY29yZCYpOworICAgIFRDbGFzc1JhbmdlUmVjb3JkJiBvcGVyYXRvcj0oY29uc3QgVENsYXNzUmFuZ2VSZWNvcmQmKTsKKyAgfTsKKyAgc3RydWN0IFRDbGFzc0RlZkZvcm1hdDIgOiBwdWJsaWMgVENsYXNzRGVmRm9ybWF0QmFzZSB7CisgICAgdWludDE2X3QgQ2xhc3NSYW5nZUNvdW50OworICAgIHN0cnVjdCBUQ2xhc3NSYW5nZVJlY29yZCogQ2xhc3NSYW5nZVJlY29yZDsKKyAgICBUQ2xhc3NEZWZGb3JtYXQyKCkgOiBDbGFzc1JhbmdlQ291bnQoMCksIENsYXNzUmFuZ2VSZWNvcmQoTlVMTCkgeworICAgICAgQ2xhc3NGb3JtYXQgPSAyOwogICAgIH0KLSAgICBUVF91aW50MTZfdCBHZXRVSW50MTYoRlRfQnl0ZXMmIHApIGNvbnN0Ci0gICAgewotICAgICAgICBUVF91aW50MTZfdCByZXQgPSBwWzBdIDw8IDggfCBwWzFdOwotICAgICAgICBwICs9IDI7Ci0gICAgICAgIHJldHVybiByZXQ7CisgICAgflRDbGFzc0RlZkZvcm1hdDIoKSBvdmVycmlkZSB7IGRlbGV0ZVtdIENsYXNzUmFuZ2VSZWNvcmQ7IH0KKworICAgcHJpdmF0ZToKKyAgICBUQ2xhc3NEZWZGb3JtYXQyKGNvbnN0IFRDbGFzc0RlZkZvcm1hdDImKTsKKyAgICBUQ2xhc3NEZWZGb3JtYXQyJiBvcGVyYXRvcj0oY29uc3QgVENsYXNzRGVmRm9ybWF0MiYpOworICB9OworICBzdHJ1Y3QgVERldmljZSB7CisgICAgdWludDE2X3QgU3RhcnRTaXplOworICAgIHVpbnQxNl90IEVuZFNpemU7CisgICAgdWludDE2X3QgRGVsdGFGb3JtYXQ7CisgICAgVERldmljZSgpIDogU3RhcnRTaXplKDApLCBFbmRTaXplKDApLCBEZWx0YUZvcm1hdCgwKSB7fQorCisgICBwcml2YXRlOgorICAgIFREZXZpY2UoY29uc3QgVERldmljZSYpOworICAgIFREZXZpY2UmIG9wZXJhdG9yPShjb25zdCBURGV2aWNlJik7CisgIH07CisgIHN0cnVjdCBUU3ViVGFibGVCYXNlIHsKKyAgICB1aW50MTZfdCBTdWJzdEZvcm1hdDsKKyAgICBUU3ViVGFibGVCYXNlKCkgOiBTdWJzdEZvcm1hdCgwKSB7fQorICAgIHZpcnR1YWwgflRTdWJUYWJsZUJhc2UoKSB7fQorCisgICBwcml2YXRlOgorICAgIFRTdWJUYWJsZUJhc2UoY29uc3QgVFN1YlRhYmxlQmFzZSYpOworICAgIFRTdWJUYWJsZUJhc2UmIG9wZXJhdG9yPShjb25zdCBUU3ViVGFibGVCYXNlJik7CisgIH07CisgIHN0cnVjdCBUU2luZ2xlU3Vic3RGb3JtYXQxIDogcHVibGljIFRTdWJUYWJsZUJhc2UgeworICAgIFRDb3ZlcmFnZUZvcm1hdEJhc2UqIENvdmVyYWdlOworICAgIGludDE2X3QgRGVsdGFHbHlwaElEOworICAgIFRTaW5nbGVTdWJzdEZvcm1hdDEoKSA6IENvdmVyYWdlKE5VTEwpLCBEZWx0YUdseXBoSUQoMCkgeyBTdWJzdEZvcm1hdCA9IDE7IH0KKyAgICB+VFNpbmdsZVN1YnN0Rm9ybWF0MSgpIG92ZXJyaWRlIHsgZGVsZXRlIENvdmVyYWdlOyB9CisKKyAgIHByaXZhdGU6CisgICAgVFNpbmdsZVN1YnN0Rm9ybWF0MShjb25zdCBUU2luZ2xlU3Vic3RGb3JtYXQxJik7CisgICAgVFNpbmdsZVN1YnN0Rm9ybWF0MSYgb3BlcmF0b3I9KGNvbnN0IFRTaW5nbGVTdWJzdEZvcm1hdDEmKTsKKyAgfTsKKyAgc3RydWN0IFRTaW5nbGVTdWJzdEZvcm1hdDIgOiBwdWJsaWMgVFN1YlRhYmxlQmFzZSB7CisgICAgVENvdmVyYWdlRm9ybWF0QmFzZSogQ292ZXJhZ2U7CisgICAgdWludDE2X3QgR2x5cGhDb3VudDsKKyAgICB1aW50MTZfdCogU3Vic3RpdHV0ZTsKKyAgICBUU2luZ2xlU3Vic3RGb3JtYXQyKCkgOiBDb3ZlcmFnZShOVUxMKSwgR2x5cGhDb3VudCgwKSwgU3Vic3RpdHV0ZShOVUxMKSB7CisgICAgICBTdWJzdEZvcm1hdCA9IDI7CiAgICAgfQotICAgIFRUX2ludDMyX3QgR2V0SW50MzIoRlRfQnl0ZXMmIHApIGNvbnN0Ci0gICAgewotICAgICAgICBUVF91aW50MzJfdCByZXQgPSBwWzBdIDw8IDI0IHwgcFsxXSA8PCAxNiB8IHBbMl0gPDwgOCB8IHBbM107Ci0gICAgICAgIHAgKz0gNDsKLSAgICAgICAgcmV0dXJuICooVFRfaW50MzJfdCopJnJldDsKKyAgICB+VFNpbmdsZVN1YnN0Rm9ybWF0MigpIG92ZXJyaWRlIHsKKyAgICAgIGRlbGV0ZSBDb3ZlcmFnZTsKKyAgICAgIGRlbGV0ZVtdIFN1YnN0aXR1dGU7CiAgICAgfQotICAgIFRUX3VpbnQzMl90IEdldFVJbnQzMihGVF9CeXRlcyYgcCkgY29uc3QKLSAgICB7Ci0gICAgICAgIFRUX3VpbnQzMl90IHJldCA9IHBbMF0gPDwgMjQgfCBwWzFdIDw8IDE2IHwgcFsyXSA8PCA4IHwgcFszXTsKLSAgICAgICAgcCArPSA0OwotICAgICAgICByZXR1cm4gcmV0OworCisgICBwcml2YXRlOgorICAgIFRTaW5nbGVTdWJzdEZvcm1hdDIoY29uc3QgVFNpbmdsZVN1YnN0Rm9ybWF0MiYpOworICAgIFRTaW5nbGVTdWJzdEZvcm1hdDImIG9wZXJhdG9yPShjb25zdCBUU2luZ2xlU3Vic3RGb3JtYXQyJik7CisgIH07CisgIHN0cnVjdCBUTG9va3VwIHsKKyAgICB1aW50MTZfdCBMb29rdXBUeXBlOworICAgIHVpbnQxNl90IExvb2t1cEZsYWc7CisgICAgdWludDE2X3QgU3ViVGFibGVDb3VudDsKKyAgICBzdHJ1Y3QgVFN1YlRhYmxlQmFzZSoqIFN1YlRhYmxlOworICAgIFRMb29rdXAoKQorICAgICAgICA6IExvb2t1cFR5cGUoMCksIExvb2t1cEZsYWcoMCksIFN1YlRhYmxlQ291bnQoMCksIFN1YlRhYmxlKE5VTEwpIHt9CisgICAgflRMb29rdXAoKSB7CisgICAgICBpZiAoU3ViVGFibGUpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTdWJUYWJsZUNvdW50OyArK2kpCisgICAgICAgICAgZGVsZXRlIFN1YlRhYmxlW2ldOworICAgICAgICBkZWxldGVbXSBTdWJUYWJsZTsKKyAgICAgIH0KICAgICB9Ci0gICAgQ0ZYX0NNYXBEV29yZFRvRFdvcmQgbV9mZWF0dXJlTWFwOwotICAgIEZYX0JPT0wJbV9iRmVhdXR1cmVNYXBMb2FkOwotICAgIGJvb2wgbG9hZGVkOwotICAgIHN0cnVjdCB0dF9nc3ViX2hlYWRlciBoZWFkZXI7Ci0gICAgc3RydWN0IFRTY3JpcHRMaXN0IFNjcmlwdExpc3Q7Ci0gICAgc3RydWN0IFRGZWF0dXJlTGlzdCBGZWF0dXJlTGlzdDsKLSAgICBzdHJ1Y3QgVExvb2t1cExpc3QgTG9va3VwTGlzdDsKKworICAgcHJpdmF0ZToKKyAgICBUTG9va3VwKGNvbnN0IFRMb29rdXAmKTsKKyAgICBUTG9va3VwJiBvcGVyYXRvcj0oY29uc3QgVExvb2t1cCYpOworICB9OworICBzdHJ1Y3QgVExvb2t1cExpc3QgeworICAgIGludCBMb29rdXBDb3VudDsKKyAgICBzdHJ1Y3QgVExvb2t1cCogTG9va3VwOworICAgIFRMb29rdXBMaXN0KCkgOiBMb29rdXBDb3VudCgwKSwgTG9va3VwKE5VTEwpIHt9CisgICAgflRMb29rdXBMaXN0KCkgeyBkZWxldGVbXSBMb29rdXA7IH0KKworICAgcHJpdmF0ZToKKyAgICBUTG9va3VwTGlzdChjb25zdCBUTG9va3VwTGlzdCYpOworICAgIFRMb29rdXBMaXN0JiBvcGVyYXRvcj0oY29uc3QgVExvb2t1cExpc3QmKTsKKyAgfTsKKyAgYm9vbCBQYXJzZShGVF9CeXRlcyBzY3JpcHRsaXN0LCBGVF9CeXRlcyBmZWF0dXJlbGlzdCwgRlRfQnl0ZXMgbG9va3VwbGlzdCk7CisgIHZvaWQgUGFyc2VTY3JpcHRMaXN0KEZUX0J5dGVzIHJhdywgVFNjcmlwdExpc3QqIHJlYyk7CisgIHZvaWQgUGFyc2VTY3JpcHQoRlRfQnl0ZXMgcmF3LCBUU2NyaXB0KiByZWMpOworICB2b2lkIFBhcnNlTGFuZ1N5cyhGVF9CeXRlcyByYXcsIFRMYW5nU3lzKiByZWMpOworICB2b2lkIFBhcnNlRmVhdHVyZUxpc3QoRlRfQnl0ZXMgcmF3LCBURmVhdHVyZUxpc3QqIHJlYyk7CisgIHZvaWQgUGFyc2VGZWF0dXJlKEZUX0J5dGVzIHJhdywgVEZlYXR1cmUqIHJlYyk7CisgIHZvaWQgUGFyc2VMb29rdXBMaXN0KEZUX0J5dGVzIHJhdywgVExvb2t1cExpc3QqIHJlYyk7CisgIHZvaWQgUGFyc2VMb29rdXAoRlRfQnl0ZXMgcmF3LCBUTG9va3VwKiByZWMpOworICB2b2lkIFBhcnNlQ292ZXJhZ2UoRlRfQnl0ZXMgcmF3LCBUQ292ZXJhZ2VGb3JtYXRCYXNlKiogcmVjKTsKKyAgdm9pZCBQYXJzZUNvdmVyYWdlRm9ybWF0MShGVF9CeXRlcyByYXcsIFRDb3ZlcmFnZUZvcm1hdDEqIHJlYyk7CisgIHZvaWQgUGFyc2VDb3ZlcmFnZUZvcm1hdDIoRlRfQnl0ZXMgcmF3LCBUQ292ZXJhZ2VGb3JtYXQyKiByZWMpOworICB2b2lkIFBhcnNlU2luZ2xlU3Vic3QoRlRfQnl0ZXMgcmF3LCBUU3ViVGFibGVCYXNlKiogcmVjKTsKKyAgdm9pZCBQYXJzZVNpbmdsZVN1YnN0Rm9ybWF0MShGVF9CeXRlcyByYXcsIFRTaW5nbGVTdWJzdEZvcm1hdDEqIHJlYyk7CisgIHZvaWQgUGFyc2VTaW5nbGVTdWJzdEZvcm1hdDIoRlRfQnl0ZXMgcmF3LCBUU2luZ2xlU3Vic3RGb3JtYXQyKiByZWMpOworICBib29sIEdldFZlcnRpY2FsR2x5cGhTdWIodWludDMyX3QgZ2x5cGhudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogdmdseXBobnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFRGZWF0dXJlKiBGZWF0dXJlKTsKKyAgYm9vbCBHZXRWZXJ0aWNhbEdseXBoU3ViMih1aW50MzJfdCBnbHlwaG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogdmdseXBobnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBUTG9va3VwKiBMb29rdXApOworICBpbnQgR2V0Q292ZXJhZ2VJbmRleChzdHJ1Y3QgVENvdmVyYWdlRm9ybWF0QmFzZSogQ292ZXJhZ2UsIHVpbnQzMl90IGcpOworICB1aW50OF90IEdldFVJbnQ4KEZUX0J5dGVzJiBwKSBjb25zdCB7CisgICAgdWludDhfdCByZXQgPSBwWzBdOworICAgIHAgKz0gMTsKKyAgICByZXR1cm4gcmV0OworICB9CisgIGludDE2X3QgR2V0SW50MTYoRlRfQnl0ZXMmIHApIGNvbnN0IHsKKyAgICB1aW50MTZfdCByZXQgPSBwWzBdIDw8IDggfCBwWzFdOworICAgIHAgKz0gMjsKKyAgICByZXR1cm4gKihpbnQxNl90KikmcmV0OworICB9CisgIHVpbnQxNl90IEdldFVJbnQxNihGVF9CeXRlcyYgcCkgY29uc3QgeworICAgIHVpbnQxNl90IHJldCA9IHBbMF0gPDwgOCB8IHBbMV07CisgICAgcCArPSAyOworICAgIHJldHVybiByZXQ7CisgIH0KKyAgaW50MzJfdCBHZXRJbnQzMihGVF9CeXRlcyYgcCkgY29uc3QgeworICAgIHVpbnQzMl90IHJldCA9IHBbMF0gPDwgMjQgfCBwWzFdIDw8IDE2IHwgcFsyXSA8PCA4IHwgcFszXTsKKyAgICBwICs9IDQ7CisgICAgcmV0dXJuICooaW50MzJfdCopJnJldDsKKyAgfQorICB1aW50MzJfdCBHZXRVSW50MzIoRlRfQnl0ZXMmIHApIGNvbnN0IHsKKyAgICB1aW50MzJfdCByZXQgPSBwWzBdIDw8IDI0IHwgcFsxXSA8PCAxNiB8IHBbMl0gPDwgOCB8IHBbM107CisgICAgcCArPSA0OworICAgIHJldHVybiByZXQ7CisgIH0KKyAgc3RkOjptYXA8RlhfRFdPUkQsIEZYX0RXT1JEPiBtX2ZlYXR1cmVNYXA7CisgIEZYX0JPT0wgbV9iRmVhdXR1cmVNYXBMb2FkOworICBib29sIGxvYWRlZDsKKyAgc3RydWN0IHR0X2dzdWJfaGVhZGVyIGhlYWRlcjsKKyAgc3RydWN0IFRTY3JpcHRMaXN0IFNjcmlwdExpc3Q7CisgIHN0cnVjdCBURmVhdHVyZUxpc3QgRmVhdHVyZUxpc3Q7CisgIHN0cnVjdCBUTG9va3VwTGlzdCBMb29rdXBMaXN0OwogfTsKLWNsYXNzIENGWF9HU1VCVGFibGUgRlhfRklOQUwgOiBwdWJsaWMgSUZYX0dTVUJUYWJsZQotewotcHVibGljOgotICAgIHZpcnR1YWwgdm9pZAlSZWxlYXNlKCkgRlhfT1ZFUlJJREUKLSAgICB7Ci0gICAgICAgIGRlbGV0ZSB0aGlzOwotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wgR2V0VmVydGljYWxHbHlwaChGWF9EV09SRCBnbHlwaG51bSwgRlhfRFdPUkQqIHZnbHlwaG51bSkgRlhfT1ZFUlJJREU7CitjbGFzcyBDRlhfR1NVQlRhYmxlIGZpbmFsIDogcHVibGljIElGWF9HU1VCVGFibGUgeworIHB1YmxpYzoKKyAgfkNGWF9HU1VCVGFibGUoKSBvdmVycmlkZSB7fQorICBGWF9CT09MIEdldFZlcnRpY2FsR2x5cGgoRlhfRFdPUkQgZ2x5cGhudW0sIEZYX0RXT1JEKiB2Z2x5cGhudW0pIG92ZXJyaWRlOwogCi0gICAgQ0ZYX0NUVEdTVUJUYWJsZSBtX0dzdWJJbXA7Ci0KLXByaXZhdGU6Ci0gICAgfkNGWF9HU1VCVGFibGUoKSB7IH0KKyAgQ0ZYX0NUVEdTVUJUYWJsZSBtX0dzdWJJbXA7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfU1JDX0ZQREZBUElfRlBERl9GT05UX1RUR1NVQlRBQkxFX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2UuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlLmNwcAppbmRleCA1YTlmMWE4Li43ZTI0OTJmIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2UuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZS5jcHAKQEAgLTEsMTAzMCArMSwxMDEzIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgiCiAjaW5jbHVkZSAicGFnZWludC5oIgotQ1BERl9QYWdlT2JqZWN0KiBDUERGX1BhZ2VPYmplY3Q6OkNyZWF0ZShpbnQgdHlwZSkKLXsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBQREZQQUdFX1RFWFQ6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENQREZfVGV4dE9iamVjdDsKLSAgICAgICAgY2FzZSBQREZQQUdFX0lNQUdFOgotICAgICAgICAgICAgcmV0dXJuIG5ldyBDUERGX0ltYWdlT2JqZWN0OwotICAgICAgICBjYXNlIFBERlBBR0VfUEFUSDoKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ1BERl9QYXRoT2JqZWN0OwotICAgICAgICBjYXNlIFBERlBBR0VfU0hBRElORzoKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ1BERl9TaGFkaW5nT2JqZWN0OwotICAgICAgICBjYXNlIFBERlBBR0VfRk9STToKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ1BERl9Gb3JtT2JqZWN0OworCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2UuaCIKKworQ1BERl9QYWdlT2JqZWN0KiBDUERGX1BhZ2VPYmplY3Q6OkNyZWF0ZShpbnQgdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFBERlBBR0VfVEVYVDoKKyAgICAgIHJldHVybiBuZXcgQ1BERl9UZXh0T2JqZWN0OworICAgIGNhc2UgUERGUEFHRV9JTUFHRToKKyAgICAgIHJldHVybiBuZXcgQ1BERl9JbWFnZU9iamVjdDsKKyAgICBjYXNlIFBERlBBR0VfUEFUSDoKKyAgICAgIHJldHVybiBuZXcgQ1BERl9QYXRoT2JqZWN0OworICAgIGNhc2UgUERGUEFHRV9TSEFESU5HOgorICAgICAgcmV0dXJuIG5ldyBDUERGX1NoYWRpbmdPYmplY3Q7CisgICAgY2FzZSBQREZQQUdFX0ZPUk06CisgICAgICByZXR1cm4gbmV3IENQREZfRm9ybU9iamVjdDsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KK0NQREZfUGFnZU9iamVjdDo6fkNQREZfUGFnZU9iamVjdCgpIHt9CitDUERGX1BhZ2VPYmplY3QqIENQREZfUGFnZU9iamVjdDo6Q2xvbmUoKSBjb25zdCB7CisgIENQREZfUGFnZU9iamVjdCogcE9iaiA9IENyZWF0ZShtX1R5cGUpOworICBwT2JqLT5Db3B5KHRoaXMpOworICByZXR1cm4gcE9iajsKK30KK3ZvaWQgQ1BERl9QYWdlT2JqZWN0OjpDb3B5KGNvbnN0IENQREZfUGFnZU9iamVjdCogcFNyYykgeworICBpZiAobV9UeXBlICE9IHBTcmMtPm1fVHlwZSkgeworICAgIHJldHVybjsKKyAgfQorICBDb3B5RGF0YShwU3JjKTsKKyAgQ29weVN0YXRlcygqcFNyYyk7CisgIG1fTGVmdCA9IHBTcmMtPm1fTGVmdDsKKyAgbV9SaWdodCA9IHBTcmMtPm1fUmlnaHQ7CisgIG1fVG9wID0gcFNyYy0+bV9Ub3A7CisgIG1fQm90dG9tID0gcFNyYy0+bV9Cb3R0b207Cit9Cit2b2lkIENQREZfUGFnZU9iamVjdDo6QXBwZW5kQ2xpcFBhdGgoQ1BERl9QYXRoIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQXV0b01lcmdlKSB7CisgIG1fQ2xpcFBhdGguQXBwZW5kUGF0aChwYXRoLCB0eXBlLCBiQXV0b01lcmdlKTsKK30KK3ZvaWQgQ1BERl9QYWdlT2JqZWN0OjpDb3B5Q2xpcFBhdGgoQ1BERl9QYWdlT2JqZWN0KiBwT2JqKSB7CisgIG1fQ2xpcFBhdGggPSBwT2JqLT5tX0NsaXBQYXRoOworfQordm9pZCBDUERGX1BhZ2VPYmplY3Q6OlJlbW92ZUNsaXBQYXRoKCkgeworICBtX0NsaXBQYXRoLlNldE51bGwoKTsKK30KK3ZvaWQgQ1BERl9QYWdlT2JqZWN0OjpSZWNhbGNCQm94KCkgeworICBzd2l0Y2ggKG1fVHlwZSkgeworICAgIGNhc2UgUERGUEFHRV9URVhUOgorICAgICAgKChDUERGX1RleHRPYmplY3QqKXRoaXMpLT5SZWNhbGNQb3NpdGlvbkRhdGEoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUERGUEFHRV9QQVRIOgorICAgICAgKChDUERGX1BhdGhPYmplY3QqKXRoaXMpLT5DYWxjQm91bmRpbmdCb3goKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUERGUEFHRV9TSEFESU5HOgorICAgICAgKChDUERGX1NoYWRpbmdPYmplY3QqKXRoaXMpLT5DYWxjQm91bmRpbmdCb3goKTsKKyAgICAgIGJyZWFrOworICB9Cit9Cit2b2lkIENQREZfUGFnZU9iamVjdDo6VHJhbnNmb3JtQ2xpcFBhdGgoQ0ZYX01hdHJpeCYgbWF0cml4KSB7CisgIGlmIChtX0NsaXBQYXRoLklzTnVsbCgpKSB7CisgICAgcmV0dXJuOworICB9CisgIG1fQ2xpcFBhdGguR2V0TW9kaWZ5KCk7CisgIG1fQ2xpcFBhdGguVHJhbnNmb3JtKG1hdHJpeCk7Cit9Cit2b2lkIENQREZfUGFnZU9iamVjdDo6VHJhbnNmb3JtR2VuZXJhbFN0YXRlKENGWF9NYXRyaXgmIG1hdHJpeCkgeworICBpZiAobV9HZW5lcmFsU3RhdGUuSXNOdWxsKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9HZW5lcmFsU3RhdGVEYXRhKiBwR1MgPSBtX0dlbmVyYWxTdGF0ZS5HZXRNb2RpZnkoKTsKKyAgcEdTLT5tX01hdHJpeC5Db25jYXQobWF0cml4KTsKK30KK0ZYX1JFQ1QgQ1BERl9QYWdlT2JqZWN0OjpHZXRCQm94KGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIGNvbnN0IHsKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0KG1fTGVmdCwgbV9Cb3R0b20sIG1fUmlnaHQsIG1fVG9wKTsKKyAgaWYgKHBNYXRyaXgpIHsKKyAgICBwTWF0cml4LT5UcmFuc2Zvcm1SZWN0KHJlY3QpOworICB9CisgIHJldHVybiByZWN0LkdldE91dHRlclJlY3QoKTsKK30KKworQ1BERl9UZXh0T2JqZWN0OjpDUERGX1RleHRPYmplY3QoKQorICAgIDogbV9Qb3NYKDApLAorICAgICAgbV9Qb3NZKDApLAorICAgICAgbV9uQ2hhcnMoMCksCisgICAgICBtX3BDaGFyQ29kZXMobnVsbHB0ciksCisgICAgICBtX3BDaGFyUG9zKG51bGxwdHIpIHsKKyAgbV9UeXBlID0gUERGUEFHRV9URVhUOworfQorCitDUERGX1RleHRPYmplY3Q6On5DUERGX1RleHRPYmplY3QoKSB7CisgIGlmIChtX25DaGFycyA+IDEpIHsKKyAgICBGWF9GcmVlKG1fcENoYXJDb2Rlcyk7CisgIH0KKyAgRlhfRnJlZShtX3BDaGFyUG9zKTsKK30KKwordm9pZCBDUERGX1RleHRPYmplY3Q6OkdldEl0ZW1JbmZvKGludCBpbmRleCwgQ1BERl9UZXh0T2JqZWN0SXRlbSogcEluZm8pIGNvbnN0IHsKKyAgcEluZm8tPm1fQ2hhckNvZGUgPQorICAgICAgbV9uQ2hhcnMgPT0gMSA/IChGWF9EV09SRCkodWludHB0cl90KW1fcENoYXJDb2RlcyA6IG1fcENoYXJDb2Rlc1tpbmRleF07CisgIHBJbmZvLT5tX09yaWdpblggPSBpbmRleCA/IG1fcENoYXJQb3NbaW5kZXggLSAxXSA6IDA7CisgIHBJbmZvLT5tX09yaWdpblkgPSAwOworICBpZiAocEluZm8tPm1fQ2hhckNvZGUgPT0gLTEpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9Gb250KiBwRm9udCA9IG1fVGV4dFN0YXRlLkdldEZvbnQoKTsKKyAgaWYgKHBGb250LT5HZXRGb250VHlwZSgpICE9IFBERkZPTlRfQ0lERk9OVCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoISgoQ1BERl9DSURGb250KilwRm9udCktPklzVmVydFdyaXRpbmcoKSkgeworICAgIHJldHVybjsKKyAgfQorICBGWF9XT1JEIENJRCA9ICgoQ1BERl9DSURGb250KilwRm9udCktPkNJREZyb21DaGFyQ29kZShwSW5mby0+bV9DaGFyQ29kZSk7CisgIHBJbmZvLT5tX09yaWdpblkgPSBwSW5mby0+bV9PcmlnaW5YOworICBwSW5mby0+bV9PcmlnaW5YID0gMDsKKyAgc2hvcnQgdngsIHZ5OworICAoKENQREZfQ0lERm9udCopcEZvbnQpLT5HZXRWZXJ0T3JpZ2luKENJRCwgdngsIHZ5KTsKKyAgRlhfRkxPQVQgZm9udHNpemUgPSBtX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpOworICBwSW5mby0+bV9PcmlnaW5YIC09IGZvbnRzaXplICogdnggLyAxMDAwOworICBwSW5mby0+bV9PcmlnaW5ZIC09IGZvbnRzaXplICogdnkgLyAxMDAwOworfQorCitpbnQgQ1BERl9UZXh0T2JqZWN0OjpDb3VudENoYXJzKCkgY29uc3QgeworICBpZiAobV9uQ2hhcnMgPT0gMSkgeworICAgIHJldHVybiAxOworICB9CisgIGludCBjb3VudCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uQ2hhcnM7ICsraSkKKyAgICBpZiAobV9wQ2hhckNvZGVzW2ldICE9IChGWF9EV09SRCktMSkgeworICAgICAgKytjb3VudDsKICAgICB9Ci0gICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBjb3VudDsKIH0KLUNQREZfUGFnZU9iamVjdDo6fkNQREZfUGFnZU9iamVjdCgpCi17Ci19Ci1DUERGX1BhZ2VPYmplY3QqIENQREZfUGFnZU9iamVjdDo6Q2xvbmUoKSBjb25zdAotewotICAgIENQREZfUGFnZU9iamVjdCogcE9iaiA9IENyZWF0ZShtX1R5cGUpOwotICAgIHBPYmotPkNvcHkodGhpcyk7Ci0gICAgcmV0dXJuIHBPYmo7Ci19Ci12b2lkIENQREZfUGFnZU9iamVjdDo6Q29weShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTcmMpCi17Ci0gICAgaWYgKG1fVHlwZSAhPSBwU3JjLT5tX1R5cGUpIHsKKwordm9pZCBDUERGX1RleHRPYmplY3Q6OkdldENoYXJJbmZvKGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgY2hhcmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGtlcm5pbmcpIGNvbnN0IHsKKyAgaWYgKG1fbkNoYXJzID09IDEpIHsKKyAgICBjaGFyY29kZSA9IChGWF9EV09SRCkodWludHB0cl90KW1fcENoYXJDb2RlczsKKyAgICBrZXJuaW5nID0gMDsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IGNvdW50ID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25DaGFyczsgKytpKSB7CisgICAgaWYgKG1fcENoYXJDb2Rlc1tpXSAhPSAoRlhfRFdPUkQpLTEpIHsKKyAgICAgIGlmIChjb3VudCA9PSBpbmRleCkgeworICAgICAgICBjaGFyY29kZSA9IG1fcENoYXJDb2Rlc1tpXTsKKyAgICAgICAgaWYgKGkgPT0gbV9uQ2hhcnMgLSAxIHx8IG1fcENoYXJDb2Rlc1tpICsgMV0gIT0gKEZYX0RXT1JEKS0xKSB7CisgICAgICAgICAga2VybmluZyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAga2VybmluZyA9IG1fcENoYXJQb3NbaV07CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgKytjb3VudDsKICAgICB9Ci0gICAgQ29weURhdGEocFNyYyk7Ci0gICAgQ29weVN0YXRlcygqcFNyYyk7Ci0gICAgbV9MZWZ0ID0gcFNyYy0+bV9MZWZ0OwotICAgIG1fUmlnaHQgPSBwU3JjLT5tX1JpZ2h0OwotICAgIG1fVG9wID0gcFNyYy0+bV9Ub3A7Ci0gICAgbV9Cb3R0b20gPSBwU3JjLT5tX0JvdHRvbTsKKyAgfQogfQotdm9pZCBDUERGX1BhZ2VPYmplY3Q6OkFwcGVuZENsaXBQYXRoKENQREZfUGF0aCBwYXRoLCBpbnQgdHlwZSwgRlhfQk9PTCBiQXV0b01lcmdlKQotewotICAgIG1fQ2xpcFBhdGguQXBwZW5kUGF0aChwYXRoLCB0eXBlLCBiQXV0b01lcmdlKTsKLX0KLXZvaWQgQ1BERl9QYWdlT2JqZWN0OjpDb3B5Q2xpcFBhdGgoQ1BERl9QYWdlT2JqZWN0KiBwT2JqKQotewotICAgIG1fQ2xpcFBhdGggPSBwT2JqLT5tX0NsaXBQYXRoOwotfQotdm9pZCBDUERGX1BhZ2VPYmplY3Q6OlJlbW92ZUNsaXBQYXRoKCkKLXsKLSAgICBtX0NsaXBQYXRoLlNldE51bGwoKTsKLX0KLXZvaWQgQ1BERl9QYWdlT2JqZWN0OjpSZWNhbGNCQm94KCkKLXsKLSAgICBzd2l0Y2ggKG1fVHlwZSkgewotICAgICAgICBjYXNlIFBERlBBR0VfVEVYVDoKLSAgICAgICAgICAgICgoQ1BERl9UZXh0T2JqZWN0Kil0aGlzKS0+UmVjYWxjUG9zaXRpb25EYXRhKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQREZQQUdFX1BBVEg6Ci0gICAgICAgICAgICAoKENQREZfUGF0aE9iamVjdCopdGhpcyktPkNhbGNCb3VuZGluZ0JveCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUERGUEFHRV9TSEFESU5HOgotICAgICAgICAgICAgKChDUERGX1NoYWRpbmdPYmplY3QqKXRoaXMpLT5DYWxjQm91bmRpbmdCb3goKTsKLSAgICAgICAgICAgIGJyZWFrOworCit2b2lkIENQREZfVGV4dE9iamVjdDo6R2V0Q2hhckluZm8oaW50IGluZGV4LCBDUERGX1RleHRPYmplY3RJdGVtKiBwSW5mbykgY29uc3QgeworICBpZiAobV9uQ2hhcnMgPT0gMSkgeworICAgIEdldEl0ZW1JbmZvKDAsIHBJbmZvKTsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IGNvdW50ID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25DaGFyczsgKytpKSB7CisgICAgRlhfRFdPUkQgY2hhcmNvZGUgPSBtX3BDaGFyQ29kZXNbaV07CisgICAgaWYgKGNoYXJjb2RlID09IChGWF9EV09SRCktMSkgeworICAgICAgY29udGludWU7CiAgICAgfQotfQotdm9pZCBDUERGX1BhZ2VPYmplY3Q6OlRyYW5zZm9ybUNsaXBQYXRoKENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCkKLXsKLSAgICBpZiAobV9DbGlwUGF0aC5Jc051bGwoKSkgewotICAgICAgICByZXR1cm47CisgICAgaWYgKGNvdW50ID09IGluZGV4KSB7CisgICAgICBHZXRJdGVtSW5mbyhpLCBwSW5mbyk7CisgICAgICBicmVhazsKICAgICB9CisgICAgKytjb3VudDsKKyAgfQorfQorCit2b2lkIENQREZfVGV4dE9iamVjdDo6Q29weURhdGEoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwU3JjKSB7CisgIGNvbnN0IENQREZfVGV4dE9iamVjdCogcFNyY09iaiA9IChjb25zdCBDUERGX1RleHRPYmplY3QqKXBTcmM7CisgIGlmIChtX25DaGFycyA+IDEpIHsKKyAgICBGWF9GcmVlKG1fcENoYXJDb2Rlcyk7CisgICAgbV9wQ2hhckNvZGVzID0gbnVsbHB0cjsKKyAgfQorICBGWF9GcmVlKG1fcENoYXJQb3MpOworICBtX3BDaGFyUG9zID0gbnVsbHB0cjsKKyAgbV9uQ2hhcnMgPSBwU3JjT2JqLT5tX25DaGFyczsKKyAgaWYgKG1fbkNoYXJzID4gMSkgeworICAgIG1fcENoYXJDb2RlcyA9IEZYX0FsbG9jKEZYX0RXT1JELCBtX25DaGFycyk7CisgICAgbV9wQ2hhclBvcyA9IEZYX0FsbG9jKEZYX0ZMT0FULCBtX25DaGFycyAtIDEpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uQ2hhcnM7ICsraSkgeworICAgICAgbV9wQ2hhckNvZGVzW2ldID0gcFNyY09iai0+bV9wQ2hhckNvZGVzW2ldOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbkNoYXJzIC0gMTsgKytpKSB7CisgICAgICBtX3BDaGFyUG9zW2ldID0gcFNyY09iai0+bV9wQ2hhclBvc1tpXTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbV9wQ2hhckNvZGVzID0gcFNyY09iai0+bV9wQ2hhckNvZGVzOworICB9CisgIG1fUG9zWCA9IHBTcmNPYmotPm1fUG9zWDsKKyAgbV9Qb3NZID0gcFNyY09iai0+bV9Qb3NZOworfQorCit2b2lkIENQREZfVGV4dE9iamVjdDo6R2V0VGV4dE1hdHJpeChDRlhfTWF0cml4KiBwTWF0cml4KSBjb25zdCB7CisgIEZYX0ZMT0FUKiBwVGV4dE1hdHJpeCA9IG1fVGV4dFN0YXRlLkdldE1hdHJpeCgpOworICBwTWF0cml4LT5TZXQocFRleHRNYXRyaXhbMF0sIHBUZXh0TWF0cml4WzJdLCBwVGV4dE1hdHJpeFsxXSwgcFRleHRNYXRyaXhbM10sCisgICAgICAgICAgICAgICBtX1Bvc1gsIG1fUG9zWSk7Cit9CisKK3ZvaWQgQ1BERl9UZXh0T2JqZWN0OjpTZXRTZWdtZW50cyhjb25zdCBDRlhfQnl0ZVN0cmluZyogcFN0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIHBLZXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuc2VncykgeworICBpZiAobV9uQ2hhcnMgPiAxKSB7CisgICAgRlhfRnJlZShtX3BDaGFyQ29kZXMpOworICAgIG1fcENoYXJDb2RlcyA9IG51bGxwdHI7CisgIH0KKyAgRlhfRnJlZShtX3BDaGFyUG9zKTsKKyAgbV9wQ2hhclBvcyA9IG51bGxwdHI7CisgIENQREZfRm9udCogcEZvbnQgPSBtX1RleHRTdGF0ZS5HZXRGb250KCk7CisgIG1fbkNoYXJzID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuc2VnczsgKytpKSB7CisgICAgbV9uQ2hhcnMgKz0gcEZvbnQtPkNvdW50Q2hhcihwU3Ryc1tpXSwgcFN0cnNbaV0uR2V0TGVuZ3RoKCkpOworICB9CisgIG1fbkNoYXJzICs9IG5zZWdzIC0gMTsKKyAgaWYgKG1fbkNoYXJzID4gMSkgeworICAgIG1fcENoYXJDb2RlcyA9IEZYX0FsbG9jKEZYX0RXT1JELCBtX25DaGFycyk7CisgICAgbV9wQ2hhclBvcyA9IEZYX0FsbG9jKEZYX0ZMT0FULCBtX25DaGFycyAtIDEpOworICAgIGludCBpbmRleCA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuc2VnczsgKytpKSB7CisgICAgICBjb25zdCBGWF9DSEFSKiBzZWdtZW50ID0gcFN0cnNbaV07CisgICAgICBpbnQgb2Zmc2V0ID0gMCwgbGVuID0gcFN0cnNbaV0uR2V0TGVuZ3RoKCk7CisgICAgICB3aGlsZSAob2Zmc2V0IDwgbGVuKSB7CisgICAgICAgIG1fcENoYXJDb2Rlc1tpbmRleCsrXSA9IHBGb250LT5HZXROZXh0Q2hhcihzZWdtZW50LCBsZW4sIG9mZnNldCk7CisgICAgICB9CisgICAgICBpZiAoaSAhPSBuc2VncyAtIDEpIHsKKyAgICAgICAgbV9wQ2hhclBvc1tpbmRleCAtIDFdID0gcEtlcm5pbmdbaV07CisgICAgICAgIG1fcENoYXJDb2Rlc1tpbmRleCsrXSA9IChGWF9EV09SRCktMTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW50IG9mZnNldCA9IDA7CisgICAgbV9wQ2hhckNvZGVzID0gKEZYX0RXT1JEKikodWludHB0cl90KXBGb250LT5HZXROZXh0Q2hhcigKKyAgICAgICAgcFN0cnNbMF0sIHBTdHJzWzBdLkdldExlbmd0aCgpLCBvZmZzZXQpOworICB9Cit9CisKK3ZvaWQgQ1BERl9UZXh0T2JqZWN0OjpTZXRUZXh0KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpIHsKKyAgU2V0U2VnbWVudHMoJnN0ciwgbnVsbHB0ciwgMSk7CisgIFJlY2FsY1Bvc2l0aW9uRGF0YSgpOworfQorCit2b2lkIENQREZfVGV4dE9iamVjdDo6U2V0RW1wdHkoKSB7CisgIGlmIChtX25DaGFycyA+IDEpIHsKKyAgICBGWF9GcmVlKG1fcENoYXJDb2Rlcyk7CisgIH0KKyAgaWYgKG1fbkNoYXJzID4gMSkgeworICAgIEZYX0ZyZWUobV9wQ2hhclBvcyk7CisgIH0KKyAgbV9uQ2hhcnMgPSAwOworICBtX3BDaGFyQ29kZXMgPSBudWxscHRyOworICBtX3BDaGFyUG9zID0gbnVsbHB0cjsKKyAgbV9MZWZ0ID0gbV9SaWdodCA9IG1fUG9zWDsKKyAgbV9Ub3AgPSBtX0JvdHRvbSA9IG1fUG9zWTsKK30KKwordm9pZCBDUERGX1RleHRPYmplY3Q6OlNldFRleHQoQ0ZYX0J5dGVTdHJpbmcqIHBTdHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIHBLZXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5TZWdzKSB7CisgIFNldFNlZ21lbnRzKHBTdHJzLCBwS2VybmluZywgblNlZ3MpOworICBSZWNhbGNQb3NpdGlvbkRhdGEoKTsKK30KKwordm9pZCBDUERGX1RleHRPYmplY3Q6OlNldFRleHQoaW50IG5DaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwQ2hhckNvZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIHBLZXJuaW5ncykgeworICBpZiAobV9uQ2hhcnMgPiAxKSB7CisgICAgRlhfRnJlZShtX3BDaGFyQ29kZXMpOworICAgIG1fcENoYXJDb2RlcyA9IG51bGxwdHI7CisgIH0KKyAgRlhfRnJlZShtX3BDaGFyUG9zKTsKKyAgbV9wQ2hhclBvcyA9IG51bGxwdHI7CisgIGludCBuS2VybmluZ3MgPSAwOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG5DaGFycyAtIDE7ICsraSkgeworICAgIGlmIChwS2VybmluZ3NbaV0gIT0gMCkgeworICAgICAgKytuS2VybmluZ3M7CisgICAgfQorICB9CisgIG1fbkNoYXJzID0gbkNoYXJzICsgbktlcm5pbmdzOworICBpZiAobV9uQ2hhcnMgPiAxKSB7CisgICAgbV9wQ2hhckNvZGVzID0gRlhfQWxsb2MoRlhfRFdPUkQsIG1fbkNoYXJzKTsKKyAgICBtX3BDaGFyUG9zID0gRlhfQWxsb2MoRlhfRkxPQVQsIG1fbkNoYXJzIC0gMSk7CisgICAgZm9yIChpbnQgaSA9IDAsIGluZGV4ID0gMDsgaSA8IG5DaGFyczsgKytpKSB7CisgICAgICBtX3BDaGFyQ29kZXNbaW5kZXgrK10gPSBwQ2hhckNvZGVzW2ldOworICAgICAgaWYgKHBLZXJuaW5nc1tpXSAhPSAwICYmIGkgIT0gbkNoYXJzIC0gMSkgeworICAgICAgICBtX3BDaGFyQ29kZXNbaW5kZXhdID0gKEZYX0RXT1JEKS0xOworICAgICAgICBtX3BDaGFyUG9zW2luZGV4IC0gMV0gPSBwS2VybmluZ3NbaV07CisgICAgICAgICsraW5kZXg7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIG1fcENoYXJDb2RlcyA9IChGWF9EV09SRCopKHVpbnRwdHJfdClwQ2hhckNvZGVzWzBdOworICB9CisgIFJlY2FsY1Bvc2l0aW9uRGF0YSgpOworfQorCitGWF9GTE9BVCBDUERGX1RleHRPYmplY3Q6OkdldENoYXJXaWR0aChGWF9EV09SRCBjaGFyY29kZSkgY29uc3QgeworICBGWF9GTE9BVCBmb250c2l6ZSA9IG1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCkgLyAxMDAwOworICBDUERGX0ZvbnQqIHBGb250ID0gbV9UZXh0U3RhdGUuR2V0Rm9udCgpOworICBGWF9CT09MIGJWZXJ0V3JpdGluZyA9IEZBTFNFOworICBDUERGX0NJREZvbnQqIHBDSURGb250ID0gcEZvbnQtPkdldENJREZvbnQoKTsKKyAgaWYgKHBDSURGb250KSB7CisgICAgYlZlcnRXcml0aW5nID0gcENJREZvbnQtPklzVmVydFdyaXRpbmcoKTsKKyAgfQorICBpZiAoIWJWZXJ0V3JpdGluZykKKyAgICByZXR1cm4gcEZvbnQtPkdldENoYXJXaWR0aEYoY2hhcmNvZGUsIDApICogZm9udHNpemU7CisKKyAgRlhfV09SRCBDSUQgPSBwQ0lERm9udC0+Q0lERnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKyAgcmV0dXJuIHBDSURGb250LT5HZXRWZXJ0V2lkdGgoQ0lEKSAqIGZvbnRzaXplOworfQorCitGWF9GTE9BVCBDUERGX1RleHRPYmplY3Q6OkdldFNwYWNlQ2hhcldpZHRoKCkgY29uc3QgeworICBDUERGX0ZvbnQqIHBGb250ID0gbV9UZXh0U3RhdGUuR2V0Rm9udCgpOworICBGWF9EV09SRCBjaGFyQ29kZSA9IG1fVGV4dFN0YXRlLkdldEZvbnQoKS0+Q2hhckNvZGVGcm9tVW5pY29kZSgzMik7CisgIGlmIChjaGFyQ29kZSAhPSAoRlhfRFdPUkQpLTEpIHsKKyAgICByZXR1cm4gR2V0Q2hhcldpZHRoKGNoYXJDb2RlKTsKKyAgfQorICBGWF9GTE9BVCBmb250U2l6ZSA9IG1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCkgLyA0MDAwLjBmOworICBGWF9CT09MIGJWZXJ0V3JpdGluZyA9IEZBTFNFOworICBDUERGX0NJREZvbnQqIHBDSURGb250ID0gcEZvbnQtPkdldENJREZvbnQoKTsKKyAgaWYgKHBDSURGb250KSB7CisgICAgYlZlcnRXcml0aW5nID0gcENJREZvbnQtPklzVmVydFdyaXRpbmcoKTsKKyAgfQorICBGWF9SRUNUIGZvbnRSZWN0OworICBwRm9udC0+R2V0Rm9udEJCb3goZm9udFJlY3QpOworICBmb250U2l6ZSAqPQorICAgICAgYlZlcnRXcml0aW5nID8gKEZYX0ZMT0FUKWZvbnRSZWN0LkhlaWdodCgpIDogKEZYX0ZMT0FUKWZvbnRSZWN0LldpZHRoKCk7CisgIHJldHVybiBmb250U2l6ZTsKK30KKwordm9pZCBDUERGX1RleHRPYmplY3Q6OkdldENoYXJSZWN0KGludCBpbmRleCwgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgY29uc3QgeworICBDUERGX0ZvbnQqIHBGb250ID0gbV9UZXh0U3RhdGUuR2V0Rm9udCgpOworICBGWF9CT09MIGJWZXJ0V3JpdGluZyA9IEZBTFNFOworICBDUERGX0NJREZvbnQqIHBDSURGb250ID0gcEZvbnQtPkdldENJREZvbnQoKTsKKyAgaWYgKHBDSURGb250KSB7CisgICAgYlZlcnRXcml0aW5nID0gcENJREZvbnQtPklzVmVydFdyaXRpbmcoKTsKKyAgfQorICBGWF9GTE9BVCBmb250c2l6ZSA9IG1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCkgLyAxMDAwOworICBpbnQgY291bnQgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IG1fbkNoYXJzOyArK2kpIHsKKyAgICBGWF9EV09SRCBjaGFyY29kZSA9CisgICAgICAgIG1fbkNoYXJzID09IDEgPyAoRlhfRFdPUkQpKHVpbnRwdHJfdCltX3BDaGFyQ29kZXMgOiBtX3BDaGFyQ29kZXNbaV07CisgICAgaWYgKGNoYXJjb2RlID09IChGWF9EV09SRCktMSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChjb3VudCAhPSBpbmRleCkgeworICAgICAgKytjb3VudDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBGWF9GTE9BVCBjdXJwb3MgPSBpID4gMCA/IG1fcENoYXJQb3NbaSAtIDFdIDogMDsKKyAgICBGWF9SRUNUIGNoYXJfcmVjdDsKKyAgICBwRm9udC0+R2V0Q2hhckJCb3goY2hhcmNvZGUsIGNoYXJfcmVjdCwgMCk7CisgICAgaWYgKCFiVmVydFdyaXRpbmcpIHsKKyAgICAgIHJlY3QubGVmdCA9IGN1cnBvcyArIGNoYXJfcmVjdC5sZWZ0ICogZm9udHNpemU7CisgICAgICByZWN0LnJpZ2h0ID0gY3VycG9zICsgY2hhcl9yZWN0LnJpZ2h0ICogZm9udHNpemU7CisgICAgICByZWN0LnRvcCA9IGNoYXJfcmVjdC50b3AgKiBmb250c2l6ZTsKKyAgICAgIHJlY3QuYm90dG9tID0gY2hhcl9yZWN0LmJvdHRvbSAqIGZvbnRzaXplOworICAgIH0gZWxzZSB7CisgICAgICBGWF9XT1JEIENJRCA9IHBDSURGb250LT5DSURGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOworICAgICAgc2hvcnQgdngsIHZ5OworICAgICAgcENJREZvbnQtPkdldFZlcnRPcmlnaW4oQ0lELCB2eCwgdnkpOworICAgICAgY2hhcl9yZWN0LmxlZnQgLT0gdng7CisgICAgICBjaGFyX3JlY3QucmlnaHQgLT0gdng7CisgICAgICBjaGFyX3JlY3QudG9wIC09IHZ5OworICAgICAgY2hhcl9yZWN0LmJvdHRvbSAtPSB2eTsKKyAgICAgIHJlY3QubGVmdCA9IGNoYXJfcmVjdC5sZWZ0ICogZm9udHNpemU7CisgICAgICByZWN0LnJpZ2h0ID0gY2hhcl9yZWN0LnJpZ2h0ICogZm9udHNpemU7CisgICAgICByZWN0LnRvcCA9IGN1cnBvcyArIGNoYXJfcmVjdC50b3AgKiBmb250c2l6ZTsKKyAgICAgIHJlY3QuYm90dG9tID0gY3VycG9zICsgY2hhcl9yZWN0LmJvdHRvbSAqIGZvbnRzaXplOworICAgIH0KKyAgICByZXR1cm47CisgIH0KK30KKwordm9pZCBDUERGX1RleHRPYmplY3Q6OkNhbGNQb3NpdGlvbkRhdGEoRlhfRkxPQVQqIHBUZXh0QWR2YW5jZVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcFRleHRBZHZhbmNlWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGhvcnpfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpIHsKKyAgRlhfRkxPQVQgY3VycG9zID0gMDsKKyAgRlhfRkxPQVQgbWluX3ggPSAxMDAwMCAqIDEuMGY7CisgIEZYX0ZMT0FUIG1heF94ID0gLTEwMDAwICogMS4wZjsKKyAgRlhfRkxPQVQgbWluX3kgPSAxMDAwMCAqIDEuMGY7CisgIEZYX0ZMT0FUIG1heF95ID0gLTEwMDAwICogMS4wZjsKKyAgQ1BERl9Gb250KiBwRm9udCA9IG1fVGV4dFN0YXRlLkdldEZvbnQoKTsKKyAgRlhfQk9PTCBiVmVydFdyaXRpbmcgPSBGQUxTRTsKKyAgQ1BERl9DSURGb250KiBwQ0lERm9udCA9IHBGb250LT5HZXRDSURGb250KCk7CisgIGlmIChwQ0lERm9udCkgeworICAgIGJWZXJ0V3JpdGluZyA9IHBDSURGb250LT5Jc1ZlcnRXcml0aW5nKCk7CisgIH0KKyAgRlhfRkxPQVQgZm9udHNpemUgPSBtX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IG1fbkNoYXJzOyArK2kpIHsKKyAgICBGWF9EV09SRCBjaGFyY29kZSA9CisgICAgICAgIG1fbkNoYXJzID09IDEgPyAoRlhfRFdPUkQpKHVpbnRwdHJfdCltX3BDaGFyQ29kZXMgOiBtX3BDaGFyQ29kZXNbaV07CisgICAgaWYgKGkgPiAwKSB7CisgICAgICBpZiAoY2hhcmNvZGUgPT0gKEZYX0RXT1JEKS0xKSB7CisgICAgICAgIGN1cnBvcyAtPSBGWFNZU19NdWwobV9wQ2hhclBvc1tpIC0gMV0sIGZvbnRzaXplKSAvIDEwMDA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgbV9wQ2hhclBvc1tpIC0gMV0gPSBjdXJwb3M7CisgICAgfQorICAgIEZYX1JFQ1QgY2hhcl9yZWN0OworICAgIHBGb250LT5HZXRDaGFyQkJveChjaGFyY29kZSwgY2hhcl9yZWN0LCBsZXZlbCk7CisgICAgRlhfRkxPQVQgY2hhcndpZHRoOworICAgIGlmICghYlZlcnRXcml0aW5nKSB7CisgICAgICBpZiAobWluX3kgPiBjaGFyX3JlY3QudG9wKSB7CisgICAgICAgIG1pbl95ID0gKEZYX0ZMT0FUKWNoYXJfcmVjdC50b3A7CisgICAgICB9CisgICAgICBpZiAobWF4X3kgPCBjaGFyX3JlY3QudG9wKSB7CisgICAgICAgIG1heF95ID0gKEZYX0ZMT0FUKWNoYXJfcmVjdC50b3A7CisgICAgICB9CisgICAgICBpZiAobWluX3kgPiBjaGFyX3JlY3QuYm90dG9tKSB7CisgICAgICAgIG1pbl95ID0gKEZYX0ZMT0FUKWNoYXJfcmVjdC5ib3R0b207CisgICAgICB9CisgICAgICBpZiAobWF4X3kgPCBjaGFyX3JlY3QuYm90dG9tKSB7CisgICAgICAgIG1heF95ID0gKEZYX0ZMT0FUKWNoYXJfcmVjdC5ib3R0b207CisgICAgICB9CisgICAgICBGWF9GTE9BVCBjaGFyX2xlZnQgPSBjdXJwb3MgKyBjaGFyX3JlY3QubGVmdCAqIGZvbnRzaXplIC8gMTAwMDsKKyAgICAgIEZYX0ZMT0FUIGNoYXJfcmlnaHQgPSBjdXJwb3MgKyBjaGFyX3JlY3QucmlnaHQgKiBmb250c2l6ZSAvIDEwMDA7CisgICAgICBpZiAobWluX3ggPiBjaGFyX2xlZnQpIHsKKyAgICAgICAgbWluX3ggPSBjaGFyX2xlZnQ7CisgICAgICB9CisgICAgICBpZiAobWF4X3ggPCBjaGFyX2xlZnQpIHsKKyAgICAgICAgbWF4X3ggPSBjaGFyX2xlZnQ7CisgICAgICB9CisgICAgICBpZiAobWluX3ggPiBjaGFyX3JpZ2h0KSB7CisgICAgICAgIG1pbl94ID0gY2hhcl9yaWdodDsKKyAgICAgIH0KKyAgICAgIGlmIChtYXhfeCA8IGNoYXJfcmlnaHQpIHsKKyAgICAgICAgbWF4X3ggPSBjaGFyX3JpZ2h0OworICAgICAgfQorICAgICAgY2hhcndpZHRoID0gcEZvbnQtPkdldENoYXJXaWR0aEYoY2hhcmNvZGUsIGxldmVsKSAqIGZvbnRzaXplIC8gMTAwMDsKKyAgICB9IGVsc2UgeworICAgICAgRlhfV09SRCBDSUQgPSBwQ0lERm9udC0+Q0lERnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKyAgICAgIHNob3J0IHZ4OworICAgICAgc2hvcnQgdnk7CisgICAgICBwQ0lERm9udC0+R2V0VmVydE9yaWdpbihDSUQsIHZ4LCB2eSk7CisgICAgICBjaGFyX3JlY3QubGVmdCAtPSB2eDsKKyAgICAgIGNoYXJfcmVjdC5yaWdodCAtPSB2eDsKKyAgICAgIGNoYXJfcmVjdC50b3AgLT0gdnk7CisgICAgICBjaGFyX3JlY3QuYm90dG9tIC09IHZ5OworICAgICAgaWYgKG1pbl94ID4gY2hhcl9yZWN0LmxlZnQpIHsKKyAgICAgICAgbWluX3ggPSAoRlhfRkxPQVQpY2hhcl9yZWN0LmxlZnQ7CisgICAgICB9CisgICAgICBpZiAobWF4X3ggPCBjaGFyX3JlY3QubGVmdCkgeworICAgICAgICBtYXhfeCA9IChGWF9GTE9BVCljaGFyX3JlY3QubGVmdDsKKyAgICAgIH0KKyAgICAgIGlmIChtaW5feCA+IGNoYXJfcmVjdC5yaWdodCkgeworICAgICAgICBtaW5feCA9IChGWF9GTE9BVCljaGFyX3JlY3QucmlnaHQ7CisgICAgICB9CisgICAgICBpZiAobWF4X3ggPCBjaGFyX3JlY3QucmlnaHQpIHsKKyAgICAgICAgbWF4X3ggPSAoRlhfRkxPQVQpY2hhcl9yZWN0LnJpZ2h0OworICAgICAgfQorICAgICAgRlhfRkxPQVQgY2hhcl90b3AgPSBjdXJwb3MgKyBjaGFyX3JlY3QudG9wICogZm9udHNpemUgLyAxMDAwOworICAgICAgRlhfRkxPQVQgY2hhcl9ib3R0b20gPSBjdXJwb3MgKyBjaGFyX3JlY3QuYm90dG9tICogZm9udHNpemUgLyAxMDAwOworICAgICAgaWYgKG1pbl95ID4gY2hhcl90b3ApIHsKKyAgICAgICAgbWluX3kgPSBjaGFyX3RvcDsKKyAgICAgIH0KKyAgICAgIGlmIChtYXhfeSA8IGNoYXJfdG9wKSB7CisgICAgICAgIG1heF95ID0gY2hhcl90b3A7CisgICAgICB9CisgICAgICBpZiAobWluX3kgPiBjaGFyX2JvdHRvbSkgeworICAgICAgICBtaW5feSA9IGNoYXJfYm90dG9tOworICAgICAgfQorICAgICAgaWYgKG1heF95IDwgY2hhcl9ib3R0b20pIHsKKyAgICAgICAgbWF4X3kgPSBjaGFyX2JvdHRvbTsKKyAgICAgIH0KKyAgICAgIGNoYXJ3aWR0aCA9IHBDSURGb250LT5HZXRWZXJ0V2lkdGgoQ0lEKSAqIGZvbnRzaXplIC8gMTAwMDsKKyAgICB9CisgICAgY3VycG9zICs9IGNoYXJ3aWR0aDsKKyAgICBpZiAoY2hhcmNvZGUgPT0gJyAnICYmICghcENJREZvbnQgfHwgcENJREZvbnQtPkdldENoYXJTaXplKDMyKSA9PSAxKSkgeworICAgICAgY3VycG9zICs9IG1fVGV4dFN0YXRlLkdldE9iamVjdCgpLT5tX1dvcmRTcGFjZTsKKyAgICB9CisgICAgY3VycG9zICs9IG1fVGV4dFN0YXRlLkdldE9iamVjdCgpLT5tX0NoYXJTcGFjZTsKKyAgfQorICBpZiAoYlZlcnRXcml0aW5nKSB7CisgICAgaWYgKHBUZXh0QWR2YW5jZVgpIHsKKyAgICAgICpwVGV4dEFkdmFuY2VYID0gMDsKKyAgICB9CisgICAgaWYgKHBUZXh0QWR2YW5jZVkpIHsKKyAgICAgICpwVGV4dEFkdmFuY2VZID0gY3VycG9zOworICAgIH0KKyAgICBtaW5feCA9IG1pbl94ICogZm9udHNpemUgLyAxMDAwOworICAgIG1heF94ID0gbWF4X3ggKiBmb250c2l6ZSAvIDEwMDA7CisgIH0gZWxzZSB7CisgICAgaWYgKHBUZXh0QWR2YW5jZVgpIHsKKyAgICAgICpwVGV4dEFkdmFuY2VYID0gRlhTWVNfTXVsKGN1cnBvcywgaG9yel9zY2FsZSk7CisgICAgfQorICAgIGlmIChwVGV4dEFkdmFuY2VZKSB7CisgICAgICAqcFRleHRBZHZhbmNlWSA9IDA7CisgICAgfQorICAgIG1pbl95ID0gbWluX3kgKiBmb250c2l6ZSAvIDEwMDA7CisgICAgbWF4X3kgPSBtYXhfeSAqIGZvbnRzaXplIC8gMTAwMDsKKyAgfQorICBDRlhfTWF0cml4IG1hdHJpeDsKKyAgR2V0VGV4dE1hdHJpeCgmbWF0cml4KTsKKyAgbV9MZWZ0ID0gbWluX3g7CisgIG1fUmlnaHQgPSBtYXhfeDsKKyAgbV9Cb3R0b20gPSBtaW5feTsKKyAgbV9Ub3AgPSBtYXhfeTsKKyAgbWF0cml4LlRyYW5zZm9ybVJlY3QobV9MZWZ0LCBtX1JpZ2h0LCBtX1RvcCwgbV9Cb3R0b20pOworICBpbnQgdGV4dG1vZGUgPSBtX1RleHRTdGF0ZS5HZXRPYmplY3QoKS0+bV9UZXh0TW9kZTsKKyAgaWYgKHRleHRtb2RlID09IDEgfHwgdGV4dG1vZGUgPT0gMiB8fCB0ZXh0bW9kZSA9PSA1IHx8IHRleHRtb2RlID09IDYpIHsKKyAgICBGWF9GTE9BVCBoYWxmX3dpZHRoID0gbV9HcmFwaFN0YXRlLkdldE9iamVjdCgpLT5tX0xpbmVXaWR0aCAvIDI7CisgICAgbV9MZWZ0IC09IGhhbGZfd2lkdGg7CisgICAgbV9SaWdodCArPSBoYWxmX3dpZHRoOworICAgIG1fVG9wICs9IGhhbGZfd2lkdGg7CisgICAgbV9Cb3R0b20gLT0gaGFsZl93aWR0aDsKKyAgfQorfQorCit2b2lkIENQREZfVGV4dE9iamVjdDo6Q2FsY0NoYXJQb3MoRlhfRkxPQVQqIHBQb3NBcnJheSkgY29uc3QgeworICBDUERGX0ZvbnQqIHBGb250ID0gbV9UZXh0U3RhdGUuR2V0Rm9udCgpOworICBGWF9CT09MIGJWZXJ0V3JpdGluZyA9IEZBTFNFOworICBDUERGX0NJREZvbnQqIHBDSURGb250ID0gcEZvbnQtPkdldENJREZvbnQoKTsKKyAgaWYgKHBDSURGb250KSB7CisgICAgYlZlcnRXcml0aW5nID0gcENJREZvbnQtPklzVmVydFdyaXRpbmcoKTsKKyAgfQorICBGWF9GTE9BVCBmb250c2l6ZSA9IG1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCk7CisgIGZvciAoaW50IGkgPSAwLCBpbmRleCA9IDA7IGkgPCBtX25DaGFyczsgKytpKSB7CisgICAgRlhfRFdPUkQgY2hhcmNvZGUgPQorICAgICAgICBtX25DaGFycyA9PSAxID8gKEZYX0RXT1JEKSh1aW50cHRyX3QpbV9wQ2hhckNvZGVzIDogbV9wQ2hhckNvZGVzW2ldOworICAgIGlmIChjaGFyY29kZSA9PSAoRlhfRFdPUkQpLTEpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBwUG9zQXJyYXlbaW5kZXgrK10gPSBpID8gbV9wQ2hhclBvc1tpIC0gMV0gOiAwOworICAgIEZYX0ZMT0FUIGNoYXJ3aWR0aDsKKyAgICBpZiAoYlZlcnRXcml0aW5nKSB7CisgICAgICBGWF9XT1JEIENJRCA9IHBDSURGb250LT5DSURGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOworICAgICAgY2hhcndpZHRoID0gcENJREZvbnQtPkdldFZlcnRXaWR0aChDSUQpICogZm9udHNpemUgLyAxMDAwOworICAgIH0gZWxzZSB7CisgICAgICBjaGFyd2lkdGggPSBwRm9udC0+R2V0Q2hhcldpZHRoRihjaGFyY29kZSkgKiBmb250c2l6ZSAvIDEwMDA7CisgICAgfQorICAgIHBQb3NBcnJheVtpbmRleF0gPSBwUG9zQXJyYXlbaW5kZXggLSAxXSArIGNoYXJ3aWR0aDsKKyAgICBpbmRleCsrOworICB9Cit9CisKK3ZvaWQgQ1BERl9UZXh0T2JqZWN0OjpUcmFuc2Zvcm0oY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7CisgIG1fVGV4dFN0YXRlLkdldE1vZGlmeSgpOworICBDRlhfTWF0cml4IHRleHRfbWF0cml4OworICBHZXRUZXh0TWF0cml4KCZ0ZXh0X21hdHJpeCk7CisgIHRleHRfbWF0cml4LkNvbmNhdChtYXRyaXgpOworICBGWF9GTE9BVCogcFRleHRNYXRyaXggPSBtX1RleHRTdGF0ZS5HZXRNYXRyaXgoKTsKKyAgcFRleHRNYXRyaXhbMF0gPSB0ZXh0X21hdHJpeC5HZXRBKCk7CisgIHBUZXh0TWF0cml4WzFdID0gdGV4dF9tYXRyaXguR2V0QygpOworICBwVGV4dE1hdHJpeFsyXSA9IHRleHRfbWF0cml4LkdldEIoKTsKKyAgcFRleHRNYXRyaXhbM10gPSB0ZXh0X21hdHJpeC5HZXREKCk7CisgIG1fUG9zWCA9IHRleHRfbWF0cml4LkdldEUoKTsKKyAgbV9Qb3NZID0gdGV4dF9tYXRyaXguR2V0RigpOworICBDYWxjUG9zaXRpb25EYXRhKG51bGxwdHIsIG51bGxwdHIsIDApOworfQorCit2b2lkIENQREZfVGV4dE9iamVjdDo6U2V0UG9zaXRpb24oRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkgeworICBGWF9GTE9BVCBkeCA9IHggLSBtX1Bvc1g7CisgIEZYX0ZMT0FUIGR5ID0geSAtIG1fUG9zWTsKKyAgbV9Qb3NYID0geDsKKyAgbV9Qb3NZID0geTsKKyAgbV9MZWZ0ICs9IGR4OworICBtX1JpZ2h0ICs9IGR4OworICBtX1RvcCArPSBkeTsKKyAgbV9Cb3R0b20gKz0gZHk7Cit9CisKK3ZvaWQgQ1BERl9UZXh0T2JqZWN0OjpTZXREYXRhKGludCBuQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcENoYXJDb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBwQ2hhclBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5KSB7CisgIEFTU0VSVChtX25DaGFycyA9PSAwKTsKKyAgbV9uQ2hhcnMgPSBuQ2hhcnM7CisgIG1fUG9zWCA9IHg7CisgIG1fUG9zWSA9IHk7CisgIGlmIChuQ2hhcnMgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAobkNoYXJzID09IDEpIHsKKyAgICBtX3BDaGFyQ29kZXMgPSAoRlhfRFdPUkQqKSh1aW50cHRyX3QpKnBDaGFyQ29kZXM7CisgIH0gZWxzZSB7CisgICAgbV9wQ2hhckNvZGVzID0gRlhfQWxsb2MoRlhfRFdPUkQsIG5DaGFycyk7CisgICAgRlhTWVNfbWVtY3B5KG1fcENoYXJDb2RlcywgcENoYXJDb2Rlcywgc2l6ZW9mKEZYX0RXT1JEKSAqIG5DaGFycyk7CisgICAgbV9wQ2hhclBvcyA9IEZYX0FsbG9jKEZYX0ZMT0FULCBuQ2hhcnMgLSAxKTsKKyAgICBGWFNZU19tZW1jcHkobV9wQ2hhclBvcywgcENoYXJQb3MsIHNpemVvZihGWF9GTE9BVCkgKiAobkNoYXJzIC0gMSkpOworICB9CisgIFJlY2FsY1Bvc2l0aW9uRGF0YSgpOworfQorCit2b2lkIENQREZfVGV4dE9iamVjdDo6U2V0VGV4dFN0YXRlKENQREZfVGV4dFN0YXRlIFRleHRTdGF0ZSkgeworICBtX1RleHRTdGF0ZSA9IFRleHRTdGF0ZTsKKyAgQ2FsY1Bvc2l0aW9uRGF0YShudWxscHRyLCBudWxscHRyLCAwKTsKK30KKworQ1BERl9TaGFkaW5nT2JqZWN0OjpDUERGX1NoYWRpbmdPYmplY3QoKSB7CisgIG1fcFNoYWRpbmcgPSBOVUxMOworICBtX1R5cGUgPSBQREZQQUdFX1NIQURJTkc7Cit9CitDUERGX1NoYWRpbmdPYmplY3Q6On5DUERGX1NoYWRpbmdPYmplY3QoKSB7fQordm9pZCBDUERGX1NoYWRpbmdPYmplY3Q6OkNvcHlEYXRhKGNvbnN0IENQREZfUGFnZU9iamVjdCogcFNyYykgeworICBDUERGX1NoYWRpbmdPYmplY3QqIHBTcmNPYmogPSAoQ1BERl9TaGFkaW5nT2JqZWN0KilwU3JjOworICBtX3BTaGFkaW5nID0gcFNyY09iai0+bV9wU2hhZGluZzsKKyAgaWYgKG1fcFNoYWRpbmcgJiYgbV9wU2hhZGluZy0+bV9wRG9jdW1lbnQpIHsKKyAgICBDUERGX0RvY1BhZ2VEYXRhKiBwRG9jUGFnZURhdGEgPSBtX3BTaGFkaW5nLT5tX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKTsKKyAgICBtX3BTaGFkaW5nID0gKENQREZfU2hhZGluZ1BhdHRlcm4qKXBEb2NQYWdlRGF0YS0+R2V0UGF0dGVybigKKyAgICAgICAgbV9wU2hhZGluZy0+bV9wU2hhZGluZ09iaiwgbV9wU2hhZGluZy0+bV9iU2hhZGluZ09iaiwKKyAgICAgICAgJm1fcFNoYWRpbmctPm1fUGFyZW50TWF0cml4KTsKKyAgfQorICBtX01hdHJpeCA9IHBTcmNPYmotPm1fTWF0cml4OworfQordm9pZCBDUERGX1NoYWRpbmdPYmplY3Q6OlRyYW5zZm9ybShjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsKKyAgaWYgKCFtX0NsaXBQYXRoLklzTnVsbCgpKSB7CiAgICAgbV9DbGlwUGF0aC5HZXRNb2RpZnkoKTsKICAgICBtX0NsaXBQYXRoLlRyYW5zZm9ybShtYXRyaXgpOwotfQotdm9pZCBDUERGX1BhZ2VPYmplY3Q6OlRyYW5zZm9ybUdlbmVyYWxTdGF0ZShDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgpCi17Ci0gICAgaWYobV9HZW5lcmFsU3RhdGUuSXNOdWxsKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX0dlbmVyYWxTdGF0ZURhdGEqIHBHUyA9IG1fR2VuZXJhbFN0YXRlLkdldE1vZGlmeSgpOwotICAgIHBHUy0+bV9NYXRyaXguQ29uY2F0KG1hdHJpeCk7Ci19Ci1GWF9SRUNUIENQREZfUGFnZU9iamVjdDo6R2V0QkJveChjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4KSBjb25zdAotewotICAgIENGWF9GbG9hdFJlY3QgcmVjdChtX0xlZnQsIG1fQm90dG9tLCBtX1JpZ2h0LCBtX1RvcCk7Ci0gICAgaWYgKHBNYXRyaXgpIHsKLSAgICAgICAgcE1hdHJpeC0+VHJhbnNmb3JtUmVjdChyZWN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlY3QuR2V0T3V0dGVyUmVjdCgpOwotfQotQ1BERl9UZXh0T2JqZWN0OjpDUERGX1RleHRPYmplY3QoKQotewotICAgIG1fVHlwZSA9IFBERlBBR0VfVEVYVDsKLSAgICBtX3BDaGFyQ29kZXMgPSBOVUxMOwotICAgIG1fcENoYXJQb3MgPSBOVUxMOwotICAgIG1fbkNoYXJzID0gMDsKLSAgICBtX1Bvc1ggPSBtX1Bvc1kgPSAwOwotfQotQ1BERl9UZXh0T2JqZWN0Ojp+Q1BERl9UZXh0T2JqZWN0KCkKLXsKLSAgICBpZiAobV9uQ2hhcnMgPiAxICYmIG1fcENoYXJDb2RlcykgewotICAgICAgICBGWF9GcmVlKG1fcENoYXJDb2Rlcyk7Ci0gICAgfQotICAgIGlmIChtX3BDaGFyUG9zKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wQ2hhclBvcyk7Ci0gICAgfQotfQotdm9pZCBDUERGX1RleHRPYmplY3Q6OkdldEl0ZW1JbmZvKGludCBpbmRleCwgQ1BERl9UZXh0T2JqZWN0SXRlbSogcEluZm8pIGNvbnN0Ci17Ci0gICAgcEluZm8tPm1fQ2hhckNvZGUgPSBtX25DaGFycyA9PSAxID8gKEZYX0RXT1JEKShGWF9VSU5UUFRSKW1fcENoYXJDb2RlcyA6IG1fcENoYXJDb2Rlc1tpbmRleF07Ci0gICAgcEluZm8tPm1fT3JpZ2luWCA9IGluZGV4ID8gbV9wQ2hhclBvc1tpbmRleCAtIDFdIDogMDsKLSAgICBwSW5mby0+bV9PcmlnaW5ZID0gMDsKLSAgICBpZiAocEluZm8tPm1fQ2hhckNvZGUgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX0ZvbnQqIHBGb250ID0gbV9UZXh0U3RhdGUuR2V0Rm9udCgpOwotICAgIGlmIChwRm9udC0+R2V0Rm9udFR5cGUoKSAhPSBQREZGT05UX0NJREZPTlQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoISgoQ1BERl9DSURGb250KilwRm9udCktPklzVmVydFdyaXRpbmcoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYX1dPUkQgQ0lEID0gKChDUERGX0NJREZvbnQqKXBGb250KS0+Q0lERnJvbUNoYXJDb2RlKHBJbmZvLT5tX0NoYXJDb2RlKTsKLSAgICBwSW5mby0+bV9PcmlnaW5ZID0gcEluZm8tPm1fT3JpZ2luWDsKLSAgICBwSW5mby0+bV9PcmlnaW5YID0gMDsKLSAgICBzaG9ydCB2eCwgdnk7Ci0gICAgKChDUERGX0NJREZvbnQqKXBGb250KS0+R2V0VmVydE9yaWdpbihDSUQsIHZ4LCB2eSk7Ci0gICAgRlhfRkxPQVQgZm9udHNpemUgPSBtX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpOwotICAgIHBJbmZvLT5tX09yaWdpblggLT0gZm9udHNpemUgKiB2eCAvIDEwMDA7Ci0gICAgcEluZm8tPm1fT3JpZ2luWSAtPSBmb250c2l6ZSAqIHZ5IC8gMTAwMDsKLX0KLWludCBDUERGX1RleHRPYmplY3Q6OkNvdW50Q2hhcnMoKSBjb25zdAotewotICAgIGlmIChtX25DaGFycyA9PSAxKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpbnQgY291bnQgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uQ2hhcnM7IGkgKyspCi0gICAgICAgIGlmIChtX3BDaGFyQ29kZXNbaV0gIT0gKEZYX0RXT1JEKSAtIDEpIHsKLSAgICAgICAgICAgIGNvdW50ICsrOwotICAgICAgICB9Ci0gICAgcmV0dXJuIGNvdW50OwotfQotdm9pZCBDUERGX1RleHRPYmplY3Q6OkdldENoYXJJbmZvKGludCBpbmRleCwgRlhfRFdPUkQmIGNoYXJjb2RlLCBGWF9GTE9BVCYga2VybmluZykgY29uc3QKLXsKLSAgICBpZiAobV9uQ2hhcnMgPT0gMSkgewotICAgICAgICBjaGFyY29kZSA9IChGWF9EV09SRCkoRlhfVUlOVFBUUiltX3BDaGFyQ29kZXM7Ci0gICAgICAgIGtlcm5pbmcgPSAwOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludCBjb3VudCA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25DaGFyczsgaSArKykgewotICAgICAgICBpZiAobV9wQ2hhckNvZGVzW2ldICE9IChGWF9EV09SRCkgLSAxKSB7Ci0gICAgICAgICAgICBpZiAoY291bnQgPT0gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICBjaGFyY29kZSA9IG1fcENoYXJDb2Rlc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoaSA9PSBtX25DaGFycyAtIDEgfHwgbV9wQ2hhckNvZGVzW2kgKyAxXSAhPSAoRlhfRFdPUkQpIC0gMSkgewotICAgICAgICAgICAgICAgICAgICBrZXJuaW5nID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBrZXJuaW5nID0gbV9wQ2hhclBvc1tpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY291bnQgKys7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci12b2lkIENQREZfVGV4dE9iamVjdDo6R2V0Q2hhckluZm8oaW50IGluZGV4LCBDUERGX1RleHRPYmplY3RJdGVtKiBwSW5mbykgY29uc3QKLXsKLSAgICBpZiAobV9uQ2hhcnMgPT0gMSkgewotICAgICAgICBHZXRJdGVtSW5mbygwLCBwSW5mbyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IGNvdW50ID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbkNoYXJzOyBpICsrKSB7Ci0gICAgICAgIEZYX0RXT1JEIGNoYXJjb2RlID0gbV9wQ2hhckNvZGVzW2ldOwotICAgICAgICBpZiAoY2hhcmNvZGUgPT0gKEZYX0RXT1JEKSAtIDEpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb3VudCA9PSBpbmRleCkgewotICAgICAgICAgICAgR2V0SXRlbUluZm8oaSwgcEluZm8pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY291bnQgKys7Ci0gICAgfQotfQotdm9pZCBDUERGX1RleHRPYmplY3Q6OkNvcHlEYXRhKGNvbnN0IENQREZfUGFnZU9iamVjdCogcFNyYykKLXsKLSAgICBjb25zdCBDUERGX1RleHRPYmplY3QqIHBTcmNPYmogPSAoY29uc3QgQ1BERl9UZXh0T2JqZWN0KilwU3JjOwotICAgIGlmIChtX25DaGFycyA+IDEgJiYgbV9wQ2hhckNvZGVzKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wQ2hhckNvZGVzKTsKLSAgICAgICAgbV9wQ2hhckNvZGVzID0gTlVMTDsKLSAgICB9Ci0gICAgaWYgKG1fcENoYXJQb3MpIHsKLSAgICAgICAgRlhfRnJlZShtX3BDaGFyUG9zKTsKLSAgICAgICAgbV9wQ2hhclBvcyA9IE5VTEw7Ci0gICAgfQotICAgIG1fbkNoYXJzID0gcFNyY09iai0+bV9uQ2hhcnM7Ci0gICAgaWYgKG1fbkNoYXJzID4gMSkgewotICAgICAgICBtX3BDaGFyQ29kZXMgPSBGWF9BbGxvYyhGWF9EV09SRCwgbV9uQ2hhcnMpOwotICAgICAgICBtX3BDaGFyUG9zID0gRlhfQWxsb2MoRlhfRkxPQVQsIG1fbkNoYXJzIC0gMSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uQ2hhcnM7IGkgKyspIHsKLSAgICAgICAgICAgIG1fcENoYXJDb2Rlc1tpXSA9IHBTcmNPYmotPm1fcENoYXJDb2Rlc1tpXTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbkNoYXJzIC0gMTsgaSArKykgewotICAgICAgICAgICAgbV9wQ2hhclBvc1tpXSA9IHBTcmNPYmotPm1fcENoYXJQb3NbaV07Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtX3BDaGFyQ29kZXMgPSBwU3JjT2JqLT5tX3BDaGFyQ29kZXM7Ci0gICAgfQotICAgIG1fUG9zWCA9IHBTcmNPYmotPm1fUG9zWDsKLSAgICBtX1Bvc1kgPSBwU3JjT2JqLT5tX1Bvc1k7Ci19Ci12b2lkIENQREZfVGV4dE9iamVjdDo6R2V0VGV4dE1hdHJpeChDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4KSBjb25zdAotewotICAgIEZYX0ZMT0FUKiBwVGV4dE1hdHJpeCA9IG1fVGV4dFN0YXRlLkdldE1hdHJpeCgpOwotICAgIHBNYXRyaXgtPlNldChwVGV4dE1hdHJpeFswXSwgcFRleHRNYXRyaXhbMl0sIHBUZXh0TWF0cml4WzFdLCBwVGV4dE1hdHJpeFszXSwgbV9Qb3NYLCBtX1Bvc1kpOwotfQotdm9pZCBDUERGX1RleHRPYmplY3Q6OlNldFNlZ21lbnRzKGNvbnN0IENGWF9CeXRlU3RyaW5nKiBwU3RycywgRlhfRkxPQVQqIHBLZXJuaW5nLCBpbnQgbnNlZ3MpCi17Ci0gICAgaWYgKG1fbkNoYXJzID4gMSAmJiBtX3BDaGFyQ29kZXMpIHsKLSAgICAgICAgRlhfRnJlZShtX3BDaGFyQ29kZXMpOwotICAgICAgICBtX3BDaGFyQ29kZXMgPSBOVUxMOwotICAgIH0KLSAgICBpZiAobV9wQ2hhclBvcykgewotICAgICAgICBGWF9GcmVlKG1fcENoYXJQb3MpOwotICAgICAgICBtX3BDaGFyUG9zID0gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9Gb250KiBwRm9udCA9IG1fVGV4dFN0YXRlLkdldEZvbnQoKTsKLSAgICBtX25DaGFycyA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuc2VnczsgaSArKykgewotICAgICAgICBtX25DaGFycyArPSBwRm9udC0+Q291bnRDaGFyKHBTdHJzW2ldLCBwU3Ryc1tpXS5HZXRMZW5ndGgoKSk7Ci0gICAgfQotICAgIG1fbkNoYXJzICs9IG5zZWdzIC0gMTsKLSAgICBpZiAobV9uQ2hhcnMgPiAxKSB7Ci0gICAgICAgIG1fcENoYXJDb2RlcyA9IEZYX0FsbG9jKEZYX0RXT1JELCBtX25DaGFycyk7Ci0gICAgICAgIG1fcENoYXJQb3MgPSBGWF9BbGxvYyhGWF9GTE9BVCwgbV9uQ2hhcnMgLSAxKTsKLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuc2VnczsgaSArKykgewotICAgICAgICAgICAgRlhfTFBDU1RSIHNlZ21lbnQgPSBwU3Ryc1tpXTsKLSAgICAgICAgICAgIGludCBvZmZzZXQgPSAwLCBsZW4gPSBwU3Ryc1tpXS5HZXRMZW5ndGgoKTsKLSAgICAgICAgICAgIHdoaWxlIChvZmZzZXQgPCBsZW4pIHsKLSAgICAgICAgICAgICAgICBtX3BDaGFyQ29kZXNbaW5kZXgrK10gPSBwRm9udC0+R2V0TmV4dENoYXIoc2VnbWVudCwgbGVuLCBvZmZzZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkgIT0gbnNlZ3MgLSAxKSB7Ci0gICAgICAgICAgICAgICAgbV9wQ2hhclBvc1tpbmRleCAtIDFdID0gcEtlcm5pbmdbaV07Ci0gICAgICAgICAgICAgICAgbV9wQ2hhckNvZGVzW2luZGV4ICsrXSA9IChGWF9EV09SRCkgLSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IG9mZnNldCA9IDA7Ci0gICAgICAgIG1fcENoYXJDb2RlcyA9IChGWF9EV09SRCopKEZYX1VJTlRQVFIpcEZvbnQtPkdldE5leHRDaGFyKHBTdHJzWzBdLCBwU3Ryc1swXS5HZXRMZW5ndGgoKSwgb2Zmc2V0KTsKLSAgICB9Ci19Ci12b2lkIENQREZfVGV4dE9iamVjdDo6U2V0VGV4dChjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKQotewotICAgIFNldFNlZ21lbnRzKCZzdHIsIE5VTEwsIDEpOwotICAgIFJlY2FsY1Bvc2l0aW9uRGF0YSgpOwotfQotdm9pZCBDUERGX1RleHRPYmplY3Q6OlNldEVtcHR5KCkKLXsKLSAgICBpZiAobV9uQ2hhcnMgPiAxICYmIG1fcENoYXJDb2RlcykgewotICAgICAgICBGWF9GcmVlKG1fcENoYXJDb2Rlcyk7Ci0gICAgfQotICAgIGlmIChtX25DaGFycyA+IDEgJiYgbV9wQ2hhclBvcykgewotICAgICAgICBGWF9GcmVlKG1fcENoYXJQb3MpOwotICAgIH0KLSAgICBtX25DaGFycyA9IDA7Ci0gICAgbV9wQ2hhckNvZGVzID0gTlVMTDsKLSAgICBtX3BDaGFyUG9zID0gTlVMTDsKLSAgICBtX0xlZnQgPSBtX1JpZ2h0ID0gbV9Qb3NYOwotICAgIG1fVG9wID0gbV9Cb3R0b20gPSBtX1Bvc1k7Ci19Ci12b2lkIENQREZfVGV4dE9iamVjdDo6U2V0VGV4dChDRlhfQnl0ZVN0cmluZyogcFN0cnMsIEZYX0ZMT0FUKiBwS2VybmluZywgaW50IG5TZWdzKQotewotICAgIFNldFNlZ21lbnRzKHBTdHJzLCBwS2VybmluZywgblNlZ3MpOwotICAgIFJlY2FsY1Bvc2l0aW9uRGF0YSgpOwotfQotdm9pZCBDUERGX1RleHRPYmplY3Q6OlNldFRleHQoaW50IG5DaGFycywgRlhfRFdPUkQqIHBDaGFyQ29kZXMsIEZYX0ZMT0FUKiBwS2VybmluZ3MpCi17Ci0gICAgaWYgKG1fbkNoYXJzID4gMSAmJiBtX3BDaGFyQ29kZXMpIHsKLSAgICAgICAgRlhfRnJlZShtX3BDaGFyQ29kZXMpOwotICAgICAgICBtX3BDaGFyQ29kZXMgPSBOVUxMOwotICAgIH0KLSAgICBpZiAobV9wQ2hhclBvcykgewotICAgICAgICBGWF9GcmVlKG1fcENoYXJQb3MpOwotICAgICAgICBtX3BDaGFyUG9zID0gTlVMTDsKLSAgICB9Ci0gICAgaW50IG5LZXJuaW5ncyA9IDA7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5DaGFycyAtIDE7IGkgKyspCi0gICAgICAgIGlmIChwS2VybmluZ3NbaV0gIT0gMCkgewotICAgICAgICAgICAgbktlcm5pbmdzICsrOwotICAgICAgICB9Ci0gICAgbV9uQ2hhcnMgPSBuQ2hhcnMgKyBuS2VybmluZ3M7Ci0gICAgaWYgKG1fbkNoYXJzID4gMSkgewotICAgICAgICBtX3BDaGFyQ29kZXMgPSBGWF9BbGxvYyhGWF9EV09SRCwgbV9uQ2hhcnMpOwotICAgICAgICBtX3BDaGFyUG9zID0gRlhfQWxsb2MoRlhfRkxPQVQsIG1fbkNoYXJzIC0gMSk7Ci0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNoYXJzOyBpICsrKSB7Ci0gICAgICAgICAgICBtX3BDaGFyQ29kZXNbaW5kZXgrK10gPSBwQ2hhckNvZGVzW2ldOwotICAgICAgICAgICAgaWYgKHBLZXJuaW5nc1tpXSAhPSAwICYmIGkgIT0gbkNoYXJzIC0gMSkgewotICAgICAgICAgICAgICAgIG1fcENoYXJDb2Rlc1tpbmRleF0gPSAoRlhfRFdPUkQpIC0gMTsKLSAgICAgICAgICAgICAgICBtX3BDaGFyUG9zW2luZGV4IC0gMV0gPSBwS2VybmluZ3NbaV07Ci0gICAgICAgICAgICAgICAgaW5kZXggKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtX3BDaGFyQ29kZXMgPSAoRlhfRFdPUkQqKShGWF9VSU5UUFRSKXBDaGFyQ29kZXNbMF07Ci0gICAgfQotICAgIFJlY2FsY1Bvc2l0aW9uRGF0YSgpOwotfQotRlhfRkxPQVQgQ1BERl9UZXh0T2JqZWN0OjpHZXRDaGFyV2lkdGgoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0Ci17Ci0gICAgRlhfRkxPQVQgZm9udHNpemUgPSBtX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpIC8gMTAwMDsKLSAgICBDUERGX0ZvbnQqIHBGb250ID0gbV9UZXh0U3RhdGUuR2V0Rm9udCgpOwotICAgIEZYX0JPT0wgYlZlcnRXcml0aW5nID0gRkFMU0U7Ci0gICAgQ1BERl9DSURGb250KiBwQ0lERm9udCA9IHBGb250LT5HZXRDSURGb250KCk7Ci0gICAgaWYgKHBDSURGb250KSB7Ci0gICAgICAgIGJWZXJ0V3JpdGluZyA9IHBDSURGb250LT5Jc1ZlcnRXcml0aW5nKCk7Ci0gICAgfQotICAgIGlmICghYlZlcnRXcml0aW5nKSB7Ci0gICAgICAgIHJldHVybiBwRm9udC0+R2V0Q2hhcldpZHRoRihjaGFyY29kZSwgMCkgKiBmb250c2l6ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBGWF9XT1JEIENJRCA9IHBDSURGb250LT5DSURGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOwotICAgICAgICByZXR1cm4gcENJREZvbnQtPkdldFZlcnRXaWR0aChDSUQpICogZm9udHNpemU7Ci0gICAgfQotfQotRlhfRkxPQVQgQ1BERl9UZXh0T2JqZWN0OjpHZXRTcGFjZUNoYXJXaWR0aCgpIGNvbnN0Ci17Ci0gICAgQ1BERl9Gb250KiBwRm9udCA9IG1fVGV4dFN0YXRlLkdldEZvbnQoKTsKLSAgICBGWF9EV09SRCBjaGFyQ29kZSA9IG1fVGV4dFN0YXRlLkdldEZvbnQoKS0+Q2hhckNvZGVGcm9tVW5pY29kZSgzMik7Ci0gICAgaWYgKGNoYXJDb2RlICE9IChGWF9EV09SRCkgLSAxKSB7Ci0gICAgICAgIHJldHVybiBHZXRDaGFyV2lkdGgoY2hhckNvZGUpOwotICAgIH0KLSAgICBGWF9GTE9BVCBmb250U2l6ZSA9IG1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCkgLyA0MDAwLjBmOwotICAgIEZYX0JPT0wgYlZlcnRXcml0aW5nID0gRkFMU0U7Ci0gICAgQ1BERl9DSURGb250KiBwQ0lERm9udCA9IHBGb250LT5HZXRDSURGb250KCk7Ci0gICAgaWYgKHBDSURGb250KSB7Ci0gICAgICAgIGJWZXJ0V3JpdGluZyA9IHBDSURGb250LT5Jc1ZlcnRXcml0aW5nKCk7Ci0gICAgfQotICAgIEZYX1JFQ1QgZm9udFJlY3Q7Ci0gICAgcEZvbnQtPkdldEZvbnRCQm94KGZvbnRSZWN0KTsKLSAgICBmb250U2l6ZSAqPSBiVmVydFdyaXRpbmcgPyAoRlhfRkxPQVQpZm9udFJlY3QuSGVpZ2h0KCkgOiAoRlhfRkxPQVQpZm9udFJlY3QuV2lkdGgoKTsKLSAgICByZXR1cm4gZm9udFNpemU7Ci19Ci12b2lkIENQREZfVGV4dE9iamVjdDo6R2V0Q2hhclJlY3QoaW50IGluZGV4LCBDRlhfRmxvYXRSZWN0JiByZWN0KSBjb25zdAotewotICAgIENQREZfRm9udCogcEZvbnQgPSBtX1RleHRTdGF0ZS5HZXRGb250KCk7Ci0gICAgRlhfQk9PTCBiVmVydFdyaXRpbmcgPSBGQUxTRTsKLSAgICBDUERGX0NJREZvbnQqIHBDSURGb250ID0gcEZvbnQtPkdldENJREZvbnQoKTsKLSAgICBpZiAocENJREZvbnQpIHsKLSAgICAgICAgYlZlcnRXcml0aW5nID0gcENJREZvbnQtPklzVmVydFdyaXRpbmcoKTsKLSAgICB9Ci0gICAgRlhfRkxPQVQgZm9udHNpemUgPSBtX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpIC8gMTAwMDsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uQ2hhcnM7IGkgKyspIHsKLSAgICAgICAgRlhfRFdPUkQgY2hhcmNvZGUgPSBtX25DaGFycyA9PSAxID8gKEZYX0RXT1JEKShGWF9VSU5UUFRSKW1fcENoYXJDb2RlcyA6IG1fcENoYXJDb2Rlc1tpXTsKLSAgICAgICAgaWYgKGNoYXJjb2RlID09IChGWF9EV09SRCkgLSAxKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiggY291bnQgIT0gaW5kZXgpIHsKLSAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBGWF9GTE9BVCBjdXJwb3MgPSBpID4gMCA/IG1fcENoYXJQb3NbaSAtIDFdIDogMDsKLSAgICAgICAgRlhfUkVDVCBjaGFyX3JlY3Q7Ci0gICAgICAgIHBGb250LT5HZXRDaGFyQkJveChjaGFyY29kZSwgY2hhcl9yZWN0LCAwKTsKLSAgICAgICAgaWYgKCFiVmVydFdyaXRpbmcpIHsKLSAgICAgICAgICAgIHJlY3QubGVmdCA9IGN1cnBvcyArIGNoYXJfcmVjdC5sZWZ0ICogZm9udHNpemU7Ci0gICAgICAgICAgICByZWN0LnJpZ2h0ID0gY3VycG9zICsgY2hhcl9yZWN0LnJpZ2h0ICogZm9udHNpemU7Ci0gICAgICAgICAgICByZWN0LnRvcCA9IGNoYXJfcmVjdC50b3AgKiBmb250c2l6ZTsKLSAgICAgICAgICAgIHJlY3QuYm90dG9tID0gY2hhcl9yZWN0LmJvdHRvbSAqIGZvbnRzaXplOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRlhfV09SRCBDSUQgPSBwQ0lERm9udC0+Q0lERnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKLSAgICAgICAgICAgIHNob3J0IHZ4LCB2eTsKLSAgICAgICAgICAgIHBDSURGb250LT5HZXRWZXJ0T3JpZ2luKENJRCwgdngsIHZ5KTsKLSAgICAgICAgICAgIGNoYXJfcmVjdC5sZWZ0IC09IHZ4OwotICAgICAgICAgICAgY2hhcl9yZWN0LnJpZ2h0IC09IHZ4OwotICAgICAgICAgICAgY2hhcl9yZWN0LnRvcCAtPSB2eTsKLSAgICAgICAgICAgIGNoYXJfcmVjdC5ib3R0b20gLT0gdnk7Ci0gICAgICAgICAgICByZWN0LmxlZnQgPSBjaGFyX3JlY3QubGVmdCAqIGZvbnRzaXplOwotICAgICAgICAgICAgcmVjdC5yaWdodCA9IGNoYXJfcmVjdC5yaWdodCAqIGZvbnRzaXplOwotICAgICAgICAgICAgcmVjdC50b3AgPSBjdXJwb3MgKyBjaGFyX3JlY3QudG9wICogZm9udHNpemU7Ci0gICAgICAgICAgICByZWN0LmJvdHRvbSA9IGN1cnBvcyArIGNoYXJfcmVjdC5ib3R0b20gKiBmb250c2l6ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotfQotdm9pZCBDUERGX1RleHRPYmplY3Q6OkNhbGNQb3NpdGlvbkRhdGEoRlhfRkxPQVQqIHBUZXh0QWR2YW5jZVgsIEZYX0ZMT0FUKiBwVGV4dEFkdmFuY2VZLCBGWF9GTE9BVCBob3J6X3NjYWxlLCBpbnQgbGV2ZWwpCi17Ci0gICAgRlhfRkxPQVQgY3VycG9zID0gMDsKLSAgICBGWF9GTE9BVCBtaW5feCA9IDEwMDAwICogMS4wZiwgbWF4X3ggPSAtMTAwMDAgKiAxLjBmLCBtaW5feSA9IDEwMDAwICogMS4wZiwgbWF4X3kgPSAtMTAwMDAgKiAxLjBmOwotICAgIENQREZfRm9udCogcEZvbnQgPSBtX1RleHRTdGF0ZS5HZXRGb250KCk7Ci0gICAgRlhfQk9PTCBiVmVydFdyaXRpbmcgPSBGQUxTRTsKLSAgICBDUERGX0NJREZvbnQqIHBDSURGb250ID0gcEZvbnQtPkdldENJREZvbnQoKTsKLSAgICBpZiAocENJREZvbnQpIHsKLSAgICAgICAgYlZlcnRXcml0aW5nID0gcENJREZvbnQtPklzVmVydFdyaXRpbmcoKTsKLSAgICB9Ci0gICAgRlhfRkxPQVQgZm9udHNpemUgPSBtX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uQ2hhcnM7IGkgKyspIHsKLSAgICAgICAgRlhfRFdPUkQgY2hhcmNvZGUgPSBtX25DaGFycyA9PSAxID8gKEZYX0RXT1JEKShGWF9VSU5UUFRSKW1fcENoYXJDb2RlcyA6IG1fcENoYXJDb2Rlc1tpXTsKLSAgICAgICAgaWYgKGNoYXJjb2RlID09IChGWF9EV09SRCkgLSAxKSB7Ci0gICAgICAgICAgICBjdXJwb3MgLT0gRlhTWVNfTXVsKG1fcENoYXJQb3NbaSAtIDFdLCBmb250c2l6ZSkgLyAxMDAwOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGkpIHsKLSAgICAgICAgICAgIG1fcENoYXJQb3NbaSAtIDFdID0gY3VycG9zOwotICAgICAgICB9Ci0gICAgICAgIEZYX1JFQ1QgY2hhcl9yZWN0OwotICAgICAgICBwRm9udC0+R2V0Q2hhckJCb3goY2hhcmNvZGUsIGNoYXJfcmVjdCwgbGV2ZWwpOwotICAgICAgICBGWF9GTE9BVCBjaGFyd2lkdGg7Ci0gICAgICAgIGlmICghYlZlcnRXcml0aW5nKSB7Ci0gICAgICAgICAgICBpZiAobWluX3kgPiBjaGFyX3JlY3QudG9wKSB7Ci0gICAgICAgICAgICAgICAgbWluX3kgPSAoRlhfRkxPQVQpY2hhcl9yZWN0LnRvcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtYXhfeSA8IGNoYXJfcmVjdC50b3ApIHsKLSAgICAgICAgICAgICAgICBtYXhfeSA9IChGWF9GTE9BVCljaGFyX3JlY3QudG9wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1pbl95ID4gY2hhcl9yZWN0LmJvdHRvbSkgewotICAgICAgICAgICAgICAgIG1pbl95ID0gKEZYX0ZMT0FUKWNoYXJfcmVjdC5ib3R0b207Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWF4X3kgPCBjaGFyX3JlY3QuYm90dG9tKSB7Ci0gICAgICAgICAgICAgICAgbWF4X3kgPSAoRlhfRkxPQVQpY2hhcl9yZWN0LmJvdHRvbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX0ZMT0FUIGNoYXJfbGVmdCA9IGN1cnBvcyArIGNoYXJfcmVjdC5sZWZ0ICogZm9udHNpemUgLyAxMDAwOwotICAgICAgICAgICAgRlhfRkxPQVQgY2hhcl9yaWdodCA9IGN1cnBvcyArIGNoYXJfcmVjdC5yaWdodCAqIGZvbnRzaXplIC8gMTAwMDsKLSAgICAgICAgICAgIGlmIChtaW5feCA+IGNoYXJfbGVmdCkgewotICAgICAgICAgICAgICAgIG1pbl94ID0gY2hhcl9sZWZ0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1heF94IDwgY2hhcl9sZWZ0KSB7Ci0gICAgICAgICAgICAgICAgbWF4X3ggPSBjaGFyX2xlZnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWluX3ggPiBjaGFyX3JpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgbWluX3ggPSBjaGFyX3JpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1heF94IDwgY2hhcl9yaWdodCkgewotICAgICAgICAgICAgICAgIG1heF94ID0gY2hhcl9yaWdodDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoYXJ3aWR0aCA9IHBGb250LT5HZXRDaGFyV2lkdGhGKGNoYXJjb2RlLCBsZXZlbCkgKiBmb250c2l6ZSAvIDEwMDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGWF9XT1JEIENJRCA9IHBDSURGb250LT5DSURGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOwotICAgICAgICAgICAgc2hvcnQgdngsIHZ5OwotICAgICAgICAgICAgcENJREZvbnQtPkdldFZlcnRPcmlnaW4oQ0lELCB2eCwgdnkpOwotICAgICAgICAgICAgY2hhcl9yZWN0LmxlZnQgLT0gdng7Ci0gICAgICAgICAgICBjaGFyX3JlY3QucmlnaHQgLT0gdng7Ci0gICAgICAgICAgICBjaGFyX3JlY3QudG9wIC09IHZ5OwotICAgICAgICAgICAgY2hhcl9yZWN0LmJvdHRvbSAtPSB2eTsKLSAgICAgICAgICAgIGlmIChtaW5feCA+IGNoYXJfcmVjdC5sZWZ0KSB7Ci0gICAgICAgICAgICAgICAgbWluX3ggPSAoRlhfRkxPQVQpY2hhcl9yZWN0LmxlZnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWF4X3ggPCBjaGFyX3JlY3QubGVmdCkgewotICAgICAgICAgICAgICAgIG1heF94ID0gKEZYX0ZMT0FUKWNoYXJfcmVjdC5sZWZ0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1pbl94ID4gY2hhcl9yZWN0LnJpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgbWluX3ggPSAoRlhfRkxPQVQpY2hhcl9yZWN0LnJpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1heF94IDwgY2hhcl9yZWN0LnJpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgbWF4X3ggPSAoRlhfRkxPQVQpY2hhcl9yZWN0LnJpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfRkxPQVQgY2hhcl90b3AgPSBjdXJwb3MgKyBjaGFyX3JlY3QudG9wICogZm9udHNpemUgLyAxMDAwOwotICAgICAgICAgICAgRlhfRkxPQVQgY2hhcl9ib3R0b20gPSBjdXJwb3MgKyBjaGFyX3JlY3QuYm90dG9tICogZm9udHNpemUgLyAxMDAwOwotICAgICAgICAgICAgaWYgKG1pbl95ID4gY2hhcl90b3ApIHsKLSAgICAgICAgICAgICAgICBtaW5feSA9IGNoYXJfdG9wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1heF95IDwgY2hhcl90b3ApIHsKLSAgICAgICAgICAgICAgICBtYXhfeSA9IGNoYXJfdG9wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1pbl95ID4gY2hhcl9ib3R0b20pIHsKLSAgICAgICAgICAgICAgICBtaW5feSA9IGNoYXJfYm90dG9tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1heF95IDwgY2hhcl9ib3R0b20pIHsKLSAgICAgICAgICAgICAgICBtYXhfeSA9IGNoYXJfYm90dG9tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hhcndpZHRoID0gcENJREZvbnQtPkdldFZlcnRXaWR0aChDSUQpICogZm9udHNpemUgLyAxMDAwOwotICAgICAgICB9Ci0gICAgICAgIGN1cnBvcyArPSBjaGFyd2lkdGg7Ci0gICAgICAgIGlmIChjaGFyY29kZSA9PSAnICcgJiYgKHBDSURGb250ID09IE5VTEwgfHwgcENJREZvbnQtPkdldENoYXJTaXplKDMyKSA9PSAxKSkgewotICAgICAgICAgICAgY3VycG9zICs9IG1fVGV4dFN0YXRlLkdldE9iamVjdCgpLT5tX1dvcmRTcGFjZTsKLSAgICAgICAgfQotICAgICAgICBjdXJwb3MgKz0gbV9UZXh0U3RhdGUuR2V0T2JqZWN0KCktPm1fQ2hhclNwYWNlOwotICAgIH0KLSAgICBpZiAoYlZlcnRXcml0aW5nKSB7Ci0gICAgICAgIGlmIChwVGV4dEFkdmFuY2VYKSB7Ci0gICAgICAgICAgICAqcFRleHRBZHZhbmNlWCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBUZXh0QWR2YW5jZVkpIHsKLSAgICAgICAgICAgICpwVGV4dEFkdmFuY2VZID0gY3VycG9zOwotICAgICAgICB9Ci0gICAgICAgIG1pbl94ID0gbWluX3ggKiBmb250c2l6ZSAvIDEwMDA7Ci0gICAgICAgIG1heF94ID0gbWF4X3ggKiBmb250c2l6ZSAvIDEwMDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHBUZXh0QWR2YW5jZVgpIHsKLSAgICAgICAgICAgICpwVGV4dEFkdmFuY2VYID0gRlhTWVNfTXVsKGN1cnBvcywgaG9yel9zY2FsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBUZXh0QWR2YW5jZVkpIHsKLSAgICAgICAgICAgICpwVGV4dEFkdmFuY2VZID0gMDsKLSAgICAgICAgfQotICAgICAgICBtaW5feSA9IG1pbl95ICogZm9udHNpemUgLyAxMDAwOwotICAgICAgICBtYXhfeSA9IG1heF95ICogZm9udHNpemUgLyAxMDAwOwotICAgIH0KLSAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKLSAgICBHZXRUZXh0TWF0cml4KCZtYXRyaXgpOwotICAgIG1fTGVmdCA9IG1pbl94OwotICAgIG1fUmlnaHQgPSBtYXhfeDsKLSAgICBtX0JvdHRvbSA9IG1pbl95OwotICAgIG1fVG9wID0gbWF4X3k7Ci0gICAgbWF0cml4LlRyYW5zZm9ybVJlY3QobV9MZWZ0LCBtX1JpZ2h0LCBtX1RvcCwgbV9Cb3R0b20pOwotICAgIGludCB0ZXh0bW9kZSA9IG1fVGV4dFN0YXRlLkdldE9iamVjdCgpLT5tX1RleHRNb2RlOwotICAgIGlmICh0ZXh0bW9kZSA9PSAxIHx8IHRleHRtb2RlID09IDIgfHwgdGV4dG1vZGUgPT0gNSB8fCB0ZXh0bW9kZSA9PSA2KSB7Ci0gICAgICAgIEZYX0ZMT0FUIGhhbGZfd2lkdGggPSBtX0dyYXBoU3RhdGUuR2V0T2JqZWN0KCktPm1fTGluZVdpZHRoIC8gMjsKLSAgICAgICAgbV9MZWZ0IC09IGhhbGZfd2lkdGg7Ci0gICAgICAgIG1fUmlnaHQgKz0gaGFsZl93aWR0aDsKLSAgICAgICAgbV9Ub3AgKz0gaGFsZl93aWR0aDsKLSAgICAgICAgbV9Cb3R0b20gLT0gaGFsZl93aWR0aDsKLSAgICB9Ci19Ci12b2lkIENQREZfVGV4dE9iamVjdDo6Q2FsY0NoYXJQb3MoRlhfRkxPQVQqIHBQb3NBcnJheSkgY29uc3QKLXsKLSAgICBDUERGX0ZvbnQqIHBGb250ID0gbV9UZXh0U3RhdGUuR2V0Rm9udCgpOwotICAgIEZYX0JPT0wgYlZlcnRXcml0aW5nID0gRkFMU0U7Ci0gICAgQ1BERl9DSURGb250KiBwQ0lERm9udCA9IHBGb250LT5HZXRDSURGb250KCk7Ci0gICAgaWYgKHBDSURGb250KSB7Ci0gICAgICAgIGJWZXJ0V3JpdGluZyA9IHBDSURGb250LT5Jc1ZlcnRXcml0aW5nKCk7Ci0gICAgfQotICAgIEZYX0ZMT0FUIGZvbnRzaXplID0gbV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKTsKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uQ2hhcnM7IGkgKyspIHsKLSAgICAgICAgRlhfRFdPUkQgY2hhcmNvZGUgPSBtX25DaGFycyA9PSAxID8gKEZYX0RXT1JEKShGWF9VSU5UUFRSKW1fcENoYXJDb2RlcyA6IG1fcENoYXJDb2Rlc1tpXTsKLSAgICAgICAgaWYgKGNoYXJjb2RlID09IChGWF9EV09SRCkgLSAxKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBwUG9zQXJyYXlbaW5kZXgrK10gPSBpID8gbV9wQ2hhclBvc1tpIC0gMV0gOiAwOwotICAgICAgICBGWF9GTE9BVCBjaGFyd2lkdGg7Ci0gICAgICAgIGlmIChiVmVydFdyaXRpbmcpIHsKLSAgICAgICAgICAgIEZYX1dPUkQgQ0lEID0gcENJREZvbnQtPkNJREZyb21DaGFyQ29kZShjaGFyY29kZSk7Ci0gICAgICAgICAgICBjaGFyd2lkdGggPSBwQ0lERm9udC0+R2V0VmVydFdpZHRoKENJRCkgKiBmb250c2l6ZSAvIDEwMDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjaGFyd2lkdGggPSBwRm9udC0+R2V0Q2hhcldpZHRoRihjaGFyY29kZSkgKiBmb250c2l6ZSAvIDEwMDA7Ci0gICAgICAgIH0KLSAgICAgICAgcFBvc0FycmF5W2luZGV4XSA9IHBQb3NBcnJheVtpbmRleCAtIDFdICsgY2hhcndpZHRoOwotICAgICAgICBpbmRleCsrOwotICAgIH0KLX0KLXZvaWQgQ1BERl9UZXh0T2JqZWN0OjpUcmFuc2Zvcm0oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KQotewotICAgIG1fVGV4dFN0YXRlLkdldE1vZGlmeSgpOwotICAgIENGWF9BZmZpbmVNYXRyaXggdGV4dF9tYXRyaXg7Ci0gICAgR2V0VGV4dE1hdHJpeCgmdGV4dF9tYXRyaXgpOwotICAgIHRleHRfbWF0cml4LkNvbmNhdChtYXRyaXgpOwotICAgIEZYX0ZMT0FUKiBwVGV4dE1hdHJpeCA9IG1fVGV4dFN0YXRlLkdldE1hdHJpeCgpOwotICAgIHBUZXh0TWF0cml4WzBdID0gdGV4dF9tYXRyaXguR2V0QSgpOwotICAgIHBUZXh0TWF0cml4WzFdID0gdGV4dF9tYXRyaXguR2V0QygpOwotICAgIHBUZXh0TWF0cml4WzJdID0gdGV4dF9tYXRyaXguR2V0QigpOwotICAgIHBUZXh0TWF0cml4WzNdID0gdGV4dF9tYXRyaXguR2V0RCgpOwotICAgIG1fUG9zWCA9IHRleHRfbWF0cml4LkdldEUoKTsKLSAgICBtX1Bvc1kgPSB0ZXh0X21hdHJpeC5HZXRGKCk7Ci0gICAgQ2FsY1Bvc2l0aW9uRGF0YShOVUxMLCBOVUxMLCAwKTsKLX0KLXZvaWQgQ1BERl9UZXh0T2JqZWN0OjpTZXRQb3NpdGlvbihGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KQotewotICAgIEZYX0ZMT0FUIGR4ID0geCAtIG1fUG9zWDsKLSAgICBGWF9GTE9BVCBkeSA9IHkgLSBtX1Bvc1k7Ci0gICAgbV9Qb3NYID0geDsKLSAgICBtX1Bvc1kgPSB5OwotICAgIG1fTGVmdCArPSBkeDsKLSAgICBtX1JpZ2h0ICs9IGR4OwotICAgIG1fVG9wICs9IGR5OwotICAgIG1fQm90dG9tICs9IGR5OwotfQotdm9pZCBDUERGX1RleHRPYmplY3Q6OlNldERhdGEoaW50IG5DaGFycywgRlhfRFdPUkQqIHBDaGFyQ29kZXMsIEZYX0ZMT0FUKiBwQ2hhclBvcywgRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkKLXsKLSAgICBBU1NFUlQobV9uQ2hhcnMgPT0gMCk7Ci0gICAgbV9uQ2hhcnMgPSBuQ2hhcnM7Ci0gICAgbV9Qb3NYID0geDsKLSAgICBtX1Bvc1kgPSB5OwotICAgIGlmIChuQ2hhcnMgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChuQ2hhcnMgPT0gMSkgewotICAgICAgICBtX3BDaGFyQ29kZXMgPSAoRlhfRFdPUkQqKShGWF9VSU5UUFRSKSAqIHBDaGFyQ29kZXM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wQ2hhckNvZGVzID0gRlhfQWxsb2MoRlhfRFdPUkQsIG5DaGFycyk7Ci0gICAgICAgIEZYU1lTX21lbWNweTMyKG1fcENoYXJDb2RlcywgcENoYXJDb2Rlcywgc2l6ZW9mKEZYX0RXT1JEKSpuQ2hhcnMpOwotICAgICAgICBtX3BDaGFyUG9zID0gRlhfQWxsb2MoRlhfRkxPQVQsIG5DaGFycyAtIDEpOwotICAgICAgICBGWFNZU19tZW1jcHkzMihtX3BDaGFyUG9zLCBwQ2hhclBvcywgc2l6ZW9mKEZYX0ZMT0FUKSAqIChuQ2hhcnMgLSAxKSk7Ci0gICAgfQotICAgIFJlY2FsY1Bvc2l0aW9uRGF0YSgpOwotfQotdm9pZCBDUERGX1RleHRPYmplY3Q6OlNldFRleHRTdGF0ZShDUERGX1RleHRTdGF0ZSBUZXh0U3RhdGUpCi17Ci0gICAgbV9UZXh0U3RhdGUgPSBUZXh0U3RhdGU7Ci0gICAgQ2FsY1Bvc2l0aW9uRGF0YShOVUxMLCBOVUxMLCAwKTsKLX0KLUNQREZfU2hhZGluZ09iamVjdDo6Q1BERl9TaGFkaW5nT2JqZWN0KCkKLXsKLSAgICBtX3BTaGFkaW5nID0gTlVMTDsKLSAgICBtX1R5cGUgPSBQREZQQUdFX1NIQURJTkc7Ci19Ci1DUERGX1NoYWRpbmdPYmplY3Q6On5DUERGX1NoYWRpbmdPYmplY3QoKQotewotfQotdm9pZCBDUERGX1NoYWRpbmdPYmplY3Q6OkNvcHlEYXRhKGNvbnN0IENQREZfUGFnZU9iamVjdCogcFNyYykKLXsKLSAgICBDUERGX1NoYWRpbmdPYmplY3QqIHBTcmNPYmogPSAoQ1BERl9TaGFkaW5nT2JqZWN0KilwU3JjOwotICAgIG1fcFNoYWRpbmcgPSBwU3JjT2JqLT5tX3BTaGFkaW5nOwotICAgIGlmIChtX3BTaGFkaW5nICYmIG1fcFNoYWRpbmctPm1fcERvY3VtZW50KSB7Ci0gICAgICAgIENQREZfRG9jUGFnZURhdGEqIHBEb2NQYWdlRGF0YSA9IG1fcFNoYWRpbmctPm1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpOwotICAgICAgICBtX3BTaGFkaW5nID0gKENQREZfU2hhZGluZ1BhdHRlcm4qKXBEb2NQYWdlRGF0YS0+R2V0UGF0dGVybihtX3BTaGFkaW5nLT5tX3BTaGFkaW5nT2JqLCBtX3BTaGFkaW5nLT5tX2JTaGFkaW5nT2JqLCAmbV9wU2hhZGluZy0+bV9QYXJlbnRNYXRyaXgpOwotICAgIH0KLSAgICBtX01hdHJpeCA9IHBTcmNPYmotPm1fTWF0cml4OwotfQotdm9pZCBDUERGX1NoYWRpbmdPYmplY3Q6OlRyYW5zZm9ybShjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgpCi17Ci0gICAgaWYgKCFtX0NsaXBQYXRoLklzTnVsbCgpKSB7Ci0gICAgICAgIG1fQ2xpcFBhdGguR2V0TW9kaWZ5KCk7Ci0gICAgICAgIG1fQ2xpcFBhdGguVHJhbnNmb3JtKG1hdHJpeCk7Ci0gICAgfQotICAgIG1fTWF0cml4LkNvbmNhdChtYXRyaXgpOwotICAgIGlmICghbV9DbGlwUGF0aC5Jc051bGwoKSkgewotICAgICAgICBDYWxjQm91bmRpbmdCb3goKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtYXRyaXguVHJhbnNmb3JtUmVjdChtX0xlZnQsIG1fUmlnaHQsIG1fVG9wLCBtX0JvdHRvbSk7Ci0gICAgfQotfQotdm9pZCBDUERGX1NoYWRpbmdPYmplY3Q6OkNhbGNCb3VuZGluZ0JveCgpCi17Ci0gICAgaWYgKG1fQ2xpcFBhdGguSXNOdWxsKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBtX0NsaXBQYXRoLkdldENsaXBCb3goKTsKLSAgICBtX0xlZnQgPSByZWN0LmxlZnQ7Ci0gICAgbV9Cb3R0b20gPSByZWN0LmJvdHRvbTsKLSAgICBtX1JpZ2h0ID0gcmVjdC5yaWdodDsKLSAgICBtX1RvcCA9IHJlY3QudG9wOwotfQotQ1BERl9Gb3JtT2JqZWN0Ojp+Q1BERl9Gb3JtT2JqZWN0KCkKLXsKLSAgICBpZiAobV9wRm9ybSkgewotICAgICAgICBkZWxldGUgbV9wRm9ybTsKLSAgICB9Ci19Ci12b2lkIENQREZfRm9ybU9iamVjdDo6VHJhbnNmb3JtKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIG1hdHJpeCkKLXsKLSAgICBtX0Zvcm1NYXRyaXguQ29uY2F0KG1hdHJpeCk7CisgIH0KKyAgbV9NYXRyaXguQ29uY2F0KG1hdHJpeCk7CisgIGlmICghbV9DbGlwUGF0aC5Jc051bGwoKSkgewogICAgIENhbGNCb3VuZGluZ0JveCgpOworICB9IGVsc2UgeworICAgIG1hdHJpeC5UcmFuc2Zvcm1SZWN0KG1fTGVmdCwgbV9SaWdodCwgbV9Ub3AsIG1fQm90dG9tKTsKKyAgfQogfQotdm9pZCBDUERGX0Zvcm1PYmplY3Q6OkNvcHlEYXRhKGNvbnN0IENQREZfUGFnZU9iamVjdCogcFNyYykKLXsKLSAgICBjb25zdCBDUERGX0Zvcm1PYmplY3QqIHBTcmNPYmogPSAoY29uc3QgQ1BERl9Gb3JtT2JqZWN0KilwU3JjOwotICAgIGlmIChtX3BGb3JtKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BGb3JtOwotICAgIH0KLSAgICBtX3BGb3JtID0gcFNyY09iai0+bV9wRm9ybS0+Q2xvbmUoKTsKLSAgICBtX0Zvcm1NYXRyaXggPSBwU3JjT2JqLT5tX0Zvcm1NYXRyaXg7Cit2b2lkIENQREZfU2hhZGluZ09iamVjdDo6Q2FsY0JvdW5kaW5nQm94KCkgeworICBpZiAobV9DbGlwUGF0aC5Jc051bGwoKSkgeworICAgIHJldHVybjsKKyAgfQorICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBtX0NsaXBQYXRoLkdldENsaXBCb3goKTsKKyAgbV9MZWZ0ID0gcmVjdC5sZWZ0OworICBtX0JvdHRvbSA9IHJlY3QuYm90dG9tOworICBtX1JpZ2h0ID0gcmVjdC5yaWdodDsKKyAgbV9Ub3AgPSByZWN0LnRvcDsKIH0KLXZvaWQgQ1BERl9Gb3JtT2JqZWN0OjpDYWxjQm91bmRpbmdCb3goKQotewotICAgIENGWF9GbG9hdFJlY3QgZm9ybV9yZWN0ID0gbV9wRm9ybS0+Q2FsY0JvdW5kaW5nQm94KCk7Ci0gICAgZm9ybV9yZWN0LlRyYW5zZm9ybSgmbV9Gb3JtTWF0cml4KTsKLSAgICBtX0xlZnQgPSBmb3JtX3JlY3QubGVmdDsKLSAgICBtX0JvdHRvbSA9IGZvcm1fcmVjdC5ib3R0b207Ci0gICAgbV9SaWdodCA9IGZvcm1fcmVjdC5yaWdodDsKLSAgICBtX1RvcCA9IGZvcm1fcmVjdC50b3A7CitDUERGX0Zvcm1PYmplY3Q6On5DUERGX0Zvcm1PYmplY3QoKSB7CisgIGRlbGV0ZSBtX3BGb3JtOwogfQotQ1BERl9QYWdlT2JqZWN0czo6Q1BERl9QYWdlT2JqZWN0cyhGWF9CT09MIGJSZWxlYXNlTWVtYmVycykgOiBtX09iamVjdExpc3QoMTI4KQotewotICAgIG1fYkJhY2tncm91bmRBbHBoYU5lZWRlZCA9IEZBTFNFOwotICAgIG1fYlJlbGVhc2VNZW1iZXJzID0gYlJlbGVhc2VNZW1iZXJzOwotICAgIG1fUGFyc2VTdGF0ZSA9IFBERl9DT05URU5UX05PVF9QQVJTRUQ7Cit2b2lkIENQREZfRm9ybU9iamVjdDo6VHJhbnNmb3JtKGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgeworICBtX0Zvcm1NYXRyaXguQ29uY2F0KG1hdHJpeCk7CisgIENhbGNCb3VuZGluZ0JveCgpOworfQordm9pZCBDUERGX0Zvcm1PYmplY3Q6OkNvcHlEYXRhKGNvbnN0IENQREZfUGFnZU9iamVjdCogcFNyYykgeworICBjb25zdCBDUERGX0Zvcm1PYmplY3QqIHBTcmNPYmogPSAoY29uc3QgQ1BERl9Gb3JtT2JqZWN0KilwU3JjOworICBkZWxldGUgbV9wRm9ybTsKKyAgbV9wRm9ybSA9IHBTcmNPYmotPm1fcEZvcm0tPkNsb25lKCk7CisgIG1fRm9ybU1hdHJpeCA9IHBTcmNPYmotPm1fRm9ybU1hdHJpeDsKK30KK3ZvaWQgQ1BERl9Gb3JtT2JqZWN0OjpDYWxjQm91bmRpbmdCb3goKSB7CisgIENGWF9GbG9hdFJlY3QgZm9ybV9yZWN0ID0gbV9wRm9ybS0+Q2FsY0JvdW5kaW5nQm94KCk7CisgIGZvcm1fcmVjdC5UcmFuc2Zvcm0oJm1fRm9ybU1hdHJpeCk7CisgIG1fTGVmdCA9IGZvcm1fcmVjdC5sZWZ0OworICBtX0JvdHRvbSA9IGZvcm1fcmVjdC5ib3R0b207CisgIG1fUmlnaHQgPSBmb3JtX3JlY3QucmlnaHQ7CisgIG1fVG9wID0gZm9ybV9yZWN0LnRvcDsKK30KK0NQREZfUGFnZU9iamVjdHM6OkNQREZfUGFnZU9iamVjdHMoRlhfQk9PTCBiUmVsZWFzZU1lbWJlcnMpCisgICAgOiBtX3BGb3JtRGljdChudWxscHRyKSwKKyAgICAgIG1fcEZvcm1TdHJlYW0obnVsbHB0ciksCisgICAgICBtX3BEb2N1bWVudChudWxscHRyKSwKKyAgICAgIG1fcFBhZ2VSZXNvdXJjZXMobnVsbHB0ciksCisgICAgICBtX3BSZXNvdXJjZXMobnVsbHB0ciksCisgICAgICBtX1RyYW5zcGFyZW5jeSgwKSwKKyAgICAgIG1fT2JqZWN0TGlzdCgxMjgpLAorICAgICAgbV9iQmFja2dyb3VuZEFscGhhTmVlZGVkKEZBTFNFKSwKKyAgICAgIG1fYkhhc0ltYWdlTWFzayhGQUxTRSksCisgICAgICBtX2JSZWxlYXNlTWVtYmVycyhiUmVsZWFzZU1lbWJlcnMpLAorICAgICAgbV9wUGFyc2VyKG51bGxwdHIpLAorICAgICAgbV9QYXJzZVN0YXRlKENPTlRFTlRfTk9UX1BBUlNFRCkge30KK0NQREZfUGFnZU9iamVjdHM6On5DUERGX1BhZ2VPYmplY3RzKCkgeworICBkZWxldGUgbV9wUGFyc2VyOworICBpZiAoIW1fYlJlbGVhc2VNZW1iZXJzKSB7CisgICAgcmV0dXJuOworICB9CisgIEZYX1BPU0lUSU9OIHBvcyA9IG1fT2JqZWN0TGlzdC5HZXRIZWFkUG9zaXRpb24oKTsKKyAgd2hpbGUgKHBvcykgeworICAgIGRlbGV0ZSAoQ1BERl9QYWdlT2JqZWN0KiltX09iamVjdExpc3QuR2V0TmV4dChwb3MpOworICB9Cit9Cit2b2lkIENQREZfUGFnZU9iamVjdHM6OkNvbnRpbnVlUGFyc2UoSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgaWYgKCFtX3BQYXJzZXIpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wUGFyc2VyLT5Db250aW51ZShwUGF1c2UpOworICBpZiAobV9wUGFyc2VyLT5HZXRTdGF0dXMoKSA9PSBDUERGX0NvbnRlbnRQYXJzZXI6OkRvbmUpIHsKKyAgICBtX1BhcnNlU3RhdGUgPSBDT05URU5UX1BBUlNFRDsKKyAgICBkZWxldGUgbV9wUGFyc2VyOwogICAgIG1fcFBhcnNlciA9IE5VTEw7Ci0gICAgbV9wRm9ybVN0cmVhbSA9IE5VTEw7Ci0gICAgbV9wUmVzb3VyY2VzID0gTlVMTDsKKyAgfQogfQotQ1BERl9QYWdlT2JqZWN0czo6fkNQREZfUGFnZU9iamVjdHMoKQotewotICAgIGlmIChtX3BQYXJzZXIpIHsKLSAgICAgICAgZGVsZXRlIG1fcFBhcnNlcjsKK0ZYX1BPU0lUSU9OIENQREZfUGFnZU9iamVjdHM6Okluc2VydE9iamVjdChGWF9QT1NJVElPTiBwb3NJbnNlcnRBZnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBOZXdPYmplY3QpIHsKKyAgaWYgKCFwb3NJbnNlcnRBZnRlcikgeworICAgIHJldHVybiBtX09iamVjdExpc3QuQWRkSGVhZChwTmV3T2JqZWN0KTsKKyAgfQorICByZXR1cm4gbV9PYmplY3RMaXN0Lkluc2VydEFmdGVyKHBvc0luc2VydEFmdGVyLCBwTmV3T2JqZWN0KTsKK30KK2ludCBDUERGX1BhZ2VPYmplY3RzOjpHZXRPYmplY3RJbmRleChDUERGX1BhZ2VPYmplY3QqIHBPYmopIGNvbnN0IHsKKyAgaW50IGluZGV4ID0gMDsKKyAgRlhfUE9TSVRJT04gcG9zID0gbV9PYmplY3RMaXN0LkdldEhlYWRQb3NpdGlvbigpOworICB3aGlsZSAocG9zKSB7CisgICAgQ1BERl9QYWdlT2JqZWN0KiBwVGhpc09iaiA9IChDUERGX1BhZ2VPYmplY3QqKW1fT2JqZWN0TGlzdC5HZXROZXh0KHBvcyk7CisgICAgaWYgKHBUaGlzT2JqID09IHBPYmopIHsKKyAgICAgIHJldHVybiBpbmRleDsKICAgICB9Ci0gICAgaWYgKCFtX2JSZWxlYXNlTWVtYmVycykgewotICAgICAgICByZXR1cm47CisgICAgaW5kZXgrKzsKKyAgfQorICByZXR1cm4gLTE7Cit9CitDUERGX1BhZ2VPYmplY3QqIENQREZfUGFnZU9iamVjdHM6OkdldE9iamVjdEJ5SW5kZXgoaW50IGluZGV4KSBjb25zdCB7CisgIEZYX1BPU0lUSU9OIHBvcyA9IG1fT2JqZWN0TGlzdC5GaW5kSW5kZXgoaW5kZXgpOworICByZXR1cm4gcG9zID8gc3RhdGljX2Nhc3Q8Q1BERl9QYWdlT2JqZWN0Kj4obV9PYmplY3RMaXN0LkdldEF0KHBvcykpIDogbnVsbHB0cjsKK30KK3ZvaWQgQ1BERl9QYWdlT2JqZWN0czo6VHJhbnNmb3JtKGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgeworICBGWF9QT1NJVElPTiBwb3MgPSBtX09iamVjdExpc3QuR2V0SGVhZFBvc2l0aW9uKCk7CisgIHdoaWxlIChwb3MpIHsKKyAgICBDUERGX1BhZ2VPYmplY3QqIHBPYmogPSAoQ1BERl9QYWdlT2JqZWN0KiltX09iamVjdExpc3QuR2V0TmV4dChwb3MpOworICAgIHBPYmotPlRyYW5zZm9ybShtYXRyaXgpOworICB9Cit9CitDRlhfRmxvYXRSZWN0IENQREZfUGFnZU9iamVjdHM6OkNhbGNCb3VuZGluZ0JveCgpIGNvbnN0IHsKKyAgaWYgKG1fT2JqZWN0TGlzdC5HZXRDb3VudCgpID09IDApIHsKKyAgICByZXR1cm4gQ0ZYX0Zsb2F0UmVjdCgwLCAwLCAwLCAwKTsKKyAgfQorICBGWF9GTE9BVCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b207CisgIGxlZnQgPSBib3R0b20gPSAxMDAwMDAwICogMS4wZjsKKyAgcmlnaHQgPSB0b3AgPSAtMTAwMDAwMCAqIDEuMGY7CisgIEZYX1BPU0lUSU9OIHBvcyA9IG1fT2JqZWN0TGlzdC5HZXRIZWFkUG9zaXRpb24oKTsKKyAgd2hpbGUgKHBvcykgeworICAgIENQREZfUGFnZU9iamVjdCogcE9iaiA9IChDUERGX1BhZ2VPYmplY3QqKW1fT2JqZWN0TGlzdC5HZXROZXh0KHBvcyk7CisgICAgaWYgKGxlZnQgPiBwT2JqLT5tX0xlZnQpIHsKKyAgICAgIGxlZnQgPSBwT2JqLT5tX0xlZnQ7CiAgICAgfQorICAgIGlmIChyaWdodCA8IHBPYmotPm1fUmlnaHQpIHsKKyAgICAgIHJpZ2h0ID0gcE9iai0+bV9SaWdodDsKKyAgICB9CisgICAgaWYgKHRvcCA8IHBPYmotPm1fVG9wKSB7CisgICAgICB0b3AgPSBwT2JqLT5tX1RvcDsKKyAgICB9CisgICAgaWYgKGJvdHRvbSA+IHBPYmotPm1fQm90dG9tKSB7CisgICAgICBib3R0b20gPSBwT2JqLT5tX0JvdHRvbTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIENGWF9GbG9hdFJlY3QobGVmdCwgYm90dG9tLCByaWdodCwgdG9wKTsKK30KK3ZvaWQgQ1BERl9QYWdlT2JqZWN0czo6TG9hZFRyYW5zSW5mbygpIHsKKyAgaWYgKCFtX3BGb3JtRGljdCkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBHcm91cCA9IG1fcEZvcm1EaWN0LT5HZXREaWN0KCJHcm91cCIpOworICBpZiAoIXBHcm91cCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAocEdyb3VwLT5HZXRTdHJpbmcoIlMiKSAhPSAiVHJhbnNwYXJlbmN5IikgeworICAgIHJldHVybjsKKyAgfQorICBtX1RyYW5zcGFyZW5jeSB8PSBQREZUUkFOU19HUk9VUDsKKyAgaWYgKHBHcm91cC0+R2V0SW50ZWdlcigiSSIpKSB7CisgICAgbV9UcmFuc3BhcmVuY3kgfD0gUERGVFJBTlNfSVNPTEFURUQ7CisgIH0KKyAgaWYgKHBHcm91cC0+R2V0SW50ZWdlcigiSyIpKSB7CisgICAgbV9UcmFuc3BhcmVuY3kgfD0gUERGVFJBTlNfS05PQ0tPVVQ7CisgIH0KK30KK3ZvaWQgQ1BERl9QYWdlT2JqZWN0czo6Q2xlYXJDYWNoZU9iamVjdHMoKSB7CisgIG1fUGFyc2VTdGF0ZSA9IENPTlRFTlRfTk9UX1BBUlNFRDsKKyAgZGVsZXRlIG1fcFBhcnNlcjsKKyAgbV9wUGFyc2VyID0gTlVMTDsKKyAgaWYgKG1fYlJlbGVhc2VNZW1iZXJzKSB7CiAgICAgRlhfUE9TSVRJT04gcG9zID0gbV9PYmplY3RMaXN0LkdldEhlYWRQb3NpdGlvbigpOwogICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgZGVsZXRlIChDUERGX1BhZ2VPYmplY3QqKW1fT2JqZWN0TGlzdC5HZXROZXh0KHBvcyk7CisgICAgICBkZWxldGUgKENQREZfUGFnZU9iamVjdCopbV9PYmplY3RMaXN0LkdldE5leHQocG9zKTsKICAgICB9CisgIH0KKyAgbV9PYmplY3RMaXN0LlJlbW92ZUFsbCgpOwogfQotdm9pZCBDUERGX1BhZ2VPYmplY3RzOjpDb250aW51ZVBhcnNlKElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIGlmIChtX3BQYXJzZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fcFBhcnNlci0+Q29udGludWUocFBhdXNlKTsKLSAgICBpZiAobV9wUGFyc2VyLT5HZXRTdGF0dXMoKSA9PSBDUERGX0NvbnRlbnRQYXJzZXI6OkRvbmUpIHsKLSAgICAgICAgbV9QYXJzZVN0YXRlID0gUERGX0NPTlRFTlRfUEFSU0VEOwotICAgICAgICBkZWxldGUgbV9wUGFyc2VyOwotICAgICAgICBtX3BQYXJzZXIgPSBOVUxMOwotICAgIH0KK0NQREZfUGFnZTo6Q1BERl9QYWdlKCkgeworICBtX3BQYWdlUmVuZGVyID0gTlVMTDsKIH0KLWludCBDUERGX1BhZ2VPYmplY3RzOjpFc3RpbWF0ZVBhcnNlUHJvZ3Jlc3MoKSBjb25zdAotewotICAgIGlmIChtX3BQYXJzZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gbV9QYXJzZVN0YXRlID09IFBERl9DT05URU5UX1BBUlNFRCA/IDEwMCA6IDA7Ci0gICAgfQotICAgIHJldHVybiBtX3BQYXJzZXItPkVzdGltYXRlUHJvZ3Jlc3MoKTsKK3ZvaWQgQ1BERl9QYWdlOjpMb2FkKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0LAorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGFnZUNhY2hlKSB7CisgIG1fcERvY3VtZW50ID0gKENQREZfRG9jdW1lbnQqKXBEb2N1bWVudDsKKyAgbV9wRm9ybURpY3QgPSBwUGFnZURpY3Q7CisgIGlmIChiUGFnZUNhY2hlKSB7CisgICAgbV9wUGFnZVJlbmRlciA9CisgICAgICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UmVuZGVyTW9kdWxlKCktPkNyZWF0ZVBhZ2VDYWNoZSh0aGlzKTsKKyAgfQorICBpZiAoIXBQYWdlRGljdCkgeworICAgIG1fUGFnZVdpZHRoID0gbV9QYWdlSGVpZ2h0ID0gMTAwICogMS4wZjsKKyAgICBtX3BQYWdlUmVzb3VyY2VzID0gbV9wUmVzb3VyY2VzID0gTlVMTDsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9PYmplY3QqIHBhZ2VBdHRyID0gR2V0UGFnZUF0dHIoIlJlc291cmNlcyIpOworICBtX3BSZXNvdXJjZXMgPSBwYWdlQXR0ciA/IHBhZ2VBdHRyLT5HZXREaWN0KCkgOiBOVUxMOworICBtX3BQYWdlUmVzb3VyY2VzID0gbV9wUmVzb3VyY2VzOworICBDUERGX09iamVjdCogcFJvdGF0ZSA9IEdldFBhZ2VBdHRyKCJSb3RhdGUiKTsKKyAgaW50IHJvdGF0ZSA9IDA7CisgIGlmIChwUm90YXRlKSB7CisgICAgcm90YXRlID0gcFJvdGF0ZS0+R2V0SW50ZWdlcigpIC8gOTAgJSA0OworICB9CisgIGlmIChyb3RhdGUgPCAwKSB7CisgICAgcm90YXRlICs9IDQ7CisgIH0KKyAgQ1BERl9BcnJheSogcE1lZGlhQm94ID0gVG9BcnJheShHZXRQYWdlQXR0cigiTWVkaWFCb3giKSk7CisgIENGWF9GbG9hdFJlY3QgbWVkaWFib3g7CisgIGlmIChwTWVkaWFCb3gpIHsKKyAgICBtZWRpYWJveCA9IHBNZWRpYUJveC0+R2V0UmVjdCgpOworICAgIG1lZGlhYm94Lk5vcm1hbGl6ZSgpOworICB9CisgIGlmIChtZWRpYWJveC5Jc0VtcHR5KCkpIHsKKyAgICBtZWRpYWJveCA9IENGWF9GbG9hdFJlY3QoMCwgMCwgNjEyLCA3OTIpOworICB9CisKKyAgQ1BERl9BcnJheSogcENyb3BCb3ggPSBUb0FycmF5KEdldFBhZ2VBdHRyKCJDcm9wQm94IikpOworICBpZiAocENyb3BCb3gpIHsKKyAgICBtX0JCb3ggPSBwQ3JvcEJveC0+R2V0UmVjdCgpOworICAgIG1fQkJveC5Ob3JtYWxpemUoKTsKKyAgfQorICBpZiAobV9CQm94LklzRW1wdHkoKSkgeworICAgIG1fQkJveCA9IG1lZGlhYm94OworICB9IGVsc2UgeworICAgIG1fQkJveC5JbnRlcnNlY3QobWVkaWFib3gpOworICB9CisgIGlmIChyb3RhdGUgJSAyKSB7CisgICAgbV9QYWdlSGVpZ2h0ID0gbV9CQm94LnJpZ2h0IC0gbV9CQm94LmxlZnQ7CisgICAgbV9QYWdlV2lkdGggPSBtX0JCb3gudG9wIC0gbV9CQm94LmJvdHRvbTsKKyAgfSBlbHNlIHsKKyAgICBtX1BhZ2VXaWR0aCA9IG1fQkJveC5yaWdodCAtIG1fQkJveC5sZWZ0OworICAgIG1fUGFnZUhlaWdodCA9IG1fQkJveC50b3AgLSBtX0JCb3guYm90dG9tOworICB9CisgIHN3aXRjaCAocm90YXRlKSB7CisgICAgY2FzZSAwOgorICAgICAgbV9QYWdlTWF0cml4LlNldCgxLjBmLCAwLCAwLCAxLjBmLCAtbV9CQm94LmxlZnQsIC1tX0JCb3guYm90dG9tKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIG1fUGFnZU1hdHJpeC5TZXQoMCwgLTEuMGYsIDEuMGYsIDAsIC1tX0JCb3guYm90dG9tLCBtX0JCb3gucmlnaHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgbV9QYWdlTWF0cml4LlNldCgtMS4wZiwgMCwgMCwgLTEuMGYsIG1fQkJveC5yaWdodCwgbV9CQm94LnRvcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBtX1BhZ2VNYXRyaXguU2V0KDAsIDEuMGYsIC0xLjBmLCAwLCBtX0JCb3gudG9wLCAtbV9CQm94LmxlZnQpOworICAgICAgYnJlYWs7CisgIH0KKyAgbV9UcmFuc3BhcmVuY3kgPSBQREZUUkFOU19JU09MQVRFRDsKKyAgTG9hZFRyYW5zSW5mbygpOwogfQotRlhfUE9TSVRJT04gQ1BERl9QYWdlT2JqZWN0czo6SW5zZXJ0T2JqZWN0KEZYX1BPU0lUSU9OIHBvc0luc2VydEFmdGVyLCBDUERGX1BhZ2VPYmplY3QqIHBOZXdPYmplY3QpCi17Ci0gICAgaWYgKHBvc0luc2VydEFmdGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIG1fT2JqZWN0TGlzdC5BZGRIZWFkKHBOZXdPYmplY3QpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtX09iamVjdExpc3QuSW5zZXJ0QWZ0ZXIocG9zSW5zZXJ0QWZ0ZXIsIHBOZXdPYmplY3QpOwotICAgIH0KK3ZvaWQgQ1BERl9QYWdlOjpTdGFydFBhcnNlKENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucywgRlhfQk9PTCBiUmVQYXJzZSkgeworICBpZiAoYlJlUGFyc2UpIHsKKyAgICBDbGVhckNhY2hlT2JqZWN0cygpOworICB9CisgIGlmIChtX1BhcnNlU3RhdGUgPT0gQ09OVEVOVF9QQVJTRUQgfHwgbV9QYXJzZVN0YXRlID09IENPTlRFTlRfUEFSU0lORykgeworICAgIHJldHVybjsKKyAgfQorICBtX3BQYXJzZXIgPSBuZXcgQ1BERl9Db250ZW50UGFyc2VyOworICBtX3BQYXJzZXItPlN0YXJ0KHRoaXMsIHBPcHRpb25zKTsKKyAgbV9QYXJzZVN0YXRlID0gQ09OVEVOVF9QQVJTSU5HOwogfQotaW50IENQREZfUGFnZU9iamVjdHM6OkdldE9iamVjdEluZGV4KENQREZfUGFnZU9iamVjdCogcE9iaikgY29uc3QKLXsKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fT2JqZWN0TGlzdC5HZXRIZWFkUG9zaXRpb24oKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIENQREZfUGFnZU9iamVjdCogcFRoaXNPYmogPSAoQ1BERl9QYWdlT2JqZWN0KiltX09iamVjdExpc3QuR2V0TmV4dChwb3MpOwotICAgICAgICBpZiAocFRoaXNPYmogPT0gcE9iaikgewotICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICB9Ci0gICAgICAgIGluZGV4ICsrOwotICAgIH0KLSAgICByZXR1cm4gLTE7Cit2b2lkIENQREZfUGFnZTo6UGFyc2VDb250ZW50KENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucywgRlhfQk9PTCBiUmVQYXJzZSkgeworICBTdGFydFBhcnNlKHBPcHRpb25zLCBiUmVQYXJzZSk7CisgIENvbnRpbnVlUGFyc2UoTlVMTCk7CiB9Ci1DUERGX1BhZ2VPYmplY3QqIENQREZfUGFnZU9iamVjdHM6OkdldE9iamVjdEJ5SW5kZXgoaW50IGluZGV4KSBjb25zdAotewotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fT2JqZWN0TGlzdC5GaW5kSW5kZXgoaW5kZXgpOwotICAgIGlmIChwb3MgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIChDUERGX1BhZ2VPYmplY3QqKW1fT2JqZWN0TGlzdC5HZXRBdChwb3MpOworQ1BERl9QYWdlOjp+Q1BERl9QYWdlKCkgeworICBpZiAobV9wUGFnZVJlbmRlcikgeworICAgIElQREZfUmVuZGVyTW9kdWxlKiBwTW9kdWxlID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRSZW5kZXJNb2R1bGUoKTsKKyAgICBwTW9kdWxlLT5EZXN0cm95UGFnZUNhY2hlKG1fcFBhZ2VSZW5kZXIpOworICB9CiB9Ci12b2lkIENQREZfUGFnZU9iamVjdHM6OlRyYW5zZm9ybShjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgpCi17Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9PYmplY3RMaXN0LkdldEhlYWRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwT2JqID0gKENQREZfUGFnZU9iamVjdCopbV9PYmplY3RMaXN0LkdldE5leHQocG9zKTsKLSAgICAgICAgcE9iai0+VHJhbnNmb3JtKG1hdHJpeCk7CitDUERGX09iamVjdCogRlBERkFQSV9HZXRQYWdlQXR0cihDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgeworICBpbnQgbGV2ZWwgPSAwOworICB3aGlsZSAoMSkgeworICAgIENQREZfT2JqZWN0KiBwT2JqID0gcFBhZ2VEaWN0LT5HZXRFbGVtZW50VmFsdWUobmFtZSk7CisgICAgaWYgKHBPYmopIHsKKyAgICAgIHJldHVybiBwT2JqOwogICAgIH0KKyAgICBDUERGX0RpY3Rpb25hcnkqIHBQYXJlbnQgPSBwUGFnZURpY3QtPkdldERpY3QoIlBhcmVudCIpOworICAgIGlmICghcFBhcmVudCB8fCBwUGFyZW50ID09IHBQYWdlRGljdCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHBQYWdlRGljdCA9IHBQYXJlbnQ7CisgICAgbGV2ZWwrKzsKKyAgICBpZiAobGV2ZWwgPT0gMTAwMCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CiB9Ci1DRlhfRmxvYXRSZWN0IENQREZfUGFnZU9iamVjdHM6OkNhbGNCb3VuZGluZ0JveCgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fT2JqZWN0TGlzdC5HZXRDb3VudCgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIENGWF9GbG9hdFJlY3QoMCwgMCwgMCwgMCk7Ci0gICAgfQotICAgIEZYX0ZMT0FUIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbTsKLSAgICBsZWZ0ID0gYm90dG9tID0gMTAwMDAwMCAqIDEuMGY7Ci0gICAgcmlnaHQgPSB0b3AgPSAtMTAwMDAwMCAqIDEuMGY7Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9PYmplY3RMaXN0LkdldEhlYWRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwT2JqID0gKENQREZfUGFnZU9iamVjdCopbV9PYmplY3RMaXN0LkdldE5leHQocG9zKTsKLSAgICAgICAgaWYgKGxlZnQgPiBwT2JqLT5tX0xlZnQpIHsKLSAgICAgICAgICAgIGxlZnQgPSBwT2JqLT5tX0xlZnQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJpZ2h0IDwgcE9iai0+bV9SaWdodCkgewotICAgICAgICAgICAgcmlnaHQgPSBwT2JqLT5tX1JpZ2h0OwotICAgICAgICB9Ci0gICAgICAgIGlmICh0b3AgPCBwT2JqLT5tX1RvcCkgewotICAgICAgICAgICAgdG9wID0gcE9iai0+bV9Ub3A7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJvdHRvbSA+IHBPYmotPm1fQm90dG9tKSB7Ci0gICAgICAgICAgICBib3R0b20gPSBwT2JqLT5tX0JvdHRvbTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gQ0ZYX0Zsb2F0UmVjdChsZWZ0LCBib3R0b20sIHJpZ2h0LCB0b3ApOworQ1BERl9PYmplY3QqIENQREZfUGFnZTo6R2V0UGFnZUF0dHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lKSBjb25zdCB7CisgIHJldHVybiBGUERGQVBJX0dldFBhZ2VBdHRyKG1fcEZvcm1EaWN0LCBuYW1lKTsKIH0KLXZvaWQgQ1BERl9QYWdlT2JqZWN0czo6TG9hZFRyYW5zSW5mbygpCi17Ci0gICAgaWYgKG1fcEZvcm1EaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBHcm91cCA9IG1fcEZvcm1EaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJHcm91cCIpKTsKLSAgICBpZiAocEdyb3VwID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAocEdyb3VwLT5HZXRTdHJpbmcoRlhfQlNUUkMoIlMiKSkgIT0gRlhfQlNUUkMoIlRyYW5zcGFyZW5jeSIpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9UcmFuc3BhcmVuY3kgfD0gUERGVFJBTlNfR1JPVVA7Ci0gICAgaWYgKHBHcm91cC0+R2V0SW50ZWdlcihGWF9CU1RSQygiSSIpKSkgewotICAgICAgICBtX1RyYW5zcGFyZW5jeSB8PSBQREZUUkFOU19JU09MQVRFRDsKLSAgICB9Ci0gICAgaWYgKHBHcm91cC0+R2V0SW50ZWdlcihGWF9CU1RSQygiSyIpKSkgewotICAgICAgICBtX1RyYW5zcGFyZW5jeSB8PSBQREZUUkFOU19LTk9DS09VVDsKLSAgICB9CitDUERGX0Zvcm06OkNQREZfRm9ybShDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwRm9ybVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhcmVudFJlc291cmNlcykgeworICBtX3BEb2N1bWVudCA9IHBEb2M7CisgIG1fcEZvcm1TdHJlYW0gPSBwRm9ybVN0cmVhbTsKKyAgbV9wRm9ybURpY3QgPSBwRm9ybVN0cmVhbSA/IHBGb3JtU3RyZWFtLT5HZXREaWN0KCkgOiBOVUxMOworICBtX3BSZXNvdXJjZXMgPSBtX3BGb3JtRGljdC0+R2V0RGljdCgiUmVzb3VyY2VzIik7CisgIG1fcFBhZ2VSZXNvdXJjZXMgPSBwUGFnZVJlc291cmNlczsKKyAgaWYgKCFtX3BSZXNvdXJjZXMpIHsKKyAgICBtX3BSZXNvdXJjZXMgPSBwUGFyZW50UmVzb3VyY2VzOworICB9CisgIGlmICghbV9wUmVzb3VyY2VzKSB7CisgICAgbV9wUmVzb3VyY2VzID0gcFBhZ2VSZXNvdXJjZXM7CisgIH0KKyAgbV9UcmFuc3BhcmVuY3kgPSAwOworICBMb2FkVHJhbnNJbmZvKCk7CiB9Ci12b2lkIENQREZfUGFnZU9iamVjdHM6OkNsZWFyQ2FjaGVPYmplY3RzKCkKLXsKLSAgICBtX1BhcnNlU3RhdGUgPSBQREZfQ09OVEVOVF9OT1RfUEFSU0VEOwotICAgIGlmIChtX3BQYXJzZXIpIHsKLSAgICAgICAgZGVsZXRlIG1fcFBhcnNlcjsKLSAgICB9Ci0gICAgbV9wUGFyc2VyID0gTlVMTDsKLSAgICBpZiAobV9iUmVsZWFzZU1lbWJlcnMpIHsKLSAgICAgICAgRlhfUE9TSVRJT04gcG9zID0gbV9PYmplY3RMaXN0LkdldEhlYWRQb3NpdGlvbigpOwotICAgICAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgICAgICBkZWxldGUgKENQREZfUGFnZU9iamVjdCopbV9PYmplY3RMaXN0LkdldE5leHQocG9zKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtX09iamVjdExpc3QuUmVtb3ZlQWxsKCk7CitDUERGX0Zvcm06On5DUERGX0Zvcm0oKSB7fQordm9pZCBDUERGX0Zvcm06OlN0YXJ0UGFyc2UoQ1BERl9BbGxTdGF0ZXMqIHBHcmFwaGljU3RhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFBhcmVudE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfVHlwZTNDaGFyKiBwVHlwZTNDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYXJzZU9wdGlvbnMqIHBPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsKSB7CisgIGlmIChtX1BhcnNlU3RhdGUgPT0gQ09OVEVOVF9QQVJTRUQgfHwgbV9QYXJzZVN0YXRlID09IENPTlRFTlRfUEFSU0lORykgeworICAgIHJldHVybjsKKyAgfQorICBtX3BQYXJzZXIgPSBuZXcgQ1BERl9Db250ZW50UGFyc2VyOworICBtX3BQYXJzZXItPlN0YXJ0KHRoaXMsIHBHcmFwaGljU3RhdGVzLCBwUGFyZW50TWF0cml4LCBwVHlwZTNDaGFyLCBwT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBsZXZlbCk7CisgIG1fUGFyc2VTdGF0ZSA9IENPTlRFTlRfUEFSU0lORzsKIH0KLUNQREZfUGFnZTo6Q1BERl9QYWdlKCkKLXsKLSAgICBtX3BQYWdlUmVuZGVyID0gTlVMTDsKK3ZvaWQgQ1BERl9Gb3JtOjpQYXJzZUNvbnRlbnQoQ1BERl9BbGxTdGF0ZXMqIHBHcmFwaGljU3RhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwUGFyZW50TWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1R5cGUzQ2hhciogcFR5cGUzQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYXJzZU9wdGlvbnMqIHBPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpIHsKKyAgU3RhcnRQYXJzZShwR3JhcGhpY1N0YXRlcywgcFBhcmVudE1hdHJpeCwgcFR5cGUzQ2hhciwgcE9wdGlvbnMsIGxldmVsKTsKKyAgQ29udGludWVQYXJzZShOVUxMKTsKIH0KLXZvaWQgQ1BERl9QYWdlOjpMb2FkKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QsIEZYX0JPT0wgYlBhZ2VDYWNoZSkKLXsKLSAgICBtX3BEb2N1bWVudCA9IChDUERGX0RvY3VtZW50KilwRG9jdW1lbnQ7Ci0gICAgbV9wRm9ybURpY3QgPSBwUGFnZURpY3Q7Ci0gICAgaWYgKGJQYWdlQ2FjaGUpIHsKLSAgICAgICAgbV9wUGFnZVJlbmRlciA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UmVuZGVyTW9kdWxlKCktPkNyZWF0ZVBhZ2VDYWNoZSh0aGlzKTsKLSAgICB9Ci0gICAgaWYgKHBQYWdlRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIG1fUGFnZVdpZHRoID0gbV9QYWdlSGVpZ2h0ID0gMTAwICogMS4wZjsKLSAgICAgICAgbV9wUGFnZVJlc291cmNlcyA9IG1fcFJlc291cmNlcyA9IE5VTEw7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBhZ2VBdHRyID0gR2V0UGFnZUF0dHIoRlhfQlNUUkMoIlJlc291cmNlcyIpKTsKLSAgICBtX3BSZXNvdXJjZXMgPSBwYWdlQXR0ciA/IHBhZ2VBdHRyLT5HZXREaWN0KCkgOiBOVUxMOwotICAgIG1fcFBhZ2VSZXNvdXJjZXMgPSBtX3BSZXNvdXJjZXM7Ci0gICAgQ1BERl9PYmplY3QqIHBSb3RhdGUgPSBHZXRQYWdlQXR0cihGWF9CU1RSQygiUm90YXRlIikpOwotICAgIGludCByb3RhdGUgPSAwOwotICAgIGlmIChwUm90YXRlKSB7Ci0gICAgICAgIHJvdGF0ZSA9IHBSb3RhdGUtPkdldEludGVnZXIoKSAvIDkwICUgNDsKLSAgICB9Ci0gICAgaWYgKHJvdGF0ZSA8IDApIHsKLSAgICAgICAgcm90YXRlICs9IDQ7Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBNZWRpYUJveCwgKnBDcm9wQm94OwotICAgIHBNZWRpYUJveCA9IChDUERGX0FycmF5KilHZXRQYWdlQXR0cihGWF9CU1RSQygiTWVkaWFCb3giKSk7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCBtZWRpYWJveDsKLSAgICBpZiAocE1lZGlhQm94KSB7Ci0gICAgICAgIG1lZGlhYm94ID0gcE1lZGlhQm94LT5HZXRSZWN0KCk7Ci0gICAgICAgIG1lZGlhYm94Lk5vcm1hbGl6ZSgpOwotICAgIH0KLSAgICBpZiAobWVkaWFib3guSXNFbXB0eSgpKSB7Ci0gICAgICAgIG1lZGlhYm94ID0gQ0ZYX0Zsb2F0UmVjdCgwLCAwLCA2MTIsIDc5Mik7Ci0gICAgfQotICAgIHBDcm9wQm94ID0gKENQREZfQXJyYXkqKUdldFBhZ2VBdHRyKEZYX0JTVFJDKCJDcm9wQm94IikpOwotICAgIGlmIChwQ3JvcEJveCkgewotICAgICAgICBtX0JCb3ggPSBwQ3JvcEJveC0+R2V0UmVjdCgpOwotICAgICAgICBtX0JCb3guTm9ybWFsaXplKCk7Ci0gICAgfQotICAgIGlmIChtX0JCb3guSXNFbXB0eSgpKSB7Ci0gICAgICAgIG1fQkJveCA9IG1lZGlhYm94OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fQkJveC5JbnRlcnNlY3QobWVkaWFib3gpOwotICAgIH0KLSAgICBpZiAocm90YXRlICUgMikgewotICAgICAgICBtX1BhZ2VIZWlnaHQgPSBtX0JCb3gucmlnaHQgLSBtX0JCb3gubGVmdDsKLSAgICAgICAgbV9QYWdlV2lkdGggPSBtX0JCb3gudG9wIC0gbV9CQm94LmJvdHRvbTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX1BhZ2VXaWR0aCA9IG1fQkJveC5yaWdodCAtIG1fQkJveC5sZWZ0OwotICAgICAgICBtX1BhZ2VIZWlnaHQgPSBtX0JCb3gudG9wIC0gbV9CQm94LmJvdHRvbTsKLSAgICB9Ci0gICAgc3dpdGNoIChyb3RhdGUpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgbV9QYWdlTWF0cml4LlNldCgxLjBmLCAwLCAwLCAxLjBmLCAtbV9CQm94LmxlZnQsIC1tX0JCb3guYm90dG9tKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBtX1BhZ2VNYXRyaXguU2V0KDAsIC0xLjBmLCAxLjBmLCAwLCAtbV9CQm94LmJvdHRvbSwgbV9CQm94LnJpZ2h0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBtX1BhZ2VNYXRyaXguU2V0KC0xLjBmLCAwLCAwLCAtMS4wZiwgbV9CQm94LnJpZ2h0LCBtX0JCb3gudG9wKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBtX1BhZ2VNYXRyaXguU2V0KDAsIDEuMGYsIC0xLjBmLCAwLCBtX0JCb3gudG9wLCAtbV9CQm94LmxlZnQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIG1fVHJhbnNwYXJlbmN5ID0gUERGVFJBTlNfSVNPTEFURUQ7Ci0gICAgTG9hZFRyYW5zSW5mbygpOworQ1BERl9Gb3JtKiBDUERGX0Zvcm06OkNsb25lKCkgY29uc3QgeworICBDUERGX0Zvcm0qIHBDbG9uZSA9CisgICAgICBuZXcgQ1BERl9Gb3JtKG1fcERvY3VtZW50LCBtX3BQYWdlUmVzb3VyY2VzLCBtX3BGb3JtU3RyZWFtLCBtX3BSZXNvdXJjZXMpOworICBGWF9QT1NJVElPTiBwb3MgPSBtX09iamVjdExpc3QuR2V0SGVhZFBvc2l0aW9uKCk7CisgIHdoaWxlIChwb3MpIHsKKyAgICBDUERGX1BhZ2VPYmplY3QqIHBPYmogPSAoQ1BERl9QYWdlT2JqZWN0KiltX09iamVjdExpc3QuR2V0TmV4dChwb3MpOworICAgIHBDbG9uZS0+bV9PYmplY3RMaXN0LkFkZFRhaWwocE9iai0+Q2xvbmUoKSk7CisgIH0KKyAgcmV0dXJuIHBDbG9uZTsKIH0KLXZvaWQgQ1BERl9QYWdlOjpTdGFydFBhcnNlKENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucywgRlhfQk9PTCBiUmVQYXJzZSkKLXsKLSAgICBpZiAoYlJlUGFyc2UpIHsKLSAgICAgICAgQ2xlYXJDYWNoZU9iamVjdHMoKTsKLSAgICB9Ci0gICAgaWYgKG1fUGFyc2VTdGF0ZSA9PSBQREZfQ09OVEVOVF9QQVJTRUQgfHwgbV9QYXJzZVN0YXRlID09IFBERl9DT05URU5UX1BBUlNJTkcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX3BQYXJzZXIgPSBuZXcgQ1BERl9Db250ZW50UGFyc2VyOwotICAgIG1fcFBhcnNlci0+U3RhcnQodGhpcywgcE9wdGlvbnMpOwotICAgIG1fUGFyc2VTdGF0ZSA9IFBERl9DT05URU5UX1BBUlNJTkc7Cit2b2lkIENQREZfUGFnZTo6R2V0RGlzcGxheU1hdHJpeChDRlhfTWF0cml4JiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5UG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlSb3RhdGUpIGNvbnN0IHsKKyAgaWYgKG1fUGFnZVdpZHRoID09IDAgfHwgbV9QYWdlSGVpZ2h0ID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ0ZYX01hdHJpeCBkaXNwbGF5X21hdHJpeDsKKyAgaW50IHgwLCB5MCwgeDEsIHkxLCB4MiwgeTI7CisgIGlSb3RhdGUgJT0gNDsKKyAgc3dpdGNoIChpUm90YXRlKSB7CisgICAgY2FzZSAwOgorICAgICAgeDAgPSB4UG9zOworICAgICAgeTAgPSB5UG9zICsgeVNpemU7CisgICAgICB4MSA9IHhQb3M7CisgICAgICB5MSA9IHlQb3M7CisgICAgICB4MiA9IHhQb3MgKyB4U2l6ZTsKKyAgICAgIHkyID0geVBvcyArIHlTaXplOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgeDAgPSB4UG9zOworICAgICAgeTAgPSB5UG9zOworICAgICAgeDEgPSB4UG9zICsgeFNpemU7CisgICAgICB5MSA9IHlQb3M7CisgICAgICB4MiA9IHhQb3M7CisgICAgICB5MiA9IHlQb3MgKyB5U2l6ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIHgwID0geFBvcyArIHhTaXplOworICAgICAgeTAgPSB5UG9zOworICAgICAgeDEgPSB4UG9zICsgeFNpemU7CisgICAgICB5MSA9IHlQb3MgKyB5U2l6ZTsKKyAgICAgIHgyID0geFBvczsKKyAgICAgIHkyID0geVBvczsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIHgwID0geFBvcyArIHhTaXplOworICAgICAgeTAgPSB5UG9zICsgeVNpemU7CisgICAgICB4MSA9IHhQb3M7CisgICAgICB5MSA9IHlQb3MgKyB5U2l6ZTsKKyAgICAgIHgyID0geFBvcyArIHhTaXplOworICAgICAgeTIgPSB5UG9zOworICAgICAgYnJlYWs7CisgIH0KKyAgZGlzcGxheV9tYXRyaXguU2V0KEZYU1lTX0RpdigoRlhfRkxPQVQpKHgyIC0geDApLCBtX1BhZ2VXaWR0aCksCisgICAgICAgICAgICAgICAgICAgICBGWFNZU19EaXYoKEZYX0ZMT0FUKSh5MiAtIHkwKSwgbV9QYWdlV2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgRlhTWVNfRGl2KChGWF9GTE9BVCkoeDEgLSB4MCksIG1fUGFnZUhlaWdodCksCisgICAgICAgICAgICAgICAgICAgICBGWFNZU19EaXYoKEZYX0ZMT0FUKSh5MSAtIHkwKSwgbV9QYWdlSGVpZ2h0KSwgKEZYX0ZMT0FUKXgwLAorICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKXkwKTsKKyAgbWF0cml4ID0gbV9QYWdlTWF0cml4OworICBtYXRyaXguQ29uY2F0KGRpc3BsYXlfbWF0cml4KTsKIH0KLXZvaWQgQ1BERl9QYWdlOjpQYXJzZUNvbnRlbnQoQ1BERl9QYXJzZU9wdGlvbnMqIHBPcHRpb25zLCBGWF9CT09MIGJSZVBhcnNlKQotewotICAgIFN0YXJ0UGFyc2UocE9wdGlvbnMsIGJSZVBhcnNlKTsKLSAgICBDb250aW51ZVBhcnNlKE5VTEwpOwotfQotQ1BERl9QYWdlOjp+Q1BERl9QYWdlKCkKLXsKLSAgICBpZiAobV9wUGFnZVJlbmRlcikgewotICAgICAgICBDUERGX1JlbmRlck1vZHVsZURlZiogcE1vZHVsZSA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UmVuZGVyTW9kdWxlKCk7Ci0gICAgICAgIHBNb2R1bGUtPkRlc3Ryb3lQYWdlQ2FjaGUobV9wUGFnZVJlbmRlcik7Ci0gICAgfQotfQotQ1BERl9PYmplY3QqIEZQREZBUElfR2V0UGFnZUF0dHIoQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QsIEZYX0JTVFIgbmFtZSkKLXsKLSAgICBpbnQgbGV2ZWwgPSAwOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gcFBhZ2VEaWN0LT5HZXRFbGVtZW50VmFsdWUobmFtZSk7Ci0gICAgICAgIGlmIChwT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gcE9iajsKLSAgICAgICAgfQotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYXJlbnQgPSBwUGFnZURpY3QtPkdldERpY3QoRlhfQlNUUkMoIlBhcmVudCIpKTsKLSAgICAgICAgaWYgKCFwUGFyZW50IHx8IHBQYXJlbnQgPT0gcFBhZ2VEaWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBwUGFnZURpY3QgPSBwUGFyZW50OwotICAgICAgICBsZXZlbCArKzsKLSAgICAgICAgaWYgKGxldmVsID09IDEwMDApIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgfQotfQotQ1BERl9PYmplY3QqIENQREZfUGFnZTo6R2V0UGFnZUF0dHIoRlhfQlNUUiBuYW1lKSBjb25zdAotewotICAgIHJldHVybiBGUERGQVBJX0dldFBhZ2VBdHRyKG1fcEZvcm1EaWN0LCBuYW1lKTsKLX0KLUNQREZfRm9ybTo6Q1BERl9Gb3JtKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsIENQREZfU3RyZWFtKiBwRm9ybVN0cmVhbSwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyZW50UmVzb3VyY2VzKQotewotICAgIG1fcERvY3VtZW50ID0gcERvYzsKLSAgICBtX3BGb3JtU3RyZWFtID0gcEZvcm1TdHJlYW07Ci0gICAgbV9wRm9ybURpY3QgPSBwRm9ybVN0cmVhbSA/IHBGb3JtU3RyZWFtLT5HZXREaWN0KCkgOiBOVUxMOwotICAgIG1fcFJlc291cmNlcyA9IG1fcEZvcm1EaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJSZXNvdXJjZXMiKSk7Ci0gICAgbV9wUGFnZVJlc291cmNlcyA9IHBQYWdlUmVzb3VyY2VzOwotICAgIGlmIChtX3BSZXNvdXJjZXMgPT0gTlVMTCkgewotICAgICAgICBtX3BSZXNvdXJjZXMgPSBwUGFyZW50UmVzb3VyY2VzOwotICAgIH0KLSAgICBpZiAobV9wUmVzb3VyY2VzID09IE5VTEwpIHsKLSAgICAgICAgbV9wUmVzb3VyY2VzID0gcFBhZ2VSZXNvdXJjZXM7Ci0gICAgfQotICAgIG1fVHJhbnNwYXJlbmN5ID0gMDsKLSAgICBMb2FkVHJhbnNJbmZvKCk7Ci19Ci1DUERGX0Zvcm06On5DUERGX0Zvcm0oKQotewotfQotdm9pZCBDUERGX0Zvcm06OlN0YXJ0UGFyc2UoQ1BERl9BbGxTdGF0ZXMqIHBHcmFwaGljU3RhdGVzLCBDRlhfQWZmaW5lTWF0cml4KiBwUGFyZW50TWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9UeXBlM0NoYXIqIHBUeXBlM0NoYXIsIENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucywgaW50IGxldmVsKQotewotICAgIGlmIChtX1BhcnNlU3RhdGUgPT0gUERGX0NPTlRFTlRfUEFSU0VEIHx8IG1fUGFyc2VTdGF0ZSA9PSBQREZfQ09OVEVOVF9QQVJTSU5HKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wUGFyc2VyID0gbmV3IENQREZfQ29udGVudFBhcnNlcjsKLSAgICBtX3BQYXJzZXItPlN0YXJ0KHRoaXMsIHBHcmFwaGljU3RhdGVzLCBwUGFyZW50TWF0cml4LCBwVHlwZTNDaGFyLCBwT3B0aW9ucywgbGV2ZWwpOwotICAgIG1fUGFyc2VTdGF0ZSA9IFBERl9DT05URU5UX1BBUlNJTkc7Ci19Ci12b2lkIENQREZfRm9ybTo6UGFyc2VDb250ZW50KENQREZfQWxsU3RhdGVzKiBwR3JhcGhpY1N0YXRlcywgQ0ZYX0FmZmluZU1hdHJpeCogcFBhcmVudE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9UeXBlM0NoYXIqIHBUeXBlM0NoYXIsIENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucywgaW50IGxldmVsKQotewotICAgIFN0YXJ0UGFyc2UocEdyYXBoaWNTdGF0ZXMsIHBQYXJlbnRNYXRyaXgsIHBUeXBlM0NoYXIsIHBPcHRpb25zLCBsZXZlbCk7Ci0gICAgQ29udGludWVQYXJzZShOVUxMKTsKLX0KLUNQREZfRm9ybSogQ1BERl9Gb3JtOjpDbG9uZSgpIGNvbnN0Ci17Ci0gICAgQ1BERl9Gb3JtKiBwQ2xvbmUgPSBuZXcgQ1BERl9Gb3JtKG1fcERvY3VtZW50LCBtX3BQYWdlUmVzb3VyY2VzLCBtX3BGb3JtU3RyZWFtLCBtX3BSZXNvdXJjZXMpOwotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fT2JqZWN0TGlzdC5HZXRIZWFkUG9zaXRpb24oKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIENQREZfUGFnZU9iamVjdCogcE9iaiA9IChDUERGX1BhZ2VPYmplY3QqKW1fT2JqZWN0TGlzdC5HZXROZXh0KHBvcyk7Ci0gICAgICAgIHBDbG9uZS0+bV9PYmplY3RMaXN0LkFkZFRhaWwocE9iai0+Q2xvbmUoKSk7Ci0gICAgfQotICAgIHJldHVybiBwQ2xvbmU7Ci19Ci12b2lkIENQREZfUGFnZTo6R2V0RGlzcGxheU1hdHJpeChDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgsIGludCB4UG9zLCBpbnQgeVBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4U2l6ZSwgaW50IHlTaXplLCBpbnQgaVJvdGF0ZSkgY29uc3QKLXsKLSAgICBpZiAobV9QYWdlV2lkdGggPT0gMCB8fCBtX1BhZ2VIZWlnaHQgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENGWF9BZmZpbmVNYXRyaXggZGlzcGxheV9tYXRyaXg7Ci0gICAgaW50IHgwLCB5MCwgeDEsIHkxLCB4MiwgeTI7Ci0gICAgaVJvdGF0ZSAlPSA0OwotICAgIHN3aXRjaCAoaVJvdGF0ZSkgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICB4MCA9IHhQb3M7Ci0gICAgICAgICAgICB5MCA9IHlQb3MgKyB5U2l6ZTsKLSAgICAgICAgICAgIHgxID0geFBvczsKLSAgICAgICAgICAgIHkxID0geVBvczsKLSAgICAgICAgICAgIHgyID0geFBvcyArIHhTaXplOwotICAgICAgICAgICAgeTIgPSB5UG9zICsgeVNpemU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgeDAgPSB4UG9zOwotICAgICAgICAgICAgeTAgPSB5UG9zOwotICAgICAgICAgICAgeDEgPSB4UG9zICsgeFNpemU7Ci0gICAgICAgICAgICB5MSA9IHlQb3M7Ci0gICAgICAgICAgICB4MiA9IHhQb3M7Ci0gICAgICAgICAgICB5MiA9IHlQb3MgKyB5U2l6ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICB4MCA9IHhQb3MgKyB4U2l6ZTsKLSAgICAgICAgICAgIHkwID0geVBvczsKLSAgICAgICAgICAgIHgxID0geFBvcyArIHhTaXplOwotICAgICAgICAgICAgeTEgPSB5UG9zICsgeVNpemU7Ci0gICAgICAgICAgICB4MiA9IHhQb3M7Ci0gICAgICAgICAgICB5MiA9IHlQb3M7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgeDAgPSB4UG9zICsgeFNpemU7Ci0gICAgICAgICAgICB5MCA9IHlQb3MgKyB5U2l6ZTsKLSAgICAgICAgICAgIHgxID0geFBvczsKLSAgICAgICAgICAgIHkxID0geVBvcyArIHlTaXplOwotICAgICAgICAgICAgeDIgPSB4UG9zICsgeFNpemU7Ci0gICAgICAgICAgICB5MiA9IHlQb3M7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgZGlzcGxheV9tYXRyaXguU2V0KEZYU1lTX0RpdigoRlhfRkxPQVQpKHgyIC0geDApLCBtX1BhZ2VXaWR0aCksCi0gICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX0RpdigoRlhfRkxPQVQpKHkyIC0geTApLCBtX1BhZ2VXaWR0aCksCi0gICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX0RpdigoRlhfRkxPQVQpKHgxIC0geDApLCBtX1BhZ2VIZWlnaHQpLAotICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19EaXYoKEZYX0ZMT0FUKSh5MSAtIHkwKSwgbV9QYWdlSGVpZ2h0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKXgwLCAoRlhfRkxPQVQpeTApOwotICAgIG1hdHJpeCA9IG1fUGFnZU1hdHJpeDsKLSAgICBtYXRyaXguQ29uY2F0KGRpc3BsYXlfbWF0cml4KTsKLX0KLUNQREZfUGFyc2VPcHRpb25zOjpDUERGX1BhcnNlT3B0aW9ucygpCi17Ci0gICAgbV9iVGV4dE9ubHkgPSBGQUxTRTsKLSAgICBtX2JNYXJrZWRDb250ZW50ID0gVFJVRTsKLSAgICBtX2JTZXBhcmF0ZUZvcm0gPSBUUlVFOwotICAgIG1fYkRlY29kZUlubGluZUltYWdlID0gRkFMU0U7CitDUERGX1BhcnNlT3B0aW9uczo6Q1BERl9QYXJzZU9wdGlvbnMoKSB7CisgIG1fYlRleHRPbmx5ID0gRkFMU0U7CisgIG1fYk1hcmtlZENvbnRlbnQgPSBUUlVFOworICBtX2JTZXBhcmF0ZUZvcm0gPSBUUlVFOworICBtX2JEZWNvZGVJbmxpbmVJbWFnZSA9IEZBTFNFOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2NvbG9ycy5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfY29sb3JzLmNwcAppbmRleCA4YjlmZjhlLi44N2I5ZTAyIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfY29sb3JzLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfY29sb3JzLmNwcApAQCAtMSwxNDU3ICsxLDE1NDQgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2UuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCIKICNpbmNsdWRlICJwYWdlaW50LmgiCisKICNpbmNsdWRlIDxsaW1pdHMuaD4KLXZvaWQgc1JHQl90b19BZG9iZUNNWUsoRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQiwgRlhfRkxPQVQmIGMsIEZYX0ZMT0FUJiBtLCBGWF9GTE9BVCYgeSwgRlhfRkxPQVQmIGspCi17Ci0gICAgYyA9IDEuMGYgLSBSOwotICAgIG0gPSAxLjBmIC0gRzsKLSAgICB5ID0gMS4wZiAtIEI7Ci0gICAgayA9IGM7Ci0gICAgaWYgKG0gPCBrKSB7Ci0gICAgICAgIGsgPSBtOwotICAgIH0KLSAgICBpZiAoeSA8IGspIHsKLSAgICAgICAgayA9IHk7Ci0gICAgfQorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIgorCituYW1lc3BhY2UgeworCit2b2lkIHNSR0JfdG9fQWRvYmVDTVlLKEZYX0ZMT0FUIFIsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEcsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEIsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBjLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHksCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBrKSB7CisgIGMgPSAxLjBmIC0gUjsKKyAgbSA9IDEuMGYgLSBHOworICB5ID0gMS4wZiAtIEI7CisgIGsgPSBjOworICBpZiAobSA8IGspIHsKKyAgICBrID0gbTsKKyAgfQorICBpZiAoeSA8IGspIHsKKyAgICBrID0geTsKKyAgfQogfQotQ1BERl9EZXZpY2VDUzo6Q1BERl9EZXZpY2VDUyhpbnQgZmFtaWx5KQotewotICAgIG1fRmFtaWx5ID0gZmFtaWx5OwotICAgIGlmIChtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VSR0IpIHsKLSAgICAgICAgbV9uQ29tcG9uZW50cyA9IDM7Ci0gICAgfSBlbHNlIGlmIChtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VHUkFZKSB7Ci0gICAgICAgIG1fbkNvbXBvbmVudHMgPSAxOworCitpbnQgQ29tcG9uZW50c0ZvckZhbWlseShpbnQgZmFtaWx5KSB7CisgIGlmIChmYW1pbHkgPT0gUERGQ1NfREVWSUNFUkdCKQorICAgIHJldHVybiAzOworICBpZiAoZmFtaWx5ID09IFBERkNTX0RFVklDRUdSQVkpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiA0OworfQorCit2b2lkIFJldmVyc2VSR0IodWludDhfdCogcERlc3RCdWYsIGNvbnN0IHVpbnQ4X3QqIHBTcmNCdWYsIGludCBwaXhlbHMpIHsKKyAgaWYgKHBEZXN0QnVmID09IHBTcmNCdWYpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7CisgICAgICB1aW50OF90IHRlbXAgPSBwRGVzdEJ1ZlsyXTsKKyAgICAgIHBEZXN0QnVmWzJdID0gcERlc3RCdWZbMF07CisgICAgICBwRGVzdEJ1ZlswXSA9IHRlbXA7CisgICAgICBwRGVzdEJ1ZiArPSAzOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7CisgICAgICAqcERlc3RCdWYrKyA9IHBTcmNCdWZbMl07CisgICAgICAqcERlc3RCdWYrKyA9IHBTcmNCdWZbMV07CisgICAgICAqcERlc3RCdWYrKyA9IHBTcmNCdWZbMF07CisgICAgICBwU3JjQnVmICs9IDM7CisgICAgfQorICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitDUERGX0RldmljZUNTOjpDUERGX0RldmljZUNTKENQREZfRG9jdW1lbnQqIHBEb2MsIGludCBmYW1pbHkpCisgICAgOiBDUERGX0NvbG9yU3BhY2UocERvYywgZmFtaWx5LCBDb21wb25lbnRzRm9yRmFtaWx5KGZhbWlseSkpIHt9CisKK0ZYX0JPT0wgQ1BERl9EZXZpY2VDUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBCKSBjb25zdCB7CisgIGlmIChtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VSR0IpIHsKKyAgICBSID0gcEJ1ZlswXTsKKyAgICBpZiAoUiA8IDApIHsKKyAgICAgIFIgPSAwOworICAgIH0gZWxzZSBpZiAoUiA+IDEpIHsKKyAgICAgIFIgPSAxOworICAgIH0KKyAgICBHID0gcEJ1ZlsxXTsKKyAgICBpZiAoRyA8IDApIHsKKyAgICAgIEcgPSAwOworICAgIH0gZWxzZSBpZiAoRyA+IDEpIHsKKyAgICAgIEcgPSAxOworICAgIH0KKyAgICBCID0gcEJ1ZlsyXTsKKyAgICBpZiAoQiA8IDApIHsKKyAgICAgIEIgPSAwOworICAgIH0gZWxzZSBpZiAoQiA+IDEpIHsKKyAgICAgIEIgPSAxOworICAgIH0KKyAgfSBlbHNlIGlmIChtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VHUkFZKSB7CisgICAgUiA9ICpwQnVmOworICAgIGlmIChSIDwgMCkgeworICAgICAgUiA9IDA7CisgICAgfSBlbHNlIGlmIChSID4gMSkgeworICAgICAgUiA9IDE7CisgICAgfQorICAgIEcgPSBCID0gUjsKKyAgfSBlbHNlIGlmIChtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLKSB7CisgICAgaWYgKCFtX2R3U3RkQ29udmVyc2lvbikgeworICAgICAgQWRvYmVDTVlLX3RvX3NSR0IocEJ1ZlswXSwgcEJ1ZlsxXSwgcEJ1ZlsyXSwgcEJ1ZlszXSwgUiwgRywgQik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbV9uQ29tcG9uZW50cyA9IDQ7CisgICAgICBGWF9GTE9BVCBrID0gcEJ1ZlszXTsKKyAgICAgIFIgPSAxLjBmIC0gc3RkOjptaW4oMS4wZiwgcEJ1ZlswXSArIGspOworICAgICAgRyA9IDEuMGYgLSBzdGQ6Om1pbigxLjBmLCBwQnVmWzFdICsgayk7CisgICAgICBCID0gMS4wZiAtIHN0ZDo6bWluKDEuMGYsIHBCdWZbMl0gKyBrKTsKICAgICB9Ci19Ci1GWF9CT09MIENQREZfRGV2aWNlQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKLXsKLSAgICBpZiAobV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFUkdCKSB7Ci0gICAgICAgIFIgPSBwQnVmWzBdOwotICAgICAgICBpZiAoUiA8IDApIHsKLSAgICAgICAgICAgIFIgPSAwOwotICAgICAgICB9IGVsc2UgaWYgKFIgPiAxKSB7Ci0gICAgICAgICAgICBSID0gMTsKLSAgICAgICAgfQotICAgICAgICBHID0gcEJ1ZlsxXTsKLSAgICAgICAgaWYgKEcgPCAwKSB7Ci0gICAgICAgICAgICBHID0gMDsKLSAgICAgICAgfSBlbHNlIGlmIChHID4gMSkgewotICAgICAgICAgICAgRyA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgQiA9IHBCdWZbMl07Ci0gICAgICAgIGlmIChCIDwgMCkgewotICAgICAgICAgICAgQiA9IDA7Ci0gICAgICAgIH0gZWxzZSBpZiAoQiA+IDEpIHsKLSAgICAgICAgICAgIEIgPSAxOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VHUkFZKSB7Ci0gICAgICAgIFIgPSAqcEJ1ZjsKLSAgICAgICAgaWYgKFIgPCAwKSB7Ci0gICAgICAgICAgICBSID0gMDsKLSAgICAgICAgfSBlbHNlIGlmIChSID4gMSkgewotICAgICAgICAgICAgUiA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgRyA9IEIgPSBSOwotICAgIH0gZWxzZSBpZiAobV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSykgewotICAgICAgICBpZiAoIW1fZHdTdGRDb252ZXJzaW9uKSB7Ci0gICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQihwQnVmWzBdLCBwQnVmWzFdLCBwQnVmWzJdLCBwQnVmWzNdLCBSLCBHLCBCKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZYX0ZMT0FUIGsgPSBwQnVmWzNdOwotICAgICAgICAgICAgUiA9IDEuMGYgLSBGWF9NSU4oMS4wZiwgcEJ1ZlswXSArIGspOwotICAgICAgICAgICAgRyA9IDEuMGYgLSBGWF9NSU4oMS4wZiwgcEJ1ZlsxXSArIGspOwotICAgICAgICAgICAgQiA9IDEuMGYgLSBGWF9NSU4oMS4wZiwgcEJ1ZlsyXSArIGspOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQVNTRVJUKG1fRmFtaWx5ID09IFBERkNTX1BBVFRFUk4pOwotICAgICAgICBSID0gRyA9IEIgPSAwOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX0RldmljZUNTOjp2X0dldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBjLCBGWF9GTE9BVCYgbSwgRlhfRkxPQVQmIHksIEZYX0ZMT0FUJiBrKSBjb25zdAotewotICAgIGlmIChtX0ZhbWlseSAhPSBQREZDU19ERVZJQ0VDTVlLKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgYyA9IHBCdWZbMF07Ci0gICAgbSA9IHBCdWZbMV07Ci0gICAgeSA9IHBCdWZbMl07Ci0gICAgayA9IHBCdWZbM107Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENQREZfRGV2aWNlQ1M6OlNldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQikgY29uc3QKLXsKLSAgICBpZiAobV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFUkdCKSB7Ci0gICAgICAgIHBCdWZbMF0gPSBSOwotICAgICAgICBwQnVmWzFdID0gRzsKLSAgICAgICAgcEJ1ZlsyXSA9IEI7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0gZWxzZSBpZiAobV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFR1JBWSkgewotICAgICAgICBpZiAoUiA9PSBHICYmIFIgPT0gQikgewotICAgICAgICAgICAgKnBCdWYgPSBSOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRUNNWUspIHsKLSAgICAgICAgc1JHQl90b19BZG9iZUNNWUsoUiwgRywgQiwgcEJ1ZlswXSwgcEJ1ZlsxXSwgcEJ1ZlsyXSwgcEJ1ZlszXSk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KKyAgfSBlbHNlIHsKKyAgICBBU1NFUlQobV9GYW1pbHkgPT0gUERGQ1NfUEFUVEVSTik7CisgICAgUiA9IEcgPSBCID0gMDsKICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENQREZfRGV2aWNlQ1M6OnZfU2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgYywgRlhfRkxPQVQgbSwgRlhfRkxPQVQgeSwgRlhfRkxPQVQgaykgY29uc3QKLXsKLSAgICBpZiAobV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFUkdCKSB7Ci0gICAgICAgIEFkb2JlQ01ZS190b19zUkdCKGMsIG0sIHksIGssIHBCdWZbMF0sIHBCdWZbMV0sIHBCdWZbMl0pOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9IGVsc2UgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRUdSQVkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0gZWxzZSBpZiAobV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSykgewotICAgICAgICBwQnVmWzBdID0gYzsKLSAgICAgICAgcEJ1ZlsxXSA9IG07Ci0gICAgICAgIHBCdWZbMl0gPSB5OwotICAgICAgICBwQnVmWzNdID0gazsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQorRlhfQk9PTCBDUERGX0RldmljZUNTOjp2X0dldENNWUsoRlhfRkxPQVQqIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgaykgY29uc3QgeworICBpZiAobV9GYW1pbHkgIT0gUERGQ1NfREVWSUNFQ01ZSykgewogICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBjID0gcEJ1ZlswXTsKKyAgbSA9IHBCdWZbMV07CisgIHkgPSBwQnVmWzJdOworICBrID0gcEJ1ZlszXTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1zdGF0aWMgdm9pZCBSZXZlcnNlUkdCKEZYX0xQQllURSBwRGVzdEJ1ZiwgRlhfTFBDQllURSBwU3JjQnVmLCBpbnQgcGl4ZWxzKQotewotICAgIGlmIChwRGVzdEJ1ZiA9PSBwU3JjQnVmKQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSArKykgewotICAgICAgICAgICAgRlhfQllURSB0ZW1wID0gcERlc3RCdWZbMl07Ci0gICAgICAgICAgICBwRGVzdEJ1ZlsyXSA9IHBEZXN0QnVmWzBdOwotICAgICAgICAgICAgcERlc3RCdWZbMF0gPSB0ZW1wOwotICAgICAgICAgICAgcERlc3RCdWYgKz0gMzsKLSAgICAgICAgfQotICAgIGVsc2UKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHM7IGkgKyspIHsKLSAgICAgICAgICAgICpwRGVzdEJ1ZiArKyA9IHBTcmNCdWZbMl07Ci0gICAgICAgICAgICAqcERlc3RCdWYgKysgPSBwU3JjQnVmWzFdOwotICAgICAgICAgICAgKnBEZXN0QnVmICsrID0gcFNyY0J1ZlswXTsKLSAgICAgICAgICAgIHBTcmNCdWYgKz0gMzsKLSAgICAgICAgfQotfQotdm9pZCBDUERGX0RldmljZUNTOjpUcmFuc2xhdGVJbWFnZUxpbmUoRlhfTFBCWVRFIHBEZXN0QnVmLCBGWF9MUENCWVRFIHBTcmNCdWYsIGludCBwaXhlbHMsIGludCBpbWFnZV93aWR0aCwgaW50IGltYWdlX2hlaWdodCwgRlhfQk9PTCBiVHJhbnNNYXNrKSBjb25zdAotewotICAgIGlmIChiVHJhbnNNYXNrICYmIG1fRmFtaWx5ID09IFBERkNTX0RFVklDRUNNWUspIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHM7IGkgKyspIHsKLSAgICAgICAgICAgIGludCBrID0gMjU1IC0gcFNyY0J1ZlszXTsKLSAgICAgICAgICAgIHBEZXN0QnVmWzBdID0gKCgyNTUgLSBwU3JjQnVmWzBdKSAqIGspIC8gMjU1OwotICAgICAgICAgICAgcERlc3RCdWZbMV0gPSAoKDI1NSAtIHBTcmNCdWZbMV0pICogaykgLyAyNTU7Ci0gICAgICAgICAgICBwRGVzdEJ1ZlsyXSA9ICgoMjU1IC0gcFNyY0J1ZlsyXSkgKiBrKSAvIDI1NTsKLSAgICAgICAgICAgIHBEZXN0QnVmICs9IDM7Ci0gICAgICAgICAgICBwU3JjQnVmICs9IDQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFUkdCKSB7Ci0gICAgICAgIFJldmVyc2VSR0IocERlc3RCdWYsIHBTcmNCdWYsIHBpeGVscyk7Ci0gICAgfSBlbHNlIGlmIChtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VHUkFZKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzOyBpICsrKSB7Ci0gICAgICAgICAgICAqcERlc3RCdWYgKysgPSBwU3JjQnVmW2ldOwotICAgICAgICAgICAgKnBEZXN0QnVmICsrID0gcFNyY0J1ZltpXTsKLSAgICAgICAgICAgICpwRGVzdEJ1ZiArKyA9IHBTcmNCdWZbaV07Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSArKykgewotICAgICAgICAgICAgaWYgKCFtX2R3U3RkQ29udmVyc2lvbikgewotICAgICAgICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShwU3JjQnVmWzBdLCBwU3JjQnVmWzFdLCBwU3JjQnVmWzJdLCBwU3JjQnVmWzNdLCBwRGVzdEJ1ZlsyXSwgcERlc3RCdWZbMV0sIHBEZXN0QnVmWzBdKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgRlhfQllURSBrID0gcFNyY0J1ZlszXTsKLSAgICAgICAgICAgICAgICBwRGVzdEJ1ZlsyXSA9IDI1NSAtIEZYX01JTigyNTUsIHBTcmNCdWZbMF0gKyBrKTsKLSAgICAgICAgICAgICAgICBwRGVzdEJ1ZlsxXSA9IDI1NSAtIEZYX01JTigyNTUsIHBTcmNCdWZbMV0gKyBrKTsKLSAgICAgICAgICAgICAgICBwRGVzdEJ1ZlswXSA9IDI1NSAtIEZYX01JTigyNTUsIHBTcmNCdWZbMl0gKyBrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBTcmNCdWYgKz0gNDsKLSAgICAgICAgICAgIHBEZXN0QnVmICs9IDM7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1jb25zdCBGWF9CWVRFIGdfc1JHQlNhbXBsZXMxW10gPSB7Ci0gICAgMCwgICAzLCAgIDYsICAxMCwgIDEzLCAgMTUsICAxOCwgIDIwLCAgMjIsICAyMywgIDI1LCAgMjcsICAyOCwgIDMwLCAgMzEsICAzMiwKLSAgICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LCAgNDgsICA0OSwKLSAgICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NiwgIDU3LCAgNTgsICA1OCwgIDU5LCAgNjAsICA2MSwKLSAgICA2MSwgIDYyLCAgNjIsICA2MywgIDY0LCAgNjQsICA2NSwgIDY2LCAgNjYsICA2NywgIDY3LCAgNjgsICA2OCwgIDY5LCAgNzAsICA3MCwKLSAgICA3MSwgIDcxLCAgNzIsICA3MiwgIDczLCAgNzMsICA3NCwgIDc0LCAgNzUsICA3NiwgIDc2LCAgNzcsICA3NywgIDc4LCAgNzgsICA3OSwKLSAgICA3OSwgIDc5LCAgODAsICA4MCwgIDgxLCAgODEsICA4MiwgIDgyLCAgODMsICA4MywgIDg0LCAgODQsICA4NSwgIDg1LCAgODUsICA4NiwKLSAgICA4NiwgIDg3LCAgODcsICA4OCwgIDg4LCAgODgsICA4OSwgIDg5LCAgOTAsICA5MCwgIDkxLCAgOTEsICA5MSwgIDkyLCAgOTIsICA5MywKLSAgICA5MywgIDkzLCAgOTQsICA5NCwgIDk1LCAgOTUsICA5NSwgIDk2LCAgOTYsICA5NywgIDk3LCAgOTcsICA5OCwgIDk4LCAgOTgsICA5OSwKLSAgICA5OSwgIDk5LCAxMDAsIDEwMCwgMTAxLCAxMDEsIDEwMSwgMTAyLCAxMDIsIDEwMiwgMTAzLCAxMDMsIDEwMywgMTA0LCAxMDQsIDEwNCwKLSAgICAxMDUsIDEwNSwgMTA2LCAxMDYsIDEwNiwgMTA3LCAxMDcsIDEwNywgMTA4LCAxMDgsIDEwOCwgMTA5LCAxMDksIDEwOSwgMTEwLCAxMTAsCi0gICAgMTEwLCAxMTAsIDExMSwgMTExLCAxMTEsIDExMiwgMTEyLCAxMTIsIDExMywgMTEzLCAxMTMsIDExNCwgMTE0LCAxMTQsIDExNSwgMTE1LAotICAgIDExNSwgMTE1LCAxMTYsIDExNiwgMTE2LCAxMTcsIDExNywgMTE3LCAxMTgsIDExOCwgMTE4LCAxMTgsIDExOSwgMTE5LCAxMTksIDEyMCwKLX07Ci1jb25zdCBGWF9CWVRFIGdfc1JHQlNhbXBsZXMyW10gPSB7Ci0gICAgMTIwLCAxMjEsIDEyMiwgMTI0LCAxMjUsIDEyNiwgMTI3LCAxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LAotICAgIDEzNywgMTM4LCAxMzksIDE0MCwgMTQxLCAxNDIsIDE0MywgMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OCwgMTQ5LCAxNTAsIDE1MSwKLSAgICAxNTIsIDE1MywgMTU0LCAxNTUsIDE1NSwgMTU2LCAxNTcsIDE1OCwgMTU5LCAxNTksIDE2MCwgMTYxLCAxNjIsIDE2MywgMTYzLCAxNjQsCi0gICAgMTY1LCAxNjYsIDE2NywgMTY3LCAxNjgsIDE2OSwgMTcwLCAxNzAsIDE3MSwgMTcyLCAxNzMsIDE3MywgMTc0LCAxNzUsIDE3NSwgMTc2LAotICAgIDE3NywgMTc4LCAxNzgsIDE3OSwgMTgwLCAxODAsIDE4MSwgMTgyLCAxODIsIDE4MywgMTg0LCAxODUsIDE4NSwgMTg2LCAxODcsIDE4NywKLSAgICAxODgsIDE4OSwgMTg5LCAxOTAsIDE5MCwgMTkxLCAxOTIsIDE5MiwgMTkzLCAxOTQsIDE5NCwgMTk1LCAxOTYsIDE5NiwgMTk3LCAxOTcsCi0gICAgMTk4LCAxOTksIDE5OSwgMjAwLCAyMDAsIDIwMSwgMjAyLCAyMDIsIDIwMywgMjAzLCAyMDQsIDIwNSwgMjA1LCAyMDYsIDIwNiwgMjA3LAotICAgIDIwOCwgMjA4LCAyMDksIDIwOSwgMjEwLCAyMTAsIDIxMSwgMjEyLCAyMTIsIDIxMywgMjEzLCAyMTQsIDIxNCwgMjE1LCAyMTUsIDIxNiwKLSAgICAyMTYsIDIxNywgMjE4LCAyMTgsIDIxOSwgMjE5LCAyMjAsIDIyMCwgMjIxLCAyMjEsIDIyMiwgMjIyLCAyMjMsIDIyMywgMjI0LCAyMjQsCi0gICAgMjI1LCAyMjYsIDIyNiwgMjI3LCAyMjcsIDIyOCwgMjI4LCAyMjksIDIyOSwgMjMwLCAyMzAsIDIzMSwgMjMxLCAyMzIsIDIzMiwgMjMzLAotICAgIDIzMywgMjM0LCAyMzQsIDIzNSwgMjM1LCAyMzYsIDIzNiwgMjM3LCAyMzcsIDIzOCwgMjM4LCAyMzgsIDIzOSwgMjM5LCAyNDAsIDI0MCwKLSAgICAyNDEsIDI0MSwgMjQyLCAyNDIsIDI0MywgMjQzLCAyNDQsIDI0NCwgMjQ1LCAyNDUsIDI0NiwgMjQ2LCAyNDYsIDI0NywgMjQ3LCAyNDgsCi0gICAgMjQ4LCAyNDksIDI0OSwgMjUwLCAyNTAsIDI1MSwgMjUxLCAyNTEsIDI1MiwgMjUyLCAyNTMsIDI1MywgMjU0LCAyNTQsIDI1NSwgMjU1LAotfTsKLQotc3RhdGljIEZYX0ZMT0FUIFJHQl9Db252ZXJzaW9uKEZYX0ZMT0FUIGNvbG9yQ29tcG9uZW50KQotewotICAgIGlmIChjb2xvckNvbXBvbmVudCA+IDEpIHsKLSAgICAgICAgY29sb3JDb21wb25lbnQgPSAxOwotICAgIH0KLSAgICBpZiAoY29sb3JDb21wb25lbnQgPCAwKSB7Ci0gICAgICAgIGNvbG9yQ29tcG9uZW50ID0gMDsKLSAgICB9Ci0gICAgaW50IHNjYWxlID0gKGludCkoY29sb3JDb21wb25lbnQgKiAxMDIzKTsKLSAgICBpZiAoc2NhbGUgPCAwKSB7Ci0gICAgICAgIHNjYWxlID0gMDsKLSAgICB9Ci0gICAgaWYgKHNjYWxlIDwgMTkyKSB7Ci0gICAgICAgIGNvbG9yQ29tcG9uZW50ID0gKGdfc1JHQlNhbXBsZXMxW3NjYWxlXSAvIDI1NS4wZik7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBjb2xvckNvbXBvbmVudCA9IChnX3NSR0JTYW1wbGVzMltzY2FsZSAvIDQgLSA0OF0gLyAyNTUuMGYpOwotICAgIH0KLSAgICByZXR1cm4gY29sb3JDb21wb25lbnQ7Ci19Ci0KLXN0YXRpYyB2b2lkIFhZWl90b19zUkdCKEZYX0ZMT0FUIFgsIEZYX0ZMT0FUIFksIEZYX0ZMT0FUIFosIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpCi17Ci0gICAgRlhfRkxPQVQgUjEgPSAzLjI0MTBmICogWCAtIDEuNTM3NGYgKiBZIC0gMC40OTg2ZiAqIFo7Ci0gICAgRlhfRkxPQVQgRzEgPSAtMC45NjkyZiAqIFggKyAxLjg3NjBmICogWSArIDAuMDQxNmYgKiBaOwotICAgIEZYX0ZMT0FUIEIxID0gIDAuMDU1NmYgKiBYIC0gMC4yMDQwZiAqIFkgKyAxLjA1NzBmICogWjsKLQotICAgIFIgPSBSR0JfQ29udmVyc2lvbihSMSk7Ci0gICAgRyA9IFJHQl9Db252ZXJzaW9uKEcxKTsKLSAgICBCID0gUkdCX0NvbnZlcnNpb24oQjEpOwotfQotCi1zdGF0aWMgdm9pZCBYWVpfdG9fc1JHQl9XaGl0ZVBvaW50KEZYX0ZMT0FUIFgsIEZYX0ZMT0FUIFksIEZYX0ZMT0FUIFosIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIsIEZYX0ZMT0FUIFh3LCBGWF9GTE9BVCBZdywgRlhfRkxPQVQgWncpCi17Ci0gICAgLy8gVGhlIGZvbGxvd2luZyBSR0JfeHl6IGlzIGJhc2VkIG9uCi0gICAgLy8gc1JHQiB2YWx1ZSB7UngsUnl9PXswLjY0LCAwLjMzfSwge0d4LEd5fT17MC4zMCwgMC42MH0sIHtCeCxCeX09ezAuMTUsIDAuMDZ9Ci0KLSAgICBGWF9GTE9BVCBSeCA9IDAuNjRmLCBSeSA9IDAuMzNmOwotICAgIEZYX0ZMT0FUIEd4ID0gMC4zMGYsIEd5ID0gMC42MGY7Ci0gICAgRlhfRkxPQVQgQnggPSAwLjE1ZiwgQnkgPSAwLjA2ZjsKLSAgICBDRlhfTWF0cml4XzNieTMgUkdCX3h5eihSeCwgR3gsIEJ4LCBSeSwgR3ksIEJ5LCAxIC0gUnggLSBSeSwgMSAtIEd4IC0gR3ksIDEgLSBCeCAtIEJ5KTsKLSAgICBDRlhfVmVjdG9yXzNieTEgd2hpdGVQb2ludChYdywgWXcsIFp3KTsKLSAgICBDRlhfVmVjdG9yXzNieTEgWFlaKFgsIFksIFopOwotCi0gICAgQ0ZYX1ZlY3Rvcl8zYnkxIFJHQl9TdW1fWFlaID0gUkdCX3h5ei5JbnZlcnNlKCkuVHJhbnNmb3JtVmVjdG9yKHdoaXRlUG9pbnQpOwotICAgIENGWF9NYXRyaXhfM2J5MyBSR0JfU1VNX1hZWl9ESUFHKFJHQl9TdW1fWFlaLmEsIDAsIDAsIDAsIFJHQl9TdW1fWFlaLmIsIDAsIDAsIDAsIFJHQl9TdW1fWFlaLmMpOwotICAgIENGWF9NYXRyaXhfM2J5MyBNID0gUkdCX3h5ei5NdWx0aXBseShSR0JfU1VNX1hZWl9ESUFHKTsKLSAgICBDRlhfVmVjdG9yXzNieTEgUkdCID0gTS5JbnZlcnNlKCkuVHJhbnNmb3JtVmVjdG9yKFhZWik7Ci0KLSAgICBSID0gUkdCX0NvbnZlcnNpb24oUkdCLmEpOwotICAgIEcgPSBSR0JfQ29udmVyc2lvbihSR0IuYik7Ci0gICAgQiA9IFJHQl9Db252ZXJzaW9uKFJHQi5jKTsKLX0KLWNsYXNzIENQREZfQ2FsR3JheSA6IHB1YmxpYyBDUERGX0NvbG9yU3BhY2UKLXsKLXB1YmxpYzoKLSAgICBDUERGX0NhbEdyYXkoKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQJCVRyYW5zbGF0ZUltYWdlTGluZShGWF9MUEJZVEUgcERlc3RCdWYsIEZYX0xQQ0JZVEUgcFNyY0J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBGWF9CT09MIGJUcmFuc01hc2sgPSBGQUxTRSkgY29uc3Q7Ci0gICAgRlhfQk9PTAkJCQlTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0OwotICAgIEZYX0ZMT0FUCQkJbV9XaGl0ZVBvaW50WzNdOwotICAgIEZYX0ZMT0FUCQkJbV9CbGFja1BvaW50WzNdOwotICAgIEZYX0ZMT0FUCQkJbV9HYW1tYTsKLX07Ci1DUERGX0NhbEdyYXk6OkNQREZfQ2FsR3JheSgpCi17Ci0gICAgbV9GYW1pbHkgPSBQREZDU19DQUxHUkFZOwotICAgIG1fbkNvbXBvbmVudHMgPSAxOwotfQotRlhfQk9PTCBDUERGX0NhbEdyYXk6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCi17Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBBcnJheS0+R2V0RGljdCgxKTsKLSAgICBDUERGX0FycmF5KiBwUGFyYW0gPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIldoaXRlUG9pbnQiKSk7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDM7IGkgKyspIHsKLSAgICAgICAgbV9XaGl0ZVBvaW50W2ldID0gcFBhcmFtID8gcFBhcmFtLT5HZXROdW1iZXIoaSkgOiAwOwotICAgIH0KLSAgICBwUGFyYW0gPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkJsYWNrUG9pbnQiKSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDM7IGkgKyspIHsKLSAgICAgICAgbV9CbGFja1BvaW50W2ldID0gcFBhcmFtID8gcFBhcmFtLT5HZXROdW1iZXIoaSkgOiAwOwotICAgIH0KLSAgICBtX0dhbW1hID0gcERpY3QtPkdldE51bWJlcihGWF9CU1RSQygiR2FtbWEiKSk7Ci0gICAgaWYgKG1fR2FtbWEgPT0gMCkgewotICAgICAgICBtX0dhbW1hID0gMS4wZjsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENQREZfQ2FsR3JheTo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAotewotICAgIFIgPSBHID0gQiA9ICpwQnVmOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX0NhbEdyYXk6OlNldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQikgY29uc3QKLXsKLSAgICBpZiAoUiA9PSBHICYmIFIgPT0gQikgewotICAgICAgICAqcEJ1ZiA9IFI7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci19Ci12b2lkIENQREZfQ2FsR3JheTo6VHJhbnNsYXRlSW1hZ2VMaW5lKEZYX0xQQllURSBwRGVzdEJ1ZiwgRlhfTFBDQllURSBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsIGludCBpbWFnZV9oZWlnaHQsIEZYX0JPT0wgYlRyYW5zTWFzaykgY29uc3QKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSArKykgewotICAgICAgICAqcERlc3RCdWYgKysgPSBwU3JjQnVmW2ldOwotICAgICAgICAqcERlc3RCdWYgKysgPSBwU3JjQnVmW2ldOwotICAgICAgICAqcERlc3RCdWYgKysgPSBwU3JjQnVmW2ldOwotICAgIH0KLX0KLWNsYXNzIENQREZfQ2FsUkdCIDogcHVibGljIENQREZfQ29sb3JTcGFjZQotewotcHVibGljOgotICAgIENQREZfQ2FsUkdCKCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQl2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkCQlUcmFuc2xhdGVJbWFnZUxpbmUoRlhfTFBCWVRFIHBEZXN0QnVmLCBGWF9MUENCWVRFIHBTcmNCdWYsIGludCBwaXhlbHMsIGludCBpbWFnZV93aWR0aCwgaW50IGltYWdlX2hlaWdodCwgRlhfQk9PTCBiVHJhbnNNYXNrID0gRkFMU0UpIGNvbnN0OwotICAgIEZYX0JPT0wJCQkJU2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdDsKLSAgICBGWF9GTE9BVAkJCW1fV2hpdGVQb2ludFszXTsKLSAgICBGWF9GTE9BVAkJCW1fQmxhY2tQb2ludFszXTsKLSAgICBGWF9GTE9BVAkJCW1fR2FtbWFbM107Ci0gICAgRlhfRkxPQVQJCQltX01hdHJpeFs5XTsKLSAgICBGWF9CT09MCQkJCW1fYkdhbW1hLCBtX2JNYXRyaXg7Ci19OwotQ1BERl9DYWxSR0I6OkNQREZfQ2FsUkdCKCkKLXsKLSAgICBtX0ZhbWlseSA9IFBERkNTX0NBTFJHQjsKLSAgICBtX25Db21wb25lbnRzID0gMzsKLX0KLUZYX0JPT0wgQ1BERl9DYWxSR0I6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpCi17Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBBcnJheS0+R2V0RGljdCgxKTsKLSAgICBDUERGX0FycmF5KiBwUGFyYW0gPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIldoaXRlUG9pbnQiKSk7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDM7IGkgKyspIHsKLSAgICAgICAgbV9XaGl0ZVBvaW50W2ldID0gcFBhcmFtID8gcFBhcmFtLT5HZXROdW1iZXIoaSkgOiAwOwotICAgIH0KLSAgICBwUGFyYW0gPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkJsYWNrUG9pbnQiKSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDM7IGkgKyspIHsKLSAgICAgICAgbV9CbGFja1BvaW50W2ldID0gcFBhcmFtID8gcFBhcmFtLT5HZXROdW1iZXIoaSkgOiAwOwotICAgIH0KLSAgICBwUGFyYW0gPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkdhbW1hIikpOwotICAgIGlmIChwUGFyYW0pIHsKLSAgICAgICAgbV9iR2FtbWEgPSBUUlVFOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSArKykgewotICAgICAgICAgICAgbV9HYW1tYVtpXSA9IHBQYXJhbS0+R2V0TnVtYmVyKGkpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9iR2FtbWEgPSBGQUxTRTsKLSAgICB9Ci0gICAgcFBhcmFtID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJNYXRyaXgiKSk7Ci0gICAgaWYgKHBQYXJhbSkgewotICAgICAgICBtX2JNYXRyaXggPSBUUlVFOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgOTsgaSArKykgewotICAgICAgICAgICAgbV9NYXRyaXhbaV0gPSBwUGFyYW0tPkdldE51bWJlcihpKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fYk1hdHJpeCA9IEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ1BERl9DYWxSR0I6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKLXsKLSAgICBGWF9GTE9BVCBBXyA9IHBCdWZbMF07Ci0gICAgRlhfRkxPQVQgQl8gPSBwQnVmWzFdOwotICAgIEZYX0ZMT0FUIENfID0gcEJ1ZlsyXTsKLSAgICBpZiAobV9iR2FtbWEpIHsKLSAgICAgICAgQV8gPSAoRlhfRkxPQVQpRlhTWVNfcG93KEFfLCBtX0dhbW1hWzBdKTsKLSAgICAgICAgQl8gPSAoRlhfRkxPQVQpRlhTWVNfcG93KEJfLCBtX0dhbW1hWzFdKTsKLSAgICAgICAgQ18gPSAoRlhfRkxPQVQpRlhTWVNfcG93KENfLCBtX0dhbW1hWzJdKTsKLSAgICB9Ci0gICAgRlhfRkxPQVQgWCwgWSwgWjsKLSAgICBpZiAobV9iTWF0cml4KSB7Ci0gICAgICAgIFggPSBtX01hdHJpeFswXSAqIEFfICsgbV9NYXRyaXhbM10gKiBCXyArIG1fTWF0cml4WzZdICogQ187Ci0gICAgICAgIFkgPSBtX01hdHJpeFsxXSAqIEFfICsgbV9NYXRyaXhbNF0gKiBCXyArIG1fTWF0cml4WzddICogQ187Ci0gICAgICAgIFogPSBtX01hdHJpeFsyXSAqIEFfICsgbV9NYXRyaXhbNV0gKiBCXyArIG1fTWF0cml4WzhdICogQ187Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgWCA9IEFfOwotICAgICAgICBZID0gQl87Ci0gICAgICAgIFogPSBDXzsKLSAgICB9Ci0gICAgWFlaX3RvX3NSR0JfV2hpdGVQb2ludChYLCBZLCBaLCBSLCBHLCBCLCBtX1doaXRlUG9pbnRbMF0sIG1fV2hpdGVQb2ludFsxXSwgbV9XaGl0ZVBvaW50WzJdKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ1BERl9DYWxSR0I6OlNldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQikgY29uc3QKLXsKK0ZYX0JPT0wgQ1BERl9EZXZpY2VDUzo6U2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBCKSBjb25zdCB7CisgIGlmIChtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VSR0IpIHsKICAgICBwQnVmWzBdID0gUjsKICAgICBwQnVmWzFdID0gRzsKICAgICBwQnVmWzJdID0gQjsKICAgICByZXR1cm4gVFJVRTsKLX0KLXZvaWQgQ1BERl9DYWxSR0I6OlRyYW5zbGF0ZUltYWdlTGluZShGWF9MUEJZVEUgcERlc3RCdWYsIEZYX0xQQ0JZVEUgcFNyY0J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBGWF9CT09MIGJUcmFuc01hc2spIGNvbnN0Ci17Ci0gICAgaWYgKGJUcmFuc01hc2spIHsKLSAgICAgICAgRlhfRkxPQVQgQ2FsWzNdOwotICAgICAgICBGWF9GTE9BVCBSLCBHLCBCOwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcGl4ZWxzOyBpICsrKSB7Ci0gICAgICAgICAgICBDYWxbMF0gPSAoKEZYX0ZMT0FUKXBTcmNCdWZbMl0pIC8gMjU1OwotICAgICAgICAgICAgQ2FsWzFdID0gKChGWF9GTE9BVClwU3JjQnVmWzFdKSAvIDI1NTsKLSAgICAgICAgICAgIENhbFsyXSA9ICgoRlhfRkxPQVQpcFNyY0J1ZlswXSkgLyAyNTU7Ci0gICAgICAgICAgICBHZXRSR0IoQ2FsLCBSLCBHLCBCKTsKLSAgICAgICAgICAgIHBEZXN0QnVmWzBdID0gRlhTWVNfcm91bmQoQiAqIDI1NSk7Ci0gICAgICAgICAgICBwRGVzdEJ1ZlsxXSA9IEZYU1lTX3JvdW5kKEcgKiAyNTUpOwotICAgICAgICAgICAgcERlc3RCdWZbMl0gPSBGWFNZU19yb3VuZChSICogMjU1KTsKLSAgICAgICAgICAgIHBTcmNCdWYgKz0gMzsKLSAgICAgICAgICAgIHBEZXN0QnVmICs9IDM7Ci0gICAgICAgIH0KKyAgfQorICBpZiAobV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFR1JBWSkgeworICAgIGlmIChSID09IEcgJiYgUiA9PSBCKSB7CisgICAgICAqcEJ1ZiA9IFI7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgUmV2ZXJzZVJHQihwRGVzdEJ1ZiwgcFNyY0J1ZiwgcGl4ZWxzKTsKLX0KLWNsYXNzIENQREZfTGFiQ1MgOiBwdWJsaWMgQ1BERl9Db2xvclNwYWNlCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9MYWJDUygpCi0gICAgewotICAgICAgICBtX0ZhbWlseSA9IFBERkNTX0xBQjsKLSAgICAgICAgbV9uQ29tcG9uZW50cyA9IDM7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSk7Ci0gICAgdmlydHVhbCB2b2lkCQlHZXREZWZhdWx0VmFsdWUoaW50IGlDb21wb25lbnQsIEZYX0ZMT0FUJiB2YWx1ZSwgRlhfRkxPQVQmIG1pbiwgRlhfRkxPQVQmIG1heCkgY29uc3Q7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0OwotICAgIEZYX0JPT0wJCVNldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQikgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkCQlUcmFuc2xhdGVJbWFnZUxpbmUoRlhfTFBCWVRFIHBEZXN0QnVmLCBGWF9MUENCWVRFIHBTcmNCdWYsIGludCBwaXhlbHMsIGludCBpbWFnZV93aWR0aCwgaW50IGltYWdlX2hlaWdodCwgRlhfQk9PTCBiVHJhbnNNYXNrID0gRkFMU0UpIGNvbnN0OwotICAgIEZYX0ZMT0FUCW1fV2hpdGVQb2ludFszXTsKLSAgICBGWF9GTE9BVAltX0JsYWNrUG9pbnRbM107Ci0gICAgRlhfRkxPQVQJbV9SYW5nZXNbNF07Ci19OwotRlhfQk9PTCBDUERGX0xhYkNTOjp2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KQotewotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwQXJyYXktPkdldERpY3QoMSk7Ci0gICAgaWYgKCFwRGljdCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBQYXJhbSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiV2hpdGVQb2ludCIpKTsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSArKykgewotICAgICAgICBtX1doaXRlUG9pbnRbaV0gPSBwUGFyYW0gPyBwUGFyYW0tPkdldE51bWJlcihpKSA6IDA7Ci0gICAgfQotICAgIHBQYXJhbSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiQmxhY2tQb2ludCIpKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSArKykgewotICAgICAgICBtX0JsYWNrUG9pbnRbaV0gPSBwUGFyYW0gPyBwUGFyYW0tPkdldE51bWJlcihpKSA6IDA7Ci0gICAgfQotICAgIHBQYXJhbSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiUmFuZ2UiKSk7Ci0gICAgY29uc3QgRlhfRkxPQVQgZGVmX3Jhbmdlc1s0XSA9IHsgLTEwMCAqIDEuMGYsIDEwMCAqIDEuMGYsIC0xMDAgKiAxLjBmLCAxMDAgKiAxLjBmfTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSArKykgewotICAgICAgICBtX1Jhbmdlc1tpXSA9IHBQYXJhbSA/IHBQYXJhbS0+R2V0TnVtYmVyKGkpIDogZGVmX3Jhbmdlc1tpXTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci12b2lkIENQREZfTGFiQ1M6OkdldERlZmF1bHRWYWx1ZShpbnQgaUNvbXBvbmVudCwgRlhfRkxPQVQmIHZhbHVlLCBGWF9GTE9BVCYgbWluLCBGWF9GTE9BVCYgbWF4KSBjb25zdAotewotICAgIGFzc2VydChpQ29tcG9uZW50IDwgMyk7Ci0gICAgdmFsdWUgPSAwOwotICAgIGlmIChpQ29tcG9uZW50ID09IDApIHsKLSAgICAgICAgbWluID0gMDsKLSAgICAgICAgbWF4ID0gMTAwICogMS4wZjsKLSAgICB9IGVsc2UgewotICAgICAgICBtaW4gPSBtX1Jhbmdlc1tpQ29tcG9uZW50ICogMiAtIDJdOwotICAgICAgICBtYXggPSBtX1Jhbmdlc1tpQ29tcG9uZW50ICogMiAtIDFdOwotICAgICAgICBpZiAodmFsdWUgPCBtaW4pIHsKLSAgICAgICAgICAgIHZhbHVlID0gbWluOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID4gbWF4KSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IG1heDsKLSAgICAgICAgfQotICAgIH0KLX0KLUZYX0JPT0wgQ1BERl9MYWJDUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAotewotICAgIEZYX0ZMT0FUIExzdGFyID0gcEJ1ZlswXTsKLSAgICBGWF9GTE9BVCBhc3RhciA9IHBCdWZbMV07Ci0gICAgRlhfRkxPQVQgYnN0YXIgPSBwQnVmWzJdOwotICAgIEZYX0ZMT0FUIE0gPSAoTHN0YXIgKyAxNi4wZikgLyAxMTYuMGY7Ci0gICAgRlhfRkxPQVQgTCA9IE0gKyBhc3RhciAvIDUwMC4wZjsKLSAgICBGWF9GTE9BVCBOID0gTSAtIGJzdGFyIC8gMjAwLjBmOwotICAgIEZYX0ZMT0FUIFgsIFksIFo7Ci0gICAgaWYgKEwgPCAwLjIwNjlmKSB7Ci0gICAgICAgIFggPSAwLjk1N2YgKiAwLjEyODQyZiAqIChMIC0gMC4xMzc5Zik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgWCA9IDAuOTU3ZiAqIEwgKiBMICogTDsKLSAgICB9Ci0gICAgaWYgKE0gPCAwLjIwNjlmKSB7Ci0gICAgICAgIFkgPSAwLjEyODQyZiAqIChNIC0gMC4xMzc5Zik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgWSA9IE0gKiBNICogTTsKLSAgICB9Ci0gICAgaWYgKE4gPCAwLjIwNjlmKSB7Ci0gICAgICAgIFogPSAxLjA4ODlmICogMC4xMjg0MmYgKiAoTiAtIDAuMTM3OWYpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFogPSAxLjA4ODlmICogTiAqIE4gKiBOOwotICAgIH0KLSAgICBYWVpfdG9fc1JHQihYLCBZLCBaLCBSLCBHLCBCKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ1BERl9MYWJDUzo6U2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCBSLCBGWF9GTE9BVCBHLCBGWF9GTE9BVCBCKSBjb25zdAotewogICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAobV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSykgeworICAgIHNSR0JfdG9fQWRvYmVDTVlLKFIsIEcsIEIsIHBCdWZbMF0sIHBCdWZbMV0sIHBCdWZbMl0sIHBCdWZbM10pOworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KLXZvaWQgQ1BERl9MYWJDUzo6VHJhbnNsYXRlSW1hZ2VMaW5lKEZYX0xQQllURSBwRGVzdEJ1ZiwgRlhfTFBDQllURSBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsIGludCBpbWFnZV9oZWlnaHQsIEZYX0JPT0wgYlRyYW5zTWFzaykgY29uc3QKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSArKykgewotICAgICAgICBGWF9GTE9BVCBsYWJbM107Ci0gICAgICAgIEZYX0ZMT0FUIFIsIEcsIEI7Ci0gICAgICAgIGxhYlswXSA9IChwU3JjQnVmWzBdICogMTAwIC8gMjU1LjBmKTsKLSAgICAgICAgbGFiWzFdID0gKEZYX0ZMT0FUKShwU3JjQnVmWzFdIC0gMTI4KTsKLSAgICAgICAgbGFiWzJdID0gKEZYX0ZMT0FUKShwU3JjQnVmWzJdIC0gMTI4KTsKLSAgICAgICAgR2V0UkdCKGxhYiwgUiwgRywgQik7Ci0gICAgICAgIHBEZXN0QnVmWzBdID0gKEZYX0lOVDMyKShCICogMjU1KTsKLSAgICAgICAgcERlc3RCdWZbMV0gPSAoRlhfSU5UMzIpKEcgKiAyNTUpOwotICAgICAgICBwRGVzdEJ1ZlsyXSA9IChGWF9JTlQzMikoUiAqIDI1NSk7Ci0gICAgICAgIHBEZXN0QnVmICs9IDM7Ci0gICAgICAgIHBTcmNCdWYgKz0gMzsKLSAgICB9CitGWF9CT09MIENQREZfRGV2aWNlQ1M6OnZfU2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGspIGNvbnN0IHsKKyAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRVJHQikgeworICAgIEFkb2JlQ01ZS190b19zUkdCKGMsIG0sIHksIGssIHBCdWZbMF0sIHBCdWZbMV0sIHBCdWZbMl0pOworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLKSB7CisgICAgcEJ1ZlswXSA9IGM7CisgICAgcEJ1ZlsxXSA9IG07CisgICAgcEJ1ZlsyXSA9IHk7CisgICAgcEJ1ZlszXSA9IGs7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQotQ1BERl9JY2NQcm9maWxlOjpDUERGX0ljY1Byb2ZpbGUoRlhfTFBDQllURSBwRGF0YSwgRlhfRFdPUkQgZHdTaXplKToKLSAgICBtX2JzUkdCKEZBTFNFKSwKLSAgICBtX3BUcmFuc2Zvcm0oTlVMTCksCi0gICAgbV9uU3JjQ29tcG9uZW50cygwKQotewotICAgIGlmIChkd1NpemUgPT0gMzE0NCAmJiBGWFNZU19tZW1jbXAzMihwRGF0YSArIDB4MTkwLCAic1JHQiBJRUM2MTk2Ni0yLjEiLCAxNykgPT0gMCkgewotICAgICAgICBtX2JzUkdCID0gVFJVRTsKLSAgICAgICAgbV9uU3JjQ29tcG9uZW50cyA9IDM7Ci0gICAgfQotICAgIGVsc2UgaWYgKENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SWNjTW9kdWxlKCkpIHsKLSAgICAgICAgbV9wVHJhbnNmb3JtID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRJY2NNb2R1bGUoKS0+Q3JlYXRlVHJhbnNmb3JtX3NSR0IocERhdGEsIGR3U2l6ZSwgbV9uU3JjQ29tcG9uZW50cyk7Ci0gICAgfQotfQotQ1BERl9JY2NQcm9maWxlOjp+Q1BERl9JY2NQcm9maWxlKCkKLXsKLSAgICBpZiAobV9wVHJhbnNmb3JtKSB7Ci0gICAgICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SWNjTW9kdWxlKCktPkRlc3Ryb3lUcmFuc2Zvcm0obV9wVHJhbnNmb3JtKTsKLSAgICB9Ci19Ci1jbGFzcyBDUERGX0lDQ0Jhc2VkQ1MgOiBwdWJsaWMgQ1BERl9Db2xvclNwYWNlCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9JQ0NCYXNlZENTKCk7Ci0gICAgdmlydHVhbCB+Q1BERl9JQ0NCYXNlZENTKCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQl2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KTsKLSAgICB2b2lkCQkJCUdldERlZmF1bHRWYWx1ZShpbnQgaSwgRlhfRkxPQVQmIG1pbiwgRlhfRkxPQVQmIG1heCkgY29uc3QKLSAgICB7Ci0gICAgICAgIG1pbiA9IG1fcFJhbmdlc1tpICogMl07Ci0gICAgICAgIG1heCA9IG1fcFJhbmdlc1tpICogMiArIDFdOwotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3Q7Ci0gICAgRlhfQk9PTAkJCQl2X0dldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBjLCBGWF9GTE9BVCYgbSwgRlhfRkxPQVQmIHksIEZYX0ZMT0FUJiBrKSBjb25zdDsKLSAgICBGWF9CT09MCQkJCVNldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQikgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkCQlFbmFibGVTdGRDb252ZXJzaW9uKEZYX0JPT0wgYkVuYWJsZWQpOwotICAgIHZpcnR1YWwgdm9pZAkJVHJhbnNsYXRlSW1hZ2VMaW5lKEZYX0xQQllURSBwRGVzdEJ1ZiwgRlhfTFBDQllURSBwU3JjQnVmLCBpbnQgcGl4ZWxzLCBpbnQgaW1hZ2Vfd2lkdGgsIGludCBpbWFnZV9oZWlnaHQsIEZYX0JPT0wgYlRyYW5zTWFzayA9IEZBTFNFKSBjb25zdDsKLSAgICBGWF9GTE9BVCoJCW1fcFJhbmdlczsKLSAgICBDUERGX0ljY1Byb2ZpbGUqCW1fcFByb2ZpbGU7Ci0gICAgQ1BERl9Db2xvclNwYWNlKgltX3BBbHRlckNTOwotICAgIEZYX0xQQllURQkJCW1fcENhY2hlOwotICAgIEZYX0JPT0wJCQkJbV9iT3duOwotfTsKLUNQREZfSUNDQmFzZWRDUzo6Q1BERl9JQ0NCYXNlZENTKCkKLXsKLSAgICBtX3BBbHRlckNTID0gTlVMTDsKLSAgICBtX3BQcm9maWxlID0gTlVMTDsKLSAgICBtX0ZhbWlseSA9IFBERkNTX0lDQ0JBU0VEOwotICAgIG1fcENhY2hlID0gTlVMTDsKLSAgICBtX3BSYW5nZXMgPSBOVUxMOwotICAgIG1fYk93biA9IEZBTFNFOwotfQotQ1BERl9JQ0NCYXNlZENTOjp+Q1BERl9JQ0NCYXNlZENTKCkKLXsKLSAgICBpZiAobV9wQ2FjaGUpIHsKLSAgICAgICAgRlhfRnJlZShtX3BDYWNoZSk7Ci0gICAgfQotICAgIGlmIChtX3BSYW5nZXMpIHsKLSAgICAgICAgRlhfRnJlZShtX3BSYW5nZXMpOwotICAgIH0KLSAgICBpZiAobV9wQWx0ZXJDUyAmJiBtX2JPd24pIHsKLSAgICAgICAgbV9wQWx0ZXJDUy0+UmVsZWFzZUNTKCk7Ci0gICAgfQotICAgIGlmIChtX3BQcm9maWxlICYmIG1fcERvY3VtZW50KSB7Ci0gICAgICAgIG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlSWNjUHJvZmlsZShOVUxMLCBtX3BQcm9maWxlKTsKLSAgICB9Ci19Ci1GWF9CT09MIENQREZfSUNDQmFzZWRDUzo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkKLXsKLSAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IHBBcnJheS0+R2V0U3RyZWFtKDEpOwotICAgIGlmIChwU3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX3BQcm9maWxlID0gcERvYy0+TG9hZEljY1Byb2ZpbGUocFN0cmVhbSk7Ci0gICAgaWYgKCFtX3BQcm9maWxlKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9uQ29tcG9uZW50cyA9IG1fcFByb2ZpbGUtPkdldENvbXBvbmVudHMoKTsgLy9UcnkgdXNpbmcgdGhlIG5Db21wb25lbnRzIGZyb20gSUNDIHByb2ZpbGUKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOwotICAgIGlmIChtX3BQcm9maWxlLT5tX3BUcmFuc2Zvcm0gPT0gTlVMTCkgeyAvLyBObyB2YWxpZCBJQ0MgcHJvZmlsZSBvciB1c2luZyBzUkdCCi0gICAgICAgIENQREZfT2JqZWN0KiBwQWx0ZXJDU09iaiA9IHBEaWN0ID8gcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiQWx0ZXJuYXRlIikpIDogTlVMTDsKLSAgICAgICAgaWYgKHBBbHRlckNTT2JqKSB7Ci0gICAgICAgICAgICBDUERGX0NvbG9yU3BhY2UqIHBBbHRlckNTID0gQ1BERl9Db2xvclNwYWNlOjpMb2FkKHBEb2MsIHBBbHRlckNTT2JqKTsKLSAgICAgICAgICAgIGlmIChwQWx0ZXJDUykgewotICAgICAgICAgICAgICAgIGlmIChtX25Db21wb25lbnRzID09IDApIHsgLy8gTk8gdmFsaWQgSUNDIHByb2ZpbGUKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBBbHRlckNTLT5Db3VudENvbXBvbmVudHMoKSA+IDApIHsgLy8gVXNlIEFsdGVybmF0aXZlIGNvbG9yc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fbkNvbXBvbmVudHMgPSBwQWx0ZXJDUy0+Q291bnRDb21wb25lbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BBbHRlckNTID0gcEFsdGVyQ1M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2JPd24gPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgeyAvLyBObyB2YWxpZCBhbHRlcm5hdGl2ZSBjb2xvcnNwYWNlCi0gICAgICAgICAgICAgICAgICAgICAgICBwQWx0ZXJDUy0+UmVsZWFzZUNTKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWF9JTlQzMiBuRGljdENvbXBvbmVudHMgPSBwRGljdCA/IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJOIikpIDogMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuRGljdENvbXBvbmVudHMgIT0gMSAmJiBuRGljdENvbXBvbmVudHMgIT0gMyAmJiBuRGljdENvbXBvbmVudHMgIT0gNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fbkNvbXBvbmVudHMgPSBuRGljdENvbXBvbmVudHM7Ci0gICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsgLy8gVXNpbmcgc1JHQgotICAgICAgICAgICAgICAgICAgICBpZiAocEFsdGVyQ1MtPkNvdW50Q29tcG9uZW50cygpICE9IG1fbkNvbXBvbmVudHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBBbHRlckNTLT5SZWxlYXNlQ1MoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcEFsdGVyQ1MgPSBwQWx0ZXJDUzsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fYk93biA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtX3BBbHRlckNTKSB7Ci0gICAgICAgICAgICBpZiAobV9uQ29tcG9uZW50cyA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgbV9wQWx0ZXJDUyA9IEdldFN0b2NrQ1MoUERGQ1NfREVWSUNFR1JBWSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChtX25Db21wb25lbnRzID09IDMpIHsKLSAgICAgICAgICAgICAgICBtX3BBbHRlckNTID0gR2V0U3RvY2tDUyhQREZDU19ERVZJQ0VSR0IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobV9uQ29tcG9uZW50cyA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgbV9wQWx0ZXJDUyA9IEdldFN0b2NrQ1MoUERGQ1NfREVWSUNFQ01ZSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KK3ZvaWQgQ1BERl9EZXZpY2VDUzo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFNyY0J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2Vfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJhbnNNYXNrKSBjb25zdCB7CisgIGlmIChiVHJhbnNNYXNrICYmIG1fRmFtaWx5ID09IFBERkNTX0RFVklDRUNNWUspIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7CisgICAgICBpbnQgayA9IDI1NSAtIHBTcmNCdWZbM107CisgICAgICBwRGVzdEJ1ZlswXSA9ICgoMjU1IC0gcFNyY0J1ZlswXSkgKiBrKSAvIDI1NTsKKyAgICAgIHBEZXN0QnVmWzFdID0gKCgyNTUgLSBwU3JjQnVmWzFdKSAqIGspIC8gMjU1OworICAgICAgcERlc3RCdWZbMl0gPSAoKDI1NSAtIHBTcmNCdWZbMl0pICogaykgLyAyNTU7CisgICAgICBwRGVzdEJ1ZiArPSAzOworICAgICAgcFNyY0J1ZiArPSA0OwogICAgIH0KLSAgICBDUERGX0FycmF5KiBwUmFuZ2VzID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJSYW5nZSIpKTsKLSAgICBtX3BSYW5nZXMgPSBGWF9BbGxvYzJEKEZYX0ZMT0FULCBtX25Db21wb25lbnRzLCAyKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbkNvbXBvbmVudHMgKiAyOyBpICsrKSB7Ci0gICAgICAgIGlmIChwUmFuZ2VzKSB7Ci0gICAgICAgICAgICBtX3BSYW5nZXNbaV0gPSBwUmFuZ2VzLT5HZXROdW1iZXIoaSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaSAlIDIpIHsKLSAgICAgICAgICAgIG1fcFJhbmdlc1tpXSA9IDEuMGY7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX3BSYW5nZXNbaV0gPSAwOwotICAgICAgICB9CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VSR0IpIHsKKyAgICBSZXZlcnNlUkdCKHBEZXN0QnVmLCBwU3JjQnVmLCBwaXhlbHMpOworICB9IGVsc2UgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRUdSQVkpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7CisgICAgICAqcERlc3RCdWYrKyA9IHBTcmNCdWZbaV07CisgICAgICAqcERlc3RCdWYrKyA9IHBTcmNCdWZbaV07CisgICAgICAqcERlc3RCdWYrKyA9IHBTcmNCdWZbaV07CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICB9IGVsc2UgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzOyBpKyspIHsKKyAgICAgIGlmICghbV9kd1N0ZENvbnZlcnNpb24pIHsKKyAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKHBTcmNCdWZbMF0sIHBTcmNCdWZbMV0sIHBTcmNCdWZbMl0sIHBTcmNCdWZbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVzdEJ1ZlsyXSwgcERlc3RCdWZbMV0sIHBEZXN0QnVmWzBdKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQ4X3QgayA9IHBTcmNCdWZbM107CisgICAgICAgIHBEZXN0QnVmWzJdID0gMjU1IC0gc3RkOjptaW4oMjU1LCBwU3JjQnVmWzBdICsgayk7CisgICAgICAgIHBEZXN0QnVmWzFdID0gMjU1IC0gc3RkOjptaW4oMjU1LCBwU3JjQnVmWzFdICsgayk7CisgICAgICAgIHBEZXN0QnVmWzBdID0gMjU1IC0gc3RkOjptaW4oMjU1LCBwU3JjQnVmWzJdICsgayk7CisgICAgICB9CisgICAgICBwU3JjQnVmICs9IDQ7CisgICAgICBwRGVzdEJ1ZiArPSAzOworICAgIH0KKyAgfQogfQotRlhfQk9PTCBDUERGX0lDQ0Jhc2VkQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKLXsKLSAgICBpZiAobV9wUHJvZmlsZSAmJiBtX3BQcm9maWxlLT5tX2JzUkdCKSB7Ci0gICAgICAgIFIgPSBwQnVmWzBdOwotICAgICAgICBHID0gcEJ1ZlsxXTsKLSAgICAgICAgQiA9IHBCdWZbMl07Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBJQ29kZWNfSWNjTW9kdWxlICpwSWNjTW9kdWxlID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICBpZiAobV9wUHJvZmlsZS0+bV9wVHJhbnNmb3JtID09IE5VTEwgfHwgcEljY01vZHVsZSA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChtX3BBbHRlckNTKSB7Ci0gICAgICAgICAgICBtX3BBbHRlckNTLT5HZXRSR0IocEJ1ZiwgUiwgRywgQik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBSID0gRyA9IEIgPSAwLjBmOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBGWF9GTE9BVCByZ2JbM107Ci0gICAgcEljY01vZHVsZS0+U2V0Q29tcG9uZW50cyhtX25Db21wb25lbnRzKTsKLSAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGUobV9wUHJvZmlsZS0+bV9wVHJhbnNmb3JtLCBwQnVmLCByZ2IpOwotICAgIFIgPSByZ2JbMF07Ci0gICAgRyA9IHJnYlsxXTsKLSAgICBCID0gcmdiWzJdOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX0lDQ0Jhc2VkQ1M6OnZfR2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIGMsIEZYX0ZMT0FUJiBtLCBGWF9GTE9BVCYgeSwgRlhfRkxPQVQmIGspIGNvbnN0Ci17Ci0gICAgaWYgKG1fbkNvbXBvbmVudHMgIT0gNCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGMgPSBwQnVmWzBdOwotICAgIG0gPSBwQnVmWzFdOwotICAgIHkgPSBwQnVmWzJdOwotICAgIGsgPSBwQnVmWzNdOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX0lDQ0Jhc2VkQ1M6OlNldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgUiwgRlhfRkxPQVQgRywgRlhfRkxPQVQgQikgY29uc3QKLXsKLSAgICByZXR1cm4gRkFMU0U7Ci19Ci12b2lkIENQREZfSUNDQmFzZWRDUzo6RW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKQotewotICAgIENQREZfQ29sb3JTcGFjZTo6RW5hYmxlU3RkQ29udmVyc2lvbihiRW5hYmxlZCk7Ci0gICAgaWYgKG1fcEFsdGVyQ1MpIHsKLSAgICAgICAgbV9wQWx0ZXJDUy0+RW5hYmxlU3RkQ29udmVyc2lvbihiRW5hYmxlZCk7Ci0gICAgfQotfQotdm9pZCBDUERGX0lDQ0Jhc2VkQ1M6OlRyYW5zbGF0ZUltYWdlTGluZShGWF9MUEJZVEUgcERlc3RCdWYsIEZYX0xQQ0JZVEUgcFNyY0J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBGWF9CT09MIGJUcmFuc01hc2spIGNvbnN0Ci17Ci0gICAgaWYgKG1fcFByb2ZpbGUtPm1fYnNSR0IpIHsKLSAgICAgICAgUmV2ZXJzZVJHQihwRGVzdEJ1ZiwgcFNyY0J1ZiwgcGl4ZWxzKTsKLSAgICB9IGVsc2UgaWYgKG1fcFByb2ZpbGUtPm1fcFRyYW5zZm9ybSkgewotICAgICAgICBpbnQgbk1heENvbG9ycyA9IDE7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uQ29tcG9uZW50czsgaSArKykgewotICAgICAgICAgICAgbk1heENvbG9ycyAqPSA1MjsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9uQ29tcG9uZW50cyA+IDMgfHwgaW1hZ2Vfd2lkdGggKiBpbWFnZV9oZWlnaHQgPCBuTWF4Q29sb3JzICogMyAvIDIpIHsKLSAgICAgICAgICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SWNjTW9kdWxlKCktPlRyYW5zbGF0ZVNjYW5saW5lKG1fcFByb2ZpbGUtPm1fcFRyYW5zZm9ybSwgcERlc3RCdWYsIHBTcmNCdWYsIHBpeGVscyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobV9wQ2FjaGUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICgoQ1BERl9JQ0NCYXNlZENTKil0aGlzKS0+bV9wQ2FjaGUgPSBGWF9BbGxvYzJEKEZYX0JZVEUsIG5NYXhDb2xvcnMsIDMpOwotICAgICAgICAgICAgICAgIEZYX0xQQllURSB0ZW1wX3NyYyA9IEZYX0FsbG9jMkQoRlhfQllURSwgbk1heENvbG9ycywgbV9uQ29tcG9uZW50cyk7Ci0gICAgICAgICAgICAgICAgRlhfTFBCWVRFIHBTcmMgPSB0ZW1wX3NyYzsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5NYXhDb2xvcnM7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IgPSBpOwotICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvcmRlciA9IG5NYXhDb2xvcnMgLyA1MjsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBtX25Db21wb25lbnRzOyBjICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcFNyYysrID0gKEZYX0JZVEUpKGNvbG9yIC8gb3JkZXIgKiA1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yICU9IG9yZGVyOwotICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIgLz0gNTI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRJY2NNb2R1bGUoKS0+VHJhbnNsYXRlU2NhbmxpbmUobV9wUHJvZmlsZS0+bV9wVHJhbnNmb3JtLCBtX3BDYWNoZSwgdGVtcF9zcmMsIG5NYXhDb2xvcnMpOwotICAgICAgICAgICAgICAgIEZYX0ZyZWUodGVtcF9zcmMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHM7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgbV9uQ29tcG9uZW50czsgYyArKykgewotICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4ICogNTIgKyAoKnBTcmNCdWYpIC8gNTsKLSAgICAgICAgICAgICAgICAgICAgcFNyY0J1ZiArKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5kZXggKj0gMzsKLSAgICAgICAgICAgICAgICAqcERlc3RCdWYrKyA9IG1fcENhY2hlW2luZGV4XTsKLSAgICAgICAgICAgICAgICAqcERlc3RCdWYrKyA9IG1fcENhY2hlW2luZGV4ICsgMV07Ci0gICAgICAgICAgICAgICAgKnBEZXN0QnVmKysgPSBtX3BDYWNoZVtpbmRleCArIDJdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtX3BBbHRlckNTKSB7Ci0gICAgICAgIG1fcEFsdGVyQ1MtPlRyYW5zbGF0ZUltYWdlTGluZShwRGVzdEJ1ZiwgcFNyY0J1ZiwgcGl4ZWxzLCBpbWFnZV93aWR0aCwgaW1hZ2VfaGVpZ2h0KTsKLSAgICB9Ci19Ci1jbGFzcyBDUERGX0luZGV4ZWRDUyA6IHB1YmxpYyBDUERGX0NvbG9yU3BhY2UKLXsKLXB1YmxpYzoKLSAgICBDUERGX0luZGV4ZWRDUygpOwotICAgIHZpcnR1YWwgfkNQREZfSW5kZXhlZENTKCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQl2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KTsKLSAgICB2b2lkCQkJCUdldERlZmF1bHRWYWx1ZShpbnQgaUNvbXBvbmVudCwgRlhfRkxPQVQmIG1pbiwgRlhfRkxPQVQmIG1heCkgY29uc3QKLSAgICB7Ci0gICAgICAgIG1pbiA9IDA7Ci0gICAgICAgIG1heCA9IChGWF9GTE9BVCltX01heEluZGV4OwotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3Q7Ci0gICAgdmlydHVhbCBDUERGX0NvbG9yU3BhY2UqCUdldEJhc2VDUygpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9wQmFzZUNTOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQJCUVuYWJsZVN0ZENvbnZlcnNpb24oRlhfQk9PTCBiRW5hYmxlZCk7Ci0gICAgQ1BERl9Db2xvclNwYWNlKgltX3BCYXNlQ1M7Ci0gICAgQ1BERl9Db3VudGVkQ29sb3JTcGFjZSogICAgIG1fcENvdW50ZWRCYXNlQ1M7Ci0gICAgaW50CQkJCQltX25CYXNlQ29tcG9uZW50czsKLSAgICBpbnQJCQkJCW1fTWF4SW5kZXg7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcJCW1fVGFibGU7Ci0gICAgRlhfRkxPQVQqCQltX3BDb21wTWluTWF4OworY29uc3QgdWludDhfdCBnX3NSR0JTYW1wbGVzMVtdID0geworICAgIDAsICAgMywgICA2LCAgIDEwLCAgMTMsICAxNSwgIDE4LCAgMjAsICAyMiwgIDIzLCAgMjUsICAyNywgIDI4LCAgMzAsICAzMSwKKyAgICAzMiwgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgICAgNDgsICA0OSwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTMsICA1MywgIDU0LCAgNTUsICA1NiwgIDU2LCAgNTcsICA1OCwgIDU4LAorICAgIDU5LCAgNjAsICA2MSwgIDYxLCAgNjIsICA2MiwgIDYzLCAgNjQsICA2NCwgIDY1LCAgNjYsICA2NiwgIDY3LCAgNjcsICA2OCwKKyAgICA2OCwgIDY5LCAgNzAsICA3MCwgIDcxLCAgNzEsICA3MiwgIDcyLCAgNzMsICA3MywgIDc0LCAgNzQsICA3NSwgIDc2LCAgNzYsCisgICAgNzcsICA3NywgIDc4LCAgNzgsICA3OSwgIDc5LCAgNzksICA4MCwgIDgwLCAgODEsICA4MSwgIDgyLCAgODIsICA4MywgIDgzLAorICAgIDg0LCAgODQsICA4NSwgIDg1LCAgODUsICA4NiwgIDg2LCAgODcsICA4NywgIDg4LCAgODgsICA4OCwgIDg5LCAgODksICA5MCwKKyAgICA5MCwgIDkxLCAgOTEsICA5MSwgIDkyLCAgOTIsICA5MywgIDkzLCAgOTMsICA5NCwgIDk0LCAgOTUsICA5NSwgIDk1LCAgOTYsCisgICAgOTYsICA5NywgIDk3LCAgOTcsICA5OCwgIDk4LCAgOTgsICA5OSwgIDk5LCAgOTksICAxMDAsIDEwMCwgMTAxLCAxMDEsIDEwMSwKKyAgICAxMDIsIDEwMiwgMTAyLCAxMDMsIDEwMywgMTAzLCAxMDQsIDEwNCwgMTA0LCAxMDUsIDEwNSwgMTA2LCAxMDYsIDEwNiwgMTA3LAorICAgIDEwNywgMTA3LCAxMDgsIDEwOCwgMTA4LCAxMDksIDEwOSwgMTA5LCAxMTAsIDExMCwgMTEwLCAxMTAsIDExMSwgMTExLCAxMTEsCisgICAgMTEyLCAxMTIsIDExMiwgMTEzLCAxMTMsIDExMywgMTE0LCAxMTQsIDExNCwgMTE1LCAxMTUsIDExNSwgMTE1LCAxMTYsIDExNiwKKyAgICAxMTYsIDExNywgMTE3LCAxMTcsIDExOCwgMTE4LCAxMTgsIDExOCwgMTE5LCAxMTksIDExOSwgMTIwLAogfTsKLUNQREZfSW5kZXhlZENTOjpDUERGX0luZGV4ZWRDUygpCi17Ci0gICAgbV9wQmFzZUNTID0gTlVMTDsKLSAgICBtX3BDb3VudGVkQmFzZUNTID0gTlVMTDsKLSAgICBtX0ZhbWlseSA9IFBERkNTX0lOREVYRUQ7Ci0gICAgbV9uQ29tcG9uZW50cyA9IDE7Ci0gICAgbV9wQ29tcE1pbk1heCA9IE5VTEw7Citjb25zdCB1aW50OF90IGdfc1JHQlNhbXBsZXMyW10gPSB7CisgICAgMTIwLCAxMjEsIDEyMiwgMTI0LCAxMjUsIDEyNiwgMTI3LCAxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwKKyAgICAxMzYsIDEzNywgMTM4LCAxMzksIDE0MCwgMTQxLCAxNDIsIDE0MywgMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OCwgMTQ5LAorICAgIDE1MCwgMTUxLCAxNTIsIDE1MywgMTU0LCAxNTUsIDE1NSwgMTU2LCAxNTcsIDE1OCwgMTU5LCAxNTksIDE2MCwgMTYxLCAxNjIsCisgICAgMTYzLCAxNjMsIDE2NCwgMTY1LCAxNjYsIDE2NywgMTY3LCAxNjgsIDE2OSwgMTcwLCAxNzAsIDE3MSwgMTcyLCAxNzMsIDE3MywKKyAgICAxNzQsIDE3NSwgMTc1LCAxNzYsIDE3NywgMTc4LCAxNzgsIDE3OSwgMTgwLCAxODAsIDE4MSwgMTgyLCAxODIsIDE4MywgMTg0LAorICAgIDE4NSwgMTg1LCAxODYsIDE4NywgMTg3LCAxODgsIDE4OSwgMTg5LCAxOTAsIDE5MCwgMTkxLCAxOTIsIDE5MiwgMTkzLCAxOTQsCisgICAgMTk0LCAxOTUsIDE5NiwgMTk2LCAxOTcsIDE5NywgMTk4LCAxOTksIDE5OSwgMjAwLCAyMDAsIDIwMSwgMjAyLCAyMDIsIDIwMywKKyAgICAyMDMsIDIwNCwgMjA1LCAyMDUsIDIwNiwgMjA2LCAyMDcsIDIwOCwgMjA4LCAyMDksIDIwOSwgMjEwLCAyMTAsIDIxMSwgMjEyLAorICAgIDIxMiwgMjEzLCAyMTMsIDIxNCwgMjE0LCAyMTUsIDIxNSwgMjE2LCAyMTYsIDIxNywgMjE4LCAyMTgsIDIxOSwgMjE5LCAyMjAsCisgICAgMjIwLCAyMjEsIDIyMSwgMjIyLCAyMjIsIDIyMywgMjIzLCAyMjQsIDIyNCwgMjI1LCAyMjYsIDIyNiwgMjI3LCAyMjcsIDIyOCwKKyAgICAyMjgsIDIyOSwgMjI5LCAyMzAsIDIzMCwgMjMxLCAyMzEsIDIzMiwgMjMyLCAyMzMsIDIzMywgMjM0LCAyMzQsIDIzNSwgMjM1LAorICAgIDIzNiwgMjM2LCAyMzcsIDIzNywgMjM4LCAyMzgsIDIzOCwgMjM5LCAyMzksIDI0MCwgMjQwLCAyNDEsIDI0MSwgMjQyLCAyNDIsCisgICAgMjQzLCAyNDMsIDI0NCwgMjQ0LCAyNDUsIDI0NSwgMjQ2LCAyNDYsIDI0NiwgMjQ3LCAyNDcsIDI0OCwgMjQ4LCAyNDksIDI0OSwKKyAgICAyNTAsIDI1MCwgMjUxLCAyNTEsIDI1MSwgMjUyLCAyNTIsIDI1MywgMjUzLCAyNTQsIDI1NCwgMjU1LCAyNTUsCit9OworCitzdGF0aWMgRlhfRkxPQVQgUkdCX0NvbnZlcnNpb24oRlhfRkxPQVQgY29sb3JDb21wb25lbnQpIHsKKyAgaWYgKGNvbG9yQ29tcG9uZW50ID4gMSkgeworICAgIGNvbG9yQ29tcG9uZW50ID0gMTsKKyAgfQorICBpZiAoY29sb3JDb21wb25lbnQgPCAwKSB7CisgICAgY29sb3JDb21wb25lbnQgPSAwOworICB9CisgIGludCBzY2FsZSA9IChpbnQpKGNvbG9yQ29tcG9uZW50ICogMTAyMyk7CisgIGlmIChzY2FsZSA8IDApIHsKKyAgICBzY2FsZSA9IDA7CisgIH0KKyAgaWYgKHNjYWxlIDwgMTkyKSB7CisgICAgY29sb3JDb21wb25lbnQgPSAoZ19zUkdCU2FtcGxlczFbc2NhbGVdIC8gMjU1LjBmKTsKKyAgfSBlbHNlIHsKKyAgICBjb2xvckNvbXBvbmVudCA9IChnX3NSR0JTYW1wbGVzMltzY2FsZSAvIDQgLSA0OF0gLyAyNTUuMGYpOworICB9CisgIHJldHVybiBjb2xvckNvbXBvbmVudDsKIH0KLUNQREZfSW5kZXhlZENTOjp+Q1BERl9JbmRleGVkQ1MoKQotewotICAgIGlmIChtX3BDb21wTWluTWF4KSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wQ29tcE1pbk1heCk7Ci0gICAgfQotICAgIENQREZfQ29sb3JTcGFjZSogcENTID0gbV9wQ291bnRlZEJhc2VDUyA/IG1fcENvdW50ZWRCYXNlQ1MtPm1fT2JqIDogTlVMTDsKLSAgICBpZiAocENTICYmIG1fcERvY3VtZW50KSB7Ci0gICAgICAgIG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlQ29sb3JTcGFjZShwQ1MtPkdldEFycmF5KCkpOwotICAgIH0KKworc3RhdGljIHZvaWQgWFlaX3RvX3NSR0IoRlhfRkxPQVQgWCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIFksCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBaLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgRywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBCKSB7CisgIEZYX0ZMT0FUIFIxID0gMy4yNDEwZiAqIFggLSAxLjUzNzRmICogWSAtIDAuNDk4NmYgKiBaOworICBGWF9GTE9BVCBHMSA9IC0wLjk2OTJmICogWCArIDEuODc2MGYgKiBZICsgMC4wNDE2ZiAqIFo7CisgIEZYX0ZMT0FUIEIxID0gMC4wNTU2ZiAqIFggLSAwLjIwNDBmICogWSArIDEuMDU3MGYgKiBaOworCisgIFIgPSBSR0JfQ29udmVyc2lvbihSMSk7CisgIEcgPSBSR0JfQ29udmVyc2lvbihHMSk7CisgIEIgPSBSR0JfQ29udmVyc2lvbihCMSk7CiB9Ci1GWF9CT09MIENQREZfSW5kZXhlZENTOjp2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KQotewotICAgIGlmIChwQXJyYXktPkdldENvdW50KCkgPCA0KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKworc3RhdGljIHZvaWQgWFlaX3RvX3NSR0JfV2hpdGVQb2ludChGWF9GTE9BVCBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBaLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBYdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgWXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIFp3KSB7CisgIC8vIFRoZSBmb2xsb3dpbmcgUkdCX3h5eiBpcyBiYXNlZCBvbgorICAvLyBzUkdCIHZhbHVlIHtSeCxSeX09ezAuNjQsIDAuMzN9LCB7R3gsR3l9PXswLjMwLCAwLjYwfSwge0J4LEJ5fT17MC4xNSwgMC4wNn0KKworICBGWF9GTE9BVCBSeCA9IDAuNjRmLCBSeSA9IDAuMzNmOworICBGWF9GTE9BVCBHeCA9IDAuMzBmLCBHeSA9IDAuNjBmOworICBGWF9GTE9BVCBCeCA9IDAuMTVmLCBCeSA9IDAuMDZmOworICBDRlhfTWF0cml4XzNieTMgUkdCX3h5eihSeCwgR3gsIEJ4LCBSeSwgR3ksIEJ5LCAxIC0gUnggLSBSeSwgMSAtIEd4IC0gR3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBCeCAtIEJ5KTsKKyAgQ0ZYX1ZlY3Rvcl8zYnkxIHdoaXRlUG9pbnQoWHcsIFl3LCBadyk7CisgIENGWF9WZWN0b3JfM2J5MSBYWVooWCwgWSwgWik7CisKKyAgQ0ZYX1ZlY3Rvcl8zYnkxIFJHQl9TdW1fWFlaID0gUkdCX3h5ei5JbnZlcnNlKCkuVHJhbnNmb3JtVmVjdG9yKHdoaXRlUG9pbnQpOworICBDRlhfTWF0cml4XzNieTMgUkdCX1NVTV9YWVpfRElBRyhSR0JfU3VtX1hZWi5hLCAwLCAwLCAwLCBSR0JfU3VtX1hZWi5iLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBSR0JfU3VtX1hZWi5jKTsKKyAgQ0ZYX01hdHJpeF8zYnkzIE0gPSBSR0JfeHl6Lk11bHRpcGx5KFJHQl9TVU1fWFlaX0RJQUcpOworICBDRlhfVmVjdG9yXzNieTEgUkdCID0gTS5JbnZlcnNlKCkuVHJhbnNmb3JtVmVjdG9yKFhZWik7CisKKyAgUiA9IFJHQl9Db252ZXJzaW9uKFJHQi5hKTsKKyAgRyA9IFJHQl9Db252ZXJzaW9uKFJHQi5iKTsKKyAgQiA9IFJHQl9Db252ZXJzaW9uKFJHQi5jKTsKK30KK2NsYXNzIENQREZfQ2FsR3JheSA6IHB1YmxpYyBDUERGX0NvbG9yU3BhY2UgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1BERl9DYWxHcmF5KENQREZfRG9jdW1lbnQqIHBEb2MpCisgICAgICA6IENQREZfQ29sb3JTcGFjZShwRG9jLCBQREZDU19DQUxHUkFZLCAxKSB7fQorICBGWF9CT09MIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOworICBGWF9CT09MIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBHLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7CisgIEZYX0JPT0wgU2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBSLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBHLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBCKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBUcmFuc2xhdGVJbWFnZUxpbmUodWludDhfdCogcERlc3RCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBTcmNCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJhbnNNYXNrID0gRkFMU0UpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgRlhfRkxPQVQgbV9XaGl0ZVBvaW50WzNdOworICBGWF9GTE9BVCBtX0JsYWNrUG9pbnRbM107CisgIEZYX0ZMT0FUIG1fR2FtbWE7Cit9OworCitGWF9CT09MIENQREZfQ2FsR3JheTo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgeworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcEFycmF5LT5HZXREaWN0KDEpOworICBpZiAoIXBEaWN0KQorICAgIHJldHVybiBGQUxTRTsKKworICBDUERGX0FycmF5KiBwUGFyYW0gPSBwRGljdC0+R2V0QXJyYXkoIldoaXRlUG9pbnQiKTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICBtX1doaXRlUG9pbnRbaV0gPSBwUGFyYW0gPyBwUGFyYW0tPkdldE51bWJlcihpKSA6IDA7CisgIH0KKyAgcFBhcmFtID0gcERpY3QtPkdldEFycmF5KCJCbGFja1BvaW50Iik7CisgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICBtX0JsYWNrUG9pbnRbaV0gPSBwUGFyYW0gPyBwUGFyYW0tPkdldE51bWJlcihpKSA6IDA7CisgIH0KKyAgbV9HYW1tYSA9IHBEaWN0LT5HZXROdW1iZXIoIkdhbW1hIik7CisgIGlmIChtX0dhbW1hID09IDApIHsKKyAgICBtX0dhbW1hID0gMS4wZjsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9DYWxHcmF5OjpHZXRSR0IoRlhfRkxPQVQqIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEIpIGNvbnN0IHsKKyAgUiA9IEcgPSBCID0gKnBCdWY7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUERGX0NhbEdyYXk6OlNldFJHQihGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgQikgY29uc3QgeworICBpZiAoUiA9PSBHICYmIFIgPT0gQikgeworICAgICpwQnVmID0gUjsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9Cit2b2lkIENQREZfQ2FsR3JheTo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwU3JjQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2Vfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRyYW5zTWFzaykgY29uc3QgeworICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7CisgICAgKnBEZXN0QnVmKysgPSBwU3JjQnVmW2ldOworICAgICpwRGVzdEJ1ZisrID0gcFNyY0J1ZltpXTsKKyAgICAqcERlc3RCdWYrKyA9IHBTcmNCdWZbaV07CisgIH0KK30KK2NsYXNzIENQREZfQ2FsUkdCIDogcHVibGljIENQREZfQ29sb3JTcGFjZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDUERGX0NhbFJHQihDUERGX0RvY3VtZW50KiBwRG9jKQorICAgICAgOiBDUERGX0NvbG9yU3BhY2UocERvYywgUERGQ1NfQ0FMUkdCLCAzKSB7fQorICBGWF9CT09MIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOworICBGWF9CT09MIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBHLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7CisgIEZYX0JPT0wgU2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBSLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBHLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBCKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBUcmFuc2xhdGVJbWFnZUxpbmUodWludDhfdCogcERlc3RCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBTcmNCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJhbnNNYXNrID0gRkFMU0UpIGNvbnN0IG92ZXJyaWRlOworCisgIEZYX0ZMT0FUIG1fV2hpdGVQb2ludFszXTsKKyAgRlhfRkxPQVQgbV9CbGFja1BvaW50WzNdOworICBGWF9GTE9BVCBtX0dhbW1hWzNdOworICBGWF9GTE9BVCBtX01hdHJpeFs5XTsKKyAgRlhfQk9PTCBtX2JHYW1tYTsKKyAgRlhfQk9PTCBtX2JNYXRyaXg7Cit9OworRlhfQk9PTCBDUERGX0NhbFJHQjo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgeworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcEFycmF5LT5HZXREaWN0KDEpOworICBpZiAoIXBEaWN0KQorICAgIHJldHVybiBGQUxTRTsKKworICBDUERGX0FycmF5KiBwUGFyYW0gPSBwRGljdC0+R2V0QXJyYXkoIldoaXRlUG9pbnQiKTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICBtX1doaXRlUG9pbnRbaV0gPSBwUGFyYW0gPyBwUGFyYW0tPkdldE51bWJlcihpKSA6IDA7CisgIH0KKyAgcFBhcmFtID0gcERpY3QtPkdldEFycmF5KCJCbGFja1BvaW50Iik7CisgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICBtX0JsYWNrUG9pbnRbaV0gPSBwUGFyYW0gPyBwUGFyYW0tPkdldE51bWJlcihpKSA6IDA7CisgIH0KKyAgcFBhcmFtID0gcERpY3QtPkdldEFycmF5KCJHYW1tYSIpOworICBpZiAocFBhcmFtKSB7CisgICAgbV9iR2FtbWEgPSBUUlVFOworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgIG1fR2FtbWFbaV0gPSBwUGFyYW0tPkdldE51bWJlcihpKTsKICAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBCYXNlT2JqID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMSk7Ci0gICAgaWYgKHBCYXNlT2JqID09IG1fcEFycmF5KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgfSBlbHNlIHsKKyAgICBtX2JHYW1tYSA9IEZBTFNFOworICB9CisgIHBQYXJhbSA9IHBEaWN0LT5HZXRBcnJheSgiTWF0cml4Iik7CisgIGlmIChwUGFyYW0pIHsKKyAgICBtX2JNYXRyaXggPSBUUlVFOworICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspIHsKKyAgICAgIG1fTWF0cml4W2ldID0gcFBhcmFtLT5HZXROdW1iZXIoaSk7CiAgICAgfQotICAgIENQREZfRG9jUGFnZURhdGEqIHBEb2NQYWdlRGF0YSA9IHBEb2MtPkdldFBhZ2VEYXRhKCk7Ci0gICAgbV9wQmFzZUNTID0gcERvY1BhZ2VEYXRhLT5HZXRDb2xvclNwYWNlKHBCYXNlT2JqLCBOVUxMKTsKLSAgICBpZiAobV9wQmFzZUNTID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICB9IGVsc2UgeworICAgIG1fYk1hdHJpeCA9IEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUERGX0NhbFJHQjo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBCKSBjb25zdCB7CisgIEZYX0ZMT0FUIEFfID0gcEJ1ZlswXTsKKyAgRlhfRkxPQVQgQl8gPSBwQnVmWzFdOworICBGWF9GTE9BVCBDXyA9IHBCdWZbMl07CisgIGlmIChtX2JHYW1tYSkgeworICAgIEFfID0gKEZYX0ZMT0FUKUZYU1lTX3BvdyhBXywgbV9HYW1tYVswXSk7CisgICAgQl8gPSAoRlhfRkxPQVQpRlhTWVNfcG93KEJfLCBtX0dhbW1hWzFdKTsKKyAgICBDXyA9IChGWF9GTE9BVClGWFNZU19wb3coQ18sIG1fR2FtbWFbMl0pOworICB9CisgIEZYX0ZMT0FUIFgsIFksIFo7CisgIGlmIChtX2JNYXRyaXgpIHsKKyAgICBYID0gbV9NYXRyaXhbMF0gKiBBXyArIG1fTWF0cml4WzNdICogQl8gKyBtX01hdHJpeFs2XSAqIENfOworICAgIFkgPSBtX01hdHJpeFsxXSAqIEFfICsgbV9NYXRyaXhbNF0gKiBCXyArIG1fTWF0cml4WzddICogQ187CisgICAgWiA9IG1fTWF0cml4WzJdICogQV8gKyBtX01hdHJpeFs1XSAqIEJfICsgbV9NYXRyaXhbOF0gKiBDXzsKKyAgfSBlbHNlIHsKKyAgICBYID0gQV87CisgICAgWSA9IEJfOworICAgIFogPSBDXzsKKyAgfQorICBYWVpfdG9fc1JHQl9XaGl0ZVBvaW50KFgsIFksIFosIFIsIEcsIEIsIG1fV2hpdGVQb2ludFswXSwgbV9XaGl0ZVBvaW50WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1fV2hpdGVQb2ludFsyXSk7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUERGX0NhbFJHQjo6U2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBCKSBjb25zdCB7CisgIHBCdWZbMF0gPSBSOworICBwQnVmWzFdID0gRzsKKyAgcEJ1ZlsyXSA9IEI7CisgIHJldHVybiBUUlVFOworfQordm9pZCBDUERGX0NhbFJHQjo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBTcmNCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2Vfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUcmFuc01hc2spIGNvbnN0IHsKKyAgaWYgKGJUcmFuc01hc2spIHsKKyAgICBGWF9GTE9BVCBDYWxbM107CisgICAgRlhfRkxPQVQgUiwgRywgQjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7CisgICAgICBDYWxbMF0gPSAoKEZYX0ZMT0FUKXBTcmNCdWZbMl0pIC8gMjU1OworICAgICAgQ2FsWzFdID0gKChGWF9GTE9BVClwU3JjQnVmWzFdKSAvIDI1NTsKKyAgICAgIENhbFsyXSA9ICgoRlhfRkxPQVQpcFNyY0J1ZlswXSkgLyAyNTU7CisgICAgICBHZXRSR0IoQ2FsLCBSLCBHLCBCKTsKKyAgICAgIHBEZXN0QnVmWzBdID0gRlhTWVNfcm91bmQoQiAqIDI1NSk7CisgICAgICBwRGVzdEJ1ZlsxXSA9IEZYU1lTX3JvdW5kKEcgKiAyNTUpOworICAgICAgcERlc3RCdWZbMl0gPSBGWFNZU19yb3VuZChSICogMjU1KTsKKyAgICAgIHBTcmNCdWYgKz0gMzsKKyAgICAgIHBEZXN0QnVmICs9IDM7CisgICAgfQorICB9CisgIFJldmVyc2VSR0IocERlc3RCdWYsIHBTcmNCdWYsIHBpeGVscyk7Cit9CitjbGFzcyBDUERGX0xhYkNTIDogcHVibGljIENQREZfQ29sb3JTcGFjZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDUERGX0xhYkNTKENQREZfRG9jdW1lbnQqIHBEb2MpCisgICAgICA6IENQREZfQ29sb3JTcGFjZShwRG9jLCBQREZDU19MQUIsIDMpIHt9CisgIHZvaWQgR2V0RGVmYXVsdFZhbHVlKGludCBpQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBtaW4sCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBtYXgpIGNvbnN0IG92ZXJyaWRlOworICBGWF9CT09MIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOworICBGWF9CT09MIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBHLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7CisgIEZYX0JPT0wgU2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBSLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBHLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBCKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBUcmFuc2xhdGVJbWFnZUxpbmUodWludDhfdCogcERlc3RCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBTcmNCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJhbnNNYXNrID0gRkFMU0UpIGNvbnN0IG92ZXJyaWRlOworCisgIEZYX0ZMT0FUIG1fV2hpdGVQb2ludFszXTsKKyAgRlhfRkxPQVQgbV9CbGFja1BvaW50WzNdOworICBGWF9GTE9BVCBtX1Jhbmdlc1s0XTsKK307CitGWF9CT09MIENQREZfTGFiQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBBcnJheS0+R2V0RGljdCgxKTsKKyAgaWYgKCFwRGljdCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDUERGX0FycmF5KiBwUGFyYW0gPSBwRGljdC0+R2V0QXJyYXkoIldoaXRlUG9pbnQiKTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICBtX1doaXRlUG9pbnRbaV0gPSBwUGFyYW0gPyBwUGFyYW0tPkdldE51bWJlcihpKSA6IDA7CisgIH0KKyAgcFBhcmFtID0gcERpY3QtPkdldEFycmF5KCJCbGFja1BvaW50Iik7CisgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICBtX0JsYWNrUG9pbnRbaV0gPSBwUGFyYW0gPyBwUGFyYW0tPkdldE51bWJlcihpKSA6IDA7CisgIH0KKyAgcFBhcmFtID0gcERpY3QtPkdldEFycmF5KCJSYW5nZSIpOworICBjb25zdCBGWF9GTE9BVCBkZWZfcmFuZ2VzWzRdID0gey0xMDAgKiAxLjBmLCAxMDAgKiAxLjBmLCAtMTAwICogMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAgKiAxLjBmfTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgIG1fUmFuZ2VzW2ldID0gcFBhcmFtID8gcFBhcmFtLT5HZXROdW1iZXIoaSkgOiBkZWZfcmFuZ2VzW2ldOworICB9CisgIHJldHVybiBUUlVFOworfQordm9pZCBDUERGX0xhYkNTOjpHZXREZWZhdWx0VmFsdWUoaW50IGlDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIG1heCkgY29uc3QgeworICBhc3NlcnQoaUNvbXBvbmVudCA8IDMpOworICB2YWx1ZSA9IDA7CisgIGlmIChpQ29tcG9uZW50ID09IDApIHsKKyAgICBtaW4gPSAwOworICAgIG1heCA9IDEwMCAqIDEuMGY7CisgIH0gZWxzZSB7CisgICAgbWluID0gbV9SYW5nZXNbaUNvbXBvbmVudCAqIDIgLSAyXTsKKyAgICBtYXggPSBtX1Jhbmdlc1tpQ29tcG9uZW50ICogMiAtIDFdOworICAgIGlmICh2YWx1ZSA8IG1pbikgeworICAgICAgdmFsdWUgPSBtaW47CisgICAgfSBlbHNlIGlmICh2YWx1ZSA+IG1heCkgeworICAgICAgdmFsdWUgPSBtYXg7CisgICAgfQorICB9Cit9CitGWF9CT09MIENQREZfTGFiQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQikgY29uc3QgeworICBGWF9GTE9BVCBMc3RhciA9IHBCdWZbMF07CisgIEZYX0ZMT0FUIGFzdGFyID0gcEJ1ZlsxXTsKKyAgRlhfRkxPQVQgYnN0YXIgPSBwQnVmWzJdOworICBGWF9GTE9BVCBNID0gKExzdGFyICsgMTYuMGYpIC8gMTE2LjBmOworICBGWF9GTE9BVCBMID0gTSArIGFzdGFyIC8gNTAwLjBmOworICBGWF9GTE9BVCBOID0gTSAtIGJzdGFyIC8gMjAwLjBmOworICBGWF9GTE9BVCBYLCBZLCBaOworICBpZiAoTCA8IDAuMjA2OWYpIHsKKyAgICBYID0gMC45NTdmICogMC4xMjg0MmYgKiAoTCAtIDAuMTM3OWYpOworICB9IGVsc2UgeworICAgIFggPSAwLjk1N2YgKiBMICogTCAqIEw7CisgIH0KKyAgaWYgKE0gPCAwLjIwNjlmKSB7CisgICAgWSA9IDAuMTI4NDJmICogKE0gLSAwLjEzNzlmKTsKKyAgfSBlbHNlIHsKKyAgICBZID0gTSAqIE0gKiBNOworICB9CisgIGlmIChOIDwgMC4yMDY5ZikgeworICAgIFogPSAxLjA4ODlmICogMC4xMjg0MmYgKiAoTiAtIDAuMTM3OWYpOworICB9IGVsc2UgeworICAgIFogPSAxLjA4ODlmICogTiAqIE4gKiBOOworICB9CisgIFhZWl90b19zUkdCKFgsIFksIFosIFIsIEcsIEIpOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9MYWJDUzo6U2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBCKSBjb25zdCB7CisgIHJldHVybiBGQUxTRTsKK30KK3ZvaWQgQ1BERl9MYWJDUzo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFNyY0J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2Vfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJhbnNNYXNrKSBjb25zdCB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzOyBpKyspIHsKKyAgICBGWF9GTE9BVCBsYWJbM107CisgICAgRlhfRkxPQVQgUiwgRywgQjsKKyAgICBsYWJbMF0gPSAocFNyY0J1ZlswXSAqIDEwMCAvIDI1NS4wZik7CisgICAgbGFiWzFdID0gKEZYX0ZMT0FUKShwU3JjQnVmWzFdIC0gMTI4KTsKKyAgICBsYWJbMl0gPSAoRlhfRkxPQVQpKHBTcmNCdWZbMl0gLSAxMjgpOworICAgIEdldFJHQihsYWIsIFIsIEcsIEIpOworICAgIHBEZXN0QnVmWzBdID0gKGludDMyX3QpKEIgKiAyNTUpOworICAgIHBEZXN0QnVmWzFdID0gKGludDMyX3QpKEcgKiAyNTUpOworICAgIHBEZXN0QnVmWzJdID0gKGludDMyX3QpKFIgKiAyNTUpOworICAgIHBEZXN0QnVmICs9IDM7CisgICAgcFNyY0J1ZiArPSAzOworICB9Cit9CitDUERGX0ljY1Byb2ZpbGU6OkNQREZfSWNjUHJvZmlsZShjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgZHdTaXplKQorICAgIDogbV9ic1JHQihGQUxTRSksIG1fcFRyYW5zZm9ybShOVUxMKSwgbV9uU3JjQ29tcG9uZW50cygwKSB7CisgIGlmIChkd1NpemUgPT0gMzE0NCAmJgorICAgICAgRlhTWVNfbWVtY21wKHBEYXRhICsgMHgxOTAsICJzUkdCIElFQzYxOTY2LTIuMSIsIDE3KSA9PSAwKSB7CisgICAgbV9ic1JHQiA9IFRSVUU7CisgICAgbV9uU3JjQ29tcG9uZW50cyA9IDM7CisgIH0gZWxzZSBpZiAoQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRJY2NNb2R1bGUoKSkgeworICAgIG1fcFRyYW5zZm9ybSA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SWNjTW9kdWxlKCktPkNyZWF0ZVRyYW5zZm9ybV9zUkdCKAorICAgICAgICBwRGF0YSwgZHdTaXplLCBtX25TcmNDb21wb25lbnRzKTsKKyAgfQorfQorQ1BERl9JY2NQcm9maWxlOjp+Q1BERl9JY2NQcm9maWxlKCkgeworICBpZiAobV9wVHJhbnNmb3JtKSB7CisgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRJY2NNb2R1bGUoKS0+RGVzdHJveVRyYW5zZm9ybShtX3BUcmFuc2Zvcm0pOworICB9Cit9CitjbGFzcyBDUERGX0lDQ0Jhc2VkQ1MgOiBwdWJsaWMgQ1BERl9Db2xvclNwYWNlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENQREZfSUNDQmFzZWRDUyhDUERGX0RvY3VtZW50KiBwRG9jKQorICAgICAgOiBDUERGX0NvbG9yU3BhY2UocERvYywgUERGQ1NfSUNDQkFTRUQsIDApLAorICAgICAgICBtX3BBbHRlckNTKG51bGxwdHIpLAorICAgICAgICBtX3BQcm9maWxlKG51bGxwdHIpLAorICAgICAgICBtX3BDYWNoZShudWxscHRyKSwKKyAgICAgICAgbV9wUmFuZ2VzKG51bGxwdHIpLAorICAgICAgICBtX2JPd24oRkFMU0UpIHt9CisgIH5DUERGX0lDQ0Jhc2VkQ1MoKSBvdmVycmlkZTsKKworICBGWF9CT09MIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOworICBGWF9CT09MIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBHLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7CisgIEZYX0JPT0wgU2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBSLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBHLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBCKSBjb25zdCBvdmVycmlkZTsKKyAgRlhfQk9PTCB2X0dldENNWUsoRlhfRkxPQVQqIHBCdWYsCisgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBjLAorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbSwKKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHksCisgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBrKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBFbmFibGVTdGRDb252ZXJzaW9uKEZYX0JPT0wgYkVuYWJsZWQpIG92ZXJyaWRlOworICB2b2lkIFRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFNyY0J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUcmFuc01hc2sgPSBGQUxTRSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgQ1BERl9Db2xvclNwYWNlKiBtX3BBbHRlckNTOworICBDUERGX0ljY1Byb2ZpbGUqIG1fcFByb2ZpbGU7CisgIHVpbnQ4X3QqIG1fcENhY2hlOworICBGWF9GTE9BVCogbV9wUmFuZ2VzOworICBGWF9CT09MIG1fYk93bjsKK307CisKK0NQREZfSUNDQmFzZWRDUzo6fkNQREZfSUNDQmFzZWRDUygpIHsKKyAgRlhfRnJlZShtX3BDYWNoZSk7CisgIEZYX0ZyZWUobV9wUmFuZ2VzKTsKKyAgaWYgKG1fcEFsdGVyQ1MgJiYgbV9iT3duKSB7CisgICAgbV9wQWx0ZXJDUy0+UmVsZWFzZUNTKCk7CisgIH0KKyAgaWYgKG1fcFByb2ZpbGUgJiYgbV9wRG9jdW1lbnQpIHsKKyAgICBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+UmVsZWFzZUljY1Byb2ZpbGUobV9wUHJvZmlsZSk7CisgIH0KK30KKworRlhfQk9PTCBDUERGX0lDQ0Jhc2VkQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIHsKKyAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwQXJyYXktPkdldFN0cmVhbSgxKTsKKyAgaWYgKCFwU3RyZWFtKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fcFByb2ZpbGUgPSBwRG9jLT5Mb2FkSWNjUHJvZmlsZShwU3RyZWFtKTsKKyAgaWYgKCFtX3BQcm9maWxlKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fbkNvbXBvbmVudHMgPQorICAgICAgbV9wUHJvZmlsZQorICAgICAgICAgIC0+R2V0Q29tcG9uZW50cygpOyAgLy8gVHJ5IHVzaW5nIHRoZSBuQ29tcG9uZW50cyBmcm9tIElDQyBwcm9maWxlCisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7CisgIGlmICghbV9wUHJvZmlsZS0+bV9wVHJhbnNmb3JtKSB7ICAvLyBObyB2YWxpZCBJQ0MgcHJvZmlsZSBvciB1c2luZyBzUkdCCisgICAgQ1BERl9PYmplY3QqIHBBbHRlckNTT2JqID0KKyAgICAgICAgcERpY3QgPyBwRGljdC0+R2V0RWxlbWVudFZhbHVlKCJBbHRlcm5hdGUiKSA6IE5VTEw7CisgICAgaWYgKHBBbHRlckNTT2JqKSB7CisgICAgICBDUERGX0NvbG9yU3BhY2UqIHBBbHRlckNTID0gQ1BERl9Db2xvclNwYWNlOjpMb2FkKHBEb2MsIHBBbHRlckNTT2JqKTsKKyAgICAgIGlmIChwQWx0ZXJDUykgeworICAgICAgICBpZiAobV9uQ29tcG9uZW50cyA9PSAwKSB7ICAgICAgICAgICAgICAgICAvLyBOTyB2YWxpZCBJQ0MgcHJvZmlsZQorICAgICAgICAgIGlmIChwQWx0ZXJDUy0+Q291bnRDb21wb25lbnRzKCkgPiAwKSB7ICAvLyBVc2UgQWx0ZXJuYXRpdmUgY29sb3JzcGFjZQorICAgICAgICAgICAgbV9uQ29tcG9uZW50cyA9IHBBbHRlckNTLT5Db3VudENvbXBvbmVudHMoKTsKKyAgICAgICAgICAgIG1fcEFsdGVyQ1MgPSBwQWx0ZXJDUzsKKyAgICAgICAgICAgIG1fYk93biA9IFRSVUU7CisgICAgICAgICAgfSBlbHNlIHsgIC8vIE5vIHZhbGlkIGFsdGVybmF0aXZlIGNvbG9yc3BhY2UKKyAgICAgICAgICAgIHBBbHRlckNTLT5SZWxlYXNlQ1MoKTsKKyAgICAgICAgICAgIGludDMyX3QgbkRpY3RDb21wb25lbnRzID0gcERpY3QgPyBwRGljdC0+R2V0SW50ZWdlcigiTiIpIDogMDsKKyAgICAgICAgICAgIGlmIChuRGljdENvbXBvbmVudHMgIT0gMSAmJiBuRGljdENvbXBvbmVudHMgIT0gMyAmJgorICAgICAgICAgICAgICAgIG5EaWN0Q29tcG9uZW50cyAhPSA0KSB7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fbkNvbXBvbmVudHMgPSBuRGljdENvbXBvbmVudHM7CisgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7ICAvLyBVc2luZyBzUkdCCisgICAgICAgICAgaWYgKHBBbHRlckNTLT5Db3VudENvbXBvbmVudHMoKSAhPSBtX25Db21wb25lbnRzKSB7CisgICAgICAgICAgICBwQWx0ZXJDUy0+UmVsZWFzZUNTKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1fcEFsdGVyQ1MgPSBwQWx0ZXJDUzsKKyAgICAgICAgICAgIG1fYk93biA9IFRSVUU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmICghbV9wQWx0ZXJDUykgeworICAgICAgaWYgKG1fbkNvbXBvbmVudHMgPT0gMSkgeworICAgICAgICBtX3BBbHRlckNTID0gR2V0U3RvY2tDUyhQREZDU19ERVZJQ0VHUkFZKTsKKyAgICAgIH0gZWxzZSBpZiAobV9uQ29tcG9uZW50cyA9PSAzKSB7CisgICAgICAgIG1fcEFsdGVyQ1MgPSBHZXRTdG9ja0NTKFBERkNTX0RFVklDRVJHQik7CisgICAgICB9IGVsc2UgaWYgKG1fbkNvbXBvbmVudHMgPT0gNCkgeworICAgICAgICBtX3BBbHRlckNTID0gR2V0U3RvY2tDUyhQREZDU19ERVZJQ0VDTVlLKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgQ1BERl9BcnJheSogcFJhbmdlcyA9IHBEaWN0LT5HZXRBcnJheSgiUmFuZ2UiKTsKKyAgbV9wUmFuZ2VzID0gRlhfQWxsb2MyRChGWF9GTE9BVCwgbV9uQ29tcG9uZW50cywgMik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uQ29tcG9uZW50cyAqIDI7IGkrKykgeworICAgIGlmIChwUmFuZ2VzKSB7CisgICAgICBtX3BSYW5nZXNbaV0gPSBwUmFuZ2VzLT5HZXROdW1iZXIoaSk7CisgICAgfSBlbHNlIGlmIChpICUgMikgeworICAgICAgbV9wUmFuZ2VzW2ldID0gMS4wZjsKKyAgICB9IGVsc2UgeworICAgICAgbV9wUmFuZ2VzW2ldID0gMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENQREZfSUNDQmFzZWRDUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBCKSBjb25zdCB7CisgIGlmIChtX3BQcm9maWxlICYmIG1fcFByb2ZpbGUtPm1fYnNSR0IpIHsKKyAgICBSID0gcEJ1ZlswXTsKKyAgICBHID0gcEJ1ZlsxXTsKKyAgICBCID0gcEJ1ZlsyXTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRJY2NNb2R1bGUoKTsKKyAgaWYgKCFtX3BQcm9maWxlLT5tX3BUcmFuc2Zvcm0gfHwgIXBJY2NNb2R1bGUpIHsKKyAgICBpZiAobV9wQWx0ZXJDUykgeworICAgICAgcmV0dXJuIG1fcEFsdGVyQ1MtPkdldFJHQihwQnVmLCBSLCBHLCBCKTsKKyAgICB9CisgICAgUiA9IEcgPSBCID0gMC4wZjsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBGWF9GTE9BVCByZ2JbM107CisgIHBJY2NNb2R1bGUtPlNldENvbXBvbmVudHMobV9uQ29tcG9uZW50cyk7CisgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZShtX3BQcm9maWxlLT5tX3BUcmFuc2Zvcm0sIHBCdWYsIHJnYik7CisgIFIgPSByZ2JbMF07CisgIEcgPSByZ2JbMV07CisgIEIgPSByZ2JbMl07CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUERGX0lDQ0Jhc2VkQ1M6OnZfR2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGspIGNvbnN0IHsKKyAgaWYgKG1fbkNvbXBvbmVudHMgIT0gNCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBjID0gcEJ1ZlswXTsKKyAgbSA9IHBCdWZbMV07CisgIHkgPSBwQnVmWzJdOworICBrID0gcEJ1ZlszXTsKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENQREZfSUNDQmFzZWRDUzo6U2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBCKSBjb25zdCB7CisgIHJldHVybiBGQUxTRTsKK30KK3ZvaWQgQ1BERl9JQ0NCYXNlZENTOjpFbmFibGVTdGRDb252ZXJzaW9uKEZYX0JPT0wgYkVuYWJsZWQpIHsKKyAgQ1BERl9Db2xvclNwYWNlOjpFbmFibGVTdGRDb252ZXJzaW9uKGJFbmFibGVkKTsKKyAgaWYgKG1fcEFsdGVyQ1MpIHsKKyAgICBtX3BBbHRlckNTLT5FbmFibGVTdGRDb252ZXJzaW9uKGJFbmFibGVkKTsKKyAgfQorfQordm9pZCBDUERGX0lDQ0Jhc2VkQ1M6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFNyY0J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUcmFuc01hc2spIGNvbnN0IHsKKyAgaWYgKG1fcFByb2ZpbGUtPm1fYnNSR0IpIHsKKyAgICBSZXZlcnNlUkdCKHBEZXN0QnVmLCBwU3JjQnVmLCBwaXhlbHMpOworICB9IGVsc2UgaWYgKG1fcFByb2ZpbGUtPm1fcFRyYW5zZm9ybSkgeworICAgIGludCBuTWF4Q29sb3JzID0gMTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbkNvbXBvbmVudHM7IGkrKykgeworICAgICAgbk1heENvbG9ycyAqPSA1MjsKKyAgICB9CisgICAgaWYgKG1fbkNvbXBvbmVudHMgPiAzIHx8IGltYWdlX3dpZHRoICogaW1hZ2VfaGVpZ2h0IDwgbk1heENvbG9ycyAqIDMgLyAyKSB7CisgICAgICBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEljY01vZHVsZSgpLT5UcmFuc2xhdGVTY2FubGluZSgKKyAgICAgICAgICBtX3BQcm9maWxlLT5tX3BUcmFuc2Zvcm0sIHBEZXN0QnVmLCBwU3JjQnVmLCBwaXhlbHMpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIW1fcENhY2hlKSB7CisgICAgICAgICgoQ1BERl9JQ0NCYXNlZENTKil0aGlzKS0+bV9wQ2FjaGUgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIG5NYXhDb2xvcnMsIDMpOworICAgICAgICB1aW50OF90KiB0ZW1wX3NyYyA9IEZYX0FsbG9jMkQodWludDhfdCwgbk1heENvbG9ycywgbV9uQ29tcG9uZW50cyk7CisgICAgICAgIHVpbnQ4X3QqIHBTcmMgPSB0ZW1wX3NyYzsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTWF4Q29sb3JzOyBpKyspIHsKKyAgICAgICAgICBGWF9EV09SRCBjb2xvciA9IGk7CisgICAgICAgICAgRlhfRFdPUkQgb3JkZXIgPSBuTWF4Q29sb3JzIC8gNTI7CisgICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBtX25Db21wb25lbnRzOyBjKyspIHsKKyAgICAgICAgICAgICpwU3JjKysgPSAodWludDhfdCkoY29sb3IgLyBvcmRlciAqIDUpOworICAgICAgICAgICAgY29sb3IgJT0gb3JkZXI7CisgICAgICAgICAgICBvcmRlciAvPSA1MjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRJY2NNb2R1bGUoKS0+VHJhbnNsYXRlU2NhbmxpbmUoCisgICAgICAgICAgICBtX3BQcm9maWxlLT5tX3BUcmFuc2Zvcm0sIG1fcENhY2hlLCB0ZW1wX3NyYywgbk1heENvbG9ycyk7CisgICAgICAgIEZYX0ZyZWUodGVtcF9zcmMpOworICAgICAgfQorICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHM7IGkrKykgeworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IG1fbkNvbXBvbmVudHM7IGMrKykgeworICAgICAgICAgIGluZGV4ID0gaW5kZXggKiA1MiArICgqcFNyY0J1ZikgLyA1OworICAgICAgICAgIHBTcmNCdWYrKzsKKyAgICAgICAgfQorICAgICAgICBpbmRleCAqPSAzOworICAgICAgICAqcERlc3RCdWYrKyA9IG1fcENhY2hlW2luZGV4XTsKKyAgICAgICAgKnBEZXN0QnVmKysgPSBtX3BDYWNoZVtpbmRleCArIDFdOworICAgICAgICAqcERlc3RCdWYrKyA9IG1fcENhY2hlW2luZGV4ICsgMl07CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKG1fcEFsdGVyQ1MpIHsKKyAgICBtX3BBbHRlckNTLT5UcmFuc2xhdGVJbWFnZUxpbmUocERlc3RCdWYsIHBTcmNCdWYsIHBpeGVscywgaW1hZ2Vfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX2hlaWdodCk7CisgIH0KK30KK2NsYXNzIENQREZfSW5kZXhlZENTIDogcHVibGljIENQREZfQ29sb3JTcGFjZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDUERGX0luZGV4ZWRDUyhDUERGX0RvY3VtZW50KiBwRG9jKQorICAgICAgOiBDUERGX0NvbG9yU3BhY2UocERvYywgUERGQ1NfSU5ERVhFRCwgMSksCisgICAgICAgIG1fcEJhc2VDUyhudWxscHRyKSwKKyAgICAgICAgbV9wQ291bnRlZEJhc2VDUyhudWxscHRyKSwKKyAgICAgICAgbV9wQ29tcE1pbk1heChudWxscHRyKSB7fQorICB+Q1BERl9JbmRleGVkQ1MoKSBvdmVycmlkZTsKKworICBGWF9CT09MIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOworICBGWF9CT09MIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBHLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7CisgIENQREZfQ29sb3JTcGFjZSogR2V0QmFzZUNTKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgRW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKSBvdmVycmlkZTsKKworICBDUERGX0NvbG9yU3BhY2UqIG1fcEJhc2VDUzsKKyAgQ1BERl9Db3VudGVkQ29sb3JTcGFjZSogbV9wQ291bnRlZEJhc2VDUzsKKyAgaW50IG1fbkJhc2VDb21wb25lbnRzOworICBpbnQgbV9NYXhJbmRleDsKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9UYWJsZTsKKyAgRlhfRkxPQVQqIG1fcENvbXBNaW5NYXg7Cit9OworQ1BERl9JbmRleGVkQ1M6On5DUERGX0luZGV4ZWRDUygpIHsKKyAgRlhfRnJlZShtX3BDb21wTWluTWF4KTsKKyAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBtX3BDb3VudGVkQmFzZUNTID8gbV9wQ291bnRlZEJhc2VDUy0+Z2V0KCkgOiBOVUxMOworICBpZiAocENTICYmIG1fcERvY3VtZW50KSB7CisgICAgbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VDb2xvclNwYWNlKHBDUy0+R2V0QXJyYXkoKSk7CisgIH0KK30KK0ZYX0JPT0wgQ1BERl9JbmRleGVkQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIHsKKyAgaWYgKHBBcnJheS0+R2V0Q291bnQoKSA8IDQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1BERl9PYmplY3QqIHBCYXNlT2JqID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMSk7CisgIGlmIChwQmFzZU9iaiA9PSBtX3BBcnJheSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDUERGX0RvY1BhZ2VEYXRhKiBwRG9jUGFnZURhdGEgPSBwRG9jLT5HZXRQYWdlRGF0YSgpOworICBtX3BCYXNlQ1MgPSBwRG9jUGFnZURhdGEtPkdldENvbG9yU3BhY2UocEJhc2VPYmosIE5VTEwpOworICBpZiAoIW1fcEJhc2VDUykgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX3BDb3VudGVkQmFzZUNTID0gcERvY1BhZ2VEYXRhLT5GaW5kQ29sb3JTcGFjZVB0cihtX3BCYXNlQ1MtPkdldEFycmF5KCkpOworICBtX25CYXNlQ29tcG9uZW50cyA9IG1fcEJhc2VDUy0+Q291bnRDb21wb25lbnRzKCk7CisgIG1fcENvbXBNaW5NYXggPSBGWF9BbGxvYzJEKEZYX0ZMT0FULCBtX25CYXNlQ29tcG9uZW50cywgMik7CisgIEZYX0ZMT0FUIGRlZnZhbHVlOworICBmb3IgKGludCBpID0gMDsgaSA8IG1fbkJhc2VDb21wb25lbnRzOyBpKyspIHsKKyAgICBtX3BCYXNlQ1MtPkdldERlZmF1bHRWYWx1ZShpLCBkZWZ2YWx1ZSwgbV9wQ29tcE1pbk1heFtpICogMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ29tcE1pbk1heFtpICogMiArIDFdKTsKKyAgICBtX3BDb21wTWluTWF4W2kgKiAyICsgMV0gLT0gbV9wQ29tcE1pbk1heFtpICogMl07CisgIH0KKyAgbV9NYXhJbmRleCA9IHBBcnJheS0+R2V0SW50ZWdlcigyKTsKKworICBDUERGX09iamVjdCogcFRhYmxlT2JqID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMyk7CisgIGlmICghcFRhYmxlT2JqKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoQ1BERl9TdHJpbmcqIHBTdHJpbmcgPSBwVGFibGVPYmotPkFzU3RyaW5nKCkpIHsKKyAgICBtX1RhYmxlID0gcFN0cmluZy0+R2V0U3RyaW5nKCk7CisgIH0gZWxzZSBpZiAoQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwVGFibGVPYmotPkFzU3RyZWFtKCkpIHsKKyAgICBDUERGX1N0cmVhbUFjYyBhY2M7CisgICAgYWNjLkxvYWRBbGxEYXRhKHBTdHJlYW0sIEZBTFNFKTsKKyAgICBtX1RhYmxlID0gQ0ZYX0J5dGVTdHJpbmdDKGFjYy5HZXREYXRhKCksIGFjYy5HZXRTaXplKCkpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIENQREZfSW5kZXhlZENTOjpHZXRSR0IoRlhfRkxPQVQqIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEIpIGNvbnN0IHsKKyAgaW50IGluZGV4ID0gKGludDMyX3QpKCpwQnVmKTsKKyAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IG1fTWF4SW5kZXgpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fbkJhc2VDb21wb25lbnRzKSB7CisgICAgaWYgKGluZGV4ID09IElOVF9NQVggfHwgKGluZGV4ICsgMSkgPiBJTlRfTUFYIC8gbV9uQmFzZUNvbXBvbmVudHMgfHwKKyAgICAgICAgKGluZGV4ICsgMSkgKiBtX25CYXNlQ29tcG9uZW50cyA+IChpbnQpbV9UYWJsZS5HZXRMZW5ndGgoKSkgeworICAgICAgUiA9IEcgPSBCID0gMDsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKyAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IENvbXBzKG1fbkJhc2VDb21wb25lbnRzKTsKKyAgRlhfRkxPQVQqIGNvbXBzID0gQ29tcHM7CisgIGNvbnN0IHVpbnQ4X3QqIHBUYWJsZSA9IG1fVGFibGU7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uQmFzZUNvbXBvbmVudHM7IGkrKykgeworICAgIGNvbXBzW2ldID0KKyAgICAgICAgbV9wQ29tcE1pbk1heFtpICogMl0gKworICAgICAgICBtX3BDb21wTWluTWF4W2kgKiAyICsgMV0gKiBwVGFibGVbaW5kZXggKiBtX25CYXNlQ29tcG9uZW50cyArIGldIC8gMjU1OworICB9CisgIHJldHVybiBtX3BCYXNlQ1MtPkdldFJHQihjb21wcywgUiwgRywgQik7Cit9CitDUERGX0NvbG9yU3BhY2UqIENQREZfSW5kZXhlZENTOjpHZXRCYXNlQ1MoKSBjb25zdCB7CisgIHJldHVybiBtX3BCYXNlQ1M7Cit9Cit2b2lkIENQREZfSW5kZXhlZENTOjpFbmFibGVTdGRDb252ZXJzaW9uKEZYX0JPT0wgYkVuYWJsZWQpIHsKKyAgQ1BERl9Db2xvclNwYWNlOjpFbmFibGVTdGRDb252ZXJzaW9uKGJFbmFibGVkKTsKKyAgaWYgKG1fcEJhc2VDUykgeworICAgIG1fcEJhc2VDUy0+RW5hYmxlU3RkQ29udmVyc2lvbihiRW5hYmxlZCk7CisgIH0KK30KKyNkZWZpbmUgTUFYX1BBVFRFUk5fQ09MT1JDT01QUyAxNgordHlwZWRlZiBzdHJ1Y3QgX1BhdHRlcm5WYWx1ZSB7CisgIENQREZfUGF0dGVybiogbV9wUGF0dGVybjsKKyAgQ1BERl9Db3VudGVkUGF0dGVybiogbV9wQ291bnRlZFBhdHRlcm47CisgIGludCBtX25Db21wczsKKyAgRlhfRkxPQVQgbV9Db21wc1tNQVhfUEFUVEVSTl9DT0xPUkNPTVBTXTsKK30gUGF0dGVyblZhbHVlOworQ1BERl9QYXR0ZXJuQ1M6On5DUERGX1BhdHRlcm5DUygpIHsKKyAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBtX3BDb3VudGVkQmFzZUNTID8gbV9wQ291bnRlZEJhc2VDUy0+Z2V0KCkgOiBOVUxMOworICBpZiAocENTICYmIG1fcERvY3VtZW50KSB7CisgICAgbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VDb2xvclNwYWNlKHBDUy0+R2V0QXJyYXkoKSk7CisgIH0KK30KK0ZYX0JPT0wgQ1BERl9QYXR0ZXJuQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIHsKKyAgQ1BERl9PYmplY3QqIHBCYXNlQ1MgPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZSgxKTsKKyAgaWYgKHBCYXNlQ1MgPT0gbV9wQXJyYXkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1BERl9Eb2NQYWdlRGF0YSogcERvY1BhZ2VEYXRhID0gcERvYy0+R2V0UGFnZURhdGEoKTsKKyAgbV9wQmFzZUNTID0gcERvY1BhZ2VEYXRhLT5HZXRDb2xvclNwYWNlKHBCYXNlQ1MsIE5VTEwpOworICBpZiAobV9wQmFzZUNTKSB7CisgICAgaWYgKG1fcEJhc2VDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfUEFUVEVSTikgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBtX3BDb3VudGVkQmFzZUNTID0gcERvY1BhZ2VEYXRhLT5GaW5kQ29sb3JTcGFjZVB0cihtX3BCYXNlQ1MtPkdldEFycmF5KCkpOwotICAgIG1fbkJhc2VDb21wb25lbnRzID0gbV9wQmFzZUNTLT5Db3VudENvbXBvbmVudHMoKTsKLSAgICBtX3BDb21wTWluTWF4ID0gRlhfQWxsb2MyRChGWF9GTE9BVCwgbV9uQmFzZUNvbXBvbmVudHMsIDIpOwotICAgIEZYX0ZMT0FUIGRlZnZhbHVlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uQmFzZUNvbXBvbmVudHM7IGkgKyspIHsKLSAgICAgICAgbV9wQmFzZUNTLT5HZXREZWZhdWx0VmFsdWUoaSwgZGVmdmFsdWUsIG1fcENvbXBNaW5NYXhbaSAqIDJdLCBtX3BDb21wTWluTWF4W2kgKiAyICsgMV0pOwotICAgICAgICBtX3BDb21wTWluTWF4W2kgKiAyICsgMV0gLT0gbV9wQ29tcE1pbk1heFtpICogMl07CisgICAgbV9uQ29tcG9uZW50cyA9IG1fcEJhc2VDUy0+Q291bnRDb21wb25lbnRzKCkgKyAxOworICAgIGlmIChtX3BCYXNlQ1MtPkNvdW50Q29tcG9uZW50cygpID4gTUFYX1BBVFRFUk5fQ09MT1JDT01QUykgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBtX01heEluZGV4ID0gcEFycmF5LT5HZXRJbnRlZ2VyKDIpOwotICAgIENQREZfT2JqZWN0KiBwVGFibGVPYmogPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZSgzKTsKLSAgICBpZiAocFRhYmxlT2JqID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAocFRhYmxlT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUklORykgewotICAgICAgICBtX1RhYmxlID0gKChDUERGX1N0cmluZyopcFRhYmxlT2JqKS0+R2V0U3RyaW5nKCk7Ci0gICAgfSBlbHNlIGlmIChwVGFibGVPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIENQREZfU3RyZWFtQWNjIGFjYzsKLSAgICAgICAgYWNjLkxvYWRBbGxEYXRhKChDUERGX1N0cmVhbSopcFRhYmxlT2JqLCBGQUxTRSk7Ci0gICAgICAgIG1fVGFibGUgPSBDRlhfQnl0ZVN0cmluZ0MoYWNjLkdldERhdGEoKSwgYWNjLkdldFNpemUoKSk7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX0luZGV4ZWRDUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAotewotICAgIGludCBpbmRleCA9IChGWF9JTlQzMikoKnBCdWYpOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBtX01heEluZGV4KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG1fbkJhc2VDb21wb25lbnRzKSB7Ci0gICAgICAgIGlmIChpbmRleCA9PSBJTlRfTUFYIHx8IChpbmRleCArIDEpID4gSU5UX01BWCAvIG1fbkJhc2VDb21wb25lbnRzIHx8Ci0gICAgICAgICAgICAgICAgKGluZGV4ICsgMSkqbV9uQmFzZUNvbXBvbmVudHMgPiAoaW50KW1fVGFibGUuR2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIFIgPSBHID0gQiA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IENvbXBzKG1fbkJhc2VDb21wb25lbnRzKTsKLSAgICBGWF9GTE9BVCogY29tcHMgPSBDb21wczsKLSAgICBGWF9MUENCWVRFIHBUYWJsZSA9IG1fVGFibGU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25CYXNlQ29tcG9uZW50czsgaSArKykgewotICAgICAgICBjb21wc1tpXSA9IG1fcENvbXBNaW5NYXhbaSAqIDJdICsgbV9wQ29tcE1pbk1heFtpICogMiArIDFdICogcFRhYmxlW2luZGV4ICogbV9uQmFzZUNvbXBvbmVudHMgKyBpXSAvIDI1NTsKLSAgICB9Ci0gICAgbV9wQmFzZUNTLT5HZXRSR0IoY29tcHMsIFIsIEcsIEIpOwotICAgIHJldHVybiBUUlVFOwotfQotdm9pZCBDUERGX0luZGV4ZWRDUzo6RW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKQotewotICAgIENQREZfQ29sb3JTcGFjZTo6RW5hYmxlU3RkQ29udmVyc2lvbihiRW5hYmxlZCk7Ci0gICAgaWYgKG1fcEJhc2VDUykgewotICAgICAgICBtX3BCYXNlQ1MtPkVuYWJsZVN0ZENvbnZlcnNpb24oYkVuYWJsZWQpOwotICAgIH0KLX0KLSNkZWZpbmUgTUFYX1BBVFRFUk5fQ09MT1JDT01QUwkxNgotdHlwZWRlZiBzdHJ1Y3QgX1BhdHRlcm5WYWx1ZSB7Ci0gICAgQ1BERl9QYXR0ZXJuKgltX3BQYXR0ZXJuOwotICAgIENQREZfQ291bnRlZFBhdHRlcm4qCW1fcENvdW50ZWRQYXR0ZXJuOwotICAgIGludAkJCQltX25Db21wczsKLSAgICBGWF9GTE9BVAkJbV9Db21wc1tNQVhfUEFUVEVSTl9DT0xPUkNPTVBTXTsKLX0gUGF0dGVyblZhbHVlOwotQ1BERl9QYXR0ZXJuQ1M6OkNQREZfUGF0dGVybkNTKCkKLXsKLSAgICBtX0ZhbWlseSA9IFBERkNTX1BBVFRFUk47Ci0gICAgbV9wQmFzZUNTID0gTlVMTDsKKyAgfSBlbHNlIHsKICAgICBtX25Db21wb25lbnRzID0gMTsKLSAgICBtX3BDb3VudGVkQmFzZUNTID0gTlVMTDsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLUNQREZfUGF0dGVybkNTOjp+Q1BERl9QYXR0ZXJuQ1MoKQotewotICAgIENQREZfQ29sb3JTcGFjZSogcENTID0gbV9wQ291bnRlZEJhc2VDUyA/IG1fcENvdW50ZWRCYXNlQ1MtPm1fT2JqIDogTlVMTDsKLSAgICBpZiAocENTICYmIG1fcERvY3VtZW50KSB7Ci0JICAgIG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlQ29sb3JTcGFjZShwQ1MtPkdldEFycmF5KCkpOworRlhfQk9PTCBDUERGX1BhdHRlcm5DUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBCKSBjb25zdCB7CisgIGlmIChtX3BCYXNlQ1MpIHsKKyAgICBBU1NFUlQobV9wQmFzZUNTLT5HZXRGYW1pbHkoKSAhPSBQREZDU19QQVRURVJOKTsKKyAgICBQYXR0ZXJuVmFsdWUqIHB2YWx1ZSA9IChQYXR0ZXJuVmFsdWUqKXBCdWY7CisgICAgaWYgKG1fcEJhc2VDUy0+R2V0UkdCKHB2YWx1ZS0+bV9Db21wcywgUiwgRywgQikpIHsKKyAgICAgIHJldHVybiBUUlVFOwogICAgIH0KKyAgfQorICBSID0gRyA9IEIgPSAwLjc1ZjsKKyAgcmV0dXJuIEZBTFNFOwogfQotRlhfQk9PTCBDUERGX1BhdHRlcm5DUzo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkKLXsKLSAgICBDUERGX09iamVjdCogcEJhc2VDUyA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKDEpOwotICAgIGlmIChwQmFzZUNTID09IG1fcEFycmF5KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ1BERl9Eb2NQYWdlRGF0YSogcERvY1BhZ2VEYXRhID0gcERvYy0+R2V0UGFnZURhdGEoKTsKLSAgICBtX3BCYXNlQ1MgPSBwRG9jUGFnZURhdGEtPkdldENvbG9yU3BhY2UocEJhc2VDUywgTlVMTCk7Ci0gICAgaWYgKG1fcEJhc2VDUykgewotICAgICAgICBpZiAobV9wQmFzZUNTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19QQVRURVJOKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wQ291bnRlZEJhc2VDUyA9IHBEb2NQYWdlRGF0YS0+RmluZENvbG9yU3BhY2VQdHIobV9wQmFzZUNTLT5HZXRBcnJheSgpKTsKLSAgICAgICAgbV9uQ29tcG9uZW50cyA9IG1fcEJhc2VDUy0+Q291bnRDb21wb25lbnRzKCkgKyAxOwotICAgICAgICBpZiAobV9wQmFzZUNTLT5Db3VudENvbXBvbmVudHMoKSA+IE1BWF9QQVRURVJOX0NPTE9SQ09NUFMpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fbkNvbXBvbmVudHMgPSAxOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKK0NQREZfQ29sb3JTcGFjZSogQ1BERl9QYXR0ZXJuQ1M6OkdldEJhc2VDUygpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEJhc2VDUzsKIH0KLUZYX0JPT0wgQ1BERl9QYXR0ZXJuQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3QKLXsKLSAgICBpZiAobV9wQmFzZUNTKSB7Ci0gICAgICAgIEFTU0VSVChtX3BCYXNlQ1MtPkdldEZhbWlseSgpICE9IFBERkNTX1BBVFRFUk4pOwotICAgICAgICBQYXR0ZXJuVmFsdWUqIHB2YWx1ZSA9IChQYXR0ZXJuVmFsdWUqKXBCdWY7Ci0gICAgICAgIGlmIChtX3BCYXNlQ1MtPkdldFJHQihwdmFsdWUtPm1fQ29tcHMsIFIsIEcsIEIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBSID0gRyA9IEIgPSAwLjc1ZjsKLSAgICByZXR1cm4gRkFMU0U7Ci19Ci1jbGFzcyBDUERGX1NlcGFyYXRpb25DUyA6IHB1YmxpYyBDUERGX0NvbG9yU3BhY2UKLXsKLXB1YmxpYzoKLSAgICBDUERGX1NlcGFyYXRpb25DUygpOwotICAgIHZpcnR1YWwgfkNQREZfU2VwYXJhdGlvbkNTKCk7Ci0gICAgdmlydHVhbCB2b2lkCQlHZXREZWZhdWx0VmFsdWUoaW50IGlDb21wb25lbnQsIEZYX0ZMT0FUJiB2YWx1ZSwgRlhfRkxPQVQmIG1pbiwgRlhfRkxPQVQmIG1heCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHZhbHVlID0gMS4wZjsKLSAgICAgICAgbWluID0gMDsKLSAgICAgICAgbWF4ID0gMS4wZjsKLSAgICB9Ci0gICAgdmlydHVhbCBGWF9CT09MCQl2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkCQlFbmFibGVTdGRDb252ZXJzaW9uKEZYX0JPT0wgYkVuYWJsZWQpOwotICAgIENQREZfQ29sb3JTcGFjZSoJbV9wQWx0Q1M7Ci0gICAgQ1BERl9GdW5jdGlvbioJCW1fcEZ1bmM7Ci0gICAgZW51bSB7Tm9uZSwgQWxsLCBDb2xvcmFudH0JbV9UeXBlOworY2xhc3MgQ1BERl9TZXBhcmF0aW9uQ1MgOiBwdWJsaWMgQ1BERl9Db2xvclNwYWNlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENQREZfU2VwYXJhdGlvbkNTKENQREZfRG9jdW1lbnQqIHBEb2MpCisgICAgICA6IENQREZfQ29sb3JTcGFjZShwRG9jLCBQREZDU19TRVBBUkFUSU9OLCAxKSwKKyAgICAgICAgbV9wQWx0Q1MobnVsbHB0ciksCisgICAgICAgIG1fcEZ1bmMobnVsbHB0cikge30KKyAgfkNQREZfU2VwYXJhdGlvbkNTKCkgb3ZlcnJpZGU7CisKKyAgLy8gQ1BERl9Db2xvclNwYWNlOgorICB2b2lkIEdldERlZmF1bHRWYWx1ZShpbnQgaUNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbWluLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbWF4KSBjb25zdCBvdmVycmlkZTsKKyAgRlhfQk9PTCB2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSBvdmVycmlkZTsKKyAgRlhfQk9PTCBHZXRSR0IoRlhfRkxPQVQqIHBCdWYsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBSLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgRywKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEVuYWJsZVN0ZENvbnZlcnNpb24oRlhfQk9PTCBiRW5hYmxlZCkgb3ZlcnJpZGU7CisKKyAgQ1BERl9Db2xvclNwYWNlKiBtX3BBbHRDUzsKKyAgQ1BERl9GdW5jdGlvbiogbV9wRnVuYzsKKyAgZW51bSB7IE5vbmUsIEFsbCwgQ29sb3JhbnQgfSBtX1R5cGU7CiB9OwotQ1BERl9TZXBhcmF0aW9uQ1M6OkNQREZfU2VwYXJhdGlvbkNTKCkKLXsKLSAgICBtX0ZhbWlseSA9IFBERkNTX1NFUEFSQVRJT047Ci0gICAgbV9wQWx0Q1MgPSBOVUxMOwotICAgIG1fcEZ1bmMgPSBOVUxMOwotICAgIG1fbkNvbXBvbmVudHMgPSAxOworQ1BERl9TZXBhcmF0aW9uQ1M6On5DUERGX1NlcGFyYXRpb25DUygpIHsKKyAgaWYgKG1fcEFsdENTKSB7CisgICAgbV9wQWx0Q1MtPlJlbGVhc2VDUygpOworICB9CisgIGRlbGV0ZSBtX3BGdW5jOwogfQotQ1BERl9TZXBhcmF0aW9uQ1M6On5DUERGX1NlcGFyYXRpb25DUygpCi17Ci0gICAgaWYgKG1fcEFsdENTKSB7Ci0gICAgICAgIG1fcEFsdENTLT5SZWxlYXNlQ1MoKTsKLSAgICB9Ci0gICAgaWYgKG1fcEZ1bmMpIHsKLSAgICAgICAgZGVsZXRlIG1fcEZ1bmM7Ci0gICAgfQordm9pZCBDUERGX1NlcGFyYXRpb25DUzo6R2V0RGVmYXVsdFZhbHVlKGludCBpQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBtYXgpIGNvbnN0IHsKKyAgdmFsdWUgPSAxLjBmOworICBtaW4gPSAwOworICBtYXggPSAxLjBmOwogfQotRlhfQk9PTCBDUERGX1NlcGFyYXRpb25DUzo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gcEFycmF5LT5HZXRTdHJpbmcoMSk7Ci0gICAgaWYgKG5hbWUgPT0gRlhfQlNUUkMoIk5vbmUiKSkgewotICAgICAgICBtX1R5cGUgPSBOb25lOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fVHlwZSA9IENvbG9yYW50OwotICAgICAgICBDUERGX09iamVjdCogcEFsdENTID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMik7Ci0gICAgICAgIGlmIChwQWx0Q1MgPT0gbV9wQXJyYXkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBtX3BBbHRDUyA9IExvYWQocERvYywgcEFsdENTKTsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBGdW5jT2JqID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMyk7Ci0gICAgICAgIGlmIChwRnVuY09iaiAmJiBwRnVuY09iai0+R2V0VHlwZSgpICE9IFBERk9CSl9OQU1FKSB7Ci0gICAgICAgICAgICBtX3BGdW5jID0gQ1BERl9GdW5jdGlvbjo6TG9hZChwRnVuY09iaik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fcEZ1bmMgJiYgbV9wQWx0Q1MgJiYgbV9wRnVuYy0+Q291bnRPdXRwdXRzKCkgPCBtX3BBbHRDUy0+Q291bnRDb21wb25lbnRzKCkpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtX3BGdW5jOwotICAgICAgICAgICAgbV9wRnVuYyA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENQREZfU2VwYXJhdGlvbkNTOjpHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0Ci17Ci0gICAgaWYgKG1fVHlwZSA9PSBOb25lKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG1fcEZ1bmMgPT0gTlVMTCkgewotICAgICAgICBpZiAobV9wQWx0Q1MgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGludCBuQ29tcHMgPSBtX3BBbHRDUy0+Q291bnRDb21wb25lbnRzKCk7Ci0gICAgICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiByZXN1bHRzKG5Db21wcyk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvbXBzOyBpICsrKSB7Ci0gICAgICAgICAgICByZXN1bHRzW2ldID0gKnBCdWY7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wQWx0Q1MtPkdldFJHQihyZXN1bHRzLCBSLCBHLCBCKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiByZXN1bHRzKG1fcEZ1bmMtPkNvdW50T3V0cHV0cygpKTsKLSAgICBpbnQgbnJlc3VsdHMgPSAwOwotICAgIG1fcEZ1bmMtPkNhbGwocEJ1ZiwgMSwgcmVzdWx0cywgbnJlc3VsdHMpOwotICAgIGlmIChucmVzdWx0cyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG1fcEFsdENTKSB7Ci0gICAgICAgIG1fcEFsdENTLT5HZXRSR0IocmVzdWx0cywgUiwgRywgQik7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFIgPSBHID0gQiA9IDA7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci19Ci12b2lkIENQREZfU2VwYXJhdGlvbkNTOjpFbmFibGVTdGRDb252ZXJzaW9uKEZYX0JPT0wgYkVuYWJsZWQpCi17Ci0gICAgQ1BERl9Db2xvclNwYWNlOjpFbmFibGVTdGRDb252ZXJzaW9uKGJFbmFibGVkKTsKLSAgICBpZiAobV9wQWx0Q1MpIHsKLSAgICAgICAgbV9wQWx0Q1MtPkVuYWJsZVN0ZENvbnZlcnNpb24oYkVuYWJsZWQpOwotICAgIH0KLX0KLWNsYXNzIENQREZfRGV2aWNlTkNTIDogcHVibGljIENQREZfQ29sb3JTcGFjZQotewotcHVibGljOgotICAgIENQREZfRGV2aWNlTkNTKCk7Ci0gICAgdmlydHVhbCB+Q1BERl9EZXZpY2VOQ1MoKTsKLSAgICB2aXJ0dWFsIHZvaWQJCUdldERlZmF1bHRWYWx1ZShpbnQgaUNvbXBvbmVudCwgRlhfRkxPQVQmIHZhbHVlLCBGWF9GTE9BVCYgbWluLCBGWF9GTE9BVCYgbWF4KSBjb25zdAotICAgIHsKLSAgICAgICAgdmFsdWUgPSAxLjBmOwotICAgICAgICBtaW4gPSAwOwotICAgICAgICBtYXggPSAxLjBmOwotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCUdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkCUVuYWJsZVN0ZENvbnZlcnNpb24oRlhfQk9PTCBiRW5hYmxlZCk7Ci0gICAgQ1BERl9Db2xvclNwYWNlKgltX3BBbHRDUzsKLSAgICBDUERGX0Z1bmN0aW9uKgkJbV9wRnVuYzsKLX07Ci1DUERGX0RldmljZU5DUzo6Q1BERl9EZXZpY2VOQ1MoKQotewotICAgIG1fRmFtaWx5ID0gUERGQ1NfREVWSUNFTjsKLSAgICBtX3BBbHRDUyA9IE5VTEw7Ci0gICAgbV9wRnVuYyA9IE5VTEw7Ci19Ci1DUERGX0RldmljZU5DUzo6fkNQREZfRGV2aWNlTkNTKCkKLXsKLSAgICBpZiAobV9wRnVuYykgewotICAgICAgICBkZWxldGUgbV9wRnVuYzsKLSAgICB9Ci0gICAgaWYgKG1fcEFsdENTKSB7Ci0gICAgICAgIG1fcEFsdENTLT5SZWxlYXNlQ1MoKTsKLSAgICB9Ci19Ci1GWF9CT09MIENQREZfRGV2aWNlTkNTOjp2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KQotewotICAgIENQREZfT2JqZWN0KiBwT2JqID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMSk7Ci0gICAgaWYgKCFwT2JqKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKHBPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX25Db21wb25lbnRzID0gKChDUERGX0FycmF5KilwT2JqKS0+R2V0Q291bnQoKTsKK0ZYX0JPT0wgQ1BERl9TZXBhcmF0aW9uQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9IHBBcnJheS0+R2V0U3RyaW5nKDEpOworICBpZiAobmFtZSA9PSAiTm9uZSIpIHsKKyAgICBtX1R5cGUgPSBOb25lOworICB9IGVsc2UgeworICAgIG1fVHlwZSA9IENvbG9yYW50OwogICAgIENQREZfT2JqZWN0KiBwQWx0Q1MgPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZSgyKTsKLSAgICBpZiAoIXBBbHRDUyB8fCBwQWx0Q1MgPT0gbV9wQXJyYXkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmIChwQWx0Q1MgPT0gbV9wQXJyYXkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgbV9wQWx0Q1MgPSBMb2FkKHBEb2MsIHBBbHRDUyk7Ci0gICAgbV9wRnVuYyA9IENQREZfRnVuY3Rpb246OkxvYWQocEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMykpOwotICAgIGlmIChtX3BBbHRDUyA9PSBOVUxMIHx8IG1fcEZ1bmMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFtX3BBbHRDUykgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBpZiAobV9wRnVuYy0+Q291bnRPdXRwdXRzKCkgPCBtX3BBbHRDUy0+Q291bnRDb21wb25lbnRzKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIENQREZfT2JqZWN0KiBwRnVuY09iaiA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKDMpOworICAgIGlmIChwRnVuY09iaiAmJiAhcEZ1bmNPYmotPklzTmFtZSgpKQorICAgICAgbV9wRnVuYyA9IENQREZfRnVuY3Rpb246OkxvYWQocEZ1bmNPYmopOworCisgICAgaWYgKG1fcEZ1bmMgJiYgbV9wRnVuYy0+Q291bnRPdXRwdXRzKCkgPCBtX3BBbHRDUy0+Q291bnRDb21wb25lbnRzKCkpIHsKKyAgICAgIGRlbGV0ZSBtX3BGdW5jOworICAgICAgbV9wRnVuYyA9IE5VTEw7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBUUlVFOwogfQotRlhfQk9PTCBDUERGX0RldmljZU5DUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgUiwgRlhfRkxPQVQmIEcsIEZYX0ZMT0FUJiBCKSBjb25zdAotewotICAgIGlmIChtX3BGdW5jID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDUERGX1NlcGFyYXRpb25DUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBCKSBjb25zdCB7CisgIGlmIChtX1R5cGUgPT0gTm9uZSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoIW1fcEZ1bmMpIHsKKyAgICBpZiAoIW1fcEFsdENTKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiByZXN1bHRzKG1fcEZ1bmMtPkNvdW50T3V0cHV0cygpKTsKLSAgICBpbnQgbnJlc3VsdHMgPSAwOwotICAgIG1fcEZ1bmMtPkNhbGwocEJ1ZiwgbV9uQ29tcG9uZW50cywgcmVzdWx0cywgbnJlc3VsdHMpOwotICAgIGlmIChucmVzdWx0cyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpbnQgbkNvbXBzID0gbV9wQWx0Q1MtPkNvdW50Q29tcG9uZW50cygpOworICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiByZXN1bHRzKG5Db21wcyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ29tcHM7IGkrKykgeworICAgICAgcmVzdWx0c1tpXSA9ICpwQnVmOwogICAgIH0KLSAgICBtX3BBbHRDUy0+R2V0UkdCKHJlc3VsdHMsIFIsIEcsIEIpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiBtX3BBbHRDUy0+R2V0UkdCKHJlc3VsdHMsIFIsIEcsIEIpOworICB9CisgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiByZXN1bHRzKG1fcEZ1bmMtPkNvdW50T3V0cHV0cygpKTsKKyAgaW50IG5yZXN1bHRzID0gMDsKKyAgbV9wRnVuYy0+Q2FsbChwQnVmLCAxLCByZXN1bHRzLCBucmVzdWx0cyk7CisgIGlmIChucmVzdWx0cyA9PSAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX3BBbHRDUykgeworICAgIHJldHVybiBtX3BBbHRDUy0+R2V0UkdCKHJlc3VsdHMsIFIsIEcsIEIpOworICB9CisgIFIgPSBHID0gQiA9IDA7CisgIHJldHVybiBGQUxTRTsKIH0KLXZvaWQgQ1BERl9EZXZpY2VOQ1M6OkVuYWJsZVN0ZENvbnZlcnNpb24oRlhfQk9PTCBiRW5hYmxlZCkKLXsKLSAgICBDUERGX0NvbG9yU3BhY2U6OkVuYWJsZVN0ZENvbnZlcnNpb24oYkVuYWJsZWQpOwotICAgIGlmIChtX3BBbHRDUykgewotICAgICAgICBtX3BBbHRDUy0+RW5hYmxlU3RkQ29udmVyc2lvbihiRW5hYmxlZCk7Ci0gICAgfQordm9pZCBDUERGX1NlcGFyYXRpb25DUzo6RW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKSB7CisgIENQREZfQ29sb3JTcGFjZTo6RW5hYmxlU3RkQ29udmVyc2lvbihiRW5hYmxlZCk7CisgIGlmIChtX3BBbHRDUykgeworICAgIG1fcEFsdENTLT5FbmFibGVTdGRDb252ZXJzaW9uKGJFbmFibGVkKTsKKyAgfQogfQotQ1BERl9Db2xvclNwYWNlKiBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoaW50IGZhbWlseSkKLXsKLSAgICByZXR1cm4gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldFN0b2NrQ1MoZmFtaWx5KTs7CitjbGFzcyBDUERGX0RldmljZU5DUyA6IHB1YmxpYyBDUERGX0NvbG9yU3BhY2UgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1BERl9EZXZpY2VOQ1MoQ1BERl9Eb2N1bWVudCogcERvYykKKyAgICAgIDogQ1BERl9Db2xvclNwYWNlKHBEb2MsIFBERkNTX0RFVklDRU4sIDApLAorICAgICAgICBtX3BBbHRDUyhudWxscHRyKSwKKyAgICAgICAgbV9wRnVuYyhudWxscHRyKSB7fQorICB+Q1BERl9EZXZpY2VOQ1MoKSBvdmVycmlkZTsKKworICAvLyBDUERGX0NvbG9yU3BhY2U6CisgIHZvaWQgR2V0RGVmYXVsdFZhbHVlKGludCBpQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBtaW4sCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBtYXgpIGNvbnN0IG92ZXJyaWRlOworICBGWF9CT09MIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOworICBGWF9CT09MIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBHLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgRW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKSBvdmVycmlkZTsKKworICBDUERGX0NvbG9yU3BhY2UqIG1fcEFsdENTOworICBDUERGX0Z1bmN0aW9uKiBtX3BGdW5jOworfTsKK0NQREZfRGV2aWNlTkNTOjp+Q1BERl9EZXZpY2VOQ1MoKSB7CisgIGRlbGV0ZSBtX3BGdW5jOworICBpZiAobV9wQWx0Q1MpIHsKKyAgICBtX3BBbHRDUy0+UmVsZWFzZUNTKCk7CisgIH0KIH0KLUNQREZfQ29sb3JTcGFjZSogX0NTRnJvbU5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpCi17Ci0gICAgaWYgKG5hbWUgPT0gRlhfQlNUUkMoIkRldmljZVJHQiIpIHx8IG5hbWUgPT0gRlhfQlNUUkMoIlJHQiIpKSB7Ci0gICAgICAgIHJldHVybiBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFUkdCKTsKK3ZvaWQgQ1BERl9EZXZpY2VOQ1M6OkdldERlZmF1bHRWYWx1ZShpbnQgaUNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIG1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbWF4KSBjb25zdCB7CisgIHZhbHVlID0gMS4wZjsKKyAgbWluID0gMDsKKyAgbWF4ID0gMS4wZjsKK30KK0ZYX0JPT0wgQ1BERl9EZXZpY2VOQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIHsKKyAgQ1BERl9BcnJheSogcE9iaiA9IFRvQXJyYXkocEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMSkpOworICBpZiAoIXBPYmopCisgICAgcmV0dXJuIEZBTFNFOworCisgIG1fbkNvbXBvbmVudHMgPSBwT2JqLT5HZXRDb3VudCgpOworICBDUERGX09iamVjdCogcEFsdENTID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMik7CisgIGlmICghcEFsdENTIHx8IHBBbHRDUyA9PSBtX3BBcnJheSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX3BBbHRDUyA9IExvYWQocERvYywgcEFsdENTKTsKKyAgbV9wRnVuYyA9IENQREZfRnVuY3Rpb246OkxvYWQocEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMykpOworICBpZiAoIW1fcEFsdENTIHx8ICFtX3BGdW5jKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX3BGdW5jLT5Db3VudE91dHB1dHMoKSA8IG1fcEFsdENTLT5Db3VudENvbXBvbmVudHMoKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9EZXZpY2VOQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQikgY29uc3QgeworICBpZiAoIW1fcEZ1bmMpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IHJlc3VsdHMobV9wRnVuYy0+Q291bnRPdXRwdXRzKCkpOworICBpbnQgbnJlc3VsdHMgPSAwOworICBtX3BGdW5jLT5DYWxsKHBCdWYsIG1fbkNvbXBvbmVudHMsIHJlc3VsdHMsIG5yZXN1bHRzKTsKKyAgaWYgKG5yZXN1bHRzID09IDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIG1fcEFsdENTLT5HZXRSR0IocmVzdWx0cywgUiwgRywgQik7Cit9Cit2b2lkIENQREZfRGV2aWNlTkNTOjpFbmFibGVTdGRDb252ZXJzaW9uKEZYX0JPT0wgYkVuYWJsZWQpIHsKKyAgQ1BERl9Db2xvclNwYWNlOjpFbmFibGVTdGRDb252ZXJzaW9uKGJFbmFibGVkKTsKKyAgaWYgKG1fcEFsdENTKSB7CisgICAgbV9wQWx0Q1MtPkVuYWJsZVN0ZENvbnZlcnNpb24oYkVuYWJsZWQpOworICB9Cit9CisKK0NQREZfQ29sb3JTcGFjZSogQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKGludCBmYW1pbHkpIHsKKyAgcmV0dXJuIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRTdG9ja0NTKGZhbWlseSk7Cit9CisKK0NQREZfQ29sb3JTcGFjZSogX0NTRnJvbU5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpIHsKKyAgaWYgKG5hbWUgPT0gIkRldmljZVJHQiIgfHwgbmFtZSA9PSAiUkdCIikgeworICAgIHJldHVybiBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFUkdCKTsKKyAgfQorICBpZiAobmFtZSA9PSAiRGV2aWNlR3JheSIgfHwgbmFtZSA9PSAiRyIpIHsKKyAgICByZXR1cm4gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRUdSQVkpOworICB9CisgIGlmIChuYW1lID09ICJEZXZpY2VDTVlLIiB8fCBuYW1lID09ICJDTVlLIikgeworICAgIHJldHVybiBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFQ01ZSyk7CisgIH0KKyAgaWYgKG5hbWUgPT0gIlBhdHRlcm4iKSB7CisgICAgcmV0dXJuIENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19QQVRURVJOKTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KK0NQREZfQ29sb3JTcGFjZSogQ1BERl9Db2xvclNwYWNlOjpMb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfT2JqZWN0KiBwT2JqKSB7CisgIGlmICghcE9iaikKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgaWYgKHBPYmotPklzTmFtZSgpKQorICAgIHJldHVybiBfQ1NGcm9tTmFtZShwT2JqLT5HZXRTdHJpbmcoKSk7CisKKyAgaWYgKENQREZfU3RyZWFtKiBwU3RyZWFtID0gcE9iai0+QXNTdHJlYW0oKSkgeworICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7CisgICAgaWYgKCFwRGljdCkKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6ICpwRGljdCkgeworICAgICAgQ1BERl9Db2xvclNwYWNlKiBwUmV0ID0gbnVsbHB0cjsKKyAgICAgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBpdC5zZWNvbmQ7CisgICAgICBpZiAoVG9OYW1lKHBWYWx1ZSkpCisgICAgICAgIHBSZXQgPSBfQ1NGcm9tTmFtZShwVmFsdWUtPkdldFN0cmluZygpKTsKKyAgICAgIGlmIChwUmV0KQorICAgICAgICByZXR1cm4gcFJldDsKICAgICB9Ci0gICAgaWYgKG5hbWUgPT0gRlhfQlNUUkMoIkRldmljZUdyYXkiKSB8fCBuYW1lID09IEZYX0JTVFJDKCJHIikpIHsKLSAgICAgICAgcmV0dXJuIENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VHUkFZKTsKLSAgICB9Ci0gICAgaWYgKG5hbWUgPT0gRlhfQlNUUkMoIkRldmljZUNNWUsiKSB8fCBuYW1lID09IEZYX0JTVFJDKCJDTVlLIikpIHsKLSAgICAgICAgcmV0dXJuIENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VDTVlLKTsKLSAgICB9Ci0gICAgaWYgKG5hbWUgPT0gRlhfQlNUUkMoIlBhdHRlcm4iKSkgewotICAgICAgICByZXR1cm4gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX1BBVFRFUk4pOwotICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIENQREZfQXJyYXkqIHBBcnJheSA9IHBPYmotPkFzQXJyYXkoKTsKKyAgaWYgKCFwQXJyYXkgfHwgcEFycmF5LT5HZXRDb3VudCgpID09IDApCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgQ1BERl9PYmplY3QqIHBGYW1pbHlPYmogPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZSgwKTsKKyAgaWYgKCFwRmFtaWx5T2JqKQorICAgIHJldHVybiBudWxscHRyOworCisgIENGWF9CeXRlU3RyaW5nIGZhbWlseW5hbWUgPSBwRmFtaWx5T2JqLT5HZXRTdHJpbmcoKTsKKyAgaWYgKHBBcnJheS0+R2V0Q291bnQoKSA9PSAxKQorICAgIHJldHVybiBfQ1NGcm9tTmFtZShmYW1pbHluYW1lKTsKKworICBDUERGX0NvbG9yU3BhY2UqIHBDUyA9IE5VTEw7CisgIEZYX0RXT1JEIGlkID0gZmFtaWx5bmFtZS5HZXRJRCgpOworICBpZiAoaWQgPT0gRlhCU1RSX0lEKCdDJywgJ2EnLCAnbCcsICdHJykpIHsKKyAgICBwQ1MgPSBuZXcgQ1BERl9DYWxHcmF5KHBEb2MpOworICB9IGVsc2UgaWYgKGlkID09IEZYQlNUUl9JRCgnQycsICdhJywgJ2wnLCAnUicpKSB7CisgICAgcENTID0gbmV3IENQREZfQ2FsUkdCKHBEb2MpOworICB9IGVsc2UgaWYgKGlkID09IEZYQlNUUl9JRCgnTCcsICdhJywgJ2InLCAwKSkgeworICAgIHBDUyA9IG5ldyBDUERGX0xhYkNTKHBEb2MpOworICB9IGVsc2UgaWYgKGlkID09IEZYQlNUUl9JRCgnSScsICdDJywgJ0MnLCAnQicpKSB7CisgICAgcENTID0gbmV3IENQREZfSUNDQmFzZWRDUyhwRG9jKTsKKyAgfSBlbHNlIGlmIChpZCA9PSBGWEJTVFJfSUQoJ0knLCAnbicsICdkJywgJ2UnKSB8fAorICAgICAgICAgICAgIGlkID09IEZYQlNUUl9JRCgnSScsIDAsIDAsIDApKSB7CisgICAgcENTID0gbmV3IENQREZfSW5kZXhlZENTKHBEb2MpOworICB9IGVsc2UgaWYgKGlkID09IEZYQlNUUl9JRCgnUycsICdlJywgJ3AnLCAnYScpKSB7CisgICAgcENTID0gbmV3IENQREZfU2VwYXJhdGlvbkNTKHBEb2MpOworICB9IGVsc2UgaWYgKGlkID09IEZYQlNUUl9JRCgnRCcsICdlJywgJ3YnLCAnaScpKSB7CisgICAgcENTID0gbmV3IENQREZfRGV2aWNlTkNTKHBEb2MpOworICB9IGVsc2UgaWYgKGlkID09IEZYQlNUUl9JRCgnUCcsICdhJywgJ3QnLCAndCcpKSB7CisgICAgcENTID0gbmV3IENQREZfUGF0dGVybkNTKHBEb2MpOworICB9IGVsc2UgewogICAgIHJldHVybiBOVUxMOworICB9CisgIHBDUy0+bV9wQXJyYXkgPSBwQXJyYXk7CisgIGlmICghcENTLT52X0xvYWQocERvYywgcEFycmF5KSkgeworICAgIHBDUy0+UmVsZWFzZUNTKCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIHBDUzsKIH0KLUNQREZfQ29sb3JTcGFjZSogQ1BERl9Db2xvclNwYWNlOjpMb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfT2JqZWN0KiBwT2JqKQotewotICAgIGlmIChwT2JqID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKLSAgICAgICAgcmV0dXJuIF9DU0Zyb21OYW1lKHBPYmotPkdldFN0cmluZygpKTsKLSAgICB9Ci0gICAgaWYgKHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSAqcERpY3QgPSAoKENQREZfU3RyZWFtICopcE9iaiktPkdldERpY3QoKTsKLSAgICAgICAgaWYgKCFwRGljdCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9Db2xvclNwYWNlICpwUmV0ID0gTlVMTDsKLSAgICAgICAgRlhfUE9TSVRJT04gcG9zID0gcERpY3QtPkdldFN0YXJ0UG9zKCk7Ci0gICAgICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzS2V5OwotICAgICAgICAgICAgQ1BERl9PYmplY3QgKnBWYWx1ZSA9IHBEaWN0LT5HZXROZXh0RWxlbWVudChwb3MsIGJzS2V5KTsKLSAgICAgICAgICAgIGlmIChwVmFsdWUgJiYgcFZhbHVlLT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKLSAgICAgICAgICAgICAgICBwUmV0ID0gX0NTRnJvbU5hbWUocFZhbHVlLT5HZXRTdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocFJldCkgewotICAgICAgICAgICAgICAgIHJldHVybiBwUmV0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAocE9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBPYmo7Ci0gICAgaWYgKHBBcnJheS0+R2V0Q291bnQoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX09iamVjdCAqcEZhbWlseU9iaiA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKDApOwotICAgIGlmICghcEZhbWlseU9iaikgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgZmFtaWx5bmFtZSA9IHBGYW1pbHlPYmotPkdldFN0cmluZygpOwotICAgIGlmIChwQXJyYXktPkdldENvdW50KCkgPT0gMSkgewotICAgICAgICByZXR1cm4gX0NTRnJvbU5hbWUoZmFtaWx5bmFtZSk7Ci0gICAgfQotICAgIENQREZfQ29sb3JTcGFjZSogcENTID0gTlVMTDsKLSAgICBGWF9EV09SRCBpZCA9IGZhbWlseW5hbWUuR2V0SUQoKTsKLSAgICBpZiAoaWQgPT0gRlhCU1RSX0lEKCdDJywgJ2EnLCAnbCcsICdHJykpIHsKLSAgICAgICAgcENTID0gbmV3IENQREZfQ2FsR3JheSgpOwotICAgIH0gZWxzZSBpZiAoaWQgPT0gRlhCU1RSX0lEKCdDJywgJ2EnLCAnbCcsICdSJykpIHsKLSAgICAgICAgcENTID0gbmV3IENQREZfQ2FsUkdCKCk7Ci0gICAgfSBlbHNlIGlmIChpZCA9PSBGWEJTVFJfSUQoJ0wnLCAnYScsICdiJywgMCkpIHsKLSAgICAgICAgcENTID0gbmV3IENQREZfTGFiQ1MoKTsKLSAgICB9IGVsc2UgaWYgKGlkID09IEZYQlNUUl9JRCgnSScsICdDJywgJ0MnLCAnQicpKSB7Ci0gICAgICAgIHBDUyA9IG5ldyBDUERGX0lDQ0Jhc2VkQ1MoKTsKLSAgICB9IGVsc2UgaWYgKGlkID09IEZYQlNUUl9JRCgnSScsICduJywgJ2QnLCAnZScpIHx8IGlkID09IEZYQlNUUl9JRCgnSScsIDAsIDAsIDApKSB7Ci0gICAgICAgIHBDUyA9IG5ldyBDUERGX0luZGV4ZWRDUygpOwotICAgIH0gZWxzZSBpZiAoaWQgPT0gRlhCU1RSX0lEKCdTJywgJ2UnLCAncCcsICdhJykpIHsKLSAgICAgICAgcENTID0gbmV3IENQREZfU2VwYXJhdGlvbkNTKCk7Ci0gICAgfSBlbHNlIGlmIChpZCA9PSBGWEJTVFJfSUQoJ0QnLCAnZScsICd2JywgJ2knKSkgewotICAgICAgICBwQ1MgPSBuZXcgQ1BERl9EZXZpY2VOQ1MoKTsKLSAgICB9IGVsc2UgaWYgKGlkID09IEZYQlNUUl9JRCgnUCcsICdhJywgJ3QnLCAndCcpKSB7Ci0gICAgICAgIHBDUyA9IG5ldyBDUERGX1BhdHRlcm5DUygpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBwQ1MtPm1fcERvY3VtZW50ID0gcERvYzsKLSAgICBwQ1MtPm1fcEFycmF5ID0gcEFycmF5OwotICAgIGlmICghcENTLT52X0xvYWQocERvYywgcEFycmF5KSkgewotICAgICAgICBwQ1MtPlJlbGVhc2VDUygpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIHBDUzsKK3ZvaWQgQ1BERl9Db2xvclNwYWNlOjpSZWxlYXNlQ1MoKSB7CisgIGlmICh0aGlzID09IEdldFN0b2NrQ1MoUERGQ1NfREVWSUNFUkdCKSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAodGhpcyA9PSBHZXRTdG9ja0NTKFBERkNTX0RFVklDRUdSQVkpKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmICh0aGlzID09IEdldFN0b2NrQ1MoUERGQ1NfREVWSUNFQ01ZSykpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHRoaXMgPT0gR2V0U3RvY2tDUyhQREZDU19QQVRURVJOKSkgeworICAgIHJldHVybjsKKyAgfQorICBkZWxldGUgdGhpczsKIH0KLUNQREZfQ29sb3JTcGFjZTo6Q1BERl9Db2xvclNwYWNlKCkKLXsKLSAgICBtX0ZhbWlseSA9IDA7Ci0gICAgbV9wQXJyYXkgPSBOVUxMOwotICAgIG1fZHdTdGRDb252ZXJzaW9uID0gMDsKLSAgICBtX3BEb2N1bWVudCA9IE5VTEw7CitpbnQgQ1BERl9Db2xvclNwYWNlOjpHZXRCdWZTaXplKCkgY29uc3QgeworICBpZiAobV9GYW1pbHkgPT0gUERGQ1NfUEFUVEVSTikgeworICAgIHJldHVybiBzaXplb2YoUGF0dGVyblZhbHVlKTsKKyAgfQorICByZXR1cm4gbV9uQ29tcG9uZW50cyAqIHNpemVvZihGWF9GTE9BVCk7CiB9Ci12b2lkIENQREZfQ29sb3JTcGFjZTo6UmVsZWFzZUNTKCkKLXsKLSAgICBpZiAodGhpcyA9PSBHZXRTdG9ja0NTKFBERkNTX0RFVklDRVJHQikpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAodGhpcyA9PSBHZXRTdG9ja0NTKFBERkNTX0RFVklDRUdSQVkpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHRoaXMgPT0gR2V0U3RvY2tDUyhQREZDU19ERVZJQ0VDTVlLKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh0aGlzID09IEdldFN0b2NrQ1MoUERGQ1NfUEFUVEVSTikpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBkZWxldGUgdGhpczsKK0ZYX0ZMT0FUKiBDUERGX0NvbG9yU3BhY2U6OkNyZWF0ZUJ1ZigpIHsKKyAgaW50IHNpemUgPSBHZXRCdWZTaXplKCk7CisgIHVpbnQ4X3QqIHBCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsKKyAgcmV0dXJuIChGWF9GTE9BVCopcEJ1ZjsKIH0KLWludCBDUERGX0NvbG9yU3BhY2U6OkdldEJ1ZlNpemUoKSBjb25zdAotewotICAgIGlmIChtX0ZhbWlseSA9PSBQREZDU19QQVRURVJOKSB7Ci0gICAgICAgIHJldHVybiBzaXplb2YoUGF0dGVyblZhbHVlKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1fbkNvbXBvbmVudHMgKiBzaXplb2YoRlhfRkxPQVQpOwotfQotRlhfRkxPQVQqIENQREZfQ29sb3JTcGFjZTo6Q3JlYXRlQnVmKCkKLXsKLSAgICBpbnQgc2l6ZSA9IEdldEJ1ZlNpemUoKTsKLSAgICBGWF9CWVRFKiBwQnVmID0gRlhfQWxsb2MoRlhfQllURSwgc2l6ZSk7Ci0gICAgcmV0dXJuIChGWF9GTE9BVCopcEJ1ZjsKLX0KLUZYX0JPT0wgQ1BERl9Db2xvclNwYWNlOjpzUkdCKCkgY29uc3QKLXsKLSAgICBpZiAobV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFUkdCKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAobV9GYW1pbHkgIT0gUERGQ1NfSUNDQkFTRUQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDUERGX0lDQ0Jhc2VkQ1MqIHBDUyA9IChDUERGX0lDQ0Jhc2VkQ1MqKXRoaXM7Ci0gICAgcmV0dXJuIHBDUy0+bV9wUHJvZmlsZS0+bV9ic1JHQjsKLX0KLUZYX0JPT0wgQ1BERl9Db2xvclNwYWNlOjpHZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgYywgRlhfRkxPQVQmIG0sIEZYX0ZMT0FUJiB5LCBGWF9GTE9BVCYgaykgY29uc3QKLXsKLSAgICBpZiAodl9HZXRDTVlLKHBCdWYsIGMsIG0sIHksIGspKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBGWF9GTE9BVCBSLCBHLCBCOwotICAgIGlmICghR2V0UkdCKHBCdWYsIFIsIEcsIEIpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgc1JHQl90b19BZG9iZUNNWUsoUiwgRywgQiwgYywgbSwgeSwgayk7CitGWF9CT09MIENQREZfQ29sb3JTcGFjZTo6c1JHQigpIGNvbnN0IHsKKyAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRVJHQikgewogICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChtX0ZhbWlseSAhPSBQREZDU19JQ0NCQVNFRCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDUERGX0lDQ0Jhc2VkQ1MqIHBDUyA9IChDUERGX0lDQ0Jhc2VkQ1MqKXRoaXM7CisgIHJldHVybiBwQ1MtPm1fcFByb2ZpbGUtPm1fYnNSR0I7CiB9Ci1GWF9CT09MIENQREZfQ29sb3JTcGFjZTo6U2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQgYywgRlhfRkxPQVQgbSwgRlhfRkxPQVQgeSwgRlhfRkxPQVQgaykgY29uc3QKLXsKLSAgICBpZiAodl9TZXRDTVlLKHBCdWYsIGMsIG0sIHksIGspKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBGWF9GTE9BVCBSLCBHLCBCOwotICAgIEFkb2JlQ01ZS190b19zUkdCKGMsIG0sIHksIGssIFIsIEcsIEIpOwotICAgIHJldHVybiBTZXRSR0IocEJ1ZiwgUiwgRywgQik7CitGWF9CT09MIENQREZfQ29sb3JTcGFjZTo6R2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBrKSBjb25zdCB7CisgIGlmICh2X0dldENNWUsocEJ1ZiwgYywgbSwgeSwgaykpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBGWF9GTE9BVCBSLCBHLCBCOworICBpZiAoIUdldFJHQihwQnVmLCBSLCBHLCBCKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBzUkdCX3RvX0Fkb2JlQ01ZSyhSLCBHLCBCLCBjLCBtLCB5LCBrKTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci12b2lkIENQREZfQ29sb3JTcGFjZTo6R2V0RGVmYXVsdENvbG9yKEZYX0ZMT0FUKiBidWYpIGNvbnN0Ci17Ci0gICAgaWYgKGJ1ZiA9PSBOVUxMIHx8IG1fRmFtaWx5ID09IFBERkNTX1BBVFRFUk4pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9GTE9BVCBtaW4sIG1heDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbkNvbXBvbmVudHM7IGkgKyspIHsKLSAgICAgICAgR2V0RGVmYXVsdFZhbHVlKGksIGJ1ZltpXSwgbWluLCBtYXgpOwotICAgIH0KK0ZYX0JPT0wgQ1BERl9Db2xvclNwYWNlOjpTZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaykgY29uc3QgeworICBpZiAodl9TZXRDTVlLKHBCdWYsIGMsIG0sIHksIGspKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgRlhfRkxPQVQgUiwgRywgQjsKKyAgQWRvYmVDTVlLX3RvX3NSR0IoYywgbSwgeSwgaywgUiwgRywgQik7CisgIHJldHVybiBTZXRSR0IocEJ1ZiwgUiwgRywgQik7CiB9Ci1pbnQgQ1BERl9Db2xvclNwYWNlOjpHZXRNYXhJbmRleCgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fRmFtaWx5ICE9IFBERkNTX0lOREVYRUQpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENQREZfSW5kZXhlZENTKiBwQ1MgPSAoQ1BERl9JbmRleGVkQ1MqKXRoaXM7Ci0gICAgcmV0dXJuIHBDUy0+bV9NYXhJbmRleDsKK3ZvaWQgQ1BERl9Db2xvclNwYWNlOjpHZXREZWZhdWx0Q29sb3IoRlhfRkxPQVQqIGJ1ZikgY29uc3QgeworICBpZiAoIWJ1ZiB8fCBtX0ZhbWlseSA9PSBQREZDU19QQVRURVJOKSB7CisgICAgcmV0dXJuOworICB9CisgIEZYX0ZMT0FUIG1pbiwgbWF4OworICBmb3IgKGludCBpID0gMDsgaSA8IG1fbkNvbXBvbmVudHM7IGkrKykgeworICAgIEdldERlZmF1bHRWYWx1ZShpLCBidWZbaV0sIG1pbiwgbWF4KTsKKyAgfQogfQotdm9pZCBDUERGX0NvbG9yU3BhY2U6OlRyYW5zbGF0ZUltYWdlTGluZShGWF9MUEJZVEUgZGVzdF9idWYsIEZYX0xQQ0JZVEUgc3JjX2J1ZiwgaW50IHBpeGVscywgaW50IGltYWdlX3dpZHRoLCBpbnQgaW1hZ2VfaGVpZ2h0LCBGWF9CT09MIGJUcmFuc01hc2spIGNvbnN0Ci17Ci0gICAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IHNyY2J1ZihtX25Db21wb25lbnRzKTsKLSAgICBGWF9GTE9BVCogc3JjID0gc3JjYnVmOwotICAgIEZYX0ZMT0FUIFIsIEcsIEI7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHM7IGkgKyspIHsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtX25Db21wb25lbnRzOyBqICsrKQotICAgICAgICAgICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0lOREVYRUQpIHsKLSAgICAgICAgICAgICAgICBzcmNbal0gPSAoRlhfRkxPQVQpKCpzcmNfYnVmICsrKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3JjW2pdID0gKEZYX0ZMT0FUKSgqc3JjX2J1ZiArKykgLyAyNTU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIEdldFJHQihzcmMsIFIsIEcsIEIpOwotICAgICAgICAqZGVzdF9idWYgKysgPSAoRlhfSU5UMzIpKEIgKiAyNTUpOwotICAgICAgICAqZGVzdF9idWYgKysgPSAoRlhfSU5UMzIpKEcgKiAyNTUpOwotICAgICAgICAqZGVzdF9idWYgKysgPSAoRlhfSU5UMzIpKFIgKiAyNTUpOwotICAgIH0KK2ludCBDUERGX0NvbG9yU3BhY2U6OkdldE1heEluZGV4KCkgY29uc3QgeworICBpZiAobV9GYW1pbHkgIT0gUERGQ1NfSU5ERVhFRCkgeworICAgIHJldHVybiAwOworICB9CisgIENQREZfSW5kZXhlZENTKiBwQ1MgPSAoQ1BERl9JbmRleGVkQ1MqKXRoaXM7CisgIHJldHVybiBwQ1MtPm1fTWF4SW5kZXg7CiB9Ci12b2lkIENQREZfQ29sb3JTcGFjZTo6RW5hYmxlU3RkQ29udmVyc2lvbihGWF9CT09MIGJFbmFibGVkKQotewotICAgIGlmIChiRW5hYmxlZCkgewotICAgICAgICBtX2R3U3RkQ29udmVyc2lvbiArKzsKLSAgICB9IGVsc2UgaWYgKG1fZHdTdGRDb252ZXJzaW9uKSB7Ci0gICAgICAgIG1fZHdTdGRDb252ZXJzaW9uIC0tOwotICAgIH0KK3ZvaWQgQ1BERl9Db2xvclNwYWNlOjpUcmFuc2xhdGVJbWFnZUxpbmUodWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJhbnNNYXNrKSBjb25zdCB7CisgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiBzcmNidWYobV9uQ29tcG9uZW50cyk7CisgIEZYX0ZMT0FUKiBzcmMgPSBzcmNidWY7CisgIEZYX0ZMT0FUIFIsIEcsIEI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzOyBpKyspIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IG1fbkNvbXBvbmVudHM7IGorKykKKyAgICAgIGlmIChtX0ZhbWlseSA9PSBQREZDU19JTkRFWEVEKSB7CisgICAgICAgIHNyY1tqXSA9IChGWF9GTE9BVCkoKnNyY19idWYrKyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzcmNbal0gPSAoRlhfRkxPQVQpKCpzcmNfYnVmKyspIC8gMjU1OworICAgICAgfQorICAgIEdldFJHQihzcmMsIFIsIEcsIEIpOworICAgICpkZXN0X2J1ZisrID0gKGludDMyX3QpKEIgKiAyNTUpOworICAgICpkZXN0X2J1ZisrID0gKGludDMyX3QpKEcgKiAyNTUpOworICAgICpkZXN0X2J1ZisrID0gKGludDMyX3QpKFIgKiAyNTUpOworICB9CiB9Ci1DUERGX0NvbG9yOjpDUERGX0NvbG9yKGludCBmYW1pbHkpCi17Ci0gICAgbV9wQ1MgPSBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoZmFtaWx5KTsKLSAgICBpbnQgbkNvbXBzID0gMzsKLSAgICBpZiAoZmFtaWx5ID09IFBERkNTX0RFVklDRUdSQVkpIHsKLSAgICAgICAgbkNvbXBzID0gMTsKLSAgICB9IGVsc2UgaWYgKGZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLKSB7Ci0gICAgICAgIG5Db21wcyA9IDQ7Ci0gICAgfQotICAgIG1fcEJ1ZmZlciA9IEZYX0FsbG9jKEZYX0ZMT0FULCBuQ29tcHMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvbXBzOyBpICsrKSB7Ci0gICAgICAgIG1fcEJ1ZmZlcltpXSA9IDA7Ci0gICAgfQordm9pZCBDUERGX0NvbG9yU3BhY2U6OkVuYWJsZVN0ZENvbnZlcnNpb24oRlhfQk9PTCBiRW5hYmxlZCkgeworICBpZiAoYkVuYWJsZWQpIHsKKyAgICBtX2R3U3RkQ29udmVyc2lvbisrOworICB9IGVsc2UgaWYgKG1fZHdTdGRDb252ZXJzaW9uKSB7CisgICAgbV9kd1N0ZENvbnZlcnNpb24tLTsKKyAgfQogfQotQ1BERl9Db2xvcjo6fkNQREZfQ29sb3IoKQotewotICAgIFJlbGVhc2VCdWZmZXIoKTsKLSAgICBSZWxlYXNlQ29sb3JTcGFjZSgpOworQ1BERl9Db2xvcjo6Q1BERl9Db2xvcihpbnQgZmFtaWx5KSB7CisgIG1fcENTID0gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKGZhbWlseSk7CisgIGludCBuQ29tcHMgPSAzOworICBpZiAoZmFtaWx5ID09IFBERkNTX0RFVklDRUdSQVkpIHsKKyAgICBuQ29tcHMgPSAxOworICB9IGVsc2UgaWYgKGZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLKSB7CisgICAgbkNvbXBzID0gNDsKKyAgfQorICBtX3BCdWZmZXIgPSBGWF9BbGxvYyhGWF9GTE9BVCwgbkNvbXBzKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ29tcHM7IGkrKykgeworICAgIG1fcEJ1ZmZlcltpXSA9IDA7CisgIH0KIH0KLXZvaWQgQ1BERl9Db2xvcjo6UmVsZWFzZUJ1ZmZlcigpCi17CitDUERGX0NvbG9yOjp+Q1BERl9Db2xvcigpIHsKKyAgUmVsZWFzZUJ1ZmZlcigpOworICBSZWxlYXNlQ29sb3JTcGFjZSgpOworfQordm9pZCBDUERGX0NvbG9yOjpSZWxlYXNlQnVmZmVyKCkgeworICBpZiAoIW1fcEJ1ZmZlcikgeworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9wQ1MtPkdldEZhbWlseSgpID09IFBERkNTX1BBVFRFUk4pIHsKKyAgICBQYXR0ZXJuVmFsdWUqIHB2YWx1ZSA9IChQYXR0ZXJuVmFsdWUqKW1fcEJ1ZmZlcjsKKyAgICBDUERGX1BhdHRlcm4qIHBQYXR0ZXJuID0KKyAgICAgICAgcHZhbHVlLT5tX3BDb3VudGVkUGF0dGVybiA/IHB2YWx1ZS0+bV9wQ291bnRlZFBhdHRlcm4tPmdldCgpIDogTlVMTDsKKyAgICBpZiAocFBhdHRlcm4gJiYgcFBhdHRlcm4tPm1fcERvY3VtZW50KSB7CisgICAgICBDUERGX0RvY1BhZ2VEYXRhKiBwUGFnZURhdGEgPSBwUGF0dGVybi0+bV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCk7CisgICAgICBpZiAocFBhZ2VEYXRhKSB7CisgICAgICAgIHBQYWdlRGF0YS0+UmVsZWFzZVBhdHRlcm4ocFBhdHRlcm4tPm1fcFBhdHRlcm5PYmopOworICAgICAgfQorICAgIH0KKyAgfQorICBGWF9GcmVlKG1fcEJ1ZmZlcik7CisgIG1fcEJ1ZmZlciA9IE5VTEw7Cit9Cit2b2lkIENQREZfQ29sb3I6OlJlbGVhc2VDb2xvclNwYWNlKCkgeworICBpZiAobV9wQ1MgJiYgbV9wQ1MtPm1fcERvY3VtZW50ICYmIG1fcENTLT5HZXRBcnJheSgpKSB7CisgICAgbV9wQ1MtPm1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlQ29sb3JTcGFjZShtX3BDUy0+R2V0QXJyYXkoKSk7CisgICAgbV9wQ1MgPSBOVUxMOworICB9Cit9Cit2b2lkIENQREZfQ29sb3I6OlNldENvbG9yU3BhY2UoQ1BERl9Db2xvclNwYWNlKiBwQ1MpIHsKKyAgaWYgKG1fcENTID09IHBDUykgewogICAgIGlmICghbV9wQnVmZmVyKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICAgIG1fcEJ1ZmZlciA9IHBDUy0+Q3JlYXRlQnVmKCk7CiAgICAgfQotICAgIGlmIChtX3BDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfUEFUVEVSTikgewotICAgICAgICBQYXR0ZXJuVmFsdWUqIHB2YWx1ZSA9IChQYXR0ZXJuVmFsdWUqKW1fcEJ1ZmZlcjsKLSAgICAgICAgQ1BERl9QYXR0ZXJuKiBwUGF0dGVybiA9IHB2YWx1ZS0+bV9wQ291bnRlZFBhdHRlcm4gPyBwdmFsdWUtPm1fcENvdW50ZWRQYXR0ZXJuLT5tX09iaiA6IE5VTEw7Ci0gICAgICAgIGlmIChwUGF0dGVybiAmJiBwUGF0dGVybi0+bV9wRG9jdW1lbnQpIHsKLSAgICAgICAgICAgIENQREZfRG9jUGFnZURhdGEgKnBQYWdlRGF0YSA9IHBQYXR0ZXJuLT5tX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKTsKLSAgICAgICAgICAgIGlmIChwUGFnZURhdGEpIHsKLSAgICAgICAgICAgICAgICBwUGFnZURhdGEtPlJlbGVhc2VQYXR0ZXJuKHBQYXR0ZXJuLT5tX3BQYXR0ZXJuT2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBGWF9GcmVlKG1fcEJ1ZmZlcik7Ci0gICAgbV9wQnVmZmVyID0gTlVMTDsKLX0KLXZvaWQgQ1BERl9Db2xvcjo6UmVsZWFzZUNvbG9yU3BhY2UoKQotewotICAgIGlmIChtX3BDUyAmJiBtX3BDUy0+bV9wRG9jdW1lbnQgJiYgbV9wQ1MtPkdldEFycmF5KCkpIHsKLSAgICAgICAgbV9wQ1MtPm1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlQ29sb3JTcGFjZShtX3BDUy0+R2V0QXJyYXkoKSk7Ci0gICAgICAgIG1fcENTID0gTlVMTDsKLSAgICB9Ci19Ci12b2lkIENQREZfQ29sb3I6OlNldENvbG9yU3BhY2UoQ1BERl9Db2xvclNwYWNlKiBwQ1MpCi17Ci0gICAgaWYgKG1fcENTID09IHBDUykgewotICAgICAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1fcEJ1ZmZlciA9IHBDUy0+Q3JlYXRlQnVmKCk7Ci0gICAgICAgIH0KLSAgICAgICAgUmVsZWFzZUNvbG9yU3BhY2UoKTsKLSAgICAgICAgbV9wQ1MgPSBwQ1M7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgUmVsZWFzZUJ1ZmZlcigpOwogICAgIFJlbGVhc2VDb2xvclNwYWNlKCk7CiAgICAgbV9wQ1MgPSBwQ1M7Ci0gICAgaWYgKG1fcENTKSB7Ci0gICAgICAgIG1fcEJ1ZmZlciA9IHBDUy0+Q3JlYXRlQnVmKCk7Ci0gICAgICAgIHBDUy0+R2V0RGVmYXVsdENvbG9yKG1fcEJ1ZmZlcik7Ci0gICAgfQorICAgIHJldHVybjsKKyAgfQorICBSZWxlYXNlQnVmZmVyKCk7CisgIFJlbGVhc2VDb2xvclNwYWNlKCk7CisgIG1fcENTID0gcENTOworICBpZiAobV9wQ1MpIHsKKyAgICBtX3BCdWZmZXIgPSBwQ1MtPkNyZWF0ZUJ1ZigpOworICAgIHBDUy0+R2V0RGVmYXVsdENvbG9yKG1fcEJ1ZmZlcik7CisgIH0KIH0KLXZvaWQgQ1BERl9Db2xvcjo6U2V0VmFsdWUoRlhfRkxPQVQqIGNvbXBzKQotewotICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtX3BDUy0+R2V0RmFtaWx5KCkgIT0gUERGQ1NfUEFUVEVSTikgewotICAgICAgICBGWFNZU19tZW1jcHkzMihtX3BCdWZmZXIsIGNvbXBzLCBtX3BDUy0+Q291bnRDb21wb25lbnRzKCkgKiBzaXplb2YoRlhfRkxPQVQpKTsKLSAgICB9Cit2b2lkIENQREZfQ29sb3I6OlNldFZhbHVlKEZYX0ZMT0FUKiBjb21wcykgeworICBpZiAoIW1fcEJ1ZmZlcikgeworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9wQ1MtPkdldEZhbWlseSgpICE9IFBERkNTX1BBVFRFUk4pIHsKKyAgICBGWFNZU19tZW1jcHkobV9wQnVmZmVyLCBjb21wcywgbV9wQ1MtPkNvdW50Q29tcG9uZW50cygpICogc2l6ZW9mKEZYX0ZMT0FUKSk7CisgIH0KIH0KLXZvaWQgQ1BERl9Db2xvcjo6U2V0VmFsdWUoQ1BERl9QYXR0ZXJuKiBwUGF0dGVybiwgRlhfRkxPQVQqIGNvbXBzLCBpbnQgbmNvbXBzKQotewotICAgIGlmIChuY29tcHMgPiBNQVhfUEFUVEVSTl9DT0xPUkNPTVBTKSB7Ci0gICAgICAgIHJldHVybjsKK3ZvaWQgQ1BERl9Db2xvcjo6U2V0VmFsdWUoQ1BERl9QYXR0ZXJuKiBwUGF0dGVybiwgRlhfRkxPQVQqIGNvbXBzLCBpbnQgbmNvbXBzKSB7CisgIGlmIChuY29tcHMgPiBNQVhfUEFUVEVSTl9DT0xPUkNPTVBTKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmICghbV9wQ1MgfHwgbV9wQ1MtPkdldEZhbWlseSgpICE9IFBERkNTX1BBVFRFUk4pIHsKKyAgICBGWF9GcmVlKG1fcEJ1ZmZlcik7CisgICAgbV9wQ1MgPSBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfUEFUVEVSTik7CisgICAgbV9wQnVmZmVyID0gbV9wQ1MtPkNyZWF0ZUJ1ZigpOworICB9CisgIENQREZfRG9jUGFnZURhdGEqIHBEb2NQYWdlRGF0YSA9IE5VTEw7CisgIFBhdHRlcm5WYWx1ZSogcHZhbHVlID0gKFBhdHRlcm5WYWx1ZSopbV9wQnVmZmVyOworICBpZiAocHZhbHVlLT5tX3BQYXR0ZXJuICYmIHB2YWx1ZS0+bV9wUGF0dGVybi0+bV9wRG9jdW1lbnQpIHsKKyAgICBwRG9jUGFnZURhdGEgPSBwdmFsdWUtPm1fcFBhdHRlcm4tPm1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpOworICAgIGlmIChwRG9jUGFnZURhdGEpIHsKKyAgICAgIHBEb2NQYWdlRGF0YS0+UmVsZWFzZVBhdHRlcm4ocHZhbHVlLT5tX3BQYXR0ZXJuLT5tX3BQYXR0ZXJuT2JqKTsKICAgICB9Ci0gICAgaWYgKG1fcENTID09IE5VTEwgfHwgbV9wQ1MtPkdldEZhbWlseSgpICE9IFBERkNTX1BBVFRFUk4pIHsKLSAgICAgICAgaWYgKG1fcEJ1ZmZlcikgewotICAgICAgICAgICAgRlhfRnJlZShtX3BCdWZmZXIpOwotICAgICAgICB9Ci0gICAgICAgIG1fcENTID0gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX1BBVFRFUk4pOwotICAgICAgICBtX3BCdWZmZXIgPSBtX3BDUy0+Q3JlYXRlQnVmKCk7CisgIH0KKyAgcHZhbHVlLT5tX25Db21wcyA9IG5jb21wczsKKyAgcHZhbHVlLT5tX3BQYXR0ZXJuID0gcFBhdHRlcm47CisgIGlmIChuY29tcHMpIHsKKyAgICBGWFNZU19tZW1jcHkocHZhbHVlLT5tX0NvbXBzLCBjb21wcywgbmNvbXBzICogc2l6ZW9mKEZYX0ZMT0FUKSk7CisgIH0KKyAgcHZhbHVlLT5tX3BDb3VudGVkUGF0dGVybiA9IE5VTEw7CisgIGlmIChwUGF0dGVybiAmJiBwUGF0dGVybi0+bV9wRG9jdW1lbnQpIHsKKyAgICBpZiAoIXBEb2NQYWdlRGF0YSkgeworICAgICAgcERvY1BhZ2VEYXRhID0gcFBhdHRlcm4tPm1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpOwogICAgIH0KLSAgICBDUERGX0RvY1BhZ2VEYXRhICpwRG9jUGFnZURhdGEgPSBOVUxMOworICAgIHB2YWx1ZS0+bV9wQ291bnRlZFBhdHRlcm4gPQorICAgICAgICBwRG9jUGFnZURhdGEtPkZpbmRQYXR0ZXJuUHRyKHBQYXR0ZXJuLT5tX3BQYXR0ZXJuT2JqKTsKKyAgfQorfQordm9pZCBDUERGX0NvbG9yOjpDb3B5KGNvbnN0IENQREZfQ29sb3IqIHBTcmMpIHsKKyAgUmVsZWFzZUJ1ZmZlcigpOworICBSZWxlYXNlQ29sb3JTcGFjZSgpOworICBtX3BDUyA9IHBTcmMtPm1fcENTOworICBpZiAobV9wQ1MgJiYgbV9wQ1MtPm1fcERvY3VtZW50KSB7CisgICAgQ1BERl9BcnJheSogcEFycmF5ID0gbV9wQ1MtPkdldEFycmF5KCk7CisgICAgaWYgKHBBcnJheSkgeworICAgICAgbV9wQ1MgPSBtX3BDUy0+bV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPkdldENvcGllZENvbG9yU3BhY2UocEFycmF5KTsKKyAgICB9CisgIH0KKyAgaWYgKCFtX3BDUykgeworICAgIHJldHVybjsKKyAgfQorICBtX3BCdWZmZXIgPSBtX3BDUy0+Q3JlYXRlQnVmKCk7CisgIEZYU1lTX21lbWNweShtX3BCdWZmZXIsIHBTcmMtPm1fcEJ1ZmZlciwgbV9wQ1MtPkdldEJ1ZlNpemUoKSk7CisgIGlmIChtX3BDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfUEFUVEVSTikgewogICAgIFBhdHRlcm5WYWx1ZSogcHZhbHVlID0gKFBhdHRlcm5WYWx1ZSopbV9wQnVmZmVyOwogICAgIGlmIChwdmFsdWUtPm1fcFBhdHRlcm4gJiYgcHZhbHVlLT5tX3BQYXR0ZXJuLT5tX3BEb2N1bWVudCkgewotICAgICAgICBwRG9jUGFnZURhdGEgPSBwdmFsdWUtPm1fcFBhdHRlcm4tPm1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpOwotICAgICAgICBpZiAocERvY1BhZ2VEYXRhKSB7Ci0gICAgICAgICAgICBwRG9jUGFnZURhdGEtPlJlbGVhc2VQYXR0ZXJuKHB2YWx1ZS0+bV9wUGF0dGVybi0+bV9wUGF0dGVybk9iaik7Ci0gICAgICAgIH0KKyAgICAgIHB2YWx1ZS0+bV9wUGF0dGVybiA9CisgICAgICAgICAgcHZhbHVlLT5tX3BQYXR0ZXJuLT5tX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+R2V0UGF0dGVybigKKyAgICAgICAgICAgICAgcHZhbHVlLT5tX3BQYXR0ZXJuLT5tX3BQYXR0ZXJuT2JqLCBGQUxTRSwKKyAgICAgICAgICAgICAgJnB2YWx1ZS0+bV9wUGF0dGVybi0+bV9QYXJlbnRNYXRyaXgpOwogICAgIH0KLSAgICBwdmFsdWUtPm1fbkNvbXBzID0gbmNvbXBzOwotICAgIHB2YWx1ZS0+bV9wUGF0dGVybiA9IHBQYXR0ZXJuOwotICAgIGlmIChuY29tcHMpIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5MzIocHZhbHVlLT5tX0NvbXBzLCBjb21wcywgbmNvbXBzICogc2l6ZW9mKEZYX0ZMT0FUKSk7Ci0gICAgfQotICAgIHB2YWx1ZS0+bV9wQ291bnRlZFBhdHRlcm4gPSBOVUxMOwotICAgIGlmIChwUGF0dGVybiAmJiBwUGF0dGVybi0+bV9wRG9jdW1lbnQpCi0gICAgewotICAgICAgICBpZiAoIXBEb2NQYWdlRGF0YSkgewotICAgICAgICAgICAgcERvY1BhZ2VEYXRhID0gcFBhdHRlcm4tPm1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpOwotICAgICAgICB9Ci0gICAgICAgIHB2YWx1ZS0+bV9wQ291bnRlZFBhdHRlcm4gPSBwRG9jUGFnZURhdGEtPkZpbmRQYXR0ZXJuUHRyKHBQYXR0ZXJuLT5tX3BQYXR0ZXJuT2JqKTsKLSAgICB9CisgIH0KIH0KLXZvaWQgQ1BERl9Db2xvcjo6Q29weShjb25zdCBDUERGX0NvbG9yKiBwU3JjKQotewotICAgIFJlbGVhc2VCdWZmZXIoKTsKLSAgICBSZWxlYXNlQ29sb3JTcGFjZSgpOwotICAgIG1fcENTID0gcFNyYy0+bV9wQ1M7Ci0gICAgaWYgKG1fcENTICYmIG1fcENTLT5tX3BEb2N1bWVudCkgewotICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBtX3BDUy0+R2V0QXJyYXkoKTsKLSAgICAgICAgaWYgKHBBcnJheSkgewotICAgICAgICAgICAgbV9wQ1MgPSBtX3BDUy0+bV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPkdldENvcGllZENvbG9yU3BhY2UocEFycmF5KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9wQ1MgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fcEJ1ZmZlciA9IG1fcENTLT5DcmVhdGVCdWYoKTsKLSAgICBGWFNZU19tZW1jcHkzMihtX3BCdWZmZXIsIHBTcmMtPm1fcEJ1ZmZlciwgbV9wQ1MtPkdldEJ1ZlNpemUoKSk7Ci0gICAgaWYgKG1fcENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19QQVRURVJOKSB7Ci0gICAgICAgIFBhdHRlcm5WYWx1ZSogcHZhbHVlID0gKFBhdHRlcm5WYWx1ZSopbV9wQnVmZmVyOwotICAgICAgICBpZiAocHZhbHVlLT5tX3BQYXR0ZXJuICYmIHB2YWx1ZS0+bV9wUGF0dGVybi0+bV9wRG9jdW1lbnQpIHsKLSAgICAgICAgICAgIHB2YWx1ZS0+bV9wUGF0dGVybiA9IHB2YWx1ZS0+bV9wUGF0dGVybi0+bV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPkdldFBhdHRlcm4ocHZhbHVlLT5tX3BQYXR0ZXJuLT5tX3BQYXR0ZXJuT2JqLCBGQUxTRSwgJnB2YWx1ZS0+bV9wUGF0dGVybi0+bV9QYXJlbnRNYXRyaXgpOwotICAgICAgICB9Ci0gICAgfQorRlhfQk9PTCBDUERGX0NvbG9yOjpHZXRSR0IoaW50JiBSLCBpbnQmIEcsIGludCYgQikgY29uc3QgeworICBpZiAoIW1fcENTIHx8ICFtX3BCdWZmZXIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhfRkxPQVQgciA9IDAuMGYsIGcgPSAwLjBmLCBiID0gMC4wZjsKKyAgaWYgKCFtX3BDUy0+R2V0UkdCKG1fcEJ1ZmZlciwgciwgZywgYikpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgUiA9IChpbnQzMl90KShyICogMjU1ICsgMC41Zik7CisgIEcgPSAoaW50MzJfdCkoZyAqIDI1NSArIDAuNWYpOworICBCID0gKGludDMyX3QpKGIgKiAyNTUgKyAwLjVmKTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENQREZfQ29sb3I6OkdldFJHQihpbnQmIFIsIGludCYgRywgaW50JiBCKSBjb25zdAotewotICAgIGlmIChtX3BDUyA9PSBOVUxMIHx8IG1fcEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfRkxPQVQgcj0wLjBmLCBnPTAuMGYsIGI9MC4wZjsKLSAgICBpZiAoIW1fcENTLT5HZXRSR0IobV9wQnVmZmVyLCByLCBnLCBiKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIFIgPSAoRlhfSU5UMzIpKHIgKiAyNTUgKyAwLjVmKTsKLSAgICBHID0gKEZYX0lOVDMyKShnICogMjU1ICsgMC41Zik7Ci0gICAgQiA9IChGWF9JTlQzMikoYiAqIDI1NSArIDAuNWYpOwotICAgIHJldHVybiBUUlVFOworQ1BERl9QYXR0ZXJuKiBDUERGX0NvbG9yOjpHZXRQYXR0ZXJuKCkgY29uc3QgeworICBpZiAoIW1fcEJ1ZmZlciB8fCBtX3BDUy0+R2V0RmFtaWx5KCkgIT0gUERGQ1NfUEFUVEVSTikgeworICAgIHJldHVybiBOVUxMOworICB9CisgIFBhdHRlcm5WYWx1ZSogcHZhbHVlID0gKFBhdHRlcm5WYWx1ZSopbV9wQnVmZmVyOworICByZXR1cm4gcHZhbHVlLT5tX3BQYXR0ZXJuOwogfQotQ1BERl9QYXR0ZXJuKiBDUERGX0NvbG9yOjpHZXRQYXR0ZXJuKCkgY29uc3QKLXsKLSAgICBpZiAobV9wQnVmZmVyID09IE5VTEwgfHwgbV9wQ1MtPkdldEZhbWlseSgpICE9IFBERkNTX1BBVFRFUk4pIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIFBhdHRlcm5WYWx1ZSogcHZhbHVlID0gKFBhdHRlcm5WYWx1ZSopbV9wQnVmZmVyOwotICAgIHJldHVybiBwdmFsdWUtPm1fcFBhdHRlcm47CitDUERGX0NvbG9yU3BhY2UqIENQREZfQ29sb3I6OkdldFBhdHRlcm5DUygpIGNvbnN0IHsKKyAgaWYgKCFtX3BCdWZmZXIgfHwgbV9wQ1MtPkdldEZhbWlseSgpICE9IFBERkNTX1BBVFRFUk4pIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gbV9wQ1MtPkdldEJhc2VDUygpOwogfQotQ1BERl9Db2xvclNwYWNlKiBDUERGX0NvbG9yOjpHZXRQYXR0ZXJuQ1MoKSBjb25zdAotewotICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCB8fCBtX3BDUy0+R2V0RmFtaWx5KCkgIT0gUERGQ1NfUEFUVEVSTikgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIG1fcENTLT5HZXRCYXNlQ1MoKTsKK0ZYX0ZMT0FUKiBDUERGX0NvbG9yOjpHZXRQYXR0ZXJuQ29sb3IoKSBjb25zdCB7CisgIGlmICghbV9wQnVmZmVyIHx8IG1fcENTLT5HZXRGYW1pbHkoKSAhPSBQREZDU19QQVRURVJOKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgUGF0dGVyblZhbHVlKiBwdmFsdWUgPSAoUGF0dGVyblZhbHVlKiltX3BCdWZmZXI7CisgIHJldHVybiBwdmFsdWUtPm1fbkNvbXBzID8gcHZhbHVlLT5tX0NvbXBzIDogTlVMTDsKIH0KLUZYX0ZMT0FUKiBDUERGX0NvbG9yOjpHZXRQYXR0ZXJuQ29sb3IoKSBjb25zdAotewotICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCB8fCBtX3BDUy0+R2V0RmFtaWx5KCkgIT0gUERGQ1NfUEFUVEVSTikgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgUGF0dGVyblZhbHVlKiBwdmFsdWUgPSAoUGF0dGVyblZhbHVlKiltX3BCdWZmZXI7Ci0gICAgcmV0dXJuIHB2YWx1ZS0+bV9uQ29tcHMgPyBwdmFsdWUtPm1fQ29tcHMgOiBOVUxMOwotfQotRlhfQk9PTCBDUERGX0NvbG9yOjpJc0VxdWFsKGNvbnN0IENQREZfQ29sb3ImIG90aGVyKSBjb25zdAotewotICAgIGlmIChtX3BDUyAhPSBvdGhlci5tX3BDUyB8fCBtX3BDUyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZYU1lTX21lbWNtcDMyKG1fcEJ1ZmZlciwgb3RoZXIubV9wQnVmZmVyLCBtX3BDUy0+R2V0QnVmU2l6ZSgpKSA9PSAwOworRlhfQk9PTCBDUERGX0NvbG9yOjpJc0VxdWFsKGNvbnN0IENQREZfQ29sb3ImIG90aGVyKSBjb25zdCB7CisgIHJldHVybiBtX3BDUyAmJiBtX3BDUyA9PSBvdGhlci5tX3BDUyAmJgorICAgICAgICAgRlhTWVNfbWVtY21wKG1fcEJ1ZmZlciwgb3RoZXIubV9wQnVmZmVyLCBtX3BDUy0+R2V0QnVmU2l6ZSgpKSA9PSAwOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2RvYy5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZG9jLmNwcAppbmRleCAyNDFiNTg5Li4wMTk5ODA5IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZG9jLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZG9jLmNwcApAQCAtMSw2NjAgKzEsNjA3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mZHJtL2Z4X2NyeXB0LmgiCi0jaW5jbHVkZSAiLi4vZnBkZl9mb250L2ZvbnRfaW50LmgiCiAjaW5jbHVkZSAicGFnZWludC5oIgotY2xhc3MgQ1BERl9QYWdlTW9kdWxlIDogcHVibGljIENQREZfUGFnZU1vZHVsZURlZgotewotcHVibGljOgotICAgIENQREZfUGFnZU1vZHVsZSgpIDogbV9TdG9ja0dyYXlDUyhQREZDU19ERVZJQ0VHUkFZKSwgbV9TdG9ja1JHQkNTKFBERkNTX0RFVklDRVJHQiksCi0gICAgICAgIG1fU3RvY2tDTVlLQ1MoUERGQ1NfREVWSUNFQ01ZSykge30KLSAgICB2aXJ0dWFsIH5DUERGX1BhZ2VNb2R1bGUoKSB7fQotICAgIHZpcnR1YWwgRlhfQk9PTAkJSW5zdGFsbGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICB2aXJ0dWFsIENQREZfRG9jUGFnZURhdGEqCUNyZWF0ZURvY0RhdGEoQ1BERl9Eb2N1bWVudCogcERvYykKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ1BERl9Eb2NQYWdlRGF0YShwRG9jKTsKLSAgICB9Ci0gICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlRG9jKENQREZfRG9jdW1lbnQqIHBEb2MpOwotICAgIHZpcnR1YWwgdm9pZAkJQ2xlYXJEb2MoQ1BERl9Eb2N1bWVudCogcERvYyk7Ci0gICAgdmlydHVhbCBDUERGX0ZvbnRHbG9iYWxzKglHZXRGb250R2xvYmFscygpCi0gICAgewotICAgICAgICByZXR1cm4gJm1fRm9udEdsb2JhbHM7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZAkJCQlDbGVhclN0b2NrRm9udChDUERGX0RvY3VtZW50KiBwRG9jKQotICAgIHsKLSAgICAgICAgbV9Gb250R2xvYmFscy5DbGVhcihwRG9jKTsKLSAgICB9Ci0gICAgdmlydHVhbCBDUERGX0NvbG9yU3BhY2UqCUdldFN0b2NrQ1MoaW50IGZhbWlseSk7Ci0gICAgdmlydHVhbCB2b2lkCQlOb3RpZnlDSktBdmFpbGFibGUoKTsKLSAgICBDUERGX0ZvbnRHbG9iYWxzCW1fRm9udEdsb2JhbHM7Ci0gICAgQ1BERl9EZXZpY2VDUwkJbV9TdG9ja0dyYXlDUzsKLSAgICBDUERGX0RldmljZUNTCQltX1N0b2NrUkdCQ1M7Ci0gICAgQ1BERl9EZXZpY2VDUwkJbV9TdG9ja0NNWUtDUzsKLSAgICBDUERGX1BhdHRlcm5DUwkJbV9TdG9ja1BhdHRlcm5DUzsKKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mZHJtL2Z4X2NyeXB0LmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2UuaCIKKyNpbmNsdWRlICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mb250X2ludC5oIgorCitjbGFzcyBDUERGX1BhZ2VNb2R1bGUgOiBwdWJsaWMgSVBERl9QYWdlTW9kdWxlIHsKKyBwdWJsaWM6CisgIENQREZfUGFnZU1vZHVsZSgpCisgICAgICA6IG1fU3RvY2tHcmF5Q1MobnVsbHB0ciwgUERGQ1NfREVWSUNFR1JBWSksCisgICAgICAgIG1fU3RvY2tSR0JDUyhudWxscHRyLCBQREZDU19ERVZJQ0VSR0IpLAorICAgICAgICBtX1N0b2NrQ01ZS0NTKG51bGxwdHIsIFBERkNTX0RFVklDRUNNWUspLAorICAgICAgICBtX1N0b2NrUGF0dGVybkNTKG51bGxwdHIpIHt9CisKKyBwcml2YXRlOgorICB+Q1BERl9QYWdlTW9kdWxlKCkgb3ZlcnJpZGUge30KKworICBDUERGX0RvY1BhZ2VEYXRhKiBDcmVhdGVEb2NEYXRhKENQREZfRG9jdW1lbnQqIHBEb2MpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gbmV3IENQREZfRG9jUGFnZURhdGEocERvYyk7CisgIH0KKworICB2b2lkIFJlbGVhc2VEb2MoQ1BERl9Eb2N1bWVudCogcERvYykgb3ZlcnJpZGU7CisgIHZvaWQgQ2xlYXJEb2MoQ1BERl9Eb2N1bWVudCogcERvYykgb3ZlcnJpZGU7CisKKyAgQ1BERl9Gb250R2xvYmFscyogR2V0Rm9udEdsb2JhbHMoKSBvdmVycmlkZSB7IHJldHVybiAmbV9Gb250R2xvYmFsczsgfQorCisgIHZvaWQgQ2xlYXJTdG9ja0ZvbnQoQ1BERl9Eb2N1bWVudCogcERvYykgb3ZlcnJpZGUgeworICAgIG1fRm9udEdsb2JhbHMuQ2xlYXIocERvYyk7CisgIH0KKworICBDUERGX0NvbG9yU3BhY2UqIEdldFN0b2NrQ1MoaW50IGZhbWlseSkgb3ZlcnJpZGU7CisgIHZvaWQgTm90aWZ5Q0pLQXZhaWxhYmxlKCkgb3ZlcnJpZGU7CisKKyAgQ1BERl9Gb250R2xvYmFscyBtX0ZvbnRHbG9iYWxzOworICBDUERGX0RldmljZUNTIG1fU3RvY2tHcmF5Q1M7CisgIENQREZfRGV2aWNlQ1MgbV9TdG9ja1JHQkNTOworICBDUERGX0RldmljZUNTIG1fU3RvY2tDTVlLQ1M7CisgIENQREZfUGF0dGVybkNTIG1fU3RvY2tQYXR0ZXJuQ1M7CiB9OwotQ1BERl9Db2xvclNwYWNlKiBDUERGX1BhZ2VNb2R1bGU6OkdldFN0b2NrQ1MoaW50IGZhbWlseSkKLXsKLSAgICBpZiAoZmFtaWx5ID09IFBERkNTX0RFVklDRUdSQVkpIHsKLSAgICAgICAgcmV0dXJuICZtX1N0b2NrR3JheUNTOwotICAgIH0KLSAgICBpZiAoZmFtaWx5ID09IFBERkNTX0RFVklDRVJHQikgewotICAgICAgICByZXR1cm4gJm1fU3RvY2tSR0JDUzsKLSAgICB9Ci0gICAgaWYgKGZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLKSB7Ci0gICAgICAgIHJldHVybiAmbV9TdG9ja0NNWUtDUzsKLSAgICB9Ci0gICAgaWYgKGZhbWlseSA9PSBQREZDU19QQVRURVJOKSB7Ci0gICAgICAgIHJldHVybiAmbV9TdG9ja1BhdHRlcm5DUzsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7CisKK0NQREZfQ29sb3JTcGFjZSogQ1BERl9QYWdlTW9kdWxlOjpHZXRTdG9ja0NTKGludCBmYW1pbHkpIHsKKyAgaWYgKGZhbWlseSA9PSBQREZDU19ERVZJQ0VHUkFZKSB7CisgICAgcmV0dXJuICZtX1N0b2NrR3JheUNTOworICB9CisgIGlmIChmYW1pbHkgPT0gUERGQ1NfREVWSUNFUkdCKSB7CisgICAgcmV0dXJuICZtX1N0b2NrUkdCQ1M7CisgIH0KKyAgaWYgKGZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLKSB7CisgICAgcmV0dXJuICZtX1N0b2NrQ01ZS0NTOworICB9CisgIGlmIChmYW1pbHkgPT0gUERGQ1NfUEFUVEVSTikgeworICAgIHJldHVybiAmbV9TdG9ja1BhdHRlcm5DUzsKKyAgfQorICByZXR1cm4gTlVMTDsKIH0KLXZvaWQgQ1BERl9Nb2R1bGVNZ3I6OkluaXRQYWdlTW9kdWxlKCkKLXsKLSAgICBkZWxldGUgbV9wUGFnZU1vZHVsZTsKLSAgICBtX3BQYWdlTW9kdWxlID0gbmV3IENQREZfUGFnZU1vZHVsZTsKKwordm9pZCBDUERGX01vZHVsZU1ncjo6SW5pdFBhZ2VNb2R1bGUoKSB7CisgIG1fcFBhZ2VNb2R1bGUucmVzZXQobmV3IENQREZfUGFnZU1vZHVsZSk7CiB9Ci12b2lkIENQREZfUGFnZU1vZHVsZTo6UmVsZWFzZURvYyhDUERGX0RvY3VtZW50KiBwRG9jKQotewotICAgIGRlbGV0ZSBwRG9jLT5HZXRQYWdlRGF0YSgpOworCit2b2lkIENQREZfUGFnZU1vZHVsZTo6UmVsZWFzZURvYyhDUERGX0RvY3VtZW50KiBwRG9jKSB7CisgIGRlbGV0ZSBwRG9jLT5HZXRQYWdlRGF0YSgpOwogfQotdm9pZCBDUERGX1BhZ2VNb2R1bGU6OkNsZWFyRG9jKENQREZfRG9jdW1lbnQqIHBEb2MpCi17Ci0gICAgcERvYy0+R2V0UGFnZURhdGEoKS0+Q2xlYXIoRkFMU0UpOwordm9pZCBDUERGX1BhZ2VNb2R1bGU6OkNsZWFyRG9jKENQREZfRG9jdW1lbnQqIHBEb2MpIHsKKyAgcERvYy0+R2V0UGFnZURhdGEoKS0+Q2xlYXIoRkFMU0UpOwogfQotdm9pZCBDUERGX1BhZ2VNb2R1bGU6Ok5vdGlmeUNKS0F2YWlsYWJsZSgpCi17Ci0gICAgbV9Gb250R2xvYmFscy5tX0NNYXBNYW5hZ2VyLlJlbG9hZEFsbCgpOwordm9pZCBDUERGX1BhZ2VNb2R1bGU6Ok5vdGlmeUNKS0F2YWlsYWJsZSgpIHsKKyAgbV9Gb250R2xvYmFscy5tX0NNYXBNYW5hZ2VyLlJlbG9hZEFsbCgpOwogfQotQ1BERl9Gb250KiBDUERGX0RvY3VtZW50OjpMb2FkRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCkKLXsKLSAgICBpZiAoIXBGb250RGljdCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIEdldFZhbGlkYXRlUGFnZURhdGEoKS0+R2V0Rm9udChwRm9udERpY3QsIEZBTFNFKTsKKworQ1BERl9Gb250KiBDUERGX0RvY3VtZW50OjpMb2FkRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCkgeworICBBU1NFUlQocEZvbnREaWN0KTsKKyAgcmV0dXJuIEdldFZhbGlkYXRlUGFnZURhdGEoKS0+R2V0Rm9udChwRm9udERpY3QsIEZBTFNFKTsKIH0KLUNQREZfRm9udCogQ1BERl9Eb2N1bWVudDo6RmluZEZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QpCi17Ci0gICAgaWYgKCFwRm9udERpY3QpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBHZXRWYWxpZGF0ZVBhZ2VEYXRhKCktPkdldEZvbnQocEZvbnREaWN0LCBUUlVFKTsKKworQ1BERl9TdHJlYW1BY2MqIENQREZfRG9jdW1lbnQ6OkxvYWRGb250RmlsZShDUERGX1N0cmVhbSogcFN0cmVhbSkgeworICByZXR1cm4gR2V0VmFsaWRhdGVQYWdlRGF0YSgpLT5HZXRGb250RmlsZVN0cmVhbUFjYyhwU3RyZWFtKTsKIH0KLUNQREZfU3RyZWFtQWNjKiBDUERGX0RvY3VtZW50OjpMb2FkRm9udEZpbGUoQ1BERl9TdHJlYW0qIHBTdHJlYW0pCi17Ci0gICAgaWYgKHBTdHJlYW0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIEdldFZhbGlkYXRlUGFnZURhdGEoKS0+R2V0Rm9udEZpbGVTdHJlYW1BY2MocFN0cmVhbSk7Ci19CisKIENQREZfQ29sb3JTcGFjZSogX0NTRnJvbU5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOwotQ1BERl9Db2xvclNwYWNlKiBDUERGX0RvY3VtZW50OjpMb2FkQ29sb3JTcGFjZShDUERGX09iamVjdCogcENTT2JqLCBDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZXMpCi17Ci0gICAgcmV0dXJuIEdldFZhbGlkYXRlUGFnZURhdGEoKS0+R2V0Q29sb3JTcGFjZShwQ1NPYmosIHBSZXNvdXJjZXMpOworQ1BERl9Db2xvclNwYWNlKiBDUERGX0RvY3VtZW50OjpMb2FkQ29sb3JTcGFjZShDUERGX09iamVjdCogcENTT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZXMpIHsKKyAgcmV0dXJuIEdldFZhbGlkYXRlUGFnZURhdGEoKS0+R2V0Q29sb3JTcGFjZShwQ1NPYmosIHBSZXNvdXJjZXMpOwogfQotQ1BERl9QYXR0ZXJuKiBDUERGX0RvY3VtZW50OjpMb2FkUGF0dGVybihDUERGX09iamVjdCogcFBhdHRlcm5PYmosIEZYX0JPT0wgYlNoYWRpbmcsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIG1hdHJpeCkKLXsKLSAgICByZXR1cm4gR2V0VmFsaWRhdGVQYWdlRGF0YSgpLT5HZXRQYXR0ZXJuKHBQYXR0ZXJuT2JqLCBiU2hhZGluZywgbWF0cml4KTsKK0NQREZfUGF0dGVybiogQ1BERl9Eb2N1bWVudDo6TG9hZFBhdHRlcm4oQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGFkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgpIHsKKyAgcmV0dXJuIEdldFZhbGlkYXRlUGFnZURhdGEoKS0+R2V0UGF0dGVybihwUGF0dGVybk9iaiwgYlNoYWRpbmcsIG1hdHJpeCk7CiB9Ci1DUERGX0ljY1Byb2ZpbGUqIENQREZfRG9jdW1lbnQ6OkxvYWRJY2NQcm9maWxlKENQREZfU3RyZWFtKiBwU3RyZWFtKQotewotICAgIHJldHVybiBHZXRWYWxpZGF0ZVBhZ2VEYXRhKCktPkdldEljY1Byb2ZpbGUocFN0cmVhbSk7CitDUERGX0ljY1Byb2ZpbGUqIENQREZfRG9jdW1lbnQ6OkxvYWRJY2NQcm9maWxlKENQREZfU3RyZWFtKiBwU3RyZWFtKSB7CisgIHJldHVybiBHZXRWYWxpZGF0ZVBhZ2VEYXRhKCktPkdldEljY1Byb2ZpbGUocFN0cmVhbSk7CiB9Ci1DUERGX0ltYWdlKiBDUERGX0RvY3VtZW50OjpMb2FkSW1hZ2VGKENQREZfT2JqZWN0KiBwT2JqKQotewotICAgIGlmICghcE9iaikgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgRlhTWVNfYXNzZXJ0KHBPYmotPkdldE9iak51bSgpKTsKLSAgICByZXR1cm4gR2V0VmFsaWRhdGVQYWdlRGF0YSgpLT5HZXRJbWFnZShwT2JqKTsKLX0KLXZvaWQgQ1BERl9Eb2N1bWVudDo6UmVtb3ZlQ29sb3JTcGFjZUZyb21QYWdlRGF0YShDUERGX09iamVjdCogcENTT2JqKQotewotICAgIGlmICghcENTT2JqKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgR2V0UGFnZURhdGEoKS0+UmVsZWFzZUNvbG9yU3BhY2UocENTT2JqKTsKLX0KLUNQREZfRG9jUGFnZURhdGE6OkNQREZfRG9jUGFnZURhdGEoQ1BERl9Eb2N1bWVudCAqcFBERkRvYykKLSAgICA6IG1fcFBERkRvYyhwUERGRG9jKQotICAgICwgbV9Gb250TWFwKCkKLSAgICAsIG1fQ29sb3JTcGFjZU1hcCgpCi0gICAgLCBtX1BhdHRlcm5NYXAoKQotICAgICwgbV9JbWFnZU1hcCgpCi0gICAgLCBtX0ljY1Byb2ZpbGVNYXAoKQotICAgICwgbV9Gb250RmlsZU1hcCgpCi0gICAgLCBtX2JGb3JjZUNsZWFyKEZBTFNFKQotewotICAgIG1fRm9udE1hcC5Jbml0SGFzaFRhYmxlKDY0KTsKLSAgICBtX0NvbG9yU3BhY2VNYXAuSW5pdEhhc2hUYWJsZSgzMik7Ci0gICAgbV9QYXR0ZXJuTWFwLkluaXRIYXNoVGFibGUoMTYpOwotICAgIG1fSW1hZ2VNYXAuSW5pdEhhc2hUYWJsZSg2NCk7Ci0gICAgbV9JY2NQcm9maWxlTWFwLkluaXRIYXNoVGFibGUoMTYpOwotICAgIG1fRm9udEZpbGVNYXAuSW5pdEhhc2hUYWJsZSgzMik7Ci19Ci1DUERGX0RvY1BhZ2VEYXRhOjp+Q1BERl9Eb2NQYWdlRGF0YSgpCi17Ci0gICAgQ2xlYXIoRkFMU0UpOwotICAgIENsZWFyKFRSVUUpOwotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fUGF0dGVybk1hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykKLSAgICB7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwdE9iajsKLSAgICAgICAgQ1BERl9Db3VudGVkT2JqZWN0PENQREZfUGF0dGVybio+KiBwdERhdGE7Ci0gICAgICAgIG1fUGF0dGVybk1hcC5HZXROZXh0QXNzb2MocG9zLCBwdE9iaiwgcHREYXRhKTsKLSAgICAgICAgZGVsZXRlIHB0RGF0YTsKLSAgICB9Ci0gICAgbV9QYXR0ZXJuTWFwLlJlbW92ZUFsbCgpOwotICAgIHBvcyA9IG1fRm9udE1hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykKLSAgICB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogZm9udERpY3Q7Ci0gICAgICAgIENQREZfQ291bnRlZE9iamVjdDxDUERGX0ZvbnQqPiogZm9udERhdGE7Ci0gICAgICAgIG1fRm9udE1hcC5HZXROZXh0QXNzb2MocG9zLCBmb250RGljdCwgZm9udERhdGEpOwotICAgICAgICBkZWxldGUgZm9udERhdGE7Ci0gICAgfQotICAgIG1fRm9udE1hcC5SZW1vdmVBbGwoKTsKLSAgICBwb3MgPSBtX0NvbG9yU3BhY2VNYXAuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpCi0gICAgewotICAgICAgICBDUERGX09iamVjdCogY3NLZXk7Ci0gICAgICAgIENQREZfQ291bnRlZE9iamVjdDxDUERGX0NvbG9yU3BhY2UqPiogY3NEYXRhOwotICAgICAgICBtX0NvbG9yU3BhY2VNYXAuR2V0TmV4dEFzc29jKHBvcywgY3NLZXksIGNzRGF0YSk7Ci0gICAgICAgIGRlbGV0ZSBjc0RhdGE7Ci0gICAgfQotICAgIG1fQ29sb3JTcGFjZU1hcC5SZW1vdmVBbGwoKTsKLX0KLXZvaWQgQ1BERl9Eb2NQYWdlRGF0YTo6Q2xlYXIoRlhfQk9PTCBiRm9yY2VSZWxlYXNlKQotewotICAgIEZYX1BPU0lUSU9OIHBvczsKLSAgICBtX2JGb3JjZUNsZWFyID0gYkZvcmNlUmVsZWFzZTsKLSAgICBwb3MgPSBtX1BhdHRlcm5NYXAuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHB0T2JqOwotICAgICAgICBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9QYXR0ZXJuKj4qIHB0RGF0YTsKLSAgICAgICAgbV9QYXR0ZXJuTWFwLkdldE5leHRBc3NvYyhwb3MsIHB0T2JqLCBwdERhdGEpOwotICAgICAgICBpZiAoIXB0RGF0YS0+bV9PYmopIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiRm9yY2VSZWxlYXNlIHx8IHB0RGF0YS0+bV9uQ291bnQgPCAyKSB7Ci0gICAgICAgICAgICBwdERhdGEtPm1fT2JqLT5TZXRGb3JjZUNsZWFyKGJGb3JjZVJlbGVhc2UpOwotICAgICAgICAgICAgZGVsZXRlIHB0RGF0YS0+bV9PYmo7Ci0gICAgICAgICAgICBwdERhdGEtPm1fT2JqID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICBwb3MgPSBtX0ZvbnRNYXAuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBmb250RGljdDsKLSAgICAgICAgQ1BERl9Db3VudGVkT2JqZWN0PENQREZfRm9udCo+KiBmb250RGF0YTsKLSAgICAgICAgbV9Gb250TWFwLkdldE5leHRBc3NvYyhwb3MsIGZvbnREaWN0LCBmb250RGF0YSk7Ci0gICAgICAgIGlmICghZm9udERhdGEtPm1fT2JqKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYkZvcmNlUmVsZWFzZSB8fCBmb250RGF0YS0+bV9uQ291bnQgPCAyKSB7Ci0gICAgICAgICAgICBkZWxldGUgZm9udERhdGEtPm1fT2JqOwotICAgICAgICAgICAgZm9udERhdGEtPm1fT2JqID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICBwb3MgPSBtX0NvbG9yU3BhY2VNYXAuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIGNzS2V5OwotICAgICAgICBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9Db2xvclNwYWNlKj4qIGNzRGF0YTsKLSAgICAgICAgbV9Db2xvclNwYWNlTWFwLkdldE5leHRBc3NvYyhwb3MsIGNzS2V5LCBjc0RhdGEpOwotICAgICAgICBpZiAoIWNzRGF0YS0+bV9PYmopIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiRm9yY2VSZWxlYXNlIHx8IGNzRGF0YS0+bV9uQ291bnQgPCAyKSB7Ci0gICAgICAgICAgICAvLyBjc0RhdGEtPm1fT2JqIGlzIGRlbGV0ZWQgaW4gdGhlIGZ1bmN0aW9uIG9mIFJlbGVhc2VDUygpLgotICAgICAgICAgICAgY3NEYXRhLT5tX09iai0+UmVsZWFzZUNTKCk7Ci0gICAgICAgICAgICBjc0RhdGEtPm1fT2JqID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICBwb3MgPSBtX0ljY1Byb2ZpbGVNYXAuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgQ1BERl9TdHJlYW0qIGlwS2V5OwotICAgICAgICBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9JY2NQcm9maWxlKj4qIGlwRGF0YTsKLSAgICAgICAgbV9JY2NQcm9maWxlTWFwLkdldE5leHRBc3NvYyhwb3MsIGlwS2V5LCBpcERhdGEpOwotICAgICAgICBpZiAoIWlwRGF0YS0+bV9PYmopIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiRm9yY2VSZWxlYXNlIHx8IGlwRGF0YS0+bV9uQ291bnQgPCAyKSB7Ci0gICAgICAgICAgICBGWF9QT1NJVElPTiBwb3MyID0gbV9IYXNoUHJvZmlsZU1hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICB3aGlsZSAocG9zMikgewotICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzS2V5OwotICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwRmluZFN0cmVhbSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgbV9IYXNoUHJvZmlsZU1hcC5HZXROZXh0QXNzb2MocG9zMiwgYnNLZXksICh2b2lkKiYpcEZpbmRTdHJlYW0pOwotICAgICAgICAgICAgICAgIGlmIChpcEtleSA9PSBwRmluZFN0cmVhbSkgewotICAgICAgICAgICAgICAgICAgICBtX0hhc2hQcm9maWxlTWFwLlJlbW92ZUtleShic0tleSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlbGV0ZSBpcERhdGEtPm1fT2JqOwotICAgICAgICAgICAgZGVsZXRlIGlwRGF0YTsKLSAgICAgICAgICAgIG1fSWNjUHJvZmlsZU1hcC5SZW1vdmVLZXkoaXBLZXkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHBvcyA9IG1fRm9udEZpbGVNYXAuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgQ1BERl9TdHJlYW0qIGZ0S2V5OwotICAgICAgICBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9TdHJlYW1BY2MqPiogZnREYXRhOwotICAgICAgICBtX0ZvbnRGaWxlTWFwLkdldE5leHRBc3NvYyhwb3MsIGZ0S2V5LCBmdERhdGEpOwotICAgICAgICBpZiAoIWZ0RGF0YS0+bV9PYmopIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiRm9yY2VSZWxlYXNlIHx8IGZ0RGF0YS0+bV9uQ291bnQgPCAyKSB7Ci0gICAgICAgICAgICBkZWxldGUgZnREYXRhLT5tX09iajsKLSAgICAgICAgICAgIGRlbGV0ZSBmdERhdGE7Ci0gICAgICAgICAgICBtX0ZvbnRGaWxlTWFwLlJlbW92ZUtleShmdEtleSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcG9zID0gbV9JbWFnZU1hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBGWF9EV09SRCBvYmpOdW07Ci0gICAgICAgIENQREZfQ291bnRlZE9iamVjdDxDUERGX0ltYWdlKj4qIGltYWdlRGF0YTsKLSAgICAgICAgbV9JbWFnZU1hcC5HZXROZXh0QXNzb2MocG9zLCBvYmpOdW0sIGltYWdlRGF0YSk7Ci0gICAgICAgIGlmICghaW1hZ2VEYXRhLT5tX09iaikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJGb3JjZVJlbGVhc2UgfHwgaW1hZ2VEYXRhLT5tX25Db3VudCA8IDIpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBpbWFnZURhdGEtPm1fT2JqOwotICAgICAgICAgICAgZGVsZXRlIGltYWdlRGF0YTsKLSAgICAgICAgICAgIG1fSW1hZ2VNYXAuUmVtb3ZlS2V5KG9iak51bSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1DUERGX0ZvbnQqIENQREZfRG9jUGFnZURhdGE6OkdldEZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QsIEZYX0JPT0wgZmluZE9ubHkpCi17Ci0gICAgaWYgKCFwRm9udERpY3QpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChmaW5kT25seSkgewotICAgICAgICBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9Gb250Kj4qIGZvbnREYXRhOwotICAgICAgICBpZiAobV9Gb250TWFwLkxvb2t1cChwRm9udERpY3QsIGZvbnREYXRhKSkgewotICAgICAgICAgICAgaWYgKCFmb250RGF0YS0+bV9PYmopIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvbnREYXRhLT5tX25Db3VudCArKzsKLSAgICAgICAgICAgIHJldHVybiBmb250RGF0YS0+bV9PYmo7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfQ291bnRlZE9iamVjdDxDUERGX0ZvbnQqPiogZm9udERhdGEgPSBOVUxMOwotICAgIGlmIChtX0ZvbnRNYXAuTG9va3VwKHBGb250RGljdCwgZm9udERhdGEpKSB7Ci0gICAgICAgIGlmIChmb250RGF0YS0+bV9PYmopIHsKLSAgICAgICAgICAgIGZvbnREYXRhLT5tX25Db3VudCArKzsKLSAgICAgICAgICAgIHJldHVybiBmb250RGF0YS0+bV9PYmo7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlhfQk9PTCBiTmV3ID0gRkFMU0U7Ci0gICAgaWYgKCFmb250RGF0YSkgewotICAgICAgICBmb250RGF0YSA9IG5ldyBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9Gb250Kj47Ci0gICAgICAgIGJOZXcgPSBUUlVFOwotICAgIH0KLSAgICBDUERGX0ZvbnQqIHBGb250ID0gQ1BERl9Gb250OjpDcmVhdGVGb250RihtX3BQREZEb2MsIHBGb250RGljdCk7Ci0gICAgaWYgKCFwRm9udCkgewotICAgICAgICBpZiAoYk5ldykgewotICAgICAgICAgICAgZGVsZXRlIGZvbnREYXRhOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBmb250RGF0YS0+bV9uQ291bnQgPSAyOwotICAgIGZvbnREYXRhLT5tX09iaiA9IHBGb250OwotICAgIG1fRm9udE1hcC5TZXRBdChwRm9udERpY3QsIGZvbnREYXRhKTsKLSAgICByZXR1cm4gcEZvbnQ7Ci19Ci1DUERGX0ZvbnQqIENQREZfRG9jUGFnZURhdGE6OkdldFN0YW5kYXJkRm9udChGWF9CU1RSIGZvbnROYW1lLCBDUERGX0ZvbnRFbmNvZGluZyogcEVuY29kaW5nKQotewotICAgIGlmIChmb250TmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fRm9udE1hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIGZvbnREaWN0OwotICAgICAgICBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9Gb250Kj4qIGZvbnREYXRhOwotICAgICAgICBtX0ZvbnRNYXAuR2V0TmV4dEFzc29jKHBvcywgZm9udERpY3QsIGZvbnREYXRhKTsKLSAgICAgICAgQ1BERl9Gb250KiBwRm9udCA9IGZvbnREYXRhLT5tX09iajsKLSAgICAgICAgaWYgKCFwRm9udCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBGb250LT5HZXRCYXNlRm9udCgpICE9IGZvbnROYW1lKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocEZvbnQtPklzRW1iZWRkZWQoKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBGb250LT5HZXRGb250VHlwZSgpICE9IFBERkZPTlRfVFlQRTEpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwRm9udC0+R2V0Rm9udERpY3QoKS0+S2V5RXhpc3QoRlhfQlNUUkMoIldpZHRocyIpKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9UeXBlMUZvbnQqIHBUMUZvbnQgPSBwRm9udC0+R2V0VHlwZTFGb250KCk7Ci0gICAgICAgIGlmIChwRW5jb2RpbmcgJiYgIXBUMUZvbnQtPkdldEVuY29kaW5nKCktPklzSWRlbnRpY2FsKHBFbmNvZGluZykpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGZvbnREYXRhLT5tX25Db3VudCArKzsKLSAgICAgICAgcmV0dXJuIHBGb250OwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKLSAgICBwRGljdC0+U2V0QXROYW1lKEZYX0JTVFJDKCJUeXBlIiksIEZYX0JTVFJDKCJGb250IikpOwotICAgIHBEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIlN1YnR5cGUiKSwgRlhfQlNUUkMoIlR5cGUxIikpOwotICAgIHBEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIkJhc2VGb250IiksIGZvbnROYW1lKTsKLSAgICBpZiAocEVuY29kaW5nKSB7Ci0gICAgICAgIHBEaWN0LT5TZXRBdChGWF9CU1RSQygiRW5jb2RpbmciKSwgcEVuY29kaW5nLT5SZWFsaXplKCkpOwotICAgIH0KLSAgICBtX3BQREZEb2MtPkFkZEluZGlyZWN0T2JqZWN0KHBEaWN0KTsKLSAgICBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9Gb250Kj4qIGZvbnREYXRhID0gbmV3IENQREZfQ291bnRlZE9iamVjdDxDUERGX0ZvbnQqPjsKLSAgICBDUERGX0ZvbnQqIHBGb250ID0gQ1BERl9Gb250OjpDcmVhdGVGb250RihtX3BQREZEb2MsIHBEaWN0KTsKLSAgICBpZiAoIXBGb250KSB7Ci0gICAgICAgIGRlbGV0ZSBmb250RGF0YTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGZvbnREYXRhLT5tX25Db3VudCA9IDI7Ci0gICAgZm9udERhdGEtPm1fT2JqID0gcEZvbnQ7Ci0gICAgbV9Gb250TWFwLlNldEF0KHBEaWN0LCBmb250RGF0YSk7Ci0gICAgcmV0dXJuIHBGb250OwotfQotdm9pZCBDUERGX0RvY1BhZ2VEYXRhOjpSZWxlYXNlRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCkKLXsKLSAgICBpZiAoIXBGb250RGljdCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfQ291bnRlZE9iamVjdDxDUERGX0ZvbnQqPiogZm9udERhdGE7Ci0gICAgaWYgKCFtX0ZvbnRNYXAuTG9va3VwKHBGb250RGljdCwgZm9udERhdGEpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGZvbnREYXRhLT5tX09iaiAmJiAtLWZvbnREYXRhLT5tX25Db3VudCA9PSAwKSB7Ci0gICAgICAgIGRlbGV0ZSBmb250RGF0YS0+bV9PYmo7Ci0gICAgICAgIGZvbnREYXRhLT5tX09iaiA9IE5VTEw7Ci0gICAgfQotfQotQ1BERl9Db2xvclNwYWNlKiBDUERGX0RvY1BhZ2VEYXRhOjpHZXRDb2xvclNwYWNlKENQREZfT2JqZWN0KiBwQ1NPYmosIENQREZfRGljdGlvbmFyeSogcFJlc291cmNlcykKLXsKLSAgICBpZiAoIXBDU09iaikgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKHBDU09iai0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIG5hbWUgPSBwQ1NPYmotPkdldENvbnN0U3RyaW5nKCk7Ci0gICAgICAgIENQREZfQ29sb3JTcGFjZSogcENTID0gX0NTRnJvbU5hbWUobmFtZSk7Ci0gICAgICAgIGlmICghcENTICYmIHBSZXNvdXJjZXMpIHsKLSAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcExpc3QgPSBwUmVzb3VyY2VzLT5HZXREaWN0KEZYX0JTVFJDKCJDb2xvclNwYWNlIikpOwotICAgICAgICAgICAgaWYgKHBMaXN0KSB7Ci0gICAgICAgICAgICAgICAgcENTT2JqID0gcExpc3QtPkdldEVsZW1lbnRWYWx1ZShuYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0Q29sb3JTcGFjZShwQ1NPYmosIE5VTEwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwQ1MgPT0gTlVMTCB8fCBwUmVzb3VyY2VzID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBwQ1M7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQ29sb3JTcGFjZXMgPSBwUmVzb3VyY2VzLT5HZXREaWN0KEZYX0JTVFJDKCJDb2xvclNwYWNlIikpOwotICAgICAgICBpZiAocENvbG9yU3BhY2VzID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBwQ1M7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9PYmplY3QqIHBEZWZhdWx0Q1MgPSBOVUxMOwotICAgICAgICBzd2l0Y2ggKHBDUy0+R2V0RmFtaWx5KCkpIHsKLSAgICAgICAgICAgIGNhc2UgUERGQ1NfREVWSUNFUkdCOgotICAgICAgICAgICAgICAgIHBEZWZhdWx0Q1MgPSBwQ29sb3JTcGFjZXMtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRGVmYXVsdFJHQiIpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUERGQ1NfREVWSUNFR1JBWToKLSAgICAgICAgICAgICAgICBwRGVmYXVsdENTID0gcENvbG9yU3BhY2VzLT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkRlZmF1bHRHcmF5IikpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQREZDU19ERVZJQ0VDTVlLOgotICAgICAgICAgICAgICAgIHBEZWZhdWx0Q1MgPSBwQ29sb3JTcGFjZXMtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRGVmYXVsdENNWUsiKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBEZWZhdWx0Q1MgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIHBDUzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gR2V0Q29sb3JTcGFjZShwRGVmYXVsdENTLCBOVUxMKTsKLSAgICB9Ci0gICAgaWYgKHBDU09iai0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBDU09iajsKLSAgICBpZiAocEFycmF5LT5HZXRDb3VudCgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChwQXJyYXktPkdldENvdW50KCkgPT0gMSkgewotICAgICAgICByZXR1cm4gR2V0Q29sb3JTcGFjZShwQXJyYXktPkdldEVsZW1lbnRWYWx1ZSgwKSwgcFJlc291cmNlcyk7Ci0gICAgfQotICAgIENQREZfQ291bnRlZE9iamVjdDxDUERGX0NvbG9yU3BhY2UqPiogY3NEYXRhID0gTlVMTDsKLSAgICBpZiAobV9Db2xvclNwYWNlTWFwLkxvb2t1cChwQ1NPYmosIGNzRGF0YSkpIHsKLSAgICAgICAgaWYgKGNzRGF0YS0+bV9PYmopIHsKLSAgICAgICAgICAgIGNzRGF0YS0+bV9uQ291bnQrKzsKLSAgICAgICAgICAgIHJldHVybiBjc0RhdGEtPm1fT2JqOwotICAgICAgICB9Ci0gICAgfQotICAgIEZYX0JPT0wgYk5ldyA9IEZBTFNFOwotICAgIGlmICghY3NEYXRhKSB7Ci0gICAgICAgIGNzRGF0YSA9IG5ldyBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9Db2xvclNwYWNlKj47Ci0gICAgICAgIGJOZXcgPSBUUlVFOwotICAgIH0KLSAgICBDUERGX0NvbG9yU3BhY2UqIHBDUyA9IENQREZfQ29sb3JTcGFjZTo6TG9hZChtX3BQREZEb2MsIHBBcnJheSk7Ci0gICAgaWYgKCFwQ1MpIHsKLSAgICAgICAgaWYgKGJOZXcpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBjc0RhdGE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGNzRGF0YS0+bV9uQ291bnQgPSAyOwotICAgIGNzRGF0YS0+bV9PYmogPSBwQ1M7Ci0gICAgbV9Db2xvclNwYWNlTWFwLlNldEF0KHBDU09iaiwgY3NEYXRhKTsKLSAgICByZXR1cm4gcENTOwotfQotQ1BERl9Db2xvclNwYWNlKiBDUERGX0RvY1BhZ2VEYXRhOjpHZXRDb3BpZWRDb2xvclNwYWNlKENQREZfT2JqZWN0KiBwQ1NPYmopCi17Ci0gICAgaWYgKCFwQ1NPYmopIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfQ291bnRlZE9iamVjdDxDUERGX0NvbG9yU3BhY2UqPiogY3NEYXRhOwotICAgIGlmICghbV9Db2xvclNwYWNlTWFwLkxvb2t1cChwQ1NPYmosIGNzRGF0YSkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmICghY3NEYXRhLT5tX09iaikgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgY3NEYXRhLT5tX25Db3VudCArKzsKLSAgICByZXR1cm4gY3NEYXRhLT5tX09iajsKLX0KLXZvaWQgQ1BERl9Eb2NQYWdlRGF0YTo6UmVsZWFzZUNvbG9yU3BhY2UoQ1BERl9PYmplY3QqIHBDb2xvclNwYWNlKQotewotICAgIGlmICghcENvbG9yU3BhY2UpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9Db2xvclNwYWNlKj4qIGNzRGF0YTsKLSAgICBpZiAoIW1fQ29sb3JTcGFjZU1hcC5Mb29rdXAocENvbG9yU3BhY2UsIGNzRGF0YSkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoY3NEYXRhLT5tX09iaiAmJiAtLWNzRGF0YS0+bV9uQ291bnQgPT0gMCkgewotICAgICAgICBjc0RhdGEtPm1fT2JqLT5SZWxlYXNlQ1MoKTsKLSAgICAgICAgY3NEYXRhLT5tX09iaiA9IE5VTEw7Ci0gICAgfQotfQotQ1BERl9QYXR0ZXJuKiBDUERGX0RvY1BhZ2VEYXRhOjpHZXRQYXR0ZXJuKENQREZfT2JqZWN0KiBwUGF0dGVybk9iaiwgRlhfQk9PTCBiU2hhZGluZywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogbWF0cml4KQotewotICAgIGlmICghcFBhdHRlcm5PYmopIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfQ291bnRlZE9iamVjdDxDUERGX1BhdHRlcm4qPiogcHREYXRhID0gTlVMTDsKLSAgICBpZiAobV9QYXR0ZXJuTWFwLkxvb2t1cChwUGF0dGVybk9iaiwgcHREYXRhKSkgewotICAgICAgICBpZiAocHREYXRhLT5tX09iaikgewotICAgICAgICAgICAgcHREYXRhLT5tX25Db3VudCsrOwotICAgICAgICAgICAgcmV0dXJuIHB0RGF0YS0+bV9PYmo7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlhfQk9PTCBiTmV3ID0gRkFMU0U7Ci0gICAgaWYgKCFwdERhdGEpIHsKLSAgICAgICAgcHREYXRhID0gbmV3IENQREZfQ291bnRlZE9iamVjdDxDUERGX1BhdHRlcm4qPjsKLSAgICAgICAgYk5ldyA9IFRSVUU7Ci0gICAgfQotICAgIENQREZfUGF0dGVybiogcFBhdHRlcm4gPSBOVUxMOwotICAgIGlmIChiU2hhZGluZykgewotICAgICAgICBwUGF0dGVybiA9IG5ldyBDUERGX1NoYWRpbmdQYXR0ZXJuKG1fcFBERkRvYywgcFBhdHRlcm5PYmosIGJTaGFkaW5nLCBtYXRyaXgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwUGF0dGVybk9iaiA/IHBQYXR0ZXJuT2JqLT5HZXREaWN0KCkgOiBOVUxMOwotICAgICAgICBpZiAocERpY3QpIHsKLSAgICAgICAgICAgIGludCB0eXBlID0gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIlBhdHRlcm5UeXBlIikpOwotICAgICAgICAgICAgaWYgKHR5cGUgPT0gMSkgewotICAgICAgICAgICAgICAgIHBQYXR0ZXJuID0gbmV3IENQREZfVGlsaW5nUGF0dGVybihtX3BQREZEb2MsIHBQYXR0ZXJuT2JqLCBtYXRyaXgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IDIpIHsKLSAgICAgICAgICAgICAgICBwUGF0dGVybiA9IG5ldyBDUERGX1NoYWRpbmdQYXR0ZXJuKG1fcFBERkRvYywgcFBhdHRlcm5PYmosIEZBTFNFLCBtYXRyaXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghcFBhdHRlcm4pIHsKLSAgICAgICAgaWYgKGJOZXcpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwdERhdGE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHB0RGF0YS0+bV9uQ291bnQgPSAyOwotICAgIHB0RGF0YS0+bV9PYmogPSBwUGF0dGVybjsKLSAgICBtX1BhdHRlcm5NYXAuU2V0QXQocFBhdHRlcm5PYmosIHB0RGF0YSk7Ci0gICAgcmV0dXJuIHBQYXR0ZXJuOwotfQotdm9pZCBDUERGX0RvY1BhZ2VEYXRhOjpSZWxlYXNlUGF0dGVybihDUERGX09iamVjdCogcFBhdHRlcm5PYmopCi17Ci0gICAgaWYgKCFwUGF0dGVybk9iaikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfQ291bnRlZE9iamVjdDxDUERGX1BhdHRlcm4qPiogcHREYXRhOwotICAgIGlmICghbV9QYXR0ZXJuTWFwLkxvb2t1cChwUGF0dGVybk9iaiwgcHREYXRhKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwdERhdGEtPm1fT2JqICYmIC0tcHREYXRhLT5tX25Db3VudCA9PSAwKSB7Ci0gICAgICAgIGRlbGV0ZSBwdERhdGEtPm1fT2JqOwotICAgICAgICBwdERhdGEtPm1fT2JqID0gTlVMTDsKLSAgICB9Ci19Ci1DUERGX0ltYWdlKiBDUERGX0RvY1BhZ2VEYXRhOjpHZXRJbWFnZShDUERGX09iamVjdCogcEltYWdlU3RyZWFtKQotewotICAgIGlmICghcEltYWdlU3RyZWFtKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBGWF9EV09SRCBkd0ltYWdlT2JqTnVtID0gcEltYWdlU3RyZWFtLT5HZXRPYmpOdW0oKTsKLSAgICBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9JbWFnZSo+KiBpbWFnZURhdGE7Ci0gICAgaWYgKG1fSW1hZ2VNYXAuTG9va3VwKGR3SW1hZ2VPYmpOdW0sIGltYWdlRGF0YSkpIHsKLSAgICAgICAgaW1hZ2VEYXRhLT5tX25Db3VudCArKzsKLSAgICAgICAgcmV0dXJuIGltYWdlRGF0YS0+bV9PYmo7Ci0gICAgfQotICAgIGltYWdlRGF0YSA9IG5ldyBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9JbWFnZSo+OwotICAgIENQREZfSW1hZ2UqIHBJbWFnZSA9IG5ldyBDUERGX0ltYWdlKG1fcFBERkRvYyk7Ci0gICAgcEltYWdlLT5Mb2FkSW1hZ2VGKChDUERGX1N0cmVhbSopcEltYWdlU3RyZWFtLCBGQUxTRSk7Ci0gICAgaW1hZ2VEYXRhLT5tX25Db3VudCA9IDI7Ci0gICAgaW1hZ2VEYXRhLT5tX09iaiA9IHBJbWFnZTsKLSAgICBtX0ltYWdlTWFwLlNldEF0KGR3SW1hZ2VPYmpOdW0sIGltYWdlRGF0YSk7Ci0gICAgcmV0dXJuIHBJbWFnZTsKLX0KLXZvaWQgQ1BERl9Eb2NQYWdlRGF0YTo6UmVsZWFzZUltYWdlKENQREZfT2JqZWN0KiBwSW1hZ2VTdHJlYW0pCi17Ci0gICAgaWYgKCFwSW1hZ2VTdHJlYW0pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBQREZfRG9jUGFnZURhdGFfUmVsZWFzZTxGWF9EV09SRCwgQ1BERl9JbWFnZSo+KG1fSW1hZ2VNYXAsIHBJbWFnZVN0cmVhbS0+R2V0T2JqTnVtKCksIE5VTEwpOwotfQotQ1BERl9JY2NQcm9maWxlKiBDUERGX0RvY1BhZ2VEYXRhOjpHZXRJY2NQcm9maWxlKENQREZfU3RyZWFtKiBwSWNjUHJvZmlsZVN0cmVhbSkKLXsKLSAgICBpZiAoIXBJY2NQcm9maWxlU3RyZWFtKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9JY2NQcm9maWxlKj4qIGlwRGF0YSA9IE5VTEw7Ci0gICAgaWYgKG1fSWNjUHJvZmlsZU1hcC5Mb29rdXAocEljY1Byb2ZpbGVTdHJlYW0sIGlwRGF0YSkpIHsKLSAgICAgICAgaXBEYXRhLT5tX25Db3VudCsrOwotICAgICAgICByZXR1cm4gaXBEYXRhLT5tX09iajsKLSAgICB9Ci0gICAgQ1BERl9TdHJlYW1BY2Mgc3RyZWFtOwotICAgIHN0cmVhbS5Mb2FkQWxsRGF0YShwSWNjUHJvZmlsZVN0cmVhbSwgRkFMU0UpOwotICAgIEZYX0JZVEUgZGlnZXN0WzIwXTsKLSAgICBDUERGX1N0cmVhbSogcENvcGllZFN0cmVhbSA9IE5VTEw7Ci0gICAgQ1JZUFRfU0hBMUdlbmVyYXRlKHN0cmVhbS5HZXREYXRhKCksIHN0cmVhbS5HZXRTaXplKCksIGRpZ2VzdCk7Ci0gICAgaWYgKG1fSGFzaFByb2ZpbGVNYXAuTG9va3VwKENGWF9CeXRlU3RyaW5nQyhkaWdlc3QsIDIwKSwgKHZvaWQqJilwQ29waWVkU3RyZWFtKSkgewotICAgICAgICBtX0ljY1Byb2ZpbGVNYXAuTG9va3VwKHBDb3BpZWRTdHJlYW0sIGlwRGF0YSk7Ci0gICAgICAgIGlwRGF0YS0+bV9uQ291bnQrKzsKLSAgICAgICAgcmV0dXJuIGlwRGF0YS0+bV9PYmo7Ci0gICAgfQotICAgIENQREZfSWNjUHJvZmlsZSogcFByb2ZpbGUgPSBuZXcgQ1BERl9JY2NQcm9maWxlKHN0cmVhbS5HZXREYXRhKCksIHN0cmVhbS5HZXRTaXplKCkpOwotICAgIGlwRGF0YSA9IG5ldyBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9JY2NQcm9maWxlKj47Ci0gICAgaXBEYXRhLT5tX25Db3VudCA9IDI7Ci0gICAgaXBEYXRhLT5tX09iaiA9IHBQcm9maWxlOwotICAgIG1fSWNjUHJvZmlsZU1hcC5TZXRBdChwSWNjUHJvZmlsZVN0cmVhbSwgaXBEYXRhKTsKLSAgICBtX0hhc2hQcm9maWxlTWFwLlNldEF0KENGWF9CeXRlU3RyaW5nQyhkaWdlc3QsIDIwKSwgcEljY1Byb2ZpbGVTdHJlYW0pOwotICAgIHJldHVybiBwUHJvZmlsZTsKLX0KLXZvaWQgQ1BERl9Eb2NQYWdlRGF0YTo6UmVsZWFzZUljY1Byb2ZpbGUoQ1BERl9TdHJlYW0qIHBJY2NQcm9maWxlU3RyZWFtLCBDUERGX0ljY1Byb2ZpbGUqIHBJY2NQcm9maWxlKQotewotICAgIGlmICghcEljY1Byb2ZpbGVTdHJlYW0gJiYgIXBJY2NQcm9maWxlKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9Db3VudGVkT2JqZWN0PENQREZfSWNjUHJvZmlsZSo+KiBpcERhdGEgPSBOVUxMOwotICAgIGlmIChtX0ljY1Byb2ZpbGVNYXAuTG9va3VwKHBJY2NQcm9maWxlU3RyZWFtLCBpcERhdGEpICYmIGlwRGF0YS0+bV9uQ291bnQgPCAyKSB7Ci0gICAgICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fSGFzaFByb2ZpbGVNYXAuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgICAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBrZXk7Ci0gICAgICAgICAgICBDUERGX1N0cmVhbSogcEZpbmRTdHJlYW0gPSBOVUxMOwotICAgICAgICAgICAgbV9IYXNoUHJvZmlsZU1hcC5HZXROZXh0QXNzb2MocG9zLCBrZXksICh2b2lkKiYpcEZpbmRTdHJlYW0pOwotICAgICAgICAgICAgaWYgKHBJY2NQcm9maWxlU3RyZWFtID09IHBGaW5kU3RyZWFtKSB7Ci0gICAgICAgICAgICAgICAgbV9IYXNoUHJvZmlsZU1hcC5SZW1vdmVLZXkoa2V5KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBQREZfRG9jUGFnZURhdGFfUmVsZWFzZTxDUERGX1N0cmVhbSosIENQREZfSWNjUHJvZmlsZSo+KG1fSWNjUHJvZmlsZU1hcCwgcEljY1Byb2ZpbGVTdHJlYW0sIHBJY2NQcm9maWxlKTsKLX0KLUNQREZfU3RyZWFtQWNjKiBDUERGX0RvY1BhZ2VEYXRhOjpHZXRGb250RmlsZVN0cmVhbUFjYyhDUERGX1N0cmVhbSogcEZvbnRTdHJlYW0pCi17Ci0gICAgaWYgKCFwRm9udFN0cmVhbSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9Db3VudGVkT2JqZWN0PENQREZfU3RyZWFtQWNjKj4qIGZ0RGF0YTsKLSAgICBpZiAobV9Gb250RmlsZU1hcC5Mb29rdXAocEZvbnRTdHJlYW0sIGZ0RGF0YSkpIHsKLSAgICAgICAgZnREYXRhLT5tX25Db3VudCArKzsKLSAgICAgICAgcmV0dXJuIGZ0RGF0YS0+bV9PYmo7Ci0gICAgfQotICAgIGZ0RGF0YSA9IG5ldyBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9TdHJlYW1BY2MqPjsKLSAgICBDUERGX1N0cmVhbUFjYyogcEZvbnRGaWxlID0gbmV3IENQREZfU3RyZWFtQWNjOwotICAgIENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0ID0gcEZvbnRTdHJlYW0tPkdldERpY3QoKTsKLSAgICBGWF9JTlQzMiBvcmdfc2l6ZSA9IHBGb250RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoMSIpKSArIHBGb250RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoMiIpKSArIHBGb250RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoMyIpKTsKLSAgICBpZiAob3JnX3NpemUgPCAwKSB7Ci0gICAgICAgIG9yZ19zaXplID0gMDsKLSAgICB9Ci0gICAgcEZvbnRGaWxlLT5Mb2FkQWxsRGF0YShwRm9udFN0cmVhbSwgRkFMU0UsIG9yZ19zaXplKTsKLSAgICBmdERhdGEtPm1fbkNvdW50ID0gMjsKLSAgICBmdERhdGEtPm1fT2JqID0gcEZvbnRGaWxlOwotICAgIG1fRm9udEZpbGVNYXAuU2V0QXQocEZvbnRTdHJlYW0sIGZ0RGF0YSk7Ci0gICAgcmV0dXJuIHBGb250RmlsZTsKLX0KLXZvaWQgQ1BERl9Eb2NQYWdlRGF0YTo6UmVsZWFzZUZvbnRGaWxlU3RyZWFtQWNjKENQREZfU3RyZWFtKiBwRm9udFN0cmVhbSwgRlhfQk9PTCBiRm9yY2UpCi17Ci0gICAgaWYgKCFwRm9udFN0cmVhbSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIFBERl9Eb2NQYWdlRGF0YV9SZWxlYXNlPENQREZfU3RyZWFtKiwgQ1BERl9TdHJlYW1BY2MqPihtX0ZvbnRGaWxlTWFwLCBwRm9udFN0cmVhbSwgTlVMTCwgYkZvcmNlKTsKLX0KLUNQREZfQ291bnRlZENvbG9yU3BhY2UqIENQREZfRG9jUGFnZURhdGE6OkZpbmRDb2xvclNwYWNlUHRyKENQREZfT2JqZWN0KiBwQ1NPYmopIGNvbnN0Ci17Ci0gICAgaWYgKCFwQ1NPYmopIHJldHVybiBOVUxMOwotICAgIENQREZfQ291bnRlZE9iamVjdDxDUERGX0NvbG9yU3BhY2UqPiogY3NEYXRhOwotICAgIGlmIChtX0NvbG9yU3BhY2VNYXAuTG9va3VwKHBDU09iaiwgY3NEYXRhKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjc0RhdGE7Ci0gICAgfQorQ1BERl9JbWFnZSogQ1BERl9Eb2N1bWVudDo6TG9hZEltYWdlRihDUERGX09iamVjdCogcE9iaikgeworICBpZiAoIXBPYmopIHsKICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBGWFNZU19hc3NlcnQocE9iai0+R2V0T2JqTnVtKCkpOworICByZXR1cm4gR2V0VmFsaWRhdGVQYWdlRGF0YSgpLT5HZXRJbWFnZShwT2JqKTsKIH0KLUNQREZfQ291bnRlZFBhdHRlcm4qIENQREZfRG9jUGFnZURhdGE6OkZpbmRQYXR0ZXJuUHRyKENQREZfT2JqZWN0KiBwUGF0dGVybk9iaikgY29uc3QKLXsKLSAgICBpZiAoIXBQYXR0ZXJuT2JqKSByZXR1cm4gTlVMTDsKLSAgICBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9QYXR0ZXJuKj4qIHB0RGF0YTsKLSAgICBpZiAobV9QYXR0ZXJuTWFwLkxvb2t1cChwUGF0dGVybk9iaiwgcHREYXRhKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwdERhdGE7Cit2b2lkIENQREZfRG9jdW1lbnQ6OlJlbW92ZUNvbG9yU3BhY2VGcm9tUGFnZURhdGEoQ1BERl9PYmplY3QqIHBDU09iaikgeworICBpZiAoIXBDU09iaikgeworICAgIHJldHVybjsKKyAgfQorICBHZXRQYWdlRGF0YSgpLT5SZWxlYXNlQ29sb3JTcGFjZShwQ1NPYmopOworfQorQ1BERl9Eb2NQYWdlRGF0YTo6Q1BERl9Eb2NQYWdlRGF0YShDUERGX0RvY3VtZW50KiBwUERGRG9jKQorICAgIDogbV9wUERGRG9jKHBQREZEb2MpLCBtX2JGb3JjZUNsZWFyKEZBTFNFKSB7fQorCitDUERGX0RvY1BhZ2VEYXRhOjp+Q1BERl9Eb2NQYWdlRGF0YSgpIHsKKyAgQ2xlYXIoRkFMU0UpOworICBDbGVhcihUUlVFKTsKKworICBmb3IgKGF1dG8mIGl0IDogbV9QYXR0ZXJuTWFwKQorICAgIGRlbGV0ZSBpdC5zZWNvbmQ7CisgIG1fUGF0dGVybk1hcC5jbGVhcigpOworCisgIGZvciAoYXV0byYgaXQgOiBtX0ZvbnRNYXApCisgICAgZGVsZXRlIGl0LnNlY29uZDsKKyAgbV9Gb250TWFwLmNsZWFyKCk7CisKKyAgZm9yIChhdXRvJiBpdCA6IG1fQ29sb3JTcGFjZU1hcCkKKyAgICBkZWxldGUgaXQuc2Vjb25kOworICBtX0NvbG9yU3BhY2VNYXAuY2xlYXIoKTsKK30KKwordm9pZCBDUERGX0RvY1BhZ2VEYXRhOjpDbGVhcihGWF9CT09MIGJGb3JjZVJlbGVhc2UpIHsKKyAgbV9iRm9yY2VDbGVhciA9IGJGb3JjZVJlbGVhc2U7CisKKyAgZm9yIChhdXRvJiBpdCA6IG1fUGF0dGVybk1hcCkgeworICAgIENQREZfQ291bnRlZFBhdHRlcm4qIHB0RGF0YSA9IGl0LnNlY29uZDsKKyAgICBpZiAoIXB0RGF0YS0+Z2V0KCkpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChiRm9yY2VSZWxlYXNlIHx8IHB0RGF0YS0+dXNlX2NvdW50KCkgPCAyKSB7CisgICAgICBwdERhdGEtPmdldCgpLT5TZXRGb3JjZUNsZWFyKGJGb3JjZVJlbGVhc2UpOworICAgICAgcHREYXRhLT5jbGVhcigpOwogICAgIH0KKyAgfQorCisgIGZvciAoYXV0byYgaXQgOiBtX0ZvbnRNYXApIHsKKyAgICBDUERGX0NvdW50ZWRGb250KiBmb250RGF0YSA9IGl0LnNlY29uZDsKKyAgICBpZiAoIWZvbnREYXRhLT5nZXQoKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKGJGb3JjZVJlbGVhc2UgfHwgZm9udERhdGEtPnVzZV9jb3VudCgpIDwgMikgeworICAgICAgZm9udERhdGEtPmNsZWFyKCk7CisgICAgfQorICB9CisKKyAgZm9yIChhdXRvJiBpdCA6IG1fQ29sb3JTcGFjZU1hcCkgeworICAgIENQREZfQ291bnRlZENvbG9yU3BhY2UqIGNzRGF0YSA9IGl0LnNlY29uZDsKKyAgICBpZiAoIWNzRGF0YS0+Z2V0KCkpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChiRm9yY2VSZWxlYXNlIHx8IGNzRGF0YS0+dXNlX2NvdW50KCkgPCAyKSB7CisgICAgICBjc0RhdGEtPmdldCgpLT5SZWxlYXNlQ1MoKTsKKyAgICAgIGNzRGF0YS0+cmVzZXQobnVsbHB0cik7CisgICAgfQorICB9CisKKyAgZm9yIChhdXRvIGl0ID0gbV9JY2NQcm9maWxlTWFwLmJlZ2luKCk7IGl0ICE9IG1fSWNjUHJvZmlsZU1hcC5lbmQoKTspIHsKKyAgICBhdXRvIGN1cnJfaXQgPSBpdCsrOworICAgIENQREZfQ291bnRlZEljY1Byb2ZpbGUqIGlwRGF0YSA9IGN1cnJfaXQtPnNlY29uZDsKKyAgICBpZiAoIWlwRGF0YS0+Z2V0KCkpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChiRm9yY2VSZWxlYXNlIHx8IGlwRGF0YS0+dXNlX2NvdW50KCkgPCAyKSB7CisgICAgICBmb3IgKGF1dG8gaGFzaF9pdCA9IG1fSGFzaFByb2ZpbGVNYXAuYmVnaW4oKTsKKyAgICAgICAgICAgaGFzaF9pdCAhPSBtX0hhc2hQcm9maWxlTWFwLmVuZCgpOyArK2hhc2hfaXQpIHsKKyAgICAgICAgaWYgKGN1cnJfaXQtPmZpcnN0ID09IGhhc2hfaXQtPnNlY29uZCkgeworICAgICAgICAgIG1fSGFzaFByb2ZpbGVNYXAuZXJhc2UoaGFzaF9pdCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGRlbGV0ZSBpcERhdGEtPmdldCgpOworICAgICAgZGVsZXRlIGlwRGF0YTsKKyAgICAgIG1fSWNjUHJvZmlsZU1hcC5lcmFzZShjdXJyX2l0KTsKKyAgICB9CisgIH0KKworICBmb3IgKGF1dG8gaXQgPSBtX0ZvbnRGaWxlTWFwLmJlZ2luKCk7IGl0ICE9IG1fRm9udEZpbGVNYXAuZW5kKCk7KSB7CisgICAgYXV0byBjdXJyX2l0ID0gaXQrKzsKKyAgICBDUERGX0NvdW50ZWRTdHJlYW1BY2MqIGZ0RGF0YSA9IGN1cnJfaXQtPnNlY29uZDsKKyAgICBpZiAoIWZ0RGF0YS0+Z2V0KCkpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChiRm9yY2VSZWxlYXNlIHx8IGZ0RGF0YS0+dXNlX2NvdW50KCkgPCAyKSB7CisgICAgICBkZWxldGUgZnREYXRhLT5nZXQoKTsKKyAgICAgIGRlbGV0ZSBmdERhdGE7CisgICAgICBtX0ZvbnRGaWxlTWFwLmVyYXNlKGN1cnJfaXQpOworICAgIH0KKyAgfQorCisgIGZvciAoYXV0byBpdCA9IG1fSW1hZ2VNYXAuYmVnaW4oKTsgaXQgIT0gbV9JbWFnZU1hcC5lbmQoKTspIHsKKyAgICBhdXRvIGN1cnJfaXQgPSBpdCsrOworICAgIENQREZfQ291bnRlZEltYWdlKiBpbWFnZURhdGEgPSBjdXJyX2l0LT5zZWNvbmQ7CisgICAgaWYgKCFpbWFnZURhdGEtPmdldCgpKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoYkZvcmNlUmVsZWFzZSB8fCBpbWFnZURhdGEtPnVzZV9jb3VudCgpIDwgMikgeworICAgICAgZGVsZXRlIGltYWdlRGF0YS0+Z2V0KCk7CisgICAgICBkZWxldGUgaW1hZ2VEYXRhOworICAgICAgbV9JbWFnZU1hcC5lcmFzZShjdXJyX2l0KTsKKyAgICB9CisgIH0KK30KKworQ1BERl9Gb250KiBDUERGX0RvY1BhZ2VEYXRhOjpHZXRGb250KENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgZmluZE9ubHkpIHsKKyAgaWYgKCFwRm9udERpY3QpIHsKICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoZmluZE9ubHkpIHsKKyAgICBhdXRvIGl0ID0gbV9Gb250TWFwLmZpbmQocEZvbnREaWN0KTsKKyAgICBpZiAoaXQgIT0gbV9Gb250TWFwLmVuZCgpICYmIGl0LT5zZWNvbmQtPmdldCgpKSB7CisgICAgICByZXR1cm4gaXQtPnNlY29uZC0+QWRkUmVmKCk7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgQ1BERl9Db3VudGVkRm9udCogZm9udERhdGEgPSBudWxscHRyOworICBhdXRvIGl0ID0gbV9Gb250TWFwLmZpbmQocEZvbnREaWN0KTsKKyAgaWYgKGl0ICE9IG1fRm9udE1hcC5lbmQoKSkgeworICAgIGZvbnREYXRhID0gaXQtPnNlY29uZDsKKyAgICBpZiAoZm9udERhdGEtPmdldCgpKSB7CisgICAgICByZXR1cm4gZm9udERhdGEtPkFkZFJlZigpOworICAgIH0KKyAgfQorCisgIENQREZfRm9udCogcEZvbnQgPSBDUERGX0ZvbnQ6OkNyZWF0ZUZvbnRGKG1fcFBERkRvYywgcEZvbnREaWN0KTsKKyAgaWYgKCFwRm9udCkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGlmICghZm9udERhdGEpIHsKKyAgICBmb250RGF0YSA9IG5ldyBDUERGX0NvdW50ZWRGb250KHBGb250KTsKKyAgICBtX0ZvbnRNYXBbcEZvbnREaWN0XSA9IGZvbnREYXRhOworICB9IGVsc2UgeworICAgIGZvbnREYXRhLT5yZXNldChwRm9udCk7CisgIH0KKyAgcmV0dXJuIGZvbnREYXRhLT5BZGRSZWYoKTsKK30KKworQ1BERl9Gb250KiBDUERGX0RvY1BhZ2VEYXRhOjpHZXRTdGFuZGFyZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmb250TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udEVuY29kaW5nKiBwRW5jb2RpbmcpIHsKKyAgaWYgKGZvbnROYW1lLklzRW1wdHkoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBmb3IgKGF1dG8mIGl0IDogbV9Gb250TWFwKSB7CisgICAgQ1BERl9Db3VudGVkRm9udCogZm9udERhdGEgPSBpdC5zZWNvbmQ7CisgICAgQ1BERl9Gb250KiBwRm9udCA9IGZvbnREYXRhLT5nZXQoKTsKKyAgICBpZiAoIXBGb250KQorICAgICAgY29udGludWU7CisgICAgaWYgKHBGb250LT5HZXRCYXNlRm9udCgpICE9IGZvbnROYW1lKQorICAgICAgY29udGludWU7CisgICAgaWYgKHBGb250LT5Jc0VtYmVkZGVkKCkpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAocEZvbnQtPkdldEZvbnRUeXBlKCkgIT0gUERGRk9OVF9UWVBFMSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChwRm9udC0+R2V0Rm9udERpY3QoKS0+S2V5RXhpc3QoIldpZHRocyIpKQorICAgICAgY29udGludWU7CisKKyAgICBDUERGX1R5cGUxRm9udCogcFQxRm9udCA9IHBGb250LT5HZXRUeXBlMUZvbnQoKTsKKyAgICBpZiAocEVuY29kaW5nICYmICFwVDFGb250LT5HZXRFbmNvZGluZygpLT5Jc0lkZW50aWNhbChwRW5jb2RpbmcpKQorICAgICAgY29udGludWU7CisKKyAgICByZXR1cm4gZm9udERhdGEtPkFkZFJlZigpOworICB9CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgIHBEaWN0LT5TZXRBdE5hbWUoIlR5cGUiLCAiRm9udCIpOworICBwRGljdC0+U2V0QXROYW1lKCJTdWJ0eXBlIiwgIlR5cGUxIik7CisgIHBEaWN0LT5TZXRBdE5hbWUoIkJhc2VGb250IiwgZm9udE5hbWUpOworICBpZiAocEVuY29kaW5nKSB7CisgICAgcERpY3QtPlNldEF0KCJFbmNvZGluZyIsIHBFbmNvZGluZy0+UmVhbGl6ZSgpKTsKKyAgfQorICBtX3BQREZEb2MtPkFkZEluZGlyZWN0T2JqZWN0KHBEaWN0KTsKKyAgQ1BERl9Gb250KiBwRm9udCA9IENQREZfRm9udDo6Q3JlYXRlRm9udEYobV9wUERGRG9jLCBwRGljdCk7CisgIGlmICghcEZvbnQpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBDUERGX0NvdW50ZWRGb250KiBmb250RGF0YSA9IG5ldyBDUERGX0NvdW50ZWRGb250KHBGb250KTsKKyAgbV9Gb250TWFwW3BEaWN0XSA9IGZvbnREYXRhOworICByZXR1cm4gZm9udERhdGEtPkFkZFJlZigpOworfQorCit2b2lkIENQREZfRG9jUGFnZURhdGE6OlJlbGVhc2VGb250KENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0KSB7CisgIGlmICghcEZvbnREaWN0KQorICAgIHJldHVybjsKKworICBhdXRvIGl0ID0gbV9Gb250TWFwLmZpbmQocEZvbnREaWN0KTsKKyAgaWYgKGl0ID09IG1fRm9udE1hcC5lbmQoKSkKKyAgICByZXR1cm47CisKKyAgQ1BERl9Db3VudGVkRm9udCogZm9udERhdGEgPSBpdC0+c2Vjb25kOworICBpZiAoZm9udERhdGEtPmdldCgpKSB7CisgICAgZm9udERhdGEtPlJlbW92ZVJlZigpOworICAgIGlmIChmb250RGF0YS0+dXNlX2NvdW50KCkgPT0gMCkgeworICAgICAgZm9udERhdGEtPmNsZWFyKCk7CisgICAgfQorICB9Cit9CisKK0NQREZfQ29sb3JTcGFjZSogQ1BERl9Eb2NQYWdlRGF0YTo6R2V0Q29sb3JTcGFjZSgKKyAgICBDUERGX09iamVjdCogcENTT2JqLAorICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFJlc291cmNlcykgeworICBpZiAoIXBDU09iaikKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBpZiAocENTT2JqLT5Jc05hbWUoKSkgeworICAgIENGWF9CeXRlU3RyaW5nIG5hbWUgPSBwQ1NPYmotPkdldENvbnN0U3RyaW5nKCk7CisgICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBfQ1NGcm9tTmFtZShuYW1lKTsKKyAgICBpZiAoIXBDUyAmJiBwUmVzb3VyY2VzKSB7CisgICAgICBDUERGX0RpY3Rpb25hcnkqIHBMaXN0ID0gcFJlc291cmNlcy0+R2V0RGljdCgiQ29sb3JTcGFjZSIpOworICAgICAgaWYgKHBMaXN0KSB7CisgICAgICAgIHBDU09iaiA9IHBMaXN0LT5HZXRFbGVtZW50VmFsdWUobmFtZSk7CisgICAgICAgIHJldHVybiBHZXRDb2xvclNwYWNlKHBDU09iaiwgbnVsbHB0cik7CisgICAgICB9CisgICAgfQorICAgIGlmICghcENTIHx8ICFwUmVzb3VyY2VzKQorICAgICAgcmV0dXJuIHBDUzsKKworICAgIENQREZfRGljdGlvbmFyeSogcENvbG9yU3BhY2VzID0gcFJlc291cmNlcy0+R2V0RGljdCgiQ29sb3JTcGFjZSIpOworICAgIGlmICghcENvbG9yU3BhY2VzKQorICAgICAgcmV0dXJuIHBDUzsKKworICAgIENQREZfT2JqZWN0KiBwRGVmYXVsdENTID0gbnVsbHB0cjsKKyAgICBzd2l0Y2ggKHBDUy0+R2V0RmFtaWx5KCkpIHsKKyAgICAgIGNhc2UgUERGQ1NfREVWSUNFUkdCOgorICAgICAgICBwRGVmYXVsdENTID0gcENvbG9yU3BhY2VzLT5HZXRFbGVtZW50VmFsdWUoIkRlZmF1bHRSR0IiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBERkNTX0RFVklDRUdSQVk6CisgICAgICAgIHBEZWZhdWx0Q1MgPSBwQ29sb3JTcGFjZXMtPkdldEVsZW1lbnRWYWx1ZSgiRGVmYXVsdEdyYXkiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBERkNTX0RFVklDRUNNWUs6CisgICAgICAgIHBEZWZhdWx0Q1MgPSBwQ29sb3JTcGFjZXMtPkdldEVsZW1lbnRWYWx1ZSgiRGVmYXVsdENNWUsiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBwRGVmYXVsdENTID8gR2V0Q29sb3JTcGFjZShwRGVmYXVsdENTLCBudWxscHRyKSA6IHBDUzsKKyAgfQorCisgIENQREZfQXJyYXkqIHBBcnJheSA9IHBDU09iai0+QXNBcnJheSgpOworICBpZiAoIXBBcnJheSB8fCBwQXJyYXktPkdldENvdW50KCkgPT0gMCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgaWYgKHBBcnJheS0+R2V0Q291bnQoKSA9PSAxKQorICAgIHJldHVybiBHZXRDb2xvclNwYWNlKHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKDApLCBwUmVzb3VyY2VzKTsKKworICBDUERGX0NvdW50ZWRDb2xvclNwYWNlKiBjc0RhdGEgPSBudWxscHRyOworICBhdXRvIGl0ID0gbV9Db2xvclNwYWNlTWFwLmZpbmQocENTT2JqKTsKKyAgaWYgKGl0ICE9IG1fQ29sb3JTcGFjZU1hcC5lbmQoKSkgeworICAgIGNzRGF0YSA9IGl0LT5zZWNvbmQ7CisgICAgaWYgKGNzRGF0YS0+Z2V0KCkpIHsKKyAgICAgIHJldHVybiBjc0RhdGEtPkFkZFJlZigpOworICAgIH0KKyAgfQorCisgIENQREZfQ29sb3JTcGFjZSogcENTID0gQ1BERl9Db2xvclNwYWNlOjpMb2FkKG1fcFBERkRvYywgcEFycmF5KTsKKyAgaWYgKCFwQ1MpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgaWYgKCFjc0RhdGEpIHsKKyAgICBjc0RhdGEgPSBuZXcgQ1BERl9Db3VudGVkQ29sb3JTcGFjZShwQ1MpOworICAgIG1fQ29sb3JTcGFjZU1hcFtwQ1NPYmpdID0gY3NEYXRhOworICB9IGVsc2UgeworICAgIGNzRGF0YS0+cmVzZXQocENTKTsKKyAgfQorICByZXR1cm4gY3NEYXRhLT5BZGRSZWYoKTsKK30KKworQ1BERl9Db2xvclNwYWNlKiBDUERGX0RvY1BhZ2VEYXRhOjpHZXRDb3BpZWRDb2xvclNwYWNlKENQREZfT2JqZWN0KiBwQ1NPYmopIHsKKyAgaWYgKCFwQ1NPYmopCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgYXV0byBpdCA9IG1fQ29sb3JTcGFjZU1hcC5maW5kKHBDU09iaik7CisgIGlmIChpdCAhPSBtX0NvbG9yU3BhY2VNYXAuZW5kKCkpCisgICAgcmV0dXJuIGl0LT5zZWNvbmQtPkFkZFJlZigpOworCisgIHJldHVybiBudWxscHRyOworfQorCit2b2lkIENQREZfRG9jUGFnZURhdGE6OlJlbGVhc2VDb2xvclNwYWNlKENQREZfT2JqZWN0KiBwQ29sb3JTcGFjZSkgeworICBpZiAoIXBDb2xvclNwYWNlKQorICAgIHJldHVybjsKKworICBhdXRvIGl0ID0gbV9Db2xvclNwYWNlTWFwLmZpbmQocENvbG9yU3BhY2UpOworICBpZiAoaXQgPT0gbV9Db2xvclNwYWNlTWFwLmVuZCgpKQorICAgIHJldHVybjsKKworICBDUERGX0NvdW50ZWRDb2xvclNwYWNlKiBjc0RhdGEgPSBpdC0+c2Vjb25kOworICBpZiAoY3NEYXRhLT5nZXQoKSkgeworICAgIGNzRGF0YS0+UmVtb3ZlUmVmKCk7CisgICAgaWYgKGNzRGF0YS0+dXNlX2NvdW50KCkgPT0gMCkgeworICAgICAgY3NEYXRhLT5nZXQoKS0+UmVsZWFzZUNTKCk7CisgICAgICBjc0RhdGEtPnJlc2V0KG51bGxwdHIpOworICAgIH0KKyAgfQorfQorCitDUERGX1BhdHRlcm4qIENQREZfRG9jUGFnZURhdGE6OkdldFBhdHRlcm4oQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoYWRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4KSB7CisgIGlmICghcFBhdHRlcm5PYmopCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgQ1BERl9Db3VudGVkUGF0dGVybiogcHREYXRhID0gbnVsbHB0cjsKKyAgYXV0byBpdCA9IG1fUGF0dGVybk1hcC5maW5kKHBQYXR0ZXJuT2JqKTsKKyAgaWYgKGl0ICE9IG1fUGF0dGVybk1hcC5lbmQoKSkgeworICAgIHB0RGF0YSA9IGl0LT5zZWNvbmQ7CisgICAgaWYgKHB0RGF0YS0+Z2V0KCkpIHsKKyAgICAgIHJldHVybiBwdERhdGEtPkFkZFJlZigpOworICAgIH0KKyAgfQorICBDUERGX1BhdHRlcm4qIHBQYXR0ZXJuID0gbnVsbHB0cjsKKyAgaWYgKGJTaGFkaW5nKSB7CisgICAgcFBhdHRlcm4gPQorICAgICAgICBuZXcgQ1BERl9TaGFkaW5nUGF0dGVybihtX3BQREZEb2MsIHBQYXR0ZXJuT2JqLCBiU2hhZGluZywgbWF0cml4KTsKKyAgfSBlbHNlIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFBhdHRlcm5PYmogPyBwUGF0dGVybk9iai0+R2V0RGljdCgpIDogbnVsbHB0cjsKKyAgICBpZiAocERpY3QpIHsKKyAgICAgIGludCB0eXBlID0gcERpY3QtPkdldEludGVnZXIoIlBhdHRlcm5UeXBlIik7CisgICAgICBpZiAodHlwZSA9PSAxKSB7CisgICAgICAgIHBQYXR0ZXJuID0gbmV3IENQREZfVGlsaW5nUGF0dGVybihtX3BQREZEb2MsIHBQYXR0ZXJuT2JqLCBtYXRyaXgpOworICAgICAgfSBlbHNlIGlmICh0eXBlID09IDIpIHsKKyAgICAgICAgcFBhdHRlcm4gPQorICAgICAgICAgICAgbmV3IENQREZfU2hhZGluZ1BhdHRlcm4obV9wUERGRG9jLCBwUGF0dGVybk9iaiwgRkFMU0UsIG1hdHJpeCk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmICghcFBhdHRlcm4pCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgaWYgKCFwdERhdGEpIHsKKyAgICBwdERhdGEgPSBuZXcgQ1BERl9Db3VudGVkUGF0dGVybihwUGF0dGVybik7CisgICAgbV9QYXR0ZXJuTWFwW3BQYXR0ZXJuT2JqXSA9IHB0RGF0YTsKKyAgfSBlbHNlIHsKKyAgICBwdERhdGEtPnJlc2V0KHBQYXR0ZXJuKTsKKyAgfQorICByZXR1cm4gcHREYXRhLT5BZGRSZWYoKTsKK30KKwordm9pZCBDUERGX0RvY1BhZ2VEYXRhOjpSZWxlYXNlUGF0dGVybihDUERGX09iamVjdCogcFBhdHRlcm5PYmopIHsKKyAgaWYgKCFwUGF0dGVybk9iaikKKyAgICByZXR1cm47CisKKyAgYXV0byBpdCA9IG1fUGF0dGVybk1hcC5maW5kKHBQYXR0ZXJuT2JqKTsKKyAgaWYgKGl0ID09IG1fUGF0dGVybk1hcC5lbmQoKSkKKyAgICByZXR1cm47CisKKyAgQ1BERl9Db3VudGVkUGF0dGVybiogcHREYXRhID0gaXQtPnNlY29uZDsKKyAgaWYgKHB0RGF0YS0+Z2V0KCkpIHsKKyAgICBwdERhdGEtPlJlbW92ZVJlZigpOworICAgIGlmIChwdERhdGEtPnVzZV9jb3VudCgpID09IDApIHsKKyAgICAgIHB0RGF0YS0+Y2xlYXIoKTsKKyAgICB9CisgIH0KK30KKworQ1BERl9JbWFnZSogQ1BERl9Eb2NQYWdlRGF0YTo6R2V0SW1hZ2UoQ1BERl9PYmplY3QqIHBJbWFnZVN0cmVhbSkgeworICBpZiAoIXBJbWFnZVN0cmVhbSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBjb25zdCBGWF9EV09SRCBkd0ltYWdlT2JqTnVtID0gcEltYWdlU3RyZWFtLT5HZXRPYmpOdW0oKTsKKyAgYXV0byBpdCA9IG1fSW1hZ2VNYXAuZmluZChkd0ltYWdlT2JqTnVtKTsKKyAgaWYgKGl0ICE9IG1fSW1hZ2VNYXAuZW5kKCkpIHsKKyAgICByZXR1cm4gaXQtPnNlY29uZC0+QWRkUmVmKCk7CisgIH0KKworICBDUERGX0ltYWdlKiBwSW1hZ2UgPSBuZXcgQ1BERl9JbWFnZShtX3BQREZEb2MpOworICBwSW1hZ2UtPkxvYWRJbWFnZUYocEltYWdlU3RyZWFtLT5Bc1N0cmVhbSgpLCBGQUxTRSk7CisKKyAgQ1BERl9Db3VudGVkSW1hZ2UqIGltYWdlRGF0YSA9IG5ldyBDUERGX0NvdW50ZWRJbWFnZShwSW1hZ2UpOworICBtX0ltYWdlTWFwW2R3SW1hZ2VPYmpOdW1dID0gaW1hZ2VEYXRhOworICByZXR1cm4gaW1hZ2VEYXRhLT5BZGRSZWYoKTsKK30KKwordm9pZCBDUERGX0RvY1BhZ2VEYXRhOjpSZWxlYXNlSW1hZ2UoQ1BERl9PYmplY3QqIHBJbWFnZVN0cmVhbSkgeworICBpZiAoIXBJbWFnZVN0cmVhbSB8fCAhcEltYWdlU3RyZWFtLT5HZXRPYmpOdW0oKSkKKyAgICByZXR1cm47CisKKyAgYXV0byBpdCA9IG1fSW1hZ2VNYXAuZmluZChwSW1hZ2VTdHJlYW0tPkdldE9iak51bSgpKTsKKyAgaWYgKGl0ID09IG1fSW1hZ2VNYXAuZW5kKCkpCisgICAgcmV0dXJuOworCisgIENQREZfQ291bnRlZEltYWdlKiBpbWFnZSA9IGl0LT5zZWNvbmQ7CisgIGlmICghaW1hZ2UpCisgICAgcmV0dXJuOworCisgIGltYWdlLT5SZW1vdmVSZWYoKTsKKyAgaWYgKGltYWdlLT51c2VfY291bnQoKSA9PSAwKSB7CisgICAgZGVsZXRlIGltYWdlLT5nZXQoKTsKKyAgICBkZWxldGUgaW1hZ2U7CisgICAgbV9JbWFnZU1hcC5lcmFzZShpdCk7CisgIH0KK30KKworQ1BERl9JY2NQcm9maWxlKiBDUERGX0RvY1BhZ2VEYXRhOjpHZXRJY2NQcm9maWxlKAorICAgIENQREZfU3RyZWFtKiBwSWNjUHJvZmlsZVN0cmVhbSkgeworICBpZiAoIXBJY2NQcm9maWxlU3RyZWFtKQorICAgIHJldHVybiBOVUxMOworCisgIGF1dG8gaXQgPSBtX0ljY1Byb2ZpbGVNYXAuZmluZChwSWNjUHJvZmlsZVN0cmVhbSk7CisgIGlmIChpdCAhPSBtX0ljY1Byb2ZpbGVNYXAuZW5kKCkpIHsKKyAgICByZXR1cm4gaXQtPnNlY29uZC0+QWRkUmVmKCk7CisgIH0KKworICBDUERGX1N0cmVhbUFjYyBzdHJlYW07CisgIHN0cmVhbS5Mb2FkQWxsRGF0YShwSWNjUHJvZmlsZVN0cmVhbSwgRkFMU0UpOworICB1aW50OF90IGRpZ2VzdFsyMF07CisgIENSWVBUX1NIQTFHZW5lcmF0ZShzdHJlYW0uR2V0RGF0YSgpLCBzdHJlYW0uR2V0U2l6ZSgpLCBkaWdlc3QpOworICBhdXRvIGhhc2hfaXQgPSBtX0hhc2hQcm9maWxlTWFwLmZpbmQoQ0ZYX0J5dGVTdHJpbmdDKGRpZ2VzdCwgMjApKTsKKyAgaWYgKGhhc2hfaXQgIT0gbV9IYXNoUHJvZmlsZU1hcC5lbmQoKSkgeworICAgIGF1dG8gaXRfY29waWVkX3N0cmVhbSA9IG1fSWNjUHJvZmlsZU1hcC5maW5kKGhhc2hfaXQtPnNlY29uZCk7CisgICAgcmV0dXJuIGl0X2NvcGllZF9zdHJlYW0tPnNlY29uZC0+QWRkUmVmKCk7CisgIH0KKyAgQ1BERl9JY2NQcm9maWxlKiBwUHJvZmlsZSA9CisgICAgICBuZXcgQ1BERl9JY2NQcm9maWxlKHN0cmVhbS5HZXREYXRhKCksIHN0cmVhbS5HZXRTaXplKCkpOworICBDUERGX0NvdW50ZWRJY2NQcm9maWxlKiBpcERhdGEgPSBuZXcgQ1BERl9Db3VudGVkSWNjUHJvZmlsZShwUHJvZmlsZSk7CisgIG1fSWNjUHJvZmlsZU1hcFtwSWNjUHJvZmlsZVN0cmVhbV0gPSBpcERhdGE7CisgIG1fSGFzaFByb2ZpbGVNYXBbQ0ZYX0J5dGVTdHJpbmdDKGRpZ2VzdCwgMjApXSA9IHBJY2NQcm9maWxlU3RyZWFtOworICByZXR1cm4gaXBEYXRhLT5BZGRSZWYoKTsKK30KKwordm9pZCBDUERGX0RvY1BhZ2VEYXRhOjpSZWxlYXNlSWNjUHJvZmlsZShDUERGX0ljY1Byb2ZpbGUqIHBJY2NQcm9maWxlKSB7CisgIEFTU0VSVChwSWNjUHJvZmlsZSk7CisKKyAgZm9yIChhdXRvIGl0ID0gbV9JY2NQcm9maWxlTWFwLmJlZ2luKCk7IGl0ICE9IG1fSWNjUHJvZmlsZU1hcC5lbmQoKTsgKytpdCkgeworICAgIENQREZfQ291bnRlZEljY1Byb2ZpbGUqIHByb2ZpbGUgPSBpdC0+c2Vjb25kOworICAgIGlmIChwcm9maWxlLT5nZXQoKSAhPSBwSWNjUHJvZmlsZSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgcHJvZmlsZS0+UmVtb3ZlUmVmKCk7CisgICAgaWYgKHByb2ZpbGUtPnVzZV9jb3VudCgpID09IDApIHsKKyAgICAgIGRlbGV0ZSBwcm9maWxlLT5nZXQoKTsKKyAgICAgIGRlbGV0ZSBwcm9maWxlOworICAgICAgbV9JY2NQcm9maWxlTWFwLmVyYXNlKGl0KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KK30KKworQ1BERl9TdHJlYW1BY2MqIENQREZfRG9jUGFnZURhdGE6OkdldEZvbnRGaWxlU3RyZWFtQWNjKAorICAgIENQREZfU3RyZWFtKiBwRm9udFN0cmVhbSkgeworICBBU1NFUlQocEZvbnRTdHJlYW0pOworCisgIGF1dG8gaXQgPSBtX0ZvbnRGaWxlTWFwLmZpbmQocEZvbnRTdHJlYW0pOworICBpZiAoaXQgIT0gbV9Gb250RmlsZU1hcC5lbmQoKSkKKyAgICByZXR1cm4gaXQtPnNlY29uZC0+QWRkUmVmKCk7CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QgPSBwRm9udFN0cmVhbS0+R2V0RGljdCgpOworICBpbnQzMl90IG9yZ19zaXplID0gcEZvbnREaWN0LT5HZXRJbnRlZ2VyKCJMZW5ndGgxIikgKworICAgICAgICAgICAgICAgICAgICAgcEZvbnREaWN0LT5HZXRJbnRlZ2VyKCJMZW5ndGgyIikgKworICAgICAgICAgICAgICAgICAgICAgcEZvbnREaWN0LT5HZXRJbnRlZ2VyKCJMZW5ndGgzIik7CisgIGlmIChvcmdfc2l6ZSA8IDApCisgICAgb3JnX3NpemUgPSAwOworCisgIENQREZfU3RyZWFtQWNjKiBwRm9udEZpbGUgPSBuZXcgQ1BERl9TdHJlYW1BY2M7CisgIHBGb250RmlsZS0+TG9hZEFsbERhdGEocEZvbnRTdHJlYW0sIEZBTFNFLCBvcmdfc2l6ZSk7CisKKyAgQ1BERl9Db3VudGVkU3RyZWFtQWNjKiBmdERhdGEgPSBuZXcgQ1BERl9Db3VudGVkU3RyZWFtQWNjKHBGb250RmlsZSk7CisgIG1fRm9udEZpbGVNYXBbcEZvbnRTdHJlYW1dID0gZnREYXRhOworICByZXR1cm4gZnREYXRhLT5BZGRSZWYoKTsKK30KKwordm9pZCBDUERGX0RvY1BhZ2VEYXRhOjpSZWxlYXNlRm9udEZpbGVTdHJlYW1BY2MoQ1BERl9TdHJlYW0qIHBGb250U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRm9yY2UpIHsKKyAgaWYgKCFwRm9udFN0cmVhbSkKKyAgICByZXR1cm47CisKKyAgYXV0byBpdCA9IG1fRm9udEZpbGVNYXAuZmluZChwRm9udFN0cmVhbSk7CisgIGlmIChpdCA9PSBtX0ZvbnRGaWxlTWFwLmVuZCgpKQorICAgIHJldHVybjsKKworICBDUERGX0NvdW50ZWRTdHJlYW1BY2MqIGZpbmREYXRhID0gaXQtPnNlY29uZDsKKyAgaWYgKCFmaW5kRGF0YSkKKyAgICByZXR1cm47CisKKyAgZmluZERhdGEtPlJlbW92ZVJlZigpOworICBpZiAoZmluZERhdGEtPnVzZV9jb3VudCgpID09IDAgfHwgYkZvcmNlKSB7CisgICAgZGVsZXRlIGZpbmREYXRhLT5nZXQoKTsKKyAgICBkZWxldGUgZmluZERhdGE7CisgICAgbV9Gb250RmlsZU1hcC5lcmFzZShpdCk7CisgIH0KK30KKworQ1BERl9Db3VudGVkQ29sb3JTcGFjZSogQ1BERl9Eb2NQYWdlRGF0YTo6RmluZENvbG9yU3BhY2VQdHIoCisgICAgQ1BERl9PYmplY3QqIHBDU09iaikgY29uc3QgeworICBpZiAoIXBDU09iaikKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBhdXRvIGl0ID0gbV9Db2xvclNwYWNlTWFwLmZpbmQocENTT2JqKTsKKyAgcmV0dXJuIGl0ICE9IG1fQ29sb3JTcGFjZU1hcC5lbmQoKSA/IGl0LT5zZWNvbmQgOiBudWxscHRyOworfQorCitDUERGX0NvdW50ZWRQYXR0ZXJuKiBDUERGX0RvY1BhZ2VEYXRhOjpGaW5kUGF0dGVyblB0cigKKyAgICBDUERGX09iamVjdCogcFBhdHRlcm5PYmopIGNvbnN0IHsKKyAgaWYgKCFwUGF0dGVybk9iaikKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBhdXRvIGl0ID0gbV9QYXR0ZXJuTWFwLmZpbmQocFBhdHRlcm5PYmopOworICByZXR1cm4gaXQgIT0gbV9QYXR0ZXJuTWFwLmVuZCgpID8gaXQtPnNlY29uZCA6IG51bGxwdHI7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZnVuYy5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZnVuYy5jcHAKaW5kZXggODFjNGQ1My4uMTUyMjJmYyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2Z1bmMuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9mdW5jLmNwcApAQCAtMSw5MDUgKzEsOTI3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKKyNpbmNsdWRlICJwYWdlaW50LmgiCisKICNpbmNsdWRlIDxsaW1pdHMuaD4KIAotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2UuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9zcmMvZnhjcnQvZnhfc2FmZV90eXBlcy5oIgotI2luY2x1ZGUgIi4uLy4uLy4uLy4uL3RoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9jb252ZXJzaW9uc19pbXBsLmgiCi0jaW5jbHVkZSAicGFnZWludC5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zYWZlX3R5cGVzLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9udW1lcmljcy9zYWZlX2NvbnZlcnNpb25zX2ltcGwuaCIKIAogY2xhc3MgQ1BERl9QU0VuZ2luZTsKLXR5cGVkZWYgZW51bSB7UFNPUF9BREQsIFBTT1BfU1VCLCBQU09QX01VTCwgUFNPUF9ESVYsIFBTT1BfSURJViwgUFNPUF9NT0QsCi0gICAgICAgICAgICAgIFBTT1BfTkVHLCBQU09QX0FCUywgUFNPUF9DRUlMSU5HLCBQU09QX0ZMT09SLCBQU09QX1JPVU5ELCBQU09QX1RSVU5DQVRFLAotICAgICAgICAgICAgICBQU09QX1NRUlQsIFBTT1BfU0lOLCBQU09QX0NPUywgUFNPUF9BVEFOLCBQU09QX0VYUCwgUFNPUF9MTiwgUFNPUF9MT0csCi0gICAgICAgICAgICAgIFBTT1BfQ1ZJLCBQU09QX0NWUiwgUFNPUF9FUSwgUFNPUF9ORSwgUFNPUF9HVCwgUFNPUF9HRSwgUFNPUF9MVCwgUFNPUF9MRSwKLSAgICAgICAgICAgICAgUFNPUF9BTkQsIFBTT1BfT1IsIFBTT1BfWE9SLCBQU09QX05PVCwgUFNPUF9CSVRTSElGVCwgUFNPUF9UUlVFLCBQU09QX0ZBTFNFLAotICAgICAgICAgICAgICBQU09QX0lGLCBQU09QX0lGRUxTRSwgUFNPUF9QT1AsIFBTT1BfRVhDSCwgUFNPUF9EVVAsIFBTT1BfQ09QWSwKLSAgICAgICAgICAgICAgUFNPUF9JTkRFWCwgUFNPUF9ST0xMLCBQU09QX1BST0MsIFBTT1BfQ09OU1QKLSAgICAgICAgICAgICB9IFBERl9QU09QOwotY2xhc3MgQ1BERl9QU1Byb2MgCi17Ci1wdWJsaWM6Ci0gICAgfkNQREZfUFNQcm9jKCk7Ci0gICAgRlhfQk9PTAlQYXJzZShDUERGX1NpbXBsZVBhcnNlciYgcGFyc2VyKTsKLSAgICBGWF9CT09MCUV4ZWN1dGUoQ1BERl9QU0VuZ2luZSogcEVuZ2luZSk7Ci0gICAgQ0ZYX1B0ckFycmF5CQltX09wZXJhdG9yczsKK3R5cGVkZWYgZW51bSB7CisgIFBTT1BfQURELAorICBQU09QX1NVQiwKKyAgUFNPUF9NVUwsCisgIFBTT1BfRElWLAorICBQU09QX0lESVYsCisgIFBTT1BfTU9ELAorICBQU09QX05FRywKKyAgUFNPUF9BQlMsCisgIFBTT1BfQ0VJTElORywKKyAgUFNPUF9GTE9PUiwKKyAgUFNPUF9ST1VORCwKKyAgUFNPUF9UUlVOQ0FURSwKKyAgUFNPUF9TUVJULAorICBQU09QX1NJTiwKKyAgUFNPUF9DT1MsCisgIFBTT1BfQVRBTiwKKyAgUFNPUF9FWFAsCisgIFBTT1BfTE4sCisgIFBTT1BfTE9HLAorICBQU09QX0NWSSwKKyAgUFNPUF9DVlIsCisgIFBTT1BfRVEsCisgIFBTT1BfTkUsCisgIFBTT1BfR1QsCisgIFBTT1BfR0UsCisgIFBTT1BfTFQsCisgIFBTT1BfTEUsCisgIFBTT1BfQU5ELAorICBQU09QX09SLAorICBQU09QX1hPUiwKKyAgUFNPUF9OT1QsCisgIFBTT1BfQklUU0hJRlQsCisgIFBTT1BfVFJVRSwKKyAgUFNPUF9GQUxTRSwKKyAgUFNPUF9JRiwKKyAgUFNPUF9JRkVMU0UsCisgIFBTT1BfUE9QLAorICBQU09QX0VYQ0gsCisgIFBTT1BfRFVQLAorICBQU09QX0NPUFksCisgIFBTT1BfSU5ERVgsCisgIFBTT1BfUk9MTCwKKyAgUFNPUF9QUk9DLAorICBQU09QX0NPTlNUCit9IFBERl9QU09QOworY2xhc3MgQ1BERl9QU1Byb2MgeworIHB1YmxpYzoKKyAgfkNQREZfUFNQcm9jKCk7CisgIEZYX0JPT0wgUGFyc2UoQ1BERl9TaW1wbGVQYXJzZXImIHBhcnNlcik7CisgIEZYX0JPT0wgRXhlY3V0ZShDUERGX1BTRW5naW5lKiBwRW5naW5lKTsKKyAgQ0ZYX1B0ckFycmF5IG1fT3BlcmF0b3JzOwogfTsKICNkZWZpbmUgUFNFTkdJTkVfU1RBQ0tTSVpFIDEwMAotY2xhc3MgQ1BERl9QU0VuZ2luZSAKLXsKLXB1YmxpYzoKLSAgICBDUERGX1BTRW5naW5lKCk7Ci0gICAgfkNQREZfUFNFbmdpbmUoKTsKLSAgICBGWF9CT09MCVBhcnNlKGNvbnN0IEZYX0NIQVIqIHN0cmluZywgaW50IHNpemUpOwotICAgIEZYX0JPT0wJRXhlY3V0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9NYWluUHJvYy5FeGVjdXRlKHRoaXMpOwotICAgIH0KLSAgICBGWF9CT09MCURvT3BlcmF0b3IoUERGX1BTT1Agb3ApOwotICAgIHZvaWQJUmVzZXQoKQotICAgIHsKLSAgICAgICAgbV9TdGFja0NvdW50ID0gMDsKLSAgICB9Ci0gICAgdm9pZAlQdXNoKEZYX0ZMT0FUIHZhbHVlKTsKLSAgICB2b2lkCVB1c2goaW50IHZhbHVlKQotICAgIHsKLSAgICAgICAgUHVzaCgoRlhfRkxPQVQpdmFsdWUpOwotICAgIH0KLSAgICBGWF9GTE9BVAlQb3AoKTsKLSAgICBpbnQJCUdldFN0YWNrU2l6ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9TdGFja0NvdW50OwotICAgIH0KLXByaXZhdGU6Ci0gICAgRlhfRkxPQVQJbV9TdGFja1tQU0VOR0lORV9TVEFDS1NJWkVdOwotICAgIGludAkJbV9TdGFja0NvdW50OwotICAgIENQREZfUFNQcm9jCW1fTWFpblByb2M7CitjbGFzcyBDUERGX1BTRW5naW5lIHsKKyBwdWJsaWM6CisgIENQREZfUFNFbmdpbmUoKTsKKyAgfkNQREZfUFNFbmdpbmUoKTsKKyAgRlhfQk9PTCBQYXJzZShjb25zdCBGWF9DSEFSKiBzdHJpbmcsIGludCBzaXplKTsKKyAgRlhfQk9PTCBFeGVjdXRlKCkgeyByZXR1cm4gbV9NYWluUHJvYy5FeGVjdXRlKHRoaXMpOyB9CisgIEZYX0JPT0wgRG9PcGVyYXRvcihQREZfUFNPUCBvcCk7CisgIHZvaWQgUmVzZXQoKSB7IG1fU3RhY2tDb3VudCA9IDA7IH0KKyAgdm9pZCBQdXNoKEZYX0ZMT0FUIHZhbHVlKTsKKyAgdm9pZCBQdXNoKGludCB2YWx1ZSkgeyBQdXNoKChGWF9GTE9BVCl2YWx1ZSk7IH0KKyAgRlhfRkxPQVQgUG9wKCk7CisgIGludCBHZXRTdGFja1NpemUoKSB7IHJldHVybiBtX1N0YWNrQ291bnQ7IH0KKworIHByaXZhdGU6CisgIEZYX0ZMT0FUIG1fU3RhY2tbUFNFTkdJTkVfU1RBQ0tTSVpFXTsKKyAgaW50IG1fU3RhY2tDb3VudDsKKyAgQ1BERl9QU1Byb2MgbV9NYWluUHJvYzsKIH07Ci1DUERGX1BTUHJvYzo6fkNQREZfUFNQcm9jKCkKLXsKLSAgICBpbnQgc2l6ZSA9IG1fT3BlcmF0b3JzLkdldFNpemUoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkgKyspIHsKLSAgICAgICAgaWYgKG1fT3BlcmF0b3JzW2ldID09IChGWF9MUFZPSUQpUFNPUF9QUk9DKSB7Ci0gICAgICAgICAgICBkZWxldGUgKENQREZfUFNQcm9jKiltX09wZXJhdG9yc1tpICsgMV07Ci0gICAgICAgICAgICBpICsrOwotICAgICAgICB9IGVsc2UgaWYgKG1fT3BlcmF0b3JzW2ldID09IChGWF9MUFZPSUQpUFNPUF9DT05TVCkgewotICAgICAgICAgICAgRlhfRnJlZSgoRlhfRkxPQVQqKW1fT3BlcmF0b3JzW2kgKyAxXSk7Ci0gICAgICAgICAgICBpICsrOwotICAgICAgICB9CitDUERGX1BTUHJvYzo6fkNQREZfUFNQcm9jKCkgeworICBpbnQgc2l6ZSA9IG1fT3BlcmF0b3JzLkdldFNpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBpZiAobV9PcGVyYXRvcnNbaV0gPT0gKHZvaWQqKVBTT1BfUFJPQykgeworICAgICAgZGVsZXRlIChDUERGX1BTUHJvYyopbV9PcGVyYXRvcnNbaSArIDFdOworICAgICAgaSsrOworICAgIH0gZWxzZSBpZiAobV9PcGVyYXRvcnNbaV0gPT0gKHZvaWQqKVBTT1BfQ09OU1QpIHsKKyAgICAgIEZYX0ZyZWUoKEZYX0ZMT0FUKiltX09wZXJhdG9yc1tpICsgMV0pOworICAgICAgaSsrOwogICAgIH0KKyAgfQogfQotRlhfQk9PTCBDUERGX1BTUHJvYzo6RXhlY3V0ZShDUERGX1BTRW5naW5lKiBwRW5naW5lKQotewotICAgIGludCBzaXplID0gbV9PcGVyYXRvcnMuR2V0U2l6ZSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSArKykgewotICAgICAgICBQREZfUFNPUCBvcCA9IChQREZfUFNPUCkoRlhfVUlOVFBUUiltX09wZXJhdG9yc1tpXTsKLSAgICAgICAgaWYgKG9wID09IFBTT1BfUFJPQykgewotICAgICAgICAgICAgaSArKzsKLSAgICAgICAgfSBlbHNlIGlmIChvcCA9PSBQU09QX0NPTlNUKSB7Ci0gICAgICAgICAgICBwRW5naW5lLT5QdXNoKCooRlhfRkxPQVQqKW1fT3BlcmF0b3JzW2kgKyAxXSk7Ci0gICAgICAgICAgICBpICsrOwotICAgICAgICB9IGVsc2UgaWYgKG9wID09IFBTT1BfSUYpIHsKLSAgICAgICAgICAgIGlmIChpIDwgMiB8fCBtX09wZXJhdG9yc1tpIC0gMl0gIT0gKEZYX0xQVk9JRClQU09QX1BST0MpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGludClwRW5naW5lLT5Qb3AoKSkgewotICAgICAgICAgICAgICAgICgoQ1BERl9QU1Byb2MqKW1fT3BlcmF0b3JzW2kgLSAxXSktPkV4ZWN1dGUocEVuZ2luZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAob3AgPT0gUFNPUF9JRkVMU0UpIHsKLSAgICAgICAgICAgIGlmIChpIDwgNCB8fCBtX09wZXJhdG9yc1tpIC0gMl0gIT0gKEZYX0xQVk9JRClQU09QX1BST0MgfHwKLSAgICAgICAgICAgICAgICAgICAgbV9PcGVyYXRvcnNbaSAtIDRdICE9IChGWF9MUFZPSUQpUFNPUF9QUk9DKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChpbnQpcEVuZ2luZS0+UG9wKCkpIHsKLSAgICAgICAgICAgICAgICAoKENQREZfUFNQcm9jKiltX09wZXJhdG9yc1tpIC0gM10pLT5FeGVjdXRlKHBFbmdpbmUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAoKENQREZfUFNQcm9jKiltX09wZXJhdG9yc1tpIC0gMV0pLT5FeGVjdXRlKHBFbmdpbmUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcEVuZ2luZS0+RG9PcGVyYXRvcihvcCk7Ci0gICAgICAgIH0KK0ZYX0JPT0wgQ1BERl9QU1Byb2M6OkV4ZWN1dGUoQ1BERl9QU0VuZ2luZSogcEVuZ2luZSkgeworICBpbnQgc2l6ZSA9IG1fT3BlcmF0b3JzLkdldFNpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBQREZfUFNPUCBvcCA9IChQREZfUFNPUCkodWludHB0cl90KW1fT3BlcmF0b3JzW2ldOworICAgIGlmIChvcCA9PSBQU09QX1BST0MpIHsKKyAgICAgIGkrKzsKKyAgICB9IGVsc2UgaWYgKG9wID09IFBTT1BfQ09OU1QpIHsKKyAgICAgIHBFbmdpbmUtPlB1c2goKihGWF9GTE9BVCopbV9PcGVyYXRvcnNbaSArIDFdKTsKKyAgICAgIGkrKzsKKyAgICB9IGVsc2UgaWYgKG9wID09IFBTT1BfSUYpIHsKKyAgICAgIGlmIChpIDwgMiB8fCBtX09wZXJhdG9yc1tpIC0gMl0gIT0gKHZvaWQqKVBTT1BfUFJPQykgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBpZiAoKGludClwRW5naW5lLT5Qb3AoKSkgeworICAgICAgICAoKENQREZfUFNQcm9jKiltX09wZXJhdG9yc1tpIC0gMV0pLT5FeGVjdXRlKHBFbmdpbmUpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAob3AgPT0gUFNPUF9JRkVMU0UpIHsKKyAgICAgIGlmIChpIDwgNCB8fCBtX09wZXJhdG9yc1tpIC0gMl0gIT0gKHZvaWQqKVBTT1BfUFJPQyB8fAorICAgICAgICAgIG1fT3BlcmF0b3JzW2kgLSA0XSAhPSAodm9pZCopUFNPUF9QUk9DKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGlmICgoaW50KXBFbmdpbmUtPlBvcCgpKSB7CisgICAgICAgICgoQ1BERl9QU1Byb2MqKW1fT3BlcmF0b3JzW2kgLSAzXSktPkV4ZWN1dGUocEVuZ2luZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAoKENQREZfUFNQcm9jKiltX09wZXJhdG9yc1tpIC0gMV0pLT5FeGVjdXRlKHBFbmdpbmUpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBwRW5naW5lLT5Eb09wZXJhdG9yKG9wKTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1DUERGX1BTRW5naW5lOjpDUERGX1BTRW5naW5lKCkKLXsKLSAgICBtX1N0YWNrQ291bnQgPSAwOworQ1BERl9QU0VuZ2luZTo6Q1BERl9QU0VuZ2luZSgpIHsKKyAgbV9TdGFja0NvdW50ID0gMDsKIH0KLUNQREZfUFNFbmdpbmU6On5DUERGX1BTRW5naW5lKCkKLXsKK0NQREZfUFNFbmdpbmU6On5DUERGX1BTRW5naW5lKCkge30KK3ZvaWQgQ1BERl9QU0VuZ2luZTo6UHVzaChGWF9GTE9BVCB2KSB7CisgIGlmIChtX1N0YWNrQ291bnQgPT0gMTAwKSB7CisgICAgcmV0dXJuOworICB9CisgIG1fU3RhY2tbbV9TdGFja0NvdW50KytdID0gdjsKIH0KLXZvaWQgQ1BERl9QU0VuZ2luZTo6UHVzaChGWF9GTE9BVCB2KQotewotICAgIGlmIChtX1N0YWNrQ291bnQgPT0gMTAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9TdGFja1ttX1N0YWNrQ291bnQrK10gPSB2OwotfQotRlhfRkxPQVQgQ1BERl9QU0VuZ2luZTo6UG9wKCkKLXsKLSAgICBpZiAobV9TdGFja0NvdW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBtX1N0YWNrWy0tbV9TdGFja0NvdW50XTsKK0ZYX0ZMT0FUIENQREZfUFNFbmdpbmU6OlBvcCgpIHsKKyAgaWYgKG1fU3RhY2tDb3VudCA9PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIG1fU3RhY2tbLS1tX1N0YWNrQ291bnRdOwogfQogY29uc3Qgc3RydWN0IF9QREZfUFNPcE5hbWUgewotICAgIGNvbnN0IEZYX0NIQVIqIG5hbWU7Ci0gICAgUERGX1BTT1Agb3A7Ci19IF9QREZfUFNPcE5hbWVzW10gPSB7Ci0gICAgeyJhZGQiLCBQU09QX0FERH0sIHsic3ViIiwgUFNPUF9TVUJ9LCB7Im11bCIsIFBTT1BfTVVMfSwgeyJkaXYiLCBQU09QX0RJVn0sCi0gICAgeyJpZGl2IiwgUFNPUF9JRElWfSwgeyJtb2QiLCBQU09QX01PRH0sIHsibmVnIiwgUFNPUF9ORUd9LCB7ImFicyIsIFBTT1BfQUJTfSwKLSAgICB7ImNlaWxpbmciLCBQU09QX0NFSUxJTkd9LCB7ImZsb29yIiwgUFNPUF9GTE9PUn0sIHsicm91bmQiLCBQU09QX1JPVU5EfSwKLSAgICB7InRydW5jYXRlIiwgUFNPUF9UUlVOQ0FURX0sIHsic3FydCIsIFBTT1BfU1FSVH0sIHsic2luIiwgUFNPUF9TSU59LAotICAgIHsiY29zIiwgUFNPUF9DT1N9LCB7ImF0YW4iLCBQU09QX0FUQU59LCB7ImV4cCIsIFBTT1BfRVhQfSwgeyJsbiIsIFBTT1BfTE59LAotICAgIHsibG9nIiwgUFNPUF9MT0d9LCB7ImN2aSIsIFBTT1BfQ1ZJfSwgeyJjdnIiLCBQU09QX0NWUn0sIHsiZXEiLCBQU09QX0VRfSwKLSAgICB7Im5lIiwgUFNPUF9ORX0sIHsiZ3QiLCBQU09QX0dUfSwgeyJnZSIsIFBTT1BfR0V9LCB7Imx0IiwgUFNPUF9MVH0sCi0gICAgeyJsZSIsIFBTT1BfTEV9LCB7ImFuZCIsIFBTT1BfQU5EfSwgeyJvciIsIFBTT1BfT1J9LCB7InhvciIsIFBTT1BfWE9SfSwKLSAgICB7Im5vdCIsIFBTT1BfTk9UfSwgeyJiaXRzaGlmdCIsIFBTT1BfQklUU0hJRlR9LCB7InRydWUiLCBQU09QX1RSVUV9LAotICAgIHsiZmFsc2UiLCBQU09QX0ZBTFNFfSwgeyJpZiIsIFBTT1BfSUZ9LCB7ImlmZWxzZSIsIFBTT1BfSUZFTFNFfSwKLSAgICB7InBvcCIsIFBTT1BfUE9QfSwgeyJleGNoIiwgUFNPUF9FWENIfSwgeyJkdXAiLCBQU09QX0RVUH0sCi0gICAgeyJjb3B5IiwgUFNPUF9DT1BZfSwgeyJpbmRleCIsIFBTT1BfSU5ERVh9LCB7InJvbGwiLCBQU09QX1JPTEx9LAotICAgIHtOVUxMLCBQU09QX1BST0N9Ci19OwotRlhfQk9PTCBDUERGX1BTRW5naW5lOjpQYXJzZShjb25zdCBGWF9DSEFSKiBzdHJpbmcsIGludCBzaXplKQotewotICAgIENQREZfU2ltcGxlUGFyc2VyIHBhcnNlcigoRlhfTFBCWVRFKXN0cmluZywgc2l6ZSk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmdDIHdvcmQgPSBwYXJzZXIuR2V0V29yZCgpOwotICAgIGlmICh3b3JkICE9IEZYX0JTVFJDKCJ7IikpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gbV9NYWluUHJvYy5QYXJzZShwYXJzZXIpOworICBjb25zdCBGWF9DSEFSKiBuYW1lOworICBQREZfUFNPUCBvcDsKK30gX1BERl9QU09wTmFtZXNbXSA9IHt7ImFkZCIsIFBTT1BfQUREfSwgICAgICAgICB7InN1YiIsIFBTT1BfU1VCfSwKKyAgICAgICAgICAgICAgICAgICAgICB7Im11bCIsIFBTT1BfTVVMfSwgICAgICAgICB7ImRpdiIsIFBTT1BfRElWfSwKKyAgICAgICAgICAgICAgICAgICAgICB7ImlkaXYiLCBQU09QX0lESVZ9LCAgICAgICB7Im1vZCIsIFBTT1BfTU9EfSwKKyAgICAgICAgICAgICAgICAgICAgICB7Im5lZyIsIFBTT1BfTkVHfSwgICAgICAgICB7ImFicyIsIFBTT1BfQUJTfSwKKyAgICAgICAgICAgICAgICAgICAgICB7ImNlaWxpbmciLCBQU09QX0NFSUxJTkd9LCB7ImZsb29yIiwgUFNPUF9GTE9PUn0sCisgICAgICAgICAgICAgICAgICAgICAgeyJyb3VuZCIsIFBTT1BfUk9VTkR9LCAgICAgeyJ0cnVuY2F0ZSIsIFBTT1BfVFJVTkNBVEV9LAorICAgICAgICAgICAgICAgICAgICAgIHsic3FydCIsIFBTT1BfU1FSVH0sICAgICAgIHsic2luIiwgUFNPUF9TSU59LAorICAgICAgICAgICAgICAgICAgICAgIHsiY29zIiwgUFNPUF9DT1N9LCAgICAgICAgIHsiYXRhbiIsIFBTT1BfQVRBTn0sCisgICAgICAgICAgICAgICAgICAgICAgeyJleHAiLCBQU09QX0VYUH0sICAgICAgICAgeyJsbiIsIFBTT1BfTE59LAorICAgICAgICAgICAgICAgICAgICAgIHsibG9nIiwgUFNPUF9MT0d9LCAgICAgICAgIHsiY3ZpIiwgUFNPUF9DVkl9LAorICAgICAgICAgICAgICAgICAgICAgIHsiY3ZyIiwgUFNPUF9DVlJ9LCAgICAgICAgIHsiZXEiLCBQU09QX0VRfSwKKyAgICAgICAgICAgICAgICAgICAgICB7Im5lIiwgUFNPUF9ORX0sICAgICAgICAgICB7Imd0IiwgUFNPUF9HVH0sCisgICAgICAgICAgICAgICAgICAgICAgeyJnZSIsIFBTT1BfR0V9LCAgICAgICAgICAgeyJsdCIsIFBTT1BfTFR9LAorICAgICAgICAgICAgICAgICAgICAgIHsibGUiLCBQU09QX0xFfSwgICAgICAgICAgIHsiYW5kIiwgUFNPUF9BTkR9LAorICAgICAgICAgICAgICAgICAgICAgIHsib3IiLCBQU09QX09SfSwgICAgICAgICAgIHsieG9yIiwgUFNPUF9YT1J9LAorICAgICAgICAgICAgICAgICAgICAgIHsibm90IiwgUFNPUF9OT1R9LCAgICAgICAgIHsiYml0c2hpZnQiLCBQU09QX0JJVFNISUZUfSwKKyAgICAgICAgICAgICAgICAgICAgICB7InRydWUiLCBQU09QX1RSVUV9LCAgICAgICB7ImZhbHNlIiwgUFNPUF9GQUxTRX0sCisgICAgICAgICAgICAgICAgICAgICAgeyJpZiIsIFBTT1BfSUZ9LCAgICAgICAgICAgeyJpZmVsc2UiLCBQU09QX0lGRUxTRX0sCisgICAgICAgICAgICAgICAgICAgICAgeyJwb3AiLCBQU09QX1BPUH0sICAgICAgICAgeyJleGNoIiwgUFNPUF9FWENIfSwKKyAgICAgICAgICAgICAgICAgICAgICB7ImR1cCIsIFBTT1BfRFVQfSwgICAgICAgICB7ImNvcHkiLCBQU09QX0NPUFl9LAorICAgICAgICAgICAgICAgICAgICAgIHsiaW5kZXgiLCBQU09QX0lOREVYfSwgICAgIHsicm9sbCIsIFBTT1BfUk9MTH0sCisgICAgICAgICAgICAgICAgICAgICAge05VTEwsIFBTT1BfUFJPQ319OworRlhfQk9PTCBDUERGX1BTRW5naW5lOjpQYXJzZShjb25zdCBGWF9DSEFSKiBzdHJpbmcsIGludCBzaXplKSB7CisgIENQREZfU2ltcGxlUGFyc2VyIHBhcnNlcigodWludDhfdCopc3RyaW5nLCBzaXplKTsKKyAgQ0ZYX0J5dGVTdHJpbmdDIHdvcmQgPSBwYXJzZXIuR2V0V29yZCgpOworICBpZiAod29yZCAhPSAieyIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIG1fTWFpblByb2MuUGFyc2UocGFyc2VyKTsKIH0KLUZYX0JPT0wgQ1BERl9QU1Byb2M6OlBhcnNlKENQREZfU2ltcGxlUGFyc2VyJiBwYXJzZXIpCi17Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDIHdvcmQgPSBwYXJzZXIuR2V0V29yZCgpOwotICAgICAgICBpZiAod29yZC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAod29yZCA9PSBGWF9CU1RSQygifSIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAod29yZCA9PSBGWF9CU1RSQygieyIpKSB7Ci0gICAgICAgICAgICBDUERGX1BTUHJvYyogcFByb2MgPSBuZXcgQ1BERl9QU1Byb2M7Ci0gICAgICAgICAgICBtX09wZXJhdG9ycy5BZGQoKEZYX0xQVk9JRClQU09QX1BST0MpOwotICAgICAgICAgICAgbV9PcGVyYXRvcnMuQWRkKHBQcm9jKTsKLSAgICAgICAgICAgIGlmICghcFByb2MtPlBhcnNlKHBhcnNlcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoX1BERl9QU09wTmFtZXNbaV0ubmFtZSkgewotICAgICAgICAgICAgICAgIGlmICh3b3JkID09IENGWF9CeXRlU3RyaW5nQyhfUERGX1BTT3BOYW1lc1tpXS5uYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBtX09wZXJhdG9ycy5BZGQoKEZYX0xQVk9JRClfUERGX1BTT3BOYW1lc1tpXS5vcCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKF9QREZfUFNPcE5hbWVzW2ldLm5hbWUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBwZCA9IEZYX0FsbG9jKEZYX0ZMT0FULCAxKTsKLSAgICAgICAgICAgICAgICAqcGQgPSBGWF9hdG9mKHdvcmQpOwotICAgICAgICAgICAgICAgIG1fT3BlcmF0b3JzLkFkZCgoRlhfTFBWT0lEKVBTT1BfQ09OU1QpOwotICAgICAgICAgICAgICAgIG1fT3BlcmF0b3JzLkFkZChwZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KK0ZYX0JPT0wgQ1BERl9QU1Byb2M6OlBhcnNlKENQREZfU2ltcGxlUGFyc2VyJiBwYXJzZXIpIHsKKyAgd2hpbGUgKDEpIHsKKyAgICBDRlhfQnl0ZVN0cmluZ0Mgd29yZCA9IHBhcnNlci5HZXRXb3JkKCk7CisgICAgaWYgKHdvcmQuSXNFbXB0eSgpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQorICAgIGlmICh3b3JkID09ICJ9IikgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGlmICh3b3JkID09ICJ7IikgeworICAgICAgQ1BERl9QU1Byb2MqIHBQcm9jID0gbmV3IENQREZfUFNQcm9jOworICAgICAgbV9PcGVyYXRvcnMuQWRkKCh2b2lkKilQU09QX1BST0MpOworICAgICAgbV9PcGVyYXRvcnMuQWRkKHBQcm9jKTsKKyAgICAgIGlmICghcFByb2MtPlBhcnNlKHBhcnNlcikpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpbnQgaSA9IDA7CisgICAgICB3aGlsZSAoX1BERl9QU09wTmFtZXNbaV0ubmFtZSkgeworICAgICAgICBpZiAod29yZCA9PSBDRlhfQnl0ZVN0cmluZ0MoX1BERl9QU09wTmFtZXNbaV0ubmFtZSkpIHsKKyAgICAgICAgICBtX09wZXJhdG9ycy5BZGQoKHZvaWQqKV9QREZfUFNPcE5hbWVzW2ldLm9wKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpKys7CisgICAgICB9CisgICAgICBpZiAoIV9QREZfUFNPcE5hbWVzW2ldLm5hbWUpIHsKKyAgICAgICAgRlhfRkxPQVQqIHBkID0gRlhfQWxsb2MoRlhfRkxPQVQsIDEpOworICAgICAgICAqcGQgPSBGWF9hdG9mKHdvcmQpOworICAgICAgICBtX09wZXJhdG9ycy5BZGQoKHZvaWQqKVBTT1BfQ09OU1QpOworICAgICAgICBtX09wZXJhdG9ycy5BZGQocGQpOworICAgICAgfQorICAgIH0KKyAgfQogfQogI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTVmCi1GWF9CT09MIENQREZfUFNFbmdpbmU6OkRvT3BlcmF0b3IoUERGX1BTT1Agb3ApCi17Ci0gICAgaW50IGkxLCBpMjsKLSAgICBGWF9GTE9BVCBkMSwgZDI7Ci0gICAgc3dpdGNoIChvcCkgewotICAgICAgICBjYXNlIFBTT1BfQUREOgotICAgICAgICAgICAgZDEgPSBQb3AoKTsKLSAgICAgICAgICAgIGQyID0gUG9wKCk7Ci0gICAgICAgICAgICBQdXNoKGQxICsgZDIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNPUF9TVUI6Ci0gICAgICAgICAgICBkMiA9IFBvcCgpOwotICAgICAgICAgICAgZDEgPSBQb3AoKTsKLSAgICAgICAgICAgIFB1c2goZDEgLSBkMik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQU09QX01VTDoKLSAgICAgICAgICAgIGQxID0gUG9wKCk7Ci0gICAgICAgICAgICBkMiA9IFBvcCgpOwotICAgICAgICAgICAgUHVzaChkMSAqIGQyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfRElWOgotICAgICAgICAgICAgZDIgPSBQb3AoKTsKLSAgICAgICAgICAgIGQxID0gUG9wKCk7Ci0gICAgICAgICAgICBQdXNoKGQxIC8gZDIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNPUF9JRElWOgotICAgICAgICAgICAgaTIgPSAoaW50KVBvcCgpOwotICAgICAgICAgICAgaTEgPSAoaW50KVBvcCgpOwotICAgICAgICAgICAgUHVzaChpMSAvIGkyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfTU9EOgotICAgICAgICAgICAgaTIgPSAoaW50KVBvcCgpOwotICAgICAgICAgICAgaTEgPSAoaW50KVBvcCgpOwotICAgICAgICAgICAgUHVzaChpMSAlIGkyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfTkVHOgotICAgICAgICAgICAgZDEgPSBQb3AoKTsKLSAgICAgICAgICAgIFB1c2goLWQxKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfQUJTOgotICAgICAgICAgICAgZDEgPSBQb3AoKTsKLSAgICAgICAgICAgIFB1c2goKEZYX0ZMT0FUKUZYU1lTX2ZhYnMoZDEpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfQ0VJTElORzoKLSAgICAgICAgICAgIGQxID0gUG9wKCk7Ci0gICAgICAgICAgICBQdXNoKChGWF9GTE9BVClGWFNZU19jZWlsKGQxKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQU09QX0ZMT09SOgotICAgICAgICAgICAgZDEgPSBQb3AoKTsKLSAgICAgICAgICAgIFB1c2goKEZYX0ZMT0FUKUZYU1lTX2Zsb29yKGQxKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQU09QX1JPVU5EOgotICAgICAgICAgICAgZDEgPSBQb3AoKTsKLSAgICAgICAgICAgIFB1c2goRlhTWVNfcm91bmQoZDEpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfVFJVTkNBVEU6Ci0gICAgICAgICAgICBpMSA9IChpbnQpUG9wKCk7Ci0gICAgICAgICAgICBQdXNoKGkxKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfU1FSVDoKLSAgICAgICAgICAgIGQxID0gUG9wKCk7Ci0gICAgICAgICAgICBQdXNoKChGWF9GTE9BVClGWFNZU19zcXJ0KGQxKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQU09QX1NJTjoKLSAgICAgICAgICAgIGQxID0gUG9wKCk7Ci0gICAgICAgICAgICBQdXNoKChGWF9GTE9BVClGWFNZU19zaW4oZDEgKiBQSSAvIDE4MC4wZikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNPUF9DT1M6Ci0gICAgICAgICAgICBkMSA9IFBvcCgpOwotICAgICAgICAgICAgUHVzaCgoRlhfRkxPQVQpRlhTWVNfY29zKGQxICogUEkgLyAxODAuMGYpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfQVRBTjoKLSAgICAgICAgICAgIGQyID0gUG9wKCk7Ci0gICAgICAgICAgICBkMSA9IFBvcCgpOwotICAgICAgICAgICAgZDEgPSAoRlhfRkxPQVQpKEZYU1lTX2F0YW4yKGQxLCBkMikgKiAxODAuMCAvIFBJKTsKLSAgICAgICAgICAgIGlmIChkMSA8IDApIHsKLSAgICAgICAgICAgICAgICBkMSArPSAzNjA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQdXNoKGQxKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfRVhQOgotICAgICAgICAgICAgZDIgPSBQb3AoKTsKLSAgICAgICAgICAgIGQxID0gUG9wKCk7Ci0gICAgICAgICAgICBQdXNoKChGWF9GTE9BVClGWFNZU19wb3coZDEsIGQyKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQU09QX0xOOgotICAgICAgICAgICAgZDEgPSBQb3AoKTsKLSAgICAgICAgICAgIFB1c2goKEZYX0ZMT0FUKUZYU1lTX2xvZyhkMSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNPUF9MT0c6Ci0gICAgICAgICAgICBkMSA9IFBvcCgpOwotICAgICAgICAgICAgUHVzaCgoRlhfRkxPQVQpRlhTWVNfbG9nMTAoZDEpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfQ1ZJOgotICAgICAgICAgICAgaTEgPSAoaW50KVBvcCgpOwotICAgICAgICAgICAgUHVzaChpMSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQU09QX0NWUjoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfRVE6Ci0gICAgICAgICAgICBkMiA9IFBvcCgpOwotICAgICAgICAgICAgZDEgPSBQb3AoKTsKLSAgICAgICAgICAgIFB1c2goKGludCkoZDEgPT0gZDIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfTkU6Ci0gICAgICAgICAgICBkMiA9IFBvcCgpOwotICAgICAgICAgICAgZDEgPSBQb3AoKTsKLSAgICAgICAgICAgIFB1c2goKGludCkoZDEgIT0gZDIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfR1Q6Ci0gICAgICAgICAgICBkMiA9IFBvcCgpOwotICAgICAgICAgICAgZDEgPSBQb3AoKTsKLSAgICAgICAgICAgIFB1c2goKGludCkoZDEgPiBkMikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNPUF9HRToKLSAgICAgICAgICAgIGQyID0gUG9wKCk7Ci0gICAgICAgICAgICBkMSA9IFBvcCgpOwotICAgICAgICAgICAgUHVzaCgoaW50KShkMSA+PSBkMikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNPUF9MVDoKLSAgICAgICAgICAgIGQyID0gUG9wKCk7Ci0gICAgICAgICAgICBkMSA9IFBvcCgpOwotICAgICAgICAgICAgUHVzaCgoaW50KShkMSA8IGQyKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQU09QX0xFOgotICAgICAgICAgICAgZDIgPSBQb3AoKTsKLSAgICAgICAgICAgIGQxID0gUG9wKCk7Ci0gICAgICAgICAgICBQdXNoKChpbnQpKGQxIDw9IGQyKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQU09QX0FORDoKLSAgICAgICAgICAgIGkxID0gKGludClQb3AoKTsKLSAgICAgICAgICAgIGkyID0gKGludClQb3AoKTsKLSAgICAgICAgICAgIFB1c2goaTEgJiBpMik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQU09QX09SOgotICAgICAgICAgICAgaTEgPSAoaW50KVBvcCgpOwotICAgICAgICAgICAgaTIgPSAoaW50KVBvcCgpOwotICAgICAgICAgICAgUHVzaChpMSB8IGkyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfWE9SOgotICAgICAgICAgICAgaTEgPSAoaW50KVBvcCgpOwotICAgICAgICAgICAgaTIgPSAoaW50KVBvcCgpOwotICAgICAgICAgICAgUHVzaChpMSBeIGkyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfTk9UOgotICAgICAgICAgICAgaTEgPSAoaW50KVBvcCgpOwotICAgICAgICAgICAgUHVzaCgoaW50KSFpMSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQU09QX0JJVFNISUZUOiB7Ci0gICAgICAgICAgICAgICAgaW50IHNoaWZ0ID0gKGludClQb3AoKTsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IChpbnQpUG9wKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBQdXNoKGkgPDwgc2hpZnQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFB1c2goaSA+PiAtc2hpZnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBQU09QX1RSVUU6Ci0gICAgICAgICAgICBQdXNoKDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNPUF9GQUxTRToKLSAgICAgICAgICAgIFB1c2goMCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQU09QX1BPUDoKLSAgICAgICAgICAgIFBvcCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNPUF9FWENIOgotICAgICAgICAgICAgZDIgPSBQb3AoKTsKLSAgICAgICAgICAgIGQxID0gUG9wKCk7Ci0gICAgICAgICAgICBQdXNoKGQyKTsKLSAgICAgICAgICAgIFB1c2goZDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNPUF9EVVA6Ci0gICAgICAgICAgICBkMSA9IFBvcCgpOwotICAgICAgICAgICAgUHVzaChkMSk7Ci0gICAgICAgICAgICBQdXNoKGQxKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBTT1BfQ09QWTogewotICAgICAgICAgICAgICAgIGludCBuID0gKGludClQb3AoKTsKLSAgICAgICAgICAgICAgICBpZiAobiA8IDAgfHwgbiA+IFBTRU5HSU5FX1NUQUNLU0laRSB8fCBtX1N0YWNrQ291bnQgKyBuID4gUFNFTkdJTkVfU1RBQ0tTSVpFIHx8IG4gPiBtX1N0YWNrQ291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSArKykgewotICAgICAgICAgICAgICAgICAgICBtX1N0YWNrW21fU3RhY2tDb3VudCArIGldID0gbV9TdGFja1ttX1N0YWNrQ291bnQgKyBpIC0gbl07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fU3RhY2tDb3VudCArPSBuOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIFBTT1BfSU5ERVg6IHsKLSAgICAgICAgICAgICAgICBpbnQgbiA9IChpbnQpUG9wKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG4gPCAwIHx8IG4gPj0gbV9TdGFja0NvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQdXNoKG1fU3RhY2tbbV9TdGFja0NvdW50IC0gbiAtIDFdKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBQU09QX1JPTEw6IHsKLSAgICAgICAgICAgICAgICBpbnQgaiA9IChpbnQpUG9wKCk7Ci0gICAgICAgICAgICAgICAgaW50IG4gPSAoaW50KVBvcCgpOwotICAgICAgICAgICAgICAgIGlmIChtX1N0YWNrQ291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG4gPCAwIHx8IG4gPiBtX1N0YWNrQ291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChqIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAtajsgaSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZmlyc3QgPSBtX1N0YWNrW21fU3RhY2tDb3VudCAtIG5dOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG4gLSAxOyBpaSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU3RhY2tbbV9TdGFja0NvdW50IC0gbiArIGlpXSA9IG1fU3RhY2tbbV9TdGFja0NvdW50IC0gbiArIGlpICsgMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX1N0YWNrW21fU3RhY2tDb3VudCAtIDFdID0gZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgajsgaSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbGFzdCA9IG1fU3RhY2tbbV9TdGFja0NvdW50IC0gMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBuIC0gMTsgaWkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1N0YWNrW21fU3RhY2tDb3VudCAtIGlpIC0gMV0gPSBtX1N0YWNrW21fU3RhY2tDb3VudCAtIGlpIC0gMl07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX1N0YWNrW21fU3RhY2tDb3VudCAtIGlpIC0gMV0gPSBsYXN0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKK0ZYX0JPT0wgQ1BERl9QU0VuZ2luZTo6RG9PcGVyYXRvcihQREZfUFNPUCBvcCkgeworICBpbnQgaTEsIGkyOworICBGWF9GTE9BVCBkMSwgZDI7CisgIHN3aXRjaCAob3ApIHsKKyAgICBjYXNlIFBTT1BfQUREOgorICAgICAgZDEgPSBQb3AoKTsKKyAgICAgIGQyID0gUG9wKCk7CisgICAgICBQdXNoKGQxICsgZDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX1NVQjoKKyAgICAgIGQyID0gUG9wKCk7CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaChkMSAtIGQyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9NVUw6CisgICAgICBkMSA9IFBvcCgpOworICAgICAgZDIgPSBQb3AoKTsKKyAgICAgIFB1c2goZDEgKiBkMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfRElWOgorICAgICAgZDIgPSBQb3AoKTsKKyAgICAgIGQxID0gUG9wKCk7CisgICAgICBQdXNoKGQxIC8gZDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX0lESVY6CisgICAgICBpMiA9IChpbnQpUG9wKCk7CisgICAgICBpMSA9IChpbnQpUG9wKCk7CisgICAgICBQdXNoKGkxIC8gaTIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX01PRDoKKyAgICAgIGkyID0gKGludClQb3AoKTsKKyAgICAgIGkxID0gKGludClQb3AoKTsKKyAgICAgIFB1c2goaTEgJSBpMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfTkVHOgorICAgICAgZDEgPSBQb3AoKTsKKyAgICAgIFB1c2goLWQxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9BQlM6CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaCgoRlhfRkxPQVQpRlhTWVNfZmFicyhkMSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX0NFSUxJTkc6CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaCgoRlhfRkxPQVQpRlhTWVNfY2VpbChkMSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX0ZMT09SOgorICAgICAgZDEgPSBQb3AoKTsKKyAgICAgIFB1c2goKEZYX0ZMT0FUKUZYU1lTX2Zsb29yKGQxKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfUk9VTkQ6CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaChGWFNZU19yb3VuZChkMSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX1RSVU5DQVRFOgorICAgICAgaTEgPSAoaW50KVBvcCgpOworICAgICAgUHVzaChpMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfU1FSVDoKKyAgICAgIGQxID0gUG9wKCk7CisgICAgICBQdXNoKChGWF9GTE9BVClGWFNZU19zcXJ0KGQxKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfU0lOOgorICAgICAgZDEgPSBQb3AoKTsKKyAgICAgIFB1c2goKEZYX0ZMT0FUKUZYU1lTX3NpbihkMSAqIFBJIC8gMTgwLjBmKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfQ09TOgorICAgICAgZDEgPSBQb3AoKTsKKyAgICAgIFB1c2goKEZYX0ZMT0FUKUZYU1lTX2NvcyhkMSAqIFBJIC8gMTgwLjBmKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfQVRBTjoKKyAgICAgIGQyID0gUG9wKCk7CisgICAgICBkMSA9IFBvcCgpOworICAgICAgZDEgPSAoRlhfRkxPQVQpKEZYU1lTX2F0YW4yKGQxLCBkMikgKiAxODAuMCAvIFBJKTsKKyAgICAgIGlmIChkMSA8IDApIHsKKyAgICAgICAgZDEgKz0gMzYwOworICAgICAgfQorICAgICAgUHVzaChkMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfRVhQOgorICAgICAgZDIgPSBQb3AoKTsKKyAgICAgIGQxID0gUG9wKCk7CisgICAgICBQdXNoKChGWF9GTE9BVClGWFNZU19wb3coZDEsIGQyKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfTE46CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaCgoRlhfRkxPQVQpRlhTWVNfbG9nKGQxKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfTE9HOgorICAgICAgZDEgPSBQb3AoKTsKKyAgICAgIFB1c2goKEZYX0ZMT0FUKUZYU1lTX2xvZzEwKGQxKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfQ1ZJOgorICAgICAgaTEgPSAoaW50KVBvcCgpOworICAgICAgUHVzaChpMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfQ1ZSOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX0VROgorICAgICAgZDIgPSBQb3AoKTsKKyAgICAgIGQxID0gUG9wKCk7CisgICAgICBQdXNoKChpbnQpKGQxID09IGQyKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfTkU6CisgICAgICBkMiA9IFBvcCgpOworICAgICAgZDEgPSBQb3AoKTsKKyAgICAgIFB1c2goKGludCkoZDEgIT0gZDIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9HVDoKKyAgICAgIGQyID0gUG9wKCk7CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaCgoaW50KShkMSA+IGQyKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfR0U6CisgICAgICBkMiA9IFBvcCgpOworICAgICAgZDEgPSBQb3AoKTsKKyAgICAgIFB1c2goKGludCkoZDEgPj0gZDIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9MVDoKKyAgICAgIGQyID0gUG9wKCk7CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaCgoaW50KShkMSA8IGQyKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfTEU6CisgICAgICBkMiA9IFBvcCgpOworICAgICAgZDEgPSBQb3AoKTsKKyAgICAgIFB1c2goKGludCkoZDEgPD0gZDIpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9BTkQ6CisgICAgICBpMSA9IChpbnQpUG9wKCk7CisgICAgICBpMiA9IChpbnQpUG9wKCk7CisgICAgICBQdXNoKGkxICYgaTIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX09SOgorICAgICAgaTEgPSAoaW50KVBvcCgpOworICAgICAgaTIgPSAoaW50KVBvcCgpOworICAgICAgUHVzaChpMSB8IGkyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9YT1I6CisgICAgICBpMSA9IChpbnQpUG9wKCk7CisgICAgICBpMiA9IChpbnQpUG9wKCk7CisgICAgICBQdXNoKGkxIF4gaTIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX05PVDoKKyAgICAgIGkxID0gKGludClQb3AoKTsKKyAgICAgIFB1c2goKGludCkhaTEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX0JJVFNISUZUOiB7CisgICAgICBpbnQgc2hpZnQgPSAoaW50KVBvcCgpOworICAgICAgaW50IGkgPSAoaW50KVBvcCgpOworICAgICAgaWYgKHNoaWZ0ID4gMCkgeworICAgICAgICBQdXNoKGkgPDwgc2hpZnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUHVzaChpID4+IC1zaGlmdCk7CisgICAgICB9CisgICAgICBicmVhazsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1zdGF0aWMgRlhfRkxPQVQgUERGX0ludGVycG9sYXRlKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHhtaW4sIEZYX0ZMT0FUIHhtYXgsIEZYX0ZMT0FUIHltaW4sIEZYX0ZMT0FUIHltYXgpCi17Ci0gICAgcmV0dXJuICgoeCAtIHhtaW4pICogKHltYXggLSB5bWluKSAvICh4bWF4IC0geG1pbikpICsgeW1pbjsKLX0KLXN0YXRpYyBGWF9EV09SRCBfR2V0Qml0czMyKEZYX0xQQ0JZVEUgcERhdGEsIGludCBiaXRwb3MsIGludCBuYml0cykKLXsKLSAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5iaXRzOyBpICsrKQotICAgICAgICBpZiAocERhdGFbKGJpdHBvcyArIGkpIC8gOF0gJiAoMSA8PCAoNyAtIChiaXRwb3MgKyBpKSAlIDgpKSkgewotICAgICAgICAgICAgcmVzdWx0IHw9IDEgPDwgKG5iaXRzIC0gaSAtIDEpOworICAgIGNhc2UgUFNPUF9UUlVFOgorICAgICAgUHVzaCgxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9GQUxTRToKKyAgICAgIFB1c2goMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfUE9QOgorICAgICAgUG9wKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfRVhDSDoKKyAgICAgIGQyID0gUG9wKCk7CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaChkMik7CisgICAgICBQdXNoKGQxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9EVVA6CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaChkMSk7CisgICAgICBQdXNoKGQxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9DT1BZOiB7CisgICAgICBpbnQgbiA9IChpbnQpUG9wKCk7CisgICAgICBpZiAobiA8IDAgfHwgbiA+IFBTRU5HSU5FX1NUQUNLU0laRSB8fAorICAgICAgICAgIG1fU3RhY2tDb3VudCArIG4gPiBQU0VOR0lORV9TVEFDS1NJWkUgfHwgbiA+IG1fU3RhY2tDb3VudCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIG1fU3RhY2tbbV9TdGFja0NvdW50ICsgaV0gPSBtX1N0YWNrW21fU3RhY2tDb3VudCArIGkgLSBuXTsKKyAgICAgIH0KKyAgICAgIG1fU3RhY2tDb3VudCArPSBuOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFNPUF9JTkRFWDogeworICAgICAgaW50IG4gPSAoaW50KVBvcCgpOworICAgICAgaWYgKG4gPCAwIHx8IG4gPj0gbV9TdGFja0NvdW50KSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgUHVzaChtX1N0YWNrW21fU3RhY2tDb3VudCAtIG4gLSAxXSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQU09QX1JPTEw6IHsKKyAgICAgIGludCBqID0gKGludClQb3AoKTsKKyAgICAgIGludCBuID0gKGludClQb3AoKTsKKyAgICAgIGlmIChtX1N0YWNrQ291bnQgPT0gMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChuIDwgMCB8fCBuID4gbV9TdGFja0NvdW50KSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKGogPCAwKQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IC1qOyBpKyspIHsKKyAgICAgICAgICBGWF9GTE9BVCBmaXJzdCA9IG1fU3RhY2tbbV9TdGFja0NvdW50IC0gbl07CisgICAgICAgICAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IG4gLSAxOyBpaSsrKSB7CisgICAgICAgICAgICBtX1N0YWNrW21fU3RhY2tDb3VudCAtIG4gKyBpaV0gPSBtX1N0YWNrW21fU3RhY2tDb3VudCAtIG4gKyBpaSArIDFdOworICAgICAgICAgIH0KKyAgICAgICAgICBtX1N0YWNrW21fU3RhY2tDb3VudCAtIDFdID0gZmlyc3Q7CiAgICAgICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OworICAgICAgZWxzZQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGo7IGkrKykgeworICAgICAgICAgIEZYX0ZMT0FUIGxhc3QgPSBtX1N0YWNrW21fU3RhY2tDb3VudCAtIDFdOworICAgICAgICAgIGludCBpaTsKKyAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBuIC0gMTsgaWkrKykgeworICAgICAgICAgICAgbV9TdGFja1ttX1N0YWNrQ291bnQgLSBpaSAtIDFdID0gbV9TdGFja1ttX1N0YWNrQ291bnQgLSBpaSAtIDJdOworICAgICAgICAgIH0KKyAgICAgICAgICBtX1N0YWNrW21fU3RhY2tDb3VudCAtIGlpIC0gMV0gPSBsYXN0OworICAgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBUUlVFOworfQorc3RhdGljIEZYX0ZMT0FUIFBERl9JbnRlcnBvbGF0ZShGWF9GTE9BVCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4bWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4bWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5bWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5bWF4KSB7CisgIHJldHVybiAoKHggLSB4bWluKSAqICh5bWF4IC0geW1pbikgLyAoeG1heCAtIHhtaW4pKSArIHltaW47Cit9CitzdGF0aWMgRlhfRFdPUkQgX0dldEJpdHMzMihjb25zdCB1aW50OF90KiBwRGF0YSwgaW50IGJpdHBvcywgaW50IG5iaXRzKSB7CisgIGludCByZXN1bHQgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IG5iaXRzOyBpKyspCisgICAgaWYgKHBEYXRhWyhiaXRwb3MgKyBpKSAvIDhdICYgKDEgPDwgKDcgLSAoYml0cG9zICsgaSkgJSA4KSkpIHsKKyAgICAgIHJlc3VsdCB8PSAxIDw8IChuYml0cyAtIGkgLSAxKTsKKyAgICB9CisgIHJldHVybiByZXN1bHQ7CiB9CiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgRlhfRkxPQVQJZW5jb2RlX21heCwgZW5jb2RlX21pbjsKLSAgICBpbnQJCQlzaXplczsKKyAgRlhfRkxPQVQgZW5jb2RlX21heCwgZW5jb2RlX21pbjsKKyAgaW50IHNpemVzOwogfSBTYW1wbGVFbmNvZGVJbmZvOwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIEZYX0ZMT0FUCWRlY29kZV9tYXgsIGRlY29kZV9taW47Ci19IFNhbXBsZURlY29kZUluZm87Ci1jbGFzcyBDUERGX1NhbXBsZWRGdW5jIDogcHVibGljIENQREZfRnVuY3Rpb24KLXsKLXB1YmxpYzoKLSAgICBDUERGX1NhbXBsZWRGdW5jKCk7Ci0gICAgdmlydHVhbCB+Q1BERl9TYW1wbGVkRnVuYygpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3Q7Ci0gICAgU2FtcGxlRW5jb2RlSW5mbyoJbV9wRW5jb2RlSW5mbzsKLSAgICBTYW1wbGVEZWNvZGVJbmZvKgltX3BEZWNvZGVJbmZvOwotICAgIEZYX0RXT1JECW1fbkJpdHNQZXJTYW1wbGUsIG1fU2FtcGxlTWF4OwotICAgIENQREZfU3RyZWFtQWNjKgltX3BTYW1wbGVTdHJlYW07Cit0eXBlZGVmIHN0cnVjdCB7IEZYX0ZMT0FUIGRlY29kZV9tYXgsIGRlY29kZV9taW47IH0gU2FtcGxlRGVjb2RlSW5mbzsKKworY2xhc3MgQ1BERl9TYW1wbGVkRnVuYyA6IHB1YmxpYyBDUERGX0Z1bmN0aW9uIHsKKyBwdWJsaWM6CisgIENQREZfU2FtcGxlZEZ1bmMoKTsKKyAgfkNQREZfU2FtcGxlZEZ1bmMoKSBvdmVycmlkZTsKKworICAvLyBDUERGX0Z1bmN0aW9uCisgIEZYX0JPT0wgdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKSBvdmVycmlkZTsKKyAgRlhfQk9PTCB2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0IG92ZXJyaWRlOworCisgIFNhbXBsZUVuY29kZUluZm8qIG1fcEVuY29kZUluZm87CisgIFNhbXBsZURlY29kZUluZm8qIG1fcERlY29kZUluZm87CisgIEZYX0RXT1JEIG1fbkJpdHNQZXJTYW1wbGU7CisgIEZYX0RXT1JEIG1fU2FtcGxlTWF4OworICBDUERGX1N0cmVhbUFjYyogbV9wU2FtcGxlU3RyZWFtOwogfTsKLUNQREZfU2FtcGxlZEZ1bmM6OkNQREZfU2FtcGxlZEZ1bmMoKQotewotICAgIG1fcFNhbXBsZVN0cmVhbSA9IE5VTEw7Ci0gICAgbV9wRW5jb2RlSW5mbyA9IE5VTEw7Ci0gICAgbV9wRGVjb2RlSW5mbyA9IE5VTEw7CisKK0NQREZfU2FtcGxlZEZ1bmM6OkNQREZfU2FtcGxlZEZ1bmMoKSB7CisgIG1fcFNhbXBsZVN0cmVhbSA9IE5VTEw7CisgIG1fcEVuY29kZUluZm8gPSBOVUxMOworICBtX3BEZWNvZGVJbmZvID0gTlVMTDsKIH0KLUNQREZfU2FtcGxlZEZ1bmM6On5DUERGX1NhbXBsZWRGdW5jKCkKLXsKLSAgICBpZiAobV9wU2FtcGxlU3RyZWFtKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BTYW1wbGVTdHJlYW07Ci0gICAgfQotICAgIGlmIChtX3BFbmNvZGVJbmZvKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wRW5jb2RlSW5mbyk7Ci0gICAgfQotICAgIGlmIChtX3BEZWNvZGVJbmZvKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wRGVjb2RlSW5mbyk7Ci0gICAgfQorQ1BERl9TYW1wbGVkRnVuYzo6fkNQREZfU2FtcGxlZEZ1bmMoKSB7CisgIGRlbGV0ZSBtX3BTYW1wbGVTdHJlYW07CisgIEZYX0ZyZWUobV9wRW5jb2RlSW5mbyk7CisgIEZYX0ZyZWUobV9wRGVjb2RlSW5mbyk7CiB9Ci1GWF9CT09MIENQREZfU2FtcGxlZEZ1bmM6OnZfSW5pdChDUERGX09iamVjdCogcE9iaikKLXsKLSAgICBpZiAocE9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDUERGX1NhbXBsZWRGdW5jOjp2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopIHsKKyAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwT2JqLT5Bc1N0cmVhbSgpOworICBpZiAoIXBTdHJlYW0pCisgICAgcmV0dXJuIGZhbHNlOworCisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7CisgIENQREZfQXJyYXkqIHBTaXplID0gcERpY3QtPkdldEFycmF5KCJTaXplIik7CisgIENQREZfQXJyYXkqIHBFbmNvZGUgPSBwRGljdC0+R2V0QXJyYXkoIkVuY29kZSIpOworICBDUERGX0FycmF5KiBwRGVjb2RlID0gcERpY3QtPkdldEFycmF5KCJEZWNvZGUiKTsKKyAgbV9uQml0c1BlclNhbXBsZSA9IHBEaWN0LT5HZXRJbnRlZ2VyKCJCaXRzUGVyU2FtcGxlIik7CisgIGlmIChtX25CaXRzUGVyU2FtcGxlID4gMzIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9TYW1wbGVNYXggPSAweGZmZmZmZmZmID4+ICgzMiAtIG1fbkJpdHNQZXJTYW1wbGUpOworICBtX3BTYW1wbGVTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW1BY2M7CisgIG1fcFNhbXBsZVN0cmVhbS0+TG9hZEFsbERhdGEocFN0cmVhbSwgRkFMU0UpOworICBtX3BFbmNvZGVJbmZvID0gRlhfQWxsb2MoU2FtcGxlRW5jb2RlSW5mbywgbV9uSW5wdXRzKTsKKyAgRlhfU0FGRV9EV09SRCBuVG90YWxTYW1wbGVCaXRzID0gMTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25JbnB1dHM7IGkrKykgeworICAgIG1fcEVuY29kZUluZm9baV0uc2l6ZXMgPSBwU2l6ZSA/IHBTaXplLT5HZXRJbnRlZ2VyKGkpIDogMDsKKyAgICBpZiAoIXBTaXplICYmIGkgPT0gMCkgeworICAgICAgbV9wRW5jb2RlSW5mb1tpXS5zaXplcyA9IHBEaWN0LT5HZXRJbnRlZ2VyKCJTaXplIik7CiAgICAgfQotICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gKENQREZfU3RyZWFtKilwT2JqOwotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7Ci0gICAgQ1BERl9BcnJheSogcFNpemUgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIlNpemUiKSk7Ci0gICAgQ1BERl9BcnJheSogcEVuY29kZSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRW5jb2RlIikpOwotICAgIENQREZfQXJyYXkqIHBEZWNvZGUgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkRlY29kZSIpKTsKLSAgICBtX25CaXRzUGVyU2FtcGxlID0gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkJpdHNQZXJTYW1wbGUiKSk7Ci0gICAgbV9TYW1wbGVNYXggPSAweGZmZmZmZmZmID4+ICgzMiAtIG1fbkJpdHNQZXJTYW1wbGUpOwotICAgIG1fcFNhbXBsZVN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbUFjYzsKLSAgICBtX3BTYW1wbGVTdHJlYW0tPkxvYWRBbGxEYXRhKHBTdHJlYW0sIEZBTFNFKTsKLSAgICBtX3BFbmNvZGVJbmZvID0gRlhfQWxsb2MoU2FtcGxlRW5jb2RlSW5mbywgbV9uSW5wdXRzKTsKLSAgICBpbnQgaTsKLSAgICBGWF9EV09SRCBuVG90YWxTYW1wbGVzID0gMTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbV9uSW5wdXRzOyBpICsrKSB7Ci0gICAgICAgIG1fcEVuY29kZUluZm9baV0uc2l6ZXMgPSBwU2l6ZSA/IHBTaXplLT5HZXRJbnRlZ2VyKGkpIDogMDsKLSAgICAgICAgaWYgKCFwU2l6ZSAmJiBpID09IDApIHsKLSAgICAgICAgICAgIG1fcEVuY29kZUluZm9baV0uc2l6ZXMgPSBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiU2l6ZSIpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoblRvdGFsU2FtcGxlcyA+IDAgJiYgKEZYX1VJTlQzMikobV9wRW5jb2RlSW5mb1tpXS5zaXplcykgPiBVSU5UX01BWCAvIG5Ub3RhbFNhbXBsZXMpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBuVG90YWxTYW1wbGVzICo9IG1fcEVuY29kZUluZm9baV0uc2l6ZXM7Ci0gICAgICAgIGlmIChwRW5jb2RlKSB7Ci0gICAgICAgICAgICBtX3BFbmNvZGVJbmZvW2ldLmVuY29kZV9taW4gPSBwRW5jb2RlLT5HZXRGbG9hdChpICogMik7Ci0gICAgICAgICAgICBtX3BFbmNvZGVJbmZvW2ldLmVuY29kZV9tYXggPSBwRW5jb2RlLT5HZXRGbG9hdChpICogMiArIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9wRW5jb2RlSW5mb1tpXS5lbmNvZGVfbWluID0gMDsKLSAgICAgICAgICAgIGlmIChtX3BFbmNvZGVJbmZvW2ldLnNpemVzID09IDEpIHsKLSAgICAgICAgICAgICAgICBtX3BFbmNvZGVJbmZvW2ldLmVuY29kZV9tYXggPSAxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX3BFbmNvZGVJbmZvW2ldLmVuY29kZV9tYXggPSAoRlhfRkxPQVQpbV9wRW5jb2RlSW5mb1tpXS5zaXplcyAtIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG5Ub3RhbFNhbXBsZXMgPiAwICYmIG1fbkJpdHNQZXJTYW1wbGUgPiBVSU5UX01BWCAvIG5Ub3RhbFNhbXBsZXMpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBuVG90YWxTYW1wbGVzICo9IG1fbkJpdHNQZXJTYW1wbGU7Ci0gICAgaWYgKG5Ub3RhbFNhbXBsZXMgPiAwICYmICgoRlhfVUlOVDMyKW1fbk91dHB1dHMpID4gVUlOVF9NQVggLyBuVG90YWxTYW1wbGVzKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgblRvdGFsU2FtcGxlcyAqPSBtX25PdXRwdXRzOwotICAgIGlmIChuVG90YWxTYW1wbGVzID09IDAgfHwgbV9wU2FtcGxlU3RyZWFtLT5HZXRTaXplKCkgKiA4IDwgblRvdGFsU2FtcGxlcykgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fcERlY29kZUluZm8gPSBGWF9BbGxvYyhTYW1wbGVEZWNvZGVJbmZvLCBtX25PdXRwdXRzKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbV9uT3V0cHV0czsgaSArKykgewotICAgICAgICBpZiAocERlY29kZSkgewotICAgICAgICAgICAgbV9wRGVjb2RlSW5mb1tpXS5kZWNvZGVfbWluID0gcERlY29kZS0+R2V0RmxvYXQoMiAqIGkpOwotICAgICAgICAgICAgbV9wRGVjb2RlSW5mb1tpXS5kZWNvZGVfbWF4ID0gcERlY29kZS0+R2V0RmxvYXQoMiAqIGkgKyAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fcERlY29kZUluZm9baV0uZGVjb2RlX21pbiA9IG1fcFJhbmdlc1tpICogMl07Ci0gICAgICAgICAgICBtX3BEZWNvZGVJbmZvW2ldLmRlY29kZV9tYXggPSBtX3BSYW5nZXNbaSAqIDIgKyAxXTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ1BERl9TYW1wbGVkRnVuYzo6dl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiByZXN1bHRzKSBjb25zdAotewotICAgIGludCBwb3MgPSAwOwotICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiBlbmNvZGVkX2lucHV0X2J1ZihtX25JbnB1dHMpOwotICAgIEZYX0ZMT0FUKiBlbmNvZGVkX2lucHV0ID0gZW5jb2RlZF9pbnB1dF9idWY7Ci0gICAgQ0ZYX0ZpeGVkQnVmR3JvdzxpbnQsIDMyPiBpbnRfYnVmKG1fbklucHV0cyAqIDIpOwotICAgIGludCogaW5kZXggPSBpbnRfYnVmOwotICAgIGludCogYmxvY2tzaXplID0gaW5kZXggKyBtX25JbnB1dHM7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25JbnB1dHM7IGkgKyspIHsKLSAgICAgICAgaWYgKGkgPT0gMCkgewotICAgICAgICAgICAgYmxvY2tzaXplW2ldID0gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJsb2Nrc2l6ZVtpXSA9IGJsb2Nrc2l6ZVtpIC0gMV0gKiBtX3BFbmNvZGVJbmZvW2kgLSAxXS5zaXplczsKLSAgICAgICAgfQotICAgICAgICBlbmNvZGVkX2lucHV0W2ldID0gUERGX0ludGVycG9sYXRlKGlucHV0c1tpXSwgbV9wRG9tYWluc1tpICogMl0sIG1fcERvbWFpbnNbaSAqIDIgKyAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BFbmNvZGVJbmZvW2ldLmVuY29kZV9taW4sIG1fcEVuY29kZUluZm9baV0uZW5jb2RlX21heCk7Ci0gICAgICAgIGluZGV4W2ldID0gKGludCllbmNvZGVkX2lucHV0W2ldOwotICAgICAgICBpZiAoaW5kZXhbaV0gPCAwKSB7Ci0gICAgICAgICAgICBpbmRleFtpXSA9IDA7Ci0gICAgICAgIH0gZWxzZSBpZiAoaW5kZXhbaV0gPiBtX3BFbmNvZGVJbmZvW2ldLnNpemVzIC0gMSkgewotICAgICAgICAgICAgaW5kZXhbaV0gPSBtX3BFbmNvZGVJbmZvW2ldLnNpemVzIC0gMTsKLSAgICAgICAgfQotICAgICAgICBwb3MgKz0gaW5kZXhbaV0gKiBibG9ja3NpemVbaV07Ci0gICAgfQotICAgIEZYX1NBRkVfSU5UMzIgYml0cG9zID0gcG9zOwotICAgIGJpdHBvcyAqPSBtX25CaXRzUGVyU2FtcGxlOwotICAgIGJpdHBvcyAqPSBtX25PdXRwdXRzOwotICAgIGlmICghYml0cG9zLklzVmFsaWQoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX0xQQ0JZVEUgcFNhbXBsZURhdGEgPSBtX3BTYW1wbGVTdHJlYW0tPkdldERhdGEoKTsKLSAgICBpZiAocFNhbXBsZURhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX1NBRkVfSU5UMzIgYml0cG9zMSA9IG1fbk91dHB1dHMgLSAxID4gMCA/IG1fbk91dHB1dHMgLSAxIDogMDsgCi0gICAgYml0cG9zMSAqPSBtX25CaXRzUGVyU2FtcGxlOwotICAgIGJpdHBvczEgKz0gYml0cG9zLlZhbHVlT3JEaWUoKTsKLSAgICBpZiAoIWJpdHBvczEuSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBtX25PdXRwdXRzOyBqICsrKSB7Ci0gICAgICAgIEZYX0RXT1JEIHNhbXBsZSA9IF9HZXRCaXRzMzIocFNhbXBsZURhdGEsIGJpdHBvcy5WYWx1ZU9yRGllKCkgKyBqICogbV9uQml0c1BlclNhbXBsZSwgbV9uQml0c1BlclNhbXBsZSk7Ci0gICAgICAgIEZYX0ZMT0FUIGVuY29kZWQgPSAoRlhfRkxPQVQpc2FtcGxlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbklucHV0czsgaSArKykgewotICAgICAgICAgICAgaWYgKGluZGV4W2ldID09IG1fcEVuY29kZUluZm9baV0uc2l6ZXMgLSAxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4W2ldID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlZCA9IGVuY29kZWRfaW5wdXRbaV0gKiAoRlhfRkxPQVQpc2FtcGxlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgRlhfU0FGRV9JTlQzMiBiaXRwb3MyID0gYmxvY2tzaXplW2ldOwotICAgICAgICAgICAgICAgIGJpdHBvczIgKz0gcG9zOwotICAgICAgICAgICAgICAgIGJpdHBvczIgKj0gbV9uT3V0cHV0czsKLSAgICAgICAgICAgICAgICBiaXRwb3MyICs9IGo7Ci0gICAgICAgICAgICAgICAgYml0cG9zMiAqPSBtX25CaXRzUGVyU2FtcGxlOyAKLSAgICAgICAgICAgICAgICBpZiAoIWJpdHBvczIuSXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhfRFdPUkQgc2FtcGxlMSA9IF9HZXRCaXRzMzIocFNhbXBsZURhdGEsIGJpdHBvczIuVmFsdWVPckRpZSgpLCBtX25CaXRzUGVyU2FtcGxlKTsKLSAgICAgICAgICAgICAgICBlbmNvZGVkICs9IChlbmNvZGVkX2lucHV0W2ldIC0gaW5kZXhbaV0pICogKChGWF9GTE9BVClzYW1wbGUxIC0gKEZYX0ZMT0FUKXNhbXBsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0c1tqXSA9IFBERl9JbnRlcnBvbGF0ZShlbmNvZGVkLCAwLCAoRlhfRkxPQVQpbV9TYW1wbGVNYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGVjb2RlSW5mb1tqXS5kZWNvZGVfbWluLCBtX3BEZWNvZGVJbmZvW2pdLmRlY29kZV9tYXgpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLWNsYXNzIENQREZfUFNGdW5jIDogcHVibGljIENQREZfRnVuY3Rpb24KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfSW5pdChDUERGX09iamVjdCogcE9iaik7Ci0gICAgdmlydHVhbCBGWF9CT09MCQl2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0OwotICAgIENQREZfUFNFbmdpbmUgbV9QUzsKLX07Ci1GWF9CT09MIENQREZfUFNGdW5jOjp2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopCi17Ci0gICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSAoQ1BERl9TdHJlYW0qKXBPYmo7Ci0gICAgQ1BERl9TdHJlYW1BY2MgYWNjOwotICAgIGFjYy5Mb2FkQWxsRGF0YShwU3RyZWFtLCBGQUxTRSk7Ci0gICAgcmV0dXJuIG1fUFMuUGFyc2UoKGNvbnN0IEZYX0NIQVIqKWFjYy5HZXREYXRhKCksIGFjYy5HZXRTaXplKCkpOwotfQotRlhfQk9PTCBDUERGX1BTRnVuYzo6dl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiByZXN1bHRzKSBjb25zdAotewotICAgIENQREZfUFNFbmdpbmUmIFBTID0gKENQREZfUFNFbmdpbmUmKW1fUFM7Ci0gICAgUFMuUmVzZXQoKTsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbV9uSW5wdXRzOyBpICsrKSB7Ci0gICAgICAgIFBTLlB1c2goaW5wdXRzW2ldKTsKLSAgICB9Ci0gICAgUFMuRXhlY3V0ZSgpOwotICAgIGlmIChQUy5HZXRTdGFja1NpemUoKSA8IG1fbk91dHB1dHMpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbV9uT3V0cHV0czsgaSArKykgewotICAgICAgICByZXN1bHRzW21fbk91dHB1dHMgLSBpIC0gMV0gPSBQUy5Qb3AoKTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1jbGFzcyBDUERGX0V4cEludEZ1bmMgOiBwdWJsaWMgQ1BERl9GdW5jdGlvbgotewotcHVibGljOgotICAgIENQREZfRXhwSW50RnVuYygpOwotICAgIHZpcnR1YWwgfkNQREZfRXhwSW50RnVuYygpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3Q7Ci0gICAgRlhfRkxPQVQJbV9FeHBvbmVudDsKLSAgICBGWF9GTE9BVCoJbV9wQmVnaW5WYWx1ZXM7Ci0gICAgRlhfRkxPQVQqCW1fcEVuZFZhbHVlczsKLSAgICBpbnQJCW1fbk9yaWdPdXRwdXRzOwotfTsKLUNQREZfRXhwSW50RnVuYzo6Q1BERl9FeHBJbnRGdW5jKCkKLXsKLSAgICBtX3BCZWdpblZhbHVlcyA9IE5VTEw7Ci0gICAgbV9wRW5kVmFsdWVzID0gTlVMTDsKLX0KLUNQREZfRXhwSW50RnVuYzo6fkNQREZfRXhwSW50RnVuYygpCi17Ci0gICAgaWYgKG1fcEJlZ2luVmFsdWVzKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wQmVnaW5WYWx1ZXMpOwotICAgIH0KLSAgICBpZiAobV9wRW5kVmFsdWVzKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wRW5kVmFsdWVzKTsKLSAgICB9Ci19Ci1GWF9CT09MIENQREZfRXhwSW50RnVuYzo6dl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKQotewotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwT2JqLT5HZXREaWN0KCk7Ci0gICAgaWYgKHBEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDUERGX0FycmF5KiBwQXJyYXkwID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJDMCIpKTsKLSAgICBpZiAobV9uT3V0cHV0cyA9PSAwKSB7Ci0gICAgICAgIG1fbk91dHB1dHMgPSAxOwotICAgICAgICBpZiAocEFycmF5MCkgewotICAgICAgICAgICAgbV9uT3V0cHV0cyA9IHBBcnJheTAtPkdldENvdW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcEFycmF5MSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiQzEiKSk7Ci0gICAgbV9wQmVnaW5WYWx1ZXMgPSBGWF9BbGxvYzJEKEZYX0ZMT0FULCBtX25PdXRwdXRzLCAyKTsKLSAgICBtX3BFbmRWYWx1ZXMgPSBGWF9BbGxvYzJEKEZYX0ZMT0FULCBtX25PdXRwdXRzLCAyKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbk91dHB1dHM7IGkgKyspIHsKLSAgICAgICAgbV9wQmVnaW5WYWx1ZXNbaV0gPSBwQXJyYXkwID8gcEFycmF5MC0+R2V0RmxvYXQoaSkgOiAwLjBmOwotICAgICAgICBtX3BFbmRWYWx1ZXNbaV0gPSBwQXJyYXkxID8gcEFycmF5MS0+R2V0RmxvYXQoaSkgOiAxLjBmOwotICAgIH0KLSAgICBtX0V4cG9uZW50ID0gcERpY3QtPkdldEZsb2F0KEZYX0JTVFJDKCJOIikpOwotICAgIG1fbk9yaWdPdXRwdXRzID0gbV9uT3V0cHV0czsKLSAgICBpZiAobV9uT3V0cHV0cyAmJiBtX25JbnB1dHMgPiBJTlRfTUFYIC8gbV9uT3V0cHV0cykgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fbk91dHB1dHMgKj0gbV9uSW5wdXRzOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX0V4cEludEZ1bmM6OnZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3QKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbklucHV0czsgaSArKykKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtX25PcmlnT3V0cHV0czsgaiArKykgewotICAgICAgICAgICAgcmVzdWx0c1tpICogbV9uT3JpZ091dHB1dHMgKyBqXSA9IG1fcEJlZ2luVmFsdWVzW2pdICsgKEZYX0ZMT0FUKUZYU1lTX3BvdyhpbnB1dHNbaV0sIG1fRXhwb25lbnQpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV9wRW5kVmFsdWVzW2pdIC0gbV9wQmVnaW5WYWx1ZXNbal0pOwotICAgICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1jbGFzcyBDUERGX1N0aXRjaEZ1bmMgOiBwdWJsaWMgQ1BERl9GdW5jdGlvbgotewotcHVibGljOgotICAgIENQREZfU3RpdGNoRnVuYygpOwotICAgIHZpcnR1YWwgfkNQREZfU3RpdGNoRnVuYygpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3Q7Ci0gICAgaW50CQkJbV9uU3ViczsKLSAgICBDUERGX0Z1bmN0aW9uKiogbV9wU3ViRnVuY3Rpb25zOwotICAgIEZYX0ZMT0FUKgltX3BCb3VuZHM7Ci0gICAgRlhfRkxPQVQqCW1fcEVuY29kZTsKLX07Ci1DUERGX1N0aXRjaEZ1bmM6OkNQREZfU3RpdGNoRnVuYygpCi17Ci0gICAgbV9uU3VicyA9IDA7Ci0gICAgbV9wU3ViRnVuY3Rpb25zID0gTlVMTDsKLSAgICBtX3BCb3VuZHMgPSBOVUxMOwotICAgIG1fcEVuY29kZSA9IE5VTEw7Ci19Ci1DUERGX1N0aXRjaEZ1bmM6On5DUERGX1N0aXRjaEZ1bmMoKQotewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uU3ViczsgaSArKykKLSAgICAgICAgaWYgKG1fcFN1YkZ1bmN0aW9uc1tpXSkgewotICAgICAgICAgICAgZGVsZXRlIG1fcFN1YkZ1bmN0aW9uc1tpXTsKLSAgICAgICAgfQotICAgIGlmIChtX3BTdWJGdW5jdGlvbnMpIHsKLSAgICAgICAgRlhfRnJlZShtX3BTdWJGdW5jdGlvbnMpOwotICAgIH0KLSAgICBpZiAobV9wQm91bmRzKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wQm91bmRzKTsKLSAgICB9Ci0gICAgaWYgKG1fcEVuY29kZSkgewotICAgICAgICBGWF9GcmVlKG1fcEVuY29kZSk7Ci0gICAgfQotfQotRlhfQk9PTCBDUERGX1N0aXRjaEZ1bmM6OnZfSW5pdChDUERGX09iamVjdCogcE9iaikKLXsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcE9iai0+R2V0RGljdCgpOwotICAgIGlmIChwRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcEFycmF5ID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJGdW5jdGlvbnMiKSk7Ci0gICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9uU3VicyA9IHBBcnJheS0+R2V0Q291bnQoKTsKLSAgICBpZiAobV9uU3VicyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9wU3ViRnVuY3Rpb25zID0gRlhfQWxsb2MoQ1BERl9GdW5jdGlvbiosIG1fblN1YnMpOwotICAgIG1fbk91dHB1dHMgPSAwOwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBtX25TdWJzOyBpICsrKSB7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwU3ViID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoaSk7Ci0gICAgICAgIGlmIChwU3ViID09IHBPYmopIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBtX3BTdWJGdW5jdGlvbnNbaV0gPSBDUERGX0Z1bmN0aW9uOjpMb2FkKHBTdWIpOwotICAgICAgICBpZiAobV9wU3ViRnVuY3Rpb25zW2ldID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9wU3ViRnVuY3Rpb25zW2ldLT5Db3VudE91dHB1dHMoKSA+IG1fbk91dHB1dHMpIHsKLSAgICAgICAgICAgIG1fbk91dHB1dHMgPSBtX3BTdWJGdW5jdGlvbnNbaV0tPkNvdW50T3V0cHV0cygpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1fcEJvdW5kcyA9IEZYX0FsbG9jKEZYX0ZMT0FULCBtX25TdWJzICsgMSk7Ci0gICAgbV9wQm91bmRzWzBdID0gbV9wRG9tYWluc1swXTsKLSAgICBwQXJyYXkgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkJvdW5kcyIpKTsKLSAgICBpZiAocEFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbV9uU3VicyAtIDE7IGkgKyspIHsKLSAgICAgICAgbV9wQm91bmRzW2kgKyAxXSA9IHBBcnJheS0+R2V0RmxvYXQoaSk7Ci0gICAgfQotICAgIG1fcEJvdW5kc1ttX25TdWJzXSA9IG1fcERvbWFpbnNbMV07Ci0gICAgbV9wRW5jb2RlID0gRlhfQWxsb2MyRChGWF9GTE9BVCwgbV9uU3VicywgMik7Ci0gICAgcEFycmF5ID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJFbmNvZGUiKSk7Ci0gICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IG1fblN1YnMgKiAyOyBpICsrKSB7Ci0gICAgICAgIG1fcEVuY29kZVtpXSA9IHBBcnJheS0+R2V0RmxvYXQoaSk7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX1N0aXRjaEZ1bmM6OnZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogb3V0cHV0cykgY29uc3QKLXsKLSAgICBGWF9GTE9BVCBpbnB1dCA9IGlucHV0c1swXTsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbV9uU3VicyAtIDE7IGkgKyspCi0gICAgICAgIGlmIChpbnB1dCA8IG1fcEJvdW5kc1tpICsgMV0pIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgaWYgKG1fcFN1YkZ1bmN0aW9uc1tpXSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaW5wdXQgPSBQREZfSW50ZXJwb2xhdGUoaW5wdXQsIG1fcEJvdW5kc1tpXSwgbV9wQm91bmRzW2kgKyAxXSwgbV9wRW5jb2RlW2kgKiAyXSwgbV9wRW5jb2RlW2kgKiAyICsgMV0pOwotICAgIGludCBucmVzdWx0czsKLSAgICBtX3BTdWJGdW5jdGlvbnNbaV0tPkNhbGwoJmlucHV0LCBtX25JbnB1dHMsIG91dHB1dHMsIG5yZXN1bHRzKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUNQREZfRnVuY3Rpb24qIENQREZfRnVuY3Rpb246OkxvYWQoQ1BERl9PYmplY3QqIHBGdW5jT2JqKQotewotICAgIGlmIChwRnVuY09iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX0Z1bmN0aW9uKiBwRnVuYyA9IE5VTEw7Ci0gICAgaW50IHR5cGU7Ci0gICAgaWYgKHBGdW5jT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgewotICAgICAgICB0eXBlID0gKChDUERGX1N0cmVhbSopcEZ1bmNPYmopLT5HZXREaWN0KCktPkdldEludGVnZXIoRlhfQlNUUkMoIkZ1bmN0aW9uVHlwZSIpKTsKLSAgICB9IGVsc2UgaWYgKHBGdW5jT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgdHlwZSA9ICgoQ1BERl9EaWN0aW9uYXJ5KilwRnVuY09iaiktPkdldEludGVnZXIoRlhfQlNUUkMoIkZ1bmN0aW9uVHlwZSIpKTsKKyAgICBuVG90YWxTYW1wbGVCaXRzICo9IG1fcEVuY29kZUluZm9baV0uc2l6ZXM7CisgICAgaWYgKHBFbmNvZGUpIHsKKyAgICAgIG1fcEVuY29kZUluZm9baV0uZW5jb2RlX21pbiA9IHBFbmNvZGUtPkdldEZsb2F0KGkgKiAyKTsKKyAgICAgIG1fcEVuY29kZUluZm9baV0uZW5jb2RlX21heCA9IHBFbmNvZGUtPkdldEZsb2F0KGkgKiAyICsgMSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICBtX3BFbmNvZGVJbmZvW2ldLmVuY29kZV9taW4gPSAwOworICAgICAgaWYgKG1fcEVuY29kZUluZm9baV0uc2l6ZXMgPT0gMSkgeworICAgICAgICBtX3BFbmNvZGVJbmZvW2ldLmVuY29kZV9tYXggPSAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbV9wRW5jb2RlSW5mb1tpXS5lbmNvZGVfbWF4ID0gKEZYX0ZMT0FUKW1fcEVuY29kZUluZm9baV0uc2l6ZXMgLSAxOworICAgICAgfQogICAgIH0KLSAgICBpZiAodHlwZSA9PSAwKSB7Ci0gICAgICAgIHBGdW5jID0gbmV3IENQREZfU2FtcGxlZEZ1bmM7Ci0gICAgfSBlbHNlIGlmICh0eXBlID09IDIpIHsKLSAgICAgICAgcEZ1bmMgPSBuZXcgQ1BERl9FeHBJbnRGdW5jOwotICAgIH0gZWxzZSBpZiAodHlwZSA9PSAzKSB7Ci0gICAgICAgIHBGdW5jID0gbmV3IENQREZfU3RpdGNoRnVuYzsKLSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gNCkgewotICAgICAgICBwRnVuYyA9IG5ldyBDUERGX1BTRnVuYzsKKyAgfQorICBuVG90YWxTYW1wbGVCaXRzICo9IG1fbkJpdHNQZXJTYW1wbGU7CisgIG5Ub3RhbFNhbXBsZUJpdHMgKj0gbV9uT3V0cHV0czsKKyAgRlhfU0FGRV9EV09SRCBuVG90YWxTYW1wbGVCeXRlcyA9IG5Ub3RhbFNhbXBsZUJpdHM7CisgIG5Ub3RhbFNhbXBsZUJ5dGVzICs9IDc7CisgIG5Ub3RhbFNhbXBsZUJ5dGVzIC89IDg7CisgIGlmICghblRvdGFsU2FtcGxlQnl0ZXMuSXNWYWxpZCgpIHx8IG5Ub3RhbFNhbXBsZUJ5dGVzLlZhbHVlT3JEaWUoKSA9PSAwIHx8CisgICAgICBuVG90YWxTYW1wbGVCeXRlcy5WYWx1ZU9yRGllKCkgPiBtX3BTYW1wbGVTdHJlYW0tPkdldFNpemUoKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX3BEZWNvZGVJbmZvID0gRlhfQWxsb2MoU2FtcGxlRGVjb2RlSW5mbywgbV9uT3V0cHV0cyk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uT3V0cHV0czsgaSsrKSB7CisgICAgaWYgKHBEZWNvZGUpIHsKKyAgICAgIG1fcERlY29kZUluZm9baV0uZGVjb2RlX21pbiA9IHBEZWNvZGUtPkdldEZsb2F0KDIgKiBpKTsKKyAgICAgIG1fcERlY29kZUluZm9baV0uZGVjb2RlX21heCA9IHBEZWNvZGUtPkdldEZsb2F0KDIgKiBpICsgMSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICBtX3BEZWNvZGVJbmZvW2ldLmRlY29kZV9taW4gPSBtX3BSYW5nZXNbaSAqIDJdOworICAgICAgbV9wRGVjb2RlSW5mb1tpXS5kZWNvZGVfbWF4ID0gbV9wUmFuZ2VzW2kgKiAyICsgMV07CiAgICAgfQotICAgIGlmICghcEZ1bmMtPkluaXQocEZ1bmNPYmopKSB7Ci0gICAgICAgIGRlbGV0ZSBwRnVuYzsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBwRnVuYzsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLUNQREZfRnVuY3Rpb246OkNQREZfRnVuY3Rpb24oKQotewotICAgIG1fcERvbWFpbnMgPSBOVUxMOwotICAgIG1fcFJhbmdlcyA9IE5VTEw7Ci19Ci1DUERGX0Z1bmN0aW9uOjp+Q1BERl9GdW5jdGlvbigpCi17Ci0gICAgaWYgKG1fcERvbWFpbnMpIHsKLSAgICAgICAgRlhfRnJlZShtX3BEb21haW5zKTsKLSAgICAgICAgbV9wRG9tYWlucyA9IE5VTEw7CitGWF9CT09MIENQREZfU2FtcGxlZEZ1bmM6OnZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3QgeworICBpbnQgcG9zID0gMDsKKyAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IGVuY29kZWRfaW5wdXRfYnVmKG1fbklucHV0cyk7CisgIEZYX0ZMT0FUKiBlbmNvZGVkX2lucHV0ID0gZW5jb2RlZF9pbnB1dF9idWY7CisgIENGWF9GaXhlZEJ1Zkdyb3c8aW50LCAzMj4gaW50X2J1ZihtX25JbnB1dHMgKiAyKTsKKyAgaW50KiBpbmRleCA9IGludF9idWY7CisgIGludCogYmxvY2tzaXplID0gaW5kZXggKyBtX25JbnB1dHM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uSW5wdXRzOyBpKyspIHsKKyAgICBpZiAoaSA9PSAwKSB7CisgICAgICBibG9ja3NpemVbaV0gPSAxOworICAgIH0gZWxzZSB7CisgICAgICBibG9ja3NpemVbaV0gPSBibG9ja3NpemVbaSAtIDFdICogbV9wRW5jb2RlSW5mb1tpIC0gMV0uc2l6ZXM7CiAgICAgfQorICAgIGVuY29kZWRfaW5wdXRbaV0gPSBQREZfSW50ZXJwb2xhdGUoCisgICAgICAgIGlucHV0c1tpXSwgbV9wRG9tYWluc1tpICogMl0sIG1fcERvbWFpbnNbaSAqIDIgKyAxXSwKKyAgICAgICAgbV9wRW5jb2RlSW5mb1tpXS5lbmNvZGVfbWluLCBtX3BFbmNvZGVJbmZvW2ldLmVuY29kZV9tYXgpOworICAgIGluZGV4W2ldID0gKGludCllbmNvZGVkX2lucHV0W2ldOworICAgIGlmIChpbmRleFtpXSA8IDApIHsKKyAgICAgIGluZGV4W2ldID0gMDsKKyAgICB9IGVsc2UgaWYgKGluZGV4W2ldID4gbV9wRW5jb2RlSW5mb1tpXS5zaXplcyAtIDEpIHsKKyAgICAgIGluZGV4W2ldID0gbV9wRW5jb2RlSW5mb1tpXS5zaXplcyAtIDE7CisgICAgfQorICAgIHBvcyArPSBpbmRleFtpXSAqIGJsb2Nrc2l6ZVtpXTsKKyAgfQorICBGWF9TQUZFX0lOVDMyIGJpdHNfdG9fb3V0cHV0ID0gbV9uT3V0cHV0czsKKyAgYml0c190b19vdXRwdXQgKj0gbV9uQml0c1BlclNhbXBsZTsKKyAgaWYgKCFiaXRzX3RvX291dHB1dC5Jc1ZhbGlkKCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhfU0FGRV9JTlQzMiBiaXRwb3MgPSBwb3M7CisgIGJpdHBvcyAqPSBiaXRzX3RvX291dHB1dC5WYWx1ZU9yRGllKCk7CisgIGlmICghYml0cG9zLklzVmFsaWQoKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9TQUZFX0lOVDMyIHJhbmdlX2NoZWNrID0gYml0cG9zOworICByYW5nZV9jaGVjayArPSBiaXRzX3RvX291dHB1dC5WYWx1ZU9yRGllKCk7CisgIGlmICghcmFuZ2VfY2hlY2suSXNWYWxpZCgpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGNvbnN0IHVpbnQ4X3QqIHBTYW1wbGVEYXRhID0gbV9wU2FtcGxlU3RyZWFtLT5HZXREYXRhKCk7CisgIGlmICghcFNhbXBsZURhdGEpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZm9yIChpbnQgaiA9IDA7IGogPCBtX25PdXRwdXRzOyBqKyspIHsKKyAgICBGWF9EV09SRCBzYW1wbGUgPQorICAgICAgICBfR2V0Qml0czMyKHBTYW1wbGVEYXRhLCBiaXRwb3MuVmFsdWVPckRpZSgpICsgaiAqIG1fbkJpdHNQZXJTYW1wbGUsCisgICAgICAgICAgICAgICAgICAgbV9uQml0c1BlclNhbXBsZSk7CisgICAgRlhfRkxPQVQgZW5jb2RlZCA9IChGWF9GTE9BVClzYW1wbGU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25JbnB1dHM7IGkrKykgeworICAgICAgaWYgKGluZGV4W2ldID09IG1fcEVuY29kZUluZm9baV0uc2l6ZXMgLSAxKSB7CisgICAgICAgIGlmIChpbmRleFtpXSA9PSAwKSB7CisgICAgICAgICAgZW5jb2RlZCA9IGVuY29kZWRfaW5wdXRbaV0gKiAoRlhfRkxPQVQpc2FtcGxlOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBGWF9TQUZFX0lOVDMyIGJpdHBvczIgPSBibG9ja3NpemVbaV07CisgICAgICAgIGJpdHBvczIgKz0gcG9zOworICAgICAgICBiaXRwb3MyICo9IG1fbk91dHB1dHM7CisgICAgICAgIGJpdHBvczIgKz0gajsKKyAgICAgICAgYml0cG9zMiAqPSBtX25CaXRzUGVyU2FtcGxlOworICAgICAgICBpZiAoIWJpdHBvczIuSXNWYWxpZCgpKSB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIEZYX0RXT1JEIHNhbXBsZTEgPQorICAgICAgICAgICAgX0dldEJpdHMzMihwU2FtcGxlRGF0YSwgYml0cG9zMi5WYWx1ZU9yRGllKCksIG1fbkJpdHNQZXJTYW1wbGUpOworICAgICAgICBlbmNvZGVkICs9IChlbmNvZGVkX2lucHV0W2ldIC0gaW5kZXhbaV0pICoKKyAgICAgICAgICAgICAgICAgICAoKEZYX0ZMT0FUKXNhbXBsZTEgLSAoRlhfRkxPQVQpc2FtcGxlKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmVzdWx0c1tqXSA9IFBERl9JbnRlcnBvbGF0ZShlbmNvZGVkLCAwLCAoRlhfRkxPQVQpbV9TYW1wbGVNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BEZWNvZGVJbmZvW2pdLmRlY29kZV9taW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BEZWNvZGVJbmZvW2pdLmRlY29kZV9tYXgpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitjbGFzcyBDUERGX1BTRnVuYyA6IHB1YmxpYyBDUERGX0Z1bmN0aW9uIHsKKyBwdWJsaWM6CisgIC8vIENQREZfRnVuY3Rpb24KKyAgRlhfQk9PTCB2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopIG92ZXJyaWRlOworICBGWF9CT09MIHZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgQ1BERl9QU0VuZ2luZSBtX1BTOworfTsKKworRlhfQk9PTCBDUERGX1BTRnVuYzo6dl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKSB7CisgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gcE9iai0+QXNTdHJlYW0oKTsKKyAgQ1BERl9TdHJlYW1BY2MgYWNjOworICBhY2MuTG9hZEFsbERhdGEocFN0cmVhbSwgRkFMU0UpOworICByZXR1cm4gbV9QUy5QYXJzZSgoY29uc3QgRlhfQ0hBUiopYWNjLkdldERhdGEoKSwgYWNjLkdldFNpemUoKSk7Cit9CitGWF9CT09MIENQREZfUFNGdW5jOjp2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0IHsKKyAgQ1BERl9QU0VuZ2luZSYgUFMgPSAoQ1BERl9QU0VuZ2luZSYpbV9QUzsKKyAgUFMuUmVzZXQoKTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBtX25JbnB1dHM7IGkrKykgeworICAgIFBTLlB1c2goaW5wdXRzW2ldKTsKKyAgfQorICBQUy5FeGVjdXRlKCk7CisgIGlmIChQUy5HZXRTdGFja1NpemUoKSA8IG1fbk91dHB1dHMpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IG1fbk91dHB1dHM7IGkrKykgeworICAgIHJlc3VsdHNbbV9uT3V0cHV0cyAtIGkgLSAxXSA9IFBTLlBvcCgpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitjbGFzcyBDUERGX0V4cEludEZ1bmMgOiBwdWJsaWMgQ1BERl9GdW5jdGlvbiB7CisgcHVibGljOgorICBDUERGX0V4cEludEZ1bmMoKTsKKyAgfkNQREZfRXhwSW50RnVuYygpIG92ZXJyaWRlOworCisgIC8vIENQREZfRnVuY3Rpb24KKyAgRlhfQk9PTCB2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopIG92ZXJyaWRlOworICBGWF9CT09MIHZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgRlhfRkxPQVQgbV9FeHBvbmVudDsKKyAgRlhfRkxPQVQqIG1fcEJlZ2luVmFsdWVzOworICBGWF9GTE9BVCogbV9wRW5kVmFsdWVzOworICBpbnQgbV9uT3JpZ091dHB1dHM7Cit9OworCitDUERGX0V4cEludEZ1bmM6OkNQREZfRXhwSW50RnVuYygpIHsKKyAgbV9wQmVnaW5WYWx1ZXMgPSBOVUxMOworICBtX3BFbmRWYWx1ZXMgPSBOVUxMOworfQorQ1BERl9FeHBJbnRGdW5jOjp+Q1BERl9FeHBJbnRGdW5jKCkgeworICAgIEZYX0ZyZWUobV9wQmVnaW5WYWx1ZXMpOworICAgIEZYX0ZyZWUobV9wRW5kVmFsdWVzKTsKK30KK0ZYX0JPT0wgQ1BERl9FeHBJbnRGdW5jOjp2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBPYmotPkdldERpY3QoKTsKKyAgaWYgKCFwRGljdCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDUERGX0FycmF5KiBwQXJyYXkwID0gcERpY3QtPkdldEFycmF5KCJDMCIpOworICBpZiAobV9uT3V0cHV0cyA9PSAwKSB7CisgICAgbV9uT3V0cHV0cyA9IDE7CisgICAgaWYgKHBBcnJheTApIHsKKyAgICAgIG1fbk91dHB1dHMgPSBwQXJyYXkwLT5HZXRDb3VudCgpOworICAgIH0KKyAgfQorICBDUERGX0FycmF5KiBwQXJyYXkxID0gcERpY3QtPkdldEFycmF5KCJDMSIpOworICBtX3BCZWdpblZhbHVlcyA9IEZYX0FsbG9jMkQoRlhfRkxPQVQsIG1fbk91dHB1dHMsIDIpOworICBtX3BFbmRWYWx1ZXMgPSBGWF9BbGxvYzJEKEZYX0ZMT0FULCBtX25PdXRwdXRzLCAyKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25PdXRwdXRzOyBpKyspIHsKKyAgICBtX3BCZWdpblZhbHVlc1tpXSA9IHBBcnJheTAgPyBwQXJyYXkwLT5HZXRGbG9hdChpKSA6IDAuMGY7CisgICAgbV9wRW5kVmFsdWVzW2ldID0gcEFycmF5MSA/IHBBcnJheTEtPkdldEZsb2F0KGkpIDogMS4wZjsKKyAgfQorICBtX0V4cG9uZW50ID0gcERpY3QtPkdldEZsb2F0KCJOIik7CisgIG1fbk9yaWdPdXRwdXRzID0gbV9uT3V0cHV0czsKKyAgaWYgKG1fbk91dHB1dHMgJiYgbV9uSW5wdXRzID4gSU5UX01BWCAvIG1fbk91dHB1dHMpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9uT3V0cHV0cyAqPSBtX25JbnB1dHM7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUERGX0V4cEludEZ1bmM6OnZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3QgeworICBmb3IgKGludCBpID0gMDsgaSA8IG1fbklucHV0czsgaSsrKQorICAgIGZvciAoaW50IGogPSAwOyBqIDwgbV9uT3JpZ091dHB1dHM7IGorKykgeworICAgICAgcmVzdWx0c1tpICogbV9uT3JpZ091dHB1dHMgKyBqXSA9CisgICAgICAgICAgbV9wQmVnaW5WYWx1ZXNbal0gKworICAgICAgICAgIChGWF9GTE9BVClGWFNZU19wb3coaW5wdXRzW2ldLCBtX0V4cG9uZW50KSAqCisgICAgICAgICAgICAgIChtX3BFbmRWYWx1ZXNbal0gLSBtX3BCZWdpblZhbHVlc1tqXSk7CisgICAgfQorICByZXR1cm4gVFJVRTsKK30KKworY2xhc3MgQ1BERl9TdGl0Y2hGdW5jIDogcHVibGljIENQREZfRnVuY3Rpb24geworIHB1YmxpYzoKKyAgQ1BERl9TdGl0Y2hGdW5jKCk7CisgIH5DUERGX1N0aXRjaEZ1bmMoKSBvdmVycmlkZTsKKworICAvLyBDUERGX0Z1bmN0aW9uCisgIEZYX0JPT0wgdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKSBvdmVycmlkZTsKKyAgRlhfQk9PTCB2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6dmVjdG9yPENQREZfRnVuY3Rpb24qPiBtX3BTdWJGdW5jdGlvbnM7CisgIEZYX0ZMT0FUKiBtX3BCb3VuZHM7CisgIEZYX0ZMT0FUKiBtX3BFbmNvZGU7CisKKyAgc3RhdGljIGNvbnN0IGludCBrUmVxdWlyZWROdW1JbnB1dHMgPSAxOworfTsKKworQ1BERl9TdGl0Y2hGdW5jOjpDUERGX1N0aXRjaEZ1bmMoKSB7CisgIG1fcEJvdW5kcyA9IE5VTEw7CisgIG1fcEVuY29kZSA9IE5VTEw7Cit9CitDUERGX1N0aXRjaEZ1bmM6On5DUERGX1N0aXRjaEZ1bmMoKSB7CisgIGZvciAoYXV0byYgc3ViIDogbV9wU3ViRnVuY3Rpb25zKSB7CisgICAgZGVsZXRlIHN1YjsKKyAgfQorICBGWF9GcmVlKG1fcEJvdW5kcyk7CisgIEZYX0ZyZWUobV9wRW5jb2RlKTsKK30KK0ZYX0JPT0wgQ1BERl9TdGl0Y2hGdW5jOjp2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBPYmotPkdldERpY3QoKTsKKyAgaWYgKCFwRGljdCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAobV9uSW5wdXRzICE9IGtSZXF1aXJlZE51bUlucHV0cykgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDUERGX0FycmF5KiBwQXJyYXkgPSBwRGljdC0+R2V0QXJyYXkoIkZ1bmN0aW9ucyIpOworICBpZiAoIXBBcnJheSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9EV09SRCBuU3VicyA9IHBBcnJheS0+R2V0Q291bnQoKTsKKyAgaWYgKG5TdWJzID09IDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9uT3V0cHV0cyA9IDA7CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBuU3ViczsgaSsrKSB7CisgICAgQ1BERl9PYmplY3QqIHBTdWIgPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZShpKTsKKyAgICBpZiAocFN1YiA9PSBwT2JqKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0Z1bmN0aW9uPiBwRnVuYyhDUERGX0Z1bmN0aW9uOjpMb2FkKHBTdWIpKTsKKyAgICBpZiAoIXBGdW5jKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIC8vIENoZWNrIHRoYXQgdGhlIGlucHV0IGRpbWVuc2lvbmFsaXR5IGlzIDEsIGFuZCB0aGF0IGFsbCBvdXRwdXQKKyAgICAvLyBkaW1lbnNpb25hbGl0aWVzIGFyZSB0aGUgc2FtZS4KKyAgICBpZiAocEZ1bmMtPkNvdW50SW5wdXRzKCkgIT0ga1JlcXVpcmVkTnVtSW5wdXRzKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGlmIChwRnVuYy0+Q291bnRPdXRwdXRzKCkgIT0gbV9uT3V0cHV0cykgeworICAgICAgaWYgKG1fbk91dHB1dHMpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgbV9uT3V0cHV0cyA9IHBGdW5jLT5Db3VudE91dHB1dHMoKTsKKyAgICB9CisKKyAgICBtX3BTdWJGdW5jdGlvbnMucHVzaF9iYWNrKHBGdW5jLnJlbGVhc2UoKSk7CisgIH0KKyAgbV9wQm91bmRzID0gRlhfQWxsb2MoRlhfRkxPQVQsIG5TdWJzICsgMSk7CisgIG1fcEJvdW5kc1swXSA9IG1fcERvbWFpbnNbMF07CisgIHBBcnJheSA9IHBEaWN0LT5HZXRBcnJheSgiQm91bmRzIik7CisgIGlmICghcEFycmF5KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBuU3VicyAtIDE7IGkrKykgeworICAgIG1fcEJvdW5kc1tpICsgMV0gPSBwQXJyYXktPkdldEZsb2F0KGkpOworICB9CisgIG1fcEJvdW5kc1tuU3Vic10gPSBtX3BEb21haW5zWzFdOworICBtX3BFbmNvZGUgPSBGWF9BbGxvYzJEKEZYX0ZMT0FULCBuU3VicywgMik7CisgIHBBcnJheSA9IHBEaWN0LT5HZXRBcnJheSgiRW5jb2RlIik7CisgIGlmICghcEFycmF5KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBuU3VicyAqIDI7IGkrKykgeworICAgIG1fcEVuY29kZVtpXSA9IHBBcnJheS0+R2V0RmxvYXQoaSk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENQREZfU3RpdGNoRnVuYzo6dl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiBvdXRwdXRzKSBjb25zdCB7CisgIEZYX0ZMT0FUIGlucHV0ID0gaW5wdXRzWzBdOworICBzaXplX3QgaTsKKyAgZm9yIChpID0gMDsgaSA8IG1fcFN1YkZ1bmN0aW9ucy5zaXplKCkgLSAxOyBpKyspCisgICAgaWYgKGlucHV0IDwgbV9wQm91bmRzW2kgKyAxXSkgeworICAgICAgYnJlYWs7CisgICAgfQorICBpZiAoIW1fcFN1YkZ1bmN0aW9uc1tpXSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpbnB1dCA9IFBERl9JbnRlcnBvbGF0ZShpbnB1dCwgbV9wQm91bmRzW2ldLCBtX3BCb3VuZHNbaSArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BFbmNvZGVbaSAqIDJdLCBtX3BFbmNvZGVbaSAqIDIgKyAxXSk7CisgIGludCBucmVzdWx0czsKKyAgbV9wU3ViRnVuY3Rpb25zW2ldLT5DYWxsKCZpbnB1dCwga1JlcXVpcmVkTnVtSW5wdXRzLCBvdXRwdXRzLCBucmVzdWx0cyk7CisgIHJldHVybiBUUlVFOworfQorQ1BERl9GdW5jdGlvbiogQ1BERl9GdW5jdGlvbjo6TG9hZChDUERGX09iamVjdCogcEZ1bmNPYmopIHsKKyAgaWYgKCFwRnVuY09iaikgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfRnVuY3Rpb24qIHBGdW5jID0gTlVMTDsKKyAgaW50IHR5cGU7CisgIGlmIChDUERGX1N0cmVhbSogcFN0cmVhbSA9IHBGdW5jT2JqLT5Bc1N0cmVhbSgpKSB7CisgICAgdHlwZSA9IHBTdHJlYW0tPkdldERpY3QoKS0+R2V0SW50ZWdlcigiRnVuY3Rpb25UeXBlIik7CisgIH0gZWxzZSBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBGdW5jT2JqLT5Bc0RpY3Rpb25hcnkoKSkgeworICAgIHR5cGUgPSBwRGljdC0+R2V0SW50ZWdlcigiRnVuY3Rpb25UeXBlIik7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHR5cGUgPT0gMCkgeworICAgIHBGdW5jID0gbmV3IENQREZfU2FtcGxlZEZ1bmM7CisgIH0gZWxzZSBpZiAodHlwZSA9PSAyKSB7CisgICAgcEZ1bmMgPSBuZXcgQ1BERl9FeHBJbnRGdW5jOworICB9IGVsc2UgaWYgKHR5cGUgPT0gMykgeworICAgIHBGdW5jID0gbmV3IENQREZfU3RpdGNoRnVuYzsKKyAgfSBlbHNlIGlmICh0eXBlID09IDQpIHsKKyAgICBwRnVuYyA9IG5ldyBDUERGX1BTRnVuYzsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoIXBGdW5jLT5Jbml0KHBGdW5jT2JqKSkgeworICAgIGRlbGV0ZSBwRnVuYzsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gcEZ1bmM7Cit9CitDUERGX0Z1bmN0aW9uOjpDUERGX0Z1bmN0aW9uKCkgeworICBtX3BEb21haW5zID0gTlVMTDsKKyAgbV9wUmFuZ2VzID0gTlVMTDsKK30KK0NQREZfRnVuY3Rpb246On5DUERGX0Z1bmN0aW9uKCkgeworICBGWF9GcmVlKG1fcERvbWFpbnMpOworICBGWF9GcmVlKG1fcFJhbmdlcyk7Cit9CitGWF9CT09MIENQREZfRnVuY3Rpb246OkluaXQoQ1BERl9PYmplY3QqIHBPYmopIHsKKyAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwT2JqLT5Bc1N0cmVhbSgpOworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFN0cmVhbSA/IHBTdHJlYW0tPkdldERpY3QoKSA6IHBPYmotPkFzRGljdGlvbmFyeSgpOworCisgIENQREZfQXJyYXkqIHBEb21haW5zID0gcERpY3QtPkdldEFycmF5KCJEb21haW4iKTsKKyAgaWYgKCFwRG9tYWlucykKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbV9uSW5wdXRzID0gcERvbWFpbnMtPkdldENvdW50KCkgLyAyOworICBpZiAobV9uSW5wdXRzID09IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIG1fcERvbWFpbnMgPSBGWF9BbGxvYzJEKEZYX0ZMT0FULCBtX25JbnB1dHMsIDIpOworICBmb3IgKGludCBpID0gMDsgaSA8IG1fbklucHV0cyAqIDI7IGkrKykgeworICAgIG1fcERvbWFpbnNbaV0gPSBwRG9tYWlucy0+R2V0RmxvYXQoaSk7CisgIH0KKyAgQ1BERl9BcnJheSogcFJhbmdlcyA9IHBEaWN0LT5HZXRBcnJheSgiUmFuZ2UiKTsKKyAgbV9uT3V0cHV0cyA9IDA7CisgIGlmIChwUmFuZ2VzKSB7CisgICAgbV9uT3V0cHV0cyA9IHBSYW5nZXMtPkdldENvdW50KCkgLyAyOworICAgIG1fcFJhbmdlcyA9IEZYX0FsbG9jMkQoRlhfRkxPQVQsIG1fbk91dHB1dHMsIDIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uT3V0cHV0cyAqIDI7IGkrKykgeworICAgICAgbV9wUmFuZ2VzW2ldID0gcFJhbmdlcy0+R2V0RmxvYXQoaSk7CisgICAgfQorICB9CisgIEZYX0RXT1JEIG9sZF9vdXRwdXRzID0gbV9uT3V0cHV0czsKKyAgaWYgKCF2X0luaXQocE9iaikpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fcFJhbmdlcyAmJiBtX25PdXRwdXRzID4gKGludClvbGRfb3V0cHV0cykgeworICAgIG1fcFJhbmdlcyA9IEZYX1JlYWxsb2MoRlhfRkxPQVQsIG1fcFJhbmdlcywgbV9uT3V0cHV0cyAqIDIpOwogICAgIGlmIChtX3BSYW5nZXMpIHsKLSAgICAgICAgRlhfRnJlZShtX3BSYW5nZXMpOwotICAgICAgICBtX3BSYW5nZXMgPSBOVUxMOworICAgICAgRlhTWVNfbWVtc2V0KG1fcFJhbmdlcyArIChvbGRfb3V0cHV0cyAqIDIpLCAwLAorICAgICAgICAgICAgICAgICAgIHNpemVvZihGWF9GTE9BVCkgKiAobV9uT3V0cHV0cyAtIG9sZF9vdXRwdXRzKSAqIDIpOwogICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ1BERl9GdW5jdGlvbjo6SW5pdChDUERGX09iamVjdCogcE9iaikKLXsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0OwotICAgIGlmIChwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgewotICAgICAgICBwRGljdCA9ICgoQ1BERl9TdHJlYW0qKXBPYmopLT5HZXREaWN0KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwT2JqOworRlhfQk9PTCBDUERGX0Z1bmN0aW9uOjpDYWxsKEZYX0ZMT0FUKiBpbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5pbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIHJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBucmVzdWx0cykgY29uc3QgeworICBpZiAobV9uSW5wdXRzICE9IG5pbnB1dHMpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbnJlc3VsdHMgPSBtX25PdXRwdXRzOworICBmb3IgKGludCBpID0gMDsgaSA8IG1fbklucHV0czsgaSsrKSB7CisgICAgaWYgKGlucHV0c1tpXSA8IG1fcERvbWFpbnNbaSAqIDJdKSB7CisgICAgICBpbnB1dHNbaV0gPSBtX3BEb21haW5zW2kgKiAyXTsKKyAgICB9IGVsc2UgaWYgKGlucHV0c1tpXSA+IG1fcERvbWFpbnNbaSAqIDIgKyAxXSkgeworICAgICAgaW5wdXRzW2ldID0gbV9wRG9tYWluc1tpICogMl0gKyAxOwogICAgIH0KLSAgICBDUERGX0FycmF5KiBwRG9tYWlucyA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRG9tYWluIikpOwotICAgIGlmIChwRG9tYWlucyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICB2X0NhbGwoaW5wdXRzLCByZXN1bHRzKTsKKyAgaWYgKG1fcFJhbmdlcykgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uT3V0cHV0czsgaSsrKSB7CisgICAgICBpZiAocmVzdWx0c1tpXSA8IG1fcFJhbmdlc1tpICogMl0pIHsKKyAgICAgICAgcmVzdWx0c1tpXSA9IG1fcFJhbmdlc1tpICogMl07CisgICAgICB9IGVsc2UgaWYgKHJlc3VsdHNbaV0gPiBtX3BSYW5nZXNbaSAqIDIgKyAxXSkgeworICAgICAgICByZXN1bHRzW2ldID0gbV9wUmFuZ2VzW2kgKiAyICsgMV07CisgICAgICB9CiAgICAgfQotICAgIG1fbklucHV0cyA9IHBEb21haW5zLT5HZXRDb3VudCgpIC8gMjsKLSAgICBpZiAobV9uSW5wdXRzID09IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX3BEb21haW5zID0gRlhfQWxsb2MyRChGWF9GTE9BVCwgbV9uSW5wdXRzLCAyKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbklucHV0cyAqIDI7IGkgKyspIHsKLSAgICAgICAgbV9wRG9tYWluc1tpXSA9IHBEb21haW5zLT5HZXRGbG9hdChpKTsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcFJhbmdlcyA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiUmFuZ2UiKSk7Ci0gICAgbV9uT3V0cHV0cyA9IDA7Ci0gICAgaWYgKHBSYW5nZXMpIHsKLSAgICAgICAgbV9uT3V0cHV0cyA9IHBSYW5nZXMtPkdldENvdW50KCkgLyAyOwotICAgICAgICBtX3BSYW5nZXMgPSBGWF9BbGxvYzJEKEZYX0ZMT0FULCBtX25PdXRwdXRzLCAyKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25PdXRwdXRzICogMjsgaSArKykgewotICAgICAgICAgICAgbV9wUmFuZ2VzW2ldID0gcFJhbmdlcy0+R2V0RmxvYXQoaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlhfRFdPUkQgb2xkX291dHB1dHMgPSBtX25PdXRwdXRzOwotICAgIEZYX0JPT0wgcmV0ID0gdl9Jbml0KHBPYmopOwotICAgIGlmIChtX3BSYW5nZXMgJiYgbV9uT3V0cHV0cyA+IChpbnQpb2xkX291dHB1dHMpIHsKLSAgICAgICAgbV9wUmFuZ2VzID0gRlhfUmVhbGxvYyhGWF9GTE9BVCwgbV9wUmFuZ2VzLCBtX25PdXRwdXRzICogMik7Ci0gICAgICAgIGlmIChtX3BSYW5nZXMpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbXNldDMyKG1fcFJhbmdlcyArIChvbGRfb3V0cHV0cyAqIDIpLCAwLCBzaXplb2YoRlhfRkxPQVQpICogKG1fbk91dHB1dHMgLSBvbGRfb3V0cHV0cykgKiAyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotRlhfQk9PTCBDUERGX0Z1bmN0aW9uOjpDYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIGludCBuaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cywgaW50JiBucmVzdWx0cykgY29uc3QKLXsKLSAgICBpZiAobV9uSW5wdXRzICE9IG5pbnB1dHMpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBucmVzdWx0cyA9IG1fbk91dHB1dHM7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25JbnB1dHM7IGkgKyspIHsKLSAgICAgICAgaWYgKGlucHV0c1tpXSA8IG1fcERvbWFpbnNbaSAqIDJdKSB7Ci0gICAgICAgICAgICBpbnB1dHNbaV0gPSBtX3BEb21haW5zW2kgKiAyXTsKLSAgICAgICAgfSBlbHNlIGlmIChpbnB1dHNbaV0gPiBtX3BEb21haW5zW2kgKiAyICsgMV0pIHsKLSAgICAgICAgICAgIGlucHV0c1tpXSA9IG1fcERvbWFpbnNbaSAqIDJdICsgMTsKLSAgICAgICAgfQotICAgIH0KLSAgICB2X0NhbGwoaW5wdXRzLCByZXN1bHRzKTsKLSAgICBpZiAobV9wUmFuZ2VzKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uT3V0cHV0czsgaSArKykgewotICAgICAgICAgICAgaWYgKHJlc3VsdHNbaV0gPCBtX3BSYW5nZXNbaSAqIDJdKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0c1tpXSA9IG1fcFJhbmdlc1tpICogMl07Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdHNbaV0gPiBtX3BSYW5nZXNbaSAqIDIgKyAxXSkgewotICAgICAgICAgICAgICAgIHJlc3VsdHNbaV0gPSBtX3BSYW5nZXNbaSAqIDIgKyAxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9mdW5jX2VtYmVkZGVydGVzdC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZnVuY19lbWJlZGRlcnRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4OTIwMzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZnVuY19lbWJlZGRlcnRlc3QuY3BwCkBAIC0wLDAgKzEsMjAgQEAKKy8vIENvcHlyaWdodCAyMDE1IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgInRlc3RpbmcvZW1iZWRkZXJfdGVzdC5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCitjbGFzcyBGUERGUGFnZUZ1bmNFbWJlZGRlcnRlc3QgOiBwdWJsaWMgRW1iZWRkZXJUZXN0IHt9OworCitURVNUX0YoRlBERlBhZ2VGdW5jRW1iZWRkZXJ0ZXN0LCBCdWdfNTUxNDYwKSB7CisgIC8vIFNob3VsZCBub3QgY3Jhc2ggdW5kZXIgQVNhbi4KKyAgLy8gVGVzdHMgdGhhdCB0aGUgbnVtYmVyIG9mIGlucHV0cyBpcyBub3Qgc2ltcGx5IGNhbGN1bGF0ZWQgZnJvbSB0aGUgZG9tYWluCisgIC8vIGFuZCB0cnVzdGVkLiBUaGUgbnVtYmVyIG9mIGlucHV0cyBoYXMgdG8gYmUgMS4KKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJidWdfNTUxNDYwLnBkZiIpKTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBMb2FkUGFnZSgwKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIHBhZ2UpOworICBGUERGX0JJVE1BUCBiaXRtYXAgPSBSZW5kZXJQYWdlKHBhZ2UpOworICBGUERGQml0bWFwX0Rlc3Ryb3koYml0bWFwKTsKKyAgVW5sb2FkUGFnZShwYWdlKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9ncmFwaF9zdGF0ZS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfZ3JhcGhfc3RhdGUuY3BwCmluZGV4IDJiZjNiMWQuLmRkMTZhYTggMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9ncmFwaF9zdGF0ZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2dyYXBoX3N0YXRlLmNwcApAQCAtMSw3MTAgKzEsNjgyIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZW9iai5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3JlbmRlci5oIgogI2luY2x1ZGUgInBhZ2VpbnQuaCIKLSNpbmNsdWRlICIuLi9mcGRmX3JlbmRlci9yZW5kZXJfaW50LmgiCi12b2lkIENQREZfR3JhcGhpY1N0YXRlczo6RGVmYXVsdFN0YXRlcygpCi17Ci0gICAgbV9Db2xvclN0YXRlLk5ldygpLT5EZWZhdWx0KCk7CisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZW9iai5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcmVuZGVyLmgiCisjaW5jbHVkZSAiY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9yZW5kZXJfaW50LmgiCisKK3ZvaWQgQ1BERl9HcmFwaGljU3RhdGVzOjpEZWZhdWx0U3RhdGVzKCkgeworICBtX0NvbG9yU3RhdGUuTmV3KCktPkRlZmF1bHQoKTsKIH0KLXZvaWQgQ1BERl9HcmFwaGljU3RhdGVzOjpDb3B5U3RhdGVzKGNvbnN0IENQREZfR3JhcGhpY1N0YXRlcyYgc3JjKQotewotICAgIG1fQ2xpcFBhdGggPSBzcmMubV9DbGlwUGF0aDsKLSAgICBtX0dyYXBoU3RhdGUgPSBzcmMubV9HcmFwaFN0YXRlOwotICAgIG1fQ29sb3JTdGF0ZSA9IHNyYy5tX0NvbG9yU3RhdGU7Ci0gICAgbV9UZXh0U3RhdGUgPSBzcmMubV9UZXh0U3RhdGU7Ci0gICAgbV9HZW5lcmFsU3RhdGUgPSBzcmMubV9HZW5lcmFsU3RhdGU7Cit2b2lkIENQREZfR3JhcGhpY1N0YXRlczo6Q29weVN0YXRlcyhjb25zdCBDUERGX0dyYXBoaWNTdGF0ZXMmIHNyYykgeworICBtX0NsaXBQYXRoID0gc3JjLm1fQ2xpcFBhdGg7CisgIG1fR3JhcGhTdGF0ZSA9IHNyYy5tX0dyYXBoU3RhdGU7CisgIG1fQ29sb3JTdGF0ZSA9IHNyYy5tX0NvbG9yU3RhdGU7CisgIG1fVGV4dFN0YXRlID0gc3JjLm1fVGV4dFN0YXRlOworICBtX0dlbmVyYWxTdGF0ZSA9IHNyYy5tX0dlbmVyYWxTdGF0ZTsKIH0KLUNQREZfQ2xpcFBhdGhEYXRhOjpDUERGX0NsaXBQYXRoRGF0YSgpCi17Ci0gICAgbV9QYXRoQ291bnQgPSAwOworQ1BERl9DbGlwUGF0aERhdGE6OkNQREZfQ2xpcFBhdGhEYXRhKCkgeworICBtX1BhdGhDb3VudCA9IDA7CisgIG1fcFBhdGhMaXN0ID0gTlVMTDsKKyAgbV9wVHlwZUxpc3QgPSBOVUxMOworICBtX1RleHRDb3VudCA9IDA7CisgIG1fcFRleHRMaXN0ID0gTlVMTDsKK30KK0NQREZfQ2xpcFBhdGhEYXRhOjp+Q1BERl9DbGlwUGF0aERhdGEoKSB7CisgIGludCBpOworICBkZWxldGVbXSBtX3BQYXRoTGlzdDsKKyAgRlhfRnJlZShtX3BUeXBlTGlzdCk7CisgIGZvciAoaSA9IG1fVGV4dENvdW50IC0gMTsgaSA+IC0xOyBpLS0pCisgICAgZGVsZXRlIG1fcFRleHRMaXN0W2ldOworICBGWF9GcmVlKG1fcFRleHRMaXN0KTsKK30KK0NQREZfQ2xpcFBhdGhEYXRhOjpDUERGX0NsaXBQYXRoRGF0YShjb25zdCBDUERGX0NsaXBQYXRoRGF0YSYgc3JjKSB7CisgIG1fcFBhdGhMaXN0ID0gTlVMTDsKKyAgbV9wUGF0aExpc3QgPSBOVUxMOworICBtX3BUZXh0TGlzdCA9IE5VTEw7CisgIG1fUGF0aENvdW50ID0gc3JjLm1fUGF0aENvdW50OworICBpZiAobV9QYXRoQ291bnQpIHsKKyAgICBpbnQgYWxsb2Nfc2l6ZSA9IG1fUGF0aENvdW50OworICAgIGlmIChhbGxvY19zaXplICUgOCkgeworICAgICAgYWxsb2Nfc2l6ZSArPSA4IC0gKGFsbG9jX3NpemUgJSA4KTsKKyAgICB9CisgICAgbV9wUGF0aExpc3QgPSBuZXcgQ1BERl9QYXRoW2FsbG9jX3NpemVdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9QYXRoQ291bnQ7IGkrKykgeworICAgICAgbV9wUGF0aExpc3RbaV0gPSBzcmMubV9wUGF0aExpc3RbaV07CisgICAgfQorICAgIG1fcFR5cGVMaXN0ID0gRlhfQWxsb2ModWludDhfdCwgYWxsb2Nfc2l6ZSk7CisgICAgRlhTWVNfbWVtY3B5KG1fcFR5cGVMaXN0LCBzcmMubV9wVHlwZUxpc3QsIG1fUGF0aENvdW50KTsKKyAgfSBlbHNlIHsKICAgICBtX3BQYXRoTGlzdCA9IE5VTEw7CiAgICAgbV9wVHlwZUxpc3QgPSBOVUxMOwotICAgIG1fVGV4dENvdW50ID0gMDsKKyAgfQorICBtX1RleHRDb3VudCA9IHNyYy5tX1RleHRDb3VudDsKKyAgaWYgKG1fVGV4dENvdW50KSB7CisgICAgbV9wVGV4dExpc3QgPSBGWF9BbGxvYyhDUERGX1RleHRPYmplY3QqLCBtX1RleHRDb3VudCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1RleHRDb3VudDsgaSsrKSB7CisgICAgICBpZiAoc3JjLm1fcFRleHRMaXN0W2ldKSB7CisgICAgICAgIG1fcFRleHRMaXN0W2ldID0gbmV3IENQREZfVGV4dE9iamVjdDsKKyAgICAgICAgbV9wVGV4dExpc3RbaV0tPkNvcHkoc3JjLm1fcFRleHRMaXN0W2ldKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fcFRleHRMaXN0W2ldID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CiAgICAgbV9wVGV4dExpc3QgPSBOVUxMOworICB9CiB9Ci1DUERGX0NsaXBQYXRoRGF0YTo6fkNQREZfQ2xpcFBhdGhEYXRhKCkKLXsKLSAgICBpbnQgaTsKLSAgICBkZWxldGVbXSBtX3BQYXRoTGlzdDsKLSAgICBpZiAobV9wVHlwZUxpc3QpIHsKLSAgICAgICAgRlhfRnJlZShtX3BUeXBlTGlzdCk7Ci0gICAgfQotICAgIGZvciAoaSA9IG1fVGV4dENvdW50IC0gMTsgaSA+IC0xOyBpIC0tKQotICAgICAgICBpZiAobV9wVGV4dExpc3RbaV0pIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtX3BUZXh0TGlzdFtpXTsKLSAgICAgICAgfQotICAgIGlmIChtX3BUZXh0TGlzdCkgewotICAgICAgICBGWF9GcmVlKG1fcFRleHRMaXN0KTsKLSAgICB9Cit2b2lkIENQREZfQ2xpcFBhdGhEYXRhOjpTZXRDb3VudChpbnQgcGF0aF9jb3VudCwgaW50IHRleHRfY291bnQpIHsKKyAgQVNTRVJUKG1fVGV4dENvdW50ID09IDAgJiYgbV9QYXRoQ291bnQgPT0gMCk7CisgIGlmIChwYXRoX2NvdW50KSB7CisgICAgbV9QYXRoQ291bnQgPSBwYXRoX2NvdW50OworICAgIGludCBhbGxvY19zaXplID0gKHBhdGhfY291bnQgKyA3KSAvIDggKiA4OworICAgIG1fcFBhdGhMaXN0ID0gbmV3IENQREZfUGF0aFthbGxvY19zaXplXTsKKyAgICBtX3BUeXBlTGlzdCA9IEZYX0FsbG9jKHVpbnQ4X3QsIGFsbG9jX3NpemUpOworICB9CisgIGlmICh0ZXh0X2NvdW50KSB7CisgICAgbV9UZXh0Q291bnQgPSB0ZXh0X2NvdW50OworICAgIG1fcFRleHRMaXN0ID0gRlhfQWxsb2MoQ1BERl9UZXh0T2JqZWN0KiwgdGV4dF9jb3VudCk7CisgIH0KIH0KLUNQREZfQ2xpcFBhdGhEYXRhOjpDUERGX0NsaXBQYXRoRGF0YShjb25zdCBDUERGX0NsaXBQYXRoRGF0YSYgc3JjKQotewotICAgIG1fcFBhdGhMaXN0ID0gTlVMTDsKLSAgICBtX3BQYXRoTGlzdCA9IE5VTEw7Ci0gICAgbV9wVGV4dExpc3QgPSBOVUxMOwotICAgIG1fUGF0aENvdW50ID0gc3JjLm1fUGF0aENvdW50OwotICAgIGlmIChtX1BhdGhDb3VudCkgewotICAgICAgICBpbnQgYWxsb2Nfc2l6ZSA9IG1fUGF0aENvdW50OwotICAgICAgICBpZiAoYWxsb2Nfc2l6ZSAlIDgpIHsKLSAgICAgICAgICAgIGFsbG9jX3NpemUgKz0gOCAtIChhbGxvY19zaXplICUgOCk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wUGF0aExpc3QgPSBuZXcgQ1BERl9QYXRoW2FsbG9jX3NpemVdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fUGF0aENvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICBtX3BQYXRoTGlzdFtpXSA9IHNyYy5tX3BQYXRoTGlzdFtpXTsKLSAgICAgICAgfQotICAgICAgICBtX3BUeXBlTGlzdCA9IEZYX0FsbG9jKEZYX0JZVEUsIGFsbG9jX3NpemUpOwotICAgICAgICBGWFNZU19tZW1jcHkzMihtX3BUeXBlTGlzdCwgc3JjLm1fcFR5cGVMaXN0LCBtX1BhdGhDb3VudCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wUGF0aExpc3QgPSBOVUxMOwotICAgICAgICBtX3BUeXBlTGlzdCA9IE5VTEw7CitDUERGX1JlY3QgQ1BERl9DbGlwUGF0aDo6R2V0Q2xpcEJveCgpIGNvbnN0IHsKKyAgQ1BERl9SZWN0IHJlY3Q7CisgIEZYX0JPT0wgYlN0YXJ0ZWQgPSBGQUxTRTsKKyAgaW50IGNvdW50ID0gR2V0UGF0aENvdW50KCk7CisgIGlmIChjb3VudCkgeworICAgIHJlY3QgPSBHZXRQYXRoKDApLkdldEJvdW5kaW5nQm94KCk7CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICBDUERGX1JlY3QgcGF0aF9yZWN0ID0gR2V0UGF0aChpKS5HZXRCb3VuZGluZ0JveCgpOworICAgICAgcmVjdC5JbnRlcnNlY3QocGF0aF9yZWN0KTsKICAgICB9Ci0gICAgbV9UZXh0Q291bnQgPSBzcmMubV9UZXh0Q291bnQ7Ci0gICAgaWYgKG1fVGV4dENvdW50KSB7Ci0gICAgICAgIG1fcFRleHRMaXN0ID0gRlhfQWxsb2MoQ1BERl9UZXh0T2JqZWN0KiwgbV9UZXh0Q291bnQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fVGV4dENvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICBpZiAoc3JjLm1fcFRleHRMaXN0W2ldKSB7Ci0gICAgICAgICAgICAgICAgbV9wVGV4dExpc3RbaV0gPSBuZXcgQ1BERl9UZXh0T2JqZWN0OwotICAgICAgICAgICAgICAgIG1fcFRleHRMaXN0W2ldLT5Db3B5KHNyYy5tX3BUZXh0TGlzdFtpXSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fcFRleHRMaXN0W2ldID0gTlVMTDsKLSAgICAgICAgICAgIH0KKyAgICBiU3RhcnRlZCA9IFRSVUU7CisgIH0KKyAgY291bnQgPSBHZXRUZXh0Q291bnQoKTsKKyAgaWYgKGNvdW50KSB7CisgICAgQ1BERl9SZWN0IGxheWVyX3JlY3Q7CisgICAgRlhfQk9PTCBiTGF5ZXJTdGFydGVkID0gRkFMU0U7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqID0gR2V0VGV4dChpKTsKKyAgICAgIGlmICghcFRleHRPYmopIHsKKyAgICAgICAgaWYgKCFiU3RhcnRlZCkgeworICAgICAgICAgIHJlY3QgPSBsYXllcl9yZWN0OworICAgICAgICAgIGJTdGFydGVkID0gVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZWN0LkludGVyc2VjdChsYXllcl9yZWN0KTsKICAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcFRleHRMaXN0ID0gTlVMTDsKKyAgICAgICAgYkxheWVyU3RhcnRlZCA9IEZBTFNFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFiTGF5ZXJTdGFydGVkKSB7CisgICAgICAgICAgbGF5ZXJfcmVjdCA9IHBUZXh0T2JqLT5HZXRCQm94KE5VTEwpOworICAgICAgICAgIGJMYXllclN0YXJ0ZWQgPSBUUlVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGxheWVyX3JlY3QuVW5pb24ocFRleHRPYmotPkdldEJCb3goTlVMTCkpOworICAgICAgICB9CisgICAgICB9CiAgICAgfQorICB9CisgIHJldHVybiByZWN0OwogfQotdm9pZCBDUERGX0NsaXBQYXRoRGF0YTo6U2V0Q291bnQoaW50IHBhdGhfY291bnQsIGludCB0ZXh0X2NvdW50KQotewotICAgIEFTU0VSVChtX1RleHRDb3VudCA9PSAwICYmIG1fUGF0aENvdW50ID09IDApOwotICAgIGlmIChwYXRoX2NvdW50KSB7Ci0gICAgICAgIG1fUGF0aENvdW50ID0gcGF0aF9jb3VudDsKLSAgICAgICAgaW50IGFsbG9jX3NpemUgPSAocGF0aF9jb3VudCArIDcpIC8gOCAqIDg7Ci0gICAgICAgIG1fcFBhdGhMaXN0ID0gbmV3IENQREZfUGF0aFthbGxvY19zaXplXTsKLSAgICAgICAgbV9wVHlwZUxpc3QgPSBGWF9BbGxvYyhGWF9CWVRFLCBhbGxvY19zaXplKTsKK3ZvaWQgQ1BERl9DbGlwUGF0aDo6QXBwZW5kUGF0aChDUERGX1BhdGggcGF0aCwgaW50IHR5cGUsIEZYX0JPT0wgYkF1dG9NZXJnZSkgeworICBDUERGX0NsaXBQYXRoRGF0YSogcERhdGEgPSBHZXRNb2RpZnkoKTsKKyAgaWYgKHBEYXRhLT5tX1BhdGhDb3VudCAmJiBiQXV0b01lcmdlKSB7CisgICAgQ1BERl9QYXRoIG9sZF9wYXRoID0gcERhdGEtPm1fcFBhdGhMaXN0W3BEYXRhLT5tX1BhdGhDb3VudCAtIDFdOworICAgIGlmIChvbGRfcGF0aC5Jc1JlY3QoKSkgeworICAgICAgQ1BERl9SZWN0IG9sZF9yZWN0KG9sZF9wYXRoLkdldFBvaW50WCgwKSwgb2xkX3BhdGguR2V0UG9pbnRZKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9wYXRoLkdldFBvaW50WCgyKSwgb2xkX3BhdGguR2V0UG9pbnRZKDIpKTsKKyAgICAgIENQREZfUmVjdCBuZXdfcmVjdCA9IHBhdGguR2V0Qm91bmRpbmdCb3goKTsKKyAgICAgIGlmIChvbGRfcmVjdC5Db250YWlucyhuZXdfcmVjdCkpIHsKKyAgICAgICAgcERhdGEtPm1fUGF0aENvdW50LS07CisgICAgICAgIHBEYXRhLT5tX3BQYXRoTGlzdFtwRGF0YS0+bV9QYXRoQ291bnRdLlNldE51bGwoKTsKKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKHRleHRfY291bnQpIHsKLSAgICAgICAgbV9UZXh0Q291bnQgPSB0ZXh0X2NvdW50OwotICAgICAgICBtX3BUZXh0TGlzdCA9IEZYX0FsbG9jKENQREZfVGV4dE9iamVjdCosIHRleHRfY291bnQpOworICB9CisgIGlmIChwRGF0YS0+bV9QYXRoQ291bnQgJSA4ID09IDApIHsKKyAgICBDUERGX1BhdGgqIHBOZXdQYXRoID0gbmV3IENQREZfUGF0aFtwRGF0YS0+bV9QYXRoQ291bnQgKyA4XTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBEYXRhLT5tX1BhdGhDb3VudDsgaSsrKSB7CisgICAgICBwTmV3UGF0aFtpXSA9IHBEYXRhLT5tX3BQYXRoTGlzdFtpXTsKICAgICB9CisgICAgZGVsZXRlW10gcERhdGEtPm1fcFBhdGhMaXN0OworICAgIHVpbnQ4X3QqIHBOZXdUeXBlID0gRlhfQWxsb2ModWludDhfdCwgcERhdGEtPm1fUGF0aENvdW50ICsgOCk7CisgICAgRlhTWVNfbWVtY3B5KHBOZXdUeXBlLCBwRGF0YS0+bV9wVHlwZUxpc3QsIHBEYXRhLT5tX1BhdGhDb3VudCk7CisgICAgRlhfRnJlZShwRGF0YS0+bV9wVHlwZUxpc3QpOworICAgIHBEYXRhLT5tX3BQYXRoTGlzdCA9IHBOZXdQYXRoOworICAgIHBEYXRhLT5tX3BUeXBlTGlzdCA9IHBOZXdUeXBlOworICB9CisgIHBEYXRhLT5tX3BQYXRoTGlzdFtwRGF0YS0+bV9QYXRoQ291bnRdID0gcGF0aDsKKyAgcERhdGEtPm1fcFR5cGVMaXN0W3BEYXRhLT5tX1BhdGhDb3VudF0gPSAodWludDhfdCl0eXBlOworICBwRGF0YS0+bV9QYXRoQ291bnQrKzsKIH0KLUNQREZfUmVjdCBDUERGX0NsaXBQYXRoOjpHZXRDbGlwQm94KCkgY29uc3QKLXsKLSAgICBDUERGX1JlY3QgcmVjdDsKLSAgICBGWF9CT09MIGJTdGFydGVkID0gRkFMU0U7Ci0gICAgaW50IGNvdW50ID0gR2V0UGF0aENvdW50KCk7Ci0gICAgaWYgKGNvdW50KSB7Ci0gICAgICAgIHJlY3QgPSBHZXRQYXRoKDApLkdldEJvdW5kaW5nQm94KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgY291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIENQREZfUmVjdCBwYXRoX3JlY3QgPSBHZXRQYXRoKGkpLkdldEJvdW5kaW5nQm94KCk7Ci0gICAgICAgICAgICByZWN0LkludGVyc2VjdChwYXRoX3JlY3QpOwotICAgICAgICB9Ci0gICAgICAgIGJTdGFydGVkID0gVFJVRTsKLSAgICB9Ci0gICAgY291bnQgPSBHZXRUZXh0Q291bnQoKTsKLSAgICBpZiAoY291bnQpIHsKLSAgICAgICAgQ1BERl9SZWN0IGxheWVyX3JlY3Q7Ci0gICAgICAgIEZYX0JPT0wgYkxheWVyU3RhcnRlZCA9IEZBTFNFOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqID0gR2V0VGV4dChpKTsKLSAgICAgICAgICAgIGlmIChwVGV4dE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFiU3RhcnRlZCkgewotICAgICAgICAgICAgICAgICAgICByZWN0ID0gbGF5ZXJfcmVjdDsKLSAgICAgICAgICAgICAgICAgICAgYlN0YXJ0ZWQgPSBUUlVFOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlY3QuSW50ZXJzZWN0KGxheWVyX3JlY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBiTGF5ZXJTdGFydGVkID0gRkFMU0U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICghYkxheWVyU3RhcnRlZCkgewotICAgICAgICAgICAgICAgICAgICBsYXllcl9yZWN0ID0gcFRleHRPYmotPkdldEJCb3goTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgIGJMYXllclN0YXJ0ZWQgPSBUUlVFOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxheWVyX3JlY3QuVW5pb24ocFRleHRPYmotPkdldEJCb3goTlVMTCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVjdDsKLX0KLXZvaWQgQ1BERl9DbGlwUGF0aDo6QXBwZW5kUGF0aChDUERGX1BhdGggcGF0aCwgaW50IHR5cGUsIEZYX0JPT0wgYkF1dG9NZXJnZSkKLXsKLSAgICBDUERGX0NsaXBQYXRoRGF0YSogcERhdGEgPSBHZXRNb2RpZnkoKTsKLSAgICBpZiAocERhdGEtPm1fUGF0aENvdW50ICYmIGJBdXRvTWVyZ2UpIHsKLSAgICAgICAgQ1BERl9QYXRoIG9sZF9wYXRoID0gcERhdGEtPm1fcFBhdGhMaXN0W3BEYXRhLT5tX1BhdGhDb3VudCAtIDFdOwotICAgICAgICBpZiAob2xkX3BhdGguSXNSZWN0KCkpIHsKLSAgICAgICAgICAgIENQREZfUmVjdCBvbGRfcmVjdChvbGRfcGF0aC5HZXRQb2ludFgoMCksIG9sZF9wYXRoLkdldFBvaW50WSgwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfcGF0aC5HZXRQb2ludFgoMiksIG9sZF9wYXRoLkdldFBvaW50WSgyKSk7Ci0gICAgICAgICAgICBDUERGX1JlY3QgbmV3X3JlY3QgPSBwYXRoLkdldEJvdW5kaW5nQm94KCk7Ci0gICAgICAgICAgICBpZiAob2xkX3JlY3QuQ29udGFpbnMobmV3X3JlY3QpKSB7Ci0gICAgICAgICAgICAgICAgcERhdGEtPm1fUGF0aENvdW50IC0tOwotICAgICAgICAgICAgICAgIHBEYXRhLT5tX3BQYXRoTGlzdFtwRGF0YS0+bV9QYXRoQ291bnRdLlNldE51bGwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocERhdGEtPm1fUGF0aENvdW50ICUgOCA9PSAwKSB7Ci0gICAgICAgIENQREZfUGF0aCogcE5ld1BhdGggPSBuZXcgQ1BERl9QYXRoW3BEYXRhLT5tX1BhdGhDb3VudCArIDhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBEYXRhLT5tX1BhdGhDb3VudDsgaSArKykgewotICAgICAgICAgICAgcE5ld1BhdGhbaV0gPSBwRGF0YS0+bV9wUGF0aExpc3RbaV07Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZXRlW10gcERhdGEtPm1fcFBhdGhMaXN0OwotICAgICAgICBGWF9CWVRFKiBwTmV3VHlwZSA9IEZYX0FsbG9jKEZYX0JZVEUsIHBEYXRhLT5tX1BhdGhDb3VudCArIDgpOwotICAgICAgICBGWFNZU19tZW1jcHkzMihwTmV3VHlwZSwgcERhdGEtPm1fcFR5cGVMaXN0LCBwRGF0YS0+bV9QYXRoQ291bnQpOwotICAgICAgICBpZiAocERhdGEtPm1fcFR5cGVMaXN0KSB7Ci0gICAgICAgICAgICBGWF9GcmVlKHBEYXRhLT5tX3BUeXBlTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcERhdGEtPm1fcFBhdGhMaXN0ID0gcE5ld1BhdGg7Ci0gICAgICAgIHBEYXRhLT5tX3BUeXBlTGlzdCA9IHBOZXdUeXBlOwotICAgIH0KLSAgICBwRGF0YS0+bV9wUGF0aExpc3RbcERhdGEtPm1fUGF0aENvdW50XSA9IHBhdGg7Ci0gICAgcERhdGEtPm1fcFR5cGVMaXN0W3BEYXRhLT5tX1BhdGhDb3VudF0gPSAoRlhfQllURSl0eXBlOwotICAgIHBEYXRhLT5tX1BhdGhDb3VudCArKzsKLX0KLXZvaWQgQ1BERl9DbGlwUGF0aDo6RGVsZXRlUGF0aChpbnQgaW5kZXgpCi17Ci0gICAgQ1BERl9DbGlwUGF0aERhdGEqIHBEYXRhID0gR2V0TW9kaWZ5KCk7Ci0gICAgaWYgKGluZGV4ID49IHBEYXRhLT5tX1BhdGhDb3VudCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHBEYXRhLT5tX3BQYXRoTGlzdFtpbmRleF0uU2V0TnVsbCgpOwotICAgIGZvciAoaW50IGkgPSBpbmRleDsgaSA8IHBEYXRhLT5tX1BhdGhDb3VudCAtIDE7IGkgKyspIHsKLSAgICAgICAgcERhdGEtPm1fcFBhdGhMaXN0W2ldID0gcERhdGEtPm1fcFBhdGhMaXN0W2kgKyAxXTsKLSAgICB9Ci0gICAgcERhdGEtPm1fcFBhdGhMaXN0W3BEYXRhLT5tX1BhdGhDb3VudCAtIDFdLlNldE51bGwoKTsKLSAgICBGWFNZU19tZW1tb3ZlMzIocERhdGEtPm1fcFR5cGVMaXN0ICsgaW5kZXgsIHBEYXRhLT5tX3BUeXBlTGlzdCArIGluZGV4ICsgMSwgcERhdGEtPm1fUGF0aENvdW50IC0gaW5kZXggLSAxKTsKLSAgICBwRGF0YS0+bV9QYXRoQ291bnQgLS07Cit2b2lkIENQREZfQ2xpcFBhdGg6OkRlbGV0ZVBhdGgoaW50IGluZGV4KSB7CisgIENQREZfQ2xpcFBhdGhEYXRhKiBwRGF0YSA9IEdldE1vZGlmeSgpOworICBpZiAoaW5kZXggPj0gcERhdGEtPm1fUGF0aENvdW50KSB7CisgICAgcmV0dXJuOworICB9CisgIHBEYXRhLT5tX3BQYXRoTGlzdFtpbmRleF0uU2V0TnVsbCgpOworICBmb3IgKGludCBpID0gaW5kZXg7IGkgPCBwRGF0YS0+bV9QYXRoQ291bnQgLSAxOyBpKyspIHsKKyAgICBwRGF0YS0+bV9wUGF0aExpc3RbaV0gPSBwRGF0YS0+bV9wUGF0aExpc3RbaSArIDFdOworICB9CisgIHBEYXRhLT5tX3BQYXRoTGlzdFtwRGF0YS0+bV9QYXRoQ291bnQgLSAxXS5TZXROdWxsKCk7CisgIEZYU1lTX21lbW1vdmUocERhdGEtPm1fcFR5cGVMaXN0ICsgaW5kZXgsIHBEYXRhLT5tX3BUeXBlTGlzdCArIGluZGV4ICsgMSwKKyAgICAgICAgICAgICAgICBwRGF0YS0+bV9QYXRoQ291bnQgLSBpbmRleCAtIDEpOworICBwRGF0YS0+bV9QYXRoQ291bnQtLTsKIH0KICNkZWZpbmUgRlBERl9DTElQUEFUSF9NQVhfVEVYVFMgMTAyNAotdm9pZCBDUERGX0NsaXBQYXRoOjpBcHBlbmRUZXh0cyhDUERGX1RleHRPYmplY3QqKiBwVGV4dHMsIGludCBjb3VudCkKLXsKLSAgICBDUERGX0NsaXBQYXRoRGF0YSogcERhdGEgPSBHZXRNb2RpZnkoKTsKLSAgICBpZiAocERhdGEtPm1fVGV4dENvdW50ICsgY291bnQgPiBGUERGX0NMSVBQQVRIX01BWF9URVhUUykgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICBkZWxldGUgcFRleHRzW2ldOwordm9pZCBDUERGX0NsaXBQYXRoOjpBcHBlbmRUZXh0cyhDUERGX1RleHRPYmplY3QqKiBwVGV4dHMsIGludCBjb3VudCkgeworICBDUERGX0NsaXBQYXRoRGF0YSogcERhdGEgPSBHZXRNb2RpZnkoKTsKKyAgaWYgKHBEYXRhLT5tX1RleHRDb3VudCArIGNvdW50ID4gRlBERl9DTElQUEFUSF9NQVhfVEVYVFMpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgIGRlbGV0ZSBwVGV4dHNbaV07CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBDUERGX1RleHRPYmplY3QqKiBwTmV3TGlzdCA9CisgICAgICBGWF9BbGxvYyhDUERGX1RleHRPYmplY3QqLCBwRGF0YS0+bV9UZXh0Q291bnQgKyBjb3VudCArIDEpOworICBpZiAocERhdGEtPm1fcFRleHRMaXN0KSB7CisgICAgRlhTWVNfbWVtY3B5KHBOZXdMaXN0LCBwRGF0YS0+bV9wVGV4dExpc3QsCisgICAgICAgICAgICAgICAgIHBEYXRhLT5tX1RleHRDb3VudCAqIHNpemVvZihDUERGX1RleHRPYmplY3QqKSk7CisgICAgRlhfRnJlZShwRGF0YS0+bV9wVGV4dExpc3QpOworICB9CisgIHBEYXRhLT5tX3BUZXh0TGlzdCA9IHBOZXdMaXN0OworICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBwRGF0YS0+bV9wVGV4dExpc3RbcERhdGEtPm1fVGV4dENvdW50ICsgaV0gPSBwVGV4dHNbaV07CisgIH0KKyAgcERhdGEtPm1fcFRleHRMaXN0W3BEYXRhLT5tX1RleHRDb3VudCArIGNvdW50XSA9IE5VTEw7CisgIHBEYXRhLT5tX1RleHRDb3VudCArPSBjb3VudCArIDE7Cit9Cit2b2lkIENQREZfQ2xpcFBhdGg6OlRyYW5zZm9ybShjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsKKyAgQ1BERl9DbGlwUGF0aERhdGEqIHBEYXRhID0gR2V0TW9kaWZ5KCk7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgcERhdGEtPm1fUGF0aENvdW50OyBpKyspIHsKKyAgICBwRGF0YS0+bV9wUGF0aExpc3RbaV0uVHJhbnNmb3JtKCZtYXRyaXgpOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBwRGF0YS0+bV9UZXh0Q291bnQ7IGkrKykKKyAgICBpZiAocERhdGEtPm1fcFRleHRMaXN0W2ldKSB7CisgICAgICBwRGF0YS0+bV9wVGV4dExpc3RbaV0tPlRyYW5zZm9ybShtYXRyaXgpOworICAgIH0KK30KK0NQREZfQ29sb3JTdGF0ZURhdGE6OkNQREZfQ29sb3JTdGF0ZURhdGEoY29uc3QgQ1BERl9Db2xvclN0YXRlRGF0YSYgc3JjKSB7CisgIG1fRmlsbENvbG9yLkNvcHkoJnNyYy5tX0ZpbGxDb2xvcik7CisgIG1fRmlsbFJHQiA9IHNyYy5tX0ZpbGxSR0I7CisgIG1fU3Ryb2tlQ29sb3IuQ29weSgmc3JjLm1fU3Ryb2tlQ29sb3IpOworICBtX1N0cm9rZVJHQiA9IHNyYy5tX1N0cm9rZVJHQjsKK30KK3ZvaWQgQ1BERl9Db2xvclN0YXRlRGF0YTo6RGVmYXVsdCgpIHsKKyAgbV9GaWxsUkdCID0gbV9TdHJva2VSR0IgPSAwOworICBtX0ZpbGxDb2xvci5TZXRDb2xvclNwYWNlKENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VHUkFZKSk7CisgIG1fU3Ryb2tlQ29sb3IuU2V0Q29sb3JTcGFjZShDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFR1JBWSkpOworfQordm9pZCBDUERGX0NvbG9yU3RhdGU6OlNldEZpbGxDb2xvcihDUERGX0NvbG9yU3BhY2UqIHBDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5WYWx1ZXMpIHsKKyAgQ1BERl9Db2xvclN0YXRlRGF0YSogcERhdGEgPSBHZXRNb2RpZnkoKTsKKyAgU2V0Q29sb3IocERhdGEtPm1fRmlsbENvbG9yLCBwRGF0YS0+bV9GaWxsUkdCLCBwQ1MsIHBWYWx1ZSwgblZhbHVlcyk7Cit9Cit2b2lkIENQREZfQ29sb3JTdGF0ZTo6U2V0U3Ryb2tlQ29sb3IoQ1BERl9Db2xvclNwYWNlKiBwQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblZhbHVlcykgeworICBDUERGX0NvbG9yU3RhdGVEYXRhKiBwRGF0YSA9IEdldE1vZGlmeSgpOworICBTZXRDb2xvcihwRGF0YS0+bV9TdHJva2VDb2xvciwgcERhdGEtPm1fU3Ryb2tlUkdCLCBwQ1MsIHBWYWx1ZSwgblZhbHVlcyk7Cit9Cit2b2lkIENQREZfQ29sb3JTdGF0ZTo6U2V0Q29sb3IoQ1BERl9Db2xvciYgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0NvbG9yU3BhY2UqIHBDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuVmFsdWVzKSB7CisgIGlmIChwQ1MpIHsKKyAgICBjb2xvci5TZXRDb2xvclNwYWNlKHBDUyk7CisgIH0gZWxzZSBpZiAoY29sb3IuSXNOdWxsKCkpIHsKKyAgICBjb2xvci5TZXRDb2xvclNwYWNlKENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VHUkFZKSk7CisgIH0KKyAgaWYgKGNvbG9yLm1fcENTLT5Db3VudENvbXBvbmVudHMoKSA+IG5WYWx1ZXMpIHsKKyAgICByZXR1cm47CisgIH0KKyAgY29sb3IuU2V0VmFsdWUocFZhbHVlKTsKKyAgaW50IFIsIEcsIEI7CisgIHJnYiA9IGNvbG9yLkdldFJHQihSLCBHLCBCKSA/IEZYU1lTX1JHQihSLCBHLCBCKSA6IChGWF9EV09SRCktMTsKK30KK3ZvaWQgQ1BERl9Db2xvclN0YXRlOjpTZXRGaWxsUGF0dGVybihDUERGX1BhdHRlcm4qIHBQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5WYWx1ZXMpIHsKKyAgQ1BERl9Db2xvclN0YXRlRGF0YSogcERhdGEgPSBHZXRNb2RpZnkoKTsKKyAgcERhdGEtPm1fRmlsbENvbG9yLlNldFZhbHVlKHBQYXR0ZXJuLCBwVmFsdWUsIG5WYWx1ZXMpOworICBpbnQgUiwgRywgQjsKKyAgRlhfQk9PTCByZXQgPSBwRGF0YS0+bV9GaWxsQ29sb3IuR2V0UkdCKFIsIEcsIEIpOworICBpZiAocFBhdHRlcm4tPm1fUGF0dGVyblR5cGUgPT0gMSAmJgorICAgICAgKChDUERGX1RpbGluZ1BhdHRlcm4qKXBQYXR0ZXJuKS0+bV9iQ29sb3JlZCAmJiAhcmV0KSB7CisgICAgcERhdGEtPm1fRmlsbFJHQiA9IDB4MDBCRkJGQkY7CisgICAgcmV0dXJuOworICB9CisgIHBEYXRhLT5tX0ZpbGxSR0IgPSByZXQgPyBGWFNZU19SR0IoUiwgRywgQikgOiAoRlhfRFdPUkQpLTE7Cit9Cit2b2lkIENQREZfQ29sb3JTdGF0ZTo6U2V0U3Ryb2tlUGF0dGVybihDUERGX1BhdHRlcm4qIHBQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuVmFsdWVzKSB7CisgIENQREZfQ29sb3JTdGF0ZURhdGEqIHBEYXRhID0gR2V0TW9kaWZ5KCk7CisgIHBEYXRhLT5tX1N0cm9rZUNvbG9yLlNldFZhbHVlKHBQYXR0ZXJuLCBwVmFsdWUsIG5WYWx1ZXMpOworICBpbnQgUiwgRywgQjsKKyAgRlhfQk9PTCByZXQgPSBwRGF0YS0+bV9TdHJva2VDb2xvci5HZXRSR0IoUiwgRywgQik7CisgIGlmIChwUGF0dGVybi0+bV9QYXR0ZXJuVHlwZSA9PSAxICYmCisgICAgICAoKENQREZfVGlsaW5nUGF0dGVybiopcFBhdHRlcm4pLT5tX2JDb2xvcmVkICYmICFyZXQpIHsKKyAgICBwRGF0YS0+bV9TdHJva2VSR0IgPSAweDAwQkZCRkJGOworICAgIHJldHVybjsKKyAgfQorICBwRGF0YS0+bV9TdHJva2VSR0IgPQorICAgICAgcERhdGEtPm1fU3Ryb2tlQ29sb3IuR2V0UkdCKFIsIEcsIEIpID8gRlhTWVNfUkdCKFIsIEcsIEIpIDogKEZYX0RXT1JEKS0xOworfQorQ1BERl9UZXh0U3RhdGVEYXRhOjpDUERGX1RleHRTdGF0ZURhdGEoKSB7CisgIG1fcEZvbnQgPSBOVUxMOworICBtX3BEb2N1bWVudCA9IE5VTEw7CisgIG1fRm9udFNpemUgPSAxLjBmOworICBtX1dvcmRTcGFjZSA9IDA7CisgIG1fQ2hhclNwYWNlID0gMDsKKyAgbV9UZXh0TW9kZSA9IDA7CisgIG1fTWF0cml4WzBdID0gbV9NYXRyaXhbM10gPSAxLjBmOworICBtX01hdHJpeFsxXSA9IG1fTWF0cml4WzJdID0gMDsKKyAgbV9DVE1bMF0gPSBtX0NUTVszXSA9IDEuMGY7CisgIG1fQ1RNWzFdID0gbV9DVE1bMl0gPSAwOworfQorQ1BERl9UZXh0U3RhdGVEYXRhOjpDUERGX1RleHRTdGF0ZURhdGEoY29uc3QgQ1BERl9UZXh0U3RhdGVEYXRhJiBzcmMpIHsKKyAgaWYgKHRoaXMgPT0gJnNyYykgeworICAgIHJldHVybjsKKyAgfQorICBGWFNZU19tZW1jcHkodGhpcywgJnNyYywgc2l6ZW9mKENQREZfVGV4dFN0YXRlRGF0YSkpOworICBpZiAobV9wRG9jdW1lbnQgJiYgbV9wRm9udCkgeworICAgIG1fcEZvbnQgPQorICAgICAgICBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+R2V0Rm9udChtX3BGb250LT5HZXRGb250RGljdCgpLCBGQUxTRSk7CisgIH0KK30KK0NQREZfVGV4dFN0YXRlRGF0YTo6fkNQREZfVGV4dFN0YXRlRGF0YSgpIHsKKyAgaWYgKG1fcERvY3VtZW50ICYmIG1fcEZvbnQpIHsKKyAgICBDUERGX0RvY1BhZ2VEYXRhKiBwUGFnZURhdGEgPSBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKTsKKyAgICBpZiAocFBhZ2VEYXRhICYmICFwUGFnZURhdGEtPklzRm9yY2VDbGVhcigpKSB7CisgICAgICBwUGFnZURhdGEtPlJlbGVhc2VGb250KG1fcEZvbnQtPkdldEZvbnREaWN0KCkpOworICAgIH0KKyAgfQorfQordm9pZCBDUERGX1RleHRTdGF0ZTo6U2V0Rm9udChDUERGX0ZvbnQqIHBGb250KSB7CisgIENQREZfVGV4dFN0YXRlRGF0YSogcFN0YXRlRGF0YSA9IEdldE1vZGlmeSgpOworICBpZiAocFN0YXRlRGF0YSkgeworICAgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBwU3RhdGVEYXRhLT5tX3BEb2N1bWVudDsKKyAgICBDUERGX0RvY1BhZ2VEYXRhKiBwUGFnZURhdGEgPSBwRG9jID8gcERvYy0+R2V0UGFnZURhdGEoKSA6IE5VTEw7CisgICAgaWYgKHBQYWdlRGF0YSAmJiBwU3RhdGVEYXRhLT5tX3BGb250ICYmICFwUGFnZURhdGEtPklzRm9yY2VDbGVhcigpKSB7CisgICAgICBwUGFnZURhdGEtPlJlbGVhc2VGb250KHBTdGF0ZURhdGEtPm1fcEZvbnQtPkdldEZvbnREaWN0KCkpOworICAgIH0KKyAgICBwU3RhdGVEYXRhLT5tX3BEb2N1bWVudCA9IHBGb250ID8gcEZvbnQtPm1fcERvY3VtZW50IDogTlVMTDsKKyAgICBwU3RhdGVEYXRhLT5tX3BGb250ID0gcEZvbnQ7CisgIH0KK30KK0ZYX0ZMT0FUIENQREZfVGV4dFN0YXRlOjpHZXRGb250U2l6ZVYoKSBjb25zdCB7CisgIEZYX0ZMT0FUKiBwTWF0cml4ID0gR2V0TWF0cml4KCk7CisgIEZYX0ZMT0FUIHVuaXQgPSBGWFNZU19zcXJ0MihwTWF0cml4WzFdLCBwTWF0cml4WzNdKTsKKyAgRlhfRkxPQVQgc2l6ZSA9IEZYU1lTX011bCh1bml0LCBHZXRGb250U2l6ZSgpKTsKKyAgcmV0dXJuIChGWF9GTE9BVClGWFNZU19mYWJzKHNpemUpOworfQorRlhfRkxPQVQgQ1BERl9UZXh0U3RhdGU6OkdldEZvbnRTaXplSCgpIGNvbnN0IHsKKyAgRlhfRkxPQVQqIHBNYXRyaXggPSBHZXRNYXRyaXgoKTsKKyAgRlhfRkxPQVQgdW5pdCA9IEZYU1lTX3NxcnQyKHBNYXRyaXhbMF0sIHBNYXRyaXhbMl0pOworICBGWF9GTE9BVCBzaXplID0gRlhTWVNfTXVsKHVuaXQsIEdldEZvbnRTaXplKCkpOworICByZXR1cm4gKEZYX0ZMT0FUKUZYU1lTX2ZhYnMoc2l6ZSk7Cit9CitGWF9GTE9BVCBDUERGX1RleHRTdGF0ZTo6R2V0QmFzZWxpbmVBbmdsZSgpIGNvbnN0IHsKKyAgRlhfRkxPQVQqIG1fTWF0cml4ID0gR2V0TWF0cml4KCk7CisgIHJldHVybiBGWFNZU19hdGFuMihtX01hdHJpeFsyXSwgbV9NYXRyaXhbMF0pOworfQorRlhfRkxPQVQgQ1BERl9UZXh0U3RhdGU6OkdldFNoZWFyQW5nbGUoKSBjb25zdCB7CisgIEZYX0ZMT0FUKiBtX01hdHJpeCA9IEdldE1hdHJpeCgpOworICBGWF9GTE9BVCBzaGVhcl9hbmdsZSA9IEZYU1lTX2F0YW4yKG1fTWF0cml4WzFdLCBtX01hdHJpeFszXSk7CisgIHJldHVybiBHZXRCYXNlbGluZUFuZ2xlKCkgKyBzaGVhcl9hbmdsZTsKK30KK0NQREZfR2VuZXJhbFN0YXRlRGF0YTo6Q1BERl9HZW5lcmFsU3RhdGVEYXRhKCkgeworICBGWFNZU19tZW1zZXQodGhpcywgMCwgc2l6ZW9mKENQREZfR2VuZXJhbFN0YXRlRGF0YSkpOworICBGWFNZU19zdHJjcHkoKEZYX0NIQVIqKW1fQmxlbmRNb2RlLCAiTm9ybWFsIik7CisgIG1fU3Ryb2tlQWxwaGEgPSAxLjBmOworICBtX0ZpbGxBbHBoYSA9IDEuMGY7CisgIG1fRmxhdG5lc3MgPSAxLjBmOworICBtX01hdHJpeC5TZXRJZGVudGl0eSgpOworfQorQ1BERl9HZW5lcmFsU3RhdGVEYXRhOjpDUERGX0dlbmVyYWxTdGF0ZURhdGEoY29uc3QgQ1BERl9HZW5lcmFsU3RhdGVEYXRhJiBzcmMpIHsKKyAgRlhTWVNfbWVtY3B5KHRoaXMsICZzcmMsIHNpemVvZihDUERGX0dlbmVyYWxTdGF0ZURhdGEpKTsKKyAgaWYgKHNyYy5tX3BUcmFuc2ZlckZ1bmMgJiYgc3JjLm1fcFRyYW5zZmVyRnVuYy0+bV9wUERGRG9jKSB7CisgICAgQ1BERl9Eb2NSZW5kZXJEYXRhKiBwRG9jQ2FjaGUgPQorICAgICAgICBzcmMubV9wVHJhbnNmZXJGdW5jLT5tX3BQREZEb2MtPkdldFJlbmRlckRhdGEoKTsKKyAgICBpZiAoIXBEb2NDYWNoZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtX3BUcmFuc2ZlckZ1bmMgPSBwRG9jQ2FjaGUtPkdldFRyYW5zZmVyRnVuYyhtX3BUUik7CisgIH0KK30KK0NQREZfR2VuZXJhbFN0YXRlRGF0YTo6fkNQREZfR2VuZXJhbFN0YXRlRGF0YSgpIHsKKyAgaWYgKG1fcFRyYW5zZmVyRnVuYyAmJiBtX3BUcmFuc2ZlckZ1bmMtPm1fcFBERkRvYykgeworICAgIENQREZfRG9jUmVuZGVyRGF0YSogcERvY0NhY2hlID0gbV9wVHJhbnNmZXJGdW5jLT5tX3BQREZEb2MtPkdldFJlbmRlckRhdGEoKTsKKyAgICBpZiAoIXBEb2NDYWNoZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwRG9jQ2FjaGUtPlJlbGVhc2VUcmFuc2ZlckZ1bmMobV9wVFIpOworICB9Cit9CitzdGF0aWMgaW50IEdldEJsZW5kVHlwZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG1vZGUpIHsKKyAgc3dpdGNoIChtb2RlLkdldElEKCkpIHsKKyAgICBjYXNlIEZYQlNUUl9JRCgnTicsICdvJywgJ3InLCAnbScpOgorICAgIGNhc2UgRlhCU1RSX0lEKCdDJywgJ28nLCAnbScsICdwJyk6CisgICAgICByZXR1cm4gRlhESUJfQkxFTkRfTk9STUFMOworICAgIGNhc2UgRlhCU1RSX0lEKCdNJywgJ3UnLCAnbCcsICd0Jyk6CisgICAgICByZXR1cm4gRlhESUJfQkxFTkRfTVVMVElQTFk7CisgICAgY2FzZSBGWEJTVFJfSUQoJ1MnLCAnYycsICdyJywgJ2UnKToKKyAgICAgIHJldHVybiBGWERJQl9CTEVORF9TQ1JFRU47CisgICAgY2FzZSBGWEJTVFJfSUQoJ08nLCAndicsICdlJywgJ3InKToKKyAgICAgIHJldHVybiBGWERJQl9CTEVORF9PVkVSTEFZOworICAgIGNhc2UgRlhCU1RSX0lEKCdEJywgJ2EnLCAncicsICdrJyk6CisgICAgICByZXR1cm4gRlhESUJfQkxFTkRfREFSS0VOOworICAgIGNhc2UgRlhCU1RSX0lEKCdMJywgJ2knLCAnZycsICdoJyk6CisgICAgICByZXR1cm4gRlhESUJfQkxFTkRfTElHSFRFTjsKKyAgICBjYXNlIEZYQlNUUl9JRCgnQycsICdvJywgJ2wnLCAnbycpOgorICAgICAgaWYgKG1vZGUuR2V0TGVuZ3RoKCkgPT0gMTApIHsKKyAgICAgICAgcmV0dXJuIEZYRElCX0JMRU5EX0NPTE9SRE9ER0U7CisgICAgICB9CisgICAgICBpZiAobW9kZS5HZXRMZW5ndGgoKSA9PSA5KSB7CisgICAgICAgIHJldHVybiBGWERJQl9CTEVORF9DT0xPUkJVUk47CisgICAgICB9CisgICAgICByZXR1cm4gRlhESUJfQkxFTkRfQ09MT1I7CisgICAgY2FzZSBGWEJTVFJfSUQoJ0gnLCAnYScsICdyJywgJ2QnKToKKyAgICAgIHJldHVybiBGWERJQl9CTEVORF9IQVJETElHSFQ7CisgICAgY2FzZSBGWEJTVFJfSUQoJ1MnLCAnbycsICdmJywgJ3QnKToKKyAgICAgIHJldHVybiBGWERJQl9CTEVORF9TT0ZUTElHSFQ7CisgICAgY2FzZSBGWEJTVFJfSUQoJ0QnLCAnaScsICdmJywgJ2YnKToKKyAgICAgIHJldHVybiBGWERJQl9CTEVORF9ESUZGRVJFTkNFOworICAgIGNhc2UgRlhCU1RSX0lEKCdFJywgJ3gnLCAnYycsICdsJyk6CisgICAgICByZXR1cm4gRlhESUJfQkxFTkRfRVhDTFVTSU9OOworICAgIGNhc2UgRlhCU1RSX0lEKCdIJywgJ3UnLCAnZScsIDApOgorICAgICAgcmV0dXJuIEZYRElCX0JMRU5EX0hVRTsKKyAgICBjYXNlIEZYQlNUUl9JRCgnUycsICdhJywgJ3QnLCAndScpOgorICAgICAgcmV0dXJuIEZYRElCX0JMRU5EX1NBVFVSQVRJT047CisgICAgY2FzZSBGWEJTVFJfSUQoJ0wnLCAndScsICdtJywgJ2knKToKKyAgICAgIHJldHVybiBGWERJQl9CTEVORF9MVU1JTk9TSVRZOworICB9CisgIHJldHVybiBGWERJQl9CTEVORF9OT1JNQUw7Cit9Cit2b2lkIENQREZfR2VuZXJhbFN0YXRlRGF0YTo6U2V0QmxlbmRNb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYmxlbmRfbW9kZSkgeworICBpZiAoYmxlbmRfbW9kZS5HZXRMZW5ndGgoKSA+IDE1KSB7CisgICAgcmV0dXJuOworICB9CisgIEZYU1lTX21lbWNweShtX0JsZW5kTW9kZSwgYmxlbmRfbW9kZS5HZXRQdHIoKSwgYmxlbmRfbW9kZS5HZXRMZW5ndGgoKSk7CisgIG1fQmxlbmRNb2RlW2JsZW5kX21vZGUuR2V0TGVuZ3RoKCldID0gMDsKKyAgbV9CbGVuZFR5cGUgPSA6OkdldEJsZW5kVHlwZShibGVuZF9tb2RlKTsKK30KK2ludCBSSV9TdHJpbmdUb0lkKGNvbnN0IENGWF9CeXRlU3RyaW5nJiByaSkgeworICBGWF9EV09SRCBpZCA9IHJpLkdldElEKCk7CisgIGlmIChpZCA9PSBGWEJTVFJfSUQoJ0EnLCAnYicsICdzJywgJ28nKSkgeworICAgIHJldHVybiAxOworICB9CisgIGlmIChpZCA9PSBGWEJTVFJfSUQoJ1MnLCAnYScsICd0JywgJ3UnKSkgeworICAgIHJldHVybiAyOworICB9CisgIGlmIChpZCA9PSBGWEJTVFJfSUQoJ1AnLCAnZScsICdyJywgJ2MnKSkgeworICAgIHJldHVybiAzOworICB9CisgIHJldHVybiAwOworfQordm9pZCBDUERGX0dlbmVyYWxTdGF0ZTo6U2V0UmVuZGVySW50ZW50KGNvbnN0IENGWF9CeXRlU3RyaW5nJiByaSkgeworICBHZXRNb2RpZnkoKS0+bV9SZW5kZXJJbnRlbnQgPSBSSV9TdHJpbmdUb0lkKHJpKTsKK30KK0NQREZfQWxsU3RhdGVzOjpDUERGX0FsbFN0YXRlcygpIHsKKyAgbV9UZXh0WCA9IG1fVGV4dFkgPSBtX1RleHRMaW5lWCA9IG1fVGV4dExpbmVZID0gMDsKKyAgbV9UZXh0TGVhZGluZyA9IDA7CisgIG1fVGV4dFJpc2UgPSAwOworICBtX1RleHRIb3J6U2NhbGUgPSAxLjBmOworfQorQ1BERl9BbGxTdGF0ZXM6On5DUERGX0FsbFN0YXRlcygpIHt9Cit2b2lkIENQREZfQWxsU3RhdGVzOjpDb3B5KGNvbnN0IENQREZfQWxsU3RhdGVzJiBzcmMpIHsKKyAgQ29weVN0YXRlcyhzcmMpOworICBtX1RleHRNYXRyaXguQ29weShzcmMubV9UZXh0TWF0cml4KTsKKyAgbV9QYXJlbnRNYXRyaXguQ29weShzcmMubV9QYXJlbnRNYXRyaXgpOworICBtX0NUTS5Db3B5KHNyYy5tX0NUTSk7CisgIG1fVGV4dFggPSBzcmMubV9UZXh0WDsKKyAgbV9UZXh0WSA9IHNyYy5tX1RleHRZOworICBtX1RleHRMaW5lWCA9IHNyYy5tX1RleHRMaW5lWDsKKyAgbV9UZXh0TGluZVkgPSBzcmMubV9UZXh0TGluZVk7CisgIG1fVGV4dExlYWRpbmcgPSBzcmMubV9UZXh0TGVhZGluZzsKKyAgbV9UZXh0UmlzZSA9IHNyYy5tX1RleHRSaXNlOworICBtX1RleHRIb3J6U2NhbGUgPSBzcmMubV9UZXh0SG9yelNjYWxlOworfQordm9pZCBDUERGX0FsbFN0YXRlczo6U2V0TGluZURhc2goQ1BERl9BcnJheSogcEFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzY2FsZSkgeworICBDRlhfR3JhcGhTdGF0ZURhdGEqIHBEYXRhID0gbV9HcmFwaFN0YXRlLkdldE1vZGlmeSgpOworICBwRGF0YS0+bV9EYXNoUGhhc2UgPSBGWFNZU19NdWwocGhhc2UsIHNjYWxlKTsKKyAgcERhdGEtPlNldERhc2hDb3VudChwQXJyYXktPkdldENvdW50KCkpOworICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyBpKyspIHsKKyAgICBwRGF0YS0+bV9EYXNoQXJyYXlbaV0gPSBGWFNZU19NdWwocEFycmF5LT5HZXROdW1iZXIoaSksIHNjYWxlKTsKKyAgfQorfQordm9pZCBDUERGX0FsbFN0YXRlczo6UHJvY2Vzc0V4dEdTKENQREZfRGljdGlvbmFyeSogcEdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtQ29udGVudFBhcnNlciogcFBhcnNlcikgeworICBDUERGX0dlbmVyYWxTdGF0ZURhdGEqIHBHZW5lcmFsU3RhdGUgPSBtX0dlbmVyYWxTdGF0ZS5HZXRNb2RpZnkoKTsKKyAgZm9yIChjb25zdCBhdXRvJiBpdCA6ICpwR1MpIHsKKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYga2V5X3N0ciA9IGl0LmZpcnN0OworICAgIENQREZfT2JqZWN0KiBwRWxlbWVudCA9IGl0LnNlY29uZDsKKyAgICBDUERGX09iamVjdCogcE9iamVjdCA9IHBFbGVtZW50ID8gcEVsZW1lbnQtPkdldERpcmVjdCgpIDogbnVsbHB0cjsKKyAgICBpZiAoIXBPYmplY3QpCisgICAgICBjb250aW51ZTsKKworICAgIEZYX0RXT1JEIGtleSA9IGtleV9zdHIuR2V0SUQoKTsKKyAgICBzd2l0Y2ggKGtleSkgeworICAgICAgY2FzZSBGWEJTVFJfSUQoJ0wnLCAnVycsIDAsIDApOgorICAgICAgICBtX0dyYXBoU3RhdGUuR2V0TW9kaWZ5KCktPm1fTGluZVdpZHRoID0gcE9iamVjdC0+R2V0TnVtYmVyKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWEJTVFJfSUQoJ0wnLCAnQycsIDAsIDApOgorICAgICAgICBtX0dyYXBoU3RhdGUuR2V0TW9kaWZ5KCktPm1fTGluZUNhcCA9CisgICAgICAgICAgICAoQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwKXBPYmplY3QtPkdldEludGVnZXIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZYQlNUUl9JRCgnTCcsICdKJywgMCwgMCk6CisgICAgICAgIG1fR3JhcGhTdGF0ZS5HZXRNb2RpZnkoKS0+bV9MaW5lSm9pbiA9CisgICAgICAgICAgICAoQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pbilwT2JqZWN0LT5HZXRJbnRlZ2VyKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWEJTVFJfSUQoJ00nLCAnTCcsIDAsIDApOgorICAgICAgICBtX0dyYXBoU3RhdGUuR2V0TW9kaWZ5KCktPm1fTWl0ZXJMaW1pdCA9IHBPYmplY3QtPkdldE51bWJlcigpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRlhCU1RSX0lEKCdEJywgMCwgMCwgMCk6IHsKKyAgICAgICAgQ1BERl9BcnJheSogcERhc2ggPSBwT2JqZWN0LT5Bc0FycmF5KCk7CisgICAgICAgIGlmICghcERhc2gpCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gcERhc2gtPkdldEFycmF5KDApOworICAgICAgICBpZiAoIXBBcnJheSkKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBTZXRMaW5lRGFzaChwQXJyYXksIHBEYXNoLT5HZXROdW1iZXIoMSksIDEuMGYpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgRlhCU1RSX0lEKCdSJywgJ0knLCAwLCAwKToKKyAgICAgICAgbV9HZW5lcmFsU3RhdGUuU2V0UmVuZGVySW50ZW50KHBPYmplY3QtPkdldFN0cmluZygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZYQlNUUl9JRCgnRicsICdvJywgJ24nLCAndCcpOiB7CisgICAgICAgIENQREZfQXJyYXkqIHBGb250ID0gcE9iamVjdC0+QXNBcnJheSgpOworICAgICAgICBpZiAoIXBGb250KQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIG1fVGV4dFN0YXRlLkdldE1vZGlmeSgpLT5tX0ZvbnRTaXplID0gcEZvbnQtPkdldE51bWJlcigxKTsKKyAgICAgICAgbV9UZXh0U3RhdGUuU2V0Rm9udChwUGFyc2VyLT5GaW5kRm9udChwRm9udC0+R2V0U3RyaW5nKDApKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBGWEJTVFJfSUQoJ1QnLCAnUicsIDAsIDApOgorICAgICAgICBpZiAocEdTLT5LZXlFeGlzdCgiVFIyIikpIHsKKyAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfVGV4dE9iamVjdCoqIHBOZXdMaXN0ID0gRlhfQWxsb2MoQ1BERl9UZXh0T2JqZWN0KiwgcERhdGEtPm1fVGV4dENvdW50ICsgY291bnQgKyAxKTsKLSAgICBpZiAocERhdGEtPm1fcFRleHRMaXN0KSB7Ci0gICAgICAgIEZYU1lTX21lbWNweTMyKHBOZXdMaXN0LCBwRGF0YS0+bV9wVGV4dExpc3QsIHBEYXRhLT5tX1RleHRDb3VudCAqIHNpemVvZihDUERGX1RleHRPYmplY3QqKSk7Ci0gICAgICAgIEZYX0ZyZWUocERhdGEtPm1fcFRleHRMaXN0KTsKLSAgICB9Ci0gICAgcERhdGEtPm1fcFRleHRMaXN0ID0gcE5ld0xpc3Q7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgewotICAgICAgICBwRGF0YS0+bV9wVGV4dExpc3RbcERhdGEtPm1fVGV4dENvdW50ICsgaV0gPSBwVGV4dHNbaV07Ci0gICAgfQotICAgIHBEYXRhLT5tX3BUZXh0TGlzdFtwRGF0YS0+bV9UZXh0Q291bnQgKyBjb3VudF0gPSBOVUxMOwotICAgIHBEYXRhLT5tX1RleHRDb3VudCArPSBjb3VudCArIDE7Ci19Ci12b2lkIENQREZfQ2xpcFBhdGg6OlRyYW5zZm9ybShjb25zdCBDUERGX01hdHJpeCYgbWF0cml4KQotewotICAgIENQREZfQ2xpcFBhdGhEYXRhKiBwRGF0YSA9IEdldE1vZGlmeSgpOwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBwRGF0YS0+bV9QYXRoQ291bnQ7IGkgKyspIHsKLSAgICAgICAgcERhdGEtPm1fcFBhdGhMaXN0W2ldLlRyYW5zZm9ybSgmbWF0cml4KTsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IHBEYXRhLT5tX1RleHRDb3VudDsgaSArKykKLSAgICAgICAgaWYgKHBEYXRhLT5tX3BUZXh0TGlzdFtpXSkgewotICAgICAgICAgICAgcERhdGEtPm1fcFRleHRMaXN0W2ldLT5UcmFuc2Zvcm0obWF0cml4KTsKKyAgICAgIGNhc2UgRlhCU1RSX0lEKCdUJywgJ1InLCAnMicsIDApOgorICAgICAgICBwR2VuZXJhbFN0YXRlLT5tX3BUUiA9CisgICAgICAgICAgICAocE9iamVjdCAmJiAhcE9iamVjdC0+SXNOYW1lKCkpID8gcE9iamVjdCA6IG51bGxwdHI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWEJTVFJfSUQoJ0InLCAnTScsIDAsIDApOiB7CisgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IHBPYmplY3QtPkFzQXJyYXkoKTsKKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbW9kZSA9CisgICAgICAgICAgICBwQXJyYXkgPyBwQXJyYXktPkdldFN0cmluZygwKSA6IHBPYmplY3QtPkdldFN0cmluZygpOworCisgICAgICAgIHBHZW5lcmFsU3RhdGUtPlNldEJsZW5kTW9kZShtb2RlKTsKKyAgICAgICAgaWYgKHBHZW5lcmFsU3RhdGUtPm1fQmxlbmRUeXBlID4gRlhESUJfQkxFTkRfTVVMVElQTFkpIHsKKyAgICAgICAgICBwUGFyc2VyLT5HZXRPYmplY3RMaXN0KCktPm1fYkJhY2tncm91bmRBbHBoYU5lZWRlZCA9IFRSVUU7CiAgICAgICAgIH0KLX0KLUNQREZfQ29sb3JTdGF0ZURhdGE6OkNQREZfQ29sb3JTdGF0ZURhdGEoY29uc3QgQ1BERl9Db2xvclN0YXRlRGF0YSYgc3JjKQotewotICAgIG1fRmlsbENvbG9yLkNvcHkoJnNyYy5tX0ZpbGxDb2xvcik7Ci0gICAgbV9GaWxsUkdCID0gc3JjLm1fRmlsbFJHQjsKLSAgICBtX1N0cm9rZUNvbG9yLkNvcHkoJnNyYy5tX1N0cm9rZUNvbG9yKTsKLSAgICBtX1N0cm9rZVJHQiA9IHNyYy5tX1N0cm9rZVJHQjsKLX0KLXZvaWQgQ1BERl9Db2xvclN0YXRlRGF0YTo6RGVmYXVsdCgpCi17Ci0gICAgbV9GaWxsUkdCID0gbV9TdHJva2VSR0IgPSAwOwotICAgIG1fRmlsbENvbG9yLlNldENvbG9yU3BhY2UoQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRUdSQVkpKTsKLSAgICBtX1N0cm9rZUNvbG9yLlNldENvbG9yU3BhY2UoQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRUdSQVkpKTsKLX0KLXZvaWQgQ1BERl9Db2xvclN0YXRlOjpTZXRGaWxsQ29sb3IoQ1BERl9Db2xvclNwYWNlKiBwQ1MsIEZYX0ZMT0FUKiBwVmFsdWUsIGludCBuVmFsdWVzKQotewotICAgIENQREZfQ29sb3JTdGF0ZURhdGEqIHBEYXRhID0gR2V0TW9kaWZ5KCk7Ci0gICAgU2V0Q29sb3IocERhdGEtPm1fRmlsbENvbG9yLCBwRGF0YS0+bV9GaWxsUkdCLCBwQ1MsIHBWYWx1ZSwgblZhbHVlcyk7Ci19Ci12b2lkIENQREZfQ29sb3JTdGF0ZTo6U2V0U3Ryb2tlQ29sb3IoQ1BERl9Db2xvclNwYWNlKiBwQ1MsIEZYX0ZMT0FUKiBwVmFsdWUsIGludCBuVmFsdWVzKQotewotICAgIENQREZfQ29sb3JTdGF0ZURhdGEqIHBEYXRhID0gR2V0TW9kaWZ5KCk7Ci0gICAgU2V0Q29sb3IocERhdGEtPm1fU3Ryb2tlQ29sb3IsIHBEYXRhLT5tX1N0cm9rZVJHQiwgcENTLCBwVmFsdWUsIG5WYWx1ZXMpOwotfQotdm9pZCBDUERGX0NvbG9yU3RhdGU6OlNldENvbG9yKENQREZfQ29sb3ImIGNvbG9yLCBGWF9EV09SRCYgcmdiLCBDUERGX0NvbG9yU3BhY2UqIHBDUywgRlhfRkxPQVQqIHBWYWx1ZSwgaW50IG5WYWx1ZXMpCi17Ci0gICAgaWYgKHBDUykgewotICAgICAgICBjb2xvci5TZXRDb2xvclNwYWNlKHBDUyk7Ci0gICAgfSBlbHNlIGlmIChjb2xvci5Jc051bGwoKSkgewotICAgICAgICBjb2xvci5TZXRDb2xvclNwYWNlKENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VHUkFZKSk7Ci0gICAgfQotICAgIGlmIChjb2xvci5tX3BDUy0+Q291bnRDb21wb25lbnRzKCkgPiBuVmFsdWVzKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY29sb3IuU2V0VmFsdWUocFZhbHVlKTsKLSAgICBpbnQgUiwgRywgQjsKLSAgICByZ2IgPSBjb2xvci5HZXRSR0IoUiwgRywgQikgPyBGWFNZU19SR0IoUiwgRywgQikgOiAoRlhfRFdPUkQpIC0gMTsKLX0KLXZvaWQgQ1BERl9Db2xvclN0YXRlOjpTZXRGaWxsUGF0dGVybihDUERGX1BhdHRlcm4qIHBQYXR0ZXJuLCBGWF9GTE9BVCogcFZhbHVlLCBpbnQgblZhbHVlcykKLXsKLSAgICBDUERGX0NvbG9yU3RhdGVEYXRhKiBwRGF0YSA9IEdldE1vZGlmeSgpOwotICAgIHBEYXRhLT5tX0ZpbGxDb2xvci5TZXRWYWx1ZShwUGF0dGVybiwgcFZhbHVlLCBuVmFsdWVzKTsKLSAgICBpbnQgUiwgRywgQjsKLSAgICBGWF9CT09MIHJldCA9IHBEYXRhLT5tX0ZpbGxDb2xvci5HZXRSR0IoUiwgRywgQik7Ci0gICAgaWYgKHBQYXR0ZXJuLT5tX1BhdHRlcm5UeXBlID09IDEgJiYgKChDUERGX1RpbGluZ1BhdHRlcm4qKXBQYXR0ZXJuKS0+bV9iQ29sb3JlZCAmJiAhcmV0KSB7Ci0gICAgICAgIHBEYXRhLT5tX0ZpbGxSR0IgPSAweDAwQkZCRkJGOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHBEYXRhLT5tX0ZpbGxSR0IgPSByZXQgPyBGWFNZU19SR0IoUiwgRywgQikgOiAoRlhfRFdPUkQpIC0gMTsKLX0KLXZvaWQgQ1BERl9Db2xvclN0YXRlOjpTZXRTdHJva2VQYXR0ZXJuKENQREZfUGF0dGVybiogcFBhdHRlcm4sIEZYX0ZMT0FUKiBwVmFsdWUsIGludCBuVmFsdWVzKQotewotICAgIENQREZfQ29sb3JTdGF0ZURhdGEqIHBEYXRhID0gR2V0TW9kaWZ5KCk7Ci0gICAgcERhdGEtPm1fU3Ryb2tlQ29sb3IuU2V0VmFsdWUocFBhdHRlcm4sIHBWYWx1ZSwgblZhbHVlcyk7Ci0gICAgaW50IFIsIEcsIEI7Ci0gICAgRlhfQk9PTCByZXQgPSBwRGF0YS0+bV9TdHJva2VDb2xvci5HZXRSR0IoUiwgRywgQik7Ci0gICAgaWYgKHBQYXR0ZXJuLT5tX1BhdHRlcm5UeXBlID09IDEgJiYgKChDUERGX1RpbGluZ1BhdHRlcm4qKXBQYXR0ZXJuKS0+bV9iQ29sb3JlZCAmJiAhcmV0KSB7Ci0gICAgICAgIHBEYXRhLT5tX1N0cm9rZVJHQiA9IDB4MDBCRkJGQkY7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcERhdGEtPm1fU3Ryb2tlUkdCID0gcERhdGEtPm1fU3Ryb2tlQ29sb3IuR2V0UkdCKFIsIEcsIEIpID8gRlhTWVNfUkdCKFIsIEcsIEIpIDogKEZYX0RXT1JEKSAtIDE7Ci19Ci1DUERGX1RleHRTdGF0ZURhdGE6OkNQREZfVGV4dFN0YXRlRGF0YSgpCi17Ci0gICAgbV9wRm9udCA9IE5VTEw7Ci0gICAgbV9wRG9jdW1lbnQgPSBOVUxMOwotICAgIG1fRm9udFNpemUgPSAxLjBmOwotICAgIG1fV29yZFNwYWNlID0gMDsKLSAgICBtX0NoYXJTcGFjZSA9IDA7Ci0gICAgbV9UZXh0TW9kZSA9IDA7Ci0gICAgbV9NYXRyaXhbMF0gPSBtX01hdHJpeFszXSA9IDEuMGY7Ci0gICAgbV9NYXRyaXhbMV0gPSBtX01hdHJpeFsyXSA9IDA7Ci0gICAgbV9DVE1bMF0gPSBtX0NUTVszXSA9IDEuMGY7Ci0gICAgbV9DVE1bMV0gPSBtX0NUTVsyXSA9IDA7Ci19Ci1DUERGX1RleHRTdGF0ZURhdGE6OkNQREZfVGV4dFN0YXRlRGF0YShjb25zdCBDUERGX1RleHRTdGF0ZURhdGEmIHNyYykKLXsKLSAgICBpZiAodGhpcyA9PSAmc3JjKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhTWVNfbWVtY3B5MzIodGhpcywgJnNyYywgc2l6ZW9mKENQREZfVGV4dFN0YXRlRGF0YSkpOwotICAgIGlmIChtX3BEb2N1bWVudCAmJiBtX3BGb250KSB7Ci0gICAgICAgIG1fcEZvbnQgPSBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+R2V0Rm9udChtX3BGb250LT5HZXRGb250RGljdCgpLCBGQUxTRSk7Ci0gICAgfQotfQotQ1BERl9UZXh0U3RhdGVEYXRhOjp+Q1BERl9UZXh0U3RhdGVEYXRhKCkKLXsKLSAgICBpZiAobV9wRG9jdW1lbnQgJiYgbV9wRm9udCkgewotICAgICAgICBDUERGX0RvY1BhZ2VEYXRhICpwUGFnZURhdGEgPSBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKTsKLSAgICAgICAgaWYgKHBQYWdlRGF0YSAmJiAhcFBhZ2VEYXRhLT5Jc0ZvcmNlQ2xlYXIoKSkgewotICAgICAgICAgICAgcFBhZ2VEYXRhLT5SZWxlYXNlRm9udChtX3BGb250LT5HZXRGb250RGljdCgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEZYQlNUUl9JRCgnUycsICdNJywgJ2EnLCAncycpOgorICAgICAgICBpZiAoVG9EaWN0aW9uYXJ5KHBPYmplY3QpKSB7CisgICAgICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9wU29mdE1hc2sgPSBwT2JqZWN0OworICAgICAgICAgIEZYU1lTX21lbWNweShwR2VuZXJhbFN0YXRlLT5tX1NNYXNrTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAmcFBhcnNlci0+R2V0Q3VyU3RhdGVzKCktPm1fQ1RNLCBzaXplb2YoQ0ZYX01hdHJpeCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fcFNvZnRNYXNrID0gTlVMTDsKICAgICAgICAgfQotICAgIH0KLX0KLXZvaWQgQ1BERl9UZXh0U3RhdGU6OlNldEZvbnQoQ1BERl9Gb250KiBwRm9udCkKLXsKLSAgICBDUERGX1RleHRTdGF0ZURhdGEqIHBTdGF0ZURhdGEgPSBHZXRNb2RpZnkoKTsKLSAgICBpZiAocFN0YXRlRGF0YSkgewotICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jID0gcFN0YXRlRGF0YS0+bV9wRG9jdW1lbnQ7Ci0gICAgICAgIENQREZfRG9jUGFnZURhdGEgKnBQYWdlRGF0YSA9IHBEb2MgPyBwRG9jLT5HZXRQYWdlRGF0YSgpIDogTlVMTDsKLSAgICAgICAgaWYgKHBQYWdlRGF0YSAmJiBwU3RhdGVEYXRhLT5tX3BGb250ICYmICFwUGFnZURhdGEtPklzRm9yY2VDbGVhcigpKSB7Ci0gICAgICAgICAgICBwUGFnZURhdGEtPlJlbGVhc2VGb250KHBTdGF0ZURhdGEtPm1fcEZvbnQtPkdldEZvbnREaWN0KCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRlhCU1RSX0lEKCdDJywgJ0EnLCAwLCAwKToKKyAgICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9TdHJva2VBbHBoYSA9IFBERl9DbGlwRmxvYXQocE9iamVjdC0+R2V0TnVtYmVyKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRlhCU1RSX0lEKCdjJywgJ2EnLCAwLCAwKToKKyAgICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9GaWxsQWxwaGEgPSBQREZfQ2xpcEZsb2F0KHBPYmplY3QtPkdldE51bWJlcigpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZYQlNUUl9JRCgnTycsICdQJywgMCwgMCk6CisgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fU3Ryb2tlT1AgPSBwT2JqZWN0LT5HZXRJbnRlZ2VyKCk7CisgICAgICAgIGlmICghcEdTLT5LZXlFeGlzdCgib3AiKSkgeworICAgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fRmlsbE9QID0gcE9iamVjdC0+R2V0SW50ZWdlcigpOwogICAgICAgICB9Ci0gICAgICAgIHBTdGF0ZURhdGEtPm1fcERvY3VtZW50ID0gcEZvbnQgPyBwRm9udC0+bV9wRG9jdW1lbnQgOiBOVUxMOwotICAgICAgICBwU3RhdGVEYXRhLT5tX3BGb250ID0gcEZvbnQ7Ci0gICAgfQotfQotRlhfRkxPQVQgQ1BERl9UZXh0U3RhdGU6OkdldEZvbnRTaXplVigpIGNvbnN0Ci17Ci0gICAgRlhfRkxPQVQqIHBNYXRyaXggPSBHZXRNYXRyaXgoKTsKLSAgICBGWF9GTE9BVCB1bml0ID0gRlhTWVNfc3FydDIocE1hdHJpeFsxXSwgcE1hdHJpeFszXSk7Ci0gICAgRlhfRkxPQVQgc2l6ZSA9IEZYU1lTX011bCh1bml0LCBHZXRGb250U2l6ZSgpKTsKLSAgICByZXR1cm4gKEZYX0ZMT0FUKUZYU1lTX2ZhYnMoc2l6ZSk7Ci19Ci1GWF9GTE9BVCBDUERGX1RleHRTdGF0ZTo6R2V0Rm9udFNpemVIKCkgY29uc3QKLXsKLSAgICBGWF9GTE9BVCogcE1hdHJpeCA9IEdldE1hdHJpeCgpOwotICAgIEZYX0ZMT0FUIHVuaXQgPSBGWFNZU19zcXJ0MihwTWF0cml4WzBdLCBwTWF0cml4WzJdKTsKLSAgICBGWF9GTE9BVCBzaXplID0gRlhTWVNfTXVsKHVuaXQsIEdldEZvbnRTaXplKCkpOwotICAgIHJldHVybiAoRlhfRkxPQVQpRlhTWVNfZmFicyhzaXplKTsKLX0KLUZYX0ZMT0FUIENQREZfVGV4dFN0YXRlOjpHZXRCYXNlbGluZUFuZ2xlKCkgY29uc3QKLXsKLSAgICBGWF9GTE9BVCogbV9NYXRyaXggPSBHZXRNYXRyaXgoKTsKLSAgICByZXR1cm4gRlhTWVNfYXRhbjIobV9NYXRyaXhbMl0sIG1fTWF0cml4WzBdKTsKLX0KLUZYX0ZMT0FUIENQREZfVGV4dFN0YXRlOjpHZXRTaGVhckFuZ2xlKCkgY29uc3QKLXsKLSAgICBGWF9GTE9BVCogbV9NYXRyaXggPSBHZXRNYXRyaXgoKTsKLSAgICBGWF9GTE9BVCBzaGVhcl9hbmdsZSA9IEZYU1lTX2F0YW4yKG1fTWF0cml4WzFdLCBtX01hdHJpeFszXSk7Ci0gICAgcmV0dXJuIEdldEJhc2VsaW5lQW5nbGUoKSArIHNoZWFyX2FuZ2xlOwotfQotQ1BERl9HZW5lcmFsU3RhdGVEYXRhOjpDUERGX0dlbmVyYWxTdGF0ZURhdGEoKQotewotICAgIEZYU1lTX21lbXNldDMyKHRoaXMsIDAsIHNpemVvZihDUERGX0dlbmVyYWxTdGF0ZURhdGEpKTsKLSAgICBGWFNZU19zdHJjcHkoKEZYX0xQU1RSKW1fQmxlbmRNb2RlLCAiTm9ybWFsIik7Ci0gICAgbV9TdHJva2VBbHBoYSA9IDEuMGY7Ci0gICAgbV9GaWxsQWxwaGEgPSAxLjBmOwotICAgIG1fRmxhdG5lc3MgPSAxLjBmOwotICAgIG1fTWF0cml4LlNldElkZW50aXR5KCk7Ci19Ci1DUERGX0dlbmVyYWxTdGF0ZURhdGE6OkNQREZfR2VuZXJhbFN0YXRlRGF0YShjb25zdCBDUERGX0dlbmVyYWxTdGF0ZURhdGEmIHNyYykKLXsKLSAgICBGWFNZU19tZW1jcHkzMih0aGlzLCAmc3JjLCBzaXplb2YoQ1BERl9HZW5lcmFsU3RhdGVEYXRhKSk7Ci0gICAgaWYgKHNyYy5tX3BUcmFuc2ZlckZ1bmMgJiYgc3JjLm1fcFRyYW5zZmVyRnVuYy0+bV9wUERGRG9jKSB7Ci0gICAgICAgIENQREZfRG9jUmVuZGVyRGF0YSogcERvY0NhY2hlID0gc3JjLm1fcFRyYW5zZmVyRnVuYy0+bV9wUERGRG9jLT5HZXRSZW5kZXJEYXRhKCk7Ci0gICAgICAgIGlmICghcERvY0NhY2hlKSB7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWEJTVFJfSUQoJ28nLCAncCcsIDAsIDApOgorICAgICAgICBwR2VuZXJhbFN0YXRlLT5tX0ZpbGxPUCA9IHBPYmplY3QtPkdldEludGVnZXIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZYQlNUUl9JRCgnTycsICdQJywgJ00nLCAwKToKKyAgICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9PUE1vZGUgPSBwT2JqZWN0LT5HZXRJbnRlZ2VyKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWEJTVFJfSUQoJ0InLCAnRycsIDAsIDApOgorICAgICAgICBpZiAocEdTLT5LZXlFeGlzdCgiQkcyIikpIHsKKyAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBtX3BUcmFuc2ZlckZ1bmMgPSBwRG9jQ2FjaGUtPkdldFRyYW5zZmVyRnVuYyhtX3BUUik7Ci0gICAgfQotfQotQ1BERl9HZW5lcmFsU3RhdGVEYXRhOjp+Q1BERl9HZW5lcmFsU3RhdGVEYXRhKCkKLXsKLSAgICBpZiAobV9wVHJhbnNmZXJGdW5jICYmIG1fcFRyYW5zZmVyRnVuYy0+bV9wUERGRG9jKSB7Ci0gICAgICAgIENQREZfRG9jUmVuZGVyRGF0YSogcERvY0NhY2hlID0gbV9wVHJhbnNmZXJGdW5jLT5tX3BQREZEb2MtPkdldFJlbmRlckRhdGEoKTsKLSAgICAgICAgaWYgKCFwRG9jQ2FjaGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgIGNhc2UgRlhCU1RSX0lEKCdCJywgJ0cnLCAnMicsIDApOgorICAgICAgICBwR2VuZXJhbFN0YXRlLT5tX3BCRyA9IHBPYmplY3Q7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWEJTVFJfSUQoJ1UnLCAnQycsICdSJywgMCk6CisgICAgICAgIGlmIChwR1MtPktleUV4aXN0KCJVQ1IyIikpIHsKKyAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBwRG9jQ2FjaGUtPlJlbGVhc2VUcmFuc2ZlckZ1bmMobV9wVFIpOworICAgICAgY2FzZSBGWEJTVFJfSUQoJ1UnLCAnQycsICdSJywgJzInKToKKyAgICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9wVUNSID0gcE9iamVjdDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZYQlNUUl9JRCgnSCcsICdUJywgMCwgMCk6CisgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fcEhUID0gcE9iamVjdDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZYQlNUUl9JRCgnRicsICdMJywgMCwgMCk6CisgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fRmxhdG5lc3MgPSBwT2JqZWN0LT5HZXROdW1iZXIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZYQlNUUl9JRCgnUycsICdNJywgMCwgMCk6CisgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fU21vb3RobmVzcyA9IHBPYmplY3QtPkdldE51bWJlcigpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRlhCU1RSX0lEKCdTJywgJ0EnLCAwLCAwKToKKyAgICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9TdHJva2VBZGp1c3QgPSBwT2JqZWN0LT5HZXRJbnRlZ2VyKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWEJTVFJfSUQoJ0EnLCAnSScsICdTJywgMCk6CisgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fQWxwaGFTb3VyY2UgPSBwT2JqZWN0LT5HZXRJbnRlZ2VyKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWEJTVFJfSUQoJ1QnLCAnSycsIDAsIDApOgorICAgICAgICBwR2VuZXJhbFN0YXRlLT5tX1RleHRLbm9ja291dCA9IHBPYmplY3QtPkdldEludGVnZXIoKTsKKyAgICAgICAgYnJlYWs7CiAgICAgfQorICB9CisgIHBHZW5lcmFsU3RhdGUtPm1fTWF0cml4ID0gbV9DVE07CiB9Ci1zdGF0aWMgaW50IEdldEJsZW5kVHlwZShGWF9CU1RSIG1vZGUpCi17Ci0gICAgc3dpdGNoIChtb2RlLkdldElEKCkpIHsKLSAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ04nLCAnbycsICdyJywgJ20nKToKLSAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ0MnLCAnbycsICdtJywgJ3AnKToKLSAgICAgICAgICAgIHJldHVybiBGWERJQl9CTEVORF9OT1JNQUw7Ci0gICAgICAgIGNhc2UgRlhCU1RSX0lEKCdNJywgJ3UnLCAnbCcsICd0Jyk6Ci0gICAgICAgICAgICByZXR1cm4gRlhESUJfQkxFTkRfTVVMVElQTFk7Ci0gICAgICAgIGNhc2UgRlhCU1RSX0lEKCdTJywgJ2MnLCAncicsICdlJyk6Ci0gICAgICAgICAgICByZXR1cm4gRlhESUJfQkxFTkRfU0NSRUVOOwotICAgICAgICBjYXNlIEZYQlNUUl9JRCgnTycsICd2JywgJ2UnLCAncicpOgotICAgICAgICAgICAgcmV0dXJuIEZYRElCX0JMRU5EX09WRVJMQVk7Ci0gICAgICAgIGNhc2UgRlhCU1RSX0lEKCdEJywgJ2EnLCAncicsICdrJyk6Ci0gICAgICAgICAgICByZXR1cm4gRlhESUJfQkxFTkRfREFSS0VOOwotICAgICAgICBjYXNlIEZYQlNUUl9JRCgnTCcsICdpJywgJ2cnLCAnaCcpOgotICAgICAgICAgICAgcmV0dXJuIEZYRElCX0JMRU5EX0xJR0hURU47Ci0gICAgICAgIGNhc2UgRlhCU1RSX0lEKCdDJywgJ28nLCAnbCcsICdvJyk6Ci0gICAgICAgICAgICBpZiAobW9kZS5HZXRMZW5ndGgoKSA9PSAxMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGWERJQl9CTEVORF9DT0xPUkRPREdFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1vZGUuR2V0TGVuZ3RoKCkgPT0gOSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGWERJQl9CTEVORF9DT0xPUkJVUk47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRlhESUJfQkxFTkRfQ09MT1I7Ci0gICAgICAgIGNhc2UgRlhCU1RSX0lEKCdIJywgJ2EnLCAncicsICdkJyk6Ci0gICAgICAgICAgICByZXR1cm4gRlhESUJfQkxFTkRfSEFSRExJR0hUOwotICAgICAgICBjYXNlIEZYQlNUUl9JRCgnUycsICdvJywgJ2YnLCAndCcpOgotICAgICAgICAgICAgcmV0dXJuIEZYRElCX0JMRU5EX1NPRlRMSUdIVDsKLSAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ0QnLCAnaScsICdmJywgJ2YnKToKLSAgICAgICAgICAgIHJldHVybiBGWERJQl9CTEVORF9ESUZGRVJFTkNFOwotICAgICAgICBjYXNlIEZYQlNUUl9JRCgnRScsICd4JywgJ2MnLCAnbCcpOgotICAgICAgICAgICAgcmV0dXJuIEZYRElCX0JMRU5EX0VYQ0xVU0lPTjsKLSAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ0gnLCAndScsICdlJywgMCk6Ci0gICAgICAgICAgICByZXR1cm4gRlhESUJfQkxFTkRfSFVFOwotICAgICAgICBjYXNlIEZYQlNUUl9JRCgnUycsICdhJywgJ3QnLCAndScpOgotICAgICAgICAgICAgcmV0dXJuIEZYRElCX0JMRU5EX1NBVFVSQVRJT047Ci0gICAgICAgIGNhc2UgRlhCU1RSX0lEKCdMJywgJ3UnLCAnbScsICdpJyk6Ci0gICAgICAgICAgICByZXR1cm4gRlhESUJfQkxFTkRfTFVNSU5PU0lUWTsKK0NQREZfQ29udGVudE1hcmtJdGVtOjpDUERGX0NvbnRlbnRNYXJrSXRlbSgpIHsKKyAgbV9QYXJhbVR5cGUgPSBOb25lOworfQorQ1BERl9Db250ZW50TWFya0l0ZW06OkNQREZfQ29udGVudE1hcmtJdGVtKGNvbnN0IENQREZfQ29udGVudE1hcmtJdGVtJiBzcmMpIHsKKyAgbV9NYXJrTmFtZSA9IHNyYy5tX01hcmtOYW1lOworICBtX1BhcmFtVHlwZSA9IHNyYy5tX1BhcmFtVHlwZTsKKyAgaWYgKG1fUGFyYW1UeXBlID09IERpcmVjdERpY3QpIHsKKyAgICBtX3BQYXJhbSA9IFRvRGljdGlvbmFyeShzdGF0aWNfY2FzdDxDUERGX09iamVjdCo+KHNyYy5tX3BQYXJhbSkpLT5DbG9uZSgpOworICB9IGVsc2UgeworICAgIG1fcFBhcmFtID0gc3JjLm1fcFBhcmFtOworICB9Cit9CitDUERGX0NvbnRlbnRNYXJrSXRlbTo6fkNQREZfQ29udGVudE1hcmtJdGVtKCkgeworICBpZiAobV9QYXJhbVR5cGUgPT0gRGlyZWN0RGljdCAmJiBtX3BQYXJhbSkgeworICAgIFRvRGljdGlvbmFyeShzdGF0aWNfY2FzdDxDUERGX09iamVjdCo+KG1fcFBhcmFtKSktPlJlbGVhc2UoKTsKKyAgfQorfQorRlhfQk9PTCBDUERGX0NvbnRlbnRNYXJrSXRlbTo6SGFzTUNJRCgpIGNvbnN0IHsKKyAgaWYgKG1fcFBhcmFtICYmCisgICAgICAobV9QYXJhbVR5cGUgPT0gRGlyZWN0RGljdCB8fCBtX1BhcmFtVHlwZSA9PSBQcm9wZXJ0aWVzRGljdCkpIHsKKyAgICByZXR1cm4gVG9EaWN0aW9uYXJ5KHN0YXRpY19jYXN0PENQREZfT2JqZWN0Kj4obV9wUGFyYW0pKS0+S2V5RXhpc3QoIk1DSUQiKTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitDUERGX0NvbnRlbnRNYXJrRGF0YTo6Q1BERl9Db250ZW50TWFya0RhdGEoY29uc3QgQ1BERl9Db250ZW50TWFya0RhdGEmIHNyYykgeworICBmb3IgKGludCBpID0gMDsgaSA8IHNyYy5tX01hcmtzLkdldFNpemUoKTsgaSsrKSB7CisgICAgbV9NYXJrcy5BZGQoc3JjLm1fTWFya3NbaV0pOworICB9Cit9CitpbnQgQ1BERl9Db250ZW50TWFya0RhdGE6OkdldE1DSUQoKSBjb25zdCB7CisgIENQREZfQ29udGVudE1hcmtJdGVtOjpQYXJhbVR5cGUgdHlwZSA9IENQREZfQ29udGVudE1hcmtJdGVtOjpOb25lOworICBmb3IgKGludCBpID0gMDsgaSA8IG1fTWFya3MuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICB0eXBlID0gbV9NYXJrc1tpXS5HZXRQYXJhbVR5cGUoKTsKKyAgICBpZiAodHlwZSA9PSBDUERGX0NvbnRlbnRNYXJrSXRlbTo6UHJvcGVydGllc0RpY3QgfHwKKyAgICAgICAgdHlwZSA9PSBDUERGX0NvbnRlbnRNYXJrSXRlbTo6RGlyZWN0RGljdCkgeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9CisgICAgICAgICAgVG9EaWN0aW9uYXJ5KHN0YXRpY19jYXN0PENQREZfT2JqZWN0Kj4obV9NYXJrc1tpXS5HZXRQYXJhbSgpKSk7CisgICAgICBpZiAocERpY3QtPktleUV4aXN0KCJNQ0lEIikpIHsKKyAgICAgICAgcmV0dXJuIHBEaWN0LT5HZXRJbnRlZ2VyKCJNQ0lEIik7CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGWERJQl9CTEVORF9OT1JNQUw7CisgIH0KKyAgcmV0dXJuIC0xOwogfQotdm9pZCBDUERGX0dlbmVyYWxTdGF0ZURhdGE6OlNldEJsZW5kTW9kZShGWF9CU1RSIGJsZW5kX21vZGUpCi17Ci0gICAgaWYgKGJsZW5kX21vZGUuR2V0TGVuZ3RoKCkgPiAxNSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYU1lTX21lbWNweTMyKG1fQmxlbmRNb2RlLCBibGVuZF9tb2RlLkdldFB0cigpLCBibGVuZF9tb2RlLkdldExlbmd0aCgpKTsKLSAgICBtX0JsZW5kTW9kZVtibGVuZF9tb2RlLkdldExlbmd0aCgpXSA9IDA7Ci0gICAgbV9CbGVuZFR5cGUgPSA6OkdldEJsZW5kVHlwZShibGVuZF9tb2RlKTsKK3ZvaWQgQ1BERl9Db250ZW50TWFya0RhdGE6OkFkZE1hcmsoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRpcmVjdCkgeworICBDUERGX0NvbnRlbnRNYXJrSXRlbSYgaXRlbSA9IG1fTWFya3MuQWRkKCk7CisgIGl0ZW0uU2V0TmFtZShuYW1lKTsKKyAgaWYgKCFwRGljdCkgeworICAgIHJldHVybjsKKyAgfQorICBpdGVtLlNldFBhcmFtKGJEaXJlY3QgPyBDUERGX0NvbnRlbnRNYXJrSXRlbTo6RGlyZWN0RGljdAorICAgICAgICAgICAgICAgICAgICAgICAgOiBDUERGX0NvbnRlbnRNYXJrSXRlbTo6UHJvcGVydGllc0RpY3QsCisgICAgICAgICAgICAgICAgYkRpcmVjdCA/IHBEaWN0LT5DbG9uZSgpIDogcERpY3QpOwogfQotaW50IFJJX1N0cmluZ1RvSWQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHJpKQotewotICAgIEZYX0RXT1JEIGlkID0gcmkuR2V0SUQoKTsKLSAgICBpZiAoaWQgPT0gRlhCU1RSX0lEKCdBJywgJ2InLCAncycsICdvJykpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmIChpZCA9PSBGWEJTVFJfSUQoJ1MnLCAnYScsICd0JywgJ3UnKSkgewotICAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0gICAgaWYgKGlkID09IEZYQlNUUl9JRCgnUCcsICdlJywgJ3InLCAnYycpKSB7Ci0gICAgICAgIHJldHVybiAzOwotICAgIH0KLSAgICByZXR1cm4gMDsKK3ZvaWQgQ1BERl9Db250ZW50TWFya0RhdGE6OkRlbGV0ZUxhc3RNYXJrKCkgeworICBpbnQgc2l6ZSA9IG1fTWFya3MuR2V0U2l6ZSgpOworICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIG1fTWFya3MuUmVtb3ZlQXQoc2l6ZSAtIDEpOwogfQotdm9pZCBDUERGX0dlbmVyYWxTdGF0ZTo6U2V0UmVuZGVySW50ZW50KGNvbnN0IENGWF9CeXRlU3RyaW5nJiByaSkKLXsKLSAgICBHZXRNb2RpZnkoKS0+bV9SZW5kZXJJbnRlbnQgPSBSSV9TdHJpbmdUb0lkKHJpKTsKLX0KLUNQREZfQWxsU3RhdGVzOjpDUERGX0FsbFN0YXRlcygpCi17Ci0gICAgbV9UZXh0WCA9IG1fVGV4dFkgPSBtX1RleHRMaW5lWCA9IG1fVGV4dExpbmVZID0gMDsKLSAgICBtX1RleHRMZWFkaW5nID0gMDsKLSAgICBtX1RleHRSaXNlID0gMDsKLSAgICBtX1RleHRIb3J6U2NhbGUgPSAxLjBmOwotfQotQ1BERl9BbGxTdGF0ZXM6On5DUERGX0FsbFN0YXRlcygpCi17Ci19Ci12b2lkIENQREZfQWxsU3RhdGVzOjpDb3B5KGNvbnN0IENQREZfQWxsU3RhdGVzJiBzcmMpCi17Ci0gICAgQ29weVN0YXRlcyhzcmMpOwotICAgIG1fVGV4dE1hdHJpeC5Db3B5KHNyYy5tX1RleHRNYXRyaXgpOwotICAgIG1fUGFyZW50TWF0cml4LkNvcHkoc3JjLm1fUGFyZW50TWF0cml4KTsKLSAgICBtX0NUTS5Db3B5KHNyYy5tX0NUTSk7Ci0gICAgbV9UZXh0WCA9IHNyYy5tX1RleHRYOwotICAgIG1fVGV4dFkgPSBzcmMubV9UZXh0WTsKLSAgICBtX1RleHRMaW5lWCA9IHNyYy5tX1RleHRMaW5lWDsKLSAgICBtX1RleHRMaW5lWSA9IHNyYy5tX1RleHRMaW5lWTsKLSAgICBtX1RleHRMZWFkaW5nID0gc3JjLm1fVGV4dExlYWRpbmc7Ci0gICAgbV9UZXh0UmlzZSA9IHNyYy5tX1RleHRSaXNlOwotICAgIG1fVGV4dEhvcnpTY2FsZSA9IHNyYy5tX1RleHRIb3J6U2NhbGU7Ci19Ci12b2lkIENQREZfQWxsU3RhdGVzOjpTZXRMaW5lRGFzaChDUERGX0FycmF5KiBwQXJyYXksIEZYX0ZMT0FUIHBoYXNlLCBGWF9GTE9BVCBzY2FsZSkKLXsKLSAgICBDRlhfR3JhcGhTdGF0ZURhdGEqIHBEYXRhID0gbV9HcmFwaFN0YXRlLkdldE1vZGlmeSgpOwotICAgIHBEYXRhLT5tX0Rhc2hQaGFzZSA9IEZYU1lTX011bChwaGFzZSwgc2NhbGUpOwotICAgIHBEYXRhLT5TZXREYXNoQ291bnQocEFycmF5LT5HZXRDb3VudCgpKTsKLSAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgIHBEYXRhLT5tX0Rhc2hBcnJheVtpXSA9IEZYU1lTX011bChwQXJyYXktPkdldE51bWJlcihpKSwgc2NhbGUpOwotICAgIH0KLX0KLXZvaWQgQ1BERl9BbGxTdGF0ZXM6OlByb2Nlc3NFeHRHUyhDUERGX0RpY3Rpb25hcnkqIHBHUywgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyKiBwUGFyc2VyKQotewotICAgIENQREZfR2VuZXJhbFN0YXRlRGF0YSogcEdlbmVyYWxTdGF0ZSA9IG1fR2VuZXJhbFN0YXRlLkdldE1vZGlmeSgpOwotICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBHUy0+R2V0U3RhcnRQb3MoKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGtleV9zdHI7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwRWxlbWVudCA9IHBHUy0+R2V0TmV4dEVsZW1lbnQocG9zLCBrZXlfc3RyKTsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBPYmplY3QgPSBwRWxlbWVudCA/IHBFbGVtZW50LT5HZXREaXJlY3QoKSA6IE5VTEw7Ci0gICAgICAgIGlmIChwT2JqZWN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEZYX0RXT1JEIGtleSA9IGtleV9zdHIuR2V0SUQoKTsKLSAgICAgICAgc3dpdGNoIChrZXkpIHsKLSAgICAgICAgICAgIGNhc2UgRlhCU1RSX0lEKCdMJywgJ1cnLCAwLCAwKToKLSAgICAgICAgICAgICAgICBtX0dyYXBoU3RhdGUuR2V0TW9kaWZ5KCktPm1fTGluZVdpZHRoID0gcE9iamVjdC0+R2V0TnVtYmVyKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZYQlNUUl9JRCgnTCcsICdDJywgMCwgMCk6Ci0gICAgICAgICAgICAgICAgbV9HcmFwaFN0YXRlLkdldE1vZGlmeSgpLT5tX0xpbmVDYXAgPSAoQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwKXBPYmplY3QtPkdldEludGVnZXIoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRlhCU1RSX0lEKCdMJywgJ0onLCAwLCAwKToKLSAgICAgICAgICAgICAgICBtX0dyYXBoU3RhdGUuR2V0TW9kaWZ5KCktPm1fTGluZUpvaW4gPSAoQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pbilwT2JqZWN0LT5HZXRJbnRlZ2VyKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZYQlNUUl9JRCgnTScsICdMJywgMCwgMCk6Ci0gICAgICAgICAgICAgICAgbV9HcmFwaFN0YXRlLkdldE1vZGlmeSgpLT5tX01pdGVyTGltaXQgPSBwT2JqZWN0LT5HZXROdW1iZXIoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRlhCU1RSX0lEKCdEJywgMCwgMCwgMCk6CXsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBPYmplY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBEYXNoID0gKENQREZfQXJyYXkqKXBPYmplY3Q7Ci0gICAgICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IHBEYXNoLT5HZXRBcnJheSgwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTZXRMaW5lRGFzaChwQXJyYXksIHBEYXNoLT5HZXROdW1iZXIoMSksIDEuMGYpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIEZYQlNUUl9JRCgnUicsICdJJywgMCwgMCk6Ci0gICAgICAgICAgICAgICAgbV9HZW5lcmFsU3RhdGUuU2V0UmVuZGVySW50ZW50KHBPYmplY3QtPkdldFN0cmluZygpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRlhCU1RSX0lEKCdGJywgJ28nLCAnbicsICd0Jyk6CXsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBPYmplY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBGb250ID0gKENQREZfQXJyYXkqKXBPYmplY3Q7Ci0gICAgICAgICAgICAgICAgICAgIG1fVGV4dFN0YXRlLkdldE1vZGlmeSgpLT5tX0ZvbnRTaXplID0gcEZvbnQtPkdldE51bWJlcigxKTsKLSAgICAgICAgICAgICAgICAgICAgbV9UZXh0U3RhdGUuU2V0Rm9udChwUGFyc2VyLT5GaW5kRm9udChwRm9udC0+R2V0U3RyaW5nKDApKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRlhCU1RSX0lEKCdUJywgJ1InLCAwLCAwKToKLSAgICAgICAgICAgICAgICBpZiAocEdTLT5LZXlFeGlzdChGWF9CU1RSQygiVFIyIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRlhCU1RSX0lEKCdUJywgJ1InLCAnMicsIDApOgotICAgICAgICAgICAgICAgIGlmIChwT2JqZWN0ICYmIHBPYmplY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfTkFNRSkgewotICAgICAgICAgICAgICAgICAgICBwR2VuZXJhbFN0YXRlLT5tX3BUUiA9IHBPYmplY3Q7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9wVFIgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRlhCU1RSX0lEKCdCJywgJ00nLCAwLCAwKToJewotICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBtb2RlOwotICAgICAgICAgICAgICAgICAgICBpZiAocE9iamVjdC0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9ICgoQ1BERl9BcnJheSopcE9iamVjdCktPkdldFN0cmluZygwKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBwT2JqZWN0LT5HZXRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwR2VuZXJhbFN0YXRlLT5TZXRCbGVuZE1vZGUobW9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwR2VuZXJhbFN0YXRlLT5tX0JsZW5kVHlwZSA+IEZYRElCX0JMRU5EX01VTFRJUExZKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFyc2VyLT5tX3BPYmplY3RMaXN0LT5tX2JCYWNrZ3JvdW5kQWxwaGFOZWVkZWQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgRlhCU1RSX0lEKCdTJywgJ00nLCAnYScsICdzJyk6Ci0gICAgICAgICAgICAgICAgaWYgKHBPYmplY3QgJiYgcE9iamVjdC0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fcFNvZnRNYXNrID0gcE9iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIocEdlbmVyYWxTdGF0ZS0+bV9TTWFza01hdHJpeCwgJnBQYXJzZXItPm1fcEN1clN0YXRlcy0+bV9DVE0sIHNpemVvZihDUERGX01hdHJpeCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fcFNvZnRNYXNrID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZYQlNUUl9JRCgnQycsICdBJywgMCwgMCk6Ci0gICAgICAgICAgICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9TdHJva2VBbHBoYSA9IFBERl9DbGlwRmxvYXQocE9iamVjdC0+R2V0TnVtYmVyKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ2MnLCAnYScsIDAsIDApOgotICAgICAgICAgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fRmlsbEFscGhhID0gUERGX0NsaXBGbG9hdChwT2JqZWN0LT5HZXROdW1iZXIoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZYQlNUUl9JRCgnTycsICdQJywgMCwgMCk6Ci0gICAgICAgICAgICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9TdHJva2VPUCA9IHBPYmplY3QtPkdldEludGVnZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXBHUy0+S2V5RXhpc3QoRlhfQlNUUkMoIm9wIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fRmlsbE9QID0gcE9iamVjdC0+R2V0SW50ZWdlcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRlhCU1RSX0lEKCdvJywgJ3AnLCAwLCAwKToKLSAgICAgICAgICAgICAgICBwR2VuZXJhbFN0YXRlLT5tX0ZpbGxPUCA9IHBPYmplY3QtPkdldEludGVnZXIoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRlhCU1RSX0lEKCdPJywgJ1AnLCAnTScsIDApOgotICAgICAgICAgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fT1BNb2RlID0gcE9iamVjdC0+R2V0SW50ZWdlcigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ0InLCAnRycsIDAsIDApOgotICAgICAgICAgICAgICAgIGlmIChwR1MtPktleUV4aXN0KEZYX0JTVFJDKCJCRzIiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ0InLCAnRycsICcyJywgMCk6Ci0gICAgICAgICAgICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9wQkcgPSBwT2JqZWN0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ1UnLCAnQycsICdSJywgMCk6Ci0gICAgICAgICAgICAgICAgaWYgKHBHUy0+S2V5RXhpc3QoRlhfQlNUUkMoIlVDUjIiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ1UnLCAnQycsICdSJywgJzInKToKLSAgICAgICAgICAgICAgICBwR2VuZXJhbFN0YXRlLT5tX3BVQ1IgPSBwT2JqZWN0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ0gnLCAnVCcsIDAsIDApOgotICAgICAgICAgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fcEhUID0gcE9iamVjdDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRlhCU1RSX0lEKCdGJywgJ0wnLCAwLCAwKToKLSAgICAgICAgICAgICAgICBwR2VuZXJhbFN0YXRlLT5tX0ZsYXRuZXNzID0gcE9iamVjdC0+R2V0TnVtYmVyKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZYQlNUUl9JRCgnUycsICdNJywgMCwgMCk6Ci0gICAgICAgICAgICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9TbW9vdGhuZXNzID0gcE9iamVjdC0+R2V0TnVtYmVyKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZYQlNUUl9JRCgnUycsICdBJywgMCwgMCk6Ci0gICAgICAgICAgICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9TdHJva2VBZGp1c3QgPSBwT2JqZWN0LT5HZXRJbnRlZ2VyKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZYQlNUUl9JRCgnQScsICdJJywgJ1MnLCAwKToKLSAgICAgICAgICAgICAgICBwR2VuZXJhbFN0YXRlLT5tX0FscGhhU291cmNlID0gcE9iamVjdC0+R2V0SW50ZWdlcigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ1QnLCAnSycsIDAsIDApOgotICAgICAgICAgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fVGV4dEtub2Nrb3V0ID0gcE9iamVjdC0+R2V0SW50ZWdlcigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHBHZW5lcmFsU3RhdGUtPm1fTWF0cml4ID0gbV9DVE07Ci19Ci1DUERGX0NvbnRlbnRNYXJrSXRlbTo6Q1BERl9Db250ZW50TWFya0l0ZW0oKQotewotICAgIG1fUGFyYW1UeXBlID0gTm9uZTsKLX0KLUNQREZfQ29udGVudE1hcmtJdGVtOjpDUERGX0NvbnRlbnRNYXJrSXRlbShjb25zdCBDUERGX0NvbnRlbnRNYXJrSXRlbSYgc3JjKQotewotICAgIG1fTWFya05hbWUgPSBzcmMubV9NYXJrTmFtZTsKLSAgICBtX1BhcmFtVHlwZSA9IHNyYy5tX1BhcmFtVHlwZTsKLSAgICBpZiAobV9QYXJhbVR5cGUgPT0gRGlyZWN0RGljdCkgewotICAgICAgICBtX3BQYXJhbSA9ICgoQ1BERl9EaWN0aW9uYXJ5KilzcmMubV9wUGFyYW0pLT5DbG9uZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcFBhcmFtID0gc3JjLm1fcFBhcmFtOwotICAgIH0KLX0KLUNQREZfQ29udGVudE1hcmtJdGVtOjp+Q1BERl9Db250ZW50TWFya0l0ZW0oKQotewotICAgIGlmIChtX1BhcmFtVHlwZSA9PSBEaXJlY3REaWN0ICYmIG1fcFBhcmFtKSB7Ci0gICAgICAgICgoQ1BERl9EaWN0aW9uYXJ5KiltX3BQYXJhbSktPlJlbGVhc2UoKTsKLSAgICB9Ci19Ci1GWF9CT09MCUNQREZfQ29udGVudE1hcmtJdGVtOjpIYXNNQ0lEKCkgY29uc3QKLXsKLSAgICBpZiAobV9wUGFyYW0gJiYgKG1fUGFyYW1UeXBlID09IERpcmVjdERpY3QgfHwgbV9QYXJhbVR5cGUgPT0gUHJvcGVydGllc0RpY3QpKSB7Ci0gICAgICAgIHJldHVybiAoKENQREZfRGljdGlvbmFyeSAqKW1fcFBhcmFtKS0+S2V5RXhpc3QoRlhfQlNUUkMoIk1DSUQiKSk7Ci0gICAgfQorRlhfQk9PTCBDUERGX0NvbnRlbnRNYXJrOjpIYXNNYXJrKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbWFyaykgY29uc3QgeworICBpZiAoIW1fcE9iamVjdCkgewogICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IG1fcE9iamVjdC0+Q291bnRJdGVtcygpOyBpKyspIHsKKyAgICBDUERGX0NvbnRlbnRNYXJrSXRlbSYgaXRlbSA9IG1fcE9iamVjdC0+R2V0SXRlbShpKTsKKyAgICBpZiAoaXRlbS5HZXROYW1lKCkgPT0gbWFyaykgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIHJldHVybiBGQUxTRTsKIH0KLUNQREZfQ29udGVudE1hcmtEYXRhOjpDUERGX0NvbnRlbnRNYXJrRGF0YShjb25zdCBDUERGX0NvbnRlbnRNYXJrRGF0YSYgc3JjKQotewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjLm1fTWFya3MuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIG1fTWFya3MuQWRkKHNyYy5tX01hcmtzW2ldKTsKLSAgICB9Ci19Ci1pbnQgQ1BERl9Db250ZW50TWFya0RhdGE6OkdldE1DSUQoKSBjb25zdAotewotICAgIENQREZfQ29udGVudE1hcmtJdGVtOjpQYXJhbVR5cGUgdHlwZSA9IENQREZfQ29udGVudE1hcmtJdGVtOjpOb25lOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9NYXJrcy5HZXRTaXplKCk7IGkgKyspIHsKLSAgICAgICAgdHlwZSA9IG1fTWFya3NbaV0uR2V0UGFyYW1UeXBlKCk7Ci0gICAgICAgIGlmICh0eXBlID09IENQREZfQ29udGVudE1hcmtJdGVtOjpQcm9wZXJ0aWVzRGljdCB8fCB0eXBlID09IENQREZfQ29udGVudE1hcmtJdGVtOjpEaXJlY3REaWN0KSB7Ci0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkgKnBEaWN0ID0gKENQREZfRGljdGlvbmFyeSAqKW1fTWFya3NbaV0uR2V0UGFyYW0oKTsKLSAgICAgICAgICAgIGlmIChwRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIk1DSUQiKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIk1DSUQiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotdm9pZCBDUERGX0NvbnRlbnRNYXJrRGF0YTo6QWRkTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgRlhfQk9PTCBiRGlyZWN0KQotewotICAgIENQREZfQ29udGVudE1hcmtJdGVtJiBpdGVtID0gbV9NYXJrcy5BZGQoKTsKLSAgICBpdGVtLlNldE5hbWUobmFtZSk7Ci0gICAgaWYgKHBEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpdGVtLlNldFBhcmFtKGJEaXJlY3QgPyBDUERGX0NvbnRlbnRNYXJrSXRlbTo6RGlyZWN0RGljdCA6IENQREZfQ29udGVudE1hcmtJdGVtOjpQcm9wZXJ0aWVzRGljdCwKLSAgICAgICAgICAgICAgICAgIGJEaXJlY3QgPyBwRGljdC0+Q2xvbmUoKSA6IHBEaWN0KTsKLX0KLXZvaWQgQ1BERl9Db250ZW50TWFya0RhdGE6OkRlbGV0ZUxhc3RNYXJrKCkKLXsKLSAgICBpbnQgc2l6ZSA9IG1fTWFya3MuR2V0U2l6ZSgpOwotICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX01hcmtzLlJlbW92ZUF0KHNpemUgLSAxKTsKLX0KLUZYX0JPT0wgQ1BERl9Db250ZW50TWFyazo6SGFzTWFyayhGWF9CU1RSIG1hcmspIGNvbnN0Ci17Ci0gICAgaWYgKG1fcE9iamVjdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3BPYmplY3QtPkNvdW50SXRlbXMoKTsgaSArKykgewotICAgICAgICBDUERGX0NvbnRlbnRNYXJrSXRlbSYgaXRlbSA9IG1fcE9iamVjdC0+R2V0SXRlbShpKTsKLSAgICAgICAgaWYgKGl0ZW0uR2V0TmFtZSgpID09IG1hcmspIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQorRlhfQk9PTCBDUERGX0NvbnRlbnRNYXJrOjpMb29rdXBNYXJrKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqJiBwRGljdCkgY29uc3QgeworICBpZiAoIW1fcE9iamVjdCkgewogICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wgQ1BERl9Db250ZW50TWFyazo6TG9va3VwTWFyayhGWF9CU1RSIG1hcmssIENQREZfRGljdGlvbmFyeSomIHBEaWN0KSBjb25zdAotewotICAgIGlmIChtX3BPYmplY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3BPYmplY3QtPkNvdW50SXRlbXMoKTsgaSsrKSB7CisgICAgQ1BERl9Db250ZW50TWFya0l0ZW0mIGl0ZW0gPSBtX3BPYmplY3QtPkdldEl0ZW0oaSk7CisgICAgaWYgKGl0ZW0uR2V0TmFtZSgpID09IG1hcmspIHsKKyAgICAgIHBEaWN0ID0gTlVMTDsKKyAgICAgIGlmIChpdGVtLkdldFBhcmFtVHlwZSgpID09IENQREZfQ29udGVudE1hcmtJdGVtOjpQcm9wZXJ0aWVzRGljdCB8fAorICAgICAgICAgIGl0ZW0uR2V0UGFyYW1UeXBlKCkgPT0gQ1BERl9Db250ZW50TWFya0l0ZW06OkRpcmVjdERpY3QpIHsKKyAgICAgICAgcERpY3QgPSBUb0RpY3Rpb25hcnkoc3RhdGljX2Nhc3Q8Q1BERl9PYmplY3QqPihpdGVtLkdldFBhcmFtKCkpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fcE9iamVjdC0+Q291bnRJdGVtcygpOyBpICsrKSB7Ci0gICAgICAgIENQREZfQ29udGVudE1hcmtJdGVtJiBpdGVtID0gbV9wT2JqZWN0LT5HZXRJdGVtKGkpOwotICAgICAgICBpZiAoaXRlbS5HZXROYW1lKCkgPT0gbWFyaykgewotICAgICAgICAgICAgcERpY3QgPSBOVUxMOwotICAgICAgICAgICAgaWYgKGl0ZW0uR2V0UGFyYW1UeXBlKCkgPT0gQ1BERl9Db250ZW50TWFya0l0ZW06OlByb3BlcnRpZXNEaWN0IHx8Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW0uR2V0UGFyYW1UeXBlKCkgPT0gQ1BERl9Db250ZW50TWFya0l0ZW06OkRpcmVjdERpY3QpIHsKLSAgICAgICAgICAgICAgICBwRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKWl0ZW0uR2V0UGFyYW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfaW1hZ2UuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2ltYWdlLmNwcAppbmRleCAyYjExYWVmLi5lZGNiM2NhIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfaW1hZ2UuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9pbWFnZS5jcHAKQEAgLTEsMTA1ICsxLDk3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZW9iai5oIgogI2luY2x1ZGUgInBhZ2VpbnQuaCIKLUNQREZfSW1hZ2VPYmplY3Q6OkNQREZfSW1hZ2VPYmplY3QoKQotewotICAgIG1fcEltYWdlID0gTlVMTDsKLSAgICBtX1R5cGUgPSBQREZQQUdFX0lNQUdFOworCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlb2JqLmgiCisKK0NQREZfSW1hZ2VPYmplY3Q6OkNQREZfSW1hZ2VPYmplY3QoKSB7CisgIG1fcEltYWdlID0gTlVMTDsKKyAgbV9UeXBlID0gUERGUEFHRV9JTUFHRTsKIH0KLUNQREZfSW1hZ2VPYmplY3Q6On5DUERGX0ltYWdlT2JqZWN0KCkKLXsKLSAgICBpZiAoIW1fcEltYWdlKSB7Ci0gICAgICAgIHJldHVybjsKK0NQREZfSW1hZ2VPYmplY3Q6On5DUERGX0ltYWdlT2JqZWN0KCkgeworICBpZiAoIW1fcEltYWdlKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX3BJbWFnZS0+SXNJbmxpbmUoKSB8fAorICAgICAgKG1fcEltYWdlLT5HZXRTdHJlYW0oKSAmJiBtX3BJbWFnZS0+R2V0U3RyZWFtKCktPkdldE9iak51bSgpID09IDApKSB7CisgICAgZGVsZXRlIG1fcEltYWdlOworICB9IGVsc2UgeworICAgIG1fcEltYWdlLT5HZXREb2N1bWVudCgpLT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlSW1hZ2UobV9wSW1hZ2UtPkdldFN0cmVhbSgpKTsKKyAgfQorfQordm9pZCBDUERGX0ltYWdlT2JqZWN0OjpDb3B5RGF0YShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTcmMpIHsKKyAgY29uc3QgQ1BERl9JbWFnZU9iamVjdCogcFNyY09iaiA9IChjb25zdCBDUERGX0ltYWdlT2JqZWN0KilwU3JjOworICBpZiAobV9wSW1hZ2UpIHsKKyAgICBtX3BJbWFnZS0+UmVsZWFzZSgpOworICB9CisgIG1fcEltYWdlID0gcFNyY09iai0+bV9wSW1hZ2UtPkNsb25lKCk7CisgIG1fTWF0cml4ID0gcFNyY09iai0+bV9NYXRyaXg7Cit9Cit2b2lkIENQREZfSW1hZ2VPYmplY3Q6OlRyYW5zZm9ybShjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsKKyAgbV9NYXRyaXguQ29uY2F0KG1hdHJpeCk7CisgIENhbGNCb3VuZGluZ0JveCgpOworfQordm9pZCBDUERGX0ltYWdlT2JqZWN0OjpDYWxjQm91bmRpbmdCb3goKSB7CisgIG1fTGVmdCA9IG1fQm90dG9tID0gMDsKKyAgbV9SaWdodCA9IG1fVG9wID0gMS4wZjsKKyAgbV9NYXRyaXguVHJhbnNmb3JtUmVjdChtX0xlZnQsIG1fUmlnaHQsIG1fVG9wLCBtX0JvdHRvbSk7Cit9Cit2b2lkIENQREZfSW1hZ2U6OlJlbGVhc2UoKSB7CisgIGlmIChtX2JJbmxpbmUgfHwgKG1fcFN0cmVhbSAmJiBtX3BTdHJlYW0tPkdldE9iak51bSgpID09IDApKSB7CisgICAgZGVsZXRlIHRoaXM7CisgIH0KK30KK0NQREZfSW1hZ2UqIENQREZfSW1hZ2U6OkNsb25lKCkgeworICBpZiAobV9wU3RyZWFtLT5HZXRPYmpOdW0oKSkKKyAgICByZXR1cm4gbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPkdldEltYWdlKG1fcFN0cmVhbSk7CisKKyAgQ1BERl9JbWFnZSogcEltYWdlID0gbmV3IENQREZfSW1hZ2UobV9wRG9jdW1lbnQpOworICBwSW1hZ2UtPkxvYWRJbWFnZUYoVG9TdHJlYW0obV9wU3RyZWFtLT5DUERGX09iamVjdDo6Q2xvbmUoKSksIG1fYklubGluZSk7CisgIGlmIChtX2JJbmxpbmUpCisgICAgcEltYWdlLT5TZXRJbmxpbmVEaWN0KFRvRGljdGlvbmFyeShtX3BJbmxpbmVEaWN0LT5DbG9uZShUUlVFKSkpOworCisgIHJldHVybiBwSW1hZ2U7Cit9CitDUERGX0ltYWdlOjpDUERGX0ltYWdlKENQREZfRG9jdW1lbnQqIHBEb2MpIHsKKyAgbV9wRG9jdW1lbnQgPSBwRG9jOworICBtX3BTdHJlYW0gPSBOVUxMOworICBtX3BPQyA9IE5VTEw7CisgIG1fYklubGluZSA9IEZBTFNFOworICBtX3BJbmxpbmVEaWN0ID0gTlVMTDsKKyAgbV9wRElCU291cmNlID0gTlVMTDsKKyAgbV9wTWFzayA9IE5VTEw7CisgIG1fTWF0dGVDb2xvciA9IDA7Cit9CitDUERGX0ltYWdlOjp+Q1BERl9JbWFnZSgpIHsKKyAgaWYgKG1fYklubGluZSkgeworICAgIGlmIChtX3BTdHJlYW0pIHsKKyAgICAgIG1fcFN0cmVhbS0+UmVsZWFzZSgpOwogICAgIH0KLSAgICBpZiAobV9wSW1hZ2UtPklzSW5saW5lKCkgfHwgKG1fcEltYWdlLT5HZXRTdHJlYW0oKSAmJiBtX3BJbWFnZS0+R2V0U3RyZWFtKCktPkdldE9iak51bSgpID09IDApKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BJbWFnZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX3BJbWFnZS0+R2V0RG9jdW1lbnQoKS0+R2V0UGFnZURhdGEoKS0+UmVsZWFzZUltYWdlKG1fcEltYWdlLT5HZXRTdHJlYW0oKSk7CisgICAgaWYgKG1fcElubGluZURpY3QpIHsKKyAgICAgIG1fcElubGluZURpY3QtPlJlbGVhc2UoKTsKICAgICB9CisgIH0KIH0KLXZvaWQgQ1BERl9JbWFnZU9iamVjdDo6Q29weURhdGEoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwU3JjKQotewotICAgIGNvbnN0IENQREZfSW1hZ2VPYmplY3QqIHBTcmNPYmogPSAoY29uc3QgQ1BERl9JbWFnZU9iamVjdCopcFNyYzsKLSAgICBpZiAobV9wSW1hZ2UpIHsKLSAgICAgICAgbV9wSW1hZ2UtPlJlbGVhc2UoKTsKLSAgICB9Ci0gICAgbV9wSW1hZ2UgPSBwU3JjT2JqLT5tX3BJbWFnZS0+Q2xvbmUoKTsKLSAgICBtX01hdHJpeCA9IHBTcmNPYmotPm1fTWF0cml4OwotfQotdm9pZCBDUERGX0ltYWdlT2JqZWN0OjpUcmFuc2Zvcm0oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KQotewotICAgIG1fTWF0cml4LkNvbmNhdChtYXRyaXgpOwotICAgIENhbGNCb3VuZGluZ0JveCgpOwotfQotdm9pZCBDUERGX0ltYWdlT2JqZWN0OjpDYWxjQm91bmRpbmdCb3goKQotewotICAgIG1fTGVmdCA9IG1fQm90dG9tID0gMDsKLSAgICBtX1JpZ2h0ID0gbV9Ub3AgPSAxLjBmOwotICAgIG1fTWF0cml4LlRyYW5zZm9ybVJlY3QobV9MZWZ0LCBtX1JpZ2h0LCBtX1RvcCwgbV9Cb3R0b20pOwotfQotdm9pZCBDUERGX0ltYWdlOjpSZWxlYXNlKCkKLXsKLSAgICBpZiAobV9iSW5saW5lIHx8IChtX3BTdHJlYW0gJiYgbV9wU3RyZWFtLT5HZXRPYmpOdW0oKSA9PSAwKSkgewotICAgICAgICBkZWxldGUgdGhpczsKLSAgICB9Ci19Ci1DUERGX0ltYWdlKiBDUERGX0ltYWdlOjpDbG9uZSgpCi17Ci0gICAgaWYgKG1fcFN0cmVhbS0+R2V0T2JqTnVtKCkpIHsKLSAgICAgICAgcmV0dXJuIG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5HZXRJbWFnZShtX3BTdHJlYW0pOwotICAgIH0KLSAgICBDUERGX0ltYWdlKiBwSW1hZ2UgPSBuZXcgQ1BERl9JbWFnZShtX3BEb2N1bWVudCk7Ci0gICAgcEltYWdlLT5Mb2FkSW1hZ2VGKChDUERGX1N0cmVhbSopKChDUERGX09iamVjdCopbV9wU3RyZWFtKS0+Q2xvbmUoKSwgbV9iSW5saW5lKTsKLSAgICBpZiAobV9iSW5saW5lKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSAqcElubGluZURpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KiltX3BJbmxpbmVEaWN0LT5DbG9uZShUUlVFKTsKLSAgICAgICAgcEltYWdlLT5TZXRJbmxpbmVEaWN0KHBJbmxpbmVEaWN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHBJbWFnZTsKLX0KLUNQREZfSW1hZ2U6OkNQREZfSW1hZ2UoQ1BERl9Eb2N1bWVudCogcERvYykKLXsKLSAgICBtX3BEb2N1bWVudCA9IHBEb2M7Ci0gICAgbV9wU3RyZWFtID0gTlVMTDsKLSAgICBtX3BPQyA9IE5VTEw7Ci0gICAgbV9iSW5saW5lID0gRkFMU0U7CitGWF9CT09MIENQREZfSW1hZ2U6OkxvYWRJbWFnZUYoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIEZYX0JPT0wgYklubGluZSkgeworICBtX3BTdHJlYW0gPSBwU3RyZWFtOworICBpZiAobV9iSW5saW5lICYmIG1fcElubGluZURpY3QpIHsKKyAgICBtX3BJbmxpbmVEaWN0LT5SZWxlYXNlKCk7CiAgICAgbV9wSW5saW5lRGljdCA9IE5VTEw7Ci0gICAgbV9wRElCU291cmNlID0gTlVMTDsKLSAgICBtX3BNYXNrID0gTlVMTDsKLSAgICBtX01hdHRlQ29sb3IgPSAwOwotfQotQ1BERl9JbWFnZTo6fkNQREZfSW1hZ2UoKQotewotICAgIGlmIChtX2JJbmxpbmUpIHsKLSAgICAgICAgaWYgKG1fcFN0cmVhbSkgewotICAgICAgICAgICAgbV9wU3RyZWFtLT5SZWxlYXNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fcElubGluZURpY3QpIHsKLSAgICAgICAgICAgIG1fcElubGluZURpY3QtPlJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLUZYX0JPT0wgQ1BERl9JbWFnZTo6TG9hZEltYWdlRihDUERGX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiSW5saW5lKQotewotICAgIG1fcFN0cmVhbSA9IHBTdHJlYW07Ci0gICAgaWYgKG1fYklubGluZSAmJiBtX3BJbmxpbmVEaWN0KSB7Ci0gICAgICAgIG1fcElubGluZURpY3QtPlJlbGVhc2UoKTsKLSAgICAgICAgbV9wSW5saW5lRGljdCA9IE5VTEw7Ci0gICAgfQotICAgIG1fYklubGluZSA9IGJJbmxpbmU7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBTdHJlYW0tPkdldERpY3QoKTsKLSAgICBpZiAobV9iSW5saW5lKSB7Ci0gICAgICAgIG1fcElubGluZURpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwRGljdC0+Q2xvbmUoKTsKLSAgICB9Ci0gICAgbV9wT0MgPSBwRGljdC0+R2V0RGljdChGWF9CU1RSQygiT0MiKSk7Ci0gICAgbV9iSXNNYXNrID0gIXBEaWN0LT5LZXlFeGlzdChGWF9CU1RSQygiQ29sb3JTcGFjZSIpKSB8fCBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiSW1hZ2VNYXNrIikpOwotICAgIG1fYkludGVycG9sYXRlID0gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkludGVycG9sYXRlIikpOwotICAgIG1fSGVpZ2h0ID0gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkhlaWdodCIpKTsKLSAgICBtX1dpZHRoID0gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIldpZHRoIikpOwotICAgIHJldHVybiBUUlVFOworICB9CisgIG1fYklubGluZSA9IGJJbmxpbmU7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7CisgIGlmIChtX2JJbmxpbmUpIHsKKyAgICBtX3BJbmxpbmVEaWN0ID0gVG9EaWN0aW9uYXJ5KHBEaWN0LT5DbG9uZSgpKTsKKyAgfQorICBtX3BPQyA9IHBEaWN0LT5HZXREaWN0KCJPQyIpOworICBtX2JJc01hc2sgPSAhcERpY3QtPktleUV4aXN0KCJDb2xvclNwYWNlIikgfHwgcERpY3QtPkdldEludGVnZXIoIkltYWdlTWFzayIpOworICBtX2JJbnRlcnBvbGF0ZSA9IHBEaWN0LT5HZXRJbnRlZ2VyKCJJbnRlcnBvbGF0ZSIpOworICBtX0hlaWdodCA9IHBEaWN0LT5HZXRJbnRlZ2VyKCJIZWlnaHQiKTsKKyAgbV9XaWR0aCA9IHBEaWN0LT5HZXRJbnRlZ2VyKCJXaWR0aCIpOworICByZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXJzZXIuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhcnNlci5jcHAKaW5kZXggYjNlM2NkNi4uNGFjOWRlOSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhcnNlci5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhcnNlci5jcHAKQEAgLTEsMTU4NyArMSwxNDg4IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfc2VyaWFsLmgiCi0jaW5jbHVkZSAicGFnZWludC5oIgotI2RlZmluZSBSRVFVSVJFX1BBUkFNUyhjb3VudCkgaWYgKG1fUGFyYW1Db3VudCAhPSBjb3VudCkgeyBtX2JBYm9ydCA9IFRSVUU7IHJldHVybjsgfQotQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXIoKQotewotICAgIG1fRGVmRm9udFNpemUgPSAwOwotICAgIG1fcEN1clN0YXRlcyA9IE5VTEw7Ci0gICAgbV9wTGFzdFRleHRPYmplY3QgPSBOVUxMOwotICAgIG1fcFBhdGhQb2ludHMgPSBOVUxMOwotICAgIG1fUGF0aENsaXBUeXBlID0gMDsKLSAgICBtX1BhdGhQb2ludENvdW50ID0gbV9QYXRoQWxsb2NTaXplID0gMDsKLSAgICBtX1BhdGhDdXJyZW50WCA9IG1fUGF0aEN1cnJlbnRZID0gMC4wZjsKLSAgICBtX2JSZXNvdXJjZU1pc3NpbmcgPSBGQUxTRTsKLSAgICBtX2JDb2xvcmVkID0gRkFMU0U7Ci0gICAgRlhTWVNfbWVtc2V0MzIobV9UeXBlM0RhdGEsIDAsIHNpemVvZihGWF9GTE9BVCkgKiA2KTsKLSAgICBtX1BhcmFtQ291bnQgPSAwOwotICAgIG1fUGFyYW1TdGFydFBvcyA9IDA7Ci0gICAgbV9iQWJvcnQgPSBGQUxTRTsKLSAgICBtX3BMYXN0SW1hZ2VEaWN0ID0gTlVMTDsKLSAgICBtX3BMYXN0Q2xvbmVJbWFnZURpY3QgPSBOVUxMOwotICAgIG1fcExhc3RJbWFnZSA9IE5VTEw7Ci0gICAgbV9iUmVsZWFzZUxhc3REaWN0ID0gVFJVRTsKLSAgICBtX3BQYXJlbnRSZXNvdXJjZXMgPSBOVUxMOwotfQotRlhfQk9PTCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkluaXRpYWxpemUoKQotewotICAgIHJldHVybiBUUlVFOwotfQotQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjp+Q1BERl9TdHJlYW1Db250ZW50UGFyc2VyKCkKLXsKLSAgICBDbGVhckFsbFBhcmFtcygpOwotICAgIGludCBpID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbV9TdGF0ZVN0YWNrLkdldFNpemUoKTsgaSArKykgewotICAgICAgICBkZWxldGUgKENQREZfQWxsU3RhdGVzKiltX1N0YXRlU3RhY2tbaV07Ci0gICAgfQotICAgIGlmIChtX3BQYXRoUG9pbnRzKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wUGF0aFBvaW50cyk7Ci0gICAgfQotICAgIGlmIChtX3BDdXJTdGF0ZXMpIHsKLSAgICAgICAgZGVsZXRlIG1fcEN1clN0YXRlczsKLSAgICB9Ci0gICAgaWYgKG1fcExhc3RJbWFnZURpY3QpIHsKLSAgICAgICAgbV9wTGFzdEltYWdlRGljdC0+UmVsZWFzZSgpOwotICAgIH0KLSAgICBpZiAobV9wTGFzdENsb25lSW1hZ2VEaWN0KSB7Ci0gICAgICAgIG1fcExhc3RDbG9uZUltYWdlRGljdC0+UmVsZWFzZSgpOwotICAgIH0KLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpQcmVwYXJlUGFyc2UoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLCBDUERGX0RpY3Rpb25hcnkqIHBQYXJlbnRSZXNvdXJjZXMsIENGWF9BZmZpbmVNYXRyaXgqIHBtdENvbnRlbnRUb1VzZXIsIENQREZfUGFnZU9iamVjdHMqIHBPYmpMaXN0LAotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZXMsIENQREZfUmVjdCogcEJCb3gsIENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucywKLSAgICAgICAgQ1BERl9BbGxTdGF0ZXMqIHBTdGF0ZXMsIGludCBsZXZlbCkKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkgKyspIHsKLSAgICAgICAgbV9UeXBlM0RhdGFbaV0gPSAwOwotICAgIH0KLSAgICBtX3BEb2N1bWVudCA9IHBEb2N1bWVudDsKLSAgICBtX3BQYWdlUmVzb3VyY2VzID0gcFBhZ2VSZXNvdXJjZXM7Ci0gICAgbV9wUGFyZW50UmVzb3VyY2VzID0gcFBhcmVudFJlc291cmNlczsKLSAgICBpZiAocG10Q29udGVudFRvVXNlcikgewotICAgICAgICBtX210Q29udGVudFRvVXNlciA9ICpwbXRDb250ZW50VG9Vc2VyOwotICAgIH0KLSAgICBpZiAocE9wdGlvbnMpIHsKLSAgICAgICAgbV9PcHRpb25zID0gKnBPcHRpb25zOwotICAgIH0KLSAgICBtX3BPYmplY3RMaXN0ID0gcE9iakxpc3Q7Ci0gICAgbV9wUmVzb3VyY2VzID0gcFJlc291cmNlczsKLSAgICBpZiAocFJlc291cmNlcyA9PSBOVUxMKSB7Ci0gICAgICAgIG1fcFJlc291cmNlcyA9IG1fcFBhcmVudFJlc291cmNlczsKLSAgICB9Ci0gICAgaWYgKG1fcFJlc291cmNlcyA9PSBOVUxMKSB7Ci0gICAgICAgIG1fcFJlc291cmNlcyA9IHBQYWdlUmVzb3VyY2VzOwotICAgIH0KLSAgICBpZiAocEJCb3gpIHsKLSAgICAgICAgbV9CQm94ID0gKnBCQm94OwotICAgIH0KLSAgICBtX0xldmVsID0gbGV2ZWw7Ci0gICAgbV9wQ3VyU3RhdGVzID0gbmV3IENQREZfQWxsU3RhdGVzOwotICAgIGlmIChwU3RhdGVzKSB7Ci0gICAgICAgIG1fcEN1clN0YXRlcy0+Q29weSgqcFN0YXRlcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wQ3VyU3RhdGVzLT5tX0dlbmVyYWxTdGF0ZS5OZXcoKTsKLSAgICAgICAgbV9wQ3VyU3RhdGVzLT5tX0dyYXBoU3RhdGUuTmV3KCk7Ci0gICAgICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0U3RhdGUuTmV3KCk7Ci0gICAgICAgIG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlLk5ldygpOwotICAgIH0KLX0KLWludCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkdldE5leHRQYXJhbVBvcygpCi17Ci0gICAgaWYgKG1fUGFyYW1Db3VudCA9PSBQQVJBTV9CVUZfU0laRSkgewotICAgICAgICBtX1BhcmFtU3RhcnRQb3MgKys7Ci0gICAgICAgIGlmIChtX1BhcmFtU3RhcnRQb3MgPT0gUEFSQU1fQlVGX1NJWkUpIHsKLSAgICAgICAgICAgIG1fUGFyYW1TdGFydFBvcyA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fUGFyYW1CdWYxW21fUGFyYW1TdGFydFBvc10ubV9UeXBlID09IDApIHsKLSAgICAgICAgICAgIGlmIChDUERGX09iamVjdCogcE9iamVjdCA9IG1fUGFyYW1CdWYxW21fUGFyYW1TdGFydFBvc10ubV9wT2JqZWN0KQotICAgICAgICAgICAgICAgIHBPYmplY3QtPlJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbV9QYXJhbVN0YXJ0UG9zOwotICAgIH0KLSAgICBpbnQgaW5kZXggPSBtX1BhcmFtU3RhcnRQb3MgKyBtX1BhcmFtQ291bnQ7Ci0gICAgaWYgKGluZGV4ID49IFBBUkFNX0JVRl9TSVpFKSB7Ci0gICAgICAgIGluZGV4IC09IFBBUkFNX0JVRl9TSVpFOwotICAgIH0KLSAgICBtX1BhcmFtQ291bnQgKys7Ci0gICAgcmV0dXJuIGluZGV4OwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkFkZE5hbWVQYXJhbShGWF9MUENTVFIgbmFtZSwgaW50IGxlbikKLXsKLSAgICBpbnQgaW5kZXggPSBHZXROZXh0UGFyYW1Qb3MoKTsKLSAgICBpZiAobGVuID4gMzIpIHsKLSAgICAgICAgbV9QYXJhbUJ1ZjFbaW5kZXhdLm1fVHlwZSA9IDA7Ci0gICAgICAgIG1fUGFyYW1CdWYxW2luZGV4XS5tX3BPYmplY3QgPSBDUERGX05hbWU6OkNyZWF0ZShQREZfTmFtZURlY29kZShDRlhfQnl0ZVN0cmluZ0MobmFtZSwgbGVuKSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fUGFyYW1CdWYxW2luZGV4XS5tX1R5cGUgPSBQREZPQkpfTkFNRTsKLSAgICAgICAgaWYgKEZYU1lTX21lbWNocihuYW1lLCAnIycsIGxlbikgPT0gTlVMTCkgewotICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIobV9QYXJhbUJ1ZjFbaW5kZXhdLm1fTmFtZS5tX0J1ZmZlciwgbmFtZSwgbGVuKTsKLSAgICAgICAgICAgIG1fUGFyYW1CdWYxW2luZGV4XS5tX05hbWUubV9MZW4gPSBsZW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBQREZfTmFtZURlY29kZShDRlhfQnl0ZVN0cmluZ0MobmFtZSwgbGVuKSk7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkzMihtX1BhcmFtQnVmMVtpbmRleF0ubV9OYW1lLm1fQnVmZmVyLCBzdHIuY19zdHIoKSwgc3RyLkdldExlbmd0aCgpKTsKLSAgICAgICAgICAgIG1fUGFyYW1CdWYxW2luZGV4XS5tX05hbWUubV9MZW4gPSBzdHIuR2V0TGVuZ3RoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6QWRkTnVtYmVyUGFyYW0oRlhfTFBDU1RSIHN0ciwgaW50IGxlbikKLXsKLSAgICBpbnQgaW5kZXggPSBHZXROZXh0UGFyYW1Qb3MoKTsKLSAgICBtX1BhcmFtQnVmMVtpbmRleF0ubV9UeXBlID0gUERGT0JKX05VTUJFUjsKLSAgICBGWF9hdG9udW0oQ0ZYX0J5dGVTdHJpbmdDKHN0ciwgbGVuKSwgbV9QYXJhbUJ1ZjFbaW5kZXhdLm1fTnVtYmVyLm1fYkludGVnZXIsCi0gICAgICAgICAgICAgICZtX1BhcmFtQnVmMVtpbmRleF0ubV9OdW1iZXIubV9JbnRlZ2VyKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGRPYmplY3RQYXJhbShDUERGX09iamVjdCogcE9iaikKLXsKLSAgICBpbnQgaW5kZXggPSBHZXROZXh0UGFyYW1Qb3MoKTsKLSAgICBtX1BhcmFtQnVmMVtpbmRleF0ubV9UeXBlID0gMDsKLSAgICBtX1BhcmFtQnVmMVtpbmRleF0ubV9wT2JqZWN0ID0gcE9iajsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpDbGVhckFsbFBhcmFtcygpCi17Ci0gICAgRlhfRFdPUkQgaW5kZXggPSBtX1BhcmFtU3RhcnRQb3M7Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG1fUGFyYW1Db3VudDsgaSArKykgewotICAgICAgICBpZiAobV9QYXJhbUJ1ZjFbaW5kZXhdLm1fVHlwZSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoQ1BERl9PYmplY3QqIHBPYmplY3QgPSBtX1BhcmFtQnVmMVtpbmRleF0ubV9wT2JqZWN0KQotICAgICAgICAgICAgICAgIHBPYmplY3QtPlJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgICAgICBpbmRleCArKzsKLSAgICAgICAgaWYgKGluZGV4ID09IFBBUkFNX0JVRl9TSVpFKSB7Ci0gICAgICAgICAgICBpbmRleCA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9QYXJhbVN0YXJ0UG9zID0gMDsKLSAgICBtX1BhcmFtQ291bnQgPSAwOwotfQotQ1BERl9PYmplY3QqIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6R2V0T2JqZWN0KEZYX0RXT1JEIGluZGV4KQotewotICAgIGlmIChpbmRleCA+PSBtX1BhcmFtQ291bnQpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGludCByZWFsX2luZGV4ID0gbV9QYXJhbVN0YXJ0UG9zICsgbV9QYXJhbUNvdW50IC0gaW5kZXggLSAxOwotICAgIGlmIChyZWFsX2luZGV4ID49IFBBUkFNX0JVRl9TSVpFKSB7Ci0gICAgICAgIHJlYWxfaW5kZXggLT0gUEFSQU1fQlVGX1NJWkU7Ci0gICAgfQotICAgIF9Db250ZW50UGFyYW0mIHBhcmFtID0gbV9QYXJhbUJ1ZjFbcmVhbF9pbmRleF07Ci0gICAgaWYgKHBhcmFtLm1fVHlwZSA9PSBQREZPQkpfTlVNQkVSKSB7Ci0gICAgICAgIENQREZfTnVtYmVyKiBwTnVtYmVyID0gQ1BERl9OdW1iZXI6OkNyZWF0ZShwYXJhbS5tX051bWJlci5tX2JJbnRlZ2VyLCAmcGFyYW0ubV9OdW1iZXIubV9JbnRlZ2VyKTsKLSAgICAgICAgcGFyYW0ubV9UeXBlID0gMDsKLSAgICAgICAgcGFyYW0ubV9wT2JqZWN0ID0gcE51bWJlcjsKLSAgICAgICAgcmV0dXJuIHBOdW1iZXI7Ci0gICAgfQotICAgIGlmIChwYXJhbS5tX1R5cGUgPT0gUERGT0JKX05BTUUpIHsKLSAgICAgICAgQ1BERl9OYW1lKiBwTmFtZSA9IENQREZfTmFtZTo6Q3JlYXRlKENGWF9CeXRlU3RyaW5nKHBhcmFtLm1fTmFtZS5tX0J1ZmZlciwgcGFyYW0ubV9OYW1lLm1fTGVuKSk7Ci0gICAgICAgIHBhcmFtLm1fVHlwZSA9IDA7Ci0gICAgICAgIHBhcmFtLm1fcE9iamVjdCA9IHBOYW1lOwotICAgICAgICByZXR1cm4gcE5hbWU7Ci0gICAgfQotICAgIGlmIChwYXJhbS5tX1R5cGUgPT0gMCkgewotICAgICAgICByZXR1cm4gcGFyYW0ubV9wT2JqZWN0OwotICAgIH0KLSAgICBBU1NFUlQoRkFMU0UpOwotICAgIHJldHVybiBOVUxMOwotfQotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpHZXRTdHJpbmcoRlhfRFdPUkQgaW5kZXgpCi17Ci0gICAgaWYgKGluZGV4ID49IG1fUGFyYW1Db3VudCkgewotICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKLSAgICB9Ci0gICAgaW50IHJlYWxfaW5kZXggPSBtX1BhcmFtU3RhcnRQb3MgKyBtX1BhcmFtQ291bnQgLSBpbmRleCAtIDE7Ci0gICAgaWYgKHJlYWxfaW5kZXggPj0gUEFSQU1fQlVGX1NJWkUpIHsKLSAgICAgICAgcmVhbF9pbmRleCAtPSBQQVJBTV9CVUZfU0laRTsKLSAgICB9Ci0gICAgX0NvbnRlbnRQYXJhbSYgcGFyYW0gPSBtX1BhcmFtQnVmMVtyZWFsX2luZGV4XTsKLSAgICBpZiAocGFyYW0ubV9UeXBlID09IFBERk9CSl9OQU1FKSB7Ci0gICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhwYXJhbS5tX05hbWUubV9CdWZmZXIsIHBhcmFtLm1fTmFtZS5tX0xlbik7Ci0gICAgfQotICAgIGlmIChwYXJhbS5tX1R5cGUgPT0gMCAmJiBwYXJhbS5tX3BPYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtLm1fcE9iamVjdC0+R2V0U3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwotfQotRlhfRkxPQVQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpHZXROdW1iZXIoRlhfRFdPUkQgaW5kZXgpCi17Ci0gICAgaWYgKGluZGV4ID49IG1fUGFyYW1Db3VudCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW50IHJlYWxfaW5kZXggPSBtX1BhcmFtU3RhcnRQb3MgKyBtX1BhcmFtQ291bnQgLSBpbmRleCAtIDE7Ci0gICAgaWYgKHJlYWxfaW5kZXggPj0gUEFSQU1fQlVGX1NJWkUpIHsKLSAgICAgICAgcmVhbF9pbmRleCAtPSBQQVJBTV9CVUZfU0laRTsKLSAgICB9Ci0gICAgX0NvbnRlbnRQYXJhbSYgcGFyYW0gPSBtX1BhcmFtQnVmMVtyZWFsX2luZGV4XTsKLSAgICBpZiAocGFyYW0ubV9UeXBlID09IFBERk9CSl9OVU1CRVIpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtLm1fTnVtYmVyLm1fYkludGVnZXIgPyAoRlhfRkxPQVQpcGFyYW0ubV9OdW1iZXIubV9JbnRlZ2VyIDogcGFyYW0ubV9OdW1iZXIubV9GbG9hdDsKLSAgICB9Ci0gICAgaWYgKHBhcmFtLm1fVHlwZSA9PSAwICYmIHBhcmFtLm1fcE9iamVjdCkgewotICAgICAgICByZXR1cm4gcGFyYW0ubV9wT2JqZWN0LT5HZXROdW1iZXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci1GWF9GTE9BVCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkdldE51bWJlcjE2KEZYX0RXT1JEIGluZGV4KQotewotICAgIHJldHVybiBHZXROdW1iZXIoaW5kZXgpOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OlNldEdyYXBoaWNTdGF0ZXMoQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBGWF9CT09MIGJDb2xvciwgRlhfQk9PTCBiVGV4dCwgRlhfQk9PTCBiR3JhcGgpCi17Ci0gICAgcE9iai0+bV9HZW5lcmFsU3RhdGUgPSBtX3BDdXJTdGF0ZXMtPm1fR2VuZXJhbFN0YXRlOwotICAgIHBPYmotPm1fQ2xpcFBhdGggPSBtX3BDdXJTdGF0ZXMtPm1fQ2xpcFBhdGg7Ci0gICAgcE9iai0+bV9Db250ZW50TWFyayA9IG1fQ3VyQ29udGVudE1hcms7Ci0gICAgaWYgKGJDb2xvcikgewotICAgICAgICBwT2JqLT5tX0NvbG9yU3RhdGUgPSBtX3BDdXJTdGF0ZXMtPm1fQ29sb3JTdGF0ZTsKLSAgICB9Ci0gICAgaWYgKGJHcmFwaCkgewotICAgICAgICBwT2JqLT5tX0dyYXBoU3RhdGUgPSBtX3BDdXJTdGF0ZXMtPm1fR3JhcGhTdGF0ZTsKLSAgICB9Ci0gICAgaWYgKGJUZXh0KSB7Ci0gICAgICAgIHBPYmotPm1fVGV4dFN0YXRlID0gbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZTsKLSAgICB9Ci19Ci1jb25zdCBzdHJ1Y3QgX09wQ29kZSB7Ci0gICAgRlhfRFdPUkQJbV9PcElkOwotICAgIHZvaWQgKENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6Km1fT3BIYW5kbGVyKSgpOwotfSBnX09wQ29kZXNbXSA9IHsKLSAgICB7RlhCU1RSX0lEKCciJywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTmV4dExpbmVTaG93VGV4dF9TcGFjZX0sCi0gICAge0ZYQlNUUl9JRCgnXCcnLCAwLCAwLCAwKSwJCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9OZXh0TGluZVNob3dUZXh0fSwKLSAgICB7RlhCU1RSX0lEKCdCJywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRmlsbFN0cm9rZVBhdGh9LAotICAgIHtGWEJTVFJfSUQoJ0InLCAnKicsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRU9GaWxsU3Ryb2tlUGF0aH0sCi0gICAge0ZYQlNUUl9JRCgnQicsICdEJywgJ0MnLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0JlZ2luTWFya2VkQ29udGVudF9EaWN0aW9uYXJ5fSwKLSAgICB7RlhCU1RSX0lEKCdCJywgJ0knLCAwLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0JlZ2luSW1hZ2V9LAotICAgIHtGWEJTVFJfSUQoJ0InLCAnTScsICdDJywgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9CZWdpbk1hcmtlZENvbnRlbnR9LAotICAgIHtGWEJTVFJfSUQoJ0InLCAnVCcsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQmVnaW5UZXh0fSwKLSAgICB7RlhCU1RSX0lEKCdCJywgJ1gnLCAwLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0JlZ2luU2VjdGlvblVuZGVmaW5lZH0sCi0gICAge0ZYQlNUUl9JRCgnQycsICdTJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDb2xvclNwYWNlX1N0cm9rZX0sCi0gICAge0ZYQlNUUl9JRCgnRCcsICdQJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9NYXJrUGxhY2VfRGljdGlvbmFyeX0sCi0gICAge0ZYQlNUUl9JRCgnRCcsICdvJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FeGVjdXRlWE9iamVjdH0sCi0gICAge0ZYQlNUUl9JRCgnRScsICdJJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FbmRJbWFnZX0sCi0gICAge0ZYQlNUUl9JRCgnRScsICdNJywgJ0MnLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0VuZE1hcmtlZENvbnRlbnR9LAotICAgIHtGWEJTVFJfSUQoJ0UnLCAnVCcsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRW5kVGV4dH0sCi0gICAge0ZYQlNUUl9JRCgnRScsICdYJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FbmRTZWN0aW9uVW5kZWZpbmVkfSwKLSAgICB7RlhCU1RSX0lEKCdGJywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRmlsbFBhdGhPbGR9LAotICAgIHtGWEJTVFJfSUQoJ0cnLCAwLCAwLCAwKSwJCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRHcmF5X1N0cm9rZX0sCi0gICAge0ZYQlNUUl9JRCgnSScsICdEJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9CZWdpbkltYWdlRGF0YX0sCi0gICAge0ZYQlNUUl9JRCgnSicsIDAsIDAsIDApLAkJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldExpbmVDYXB9LAotICAgIHtGWEJTVFJfSUQoJ0snLCAwLCAwLCAwKSwJCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDTVlLQ29sb3JfU3Ryb2tlfSwKLSAgICB7RlhCU1RSX0lEKCdNJywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0TWl0ZXJMaW1pdH0sCi0gICAge0ZYQlNUUl9JRCgnTScsICdQJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9NYXJrUGxhY2V9LAotICAgIHtGWEJTVFJfSUQoJ1EnLCAwLCAwLCAwKSwJCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9SZXN0b3JlR3JhcGhTdGF0ZX0sCi0gICAge0ZYQlNUUl9JRCgnUicsICdHJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRSR0JDb2xvcl9TdHJva2V9LAotICAgIHtGWEJTVFJfSUQoJ1MnLCAwLCAwLCAwKSwJCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TdHJva2VQYXRofSwKLSAgICB7RlhCU1RSX0lEKCdTJywgJ0MnLCAwLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENvbG9yX1N0cm9rZX0sCi0gICAge0ZYQlNUUl9JRCgnUycsICdDJywgJ04nLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENvbG9yUFNfU3Ryb2tlfSwKLSAgICB7RlhCU1RSX0lEKCdUJywgJyonLCAwLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX01vdmVUb05leHRMaW5lfSwKLSAgICB7RlhCU1RSX0lEKCdUJywgJ0QnLCAwLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX01vdmVUZXh0UG9pbnRfU2V0TGVhZGluZ30sCi0gICAge0ZYQlNUUl9JRCgnVCcsICdKJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TaG93VGV4dF9Qb3NpdGlvbmluZ30sCi0gICAge0ZYQlNUUl9JRCgnVCcsICdMJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRUZXh0TGVhZGluZ30sCi0gICAge0ZYQlNUUl9JRCgnVCcsICdjJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDaGFyU3BhY2V9LAotICAgIHtGWEJTVFJfSUQoJ1QnLCAnZCcsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTW92ZVRleHRQb2ludH0sCi0gICAge0ZYQlNUUl9JRCgnVCcsICdmJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRGb250fSwKLSAgICB7RlhCU1RSX0lEKCdUJywgJ2onLCAwLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1Nob3dUZXh0fSwKLSAgICB7RlhCU1RSX0lEKCdUJywgJ20nLCAwLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldFRleHRNYXRyaXh9LAotICAgIHtGWEJTVFJfSUQoJ1QnLCAncicsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0VGV4dFJlbmRlck1vZGV9LAotICAgIHtGWEJTVFJfSUQoJ1QnLCAncycsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0VGV4dFJpc2V9LAotICAgIHtGWEJTVFJfSUQoJ1QnLCAndycsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0V29yZFNwYWNlfSwKLSAgICB7RlhCU1RSX0lEKCdUJywgJ3onLCAwLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldEhvcnpTY2FsZX0sCi0gICAge0ZYQlNUUl9JRCgnVycsIDAsIDAsIDApLAkJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0NsaXB9LAotICAgIHtGWEJTVFJfSUQoJ1cnLCAnKicsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRU9DbGlwfSwKLSAgICB7RlhCU1RSX0lEKCdiJywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQ2xvc2VGaWxsU3Ryb2tlUGF0aH0sCi0gICAge0ZYQlNUUl9JRCgnYicsICcqJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9DbG9zZUVPRmlsbFN0cm9rZVBhdGh9LAotICAgIHtGWEJTVFJfSUQoJ2MnLCAwLCAwLCAwKSwJCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9DdXJ2ZVRvXzEyM30sCi0gICAge0ZYQlNUUl9JRCgnYycsICdtJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9Db25jYXRNYXRyaXh9LAotICAgIHtGWEJTVFJfSUQoJ2MnLCAncycsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q29sb3JTcGFjZV9GaWxsfSwKLSAgICB7RlhCU1RSX0lEKCdkJywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0RGFzaH0sCi0gICAge0ZYQlNUUl9JRCgnZCcsICcwJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDaGFyV2lkdGh9LAotICAgIHtGWEJTVFJfSUQoJ2QnLCAnMScsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q2FjaGVkRGV2aWNlfSwKLSAgICB7RlhCU1RSX0lEKCdmJywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRmlsbFBhdGh9LAotICAgIHtGWEJTVFJfSUQoJ2YnLCAnKicsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRU9GaWxsUGF0aH0sCi0gICAge0ZYQlNUUl9JRCgnZycsIDAsIDAsIDApLAkJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldEdyYXlfRmlsbH0sCi0gICAge0ZYQlNUUl9JRCgnZycsICdzJywgMCwgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRFeHRlbmRHcmFwaFN0YXRlfSwKLSAgICB7RlhCU1RSX0lEKCdoJywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQ2xvc2VQYXRofSwKLSAgICB7RlhCU1RSX0lEKCdpJywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0RmxhdH0sCi0gICAge0ZYQlNUUl9JRCgnaicsIDAsIDAsIDApLAkJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldExpbmVKb2lufSwKLSAgICB7RlhCU1RSX0lEKCdrJywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q01ZS0NvbG9yX0ZpbGx9LAotICAgIHtGWEJTVFJfSUQoJ2wnLCAwLCAwLCAwKSwJCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9MaW5lVG99LAotICAgIHtGWEJTVFJfSUQoJ20nLCAwLCAwLCAwKSwJCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9Nb3ZlVG99LAotICAgIHtGWEJTVFJfSUQoJ24nLCAwLCAwLCAwKSwJCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FbmRQYXRofSwKLSAgICB7RlhCU1RSX0lEKCdxJywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2F2ZUdyYXBoU3RhdGV9LAotICAgIHtGWEJTVFJfSUQoJ3InLCAnZScsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfUmVjdGFuZ2xlfSwKLSAgICB7RlhCU1RSX0lEKCdyJywgJ2cnLCAwLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldFJHQkNvbG9yX0ZpbGx9LAotICAgIHtGWEJTVFJfSUQoJ3InLCAnaScsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0UmVuZGVySW50ZW50fSwKLSAgICB7RlhCU1RSX0lEKCdzJywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQ2xvc2VTdHJva2VQYXRofSwKLSAgICB7RlhCU1RSX0lEKCdzJywgJ2MnLCAwLCAwKSwJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENvbG9yX0ZpbGx9LAotICAgIHtGWEJTVFJfSUQoJ3MnLCAnYycsICduJywgMCksCSZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDb2xvclBTX0ZpbGx9LAotICAgIHtGWEJTVFJfSUQoJ3MnLCAnaCcsIDAsIDApLAkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2hhZGVGaWxsfSwKLSAgICB7RlhCU1RSX0lEKCd2JywgMCwgMCwgMCksCQkmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQ3VydmVUb18yM30sCi0gICAge0ZYQlNUUl9JRCgndycsIDAsIDAsIDApLAkJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldExpbmVXaWR0aH0sCi0gICAge0ZYQlNUUl9JRCgneScsIDAsIDAsIDApLAkJJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0N1cnZlVG9fMTN9LAotfTsKLUZYX0JPT0wgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpPbk9wZXJhdG9yKEZYX0xQQ1NUUiBvcCkKLXsKLSAgICBpbnQgaSA9IDA7Ci0gICAgRlhfRFdPUkQgb3BpZCA9IDA7Ci0gICAgd2hpbGUgKGkgPCA0ICYmIG9wW2ldKSB7Ci0gICAgICAgIG9waWQgPSAob3BpZCA8PCA4KSArIG9wW2ldOwotICAgICAgICBpICsrOwotICAgIH0KLSAgICB3aGlsZSAoaSA8IDQpIHsKLSAgICAgICAgb3BpZCA8PD0gODsKLSAgICAgICAgaSArKzsKLSAgICB9OwotICAgIGludCBsb3cgPSAwLCBoaWdoID0gc2l6ZW9mIGdfT3BDb2RlcyAvIHNpemVvZihzdHJ1Y3QgX09wQ29kZSkgLSAxOwotICAgIHdoaWxlIChsb3cgPD0gaGlnaCkgewotICAgICAgICBpbnQgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKLSAgICAgICAgaW50IGNvbXBhcmUgPSBvcGlkIC0gZ19PcENvZGVzW21pZGRsZV0ubV9PcElkOwotICAgICAgICBpZiAoY29tcGFyZSA9PSAwKSB7Ci0gICAgICAgICAgICAodGhpcy0+KmdfT3BDb2Rlc1ttaWRkbGVdLm1fT3BIYW5kbGVyKSgpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29tcGFyZSA8IDApIHsKLSAgICAgICAgICAgIGhpZ2ggPSBtaWRkbGUgLSAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbG93ID0gbWlkZGxlICsgMTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbV9Db21wYXRDb3VudCAhPSAwOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9DbG9zZUZpbGxTdHJva2VQYXRoKCkKLXsKLSAgICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgSGFuZGxlX0Nsb3NlUGF0aCgpOwotICAgIEFkZFBhdGhPYmplY3QoRlhGSUxMX1dJTkRJTkcsIFRSVUUpOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9GaWxsU3Ryb2tlUGF0aCgpCi17Ci0gICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEFkZFBhdGhPYmplY3QoRlhGSUxMX1dJTkRJTkcsIFRSVUUpOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9DbG9zZUVPRmlsbFN0cm9rZVBhdGgoKQotewotICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBZGRQYXRoUG9pbnQobV9QYXRoU3RhcnRYLCBtX1BhdGhTdGFydFksIEZYUFRfTElORVRPIHwgRlhQVF9DTE9TRUZJR1VSRSk7Ci0gICAgQWRkUGF0aE9iamVjdChGWEZJTExfQUxURVJOQVRFLCBUUlVFKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRU9GaWxsU3Ryb2tlUGF0aCgpCi17Ci0gICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEFkZFBhdGhPYmplY3QoRlhGSUxMX0FMVEVSTkFURSwgVFJVRSk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0JlZ2luTWFya2VkQ29udGVudF9EaWN0aW9uYXJ5KCkKLXsKLSAgICBpZiAoIW1fT3B0aW9ucy5tX2JNYXJrZWRDb250ZW50KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgdGFnID0gR2V0U3RyaW5nKDEpOwotICAgIENQREZfT2JqZWN0KiBwUHJvcGVydHkgPSBHZXRPYmplY3QoMCk7Ci0gICAgaWYgKHBQcm9wZXJ0eSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfQk9PTCBiRGlyZWN0ID0gVFJVRTsKLSAgICBpZiAocFByb3BlcnR5LT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKLSAgICAgICAgcFByb3BlcnR5ID0gRmluZFJlc291cmNlT2JqKEZYX0JTVFJDKCJQcm9wZXJ0aWVzIiksIHBQcm9wZXJ0eS0+R2V0U3RyaW5nKCkpOwotICAgICAgICBpZiAocFByb3BlcnR5ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBiRGlyZWN0ID0gRkFMU0U7Ci0gICAgfQotICAgIGlmIChwUHJvcGVydHktPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fQ3VyQ29udGVudE1hcmsuR2V0TW9kaWZ5KCktPkFkZE1hcmsodGFnLCAoQ1BERl9EaWN0aW9uYXJ5KilwUHJvcGVydHksIGJEaXJlY3QpOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9CZWdpbk1hcmtlZENvbnRlbnQoKQotewotICAgIGlmICghbV9PcHRpb25zLm1fYk1hcmtlZENvbnRlbnQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyB0YWcgPSBHZXRTdHJpbmcoMCk7Ci0gICAgbV9DdXJDb250ZW50TWFyay5HZXRNb2RpZnkoKS0+QWRkTWFyayh0YWcsIE5VTEwsIEZBTFNFKTsKLX0KKyNpbmNsdWRlICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9wYWdlaW50LmgiCisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfc2VyaWFsLmgiCisKK25hbWVzcGFjZSB7CisKIHN0cnVjdCBfRlhfQlNUUiB7Ci0gICAgRlhfTFBDU1RSCW1fUHRyOwotICAgIGludAkJCW1fU2l6ZTsKKyAgY29uc3QgRlhfQ0hBUiogbV9QdHI7CisgIGludCBtX1NpemU7CiB9OwotI2RlZmluZSBfRlhfQlNUUkMoc3RyKSB7c3RyLCBzaXplb2Yoc3RyKS0xfQotY29uc3QgX0ZYX0JTVFIgX1BERl9JbmxpbmVLZXlBYmJyW10gPSB7Ci0gICAgX0ZYX0JTVFJDKCJCaXRzUGVyQ29tcG9uZW50IiksIF9GWF9CU1RSQygiQlBDIiksCi0gICAgX0ZYX0JTVFJDKCJDb2xvclNwYWNlIiksIF9GWF9CU1RSQygiQ1MiKSwKLSAgICBfRlhfQlNUUkMoIkRlY29kZSIpLCBfRlhfQlNUUkMoIkQiKSwKLSAgICBfRlhfQlNUUkMoIkRlY29kZVBhcm1zIiksIF9GWF9CU1RSQygiRFAiKSwKLSAgICBfRlhfQlNUUkMoIkZpbHRlciIpLCBfRlhfQlNUUkMoIkYiKSwKLSAgICBfRlhfQlNUUkMoIkhlaWdodCIpLCBfRlhfQlNUUkMoIkgiKSwKLSAgICBfRlhfQlNUUkMoIkltYWdlTWFzayIpLCBfRlhfQlNUUkMoIklNIiksCi0gICAgX0ZYX0JTVFJDKCJJbnRlcnBvbGF0ZSIpLCBfRlhfQlNUUkMoIkkiKSwKLSAgICBfRlhfQlNUUkMoIldpZHRoIiksIF9GWF9CU1RSQygiVyIpLAorI2RlZmluZSBfRlhfQlNUUkMoc3RyKSBcCisgIHsgc3RyLCBzaXplb2Yoc3RyKSAtIDEgfQorCitzdHJ1Y3QgUERGX0FiYnJQYWlycyB7CisgIF9GWF9CU1RSIGZ1bGxfbmFtZTsKKyAgX0ZYX0JTVFIgYWJicjsKIH07Ci1jb25zdCBfRlhfQlNUUiBfUERGX0lubGluZVZhbHVlQWJicltdID0gewotICAgIF9GWF9CU1RSQygiRGV2aWNlR3JheSIpLCBfRlhfQlNUUkMoIkciKSwKLSAgICBfRlhfQlNUUkMoIkRldmljZVJHQiIpLCBfRlhfQlNUUkMoIlJHQiIpLAotICAgIF9GWF9CU1RSQygiRGV2aWNlQ01ZSyIpLCBfRlhfQlNUUkMoIkNNWUsiKSwKLSAgICBfRlhfQlNUUkMoIkluZGV4ZWQiKSwgX0ZYX0JTVFJDKCJJIiksCi0gICAgX0ZYX0JTVFJDKCJBU0NJSUhleERlY29kZSIpLCBfRlhfQlNUUkMoIkFIeCIpLAotICAgIF9GWF9CU1RSQygiQVNDSUk4NURlY29kZSIpLCBfRlhfQlNUUkMoIkE4NSIpLAotICAgIF9GWF9CU1RSQygiTFpXRGVjb2RlIiksIF9GWF9CU1RSQygiTFpXIiksCi0gICAgX0ZYX0JTVFJDKCJGbGF0ZURlY29kZSIpLCBfRlhfQlNUUkMoIkZsIiksCi0gICAgX0ZYX0JTVFJDKCJSdW5MZW5ndGhEZWNvZGUiKSwgX0ZYX0JTVFJDKCJSTCIpLAotICAgIF9GWF9CU1RSQygiQ0NJVFRGYXhEZWNvZGUiKSwgX0ZYX0JTVFJDKCJDQ0YiKSwKLSAgICBfRlhfQlNUUkMoIkRDVERlY29kZSIpLCBfRlhfQlNUUkMoIkRDVCIpLAorCitjb25zdCBQREZfQWJiclBhaXJzIFBERl9JbmxpbmVLZXlBYmJyW10gPSB7CisgICAge19GWF9CU1RSQygiQml0c1BlckNvbXBvbmVudCIpLCBfRlhfQlNUUkMoIkJQQyIpfSwKKyAgICB7X0ZYX0JTVFJDKCJDb2xvclNwYWNlIiksIF9GWF9CU1RSQygiQ1MiKX0sCisgICAge19GWF9CU1RSQygiRGVjb2RlIiksIF9GWF9CU1RSQygiRCIpfSwKKyAgICB7X0ZYX0JTVFJDKCJEZWNvZGVQYXJtcyIpLCBfRlhfQlNUUkMoIkRQIil9LAorICAgIHtfRlhfQlNUUkMoIkZpbHRlciIpLCBfRlhfQlNUUkMoIkYiKX0sCisgICAge19GWF9CU1RSQygiSGVpZ2h0IiksIF9GWF9CU1RSQygiSCIpfSwKKyAgICB7X0ZYX0JTVFJDKCJJbWFnZU1hc2siKSwgX0ZYX0JTVFJDKCJJTSIpfSwKKyAgICB7X0ZYX0JTVFJDKCJJbnRlcnBvbGF0ZSIpLCBfRlhfQlNUUkMoIkkiKX0sCisgICAge19GWF9CU1RSQygiV2lkdGgiKSwgX0ZYX0JTVFJDKCJXIil9LAogfTsKLXN0YXRpYyBDRlhfQnl0ZVN0cmluZ0MgX1BERl9GaW5kRnVsbE5hbWUoY29uc3QgX0ZYX0JTVFIqIHRhYmxlLCBpbnQgY291bnQsIEZYX0JTVFIgYWJicikKLXsKLSAgICBpbnQgaSA9IDA7Ci0gICAgd2hpbGUgKGkgPCBjb3VudCkgewotICAgICAgICBpZiAoYWJici5HZXRMZW5ndGgoKSA9PSB0YWJsZVtpICsgMV0ubV9TaXplICYmIEZYU1lTX21lbWNtcDMyKGFiYnIuR2V0UHRyKCksIHRhYmxlW2kgKyAxXS5tX1B0ciwgYWJici5HZXRMZW5ndGgoKSkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQyh0YWJsZVtpXS5tX1B0ciwgdGFibGVbaV0ubV9TaXplKTsKLSAgICAgICAgfQotICAgICAgICBpICs9IDI7Ci0gICAgfQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MoKTsKKworY29uc3QgUERGX0FiYnJQYWlycyBQREZfSW5saW5lVmFsdWVBYmJyW10gPSB7CisgICAge19GWF9CU1RSQygiRGV2aWNlR3JheSIpLCBfRlhfQlNUUkMoIkciKX0sCisgICAge19GWF9CU1RSQygiRGV2aWNlUkdCIiksIF9GWF9CU1RSQygiUkdCIil9LAorICAgIHtfRlhfQlNUUkMoIkRldmljZUNNWUsiKSwgX0ZYX0JTVFJDKCJDTVlLIil9LAorICAgIHtfRlhfQlNUUkMoIkluZGV4ZWQiKSwgX0ZYX0JTVFJDKCJJIil9LAorICAgIHtfRlhfQlNUUkMoIkFTQ0lJSGV4RGVjb2RlIiksIF9GWF9CU1RSQygiQUh4Iil9LAorICAgIHtfRlhfQlNUUkMoIkFTQ0lJODVEZWNvZGUiKSwgX0ZYX0JTVFJDKCJBODUiKX0sCisgICAge19GWF9CU1RSQygiTFpXRGVjb2RlIiksIF9GWF9CU1RSQygiTFpXIil9LAorICAgIHtfRlhfQlNUUkMoIkZsYXRlRGVjb2RlIiksIF9GWF9CU1RSQygiRmwiKX0sCisgICAge19GWF9CU1RSQygiUnVuTGVuZ3RoRGVjb2RlIiksIF9GWF9CU1RSQygiUkwiKX0sCisgICAge19GWF9CU1RSQygiQ0NJVFRGYXhEZWNvZGUiKSwgX0ZYX0JTVFJDKCJDQ0YiKX0sCisgICAge19GWF9CU1RSQygiRENURGVjb2RlIiksIF9GWF9CU1RSQygiRENUIil9LAorfTsKKworc3RydWN0IEFiYnJSZXBsYWNlbWVudE9wIHsKKyAgYm9vbCBpc19yZXBsYWNlX2tleTsKKyAgQ0ZYX0J5dGVTdHJpbmcga2V5OworICBDRlhfQnl0ZVN0cmluZ0MgcmVwbGFjZW1lbnQ7Cit9OworCitDRlhfQnl0ZVN0cmluZ0MgUERGX0ZpbmRGdWxsTmFtZShjb25zdCBQREZfQWJiclBhaXJzKiB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYWJicikgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICBpZiAoYWJici5HZXRMZW5ndGgoKSAhPSB0YWJsZVtpXS5hYmJyLm1fU2l6ZSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChtZW1jbXAoYWJici5HZXRQdHIoKSwgdGFibGVbaV0uYWJici5tX1B0ciwgYWJici5HZXRMZW5ndGgoKSkpCisgICAgICBjb250aW51ZTsKKyAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKHRhYmxlW2ldLmZ1bGxfbmFtZS5tX1B0ciwgdGFibGVbaV0uZnVsbF9uYW1lLm1fU2l6ZSk7CisgIH0KKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQygpOwogfQotdm9pZCBfUERGX1JlcGxhY2VBYmJyKENQREZfT2JqZWN0KiBwT2JqKQotewotICAgIHN3aXRjaCAocE9iai0+R2V0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgUERGT0JKX0RJQ1RJT05BUlk6IHsKLSAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gKENQREZfRGljdGlvbmFyeSopcE9iajsKLSAgICAgICAgICAgICAgICBGWF9QT1NJVElPTiBwb3MgPSBwRGljdC0+R2V0U3RhcnRQb3MoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGtleTsKLSAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHZhbHVlID0gcERpY3QtPkdldE5leHRFbGVtZW50KHBvcywga2V5KTsKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDIGZ1bGxuYW1lID0gX1BERl9GaW5kRnVsbE5hbWUoX1BERl9JbmxpbmVLZXlBYmJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgX1BERl9JbmxpbmVLZXlBYmJyIC8gc2l6ZW9mKF9GWF9CU1RSKSwga2V5KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmdWxsbmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEaWN0LT5SZXBsYWNlS2V5KGtleSwgZnVsbG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gZnVsbG5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIG5hbWUgPSB2YWx1ZS0+R2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmdWxsbmFtZSA9IF9QREZfRmluZEZ1bGxOYW1lKF9QREZfSW5saW5lVmFsdWVBYmJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgX1BERl9JbmxpbmVWYWx1ZUFiYnIgLyBzaXplb2YoX0ZYX0JTVFIpLCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZnVsbG5hbWUuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcERpY3QtPlNldEF0TmFtZShrZXksIGZ1bGxuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9QREZfUmVwbGFjZUFiYnIodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIFBERk9CSl9BUlJBWTogewotICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwT2JqOwotICAgICAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwQXJyYXktPkdldENvdW50KCk7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBFbGVtZW50ID0gcEFycmF5LT5HZXRFbGVtZW50KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocEVsZW1lbnQtPkdldFR5cGUoKSA9PSBQREZPQkpfTkFNRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9IHBFbGVtZW50LT5HZXRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQyBmdWxsbmFtZSA9IF9QREZfRmluZEZ1bGxOYW1lKF9QREZfSW5saW5lVmFsdWVBYmJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIF9QREZfSW5saW5lVmFsdWVBYmJyIC8gc2l6ZW9mKF9GWF9CU1RSKSwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZ1bGxuYW1lLklzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBcnJheS0+U2V0QXQoaSwgQ1BERl9OYW1lOjpDcmVhdGUoZnVsbG5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9QREZfUmVwbGFjZUFiYnIocEVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgIH0KLX0KLXN0YXRpYyBDRlhfQnl0ZVN0cmluZ0MgX1BERl9GaW5kQWJick5hbWUoY29uc3QgX0ZYX0JTVFIqIHRhYmxlLCBpbnQgY291bnQsIEZYX0JTVFIgZnVsbE5hbWUpCi17Ci0gICAgaW50IGkgPSAwOwotICAgIHdoaWxlIChpIDwgY291bnQpIHsKLSAgICAgICAgaWYgKGZ1bGxOYW1lLkdldExlbmd0aCgpID09IHRhYmxlW2ldLm1fU2l6ZSAmJiBGWFNZU19tZW1jbXAzMihmdWxsTmFtZS5HZXRQdHIoKSwgdGFibGVbaV0ubV9QdHIsIGZ1bGxOYW1lLkdldExlbmd0aCgpKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKHRhYmxlW2kgKyAxXS5tX1B0ciwgdGFibGVbaSArIDFdLm1fU2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaSArPSAyOwotICAgIH0KLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKCk7Ci19Ci12b2lkIF9QREZfUmVwbGFjZUZ1bGwoQ1BERl9PYmplY3QqIHBPYmopCi17Ci0gICAgc3dpdGNoIChwT2JqLT5HZXRUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBQREZPQkpfRElDVElPTkFSWTogewotICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwT2JqOwotICAgICAgICAgICAgICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBEaWN0LT5HZXRTdGFydFBvcygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5OwotICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogdmFsdWUgPSBwRGljdC0+R2V0TmV4dEVsZW1lbnQocG9zLCBrZXkpOwotICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0MgYWJick5hbWUgPSBfUERGX0ZpbmRBYmJyTmFtZShfUERGX0lubGluZUtleUFiYnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihfUERGX0lubGluZUtleUFiYnIpIC8gc2l6ZW9mKF9GWF9CU1RSKSwga2V5KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFhYmJyTmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEaWN0LT5SZXBsYWNlS2V5KGtleSwgYWJick5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gYWJick5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIG5hbWUgPSB2YWx1ZS0+R2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhYmJyTmFtZSA9IF9QREZfRmluZEFiYnJOYW1lKF9QREZfSW5saW5lVmFsdWVBYmJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoX1BERl9JbmxpbmVWYWx1ZUFiYnIpIC8gc2l6ZW9mKF9GWF9CU1RSKSwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFiYnJOYW1lLklzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaWN0LT5TZXRBdE5hbWUoa2V5LCBhYmJyTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfUERGX1JlcGxhY2VGdWxsKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBQREZPQkpfQVJSQVk6IHsKLSAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcE9iajsKLSAgICAgICAgICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwRWxlbWVudCA9IHBBcnJheS0+R2V0RWxlbWVudChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBFbGVtZW50LT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIG5hbWUgPSBwRWxlbWVudC0+R2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0MgYWJick5hbWUgPSBfUERGX0ZpbmRBYmJyTmFtZShfUERGX0lubGluZVZhbHVlQWJiciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiBfUERGX0lubGluZVZhbHVlQWJiciAvIHNpemVvZihfRlhfQlNUUiksIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhYmJyTmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXJyYXktPlNldEF0KGksIENQREZfTmFtZTo6Q3JlYXRlKGFiYnJOYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfUERGX1JlcGxhY2VGdWxsKHBFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICB9Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0JlZ2luVGV4dCgpCi17Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRNYXRyaXguU2V0KDEuMGYsIDAsIDAsIDEuMGYsIDAsIDApOwotICAgIE9uQ2hhbmdlVGV4dE1hdHJpeCgpOwotICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0WCA9IDA7Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRZID0gMDsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dExpbmVYID0gMDsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dExpbmVZID0gMDsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQmVnaW5TZWN0aW9uVW5kZWZpbmVkKCkKLXsKLSAgICBtX0NvbXBhdENvdW50ICsrOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9DdXJ2ZVRvXzEyMygpCi17Ci0gICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEFkZFBhdGhQb2ludChHZXROdW1iZXIoNSksIEdldE51bWJlcig0KSwgRlhQVF9CRVpJRVJUTyk7Ci0gICAgQWRkUGF0aFBvaW50KEdldE51bWJlcigzKSwgR2V0TnVtYmVyKDIpLCBGWFBUX0JFWklFUlRPKTsKLSAgICBBZGRQYXRoUG9pbnQoR2V0TnVtYmVyKDEpLCBHZXROdW1iZXIoMCksIEZYUFRfQkVaSUVSVE8pOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9Db25jYXRNYXRyaXgoKQotewotICAgIEZYX0ZMT0FUIGEyID0gR2V0TnVtYmVyMTYoNSksIGIyID0gR2V0TnVtYmVyMTYoNCksIGMyID0gR2V0TnVtYmVyMTYoMyksIGQyID0gR2V0TnVtYmVyMTYoMik7Ci0gICAgRlhfRkxPQVQgZTIgPSBHZXROdW1iZXIoMSksIGYyID0gR2V0TnVtYmVyKDApOwotICAgIENGWF9BZmZpbmVNYXRyaXggbmV3X21hdHJpeChhMiwgYjIsIGMyLCBkMiwgZTIsIGYyKTsKLSAgICBuZXdfbWF0cml4LkNvbmNhdChtX3BDdXJTdGF0ZXMtPm1fQ1RNKTsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fQ1RNID0gbmV3X21hdHJpeDsKLSAgICBPbkNoYW5nZVRleHRNYXRyaXgoKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q29sb3JTcGFjZV9GaWxsKCkKLXsKLSAgICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NuYW1lID0gR2V0U3RyaW5nKDApOwotICAgIENQREZfQ29sb3JTcGFjZSogcENTID0gRmluZENvbG9yU3BhY2UoY3NuYW1lKTsKLSAgICBpZiAocENTID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX3BDdXJTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5HZXRNb2RpZnkoKS0+bV9GaWxsQ29sb3IuU2V0Q29sb3JTcGFjZShwQ1MpOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDb2xvclNwYWNlX1N0cm9rZSgpCi17Ci0gICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGNzbmFtZSA9IEdldFN0cmluZygwKTsKLSAgICBDUERGX0NvbG9yU3BhY2UqIHBDUyA9IEZpbmRDb2xvclNwYWNlKGNzbmFtZSk7Ci0gICAgaWYgKHBDUyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGUuR2V0TW9kaWZ5KCktPm1fU3Ryb2tlQ29sb3IuU2V0Q29sb3JTcGFjZShwQ1MpOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXREYXNoKCkKLXsKLSAgICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcEFycmF5ID0gR2V0T2JqZWN0KDEpID8gR2V0T2JqZWN0KDEpLT5HZXRBcnJheSgpIDogTlVMTDsKLSAgICBpZiAocEFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX3BDdXJTdGF0ZXMtPlNldExpbmVEYXNoKHBBcnJheSwgR2V0TnVtYmVyKDApLCAxLjBmKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q2hhcldpZHRoKCkKLXsKLSAgICBtX1R5cGUzRGF0YVswXSA9IEdldE51bWJlcigxKTsKLSAgICBtX1R5cGUzRGF0YVsxXSA9IEdldE51bWJlcigwKTsKLSAgICBtX2JDb2xvcmVkID0gVFJVRTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q2FjaGVkRGV2aWNlKCkKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkgKyspIHsKLSAgICAgICAgbV9UeXBlM0RhdGFbaV0gPSBHZXROdW1iZXIoNSAtIGkpOwotICAgIH0KLSAgICBtX2JDb2xvcmVkID0gRkFMU0U7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0V4ZWN1dGVYT2JqZWN0KCkKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gR2V0U3RyaW5nKDApOwotICAgIGlmIChuYW1lID09IG1fTGFzdEltYWdlTmFtZSAmJiBtX3BMYXN0SW1hZ2UgJiYgbV9wTGFzdEltYWdlLT5HZXRTdHJlYW0oKSAmJiBtX3BMYXN0SW1hZ2UtPkdldFN0cmVhbSgpLT5HZXRPYmpOdW0oKSkgewotICAgICAgICBBZGRJbWFnZShOVUxMLCBtX3BMYXN0SW1hZ2UsIEZBTFNFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwUmVzID0gTlVMTDsKLSAgICAgICAgaWYgKG1fcFJlc291cmNlcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fcFJlc291cmNlcyA9PSBtX3BQYWdlUmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBMaXN0ID0gbV9wUmVzb3VyY2VzLT5HZXREaWN0KEZYX0JTVFJDKCJYT2JqZWN0IikpOwotICAgICAgICAgICAgaWYgKHBMaXN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwUmVzID0gcExpc3QtPkdldEVsZW1lbnQobmFtZSk7Ci0gICAgICAgICAgICBpZiAocFJlcyA9PSBOVUxMIHx8IHBSZXMtPkdldFR5cGUoKSAhPSBQREZPQkpfUkVGRVJFTkNFKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwTGlzdCA9IG1fcFJlc291cmNlcy0+R2V0RGljdChGWF9CU1RSQygiWE9iamVjdCIpKTsKLSAgICAgICAgICAgIGlmIChwTGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fcFBhZ2VSZXNvdXJjZXMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcExpc3QgPSBtX3BQYWdlUmVzb3VyY2VzLT5HZXREaWN0KEZYX0JTVFJDKCJYT2JqZWN0IikpOwotICAgICAgICAgICAgICAgIGlmIChwTGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcFJlcyA9IHBMaXN0LT5HZXRFbGVtZW50KG5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChwUmVzID09IE5VTEwgfHwgcFJlcy0+R2V0VHlwZSgpICE9IFBERk9CSl9SRUZFUkVOQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcFJlcyA9IHBMaXN0LT5HZXRFbGVtZW50KG5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChwUmVzID09IE5VTEwgfHwgcFJlcy0+R2V0VHlwZSgpICE9IFBERk9CSl9SRUZFUkVOQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBGWF9CT09MIGJGb3JtOwotICAgICAgICBpZiAobV9wRG9jdW1lbnQtPklzRm9ybVN0cmVhbSgoKENQREZfUmVmZXJlbmNlKilwUmVzKS0+R2V0UmVmT2JqTnVtKCksIGJGb3JtKSAmJiAhYkZvcm0pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLSAgICBDUERGX1N0cmVhbSogcFhPYmplY3QgPSAoQ1BERl9TdHJlYW0qKUZpbmRSZXNvdXJjZU9iaihGWF9CU1RSQygiWE9iamVjdCIpLCBuYW1lKTsKLSAgICBpZiAocFhPYmplY3QgPT0gTlVMTCB8fCBwWE9iamVjdC0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pIHsKLSAgICAgICAgbV9iUmVzb3VyY2VNaXNzaW5nID0gVFJVRTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZ0MgdHlwZSA9IHBYT2JqZWN0LT5HZXREaWN0KCkgPyBwWE9iamVjdC0+R2V0RGljdCgpLT5HZXRDb25zdFN0cmluZyhGWF9CU1RSQygiU3VidHlwZSIpKSA6IENGWF9CeXRlU3RyaW5nQygpOwotICAgIGlmICh0eXBlID09IEZYX0JTVFJDKCJJbWFnZSIpKSB7Ci0gICAgICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBDUERGX0ltYWdlT2JqZWN0KiBwT2JqID0gQWRkSW1hZ2UocFhPYmplY3QsIE5VTEwsIEZBTFNFKTsKLSAgICAgICAgbV9MYXN0SW1hZ2VOYW1lID0gbmFtZTsKLSAgICAgICAgbV9wTGFzdEltYWdlID0gcE9iai0+bV9wSW1hZ2U7Ci0gICAgfSBlbHNlIGlmICh0eXBlID09IEZYX0JTVFJDKCJGb3JtIikpIHsKLSAgICAgICAgQWRkRm9ybShwWE9iamVjdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGRGb3JtKENQREZfU3RyZWFtKiBwU3RyZWFtKQotewotICAgIGlmICghbV9PcHRpb25zLm1fYlNlcGFyYXRlRm9ybSkgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZXMgPSBwU3RyZWFtLT5HZXREaWN0KCktPkdldERpY3QoRlhfQlNUUkMoIlJlc291cmNlcyIpKTsKLSAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBmb3JtX21hdHJpeCA9IHBTdHJlYW0tPkdldERpY3QoKS0+R2V0TWF0cml4KEZYX0JTVFJDKCJNYXRyaXgiKSk7Ci0gICAgICAgIGZvcm1fbWF0cml4LkNvbmNhdChtX3BDdXJTdGF0ZXMtPm1fQ1RNKTsKLSAgICAgICAgQ1BERl9BcnJheSogcEJCb3ggPSBwU3RyZWFtLT5HZXREaWN0KCktPkdldEFycmF5KEZYX0JTVFJDKCJCQm94IikpOwotICAgICAgICBDRlhfRmxvYXRSZWN0IGZvcm1fYmJveDsKLSAgICAgICAgQ1BERl9QYXRoIENsaXBQYXRoOwotICAgICAgICBpZiAocEJCb3gpIHsKLSAgICAgICAgICAgIGZvcm1fYmJveCA9IHBTdHJlYW0tPkdldERpY3QoKS0+R2V0UmVjdChGWF9CU1RSQygiQkJveCIpKTsKLSAgICAgICAgICAgIENsaXBQYXRoLk5ldygpOwotICAgICAgICAgICAgQ2xpcFBhdGguQXBwZW5kUmVjdChmb3JtX2Jib3gubGVmdCwgZm9ybV9iYm94LmJvdHRvbSwgZm9ybV9iYm94LnJpZ2h0LCBmb3JtX2Jib3gudG9wKTsKLSAgICAgICAgICAgIENsaXBQYXRoLlRyYW5zZm9ybSgmZm9ybV9tYXRyaXgpOwotICAgICAgICAgICAgZm9ybV9iYm94LlRyYW5zZm9ybSgmZm9ybV9tYXRyaXgpOwotICAgICAgICB9Ci0gICAgICAgIENQREZfU3RyZWFtQ29udGVudFBhcnNlciBwYXJzZXI7Ci0gICAgICAgIHBhcnNlci5Jbml0aWFsaXplKCk7Ci0gICAgICAgIHBhcnNlci5QcmVwYXJlUGFyc2UobV9wRG9jdW1lbnQsIG1fcFBhZ2VSZXNvdXJjZXMsIG1fcFJlc291cmNlcywgJm1fbXRDb250ZW50VG9Vc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE9iamVjdExpc3QsIHBSZXNvdXJjZXMsICZmb3JtX2Jib3gsICZtX09wdGlvbnMsIG1fcEN1clN0YXRlcywgbV9MZXZlbCArIDEpOwotICAgICAgICBwYXJzZXIubV9wQ3VyU3RhdGVzLT5tX0NUTSA9IGZvcm1fbWF0cml4OwotICAgICAgICBpZiAoQ2xpcFBhdGguTm90TnVsbCgpKSB7Ci0gICAgICAgICAgICBwYXJzZXIubV9wQ3VyU3RhdGVzLT5tX0NsaXBQYXRoLkFwcGVuZFBhdGgoQ2xpcFBhdGgsIEZYRklMTF9XSU5ESU5HLCBUUlVFKTsKLSAgICAgICAgfQotICAgICAgICBDUERGX1N0cmVhbUFjYyBzdHJlYW07Ci0gICAgICAgIHN0cmVhbS5Mb2FkQWxsRGF0YShwU3RyZWFtLCBGQUxTRSk7Ci0gICAgICAgIGlmIChzdHJlYW0uR2V0U2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBwYXJzZXIuUGFyc2Uoc3RyZWFtLkdldERhdGEoKSwgc3RyZWFtLkdldFNpemUoKSwgMCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9Gb3JtT2JqZWN0KiBwRm9ybU9iaiA9IG5ldyBDUERGX0Zvcm1PYmplY3Q7Ci0gICAgcEZvcm1PYmotPm1fcEZvcm0gPSBuZXcgQ1BERl9Gb3JtKG1fcERvY3VtZW50LCBtX3BQYWdlUmVzb3VyY2VzLCBwU3RyZWFtLCBtX3BSZXNvdXJjZXMpOwotICAgIHBGb3JtT2JqLT5tX0Zvcm1NYXRyaXggPSBtX3BDdXJTdGF0ZXMtPm1fQ1RNOwotICAgIHBGb3JtT2JqLT5tX0Zvcm1NYXRyaXguQ29uY2F0KG1fbXRDb250ZW50VG9Vc2VyKTsKLSAgICBDUERGX0FsbFN0YXRlcyBzdGF0dXM7Ci0gICAgc3RhdHVzLm1fR2VuZXJhbFN0YXRlID0gbV9wQ3VyU3RhdGVzLT5tX0dlbmVyYWxTdGF0ZTsKLSAgICBzdGF0dXMubV9HcmFwaFN0YXRlID0gbV9wQ3VyU3RhdGVzLT5tX0dyYXBoU3RhdGU7Ci0gICAgc3RhdHVzLm1fQ29sb3JTdGF0ZSA9IG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlOwotICAgIHN0YXR1cy5tX1RleHRTdGF0ZSA9IG1fcEN1clN0YXRlcy0+bV9UZXh0U3RhdGU7Ci0gICAgcEZvcm1PYmotPm1fcEZvcm0tPlBhcnNlQ29udGVudCgmc3RhdHVzLCBOVUxMLCBOVUxMLCAmbV9PcHRpb25zLCBtX0xldmVsICsgMSk7Ci0gICAgaWYgKCFtX3BPYmplY3RMaXN0LT5tX2JCYWNrZ3JvdW5kQWxwaGFOZWVkZWQgJiYgcEZvcm1PYmotPm1fcEZvcm0tPm1fYkJhY2tncm91bmRBbHBoYU5lZWRlZCkgewotICAgICAgICBtX3BPYmplY3RMaXN0LT5tX2JCYWNrZ3JvdW5kQWxwaGFOZWVkZWQgPSBUUlVFOwotICAgIH0KLSAgICBwRm9ybU9iai0+Q2FsY0JvdW5kaW5nQm94KCk7Ci0gICAgU2V0R3JhcGhpY1N0YXRlcyhwRm9ybU9iaiwgVFJVRSwgVFJVRSwgVFJVRSk7Ci0gICAgbV9wT2JqZWN0TGlzdC0+bV9PYmplY3RMaXN0LkFkZFRhaWwocEZvcm1PYmopOwotfQotQ1BERl9JbWFnZU9iamVjdCogQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGRJbWFnZShDUERGX1N0cmVhbSogcFN0cmVhbSwgQ1BERl9JbWFnZSogcEltYWdlLCBGWF9CT09MIGJJbmxpbmUpCi17Ci0gICAgaWYgKHBTdHJlYW0gPT0gTlVMTCAmJiBwSW1hZ2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBJbWFnZU1hdHJpeDsKLSAgICBJbWFnZU1hdHJpeC5Db3B5KG1fcEN1clN0YXRlcy0+bV9DVE0pOwotICAgIEltYWdlTWF0cml4LkNvbmNhdChtX210Q29udGVudFRvVXNlcik7Ci0gICAgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqID0gbmV3IENQREZfSW1hZ2VPYmplY3Q7Ci0gICAgaWYgKHBJbWFnZSkgewotICAgICAgICBwSW1hZ2VPYmotPm1fcEltYWdlID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPkdldEltYWdlKHBJbWFnZS0+R2V0U3RyZWFtKCkpOwotICAgIH0gZWxzZSBpZiAocFN0cmVhbS0+R2V0T2JqTnVtKCkpIHsKLSAgICAgICAgcEltYWdlT2JqLT5tX3BJbWFnZSA9IG1fcERvY3VtZW50LT5Mb2FkSW1hZ2VGKHBTdHJlYW0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBJbWFnZU9iai0+bV9wSW1hZ2UgPSBuZXcgQ1BERl9JbWFnZShtX3BEb2N1bWVudCk7Ci0gICAgICAgIHBJbWFnZU9iai0+bV9wSW1hZ2UtPkxvYWRJbWFnZUYocFN0cmVhbSwgYklubGluZSk7Ci0gICAgfQotICAgIFNldEdyYXBoaWNTdGF0ZXMocEltYWdlT2JqLCBwSW1hZ2VPYmotPm1fcEltYWdlLT5Jc01hc2soKSwgRkFMU0UsIEZBTFNFKTsKLSAgICBwSW1hZ2VPYmotPm1fTWF0cml4ID0gSW1hZ2VNYXRyaXg7Ci0gICAgcEltYWdlT2JqLT5DYWxjQm91bmRpbmdCb3goKTsKLSAgICBtX3BPYmplY3RMaXN0LT5tX09iamVjdExpc3QuQWRkVGFpbChwSW1hZ2VPYmopOwotICAgIHJldHVybiBwSW1hZ2VPYmo7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX01hcmtQbGFjZV9EaWN0aW9uYXJ5KCkKLXsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRW5kSW1hZ2UoKQotewotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FbmRNYXJrZWRDb250ZW50KCkKLXsKLSAgICBpZiAoIW1fT3B0aW9ucy5tX2JNYXJrZWRDb250ZW50KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1fQ3VyQ29udGVudE1hcmsuSXNOdWxsKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgY291bnQgPSBtX0N1ckNvbnRlbnRNYXJrLkdldE9iamVjdCgpLT5Db3VudEl0ZW1zKCk7Ci0gICAgaWYgKGNvdW50ID09IDEpIHsKLSAgICAgICAgbV9DdXJDb250ZW50TWFyay5TZXROdWxsKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9DdXJDb250ZW50TWFyay5HZXRNb2RpZnkoKS0+RGVsZXRlTGFzdE1hcmsoKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRW5kVGV4dCgpCi17Ci0gICAgaW50IGNvdW50ID0gbV9DbGlwVGV4dExpc3QuR2V0U2l6ZSgpOwotICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1fcEN1clN0YXRlcy0+bV9UZXh0U3RhdGUuR2V0T2JqZWN0KCktPm1fVGV4dE1vZGUgPCA0KSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIENQREZfVGV4dE9iamVjdCogcFRleHQgPSAoQ1BERl9UZXh0T2JqZWN0KiltX0NsaXBUZXh0TGlzdC5HZXRBdChpKTsKLSAgICAgICAgICAgIGlmIChwVGV4dCkgewotICAgICAgICAgICAgICAgIGRlbGV0ZSBwVGV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcEN1clN0YXRlcy0+bV9DbGlwUGF0aC5BcHBlbmRUZXh0cygoQ1BERl9UZXh0T2JqZWN0KiopbV9DbGlwVGV4dExpc3QuR2V0RGF0YSgpLCBjb3VudCk7Ci0gICAgfQotICAgIG1fQ2xpcFRleHRMaXN0LlJlbW92ZUFsbCgpOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FbmRTZWN0aW9uVW5kZWZpbmVkKCkKLXsKLSAgICBpZiAobV9Db21wYXRDb3VudCkgewotICAgICAgICBtX0NvbXBhdENvdW50IC0tOwotICAgIH0KLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRmlsbFBhdGgoKQotewotICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBZGRQYXRoT2JqZWN0KEZYRklMTF9XSU5ESU5HLCBGQUxTRSk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0ZpbGxQYXRoT2xkKCkKLXsKLSAgICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQWRkUGF0aE9iamVjdChGWEZJTExfV0lORElORywgRkFMU0UpOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FT0ZpbGxQYXRoKCkKLXsKLSAgICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQWRkUGF0aE9iamVjdChGWEZJTExfQUxURVJOQVRFLCBGQUxTRSk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldEdyYXlfRmlsbCgpCi17Ci0gICAgRlhfRkxPQVQgdmFsdWUgPSBHZXROdW1iZXIoMCk7Ci0gICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFR1JBWSk7Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGUuU2V0RmlsbENvbG9yKHBDUywgJnZhbHVlLCAxKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0R3JheV9TdHJva2UoKQotewotICAgIEZYX0ZMT0FUIHZhbHVlID0gR2V0TnVtYmVyKDApOwotICAgIENQREZfQ29sb3JTcGFjZSogcENTID0gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRUdSQVkpOwotICAgIG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlLlNldFN0cm9rZUNvbG9yKHBDUywgJnZhbHVlLCAxKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0RXh0ZW5kR3JhcGhTdGF0ZSgpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9IEdldFN0cmluZygwKTsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBHUyA9IChDUERGX0RpY3Rpb25hcnkqKUZpbmRSZXNvdXJjZU9iaihGWF9CU1RSQygiRXh0R1N0YXRlIiksIG5hbWUpOwotICAgIGlmIChwR1MgPT0gTlVMTCB8fCBwR1MtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICBtX2JSZXNvdXJjZU1pc3NpbmcgPSBUUlVFOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fcEN1clN0YXRlcy0+UHJvY2Vzc0V4dEdTKHBHUywgdGhpcyk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0Nsb3NlUGF0aCgpCi17Ci0gICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtX1BhdGhQb2ludENvdW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobV9QYXRoU3RhcnRYICE9IG1fUGF0aEN1cnJlbnRYIHx8IG1fUGF0aFN0YXJ0WSAhPSBtX1BhdGhDdXJyZW50WSkgewotICAgICAgICBBZGRQYXRoUG9pbnQobV9QYXRoU3RhcnRYLCBtX1BhdGhTdGFydFksIEZYUFRfTElORVRPIHwgRlhQVF9DTE9TRUZJR1VSRSk7Ci0gICAgfSBlbHNlIGlmIChtX3BQYXRoUG9pbnRzW21fUGF0aFBvaW50Q291bnQgLSAxXS5tX0ZsYWcgIT0gRlhQVF9NT1ZFVE8pIHsKLSAgICAgICAgbV9wUGF0aFBvaW50c1ttX1BhdGhQb2ludENvdW50IC0gMV0ubV9GbGFnIHw9IEZYUFRfQ0xPU0VGSUdVUkU7Ci0gICAgfQotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRGbGF0KCkKLXsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fR2VuZXJhbFN0YXRlLkdldE1vZGlmeSgpLT5tX0ZsYXRuZXNzID0gR2V0TnVtYmVyKDApOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9CZWdpbkltYWdlRGF0YSgpCi17Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldExpbmVKb2luKCkKLXsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fR3JhcGhTdGF0ZS5HZXRNb2RpZnkoKS0+bV9MaW5lSm9pbiA9IChDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luKUdldEludGVnZXIoMCk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldExpbmVDYXAoKQotewotICAgIG1fcEN1clN0YXRlcy0+bV9HcmFwaFN0YXRlLkdldE1vZGlmeSgpLT5tX0xpbmVDYXAgPSAoQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwKUdldEludGVnZXIoMCk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENNWUtDb2xvcl9GaWxsKCkKLXsKLSAgICBSRVFVSVJFX1BBUkFNUyg0KTsKLSAgICBGWF9GTE9BVCB2YWx1ZXNbNF07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpICsrKSB7Ci0gICAgICAgIHZhbHVlc1tpXSA9IEdldE51bWJlcigzIC0gaSk7Ci0gICAgfQotICAgIENQREZfQ29sb3JTcGFjZSogcENTID0gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRUNNWUspOwotICAgIG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlLlNldEZpbGxDb2xvcihwQ1MsIHZhbHVlcywgNCk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENNWUtDb2xvcl9TdHJva2UoKQotewotICAgIFJFUVVJUkVfUEFSQU1TKDQpOwotICAgIEZYX0ZMT0FUIHZhbHVlc1s0XTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkgKyspIHsKLSAgICAgICAgdmFsdWVzW2ldID0gR2V0TnVtYmVyKDMgLSBpKTsKLSAgICB9Ci0gICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFQ01ZSyk7Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGUuU2V0U3Ryb2tlQ29sb3IocENTLCB2YWx1ZXMsIDQpOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9MaW5lVG8oKQotewotICAgIFJFUVVJUkVfUEFSQU1TKDIpOwotICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBZGRQYXRoUG9pbnQoR2V0TnVtYmVyKDEpLCBHZXROdW1iZXIoMCksIEZYUFRfTElORVRPKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTW92ZVRvKCkKLXsKLSAgICBSRVFVSVJFX1BBUkFNUygyKTsKLSAgICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7Ci0gICAgICAgIG1fcFN5bnRheC0+U2tpcFBhdGhPYmplY3QoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBZGRQYXRoUG9pbnQoR2V0TnVtYmVyKDEpLCBHZXROdW1iZXIoMCksIEZYUFRfTU9WRVRPKTsKLSAgICBQYXJzZVBhdGhPYmplY3QoKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0TWl0ZXJMaW1pdCgpCi17Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX0dyYXBoU3RhdGUuR2V0TW9kaWZ5KCktPm1fTWl0ZXJMaW1pdCA9IEdldE51bWJlcigwKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTWFya1BsYWNlKCkKLXsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRW5kUGF0aCgpCi17Ci0gICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEFkZFBhdGhPYmplY3QoMCwgRkFMU0UpOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TYXZlR3JhcGhTdGF0ZSgpCi17Ci0gICAgQ1BERl9BbGxTdGF0ZXMqIHBTdGF0ZXMgPSBuZXcgQ1BERl9BbGxTdGF0ZXM7Ci0gICAgcFN0YXRlcy0+Q29weSgqbV9wQ3VyU3RhdGVzKTsKLSAgICBtX1N0YXRlU3RhY2suQWRkKHBTdGF0ZXMpOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9SZXN0b3JlR3JhcGhTdGF0ZSgpCi17Ci0gICAgaW50IHNpemUgPSBtX1N0YXRlU3RhY2suR2V0U2l6ZSgpOwotICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX0FsbFN0YXRlcyogcFN0YXRlcyA9IChDUERGX0FsbFN0YXRlcyopbV9TdGF0ZVN0YWNrLkdldEF0KHNpemUgLSAxKTsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6Q1BERl9TdHJlYW1Db250ZW50UGFyc2VyKAorICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLAorICAgIENQREZfRGljdGlvbmFyeSogcFBhcmVudFJlc291cmNlcywKKyAgICBDRlhfTWF0cml4KiBwbXRDb250ZW50VG9Vc2VyLAorICAgIENQREZfUGFnZU9iamVjdHMqIHBPYmpMaXN0LAorICAgIENQREZfRGljdGlvbmFyeSogcFJlc291cmNlcywKKyAgICBDUERGX1JlY3QqIHBCQm94LAorICAgIENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucywKKyAgICBDUERGX0FsbFN0YXRlcyogcFN0YXRlcywKKyAgICBpbnQgbGV2ZWwpCisgICAgOiBtX3BEb2N1bWVudChwRG9jdW1lbnQpLAorICAgICAgbV9wUGFnZVJlc291cmNlcyhwUGFnZVJlc291cmNlcyksCisgICAgICBtX3BQYXJlbnRSZXNvdXJjZXMocFBhcmVudFJlc291cmNlcyksCisgICAgICBtX3BSZXNvdXJjZXMocFJlc291cmNlcyksCisgICAgICBtX3BPYmplY3RMaXN0KHBPYmpMaXN0KSwKKyAgICAgIG1fTGV2ZWwobGV2ZWwpLAorICAgICAgbV9QYXJhbVN0YXJ0UG9zKDApLAorICAgICAgbV9QYXJhbUNvdW50KDApLAorICAgICAgbV9wQ3VyU3RhdGVzKG5ldyBDUERGX0FsbFN0YXRlcyksCisgICAgICBtX3BMYXN0VGV4dE9iamVjdChudWxscHRyKSwKKyAgICAgIG1fRGVmRm9udFNpemUoMCksCisgICAgICBtX3BQYXRoUG9pbnRzKG51bGxwdHIpLAorICAgICAgbV9QYXRoUG9pbnRDb3VudCgwKSwKKyAgICAgIG1fUGF0aEFsbG9jU2l6ZSgwKSwKKyAgICAgIG1fUGF0aEN1cnJlbnRYKDAuMGYpLAorICAgICAgbV9QYXRoQ3VycmVudFkoMC4wZiksCisgICAgICBtX1BhdGhDbGlwVHlwZSgwKSwKKyAgICAgIG1fcExhc3RJbWFnZShudWxscHRyKSwKKyAgICAgIG1fcExhc3RJbWFnZURpY3QobnVsbHB0ciksCisgICAgICBtX3BMYXN0Q2xvbmVJbWFnZURpY3QobnVsbHB0ciksCisgICAgICBtX2JSZWxlYXNlTGFzdERpY3QoVFJVRSksCisgICAgICBtX2JDb2xvcmVkKEZBTFNFKSwKKyAgICAgIG1fYlJlc291cmNlTWlzc2luZyhGQUxTRSkgeworICBpZiAocG10Q29udGVudFRvVXNlcikgeworICAgIG1fbXRDb250ZW50VG9Vc2VyID0gKnBtdENvbnRlbnRUb1VzZXI7CisgIH0KKyAgaWYgKHBPcHRpb25zKSB7CisgICAgbV9PcHRpb25zID0gKnBPcHRpb25zOworICB9CisgIGlmICghbV9wUmVzb3VyY2VzKSB7CisgICAgbV9wUmVzb3VyY2VzID0gbV9wUGFyZW50UmVzb3VyY2VzOworICB9CisgIGlmICghbV9wUmVzb3VyY2VzKSB7CisgICAgbV9wUmVzb3VyY2VzID0gbV9wUGFnZVJlc291cmNlczsKKyAgfQorICBpZiAocEJCb3gpIHsKKyAgICBtX0JCb3ggPSAqcEJCb3g7CisgIH0KKyAgaWYgKHBTdGF0ZXMpIHsKICAgICBtX3BDdXJTdGF0ZXMtPkNvcHkoKnBTdGF0ZXMpOwotICAgIGRlbGV0ZSBwU3RhdGVzOwotICAgIG1fU3RhdGVTdGFjay5SZW1vdmVBdChzaXplIC0gMSk7CisgIH0gZWxzZSB7CisgICAgbV9wQ3VyU3RhdGVzLT5tX0dlbmVyYWxTdGF0ZS5OZXcoKTsKKyAgICBtX3BDdXJTdGF0ZXMtPm1fR3JhcGhTdGF0ZS5OZXcoKTsKKyAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlLk5ldygpOworICAgIG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlLk5ldygpOworICB9CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKG1fVHlwZTNEYXRhKTsgKytpKSB7CisgICAgbV9UeXBlM0RhdGFbaV0gPSAwLjA7CisgIH0KIH0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfUmVjdGFuZ2xlKCkKLXsKLSAgICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfRkxPQVQgeCA9IEdldE51bWJlcigzKSwgeSA9IEdldE51bWJlcigyKTsKLSAgICBGWF9GTE9BVCB3ID0gR2V0TnVtYmVyKDEpLCBoID0gR2V0TnVtYmVyKDApOwotICAgIEFkZFBhdGhSZWN0KHgsIHksIHcsIGgpOworCitDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6On5DUERGX1N0cmVhbUNvbnRlbnRQYXJzZXIoKSB7CisgIENsZWFyQWxsUGFyYW1zKCk7CisgIEZYX0ZyZWUobV9wUGF0aFBvaW50cyk7CisgIGlmIChtX3BMYXN0SW1hZ2VEaWN0KSB7CisgICAgbV9wTGFzdEltYWdlRGljdC0+UmVsZWFzZSgpOworICB9CisgIGlmIChtX3BMYXN0Q2xvbmVJbWFnZURpY3QpIHsKKyAgICBtX3BMYXN0Q2xvbmVJbWFnZURpY3QtPlJlbGVhc2UoKTsKKyAgfQogfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkFkZFBhdGhSZWN0KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIHcsIEZYX0ZMT0FUIGgpCi17Ci0gICAgQWRkUGF0aFBvaW50KHgsIHksIEZYUFRfTU9WRVRPKTsKLSAgICBBZGRQYXRoUG9pbnQoeCArIHcsIHksIEZYUFRfTElORVRPKTsKLSAgICBBZGRQYXRoUG9pbnQoeCArIHcsIHkgKyBoLCBGWFBUX0xJTkVUTyk7Ci0gICAgQWRkUGF0aFBvaW50KHgsIHkgKyBoLCBGWFBUX0xJTkVUTyk7Ci0gICAgQWRkUGF0aFBvaW50KHgsIHksIEZYUFRfTElORVRPIHwgRlhQVF9DTE9TRUZJR1VSRSk7CitpbnQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpHZXROZXh0UGFyYW1Qb3MoKSB7CisgIGlmIChtX1BhcmFtQ291bnQgPT0gUEFSQU1fQlVGX1NJWkUpIHsKKyAgICBtX1BhcmFtU3RhcnRQb3MrKzsKKyAgICBpZiAobV9QYXJhbVN0YXJ0UG9zID09IFBBUkFNX0JVRl9TSVpFKSB7CisgICAgICBtX1BhcmFtU3RhcnRQb3MgPSAwOworICAgIH0KKyAgICBpZiAobV9QYXJhbUJ1ZjFbbV9QYXJhbVN0YXJ0UG9zXS5tX1R5cGUgPT0gMCkgeworICAgICAgaWYgKENQREZfT2JqZWN0KiBwT2JqZWN0ID0gbV9QYXJhbUJ1ZjFbbV9QYXJhbVN0YXJ0UG9zXS5tX3BPYmplY3QpCisgICAgICAgIHBPYmplY3QtPlJlbGVhc2UoKTsKKyAgICB9CisgICAgcmV0dXJuIG1fUGFyYW1TdGFydFBvczsKKyAgfQorICBpbnQgaW5kZXggPSBtX1BhcmFtU3RhcnRQb3MgKyBtX1BhcmFtQ291bnQ7CisgIGlmIChpbmRleCA+PSBQQVJBTV9CVUZfU0laRSkgeworICAgIGluZGV4IC09IFBBUkFNX0JVRl9TSVpFOworICB9CisgIG1fUGFyYW1Db3VudCsrOworICByZXR1cm4gaW5kZXg7CiB9Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldFJHQkNvbG9yX0ZpbGwoKQotewotICAgIFJFUVVJUkVfUEFSQU1TKDMpOwotICAgIEZYX0ZMT0FUIHZhbHVlc1szXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkgKyspIHsKLSAgICAgICAgdmFsdWVzW2ldID0gR2V0TnVtYmVyKDIgLSBpKTsKLSAgICB9Ci0gICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFUkdCKTsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5TZXRGaWxsQ29sb3IocENTLCB2YWx1ZXMsIDMpOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRSR0JDb2xvcl9TdHJva2UoKQotewotICAgIFJFUVVJUkVfUEFSQU1TKDMpOwotICAgIEZYX0ZMT0FUIHZhbHVlc1szXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkgKyspIHsKLSAgICAgICAgdmFsdWVzW2ldID0gR2V0TnVtYmVyKDIgLSBpKTsKLSAgICB9Ci0gICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFUkdCKTsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5TZXRTdHJva2VDb2xvcihwQ1MsIHZhbHVlcywgMyk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldFJlbmRlckludGVudCgpCi17Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0Nsb3NlU3Ryb2tlUGF0aCgpCi17Ci0gICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEhhbmRsZV9DbG9zZVBhdGgoKTsKLSAgICBBZGRQYXRoT2JqZWN0KDAsIFRSVUUpOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TdHJva2VQYXRoKCkKLXsKLSAgICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQWRkUGF0aE9iamVjdCgwLCBUUlVFKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q29sb3JfRmlsbCgpCi17Ci0gICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYX0ZMT0FUIHZhbHVlc1s0XTsKLSAgICBpbnQgbmFyZ3MgPSBtX1BhcmFtQ291bnQ7Ci0gICAgaWYgKG5hcmdzID4gNCkgewotICAgICAgICBuYXJncyA9IDQ7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFyZ3M7IGkgKyspIHsKLSAgICAgICAgdmFsdWVzW2ldID0gR2V0TnVtYmVyKG5hcmdzIC0gaSAtIDEpOwotICAgIH0KLSAgICBtX3BDdXJTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5TZXRGaWxsQ29sb3IoTlVMTCwgdmFsdWVzLCBuYXJncyk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENvbG9yX1N0cm9rZSgpCi17Ci0gICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYX0ZMT0FUIHZhbHVlc1s0XTsKLSAgICBpbnQgbmFyZ3MgPSBtX1BhcmFtQ291bnQ7Ci0gICAgaWYgKG5hcmdzID4gNCkgewotICAgICAgICBuYXJncyA9IDQ7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFyZ3M7IGkgKyspIHsKLSAgICAgICAgdmFsdWVzW2ldID0gR2V0TnVtYmVyKG5hcmdzIC0gaSAtIDEpOwotICAgIH0KLSAgICBtX3BDdXJTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5TZXRTdHJva2VDb2xvcihOVUxMLCB2YWx1ZXMsIG5hcmdzKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q29sb3JQU19GaWxsKCkKLXsKLSAgICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBMYXN0UGFyYW0gPSBHZXRPYmplY3QoMCk7Ci0gICAgaWYgKHBMYXN0UGFyYW0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludCBuYXJncyA9IG1fUGFyYW1Db3VudDsKLSAgICBpbnQgbnZhbHVlcyA9IG5hcmdzOwotICAgIGlmIChwTGFzdFBhcmFtLT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKLSAgICAgICAgbnZhbHVlcyAtLTsKLSAgICB9Ci0gICAgRlhfRkxPQVQqIHZhbHVlcyA9IE5VTEw7Ci0gICAgaWYgKG52YWx1ZXMpIHsKLSAgICAgICAgdmFsdWVzID0gRlhfQWxsb2MoRlhfRkxPQVQsIG52YWx1ZXMpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG52YWx1ZXM7IGkgKyspIHsKLSAgICAgICAgICAgIHZhbHVlc1tpXSA9IEdldE51bWJlcihuYXJncyAtIGkgLSAxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobnZhbHVlcyAhPSBuYXJncykgewotICAgICAgICBDUERGX1BhdHRlcm4qIHBQYXR0ZXJuID0gRmluZFBhdHRlcm4oR2V0U3RyaW5nKDApLCBGQUxTRSk7Ci0gICAgICAgIGlmIChwUGF0dGVybikgewotICAgICAgICAgICAgbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGUuU2V0RmlsbFBhdHRlcm4ocFBhdHRlcm4sIHZhbHVlcywgbnZhbHVlcyk7Ci0gICAgICAgIH0KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGROYW1lUGFyYW0oY29uc3QgRlhfQ0hBUiogbmFtZSwgaW50IGxlbikgeworICBpbnQgaW5kZXggPSBHZXROZXh0UGFyYW1Qb3MoKTsKKyAgaWYgKGxlbiA+IDMyKSB7CisgICAgbV9QYXJhbUJ1ZjFbaW5kZXhdLm1fVHlwZSA9IDA7CisgICAgbV9QYXJhbUJ1ZjFbaW5kZXhdLm1fcE9iamVjdCA9CisgICAgICAgIG5ldyBDUERGX05hbWUoUERGX05hbWVEZWNvZGUoQ0ZYX0J5dGVTdHJpbmdDKG5hbWUsIGxlbikpKTsKKyAgfSBlbHNlIHsKKyAgICBtX1BhcmFtQnVmMVtpbmRleF0ubV9UeXBlID0gUERGT0JKX05BTUU7CisgICAgaWYgKCFGWFNZU19tZW1jaHIobmFtZSwgJyMnLCBsZW4pKSB7CisgICAgICBGWFNZU19tZW1jcHkobV9QYXJhbUJ1ZjFbaW5kZXhdLm1fTmFtZS5tX0J1ZmZlciwgbmFtZSwgbGVuKTsKKyAgICAgIG1fUGFyYW1CdWYxW2luZGV4XS5tX05hbWUubV9MZW4gPSBsZW47CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGUuU2V0RmlsbENvbG9yKE5VTEwsIHZhbHVlcywgbnZhbHVlcyk7CisgICAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBQREZfTmFtZURlY29kZShDRlhfQnl0ZVN0cmluZ0MobmFtZSwgbGVuKSk7CisgICAgICBGWFNZU19tZW1jcHkobV9QYXJhbUJ1ZjFbaW5kZXhdLm1fTmFtZS5tX0J1ZmZlciwgc3RyLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgc3RyLkdldExlbmd0aCgpKTsKKyAgICAgIG1fUGFyYW1CdWYxW2luZGV4XS5tX05hbWUubV9MZW4gPSBzdHIuR2V0TGVuZ3RoKCk7CiAgICAgfQotICAgIGlmICh2YWx1ZXMpIHsKLSAgICAgICAgRlhfRnJlZSh2YWx1ZXMpOwotICAgIH0KKyAgfQogfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDb2xvclBTX1N0cm9rZSgpCi17Ci0gICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewotICAgICAgICByZXR1cm47Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6QWRkTnVtYmVyUGFyYW0oY29uc3QgRlhfQ0hBUiogc3RyLCBpbnQgbGVuKSB7CisgIGludCBpbmRleCA9IEdldE5leHRQYXJhbVBvcygpOworICBtX1BhcmFtQnVmMVtpbmRleF0ubV9UeXBlID0gUERGT0JKX05VTUJFUjsKKyAgRlhfYXRvbnVtKENGWF9CeXRlU3RyaW5nQyhzdHIsIGxlbiksIG1fUGFyYW1CdWYxW2luZGV4XS5tX051bWJlci5tX2JJbnRlZ2VyLAorICAgICAgICAgICAgJm1fUGFyYW1CdWYxW2luZGV4XS5tX051bWJlci5tX0ludGVnZXIpOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkFkZE9iamVjdFBhcmFtKENQREZfT2JqZWN0KiBwT2JqKSB7CisgIGludCBpbmRleCA9IEdldE5leHRQYXJhbVBvcygpOworICBtX1BhcmFtQnVmMVtpbmRleF0ubV9UeXBlID0gMDsKKyAgbV9QYXJhbUJ1ZjFbaW5kZXhdLm1fcE9iamVjdCA9IHBPYmo7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6Q2xlYXJBbGxQYXJhbXMoKSB7CisgIEZYX0RXT1JEIGluZGV4ID0gbV9QYXJhbVN0YXJ0UG9zOworICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgbV9QYXJhbUNvdW50OyBpKyspIHsKKyAgICBpZiAobV9QYXJhbUJ1ZjFbaW5kZXhdLm1fVHlwZSA9PSAwKSB7CisgICAgICBpZiAoQ1BERl9PYmplY3QqIHBPYmplY3QgPSBtX1BhcmFtQnVmMVtpbmRleF0ubV9wT2JqZWN0KQorICAgICAgICBwT2JqZWN0LT5SZWxlYXNlKCk7CiAgICAgfQotICAgIENQREZfT2JqZWN0KiBwTGFzdFBhcmFtID0gR2V0T2JqZWN0KDApOwotICAgIGlmIChwTGFzdFBhcmFtID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOworICAgIGluZGV4Kys7CisgICAgaWYgKGluZGV4ID09IFBBUkFNX0JVRl9TSVpFKSB7CisgICAgICBpbmRleCA9IDA7CiAgICAgfQotICAgIGludCBuYXJncyA9IG1fUGFyYW1Db3VudDsKLSAgICBpbnQgbnZhbHVlcyA9IG5hcmdzOwotICAgIGlmIChwTGFzdFBhcmFtLT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKLSAgICAgICAgbnZhbHVlcyAtLTsKKyAgfQorICBtX1BhcmFtU3RhcnRQb3MgPSAwOworICBtX1BhcmFtQ291bnQgPSAwOworfQorQ1BERl9PYmplY3QqIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6R2V0T2JqZWN0KEZYX0RXT1JEIGluZGV4KSB7CisgIGlmIChpbmRleCA+PSBtX1BhcmFtQ291bnQpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpbnQgcmVhbF9pbmRleCA9IG1fUGFyYW1TdGFydFBvcyArIG1fUGFyYW1Db3VudCAtIGluZGV4IC0gMTsKKyAgaWYgKHJlYWxfaW5kZXggPj0gUEFSQU1fQlVGX1NJWkUpIHsKKyAgICByZWFsX2luZGV4IC09IFBBUkFNX0JVRl9TSVpFOworICB9CisgIENvbnRlbnRQYXJhbSYgcGFyYW0gPSBtX1BhcmFtQnVmMVtyZWFsX2luZGV4XTsKKyAgaWYgKHBhcmFtLm1fVHlwZSA9PSBQREZPQkpfTlVNQkVSKSB7CisgICAgQ1BERl9OdW1iZXIqIHBOdW1iZXIgPSBwYXJhbS5tX051bWJlci5tX2JJbnRlZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgQ1BERl9OdW1iZXIocGFyYW0ubV9OdW1iZXIubV9JbnRlZ2VyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IENQREZfTnVtYmVyKHBhcmFtLm1fTnVtYmVyLm1fRmxvYXQpOworCisgICAgcGFyYW0ubV9UeXBlID0gMDsKKyAgICBwYXJhbS5tX3BPYmplY3QgPSBwTnVtYmVyOworICAgIHJldHVybiBwTnVtYmVyOworICB9CisgIGlmIChwYXJhbS5tX1R5cGUgPT0gUERGT0JKX05BTUUpIHsKKyAgICBDUERGX05hbWUqIHBOYW1lID0gbmV3IENQREZfTmFtZSgKKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcocGFyYW0ubV9OYW1lLm1fQnVmZmVyLCBwYXJhbS5tX05hbWUubV9MZW4pKTsKKyAgICBwYXJhbS5tX1R5cGUgPSAwOworICAgIHBhcmFtLm1fcE9iamVjdCA9IHBOYW1lOworICAgIHJldHVybiBwTmFtZTsKKyAgfQorICBpZiAocGFyYW0ubV9UeXBlID09IDApIHsKKyAgICByZXR1cm4gcGFyYW0ubV9wT2JqZWN0OworICB9CisgIEFTU0VSVChGQUxTRSk7CisgIHJldHVybiBOVUxMOworfQorQ0ZYX0J5dGVTdHJpbmcgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpHZXRTdHJpbmcoRlhfRFdPUkQgaW5kZXgpIHsKKyAgaWYgKGluZGV4ID49IG1fUGFyYW1Db3VudCkgeworICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOworICB9CisgIGludCByZWFsX2luZGV4ID0gbV9QYXJhbVN0YXJ0UG9zICsgbV9QYXJhbUNvdW50IC0gaW5kZXggLSAxOworICBpZiAocmVhbF9pbmRleCA+PSBQQVJBTV9CVUZfU0laRSkgeworICAgIHJlYWxfaW5kZXggLT0gUEFSQU1fQlVGX1NJWkU7CisgIH0KKyAgQ29udGVudFBhcmFtJiBwYXJhbSA9IG1fUGFyYW1CdWYxW3JlYWxfaW5kZXhdOworICBpZiAocGFyYW0ubV9UeXBlID09IFBERk9CSl9OQU1FKSB7CisgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKHBhcmFtLm1fTmFtZS5tX0J1ZmZlciwgcGFyYW0ubV9OYW1lLm1fTGVuKTsKKyAgfQorICBpZiAocGFyYW0ubV9UeXBlID09IDAgJiYgcGFyYW0ubV9wT2JqZWN0KSB7CisgICAgcmV0dXJuIHBhcmFtLm1fcE9iamVjdC0+R2V0U3RyaW5nKCk7CisgIH0KKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Cit9CitGWF9GTE9BVCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkdldE51bWJlcihGWF9EV09SRCBpbmRleCkgeworICBpZiAoaW5kZXggPj0gbV9QYXJhbUNvdW50KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaW50IHJlYWxfaW5kZXggPSBtX1BhcmFtU3RhcnRQb3MgKyBtX1BhcmFtQ291bnQgLSBpbmRleCAtIDE7CisgIGlmIChyZWFsX2luZGV4ID49IFBBUkFNX0JVRl9TSVpFKSB7CisgICAgcmVhbF9pbmRleCAtPSBQQVJBTV9CVUZfU0laRTsKKyAgfQorICBDb250ZW50UGFyYW0mIHBhcmFtID0gbV9QYXJhbUJ1ZjFbcmVhbF9pbmRleF07CisgIGlmIChwYXJhbS5tX1R5cGUgPT0gUERGT0JKX05VTUJFUikgeworICAgIHJldHVybiBwYXJhbS5tX051bWJlci5tX2JJbnRlZ2VyID8gKEZYX0ZMT0FUKXBhcmFtLm1fTnVtYmVyLm1fSW50ZWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcGFyYW0ubV9OdW1iZXIubV9GbG9hdDsKKyAgfQorICBpZiAocGFyYW0ubV9UeXBlID09IDAgJiYgcGFyYW0ubV9wT2JqZWN0KSB7CisgICAgcmV0dXJuIHBhcmFtLm1fcE9iamVjdC0+R2V0TnVtYmVyKCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CitGWF9GTE9BVCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkdldE51bWJlcjE2KEZYX0RXT1JEIGluZGV4KSB7CisgIHJldHVybiBHZXROdW1iZXIoaW5kZXgpOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OlNldEdyYXBoaWNTdGF0ZXMoQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiR3JhcGgpIHsKKyAgcE9iai0+bV9HZW5lcmFsU3RhdGUgPSBtX3BDdXJTdGF0ZXMtPm1fR2VuZXJhbFN0YXRlOworICBwT2JqLT5tX0NsaXBQYXRoID0gbV9wQ3VyU3RhdGVzLT5tX0NsaXBQYXRoOworICBwT2JqLT5tX0NvbnRlbnRNYXJrID0gbV9DdXJDb250ZW50TWFyazsKKyAgaWYgKGJDb2xvcikgeworICAgIHBPYmotPm1fQ29sb3JTdGF0ZSA9IG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlOworICB9CisgIGlmIChiR3JhcGgpIHsKKyAgICBwT2JqLT5tX0dyYXBoU3RhdGUgPSBtX3BDdXJTdGF0ZXMtPm1fR3JhcGhTdGF0ZTsKKyAgfQorICBpZiAoYlRleHQpIHsKKyAgICBwT2JqLT5tX1RleHRTdGF0ZSA9IG1fcEN1clN0YXRlcy0+bV9UZXh0U3RhdGU7CisgIH0KK30KKworY29uc3QgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpPcENvZGUgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpnX09wQ29kZXNbXSA9IHsKKyAgICB7RlhCU1RSX0lEKCciJywgMCwgMCwgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9OZXh0TGluZVNob3dUZXh0X1NwYWNlfSwKKyAgICB7RlhCU1RSX0lEKCdcJycsIDAsIDAsIDApLAorICAgICAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTmV4dExpbmVTaG93VGV4dH0sCisgICAge0ZYQlNUUl9JRCgnQicsIDAsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRmlsbFN0cm9rZVBhdGh9LAorICAgIHtGWEJTVFJfSUQoJ0InLCAnKicsIDAsIDApLAorICAgICAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRU9GaWxsU3Ryb2tlUGF0aH0sCisgICAge0ZYQlNUUl9JRCgnQicsICdEJywgJ0MnLCAwKSwKKyAgICAgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0JlZ2luTWFya2VkQ29udGVudF9EaWN0aW9uYXJ5fSwKKyAgICB7RlhCU1RSX0lEKCdCJywgJ0knLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0JlZ2luSW1hZ2V9LAorICAgIHtGWEJTVFJfSUQoJ0InLCAnTScsICdDJywgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9CZWdpbk1hcmtlZENvbnRlbnR9LAorICAgIHtGWEJTVFJfSUQoJ0InLCAnVCcsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQmVnaW5UZXh0fSwKKyAgICB7RlhCU1RSX0lEKCdCJywgJ1gnLCAwLCAwKSwKKyAgICAgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0JlZ2luU2VjdGlvblVuZGVmaW5lZH0sCisgICAge0ZYQlNUUl9JRCgnQycsICdTJywgMCwgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDb2xvclNwYWNlX1N0cm9rZX0sCisgICAge0ZYQlNUUl9JRCgnRCcsICdQJywgMCwgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9NYXJrUGxhY2VfRGljdGlvbmFyeX0sCisgICAge0ZYQlNUUl9JRCgnRCcsICdvJywgMCwgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FeGVjdXRlWE9iamVjdH0sCisgICAge0ZYQlNUUl9JRCgnRScsICdJJywgMCwgMCksICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FbmRJbWFnZX0sCisgICAge0ZYQlNUUl9JRCgnRScsICdNJywgJ0MnLCAwKSwKKyAgICAgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0VuZE1hcmtlZENvbnRlbnR9LAorICAgIHtGWEJTVFJfSUQoJ0UnLCAnVCcsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRW5kVGV4dH0sCisgICAge0ZYQlNUUl9JRCgnRScsICdYJywgMCwgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FbmRTZWN0aW9uVW5kZWZpbmVkfSwKKyAgICB7RlhCU1RSX0lEKCdGJywgMCwgMCwgMCksICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9GaWxsUGF0aE9sZH0sCisgICAge0ZYQlNUUl9JRCgnRycsIDAsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0R3JheV9TdHJva2V9LAorICAgIHtGWEJTVFJfSUQoJ0knLCAnRCcsIDAsIDApLAorICAgICAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQmVnaW5JbWFnZURhdGF9LAorICAgIHtGWEJTVFJfSUQoJ0onLCAwLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldExpbmVDYXB9LAorICAgIHtGWEJTVFJfSUQoJ0snLCAwLCAwLCAwKSwKKyAgICAgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENNWUtDb2xvcl9TdHJva2V9LAorICAgIHtGWEJTVFJfSUQoJ00nLCAwLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldE1pdGVyTGltaXR9LAorICAgIHtGWEJTVFJfSUQoJ00nLCAnUCcsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTWFya1BsYWNlfSwKKyAgICB7RlhCU1RSX0lEKCdRJywgMCwgMCwgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9SZXN0b3JlR3JhcGhTdGF0ZX0sCisgICAge0ZYQlNUUl9JRCgnUicsICdHJywgMCwgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRSR0JDb2xvcl9TdHJva2V9LAorICAgIHtGWEJTVFJfSUQoJ1MnLCAwLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1N0cm9rZVBhdGh9LAorICAgIHtGWEJTVFJfSUQoJ1MnLCAnQycsIDAsIDApLAorICAgICAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q29sb3JfU3Ryb2tlfSwKKyAgICB7RlhCU1RSX0lEKCdTJywgJ0MnLCAnTicsIDApLAorICAgICAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q29sb3JQU19TdHJva2V9LAorICAgIHtGWEJTVFJfSUQoJ1QnLCAnKicsIDAsIDApLAorICAgICAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTW92ZVRvTmV4dExpbmV9LAorICAgIHtGWEJTVFJfSUQoJ1QnLCAnRCcsIDAsIDApLAorICAgICAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTW92ZVRleHRQb2ludF9TZXRMZWFkaW5nfSwKKyAgICB7RlhCU1RSX0lEKCdUJywgJ0onLCAwLCAwKSwKKyAgICAgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1Nob3dUZXh0X1Bvc2l0aW9uaW5nfSwKKyAgICB7RlhCU1RSX0lEKCdUJywgJ0wnLCAwLCAwKSwKKyAgICAgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldFRleHRMZWFkaW5nfSwKKyAgICB7RlhCU1RSX0lEKCdUJywgJ2MnLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENoYXJTcGFjZX0sCisgICAge0ZYQlNUUl9JRCgnVCcsICdkJywgMCwgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9Nb3ZlVGV4dFBvaW50fSwKKyAgICB7RlhCU1RSX0lEKCdUJywgJ2YnLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldEZvbnR9LAorICAgIHtGWEJTVFJfSUQoJ1QnLCAnaicsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2hvd1RleHR9LAorICAgIHtGWEJTVFJfSUQoJ1QnLCAnbScsIDAsIDApLAorICAgICAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0VGV4dE1hdHJpeH0sCisgICAge0ZYQlNUUl9JRCgnVCcsICdyJywgMCwgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRUZXh0UmVuZGVyTW9kZX0sCisgICAge0ZYQlNUUl9JRCgnVCcsICdzJywgMCwgMCksICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRUZXh0UmlzZX0sCisgICAge0ZYQlNUUl9JRCgnVCcsICd3JywgMCwgMCksICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRXb3JkU3BhY2V9LAorICAgIHtGWEJTVFJfSUQoJ1QnLCAneicsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0SG9yelNjYWxlfSwKKyAgICB7RlhCU1RSX0lEKCdXJywgMCwgMCwgMCksICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9DbGlwfSwKKyAgICB7RlhCU1RSX0lEKCdXJywgJyonLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0VPQ2xpcH0sCisgICAge0ZYQlNUUl9JRCgnYicsIDAsIDAsIDApLAorICAgICAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQ2xvc2VGaWxsU3Ryb2tlUGF0aH0sCisgICAge0ZYQlNUUl9JRCgnYicsICcqJywgMCwgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9DbG9zZUVPRmlsbFN0cm9rZVBhdGh9LAorICAgIHtGWEJTVFJfSUQoJ2MnLCAwLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0N1cnZlVG9fMTIzfSwKKyAgICB7RlhCU1RSX0lEKCdjJywgJ20nLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0NvbmNhdE1hdHJpeH0sCisgICAge0ZYQlNUUl9JRCgnYycsICdzJywgMCwgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDb2xvclNwYWNlX0ZpbGx9LAorICAgIHtGWEJTVFJfSUQoJ2QnLCAwLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldERhc2h9LAorICAgIHtGWEJTVFJfSUQoJ2QnLCAnMCcsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q2hhcldpZHRofSwKKyAgICB7RlhCU1RSX0lEKCdkJywgJzEnLCAwLCAwKSwKKyAgICAgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENhY2hlZERldmljZX0sCisgICAge0ZYQlNUUl9JRCgnZicsIDAsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRmlsbFBhdGh9LAorICAgIHtGWEJTVFJfSUQoJ2YnLCAnKicsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRU9GaWxsUGF0aH0sCisgICAge0ZYQlNUUl9JRCgnZycsIDAsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0R3JheV9GaWxsfSwKKyAgICB7RlhCU1RSX0lEKCdnJywgJ3MnLCAwLCAwKSwKKyAgICAgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldEV4dGVuZEdyYXBoU3RhdGV9LAorICAgIHtGWEJTVFJfSUQoJ2gnLCAwLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0Nsb3NlUGF0aH0sCisgICAge0ZYQlNUUl9JRCgnaScsIDAsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0RmxhdH0sCisgICAge0ZYQlNUUl9JRCgnaicsIDAsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0TGluZUpvaW59LAorICAgIHtGWEJTVFJfSUQoJ2snLCAwLCAwLCAwKSwKKyAgICAgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENNWUtDb2xvcl9GaWxsfSwKKyAgICB7RlhCU1RSX0lEKCdsJywgMCwgMCwgMCksICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9MaW5lVG99LAorICAgIHtGWEJTVFJfSUQoJ20nLCAwLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX01vdmVUb30sCisgICAge0ZYQlNUUl9JRCgnbicsIDAsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRW5kUGF0aH0sCisgICAge0ZYQlNUUl9JRCgncScsIDAsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2F2ZUdyYXBoU3RhdGV9LAorICAgIHtGWEJTVFJfSUQoJ3InLCAnZScsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfUmVjdGFuZ2xlfSwKKyAgICB7RlhCU1RSX0lEKCdyJywgJ2cnLCAwLCAwKSwKKyAgICAgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldFJHQkNvbG9yX0ZpbGx9LAorICAgIHtGWEJTVFJfSUQoJ3InLCAnaScsIDAsIDApLAorICAgICAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0UmVuZGVySW50ZW50fSwKKyAgICB7RlhCU1RSX0lEKCdzJywgMCwgMCwgMCksCisgICAgICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9DbG9zZVN0cm9rZVBhdGh9LAorICAgIHtGWEJTVFJfSUQoJ3MnLCAnYycsIDAsIDApLAorICAgICAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q29sb3JfRmlsbH0sCisgICAge0ZYQlNUUl9JRCgncycsICdjJywgJ24nLCAwKSwKKyAgICAgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENvbG9yUFNfRmlsbH0sCisgICAge0ZYQlNUUl9JRCgncycsICdoJywgMCwgMCksICZDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TaGFkZUZpbGx9LAorICAgIHtGWEJTVFJfSUQoJ3YnLCAwLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0N1cnZlVG9fMjN9LAorICAgIHtGWEJTVFJfSUQoJ3cnLCAwLCAwLCAwKSwgJkNQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldExpbmVXaWR0aH0sCisgICAge0ZYQlNUUl9JRCgneScsIDAsIDAsIDApLCAmQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQ3VydmVUb18xM30sCit9OworRlhfQk9PTCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6Ok9uT3BlcmF0b3IoY29uc3QgRlhfQ0hBUiogb3ApIHsKKyAgaW50IGkgPSAwOworICBGWF9EV09SRCBvcGlkID0gMDsKKyAgd2hpbGUgKGkgPCA0ICYmIG9wW2ldKSB7CisgICAgb3BpZCA9IChvcGlkIDw8IDgpICsgb3BbaV07CisgICAgaSsrOworICB9CisgIHdoaWxlIChpIDwgNCkgeworICAgIG9waWQgPDw9IDg7CisgICAgaSsrOworICB9CisgIGludCBsb3cgPSAwLCBoaWdoID0gc2l6ZW9mIGdfT3BDb2RlcyAvIHNpemVvZihPcENvZGUpIC0gMTsKKyAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7CisgICAgaW50IG1pZGRsZSA9IChsb3cgKyBoaWdoKSAvIDI7CisgICAgaW50IGNvbXBhcmUgPSBvcGlkIC0gZ19PcENvZGVzW21pZGRsZV0ubV9PcElkOworICAgIGlmIChjb21wYXJlID09IDApIHsKKyAgICAgICh0aGlzLT4qZ19PcENvZGVzW21pZGRsZV0ubV9PcEhhbmRsZXIpKCk7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgRlhfRkxPQVQqIHZhbHVlcyA9IE5VTEw7Ci0gICAgaWYgKG52YWx1ZXMpIHsKLSAgICAgICAgdmFsdWVzID0gRlhfQWxsb2MoRlhfRkxPQVQsIG52YWx1ZXMpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG52YWx1ZXM7IGkgKyspIHsKLSAgICAgICAgICAgIHZhbHVlc1tpXSA9IEdldE51bWJlcihuYXJncyAtIGkgLSAxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobnZhbHVlcyAhPSBuYXJncykgewotICAgICAgICBDUERGX1BhdHRlcm4qIHBQYXR0ZXJuID0gRmluZFBhdHRlcm4oR2V0U3RyaW5nKDApLCBGQUxTRSk7Ci0gICAgICAgIGlmIChwUGF0dGVybikgewotICAgICAgICAgICAgbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGUuU2V0U3Ryb2tlUGF0dGVybihwUGF0dGVybiwgdmFsdWVzLCBudmFsdWVzKTsKLSAgICAgICAgfQorICAgIGlmIChjb21wYXJlIDwgMCkgeworICAgICAgaGlnaCA9IG1pZGRsZSAtIDE7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGUuU2V0U3Ryb2tlQ29sb3IoTlVMTCwgdmFsdWVzLCBudmFsdWVzKTsKKyAgICAgIGxvdyA9IG1pZGRsZSArIDE7CiAgICAgfQotICAgIGlmICh2YWx1ZXMpIHsKLSAgICAgICAgRlhfRnJlZSh2YWx1ZXMpOwotICAgIH0KKyAgfQorICByZXR1cm4gbV9Db21wYXRDb3VudCAhPSAwOwogfQotQ0ZYX0Zsb2F0UmVjdCBfR2V0U2hhZGluZ0JCb3goQ1BERl9TdHJlYW0qIHBTdHJlYW0sIGludCB0eXBlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9GdW5jdGlvbioqIHBGdW5jcywgaW50IG5GdW5jcywgQ1BERl9Db2xvclNwYWNlKiBwQ1MpOwotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TaGFkZUZpbGwoKQotewotICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX1BhdHRlcm4qIHBQYXR0ZXJuID0gRmluZFBhdHRlcm4oR2V0U3RyaW5nKDApLCBUUlVFKTsKLSAgICBpZiAocFBhdHRlcm4gPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwUGF0dGVybi0+bV9QYXR0ZXJuVHlwZSAhPSBQQVRURVJOX1NIQURJTkcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX1NoYWRpbmdQYXR0ZXJuKiBwU2hhZGluZyA9IChDUERGX1NoYWRpbmdQYXR0ZXJuKilwUGF0dGVybjsKLSAgICBpZiAoIXBTaGFkaW5nLT5tX2JTaGFkaW5nT2JqKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCFwU2hhZGluZy0+TG9hZCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9TaGFkaW5nT2JqZWN0KiBwT2JqID0gbmV3IENQREZfU2hhZGluZ09iamVjdDsKLSAgICBwT2JqLT5tX3BTaGFkaW5nID0gcFNoYWRpbmc7Ci0gICAgU2V0R3JhcGhpY1N0YXRlcyhwT2JqLCBGQUxTRSwgRkFMU0UsIEZBTFNFKTsKLSAgICBwT2JqLT5tX01hdHJpeCA9IG1fcEN1clN0YXRlcy0+bV9DVE07Ci0gICAgcE9iai0+bV9NYXRyaXguQ29uY2F0KG1fbXRDb250ZW50VG9Vc2VyKTsKLSAgICBDRlhfRmxvYXRSZWN0IGJib3g7Ci0gICAgaWYgKCFwT2JqLT5tX0NsaXBQYXRoLklzTnVsbCgpKSB7Ci0gICAgICAgIGJib3ggPSBwT2JqLT5tX0NsaXBQYXRoLkdldENsaXBCb3goKTsKLSAgICB9IGVsc2UgewotICAgICAgICBiYm94ID0gbV9CQm94OwotICAgIH0KLSAgICBpZiAocFNoYWRpbmctPm1fU2hhZGluZ1R5cGUgPj0gNCkgewotICAgICAgICBiYm94LkludGVyc2VjdChfR2V0U2hhZGluZ0JCb3goKENQREZfU3RyZWFtKilwU2hhZGluZy0+bV9wU2hhZGluZ09iaiwgcFNoYWRpbmctPm1fU2hhZGluZ1R5cGUsICZwT2JqLT5tX01hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTaGFkaW5nLT5tX3BGdW5jdGlvbnMsIHBTaGFkaW5nLT5tX25GdW5jcywgcFNoYWRpbmctPm1fcENTKSk7Ci0gICAgfQotICAgIHBPYmotPm1fTGVmdCA9IGJib3gubGVmdDsKLSAgICBwT2JqLT5tX1JpZ2h0ID0gYmJveC5yaWdodDsKLSAgICBwT2JqLT5tX1RvcCA9IGJib3gudG9wOwotICAgIHBPYmotPm1fQm90dG9tID0gYmJveC5ib3R0b207Ci0gICAgbV9wT2JqZWN0TGlzdC0+bV9PYmplY3RMaXN0LkFkZFRhaWwocE9iaik7Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0Nsb3NlRmlsbFN0cm9rZVBhdGgoKSB7CisgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgSGFuZGxlX0Nsb3NlUGF0aCgpOworICBBZGRQYXRoT2JqZWN0KEZYRklMTF9XSU5ESU5HLCBUUlVFKTsKIH0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q2hhclNwYWNlKCkKLXsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlLkdldE1vZGlmeSgpLT5tX0NoYXJTcGFjZSA9IEdldE51bWJlcigwKTsKK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRmlsbFN0cm9rZVBhdGgoKSB7CisgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQWRkUGF0aE9iamVjdChGWEZJTExfV0lORElORywgVFJVRSk7CiB9Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX01vdmVUZXh0UG9pbnQoKQotewotICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0TGluZVggKz0gR2V0TnVtYmVyKDEpOwotICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0TGluZVkgKz0gR2V0TnVtYmVyKDApOwotICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0WCA9IG1fcEN1clN0YXRlcy0+bV9UZXh0TGluZVg7Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRZID0gbV9wQ3VyU3RhdGVzLT5tX1RleHRMaW5lWTsKK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQ2xvc2VFT0ZpbGxTdHJva2VQYXRoKCkgeworICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7CisgICAgcmV0dXJuOworICB9CisgIEFkZFBhdGhQb2ludChtX1BhdGhTdGFydFgsIG1fUGF0aFN0YXJ0WSwgRlhQVF9MSU5FVE8gfCBGWFBUX0NMT1NFRklHVVJFKTsKKyAgQWRkUGF0aE9iamVjdChGWEZJTExfQUxURVJOQVRFLCBUUlVFKTsKIH0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTW92ZVRleHRQb2ludF9TZXRMZWFkaW5nKCkKLXsKLSAgICBIYW5kbGVfTW92ZVRleHRQb2ludCgpOwotICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0TGVhZGluZyA9IC1HZXROdW1iZXIoMCk7Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0VPRmlsbFN0cm9rZVBhdGgoKSB7CisgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQWRkUGF0aE9iamVjdChGWEZJTExfQUxURVJOQVRFLCBUUlVFKTsKIH0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Rm9udCgpCi17Ci0gICAgRlhfRkxPQVQgZnMgPSBHZXROdW1iZXIoMCk7Ci0gICAgaWYgKGZzID09IDApIHsKLSAgICAgICAgZnMgPSBtX0RlZkZvbnRTaXplOwotICAgIH0KLSAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlLkdldE1vZGlmeSgpLT5tX0ZvbnRTaXplID0gZnM7Ci0gICAgQ1BERl9Gb250KiBwRm9udCA9IEZpbmRGb250KEdldFN0cmluZygxKSk7Ci0gICAgaWYgKHBGb250KSB7Ci0gICAgICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0U3RhdGUuU2V0Rm9udChwRm9udCk7Ci0gICAgfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9CZWdpbk1hcmtlZENvbnRlbnRfRGljdGlvbmFyeSgpIHsKKyAgaWYgKCFtX09wdGlvbnMubV9iTWFya2VkQ29udGVudCkgeworICAgIHJldHVybjsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyB0YWcgPSBHZXRTdHJpbmcoMSk7CisgIENQREZfT2JqZWN0KiBwUHJvcGVydHkgPSBHZXRPYmplY3QoMCk7CisgIGlmICghcFByb3BlcnR5KSB7CisgICAgcmV0dXJuOworICB9CisgIEZYX0JPT0wgYkRpcmVjdCA9IFRSVUU7CisgIGlmIChwUHJvcGVydHktPklzTmFtZSgpKSB7CisgICAgcFByb3BlcnR5ID0gRmluZFJlc291cmNlT2JqKCJQcm9wZXJ0aWVzIiwgcFByb3BlcnR5LT5HZXRTdHJpbmcoKSk7CisgICAgaWYgKCFwUHJvcGVydHkpCisgICAgICByZXR1cm47CisgICAgYkRpcmVjdCA9IEZBTFNFOworICB9CisgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFByb3BlcnR5LT5Bc0RpY3Rpb25hcnkoKSkgeworICAgIG1fQ3VyQ29udGVudE1hcmsuR2V0TW9kaWZ5KCktPkFkZE1hcmsodGFnLCBwRGljdCwgYkRpcmVjdCk7CisgIH0KIH0KLUNQREZfT2JqZWN0KiBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkZpbmRSZXNvdXJjZU9iaihGWF9CU1RSIHR5cGUsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKQotewotICAgIGlmIChtX3BSZXNvdXJjZXMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKG1fcFJlc291cmNlcyA9PSBtX3BQYWdlUmVzb3VyY2VzKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcExpc3QgPSBtX3BSZXNvdXJjZXMtPkdldERpY3QodHlwZSk7Ci0gICAgICAgIGlmIChwTGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQmVnaW5NYXJrZWRDb250ZW50KCkgeworICBpZiAoIW1fT3B0aW9ucy5tX2JNYXJrZWRDb250ZW50KSB7CisgICAgcmV0dXJuOworICB9CisgIENGWF9CeXRlU3RyaW5nIHRhZyA9IEdldFN0cmluZygwKTsKKyAgbV9DdXJDb250ZW50TWFyay5HZXRNb2RpZnkoKS0+QWRkTWFyayh0YWcsIE5VTEwsIEZBTFNFKTsKK30KKwordm9pZCBQREZfUmVwbGFjZUFiYnIoQ1BERl9PYmplY3QqIHBPYmopIHsKKyAgc3dpdGNoIChwT2JqLT5HZXRUeXBlKCkpIHsKKyAgICBjYXNlIFBERk9CSl9ESUNUSU9OQVJZOiB7CisgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcE9iai0+QXNEaWN0aW9uYXJ5KCk7CisgICAgICBzdGQ6OnZlY3RvcjxBYmJyUmVwbGFjZW1lbnRPcD4gcmVwbGFjZW1lbnRzOworICAgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6ICpwRGljdCkgeworICAgICAgICBDRlhfQnl0ZVN0cmluZyBrZXkgPSBpdC5maXJzdDsKKyAgICAgICAgQ1BERl9PYmplY3QqIHZhbHVlID0gaXQuc2Vjb25kOworICAgICAgICBDRlhfQnl0ZVN0cmluZ0MgZnVsbG5hbWUgPSBQREZfRmluZEZ1bGxOYW1lKAorICAgICAgICAgICAgUERGX0lubGluZUtleUFiYnIsIEZYX0FycmF5U2l6ZShQREZfSW5saW5lS2V5QWJiciksIGtleSk7CisgICAgICAgIGlmICghZnVsbG5hbWUuSXNFbXB0eSgpKSB7CisgICAgICAgICAgQWJiclJlcGxhY2VtZW50T3Agb3A7CisgICAgICAgICAgb3AuaXNfcmVwbGFjZV9rZXkgPSB0cnVlOworICAgICAgICAgIG9wLmtleSA9IGtleTsKKyAgICAgICAgICBvcC5yZXBsYWNlbWVudCA9IGZ1bGxuYW1lOworICAgICAgICAgIHJlcGxhY2VtZW50cy5wdXNoX2JhY2sob3ApOworICAgICAgICAgIGtleSA9IGZ1bGxuYW1lOwogICAgICAgICB9Ci0gICAgICAgIENQREZfT2JqZWN0KiBwUmVzID0gcExpc3QtPkdldEVsZW1lbnRWYWx1ZShuYW1lKTsKLSAgICAgICAgcmV0dXJuIHBSZXM7CisKKyAgICAgICAgaWYgKHZhbHVlLT5Jc05hbWUoKSkgeworICAgICAgICAgIENGWF9CeXRlU3RyaW5nIG5hbWUgPSB2YWx1ZS0+R2V0U3RyaW5nKCk7CisgICAgICAgICAgZnVsbG5hbWUgPSBQREZfRmluZEZ1bGxOYW1lKFBERl9JbmxpbmVWYWx1ZUFiYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShQREZfSW5saW5lVmFsdWVBYmJyKSwgbmFtZSk7CisgICAgICAgICAgaWYgKCFmdWxsbmFtZS5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEFiYnJSZXBsYWNlbWVudE9wIG9wOworICAgICAgICAgICAgb3AuaXNfcmVwbGFjZV9rZXkgPSBmYWxzZTsKKyAgICAgICAgICAgIG9wLmtleSA9IGtleTsKKyAgICAgICAgICAgIG9wLnJlcGxhY2VtZW50ID0gZnVsbG5hbWU7CisgICAgICAgICAgICByZXBsYWNlbWVudHMucHVzaF9iYWNrKG9wKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgUERGX1JlcGxhY2VBYmJyKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yIChjb25zdCBhdXRvJiBvcCA6IHJlcGxhY2VtZW50cykgeworICAgICAgICBpZiAob3AuaXNfcmVwbGFjZV9rZXkpCisgICAgICAgICAgcERpY3QtPlJlcGxhY2VLZXkob3Aua2V5LCBvcC5yZXBsYWNlbWVudCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwRGljdC0+U2V0QXROYW1lKG9wLmtleSwgb3AucmVwbGFjZW1lbnQpOworICAgICAgfQorICAgICAgYnJlYWs7CiAgICAgfQorICAgIGNhc2UgUERGT0JKX0FSUkFZOiB7CisgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBwT2JqLT5Bc0FycmF5KCk7CisgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyBpKyspIHsKKyAgICAgICAgQ1BERl9PYmplY3QqIHBFbGVtZW50ID0gcEFycmF5LT5HZXRFbGVtZW50KGkpOworICAgICAgICBpZiAocEVsZW1lbnQtPklzTmFtZSgpKSB7CisgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9IHBFbGVtZW50LT5HZXRTdHJpbmcoKTsKKyAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0MgZnVsbG5hbWUgPSBQREZfRmluZEZ1bGxOYW1lKAorICAgICAgICAgICAgICBQREZfSW5saW5lVmFsdWVBYmJyLCBGWF9BcnJheVNpemUoUERGX0lubGluZVZhbHVlQWJiciksIG5hbWUpOworICAgICAgICAgIGlmICghZnVsbG5hbWUuSXNFbXB0eSgpKSB7CisgICAgICAgICAgICBwQXJyYXktPlNldEF0KGksIG5ldyBDUERGX05hbWUoZnVsbG5hbWUpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgUERGX1JlcGxhY2VBYmJyKHBFbGVtZW50KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQmVnaW5UZXh0KCkgeworICBtX3BDdXJTdGF0ZXMtPm1fVGV4dE1hdHJpeC5TZXQoMS4wZiwgMCwgMCwgMS4wZiwgMCwgMCk7CisgIE9uQ2hhbmdlVGV4dE1hdHJpeCgpOworICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFggPSAwOworICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFkgPSAwOworICBtX3BDdXJTdGF0ZXMtPm1fVGV4dExpbmVYID0gMDsKKyAgbV9wQ3VyU3RhdGVzLT5tX1RleHRMaW5lWSA9IDA7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0JlZ2luU2VjdGlvblVuZGVmaW5lZCgpIHsKKyAgbV9Db21wYXRDb3VudCsrOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9DdXJ2ZVRvXzEyMygpIHsKKyAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgeworICAgIHJldHVybjsKKyAgfQorICBBZGRQYXRoUG9pbnQoR2V0TnVtYmVyKDUpLCBHZXROdW1iZXIoNCksIEZYUFRfQkVaSUVSVE8pOworICBBZGRQYXRoUG9pbnQoR2V0TnVtYmVyKDMpLCBHZXROdW1iZXIoMiksIEZYUFRfQkVaSUVSVE8pOworICBBZGRQYXRoUG9pbnQoR2V0TnVtYmVyKDEpLCBHZXROdW1iZXIoMCksIEZYUFRfQkVaSUVSVE8pOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9Db25jYXRNYXRyaXgoKSB7CisgIEZYX0ZMT0FUIGEyID0gR2V0TnVtYmVyMTYoNSksIGIyID0gR2V0TnVtYmVyMTYoNCksIGMyID0gR2V0TnVtYmVyMTYoMyksCisgICAgICAgICAgIGQyID0gR2V0TnVtYmVyMTYoMik7CisgIEZYX0ZMT0FUIGUyID0gR2V0TnVtYmVyKDEpLCBmMiA9IEdldE51bWJlcigwKTsKKyAgQ0ZYX01hdHJpeCBuZXdfbWF0cml4KGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpOworICBuZXdfbWF0cml4LkNvbmNhdChtX3BDdXJTdGF0ZXMtPm1fQ1RNKTsKKyAgbV9wQ3VyU3RhdGVzLT5tX0NUTSA9IG5ld19tYXRyaXg7CisgIE9uQ2hhbmdlVGV4dE1hdHJpeCgpOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDb2xvclNwYWNlX0ZpbGwoKSB7CisgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgY3NuYW1lID0gR2V0U3RyaW5nKDApOworICBDUERGX0NvbG9yU3BhY2UqIHBDUyA9IEZpbmRDb2xvclNwYWNlKGNzbmFtZSk7CisgIGlmICghcENTKSB7CisgICAgcmV0dXJuOworICB9CisgIG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlLkdldE1vZGlmeSgpLT5tX0ZpbGxDb2xvci5TZXRDb2xvclNwYWNlKHBDUyk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENvbG9yU3BhY2VfU3Ryb2tlKCkgeworICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7CisgICAgcmV0dXJuOworICB9CisgIENGWF9CeXRlU3RyaW5nIGNzbmFtZSA9IEdldFN0cmluZygwKTsKKyAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBGaW5kQ29sb3JTcGFjZShjc25hbWUpOworICBpZiAoIXBDUykgeworICAgIHJldHVybjsKKyAgfQorICBtX3BDdXJTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5HZXRNb2RpZnkoKS0+bV9TdHJva2VDb2xvci5TZXRDb2xvclNwYWNlKHBDUyk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldERhc2goKSB7CisgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9BcnJheSogcEFycmF5ID0gR2V0T2JqZWN0KDEpID8gR2V0T2JqZWN0KDEpLT5HZXRBcnJheSgpIDogTlVMTDsKKyAgaWYgKCFwQXJyYXkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wQ3VyU3RhdGVzLT5TZXRMaW5lRGFzaChwQXJyYXksIEdldE51bWJlcigwKSwgMS4wZik7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENoYXJXaWR0aCgpIHsKKyAgbV9UeXBlM0RhdGFbMF0gPSBHZXROdW1iZXIoMSk7CisgIG1fVHlwZTNEYXRhWzFdID0gR2V0TnVtYmVyKDApOworICBtX2JDb2xvcmVkID0gVFJVRTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q2FjaGVkRGV2aWNlKCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgeworICAgIG1fVHlwZTNEYXRhW2ldID0gR2V0TnVtYmVyKDUgLSBpKTsKKyAgfQorICBtX2JDb2xvcmVkID0gRkFMU0U7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0V4ZWN1dGVYT2JqZWN0KCkgeworICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gR2V0U3RyaW5nKDApOworICBpZiAobmFtZSA9PSBtX0xhc3RJbWFnZU5hbWUgJiYgbV9wTGFzdEltYWdlICYmIG1fcExhc3RJbWFnZS0+R2V0U3RyZWFtKCkgJiYKKyAgICAgIG1fcExhc3RJbWFnZS0+R2V0U3RyZWFtKCktPkdldE9iak51bSgpKSB7CisgICAgQWRkSW1hZ2UobnVsbHB0ciwgbV9wTGFzdEltYWdlLCBGQUxTRSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgeworICAgIGlmICghbV9wUmVzb3VyY2VzKQorICAgICAgcmV0dXJuOworCisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwTGlzdCA9IG1fcFJlc291cmNlcy0+R2V0RGljdCgiWE9iamVjdCIpOworICAgIGlmICghcExpc3QgJiYgbV9wUGFnZVJlc291cmNlcyAmJiBtX3BSZXNvdXJjZXMgIT0gbV9wUGFnZVJlc291cmNlcykKKyAgICAgIHBMaXN0ID0gbV9wUGFnZVJlc291cmNlcy0+R2V0RGljdCgiWE9iamVjdCIpOworICAgIGlmICghcExpc3QpCisgICAgICByZXR1cm47CisgICAgQ1BERl9SZWZlcmVuY2UqIHBSZXMgPSBUb1JlZmVyZW5jZShwTGlzdC0+R2V0RWxlbWVudChuYW1lKSk7CisgICAgaWYgKCFwUmVzKQorICAgICAgcmV0dXJuOworCisgICAgRlhfQk9PTCBiRm9ybTsKKyAgICBpZiAobV9wRG9jdW1lbnQtPklzRm9ybVN0cmVhbShwUmVzLT5HZXRSZWZPYmpOdW0oKSwgYkZvcm0pICYmICFiRm9ybSkKKyAgICAgIHJldHVybjsKKyAgfQorCisgIENQREZfU3RyZWFtKiBwWE9iamVjdCA9IFRvU3RyZWFtKEZpbmRSZXNvdXJjZU9iaigiWE9iamVjdCIsIG5hbWUpKTsKKyAgaWYgKCFwWE9iamVjdCkgeworICAgIG1fYlJlc291cmNlTWlzc2luZyA9IFRSVUU7CisgICAgcmV0dXJuOworICB9CisKKyAgQ0ZYX0J5dGVTdHJpbmdDIHR5cGUgPSBwWE9iamVjdC0+R2V0RGljdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcFhPYmplY3QtPkdldERpY3QoKS0+R2V0Q29uc3RTdHJpbmcoIlN1YnR5cGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENGWF9CeXRlU3RyaW5nQygpOworICBpZiAodHlwZSA9PSAiSW1hZ2UiKSB7CisgICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDUERGX0ltYWdlT2JqZWN0KiBwT2JqID0gQWRkSW1hZ2UocFhPYmplY3QsIE5VTEwsIEZBTFNFKTsKKyAgICBtX0xhc3RJbWFnZU5hbWUgPSBuYW1lOworICAgIG1fcExhc3RJbWFnZSA9IHBPYmotPm1fcEltYWdlOworICAgIGlmICghbV9wT2JqZWN0TGlzdC0+bV9iSGFzSW1hZ2VNYXNrKQorICAgICAgbV9wT2JqZWN0TGlzdC0+bV9iSGFzSW1hZ2VNYXNrID0gbV9wTGFzdEltYWdlLT5Jc01hc2soKTsKKyAgfSBlbHNlIGlmICh0eXBlID09ICJGb3JtIikgeworICAgIEFkZEZvcm0ocFhPYmplY3QpOworICB9IGVsc2UgeworICAgIHJldHVybjsKKyAgfQorfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkFkZEZvcm0oQ1BERl9TdHJlYW0qIHBTdHJlYW0pIHsKKyAgaWYgKCFtX09wdGlvbnMubV9iU2VwYXJhdGVGb3JtKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzb3VyY2VzID0gcFN0cmVhbS0+R2V0RGljdCgpLT5HZXREaWN0KCJSZXNvdXJjZXMiKTsKKyAgICBDRlhfTWF0cml4IGZvcm1fbWF0cml4ID0gcFN0cmVhbS0+R2V0RGljdCgpLT5HZXRNYXRyaXgoIk1hdHJpeCIpOworICAgIGZvcm1fbWF0cml4LkNvbmNhdChtX3BDdXJTdGF0ZXMtPm1fQ1RNKTsKKyAgICBDUERGX0FycmF5KiBwQkJveCA9IHBTdHJlYW0tPkdldERpY3QoKS0+R2V0QXJyYXkoIkJCb3giKTsKKyAgICBDRlhfRmxvYXRSZWN0IGZvcm1fYmJveDsKKyAgICBDUERGX1BhdGggQ2xpcFBhdGg7CisgICAgaWYgKHBCQm94KSB7CisgICAgICBmb3JtX2Jib3ggPSBwU3RyZWFtLT5HZXREaWN0KCktPkdldFJlY3QoIkJCb3giKTsKKyAgICAgIENsaXBQYXRoLk5ldygpOworICAgICAgQ2xpcFBhdGguQXBwZW5kUmVjdChmb3JtX2Jib3gubGVmdCwgZm9ybV9iYm94LmJvdHRvbSwgZm9ybV9iYm94LnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtX2Jib3gudG9wKTsKKyAgICAgIENsaXBQYXRoLlRyYW5zZm9ybSgmZm9ybV9tYXRyaXgpOworICAgICAgZm9ybV9iYm94LlRyYW5zZm9ybSgmZm9ybV9tYXRyaXgpOworICAgIH0KKyAgICBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXIgcGFyc2VyKG1fcERvY3VtZW50LCBtX3BQYWdlUmVzb3VyY2VzLCBtX3BSZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9tdENvbnRlbnRUb1VzZXIsIG1fcE9iamVjdExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVzb3VyY2VzLCAmZm9ybV9iYm94LCAmbV9PcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VyU3RhdGVzLmdldCgpLCBtX0xldmVsICsgMSk7CisgICAgcGFyc2VyLm1fcEN1clN0YXRlcy0+bV9DVE0gPSBmb3JtX21hdHJpeDsKKyAgICBpZiAoQ2xpcFBhdGguTm90TnVsbCgpKSB7CisgICAgICBwYXJzZXIubV9wQ3VyU3RhdGVzLT5tX0NsaXBQYXRoLkFwcGVuZFBhdGgoQ2xpcFBhdGgsIEZYRklMTF9XSU5ESU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpOworICAgIH0KKyAgICBDUERGX1N0cmVhbUFjYyBzdHJlYW07CisgICAgc3RyZWFtLkxvYWRBbGxEYXRhKHBTdHJlYW0sIEZBTFNFKTsKKyAgICBpZiAoc3RyZWFtLkdldFNpemUoKSA9PSAwKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHBhcnNlci5QYXJzZShzdHJlYW0uR2V0RGF0YSgpLCBzdHJlYW0uR2V0U2l6ZSgpLCAwKTsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9Gb3JtT2JqZWN0KiBwRm9ybU9iaiA9IG5ldyBDUERGX0Zvcm1PYmplY3Q7CisgIHBGb3JtT2JqLT5tX3BGb3JtID0KKyAgICAgIG5ldyBDUERGX0Zvcm0obV9wRG9jdW1lbnQsIG1fcFBhZ2VSZXNvdXJjZXMsIHBTdHJlYW0sIG1fcFJlc291cmNlcyk7CisgIHBGb3JtT2JqLT5tX0Zvcm1NYXRyaXggPSBtX3BDdXJTdGF0ZXMtPm1fQ1RNOworICBwRm9ybU9iai0+bV9Gb3JtTWF0cml4LkNvbmNhdChtX210Q29udGVudFRvVXNlcik7CisgIENQREZfQWxsU3RhdGVzIHN0YXR1czsKKyAgc3RhdHVzLm1fR2VuZXJhbFN0YXRlID0gbV9wQ3VyU3RhdGVzLT5tX0dlbmVyYWxTdGF0ZTsKKyAgc3RhdHVzLm1fR3JhcGhTdGF0ZSA9IG1fcEN1clN0YXRlcy0+bV9HcmFwaFN0YXRlOworICBzdGF0dXMubV9Db2xvclN0YXRlID0gbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGU7CisgIHN0YXR1cy5tX1RleHRTdGF0ZSA9IG1fcEN1clN0YXRlcy0+bV9UZXh0U3RhdGU7CisgIHBGb3JtT2JqLT5tX3BGb3JtLT5QYXJzZUNvbnRlbnQoJnN0YXR1cywgTlVMTCwgTlVMTCwgJm1fT3B0aW9ucywgbV9MZXZlbCArIDEpOworICBpZiAoIW1fcE9iamVjdExpc3QtPm1fYkJhY2tncm91bmRBbHBoYU5lZWRlZCAmJgorICAgICAgcEZvcm1PYmotPm1fcEZvcm0tPm1fYkJhY2tncm91bmRBbHBoYU5lZWRlZCkgeworICAgIG1fcE9iamVjdExpc3QtPm1fYkJhY2tncm91bmRBbHBoYU5lZWRlZCA9IFRSVUU7CisgIH0KKyAgcEZvcm1PYmotPkNhbGNCb3VuZGluZ0JveCgpOworICBTZXRHcmFwaGljU3RhdGVzKHBGb3JtT2JqLCBUUlVFLCBUUlVFLCBUUlVFKTsKKyAgbV9wT2JqZWN0TGlzdC0+bV9PYmplY3RMaXN0LkFkZFRhaWwocEZvcm1PYmopOworfQorQ1BERl9JbWFnZU9iamVjdCogQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGRJbWFnZShDUERGX1N0cmVhbSogcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9JbWFnZSogcEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbmxpbmUpIHsKKyAgaWYgKCFwU3RyZWFtICYmICFwSW1hZ2UpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDRlhfTWF0cml4IEltYWdlTWF0cml4OworICBJbWFnZU1hdHJpeC5Db3B5KG1fcEN1clN0YXRlcy0+bV9DVE0pOworICBJbWFnZU1hdHJpeC5Db25jYXQobV9tdENvbnRlbnRUb1VzZXIpOworICBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmogPSBuZXcgQ1BERl9JbWFnZU9iamVjdDsKKyAgaWYgKHBJbWFnZSkgeworICAgIHBJbWFnZU9iai0+bV9wSW1hZ2UgPQorICAgICAgICBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+R2V0SW1hZ2UocEltYWdlLT5HZXRTdHJlYW0oKSk7CisgIH0gZWxzZSBpZiAocFN0cmVhbS0+R2V0T2JqTnVtKCkpIHsKKyAgICBwSW1hZ2VPYmotPm1fcEltYWdlID0gbV9wRG9jdW1lbnQtPkxvYWRJbWFnZUYocFN0cmVhbSk7CisgIH0gZWxzZSB7CisgICAgcEltYWdlT2JqLT5tX3BJbWFnZSA9IG5ldyBDUERGX0ltYWdlKG1fcERvY3VtZW50KTsKKyAgICBwSW1hZ2VPYmotPm1fcEltYWdlLT5Mb2FkSW1hZ2VGKHBTdHJlYW0sIGJJbmxpbmUpOworICB9CisgIFNldEdyYXBoaWNTdGF0ZXMocEltYWdlT2JqLCBwSW1hZ2VPYmotPm1fcEltYWdlLT5Jc01hc2soKSwgRkFMU0UsIEZBTFNFKTsKKyAgcEltYWdlT2JqLT5tX01hdHJpeCA9IEltYWdlTWF0cml4OworICBwSW1hZ2VPYmotPkNhbGNCb3VuZGluZ0JveCgpOworICBtX3BPYmplY3RMaXN0LT5tX09iamVjdExpc3QuQWRkVGFpbChwSW1hZ2VPYmopOworICByZXR1cm4gcEltYWdlT2JqOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9NYXJrUGxhY2VfRGljdGlvbmFyeSgpIHt9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0VuZEltYWdlKCkge30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRW5kTWFya2VkQ29udGVudCgpIHsKKyAgaWYgKCFtX09wdGlvbnMubV9iTWFya2VkQ29udGVudCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9DdXJDb250ZW50TWFyay5Jc051bGwoKSkgeworICAgIHJldHVybjsKKyAgfQorICBpbnQgY291bnQgPSBtX0N1ckNvbnRlbnRNYXJrLkdldE9iamVjdCgpLT5Db3VudEl0ZW1zKCk7CisgIGlmIChjb3VudCA9PSAxKSB7CisgICAgbV9DdXJDb250ZW50TWFyay5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisgIG1fQ3VyQ29udGVudE1hcmsuR2V0TW9kaWZ5KCktPkRlbGV0ZUxhc3RNYXJrKCk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0VuZFRleHQoKSB7CisgIGludCBjb3VudCA9IG1fQ2xpcFRleHRMaXN0LkdldFNpemUoKTsKKyAgaWYgKGNvdW50ID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fcEN1clN0YXRlcy0+bV9UZXh0U3RhdGUuR2V0T2JqZWN0KCktPm1fVGV4dE1vZGUgPCA0KSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICBkZWxldGUgbV9DbGlwVGV4dExpc3QuR2V0QXQoaSk7CisgICAgfQorICB9IGVsc2UgeworICAgIG1fcEN1clN0YXRlcy0+bV9DbGlwUGF0aC5BcHBlbmRUZXh0cyhtX0NsaXBUZXh0TGlzdC5HZXREYXRhKCksIGNvdW50KTsKKyAgfQorICBtX0NsaXBUZXh0TGlzdC5SZW1vdmVBbGwoKTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRW5kU2VjdGlvblVuZGVmaW5lZCgpIHsKKyAgaWYgKG1fQ29tcGF0Q291bnQpIHsKKyAgICBtX0NvbXBhdENvdW50LS07CisgIH0KK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRmlsbFBhdGgoKSB7CisgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQWRkUGF0aE9iamVjdChGWEZJTExfV0lORElORywgRkFMU0UpOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9GaWxsUGF0aE9sZCgpIHsKKyAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgeworICAgIHJldHVybjsKKyAgfQorICBBZGRQYXRoT2JqZWN0KEZYRklMTF9XSU5ESU5HLCBGQUxTRSk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0VPRmlsbFBhdGgoKSB7CisgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQWRkUGF0aE9iamVjdChGWEZJTExfQUxURVJOQVRFLCBGQUxTRSk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldEdyYXlfRmlsbCgpIHsKKyAgRlhfRkxPQVQgdmFsdWUgPSBHZXROdW1iZXIoMCk7CisgIENQREZfQ29sb3JTcGFjZSogcENTID0gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRUdSQVkpOworICBtX3BDdXJTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5TZXRGaWxsQ29sb3IocENTLCAmdmFsdWUsIDEpOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRHcmF5X1N0cm9rZSgpIHsKKyAgRlhfRkxPQVQgdmFsdWUgPSBHZXROdW1iZXIoMCk7CisgIENQREZfQ29sb3JTcGFjZSogcENTID0gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRUdSQVkpOworICBtX3BDdXJTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5TZXRTdHJva2VDb2xvcihwQ1MsICZ2YWx1ZSwgMSk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldEV4dGVuZEdyYXBoU3RhdGUoKSB7CisgIENGWF9CeXRlU3RyaW5nIG5hbWUgPSBHZXRTdHJpbmcoMCk7CisgIENQREZfRGljdGlvbmFyeSogcEdTID0gVG9EaWN0aW9uYXJ5KEZpbmRSZXNvdXJjZU9iaigiRXh0R1N0YXRlIiwgbmFtZSkpOworICBpZiAoIXBHUykgeworICAgIG1fYlJlc291cmNlTWlzc2luZyA9IFRSVUU7CisgICAgcmV0dXJuOworICB9CisgIG1fcEN1clN0YXRlcy0+UHJvY2Vzc0V4dEdTKHBHUywgdGhpcyk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0Nsb3NlUGF0aCgpIHsKKyAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9QYXRoUG9pbnRDb3VudCA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX1BhdGhTdGFydFggIT0gbV9QYXRoQ3VycmVudFggfHwgbV9QYXRoU3RhcnRZICE9IG1fUGF0aEN1cnJlbnRZKSB7CisgICAgQWRkUGF0aFBvaW50KG1fUGF0aFN0YXJ0WCwgbV9QYXRoU3RhcnRZLCBGWFBUX0xJTkVUTyB8IEZYUFRfQ0xPU0VGSUdVUkUpOworICB9IGVsc2UgaWYgKG1fcFBhdGhQb2ludHNbbV9QYXRoUG9pbnRDb3VudCAtIDFdLm1fRmxhZyAhPSBGWFBUX01PVkVUTykgeworICAgIG1fcFBhdGhQb2ludHNbbV9QYXRoUG9pbnRDb3VudCAtIDFdLm1fRmxhZyB8PSBGWFBUX0NMT1NFRklHVVJFOworICB9Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldEZsYXQoKSB7CisgIG1fcEN1clN0YXRlcy0+bV9HZW5lcmFsU3RhdGUuR2V0TW9kaWZ5KCktPm1fRmxhdG5lc3MgPSBHZXROdW1iZXIoMCk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0JlZ2luSW1hZ2VEYXRhKCkge30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0TGluZUpvaW4oKSB7CisgIG1fcEN1clN0YXRlcy0+bV9HcmFwaFN0YXRlLkdldE1vZGlmeSgpLT5tX0xpbmVKb2luID0KKyAgICAgIChDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luKUdldEludGVnZXIoMCk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldExpbmVDYXAoKSB7CisgIG1fcEN1clN0YXRlcy0+bV9HcmFwaFN0YXRlLkdldE1vZGlmeSgpLT5tX0xpbmVDYXAgPQorICAgICAgKENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcClHZXRJbnRlZ2VyKDApOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDTVlLQ29sb3JfRmlsbCgpIHsKKyAgaWYgKG1fUGFyYW1Db3VudCAhPSA0KQorICAgIHJldHVybjsKKworICBGWF9GTE9BVCB2YWx1ZXNbNF07CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgdmFsdWVzW2ldID0gR2V0TnVtYmVyKDMgLSBpKTsKKyAgfQorICBDUERGX0NvbG9yU3BhY2UqIHBDUyA9IENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VDTVlLKTsKKyAgbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGUuU2V0RmlsbENvbG9yKHBDUywgdmFsdWVzLCA0KTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q01ZS0NvbG9yX1N0cm9rZSgpIHsKKyAgaWYgKG1fUGFyYW1Db3VudCAhPSA0KQorICAgIHJldHVybjsKKworICBGWF9GTE9BVCB2YWx1ZXNbNF07CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgdmFsdWVzW2ldID0gR2V0TnVtYmVyKDMgLSBpKTsKKyAgfQorICBDUERGX0NvbG9yU3BhY2UqIHBDUyA9IENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VDTVlLKTsKKyAgbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGUuU2V0U3Ryb2tlQ29sb3IocENTLCB2YWx1ZXMsIDQpOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9MaW5lVG8oKSB7CisgIGlmIChtX1BhcmFtQ291bnQgIT0gMikKKyAgICByZXR1cm47CisKKyAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgeworICAgIHJldHVybjsKKyAgfQorICBBZGRQYXRoUG9pbnQoR2V0TnVtYmVyKDEpLCBHZXROdW1iZXIoMCksIEZYUFRfTElORVRPKTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTW92ZVRvKCkgeworICBpZiAobV9QYXJhbUNvdW50ICE9IDIpCisgICAgcmV0dXJuOworCisgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKKyAgICBtX3BTeW50YXgtPlNraXBQYXRoT2JqZWN0KCk7CisgICAgcmV0dXJuOworICB9CisgIEFkZFBhdGhQb2ludChHZXROdW1iZXIoMSksIEdldE51bWJlcigwKSwgRlhQVF9NT1ZFVE8pOworICBQYXJzZVBhdGhPYmplY3QoKTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0TWl0ZXJMaW1pdCgpIHsKKyAgbV9wQ3VyU3RhdGVzLT5tX0dyYXBoU3RhdGUuR2V0TW9kaWZ5KCktPm1fTWl0ZXJMaW1pdCA9IEdldE51bWJlcigwKTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTWFya1BsYWNlKCkge30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRW5kUGF0aCgpIHsKKyAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgeworICAgIHJldHVybjsKKyAgfQorICBBZGRQYXRoT2JqZWN0KDAsIEZBTFNFKTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2F2ZUdyYXBoU3RhdGUoKSB7CisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0FsbFN0YXRlcz4gcFN0YXRlcyhuZXcgQ1BERl9BbGxTdGF0ZXMpOworICBwU3RhdGVzLT5Db3B5KCptX3BDdXJTdGF0ZXMpOworICBtX1N0YXRlU3RhY2sucHVzaF9iYWNrKHN0ZDo6bW92ZShwU3RhdGVzKSk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1Jlc3RvcmVHcmFwaFN0YXRlKCkgeworICBpZiAobV9TdGF0ZVN0YWNrLmVtcHR5KCkpCisgICAgcmV0dXJuOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9BbGxTdGF0ZXM+IHBTdGF0ZXMgPSBzdGQ6Om1vdmUobV9TdGF0ZVN0YWNrLmJhY2soKSk7CisgIG1fU3RhdGVTdGFjay5wb3BfYmFjaygpOworICBtX3BDdXJTdGF0ZXMtPkNvcHkoKnBTdGF0ZXMpOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9SZWN0YW5nbGUoKSB7CisgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfRkxPQVQgeCA9IEdldE51bWJlcigzKSwgeSA9IEdldE51bWJlcigyKTsKKyAgRlhfRkxPQVQgdyA9IEdldE51bWJlcigxKSwgaCA9IEdldE51bWJlcigwKTsKKyAgQWRkUGF0aFJlY3QoeCwgeSwgdywgaCk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6QWRkUGF0aFJlY3QoRlhfRkxPQVQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaCkgeworICBBZGRQYXRoUG9pbnQoeCwgeSwgRlhQVF9NT1ZFVE8pOworICBBZGRQYXRoUG9pbnQoeCArIHcsIHksIEZYUFRfTElORVRPKTsKKyAgQWRkUGF0aFBvaW50KHggKyB3LCB5ICsgaCwgRlhQVF9MSU5FVE8pOworICBBZGRQYXRoUG9pbnQoeCwgeSArIGgsIEZYUFRfTElORVRPKTsKKyAgQWRkUGF0aFBvaW50KHgsIHksIEZYUFRfTElORVRPIHwgRlhQVF9DTE9TRUZJR1VSRSk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldFJHQkNvbG9yX0ZpbGwoKSB7CisgIGlmIChtX1BhcmFtQ291bnQgIT0gMykKKyAgICByZXR1cm47CisKKyAgRlhfRkxPQVQgdmFsdWVzWzNdOworICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgIHZhbHVlc1tpXSA9IEdldE51bWJlcigyIC0gaSk7CisgIH0KKyAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFUkdCKTsKKyAgbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGUuU2V0RmlsbENvbG9yKHBDUywgdmFsdWVzLCAzKTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0UkdCQ29sb3JfU3Ryb2tlKCkgeworICBpZiAobV9QYXJhbUNvdW50ICE9IDMpCisgICAgcmV0dXJuOworCisgIEZYX0ZMT0FUIHZhbHVlc1szXTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICB2YWx1ZXNbaV0gPSBHZXROdW1iZXIoMiAtIGkpOworICB9CisgIENQREZfQ29sb3JTcGFjZSogcENTID0gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRVJHQik7CisgIG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlLlNldFN0cm9rZUNvbG9yKHBDUywgdmFsdWVzLCAzKTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0UmVuZGVySW50ZW50KCkge30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQ2xvc2VTdHJva2VQYXRoKCkgeworICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7CisgICAgcmV0dXJuOworICB9CisgIEhhbmRsZV9DbG9zZVBhdGgoKTsKKyAgQWRkUGF0aE9iamVjdCgwLCBUUlVFKTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU3Ryb2tlUGF0aCgpIHsKKyAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgeworICAgIHJldHVybjsKKyAgfQorICBBZGRQYXRoT2JqZWN0KDAsIFRSVUUpOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRDb2xvcl9GaWxsKCkgeworICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7CisgICAgcmV0dXJuOworICB9CisgIEZYX0ZMT0FUIHZhbHVlc1s0XTsKKyAgaW50IG5hcmdzID0gbV9QYXJhbUNvdW50OworICBpZiAobmFyZ3MgPiA0KSB7CisgICAgbmFyZ3MgPSA0OworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykgeworICAgIHZhbHVlc1tpXSA9IEdldE51bWJlcihuYXJncyAtIGkgLSAxKTsKKyAgfQorICBtX3BDdXJTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5TZXRGaWxsQ29sb3IoTlVMTCwgdmFsdWVzLCBuYXJncyk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENvbG9yX1N0cm9rZSgpIHsKKyAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgeworICAgIHJldHVybjsKKyAgfQorICBGWF9GTE9BVCB2YWx1ZXNbNF07CisgIGludCBuYXJncyA9IG1fUGFyYW1Db3VudDsKKyAgaWYgKG5hcmdzID4gNCkgeworICAgIG5hcmdzID0gNDsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IG5hcmdzOyBpKyspIHsKKyAgICB2YWx1ZXNbaV0gPSBHZXROdW1iZXIobmFyZ3MgLSBpIC0gMSk7CisgIH0KKyAgbV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGUuU2V0U3Ryb2tlQ29sb3IoTlVMTCwgdmFsdWVzLCBuYXJncyk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENvbG9yUFNfRmlsbCgpIHsKKyAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX09iamVjdCogcExhc3RQYXJhbSA9IEdldE9iamVjdCgwKTsKKyAgaWYgKCFwTGFzdFBhcmFtKSB7CisgICAgcmV0dXJuOworICB9CisgIGludCBuYXJncyA9IG1fUGFyYW1Db3VudDsKKyAgaW50IG52YWx1ZXMgPSBuYXJnczsKKyAgaWYgKHBMYXN0UGFyYW0tPklzTmFtZSgpKSB7CisgICAgbnZhbHVlcy0tOworICB9CisgIEZYX0ZMT0FUKiB2YWx1ZXMgPSBOVUxMOworICBpZiAobnZhbHVlcykgeworICAgIHZhbHVlcyA9IEZYX0FsbG9jKEZYX0ZMT0FULCBudmFsdWVzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG52YWx1ZXM7IGkrKykgeworICAgICAgdmFsdWVzW2ldID0gR2V0TnVtYmVyKG5hcmdzIC0gaSAtIDEpOworICAgIH0KKyAgfQorICBpZiAobnZhbHVlcyAhPSBuYXJncykgeworICAgIENQREZfUGF0dGVybiogcFBhdHRlcm4gPSBGaW5kUGF0dGVybihHZXRTdHJpbmcoMCksIEZBTFNFKTsKKyAgICBpZiAocFBhdHRlcm4pIHsKKyAgICAgIG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlLlNldEZpbGxQYXR0ZXJuKHBQYXR0ZXJuLCB2YWx1ZXMsIG52YWx1ZXMpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtX3BDdXJTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5TZXRGaWxsQ29sb3IoTlVMTCwgdmFsdWVzLCBudmFsdWVzKTsKKyAgfQorICBGWF9GcmVlKHZhbHVlcyk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENvbG9yUFNfU3Ryb2tlKCkgeworICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7CisgICAgcmV0dXJuOworICB9CisgIENQREZfT2JqZWN0KiBwTGFzdFBhcmFtID0gR2V0T2JqZWN0KDApOworICBpZiAoIXBMYXN0UGFyYW0pIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IG5hcmdzID0gbV9QYXJhbUNvdW50OworICBpbnQgbnZhbHVlcyA9IG5hcmdzOworICBpZiAocExhc3RQYXJhbS0+SXNOYW1lKCkpCisgICAgbnZhbHVlcy0tOworCisgIEZYX0ZMT0FUKiB2YWx1ZXMgPSBOVUxMOworICBpZiAobnZhbHVlcykgeworICAgIHZhbHVlcyA9IEZYX0FsbG9jKEZYX0ZMT0FULCBudmFsdWVzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG52YWx1ZXM7IGkrKykgeworICAgICAgdmFsdWVzW2ldID0gR2V0TnVtYmVyKG5hcmdzIC0gaSAtIDEpOworICAgIH0KKyAgfQorICBpZiAobnZhbHVlcyAhPSBuYXJncykgeworICAgIENQREZfUGF0dGVybiogcFBhdHRlcm4gPSBGaW5kUGF0dGVybihHZXRTdHJpbmcoMCksIEZBTFNFKTsKKyAgICBpZiAocFBhdHRlcm4pIHsKKyAgICAgIG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlLlNldFN0cm9rZVBhdHRlcm4ocFBhdHRlcm4sIHZhbHVlcywgbnZhbHVlcyk7CisgICAgfQorICB9IGVsc2UgeworICAgIG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlLlNldFN0cm9rZUNvbG9yKE5VTEwsIHZhbHVlcywgbnZhbHVlcyk7CisgIH0KKyAgRlhfRnJlZSh2YWx1ZXMpOworfQorQ0ZYX0Zsb2F0UmVjdCBHZXRTaGFkaW5nQkJveChDUERGX1N0cmVhbSogcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hhZGluZ1R5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9GdW5jdGlvbioqIHBGdW5jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5GdW5jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MpOworCit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NoYWRlRmlsbCgpIHsKKyAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX1BhdHRlcm4qIHBQYXR0ZXJuID0gRmluZFBhdHRlcm4oR2V0U3RyaW5nKDApLCBUUlVFKTsKKyAgaWYgKCFwUGF0dGVybikgeworICAgIHJldHVybjsKKyAgfQorICBpZiAocFBhdHRlcm4tPm1fUGF0dGVyblR5cGUgIT0gQ1BERl9QYXR0ZXJuOjpTSEFESU5HKSB7CisgICAgcmV0dXJuOworICB9CisgIENQREZfU2hhZGluZ1BhdHRlcm4qIHBTaGFkaW5nID0gc3RhdGljX2Nhc3Q8Q1BERl9TaGFkaW5nUGF0dGVybio+KHBQYXR0ZXJuKTsKKyAgaWYgKCFwU2hhZGluZy0+bV9iU2hhZGluZ09iaikgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoIXBTaGFkaW5nLT5Mb2FkKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9TaGFkaW5nT2JqZWN0KiBwT2JqID0gbmV3IENQREZfU2hhZGluZ09iamVjdDsKKyAgcE9iai0+bV9wU2hhZGluZyA9IHBTaGFkaW5nOworICBTZXRHcmFwaGljU3RhdGVzKHBPYmosIEZBTFNFLCBGQUxTRSwgRkFMU0UpOworICBwT2JqLT5tX01hdHJpeCA9IG1fcEN1clN0YXRlcy0+bV9DVE07CisgIHBPYmotPm1fTWF0cml4LkNvbmNhdChtX210Q29udGVudFRvVXNlcik7CisgIENGWF9GbG9hdFJlY3QgYmJveDsKKyAgaWYgKCFwT2JqLT5tX0NsaXBQYXRoLklzTnVsbCgpKSB7CisgICAgYmJveCA9IHBPYmotPm1fQ2xpcFBhdGguR2V0Q2xpcEJveCgpOworICB9IGVsc2UgeworICAgIGJib3ggPSBtX0JCb3g7CisgIH0KKyAgaWYgKHBTaGFkaW5nLT5Jc01lc2hTaGFkaW5nKCkpIHsKKyAgICBiYm94LkludGVyc2VjdChHZXRTaGFkaW5nQkJveChUb1N0cmVhbShwU2hhZGluZy0+bV9wU2hhZGluZ09iaiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNoYWRpbmctPm1fU2hhZGluZ1R5cGUsICZwT2JqLT5tX01hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2hhZGluZy0+bV9wRnVuY3Rpb25zLCBwU2hhZGluZy0+bV9uRnVuY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNoYWRpbmctPm1fcENTKSk7CisgIH0KKyAgcE9iai0+bV9MZWZ0ID0gYmJveC5sZWZ0OworICBwT2JqLT5tX1JpZ2h0ID0gYmJveC5yaWdodDsKKyAgcE9iai0+bV9Ub3AgPSBiYm94LnRvcDsKKyAgcE9iai0+bV9Cb3R0b20gPSBiYm94LmJvdHRvbTsKKyAgbV9wT2JqZWN0TGlzdC0+bV9PYmplY3RMaXN0LkFkZFRhaWwocE9iaik7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldENoYXJTcGFjZSgpIHsKKyAgbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRNb2RpZnkoKS0+bV9DaGFyU3BhY2UgPSBHZXROdW1iZXIoMCk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX01vdmVUZXh0UG9pbnQoKSB7CisgIG1fcEN1clN0YXRlcy0+bV9UZXh0TGluZVggKz0gR2V0TnVtYmVyKDEpOworICBtX3BDdXJTdGF0ZXMtPm1fVGV4dExpbmVZICs9IEdldE51bWJlcigwKTsKKyAgbV9wQ3VyU3RhdGVzLT5tX1RleHRYID0gbV9wQ3VyU3RhdGVzLT5tX1RleHRMaW5lWDsKKyAgbV9wQ3VyU3RhdGVzLT5tX1RleHRZID0gbV9wQ3VyU3RhdGVzLT5tX1RleHRMaW5lWTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTW92ZVRleHRQb2ludF9TZXRMZWFkaW5nKCkgeworICBIYW5kbGVfTW92ZVRleHRQb2ludCgpOworICBtX3BDdXJTdGF0ZXMtPm1fVGV4dExlYWRpbmcgPSAtR2V0TnVtYmVyKDApOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRGb250KCkgeworICBGWF9GTE9BVCBmcyA9IEdldE51bWJlcigwKTsKKyAgaWYgKGZzID09IDApIHsKKyAgICBmcyA9IG1fRGVmRm9udFNpemU7CisgIH0KKyAgbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRNb2RpZnkoKS0+bV9Gb250U2l6ZSA9IGZzOworICBDUERGX0ZvbnQqIHBGb250ID0gRmluZEZvbnQoR2V0U3RyaW5nKDEpKTsKKyAgaWYgKHBGb250KSB7CisgICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5TZXRGb250KHBGb250KTsKKyAgfQorfQorQ1BERl9PYmplY3QqIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6RmluZFJlc291cmNlT2JqKAorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdHlwZSwKKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkgeworICBpZiAoIW1fcFJlc291cmNlcykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChtX3BSZXNvdXJjZXMgPT0gbV9wUGFnZVJlc291cmNlcykgewogICAgIENQREZfRGljdGlvbmFyeSogcExpc3QgPSBtX3BSZXNvdXJjZXMtPkdldERpY3QodHlwZSk7Ci0gICAgaWYgKHBMaXN0ID09IE5VTEwpIHsKLSAgICAgICAgaWYgKG1fcFBhZ2VSZXNvdXJjZXMgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwTGlzdCA9IG1fcFBhZ2VSZXNvdXJjZXMtPkdldERpY3QodHlwZSk7Ci0gICAgICAgIGlmIChwTGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBDUERGX09iamVjdCogcFJlcyA9IHBMaXN0LT5HZXRFbGVtZW50VmFsdWUobmFtZSk7Ci0gICAgICAgIHJldHVybiBwUmVzOworICAgIGlmICghcExpc3QpIHsKKyAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBDUERGX09iamVjdCogcFJlcyA9IHBMaXN0LT5HZXRFbGVtZW50VmFsdWUobmFtZSk7CiAgICAgcmV0dXJuIHBSZXM7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwTGlzdCA9IG1fcFJlc291cmNlcy0+R2V0RGljdCh0eXBlKTsKKyAgaWYgKCFwTGlzdCkgeworICAgIGlmICghbV9wUGFnZVJlc291cmNlcykgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIENQREZfRGljdGlvbmFyeSogcExpc3QgPSBtX3BQYWdlUmVzb3VyY2VzLT5HZXREaWN0KHR5cGUpOworICAgIGlmICghcExpc3QpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBDUERGX09iamVjdCogcFJlcyA9IHBMaXN0LT5HZXRFbGVtZW50VmFsdWUobmFtZSk7CisgICAgcmV0dXJuIHBSZXM7CisgIH0KKyAgQ1BERl9PYmplY3QqIHBSZXMgPSBwTGlzdC0+R2V0RWxlbWVudFZhbHVlKG5hbWUpOworICByZXR1cm4gcFJlczsKIH0KLUNQREZfRm9udCogQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpGaW5kRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkKLXsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCA9IChDUERGX0RpY3Rpb25hcnkqKUZpbmRSZXNvdXJjZU9iaihGWF9CU1RSQygiRm9udCIpLCBuYW1lKTsKLSAgICBpZiAocEZvbnREaWN0ID09IE5VTEwgfHwgcEZvbnREaWN0LT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgbV9iUmVzb3VyY2VNaXNzaW5nID0gVFJVRTsKLSAgICAgICAgcmV0dXJuIENQREZfRm9udDo6R2V0U3RvY2tGb250KG1fcERvY3VtZW50LCBGWF9CU1RSQygiSGVsdmV0aWNhIikpOwotICAgIH0KLSAgICBDUERGX0ZvbnQqIHBGb250ID0gbV9wRG9jdW1lbnQtPkxvYWRGb250KHBGb250RGljdCk7Ci0gICAgaWYgKHBGb250ICYmIHBGb250LT5HZXRUeXBlM0ZvbnQoKSkgewotICAgICAgICBwRm9udC0+R2V0VHlwZTNGb250KCktPlNldFBhZ2VSZXNvdXJjZXMobV9wUmVzb3VyY2VzKTsKLSAgICAgICAgcEZvbnQtPkdldFR5cGUzRm9udCgpLT5DaGVja1R5cGUzRm9udE1ldHJpY3MoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBGb250OworQ1BERl9Gb250KiBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkZpbmRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKSB7CisgIENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0ID0gVG9EaWN0aW9uYXJ5KEZpbmRSZXNvdXJjZU9iaigiRm9udCIsIG5hbWUpKTsKKyAgaWYgKCFwRm9udERpY3QpIHsKKyAgICBtX2JSZXNvdXJjZU1pc3NpbmcgPSBUUlVFOworICAgIHJldHVybiBDUERGX0ZvbnQ6OkdldFN0b2NrRm9udChtX3BEb2N1bWVudCwgIkhlbHZldGljYSIpOworICB9CisKKyAgQ1BERl9Gb250KiBwRm9udCA9IG1fcERvY3VtZW50LT5Mb2FkRm9udChwRm9udERpY3QpOworICBpZiAocEZvbnQgJiYgcEZvbnQtPkdldFR5cGUzRm9udCgpKSB7CisgICAgcEZvbnQtPkdldFR5cGUzRm9udCgpLT5TZXRQYWdlUmVzb3VyY2VzKG1fcFJlc291cmNlcyk7CisgICAgcEZvbnQtPkdldFR5cGUzRm9udCgpLT5DaGVja1R5cGUzRm9udE1ldHJpY3MoKTsKKyAgfQorICByZXR1cm4gcEZvbnQ7CiB9Ci1DUERGX0NvbG9yU3BhY2UqIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6RmluZENvbG9yU3BhY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpCi17Ci0gICAgaWYgKG5hbWUgPT0gRlhfQlNUUkMoIlBhdHRlcm4iKSkgewotICAgICAgICByZXR1cm4gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX1BBVFRFUk4pOworQ1BERl9Db2xvclNwYWNlKiBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkZpbmRDb2xvclNwYWNlKAorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKSB7CisgIGlmIChuYW1lID09ICJQYXR0ZXJuIikgeworICAgIHJldHVybiBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfUEFUVEVSTik7CisgIH0KKyAgaWYgKG5hbWUgPT0gIkRldmljZUdyYXkiIHx8IG5hbWUgPT0gIkRldmljZUNNWUsiIHx8IG5hbWUgPT0gIkRldmljZVJHQiIpIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBkZWZuYW1lID0gIkRlZmF1bHQiOworICAgIGRlZm5hbWUgKz0gbmFtZS5NaWQoNyk7CisgICAgQ1BERl9PYmplY3QqIHBEZWZPYmogPSBGaW5kUmVzb3VyY2VPYmooIkNvbG9yU3BhY2UiLCBkZWZuYW1lKTsKKyAgICBpZiAoIXBEZWZPYmopIHsKKyAgICAgIGlmIChuYW1lID09ICJEZXZpY2VHcmF5IikgeworICAgICAgICByZXR1cm4gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRUdSQVkpOworICAgICAgfQorICAgICAgaWYgKG5hbWUgPT0gIkRldmljZVJHQiIpIHsKKyAgICAgICAgcmV0dXJuIENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VSR0IpOworICAgICAgfQorICAgICAgcmV0dXJuIENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VDTVlLKTsKICAgICB9Ci0gICAgaWYgKG5hbWUgPT0gRlhfQlNUUkMoIkRldmljZUdyYXkiKSB8fCBuYW1lID09IEZYX0JTVFJDKCJEZXZpY2VDTVlLIikgfHwgbmFtZSA9PSBGWF9CU1RSQygiRGV2aWNlUkdCIikpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZGVmbmFtZSA9ICJEZWZhdWx0IjsKLSAgICAgICAgZGVmbmFtZSArPSBuYW1lLk1pZCg3KTsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBEZWZPYmogPSBGaW5kUmVzb3VyY2VPYmooRlhfQlNUUkMoIkNvbG9yU3BhY2UiKSwgZGVmbmFtZSk7Ci0gICAgICAgIGlmIChwRGVmT2JqID09IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChuYW1lID09IEZYX0JTVFJDKCJEZXZpY2VHcmF5IikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRUdSQVkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5hbWUgPT0gRlhfQlNUUkMoIkRldmljZVJHQiIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VSR0IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VDTVlLKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbV9wRG9jdW1lbnQtPkxvYWRDb2xvclNwYWNlKHBEZWZPYmopOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcENTT2JqID0gRmluZFJlc291cmNlT2JqKEZYX0JTVFJDKCJDb2xvclNwYWNlIiksIG5hbWUpOwotICAgIGlmIChwQ1NPYmogPT0gTlVMTCkgewotICAgICAgICBtX2JSZXNvdXJjZU1pc3NpbmcgPSBUUlVFOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIG1fcERvY3VtZW50LT5Mb2FkQ29sb3JTcGFjZShwQ1NPYmopOworICAgIHJldHVybiBtX3BEb2N1bWVudC0+TG9hZENvbG9yU3BhY2UocERlZk9iaik7CisgIH0KKyAgQ1BERl9PYmplY3QqIHBDU09iaiA9IEZpbmRSZXNvdXJjZU9iaigiQ29sb3JTcGFjZSIsIG5hbWUpOworICBpZiAoIXBDU09iaikgeworICAgIG1fYlJlc291cmNlTWlzc2luZyA9IFRSVUU7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIG1fcERvY3VtZW50LT5Mb2FkQ29sb3JTcGFjZShwQ1NPYmopOwogfQotQ1BERl9QYXR0ZXJuKiBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkZpbmRQYXR0ZXJuKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBGWF9CT09MIGJTaGFkaW5nKQotewotICAgIENQREZfT2JqZWN0KiBwUGF0dGVybiA9IEZpbmRSZXNvdXJjZU9iaihiU2hhZGluZyA/IEZYX0JTVFJDKCJTaGFkaW5nIikgOiBGWF9CU1RSQygiUGF0dGVybiIpLCBuYW1lKTsKLSAgICBpZiAocFBhdHRlcm4gPT0gTlVMTCB8fCAocFBhdHRlcm4tPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGF0dGVybi0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pKSB7Ci0gICAgICAgIG1fYlJlc291cmNlTWlzc2luZyA9IFRSVUU7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbV9wRG9jdW1lbnQtPkxvYWRQYXR0ZXJuKHBQYXR0ZXJuLCBiU2hhZGluZywgJm1fcEN1clN0YXRlcy0+bV9QYXJlbnRNYXRyaXgpOworQ1BERl9QYXR0ZXJuKiBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkZpbmRQYXR0ZXJuKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoYWRpbmcpIHsKKyAgQ1BERl9PYmplY3QqIHBQYXR0ZXJuID0KKyAgICAgIEZpbmRSZXNvdXJjZU9iaihiU2hhZGluZyA/ICJTaGFkaW5nIiA6ICJQYXR0ZXJuIiwgbmFtZSk7CisgIGlmICghcFBhdHRlcm4gfHwgKCFwUGF0dGVybi0+SXNEaWN0aW9uYXJ5KCkgJiYgIXBQYXR0ZXJuLT5Jc1N0cmVhbSgpKSkgeworICAgIG1fYlJlc291cmNlTWlzc2luZyA9IFRSVUU7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIG1fcERvY3VtZW50LT5Mb2FkUGF0dGVybihwUGF0dGVybiwgYlNoYWRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fcEN1clN0YXRlcy0+bV9QYXJlbnRNYXRyaXgpOwogfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkNvbnZlcnRUZXh0U3BhY2UoRlhfRkxPQVQmIHgsIEZYX0ZMT0FUJiB5KQotewotICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0TWF0cml4LlRyYW5zZm9ybSh4LCB5LCB4LCB5KTsKLSAgICBDb252ZXJ0VXNlclNwYWNlKHgsIHkpOwordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkNvbnZlcnRUZXh0U3BhY2UoRlhfRkxPQVQmIHgsIEZYX0ZMT0FUJiB5KSB7CisgIG1fcEN1clN0YXRlcy0+bV9UZXh0TWF0cml4LlRyYW5zZm9ybSh4LCB5LCB4LCB5KTsKKyAgQ29udmVydFVzZXJTcGFjZSh4LCB5KTsKIH0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpDb252ZXJ0VXNlclNwYWNlKEZYX0ZMT0FUJiB4LCBGWF9GTE9BVCYgeSkKLXsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fQ1RNLlRyYW5zZm9ybSh4LCB5LCB4LCB5KTsKLSAgICBtX210Q29udGVudFRvVXNlci5UcmFuc2Zvcm0oeCwgeSwgeCwgeSk7Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6Q29udmVydFVzZXJTcGFjZShGWF9GTE9BVCYgeCwgRlhfRkxPQVQmIHkpIHsKKyAgbV9wQ3VyU3RhdGVzLT5tX0NUTS5UcmFuc2Zvcm0oeCwgeSwgeCwgeSk7CisgIG1fbXRDb250ZW50VG9Vc2VyLlRyYW5zZm9ybSh4LCB5LCB4LCB5KTsKIH0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGRUZXh0T2JqZWN0KENGWF9CeXRlU3RyaW5nKiBwU3RycywgRlhfRkxPQVQgZkluaXRLZXJuaW5nLCBGWF9GTE9BVCogcEtlcm5pbmcsIGludCBuc2VncykKLXsKLSAgICBDUERGX0ZvbnQqIHBGb250ID0gbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRGb250KCk7Ci0gICAgaWYgKHBGb250ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoZkluaXRLZXJuaW5nICE9IDApIHsKLSAgICAgICAgaWYgKCFwRm9udC0+SXNWZXJ0V3JpdGluZygpKSB7Ci0gICAgICAgICAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFggLT0gRlhTWVNfTXVsKGZJbml0S2VybmluZywgbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpKSAvIDEwMDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFkgLT0gRlhTWVNfTXVsKGZJbml0S2VybmluZywgbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpKSAvIDEwMDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG5zZWdzID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgdGV4dG1vZGU7Ci0gICAgaWYgKHBGb250LT5HZXRGb250VHlwZSgpID09IFBERkZPTlRfVFlQRTMpIHsKLSAgICAgICAgdGV4dG1vZGUgPSAwOwordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkFkZFRleHRPYmplY3QoQ0ZYX0J5dGVTdHJpbmcqIHBTdHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkluaXRLZXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIHBLZXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5zZWdzKSB7CisgIENQREZfRm9udCogcEZvbnQgPSBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlLkdldEZvbnQoKTsKKyAgaWYgKCFwRm9udCkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoZkluaXRLZXJuaW5nICE9IDApIHsKKyAgICBpZiAoIXBGb250LT5Jc1ZlcnRXcml0aW5nKCkpIHsKKyAgICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0WCAtPQorICAgICAgICAgIEZYU1lTX011bChmSW5pdEtlcm5pbmcsIG1fcEN1clN0YXRlcy0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKSkgLworICAgICAgICAgIDEwMDA7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgdGV4dG1vZGUgPSBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlLkdldE9iamVjdCgpLT5tX1RleHRNb2RlOworICAgICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRZIC09CisgICAgICAgICAgRlhTWVNfTXVsKGZJbml0S2VybmluZywgbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpKSAvCisgICAgICAgICAgMTAwMDsKICAgICB9Ci0gICAgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dCA9IG5ldyBDUERGX1RleHRPYmplY3Q7Ci0gICAgbV9wTGFzdFRleHRPYmplY3QgPSBwVGV4dDsKLSAgICBTZXRHcmFwaGljU3RhdGVzKHBUZXh0LCBUUlVFLCBUUlVFLCBUUlVFKTsKLSAgICBpZiAodGV4dG1vZGUgJiYgdGV4dG1vZGUgIT0gMyAmJiB0ZXh0bW9kZSAhPSA0ICYmIHRleHRtb2RlICE9IDcpIHsKLSAgICAgICAgRlhfRkxPQVQqIHBDVE0gPSBwVGV4dC0+bV9UZXh0U3RhdGUuR2V0TW9kaWZ5KCktPm1fQ1RNOwotICAgICAgICBwQ1RNWzBdID0gbV9wQ3VyU3RhdGVzLT5tX0NUTS5hOwotICAgICAgICBwQ1RNWzFdID0gbV9wQ3VyU3RhdGVzLT5tX0NUTS5jOwotICAgICAgICBwQ1RNWzJdID0gbV9wQ3VyU3RhdGVzLT5tX0NUTS5iOwotICAgICAgICBwQ1RNWzNdID0gbV9wQ3VyU3RhdGVzLT5tX0NUTS5kOworICB9CisgIGlmIChuc2VncyA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIGludCB0ZXh0bW9kZTsKKyAgaWYgKHBGb250LT5HZXRGb250VHlwZSgpID09IFBERkZPTlRfVFlQRTMpIHsKKyAgICB0ZXh0bW9kZSA9IDA7CisgIH0gZWxzZSB7CisgICAgdGV4dG1vZGUgPSBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlLkdldE9iamVjdCgpLT5tX1RleHRNb2RlOworICB9CisgIENQREZfVGV4dE9iamVjdCogcFRleHQgPSBuZXcgQ1BERl9UZXh0T2JqZWN0OworICBtX3BMYXN0VGV4dE9iamVjdCA9IHBUZXh0OworICBTZXRHcmFwaGljU3RhdGVzKHBUZXh0LCBUUlVFLCBUUlVFLCBUUlVFKTsKKyAgaWYgKHRleHRtb2RlICYmIHRleHRtb2RlICE9IDMgJiYgdGV4dG1vZGUgIT0gNCAmJiB0ZXh0bW9kZSAhPSA3KSB7CisgICAgRlhfRkxPQVQqIHBDVE0gPSBwVGV4dC0+bV9UZXh0U3RhdGUuR2V0TW9kaWZ5KCktPm1fQ1RNOworICAgIHBDVE1bMF0gPSBtX3BDdXJTdGF0ZXMtPm1fQ1RNLmE7CisgICAgcENUTVsxXSA9IG1fcEN1clN0YXRlcy0+bV9DVE0uYzsKKyAgICBwQ1RNWzJdID0gbV9wQ3VyU3RhdGVzLT5tX0NUTS5iOworICAgIHBDVE1bM10gPSBtX3BDdXJTdGF0ZXMtPm1fQ1RNLmQ7CisgIH0KKyAgcFRleHQtPlNldFNlZ21lbnRzKHBTdHJzLCBwS2VybmluZywgbnNlZ3MpOworICBwVGV4dC0+bV9Qb3NYID0gbV9wQ3VyU3RhdGVzLT5tX1RleHRYOworICBwVGV4dC0+bV9Qb3NZID0gbV9wQ3VyU3RhdGVzLT5tX1RleHRZICsgbV9wQ3VyU3RhdGVzLT5tX1RleHRSaXNlOworICBDb252ZXJ0VGV4dFNwYWNlKHBUZXh0LT5tX1Bvc1gsIHBUZXh0LT5tX1Bvc1kpOworICBGWF9GTE9BVCB4X2FkdmFuY2UsIHlfYWR2YW5jZTsKKyAgcFRleHQtPkNhbGNQb3NpdGlvbkRhdGEoJnhfYWR2YW5jZSwgJnlfYWR2YW5jZSwgbV9wQ3VyU3RhdGVzLT5tX1RleHRIb3J6U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1fTGV2ZWwpOworICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFggKz0geF9hZHZhbmNlOworICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFkgKz0geV9hZHZhbmNlOworICBpZiAodGV4dG1vZGUgPiAzKSB7CisgICAgQ1BERl9UZXh0T2JqZWN0KiBwQ29weSA9IG5ldyBDUERGX1RleHRPYmplY3Q7CisgICAgcENvcHktPkNvcHkocFRleHQpOworICAgIG1fQ2xpcFRleHRMaXN0LkFkZChwQ29weSk7CisgIH0KKyAgbV9wT2JqZWN0TGlzdC0+bV9PYmplY3RMaXN0LkFkZFRhaWwocFRleHQpOworICBpZiAocEtlcm5pbmcgJiYgcEtlcm5pbmdbbnNlZ3MgLSAxXSAhPSAwKSB7CisgICAgaWYgKCFwRm9udC0+SXNWZXJ0V3JpdGluZygpKSB7CisgICAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFggLT0KKyAgICAgICAgICBGWFNZU19NdWwocEtlcm5pbmdbbnNlZ3MgLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpKSAvCisgICAgICAgICAgMTAwMDsKKyAgICB9IGVsc2UgeworICAgICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRZIC09CisgICAgICAgICAgRlhTWVNfTXVsKHBLZXJuaW5nW25zZWdzIC0gMV0sCisgICAgICAgICAgICAgICAgICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKSkgLworICAgICAgICAgIDEwMDA7CiAgICAgfQotICAgIHBUZXh0LT5TZXRTZWdtZW50cyhwU3RycywgcEtlcm5pbmcsIG5zZWdzKTsKLSAgICBwVGV4dC0+bV9Qb3NYID0gbV9wQ3VyU3RhdGVzLT5tX1RleHRYOwotICAgIHBUZXh0LT5tX1Bvc1kgPSBtX3BDdXJTdGF0ZXMtPm1fVGV4dFkgKyBtX3BDdXJTdGF0ZXMtPm1fVGV4dFJpc2U7Ci0gICAgQ29udmVydFRleHRTcGFjZShwVGV4dC0+bV9Qb3NYLCBwVGV4dC0+bV9Qb3NZKTsKLSAgICBGWF9GTE9BVCB4X2FkdmFuY2UsIHlfYWR2YW5jZTsKLSAgICBwVGV4dC0+Q2FsY1Bvc2l0aW9uRGF0YSgmeF9hZHZhbmNlLCAmeV9hZHZhbmNlLCBtX3BDdXJTdGF0ZXMtPm1fVGV4dEhvcnpTY2FsZSwgbV9MZXZlbCk7Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRYICs9IHhfYWR2YW5jZTsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFkgKz0geV9hZHZhbmNlOwotICAgIGlmICh0ZXh0bW9kZSA+IDMpIHsKLSAgICAgICAgQ1BERl9UZXh0T2JqZWN0KiBwQ29weSA9IG5ldyBDUERGX1RleHRPYmplY3Q7Ci0gICAgICAgIHBDb3B5LT5Db3B5KHBUZXh0KTsKLSAgICAgICAgbV9DbGlwVGV4dExpc3QuQWRkKHBDb3B5KTsKKyAgfQorfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TaG93VGV4dCgpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gR2V0U3RyaW5nKDApOworICBpZiAoc3RyLklzRW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorICBBZGRUZXh0T2JqZWN0KCZzdHIsIDAsIE5VTEwsIDEpOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TaG93VGV4dF9Qb3NpdGlvbmluZygpIHsKKyAgQ1BERl9BcnJheSogcEFycmF5ID0gR2V0T2JqZWN0KDApID8gR2V0T2JqZWN0KDApLT5HZXRBcnJheSgpIDogTlVMTDsKKyAgaWYgKCFwQXJyYXkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IG4gPSBwQXJyYXktPkdldENvdW50KCk7CisgIGludCBuc2VncyA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgaWYgKHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKGkpLT5Jc1N0cmluZygpKQorICAgICAgbnNlZ3MrKzsKKyAgfQorICBpZiAobnNlZ3MgPT0gMCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFggLT0KKyAgICAgICAgICBGWFNZU19NdWwocEFycmF5LT5HZXROdW1iZXIoaSksCisgICAgICAgICAgICAgICAgICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKSkgLworICAgICAgICAgIDEwMDA7CiAgICAgfQotICAgIG1fcE9iamVjdExpc3QtPm1fT2JqZWN0TGlzdC5BZGRUYWlsKHBUZXh0KTsKLSAgICBpZiAocEtlcm5pbmcgJiYgcEtlcm5pbmdbbnNlZ3MgLSAxXSAhPSAwKSB7Ci0gICAgICAgIGlmICghcEZvbnQtPklzVmVydFdyaXRpbmcoKSkgewotICAgICAgICAgICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRYIC09IEZYU1lTX011bChwS2VybmluZ1tuc2VncyAtIDFdLCBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCkpIC8gMTAwMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0WSAtPSBGWFNZU19NdWwocEtlcm5pbmdbbnNlZ3MgLSAxXSwgbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpKSAvIDEwMDA7Ci0gICAgICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcqIHBTdHJzID0gbmV3IENGWF9CeXRlU3RyaW5nW25zZWdzXTsKKyAgRlhfRkxPQVQqIHBLZXJuaW5nID0gRlhfQWxsb2MoRlhfRkxPQVQsIG5zZWdzKTsKKyAgaW50IGlTZWdtZW50ID0gMDsKKyAgRlhfRkxPQVQgZkluaXRLZXJuaW5nID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBDUERGX09iamVjdCogcE9iaiA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKGkpOworICAgIGlmIChwT2JqLT5Jc1N0cmluZygpKSB7CisgICAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBwT2JqLT5HZXRTdHJpbmcoKTsKKyAgICAgIGlmIChzdHIuSXNFbXB0eSgpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgcFN0cnNbaVNlZ21lbnRdID0gc3RyOworICAgICAgcEtlcm5pbmdbaVNlZ21lbnQrK10gPSAwOworICAgIH0gZWxzZSB7CisgICAgICBGWF9GTE9BVCBudW0gPSBwT2JqID8gcE9iai0+R2V0TnVtYmVyKCkgOiAwOworICAgICAgaWYgKGlTZWdtZW50ID09IDApIHsKKyAgICAgICAgZkluaXRLZXJuaW5nICs9IG51bTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBLZXJuaW5nW2lTZWdtZW50IC0gMV0gKz0gbnVtOworICAgICAgfQogICAgIH0KKyAgfQorICBBZGRUZXh0T2JqZWN0KHBTdHJzLCBmSW5pdEtlcm5pbmcsIHBLZXJuaW5nLCBpU2VnbWVudCk7CisgIGRlbGV0ZVtdIHBTdHJzOworICBGWF9GcmVlKHBLZXJuaW5nKTsKIH0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2hvd1RleHQoKQotewotICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IEdldFN0cmluZygwKTsKLSAgICBpZiAoc3RyLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm47Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldFRleHRMZWFkaW5nKCkgeworICBtX3BDdXJTdGF0ZXMtPm1fVGV4dExlYWRpbmcgPSBHZXROdW1iZXIoMCk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldFRleHRNYXRyaXgoKSB7CisgIG1fcEN1clN0YXRlcy0+bV9UZXh0TWF0cml4LlNldChHZXROdW1iZXIxNig1KSwgR2V0TnVtYmVyMTYoNCksIEdldE51bWJlcjE2KDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TnVtYmVyMTYoMiksIEdldE51bWJlcigxKSwgR2V0TnVtYmVyKDApKTsKKyAgT25DaGFuZ2VUZXh0TWF0cml4KCk7CisgIG1fcEN1clN0YXRlcy0+bV9UZXh0WCA9IDA7CisgIG1fcEN1clN0YXRlcy0+bV9UZXh0WSA9IDA7CisgIG1fcEN1clN0YXRlcy0+bV9UZXh0TGluZVggPSAwOworICBtX3BDdXJTdGF0ZXMtPm1fVGV4dExpbmVZID0gMDsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpPbkNoYW5nZVRleHRNYXRyaXgoKSB7CisgIENGWF9NYXRyaXggdGV4dF9tYXRyaXgobV9wQ3VyU3RhdGVzLT5tX1RleHRIb3J6U2NhbGUsIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgMC4wZik7CisgIHRleHRfbWF0cml4LkNvbmNhdChtX3BDdXJTdGF0ZXMtPm1fVGV4dE1hdHJpeCk7CisgIHRleHRfbWF0cml4LkNvbmNhdChtX3BDdXJTdGF0ZXMtPm1fQ1RNKTsKKyAgdGV4dF9tYXRyaXguQ29uY2F0KG1fbXRDb250ZW50VG9Vc2VyKTsKKyAgRlhfRkxPQVQqIHBUZXh0TWF0cml4ID0gbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRNb2RpZnkoKS0+bV9NYXRyaXg7CisgIHBUZXh0TWF0cml4WzBdID0gdGV4dF9tYXRyaXguYTsKKyAgcFRleHRNYXRyaXhbMV0gPSB0ZXh0X21hdHJpeC5jOworICBwVGV4dE1hdHJpeFsyXSA9IHRleHRfbWF0cml4LmI7CisgIHBUZXh0TWF0cml4WzNdID0gdGV4dF9tYXRyaXguZDsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0VGV4dFJlbmRlck1vZGUoKSB7CisgIGludCBtb2RlID0gR2V0SW50ZWdlcigwKTsKKyAgaWYgKG1vZGUgPCAwIHx8IG1vZGUgPiA3KSB7CisgICAgcmV0dXJuOworICB9CisgIG1fcEN1clN0YXRlcy0+bV9UZXh0U3RhdGUuR2V0TW9kaWZ5KCktPm1fVGV4dE1vZGUgPSBtb2RlOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRUZXh0UmlzZSgpIHsKKyAgbV9wQ3VyU3RhdGVzLT5tX1RleHRSaXNlID0gR2V0TnVtYmVyKDApOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRXb3JkU3BhY2UoKSB7CisgIG1fcEN1clN0YXRlcy0+bV9UZXh0U3RhdGUuR2V0TW9kaWZ5KCktPm1fV29yZFNwYWNlID0gR2V0TnVtYmVyKDApOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRIb3J6U2NhbGUoKSB7CisgIGlmIChtX1BhcmFtQ291bnQgIT0gMSkgeworICAgIHJldHVybjsKKyAgfQorICBtX3BDdXJTdGF0ZXMtPm1fVGV4dEhvcnpTY2FsZSA9IEdldE51bWJlcigwKSAvIDEwMDsKKyAgT25DaGFuZ2VUZXh0TWF0cml4KCk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX01vdmVUb05leHRMaW5lKCkgeworICBtX3BDdXJTdGF0ZXMtPm1fVGV4dExpbmVZIC09IG1fcEN1clN0YXRlcy0+bV9UZXh0TGVhZGluZzsKKyAgbV9wQ3VyU3RhdGVzLT5tX1RleHRYID0gbV9wQ3VyU3RhdGVzLT5tX1RleHRMaW5lWDsKKyAgbV9wQ3VyU3RhdGVzLT5tX1RleHRZID0gbV9wQ3VyU3RhdGVzLT5tX1RleHRMaW5lWTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQ3VydmVUb18yMygpIHsKKyAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgeworICAgIHJldHVybjsKKyAgfQorICBBZGRQYXRoUG9pbnQobV9QYXRoQ3VycmVudFgsIG1fUGF0aEN1cnJlbnRZLCBGWFBUX0JFWklFUlRPKTsKKyAgQWRkUGF0aFBvaW50KEdldE51bWJlcigzKSwgR2V0TnVtYmVyKDIpLCBGWFBUX0JFWklFUlRPKTsKKyAgQWRkUGF0aFBvaW50KEdldE51bWJlcigxKSwgR2V0TnVtYmVyKDApLCBGWFBUX0JFWklFUlRPKTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0TGluZVdpZHRoKCkgeworICBGWF9GTE9BVCB3aWR0aCA9IEdldE51bWJlcigwKTsKKyAgbV9wQ3VyU3RhdGVzLT5tX0dyYXBoU3RhdGUuR2V0TW9kaWZ5KCktPm1fTGluZVdpZHRoID0gd2lkdGg7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0NsaXAoKSB7CisgIG1fUGF0aENsaXBUeXBlID0gRlhGSUxMX1dJTkRJTkc7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0VPQ2xpcCgpIHsKKyAgbV9QYXRoQ2xpcFR5cGUgPSBGWEZJTExfQUxURVJOQVRFOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9DdXJ2ZVRvXzEzKCkgeworICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7CisgICAgcmV0dXJuOworICB9CisgIEFkZFBhdGhQb2ludChHZXROdW1iZXIoMyksIEdldE51bWJlcigyKSwgRlhQVF9CRVpJRVJUTyk7CisgIEFkZFBhdGhQb2ludChHZXROdW1iZXIoMSksIEdldE51bWJlcigwKSwgRlhQVF9CRVpJRVJUTyk7CisgIEFkZFBhdGhQb2ludChHZXROdW1iZXIoMSksIEdldE51bWJlcigwKSwgRlhQVF9CRVpJRVJUTyk7Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX05leHRMaW5lU2hvd1RleHQoKSB7CisgIEhhbmRsZV9Nb3ZlVG9OZXh0TGluZSgpOworICBIYW5kbGVfU2hvd1RleHQoKTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfTmV4dExpbmVTaG93VGV4dF9TcGFjZSgpIHsKKyAgbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRNb2RpZnkoKS0+bV9Xb3JkU3BhY2UgPSBHZXROdW1iZXIoMik7CisgIG1fcEN1clN0YXRlcy0+bV9UZXh0U3RhdGUuR2V0TW9kaWZ5KCktPm1fQ2hhclNwYWNlID0gR2V0TnVtYmVyKDEpOworICBIYW5kbGVfTmV4dExpbmVTaG93VGV4dCgpOworfQordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9JbnZhbGlkKCkge30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGRQYXRoUG9pbnQoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgaW50IGZsYWcpIHsKKyAgbV9QYXRoQ3VycmVudFggPSB4OworICBtX1BhdGhDdXJyZW50WSA9IHk7CisgIGlmIChmbGFnID09IEZYUFRfTU9WRVRPKSB7CisgICAgbV9QYXRoU3RhcnRYID0geDsKKyAgICBtX1BhdGhTdGFydFkgPSB5OworICAgIGlmIChtX1BhdGhQb2ludENvdW50ICYmCisgICAgICAgIG1fcFBhdGhQb2ludHNbbV9QYXRoUG9pbnRDb3VudCAtIDFdLm1fRmxhZyA9PSBGWFBUX01PVkVUTykgeworICAgICAgbV9wUGF0aFBvaW50c1ttX1BhdGhQb2ludENvdW50IC0gMV0ubV9Qb2ludFggPSB4OworICAgICAgbV9wUGF0aFBvaW50c1ttX1BhdGhQb2ludENvdW50IC0gMV0ubV9Qb2ludFkgPSB5OworICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBBZGRUZXh0T2JqZWN0KCZzdHIsIDAsIE5VTEwsIDEpOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TaG93VGV4dF9Qb3NpdGlvbmluZygpCi17Ci0gICAgQ1BERl9BcnJheSogcEFycmF5ID0gR2V0T2JqZWN0KDApID8gR2V0T2JqZWN0KDApLT5HZXRBcnJheSgpIDogTlVMTDsKLSAgICBpZiAocEFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKG1fUGF0aFBvaW50Q291bnQgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBtX1BhdGhQb2ludENvdW50Kys7CisgIGlmIChtX1BhdGhQb2ludENvdW50ID4gbV9QYXRoQWxsb2NTaXplKSB7CisgICAgaW50IG5ld3NpemUgPSBtX1BhdGhQb2ludENvdW50ICsgMjU2OworICAgIEZYX1BBVEhQT0lOVCogcE5ld1BvaW50cyA9IEZYX0FsbG9jKEZYX1BBVEhQT0lOVCwgbmV3c2l6ZSk7CisgICAgaWYgKG1fUGF0aEFsbG9jU2l6ZSkgeworICAgICAgRlhTWVNfbWVtY3B5KHBOZXdQb2ludHMsIG1fcFBhdGhQb2ludHMsCisgICAgICAgICAgICAgICAgICAgbV9QYXRoQWxsb2NTaXplICogc2l6ZW9mKEZYX1BBVEhQT0lOVCkpOworICAgICAgRlhfRnJlZShtX3BQYXRoUG9pbnRzKTsKICAgICB9Ci0gICAgaW50IG4gPSBwQXJyYXktPkdldENvdW50KCksIG5zZWdzID0gMCwgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSArKykgewotICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKGkpOwotICAgICAgICBpZiAocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcpIHsKLSAgICAgICAgICAgIG5zZWdzICsrOwotICAgICAgICB9CisgICAgbV9wUGF0aFBvaW50cyA9IHBOZXdQb2ludHM7CisgICAgbV9QYXRoQWxsb2NTaXplID0gbmV3c2l6ZTsKKyAgfQorICBtX3BQYXRoUG9pbnRzW21fUGF0aFBvaW50Q291bnQgLSAxXS5tX0ZsYWcgPSBmbGFnOworICBtX3BQYXRoUG9pbnRzW21fUGF0aFBvaW50Q291bnQgLSAxXS5tX1BvaW50WCA9IHg7CisgIG1fcFBhdGhQb2ludHNbbV9QYXRoUG9pbnRDb3VudCAtIDFdLm1fUG9pbnRZID0geTsKK30KK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGRQYXRoT2JqZWN0KGludCBGaWxsVHlwZSwgRlhfQk9PTCBiU3Ryb2tlKSB7CisgIGludCBQYXRoUG9pbnRDb3VudCA9IG1fUGF0aFBvaW50Q291bnQsIFBhdGhDbGlwVHlwZSA9IG1fUGF0aENsaXBUeXBlOworICBtX1BhdGhQb2ludENvdW50ID0gMDsKKyAgbV9QYXRoQ2xpcFR5cGUgPSAwOworICBpZiAoUGF0aFBvaW50Q291bnQgPD0gMSkgeworICAgIGlmIChQYXRoUG9pbnRDb3VudCAmJiBQYXRoQ2xpcFR5cGUpIHsKKyAgICAgIENQREZfUGF0aCBwYXRoOworICAgICAgcGF0aC5OZXcoKS0+QXBwZW5kUmVjdCgwLCAwLCAwLCAwKTsKKyAgICAgIG1fcEN1clN0YXRlcy0+bV9DbGlwUGF0aC5BcHBlbmRQYXRoKHBhdGgsIEZYRklMTF9XSU5ESU5HLCBUUlVFKTsKICAgICB9Ci0gICAgaWYgKG5zZWdzID09IDApIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkgKyspIHsKLSAgICAgICAgICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0WCAtPSBGWFNZU19NdWwocEFycmF5LT5HZXROdW1iZXIoaSksIG1fcEN1clN0YXRlcy0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKSkgLyAxMDAwOwotICAgICAgICB9OwotICAgICAgICByZXR1cm47CisgICAgcmV0dXJuOworICB9CisgIGlmIChQYXRoUG9pbnRDb3VudCAmJgorICAgICAgbV9wUGF0aFBvaW50c1tQYXRoUG9pbnRDb3VudCAtIDFdLm1fRmxhZyA9PSBGWFBUX01PVkVUTykgeworICAgIFBhdGhQb2ludENvdW50LS07CisgIH0KKyAgQ1BERl9QYXRoIFBhdGg7CisgIENGWF9QYXRoRGF0YSogcFBhdGhEYXRhID0gUGF0aC5OZXcoKTsKKyAgcFBhdGhEYXRhLT5TZXRQb2ludENvdW50KFBhdGhQb2ludENvdW50KTsKKyAgRlhTWVNfbWVtY3B5KHBQYXRoRGF0YS0+R2V0UG9pbnRzKCksIG1fcFBhdGhQb2ludHMsCisgICAgICAgICAgICAgICBzaXplb2YoRlhfUEFUSFBPSU5UKSAqIFBhdGhQb2ludENvdW50KTsKKyAgQ0ZYX01hdHJpeCBtYXRyaXggPSBtX3BDdXJTdGF0ZXMtPm1fQ1RNOworICBtYXRyaXguQ29uY2F0KG1fbXRDb250ZW50VG9Vc2VyKTsKKyAgaWYgKGJTdHJva2UgfHwgRmlsbFR5cGUpIHsKKyAgICBDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqID0gbmV3IENQREZfUGF0aE9iamVjdDsKKyAgICBwUGF0aE9iai0+bV9iU3Ryb2tlID0gYlN0cm9rZTsKKyAgICBwUGF0aE9iai0+bV9GaWxsVHlwZSA9IEZpbGxUeXBlOworICAgIHBQYXRoT2JqLT5tX1BhdGggPSBQYXRoOworICAgIHBQYXRoT2JqLT5tX01hdHJpeCA9IG1hdHJpeDsKKyAgICBTZXRHcmFwaGljU3RhdGVzKHBQYXRoT2JqLCBUUlVFLCBGQUxTRSwgVFJVRSk7CisgICAgcFBhdGhPYmotPkNhbGNCb3VuZGluZ0JveCgpOworICAgIG1fcE9iamVjdExpc3QtPm1fT2JqZWN0TGlzdC5BZGRUYWlsKHBQYXRoT2JqKTsKKyAgfQorICBpZiAoUGF0aENsaXBUeXBlKSB7CisgICAgaWYgKCFtYXRyaXguSXNJZGVudGl0eSgpKSB7CisgICAgICBQYXRoLlRyYW5zZm9ybSgmbWF0cml4KTsKKyAgICAgIG1hdHJpeC5TZXRJZGVudGl0eSgpOwogICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyogcFN0cnMgPSBuZXcgQ0ZYX0J5dGVTdHJpbmdbbnNlZ3NdOwotICAgIEZYX0ZMT0FUKiBwS2VybmluZyA9IEZYX0FsbG9jKEZYX0ZMT0FULCBuc2Vncyk7Ci0gICAgaW50IGlTZWdtZW50ID0gMDsKLSAgICBGWF9GTE9BVCBmSW5pdEtlcm5pbmcgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpICsrKSB7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoaSk7Ci0gICAgICAgIGlmIChwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUklORykgewotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gcE9iai0+R2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAoc3RyLklzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFN0cnNbaVNlZ21lbnRdID0gc3RyOwotICAgICAgICAgICAgcEtlcm5pbmdbaVNlZ21lbnQgKytdID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZYX0ZMT0FUIG51bSA9IHBPYmogPyBwT2JqLT5HZXROdW1iZXIoKSA6IDA7Ci0gICAgICAgICAgICBpZiAoaVNlZ21lbnQgPT0gMCkgewotICAgICAgICAgICAgICAgIGZJbml0S2VybmluZyArPSBudW07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBLZXJuaW5nW2lTZWdtZW50IC0gMV0gKz0gbnVtOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIEFkZFRleHRPYmplY3QocFN0cnMsIGZJbml0S2VybmluZywgcEtlcm5pbmcsIGlTZWdtZW50KTsKLSAgICBkZWxldGVbXSBwU3RyczsKLSAgICBGWF9GcmVlKHBLZXJuaW5nKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0VGV4dExlYWRpbmcoKQotewotICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0TGVhZGluZyA9IEdldE51bWJlcigwKTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0VGV4dE1hdHJpeCgpCi17Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRNYXRyaXguU2V0KEdldE51bWJlcjE2KDUpLCBHZXROdW1iZXIxNig0KSwgR2V0TnVtYmVyMTYoMyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldE51bWJlcjE2KDIpLCBHZXROdW1iZXIoMSksIEdldE51bWJlcigwKSk7Ci0gICAgT25DaGFuZ2VUZXh0TWF0cml4KCk7Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRYID0gMDsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFkgPSAwOwotICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0TGluZVggPSAwOwotICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0TGluZVkgPSAwOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6Ok9uQ2hhbmdlVGV4dE1hdHJpeCgpCi17Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCB0ZXh0X21hdHJpeChtX3BDdXJTdGF0ZXMtPm1fVGV4dEhvcnpTY2FsZSwgMC4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMC4wZik7Ci0gICAgdGV4dF9tYXRyaXguQ29uY2F0KG1fcEN1clN0YXRlcy0+bV9UZXh0TWF0cml4KTsKLSAgICB0ZXh0X21hdHJpeC5Db25jYXQobV9wQ3VyU3RhdGVzLT5tX0NUTSk7Ci0gICAgdGV4dF9tYXRyaXguQ29uY2F0KG1fbXRDb250ZW50VG9Vc2VyKTsKLSAgICBGWF9GTE9BVCogcFRleHRNYXRyaXggPSBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlLkdldE1vZGlmeSgpLT5tX01hdHJpeDsKLSAgICBwVGV4dE1hdHJpeFswXSA9IHRleHRfbWF0cml4LmE7Ci0gICAgcFRleHRNYXRyaXhbMV0gPSB0ZXh0X21hdHJpeC5jOwotICAgIHBUZXh0TWF0cml4WzJdID0gdGV4dF9tYXRyaXguYjsKLSAgICBwVGV4dE1hdHJpeFszXSA9IHRleHRfbWF0cml4LmQ7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldFRleHRSZW5kZXJNb2RlKCkKLXsKLSAgICBpbnQgbW9kZSA9IEdldEludGVnZXIoMCk7Ci0gICAgaWYgKG1vZGUgPCAwIHx8IG1vZGUgPiA3KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRNb2RpZnkoKS0+bV9UZXh0TW9kZSA9IG1vZGU7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldFRleHRSaXNlKCkKLXsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFJpc2UgPSBHZXROdW1iZXIoMCk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldFdvcmRTcGFjZSgpCi17Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRNb2RpZnkoKS0+bV9Xb3JkU3BhY2UgPSBHZXROdW1iZXIoMCk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldEhvcnpTY2FsZSgpCi17Ci0gICAgaWYgKG1fUGFyYW1Db3VudCAhPSAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRIb3J6U2NhbGUgPSBHZXROdW1iZXIoMCkgLyAxMDA7Ci0gICAgT25DaGFuZ2VUZXh0TWF0cml4KCk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX01vdmVUb05leHRMaW5lKCkKLXsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dExpbmVZIC09IG1fcEN1clN0YXRlcy0+bV9UZXh0TGVhZGluZzsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFggPSBtX3BDdXJTdGF0ZXMtPm1fVGV4dExpbmVYOwotICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0WSA9IG1fcEN1clN0YXRlcy0+bV9UZXh0TGluZVk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0N1cnZlVG9fMjMoKQotewotICAgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBZGRQYXRoUG9pbnQobV9QYXRoQ3VycmVudFgsIG1fUGF0aEN1cnJlbnRZLCBGWFBUX0JFWklFUlRPKTsKLSAgICBBZGRQYXRoUG9pbnQoR2V0TnVtYmVyKDMpLCBHZXROdW1iZXIoMiksIEZYUFRfQkVaSUVSVE8pOwotICAgIEFkZFBhdGhQb2ludChHZXROdW1iZXIoMSksIEdldE51bWJlcigwKSwgRlhQVF9CRVpJRVJUTyk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldExpbmVXaWR0aCgpCi17Ci0gICAgRlhfRkxPQVQgd2lkdGggPSBHZXROdW1iZXIoMCk7Ci0gICAgbV9wQ3VyU3RhdGVzLT5tX0dyYXBoU3RhdGUuR2V0TW9kaWZ5KCktPm1fTGluZVdpZHRoID0gd2lkdGg7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0NsaXAoKQotewotICAgIG1fUGF0aENsaXBUeXBlID0gRlhGSUxMX1dJTkRJTkc7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0VPQ2xpcCgpCi17Ci0gICAgbV9QYXRoQ2xpcFR5cGUgPSBGWEZJTExfQUxURVJOQVRFOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9DdXJ2ZVRvXzEzKCkKLXsKLSAgICBpZiAobV9PcHRpb25zLm1fYlRleHRPbmx5KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQWRkUGF0aFBvaW50KEdldE51bWJlcigzKSwgR2V0TnVtYmVyKDIpLCBGWFBUX0JFWklFUlRPKTsKLSAgICBBZGRQYXRoUG9pbnQoR2V0TnVtYmVyKDEpLCBHZXROdW1iZXIoMCksIEZYUFRfQkVaSUVSVE8pOwotICAgIEFkZFBhdGhQb2ludChHZXROdW1iZXIoMSksIEdldE51bWJlcigwKSwgRlhQVF9CRVpJRVJUTyk7Ci19Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX05leHRMaW5lU2hvd1RleHQoKQotewotICAgIEhhbmRsZV9Nb3ZlVG9OZXh0TGluZSgpOwotICAgIEhhbmRsZV9TaG93VGV4dCgpOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9OZXh0TGluZVNob3dUZXh0X1NwYWNlKCkKLXsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlLkdldE1vZGlmeSgpLT5tX1dvcmRTcGFjZSA9IEdldE51bWJlcigyKTsKLSAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlLkdldE1vZGlmeSgpLT5tX0NoYXJTcGFjZSA9IEdldE51bWJlcigxKTsKLSAgICBIYW5kbGVfTmV4dExpbmVTaG93VGV4dCgpOwotfQotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9JbnZhbGlkKCkKLXsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGRQYXRoUG9pbnQoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgaW50IGZsYWcpCi17Ci0gICAgbV9QYXRoQ3VycmVudFggPSB4OwotICAgIG1fUGF0aEN1cnJlbnRZID0geTsKLSAgICBpZiAoZmxhZyA9PSBGWFBUX01PVkVUTykgewotICAgICAgICBtX1BhdGhTdGFydFggPSB4OwotICAgICAgICBtX1BhdGhTdGFydFkgPSB5OwotICAgICAgICBpZiAobV9QYXRoUG9pbnRDb3VudCAmJiBtX3BQYXRoUG9pbnRzW21fUGF0aFBvaW50Q291bnQgLSAxXS5tX0ZsYWcgPT0gRlhQVF9NT1ZFVE8pIHsKLSAgICAgICAgICAgIG1fcFBhdGhQb2ludHNbbV9QYXRoUG9pbnRDb3VudCAtIDFdLm1fUG9pbnRYID0geDsKLSAgICAgICAgICAgIG1fcFBhdGhQb2ludHNbbV9QYXRoUG9pbnRDb3VudCAtIDFdLm1fUG9pbnRZID0geTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobV9QYXRoUG9pbnRDb3VudCA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9QYXRoUG9pbnRDb3VudCArKzsKLSAgICBpZiAobV9QYXRoUG9pbnRDb3VudCA+IG1fUGF0aEFsbG9jU2l6ZSkgewotICAgICAgICBpbnQgbmV3c2l6ZSA9IG1fUGF0aFBvaW50Q291bnQgKyAyNTY7Ci0gICAgICAgIEZYX1BBVEhQT0lOVCogcE5ld1BvaW50cyA9IEZYX0FsbG9jKEZYX1BBVEhQT0lOVCwgbmV3c2l6ZSk7Ci0gICAgICAgIGlmIChtX1BhdGhBbGxvY1NpemUpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKHBOZXdQb2ludHMsIG1fcFBhdGhQb2ludHMsIG1fUGF0aEFsbG9jU2l6ZSAqIHNpemVvZihGWF9QQVRIUE9JTlQpKTsKLSAgICAgICAgICAgIEZYX0ZyZWUobV9wUGF0aFBvaW50cyk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wUGF0aFBvaW50cyA9IHBOZXdQb2ludHM7Ci0gICAgICAgIG1fUGF0aEFsbG9jU2l6ZSA9IG5ld3NpemU7Ci0gICAgfQotICAgIG1fcFBhdGhQb2ludHNbbV9QYXRoUG9pbnRDb3VudCAtIDFdLm1fRmxhZyA9IGZsYWc7Ci0gICAgbV9wUGF0aFBvaW50c1ttX1BhdGhQb2ludENvdW50IC0gMV0ubV9Qb2ludFggPSB4OwotICAgIG1fcFBhdGhQb2ludHNbbV9QYXRoUG9pbnRDb3VudCAtIDFdLm1fUG9pbnRZID0geTsKLX0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGRQYXRoT2JqZWN0KGludCBGaWxsVHlwZSwgRlhfQk9PTCBiU3Ryb2tlKQotewotICAgIGludCBQYXRoUG9pbnRDb3VudCA9IG1fUGF0aFBvaW50Q291bnQsIFBhdGhDbGlwVHlwZSA9IG1fUGF0aENsaXBUeXBlOwotICAgIG1fUGF0aFBvaW50Q291bnQgPSAwOwotICAgIG1fUGF0aENsaXBUeXBlID0gMDsKLSAgICBpZiAoUGF0aFBvaW50Q291bnQgPD0gMSkgewotICAgICAgICBpZiAoUGF0aFBvaW50Q291bnQgJiYgUGF0aENsaXBUeXBlKSB7Ci0gICAgICAgICAgICBDUERGX1BhdGggcGF0aDsKLSAgICAgICAgICAgIHBhdGguTmV3KCktPkFwcGVuZFJlY3QoMCwgMCwgMCwgMCk7Ci0gICAgICAgICAgICBtX3BDdXJTdGF0ZXMtPm1fQ2xpcFBhdGguQXBwZW5kUGF0aChwYXRoLCBGWEZJTExfV0lORElORywgVFJVRSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoUGF0aFBvaW50Q291bnQgJiYgbV9wUGF0aFBvaW50c1tQYXRoUG9pbnRDb3VudCAtIDFdLm1fRmxhZyA9PSBGWFBUX01PVkVUTykgewotICAgICAgICBQYXRoUG9pbnRDb3VudCAtLTsKLSAgICB9Ci0gICAgQ1BERl9QYXRoIFBhdGg7Ci0gICAgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEgPSBQYXRoLk5ldygpOwotICAgIHBQYXRoRGF0YS0+U2V0UG9pbnRDb3VudChQYXRoUG9pbnRDb3VudCk7Ci0gICAgRlhTWVNfbWVtY3B5MzIocFBhdGhEYXRhLT5HZXRQb2ludHMoKSwgbV9wUGF0aFBvaW50cywgc2l6ZW9mKEZYX1BBVEhQT0lOVCkgKiBQYXRoUG9pbnRDb3VudCk7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXggPSBtX3BDdXJTdGF0ZXMtPm1fQ1RNOwotICAgIG1hdHJpeC5Db25jYXQobV9tdENvbnRlbnRUb1VzZXIpOwotICAgIGlmIChiU3Ryb2tlIHx8IEZpbGxUeXBlKSB7Ci0gICAgICAgIENQREZfUGF0aE9iamVjdCogcFBhdGhPYmogPSBuZXcgQ1BERl9QYXRoT2JqZWN0OwotICAgICAgICBwUGF0aE9iai0+bV9iU3Ryb2tlID0gYlN0cm9rZTsKLSAgICAgICAgcFBhdGhPYmotPm1fRmlsbFR5cGUgPSBGaWxsVHlwZTsKLSAgICAgICAgcFBhdGhPYmotPm1fUGF0aCA9IFBhdGg7Ci0gICAgICAgIHBQYXRoT2JqLT5tX01hdHJpeCA9IG1hdHJpeDsKLSAgICAgICAgU2V0R3JhcGhpY1N0YXRlcyhwUGF0aE9iaiwgVFJVRSwgRkFMU0UsIFRSVUUpOwotICAgICAgICBwUGF0aE9iai0+Q2FsY0JvdW5kaW5nQm94KCk7Ci0gICAgICAgIG1fcE9iamVjdExpc3QtPm1fT2JqZWN0TGlzdC5BZGRUYWlsKHBQYXRoT2JqKTsKLSAgICB9Ci0gICAgaWYgKFBhdGhDbGlwVHlwZSkgewotICAgICAgICBpZiAoIW1hdHJpeC5Jc0lkZW50aXR5KCkpIHsKLSAgICAgICAgICAgIFBhdGguVHJhbnNmb3JtKCZtYXRyaXgpOwotICAgICAgICAgICAgbWF0cml4LlNldElkZW50aXR5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wQ3VyU3RhdGVzLT5tX0NsaXBQYXRoLkFwcGVuZFBhdGgoUGF0aCwgUGF0aENsaXBUeXBlLCBUUlVFKTsKLSAgICB9Ci19Ci1DRlhfQnl0ZVN0cmluZyBfRlBERl9CeXRlU3RyaW5nRnJvbUhleChDRlhfQmluYXJ5QnVmJiBzcmNfYnVmKQotewotICAgIENGWF9CeXRlVGV4dEJ1ZiBidWY7Ci0gICAgRlhfQk9PTCBiRmlyc3QgPSBUUlVFOwotICAgIGludCBjb2RlID0gMDsKLSAgICBGWF9MUENCWVRFIHN0ciA9IHNyY19idWYuR2V0QnVmZmVyKCk7Ci0gICAgRlhfRFdPUkQgc2l6ZSA9IHNyY19idWYuR2V0U2l6ZSgpOwotICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBzaXplOyBpICsrKSB7Ci0gICAgICAgIEZYX0JZVEUgY2ggPSBzdHJbaV07Ci0gICAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7Ci0gICAgICAgICAgICBpZiAoYkZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgY29kZSA9IChjaCAtICcwJykgKiAxNjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29kZSArPSBjaCAtICcwJzsKLSAgICAgICAgICAgICAgICBidWYuQXBwZW5kQ2hhcigoY2hhciljb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJGaXJzdCA9ICFiRmlyc3Q7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykgewotICAgICAgICAgICAgaWYgKGJGaXJzdCkgewotICAgICAgICAgICAgICAgIGNvZGUgPSAoY2ggLSAnQScgKyAxMCkgKiAxNjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29kZSArPSBjaCAtICdBJyArIDEwOwotICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKChjaGFyKWNvZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYkZpcnN0ID0gIWJGaXJzdDsKLSAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKSB7Ci0gICAgICAgICAgICBpZiAoYkZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgY29kZSA9IChjaCAtICdhJyArIDEwKSAqIDE2OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb2RlICs9IGNoIC0gJ2EnICsgMTA7Ci0gICAgICAgICAgICAgICAgYnVmLkFwcGVuZENoYXIoKGNoYXIpY29kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiRmlyc3QgPSAhYkZpcnN0OwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghYkZpcnN0KSB7Ci0gICAgICAgIGJ1Zi5BcHBlbmRDaGFyKChjaGFyKWNvZGUpOwotICAgIH0KLSAgICByZXR1cm4gYnVmLkdldEJ5dGVTdHJpbmcoKTsKKyAgICBtX3BDdXJTdGF0ZXMtPm1fQ2xpcFBhdGguQXBwZW5kUGF0aChQYXRoLCBQYXRoQ2xpcFR5cGUsIFRSVUUpOworICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGFyc2VyX29sZC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGFyc2VyX29sZC5jcHAKaW5kZXggZDhiMjQ1OS4uMzNhNTY2YyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhcnNlcl9vbGQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXJzZXJfb2xkLmNwcApAQCAtMSwxMTUwICsxLDExMDAgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2UuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCIKLSNpbmNsdWRlICJwYWdlaW50LmgiCisjaW5jbHVkZSAiY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvcGFnZWludC5oIgorCiAjaW5jbHVkZSA8bGltaXRzLmg+Ci1leHRlcm4gY29uc3QgRlhfTFBDU1RSIF9QREZfT3BDaGFyVHlwZSA9Ci0gICAgIklJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJIgotICAgICJJSVZJSUlJVklJVklJSUlJVlZJSUlJSUlJSUlJSUlJSSIKLSAgICAiSUlWVlZWVlZJVlZWVlZWSVZWVlZWSUlWVklJSUlJSUkiCi0gICAgIklJVlZWVlZWVlZWVlZWVlZJVlZWSUlWVklWVklJSUlJIgotICAgICJJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSSIKLSAgICAiSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUkiCi0gICAgIklJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJIgotICAgICJJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSSI7Ci1GWF9CT09MIF9QREZfSGFzSW52YWxpZE9wQ2hhcihGWF9MUENTVFIgb3ApCi17Ci0gICAgaWYoIW9wKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfQllURSBjaDsKLSAgICB3aGlsZSgoY2ggPSAqb3ArKykpIHsKLSAgICAgICAgaWYoX1BERl9PcENoYXJUeXBlW2NoXSA9PSAnSScpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfZXh0LmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgY2hhciBrUGF0aE9wZXJhdG9yU3VicGF0aCA9ICdtJzsKK2NvbnN0IGNoYXIga1BhdGhPcGVyYXRvckxpbmUgPSAnbCc7Citjb25zdCBjaGFyIGtQYXRoT3BlcmF0b3JDdWJpY0JlemllcjEgPSAnYyc7Citjb25zdCBjaGFyIGtQYXRoT3BlcmF0b3JDdWJpY0JlemllcjIgPSAndic7Citjb25zdCBjaGFyIGtQYXRoT3BlcmF0b3JDdWJpY0JlemllcjMgPSAneSc7Citjb25zdCBjaGFyIGtQYXRoT3BlcmF0b3JDbG9zZVBhdGggPSAnaCc7Citjb25zdCBjaGFyIGtQYXRoT3BlcmF0b3JSZWN0YW5nbGVbXSA9ICJyZSI7CisKK30gIC8vIG5hbWVzcGFjZQorCiBjbGFzcyBDUERGX1N0cmVhbVBhcnNlckF1dG9DbGVhcmVyIHsKLSAgcHVibGljOgotICAgIENQREZfU3RyZWFtUGFyc2VyQXV0b0NsZWFyZXIoQ1BERl9TdHJlYW1QYXJzZXIqKiBzY29wZWRfdmFyaWFibGUsIENQREZfU3RyZWFtUGFyc2VyKiBuZXdfcGFyc2VyKQotICAgICAgICAgICAgOiBzY29wZWRfdmFyaWFibGVfKHNjb3BlZF92YXJpYWJsZSkgewotICAgICAgICAqc2NvcGVkX3ZhcmlhYmxlXyA9IG5ld19wYXJzZXI7Ci0gICAgfQotICAgIH5DUERGX1N0cmVhbVBhcnNlckF1dG9DbGVhcmVyKCkgeyAqc2NvcGVkX3ZhcmlhYmxlXyA9IE5VTEw7IH0KLSAgcHJpdmF0ZToKLSAgICBDUERGX1N0cmVhbVBhcnNlcioqIHNjb3BlZF92YXJpYWJsZV87CisgcHVibGljOgorICBDUERGX1N0cmVhbVBhcnNlckF1dG9DbGVhcmVyKENQREZfU3RyZWFtUGFyc2VyKiogc2NvcGVkX3ZhcmlhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtUGFyc2VyKiBuZXdfcGFyc2VyKQorICAgICAgOiBzY29wZWRfdmFyaWFibGVfKHNjb3BlZF92YXJpYWJsZSkgeworICAgICpzY29wZWRfdmFyaWFibGVfID0gbmV3X3BhcnNlcjsKKyAgfQorICB+Q1BERl9TdHJlYW1QYXJzZXJBdXRvQ2xlYXJlcigpIHsgKnNjb3BlZF92YXJpYWJsZV8gPSBOVUxMOyB9CisKKyBwcml2YXRlOgorICBDUERGX1N0cmVhbVBhcnNlcioqIHNjb3BlZF92YXJpYWJsZV87CiB9OwotRlhfRFdPUkQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpQYXJzZShGWF9MUENCWVRFIHBEYXRhLCBGWF9EV09SRCBkd1NpemUsIEZYX0RXT1JEIG1heF9jb3N0KQotewotICAgIGlmIChtX0xldmVsID4gX0ZQREZfTUFYX0ZPUk1fTEVWRUxfKSB7Ci0gICAgICAgIHJldHVybiBkd1NpemU7CitGWF9EV09SRCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OlBhcnNlKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG1heF9jb3N0KSB7CisgIGlmIChtX0xldmVsID4gX0ZQREZfTUFYX0ZPUk1fTEVWRUxfKSB7CisgICAgcmV0dXJuIGR3U2l6ZTsKKyAgfQorICBGWF9EV09SRCBJbml0T2JqQ291bnQgPSBtX3BPYmplY3RMaXN0LT5Db3VudE9iamVjdHMoKTsKKyAgQ1BERl9TdHJlYW1QYXJzZXIgc3ludGF4KHBEYXRhLCBkd1NpemUpOworICBDUERGX1N0cmVhbVBhcnNlckF1dG9DbGVhcmVyIGF1dG9fY2xlYXJlcigmbV9wU3ludGF4LCAmc3ludGF4KTsKKyAgbV9Db21wYXRDb3VudCA9IDA7CisgIHdoaWxlICgxKSB7CisgICAgRlhfRFdPUkQgY29zdCA9IG1fcE9iamVjdExpc3QtPkNvdW50T2JqZWN0cygpIC0gSW5pdE9iakNvdW50OworICAgIGlmIChtYXhfY29zdCAmJiBjb3N0ID49IG1heF9jb3N0KSB7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgRlhfRFdPUkQgSW5pdE9iakNvdW50ID0gbV9wT2JqZWN0TGlzdC0+Q291bnRPYmplY3RzKCk7Ci0gICAgQ1BERl9TdHJlYW1QYXJzZXIgc3ludGF4KHBEYXRhLCBkd1NpemUpOwotICAgIENQREZfU3RyZWFtUGFyc2VyQXV0b0NsZWFyZXIgYXV0b19jbGVhcmVyKCZtX3BTeW50YXgsICZzeW50YXgpOwotICAgIG1fQ29tcGF0Q291bnQgPSAwOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIEZYX0RXT1JEIGNvc3QgPSBtX3BPYmplY3RMaXN0LT5Db3VudE9iamVjdHMoKSAtIEluaXRPYmpDb3VudDsKLSAgICAgICAgaWYgKG1heF9jb3N0ICYmIGNvc3QgPj0gbWF4X2Nvc3QpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoc3ludGF4LlBhcnNlTmV4dEVsZW1lbnQoKSkgewotICAgICAgICAgICAgY2FzZSBDUERGX1N0cmVhbVBhcnNlcjo6RW5kT2ZEYXRhOgotICAgICAgICAgICAgICAgIHJldHVybiBtX3BTeW50YXgtPkdldFBvcygpOwotICAgICAgICAgICAgY2FzZSBDUERGX1N0cmVhbVBhcnNlcjo6S2V5d29yZDoKLSAgICAgICAgICAgICAgICBpZighT25PcGVyYXRvcigoY2hhciopc3ludGF4LkdldFdvcmRCdWYoKSkgJiYgX1BERl9IYXNJbnZhbGlkT3BDaGFyKChjaGFyKilzeW50YXguR2V0V29yZEJ1ZigpKSkgewotICAgICAgICAgICAgICAgICAgICBtX2JBYm9ydCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtX2JBYm9ydCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9wU3ludGF4LT5HZXRQb3MoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ2xlYXJBbGxQYXJhbXMoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1BERl9TdHJlYW1QYXJzZXI6Ok51bWJlcjoKLSAgICAgICAgICAgICAgICBBZGROdW1iZXJQYXJhbSgoY2hhciopc3ludGF4LkdldFdvcmRCdWYoKSwgc3ludGF4LkdldFdvcmRTaXplKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDUERGX1N0cmVhbVBhcnNlcjo6TmFtZToKLSAgICAgICAgICAgICAgICBBZGROYW1lUGFyYW0oKEZYX0xQQ1NUUilzeW50YXguR2V0V29yZEJ1ZigpICsgMSwgc3ludGF4LkdldFdvcmRTaXplKCkgLSAxKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgQWRkT2JqZWN0UGFyYW0oc3ludGF4LkdldE9iamVjdCgpKTsKLSAgICAgICAgfQorICAgIHN3aXRjaCAoc3ludGF4LlBhcnNlTmV4dEVsZW1lbnQoKSkgeworICAgICAgY2FzZSBDUERGX1N0cmVhbVBhcnNlcjo6RW5kT2ZEYXRhOgorICAgICAgICByZXR1cm4gbV9wU3ludGF4LT5HZXRQb3MoKTsKKyAgICAgIGNhc2UgQ1BERl9TdHJlYW1QYXJzZXI6OktleXdvcmQ6CisgICAgICAgIE9uT3BlcmF0b3IoKGNoYXIqKXN5bnRheC5HZXRXb3JkQnVmKCkpOworICAgICAgICBDbGVhckFsbFBhcmFtcygpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ1BERl9TdHJlYW1QYXJzZXI6Ok51bWJlcjoKKyAgICAgICAgQWRkTnVtYmVyUGFyYW0oKGNoYXIqKXN5bnRheC5HZXRXb3JkQnVmKCksIHN5bnRheC5HZXRXb3JkU2l6ZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENQREZfU3RyZWFtUGFyc2VyOjpOYW1lOgorICAgICAgICBBZGROYW1lUGFyYW0oKGNvbnN0IEZYX0NIQVIqKXN5bnRheC5HZXRXb3JkQnVmKCkgKyAxLAorICAgICAgICAgICAgICAgICAgICAgc3ludGF4LkdldFdvcmRTaXplKCkgLSAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBBZGRPYmplY3RQYXJhbShzeW50YXguR2V0T2JqZWN0KCkpOwogICAgIH0KLSAgICByZXR1cm4gbV9wU3ludGF4LT5HZXRQb3MoKTsKKyAgfQorICByZXR1cm4gbV9wU3ludGF4LT5HZXRQb3MoKTsKIH0KLXZvaWQgX1BERl9SZXBsYWNlQWJicihDUERGX09iamVjdCogcE9iaik7Ci12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0JlZ2luSW1hZ2UoKQotewotICAgIEZYX0ZJTEVTSVpFIHNhdmVQb3MgPSBtX3BTeW50YXgtPkdldFBvcygpOwotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBDUERGX0RpY3Rpb25hcnk6OkNyZWF0ZSgpOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIENQREZfU3RyZWFtUGFyc2VyOjpTeW50YXhUeXBlIHR5cGUgPSBtX3BTeW50YXgtPlBhcnNlTmV4dEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKHR5cGUgPT0gQ1BERl9TdHJlYW1QYXJzZXI6OktleXdvcmQpIHsKLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzS2V5d29yZChtX3BTeW50YXgtPkdldFdvcmRCdWYoKSwgbV9wU3ludGF4LT5HZXRXb3JkU2l6ZSgpKTsKLSAgICAgICAgICAgIGlmIChic0tleXdvcmQgIT0gRlhfQlNUUkMoIklEIikpIHsKLSAgICAgICAgICAgICAgICBtX3BTeW50YXgtPlNldFBvcyhzYXZlUG9zKTsKLSAgICAgICAgICAgICAgICBwRGljdC0+UmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZSAhPSBDUERGX1N0cmVhbVBhcnNlcjo6TmFtZSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5KChGWF9MUENTVFIpbV9wU3ludGF4LT5HZXRXb3JkQnVmKCkgKyAxLCBtX3BTeW50YXgtPkdldFdvcmRTaXplKCkgLSAxKTsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBtX3BTeW50YXgtPlJlYWROZXh0T2JqZWN0KCk7Ci0gICAgICAgIGlmICgha2V5LklzRW1wdHkoKSkgewotICAgICAgICAgICAgcERpY3QtPlNldEF0KGtleSwgcE9iaiwgbV9wRG9jdW1lbnQpOwotICAgICAgICB9IGVsc2UgaWYgKHBPYmopIHsKLSAgICAgICAgICAgIHBPYmotPlJlbGVhc2UoKTsKLSAgICAgICAgfQorCit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0JlZ2luSW1hZ2UoKSB7CisgIEZYX0ZJTEVTSVpFIHNhdmVQb3MgPSBtX3BTeW50YXgtPkdldFBvcygpOworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgd2hpbGUgKDEpIHsKKyAgICBDUERGX1N0cmVhbVBhcnNlcjo6U3ludGF4VHlwZSB0eXBlID0gbV9wU3ludGF4LT5QYXJzZU5leHRFbGVtZW50KCk7CisgICAgaWYgKHR5cGUgPT0gQ1BERl9TdHJlYW1QYXJzZXI6OktleXdvcmQpIHsKKyAgICAgIENGWF9CeXRlU3RyaW5nIGJzS2V5d29yZChtX3BTeW50YXgtPkdldFdvcmRCdWYoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BTeW50YXgtPkdldFdvcmRTaXplKCkpOworICAgICAgaWYgKGJzS2V5d29yZCAhPSAiSUQiKSB7CisgICAgICAgIG1fcFN5bnRheC0+U2V0UG9zKHNhdmVQb3MpOworICAgICAgICBwRGljdC0+UmVsZWFzZSgpOworICAgICAgICByZXR1cm47CisgICAgICB9CiAgICAgfQotICAgIF9QREZfUmVwbGFjZUFiYnIocERpY3QpOwotICAgIENQREZfT2JqZWN0KiBwQ1NPYmogPSBOVUxMOwotICAgIGlmIChwRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIkNvbG9yU3BhY2UiKSkpIHsKLSAgICAgICAgcENTT2JqID0gcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiQ29sb3JTcGFjZSIpKTsKLSAgICAgICAgaWYgKHBDU09iai0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSB7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gcENTT2JqLT5HZXRTdHJpbmcoKTsKLSAgICAgICAgICAgIGlmIChuYW1lICE9IEZYX0JTVFJDKCJEZXZpY2VSR0IiKSAmJiBuYW1lICE9IEZYX0JTVFJDKCJEZXZpY2VHcmF5IikgJiYgbmFtZSAhPSBGWF9CU1RSQygiRGV2aWNlQ01ZSyIpKSB7Ci0gICAgICAgICAgICAgICAgcENTT2JqID0gRmluZFJlc291cmNlT2JqKEZYX0JTVFJDKCJDb2xvclNwYWNlIiksIG5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChwQ1NPYmogJiYgIXBDU09iai0+R2V0T2JqTnVtKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcENTT2JqID0gcENTT2JqLT5DbG9uZSgpOwotICAgICAgICAgICAgICAgICAgICBwRGljdC0+U2V0QXQoRlhfQlNUUkMoIkNvbG9yU3BhY2UiKSwgcENTT2JqLCBtX3BEb2N1bWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgaWYgKHR5cGUgIT0gQ1BERl9TdHJlYW1QYXJzZXI6Ok5hbWUpIHsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IG1fcFN5bnRheC0+UmVhZElubGluZVN0cmVhbShtX3BEb2N1bWVudCwgcERpY3QsIHBDU09iaiwgbV9PcHRpb25zLm1fYkRlY29kZUlubGluZUltYWdlKTsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBDUERGX1N0cmVhbVBhcnNlcjo6U3ludGF4VHlwZSB0eXBlID0gbV9wU3ludGF4LT5QYXJzZU5leHRFbGVtZW50KCk7CisgICAgQ0ZYX0J5dGVTdHJpbmcga2V5KChjb25zdCBGWF9DSEFSKiltX3BTeW50YXgtPkdldFdvcmRCdWYoKSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgIG1fcFN5bnRheC0+R2V0V29yZFNpemUoKSAtIDEpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdCwgUmVsZWFzZURlbGV0ZXI8Q1BERl9PYmplY3Q+PiBwT2JqKAorICAgICAgICBtX3BTeW50YXgtPlJlYWROZXh0T2JqZWN0KCkpOworICAgIGlmICgha2V5LklzRW1wdHkoKSkgeworICAgICAgRlhfRFdPUkQgZHdPYmpOdW0gPSBwT2JqID8gcE9iai0+R2V0T2JqTnVtKCkgOiAwOworICAgICAgaWYgKGR3T2JqTnVtKQorICAgICAgICBwRGljdC0+U2V0QXRSZWZlcmVuY2Uoa2V5LCBtX3BEb2N1bWVudCwgZHdPYmpOdW0pOworICAgICAgZWxzZQorICAgICAgICBwRGljdC0+U2V0QXQoa2V5LCBwT2JqLnJlbGVhc2UoKSk7CisgICAgfQorICB9CisgIFBERl9SZXBsYWNlQWJicihwRGljdCk7CisgIENQREZfT2JqZWN0KiBwQ1NPYmogPSBOVUxMOworICBpZiAocERpY3QtPktleUV4aXN0KCJDb2xvclNwYWNlIikpIHsKKyAgICBwQ1NPYmogPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKCJDb2xvclNwYWNlIik7CisgICAgaWYgKHBDU09iai0+SXNOYW1lKCkpIHsKKyAgICAgIENGWF9CeXRlU3RyaW5nIG5hbWUgPSBwQ1NPYmotPkdldFN0cmluZygpOworICAgICAgaWYgKG5hbWUgIT0gIkRldmljZVJHQiIgJiYgbmFtZSAhPSAiRGV2aWNlR3JheSIgJiYgbmFtZSAhPSAiRGV2aWNlQ01ZSyIpIHsKKyAgICAgICAgcENTT2JqID0gRmluZFJlc291cmNlT2JqKCJDb2xvclNwYWNlIiwgbmFtZSk7CisgICAgICAgIGlmIChwQ1NPYmogJiYgIXBDU09iai0+R2V0T2JqTnVtKCkpIHsKKyAgICAgICAgICBwQ1NPYmogPSBwQ1NPYmotPkNsb25lKCk7CisgICAgICAgICAgcERpY3QtPlNldEF0KCJDb2xvclNwYWNlIiwgcENTT2JqKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IG1fcFN5bnRheC0+UmVhZElubGluZVN0cmVhbSgKKyAgICAgIG1fcERvY3VtZW50LCBwRGljdCwgcENTT2JqLCBtX09wdGlvbnMubV9iRGVjb2RlSW5saW5lSW1hZ2UpOworICB3aGlsZSAoMSkgeworICAgIENQREZfU3RyZWFtUGFyc2VyOjpTeW50YXhUeXBlIHR5cGUgPSBtX3BTeW50YXgtPlBhcnNlTmV4dEVsZW1lbnQoKTsKKyAgICBpZiAodHlwZSA9PSBDUERGX1N0cmVhbVBhcnNlcjo6RW5kT2ZEYXRhKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHR5cGUgIT0gQ1BERl9TdHJlYW1QYXJzZXI6OktleXdvcmQpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAobV9wU3ludGF4LT5HZXRXb3JkU2l6ZSgpID09IDIgJiYgbV9wU3ludGF4LT5HZXRXb3JkQnVmKClbMF0gPT0gJ0UnICYmCisgICAgICAgIG1fcFN5bnRheC0+R2V0V29yZEJ1ZigpWzFdID09ICdJJykgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChtX09wdGlvbnMubV9iVGV4dE9ubHkpIHsKKyAgICBpZiAocFN0cmVhbSkgeworICAgICAgcFN0cmVhbS0+UmVsZWFzZSgpOworICAgIH0gZWxzZSB7CisgICAgICBwRGljdC0+UmVsZWFzZSgpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgcERpY3QtPlNldEF0TmFtZSgiU3VidHlwZSIsICJJbWFnZSIpOworICBDUERGX0ltYWdlT2JqZWN0KiBwSW1nT2JqID0gQWRkSW1hZ2UocFN0cmVhbSwgTlVMTCwgVFJVRSk7CisgIGlmICghcEltZ09iaikgeworICAgIGlmIChwU3RyZWFtKSB7CisgICAgICBwU3RyZWFtLT5SZWxlYXNlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBEaWN0LT5SZWxlYXNlKCk7CisgICAgfQorICB9Cit9Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6UGFyc2VQYXRoT2JqZWN0KCkgeworICBGWF9GTE9BVCBwYXJhbXNbNl0gPSB7fTsKKyAgaW50IG5QYXJhbXMgPSAwOworICBpbnQgbGFzdF9wb3MgPSBtX3BTeW50YXgtPkdldFBvcygpOworICB3aGlsZSAoMSkgeworICAgIENQREZfU3RyZWFtUGFyc2VyOjpTeW50YXhUeXBlIHR5cGUgPSBtX3BTeW50YXgtPlBhcnNlTmV4dEVsZW1lbnQoKTsKKyAgICBGWF9CT09MIGJQcm9jZXNzZWQgPSBUUlVFOworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBDUERGX1N0cmVhbVBhcnNlcjo6RW5kT2ZEYXRhOgorICAgICAgICByZXR1cm47CisgICAgICBjYXNlIENQREZfU3RyZWFtUGFyc2VyOjpLZXl3b3JkOiB7CisgICAgICAgIGludCBsZW4gPSBtX3BTeW50YXgtPkdldFdvcmRTaXplKCk7CisgICAgICAgIGlmIChsZW4gPT0gMSkgeworICAgICAgICAgIHN3aXRjaCAobV9wU3ludGF4LT5HZXRXb3JkQnVmKClbMF0pIHsKKyAgICAgICAgICAgIGNhc2Uga1BhdGhPcGVyYXRvclN1YnBhdGg6CisgICAgICAgICAgICAgIEFkZFBhdGhQb2ludChwYXJhbXNbMF0sIHBhcmFtc1sxXSwgRlhQVF9NT1ZFVE8pOworICAgICAgICAgICAgICBuUGFyYW1zID0gMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtQYXRoT3BlcmF0b3JMaW5lOgorICAgICAgICAgICAgICBBZGRQYXRoUG9pbnQocGFyYW1zWzBdLCBwYXJhbXNbMV0sIEZYUFRfTElORVRPKTsKKyAgICAgICAgICAgICAgblBhcmFtcyA9IDA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrUGF0aE9wZXJhdG9yQ3ViaWNCZXppZXIxOgorICAgICAgICAgICAgICBBZGRQYXRoUG9pbnQocGFyYW1zWzBdLCBwYXJhbXNbMV0sIEZYUFRfQkVaSUVSVE8pOworICAgICAgICAgICAgICBBZGRQYXRoUG9pbnQocGFyYW1zWzJdLCBwYXJhbXNbM10sIEZYUFRfQkVaSUVSVE8pOworICAgICAgICAgICAgICBBZGRQYXRoUG9pbnQocGFyYW1zWzRdLCBwYXJhbXNbNV0sIEZYUFRfQkVaSUVSVE8pOworICAgICAgICAgICAgICBuUGFyYW1zID0gMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtQYXRoT3BlcmF0b3JDdWJpY0JlemllcjI6CisgICAgICAgICAgICAgIEFkZFBhdGhQb2ludChtX1BhdGhDdXJyZW50WCwgbV9QYXRoQ3VycmVudFksIEZYUFRfQkVaSUVSVE8pOworICAgICAgICAgICAgICBBZGRQYXRoUG9pbnQocGFyYW1zWzBdLCBwYXJhbXNbMV0sIEZYUFRfQkVaSUVSVE8pOworICAgICAgICAgICAgICBBZGRQYXRoUG9pbnQocGFyYW1zWzJdLCBwYXJhbXNbM10sIEZYUFRfQkVaSUVSVE8pOworICAgICAgICAgICAgICBuUGFyYW1zID0gMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtQYXRoT3BlcmF0b3JDdWJpY0JlemllcjM6CisgICAgICAgICAgICAgIEFkZFBhdGhQb2ludChwYXJhbXNbMF0sIHBhcmFtc1sxXSwgRlhQVF9CRVpJRVJUTyk7CisgICAgICAgICAgICAgIEFkZFBhdGhQb2ludChwYXJhbXNbMl0sIHBhcmFtc1szXSwgRlhQVF9CRVpJRVJUTyk7CisgICAgICAgICAgICAgIEFkZFBhdGhQb2ludChwYXJhbXNbMl0sIHBhcmFtc1szXSwgRlhQVF9CRVpJRVJUTyk7CisgICAgICAgICAgICAgIG5QYXJhbXMgPSAwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga1BhdGhPcGVyYXRvckNsb3NlUGF0aDoKKyAgICAgICAgICAgICAgSGFuZGxlX0Nsb3NlUGF0aCgpOworICAgICAgICAgICAgICBuUGFyYW1zID0gMDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBiUHJvY2Vzc2VkID0gRkFMU0U7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChsZW4gPT0gMikgeworICAgICAgICAgIGlmIChtX3BTeW50YXgtPkdldFdvcmRCdWYoKVswXSA9PSBrUGF0aE9wZXJhdG9yUmVjdGFuZ2xlWzBdICYmCisgICAgICAgICAgICAgIG1fcFN5bnRheC0+R2V0V29yZEJ1ZigpWzFdID09IGtQYXRoT3BlcmF0b3JSZWN0YW5nbGVbMV0pIHsKKyAgICAgICAgICAgIEFkZFBhdGhSZWN0KHBhcmFtc1swXSwgcGFyYW1zWzFdLCBwYXJhbXNbMl0sIHBhcmFtc1szXSk7CisgICAgICAgICAgICBuUGFyYW1zID0gMDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYlByb2Nlc3NlZCA9IEZBTFNFOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBiUHJvY2Vzc2VkID0gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJQcm9jZXNzZWQpIHsKKyAgICAgICAgICBsYXN0X3BvcyA9IG1fcFN5bnRheC0+R2V0UG9zKCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIENQREZfU3RyZWFtUGFyc2VyOjpOdW1iZXI6IHsKKyAgICAgICAgaWYgKG5QYXJhbXMgPT0gNikgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIEZYX0JPT0wgYkludGVnZXI7CisgICAgICAgIGludCB2YWx1ZTsKKyAgICAgICAgRlhfYXRvbnVtKAorICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDKG1fcFN5bnRheC0+R2V0V29yZEJ1ZigpLCBtX3BTeW50YXgtPkdldFdvcmRTaXplKCkpLAorICAgICAgICAgICAgYkludGVnZXIsICZ2YWx1ZSk7CisgICAgICAgIHBhcmFtc1tuUGFyYW1zKytdID0gYkludGVnZXIgPyAoRlhfRkxPQVQpdmFsdWUgOiAqKEZYX0ZMT0FUKikmdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgYlByb2Nlc3NlZCA9IEZBTFNFOworICAgIH0KKyAgICBpZiAoIWJQcm9jZXNzZWQpIHsKKyAgICAgIG1fcFN5bnRheC0+U2V0UG9zKGxhc3RfcG9zKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KK30KK0NQREZfU3RyZWFtUGFyc2VyOjpDUERGX1N0cmVhbVBhcnNlcihjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgZHdTaXplKSB7CisgIG1fcEJ1ZiA9IHBEYXRhOworICBtX1NpemUgPSBkd1NpemU7CisgIG1fUG9zID0gMDsKKyAgbV9wTGFzdE9iaiA9IE5VTEw7Cit9CitDUERGX1N0cmVhbVBhcnNlcjo6fkNQREZfU3RyZWFtUGFyc2VyKCkgeworICBpZiAobV9wTGFzdE9iaikgeworICAgIG1fcExhc3RPYmotPlJlbGVhc2UoKTsKKyAgfQorfQorRlhfRFdPUkQgX0RlY29kZUFsbFNjYW5saW5lcyhJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKiBwRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKSB7CisgIGlmICghcERlY29kZXIpIHsKKyAgICByZXR1cm4gKEZYX0RXT1JEKS0xOworICB9CisgIGludCBuY29tcHMgPSBwRGVjb2Rlci0+Q291bnRDb21wcygpOworICBpbnQgYnBjID0gcERlY29kZXItPkdldEJQQygpOworICBpbnQgd2lkdGggPSBwRGVjb2Rlci0+R2V0V2lkdGgoKTsKKyAgaW50IGhlaWdodCA9IHBEZWNvZGVyLT5HZXRIZWlnaHQoKTsKKyAgaW50IHBpdGNoID0gKHdpZHRoICogbmNvbXBzICogYnBjICsgNykgLyA4OworICBpZiAoaGVpZ2h0ID09IDAgfHwgcGl0Y2ggPiAoMSA8PCAzMCkgLyBoZWlnaHQpIHsKKyAgICBkZWxldGUgcERlY29kZXI7CisgICAgcmV0dXJuIC0xOworICB9CisgIGRlc3RfYnVmID0gRlhfQWxsb2MyRCh1aW50OF90LCBwaXRjaCwgaGVpZ2h0KTsKKyAgZGVzdF9zaXplID0gcGl0Y2ggKiBoZWlnaHQ7ICAvLyBTYWZlIHNpbmNlIGNoZWNrZWQgYWxsb2MgcmV0dXJuZWQuCisgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICBjb25zdCB1aW50OF90KiBwTGluZSA9IHBEZWNvZGVyLT5HZXRTY2FubGluZShyb3cpOworICAgIGlmICghcExpbmUpCisgICAgICBicmVhazsKKworICAgIEZYU1lTX21lbWNweShkZXN0X2J1ZiArIHJvdyAqIHBpdGNoLCBwTGluZSwgcGl0Y2gpOworICB9CisgIEZYX0RXT1JEIHNyY29mZiA9IHBEZWNvZGVyLT5HZXRTcmNPZmZzZXQoKTsKKyAgZGVsZXRlIHBEZWNvZGVyOworICByZXR1cm4gc3Jjb2ZmOworfQorSUNvZGVjX1NjYW5saW5lRGVjb2RlciogRlBERkFQSV9DcmVhdGVGYXhEZWNvZGVyKAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgaW50IHdpZHRoLAorICAgIGludCBoZWlnaHQsCisgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zKTsKKworRlhfRFdPUkQgUERGX0RlY29kZUlubGluZVN0cmVhbShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgZGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgeworICBpZiAoZGVjb2RlciA9PSAiQ0NJVFRGYXhEZWNvZGUiIHx8IGRlY29kZXIgPT0gIkNDRiIpIHsKKyAgICBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKiBwRGVjb2RlciA9CisgICAgICAgIEZQREZBUElfQ3JlYXRlRmF4RGVjb2RlcihzcmNfYnVmLCBsaW1pdCwgd2lkdGgsIGhlaWdodCwgcFBhcmFtKTsKKyAgICByZXR1cm4gX0RlY29kZUFsbFNjYW5saW5lcyhwRGVjb2RlciwgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7CisgIH0KKyAgaWYgKGRlY29kZXIgPT0gIkFTQ0lJODVEZWNvZGUiIHx8IGRlY29kZXIgPT0gIkE4NSIpIHsKKyAgICByZXR1cm4gQTg1RGVjb2RlKHNyY19idWYsIGxpbWl0LCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKKyAgfQorICBpZiAoZGVjb2RlciA9PSAiQVNDSUlIZXhEZWNvZGUiIHx8IGRlY29kZXIgPT0gIkFIeCIpIHsKKyAgICByZXR1cm4gSGV4RGVjb2RlKHNyY19idWYsIGxpbWl0LCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKKyAgfQorICBpZiAoZGVjb2RlciA9PSAiRmxhdGVEZWNvZGUiIHx8IGRlY29kZXIgPT0gIkZsIikgeworICAgIHJldHVybiBGUERGQVBJX0ZsYXRlT3JMWldEZWNvZGUoRkFMU0UsIHNyY19idWYsIGxpbWl0LCBwUGFyYW0sIGRlc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYnVmLCBkZXN0X3NpemUpOworICB9CisgIGlmIChkZWNvZGVyID09ICJMWldEZWNvZGUiIHx8IGRlY29kZXIgPT0gIkxaVyIpIHsKKyAgICByZXR1cm4gRlBERkFQSV9GbGF0ZU9yTFpXRGVjb2RlKFRSVUUsIHNyY19idWYsIGxpbWl0LCBwUGFyYW0sIDAsIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zaXplKTsKKyAgfQorICBpZiAoZGVjb2RlciA9PSAiRENURGVjb2RlIiB8fCBkZWNvZGVyID09ICJEQ1QiKSB7CisgICAgSUNvZGVjX1NjYW5saW5lRGVjb2RlciogcERlY29kZXIgPQorICAgICAgICBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKS0+Q3JlYXRlRGVjb2RlcigKKyAgICAgICAgICAgIHNyY19idWYsIGxpbWl0LCB3aWR0aCwgaGVpZ2h0LCAwLAorICAgICAgICAgICAgcFBhcmFtID8gcFBhcmFtLT5HZXRJbnRlZ2VyKCJDb2xvclRyYW5zZm9ybSIsIDEpIDogMSk7CisgICAgcmV0dXJuIF9EZWNvZGVBbGxTY2FubGluZXMocERlY29kZXIsIGRlc3RfYnVmLCBkZXN0X3NpemUpOworICB9CisgIGlmIChkZWNvZGVyID09ICJSdW5MZW5ndGhEZWNvZGUiIHx8IGRlY29kZXIgPT0gIlJMIikgeworICAgIHJldHVybiBSdW5MZW5ndGhEZWNvZGUoc3JjX2J1ZiwgbGltaXQsIGRlc3RfYnVmLCBkZXN0X3NpemUpOworICB9CisgIGRlc3Rfc2l6ZSA9IDA7CisgIGRlc3RfYnVmID0gMDsKKyAgcmV0dXJuIChGWF9EV09SRCktMTsKK30KK0NQREZfU3RyZWFtKiBDUERGX1N0cmVhbVBhcnNlcjo6UmVhZElubGluZVN0cmVhbShDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBDU09iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEZWNvZGUpIHsKKyAgaWYgKG1fUG9zID09IG1fU2l6ZSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBpZiAoUERGQ2hhcklzV2hpdGVzcGFjZShtX3BCdWZbbV9Qb3NdKSkKKyAgICBtX1BvcysrOworCisgIENGWF9CeXRlU3RyaW5nIERlY29kZXI7CisgIENQREZfRGljdGlvbmFyeSogcFBhcmFtID0gbnVsbHB0cjsKKyAgQ1BERl9PYmplY3QqIHBGaWx0ZXIgPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKCJGaWx0ZXIiKTsKKyAgaWYgKHBGaWx0ZXIpIHsKKyAgICBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcEZpbHRlci0+QXNBcnJheSgpKSB7CisgICAgICBEZWNvZGVyID0gcEFycmF5LT5HZXRTdHJpbmcoMCk7CisgICAgICBDUERGX0FycmF5KiBwUGFyYW1zID0gcERpY3QtPkdldEFycmF5KCJEZWNvZGVQYXJtcyIpOworICAgICAgaWYgKHBQYXJhbXMpCisgICAgICAgIHBQYXJhbSA9IHBQYXJhbXMtPkdldERpY3QoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIERlY29kZXIgPSBwRmlsdGVyLT5HZXRTdHJpbmcoKTsKKyAgICAgIHBQYXJhbSA9IHBEaWN0LT5HZXREaWN0KCJEZWNvZGVQYXJtcyIpOworICAgIH0KKyAgfQorICBGWF9EV09SRCB3aWR0aCA9IHBEaWN0LT5HZXRJbnRlZ2VyKCJXaWR0aCIpOworICBGWF9EV09SRCBoZWlnaHQgPSBwRGljdC0+R2V0SW50ZWdlcigiSGVpZ2h0Iik7CisgIEZYX0RXT1JEIE9yaWdTaXplID0gMDsKKyAgaWYgKHBDU09iaikgeworICAgIEZYX0RXT1JEIGJwYyA9IHBEaWN0LT5HZXRJbnRlZ2VyKCJCaXRzUGVyQ29tcG9uZW50Iik7CisgICAgRlhfRFdPUkQgbkNvbXBvbmVudHMgPSAxOworICAgIENQREZfQ29sb3JTcGFjZSogcENTID0gcERvYy0+TG9hZENvbG9yU3BhY2UocENTT2JqKTsKKyAgICBpZiAoIXBDUykgeworICAgICAgbkNvbXBvbmVudHMgPSAzOworICAgIH0gZWxzZSB7CisgICAgICBuQ29tcG9uZW50cyA9IHBDUy0+Q291bnRDb21wb25lbnRzKCk7CisgICAgICBwRG9jLT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlQ29sb3JTcGFjZShwQ1NPYmopOworICAgIH0KKyAgICBGWF9EV09SRCBwaXRjaCA9IHdpZHRoOworICAgIGlmIChicGMgJiYgcGl0Y2ggPiBJTlRfTUFYIC8gYnBjKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcGl0Y2ggKj0gYnBjOworICAgIGlmIChuQ29tcG9uZW50cyAmJiBwaXRjaCA+IElOVF9NQVggLyBuQ29tcG9uZW50cykgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHBpdGNoICo9IG5Db21wb25lbnRzOworICAgIGlmIChwaXRjaCA+IElOVF9NQVggLSA3KSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcGl0Y2ggKz0gNzsKKyAgICBwaXRjaCAvPSA4OworICAgIE9yaWdTaXplID0gcGl0Y2g7CisgIH0gZWxzZSB7CisgICAgaWYgKHdpZHRoID4gSU5UX01BWCAtIDcpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBPcmlnU2l6ZSA9ICgod2lkdGggKyA3KSAvIDgpOworICB9CisgIGlmIChoZWlnaHQgJiYgT3JpZ1NpemUgPiBJTlRfTUFYIC8gaGVpZ2h0KSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgT3JpZ1NpemUgKj0gaGVpZ2h0OworICB1aW50OF90KiBwRGF0YSA9IE5VTEw7CisgIEZYX0RXT1JEIGR3U3RyZWFtU2l6ZTsKKyAgaWYgKERlY29kZXIuSXNFbXB0eSgpKSB7CisgICAgaWYgKE9yaWdTaXplID4gbV9TaXplIC0gbV9Qb3MpIHsKKyAgICAgIE9yaWdTaXplID0gbV9TaXplIC0gbV9Qb3M7CisgICAgfQorICAgIHBEYXRhID0gRlhfQWxsb2ModWludDhfdCwgT3JpZ1NpemUpOworICAgIEZYU1lTX21lbWNweShwRGF0YSwgbV9wQnVmICsgbV9Qb3MsIE9yaWdTaXplKTsKKyAgICBkd1N0cmVhbVNpemUgPSBPcmlnU2l6ZTsKKyAgICBtX1BvcyArPSBPcmlnU2l6ZTsKKyAgfSBlbHNlIHsKKyAgICBGWF9EV09SRCBkd0Rlc3RTaXplID0gT3JpZ1NpemU7CisgICAgZHdTdHJlYW1TaXplID0KKyAgICAgICAgUERGX0RlY29kZUlubGluZVN0cmVhbShtX3BCdWYgKyBtX1BvcywgbV9TaXplIC0gbV9Qb3MsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlciwgcFBhcmFtLCBwRGF0YSwgZHdEZXN0U2l6ZSk7CisgICAgaWYgKChpbnQpZHdTdHJlYW1TaXplIDwgMCkgeworICAgICAgRlhfRnJlZShwRGF0YSk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGJEZWNvZGUpIHsKKyAgICAgIG1fUG9zICs9IGR3U3RyZWFtU2l6ZTsKKyAgICAgIGR3U3RyZWFtU2l6ZSA9IGR3RGVzdFNpemU7CisgICAgICBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcEZpbHRlci0+QXNBcnJheSgpKSB7CisgICAgICAgIHBBcnJheS0+UmVtb3ZlQXQoMCk7CisgICAgICAgIENQREZfQXJyYXkqIHBQYXJhbXMgPSBwRGljdC0+R2V0QXJyYXkoIkRlY29kZVBhcm1zIik7CisgICAgICAgIGlmIChwUGFyYW1zKQorICAgICAgICAgIHBQYXJhbXMtPlJlbW92ZUF0KDApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcERpY3QtPlJlbW92ZUF0KCJGaWx0ZXIiKTsKKyAgICAgICAgcERpY3QtPlJlbW92ZUF0KCJEZWNvZGVQYXJtcyIpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBGWF9GcmVlKHBEYXRhKTsKKyAgICAgIEZYX0RXT1JEIGR3U2F2ZVBvcyA9IG1fUG9zOworICAgICAgbV9Qb3MgKz0gZHdTdHJlYW1TaXplOworICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgRlhfRFdPUkQgZHdQcmV2UG9zID0gbV9Qb3M7CisgICAgICAgIENQREZfU3RyZWFtUGFyc2VyOjpTeW50YXhUeXBlIHR5cGUgPSBQYXJzZU5leHRFbGVtZW50KCk7CiAgICAgICAgIGlmICh0eXBlID09IENQREZfU3RyZWFtUGFyc2VyOjpFbmRPZkRhdGEpIHsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGlmICh0eXBlICE9IENQREZfU3RyZWFtUGFyc2VyOjpLZXl3b3JkKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBkd1N0cmVhbVNpemUgKz0gbV9Qb3MgLSBkd1ByZXZQb3M7CisgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1fcFN5bnRheC0+R2V0V29yZFNpemUoKSA9PSAyICYmIG1fcFN5bnRheC0+R2V0V29yZEJ1ZigpWzBdID09ICdFJyAmJgotICAgICAgICAgICAgICAgIG1fcFN5bnRheC0+R2V0V29yZEJ1ZigpWzFdID09ICdJJykgewotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChHZXRXb3JkU2l6ZSgpID09IDIgJiYgR2V0V29yZEJ1ZigpWzBdID09ICdFJyAmJgorICAgICAgICAgICAgR2V0V29yZEJ1ZigpWzFdID09ICdJJykgeworICAgICAgICAgIG1fUG9zID0gZHdQcmV2UG9zOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIGR3U3RyZWFtU2l6ZSArPSBtX1BvcyAtIGR3UHJldlBvczsKKyAgICAgIH0KKyAgICAgIG1fUG9zID0gZHdTYXZlUG9zOworICAgICAgcERhdGEgPSBGWF9BbGxvYyh1aW50OF90LCBkd1N0cmVhbVNpemUpOworICAgICAgRlhTWVNfbWVtY3B5KHBEYXRhLCBtX3BCdWYgKyBtX1BvcywgZHdTdHJlYW1TaXplKTsKKyAgICAgIG1fUG9zICs9IGR3U3RyZWFtU2l6ZTsKICAgICB9Ci0gICAgaWYgKG1fT3B0aW9ucy5tX2JUZXh0T25seSkgewotICAgICAgICBpZiAocFN0cmVhbSkgewotICAgICAgICAgICAgcFN0cmVhbS0+UmVsZWFzZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcERpY3QtPlJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHBEaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIlN1YnR5cGUiKSwgRlhfQlNUUkMoIkltYWdlIikpOwotICAgIENQREZfSW1hZ2VPYmplY3QgKnBJbWdPYmogPSBBZGRJbWFnZShwU3RyZWFtLCBOVUxMLCBUUlVFKTsKLSAgICBpZiAoIXBJbWdPYmopIHsKLSAgICAgICAgaWYgKHBTdHJlYW0pIHsKLSAgICAgICAgICAgIHBTdHJlYW0tPlJlbGVhc2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBEaWN0LT5SZWxlYXNlKCk7Ci0gICAgICAgIH0KLSAgICB9CisgIH0KKyAgcERpY3QtPlNldEF0SW50ZWdlcigiTGVuZ3RoIiwgKGludClkd1N0cmVhbVNpemUpOworICByZXR1cm4gbmV3IENQREZfU3RyZWFtKHBEYXRhLCBkd1N0cmVhbVNpemUsIHBEaWN0KTsKIH0KLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpQYXJzZVBhdGhPYmplY3QoKQotewotICAgIEZYX0ZMT0FUIHBhcmFtc1s2XSA9IHswfTsKLSAgICBpbnQgblBhcmFtcyA9IDA7Ci0gICAgaW50IGxhc3RfcG9zID0gbV9wU3ludGF4LT5HZXRQb3MoKTsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBDUERGX1N0cmVhbVBhcnNlcjo6U3ludGF4VHlwZSB0eXBlID0gbV9wU3ludGF4LT5QYXJzZU5leHRFbGVtZW50KCk7Ci0gICAgICAgIEZYX0JPT0wgYlByb2Nlc3NlZCA9IFRSVUU7Ci0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBDUERGX1N0cmVhbVBhcnNlcjo6RW5kT2ZEYXRhOgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1BERl9TdHJlYW1QYXJzZXI6OktleXdvcmQ6IHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IG1fcFN5bnRheC0+R2V0V29yZFNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1fcFN5bnRheC0+R2V0V29yZEJ1ZigpWzBdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFBhdGhQb2ludChwYXJhbXNbMF0sIHBhcmFtc1sxXSwgRlhQVF9NT1ZFVE8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGFyYW1zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFBhdGhQb2ludChwYXJhbXNbMF0sIHBhcmFtc1sxXSwgRlhQVF9MSU5FVE8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGFyYW1zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFBhdGhQb2ludChwYXJhbXNbMF0sIHBhcmFtc1sxXSwgRlhQVF9CRVpJRVJUTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFBhdGhQb2ludChwYXJhbXNbMl0sIHBhcmFtc1szXSwgRlhQVF9CRVpJRVJUTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFBhdGhQb2ludChwYXJhbXNbNF0sIHBhcmFtc1s1XSwgRlhQVF9CRVpJRVJUTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QYXJhbXMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd2JzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkUGF0aFBvaW50KG1fUGF0aEN1cnJlbnRYLCBtX1BhdGhDdXJyZW50WSwgRlhQVF9CRVpJRVJUTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFBhdGhQb2ludChwYXJhbXNbMF0sIHBhcmFtc1sxXSwgRlhQVF9CRVpJRVJUTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFBhdGhQb2ludChwYXJhbXNbMl0sIHBhcmFtc1szXSwgRlhQVF9CRVpJRVJUTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QYXJhbXMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd5JzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkUGF0aFBvaW50KHBhcmFtc1swXSwgcGFyYW1zWzFdLCBGWFBUX0JFWklFUlRPKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkUGF0aFBvaW50KHBhcmFtc1syXSwgcGFyYW1zWzNdLCBGWFBUX0JFWklFUlRPKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkUGF0aFBvaW50KHBhcmFtc1syXSwgcGFyYW1zWzNdLCBGWFBUX0JFWklFUlRPKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblBhcmFtcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2gnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVfQ2xvc2VQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QYXJhbXMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUHJvY2Vzc2VkID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlbiA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9wU3ludGF4LT5HZXRXb3JkQnVmKClbMF0gPT0gJ3InICYmIG1fcFN5bnRheC0+R2V0V29yZEJ1ZigpWzFdID09ICdlJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFBhdGhSZWN0KHBhcmFtc1swXSwgcGFyYW1zWzFdLCBwYXJhbXNbMl0sIHBhcmFtc1szXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgblBhcmFtcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQcm9jZXNzZWQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJQcm9jZXNzZWQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoYlByb2Nlc3NlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9wb3MgPSBtX3BTeW50YXgtPkdldFBvcygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQ1BERl9TdHJlYW1QYXJzZXI6Ok51bWJlcjogewotICAgICAgICAgICAgICAgICAgICBpZiAoblBhcmFtcyA9PSA2KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbnRlZ2VyOwotICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIEZYX2F0b251bShDRlhfQnl0ZVN0cmluZ0MobV9wU3ludGF4LT5HZXRXb3JkQnVmKCksIG1fcFN5bnRheC0+R2V0V29yZFNpemUoKSksIGJJbnRlZ2VyLCAmdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBwYXJhbXNbblBhcmFtcysrXSA9IGJJbnRlZ2VyID8gKEZYX0ZMT0FUKXZhbHVlIDogKihGWF9GTE9BVCopJnZhbHVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJQcm9jZXNzZWQgPSBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWJQcm9jZXNzZWQpIHsKLSAgICAgICAgICAgIG1fcFN5bnRheC0+U2V0UG9zKGxhc3RfcG9zKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLX0KLUNQREZfU3RyZWFtUGFyc2VyOjpDUERGX1N0cmVhbVBhcnNlcihjb25zdCBGWF9CWVRFKiBwRGF0YSwgRlhfRFdPUkQgZHdTaXplKQotewotICAgIG1fcEJ1ZiA9IHBEYXRhOwotICAgIG1fU2l6ZSA9IGR3U2l6ZTsKLSAgICBtX1BvcyA9IDA7Ci0gICAgbV9wTGFzdE9iaiA9IE5VTEw7Ci19Ci1DUERGX1N0cmVhbVBhcnNlcjo6fkNQREZfU3RyZWFtUGFyc2VyKCkKLXsKLSAgICBpZiAobV9wTGFzdE9iaikgewotICAgICAgICBtX3BMYXN0T2JqLT5SZWxlYXNlKCk7Ci0gICAgfQotfQotRlhfRFdPUkQgX0RlY29kZUFsbFNjYW5saW5lcyhJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKiBwRGVjb2RlciwgRlhfTFBCWVRFJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkKLXsKLSAgICBpZiAocERlY29kZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gKEZYX0RXT1JEKSAtIDE7Ci0gICAgfQotICAgIGludCBuY29tcHMgPSBwRGVjb2Rlci0+Q291bnRDb21wcygpOwotICAgIGludCBicGMgPSBwRGVjb2Rlci0+R2V0QlBDKCk7Ci0gICAgaW50IHdpZHRoID0gcERlY29kZXItPkdldFdpZHRoKCk7Ci0gICAgaW50IGhlaWdodCA9IHBEZWNvZGVyLT5HZXRIZWlnaHQoKTsKLSAgICBpbnQgcGl0Y2ggPSAod2lkdGggKiBuY29tcHMgKiBicGMgKyA3KSAvIDg7Ci0gICAgaWYgKGhlaWdodCA9PSAwIHx8IHBpdGNoID4gKDEgPDwgMzApIC8gaGVpZ2h0KSB7Ci0gICAgICAgIGRlbGV0ZSBwRGVjb2RlcjsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBkZXN0X2J1ZiA9IEZYX0FsbG9jMkQoRlhfQllURSwgcGl0Y2gsIGhlaWdodCk7Ci0gICAgZGVzdF9zaXplID0gcGl0Y2ggKiBoZWlnaHQ7ICAvLyBTYWZlIHNpbmNlIGNoZWNrZWQgYWxsb2MgcmV0dXJuZWQuCi0gICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgRlhfTFBCWVRFIHBMaW5lID0gcERlY29kZXItPkdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgIGlmIChwTGluZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBGWFNZU19tZW1jcHkzMihkZXN0X2J1ZiArIHJvdyAqIHBpdGNoLCBwTGluZSwgcGl0Y2gpOwotICAgIH0KLSAgICBGWF9EV09SRCBzcmNvZmYgPSBwRGVjb2Rlci0+R2V0U3JjT2Zmc2V0KCk7Ci0gICAgZGVsZXRlIHBEZWNvZGVyOwotICAgIHJldHVybiBzcmNvZmY7Ci19Ci1JQ29kZWNfU2NhbmxpbmVEZWNvZGVyKiBGUERGQVBJX0NyZWF0ZUZheERlY29kZXIoRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXMpOwotRlhfRFdPUkQgX0E4NURlY29kZShjb25zdCBGWF9CWVRFKiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgRlhfTFBCWVRFJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7Ci1GWF9EV09SRCBfSGV4RGVjb2RlKGNvbnN0IEZYX0JZVEUqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBGWF9MUEJZVEUmIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKTsKLUZYX0RXT1JEIEZQREZBUElfRmxhdGVPckxaV0RlY29kZShGWF9CT09MIGJMWlcsIGNvbnN0IEZYX0JZVEUqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZXN0aW1hdGVkX3NpemUsIEZYX0xQQllURSYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpOwotRlhfRFdPUkQgUERGX0RlY29kZUlubGluZVN0cmVhbShjb25zdCBGWF9CWVRFKiBzcmNfYnVmLCBGWF9EV09SRCBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBDRlhfQnl0ZVN0cmluZyYgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW0sIEZYX0xQQllURSYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpCi17Ci0gICAgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIkNDSVRURmF4RGVjb2RlIikgfHwgZGVjb2RlciA9PSBGWF9CU1RSQygiQ0NGIikpIHsKLSAgICAgICAgSUNvZGVjX1NjYW5saW5lRGVjb2RlciogcERlY29kZXIgPSBGUERGQVBJX0NyZWF0ZUZheERlY29kZXIoc3JjX2J1ZiwgbGltaXQsIHdpZHRoLCBoZWlnaHQsIHBQYXJhbSk7Ci0gICAgICAgIHJldHVybiBfRGVjb2RlQWxsU2NhbmxpbmVzKHBEZWNvZGVyLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKLSAgICB9IGVsc2UgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIkFTQ0lJODVEZWNvZGUiKSB8fCBkZWNvZGVyID09IEZYX0JTVFJDKCJBODUiKSkgewotICAgICAgICByZXR1cm4gX0E4NURlY29kZShzcmNfYnVmLCBsaW1pdCwgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7Ci0gICAgfSBlbHNlIGlmIChkZWNvZGVyID09IEZYX0JTVFJDKCJBU0NJSUhleERlY29kZSIpIHx8IGRlY29kZXIgPT0gRlhfQlNUUkMoIkFIeCIpKSB7Ci0gICAgICAgIHJldHVybiBfSGV4RGVjb2RlKHNyY19idWYsIGxpbWl0LCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKLSAgICB9IGVsc2UgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIkZsYXRlRGVjb2RlIikgfHwgZGVjb2RlciA9PSBGWF9CU1RSQygiRmwiKSkgewotICAgICAgICByZXR1cm4gRlBERkFQSV9GbGF0ZU9yTFpXRGVjb2RlKEZBTFNFLCBzcmNfYnVmLCBsaW1pdCwgcFBhcmFtLCBkZXN0X3NpemUsIGRlc3RfYnVmLCBkZXN0X3NpemUpOwotICAgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiTFpXRGVjb2RlIikgfHwgZGVjb2RlciA9PSBGWF9CU1RSQygiTFpXIikpIHsKLSAgICAgICAgcmV0dXJuIEZQREZBUElfRmxhdGVPckxaV0RlY29kZShUUlVFLCBzcmNfYnVmLCBsaW1pdCwgcFBhcmFtLCAwLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKLSAgICB9IGVsc2UgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIkRDVERlY29kZSIpIHx8IGRlY29kZXIgPT0gRlhfQlNUUkMoIkRDVCIpKSB7Ci0gICAgICAgIElDb2RlY19TY2FubGluZURlY29kZXIqIHBEZWNvZGVyID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRKcGVnTW9kdWxlKCktPkNyZWF0ZURlY29kZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19idWYsIGxpbWl0LCB3aWR0aCwgaGVpZ2h0LCAwLCBwUGFyYW0gPyBwUGFyYW0tPkdldEludGVnZXIoRlhfQlNUUkMoIkNvbG9yVHJhbnNmb3JtIiksIDEpIDogMSk7Ci0gICAgICAgIHJldHVybiBfRGVjb2RlQWxsU2NhbmxpbmVzKHBEZWNvZGVyLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKLSAgICB9IGVsc2UgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIlJ1bkxlbmd0aERlY29kZSIpIHx8IGRlY29kZXIgPT0gRlhfQlNUUkMoIlJMIikpIHsKLSAgICAgICAgcmV0dXJuIFJ1bkxlbmd0aERlY29kZShzcmNfYnVmLCBsaW1pdCwgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7Ci0gICAgfQotICAgIGRlc3Rfc2l6ZSA9IDA7Ci0gICAgZGVzdF9idWYgPSAwOwotICAgIHJldHVybiAoRlhfRFdPUkQpIC0gMTsKLX0KLUNQREZfU3RyZWFtKiBDUERGX1N0cmVhbVBhcnNlcjo6UmVhZElubGluZVN0cmVhbShDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LCBDUERGX09iamVjdCogcENTT2JqLCBGWF9CT09MIGJEZWNvZGUpCi17Ci0gICAgaWYgKG1fUG9zID09IG1fU2l6ZSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKFBERl9DaGFyVHlwZVttX3BCdWZbbV9Qb3NdXSA9PSAnVycpIHsKLSAgICAgICAgbV9Qb3MgKys7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIERlY29kZXI7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW0gPSBOVUxMOwotICAgIENQREZfT2JqZWN0KiBwRmlsdGVyID0gcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRmlsdGVyIikpOwotICAgIGlmIChwRmlsdGVyID09IE5VTEwpIHsKLSAgICB9IGVsc2UgaWYgKHBGaWx0ZXItPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgRGVjb2RlciA9ICgoQ1BERl9BcnJheSopcEZpbHRlciktPkdldFN0cmluZygwKTsKLSAgICAgICAgQ1BERl9BcnJheSogcFBhcmFtcyA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRGVjb2RlUGFybXMiKSk7Ci0gICAgICAgIGlmIChwUGFyYW1zKSB7Ci0gICAgICAgICAgICBwUGFyYW0gPSBwUGFyYW1zLT5HZXREaWN0KDApOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRGVjb2RlciA9IHBGaWx0ZXItPkdldFN0cmluZygpOwotICAgICAgICBwUGFyYW0gPSBwRGljdC0+R2V0RGljdChGWF9CU1RSQygiRGVjb2RlUGFybXMiKSk7Ci0gICAgfQotICAgIEZYX0RXT1JEIHdpZHRoID0gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIldpZHRoIikpOwotICAgIEZYX0RXT1JEIGhlaWdodCA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJIZWlnaHQiKSk7Ci0gICAgRlhfRFdPUkQgT3JpZ1NpemUgPSAwOwotICAgIGlmIChwQ1NPYmogIT0gTlVMTCkgewotICAgICAgICBGWF9EV09SRCBicGMgPSBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiQml0c1BlckNvbXBvbmVudCIpKTsKLSAgICAgICAgRlhfRFdPUkQgbkNvbXBvbmVudHMgPSAxOwotICAgICAgICBDUERGX0NvbG9yU3BhY2UqIHBDUyA9IHBEb2MtPkxvYWRDb2xvclNwYWNlKHBDU09iaik7Ci0gICAgICAgIGlmIChwQ1MgPT0gTlVMTCkgewotICAgICAgICAgICAgbkNvbXBvbmVudHMgPSAzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbkNvbXBvbmVudHMgPSBwQ1MtPkNvdW50Q29tcG9uZW50cygpOwotICAgICAgICAgICAgcERvYy0+R2V0UGFnZURhdGEoKS0+UmVsZWFzZUNvbG9yU3BhY2UocENTT2JqKTsKLSAgICAgICAgfQotICAgICAgICBGWF9EV09SRCBwaXRjaCA9IHdpZHRoOwotICAgICAgICBpZiAoYnBjICYmIHBpdGNoID4gSU5UX01BWCAvIGJwYykgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcGl0Y2ggKj0gYnBjOwotICAgICAgICBpZiAobkNvbXBvbmVudHMgJiYgcGl0Y2ggPiBJTlRfTUFYIC8gbkNvbXBvbmVudHMpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHBpdGNoICo9IG5Db21wb25lbnRzOwotICAgICAgICBpZiAocGl0Y2ggPiBJTlRfTUFYIC0gNykgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcGl0Y2ggKz0gNzsKLSAgICAgICAgcGl0Y2ggLz0gODsKLSAgICAgICAgT3JpZ1NpemUgPSBwaXRjaDsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAod2lkdGggPiBJTlRfTUFYIC0gNykgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgT3JpZ1NpemUgPSAoKHdpZHRoICsgNykgLyA4KTsKLSAgICB9Ci0gICAgaWYgKGhlaWdodCAmJiBPcmlnU2l6ZSA+IElOVF9NQVggLyBoZWlnaHQpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIE9yaWdTaXplICo9IGhlaWdodDsKLSAgICBGWF9MUEJZVEUgcERhdGEgPSBOVUxMOwotICAgIEZYX0RXT1JEIGR3U3RyZWFtU2l6ZTsKLSAgICBpZiAoRGVjb2Rlci5Jc0VtcHR5KCkpIHsKLSAgICAgICAgaWYgKE9yaWdTaXplID4gbV9TaXplIC0gbV9Qb3MpIHsKLSAgICAgICAgICAgIE9yaWdTaXplID0gbV9TaXplIC0gbV9Qb3M7Ci0gICAgICAgIH0KLSAgICAgICAgcERhdGEgPSBGWF9BbGxvYyhGWF9CWVRFLCBPcmlnU2l6ZSk7Ci0gICAgICAgIEZYU1lTX21lbWNweTMyKHBEYXRhLCBtX3BCdWYgKyBtX1BvcywgT3JpZ1NpemUpOwotICAgICAgICBkd1N0cmVhbVNpemUgPSBPcmlnU2l6ZTsKLSAgICAgICAgbV9Qb3MgKz0gT3JpZ1NpemU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRlhfRFdPUkQgZHdEZXN0U2l6ZSA9IE9yaWdTaXplOwotICAgICAgICBkd1N0cmVhbVNpemUgPSBQREZfRGVjb2RlSW5saW5lU3RyZWFtKG1fcEJ1ZiArIG1fUG9zLCBtX1NpemUgLSBtX1Bvcywgd2lkdGgsIGhlaWdodCwgRGVjb2RlciwgcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLCBkd0Rlc3RTaXplKTsKLSAgICAgICAgaWYgKChpbnQpZHdTdHJlYW1TaXplIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJEZWNvZGUpIHsKLSAgICAgICAgICAgIG1fUG9zICs9IGR3U3RyZWFtU2l6ZTsKLSAgICAgICAgICAgIGR3U3RyZWFtU2l6ZSA9IGR3RGVzdFNpemU7Ci0gICAgICAgICAgICBpZiAocEZpbHRlci0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICAgICAgICAgICgoQ1BERl9BcnJheSopcEZpbHRlciktPlJlbW92ZUF0KDApOwotICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBQYXJhbXMgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkRlY29kZVBhcm1zIikpOwotICAgICAgICAgICAgICAgIGlmIChwUGFyYW1zKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlJlbW92ZUF0KDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcERpY3QtPlJlbW92ZUF0KEZYX0JTVFJDKCJGaWx0ZXIiKSk7Ci0gICAgICAgICAgICAgICAgcERpY3QtPlJlbW92ZUF0KEZYX0JTVFJDKCJEZWNvZGVQYXJtcyIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChwRGF0YSkgewotICAgICAgICAgICAgICAgIEZYX0ZyZWUocERhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfRFdPUkQgZHdTYXZlUG9zID0gbV9Qb3M7Ci0gICAgICAgICAgICBtX1BvcyArPSBkd1N0cmVhbVNpemU7Ci0gICAgICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3UHJldlBvcyA9IG1fUG9zOwotICAgICAgICAgICAgICAgIENQREZfU3RyZWFtUGFyc2VyOjpTeW50YXhUeXBlIHR5cGUgPSBQYXJzZU5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gQ1BERl9TdHJlYW1QYXJzZXI6OkVuZE9mRGF0YSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gQ1BERl9TdHJlYW1QYXJzZXI6OktleXdvcmQpIHsKLSAgICAgICAgICAgICAgICAgICAgZHdTdHJlYW1TaXplICs9IG1fUG9zIC0gZHdQcmV2UG9zOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKEdldFdvcmRTaXplKCkgPT0gMiAmJiBHZXRXb3JkQnVmKClbMF0gPT0gJ0UnICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBHZXRXb3JkQnVmKClbMV0gPT0gJ0knKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fUG9zID0gZHdQcmV2UG9zOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZHdTdHJlYW1TaXplICs9IG1fUG9zIC0gZHdQcmV2UG9zOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9Qb3MgPSBkd1NhdmVQb3M7Ci0gICAgICAgICAgICBwRGF0YSA9IEZYX0FsbG9jKEZYX0JZVEUsIGR3U3RyZWFtU2l6ZSk7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkzMihwRGF0YSwgbV9wQnVmICsgbV9Qb3MsIGR3U3RyZWFtU2l6ZSk7Ci0gICAgICAgICAgICBtX1BvcyArPSBkd1N0cmVhbVNpemU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcERpY3QtPlNldEF0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoIiksIChpbnQpZHdTdHJlYW1TaXplKTsKLSAgICByZXR1cm4gQ1BERl9TdHJlYW06OkNyZWF0ZShwRGF0YSwgZHdTdHJlYW1TaXplLCBwRGljdCk7Ci19CisKICNkZWZpbmUgTUFYX1dPUkRfQlVGRkVSIDI1NgotI2RlZmluZSBNQVhfU1RSSU5HX0xFTkdUSAkzMjc2NworI2RlZmluZSBNQVhfU1RSSU5HX0xFTkdUSCAzMjc2NwogI2RlZmluZSBGWERXT1JEX1RSVUUgRlhEV09SRF9GUk9NX0xTQkZJUlNUKDB4NjU3NTcyNzQpCiAjZGVmaW5lIEZYRFdPUkRfTlVMTCBGWERXT1JEX0ZST01fTFNCRklSU1QoMHg2YzZjNzU2ZSkKICNkZWZpbmUgRlhEV09SRF9GQUxTIEZYRFdPUkRfRlJPTV9MU0JGSVJTVCgweDczNmM2MTY2KQotQ1BERl9TdHJlYW1QYXJzZXI6OlN5bnRheFR5cGUgQ1BERl9TdHJlYW1QYXJzZXI6OlBhcnNlTmV4dEVsZW1lbnQoKQotewotICAgIGlmIChtX3BMYXN0T2JqKSB7Ci0gICAgICAgIG1fcExhc3RPYmotPlJlbGVhc2UoKTsKLSAgICAgICAgbV9wTGFzdE9iaiA9IE5VTEw7Ci0gICAgfQotICAgIG1fV29yZFNpemUgPSAwOwotICAgIEZYX0JPT0wgYklzTnVtYmVyID0gVFJVRTsKLSAgICBpZiAobV9Qb3MgPj0gbV9TaXplKSB7CitDUERGX1N0cmVhbVBhcnNlcjo6U3ludGF4VHlwZSBDUERGX1N0cmVhbVBhcnNlcjo6UGFyc2VOZXh0RWxlbWVudCgpIHsKKyAgaWYgKG1fcExhc3RPYmopIHsKKyAgICBtX3BMYXN0T2JqLT5SZWxlYXNlKCk7CisgICAgbV9wTGFzdE9iaiA9IG51bGxwdHI7CisgIH0KKworICBtX1dvcmRTaXplID0gMDsKKyAgRlhfQk9PTCBiSXNOdW1iZXIgPSBUUlVFOworICBpZiAoIVBvc2l0aW9uSXNJbkJvdW5kcygpKQorICAgIHJldHVybiBFbmRPZkRhdGE7CisKKyAgaW50IGNoID0gbV9wQnVmW21fUG9zKytdOworICB3aGlsZSAoMSkgeworICAgIHdoaWxlIChQREZDaGFySXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgaWYgKCFQb3NpdGlvbklzSW5Cb3VuZHMoKSkKICAgICAgICAgcmV0dXJuIEVuZE9mRGF0YTsKKworICAgICAgY2ggPSBtX3BCdWZbbV9Qb3MrK107CiAgICAgfQotICAgIGludCBjaCA9IG1fcEJ1ZlttX1BvcysrXTsKLSAgICBpbnQgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CisKKyAgICBpZiAoY2ggIT0gJyUnKQorICAgICAgYnJlYWs7CisKICAgICB3aGlsZSAoMSkgewotICAgICAgICB3aGlsZSAodHlwZSA9PSAnVycpIHsKLSAgICAgICAgICAgIGlmIChtX1NpemUgPD0gbV9Qb3MpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRW5kT2ZEYXRhOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2ggPSBtX3BCdWZbbV9Qb3MrK107Ci0gICAgICAgICAgICB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2ggIT0gJyUnKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgaWYgKG1fU2l6ZSA8PSBtX1BvcykgewotICAgICAgICAgICAgICAgIHJldHVybiBFbmRPZkRhdGE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaCA9IG1fcEJ1ZlttX1BvcysrXTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnXHInIHx8IGNoID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKKyAgICAgIGlmICghUG9zaXRpb25Jc0luQm91bmRzKCkpCisgICAgICAgIHJldHVybiBFbmRPZkRhdGE7CisKKyAgICAgIGNoID0gbV9wQnVmW21fUG9zKytdOworICAgICAgaWYgKFBERkNoYXJJc0xpbmVFbmRpbmcoY2gpKQorICAgICAgICBicmVhazsKICAgICB9Ci0gICAgaWYgKHR5cGUgPT0gJ0QnICYmIGNoICE9ICcvJykgewotICAgICAgICBtX1BvcyAtLTsKLSAgICAgICAgbV9wTGFzdE9iaiA9IFJlYWROZXh0T2JqZWN0KCk7Ci0gICAgICAgIHJldHVybiBPdGhlcnM7CisgIH0KKworICBpZiAoUERGQ2hhcklzRGVsaW1pdGVyKGNoKSAmJiBjaCAhPSAnLycpIHsKKyAgICBtX1Bvcy0tOworICAgIG1fcExhc3RPYmogPSBSZWFkTmV4dE9iamVjdCgpOworICAgIHJldHVybiBPdGhlcnM7CisgIH0KKworICB3aGlsZSAoMSkgeworICAgIGlmIChtX1dvcmRTaXplIDwgTUFYX1dPUkRfQlVGRkVSKQorICAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKKworICAgIGlmICghUERGQ2hhcklzTnVtZXJpYyhjaCkpCisgICAgICBiSXNOdW1iZXIgPSBGQUxTRTsKKworICAgIGlmICghUG9zaXRpb25Jc0luQm91bmRzKCkpCisgICAgICBicmVhazsKKworICAgIGNoID0gbV9wQnVmW21fUG9zKytdOworCisgICAgaWYgKFBERkNoYXJJc0RlbGltaXRlcihjaCkgfHwgUERGQ2hhcklzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgIG1fUG9zLS07CisgICAgICBicmVhazsKICAgICB9Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaWYgKG1fV29yZFNpemUgPCBNQVhfV09SRF9CVUZGRVIpIHsKLSAgICAgICAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGUgIT0gJ04nKSB7Ci0gICAgICAgICAgICBiSXNOdW1iZXIgPSBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9TaXplIDw9IG1fUG9zKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjaCA9IG1fcEJ1ZlttX1BvcysrXTsKLSAgICAgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07Ci0gICAgICAgIGlmICh0eXBlID09ICdEJyB8fCB0eXBlID09ICdXJykgewotICAgICAgICAgICAgbV9Qb3MgLS07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorICB9CisKKyAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemVdID0gMDsKKyAgaWYgKGJJc051bWJlcikKKyAgICByZXR1cm4gTnVtYmVyOworICBpZiAobV9Xb3JkQnVmZmVyWzBdID09ICcvJykKKyAgICByZXR1cm4gTmFtZTsKKworICBpZiAobV9Xb3JkU2l6ZSA9PSA0KSB7CisgICAgaWYgKCooRlhfRFdPUkQqKW1fV29yZEJ1ZmZlciA9PSBGWERXT1JEX1RSVUUpIHsKKyAgICAgIG1fcExhc3RPYmogPSBuZXcgQ1BERl9Cb29sZWFuKFRSVUUpOworICAgICAgcmV0dXJuIE90aGVyczsKICAgICB9Ci0gICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemVdID0gMDsKLSAgICBpZiAoYklzTnVtYmVyKSB7Ci0gICAgICAgIHJldHVybiBOdW1iZXI7CisgICAgaWYgKCooRlhfRFdPUkQqKW1fV29yZEJ1ZmZlciA9PSBGWERXT1JEX05VTEwpIHsKKyAgICAgIG1fcExhc3RPYmogPSBuZXcgQ1BERl9OdWxsOworICAgICAgcmV0dXJuIE90aGVyczsKICAgICB9Ci0gICAgaWYgKG1fV29yZEJ1ZmZlclswXSA9PSAnLycpIHsKLSAgICAgICAgcmV0dXJuIE5hbWU7CisgIH0gZWxzZSBpZiAobV9Xb3JkU2l6ZSA9PSA1KSB7CisgICAgaWYgKCooRlhfRFdPUkQqKW1fV29yZEJ1ZmZlciA9PSBGWERXT1JEX0ZBTFMgJiYgbV9Xb3JkQnVmZmVyWzRdID09ICdlJykgeworICAgICAgbV9wTGFzdE9iaiA9IG5ldyBDUERGX0Jvb2xlYW4oRkFMU0UpOworICAgICAgcmV0dXJuIE90aGVyczsKICAgICB9Ci0gICAgaWYgKG1fV29yZFNpemUgPT0gNCkgewotICAgICAgICBpZiAoKihGWF9EV09SRCopbV9Xb3JkQnVmZmVyID09IEZYRFdPUkRfVFJVRSkgewotICAgICAgICAgICAgbV9wTGFzdE9iaiA9IENQREZfQm9vbGVhbjo6Q3JlYXRlKFRSVUUpOwotICAgICAgICAgICAgcmV0dXJuIE90aGVyczsKLSAgICAgICAgfQotICAgICAgICBpZiAoKihGWF9EV09SRCopbV9Xb3JkQnVmZmVyID09IEZYRFdPUkRfTlVMTCkgewotICAgICAgICAgICAgbV9wTGFzdE9iaiA9IENQREZfTnVsbDo6Q3JlYXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gT3RoZXJzOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtX1dvcmRTaXplID09IDUpIHsKLSAgICAgICAgaWYgKCooRlhfRFdPUkQqKW1fV29yZEJ1ZmZlciA9PSBGWERXT1JEX0ZBTFMgJiYgbV9Xb3JkQnVmZmVyWzRdID09ICdlJykgewotICAgICAgICAgICAgbV9wTGFzdE9iaiA9IENQREZfQm9vbGVhbjo6Q3JlYXRlKEZBTFNFKTsKLSAgICAgICAgICAgIHJldHVybiBPdGhlcnM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEtleXdvcmQ7CisgIH0KKyAgcmV0dXJuIEtleXdvcmQ7CiB9Ci12b2lkIENQREZfU3RyZWFtUGFyc2VyOjpTa2lwUGF0aE9iamVjdCgpCi17Ci0gICAgRlhfRFdPUkQgY29tbWFuZF9zdGFydHBvcyA9IG1fUG9zOwotICAgIGlmIChtX1BvcyA+PSBtX1NpemUpIHsKKwordm9pZCBDUERGX1N0cmVhbVBhcnNlcjo6U2tpcFBhdGhPYmplY3QoKSB7CisgIEZYX0RXT1JEIGNvbW1hbmRfc3RhcnRwb3MgPSBtX1BvczsKKyAgaWYgKCFQb3NpdGlvbklzSW5Cb3VuZHMoKSkKKyAgICByZXR1cm47CisKKyAgaW50IGNoID0gbV9wQnVmW21fUG9zKytdOworICB3aGlsZSAoMSkgeworICAgIHdoaWxlIChQREZDaGFySXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgaWYgKCFQb3NpdGlvbklzSW5Cb3VuZHMoKSkKICAgICAgICAgcmV0dXJuOworICAgICAgY2ggPSBtX3BCdWZbbV9Qb3MrK107CiAgICAgfQotICAgIGludCBjaCA9IG1fcEJ1ZlttX1BvcysrXTsKLSAgICBpbnQgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07CisKKyAgICBpZiAoIVBERkNoYXJJc051bWVyaWMoY2gpKSB7CisgICAgICBtX1BvcyA9IGNvbW1hbmRfc3RhcnRwb3M7CisgICAgICByZXR1cm47CisgICAgfQorCiAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgd2hpbGUgKHR5cGUgPT0gJ1cnKSB7Ci0gICAgICAgICAgICBpZiAobV9Qb3MgPj0gbV9TaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2ggPSBtX3BCdWZbbV9Qb3MrK107Ci0gICAgICAgICAgICB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKKyAgICAgIHdoaWxlICghUERGQ2hhcklzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgaWYgKCFQb3NpdGlvbklzSW5Cb3VuZHMoKSkKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIGNoID0gbV9wQnVmW21fUG9zKytdOworICAgICAgfQorCisgICAgICB3aGlsZSAoUERGQ2hhcklzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgaWYgKCFQb3NpdGlvbklzSW5Cb3VuZHMoKSkKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIGNoID0gbV9wQnVmW21fUG9zKytdOworICAgICAgfQorCisgICAgICBpZiAoUERGQ2hhcklzTnVtZXJpYyhjaCkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBGWF9EV09SRCBvcF9zdGFydHBvcyA9IG1fUG9zIC0gMTsKKyAgICAgIHdoaWxlICghUERGQ2hhcklzV2hpdGVzcGFjZShjaCkgJiYgIVBERkNoYXJJc0RlbGltaXRlcihjaCkpIHsKKyAgICAgICAgaWYgKCFQb3NpdGlvbklzSW5Cb3VuZHMoKSkKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIGNoID0gbV9wQnVmW21fUG9zKytdOworICAgICAgfQorCisgICAgICBpZiAobV9Qb3MgLSBvcF9zdGFydHBvcyA9PSAyKSB7CisgICAgICAgIGludCBvcCA9IG1fcEJ1ZltvcF9zdGFydHBvc107CisgICAgICAgIGlmIChvcCA9PSBrUGF0aE9wZXJhdG9yU3VicGF0aCB8fCBvcCA9PSBrUGF0aE9wZXJhdG9yTGluZSB8fAorICAgICAgICAgICAgb3AgPT0ga1BhdGhPcGVyYXRvckN1YmljQmV6aWVyMSB8fAorICAgICAgICAgICAgb3AgPT0ga1BhdGhPcGVyYXRvckN1YmljQmV6aWVyMiB8fAorICAgICAgICAgICAgb3AgPT0ga1BhdGhPcGVyYXRvckN1YmljQmV6aWVyMykgeworICAgICAgICAgIGNvbW1hbmRfc3RhcnRwb3MgPSBtX1BvczsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBpZiAodHlwZSAhPSAnTicpIHsKLSAgICAgICAgICAgIG1fUG9zID0gY29tbWFuZF9zdGFydHBvczsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgIH0gZWxzZSBpZiAobV9Qb3MgLSBvcF9zdGFydHBvcyA9PSAzKSB7CisgICAgICAgIGlmIChtX3BCdWZbb3Bfc3RhcnRwb3NdID09IGtQYXRoT3BlcmF0b3JSZWN0YW5nbGVbMF0gJiYKKyAgICAgICAgICAgIG1fcEJ1ZltvcF9zdGFydHBvcyArIDFdID09IGtQYXRoT3BlcmF0b3JSZWN0YW5nbGVbMV0pIHsKKyAgICAgICAgICBjb21tYW5kX3N0YXJ0cG9zID0gbV9Qb3M7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgIHdoaWxlICh0eXBlICE9ICdXJykgewotICAgICAgICAgICAgICAgIGlmIChtX1BvcyA+PSBtX1NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjaCA9IG1fcEJ1ZlttX1BvcysrXTsKLSAgICAgICAgICAgICAgICB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlICh0eXBlID09ICdXJykgewotICAgICAgICAgICAgICAgIGlmIChtX1BvcyA+PSBtX1NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjaCA9IG1fcEJ1ZlttX1BvcysrXTsKLSAgICAgICAgICAgICAgICB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0eXBlID09ICdOJykgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfRFdPUkQgb3Bfc3RhcnRwb3MgPSBtX1BvcyAtIDE7Ci0gICAgICAgICAgICB3aGlsZSAodHlwZSAhPSAnVycgJiYgdHlwZSAhPSAnRCcpIHsKLSAgICAgICAgICAgICAgICBpZiAobV9Qb3MgPj0gbV9TaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2ggPSBtX3BCdWZbbV9Qb3MrK107Ci0gICAgICAgICAgICAgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9Qb3MgLSBvcF9zdGFydHBvcyA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgaW50IG9wID0gbV9wQnVmW29wX3N0YXJ0cG9zXTsKLSAgICAgICAgICAgICAgICBpZiAob3AgPT0gJ20nIHx8IG9wID09ICdsJyB8fCBvcCA9PSAnYycgfHwgb3AgPT0gJ3YnIHx8IG9wID09ICd5JykgewotICAgICAgICAgICAgICAgICAgICBjb21tYW5kX3N0YXJ0cG9zID0gbV9Qb3M7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobV9Qb3MgLSBvcF9zdGFydHBvcyA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fcEJ1ZltvcF9zdGFydHBvc10gPT0gJ3InICYmIG1fcEJ1ZltvcF9zdGFydHBvcyArIDFdID09ICdlJykgewotICAgICAgICAgICAgICAgICAgICBjb21tYW5kX3N0YXJ0cG9zID0gbV9Qb3M7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fUG9zID0gY29tbWFuZF9zdGFydHBvczsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorICAgICAgfQorICAgICAgbV9Qb3MgPSBjb21tYW5kX3N0YXJ0cG9zOworICAgICAgcmV0dXJuOwogICAgIH0KKyAgfQogfQotQ1BERl9PYmplY3QqIENQREZfU3RyZWFtUGFyc2VyOjpSZWFkTmV4dE9iamVjdChGWF9CT09MIGJBbGxvd05lc3RlZEFycmF5LCBGWF9CT09MIGJJbkFycmF5KQotewotICAgIEZYX0JPT0wgYklzTnVtYmVyOwotICAgIEdldE5leHRXb3JkKGJJc051bWJlcik7Ci0gICAgaWYgKG1fV29yZFNpemUgPT0gMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKGJJc051bWJlcikgewotICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZV0gPSAwOwotICAgICAgICByZXR1cm4gQ1BERl9OdW1iZXI6OkNyZWF0ZShDRlhfQnl0ZVN0cmluZ0MobV9Xb3JkQnVmZmVyLCBtX1dvcmRTaXplKSk7Ci0gICAgfQotICAgIGludCBmaXJzdF9jaGFyID0gbV9Xb3JkQnVmZmVyWzBdOwotICAgIGlmIChmaXJzdF9jaGFyID09ICcvJykgewotICAgICAgICByZXR1cm4gQ1BERl9OYW1lOjpDcmVhdGUoUERGX05hbWVEZWNvZGUoQ0ZYX0J5dGVTdHJpbmdDKG1fV29yZEJ1ZmZlciArIDEsIG1fV29yZFNpemUgLSAxKSkpOwotICAgIH0KLSAgICBpZiAoZmlyc3RfY2hhciA9PSAnKCcpIHsKLSAgICAgICAgcmV0dXJuIENQREZfU3RyaW5nOjpDcmVhdGUoUmVhZFN0cmluZygpKTsKLSAgICB9Ci0gICAgaWYgKGZpcnN0X2NoYXIgPT0gJzwnKSB7Ci0gICAgICAgIGlmIChtX1dvcmRTaXplID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBDUERGX1N0cmluZzo6Q3JlYXRlKFJlYWRIZXhTdHJpbmcoKSwgVFJVRSk7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCk7Ci0gICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICBHZXROZXh0V29yZChiSXNOdW1iZXIpOwotICAgICAgICAgICAgaWYgKG1fV29yZFNpemUgPT0gMCkgewotICAgICAgICAgICAgICAgIHBEaWN0LT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9Xb3JkU2l6ZSA9PSAyICYmIG1fV29yZEJ1ZmZlclswXSA9PSAnPicpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX1dvcmRCdWZmZXJbMF0gIT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgcERpY3QtPlJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGtleSA9IFBERl9OYW1lRGVjb2RlKENGWF9CeXRlU3RyaW5nQyhtX1dvcmRCdWZmZXIgKyAxLCBtX1dvcmRTaXplIC0gMSkpOwotICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBSZWFkTmV4dE9iamVjdChUUlVFKTsKLSAgICAgICAgICAgIGlmIChwT2JqID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAocERpY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcERpY3QtPlJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWtleS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBwRGljdC0+U2V0QXQoa2V5LCBwT2JqKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcE9iai0+UmVsZWFzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwRGljdDsKLSAgICB9Ci0gICAgaWYgKGZpcnN0X2NoYXIgPT0gJ1snKSB7Ci0gICAgICAgIGlmICghYkFsbG93TmVzdGVkQXJyYXkgJiYgYkluQXJyYXkpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IENQREZfQXJyYXk6OkNyZWF0ZSgpOwotICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBSZWFkTmV4dE9iamVjdChiQWxsb3dOZXN0ZWRBcnJheSwgVFJVRSk7Ci0gICAgICAgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fV29yZFNpemUgPT0gMCB8fCBtX1dvcmRCdWZmZXJbMF0gPT0gJ10nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwQXJyYXk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtX1dvcmRCdWZmZXJbMF0gPT0gJ1snKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcEFycmF5LT5BZGQocE9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fV29yZFNpemUgPT0gNCkgewotICAgICAgICBpZiAoKihGWF9EV09SRCopbV9Xb3JkQnVmZmVyID09IEZYRFdPUkRfVFJVRSkgewotICAgICAgICAgICAgcmV0dXJuIENQREZfQm9vbGVhbjo6Q3JlYXRlKFRSVUUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgqKEZYX0RXT1JEKiltX1dvcmRCdWZmZXIgPT0gRlhEV09SRF9OVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ1BERl9OdWxsOjpDcmVhdGUoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobV9Xb3JkU2l6ZSA9PSA1KSB7Ci0gICAgICAgIGlmICgqKEZYX0RXT1JEKiltX1dvcmRCdWZmZXIgPT0gRlhEV09SRF9GQUxTICYmIG1fV29yZEJ1ZmZlcls0XSA9PSAnZScpIHsKLSAgICAgICAgICAgIHJldHVybiBDUERGX0Jvb2xlYW46OkNyZWF0ZShGQUxTRSk7Ci0gICAgICAgIH0KLSAgICB9CitDUERGX09iamVjdCogQ1BERl9TdHJlYW1QYXJzZXI6OlJlYWROZXh0T2JqZWN0KEZYX0JPT0wgYkFsbG93TmVzdGVkQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkluQXJyYXkpIHsKKyAgRlhfQk9PTCBiSXNOdW1iZXI7CisgIEdldE5leHRXb3JkKGJJc051bWJlcik7CisgIGlmIChtX1dvcmRTaXplID09IDApIHsKICAgICByZXR1cm4gTlVMTDsKLX0KLXZvaWQgQ1BERl9TdHJlYW1QYXJzZXI6OkdldE5leHRXb3JkKEZYX0JPT0wmIGJJc051bWJlcikKLXsKLSAgICBtX1dvcmRTaXplID0gMDsKLSAgICBiSXNOdW1iZXIgPSBUUlVFOwotICAgIGlmIChtX1NpemUgPD0gbV9Qb3MpIHsKLSAgICAgICAgcmV0dXJuOworICB9CisgIGlmIChiSXNOdW1iZXIpIHsKKyAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZV0gPSAwOworICAgIHJldHVybiBuZXcgQ1BERl9OdW1iZXIoQ0ZYX0J5dGVTdHJpbmdDKG1fV29yZEJ1ZmZlciwgbV9Xb3JkU2l6ZSkpOworICB9CisgIGludCBmaXJzdF9jaGFyID0gbV9Xb3JkQnVmZmVyWzBdOworICBpZiAoZmlyc3RfY2hhciA9PSAnLycpIHsKKyAgICByZXR1cm4gbmV3IENQREZfTmFtZSgKKyAgICAgICAgUERGX05hbWVEZWNvZGUoQ0ZYX0J5dGVTdHJpbmdDKG1fV29yZEJ1ZmZlciArIDEsIG1fV29yZFNpemUgLSAxKSkpOworICB9CisgIGlmIChmaXJzdF9jaGFyID09ICcoJykgeworICAgIHJldHVybiBuZXcgQ1BERl9TdHJpbmcoUmVhZFN0cmluZygpLCBGQUxTRSk7CisgIH0KKyAgaWYgKGZpcnN0X2NoYXIgPT0gJzwnKSB7CisgICAgaWYgKG1fV29yZFNpemUgPT0gMSkgeworICAgICAgcmV0dXJuIG5ldyBDUERGX1N0cmluZyhSZWFkSGV4U3RyaW5nKCksIFRSVUUpOwogICAgIH0KLSAgICBpbnQgY2ggPSBtX3BCdWZbbV9Qb3MrK107Ci0gICAgaW50IHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOworICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwogICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIHdoaWxlICh0eXBlID09ICdXJykgewotICAgICAgICAgICAgaWYgKG1fU2l6ZSA8PSBtX1BvcykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoID0gbV9wQnVmW21fUG9zKytdOwotICAgICAgICAgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoICE9ICclJykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgIGlmIChtX1NpemUgPD0gbV9Qb3MpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaCA9IG1fcEJ1ZlttX1BvcysrXTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnXHInIHx8IGNoID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKKyAgICAgIEdldE5leHRXb3JkKGJJc051bWJlcik7CisgICAgICBpZiAobV9Xb3JkU2l6ZSA9PSAwKSB7CisgICAgICAgIHBEaWN0LT5SZWxlYXNlKCk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgfQorICAgICAgaWYgKG1fV29yZFNpemUgPT0gMiAmJiBtX1dvcmRCdWZmZXJbMF0gPT0gJz4nKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKG1fV29yZEJ1ZmZlclswXSAhPSAnLycpIHsKKyAgICAgICAgcERpY3QtPlJlbGVhc2UoKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICB9CisgICAgICBDRlhfQnl0ZVN0cmluZyBrZXkgPQorICAgICAgICAgIFBERl9OYW1lRGVjb2RlKENGWF9CeXRlU3RyaW5nQyhtX1dvcmRCdWZmZXIgKyAxLCBtX1dvcmRTaXplIC0gMSkpOworICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBSZWFkTmV4dE9iamVjdChUUlVFKTsKKyAgICAgIGlmICghcE9iaikgeworICAgICAgICBwRGljdC0+UmVsZWFzZSgpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIH0KKyAgICAgIGlmICgha2V5LklzRW1wdHkoKSkgeworICAgICAgICBwRGljdC0+U2V0QXQoa2V5LCBwT2JqKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBPYmotPlJlbGVhc2UoKTsKKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKHR5cGUgPT0gJ0QnKSB7Ci0gICAgICAgIGJJc051bWJlciA9IEZBTFNFOworICAgIHJldHVybiBwRGljdDsKKyAgfQorICBpZiAoZmlyc3RfY2hhciA9PSAnWycpIHsKKyAgICBpZiAoIWJBbGxvd05lc3RlZEFycmF5ICYmIGJJbkFycmF5KSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgQ1BERl9BcnJheSogcEFycmF5ID0gbmV3IENQREZfQXJyYXk7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gUmVhZE5leHRPYmplY3QoYkFsbG93TmVzdGVkQXJyYXksIFRSVUUpOworICAgICAgaWYgKHBPYmopIHsKKyAgICAgICAgcEFycmF5LT5BZGQocE9iaik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAobV9Xb3JkU2l6ZSA9PSAwIHx8IG1fV29yZEJ1ZmZlclswXSA9PSAnXScpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcEFycmF5OworICB9CisgIGlmIChtX1dvcmRTaXplID09IDQpIHsKKyAgICBpZiAoKihGWF9EV09SRCopbV9Xb3JkQnVmZmVyID09IEZYRFdPUkRfVFJVRSkgeworICAgICAgcmV0dXJuIG5ldyBDUERGX0Jvb2xlYW4oVFJVRSk7CisgICAgfQorICAgIGlmICgqKEZYX0RXT1JEKiltX1dvcmRCdWZmZXIgPT0gRlhEV09SRF9OVUxMKSB7CisgICAgICByZXR1cm4gbmV3IENQREZfTnVsbDsKKyAgICB9CisgIH0gZWxzZSBpZiAobV9Xb3JkU2l6ZSA9PSA1KSB7CisgICAgaWYgKCooRlhfRFdPUkQqKW1fV29yZEJ1ZmZlciA9PSBGWERXT1JEX0ZBTFMgJiYgbV9Xb3JkQnVmZmVyWzRdID09ICdlJykgeworICAgICAgcmV0dXJuIG5ldyBDUERGX0Jvb2xlYW4oRkFMU0UpOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKK30KK3ZvaWQgQ1BERl9TdHJlYW1QYXJzZXI6OkdldE5leHRXb3JkKEZYX0JPT0wmIGJJc051bWJlcikgeworICBtX1dvcmRTaXplID0gMDsKKyAgYklzTnVtYmVyID0gVFJVRTsKKyAgaWYgKCFQb3NpdGlvbklzSW5Cb3VuZHMoKSkKKyAgICByZXR1cm47CisKKyAgaW50IGNoID0gbV9wQnVmW21fUG9zKytdOworICB3aGlsZSAoMSkgeworICAgIHdoaWxlIChQREZDaGFySXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgaWYgKCFQb3NpdGlvbklzSW5Cb3VuZHMoKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBjaCA9IG1fcEJ1ZlttX1BvcysrXTsKKyAgICB9CisKKyAgICBpZiAoY2ggIT0gJyUnKQorICAgICAgYnJlYWs7CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgaWYgKCFQb3NpdGlvbklzSW5Cb3VuZHMoKSkKKyAgICAgICAgcmV0dXJuOworICAgICAgY2ggPSBtX3BCdWZbbV9Qb3MrK107CisgICAgICBpZiAoUERGQ2hhcklzTGluZUVuZGluZyhjaCkpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChQREZDaGFySXNEZWxpbWl0ZXIoY2gpKSB7CisgICAgYklzTnVtYmVyID0gRkFMU0U7CisgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKKyAgICBpZiAoY2ggPT0gJy8nKSB7CisgICAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIVBvc2l0aW9uSXNJbkJvdW5kcygpKQorICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2ggPSBtX3BCdWZbbV9Qb3MrK107CisgICAgICAgIGlmICghUERGQ2hhcklzT3RoZXIoY2gpICYmICFQREZDaGFySXNOdW1lcmljKGNoKSkgeworICAgICAgICAgIG1fUG9zLS07CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1fV29yZFNpemUgPCBNQVhfV09SRF9CVUZGRVIpCisgICAgICAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNoID09ICc8JykgeworICAgICAgaWYgKCFQb3NpdGlvbklzSW5Cb3VuZHMoKSkKKyAgICAgICAgcmV0dXJuOworICAgICAgY2ggPSBtX3BCdWZbbV9Qb3MrK107CisgICAgICBpZiAoY2ggPT0gJzwnKQogICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOwotICAgICAgICBpZiAoY2ggPT0gJy8nKSB7Ci0gICAgICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgICAgIGlmIChtX1NpemUgPD0gbV9Qb3MpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjaCA9IG1fcEJ1ZlttX1BvcysrXTsKLSAgICAgICAgICAgICAgICB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSAnUicgJiYgdHlwZSAhPSAnTicpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9Qb3MgLS07Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1fV29yZFNpemUgPCBNQVhfV09SRF9CVUZGRVIpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJzwnKSB7Ci0gICAgICAgICAgICBpZiAobV9TaXplIDw9IG1fUG9zKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2ggPSBtX3BCdWZbbV9Qb3MrK107Ci0gICAgICAgICAgICBpZiAoY2ggPT0gJzwnKSB7Ci0gICAgICAgICAgICAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9Qb3MgLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJz4nKSB7Ci0gICAgICAgICAgICBpZiAobV9TaXplIDw9IG1fUG9zKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2ggPSBtX3BCdWZbbV9Qb3MrK107Ci0gICAgICAgICAgICBpZiAoY2ggPT0gJz4nKSB7Ci0gICAgICAgICAgICAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9Qb3MgLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgbV9Qb3MtLTsKKyAgICB9IGVsc2UgaWYgKGNoID09ICc+JykgeworICAgICAgaWYgKCFQb3NpdGlvbklzSW5Cb3VuZHMoKSkKICAgICAgICAgcmV0dXJuOworICAgICAgY2ggPSBtX3BCdWZbbV9Qb3MrK107CisgICAgICBpZiAoY2ggPT0gJz4nKQorICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOworICAgICAgZWxzZQorICAgICAgICBtX1Bvcy0tOwogICAgIH0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAobV9Xb3JkU2l6ZSA8IE1BWF9XT1JEX0JVRkZFUikgewotICAgICAgICAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZSAhPSAnTicpIHsKLSAgICAgICAgICAgIGJJc051bWJlciA9IEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX1NpemUgPD0gbV9Qb3MpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjaCA9IG1fcEJ1ZlttX1BvcysrXTsKLSAgICAgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07Ci0gICAgICAgIGlmICh0eXBlID09ICdEJyB8fCB0eXBlID09ICdXJykgewotICAgICAgICAgICAgbV9Qb3MgLS07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIHdoaWxlICgxKSB7CisgICAgaWYgKG1fV29yZFNpemUgPCBNQVhfV09SRF9CVUZGRVIpCisgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOworICAgIGlmICghUERGQ2hhcklzTnVtZXJpYyhjaCkpCisgICAgICBiSXNOdW1iZXIgPSBGQUxTRTsKKworICAgIGlmICghUG9zaXRpb25Jc0luQm91bmRzKCkpCisgICAgICByZXR1cm47CisgICAgY2ggPSBtX3BCdWZbbV9Qb3MrK107CisgICAgaWYgKFBERkNoYXJJc0RlbGltaXRlcihjaCkgfHwgUERGQ2hhcklzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgIG1fUG9zLS07CisgICAgICBicmVhazsKICAgICB9CisgIH0KIH0KLUNGWF9CeXRlU3RyaW5nIENQREZfU3RyZWFtUGFyc2VyOjpSZWFkU3RyaW5nKCkKLXsKLSAgICBpZiAobV9TaXplIDw9IG1fUG9zKSB7Ci0gICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOworCitDRlhfQnl0ZVN0cmluZyBDUERGX1N0cmVhbVBhcnNlcjo6UmVhZFN0cmluZygpIHsKKyAgaWYgKCFQb3NpdGlvbklzSW5Cb3VuZHMoKSkKKyAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKKworICBpbnQgY2ggPSBtX3BCdWZbbV9Qb3MrK107CisgIENGWF9CeXRlVGV4dEJ1ZiBidWY7CisgIGludCBwYXJsZXZlbCA9IDA7CisgIGludCBzdGF0dXMgPSAwLCBpRXNjQ29kZSA9IDA7CisgIHdoaWxlICgxKSB7CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKGNoID09ICcpJykgeworICAgICAgICAgIGlmIChwYXJsZXZlbCA9PSAwKSB7CisgICAgICAgICAgICBpZiAoYnVmLkdldExlbmd0aCgpID4gTUFYX1NUUklOR19MRU5HVEgpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKGJ1Zi5HZXRCdWZmZXIoKSwgTUFYX1NUUklOR19MRU5HVEgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJ1Zi5HZXRCeXRlU3RyaW5nKCk7CisgICAgICAgICAgfQorICAgICAgICAgIHBhcmxldmVsLS07CisgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJyknKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnKCcpIHsKKyAgICAgICAgICBwYXJsZXZlbCsrOworICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCcoJyk7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xcJykgeworICAgICAgICAgIHN0YXR1cyA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYnVmLkFwcGVuZENoYXIoKGNoYXIpY2gpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc3JykgeworICAgICAgICAgIGlFc2NDb2RlID0gRlhTWVNfdG9EZWNpbWFsRGlnaXQoY2gpOworICAgICAgICAgIHN0YXR1cyA9IDI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoID09ICduJykgeworICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCdcbicpOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdyJykgeworICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCdccicpOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICd0JykgeworICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCdcdCcpOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdiJykgeworICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCdcYicpOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdmJykgeworICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCdcZicpOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICBzdGF0dXMgPSA0OworICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdcbicpIHsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBidWYuQXBwZW5kQ2hhcihjaCk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzcnKSB7CisgICAgICAgICAgaUVzY0NvZGUgPSBpRXNjQ29kZSAqIDggKyBGWFNZU190b0RlY2ltYWxEaWdpdChjaCk7CisgICAgICAgICAgc3RhdHVzID0gMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBidWYuQXBwZW5kQ2hhcihpRXNjQ29kZSk7CisgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnNycpIHsKKyAgICAgICAgICBpRXNjQ29kZSA9IGlFc2NDb2RlICogOCArIEZYU1lTX3RvRGVjaW1hbERpZ2l0KGNoKTsKKyAgICAgICAgICBidWYuQXBwZW5kQ2hhcihpRXNjQ29kZSk7CisgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBidWYuQXBwZW5kQ2hhcihpRXNjQ29kZSk7CisgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgaWYgKGNoICE9ICdcbicpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKICAgICB9CisgICAgaWYgKCFQb3NpdGlvbklzSW5Cb3VuZHMoKSkKKyAgICAgIGJyZWFrOworCisgICAgY2ggPSBtX3BCdWZbbV9Qb3MrK107CisgIH0KKyAgaWYgKFBvc2l0aW9uSXNJbkJvdW5kcygpKQorICAgIGNoID0gbV9wQnVmW21fUG9zKytdOworCisgIGlmIChidWYuR2V0TGVuZ3RoKCkgPiBNQVhfU1RSSU5HX0xFTkdUSCkgeworICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhidWYuR2V0QnVmZmVyKCksIE1BWF9TVFJJTkdfTEVOR1RIKTsKKyAgfQorICByZXR1cm4gYnVmLkdldEJ5dGVTdHJpbmcoKTsKK30KK0NGWF9CeXRlU3RyaW5nIENQREZfU3RyZWFtUGFyc2VyOjpSZWFkSGV4U3RyaW5nKCkgeworICBpZiAoIVBvc2l0aW9uSXNJbkJvdW5kcygpKQorICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOworCisgIENGWF9CeXRlVGV4dEJ1ZiBidWY7CisgIGJvb2wgYkZpcnN0ID0gdHJ1ZTsKKyAgaW50IGNvZGUgPSAwOworICB3aGlsZSAoUG9zaXRpb25Jc0luQm91bmRzKCkpIHsKICAgICBpbnQgY2ggPSBtX3BCdWZbbV9Qb3MrK107Ci0gICAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKLSAgICBpbnQgcGFybGV2ZWwgPSAwOwotICAgIGludCBzdGF0dXMgPSAwLCBpRXNjQ29kZSA9IDA7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJyknKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJsZXZlbCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVmLkdldExlbmd0aCgpID4gTUFYX1NUUklOR19MRU5HVEgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoYnVmLkdldEJ1ZmZlcigpLCBNQVhfU1RSSU5HX0xFTkdUSCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVmLkdldEJ5dGVTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwYXJsZXZlbCAtLTsKLSAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJyknKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcoJykgewotICAgICAgICAgICAgICAgICAgICBwYXJsZXZlbCArKzsKLSAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJygnKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdcXCcpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kQ2hhcigoY2hhciljaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzcnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlFc2NDb2RlID0gY2ggLSAnMCc7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ24nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCdcbicpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ3InKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCdccicpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ3QnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCdcdCcpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ2InKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCdcYicpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ2YnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCdcZicpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSA0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kQ2hhcihjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnNycpIHsKLSAgICAgICAgICAgICAgICAgICAgaUVzY0NvZGUgPSBpRXNjQ29kZSAqIDggKyBjaCAtICcwJzsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kQ2hhcihpRXNjQ29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc3JykgewotICAgICAgICAgICAgICAgICAgICBpRXNjQ29kZSA9IGlFc2NDb2RlICogOCArIGNoIC0gJzAnOwotICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kQ2hhcihpRXNjQ29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZENoYXIoaUVzY0NvZGUpOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fU2l6ZSA8PSBtX1BvcykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2ggPSBtX3BCdWZbbV9Qb3MrK107CisKKyAgICBpZiAoY2ggPT0gJz4nKQorICAgICAgYnJlYWs7CisKKyAgICBpZiAoIXN0ZDo6aXN4ZGlnaXQoY2gpKQorICAgICAgY29udGludWU7CisKKyAgICBpbnQgdmFsID0gRlhTWVNfdG9IZXhEaWdpdChjaCk7CisgICAgaWYgKGJGaXJzdCkgeworICAgICAgY29kZSA9IHZhbCAqIDE2OworICAgIH0gZWxzZSB7CisgICAgICBjb2RlICs9IHZhbDsKKyAgICAgIGJ1Zi5BcHBlbmRCeXRlKCh1aW50OF90KWNvZGUpOwogICAgIH0KLSAgICBpZiAobV9TaXplID4gbV9Qb3MpIHsKLSAgICAgICAgY2ggPSBtX3BCdWZbbV9Qb3MrK107Ci0gICAgfQotICAgIGlmIChidWYuR2V0TGVuZ3RoKCkgPiBNQVhfU1RSSU5HX0xFTkdUSCkgewotICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoYnVmLkdldEJ1ZmZlcigpLCBNQVhfU1RSSU5HX0xFTkdUSCk7Ci0gICAgfQotICAgIHJldHVybiBidWYuR2V0Qnl0ZVN0cmluZygpOworICAgIGJGaXJzdCA9ICFiRmlyc3Q7CisgIH0KKyAgaWYgKCFiRmlyc3QpCisgICAgYnVmLkFwcGVuZENoYXIoKGNoYXIpY29kZSk7CisKKyAgaWYgKGJ1Zi5HZXRMZW5ndGgoKSA+IE1BWF9TVFJJTkdfTEVOR1RIKQorICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhidWYuR2V0QnVmZmVyKCksIE1BWF9TVFJJTkdfTEVOR1RIKTsKKworICByZXR1cm4gYnVmLkdldEJ5dGVTdHJpbmcoKTsKIH0KLUNGWF9CeXRlU3RyaW5nIENQREZfU3RyZWFtUGFyc2VyOjpSZWFkSGV4U3RyaW5nKCkKLXsKLSAgICBpZiAobV9TaXplIDw9IG1fUG9zKSB7Ci0gICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwotICAgIH0KLSAgICBpbnQgY2ggPSBtX3BCdWZbbV9Qb3MrK107Ci0gICAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKLSAgICBGWF9CT09MIGJGaXJzdCA9IFRSVUU7Ci0gICAgaW50IGNvZGUgPSAwOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmIChjaCA9PSAnPicpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7Ci0gICAgICAgICAgICBpZiAoYkZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgY29kZSA9IChjaCAtICcwJykgKiAxNjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29kZSArPSBjaCAtICcwJzsKLSAgICAgICAgICAgICAgICBidWYuQXBwZW5kQ2hhcigoY2hhciljb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJGaXJzdCA9ICFiRmlyc3Q7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykgewotICAgICAgICAgICAgaWYgKGJGaXJzdCkgewotICAgICAgICAgICAgICAgIGNvZGUgPSAoY2ggLSAnQScgKyAxMCkgKiAxNjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29kZSArPSBjaCAtICdBJyArIDEwOwotICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKChjaGFyKWNvZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYkZpcnN0ID0gIWJGaXJzdDsKLSAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKSB7Ci0gICAgICAgICAgICBpZiAoYkZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgY29kZSA9IChjaCAtICdhJyArIDEwKSAqIDE2OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb2RlICs9IGNoIC0gJ2EnICsgMTA7Ci0gICAgICAgICAgICAgICAgYnVmLkFwcGVuZENoYXIoKGNoYXIpY29kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiRmlyc3QgPSAhYkZpcnN0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX1NpemUgPD0gbV9Qb3MpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNoID0gbV9wQnVmW21fUG9zKytdOwotICAgIH0KLSAgICBpZiAoIWJGaXJzdCkgewotICAgICAgICBidWYuQXBwZW5kQ2hhcigoY2hhciljb2RlKTsKLSAgICB9Ci0gICAgaWYgKGJ1Zi5HZXRMZW5ndGgoKSA+IE1BWF9TVFJJTkdfTEVOR1RIKSB7Ci0gICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhidWYuR2V0QnVmZmVyKCksIE1BWF9TVFJJTkdfTEVOR1RIKTsKLSAgICB9Ci0gICAgcmV0dXJuIGJ1Zi5HZXRCeXRlU3RyaW5nKCk7CisKK2Jvb2wgQ1BERl9TdHJlYW1QYXJzZXI6OlBvc2l0aW9uSXNJbkJvdW5kcygpIGNvbnN0IHsKKyAgcmV0dXJuIG1fUG9zIDwgbV9TaXplOwogfQotI2RlZmluZSBQQUdFUEFSU0VfU1RBR0VfR0VUQ09OVEVOVAkJMQotI2RlZmluZSBQQUdFUEFSU0VfU1RBR0VfUEFSU0UJCQkyCi0jZGVmaW5lIFBBR0VQQVJTRV9TVEFHRV9DSEVDS0NMSVAJCTMKKwogQ1BERl9Db250ZW50UGFyc2VyOjpDUERGX0NvbnRlbnRQYXJzZXIoKQotewotICAgIG1fcFBhcnNlciA9IE5VTEw7Ci0gICAgbV9wU3RyZWFtQXJyYXkgPSBOVUxMOwotICAgIG1fcFNpbmdsZVN0cmVhbSA9IE5VTEw7Ci0gICAgbV9wRGF0YSA9IE5VTEw7Ci0gICAgbV9TdGF0dXMgPSBSZWFkeTsKLSAgICBtX3BUeXBlM0NoYXIgPSBOVUxMOworICAgIDogbV9TdGF0dXMoUmVhZHkpLAorICAgICAgbV9JbnRlcm5hbFN0YWdlKFNUQUdFX0dFVENPTlRFTlQpLAorICAgICAgbV9wT2JqZWN0cyhudWxscHRyKSwKKyAgICAgIG1fYkZvcm0oZmFsc2UpLAorICAgICAgbV9wVHlwZTNDaGFyKG51bGxwdHIpLAorICAgICAgbV9wRGF0YShudWxscHRyKSwKKyAgICAgIG1fU2l6ZSgwKSwKKyAgICAgIG1fQ3VycmVudE9mZnNldCgwKSB7fQorQ1BERl9Db250ZW50UGFyc2VyOjp+Q1BERl9Db250ZW50UGFyc2VyKCkgeworICBpZiAoIW1fcFNpbmdsZVN0cmVhbSkKKyAgICBGWF9GcmVlKG1fcERhdGEpOwogfQotQ1BERl9Db250ZW50UGFyc2VyOjp+Q1BERl9Db250ZW50UGFyc2VyKCkKLXsKLSAgICBDbGVhcigpOwotfQotdm9pZCBDUERGX0NvbnRlbnRQYXJzZXI6OkNsZWFyKCkKLXsKLSAgICBpZiAobV9wUGFyc2VyKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BQYXJzZXI7Ci0gICAgfQotICAgIGlmIChtX3BTaW5nbGVTdHJlYW0pIHsKLSAgICAgICAgZGVsZXRlIG1fcFNpbmdsZVN0cmVhbTsKLSAgICB9Ci0gICAgaWYgKG1fcFN0cmVhbUFycmF5KSB7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBtX25TdHJlYW1zOyBpICsrKQotICAgICAgICAgICAgaWYgKG1fcFN0cmVhbUFycmF5W2ldKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIG1fcFN0cmVhbUFycmF5W2ldOwotICAgICAgICAgICAgfQotICAgICAgICBGWF9GcmVlKG1fcFN0cmVhbUFycmF5KTsKLSAgICB9Ci0gICAgaWYgKG1fcERhdGEgJiYgbV9wU2luZ2xlU3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgRlhfRnJlZSgodm9pZCopbV9wRGF0YSk7Ci0gICAgfQotICAgIG1fcFBhcnNlciA9IE5VTEw7Ci0gICAgbV9wU3RyZWFtQXJyYXkgPSBOVUxMOwotICAgIG1fcFNpbmdsZVN0cmVhbSA9IE5VTEw7Ci0gICAgbV9wRGF0YSA9IE5VTEw7Ci0gICAgbV9TdGF0dXMgPSBSZWFkeTsKLX0KLXZvaWQgQ1BERl9Db250ZW50UGFyc2VyOjpTdGFydChDUERGX1BhZ2UqIHBQYWdlLCBDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMpCi17Ci0gICAgaWYgKG1fU3RhdHVzICE9IFJlYWR5IHx8IHBQYWdlID09IE5VTEwgfHwgcFBhZ2UtPm1fcERvY3VtZW50ID09IE5VTEwgfHwgcFBhZ2UtPm1fcEZvcm1EaWN0ID09IE5VTEwpIHsKLSAgICAgICAgbV9TdGF0dXMgPSBEb25lOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fcE9iamVjdHMgPSBwUGFnZTsKLSAgICBtX2JGb3JtID0gRkFMU0U7Ci0gICAgaWYgKHBPcHRpb25zKSB7Ci0gICAgICAgIG1fT3B0aW9ucyA9ICpwT3B0aW9uczsKLSAgICB9Ci0gICAgbV9TdGF0dXMgPSBUb0JlQ29udGludWVkOwotICAgIG1fSW50ZXJuYWxTdGFnZSA9IFBBR0VQQVJTRV9TVEFHRV9HRVRDT05URU5UOwotICAgIG1fQ3VycmVudE9mZnNldCA9IDA7Ci0gICAgQ1BERl9PYmplY3QqIHBDb250ZW50ID0gcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkNvbnRlbnRzIikpOwotICAgIGlmIChwQ29udGVudCA9PSBOVUxMKSB7Ci0gICAgICAgIG1fU3RhdHVzID0gRG9uZTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAocENvbnRlbnQtPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIG1fblN0cmVhbXMgPSAwOwotICAgICAgICBtX3BTaW5nbGVTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW1BY2M7Ci0gICAgICAgIG1fcFNpbmdsZVN0cmVhbS0+TG9hZEFsbERhdGEoKENQREZfU3RyZWFtKilwQ29udGVudCwgRkFMU0UpOwotICAgIH0gZWxzZSBpZiAocENvbnRlbnQtPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBDb250ZW50OwotICAgICAgICBtX25TdHJlYW1zID0gcEFycmF5LT5HZXRDb3VudCgpOwotICAgICAgICBpZiAobV9uU3RyZWFtcyA9PSAwKSB7Ci0gICAgICAgICAgICBtX1N0YXR1cyA9IERvbmU7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbV9wU3RyZWFtQXJyYXkgPSBGWF9BbGxvYyhDUERGX1N0cmVhbUFjYyosIG1fblN0cmVhbXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fU3RhdHVzID0gRG9uZTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLX0KLXZvaWQgQ1BERl9Db250ZW50UGFyc2VyOjpTdGFydChDUERGX0Zvcm0qIHBGb3JtLCBDUERGX0FsbFN0YXRlcyogcEdyYXBoaWNTdGF0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcFBhcmVudE1hdHJpeCwgQ1BERl9UeXBlM0NoYXIqIHBUeXBlM0NoYXIsIENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucywgaW50IGxldmVsKQotewotICAgIG1fcFR5cGUzQ2hhciA9IHBUeXBlM0NoYXI7Ci0gICAgbV9wT2JqZWN0cyA9IHBGb3JtOwotICAgIG1fYkZvcm0gPSBUUlVFOwotICAgIENGWF9BZmZpbmVNYXRyaXggZm9ybV9tYXRyaXggPSBwRm9ybS0+bV9wRm9ybURpY3QtPkdldE1hdHJpeChGWF9CU1RSQygiTWF0cml4IikpOwotICAgIGlmIChwR3JhcGhpY1N0YXRlcykgewotICAgICAgICBmb3JtX21hdHJpeC5Db25jYXQocEdyYXBoaWNTdGF0ZXMtPm1fQ1RNKTsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcEJCb3ggPSBwRm9ybS0+bV9wRm9ybURpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJCQm94IikpOwotICAgIENGWF9GbG9hdFJlY3QgZm9ybV9iYm94OwotICAgIENQREZfUGF0aCBDbGlwUGF0aDsKLSAgICBpZiAocEJCb3gpIHsKLSAgICAgICAgZm9ybV9iYm94ID0gcEJCb3gtPkdldFJlY3QoKTsKLSAgICAgICAgQ2xpcFBhdGguTmV3KCk7Ci0gICAgICAgIENsaXBQYXRoLkFwcGVuZFJlY3QoZm9ybV9iYm94LmxlZnQsIGZvcm1fYmJveC5ib3R0b20sIGZvcm1fYmJveC5yaWdodCwgZm9ybV9iYm94LnRvcCk7Ci0gICAgICAgIENsaXBQYXRoLlRyYW5zZm9ybSgmZm9ybV9tYXRyaXgpOwotICAgICAgICBpZiAocFBhcmVudE1hdHJpeCkgewotICAgICAgICAgICAgQ2xpcFBhdGguVHJhbnNmb3JtKHBQYXJlbnRNYXRyaXgpOwotICAgICAgICB9Ci0gICAgICAgIGZvcm1fYmJveC5UcmFuc2Zvcm0oJmZvcm1fbWF0cml4KTsKLSAgICAgICAgaWYgKHBQYXJlbnRNYXRyaXgpIHsKLSAgICAgICAgICAgIGZvcm1fYmJveC5UcmFuc2Zvcm0ocFBhcmVudE1hdHJpeCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzb3VyY2VzID0gcEZvcm0tPm1fcEZvcm1EaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJSZXNvdXJjZXMiKSk7Ci0gICAgbV9wUGFyc2VyID0gbmV3IENQREZfU3RyZWFtQ29udGVudFBhcnNlcjsKLSAgICBtX3BQYXJzZXItPkluaXRpYWxpemUoKTsKLSAgICBtX3BQYXJzZXItPlByZXBhcmVQYXJzZShwRm9ybS0+bV9wRG9jdW1lbnQsIHBGb3JtLT5tX3BQYWdlUmVzb3VyY2VzLCBwRm9ybS0+bV9wUmVzb3VyY2VzLCBwUGFyZW50TWF0cml4LCBwRm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVzb3VyY2VzLCAmZm9ybV9iYm94LCBwT3B0aW9ucywgcEdyYXBoaWNTdGF0ZXMsIGxldmVsKTsKLSAgICBtX3BQYXJzZXItPm1fcEN1clN0YXRlcy0+bV9DVE0gPSBmb3JtX21hdHJpeDsKLSAgICBtX3BQYXJzZXItPm1fcEN1clN0YXRlcy0+bV9QYXJlbnRNYXRyaXggPSBmb3JtX21hdHJpeDsKLSAgICBpZiAoQ2xpcFBhdGguTm90TnVsbCgpKSB7Ci0gICAgICAgIG1fcFBhcnNlci0+bV9wQ3VyU3RhdGVzLT5tX0NsaXBQYXRoLkFwcGVuZFBhdGgoQ2xpcFBhdGgsIEZYRklMTF9XSU5ESU5HLCBUUlVFKTsKLSAgICB9Ci0gICAgaWYgKHBGb3JtLT5tX1RyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0dST1VQKSB7Ci0gICAgICAgIENQREZfR2VuZXJhbFN0YXRlRGF0YSogcERhdGEgPSBtX3BQYXJzZXItPm1fcEN1clN0YXRlcy0+bV9HZW5lcmFsU3RhdGUuR2V0TW9kaWZ5KCk7Ci0gICAgICAgIHBEYXRhLT5tX0JsZW5kVHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTDsKLSAgICAgICAgcERhdGEtPm1fU3Ryb2tlQWxwaGEgPSAxLjBmOwotICAgICAgICBwRGF0YS0+bV9GaWxsQWxwaGEgPSAxLjBmOwotICAgICAgICBwRGF0YS0+bV9wU29mdE1hc2sgPSBOVUxMOwotICAgIH0KK3ZvaWQgQ1BERl9Db250ZW50UGFyc2VyOjpTdGFydChDUERGX1BhZ2UqIHBQYWdlLCBDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMpIHsKKyAgaWYgKG1fU3RhdHVzICE9IFJlYWR5IHx8ICFwUGFnZSB8fCAhcFBhZ2UtPm1fcERvY3VtZW50IHx8CisgICAgICAhcFBhZ2UtPm1fcEZvcm1EaWN0KSB7CisgICAgbV9TdGF0dXMgPSBEb25lOworICAgIHJldHVybjsKKyAgfQorICBtX3BPYmplY3RzID0gcFBhZ2U7CisgIG1fYkZvcm0gPSBGQUxTRTsKKyAgaWYgKHBPcHRpb25zKSB7CisgICAgbV9PcHRpb25zID0gKnBPcHRpb25zOworICB9CisgIG1fU3RhdHVzID0gVG9CZUNvbnRpbnVlZDsKKyAgbV9JbnRlcm5hbFN0YWdlID0gU1RBR0VfR0VUQ09OVEVOVDsKKyAgbV9DdXJyZW50T2Zmc2V0ID0gMDsKKworICBDUERGX09iamVjdCogcENvbnRlbnQgPSBwUGFnZS0+bV9wRm9ybURpY3QtPkdldEVsZW1lbnRWYWx1ZSgiQ29udGVudHMiKTsKKyAgaWYgKCFwQ29udGVudCkgeworICAgIG1fU3RhdHVzID0gRG9uZTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKENQREZfU3RyZWFtKiBwU3RyZWFtID0gcENvbnRlbnQtPkFzU3RyZWFtKCkpIHsKICAgICBtX25TdHJlYW1zID0gMDsKLSAgICBtX3BTaW5nbGVTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW1BY2M7Ci0gICAgaWYgKHBGb3JtLT5tX3BEb2N1bWVudCkgewotICAgICAgICBtX3BTaW5nbGVTdHJlYW0tPkxvYWRBbGxEYXRhKHBGb3JtLT5tX3BGb3JtU3RyZWFtLCBGQUxTRSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wU2luZ2xlU3RyZWFtLT5Mb2FkQWxsRGF0YShwRm9ybS0+bV9wRm9ybVN0cmVhbSwgRkFMU0UpOwotICAgIH0KLSAgICBtX3BEYXRhID0gKEZYX0xQQllURSltX3BTaW5nbGVTdHJlYW0tPkdldERhdGEoKTsKLSAgICBtX1NpemUgPSBtX3BTaW5nbGVTdHJlYW0tPkdldFNpemUoKTsKLSAgICBtX1N0YXR1cyA9IFRvQmVDb250aW51ZWQ7Ci0gICAgbV9JbnRlcm5hbFN0YWdlID0gUEFHRVBBUlNFX1NUQUdFX1BBUlNFOwotICAgIG1fQ3VycmVudE9mZnNldCA9IDA7CisgICAgbV9wU2luZ2xlU3RyZWFtLnJlc2V0KG5ldyBDUERGX1N0cmVhbUFjYyk7CisgICAgbV9wU2luZ2xlU3RyZWFtLT5Mb2FkQWxsRGF0YShwU3RyZWFtLCBGQUxTRSk7CisgIH0gZWxzZSBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcENvbnRlbnQtPkFzQXJyYXkoKSkgeworICAgIG1fblN0cmVhbXMgPSBwQXJyYXktPkdldENvdW50KCk7CisgICAgaWYgKG1fblN0cmVhbXMpCisgICAgICBtX1N0cmVhbUFycmF5LnJlc2l6ZShtX25TdHJlYW1zKTsKKyAgICBlbHNlCisgICAgICBtX1N0YXR1cyA9IERvbmU7CisgIH0gZWxzZSB7CisgICAgbV9TdGF0dXMgPSBEb25lOworICB9CiB9Ci12b2lkIENQREZfQ29udGVudFBhcnNlcjo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgaW50IHN0ZXBzID0gMDsKLSAgICB3aGlsZSAobV9TdGF0dXMgPT0gVG9CZUNvbnRpbnVlZCkgewotICAgICAgICBpZiAobV9JbnRlcm5hbFN0YWdlID09IFBBR0VQQVJTRV9TVEFHRV9HRVRDT05URU5UKSB7Ci0gICAgICAgICAgICBpZiAobV9DdXJyZW50T2Zmc2V0ID09IG1fblN0cmVhbXMpIHsKLSAgICAgICAgICAgICAgICBpZiAobV9wU3RyZWFtQXJyYXkpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9TaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgaTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1fblN0cmVhbXM7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUgPSBtX3BTdHJlYW1BcnJheVtpXS0+R2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fU2l6ZSArIHNpemUgKyAxIDw9IG1fU2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU3RhdHVzID0gRG9uZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX1NpemUgKz0gc2l6ZSArIDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbV9wRGF0YSA9IEZYX0FsbG9jKEZYX0JZVEUsIG1fU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHBvcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtX25TdHJlYW1zOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkzMihtX3BEYXRhICsgcG9zLCBtX3BTdHJlYW1BcnJheVtpXS0+R2V0RGF0YSgpLCBtX3BTdHJlYW1BcnJheVtpXS0+R2V0U2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSBtX3BTdHJlYW1BcnJheVtpXS0+R2V0U2l6ZSgpICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcERhdGFbcG9zIC0gMV0gPSAnICc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgbV9wU3RyZWFtQXJyYXlbaV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgRlhfRnJlZShtX3BTdHJlYW1BcnJheSk7Ci0gICAgICAgICAgICAgICAgICAgIG1fcFN0cmVhbUFycmF5ID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtX3BEYXRhID0gKEZYX0xQQllURSltX3BTaW5nbGVTdHJlYW0tPkdldERhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgbV9TaXplID0gbV9wU2luZ2xlU3RyZWFtLT5HZXRTaXplKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fSW50ZXJuYWxTdGFnZSA9IFBBR0VQQVJTRV9TVEFHRV9QQVJTRTsKLSAgICAgICAgICAgICAgICBtX0N1cnJlbnRPZmZzZXQgPSAwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwQ29udGVudCA9IG1fcE9iamVjdHMtPm1fcEZvcm1EaWN0LT5HZXRBcnJheShGWF9CU1RSQygiQ29udGVudHMiKSk7Ci0gICAgICAgICAgICAgICAgbV9wU3RyZWFtQXJyYXlbbV9DdXJyZW50T2Zmc2V0XSA9IG5ldyBDUERGX1N0cmVhbUFjYzsKLSAgICAgICAgICAgICAgICBDUERGX1N0cmVhbSogcFN0cmVhbU9iaiA9IChDUERGX1N0cmVhbSopKHBDb250ZW50ID8gcENvbnRlbnQtPkdldEVsZW1lbnRWYWx1ZShtX0N1cnJlbnRPZmZzZXQpIDogTlVMTCk7Ci0gICAgICAgICAgICAgICAgbV9wU3RyZWFtQXJyYXlbbV9DdXJyZW50T2Zmc2V0XS0+TG9hZEFsbERhdGEocFN0cmVhbU9iaiwgRkFMU0UpOwotICAgICAgICAgICAgICAgIG1fQ3VycmVudE9mZnNldCArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobV9JbnRlcm5hbFN0YWdlID09IFBBR0VQQVJTRV9TVEFHRV9QQVJTRSkgewotICAgICAgICAgICAgaWYgKG1fcFBhcnNlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbV9wUGFyc2VyID0gbmV3IENQREZfU3RyZWFtQ29udGVudFBhcnNlcjsKLSAgICAgICAgICAgICAgICBtX3BQYXJzZXItPkluaXRpYWxpemUoKTsKLSAgICAgICAgICAgICAgICBtX3BQYXJzZXItPlByZXBhcmVQYXJzZShtX3BPYmplY3RzLT5tX3BEb2N1bWVudCwgbV9wT2JqZWN0cy0+bV9wUGFnZVJlc291cmNlcywgTlVMTCwgTlVMTCwgbV9wT2JqZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BPYmplY3RzLT5tX3BSZXNvdXJjZXMsICZtX3BPYmplY3RzLT5tX0JCb3gsICZtX09wdGlvbnMsIE5VTEwsIDApOwotICAgICAgICAgICAgICAgIG1fcFBhcnNlci0+bV9wQ3VyU3RhdGVzLT5tX0NvbG9yU3RhdGUuR2V0TW9kaWZ5KCktPkRlZmF1bHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX0N1cnJlbnRPZmZzZXQgPj0gbV9TaXplKSB7Ci0gICAgICAgICAgICAgICAgbV9JbnRlcm5hbFN0YWdlID0gUEFHRVBBUlNFX1NUQUdFX0NIRUNLQ0xJUDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9DdXJyZW50T2Zmc2V0ICs9IG1fcFBhcnNlci0+UGFyc2UobV9wRGF0YSArIG1fQ3VycmVudE9mZnNldCwgbV9TaXplIC0gbV9DdXJyZW50T2Zmc2V0LCBQQVJTRV9TVEVQX0xJTUlUKTsKLSAgICAgICAgICAgICAgICBpZiAobV9wUGFyc2VyLT5tX2JBYm9ydCkgewotICAgICAgICAgICAgICAgICAgICBtX0ludGVybmFsU3RhZ2UgPSBQQUdFUEFSU0VfU1RBR0VfQ0hFQ0tDTElQOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fSW50ZXJuYWxTdGFnZSA9PSBQQUdFUEFSU0VfU1RBR0VfQ0hFQ0tDTElQKSB7Ci0gICAgICAgICAgICBpZiAobV9wVHlwZTNDaGFyKSB7Ci0gICAgICAgICAgICAgICAgbV9wVHlwZTNDaGFyLT5tX2JDb2xvcmVkID0gbV9wUGFyc2VyLT5tX2JDb2xvcmVkOwotICAgICAgICAgICAgICAgIG1fcFR5cGUzQ2hhci0+bV9XaWR0aCA9IEZYU1lTX3JvdW5kKG1fcFBhcnNlci0+bV9UeXBlM0RhdGFbMF0gKiAxMDAwKTsKLSAgICAgICAgICAgICAgICBtX3BUeXBlM0NoYXItPm1fQkJveC5sZWZ0ID0gRlhTWVNfcm91bmQobV9wUGFyc2VyLT5tX1R5cGUzRGF0YVsyXSAqIDEwMDApOwotICAgICAgICAgICAgICAgIG1fcFR5cGUzQ2hhci0+bV9CQm94LmJvdHRvbSA9IEZYU1lTX3JvdW5kKG1fcFBhcnNlci0+bV9UeXBlM0RhdGFbM10gKiAxMDAwKTsKLSAgICAgICAgICAgICAgICBtX3BUeXBlM0NoYXItPm1fQkJveC5yaWdodCA9IEZYU1lTX3JvdW5kKG1fcFBhcnNlci0+bV9UeXBlM0RhdGFbNF0gKiAxMDAwKTsKLSAgICAgICAgICAgICAgICBtX3BUeXBlM0NoYXItPm1fQkJveC50b3AgPSBGWFNZU19yb3VuZChtX3BQYXJzZXItPm1fVHlwZTNEYXRhWzVdICogMTAwMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9QT1NJVElPTiBwb3MgPSBtX3BPYmplY3RzLT5tX09iamVjdExpc3QuR2V0SGVhZFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgICAgICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwT2JqID0gKENQREZfUGFnZU9iamVjdCopbV9wT2JqZWN0cy0+bV9PYmplY3RMaXN0LkdldE5leHQocG9zKTsKLSAgICAgICAgICAgICAgICBpZiAocE9iai0+bV9DbGlwUGF0aC5Jc051bGwoKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBPYmotPm1fQ2xpcFBhdGguR2V0UGF0aENvdW50KCkgIT0gMSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBPYmotPm1fQ2xpcFBhdGguR2V0VGV4dENvdW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENQREZfUGF0aCBDbGlwUGF0aCA9IHBPYmotPm1fQ2xpcFBhdGguR2V0UGF0aCgwKTsKLSAgICAgICAgICAgICAgICBpZiAoIUNsaXBQYXRoLklzUmVjdCgpIHx8IHBPYmotPm1fVHlwZSA9PSBQREZQQUdFX1NIQURJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENGWF9GbG9hdFJlY3Qgb2xkX3JlY3QoQ2xpcFBhdGguR2V0UG9pbnRYKDApLCBDbGlwUGF0aC5HZXRQb2ludFkoMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGlwUGF0aC5HZXRQb2ludFgoMiksIENsaXBQYXRoLkdldFBvaW50WSgyKSk7Ci0gICAgICAgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdCBvYmpfcmVjdChwT2JqLT5tX0xlZnQsIHBPYmotPm1fQm90dG9tLCBwT2JqLT5tX1JpZ2h0LCBwT2JqLT5tX1RvcCk7Ci0gICAgICAgICAgICAgICAgaWYgKG9sZF9yZWN0LkNvbnRhaW5zKG9ial9yZWN0KSkgewotICAgICAgICAgICAgICAgICAgICBwT2JqLT5tX0NsaXBQYXRoLlNldE51bGwoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Cit2b2lkIENQREZfQ29udGVudFBhcnNlcjo6U3RhcnQoQ1BERl9Gb3JtKiBwRm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FsbFN0YXRlcyogcEdyYXBoaWNTdGF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFBhcmVudE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1R5cGUzQ2hhciogcFR5cGUzQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsKSB7CisgIG1fcFR5cGUzQ2hhciA9IHBUeXBlM0NoYXI7CisgIG1fcE9iamVjdHMgPSBwRm9ybTsKKyAgbV9iRm9ybSA9IFRSVUU7CisgIENGWF9NYXRyaXggZm9ybV9tYXRyaXggPSBwRm9ybS0+bV9wRm9ybURpY3QtPkdldE1hdHJpeCgiTWF0cml4Iik7CisgIGlmIChwR3JhcGhpY1N0YXRlcykgeworICAgIGZvcm1fbWF0cml4LkNvbmNhdChwR3JhcGhpY1N0YXRlcy0+bV9DVE0pOworICB9CisgIENQREZfQXJyYXkqIHBCQm94ID0gcEZvcm0tPm1fcEZvcm1EaWN0LT5HZXRBcnJheSgiQkJveCIpOworICBDRlhfRmxvYXRSZWN0IGZvcm1fYmJveDsKKyAgQ1BERl9QYXRoIENsaXBQYXRoOworICBpZiAocEJCb3gpIHsKKyAgICBmb3JtX2Jib3ggPSBwQkJveC0+R2V0UmVjdCgpOworICAgIENsaXBQYXRoLk5ldygpOworICAgIENsaXBQYXRoLkFwcGVuZFJlY3QoZm9ybV9iYm94LmxlZnQsIGZvcm1fYmJveC5ib3R0b20sIGZvcm1fYmJveC5yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1fYmJveC50b3ApOworICAgIENsaXBQYXRoLlRyYW5zZm9ybSgmZm9ybV9tYXRyaXgpOworICAgIGlmIChwUGFyZW50TWF0cml4KSB7CisgICAgICBDbGlwUGF0aC5UcmFuc2Zvcm0ocFBhcmVudE1hdHJpeCk7CisgICAgfQorICAgIGZvcm1fYmJveC5UcmFuc2Zvcm0oJmZvcm1fbWF0cml4KTsKKyAgICBpZiAocFBhcmVudE1hdHJpeCkgeworICAgICAgZm9ybV9iYm94LlRyYW5zZm9ybShwUGFyZW50TWF0cml4KTsKKyAgICB9CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzb3VyY2VzID0gcEZvcm0tPm1fcEZvcm1EaWN0LT5HZXREaWN0KCJSZXNvdXJjZXMiKTsKKyAgbV9wUGFyc2VyLnJlc2V0KG5ldyBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXIoCisgICAgICBwRm9ybS0+bV9wRG9jdW1lbnQsIHBGb3JtLT5tX3BQYWdlUmVzb3VyY2VzLCBwRm9ybS0+bV9wUmVzb3VyY2VzLAorICAgICAgcFBhcmVudE1hdHJpeCwgcEZvcm0sIHBSZXNvdXJjZXMsICZmb3JtX2Jib3gsIHBPcHRpb25zLCBwR3JhcGhpY1N0YXRlcywKKyAgICAgIGxldmVsKSk7CisgIG1fcFBhcnNlci0+R2V0Q3VyU3RhdGVzKCktPm1fQ1RNID0gZm9ybV9tYXRyaXg7CisgIG1fcFBhcnNlci0+R2V0Q3VyU3RhdGVzKCktPm1fUGFyZW50TWF0cml4ID0gZm9ybV9tYXRyaXg7CisgIGlmIChDbGlwUGF0aC5Ob3ROdWxsKCkpIHsKKyAgICBtX3BQYXJzZXItPkdldEN1clN0YXRlcygpLT5tX0NsaXBQYXRoLkFwcGVuZFBhdGgoQ2xpcFBhdGgsIEZYRklMTF9XSU5ESU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKTsKKyAgfQorICBpZiAocEZvcm0tPm1fVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfR1JPVVApIHsKKyAgICBDUERGX0dlbmVyYWxTdGF0ZURhdGEqIHBEYXRhID0KKyAgICAgICAgbV9wUGFyc2VyLT5HZXRDdXJTdGF0ZXMoKS0+bV9HZW5lcmFsU3RhdGUuR2V0TW9kaWZ5KCk7CisgICAgcERhdGEtPm1fQmxlbmRUeXBlID0gRlhESUJfQkxFTkRfTk9STUFMOworICAgIHBEYXRhLT5tX1N0cm9rZUFscGhhID0gMS4wZjsKKyAgICBwRGF0YS0+bV9GaWxsQWxwaGEgPSAxLjBmOworICAgIHBEYXRhLT5tX3BTb2Z0TWFzayA9IE5VTEw7CisgIH0KKyAgbV9uU3RyZWFtcyA9IDA7CisgIG1fcFNpbmdsZVN0cmVhbS5yZXNldChuZXcgQ1BERl9TdHJlYW1BY2MpOworICBtX3BTaW5nbGVTdHJlYW0tPkxvYWRBbGxEYXRhKHBGb3JtLT5tX3BGb3JtU3RyZWFtLCBGQUxTRSk7CisgIG1fcERhdGEgPSAodWludDhfdCopbV9wU2luZ2xlU3RyZWFtLT5HZXREYXRhKCk7CisgIG1fU2l6ZSA9IG1fcFNpbmdsZVN0cmVhbS0+R2V0U2l6ZSgpOworICBtX1N0YXR1cyA9IFRvQmVDb250aW51ZWQ7CisgIG1fSW50ZXJuYWxTdGFnZSA9IFNUQUdFX1BBUlNFOworICBtX0N1cnJlbnRPZmZzZXQgPSAwOworfQordm9pZCBDUERGX0NvbnRlbnRQYXJzZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKSB7CisgIGludCBzdGVwcyA9IDA7CisgIHdoaWxlIChtX1N0YXR1cyA9PSBUb0JlQ29udGludWVkKSB7CisgICAgaWYgKG1fSW50ZXJuYWxTdGFnZSA9PSBTVEFHRV9HRVRDT05URU5UKSB7CisgICAgICBpZiAobV9DdXJyZW50T2Zmc2V0ID09IG1fblN0cmVhbXMpIHsKKyAgICAgICAgaWYgKCFtX1N0cmVhbUFycmF5LmVtcHR5KCkpIHsKKyAgICAgICAgICBGWF9TQUZFX0RXT1JEIHNhZmVTaXplID0gMDsKKyAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHN0cmVhbSA6IG1fU3RyZWFtQXJyYXkpIHsKKyAgICAgICAgICAgIHNhZmVTaXplICs9IHN0cmVhbS0+R2V0U2l6ZSgpOworICAgICAgICAgICAgc2FmZVNpemUgKz0gMTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFzYWZlU2l6ZS5Jc1ZhbGlkKCkpIHsKICAgICAgICAgICAgIG1fU3RhdHVzID0gRG9uZTsKICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgICAgbV9TaXplID0gc2FmZVNpemUuVmFsdWVPckRpZSgpOworICAgICAgICAgIG1fcERhdGEgPSBGWF9BbGxvYyh1aW50OF90LCBtX1NpemUpOworICAgICAgICAgIEZYX0RXT1JEIHBvcyA9IDA7CisgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzdHJlYW0gOiBtX1N0cmVhbUFycmF5KSB7CisgICAgICAgICAgICBGWFNZU19tZW1jcHkobV9wRGF0YSArIHBvcywgc3RyZWFtLT5HZXREYXRhKCksIHN0cmVhbS0+R2V0U2l6ZSgpKTsKKyAgICAgICAgICAgIHBvcyArPSBzdHJlYW0tPkdldFNpemUoKTsKKyAgICAgICAgICAgIG1fcERhdGFbcG9zKytdID0gJyAnOworICAgICAgICAgIH0KKyAgICAgICAgICBtX1N0cmVhbUFycmF5LmNsZWFyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbV9wRGF0YSA9ICh1aW50OF90KiltX3BTaW5nbGVTdHJlYW0tPkdldERhdGEoKTsKKyAgICAgICAgICBtX1NpemUgPSBtX3BTaW5nbGVTdHJlYW0tPkdldFNpemUoKTsKICAgICAgICAgfQotICAgICAgICBzdGVwcyArKzsKLSAgICAgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICBtX0ludGVybmFsU3RhZ2UgPSBTVEFHRV9QQVJTRTsKKyAgICAgICAgbV9DdXJyZW50T2Zmc2V0ID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENQREZfQXJyYXkqIHBDb250ZW50ID0gbV9wT2JqZWN0cy0+bV9wRm9ybURpY3QtPkdldEFycmF5KCJDb250ZW50cyIpOworICAgICAgICBtX1N0cmVhbUFycmF5W21fQ3VycmVudE9mZnNldF0ucmVzZXQobmV3IENQREZfU3RyZWFtQWNjKTsKKyAgICAgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW1PYmogPSBUb1N0cmVhbSgKKyAgICAgICAgICAgIHBDb250ZW50ID8gcENvbnRlbnQtPkdldEVsZW1lbnRWYWx1ZShtX0N1cnJlbnRPZmZzZXQpIDogbnVsbHB0cik7CisgICAgICAgIG1fU3RyZWFtQXJyYXlbbV9DdXJyZW50T2Zmc2V0XS0+TG9hZEFsbERhdGEocFN0cmVhbU9iaiwgRkFMU0UpOworICAgICAgICBtX0N1cnJlbnRPZmZzZXQrKzsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG1fSW50ZXJuYWxTdGFnZSA9PSBTVEFHRV9QQVJTRSkgeworICAgICAgaWYgKCFtX3BQYXJzZXIpIHsKKyAgICAgICAgbV9wUGFyc2VyLnJlc2V0KG5ldyBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXIoCisgICAgICAgICAgICBtX3BPYmplY3RzLT5tX3BEb2N1bWVudCwgbV9wT2JqZWN0cy0+bV9wUGFnZVJlc291cmNlcywgbnVsbHB0ciwKKyAgICAgICAgICAgIG51bGxwdHIsIG1fcE9iamVjdHMsIG1fcE9iamVjdHMtPm1fcFJlc291cmNlcywgJm1fcE9iamVjdHMtPm1fQkJveCwKKyAgICAgICAgICAgICZtX09wdGlvbnMsIG51bGxwdHIsIDApKTsKKyAgICAgICAgbV9wUGFyc2VyLT5HZXRDdXJTdGF0ZXMoKS0+bV9Db2xvclN0YXRlLkdldE1vZGlmeSgpLT5EZWZhdWx0KCk7CisgICAgICB9CisgICAgICBpZiAobV9DdXJyZW50T2Zmc2V0ID49IG1fU2l6ZSkgeworICAgICAgICBtX0ludGVybmFsU3RhZ2UgPSBTVEFHRV9DSEVDS0NMSVA7CisgICAgICB9IGVsc2UgeworICAgICAgICBtX0N1cnJlbnRPZmZzZXQgKz0KKyAgICAgICAgICAgIG1fcFBhcnNlci0+UGFyc2UobV9wRGF0YSArIG1fQ3VycmVudE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9TaXplIC0gbV9DdXJyZW50T2Zmc2V0LCBQQVJTRV9TVEVQX0xJTUlUKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG1fSW50ZXJuYWxTdGFnZSA9PSBTVEFHRV9DSEVDS0NMSVApIHsKKyAgICAgIGlmIChtX3BUeXBlM0NoYXIpIHsKKyAgICAgICAgbV9wVHlwZTNDaGFyLT5tX2JDb2xvcmVkID0gbV9wUGFyc2VyLT5Jc0NvbG9yZWQoKTsKKyAgICAgICAgbV9wVHlwZTNDaGFyLT5tX1dpZHRoID0KKyAgICAgICAgICAgIEZYU1lTX3JvdW5kKG1fcFBhcnNlci0+R2V0VHlwZTNEYXRhKClbMF0gKiAxMDAwKTsKKyAgICAgICAgbV9wVHlwZTNDaGFyLT5tX0JCb3gubGVmdCA9CisgICAgICAgICAgICBGWFNZU19yb3VuZChtX3BQYXJzZXItPkdldFR5cGUzRGF0YSgpWzJdICogMTAwMCk7CisgICAgICAgIG1fcFR5cGUzQ2hhci0+bV9CQm94LmJvdHRvbSA9CisgICAgICAgICAgICBGWFNZU19yb3VuZChtX3BQYXJzZXItPkdldFR5cGUzRGF0YSgpWzNdICogMTAwMCk7CisgICAgICAgIG1fcFR5cGUzQ2hhci0+bV9CQm94LnJpZ2h0ID0KKyAgICAgICAgICAgIEZYU1lTX3JvdW5kKG1fcFBhcnNlci0+R2V0VHlwZTNEYXRhKClbNF0gKiAxMDAwKTsKKyAgICAgICAgbV9wVHlwZTNDaGFyLT5tX0JCb3gudG9wID0KKyAgICAgICAgICAgIEZYU1lTX3JvdW5kKG1fcFBhcnNlci0+R2V0VHlwZTNEYXRhKClbNV0gKiAxMDAwKTsKKyAgICAgIH0KKyAgICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fcE9iamVjdHMtPm1fT2JqZWN0TGlzdC5HZXRIZWFkUG9zaXRpb24oKTsKKyAgICAgIHdoaWxlIChwb3MpIHsKKyAgICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwT2JqID0KKyAgICAgICAgICAgIChDUERGX1BhZ2VPYmplY3QqKW1fcE9iamVjdHMtPm1fT2JqZWN0TGlzdC5HZXROZXh0KHBvcyk7CisgICAgICAgIGlmIChwT2JqLT5tX0NsaXBQYXRoLklzTnVsbCgpKSB7CisgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHBPYmotPm1fQ2xpcFBhdGguR2V0UGF0aENvdW50KCkgIT0gMSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChwT2JqLT5tX0NsaXBQYXRoLkdldFRleHRDb3VudCgpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQ1BERl9QYXRoIENsaXBQYXRoID0gcE9iai0+bV9DbGlwUGF0aC5HZXRQYXRoKDApOworICAgICAgICBpZiAoIUNsaXBQYXRoLklzUmVjdCgpIHx8IHBPYmotPm1fVHlwZSA9PSBQREZQQUdFX1NIQURJTkcpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBDRlhfRmxvYXRSZWN0IG9sZF9yZWN0KENsaXBQYXRoLkdldFBvaW50WCgwKSwgQ2xpcFBhdGguR2V0UG9pbnRZKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaXBQYXRoLkdldFBvaW50WCgyKSwgQ2xpcFBhdGguR2V0UG9pbnRZKDIpKTsKKyAgICAgICAgQ0ZYX0Zsb2F0UmVjdCBvYmpfcmVjdChwT2JqLT5tX0xlZnQsIHBPYmotPm1fQm90dG9tLCBwT2JqLT5tX1JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmotPm1fVG9wKTsKKyAgICAgICAgaWYgKG9sZF9yZWN0LkNvbnRhaW5zKG9ial9yZWN0KSkgeworICAgICAgICAgIHBPYmotPm1fQ2xpcFBhdGguU2V0TnVsbCgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBtX1N0YXR1cyA9IERvbmU7CisgICAgICByZXR1cm47CiAgICAgfQotfQotaW50IENQREZfQ29udGVudFBhcnNlcjo6RXN0aW1hdGVQcm9ncmVzcygpCi17Ci0gICAgaWYgKG1fU3RhdHVzID09IFJlYWR5KSB7Ci0gICAgICAgIHJldHVybiAwOworICAgIHN0ZXBzKys7CisgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICBpZiAobV9TdGF0dXMgPT0gRG9uZSkgewotICAgICAgICByZXR1cm4gMTAwOwotICAgIH0KLSAgICBpZiAobV9JbnRlcm5hbFN0YWdlID09IFBBR0VQQVJTRV9TVEFHRV9HRVRDT05URU5UKSB7Ci0gICAgICAgIHJldHVybiAxMDsKLSAgICB9Ci0gICAgaWYgKG1fSW50ZXJuYWxTdGFnZSA9PSBQQUdFUEFSU0VfU1RBR0VfQ0hFQ0tDTElQKSB7Ci0gICAgICAgIHJldHVybiA5MDsKLSAgICB9Ci0gICAgcmV0dXJuIDEwICsgODAgKiBtX0N1cnJlbnRPZmZzZXQgLyBtX1NpemU7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXJzZXJfb2xkX3VuaXR0ZXN0LmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXJzZXJfb2xkX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmMwMTJmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhcnNlcl9vbGRfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNDggQEAKKy8vIENvcHlyaWdodCAyMDE1IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCisjaW5jbHVkZSAicGFnZWludC5oIgorCitURVNUKGZwZGZfcGFnZV9wYXJzZXJfb2xkLCBSZWFkSGV4U3RyaW5nKSB7CisgIHsKKyAgICAvLyBQb3NpdGlvbiBvdXQgb2YgYm91bmRzLgorICAgIHVpbnQ4X3QgZGF0YVtdID0gIjEyYWI+IjsKKyAgICBDUERGX1N0cmVhbVBhcnNlciBwYXJzZXIoZGF0YSwgNSk7CisgICAgcGFyc2VyLlNldFBvcyg2KTsKKyAgICBFWFBFQ1RfRVEoIiIsIHBhcnNlci5SZWFkSGV4U3RyaW5nKCkpOworICB9CisKKyAgeworICAgIC8vIFJlZ3VsYXIgY29udmVyc2lvbi4KKyAgICB1aW50OF90IGRhdGFbXSA9ICIxQTJiPmFiY2QiOworICAgIENQREZfU3RyZWFtUGFyc2VyIHBhcnNlcihkYXRhLCA1KTsKKyAgICBFWFBFQ1RfRVEoIlx4MWFceDJiIiwgcGFyc2VyLlJlYWRIZXhTdHJpbmcoKSk7CisgICAgRVhQRUNUX0VRKDUsIHBhcnNlci5HZXRQb3MoKSk7CisgIH0KKworICB7CisgICAgLy8gTWlzc2luZyBlbmRpbmcgPgorICAgIHVpbnQ4X3QgZGF0YVtdID0gIjFBMmIiOworICAgIENQREZfU3RyZWFtUGFyc2VyIHBhcnNlcihkYXRhLCA1KTsKKyAgICBFWFBFQ1RfRVEoIlx4MWFceDJiIiwgcGFyc2VyLlJlYWRIZXhTdHJpbmcoKSk7CisgICAgRVhQRUNUX0VRKDUsIHBhcnNlci5HZXRQb3MoKSk7CisgIH0KKworICB7CisgICAgLy8gVW5ldmVuIG51bWJlciBvZiBieXRlcy4KKyAgICB1aW50OF90IGRhdGFbXSA9ICIxQTI+YXNkZiI7CisgICAgQ1BERl9TdHJlYW1QYXJzZXIgcGFyc2VyKGRhdGEsIDUpOworICAgIEVYUEVDVF9FUSgiXHgxYVx4MjAiLCBwYXJzZXIuUmVhZEhleFN0cmluZygpKTsKKyAgICBFWFBFQ1RfRVEoNCwgcGFyc2VyLkdldFBvcygpKTsKKyAgfQorCisgIHsKKyAgICB1aW50OF90IGRhdGFbXSA9ICI+IjsKKyAgICBDUERGX1N0cmVhbVBhcnNlciBwYXJzZXIoZGF0YSwgNSk7CisgICAgRVhQRUNUX0VRKCIiLCBwYXJzZXIuUmVhZEhleFN0cmluZygpKTsKKyAgICBFWFBFQ1RfRVEoMSwgcGFyc2VyLkdldFBvcygpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhdGguY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhdGguY3BwCmluZGV4IDhiNGQ0MjIuLmE3Njg0MzQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXRoLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGF0aC5jcHAKQEAgLTEsNTIgKzEsNTAgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2UuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlb2JqLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgiCiAjaW5jbHVkZSAicGFnZWludC5oIgotdm9pZCBDUERGX1BhdGhPYmplY3Q6OkNvcHlEYXRhKGNvbnN0IENQREZfUGFnZU9iamVjdCogcFNyYykKLXsKLSAgICBjb25zdCBDUERGX1BhdGhPYmplY3QqIHBTcmNPYmogPSAoY29uc3QgQ1BERl9QYXRoT2JqZWN0KilwU3JjOwotICAgIG1fUGF0aCA9IHBTcmNPYmotPm1fUGF0aDsKLSAgICBtX0ZpbGxUeXBlID0gcFNyY09iai0+bV9GaWxsVHlwZTsKLSAgICBtX2JTdHJva2UgPSBwU3JjT2JqLT5tX2JTdHJva2U7Ci0gICAgbV9NYXRyaXggPSBwU3JjT2JqLT5tX01hdHJpeDsKKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlb2JqLmgiCisKK3ZvaWQgQ1BERl9QYXRoT2JqZWN0OjpDb3B5RGF0YShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTcmMpIHsKKyAgY29uc3QgQ1BERl9QYXRoT2JqZWN0KiBwU3JjT2JqID0gKGNvbnN0IENQREZfUGF0aE9iamVjdCopcFNyYzsKKyAgbV9QYXRoID0gcFNyY09iai0+bV9QYXRoOworICBtX0ZpbGxUeXBlID0gcFNyY09iai0+bV9GaWxsVHlwZTsKKyAgbV9iU3Ryb2tlID0gcFNyY09iai0+bV9iU3Ryb2tlOworICBtX01hdHJpeCA9IHBTcmNPYmotPm1fTWF0cml4OwogfQotdm9pZCBDUERGX1BhdGhPYmplY3Q6OlRyYW5zZm9ybShjb25zdCBDUERGX01hdHJpeCYgbWF0cml4KQotewotICAgIG1fTWF0cml4LkNvbmNhdChtYXRyaXgpOwotICAgIENhbGNCb3VuZGluZ0JveCgpOwordm9pZCBDUERGX1BhdGhPYmplY3Q6OlRyYW5zZm9ybShjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsKKyAgbV9NYXRyaXguQ29uY2F0KG1hdHJpeCk7CisgIENhbGNCb3VuZGluZ0JveCgpOwogfQotdm9pZCBDUERGX1BhdGhPYmplY3Q6OlNldEdyYXBoU3RhdGUoQ1BERl9HcmFwaFN0YXRlIEdyYXBoU3RhdGUpCi17Ci0gICAgbV9HcmFwaFN0YXRlID0gR3JhcGhTdGF0ZTsKLSAgICBDYWxjQm91bmRpbmdCb3goKTsKK3ZvaWQgQ1BERl9QYXRoT2JqZWN0OjpTZXRHcmFwaFN0YXRlKENQREZfR3JhcGhTdGF0ZSBHcmFwaFN0YXRlKSB7CisgIG1fR3JhcGhTdGF0ZSA9IEdyYXBoU3RhdGU7CisgIENhbGNCb3VuZGluZ0JveCgpOwogfQotdm9pZCBDUERGX1BhdGhPYmplY3Q6OkNhbGNCb3VuZGluZ0JveCgpCi17Ci0gICAgaWYgKG1fUGF0aC5Jc051bGwoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENGWF9GbG9hdFJlY3QgcmVjdDsKLSAgICBGWF9GTE9BVCB3aWR0aCA9IG1fR3JhcGhTdGF0ZS5HZXRPYmplY3QoKS0+bV9MaW5lV2lkdGg7Ci0gICAgaWYgKG1fYlN0cm9rZSAmJiB3aWR0aCAhPSAwKSB7Ci0gICAgICAgIHJlY3QgPSBtX1BhdGguR2V0Qm91bmRpbmdCb3god2lkdGgsIG1fR3JhcGhTdGF0ZS5HZXRPYmplY3QoKS0+bV9NaXRlckxpbWl0KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZWN0ID0gbV9QYXRoLkdldEJvdW5kaW5nQm94KCk7Ci0gICAgfQotICAgIHJlY3QuVHJhbnNmb3JtKCZtX01hdHJpeCk7Ci0gICAgaWYgKHdpZHRoID09IDAgJiYgbV9iU3Ryb2tlKSB7Ci0gICAgICAgIHJlY3QubGVmdCArPSAtMC41ZjsKLSAgICAgICAgcmVjdC5yaWdodCArPSAwLjVmOwotICAgICAgICByZWN0LmJvdHRvbSArPSAtMC41ZjsKLSAgICAgICAgcmVjdC50b3AgKz0gMC41ZjsKLSAgICB9Ci0gICAgbV9MZWZ0ID0gcmVjdC5sZWZ0OwotICAgIG1fUmlnaHQgPSByZWN0LnJpZ2h0OwotICAgIG1fVG9wID0gcmVjdC50b3A7Ci0gICAgbV9Cb3R0b20gPSByZWN0LmJvdHRvbTsKK3ZvaWQgQ1BERl9QYXRoT2JqZWN0OjpDYWxjQm91bmRpbmdCb3goKSB7CisgIGlmIChtX1BhdGguSXNOdWxsKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0OworICBGWF9GTE9BVCB3aWR0aCA9IG1fR3JhcGhTdGF0ZS5HZXRPYmplY3QoKS0+bV9MaW5lV2lkdGg7CisgIGlmIChtX2JTdHJva2UgJiYgd2lkdGggIT0gMCkgeworICAgIHJlY3QgPSBtX1BhdGguR2V0Qm91bmRpbmdCb3god2lkdGgsIG1fR3JhcGhTdGF0ZS5HZXRPYmplY3QoKS0+bV9NaXRlckxpbWl0KTsKKyAgfSBlbHNlIHsKKyAgICByZWN0ID0gbV9QYXRoLkdldEJvdW5kaW5nQm94KCk7CisgIH0KKyAgcmVjdC5UcmFuc2Zvcm0oJm1fTWF0cml4KTsKKyAgaWYgKHdpZHRoID09IDAgJiYgbV9iU3Ryb2tlKSB7CisgICAgcmVjdC5sZWZ0ICs9IC0wLjVmOworICAgIHJlY3QucmlnaHQgKz0gMC41ZjsKKyAgICByZWN0LmJvdHRvbSArPSAtMC41ZjsKKyAgICByZWN0LnRvcCArPSAwLjVmOworICB9CisgIG1fTGVmdCA9IHJlY3QubGVmdDsKKyAgbV9SaWdodCA9IHJlY3QucmlnaHQ7CisgIG1fVG9wID0gcmVjdC50b3A7CisgIG1fQm90dG9tID0gcmVjdC5ib3R0b207CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGF0dGVybi5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGF0dGVybi5jcHAKaW5kZXggZDIzZDc1YS4uMWVhZTU3OCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhdHRlcm4uY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXR0ZXJuLmNwcApAQCAtMSwyOTUgKzEsMzE1IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlLmgiCiAjaW5jbHVkZSAicGFnZWludC5oIgogCi1DUERGX1BhdHRlcm46OkNQREZfUGF0dGVybihjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwUGFyZW50TWF0cml4KSA6Ci0gICAgbV9wUGF0dGVybk9iaihOVUxMKSwgbV9QYXR0ZXJuVHlwZShQQVRURVJOX1RJTElORyksIG1fcERvY3VtZW50KE5VTEwpLCBtX2JGb3JjZUNsZWFyKEZBTFNFKQotewotICAgIGlmIChwUGFyZW50TWF0cml4KSB7Ci0gICAgICAgIG1fUGFyZW50TWF0cml4ID0gKnBQYXJlbnRNYXRyaXg7Ci0gICAgfQorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBpbnQga1NpbmdsZUNvb3JkaW5hdGVQYWlyID0gMTsKK2NvbnN0IGludCBrVGVuc29yQ29vcmRpbmF0ZVBhaXJzID0gMTY7Citjb25zdCBpbnQga0Nvb25zQ29vcmRpbmF0ZVBhaXJzID0gMTI7CisKK2NvbnN0IGludCBrU2luZ2xlQ29sb3JQZXJQYXRjaCA9IDE7Citjb25zdCBpbnQga1F1YWRDb2xvcnNQZXJQYXRjaCA9IDQ7CisKK1NoYWRpbmdUeXBlIFRvU2hhZGluZ1R5cGUoaW50IHR5cGUpIHsKKyAgcmV0dXJuICh0eXBlID4gc3RhdGljX2Nhc3Q8aW50PihrSW52YWxpZFNoYWRpbmcpICYmCisgICAgICAgICAgdHlwZSA8IHN0YXRpY19jYXN0PGludD4oa01heFNoYWRpbmcpKQorICAgICAgICAgICAgID8gc3RhdGljX2Nhc3Q8U2hhZGluZ1R5cGU+KHR5cGUpCisgICAgICAgICAgICAgOiBrSW52YWxpZFNoYWRpbmc7CiB9Ci1DUERGX1BhdHRlcm46On5DUERGX1BhdHRlcm4oKQoteworCit9ICAvLyBuYW1lc3BhY2UKKworQ1BERl9QYXR0ZXJuOjpDUERGX1BhdHRlcm4oUGF0dGVyblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBQYXJlbnRNYXRyaXgpCisgICAgOiBtX1BhdHRlcm5UeXBlKHR5cGUpLAorICAgICAgbV9wRG9jdW1lbnQocERvYyksCisgICAgICBtX3BQYXR0ZXJuT2JqKHBPYmopLAorICAgICAgbV9iRm9yY2VDbGVhcihGQUxTRSkgeworICBpZiAocFBhcmVudE1hdHJpeCkKKyAgICBtX1BhcmVudE1hdHJpeCA9ICpwUGFyZW50TWF0cml4OwogfQotQ1BERl9UaWxpbmdQYXR0ZXJuOjpDUERGX1RpbGluZ1BhdHRlcm4oQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwYXJlbnRNYXRyaXgpIDoKLSAgICBDUERGX1BhdHRlcm4ocGFyZW50TWF0cml4KQotewotICAgIG1fUGF0dGVyblR5cGUgPSBQQVRURVJOX1RJTElORzsKLSAgICBtX3BQYXR0ZXJuT2JqID0gcFBhdHRlcm5PYmo7Ci0gICAgbV9wRG9jdW1lbnQgPSBwRG9jOworQ1BERl9QYXR0ZXJuOjp+Q1BERl9QYXR0ZXJuKCkge30KK0NQREZfVGlsaW5nUGF0dGVybjo6Q1BERl9UaWxpbmdQYXR0ZXJuKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcFBhdHRlcm5PYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwYXJlbnRNYXRyaXgpCisgICAgOiBDUERGX1BhdHRlcm4oVElMSU5HLCBwRG9jLCBwUGF0dGVybk9iaiwgcGFyZW50TWF0cml4KSB7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BQYXR0ZXJuT2JqLT5HZXREaWN0KCk7CisgIG1fUGF0dGVybjJGb3JtID0gcERpY3QtPkdldE1hdHJpeCgiTWF0cml4Iik7CisgIG1fYkNvbG9yZWQgPSBwRGljdC0+R2V0SW50ZWdlcigiUGFpbnRUeXBlIikgPT0gMTsKKyAgaWYgKHBhcmVudE1hdHJpeCkgeworICAgIG1fUGF0dGVybjJGb3JtLkNvbmNhdCgqcGFyZW50TWF0cml4KTsKKyAgfQorICBtX3BGb3JtID0gTlVMTDsKK30KK0NQREZfVGlsaW5nUGF0dGVybjo6fkNQREZfVGlsaW5nUGF0dGVybigpIHsKKyAgZGVsZXRlIG1fcEZvcm07CisgIG1fcEZvcm0gPSBOVUxMOworfQorRlhfQk9PTCBDUERGX1RpbGluZ1BhdHRlcm46OkxvYWQoKSB7CisgIGlmIChtX3BGb3JtKQorICAgIHJldHVybiBUUlVFOworCisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BQYXR0ZXJuT2JqLT5HZXREaWN0KCk7CisgIGlmICghcERpY3QpCisgICAgcmV0dXJuIEZBTFNFOworCisgIG1fYkNvbG9yZWQgPSBwRGljdC0+R2V0SW50ZWdlcigiUGFpbnRUeXBlIikgPT0gMTsKKyAgbV9YU3RlcCA9IChGWF9GTE9BVClGWFNZU19mYWJzKHBEaWN0LT5HZXROdW1iZXIoIlhTdGVwIikpOworICBtX1lTdGVwID0gKEZYX0ZMT0FUKUZYU1lTX2ZhYnMocERpY3QtPkdldE51bWJlcigiWVN0ZXAiKSk7CisKKyAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBtX3BQYXR0ZXJuT2JqLT5Bc1N0cmVhbSgpOworICBpZiAoIXBTdHJlYW0pCisgICAgcmV0dXJuIEZBTFNFOworCisgIG1fcEZvcm0gPSBuZXcgQ1BERl9Gb3JtKG1fcERvY3VtZW50LCBOVUxMLCBwU3RyZWFtKTsKKyAgbV9wRm9ybS0+UGFyc2VDb250ZW50KE5VTEwsICZtX1BhcmVudE1hdHJpeCwgTlVMTCwgTlVMTCk7CisgIG1fQkJveCA9IHBEaWN0LT5HZXRSZWN0KCJCQm94Iik7CisgIHJldHVybiBUUlVFOworfQorQ1BERl9TaGFkaW5nUGF0dGVybjo6Q1BERl9TaGFkaW5nUGF0dGVybihDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcFBhdHRlcm5PYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoYWRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBhcmVudE1hdHJpeCkKKyAgICA6IENQREZfUGF0dGVybihTSEFESU5HLAorICAgICAgICAgICAgICAgICAgIHBEb2MsCisgICAgICAgICAgICAgICAgICAgYlNoYWRpbmcgPyBudWxscHRyIDogcFBhdHRlcm5PYmosCisgICAgICAgICAgICAgICAgICAgcGFyZW50TWF0cml4KSwKKyAgICAgIG1fU2hhZGluZ1R5cGUoa0ludmFsaWRTaGFkaW5nKSwKKyAgICAgIG1fYlNoYWRpbmdPYmooYlNoYWRpbmcpLAorICAgICAgbV9wU2hhZGluZ09iaihwUGF0dGVybk9iaiksCisgICAgICBtX3BDUyhudWxscHRyKSwKKyAgICAgIG1fcENvdW50ZWRDUyhudWxscHRyKSwKKyAgICAgIG1fbkZ1bmNzKDApIHsKKyAgaWYgKCFiU2hhZGluZykgewogICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BQYXR0ZXJuT2JqLT5HZXREaWN0KCk7Ci0gICAgQVNTRVJUKHBEaWN0ICE9IE5VTEwpOwotICAgIG1fUGF0dGVybjJGb3JtID0gcERpY3QtPkdldE1hdHJpeChGWF9CU1RSQygiTWF0cml4IikpOwotICAgIG1fYkNvbG9yZWQgPSBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiUGFpbnRUeXBlIikpID09IDE7Ci0gICAgaWYgKHBhcmVudE1hdHJpeCkgewotICAgICAgICBtX1BhdHRlcm4yRm9ybS5Db25jYXQoKnBhcmVudE1hdHJpeCk7Ci0gICAgfQotICAgIG1fcEZvcm0gPSBOVUxMOworICAgIG1fUGF0dGVybjJGb3JtID0gcERpY3QtPkdldE1hdHJpeCgiTWF0cml4Iik7CisgICAgbV9wU2hhZGluZ09iaiA9IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoIlNoYWRpbmciKTsKKyAgICBpZiAocGFyZW50TWF0cml4KQorICAgICAgbV9QYXR0ZXJuMkZvcm0uQ29uY2F0KCpwYXJlbnRNYXRyaXgpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKG1fcEZ1bmN0aW9ucyk7ICsraSkKKyAgICBtX3BGdW5jdGlvbnNbaV0gPSBudWxscHRyOwogfQotQ1BERl9UaWxpbmdQYXR0ZXJuOjp+Q1BERl9UaWxpbmdQYXR0ZXJuKCkKLXsKLSAgICBpZiAobV9wRm9ybSkgewotICAgICAgICBkZWxldGUgbV9wRm9ybTsKLSAgICAgICAgbV9wRm9ybSA9IE5VTEw7Ci0gICAgfQorCitDUERGX1NoYWRpbmdQYXR0ZXJuOjp+Q1BERl9TaGFkaW5nUGF0dGVybigpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25GdW5jczsgKytpKQorICAgIGRlbGV0ZSBtX3BGdW5jdGlvbnNbaV07CisKKyAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBtX3BDb3VudGVkQ1MgPyBtX3BDb3VudGVkQ1MtPmdldCgpIDogTlVMTDsKKyAgaWYgKHBDUyAmJiBtX3BEb2N1bWVudCkKKyAgICBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+UmVsZWFzZUNvbG9yU3BhY2UocENTLT5HZXRBcnJheSgpKTsKIH0KLUZYX0JPT0wgQ1BERl9UaWxpbmdQYXR0ZXJuOjpMb2FkKCkKLXsKLSAgICBpZiAobV9wRm9ybSAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wUGF0dGVybk9iai0+R2V0RGljdCgpOwotICAgIGlmIChwRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9iQ29sb3JlZCA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJQYWludFR5cGUiKSkgPT0gMTsKLSAgICBtX1hTdGVwID0gKEZYX0ZMT0FUKUZYU1lTX2ZhYnMocERpY3QtPkdldE51bWJlcihGWF9CU1RSQygiWFN0ZXAiKSkpOwotICAgIG1fWVN0ZXAgPSAoRlhfRkxPQVQpRlhTWVNfZmFicyhwRGljdC0+R2V0TnVtYmVyKEZYX0JTVFJDKCJZU3RlcCIpKSk7Ci0gICAgaWYgKG1fcFBhdHRlcm5PYmotPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSAoQ1BERl9TdHJlYW0qKW1fcFBhdHRlcm5PYmo7Ci0gICAgbV9wRm9ybSA9IG5ldyBDUERGX0Zvcm0obV9wRG9jdW1lbnQsIE5VTEwsIHBTdHJlYW0pOwotICAgIG1fcEZvcm0tPlBhcnNlQ29udGVudChOVUxMLCAmbV9QYXJlbnRNYXRyaXgsIE5VTEwsIE5VTEwpOwotICAgIG1fQkJveCA9IHBEaWN0LT5HZXRSZWN0KEZYX0JTVFJDKCJCQm94IikpOworCitGWF9CT09MIENQREZfU2hhZGluZ1BhdHRlcm46OkxvYWQoKSB7CisgIGlmIChtX1NoYWRpbmdUeXBlICE9IGtJbnZhbGlkU2hhZGluZykKICAgICByZXR1cm4gVFJVRTsKLX0KLUNQREZfU2hhZGluZ1BhdHRlcm46OkNQREZfU2hhZGluZ1BhdHRlcm4oQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqLCBGWF9CT09MIGJTaGFkaW5nLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwYXJlbnRNYXRyaXgpIDogQ1BERl9QYXR0ZXJuKHBhcmVudE1hdHJpeCkKLXsKLSAgICBtX1BhdHRlcm5UeXBlID0gUEFUVEVSTl9TSEFESU5HOwotICAgIG1fcFBhdHRlcm5PYmogPSBiU2hhZGluZyA/IE5VTEwgOiBwUGF0dGVybk9iajsKLSAgICBtX3BEb2N1bWVudCA9IHBEb2M7Ci0gICAgbV9iU2hhZGluZ09iaiA9IGJTaGFkaW5nOwotICAgIGlmICghYlNoYWRpbmcpIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcFBhdHRlcm5PYmotPkdldERpY3QoKTsKLSAgICAgICAgQVNTRVJUKHBEaWN0ICE9IE5VTEwpOwotICAgICAgICBtX1BhdHRlcm4yRm9ybSA9IHBEaWN0LT5HZXRNYXRyaXgoRlhfQlNUUkMoIk1hdHJpeCIpKTsKLSAgICAgICAgbV9wU2hhZGluZ09iaiA9IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIlNoYWRpbmciKSk7Ci0gICAgICAgIGlmIChwYXJlbnRNYXRyaXgpIHsKLSAgICAgICAgICAgIG1fUGF0dGVybjJGb3JtLkNvbmNhdCgqcGFyZW50TWF0cml4KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcFNoYWRpbmdPYmogPSBwUGF0dGVybk9iajsKLSAgICB9Ci0gICAgbV9TaGFkaW5nVHlwZSA9IDA7Ci0gICAgbV9wQ1MgPSBOVUxMOworCisgIENQREZfRGljdGlvbmFyeSogcFNoYWRpbmdEaWN0ID0KKyAgICAgIG1fcFNoYWRpbmdPYmogPyBtX3BTaGFkaW5nT2JqLT5HZXREaWN0KCkgOiBOVUxMOworICBpZiAoIXBTaGFkaW5nRGljdCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAobV9uRnVuY3MpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbkZ1bmNzOyBpKyspCisgICAgICBkZWxldGUgbV9wRnVuY3Rpb25zW2ldOwogICAgIG1fbkZ1bmNzID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkgKyspIHsKLSAgICAgICAgbV9wRnVuY3Rpb25zW2ldID0gTlVMTDsKLSAgICB9Ci0gICAgbV9wQ291bnRlZENTID0gTlVMTDsKLX0KLUNQREZfU2hhZGluZ1BhdHRlcm46On5DUERGX1NoYWRpbmdQYXR0ZXJuKCkKLXsKLSAgICBDbGVhcigpOwotfQotdm9pZCBDUERGX1NoYWRpbmdQYXR0ZXJuOjpDbGVhcigpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25GdW5jczsgaSArKykgewotICAgICAgICBpZiAobV9wRnVuY3Rpb25zW2ldKSB7Ci0gICAgICAgICAgICBkZWxldGUgbV9wRnVuY3Rpb25zW2ldOwotICAgICAgICB9Ci0gICAgICAgIG1fcEZ1bmN0aW9uc1tpXSA9IE5VTEw7Ci0gICAgfQotICAgIENQREZfQ29sb3JTcGFjZSogcENTID0gbV9wQ291bnRlZENTID8gbV9wQ291bnRlZENTLT5tX09iaiA6IE5VTEw7Ci0gICAgaWYgKHBDUyAmJiBtX3BEb2N1bWVudCkgewotICAgICAgICBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+UmVsZWFzZUNvbG9yU3BhY2UocENTLT5HZXRBcnJheSgpKTsKLSAgICB9Ci0gICAgbV9TaGFkaW5nVHlwZSA9IDA7Ci0gICAgbV9wQ1MgPSBOVUxMOwotICAgIG1fcENvdW50ZWRDUyA9IE5VTEw7Ci0gICAgbV9uRnVuY3MgPSAwOwotfQotRlhfQk9PTCBDUERGX1NoYWRpbmdQYXR0ZXJuOjpMb2FkKCkKLXsKLSAgICBpZiAobV9TaGFkaW5nVHlwZSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBTaGFkaW5nRGljdCA9IG1fcFNoYWRpbmdPYmogPyBtX3BTaGFkaW5nT2JqLT5HZXREaWN0KCkgOiBOVUxMOwotICAgIGlmIChwU2hhZGluZ0RpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX25GdW5jcykgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fbkZ1bmNzOyBpICsrKQotICAgICAgICAgICAgaWYgKG1fcEZ1bmN0aW9uc1tpXSkgewotICAgICAgICAgICAgICAgIGRlbGV0ZSBtX3BGdW5jdGlvbnNbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIG1fbkZ1bmNzID0gMDsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBGdW5jID0gcFNoYWRpbmdEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkZ1bmN0aW9uIikpOwotICAgIGlmIChwRnVuYykgewotICAgICAgICBpZiAocEZ1bmMtPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgICAgIG1fbkZ1bmNzID0gKChDUERGX0FycmF5KilwRnVuYyktPkdldENvdW50KCk7Ci0gICAgICAgICAgICBpZiAobV9uRnVuY3MgPiA0KSB7Ci0gICAgICAgICAgICAgICAgbV9uRnVuY3MgPSA0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25GdW5jczsgaSArKykgewotICAgICAgICAgICAgICAgIG1fcEZ1bmN0aW9uc1tpXSA9IENQREZfRnVuY3Rpb246OkxvYWQoKChDUERGX0FycmF5KilwRnVuYyktPkdldEVsZW1lbnRWYWx1ZShpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX3BGdW5jdGlvbnNbMF0gPSBDUERGX0Z1bmN0aW9uOjpMb2FkKHBGdW5jKTsKLSAgICAgICAgICAgIG1fbkZ1bmNzID0gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICBDUERGX09iamVjdCogcENTT2JqID0gcFNoYWRpbmdEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkNvbG9yU3BhY2UiKSk7Ci0gICAgaWYgKHBDU09iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ1BERl9Eb2NQYWdlRGF0YSogcERvY1BhZ2VEYXRhID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCk7Ci0gICAgbV9wQ1MgPSBwRG9jUGFnZURhdGEtPkdldENvbG9yU3BhY2UocENTT2JqLCBOVUxMKTsKLSAgICBpZiAobV9wQ1MpIHsKLSAgICAgICAgbV9wQ291bnRlZENTID0gcERvY1BhZ2VEYXRhLT5GaW5kQ29sb3JTcGFjZVB0cihtX3BDUy0+R2V0QXJyYXkoKSk7Ci0gICAgfQotICAgIG1fU2hhZGluZ1R5cGUgPSBwU2hhZGluZ0RpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIlNoYWRpbmdUeXBlIikpOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX1NoYWRpbmdQYXR0ZXJuOjpSZWxvYWQoKQotewotICAgIENsZWFyKCk7Ci0gICAgcmV0dXJuIExvYWQoKTsKLX0KLUZYX0JPT0wgQ1BERl9NZXNoU3RyZWFtOjpMb2FkKENQREZfU3RyZWFtKiBwU2hhZGluZ1N0cmVhbSwgQ1BERl9GdW5jdGlvbioqIHBGdW5jcywgaW50IG5GdW5jcywgQ1BERl9Db2xvclNwYWNlKiBwQ1MpCi17Ci0gICAgbV9TdHJlYW0uTG9hZEFsbERhdGEocFNoYWRpbmdTdHJlYW0pOwotICAgIG1fQml0U3RyZWFtLkluaXQobV9TdHJlYW0uR2V0RGF0YSgpLCBtX1N0cmVhbS5HZXRTaXplKCkpOwotICAgIG1fcEZ1bmNzID0gcEZ1bmNzOwotICAgIG1fbkZ1bmNzID0gbkZ1bmNzOwotICAgIG1fcENTID0gcENTOwotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwU2hhZGluZ1N0cmVhbS0+R2V0RGljdCgpOwotICAgIG1fbkNvb3JkQml0cyA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJCaXRzUGVyQ29vcmRpbmF0ZSIpKTsKLSAgICBtX25Db21wQml0cyA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJCaXRzUGVyQ29tcG9uZW50IikpOwotICAgIG1fbkZsYWdCaXRzID0gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkJpdHNQZXJGbGFnIikpOwotICAgIGlmICghbV9uQ29vcmRCaXRzIHx8ICFtX25Db21wQml0cykgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGludCBuQ29tcHMgPSBwQ1MtPkNvdW50Q29tcG9uZW50cygpOwotICAgIGlmIChuQ29tcHMgPiA4KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9uQ29tcHMgPSBuRnVuY3MgPyAxIDogbkNvbXBzOwotICAgIGlmICgoKGludCltX25Db21wcyA8IDApIHx8IG1fbkNvbXBzID4gOCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fQ29vcmRNYXggPSBtX25Db29yZEJpdHMgPT0gMzIgPyAtMSA6ICgxIDw8IG1fbkNvb3JkQml0cykgLSAxOwotICAgIG1fQ29tcE1heCA9ICgxIDw8IG1fbkNvbXBCaXRzKSAtIDE7Ci0gICAgQ1BERl9BcnJheSogcERlY29kZSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRGVjb2RlIikpOwotICAgIGlmIChwRGVjb2RlID09IE5VTEwgfHwgcERlY29kZS0+R2V0Q291bnQoKSAhPSA0ICsgbV9uQ29tcHMgKiAyKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV94bWluID0gcERlY29kZS0+R2V0TnVtYmVyKDApOwotICAgIG1feG1heCA9IHBEZWNvZGUtPkdldE51bWJlcigxKTsKLSAgICBtX3ltaW4gPSBwRGVjb2RlLT5HZXROdW1iZXIoMik7Ci0gICAgbV95bWF4ID0gcERlY29kZS0+R2V0TnVtYmVyKDMpOwotICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBtX25Db21wczsgaSArKykgewotICAgICAgICBtX0NvbG9yTWluW2ldID0gcERlY29kZS0+R2V0TnVtYmVyKGkgKiAyICsgNCk7Ci0gICAgICAgIG1fQ29sb3JNYXhbaV0gPSBwRGVjb2RlLT5HZXROdW1iZXIoaSAqIDIgKyA1KTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9EV09SRCBDUERGX01lc2hTdHJlYW06OkdldEZsYWcoKQotewotICAgIHJldHVybiBtX0JpdFN0cmVhbS5HZXRCaXRzKG1fbkZsYWdCaXRzKSAmIDB4MDM7Ci19Ci12b2lkIENQREZfTWVzaFN0cmVhbTo6R2V0Q29vcmRzKEZYX0ZMT0FUJiB4LCBGWF9GTE9BVCYgeSkKLXsKLSAgICBpZiAobV9uQ29vcmRCaXRzID09IDMyKSB7Ci0gICAgICAgIHggPSBtX3htaW4gKyAoRlhfRkxPQVQpKG1fQml0U3RyZWFtLkdldEJpdHMobV9uQ29vcmRCaXRzKSAqIChtX3htYXggLSBtX3htaW4pIC8gKGRvdWJsZSltX0Nvb3JkTWF4KTsKLSAgICAgICAgeSA9IG1feW1pbiArIChGWF9GTE9BVCkobV9CaXRTdHJlYW0uR2V0Qml0cyhtX25Db29yZEJpdHMpICogKG1feW1heCAtIG1feW1pbikgLyAoZG91YmxlKW1fQ29vcmRNYXgpOworICB9CisgIENQREZfT2JqZWN0KiBwRnVuYyA9IHBTaGFkaW5nRGljdC0+R2V0RWxlbWVudFZhbHVlKCJGdW5jdGlvbiIpOworICBpZiAocEZ1bmMpIHsKKyAgICBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcEZ1bmMtPkFzQXJyYXkoKSkgeworICAgICAgbV9uRnVuY3MgPSBzdGQ6Om1pbjxpbnQ+KHBBcnJheS0+R2V0Q291bnQoKSwgNCk7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uRnVuY3M7IGkrKykgeworICAgICAgICBtX3BGdW5jdGlvbnNbaV0gPSBDUERGX0Z1bmN0aW9uOjpMb2FkKHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKGkpKTsKKyAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICB4ID0gbV94bWluICsgbV9CaXRTdHJlYW0uR2V0Qml0cyhtX25Db29yZEJpdHMpICogKG1feG1heCAtIG1feG1pbikgLyBtX0Nvb3JkTWF4OwotICAgICAgICB5ID0gbV95bWluICsgbV9CaXRTdHJlYW0uR2V0Qml0cyhtX25Db29yZEJpdHMpICogKG1feW1heCAtIG1feW1pbikgLyBtX0Nvb3JkTWF4OworICAgICAgbV9wRnVuY3Rpb25zWzBdID0gQ1BERl9GdW5jdGlvbjo6TG9hZChwRnVuYyk7CisgICAgICBtX25GdW5jcyA9IDE7CiAgICAgfQorICB9CisgIENQREZfT2JqZWN0KiBwQ1NPYmogPSBwU2hhZGluZ0RpY3QtPkdldEVsZW1lbnRWYWx1ZSgiQ29sb3JTcGFjZSIpOworICBpZiAoIXBDU09iaikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDUERGX0RvY1BhZ2VEYXRhKiBwRG9jUGFnZURhdGEgPSBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKTsKKyAgbV9wQ1MgPSBwRG9jUGFnZURhdGEtPkdldENvbG9yU3BhY2UocENTT2JqLCBOVUxMKTsKKyAgaWYgKG1fcENTKSB7CisgICAgbV9wQ291bnRlZENTID0gcERvY1BhZ2VEYXRhLT5GaW5kQ29sb3JTcGFjZVB0cihtX3BDUy0+R2V0QXJyYXkoKSk7CisgIH0KKworICBtX1NoYWRpbmdUeXBlID0gVG9TaGFkaW5nVHlwZShwU2hhZGluZ0RpY3QtPkdldEludGVnZXIoIlNoYWRpbmdUeXBlIikpOworCisgIC8vIFdlIGV4cGVjdCB0byBoYXZlIGEgc3RyZWFtIGlmIG91ciBzaGFkaW5nIHR5cGUgaXMgYSBtZXNoLgorICBpZiAoSXNNZXNoU2hhZGluZygpICYmICFUb1N0cmVhbShtX3BTaGFkaW5nT2JqKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIFRSVUU7CiB9Ci12b2lkIENQREZfTWVzaFN0cmVhbTo6R2V0Q29sb3IoRlhfRkxPQVQmIHIsIEZYX0ZMT0FUJiBnLCBGWF9GTE9BVCYgYikKLXsKLSAgICBGWF9EV09SRCBpOwotICAgIEZYX0ZMT0FUIGNvbG9yX3ZhbHVlWzhdOwotICAgIGZvciAoaSA9IDA7IGkgPCBtX25Db21wczsgaSArKykgewotICAgICAgICBjb2xvcl92YWx1ZVtpXSA9IG1fQ29sb3JNaW5baV0gKyBtX0JpdFN0cmVhbS5HZXRCaXRzKG1fbkNvbXBCaXRzKSAqIChtX0NvbG9yTWF4W2ldIC0gbV9Db2xvck1pbltpXSkgLyBtX0NvbXBNYXg7Ci0gICAgfQotICAgIGlmIChtX25GdW5jcykgewotICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtNYXhSZXN1bHRzID0gODsKLSAgICAgICAgRlhfRkxPQVQgcmVzdWx0W2tNYXhSZXN1bHRzXTsKLSAgICAgICAgaW50IG5SZXN1bHRzOwotICAgICAgICBGWFNZU19tZW1zZXQzMihyZXN1bHQsIDAsIHNpemVvZihyZXN1bHQpKTsKLSAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG1fbkZ1bmNzOyBpICsrKSB7Ci0gICAgICAgICAgICBpZiAobV9wRnVuY3NbaV0gJiYgbV9wRnVuY3NbaV0tPkNvdW50T3V0cHV0cygpIDw9IGtNYXhSZXN1bHRzKSB7Ci0gICAgICAgICAgICAgICAgbV9wRnVuY3NbaV0tPkNhbGwoY29sb3JfdmFsdWUsIDEsIHJlc3VsdCwgblJlc3VsdHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1fcENTLT5HZXRSR0IocmVzdWx0LCByLCBnLCBiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX3BDUy0+R2V0UkdCKGNvbG9yX3ZhbHVlLCByLCBnLCBiKTsKLSAgICB9CitGWF9CT09MIENQREZfTWVzaFN0cmVhbTo6TG9hZChDUERGX1N0cmVhbSogcFNoYWRpbmdTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Z1bmN0aW9uKiogcEZ1bmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5GdW5jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQ29sb3JTcGFjZSogcENTKSB7CisgIG1fU3RyZWFtLkxvYWRBbGxEYXRhKHBTaGFkaW5nU3RyZWFtKTsKKyAgbV9CaXRTdHJlYW0uSW5pdChtX1N0cmVhbS5HZXREYXRhKCksIG1fU3RyZWFtLkdldFNpemUoKSk7CisgIG1fcEZ1bmNzID0gcEZ1bmNzOworICBtX25GdW5jcyA9IG5GdW5jczsKKyAgbV9wQ1MgPSBwQ1M7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwU2hhZGluZ1N0cmVhbS0+R2V0RGljdCgpOworICBtX25Db29yZEJpdHMgPSBwRGljdC0+R2V0SW50ZWdlcigiQml0c1BlckNvb3JkaW5hdGUiKTsKKyAgbV9uQ29tcEJpdHMgPSBwRGljdC0+R2V0SW50ZWdlcigiQml0c1BlckNvbXBvbmVudCIpOworICBtX25GbGFnQml0cyA9IHBEaWN0LT5HZXRJbnRlZ2VyKCJCaXRzUGVyRmxhZyIpOworICBpZiAoIW1fbkNvb3JkQml0cyB8fCAhbV9uQ29tcEJpdHMpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW50IG5Db21wcyA9IHBDUy0+Q291bnRDb21wb25lbnRzKCk7CisgIGlmIChuQ29tcHMgPiA4KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fbkNvbXBzID0gbkZ1bmNzID8gMSA6IG5Db21wczsKKyAgaWYgKCgoaW50KW1fbkNvbXBzIDwgMCkgfHwgbV9uQ29tcHMgPiA4KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fQ29vcmRNYXggPSBtX25Db29yZEJpdHMgPT0gMzIgPyAtMSA6ICgxIDw8IG1fbkNvb3JkQml0cykgLSAxOworICBtX0NvbXBNYXggPSAoMSA8PCBtX25Db21wQml0cykgLSAxOworICBDUERGX0FycmF5KiBwRGVjb2RlID0gcERpY3QtPkdldEFycmF5KCJEZWNvZGUiKTsKKyAgaWYgKCFwRGVjb2RlIHx8IHBEZWNvZGUtPkdldENvdW50KCkgIT0gNCArIG1fbkNvbXBzICogMikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX3htaW4gPSBwRGVjb2RlLT5HZXROdW1iZXIoMCk7CisgIG1feG1heCA9IHBEZWNvZGUtPkdldE51bWJlcigxKTsKKyAgbV95bWluID0gcERlY29kZS0+R2V0TnVtYmVyKDIpOworICBtX3ltYXggPSBwRGVjb2RlLT5HZXROdW1iZXIoMyk7CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBtX25Db21wczsgaSsrKSB7CisgICAgbV9Db2xvck1pbltpXSA9IHBEZWNvZGUtPkdldE51bWJlcihpICogMiArIDQpOworICAgIG1fQ29sb3JNYXhbaV0gPSBwRGVjb2RlLT5HZXROdW1iZXIoaSAqIDIgKyA1KTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLUZYX0RXT1JEIENQREZfTWVzaFN0cmVhbTo6R2V0VmVydGV4KENQREZfTWVzaFZlcnRleCYgdmVydGV4LCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkJpdG1hcCkKLXsKLSAgICBGWF9EV09SRCBmbGFnID0gR2V0RmxhZygpOwotICAgIEdldENvb3Jkcyh2ZXJ0ZXgueCwgdmVydGV4LnkpOwotICAgIHBPYmplY3QyQml0bWFwLT5UcmFuc2Zvcm0odmVydGV4LngsIHZlcnRleC55KTsKLSAgICBHZXRDb2xvcih2ZXJ0ZXguciwgdmVydGV4LmcsIHZlcnRleC5iKTsKK0ZYX0RXT1JEIENQREZfTWVzaFN0cmVhbTo6R2V0RmxhZygpIHsKKyAgcmV0dXJuIG1fQml0U3RyZWFtLkdldEJpdHMobV9uRmxhZ0JpdHMpICYgMHgwMzsKK30KK3ZvaWQgQ1BERl9NZXNoU3RyZWFtOjpHZXRDb29yZHMoRlhfRkxPQVQmIHgsIEZYX0ZMT0FUJiB5KSB7CisgIGlmIChtX25Db29yZEJpdHMgPT0gMzIpIHsKKyAgICB4ID0gbV94bWluICsgKEZYX0ZMT0FUKShtX0JpdFN0cmVhbS5HZXRCaXRzKG1fbkNvb3JkQml0cykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX3htYXggLSBtX3htaW4pIC8gKGRvdWJsZSltX0Nvb3JkTWF4KTsKKyAgICB5ID0gbV95bWluICsgKEZYX0ZMT0FUKShtX0JpdFN0cmVhbS5HZXRCaXRzKG1fbkNvb3JkQml0cykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX3ltYXggLSBtX3ltaW4pIC8gKGRvdWJsZSltX0Nvb3JkTWF4KTsKKyAgfSBlbHNlIHsKKyAgICB4ID0gbV94bWluICsKKyAgICAgICAgbV9CaXRTdHJlYW0uR2V0Qml0cyhtX25Db29yZEJpdHMpICogKG1feG1heCAtIG1feG1pbikgLyBtX0Nvb3JkTWF4OworICAgIHkgPSBtX3ltaW4gKworICAgICAgICBtX0JpdFN0cmVhbS5HZXRCaXRzKG1fbkNvb3JkQml0cykgKiAobV95bWF4IC0gbV95bWluKSAvIG1fQ29vcmRNYXg7CisgIH0KK30KK3ZvaWQgQ1BERl9NZXNoU3RyZWFtOjpHZXRDb2xvcihGWF9GTE9BVCYgciwgRlhfRkxPQVQmIGcsIEZYX0ZMT0FUJiBiKSB7CisgIEZYX0RXT1JEIGk7CisgIEZYX0ZMT0FUIGNvbG9yX3ZhbHVlWzhdOworICBmb3IgKGkgPSAwOyBpIDwgbV9uQ29tcHM7IGkrKykgeworICAgIGNvbG9yX3ZhbHVlW2ldID0gbV9Db2xvck1pbltpXSArCisgICAgICAgICAgICAgICAgICAgICBtX0JpdFN0cmVhbS5HZXRCaXRzKG1fbkNvbXBCaXRzKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgKG1fQ29sb3JNYXhbaV0gLSBtX0NvbG9yTWluW2ldKSAvIG1fQ29tcE1heDsKKyAgfQorICBpZiAobV9uRnVuY3MpIHsKKyAgICBzdGF0aWMgY29uc3QgaW50IGtNYXhSZXN1bHRzID0gODsKKyAgICBGWF9GTE9BVCByZXN1bHRba01heFJlc3VsdHNdOworICAgIGludCBuUmVzdWx0czsKKyAgICBGWFNZU19tZW1zZXQocmVzdWx0LCAwLCBzaXplb2YocmVzdWx0KSk7CisgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG1fbkZ1bmNzOyBpKyspIHsKKyAgICAgIGlmIChtX3BGdW5jc1tpXSAmJiBtX3BGdW5jc1tpXS0+Q291bnRPdXRwdXRzKCkgPD0ga01heFJlc3VsdHMpIHsKKyAgICAgICAgbV9wRnVuY3NbaV0tPkNhbGwoY29sb3JfdmFsdWUsIDEsIHJlc3VsdCwgblJlc3VsdHMpOworICAgICAgfQorICAgIH0KKyAgICBtX3BDUy0+R2V0UkdCKHJlc3VsdCwgciwgZywgYik7CisgIH0gZWxzZSB7CisgICAgbV9wQ1MtPkdldFJHQihjb2xvcl92YWx1ZSwgciwgZywgYik7CisgIH0KK30KK0ZYX0RXT1JEIENQREZfTWVzaFN0cmVhbTo6R2V0VmVydGV4KENQREZfTWVzaFZlcnRleCYgdmVydGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE9iamVjdDJCaXRtYXApIHsKKyAgRlhfRFdPUkQgZmxhZyA9IEdldEZsYWcoKTsKKyAgR2V0Q29vcmRzKHZlcnRleC54LCB2ZXJ0ZXgueSk7CisgIHBPYmplY3QyQml0bWFwLT5UcmFuc2Zvcm0odmVydGV4LngsIHZlcnRleC55KTsKKyAgR2V0Q29sb3IodmVydGV4LnIsIHZlcnRleC5nLCB2ZXJ0ZXguYik7CisgIG1fQml0U3RyZWFtLkJ5dGVBbGlnbigpOworICByZXR1cm4gZmxhZzsKK30KK0ZYX0JPT0wgQ1BERl9NZXNoU3RyZWFtOjpHZXRWZXJ0ZXhSb3coQ1BERl9NZXNoVmVydGV4KiB2ZXJ0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE9iamVjdDJCaXRtYXApIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgaWYgKG1fQml0U3RyZWFtLklzRU9GKCkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgR2V0Q29vcmRzKHZlcnRleFtpXS54LCB2ZXJ0ZXhbaV0ueSk7CisgICAgcE9iamVjdDJCaXRtYXAtPlRyYW5zZm9ybSh2ZXJ0ZXhbaV0ueCwgdmVydGV4W2ldLnkpOworICAgIEdldENvbG9yKHZlcnRleFtpXS5yLCB2ZXJ0ZXhbaV0uZywgdmVydGV4W2ldLmIpOwogICAgIG1fQml0U3RyZWFtLkJ5dGVBbGlnbigpOwotICAgIHJldHVybiBmbGFnOworICB9CisgIHJldHVybiBUUlVFOwogfQotRlhfQk9PTCBDUERGX01lc2hTdHJlYW06OkdldFZlcnRleFJvdyhDUERGX01lc2hWZXJ0ZXgqIHZlcnRleCwgaW50IGNvdW50LCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkJpdG1hcCkKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpICsrKSB7Ci0gICAgICAgIGlmIChtX0JpdFN0cmVhbS5Jc0VPRigpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgR2V0Q29vcmRzKHZlcnRleFtpXS54LCB2ZXJ0ZXhbaV0ueSk7Ci0gICAgICAgIHBPYmplY3QyQml0bWFwLT5UcmFuc2Zvcm0odmVydGV4W2ldLngsIHZlcnRleFtpXS55KTsKLSAgICAgICAgR2V0Q29sb3IodmVydGV4W2ldLnIsIHZlcnRleFtpXS5nLCB2ZXJ0ZXhbaV0uYik7Ci0gICAgICAgIG1fQml0U3RyZWFtLkJ5dGVBbGlnbigpOworCitDRlhfRmxvYXRSZWN0IEdldFNoYWRpbmdCQm94KENQREZfU3RyZWFtKiBwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGFkaW5nVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Z1bmN0aW9uKiogcEZ1bmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZ1bmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0NvbG9yU3BhY2UqIHBDUykgeworICBpZiAoIXBTdHJlYW0gfHwgIXBTdHJlYW0tPklzU3RyZWFtKCkgfHwgIXBGdW5jcyB8fCAhcENTKQorICAgIHJldHVybiBDRlhfRmxvYXRSZWN0KDAsIDAsIDAsIDApOworCisgIENQREZfTWVzaFN0cmVhbSBzdHJlYW07CisgIGlmICghc3RyZWFtLkxvYWQocFN0cmVhbSwgcEZ1bmNzLCBuRnVuY3MsIHBDUykpCisgICAgcmV0dXJuIENGWF9GbG9hdFJlY3QoMCwgMCwgMCwgMCk7CisKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0OworICBGWF9CT09MIGJTdGFydGVkID0gRkFMU0U7CisgIEZYX0JPT0wgYkdvdXJhdWQgPSB0eXBlID09IGtGcmVlRm9ybUdvdXJhdWRUcmlhbmdsZU1lc2hTaGFkaW5nIHx8CisgICAgICAgICAgICAgICAgICAgICB0eXBlID09IGtMYXR0aWNlRm9ybUdvdXJhdWRUcmlhbmdsZU1lc2hTaGFkaW5nOworCisgIGludCBwb2ludF9jb3VudCA9IGtTaW5nbGVDb29yZGluYXRlUGFpcjsKKyAgaWYgKHR5cGUgPT0ga1RlbnNvclByb2R1Y3RQYXRjaE1lc2hTaGFkaW5nKQorICAgIHBvaW50X2NvdW50ID0ga1RlbnNvckNvb3JkaW5hdGVQYWlyczsKKyAgZWxzZSBpZiAodHlwZSA9PSBrQ29vbnNQYXRjaE1lc2hTaGFkaW5nKQorICAgIHBvaW50X2NvdW50ID0ga0Nvb25zQ29vcmRpbmF0ZVBhaXJzOworCisgIGludCBjb2xvcl9jb3VudCA9IGtTaW5nbGVDb2xvclBlclBhdGNoOworICBpZiAodHlwZSA9PSBrQ29vbnNQYXRjaE1lc2hTaGFkaW5nIHx8IHR5cGUgPT0ga1RlbnNvclByb2R1Y3RQYXRjaE1lc2hTaGFkaW5nKQorICAgIGNvbG9yX2NvdW50ID0ga1F1YWRDb2xvcnNQZXJQYXRjaDsKKworICB3aGlsZSAoIXN0cmVhbS5tX0JpdFN0cmVhbS5Jc0VPRigpKSB7CisgICAgRlhfRFdPUkQgZmxhZyA9IDA7CisgICAgaWYgKHR5cGUgIT0ga0xhdHRpY2VGb3JtR291cmF1ZFRyaWFuZ2xlTWVzaFNoYWRpbmcpCisgICAgICBmbGFnID0gc3RyZWFtLkdldEZsYWcoKTsKKworICAgIGlmICghYkdvdXJhdWQgJiYgZmxhZykgeworICAgICAgcG9pbnRfY291bnQgLT0gNDsKKyAgICAgIGNvbG9yX2NvdW50IC09IDI7CiAgICAgfQotICAgIHJldHVybiBUUlVFOwotfQotQ0ZYX0Zsb2F0UmVjdCBfR2V0U2hhZGluZ0JCb3goQ1BERl9TdHJlYW0qIHBTdHJlYW0sIGludCB0eXBlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9GdW5jdGlvbioqIHBGdW5jcywgaW50IG5GdW5jcywgQ1BERl9Db2xvclNwYWNlKiBwQ1MpCi17Ci0gICAgaWYgKHBTdHJlYW0gPT0gTlVMTCB8fCBwU3RyZWFtLT5HZXRUeXBlKCkgIT0gUERGT0JKX1NUUkVBTSB8fCBwRnVuY3MgPT0gTlVMTCB8fCBwQ1MgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQ0ZYX0Zsb2F0UmVjdCgwLCAwLCAwLCAwKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9pbnRfY291bnQ7IGkrKykgeworICAgICAgRlhfRkxPQVQgeCwgeTsKKyAgICAgIHN0cmVhbS5HZXRDb29yZHMoeCwgeSk7CisgICAgICBpZiAoYlN0YXJ0ZWQpIHsKKyAgICAgICAgcmVjdC5VcGRhdGVSZWN0KHgsIHkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVjdC5Jbml0UmVjdCh4LCB5KTsKKyAgICAgICAgYlN0YXJ0ZWQgPSBUUlVFOworICAgICAgfQogICAgIH0KLSAgICBDUERGX01lc2hTdHJlYW0gc3RyZWFtOwotICAgIGlmICghc3RyZWFtLkxvYWQocFN0cmVhbSwgcEZ1bmNzLCBuRnVuY3MsIHBDUykpIHsKLSAgICAgICAgcmV0dXJuIENGWF9GbG9hdFJlY3QoMCwgMCwgMCwgMCk7Ci0gICAgfQotICAgIENGWF9GbG9hdFJlY3QgcmVjdDsKLSAgICBGWF9CT09MIGJTdGFydGVkID0gRkFMU0U7Ci0gICAgRlhfQk9PTCBiR291cmF1ZCA9IHR5cGUgPT0gNCB8fCB0eXBlID09IDU7Ci0gICAgaW50IGZ1bGxfcG9pbnRfY291bnQgPSB0eXBlID09IDcgPyAxNiA6ICh0eXBlID09IDYgPyAxMiA6IDEpOwotICAgIGludCBmdWxsX2NvbG9yX2NvdW50ID0gKHR5cGUgPT0gNiB8fCB0eXBlID09IDcpID8gNCA6IDE7Ci0gICAgd2hpbGUgKCFzdHJlYW0ubV9CaXRTdHJlYW0uSXNFT0YoKSkgewotICAgICAgICBGWF9EV09SRCBmbGFnID0gMDsKLSAgICAgICAgaWYgKHR5cGUgIT0gNSkgewotICAgICAgICAgICAgZmxhZyA9IHN0cmVhbS5HZXRGbGFnKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHBvaW50X2NvdW50ID0gZnVsbF9wb2ludF9jb3VudCwgY29sb3JfY291bnQgPSBmdWxsX2NvbG9yX2NvdW50OwotICAgICAgICBpZiAoIWJHb3VyYXVkICYmIGZsYWcpIHsKLSAgICAgICAgICAgIHBvaW50X2NvdW50IC09IDQ7Ci0gICAgICAgICAgICBjb2xvcl9jb3VudCAtPSAyOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9pbnRfY291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIEZYX0ZMT0FUIHgsIHk7Ci0gICAgICAgICAgICBzdHJlYW0uR2V0Q29vcmRzKHgsIHkpOwotICAgICAgICAgICAgaWYgKGJTdGFydGVkKSB7Ci0gICAgICAgICAgICAgICAgcmVjdC5VcGRhdGVSZWN0KHgsIHkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZWN0LkluaXRSZWN0KHgsIHkpOwotICAgICAgICAgICAgICAgIGJTdGFydGVkID0gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzdHJlYW0ubV9CaXRTdHJlYW0uU2tpcEJpdHMoc3RyZWFtLm1fbkNvbXBzICogc3RyZWFtLm1fbkNvbXBCaXRzICogY29sb3JfY291bnQpOwotICAgICAgICBpZiAoYkdvdXJhdWQpIHsKLSAgICAgICAgICAgIHN0cmVhbS5tX0JpdFN0cmVhbS5CeXRlQWxpZ24oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZWN0LlRyYW5zZm9ybShwTWF0cml4KTsKLSAgICByZXR1cm4gcmVjdDsKKyAgICBzdHJlYW0ubV9CaXRTdHJlYW0uU2tpcEJpdHMoc3RyZWFtLm1fbkNvbXBzICogc3RyZWFtLm1fbkNvbXBCaXRzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfY291bnQpOworICAgIGlmIChiR291cmF1ZCkKKyAgICAgIHN0cmVhbS5tX0JpdFN0cmVhbS5CeXRlQWxpZ24oKTsKKyAgfQorICByZWN0LlRyYW5zZm9ybShwTWF0cml4KTsKKyAgcmV0dXJuIHJlY3Q7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9wYWdlaW50LmggYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9wYWdlaW50LmgKaW5kZXggOGIzYzUxNy4uODYzY2FjOCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvcGFnZWludC5oCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL3BhZ2VpbnQuaApAQCAtMSw0NjkgKzEsNDYwIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgQ09SRV9TUkNfRlBERkFQSV9GUERGX1BBR0VfUEFHRUlOVF9IXwogI2RlZmluZSBDT1JFX1NSQ19GUERGQVBJX0ZQREZfUEFHRV9QQUdFSU5UX0hfCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlb2JqLmgiCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKLSNkZWZpbmUgUEFSU0VfU1RFUF9MSU1JVAkJMTAwCi0jZGVmaW5lIFNUUkVBTV9QQVJTRV9CVUZTSVpFCTIwNDgwCi1jbGFzcyBDUERGX1F1aWNrRm9udENhY2hlOwotY2xhc3MgQ1BERl9TdHJlYW1QYXJzZXIgCi17Ci1wdWJsaWM6CisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlb2JqLmgiCiAKLSAgICBDUERGX1N0cmVhbVBhcnNlcihjb25zdCBGWF9CWVRFKiBwRGF0YSwgRlhfRFdPUkQgZHdTaXplKTsKLSAgICB+Q1BERl9TdHJlYW1QYXJzZXIoKTsKK2NsYXNzIENQREZfQWxsU3RhdGVzOworY2xhc3MgQ1BERl9QYXJzZU9wdGlvbnM7CiAKLSAgICBDUERGX1N0cmVhbSoJCVJlYWRJbmxpbmVTdHJlYW0oQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgQ1BERl9PYmplY3QqIHBDU09iaiwgRlhfQk9PTCBiRGVjb2RlKTsKLSAgICB0eXBlZGVmIGVudW0geyBFbmRPZkRhdGEsIE51bWJlciwgS2V5d29yZCwgTmFtZSwgT3RoZXJzIH0gU3ludGF4VHlwZTsKKyNkZWZpbmUgUEFSU0VfU1RFUF9MSU1JVCAxMDAKIAotICAgIFN5bnRheFR5cGUJCQlQYXJzZU5leHRFbGVtZW50KCk7Ci0gICAgRlhfTFBCWVRFCQkJR2V0V29yZEJ1ZigpCi0gICAgewotICAgICAgICByZXR1cm4gbV9Xb3JkQnVmZmVyOwotICAgIH0KLSAgICBGWF9EV09SRAkJCUdldFdvcmRTaXplKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1dvcmRTaXplOwotICAgIH0KLSAgICBDUERGX09iamVjdCoJCUdldE9iamVjdCgpCi0gICAgewotICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IG1fcExhc3RPYmo7Ci0gICAgICAgIG1fcExhc3RPYmogPSBOVUxMOwotICAgICAgICByZXR1cm4gcE9iajsKLSAgICB9Ci0gICAgRlhfRFdPUkQJCQlHZXRQb3MoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fUG9zOwotICAgIH0KLSAgICB2b2lkCQkJCVNldFBvcyhGWF9EV09SRCBwb3MpCi0gICAgewotICAgICAgICBtX1BvcyA9IHBvczsKLSAgICB9CitjbGFzcyBDUERGX1N0cmVhbVBhcnNlciB7CisgcHVibGljOgorICBlbnVtIFN5bnRheFR5cGUgeyBFbmRPZkRhdGEsIE51bWJlciwgS2V5d29yZCwgTmFtZSwgT3RoZXJzIH07CiAKLSAgICBDUERGX09iamVjdCoJCVJlYWROZXh0T2JqZWN0KEZYX0JPT0wgYkFsbG93TmVzdGVkQXJyYXkgPSBGQUxTRSwgRlhfQk9PTCBiSW5BcnJheSA9IEZBTFNFKTsKLSAgICB2b2lkCQkJCVNraXBQYXRoT2JqZWN0KCk7Ci1wcm90ZWN0ZWQ6Ci0gICAgdm9pZAkJCQlHZXROZXh0V29yZChGWF9CT09MJiBiSXNOdW1iZXIpOwotICAgIENGWF9CeXRlU3RyaW5nCQlSZWFkU3RyaW5nKCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcJCVJlYWRIZXhTdHJpbmcoKTsKLSAgICBjb25zdCBGWF9CWVRFKgkJbV9wQnVmOwotICAgIEZYX0RXT1JECQkJbV9TaXplOwotICAgIEZYX0RXT1JECQkJbV9Qb3M7Ci0gICAgRlhfQllURQkJCQltX1dvcmRCdWZmZXJbMjU2XTsKLSAgICBGWF9EV09SRAkJCW1fV29yZFNpemU7Ci0gICAgQ1BERl9PYmplY3QqCQltX3BMYXN0T2JqOworICBDUERGX1N0cmVhbVBhcnNlcihjb25zdCB1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgZHdTaXplKTsKKyAgfkNQREZfU3RyZWFtUGFyc2VyKCk7CisKKyAgQ1BERl9TdHJlYW0qIFJlYWRJbmxpbmVTdHJlYW0oQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBDU09iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRGVjb2RlKTsKKyAgU3ludGF4VHlwZSBQYXJzZU5leHRFbGVtZW50KCk7CisgIHVpbnQ4X3QqIEdldFdvcmRCdWYoKSB7IHJldHVybiBtX1dvcmRCdWZmZXI7IH0KKyAgRlhfRFdPUkQgR2V0V29yZFNpemUoKSBjb25zdCB7IHJldHVybiBtX1dvcmRTaXplOyB9CisgIENQREZfT2JqZWN0KiBHZXRPYmplY3QoKSB7CisgICAgQ1BERl9PYmplY3QqIHBPYmogPSBtX3BMYXN0T2JqOworICAgIG1fcExhc3RPYmogPSBOVUxMOworICAgIHJldHVybiBwT2JqOworICB9CisgIEZYX0RXT1JEIEdldFBvcygpIGNvbnN0IHsgcmV0dXJuIG1fUG9zOyB9CisgIHZvaWQgU2V0UG9zKEZYX0RXT1JEIHBvcykgeyBtX1BvcyA9IHBvczsgfQorICBDUERGX09iamVjdCogUmVhZE5leHRPYmplY3QoRlhfQk9PTCBiQWxsb3dOZXN0ZWRBcnJheSA9IEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW5BcnJheSA9IEZBTFNFKTsKKyAgdm9pZCBTa2lwUGF0aE9iamVjdCgpOworCisgcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgZnBkZl9wYWdlX3BhcnNlcl9vbGRfUmVhZEhleFN0cmluZ19UZXN0OworCisgIHZvaWQgR2V0TmV4dFdvcmQoRlhfQk9PTCYgYklzTnVtYmVyKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgUmVhZFN0cmluZygpOworICBDRlhfQnl0ZVN0cmluZyBSZWFkSGV4U3RyaW5nKCk7CisgIGNvbnN0IHVpbnQ4X3QqIG1fcEJ1ZjsKKworICAvLyBMZW5ndGggaW4gYnl0ZXMgb2YgbV9wQnVmLgorICBGWF9EV09SRCBtX1NpemU7CisKKyAgLy8gQ3VycmVudCBieXRlIHBvc2l0aW9uIHdpdGhpbiBtX3BCdWYuCisgIEZYX0RXT1JEIG1fUG9zOworCisgIHVpbnQ4X3QgbV9Xb3JkQnVmZmVyWzI1Nl07CisgIEZYX0RXT1JEIG1fV29yZFNpemU7CisgIENQREZfT2JqZWN0KiBtX3BMYXN0T2JqOworCisgcHJpdmF0ZToKKyAgYm9vbCBQb3NpdGlvbklzSW5Cb3VuZHMoKSBjb25zdDsKIH07Ci10eXBlZGVmIGVudW0gewotICAgIFBERk9QX0Nsb3NlRmlsbFN0cm9rZVBhdGggPSAwLCBQREZPUF9GaWxsU3Ryb2tlUGF0aCwKLSAgICBQREZPUF9DbG9zZUVPRmlsbFN0cm9rZVBhdGgsIFBERk9QX0VPRmlsbFN0cm9rZVBhdGgsCi0gICAgUERGT1BfQmVnaW5NYXJrZWRDb250ZW50X0RpY3Rpb25hcnksIFBERk9QX0JlZ2luSW1hZ2UsCi0gICAgUERGT1BfQmVnaW5NYXJrZWRDb250ZW50LCBQREZPUF9CZWdpblRleHQsCi0gICAgUERGT1BfQmVnaW5TZWN0aW9uVW5kZWZpbmVkLCBQREZPUF9DdXJ2ZVRvXzEyMywKLSAgICBQREZPUF9Db25jYXRNYXRyaXgsIFBERk9QX1NldENvbG9yU3BhY2VfRmlsbCwKLSAgICBQREZPUF9TZXRDb2xvclNwYWNlX1N0cm9rZSwgUERGT1BfU2V0RGFzaCwKLSAgICBQREZPUF9TZXRDaGFyV2lkdGgsIFBERk9QX1NldENhY2hlZERldmljZSwKLSAgICBQREZPUF9FeGVjdXRlWE9iamVjdCwgUERGT1BfTWFya1BsYWNlX0RpY3Rpb25hcnksCi0gICAgUERGT1BfRW5kSW1hZ2UsIFBERk9QX0VuZE1hcmtlZENvbnRlbnQsCi0gICAgUERGT1BfRW5kVGV4dCwgUERGT1BfRW5kU2VjdGlvblVuZGVmaW5lZCwKLSAgICBQREZPUF9GaWxsUGF0aCwgUERGT1BfRmlsbFBhdGhPbGQsCi0gICAgUERGT1BfRU9GaWxsUGF0aCwgUERGT1BfU2V0R3JheV9GaWxsLAotICAgIFBERk9QX1NldEdyYXlfU3Ryb2tlLCBQREZPUF9TZXRFeHRlbmRHcmFwaFN0YXRlLAotICAgIFBERk9QX0Nsb3NlUGF0aCwgUERGT1BfU2V0RmxhdCwKLSAgICBQREZPUF9CZWdpbkltYWdlRGF0YSwgUERGT1BfU2V0TGluZUpvaW4sCi0gICAgUERGT1BfU2V0TGluZUNhcCwgUERGT1BfU2V0Q01ZS0NvbG9yX0ZpbGwsCi0gICAgUERGT1BfU2V0Q01ZS0NvbG9yX1N0cm9rZSwgUERGT1BfTGluZVRvLAotICAgIFBERk9QX01vdmVUbywgUERGT1BfU2V0TWl0ZXJMaW1pdCwKLSAgICBQREZPUF9NYXJrUGxhY2UsIFBERk9QX0VuZFBhdGgsCi0gICAgUERGT1BfU2F2ZUdyYXBoU3RhdGUsIFBERk9QX1Jlc3RvcmVHcmFwaFN0YXRlLAotICAgIFBERk9QX1JlY3RhbmdsZSwgUERGT1BfU2V0UkdCQ29sb3JfRmlsbCwKLSAgICBQREZPUF9TZXRSR0JDb2xvcl9TdHJva2UsIFBERk9QX1NldFJlbmRlckludGVudCwKLSAgICBQREZPUF9DbG9zZVN0cm9rZVBhdGgsIFBERk9QX1N0cm9rZVBhdGgsCi0gICAgUERGT1BfU2V0Q29sb3JfRmlsbCwgUERGT1BfU2V0Q29sb3JfU3Ryb2tlLAotICAgIFBERk9QX1NldENvbG9yUFNfRmlsbCwgUERGT1BfU2V0Q29sb3JQU19TdHJva2UsCi0gICAgUERGT1BfU2hhZGVGaWxsLCBQREZPUF9TZXRDaGFyU3BhY2UsCi0gICAgUERGT1BfTW92ZVRleHRQb2ludCwgUERGT1BfTW92ZVRleHRQb2ludF9TZXRMZWFkaW5nLAotICAgIFBERk9QX1NldEZvbnQsIFBERk9QX1Nob3dUZXh0LAotICAgIFBERk9QX1Nob3dUZXh0X1Bvc2l0aW9uaW5nLCBQREZPUF9TZXRUZXh0TGVhZGluZywKLSAgICBQREZPUF9TZXRUZXh0TWF0cml4LCBQREZPUF9TZXRUZXh0UmVuZGVyTW9kZSwKLSAgICBQREZPUF9TZXRUZXh0UmlzZSwgUERGT1BfU2V0V29yZFNwYWNlLAotICAgIFBERk9QX1NldEhvcnpTY2FsZSwgUERGT1BfTW92ZVRvTmV4dExpbmUsCi0gICAgUERGT1BfQ3VydmVUb18yMywgUERGT1BfU2V0TGluZVdpZHRoLAotICAgIFBERk9QX0NsaXAsIFBERk9QX0VPQ2xpcCwKLSAgICBQREZPUF9DdXJ2ZVRvXzEzLCBQREZPUF9OZXh0TGluZVNob3dUZXh0LAotICAgIFBERk9QX05leHRMaW5lU2hvd1RleHRfU3BhY2UsIFBERk9QX0ludmFsaWQKLX0gUERGT1A7Ci0jZGVmaW5lIFBBUkFNX0JVRl9TSVpFCTE2Ci10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50CQkJbV9UeXBlOwotICAgIHVuaW9uIHsKLSAgICAgICAgc3RydWN0IHsKLSAgICAgICAgICAgIEZYX0JPT0wJCW1fYkludGVnZXI7Ci0gICAgICAgICAgICB1bmlvbiB7Ci0gICAgICAgICAgICAgICAgaW50CQltX0ludGVnZXI7Ci0gICAgICAgICAgICAgICAgRlhfRkxPQVQgbV9GbG9hdDsKLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0gbV9OdW1iZXI7Ci0gICAgICAgIENQREZfT2JqZWN0KgltX3BPYmplY3Q7Ci0gICAgICAgIHN0cnVjdCB7Ci0gICAgICAgICAgICBpbnQJCQltX0xlbjsKLSAgICAgICAgICAgIGNoYXIJCW1fQnVmZmVyWzMyXTsKLSAgICAgICAgfSBtX05hbWU7Ci0gICAgfTsKLX0gX0NvbnRlbnRQYXJhbTsKLSNkZWZpbmUgX0ZQREZfTUFYX0ZPUk1fTEVWRUxfCQkzMAotI2RlZmluZSBfRlBERl9NQVhfVFlQRTNfRk9STV9MRVZFTF8JNAorCisjZGVmaW5lIFBBUkFNX0JVRl9TSVpFIDE2CitzdHJ1Y3QgQ29udGVudFBhcmFtIHsKKyAgaW50IG1fVHlwZTsKKyAgdW5pb24geworICAgIHN0cnVjdCB7CisgICAgICBGWF9CT09MIG1fYkludGVnZXI7CisgICAgICB1bmlvbiB7CisgICAgICAgIGludCBtX0ludGVnZXI7CisgICAgICAgIEZYX0ZMT0FUIG1fRmxvYXQ7CisgICAgICB9OworICAgIH0gbV9OdW1iZXI7CisgICAgQ1BERl9PYmplY3QqIG1fcE9iamVjdDsKKyAgICBzdHJ1Y3QgeworICAgICAgaW50IG1fTGVuOworICAgICAgY2hhciBtX0J1ZmZlclszMl07CisgICAgfSBtX05hbWU7CisgIH07Cit9OworI2RlZmluZSBfRlBERl9NQVhfRk9STV9MRVZFTF8gMzAKKyNkZWZpbmUgX0ZQREZfTUFYX1RZUEUzX0ZPUk1fTEVWRUxfIDQKICNkZWZpbmUgX0ZQREZfTUFYX09CSkVDVF9TVEFDS19TSVpFXyA1MTIKLWNsYXNzIENQREZfU3RyZWFtQ29udGVudFBhcnNlciAKLXsKLXB1YmxpYzoKLSAgICBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXIoKTsKLSAgICB+Q1BERl9TdHJlYW1Db250ZW50UGFyc2VyKCk7Ci0gICAgRlhfQk9PTCBJbml0aWFsaXplKCk7Ci0gICAgdm9pZAlQcmVwYXJlUGFyc2UoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyZW50UmVzb3VyY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBtdENvbnRlbnRUb1VzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYWdlT2JqZWN0cyogcE9iakxpc3QsIENQREZfRGljdGlvbmFyeSogcFJlc291cmNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRmxvYXRSZWN0KiBwQkJveCwgQ1BERl9QYXJzZU9wdGlvbnMqIHBPcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQWxsU3RhdGVzKiBwQWxsU3RhdGVzLCBpbnQgbGV2ZWwpOwotICAgIENQREZfRG9jdW1lbnQqCQltX3BEb2N1bWVudDsKLSAgICBDUERGX0RpY3Rpb25hcnkqCW1fcFBhZ2VSZXNvdXJjZXM7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KgltX3BQYXJlbnRSZXNvdXJjZXM7Ci0gICAgQ1BERl9QYWdlT2JqZWN0cyoJbV9wT2JqZWN0TGlzdDsKLSAgICBDUERGX0RpY3Rpb25hcnkqCW1fcFJlc291cmNlczsKLSAgICBpbnQJCQkJCW1fTGV2ZWw7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeAltX210Q29udGVudFRvVXNlcjsKLSAgICBDRlhfRmxvYXRSZWN0CQltX0JCb3g7Ci0gICAgQ1BERl9QYXJzZU9wdGlvbnMJbV9PcHRpb25zOwotICAgIF9Db250ZW50UGFyYW0JCW1fUGFyYW1CdWYxW1BBUkFNX0JVRl9TSVpFXTsKLSAgICBGWF9EV09SRAkJCW1fUGFyYW1TdGFydFBvczsKLSAgICBGWF9EV09SRAkJCW1fUGFyYW1Db3VudDsKLSAgICB2b2lkCQkJCUFkZE51bWJlclBhcmFtKEZYX0xQQ1NUUiBzdHIsIGludCBsZW4pOwotICAgIHZvaWQJCQkJQWRkT2JqZWN0UGFyYW0oQ1BERl9PYmplY3QqIHBPYmopOwotICAgIHZvaWQJCQkJQWRkTmFtZVBhcmFtKEZYX0xQQ1NUUiBuYW1lLCBpbnQgc2l6ZSk7Ci0gICAgaW50CQkJCQlHZXROZXh0UGFyYW1Qb3MoKTsKLSAgICB2b2lkCQkJCUNsZWFyQWxsUGFyYW1zKCk7Ci0gICAgQ1BERl9PYmplY3QqCQlHZXRPYmplY3QoRlhfRFdPUkQgaW5kZXgpOwotICAgIENGWF9CeXRlU3RyaW5nCQlHZXRTdHJpbmcoRlhfRFdPUkQgaW5kZXgpOwotICAgIEZYX0ZMT0FUCQkJR2V0TnVtYmVyKEZYX0RXT1JEIGluZGV4KTsKLSAgICBGWF9GTE9BVAkJR2V0TnVtYmVyMTYoRlhfRFdPUkQgaW5kZXgpOwotICAgIGludAkJCQkJR2V0SW50ZWdlcihGWF9EV09SRCBpbmRleCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRlhfSU5UMzIpKEdldE51bWJlcihpbmRleCkpOwotICAgIH0KLSAgICBGWF9CT09MCQkJCU9uT3BlcmF0b3IoRlhfTFBDU1RSIG9wKTsKLSAgICB2b2lkCQkJCUJpZ0Nhc2VDYWxsZXIoaW50IGluZGV4KTsKLSAgICBGWF9CT09MCQkJCW1fYkFib3J0OwotICAgIENQREZfU3RyZWFtUGFyc2VyKgltX3BTeW50YXg7Ci0gICAgRlhfRFdPUkQJCQlHZXRQYXJzZVBvcygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wU3ludGF4LT5HZXRQb3MoKTsKLSAgICB9Ci0gICAgQ1BERl9BbGxTdGF0ZXMqCQltX3BDdXJTdGF0ZXM7Ci0gICAgQ1BERl9Db250ZW50TWFyawltX0N1ckNvbnRlbnRNYXJrOwotICAgIENGWF9QdHJBcnJheQkJbV9DbGlwVGV4dExpc3Q7Ci0gICAgQ1BERl9UZXh0T2JqZWN0KgltX3BMYXN0VGV4dE9iamVjdDsKLSAgICBGWF9GTE9BVAkJCW1fRGVmRm9udFNpemU7Ci0gICAgdm9pZAkJCQlBZGRUZXh0T2JqZWN0KENGWF9CeXRlU3RyaW5nKiBwVGV4dCwgRlhfRkxPQVQgZkluaXRLZXJuaW5nLCBGWF9GTE9BVCogcEtlcm5pbmcsIGludCBjb3VudCk7CitjbGFzcyBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXIgeworIHB1YmxpYzoKKyAgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyZW50UmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcG10Q29udGVudFRvVXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUGFnZU9iamVjdHMqIHBPYmpMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdCogcEJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FsbFN0YXRlcyogcEFsbFN0YXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCk7CisgIH5DUERGX1N0cmVhbUNvbnRlbnRQYXJzZXIoKTsKIAotICAgIHZvaWQJCQkJQ29udmVydFVzZXJTcGFjZShGWF9GTE9BVCYgeCwgRlhfRkxPQVQmIHkpOwotICAgIHZvaWQJCQkJQ29udmVydFRleHRTcGFjZShGWF9GTE9BVCYgeCwgRlhfRkxPQVQmIHkpOwotICAgIHZvaWQJCQkJT25DaGFuZ2VUZXh0TWF0cml4KCk7Ci0gICAgRlhfRFdPUkQJCQlQYXJzZShGWF9MUENCWVRFIHBEYXRhLCBGWF9EV09SRCBkd1NpemUsIEZYX0RXT1JEIG1heF9jb3N0KTsKLSAgICB2b2lkCQkJCVBhcnNlUGF0aE9iamVjdCgpOwotICAgIGludAkJCQkJbV9Db21wYXRDb3VudDsKLSAgICBGWF9QQVRIUE9JTlQqCQltX3BQYXRoUG9pbnRzOwotICAgIGludAkJCQkJbV9QYXRoUG9pbnRDb3VudDsKLSAgICBpbnQJCQkJCW1fUGF0aEFsbG9jU2l6ZTsKLSAgICBGWF9GTE9BVAkJCW1fUGF0aFN0YXJ0WCwgbV9QYXRoU3RhcnRZOwotICAgIEZYX0ZMT0FUCQkJbV9QYXRoQ3VycmVudFgsIG1fUGF0aEN1cnJlbnRZOwotICAgIGludAkJCQkJbV9QYXRoQ2xpcFR5cGU7Ci0gICAgdm9pZAkJCQlBZGRQYXRoUG9pbnQoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgaW50IGZsYWcpOwotICAgIHZvaWQJCQkJQWRkUGF0aFJlY3QoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgRlhfRkxPQVQgdywgRlhfRkxPQVQgaCk7Ci0gICAgdm9pZAkJCQlBZGRQYXRoT2JqZWN0KGludCBGaWxsVHlwZSwgRlhfQk9PTCBiU3Ryb2tlKTsKLSAgICBDUERGX0ltYWdlT2JqZWN0KglBZGRJbWFnZShDUERGX1N0cmVhbSogcFN0cmVhbSwgQ1BERl9JbWFnZSogcEltYWdlLCBGWF9CT09MIGJJbmxpbmUpOwotICAgIHZvaWQJCQkJQWRkRHVwbGljYXRlSW1hZ2UoKTsKLSAgICB2b2lkCQkJCUFkZEZvcm0oQ1BERl9TdHJlYW0qKTsKLSAgICBDRlhfQnl0ZVN0cmluZwkJbV9MYXN0SW1hZ2VOYW1lOwotICAgIENQREZfSW1hZ2UqCQkJbV9wTGFzdEltYWdlOwotICAgIENGWF9CaW5hcnlCdWYJCW1fTGFzdEltYWdlRGljdCwgbV9MYXN0SW1hZ2VEYXRhOwotICAgIENQREZfRGljdGlvbmFyeSoJbV9wTGFzdEltYWdlRGljdDsKLSAgICBDUERGX0RpY3Rpb25hcnkqICAgIG1fcExhc3RDbG9uZUltYWdlRGljdDsKLSAgICBGWF9CT09MCQkJCW1fYlJlbGVhc2VMYXN0RGljdDsKLSAgICBGWF9CT09MCQkJCW1fYlNhbWVMYXN0RGljdDsKLSAgICB2b2lkCQkJCVNldEdyYXBoaWNTdGF0ZXMoQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBGWF9CT09MIGJDb2xvciwgRlhfQk9PTCBiVGV4dCwgRlhfQk9PTCBiR3JhcGgpOwotICAgIEZYX0JPT0wJCQkJbV9iQ29sb3JlZDsKLSAgICBGWF9GTE9BVAkJCW1fVHlwZTNEYXRhWzZdOwotICAgIEZYX0JPT0wJCQkJbV9iUmVzb3VyY2VNaXNzaW5nOwotICAgIENGWF9QdHJBcnJheQkJbV9TdGF0ZVN0YWNrOwotICAgIHZvaWQJCQkJU2F2ZVN0YXRlcyhDUERGX0FsbFN0YXRlcyopOwotICAgIHZvaWQJCQkJUmVzdG9yZVN0YXRlcyhDUERGX0FsbFN0YXRlcyopOwotICAgIENQREZfRm9udCoJCQlGaW5kRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSk7Ci0gICAgQ1BERl9Db2xvclNwYWNlKglGaW5kQ29sb3JTcGFjZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSk7Ci0gICAgQ1BERl9QYXR0ZXJuKgkJRmluZFBhdHRlcm4oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsIEZYX0JPT0wgYlNoYWRpbmcpOwotICAgIENQREZfT2JqZWN0KgkJRmluZFJlc291cmNlT2JqKEZYX0JTVFIgdHlwZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOwotICAgIHZvaWQgSGFuZGxlX0Nsb3NlRmlsbFN0cm9rZVBhdGgoKTsKLSAgICB2b2lkIEhhbmRsZV9GaWxsU3Ryb2tlUGF0aCgpOwotICAgIHZvaWQgSGFuZGxlX0Nsb3NlRU9GaWxsU3Ryb2tlUGF0aCgpOwotICAgIHZvaWQgSGFuZGxlX0VPRmlsbFN0cm9rZVBhdGgoKTsKLSAgICB2b2lkIEhhbmRsZV9CZWdpbk1hcmtlZENvbnRlbnRfRGljdGlvbmFyeSgpOwotICAgIHZvaWQgSGFuZGxlX0JlZ2luSW1hZ2UoKTsKLSAgICB2b2lkIEhhbmRsZV9CZWdpbk1hcmtlZENvbnRlbnQoKTsKLSAgICB2b2lkIEhhbmRsZV9CZWdpblRleHQoKTsKLSAgICB2b2lkIEhhbmRsZV9CZWdpblNlY3Rpb25VbmRlZmluZWQoKTsKLSAgICB2b2lkIEhhbmRsZV9DdXJ2ZVRvXzEyMygpOwotICAgIHZvaWQgSGFuZGxlX0NvbmNhdE1hdHJpeCgpOwotICAgIHZvaWQgSGFuZGxlX1NldENvbG9yU3BhY2VfRmlsbCgpOwotICAgIHZvaWQgSGFuZGxlX1NldENvbG9yU3BhY2VfU3Ryb2tlKCk7Ci0gICAgdm9pZCBIYW5kbGVfU2V0RGFzaCgpOwotICAgIHZvaWQgSGFuZGxlX1NldENoYXJXaWR0aCgpOwotICAgIHZvaWQgSGFuZGxlX1NldENhY2hlZERldmljZSgpOwotICAgIHZvaWQgSGFuZGxlX0V4ZWN1dGVYT2JqZWN0KCk7Ci0gICAgdm9pZCBIYW5kbGVfTWFya1BsYWNlX0RpY3Rpb25hcnkoKTsKLSAgICB2b2lkIEhhbmRsZV9FbmRJbWFnZSgpOwotICAgIHZvaWQgSGFuZGxlX0VuZE1hcmtlZENvbnRlbnQoKTsKLSAgICB2b2lkIEhhbmRsZV9FbmRUZXh0KCk7Ci0gICAgdm9pZCBIYW5kbGVfRW5kU2VjdGlvblVuZGVmaW5lZCgpOwotICAgIHZvaWQgSGFuZGxlX0ZpbGxQYXRoKCk7Ci0gICAgdm9pZCBIYW5kbGVfRmlsbFBhdGhPbGQoKTsKLSAgICB2b2lkIEhhbmRsZV9FT0ZpbGxQYXRoKCk7Ci0gICAgdm9pZCBIYW5kbGVfU2V0R3JheV9GaWxsKCk7Ci0gICAgdm9pZCBIYW5kbGVfU2V0R3JheV9TdHJva2UoKTsKLSAgICB2b2lkIEhhbmRsZV9TZXRFeHRlbmRHcmFwaFN0YXRlKCk7Ci0gICAgdm9pZCBIYW5kbGVfQ2xvc2VQYXRoKCk7Ci0gICAgdm9pZCBIYW5kbGVfU2V0RmxhdCgpOwotICAgIHZvaWQgSGFuZGxlX0JlZ2luSW1hZ2VEYXRhKCk7Ci0gICAgdm9pZCBIYW5kbGVfU2V0TGluZUpvaW4oKTsKLSAgICB2b2lkIEhhbmRsZV9TZXRMaW5lQ2FwKCk7Ci0gICAgdm9pZCBIYW5kbGVfU2V0Q01ZS0NvbG9yX0ZpbGwoKTsKLSAgICB2b2lkIEhhbmRsZV9TZXRDTVlLQ29sb3JfU3Ryb2tlKCk7Ci0gICAgdm9pZCBIYW5kbGVfTGluZVRvKCk7Ci0gICAgdm9pZCBIYW5kbGVfTW92ZVRvKCk7Ci0gICAgdm9pZCBIYW5kbGVfU2V0TWl0ZXJMaW1pdCgpOwotICAgIHZvaWQgSGFuZGxlX01hcmtQbGFjZSgpOwotICAgIHZvaWQgSGFuZGxlX0VuZFBhdGgoKTsKLSAgICB2b2lkIEhhbmRsZV9TYXZlR3JhcGhTdGF0ZSgpOwotICAgIHZvaWQgSGFuZGxlX1Jlc3RvcmVHcmFwaFN0YXRlKCk7Ci0gICAgdm9pZCBIYW5kbGVfUmVjdGFuZ2xlKCk7Ci0gICAgdm9pZCBIYW5kbGVfU2V0UkdCQ29sb3JfRmlsbCgpOwotICAgIHZvaWQgSGFuZGxlX1NldFJHQkNvbG9yX1N0cm9rZSgpOwotICAgIHZvaWQgSGFuZGxlX1NldFJlbmRlckludGVudCgpOwotICAgIHZvaWQgSGFuZGxlX0Nsb3NlU3Ryb2tlUGF0aCgpOwotICAgIHZvaWQgSGFuZGxlX1N0cm9rZVBhdGgoKTsKLSAgICB2b2lkIEhhbmRsZV9TZXRDb2xvcl9GaWxsKCk7Ci0gICAgdm9pZCBIYW5kbGVfU2V0Q29sb3JfU3Ryb2tlKCk7Ci0gICAgdm9pZCBIYW5kbGVfU2V0Q29sb3JQU19GaWxsKCk7Ci0gICAgdm9pZCBIYW5kbGVfU2V0Q29sb3JQU19TdHJva2UoKTsKLSAgICB2b2lkIEhhbmRsZV9TaGFkZUZpbGwoKTsKLSAgICB2b2lkIEhhbmRsZV9TZXRDaGFyU3BhY2UoKTsKLSAgICB2b2lkIEhhbmRsZV9Nb3ZlVGV4dFBvaW50KCk7Ci0gICAgdm9pZCBIYW5kbGVfTW92ZVRleHRQb2ludF9TZXRMZWFkaW5nKCk7Ci0gICAgdm9pZCBIYW5kbGVfU2V0Rm9udCgpOwotICAgIHZvaWQgSGFuZGxlX1Nob3dUZXh0KCk7Ci0gICAgdm9pZCBIYW5kbGVfU2hvd1RleHRfUG9zaXRpb25pbmcoKTsKLSAgICB2b2lkIEhhbmRsZV9TZXRUZXh0TGVhZGluZygpOwotICAgIHZvaWQgSGFuZGxlX1NldFRleHRNYXRyaXgoKTsKLSAgICB2b2lkIEhhbmRsZV9TZXRUZXh0UmVuZGVyTW9kZSgpOwotICAgIHZvaWQgSGFuZGxlX1NldFRleHRSaXNlKCk7Ci0gICAgdm9pZCBIYW5kbGVfU2V0V29yZFNwYWNlKCk7Ci0gICAgdm9pZCBIYW5kbGVfU2V0SG9yelNjYWxlKCk7Ci0gICAgdm9pZCBIYW5kbGVfTW92ZVRvTmV4dExpbmUoKTsKLSAgICB2b2lkIEhhbmRsZV9DdXJ2ZVRvXzIzKCk7Ci0gICAgdm9pZCBIYW5kbGVfU2V0TGluZVdpZHRoKCk7Ci0gICAgdm9pZCBIYW5kbGVfQ2xpcCgpOwotICAgIHZvaWQgSGFuZGxlX0VPQ2xpcCgpOwotICAgIHZvaWQgSGFuZGxlX0N1cnZlVG9fMTMoKTsKLSAgICB2b2lkIEhhbmRsZV9OZXh0TGluZVNob3dUZXh0KCk7Ci0gICAgdm9pZCBIYW5kbGVfTmV4dExpbmVTaG93VGV4dF9TcGFjZSgpOwotICAgIHZvaWQgSGFuZGxlX0ludmFsaWQoKTsKKyAgQ1BERl9QYWdlT2JqZWN0cyogR2V0T2JqZWN0TGlzdCgpIGNvbnN0IHsgcmV0dXJuIG1fcE9iamVjdExpc3Q7IH0KKyAgQ1BERl9BbGxTdGF0ZXMqIEdldEN1clN0YXRlcygpIGNvbnN0IHsgcmV0dXJuIG1fcEN1clN0YXRlcy5nZXQoKTsgfQorICBGWF9CT09MIElzQ29sb3JlZCgpIGNvbnN0IHsgcmV0dXJuIG1fYkNvbG9yZWQ7IH0KKyAgY29uc3QgRlhfRkxPQVQqIEdldFR5cGUzRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fVHlwZTNEYXRhOyB9CisKKyAgdm9pZCBBZGROdW1iZXJQYXJhbShjb25zdCBGWF9DSEFSKiBzdHIsIGludCBsZW4pOworICB2b2lkIEFkZE9iamVjdFBhcmFtKENQREZfT2JqZWN0KiBwT2JqKTsKKyAgdm9pZCBBZGROYW1lUGFyYW0oY29uc3QgRlhfQ0hBUiogbmFtZSwgaW50IHNpemUpOworICBpbnQgR2V0TmV4dFBhcmFtUG9zKCk7CisgIHZvaWQgQ2xlYXJBbGxQYXJhbXMoKTsKKyAgQ1BERl9PYmplY3QqIEdldE9iamVjdChGWF9EV09SRCBpbmRleCk7CisgIENGWF9CeXRlU3RyaW5nIEdldFN0cmluZyhGWF9EV09SRCBpbmRleCk7CisgIEZYX0ZMT0FUIEdldE51bWJlcihGWF9EV09SRCBpbmRleCk7CisgIEZYX0ZMT0FUIEdldE51bWJlcjE2KEZYX0RXT1JEIGluZGV4KTsKKyAgaW50IEdldEludGVnZXIoRlhfRFdPUkQgaW5kZXgpIHsgcmV0dXJuIChpbnQzMl90KShHZXROdW1iZXIoaW5kZXgpKTsgfQorICBGWF9CT09MIE9uT3BlcmF0b3IoY29uc3QgRlhfQ0hBUiogb3ApOworICB2b2lkIEJpZ0Nhc2VDYWxsZXIoaW50IGluZGV4KTsKKyAgRlhfRFdPUkQgR2V0UGFyc2VQb3MoKSB7IHJldHVybiBtX3BTeW50YXgtPkdldFBvcygpOyB9CisgIHZvaWQgQWRkVGV4dE9iamVjdChDRlhfQnl0ZVN0cmluZyogcFRleHQsCisgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmSW5pdEtlcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcEtlcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpOworCisgIHZvaWQgQ29udmVydFVzZXJTcGFjZShGWF9GTE9BVCYgeCwgRlhfRkxPQVQmIHkpOworICB2b2lkIENvbnZlcnRUZXh0U3BhY2UoRlhfRkxPQVQmIHgsIEZYX0ZMT0FUJiB5KTsKKyAgdm9pZCBPbkNoYW5nZVRleHRNYXRyaXgoKTsKKyAgRlhfRFdPUkQgUGFyc2UoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3U2l6ZSwgRlhfRFdPUkQgbWF4X2Nvc3QpOworICB2b2lkIFBhcnNlUGF0aE9iamVjdCgpOworICB2b2lkIEFkZFBhdGhQb2ludChGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBpbnQgZmxhZyk7CisgIHZvaWQgQWRkUGF0aFJlY3QoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgRlhfRkxPQVQgdywgRlhfRkxPQVQgaCk7CisgIHZvaWQgQWRkUGF0aE9iamVjdChpbnQgRmlsbFR5cGUsIEZYX0JPT0wgYlN0cm9rZSk7CisgIENQREZfSW1hZ2VPYmplY3QqIEFkZEltYWdlKENQREZfU3RyZWFtKiBwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ltYWdlKiBwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYklubGluZSk7CisgIHZvaWQgQWRkRHVwbGljYXRlSW1hZ2UoKTsKKyAgdm9pZCBBZGRGb3JtKENQREZfU3RyZWFtKik7CisgIHZvaWQgU2V0R3JhcGhpY1N0YXRlcyhDUERGX1BhZ2VPYmplY3QqIHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJHcmFwaCk7CisgIHZvaWQgU2F2ZVN0YXRlcyhDUERGX0FsbFN0YXRlcyopOworICB2b2lkIFJlc3RvcmVTdGF0ZXMoQ1BERl9BbGxTdGF0ZXMqKTsKKyAgQ1BERl9Gb250KiBGaW5kRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSk7CisgIENQREZfQ29sb3JTcGFjZSogRmluZENvbG9yU3BhY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOworICBDUERGX1BhdHRlcm4qIEZpbmRQYXR0ZXJuKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBGWF9CT09MIGJTaGFkaW5nKTsKKyAgQ1BERl9PYmplY3QqIEZpbmRSZXNvdXJjZU9iaihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOworCisgcHJvdGVjdGVkOgorICBzdHJ1Y3QgT3BDb2RlIHsKKyAgICBGWF9EV09SRCBtX09wSWQ7CisgICAgdm9pZCAoQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjoqbV9PcEhhbmRsZXIpKCk7CisgIH07CisgIHN0YXRpYyBjb25zdCBPcENvZGUgZ19PcENvZGVzW107CisKKyAgdm9pZCBIYW5kbGVfQ2xvc2VGaWxsU3Ryb2tlUGF0aCgpOworICB2b2lkIEhhbmRsZV9GaWxsU3Ryb2tlUGF0aCgpOworICB2b2lkIEhhbmRsZV9DbG9zZUVPRmlsbFN0cm9rZVBhdGgoKTsKKyAgdm9pZCBIYW5kbGVfRU9GaWxsU3Ryb2tlUGF0aCgpOworICB2b2lkIEhhbmRsZV9CZWdpbk1hcmtlZENvbnRlbnRfRGljdGlvbmFyeSgpOworICB2b2lkIEhhbmRsZV9CZWdpbkltYWdlKCk7CisgIHZvaWQgSGFuZGxlX0JlZ2luTWFya2VkQ29udGVudCgpOworICB2b2lkIEhhbmRsZV9CZWdpblRleHQoKTsKKyAgdm9pZCBIYW5kbGVfQmVnaW5TZWN0aW9uVW5kZWZpbmVkKCk7CisgIHZvaWQgSGFuZGxlX0N1cnZlVG9fMTIzKCk7CisgIHZvaWQgSGFuZGxlX0NvbmNhdE1hdHJpeCgpOworICB2b2lkIEhhbmRsZV9TZXRDb2xvclNwYWNlX0ZpbGwoKTsKKyAgdm9pZCBIYW5kbGVfU2V0Q29sb3JTcGFjZV9TdHJva2UoKTsKKyAgdm9pZCBIYW5kbGVfU2V0RGFzaCgpOworICB2b2lkIEhhbmRsZV9TZXRDaGFyV2lkdGgoKTsKKyAgdm9pZCBIYW5kbGVfU2V0Q2FjaGVkRGV2aWNlKCk7CisgIHZvaWQgSGFuZGxlX0V4ZWN1dGVYT2JqZWN0KCk7CisgIHZvaWQgSGFuZGxlX01hcmtQbGFjZV9EaWN0aW9uYXJ5KCk7CisgIHZvaWQgSGFuZGxlX0VuZEltYWdlKCk7CisgIHZvaWQgSGFuZGxlX0VuZE1hcmtlZENvbnRlbnQoKTsKKyAgdm9pZCBIYW5kbGVfRW5kVGV4dCgpOworICB2b2lkIEhhbmRsZV9FbmRTZWN0aW9uVW5kZWZpbmVkKCk7CisgIHZvaWQgSGFuZGxlX0ZpbGxQYXRoKCk7CisgIHZvaWQgSGFuZGxlX0ZpbGxQYXRoT2xkKCk7CisgIHZvaWQgSGFuZGxlX0VPRmlsbFBhdGgoKTsKKyAgdm9pZCBIYW5kbGVfU2V0R3JheV9GaWxsKCk7CisgIHZvaWQgSGFuZGxlX1NldEdyYXlfU3Ryb2tlKCk7CisgIHZvaWQgSGFuZGxlX1NldEV4dGVuZEdyYXBoU3RhdGUoKTsKKyAgdm9pZCBIYW5kbGVfQ2xvc2VQYXRoKCk7CisgIHZvaWQgSGFuZGxlX1NldEZsYXQoKTsKKyAgdm9pZCBIYW5kbGVfQmVnaW5JbWFnZURhdGEoKTsKKyAgdm9pZCBIYW5kbGVfU2V0TGluZUpvaW4oKTsKKyAgdm9pZCBIYW5kbGVfU2V0TGluZUNhcCgpOworICB2b2lkIEhhbmRsZV9TZXRDTVlLQ29sb3JfRmlsbCgpOworICB2b2lkIEhhbmRsZV9TZXRDTVlLQ29sb3JfU3Ryb2tlKCk7CisgIHZvaWQgSGFuZGxlX0xpbmVUbygpOworICB2b2lkIEhhbmRsZV9Nb3ZlVG8oKTsKKyAgdm9pZCBIYW5kbGVfU2V0TWl0ZXJMaW1pdCgpOworICB2b2lkIEhhbmRsZV9NYXJrUGxhY2UoKTsKKyAgdm9pZCBIYW5kbGVfRW5kUGF0aCgpOworICB2b2lkIEhhbmRsZV9TYXZlR3JhcGhTdGF0ZSgpOworICB2b2lkIEhhbmRsZV9SZXN0b3JlR3JhcGhTdGF0ZSgpOworICB2b2lkIEhhbmRsZV9SZWN0YW5nbGUoKTsKKyAgdm9pZCBIYW5kbGVfU2V0UkdCQ29sb3JfRmlsbCgpOworICB2b2lkIEhhbmRsZV9TZXRSR0JDb2xvcl9TdHJva2UoKTsKKyAgdm9pZCBIYW5kbGVfU2V0UmVuZGVySW50ZW50KCk7CisgIHZvaWQgSGFuZGxlX0Nsb3NlU3Ryb2tlUGF0aCgpOworICB2b2lkIEhhbmRsZV9TdHJva2VQYXRoKCk7CisgIHZvaWQgSGFuZGxlX1NldENvbG9yX0ZpbGwoKTsKKyAgdm9pZCBIYW5kbGVfU2V0Q29sb3JfU3Ryb2tlKCk7CisgIHZvaWQgSGFuZGxlX1NldENvbG9yUFNfRmlsbCgpOworICB2b2lkIEhhbmRsZV9TZXRDb2xvclBTX1N0cm9rZSgpOworICB2b2lkIEhhbmRsZV9TaGFkZUZpbGwoKTsKKyAgdm9pZCBIYW5kbGVfU2V0Q2hhclNwYWNlKCk7CisgIHZvaWQgSGFuZGxlX01vdmVUZXh0UG9pbnQoKTsKKyAgdm9pZCBIYW5kbGVfTW92ZVRleHRQb2ludF9TZXRMZWFkaW5nKCk7CisgIHZvaWQgSGFuZGxlX1NldEZvbnQoKTsKKyAgdm9pZCBIYW5kbGVfU2hvd1RleHQoKTsKKyAgdm9pZCBIYW5kbGVfU2hvd1RleHRfUG9zaXRpb25pbmcoKTsKKyAgdm9pZCBIYW5kbGVfU2V0VGV4dExlYWRpbmcoKTsKKyAgdm9pZCBIYW5kbGVfU2V0VGV4dE1hdHJpeCgpOworICB2b2lkIEhhbmRsZV9TZXRUZXh0UmVuZGVyTW9kZSgpOworICB2b2lkIEhhbmRsZV9TZXRUZXh0UmlzZSgpOworICB2b2lkIEhhbmRsZV9TZXRXb3JkU3BhY2UoKTsKKyAgdm9pZCBIYW5kbGVfU2V0SG9yelNjYWxlKCk7CisgIHZvaWQgSGFuZGxlX01vdmVUb05leHRMaW5lKCk7CisgIHZvaWQgSGFuZGxlX0N1cnZlVG9fMjMoKTsKKyAgdm9pZCBIYW5kbGVfU2V0TGluZVdpZHRoKCk7CisgIHZvaWQgSGFuZGxlX0NsaXAoKTsKKyAgdm9pZCBIYW5kbGVfRU9DbGlwKCk7CisgIHZvaWQgSGFuZGxlX0N1cnZlVG9fMTMoKTsKKyAgdm9pZCBIYW5kbGVfTmV4dExpbmVTaG93VGV4dCgpOworICB2b2lkIEhhbmRsZV9OZXh0TGluZVNob3dUZXh0X1NwYWNlKCk7CisgIHZvaWQgSGFuZGxlX0ludmFsaWQoKTsKKworICBDUERGX0RvY3VtZW50KiBjb25zdCBtX3BEb2N1bWVudDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BQYWdlUmVzb3VyY2VzOworICBDUERGX0RpY3Rpb25hcnkqIG1fcFBhcmVudFJlc291cmNlczsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BSZXNvdXJjZXM7CisgIENQREZfUGFnZU9iamVjdHMqIG1fcE9iamVjdExpc3Q7CisgIGludCBtX0xldmVsOworICBDRlhfTWF0cml4IG1fbXRDb250ZW50VG9Vc2VyOworICBDRlhfRmxvYXRSZWN0IG1fQkJveDsKKyAgQ1BERl9QYXJzZU9wdGlvbnMgbV9PcHRpb25zOworICBDb250ZW50UGFyYW0gbV9QYXJhbUJ1ZjFbUEFSQU1fQlVGX1NJWkVdOworICBGWF9EV09SRCBtX1BhcmFtU3RhcnRQb3M7CisgIEZYX0RXT1JEIG1fUGFyYW1Db3VudDsKKyAgQ1BERl9TdHJlYW1QYXJzZXIqIG1fcFN5bnRheDsKKyAgc3RkOjp1bmlxdWVfcHRyPENQREZfQWxsU3RhdGVzPiBtX3BDdXJTdGF0ZXM7CisgIENQREZfQ29udGVudE1hcmsgbV9DdXJDb250ZW50TWFyazsKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9UZXh0T2JqZWN0Kj4gbV9DbGlwVGV4dExpc3Q7CisgIENQREZfVGV4dE9iamVjdCogbV9wTGFzdFRleHRPYmplY3Q7CisgIEZYX0ZMT0FUIG1fRGVmRm9udFNpemU7CisgIGludCBtX0NvbXBhdENvdW50OworICBGWF9QQVRIUE9JTlQqIG1fcFBhdGhQb2ludHM7CisgIGludCBtX1BhdGhQb2ludENvdW50OworICBpbnQgbV9QYXRoQWxsb2NTaXplOworICBGWF9GTE9BVCBtX1BhdGhTdGFydFg7CisgIEZYX0ZMT0FUIG1fUGF0aFN0YXJ0WTsKKyAgRlhfRkxPQVQgbV9QYXRoQ3VycmVudFg7CisgIEZYX0ZMT0FUIG1fUGF0aEN1cnJlbnRZOworICBpbnQgbV9QYXRoQ2xpcFR5cGU7CisgIENGWF9CeXRlU3RyaW5nIG1fTGFzdEltYWdlTmFtZTsKKyAgQ1BERl9JbWFnZSogbV9wTGFzdEltYWdlOworICBDRlhfQmluYXJ5QnVmIG1fTGFzdEltYWdlRGljdDsKKyAgQ0ZYX0JpbmFyeUJ1ZiBtX0xhc3RJbWFnZURhdGE7CisgIENQREZfRGljdGlvbmFyeSogbV9wTGFzdEltYWdlRGljdDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BMYXN0Q2xvbmVJbWFnZURpY3Q7CisgIEZYX0JPT0wgbV9iUmVsZWFzZUxhc3REaWN0OworICBGWF9CT09MIG1fYlNhbWVMYXN0RGljdDsKKyAgRlhfQk9PTCBtX2JDb2xvcmVkOworICBGWF9GTE9BVCBtX1R5cGUzRGF0YVs2XTsKKyAgRlhfQk9PTCBtX2JSZXNvdXJjZU1pc3Npbmc7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDUERGX0FsbFN0YXRlcz4+IG1fU3RhdGVTdGFjazsKIH07Ci1jbGFzcyBDUERGX0NvbnRlbnRQYXJzZXIgCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9Db250ZW50UGFyc2VyKCk7Ci0gICAgfkNQREZfQ29udGVudFBhcnNlcigpOwotICAgIHR5cGVkZWYgZW51bSB7IFJlYWR5LCBUb0JlQ29udGludWVkLCBEb25lIH0gUGFyc2VTdGF0dXM7Ci0gICAgUGFyc2VTdGF0dXMJCQlHZXRTdGF0dXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fU3RhdHVzOwotICAgIH0KLSAgICB2b2lkCQkJCVN0YXJ0KENQREZfUGFnZSogcFBhZ2UsIENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucyk7Ci0gICAgdm9pZAkJCQlTdGFydChDUERGX0Zvcm0qIHBGb3JtLCBDUERGX0FsbFN0YXRlcyogcEdyYXBoaWNTdGF0ZXMsIENGWF9BZmZpbmVNYXRyaXgqIHBQYXJlbnRNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1R5cGUzQ2hhciogcFR5cGUzQ2hhciwgQ1BERl9QYXJzZU9wdGlvbnMqIHBPcHRpb25zLCBpbnQgbGV2ZWwpOwotICAgIHZvaWQJCQkJQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOwotICAgIGludAkJCQkJRXN0aW1hdGVQcm9ncmVzcygpOwotcHJvdGVjdGVkOgotICAgIHZvaWQJCQkJQ2xlYXIoKTsKLSAgICBQYXJzZVN0YXR1cwkJCW1fU3RhdHVzOwotICAgIENQREZfUGFnZU9iamVjdHMqCW1fcE9iamVjdHM7Ci0gICAgRlhfQk9PTAkJCQltX2JGb3JtOwotICAgIENQREZfUGFyc2VPcHRpb25zCW1fT3B0aW9uczsKLSAgICBDUERGX1R5cGUzQ2hhcioJCW1fcFR5cGUzQ2hhcjsKLSAgICBpbnQJCQkJCW1fSW50ZXJuYWxTdGFnZTsKLSAgICBDUERGX1N0cmVhbUFjYyoJCW1fcFNpbmdsZVN0cmVhbTsKLSAgICBDUERGX1N0cmVhbUFjYyoqCW1fcFN0cmVhbUFycmF5OwotICAgIEZYX0RXT1JECQkJbV9uU3RyZWFtczsKLSAgICBGWF9MUEJZVEUJCQltX3BEYXRhOwotICAgIEZYX0RXT1JECQkJbV9TaXplOwotICAgIGNsYXNzIENQREZfU3RyZWFtQ29udGVudFBhcnNlcioJbV9wUGFyc2VyOwotICAgIEZYX0RXT1JECQkJbV9DdXJyZW50T2Zmc2V0OwotICAgIENQREZfU3RyZWFtRmlsdGVyKgltX3BTdHJlYW1GaWx0ZXI7CitjbGFzcyBDUERGX0NvbnRlbnRQYXJzZXIgeworIHB1YmxpYzoKKyAgZW51bSBQYXJzZVN0YXR1cyB7IFJlYWR5LCBUb0JlQ29udGludWVkLCBEb25lIH07CisKKyAgQ1BERl9Db250ZW50UGFyc2VyKCk7CisgIH5DUERGX0NvbnRlbnRQYXJzZXIoKTsKKworICBQYXJzZVN0YXR1cyBHZXRTdGF0dXMoKSBjb25zdCB7IHJldHVybiBtX1N0YXR1czsgfQorICB2b2lkIFN0YXJ0KENQREZfUGFnZSogcFBhZ2UsIENQREZfUGFyc2VPcHRpb25zKiBwT3B0aW9ucyk7CisgIHZvaWQgU3RhcnQoQ1BERl9Gb3JtKiBwRm9ybSwKKyAgICAgICAgICAgICBDUERGX0FsbFN0YXRlcyogcEdyYXBoaWNTdGF0ZXMsCisgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFBhcmVudE1hdHJpeCwKKyAgICAgICAgICAgICBDUERGX1R5cGUzQ2hhciogcFR5cGUzQ2hhciwKKyAgICAgICAgICAgICBDUERGX1BhcnNlT3B0aW9ucyogcE9wdGlvbnMsCisgICAgICAgICAgICAgaW50IGxldmVsKTsKKyAgdm9pZCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CisKKyBwcml2YXRlOgorICBlbnVtIEludGVybmFsU3RhZ2UgeworICAgIFNUQUdFX0dFVENPTlRFTlQgPSAxLAorICAgIFNUQUdFX1BBUlNFLAorICAgIFNUQUdFX0NIRUNLQ0xJUCwKKyAgfTsKKworICBQYXJzZVN0YXR1cyBtX1N0YXR1czsKKyAgSW50ZXJuYWxTdGFnZSBtX0ludGVybmFsU3RhZ2U7CisgIENQREZfUGFnZU9iamVjdHMqIG1fcE9iamVjdHM7CisgIEZYX0JPT0wgbV9iRm9ybTsKKyAgQ1BERl9QYXJzZU9wdGlvbnMgbV9PcHRpb25zOworICBDUERGX1R5cGUzQ2hhciogbV9wVHlwZTNDaGFyOworICBGWF9EV09SRCBtX25TdHJlYW1zOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9TdHJlYW1BY2M+IG1fcFNpbmdsZVN0cmVhbTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENQREZfU3RyZWFtQWNjPj4gbV9TdHJlYW1BcnJheTsKKyAgdWludDhfdCogbV9wRGF0YTsKKyAgRlhfRFdPUkQgbV9TaXplOworICBGWF9EV09SRCBtX0N1cnJlbnRPZmZzZXQ7CisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI+IG1fcFBhcnNlcjsKIH07Ci1jbGFzcyBDUERGX0FsbFN0YXRlcyA6IHB1YmxpYyBDUERGX0dyYXBoaWNTdGF0ZXMKLXsKLXB1YmxpYzoKLSAgICBDUERGX0FsbFN0YXRlcygpOwotICAgIH5DUERGX0FsbFN0YXRlcygpOwotICAgIHZvaWQJQ29weShjb25zdCBDUERGX0FsbFN0YXRlcyYgc3JjKTsKLSAgICB2b2lkCVByb2Nlc3NFeHRHUyhDUERGX0RpY3Rpb25hcnkqIHBHUywgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyKiBwUGFyc2VyKTsKLSAgICB2b2lkCVNldExpbmVEYXNoKENQREZfQXJyYXkqLCBGWF9GTE9BVCwgRlhfRkxPQVQgc2NhbGUpOwotICAgIENGWF9BZmZpbmVNYXRyaXgJCW1fVGV4dE1hdHJpeCwgbV9DVE0sIG1fUGFyZW50TWF0cml4OwotICAgIEZYX0ZMT0FUCQkJCW1fVGV4dFgsIG1fVGV4dFksIG1fVGV4dExpbmVYLCBtX1RleHRMaW5lWTsKLSAgICBGWF9GTE9BVAkJCQltX1RleHRMZWFkaW5nLCBtX1RleHRSaXNlLCBtX1RleHRIb3J6U2NhbGU7CitjbGFzcyBDUERGX0FsbFN0YXRlcyA6IHB1YmxpYyBDUERGX0dyYXBoaWNTdGF0ZXMgeworIHB1YmxpYzoKKyAgQ1BERl9BbGxTdGF0ZXMoKTsKKyAgfkNQREZfQWxsU3RhdGVzKCk7CisgIHZvaWQgQ29weShjb25zdCBDUERGX0FsbFN0YXRlcyYgc3JjKTsKKyAgdm9pZCBQcm9jZXNzRXh0R1MoQ1BERl9EaWN0aW9uYXJ5KiBwR1MsIENQREZfU3RyZWFtQ29udGVudFBhcnNlciogcFBhcnNlcik7CisgIHZvaWQgU2V0TGluZURhc2goQ1BERl9BcnJheSosIEZYX0ZMT0FULCBGWF9GTE9BVCBzY2FsZSk7CisgIENGWF9NYXRyaXggbV9UZXh0TWF0cml4LCBtX0NUTSwgbV9QYXJlbnRNYXRyaXg7CisgIEZYX0ZMT0FUIG1fVGV4dFgsIG1fVGV4dFksIG1fVGV4dExpbmVYLCBtX1RleHRMaW5lWTsKKyAgRlhfRkxPQVQgbV9UZXh0TGVhZGluZywgbV9UZXh0UmlzZSwgbV9UZXh0SG9yelNjYWxlOwogfTsKIAotdGVtcGxhdGUgPGNsYXNzIEtleVR5cGUsIGNsYXNzIFZhbHVlVHlwZT4KLUtleVR5cGUgUERGX0RvY1BhZ2VEYXRhX0ZpbmRWYWx1ZShjb25zdCBDRlhfTWFwUHRyVGVtcGxhdGU8S2V5VHlwZSwgQ1BERl9Db3VudGVkT2JqZWN0PFZhbHVlVHlwZT4qPiAmbWFwLCBWYWx1ZVR5cGUgZmluZFZhbHVlLCBDUERGX0NvdW50ZWRPYmplY3Q8VmFsdWVUeXBlPiomIGZpbmREYXRhKQotewotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBLZXlUeXBlIGZpbmRLZXk7Ci0gICAgICAgIG1hcC5HZXROZXh0QXNzb2MocG9zLCBmaW5kS2V5LCBmaW5kRGF0YSk7Ci0gICAgICAgIGlmIChmaW5kRGF0YS0+bV9PYmogPT0gZmluZFZhbHVlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmluZEtleTsKLSAgICAgICAgfQotICAgIH0KLSAgICBmaW5kRGF0YSA9IE5VTEw7Ci0gICAgcmV0dXJuIChLZXlUeXBlKShGWF9VSU5UUFRSKU5VTEw7Ci19Ci10ZW1wbGF0ZSA8Y2xhc3MgS2V5VHlwZSwgY2xhc3MgVmFsdWVUeXBlPgotRlhfQk9PTCBQREZfRG9jUGFnZURhdGFfUmVsZWFzZShDRlhfTWFwUHRyVGVtcGxhdGU8S2V5VHlwZSwgQ1BERl9Db3VudGVkT2JqZWN0PFZhbHVlVHlwZT4qPiAmbWFwLCBLZXlUeXBlIGZpbmRLZXksIFZhbHVlVHlwZSBmaW5kVmFsdWUsIEZYX0JPT0wgYkZvcmNlID0gRkFMU0UpCi17Ci0gICAgaWYgKCFmaW5kS2V5ICYmICFmaW5kVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDUERGX0NvdW50ZWRPYmplY3Q8VmFsdWVUeXBlPiogZmluZERhdGEgPSBOVUxMOwotICAgIGlmICghZmluZEtleSkgewotICAgICAgICBmaW5kS2V5ID0gUERGX0RvY1BhZ2VEYXRhX0ZpbmRWYWx1ZTxLZXlUeXBlLCBWYWx1ZVR5cGU+KG1hcCwgZmluZFZhbHVlLCBmaW5kRGF0YSk7Ci0gICAgfSBlbHNlIGlmICghbWFwLkxvb2t1cChmaW5kS2V5LCBmaW5kRGF0YSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoZmluZERhdGEgJiYgKCgtLSBmaW5kRGF0YS0+bV9uQ291bnQpID09IDAgfHwgYkZvcmNlKSkgewotICAgICAgICBkZWxldGUgZmluZERhdGEtPm1fT2JqOwotICAgICAgICBkZWxldGUgZmluZERhdGE7Ci0gICAgICAgIG1hcC5SZW1vdmVLZXkoZmluZEtleSk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci1jbGFzcyBDUERGX0RvY1BhZ2VEYXRhIAotewotcHVibGljOgotICAgIENQREZfRG9jUGFnZURhdGEoQ1BERl9Eb2N1bWVudCAqcFBERkRvYyk7Ci0gICAgfkNQREZfRG9jUGFnZURhdGEoKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgQ2xlYXIoRlhfQk9PTCBiUmVsZWFzZSA9IEZBTFNFKTsKLSAgICBDUERGX0ZvbnQqICAgICAgICAgICAgICAgICAgR2V0Rm9udChDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCwgRlhfQk9PTCBmaW5kT25seSk7Ci0gICAgQ1BERl9Gb250KiAgICAgICAgICAgICAgICAgIEdldFN0YW5kYXJkRm9udChGWF9CU1RSIGZvbnROYW1lLCBDUERGX0ZvbnRFbmNvZGluZyogcEVuY29kaW5nKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QpOwotICAgIENQREZfQ29sb3JTcGFjZSogICAgICAgICAgICBHZXRDb2xvclNwYWNlKENQREZfT2JqZWN0KiBwQ1NPYmosIENQREZfRGljdGlvbmFyeSogcFJlc291cmNlcyk7Ci0gICAgQ1BERl9Db2xvclNwYWNlKiAgICAgICAgICAgIEdldENvcGllZENvbG9yU3BhY2UoQ1BERl9PYmplY3QqIHBDU09iaik7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIFJlbGVhc2VDb2xvclNwYWNlKENQREZfT2JqZWN0KiBwQ29sb3JTcGFjZSk7Ci0gICAgQ1BERl9QYXR0ZXJuKiAgICAgICAgICAgICAgIEdldFBhdHRlcm4oQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqLCBGWF9CT09MIGJTaGFkaW5nLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBtYXRyaXgpOwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICBSZWxlYXNlUGF0dGVybihDUERGX09iamVjdCogcFBhdHRlcm5PYmopOwotICAgIENQREZfSW1hZ2UqICAgICAgICAgICAgICAgICBHZXRJbWFnZShDUERGX09iamVjdCogcEltYWdlU3RyZWFtKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZUltYWdlKENQREZfT2JqZWN0KiBwSW1hZ2VTdHJlYW0pOwotICAgIENQREZfSWNjUHJvZmlsZSogICAgICAgICAgICBHZXRJY2NQcm9maWxlKENQREZfU3RyZWFtKiBwSWNjUHJvZmlsZVN0cmVhbSk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIFJlbGVhc2VJY2NQcm9maWxlKENQREZfU3RyZWFtKiBwSWNjUHJvZmlsZVN0cmVhbSwgQ1BERl9JY2NQcm9maWxlKiBwSWNjUHJvZmlsZSk7Ci0gICAgQ1BERl9TdHJlYW1BY2MqICAgICAgICAgICAgIEdldEZvbnRGaWxlU3RyZWFtQWNjKENQREZfU3RyZWFtKiBwRm9udFN0cmVhbSk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIFJlbGVhc2VGb250RmlsZVN0cmVhbUFjYyhDUERGX1N0cmVhbSogcEZvbnRTdHJlYW0sIEZYX0JPT0wgYkZvcmNlID0gRkFMU0UpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICBJc0ZvcmNlQ2xlYXIoKSBjb25zdCB7cmV0dXJuIG1fYkZvcmNlQ2xlYXI7fQotICAgIENQREZfQ291bnRlZENvbG9yU3BhY2UqICAgICBGaW5kQ29sb3JTcGFjZVB0cihDUERGX09iamVjdCogcENTT2JqKSBjb25zdDsKLSAgICBDUERGX0NvdW50ZWRQYXR0ZXJuKiAgICAgICAgRmluZFBhdHRlcm5QdHIoQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqKSBjb25zdDsKK2NsYXNzIENQREZfRG9jUGFnZURhdGEgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1BERl9Eb2NQYWdlRGF0YShDUERGX0RvY3VtZW50KiBwUERGRG9jKTsKKyAgfkNQREZfRG9jUGFnZURhdGEoKTsKIAotICAgIENQREZfRG9jdW1lbnQqICAgICAgICAgICAgICBtX3BQREZEb2M7Ci0gICAgQ1BERl9Gb250TWFwICAgICAgICAgICAgICAgIG1fRm9udE1hcDsKLSAgICBDUERGX0NvbG9yU3BhY2VNYXAgICAgICAgICAgbV9Db2xvclNwYWNlTWFwOwotICAgIENQREZfUGF0dGVybk1hcCAgICAgICAgICAgICBtX1BhdHRlcm5NYXA7Ci0gICAgQ1BERl9JbWFnZU1hcCAgICAgICAgICAgICAgIG1fSW1hZ2VNYXA7Ci0gICAgQ1BERl9JY2NQcm9maWxlTWFwICAgICAgICAgIG1fSWNjUHJvZmlsZU1hcDsKLSAgICBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyICAgICAgbV9IYXNoUHJvZmlsZU1hcDsKLSAgICBDUERGX0ZvbnRGaWxlTWFwICAgICAgICAgICAgbV9Gb250RmlsZU1hcDsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgbV9iRm9yY2VDbGVhcjsKKyAgdm9pZCBDbGVhcihGWF9CT09MIGJSZWxlYXNlID0gRkFMU0UpOworICBDUERGX0ZvbnQqIEdldEZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QsIEZYX0JPT0wgZmluZE9ubHkpOworICBDUERGX0ZvbnQqIEdldFN0YW5kYXJkRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZvbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnRFbmNvZGluZyogcEVuY29kaW5nKTsKKyAgdm9pZCBSZWxlYXNlRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCk7CisgIENQREZfQ29sb3JTcGFjZSogR2V0Q29sb3JTcGFjZShDUERGX09iamVjdCogcENTT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzb3VyY2VzKTsKKyAgQ1BERl9Db2xvclNwYWNlKiBHZXRDb3BpZWRDb2xvclNwYWNlKENQREZfT2JqZWN0KiBwQ1NPYmopOworICB2b2lkIFJlbGVhc2VDb2xvclNwYWNlKENQREZfT2JqZWN0KiBwQ29sb3JTcGFjZSk7CisgIENQREZfUGF0dGVybiogR2V0UGF0dGVybihDUERGX09iamVjdCogcFBhdHRlcm5PYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGFkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4KTsKKyAgdm9pZCBSZWxlYXNlUGF0dGVybihDUERGX09iamVjdCogcFBhdHRlcm5PYmopOworICBDUERGX0ltYWdlKiBHZXRJbWFnZShDUERGX09iamVjdCogcEltYWdlU3RyZWFtKTsKKyAgdm9pZCBSZWxlYXNlSW1hZ2UoQ1BERl9PYmplY3QqIHBJbWFnZVN0cmVhbSk7CisgIENQREZfSWNjUHJvZmlsZSogR2V0SWNjUHJvZmlsZShDUERGX1N0cmVhbSogcEljY1Byb2ZpbGVTdHJlYW0pOworICB2b2lkIFJlbGVhc2VJY2NQcm9maWxlKENQREZfSWNjUHJvZmlsZSogcEljY1Byb2ZpbGUpOworICBDUERGX1N0cmVhbUFjYyogR2V0Rm9udEZpbGVTdHJlYW1BY2MoQ1BERl9TdHJlYW0qIHBGb250U3RyZWFtKTsKKyAgdm9pZCBSZWxlYXNlRm9udEZpbGVTdHJlYW1BY2MoQ1BERl9TdHJlYW0qIHBGb250U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGb3JjZSA9IEZBTFNFKTsKKyAgRlhfQk9PTCBJc0ZvcmNlQ2xlYXIoKSBjb25zdCB7IHJldHVybiBtX2JGb3JjZUNsZWFyOyB9CisgIENQREZfQ291bnRlZENvbG9yU3BhY2UqIEZpbmRDb2xvclNwYWNlUHRyKENQREZfT2JqZWN0KiBwQ1NPYmopIGNvbnN0OworICBDUERGX0NvdW50ZWRQYXR0ZXJuKiBGaW5kUGF0dGVyblB0cihDUERGX09iamVjdCogcFBhdHRlcm5PYmopIGNvbnN0OworCisgcHJpdmF0ZToKKyAgdXNpbmcgQ1BERl9Db3VudGVkRm9udCA9IENQREZfQ291bnRlZE9iamVjdDxDUERGX0ZvbnQ+OworICB1c2luZyBDUERGX0NvdW50ZWRJY2NQcm9maWxlID0gQ1BERl9Db3VudGVkT2JqZWN0PENQREZfSWNjUHJvZmlsZT47CisgIHVzaW5nIENQREZfQ291bnRlZEltYWdlID0gQ1BERl9Db3VudGVkT2JqZWN0PENQREZfSW1hZ2U+OworICB1c2luZyBDUERGX0NvdW50ZWRTdHJlYW1BY2MgPSBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9TdHJlYW1BY2M+OworCisgIHVzaW5nIENQREZfQ29sb3JTcGFjZU1hcCA9IHN0ZDo6bWFwPENQREZfT2JqZWN0KiwgQ1BERl9Db3VudGVkQ29sb3JTcGFjZSo+OworICB1c2luZyBDUERGX0ZvbnRGaWxlTWFwID0gc3RkOjptYXA8Q1BERl9TdHJlYW0qLCBDUERGX0NvdW50ZWRTdHJlYW1BY2MqPjsKKyAgdXNpbmcgQ1BERl9Gb250TWFwID0gc3RkOjptYXA8Q1BERl9EaWN0aW9uYXJ5KiwgQ1BERl9Db3VudGVkRm9udCo+OworICB1c2luZyBDUERGX0ljY1Byb2ZpbGVNYXAgPSBzdGQ6Om1hcDxDUERGX1N0cmVhbSosIENQREZfQ291bnRlZEljY1Byb2ZpbGUqPjsKKyAgdXNpbmcgQ1BERl9JbWFnZU1hcCA9IHN0ZDo6bWFwPEZYX0RXT1JELCBDUERGX0NvdW50ZWRJbWFnZSo+OworICB1c2luZyBDUERGX1BhdHRlcm5NYXAgPSBzdGQ6Om1hcDxDUERGX09iamVjdCosIENQREZfQ291bnRlZFBhdHRlcm4qPjsKKworICBDUERGX0RvY3VtZW50KiBjb25zdCBtX3BQREZEb2M7CisgIEZYX0JPT0wgbV9iRm9yY2VDbGVhcjsKKyAgc3RkOjptYXA8Q0ZYX0J5dGVTdHJpbmcsIENQREZfU3RyZWFtKj4gbV9IYXNoUHJvZmlsZU1hcDsKKyAgQ1BERl9Db2xvclNwYWNlTWFwIG1fQ29sb3JTcGFjZU1hcDsKKyAgQ1BERl9Gb250RmlsZU1hcCBtX0ZvbnRGaWxlTWFwOworICBDUERGX0ZvbnRNYXAgbV9Gb250TWFwOworICBDUERGX0ljY1Byb2ZpbGVNYXAgbV9JY2NQcm9maWxlTWFwOworICBDUERGX0ltYWdlTWFwIG1fSW1hZ2VNYXA7CisgIENQREZfUGF0dGVybk1hcCBtX1BhdHRlcm5NYXA7CiB9OwotY2xhc3MgQ1BERl9GdW5jdGlvbiAKLXsKLXB1YmxpYzoKLSAgICBzdGF0aWMgQ1BERl9GdW5jdGlvbioJTG9hZChDUERGX09iamVjdCogcEZ1bmNPYmopOwotICAgIHZpcnR1YWwgfkNQREZfRnVuY3Rpb24oKTsKLSAgICBGWF9CT09MCQlDYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIGludCBuaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cywgaW50JiBucmVzdWx0cykgY29uc3Q7Ci0gICAgaW50CQkJQ291bnRJbnB1dHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbklucHV0czsKLSAgICB9Ci0gICAgaW50CQkJQ291bnRPdXRwdXRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX25PdXRwdXRzOwotICAgIH0KLXByb3RlY3RlZDoKLSAgICBDUERGX0Z1bmN0aW9uKCk7Ci0gICAgaW50CQkJbV9uSW5wdXRzLCBtX25PdXRwdXRzOwotICAgIEZYX0ZMT0FUKgltX3BEb21haW5zOwotICAgIEZYX0ZMT0FUKgltX3BSYW5nZXM7Ci0gICAgRlhfQk9PTAkJSW5pdChDUERGX09iamVjdCogcE9iaik7Ci0gICAgdmlydHVhbCBGWF9CT09MCXZfSW5pdChDUERGX09iamVjdCogcE9iaikgPSAwOwotICAgIHZpcnR1YWwgRlhfQk9PTAl2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0ID0gMDsKKworY2xhc3MgQ1BERl9GdW5jdGlvbiB7CisgcHVibGljOgorICBzdGF0aWMgQ1BERl9GdW5jdGlvbiogTG9hZChDUERGX09iamVjdCogcEZ1bmNPYmopOworICB2aXJ0dWFsIH5DUERGX0Z1bmN0aW9uKCk7CisgIEZYX0JPT0wgQ2FsbChGWF9GTE9BVCogaW5wdXRzLAorICAgICAgICAgICAgICAgaW50IG5pbnB1dHMsCisgICAgICAgICAgICAgICBGWF9GTE9BVCogcmVzdWx0cywKKyAgICAgICAgICAgICAgIGludCYgbnJlc3VsdHMpIGNvbnN0OworICBpbnQgQ291bnRJbnB1dHMoKSB7IHJldHVybiBtX25JbnB1dHM7IH0KKyAgaW50IENvdW50T3V0cHV0cygpIHsgcmV0dXJuIG1fbk91dHB1dHM7IH0KKworIHByb3RlY3RlZDoKKyAgQ1BERl9GdW5jdGlvbigpOworICBpbnQgbV9uSW5wdXRzLCBtX25PdXRwdXRzOworICBGWF9GTE9BVCogbV9wRG9tYWluczsKKyAgRlhfRkxPQVQqIG1fcFJhbmdlczsKKyAgRlhfQk9PTCBJbml0KENQREZfT2JqZWN0KiBwT2JqKTsKKyAgdmlydHVhbCBGWF9CT09MIHZfSW5pdChDUERGX09iamVjdCogcE9iaikgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgdl9DYWxsKEZYX0ZMT0FUKiBpbnB1dHMsIEZYX0ZMT0FUKiByZXN1bHRzKSBjb25zdCA9IDA7CiB9OwotY2xhc3MgQ1BERl9JY2NQcm9maWxlIAotewotcHVibGljOgotICAgIENQREZfSWNjUHJvZmlsZShGWF9MUENCWVRFIHBEYXRhLCBGWF9EV09SRCBkd1NpemUpOwotICAgIH5DUERGX0ljY1Byb2ZpbGUoKTsKLSAgICBGWF9JTlQzMiBHZXRDb21wb25lbnRzKCkgY29uc3QgeyByZXR1cm4gbV9uU3JjQ29tcG9uZW50czsgfQotICAgIEZYX0JPT0wJCQkJCW1fYnNSR0I7Ci0gICAgRlhfTFBWT0lECQkJCW1fcFRyYW5zZm9ybTsKLXByaXZhdGU6Ci0gICAgRlhfSU5UMzIgICAgICAgICAgICAgICAgbV9uU3JjQ29tcG9uZW50czsKK2NsYXNzIENQREZfSWNjUHJvZmlsZSB7CisgcHVibGljOgorICBDUERGX0ljY1Byb2ZpbGUoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3U2l6ZSk7CisgIH5DUERGX0ljY1Byb2ZpbGUoKTsKKyAgaW50MzJfdCBHZXRDb21wb25lbnRzKCkgY29uc3QgeyByZXR1cm4gbV9uU3JjQ29tcG9uZW50czsgfQorICBGWF9CT09MIG1fYnNSR0I7CisgIHZvaWQqIG1fcFRyYW5zZm9ybTsKKworIHByaXZhdGU6CisgIGludDMyX3QgbV9uU3JjQ29tcG9uZW50czsKIH07Ci1jbGFzcyBDUERGX0RldmljZUNTIDogcHVibGljIENQREZfQ29sb3JTcGFjZQotewotcHVibGljOgotICAgIENQREZfRGV2aWNlQ1MoaW50IGZhbWlseSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCUdldFJHQihGWF9GTE9BVCogcEJ1ZiwgRlhfRkxPQVQmIFIsIEZYX0ZMT0FUJiBHLCBGWF9GTE9BVCYgQikgY29uc3Q7Ci0gICAgRlhfQk9PTAlTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0OwotICAgIEZYX0JPT0wJdl9HZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLCBGWF9GTE9BVCYgYywgRlhfRkxPQVQmIG0sIEZYX0ZMT0FUJiB5LCBGWF9GTE9BVCYgaykgY29uc3Q7Ci0gICAgRlhfQk9PTAl2X1NldENNWUsoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIGMsIEZYX0ZMT0FUIG0sIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIGspIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZAlUcmFuc2xhdGVJbWFnZUxpbmUoRlhfTFBCWVRFIHBEZXN0QnVmLCBGWF9MUENCWVRFIHBTcmNCdWYsIGludCBwaXhlbHMsIGludCBpbWFnZV93aWR0aCwgaW50IGltYWdlX2hlaWdodCwgRlhfQk9PTCBiVHJhbnNNYXNrID0gRkFMU0UpIGNvbnN0OworCitjbGFzcyBDUERGX0RldmljZUNTIDogcHVibGljIENQREZfQ29sb3JTcGFjZSB7CisgcHVibGljOgorICBDUERGX0RldmljZUNTKENQREZfRG9jdW1lbnQqIHBEb2MsIGludCBmYW1pbHkpOworCisgIEZYX0JPT0wgR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgUiwKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKKyAgRlhfQk9PTCBTZXRSR0IoRlhfRkxPQVQqIHBCdWYsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIFIsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEcsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEIpIGNvbnN0IG92ZXJyaWRlOworICBGWF9CT09MIHZfR2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGMsCisgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBtLAorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgeSwKKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGspIGNvbnN0IG92ZXJyaWRlOworICBGWF9CT09MIHZfU2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYywKKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbSwKKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSwKKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaykgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgVHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwU3JjQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2Vfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRyYW5zTWFzayA9IEZBTFNFKSBjb25zdCBvdmVycmlkZTsKIH07Ci1jbGFzcyBDUERGX1BhdHRlcm5DUyA6IHB1YmxpYyBDUERGX0NvbG9yU3BhY2UKLXsKLXB1YmxpYzoKLSAgICBDUERGX1BhdHRlcm5DUygpOwotICAgIH5DUERGX1BhdHRlcm5DUygpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlHZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpIGNvbnN0OwotICAgIHZpcnR1YWwgQ1BERl9Db2xvclNwYWNlKglHZXRCYXNlQ1MoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEJhc2VDUzsKLSAgICB9Ci0gICAgQ1BERl9Db2xvclNwYWNlKgltX3BCYXNlQ1M7Ci0gICAgQ1BERl9Db3VudGVkQ29sb3JTcGFjZSoJbV9wQ291bnRlZEJhc2VDUzsKKworY2xhc3MgQ1BERl9QYXR0ZXJuQ1MgOiBwdWJsaWMgQ1BERl9Db2xvclNwYWNlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENQREZfUGF0dGVybkNTKENQREZfRG9jdW1lbnQqIHBEb2MpCisgICAgICA6IENQREZfQ29sb3JTcGFjZShwRG9jLCBQREZDU19QQVRURVJOLCAxKSwKKyAgICAgICAgbV9wQmFzZUNTKG51bGxwdHIpLAorICAgICAgICBtX3BDb3VudGVkQmFzZUNTKG51bGxwdHIpIHt9CisgIH5DUERGX1BhdHRlcm5DUygpIG92ZXJyaWRlOworICBGWF9CT09MIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOworICBGWF9CT09MIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBHLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7CisgIENQREZfQ29sb3JTcGFjZSogR2V0QmFzZUNTKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBDUERGX0NvbG9yU3BhY2UqIG1fcEJhc2VDUzsKKyAgQ1BERl9Db3VudGVkQ29sb3JTcGFjZSogbV9wQ291bnRlZEJhc2VDUzsKIH07Ci0jZGVmaW5lCU1BWF9QQUdFX09CSkVDVFNfVU5JRllfTkFNSU5HCQkJCTQwOTYKLWNsYXNzIENQREZfUmVzb3VyY2VOYW1pbmcgCi17Ci1wdWJsaWM6Ci0gICAgc3RydWN0IF9OYW1pbmdTdGF0ZSAgewotICAgICAgICBDRlhfQnl0ZVN0cmluZwltX1ByZWZpeDsKLSAgICAgICAgaW50CQkJCW1fbkluZGV4OwotICAgIH07Ci0gICAgfkNQREZfUmVzb3VyY2VOYW1pbmcoKTsKLSAgICBDRlhfQnl0ZVN0cmluZwkJR2V0TmFtZShjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBSZXNMaXN0LCBGWF9MUENTVFIgc3pUeXBlKTsKLXByb3RlY3RlZDoKLSAgICBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyCW1fTmFtaW5nQ2FjaGU7Ci19OworCit2b2lkIFBERl9SZXBsYWNlQWJicihDUERGX09iamVjdCogcE9iaik7CiAKICNlbmRpZiAgLy8gQ09SRV9TUkNfRlBERkFQSV9GUERGX1BBR0VfUEFHRUlOVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9maWx0ZXJzX2ludC5oIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9maWx0ZXJzX2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTM5MzcxLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZmlsdGVyc19pbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfU1JDX0ZQREZBUElfRlBERl9QQVJTRVJfRklMVEVSU19JTlRfSF8KLSNkZWZpbmUgQ09SRV9TUkNfRlBERkFQSV9GUERGX1BBUlNFUl9GSUxURVJTX0lOVF9IXwotCi1jbGFzcyBDUERGX0RlY3J5cHRGaWx0ZXIgOiBwdWJsaWMgQ0ZYX0RhdGFGaWx0ZXIKLXsKLXB1YmxpYzoKLSAgICBDUERGX0RlY3J5cHRGaWx0ZXIoQ1BERl9DcnlwdG9IYW5kbGVyKiBwQ3J5cHRvSGFuZGxlciwgRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0pOwotICAgIHZpcnR1YWwgfkNQREZfRGVjcnlwdEZpbHRlcigpOwotICAgIHZpcnR1YWwJdm9pZAl2X0ZpbHRlckluKEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKTsKLSAgICB2aXJ0dWFsIHZvaWQJdl9GaWx0ZXJGaW5pc2goQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOwotICAgIENQREZfQ3J5cHRvSGFuZGxlcioJbV9wQ3J5cHRvSGFuZGxlcjsKLSAgICBGWF9MUFZPSUQJCW1fcENvbnRleHQ7Ci0gICAgRlhfRFdPUkQJCW1fT2JqTnVtLCBtX0dlbk51bTsKLX07Ci1jbGFzcyBDUERGX0ZsYXRlRmlsdGVyIDogcHVibGljIENGWF9EYXRhRmlsdGVyCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9GbGF0ZUZpbHRlcigpOwotICAgIHZpcnR1YWwgfkNQREZfRmxhdGVGaWx0ZXIoKTsKLSAgICB2aXJ0dWFsCXZvaWQJdl9GaWx0ZXJJbihGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7Ci0gICAgdmlydHVhbCB2b2lkCXZfRmlsdGVyRmluaXNoKENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSB7fQotICAgIHZvaWQqCQkJbV9wQ29udGV4dDsKLSAgICBGWF9CWVRFCQkJbV9EZXN0QnVmZmVyW0ZQREZfRklMVEVSX0JVRkZFUl9TSVpFXTsKLX07Ci1jbGFzcyBDUERGX0x6d0ZpbHRlciA6IHB1YmxpYyBDRlhfRGF0YUZpbHRlcgotewotcHVibGljOgotICAgIENQREZfTHp3RmlsdGVyKEZYX0JPT0wgYkVhcmx5Q2hhbmdlKTsKLSAgICB2aXJ0dWFsIH5DUERGX0x6d0ZpbHRlcigpIHt9Ci0gICAgdmlydHVhbAl2b2lkCXZfRmlsdGVySW4oRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOwotICAgIHZpcnR1YWwgdm9pZAl2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zikge30KLSAgICBGWF9CT09MCQkJbV9iRWFybHlDaGFuZ2U7Ci0gICAgRlhfRFdPUkQJCW1fQ29kZUFycmF5WzUwMjFdOwotICAgIEZYX0RXT1JECQltX25Db2RlczsKLSAgICBGWF9EV09SRAkJbV9Db2RlTGVuOwotICAgIEZYX0RXT1JECQltX09sZENvZGU7Ci0gICAgRlhfQllURQkJCW1fTGFzdENoYXI7Ci0gICAgRlhfRFdPUkQJCW1fbkxlZnRCaXRzLCBtX0xlZnRCaXRzOwotICAgIEZYX0JZVEUJCQltX0RlY29kZVN0YWNrWzQwMDBdOwotICAgIEZYX0RXT1JECQltX1N0YWNrTGVuOwotICAgIHZvaWQJCQlBZGRDb2RlKEZYX0RXT1JEIHByZWZpeF9jb2RlLCBGWF9CWVRFIGFwcGVuZF9jaGFyKTsKLSAgICB2b2lkCQkJRGVjb2RlU3RyaW5nKEZYX0RXT1JEIGNvZGUpOwotfTsKLWNsYXNzIENQREZfUHJlZGljdG9yRmlsdGVyIDogcHVibGljIENGWF9EYXRhRmlsdGVyCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9QcmVkaWN0b3JGaWx0ZXIoaW50IHByZWRpY3RvciwgaW50IGNvbG9ycywgaW50IGJwYywgaW50IGNvbHMpOwotICAgIHZpcnR1YWwgfkNQREZfUHJlZGljdG9yRmlsdGVyKCk7Ci0gICAgdmlydHVhbAl2b2lkCXZfRmlsdGVySW4oRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOwotICAgIHZpcnR1YWwgdm9pZAl2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zikge30KLSAgICBGWF9CT09MCQkJbV9iVGlmZjsKLSAgICBGWF9EV09SRAkJbV9QaXRjaCwgbV9CcHA7Ci0gICAgRlhfTFBCWVRFCQltX3BSZWZMaW5lLCBtX3BDdXJMaW5lOwotICAgIEZYX0RXT1JECQltX2lMaW5lLCBtX0xpbmVJblNpemU7Ci19OwotY2xhc3MgQ1BERl9Bc2NpaUhleEZpbHRlciA6IHB1YmxpYyBDRlhfRGF0YUZpbHRlcgotewotcHVibGljOgotICAgIENQREZfQXNjaWlIZXhGaWx0ZXIoKTsKLSAgICB2aXJ0dWFsIH5DUERGX0FzY2lpSGV4RmlsdGVyKCkge30KLSAgICB2aXJ0dWFsCXZvaWQJdl9GaWx0ZXJJbihGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7Ci0gICAgdmlydHVhbCB2b2lkCXZfRmlsdGVyRmluaXNoKENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSB7fQotICAgIGludAkJCQltX1N0YXRlOwotICAgIGludAkJCQltX0ZpcnN0RGlnaXQ7Ci19OwotY2xhc3MgQ1BERl9Bc2NpaTg1RmlsdGVyIDogcHVibGljIENGWF9EYXRhRmlsdGVyCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9Bc2NpaTg1RmlsdGVyKCk7Ci0gICAgdmlydHVhbCB+Q1BERl9Bc2NpaTg1RmlsdGVyKCkge30KLSAgICB2aXJ0dWFsCXZvaWQJdl9GaWx0ZXJJbihGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7Ci0gICAgdmlydHVhbCB2b2lkCXZfRmlsdGVyRmluaXNoKENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKSB7fQotICAgIGludAkJCQltX1N0YXRlOwotICAgIGludAkJCQltX0NoYXJDb3VudDsKLSAgICBGWF9EV09SRAkJbV9DdXJEV29yZDsKLX07Ci1jbGFzcyBDUERGX1J1bkxlbkZpbHRlciA6IHB1YmxpYyBDRlhfRGF0YUZpbHRlcgotewotcHVibGljOgotICAgIENQREZfUnVuTGVuRmlsdGVyKCk7Ci0gICAgdmlydHVhbCB+Q1BERl9SdW5MZW5GaWx0ZXIoKSB7fQotICAgIHZpcnR1YWwJdm9pZAl2X0ZpbHRlckluKEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKTsKLSAgICB2aXJ0dWFsIHZvaWQJdl9GaWx0ZXJGaW5pc2goQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpIHt9Ci0gICAgaW50CQkJCW1fU3RhdGU7Ci0gICAgRlhfRFdPUkQJCW1fQ291bnQ7Ci19OwotY2xhc3MgQ1BERl9KcGVnRmlsdGVyIDogcHVibGljIENGWF9EYXRhRmlsdGVyCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9KcGVnRmlsdGVyKCk7Ci0gICAgdmlydHVhbCB+Q1BERl9KcGVnRmlsdGVyKCk7Ci0gICAgdmlydHVhbAl2b2lkCXZfRmlsdGVySW4oRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOwotICAgIHZpcnR1YWwgdm9pZAl2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zikge30KLSAgICB2b2lkKgkJCW1fcENvbnRleHQ7Ci0gICAgQ0ZYX0JpbmFyeUJ1ZgltX0lucHV0QnVmOwotICAgIEZYX0xQQllURQkJbV9wU2NhbmxpbmU7Ci0gICAgaW50CQkJCW1fUGl0Y2gsIG1fSGVpZ2h0LCBtX1dpZHRoLCBtX25Db21wcywgbV9pTGluZTsKLSAgICBGWF9CT09MCQkJbV9iR290SGVhZGVyOwotfTsKLWNsYXNzIENQREZfRmF4RmlsdGVyIDogcHVibGljIENGWF9EYXRhRmlsdGVyCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9GYXhGaWx0ZXIoKTsKLSAgICB2aXJ0dWFsIH5DUERGX0ZheEZpbHRlcigpOwotICAgIEZYX0JPT0wJCQlJbml0aWFsaXplKGludCBFbmNvZGluZywgaW50IGJFbmRPZkxpbmUsIGludCBiQnl0ZUFsaWduLCBpbnQgYkJsYWNrLCBpbnQgblJvd3MsIGludCBuQ29sdW1ucyk7Ci0gICAgdmlydHVhbAl2b2lkCXZfRmlsdGVySW4oRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpOwotICAgIHZpcnR1YWwgdm9pZAl2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7Ci0gICAgaW50CQkJCW1fRW5jb2RpbmcsIG1fYkVuZE9mTGluZSwgbV9iQnl0ZUFsaWduLCBtX2JCbGFjazsKLSAgICBpbnQJCQkJbV9uUm93cywgbV9uQ29sdW1ucywgbV9QaXRjaCwgbV9pUm93OwotICAgIEZYX0xQQllURQkJbV9wU2NhbmxpbmVCdWYsIG1fcFJlZkJ1ZjsKLSAgICBDRlhfQmluYXJ5QnVmCW1fSW5wdXRCdWY7Ci0gICAgaW50CQkJCW1fSW5wdXRCaXRQb3M7Ci0gICAgdm9pZAkJCVByb2Nlc3NEYXRhKEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCYgYml0cG9zLCBGWF9CT09MIGJGaW5pc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKTsKLSAgICBGWF9CT09MCQkJUmVhZExpbmUoRlhfTFBDQllURSBzcmNfYnVmLCBpbnQgYml0c2l6ZSwgaW50JiBiaXRwb3MpOwotfTsKLQotI2VuZGlmICAvLyBDT1JFX1NSQ19GUERGQVBJX0ZQREZfUEFSU0VSX0ZJTFRFUlNfSU5UX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZS5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZS5jcHAKaW5kZXggZDE4Y2FhYi4uZDc3ODNlNCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGUuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlLmNwcApAQCAtNCw1MjUgKzQsNTcyIEBACiAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYXJzZXIuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCIKICNpbmNsdWRlIDxsaW1pdHMuaD4KLSNkZWZpbmUgX1NUUkVBTV9NQVhfU0laRV8JCTIwICogMTAyNCAqIDEwMjQKLUZYX0RXT1JEIF9BODVEZWNvZGUoY29uc3QgRlhfQllURSogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIEZYX0xQQllURSYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpCi17Ci0gICAgZGVzdF9zaXplID0gMDsKLSAgICBkZXN0X2J1ZiA9IE5VTEw7Ci0gICAgaWYgKHNyY19zaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIEZYX0RXT1JEIHpjb3VudCA9IDA7Ci0gICAgRlhfRFdPUkQgcG9zID0gMDsKLSAgICB3aGlsZSAocG9zIDwgc3JjX3NpemUpIHsKLSAgICAgICAgRlhfQllURSBjaCA9IHNyY19idWZbcG9zXTsKLSAgICAgICAgaWYgKGNoIDwgJyEnICYmIGNoICE9ICdcbicgJiYgY2ggIT0gJ1xyJyAmJiBjaCAhPSAnICcgJiYgY2ggIT0gJ1x0JykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoID09ICd6JykgewotICAgICAgICAgICAgemNvdW50ICsrOwotICAgICAgICB9IGVsc2UgaWYgKGNoID4gJ3UnKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBwb3MgKys7Ci0gICAgfQotICAgIGlmIChwb3MgPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKHpjb3VudCA+IFVJTlRfTUFYIC8gNCkgewotICAgICAgICByZXR1cm4gKEZYX0RXT1JEKSAtIDE7Ci0gICAgfQotICAgIGlmICh6Y291bnQgKiA0ID4gVUlOVF9NQVggLSAocG9zIC0gemNvdW50KSkgewotICAgICAgICByZXR1cm4gKEZYX0RXT1JEKSAtIDE7Ci0gICAgfQotICAgIGRlc3RfYnVmID0gRlhfQWxsb2MoRlhfQllURSwgemNvdW50ICogNCArIChwb3MgLSB6Y291bnQpKTsKLSAgICBpbnQgc3RhdGUgPSAwOwotICAgIEZYX1VJTlQzMiByZXMgPSAwOwotICAgIHBvcyA9IGRlc3Rfc2l6ZSA9IDA7Ci0gICAgd2hpbGUgKHBvcyA8IHNyY19zaXplKSB7Ci0gICAgICAgIEZYX0JZVEUgY2ggPSBzcmNfYnVmW3BvcysrXTsKLSAgICAgICAgaWYgKGNoID09ICdcbicgfHwgY2ggPT0gJ1xyJyB8fCBjaCA9PSAnICcgfHwgY2ggPT0gJ1x0JykgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoID09ICd6JykgewotICAgICAgICAgICAgRlhTWVNfbWVtc2V0MzIoZGVzdF9idWYgKyBkZXN0X3NpemUsIDAsIDQpOwotICAgICAgICAgICAgc3RhdGUgPSAwOwotICAgICAgICAgICAgcmVzID0gMDsKLSAgICAgICAgICAgIGRlc3Rfc2l6ZSArPSA0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGNoIDwgJyEnIHx8IGNoID4gJ3UnKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXMgPSByZXMgKiA4NSArIGNoIC0gMzM7Ci0gICAgICAgICAgICBzdGF0ZSArKzsKLSAgICAgICAgICAgIGlmIChzdGF0ZSA9PSA1KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfYnVmW2Rlc3Rfc2l6ZSsrXSA9IChGWF9CWVRFKShyZXMgPj4gKDMgLSBpKSAqIDgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgcmVzID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoc3RhdGUpIHsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGZvciAoaSA9IHN0YXRlOyBpIDwgNTsgaSArKykgewotICAgICAgICAgICAgcmVzID0gcmVzICogODUgKyA4NDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RhdGUgLSAxOyBpICsrKSB7Ci0gICAgICAgICAgICBkZXN0X2J1ZltkZXN0X3NpemUrK10gPSAoRlhfQllURSkocmVzID4+ICgzIC0gaSkgKiA4KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocG9zIDwgc3JjX3NpemUgJiYgc3JjX2J1Zltwb3NdID09ICc+JykgewotICAgICAgICBwb3MgKys7Ci0gICAgfQotICAgIHJldHVybiBwb3M7Ci19Ci1GWF9EV09SRCBfSGV4RGVjb2RlKGNvbnN0IEZYX0JZVEUqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBGWF9MUEJZVEUmIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKQotewotICAgIEZYX0RXT1JEIGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IHNyY19zaXplOyBpICsrKQotICAgICAgICBpZiAoc3JjX2J1ZltpXSA9PSAnPicpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgZGVzdF9idWYgPSBGWF9BbGxvYyggRlhfQllURSwgaSAvIDIgKyAxKTsKLSAgICBkZXN0X3NpemUgPSAwOwotICAgIEZYX0JPT0wgYkZpcnN0RGlnaXQgPSBUUlVFOwotICAgIGZvciAoaSA9IDA7IGkgPCBzcmNfc2l6ZTsgaSArKykgewotICAgICAgICBGWF9CWVRFIGNoID0gc3JjX2J1ZltpXTsKLSAgICAgICAgaWYgKGNoID09ICcgJyB8fCBjaCA9PSAnXG4nIHx8IGNoID09ICdcdCcgfHwgY2ggPT0gJ1xyJykgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGRpZ2l0OwotICAgICAgICBpZiAoY2ggPD0gJzknICYmIGNoID49ICcwJykgewotICAgICAgICAgICAgZGlnaXQgPSBjaCAtICcwJzsKLSAgICAgICAgfSBlbHNlIGlmIChjaCA8PSAnZicgJiYgY2ggPj0gJ2EnKSB7Ci0gICAgICAgICAgICBkaWdpdCA9IGNoIC0gJ2EnICsgMTA7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2ggPD0gJ0YnICYmIGNoID49ICdBJykgewotICAgICAgICAgICAgZGlnaXQgPSBjaCAtICdBJyArIDEwOwotICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc+JykgewotICAgICAgICAgICAgaSArKzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJGaXJzdERpZ2l0KSB7Ci0gICAgICAgICAgICBkZXN0X2J1ZltkZXN0X3NpemVdID0gZGlnaXQgKiAxNjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlc3RfYnVmW2Rlc3Rfc2l6ZSArK10gKz0gZGlnaXQ7Ci0gICAgICAgIH0KLSAgICAgICAgYkZpcnN0RGlnaXQgPSAhYkZpcnN0RGlnaXQ7Ci0gICAgfQotICAgIGlmICghYkZpcnN0RGlnaXQpIHsKLSAgICAgICAgZGVzdF9zaXplICsrOwotICAgIH0KLSAgICByZXR1cm4gaTsKLX0KLUZYX0RXT1JEIFJ1bkxlbmd0aERlY29kZShjb25zdCBGWF9CWVRFKiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgRlhfTFBCWVRFJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkKLXsKLSAgICBGWF9EV09SRCBpID0gMDsKLSAgICBGWF9EV09SRCBvbGQ7Ci0gICAgZGVzdF9zaXplID0gMDsKLSAgICB3aGlsZSAoaSA8IHNyY19zaXplKSB7Ci0gICAgICAgIGlmIChzcmNfYnVmW2ldIDwgMTI4KSB7Ci0gICAgICAgICAgICBvbGQgPSBkZXN0X3NpemU7Ci0gICAgICAgICAgICBkZXN0X3NpemUgKz0gc3JjX2J1ZltpXSArIDE7Ci0gICAgICAgICAgICBpZiAoZGVzdF9zaXplIDwgb2xkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChGWF9EV09SRCkgLSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaSArPSBzcmNfYnVmW2ldICsgMjsKLSAgICAgICAgfSBlbHNlIGlmIChzcmNfYnVmW2ldID4gMTI4KSB7Ci0gICAgICAgICAgICBvbGQgPSBkZXN0X3NpemU7Ci0gICAgICAgICAgICBkZXN0X3NpemUgKz0gMjU3IC0gc3JjX2J1ZltpXTsKLSAgICAgICAgICAgIGlmIChkZXN0X3NpemUgPCBvbGQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEZYX0RXT1JEKSAtIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpICs9IDI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoZGVzdF9zaXplID49IF9TVFJFQU1fTUFYX1NJWkVfKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgZGVzdF9idWYgPSBGWF9BbGxvYyggRlhfQllURSwgZGVzdF9zaXplKTsKLSAgICBpID0gMDsKLSAgICBpbnQgZGVzdF9jb3VudCA9IDA7Ci0gICAgd2hpbGUgKGkgPCBzcmNfc2l6ZSkgewotICAgICAgICBpZiAoc3JjX2J1ZltpXSA8IDEyOCkgewotICAgICAgICAgICAgRlhfRFdPUkQgY29weV9sZW4gPSBzcmNfYnVmW2ldICsgMTsKLSAgICAgICAgICAgIEZYX0RXT1JEIGJ1Zl9sZWZ0ID0gc3JjX3NpemUgLSBpIC0gMTsKLSAgICAgICAgICAgIGlmIChidWZfbGVmdCA8IGNvcHlfbGVuKSB7Ci0gICAgICAgICAgICAgICAgRlhfRFdPUkQgZGVsdGEgPSBjb3B5X2xlbiAtIGJ1Zl9sZWZ0OwotICAgICAgICAgICAgICAgIGNvcHlfbGVuID0gYnVmX2xlZnQ7Ci0gICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0OChkZXN0X2J1ZiArIGRlc3RfY291bnQgKyBjb3B5X2xlbiwgJ1wwJywgZGVsdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIoZGVzdF9idWYgKyBkZXN0X2NvdW50LCBzcmNfYnVmICsgaSArIDEsIGNvcHlfbGVuKTsKLSAgICAgICAgICAgIGRlc3RfY291bnQgKz0gc3JjX2J1ZltpXSArIDE7Ci0gICAgICAgICAgICBpICs9IHNyY19idWZbaV0gKyAyOwotICAgICAgICB9IGVsc2UgaWYgKHNyY19idWZbaV0gPiAxMjgpIHsKLSAgICAgICAgICAgIGludCBmaWxsID0gMDsKLSAgICAgICAgICAgIGlmIChpIDwgc3JjX3NpemUgLSAxKSB7Ci0gICAgICAgICAgICAgICAgZmlsbCA9IHNyY19idWZbaSArIDFdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhTWVNfbWVtc2V0OChkZXN0X2J1ZiArIGRlc3RfY291bnQsIGZpbGwsIDI1NyAtIHNyY19idWZbaV0pOwotICAgICAgICAgICAgZGVzdF9jb3VudCArPSAyNTcgLSBzcmNfYnVmW2ldOwotICAgICAgICAgICAgaSArPSAyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlhfRFdPUkQgcmV0ID0gaSArIDE7Ci0gICAgaWYgKHJldCA+IHNyY19zaXplKSB7Ci0gICAgICAgIHJldCA9IHNyY19zaXplOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotSUNvZGVjX1NjYW5saW5lRGVjb2RlciogRlBERkFQSV9DcmVhdGVGYXhEZWNvZGVyKEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zKQotewotICAgIGludCBLID0gMDsKLSAgICBGWF9CT09MIEVuZE9mTGluZSA9IEZBTFNFOwotICAgIEZYX0JPT0wgQnl0ZUFsaWduID0gRkFMU0U7Ci0gICAgRlhfQk9PTCBCbGFja0lzMSA9IEZBTFNFOwotICAgIGludCBDb2x1bW5zID0gMTcyODsKLSAgICBpbnQgUm93cyA9IDA7Ci0gICAgaWYgKHBQYXJhbXMpIHsKLSAgICAgICAgSyA9IHBQYXJhbXMtPkdldEludGVnZXIoRlhfQlNUUkMoIksiKSk7Ci0gICAgICAgIEVuZE9mTGluZSA9IHBQYXJhbXMtPkdldEludGVnZXIoRlhfQlNUUkMoIkVuZE9mTGluZSIpKTsKLSAgICAgICAgQnl0ZUFsaWduID0gcFBhcmFtcy0+R2V0SW50ZWdlcihGWF9CU1RSQygiRW5jb2RlZEJ5dGVBbGlnbiIpKTsKLSAgICAgICAgQmxhY2tJczEgPSBwUGFyYW1zLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJCbGFja0lzMSIpKTsKLSAgICAgICAgQ29sdW1ucyA9IHBQYXJhbXMtPkdldEludGVnZXIoRlhfQlNUUkMoIkNvbHVtbnMiKSwgMTcyOCk7Ci0gICAgICAgIFJvd3MgPSBwUGFyYW1zLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJSb3dzIikpOwotICAgICAgICBpZiAoUm93cyA+IFVTSFJUX01BWCkgewotICAgICAgICAgICAgUm93cyA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKENvbHVtbnMgPD0gMCB8fCBSb3dzIDwgMCB8fCBDb2x1bW5zID4gVVNIUlRfTUFYIHx8IFJvd3MgPiBVU0hSVF9NQVgpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEZheE1vZHVsZSgpLT5DcmVhdGVEZWNvZGVyKHNyY19idWYsIHNyY19zaXplLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgSywgRW5kT2ZMaW5lLCBCeXRlQWxpZ24sIEJsYWNrSXMxLCBDb2x1bW5zLCBSb3dzKTsKLX0KLXN0YXRpYyBGWF9CT09MIENoZWNrRmxhdGVEZWNvZGVQYXJhbXMoaW50IENvbG9ycywgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zKQotewotICAgIGlmIChDb2x1bW5zIDwgMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGludCBjaGVjayA9IENvbHVtbnM7Ci0gICAgaWYgKENvbG9ycyA8IDAgfHwgKGNoZWNrID4gMCAmJiBDb2xvcnMgPiBJTlRfTUFYIC8gY2hlY2spKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgY2hlY2sgKj0gQ29sb3JzOwotICAgIGlmIChCaXRzUGVyQ29tcG9uZW50IDwgMCB8fAotICAgICAgICAgICAgKGNoZWNrID4gMCAmJiBCaXRzUGVyQ29tcG9uZW50ID4gSU5UX01BWCAvIGNoZWNrKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGNoZWNrICo9IEJpdHNQZXJDb21wb25lbnQ7Ci0gICAgaWYgKGNoZWNrID4gSU5UX01BWCAtIDcpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUlDb2RlY19TY2FubGluZURlY29kZXIqIEZQREZBUElfQ3JlYXRlRmxhdGVEZWNvZGVyKEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgaW50IG5Db21wcywgaW50IGJwYywgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zKQotewotICAgIGludCBwcmVkaWN0b3IgPSAwOwotICAgIGludCBDb2xvcnMgPSAwLCBCaXRzUGVyQ29tcG9uZW50ID0gMCwgQ29sdW1ucyA9IDA7Ci0gICAgaWYgKHBQYXJhbXMpIHsKLSAgICAgICAgcHJlZGljdG9yID0gKChDUERGX0RpY3Rpb25hcnkqKXBQYXJhbXMpLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJQcmVkaWN0b3IiKSk7Ci0gICAgICAgIENvbG9ycyA9IHBQYXJhbXMtPkdldEludGVnZXIoRlhfQlNUUkMoIkNvbG9ycyIpLCAxKTsKLSAgICAgICAgQml0c1BlckNvbXBvbmVudCA9IHBQYXJhbXMtPkdldEludGVnZXIoRlhfQlNUUkMoIkJpdHNQZXJDb21wb25lbnQiKSwgOCk7Ci0gICAgICAgIENvbHVtbnMgPSBwUGFyYW1zLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJDb2x1bW5zIiksIDEpOwotICAgICAgICBpZiAoIUNoZWNrRmxhdGVEZWNvZGVQYXJhbXMoQ29sb3JzLCBCaXRzUGVyQ29tcG9uZW50LCBDb2x1bW5zKSkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0RmxhdGVNb2R1bGUoKS0+Q3JlYXRlRGVjb2RlcihzcmNfYnVmLCBzcmNfc2l6ZSwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgIG5Db21wcywgYnBjLCBwcmVkaWN0b3IsIENvbG9ycywgQml0c1BlckNvbXBvbmVudCwgQ29sdW1ucyk7Ci19Ci1GWF9EV09SRCBGUERGQVBJX0ZsYXRlT3JMWldEZWNvZGUoRlhfQk9PTCBiTFpXLCBjb25zdCBGWF9CWVRFKiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGVzdGltYXRlZF9zaXplLCBGWF9MUEJZVEUmIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKQotewotICAgIGludCBwcmVkaWN0b3IgPSAwOwotICAgIEZYX0JPT0wgYkVhcmx5Q2hhbmdlID0gVFJVRTsKLSAgICBpbnQgQ29sb3JzID0gMCwgQml0c1BlckNvbXBvbmVudCA9IDAsIENvbHVtbnMgPSAwOwotICAgIGlmIChwUGFyYW1zKSB7Ci0gICAgICAgIHByZWRpY3RvciA9ICgoQ1BERl9EaWN0aW9uYXJ5KilwUGFyYW1zKS0+R2V0SW50ZWdlcihGWF9CU1RSQygiUHJlZGljdG9yIikpOwotICAgICAgICBiRWFybHlDaGFuZ2UgPSAoKENQREZfRGljdGlvbmFyeSopcFBhcmFtcyktPkdldEludGVnZXIoRlhfQlNUUkMoIkVhcmx5Q2hhbmdlIiksIDEpOwotICAgICAgICBDb2xvcnMgPSBwUGFyYW1zLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJDb2xvcnMiKSwgMSk7Ci0gICAgICAgIEJpdHNQZXJDb21wb25lbnQgPSBwUGFyYW1zLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJCaXRzUGVyQ29tcG9uZW50IiksIDgpOwotICAgICAgICBDb2x1bW5zID0gcFBhcmFtcy0+R2V0SW50ZWdlcihGWF9CU1RSQygiQ29sdW1ucyIpLCAxKTsKLSAgICAgICAgaWYgKCFDaGVja0ZsYXRlRGVjb2RlUGFyYW1zKENvbG9ycywgQml0c1BlckNvbXBvbmVudCwgQ29sdW1ucykpIHsKLSAgICAgICAgICAgIHJldHVybiAoRlhfRFdPUkQpIC0gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRGbGF0ZU1vZHVsZSgpLT5GbGF0ZU9yTFpXRGVjb2RlKGJMWlcsIHNyY19idWYsIHNyY19zaXplLAotICAgICAgICAgICAgYkVhcmx5Q2hhbmdlLCBwcmVkaWN0b3IsIENvbG9ycywgQml0c1BlckNvbXBvbmVudCwgQ29sdW1ucywgZXN0aW1hdGVkX3NpemUsCi0gICAgICAgICAgICBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKLX0KLUZYX0JPT0wgUERGX0RhdGFEZWNvZGUoRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBCWVRFJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSwgQ0ZYX0J5dGVTdHJpbmcmIEltYWdlRW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSomIHBJbWFnZVBhcm1zLCBGWF9EV09SRCBsYXN0X2VzdGltYXRlZF9zaXplLCBGWF9CT09MIGJJbWFnZUFjYykKIAotewotICAgIENQREZfT2JqZWN0KiBwRGVjb2RlciA9IHBEaWN0ID8gcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRmlsdGVyIikpIDogTlVMTDsKLSAgICBpZiAocERlY29kZXIgPT0gTlVMTCB8fCAocERlY29kZXItPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkgJiYgcERlY29kZXItPkdldFR5cGUoKSAhPSBQREZPQkpfTkFNRSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcFBhcmFtcyA9IHBEaWN0ID8gcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRGVjb2RlUGFybXMiKSkgOiBOVUxMOwotICAgIENGWF9CeXRlU3RyaW5nQXJyYXkgRGVjb2Rlckxpc3Q7Ci0gICAgQ0ZYX1B0ckFycmF5IFBhcmFtTGlzdDsKLSAgICBpZiAocERlY29kZXItPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgaWYgKHBQYXJhbXMgJiYgcFBhcmFtcy0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewotICAgICAgICAgICAgcFBhcmFtcyA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9BcnJheSogcERlY29kZXJzID0gKENQREZfQXJyYXkqKXBEZWNvZGVyOwotICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcERlY29kZXJzLT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0Mgc3RyID0gcERlY29kZXJzLT5HZXRDb25zdFN0cmluZyhpKTsKLSAgICAgICAgICAgIERlY29kZXJMaXN0LkFkZChzdHIpOwotICAgICAgICAgICAgaWYgKHBQYXJhbXMpIHsKLSAgICAgICAgICAgICAgICBQYXJhbUxpc3QuQWRkKCgoQ1BERl9BcnJheSopcFBhcmFtcyktPkdldERpY3QoaSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBQYXJhbUxpc3QuQWRkKE5VTEwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRGVjb2Rlckxpc3QuQWRkKHBEZWNvZGVyLT5HZXRDb25zdFN0cmluZygpKTsKLSAgICAgICAgUGFyYW1MaXN0LkFkZChwUGFyYW1zID8gcFBhcmFtcy0+R2V0RGljdCgpIDogTlVMTCk7Ci0gICAgfQotICAgIEZYX0xQQllURSBsYXN0X2J1ZiA9IChGWF9MUEJZVEUpc3JjX2J1ZjsKLSAgICBGWF9EV09SRCBsYXN0X3NpemUgPSBzcmNfc2l6ZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IERlY29kZXJMaXN0LkdldFNpemUoKTsgaSArKykgewotICAgICAgICBpbnQgZXN0aW1hdGVkX3NpemUgPSBpID09IERlY29kZXJMaXN0LkdldFNpemUoKSAtIDEgPyBsYXN0X2VzdGltYXRlZF9zaXplIDogMDsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZGVjb2RlciA9IERlY29kZXJMaXN0W2ldOwotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbSA9IChDUERGX0RpY3Rpb25hcnkqKVBhcmFtTGlzdFtpXTsKLSAgICAgICAgRlhfTFBCWVRFIG5ld19idWYgPSBOVUxMOwotICAgICAgICBGWF9EV09SRCBuZXdfc2l6ZSA9IChGWF9EV09SRCkgLSAxOwotICAgICAgICBpbnQgb2Zmc2V0ID0gLTE7Ci0gICAgICAgIGlmIChkZWNvZGVyID09IEZYX0JTVFJDKCJGbGF0ZURlY29kZSIpIHx8IGRlY29kZXIgPT0gRlhfQlNUUkMoIkZsIikpIHsKLSAgICAgICAgICAgIGlmIChiSW1hZ2VBY2MgJiYgaSA9PSBEZWNvZGVyTGlzdC5HZXRTaXplKCkgLSAxKSB7Ci0gICAgICAgICAgICAgICAgSW1hZ2VFbmNvZGluZyA9IEZYX0JTVFJDKCJGbGF0ZURlY29kZSIpOwotICAgICAgICAgICAgICAgIGRlc3RfYnVmID0gKEZYX0xQQllURSlsYXN0X2J1ZjsKLSAgICAgICAgICAgICAgICBkZXN0X3NpemUgPSBsYXN0X3NpemU7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGFybXMgPSBwUGFyYW07Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG9mZnNldCA9IEZQREZBUElfRmxhdGVPckxaV0RlY29kZShGQUxTRSwgbGFzdF9idWYsIGxhc3Rfc2l6ZSwgcFBhcmFtLCBlc3RpbWF0ZWRfc2l6ZSwgbmV3X2J1ZiwgbmV3X3NpemUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIkxaV0RlY29kZSIpIHx8IGRlY29kZXIgPT0gRlhfQlNUUkMoIkxaVyIpKSB7Ci0gICAgICAgICAgICBvZmZzZXQgPSBGUERGQVBJX0ZsYXRlT3JMWldEZWNvZGUoVFJVRSwgbGFzdF9idWYsIGxhc3Rfc2l6ZSwgcFBhcmFtLCBlc3RpbWF0ZWRfc2l6ZSwgbmV3X2J1ZiwgbmV3X3NpemUpOwotICAgICAgICB9IGVsc2UgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIkFTQ0lJODVEZWNvZGUiKSB8fCBkZWNvZGVyID09IEZYX0JTVFJDKCJBODUiKSkgewotICAgICAgICAgICAgb2Zmc2V0ID0gX0E4NURlY29kZShsYXN0X2J1ZiwgbGFzdF9zaXplLCBuZXdfYnVmLCBuZXdfc2l6ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiQVNDSUlIZXhEZWNvZGUiKSB8fCBkZWNvZGVyID09IEZYX0JTVFJDKCJBSHgiKSkgewotICAgICAgICAgICAgb2Zmc2V0ID0gX0hleERlY29kZShsYXN0X2J1ZiwgbGFzdF9zaXplLCBuZXdfYnVmLCBuZXdfc2l6ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiUnVuTGVuZ3RoRGVjb2RlIikgfHwgZGVjb2RlciA9PSBGWF9CU1RSQygiUkwiKSkgewotICAgICAgICAgICAgaWYgKGJJbWFnZUFjYyAmJiBpID09IERlY29kZXJMaXN0LkdldFNpemUoKSAtIDEpIHsKLSAgICAgICAgICAgICAgICBJbWFnZUVuY29kaW5nID0gRlhfQlNUUkMoIlJ1bkxlbmd0aERlY29kZSIpOwotICAgICAgICAgICAgICAgIGRlc3RfYnVmID0gKEZYX0xQQllURSlsYXN0X2J1ZjsKLSAgICAgICAgICAgICAgICBkZXN0X3NpemUgPSBsYXN0X3NpemU7Ci0gICAgICAgICAgICAgICAgcEltYWdlUGFybXMgPSBwUGFyYW07Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvZmZzZXQgPSBSdW5MZW5ndGhEZWNvZGUobGFzdF9idWYsIGxhc3Rfc2l6ZSwgbmV3X2J1ZiwgbmV3X3NpemUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIkRDVCIpKSB7Ci0gICAgICAgICAgICAgICAgZGVjb2RlciA9ICJEQ1REZWNvZGUiOwotICAgICAgICAgICAgfSBlbHNlIGlmIChkZWNvZGVyID09IEZYX0JTVFJDKCJDQ0YiKSkgewotICAgICAgICAgICAgICAgIGRlY29kZXIgPSAiQ0NJVFRGYXhEZWNvZGUiOwotICAgICAgICAgICAgfSBlbHNlIGlmIChkZWNvZGVyID09IEZYX0JTVFJDKCJDcnlwdCIpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJbWFnZUVuY29kaW5nID0gZGVjb2RlcjsKLSAgICAgICAgICAgIHBJbWFnZVBhcm1zID0gcFBhcmFtOwotICAgICAgICAgICAgZGVzdF9idWYgPSAoRlhfTFBCWVRFKWxhc3RfYnVmOwotICAgICAgICAgICAgZGVzdF9zaXplID0gbGFzdF9zaXplOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxhc3RfYnVmICE9IHNyY19idWYpIHsKLSAgICAgICAgICAgIEZYX0ZyZWUobGFzdF9idWYpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvZmZzZXQgPT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBsYXN0X2J1ZiA9IG5ld19idWY7Ci0gICAgICAgIGxhc3Rfc2l6ZSA9IG5ld19zaXplOwotICAgIH0KLSAgICBJbWFnZUVuY29kaW5nID0gIiI7Ci0gICAgcEltYWdlUGFybXMgPSBOVUxMOwotICAgIGRlc3RfYnVmID0gbGFzdF9idWY7Ci0gICAgZGVzdF9zaXplID0gbGFzdF9zaXplOwotICAgIHJldHVybiBUUlVFOwotfQotZXh0ZXJuIGNvbnN0IEZYX1dPUkQgUERGRG9jRW5jb2RpbmdbMjU2XSA9IHsKLSAgICAweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsIDB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywgMHgwMDA4LCAweDAwMDksCi0gICAgMHgwMDBhLCAweDAwMGIsIDB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwgMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLAotICAgIDB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywgMHgwMmQ4LCAweDAyYzcsIDB4MDJjNiwgMHgwMmQ5LCAweDAyZGQsIDB4MDJkYiwKLSAgICAweDAyZGEsIDB4MDJkYywgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCi0gICAgMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLCAweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsIDB4MDAzMCwgMHgwMDMxLAotICAgIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKLSAgICAweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsIDB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsCi0gICAgMHgwMDQ2LCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwgMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAotICAgIDB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAweDAwNTgsIDB4MDA1OSwKLSAgICAweDAwNWEsIDB4MDA1YiwgMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLCAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCi0gICAgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsIDB4MDA2YywgMHgwMDZkLAotICAgIDB4MDA2ZSwgMHgwMDZmLCAweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKLSAgICAweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsIDB4MDA3YywgMHgwMDdkLCAweDAwN2UsIDB4MDAwMCwgMHgyMDIyLCAweDIwMjAsCi0gICAgMHgyMDIxLCAweDIwMjYsIDB4MjAxNCwgMHgyMDEzLCAweDAxOTIsIDB4MjA0NCwgMHgyMDM5LCAweDIwM2EsIDB4MjIxMiwgMHgyMDMwLAotICAgIDB4MjAxZSwgMHgyMDFjLCAweDIwMWQsIDB4MjAxOCwgMHgyMDE5LCAweDIwMWEsIDB4MjEyMiwgMHhmYjAxLCAweGZiMDIsIDB4MDE0MSwKLSAgICAweDAxNTIsIDB4MDE2MCwgMHgwMTc4LCAweDAxN2QsIDB4MDEzMSwgMHgwMTQyLCAweDAxNTMsIDB4MDE2MSwgMHgwMTdlLCAweDAwMDAsCi0gICAgMHgyMGFjLCAweDAwYTEsIDB4MDBhMiwgMHgwMGEzLCAweDAwYTQsIDB4MDBhNSwgMHgwMGE2LCAweDAwYTcsIDB4MDBhOCwgMHgwMGE5LAotICAgIDB4MDBhYSwgMHgwMGFiLCAweDAwYWMsIDB4MDAwMCwgMHgwMGFlLCAweDAwYWYsIDB4MDBiMCwgMHgwMGIxLCAweDAwYjIsIDB4MDBiMywKLSAgICAweDAwYjQsIDB4MDBiNSwgMHgwMGI2LCAweDAwYjcsIDB4MDBiOCwgMHgwMGI5LCAweDAwYmEsIDB4MDBiYiwgMHgwMGJjLCAweDAwYmQsCi0gICAgMHgwMGJlLCAweDAwYmYsIDB4MDBjMCwgMHgwMGMxLCAweDAwYzIsIDB4MDBjMywgMHgwMGM0LCAweDAwYzUsIDB4MDBjNiwgMHgwMGM3LAotICAgIDB4MDBjOCwgMHgwMGM5LCAweDAwY2EsIDB4MDBjYiwgMHgwMGNjLCAweDAwY2QsIDB4MDBjZSwgMHgwMGNmLCAweDAwZDAsIDB4MDBkMSwKLSAgICAweDAwZDIsIDB4MDBkMywgMHgwMGQ0LCAweDAwZDUsIDB4MDBkNiwgMHgwMGQ3LCAweDAwZDgsIDB4MDBkOSwgMHgwMGRhLCAweDAwZGIsCi0gICAgMHgwMGRjLCAweDAwZGQsIDB4MDBkZSwgMHgwMGRmLCAweDAwZTAsIDB4MDBlMSwgMHgwMGUyLCAweDAwZTMsIDB4MDBlNCwgMHgwMGU1LAotICAgIDB4MDBlNiwgMHgwMGU3LCAweDAwZTgsIDB4MDBlOSwgMHgwMGVhLCAweDAwZWIsIDB4MDBlYywgMHgwMGVkLCAweDAwZWUsIDB4MDBlZiwKLSAgICAweDAwZjAsIDB4MDBmMSwgMHgwMGYyLCAweDAwZjMsIDB4MDBmNCwgMHgwMGY1LCAweDAwZjYsIDB4MDBmNywgMHgwMGY4LCAweDAwZjksCi0gICAgMHgwMGZhLCAweDAwZmIsIDB4MDBmYywgMHgwMGZkLCAweDAwZmUsIDB4MDBmZgotfTsKLUNGWF9XaWRlU3RyaW5nIFBERl9EZWNvZGVUZXh0KEZYX0xQQ0JZVEUgc3JjX2RhdGEsIEZYX0RXT1JEIHNyY19sZW4sIENGWF9DaGFyTWFwKiBwQ2hhck1hcCkKLXsKLSAgICBDRlhfV2lkZVN0cmluZyByZXN1bHQ7Ci0gICAgaWYgKHNyY19sZW4gPj0gMiAmJiAoKHNyY19kYXRhWzBdID09IDB4ZmUgJiYgc3JjX2RhdGFbMV0gPT0gMHhmZikgfHwgKHNyY19kYXRhWzBdID09IDB4ZmYgJiYgc3JjX2RhdGFbMV0gPT0gMHhmZSkpKSB7Ci0gICAgICAgIEZYX0JPT0wgYkJFID0gc3JjX2RhdGFbMF0gPT0gMHhmZTsKLSAgICAgICAgRlhfRFdPUkQgbWF4X2NoYXJzID0gKHNyY19sZW4gLSAyKSAvIDI7Ci0gICAgICAgIGlmICghbWF4X2NoYXJzKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNfZGF0YVswXSA9PSAweGZmKSB7Ci0gICAgICAgICAgICBiQkUgPSAhc3JjX2RhdGFbMl07Ci0gICAgICAgIH0KLSAgICAgICAgRlhfTFBXU1RSIGRlc3RfYnVmID0gcmVzdWx0LkdldEJ1ZmZlcihtYXhfY2hhcnMpOwotICAgICAgICBGWF9MUENCWVRFIHVuaV9zdHIgPSBzcmNfZGF0YSArIDI7Ci0gICAgICAgIGludCBkZXN0X3BvcyA9IDA7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBtYXhfY2hhcnMgKiAyOyBpICs9IDIpIHsKLSAgICAgICAgICAgIEZYX1dPUkQgdW5pY29kZSA9IGJCRSA/ICh1bmlfc3RyW2ldIDw8IDggfCB1bmlfc3RyW2kgKyAxXSkgOiAodW5pX3N0cltpICsgMV0gPDwgOCB8IHVuaV9zdHJbaV0pOwotICAgICAgICAgICAgaWYgKHVuaWNvZGUgPT0gMHgxYikgewotICAgICAgICAgICAgICAgIGkgKz0gMjsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IG1heF9jaGFycyAqIDIpIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB1bmljb2RlID0gYkJFID8gKHVuaV9zdHJbaV0gPDwgOCB8IHVuaV9zdHJbaSArIDFdKSA6ICh1bmlfc3RyW2kgKyAxXSA8PCA4IHwgdW5pX3N0cltpXSk7Ci0gICAgICAgICAgICAgICAgICAgIGkgKz0gMjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVuaWNvZGUgPT0gMHgxYikgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRlc3RfYnVmW2Rlc3RfcG9zKytdID0gdW5pY29kZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXN1bHQuUmVsZWFzZUJ1ZmZlcihkZXN0X3Bvcyk7Ci0gICAgfSBlbHNlIGlmIChwQ2hhck1hcCA9PSBOVUxMKSB7Ci0gICAgICAgIEZYX0xQV1NUUiBkZXN0X2J1ZiA9IHJlc3VsdC5HZXRCdWZmZXIoc3JjX2xlbik7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBzcmNfbGVuOyBpICsrKSB7Ci0gICAgICAgICAgICBkZXN0X2J1ZltpXSA9IFBERkRvY0VuY29kaW5nW3NyY19kYXRhW2ldXTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuUmVsZWFzZUJ1ZmZlcihzcmNfbGVuKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gKCpwQ2hhck1hcC0+bV9HZXRXaWRlU3RyaW5nKShwQ2hhck1hcCwgQ0ZYX0J5dGVTdHJpbmcoKEZYX0xQQ1NUUilzcmNfZGF0YSwgc3JjX2xlbikpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotQ0ZYX0J5dGVTdHJpbmcgUERGX0VuY29kZVRleHQoRlhfTFBDV1NUUiBwU3RyaW5nLCBpbnQgbGVuLCBDRlhfQ2hhck1hcCogcENoYXJNYXApCi17Ci0gICAgaWYgKGxlbiA9PSAtMSkgewotICAgICAgICBsZW4gPSBGWFNZU193Y3NsZW4ocFN0cmluZyk7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIHJlc3VsdDsKLSAgICBpZiAocENoYXJNYXAgPT0gTlVMTCkgewotICAgICAgICBGWF9MUFNUUiBkZXN0X2J1ZjEgPSByZXN1bHQuR2V0QnVmZmVyKGxlbik7Ci0gICAgICAgIGludCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICsrKSB7Ci0gICAgICAgICAgICBpbnQgY29kZTsKLSAgICAgICAgICAgIGZvciAoY29kZSA9IDA7IGNvZGUgPCAyNTY7IGNvZGUgKyspCi0gICAgICAgICAgICAgICAgaWYgKFBERkRvY0VuY29kaW5nW2NvZGVdID09IHBTdHJpbmdbaV0pIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNvZGUgPT0gMjU2KSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X2J1ZjFbaV0gPSBjb2RlOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5SZWxlYXNlQnVmZmVyKGkpOwotICAgICAgICBpZiAoaSA9PSBsZW4pIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9CisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhcnNlci5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2V4dC5oIgogCi0gICAgaWYobGVuID4gSU5UX01BWC8yLTEpCi0gICAgewotICAgICAgICByZXN1bHQuUmVsZWFzZUJ1ZmZlcigwKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9CisjZGVmaW5lIF9TVFJFQU1fTUFYX1NJWkVfIDIwICogMTAyNCAqIDEwMjQKIAotICAgIGludCBlbmNMZW4gPSBsZW4gKiAyICsgMjsKK2NvbnN0IEZYX1dPUkQgUERGRG9jRW5jb2RpbmdbMjU2XSA9IHsKKyAgICAweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsIDB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywgMHgwMDA4LAorICAgIDB4MDAwOSwgMHgwMDBhLCAweDAwMGIsIDB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwgMHgwMDEwLCAweDAwMTEsCisgICAgMHgwMDEyLCAweDAwMTMsIDB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywgMHgwMmQ4LCAweDAyYzcsIDB4MDJjNiwKKyAgICAweDAyZDksIDB4MDJkZCwgMHgwMmRiLCAweDAyZGEsIDB4MDJkYywgMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorICAgIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywgMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLCAweDAwMmMsCisgICAgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwKKyAgICAweDAwMzYsIDB4MDAzNywgMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLCAweDAwM2MsIDB4MDAzZCwgMHgwMDNlLAorICAgIDB4MDAzZiwgMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisgICAgMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLCAweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsIDB4MDA1MCwKKyAgICAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LAorICAgIDB4MDA1YSwgMHgwMDViLCAweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsIDB4MDA2MCwgMHgwMDYxLCAweDAwNjIsCisgICAgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIDB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKyAgICAweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LAorICAgIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsIDB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwgMHgwMDdjLCAweDAwN2QsCisgICAgMHgwMDdlLCAweDAwMDAsIDB4MjAyMiwgMHgyMDIwLCAweDIwMjEsIDB4MjAyNiwgMHgyMDE0LCAweDIwMTMsIDB4MDE5MiwKKyAgICAweDIwNDQsIDB4MjAzOSwgMHgyMDNhLCAweDIyMTIsIDB4MjAzMCwgMHgyMDFlLCAweDIwMWMsIDB4MjAxZCwgMHgyMDE4LAorICAgIDB4MjAxOSwgMHgyMDFhLCAweDIxMjIsIDB4ZmIwMSwgMHhmYjAyLCAweDAxNDEsIDB4MDE1MiwgMHgwMTYwLCAweDAxNzgsCisgICAgMHgwMTdkLCAweDAxMzEsIDB4MDE0MiwgMHgwMTUzLCAweDAxNjEsIDB4MDE3ZSwgMHgwMDAwLCAweDIwYWMsIDB4MDBhMSwKKyAgICAweDAwYTIsIDB4MDBhMywgMHgwMGE0LCAweDAwYTUsIDB4MDBhNiwgMHgwMGE3LCAweDAwYTgsIDB4MDBhOSwgMHgwMGFhLAorICAgIDB4MDBhYiwgMHgwMGFjLCAweDAwMDAsIDB4MDBhZSwgMHgwMGFmLCAweDAwYjAsIDB4MDBiMSwgMHgwMGIyLCAweDAwYjMsCisgICAgMHgwMGI0LCAweDAwYjUsIDB4MDBiNiwgMHgwMGI3LCAweDAwYjgsIDB4MDBiOSwgMHgwMGJhLCAweDAwYmIsIDB4MDBiYywKKyAgICAweDAwYmQsIDB4MDBiZSwgMHgwMGJmLCAweDAwYzAsIDB4MDBjMSwgMHgwMGMyLCAweDAwYzMsIDB4MDBjNCwgMHgwMGM1LAorICAgIDB4MDBjNiwgMHgwMGM3LCAweDAwYzgsIDB4MDBjOSwgMHgwMGNhLCAweDAwY2IsIDB4MDBjYywgMHgwMGNkLCAweDAwY2UsCisgICAgMHgwMGNmLCAweDAwZDAsIDB4MDBkMSwgMHgwMGQyLCAweDAwZDMsIDB4MDBkNCwgMHgwMGQ1LCAweDAwZDYsIDB4MDBkNywKKyAgICAweDAwZDgsIDB4MDBkOSwgMHgwMGRhLCAweDAwZGIsIDB4MDBkYywgMHgwMGRkLCAweDAwZGUsIDB4MDBkZiwgMHgwMGUwLAorICAgIDB4MDBlMSwgMHgwMGUyLCAweDAwZTMsIDB4MDBlNCwgMHgwMGU1LCAweDAwZTYsIDB4MDBlNywgMHgwMGU4LCAweDAwZTksCisgICAgMHgwMGVhLCAweDAwZWIsIDB4MDBlYywgMHgwMGVkLCAweDAwZWUsIDB4MDBlZiwgMHgwMGYwLCAweDAwZjEsIDB4MDBmMiwKKyAgICAweDAwZjMsIDB4MDBmNCwgMHgwMGY1LCAweDAwZjYsIDB4MDBmNywgMHgwMGY4LCAweDAwZjksIDB4MDBmYSwgMHgwMGZiLAorICAgIDB4MDBmYywgMHgwMGZkLCAweDAwZmUsIDB4MDBmZn07CiAKLSAgICBGWF9MUEJZVEUgZGVzdF9idWYyID0gKEZYX0xQQllURSlyZXN1bHQuR2V0QnVmZmVyKGVuY0xlbik7Ci0gICAgZGVzdF9idWYyWzBdID0gMHhmZTsKLSAgICBkZXN0X2J1ZjJbMV0gPSAweGZmOwotICAgIGRlc3RfYnVmMiArPSAyOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpICsrKSB7Ci0gICAgICAgICpkZXN0X2J1ZjIrKyA9IHBTdHJpbmdbaV0gPj4gODsKLSAgICAgICAgKmRlc3RfYnVmMisrID0gKEZYX0JZVEUpcFN0cmluZ1tpXTsKLSAgICB9Ci0gICAgcmVzdWx0LlJlbGVhc2VCdWZmZXIoZW5jTGVuKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotQ0ZYX0J5dGVTdHJpbmcgUERGX0VuY29kZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3JjLCBGWF9CT09MIGJIZXgpCi17Ci0gICAgQ0ZYX0J5dGVUZXh0QnVmIHJlc3VsdDsKLSAgICBpbnQgc3JjbGVuID0gc3JjLkdldExlbmd0aCgpOwotICAgIGlmIChiSGV4KSB7Ci0gICAgICAgIHJlc3VsdC5BcHBlbmRDaGFyKCc8Jyk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjbGVuOyBpICsrKSB7Ci0gICAgICAgICAgICByZXN1bHQuQXBwZW5kQ2hhcigiMDEyMzQ1Njc4OUFCQ0RFRiJbc3JjW2ldIC8gMTZdKTsKLSAgICAgICAgICAgIHJlc3VsdC5BcHBlbmRDaGFyKCIwMTIzNDU2Nzg5QUJDREVGIltzcmNbaV0gJSAxNl0pOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5BcHBlbmRDaGFyKCc+Jyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQuR2V0Qnl0ZVN0cmluZygpOwotICAgIH0KLSAgICByZXN1bHQuQXBwZW5kQ2hhcignKCcpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjbGVuOyBpICsrKSB7Ci0gICAgICAgIEZYX0JZVEUgY2ggPSBzcmNbaV07Ci0gICAgICAgIGlmIChjaCA9PSAnKScgfHwgY2ggPT0gJ1xcJyB8fCBjaCA9PSAnKCcpIHsKLSAgICAgICAgICAgIHJlc3VsdC5BcHBlbmRDaGFyKCdcXCcpOwotICAgICAgICB9IGVsc2UgaWYgKGNoID09IDB4MGEpIHsKLSAgICAgICAgICAgIHJlc3VsdCA8PCBGWF9CU1RSQygiXFxuIik7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAweDBkKSB7Ci0gICAgICAgICAgICByZXN1bHQgPDwgRlhfQlNUUkMoIlxcciIpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LkFwcGVuZENoYXIoY2gpOwotICAgIH0KLSAgICByZXN1bHQuQXBwZW5kQ2hhcignKScpOwotICAgIHJldHVybiByZXN1bHQuR2V0Qnl0ZVN0cmluZygpOwotfQotdm9pZCBGbGF0ZUVuY29kZShjb25zdCBGWF9CWVRFKiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgRlhfTFBCWVRFJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkKLXsKLSAgICBDQ29kZWNfTW9kdWxlTWdyKiBwRW5jb2RlcnMgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldENvZGVjTW9kdWxlKCk7Ci0gICAgaWYgKHBFbmNvZGVycykgewotICAgICAgICBwRW5jb2RlcnMtPkdldEZsYXRlTW9kdWxlKCktPkVuY29kZShzcmNfYnVmLCBzcmNfc2l6ZSwgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7Ci0gICAgfQotfQotdm9pZCBGbGF0ZUVuY29kZShGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgcHJlZGljdG9yLCBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMsCi0gICAgICAgICAgICAgICAgIEZYX0xQQllURSYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpCi17Ci0gICAgQ0NvZGVjX01vZHVsZU1nciogcEVuY29kZXJzID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpOwotICAgIGlmIChwRW5jb2RlcnMpIHsKLSAgICAgICAgcEVuY29kZXJzLT5HZXRGbGF0ZU1vZHVsZSgpLT5FbmNvZGUoc3JjX2J1Ziwgc3JjX3NpemUsIHByZWRpY3RvciwgQ29sb3JzLCBCaXRzUGVyQ29tcG9uZW50LCBDb2x1bW5zLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKLSAgICB9Ci19Ci1GWF9EV09SRCBGbGF0ZURlY29kZShjb25zdCBGWF9CWVRFKiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgRlhfTFBCWVRFJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkKLXsKLSAgICBDQ29kZWNfTW9kdWxlTWdyKiBwRW5jb2RlcnMgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldENvZGVjTW9kdWxlKCk7Ci0gICAgaWYgKHBFbmNvZGVycykgewotICAgICAgICByZXR1cm4gcEVuY29kZXJzLT5HZXRGbGF0ZU1vZHVsZSgpLT5GbGF0ZU9yTFpXRGVjb2RlKEZBTFNFLCBzcmNfYnVmLCBzcmNfc2l6ZSwgRkFMU0UsIDAsIDAsIDAsIDAsIDAsIGRlc3RfYnVmLCBkZXN0X3NpemUpOwotICAgIH0KK0ZYX0RXT1JEIEE4NURlY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKSB7CisgIGRlc3Rfc2l6ZSA9IDA7CisgIGRlc3RfYnVmID0gTlVMTDsKKyAgaWYgKHNyY19zaXplID09IDApIHsKICAgICByZXR1cm4gMDsKKyAgfQorICBGWF9EV09SRCB6Y291bnQgPSAwOworICBGWF9EV09SRCBwb3MgPSAwOworICB3aGlsZSAocG9zIDwgc3JjX3NpemUpIHsKKyAgICB1aW50OF90IGNoID0gc3JjX2J1Zltwb3NdOworICAgIGlmIChjaCA8ICchJyAmJiBjaCAhPSAnXG4nICYmIGNoICE9ICdccicgJiYgY2ggIT0gJyAnICYmIGNoICE9ICdcdCcpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoY2ggPT0gJ3onKSB7CisgICAgICB6Y291bnQrKzsKKyAgICB9IGVsc2UgaWYgKGNoID4gJ3UnKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgcG9zKys7CisgIH0KKyAgaWYgKHBvcyA9PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKHpjb3VudCA+IFVJTlRfTUFYIC8gNCkgeworICAgIHJldHVybiAoRlhfRFdPUkQpLTE7CisgIH0KKyAgaWYgKHpjb3VudCAqIDQgPiBVSU5UX01BWCAtIChwb3MgLSB6Y291bnQpKSB7CisgICAgcmV0dXJuIChGWF9EV09SRCktMTsKKyAgfQorICBkZXN0X2J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHpjb3VudCAqIDQgKyAocG9zIC0gemNvdW50KSk7CisgIGludCBzdGF0ZSA9IDA7CisgIHVpbnQzMl90IHJlcyA9IDA7CisgIHBvcyA9IGRlc3Rfc2l6ZSA9IDA7CisgIHdoaWxlIChwb3MgPCBzcmNfc2l6ZSkgeworICAgIHVpbnQ4X3QgY2ggPSBzcmNfYnVmW3BvcysrXTsKKyAgICBpZiAoUERGQ2hhcklzTGluZUVuZGluZyhjaCkgfHwgY2ggPT0gJyAnIHx8IGNoID09ICdcdCcpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChjaCA9PSAneicpIHsKKyAgICAgIEZYU1lTX21lbXNldChkZXN0X2J1ZiArIGRlc3Rfc2l6ZSwgMCwgNCk7CisgICAgICBzdGF0ZSA9IDA7CisgICAgICByZXMgPSAwOworICAgICAgZGVzdF9zaXplICs9IDQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChjaCA8ICchJyB8fCBjaCA+ICd1JykgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHJlcyA9IHJlcyAqIDg1ICsgY2ggLSAzMzsKKyAgICAgIHN0YXRlKys7CisgICAgICBpZiAoc3RhdGUgPT0gNSkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgIGRlc3RfYnVmW2Rlc3Rfc2l6ZSsrXSA9ICh1aW50OF90KShyZXMgPj4gKDMgLSBpKSAqIDgpOworICAgICAgICB9CisgICAgICAgIHN0YXRlID0gMDsKKyAgICAgICAgcmVzID0gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKHN0YXRlKSB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gc3RhdGU7IGkgPCA1OyBpKyspIHsKKyAgICAgIHJlcyA9IHJlcyAqIDg1ICsgODQ7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBzdGF0ZSAtIDE7IGkrKykgeworICAgICAgZGVzdF9idWZbZGVzdF9zaXplKytdID0gKHVpbnQ4X3QpKHJlcyA+PiAoMyAtIGkpICogOCk7CisgICAgfQorICB9CisgIGlmIChwb3MgPCBzcmNfc2l6ZSAmJiBzcmNfYnVmW3Bvc10gPT0gJz4nKSB7CisgICAgcG9zKys7CisgIH0KKyAgcmV0dXJuIHBvczsKK30KK0ZYX0RXT1JEIEhleERlY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKSB7CisgIEZYX0RXT1JEIGk7CisgIGZvciAoaSA9IDA7IGkgPCBzcmNfc2l6ZTsgaSsrKQorICAgIGlmIChzcmNfYnVmW2ldID09ICc+JykgeworICAgICAgYnJlYWs7CisgICAgfQorICBkZXN0X2J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIGkgLyAyICsgMSk7CisgIGRlc3Rfc2l6ZSA9IDA7CisgIGJvb2wgYkZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChpID0gMDsgaSA8IHNyY19zaXplOyBpKyspIHsKKyAgICB1aW50OF90IGNoID0gc3JjX2J1ZltpXTsKKyAgICBpZiAoUERGQ2hhcklzTGluZUVuZGluZyhjaCkgfHwgY2ggPT0gJyAnIHx8IGNoID09ICdcdCcpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChjaCA9PSAnPicpIHsKKyAgICAgICsraTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIXN0ZDo6aXN4ZGlnaXQoY2gpKQorICAgICAgY29udGludWU7CisKKyAgICBpbnQgZGlnaXQgPSBGWFNZU190b0hleERpZ2l0KGNoKTsKKyAgICBpZiAoYkZpcnN0KQorICAgICAgZGVzdF9idWZbZGVzdF9zaXplXSA9IGRpZ2l0ICogMTY7CisgICAgZWxzZQorICAgICAgZGVzdF9idWZbZGVzdF9zaXplKytdICs9IGRpZ2l0OworCisgICAgYkZpcnN0ID0gIWJGaXJzdDsKKyAgfQorICBpZiAoIWJGaXJzdCkKKyAgICBkZXN0X3NpemUrKzsKKyAgcmV0dXJuIGk7Cit9CisKK0ZYX0RXT1JEIFJ1bkxlbmd0aERlY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKSB7CisgIEZYX0RXT1JEIGkgPSAwOworICBGWF9EV09SRCBvbGQ7CisgIGRlc3Rfc2l6ZSA9IDA7CisgIHdoaWxlIChpIDwgc3JjX3NpemUpIHsKKyAgICBpZiAoc3JjX2J1ZltpXSA8IDEyOCkgeworICAgICAgb2xkID0gZGVzdF9zaXplOworICAgICAgZGVzdF9zaXplICs9IHNyY19idWZbaV0gKyAxOworICAgICAgaWYgKGRlc3Rfc2l6ZSA8IG9sZCkgeworICAgICAgICByZXR1cm4gKEZYX0RXT1JEKS0xOworICAgICAgfQorICAgICAgaSArPSBzcmNfYnVmW2ldICsgMjsKKyAgICB9IGVsc2UgaWYgKHNyY19idWZbaV0gPiAxMjgpIHsKKyAgICAgIG9sZCA9IGRlc3Rfc2l6ZTsKKyAgICAgIGRlc3Rfc2l6ZSArPSAyNTcgLSBzcmNfYnVmW2ldOworICAgICAgaWYgKGRlc3Rfc2l6ZSA8IG9sZCkgeworICAgICAgICByZXR1cm4gKEZYX0RXT1JEKS0xOworICAgICAgfQorICAgICAgaSArPSAyOworICAgIH0gZWxzZSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKGRlc3Rfc2l6ZSA+PSBfU1RSRUFNX01BWF9TSVpFXykgeworICAgIHJldHVybiAtMTsKKyAgfQorICBkZXN0X2J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIGRlc3Rfc2l6ZSk7CisgIGkgPSAwOworICBpbnQgZGVzdF9jb3VudCA9IDA7CisgIHdoaWxlIChpIDwgc3JjX3NpemUpIHsKKyAgICBpZiAoc3JjX2J1ZltpXSA8IDEyOCkgeworICAgICAgRlhfRFdPUkQgY29weV9sZW4gPSBzcmNfYnVmW2ldICsgMTsKKyAgICAgIEZYX0RXT1JEIGJ1Zl9sZWZ0ID0gc3JjX3NpemUgLSBpIC0gMTsKKyAgICAgIGlmIChidWZfbGVmdCA8IGNvcHlfbGVuKSB7CisgICAgICAgIEZYX0RXT1JEIGRlbHRhID0gY29weV9sZW4gLSBidWZfbGVmdDsKKyAgICAgICAgY29weV9sZW4gPSBidWZfbGVmdDsKKyAgICAgICAgRlhTWVNfbWVtc2V0KGRlc3RfYnVmICsgZGVzdF9jb3VudCArIGNvcHlfbGVuLCAnXDAnLCBkZWx0YSk7CisgICAgICB9CisgICAgICBGWFNZU19tZW1jcHkoZGVzdF9idWYgKyBkZXN0X2NvdW50LCBzcmNfYnVmICsgaSArIDEsIGNvcHlfbGVuKTsKKyAgICAgIGRlc3RfY291bnQgKz0gc3JjX2J1ZltpXSArIDE7CisgICAgICBpICs9IHNyY19idWZbaV0gKyAyOworICAgIH0gZWxzZSBpZiAoc3JjX2J1ZltpXSA+IDEyOCkgeworICAgICAgaW50IGZpbGwgPSAwOworICAgICAgaWYgKGkgPCBzcmNfc2l6ZSAtIDEpIHsKKyAgICAgICAgZmlsbCA9IHNyY19idWZbaSArIDFdOworICAgICAgfQorICAgICAgRlhTWVNfbWVtc2V0KGRlc3RfYnVmICsgZGVzdF9jb3VudCwgZmlsbCwgMjU3IC0gc3JjX2J1ZltpXSk7CisgICAgICBkZXN0X2NvdW50ICs9IDI1NyAtIHNyY19idWZbaV07CisgICAgICBpICs9IDI7CisgICAgfSBlbHNlIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBGWF9EV09SRCByZXQgPSBpICsgMTsKKyAgaWYgKHJldCA+IHNyY19zaXplKSB7CisgICAgcmV0ID0gc3JjX3NpemU7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KK0lDb2RlY19TY2FubGluZURlY29kZXIqIEZQREZBUElfQ3JlYXRlRmF4RGVjb2RlcigKKyAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgIGludCB3aWR0aCwKKyAgICBpbnQgaGVpZ2h0LAorICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhcmFtcykgeworICBpbnQgSyA9IDA7CisgIEZYX0JPT0wgRW5kT2ZMaW5lID0gRkFMU0U7CisgIEZYX0JPT0wgQnl0ZUFsaWduID0gRkFMU0U7CisgIEZYX0JPT0wgQmxhY2tJczEgPSBGQUxTRTsKKyAgaW50IENvbHVtbnMgPSAxNzI4OworICBpbnQgUm93cyA9IDA7CisgIGlmIChwUGFyYW1zKSB7CisgICAgSyA9IHBQYXJhbXMtPkdldEludGVnZXIoIksiKTsKKyAgICBFbmRPZkxpbmUgPSBwUGFyYW1zLT5HZXRJbnRlZ2VyKCJFbmRPZkxpbmUiKTsKKyAgICBCeXRlQWxpZ24gPSBwUGFyYW1zLT5HZXRJbnRlZ2VyKCJFbmNvZGVkQnl0ZUFsaWduIik7CisgICAgQmxhY2tJczEgPSBwUGFyYW1zLT5HZXRJbnRlZ2VyKCJCbGFja0lzMSIpOworICAgIENvbHVtbnMgPSBwUGFyYW1zLT5HZXRJbnRlZ2VyKCJDb2x1bW5zIiwgMTcyOCk7CisgICAgUm93cyA9IHBQYXJhbXMtPkdldEludGVnZXIoIlJvd3MiKTsKKyAgICBpZiAoUm93cyA+IFVTSFJUX01BWCkgeworICAgICAgUm93cyA9IDA7CisgICAgfQorICAgIGlmIChDb2x1bW5zIDw9IDAgfHwgUm93cyA8IDAgfHwgQ29sdW1ucyA+IFVTSFJUX01BWCB8fCBSb3dzID4gVVNIUlRfTUFYKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0RmF4TW9kdWxlKCktPkNyZWF0ZURlY29kZXIoCisgICAgICBzcmNfYnVmLCBzcmNfc2l6ZSwgd2lkdGgsIGhlaWdodCwgSywgRW5kT2ZMaW5lLCBCeXRlQWxpZ24sIEJsYWNrSXMxLAorICAgICAgQ29sdW1ucywgUm93cyk7Cit9CitzdGF0aWMgRlhfQk9PTCBDaGVja0ZsYXRlRGVjb2RlUGFyYW1zKGludCBDb2xvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCaXRzUGVyQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sdW1ucykgeworICBpZiAoQ29sdW1ucyA8IDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW50IGNoZWNrID0gQ29sdW1uczsKKyAgaWYgKENvbG9ycyA8IDAgfHwgKGNoZWNrID4gMCAmJiBDb2xvcnMgPiBJTlRfTUFYIC8gY2hlY2spKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGNoZWNrICo9IENvbG9yczsKKyAgaWYgKEJpdHNQZXJDb21wb25lbnQgPCAwIHx8CisgICAgICAoY2hlY2sgPiAwICYmIEJpdHNQZXJDb21wb25lbnQgPiBJTlRfTUFYIC8gY2hlY2spKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGNoZWNrICo9IEJpdHNQZXJDb21wb25lbnQ7CisgIGlmIChjaGVjayA+IElOVF9NQVggLSA3KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOworfQorSUNvZGVjX1NjYW5saW5lRGVjb2RlciogRlBERkFQSV9DcmVhdGVGbGF0ZURlY29kZXIoCisgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IGhlaWdodCwKKyAgICBpbnQgbkNvbXBzLAorICAgIGludCBicGMsCisgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zKSB7CisgIGludCBwcmVkaWN0b3IgPSAwOworICBpbnQgQ29sb3JzID0gMCwgQml0c1BlckNvbXBvbmVudCA9IDAsIENvbHVtbnMgPSAwOworICBpZiAocFBhcmFtcykgeworICAgIHByZWRpY3RvciA9IHBQYXJhbXMtPkdldEludGVnZXIoIlByZWRpY3RvciIpOworICAgIENvbG9ycyA9IHBQYXJhbXMtPkdldEludGVnZXIoIkNvbG9ycyIsIDEpOworICAgIEJpdHNQZXJDb21wb25lbnQgPSBwUGFyYW1zLT5HZXRJbnRlZ2VyKCJCaXRzUGVyQ29tcG9uZW50IiwgOCk7CisgICAgQ29sdW1ucyA9IHBQYXJhbXMtPkdldEludGVnZXIoIkNvbHVtbnMiLCAxKTsKKyAgICBpZiAoIUNoZWNrRmxhdGVEZWNvZGVQYXJhbXMoQ29sb3JzLCBCaXRzUGVyQ29tcG9uZW50LCBDb2x1bW5zKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisgIHJldHVybiBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEZsYXRlTW9kdWxlKCktPkNyZWF0ZURlY29kZXIoCisgICAgICBzcmNfYnVmLCBzcmNfc2l6ZSwgd2lkdGgsIGhlaWdodCwgbkNvbXBzLCBicGMsIHByZWRpY3RvciwgQ29sb3JzLAorICAgICAgQml0c1BlckNvbXBvbmVudCwgQ29sdW1ucyk7Cit9CitGWF9EV09SRCBGUERGQVBJX0ZsYXRlT3JMWldEZWNvZGUoRlhfQk9PTCBiTFpXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGVzdGltYXRlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKSB7CisgIGludCBwcmVkaWN0b3IgPSAwOworICBGWF9CT09MIGJFYXJseUNoYW5nZSA9IFRSVUU7CisgIGludCBDb2xvcnMgPSAwLCBCaXRzUGVyQ29tcG9uZW50ID0gMCwgQ29sdW1ucyA9IDA7CisgIGlmIChwUGFyYW1zKSB7CisgICAgcHJlZGljdG9yID0gcFBhcmFtcy0+R2V0SW50ZWdlcigiUHJlZGljdG9yIik7CisgICAgYkVhcmx5Q2hhbmdlID0gcFBhcmFtcy0+R2V0SW50ZWdlcigiRWFybHlDaGFuZ2UiLCAxKTsKKyAgICBDb2xvcnMgPSBwUGFyYW1zLT5HZXRJbnRlZ2VyKCJDb2xvcnMiLCAxKTsKKyAgICBCaXRzUGVyQ29tcG9uZW50ID0gcFBhcmFtcy0+R2V0SW50ZWdlcigiQml0c1BlckNvbXBvbmVudCIsIDgpOworICAgIENvbHVtbnMgPSBwUGFyYW1zLT5HZXRJbnRlZ2VyKCJDb2x1bW5zIiwgMSk7CisgICAgaWYgKCFDaGVja0ZsYXRlRGVjb2RlUGFyYW1zKENvbG9ycywgQml0c1BlckNvbXBvbmVudCwgQ29sdW1ucykpIHsKKyAgICAgIHJldHVybiAoRlhfRFdPUkQpLTE7CisgICAgfQorICB9CisgIHJldHVybiBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEZsYXRlTW9kdWxlKCktPkZsYXRlT3JMWldEZWNvZGUoCisgICAgICBiTFpXLCBzcmNfYnVmLCBzcmNfc2l6ZSwgYkVhcmx5Q2hhbmdlLCBwcmVkaWN0b3IsIENvbG9ycywKKyAgICAgIEJpdHNQZXJDb21wb25lbnQsIENvbHVtbnMsIGVzdGltYXRlZF9zaXplLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKK30KK0ZYX0JPT0wgUERGX0RhdGFEZWNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIEltYWdlRW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSomIHBJbWFnZVBhcm1zLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBsYXN0X2VzdGltYXRlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbWFnZUFjYykgeworICBDUERGX09iamVjdCogcERlY29kZXIgPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoIkZpbHRlciIpIDogbnVsbHB0cjsKKyAgaWYgKCFwRGVjb2RlciB8fCAoIXBEZWNvZGVyLT5Jc0FycmF5KCkgJiYgIXBEZWNvZGVyLT5Jc05hbWUoKSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIENQREZfT2JqZWN0KiBwUGFyYW1zID0KKyAgICAgIHBEaWN0ID8gcERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiRGVjb2RlUGFybXMiKSA6IG51bGxwdHI7CisgIENGWF9CeXRlU3RyaW5nQXJyYXkgRGVjb2Rlckxpc3Q7CisgIENGWF9BcnJheVRlbXBsYXRlPENQREZfT2JqZWN0Kj4gUGFyYW1MaXN0OworICBpZiAoQ1BERl9BcnJheSogcERlY29kZXJzID0gcERlY29kZXItPkFzQXJyYXkoKSkgeworICAgIENQREZfQXJyYXkqIHBQYXJhbXNBcnJheSA9IFRvQXJyYXkocFBhcmFtcyk7CisgICAgaWYgKCFwUGFyYW1zQXJyYXkpCisgICAgICBwUGFyYW1zID0gbnVsbHB0cjsKKworICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwRGVjb2RlcnMtPkdldENvdW50KCk7IGkrKykgeworICAgICAgQ0ZYX0J5dGVTdHJpbmdDIHN0ciA9IHBEZWNvZGVycy0+R2V0Q29uc3RTdHJpbmcoaSk7CisgICAgICBEZWNvZGVyTGlzdC5BZGQoc3RyKTsKKyAgICAgIFBhcmFtTGlzdC5BZGQocFBhcmFtcyA/IHBQYXJhbXNBcnJheS0+R2V0RGljdChpKSA6IG51bGxwdHIpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBEZWNvZGVyTGlzdC5BZGQocERlY29kZXItPkdldENvbnN0U3RyaW5nKCkpOworICAgIFBhcmFtTGlzdC5BZGQocFBhcmFtcyA/IHBQYXJhbXMtPkdldERpY3QoKSA6IG51bGxwdHIpOworICB9CisgIHVpbnQ4X3QqIGxhc3RfYnVmID0gKHVpbnQ4X3QqKXNyY19idWY7CisgIEZYX0RXT1JEIGxhc3Rfc2l6ZSA9IHNyY19zaXplOworICBmb3IgKGludCBpID0gMDsgaSA8IERlY29kZXJMaXN0LkdldFNpemUoKTsgaSsrKSB7CisgICAgaW50IGVzdGltYXRlZF9zaXplID0KKyAgICAgICAgaSA9PSBEZWNvZGVyTGlzdC5HZXRTaXplKCkgLSAxID8gbGFzdF9lc3RpbWF0ZWRfc2l6ZSA6IDA7CisgICAgQ0ZYX0J5dGVTdHJpbmcgZGVjb2RlciA9IERlY29kZXJMaXN0W2ldOworICAgIC8vIFVzZSBUb0RpY3Rpb25hcnkgaGVyZSBiZWNhdXNlIHdlIGNhbiBwdXNoIE5VTEwgaW50byB0aGUgUGFyYW1MaXN0LgorICAgIENQREZfRGljdGlvbmFyeSogcFBhcmFtID0gVG9EaWN0aW9uYXJ5KFBhcmFtTGlzdFtpXSk7CisgICAgdWludDhfdCogbmV3X2J1ZiA9IG51bGxwdHI7CisgICAgRlhfRFdPUkQgbmV3X3NpemUgPSAoRlhfRFdPUkQpLTE7CisgICAgaW50IG9mZnNldCA9IC0xOworICAgIGlmIChkZWNvZGVyID09ICJGbGF0ZURlY29kZSIgfHwgZGVjb2RlciA9PSAiRmwiKSB7CisgICAgICBpZiAoYkltYWdlQWNjICYmIGkgPT0gRGVjb2Rlckxpc3QuR2V0U2l6ZSgpIC0gMSkgeworICAgICAgICBJbWFnZUVuY29kaW5nID0gIkZsYXRlRGVjb2RlIjsKKyAgICAgICAgZGVzdF9idWYgPSAodWludDhfdCopbGFzdF9idWY7CisgICAgICAgIGRlc3Rfc2l6ZSA9IGxhc3Rfc2l6ZTsKKyAgICAgICAgcEltYWdlUGFybXMgPSBwUGFyYW07CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQorICAgICAgb2Zmc2V0ID0gRlBERkFQSV9GbGF0ZU9yTFpXRGVjb2RlKEZBTFNFLCBsYXN0X2J1ZiwgbGFzdF9zaXplLCBwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGVkX3NpemUsIG5ld19idWYsIG5ld19zaXplKTsKKyAgICB9IGVsc2UgaWYgKGRlY29kZXIgPT0gIkxaV0RlY29kZSIgfHwgZGVjb2RlciA9PSAiTFpXIikgeworICAgICAgb2Zmc2V0ID0gRlBERkFQSV9GbGF0ZU9yTFpXRGVjb2RlKFRSVUUsIGxhc3RfYnVmLCBsYXN0X3NpemUsIHBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZWRfc2l6ZSwgbmV3X2J1ZiwgbmV3X3NpemUpOworICAgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSAiQVNDSUk4NURlY29kZSIgfHwgZGVjb2RlciA9PSAiQTg1IikgeworICAgICAgb2Zmc2V0ID0gQTg1RGVjb2RlKGxhc3RfYnVmLCBsYXN0X3NpemUsIG5ld19idWYsIG5ld19zaXplKTsKKyAgICB9IGVsc2UgaWYgKGRlY29kZXIgPT0gIkFTQ0lJSGV4RGVjb2RlIiB8fCBkZWNvZGVyID09ICJBSHgiKSB7CisgICAgICBvZmZzZXQgPSBIZXhEZWNvZGUobGFzdF9idWYsIGxhc3Rfc2l6ZSwgbmV3X2J1ZiwgbmV3X3NpemUpOworICAgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSAiUnVuTGVuZ3RoRGVjb2RlIiB8fCBkZWNvZGVyID09ICJSTCIpIHsKKyAgICAgIGlmIChiSW1hZ2VBY2MgJiYgaSA9PSBEZWNvZGVyTGlzdC5HZXRTaXplKCkgLSAxKSB7CisgICAgICAgIEltYWdlRW5jb2RpbmcgPSAiUnVuTGVuZ3RoRGVjb2RlIjsKKyAgICAgICAgZGVzdF9idWYgPSAodWludDhfdCopbGFzdF9idWY7CisgICAgICAgIGRlc3Rfc2l6ZSA9IGxhc3Rfc2l6ZTsKKyAgICAgICAgcEltYWdlUGFybXMgPSBwUGFyYW07CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQorICAgICAgb2Zmc2V0ID0gUnVuTGVuZ3RoRGVjb2RlKGxhc3RfYnVmLCBsYXN0X3NpemUsIG5ld19idWYsIG5ld19zaXplKTsKKyAgICB9IGVsc2UgaWYgKGRlY29kZXIgPT0gIkNyeXB0IikgeworICAgICAgY29udGludWU7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIElmIHdlIGdldCBoZXJlLCBhc3N1bWUgaXQncyBhbiBpbWFnZSBkZWNvZGVyLgorICAgICAgaWYgKGRlY29kZXIgPT0gIkRDVCIpIHsKKyAgICAgICAgZGVjb2RlciA9ICJEQ1REZWNvZGUiOworICAgICAgfSBlbHNlIGlmIChkZWNvZGVyID09ICJDQ0YiKSB7CisgICAgICAgIGRlY29kZXIgPSAiQ0NJVFRGYXhEZWNvZGUiOworICAgICAgfQorICAgICAgSW1hZ2VFbmNvZGluZyA9IGRlY29kZXI7CisgICAgICBwSW1hZ2VQYXJtcyA9IHBQYXJhbTsKKyAgICAgIGRlc3RfYnVmID0gKHVpbnQ4X3QqKWxhc3RfYnVmOworICAgICAgZGVzdF9zaXplID0gbGFzdF9zaXplOworICAgICAgaWYgKENQREZfQXJyYXkqIHBEZWNvZGVycyA9IHBEZWNvZGVyLT5Bc0FycmF5KCkpCisgICAgICAgIHBEZWNvZGVycy0+UmVtb3ZlQXQoaSArIDEsIHBEZWNvZGVycy0+R2V0Q291bnQoKSAtIGkgLSAxKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBpZiAobGFzdF9idWYgIT0gc3JjX2J1ZikgeworICAgICAgRlhfRnJlZShsYXN0X2J1Zik7CisgICAgfQorICAgIGlmIChvZmZzZXQgPT0gLTEpIHsKKyAgICAgIEZYX0ZyZWUobmV3X2J1Zik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGxhc3RfYnVmID0gbmV3X2J1ZjsKKyAgICBsYXN0X3NpemUgPSBuZXdfc2l6ZTsKKyAgfQorICBJbWFnZUVuY29kaW5nID0gIiI7CisgIHBJbWFnZVBhcm1zID0gbnVsbHB0cjsKKyAgZGVzdF9idWYgPSBsYXN0X2J1ZjsKKyAgZGVzdF9zaXplID0gbGFzdF9zaXplOworICByZXR1cm4gVFJVRTsKK30KK0NGWF9XaWRlU3RyaW5nIFBERl9EZWNvZGVUZXh0KGNvbnN0IHVpbnQ4X3QqIHNyY19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9DaGFyTWFwKiBwQ2hhck1hcCkgeworICBDRlhfV2lkZVN0cmluZyByZXN1bHQ7CisgIGlmIChzcmNfbGVuID49IDIgJiYgKChzcmNfZGF0YVswXSA9PSAweGZlICYmIHNyY19kYXRhWzFdID09IDB4ZmYpIHx8CisgICAgICAgICAgICAgICAgICAgICAgIChzcmNfZGF0YVswXSA9PSAweGZmICYmIHNyY19kYXRhWzFdID09IDB4ZmUpKSkgeworICAgIEZYX0JPT0wgYkJFID0gc3JjX2RhdGFbMF0gPT0gMHhmZTsKKyAgICBGWF9EV09SRCBtYXhfY2hhcnMgPSAoc3JjX2xlbiAtIDIpIC8gMjsKKyAgICBpZiAoIW1heF9jaGFycykgeworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgaWYgKHNyY19kYXRhWzBdID09IDB4ZmYpIHsKKyAgICAgIGJCRSA9ICFzcmNfZGF0YVsyXTsKKyAgICB9CisgICAgRlhfV0NIQVIqIGRlc3RfYnVmID0gcmVzdWx0LkdldEJ1ZmZlcihtYXhfY2hhcnMpOworICAgIGNvbnN0IHVpbnQ4X3QqIHVuaV9zdHIgPSBzcmNfZGF0YSArIDI7CisgICAgaW50IGRlc3RfcG9zID0gMDsKKyAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgbWF4X2NoYXJzICogMjsgaSArPSAyKSB7CisgICAgICBGWF9XT1JEIHVuaWNvZGUgPSBiQkUgPyAodW5pX3N0cltpXSA8PCA4IHwgdW5pX3N0cltpICsgMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAodW5pX3N0cltpICsgMV0gPDwgOCB8IHVuaV9zdHJbaV0pOworICAgICAgaWYgKHVuaWNvZGUgPT0gMHgxYikgeworICAgICAgICBpICs9IDI7CisgICAgICAgIHdoaWxlIChpIDwgbWF4X2NoYXJzICogMikgeworICAgICAgICAgIEZYX1dPUkQgdW5pY29kZSA9IGJCRSA/ICh1bmlfc3RyW2ldIDw8IDggfCB1bmlfc3RyW2kgKyAxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAodW5pX3N0cltpICsgMV0gPDwgOCB8IHVuaV9zdHJbaV0pOworICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICBpZiAodW5pY29kZSA9PSAweDFiKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlc3RfYnVmW2Rlc3RfcG9zKytdID0gdW5pY29kZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmVzdWx0LlJlbGVhc2VCdWZmZXIoZGVzdF9wb3MpOworICB9IGVsc2UgaWYgKCFwQ2hhck1hcCkgeworICAgIEZYX1dDSEFSKiBkZXN0X2J1ZiA9IHJlc3VsdC5HZXRCdWZmZXIoc3JjX2xlbik7CisgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHNyY19sZW47IGkrKykgeworICAgICAgZGVzdF9idWZbaV0gPSBQREZEb2NFbmNvZGluZ1tzcmNfZGF0YVtpXV07CisgICAgfQorICAgIHJlc3VsdC5SZWxlYXNlQnVmZmVyKHNyY19sZW4pOworICB9IGVsc2UgeworICAgIHJldHVybiAoKnBDaGFyTWFwLT5tX0dldFdpZGVTdHJpbmcpKAorICAgICAgICBwQ2hhck1hcCwgQ0ZYX0J5dGVTdHJpbmcoKGNvbnN0IEZYX0NIQVIqKXNyY19kYXRhLCBzcmNfbGVuKSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KK0NGWF9CeXRlU3RyaW5nIFBERl9FbmNvZGVUZXh0KGNvbnN0IEZYX1dDSEFSKiBwU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9DaGFyTWFwKiBwQ2hhck1hcCkgeworICBpZiAobGVuID09IC0xKSB7CisgICAgbGVuID0gRlhTWVNfd2NzbGVuKHBTdHJpbmcpOworICB9CisgIENGWF9CeXRlU3RyaW5nIHJlc3VsdDsKKyAgaWYgKCFwQ2hhck1hcCkgeworICAgIEZYX0NIQVIqIGRlc3RfYnVmMSA9IHJlc3VsdC5HZXRCdWZmZXIobGVuKTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgIGludCBjb2RlOworICAgICAgZm9yIChjb2RlID0gMDsgY29kZSA8IDI1NjsgY29kZSsrKQorICAgICAgICBpZiAoUERGRG9jRW5jb2RpbmdbY29kZV0gPT0gcFN0cmluZ1tpXSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICBpZiAoY29kZSA9PSAyNTYpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZXN0X2J1ZjFbaV0gPSBjb2RlOworICAgIH0KKyAgICByZXN1bHQuUmVsZWFzZUJ1ZmZlcihpKTsKKyAgICBpZiAoaSA9PSBsZW4pIHsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICB9CisKKyAgaWYgKGxlbiA+IElOVF9NQVggLyAyIC0gMSkgeworICAgIHJlc3VsdC5SZWxlYXNlQnVmZmVyKDApOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBpbnQgZW5jTGVuID0gbGVuICogMiArIDI7CisKKyAgdWludDhfdCogZGVzdF9idWYyID0gKHVpbnQ4X3QqKXJlc3VsdC5HZXRCdWZmZXIoZW5jTGVuKTsKKyAgZGVzdF9idWYyWzBdID0gMHhmZTsKKyAgZGVzdF9idWYyWzFdID0gMHhmZjsKKyAgZGVzdF9idWYyICs9IDI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAqZGVzdF9idWYyKysgPSBwU3RyaW5nW2ldID4+IDg7CisgICAgKmRlc3RfYnVmMisrID0gKHVpbnQ4X3QpcFN0cmluZ1tpXTsKKyAgfQorICByZXN1bHQuUmVsZWFzZUJ1ZmZlcihlbmNMZW4pOworICByZXR1cm4gcmVzdWx0OworfQorQ0ZYX0J5dGVTdHJpbmcgUERGX0VuY29kZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3JjLCBGWF9CT09MIGJIZXgpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHJlc3VsdDsKKyAgaW50IHNyY2xlbiA9IHNyYy5HZXRMZW5ndGgoKTsKKyAgaWYgKGJIZXgpIHsKKyAgICByZXN1bHQuQXBwZW5kQ2hhcignPCcpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjbGVuOyBpKyspIHsKKyAgICAgIHJlc3VsdC5BcHBlbmRDaGFyKCIwMTIzNDU2Nzg5QUJDREVGIltzcmNbaV0gLyAxNl0pOworICAgICAgcmVzdWx0LkFwcGVuZENoYXIoIjAxMjM0NTY3ODlBQkNERUYiW3NyY1tpXSAlIDE2XSk7CisgICAgfQorICAgIHJlc3VsdC5BcHBlbmRDaGFyKCc+Jyk7CisgICAgcmV0dXJuIHJlc3VsdC5HZXRCeXRlU3RyaW5nKCk7CisgIH0KKyAgcmVzdWx0LkFwcGVuZENoYXIoJygnKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcmNsZW47IGkrKykgeworICAgIHVpbnQ4X3QgY2ggPSBzcmNbaV07CisgICAgaWYgKGNoID09ICcpJyB8fCBjaCA9PSAnXFwnIHx8IGNoID09ICcoJykgeworICAgICAgcmVzdWx0LkFwcGVuZENoYXIoJ1xcJyk7CisgICAgfSBlbHNlIGlmIChjaCA9PSAweDBhKSB7CisgICAgICByZXN1bHQgPDwgIlxcbiI7CisgICAgICBjb250aW51ZTsKKyAgICB9IGVsc2UgaWYgKGNoID09IDB4MGQpIHsKKyAgICAgIHJlc3VsdCA8PCAiXFxyIjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICByZXN1bHQuQXBwZW5kQ2hhcihjaCk7CisgIH0KKyAgcmVzdWx0LkFwcGVuZENoYXIoJyknKTsKKyAgcmV0dXJuIHJlc3VsdC5HZXRCeXRlU3RyaW5nKCk7Cit9Cit2b2lkIEZsYXRlRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpIHsKKyAgQ0NvZGVjX01vZHVsZU1nciogcEVuY29kZXJzID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpOworICBpZiAocEVuY29kZXJzKSB7CisgICAgcEVuY29kZXJzLT5HZXRGbGF0ZU1vZHVsZSgpLT5FbmNvZGUoc3JjX2J1Ziwgc3JjX3NpemUsIGRlc3RfYnVmLCBkZXN0X3NpemUpOworICB9Cit9Cit2b2lkIEZsYXRlRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICBpbnQgcHJlZGljdG9yLAorICAgICAgICAgICAgICAgICBpbnQgQ29sb3JzLAorICAgICAgICAgICAgICAgICBpbnQgQml0c1BlckNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgaW50IENvbHVtbnMsCisgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgeworICBDQ29kZWNfTW9kdWxlTWdyKiBwRW5jb2RlcnMgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldENvZGVjTW9kdWxlKCk7CisgIGlmIChwRW5jb2RlcnMpIHsKKyAgICBwRW5jb2RlcnMtPkdldEZsYXRlTW9kdWxlKCktPkVuY29kZShzcmNfYnVmLCBzcmNfc2l6ZSwgcHJlZGljdG9yLCBDb2xvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0c1BlckNvbXBvbmVudCwgQ29sdW1ucywgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zaXplKTsKKyAgfQorfQorRlhfRFdPUkQgRmxhdGVEZWNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgeworICBDQ29kZWNfTW9kdWxlTWdyKiBwRW5jb2RlcnMgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldENvZGVjTW9kdWxlKCk7CisgIGlmIChwRW5jb2RlcnMpIHsKKyAgICByZXR1cm4gcEVuY29kZXJzLT5HZXRGbGF0ZU1vZHVsZSgpLT5GbGF0ZU9yTFpXRGVjb2RlKAorICAgICAgICBGQUxTRSwgc3JjX2J1Ziwgc3JjX3NpemUsIEZBTFNFLCAwLCAwLCAwLCAwLCAwLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKKyAgfQorICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlX2VtYmVkZGVydGVzdC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZV9lbWJlZGRlcnRlc3QuY3BwCmluZGV4IDZmOTdjMDguLmM4MDc3MDMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlX2VtYmVkZGVydGVzdC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGVfZW1iZWRkZXJ0ZXN0LmNwcApAQCAtNSwyMiArNSwyMiBAQAogI2luY2x1ZGUgPGNzdHJpbmc+CiAjaW5jbHVkZSA8c3RyaW5nPgogCi0jaW5jbHVkZSAiLi4vLi4vLi4vLi4vcHVibGljL2ZwZGZ2aWV3LmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vLi4vdGVzdGluZy9meF9zdHJpbmdfdGVzdGhlbHBlcnMuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYXJzZXIuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vdGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYXJzZXIuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2VtYmVkZGVyX3Rlc3QuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2Z4X3N0cmluZ190ZXN0aGVscGVycy5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgogCi1jbGFzcyBGUERGUGFyc2VyRGVjb2RlRW1iZWRkZXJ0ZXN0IDogcHVibGljIEVtYmVkZGVyVGVzdCB7Ci19OworY2xhc3MgRlBERlBhcnNlckRlY29kZUVtYmVkZGVydGVzdCA6IHB1YmxpYyBFbWJlZGRlclRlc3Qge307CiAKIC8vIE5PVEU6IHB5dGhvbidzIHpsaWIuY29tcHJlc3MoKSBhbmQgemxpYi5kZWNvbXByZXNzKCkgbWF5IGJlIHVzZWZ1bCBmb3IKIC8vIGV4dGVybmFsIHZhbGlkYXRpb24gb2YgdGhlIEZsYXRlRW5jb2RlL0ZsYXRlRGVjb2RlIHRlc3QgY2FzZXMuCiAKLSNkZWZpbmUgVEVTVF9DQVNFKGlucHV0X2xpdGVyYWwsIGV4cGVjdGVkX2xpdGVyYWwpIFwKLSAgeyAoY29uc3QgdW5zaWduZWQgY2hhciopaW5wdXRfbGl0ZXJhbCwgc2l6ZW9mKGlucHV0X2xpdGVyYWwpIC0gMSwgXAotICAgIChjb25zdCB1bnNpZ25lZCBjaGFyKilleHBlY3RlZF9saXRlcmFsLCBzaXplb2YoZXhwZWN0ZWRfbGl0ZXJhbCkgLSAxIH0KKyNkZWZpbmUgVEVTVF9DQVNFKGlucHV0X2xpdGVyYWwsIGV4cGVjdGVkX2xpdGVyYWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBpbnB1dF9saXRlcmFsLCBzaXplb2YoaW5wdXRfbGl0ZXJhbCkgLSAxLCAgICAgICAgIFwKKyAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKWV4cGVjdGVkX2xpdGVyYWwsIHNpemVvZihleHBlY3RlZF9saXRlcmFsKSAtIDEgXAorICB9CiAKIFRFU1RfRihGUERGUGFyc2VyRGVjb2RlRW1iZWRkZXJ0ZXN0LCBGbGF0ZUVuY29kZSkgewogICBzdHJ1Y3QgRmxhdGVFbmNvZGVDYXNlIHsKQEAgLTI5LDIxICsyOSwyMCBAQAogICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGV4cGVjdGVkOwogICAgIHVuc2lnbmVkIGludCBleHBlY3RlZF9zaXplOwogICB9IGZsYXRlX2VuY29kZV9jYXNlc1tdID0gewotICAgIFRFU1RfQ0FTRSgiIiwgIlx4NzhceDljXHgwM1x4MDBceDAwXHgwMFx4MDBceDAxIiksCi0gICAgVEVTVF9DQVNFKCIgIiwgIlx4NzhceDljXHg1M1x4MDBceDAwXHgwMFx4MjFceDAwXHgyMSIpLAotICAgIFRFU1RfQ0FTRSgiMTIzIiwgIlx4NzhceDljXHgzM1x4MzRceDMyXHgwNlx4MDBcMDFceDJkXHgwMFx4OTciKSwKLSAgICBURVNUX0NBU0UoIlx4MDBceGZmIiwgIlx4NzhceDljXHg2M1x4ZjhceDBmXHgwMFx4MDFceDAxXHgwMVx4MDAiKSwKLSAgICBURVNUX0NBU0UoIjEgMCAwIC0xIDI5IDc2MyBjbVxuMCAwIDU1NSA3MzUgcmVcblcgblxucVxuMCAwIDU1NSA3MzQuMzk0IHJlXG4iCi0gICAgICAgICAgICAgICJXIG5cbnFcbjAuODAwOSAwIDAgMC44MDA5IDAgMCBjbVxuMSAxIDEgUkcgMSAxIDEgcmdcbi9HMCBnc1xuIgotICAgICAgICAgICAgICAiMCAwIDY5MyA5MTcgcmVcbmZcblFcblFcbiIKLSAgICAgICAgICAgICAgLAotICAgICAgICAgICAgICAiXHg3OFx4OWNceDMzXHg1NFx4MzBceDAwXHg0Mlx4NWRceDQzXHgwNVx4MjNceDRiXHgwNVx4NzNceDMzXHg2MyIKLSAgICAgICAgICAgICAgIlx4ODVceGU0XHg1Y1x4MmVceDkwXHg4MFx4YTlceGE5XHhhOVx4ODJceGI5XHhiMVx4YTlceDQyXHg1MVx4MmEiCi0gICAgICAgICAgICAgICJceDU3XHhiOFx4NDJceDFlXHg1N1x4MjFceDkyXHhhMFx4ODlceDllXHhiMVx4YTVceDA5XHg5Mlx4ODRceDllIgotICAgICAgICAgICAgICAiXHg4NVx4ODFceDgxXHgyNVx4ZDhceDE0XHgyNFx4MjZceGQwXHgxOFx4NDNceDA1XHgxMFx4MGNceDcyXHg1NyIKLSAgICAgICAgICAgICAgIlx4ODBceDMwXHg4YVx4ZDJceGI5XHhmNFx4ZGRceDBkXHgxNFx4ZDJceDhiXHhjMVx4NDZceDk5XHg1OVx4MWEiCi0gICAgICAgICAgICAgICJceDJiXHg1OFx4MWFceDlhXHg4M1x4OGNceDQ5XHhlM1x4MGFceDA0XHg0Mlx4MDBceDM3XHg0Y1x4MWJceDQyIgotICAgICAgICAgICAgICApLAorICAgICAgVEVTVF9DQVNFKCIiLCAiXHg3OFx4OWNceDAzXHgwMFx4MDBceDAwXHgwMFx4MDEiKSwKKyAgICAgIFRFU1RfQ0FTRSgiICIsICJceDc4XHg5Y1x4NTNceDAwXHgwMFx4MDBceDIxXHgwMFx4MjEiKSwKKyAgICAgIFRFU1RfQ0FTRSgiMTIzIiwgIlx4NzhceDljXHgzM1x4MzRceDMyXHgwNlx4MDBcMDFceDJkXHgwMFx4OTciKSwKKyAgICAgIFRFU1RfQ0FTRSgiXHgwMFx4ZmYiLCAiXHg3OFx4OWNceDYzXHhmOFx4MGZceDAwXHgwMVx4MDFceDAxXHgwMCIpLAorICAgICAgVEVTVF9DQVNFKAorICAgICAgICAgICIxIDAgMCAtMSAyOSA3NjMgY21cbjAgMCA1NTUgNzM1IHJlXG5XIG5cbnFcbjAgMCA1NTUgNzM0LjM5NCByZVxuIgorICAgICAgICAgICJXIG5cbnFcbjAuODAwOSAwIDAgMC44MDA5IDAgMCBjbVxuMSAxIDEgUkcgMSAxIDEgcmdcbi9HMCBnc1xuIgorICAgICAgICAgICIwIDAgNjkzIDkxNyByZVxuZlxuUVxuUVxuIiwKKyAgICAgICAgICAiXHg3OFx4OWNceDMzXHg1NFx4MzBceDAwXHg0Mlx4NWRceDQzXHgwNVx4MjNceDRiXHgwNVx4NzNceDMzXHg2MyIKKyAgICAgICAgICAiXHg4NVx4ZTRceDVjXHgyZVx4OTBceDgwXHhhOVx4YTlceGE5XHg4Mlx4YjlceGIxXHhhOVx4NDJceDUxXHgyYSIKKyAgICAgICAgICAiXHg1N1x4YjhceDQyXHgxZVx4NTdceDIxXHg5Mlx4YTBceDg5XHg5ZVx4YjFceGE1XHgwOVx4OTJceDg0XHg5ZSIKKyAgICAgICAgICAiXHg4NVx4ODFceDgxXHgyNVx4ZDhceDE0XHgyNFx4MjZceGQwXHgxOFx4NDNceDA1XHgxMFx4MGNceDcyXHg1NyIKKyAgICAgICAgICAiXHg4MFx4MzBceDhhXHhkMlx4YjlceGY0XHhkZFx4MGRceDE0XHhkMlx4OGJceGMxXHg0Nlx4OTlceDU5XHgxYSIKKyAgICAgICAgICAiXHgyYlx4NThceDFhXHg5YVx4ODNceDhjXHg0OVx4ZTNceDBhXHgwNFx4NDJceDAwXHgzN1x4NGNceDFiXHg0MiIpLAogICB9OwogCiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGZsYXRlX2VuY29kZV9jYXNlcyk7ICsraSkgewpAQCAtNjYsMjMgKzY1LDIxIEBACiAgICAgY29uc3QgdW5zaWduZWQgY2hhciogZXhwZWN0ZWQ7CiAgICAgdW5zaWduZWQgaW50IGV4cGVjdGVkX3NpemU7CiAgIH0gZmxhdGVfZGVjb2RlX2Nhc2VzW10gPSB7Ci0gICAgVEVTVF9DQVNFKCIiLCAiIiksCi0gICAgVEVTVF9DQVNFKCJwcmVwb3N0ZXJvdXMgbm9uc2Vuc2UiLCAiIiksCi0gICAgVEVTVF9DQVNFKCJceDc4XHg5Y1x4MDNceDAwXHgwMFx4MDBceDAwXHgwMSIsICIiKSwKLSAgICBURVNUX0NBU0UoIlx4NzhceDljXHg1M1x4MDBceDAwXHgwMFx4MjFceDAwXHgyMSIsICIgIiksCi0gICAgVEVTVF9DQVNFKCJceDc4XHg5Y1x4MzNceDM0XHgzMlx4MDZceDAwXDAxXHgyZFx4MDBceDk3IiwgIjEyMyIpLAotICAgIFRFU1RfQ0FTRSgiXHg3OFx4OWNceDYzXHhmOFx4MGZceDAwXHgwMVx4MDFceDAxXHgwMCIsICJceDAwXHhmZiIpLAotICAgIFRFU1RfQ0FTRSgiXHg3OFx4OWNceDMzXHg1NFx4MzBceDAwXHg0Mlx4NWRceDQzXHgwNVx4MjNceDRiXHgwNVx4NzNceDMzXHg2MyIKLSAgICAgICAgICAgICAgIlx4ODVceGU0XHg1Y1x4MmVceDkwXHg4MFx4YTlceGE5XHhhOVx4ODJceGI5XHhiMVx4YTlceDQyXHg1MVx4MmEiCi0gICAgICAgICAgICAgICJceDU3XHhiOFx4NDJceDFlXHg1N1x4MjFceDkyXHhhMFx4ODlceDllXHhiMVx4YTVceDA5XHg5Mlx4ODRceDllIgotICAgICAgICAgICAgICAiXHg4NVx4ODFceDgxXHgyNVx4ZDhceDE0XHgyNFx4MjZceGQwXHgxOFx4NDNceDA1XHgxMFx4MGNceDcyXHg1NyIKLSAgICAgICAgICAgICAgIlx4ODBceDMwXHg4YVx4ZDJceGI5XHhmNFx4ZGRceDBkXHgxNFx4ZDJceDhiXHhjMVx4NDZceDk5XHg1OVx4MWEiCi0gICAgICAgICAgICAgICJceDJiXHg1OFx4MWFceDlhXHg4M1x4OGNceDQ5XHhlM1x4MGFceDA0XHg0Mlx4MDBceDM3XHg0Y1x4MWJceDQyIgotICAgICAgICAgICAgICAsCi0gICAgICAgICAgICAgICIxIDAgMCAtMSAyOSA3NjMgY21cbjAgMCA1NTUgNzM1IHJlXG5XIG5cbnFcbjAgMCA1NTUgNzM0LjM5NCByZVxuIgotICAgICAgICAgICAgICAiVyBuXG5xXG4wLjgwMDkgMCAwIDAuODAwOSAwIDAgY21cbjEgMSAxIFJHIDEgMSAxIHJnXG4vRzAgZ3NcbiIKLSAgICAgICAgICAgICAgIjAgMCA2OTMgOTE3IHJlXG5mXG5RXG5RXG4iCi0gICAgICAgICAgICAgICksCisgICAgICBURVNUX0NBU0UoIiIsICIiKSwgVEVTVF9DQVNFKCJwcmVwb3N0ZXJvdXMgbm9uc2Vuc2UiLCAiIiksCisgICAgICBURVNUX0NBU0UoIlx4NzhceDljXHgwM1x4MDBceDAwXHgwMFx4MDBceDAxIiwgIiIpLAorICAgICAgVEVTVF9DQVNFKCJceDc4XHg5Y1x4NTNceDAwXHgwMFx4MDBceDIxXHgwMFx4MjEiLCAiICIpLAorICAgICAgVEVTVF9DQVNFKCJceDc4XHg5Y1x4MzNceDM0XHgzMlx4MDZceDAwXDAxXHgyZFx4MDBceDk3IiwgIjEyMyIpLAorICAgICAgVEVTVF9DQVNFKCJceDc4XHg5Y1x4NjNceGY4XHgwZlx4MDBceDAxXHgwMVx4MDFceDAwIiwgIlx4MDBceGZmIiksCisgICAgICBURVNUX0NBU0UoCisgICAgICAgICAgIlx4NzhceDljXHgzM1x4NTRceDMwXHgwMFx4NDJceDVkXHg0M1x4MDVceDIzXHg0Ylx4MDVceDczXHgzM1x4NjMiCisgICAgICAgICAgIlx4ODVceGU0XHg1Y1x4MmVceDkwXHg4MFx4YTlceGE5XHhhOVx4ODJceGI5XHhiMVx4YTlceDQyXHg1MVx4MmEiCisgICAgICAgICAgIlx4NTdceGI4XHg0Mlx4MWVceDU3XHgyMVx4OTJceGEwXHg4OVx4OWVceGIxXHhhNVx4MDlceDkyXHg4NFx4OWUiCisgICAgICAgICAgIlx4ODVceDgxXHg4MVx4MjVceGQ4XHgxNFx4MjRceDI2XHhkMFx4MThceDQzXHgwNVx4MTBceDBjXHg3Mlx4NTciCisgICAgICAgICAgIlx4ODBceDMwXHg4YVx4ZDJceGI5XHhmNFx4ZGRceDBkXHgxNFx4ZDJceDhiXHhjMVx4NDZceDk5XHg1OVx4MWEiCisgICAgICAgICAgIlx4MmJceDU4XHgxYVx4OWFceDgzXHg4Y1x4NDlceGUzXHgwYVx4MDRceDQyXHgwMFx4MzdceDRjXHgxYlx4NDIiLAorICAgICAgICAgICIxIDAgMCAtMSAyOSA3NjMgY21cbjAgMCA1NTUgNzM1IHJlXG5XIG5cbnFcbjAgMCA1NTUgNzM0LjM5NCByZVxuIgorICAgICAgICAgICJXIG5cbnFcbjAuODAwOSAwIDAgMC44MDA5IDAgMCBjbVxuMSAxIDEgUkcgMSAxIDEgcmdcbi9HMCBnc1xuIgorICAgICAgICAgICIwIDAgNjkzIDkxNyByZVxuZlxuUVxuUVxuIiksCiAgIH07CiAKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoZmxhdGVfZGVjb2RlX2Nhc2VzKTsgKytpKSB7CkBAIC05OCw1ICs5NSwyNCBAQAogICB9CiB9CiAKK1RFU1RfRihGUERGUGFyc2VyRGVjb2RlRW1iZWRkZXJ0ZXN0LCBCdWdfNTUyMDQ2KSB7CisgIC8vIFRlc3RzIHNwZWNpZnlpbmcgbXVsdGlwbGUgaW1hZ2UgZmlsdGVycyBmb3IgYSBzdHJlYW0uIFNob3VsZCBub3QgY2F1c2UgYQorICAvLyBjcmFzaCB3aGVuIHJlbmRlcmVkLgorICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoImJ1Z181NTIwNDYucGRmIikpOworICBGUERGX1BBR0UgcGFnZSA9IExvYWRQYWdlKDApOworICBGUERGX0JJVE1BUCBiaXRtYXAgPSBSZW5kZXJQYWdlKHBhZ2UpOworICBGUERGQml0bWFwX0Rlc3Ryb3koYml0bWFwKTsKKyAgVW5sb2FkUGFnZShwYWdlKTsKK30KKworVEVTVF9GKEZQREZQYXJzZXJEZWNvZGVFbWJlZGRlcnRlc3QsIEJ1Z181NTU3ODQpIHsKKyAgLy8gVGVzdHMgYmFkIGlucHV0IHRvIHRoZSBydW4gbGVuZ3RoIGRlY29kZXIgdGhhdCBjYXVzZWQgYSBoZWFwIG92ZXJmbG93LgorICAvLyBTaG91bGQgbm90IGNhdXNlIGEgY3Jhc2ggd2hlbiByZW5kZXJlZC4KKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJidWdfNTU1Nzg0LnBkZiIpKTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBMb2FkUGFnZSgwKTsKKyAgRlBERl9CSVRNQVAgYml0bWFwID0gUmVuZGVyUGFnZShwYWdlKTsKKyAgRlBERkJpdG1hcF9EZXN0cm95KGJpdG1hcCk7CisgIFVubG9hZFBhZ2UocGFnZSk7Cit9CiAKICN1bmRlZiBURVNUX0NBU0UKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlX3VuaXR0ZXN0LmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzE4YmNkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGVfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNTUgQEAKKy8vIENvcHlyaWdodCAyMDE1IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFyc2VyLmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKK1RFU1QoZnBkZl9wYXJzZXJfZGVjb2RlLCBIZXhEZWNvZGUpIHsKKyAgeworICAgIC8vIEVtcHR5IHNyYyBzdHJpbmcuCisgICAgdWludDhfdCogZGVzdCA9IG51bGxwdHI7CisgICAgRlhfRFdPUkQgZGVzdF9zaXplOworICAgIHVpbnQ4X3Qgc3JjW10gPSAiIjsKKyAgICBFWFBFQ1RfRVEoMCwgSGV4RGVjb2RlKHNyYywgMCwgZGVzdCwgZGVzdF9zaXplKSk7CisgICAgRVhQRUNUX0VRKDAsIGRlc3Rfc2l6ZSk7CisgICAgRVhQRUNUX0VRKCdcMCcsIGRlc3RbMF0pOworICAgIEZYX0ZyZWUoZGVzdCk7CisgIH0KKworICB7CisgICAgLy8gUmVndWxhciBjb252ZXJzaW9uLgorICAgIHVpbnQ4X3QqIGRlc3QgPSBudWxscHRyOworICAgIEZYX0RXT1JEIGRlc3Rfc2l6ZTsKKyAgICB1aW50OF90IHNyY1tdID0gIjEyQWM+enp6IjsKKyAgICBFWFBFQ1RfRVEoNSwgSGV4RGVjb2RlKHNyYywgOCwgZGVzdCwgZGVzdF9zaXplKSk7CisgICAgRVhQRUNUX0VRKDIsIGRlc3Rfc2l6ZSk7CisgICAgRVhQRUNUX0VRKDE4LCBkZXN0WzBdKTsKKyAgICBFWFBFQ1RfRVEoMTcyLCBkZXN0WzFdKTsKKyAgICBGWF9GcmVlKGRlc3QpOworICB9CisKKyAgeworICAgIC8vIE5vbi1tdWx0aXBsZSBsZW5ndGguCisgICAgdWludDhfdCogZGVzdCA9IG51bGxwdHI7CisgICAgRlhfRFdPUkQgZGVzdF9zaXplOworICAgIHVpbnQ4X3Qgc3JjW10gPSAiMTJBPnp6eiI7CisgICAgRVhQRUNUX0VRKDQsIEhleERlY29kZShzcmMsIDgsIGRlc3QsIGRlc3Rfc2l6ZSkpOworICAgIEVYUEVDVF9FUSgyLCBkZXN0X3NpemUpOworICAgIEVYUEVDVF9FUSgxOCwgZGVzdFswXSk7CisgICAgRVhQRUNUX0VRKDE2MCwgZGVzdFsxXSk7CisgICAgRlhfRnJlZShkZXN0KTsKKyAgfQorCisgIHsKKyAgICAvLyBTa2lwcyB1bmtub3duIGNoYXJhY3RlcnMuCisgICAgdWludDhfdCogZGVzdCA9IG51bGxwdHI7CisgICAgRlhfRFdPUkQgZGVzdF9zaXplOworICAgIHVpbnQ4X3Qgc3JjW10gPSAiMTJ0ayAgXHRBYz56enoiOworICAgIEVYUEVDVF9FUSgxMCwgSGV4RGVjb2RlKHNyYywgMTMsIGRlc3QsIGRlc3Rfc2l6ZSkpOworICAgIEVYUEVDVF9FUSgyLCBkZXN0X3NpemUpOworICAgIEVYUEVDVF9FUSgxOCwgZGVzdFswXSk7CisgICAgRVhQRUNUX0VRKDE3MiwgZGVzdFsxXSk7CisgICAgRlhfRnJlZShkZXN0KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9kb2N1bWVudC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2RvY3VtZW50LmNwcAppbmRleCBiMTFjN2VlLi5kODA5MWU4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2RvY3VtZW50LmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2RvY3VtZW50LmNwcApAQCAtMSwzNjkgKzEsMzU2IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYXJzZXIuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhcnNlci5oIgogCi1DUERGX0RvY3VtZW50OjpDUERGX0RvY3VtZW50KENQREZfUGFyc2VyKiBwUGFyc2VyKSA6IENQREZfSW5kaXJlY3RPYmplY3RzKHBQYXJzZXIpCi17Ci0gICAgQVNTRVJUKHBQYXJzZXIgIT0gTlVMTCk7Ci0gICAgbV9wUm9vdERpY3QgPSBOVUxMOwotICAgIG1fcEluZm9EaWN0ID0gTlVMTDsKLSAgICBtX2JMaW5lYXJpemVkID0gRkFMU0U7Ci0gICAgbV9kd0ZpcnN0UGFnZU5vID0gMDsKLSAgICBtX2R3Rmlyc3RQYWdlT2JqTnVtID0gMDsKLSAgICBtX3BEb2NQYWdlID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkNyZWF0ZURvY0RhdGEodGhpcyk7Ci0gICAgbV9wRG9jUmVuZGVyID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRSZW5kZXJNb2R1bGUoKS0+Q3JlYXRlRG9jRGF0YSh0aGlzKTsKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oIgorCitDUERGX0RvY3VtZW50OjpDUERGX0RvY3VtZW50KENQREZfUGFyc2VyKiBwUGFyc2VyKQorICAgIDogQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlcihwUGFyc2VyKSB7CisgIEFTU0VSVChwUGFyc2VyKTsKKyAgbV9wUm9vdERpY3QgPSBOVUxMOworICBtX3BJbmZvRGljdCA9IE5VTEw7CisgIG1fYkxpbmVhcml6ZWQgPSBGQUxTRTsKKyAgbV9kd0ZpcnN0UGFnZU5vID0gMDsKKyAgbV9kd0ZpcnN0UGFnZU9iak51bSA9IDA7CisgIG1fcERvY1BhZ2UgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+Q3JlYXRlRG9jRGF0YSh0aGlzKTsKKyAgbV9wRG9jUmVuZGVyID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRSZW5kZXJNb2R1bGUoKS0+Q3JlYXRlRG9jRGF0YSh0aGlzKTsKIH0KLUNQREZfRG9jUGFnZURhdGEqIENQREZfRG9jdW1lbnQ6OkdldFZhbGlkYXRlUGFnZURhdGEoKQotewotICAgIGlmIChtX3BEb2NQYWdlKSB7Ci0gICAgICAgIHJldHVybiBtX3BEb2NQYWdlOwotICAgIH0KLSAgICBtX3BEb2NQYWdlID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkNyZWF0ZURvY0RhdGEodGhpcyk7CitDUERGX0RvY1BhZ2VEYXRhKiBDUERGX0RvY3VtZW50OjpHZXRWYWxpZGF0ZVBhZ2VEYXRhKCkgeworICBpZiAobV9wRG9jUGFnZSkgewogICAgIHJldHVybiBtX3BEb2NQYWdlOworICB9CisgIG1fcERvY1BhZ2UgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+Q3JlYXRlRG9jRGF0YSh0aGlzKTsKKyAgcmV0dXJuIG1fcERvY1BhZ2U7CiB9Ci1DUERGX0RvY1JlbmRlckRhdGEqIENQREZfRG9jdW1lbnQ6OkdldFZhbGlkYXRlUmVuZGVyRGF0YSgpCi17Ci0gICAgaWYgKG1fcERvY1JlbmRlcikgewotICAgICAgICByZXR1cm4gbV9wRG9jUmVuZGVyOwotICAgIH0KLSAgICBtX3BEb2NSZW5kZXIgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFJlbmRlck1vZHVsZSgpLT5DcmVhdGVEb2NEYXRhKHRoaXMpOworQ1BERl9Eb2NSZW5kZXJEYXRhKiBDUERGX0RvY3VtZW50OjpHZXRWYWxpZGF0ZVJlbmRlckRhdGEoKSB7CisgIGlmIChtX3BEb2NSZW5kZXIpIHsKICAgICByZXR1cm4gbV9wRG9jUmVuZGVyOworICB9CisgIG1fcERvY1JlbmRlciA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UmVuZGVyTW9kdWxlKCktPkNyZWF0ZURvY0RhdGEodGhpcyk7CisgIHJldHVybiBtX3BEb2NSZW5kZXI7CiB9Ci12b2lkIENQREZfRG9jdW1lbnQ6OkxvYWREb2MoKQotewotICAgIG1fTGFzdE9iak51bSA9IG1fcFBhcnNlci0+R2V0TGFzdE9iak51bSgpOwotICAgIENQREZfT2JqZWN0KiBwUm9vdE9iaiA9IEdldEluZGlyZWN0T2JqZWN0KG1fcFBhcnNlci0+R2V0Um9vdE9iak51bSgpKTsKLSAgICBpZiAocFJvb3RPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fcFJvb3REaWN0ID0gcFJvb3RPYmotPkdldERpY3QoKTsKLSAgICBpZiAobV9wUm9vdERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwSW5mb09iaiA9IEdldEluZGlyZWN0T2JqZWN0KG1fcFBhcnNlci0+R2V0SW5mb09iak51bSgpKTsKLSAgICBpZiAocEluZm9PYmopIHsKLSAgICAgICAgbV9wSW5mb0RpY3QgPSBwSW5mb09iai0+R2V0RGljdCgpOwotICAgIH0KLSAgICBDUERGX0FycmF5KiBwSURBcnJheSA9IG1fcFBhcnNlci0+R2V0SURBcnJheSgpOwotICAgIGlmIChwSURBcnJheSkgewotICAgICAgICBtX0lEMSA9IHBJREFycmF5LT5HZXRTdHJpbmcoMCk7Ci0gICAgICAgIG1fSUQyID0gcElEQXJyYXktPkdldFN0cmluZygxKTsKLSAgICB9Ci0gICAgbV9QYWdlTGlzdC5TZXRTaXplKF9HZXRQYWdlQ291bnQoKSk7Cit2b2lkIENQREZfRG9jdW1lbnQ6OkxvYWREb2MoKSB7CisgIG1fTGFzdE9iak51bSA9IG1fcFBhcnNlci0+R2V0TGFzdE9iak51bSgpOworICBDUERGX09iamVjdCogcFJvb3RPYmogPQorICAgICAgR2V0SW5kaXJlY3RPYmplY3QobV9wUGFyc2VyLT5HZXRSb290T2JqTnVtKCksIG51bGxwdHIpOworICBpZiAoIXBSb290T2JqKSB7CisgICAgcmV0dXJuOworICB9CisgIG1fcFJvb3REaWN0ID0gcFJvb3RPYmotPkdldERpY3QoKTsKKyAgaWYgKCFtX3BSb290RGljdCkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX09iamVjdCogcEluZm9PYmogPQorICAgICAgR2V0SW5kaXJlY3RPYmplY3QobV9wUGFyc2VyLT5HZXRJbmZvT2JqTnVtKCksIG51bGxwdHIpOworICBpZiAocEluZm9PYmopIHsKKyAgICBtX3BJbmZvRGljdCA9IHBJbmZvT2JqLT5HZXREaWN0KCk7CisgIH0KKyAgQ1BERl9BcnJheSogcElEQXJyYXkgPSBtX3BQYXJzZXItPkdldElEQXJyYXkoKTsKKyAgaWYgKHBJREFycmF5KSB7CisgICAgbV9JRDEgPSBwSURBcnJheS0+R2V0U3RyaW5nKDApOworICAgIG1fSUQyID0gcElEQXJyYXktPkdldFN0cmluZygxKTsKKyAgfQorICBtX1BhZ2VMaXN0LlNldFNpemUoX0dldFBhZ2VDb3VudCgpKTsKIH0KLXZvaWQgQ1BERl9Eb2N1bWVudDo6TG9hZEFzeW5Eb2MoQ1BERl9EaWN0aW9uYXJ5ICpwTGluZWFyaXplZCkKLXsKLSAgICBtX2JMaW5lYXJpemVkID0gVFJVRTsKLSAgICBtX0xhc3RPYmpOdW0gPSBtX3BQYXJzZXItPkdldExhc3RPYmpOdW0oKTsKLSAgICBDUERGX09iamVjdCogaW5kaXJlY3RPYmogPSBHZXRJbmRpcmVjdE9iamVjdChtX3BQYXJzZXItPkdldFJvb3RPYmpOdW0oKSk7Ci0gICAgbV9wUm9vdERpY3QgPSBpbmRpcmVjdE9iaiA/IGluZGlyZWN0T2JqLT5HZXREaWN0KCkgOiBOVUxMOwotICAgIGlmIChtX3BSb290RGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW5kaXJlY3RPYmogPSBHZXRJbmRpcmVjdE9iamVjdChtX3BQYXJzZXItPkdldEluZm9PYmpOdW0oKSk7Ci0gICAgbV9wSW5mb0RpY3QgPSBpbmRpcmVjdE9iaiA/IGluZGlyZWN0T2JqLT5HZXREaWN0KCkgOiBOVUxMOwotICAgIENQREZfQXJyYXkqIHBJREFycmF5ID0gbV9wUGFyc2VyLT5HZXRJREFycmF5KCk7Ci0gICAgaWYgKHBJREFycmF5KSB7Ci0gICAgICAgIG1fSUQxID0gcElEQXJyYXktPkdldFN0cmluZygwKTsKLSAgICAgICAgbV9JRDIgPSBwSURBcnJheS0+R2V0U3RyaW5nKDEpOwotICAgIH0KLSAgICBGWF9EV09SRCBkd1BhZ2VDb3VudCA9IDA7Ci0gICAgQ1BERl9PYmplY3QgKnBDb3VudCA9IHBMaW5lYXJpemVkLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJOIikpOwotICAgIGlmIChwQ291bnQgJiYgcENvdW50LT5HZXRUeXBlKCkgPT0gUERGT0JKX05VTUJFUikgewotICAgICAgICBkd1BhZ2VDb3VudCA9IHBDb3VudC0+R2V0SW50ZWdlcigpOwotICAgIH0KLSAgICBtX1BhZ2VMaXN0LlNldFNpemUoZHdQYWdlQ291bnQpOwotICAgIENQREZfT2JqZWN0ICpwTm8gPSBwTGluZWFyaXplZC0+R2V0RWxlbWVudChGWF9CU1RSQygiUCIpKTsKLSAgICBpZiAocE5vICYmIHBOby0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIpIHsKLSAgICAgICAgbV9kd0ZpcnN0UGFnZU5vID0gcE5vLT5HZXRJbnRlZ2VyKCk7Ci0gICAgfQotICAgIENQREZfT2JqZWN0ICpwT2JqTnVtID0gcExpbmVhcml6ZWQtPkdldEVsZW1lbnQoRlhfQlNUUkMoIk8iKSk7Ci0gICAgaWYgKHBPYmpOdW0gJiYgcE9iak51bS0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIpIHsKLSAgICAgICAgbV9kd0ZpcnN0UGFnZU9iak51bSA9IHBPYmpOdW0tPkdldEludGVnZXIoKTsKLSAgICB9Cit2b2lkIENQREZfRG9jdW1lbnQ6OkxvYWRBc3luRG9jKENQREZfRGljdGlvbmFyeSogcExpbmVhcml6ZWQpIHsKKyAgbV9iTGluZWFyaXplZCA9IFRSVUU7CisgIG1fTGFzdE9iak51bSA9IG1fcFBhcnNlci0+R2V0TGFzdE9iak51bSgpOworICBDUERGX09iamVjdCogcEluZGlyZWN0T2JqID0KKyAgICAgIEdldEluZGlyZWN0T2JqZWN0KG1fcFBhcnNlci0+R2V0Um9vdE9iak51bSgpLCBudWxscHRyKTsKKyAgbV9wUm9vdERpY3QgPSBwSW5kaXJlY3RPYmogPyBwSW5kaXJlY3RPYmotPkdldERpY3QoKSA6IG51bGxwdHI7CisgIGlmICghbV9wUm9vdERpY3QpIHsKKyAgICByZXR1cm47CisgIH0KKyAgcEluZGlyZWN0T2JqID0gR2V0SW5kaXJlY3RPYmplY3QobV9wUGFyc2VyLT5HZXRJbmZvT2JqTnVtKCksIG51bGxwdHIpOworICBtX3BJbmZvRGljdCA9IHBJbmRpcmVjdE9iaiA/IHBJbmRpcmVjdE9iai0+R2V0RGljdCgpIDogbnVsbHB0cjsKKyAgQ1BERl9BcnJheSogcElEQXJyYXkgPSBtX3BQYXJzZXItPkdldElEQXJyYXkoKTsKKyAgaWYgKHBJREFycmF5KSB7CisgICAgbV9JRDEgPSBwSURBcnJheS0+R2V0U3RyaW5nKDApOworICAgIG1fSUQyID0gcElEQXJyYXktPkdldFN0cmluZygxKTsKKyAgfQorICBGWF9EV09SRCBkd1BhZ2VDb3VudCA9IDA7CisgIENQREZfT2JqZWN0KiBwQ291bnQgPSBwTGluZWFyaXplZC0+R2V0RWxlbWVudCgiTiIpOworICBpZiAoVG9OdW1iZXIocENvdW50KSkKKyAgICBkd1BhZ2VDb3VudCA9IHBDb3VudC0+R2V0SW50ZWdlcigpOworCisgIG1fUGFnZUxpc3QuU2V0U2l6ZShkd1BhZ2VDb3VudCk7CisgIENQREZfT2JqZWN0KiBwTm8gPSBwTGluZWFyaXplZC0+R2V0RWxlbWVudCgiUCIpOworICBpZiAoVG9OdW1iZXIocE5vKSkKKyAgICBtX2R3Rmlyc3RQYWdlTm8gPSBwTm8tPkdldEludGVnZXIoKTsKKworICBDUERGX09iamVjdCogcE9iak51bSA9IHBMaW5lYXJpemVkLT5HZXRFbGVtZW50KCJPIik7CisgIGlmIChUb051bWJlcihwT2JqTnVtKSkKKyAgICBtX2R3Rmlyc3RQYWdlT2JqTnVtID0gcE9iak51bS0+R2V0SW50ZWdlcigpOwogfQotdm9pZCBDUERGX0RvY3VtZW50OjpMb2FkUGFnZXMoKQotewotICAgIG1fUGFnZUxpc3QuU2V0U2l6ZShfR2V0UGFnZUNvdW50KCkpOwordm9pZCBDUERGX0RvY3VtZW50OjpMb2FkUGFnZXMoKSB7CisgIG1fUGFnZUxpc3QuU2V0U2l6ZShfR2V0UGFnZUNvdW50KCkpOwogfQotZXh0ZXJuIHZvaWQgRlBERl9UVEZhY2VNYXBwZXJfUmVsZWFzZURvYyhDUERGX0RvY3VtZW50Kik7Ci1DUERGX0RvY3VtZW50Ojp+Q1BERl9Eb2N1bWVudCgpCi17Ci0gICAgaWYgKG1fcERvY1BhZ2UpIHsKLSAgICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPlJlbGVhc2VEb2ModGhpcyk7Ci0gICAgICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5DbGVhclN0b2NrRm9udCh0aGlzKTsKLSAgICB9Ci0gICAgaWYgKG1fcERvY1JlbmRlcikgewotICAgICAgICBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFJlbmRlck1vZHVsZSgpLT5EZXN0cm95RG9jRGF0YShtX3BEb2NSZW5kZXIpOwotICAgIH0KK0NQREZfRG9jdW1lbnQ6On5DUERGX0RvY3VtZW50KCkgeworICBpZiAobV9wRG9jUGFnZSkgeworICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5SZWxlYXNlRG9jKHRoaXMpOworICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5DbGVhclN0b2NrRm9udCh0aGlzKTsKKyAgfQorICBpZiAobV9wRG9jUmVuZGVyKSB7CisgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRSZW5kZXJNb2R1bGUoKS0+RGVzdHJveURvY0RhdGEobV9wRG9jUmVuZGVyKTsKKyAgfQogfQotI2RlZmluZQkJRlhfTUFYX1BBR0VfTEVWRUwJCQkxMDI0Ci1DUERGX0RpY3Rpb25hcnkqIENQREZfRG9jdW1lbnQ6Ol9GaW5kUERGUGFnZShDUERGX0RpY3Rpb25hcnkqIHBQYWdlcywgaW50IGlQYWdlLCBpbnQgblBhZ2VzVG9HbywgaW50IGxldmVsKQotewotICAgIENQREZfQXJyYXkqIHBLaWRMaXN0ID0gcFBhZ2VzLT5HZXRBcnJheShGWF9CU1RSQygiS2lkcyIpKTsKLSAgICBpZiAocEtpZExpc3QgPT0gTlVMTCkgewotICAgICAgICBpZiAoblBhZ2VzVG9HbyA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gcFBhZ2VzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAobGV2ZWwgPj0gRlhfTUFYX1BBR0VfTEVWRUwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGludCBuS2lkcyA9IHBLaWRMaXN0LT5HZXRDb3VudCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbktpZHM7IGkgKyspIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwS2lkID0gcEtpZExpc3QtPkdldERpY3QoaSk7Ci0gICAgICAgIGlmIChwS2lkID09IE5VTEwpIHsKLSAgICAgICAgICAgIG5QYWdlc1RvR28gLS07Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocEtpZCA9PSBwUGFnZXMpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcEtpZC0+S2V5RXhpc3QoRlhfQlNUUkMoIktpZHMiKSkpIHsKLSAgICAgICAgICAgIGlmIChuUGFnZXNUb0dvID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcEtpZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fUGFnZUxpc3QuU2V0QXQoaVBhZ2UgLSBuUGFnZXNUb0dvLCBwS2lkLT5HZXRPYmpOdW0oKSk7Ci0gICAgICAgICAgICBuUGFnZXNUb0dvIC0tOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IG5QYWdlcyA9IHBLaWQtPkdldEludGVnZXIoRlhfQlNUUkMoIkNvdW50IikpOwotICAgICAgICAgICAgaWYgKG5QYWdlc1RvR28gPCBuUGFnZXMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX0ZpbmRQREZQYWdlKHBLaWQsIGlQYWdlLCBuUGFnZXNUb0dvLCBsZXZlbCArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgblBhZ2VzVG9HbyAtPSBuUGFnZXM7Ci0gICAgICAgIH0KKyNkZWZpbmUgRlhfTUFYX1BBR0VfTEVWRUwgMTAyNAorQ1BERl9EaWN0aW9uYXJ5KiBDUERGX0RvY3VtZW50OjpfRmluZFBERlBhZ2UoQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaVBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblBhZ2VzVG9HbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCkgeworICBDUERGX0FycmF5KiBwS2lkTGlzdCA9IHBQYWdlcy0+R2V0QXJyYXkoIktpZHMiKTsKKyAgaWYgKCFwS2lkTGlzdCkgeworICAgIGlmIChuUGFnZXNUb0dvID09IDApIHsKKyAgICAgIHJldHVybiBwUGFnZXM7CiAgICAgfQogICAgIHJldHVybiBOVUxMOwotfQotQ1BERl9EaWN0aW9uYXJ5KiBDUERGX0RvY3VtZW50OjpHZXRQYWdlKGludCBpUGFnZSkKLXsKLSAgICBpZiAoaVBhZ2UgPCAwIHx8IGlQYWdlID49IG1fUGFnZUxpc3QuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChsZXZlbCA+PSBGWF9NQVhfUEFHRV9MRVZFTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGludCBuS2lkcyA9IHBLaWRMaXN0LT5HZXRDb3VudCgpOworICBmb3IgKGludCBpID0gMDsgaSA8IG5LaWRzOyBpKyspIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBLaWQgPSBwS2lkTGlzdC0+R2V0RGljdChpKTsKKyAgICBpZiAoIXBLaWQpIHsKKyAgICAgIG5QYWdlc1RvR28tLTsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpZiAobV9iTGluZWFyaXplZCAmJiAoaVBhZ2UgPT0gKGludCltX2R3Rmlyc3RQYWdlTm8pKSB7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gR2V0SW5kaXJlY3RPYmplY3QobV9kd0ZpcnN0UGFnZU9iak51bSk7Ci0gICAgICAgIGlmIChwT2JqICYmIHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICAgICAgcmV0dXJuIChDUERGX0RpY3Rpb25hcnkqKXBPYmo7Ci0gICAgICAgIH0KKyAgICBpZiAocEtpZCA9PSBwUGFnZXMpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpbnQgb2JqbnVtID0gbV9QYWdlTGlzdC5HZXRBdChpUGFnZSk7Ci0gICAgaWYgKG9iam51bSkgewotICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IEdldEluZGlyZWN0T2JqZWN0KG9iam51bSk7Ci0gICAgICAgIEFTU0VSVChwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpOwotICAgICAgICByZXR1cm4gKENQREZfRGljdGlvbmFyeSopcE9iajsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IEdldFJvb3QoKTsKLSAgICBpZiAocFJvb3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZXMgPSBwUm9vdC0+R2V0RGljdChGWF9CU1RSQygiUGFnZXMiKSk7Ci0gICAgaWYgKHBQYWdlcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlID0gX0ZpbmRQREZQYWdlKHBQYWdlcywgaVBhZ2UsIGlQYWdlLCAwKTsKLSAgICBpZiAocFBhZ2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgbV9QYWdlTGlzdC5TZXRBdChpUGFnZSwgcFBhZ2UtPkdldE9iak51bSgpKTsKLSAgICByZXR1cm4gcFBhZ2U7Ci19Ci1pbnQgQ1BERl9Eb2N1bWVudDo6X0ZpbmRQYWdlSW5kZXgoQ1BERl9EaWN0aW9uYXJ5KiBwTm9kZSwgRlhfRFdPUkQmIHNraXBfY291bnQsIEZYX0RXT1JEIG9iam51bSwgaW50JiBpbmRleCwgaW50IGxldmVsKQotewotICAgIGlmIChwTm9kZS0+S2V5RXhpc3QoRlhfQlNUUkMoIktpZHMiKSkpIHsKLSAgICAgICAgQ1BERl9BcnJheSogcEtpZExpc3QgPSBwTm9kZS0+R2V0QXJyYXkoRlhfQlNUUkMoIktpZHMiKSk7Ci0gICAgICAgIGlmIChwS2lkTGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxldmVsID49IEZYX01BWF9QQUdFX0xFVkVMKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRFdPUkQgY291bnQgPSBwTm9kZS0+R2V0SW50ZWdlcihGWF9CU1RSQygiQ291bnQiKSk7Ci0gICAgICAgIGlmIChjb3VudCA8PSBza2lwX2NvdW50KSB7Ci0gICAgICAgICAgICBza2lwX2NvdW50IC09IGNvdW50OwotICAgICAgICAgICAgaW5kZXggKz0gY291bnQ7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvdW50ICYmIGNvdW50ID09IHBLaWRMaXN0LT5HZXRDb3VudCgpKSB7Ci0gICAgICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgY291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcEtpZCA9IHBLaWRMaXN0LT5HZXRFbGVtZW50KGkpOwotICAgICAgICAgICAgICAgIGlmIChwS2lkICYmIHBLaWQtPkdldFR5cGUoKSA9PSBQREZPQkpfUkVGRVJFTkNFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoKENQREZfUmVmZXJlbmNlKikgcEtpZCktPkdldFJlZk9iak51bSgpID09IG9iam51bSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9QYWdlTGlzdC5TZXRBdChpbmRleCArIGksIG9iam51bSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggKyBpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwS2lkTGlzdC0+R2V0Q291bnQoKTsgaSArKykgewotICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwS2lkID0gcEtpZExpc3QtPkdldERpY3QoaSk7Ci0gICAgICAgICAgICBpZiAocEtpZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocEtpZCA9PSBwTm9kZSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGZvdW5kX2luZGV4ID0gX0ZpbmRQYWdlSW5kZXgocEtpZCwgc2tpcF9jb3VudCwgb2JqbnVtLCBpbmRleCwgbGV2ZWwgKyAxKTsKLSAgICAgICAgICAgIGlmIChmb3VuZF9pbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kX2luZGV4OwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgaWYgKCFwS2lkLT5LZXlFeGlzdCgiS2lkcyIpKSB7CisgICAgICBpZiAoblBhZ2VzVG9HbyA9PSAwKSB7CisgICAgICAgIHJldHVybiBwS2lkOworICAgICAgfQorICAgICAgbV9QYWdlTGlzdC5TZXRBdChpUGFnZSAtIG5QYWdlc1RvR28sIHBLaWQtPkdldE9iak51bSgpKTsKKyAgICAgIG5QYWdlc1RvR28tLTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAob2JqbnVtID09IHBOb2RlLT5HZXRPYmpOdW0oKSkgewotICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICB9Ci0gICAgICAgIGlmIChza2lwX2NvdW50KSB7Ci0gICAgICAgICAgICBza2lwX2NvdW50LS07Ci0gICAgICAgIH0KLSAgICAgICAgaW5kZXggKys7CisgICAgICBpbnQgblBhZ2VzID0gcEtpZC0+R2V0SW50ZWdlcigiQ291bnQiKTsKKyAgICAgIGlmIChuUGFnZXNUb0dvIDwgblBhZ2VzKSB7CisgICAgICAgIHJldHVybiBfRmluZFBERlBhZ2UocEtpZCwgaVBhZ2UsIG5QYWdlc1RvR28sIGxldmVsICsgMSk7CisgICAgICB9CisgICAgICBuUGFnZXNUb0dvIC09IG5QYWdlczsKICAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK0NQREZfRGljdGlvbmFyeSogQ1BERl9Eb2N1bWVudDo6R2V0UGFnZShpbnQgaVBhZ2UpIHsKKyAgaWYgKGlQYWdlIDwgMCB8fCBpUGFnZSA+PSBtX1BhZ2VMaXN0LkdldFNpemUoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBpZiAobV9iTGluZWFyaXplZCAmJiAoaVBhZ2UgPT0gKGludCltX2R3Rmlyc3RQYWdlTm8pKSB7CisgICAgaWYgKENQREZfRGljdGlvbmFyeSogcERpY3QgPQorICAgICAgICAgICAgVG9EaWN0aW9uYXJ5KEdldEluZGlyZWN0T2JqZWN0KG1fZHdGaXJzdFBhZ2VPYmpOdW0sIG51bGxwdHIpKSkKKyAgICAgIHJldHVybiBwRGljdDsKKyAgfQorCisgIGludCBvYmpudW0gPSBtX1BhZ2VMaXN0LkdldEF0KGlQYWdlKTsKKyAgaWYgKG9iam51bSkgeworICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0KKyAgICAgICAgICAgIFRvRGljdGlvbmFyeShHZXRJbmRpcmVjdE9iamVjdChvYmpudW0sIG51bGxwdHIpKSkgeworICAgICAgcmV0dXJuIHBEaWN0OworICAgIH0KKyAgfQorCisgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBHZXRSb290KCk7CisgIGlmICghcFJvb3QpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZXMgPSBwUm9vdC0+R2V0RGljdCgiUGFnZXMiKTsKKyAgaWYgKCFwUGFnZXMpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZSA9IF9GaW5kUERGUGFnZShwUGFnZXMsIGlQYWdlLCBpUGFnZSwgMCk7CisgIGlmICghcFBhZ2UpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgbV9QYWdlTGlzdC5TZXRBdChpUGFnZSwgcFBhZ2UtPkdldE9iak51bSgpKTsKKyAgcmV0dXJuIHBQYWdlOworfQorCitpbnQgQ1BERl9Eb2N1bWVudDo6X0ZpbmRQYWdlSW5kZXgoQ1BERl9EaWN0aW9uYXJ5KiBwTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgc2tpcF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpIHsKKyAgaWYgKHBOb2RlLT5LZXlFeGlzdCgiS2lkcyIpKSB7CisgICAgQ1BERl9BcnJheSogcEtpZExpc3QgPSBwTm9kZS0+R2V0QXJyYXkoIktpZHMiKTsKKyAgICBpZiAoIXBLaWRMaXN0KSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChsZXZlbCA+PSBGWF9NQVhfUEFHRV9MRVZFTCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBGWF9EV09SRCBjb3VudCA9IHBOb2RlLT5HZXRJbnRlZ2VyKCJDb3VudCIpOworICAgIGlmIChjb3VudCA8PSBza2lwX2NvdW50KSB7CisgICAgICBza2lwX2NvdW50IC09IGNvdW50OworICAgICAgaW5kZXggKz0gY291bnQ7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChjb3VudCAmJiBjb3VudCA9PSBwS2lkTGlzdC0+R2V0Q291bnQoKSkgeworICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKENQREZfUmVmZXJlbmNlKiBwS2lkID0gVG9SZWZlcmVuY2UocEtpZExpc3QtPkdldEVsZW1lbnQoaSkpKSB7CisgICAgICAgICAgaWYgKHBLaWQtPkdldFJlZk9iak51bSgpID09IG9iam51bSkgeworICAgICAgICAgICAgbV9QYWdlTGlzdC5TZXRBdChpbmRleCArIGksIG9iam51bSk7CisgICAgICAgICAgICByZXR1cm4gaW5kZXggKyBpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEtpZExpc3QtPkdldENvdW50KCk7IGkrKykgeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwS2lkID0gcEtpZExpc3QtPkdldERpY3QoaSk7CisgICAgICBpZiAoIXBLaWQpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAocEtpZCA9PSBwTm9kZSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGludCBmb3VuZF9pbmRleCA9CisgICAgICAgICAgX0ZpbmRQYWdlSW5kZXgocEtpZCwgc2tpcF9jb3VudCwgb2JqbnVtLCBpbmRleCwgbGV2ZWwgKyAxKTsKKyAgICAgIGlmIChmb3VuZF9pbmRleCA+PSAwKSB7CisgICAgICAgIHJldHVybiBmb3VuZF9pbmRleDsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKG9iam51bSA9PSBwTm9kZS0+R2V0T2JqTnVtKCkpIHsKKyAgICAgIHJldHVybiBpbmRleDsKKyAgICB9CisgICAgaWYgKHNraXBfY291bnQpIHsKKyAgICAgIHNraXBfY291bnQtLTsKKyAgICB9CisgICAgaW5kZXgrKzsKKyAgfQorICByZXR1cm4gLTE7Cit9CitpbnQgQ1BERl9Eb2N1bWVudDo6R2V0UGFnZUluZGV4KEZYX0RXT1JEIG9iam51bSkgeworICBGWF9EV09SRCBuUGFnZXMgPSBtX1BhZ2VMaXN0LkdldFNpemUoKTsKKyAgRlhfRFdPUkQgc2tpcF9jb3VudCA9IDA7CisgIEZYX0JPT0wgYlNraXBwZWQgPSBGQUxTRTsKKyAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG5QYWdlczsgaSsrKSB7CisgICAgRlhfRFdPUkQgb2JqbnVtMSA9IG1fUGFnZUxpc3QuR2V0QXQoaSk7CisgICAgaWYgKG9iam51bTEgPT0gb2JqbnVtKSB7CisgICAgICByZXR1cm4gaTsKKyAgICB9CisgICAgaWYgKCFiU2tpcHBlZCAmJiBvYmpudW0xID09IDApIHsKKyAgICAgIHNraXBfY291bnQgPSBpOworICAgICAgYlNraXBwZWQgPSBUUlVFOworICAgIH0KKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gR2V0Um9vdCgpOworICBpZiAoIXBSb290KSB7CiAgICAgcmV0dXJuIC0xOworICB9CisgIENQREZfRGljdGlvbmFyeSogcFBhZ2VzID0gcFJvb3QtPkdldERpY3QoIlBhZ2VzIik7CisgIGlmICghcFBhZ2VzKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGludCBpbmRleCA9IDA7CisgIHJldHVybiBfRmluZFBhZ2VJbmRleChwUGFnZXMsIHNraXBfY291bnQsIG9iam51bSwgaW5kZXgpOwogfQotaW50IENQREZfRG9jdW1lbnQ6OkdldFBhZ2VJbmRleChGWF9EV09SRCBvYmpudW0pCi17Ci0gICAgRlhfRFdPUkQgblBhZ2VzID0gbV9QYWdlTGlzdC5HZXRTaXplKCk7Ci0gICAgRlhfRFdPUkQgc2tpcF9jb3VudCA9IDA7Ci0gICAgRlhfQk9PTCBiU2tpcHBlZCA9IEZBTFNFOwotICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBuUGFnZXM7IGkgKyspIHsKLSAgICAgICAgRlhfRFdPUkQgb2JqbnVtMSA9IG1fUGFnZUxpc3QuR2V0QXQoaSk7Ci0gICAgICAgIGlmIChvYmpudW0xID09IG9iam51bSkgewotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFiU2tpcHBlZCAmJiBvYmpudW0xID09IDApIHsKLSAgICAgICAgICAgIHNraXBfY291bnQgPSBpOwotICAgICAgICAgICAgYlNraXBwZWQgPSBUUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBHZXRSb290KCk7Ci0gICAgaWYgKHBSb290ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlcyA9IHBSb290LT5HZXREaWN0KEZYX0JTVFJDKCJQYWdlcyIpKTsKLSAgICBpZiAocFBhZ2VzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpbnQgaW5kZXggPSAwOwotICAgIHJldHVybiBfRmluZFBhZ2VJbmRleChwUGFnZXMsIHNraXBfY291bnQsIG9iam51bSwgaW5kZXgpOworaW50IENQREZfRG9jdW1lbnQ6OkdldFBhZ2VDb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fUGFnZUxpc3QuR2V0U2l6ZSgpOwogfQotaW50IENQREZfRG9jdW1lbnQ6OkdldFBhZ2VDb3VudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fUGFnZUxpc3QuR2V0U2l6ZSgpOwotfQotc3RhdGljIGludCBfQ291bnRQYWdlcyhDUERGX0RpY3Rpb25hcnkqIHBQYWdlcywgaW50IGxldmVsKQotewotICAgIGlmIChsZXZlbCA+IDEyOCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW50IGNvdW50ID0gcFBhZ2VzLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJDb3VudCIpKTsKLSAgICBpZiAoY291bnQgPiAwICYmIGNvdW50IDwgRlBERl9QQUdFX01BWF9OVU0pIHsKLSAgICAgICAgcmV0dXJuIGNvdW50OwotICAgIH0KLSAgICBDUERGX0FycmF5KiBwS2lkTGlzdCA9IHBQYWdlcy0+R2V0QXJyYXkoRlhfQlNUUkMoIktpZHMiKSk7Ci0gICAgaWYgKHBLaWRMaXN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGNvdW50ID0gMDsKLSAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEtpZExpc3QtPkdldENvdW50KCk7IGkgKyspIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwS2lkID0gcEtpZExpc3QtPkdldERpY3QoaSk7Ci0gICAgICAgIGlmIChwS2lkID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcEtpZC0+S2V5RXhpc3QoRlhfQlNUUkMoIktpZHMiKSkpIHsKLSAgICAgICAgICAgIGNvdW50ICsrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY291bnQgKz0gX0NvdW50UGFnZXMocEtpZCwgbGV2ZWwgKyAxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwUGFnZXMtPlNldEF0SW50ZWdlcihGWF9CU1RSQygiQ291bnQiKSwgY291bnQpOworc3RhdGljIGludCBfQ291bnRQYWdlcyhDUERGX0RpY3Rpb25hcnkqIHBQYWdlcywgaW50IGxldmVsKSB7CisgIGlmIChsZXZlbCA+IDEyOCkgeworICAgIHJldHVybiAwOworICB9CisgIGludCBjb3VudCA9IHBQYWdlcy0+R2V0SW50ZWdlcigiQ291bnQiKTsKKyAgaWYgKGNvdW50ID4gMCAmJiBjb3VudCA8IEZQREZfUEFHRV9NQVhfTlVNKSB7CiAgICAgcmV0dXJuIGNvdW50OworICB9CisgIENQREZfQXJyYXkqIHBLaWRMaXN0ID0gcFBhZ2VzLT5HZXRBcnJheSgiS2lkcyIpOworICBpZiAoIXBLaWRMaXN0KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgY291bnQgPSAwOworICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEtpZExpc3QtPkdldENvdW50KCk7IGkrKykgeworICAgIENQREZfRGljdGlvbmFyeSogcEtpZCA9IHBLaWRMaXN0LT5HZXREaWN0KGkpOworICAgIGlmICghcEtpZCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICghcEtpZC0+S2V5RXhpc3QoIktpZHMiKSkgeworICAgICAgY291bnQrKzsKKyAgICB9IGVsc2UgeworICAgICAgY291bnQgKz0gX0NvdW50UGFnZXMocEtpZCwgbGV2ZWwgKyAxKTsKKyAgICB9CisgIH0KKyAgcFBhZ2VzLT5TZXRBdEludGVnZXIoIkNvdW50IiwgY291bnQpOworICByZXR1cm4gY291bnQ7CiB9Ci1pbnQgQ1BERl9Eb2N1bWVudDo6X0dldFBhZ2VDb3VudCgpIGNvbnN0Ci17Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IEdldFJvb3QoKTsKLSAgICBpZiAocFJvb3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZXMgPSBwUm9vdC0+R2V0RGljdChGWF9CU1RSQygiUGFnZXMiKSk7Ci0gICAgaWYgKHBQYWdlcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoIXBQYWdlcy0+S2V5RXhpc3QoRlhfQlNUUkMoIktpZHMiKSkpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiBfQ291bnRQYWdlcyhwUGFnZXMsIDApOworaW50IENQREZfRG9jdW1lbnQ6Ol9HZXRQYWdlQ291bnQoKSBjb25zdCB7CisgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBHZXRSb290KCk7CisgIGlmICghcFJvb3QpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlcyA9IHBSb290LT5HZXREaWN0KCJQYWdlcyIpOworICBpZiAoIXBQYWdlcykgeworICAgIHJldHVybiAwOworICB9CisgIGlmICghcFBhZ2VzLT5LZXlFeGlzdCgiS2lkcyIpKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIF9Db3VudFBhZ2VzKHBQYWdlcywgMCk7CiB9Ci1GWF9CT09MIENQREZfRG9jdW1lbnQ6OklzQ29udGVudFVzZWRFbHNld2hlcmUoRlhfRFdPUkQgb2JqbnVtLCBDUERGX0RpY3Rpb25hcnkqIHBUaGlzUGFnZURpY3QpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1BhZ2VMaXN0LkdldFNpemUoKTsgaSArKykgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IEdldFBhZ2UoaSk7Ci0gICAgICAgIGlmIChwUGFnZURpY3QgPT0gcFRoaXNQYWdlRGljdCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9PYmplY3QqIHBDb250ZW50cyA9IHBQYWdlRGljdCA/IHBQYWdlRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiQ29udGVudHMiKSkgOiBOVUxMOwotICAgICAgICBpZiAocENvbnRlbnRzID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwQ29udGVudHMtPkdldERpcmVjdFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwQ29udGVudHMtPkdldERpcmVjdCgpOwotICAgICAgICAgICAgZm9yIChGWF9EV09SRCBqID0gMDsgaiA8IHBBcnJheS0+R2V0Q291bnQoKTsgaiArKykgewotICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwUmVmID0gcEFycmF5LT5HZXRFbGVtZW50KGopOwotICAgICAgICAgICAgICAgIGlmIChwUmVmID09IE5VTEwgfHwgcFJlZi0+R2V0VHlwZSgpICE9IFBERk9CSl9SRUZFUkVOQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoKENQREZfUmVmZXJlbmNlKikgcFJlZiktPkdldFJlZk9iak51bSgpID09IG9iam51bSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocENvbnRlbnRzLT5HZXRPYmpOdW0oKSA9PSBvYmpudW0pIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9CitGWF9CT09MIENQREZfRG9jdW1lbnQ6OklzQ29udGVudFVzZWRFbHNld2hlcmUoRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFRoaXNQYWdlRGljdCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IG1fUGFnZUxpc3QuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IEdldFBhZ2UoaSk7CisgICAgaWYgKHBQYWdlRGljdCA9PSBwVGhpc1BhZ2VEaWN0KSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIENQREZfT2JqZWN0KiBwQ29udGVudHMgPQorICAgICAgICBwUGFnZURpY3QgPyBwUGFnZURpY3QtPkdldEVsZW1lbnQoIkNvbnRlbnRzIikgOiBOVUxMOworICAgIGlmICghcENvbnRlbnRzKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHBDb250ZW50cy0+R2V0RGlyZWN0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgeworICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gcENvbnRlbnRzLT5HZXREaXJlY3QoKS0+QXNBcnJheSgpOworICAgICAgZm9yIChGWF9EV09SRCBqID0gMDsgaiA8IHBBcnJheS0+R2V0Q291bnQoKTsgaisrKSB7CisgICAgICAgIENQREZfUmVmZXJlbmNlKiBwUmVmID0gVG9SZWZlcmVuY2UocEFycmF5LT5HZXRFbGVtZW50KGopKTsKKyAgICAgICAgaWYgKHBSZWYgJiYgcFJlZi0+R2V0UmVmT2JqTnVtKCkgPT0gb2JqbnVtKQorICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQorICAgIH0gZWxzZSBpZiAocENvbnRlbnRzLT5HZXRPYmpOdW0oKSA9PSBvYmpudW0pIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1GWF9EV09SRCBDUERGX0RvY3VtZW50OjpHZXRVc2VyUGVybWlzc2lvbnMoRlhfQk9PTCBiQ2hlY2tSZXZpc2lvbikgY29uc3QKLXsKLSAgICBpZiAobV9wUGFyc2VyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIChGWF9EV09SRCkgLSAxOwotICAgIH0KLSAgICByZXR1cm4gbV9wUGFyc2VyLT5HZXRQZXJtaXNzaW9ucyhiQ2hlY2tSZXZpc2lvbik7CitGWF9EV09SRCBDUERGX0RvY3VtZW50OjpHZXRVc2VyUGVybWlzc2lvbnMoRlhfQk9PTCBiQ2hlY2tSZXZpc2lvbikgY29uc3QgeworICBpZiAoIW1fcFBhcnNlcikgeworICAgIHJldHVybiAoRlhfRFdPUkQpLTE7CisgIH0KKyAgcmV0dXJuIG1fcFBhcnNlci0+R2V0UGVybWlzc2lvbnMoYkNoZWNrUmV2aXNpb24pOwogfQotRlhfQk9PTCBDUERGX0RvY3VtZW50OjpJc093bmVyKCkgY29uc3QKLXsKLSAgICBpZiAobV9wUGFyc2VyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHJldHVybiBtX3BQYXJzZXItPklzT3duZXIoKTsKK0ZYX0JPT0wgQ1BERl9Eb2N1bWVudDo6SXNPd25lcigpIGNvbnN0IHsKKyAgcmV0dXJuICFtX3BQYXJzZXIgfHwgbV9wUGFyc2VyLT5Jc093bmVyKCk7CiB9Ci1GWF9CT09MIENQREZfRG9jdW1lbnQ6OklzRm9ybVN0cmVhbShGWF9EV09SRCBvYmpudW0sIEZYX0JPT0wmIGJGb3JtKSBjb25zdAotewotICAgIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBPYmo7Ci0gICAgICAgIGlmIChtX0luZGlyZWN0T2Jqcy5Mb29rdXAoKEZYX0xQVk9JRCkoRlhfVUlOVFBUUilvYmpudW0sIChGWF9MUFZPSUQmKXBPYmopKSB7Ci0gICAgICAgICAgICBiRm9ybSA9IHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNICYmCi0gICAgICAgICAgICAgICAgICAgICgoQ1BERl9TdHJlYW0qKXBPYmopLT5HZXREaWN0KCktPkdldFN0cmluZyhGWF9CU1RSQygiU3VidHlwZSIpKSA9PSBGWF9CU1RSQygiRm9ybSIpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fcFBhcnNlciA9PSBOVUxMKSB7Ci0gICAgICAgIGJGb3JtID0gRkFMU0U7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gbV9wUGFyc2VyLT5Jc0Zvcm1TdHJlYW0ob2JqbnVtLCBiRm9ybSk7CitGWF9CT09MIENQREZfRG9jdW1lbnQ6OklzRm9ybVN0cmVhbShGWF9EV09SRCBvYmpudW0sIEZYX0JPT0wmIGJGb3JtKSBjb25zdCB7CisgIGF1dG8gaXQgPSBtX0luZGlyZWN0T2Jqcy5maW5kKG9iam51bSk7CisgIGlmIChpdCAhPSBtX0luZGlyZWN0T2Jqcy5lbmQoKSkgeworICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gaXQtPnNlY29uZC0+QXNTdHJlYW0oKTsKKyAgICBiRm9ybSA9IHBTdHJlYW0gJiYgcFN0cmVhbS0+R2V0RGljdCgpLT5HZXRTdHJpbmcoIlN1YnR5cGUiKSA9PSAiRm9ybSI7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKCFtX3BQYXJzZXIpIHsKKyAgICBiRm9ybSA9IEZBTFNFOworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBtX3BQYXJzZXItPklzRm9ybVN0cmVhbShvYmpudW0sIGJGb3JtKTsKIH0KLXZvaWQgQ1BERl9Eb2N1bWVudDo6Q2xlYXJQYWdlRGF0YSgpCi17Ci0gICAgaWYgKG1fcERvY1BhZ2UpIHsKLSAgICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkNsZWFyRG9jKHRoaXMpOwotICAgIH0KK3ZvaWQgQ1BERl9Eb2N1bWVudDo6Q2xlYXJQYWdlRGF0YSgpIHsKKyAgaWYgKG1fcERvY1BhZ2UpIHsKKyAgICBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+Q2xlYXJEb2ModGhpcyk7CisgIH0KIH0KLXZvaWQgQ1BERl9Eb2N1bWVudDo6Q2xlYXJSZW5kZXJEYXRhKCkKLXsKLSAgICBpZiAobV9wRG9jUmVuZGVyKSB7Ci0gICAgICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UmVuZGVyTW9kdWxlKCktPkNsZWFyRG9jRGF0YShtX3BEb2NSZW5kZXIpOwotICAgIH0KK3ZvaWQgQ1BERl9Eb2N1bWVudDo6Q2xlYXJSZW5kZXJEYXRhKCkgeworICBpZiAobV9wRG9jUmVuZGVyKSB7CisgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRSZW5kZXJNb2R1bGUoKS0+Q2xlYXJEb2NEYXRhKG1fcERvY1JlbmRlcik7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZW5jcnlwdC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2VuY3J5cHQuY3BwCmluZGV4IGUzNWIwYTkuLjBlZTBkOWEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZW5jcnlwdC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9lbmNyeXB0LmNwcApAQCAtMSw5NTkgKzEsMTAzOCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYXJzZXIuaCIKKwogI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYXJzZXIuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Zkcm0vZnhfY3J5cHQuaCIKLWNvbnN0IEZYX0JZVEUgZGVmcGFzc2NvZGVbMzJdID0gewotICAgIDB4MjgsIDB4YmYsIDB4NGUsIDB4NWUsIDB4NGUsIDB4NzUsIDB4OGEsIDB4NDEsCi0gICAgMHg2NCwgMHgwMCwgMHg0ZSwgMHg1NiwgMHhmZiwgMHhmYSwgMHgwMSwgMHgwOCwKLSAgICAweDJlLCAweDJlLCAweDAwLCAweGI2LCAweGQwLCAweDY4LCAweDNlLCAweDgwLAotICAgIDB4MmYsIDB4MGMsIDB4YTksIDB4ZmUsIDB4NjQsIDB4NTMsIDB4NjksIDB4N2EKLX07Ci12b2lkIENhbGNFbmNyeXB0S2V5KENQREZfRGljdGlvbmFyeSogcEVuY3J5cHQsIEZYX0xQQ0JZVEUgcGFzc3dvcmQsIEZYX0RXT1JEIHBhc3Nfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgRlhfTFBCWVRFIGtleSwgaW50IGtleWxlbiwgRlhfQk9PTCBiSWdub3JlTWV0YSwgQ1BERl9BcnJheSogcElkQXJyYXkpCi17Ci0gICAgaW50IHJldmlzaW9uID0gcEVuY3J5cHQtPkdldEludGVnZXIoRlhfQlNUUkMoIlIiKSk7Ci0gICAgRlhfQllURSBwYXNzY29kZVszMl07Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IDMyOyBpICsrKSB7Ci0gICAgICAgIHBhc3Njb2RlW2ldID0gaSA8IHBhc3Nfc2l6ZSA/IHBhc3N3b3JkW2ldIDogZGVmcGFzc2NvZGVbaSAtIHBhc3Nfc2l6ZV07CisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZmRybS9meF9jcnlwdC5oIgorCitjb25zdCB1aW50OF90IGRlZnBhc3Njb2RlWzMyXSA9IHsKKyAgICAweDI4LCAweGJmLCAweDRlLCAweDVlLCAweDRlLCAweDc1LCAweDhhLCAweDQxLCAweDY0LCAweDAwLCAweDRlLAorICAgIDB4NTYsIDB4ZmYsIDB4ZmEsIDB4MDEsIDB4MDgsIDB4MmUsIDB4MmUsIDB4MDAsIDB4YjYsIDB4ZDAsIDB4NjgsCisgICAgMHgzZSwgMHg4MCwgMHgyZiwgMHgwYywgMHhhOSwgMHhmZSwgMHg2NCwgMHg1MywgMHg2OSwgMHg3YX07Cit2b2lkIENhbGNFbmNyeXB0S2V5KENQREZfRGljdGlvbmFyeSogcEVuY3J5cHQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBwYXNzX3NpemUsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGtleSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGtleWxlbiwKKyAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSWdub3JlTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcElkQXJyYXkpIHsKKyAgaW50IHJldmlzaW9uID0gcEVuY3J5cHQtPkdldEludGVnZXIoIlIiKTsKKyAgdWludDhfdCBwYXNzY29kZVszMl07CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisgICAgcGFzc2NvZGVbaV0gPSBpIDwgcGFzc19zaXplID8gcGFzc3dvcmRbaV0gOiBkZWZwYXNzY29kZVtpIC0gcGFzc19zaXplXTsKKyAgfQorICB1aW50OF90IG1kNVsxMDBdOworICBDUllQVF9NRDVTdGFydChtZDUpOworICBDUllQVF9NRDVVcGRhdGUobWQ1LCBwYXNzY29kZSwgMzIpOworICBDRlhfQnl0ZVN0cmluZyBva2V5ID0gcEVuY3J5cHQtPkdldFN0cmluZygiTyIpOworICBDUllQVF9NRDVVcGRhdGUobWQ1LCAodWludDhfdCopb2tleS5jX3N0cigpLCBva2V5LkdldExlbmd0aCgpKTsKKyAgRlhfRFdPUkQgcGVybSA9IHBFbmNyeXB0LT5HZXRJbnRlZ2VyKCJQIik7CisgIENSWVBUX01ENVVwZGF0ZShtZDUsICh1aW50OF90KikmcGVybSwgNCk7CisgIGlmIChwSWRBcnJheSkgeworICAgIENGWF9CeXRlU3RyaW5nIGlkID0gcElkQXJyYXktPkdldFN0cmluZygwKTsKKyAgICBDUllQVF9NRDVVcGRhdGUobWQ1LCAodWludDhfdCopaWQuY19zdHIoKSwgaWQuR2V0TGVuZ3RoKCkpOworICB9CisgIGlmICghYklnbm9yZU1ldGEgJiYgcmV2aXNpb24gPj0gMyAmJgorICAgICAgIXBFbmNyeXB0LT5HZXRJbnRlZ2VyKCJFbmNyeXB0TWV0YWRhdGEiLCAxKSkgeworICAgIEZYX0RXT1JEIHRhZyA9IChGWF9EV09SRCktMTsKKyAgICBDUllQVF9NRDVVcGRhdGUobWQ1LCAodWludDhfdCopJnRhZywgNCk7CisgIH0KKyAgdWludDhfdCBkaWdlc3RbMTZdOworICBDUllQVF9NRDVGaW5pc2gobWQ1LCBkaWdlc3QpOworICBGWF9EV09SRCBjb3B5X2xlbiA9IGtleWxlbjsKKyAgaWYgKGNvcHlfbGVuID4gc2l6ZW9mKGRpZ2VzdCkpIHsKKyAgICBjb3B5X2xlbiA9IHNpemVvZihkaWdlc3QpOworICB9CisgIGlmIChyZXZpc2lvbiA+PSAzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDsgaSsrKSB7CisgICAgICBDUllQVF9NRDVHZW5lcmF0ZShkaWdlc3QsIGNvcHlfbGVuLCBkaWdlc3QpOwogICAgIH0KLSAgICBGWF9CWVRFIG1kNVsxMDBdOwotICAgIENSWVBUX01ENVN0YXJ0KG1kNSk7Ci0gICAgQ1JZUFRfTUQ1VXBkYXRlKG1kNSwgcGFzc2NvZGUsIDMyKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBva2V5ID0gcEVuY3J5cHQtPkdldFN0cmluZyhGWF9CU1RSQygiTyIpKTsKLSAgICBDUllQVF9NRDVVcGRhdGUobWQ1LCAoRlhfTFBCWVRFKW9rZXkuY19zdHIoKSwgb2tleS5HZXRMZW5ndGgoKSk7Ci0gICAgRlhfRFdPUkQgcGVybSA9IHBFbmNyeXB0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJQIikpOwotICAgIENSWVBUX01ENVVwZGF0ZShtZDUsIChGWF9MUEJZVEUpJnBlcm0sIDQpOwotICAgIGlmIChwSWRBcnJheSkgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBpZCA9IHBJZEFycmF5LT5HZXRTdHJpbmcoMCk7Ci0gICAgICAgIENSWVBUX01ENVVwZGF0ZShtZDUsIChGWF9MUEJZVEUpaWQuY19zdHIoKSwgaWQuR2V0TGVuZ3RoKCkpOwotICAgIH0KLSAgICBpZiAoIWJJZ25vcmVNZXRhICYmIHJldmlzaW9uID49IDMgJiYgIXBFbmNyeXB0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJFbmNyeXB0TWV0YWRhdGEiKSwgMSkpIHsKLSAgICAgICAgRlhfRFdPUkQgdGFnID0gKEZYX0RXT1JEKSAtIDE7Ci0gICAgICAgIENSWVBUX01ENVVwZGF0ZShtZDUsIChGWF9MUEJZVEUpJnRhZywgNCk7Ci0gICAgfQotICAgIEZYX0JZVEUgZGlnZXN0WzE2XTsKLSAgICBDUllQVF9NRDVGaW5pc2gobWQ1LCBkaWdlc3QpOwotICAgIEZYX0RXT1JEIGNvcHlfbGVuID0ga2V5bGVuOwotICAgIGlmIChjb3B5X2xlbiA+IHNpemVvZihkaWdlc3QpKSB7Ci0gICAgICAgIGNvcHlfbGVuID0gc2l6ZW9mKGRpZ2VzdCk7Ci0gICAgfQotICAgIGlmIChyZXZpc2lvbiA+PSAzKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTA7IGkgKyspIHsKLSAgICAgICAgICAgIENSWVBUX01ENUdlbmVyYXRlKGRpZ2VzdCwgY29weV9sZW4sIGRpZ2VzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlhTWVNfbWVtc2V0MzIoa2V5LCAwLCBrZXlsZW4pOwotICAgIEZYU1lTX21lbWNweTMyKGtleSwgZGlnZXN0LCBjb3B5X2xlbik7CisgIH0KKyAgRlhTWVNfbWVtc2V0KGtleSwgMCwga2V5bGVuKTsKKyAgRlhTWVNfbWVtY3B5KGtleSwgZGlnZXN0LCBjb3B5X2xlbik7CiB9Ci1DUERGX0NyeXB0b0hhbmRsZXIqIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkNyZWF0ZUNyeXB0b0hhbmRsZXIoKQotewotICAgIHJldHVybiBuZXcgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI7CitDUERGX0NyeXB0b0hhbmRsZXIqIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkNyZWF0ZUNyeXB0b0hhbmRsZXIoKSB7CisgIHJldHVybiBuZXcgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI7CiB9Ci10eXBlZGVmIHN0cnVjdCBfUERGX0NSWVBUT0lURU0gIHsKLSAgICBGWF9JTlQzMgltX0NpcGhlcjsKLSAgICBGWF9JTlQzMgltX0tleUxlbjsKLSAgICBGWF9CT09MCQltX2JDaGVja2VkOwotICAgIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyKgltX3BDcnlwdG9IYW5kbGVyOwordHlwZWRlZiBzdHJ1Y3QgX1BERl9DUllQVE9JVEVNIHsKKyAgaW50MzJfdCBtX0NpcGhlcjsKKyAgaW50MzJfdCBtX0tleUxlbjsKKyAgRlhfQk9PTCBtX2JDaGVja2VkOworICBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlciogbV9wQ3J5cHRvSGFuZGxlcjsKIH0gUERGX0NSWVBUT0lURU07Ci1DUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKCkKLXsKLSAgICBtX1ZlcnNpb24gPSAwOwotICAgIG1fUmV2aXNpb24gPSAwOwotICAgIG1fcFBhcnNlciA9IE5VTEw7Ci0gICAgbV9wRW5jcnlwdERpY3QgPSBOVUxMOwotICAgIG1fYk93bmVyID0gRkFMU0U7Ci0gICAgbV9QZXJtaXNzaW9ucyA9IDA7Ci0gICAgbV9DaXBoZXIgPSBGWENJUEhFUl9OT05FOwotICAgIG1fS2V5TGVuID0gMDsKK0NQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkNQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXIoKSB7CisgIG1fVmVyc2lvbiA9IDA7CisgIG1fUmV2aXNpb24gPSAwOworICBtX3BQYXJzZXIgPSBOVUxMOworICBtX3BFbmNyeXB0RGljdCA9IE5VTEw7CisgIG1fYk93bmVyID0gRkFMU0U7CisgIG1fUGVybWlzc2lvbnMgPSAwOworICBtX0NpcGhlciA9IEZYQ0lQSEVSX05PTkU7CisgIG1fS2V5TGVuID0gMDsKIH0KLUNQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6On5DUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKCkKLXsKK0NQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6On5DUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKCkge30KK0ZYX0JPT0wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6T25Jbml0KENQREZfUGFyc2VyKiBwUGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QpIHsKKyAgbV9wUGFyc2VyID0gcFBhcnNlcjsKKyAgaWYgKCFMb2FkRGljdChwRW5jcnlwdERpY3QpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9OT05FKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIENoZWNrU2VjdXJpdHkobV9LZXlMZW4pOwogfQotRlhfQk9PTCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpPbkluaXQoQ1BERl9QYXJzZXIqIHBQYXJzZXIsIENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0KQotewotICAgIG1fcFBhcnNlciA9IHBQYXJzZXI7Ci0gICAgaWYgKCFMb2FkRGljdChwRW5jcnlwdERpY3QpKSB7CitGWF9CT09MIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkNoZWNrU2VjdXJpdHkoaW50MzJfdCBrZXlfbGVuKSB7CisgIENGWF9CeXRlU3RyaW5nIHBhc3N3b3JkID0gbV9wUGFyc2VyLT5HZXRQYXNzd29yZCgpOworICBpZiAoQ2hlY2tQYXNzd29yZChwYXNzd29yZCwgcGFzc3dvcmQuR2V0TGVuZ3RoKCksIFRSVUUsIG1fRW5jcnlwdEtleSwKKyAgICAgICAgICAgICAgICAgICAga2V5X2xlbikpIHsKKyAgICBpZiAocGFzc3dvcmQuSXNFbXB0eSgpKSB7CisgICAgICBpZiAoIUNoZWNrUGFzc3dvcmQocGFzc3dvcmQsIHBhc3N3b3JkLkdldExlbmd0aCgpLCBGQUxTRSwgbV9FbmNyeXB0S2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9sZW4pKSB7CiAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX05PTkUpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgbV9iT3duZXIgPSBUUlVFOworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBDaGVja1Bhc3N3b3JkKHBhc3N3b3JkLCBwYXNzd29yZC5HZXRMZW5ndGgoKSwgRkFMU0UsIG1fRW5jcnlwdEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAga2V5X2xlbik7Cit9CitGWF9EV09SRCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpHZXRQZXJtaXNzaW9ucygpIHsKKyAgcmV0dXJuIG1fUGVybWlzc2lvbnM7Cit9CitzdGF0aWMgRlhfQk9PTCBfTG9hZENyeXB0SW5mbyhDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgY2lwaGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBrZXlsZW4pIHsKKyAgaW50IFZlcnNpb24gPSBwRW5jcnlwdERpY3QtPkdldEludGVnZXIoIlYiKTsKKyAgY2lwaGVyID0gRlhDSVBIRVJfUkM0OworICBrZXlsZW4gPSAwOworICBpZiAoVmVyc2lvbiA+PSA0KSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQ3J5cHRGaWx0ZXJzID0gcEVuY3J5cHREaWN0LT5HZXREaWN0KCJDRiIpOworICAgIGlmICghcENyeXB0RmlsdGVycykgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICByZXR1cm4gQ2hlY2tTZWN1cml0eShtX0tleUxlbik7Ci19Ci1GWF9CT09MIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkNoZWNrU2VjdXJpdHkoRlhfSU5UMzIga2V5X2xlbikKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBwYXNzd29yZCA9IG1fcFBhcnNlci0+R2V0UGFzc3dvcmQoKTsKLSAgICBpZiAoQ2hlY2tQYXNzd29yZChwYXNzd29yZCwgcGFzc3dvcmQuR2V0TGVuZ3RoKCksIFRSVUUsIG1fRW5jcnlwdEtleSwga2V5X2xlbikpIHsKLSAgICAgICAgaWYgKHBhc3N3b3JkLklzRW1wdHkoKSkgewotICAgICAgICAgICAgaWYgKCFDaGVja1Bhc3N3b3JkKHBhc3N3b3JkLCBwYXNzd29yZC5HZXRMZW5ndGgoKSwgRkFMU0UsIG1fRW5jcnlwdEtleSwga2V5X2xlbikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9iT3duZXIgPSBUUlVFOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIENoZWNrUGFzc3dvcmQocGFzc3dvcmQsIHBhc3N3b3JkLkdldExlbmd0aCgpLCBGQUxTRSwgbV9FbmNyeXB0S2V5LCBrZXlfbGVuKTsKLX0KLUZYX0RXT1JEIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkdldFBlcm1pc3Npb25zKCkKLXsKLSAgICByZXR1cm4gbV9QZXJtaXNzaW9uczsKLX0KLXN0YXRpYyBGWF9CT09MIF9Mb2FkQ3J5cHRJbmZvKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBGWF9CU1RSIG5hbWUsIGludCYgY2lwaGVyLCBpbnQmIGtleWxlbikKLXsKLSAgICBpbnQgVmVyc2lvbiA9IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiViIpKTsKLSAgICBjaXBoZXIgPSBGWENJUEhFUl9SQzQ7Ci0gICAga2V5bGVuID0gMDsKLSAgICBpZiAoVmVyc2lvbiA+PSA0KSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcENyeXB0RmlsdGVycyA9IHBFbmNyeXB0RGljdC0+R2V0RGljdChGWF9CU1RSQygiQ0YiKSk7Ci0gICAgICAgIGlmIChwQ3J5cHRGaWx0ZXJzID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZSA9PSBGWF9CU1RSQygiSWRlbnRpdHkiKSkgewotICAgICAgICAgICAgY2lwaGVyID0gRlhDSVBIRVJfTk9ORTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERlZkZpbHRlciA9IHBDcnlwdEZpbHRlcnMtPkdldERpY3QobmFtZSk7Ci0gICAgICAgICAgICBpZiAocERlZkZpbHRlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IG5LZXlCaXRzID0gMDsKLSAgICAgICAgICAgIGlmIChWZXJzaW9uID09IDQpIHsKLSAgICAgICAgICAgICAgICBuS2V5Qml0cyA9IHBEZWZGaWx0ZXItPkdldEludGVnZXIoRlhfQlNUUkMoIkxlbmd0aCIpLCAwKTsKLSAgICAgICAgICAgICAgICBpZiAobktleUJpdHMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBuS2V5Qml0cyA9IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoIiksIDEyOCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuS2V5Qml0cyA9IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoIiksIDI1Nik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobktleUJpdHMgPCA0MCkgewotICAgICAgICAgICAgICAgIG5LZXlCaXRzICo9IDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBrZXlsZW4gPSBuS2V5Qml0cyAvIDg7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBjaXBoZXJfbmFtZSA9IHBEZWZGaWx0ZXItPkdldFN0cmluZyhGWF9CU1RSQygiQ0ZNIikpOwotICAgICAgICAgICAgaWYgKGNpcGhlcl9uYW1lID09IEZYX0JTVFJDKCJBRVNWMiIpIHx8IGNpcGhlcl9uYW1lID09IEZYX0JTVFJDKCJBRVNWMyIpKSB7Ci0gICAgICAgICAgICAgICAgY2lwaGVyID0gRlhDSVBIRVJfQUVTOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgaWYgKG5hbWUgPT0gIklkZW50aXR5IikgeworICAgICAgY2lwaGVyID0gRlhDSVBIRVJfTk9ORTsKICAgICB9IGVsc2UgewotICAgICAgICBrZXlsZW4gPSBWZXJzaW9uID4gMSA/IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoIiksIDQwKSAvIDggOiA1OwotICAgIH0KLSAgICBpZiAoa2V5bGVuID4gMzIgfHwga2V5bGVuIDwgMCkgeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGVmRmlsdGVyID0gcENyeXB0RmlsdGVycy0+R2V0RGljdChuYW1lKTsKKyAgICAgIGlmICghcERlZkZpbHRlcikgewogICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpMb2FkRGljdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCkKLXsKLSAgICBtX3BFbmNyeXB0RGljdCA9IHBFbmNyeXB0RGljdDsKLSAgICBtX2JPd25lciA9IEZBTFNFOwotICAgIG1fVmVyc2lvbiA9IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiViIpKTsKLSAgICBtX1JldmlzaW9uID0gcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJSIikpOwotICAgIG1fUGVybWlzc2lvbnMgPSBwRW5jcnlwdERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIlAiKSwgLTEpOwotICAgIGlmIChtX1ZlcnNpb24gPCA0KSB7Ci0gICAgICAgIHJldHVybiBfTG9hZENyeXB0SW5mbyhwRW5jcnlwdERpY3QsIENGWF9CeXRlU3RyaW5nKCksIG1fQ2lwaGVyLCBtX0tleUxlbik7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIHN0bWZfbmFtZSA9IHBFbmNyeXB0RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJTdG1GIikpOwotICAgIENGWF9CeXRlU3RyaW5nIHN0cmZfbmFtZSA9IHBFbmNyeXB0RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJTdHJGIikpOwotICAgIGlmIChzdG1mX25hbWUgIT0gc3RyZl9uYW1lKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKCFfTG9hZENyeXB0SW5mbyhwRW5jcnlwdERpY3QsIHN0cmZfbmFtZSwgbV9DaXBoZXIsIG1fS2V5TGVuKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpMb2FkRGljdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgRlhfRFdPUkQgdHlwZSwgaW50JiBjaXBoZXIsIGludCYga2V5X2xlbikKLXsKLSAgICBtX3BFbmNyeXB0RGljdCA9IHBFbmNyeXB0RGljdDsKLSAgICBtX2JPd25lciA9IEZBTFNFOwotICAgIG1fVmVyc2lvbiA9IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiViIpKTsKLSAgICBtX1JldmlzaW9uID0gcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJSIikpOwotICAgIG1fUGVybWlzc2lvbnMgPSBwRW5jcnlwdERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIlAiKSwgLTEpOwotICAgIENGWF9CeXRlU3RyaW5nIHN0cmZfbmFtZSwgc3RtZl9uYW1lOwotICAgIGlmIChtX1ZlcnNpb24gPj0gNCkgewotICAgICAgICBzdG1mX25hbWUgPSBwRW5jcnlwdERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiU3RtRiIpKTsKLSAgICAgICAgc3RyZl9uYW1lID0gcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlN0ckYiKSk7Ci0gICAgICAgIGlmIChzdG1mX25hbWUgIT0gc3RyZl9uYW1lKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBpbnQgbktleUJpdHMgPSAwOworICAgICAgaWYgKFZlcnNpb24gPT0gNCkgeworICAgICAgICBuS2V5Qml0cyA9IHBEZWZGaWx0ZXItPkdldEludGVnZXIoIkxlbmd0aCIsIDApOworICAgICAgICBpZiAobktleUJpdHMgPT0gMCkgeworICAgICAgICAgIG5LZXlCaXRzID0gcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyKCJMZW5ndGgiLCAxMjgpOwogICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBuS2V5Qml0cyA9IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcigiTGVuZ3RoIiwgMjU2KTsKKyAgICAgIH0KKyAgICAgIGlmIChuS2V5Qml0cyA8IDQwKSB7CisgICAgICAgIG5LZXlCaXRzICo9IDg7CisgICAgICB9CisgICAgICBrZXlsZW4gPSBuS2V5Qml0cyAvIDg7CisgICAgICBDRlhfQnl0ZVN0cmluZyBjaXBoZXJfbmFtZSA9IHBEZWZGaWx0ZXItPkdldFN0cmluZygiQ0ZNIik7CisgICAgICBpZiAoY2lwaGVyX25hbWUgPT0gIkFFU1YyIiB8fCBjaXBoZXJfbmFtZSA9PSAiQUVTVjMiKSB7CisgICAgICAgIGNpcGhlciA9IEZYQ0lQSEVSX0FFUzsKKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKCFfTG9hZENyeXB0SW5mbyhwRW5jcnlwdERpY3QsIHN0cmZfbmFtZSwgY2lwaGVyLCBrZXlfbGVuKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fQ2lwaGVyID0gY2lwaGVyOwotICAgIG1fS2V5TGVuID0ga2V5X2xlbjsKLSAgICByZXR1cm4gVFJVRTsKLSAgICByZXR1cm4gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBrZXlsZW4gPSBWZXJzaW9uID4gMSA/IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcigiTGVuZ3RoIiwgNDApIC8gOCA6IDU7CisgIH0KKyAgaWYgKGtleWxlbiA+IDMyIHx8IGtleWxlbiA8IDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkdldENyeXB0SW5mbyhpbnQmIGNpcGhlciwgRlhfTFBDQllURSYgYnVmZmVyLCBpbnQmIGtleWxlbikKLXsKLSAgICBjaXBoZXIgPSBtX0NpcGhlcjsKLSAgICBidWZmZXIgPSBtX0VuY3J5cHRLZXk7Ci0gICAga2V5bGVuID0gbV9LZXlMZW47Ci0gICAgcmV0dXJuIFRSVUU7CitGWF9CT09MIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkxvYWREaWN0KENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0KSB7CisgIG1fcEVuY3J5cHREaWN0ID0gcEVuY3J5cHREaWN0OworICBtX2JPd25lciA9IEZBTFNFOworICBtX1ZlcnNpb24gPSBwRW5jcnlwdERpY3QtPkdldEludGVnZXIoIlYiKTsKKyAgbV9SZXZpc2lvbiA9IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcigiUiIpOworICBtX1Blcm1pc3Npb25zID0gcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyKCJQIiwgLTEpOworICBpZiAobV9WZXJzaW9uIDwgNCkgeworICAgIHJldHVybiBfTG9hZENyeXB0SW5mbyhwRW5jcnlwdERpY3QsIENGWF9CeXRlU3RyaW5nKCksIG1fQ2lwaGVyLCBtX0tleUxlbik7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgc3RtZl9uYW1lID0gcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoIlN0bUYiKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgc3RyZl9uYW1lID0gcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoIlN0ckYiKTsKKyAgaWYgKHN0bWZfbmFtZSAhPSBzdHJmX25hbWUpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKCFfTG9hZENyeXB0SW5mbyhwRW5jcnlwdERpY3QsIHN0cmZfbmFtZSwgbV9DaXBoZXIsIG1fS2V5TGVuKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLSNkZWZpbmUgRlhfR0VUXzMyV09SRChuLGIsaSkJCQkJCQkJCVwKLSAgICB7CQkJCQkJCQkJCQkJCQlcCi0gICAgICAgIChuKSA9IChGWF9EV09SRCkoKCAoRlhfVUlOVDY0KSAoYilbKGkpXSA8PCAyNCApCQkJXAotICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCAoRlhfVUlOVDY0KSAoYilbKGkpICsgMV0gPDwgMTYgKQkJCQkJXAotICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCAoRlhfVUlOVDY0KSAoYilbKGkpICsgMl0gPDwgIDggKQkJCQkJXAotICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCAoRlhfVUlOVDY0KSAoYilbKGkpICsgM10gICAgICAgKSk7CQkJCQlcCitGWF9CT09MIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkxvYWREaWN0KENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGNpcGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBrZXlfbGVuKSB7CisgIG1fcEVuY3J5cHREaWN0ID0gcEVuY3J5cHREaWN0OworICBtX2JPd25lciA9IEZBTFNFOworICBtX1ZlcnNpb24gPSBwRW5jcnlwdERpY3QtPkdldEludGVnZXIoIlYiKTsKKyAgbV9SZXZpc2lvbiA9IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlcigiUiIpOworICBtX1Blcm1pc3Npb25zID0gcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyKCJQIiwgLTEpOworICBDRlhfQnl0ZVN0cmluZyBzdHJmX25hbWUsIHN0bWZfbmFtZTsKKyAgaWYgKG1fVmVyc2lvbiA+PSA0KSB7CisgICAgc3RtZl9uYW1lID0gcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoIlN0bUYiKTsKKyAgICBzdHJmX25hbWUgPSBwRW5jcnlwdERpY3QtPkdldFN0cmluZygiU3RyRiIpOworICAgIGlmIChzdG1mX25hbWUgIT0gc3RyZl9uYW1lKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotaW50IEJpZ09yZGVyNjRCaXRzTW9kMyhGWF9MUEJZVEUgZGF0YSkKLXsKLSAgICBGWF9VSU5UNjQgcmV0ID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgewotICAgICAgICBGWF9EV09SRCB2YWx1ZTsKLSAgICAgICAgRlhfR0VUXzMyV09SRCh2YWx1ZSwgZGF0YSwgNCAqIGkpOwotICAgICAgICByZXQgPDw9IDMyOwotICAgICAgICByZXQgfD0gdmFsdWU7Ci0gICAgICAgIHJldCAlPSAzOwotICAgIH0KLSAgICByZXR1cm4gKGludClyZXQ7CisgIH0KKyAgaWYgKCFfTG9hZENyeXB0SW5mbyhwRW5jcnlwdERpY3QsIHN0cmZfbmFtZSwgY2lwaGVyLCBrZXlfbGVuKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX0NpcGhlciA9IGNpcGhlcjsKKyAgbV9LZXlMZW4gPSBrZXlfbGVuOworICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci12b2lkIFJldmlzaW9uNl9IYXNoKEZYX0xQQ0JZVEUgcGFzc3dvcmQsIEZYX0RXT1JEIHNpemUsIEZYX0xQQ0JZVEUgc2FsdCwgRlhfTFBDQllURSB2ZWN0b3IsIEZYX0xQQllURSBoYXNoKQotewotICAgIGludCBpQmxvY2tTaXplID0gMzI7Ci0gICAgRlhfQllURSBzaGFbMTI4XTsKK0ZYX0JPT0wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6R2V0Q3J5cHRJbmZvKGludCYgY2lwaGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdComIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYga2V5bGVuKSB7CisgIGNpcGhlciA9IG1fQ2lwaGVyOworICBidWZmZXIgPSBtX0VuY3J5cHRLZXk7CisgIGtleWxlbiA9IG1fS2V5TGVuOworICByZXR1cm4gVFJVRTsKK30KKyNkZWZpbmUgRlhfR0VUXzMyV09SRChuLCBiLCBpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChuKSA9IChGWF9EV09SRCkoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCh1aW50NjRfdCkoYilbKGkpXSA8PCAyNCkgfCAoKHVpbnQ2NF90KShiKVsoaSkgKyAxXSA8PCAxNikgfCBcCisgICAgICAgICgodWludDY0X3QpKGIpWyhpKSArIDJdIDw8IDgpIHwgKCh1aW50NjRfdCkoYilbKGkpICsgM10pKTsgICAgXAorICB9CitpbnQgQmlnT3JkZXI2NEJpdHNNb2QzKHVpbnQ4X3QqIGRhdGEpIHsKKyAgdWludDY0X3QgcmV0ID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICBGWF9EV09SRCB2YWx1ZTsKKyAgICBGWF9HRVRfMzJXT1JEKHZhbHVlLCBkYXRhLCA0ICogaSk7CisgICAgcmV0IDw8PSAzMjsKKyAgICByZXQgfD0gdmFsdWU7CisgICAgcmV0ICU9IDM7CisgIH0KKyAgcmV0dXJuIChpbnQpcmV0OworfQordm9pZCBSZXZpc2lvbjZfSGFzaChjb25zdCB1aW50OF90KiBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2FsdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdmVjdG9yLAorICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBoYXNoKSB7CisgIGludCBpQmxvY2tTaXplID0gMzI7CisgIHVpbnQ4X3Qgc2hhWzEyOF07CisgIENSWVBUX1NIQTI1NlN0YXJ0KHNoYSk7CisgIENSWVBUX1NIQTI1NlVwZGF0ZShzaGEsIHBhc3N3b3JkLCBzaXplKTsKKyAgQ1JZUFRfU0hBMjU2VXBkYXRlKHNoYSwgc2FsdCwgOCk7CisgIGlmICh2ZWN0b3IpIHsKKyAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCB2ZWN0b3IsIDQ4KTsKKyAgfQorICB1aW50OF90IGRpZ2VzdFszMl07CisgIENSWVBUX1NIQTI1NkZpbmlzaChzaGEsIGRpZ2VzdCk7CisgIENGWF9CeXRlVGV4dEJ1ZiBidWY7CisgIHVpbnQ4X3QqIGlucHV0ID0gZGlnZXN0OworICB1aW50OF90KiBrZXkgPSBpbnB1dDsKKyAgdWludDhfdCogaXYgPSBpbnB1dCArIDE2OworICB1aW50OF90KiBFID0gYnVmLkdldEJ1ZmZlcigpOworICBpbnQgaUJ1ZkxlbiA9IGJ1Zi5HZXRMZW5ndGgoKTsKKyAgQ0ZYX0J5dGVUZXh0QnVmIGludGVyRGlnZXN0OworICBpbnQgaSA9IDA7CisgIHVpbnQ4X3QqIGFlcyA9IEZYX0FsbG9jKHVpbnQ4X3QsIDIwNDgpOworICB3aGlsZSAoaSA8IDY0IHx8IGkgPCBFW2lCdWZMZW4gLSAxXSArIDMyKSB7CisgICAgaW50IGlSb3VuZFNpemUgPSBzaXplICsgaUJsb2NrU2l6ZTsKKyAgICBpZiAodmVjdG9yKSB7CisgICAgICBpUm91bmRTaXplICs9IDQ4OworICAgIH0KKyAgICBpQnVmTGVuID0gaVJvdW5kU2l6ZSAqIDY0OworICAgIGJ1Zi5Fc3RpbWF0ZVNpemUoaUJ1Zkxlbik7CisgICAgRSA9IGJ1Zi5HZXRCdWZmZXIoKTsKKyAgICBDRlhfQnl0ZVRleHRCdWYgY29udGVudDsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDY0OyArK2opIHsKKyAgICAgIGNvbnRlbnQuQXBwZW5kQmxvY2socGFzc3dvcmQsIHNpemUpOworICAgICAgY29udGVudC5BcHBlbmRCbG9jayhpbnB1dCwgaUJsb2NrU2l6ZSk7CisgICAgICBpZiAodmVjdG9yKSB7CisgICAgICAgIGNvbnRlbnQuQXBwZW5kQmxvY2sodmVjdG9yLCA0OCk7CisgICAgICB9CisgICAgfQorICAgIENSWVBUX0FFU1NldEtleShhZXMsIDE2LCBrZXksIDE2LCBUUlVFKTsKKyAgICBDUllQVF9BRVNTZXRJVihhZXMsIGl2KTsKKyAgICBDUllQVF9BRVNFbmNyeXB0KGFlcywgRSwgY29udGVudC5HZXRCdWZmZXIoKSwgaUJ1Zkxlbik7CisgICAgaW50IGlIYXNoID0gMDsKKyAgICBzd2l0Y2ggKEJpZ09yZGVyNjRCaXRzTW9kMyhFKSkgeworICAgICAgY2FzZSAwOgorICAgICAgICBpSGFzaCA9IDA7CisgICAgICAgIGlCbG9ja1NpemUgPSAzMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE6CisgICAgICAgIGlIYXNoID0gMTsKKyAgICAgICAgaUJsb2NrU2l6ZSA9IDQ4OworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlIYXNoID0gMjsKKyAgICAgICAgaUJsb2NrU2l6ZSA9IDY0OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaW50ZXJEaWdlc3QuRXN0aW1hdGVTaXplKGlCbG9ja1NpemUpOworICAgIGlucHV0ID0gaW50ZXJEaWdlc3QuR2V0QnVmZmVyKCk7CisgICAgaWYgKGlIYXNoID09IDApIHsKKyAgICAgIENSWVBUX1NIQTI1NkdlbmVyYXRlKEUsIGlCdWZMZW4sIGlucHV0KTsKKyAgICB9IGVsc2UgaWYgKGlIYXNoID09IDEpIHsKKyAgICAgIENSWVBUX1NIQTM4NEdlbmVyYXRlKEUsIGlCdWZMZW4sIGlucHV0KTsKKyAgICB9IGVsc2UgaWYgKGlIYXNoID09IDIpIHsKKyAgICAgIENSWVBUX1NIQTUxMkdlbmVyYXRlKEUsIGlCdWZMZW4sIGlucHV0KTsKKyAgICB9CisgICAga2V5ID0gaW5wdXQ7CisgICAgaXYgPSBpbnB1dCArIDE2OworICAgICsraTsKKyAgfQorICBGWF9GcmVlKGFlcyk7CisgIGlmIChoYXNoKSB7CisgICAgRlhTWVNfbWVtY3B5KGhhc2gsIGlucHV0LCAzMik7CisgIH0KK30KK0ZYX0JPT0wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6QUVTMjU2X0NoZWNrUGFzc3dvcmQoCisgICAgY29uc3QgdWludDhfdCogcGFzc3dvcmQsCisgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICBGWF9CT09MIGJPd25lciwKKyAgICB1aW50OF90KiBrZXkpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgb2tleSA9CisgICAgICBtX3BFbmNyeXB0RGljdCA/IG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoIk8iKSA6IENGWF9CeXRlU3RyaW5nKCk7CisgIGlmIChva2V5LkdldExlbmd0aCgpIDwgNDgpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgdWtleSA9CisgICAgICBtX3BFbmNyeXB0RGljdCA/IG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoIlUiKSA6IENGWF9CeXRlU3RyaW5nKCk7CisgIGlmICh1a2V5LkdldExlbmd0aCgpIDwgNDgpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgY29uc3QgdWludDhfdCogcGtleSA9IGJPd25lciA/IChjb25zdCB1aW50OF90Kilva2V5IDogKGNvbnN0IHVpbnQ4X3QqKXVrZXk7CisgIHVpbnQ4X3Qgc2hhWzEyOF07CisgIHVpbnQ4X3QgZGlnZXN0WzMyXTsKKyAgaWYgKG1fUmV2aXNpb24gPj0gNikgeworICAgIFJldmlzaW9uNl9IYXNoKHBhc3N3b3JkLCBzaXplLCAoY29uc3QgdWludDhfdCopcGtleSArIDMyLAorICAgICAgICAgICAgICAgICAgIChiT3duZXIgPyAoY29uc3QgdWludDhfdCopdWtleSA6IE5VTEwpLCBkaWdlc3QpOworICB9IGVsc2UgewogICAgIENSWVBUX1NIQTI1NlN0YXJ0KHNoYSk7CiAgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKHNoYSwgcGFzc3dvcmQsIHNpemUpOwotICAgIENSWVBUX1NIQTI1NlVwZGF0ZShzaGEsIHNhbHQsIDgpOwotICAgIGlmICh2ZWN0b3IpIHsKLSAgICAgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKHNoYSwgdmVjdG9yLCA0OCk7Ci0gICAgfQotICAgIEZYX0JZVEUgZGlnZXN0WzMyXTsKLSAgICBDUllQVF9TSEEyNTZGaW5pc2goc2hhLCBkaWdlc3QpOwotICAgIENGWF9CeXRlVGV4dEJ1ZiBidWY7Ci0gICAgRlhfTFBCWVRFIGlucHV0ID0gZGlnZXN0OwotICAgIEZYX0xQQllURSBrZXkgPSBpbnB1dDsKLSAgICBGWF9MUEJZVEUgaXYgPSBpbnB1dCArIDE2OwotICAgIEZYX0xQQllURSBFID0gYnVmLkdldEJ1ZmZlcigpOwotICAgIGludCBpQnVmTGVuID0gYnVmLkdldExlbmd0aCgpOwotICAgIENGWF9CeXRlVGV4dEJ1ZiBpbnRlckRpZ2VzdDsKLSAgICBpbnQgaSA9IDA7Ci0gICAgRlhfTFBCWVRFIGFlcyA9IEZYX0FsbG9jKEZYX0JZVEUsIDIwNDgpOwotICAgIHdoaWxlIChpIDwgNjQgfHwgaSA8IEVbaUJ1ZkxlbiAtIDFdICArIDMyKSB7Ci0gICAgICAgIGludCBpUm91bmRTaXplID0gc2l6ZSArIGlCbG9ja1NpemU7Ci0gICAgICAgIGlmICh2ZWN0b3IpIHsKLSAgICAgICAgICAgIGlSb3VuZFNpemUgKz0gNDg7Ci0gICAgICAgIH0KLSAgICAgICAgaUJ1ZkxlbiA9IGlSb3VuZFNpemUgKiA2NDsKLSAgICAgICAgYnVmLkVzdGltYXRlU2l6ZShpQnVmTGVuKTsKLSAgICAgICAgRSA9IGJ1Zi5HZXRCdWZmZXIoKTsKLSAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmIGNvbnRlbnQ7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNjQ7ICsraikgewotICAgICAgICAgICAgY29udGVudC5BcHBlbmRCbG9jayhwYXNzd29yZCwgc2l6ZSk7Ci0gICAgICAgICAgICBjb250ZW50LkFwcGVuZEJsb2NrKGlucHV0LCBpQmxvY2tTaXplKTsKLSAgICAgICAgICAgIGlmICh2ZWN0b3IpIHsKLSAgICAgICAgICAgICAgICBjb250ZW50LkFwcGVuZEJsb2NrKHZlY3RvciwgNDgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIENSWVBUX0FFU1NldEtleShhZXMsIDE2LCBrZXksIDE2LCBUUlVFKTsKLSAgICAgICAgQ1JZUFRfQUVTU2V0SVYoYWVzLCBpdik7Ci0gICAgICAgIENSWVBUX0FFU0VuY3J5cHQoYWVzLCBFLCBjb250ZW50LkdldEJ1ZmZlcigpLCBpQnVmTGVuKTsKLSAgICAgICAgaW50IGlIYXNoID0gMDsKLSAgICAgICAgc3dpdGNoIChCaWdPcmRlcjY0Qml0c01vZDMoRSkpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBpSGFzaCA9IDA7Ci0gICAgICAgICAgICAgICAgaUJsb2NrU2l6ZSA9IDMyOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIGlIYXNoID0gMTsKLSAgICAgICAgICAgICAgICBpQmxvY2tTaXplID0gNDg7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGlIYXNoID0gMjsKLSAgICAgICAgICAgICAgICBpQmxvY2tTaXplID0gNjQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJEaWdlc3QuRXN0aW1hdGVTaXplKGlCbG9ja1NpemUpOwotICAgICAgICBpbnB1dCA9IGludGVyRGlnZXN0LkdldEJ1ZmZlcigpOwotICAgICAgICBpZiAoaUhhc2ggPT0gMCkgewotICAgICAgICAgICAgQ1JZUFRfU0hBMjU2R2VuZXJhdGUoRSwgaUJ1ZkxlbiwgaW5wdXQpOwotICAgICAgICB9IGVsc2UgaWYgKGlIYXNoID09IDEpIHsKLSAgICAgICAgICAgIENSWVBUX1NIQTM4NEdlbmVyYXRlKEUsIGlCdWZMZW4sIGlucHV0KTsKLSAgICAgICAgfSBlbHNlIGlmIChpSGFzaCA9PSAyKSB7Ci0gICAgICAgICAgICBDUllQVF9TSEE1MTJHZW5lcmF0ZShFLCBpQnVmTGVuLCBpbnB1dCk7Ci0gICAgICAgIH0KLSAgICAgICAga2V5ID0gaW5wdXQ7Ci0gICAgICAgIGl2ID0gaW5wdXQgKyAxNjsKLSAgICAgICAgKytpOwotICAgIH0KLSAgICBGWF9GcmVlKGFlcyk7Ci0gICAgaWYgKGhhc2gpIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5MzIoaGFzaCwgaW5wdXQsIDMyKTsKLSAgICB9Ci19Ci1GWF9CT09MIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkFFUzI1Nl9DaGVja1Bhc3N3b3JkKEZYX0xQQ0JZVEUgcGFzc3dvcmQsIEZYX0RXT1JEIHNpemUsCi0gICAgICAgIEZYX0JPT0wgYk93bmVyLCBGWF9MUEJZVEUga2V5KQotewotICAgIENGWF9CeXRlU3RyaW5nIG9rZXkgPSBtX3BFbmNyeXB0RGljdCA/IG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIk8iKSkgOiBDRlhfQnl0ZVN0cmluZygpOwotICAgIGlmIChva2V5LkdldExlbmd0aCgpIDwgNDgpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyB1a2V5ID0gbV9wRW5jcnlwdERpY3QgPyBtX3BFbmNyeXB0RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJVIikpIDogQ0ZYX0J5dGVTdHJpbmcoKTsKLSAgICBpZiAodWtleS5HZXRMZW5ndGgoKSA8IDQ4KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfTFBDQllURSBwa2V5ID0gYk93bmVyID8gKEZYX0xQQ0JZVEUpb2tleSA6IChGWF9MUENCWVRFKXVrZXk7Ci0gICAgRlhfQllURSBzaGFbMTI4XTsKLSAgICBGWF9CWVRFIGRpZ2VzdFszMl07Ci0gICAgaWYgKG1fUmV2aXNpb24gPj0gNikgewotICAgICAgICBSZXZpc2lvbjZfSGFzaChwYXNzd29yZCwgc2l6ZSwgKEZYX0xQQ0JZVEUpcGtleSArIDMyLCAoYk93bmVyID8gKEZYX0xQQ0JZVEUpdWtleSA6IE5VTEwpLCBkaWdlc3QpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIENSWVBUX1NIQTI1NlN0YXJ0KHNoYSk7Ci0gICAgICAgIENSWVBUX1NIQTI1NlVwZGF0ZShzaGEsIHBhc3N3b3JkLCBzaXplKTsKLSAgICAgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKHNoYSwgcGtleSArIDMyLCA4KTsKLSAgICAgICAgaWYgKGJPd25lcikgewotICAgICAgICAgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKHNoYSwgdWtleSwgNDgpOwotICAgICAgICB9Ci0gICAgICAgIENSWVBUX1NIQTI1NkZpbmlzaChzaGEsIGRpZ2VzdCk7Ci0gICAgfQotICAgIGlmIChGWFNZU19tZW1jbXAzMihkaWdlc3QsIHBrZXksIDMyKSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKGtleSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAobV9SZXZpc2lvbiA+PSA2KSB7Ci0gICAgICAgIFJldmlzaW9uNl9IYXNoKHBhc3N3b3JkLCBzaXplLCAoRlhfTFBDQllURSlwa2V5ICsgNDAsIChiT3duZXIgPyAoRlhfTFBDQllURSl1a2V5IDogTlVMTCksIGRpZ2VzdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQ1JZUFRfU0hBMjU2U3RhcnQoc2hhKTsKLSAgICAgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKHNoYSwgcGFzc3dvcmQsIHNpemUpOwotICAgICAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCBwa2V5ICsgNDAsIDgpOwotICAgICAgICBpZiAoYk93bmVyKSB7Ci0gICAgICAgICAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCB1a2V5LCA0OCk7Ci0gICAgICAgIH0KLSAgICAgICAgQ1JZUFRfU0hBMjU2RmluaXNoKHNoYSwgZGlnZXN0KTsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgZWtleSA9IG1fcEVuY3J5cHREaWN0ID8gbV9wRW5jcnlwdERpY3QtPkdldFN0cmluZyhiT3duZXIgPyBGWF9CU1RSQygiT0UiKSA6IEZYX0JTVFJDKCJVRSIpKSA6IENGWF9CeXRlU3RyaW5nKCk7Ci0gICAgaWYgKGVrZXkuR2V0TGVuZ3RoKCkgPCAzMikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX0JZVEUqIGFlcyA9IEZYX0FsbG9jKEZYX0JZVEUsIDIwNDgpOwotICAgIENSWVBUX0FFU1NldEtleShhZXMsIDE2LCBkaWdlc3QsIDMyLCBGQUxTRSk7Ci0gICAgRlhfQllURSBpdlsxNl07Ci0gICAgRlhTWVNfbWVtc2V0MzIoaXYsIDAsIDE2KTsKLSAgICBDUllQVF9BRVNTZXRJVihhZXMsIGl2KTsKLSAgICBDUllQVF9BRVNEZWNyeXB0KGFlcywga2V5LCBla2V5LCAzMik7Ci0gICAgQ1JZUFRfQUVTU2V0S2V5KGFlcywgMTYsIGtleSwgMzIsIEZBTFNFKTsKLSAgICBDUllQVF9BRVNTZXRJVihhZXMsIGl2KTsKLSAgICBDRlhfQnl0ZVN0cmluZyBwZXJtcyA9IG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlBlcm1zIikpOwotICAgIGlmIChwZXJtcy5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9CWVRFIHBlcm1zX2J1ZlsxNl07Ci0gICAgRlhTWVNfbWVtc2V0MzIocGVybXNfYnVmLCAwLCBzaXplb2YocGVybXNfYnVmKSk7Ci0gICAgRlhfRFdPUkQgY29weV9sZW4gPSBzaXplb2YocGVybXNfYnVmKTsKLSAgICBpZiAoY29weV9sZW4gPiAoRlhfRFdPUkQpcGVybXMuR2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgY29weV9sZW4gPSBwZXJtcy5HZXRMZW5ndGgoKTsKLSAgICB9Ci0gICAgRlhTWVNfbWVtY3B5MzIocGVybXNfYnVmLCAoRlhfTFBDQllURSlwZXJtcywgY29weV9sZW4pOwotICAgIEZYX0JZVEUgYnVmWzE2XTsKLSAgICBDUllQVF9BRVNEZWNyeXB0KGFlcywgYnVmLCBwZXJtc19idWYsIDE2KTsKLSAgICBGWF9GcmVlKGFlcyk7Ci0gICAgaWYgKGJ1Zls5XSAhPSAnYScgfHwgYnVmWzEwXSAhPSAnZCcgfHwgYnVmWzExXSAhPSAnYicpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoRlhEV09SRF9HRVRfTFNCRklSU1QoYnVmKSAhPSBtX1Blcm1pc3Npb25zKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKChidWZbOF0gPT0gJ1QnICYmICFJc01ldGFkYXRhRW5jcnlwdGVkKCkpIHx8IChidWZbOF0gPT0gJ0YnICYmIElzTWV0YWRhdGFFbmNyeXB0ZWQoKSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLWludCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpDaGVja1Bhc3N3b3JkKEZYX0xQQ0JZVEUgcGFzc3dvcmQsIEZYX0RXT1JEIHBhc3Nfc2l6ZSwgRlhfQk9PTCBiT3duZXIsIEZYX0xQQllURSBrZXkpCi17Ci0gICAgcmV0dXJuIENoZWNrUGFzc3dvcmQocGFzc3dvcmQsIHBhc3Nfc2l6ZSwgYk93bmVyLCBrZXksIG1fS2V5TGVuKTsKLX0KLWludCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpDaGVja1Bhc3N3b3JkKEZYX0xQQ0JZVEUgcGFzc3dvcmQsIEZYX0RXT1JEIHNpemUsIEZYX0JPT0wgYk93bmVyLCBGWF9MUEJZVEUga2V5LCBGWF9JTlQzMiBrZXlfbGVuKQotewotICAgIGlmIChtX1JldmlzaW9uID49IDUpIHsKLSAgICAgICAgcmV0dXJuIEFFUzI1Nl9DaGVja1Bhc3N3b3JkKHBhc3N3b3JkLCBzaXplLCBiT3duZXIsIGtleSk7Ci0gICAgfQotICAgIEZYX0JZVEUga2V5YnVmWzMyXTsKLSAgICBpZiAoa2V5ID09IE5VTEwpIHsKLSAgICAgICAga2V5ID0ga2V5YnVmOwotICAgIH0KKyAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCBwa2V5ICsgMzIsIDgpOwogICAgIGlmIChiT3duZXIpIHsKLSAgICAgICAgcmV0dXJuIENoZWNrT3duZXJQYXNzd29yZChwYXNzd29yZCwgc2l6ZSwga2V5LCBrZXlfbGVuKTsKKyAgICAgIENSWVBUX1NIQTI1NlVwZGF0ZShzaGEsIHVrZXksIDQ4KTsKICAgICB9Ci0gICAgcmV0dXJuIENoZWNrVXNlclBhc3N3b3JkKHBhc3N3b3JkLCBzaXplLCBGQUxTRSwga2V5LCBrZXlfbGVuKSB8fCBDaGVja1VzZXJQYXNzd29yZChwYXNzd29yZCwgc2l6ZSwgVFJVRSwga2V5LCBrZXlfbGVuKTsKLX0KLUZYX0JPT0wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6Q2hlY2tVc2VyUGFzc3dvcmQoRlhfTFBDQllURSBwYXNzd29yZCwgRlhfRFdPUkQgcGFzc19zaXplLAotICAgICAgICBGWF9CT09MIGJJZ25vcmVFbmNyeXB0TWV0YSwgRlhfTFBCWVRFIGtleSwgRlhfSU5UMzIga2V5X2xlbikKLXsKLSAgICBDYWxjRW5jcnlwdEtleShtX3BFbmNyeXB0RGljdCwgcGFzc3dvcmQsIHBhc3Nfc2l6ZSwga2V5LCBrZXlfbGVuLCBiSWdub3JlRW5jcnlwdE1ldGEsCi0gICAgICAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRJREFycmF5KCkpOwotICAgIENGWF9CeXRlU3RyaW5nIHVrZXkgPSBtX3BFbmNyeXB0RGljdCA/IG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlUiKSkgOiBDRlhfQnl0ZVN0cmluZygpOwotICAgIGlmICh1a2V5LkdldExlbmd0aCgpIDwgMTYpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9CWVRFIHVrZXlidWZbMzJdOwotICAgIGlmIChtX1JldmlzaW9uID09IDIpIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5MzIodWtleWJ1ZiwgZGVmcGFzc2NvZGUsIDMyKTsKLSAgICAgICAgQ1JZUFRfQXJjRm91ckNyeXB0QmxvY2sodWtleWJ1ZiwgMzIsIGtleSwga2V5X2xlbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRlhfQllURSB0ZXN0WzMyXSwgdG1wa2V5WzMyXTsKLSAgICAgICAgRlhfRFdPUkQgY29weV9sZW4gPSBzaXplb2YodGVzdCk7Ci0gICAgICAgIGlmIChjb3B5X2xlbiA+IChGWF9EV09SRCl1a2V5LkdldExlbmd0aCgpKSB7Ci0gICAgICAgICAgICBjb3B5X2xlbiA9IHVrZXkuR2V0TGVuZ3RoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgRlhTWVNfbWVtc2V0MzIodGVzdCwgMCwgc2l6ZW9mKHRlc3QpKTsKLSAgICAgICAgRlhTWVNfbWVtc2V0MzIodG1wa2V5LCAwLCBzaXplb2YodG1wa2V5KSk7Ci0gICAgICAgIEZYU1lTX21lbWNweTMyKHRlc3QsIHVrZXkuY19zdHIoKSwgY29weV9sZW4pOwotICAgICAgICBmb3IgKGludCBpID0gMTk7IGkgPj0gMDsgaSAtLSkgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBrZXlfbGVuOyBqICsrKSB7Ci0gICAgICAgICAgICAgICAgdG1wa2V5W2pdID0ga2V5W2pdIF4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENSWVBUX0FyY0ZvdXJDcnlwdEJsb2NrKHRlc3QsIDMyLCB0bXBrZXksIGtleV9sZW4pOwotICAgICAgICB9Ci0gICAgICAgIEZYX0JZVEUgbWQ1WzEwMF07Ci0gICAgICAgIENSWVBUX01ENVN0YXJ0KG1kNSk7Ci0gICAgICAgIENSWVBUX01ENVVwZGF0ZShtZDUsIGRlZnBhc3Njb2RlLCAzMik7Ci0gICAgICAgIENQREZfQXJyYXkqIHBJZEFycmF5ID0gbV9wUGFyc2VyLT5HZXRJREFycmF5KCk7Ci0gICAgICAgIGlmIChwSWRBcnJheSkgewotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgaWQgPSBwSWRBcnJheS0+R2V0U3RyaW5nKDApOwotICAgICAgICAgICAgQ1JZUFRfTUQ1VXBkYXRlKG1kNSwgKEZYX0xQQllURSlpZC5jX3N0cigpLCBpZC5HZXRMZW5ndGgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgQ1JZUFRfTUQ1RmluaXNoKG1kNSwgdWtleWJ1Zik7Ci0gICAgICAgIHJldHVybiBGWFNZU19tZW1jbXAzMih0ZXN0LCB1a2V5YnVmLCAxNikgPT0gMDsKLSAgICB9Ci0gICAgaWYgKEZYU1lTX21lbWNtcDMyKChGWF9MUFZPSUQpdWtleS5jX3N0cigpLCB1a2V5YnVmLCAxNikgPT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9CisgICAgQ1JZUFRfU0hBMjU2RmluaXNoKHNoYSwgZGlnZXN0KTsKKyAgfQorICBpZiAoRlhTWVNfbWVtY21wKGRpZ2VzdCwgcGtleSwgMzIpICE9IDApIHsKICAgICByZXR1cm4gRkFMU0U7Ci19Ci1DRlhfQnl0ZVN0cmluZyBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpHZXRVc2VyUGFzc3dvcmQoRlhfTFBDQllURSBvd25lcl9wYXNzLCBGWF9EV09SRCBwYXNzX3NpemUpCi17Ci0gICAgcmV0dXJuIEdldFVzZXJQYXNzd29yZChvd25lcl9wYXNzLCBwYXNzX3NpemUsIG1fS2V5TGVuKTsKLX0KLUNGWF9CeXRlU3RyaW5nIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkdldFVzZXJQYXNzd29yZChGWF9MUENCWVRFIG93bmVyX3Bhc3MsIEZYX0RXT1JEIHBhc3Nfc2l6ZSwgRlhfSU5UMzIga2V5X2xlbikKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBva2V5ID0gbV9wRW5jcnlwdERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiTyIpKTsKLSAgICBGWF9CWVRFIHBhc3Njb2RlWzMyXTsKLSAgICBGWF9EV09SRCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSArKykgewotICAgICAgICBwYXNzY29kZVtpXSA9IGkgPCBwYXNzX3NpemUgPyBvd25lcl9wYXNzW2ldIDogZGVmcGFzc2NvZGVbaSAtIHBhc3Nfc2l6ZV07CisgIH0KKyAgaWYgKCFrZXkpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAobV9SZXZpc2lvbiA+PSA2KSB7CisgICAgUmV2aXNpb242X0hhc2gocGFzc3dvcmQsIHNpemUsIChjb25zdCB1aW50OF90Kilwa2V5ICsgNDAsCisgICAgICAgICAgICAgICAgICAgKGJPd25lciA/IChjb25zdCB1aW50OF90Kil1a2V5IDogTlVMTCksIGRpZ2VzdCk7CisgIH0gZWxzZSB7CisgICAgQ1JZUFRfU0hBMjU2U3RhcnQoc2hhKTsKKyAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCBwYXNzd29yZCwgc2l6ZSk7CisgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKHNoYSwgcGtleSArIDQwLCA4KTsKKyAgICBpZiAoYk93bmVyKSB7CisgICAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCB1a2V5LCA0OCk7CiAgICAgfQotICAgIEZYX0JZVEUgZGlnZXN0WzE2XTsKKyAgICBDUllQVF9TSEEyNTZGaW5pc2goc2hhLCBkaWdlc3QpOworICB9CisgIENGWF9CeXRlU3RyaW5nIGVrZXkgPSBtX3BFbmNyeXB0RGljdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbV9wRW5jcnlwdERpY3QtPkdldFN0cmluZyhiT3duZXIgPyAiT0UiIDogIlVFIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENGWF9CeXRlU3RyaW5nKCk7CisgIGlmIChla2V5LkdldExlbmd0aCgpIDwgMzIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgdWludDhfdCogYWVzID0gRlhfQWxsb2ModWludDhfdCwgMjA0OCk7CisgIENSWVBUX0FFU1NldEtleShhZXMsIDE2LCBkaWdlc3QsIDMyLCBGQUxTRSk7CisgIHVpbnQ4X3QgaXZbMTZdOworICBGWFNZU19tZW1zZXQoaXYsIDAsIDE2KTsKKyAgQ1JZUFRfQUVTU2V0SVYoYWVzLCBpdik7CisgIENSWVBUX0FFU0RlY3J5cHQoYWVzLCBrZXksIGVrZXksIDMyKTsKKyAgQ1JZUFRfQUVTU2V0S2V5KGFlcywgMTYsIGtleSwgMzIsIEZBTFNFKTsKKyAgQ1JZUFRfQUVTU2V0SVYoYWVzLCBpdik7CisgIENGWF9CeXRlU3RyaW5nIHBlcm1zID0gbV9wRW5jcnlwdERpY3QtPkdldFN0cmluZygiUGVybXMiKTsKKyAgaWYgKHBlcm1zLklzRW1wdHkoKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICB1aW50OF90IHBlcm1zX2J1ZlsxNl07CisgIEZYU1lTX21lbXNldChwZXJtc19idWYsIDAsIHNpemVvZihwZXJtc19idWYpKTsKKyAgRlhfRFdPUkQgY29weV9sZW4gPSBzaXplb2YocGVybXNfYnVmKTsKKyAgaWYgKGNvcHlfbGVuID4gKEZYX0RXT1JEKXBlcm1zLkdldExlbmd0aCgpKSB7CisgICAgY29weV9sZW4gPSBwZXJtcy5HZXRMZW5ndGgoKTsKKyAgfQorICBGWFNZU19tZW1jcHkocGVybXNfYnVmLCAoY29uc3QgdWludDhfdCopcGVybXMsIGNvcHlfbGVuKTsKKyAgdWludDhfdCBidWZbMTZdOworICBDUllQVF9BRVNEZWNyeXB0KGFlcywgYnVmLCBwZXJtc19idWYsIDE2KTsKKyAgRlhfRnJlZShhZXMpOworICBpZiAoYnVmWzldICE9ICdhJyB8fCBidWZbMTBdICE9ICdkJyB8fCBidWZbMTFdICE9ICdiJykgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoRlhEV09SRF9HRVRfTFNCRklSU1QoYnVmKSAhPSBtX1Blcm1pc3Npb25zKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICgoYnVmWzhdID09ICdUJyAmJiAhSXNNZXRhZGF0YUVuY3J5cHRlZCgpKSB8fAorICAgICAgKGJ1Zls4XSA9PSAnRicgJiYgSXNNZXRhZGF0YUVuY3J5cHRlZCgpKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK2ludCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpDaGVja1Bhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgcGFzc19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiT3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBrZXkpIHsKKyAgcmV0dXJuIENoZWNrUGFzc3dvcmQocGFzc3dvcmQsIHBhc3Nfc2l6ZSwgYk93bmVyLCBrZXksIG1fS2V5TGVuKTsKK30KK2ludCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpDaGVja1Bhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBrZXlfbGVuKSB7CisgIGlmIChtX1JldmlzaW9uID49IDUpIHsKKyAgICByZXR1cm4gQUVTMjU2X0NoZWNrUGFzc3dvcmQocGFzc3dvcmQsIHNpemUsIGJPd25lciwga2V5KTsKKyAgfQorICB1aW50OF90IGtleWJ1ZlszMl07CisgIGlmICgha2V5KSB7CisgICAga2V5ID0ga2V5YnVmOworICB9CisgIGlmIChiT3duZXIpIHsKKyAgICByZXR1cm4gQ2hlY2tPd25lclBhc3N3b3JkKHBhc3N3b3JkLCBzaXplLCBrZXksIGtleV9sZW4pOworICB9CisgIHJldHVybiBDaGVja1VzZXJQYXNzd29yZChwYXNzd29yZCwgc2l6ZSwgRkFMU0UsIGtleSwga2V5X2xlbikgfHwKKyAgICAgICAgIENoZWNrVXNlclBhc3N3b3JkKHBhc3N3b3JkLCBzaXplLCBUUlVFLCBrZXksIGtleV9sZW4pOworfQorRlhfQk9PTCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpDaGVja1VzZXJQYXNzd29yZCgKKyAgICBjb25zdCB1aW50OF90KiBwYXNzd29yZCwKKyAgICBGWF9EV09SRCBwYXNzX3NpemUsCisgICAgRlhfQk9PTCBiSWdub3JlRW5jcnlwdE1ldGEsCisgICAgdWludDhfdCoga2V5LAorICAgIGludDMyX3Qga2V5X2xlbikgeworICBDYWxjRW5jcnlwdEtleShtX3BFbmNyeXB0RGljdCwgcGFzc3dvcmQsIHBhc3Nfc2l6ZSwga2V5LCBrZXlfbGVuLAorICAgICAgICAgICAgICAgICBiSWdub3JlRW5jcnlwdE1ldGEsIG1fcFBhcnNlci0+R2V0SURBcnJheSgpKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgdWtleSA9CisgICAgICBtX3BFbmNyeXB0RGljdCA/IG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoIlUiKSA6IENGWF9CeXRlU3RyaW5nKCk7CisgIGlmICh1a2V5LkdldExlbmd0aCgpIDwgMTYpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgdWludDhfdCB1a2V5YnVmWzMyXTsKKyAgaWYgKG1fUmV2aXNpb24gPT0gMikgeworICAgIEZYU1lTX21lbWNweSh1a2V5YnVmLCBkZWZwYXNzY29kZSwgMzIpOworICAgIENSWVBUX0FyY0ZvdXJDcnlwdEJsb2NrKHVrZXlidWYsIDMyLCBrZXksIGtleV9sZW4pOworICB9IGVsc2UgeworICAgIHVpbnQ4X3QgdGVzdFszMl0sIHRtcGtleVszMl07CisgICAgRlhfRFdPUkQgY29weV9sZW4gPSBzaXplb2YodGVzdCk7CisgICAgaWYgKGNvcHlfbGVuID4gKEZYX0RXT1JEKXVrZXkuR2V0TGVuZ3RoKCkpIHsKKyAgICAgIGNvcHlfbGVuID0gdWtleS5HZXRMZW5ndGgoKTsKKyAgICB9CisgICAgRlhTWVNfbWVtc2V0KHRlc3QsIDAsIHNpemVvZih0ZXN0KSk7CisgICAgRlhTWVNfbWVtc2V0KHRtcGtleSwgMCwgc2l6ZW9mKHRtcGtleSkpOworICAgIEZYU1lTX21lbWNweSh0ZXN0LCB1a2V5LmNfc3RyKCksIGNvcHlfbGVuKTsKKyAgICBmb3IgKGludCBpID0gMTk7IGkgPj0gMDsgaS0tKSB7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGtleV9sZW47IGorKykgeworICAgICAgICB0bXBrZXlbal0gPSBrZXlbal0gXiBpOworICAgICAgfQorICAgICAgQ1JZUFRfQXJjRm91ckNyeXB0QmxvY2sodGVzdCwgMzIsIHRtcGtleSwga2V5X2xlbik7CisgICAgfQorICAgIHVpbnQ4X3QgbWQ1WzEwMF07CisgICAgQ1JZUFRfTUQ1U3RhcnQobWQ1KTsKKyAgICBDUllQVF9NRDVVcGRhdGUobWQ1LCBkZWZwYXNzY29kZSwgMzIpOworICAgIENQREZfQXJyYXkqIHBJZEFycmF5ID0gbV9wUGFyc2VyLT5HZXRJREFycmF5KCk7CisgICAgaWYgKHBJZEFycmF5KSB7CisgICAgICBDRlhfQnl0ZVN0cmluZyBpZCA9IHBJZEFycmF5LT5HZXRTdHJpbmcoMCk7CisgICAgICBDUllQVF9NRDVVcGRhdGUobWQ1LCAodWludDhfdCopaWQuY19zdHIoKSwgaWQuR2V0TGVuZ3RoKCkpOworICAgIH0KKyAgICBDUllQVF9NRDVGaW5pc2gobWQ1LCB1a2V5YnVmKTsKKyAgICByZXR1cm4gRlhTWVNfbWVtY21wKHRlc3QsIHVrZXlidWYsIDE2KSA9PSAwOworICB9CisgIGlmIChGWFNZU19tZW1jbXAoKHZvaWQqKXVrZXkuY19zdHIoKSwgdWtleWJ1ZiwgMTYpID09IDApIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitDRlhfQnl0ZVN0cmluZyBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpHZXRVc2VyUGFzc3dvcmQoCisgICAgY29uc3QgdWludDhfdCogb3duZXJfcGFzcywKKyAgICBGWF9EV09SRCBwYXNzX3NpemUpIHsKKyAgcmV0dXJuIEdldFVzZXJQYXNzd29yZChvd25lcl9wYXNzLCBwYXNzX3NpemUsIG1fS2V5TGVuKTsKK30KK0NGWF9CeXRlU3RyaW5nIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkdldFVzZXJQYXNzd29yZCgKKyAgICBjb25zdCB1aW50OF90KiBvd25lcl9wYXNzLAorICAgIEZYX0RXT1JEIHBhc3Nfc2l6ZSwKKyAgICBpbnQzMl90IGtleV9sZW4pIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgb2tleSA9IG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoIk8iKTsKKyAgdWludDhfdCBwYXNzY29kZVszMl07CisgIEZYX0RXT1JEIGk7CisgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisgICAgcGFzc2NvZGVbaV0gPSBpIDwgcGFzc19zaXplID8gb3duZXJfcGFzc1tpXSA6IGRlZnBhc3Njb2RlW2kgLSBwYXNzX3NpemVdOworICB9CisgIHVpbnQ4X3QgZGlnZXN0WzE2XTsKKyAgQ1JZUFRfTUQ1R2VuZXJhdGUocGFzc2NvZGUsIDMyLCBkaWdlc3QpOworICBpZiAobV9SZXZpc2lvbiA+PSAzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDsgaSsrKSB7CisgICAgICBDUllQVF9NRDVHZW5lcmF0ZShkaWdlc3QsIDE2LCBkaWdlc3QpOworICAgIH0KKyAgfQorICB1aW50OF90IGVuY2tleVszMl07CisgIEZYU1lTX21lbXNldChlbmNrZXksIDAsIHNpemVvZihlbmNrZXkpKTsKKyAgRlhfRFdPUkQgY29weV9sZW4gPSBrZXlfbGVuOworICBpZiAoY29weV9sZW4gPiBzaXplb2YoZGlnZXN0KSkgeworICAgIGNvcHlfbGVuID0gc2l6ZW9mKGRpZ2VzdCk7CisgIH0KKyAgRlhTWVNfbWVtY3B5KGVuY2tleSwgZGlnZXN0LCBjb3B5X2xlbik7CisgIGludCBva2V5bGVuID0gb2tleS5HZXRMZW5ndGgoKTsKKyAgaWYgKG9rZXlsZW4gPiAzMikgeworICAgIG9rZXlsZW4gPSAzMjsKKyAgfQorICB1aW50OF90IG9rZXlidWZbNjRdOworICBGWFNZU19tZW1zZXQob2tleWJ1ZiwgMCwgc2l6ZW9mKG9rZXlidWYpKTsKKyAgRlhTWVNfbWVtY3B5KG9rZXlidWYsIG9rZXkuY19zdHIoKSwgb2tleWxlbik7CisgIGlmIChtX1JldmlzaW9uID09IDIpIHsKKyAgICBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayhva2V5YnVmLCBva2V5bGVuLCBlbmNrZXksIGtleV9sZW4pOworICB9IGVsc2UgeworICAgIGZvciAoaW50IGkgPSAxOTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgIHVpbnQ4X3QgdGVtcGtleVszMl07CisgICAgICBGWFNZU19tZW1zZXQodGVtcGtleSwgMCwgc2l6ZW9mKHRlbXBrZXkpKTsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbV9LZXlMZW47IGorKykgeworICAgICAgICB0ZW1wa2V5W2pdID0gZW5ja2V5W2pdIF4gaTsKKyAgICAgIH0KKyAgICAgIENSWVBUX0FyY0ZvdXJDcnlwdEJsb2NrKG9rZXlidWYsIG9rZXlsZW4sIHRlbXBrZXksIGtleV9sZW4pOworICAgIH0KKyAgfQorICBpbnQgbGVuID0gMzI7CisgIHdoaWxlIChsZW4gJiYgZGVmcGFzc2NvZGVbbGVuIC0gMV0gPT0gb2tleWJ1ZltsZW4gLSAxXSkgeworICAgIGxlbi0tOworICB9CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhva2V5YnVmLCBsZW4pOworfQorRlhfQk9PTCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpDaGVja093bmVyUGFzc3dvcmQoCisgICAgY29uc3QgdWludDhfdCogcGFzc3dvcmQsCisgICAgRlhfRFdPUkQgcGFzc19zaXplLAorICAgIHVpbnQ4X3QqIGtleSwKKyAgICBpbnQzMl90IGtleV9sZW4pIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgdXNlcl9wYXNzID0gR2V0VXNlclBhc3N3b3JkKHBhc3N3b3JkLCBwYXNzX3NpemUsIGtleV9sZW4pOworICBpZiAoQ2hlY2tVc2VyUGFzc3dvcmQodXNlcl9wYXNzLCB1c2VyX3Bhc3MuR2V0TGVuZ3RoKCksIEZBTFNFLCBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICBrZXlfbGVuKSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBDaGVja1VzZXJQYXNzd29yZCh1c2VyX3Bhc3MsIHVzZXJfcGFzcy5HZXRMZW5ndGgoKSwgVFJVRSwga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2xlbik7Cit9CitGWF9CT09MIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OklzTWV0YWRhdGFFbmNyeXB0ZWQoKSB7CisgIHJldHVybiBtX3BFbmNyeXB0RGljdC0+R2V0Qm9vbGVhbigiRW5jcnlwdE1ldGFkYXRhIiwgVFJVRSk7Cit9CitDUERGX1NlY3VyaXR5SGFuZGxlciogRlBERl9DcmVhdGVTdGFuZGFyZFNlY3VyaXR5SGFuZGxlcigpIHsKKyAgcmV0dXJuIG5ldyBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOworfQordm9pZCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpPbkNyZWF0ZShDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcElkQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHVzZXJfcGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgdXNlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBvd25lcl9wYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvd25lcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCB0eXBlKSB7CisgIGludCBjaXBoZXIgPSAwLCBrZXlfbGVuID0gMDsKKyAgaWYgKCFMb2FkRGljdChwRW5jcnlwdERpY3QsIHR5cGUsIGNpcGhlciwga2V5X2xlbikpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGJEZWZhdWx0ICYmICghb3duZXJfcGFzcyB8fCBvd25lcl9zaXplID09IDApKSB7CisgICAgb3duZXJfcGFzcyA9IHVzZXJfcGFzczsKKyAgICBvd25lcl9zaXplID0gdXNlcl9zaXplOworICB9CisgIGlmIChtX1JldmlzaW9uID49IDUpIHsKKyAgICBpbnQgdCA9IChpbnQpdGltZShOVUxMKTsKKyAgICB1aW50OF90IHNoYVsxMjhdOworICAgIENSWVBUX1NIQTI1NlN0YXJ0KHNoYSk7CisgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKHNoYSwgKHVpbnQ4X3QqKSZ0LCBzaXplb2YgdCk7CisgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKHNoYSwgbV9FbmNyeXB0S2V5LCAzMik7CisgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKHNoYSwgKHVpbnQ4X3QqKSJ0aGVyZSIsIDUpOworICAgIENSWVBUX1NIQTI1NkZpbmlzaChzaGEsIG1fRW5jcnlwdEtleSk7CisgICAgQUVTMjU2X1NldFBhc3N3b3JkKHBFbmNyeXB0RGljdCwgdXNlcl9wYXNzLCB1c2VyX3NpemUsIEZBTFNFLCBtX0VuY3J5cHRLZXkpOworICAgIGlmIChiRGVmYXVsdCkgeworICAgICAgQUVTMjU2X1NldFBhc3N3b3JkKHBFbmNyeXB0RGljdCwgb3duZXJfcGFzcywgb3duZXJfc2l6ZSwgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX0VuY3J5cHRLZXkpOworICAgICAgQUVTMjU2X1NldFBlcm1zKHBFbmNyeXB0RGljdCwgbV9QZXJtaXNzaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICBwRW5jcnlwdERpY3QtPkdldEJvb2xlYW4oIkVuY3J5cHRNZXRhZGF0YSIsIFRSVUUpLAorICAgICAgICAgICAgICAgICAgICAgIG1fRW5jcnlwdEtleSk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBpZiAoYkRlZmF1bHQpIHsKKyAgICB1aW50OF90IHBhc3Njb2RlWzMyXTsKKyAgICBGWF9EV09SRCBpOworICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisgICAgICBwYXNzY29kZVtpXSA9CisgICAgICAgICAgaSA8IG93bmVyX3NpemUgPyBvd25lcl9wYXNzW2ldIDogZGVmcGFzc2NvZGVbaSAtIG93bmVyX3NpemVdOworICAgIH0KKyAgICB1aW50OF90IGRpZ2VzdFsxNl07CiAgICAgQ1JZUFRfTUQ1R2VuZXJhdGUocGFzc2NvZGUsIDMyLCBkaWdlc3QpOwogICAgIGlmIChtX1JldmlzaW9uID49IDMpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDsgaSArKykgewotICAgICAgICAgICAgQ1JZUFRfTUQ1R2VuZXJhdGUoZGlnZXN0LCAxNiwgZGlnZXN0KTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTA7IGkrKykgeworICAgICAgICBDUllQVF9NRDVHZW5lcmF0ZShkaWdlc3QsIDE2LCBkaWdlc3QpOworICAgICAgfQorICAgIH0KKyAgICB1aW50OF90IGVuY2tleVszMl07CisgICAgRlhTWVNfbWVtY3B5KGVuY2tleSwgZGlnZXN0LCBrZXlfbGVuKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworICAgICAgcGFzc2NvZGVbaV0gPSBpIDwgdXNlcl9zaXplID8gdXNlcl9wYXNzW2ldIDogZGVmcGFzc2NvZGVbaSAtIHVzZXJfc2l6ZV07CisgICAgfQorICAgIENSWVBUX0FyY0ZvdXJDcnlwdEJsb2NrKHBhc3Njb2RlLCAzMiwgZW5ja2V5LCBrZXlfbGVuKTsKKyAgICB1aW50OF90IHRlbXBrZXlbMzJdOworICAgIGlmIChtX1JldmlzaW9uID49IDMpIHsKKyAgICAgIGZvciAoaSA9IDE7IGkgPD0gMTk7IGkrKykgeworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGtleV9sZW47IGorKykgeworICAgICAgICAgIHRlbXBrZXlbal0gPSBlbmNrZXlbal0gXiAodWludDhfdClpOwogICAgICAgICB9CisgICAgICAgIENSWVBUX0FyY0ZvdXJDcnlwdEJsb2NrKHBhc3Njb2RlLCAzMiwgdGVtcGtleSwga2V5X2xlbik7CisgICAgICB9CiAgICAgfQotICAgIEZYX0JZVEUgZW5ja2V5WzMyXTsKLSAgICBGWFNZU19tZW1zZXQzMihlbmNrZXksIDAsIHNpemVvZihlbmNrZXkpKTsKLSAgICBGWF9EV09SRCBjb3B5X2xlbiA9IGtleV9sZW47Ci0gICAgaWYgKGNvcHlfbGVuID4gc2l6ZW9mKGRpZ2VzdCkpIHsKLSAgICAgICAgY29weV9sZW4gPSBzaXplb2YoZGlnZXN0KTsKKyAgICBwRW5jcnlwdERpY3QtPlNldEF0U3RyaW5nKCJPIiwgQ0ZYX0J5dGVTdHJpbmcocGFzc2NvZGUsIDMyKSk7CisgIH0KKyAgQ2FsY0VuY3J5cHRLZXkobV9wRW5jcnlwdERpY3QsICh1aW50OF90Kil1c2VyX3Bhc3MsIHVzZXJfc2l6ZSwgbV9FbmNyeXB0S2V5LAorICAgICAgICAgICAgICAgICBrZXlfbGVuLCBGQUxTRSwgcElkQXJyYXkpOworICBpZiAobV9SZXZpc2lvbiA8IDMpIHsKKyAgICB1aW50OF90IHRlbXBidWZbMzJdOworICAgIEZYU1lTX21lbWNweSh0ZW1wYnVmLCBkZWZwYXNzY29kZSwgMzIpOworICAgIENSWVBUX0FyY0ZvdXJDcnlwdEJsb2NrKHRlbXBidWYsIDMyLCBtX0VuY3J5cHRLZXksIGtleV9sZW4pOworICAgIHBFbmNyeXB0RGljdC0+U2V0QXRTdHJpbmcoIlUiLCBDRlhfQnl0ZVN0cmluZyh0ZW1wYnVmLCAzMikpOworICB9IGVsc2UgeworICAgIHVpbnQ4X3QgbWQ1WzEwMF07CisgICAgQ1JZUFRfTUQ1U3RhcnQobWQ1KTsKKyAgICBDUllQVF9NRDVVcGRhdGUobWQ1LCBkZWZwYXNzY29kZSwgMzIpOworICAgIGlmIChwSWRBcnJheSkgeworICAgICAgQ0ZYX0J5dGVTdHJpbmcgaWQgPSBwSWRBcnJheS0+R2V0U3RyaW5nKDApOworICAgICAgQ1JZUFRfTUQ1VXBkYXRlKG1kNSwgKHVpbnQ4X3QqKWlkLmNfc3RyKCksIGlkLkdldExlbmd0aCgpKTsKICAgICB9Ci0gICAgRlhTWVNfbWVtY3B5MzIoZW5ja2V5LCBkaWdlc3QsIGNvcHlfbGVuKTsKLSAgICBpbnQgb2tleWxlbiA9IG9rZXkuR2V0TGVuZ3RoKCk7Ci0gICAgaWYgKG9rZXlsZW4gPiAzMikgewotICAgICAgICBva2V5bGVuID0gMzI7CisgICAgdWludDhfdCBkaWdlc3RbMzJdOworICAgIENSWVBUX01ENUZpbmlzaChtZDUsIGRpZ2VzdCk7CisgICAgQ1JZUFRfQXJjRm91ckNyeXB0QmxvY2soZGlnZXN0LCAxNiwgbV9FbmNyeXB0S2V5LCBrZXlfbGVuKTsKKyAgICB1aW50OF90IHRlbXBrZXlbMzJdOworICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IDE5OyBpKyspIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwga2V5X2xlbjsgaisrKSB7CisgICAgICAgIHRlbXBrZXlbal0gPSBtX0VuY3J5cHRLZXlbal0gXiAodWludDhfdClpOworICAgICAgfQorICAgICAgQ1JZUFRfQXJjRm91ckNyeXB0QmxvY2soZGlnZXN0LCAxNiwgdGVtcGtleSwga2V5X2xlbik7CiAgICAgfQotICAgIEZYX0JZVEUgb2tleWJ1Zls2NF07Ci0gICAgRlhTWVNfbWVtc2V0MzIob2tleWJ1ZiwgMCwgc2l6ZW9mKG9rZXlidWYpKTsKLSAgICBGWFNZU19tZW1jcHkzMihva2V5YnVmLCBva2V5LmNfc3RyKCksIG9rZXlsZW4pOwotICAgIGlmIChtX1JldmlzaW9uID09IDIpIHsKLSAgICAgICAgQ1JZUFRfQXJjRm91ckNyeXB0QmxvY2sob2tleWJ1Ziwgb2tleWxlbiwgZW5ja2V5LCBrZXlfbGVuKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGludCBpID0gMTk7IGkgPj0gMDsgaSAtLSkgewotICAgICAgICAgICAgRlhfQllURSB0ZW1wa2V5WzMyXTsKLSAgICAgICAgICAgIEZYU1lTX21lbXNldDMyKHRlbXBrZXksIDAsIHNpemVvZih0ZW1wa2V5KSk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG1fS2V5TGVuOyBqICsrKSB7Ci0gICAgICAgICAgICAgICAgdGVtcGtleVtqXSA9IGVuY2tleVtqXSBeIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayhva2V5YnVmLCBva2V5bGVuLCB0ZW1wa2V5LCBrZXlfbGVuKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpbnQgbGVuID0gMzI7Ci0gICAgd2hpbGUgKGxlbiAmJiBkZWZwYXNzY29kZVtsZW4gLSAxXSA9PSBva2V5YnVmW2xlbiAtIDFdKSB7Ci0gICAgICAgIGxlbiAtLTsKLSAgICB9Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKG9rZXlidWYsIGxlbik7CisgICAgQ1JZUFRfTUQ1R2VuZXJhdGUoZGlnZXN0LCAxNiwgZGlnZXN0ICsgMTYpOworICAgIHBFbmNyeXB0RGljdC0+U2V0QXRTdHJpbmcoIlUiLCBDRlhfQnl0ZVN0cmluZyhkaWdlc3QsIDMyKSk7CisgIH0KIH0KLUZYX0JPT0wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6Q2hlY2tPd25lclBhc3N3b3JkKEZYX0xQQ0JZVEUgcGFzc3dvcmQsIEZYX0RXT1JEIHBhc3Nfc2l6ZSwKLSAgICAgICAgRlhfTFBCWVRFIGtleSwgRlhfSU5UMzIga2V5X2xlbikKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyB1c2VyX3Bhc3MgPSBHZXRVc2VyUGFzc3dvcmQocGFzc3dvcmQsIHBhc3Nfc2l6ZSwga2V5X2xlbik7Ci0gICAgaWYgKENoZWNrVXNlclBhc3N3b3JkKHVzZXJfcGFzcywgdXNlcl9wYXNzLkdldExlbmd0aCgpLCBGQUxTRSwga2V5LCBrZXlfbGVuKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIENoZWNrVXNlclBhc3N3b3JkKHVzZXJfcGFzcywgdXNlcl9wYXNzLkdldExlbmd0aCgpLCBUUlVFLCBrZXksIGtleV9sZW4pOwordm9pZCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpPbkNyZWF0ZShDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcElkQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHVzZXJfcGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgdXNlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBvd25lcl9wYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvd25lcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCB0eXBlKSB7CisgIE9uQ3JlYXRlKHBFbmNyeXB0RGljdCwgcElkQXJyYXksIHVzZXJfcGFzcywgdXNlcl9zaXplLCBvd25lcl9wYXNzLCBvd25lcl9zaXplLAorICAgICAgICAgICBUUlVFLCB0eXBlKTsKIH0KLUZYX0JPT0wgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6SXNNZXRhZGF0YUVuY3J5cHRlZCgpCi17Ci0gICAgcmV0dXJuIG1fcEVuY3J5cHREaWN0LT5HZXRCb29sZWFuKEZYX0JTVFJDKCJFbmNyeXB0TWV0YWRhdGEiKSwgVFJVRSk7Cit2b2lkIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6Ok9uQ3JlYXRlKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwSWRBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdXNlcl9wYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCB1c2VyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHR5cGUpIHsKKyAgT25DcmVhdGUocEVuY3J5cHREaWN0LCBwSWRBcnJheSwgdXNlcl9wYXNzLCB1c2VyX3NpemUsIE5VTEwsIDAsIEZBTFNFLCB0eXBlKTsKIH0KLUNQREZfU2VjdXJpdHlIYW5kbGVyKiBGUERGX0NyZWF0ZVN0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKCkKLXsKLSAgICByZXR1cm4gbmV3IENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI7Cit2b2lkIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkFFUzI1Nl9TZXRQYXNzd29yZCgKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKKyAgICBjb25zdCB1aW50OF90KiBwYXNzd29yZCwKKyAgICBGWF9EV09SRCBzaXplLAorICAgIEZYX0JPT0wgYk93bmVyLAorICAgIGNvbnN0IHVpbnQ4X3QqIGtleSkgeworICB1aW50OF90IHNoYVsxMjhdOworICBDUllQVF9TSEExU3RhcnQoc2hhKTsKKyAgQ1JZUFRfU0hBMVVwZGF0ZShzaGEsIGtleSwgMzIpOworICBDUllQVF9TSEExVXBkYXRlKHNoYSwgKHVpbnQ4X3QqKSJoZWxsbyIsIDUpOworICB1aW50OF90IGRpZ2VzdFsyMF07CisgIENSWVBUX1NIQTFGaW5pc2goc2hhLCBkaWdlc3QpOworICBDRlhfQnl0ZVN0cmluZyB1a2V5ID0gcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoIlUiKTsKKyAgdWludDhfdCBkaWdlc3QxWzQ4XTsKKyAgaWYgKG1fUmV2aXNpb24gPj0gNikgeworICAgIFJldmlzaW9uNl9IYXNoKHBhc3N3b3JkLCBzaXplLCBkaWdlc3QsCisgICAgICAgICAgICAgICAgICAgKGJPd25lciA/IChjb25zdCB1aW50OF90Kil1a2V5IDogTlVMTCksIGRpZ2VzdDEpOworICB9IGVsc2UgeworICAgIENSWVBUX1NIQTI1NlN0YXJ0KHNoYSk7CisgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKHNoYSwgcGFzc3dvcmQsIHNpemUpOworICAgIENSWVBUX1NIQTI1NlVwZGF0ZShzaGEsIGRpZ2VzdCwgOCk7CisgICAgaWYgKGJPd25lcikgeworICAgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKHNoYSwgdWtleSwgdWtleS5HZXRMZW5ndGgoKSk7CisgICAgfQorICAgIENSWVBUX1NIQTI1NkZpbmlzaChzaGEsIGRpZ2VzdDEpOworICB9CisgIEZYU1lTX21lbWNweShkaWdlc3QxICsgMzIsIGRpZ2VzdCwgMTYpOworICBwRW5jcnlwdERpY3QtPlNldEF0U3RyaW5nKGJPd25lciA/ICJPIiA6ICJVIiwgQ0ZYX0J5dGVTdHJpbmcoZGlnZXN0MSwgNDgpKTsKKyAgaWYgKG1fUmV2aXNpb24gPj0gNikgeworICAgIFJldmlzaW9uNl9IYXNoKHBhc3N3b3JkLCBzaXplLCBkaWdlc3QgKyA4LAorICAgICAgICAgICAgICAgICAgIChiT3duZXIgPyAoY29uc3QgdWludDhfdCopdWtleSA6IE5VTEwpLCBkaWdlc3QxKTsKKyAgfSBlbHNlIHsKKyAgICBDUllQVF9TSEEyNTZTdGFydChzaGEpOworICAgIENSWVBUX1NIQTI1NlVwZGF0ZShzaGEsIHBhc3N3b3JkLCBzaXplKTsKKyAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCBkaWdlc3QgKyA4LCA4KTsKKyAgICBpZiAoYk93bmVyKSB7CisgICAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCB1a2V5LCB1a2V5LkdldExlbmd0aCgpKTsKKyAgICB9CisgICAgQ1JZUFRfU0hBMjU2RmluaXNoKHNoYSwgZGlnZXN0MSk7CisgIH0KKyAgdWludDhfdCogYWVzID0gRlhfQWxsb2ModWludDhfdCwgMjA0OCk7CisgIENSWVBUX0FFU1NldEtleShhZXMsIDE2LCBkaWdlc3QxLCAzMiwgVFJVRSk7CisgIHVpbnQ4X3QgaXZbMTZdOworICBGWFNZU19tZW1zZXQoaXYsIDAsIDE2KTsKKyAgQ1JZUFRfQUVTU2V0SVYoYWVzLCBpdik7CisgIENSWVBUX0FFU0VuY3J5cHQoYWVzLCBkaWdlc3QxLCBrZXksIDMyKTsKKyAgRlhfRnJlZShhZXMpOworICBwRW5jcnlwdERpY3QtPlNldEF0U3RyaW5nKGJPd25lciA/ICJPRSIgOiAiVUUiLCBDRlhfQnl0ZVN0cmluZyhkaWdlc3QxLCAzMikpOwogfQotdm9pZCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpPbkNyZWF0ZShDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgQ1BERl9BcnJheSogcElkQXJyYXksCi0gICAgICAgIEZYX0xQQ0JZVEUgdXNlcl9wYXNzLCBGWF9EV09SRCB1c2VyX3NpemUsCi0gICAgICAgIEZYX0xQQ0JZVEUgb3duZXJfcGFzcywgRlhfRFdPUkQgb3duZXJfc2l6ZSwgRlhfQk9PTCBiRGVmYXVsdCwgRlhfRFdPUkQgdHlwZSkKLXsKLSAgICBpbnQgY2lwaGVyID0gMCwga2V5X2xlbiA9IDA7Ci0gICAgaWYgKCFMb2FkRGljdChwRW5jcnlwdERpY3QsIHR5cGUsIGNpcGhlciwga2V5X2xlbikpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoYkRlZmF1bHQgJiYgKG93bmVyX3Bhc3MgPT0gTlVMTCB8fCBvd25lcl9zaXplID09IDApKSB7Ci0gICAgICAgIG93bmVyX3Bhc3MgPSB1c2VyX3Bhc3M7Ci0gICAgICAgIG93bmVyX3NpemUgPSB1c2VyX3NpemU7Ci0gICAgfQotICAgIGlmIChtX1JldmlzaW9uID49IDUpIHsKLSAgICAgICAgaW50IHQgPSAoaW50KXRpbWUoTlVMTCk7Ci0gICAgICAgIEZYX0JZVEUgc2hhWzEyOF07Ci0gICAgICAgIENSWVBUX1NIQTI1NlN0YXJ0KHNoYSk7Ci0gICAgICAgIENSWVBUX1NIQTI1NlVwZGF0ZShzaGEsIChGWF9CWVRFKikmdCwgc2l6ZW9mIHQpOwotICAgICAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCBtX0VuY3J5cHRLZXksIDMyKTsKLSAgICAgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKHNoYSwgKEZYX0JZVEUqKSJ0aGVyZSIsIDUpOwotICAgICAgICBDUllQVF9TSEEyNTZGaW5pc2goc2hhLCBtX0VuY3J5cHRLZXkpOwotICAgICAgICBBRVMyNTZfU2V0UGFzc3dvcmQocEVuY3J5cHREaWN0LCB1c2VyX3Bhc3MsIHVzZXJfc2l6ZSwgRkFMU0UsIG1fRW5jcnlwdEtleSk7Ci0gICAgICAgIGlmIChiRGVmYXVsdCkgewotICAgICAgICAgICAgQUVTMjU2X1NldFBhc3N3b3JkKHBFbmNyeXB0RGljdCwgb3duZXJfcGFzcywgb3duZXJfc2l6ZSwgVFJVRSwgbV9FbmNyeXB0S2V5KTsKLSAgICAgICAgICAgIEFFUzI1Nl9TZXRQZXJtcyhwRW5jcnlwdERpY3QsIG1fUGVybWlzc2lvbnMsIHBFbmNyeXB0RGljdC0+R2V0Qm9vbGVhbihGWF9CU1RSQygiRW5jcnlwdE1ldGFkYXRhIiksIFRSVUUpLCBtX0VuY3J5cHRLZXkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGJEZWZhdWx0KSB7Ci0gICAgICAgIEZYX0JZVEUgcGFzc2NvZGVbMzJdOwotICAgICAgICBGWF9EV09SRCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkgKyspIHsKLSAgICAgICAgICAgIHBhc3Njb2RlW2ldID0gaSA8IG93bmVyX3NpemUgPyBvd25lcl9wYXNzW2ldIDogZGVmcGFzc2NvZGVbaSAtIG93bmVyX3NpemVdOwotICAgICAgICB9Ci0gICAgICAgIEZYX0JZVEUgZGlnZXN0WzE2XTsKLSAgICAgICAgQ1JZUFRfTUQ1R2VuZXJhdGUocGFzc2NvZGUsIDMyLCBkaWdlc3QpOwotICAgICAgICBpZiAobV9SZXZpc2lvbiA+PSAzKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDUwOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgQ1JZUFRfTUQ1R2VuZXJhdGUoZGlnZXN0LCAxNiwgZGlnZXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBGWF9CWVRFIGVuY2tleVszMl07Ci0gICAgICAgIEZYU1lTX21lbWNweTMyKGVuY2tleSwgZGlnZXN0LCBrZXlfbGVuKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDMyOyBpICsrKSB7Ci0gICAgICAgICAgICBwYXNzY29kZVtpXSA9IGkgPCB1c2VyX3NpemUgPyB1c2VyX3Bhc3NbaV0gOiBkZWZwYXNzY29kZVtpIC0gdXNlcl9zaXplXTsKLSAgICAgICAgfQotICAgICAgICBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayhwYXNzY29kZSwgMzIsIGVuY2tleSwga2V5X2xlbik7Ci0gICAgICAgIEZYX0JZVEUgdGVtcGtleVszMl07Ci0gICAgICAgIGlmIChtX1JldmlzaW9uID49IDMpIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gMTk7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGtleV9sZW47IGogKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcGtleVtqXSA9IGVuY2tleVtqXSBeIChGWF9CWVRFKWk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENSWVBUX0FyY0ZvdXJDcnlwdEJsb2NrKHBhc3Njb2RlLCAzMiwgdGVtcGtleSwga2V5X2xlbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcEVuY3J5cHREaWN0LT5TZXRBdFN0cmluZyhGWF9CU1RSQygiTyIpLCBDRlhfQnl0ZVN0cmluZyhwYXNzY29kZSwgMzIpKTsKLSAgICB9Ci0gICAgQ2FsY0VuY3J5cHRLZXkobV9wRW5jcnlwdERpY3QsIChGWF9MUEJZVEUpdXNlcl9wYXNzLCB1c2VyX3NpemUsIG1fRW5jcnlwdEtleSwga2V5X2xlbiwgRkFMU0UsIHBJZEFycmF5KTsKLSAgICBpZiAobV9SZXZpc2lvbiA8IDMpIHsKLSAgICAgICAgRlhfQllURSB0ZW1wYnVmWzMyXTsKLSAgICAgICAgRlhTWVNfbWVtY3B5MzIodGVtcGJ1ZiwgZGVmcGFzc2NvZGUsIDMyKTsKLSAgICAgICAgQ1JZUFRfQXJjRm91ckNyeXB0QmxvY2sodGVtcGJ1ZiwgMzIsIG1fRW5jcnlwdEtleSwga2V5X2xlbik7Ci0gICAgICAgIHBFbmNyeXB0RGljdC0+U2V0QXRTdHJpbmcoRlhfQlNUUkMoIlUiKSwgQ0ZYX0J5dGVTdHJpbmcodGVtcGJ1ZiwgMzIpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBGWF9CWVRFIG1kNVsxMDBdOwotICAgICAgICBDUllQVF9NRDVTdGFydChtZDUpOwotICAgICAgICBDUllQVF9NRDVVcGRhdGUobWQ1LCBkZWZwYXNzY29kZSwgMzIpOwotICAgICAgICBpZiAocElkQXJyYXkpIHsKLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGlkID0gcElkQXJyYXktPkdldFN0cmluZygwKTsKLSAgICAgICAgICAgIENSWVBUX01ENVVwZGF0ZShtZDUsIChGWF9MUEJZVEUpaWQuY19zdHIoKSwgaWQuR2V0TGVuZ3RoKCkpOwotICAgICAgICB9Ci0gICAgICAgIEZYX0JZVEUgZGlnZXN0WzMyXTsKLSAgICAgICAgQ1JZUFRfTUQ1RmluaXNoKG1kNSwgZGlnZXN0KTsKLSAgICAgICAgQ1JZUFRfQXJjRm91ckNyeXB0QmxvY2soZGlnZXN0LCAxNiwgbV9FbmNyeXB0S2V5LCBrZXlfbGVuKTsKLSAgICAgICAgRlhfQllURSB0ZW1wa2V5WzMyXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gMTk7IGkgKyspIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwga2V5X2xlbjsgaiArKykgewotICAgICAgICAgICAgICAgIHRlbXBrZXlbal0gPSBtX0VuY3J5cHRLZXlbal0gXiAoRlhfQllURSlpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ1JZUFRfQXJjRm91ckNyeXB0QmxvY2soZGlnZXN0LCAxNiwgdGVtcGtleSwga2V5X2xlbik7Ci0gICAgICAgIH0KLSAgICAgICAgQ1JZUFRfTUQ1R2VuZXJhdGUoZGlnZXN0LCAxNiwgZGlnZXN0ICsgMTYpOwotICAgICAgICBwRW5jcnlwdERpY3QtPlNldEF0U3RyaW5nKEZYX0JTVFJDKCJVIiksIENGWF9CeXRlU3RyaW5nKGRpZ2VzdCwgMzIpKTsKLSAgICB9Cit2b2lkIENQREZfU3RhbmRhcmRTZWN1cml0eUhhbmRsZXI6OkFFUzI1Nl9TZXRQZXJtcygKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKKyAgICBGWF9EV09SRCBwZXJtaXNzaW9ucywKKyAgICBGWF9CT09MIGJFbmNyeXB0TWV0YWRhdGEsCisgICAgY29uc3QgdWludDhfdCoga2V5KSB7CisgIHVpbnQ4X3QgYnVmWzE2XTsKKyAgYnVmWzBdID0gKHVpbnQ4X3QpcGVybWlzc2lvbnM7CisgIGJ1ZlsxXSA9ICh1aW50OF90KShwZXJtaXNzaW9ucyA+PiA4KTsKKyAgYnVmWzJdID0gKHVpbnQ4X3QpKHBlcm1pc3Npb25zID4+IDE2KTsKKyAgYnVmWzNdID0gKHVpbnQ4X3QpKHBlcm1pc3Npb25zID4+IDI0KTsKKyAgYnVmWzRdID0gMHhmZjsKKyAgYnVmWzVdID0gMHhmZjsKKyAgYnVmWzZdID0gMHhmZjsKKyAgYnVmWzddID0gMHhmZjsKKyAgYnVmWzhdID0gYkVuY3J5cHRNZXRhZGF0YSA/ICdUJyA6ICdGJzsKKyAgYnVmWzldID0gJ2EnOworICBidWZbMTBdID0gJ2QnOworICBidWZbMTFdID0gJ2InOworICB1aW50OF90KiBhZXMgPSBGWF9BbGxvYyh1aW50OF90LCAyMDQ4KTsKKyAgQ1JZUFRfQUVTU2V0S2V5KGFlcywgMTYsIGtleSwgMzIsIFRSVUUpOworICB1aW50OF90IGl2WzE2XSwgYnVmMVsxNl07CisgIEZYU1lTX21lbXNldChpdiwgMCwgMTYpOworICBDUllQVF9BRVNTZXRJVihhZXMsIGl2KTsKKyAgQ1JZUFRfQUVTRW5jcnlwdChhZXMsIGJ1ZjEsIGJ1ZiwgMTYpOworICBGWF9GcmVlKGFlcyk7CisgIHBFbmNyeXB0RGljdC0+U2V0QXRTdHJpbmcoIlBlcm1zIiwgQ0ZYX0J5dGVTdHJpbmcoYnVmMSwgMTYpKTsKIH0KLXZvaWQgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6T25DcmVhdGUoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIENQREZfQXJyYXkqIHBJZEFycmF5LAotICAgICAgICBGWF9MUENCWVRFIHVzZXJfcGFzcywgRlhfRFdPUkQgdXNlcl9zaXplLAotICAgICAgICBGWF9MUENCWVRFIG93bmVyX3Bhc3MsIEZYX0RXT1JEIG93bmVyX3NpemUsIEZYX0RXT1JEIHR5cGUpCi17Ci0gICAgT25DcmVhdGUocEVuY3J5cHREaWN0LCBwSWRBcnJheSwgdXNlcl9wYXNzLCB1c2VyX3NpemUsIG93bmVyX3Bhc3MsIG93bmVyX3NpemUsIFRSVUUsIHR5cGUpOwotfQotdm9pZCBDUERGX1N0YW5kYXJkU2VjdXJpdHlIYW5kbGVyOjpPbkNyZWF0ZShDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwgQ1BERl9BcnJheSogcElkQXJyYXksIEZYX0xQQ0JZVEUgdXNlcl9wYXNzLCBGWF9EV09SRCB1c2VyX3NpemUsIEZYX0RXT1JEIHR5cGUpCi17Ci0gICAgT25DcmVhdGUocEVuY3J5cHREaWN0LCBwSWRBcnJheSwgdXNlcl9wYXNzLCB1c2VyX3NpemUsIE5VTEwsIDAsIEZBTFNFLCB0eXBlKTsKLX0KLXZvaWQgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6QUVTMjU2X1NldFBhc3N3b3JkKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBGWF9MUENCWVRFIHBhc3N3b3JkLCBGWF9EV09SRCBzaXplLCBGWF9CT09MIGJPd25lciwgRlhfTFBDQllURSBrZXkpCi17Ci0gICAgRlhfQllURSBzaGFbMTI4XTsKLSAgICBDUllQVF9TSEExU3RhcnQoc2hhKTsKLSAgICBDUllQVF9TSEExVXBkYXRlKHNoYSwga2V5LCAzMik7Ci0gICAgQ1JZUFRfU0hBMVVwZGF0ZShzaGEsIChGWF9CWVRFKikiaGVsbG8iLCA1KTsKLSAgICBGWF9CWVRFIGRpZ2VzdFsyMF07Ci0gICAgQ1JZUFRfU0hBMUZpbmlzaChzaGEsIGRpZ2VzdCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgdWtleSA9IHBFbmNyeXB0RGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJVIikpOwotICAgIEZYX0JZVEUgZGlnZXN0MVs0OF07Ci0gICAgaWYgKG1fUmV2aXNpb24gPj0gNikgewotICAgICAgICBSZXZpc2lvbjZfSGFzaChwYXNzd29yZCwgc2l6ZSwgZGlnZXN0LCAoYk93bmVyID8gKEZYX0xQQ0JZVEUpdWtleSA6IE5VTEwpLCBkaWdlc3QxKTsKLSAgICB9IGVsc2UgewotICAgICAgICBDUllQVF9TSEEyNTZTdGFydChzaGEpOwotICAgICAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCBwYXNzd29yZCwgc2l6ZSk7Ci0gICAgICAgIENSWVBUX1NIQTI1NlVwZGF0ZShzaGEsIGRpZ2VzdCwgOCk7Ci0gICAgICAgIGlmIChiT3duZXIpIHsKLSAgICAgICAgICAgIENSWVBUX1NIQTI1NlVwZGF0ZShzaGEsIHVrZXksIHVrZXkuR2V0TGVuZ3RoKCkpOwotICAgICAgICB9Ci0gICAgICAgIENSWVBUX1NIQTI1NkZpbmlzaChzaGEsIGRpZ2VzdDEpOwotICAgIH0KLSAgICBGWFNZU19tZW1jcHkzMihkaWdlc3QxICsgMzIsIGRpZ2VzdCwgMTYpOwotICAgIHBFbmNyeXB0RGljdC0+U2V0QXRTdHJpbmcoYk93bmVyID8gRlhfQlNUUkMoIk8iKSA6IEZYX0JTVFJDKCJVIiksIENGWF9CeXRlU3RyaW5nKGRpZ2VzdDEsIDQ4KSk7Ci0gICAgaWYgKG1fUmV2aXNpb24gPj0gNikgewotICAgICAgICBSZXZpc2lvbjZfSGFzaChwYXNzd29yZCwgc2l6ZSwgZGlnZXN0ICsgOCwgKGJPd25lciA/IChGWF9MUENCWVRFKXVrZXkgOiBOVUxMKSwgZGlnZXN0MSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQ1JZUFRfU0hBMjU2U3RhcnQoc2hhKTsKLSAgICAgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKHNoYSwgcGFzc3dvcmQsIHNpemUpOwotICAgICAgICBDUllQVF9TSEEyNTZVcGRhdGUoc2hhLCBkaWdlc3QgKyA4LCA4KTsKLSAgICAgICAgaWYgKGJPd25lcikgewotICAgICAgICAgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKHNoYSwgdWtleSwgdWtleS5HZXRMZW5ndGgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgQ1JZUFRfU0hBMjU2RmluaXNoKHNoYSwgZGlnZXN0MSk7Ci0gICAgfQotICAgIEZYX0JZVEUqIGFlcyA9IEZYX0FsbG9jKEZYX0JZVEUsIDIwNDgpOwotICAgIENSWVBUX0FFU1NldEtleShhZXMsIDE2LCBkaWdlc3QxLCAzMiwgVFJVRSk7Ci0gICAgRlhfQllURSBpdlsxNl07Ci0gICAgRlhTWVNfbWVtc2V0MzIoaXYsIDAsIDE2KTsKLSAgICBDUllQVF9BRVNTZXRJVihhZXMsIGl2KTsKLSAgICBDUllQVF9BRVNFbmNyeXB0KGFlcywgZGlnZXN0MSwga2V5LCAzMik7Ci0gICAgRlhfRnJlZShhZXMpOwotICAgIHBFbmNyeXB0RGljdC0+U2V0QXRTdHJpbmcoYk93bmVyID8gRlhfQlNUUkMoIk9FIikgOiBGWF9CU1RSQygiVUUiKSwgQ0ZYX0J5dGVTdHJpbmcoZGlnZXN0MSwgMzIpKTsKLX0KLXZvaWQgQ1BERl9TdGFuZGFyZFNlY3VyaXR5SGFuZGxlcjo6QUVTMjU2X1NldFBlcm1zKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LCBGWF9EV09SRCBwZXJtaXNzaW9ucywKLSAgICAgICAgRlhfQk9PTCBiRW5jcnlwdE1ldGFkYXRhLCBGWF9MUENCWVRFIGtleSkKLXsKLSAgICBGWF9CWVRFIGJ1ZlsxNl07Ci0gICAgYnVmWzBdID0gKEZYX0JZVEUpcGVybWlzc2lvbnM7Ci0gICAgYnVmWzFdID0gKEZYX0JZVEUpKHBlcm1pc3Npb25zID4+IDgpOwotICAgIGJ1ZlsyXSA9IChGWF9CWVRFKShwZXJtaXNzaW9ucyA+PiAxNik7Ci0gICAgYnVmWzNdID0gKEZYX0JZVEUpKHBlcm1pc3Npb25zID4+IDI0KTsKLSAgICBidWZbNF0gPSAweGZmOwotICAgIGJ1Zls1XSA9IDB4ZmY7Ci0gICAgYnVmWzZdID0gMHhmZjsKLSAgICBidWZbN10gPSAweGZmOwotICAgIGJ1Zls4XSA9IGJFbmNyeXB0TWV0YWRhdGEgPyAnVCcgOiAnRic7Ci0gICAgYnVmWzldID0gJ2EnOwotICAgIGJ1ZlsxMF0gPSAnZCc7Ci0gICAgYnVmWzExXSA9ICdiJzsKLSAgICBGWF9CWVRFKiBhZXMgPSBGWF9BbGxvYyhGWF9CWVRFLCAyMDQ4KTsKLSAgICBDUllQVF9BRVNTZXRLZXkoYWVzLCAxNiwga2V5LCAzMiwgVFJVRSk7Ci0gICAgRlhfQllURSBpdlsxNl0sIGJ1ZjFbMTZdOwotICAgIEZYU1lTX21lbXNldDMyKGl2LCAwLCAxNik7Ci0gICAgQ1JZUFRfQUVTU2V0SVYoYWVzLCBpdik7Ci0gICAgQ1JZUFRfQUVTRW5jcnlwdChhZXMsIGJ1ZjEsIGJ1ZiwgMTYpOwotICAgIEZYX0ZyZWUoYWVzKTsKLSAgICBwRW5jcnlwdERpY3QtPlNldEF0U3RyaW5nKEZYX0JTVFJDKCJQZXJtcyIpLCBDRlhfQnl0ZVN0cmluZyhidWYxLCAxNikpOwotfQotdm9pZCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6Q3J5cHRCbG9jayhGWF9CT09MIGJFbmNyeXB0LCBGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSwgRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKLSAgICAgICAgRlhfTFBCWVRFIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKQotewotICAgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9OT05FKSB7Ci0gICAgICAgIEZYU1lTX21lbWNweTMyKGRlc3RfYnVmLCBzcmNfYnVmLCBzcmNfc2l6ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfQllURSByZWFsa2V5WzE2XTsKLSAgICBpbnQgcmVhbGtleWxlbiA9IDE2OwotICAgIGlmIChtX0NpcGhlciAhPSBGWENJUEhFUl9BRVMgfHwgbV9LZXlMZW4gIT0gMzIpIHsKLSAgICAgICAgRlhfQllURSBrZXkxWzMyXTsKLSAgICAgICAgRlhTWVNfbWVtY3B5MzIoa2V5MSwgbV9FbmNyeXB0S2V5LCBtX0tleUxlbik7Ci0gICAgICAgIGtleTFbbV9LZXlMZW4gKyAwXSA9IChGWF9CWVRFKW9iam51bTsKLSAgICAgICAga2V5MVttX0tleUxlbiArIDFdID0gKEZYX0JZVEUpKG9iam51bSA+PiA4KTsKLSAgICAgICAga2V5MVttX0tleUxlbiArIDJdID0gKEZYX0JZVEUpKG9iam51bSA+PiAxNik7Ci0gICAgICAgIGtleTFbbV9LZXlMZW4gKyAzXSA9IChGWF9CWVRFKWdlbm51bTsKLSAgICAgICAga2V5MVttX0tleUxlbiArIDRdID0gKEZYX0JZVEUpKGdlbm51bSA+PiA4KTsKLSAgICAgICAgRlhTWVNfbWVtY3B5MzIoa2V5MSArIG1fS2V5TGVuLCAmb2JqbnVtLCAzKTsKLSAgICAgICAgRlhTWVNfbWVtY3B5MzIoa2V5MSArIG1fS2V5TGVuICsgMywgJmdlbm51bSwgMik7Ci0gICAgICAgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9BRVMpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKGtleTEgKyBtX0tleUxlbiArIDUsICJzQWxUIiwgNCk7Ci0gICAgICAgIH0KLSAgICAgICAgQ1JZUFRfTUQ1R2VuZXJhdGUoa2V5MSwgbV9DaXBoZXIgPT0gRlhDSVBIRVJfQUVTID8gbV9LZXlMZW4gKyA5IDogbV9LZXlMZW4gKyA1LCByZWFsa2V5KTsKLSAgICAgICAgcmVhbGtleWxlbiA9IG1fS2V5TGVuICsgNTsKLSAgICAgICAgaWYgKHJlYWxrZXlsZW4gPiAxNikgewotICAgICAgICAgICAgcmVhbGtleWxlbiA9IDE2OwotICAgICAgICB9Ci0gICAgfQordm9pZCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6Q3J5cHRCbG9jayhGWF9CT09MIGJFbmNyeXB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGdlbm51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKSB7CisgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9OT05FKSB7CisgICAgRlhTWVNfbWVtY3B5KGRlc3RfYnVmLCBzcmNfYnVmLCBzcmNfc2l6ZSk7CisgICAgcmV0dXJuOworICB9CisgIHVpbnQ4X3QgcmVhbGtleVsxNl07CisgIGludCByZWFsa2V5bGVuID0gMTY7CisgIGlmIChtX0NpcGhlciAhPSBGWENJUEhFUl9BRVMgfHwgbV9LZXlMZW4gIT0gMzIpIHsKKyAgICB1aW50OF90IGtleTFbMzJdOworICAgIEZYU1lTX21lbWNweShrZXkxLCBtX0VuY3J5cHRLZXksIG1fS2V5TGVuKTsKKyAgICBrZXkxW21fS2V5TGVuICsgMF0gPSAodWludDhfdClvYmpudW07CisgICAga2V5MVttX0tleUxlbiArIDFdID0gKHVpbnQ4X3QpKG9iam51bSA+PiA4KTsKKyAgICBrZXkxW21fS2V5TGVuICsgMl0gPSAodWludDhfdCkob2JqbnVtID4+IDE2KTsKKyAgICBrZXkxW21fS2V5TGVuICsgM10gPSAodWludDhfdClnZW5udW07CisgICAga2V5MVttX0tleUxlbiArIDRdID0gKHVpbnQ4X3QpKGdlbm51bSA+PiA4KTsKKyAgICBGWFNZU19tZW1jcHkoa2V5MSArIG1fS2V5TGVuLCAmb2JqbnVtLCAzKTsKKyAgICBGWFNZU19tZW1jcHkoa2V5MSArIG1fS2V5TGVuICsgMywgJmdlbm51bSwgMik7CiAgICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUykgewotICAgICAgICBDUllQVF9BRVNTZXRLZXkobV9wQUVTQ29udGV4dCwgMTYsIG1fS2V5TGVuID09IDMyID8gbV9FbmNyeXB0S2V5IDogcmVhbGtleSwgbV9LZXlMZW4sIGJFbmNyeXB0KTsKLSAgICAgICAgaWYgKGJFbmNyeXB0KSB7Ci0gICAgICAgICAgICBGWF9CWVRFIGl2WzE2XTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBpdltpXSA9IChGWF9CWVRFKXJhbmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENSWVBUX0FFU1NldElWKG1fcEFFU0NvbnRleHQsIGl2KTsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKGRlc3RfYnVmLCBpdiwgMTYpOwotICAgICAgICAgICAgaW50IG5ibG9ja3MgPSBzcmNfc2l6ZSAvIDE2OwotICAgICAgICAgICAgQ1JZUFRfQUVTRW5jcnlwdChtX3BBRVNDb250ZXh0LCBkZXN0X2J1ZiArIDE2LCBzcmNfYnVmLCBuYmxvY2tzICogMTYpOwotICAgICAgICAgICAgRlhfQllURSBwYWRkaW5nWzE2XTsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKHBhZGRpbmcsIHNyY19idWYgKyBuYmxvY2tzICogMTYsIHNyY19zaXplICUgMTYpOwotICAgICAgICAgICAgRlhTWVNfbWVtc2V0OChwYWRkaW5nICsgc3JjX3NpemUgJSAxNiwgMTYgLSBzcmNfc2l6ZSAlIDE2LCAxNiAtIHNyY19zaXplICUgMTYpOwotICAgICAgICAgICAgQ1JZUFRfQUVTRW5jcnlwdChtX3BBRVNDb250ZXh0LCBkZXN0X2J1ZiArIG5ibG9ja3MgKiAxNiArIDE2LCBwYWRkaW5nLCAxNik7Ci0gICAgICAgICAgICBkZXN0X3NpemUgPSAzMiArIG5ibG9ja3MgKiAxNjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENSWVBUX0FFU1NldElWKG1fcEFFU0NvbnRleHQsIHNyY19idWYpOwotICAgICAgICAgICAgQ1JZUFRfQUVTRGVjcnlwdChtX3BBRVNDb250ZXh0LCBkZXN0X2J1Ziwgc3JjX2J1ZiArIDE2LCBzcmNfc2l6ZSAtIDE2KTsKLSAgICAgICAgICAgIGRlc3Rfc2l6ZSA9IHNyY19zaXplIC0gMTY7Ci0gICAgICAgICAgICBkZXN0X3NpemUgLT0gZGVzdF9idWZbZGVzdF9zaXplIC0gMV07Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBU1NFUlQoZGVzdF9zaXplID09IHNyY19zaXplKTsKLSAgICAgICAgaWYgKGRlc3RfYnVmICE9IHNyY19idWYpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKGRlc3RfYnVmLCBzcmNfYnVmLCBzcmNfc2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgQ1JZUFRfQXJjRm91ckNyeXB0QmxvY2soZGVzdF9idWYsIGRlc3Rfc2l6ZSwgcmVhbGtleSwgcmVhbGtleWxlbik7CisgICAgICBGWFNZU19tZW1jcHkoa2V5MSArIG1fS2V5TGVuICsgNSwgInNBbFQiLCA0KTsKICAgICB9CisgICAgQ1JZUFRfTUQ1R2VuZXJhdGUoCisgICAgICAgIGtleTEsIG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUyA/IG1fS2V5TGVuICsgOSA6IG1fS2V5TGVuICsgNSwgcmVhbGtleSk7CisgICAgcmVhbGtleWxlbiA9IG1fS2V5TGVuICsgNTsKKyAgICBpZiAocmVhbGtleWxlbiA+IDE2KSB7CisgICAgICByZWFsa2V5bGVuID0gMTY7CisgICAgfQorICB9CisgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9BRVMpIHsKKyAgICBDUllQVF9BRVNTZXRLZXkobV9wQUVTQ29udGV4dCwgMTYsIG1fS2V5TGVuID09IDMyID8gbV9FbmNyeXB0S2V5IDogcmVhbGtleSwKKyAgICAgICAgICAgICAgICAgICAgbV9LZXlMZW4sIGJFbmNyeXB0KTsKKyAgICBpZiAoYkVuY3J5cHQpIHsKKyAgICAgIHVpbnQ4X3QgaXZbMTZdOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIGl2W2ldID0gKHVpbnQ4X3QpcmFuZCgpOworICAgICAgfQorICAgICAgQ1JZUFRfQUVTU2V0SVYobV9wQUVTQ29udGV4dCwgaXYpOworICAgICAgRlhTWVNfbWVtY3B5KGRlc3RfYnVmLCBpdiwgMTYpOworICAgICAgaW50IG5ibG9ja3MgPSBzcmNfc2l6ZSAvIDE2OworICAgICAgQ1JZUFRfQUVTRW5jcnlwdChtX3BBRVNDb250ZXh0LCBkZXN0X2J1ZiArIDE2LCBzcmNfYnVmLCBuYmxvY2tzICogMTYpOworICAgICAgdWludDhfdCBwYWRkaW5nWzE2XTsKKyAgICAgIEZYU1lTX21lbWNweShwYWRkaW5nLCBzcmNfYnVmICsgbmJsb2NrcyAqIDE2LCBzcmNfc2l6ZSAlIDE2KTsKKyAgICAgIEZYU1lTX21lbXNldChwYWRkaW5nICsgc3JjX3NpemUgJSAxNiwgMTYgLSBzcmNfc2l6ZSAlIDE2LAorICAgICAgICAgICAgICAgICAgIDE2IC0gc3JjX3NpemUgJSAxNik7CisgICAgICBDUllQVF9BRVNFbmNyeXB0KG1fcEFFU0NvbnRleHQsIGRlc3RfYnVmICsgbmJsb2NrcyAqIDE2ICsgMTYsIHBhZGRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIDE2KTsKKyAgICAgIGRlc3Rfc2l6ZSA9IDMyICsgbmJsb2NrcyAqIDE2OworICAgIH0gZWxzZSB7CisgICAgICBDUllQVF9BRVNTZXRJVihtX3BBRVNDb250ZXh0LCBzcmNfYnVmKTsKKyAgICAgIENSWVBUX0FFU0RlY3J5cHQobV9wQUVTQ29udGV4dCwgZGVzdF9idWYsIHNyY19idWYgKyAxNiwgc3JjX3NpemUgLSAxNik7CisgICAgICBkZXN0X3NpemUgPSBzcmNfc2l6ZSAtIDE2OworICAgICAgZGVzdF9zaXplIC09IGRlc3RfYnVmW2Rlc3Rfc2l6ZSAtIDFdOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBBU1NFUlQoZGVzdF9zaXplID09IHNyY19zaXplKTsKKyAgICBpZiAoZGVzdF9idWYgIT0gc3JjX2J1ZikgeworICAgICAgRlhTWVNfbWVtY3B5KGRlc3RfYnVmLCBzcmNfYnVmLCBzcmNfc2l6ZSk7CisgICAgfQorICAgIENSWVBUX0FyY0ZvdXJDcnlwdEJsb2NrKGRlc3RfYnVmLCBkZXN0X3NpemUsIHJlYWxrZXksIHJlYWxrZXlsZW4pOworICB9CiB9CiB0eXBlZGVmIHN0cnVjdCBfQUVTQ3J5cHRDb250ZXh0IHsKLSAgICBGWF9CWVRFCQltX0NvbnRleHRbMjA0OF07Ci0gICAgRlhfQk9PTAkJbV9iSVY7Ci0gICAgRlhfQllURQkJbV9CbG9ja1sxNl07Ci0gICAgRlhfRFdPUkQJbV9CbG9ja09mZnNldDsKKyAgdWludDhfdCBtX0NvbnRleHRbMjA0OF07CisgIEZYX0JPT0wgbV9iSVY7CisgIHVpbnQ4X3QgbV9CbG9ja1sxNl07CisgIEZYX0RXT1JEIG1fQmxvY2tPZmZzZXQ7CiB9IEFFU0NyeXB0Q29udGV4dDsKLUZYX0xQVk9JRCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6Q3J5cHRTdGFydChGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSwgRlhfQk9PTCBiRW5jcnlwdCkKLXsKLSAgICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfTk9ORSkgewotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUyAmJiBtX0tleUxlbiA9PSAzMikgewotICAgICAgICBBRVNDcnlwdENvbnRleHQqIHBDb250ZXh0ID0gRlhfQWxsb2MoQUVTQ3J5cHRDb250ZXh0LCAxKTsKLSAgICAgICAgcENvbnRleHQtPm1fYklWID0gVFJVRTsKLSAgICAgICAgcENvbnRleHQtPm1fQmxvY2tPZmZzZXQgPSAwOwotICAgICAgICBDUllQVF9BRVNTZXRLZXkocENvbnRleHQtPm1fQ29udGV4dCwgMTYsIG1fRW5jcnlwdEtleSwgMzIsIGJFbmNyeXB0KTsKLSAgICAgICAgaWYgKGJFbmNyeXB0KSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgcENvbnRleHQtPm1fQmxvY2tbaV0gPSAoRlhfQllURSlyYW5kKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDUllQVF9BRVNTZXRJVihwQ29udGV4dC0+bV9Db250ZXh0LCBwQ29udGV4dC0+bV9CbG9jayk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBDb250ZXh0OwotICAgIH0KLSAgICBGWF9CWVRFIGtleTFbNDhdOwotICAgIEZYU1lTX21lbWNweTMyKGtleTEsIG1fRW5jcnlwdEtleSwgbV9LZXlMZW4pOwotICAgIEZYU1lTX21lbWNweTMyKGtleTEgKyBtX0tleUxlbiwgJm9iam51bSwgMyk7Ci0gICAgRlhTWVNfbWVtY3B5MzIoa2V5MSArIG1fS2V5TGVuICsgMywgJmdlbm51bSwgMik7Ci0gICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUykgewotICAgICAgICBGWFNZU19tZW1jcHkzMihrZXkxICsgbV9LZXlMZW4gKyA1LCAic0FsVCIsIDQpOwotICAgIH0KLSAgICBGWF9CWVRFIHJlYWxrZXlbMTZdOwotICAgIENSWVBUX01ENUdlbmVyYXRlKGtleTEsIG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUyA/IG1fS2V5TGVuICsgOSA6IG1fS2V5TGVuICsgNSwgcmVhbGtleSk7Ci0gICAgaW50IHJlYWxrZXlsZW4gPSBtX0tleUxlbiArIDU7Ci0gICAgaWYgKHJlYWxrZXlsZW4gPiAxNikgewotICAgICAgICByZWFsa2V5bGVuID0gMTY7Ci0gICAgfQotICAgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9BRVMpIHsKLSAgICAgICAgQUVTQ3J5cHRDb250ZXh0KiBwQ29udGV4dCA9IEZYX0FsbG9jKEFFU0NyeXB0Q29udGV4dCwgMSk7Ci0gICAgICAgIHBDb250ZXh0LT5tX2JJViA9IFRSVUU7Ci0gICAgICAgIHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0ID0gMDsKLSAgICAgICAgQ1JZUFRfQUVTU2V0S2V5KHBDb250ZXh0LT5tX0NvbnRleHQsIDE2LCByZWFsa2V5LCAxNiwgYkVuY3J5cHQpOwotICAgICAgICBpZiAoYkVuY3J5cHQpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBwQ29udGV4dC0+bV9CbG9ja1tpXSA9IChGWF9CWVRFKXJhbmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENSWVBUX0FFU1NldElWKHBDb250ZXh0LT5tX0NvbnRleHQsIHBDb250ZXh0LT5tX0Jsb2NrKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcENvbnRleHQ7Ci0gICAgfQotICAgIHZvaWQqIHBDb250ZXh0ID0gRlhfQWxsb2MoRlhfQllURSwgMTA0MCk7Ci0gICAgQ1JZUFRfQXJjRm91clNldHVwKHBDb250ZXh0LCByZWFsa2V5LCByZWFsa2V5bGVuKTsKLSAgICByZXR1cm4gcENvbnRleHQ7Ci19Ci1GWF9CT09MIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjpDcnlwdFN0cmVhbShGWF9MUFZPSUQgY29udGV4dCwgRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYsIEZYX0JPT0wgYkVuY3J5cHQpCi17Ci0gICAgaWYgKCFjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX05PTkUpIHsKLSAgICAgICAgZGVzdF9idWYuQXBwZW5kQmxvY2soc3JjX2J1Ziwgc3JjX3NpemUpOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX1JDNCkgewotICAgICAgICBpbnQgb2xkX3NpemUgPSBkZXN0X2J1Zi5HZXRTaXplKCk7Ci0gICAgICAgIGRlc3RfYnVmLkFwcGVuZEJsb2NrKHNyY19idWYsIHNyY19zaXplKTsKLSAgICAgICAgQ1JZUFRfQXJjRm91ckNyeXB0KGNvbnRleHQsIGRlc3RfYnVmLkdldEJ1ZmZlcigpICsgb2xkX3NpemUsIHNyY19zaXplKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIEFFU0NyeXB0Q29udGV4dCogcENvbnRleHQgPSAoQUVTQ3J5cHRDb250ZXh0Kiljb250ZXh0OwotICAgIGlmIChwQ29udGV4dC0+bV9iSVYgJiYgYkVuY3J5cHQpIHsKLSAgICAgICAgZGVzdF9idWYuQXBwZW5kQmxvY2socENvbnRleHQtPm1fQmxvY2ssIDE2KTsKLSAgICAgICAgcENvbnRleHQtPm1fYklWID0gRkFMU0U7Ci0gICAgfQotICAgIEZYX0RXT1JEIHNyY19vZmYgPSAwOwotICAgIEZYX0RXT1JEIHNyY19sZWZ0ID0gc3JjX3NpemU7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgRlhfRFdPUkQgY29weV9zaXplID0gMTYgLSBwQ29udGV4dC0+bV9CbG9ja09mZnNldDsKLSAgICAgICAgaWYgKGNvcHlfc2l6ZSA+IHNyY19sZWZ0KSB7Ci0gICAgICAgICAgICBjb3B5X3NpemUgPSBzcmNfbGVmdDsKLSAgICAgICAgfQotICAgICAgICBGWFNZU19tZW1jcHkzMihwQ29udGV4dC0+bV9CbG9jayArIHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0LCBzcmNfYnVmICsgc3JjX29mZiwgY29weV9zaXplKTsKLSAgICAgICAgc3JjX29mZiArPSBjb3B5X3NpemU7Ci0gICAgICAgIHNyY19sZWZ0IC09IGNvcHlfc2l6ZTsKLSAgICAgICAgcENvbnRleHQtPm1fQmxvY2tPZmZzZXQgKz0gY29weV9zaXplOwotICAgICAgICBpZiAocENvbnRleHQtPm1fQmxvY2tPZmZzZXQgPT0gMTYpIHsKLSAgICAgICAgICAgIGlmICghYkVuY3J5cHQgJiYgcENvbnRleHQtPm1fYklWKSB7Ci0gICAgICAgICAgICAgICAgQ1JZUFRfQUVTU2V0SVYocENvbnRleHQtPm1fQ29udGV4dCwgcENvbnRleHQtPm1fQmxvY2spOwotICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tX2JJViA9IEZBTFNFOwotICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjX29mZiA8IHNyY19zaXplKSB7Ci0gICAgICAgICAgICAgICAgRlhfQllURSBibG9ja19idWZbMTZdOwotICAgICAgICAgICAgICAgIGlmIChiRW5jcnlwdCkgewotICAgICAgICAgICAgICAgICAgICBDUllQVF9BRVNFbmNyeXB0KHBDb250ZXh0LT5tX0NvbnRleHQsIGJsb2NrX2J1ZiwgcENvbnRleHQtPm1fQmxvY2ssIDE2KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBDUllQVF9BRVNEZWNyeXB0KHBDb250ZXh0LT5tX0NvbnRleHQsIGJsb2NrX2J1ZiwgcENvbnRleHQtPm1fQmxvY2ssIDE2KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVzdF9idWYuQXBwZW5kQmxvY2soYmxvY2tfYnVmLCAxNik7Ci0gICAgICAgICAgICAgICAgcENvbnRleHQtPm1fQmxvY2tPZmZzZXQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghc3JjX2xlZnQpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6Q3J5cHRGaW5pc2goRlhfTFBWT0lEIGNvbnRleHQsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmLCBGWF9CT09MIGJFbmNyeXB0KQotewotICAgIGlmICghY29udGV4dCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9OT05FKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfUkM0KSB7Ci0gICAgICAgIEZYX0ZyZWUoY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBBRVNDcnlwdENvbnRleHQqIHBDb250ZXh0ID0gKEFFU0NyeXB0Q29udGV4dCopY29udGV4dDsKK3ZvaWQqIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjpDcnlwdFN0YXJ0KEZYX0RXT1JEIG9iam51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGdlbm51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkVuY3J5cHQpIHsKKyAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX05PTkUpIHsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfQUVTICYmIG1fS2V5TGVuID09IDMyKSB7CisgICAgQUVTQ3J5cHRDb250ZXh0KiBwQ29udGV4dCA9IEZYX0FsbG9jKEFFU0NyeXB0Q29udGV4dCwgMSk7CisgICAgcENvbnRleHQtPm1fYklWID0gVFJVRTsKKyAgICBwQ29udGV4dC0+bV9CbG9ja09mZnNldCA9IDA7CisgICAgQ1JZUFRfQUVTU2V0S2V5KHBDb250ZXh0LT5tX0NvbnRleHQsIDE2LCBtX0VuY3J5cHRLZXksIDMyLCBiRW5jcnlwdCk7CiAgICAgaWYgKGJFbmNyeXB0KSB7Ci0gICAgICAgIEZYX0JZVEUgYmxvY2tfYnVmWzE2XTsKLSAgICAgICAgaWYgKHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0ID09IDE2KSB7Ci0gICAgICAgICAgICBDUllQVF9BRVNFbmNyeXB0KHBDb250ZXh0LT5tX0NvbnRleHQsIGJsb2NrX2J1ZiwgcENvbnRleHQtPm1fQmxvY2ssIDE2KTsKLSAgICAgICAgICAgIGRlc3RfYnVmLkFwcGVuZEJsb2NrKGJsb2NrX2J1ZiwgMTYpOwotICAgICAgICAgICAgcENvbnRleHQtPm1fQmxvY2tPZmZzZXQgPSAwOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIHBDb250ZXh0LT5tX0Jsb2NrW2ldID0gKHVpbnQ4X3QpcmFuZCgpOworICAgICAgfQorICAgICAgQ1JZUFRfQUVTU2V0SVYocENvbnRleHQtPm1fQ29udGV4dCwgcENvbnRleHQtPm1fQmxvY2spOworICAgIH0KKyAgICByZXR1cm4gcENvbnRleHQ7CisgIH0KKyAgdWludDhfdCBrZXkxWzQ4XTsKKyAgRlhTWVNfbWVtY3B5KGtleTEsIG1fRW5jcnlwdEtleSwgbV9LZXlMZW4pOworICBGWFNZU19tZW1jcHkoa2V5MSArIG1fS2V5TGVuLCAmb2JqbnVtLCAzKTsKKyAgRlhTWVNfbWVtY3B5KGtleTEgKyBtX0tleUxlbiArIDMsICZnZW5udW0sIDIpOworICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfQUVTKSB7CisgICAgRlhTWVNfbWVtY3B5KGtleTEgKyBtX0tleUxlbiArIDUsICJzQWxUIiwgNCk7CisgIH0KKyAgdWludDhfdCByZWFsa2V5WzE2XTsKKyAgQ1JZUFRfTUQ1R2VuZXJhdGUoCisgICAgICBrZXkxLCBtX0NpcGhlciA9PSBGWENJUEhFUl9BRVMgPyBtX0tleUxlbiArIDkgOiBtX0tleUxlbiArIDUsIHJlYWxrZXkpOworICBpbnQgcmVhbGtleWxlbiA9IG1fS2V5TGVuICsgNTsKKyAgaWYgKHJlYWxrZXlsZW4gPiAxNikgeworICAgIHJlYWxrZXlsZW4gPSAxNjsKKyAgfQorICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfQUVTKSB7CisgICAgQUVTQ3J5cHRDb250ZXh0KiBwQ29udGV4dCA9IEZYX0FsbG9jKEFFU0NyeXB0Q29udGV4dCwgMSk7CisgICAgcENvbnRleHQtPm1fYklWID0gVFJVRTsKKyAgICBwQ29udGV4dC0+bV9CbG9ja09mZnNldCA9IDA7CisgICAgQ1JZUFRfQUVTU2V0S2V5KHBDb250ZXh0LT5tX0NvbnRleHQsIDE2LCByZWFsa2V5LCAxNiwgYkVuY3J5cHQpOworICAgIGlmIChiRW5jcnlwdCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIHBDb250ZXh0LT5tX0Jsb2NrW2ldID0gKHVpbnQ4X3QpcmFuZCgpOworICAgICAgfQorICAgICAgQ1JZUFRfQUVTU2V0SVYocENvbnRleHQtPm1fQ29udGV4dCwgcENvbnRleHQtPm1fQmxvY2spOworICAgIH0KKyAgICByZXR1cm4gcENvbnRleHQ7CisgIH0KKyAgdm9pZCogcENvbnRleHQgPSBGWF9BbGxvYyh1aW50OF90LCAxMDQwKTsKKyAgQ1JZUFRfQXJjRm91clNldHVwKHBDb250ZXh0LCByZWFsa2V5LCByZWFsa2V5bGVuKTsKKyAgcmV0dXJuIHBDb250ZXh0OworfQorRlhfQk9PTCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6Q3J5cHRTdHJlYW0odm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRW5jcnlwdCkgeworICBpZiAoIWNvbnRleHQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX05PTkUpIHsKKyAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jayhzcmNfYnVmLCBzcmNfc2l6ZSk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX1JDNCkgeworICAgIGludCBvbGRfc2l6ZSA9IGRlc3RfYnVmLkdldFNpemUoKTsKKyAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jayhzcmNfYnVmLCBzcmNfc2l6ZSk7CisgICAgQ1JZUFRfQXJjRm91ckNyeXB0KGNvbnRleHQsIGRlc3RfYnVmLkdldEJ1ZmZlcigpICsgb2xkX3NpemUsIHNyY19zaXplKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBBRVNDcnlwdENvbnRleHQqIHBDb250ZXh0ID0gKEFFU0NyeXB0Q29udGV4dCopY29udGV4dDsKKyAgaWYgKHBDb250ZXh0LT5tX2JJViAmJiBiRW5jcnlwdCkgeworICAgIGRlc3RfYnVmLkFwcGVuZEJsb2NrKHBDb250ZXh0LT5tX0Jsb2NrLCAxNik7CisgICAgcENvbnRleHQtPm1fYklWID0gRkFMU0U7CisgIH0KKyAgRlhfRFdPUkQgc3JjX29mZiA9IDA7CisgIEZYX0RXT1JEIHNyY19sZWZ0ID0gc3JjX3NpemU7CisgIHdoaWxlICgxKSB7CisgICAgRlhfRFdPUkQgY29weV9zaXplID0gMTYgLSBwQ29udGV4dC0+bV9CbG9ja09mZnNldDsKKyAgICBpZiAoY29weV9zaXplID4gc3JjX2xlZnQpIHsKKyAgICAgIGNvcHlfc2l6ZSA9IHNyY19sZWZ0OworICAgIH0KKyAgICBGWFNZU19tZW1jcHkocENvbnRleHQtPm1fQmxvY2sgKyBwQ29udGV4dC0+bV9CbG9ja09mZnNldCwgc3JjX2J1ZiArIHNyY19vZmYsCisgICAgICAgICAgICAgICAgIGNvcHlfc2l6ZSk7CisgICAgc3JjX29mZiArPSBjb3B5X3NpemU7CisgICAgc3JjX2xlZnQgLT0gY29weV9zaXplOworICAgIHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0ICs9IGNvcHlfc2l6ZTsKKyAgICBpZiAocENvbnRleHQtPm1fQmxvY2tPZmZzZXQgPT0gMTYpIHsKKyAgICAgIGlmICghYkVuY3J5cHQgJiYgcENvbnRleHQtPm1fYklWKSB7CisgICAgICAgIENSWVBUX0FFU1NldElWKHBDb250ZXh0LT5tX0NvbnRleHQsIHBDb250ZXh0LT5tX0Jsb2NrKTsKKyAgICAgICAgcENvbnRleHQtPm1fYklWID0gRkFMU0U7CisgICAgICAgIHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0ID0gMDsKKyAgICAgIH0gZWxzZSBpZiAoc3JjX29mZiA8IHNyY19zaXplKSB7CisgICAgICAgIHVpbnQ4X3QgYmxvY2tfYnVmWzE2XTsKKyAgICAgICAgaWYgKGJFbmNyeXB0KSB7CisgICAgICAgICAgQ1JZUFRfQUVTRW5jcnlwdChwQ29udGV4dC0+bV9Db250ZXh0LCBibG9ja19idWYsIHBDb250ZXh0LT5tX0Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIENSWVBUX0FFU0RlY3J5cHQocENvbnRleHQtPm1fQ29udGV4dCwgYmxvY2tfYnVmLCBwQ29udGV4dC0+bV9CbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2KTsKICAgICAgICAgfQotICAgICAgICBGWFNZU19tZW1zZXQ4KHBDb250ZXh0LT5tX0Jsb2NrICsgcENvbnRleHQtPm1fQmxvY2tPZmZzZXQsIChGWF9CWVRFKSgxNiAtIHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0KSwgMTYgLSBwQ29udGV4dC0+bV9CbG9ja09mZnNldCk7Ci0gICAgICAgIENSWVBUX0FFU0VuY3J5cHQocENvbnRleHQtPm1fQ29udGV4dCwgYmxvY2tfYnVmLCBwQ29udGV4dC0+bV9CbG9jaywgMTYpOwogICAgICAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jayhibG9ja19idWYsIDE2KTsKLSAgICB9IGVsc2UgaWYgKHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0ID09IDE2KSB7Ci0gICAgICAgIEZYX0JZVEUgYmxvY2tfYnVmWzE2XTsKLSAgICAgICAgQ1JZUFRfQUVTRGVjcnlwdChwQ29udGV4dC0+bV9Db250ZXh0LCBibG9ja19idWYsIHBDb250ZXh0LT5tX0Jsb2NrLCAxNik7Ci0gICAgICAgIGlmIChibG9ja19idWZbMTVdIDw9IDE2KSB7Ci0gICAgICAgICAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jayhibG9ja19idWYsIDE2IC0gYmxvY2tfYnVmWzE1XSk7Ci0gICAgICAgIH0KKyAgICAgICAgcENvbnRleHQtPm1fQmxvY2tPZmZzZXQgPSAwOworICAgICAgfQogICAgIH0KLSAgICBGWF9GcmVlKHBDb250ZXh0KTsKKyAgICBpZiAoIXNyY19sZWZ0KSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjpDcnlwdEZpbmlzaCh2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJFbmNyeXB0KSB7CisgIGlmICghY29udGV4dCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfTk9ORSkgewogICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9SQzQpIHsKKyAgICBGWF9GcmVlKGNvbnRleHQpOworICAgIHJldHVybiBUUlVFOworICB9CisgIEFFU0NyeXB0Q29udGV4dCogcENvbnRleHQgPSAoQUVTQ3J5cHRDb250ZXh0Kiljb250ZXh0OworICBpZiAoYkVuY3J5cHQpIHsKKyAgICB1aW50OF90IGJsb2NrX2J1ZlsxNl07CisgICAgaWYgKHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0ID09IDE2KSB7CisgICAgICBDUllQVF9BRVNFbmNyeXB0KHBDb250ZXh0LT5tX0NvbnRleHQsIGJsb2NrX2J1ZiwgcENvbnRleHQtPm1fQmxvY2ssIDE2KTsKKyAgICAgIGRlc3RfYnVmLkFwcGVuZEJsb2NrKGJsb2NrX2J1ZiwgMTYpOworICAgICAgcENvbnRleHQtPm1fQmxvY2tPZmZzZXQgPSAwOworICAgIH0KKyAgICBGWFNZU19tZW1zZXQocENvbnRleHQtPm1fQmxvY2sgKyBwQ29udGV4dC0+bV9CbG9ja09mZnNldCwKKyAgICAgICAgICAgICAgICAgKHVpbnQ4X3QpKDE2IC0gcENvbnRleHQtPm1fQmxvY2tPZmZzZXQpLAorICAgICAgICAgICAgICAgICAxNiAtIHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0KTsKKyAgICBDUllQVF9BRVNFbmNyeXB0KHBDb250ZXh0LT5tX0NvbnRleHQsIGJsb2NrX2J1ZiwgcENvbnRleHQtPm1fQmxvY2ssIDE2KTsKKyAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jayhibG9ja19idWYsIDE2KTsKKyAgfSBlbHNlIGlmIChwQ29udGV4dC0+bV9CbG9ja09mZnNldCA9PSAxNikgeworICAgIHVpbnQ4X3QgYmxvY2tfYnVmWzE2XTsKKyAgICBDUllQVF9BRVNEZWNyeXB0KHBDb250ZXh0LT5tX0NvbnRleHQsIGJsb2NrX2J1ZiwgcENvbnRleHQtPm1fQmxvY2ssIDE2KTsKKyAgICBpZiAoYmxvY2tfYnVmWzE1XSA8PSAxNikgeworICAgICAgZGVzdF9idWYuQXBwZW5kQmxvY2soYmxvY2tfYnVmLCAxNiAtIGJsb2NrX2J1ZlsxNV0pOworICAgIH0KKyAgfQorICBGWF9GcmVlKHBDb250ZXh0KTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9MUFZPSUQgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkRlY3J5cHRTdGFydChGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSkKLXsKLSAgICByZXR1cm4gQ3J5cHRTdGFydChvYmpudW0sIGdlbm51bSwgRkFMU0UpOwordm9pZCogQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkRlY3J5cHRTdGFydChGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGdlbm51bSkgeworICByZXR1cm4gQ3J5cHRTdGFydChvYmpudW0sIGdlbm51bSwgRkFMU0UpOwogfQotRlhfRFdPUkQgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkRlY3J5cHRHZXRTaXplKEZYX0RXT1JEIHNyY19zaXplKQotewotICAgIHJldHVybiBtX0NpcGhlciA9PSBGWENJUEhFUl9BRVMgPyBzcmNfc2l6ZSAtIDE2IDogc3JjX3NpemU7CitGWF9EV09SRCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6RGVjcnlwdEdldFNpemUoRlhfRFdPUkQgc3JjX3NpemUpIHsKKyAgcmV0dXJuIG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUyA/IHNyY19zaXplIC0gMTYgOiBzcmNfc2l6ZTsKIH0KLUZYX0JPT0wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkluaXQoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsIENQREZfU2VjdXJpdHlIYW5kbGVyKiBwU2VjdXJpdHlIYW5kbGVyKQotewotICAgIEZYX0xQQ0JZVEUga2V5OwotICAgIGlmICghcFNlY3VyaXR5SGFuZGxlci0+R2V0Q3J5cHRJbmZvKG1fQ2lwaGVyLCBrZXksIG1fS2V5TGVuKSkgeworRlhfQk9PTCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6SW5pdCgKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKKyAgICBDUERGX1NlY3VyaXR5SGFuZGxlciogcFNlY3VyaXR5SGFuZGxlcikgeworICBjb25zdCB1aW50OF90KiBrZXk7CisgIGlmICghcFNlY3VyaXR5SGFuZGxlci0+R2V0Q3J5cHRJbmZvKG1fQ2lwaGVyLCBrZXksIG1fS2V5TGVuKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAobV9LZXlMZW4gPiAzMiB8fCBtX0tleUxlbiA8IDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fQ2lwaGVyICE9IEZYQ0lQSEVSX05PTkUpIHsKKyAgICBGWFNZU19tZW1jcHkobV9FbmNyeXB0S2V5LCBrZXksIG1fS2V5TGVuKTsKKyAgfQorICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfQUVTKSB7CisgICAgbV9wQUVTQ29udGV4dCA9IEZYX0FsbG9jKHVpbnQ4X3QsIDIwNDgpOworICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6SW5pdChpbnQgY2lwaGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrZXlsZW4pIHsKKyAgaWYgKGNpcGhlciA9PSBGWENJUEhFUl9BRVMpIHsKKyAgICBzd2l0Y2ggKGtleWxlbikgeworICAgICAgY2FzZSAxNjoKKyAgICAgIGNhc2UgMjQ6CisgICAgICBjYXNlIDMyOgorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgaWYgKG1fS2V5TGVuID4gMzIgfHwgbV9LZXlMZW4gPCAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgfSBlbHNlIGlmIChjaXBoZXIgPT0gRlhDSVBIRVJfQUVTMikgeworICAgIGlmIChrZXlsZW4gIT0gMzIpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgaWYgKG1fQ2lwaGVyICE9IEZYQ0lQSEVSX05PTkUpIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5MzIobV9FbmNyeXB0S2V5LCBrZXksIG1fS2V5TGVuKTsKKyAgfSBlbHNlIGlmIChjaXBoZXIgPT0gRlhDSVBIRVJfUkM0KSB7CisgICAgaWYgKGtleWxlbiA8IDUgfHwga2V5bGVuID4gMTYpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUykgewotICAgICAgICBtX3BBRVNDb250ZXh0ID0gRlhfQWxsb2MoRlhfQllURSwgMjA0OCk7CisgIH0gZWxzZSB7CisgICAgaWYgKGtleWxlbiA+IDMyKSB7CisgICAgICBrZXlsZW4gPSAzMjsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgbV9DaXBoZXIgPSBjaXBoZXI7CisgIG1fS2V5TGVuID0ga2V5bGVuOworICBGWFNZU19tZW1jcHkobV9FbmNyeXB0S2V5LCBrZXksIGtleWxlbik7CisgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9BRVMpIHsKKyAgICBtX3BBRVNDb250ZXh0ID0gRlhfQWxsb2ModWludDhfdCwgMjA0OCk7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjpJbml0KGludCBjaXBoZXIsIEZYX0xQQ0JZVEUga2V5LCBpbnQga2V5bGVuKQotewotICAgIGlmIChjaXBoZXIgPT0gRlhDSVBIRVJfQUVTKSB7Ci0gICAgICAgIHN3aXRjaChrZXlsZW4pIHsKLSAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICBjYXNlIDI0OgotICAgICAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChjaXBoZXIgPT0gRlhDSVBIRVJfQUVTMikgewotICAgICAgICBpZiAoa2V5bGVuICE9IDMyKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGNpcGhlciA9PSBGWENJUEhFUl9SQzQpIHsKLSAgICAgICAgaWYgKGtleWxlbiA8IDUgfHwga2V5bGVuID4gMTYpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChrZXlsZW4gPiAzMikgewotICAgICAgICAgICAga2V5bGVuID0gMzI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9DaXBoZXIgPSBjaXBoZXI7Ci0gICAgbV9LZXlMZW4gPSBrZXlsZW47Ci0gICAgRlhTWVNfbWVtY3B5MzIobV9FbmNyeXB0S2V5LCBrZXksIGtleWxlbik7Ci0gICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUykgewotICAgICAgICBtX3BBRVNDb250ZXh0ID0gRlhfQWxsb2MoRlhfQllURSwgMjA0OCk7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOworRlhfQk9PTCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6RGVjcnlwdFN0cmVhbSh2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpIHsKKyAgcmV0dXJuIENyeXB0U3RyZWFtKGNvbnRleHQsIHNyY19idWYsIHNyY19zaXplLCBkZXN0X2J1ZiwgRkFMU0UpOwogfQotRlhfQk9PTCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6RGVjcnlwdFN0cmVhbShGWF9MUFZPSUQgY29udGV4dCwgRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKLSAgICAgICAgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpCi17Ci0gICAgcmV0dXJuIENyeXB0U3RyZWFtKGNvbnRleHQsIHNyY19idWYsIHNyY19zaXplLCBkZXN0X2J1ZiwgRkFMU0UpOworRlhfQk9PTCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6RGVjcnlwdEZpbmlzaCh2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikgeworICByZXR1cm4gQ3J5cHRGaW5pc2goY29udGV4dCwgZGVzdF9idWYsIEZBTFNFKTsKIH0KLUZYX0JPT0wgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkRlY3J5cHRGaW5pc2goRlhfTFBWT0lEIGNvbnRleHQsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKQotewotICAgIHJldHVybiBDcnlwdEZpbmlzaChjb250ZXh0LCBkZXN0X2J1ZiwgRkFMU0UpOworRlhfRFdPUkQgQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkVuY3J5cHRHZXRTaXplKEZYX0RXT1JEIG9iam51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUpIHsKKyAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUykgeworICAgIHJldHVybiBzcmNfc2l6ZSArIDMyOworICB9CisgIHJldHVybiBzcmNfc2l6ZTsKIH0KLUZYX0RXT1JEIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjpFbmNyeXB0R2V0U2l6ZShGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIHZlcnNpb24sIEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUpCi17Ci0gICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUykgewotICAgICAgICByZXR1cm4gc3JjX3NpemUgKyAzMjsKLSAgICB9Ci0gICAgcmV0dXJuIHNyY19zaXplOworRlhfQk9PTCBDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6RW5jcnlwdENvbnRlbnQoRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZ2VubnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKSB7CisgIENyeXB0QmxvY2soVFJVRSwgb2JqbnVtLCBnZW5udW0sIHNyY19idWYsIHNyY19zaXplLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjpFbmNyeXB0Q29udGVudChGWF9EV09SRCBvYmpudW0sIEZYX0RXT1JEIGdlbm51bSwgRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKLSAgICAgICAgRlhfTFBCWVRFIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKQotewotICAgIENyeXB0QmxvY2soVFJVRSwgb2JqbnVtLCBnZW5udW0sIHNyY19idWYsIHNyY19zaXplLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKLSAgICByZXR1cm4gVFJVRTsKK3ZvaWQgQ1BERl9DcnlwdG9IYW5kbGVyOjpEZWNyeXB0KEZYX0RXT1JEIG9iam51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGdlbm51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzdHIpIHsKKyAgQ0ZYX0JpbmFyeUJ1ZiBkZXN0X2J1ZjsKKyAgdm9pZCogY29udGV4dCA9IERlY3J5cHRTdGFydChvYmpudW0sIGdlbm51bSk7CisgIERlY3J5cHRTdHJlYW0oY29udGV4dCwgKGNvbnN0IHVpbnQ4X3QqKXN0ciwgc3RyLkdldExlbmd0aCgpLCBkZXN0X2J1Zik7CisgIERlY3J5cHRGaW5pc2goY29udGV4dCwgZGVzdF9idWYpOworICBzdHIgPSBkZXN0X2J1ZjsKIH0KLXZvaWQgQ1BERl9DcnlwdG9IYW5kbGVyOjpEZWNyeXB0KEZYX0RXT1JEIG9iam51bSwgRlhfRFdPUkQgZ2VubnVtLCBDRlhfQnl0ZVN0cmluZyYgc3RyKQotewotICAgIENGWF9CaW5hcnlCdWYgZGVzdF9idWY7Ci0gICAgRlhfTFBWT0lEIGNvbnRleHQgPSBEZWNyeXB0U3RhcnQob2JqbnVtLCBnZW5udW0pOwotICAgIERlY3J5cHRTdHJlYW0oY29udGV4dCwgKEZYX0xQQ0JZVEUpc3RyLCBzdHIuR2V0TGVuZ3RoKCksIGRlc3RfYnVmKTsKLSAgICBEZWNyeXB0RmluaXNoKGNvbnRleHQsIGRlc3RfYnVmKTsKLSAgICBzdHIgPSBkZXN0X2J1ZjsKK0NQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyOjpDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcigpIHsKKyAgbV9wQUVTQ29udGV4dCA9IE5VTEw7CisgIG1fQ2lwaGVyID0gRlhDSVBIRVJfTk9ORTsKKyAgbV9LZXlMZW4gPSAwOwogfQotQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6OkNQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyKCkKLXsKLSAgICBtX3BBRVNDb250ZXh0ID0gTlVMTDsKLSAgICBtX0NpcGhlciA9IEZYQ0lQSEVSX05PTkU7Ci0gICAgbV9LZXlMZW4gPSAwOwotfQotQ1BERl9TdGFuZGFyZENyeXB0b0hhbmRsZXI6On5DUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcigpCi17Ci0gICAgaWYgKG1fcEFFU0NvbnRleHQpIHsKLSAgICAgICAgRlhfRnJlZShtX3BBRVNDb250ZXh0KTsKLSAgICB9CitDUERGX1N0YW5kYXJkQ3J5cHRvSGFuZGxlcjo6fkNQREZfU3RhbmRhcmRDcnlwdG9IYW5kbGVyKCkgeworICBGWF9GcmVlKG1fcEFFU0NvbnRleHQpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9mZGYuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9mZGYuY3BwCmluZGV4IDViYWNmZDcuLjU0NzE0NDkgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZmRmLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2ZkZi5jcHAKQEAgLTEsMTkwICsxLDE3NyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfc2VyaWFsLmgiCi1DRkRGX0RvY3VtZW50OjpDRkRGX0RvY3VtZW50KCkgOiBDUERGX0luZGlyZWN0T2JqZWN0cyhOVUxMKQotewotICAgIG1fcFJvb3REaWN0ID0gTlVMTDsKLSAgICBtX3BGaWxlID0gTlVMTDsKLSAgICBtX2JPd25GaWxlID0gRkFMU0U7CisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYXJzZXIuaCIKKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfc2VyaWFsLmgiCisKK0NGREZfRG9jdW1lbnQ6OkNGREZfRG9jdW1lbnQoKSA6IENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIoTlVMTCkgeworICBtX3BSb290RGljdCA9IE5VTEw7CisgIG1fcEZpbGUgPSBOVUxMOworICBtX2JPd25GaWxlID0gRkFMU0U7CiB9Ci1DRkRGX0RvY3VtZW50Ojp+Q0ZERl9Eb2N1bWVudCgpCi17Ci0gICAgaWYgKG1fYk93bkZpbGUgJiYgbV9wRmlsZSkgewotICAgICAgICBtX3BGaWxlLT5SZWxlYXNlKCk7Ci0gICAgfQorQ0ZERl9Eb2N1bWVudDo6fkNGREZfRG9jdW1lbnQoKSB7CisgIGlmIChtX2JPd25GaWxlICYmIG1fcEZpbGUpIHsKKyAgICBtX3BGaWxlLT5SZWxlYXNlKCk7CisgIH0KIH0KLUNGREZfRG9jdW1lbnQqIENGREZfRG9jdW1lbnQ6OkNyZWF0ZU5ld0RvYygpCi17Ci0gICAgQ0ZERl9Eb2N1bWVudCogcERvYyA9IG5ldyBDRkRGX0RvY3VtZW50OwotICAgIHBEb2MtPm1fcFJvb3REaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKLSAgICBwRG9jLT5BZGRJbmRpcmVjdE9iamVjdChwRG9jLT5tX3BSb290RGljdCk7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRkRGRGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7Ci0gICAgcERvYy0+bV9wUm9vdERpY3QtPlNldEF0KEZYX0JTVFJDKCJGREYiKSwgcEZERkRpY3QpOwotICAgIHJldHVybiBwRG9jOworQ0ZERl9Eb2N1bWVudCogQ0ZERl9Eb2N1bWVudDo6Q3JlYXRlTmV3RG9jKCkgeworICBDRkRGX0RvY3VtZW50KiBwRG9jID0gbmV3IENGREZfRG9jdW1lbnQ7CisgIHBEb2MtPm1fcFJvb3REaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgcERvYy0+QWRkSW5kaXJlY3RPYmplY3QocERvYy0+bV9wUm9vdERpY3QpOworICBDUERGX0RpY3Rpb25hcnkqIHBGREZEaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgcERvYy0+bV9wUm9vdERpY3QtPlNldEF0KCJGREYiLCBwRkRGRGljdCk7CisgIHJldHVybiBwRG9jOwogfQotQ0ZERl9Eb2N1bWVudCogQ0ZERl9Eb2N1bWVudDo6UGFyc2VGaWxlKElGWF9GaWxlUmVhZCAqcEZpbGUsIEZYX0JPT0wgYk93bkZpbGUpCi17CitDRkRGX0RvY3VtZW50KiBDRkRGX0RvY3VtZW50OjpQYXJzZUZpbGUoSUZYX0ZpbGVSZWFkKiBwRmlsZSwgRlhfQk9PTCBiT3duRmlsZSkgewogICBpZiAoIXBGaWxlKSB7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KICAgQ0ZERl9Eb2N1bWVudCogcERvYyA9IG5ldyBDRkRGX0RvY3VtZW50OwogICBwRG9jLT5QYXJzZVN0cmVhbShwRmlsZSwgYk93bkZpbGUpOwotICBpZiAocERvYy0+bV9wUm9vdERpY3QgPT0gTlVMTCkgeworICBpZiAoIXBEb2MtPm1fcFJvb3REaWN0KSB7CiAgICAgZGVsZXRlIHBEb2M7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KICAgcmV0dXJuIHBEb2M7CiB9Ci1DRkRGX0RvY3VtZW50KiBDRkRGX0RvY3VtZW50OjpQYXJzZU1lbW9yeShGWF9MUENCWVRFIHBEYXRhLCBGWF9EV09SRCBzaXplKQotewotICAgIHJldHVybiBDRkRGX0RvY3VtZW50OjpQYXJzZUZpbGUoRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKChGWF9MUEJZVEUpcERhdGEsIHNpemUpLCBUUlVFKTsKK0NGREZfRG9jdW1lbnQqIENGREZfRG9jdW1lbnQ6OlBhcnNlTWVtb3J5KGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplKSB7CisgIHJldHVybiBDRkRGX0RvY3VtZW50OjpQYXJzZUZpbGUoRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKCh1aW50OF90KilwRGF0YSwgc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSk7CiB9Ci12b2lkIENGREZfRG9jdW1lbnQ6OlBhcnNlU3RyZWFtKElGWF9GaWxlUmVhZCAqcEZpbGUsIEZYX0JPT0wgYk93bkZpbGUpCi17Ci0gICAgbV9wRmlsZSA9IHBGaWxlOwotICAgIG1fYk93bkZpbGUgPSBiT3duRmlsZTsKLSAgICBDUERGX1N5bnRheFBhcnNlciBwYXJzZXI7Ci0gICAgcGFyc2VyLkluaXRQYXJzZXIobV9wRmlsZSwgMCk7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgRlhfQk9PTCBiTnVtYmVyOwotICAgICAgICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gcGFyc2VyLkdldE5leHRXb3JkKGJOdW1iZXIpOwotICAgICAgICBpZiAoYk51bWJlcikgewotICAgICAgICAgICAgRlhfRFdPUkQgb2JqbnVtID0gRlhTWVNfYXRvaSh3b3JkKTsKLSAgICAgICAgICAgIHdvcmQgPSBwYXJzZXIuR2V0TmV4dFdvcmQoYk51bWJlcik7Ci0gICAgICAgICAgICBpZiAoIWJOdW1iZXIpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdvcmQgPSBwYXJzZXIuR2V0TmV4dFdvcmQoYk51bWJlcik7Ci0gICAgICAgICAgICBpZiAod29yZCAhPSBGWF9CU1RSQygib2JqIikpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gcGFyc2VyLkdldE9iamVjdCh0aGlzLCBvYmpudW0sIDAsIEZBTFNFKTsKLSAgICAgICAgICAgIGlmIChwT2JqID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEluc2VydEluZGlyZWN0T2JqZWN0KG9iam51bSwgcE9iaik7Ci0gICAgICAgICAgICB3b3JkID0gcGFyc2VyLkdldE5leHRXb3JkKGJOdW1iZXIpOwotICAgICAgICAgICAgaWYgKHdvcmQgIT0gRlhfQlNUUkMoImVuZG9iaiIpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAod29yZCAhPSBGWF9CU1RSQygidHJhaWxlciIpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBNYWluRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBhcnNlci5HZXRPYmplY3QodGhpcywgMCwgMCwgMCk7Ci0gICAgICAgICAgICBpZiAocE1haW5EaWN0ID09IE5VTEwgfHwgcE1haW5EaWN0LT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fcFJvb3REaWN0ID0gcE1haW5EaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJSb290IikpOwotICAgICAgICAgICAgcE1haW5EaWN0LT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQordm9pZCBDRkRGX0RvY3VtZW50OjpQYXJzZVN0cmVhbShJRlhfRmlsZVJlYWQqIHBGaWxlLCBGWF9CT09MIGJPd25GaWxlKSB7CisgIG1fcEZpbGUgPSBwRmlsZTsKKyAgbV9iT3duRmlsZSA9IGJPd25GaWxlOworICBDUERGX1N5bnRheFBhcnNlciBwYXJzZXI7CisgIHBhcnNlci5Jbml0UGFyc2VyKG1fcEZpbGUsIDApOworICB3aGlsZSAoMSkgeworICAgIGJvb2wgYk51bWJlcjsKKyAgICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gcGFyc2VyLkdldE5leHRXb3JkKCZiTnVtYmVyKTsKKyAgICBpZiAoYk51bWJlcikgeworICAgICAgRlhfRFdPUkQgb2JqbnVtID0gRlhTWVNfYXRvaSh3b3JkKTsKKyAgICAgIHdvcmQgPSBwYXJzZXIuR2V0TmV4dFdvcmQoJmJOdW1iZXIpOworICAgICAgaWYgKCFiTnVtYmVyKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgd29yZCA9IHBhcnNlci5HZXROZXh0V29yZChudWxscHRyKTsKKyAgICAgIGlmICh3b3JkICE9ICJvYmoiKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBwYXJzZXIuR2V0T2JqZWN0KHRoaXMsIG9iam51bSwgMCwgbnVsbHB0ciwgdHJ1ZSk7CisgICAgICBpZiAoIXBPYmopIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBJbnNlcnRJbmRpcmVjdE9iamVjdChvYmpudW0sIHBPYmopOworICAgICAgd29yZCA9IHBhcnNlci5HZXROZXh0V29yZChudWxscHRyKTsKKyAgICAgIGlmICh3b3JkICE9ICJlbmRvYmoiKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAod29yZCAhPSAidHJhaWxlciIpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwTWFpbkRpY3QgPQorICAgICAgICAgICAgICBUb0RpY3Rpb25hcnkocGFyc2VyLkdldE9iamVjdCh0aGlzLCAwLCAwLCBudWxscHRyLCB0cnVlKSkpIHsKKyAgICAgICAgbV9wUm9vdERpY3QgPSBwTWFpbkRpY3QtPkdldERpY3QoIlJvb3QiKTsKKyAgICAgICAgcE1haW5EaWN0LT5SZWxlYXNlKCk7CisgICAgICB9CisgICAgICBicmVhazsKICAgICB9CisgIH0KIH0KLUZYX0JPT0wgQ0ZERl9Eb2N1bWVudDo6V3JpdGVCdWYoQ0ZYX0J5dGVUZXh0QnVmJiBidWYpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcFJvb3REaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBidWYgPDwgRlhfQlNUUkMoIiVGREYtMS4yXHJcbiIpOwotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fSW5kaXJlY3RPYmpzLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICB3aGlsZShwb3MpIHsKLSAgICAgICAgc2l6ZV90IG9iam51bTsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBPYmo7Ci0gICAgICAgIG1fSW5kaXJlY3RPYmpzLkdldE5leHRBc3NvYyhwb3MsIChGWF9MUFZPSUQmKW9iam51bSwgKEZYX0xQVk9JRCYpcE9iaik7Ci0gICAgICAgIGJ1ZiA8PCAoRlhfRFdPUkQpb2JqbnVtIDw8IEZYX0JTVFJDKCIgMCBvYmpcclxuIikgPDwgcE9iaiA8PCBGWF9CU1RSQygiXHJcbmVuZG9ialxyXG5cclxuIik7Ci0gICAgfQotICAgIGJ1ZiA8PCBGWF9CU1RSQygidHJhaWxlclxyXG48PC9Sb290ICIpIDw8IG1fcFJvb3REaWN0LT5HZXRPYmpOdW0oKSA8PCBGWF9CU1RSQygiIDAgUj4+XHJcbiUlRU9GXHJcbiIpOwotICAgIHJldHVybiBUUlVFOworRlhfQk9PTCBDRkRGX0RvY3VtZW50OjpXcml0ZUJ1ZihDRlhfQnl0ZVRleHRCdWYmIGJ1ZikgY29uc3QgeworICBpZiAoIW1fcFJvb3REaWN0KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGJ1ZiA8PCAiJUZERi0xLjJcclxuIjsKKyAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbV9JbmRpcmVjdE9ianMpIHsKKyAgICBidWYgPDwgcGFpci5maXJzdCA8PCAiIDAgb2JqXHJcbiIgPDwgcGFpci5zZWNvbmQgPDwgIlxyXG5lbmRvYmpcclxuXHJcbiI7CisgIH0KKyAgYnVmIDw8ICJ0cmFpbGVyXHJcbjw8L1Jvb3QgIiA8PCBtX3BSb290RGljdC0+R2V0T2JqTnVtKCkKKyAgICAgIDw8ICIgMCBSPj5cclxuJSVFT0ZcclxuIjsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1DRlhfV2lkZVN0cmluZyBDRkRGX0RvY3VtZW50OjpHZXRXaW4zMlBhdGgoKSBjb25zdAotewotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BSb290RGljdCA/IG1fcFJvb3REaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJGREYiKSkgOiBOVUxMOwotICAgIENQREZfT2JqZWN0KiBwRmlsZVNwZWMgPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkYiKSkgOiBOVUxMOwotICAgIGlmIChwRmlsZVNwZWMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgICB9Ci0gICAgaWYgKHBGaWxlU3BlYy0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcpIHsKLSAgICAgICAgcmV0dXJuIEZQREZfRmlsZVNwZWNfR2V0V2luMzJQYXRoKG1fcFJvb3REaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJGREYiKSkpOwotICAgIH0KLSAgICByZXR1cm4gRlBERl9GaWxlU3BlY19HZXRXaW4zMlBhdGgocEZpbGVTcGVjKTsKK0NGWF9XaWRlU3RyaW5nIENGREZfRG9jdW1lbnQ6OkdldFdpbjMyUGF0aCgpIGNvbnN0IHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcFJvb3REaWN0ID8gbV9wUm9vdERpY3QtPkdldERpY3QoIkZERiIpIDogTlVMTDsKKyAgQ1BERl9PYmplY3QqIHBGaWxlU3BlYyA9IHBEaWN0ID8gcERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiRiIpIDogTlVMTDsKKyAgaWYgKCFwRmlsZVNwZWMpCisgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7CisgIGlmIChwRmlsZVNwZWMtPklzU3RyaW5nKCkpCisgICAgcmV0dXJuIEZQREZfRmlsZVNwZWNfR2V0V2luMzJQYXRoKG1fcFJvb3REaWN0LT5HZXREaWN0KCJGREYiKSk7CisgIHJldHVybiBGUERGX0ZpbGVTcGVjX0dldFdpbjMyUGF0aChwRmlsZVNwZWMpOwogfQotc3RhdGljIENGWF9XaWRlU3RyaW5nIENoYW5nZVNsYXNoKEZYX0xQQ1dTVFIgc3RyKQoteworc3RhdGljIENGWF9XaWRlU3RyaW5nIENoYW5nZVNsYXNoKGNvbnN0IEZYX1dDSEFSKiBzdHIpIHsKKyAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0OworICB3aGlsZSAoKnN0cikgeworICAgIGlmICgqc3RyID09ICdcXCcpIHsKKyAgICAgIHJlc3VsdCArPSAnLyc7CisgICAgfSBlbHNlIGlmICgqc3RyID09ICcvJykgeworICAgICAgcmVzdWx0ICs9ICdcXCc7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAqc3RyOworICAgIH0KKyAgICBzdHIrKzsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQordm9pZCBGUERGX0ZpbGVTcGVjX1NldFdpbjMyUGF0aChDUERGX09iamVjdCogcEZpbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgZmlsZXBhdGgpIHsKKyAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0OworICBpZiAoZmlsZXBhdGguR2V0TGVuZ3RoKCkgPiAxICYmIGZpbGVwYXRoWzFdID09ICc6JykgeworICAgIHJlc3VsdCA9IEwiLyI7CisgICAgcmVzdWx0ICs9IGZpbGVwYXRoWzBdOworICAgIGlmIChmaWxlcGF0aFsyXSAhPSAnXFwnKSB7CisgICAgICByZXN1bHQgKz0gJy8nOworICAgIH0KKyAgICByZXN1bHQgKz0gQ2hhbmdlU2xhc2goZmlsZXBhdGguY19zdHIoKSArIDIpOworICB9IGVsc2UgaWYgKGZpbGVwYXRoLkdldExlbmd0aCgpID4gMSAmJiBmaWxlcGF0aFswXSA9PSAnXFwnICYmCisgICAgICAgICAgICAgZmlsZXBhdGhbMV0gPT0gJ1xcJykgeworICAgIHJlc3VsdCA9IENoYW5nZVNsYXNoKGZpbGVwYXRoLmNfc3RyKCkgKyAxKTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSBDaGFuZ2VTbGFzaChmaWxlcGF0aC5jX3N0cigpKTsKKyAgfQorCisgIGlmIChwRmlsZVNwZWMtPklzU3RyaW5nKCkpIHsKKyAgICBwRmlsZVNwZWMtPlNldFN0cmluZyhDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocmVzdWx0KSk7CisgIH0gZWxzZSBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRmlsZURpY3QgPSBwRmlsZVNwZWMtPkFzRGljdGlvbmFyeSgpKSB7CisgICAgcEZpbGVEaWN0LT5TZXRBdFN0cmluZygiRiIsIENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShyZXN1bHQpKTsKKyAgICBwRmlsZURpY3QtPlNldEF0U3RyaW5nKCJVRiIsIFBERl9FbmNvZGVUZXh0KHJlc3VsdCkpOworICAgIHBGaWxlRGljdC0+UmVtb3ZlQXQoIkZTIik7CisgIH0KK30KK0NGWF9XaWRlU3RyaW5nIEZQREZfRmlsZVNwZWNfR2V0V2luMzJQYXRoKGNvbnN0IENQREZfT2JqZWN0KiBwRmlsZVNwZWMpIHsKKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWxlTmFtZTsKKyAgaWYgKCFwRmlsZVNwZWMpIHsKKyAgICB3c0ZpbGVOYW1lID0gQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgfSBlbHNlIGlmIChjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcEZpbGVTcGVjLT5Bc0RpY3Rpb25hcnkoKSkgeworICAgIHdzRmlsZU5hbWUgPSBwRGljdC0+R2V0VW5pY29kZVRleHQoIlVGIik7CisgICAgaWYgKHdzRmlsZU5hbWUuSXNFbXB0eSgpKSB7CisgICAgICB3c0ZpbGVOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChwRGljdC0+R2V0U3RyaW5nKCJGIikpOworICAgIH0KKyAgICBpZiAocERpY3QtPkdldFN0cmluZygiRlMiKSA9PSAiVVJMIikgeworICAgICAgcmV0dXJuIHdzRmlsZU5hbWU7CisgICAgfQorICAgIGlmICh3c0ZpbGVOYW1lLklzRW1wdHkoKSAmJiBwRGljdC0+S2V5RXhpc3QoIkRPUyIpKSB7CisgICAgICB3c0ZpbGVOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChwRGljdC0+R2V0U3RyaW5nKCJET1MiKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIHdzRmlsZU5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBGaWxlU3BlYy0+R2V0U3RyaW5nKCkpOworICB9CisgIGlmICh3c0ZpbGVOYW1lWzBdICE9ICcvJykgeworICAgIHJldHVybiBDaGFuZ2VTbGFzaCh3c0ZpbGVOYW1lLmNfc3RyKCkpOworICB9CisgIGlmICh3c0ZpbGVOYW1lWzJdID09ICcvJykgewogICAgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKLSAgICB3aGlsZSAoKnN0cikgewotICAgICAgICBpZiAoKnN0ciA9PSAnXFwnKSB7Ci0gICAgICAgICAgICByZXN1bHQgKz0gJy8nOwotICAgICAgICB9IGVsc2UgaWYgKCpzdHIgPT0gJy8nKSB7Ci0gICAgICAgICAgICByZXN1bHQgKz0gJ1xcJzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCArPSAqc3RyOwotICAgICAgICB9Ci0gICAgICAgIHN0ciArKzsKLSAgICB9CisgICAgcmVzdWx0ICs9IHdzRmlsZU5hbWVbMV07CisgICAgcmVzdWx0ICs9ICc6JzsKKyAgICByZXN1bHQgKz0gQ2hhbmdlU2xhc2god3NGaWxlTmFtZS5jX3N0cigpICsgMik7CiAgICAgcmV0dXJuIHJlc3VsdDsKLX0KLXZvaWQgRlBERl9GaWxlU3BlY19TZXRXaW4zMlBhdGgoQ1BERl9PYmplY3QqIHBGaWxlU3BlYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZpbGVwYXRoKQotewotICAgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKLSAgICBpZiAoZmlsZXBhdGguR2V0TGVuZ3RoKCkgPiAxICYmIGZpbGVwYXRoWzFdID09ICc6JykgewotICAgICAgICByZXN1bHQgPSBMIi8iOwotICAgICAgICByZXN1bHQgKz0gZmlsZXBhdGhbMF07Ci0gICAgICAgIGlmIChmaWxlcGF0aFsyXSAhPSAnXFwnKSB7Ci0gICAgICAgICAgICByZXN1bHQgKz0gJy8nOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCArPSBDaGFuZ2VTbGFzaChmaWxlcGF0aC5jX3N0cigpICsgMik7Ci0gICAgfSBlbHNlIGlmIChmaWxlcGF0aC5HZXRMZW5ndGgoKSA+IDEgJiYgZmlsZXBhdGhbMF0gPT0gJ1xcJyAmJiBmaWxlcGF0aFsxXSA9PSAnXFwnKSB7Ci0gICAgICAgIHJlc3VsdCA9IENoYW5nZVNsYXNoKGZpbGVwYXRoLmNfc3RyKCkgKyAxKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQgPSBDaGFuZ2VTbGFzaChmaWxlcGF0aC5jX3N0cigpKTsKLSAgICB9Ci0gICAgaWYgKHBGaWxlU3BlYy0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcpIHsKLSAgICAgICAgcEZpbGVTcGVjLT5TZXRTdHJpbmcoQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHJlc3VsdCkpOwotICAgIH0gZWxzZSBpZiAocEZpbGVTcGVjLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgKChDUERGX0RpY3Rpb25hcnkqKXBGaWxlU3BlYyktPlNldEF0U3RyaW5nKEZYX0JTVFJDKCJGIiksIENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShyZXN1bHQpKTsKLSAgICAgICAgKChDUERGX0RpY3Rpb25hcnkqKXBGaWxlU3BlYyktPlNldEF0U3RyaW5nKEZYX0JTVFJDKCJVRiIpLCBQREZfRW5jb2RlVGV4dChyZXN1bHQpKTsKLSAgICAgICAgKChDUERGX0RpY3Rpb25hcnkqKXBGaWxlU3BlYyktPlJlbW92ZUF0KEZYX0JTVFJDKCJGUyIpKTsKLSAgICB9Ci19Ci1DRlhfV2lkZVN0cmluZwlGUERGX0ZpbGVTcGVjX0dldFdpbjMyUGF0aChjb25zdCBDUERGX09iamVjdCogcEZpbGVTcGVjKQotewotICAgIENGWF9XaWRlU3RyaW5nIHdzRmlsZU5hbWU7Ci0gICAgaWYgKHBGaWxlU3BlYy0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwRmlsZVNwZWM7Ci0gICAgICAgIHdzRmlsZU5hbWUgPSBwRGljdC0+R2V0VW5pY29kZVRleHQoRlhfQlNUUkMoIlVGIikpOwotICAgICAgICBpZiAod3NGaWxlTmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHdzRmlsZU5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkYiKSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJGUyIpKSA9PSBGWF9CU1RSQygiVVJMIikpIHsKLSAgICAgICAgICAgIHJldHVybiB3c0ZpbGVOYW1lOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3c0ZpbGVOYW1lLklzRW1wdHkoKSAmJiBwRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIkRPUyIpKSkgewotICAgICAgICAgICAgd3NGaWxlTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwocERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiRE9TIikpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICghcEZpbGVTcGVjKQotICAgICAgICB3c0ZpbGVOYW1lID0gQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgICBlbHNlIHsKLSAgICAgICAgd3NGaWxlTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwocEZpbGVTcGVjLT5HZXRTdHJpbmcoKSk7Ci0gICAgfQotICAgIGlmICh3c0ZpbGVOYW1lWzBdICE9ICcvJykgewotICAgICAgICByZXR1cm4gQ2hhbmdlU2xhc2god3NGaWxlTmFtZS5jX3N0cigpKTsKLSAgICB9Ci0gICAgaWYgKHdzRmlsZU5hbWVbMl0gPT0gJy8nKSB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKLSAgICAgICAgcmVzdWx0ICs9IHdzRmlsZU5hbWVbMV07Ci0gICAgICAgIHJlc3VsdCArPSAnOic7Ci0gICAgICAgIHJlc3VsdCArPSBDaGFuZ2VTbGFzaCh3c0ZpbGVOYW1lLmNfc3RyKCkgKyAyKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9IGVsc2UgewotICAgICAgICBDRlhfV2lkZVN0cmluZyByZXN1bHQ7Ci0gICAgICAgIHJlc3VsdCArPSAnXFwnOwotICAgICAgICByZXN1bHQgKz0gQ2hhbmdlU2xhc2god3NGaWxlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9CisgIH0KKyAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0OworICByZXN1bHQgKz0gJ1xcJzsKKyAgcmVzdWx0ICs9IENoYW5nZVNsYXNoKHdzRmlsZU5hbWUuY19zdHIoKSk7CisgIHJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2ZpbHRlcnMuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9maWx0ZXJzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZhNzQxOS4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2ZpbHRlcnMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTA4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICIuLi8uLi9meF96bGliLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFyc2VyLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgiCi0jaW5jbHVkZSAiZmlsdGVyc19pbnQuaCIKLUNGWF9EYXRhRmlsdGVyOjpDRlhfRGF0YUZpbHRlcigpCi17Ci0gICAgbV9iRU9GID0gRkFMU0U7Ci0gICAgbV9wRGVzdEZpbHRlciA9IE5VTEw7Ci0gICAgbV9TcmNQb3MgPSAwOwotfQotQ0ZYX0RhdGFGaWx0ZXI6On5DRlhfRGF0YUZpbHRlcigpCi17Ci0gICAgaWYgKG1fcERlc3RGaWx0ZXIpIHsKLSAgICAgICAgZGVsZXRlIG1fcERlc3RGaWx0ZXI7Ci0gICAgfQotfQotdm9pZCBDRlhfRGF0YUZpbHRlcjo6U2V0RGVzdEZpbHRlcihDRlhfRGF0YUZpbHRlciogcEZpbHRlcikKLXsKLSAgICBpZiAobV9wRGVzdEZpbHRlcikgewotICAgICAgICBtX3BEZXN0RmlsdGVyLT5TZXREZXN0RmlsdGVyKHBGaWx0ZXIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcERlc3RGaWx0ZXIgPSBwRmlsdGVyOwotICAgIH0KLX0KLXZvaWQgQ0ZYX0RhdGFGaWx0ZXI6OkZpbHRlckluKEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKQotewotICAgIGlmIChtX2JFT0YpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX1NyY1BvcyArPSBzcmNfc2l6ZTsKLSAgICBpZiAobV9wRGVzdEZpbHRlcikgewotICAgICAgICBDRlhfQmluYXJ5QnVmIHRlbXBfYnVmOwotICAgICAgICB0ZW1wX2J1Zi5Fc3RpbWF0ZVNpemUoRlBERl9GSUxURVJfQlVGRkVSX1NJWkUsIEZQREZfRklMVEVSX0JVRkZFUl9TSVpFKTsKLSAgICAgICAgdl9GaWx0ZXJJbihzcmNfYnVmLCBzcmNfc2l6ZSwgdGVtcF9idWYpOwotICAgICAgICBtX3BEZXN0RmlsdGVyLT5GaWx0ZXJJbih0ZW1wX2J1Zi5HZXRCdWZmZXIoKSwgdGVtcF9idWYuR2V0U2l6ZSgpLCBkZXN0X2J1Zik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdl9GaWx0ZXJJbihzcmNfYnVmLCBzcmNfc2l6ZSwgZGVzdF9idWYpOwotICAgIH0KLX0KLXZvaWQgQ0ZYX0RhdGFGaWx0ZXI6OkZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikKLXsKLSAgICBpZiAobV9wRGVzdEZpbHRlcikgewotICAgICAgICBDRlhfQmluYXJ5QnVmIHRlbXBfYnVmOwotICAgICAgICB2X0ZpbHRlckZpbmlzaCh0ZW1wX2J1Zik7Ci0gICAgICAgIGlmICh0ZW1wX2J1Zi5HZXRTaXplKCkpIHsKLSAgICAgICAgICAgIG1fcERlc3RGaWx0ZXItPkZpbHRlckluKHRlbXBfYnVmLkdldEJ1ZmZlcigpLCB0ZW1wX2J1Zi5HZXRTaXplKCksIGRlc3RfYnVmKTsKLSAgICAgICAgfQotICAgICAgICBtX3BEZXN0RmlsdGVyLT5GaWx0ZXJGaW5pc2goZGVzdF9idWYpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZfRmlsdGVyRmluaXNoKGRlc3RfYnVmKTsKLSAgICB9Ci0gICAgbV9iRU9GID0gVFJVRTsKLX0KLXZvaWQgQ0ZYX0RhdGFGaWx0ZXI6OlJlcG9ydEVPRihGWF9EV09SRCBsZWZ0X2lucHV0KQotewotICAgIGlmIChtX2JFT0YpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX2JFT0YgPSBUUlVFOwotICAgIG1fU3JjUG9zIC09IGxlZnRfaW5wdXQ7Ci19Ci1DRlhfRGF0YUZpbHRlciogRlBERl9DcmVhdGVGaWx0ZXIoRlhfQlNUUiBuYW1lLCBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotewotICAgIEZYX0RXT1JEIGlkID0gbmFtZS5HZXRJRCgpOwotICAgIHN3aXRjaCAoaWQpIHsKLSAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ0YnLCAnbCcsICdhJywgJ3QnKToKLSAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ0YnLCAnbCcsIDAsIDApOgotICAgICAgICBjYXNlIEZYQlNUUl9JRCgnTCcsICdaJywgJ1cnLCAnRCcpOgotICAgICAgICBjYXNlIEZYQlNUUl9JRCgnTCcsICdaJywgJ1cnLCAwKTogewotICAgICAgICAgICAgICAgIENGWF9EYXRhRmlsdGVyKiBwRmlsdGVyOwotICAgICAgICAgICAgICAgIGlmIChpZCA9PSBGWEJTVFJfSUQoJ0wnLCAnWicsICdXJywgJ0QnKSB8fCBpZCA9PSBGWEJTVFJfSUQoJ0wnLCAnWicsICdXJywgMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcEZpbHRlciA9IG5ldyBDUERGX0x6d0ZpbHRlcihwUGFyYW0gPyBwUGFyYW0tPkdldEludGVnZXIoIkVhcmx5Q2hhbmdlIiwgMSkgOiAxKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwRmlsdGVyID0gbmV3IENQREZfRmxhdGVGaWx0ZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgocFBhcmFtID8gcFBhcmFtLT5HZXRJbnRlZ2VyKCJQcmVkaWN0b3IiLCAxKSA6IDEpID4gMSkgewotICAgICAgICAgICAgICAgICAgICBDRlhfRGF0YUZpbHRlciogcFByZWRpY3RvciA9IG5ldyBDUERGX1ByZWRpY3RvckZpbHRlcihwUGFyYW0tPkdldEludGVnZXIoRlhfQlNUUkMoIlByZWRpY3RvciIpLCAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW0tPkdldEludGVnZXIoRlhfQlNUUkMoIkNvbG9ycyIpLCAxKSwgcFBhcmFtLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJCaXRzUGVyQ29tcG9uZW50IiksIDgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+R2V0SW50ZWdlcihGWF9CU1RSQygiQ29sdW1ucyIpLCAxKSk7Ci0gICAgICAgICAgICAgICAgICAgIHBGaWx0ZXItPlNldERlc3RGaWx0ZXIocFByZWRpY3Rvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBwRmlsdGVyOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIEZYQlNUUl9JRCgnQScsICdTJywgJ0MnLCAnSScpOgotICAgICAgICAgICAgaWYgKG5hbWUgPT0gIkFTQ0lJSGV4RGVjb2RlIikgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ1BERl9Bc2NpaUhleEZpbHRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ1BERl9Bc2NpaTg1RmlsdGVyOwotICAgICAgICBjYXNlIEZYQlNUUl9JRCgnQScsICdIJywgJ3gnLCAwKToKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ1BERl9Bc2NpaUhleEZpbHRlcjsKLSAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ0EnLCAnOCcsICc1JywgMCk6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENQREZfQXNjaWk4NUZpbHRlcjsKLSAgICAgICAgY2FzZSBGWEJTVFJfSUQoJ1InLCAndScsICduJywgJ0wnKToKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ1BERl9SdW5MZW5GaWx0ZXI7Ci0gICAgICAgIGNhc2UgRlhCU1RSX0lEKCdDJywgJ0MnLCAnSScsICdUJyk6IHsKLSAgICAgICAgICAgICAgICBpbnQgRW5jb2RpbmcgPSAwOwotICAgICAgICAgICAgICAgIGludCBiRW5kT2ZMaW5lID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgaW50IGJCeXRlQWxpZ24gPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBpbnQgYkJsYWNrID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgaW50IG5Sb3dzID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgbkNvbHVtbnMgPSAxNzI4OwotICAgICAgICAgICAgICAgIGlmIChwUGFyYW0pIHsKLSAgICAgICAgICAgICAgICAgICAgRW5jb2RpbmcgPSBwUGFyYW0tPkdldEludGVnZXIoRlhfQlNUUkMoIksiKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJFbmRPZkxpbmUgPSBwUGFyYW0tPkdldEludGVnZXIoRlhfQlNUUkMoIkVuZE9mTGluZSIpKTsKLSAgICAgICAgICAgICAgICAgICAgYkJ5dGVBbGlnbiA9IHBQYXJhbS0+R2V0SW50ZWdlcihGWF9CU1RSQygiRW5jb2RlZEJ5dGVBbGlnbiIpKTsKLSAgICAgICAgICAgICAgICAgICAgYkJsYWNrID0gcFBhcmFtLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJCbGFja0lzMSIpKTsKLSAgICAgICAgICAgICAgICAgICAgbkNvbHVtbnMgPSBwUGFyYW0tPkdldEludGVnZXIoRlhfQlNUUkMoIkNvbHVtbnMiKSwgMTcyOCk7Ci0gICAgICAgICAgICAgICAgICAgIG5Sb3dzID0gcFBhcmFtLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJSb3dzIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobkNvbHVtbnMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBuQ29sdW1ucyA9IHdpZHRoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoblJvd3MgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBuUm93cyA9IGhlaWdodDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ1BERl9GYXhGaWx0ZXIqIHBGaWx0ZXIgPSBuZXcgQ1BERl9GYXhGaWx0ZXIoKTsKLSAgICAgICAgICAgICAgICBwRmlsdGVyLT5Jbml0aWFsaXplKEVuY29kaW5nLCBiRW5kT2ZMaW5lLCBiQnl0ZUFsaWduLCBiQmxhY2ssIG5Sb3dzLCBuQ29sdW1ucyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBGaWx0ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgRlhCU1RSX0lEKCdEJywgJ0MnLCAnVCcsICdEJyk6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENQREZfSnBlZ0ZpbHRlcjsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLUNGWF9EYXRhRmlsdGVyKiBfRlBERl9DcmVhdGVGaWx0ZXJGcm9tRGljdChDUERGX0RpY3Rpb25hcnkqIHBEaWN0KQotewotICAgIENQREZfT2JqZWN0KiBwRGVjb2RlciA9IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoIkZpbHRlciIpOwotICAgIGlmIChwRGVjb2RlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDRlhfRGF0YUZpbHRlciogcEZpcnN0RmlsdGVyID0gTlVMTDsKLSAgICBpbnQgd2lkdGggPSBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiV2lkdGgiKSksIGhlaWdodCA9IHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJIZWlnaHQiKSk7Ci0gICAgQ1BERl9PYmplY3QqIHBQYXJhbXMgPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKCJEZWNvZGVQYXJtcyIpOwotICAgIGlmIChwRGVjb2Rlci0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICBpZiAocFBhcmFtcyAmJiBwUGFyYW1zLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgICAgICBwUGFyYW1zID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgKChDUERGX0FycmF5KilwRGVjb2RlciktPkdldENvdW50KCk7IGkgKyspIHsKLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIG5hbWUgPSAoKENQREZfQXJyYXkqKXBEZWNvZGVyKS0+R2V0U3RyaW5nKGkpOwotICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW0gPSBOVUxMOwotICAgICAgICAgICAgaWYgKHBQYXJhbXMpIHsKLSAgICAgICAgICAgICAgICBwUGFyYW0gPSAoKENQREZfQXJyYXkqKXBQYXJhbXMpLT5HZXREaWN0KGkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ0ZYX0RhdGFGaWx0ZXIqIHBEZXN0RmlsdGVyID0gRlBERl9DcmVhdGVGaWx0ZXIobmFtZSwgcFBhcmFtLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgICAgIGlmIChwRGVzdEZpbHRlcikgewotICAgICAgICAgICAgICAgIGlmIChwRmlyc3RGaWx0ZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBwRmlyc3RGaWx0ZXIgPSBwRGVzdEZpbHRlcjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwRmlyc3RGaWx0ZXItPlNldERlc3RGaWx0ZXIocERlc3RGaWx0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChwUGFyYW1zICYmIHBQYXJhbXMtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICAgICAgcFBhcmFtcyA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcEZpcnN0RmlsdGVyID0gRlBERl9DcmVhdGVGaWx0ZXIocERlY29kZXItPkdldFN0cmluZygpLCAoQ1BERl9EaWN0aW9uYXJ5KilwUGFyYW1zLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHBGaXJzdEZpbHRlcjsKLX0KLUNQREZfU3RyZWFtRmlsdGVyKiBDUERGX1N0cmVhbTo6R2V0U3RyZWFtRmlsdGVyKEZYX0JPT0wgYlJhdykgY29uc3QKLXsKLSAgICBDRlhfRGF0YUZpbHRlciogcEZpcnN0RmlsdGVyID0gTlVMTDsKLSAgICBpZiAobV9wQ3J5cHRvSGFuZGxlcikgewotICAgICAgICBwRmlyc3RGaWx0ZXIgPSBuZXcgQ1BERl9EZWNyeXB0RmlsdGVyKG1fcENyeXB0b0hhbmRsZXIsIG1fT2JqTnVtLCBtX0dlbk51bSk7Ci0gICAgfQotICAgIGlmICghYlJhdykgewotICAgICAgICBDRlhfRGF0YUZpbHRlciogcEZpbHRlciA9IF9GUERGX0NyZWF0ZUZpbHRlckZyb21EaWN0KG1fcERpY3QpOwotICAgICAgICBpZiAocEZpbHRlcikgewotICAgICAgICAgICAgaWYgKHBGaXJzdEZpbHRlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcEZpcnN0RmlsdGVyID0gcEZpbHRlcjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcEZpcnN0RmlsdGVyLT5TZXREZXN0RmlsdGVyKHBGaWx0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIENQREZfU3RyZWFtRmlsdGVyKiBwU3RyZWFtRmlsdGVyID0gbmV3IENQREZfU3RyZWFtRmlsdGVyOwotICAgIHBTdHJlYW1GaWx0ZXItPm1fcFN0cmVhbSA9IHRoaXM7Ci0gICAgcFN0cmVhbUZpbHRlci0+bV9wRmlsdGVyID0gcEZpcnN0RmlsdGVyOwotICAgIHBTdHJlYW1GaWx0ZXItPm1fcEJ1ZmZlciA9IE5VTEw7Ci0gICAgcFN0cmVhbUZpbHRlci0+bV9TcmNPZmZzZXQgPSAwOwotICAgIHJldHVybiBwU3RyZWFtRmlsdGVyOwotfQotQ1BERl9TdHJlYW1GaWx0ZXI6On5DUERGX1N0cmVhbUZpbHRlcigpCi17Ci0gICAgaWYgKG1fcEZpbHRlcikgewotICAgICAgICBkZWxldGUgbV9wRmlsdGVyOwotICAgIH0KLSAgICBpZiAobV9wQnVmZmVyKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BCdWZmZXI7Ci0gICAgfQotfQotI2RlZmluZSBGUERGX0ZJTFRFUl9CVUZGRVJfSU5fU0laRQlGUERGX0ZJTFRFUl9CVUZGRVJfU0laRQotRlhfRFdPUkQgQ1BERl9TdHJlYW1GaWx0ZXI6OlJlYWRCbG9jayhGWF9MUEJZVEUgYnVmZmVyLCBGWF9EV09SRCBidWZfc2l6ZSkKLXsKLSAgICBpZiAobV9wRmlsdGVyID09IE5VTEwpIHsKLSAgICAgICAgRlhfRFdPUkQgcmVhZF9zaXplID0gbV9wU3RyZWFtLT5HZXRSYXdTaXplKCkgLSBtX1NyY09mZnNldDsKLSAgICAgICAgaWYgKHJlYWRfc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVhZF9zaXplID4gYnVmX3NpemUpIHsKLSAgICAgICAgICAgIHJlYWRfc2l6ZSA9IGJ1Zl9zaXplOwotICAgICAgICB9Ci0gICAgICAgIG1fcFN0cmVhbS0+UmVhZFJhd0RhdGEobV9TcmNPZmZzZXQsIGJ1ZmZlciwgcmVhZF9zaXplKTsKLSAgICAgICAgbV9TcmNPZmZzZXQgKz0gcmVhZF9zaXplOwotICAgICAgICByZXR1cm4gcmVhZF9zaXplOwotICAgIH0KLSAgICBGWF9EV09SRCByZWFkX3NpemUgPSAwOwotICAgIGlmIChtX3BCdWZmZXIpIHsKLSAgICAgICAgcmVhZF9zaXplID0gUmVhZExlZnRPdmVyKGJ1ZmZlciwgYnVmX3NpemUpOwotICAgICAgICBpZiAocmVhZF9zaXplID09IGJ1Zl9zaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhZF9zaXplOwotICAgICAgICB9Ci0gICAgICAgIGJ1ZmZlciArPSByZWFkX3NpemU7Ci0gICAgICAgIGJ1Zl9zaXplIC09IHJlYWRfc2l6ZTsKLSAgICB9Ci0gICAgQVNTRVJUKG1fcEJ1ZmZlciA9PSBOVUxMKTsKLSAgICBpZiAobV9wRmlsdGVyLT5Jc0VPRigpKSB7Ci0gICAgICAgIHJldHVybiByZWFkX3NpemU7Ci0gICAgfQotICAgIG1fcEJ1ZmZlciA9IG5ldyBDRlhfQmluYXJ5QnVmOwotICAgIG1fcEJ1ZmZlci0+RXN0aW1hdGVTaXplKEZQREZfRklMVEVSX0JVRkZFUl9TSVpFLCBGUERGX0ZJTFRFUl9CVUZGRVJfU0laRSk7Ci0gICAgbV9CdWZPZmZzZXQgPSAwOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGludCBzcmNfc2l6ZSA9IG1fcFN0cmVhbS0+R2V0UmF3U2l6ZSgpIC0gbV9TcmNPZmZzZXQ7Ci0gICAgICAgIGlmIChzcmNfc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICBtX3BGaWx0ZXItPkZpbHRlckZpbmlzaCgqbV9wQnVmZmVyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNfc2l6ZSA+IEZQREZfRklMVEVSX0JVRkZFUl9JTl9TSVpFKSB7Ci0gICAgICAgICAgICBzcmNfc2l6ZSA9IEZQREZfRklMVEVSX0JVRkZFUl9JTl9TSVpFOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbV9wU3RyZWFtLT5SZWFkUmF3RGF0YShtX1NyY09mZnNldCwgbV9TcmNCdWZmZXIsIHNyY19zaXplKSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgbV9TcmNPZmZzZXQgKz0gc3JjX3NpemU7Ci0gICAgICAgIG1fcEZpbHRlci0+RmlsdGVySW4obV9TcmNCdWZmZXIsIHNyY19zaXplLCAqbV9wQnVmZmVyKTsKLSAgICAgICAgaWYgKG1fcEJ1ZmZlci0+R2V0U2l6ZSgpID49IChpbnQpYnVmX3NpemUpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZWFkX3NpemUgKyBSZWFkTGVmdE92ZXIoYnVmZmVyLCBidWZfc2l6ZSk7Ci19Ci1GWF9EV09SRCBDUERGX1N0cmVhbUZpbHRlcjo6UmVhZExlZnRPdmVyKEZYX0xQQllURSBidWZmZXIsIEZYX0RXT1JEIGJ1Zl9zaXplKQotewotICAgIEZYX0RXT1JEIHJlYWRfc2l6ZSA9IG1fcEJ1ZmZlci0+R2V0U2l6ZSgpIC0gbV9CdWZPZmZzZXQ7Ci0gICAgaWYgKHJlYWRfc2l6ZSA+IGJ1Zl9zaXplKSB7Ci0gICAgICAgIHJlYWRfc2l6ZSA9IGJ1Zl9zaXplOwotICAgIH0KLSAgICBGWFNZU19tZW1jcHkzMihidWZmZXIsIG1fcEJ1ZmZlci0+R2V0QnVmZmVyKCkgKyBtX0J1Zk9mZnNldCwgcmVhZF9zaXplKTsKLSAgICBtX0J1Zk9mZnNldCArPSByZWFkX3NpemU7Ci0gICAgaWYgKG1fQnVmT2Zmc2V0ID09IChGWF9EV09SRCltX3BCdWZmZXItPkdldFNpemUoKSkgewotICAgICAgICBkZWxldGUgbV9wQnVmZmVyOwotICAgICAgICBtX3BCdWZmZXIgPSBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gcmVhZF9zaXplOwotfQotQ1BERl9EZWNyeXB0RmlsdGVyOjpDUERGX0RlY3J5cHRGaWx0ZXIoQ1BERl9DcnlwdG9IYW5kbGVyKiBwQ3J5cHRvSGFuZGxlciwgRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0pCi17Ci0gICAgbV9wQ3J5cHRvSGFuZGxlciA9IHBDcnlwdG9IYW5kbGVyOwotICAgIG1fcENvbnRleHQgPSBOVUxMOwotICAgIG1fT2JqTnVtID0gb2JqbnVtOwotICAgIG1fR2VuTnVtID0gZ2VubnVtOwotfQotQ1BERl9EZWNyeXB0RmlsdGVyOjp+Q1BERl9EZWNyeXB0RmlsdGVyKCkKLXsKLSAgICBDRlhfQmluYXJ5QnVmIGJ1ZjsKLSAgICBpZiAobV9wQ29udGV4dCkgewotICAgICAgICBtX3BDcnlwdG9IYW5kbGVyLT5EZWNyeXB0RmluaXNoKG1fcENvbnRleHQsIGJ1Zik7Ci0gICAgfQotfQotdm9pZCBDUERGX0RlY3J5cHRGaWx0ZXI6OnZfRmlsdGVySW4oRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpCi17Ci0gICAgaWYgKG1fcENvbnRleHQgPT0gTlVMTCkgewotICAgICAgICBtX3BDb250ZXh0ID0gbV9wQ3J5cHRvSGFuZGxlci0+RGVjcnlwdFN0YXJ0KG1fT2JqTnVtLCBtX0dlbk51bSk7Ci0gICAgfQotICAgIG1fcENyeXB0b0hhbmRsZXItPkRlY3J5cHRTdHJlYW0obV9wQ29udGV4dCwgc3JjX2J1Ziwgc3JjX3NpemUsIGRlc3RfYnVmKTsKLX0KLXZvaWQgQ1BERl9EZWNyeXB0RmlsdGVyOjp2X0ZpbHRlckZpbmlzaChDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikKLXsKLSAgICBtX2JFT0YgPSBUUlVFOwotICAgIGlmIChtX3BDb250ZXh0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX3BDcnlwdG9IYW5kbGVyLT5EZWNyeXB0RmluaXNoKG1fcENvbnRleHQsIGRlc3RfYnVmKTsKLSAgICBtX3BDb250ZXh0ID0gTlVMTDsKLX0KLWV4dGVybiAiQyIgewotICAgIHN0YXRpYyB2b2lkKiBteV9hbGxvY19mdW5jICh2b2lkKiBvcGFxdWUsIHVuc2lnbmVkIGludCBpdGVtcywgdW5zaWduZWQgaW50IHNpemUpCi0gICAgewotICAgICAgICByZXR1cm4gRlhfQWxsb2MyRChGWF9CWVRFLCBpdGVtcywgc2l6ZSk7Ci0gICAgfQotICAgIHN0YXRpYyB2b2lkICAgbXlfZnJlZV9mdW5jICAodm9pZCogb3BhcXVlLCB2b2lkKiBhZGRyZXNzKQotICAgIHsKLSAgICAgICAgRlhfRnJlZShhZGRyZXNzKTsKLSAgICB9Ci0gICAgdm9pZCogRlBERkFQSV9GbGF0ZUluaXQodm9pZCogKCphbGxvY19mdW5jKSh2b2lkKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpmcmVlX2Z1bmMpKHZvaWQqLCB2b2lkKikpOwotICAgIHZvaWQgRlBERkFQSV9GbGF0ZUlucHV0KHZvaWQqIGNvbnRleHQsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyY19idWYsIHVuc2lnbmVkIGludCBzcmNfc2l6ZSk7Ci0gICAgaW50IEZQREZBUElfRmxhdGVPdXRwdXQodm9pZCogY29udGV4dCwgdW5zaWduZWQgY2hhciogZGVzdF9idWYsIHVuc2lnbmVkIGludCBkZXN0X3NpemUpOwotICAgIGludCBGUERGQVBJX0ZsYXRlR2V0QXZhaWxJbih2b2lkKiBjb250ZXh0KTsKLSAgICBpbnQgRlBERkFQSV9GbGF0ZUdldEF2YWlsT3V0KHZvaWQqIGNvbnRleHQpOwotICAgIHZvaWQgRlBERkFQSV9GbGF0ZUVuZCh2b2lkKiBjb250ZXh0KTsKLX0KLUNQREZfRmxhdGVGaWx0ZXI6OkNQREZfRmxhdGVGaWx0ZXIoKQotewotICAgIG1fcENvbnRleHQgPSBOVUxMOwotfQotQ1BERl9GbGF0ZUZpbHRlcjo6fkNQREZfRmxhdGVGaWx0ZXIoKQotewotICAgIGlmIChtX3BDb250ZXh0KSB7Ci0gICAgICAgIEZQREZBUElfRmxhdGVFbmQobV9wQ29udGV4dCk7Ci0gICAgfQotfQotdm9pZCBDUERGX0ZsYXRlRmlsdGVyOjp2X0ZpbHRlckluKEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKQotewotICAgIGlmIChtX3BDb250ZXh0ID09IE5VTEwpIHsKLSAgICAgICAgbV9wQ29udGV4dCA9IEZQREZBUElfRmxhdGVJbml0KG15X2FsbG9jX2Z1bmMsIG15X2ZyZWVfZnVuYyk7Ci0gICAgfQotICAgIEZQREZBUElfRmxhdGVJbnB1dChtX3BDb250ZXh0LCBzcmNfYnVmLCBzcmNfc2l6ZSk7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaW50IHJldCA9IEZQREZBUElfRmxhdGVPdXRwdXQobV9wQ29udGV4dCwgbV9EZXN0QnVmZmVyLCBGUERGX0ZJTFRFUl9CVUZGRVJfU0laRSk7Ci0gICAgICAgIGludCBvdXRfc2l6ZSA9IEZQREZfRklMVEVSX0JVRkZFUl9TSVpFIC0gRlBERkFQSV9GbGF0ZUdldEF2YWlsT3V0KG1fcENvbnRleHQpOwotICAgICAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jayhtX0Rlc3RCdWZmZXIsIG91dF9zaXplKTsKLSAgICAgICAgaWYgKHJldCA9PSBaX0JVRl9FUlJPUikgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldCAhPSBaX09LKSB7Ci0gICAgICAgICAgICBSZXBvcnRFT0YoRlBERkFQSV9GbGF0ZUdldEF2YWlsSW4obV9wQ29udGV4dCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1DUERGX0x6d0ZpbHRlcjo6Q1BERl9MendGaWx0ZXIoRlhfQk9PTCBiRWFybHlDaGFuZ2UpCi17Ci0gICAgbV9iRWFybHlDaGFuZ2UgPSBiRWFybHlDaGFuZ2UgPyAxIDogMDsKLSAgICBtX0NvZGVMZW4gPSA5OwotICAgIG1fbkNvZGVzID0gMDsKLSAgICBtX25MZWZ0Qml0cyA9IDA7Ci0gICAgbV9MZWZ0Qml0cyA9IDA7Ci0gICAgbV9PbGRDb2RlID0gKEZYX0RXT1JEKSAtIDE7Ci19Ci12b2lkIENQREZfTHp3RmlsdGVyOjp2X0ZpbHRlckluKEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKQotewotICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBzcmNfc2l6ZTsgaSArKykgewotICAgICAgICBpZiAobV9uTGVmdEJpdHMgKyA4IDwgbV9Db2RlTGVuKSB7Ci0gICAgICAgICAgICBtX25MZWZ0Qml0cyArPSA4OwotICAgICAgICAgICAgbV9MZWZ0Qml0cyA9IChtX0xlZnRCaXRzIDw8IDgpIHwgc3JjX2J1ZltpXTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEZYX0RXT1JEIG5ld19iaXRzID0gbV9Db2RlTGVuIC0gbV9uTGVmdEJpdHM7Ci0gICAgICAgIEZYX0RXT1JEIGNvZGUgPSAobV9MZWZ0Qml0cyA8PCBuZXdfYml0cykgfCAoc3JjX2J1ZltpXSA+PiAoOCAtIG5ld19iaXRzKSk7Ci0gICAgICAgIG1fbkxlZnRCaXRzID0gOCAtIG5ld19iaXRzOwotICAgICAgICBtX0xlZnRCaXRzID0gc3JjX2J1ZltpXSAlICgxIDw8IG1fbkxlZnRCaXRzKTsKLSAgICAgICAgaWYgKGNvZGUgPCAyNTYpIHsKLSAgICAgICAgICAgIGRlc3RfYnVmLkFwcGVuZEJ5dGUoKEZYX0JZVEUpY29kZSk7Ci0gICAgICAgICAgICBtX0xhc3RDaGFyID0gKEZYX0JZVEUpY29kZTsKLSAgICAgICAgICAgIGlmIChtX09sZENvZGUgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBBZGRDb2RlKG1fT2xkQ29kZSwgbV9MYXN0Q2hhcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX09sZENvZGUgPSBjb2RlOwotICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gMjU2KSB7Ci0gICAgICAgICAgICBtX0NvZGVMZW4gPSA5OwotICAgICAgICAgICAgbV9uQ29kZXMgPSAwOwotICAgICAgICAgICAgbV9PbGRDb2RlID0gKEZYX0RXT1JEKSAtIDE7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSAyNTcpIHsKLSAgICAgICAgICAgIFJlcG9ydEVPRihzcmNfc2l6ZSAtIGkgLSAxKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtX09sZENvZGUgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBSZXBvcnRFT0Yoc3JjX3NpemUgLSBpIC0gMSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9TdGFja0xlbiA9IDA7Ci0gICAgICAgICAgICBpZiAoY29kZSA+PSBtX25Db2RlcyArIDI1OCkgewotICAgICAgICAgICAgICAgIGlmIChtX1N0YWNrTGVuIDwgc2l6ZW9mKG1fRGVjb2RlU3RhY2spKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fRGVjb2RlU3RhY2tbbV9TdGFja0xlbisrXSA9IG1fTGFzdENoYXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIERlY29kZVN0cmluZyhtX09sZENvZGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBEZWNvZGVTdHJpbmcoY29kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jayhOVUxMLCBtX1N0YWNrTGVuKTsKLSAgICAgICAgICAgIEZYX0xQQllURSBwT3V0cHV0ID0gZGVzdF9idWYuR2V0QnVmZmVyKCkgKyBkZXN0X2J1Zi5HZXRTaXplKCkgLSBtX1N0YWNrTGVuOwotICAgICAgICAgICAgZm9yIChGWF9EV09SRCBjYyA9IDA7IGNjIDwgbV9TdGFja0xlbjsgY2MgKyspIHsKLSAgICAgICAgICAgICAgICBwT3V0cHV0W2NjXSA9IG1fRGVjb2RlU3RhY2tbbV9TdGFja0xlbiAtIGNjIC0gMV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX0xhc3RDaGFyID0gbV9EZWNvZGVTdGFja1ttX1N0YWNrTGVuIC0gMV07Ci0gICAgICAgICAgICBpZiAobV9PbGRDb2RlIDwgMjU2KSB7Ci0gICAgICAgICAgICAgICAgQWRkQ29kZShtX09sZENvZGUsIG1fTGFzdENoYXIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtX09sZENvZGUgLSAyNTggPj0gbV9uQ29kZXMpIHsKLSAgICAgICAgICAgICAgICBSZXBvcnRFT0Yoc3JjX3NpemUgLSBpIC0gMSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBZGRDb2RlKG1fT2xkQ29kZSwgbV9MYXN0Q2hhcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX09sZENvZGUgPSBjb2RlOwotICAgICAgICB9Ci0gICAgfQotfQotdm9pZCBDUERGX0x6d0ZpbHRlcjo6QWRkQ29kZShGWF9EV09SRCBwcmVmaXhfY29kZSwgRlhfQllURSBhcHBlbmRfY2hhcikKLXsKLSAgICBpZiAobV9uQ29kZXMgKyBtX2JFYXJseUNoYW5nZSA9PSA0MDk0KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9Db2RlQXJyYXlbbV9uQ29kZXMgKytdID0gKHByZWZpeF9jb2RlIDw8IDE2KSB8IGFwcGVuZF9jaGFyOwotICAgIGlmIChtX25Db2RlcyArIG1fYkVhcmx5Q2hhbmdlID09IDUxMiAtIDI1OCkgewotICAgICAgICBtX0NvZGVMZW4gPSAxMDsKLSAgICB9IGVsc2UgaWYgKG1fbkNvZGVzICsgbV9iRWFybHlDaGFuZ2UgPT0gMTAyNCAtIDI1OCkgewotICAgICAgICBtX0NvZGVMZW4gPSAxMTsKLSAgICB9IGVsc2UgaWYgKG1fbkNvZGVzICsgbV9iRWFybHlDaGFuZ2UgPT0gMjA0OCAtIDI1OCkgewotICAgICAgICBtX0NvZGVMZW4gPSAxMjsKLSAgICB9Ci19Ci12b2lkIENQREZfTHp3RmlsdGVyOjpEZWNvZGVTdHJpbmcoRlhfRFdPUkQgY29kZSkKLXsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpbnQgaW5kZXggPSBjb2RlIC0gMjU4OwotICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IChpbnQpbV9uQ29kZXMpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIEZYX0RXT1JEIGRhdGEgPSBtX0NvZGVBcnJheVtpbmRleF07Ci0gICAgICAgIGlmIChtX1N0YWNrTGVuID49IHNpemVvZihtX0RlY29kZVN0YWNrKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1fRGVjb2RlU3RhY2tbbV9TdGFja0xlbisrXSA9IChGWF9CWVRFKWRhdGE7Ci0gICAgICAgIGNvZGUgPSBkYXRhID4+IDE2OwotICAgIH0KLSAgICBpZiAobV9TdGFja0xlbiA+PSBzaXplb2YobV9EZWNvZGVTdGFjaykpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX0RlY29kZVN0YWNrW21fU3RhY2tMZW4rK10gPSAoRlhfQllURSljb2RlOwotfQotQ1BERl9QcmVkaWN0b3JGaWx0ZXI6OkNQREZfUHJlZGljdG9yRmlsdGVyKGludCBwcmVkaWN0b3IsIGludCBjb2xvcnMsIGludCBicGMsIGludCBjb2xzKQotewotICAgIG1fYlRpZmYgPSBwcmVkaWN0b3IgPCAxMDsKLSAgICBtX3BSZWZMaW5lID0gTlVMTDsKLSAgICBtX3BDdXJMaW5lID0gTlVMTDsKLSAgICBtX2lMaW5lID0gMDsKLSAgICBtX0xpbmVJblNpemUgPSAwOwotICAgIG1fQnBwID0gKGNvbG9ycyAqIGJwYyArIDcpIC8gODsKLSAgICBtX1BpdGNoID0gKGNvbG9ycyAqIGJwYyAqIGNvbHMgKyA3KSAvIDg7Ci0gICAgaWYgKCFtX2JUaWZmKSB7Ci0gICAgICAgIG1fUGl0Y2ggKys7Ci0gICAgfQotfQotQ1BERl9QcmVkaWN0b3JGaWx0ZXI6On5DUERGX1ByZWRpY3RvckZpbHRlcigpCi17Ci0gICAgaWYgKG1fcEN1ckxpbmUpIHsKLSAgICAgICAgRlhfRnJlZShtX3BDdXJMaW5lKTsKLSAgICB9Ci0gICAgaWYgKG1fcFJlZkxpbmUpIHsKLSAgICAgICAgRlhfRnJlZShtX3BSZWZMaW5lKTsKLSAgICB9Ci19Ci1zdGF0aWMgRlhfQllURSBQYWV0aFByZWRpY3RvcihpbnQgYSwgaW50IGIsIGludCBjKQotewotICAgIGludCBwID0gYSArIGIgLSBjOwotICAgIGludCBwYSA9IEZYU1lTX2FicyhwIC0gYSk7Ci0gICAgaW50IHBiID0gRlhTWVNfYWJzKHAgLSBiKTsKLSAgICBpbnQgcGMgPSBGWFNZU19hYnMocCAtIGMpOwotICAgIGlmIChwYSA8PSBwYiAmJiBwYSA8PSBwYykgewotICAgICAgICByZXR1cm4gKEZYX0JZVEUpYTsKLSAgICB9Ci0gICAgaWYgKHBiIDw9IHBjKSB7Ci0gICAgICAgIHJldHVybiAoRlhfQllURSliOwotICAgIH0KLSAgICByZXR1cm4gKEZYX0JZVEUpYzsKLX0KLXN0YXRpYyB2b2lkIFBOR19QcmVkaWN0b3JMaW5lKEZYX0xQQllURSBjdXJfYnVmLCBGWF9MUEJZVEUgcmVmX2J1ZiwgaW50IHBpdGNoLCBpbnQgQnBwKQotewotICAgIEZYX0JZVEUgdGFnID0gY3VyX2J1ZlswXTsKLSAgICBpZiAodGFnID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjdXJfYnVmICsrOwotICAgIGlmIChyZWZfYnVmKSB7Ci0gICAgICAgIHJlZl9idWYgKys7Ci0gICAgfQotICAgIGZvciAoaW50IGJ5dGUgPSAwOyBieXRlIDwgcGl0Y2g7IGJ5dGUgKyspIHsKLSAgICAgICAgRlhfQllURSByYXdfYnl0ZSA9IGN1cl9idWZbYnl0ZV07Ci0gICAgICAgIHN3aXRjaCAodGFnKSB7Ci0gICAgICAgICAgICBjYXNlIDE6CXsKLSAgICAgICAgICAgICAgICAgICAgRlhfQllURSBsZWZ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPj0gQnBwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gY3VyX2J1ZltieXRlIC0gQnBwXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjdXJfYnVmW2J5dGVdID0gcmF3X2J5dGUgKyBsZWZ0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIDI6IHsKLSAgICAgICAgICAgICAgICAgICAgRlhfQllURSB1cCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWZfYnVmKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCA9IHJlZl9idWZbYnl0ZV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY3VyX2J1ZltieXRlXSA9IHJhd19ieXRlICsgdXA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgMzogewotICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGxlZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA+PSBCcHApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBjdXJfYnVmW2J5dGUgLSBCcHBdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgdXAgPSAwOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVmX2J1ZikgewotICAgICAgICAgICAgICAgICAgICAgICAgdXAgPSByZWZfYnVmW2J5dGVdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGN1cl9idWZbYnl0ZV0gPSByYXdfYnl0ZSArICh1cCArIGxlZnQpIC8gMjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSA0OiB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChieXRlID49IEJwcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGN1cl9idWZbYnl0ZSAtIEJwcF07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgRlhfQllURSB1cCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWZfYnVmKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCA9IHJlZl9idWZbYnl0ZV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgRlhfQllURSB1cHBlcl9sZWZ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPj0gQnBwICYmIHJlZl9idWYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyX2xlZnQgPSByZWZfYnVmW2J5dGUgLSBCcHBdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGN1cl9idWZbYnl0ZV0gPSByYXdfYnl0ZSArIFBhZXRoUHJlZGljdG9yKGxlZnQsIHVwLCB1cHBlcl9sZWZ0KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotdm9pZCBDUERGX1ByZWRpY3RvckZpbHRlcjo6dl9GaWx0ZXJJbihGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikKLXsKLSAgICBpZiAobV9wQ3VyTGluZSA9PSBOVUxMKSB7Ci0gICAgICAgIG1fcEN1ckxpbmUgPSBGWF9BbGxvYyhGWF9CWVRFLCBtX1BpdGNoKTsKLSAgICAgICAgaWYgKCFtX2JUaWZmKSB7Ci0gICAgICAgICAgICBtX3BSZWZMaW5lID0gRlhfQWxsb2MoRlhfQllURSwgbV9QaXRjaCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgRlhfRFdPUkQgcmVhZF9zaXplID0gbV9QaXRjaCAtIG1fTGluZUluU2l6ZTsKLSAgICAgICAgaWYgKHJlYWRfc2l6ZSA+IHNyY19zaXplKSB7Ci0gICAgICAgICAgICByZWFkX3NpemUgPSBzcmNfc2l6ZTsKLSAgICAgICAgfQotICAgICAgICBGWFNZU19tZW1jcHkzMihtX3BDdXJMaW5lICsgbV9MaW5lSW5TaXplLCBzcmNfYnVmLCByZWFkX3NpemUpOwotICAgICAgICBtX0xpbmVJblNpemUgKz0gcmVhZF9zaXplOwotICAgICAgICBpZiAobV9MaW5lSW5TaXplIDwgbV9QaXRjaCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgc3JjX2J1ZiArPSByZWFkX3NpemU7Ci0gICAgICAgIHNyY19zaXplIC09IHJlYWRfc2l6ZTsKLSAgICAgICAgaWYgKG1fYlRpZmYpIHsKLSAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgYnl0ZSA9IG1fQnBwOyBieXRlIDwgbV9QaXRjaDsgYnl0ZSArKykgewotICAgICAgICAgICAgICAgIG1fcEN1ckxpbmVbYnl0ZV0gKz0gbV9wQ3VyTGluZVtieXRlIC0gbV9CcHBdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9idWYuQXBwZW5kQmxvY2sobV9wQ3VyTGluZSwgbV9QaXRjaCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBQTkdfUHJlZGljdG9yTGluZShtX3BDdXJMaW5lLCBtX2lMaW5lID8gbV9wUmVmTGluZSA6IE5VTEwsIG1fUGl0Y2ggLSAxLCBtX0JwcCk7Ci0gICAgICAgICAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jayhtX3BDdXJMaW5lICsgMSwgbV9QaXRjaCAtIDEpOwotICAgICAgICAgICAgbV9pTGluZSArKzsKLSAgICAgICAgICAgIEZYX0xQQllURSB0ZW1wID0gbV9wQ3VyTGluZTsKLSAgICAgICAgICAgIG1fcEN1ckxpbmUgPSBtX3BSZWZMaW5lOwotICAgICAgICAgICAgbV9wUmVmTGluZSA9IHRlbXA7Ci0gICAgICAgIH0KLSAgICAgICAgbV9MaW5lSW5TaXplID0gMDsKLSAgICB9Ci19Ci1DUERGX0FzY2lpODVGaWx0ZXI6OkNQREZfQXNjaWk4NUZpbHRlcigpCi17Ci0gICAgbV9TdGF0ZSA9IDA7Ci0gICAgbV9DaGFyQ291bnQgPSAwOwotfQotdm9pZCBDUERGX0FzY2lpODVGaWx0ZXI6OnZfRmlsdGVySW4oRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpCi17Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHNyY19zaXplOyBpICsrKSB7Ci0gICAgICAgIEZYX0JZVEUgYnl0ZSA9IHNyY19idWZbaV07Ci0gICAgICAgIGlmIChQREZfQ2hhclR5cGVbYnl0ZV0gPT0gJ1cnKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKG1fU3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBpZiAoYnl0ZSA+PSAnIScgJiYgYnl0ZSA8PSAndScpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGRpZ2l0ID0gYnl0ZSAtICchJzsKLSAgICAgICAgICAgICAgICAgICAgbV9DdXJEV29yZCA9IGRpZ2l0OwotICAgICAgICAgICAgICAgICAgICBtX0NoYXJDb3VudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIG1fU3RhdGUgPSAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA9PSAneicpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHplcm8gPSAwOwotICAgICAgICAgICAgICAgICAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jaygmemVybywgNCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChieXRlID09ICd+JykgewotICAgICAgICAgICAgICAgICAgICBtX1N0YXRlID0gMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPj0gJyEnICYmIGJ5dGUgPD0gJ3UnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlnaXQgPSBieXRlIC0gJyEnOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9DdXJEV29yZCA9IG1fQ3VyRFdvcmQgKiA4NSArIGRpZ2l0OwotICAgICAgICAgICAgICAgICAgICAgICAgbV9DaGFyQ291bnQgKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9DaGFyQ291bnQgPT0gNSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2J1Zi5BcHBlbmRCeXRlKChGWF9CWVRFKShtX0N1ckRXb3JkID4+ICgzIC0gaSkgKiA4KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU3RhdGUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gJ34nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9DaGFyQ291bnQgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gbV9DaGFyQ291bnQ7IGkgPCA1OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3VyRFdvcmQgPSBtX0N1ckRXb3JkICogODUgKyA4NDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1fQ2hhckNvdW50IC0gMTsgaSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2J1Zi5BcHBlbmRCeXRlKChGWF9CWVRFKShtX0N1ckRXb3JkID4+ICgzIC0gaSkgKiA4KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbV9TdGF0ZSA9IDI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIGlmIChieXRlID09ICc+JykgewotICAgICAgICAgICAgICAgICAgICBSZXBvcnRFT0Yoc3JjX3NpemUgLSBpIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1DUERGX0FzY2lpSGV4RmlsdGVyOjpDUERGX0FzY2lpSGV4RmlsdGVyKCkKLXsKLSAgICBtX1N0YXRlID0gMDsKLX0KLXZvaWQgQ1BERl9Bc2NpaUhleEZpbHRlcjo6dl9GaWx0ZXJJbihGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikKLXsKLSAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgc3JjX3NpemU7IGkgKyspIHsKLSAgICAgICAgRlhfQllURSBieXRlID0gc3JjX2J1ZltpXTsKLSAgICAgICAgaWYgKFBERl9DaGFyVHlwZVtieXRlXSA9PSAnVycpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludCBkaWdpdDsKLSAgICAgICAgaWYgKGJ5dGUgPj0gJzAnICYmIGJ5dGUgPD0gJzknKSB7Ci0gICAgICAgICAgICBkaWdpdCA9IGJ5dGUgLSAnMCc7Ci0gICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA+PSAnYScgJiYgYnl0ZSA8PSAnZicpIHsKLSAgICAgICAgICAgIGRpZ2l0ID0gYnl0ZSAtICdhJyArIDEwOwotICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPj0gJ0EnICYmIGJ5dGUgPD0gJ0YnKSB7Ci0gICAgICAgICAgICBkaWdpdCA9IGJ5dGUgLSAnQScgKyAxMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtX1N0YXRlKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9idWYuQXBwZW5kQnl0ZShtX0ZpcnN0RGlnaXQgKiAxNik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBSZXBvcnRFT0Yoc3JjX3NpemUgLSBpIC0gMSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fU3RhdGUgPT0gMCkgewotICAgICAgICAgICAgbV9GaXJzdERpZ2l0ID0gZGlnaXQ7Ci0gICAgICAgICAgICBtX1N0YXRlICsrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVzdF9idWYuQXBwZW5kQnl0ZShtX0ZpcnN0RGlnaXQgKiAxNiArIGRpZ2l0KTsKLSAgICAgICAgICAgIG1fU3RhdGUgLS07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1DUERGX1J1bkxlbkZpbHRlcjo6Q1BERl9SdW5MZW5GaWx0ZXIoKQotewotICAgIG1fU3RhdGUgPSAwOwotICAgIG1fQ291bnQgPSAwOwotfQotdm9pZCBDUERGX1J1bkxlbkZpbHRlcjo6dl9GaWx0ZXJJbihGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikKLXsKLSAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgc3JjX3NpemU7IGkgKyspIHsKLSAgICAgICAgRlhfQllURSBieXRlID0gc3JjX2J1ZltpXTsKLSAgICAgICAgc3dpdGNoIChtX1N0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgaWYgKGJ5dGUgPCAxMjgpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9TdGF0ZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIG1fQ291bnQgPSBieXRlICsgMTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gMTI4KSB7Ci0gICAgICAgICAgICAgICAgICAgIFJlcG9ydEVPRihzcmNfc2l6ZSAtIGkgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fU3RhdGUgPSAyOwotICAgICAgICAgICAgICAgICAgICBtX0NvdW50ID0gMjU3IC0gYnl0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgZGVzdF9idWYuQXBwZW5kQnl0ZShieXRlKTsKLSAgICAgICAgICAgICAgICBtX0NvdW50IC0tOwotICAgICAgICAgICAgICAgIGlmIChtX0NvdW50ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbV9TdGF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyOgl7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfYnVmLkFwcGVuZEJsb2NrKE5VTEwsIG1fQ291bnQpOwotICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQ4KGRlc3RfYnVmLkdldEJ1ZmZlcigpICsgZGVzdF9idWYuR2V0U2l6ZSgpIC0gbV9Db3VudCwgYnl0ZSwgbV9Db3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIG1fU3RhdGUgPSAwOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1DUERGX0pwZWdGaWx0ZXI6OkNQREZfSnBlZ0ZpbHRlcigpCi17Ci0gICAgbV9wQ29udGV4dCA9IE5VTEw7Ci0gICAgbV9iR290SGVhZGVyID0gRkFMU0U7Ci0gICAgbV9wU2NhbmxpbmUgPSBOVUxMOwotICAgIG1faUxpbmUgPSAwOwotfQotQ1BERl9KcGVnRmlsdGVyOjp+Q1BERl9KcGVnRmlsdGVyKCkKLXsKLSAgICBpZiAobV9wU2NhbmxpbmUpIHsKLSAgICAgICAgRlhfRnJlZShtX3BTY2FubGluZSk7Ci0gICAgfQotICAgIGlmIChtX3BDb250ZXh0KSB7Ci0gICAgICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SnBlZ01vZHVsZSgpLT5GaW5pc2gobV9wQ29udGV4dCk7Ci0gICAgfQotfQotdm9pZCBDUERGX0pwZWdGaWx0ZXI6OnZfRmlsdGVySW4oRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpCi17Ci0gICAgaWYgKG1fcENvbnRleHQgPT0gTlVMTCkgewotICAgICAgICBtX3BDb250ZXh0ID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRKcGVnTW9kdWxlKCktPlN0YXJ0KCk7Ci0gICAgfQotICAgIEZYX0xQQ0JZVEUganBlZ19zcmNfYnVmOwotICAgIEZYX0RXT1JEIGpwZWdfc3JjX3NpemU7Ci0gICAgQ0ZYX0JpbmFyeUJ1ZiB0ZW1wX2J1ZjsKLSAgICBpZiAobV9JbnB1dEJ1Zi5HZXRTaXplKCkpIHsKLSAgICAgICAgdGVtcF9idWYuRXN0aW1hdGVTaXplKG1fSW5wdXRCdWYuR2V0U2l6ZSgpICsgc3JjX3NpemUpOwotICAgICAgICB0ZW1wX2J1Zi5BcHBlbmRCbG9jayhtX0lucHV0QnVmLkdldEJ1ZmZlcigpLCBtX0lucHV0QnVmLkdldFNpemUoKSk7Ci0gICAgICAgIG1fSW5wdXRCdWYuQ2xlYXIoKTsKLSAgICAgICAgdGVtcF9idWYuQXBwZW5kQmxvY2soc3JjX2J1Ziwgc3JjX3NpemUpOwotICAgICAgICBqcGVnX3NyY19idWYgPSB0ZW1wX2J1Zi5HZXRCdWZmZXIoKTsKLSAgICAgICAganBlZ19zcmNfc2l6ZSA9IHRlbXBfYnVmLkdldFNpemUoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBqcGVnX3NyY19idWYgPSBzcmNfYnVmOwotICAgICAgICBqcGVnX3NyY19zaXplID0gc3JjX3NpemU7Ci0gICAgfQotICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SnBlZ01vZHVsZSgpLT5JbnB1dChtX3BDb250ZXh0LCBqcGVnX3NyY19idWYsIGpwZWdfc3JjX3NpemUpOwotICAgIGlmICghbV9iR290SGVhZGVyKSB7Ci0gICAgICAgIGludCByZXQgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKS0+UmVhZEhlYWRlcihtX3BDb250ZXh0LCAmbV9XaWR0aCwgJm1fSGVpZ2h0LCAmbV9uQ29tcHMpOwotICAgICAgICBpbnQgbGVmdF9zaXplID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRKcGVnTW9kdWxlKCktPkdldEF2YWlsSW5wdXQobV9wQ29udGV4dCk7Ci0gICAgICAgIGlmIChyZXQgPT0gMSkgewotICAgICAgICAgICAgUmVwb3J0RU9GKGxlZnRfc2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldCA9PSAyKSB7Ci0gICAgICAgICAgICBtX0lucHV0QnVmLkFwcGVuZEJsb2NrKGpwZWdfc3JjX2J1ZiArIGpwZWdfc3JjX3NpemUgLSBsZWZ0X3NpemUsIGxlZnRfc2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRKcGVnTW9kdWxlKCktPlN0YXJ0U2NhbmxpbmUobV9wQ29udGV4dCwgMSk7Ci0gICAgICAgIG1fYkdvdEhlYWRlciA9IFRSVUU7Ci0gICAgICAgIG1fUGl0Y2ggPSBtX1dpZHRoICogbV9uQ29tcHM7Ci0gICAgfQotICAgIGlmIChtX3BTY2FubGluZSA9PSBOVUxMKSB7Ci0gICAgICAgIG1fcFNjYW5saW5lID0gRlhfQWxsb2MoRlhfQllURSwgbV9QaXRjaCArIDQpOwotICAgIH0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoIUNQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SnBlZ01vZHVsZSgpLT5SZWFkU2NhbmxpbmUobV9wQ29udGV4dCwgbV9wU2NhbmxpbmUpKSB7Ci0gICAgICAgICAgICBpbnQgbGVmdF9zaXplID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRKcGVnTW9kdWxlKCktPkdldEF2YWlsSW5wdXQobV9wQ29udGV4dCk7Ci0gICAgICAgICAgICBtX0lucHV0QnVmLkFwcGVuZEJsb2NrKGpwZWdfc3JjX2J1ZiArIGpwZWdfc3JjX3NpemUgLSBsZWZ0X3NpemUsIGxlZnRfc2l6ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jayhtX3BTY2FubGluZSwgbV9QaXRjaCk7Ci0gICAgICAgIG1faUxpbmUgKys7Ci0gICAgICAgIGlmIChtX2lMaW5lID09IG1fSGVpZ2h0KSB7Ci0gICAgICAgICAgICBSZXBvcnRFT0YoQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRKcGVnTW9kdWxlKCktPkdldEF2YWlsSW5wdXQobV9wQ29udGV4dCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotfQotQ1BERl9GYXhGaWx0ZXI6OkNQREZfRmF4RmlsdGVyKCkKLXsKLSAgICBtX0VuY29kaW5nID0gMDsKLSAgICBtX2JFbmRPZkxpbmUgPSBGQUxTRTsKLSAgICBtX2JCeXRlQWxpZ24gPSBGQUxTRTsKLSAgICBtX2JCbGFjayA9IEZBTFNFOwotICAgIG1fblJvd3MgPSAwOwotICAgIG1fbkNvbHVtbnMgPSAwOwotICAgIG1fUGl0Y2ggPSAwOwotICAgIG1fcFNjYW5saW5lQnVmID0gTlVMTDsKLSAgICBtX3BSZWZCdWYgPSBOVUxMOwotICAgIG1faVJvdyA9IDA7Ci0gICAgbV9JbnB1dEJpdFBvcyA9IDA7Ci19Ci1DUERGX0ZheEZpbHRlcjo6fkNQREZfRmF4RmlsdGVyKCkKLXsKLSAgICBpZiAobV9wU2NhbmxpbmVCdWYpIHsKLSAgICAgICAgRlhfRnJlZShtX3BTY2FubGluZUJ1Zik7Ci0gICAgfQotICAgIGlmIChtX3BSZWZCdWYpIHsKLSAgICAgICAgRlhfRnJlZShtX3BSZWZCdWYpOwotICAgIH0KLX0KLUZYX0JPT0wgQ1BERl9GYXhGaWx0ZXI6OkluaXRpYWxpemUoaW50IEVuY29kaW5nLCBpbnQgYkVuZE9mTGluZSwgaW50IGJCeXRlQWxpZ24sIGludCBiQmxhY2ssIGludCBuUm93cywgaW50IG5Db2x1bW5zKQotewotICAgIG1fRW5jb2RpbmcgPSBFbmNvZGluZzsKLSAgICBtX2JFbmRPZkxpbmUgPSBiRW5kT2ZMaW5lOwotICAgIG1fYkJ5dGVBbGlnbiA9IGJCeXRlQWxpZ247Ci0gICAgbV9iQmxhY2sgPSBiQmxhY2s7Ci0gICAgbV9uUm93cyA9IG5Sb3dzOwotICAgIG1fbkNvbHVtbnMgPSBuQ29sdW1uczsKLSAgICBtX1BpdGNoID0gKG1fbkNvbHVtbnMgKyA3KSAvIDg7Ci0gICAgbV9wU2NhbmxpbmVCdWYgPSBGWF9BbGxvYyhGWF9CWVRFLCBtX1BpdGNoKTsKLSAgICBtX3BSZWZCdWYgPSBGWF9BbGxvYyhGWF9CWVRFLCBtX1BpdGNoKTsKLSAgICBGWFNZU19tZW1zZXQ4KG1fcFNjYW5saW5lQnVmLCAweGZmLCBtX1BpdGNoKTsKLSAgICBGWFNZU19tZW1zZXQ4KG1fcFJlZkJ1ZiwgMHhmZiwgbV9QaXRjaCk7Ci0gICAgbV9pUm93ID0gMDsKLSAgICBtX0lucHV0Qml0UG9zID0gMDsKLSAgICByZXR1cm4gVFJVRTsKLX0KLXZvaWQgQ1BERl9GYXhGaWx0ZXI6OnZfRmlsdGVySW4oRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpCi17Ci0gICAgRlhfTFBDQllURSBmYXhfc3JjX2J1ZjsKLSAgICBGWF9EV09SRCBmYXhfc3JjX3NpemU7Ci0gICAgQ0ZYX0JpbmFyeUJ1ZiB0ZW1wX2J1ZjsKLSAgICBpbnQgYml0cG9zOwotICAgIGlmIChtX0lucHV0QnVmLkdldFNpemUoKSkgewotICAgICAgICB0ZW1wX2J1Zi5Fc3RpbWF0ZVNpemUobV9JbnB1dEJ1Zi5HZXRTaXplKCkgKyBzcmNfc2l6ZSk7Ci0gICAgICAgIHRlbXBfYnVmLkFwcGVuZEJsb2NrKG1fSW5wdXRCdWYuR2V0QnVmZmVyKCksIG1fSW5wdXRCdWYuR2V0U2l6ZSgpKTsKLSAgICAgICAgbV9JbnB1dEJ1Zi5DbGVhcigpOwotICAgICAgICB0ZW1wX2J1Zi5BcHBlbmRCbG9jayhzcmNfYnVmLCBzcmNfc2l6ZSk7Ci0gICAgICAgIGZheF9zcmNfYnVmID0gdGVtcF9idWYuR2V0QnVmZmVyKCk7Ci0gICAgICAgIGZheF9zcmNfc2l6ZSA9IHRlbXBfYnVmLkdldFNpemUoKTsKLSAgICAgICAgYml0cG9zID0gbV9JbnB1dEJpdFBvczsKLSAgICB9IGVsc2UgewotICAgICAgICBmYXhfc3JjX2J1ZiA9IHNyY19idWY7Ci0gICAgICAgIGZheF9zcmNfc2l6ZSA9IHNyY19zaXplOwotICAgICAgICBiaXRwb3MgPSAwOwotICAgIH0KLSAgICBQcm9jZXNzRGF0YShmYXhfc3JjX2J1ZiwgZmF4X3NyY19zaXplLCBiaXRwb3MsIEZBTFNFLCBkZXN0X2J1Zik7Ci0gICAgaW50IGxlZnRfYml0cyA9IGZheF9zcmNfc2l6ZSAqIDggLSBiaXRwb3M7Ci0gICAgbV9JbnB1dEJ1Zi5BcHBlbmRCbG9jayhmYXhfc3JjX2J1ZiArIGJpdHBvcyAvIDgsIChsZWZ0X2JpdHMgKyA3KSAvIDgpOwotICAgIG1fSW5wdXRCaXRQb3MgPSBiaXRwb3MgJSA4OwotfQotdm9pZCBDUERGX0ZheEZpbHRlcjo6dl9GaWx0ZXJGaW5pc2goQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpCi17Ci0gICAgUHJvY2Vzc0RhdGEobV9JbnB1dEJ1Zi5HZXRCdWZmZXIoKSwgbV9JbnB1dEJ1Zi5HZXRTaXplKCksIG1fSW5wdXRCaXRQb3MsIFRSVUUsIGRlc3RfYnVmKTsKLX0KLUZYX0JPT0wgX0ZheFNraXBFT0woY29uc3QgRlhfQllURSogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zKTsKLUZYX0JPT0wgX0ZheEc0R2V0Um93KGNvbnN0IEZYX0JZVEUqIHNyY19idWYsIGludCBiaXRzaXplLCBpbnQmIGJpdHBvcywgRlhfTFBCWVRFIGRlc3RfYnVmLCBjb25zdCBGWF9CWVRFKiByZWZfYnVmLCBpbnQgY29sdW1ucyk7Ci1GWF9CT09MIF9GYXhHZXQxRExpbmUoY29uc3QgRlhfQllURSogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zLCBGWF9MUEJZVEUgZGVzdF9idWYsIGludCBjb2x1bW5zKTsKLXZvaWQgQ1BERl9GYXhGaWx0ZXI6OlByb2Nlc3NEYXRhKEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCYgYml0cG9zLCBGWF9CT09MIGJGaW5pc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikKLXsKLSAgICBpbnQgYml0c2l6ZSA9IHNyY19zaXplICogODsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoKGJpdHNpemUgPCBiaXRwb3MgKyAyNTYpICYmICFiRmluaXNoKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHN0YXJ0X2JpdHBvcyA9IGJpdHBvczsKLSAgICAgICAgRlhTWVNfbWVtc2V0OChtX3BTY2FubGluZUJ1ZiwgMHhmZiwgbV9QaXRjaCk7Ci0gICAgICAgIGlmICghUmVhZExpbmUoc3JjX2J1ZiwgYml0c2l6ZSwgYml0cG9zKSkgewotICAgICAgICAgICAgYml0cG9zID0gc3RhcnRfYml0cG9zOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX0VuY29kaW5nKSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkzMihtX3BSZWZCdWYsIG1fcFNjYW5saW5lQnVmLCBtX1BpdGNoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9iQmxhY2spIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9QaXRjaDsgaSArKykgewotICAgICAgICAgICAgICAgIG1fcFNjYW5saW5lQnVmW2ldID0gfm1fcFNjYW5saW5lQnVmW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRlc3RfYnVmLkFwcGVuZEJsb2NrKG1fcFNjYW5saW5lQnVmLCBtX1BpdGNoKTsKLSAgICAgICAgbV9pUm93ICsrOwotICAgICAgICBpZiAobV9pUm93ID09IG1fblJvd3MpIHsKLSAgICAgICAgICAgIFJlcG9ydEVPRihzcmNfc2l6ZSAtIChiaXRwb3MgKyA3KSAvIDgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotfQotRlhfQk9PTCBDUERGX0ZheEZpbHRlcjo6UmVhZExpbmUoRlhfTFBDQllURSBzcmNfYnVmLCBpbnQgYml0c2l6ZSwgaW50JiBiaXRwb3MpCi17Ci0gICAgaWYgKCFfRmF4U2tpcEVPTChzcmNfYnVmLCBiaXRzaXplLCBiaXRwb3MpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfQk9PTCByZXQ7Ci0gICAgaWYgKG1fRW5jb2RpbmcgPCAwKSB7Ci0gICAgICAgIHJldCA9IF9GYXhHNEdldFJvdyhzcmNfYnVmLCBiaXRzaXplLCBiaXRwb3MsIG1fcFNjYW5saW5lQnVmLCBtX3BSZWZCdWYsIG1fbkNvbHVtbnMpOwotICAgIH0gZWxzZSBpZiAobV9FbmNvZGluZyA9PSAwKSB7Ci0gICAgICAgIHJldCA9IF9GYXhHZXQxRExpbmUoc3JjX2J1ZiwgYml0c2l6ZSwgYml0cG9zLCBtX3BTY2FubGluZUJ1ZiwgbV9uQ29sdW1ucyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGJpdHBvcyA9PSBiaXRzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfQk9PTCBiTmV4dDFEID0gc3JjX2J1ZltiaXRwb3MgLyA4XSAmICgxIDw8ICg3IC0gYml0cG9zICUgOCkpOwotICAgICAgICBiaXRwb3MgKys7Ci0gICAgICAgIGlmIChiTmV4dDFEKSB7Ci0gICAgICAgICAgICByZXQgPSBfRmF4R2V0MURMaW5lKHNyY19idWYsIGJpdHNpemUsIGJpdHBvcywgbV9wU2NhbmxpbmVCdWYsIG1fbkNvbHVtbnMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ID0gX0ZheEc0R2V0Um93KHNyY19idWYsIGJpdHNpemUsIGJpdHBvcywgbV9wU2NhbmxpbmVCdWYsIG1fcFJlZkJ1ZiwgbV9uQ29sdW1ucyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFyZXQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9iRW5kT2ZMaW5lKQotICAgICAgICBpZiAoIV9GYXhTa2lwRU9MKHNyY19idWYsIGJpdHNpemUsIGJpdHBvcykpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIGlmIChtX2JCeXRlQWxpZ24pIHsKLSAgICAgICAgYml0cG9zID0gKGJpdHBvcyArIDcpIC8gOCAqIDg7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9vYmplY3RzLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfb2JqZWN0cy5jcHAKaW5kZXggMGUxNzYwNi4uY2FkOGQ3NyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9vYmplY3RzLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX29iamVjdHMuY3BwCkBAIC00LDEyODUgKzQsMTEzOSBAQAogCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFyc2VyLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX29iamVjdHMuaCIKIAotLy9zdGF0aWMKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhcnNlci5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IEZYX0RXT1JEIGtCbG9ja1NpemUgPSAxMDI0OworCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCiBpbnQgQ1BERl9PYmplY3Q6OnNfbkN1clJlZkRlcHRoID0gMDsKIAotdm9pZCBDUERGX09iamVjdDo6UmVsZWFzZSgpCi17Ci0gICAgaWYgKG1fT2JqTnVtKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRGVzdHJveSgpOwordm9pZCBDUERGX09iamVjdDo6UmVsZWFzZSgpIHsKKyAgaWYgKG1fT2JqTnVtKSB7CisgICAgcmV0dXJuOworICB9CisgIERlc3Ryb3koKTsKIH0KLXZvaWQgQ1BERl9PYmplY3Q6OkRlc3Ryb3koKQotewotICAgIHN3aXRjaCAobV9UeXBlKSB7Ci0gICAgICAgIGNhc2UgUERGT0JKX1NUUklORzoKLSAgICAgICAgICAgIGRlbGV0ZSAoQ1BERl9TdHJpbmcqKXRoaXM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQREZPQkpfTkFNRToKLSAgICAgICAgICAgIGRlbGV0ZSAoQ1BERl9OYW1lKil0aGlzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUERGT0JKX0FSUkFZOgotICAgICAgICAgICAgZGVsZXRlIChDUERGX0FycmF5Kil0aGlzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUERGT0JKX0RJQ1RJT05BUlk6Ci0gICAgICAgICAgICBkZWxldGUgKENQREZfRGljdGlvbmFyeSopdGhpczsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBERk9CSl9TVFJFQU06Ci0gICAgICAgICAgICBkZWxldGUgKENQREZfU3RyZWFtKil0aGlzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBkZWxldGUgdGhpczsKLSAgICB9Cit2b2lkIENQREZfT2JqZWN0OjpEZXN0cm95KCkgeworICBzd2l0Y2ggKG1fVHlwZSkgeworICAgIGNhc2UgUERGT0JKX1NUUklORzoKKyAgICAgIGRlbGV0ZSBBc1N0cmluZygpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQREZPQkpfTkFNRToKKyAgICAgIGRlbGV0ZSBBc05hbWUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUERGT0JKX0FSUkFZOgorICAgICAgZGVsZXRlIEFzQXJyYXkoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUERGT0JKX0RJQ1RJT05BUlk6CisgICAgICBkZWxldGUgQXNEaWN0aW9uYXJ5KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBERk9CSl9TVFJFQU06CisgICAgICBkZWxldGUgQXNTdHJlYW0oKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBkZWxldGUgdGhpczsKKyAgfQogfQotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9PYmplY3Q6OkdldFN0cmluZygpIGNvbnN0Ci17Ci0gICAgc3dpdGNoIChtX1R5cGUpIHsKLSAgICAgICAgY2FzZSBQREZPQkpfQk9PTEVBTjoKLSAgICAgICAgICAgIHJldHVybiAoKENQREZfQm9vbGVhbiopdGhpcyktPm1fYlZhbHVlID8gInRydWUiIDogImZhbHNlIjsKLSAgICAgICAgY2FzZSBQREZPQkpfTlVNQkVSOgotICAgICAgICAgICAgcmV0dXJuICgoQ1BERl9OdW1iZXIqKXRoaXMpLT5HZXRTdHJpbmcoKTsKLSAgICAgICAgY2FzZSBQREZPQkpfU1RSSU5HOgotICAgICAgICAgICAgcmV0dXJuICgoQ1BERl9TdHJpbmcqKXRoaXMpLT5tX1N0cmluZzsKLSAgICAgICAgY2FzZSBQREZPQkpfTkFNRToKLSAgICAgICAgICAgIHJldHVybiAoKENQREZfTmFtZSopdGhpcyktPm1fTmFtZTsKLSAgICAgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOiB7Ci0gICAgICAgICAgICAgICAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSAoQ1BERl9SZWZlcmVuY2UqKShGWF9MUFZPSUQpdGhpczsKLSAgICAgICAgICAgICAgICBpZiAocFJlZi0+bV9wT2JqTGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IHBSZWYtPm1fcE9iakxpc3QtPkdldEluZGlyZWN0T2JqZWN0KHBSZWYtPm1fUmVmT2JqTnVtKTsKLSAgICAgICAgICAgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcE9iai0+R2V0U3RyaW5nKCk7Ci0gICAgICAgICAgICB9CitDRlhfQnl0ZVN0cmluZyBDUERGX09iamVjdDo6R2V0U3RyaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKG1fVHlwZSkgeworICAgIGNhc2UgUERGT0JKX0JPT0xFQU46CisgICAgICByZXR1cm4gQXNCb29sZWFuKCktPm1fYlZhbHVlID8gInRydWUiIDogImZhbHNlIjsKKyAgICBjYXNlIFBERk9CSl9OVU1CRVI6CisgICAgICByZXR1cm4gQXNOdW1iZXIoKS0+R2V0U3RyaW5nKCk7CisgICAgY2FzZSBQREZPQkpfU1RSSU5HOgorICAgICAgcmV0dXJuIEFzU3RyaW5nKCktPm1fU3RyaW5nOworICAgIGNhc2UgUERGT0JKX05BTUU6CisgICAgICByZXR1cm4gQXNOYW1lKCktPm1fTmFtZTsKKyAgICBjYXNlIFBERk9CSl9SRUZFUkVOQ0U6IHsKKyAgICAgIGNvbnN0IENQREZfUmVmZXJlbmNlKiBwUmVmID0gQXNSZWZlcmVuY2UoKTsKKyAgICAgIGlmICghcFJlZi0+bV9wT2JqTGlzdCkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIENQREZfT2JqZWN0KiBwT2JqID0KKyAgICAgICAgICBwUmVmLT5tX3BPYmpMaXN0LT5HZXRJbmRpcmVjdE9iamVjdChwUmVmLT5HZXRSZWZPYmpOdW0oKSwgbnVsbHB0cik7CisgICAgICByZXR1cm4gcE9iaiA/IHBPYmotPkdldFN0cmluZygpIDogQ0ZYX0J5dGVTdHJpbmcoKTsKICAgICB9Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7CisgIH0KKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7CiB9Ci1DRlhfQnl0ZVN0cmluZ0MgQ1BERl9PYmplY3Q6OkdldENvbnN0U3RyaW5nKCkgY29uc3QKLXsKLSAgICBzd2l0Y2ggKG1fVHlwZSkgewotICAgICAgICBjYXNlIFBERk9CSl9TVFJJTkc6Ci0gICAgICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKChGWF9MUENCWVRFKSgoQ1BERl9TdHJpbmcqKXRoaXMpLT5tX1N0cmluZywgKChDUERGX1N0cmluZyopdGhpcyktPm1fU3RyaW5nLkdldExlbmd0aCgpKTsKLSAgICAgICAgY2FzZSBQREZPQkpfTkFNRToKLSAgICAgICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MoKEZYX0xQQ0JZVEUpKChDUERGX05hbWUqKXRoaXMpLT5tX05hbWUsICgoQ1BERl9OYW1lKil0aGlzKS0+bV9OYW1lLkdldExlbmd0aCgpKTsKLSAgICAgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOiB7Ci0gICAgICAgICAgICAgICAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSAoQ1BERl9SZWZlcmVuY2UqKShGWF9MUFZPSUQpdGhpczsKLSAgICAgICAgICAgICAgICBpZiAocFJlZi0+bV9wT2JqTGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IHBSZWYtPm1fcE9iakxpc3QtPkdldEluZGlyZWN0T2JqZWN0KHBSZWYtPm1fUmVmT2JqTnVtKTsKLSAgICAgICAgICAgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBPYmotPkdldENvbnN0U3RyaW5nKCk7Ci0gICAgICAgICAgICB9CitDRlhfQnl0ZVN0cmluZ0MgQ1BERl9PYmplY3Q6OkdldENvbnN0U3RyaW5nKCkgY29uc3QgeworICBzd2l0Y2ggKG1fVHlwZSkgeworICAgIGNhc2UgUERGT0JKX1NUUklORzogeworICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gQXNTdHJpbmcoKS0+bV9TdHJpbmc7CisgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKChjb25zdCB1aW50OF90KilzdHIsIHN0ci5HZXRMZW5ndGgoKSk7CiAgICAgfQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MoKTsKKyAgICBjYXNlIFBERk9CSl9OQU1FOiB7CisgICAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gQXNOYW1lKCktPm1fTmFtZTsKKyAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MoKGNvbnN0IHVpbnQ4X3QqKW5hbWUsIG5hbWUuR2V0TGVuZ3RoKCkpOworICAgIH0KKyAgICBjYXNlIFBERk9CSl9SRUZFUkVOQ0U6IHsKKyAgICAgIGNvbnN0IENQREZfUmVmZXJlbmNlKiBwUmVmID0gQXNSZWZlcmVuY2UoKTsKKyAgICAgIGlmICghcFJlZi0+bV9wT2JqTGlzdCkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIENQREZfT2JqZWN0KiBwT2JqID0KKyAgICAgICAgICBwUmVmLT5tX3BPYmpMaXN0LT5HZXRJbmRpcmVjdE9iamVjdChwUmVmLT5HZXRSZWZPYmpOdW0oKSwgbnVsbHB0cik7CisgICAgICByZXR1cm4gcE9iaiA/IHBPYmotPkdldENvbnN0U3RyaW5nKCkgOiBDRlhfQnl0ZVN0cmluZ0MoKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQygpOwogfQotRlhfRkxPQVQgQ1BERl9PYmplY3Q6OkdldE51bWJlcigpIGNvbnN0Ci17Ci0gICAgc3dpdGNoIChtX1R5cGUpIHsKLSAgICAgICAgY2FzZSBQREZPQkpfTlVNQkVSOgotICAgICAgICAgICAgcmV0dXJuICgoQ1BERl9OdW1iZXIqKXRoaXMpLT5HZXROdW1iZXIoKTsKLSAgICAgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOiB7Ci0gICAgICAgICAgICAgICAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSAoQ1BERl9SZWZlcmVuY2UqKShGWF9MUFZPSUQpdGhpczsKLSAgICAgICAgICAgICAgICBpZiAocFJlZi0+bV9wT2JqTGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IHBSZWYtPm1fcE9iakxpc3QtPkdldEluZGlyZWN0T2JqZWN0KHBSZWYtPm1fUmVmT2JqTnVtKTsKLSAgICAgICAgICAgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcE9iai0+R2V0TnVtYmVyKCk7Ci0gICAgICAgICAgICB9CisKK0ZYX0ZMT0FUIENQREZfT2JqZWN0OjpHZXROdW1iZXIoKSBjb25zdCB7CisgIHN3aXRjaCAobV9UeXBlKSB7CisgICAgY2FzZSBQREZPQkpfTlVNQkVSOgorICAgICAgcmV0dXJuIEFzTnVtYmVyKCktPkdldE51bWJlcigpOworICAgIGNhc2UgUERGT0JKX1JFRkVSRU5DRTogeworICAgICAgY29uc3QgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSBBc1JlZmVyZW5jZSgpOworICAgICAgaWYgKCFwUmVmLT5tX3BPYmpMaXN0KQorICAgICAgICBicmVhazsKKworICAgICAgQ1BERl9PYmplY3QqIHBPYmogPQorICAgICAgICAgIHBSZWYtPm1fcE9iakxpc3QtPkdldEluZGlyZWN0T2JqZWN0KHBSZWYtPkdldFJlZk9iak51bSgpLCBudWxscHRyKTsKKyAgICAgIHJldHVybiBwT2JqID8gcE9iai0+R2V0TnVtYmVyKCkgOiAwOwogICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworRlhfRkxPQVQgQ1BERl9PYmplY3Q6OkdldE51bWJlcjE2KCkgY29uc3QgeworICByZXR1cm4gR2V0TnVtYmVyKCk7Cit9CisKK2ludCBDUERGX09iamVjdDo6R2V0SW50ZWdlcigpIGNvbnN0IHsKKyAgQ0ZYX0F1dG9SZXN0b3JlcjxpbnQ+IHJlc3RvcmVyKCZzX25DdXJSZWZEZXB0aCk7CisgIGlmICgrK3NfbkN1clJlZkRlcHRoID4ga09iamVjdFJlZk1heERlcHRoKQogICAgIHJldHVybiAwOwotfQotRlhfRkxPQVQgQ1BERl9PYmplY3Q6OkdldE51bWJlcjE2KCkgY29uc3QKLXsKLSAgICByZXR1cm4gR2V0TnVtYmVyKCk7Ci19Ci1pbnQgQ1BERl9PYmplY3Q6OkdldEludGVnZXIoKSBjb25zdAotewotICAgIENGWF9BdXRvUmVzdG9yZXI8aW50PiByZXN0b3Jlcigmc19uQ3VyUmVmRGVwdGgpOwotICAgIGlmICgrK3NfbkN1clJlZkRlcHRoID4gT0JKRUNUX1JFRl9NQVhfREVQVEgpIHsKKworICBzd2l0Y2ggKG1fVHlwZSkgeworICAgIGNhc2UgUERGT0JKX0JPT0xFQU46CisgICAgICByZXR1cm4gQXNCb29sZWFuKCktPm1fYlZhbHVlOworICAgIGNhc2UgUERGT0JKX05VTUJFUjoKKyAgICAgIHJldHVybiBBc051bWJlcigpLT5HZXRJbnRlZ2VyKCk7CisgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOiB7CisgICAgICBjb25zdCBDUERGX1JlZmVyZW5jZSogcFJlZiA9IEFzUmVmZXJlbmNlKCk7CisgICAgICBQQVJTRV9DT05URVhUIGNvbnRleHQ7CisgICAgICBGWFNZU19tZW1zZXQoJmNvbnRleHQsIDAsIHNpemVvZihQQVJTRV9DT05URVhUKSk7CisgICAgICBpZiAoIXBSZWYtPm1fcE9iakxpc3QpCiAgICAgICAgIHJldHVybiAwOworCisgICAgICBDUERGX09iamVjdCogcE9iaiA9CisgICAgICAgICAgcFJlZi0+bV9wT2JqTGlzdC0+R2V0SW5kaXJlY3RPYmplY3QocFJlZi0+R2V0UmVmT2JqTnVtKCksICZjb250ZXh0KTsKKyAgICAgIHJldHVybiBwT2JqID8gcE9iai0+R2V0SW50ZWdlcigpIDogMDsKICAgICB9Ci0gICAgc3dpdGNoIChtX1R5cGUpIHsKLSAgICAgICAgY2FzZSBQREZPQkpfQk9PTEVBTjoKLSAgICAgICAgICAgIHJldHVybiAoKENQREZfQm9vbGVhbiopdGhpcyktPm1fYlZhbHVlOwotICAgICAgICBjYXNlIFBERk9CSl9OVU1CRVI6Ci0gICAgICAgICAgICByZXR1cm4gKChDUERGX051bWJlciopdGhpcyktPkdldEludGVnZXIoKTsKLSAgICAgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOiB7Ci0gICAgICAgICAgICAgICAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSAoQ1BERl9SZWZlcmVuY2UqKShGWF9MUFZPSUQpdGhpczsKLSAgICAgICAgICAgICAgICBQQVJTRV9DT05URVhUIGNvbnRleHQ7Ci0gICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0MzIoJmNvbnRleHQsIDAsIHNpemVvZihQQVJTRV9DT05URVhUKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBSZWYtPm1fcE9iakxpc3QgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBwUmVmLT5tX3BPYmpMaXN0LT5HZXRJbmRpcmVjdE9iamVjdChwUmVmLT5tX1JlZk9iak51bSwgJmNvbnRleHQpOwotICAgICAgICAgICAgICAgIGlmIChwT2JqID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBwT2JqLT5HZXRJbnRlZ2VyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAwOwogfQotQ1BERl9EaWN0aW9uYXJ5KiBDUERGX09iamVjdDo6R2V0RGljdCgpIGNvbnN0Ci17Ci0gICAgc3dpdGNoIChtX1R5cGUpIHsKLSAgICAgICAgY2FzZSBQREZPQkpfRElDVElPTkFSWToKLSAgICAgICAgICAgIHJldHVybiAoQ1BERl9EaWN0aW9uYXJ5Kil0aGlzOwotICAgICAgICBjYXNlIFBERk9CSl9TVFJFQU06Ci0gICAgICAgICAgICByZXR1cm4gKChDUERGX1N0cmVhbSopdGhpcyktPkdldERpY3QoKTsKLSAgICAgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOiB7Ci0gICAgICAgICAgICAgICAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSAoQ1BERl9SZWZlcmVuY2UqKXRoaXM7Ci0gICAgICAgICAgICAgICAgaWYgKHBSZWYtPm1fcE9iakxpc3QgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBwUmVmLT5tX3BPYmpMaXN0LT5HZXRJbmRpcmVjdE9iamVjdChwUmVmLT5tX1JlZk9iak51bSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBPYmogPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBPYmotPkdldERpY3QoKTsKLSAgICAgICAgICAgIH0KKworQ1BERl9EaWN0aW9uYXJ5KiBDUERGX09iamVjdDo6R2V0RGljdCgpIGNvbnN0IHsKKyAgc3dpdGNoIChtX1R5cGUpIHsKKyAgICBjYXNlIFBERk9CSl9ESUNUSU9OQVJZOgorICAgICAgLy8gVGhlIG1ldGhvZCBzaG91bGQgYmUgbWFkZSBub24tY29uc3QgaWYgd2Ugd2FudCB0byBub3QgYmUgY29uc3QuCisgICAgICAvLyBTZWUgYnVnICMyMzQuCisgICAgICByZXR1cm4gY29uc3RfY2FzdDxDUERGX0RpY3Rpb25hcnkqPihBc0RpY3Rpb25hcnkoKSk7CisgICAgY2FzZSBQREZPQkpfU1RSRUFNOgorICAgICAgcmV0dXJuIEFzU3RyZWFtKCktPkdldERpY3QoKTsKKyAgICBjYXNlIFBERk9CSl9SRUZFUkVOQ0U6IHsKKyAgICAgIGNvbnN0IENQREZfUmVmZXJlbmNlKiBwUmVmID0gQXNSZWZlcmVuY2UoKTsKKyAgICAgIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIqIHBJbmRpcmVjdCA9IHBSZWYtPkdldE9iakxpc3QoKTsKKyAgICAgIGlmICghcEluZGlyZWN0KQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIENQREZfT2JqZWN0KiBwT2JqID0KKyAgICAgICAgICBwSW5kaXJlY3QtPkdldEluZGlyZWN0T2JqZWN0KHBSZWYtPkdldFJlZk9iak51bSgpLCBudWxscHRyKTsKKyAgICAgIGlmICghcE9iaiB8fCAocE9iaiA9PSB0aGlzKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICByZXR1cm4gcE9iai0+R2V0RGljdCgpOwogICAgIH0KLSAgICByZXR1cm4gTlVMTDsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KIH0KLUNQREZfQXJyYXkqIENQREZfT2JqZWN0OjpHZXRBcnJheSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fVHlwZSA9PSBQREZPQkpfQVJSQVkpCi0gICAgICAgIHJldHVybiAoQ1BERl9BcnJheSopdGhpczsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBOVUxMOworCitDUERGX0FycmF5KiBDUERGX09iamVjdDo6R2V0QXJyYXkoKSBjb25zdCB7CisgIC8vIFRoZSBtZXRob2Qgc2hvdWxkIGJlIG1hZGUgbm9uLWNvbnN0IGlmIHdlIHdhbnQgdG8gbm90IGJlIGNvbnN0LgorICAvLyBTZWUgYnVnICMyMzQuCisgIHJldHVybiBjb25zdF9jYXN0PENQREZfQXJyYXkqPihBc0FycmF5KCkpOwogfQotdm9pZCBDUERGX09iamVjdDo6U2V0U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpCi17Ci0gICAgQVNTRVJUKHRoaXMgIT0gTlVMTCk7Ci0gICAgc3dpdGNoIChtX1R5cGUpIHsKLSAgICAgICAgY2FzZSBQREZPQkpfQk9PTEVBTjoKLSAgICAgICAgICAgICgoQ1BERl9Cb29sZWFuKil0aGlzKS0+bV9iVmFsdWUgPSBzdHIgPT0gRlhfQlNUUkMoInRydWUiKSA/IDEgOiAwOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBjYXNlIFBERk9CSl9OVU1CRVI6Ci0gICAgICAgICAgICAoKENQREZfTnVtYmVyKil0aGlzKS0+U2V0U3RyaW5nKHN0cik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgUERGT0JKX1NUUklORzoKLSAgICAgICAgICAgICgoQ1BERl9TdHJpbmcqKXRoaXMpLT5tX1N0cmluZyA9IHN0cjsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSBQREZPQkpfTkFNRToKLSAgICAgICAgICAgICgoQ1BERl9OYW1lKil0aGlzKS0+bV9OYW1lID0gc3RyOwotICAgICAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBU1NFUlQoRkFMU0UpOworCit2b2lkIENQREZfT2JqZWN0OjpTZXRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cikgeworICBzd2l0Y2ggKG1fVHlwZSkgeworICAgIGNhc2UgUERGT0JKX0JPT0xFQU46CisgICAgICBBc0Jvb2xlYW4oKS0+bV9iVmFsdWUgPSAoc3RyID09ICJ0cnVlIik7CisgICAgICByZXR1cm47CisgICAgY2FzZSBQREZPQkpfTlVNQkVSOgorICAgICAgQXNOdW1iZXIoKS0+U2V0U3RyaW5nKHN0cik7CisgICAgICByZXR1cm47CisgICAgY2FzZSBQREZPQkpfU1RSSU5HOgorICAgICAgQXNTdHJpbmcoKS0+bV9TdHJpbmcgPSBzdHI7CisgICAgICByZXR1cm47CisgICAgY2FzZSBQREZPQkpfTkFNRToKKyAgICAgIEFzTmFtZSgpLT5tX05hbWUgPSBzdHI7CisgICAgICByZXR1cm47CisgIH0KKyAgQVNTRVJUKEZBTFNFKTsKIH0KLWludCBDUERGX09iamVjdDo6R2V0RGlyZWN0VHlwZSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fVHlwZSAhPSBQREZPQkpfUkVGRVJFTkNFKSB7Ci0gICAgICAgIHJldHVybiBtX1R5cGU7Ci0gICAgfQotICAgIENQREZfUmVmZXJlbmNlKiBwUmVmID0gKENQREZfUmVmZXJlbmNlKil0aGlzOwotICAgIHJldHVybiBwUmVmLT5tX3BPYmpMaXN0LT5HZXRJbmRpcmVjdFR5cGUocFJlZi0+bV9SZWZPYmpOdW0pOworaW50IENQREZfT2JqZWN0OjpHZXREaXJlY3RUeXBlKCkgY29uc3QgeworICBjb25zdCBDUERGX1JlZmVyZW5jZSogcFJlZiA9IEFzUmVmZXJlbmNlKCk7CisgIGlmICghcFJlZikKKyAgICByZXR1cm4gbV9UeXBlOworICByZXR1cm4gcFJlZi0+bV9wT2JqTGlzdC0+R2V0SW5kaXJlY3RUeXBlKHBSZWYtPkdldFJlZk9iak51bSgpKTsKIH0KLUZYX0JPT0wgQ1BERl9PYmplY3Q6OklzSWRlbnRpY2FsKENQREZfT2JqZWN0KiBwT3RoZXIpIGNvbnN0Ci17Ci0gICAgaWYgKHRoaXMgPT0gcE90aGVyKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAocE90aGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAocE90aGVyLT5tX1R5cGUgIT0gbV9UeXBlKSB7Ci0gICAgICAgIGlmIChtX1R5cGUgPT0gUERGT0JKX1JFRkVSRU5DRSAmJiBHZXREaXJlY3QoKSkgewotICAgICAgICAgICAgcmV0dXJuIEdldERpcmVjdCgpLT5Jc0lkZW50aWNhbChwT3RoZXIpOwotICAgICAgICB9IGVsc2UgaWYgKHBPdGhlci0+bV9UeXBlID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKLSAgICAgICAgICAgIHJldHVybiBJc0lkZW50aWNhbChwT3RoZXItPkdldERpcmVjdCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHN3aXRjaCAobV9UeXBlKSB7Ci0gICAgICAgIGNhc2UgUERGT0JKX0JPT0xFQU46Ci0gICAgICAgICAgICByZXR1cm4gKCgoQ1BERl9Cb29sZWFuKil0aGlzKS0+SWRlbnRpY2FsKChDUERGX0Jvb2xlYW4qKXBPdGhlcikpOwotICAgICAgICBjYXNlIFBERk9CSl9OVU1CRVI6Ci0gICAgICAgICAgICByZXR1cm4gKCgoQ1BERl9OdW1iZXIqKXRoaXMpLT5JZGVudGljYWwoKENQREZfTnVtYmVyKilwT3RoZXIpKTsKLSAgICAgICAgY2FzZSBQREZPQkpfU1RSSU5HOgotICAgICAgICAgICAgcmV0dXJuICgoKENQREZfU3RyaW5nKil0aGlzKS0+SWRlbnRpY2FsKChDUERGX1N0cmluZyopcE90aGVyKSk7Ci0gICAgICAgIGNhc2UgUERGT0JKX05BTUU6Ci0gICAgICAgICAgICByZXR1cm4gKCgoQ1BERl9OYW1lKil0aGlzKS0+SWRlbnRpY2FsKChDUERGX05hbWUqKXBPdGhlcikpOwotICAgICAgICBjYXNlIFBERk9CSl9BUlJBWToKLSAgICAgICAgICAgIHJldHVybiAoKChDUERGX0FycmF5Kil0aGlzKS0+SWRlbnRpY2FsKChDUERGX0FycmF5KilwT3RoZXIpKTsKLSAgICAgICAgY2FzZSBQREZPQkpfRElDVElPTkFSWToKLSAgICAgICAgICAgIHJldHVybiAoKChDUERGX0RpY3Rpb25hcnkqKXRoaXMpLT5JZGVudGljYWwoKENQREZfRGljdGlvbmFyeSopcE90aGVyKSk7Ci0gICAgICAgIGNhc2UgUERGT0JKX05VTEw6Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgY2FzZSBQREZPQkpfU1RSRUFNOgotICAgICAgICAgICAgcmV0dXJuICgoKENQREZfU3RyZWFtKil0aGlzKS0+SWRlbnRpY2FsKChDUERGX1N0cmVhbSopcE90aGVyKSk7Ci0gICAgICAgIGNhc2UgUERGT0JKX1JFRkVSRU5DRToKLSAgICAgICAgICAgIHJldHVybiAoKChDUERGX1JlZmVyZW5jZSopdGhpcyktPklkZW50aWNhbCgoQ1BERl9SZWZlcmVuY2UqKXBPdGhlcikpOwotICAgIH0KK0ZYX0JPT0wgQ1BERl9PYmplY3Q6OklzSWRlbnRpY2FsKENQREZfT2JqZWN0KiBwT3RoZXIpIGNvbnN0IHsKKyAgaWYgKHRoaXMgPT0gcE90aGVyKQorICAgIHJldHVybiBUUlVFOworICBpZiAoIXBPdGhlcikKICAgICByZXR1cm4gRkFMU0U7CisgIGlmIChwT3RoZXItPm1fVHlwZSAhPSBtX1R5cGUpIHsKKyAgICBpZiAoSXNSZWZlcmVuY2UoKSAmJiBHZXREaXJlY3QoKSkKKyAgICAgIHJldHVybiBHZXREaXJlY3QoKS0+SXNJZGVudGljYWwocE90aGVyKTsKKyAgICBpZiAocE90aGVyLT5Jc1JlZmVyZW5jZSgpKQorICAgICAgcmV0dXJuIElzSWRlbnRpY2FsKHBPdGhlci0+R2V0RGlyZWN0KCkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBzd2l0Y2ggKG1fVHlwZSkgeworICAgIGNhc2UgUERGT0JKX0JPT0xFQU46CisgICAgICByZXR1cm4gQXNCb29sZWFuKCktPklkZW50aWNhbChwT3RoZXItPkFzQm9vbGVhbigpKTsKKyAgICBjYXNlIFBERk9CSl9OVU1CRVI6CisgICAgICByZXR1cm4gQXNOdW1iZXIoKS0+SWRlbnRpY2FsKHBPdGhlci0+QXNOdW1iZXIoKSk7CisgICAgY2FzZSBQREZPQkpfU1RSSU5HOgorICAgICAgcmV0dXJuIEFzU3RyaW5nKCktPklkZW50aWNhbChwT3RoZXItPkFzU3RyaW5nKCkpOworICAgIGNhc2UgUERGT0JKX05BTUU6CisgICAgICByZXR1cm4gQXNOYW1lKCktPklkZW50aWNhbChwT3RoZXItPkFzTmFtZSgpKTsKKyAgICBjYXNlIFBERk9CSl9BUlJBWToKKyAgICAgIHJldHVybiBBc0FycmF5KCktPklkZW50aWNhbChwT3RoZXItPkFzQXJyYXkoKSk7CisgICAgY2FzZSBQREZPQkpfRElDVElPTkFSWToKKyAgICAgIHJldHVybiBBc0RpY3Rpb25hcnkoKS0+SWRlbnRpY2FsKHBPdGhlci0+QXNEaWN0aW9uYXJ5KCkpOworICAgIGNhc2UgUERGT0JKX05VTEw6CisgICAgICByZXR1cm4gVFJVRTsKKyAgICBjYXNlIFBERk9CSl9TVFJFQU06CisgICAgICByZXR1cm4gQXNTdHJlYW0oKS0+SWRlbnRpY2FsKHBPdGhlci0+QXNTdHJlYW0oKSk7CisgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOgorICAgICAgcmV0dXJuIEFzUmVmZXJlbmNlKCktPklkZW50aWNhbChwT3RoZXItPkFzUmVmZXJlbmNlKCkpOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KLUNQREZfT2JqZWN0KiBDUERGX09iamVjdDo6R2V0RGlyZWN0KCkgY29uc3QKLXsKLSAgICBpZiAobV9UeXBlICE9IFBERk9CSl9SRUZFUkVOQ0UpIHsKLSAgICAgICAgcmV0dXJuIChDUERGX09iamVjdCopdGhpczsKLSAgICB9Ci0gICAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSAoQ1BERl9SZWZlcmVuY2UqKShGWF9MUFZPSUQpdGhpczsKLSAgICBpZiAocFJlZi0+bV9wT2JqTGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gcFJlZi0+bV9wT2JqTGlzdC0+R2V0SW5kaXJlY3RPYmplY3QocFJlZi0+bV9SZWZPYmpOdW0pOworCitDUERGX09iamVjdCogQ1BERl9PYmplY3Q6OkdldERpcmVjdCgpIGNvbnN0IHsKKyAgY29uc3QgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSBBc1JlZmVyZW5jZSgpOworICBpZiAoIXBSZWYpCisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Q1BERl9PYmplY3QqPih0aGlzKTsKKyAgaWYgKCFwUmVmLT5tX3BPYmpMaXN0KQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gcFJlZi0+bV9wT2JqTGlzdC0+R2V0SW5kaXJlY3RPYmplY3QocFJlZi0+R2V0UmVmT2JqTnVtKCksIG51bGxwdHIpOwogfQotQ1BERl9PYmplY3QqIENQREZfT2JqZWN0OjpDbG9uZShGWF9CT09MIGJEaXJlY3QpIGNvbnN0Ci17Ci0gICAgQ0ZYX01hcFB0clRvUHRyIHZpc2l0ZWQ7Ci0gICAgcmV0dXJuIENsb25lSW50ZXJuYWwoYkRpcmVjdCwgJnZpc2l0ZWQpOworCitDUERGX09iamVjdCogQ1BERl9PYmplY3Q6OkNsb25lKEZYX0JPT0wgYkRpcmVjdCkgY29uc3QgeworICBzdGQ6OnNldDxGWF9EV09SRD4gdmlzaXRlZDsKKyAgcmV0dXJuIENsb25lSW50ZXJuYWwoYkRpcmVjdCwgJnZpc2l0ZWQpOwogfQotQ1BERl9PYmplY3QqIENQREZfT2JqZWN0OjpDbG9uZUludGVybmFsKEZYX0JPT0wgYkRpcmVjdCwgQ0ZYX01hcFB0clRvUHRyKiB2aXNpdGVkKSBjb25zdAotewotICAgIHN3aXRjaCAobV9UeXBlKSB7Ci0gICAgICAgIGNhc2UgUERGT0JKX0JPT0xFQU46Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENQREZfQm9vbGVhbigoKENQREZfQm9vbGVhbiopdGhpcyktPm1fYlZhbHVlKTsKLSAgICAgICAgY2FzZSBQREZPQkpfTlVNQkVSOgotICAgICAgICAgICAgcmV0dXJuIG5ldyBDUERGX051bWJlcigoKENQREZfTnVtYmVyKil0aGlzKS0+bV9iSW50ZWdlciwgJigoQ1BERl9OdW1iZXIqKXRoaXMpLT5tX0ludGVnZXIpOwotICAgICAgICBjYXNlIFBERk9CSl9TVFJJTkc6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENQREZfU3RyaW5nKCgoQ1BERl9TdHJpbmcqKXRoaXMpLT5tX1N0cmluZywgKChDUERGX1N0cmluZyopdGhpcyktPklzSGV4KCkpOwotICAgICAgICBjYXNlIFBERk9CSl9OQU1FOgotICAgICAgICAgICAgcmV0dXJuIG5ldyBDUERGX05hbWUoKChDUERGX05hbWUqKXRoaXMpLT5tX05hbWUpOwotICAgICAgICBjYXNlIFBERk9CSl9BUlJBWTogewotICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBDb3B5ID0gbmV3IENQREZfQXJyYXkoKTsKLSAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwVGhpcyA9IChDUERGX0FycmF5Kil0aGlzOwotICAgICAgICAgICAgICAgIGludCBuID0gcFRoaXMtPkdldENvdW50KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiB2YWx1ZSA9IChDUERGX09iamVjdCopcFRoaXMtPm1fT2JqZWN0cy5HZXRBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgcENvcHktPm1fT2JqZWN0cy5BZGQodmFsdWUtPkNsb25lSW50ZXJuYWwoYkRpcmVjdCwgdmlzaXRlZCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcENvcHk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgUERGT0JKX0RJQ1RJT05BUlk6IHsKLSAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBDb3B5ID0gbmV3IENQREZfRGljdGlvbmFyeSgpOwotICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFRoaXMgPSAoQ1BERl9EaWN0aW9uYXJ5Kil0aGlzOwotICAgICAgICAgICAgICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBUaGlzLT5tX01hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHBvcykgewotICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBrZXk7Ci0gICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgcFRoaXMtPm1fTWFwLkdldE5leHRBc3NvYyhwb3MsIGtleSwgKHZvaWQqJil2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBDb3B5LT5tX01hcC5TZXRBdChrZXksIHZhbHVlLT5DbG9uZUludGVybmFsKGJEaXJlY3QsIHZpc2l0ZWQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBDb3B5OwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIFBERk9CSl9OVUxMOiB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDUERGX051bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgUERGT0JKX1NUUkVBTTogewotICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwVGhpcyA9IChDUERGX1N0cmVhbSopdGhpczsKLSAgICAgICAgICAgICAgICBDUERGX1N0cmVhbUFjYyBhY2M7Ci0gICAgICAgICAgICAgICAgYWNjLkxvYWRBbGxEYXRhKHBUaGlzLCBUUlVFKTsKLSAgICAgICAgICAgICAgICBGWF9EV09SRCBzdHJlYW1TaXplID0gYWNjLkdldFNpemUoKTsKLSAgICAgICAgICAgICAgICBDUERGX1N0cmVhbSogcE9iajsKLSAgICAgICAgICAgICAgICBpZiAocFRoaXMtPkdldERpY3QoKSkKLSAgICAgICAgICAgICAgICAgICAgcE9iaiA9IG5ldyBDUERGX1N0cmVhbShhY2MuRGV0YWNoRGF0YSgpLCBzdHJlYW1TaXplLCAoQ1BERl9EaWN0aW9uYXJ5KikoKENQREZfT2JqZWN0KilwVGhpcy0+R2V0RGljdCgpKS0+Q2xvbmVJbnRlcm5hbChiRGlyZWN0LCB2aXNpdGVkKSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBwT2JqID0gbmV3IENQREZfU3RyZWFtKGFjYy5EZXRhY2hEYXRhKCksIHN0cmVhbVNpemUsIE5VTEwpOwotICAgICAgICAgICAgICAgIHJldHVybiBwT2JqOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIFBERk9CSl9SRUZFUkVOQ0U6IHsKLSAgICAgICAgICAgICAgICBDUERGX1JlZmVyZW5jZSogcFJlZiA9IChDUERGX1JlZmVyZW5jZSopdGhpczsKLSAgICAgICAgICAgICAgICBGWF9EV09SRCBvYmpfbnVtID0gcFJlZi0+bV9SZWZPYmpOdW07Ci0gICAgICAgICAgICAgICAgaWYgKGJEaXJlY3QgJiYgIXZpc2l0ZWQtPkdldFZhbHVlQXQoKHZvaWQqKShGWF9VSU5UUFRSKW9ial9udW0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZpc2l0ZWQtPlNldEF0KCh2b2lkKikoRlhfVUlOVFBUUilvYmpfbnVtLCAodm9pZCopMSk7Ci0gICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwUmVmLT5HZXREaXJlY3QoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHBSZWYtPkdldERpcmVjdCgpLT5DbG9uZUludGVybmFsKFRSVUUsIHZpc2l0ZWQpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ1BERl9SZWZlcmVuY2UocFJlZi0+bV9wT2JqTGlzdCwgb2JqX251bSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorQ1BERl9PYmplY3QqIENQREZfT2JqZWN0OjpDbG9uZUludGVybmFsKEZYX0JPT0wgYkRpcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxGWF9EV09SRD4qIHZpc2l0ZWQpIGNvbnN0IHsKKyAgc3dpdGNoIChtX1R5cGUpIHsKKyAgICBjYXNlIFBERk9CSl9CT09MRUFOOgorICAgICAgcmV0dXJuIG5ldyBDUERGX0Jvb2xlYW4oQXNCb29sZWFuKCktPm1fYlZhbHVlKTsKKyAgICBjYXNlIFBERk9CSl9OVU1CRVI6IHsKKyAgICAgIGNvbnN0IENQREZfTnVtYmVyKiBwVGhpcyA9IEFzTnVtYmVyKCk7CisgICAgICByZXR1cm4gbmV3IENQREZfTnVtYmVyKHBUaGlzLT5tX2JJbnRlZ2VyID8gcFRoaXMtPm1fSW50ZWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBUaGlzLT5tX0Zsb2F0KTsKICAgICB9Ci0gICAgcmV0dXJuIE5VTEw7CisgICAgY2FzZSBQREZPQkpfU1RSSU5HOiB7CisgICAgICBjb25zdCBDUERGX1N0cmluZyogcFN0cmluZyA9IEFzU3RyaW5nKCk7CisgICAgICByZXR1cm4gbmV3IENQREZfU3RyaW5nKHBTdHJpbmctPm1fU3RyaW5nLCBwU3RyaW5nLT5Jc0hleCgpKTsKKyAgICB9CisgICAgY2FzZSBQREZPQkpfTkFNRToKKyAgICAgIHJldHVybiBuZXcgQ1BERl9OYW1lKEFzTmFtZSgpLT5tX05hbWUpOworICAgIGNhc2UgUERGT0JKX0FSUkFZOiB7CisgICAgICBDUERGX0FycmF5KiBwQ29weSA9IG5ldyBDUERGX0FycmF5KCk7CisgICAgICBjb25zdCBDUERGX0FycmF5KiBwVGhpcyA9IEFzQXJyYXkoKTsKKyAgICAgIGludCBuID0gcFRoaXMtPkdldENvdW50KCk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBDUERGX09iamVjdCogdmFsdWUgPSBwVGhpcy0+bV9PYmplY3RzLkdldEF0KGkpOworICAgICAgICBwQ29weS0+bV9PYmplY3RzLkFkZCh2YWx1ZS0+Q2xvbmVJbnRlcm5hbChiRGlyZWN0LCB2aXNpdGVkKSk7CisgICAgICB9CisgICAgICByZXR1cm4gcENvcHk7CisgICAgfQorICAgIGNhc2UgUERGT0JKX0RJQ1RJT05BUlk6IHsKKyAgICAgIENQREZfRGljdGlvbmFyeSogcENvcHkgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5KCk7CisgICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBUaGlzID0gQXNEaWN0aW9uYXJ5KCk7CisgICAgICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogKnBUaGlzKSB7CisgICAgICAgIHBDb3B5LT5tX01hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICBpdC5maXJzdCwgaXQuc2Vjb25kLT5DbG9uZUludGVybmFsKGJEaXJlY3QsIHZpc2l0ZWQpKSk7CisgICAgICB9CisgICAgICByZXR1cm4gcENvcHk7CisgICAgfQorICAgIGNhc2UgUERGT0JKX05VTEw6IHsKKyAgICAgIHJldHVybiBuZXcgQ1BERl9OdWxsOworICAgIH0KKyAgICBjYXNlIFBERk9CSl9TVFJFQU06IHsKKyAgICAgIGNvbnN0IENQREZfU3RyZWFtKiBwVGhpcyA9IEFzU3RyZWFtKCk7CisgICAgICBDUERGX1N0cmVhbUFjYyBhY2M7CisgICAgICBhY2MuTG9hZEFsbERhdGEocFRoaXMsIFRSVUUpOworICAgICAgRlhfRFdPUkQgc3RyZWFtU2l6ZSA9IGFjYy5HZXRTaXplKCk7CisgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFRoaXMtPkdldERpY3QoKTsKKyAgICAgIGlmIChwRGljdCkgeworICAgICAgICBwRGljdCA9IFRvRGljdGlvbmFyeShwRGljdC0+Q2xvbmVJbnRlcm5hbChiRGlyZWN0LCB2aXNpdGVkKSk7CisgICAgICB9CisgICAgICByZXR1cm4gbmV3IENQREZfU3RyZWFtKGFjYy5EZXRhY2hEYXRhKCksIHN0cmVhbVNpemUsIHBEaWN0KTsKKyAgICB9CisgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOiB7CisgICAgICBjb25zdCBDUERGX1JlZmVyZW5jZSogcFJlZiA9IEFzUmVmZXJlbmNlKCk7CisgICAgICBGWF9EV09SRCBvYmpfbnVtID0gcFJlZi0+R2V0UmVmT2JqTnVtKCk7CisgICAgICBpZiAoYkRpcmVjdCAmJiAhcGRmaXVtOjpDb250YWluc0tleSgqdmlzaXRlZCwgb2JqX251bSkpIHsKKyAgICAgICAgdmlzaXRlZC0+aW5zZXJ0KG9ial9udW0pOworICAgICAgICBhdXRvKiBwRGlyZWN0ID0gcFJlZi0+R2V0RGlyZWN0KCk7CisgICAgICAgIHJldHVybiBwRGlyZWN0ID8gcERpcmVjdC0+Q2xvbmVJbnRlcm5hbChUUlVFLCB2aXNpdGVkKSA6IG51bGxwdHI7CisgICAgICB9CisgICAgICByZXR1cm4gbmV3IENQREZfUmVmZXJlbmNlKHBSZWYtPm1fcE9iakxpc3QsIG9ial9udW0pOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKIH0KLUNQREZfT2JqZWN0KiBDUERGX09iamVjdDo6Q2xvbmVSZWYoQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBEb2MpIGNvbnN0Ci17Ci0gICAgaWYgKG1fT2JqTnVtKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ1BERl9SZWZlcmVuY2UocERvYywgbV9PYmpOdW0pOwotICAgIH0KLSAgICByZXR1cm4gQ2xvbmUoKTsKK0NQREZfT2JqZWN0KiBDUERGX09iamVjdDo6Q2xvbmVSZWYoQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlciogcERvYykgY29uc3QgeworICBpZiAobV9PYmpOdW0pIHsKKyAgICByZXR1cm4gbmV3IENQREZfUmVmZXJlbmNlKHBEb2MsIG1fT2JqTnVtKTsKKyAgfQorICByZXR1cm4gQ2xvbmUoKTsKIH0KLUNGWF9XaWRlU3RyaW5nIENQREZfT2JqZWN0OjpHZXRVbmljb2RlVGV4dChDRlhfQ2hhck1hcCogcENoYXJNYXApIGNvbnN0Ci17Ci0gICAgaWYgKG1fVHlwZSA9PSBQREZPQkpfU1RSSU5HKSB7Ci0gICAgICAgIHJldHVybiBQREZfRGVjb2RlVGV4dCgoKENQREZfU3RyaW5nKil0aGlzKS0+bV9TdHJpbmcsIHBDaGFyTWFwKTsKLSAgICB9IGVsc2UgaWYgKG1fVHlwZSA9PSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIENQREZfU3RyZWFtQWNjIHN0cmVhbTsKLSAgICAgICAgc3RyZWFtLkxvYWRBbGxEYXRhKChDUERGX1N0cmVhbSopdGhpcywgRkFMU0UpOwotICAgICAgICBDRlhfV2lkZVN0cmluZyByZXN1bHQgPSBQREZfRGVjb2RlVGV4dChzdHJlYW0uR2V0RGF0YSgpLCBzdHJlYW0uR2V0U2l6ZSgpLCBwQ2hhck1hcCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfSBlbHNlIGlmIChtX1R5cGUgPT0gUERGT0JKX05BTUUpIHsKLSAgICAgICAgcmV0dXJuIFBERl9EZWNvZGVUZXh0KCgoQ1BERl9OYW1lKil0aGlzKS0+bV9OYW1lLCBwQ2hhck1hcCk7Ci0gICAgfQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworQ0ZYX1dpZGVTdHJpbmcgQ1BERl9PYmplY3Q6OkdldFVuaWNvZGVUZXh0KENGWF9DaGFyTWFwKiBwQ2hhck1hcCkgY29uc3QgeworICBpZiAoY29uc3QgQ1BERl9TdHJpbmcqIHBTdHJpbmcgPSBBc1N0cmluZygpKQorICAgIHJldHVybiBQREZfRGVjb2RlVGV4dChwU3RyaW5nLT5tX1N0cmluZywgcENoYXJNYXApOworCisgIGlmIChjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSA9IEFzU3RyZWFtKCkpIHsKKyAgICBDUERGX1N0cmVhbUFjYyBzdHJlYW07CisgICAgc3RyZWFtLkxvYWRBbGxEYXRhKHBTdHJlYW0sIEZBTFNFKTsKKyAgICBDRlhfV2lkZVN0cmluZyByZXN1bHQgPQorICAgICAgICBQREZfRGVjb2RlVGV4dChzdHJlYW0uR2V0RGF0YSgpLCBzdHJlYW0uR2V0U2l6ZSgpLCBwQ2hhck1hcCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBpZiAoY29uc3QgQ1BERl9OYW1lKiBwTmFtZSA9IEFzTmFtZSgpKQorICAgIHJldHVybiBQREZfRGVjb2RlVGV4dChwTmFtZS0+bV9OYW1lLCBwQ2hhck1hcCk7CisgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwogfQotdm9pZCBDUERGX09iamVjdDo6U2V0VW5pY29kZVRleHQoRlhfTFBDV1NUUiBwVW5pY29kZXMsIGludCBsZW4pCi17Ci0gICAgaWYgKG1fVHlwZSA9PSBQREZPQkpfU1RSSU5HKSB7Ci0gICAgICAgICgoQ1BERl9TdHJpbmcqKXRoaXMpLT5tX1N0cmluZyA9IFBERl9FbmNvZGVUZXh0KHBVbmljb2RlcywgbGVuKTsKLSAgICB9IGVsc2UgaWYgKG1fVHlwZSA9PSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHJlc3VsdCA9IFBERl9FbmNvZGVUZXh0KHBVbmljb2RlcywgbGVuKTsKLSAgICAgICAgKChDUERGX1N0cmVhbSopdGhpcyktPlNldERhdGEoKEZYX0xQQllURSlyZXN1bHQuY19zdHIoKSwgcmVzdWx0LkdldExlbmd0aCgpLCBGQUxTRSwgRkFMU0UpOwotICAgIH0KK3ZvaWQgQ1BERl9PYmplY3Q6OlNldFVuaWNvZGVUZXh0KGNvbnN0IEZYX1dDSEFSKiBwVW5pY29kZXMsIGludCBsZW4pIHsKKyAgaWYgKENQREZfU3RyaW5nKiBwU3RyaW5nID0gQXNTdHJpbmcoKSkgeworICAgIHBTdHJpbmctPm1fU3RyaW5nID0gUERGX0VuY29kZVRleHQocFVuaWNvZGVzLCBsZW4pOworICB9IGVsc2UgaWYgKENQREZfU3RyZWFtKiBwU3RyZWFtID0gQXNTdHJlYW0oKSkgeworICAgIENGWF9CeXRlU3RyaW5nIHJlc3VsdCA9IFBERl9FbmNvZGVUZXh0KHBVbmljb2RlcywgbGVuKTsKKyAgICBwU3RyZWFtLT5TZXREYXRhKCh1aW50OF90KilyZXN1bHQuY19zdHIoKSwgcmVzdWx0LkdldExlbmd0aCgpLCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsKKyAgfQorfQorCitDUERGX0FycmF5KiBDUERGX09iamVjdDo6QXNBcnJheSgpIHsKKyAgcmV0dXJuIElzQXJyYXkoKSA/IHN0YXRpY19jYXN0PENQREZfQXJyYXkqPih0aGlzKSA6IG51bGxwdHI7Cit9CisKK2NvbnN0IENQREZfQXJyYXkqIENQREZfT2JqZWN0OjpBc0FycmF5KCkgY29uc3QgeworICByZXR1cm4gSXNBcnJheSgpID8gc3RhdGljX2Nhc3Q8Y29uc3QgQ1BERl9BcnJheSo+KHRoaXMpIDogbnVsbHB0cjsKK30KKworQ1BERl9Cb29sZWFuKiBDUERGX09iamVjdDo6QXNCb29sZWFuKCkgeworICByZXR1cm4gSXNCb29sZWFuKCkgPyBzdGF0aWNfY2FzdDxDUERGX0Jvb2xlYW4qPih0aGlzKSA6IG51bGxwdHI7Cit9CisKK2NvbnN0IENQREZfQm9vbGVhbiogQ1BERl9PYmplY3Q6OkFzQm9vbGVhbigpIGNvbnN0IHsKKyAgcmV0dXJuIElzQm9vbGVhbigpID8gc3RhdGljX2Nhc3Q8Y29uc3QgQ1BERl9Cb29sZWFuKj4odGhpcykgOiBudWxscHRyOworfQorCitDUERGX0RpY3Rpb25hcnkqIENQREZfT2JqZWN0OjpBc0RpY3Rpb25hcnkoKSB7CisgIHJldHVybiBJc0RpY3Rpb25hcnkoKSA/IHN0YXRpY19jYXN0PENQREZfRGljdGlvbmFyeSo+KHRoaXMpIDogbnVsbHB0cjsKK30KKworY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBDUERGX09iamVjdDo6QXNEaWN0aW9uYXJ5KCkgY29uc3QgeworICByZXR1cm4gSXNEaWN0aW9uYXJ5KCkgPyBzdGF0aWNfY2FzdDxjb25zdCBDUERGX0RpY3Rpb25hcnkqPih0aGlzKSA6IG51bGxwdHI7Cit9CisKK0NQREZfTmFtZSogQ1BERl9PYmplY3Q6OkFzTmFtZSgpIHsKKyAgcmV0dXJuIElzTmFtZSgpID8gc3RhdGljX2Nhc3Q8Q1BERl9OYW1lKj4odGhpcykgOiBudWxscHRyOworfQorCitjb25zdCBDUERGX05hbWUqIENQREZfT2JqZWN0OjpBc05hbWUoKSBjb25zdCB7CisgIHJldHVybiBJc05hbWUoKSA/IHN0YXRpY19jYXN0PGNvbnN0IENQREZfTmFtZSo+KHRoaXMpIDogbnVsbHB0cjsKK30KKworQ1BERl9OdW1iZXIqIENQREZfT2JqZWN0OjpBc051bWJlcigpIHsKKyAgcmV0dXJuIElzTnVtYmVyKCkgPyBzdGF0aWNfY2FzdDxDUERGX051bWJlcio+KHRoaXMpIDogbnVsbHB0cjsKK30KKworY29uc3QgQ1BERl9OdW1iZXIqIENQREZfT2JqZWN0OjpBc051bWJlcigpIGNvbnN0IHsKKyAgcmV0dXJuIElzTnVtYmVyKCkgPyBzdGF0aWNfY2FzdDxjb25zdCBDUERGX051bWJlcio+KHRoaXMpIDogbnVsbHB0cjsKK30KKworQ1BERl9SZWZlcmVuY2UqIENQREZfT2JqZWN0OjpBc1JlZmVyZW5jZSgpIHsKKyAgcmV0dXJuIElzUmVmZXJlbmNlKCkgPyBzdGF0aWNfY2FzdDxDUERGX1JlZmVyZW5jZSo+KHRoaXMpIDogbnVsbHB0cjsKK30KKworY29uc3QgQ1BERl9SZWZlcmVuY2UqIENQREZfT2JqZWN0OjpBc1JlZmVyZW5jZSgpIGNvbnN0IHsKKyAgcmV0dXJuIElzUmVmZXJlbmNlKCkgPyBzdGF0aWNfY2FzdDxjb25zdCBDUERGX1JlZmVyZW5jZSo+KHRoaXMpIDogbnVsbHB0cjsKK30KKworQ1BERl9TdHJlYW0qIENQREZfT2JqZWN0OjpBc1N0cmVhbSgpIHsKKyAgcmV0dXJuIElzU3RyZWFtKCkgPyBzdGF0aWNfY2FzdDxDUERGX1N0cmVhbSo+KHRoaXMpIDogbnVsbHB0cjsKK30KKworY29uc3QgQ1BERl9TdHJlYW0qIENQREZfT2JqZWN0OjpBc1N0cmVhbSgpIGNvbnN0IHsKKyAgcmV0dXJuIElzU3RyZWFtKCkgPyBzdGF0aWNfY2FzdDxjb25zdCBDUERGX1N0cmVhbSo+KHRoaXMpIDogbnVsbHB0cjsKK30KKworQ1BERl9TdHJpbmcqIENQREZfT2JqZWN0OjpBc1N0cmluZygpIHsKKyAgcmV0dXJuIElzU3RyaW5nKCkgPyBzdGF0aWNfY2FzdDxDUERGX1N0cmluZyo+KHRoaXMpIDogbnVsbHB0cjsKK30KKworY29uc3QgQ1BERl9TdHJpbmcqIENQREZfT2JqZWN0OjpBc1N0cmluZygpIGNvbnN0IHsKKyAgcmV0dXJuIElzU3RyaW5nKCkgPyBzdGF0aWNfY2FzdDxjb25zdCBDUERGX1N0cmluZyo+KHRoaXMpIDogbnVsbHB0cjsKIH0KIAogQ1BERl9OdW1iZXI6OkNQREZfTnVtYmVyKGludCB2YWx1ZSkKLSAgICA6IENQREZfT2JqZWN0KFBERk9CSl9OVU1CRVIpLCBtX2JJbnRlZ2VyKFRSVUUpLCBtX0ludGVnZXIodmFsdWUpIHsKLX0KKyAgICA6IENQREZfT2JqZWN0KFBERk9CSl9OVU1CRVIpLCBtX2JJbnRlZ2VyKFRSVUUpLCBtX0ludGVnZXIodmFsdWUpIHt9CiAKIENQREZfTnVtYmVyOjpDUERGX051bWJlcihGWF9GTE9BVCB2YWx1ZSkKLSAgICA6IENQREZfT2JqZWN0KFBERk9CSl9OVU1CRVIpLCBtX2JJbnRlZ2VyKEZBTFNFKSwgbV9GbG9hdCh2YWx1ZSkgeworICAgIDogQ1BERl9PYmplY3QoUERGT0JKX05VTUJFUiksIG1fYkludGVnZXIoRkFMU0UpLCBtX0Zsb2F0KHZhbHVlKSB7fQorCitDUERGX051bWJlcjo6Q1BERl9OdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpCisgICAgOiBDUERGX09iamVjdChQREZPQkpfTlVNQkVSKSB7CisgIEZYX2F0b251bShzdHIsIG1fYkludGVnZXIsICZtX0ludGVnZXIpOwogfQogCi1DUERGX051bWJlcjo6Q1BERl9OdW1iZXIoRlhfQk9PTCBiSW50ZWdlciwgdm9pZCogcERhdGEpCi0gICAgOiBDUERGX09iamVjdChQREZPQkpfTlVNQkVSKSwgbV9iSW50ZWdlcihiSW50ZWdlciksIG1fSW50ZWdlcigqKGludCopcERhdGEpIHsKK3ZvaWQgQ1BERl9OdW1iZXI6OlNldFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgeworICBGWF9hdG9udW0oc3RyLCBtX2JJbnRlZ2VyLCAmbV9JbnRlZ2VyKTsKIH0KLQotQ1BERl9OdW1iZXI6OkNQREZfTnVtYmVyKEZYX0JTVFIgc3RyKSA6IENQREZfT2JqZWN0KFBERk9CSl9OVU1CRVIpIHsKLSAgICBGWF9hdG9udW0oc3RyLCBtX2JJbnRlZ2VyLCAmbV9JbnRlZ2VyKTsKK0ZYX0JPT0wgQ1BERl9OdW1iZXI6OklkZW50aWNhbChDUERGX051bWJlciogcE90aGVyKSBjb25zdCB7CisgIHJldHVybiBtX2JJbnRlZ2VyID09IHBPdGhlci0+bV9iSW50ZWdlciAmJiBtX0ludGVnZXIgPT0gcE90aGVyLT5tX0ludGVnZXI7CiB9Ci0KLXZvaWQgQ1BERl9OdW1iZXI6OlNldFN0cmluZyhGWF9CU1RSIHN0cikKLXsKLSAgICBGWF9hdG9udW0oc3RyLCBtX2JJbnRlZ2VyLCAmbV9JbnRlZ2VyKTsKK0NGWF9CeXRlU3RyaW5nIENQREZfTnVtYmVyOjpHZXRTdHJpbmcoKSBjb25zdCB7CisgIHJldHVybiBtX2JJbnRlZ2VyID8gQ0ZYX0J5dGVTdHJpbmc6OkZvcm1hdEludGVnZXIobV9JbnRlZ2VyLCBGWEZPUk1BVF9TSUdORUQpCisgICAgICAgICAgICAgICAgICAgIDogQ0ZYX0J5dGVTdHJpbmc6OkZvcm1hdEZsb2F0KG1fRmxvYXQpOwogfQotRlhfQk9PTCBDUERGX051bWJlcjo6SWRlbnRpY2FsKENQREZfTnVtYmVyKiBwT3RoZXIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fYkludGVnZXIgPT0gcE90aGVyLT5tX2JJbnRlZ2VyICYmIG1fSW50ZWdlciA9PSBwT3RoZXItPm1fSW50ZWdlcjsKK3ZvaWQgQ1BERl9OdW1iZXI6OlNldE51bWJlcihGWF9GTE9BVCB2YWx1ZSkgeworICBtX2JJbnRlZ2VyID0gRkFMU0U7CisgIG1fRmxvYXQgPSB2YWx1ZTsKIH0KLUNGWF9CeXRlU3RyaW5nIENQREZfTnVtYmVyOjpHZXRTdHJpbmcoKSBjb25zdAotewotICAgIHJldHVybiBtX2JJbnRlZ2VyID8gQ0ZYX0J5dGVTdHJpbmc6OkZvcm1hdEludGVnZXIobV9JbnRlZ2VyLCBGWEZPUk1BVF9TSUdORUQpIDogQ0ZYX0J5dGVTdHJpbmc6OkZvcm1hdEZsb2F0KG1fRmxvYXQpOworQ1BERl9TdHJpbmc6OkNQREZfU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpCisgICAgOiBDUERGX09iamVjdChQREZPQkpfU1RSSU5HKSwgbV9iSGV4KEZBTFNFKSB7CisgIG1fU3RyaW5nID0gUERGX0VuY29kZVRleHQoc3RyKTsKIH0KLXZvaWQgQ1BERl9OdW1iZXI6OlNldE51bWJlcihGWF9GTE9BVCB2YWx1ZSkKLXsKLSAgICBtX2JJbnRlZ2VyID0gRkFMU0U7Ci0gICAgbV9GbG9hdCA9IHZhbHVlOworQ1BERl9BcnJheTo6fkNQREZfQXJyYXkoKSB7CisgIGludCBzaXplID0gbV9PYmplY3RzLkdldFNpemUoKTsKKyAgQ1BERl9PYmplY3QqKiBwTGlzdCA9IG1fT2JqZWN0cy5HZXREYXRhKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgaWYgKHBMaXN0W2ldKQorICAgICAgcExpc3RbaV0tPlJlbGVhc2UoKTsKKyAgfQogfQotQ1BERl9TdHJpbmc6OkNQREZfU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIDogQ1BERl9PYmplY3QoUERGT0JKX1NUUklORyksIG1fYkhleChGQUxTRSkgewotICAgIG1fU3RyaW5nID0gUERGX0VuY29kZVRleHQoc3RyKTsKLX0KLUNQREZfQXJyYXk6On5DUERGX0FycmF5KCkKLXsKLSAgICBpbnQgc2l6ZSA9IG1fT2JqZWN0cy5HZXRTaXplKCk7Ci0gICAgQ1BERl9PYmplY3QqKiBwTGlzdCA9IChDUERGX09iamVjdCoqKW1fT2JqZWN0cy5HZXREYXRhKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpICsrKSB7Ci0gICAgICAgIGlmIChwTGlzdFtpXSkKLSAgICAgICAgICAgIHBMaXN0W2ldLT5SZWxlYXNlKCk7Ci0gICAgfQotfQotQ0ZYX0Zsb2F0UmVjdCBDUERGX0FycmF5OjpHZXRSZWN0KCkKLXsKLSAgICBDRlhfRmxvYXRSZWN0IHJlY3Q7Ci0gICAgaWYgKG1fVHlwZSAhPSBQREZPQkpfQVJSQVkgfHwgbV9PYmplY3RzLkdldFNpemUoKSAhPSA0KSB7Ci0gICAgICAgIHJldHVybiByZWN0OwotICAgIH0KLSAgICByZWN0LmxlZnQgPSBHZXROdW1iZXIoMCk7Ci0gICAgcmVjdC5ib3R0b20gPSBHZXROdW1iZXIoMSk7Ci0gICAgcmVjdC5yaWdodCA9IEdldE51bWJlcigyKTsKLSAgICByZWN0LnRvcCA9IEdldE51bWJlcigzKTsKK0NGWF9GbG9hdFJlY3QgQ1BERl9BcnJheTo6R2V0UmVjdCgpIHsKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0OworICBpZiAoIUlzQXJyYXkoKSB8fCBtX09iamVjdHMuR2V0U2l6ZSgpICE9IDQpCiAgICAgcmV0dXJuIHJlY3Q7CisKKyAgcmVjdC5sZWZ0ID0gR2V0TnVtYmVyKDApOworICByZWN0LmJvdHRvbSA9IEdldE51bWJlcigxKTsKKyAgcmVjdC5yaWdodCA9IEdldE51bWJlcigyKTsKKyAgcmVjdC50b3AgPSBHZXROdW1iZXIoMyk7CisgIHJldHVybiByZWN0OwogfQotQ0ZYX0FmZmluZU1hdHJpeCBDUERGX0FycmF5OjpHZXRNYXRyaXgoKQotewotICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwotICAgIGlmIChtX1R5cGUgIT0gUERGT0JKX0FSUkFZIHx8IG1fT2JqZWN0cy5HZXRTaXplKCkgIT0gNikgewotICAgICAgICByZXR1cm4gbWF0cml4OwotICAgIH0KLSAgICBtYXRyaXguU2V0KEdldE51bWJlcigwKSwgR2V0TnVtYmVyKDEpLCBHZXROdW1iZXIoMiksIEdldE51bWJlcigzKSwgR2V0TnVtYmVyKDQpLCBHZXROdW1iZXIoNSkpOworQ0ZYX01hdHJpeCBDUERGX0FycmF5OjpHZXRNYXRyaXgoKSB7CisgIENGWF9NYXRyaXggbWF0cml4OworICBpZiAoIUlzQXJyYXkoKSB8fCBtX09iamVjdHMuR2V0U2l6ZSgpICE9IDYpCiAgICAgcmV0dXJuIG1hdHJpeDsKKworICBtYXRyaXguU2V0KEdldE51bWJlcigwKSwgR2V0TnVtYmVyKDEpLCBHZXROdW1iZXIoMiksIEdldE51bWJlcigzKSwKKyAgICAgICAgICAgICBHZXROdW1iZXIoNCksIEdldE51bWJlcig1KSk7CisgIHJldHVybiBtYXRyaXg7CiB9Ci1DUERGX09iamVjdCogQ1BERl9BcnJheTo6R2V0RWxlbWVudChGWF9EV09SRCBpKSBjb25zdAotewotICAgIGlmIChpID49IChGWF9EV09SRCltX09iamVjdHMuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gKENQREZfT2JqZWN0KiltX09iamVjdHMuR2V0QXQoaSk7CitDUERGX09iamVjdCogQ1BERl9BcnJheTo6R2V0RWxlbWVudChGWF9EV09SRCBpKSBjb25zdCB7CisgIGlmIChpID49IChGWF9EV09SRCltX09iamVjdHMuR2V0U2l6ZSgpKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gbV9PYmplY3RzLkdldEF0KGkpOwogfQotQ1BERl9PYmplY3QqIENQREZfQXJyYXk6OkdldEVsZW1lbnRWYWx1ZShGWF9EV09SRCBpKSBjb25zdAotewotICAgIGlmIChpID49IChGWF9EV09SRCltX09iamVjdHMuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gKChDUERGX09iamVjdCopbV9PYmplY3RzLkdldEF0KGkpKS0+R2V0RGlyZWN0KCk7CitDUERGX09iamVjdCogQ1BERl9BcnJheTo6R2V0RWxlbWVudFZhbHVlKEZYX0RXT1JEIGkpIGNvbnN0IHsKKyAgaWYgKGkgPj0gKEZYX0RXT1JEKW1fT2JqZWN0cy5HZXRTaXplKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiBtX09iamVjdHMuR2V0QXQoaSktPkdldERpcmVjdCgpOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9BcnJheTo6R2V0U3RyaW5nKEZYX0RXT1JEIGkpIGNvbnN0Ci17Ci0gICAgaWYgKGkgPCAoRlhfRFdPUkQpbV9PYmplY3RzLkdldFNpemUoKSkgewotICAgICAgICBDUERGX09iamVjdCogcCA9IChDUERGX09iamVjdCopbV9PYmplY3RzLkdldEF0KGkpOwotICAgICAgICByZXR1cm4gcC0+R2V0U3RyaW5nKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7CitDRlhfQnl0ZVN0cmluZyBDUERGX0FycmF5OjpHZXRTdHJpbmcoRlhfRFdPUkQgaSkgY29uc3QgeworICBpZiAoaSA+PSAoRlhfRFdPUkQpbV9PYmplY3RzLkdldFNpemUoKSkKKyAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKKyAgcmV0dXJuIG1fT2JqZWN0cy5HZXRBdChpKS0+R2V0U3RyaW5nKCk7CiB9Ci1DRlhfQnl0ZVN0cmluZ0MgQ1BERl9BcnJheTo6R2V0Q29uc3RTdHJpbmcoRlhfRFdPUkQgaSkgY29uc3QKLXsKLSAgICBpZiAoaSA8IChGWF9EV09SRCltX09iamVjdHMuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwID0gKENQREZfT2JqZWN0KiltX09iamVjdHMuR2V0QXQoaSk7Ci0gICAgICAgIHJldHVybiBwLT5HZXRDb25zdFN0cmluZygpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MoKTsKK0NGWF9CeXRlU3RyaW5nQyBDUERGX0FycmF5OjpHZXRDb25zdFN0cmluZyhGWF9EV09SRCBpKSBjb25zdCB7CisgIGlmIChpID49IChGWF9EV09SRCltX09iamVjdHMuR2V0U2l6ZSgpKQorICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MoKTsKKyAgcmV0dXJuIG1fT2JqZWN0cy5HZXRBdChpKS0+R2V0Q29uc3RTdHJpbmcoKTsKIH0KLWludCBDUERGX0FycmF5OjpHZXRJbnRlZ2VyKEZYX0RXT1JEIGkpIGNvbnN0Ci17Ci0gICAgaWYgKGkgPj0gKEZYX0RXT1JEKW1fT2JqZWN0cy5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwID0gKENQREZfT2JqZWN0KiltX09iamVjdHMuR2V0QXQoaSk7CitpbnQgQ1BERl9BcnJheTo6R2V0SW50ZWdlcihGWF9EV09SRCBpKSBjb25zdCB7CisgIGlmIChpID49IChGWF9EV09SRCltX09iamVjdHMuR2V0U2l6ZSgpKQorICAgIHJldHVybiAwOworICByZXR1cm4gbV9PYmplY3RzLkdldEF0KGkpLT5HZXRJbnRlZ2VyKCk7Cit9CitGWF9GTE9BVCBDUERGX0FycmF5OjpHZXROdW1iZXIoRlhfRFdPUkQgaSkgY29uc3QgeworICBpZiAoaSA+PSAoRlhfRFdPUkQpbV9PYmplY3RzLkdldFNpemUoKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIG1fT2JqZWN0cy5HZXRBdChpKS0+R2V0TnVtYmVyKCk7Cit9CitDUERGX0RpY3Rpb25hcnkqIENQREZfQXJyYXk6OkdldERpY3QoRlhfRFdPUkQgaSkgY29uc3QgeworICBDUERGX09iamVjdCogcCA9IEdldEVsZW1lbnRWYWx1ZShpKTsKKyAgaWYgKCFwKQorICAgIHJldHVybiBOVUxMOworICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHAtPkFzRGljdGlvbmFyeSgpKQorICAgIHJldHVybiBwRGljdDsKKyAgaWYgKENQREZfU3RyZWFtKiBwU3RyZWFtID0gcC0+QXNTdHJlYW0oKSkKKyAgICByZXR1cm4gcFN0cmVhbS0+R2V0RGljdCgpOworICByZXR1cm4gTlVMTDsKK30KK0NQREZfU3RyZWFtKiBDUERGX0FycmF5OjpHZXRTdHJlYW0oRlhfRFdPUkQgaSkgY29uc3QgeworICByZXR1cm4gVG9TdHJlYW0oR2V0RWxlbWVudFZhbHVlKGkpKTsKK30KK0NQREZfQXJyYXkqIENQREZfQXJyYXk6OkdldEFycmF5KEZYX0RXT1JEIGkpIGNvbnN0IHsKKyAgcmV0dXJuIFRvQXJyYXkoR2V0RWxlbWVudFZhbHVlKGkpKTsKK30KK3ZvaWQgQ1BERl9BcnJheTo6UmVtb3ZlQXQoRlhfRFdPUkQgaSwgaW50IG5Db3VudCkgeworICBpZiAoaSA+PSAoRlhfRFdPUkQpbV9PYmplY3RzLkdldFNpemUoKSkKKyAgICByZXR1cm47CisKKyAgaWYgKG5Db3VudCA8PSAwIHx8IG5Db3VudCA+IG1fT2JqZWN0cy5HZXRTaXplKCkgLSBpKQorICAgIHJldHVybjsKKworICBmb3IgKGludCBqID0gMDsgaiA8IG5Db3VudDsgKytqKSB7CisgICAgaWYgKENQREZfT2JqZWN0KiBwID0gbV9PYmplY3RzLkdldEF0KGkgKyBqKSkKKyAgICAgIHAtPlJlbGVhc2UoKTsKKyAgfQorICBtX09iamVjdHMuUmVtb3ZlQXQoaSwgbkNvdW50KTsKK30KK3ZvaWQgQ1BERl9BcnJheTo6U2V0QXQoRlhfRFdPUkQgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIqIHBPYmpzKSB7CisgIEFTU0VSVChJc0FycmF5KCkpOworICBBU1NFUlQoaSA8IChGWF9EV09SRCltX09iamVjdHMuR2V0U2l6ZSgpKTsKKyAgaWYgKGkgPj0gKEZYX0RXT1JEKW1fT2JqZWN0cy5HZXRTaXplKCkpCisgICAgcmV0dXJuOworICBpZiAoQ1BERl9PYmplY3QqIHBPbGQgPSBtX09iamVjdHMuR2V0QXQoaSkpCisgICAgcE9sZC0+UmVsZWFzZSgpOworICBpZiAocE9iai0+R2V0T2JqTnVtKCkpIHsKKyAgICBBU1NFUlQocE9ianMpOworICAgIHBPYmogPSBuZXcgQ1BERl9SZWZlcmVuY2UocE9ianMsIHBPYmotPkdldE9iak51bSgpKTsKKyAgfQorICBtX09iamVjdHMuU2V0QXQoaSwgcE9iaik7Cit9Cit2b2lkIENQREZfQXJyYXk6Okluc2VydEF0KEZYX0RXT1JEIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlciogcE9ianMpIHsKKyAgaWYgKHBPYmotPkdldE9iak51bSgpKSB7CisgICAgQVNTRVJUKHBPYmpzKTsKKyAgICBwT2JqID0gbmV3IENQREZfUmVmZXJlbmNlKHBPYmpzLCBwT2JqLT5HZXRPYmpOdW0oKSk7CisgIH0KKyAgbV9PYmplY3RzLkluc2VydEF0KGluZGV4LCBwT2JqKTsKK30KK3ZvaWQgQ1BERl9BcnJheTo6QWRkKENQREZfT2JqZWN0KiBwT2JqLCBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBwT2JqcykgeworICBpZiAocE9iai0+R2V0T2JqTnVtKCkpIHsKKyAgICBBU1NFUlQocE9ianMpOworICAgIHBPYmogPSBuZXcgQ1BERl9SZWZlcmVuY2UocE9ianMsIHBPYmotPkdldE9iak51bSgpKTsKKyAgfQorICBtX09iamVjdHMuQWRkKHBPYmopOworfQordm9pZCBDUERGX0FycmF5OjpBZGROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpIHsKKyAgQVNTRVJUKElzQXJyYXkoKSk7CisgIEFkZChuZXcgQ1BERl9OYW1lKHN0cikpOworfQordm9pZCBDUERGX0FycmF5OjpBZGRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cikgeworICBBU1NFUlQoSXNBcnJheSgpKTsKKyAgQWRkKG5ldyBDUERGX1N0cmluZyhzdHIsIEZBTFNFKSk7Cit9Cit2b2lkIENQREZfQXJyYXk6OkFkZEludGVnZXIoaW50IGkpIHsKKyAgQVNTRVJUKElzQXJyYXkoKSk7CisgIEFkZChuZXcgQ1BERl9OdW1iZXIoaSkpOworfQordm9pZCBDUERGX0FycmF5OjpBZGROdW1iZXIoRlhfRkxPQVQgZikgeworICBBU1NFUlQoSXNBcnJheSgpKTsKKyAgQ1BERl9OdW1iZXIqIHBOdW1iZXIgPSBuZXcgQ1BERl9OdW1iZXI7CisgIHBOdW1iZXItPlNldE51bWJlcihmKTsKKyAgQWRkKHBOdW1iZXIpOworfQordm9pZCBDUERGX0FycmF5OjpBZGRSZWZlcmVuY2UoQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlciogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG9iam51bSkgeworICBBU1NFUlQoSXNBcnJheSgpKTsKKyAgQWRkKG5ldyBDUERGX1JlZmVyZW5jZShwRG9jLCBvYmpudW0pKTsKK30KK0ZYX0JPT0wgQ1BERl9BcnJheTo6SWRlbnRpY2FsKENQREZfQXJyYXkqIHBPdGhlcikgY29uc3QgeworICBpZiAobV9PYmplY3RzLkdldFNpemUoKSAhPSBwT3RoZXItPm1fT2JqZWN0cy5HZXRTaXplKCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX09iamVjdHMuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoIW1fT2JqZWN0c1tpXS0+SXNJZGVudGljYWwocE90aGVyLT5tX09iamVjdHNbaV0pKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOworfQorQ1BERl9EaWN0aW9uYXJ5Ojp+Q1BERl9EaWN0aW9uYXJ5KCkgeworICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogbV9NYXApIHsKKyAgICBpdC5zZWNvbmQtPlJlbGVhc2UoKTsKKyAgfQorfQorQ1BERl9PYmplY3QqIENQREZfRGljdGlvbmFyeTo6R2V0RWxlbWVudChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3QgeworICBhdXRvIGl0ID0gbV9NYXAuZmluZChrZXkpOworICBpZiAoaXQgPT0gbV9NYXAuZW5kKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiBpdC0+c2Vjb25kOworfQorQ1BERl9PYmplY3QqIENQREZfRGljdGlvbmFyeTo6R2V0RWxlbWVudFZhbHVlKAorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdCB7CisgIENQREZfT2JqZWN0KiBwID0gR2V0RWxlbWVudChrZXkpOworICByZXR1cm4gcCA/IHAtPkdldERpcmVjdCgpIDogbnVsbHB0cjsKK30KK0NGWF9CeXRlU3RyaW5nIENQREZfRGljdGlvbmFyeTo6R2V0U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdCB7CisgIENQREZfT2JqZWN0KiBwID0gR2V0RWxlbWVudChrZXkpOworICBpZiAocCkgeworICAgIHJldHVybiBwLT5HZXRTdHJpbmcoKTsKKyAgfQorICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKK30KK0NGWF9CeXRlU3RyaW5nQyBDUERGX0RpY3Rpb25hcnk6OkdldENvbnN0U3RyaW5nKAorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdCB7CisgIENQREZfT2JqZWN0KiBwID0gR2V0RWxlbWVudChrZXkpOworICBpZiAocCkgeworICAgIHJldHVybiBwLT5HZXRDb25zdFN0cmluZygpOworICB9CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MoKTsKK30KK0NGWF9XaWRlU3RyaW5nIENQREZfRGljdGlvbmFyeTo6R2V0VW5pY29kZVRleHQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9DaGFyTWFwKiBwQ2hhck1hcCkgY29uc3QgeworICBDUERGX09iamVjdCogcCA9IEdldEVsZW1lbnQoa2V5KTsKKyAgaWYgKENQREZfUmVmZXJlbmNlKiBwUmVmID0gVG9SZWZlcmVuY2UocCkpCisgICAgcCA9IHBSZWYtPkdldERpcmVjdCgpOworICByZXR1cm4gcCA/IHAtPkdldFVuaWNvZGVUZXh0KHBDaGFyTWFwKSA6IENGWF9XaWRlU3RyaW5nKCk7Cit9CitDRlhfQnl0ZVN0cmluZyBDUERGX0RpY3Rpb25hcnk6OkdldFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZGVmKSBjb25zdCB7CisgIENQREZfT2JqZWN0KiBwID0gR2V0RWxlbWVudChrZXkpOworICBpZiAocCkgeworICAgIHJldHVybiBwLT5HZXRTdHJpbmcoKTsKKyAgfQorICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoZGVmKTsKK30KK0NGWF9CeXRlU3RyaW5nQyBDUERGX0RpY3Rpb25hcnk6OkdldENvbnN0U3RyaW5nKAorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LAorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZGVmKSBjb25zdCB7CisgIENQREZfT2JqZWN0KiBwID0gR2V0RWxlbWVudChrZXkpOworICBpZiAocCkgeworICAgIHJldHVybiBwLT5HZXRDb25zdFN0cmluZygpOworICB9CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MoZGVmKTsKK30KK2ludCBDUERGX0RpY3Rpb25hcnk6OkdldEludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0IHsKKyAgQ1BERl9PYmplY3QqIHAgPSBHZXRFbGVtZW50KGtleSk7CisgIGlmIChwKSB7CiAgICAgcmV0dXJuIHAtPkdldEludGVnZXIoKTsKKyAgfQorICByZXR1cm4gMDsKIH0KLUZYX0ZMT0FUIENQREZfQXJyYXk6OkdldE51bWJlcihGWF9EV09SRCBpKSBjb25zdAotewotICAgIGlmIChpID49IChGWF9EV09SRCltX09iamVjdHMuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcCA9IChDUERGX09iamVjdCopbV9PYmplY3RzLkdldEF0KGkpOworaW50IENQREZfRGljdGlvbmFyeTo6R2V0SW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgaW50IGRlZikgY29uc3QgeworICBDUERGX09iamVjdCogcCA9IEdldEVsZW1lbnQoa2V5KTsKKyAgaWYgKHApIHsKKyAgICByZXR1cm4gcC0+R2V0SW50ZWdlcigpOworICB9CisgIHJldHVybiBkZWY7Cit9CitGWF9GTE9BVCBDUERGX0RpY3Rpb25hcnk6OkdldE51bWJlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3QgeworICBDUERGX09iamVjdCogcCA9IEdldEVsZW1lbnQoa2V5KTsKKyAgaWYgKHApIHsKICAgICByZXR1cm4gcC0+R2V0TnVtYmVyKCk7CisgIH0KKyAgcmV0dXJuIDA7CiB9Ci1DUERGX0RpY3Rpb25hcnkqIENQREZfQXJyYXk6OkdldERpY3QoRlhfRFdPUkQgaSkgY29uc3QKLXsKLSAgICBDUERGX09iamVjdCogcCA9IEdldEVsZW1lbnRWYWx1ZShpKTsKLSAgICBpZiAocCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0gZWxzZSBpZiAocC0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgIHJldHVybiAoQ1BERl9EaWN0aW9uYXJ5KilwOwotICAgIH0gZWxzZSBpZiAocC0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pIHsKLSAgICAgICAgcmV0dXJuICgoQ1BERl9TdHJlYW0qKXApLT5HZXREaWN0KCk7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOworRlhfQk9PTCBDUERGX0RpY3Rpb25hcnk6OkdldEJvb2xlYW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEZWZhdWx0KSBjb25zdCB7CisgIENQREZfT2JqZWN0KiBwID0gR2V0RWxlbWVudChrZXkpOworICBpZiAoVG9Cb29sZWFuKHApKQorICAgIHJldHVybiBwLT5HZXRJbnRlZ2VyKCk7CisgIHJldHVybiBiRGVmYXVsdDsKIH0KLUNQREZfU3RyZWFtKiBDUERGX0FycmF5OjpHZXRTdHJlYW0oRlhfRFdPUkQgaSkgY29uc3QKLXsKLSAgICBDUERGX09iamVjdCogcCA9IEdldEVsZW1lbnRWYWx1ZShpKTsKLSAgICBpZiAocCA9PSBOVUxMIHx8IHAtPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gKENQREZfU3RyZWFtKilwOworQ1BERl9EaWN0aW9uYXJ5KiBDUERGX0RpY3Rpb25hcnk6OkdldERpY3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXkpIGNvbnN0IHsKKyAgQ1BERl9PYmplY3QqIHAgPSBHZXRFbGVtZW50VmFsdWUoa2V5KTsKKyAgaWYgKCFwKQorICAgIHJldHVybiBudWxscHRyOworICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHAtPkFzRGljdGlvbmFyeSgpKQorICAgIHJldHVybiBwRGljdDsKKyAgaWYgKENQREZfU3RyZWFtKiBwU3RyZWFtID0gcC0+QXNTdHJlYW0oKSkKKyAgICByZXR1cm4gcFN0cmVhbS0+R2V0RGljdCgpOworICByZXR1cm4gbnVsbHB0cjsKIH0KLUNQREZfQXJyYXkqIENQREZfQXJyYXk6OkdldEFycmF5KEZYX0RXT1JEIGkpIGNvbnN0Ci17Ci0gICAgQ1BERl9PYmplY3QqIHAgPSBHZXRFbGVtZW50VmFsdWUoaSk7Ci0gICAgaWYgKHAgPT0gTlVMTCB8fCBwLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gKENQREZfQXJyYXkqKXA7CitDUERGX0FycmF5KiBDUERGX0RpY3Rpb25hcnk6OkdldEFycmF5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdCB7CisgIHJldHVybiBUb0FycmF5KEdldEVsZW1lbnRWYWx1ZShrZXkpKTsKIH0KLXZvaWQgQ1BERl9BcnJheTo6UmVtb3ZlQXQoRlhfRFdPUkQgaSkKLXsKLSAgICBBU1NFUlQobV9UeXBlID09IFBERk9CSl9BUlJBWSk7Ci0gICAgaWYgKGkgPj0gKEZYX0RXT1JEKW1fT2JqZWN0cy5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcCA9IChDUERGX09iamVjdCopbV9PYmplY3RzLkdldEF0KGkpOwotICAgIGlmIChwKQotICAgICAgICBwLT5SZWxlYXNlKCk7Ci0gICAgbV9PYmplY3RzLlJlbW92ZUF0KGkpOworQ1BERl9TdHJlYW0qIENQREZfRGljdGlvbmFyeTo6R2V0U3RyZWFtKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdCB7CisgIHJldHVybiBUb1N0cmVhbShHZXRFbGVtZW50VmFsdWUoa2V5KSk7CiB9Ci12b2lkIENQREZfQXJyYXk6OlNldEF0KEZYX0RXT1JEIGksIENQREZfT2JqZWN0KiBwT2JqLCBDUERGX0luZGlyZWN0T2JqZWN0cyogcE9ianMpCi17Ci0gICAgQVNTRVJUKG1fVHlwZSA9PSBQREZPQkpfQVJSQVkpOwotICAgIEFTU0VSVChpIDwgKEZYX0RXT1JEKW1fT2JqZWN0cy5HZXRTaXplKCkpOwotICAgIGlmIChpID49IChGWF9EV09SRCltX09iamVjdHMuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBPbGQgPSAoQ1BERl9PYmplY3QqKW1fT2JqZWN0cy5HZXRBdChpKTsKLSAgICBpZiAocE9sZCkKLSAgICAgICAgcE9sZC0+UmVsZWFzZSgpOwotICAgIGlmIChwT2JqLT5HZXRPYmpOdW0oKSkgewotICAgICAgICBBU1NFUlQocE9ianMgIT0gTlVMTCk7Ci0gICAgICAgIHBPYmogPSBDUERGX1JlZmVyZW5jZTo6Q3JlYXRlKHBPYmpzLCBwT2JqLT5HZXRPYmpOdW0oKSk7Ci0gICAgfQotICAgIG1fT2JqZWN0cy5TZXRBdChpLCBwT2JqKTsKK0NGWF9GbG9hdFJlY3QgQ1BERl9EaWN0aW9uYXJ5OjpHZXRSZWN0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdCB7CisgIENGWF9GbG9hdFJlY3QgcmVjdDsKKyAgQ1BERl9BcnJheSogcEFycmF5ID0gR2V0QXJyYXkoa2V5KTsKKyAgaWYgKHBBcnJheSkKKyAgICByZWN0ID0gcEFycmF5LT5HZXRSZWN0KCk7CisgIHJldHVybiByZWN0OwogfQotdm9pZCBDUERGX0FycmF5OjpJbnNlcnRBdChGWF9EV09SRCBpbmRleCwgQ1BERl9PYmplY3QqIHBPYmosIENQREZfSW5kaXJlY3RPYmplY3RzKiBwT2JqcykKLXsKLSAgICBBU1NFUlQocE9iaiAhPSBOVUxMKTsKLSAgICBpZiAocE9iai0+R2V0T2JqTnVtKCkpIHsKLSAgICAgICAgQVNTRVJUKHBPYmpzICE9IE5VTEwpOwotICAgICAgICBwT2JqID0gQ1BERl9SZWZlcmVuY2U6OkNyZWF0ZShwT2JqcywgcE9iai0+R2V0T2JqTnVtKCkpOwotICAgIH0KLSAgICBtX09iamVjdHMuSW5zZXJ0QXQoaW5kZXgsIHBPYmopOworQ0ZYX01hdHJpeCBDUERGX0RpY3Rpb25hcnk6OkdldE1hdHJpeChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgY29uc3QgeworICBDRlhfTWF0cml4IG1hdHJpeDsKKyAgQ1BERl9BcnJheSogcEFycmF5ID0gR2V0QXJyYXkoa2V5KTsKKyAgaWYgKHBBcnJheSkKKyAgICBtYXRyaXggPSBwQXJyYXktPkdldE1hdHJpeCgpOworICByZXR1cm4gbWF0cml4OwogfQotdm9pZCBDUERGX0FycmF5OjpBZGQoQ1BERl9PYmplY3QqIHBPYmosIENQREZfSW5kaXJlY3RPYmplY3RzKiBwT2JqcykKLXsKLSAgICBBU1NFUlQocE9iaiAhPSBOVUxMKTsKLSAgICBpZiAocE9iai0+R2V0T2JqTnVtKCkpIHsKLSAgICAgICAgQVNTRVJUKHBPYmpzICE9IE5VTEwpOwotICAgICAgICBwT2JqID0gQ1BERl9SZWZlcmVuY2U6OkNyZWF0ZShwT2JqcywgcE9iai0+R2V0T2JqTnVtKCkpOwotICAgIH0KLSAgICBtX09iamVjdHMuQWRkKHBPYmopOworRlhfQk9PTCBDUERGX0RpY3Rpb25hcnk6OktleUV4aXN0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5KSBjb25zdCB7CisgIHJldHVybiBwZGZpdW06OkNvbnRhaW5zS2V5KG1fTWFwLCBrZXkpOwogfQotdm9pZCBDUERGX0FycmF5OjpBZGROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpCi17Ci0gICAgQVNTRVJUKG1fVHlwZSA9PSBQREZPQkpfQVJSQVkpOwotICAgIEFkZChuZXcgQ1BERl9OYW1lKHN0cikpOwotfQotdm9pZCBDUERGX0FycmF5OjpBZGRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cikKLXsKLSAgICBBU1NFUlQobV9UeXBlID09IFBERk9CSl9BUlJBWSk7Ci0gICAgQWRkKG5ldyBDUERGX1N0cmluZyhzdHIpKTsKLX0KLXZvaWQgQ1BERl9BcnJheTo6QWRkSW50ZWdlcihpbnQgaSkKLXsKLSAgICBBU1NFUlQobV9UeXBlID09IFBERk9CSl9BUlJBWSk7Ci0gICAgQWRkKG5ldyBDUERGX051bWJlcihpKSk7Ci19Ci12b2lkIENQREZfQXJyYXk6OkFkZE51bWJlcihGWF9GTE9BVCBmKQotewotICAgIEFTU0VSVChtX1R5cGUgPT0gUERGT0JKX0FSUkFZKTsKLSAgICBDUERGX051bWJlciogcE51bWJlciA9IG5ldyBDUERGX051bWJlcjsKLSAgICBwTnVtYmVyLT5TZXROdW1iZXIoZik7Ci0gICAgQWRkKHBOdW1iZXIpOwotfQotdm9pZCBDUERGX0FycmF5OjpBZGRSZWZlcmVuY2UoQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBEb2MsIEZYX0RXT1JEIG9iam51bSkKLXsKLSAgICBBU1NFUlQobV9UeXBlID09IFBERk9CSl9BUlJBWSk7Ci0gICAgQWRkKG5ldyBDUERGX1JlZmVyZW5jZShwRG9jLCBvYmpudW0pKTsKLX0KLUZYX0JPT0wgQ1BERl9BcnJheTo6SWRlbnRpY2FsKENQREZfQXJyYXkqIHBPdGhlcikgY29uc3QKLXsKLSAgICBpZiAobV9PYmplY3RzLkdldFNpemUoKSAhPSBwT3RoZXItPm1fT2JqZWN0cy5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fT2JqZWN0cy5HZXRTaXplKCk7IGkgKyspCi0gICAgICAgIGlmICghKChDUERGX09iamVjdCopbV9PYmplY3RzW2ldKS0+SXNJZGVudGljYWwoKENQREZfT2JqZWN0KilwT3RoZXItPm1fT2JqZWN0c1tpXSkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIHJldHVybiBUUlVFOwotfQotQ1BERl9EaWN0aW9uYXJ5Ojp+Q1BERl9EaWN0aW9uYXJ5KCkKLXsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBtX01hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBGWF9MUFZPSUQgdmFsdWUgPSBtX01hcC5HZXROZXh0VmFsdWUocG9zKTsKLSAgICAgICAgaWYgKHZhbHVlKQotICAgICAgICAgICAgKChDUERGX09iamVjdCopdmFsdWUpLT5SZWxlYXNlKCk7Ci0gICAgfQotfQotRlhfUE9TSVRJT04gQ1BERl9EaWN0aW9uYXJ5OjpHZXRTdGFydFBvcygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKLX0KLUNQREZfT2JqZWN0KiBDUERGX0RpY3Rpb25hcnk6OkdldE5leHRFbGVtZW50KEZYX1BPU0lUSU9OJiBwb3MsIENGWF9CeXRlU3RyaW5nJiBrZXkpIGNvbnN0Ci17Ci0gICAgaWYgKHBvcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcDsKLSAgICBtX01hcC5HZXROZXh0QXNzb2MocG9zLCBrZXksIChGWF9MUFZPSUQmKXApOwotICAgIHJldHVybiBwOwotfQotQ1BERl9PYmplY3QqIENQREZfRGljdGlvbmFyeTo6R2V0RWxlbWVudChGWF9CU1RSIGtleSkgY29uc3QKLXsKLSAgICBDUERGX09iamVjdCogcCA9IE5VTEw7Ci0gICAgbV9NYXAuTG9va3VwKGtleSwgKHZvaWQqJilwKTsKLSAgICByZXR1cm4gcDsKLX0KLUNQREZfT2JqZWN0KiBDUERGX0RpY3Rpb25hcnk6OkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSIGtleSkgY29uc3QKLXsKLSAgICBDUERGX09iamVjdCogcCA9IE5VTEw7Ci0gICAgbV9NYXAuTG9va3VwKGtleSwgKHZvaWQqJilwKTsKLSAgICByZXR1cm4gcCA/IHAtPkdldERpcmVjdCgpIDogTlVMTDsKLX0KLUNGWF9CeXRlU3RyaW5nIENQREZfRGljdGlvbmFyeTo6R2V0U3RyaW5nKEZYX0JTVFIga2V5KSBjb25zdAotewotICAgIENQREZfT2JqZWN0KiBwID0gTlVMTDsKLSAgICBtX01hcC5Mb29rdXAoa2V5LCAodm9pZComKXApOwotICAgIGlmIChwKQotICAgICAgICByZXR1cm4gcC0+R2V0U3RyaW5nKCk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKLX0KLUNGWF9CeXRlU3RyaW5nQyBDUERGX0RpY3Rpb25hcnk6OkdldENvbnN0U3RyaW5nKEZYX0JTVFIga2V5KSBjb25zdAotewotICAgIENQREZfT2JqZWN0KiBwID0gTlVMTDsKLSAgICBtX01hcC5Mb29rdXAoa2V5LCAodm9pZComKXApOwotICAgIGlmIChwKQotICAgICAgICByZXR1cm4gcC0+R2V0Q29uc3RTdHJpbmcoKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MoKTsKLX0KLUNGWF9XaWRlU3RyaW5nIENQREZfRGljdGlvbmFyeTo6R2V0VW5pY29kZVRleHQoRlhfQlNUUiBrZXksIENGWF9DaGFyTWFwKiBwQ2hhck1hcCkgY29uc3QKLXsKLSAgICBDUERGX09iamVjdCogcCA9IE5VTEw7Ci0gICAgbV9NYXAuTG9va3VwKGtleSwgKHZvaWQqJilwKTsKLSAgICBpZiAocCkgewotICAgICAgICBpZihwLT5HZXRUeXBlKCkgPT0gUERGT0JKX1JFRkVSRU5DRSkgewotICAgICAgICAgICAgcCA9ICgoQ1BERl9SZWZlcmVuY2UqKXApLT5HZXREaXJlY3QoKTsKLSAgICAgICAgICAgIGlmIChwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHAtPkdldFVuaWNvZGVUZXh0KHBDaGFyTWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBwLT5HZXRVbmljb2RlVGV4dChwQ2hhck1hcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci19Ci1DRlhfQnl0ZVN0cmluZyBDUERGX0RpY3Rpb25hcnk6OkdldFN0cmluZyhGWF9CU1RSIGtleSwgRlhfQlNUUiBkZWYpIGNvbnN0Ci17Ci0gICAgQ1BERl9PYmplY3QqIHAgPSBOVUxMOwotICAgIG1fTWFwLkxvb2t1cChrZXksICh2b2lkKiYpcCk7Ci0gICAgaWYgKHApIHsKLSAgICAgICAgcmV0dXJuIHAtPkdldFN0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoZGVmKTsKLX0KLUNGWF9CeXRlU3RyaW5nQyBDUERGX0RpY3Rpb25hcnk6OkdldENvbnN0U3RyaW5nKEZYX0JTVFIga2V5LCBGWF9CU1RSIGRlZikgY29uc3QKLXsKLSAgICBDUERGX09iamVjdCogcCA9IE5VTEw7Ci0gICAgbV9NYXAuTG9va3VwKGtleSwgKHZvaWQqJilwKTsKLSAgICBpZiAocCkKLSAgICAgICAgcmV0dXJuIHAtPkdldENvbnN0U3RyaW5nKCk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKGRlZik7Ci19Ci1pbnQgQ1BERl9EaWN0aW9uYXJ5OjpHZXRJbnRlZ2VyKEZYX0JTVFIga2V5KSBjb25zdAotewotICAgIENQREZfT2JqZWN0KiBwID0gTlVMTDsKLSAgICBtX01hcC5Mb29rdXAoa2V5LCAodm9pZComKXApOwotICAgIGlmIChwKSB7Ci0gICAgICAgIHJldHVybiBwLT5HZXRJbnRlZ2VyKCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotaW50IENQREZfRGljdGlvbmFyeTo6R2V0SW50ZWdlcihGWF9CU1RSIGtleSwgaW50IGRlZikgY29uc3QKLXsKLSAgICBDUERGX09iamVjdCogcCA9IE5VTEw7Ci0gICAgbV9NYXAuTG9va3VwKGtleSwgKHZvaWQqJilwKTsKLSAgICBpZiAocCkgewotICAgICAgICByZXR1cm4gcC0+R2V0SW50ZWdlcigpOwotICAgIH0KLSAgICByZXR1cm4gZGVmOwotfQotRlhfRkxPQVQgQ1BERl9EaWN0aW9uYXJ5OjpHZXROdW1iZXIoRlhfQlNUUiBrZXkpIGNvbnN0Ci17Ci0gICAgQ1BERl9PYmplY3QqIHAgPSBOVUxMOwotICAgIG1fTWFwLkxvb2t1cChrZXksICh2b2lkKiYpcCk7Ci0gICAgaWYgKHApIHsKLSAgICAgICAgcmV0dXJuIHAtPkdldE51bWJlcigpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLUZYX0JPT0wgQ1BERl9EaWN0aW9uYXJ5OjpHZXRCb29sZWFuKEZYX0JTVFIga2V5LCBGWF9CT09MIGJEZWZhdWx0KSBjb25zdAotewotICAgIENQREZfT2JqZWN0KiBwID0gTlVMTDsKLSAgICBtX01hcC5Mb29rdXAoa2V5LCAodm9pZComKXApOwotICAgIGlmIChwICYmIHAtPkdldFR5cGUoKSA9PSBQREZPQkpfQk9PTEVBTikgewotICAgICAgICByZXR1cm4gcC0+R2V0SW50ZWdlcigpOwotICAgIH0KLSAgICByZXR1cm4gYkRlZmF1bHQ7Ci19Ci1DUERGX0RpY3Rpb25hcnkqIENQREZfRGljdGlvbmFyeTo6R2V0RGljdChGWF9CU1RSIGtleSkgY29uc3QKLXsKLSAgICBDUERGX09iamVjdCogcCA9IEdldEVsZW1lbnRWYWx1ZShrZXkpOwotICAgIGlmIChwID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfSBlbHNlIGlmIChwLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgcmV0dXJuIChDUERGX0RpY3Rpb25hcnkqKXA7Ci0gICAgfSBlbHNlIGlmIChwLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgewotICAgICAgICByZXR1cm4gKChDUERGX1N0cmVhbSopcCktPkdldERpY3QoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci1DUERGX0FycmF5KiBDUERGX0RpY3Rpb25hcnk6OkdldEFycmF5KEZYX0JTVFIga2V5KSBjb25zdAotewotICAgIENQREZfT2JqZWN0KiBwID0gR2V0RWxlbWVudFZhbHVlKGtleSk7Ci0gICAgaWYgKHAgPT0gTlVMTCB8fCBwLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gKENQREZfQXJyYXkqKXA7Ci19Ci1DUERGX1N0cmVhbSogQ1BERl9EaWN0aW9uYXJ5OjpHZXRTdHJlYW0oRlhfQlNUUiBrZXkpIGNvbnN0Ci17Ci0gICAgQ1BERl9PYmplY3QqIHAgPSBHZXRFbGVtZW50VmFsdWUoa2V5KTsKLSAgICBpZiAocCA9PSBOVUxMIHx8IHAtPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gKENQREZfU3RyZWFtKilwOwotfQotQ0ZYX0Zsb2F0UmVjdCBDUERGX0RpY3Rpb25hcnk6OkdldFJlY3QoRlhfQlNUUiBrZXkpIGNvbnN0Ci17Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByZWN0OwotICAgIENQREZfQXJyYXkqIHBBcnJheSA9IEdldEFycmF5KGtleSk7Ci0gICAgaWYgKHBBcnJheSkgewotICAgICAgICByZWN0ID0gcEFycmF5LT5HZXRSZWN0KCk7Ci0gICAgfQotICAgIHJldHVybiByZWN0OwotfQotQ0ZYX0FmZmluZU1hdHJpeCBDUERGX0RpY3Rpb25hcnk6OkdldE1hdHJpeChGWF9CU1RSIGtleSkgY29uc3QKLXsKLSAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKLSAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBHZXRBcnJheShrZXkpOwotICAgIGlmIChwQXJyYXkpIHsKLSAgICAgICAgbWF0cml4ID0gcEFycmF5LT5HZXRNYXRyaXgoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hdHJpeDsKLX0KLUZYX0JPT0wgQ1BERl9EaWN0aW9uYXJ5OjpLZXlFeGlzdChGWF9CU1RSIGtleSkgY29uc3QKLXsKLSAgICBGWF9MUFZPSUQgdmFsdWU7Ci0gICAgcmV0dXJuIG1fTWFwLkxvb2t1cChrZXksIHZhbHVlKTsKLX0KLXZvaWQgQ1BERl9EaWN0aW9uYXJ5OjpTZXRBdChGWF9CU1RSIGtleSwgQ1BERl9PYmplY3QqIHBPYmosIENQREZfSW5kaXJlY3RPYmplY3RzKiBwT2JqcykKLXsKLSAgICBBU1NFUlQobV9UeXBlID09IFBERk9CSl9ESUNUSU9OQVJZKTsKLSAgICBDUERGX09iamVjdCogcCA9IE5VTEw7Ci0gICAgbV9NYXAuTG9va3VwKGtleSwgKHZvaWQqJilwKTsKLSAgICBpZiAocCA9PSBwT2JqKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHApCi0gICAgICAgIHAtPlJlbGVhc2UoKTsKLSAgICBpZiAocE9iaikgewotICAgICAgICBpZiAocE9iai0+R2V0T2JqTnVtKCkpIHsKLSAgICAgICAgICAgIEFTU0VSVChwT2JqcyAhPSBOVUxMKTsKLSAgICAgICAgICAgIHBPYmogPSBDUERGX1JlZmVyZW5jZTo6Q3JlYXRlKHBPYmpzLCBwT2JqLT5HZXRPYmpOdW0oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9NYXAuU2V0QXQoa2V5LCBwT2JqKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX01hcC5SZW1vdmVLZXkoa2V5KTsKLSAgICB9Ci19Ci12b2lkIENQREZfRGljdGlvbmFyeTo6QWRkVmFsdWUoRlhfQlNUUiBrZXksIENQREZfT2JqZWN0KiBwT2JqKQotewotICAgIEFTU0VSVChtX1R5cGUgPT0gUERGT0JKX0RJQ1RJT05BUlkpOwotICAgIG1fTWFwLkFkZFZhbHVlKGtleSwgcE9iaik7Ci19Ci12b2lkIENQREZfRGljdGlvbmFyeTo6UmVtb3ZlQXQoRlhfQlNUUiBrZXkpCi17Ci0gICAgQVNTRVJUKG1fVHlwZSA9PSBQREZPQkpfRElDVElPTkFSWSk7Ci0gICAgQ1BERl9PYmplY3QqIHAgPSBOVUxMOwotICAgIG1fTWFwLkxvb2t1cChrZXksICh2b2lkKiYpcCk7Ci0gICAgaWYgKHAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHAtPlJlbGVhc2UoKTsKLSAgICBtX01hcC5SZW1vdmVLZXkoa2V5KTsKLX0KLXZvaWQgQ1BERl9EaWN0aW9uYXJ5OjpSZXBsYWNlS2V5KEZYX0JTVFIgb2xka2V5LCBGWF9CU1RSIG5ld2tleSkKLXsKLSAgICBBU1NFUlQobV9UeXBlID09IFBERk9CSl9ESUNUSU9OQVJZKTsKLSAgICBDUERGX09iamVjdCogcCA9IE5VTEw7Ci0gICAgbV9NYXAuTG9va3VwKG9sZGtleSwgKHZvaWQqJilwKTsKLSAgICBpZiAocCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9NYXAuUmVtb3ZlS2V5KG9sZGtleSk7Ci0gICAgbV9NYXAuU2V0QXQobmV3a2V5LCBwKTsKLX0KLUZYX0JPT0wgQ1BERl9EaWN0aW9uYXJ5OjpJZGVudGljYWwoQ1BERl9EaWN0aW9uYXJ5KiBwT3RoZXIpIGNvbnN0Ci17Ci0gICAgaWYgKHBPdGhlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG1fTWFwLkdldENvdW50KCkgIT0gcE90aGVyLT5tX01hcC5HZXRDb3VudCgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9NYXAuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5OwotICAgICAgICBGWF9MUFZPSUQgdmFsdWU7Ci0gICAgICAgIG1fTWFwLkdldE5leHRBc3NvYyhwb3MsIGtleSwgdmFsdWUpOwotICAgICAgICBpZiAoIXZhbHVlKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBpZiAoISgoQ1BERl9PYmplY3QqKXZhbHVlKS0+SXNJZGVudGljYWwocE90aGVyLT5HZXRFbGVtZW50KGtleSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci12b2lkIENQREZfRGljdGlvbmFyeTo6U2V0QXRJbnRlZ2VyKEZYX0JTVFIga2V5LCBpbnQgaSkKLXsKLSAgICBTZXRBdChrZXksIG5ldyBDUERGX051bWJlcihpKSk7Ci19Ci12b2lkIENQREZfRGljdGlvbmFyeTo6U2V0QXROYW1lKEZYX0JTVFIga2V5LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkKLXsKLSAgICBTZXRBdChrZXksIG5ldyBDUERGX05hbWUobmFtZSkpOwotfQotdm9pZCBDUERGX0RpY3Rpb25hcnk6OlNldEF0U3RyaW5nKEZYX0JTVFIga2V5LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKQotewotICAgIFNldEF0KGtleSwgbmV3IENQREZfU3RyaW5nKHN0cikpOwotfQotdm9pZCBDUERGX0RpY3Rpb25hcnk6OlNldEF0UmVmZXJlbmNlKEZYX0JTVFIga2V5LCBDUERGX0luZGlyZWN0T2JqZWN0cyogcERvYywgRlhfRFdPUkQgb2JqbnVtKQotewotICAgIFNldEF0KGtleSwgbmV3IENQREZfUmVmZXJlbmNlKHBEb2MsIG9iam51bSkpOwotfQotdm9pZCBDUERGX0RpY3Rpb25hcnk6OkFkZFJlZmVyZW5jZShGWF9CU1RSIGtleSwgQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBEb2MsIEZYX0RXT1JEIG9iam51bSkKLXsKLSAgICBBZGRWYWx1ZShrZXksIG5ldyBDUERGX1JlZmVyZW5jZShwRG9jLCBvYmpudW0pKTsKLX0KLXZvaWQgQ1BERl9EaWN0aW9uYXJ5OjpTZXRBdE51bWJlcihGWF9CU1RSIGtleSwgRlhfRkxPQVQgZikKLXsKLSAgICBDUERGX051bWJlciogcE51bWJlciA9IG5ldyBDUERGX051bWJlcjsKLSAgICBwTnVtYmVyLT5TZXROdW1iZXIoZik7Ci0gICAgU2V0QXQoa2V5LCBwTnVtYmVyKTsKLX0KLXZvaWQgQ1BERl9EaWN0aW9uYXJ5OjpTZXRBdEJvb2xlYW4oRlhfQlNUUiBrZXksIEZYX0JPT0wgYlZhbHVlKQotewotICAgIFNldEF0KGtleSwgbmV3IENQREZfQm9vbGVhbihiVmFsdWUpKTsKLX0KLXZvaWQgQ1BERl9EaWN0aW9uYXJ5OjpTZXRBdFJlY3QoRlhfQlNUUiBrZXksIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpCi17Ci0gICAgQ1BERl9BcnJheSogcEFycmF5ID0gbmV3IENQREZfQXJyYXk7Ci0gICAgcEFycmF5LT5BZGROdW1iZXIocmVjdC5sZWZ0KTsKLSAgICBwQXJyYXktPkFkZE51bWJlcihyZWN0LmJvdHRvbSk7Ci0gICAgcEFycmF5LT5BZGROdW1iZXIocmVjdC5yaWdodCk7Ci0gICAgcEFycmF5LT5BZGROdW1iZXIocmVjdC50b3ApOwotICAgIFNldEF0KGtleSwgcEFycmF5KTsKLX0KLXZvaWQgQ1BERl9EaWN0aW9uYXJ5OjpTZXRBdE1hdHJpeChGWF9CU1RSIGtleSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KQotewotICAgIENQREZfQXJyYXkqIHBBcnJheSA9IG5ldyBDUERGX0FycmF5OwotICAgIHBBcnJheS0+QWRkTnVtYmVyMTYobWF0cml4LmEpOwotICAgIHBBcnJheS0+QWRkTnVtYmVyMTYobWF0cml4LmIpOwotICAgIHBBcnJheS0+QWRkTnVtYmVyMTYobWF0cml4LmMpOwotICAgIHBBcnJheS0+QWRkTnVtYmVyMTYobWF0cml4LmQpOwotICAgIHBBcnJheS0+QWRkTnVtYmVyKG1hdHJpeC5lKTsKLSAgICBwQXJyYXktPkFkZE51bWJlcihtYXRyaXguZik7Ci0gICAgU2V0QXQoa2V5LCBwQXJyYXkpOwotfQotQ1BERl9TdHJlYW06OkNQREZfU3RyZWFtKEZYX0xQQllURSBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkKLSAgICA6IENQREZfT2JqZWN0KFBERk9CSl9TVFJFQU0pIHsKLSAgICBtX3BEaWN0ID0gcERpY3Q7Ci0gICAgbV9kd1NpemUgPSBzaXplOwotICAgIG1fR2VuTnVtID0gKEZYX0RXT1JEKSAtIDE7Ci0gICAgbV9wRGF0YUJ1ZiA9IHBEYXRhOwotICAgIG1fcENyeXB0b0hhbmRsZXIgPSBOVUxMOwotfQotQ1BERl9TdHJlYW06On5DUERGX1N0cmVhbSgpCi17Ci0gICAgaWYgKG1fR2VuTnVtID09IChGWF9EV09SRCkgLSAxICYmIG1fcERhdGFCdWYgIT0gTlVMTCkgewotICAgICAgICBGWF9GcmVlKG1fcERhdGFCdWYpOwotICAgIH0KLSAgICBpZiAobV9wRGljdCkgewotICAgICAgICBtX3BEaWN0LT5SZWxlYXNlKCk7Ci0gICAgfQotfQotdm9pZCBDUERGX1N0cmVhbTo6SW5pdFN0cmVhbShDUERGX0RpY3Rpb25hcnkqIHBEaWN0KQotewotICAgIGlmIChwRGljdCkgewotICAgICAgICBpZiAobV9wRGljdCkgewotICAgICAgICAgICAgbV9wRGljdC0+UmVsZWFzZSgpOwotICAgICAgICB9Ci0gICAgICAgIG1fcERpY3QgPSBwRGljdDsKLSAgICB9Ci0gICAgaWYgKG1fR2VuTnVtID09IChGWF9EV09SRCkgLSAxKSB7Ci0gICAgICAgIGlmIChtX3BEYXRhQnVmKSB7Ci0gICAgICAgICAgICBGWF9GcmVlKG1fcERhdGFCdWYpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1fR2VuTnVtID0gMDsKLSAgICBtX3BGaWxlID0gTlVMTDsKLSAgICBtX3BDcnlwdG9IYW5kbGVyID0gTlVMTDsKLSAgICBtX0ZpbGVPZmZzZXQgPSAwOwotfQotdm9pZCBDUERGX1N0cmVhbTo6SW5pdFN0cmVhbShGWF9MUEJZVEUgcERhdGEsIEZYX0RXT1JEIHNpemUsIENQREZfRGljdGlvbmFyeSogcERpY3QpCi17Ci0gICAgSW5pdFN0cmVhbShwRGljdCk7Ci0gICAgbV9HZW5OdW0gPSAoRlhfRFdPUkQpIC0gMTsKLSAgICBtX3BEYXRhQnVmID0gRlhfQWxsb2MoRlhfQllURSwgc2l6ZSk7Ci0gICAgaWYgKHBEYXRhKSB7Ci0gICAgICAgIEZYU1lTX21lbWNweTMyKG1fcERhdGFCdWYsIHBEYXRhLCBzaXplKTsKLSAgICB9Ci0gICAgbV9kd1NpemUgPSBzaXplOwotICAgIGlmIChtX3BEaWN0KSB7Ci0gICAgICAgIG1fcERpY3QtPlNldEF0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoIiksIHNpemUpOwotICAgIH0KLX0KLXZvaWQgQ1BERl9TdHJlYW06OlNldERhdGEoRlhfTFBDQllURSBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgRlhfQk9PTCBiQ29tcHJlc3NlZCwgRlhfQk9PTCBiS2VlcEJ1ZikKLXsKLSAgICBpZiAobV9HZW5OdW0gPT0gKEZYX0RXT1JEKSAtIDEpIHsKLSAgICAgICAgaWYgKG1fcERhdGFCdWYpIHsKLSAgICAgICAgICAgIEZYX0ZyZWUobV9wRGF0YUJ1Zik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtX0dlbk51bSA9IChGWF9EV09SRCkgLSAxOwotICAgICAgICBtX3BDcnlwdG9IYW5kbGVyID0gTlVMTDsKLSAgICB9Ci0gICAgaWYgKGJLZWVwQnVmKSB7Ci0gICAgICAgIG1fcERhdGFCdWYgPSAoRlhfTFBCWVRFKXBEYXRhOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcERhdGFCdWYgPSBGWF9BbGxvYyhGWF9CWVRFLCBzaXplKTsKLSAgICAgICAgaWYgKHBEYXRhKSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkzMihtX3BEYXRhQnVmLCBwRGF0YSwgc2l6ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9kd1NpemUgPSBzaXplOwotICAgIGlmIChtX3BEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgbV9wRGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7Ci0gICAgfQotICAgIG1fcERpY3QtPlNldEF0SW50ZWdlcihGWF9CU1RSQygiTGVuZ3RoIiksIHNpemUpOwotICAgIGlmICghYkNvbXByZXNzZWQpIHsKLSAgICAgICAgbV9wRGljdC0+UmVtb3ZlQXQoRlhfQlNUUkMoIkZpbHRlciIpKTsKLSAgICAgICAgbV9wRGljdC0+UmVtb3ZlQXQoRlhfQlNUUkMoIkRlY29kZVBhcm1zIikpOwotICAgIH0KLX0KLUZYX0JPT0wgQ1BERl9TdHJlYW06OlJlYWRSYXdEYXRhKEZYX0ZJTEVTSVpFIG9mZnNldCwgRlhfTFBCWVRFIGJ1ZiwgRlhfRFdPUkQgc2l6ZSkgY29uc3QKLXsKLSAgICBpZiAoKG1fR2VuTnVtICE9IChGWF9EV09SRCkgLSAxKSAmJiBtX3BGaWxlKSB7Ci0gICAgICAgIHJldHVybiBtX3BGaWxlLT5SZWFkQmxvY2soYnVmLCBtX0ZpbGVPZmZzZXQgKyBvZmZzZXQsIHNpemUpOwotICAgIH0KLSAgICBpZiAobV9wRGF0YUJ1ZikgewotICAgICAgICBGWFNZU19tZW1jcHkzMihidWYsIG1fcERhdGFCdWYgKyBvZmZzZXQsIHNpemUpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLXZvaWQgQ1BERl9TdHJlYW06OkluaXRTdHJlYW0oSUZYX0ZpbGVSZWFkICpwRmlsZSwgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkKLXsKLSAgICBJbml0U3RyZWFtKHBEaWN0KTsKLSAgICBtX3BGaWxlID0gcEZpbGU7Ci0gICAgbV9kd1NpemUgPSAoRlhfRFdPUkQpcEZpbGUtPkdldFNpemUoKTsKLSAgICBpZiAobV9wRGljdCkgewotICAgICAgICBtX3BEaWN0LT5TZXRBdEludGVnZXIoRlhfQlNUUkMoIkxlbmd0aCIpLCBtX2R3U2l6ZSk7Ci0gICAgfQotfQotRlhfQk9PTCBDUERGX1N0cmVhbTo6SWRlbnRpY2FsKENQREZfU3RyZWFtKiBwT3RoZXIpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3BEaWN0KQotICAgICAgICByZXR1cm4gcE90aGVyLT5tX3BEaWN0ID8gRkFMU0UgOiBUUlVFOwogCi0gICAgaWYgKCFtX3BEaWN0LT5JZGVudGljYWwocE90aGVyLT5tX3BEaWN0KSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Cit2b2lkIENQREZfRGljdGlvbmFyeTo6U2V0QXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIENQREZfT2JqZWN0KiBwT2JqKSB7CisgIEFTU0VSVChJc0RpY3Rpb25hcnkoKSk7CisgIC8vIEF2b2lkIDIgY29uc3RydWN0aW9ucyBvZiBDRlhfQnl0ZVN0cmluZy4KKyAgQ0ZYX0J5dGVTdHJpbmcga2V5X2J5dGVzdHJpbmcgPSBrZXk7CisgIGF1dG8gaXQgPSBtX01hcC5maW5kKGtleV9ieXRlc3RyaW5nKTsKKyAgaWYgKGl0ID09IG1fTWFwLmVuZCgpKSB7CisgICAgaWYgKHBPYmopIHsKKyAgICAgIG1fTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihrZXlfYnl0ZXN0cmluZywgcE9iaikpOwogICAgIH0KLSAgICBpZiAobV9kd1NpemUgIT0gcE90aGVyLT5tX2R3U2l6ZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX0dlbk51bSAhPSAoRlhfRFdPUkQpIC0gMSAmJiBwT3RoZXItPm1fR2VuTnVtICE9IChGWF9EV09SRCkgLSAxKSB7Ci0gICAgICAgIGlmIChtX3BGaWxlID09IHBPdGhlci0+bV9wRmlsZSAmJiBtX3BGaWxlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbV9wRmlsZSB8fCAhcE90aGVyLT5tX3BGaWxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfQllURSBzcmNCdWZbMTAyNF07Ci0gICAgICAgIEZYX0JZVEUgZGVzdEJ1ZlsxMDI0XTsKLSAgICAgICAgRlhfRFdPUkQgc2l6ZSA9IG1fZHdTaXplOwotICAgICAgICBGWF9EV09SRCBzcmNPZmZzZXQgPSBtX0ZpbGVPZmZzZXQ7Ci0gICAgICAgIEZYX0RXT1JEIGRlc3RPZmZzZXQgPSBwT3RoZXItPm1fRmlsZU9mZnNldDsKLSAgICAgICAgaWYgKG1fcEZpbGUgPT0gcE90aGVyLT5tX3BGaWxlICYmIHNyY09mZnNldCA9PSBkZXN0T2Zmc2V0KSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgIEZYX0RXT1JEIGFjdHVhbFNpemUgPSBzaXplID4gMTAyNCA/IDEwMjQgOiBzaXplOwotICAgICAgICAgICAgbV9wRmlsZS0+UmVhZEJsb2NrKHNyY0J1Ziwgc3JjT2Zmc2V0LCBhY3R1YWxTaXplKTsKLSAgICAgICAgICAgIHBPdGhlci0+bV9wRmlsZS0+UmVhZEJsb2NrKGRlc3RCdWYsIGRlc3RPZmZzZXQsIGFjdHVhbFNpemUpOwotICAgICAgICAgICAgaWYgKEZYU1lTX21lbWNtcDMyKHNyY0J1ZiwgZGVzdEJ1ZiwgYWN0dWFsU2l6ZSkgIT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNpemUgLT0gYWN0dWFsU2l6ZTsKLSAgICAgICAgICAgIHNyY09mZnNldCArPSBhY3R1YWxTaXplOwotICAgICAgICAgICAgZGVzdE9mZnNldCArPSBhY3R1YWxTaXplOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAobV9HZW5OdW0gIT0gKEZYX0RXT1JEKSAtIDEgfHwgcE90aGVyLT5tX0dlbk51bSAhPSAoRlhfRFdPUkQpIC0gMSkgewotICAgICAgICBJRlhfRmlsZVJlYWQqIHBGaWxlID0gTlVMTDsKLSAgICAgICAgRlhfTFBCWVRFIHBCdWYgPSBOVUxMOwotICAgICAgICBGWF9EV09SRCBvZmZzZXQgPSAwOwotICAgICAgICBpZiAocE90aGVyLT5tX0dlbk51bSAhPSAoRlhfRFdPUkQpIC0gMSkgewotICAgICAgICAgICAgcEZpbGUgPSBwT3RoZXItPm1fcEZpbGU7Ci0gICAgICAgICAgICBwQnVmID0gbV9wRGF0YUJ1ZjsKLSAgICAgICAgICAgIG9mZnNldCA9IHBPdGhlci0+bV9GaWxlT2Zmc2V0OwotICAgICAgICB9IGVsc2UgaWYgKG1fR2VuTnVtICE9IChGWF9EV09SRCkgLSAxKSB7Ci0gICAgICAgICAgICBwRmlsZSA9IG1fcEZpbGU7Ci0gICAgICAgICAgICBwQnVmID0gcE90aGVyLT5tX3BEYXRhQnVmOwotICAgICAgICAgICAgb2Zmc2V0ID0gbV9GaWxlT2Zmc2V0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChOVUxMID09IHBCdWYpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBGWF9CWVRFIHNyY0J1ZlsxMDI0XTsKLSAgICAgICAgRlhfRFdPUkQgc2l6ZSA9IG1fZHdTaXplOwotICAgICAgICB3aGlsZSAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgIEZYX0RXT1JEIGFjdHVhbFNpemUgPSBzdGQ6Om1pbihzaXplLCAxMDI0VSk7Ci0gICAgICAgICAgICBwRmlsZS0+UmVhZEJsb2NrKHNyY0J1Ziwgb2Zmc2V0LCBhY3R1YWxTaXplKTsKLSAgICAgICAgICAgIGlmIChGWFNZU19tZW1jbXAzMihzcmNCdWYsIHBCdWYsIGFjdHVhbFNpemUpICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQnVmICs9IGFjdHVhbFNpemU7Ci0gICAgICAgICAgICBzaXplIC09IGFjdHVhbFNpemU7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gYWN0dWFsU2l6ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZYU1lTX21lbWNtcDMyKG1fcERhdGFCdWYsIHBPdGhlci0+bV9wRGF0YUJ1ZiwgbV9kd1NpemUpID09IDA7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGl0LT5zZWNvbmQgPT0gcE9iaikKKyAgICByZXR1cm47CisgIGl0LT5zZWNvbmQtPlJlbGVhc2UoKTsKKworICBpZiAocE9iaikKKyAgICBpdC0+c2Vjb25kID0gcE9iajsKKyAgZWxzZQorICAgIG1fTWFwLmVyYXNlKGl0KTsKIH0KLUNQREZfU3RyZWFtKiBDUERGX1N0cmVhbTo6Q2xvbmUoRlhfQk9PTCBiRGlyZWN0LCBGUERGX0xQRkNsb25lU3RyZWFtQ2FsbGJhY2sgbHBmQ2FsbGJhY2ssIEZYX0xQVk9JRCBwVXNlckRhdGEpIGNvbnN0Ci17Ci0gICAgQ1BERl9EaWN0aW9uYXJ5ICpwQ2xvbmVEaWN0ID0gKENQREZfRGljdGlvbmFyeSopbV9wRGljdC0+Q2xvbmUoYkRpcmVjdCk7Ci0gICAgSUZYX0ZpbGVTdHJlYW0gKnBGUyA9IE5VTEw7Ci0gICAgaWYgKGxwZkNhbGxiYWNrKSB7Ci0gICAgICAgIHBGUyA9IGxwZkNhbGxiYWNrKChDUERGX1N0cmVhbSopdGhpcywgcFVzZXJEYXRhKTsKLSAgICB9Ci0gICAgaWYgKCFwRlMpIHsKLSAgICAgICAgQ1BERl9TdHJlYW1BY2MgYWNjOwotICAgICAgICBhY2MuTG9hZEFsbERhdGEodGhpcywgVFJVRSk7Ci0gICAgICAgIEZYX0RXT1JEIHN0cmVhbVNpemUgPSBhY2MuR2V0U2l6ZSgpOwotICAgICAgICByZXR1cm4gbmV3IENQREZfU3RyZWFtKGFjYy5EZXRhY2hEYXRhKCksIHN0cmVhbVNpemUsIHBDbG9uZURpY3QpOwotICAgIH0KLSAgICBDUERGX1N0cmVhbSogcE9iaiA9IG5ldyBDUERGX1N0cmVhbShOVUxMLCAwLCBOVUxMKTsKLSAgICBDUERGX1N0cmVhbUZpbHRlciAqcFNGID0gR2V0U3RyZWFtRmlsdGVyKFRSVUUpOwotICAgIGlmIChwU0YpIHsKLSAgICAgICAgRlhfTFBCWVRFIHBCdWYgPSBGWF9BbGxvYyhGWF9CWVRFLCA0MDk2KTsKLSAgICAgICAgRlhfRFdPUkQgZHdSZWFkOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBkd1JlYWQgPSBwU0YtPlJlYWRCbG9jayhwQnVmLCA0MDk2KTsKLSAgICAgICAgICAgIGlmIChkd1JlYWQpIHsKLSAgICAgICAgICAgICAgICBwRlMtPldyaXRlQmxvY2socEJ1ZiwgZHdSZWFkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoZHdSZWFkID09IDQwOTYpOwotICAgICAgICBwRlMtPkZsdXNoKCk7Ci0gICAgICAgIEZYX0ZyZWUocEJ1Zik7Ci0gICAgICAgIGRlbGV0ZSBwU0Y7Ci0gICAgfQotICAgIHBPYmotPkluaXRTdHJlYW0oKElGWF9GaWxlUmVhZCopcEZTLCBwQ2xvbmVEaWN0KTsKLSAgICByZXR1cm4gcE9iajsKK3ZvaWQgQ1BERl9EaWN0aW9uYXJ5OjpSZW1vdmVBdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgeworICBBU1NFUlQobV9UeXBlID09IFBERk9CSl9ESUNUSU9OQVJZKTsKKyAgYXV0byBpdCA9IG1fTWFwLmZpbmQoa2V5KTsKKyAgaWYgKGl0ID09IG1fTWFwLmVuZCgpKQorICAgIHJldHVybjsKKworICBpdC0+c2Vjb25kLT5SZWxlYXNlKCk7CisgIG1fTWFwLmVyYXNlKGl0KTsKIH0KLWV4dGVybiBGWF9CT09MIFBERl9EYXRhRGVjb2RlKEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGNvbnN0IENQREZfRGljdGlvbmFyeSogcERpY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUEJZVEUmIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplLCBDRlhfQnl0ZVN0cmluZyYgSW1hZ2VFbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSomIHBJbWFnZVBhcm1zLCBGWF9EV09SRCBlc3RpbWF0ZWRfc2l6ZSwgRlhfQk9PTCBiSW1hZ2VBY2MpOwotQ1BERl9TdHJlYW1BY2M6OkNQREZfU3RyZWFtQWNjKCkKLXsKLSAgICBtX2JOZXdCdWYgPSBGQUxTRTsKK3ZvaWQgQ1BERl9EaWN0aW9uYXJ5OjpSZXBsYWNlS2V5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb2xka2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuZXdrZXkpIHsKKyAgQVNTRVJUKG1fVHlwZSA9PSBQREZPQkpfRElDVElPTkFSWSk7CisgIGF1dG8gb2xkX2l0ID0gbV9NYXAuZmluZChvbGRrZXkpOworICBpZiAob2xkX2l0ID09IG1fTWFwLmVuZCgpKQorICAgIHJldHVybjsKKworICAvLyBBdm9pZCAyIGNvbnN0cnVjdGlvbnMgb2YgQ0ZYX0J5dGVTdHJpbmcuCisgIENGWF9CeXRlU3RyaW5nIG5ld2tleV9ieXRlc3RyaW5nID0gbmV3a2V5OworICBhdXRvIG5ld19pdCA9IG1fTWFwLmZpbmQobmV3a2V5X2J5dGVzdHJpbmcpOworICBpZiAobmV3X2l0ID09IG9sZF9pdCkKKyAgICByZXR1cm47CisKKyAgaWYgKG5ld19pdCAhPSBtX01hcC5lbmQoKSkgeworICAgIG5ld19pdC0+c2Vjb25kLT5SZWxlYXNlKCk7CisgICAgbmV3X2l0LT5zZWNvbmQgPSBvbGRfaXQtPnNlY29uZDsKKyAgfSBlbHNlIHsKKyAgICBtX01hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIobmV3a2V5X2J5dGVzdHJpbmcsIG9sZF9pdC0+c2Vjb25kKSk7CisgIH0KKyAgbV9NYXAuZXJhc2Uob2xkX2l0KTsKK30KK0ZYX0JPT0wgQ1BERl9EaWN0aW9uYXJ5OjpJZGVudGljYWwoQ1BERl9EaWN0aW9uYXJ5KiBwT3RoZXIpIGNvbnN0IHsKKyAgaWYgKCFwT3RoZXIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fTWFwLnNpemUoKSAhPSBwT3RoZXItPm1fTWFwLnNpemUoKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogbV9NYXApIHsKKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYga2V5ID0gaXQuZmlyc3Q7CisgICAgaWYgKCFpdC5zZWNvbmQtPklzSWRlbnRpY2FsKHBPdGhlci0+R2V0RWxlbWVudChrZXkpKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK3ZvaWQgQ1BERl9EaWN0aW9uYXJ5OjpTZXRBdEludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIGludCBpKSB7CisgIFNldEF0KGtleSwgbmV3IENQREZfTnVtYmVyKGkpKTsKK30KK3ZvaWQgQ1BERl9EaWN0aW9uYXJ5OjpTZXRBdE5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKSB7CisgIFNldEF0KGtleSwgbmV3IENQREZfTmFtZShuYW1lKSk7Cit9Cit2b2lkIENQREZfRGljdGlvbmFyeTo6U2V0QXRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cikgeworICBTZXRBdChrZXksIG5ldyBDUERGX1N0cmluZyhzdHIsIEZBTFNFKSk7Cit9Cit2b2lkIENQREZfRGljdGlvbmFyeTo6U2V0QXRSZWZlcmVuY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlciogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvYmpudW0pIHsKKyAgU2V0QXQoa2V5LCBuZXcgQ1BERl9SZWZlcmVuY2UocERvYywgb2JqbnVtKSk7Cit9Cit2b2lkIENQREZfRGljdGlvbmFyeTo6QWRkUmVmZXJlbmNlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvYmpudW0pIHsKKyAgU2V0QXQoa2V5LCBuZXcgQ1BERl9SZWZlcmVuY2UocERvYywgb2JqbnVtKSk7Cit9Cit2b2lkIENQREZfRGljdGlvbmFyeTo6U2V0QXROdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIEZYX0ZMT0FUIGYpIHsKKyAgQ1BERl9OdW1iZXIqIHBOdW1iZXIgPSBuZXcgQ1BERl9OdW1iZXI7CisgIHBOdW1iZXItPlNldE51bWJlcihmKTsKKyAgU2V0QXQoa2V5LCBwTnVtYmVyKTsKK30KK3ZvaWQgQ1BERl9EaWN0aW9uYXJ5OjpTZXRBdEJvb2xlYW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksIEZYX0JPT0wgYlZhbHVlKSB7CisgIFNldEF0KGtleSwgbmV3IENQREZfQm9vbGVhbihiVmFsdWUpKTsKK30KK3ZvaWQgQ1BERl9EaWN0aW9uYXJ5OjpTZXRBdFJlY3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIHsKKyAgQ1BERl9BcnJheSogcEFycmF5ID0gbmV3IENQREZfQXJyYXk7CisgIHBBcnJheS0+QWRkTnVtYmVyKHJlY3QubGVmdCk7CisgIHBBcnJheS0+QWRkTnVtYmVyKHJlY3QuYm90dG9tKTsKKyAgcEFycmF5LT5BZGROdW1iZXIocmVjdC5yaWdodCk7CisgIHBBcnJheS0+QWRkTnVtYmVyKHJlY3QudG9wKTsKKyAgU2V0QXQoa2V5LCBwQXJyYXkpOworfQordm9pZCBDUERGX0RpY3Rpb25hcnk6OlNldEF0TWF0cml4KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgeworICBDUERGX0FycmF5KiBwQXJyYXkgPSBuZXcgQ1BERl9BcnJheTsKKyAgcEFycmF5LT5BZGROdW1iZXIxNihtYXRyaXguYSk7CisgIHBBcnJheS0+QWRkTnVtYmVyMTYobWF0cml4LmIpOworICBwQXJyYXktPkFkZE51bWJlcjE2KG1hdHJpeC5jKTsKKyAgcEFycmF5LT5BZGROdW1iZXIxNihtYXRyaXguZCk7CisgIHBBcnJheS0+QWRkTnVtYmVyKG1hdHJpeC5lKTsKKyAgcEFycmF5LT5BZGROdW1iZXIobWF0cml4LmYpOworICBTZXRBdChrZXksIHBBcnJheSk7Cit9CitDUERGX1N0cmVhbTo6Q1BERl9TdHJlYW0odWludDhfdCogcERhdGEsIEZYX0RXT1JEIHNpemUsIENQREZfRGljdGlvbmFyeSogcERpY3QpCisgICAgOiBDUERGX09iamVjdChQREZPQkpfU1RSRUFNKSwKKyAgICAgIG1fcERpY3QocERpY3QpLAorICAgICAgbV9kd1NpemUoc2l6ZSksCisgICAgICBtX0dlbk51bShrTWVtb3J5QmFzZWRHZW5OdW0pLAorICAgICAgbV9wRGF0YUJ1ZihwRGF0YSkge30KKworQ1BERl9TdHJlYW06On5DUERGX1N0cmVhbSgpIHsKKyAgaWYgKElzTWVtb3J5QmFzZWQoKSkKKyAgICBGWF9GcmVlKG1fcERhdGFCdWYpOworCisgIGlmIChtX3BEaWN0KQorICAgIG1fcERpY3QtPlJlbGVhc2UoKTsKK30KKwordm9pZCBDUERGX1N0cmVhbTo6SW5pdFN0cmVhbUludGVybmFsKENQREZfRGljdGlvbmFyeSogcERpY3QpIHsKKyAgaWYgKHBEaWN0KSB7CisgICAgaWYgKG1fcERpY3QpCisgICAgICBtX3BEaWN0LT5SZWxlYXNlKCk7CisgICAgbV9wRGljdCA9IHBEaWN0OworICB9CisgIGlmIChJc01lbW9yeUJhc2VkKCkpCisgICAgRlhfRnJlZShtX3BEYXRhQnVmKTsKKworICBtX0dlbk51bSA9IDA7CisgIG1fcEZpbGUgPSBudWxscHRyOworfQorCit2b2lkIENQREZfU3RyZWFtOjpJbml0U3RyZWFtKHVpbnQ4X3QqIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KSB7CisgIEluaXRTdHJlYW1JbnRlcm5hbChwRGljdCk7CisgIG1fR2VuTnVtID0ga01lbW9yeUJhc2VkR2VuTnVtOworICBtX3BEYXRhQnVmID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7CisgIGlmIChwRGF0YSkgeworICAgIEZYU1lTX21lbWNweShtX3BEYXRhQnVmLCBwRGF0YSwgc2l6ZSk7CisgIH0KKyAgbV9kd1NpemUgPSBzaXplOworICBpZiAobV9wRGljdCkgeworICAgIG1fcERpY3QtPlNldEF0SW50ZWdlcigiTGVuZ3RoIiwgc2l6ZSk7CisgIH0KK30KK3ZvaWQgQ1BERl9TdHJlYW06OlNldERhdGEoY29uc3QgdWludDhfdCogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNvbXByZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYktlZXBCdWYpIHsKKyAgaWYgKElzTWVtb3J5QmFzZWQoKSkKKyAgICBGWF9GcmVlKG1fcERhdGFCdWYpOworICBtX0dlbk51bSA9IGtNZW1vcnlCYXNlZEdlbk51bTsKKworICBpZiAoYktlZXBCdWYpIHsKKyAgICBtX3BEYXRhQnVmID0gKHVpbnQ4X3QqKXBEYXRhOworICB9IGVsc2UgeworICAgIG1fcERhdGFCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsKKyAgICBpZiAocERhdGEpIHsKKyAgICAgIEZYU1lTX21lbWNweShtX3BEYXRhQnVmLCBwRGF0YSwgc2l6ZSk7CisgICAgfQorICB9CisgIG1fZHdTaXplID0gc2l6ZTsKKyAgaWYgKCFtX3BEaWN0KQorICAgIG1fcERpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICBtX3BEaWN0LT5TZXRBdEludGVnZXIoIkxlbmd0aCIsIHNpemUpOworICBpZiAoIWJDb21wcmVzc2VkKSB7CisgICAgbV9wRGljdC0+UmVtb3ZlQXQoIkZpbHRlciIpOworICAgIG1fcERpY3QtPlJlbW92ZUF0KCJEZWNvZGVQYXJtcyIpOworICB9Cit9CitGWF9CT09MIENQREZfU3RyZWFtOjpSZWFkUmF3RGF0YShGWF9GSUxFU0laRSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplKSBjb25zdCB7CisgIGlmICghSXNNZW1vcnlCYXNlZCgpICYmIG1fcEZpbGUpCisgICAgcmV0dXJuIG1fcEZpbGUtPlJlYWRCbG9jayhidWYsIG9mZnNldCwgc2l6ZSk7CisKKyAgaWYgKG1fcERhdGFCdWYpCisgICAgRlhTWVNfbWVtY3B5KGJ1ZiwgbV9wRGF0YUJ1ZiArIG9mZnNldCwgc2l6ZSk7CisgIHJldHVybiBUUlVFOworfQordm9pZCBDUERGX1N0cmVhbTo6SW5pdFN0cmVhbUZyb21GaWxlKElGWF9GaWxlUmVhZCogcEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgeworICBJbml0U3RyZWFtSW50ZXJuYWwocERpY3QpOworICBtX3BGaWxlID0gcEZpbGU7CisgIG1fZHdTaXplID0gKEZYX0RXT1JEKXBGaWxlLT5HZXRTaXplKCk7CisgIGlmIChtX3BEaWN0KSB7CisgICAgbV9wRGljdC0+U2V0QXRJbnRlZ2VyKCJMZW5ndGgiLCBtX2R3U2l6ZSk7CisgIH0KK30KKworRlhfQk9PTCBDUERGX1N0cmVhbTo6SWRlbnRpY2FsKENQREZfU3RyZWFtKiBwT3RoZXIpIGNvbnN0IHsKKyAgaWYgKCFtX3BEaWN0KQorICAgIHJldHVybiAhcE90aGVyLT5tX3BEaWN0OworCisgIGlmICghbV9wRGljdC0+SWRlbnRpY2FsKHBPdGhlci0+bV9wRGljdCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChtX2R3U2l6ZSAhPSBwT3RoZXItPm1fZHdTaXplKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIUlzTWVtb3J5QmFzZWQoKSAmJiAhcE90aGVyLT5Jc01lbW9yeUJhc2VkKCkpIHsKKyAgICBpZiAobV9wRmlsZSA9PSBwT3RoZXItPm1fcEZpbGUgJiYgIW1fcEZpbGUpCisgICAgICByZXR1cm4gVFJVRTsKKworICAgIGlmICghbV9wRmlsZSB8fCAhcE90aGVyLT5tX3BGaWxlKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgdWludDhfdCBzcmNCdWZba0Jsb2NrU2l6ZV07CisgICAgdWludDhfdCBkZXN0QnVmW2tCbG9ja1NpemVdOworICAgIEZYX0RXT1JEIHNpemUgPSBtX2R3U2l6ZTsKKyAgICBpZiAobV9wRmlsZSA9PSBwT3RoZXItPm1fcEZpbGUpCisgICAgICByZXR1cm4gVFJVRTsKKworICAgIEZYX0RXT1JEIG9mZnNldCA9IDA7CisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICBGWF9EV09SRCBhY3R1YWxTaXplID0gc3RkOjptaW4oc2l6ZSwga0Jsb2NrU2l6ZSk7CisgICAgICBtX3BGaWxlLT5SZWFkQmxvY2soc3JjQnVmLCBvZmZzZXQsIGFjdHVhbFNpemUpOworICAgICAgcE90aGVyLT5tX3BGaWxlLT5SZWFkQmxvY2soZGVzdEJ1Ziwgb2Zmc2V0LCBhY3R1YWxTaXplKTsKKyAgICAgIGlmIChGWFNZU19tZW1jbXAoc3JjQnVmLCBkZXN0QnVmLCBhY3R1YWxTaXplKSAhPSAwKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIHNpemUgLT0gYWN0dWFsU2l6ZTsKKyAgICAgIG9mZnNldCArPSBhY3R1YWxTaXplOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIGlmICghSXNNZW1vcnlCYXNlZCgpIHx8ICFwT3RoZXItPklzTWVtb3J5QmFzZWQoKSkgeworICAgIElGWF9GaWxlUmVhZCogcEZpbGUgPSBudWxscHRyOworICAgIHVpbnQ4X3QqIHBCdWYgPSBudWxscHRyOworICAgIGlmICghcE90aGVyLT5Jc01lbW9yeUJhc2VkKCkpIHsKKyAgICAgIHBGaWxlID0gcE90aGVyLT5tX3BGaWxlOworICAgICAgcEJ1ZiA9IG1fcERhdGFCdWY7CisgICAgfSBlbHNlIGlmICghSXNNZW1vcnlCYXNlZCgpKSB7CisgICAgICBwRmlsZSA9IG1fcEZpbGU7CisgICAgICBwQnVmID0gcE90aGVyLT5tX3BEYXRhQnVmOworICAgIH0KKyAgICBpZiAoIXBCdWYpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICB1aW50OF90IHNyY0J1ZltrQmxvY2tTaXplXTsKKyAgICBGWF9EV09SRCBzaXplID0gbV9kd1NpemU7CisgICAgRlhfRFdPUkQgb2Zmc2V0ID0gMDsKKyAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICAgIEZYX0RXT1JEIGFjdHVhbFNpemUgPSBzdGQ6Om1pbihzaXplLCBrQmxvY2tTaXplKTsKKyAgICAgIHBGaWxlLT5SZWFkQmxvY2soc3JjQnVmLCBvZmZzZXQsIGFjdHVhbFNpemUpOworICAgICAgaWYgKEZYU1lTX21lbWNtcChzcmNCdWYsIHBCdWYsIGFjdHVhbFNpemUpICE9IDApCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgcEJ1ZiArPSBhY3R1YWxTaXplOworICAgICAgc2l6ZSAtPSBhY3R1YWxTaXplOworICAgICAgb2Zmc2V0ICs9IGFjdHVhbFNpemU7CisgICAgfQorICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGWFNZU19tZW1jbXAobV9wRGF0YUJ1ZiwgcE90aGVyLT5tX3BEYXRhQnVmLCBtX2R3U2l6ZSkgPT0gMDsKK30KKworQ1BERl9TdHJlYW1BY2M6OkNQREZfU3RyZWFtQWNjKCkgeworICBtX2JOZXdCdWYgPSBGQUxTRTsKKyAgbV9wRGF0YSA9IE5VTEw7CisgIG1fZHdTaXplID0gMDsKKyAgbV9wSW1hZ2VQYXJhbSA9IE5VTEw7CisgIG1fcFN0cmVhbSA9IE5VTEw7CisgIG1fcFNyY0RhdGEgPSBOVUxMOworfQordm9pZCBDUERGX1N0cmVhbUFjYzo6TG9hZEFsbERhdGEoY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSYXdBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBlc3RpbWF0ZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkltYWdlQWNjKSB7CisgIGlmICghcFN0cmVhbSkKKyAgICByZXR1cm47CisKKyAgbV9wU3RyZWFtID0gcFN0cmVhbTsKKyAgaWYgKHBTdHJlYW0tPklzTWVtb3J5QmFzZWQoKSAmJgorICAgICAgKCFwU3RyZWFtLT5HZXREaWN0KCktPktleUV4aXN0KCJGaWx0ZXIiKSB8fCBiUmF3QWNjZXNzKSkgeworICAgIG1fZHdTaXplID0gcFN0cmVhbS0+bV9kd1NpemU7CisgICAgbV9wRGF0YSA9ICh1aW50OF90KilwU3RyZWFtLT5tX3BEYXRhQnVmOworICAgIHJldHVybjsKKyAgfQorICB1aW50OF90KiBwU3JjRGF0YTsKKyAgRlhfRFdPUkQgZHdTcmNTaXplID0gcFN0cmVhbS0+bV9kd1NpemU7CisgIGlmIChkd1NyY1NpemUgPT0gMCkKKyAgICByZXR1cm47CisKKyAgaWYgKCFwU3RyZWFtLT5Jc01lbW9yeUJhc2VkKCkpIHsKKyAgICBwU3JjRGF0YSA9IG1fcFNyY0RhdGEgPSBGWF9BbGxvYyh1aW50OF90LCBkd1NyY1NpemUpOworICAgIGlmICghcFN0cmVhbS0+UmVhZFJhd0RhdGEoMCwgcFNyY0RhdGEsIGR3U3JjU2l6ZSkpCisgICAgICByZXR1cm47CisgIH0gZWxzZSB7CisgICAgcFNyY0RhdGEgPSBwU3RyZWFtLT5tX3BEYXRhQnVmOworICB9CisgIHVpbnQ4X3QqIHBEZWNyeXB0ZWREYXRhID0gcFNyY0RhdGE7CisgIEZYX0RXT1JEIGR3RGVjcnlwdGVkU2l6ZSA9IGR3U3JjU2l6ZTsKKyAgaWYgKCFwU3RyZWFtLT5HZXREaWN0KCktPktleUV4aXN0KCJGaWx0ZXIiKSB8fCBiUmF3QWNjZXNzKSB7CisgICAgbV9wRGF0YSA9IHBEZWNyeXB0ZWREYXRhOworICAgIG1fZHdTaXplID0gZHdEZWNyeXB0ZWRTaXplOworICB9IGVsc2UgeworICAgIEZYX0JPT0wgYlJldCA9IFBERl9EYXRhRGVjb2RlKAorICAgICAgICBwRGVjcnlwdGVkRGF0YSwgZHdEZWNyeXB0ZWRTaXplLCBtX3BTdHJlYW0tPkdldERpY3QoKSwgbV9wRGF0YSwKKyAgICAgICAgbV9kd1NpemUsIG1fSW1hZ2VEZWNvZGVyLCBtX3BJbWFnZVBhcmFtLCBlc3RpbWF0ZWRfc2l6ZSwgYkltYWdlQWNjKTsKKyAgICBpZiAoIWJSZXQpIHsKKyAgICAgIG1fcERhdGEgPSBwRGVjcnlwdGVkRGF0YTsKKyAgICAgIG1fZHdTaXplID0gZHdEZWNyeXB0ZWRTaXplOworICAgIH0KKyAgfQorICBpZiAocFNyY0RhdGEgIT0gcFN0cmVhbS0+bV9wRGF0YUJ1ZiAmJiBwU3JjRGF0YSAhPSBtX3BEYXRhKSB7CisgICAgRlhfRnJlZShwU3JjRGF0YSk7CisgIH0KKyAgaWYgKHBEZWNyeXB0ZWREYXRhICE9IHBTcmNEYXRhICYmIHBEZWNyeXB0ZWREYXRhICE9IG1fcERhdGEpIHsKKyAgICBGWF9GcmVlKHBEZWNyeXB0ZWREYXRhKTsKKyAgfQorICBtX3BTcmNEYXRhID0gTlVMTDsKKyAgbV9iTmV3QnVmID0gbV9wRGF0YSAhPSBwU3RyZWFtLT5tX3BEYXRhQnVmOworfQorQ1BERl9TdHJlYW1BY2M6On5DUERGX1N0cmVhbUFjYygpIHsKKyAgaWYgKG1fYk5ld0J1ZikgeworICAgIEZYX0ZyZWUobV9wRGF0YSk7CisgIH0KKyAgRlhfRnJlZShtX3BTcmNEYXRhKTsKK30KK2NvbnN0IHVpbnQ4X3QqIENQREZfU3RyZWFtQWNjOjpHZXREYXRhKCkgY29uc3QgeworICBpZiAobV9iTmV3QnVmKSB7CisgICAgcmV0dXJuIG1fcERhdGE7CisgIH0KKyAgaWYgKCFtX3BTdHJlYW0pIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gbV9wU3RyZWFtLT5tX3BEYXRhQnVmOworfQorRlhfRFdPUkQgQ1BERl9TdHJlYW1BY2M6OkdldFNpemUoKSBjb25zdCB7CisgIGlmIChtX2JOZXdCdWYpIHsKKyAgICByZXR1cm4gbV9kd1NpemU7CisgIH0KKyAgaWYgKCFtX3BTdHJlYW0pIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gbV9wU3RyZWFtLT5tX2R3U2l6ZTsKK30KK3VpbnQ4X3QqIENQREZfU3RyZWFtQWNjOjpEZXRhY2hEYXRhKCkgeworICBpZiAobV9iTmV3QnVmKSB7CisgICAgdWludDhfdCogcCA9IG1fcERhdGE7CiAgICAgbV9wRGF0YSA9IE5VTEw7CiAgICAgbV9kd1NpemUgPSAwOwotICAgIG1fcEltYWdlUGFyYW0gPSBOVUxMOwotICAgIG1fcFN0cmVhbSA9IE5VTEw7Ci0gICAgbV9wU3JjRGF0YSA9IE5VTEw7Ci19Ci12b2lkIENQREZfU3RyZWFtQWNjOjpMb2FkQWxsRGF0YShjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiUmF3QWNjZXNzLCBGWF9EV09SRCBlc3RpbWF0ZWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkltYWdlQWNjKQotewotICAgIGlmIChwU3RyZWFtID09IE5VTEwgfHwgcFN0cmVhbS0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX3BTdHJlYW0gPSBwU3RyZWFtOwotICAgIGlmIChwU3RyZWFtLT5Jc01lbW9yeUJhc2VkKCkgJiYKLSAgICAgICAgICAgICghcFN0cmVhbS0+R2V0RGljdCgpLT5LZXlFeGlzdChGWF9CU1RSQygiRmlsdGVyIikpIHx8IGJSYXdBY2Nlc3MpKSB7Ci0gICAgICAgIG1fZHdTaXplID0gcFN0cmVhbS0+bV9kd1NpemU7Ci0gICAgICAgIG1fcERhdGEgPSAoRlhfTFBCWVRFKXBTdHJlYW0tPm1fcERhdGFCdWY7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfTFBCWVRFIHBTcmNEYXRhOwotICAgIEZYX0RXT1JEIGR3U3JjU2l6ZSA9IHBTdHJlYW0tPm1fZHdTaXplOwotICAgIGlmIChkd1NyY1NpemUgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICghcFN0cmVhbS0+SXNNZW1vcnlCYXNlZCgpKSB7Ci0gICAgICAgIHBTcmNEYXRhID0gbV9wU3JjRGF0YSA9IEZYX0FsbG9jKEZYX0JZVEUsIGR3U3JjU2l6ZSk7Ci0gICAgICAgIGlmICghcFN0cmVhbS0+UmVhZFJhd0RhdGEoMCwgcFNyY0RhdGEsIGR3U3JjU2l6ZSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBTcmNEYXRhID0gcFN0cmVhbS0+bV9wRGF0YUJ1ZjsKLSAgICB9Ci0gICAgRlhfTFBCWVRFIHBEZWNyeXB0ZWREYXRhOwotICAgIEZYX0RXT1JEIGR3RGVjcnlwdGVkU2l6ZTsKLSAgICBpZiAocFN0cmVhbS0+bV9wQ3J5cHRvSGFuZGxlcikgewotICAgICAgICBDRlhfQmluYXJ5QnVmIGRlc3RfYnVmOwotICAgICAgICBkZXN0X2J1Zi5Fc3RpbWF0ZVNpemUocFN0cmVhbS0+bV9wQ3J5cHRvSGFuZGxlci0+RGVjcnlwdEdldFNpemUoZHdTcmNTaXplKSk7Ci0gICAgICAgIEZYX0xQVk9JRCBjb250ZXh0ID0gcFN0cmVhbS0+bV9wQ3J5cHRvSGFuZGxlci0+RGVjcnlwdFN0YXJ0KHBTdHJlYW0tPkdldE9iak51bSgpLCBwU3RyZWFtLT5tX0dlbk51bSk7Ci0gICAgICAgIHBTdHJlYW0tPm1fcENyeXB0b0hhbmRsZXItPkRlY3J5cHRTdHJlYW0oY29udGV4dCwgcFNyY0RhdGEsIGR3U3JjU2l6ZSwgZGVzdF9idWYpOwotICAgICAgICBwU3RyZWFtLT5tX3BDcnlwdG9IYW5kbGVyLT5EZWNyeXB0RmluaXNoKGNvbnRleHQsIGRlc3RfYnVmKTsKLSAgICAgICAgcERlY3J5cHRlZERhdGEgPSBkZXN0X2J1Zi5HZXRCdWZmZXIoKTsKLSAgICAgICAgZHdEZWNyeXB0ZWRTaXplID0gZGVzdF9idWYuR2V0U2l6ZSgpOwotICAgICAgICBkZXN0X2J1Zi5EZXRhY2hCdWZmZXIoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwRGVjcnlwdGVkRGF0YSA9IHBTcmNEYXRhOwotICAgICAgICBkd0RlY3J5cHRlZFNpemUgPSBkd1NyY1NpemU7Ci0gICAgfQotICAgIGlmICghcFN0cmVhbS0+R2V0RGljdCgpLT5LZXlFeGlzdChGWF9CU1RSQygiRmlsdGVyIikpIHx8IGJSYXdBY2Nlc3MpIHsKLSAgICAgICAgbV9wRGF0YSA9IHBEZWNyeXB0ZWREYXRhOwotICAgICAgICBtX2R3U2l6ZSA9IGR3RGVjcnlwdGVkU2l6ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBGWF9CT09MIGJSZXQgPSBQREZfRGF0YURlY29kZShwRGVjcnlwdGVkRGF0YSwgZHdEZWNyeXB0ZWRTaXplLCBtX3BTdHJlYW0tPkdldERpY3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGF0YSwgbV9kd1NpemUsIG1fSW1hZ2VEZWNvZGVyLCBtX3BJbWFnZVBhcmFtLCBlc3RpbWF0ZWRfc2l6ZSwgYkltYWdlQWNjKTsKLSAgICAgICAgaWYgKCFiUmV0KSB7Ci0gICAgICAgICAgICBtX3BEYXRhID0gcERlY3J5cHRlZERhdGE7Ci0gICAgICAgICAgICBtX2R3U2l6ZSA9IGR3RGVjcnlwdGVkU2l6ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocFNyY0RhdGEgIT0gcFN0cmVhbS0+bV9wRGF0YUJ1ZiAmJiBwU3JjRGF0YSAhPSBtX3BEYXRhKSB7Ci0gICAgICAgIEZYX0ZyZWUocFNyY0RhdGEpOwotICAgIH0KLSAgICBpZiAocERlY3J5cHRlZERhdGEgIT0gcFNyY0RhdGEgJiYgcERlY3J5cHRlZERhdGEgIT0gbV9wRGF0YSkgewotICAgICAgICBGWF9GcmVlKHBEZWNyeXB0ZWREYXRhKTsKLSAgICB9Ci0gICAgbV9wU3JjRGF0YSA9IE5VTEw7Ci0gICAgbV9iTmV3QnVmID0gbV9wRGF0YSAhPSBwU3RyZWFtLT5tX3BEYXRhQnVmOwotfQotQ1BERl9TdHJlYW1BY2M6On5DUERGX1N0cmVhbUFjYygpCi17Ci0gICAgaWYgKG1fYk5ld0J1ZiAmJiBtX3BEYXRhKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wRGF0YSk7Ci0gICAgfQotICAgIGlmIChtX3BTcmNEYXRhKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wU3JjRGF0YSk7Ci0gICAgfQotfQotRlhfTFBDQllURSBDUERGX1N0cmVhbUFjYzo6R2V0RGF0YSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fYk5ld0J1ZikgewotICAgICAgICByZXR1cm4gbV9wRGF0YTsKLSAgICB9Ci0gICAgaWYgKCFtX3BTdHJlYW0pIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBtX3BTdHJlYW0tPm1fcERhdGFCdWY7Ci19Ci1GWF9EV09SRCBDUERGX1N0cmVhbUFjYzo6R2V0U2l6ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fYk5ld0J1ZikgewotICAgICAgICByZXR1cm4gbV9kd1NpemU7Ci0gICAgfQotICAgIGlmICghbV9wU3RyZWFtKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gbV9wU3RyZWFtLT5tX2R3U2l6ZTsKLX0KLUZYX0xQQllURSBDUERGX1N0cmVhbUFjYzo6RGV0YWNoRGF0YSgpCi17Ci0gICAgaWYgKG1fYk5ld0J1ZikgewotICAgICAgICBGWF9MUEJZVEUgcCA9IG1fcERhdGE7Ci0gICAgICAgIG1fcERhdGEgPSBOVUxMOwotICAgICAgICBtX2R3U2l6ZSA9IDA7Ci0gICAgICAgIHJldHVybiBwOwotICAgIH0KLSAgICBGWF9MUEJZVEUgcCA9IEZYX0FsbG9jKEZYX0JZVEUsIG1fZHdTaXplKTsKLSAgICBGWFNZU19tZW1jcHkzMihwLCBtX3BEYXRhLCBtX2R3U2l6ZSk7CiAgICAgcmV0dXJuIHA7CisgIH0KKyAgdWludDhfdCogcCA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fZHdTaXplKTsKKyAgRlhTWVNfbWVtY3B5KHAsIG1fcERhdGEsIG1fZHdTaXplKTsKKyAgcmV0dXJuIHA7CiB9Ci12b2lkIENQREZfUmVmZXJlbmNlOjpTZXRSZWYoQ1BERl9JbmRpcmVjdE9iamVjdHMqIHBEb2MsIEZYX0RXT1JEIG9iam51bSkKLXsKLSAgICBtX3BPYmpMaXN0ID0gcERvYzsKLSAgICBtX1JlZk9iak51bSA9IG9iam51bTsKK3ZvaWQgQ1BERl9SZWZlcmVuY2U6OlNldFJlZihDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBwRG9jLCBGWF9EV09SRCBvYmpudW0pIHsKKyAgbV9wT2JqTGlzdCA9IHBEb2M7CisgIG1fUmVmT2JqTnVtID0gb2JqbnVtOwogfQotQ1BERl9JbmRpcmVjdE9iamVjdHM6OkNQREZfSW5kaXJlY3RPYmplY3RzKENQREZfUGFyc2VyKiBwUGFyc2VyKQotewotICAgIG1fcFBhcnNlciA9IHBQYXJzZXI7Ci0gICAgbV9JbmRpcmVjdE9ianMuSW5pdEhhc2hUYWJsZSgxMDEzKTsKLSAgICBpZiAocFBhcnNlcikgewotICAgICAgICBtX0xhc3RPYmpOdW0gPSBtX3BQYXJzZXItPkdldExhc3RPYmpOdW0oKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX0xhc3RPYmpOdW0gPSAwOwotICAgIH0KK0NQREZfSW5kaXJlY3RPYmplY3RIb2xkZXI6OkNQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIoQ1BERl9QYXJzZXIqIHBQYXJzZXIpCisgICAgOiBtX3BQYXJzZXIocFBhcnNlciksIG1fTGFzdE9iak51bSgwKSB7CisgIGlmIChwUGFyc2VyKQorICAgIG1fTGFzdE9iak51bSA9IG1fcFBhcnNlci0+R2V0TGFzdE9iak51bSgpOwogfQotQ1BERl9JbmRpcmVjdE9iamVjdHM6On5DUERGX0luZGlyZWN0T2JqZWN0cygpCi17Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9JbmRpcmVjdE9ianMuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgRlhfTFBWT0lEIGtleSwgdmFsdWU7Ci0gICAgICAgIG1fSW5kaXJlY3RPYmpzLkdldE5leHRBc3NvYyhwb3MsIGtleSwgdmFsdWUpOwotICAgICAgICAoKENQREZfT2JqZWN0Kil2YWx1ZSktPkRlc3Ryb3koKTsKLSAgICB9CitDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyOjp+Q1BERl9JbmRpcmVjdE9iamVjdEhvbGRlcigpIHsKKyAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbV9JbmRpcmVjdE9ianMpIHsKKyAgICBwYWlyLnNlY29uZC0+RGVzdHJveSgpOworICB9CiB9Ci1DUERGX09iamVjdCogQ1BERl9JbmRpcmVjdE9iamVjdHM6OkdldEluZGlyZWN0T2JqZWN0KEZYX0RXT1JEIG9iam51bSwgc3RydWN0IFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0KQotewotICAgIGlmIChvYmpudW0gPT0gMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgRlhfTFBWT0lEIHZhbHVlOwotICAgIHsKLSAgICAgICAgaWYgKG1fSW5kaXJlY3RPYmpzLkxvb2t1cCgoRlhfTFBWT0lEKShGWF9VSU5UUFRSKW9iam51bSwgdmFsdWUpKSB7Ci0gICAgICAgICAgICBpZiAoKChDUERGX09iamVjdCopdmFsdWUpLT5HZXRPYmpOdW0oKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIChDUERGX09iamVjdCopdmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBPYmogPSBOVUxMOwotICAgIGlmIChtX3BQYXJzZXIpIHsKLSAgICAgICAgcE9iaiA9IG1fcFBhcnNlci0+UGFyc2VJbmRpcmVjdE9iamVjdCh0aGlzLCBvYmpudW0sIHBDb250ZXh0KTsKLSAgICB9Ci0gICAgaWYgKHBPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcE9iai0+bV9PYmpOdW0gPSBvYmpudW07Ci0gICAgaWYgKG1fTGFzdE9iak51bSA8IG9iam51bSkgewotICAgICAgICBtX0xhc3RPYmpOdW0gPSBvYmpudW07Ci0gICAgfQotICAgIGlmIChtX0luZGlyZWN0T2Jqcy5Mb29rdXAoKEZYX0xQVk9JRCkoRlhfVUlOVFBUUilvYmpudW0sIHZhbHVlKSkgewotICAgICAgICBpZiAodmFsdWUpIHsKLSAgICAgICAgICAgICgoQ1BERl9PYmplY3QgKil2YWx1ZSktPkRlc3Ryb3koKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtX0luZGlyZWN0T2Jqcy5TZXRBdCgoRlhfTFBWT0lEKShGWF9VSU5UUFRSKW9iam51bSwgcE9iaik7Ci0gICAgcmV0dXJuIHBPYmo7CitDUERGX09iamVjdCogQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlcjo6R2V0SW5kaXJlY3RPYmplY3QoCisgICAgRlhfRFdPUkQgb2JqbnVtLAorICAgIFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0KSB7CisgIGlmIChvYmpudW0gPT0gMCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBhdXRvIGl0ID0gbV9JbmRpcmVjdE9ianMuZmluZChvYmpudW0pOworICBpZiAoaXQgIT0gbV9JbmRpcmVjdE9ianMuZW5kKCkpCisgICAgcmV0dXJuIGl0LT5zZWNvbmQtPkdldE9iak51bSgpICE9IC0xID8gaXQtPnNlY29uZCA6IG51bGxwdHI7CisKKyAgaWYgKCFtX3BQYXJzZXIpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgQ1BERl9PYmplY3QqIHBPYmogPSBtX3BQYXJzZXItPlBhcnNlSW5kaXJlY3RPYmplY3QodGhpcywgb2JqbnVtLCBwQ29udGV4dCk7CisgIGlmICghcE9iaikKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBwT2JqLT5tX09iak51bSA9IG9iam51bTsKKyAgbV9MYXN0T2JqTnVtID0gc3RkOjptYXgobV9MYXN0T2JqTnVtLCBvYmpudW0pOworICBpZiAobV9JbmRpcmVjdE9ianNbb2JqbnVtXSkKKyAgICBtX0luZGlyZWN0T2Jqc1tvYmpudW1dLT5EZXN0cm95KCk7CisKKyAgbV9JbmRpcmVjdE9ianNbb2JqbnVtXSA9IHBPYmo7CisgIHJldHVybiBwT2JqOwogfQotaW50IENQREZfSW5kaXJlY3RPYmplY3RzOjpHZXRJbmRpcmVjdFR5cGUoRlhfRFdPUkQgb2JqbnVtKQotewotICAgIEZYX0xQVk9JRCB2YWx1ZTsKLSAgICBpZiAobV9JbmRpcmVjdE9ianMuTG9va3VwKChGWF9MUFZPSUQpKEZYX1VJTlRQVFIpb2JqbnVtLCB2YWx1ZSkpIHsKLSAgICAgICAgcmV0dXJuICgoQ1BERl9PYmplY3QqKXZhbHVlKS0+R2V0VHlwZSgpOwotICAgIH0KLSAgICBpZiAobV9wUGFyc2VyKSB7Ci0gICAgICAgIFBBUlNFX0NPTlRFWFQgY29udGV4dDsKLSAgICAgICAgRlhTWVNfbWVtc2V0MzIoJmNvbnRleHQsIDAsIHNpemVvZihQQVJTRV9DT05URVhUKSk7Ci0gICAgICAgIGNvbnRleHQubV9GbGFncyA9IFBERlBBUlNFX1RZUEVPTkxZOwotICAgICAgICByZXR1cm4gKGludCkoRlhfVUlOVFBUUiltX3BQYXJzZXItPlBhcnNlSW5kaXJlY3RPYmplY3QodGhpcywgb2JqbnVtLCAmY29udGV4dCk7Ci0gICAgfQoraW50IENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXI6OkdldEluZGlyZWN0VHlwZShGWF9EV09SRCBvYmpudW0pIHsKKyAgYXV0byBpdCA9IG1fSW5kaXJlY3RPYmpzLmZpbmQob2JqbnVtKTsKKyAgaWYgKGl0ICE9IG1fSW5kaXJlY3RPYmpzLmVuZCgpKQorICAgIHJldHVybiBpdC0+c2Vjb25kLT5HZXRUeXBlKCk7CisKKyAgaWYgKCFtX3BQYXJzZXIpCiAgICAgcmV0dXJuIDA7CisKKyAgUEFSU0VfQ09OVEVYVCBjb250ZXh0OworICBGWFNZU19tZW1zZXQoJmNvbnRleHQsIDAsIHNpemVvZihQQVJTRV9DT05URVhUKSk7CisgIGNvbnRleHQubV9GbGFncyA9IFBERlBBUlNFX1RZUEVPTkxZOworICByZXR1cm4gKGludCkodWludHB0cl90KW1fcFBhcnNlci0+UGFyc2VJbmRpcmVjdE9iamVjdCh0aGlzLCBvYmpudW0sICZjb250ZXh0KTsKIH0KLUZYX0RXT1JEIENQREZfSW5kaXJlY3RPYmplY3RzOjpBZGRJbmRpcmVjdE9iamVjdChDUERGX09iamVjdCogcE9iaikKLXsKLSAgICBpZiAocE9iai0+bV9PYmpOdW0pIHsKLSAgICAgICAgcmV0dXJuIHBPYmotPm1fT2JqTnVtOwotICAgIH0KLSAgICBtX0xhc3RPYmpOdW0gKys7Ci0gICAgbV9JbmRpcmVjdE9ianMuU2V0QXQoKEZYX0xQVk9JRCkoRlhfVUlOVFBUUiltX0xhc3RPYmpOdW0sIHBPYmopOwotICAgIHBPYmotPm1fT2JqTnVtID0gbV9MYXN0T2JqTnVtOwotICAgIHJldHVybiBtX0xhc3RPYmpOdW07CitGWF9EV09SRCBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyOjpBZGRJbmRpcmVjdE9iamVjdChDUERGX09iamVjdCogcE9iaikgeworICBpZiAocE9iai0+bV9PYmpOdW0pIHsKKyAgICByZXR1cm4gcE9iai0+bV9PYmpOdW07CisgIH0KKyAgbV9MYXN0T2JqTnVtKys7CisgIG1fSW5kaXJlY3RPYmpzW21fTGFzdE9iak51bV0gPSBwT2JqOworICBwT2JqLT5tX09iak51bSA9IG1fTGFzdE9iak51bTsKKyAgcmV0dXJuIG1fTGFzdE9iak51bTsKIH0KLXZvaWQgQ1BERl9JbmRpcmVjdE9iamVjdHM6OlJlbGVhc2VJbmRpcmVjdE9iamVjdChGWF9EV09SRCBvYmpudW0pCi17Ci0gICAgRlhfTFBWT0lEIHZhbHVlOwotICAgIGlmICghbV9JbmRpcmVjdE9ianMuTG9va3VwKChGWF9MUFZPSUQpKEZYX1VJTlRQVFIpb2JqbnVtLCB2YWx1ZSkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoKChDUERGX09iamVjdCopdmFsdWUpLT5HZXRPYmpOdW0oKSA9PSAtMSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgICgoQ1BERl9PYmplY3QqKXZhbHVlKS0+RGVzdHJveSgpOwotICAgIG1fSW5kaXJlY3RPYmpzLlJlbW92ZUtleSgoRlhfTFBWT0lEKShGWF9VSU5UUFRSKW9iam51bSk7Cit2b2lkIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXI6OlJlbGVhc2VJbmRpcmVjdE9iamVjdChGWF9EV09SRCBvYmpudW0pIHsKKyAgYXV0byBpdCA9IG1fSW5kaXJlY3RPYmpzLmZpbmQob2JqbnVtKTsKKyAgaWYgKGl0ID09IG1fSW5kaXJlY3RPYmpzLmVuZCgpIHx8IGl0LT5zZWNvbmQtPkdldE9iak51bSgpID09IC0xKQorICAgIHJldHVybjsKKyAgaXQtPnNlY29uZC0+RGVzdHJveSgpOworICBtX0luZGlyZWN0T2Jqcy5lcmFzZShpdCk7CiB9Ci12b2lkIENQREZfSW5kaXJlY3RPYmplY3RzOjpJbnNlcnRJbmRpcmVjdE9iamVjdChGWF9EV09SRCBvYmpudW0sIENQREZfT2JqZWN0KiBwT2JqKQotewotICAgIGlmIChvYmpudW0gPT0gMCB8fCBwT2JqID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOworRlhfQk9PTCBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyOjpJbnNlcnRJbmRpcmVjdE9iamVjdChGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwT2JqKSB7CisgIGlmICghb2JqbnVtIHx8ICFwT2JqKQorICAgIHJldHVybiBGQUxTRTsKKyAgYXV0byBpdCA9IG1fSW5kaXJlY3RPYmpzLmZpbmQob2JqbnVtKTsKKyAgaWYgKGl0ICE9IG1fSW5kaXJlY3RPYmpzLmVuZCgpKSB7CisgICAgaWYgKHBPYmotPkdldEdlbk51bSgpIDw9IGl0LT5zZWNvbmQtPkdldEdlbk51bSgpKSB7CisgICAgICBwT2JqLT5EZXN0cm95KCk7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIEZYX0xQVk9JRCB2YWx1ZSA9IE5VTEw7Ci0gICAgaWYgKG1fSW5kaXJlY3RPYmpzLkxvb2t1cCgoRlhfTFBWT0lEKShGWF9VSU5UUFRSKW9iam51bSwgdmFsdWUpKSB7Ci0gICAgICAgIGlmICh2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBPYmotPkdldEdlbk51bSgpIDw9ICgoQ1BERl9PYmplY3QqKXZhbHVlKS0+R2V0R2VuTnVtKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICgoQ1BERl9PYmplY3QqKXZhbHVlKS0+RGVzdHJveSgpOwotICAgICAgICAgfQotICAgIH0KLSAgICBwT2JqLT5tX09iak51bSA9IG9iam51bTsKLSAgICBtX0luZGlyZWN0T2Jqcy5TZXRBdCgoRlhfTFBWT0lEKShGWF9VSU5UUFRSKW9iam51bSwgcE9iaik7Ci0gICAgaWYgKG1fTGFzdE9iak51bSA8IG9iam51bSkgewotICAgICAgICBtX0xhc3RPYmpOdW0gPSBvYmpudW07Ci0gICAgfQotfQotRlhfRFdPUkQgQ1BERl9JbmRpcmVjdE9iamVjdHM6OkdldExhc3RPYmpOdW0oKSBjb25zdAotewotICAgIHJldHVybiBtX0xhc3RPYmpOdW07CisgICAgaXQtPnNlY29uZC0+RGVzdHJveSgpOworICB9CisgIHBPYmotPm1fT2JqTnVtID0gb2JqbnVtOworICBtX0luZGlyZWN0T2Jqc1tvYmpudW1dID0gcE9iajsKKyAgbV9MYXN0T2JqTnVtID0gc3RkOjptYXgobV9MYXN0T2JqTnVtLCBvYmpudW0pOworICByZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfcGFyc2VyLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfcGFyc2VyLmNwcAppbmRleCAwZDRlZDI3Li42ZjBmYzc2IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX3BhcnNlci5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9wYXJzZXIuY3BwCkBAIC0xLDQ2NDggKzEsNTAxNyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFyc2VyLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL3NyYy9meGNydC9meF9zYWZlX3R5cGVzLmgiCi0jaW5jbHVkZSAiLi4vZnBkZl9wYWdlL3BhZ2VpbnQuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhcnNlci5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKLUZYX0JPT0wgSXNTaWduYXR1cmVEaWN0KGNvbnN0IENQREZfRGljdGlvbmFyeSogcERpY3QpCi17Ci0gICAgQ1BERl9PYmplY3QqIHBUeXBlID0gcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiVHlwZSIpKTsKLSAgICBpZiAoIXBUeXBlKSB7Ci0gICAgICAgIHBUeXBlID0gcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRlQiKSk7Ci0gICAgICAgIGlmICghcFR5cGUpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocFR5cGUtPkdldFN0cmluZygpID09IEZYX0JTVFJDKCJTaWciKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotc3RhdGljIGludCBfQ29tcGFyZUZpbGVTaXplKGNvbnN0IHZvaWQqIHAxLCBjb25zdCB2b2lkKiBwMikKLXsKLSAgICBGWF9GSUxFU0laRSByZXQgPSAoKihGWF9GSUxFU0laRSopcDEpIC0gKCooRlhfRklMRVNJWkUqKXAyKTsKLSAgICBpZiAocmV0ID4gMCkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICByZXR1cm4gMDsKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9leHQuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc2FmZV90eXBlcy5oIgorI2luY2x1ZGUgImNvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL3BhZ2VpbnQuaCIKKyNpbmNsdWRlICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL3BhcnNlcl9pbnQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKKy8vIEEgbGltaXQgb24gdGhlIHNpemUgb2YgdGhlIHhyZWYgdGFibGUuIFRoZW9yZXRpY2FsIGxpbWl0cyBhcmUgaGlnaGVyLCBidXQKKy8vIHRoaXMgbWF5IGJlIGxhcmdlIGVub3VnaCBpbiBwcmFjdGljZS4KK2NvbnN0IGludDMyX3Qga01heFhSZWZTaXplID0gMTA0ODU3NjsKKworLy8gQSBsaW1pdCBvbiB0aGUgbWF4aW11bSBvYmplY3QgbnVtYmVyIGluIHRoZSB4cmVmIHRhYmxlLiBUaGVvcmV0aWNhbCBsaW1pdHMKKy8vIGFyZSBoaWdoZXIsIGJ1dCB0aGlzIG1heSBiZSBsYXJnZSBlbm91Z2ggaW4gcHJhY3RpY2UuCitjb25zdCBGWF9EV09SRCBrTWF4T2JqZWN0TnVtYmVyID0gMTA0ODU3NjsKKworc3RydWN0IFNlYXJjaFRhZ1JlY29yZCB7CisgIGNvbnN0IGNoYXIqIG1fcFRhZzsKKyAgRlhfRFdPUkQgbV9MZW47CisgIEZYX0RXT1JEIG1fT2Zmc2V0OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBTY29wZWRTZXRJbnNlcnRpb24geworIHB1YmxpYzoKKyAgU2NvcGVkU2V0SW5zZXJ0aW9uKHN0ZDo6c2V0PFQ+KiBvcmdfc2V0LCBUIGVsZW0pCisgICAgICA6IG1fU2V0KG9yZ19zZXQpLCBtX0VudHJ5KGVsZW0pIHsKKyAgICBtX1NldC0+aW5zZXJ0KG1fRW50cnkpOworICB9CisgIH5TY29wZWRTZXRJbnNlcnRpb24oKSB7IG1fU2V0LT5lcmFzZShtX0VudHJ5KTsgfQorCisgcHJpdmF0ZToKKyAgc3RkOjpzZXQ8VD4qIGNvbnN0IG1fU2V0OworICBjb25zdCBUIG1fRW50cnk7Cit9OworCitpbnQgQ29tcGFyZUZpbGVTaXplKGNvbnN0IHZvaWQqIHAxLCBjb25zdCB2b2lkKiBwMikgeworICByZXR1cm4gKihGWF9GSUxFU0laRSopcDEgLSAqKEZYX0ZJTEVTSVpFKilwMjsKIH0KIAotQ1BERl9QYXJzZXI6OkNQREZfUGFyc2VyKCkKLXsKK2ludDMyX3QgR2V0SGVhZGVyT2Zmc2V0KElGWF9GaWxlUmVhZCogcEZpbGUpIHsKKyAgY29uc3QgRlhfRFdPUkQgdGFnID0gRlhEV09SRF9GUk9NX0xTQkZJUlNUKDB4NDY0NDUwMjUpOworICBjb25zdCBzaXplX3Qga0J1ZlNpemUgPSA0OworICB1aW50OF90IGJ1ZltrQnVmU2l6ZV07CisgIGludDMyX3Qgb2Zmc2V0ID0gMDsKKyAgd2hpbGUgKG9mZnNldCA8PSAxMDI0KSB7CisgICAgaWYgKCFwRmlsZS0+UmVhZEJsb2NrKGJ1Ziwgb2Zmc2V0LCBrQnVmU2l6ZSkpCisgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoKihGWF9EV09SRCopYnVmID09IHRhZykKKyAgICAgIHJldHVybiBvZmZzZXQ7CisKKyAgICArK29mZnNldDsKKyAgfQorICByZXR1cm4gLTE7Cit9CisKK2ludDMyX3QgR2V0RGlyZWN0SW50ZWdlcihDUERGX0RpY3Rpb25hcnkqIHBEaWN0LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgeworICBDUERGX051bWJlciogcE9iaiA9IFRvTnVtYmVyKHBEaWN0LT5HZXRFbGVtZW50KGtleSkpOworICByZXR1cm4gcE9iaiA/IHBPYmotPkdldEludGVnZXIoKSA6IDA7Cit9CisKK0ZYX0RXT1JEIEdldFZhckludChjb25zdCB1aW50OF90KiBwLCBpbnQzMl90IG4pIHsKKyAgRlhfRFdPUkQgcmVzdWx0ID0gMDsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbjsgKytpKQorICAgIHJlc3VsdCA9IHJlc3VsdCAqIDI1NiArIHBbaV07CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludDMyX3QgR2V0U3RyZWFtTkNvdW50KENQREZfU3RyZWFtQWNjKiBwT2JqU3RyZWFtKSB7CisgIHJldHVybiBwT2JqU3RyZWFtLT5HZXREaWN0KCktPkdldEludGVnZXIoIk4iKTsKK30KKworaW50MzJfdCBHZXRTdHJlYW1GaXJzdChDUERGX1N0cmVhbUFjYyogcE9ialN0cmVhbSkgeworICByZXR1cm4gcE9ialN0cmVhbS0+R2V0RGljdCgpLT5HZXRJbnRlZ2VyKCJGaXJzdCIpOworfQorCitib29sIENhblJlYWRGcm9tQml0U3RyZWFtKGNvbnN0IENGWF9CaXRTdHJlYW0qIGhTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1NBRkVfRFdPUkQmIG51bV9iaXRzKSB7CisgIHJldHVybiAobnVtX2JpdHMuSXNWYWxpZCgpICYmCisgICAgICAgICAgaFN0cmVhbS0+Qml0c1JlbWFpbmluZygpID49IG51bV9iaXRzLlZhbHVlT3JEaWUoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBUT0RPKHRoZXN0aWcpIFVzaW5nIHVuaXF1ZV9wdHIgd2l0aCBSZWxlYXNlRGVsZXRlciBpcyBzdGlsbCBub3QgaWRlYWwuCisvLyBDb21lIHVwIG9yIHdhaXQgZm9yIHNvbWV0aGluZyBiZXR0ZXIuCit1c2luZyBTY29wZWRGaWxlU3RyZWFtID0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SUZYX0ZpbGVTdHJlYW0sIFJlbGVhc2VEZWxldGVyPElGWF9GaWxlU3RyZWFtPj47CisKK2Jvb2wgSXNTaWduYXR1cmVEaWN0KGNvbnN0IENQREZfRGljdGlvbmFyeSogcERpY3QpIHsKKyAgQ1BERl9PYmplY3QqIHBUeXBlID0gcERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiVHlwZSIpOworICBpZiAoIXBUeXBlKQorICAgIHBUeXBlID0gcERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiRlQiKTsKKyAgcmV0dXJuIHBUeXBlICYmIHBUeXBlLT5HZXRTdHJpbmcoKSA9PSAiU2lnIjsKK30KKworQ1BERl9QYXJzZXI6OkNQREZfUGFyc2VyKCkgeworICBtX3BEb2N1bWVudCA9IE5VTEw7CisgIG1fcFRyYWlsZXIgPSBOVUxMOworICBtX3BFbmNyeXB0RGljdCA9IE5VTEw7CisgIG1fcExpbmVhcml6ZWQgPSBOVUxMOworICBtX2R3Rmlyc3RQYWdlTm8gPSAwOworICBtX2R3WHJlZlN0YXJ0T2JqTnVtID0gMDsKKyAgbV9iT3duRmlsZVJlYWQgPSBUUlVFOworICBtX0ZpbGVWZXJzaW9uID0gMDsKKyAgbV9iRm9yY2VVc2VTZWN1cml0eUhhbmRsZXIgPSBGQUxTRTsKK30KK0NQREZfUGFyc2VyOjp+Q1BERl9QYXJzZXIoKSB7CisgIENsb3NlUGFyc2VyKEZBTFNFKTsKK30KKworRlhfRFdPUkQgQ1BERl9QYXJzZXI6OkdldExhc3RPYmpOdW0oKSBjb25zdCB7CisgIHJldHVybiBtX09iamVjdEluZm8uZW1wdHkoKSA/IDAgOiBtX09iamVjdEluZm8ucmJlZ2luKCktPmZpcnN0OworfQorCitib29sIENQREZfUGFyc2VyOjpJc1ZhbGlkT2JqZWN0TnVtYmVyKEZYX0RXT1JEIG9iam51bSkgY29uc3QgeworICByZXR1cm4gIW1fT2JqZWN0SW5mby5lbXB0eSgpICYmIG9iam51bSA8PSBtX09iamVjdEluZm8ucmJlZ2luKCktPmZpcnN0OworfQorCit2b2lkIENQREZfUGFyc2VyOjpTZXRFbmNyeXB0RGljdGlvbmFyeShDUERGX0RpY3Rpb25hcnkqIHBEaWN0KSB7CisgIG1fcEVuY3J5cHREaWN0ID0gcERpY3Q7Cit9CisKK0ZYX0ZJTEVTSVpFIENQREZfUGFyc2VyOjpHZXRPYmplY3RQb3NpdGlvbk9yWmVybyhGWF9EV09SRCBvYmpudW0pIGNvbnN0IHsKKyAgYXV0byBpdCA9IG1fT2JqZWN0SW5mby5maW5kKG9iam51bSk7CisgIHJldHVybiBpdCAhPSBtX09iamVjdEluZm8uZW5kKCkgPyBpdC0+c2Vjb25kLnBvcyA6IDA7Cit9CisKK3ZvaWQgQ1BERl9QYXJzZXI6OlNocmlua09iamVjdE1hcChGWF9EV09SRCBvYmpudW0pIHsKKyAgaWYgKG9iam51bSA9PSAwKSB7CisgICAgbV9PYmplY3RJbmZvLmNsZWFyKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgYXV0byBpdCA9IG1fT2JqZWN0SW5mby5sb3dlcl9ib3VuZChvYmpudW0pOworICB3aGlsZSAoaXQgIT0gbV9PYmplY3RJbmZvLmVuZCgpKSB7CisgICAgYXV0byBzYXZlZF9pdCA9IGl0Kys7CisgICAgbV9PYmplY3RJbmZvLmVyYXNlKHNhdmVkX2l0KTsKKyAgfQorCisgIGlmICghcGRmaXVtOjpDb250YWluc0tleShtX09iamVjdEluZm8sIG9iam51bSAtIDEpKQorICAgIG1fT2JqZWN0SW5mb1tvYmpudW0gLSAxXS5wb3MgPSAwOworfQorCit2b2lkIENQREZfUGFyc2VyOjpDbG9zZVBhcnNlcihGWF9CT09MIGJSZVBhcnNlKSB7CisgIG1fYlZlcnNpb25VcGRhdGVkID0gRkFMU0U7CisgIGlmICghYlJlUGFyc2UpIHsKKyAgICBkZWxldGUgbV9wRG9jdW1lbnQ7CiAgICAgbV9wRG9jdW1lbnQgPSBOVUxMOworICB9CisgIGlmIChtX3BUcmFpbGVyKSB7CisgICAgbV9wVHJhaWxlci0+UmVsZWFzZSgpOwogICAgIG1fcFRyYWlsZXIgPSBOVUxMOwotICAgIG1fcEVuY3J5cHREaWN0ID0gTlVMTDsKLSAgICBtX3BTZWN1cml0eUhhbmRsZXIgPSBOVUxMOworICB9CisgIFJlbGVhc2VFbmNyeXB0SGFuZGxlcigpOworICBTZXRFbmNyeXB0RGljdGlvbmFyeShOVUxMKTsKKyAgaWYgKG1fYk93bkZpbGVSZWFkICYmIG1fU3ludGF4Lm1fcEZpbGVBY2Nlc3MpIHsKKyAgICBtX1N5bnRheC5tX3BGaWxlQWNjZXNzLT5SZWxlYXNlKCk7CisgICAgbV9TeW50YXgubV9wRmlsZUFjY2VzcyA9IE5VTEw7CisgIH0KKyAgRlhfUE9TSVRJT04gcG9zID0gbV9PYmplY3RTdHJlYW1NYXAuR2V0U3RhcnRQb3NpdGlvbigpOworICB3aGlsZSAocG9zKSB7CisgICAgdm9pZCogb2JqbnVtOworICAgIENQREZfU3RyZWFtQWNjKiBwU3RyZWFtOworICAgIG1fT2JqZWN0U3RyZWFtTWFwLkdldE5leHRBc3NvYyhwb3MsIG9iam51bSwgKHZvaWQqJilwU3RyZWFtKTsKKyAgICBkZWxldGUgcFN0cmVhbTsKKyAgfQorICBtX09iamVjdFN0cmVhbU1hcC5SZW1vdmVBbGwoKTsKKyAgbV9PYmpDYWNoZS5jbGVhcigpOworCisgIG1fU29ydGVkT2Zmc2V0LlJlbW92ZUFsbCgpOworICBtX09iamVjdEluZm8uY2xlYXIoKTsKKyAgbV9WNVR5cGUuUmVtb3ZlQWxsKCk7CisgIG1fT2JqVmVyc2lvbi5SZW1vdmVBbGwoKTsKKyAgaW50MzJfdCBpTGVuID0gbV9UcmFpbGVycy5HZXRTaXplKCk7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMZW47ICsraSkgeworICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHRyYWlsZXIgPSBtX1RyYWlsZXJzLkdldEF0KGkpKQorICAgICAgdHJhaWxlci0+UmVsZWFzZSgpOworICB9CisgIG1fVHJhaWxlcnMuUmVtb3ZlQWxsKCk7CisgIGlmIChtX3BMaW5lYXJpemVkKSB7CisgICAgbV9wTGluZWFyaXplZC0+UmVsZWFzZSgpOwogICAgIG1fcExpbmVhcml6ZWQgPSBOVUxMOwotICAgIG1fZHdGaXJzdFBhZ2VObyA9IDA7Ci0gICAgbV9kd1hyZWZTdGFydE9iak51bSA9IDA7Ci0gICAgbV9iT3duRmlsZVJlYWQgPSBUUlVFOwotICAgIG1fRmlsZVZlcnNpb24gPSAwOwotICAgIG1fYkZvcmNlVXNlU2VjdXJpdHlIYW5kbGVyID0gRkFMU0U7Ci19Ci1DUERGX1BhcnNlcjo6fkNQREZfUGFyc2VyKCkKLXsKLSAgICBDbG9zZVBhcnNlcihGQUxTRSk7Ci19Ci1GWF9EV09SRCBDUERGX1BhcnNlcjo6R2V0TGFzdE9iak51bSgpCi17Ci0gICAgRlhfRFdPUkQgZHdTaXplID0gbV9Dcm9zc1JlZi5HZXRTaXplKCk7Ci0gICAgcmV0dXJuIGR3U2l6ZSA/IGR3U2l6ZSAtIDEgOiAwOwotfQotdm9pZCBDUERGX1BhcnNlcjo6U2V0RW5jcnlwdERpY3Rpb25hcnkoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkKLXsKLSAgICBtX3BFbmNyeXB0RGljdCA9IHBEaWN0OwotfQotdm9pZCBDUERGX1BhcnNlcjo6Q2xvc2VQYXJzZXIoRlhfQk9PTCBiUmVQYXJzZSkKLXsKLSAgICBtX2JWZXJzaW9uVXBkYXRlZCA9IEZBTFNFOwotICAgIGlmIChtX3BEb2N1bWVudCAmJiAhYlJlUGFyc2UpIHsKLSAgICAgICAgZGVsZXRlIG1fcERvY3VtZW50OwotICAgICAgICBtX3BEb2N1bWVudCA9IE5VTEw7Ci0gICAgfQotICAgIGlmIChtX3BUcmFpbGVyKSB7Ci0gICAgICAgIG1fcFRyYWlsZXItPlJlbGVhc2UoKTsKLSAgICAgICAgbV9wVHJhaWxlciA9IE5VTEw7Ci0gICAgfQotICAgIFJlbGVhc2VFbmNyeXB0SGFuZGxlcigpOwotICAgIFNldEVuY3J5cHREaWN0aW9uYXJ5KE5VTEwpOwotICAgIGlmIChtX2JPd25GaWxlUmVhZCAmJiBtX1N5bnRheC5tX3BGaWxlQWNjZXNzKSB7Ci0gICAgICAgIG1fU3ludGF4Lm1fcEZpbGVBY2Nlc3MtPlJlbGVhc2UoKTsKLSAgICAgICAgbV9TeW50YXgubV9wRmlsZUFjY2VzcyA9IE5VTEw7Ci0gICAgfQotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fT2JqZWN0U3RyZWFtTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIEZYX0xQVk9JRCBvYmpudW07Ci0gICAgICAgIENQREZfU3RyZWFtQWNjKiBwU3RyZWFtOwotICAgICAgICBtX09iamVjdFN0cmVhbU1hcC5HZXROZXh0QXNzb2MocG9zLCBvYmpudW0sICh2b2lkKiYpcFN0cmVhbSk7Ci0gICAgICAgIGRlbGV0ZSBwU3RyZWFtOwotICAgIH0KLSAgICBtX09iamVjdFN0cmVhbU1hcC5SZW1vdmVBbGwoKTsKLSAgICBtX1NvcnRlZE9mZnNldC5SZW1vdmVBbGwoKTsKLSAgICBtX0Nyb3NzUmVmLlJlbW92ZUFsbCgpOwotICAgIG1fVjVUeXBlLlJlbW92ZUFsbCgpOwotICAgIG1fT2JqVmVyc2lvbi5SZW1vdmVBbGwoKTsKLSAgICBGWF9JTlQzMiBpTGVuID0gbV9UcmFpbGVycy5HZXRTaXplKCk7Ci0gICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlMZW47ICsraSkgewotICAgICAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiB0cmFpbGVyID0gbV9UcmFpbGVycy5HZXRBdChpKSkKLSAgICAgICAgICAgIHRyYWlsZXItPlJlbGVhc2UoKTsKLSAgICB9Ci0gICAgbV9UcmFpbGVycy5SZW1vdmVBbGwoKTsKLSAgICBpZiAobV9wTGluZWFyaXplZCkgewotICAgICAgICBtX3BMaW5lYXJpemVkLT5SZWxlYXNlKCk7Ci0gICAgICAgIG1fcExpbmVhcml6ZWQgPSBOVUxMOwotICAgIH0KLX0KLXN0YXRpYyBGWF9JTlQzMiBHZXRIZWFkZXJPZmZzZXQoSUZYX0ZpbGVSZWFkKiBwRmlsZSkKLXsKLSAgICBGWF9EV09SRCB0YWcgPSBGWERXT1JEX0ZST01fTFNCRklSU1QoMHg0NjQ0NTAyNSk7Ci0gICAgRlhfQllURSBidWZbNF07Ci0gICAgRlhfSU5UMzIgb2Zmc2V0ID0gMDsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoIXBGaWxlLT5SZWFkQmxvY2soYnVmLCBvZmZzZXQsIDQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCooRlhfRFdPUkQqKWJ1ZiA9PSB0YWcpIHsKLSAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0ICsrOwotICAgICAgICBpZiAob2Zmc2V0ID4gMTAyNCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLUZYX0RXT1JEIENQREZfUGFyc2VyOjpTdGFydFBhcnNlKEZYX0xQQ1NUUiBmaWxlbmFtZSwgRlhfQk9PTCBiUmVQYXJzZSkKLXsKLSAgICBJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzID0gRlhfQ3JlYXRlRmlsZVJlYWQoZmlsZW5hbWUpOwotICAgIGlmICghcEZpbGVBY2Nlc3MpIHsKLSAgICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZJTEU7Ci0gICAgfQotICAgIHJldHVybiBTdGFydFBhcnNlKHBGaWxlQWNjZXNzLCBiUmVQYXJzZSk7Ci19Ci1GWF9EV09SRCBDUERGX1BhcnNlcjo6U3RhcnRQYXJzZShGWF9MUENXU1RSIGZpbGVuYW1lLCBGWF9CT09MIGJSZVBhcnNlKQotewotICAgIElGWF9GaWxlUmVhZCogcEZpbGVBY2Nlc3MgPSBGWF9DcmVhdGVGaWxlUmVhZChmaWxlbmFtZSk7Ci0gICAgaWYgKCFwRmlsZUFjY2VzcykgewotICAgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRklMRTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXJ0UGFyc2UocEZpbGVBY2Nlc3MsIGJSZVBhcnNlKTsKKyAgfQogfQogQ1BERl9TZWN1cml0eUhhbmRsZXIqIEZQREZfQ3JlYXRlU3RhbmRhcmRTZWN1cml0eUhhbmRsZXIoKTsKIENQREZfU2VjdXJpdHlIYW5kbGVyKiBGUERGX0NyZWF0ZVB1YktleUhhbmRsZXIodm9pZCopOwotRlhfRFdPUkQgQ1BERl9QYXJzZXI6OlN0YXJ0UGFyc2UoSUZYX0ZpbGVSZWFkKiBwRmlsZUFjY2VzcywgRlhfQk9PTCBiUmVQYXJzZSwgRlhfQk9PTCBiT3duRmlsZVJlYWQpCi17Ci0gICAgQ2xvc2VQYXJzZXIoYlJlUGFyc2UpOwotICAgIG1fYlhSZWZTdHJlYW0gPSBGQUxTRTsKLSAgICBtX0xhc3RYUmVmT2Zmc2V0ID0gMDsKLSAgICBtX2JPd25GaWxlUmVhZCA9IGJPd25GaWxlUmVhZDsKLSAgICBGWF9JTlQzMiBvZmZzZXQgPSBHZXRIZWFkZXJPZmZzZXQocEZpbGVBY2Nlc3MpOwotICAgIGlmIChvZmZzZXQgPT0gLTEpIHsKLSAgICAgICAgaWYgKGJPd25GaWxlUmVhZCAmJiBwRmlsZUFjY2VzcykgewotICAgICAgICAgICAgcEZpbGVBY2Nlc3MtPlJlbGVhc2UoKTsKLSAgICAgICAgfQorRlhfRFdPUkQgQ1BERl9QYXJzZXI6OlN0YXJ0UGFyc2UoSUZYX0ZpbGVSZWFkKiBwRmlsZUFjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlUGFyc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJPd25GaWxlUmVhZCkgeworICBDbG9zZVBhcnNlcihiUmVQYXJzZSk7CisgIG1fYlhSZWZTdHJlYW0gPSBGQUxTRTsKKyAgbV9MYXN0WFJlZk9mZnNldCA9IDA7CisgIG1fYk93bkZpbGVSZWFkID0gYk93bkZpbGVSZWFkOworCisgIGludDMyX3Qgb2Zmc2V0ID0gR2V0SGVhZGVyT2Zmc2V0KHBGaWxlQWNjZXNzKTsKKyAgaWYgKG9mZnNldCA9PSAtMSkgeworICAgIGlmIChiT3duRmlsZVJlYWQgJiYgcEZpbGVBY2Nlc3MpCisgICAgICBwRmlsZUFjY2Vzcy0+UmVsZWFzZSgpOworICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7CisgIH0KKyAgbV9TeW50YXguSW5pdFBhcnNlcihwRmlsZUFjY2Vzcywgb2Zmc2V0KTsKKworICB1aW50OF90IGNoOworICBpZiAoIW1fU3ludGF4LkdldENoYXJBdCg1LCBjaCkpCisgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKKyAgaWYgKHN0ZDo6aXNkaWdpdChjaCkpCisgICAgbV9GaWxlVmVyc2lvbiA9IEZYU1lTX3RvRGVjaW1hbERpZ2l0KGNoKSAqIDEwOworCisgIGlmICghbV9TeW50YXguR2V0Q2hhckF0KDcsIGNoKSkKKyAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOworICBpZiAoc3RkOjppc2RpZ2l0KGNoKSkKKyAgICBtX0ZpbGVWZXJzaW9uICs9IEZYU1lTX3RvRGVjaW1hbERpZ2l0KGNoKTsKKworICBpZiAobV9TeW50YXgubV9GaWxlTGVuIDwgbV9TeW50YXgubV9IZWFkZXJPZmZzZXQgKyA5KQorICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7CisKKyAgbV9TeW50YXguUmVzdG9yZVBvcyhtX1N5bnRheC5tX0ZpbGVMZW4gLSBtX1N5bnRheC5tX0hlYWRlck9mZnNldCAtIDkpOworICBpZiAoIWJSZVBhcnNlKQorICAgIG1fcERvY3VtZW50ID0gbmV3IENQREZfRG9jdW1lbnQodGhpcyk7CisKKyAgRlhfQk9PTCBiWFJlZlJlYnVpbHQgPSBGQUxTRTsKKyAgaWYgKG1fU3ludGF4LlNlYXJjaFdvcmQoInN0YXJ0eHJlZiIsIFRSVUUsIEZBTFNFLCA0MDk2KSkgeworICAgIEZYX0ZJTEVTSVpFIHN0YXJ0eHJlZl9vZmZzZXQgPSBtX1N5bnRheC5TYXZlUG9zKCk7CisgICAgdm9pZCogcFJlc3VsdCA9IEZYU1lTX2JzZWFyY2goJnN0YXJ0eHJlZl9vZmZzZXQsIG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFyZUZpbGVTaXplKTsKKyAgICBpZiAoIXBSZXN1bHQpCisgICAgICBtX1NvcnRlZE9mZnNldC5BZGQoc3RhcnR4cmVmX29mZnNldCk7CisKKyAgICBtX1N5bnRheC5HZXRLZXl3b3JkKCk7CisgICAgYm9vbCBiTnVtYmVyOworICAgIENGWF9CeXRlU3RyaW5nIHhyZWZwb3Nfc3RyID0gbV9TeW50YXguR2V0TmV4dFdvcmQoJmJOdW1iZXIpOworICAgIGlmICghYk51bWJlcikKKyAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7CisKKyAgICBtX0xhc3RYUmVmT2Zmc2V0ID0gKEZYX0ZJTEVTSVpFKUZYU1lTX2F0b2k2NCh4cmVmcG9zX3N0cik7CisgICAgaWYgKCFMb2FkQWxsQ3Jvc3NSZWZWNChtX0xhc3RYUmVmT2Zmc2V0KSAmJgorICAgICAgICAhTG9hZEFsbENyb3NzUmVmVjUobV9MYXN0WFJlZk9mZnNldCkpIHsKKyAgICAgIGlmICghUmVidWlsZENyb3NzUmVmKCkpCiAgICAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7CisKKyAgICAgIGJYUmVmUmVidWlsdCA9IFRSVUU7CisgICAgICBtX0xhc3RYUmVmT2Zmc2V0ID0gMDsKICAgICB9Ci0gICAgbV9TeW50YXguSW5pdFBhcnNlcihwRmlsZUFjY2Vzcywgb2Zmc2V0KTsKLSAgICBGWF9CWVRFIGNoOwotICAgIGlmICghbV9TeW50YXguR2V0Q2hhckF0KDUsIGNoKSkgewotICAgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOwotICAgIH0KLSAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgewotICAgICAgICBtX0ZpbGVWZXJzaW9uID0gKGNoIC0gJzAnKSAqIDEwOwotICAgIH0KLSAgICBpZiAoIW1fU3ludGF4LkdldENoYXJBdCg3LCBjaCkpIHsKLSAgICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKLSAgICB9Ci0gICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKLSAgICAgICAgbV9GaWxlVmVyc2lvbiArPSBjaCAtICcwJzsKLSAgICB9Ci0gICAgaWYgKG1fU3ludGF4Lm1fRmlsZUxlbiA8ICBtX1N5bnRheC5tX0hlYWRlck9mZnNldCArIDkpIHsKLSAgICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKLSAgICB9Ci0gICAgbV9TeW50YXguUmVzdG9yZVBvcyhtX1N5bnRheC5tX0ZpbGVMZW4gLSBtX1N5bnRheC5tX0hlYWRlck9mZnNldCAtIDkpOwotICAgIGlmICghYlJlUGFyc2UpIHsKLSAgICAgICAgbV9wRG9jdW1lbnQgPSBuZXcgQ1BERl9Eb2N1bWVudCh0aGlzKTsKLSAgICB9Ci0gICAgRlhfQk9PTCBiWFJlZlJlYnVpbHQgPSBGQUxTRTsKLSAgICBpZiAobV9TeW50YXguU2VhcmNoV29yZChGWF9CU1RSQygic3RhcnR4cmVmIiksIFRSVUUsIEZBTFNFLCA0MDk2KSkgewotICAgICAgICBGWF9GSUxFU0laRSBzdGFydHhyZWZfb2Zmc2V0ID0gbV9TeW50YXguU2F2ZVBvcygpOwotICAgICAgICBGWF9MUFZPSUQgcFJlc3VsdCA9IEZYU1lTX2JzZWFyY2goJnN0YXJ0eHJlZl9vZmZzZXQsIG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwgbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLCBzaXplb2YoRlhfRklMRVNJWkUpLCBfQ29tcGFyZUZpbGVTaXplKTsKLSAgICAgICAgaWYgKHBSZXN1bHQgPT0gTlVMTCkgewotICAgICAgICAgICAgbV9Tb3J0ZWRPZmZzZXQuQWRkKHN0YXJ0eHJlZl9vZmZzZXQpOwotICAgICAgICB9Ci0gICAgICAgIG1fU3ludGF4LkdldEtleXdvcmQoKTsKLSAgICAgICAgRlhfQk9PTCBiTnVtYmVyOwotICAgICAgICBDRlhfQnl0ZVN0cmluZyB4cmVmcG9zX3N0ciA9IG1fU3ludGF4LkdldE5leHRXb3JkKGJOdW1iZXIpOwotICAgICAgICBpZiAoIWJOdW1iZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7Ci0gICAgICAgIH0KLSAgICAgICAgbV9MYXN0WFJlZk9mZnNldCA9IChGWF9GSUxFU0laRSlGWFNZU19hdG9pNjQoeHJlZnBvc19zdHIpOwotICAgICAgICBpZiAoIUxvYWRBbGxDcm9zc1JlZlY0KG1fTGFzdFhSZWZPZmZzZXQpICYmICFMb2FkQWxsQ3Jvc3NSZWZWNShtX0xhc3RYUmVmT2Zmc2V0KSkgewotICAgICAgICAgICAgaWYgKCFSZWJ1aWxkQ3Jvc3NSZWYoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiWFJlZlJlYnVpbHQgPSBUUlVFOwotICAgICAgICAgICAgbV9MYXN0WFJlZk9mZnNldCA9IDA7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoIVJlYnVpbGRDcm9zc1JlZigpKSB7Ci0gICAgICAgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOwotICAgICAgICB9Ci0gICAgICAgIGJYUmVmUmVidWlsdCA9IFRSVUU7Ci0gICAgfQotICAgIEZYX0RXT1JEIGR3UmV0ID0gU2V0RW5jcnlwdEhhbmRsZXIoKTsKLSAgICBpZiAoZHdSZXQgIT0gUERGUEFSU0VfRVJST1JfU1VDQ0VTUykgewotICAgICAgICByZXR1cm4gZHdSZXQ7Ci0gICAgfQotICAgIG1fcERvY3VtZW50LT5Mb2FkRG9jKCk7Ci0gICAgaWYgKG1fcERvY3VtZW50LT5HZXRSb290KCkgPT0gTlVMTCB8fCBtX3BEb2N1bWVudC0+R2V0UGFnZUNvdW50KCkgPT0gMCkgewotICAgICAgICBpZiAoYlhSZWZSZWJ1aWx0KSB7Ci0gICAgICAgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOwotICAgICAgICB9Ci0gICAgICAgIFJlbGVhc2VFbmNyeXB0SGFuZGxlcigpOwotICAgICAgICBpZiAoIVJlYnVpbGRDcm9zc1JlZigpKSB7Ci0gICAgICAgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOwotICAgICAgICB9Ci0gICAgICAgIGR3UmV0ID0gU2V0RW5jcnlwdEhhbmRsZXIoKTsKLSAgICAgICAgaWYgKGR3UmV0ICE9IFBERlBBUlNFX0VSUk9SX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHJldHVybiBkd1JldDsKLSAgICAgICAgfQotICAgICAgICBtX3BEb2N1bWVudC0+TG9hZERvYygpOwotICAgICAgICBpZiAobV9wRG9jdW1lbnQtPkdldFJvb3QoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOwotICAgICAgICB9Ci0gICAgfQotICAgIEZYU1lTX3Fzb3J0KG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwgbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLCBzaXplb2YoRlhfRklMRVNJWkUpLCBfQ29tcGFyZUZpbGVTaXplKTsKLSAgICBGWF9EV09SRCBSb290T2JqTnVtID0gR2V0Um9vdE9iak51bSgpOwotICAgIGlmIChSb290T2JqTnVtID09IDApIHsKLSAgICAgICAgUmVsZWFzZUVuY3J5cHRIYW5kbGVyKCk7Ci0gICAgICAgIFJlYnVpbGRDcm9zc1JlZigpOwotICAgICAgICBSb290T2JqTnVtID0gR2V0Um9vdE9iak51bSgpOwotICAgICAgICBpZiAoUm9vdE9iak51bSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOwotICAgICAgICB9Ci0gICAgICAgIGR3UmV0ID0gU2V0RW5jcnlwdEhhbmRsZXIoKTsKLSAgICAgICAgaWYgKGR3UmV0ICE9IFBERlBBUlNFX0VSUk9SX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHJldHVybiBkd1JldDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9wU2VjdXJpdHlIYW5kbGVyICYmICFtX3BTZWN1cml0eUhhbmRsZXItPklzTWV0YWRhdGFFbmNyeXB0ZWQoKSkgewotICAgICAgICBDUERGX1JlZmVyZW5jZSogcE1ldGFkYXRhID0gKENQREZfUmVmZXJlbmNlKiltX3BEb2N1bWVudC0+R2V0Um9vdCgpLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJNZXRhZGF0YSIpKTsKLSAgICAgICAgaWYgKHBNZXRhZGF0YSAmJiBwTWV0YWRhdGEtPkdldFR5cGUoKSA9PSBQREZPQkpfUkVGRVJFTkNFKSB7Ci0gICAgICAgICAgICBtX1N5bnRheC5tX01ldGFkYXRhT2JqbnVtID0gcE1ldGFkYXRhLT5HZXRSZWZPYmpOdW0oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfU1VDQ0VTUzsKLX0KLUZYX0RXT1JEIENQREZfUGFyc2VyOjpTZXRFbmNyeXB0SGFuZGxlcigpCi17CisgIH0gZWxzZSB7CisgICAgaWYgKCFSZWJ1aWxkQ3Jvc3NSZWYoKSkKKyAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7CisKKyAgICBiWFJlZlJlYnVpbHQgPSBUUlVFOworICB9CisgIEZYX0RXT1JEIGR3UmV0ID0gU2V0RW5jcnlwdEhhbmRsZXIoKTsKKyAgaWYgKGR3UmV0ICE9IFBERlBBUlNFX0VSUk9SX1NVQ0NFU1MpCisgICAgcmV0dXJuIGR3UmV0OworCisgIG1fcERvY3VtZW50LT5Mb2FkRG9jKCk7CisgIGlmICghbV9wRG9jdW1lbnQtPkdldFJvb3QoKSB8fCBtX3BEb2N1bWVudC0+R2V0UGFnZUNvdW50KCkgPT0gMCkgeworICAgIGlmIChiWFJlZlJlYnVpbHQpCisgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOworCiAgICAgUmVsZWFzZUVuY3J5cHRIYW5kbGVyKCk7Ci0gICAgU2V0RW5jcnlwdERpY3Rpb25hcnkoTlVMTCk7Ci0gICAgaWYgKG1fcFRyYWlsZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcEVuY3J5cHRPYmogPSBtX3BUcmFpbGVyLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJFbmNyeXB0IikpOwotICAgIGlmIChwRW5jcnlwdE9iaikgewotICAgICAgICBpZiAocEVuY3J5cHRPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICAgICAgU2V0RW5jcnlwdERpY3Rpb25hcnkoKENQREZfRGljdGlvbmFyeSopcEVuY3J5cHRPYmopOwotICAgICAgICB9IGVsc2UgaWYgKHBFbmNyeXB0T2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1JFRkVSRU5DRSkgewotICAgICAgICAgICAgcEVuY3J5cHRPYmogPSBtX3BEb2N1bWVudC0+R2V0SW5kaXJlY3RPYmplY3QoKChDUERGX1JlZmVyZW5jZSopcEVuY3J5cHRPYmopLT5HZXRSZWZPYmpOdW0oKSk7Ci0gICAgICAgICAgICBpZiAocEVuY3J5cHRPYmopIHsKLSAgICAgICAgICAgICAgICBTZXRFbmNyeXB0RGljdGlvbmFyeShwRW5jcnlwdE9iai0+R2V0RGljdCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9iRm9yY2VVc2VTZWN1cml0eUhhbmRsZXIpIHsKLSAgICAgICAgRlhfRFdPUkQgZXJyID0gUERGUEFSU0VfRVJST1JfSEFORExFUjsKLSAgICAgICAgaWYgKG1fcFNlY3VyaXR5SGFuZGxlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfSEFORExFUjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1fcFNlY3VyaXR5SGFuZGxlci0+T25Jbml0KHRoaXMsIG1fcEVuY3J5cHREaWN0KSkgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgICAgICBDUERGX0NyeXB0b0hhbmRsZXIqIHBDcnlwdG9IYW5kbGVyID0gbV9wU2VjdXJpdHlIYW5kbGVyLT5DcmVhdGVDcnlwdG9IYW5kbGVyKCk7Ci0gICAgICAgIGlmICghcENyeXB0b0hhbmRsZXItPkluaXQobV9wRW5jcnlwdERpY3QsIG1fcFNlY3VyaXR5SGFuZGxlcikpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwQ3J5cHRvSGFuZGxlcjsKLSAgICAgICAgICAgIHBDcnlwdG9IYW5kbGVyID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9IQU5ETEVSOwotICAgICAgICB9Ci0gICAgICAgIG1fU3ludGF4LlNldEVuY3J5cHQocENyeXB0b0hhbmRsZXIpOwotICAgIH0gZWxzZSBpZiAobV9wRW5jcnlwdERpY3QpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZmlsdGVyID0gbV9wRW5jcnlwdERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiRmlsdGVyIikpOwotICAgICAgICBDUERGX1NlY3VyaXR5SGFuZGxlciogcFNlY3VyaXR5SGFuZGxlciA9IE5VTEw7Ci0gICAgICAgIEZYX0RXT1JEIGVyciA9IFBERlBBUlNFX0VSUk9SX0hBTkRMRVI7Ci0gICAgICAgIGlmIChmaWx0ZXIgPT0gRlhfQlNUUkMoIlN0YW5kYXJkIikpIHsKLSAgICAgICAgICAgIHBTZWN1cml0eUhhbmRsZXIgPSBGUERGX0NyZWF0ZVN0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKCk7Ci0gICAgICAgICAgICBlcnIgPSBQREZQQVJTRV9FUlJPUl9QQVNTV09SRDsKLSAgICAgICAgfQotICAgICAgICBpZiAocFNlY3VyaXR5SGFuZGxlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfSEFORExFUjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXBTZWN1cml0eUhhbmRsZXItPk9uSW5pdCh0aGlzLCBtX3BFbmNyeXB0RGljdCkpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwU2VjdXJpdHlIYW5kbGVyOwotICAgICAgICAgICAgcFNlY3VyaXR5SGFuZGxlciA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIG1fcFNlY3VyaXR5SGFuZGxlciA9IHBTZWN1cml0eUhhbmRsZXI7Ci0gICAgICAgIENQREZfQ3J5cHRvSGFuZGxlciogcENyeXB0b0hhbmRsZXIgPSBwU2VjdXJpdHlIYW5kbGVyLT5DcmVhdGVDcnlwdG9IYW5kbGVyKCk7Ci0gICAgICAgIGlmICghcENyeXB0b0hhbmRsZXItPkluaXQobV9wRW5jcnlwdERpY3QsIG1fcFNlY3VyaXR5SGFuZGxlcikpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwQ3J5cHRvSGFuZGxlcjsKLSAgICAgICAgICAgIHBDcnlwdG9IYW5kbGVyID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9IQU5ETEVSOwotICAgICAgICB9Ci0gICAgICAgIG1fU3ludGF4LlNldEVuY3J5cHQocENyeXB0b0hhbmRsZXIpOwotICAgIH0KLSAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfU1VDQ0VTUzsKKyAgICBpZiAoIVJlYnVpbGRDcm9zc1JlZigpKQorICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKKworICAgIGR3UmV0ID0gU2V0RW5jcnlwdEhhbmRsZXIoKTsKKyAgICBpZiAoZHdSZXQgIT0gUERGUEFSU0VfRVJST1JfU1VDQ0VTUykKKyAgICAgIHJldHVybiBkd1JldDsKKworICAgIG1fcERvY3VtZW50LT5Mb2FkRG9jKCk7CisgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0Um9vdCgpKQorICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKKyAgfQorICBGWFNZU19xc29ydChtX1NvcnRlZE9mZnNldC5HZXREYXRhKCksIG1fU29ydGVkT2Zmc2V0LkdldFNpemUoKSwKKyAgICAgICAgICAgICAgc2l6ZW9mKEZYX0ZJTEVTSVpFKSwgQ29tcGFyZUZpbGVTaXplKTsKKyAgaWYgKEdldFJvb3RPYmpOdW0oKSA9PSAwKSB7CisgICAgUmVsZWFzZUVuY3J5cHRIYW5kbGVyKCk7CisgICAgaWYgKCFSZWJ1aWxkQ3Jvc3NSZWYoKSB8fCBHZXRSb290T2JqTnVtKCkgPT0gMCkKKyAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7CisKKyAgICBkd1JldCA9IFNldEVuY3J5cHRIYW5kbGVyKCk7CisgICAgaWYgKGR3UmV0ICE9IFBERlBBUlNFX0VSUk9SX1NVQ0NFU1MpCisgICAgICByZXR1cm4gZHdSZXQ7CisgIH0KKyAgaWYgKG1fcFNlY3VyaXR5SGFuZGxlciAmJiAhbV9wU2VjdXJpdHlIYW5kbGVyLT5Jc01ldGFkYXRhRW5jcnlwdGVkKCkpIHsKKyAgICBDUERGX1JlZmVyZW5jZSogcE1ldGFkYXRhID0KKyAgICAgICAgVG9SZWZlcmVuY2UobV9wRG9jdW1lbnQtPkdldFJvb3QoKS0+R2V0RWxlbWVudCgiTWV0YWRhdGEiKSk7CisgICAgaWYgKHBNZXRhZGF0YSkKKyAgICAgIG1fU3ludGF4Lm1fTWV0YWRhdGFPYmpudW0gPSBwTWV0YWRhdGEtPkdldFJlZk9iak51bSgpOworICB9CisgIHJldHVybiBQREZQQVJTRV9FUlJPUl9TVUNDRVNTOwogfQotdm9pZCBDUERGX1BhcnNlcjo6UmVsZWFzZUVuY3J5cHRIYW5kbGVyKCkKLXsKLSAgICBpZiAobV9TeW50YXgubV9wQ3J5cHRvSGFuZGxlcikgewotICAgICAgICBkZWxldGUgbV9TeW50YXgubV9wQ3J5cHRvSGFuZGxlcjsKLSAgICAgICAgbV9TeW50YXgubV9wQ3J5cHRvSGFuZGxlciA9IE5VTEw7CitGWF9EV09SRCBDUERGX1BhcnNlcjo6U2V0RW5jcnlwdEhhbmRsZXIoKSB7CisgIFJlbGVhc2VFbmNyeXB0SGFuZGxlcigpOworICBTZXRFbmNyeXB0RGljdGlvbmFyeShOVUxMKTsKKyAgaWYgKCFtX3BUcmFpbGVyKSB7CisgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKKyAgfQorICBDUERGX09iamVjdCogcEVuY3J5cHRPYmogPSBtX3BUcmFpbGVyLT5HZXRFbGVtZW50KCJFbmNyeXB0Iik7CisgIGlmIChwRW5jcnlwdE9iaikgeworICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCA9IHBFbmNyeXB0T2JqLT5Bc0RpY3Rpb25hcnkoKSkgeworICAgICAgU2V0RW5jcnlwdERpY3Rpb25hcnkocEVuY3J5cHREaWN0KTsKKyAgICB9IGVsc2UgaWYgKENQREZfUmVmZXJlbmNlKiBwUmVmID0gcEVuY3J5cHRPYmotPkFzUmVmZXJlbmNlKCkpIHsKKyAgICAgIHBFbmNyeXB0T2JqID0KKyAgICAgICAgICBtX3BEb2N1bWVudC0+R2V0SW5kaXJlY3RPYmplY3QocFJlZi0+R2V0UmVmT2JqTnVtKCksIG51bGxwdHIpOworICAgICAgaWYgKHBFbmNyeXB0T2JqKQorICAgICAgICBTZXRFbmNyeXB0RGljdGlvbmFyeShwRW5jcnlwdE9iai0+R2V0RGljdCgpKTsKICAgICB9Ci0gICAgaWYgKG1fcFNlY3VyaXR5SGFuZGxlciAmJiAhbV9iRm9yY2VVc2VTZWN1cml0eUhhbmRsZXIpIHsKLSAgICAgICAgZGVsZXRlIG1fcFNlY3VyaXR5SGFuZGxlcjsKLSAgICAgICAgbV9wU2VjdXJpdHlIYW5kbGVyID0gTlVMTDsKKyAgfQorICBpZiAobV9iRm9yY2VVc2VTZWN1cml0eUhhbmRsZXIpIHsKKyAgICBGWF9EV09SRCBlcnIgPSBQREZQQVJTRV9FUlJPUl9IQU5ETEVSOworICAgIGlmICghbV9wU2VjdXJpdHlIYW5kbGVyKSB7CisgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfSEFORExFUjsKICAgICB9CisgICAgaWYgKCFtX3BTZWN1cml0eUhhbmRsZXItPk9uSW5pdCh0aGlzLCBtX3BFbmNyeXB0RGljdCkpIHsKKyAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0NyeXB0b0hhbmRsZXI+IHBDcnlwdG9IYW5kbGVyKAorICAgICAgICBtX3BTZWN1cml0eUhhbmRsZXItPkNyZWF0ZUNyeXB0b0hhbmRsZXIoKSk7CisgICAgaWYgKCFwQ3J5cHRvSGFuZGxlci0+SW5pdChtX3BFbmNyeXB0RGljdCwgbV9wU2VjdXJpdHlIYW5kbGVyLmdldCgpKSkgeworICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0hBTkRMRVI7CisgICAgfQorICAgIG1fU3ludGF4LlNldEVuY3J5cHQocENyeXB0b0hhbmRsZXIucmVsZWFzZSgpKTsKKyAgfSBlbHNlIGlmIChtX3BFbmNyeXB0RGljdCkgeworICAgIENGWF9CeXRlU3RyaW5nIGZpbHRlciA9IG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoIkZpbHRlciIpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX1NlY3VyaXR5SGFuZGxlcj4gcFNlY3VyaXR5SGFuZGxlcjsKKyAgICBGWF9EV09SRCBlcnIgPSBQREZQQVJTRV9FUlJPUl9IQU5ETEVSOworICAgIGlmIChmaWx0ZXIgPT0gIlN0YW5kYXJkIikgeworICAgICAgcFNlY3VyaXR5SGFuZGxlci5yZXNldChGUERGX0NyZWF0ZVN0YW5kYXJkU2VjdXJpdHlIYW5kbGVyKCkpOworICAgICAgZXJyID0gUERGUEFSU0VfRVJST1JfUEFTU1dPUkQ7CisgICAgfQorICAgIGlmICghcFNlY3VyaXR5SGFuZGxlcikgeworICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0hBTkRMRVI7CisgICAgfQorICAgIGlmICghcFNlY3VyaXR5SGFuZGxlci0+T25Jbml0KHRoaXMsIG1fcEVuY3J5cHREaWN0KSkgeworICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgbV9wU2VjdXJpdHlIYW5kbGVyID0gc3RkOjptb3ZlKHBTZWN1cml0eUhhbmRsZXIpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0NyeXB0b0hhbmRsZXI+IHBDcnlwdG9IYW5kbGVyKAorICAgICAgICBtX3BTZWN1cml0eUhhbmRsZXItPkNyZWF0ZUNyeXB0b0hhbmRsZXIoKSk7CisgICAgaWYgKCFwQ3J5cHRvSGFuZGxlci0+SW5pdChtX3BFbmNyeXB0RGljdCwgbV9wU2VjdXJpdHlIYW5kbGVyLmdldCgpKSkgeworICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0hBTkRMRVI7CisgICAgfQorICAgIG1fU3ludGF4LlNldEVuY3J5cHQocENyeXB0b0hhbmRsZXIucmVsZWFzZSgpKTsKKyAgfQorICByZXR1cm4gUERGUEFSU0VfRVJST1JfU1VDQ0VTUzsKIH0KLUZYX0ZJTEVTSVpFIENQREZfUGFyc2VyOjpHZXRPYmplY3RPZmZzZXQoRlhfRFdPUkQgb2JqbnVtKQotewotICAgIGlmIChvYmpudW0gPj0gKEZYX0RXT1JEKW1fQ3Jvc3NSZWYuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAobV9WNVR5cGVbb2JqbnVtXSA9PSAxKSB7Ci0gICAgICAgIHJldHVybiBtX0Nyb3NzUmVmW29iam51bV07Ci0gICAgfQotICAgIGlmIChtX1Y1VHlwZVtvYmpudW1dID09IDIpIHsKLSAgICAgICAgcmV0dXJuIG1fQ3Jvc3NSZWZbKEZYX0lOVDMyKW1fQ3Jvc3NSZWZbb2JqbnVtXV07Ci0gICAgfQordm9pZCBDUERGX1BhcnNlcjo6UmVsZWFzZUVuY3J5cHRIYW5kbGVyKCkgeworICBtX1N5bnRheC5tX3BDcnlwdG9IYW5kbGVyLnJlc2V0KCk7CisgIGlmICghbV9iRm9yY2VVc2VTZWN1cml0eUhhbmRsZXIpIHsKKyAgICBtX3BTZWN1cml0eUhhbmRsZXIucmVzZXQoKTsKKyAgfQorfQorCitGWF9GSUxFU0laRSBDUERGX1BhcnNlcjo6R2V0T2JqZWN0T2Zmc2V0KEZYX0RXT1JEIG9iam51bSkgY29uc3QgeworICBpZiAoIUlzVmFsaWRPYmplY3ROdW1iZXIob2JqbnVtKSkKICAgICByZXR1cm4gMDsKKworICBpZiAobV9WNVR5cGVbb2JqbnVtXSA9PSAxKQorICAgIHJldHVybiBHZXRPYmplY3RQb3NpdGlvbk9yWmVybyhvYmpudW0pOworCisgIGlmIChtX1Y1VHlwZVtvYmpudW1dID09IDIpIHsKKyAgICBGWF9GSUxFU0laRSBwb3MgPSBHZXRPYmplY3RQb3NpdGlvbk9yWmVybyhvYmpudW0pOworICAgIHJldHVybiBHZXRPYmplY3RQb3NpdGlvbk9yWmVybyhwb3MpOworICB9CisgIHJldHVybiAwOwogfQotc3RhdGljIEZYX0lOVDMyIEdldERpcmVjdEludGVnZXIoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgRlhfQlNUUiBrZXkpCi17Ci0gICAgQ1BERl9PYmplY3QqIHBPYmogPSBwRGljdC0+R2V0RWxlbWVudChrZXkpOwotICAgIGlmIChwT2JqID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX05VTUJFUikgewotICAgICAgICByZXR1cm4gKChDUERGX051bWJlciopcE9iaiktPkdldEludGVnZXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci1zdGF0aWMgRlhfQk9PTCBDaGVja0RpcmVjdFR5cGUoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgRlhfQlNUUiBrZXksIEZYX0lOVDMyIGlUeXBlKQotewotICAgIENQREZfT2JqZWN0KiBwT2JqID0gcERpY3QtPkdldEVsZW1lbnQoa2V5KTsKLSAgICBpZiAoIXBPYmopIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHJldHVybiBwT2JqLT5HZXRUeXBlKCkgPT0gaVR5cGU7Ci19Ci1GWF9CT09MIENQREZfUGFyc2VyOjpMb2FkQWxsQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSB4cmVmcG9zKQotewotICAgIGlmICghTG9hZENyb3NzUmVmVjQoeHJlZnBvcywgMCwgVFJVRSwgRkFMU0UpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9wVHJhaWxlciA9IExvYWRUcmFpbGVyVjQoKTsKLSAgICBpZiAobV9wVHJhaWxlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfSU5UMzIgeHJlZnNpemUgPSBHZXREaXJlY3RJbnRlZ2VyKG1fcFRyYWlsZXIsIEZYX0JTVFJDKCJTaXplIikpOwotICAgIGlmICh4cmVmc2l6ZSA8PSAwIHx8IHhyZWZzaXplID4gKDEgPDwgMjApKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9Dcm9zc1JlZi5TZXRTaXplKHhyZWZzaXplKTsKLSAgICBtX1Y1VHlwZS5TZXRTaXplKHhyZWZzaXplKTsKLSAgICBDRlhfRmlsZVNpemVBcnJheSBDcm9zc1JlZkxpc3QsIFhSZWZTdHJlYW1MaXN0OwotICAgIENyb3NzUmVmTGlzdC5BZGQoeHJlZnBvcyk7Ci0gICAgWFJlZlN0cmVhbUxpc3QuQWRkKEdldERpcmVjdEludGVnZXIobV9wVHJhaWxlciwgRlhfQlNUUkMoIlhSZWZTdG0iKSkpOwotICAgIGlmICghQ2hlY2tEaXJlY3RUeXBlKG1fcFRyYWlsZXIsIEZYX0JTVFJDKCJQcmV2IiksIFBERk9CSl9OVU1CRVIpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfRklMRVNJWkUgbmV3eHJlZnBvcyA9IEdldERpcmVjdEludGVnZXIobV9wVHJhaWxlciwgRlhfQlNUUkMoIlByZXYiKSk7Ci0gICAgaWYgKG5ld3hyZWZwb3MgPT0geHJlZnBvcykgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHhyZWZwb3MgPSBuZXd4cmVmcG9zOwotICAgIHdoaWxlICh4cmVmcG9zKSB7Ci0gICAgICAgIENyb3NzUmVmTGlzdC5JbnNlcnRBdCgwLCB4cmVmcG9zKTsKLSAgICAgICAgTG9hZENyb3NzUmVmVjQoeHJlZnBvcywgMCwgVFJVRSwgRkFMU0UpOwotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gTG9hZFRyYWlsZXJWNCgpOwotICAgICAgICBpZiAocERpY3QgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmICghQ2hlY2tEaXJlY3RUeXBlKHBEaWN0LCBGWF9CU1RSQygiUHJldiIpLCBQREZPQkpfTlVNQkVSKSkgewotICAgICAgICAgICAgcERpY3QtPlJlbGVhc2UoKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBuZXd4cmVmcG9zID0gR2V0RGlyZWN0SW50ZWdlcihwRGljdCwgRlhfQlNUUkMoIlByZXYiKSk7Ci0gICAgICAgIGlmIChuZXd4cmVmcG9zID09IHhyZWZwb3MpIHsKLSAgICAgICAgICAgIHBEaWN0LT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgeHJlZnBvcyA9IG5ld3hyZWZwb3M7Ci0gICAgICAgIFhSZWZTdHJlYW1MaXN0Lkluc2VydEF0KDAsIHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJYUmVmU3RtIikpKTsKLSAgICAgICAgbV9UcmFpbGVycy5BZGQocERpY3QpOwotICAgIH0KLSAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgQ3Jvc3NSZWZMaXN0LkdldFNpemUoKTsgaSArKykKLSAgICAgICAgaWYgKCFMb2FkQ3Jvc3NSZWZWNChDcm9zc1JlZkxpc3RbaV0sIFhSZWZTdHJlYW1MaXN0W2ldLCBGQUxTRSwgaSA9PSAwKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENQREZfUGFyc2VyOjpMb2FkTGluZWFyaXplZEFsbENyb3NzUmVmVjQoRlhfRklMRVNJWkUgeHJlZnBvcywgRlhfRFdPUkQgZHdPYmpDb3VudCkKLXsKLSAgICBpZiAoIUxvYWRMaW5lYXJpemVkQ3Jvc3NSZWZWNCh4cmVmcG9zLCBkd09iakNvdW50KSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fcFRyYWlsZXIgPSBMb2FkVHJhaWxlclY0KCk7Ci0gICAgaWYgKG1fcFRyYWlsZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX0lOVDMyIHhyZWZzaXplID0gR2V0RGlyZWN0SW50ZWdlcihtX3BUcmFpbGVyLCBGWF9CU1RSQygiU2l6ZSIpKTsKLSAgICBpZiAoeHJlZnNpemUgPT0gMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENGWF9GaWxlU2l6ZUFycmF5IENyb3NzUmVmTGlzdCwgWFJlZlN0cmVhbUxpc3Q7Ci0gICAgQ3Jvc3NSZWZMaXN0LkFkZCh4cmVmcG9zKTsKLSAgICBYUmVmU3RyZWFtTGlzdC5BZGQoR2V0RGlyZWN0SW50ZWdlcihtX3BUcmFpbGVyLCBGWF9CU1RSQygiWFJlZlN0bSIpKSk7Ci0gICAgeHJlZnBvcyA9IEdldERpcmVjdEludGVnZXIobV9wVHJhaWxlciwgRlhfQlNUUkMoIlByZXYiKSk7Ci0gICAgd2hpbGUgKHhyZWZwb3MpIHsKLSAgICAgICAgQ3Jvc3NSZWZMaXN0Lkluc2VydEF0KDAsIHhyZWZwb3MpOwotICAgICAgICBMb2FkQ3Jvc3NSZWZWNCh4cmVmcG9zLCAwLCBUUlVFLCBGQUxTRSk7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBMb2FkVHJhaWxlclY0KCk7Ci0gICAgICAgIGlmIChwRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgeHJlZnBvcyA9IEdldERpcmVjdEludGVnZXIocERpY3QsIEZYX0JTVFJDKCJQcmV2IikpOwotICAgICAgICBYUmVmU3RyZWFtTGlzdC5JbnNlcnRBdCgwLCBwRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiWFJlZlN0bSIpKSk7Ci0gICAgICAgIG1fVHJhaWxlcnMuQWRkKHBEaWN0KTsKLSAgICB9Ci0gICAgZm9yIChGWF9JTlQzMiBpID0gMTsgaSA8IENyb3NzUmVmTGlzdC5HZXRTaXplKCk7IGkgKyspCi0gICAgICAgIGlmICghTG9hZENyb3NzUmVmVjQoQ3Jvc3NSZWZMaXN0W2ldLCBYUmVmU3RyZWFtTGlzdFtpXSwgRkFMU0UsIGkgPT0gMCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX1BhcnNlcjo6TG9hZExpbmVhcml6ZWRDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHBvcywgRlhfRFdPUkQgZHdPYmpDb3VudCkKLXsKLSAgICBGWF9GSUxFU0laRSBkd1N0YXJ0UG9zID0gcG9zIC0gbV9TeW50YXgubV9IZWFkZXJPZmZzZXQ7Ci0gICAgbV9TeW50YXguUmVzdG9yZVBvcyhkd1N0YXJ0UG9zKTsKLSAgICBGWF9MUFZPSUQgcFJlc3VsdCA9IEZYU1lTX2JzZWFyY2goJnBvcywgbV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLCBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksIF9Db21wYXJlRmlsZVNpemUpOwotICAgIGlmIChwUmVzdWx0ID09IE5VTEwpIHsKLSAgICAgICAgbV9Tb3J0ZWRPZmZzZXQuQWRkKHBvcyk7Ci0gICAgfQotICAgIEZYX0RXT1JEIHN0YXJ0X29iam51bSA9IDA7Ci0gICAgRlhfRFdPUkQgY291bnQgPSBkd09iakNvdW50OwotICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9TeW50YXguU2F2ZVBvcygpOwotICAgIEZYX0lOVDMyIHJlY29yZHNpemUgPSAyMDsKLSAgICBjaGFyKiBwQnVmID0gRlhfQWxsb2MoY2hhciwgMTAyNCAqIHJlY29yZHNpemUgKyAxKTsKLSAgICBwQnVmWzEwMjQgKiByZWNvcmRzaXplXSA9ICdcMCc7Ci0gICAgRlhfSU5UMzIgbkJsb2NrcyA9IGNvdW50IC8gMTAyNCArIDE7Ci0gICAgZm9yIChGWF9JTlQzMiBibG9jayA9IDA7IGJsb2NrIDwgbkJsb2NrczsgYmxvY2sgKyspIHsKLSAgICAgICAgRlhfSU5UMzIgYmxvY2tfc2l6ZSA9IGJsb2NrID09IG5CbG9ja3MgLSAxID8gY291bnQgJSAxMDI0IDogMTAyNDsKLSAgICAgICAgRlhfRFdPUkQgZHdSZWFkU2l6ZSA9IGJsb2NrX3NpemUgKiByZWNvcmRzaXplOwotICAgICAgICBpZiAoKEZYX0ZJTEVTSVpFKShkd1N0YXJ0UG9zICsgZHdSZWFkU2l6ZSkgPiBtX1N5bnRheC5tX0ZpbGVMZW4pIHsKLSAgICAgICAgICAgIEZYX0ZyZWUocEJ1Zik7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtX1N5bnRheC5SZWFkQmxvY2soKEZYX0xQQllURSlwQnVmLCBkd1JlYWRTaXplKSkgewotICAgICAgICAgICAgRlhfRnJlZShwQnVmKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgYmxvY2tfc2l6ZTsgaSArKykgewotICAgICAgICAgICAgRlhfRFdPUkQgb2JqbnVtID0gc3RhcnRfb2JqbnVtICsgYmxvY2sgKiAxMDI0ICsgaTsKLSAgICAgICAgICAgIGNoYXIqIHBFbnRyeSA9IHBCdWYgKyBpICogcmVjb3Jkc2l6ZTsKLSAgICAgICAgICAgIGlmIChwRW50cnlbMTddID09ICdmJykgewotICAgICAgICAgICAgICAgIG1fQ3Jvc3NSZWYuU2V0QXRHcm93KG9iam51bSwgMCk7Ci0gICAgICAgICAgICAgICAgbV9WNVR5cGUuU2V0QXRHcm93KG9iam51bSwgMCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEZYX0lOVDMyIG9mZnNldCA9IEZYU1lTX2F0b2kocEVudHJ5KTsKLSAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBjID0gMDsgYyA8IDEwOyBjICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocEVudHJ5W2NdIDwgJzAnIHx8IHBFbnRyeVtjXSA+ICc5JykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUocEJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fQ3Jvc3NSZWYuU2V0QXRHcm93KG9iam51bSwgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBGWF9JTlQzMiB2ZXJzaW9uID0gRlhTWVNfYXRvaShwRW50cnkgKyAxMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gPj0gMSkgewotICAgICAgICAgICAgICAgICAgICBtX2JWZXJzaW9uVXBkYXRlZCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fT2JqVmVyc2lvbi5TZXRBdEdyb3cob2JqbnVtLCB2ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICBpZiAobV9Dcm9zc1JlZltvYmpudW1dIDwgbV9TeW50YXgubV9GaWxlTGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0xQVk9JRCBwUmVzdWx0ID0gRlhTWVNfYnNlYXJjaCgmbV9Dcm9zc1JlZltvYmpudW1dLCBtX1NvcnRlZE9mZnNldC5HZXREYXRhKCksIG1fU29ydGVkT2Zmc2V0LkdldFNpemUoKSwgc2l6ZW9mKEZYX0ZJTEVTSVpFKSwgX0NvbXBhcmVGaWxlU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwUmVzdWx0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fU29ydGVkT2Zmc2V0LkFkZChtX0Nyb3NzUmVmW29iam51bV0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fVjVUeXBlLlNldEF0R3JvdyhvYmpudW0sIDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIEZYX0ZyZWUocEJ1Zik7Ci0gICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyArIGNvdW50ICogcmVjb3Jkc2l6ZSk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENQREZfUGFyc2VyOjpMb2FkQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSBwb3MsIEZYX0ZJTEVTSVpFIHN0cmVhbXBvcywgRlhfQk9PTCBiU2tpcCwgRlhfQk9PTCBiRmlyc3QpCi17Ci0gICAgbV9TeW50YXguUmVzdG9yZVBvcyhwb3MpOwotICAgIGlmIChtX1N5bnRheC5HZXRLZXl3b3JkKCkgIT0gRlhfQlNUUkMoInhyZWYiKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX0xQVk9JRCBwUmVzdWx0ID0gRlhTWVNfYnNlYXJjaCgmcG9zLCBtX1NvcnRlZE9mZnNldC5HZXREYXRhKCksIG1fU29ydGVkT2Zmc2V0LkdldFNpemUoKSwgc2l6ZW9mKEZYX0ZJTEVTSVpFKSwgX0NvbXBhcmVGaWxlU2l6ZSk7Ci0gICAgaWYgKHBSZXN1bHQgPT0gTlVMTCkgewotICAgICAgICBtX1NvcnRlZE9mZnNldC5BZGQocG9zKTsKLSAgICB9Ci0gICAgaWYgKHN0cmVhbXBvcykgewotICAgICAgICBGWF9MUFZPSUQgcFJlc3VsdCA9IEZYU1lTX2JzZWFyY2goJnN0cmVhbXBvcywgbV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLCBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksIF9Db21wYXJlRmlsZVNpemUpOwotICAgICAgICBpZiAocFJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtX1NvcnRlZE9mZnNldC5BZGQoc3RyZWFtcG9zKTsKLSAgICAgICAgfQotICAgIH0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fU3ludGF4LlNhdmVQb3MoKTsKLSAgICAgICAgRlhfQk9PTCBiSXNOdW1iZXI7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHdvcmQgPSBtX1N5bnRheC5HZXROZXh0V29yZChiSXNOdW1iZXIpOwotICAgICAgICBpZiAod29yZC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWJJc051bWJlcikgewotICAgICAgICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBGWF9EV09SRCBzdGFydF9vYmpudW0gPSBGWFNZU19hdG9pKHdvcmQpOwotICAgICAgICBpZiAoc3RhcnRfb2JqbnVtID49ICgxIDw8IDIwKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIEZYX0RXT1JEIGNvdW50ID0gbV9TeW50YXguR2V0RGlyZWN0TnVtKCk7Ci0gICAgICAgIG1fU3ludGF4LlRvTmV4dFdvcmQoKTsKLSAgICAgICAgU2F2ZWRQb3MgPSBtX1N5bnRheC5TYXZlUG9zKCk7Ci0gICAgICAgIEZYX0JPT0wgYkZpcnN0SXRlbSA9IEZBTFNFOwotICAgICAgICBGWF9JTlQzMiByZWNvcmRzaXplID0gMjA7Ci0gICAgICAgIGlmIChiRmlyc3QpIHsKLSAgICAgICAgICAgIGJGaXJzdEl0ZW0gPSBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIG1fZHdYcmVmU3RhcnRPYmpOdW0gPSBzdGFydF9vYmpudW07Ci0gICAgICAgIGlmICghYlNraXApIHsKLSAgICAgICAgICAgIGNoYXIqIHBCdWYgPSBGWF9BbGxvYyhjaGFyLCAxMDI0ICogcmVjb3Jkc2l6ZSArIDEpOwotICAgICAgICAgICAgcEJ1ZlsxMDI0ICogcmVjb3Jkc2l6ZV0gPSAnXDAnOwotICAgICAgICAgICAgRlhfSU5UMzIgbkJsb2NrcyA9IGNvdW50IC8gMTAyNCArIDE7Ci0gICAgICAgICAgICBGWF9CT09MIGJGaXJzdEJsb2NrID0gVFJVRTsKLSAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgYmxvY2sgPSAwOyBibG9jayA8IG5CbG9ja3M7IGJsb2NrICsrKSB7Ci0gICAgICAgICAgICAgICAgRlhfSU5UMzIgYmxvY2tfc2l6ZSA9IGJsb2NrID09IG5CbG9ja3MgLSAxID8gY291bnQgJSAxMDI0IDogMTAyNDsKLSAgICAgICAgICAgICAgICBtX1N5bnRheC5SZWFkQmxvY2soKEZYX0xQQllURSlwQnVmLCBibG9ja19zaXplICogcmVjb3Jkc2l6ZSk7Ci0gICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGJsb2NrX3NpemU7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgb2JqbnVtID0gc3RhcnRfb2JqbnVtICsgYmxvY2sgKiAxMDI0ICsgaTsKLSAgICAgICAgICAgICAgICAgICAgY2hhciogcEVudHJ5ID0gcEJ1ZiArIGkgKiByZWNvcmRzaXplOwotICAgICAgICAgICAgICAgICAgICBpZiAocEVudHJ5WzE3XSA9PSAnZicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiRmlyc3RJdGVtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqbnVtID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRmlyc3RJdGVtID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYkZpcnN0QmxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQgPSAoRlhfRklMRVNJWkUpRlhTWVNfYXRvaTY0KHBFbnRyeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgdmVyc2lvbiA9IEZYU1lTX2F0b2kocEVudHJ5ICsgMTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gMCAmJiB2ZXJzaW9uID09IDY1NTM1ICYmIHN0YXJ0X29iam51bSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X29iam51bS0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpudW0gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3Jvc3NSZWYuU2V0QXRHcm93KG9iam51bSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX1Y1VHlwZS5TZXRBdEdyb3cob2JqbnVtLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IChGWF9GSUxFU0laRSlGWFNZU19hdG9pNjQocEVudHJ5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgYyA9IDA7IGMgPCAxMDsgYyArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocEVudHJ5W2NdIDwgJzAnIHx8IHBFbnRyeVtjXSA+ICc5JykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRnJlZShwQnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3Jvc3NSZWYuU2V0QXRHcm93KG9iam51bSwgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIHZlcnNpb24gPSBGWFNZU19hdG9pKHBFbnRyeSArIDExKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uID49IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JWZXJzaW9uVXBkYXRlZCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX09ialZlcnNpb24uU2V0QXRHcm93KG9iam51bSwgdmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9Dcm9zc1JlZltvYmpudW1dIDwgbV9TeW50YXgubV9GaWxlTGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBWT0lEIHBSZXN1bHQgPSBGWFNZU19ic2VhcmNoKCZtX0Nyb3NzUmVmW29iam51bV0sIG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwgbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLCBzaXplb2YoRlhfRklMRVNJWkUpLCBfQ29tcGFyZUZpbGVTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU29ydGVkT2Zmc2V0LkFkZChtX0Nyb3NzUmVmW29iam51bV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fVjVUeXBlLlNldEF0R3JvdyhvYmpudW0sIDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiRmlyc3RCbG9jaykgewotICAgICAgICAgICAgICAgICAgICAgICAgYkZpcnN0QmxvY2sgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX0ZyZWUocEJ1Zik7Ci0gICAgICAgIH0KLSAgICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyArIGNvdW50ICogcmVjb3Jkc2l6ZSk7Ci0gICAgfQotICAgIGlmIChzdHJlYW1wb3MpCi0gICAgICAgIGlmICghTG9hZENyb3NzUmVmVjUoc3RyZWFtcG9zLCBzdHJlYW1wb3MsIEZBTFNFKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENQREZfUGFyc2VyOjpMb2FkQWxsQ3Jvc3NSZWZWNShGWF9GSUxFU0laRSB4cmVmcG9zKQotewotICAgIGlmICghTG9hZENyb3NzUmVmVjUoeHJlZnBvcywgeHJlZnBvcywgVFJVRSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICB3aGlsZSAoeHJlZnBvcykKLSAgICAgICAgaWYgKCFMb2FkQ3Jvc3NSZWZWNSh4cmVmcG9zLCB4cmVmcG9zLCBGQUxTRSkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIG1fT2JqZWN0U3RyZWFtTWFwLkluaXRIYXNoVGFibGUoMTAxLCBGQUxTRSk7Ci0gICAgbV9iWFJlZlN0cmVhbSA9IFRSVUU7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENQREZfUGFyc2VyOjpSZWJ1aWxkQ3Jvc3NSZWYoKQotewotICAgIG1fQ3Jvc3NSZWYuUmVtb3ZlQWxsKCk7Ci0gICAgbV9WNVR5cGUuUmVtb3ZlQWxsKCk7Ci0gICAgbV9Tb3J0ZWRPZmZzZXQuUmVtb3ZlQWxsKCk7Ci0gICAgbV9PYmpWZXJzaW9uLlJlbW92ZUFsbCgpOwotICAgIGlmIChtX3BUcmFpbGVyKSB7Ci0gICAgICAgIG1fcFRyYWlsZXItPlJlbGVhc2UoKTsKLSAgICAgICAgbV9wVHJhaWxlciA9IE5VTEw7Ci0gICAgfQotICAgIEZYX0lOVDMyIHN0YXR1cyA9IDA7Ci0gICAgRlhfSU5UMzIgaW5zaWRlX2luZGV4ID0gMDsKLSAgICBGWF9EV09SRCBvYmpudW0gPSAwLCBnZW5udW0gPSAwOwotICAgIEZYX0lOVDMyIGRlcHRoID0gMDsKLSAgICBGWF9MUEJZVEUgYnVmZmVyID0gRlhfQWxsb2MoRlhfQllURSwgNDA5Nik7Ci0gICAgRlhfRklMRVNJWkUgcG9zID0gbV9TeW50YXgubV9IZWFkZXJPZmZzZXQ7Ci0gICAgRlhfRklMRVNJWkUgc3RhcnRfcG9zID0gMCwgc3RhcnRfcG9zMSA9IDA7Ci0gICAgRlhfRklMRVNJWkUgbGFzdF9vYmogPSAtMSwgbGFzdF94cmVmID0gLTEsIGxhc3RfdHJhaWxlciA9IC0xOwotICAgIHdoaWxlIChwb3MgPCBtX1N5bnRheC5tX0ZpbGVMZW4pIHsKLSAgICAgICAgRlhfQk9PTCBiT3ZlckZsb3cgPSBGQUxTRTsKLSAgICAgICAgRlhfRFdPUkQgc2l6ZSA9IChGWF9EV09SRCkobV9TeW50YXgubV9GaWxlTGVuIC0gcG9zKTsKLSAgICAgICAgaWYgKHNpemUgPiA0MDk2KSB7Ci0gICAgICAgICAgICBzaXplID0gNDA5NjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1fU3ludGF4Lm1fcEZpbGVBY2Nlc3MtPlJlYWRCbG9jayhidWZmZXIsIHBvcywgc2l6ZSkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBzaXplOyBpICsrKSB7Ci0gICAgICAgICAgICBGWF9CWVRFIGJ5dGUgPSBidWZmZXJbaV07Ci0gICAgICAgICAgICBzd2l0Y2ggKHN0YXR1cykgewotICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKFBERl9DaGFyVHlwZVtieXRlXSA9PSAnVycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPD0gJzknICYmIGJ5dGUgPj0gJzAnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAtLWk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChieXRlID09ICclJykgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlX2luZGV4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPT0gJygnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAxMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoID0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA9PSAnPCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluc2lkZV9pbmRleCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAxMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA9PSAnXFwnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAxMzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA9PSAndCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGVfaW5kZXggPSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgaWYgKFBERl9DaGFyVHlwZVtieXRlXSA9PSAnVycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPD0gJzknICYmIGJ5dGUgPj0gJzAnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9wb3MgPSBwb3MgKyBpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iam51bSA9IGJ5dGUgLSAnMCc7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA9PSAndCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGVfaW5kZXggPSAxOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gJ3gnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSA4OwotICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlX2luZGV4ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC0taTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA8PSAnOScgJiYgYnl0ZSA+PSAnMCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iam51bSA9IG9iam51bSAqIDEwICsgYnl0ZSAtICcwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFBERl9DaGFyVHlwZVtieXRlXSA9PSAnVycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDM7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAtLWk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAxNDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluc2lkZV9pbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA8PSAnOScgJiYgYnl0ZSA+PSAnMCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3BvczEgPSBwb3MgKyBpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdlbm51bSA9IGJ5dGUgLSAnMCc7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoUERGX0NoYXJUeXBlW2J5dGVdID09ICdXJykgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA9PSAndCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGVfaW5kZXggPSAxOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLS1pOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChieXRlIDw9ICc5JyAmJiBieXRlID49ICcwJykgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2VubnVtID0gZ2VubnVtICogMTAgKyBieXRlIC0gJzAnOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoUERGX0NoYXJUeXBlW2J5dGVdID09ICdXJykgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gNTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC0taTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA9PSAnbycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGVfaW5kZXggPSAxOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFBERl9DaGFyVHlwZVtieXRlXSA9PSAnVycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPD0gJzknICYmIGJ5dGUgPj0gJzAnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmpudW0gPSBnZW5udW07Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZW5udW0gPSBieXRlIC0gJzAnOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfcG9zID0gc3RhcnRfcG9zMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3BvczEgPSBwb3MgKyBpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gNDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChieXRlID09ICd0JykgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gNzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluc2lkZV9pbmRleCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAtLWk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpbnNpZGVfaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSAhPSAnYicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2lkZV9pbmRleCArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgIT0gJ2onKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0taTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGVfaW5kZXggKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQREZfQ2hhclR5cGVbYnl0ZV0gPT0gJ1cnIHx8IFBERl9DaGFyVHlwZVtieXRlXSA9PSAnRCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iam51bSA+IDB4MTAwMDAwMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9ial9wb3MgPSBzdGFydF9wb3MgLSBtX1N5bnRheC5tX0hlYWRlck9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9vYmogPSBzdGFydF9wb3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQVk9JRCBwUmVzdWx0ID0gRlhTWVNfYnNlYXJjaCgmb2JqX3BvcywgbV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLCBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksIF9Db21wYXJlRmlsZVNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocFJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NvcnRlZE9mZnNldC5BZGQob2JqX3Bvcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2JqX2VuZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0ICpwT2JqZWN0ID0gUGFyc2VJbmRpcmVjdE9iamVjdEF0QnlTdHJpY3QobV9wRG9jdW1lbnQsIG9ial9wb3MsIG9iam51bSwgTlVMTCwgJm9ial9lbmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocE9iamVjdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlUeXBlID0JcE9iamVjdC0+R2V0VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlUeXBlID09IFBERk9CSl9TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IChDUERGX1N0cmVhbSopcE9iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwRGljdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJUeXBlIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1ZhbHVlID0gcERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiVHlwZSIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChic1ZhbHVlID09IEZYX0JTVFJDKCJYUmVmIikgJiYgcERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJTaXplIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBSb290ID0gcERpY3QtPkdldEVsZW1lbnQoRlhfQlNUUkMoIlJvb3QiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBSb290ICYmIHBSb290LT5HZXREaWN0KCkgJiYgcFJvb3QtPkdldERpY3QoKS0+R2V0RWxlbWVudChGWF9CU1RSQygiUGFnZXMiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fcFRyYWlsZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFRyYWlsZXItPlJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BUcmFpbGVyID0gKENQREZfRGljdGlvbmFyeSopcERpY3QtPkNsb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3Mob2JqX3Bvcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IG1fU3ludGF4LkZpbmRUYWcoRlhfQlNUUkMoIm9iaiIpLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG5MZW4gPSBvYmpfZW5kIC0gb2JqX3BvcyAtIG9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChGWF9EV09SRCluTGVuID4gc2l6ZSAtIGkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IG9ial9lbmQgKyBtX1N5bnRheC5tX0hlYWRlck9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJPdmVyRmxvdyA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IChGWF9EV09SRCluTGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0Nyb3NzUmVmLkdldFNpemUoKSA+IChGWF9JTlQzMilvYmpudW0gJiYgbV9Dcm9zc1JlZltvYmpudW1dKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocE9iamVjdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG9sZGdlbiA9IG1fT2JqVmVyc2lvbi5HZXRBdChvYmpudW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3Jvc3NSZWZbb2JqbnVtXSA9IG9ial9wb3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9PYmpWZXJzaW9uLlNldEF0KG9iam51bSwgKEZYX1NIT1JUKWdlbm51bSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZGdlbiAhPSBnZW5udW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iVmVyc2lvblVwZGF0ZWQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3Jvc3NSZWYuU2V0QXRHcm93KG9iam51bSwgb2JqX3Bvcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1Y1VHlwZS5TZXRBdEdyb3cob2JqbnVtLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fT2JqVmVyc2lvbi5TZXRBdEdyb3cob2JqbnVtLCAoRlhfU0hPUlQpZ2VubnVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocE9iamVjdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9iamVjdC0+UmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0taTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluc2lkZV9pbmRleCA9PSA3KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUERGX0NoYXJUeXBlW2J5dGVdID09ICdXJyB8fCBQREZfQ2hhclR5cGVbYnl0ZV0gPT0gJ0QnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF90cmFpbGVyID0gcG9zICsgaSAtIDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhwb3MgKyBpIC0gbV9TeW50YXgubV9IZWFkZXJPZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gbV9TeW50YXguR2V0T2JqZWN0KG1fcERvY3VtZW50LCAwLCAwLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocE9iaikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocE9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZICYmIHBPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqLT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBUcmFpbGVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFpbGVyID0gKChDUERGX1N0cmVhbSopcE9iaiktPkdldERpY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYWlsZXIgPSAoQ1BERl9EaWN0aW9uYXJ5KilwT2JqOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBUcmFpbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fcFRyYWlsZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBSb290ID0gcFRyYWlsZXItPkdldEVsZW1lbnQoRlhfQlNUUkMoIlJvb3QiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwUm9vdCA9PSBOVUxMIHx8IChwUm9vdC0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9EV09SRCltX0Nyb3NzUmVmLkdldFNpemUoKSA+ICgoQ1BERl9SZWZlcmVuY2UqKXBSb290KS0+R2V0UmVmT2JqTnVtKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQ3Jvc3NSZWYuR2V0QXQoKChDUERGX1JlZmVyZW5jZSopcFJvb3QpLT5HZXRSZWZPYmpOdW0oKSkgIT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBUcmFpbGVyLT5HZXRTdGFydFBvcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBvcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGtleTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IHBUcmFpbGVyLT5HZXROZXh0RWxlbWVudChwb3MsIGtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wVHJhaWxlci0+U2V0QXQoa2V5LCBwT2JqLT5DbG9uZSgpLCBtX3BEb2N1bWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqLT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqLT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFRyYWlsZXIgPSAoQ1BERl9EaWN0aW9uYXJ5KilwVHJhaWxlci0+Q2xvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmotPlJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFRyYWlsZXIgPSBwVHJhaWxlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBkd1NhdmVQb3MgPSBtX1N5bnRheC5TYXZlUG9zKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0cldvcmQgPSBtX1N5bnRheC5HZXRLZXl3b3JkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyV29yZC5Db21wYXJlKEZYX0JTVFJDKCJzdGFydHhyZWYiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk51bWJlciA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNPZmZzZXQgPSBtX1N5bnRheC5HZXROZXh0V29yZChiTnVtYmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiTnVtYmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9MYXN0WFJlZk9mZnNldCA9IEZYU1lTX2F0b2koYnNPZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoZHdTYXZlUG9zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmotPlJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC0taTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA9PSAidHJhaWxlciJbaW5zaWRlX2luZGV4XSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlX2luZGV4ICsrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLS1pOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbnNpZGVfaW5kZXggPT0gNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF94cmVmID0gcG9zICsgaSAtIDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAxOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gInhyZWYiW2luc2lkZV9pbmRleF0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluc2lkZV9pbmRleCArKzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC0taTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA9PSAnXHInIHx8IGJ5dGUgPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA9PSAnKScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXB0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gJygnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZGVwdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPT0gJzwnICYmIGluc2lkZV9pbmRleCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAxMjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChieXRlID09ICc+JykgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbnNpZGVfaW5kZXggPSAwOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgICAgICAgICAtLWk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChQREZfQ2hhclR5cGVbYnl0ZV0gPT0gJ0QnIHx8IFBERl9DaGFyVHlwZVtieXRlXSA9PSAnVycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC0taTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKFBERl9DaGFyVHlwZVtieXRlXSA9PSAnVycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA9PSAnJScgfHwgYnl0ZSA9PSAnKCcgfHwgYnl0ZSA9PSAnPCcgfHwgYnl0ZSA9PSAnXFwnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgLS1pOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluc2lkZV9pbmRleCA9PSA2KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgLS1pOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gImVuZG9iaiJbaW5zaWRlX2luZGV4XSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlX2luZGV4Kys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYk92ZXJGbG93KSB7Ci0gICAgICAgICAgICAgICAgc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcG9zICs9IHNpemU7Ci0gICAgfQotICAgIGlmIChsYXN0X3hyZWYgIT0gLTEgJiYgbGFzdF94cmVmID4gbGFzdF9vYmopIHsKLSAgICAgICAgbGFzdF90cmFpbGVyID0gbGFzdF94cmVmOwotICAgIH0gZWxzZSBpZiAobGFzdF90cmFpbGVyID09IC0xIHx8IGxhc3RfeHJlZiA8IGxhc3Rfb2JqKSB7Ci0gICAgICAgIGxhc3RfdHJhaWxlciA9IG1fU3ludGF4Lm1fRmlsZUxlbjsKLSAgICB9Ci0gICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0gbGFzdF90cmFpbGVyIC0gbV9TeW50YXgubV9IZWFkZXJPZmZzZXQ7Ci0gICAgRlhfTFBWT0lEIHBSZXN1bHQgPSBGWFNZU19ic2VhcmNoKCZvZmZzZXQsIG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwgbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLCBzaXplb2YoRlhfRklMRVNJWkUpLCBfQ29tcGFyZUZpbGVTaXplKTsKLSAgICBpZiAocFJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgIG1fU29ydGVkT2Zmc2V0LkFkZChvZmZzZXQpOwotICAgIH0KLSAgICBGWF9GcmVlKGJ1ZmZlcik7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1zdGF0aWMgRlhfRFdPUkQgX0dldFZhckludChGWF9MUENCWVRFIHAsIEZYX0lOVDMyIG4pCi17Ci0gICAgRlhfRFdPUkQgcmVzdWx0ID0gMDsKLSAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbjsgaSArKykgewotICAgICAgICByZXN1bHQgPSByZXN1bHQgKiAyNTYgKyBwW2ldOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotRlhfQk9PTCBDUERGX1BhcnNlcjo6TG9hZENyb3NzUmVmVjUoRlhfRklMRVNJWkUgcG9zLCBGWF9GSUxFU0laRSYgcHJldiwgRlhfQk9PTCBiTWFpblhSZWYpCi17Ci0gICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSAoQ1BERl9TdHJlYW0qKVBhcnNlSW5kaXJlY3RPYmplY3RBdChtX3BEb2N1bWVudCwgcG9zLCAwLCBOVUxMKTsKLSAgICBpZiAoIXBTdHJlYW0pIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9wRG9jdW1lbnQpIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5ICogcERpY3QgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpOwotICAgICAgICBpZiAoIXBEaWN0IHx8IHBEaWN0LT5HZXRPYmpOdW0oKSAhPSBwU3RyZWFtLT5tX09iak51bSkgewotICAgICAgICAgICAgbV9wRG9jdW1lbnQtPkluc2VydEluZGlyZWN0T2JqZWN0KHBTdHJlYW0tPm1fT2JqTnVtLCBwU3RyZWFtKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChwU3RyZWFtLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgewotICAgICAgICAgICAgICAgIHBTdHJlYW0tPlJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocFN0cmVhbS0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBwcmV2ID0gcFN0cmVhbS0+R2V0RGljdCgpLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJQcmV2IikpOwotICAgIEZYX0lOVDMyIHNpemUgPSBwU3RyZWFtLT5HZXREaWN0KCktPkdldEludGVnZXIoRlhfQlNUUkMoIlNpemUiKSk7Ci0gICAgaWYgKHNpemUgPCAwKSB7Ci0gICAgICAgIHBTdHJlYW0tPlJlbGVhc2UoKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoYk1haW5YUmVmKSB7Ci0gICAgICAgIG1fcFRyYWlsZXIgPSAoQ1BERl9EaWN0aW9uYXJ5KilwU3RyZWFtLT5HZXREaWN0KCktPkNsb25lKCk7Ci0gICAgICAgIG1fQ3Jvc3NSZWYuU2V0U2l6ZShzaXplKTsKLSAgICAgICAgaWYgKG1fVjVUeXBlLlNldFNpemUoc2l6ZSkpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbXNldDMyKG1fVjVUeXBlLkdldERhdGEoKSwgMCwgc2l6ZSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtX1RyYWlsZXJzLkFkZCgoQ1BERl9EaWN0aW9uYXJ5KilwU3RyZWFtLT5HZXREaWN0KCktPkNsb25lKCkpOwotICAgIH0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8RlhfSU5UMzIsIEZYX0lOVDMyPiA+IGFyckluZGV4OwotICAgIENQREZfQXJyYXkqIHBBcnJheSA9IHBTdHJlYW0tPkdldERpY3QoKS0+R2V0QXJyYXkoRlhfQlNUUkMoIkluZGV4IikpOwotICAgIGlmIChwQXJyYXkpIHsKLSAgICAgICAgRlhfRFdPUkQgblBhaXJTaXplID0gcEFycmF5LT5HZXRDb3VudCgpIC8gMjsKLSAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG5QYWlyU2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBDUERGX09iamVjdCogcFN0YXJ0TnVtT2JqID0gcEFycmF5LT5HZXRFbGVtZW50KGkgKiAyKTsKLSAgICAgICAgICAgIENQREZfT2JqZWN0KiBwQ291bnRPYmogPSBwQXJyYXktPkdldEVsZW1lbnQoaSAqIDIgKyAxKTsKLSAgICAgICAgICAgIGlmIChwU3RhcnROdW1PYmogJiYgcFN0YXJ0TnVtT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX05VTUJFUgotICAgICAgICAgICAgICAgICYmIHBDb3VudE9iaiAmJiBwQ291bnRPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfTlVNQkVSKSB7Ci0gICAgICAgICAgICAgICAgaW50IG5TdGFydE51bSA9IHBTdGFydE51bU9iai0+R2V0SW50ZWdlcigpOwotICAgICAgICAgICAgICAgIGludCBuQ291bnQgPSBwQ291bnRPYmotPkdldEludGVnZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoblN0YXJ0TnVtID49IDAgJiYgbkNvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhcnJJbmRleC5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoblN0YXJ0TnVtLCBuQ291bnQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGFyckluZGV4LnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIGFyckluZGV4LnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcigwLCBzaXplKSk7Ci0gICAgfQotICAgIHBBcnJheSA9IHBTdHJlYW0tPkdldERpY3QoKS0+R2V0QXJyYXkoRlhfQlNUUkMoIlciKSk7Ci0gICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgIHBTdHJlYW0tPlJlbGVhc2UoKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDRlhfRFdvcmRBcnJheSBXaWR0aEFycmF5OwotICAgIEZYX1NBRkVfRFdPUkQgZHdBY2NXaWR0aCA9IDA7Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBBcnJheS0+R2V0Q291bnQoKTsgaSArKykgewotICAgICAgICBXaWR0aEFycmF5LkFkZChwQXJyYXktPkdldEludGVnZXIoaSkpOwotICAgICAgICBkd0FjY1dpZHRoICs9IFdpZHRoQXJyYXlbaV07Ci0gICAgfQotICAgIGlmICghZHdBY2NXaWR0aC5Jc1ZhbGlkKCkgfHwgV2lkdGhBcnJheS5HZXRTaXplKCkgPCAzKSB7Ci0gICAgICAgIHBTdHJlYW0tPlJlbGVhc2UoKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9EV09SRCB0b3RhbFdpZHRoID0gZHdBY2NXaWR0aC5WYWx1ZU9yRGllKCk7Ci0gICAgQ1BERl9TdHJlYW1BY2MgYWNjOwotICAgIGFjYy5Mb2FkQWxsRGF0YShwU3RyZWFtKTsKLSAgICBGWF9MUENCWVRFIHBEYXRhID0gYWNjLkdldERhdGEoKTsKLSAgICBGWF9EV09SRCBkd1RvdGFsU2l6ZSA9IGFjYy5HZXRTaXplKCk7Ci0gICAgRlhfRFdPUkQgc2VnaW5kZXggPSAwOwotICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBhcnJJbmRleC5zaXplKCk7IGkgKyspIHsKLSAgICAgICAgRlhfSU5UMzIgc3RhcnRudW0gPSBhcnJJbmRleFtpXS5maXJzdDsKLSAgICAgICAgaWYgKHN0YXJ0bnVtIDwgMCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgbV9kd1hyZWZTdGFydE9iak51bSA9IHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PEZYX0RXT1JELCBGWF9JTlQzMj4gKHN0YXJ0bnVtKTsKLSAgICAgICAgRlhfRFdPUkQgY291bnQgPSBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxGWF9EV09SRCwgRlhfSU5UMzI+IChhcnJJbmRleFtpXS5zZWNvbmQpOwotICAgICAgICBGWF9TQUZFX0RXT1JEIGR3Q2FjdWxhdGVkU2l6ZSA9IHNlZ2luZGV4OwotICAgICAgICBkd0NhY3VsYXRlZFNpemUgKz0gY291bnQ7Ci0gICAgICAgIGR3Q2FjdWxhdGVkU2l6ZSAqPSB0b3RhbFdpZHRoOwotICAgICAgICBpZiAoIWR3Q2FjdWxhdGVkU2l6ZS5Jc1ZhbGlkKCkgfHwgZHdDYWN1bGF0ZWRTaXplLlZhbHVlT3JEaWUoKSA+IGR3VG90YWxTaXplKSB7IAotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfTFBDQllURSBzZWdzdGFydCA9IHBEYXRhICsgc2VnaW5kZXggKiB0b3RhbFdpZHRoOwotICAgICAgICBGWF9TQUZFX0RXT1JEIGR3TWF4T2JqTnVtID0gc3RhcnRudW07Ci0gICAgICAgIGR3TWF4T2JqTnVtICs9IGNvdW50OwotICAgICAgICBGWF9EV09SRCBkd1Y1U2l6ZSA9IHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PEZYX0RXT1JELCBGWF9JTlQzMj4gKG1fVjVUeXBlLkdldFNpemUoKSk7Ci0gICAgICAgIGlmICghZHdNYXhPYmpOdW0uSXNWYWxpZCgpIHx8IGR3TWF4T2JqTnVtLlZhbHVlT3JEaWUoKSA+IGR3VjVTaXplKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKEZYX0RXT1JEIGogPSAwOyBqIDwgY291bnQ7IGogKyspIHsKLSAgICAgICAgICAgIEZYX0lOVDMyIHR5cGUgPSAxOwotICAgICAgICAgICAgRlhfTFBDQllURSBlbnRyeXN0YXJ0ID0gc2Vnc3RhcnQgKyBqICogdG90YWxXaWR0aDsKLSAgICAgICAgICAgIGlmIChXaWR0aEFycmF5WzBdKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IF9HZXRWYXJJbnQoZW50cnlzdGFydCwgV2lkdGhBcnJheVswXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9WNVR5cGVbc3RhcnRudW0gKyBqXSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQgPSBfR2V0VmFySW50KGVudHJ5c3RhcnQgKyBXaWR0aEFycmF5WzBdLCBXaWR0aEFycmF5WzFdKTsKLSAgICAgICAgICAgICAgICBtX0Nyb3NzUmVmW3N0YXJ0bnVtICsgal0gPSBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgRlhfTFBWT0lEIHBSZXN1bHQgPSBGWFNZU19ic2VhcmNoKCZvZmZzZXQsIG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwgbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLCBzaXplb2YoRlhfRklMRVNJWkUpLCBfQ29tcGFyZUZpbGVTaXplKTsKLSAgICAgICAgICAgICAgICBpZiAocFJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fU29ydGVkT2Zmc2V0LkFkZChvZmZzZXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX1Y1VHlwZVtzdGFydG51bSArIGpdKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX1Y1VHlwZVtzdGFydG51bSArIGpdID0gdHlwZTsKLSAgICAgICAgICAgIGlmICh0eXBlID09IDApIHsKLSAgICAgICAgICAgICAgICBtX0Nyb3NzUmVmW3N0YXJ0bnVtICsgal0gPSAwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQgPSBfR2V0VmFySW50KGVudHJ5c3RhcnQgKyBXaWR0aEFycmF5WzBdLCBXaWR0aEFycmF5WzFdKTsKLSAgICAgICAgICAgICAgICBtX0Nyb3NzUmVmW3N0YXJ0bnVtICsgal0gPSBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBGWF9MUFZPSUQgcFJlc3VsdCA9IEZYU1lTX2JzZWFyY2goJm9mZnNldCwgbV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLCBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksIF9Db21wYXJlRmlsZVNpemUpOwotICAgICAgICAgICAgICAgICAgICBpZiAocFJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX1NvcnRlZE9mZnNldC5BZGQob2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+PSBtX1Y1VHlwZS5HZXRTaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW0tPlJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtX1Y1VHlwZVtvZmZzZXRdID0gMjU1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzZWdpbmRleCArPSBjb3VudDsKLSAgICB9Ci0gICAgcFN0cmVhbS0+UmVsZWFzZSgpOwotICAgIHJldHVybiBUUlVFOwotfQotQ1BERl9BcnJheSogQ1BERl9QYXJzZXI6OkdldElEQXJyYXkoKQotewotICAgIENQREZfT2JqZWN0KiBwSUQgPSBtX3BUcmFpbGVyID8gbV9wVHJhaWxlci0+R2V0RWxlbWVudChGWF9CU1RSQygiSUQiKSkgOiBOVUxMOwotICAgIGlmIChwSUQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKHBJRC0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKLSAgICAgICAgcElEID0gUGFyc2VJbmRpcmVjdE9iamVjdChOVUxMLCAoKENQREZfUmVmZXJlbmNlKilwSUQpLT5HZXRSZWZPYmpOdW0oKSk7Ci0gICAgICAgIG1fcFRyYWlsZXItPlNldEF0KEZYX0JTVFJDKCJJRCIpLCBwSUQpOwotICAgIH0KLSAgICBpZiAocElEID09IE5VTEwgfHwgcElELT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gKENQREZfQXJyYXkqKXBJRDsKLX0KLUZYX0RXT1JEIENQREZfUGFyc2VyOjpHZXRSb290T2JqTnVtKCkKLXsKLSAgICBDUERGX09iamVjdCogcFJlZiA9IG1fcFRyYWlsZXIgPyBtX3BUcmFpbGVyLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJSb290IikpIDogTlVMTDsKLSAgICBpZiAocFJlZiA9PSBOVUxMIHx8IHBSZWYtPkdldFR5cGUoKSAhPSBQREZPQkpfUkVGRVJFTkNFKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gKChDUERGX1JlZmVyZW5jZSopIHBSZWYpLT5HZXRSZWZPYmpOdW0oKTsKLX0KLUZYX0RXT1JEIENQREZfUGFyc2VyOjpHZXRJbmZvT2JqTnVtKCkKLXsKLSAgICBDUERGX09iamVjdCogcFJlZiA9IG1fcFRyYWlsZXIgPyBtX3BUcmFpbGVyLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJJbmZvIikpIDogTlVMTDsKLSAgICBpZiAocFJlZiA9PSBOVUxMIHx8IHBSZWYtPkdldFR5cGUoKSAhPSBQREZPQkpfUkVGRVJFTkNFKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gKChDUERGX1JlZmVyZW5jZSopIHBSZWYpLT5HZXRSZWZPYmpOdW0oKTsKLX0KLUZYX0JPT0wgQ1BERl9QYXJzZXI6OklzRm9ybVN0cmVhbShGWF9EV09SRCBvYmpudW0sIEZYX0JPT0wmIGJGb3JtKQotewotICAgIGJGb3JtID0gRkFMU0U7Ci0gICAgaWYgKG9iam51bSA+PSAoRlhfRFdPUkQpbV9Dcm9zc1JlZi5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmIChtX1Y1VHlwZVtvYmpudW1dID09IDApIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmIChtX1Y1VHlwZVtvYmpudW1dID09IDIpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIEZYX0ZJTEVTSVpFIHBvcyA9IG1fQ3Jvc3NSZWZbb2JqbnVtXTsKLSAgICBGWF9MUFZPSUQgcFJlc3VsdCA9IEZYU1lTX2JzZWFyY2goJnBvcywgbV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLCBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksIF9Db21wYXJlRmlsZVNpemUpOwotICAgIGlmIChwUmVzdWx0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmICgoRlhfRklMRVNJWkUqKXBSZXN1bHQgLSAoRlhfRklMRVNJWkUqKW1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSA9PSBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCkgLSAxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfRklMRVNJWkUgc2l6ZSA9ICgoRlhfRklMRVNJWkUqKXBSZXN1bHQpWzFdIC0gcG9zOwotICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9TeW50YXguU2F2ZVBvcygpOwotICAgIG1fU3ludGF4LlJlc3RvcmVQb3MocG9zKTsKLSAgICBiRm9ybSA9IG1fU3ludGF4LlNlYXJjaE11bHRpV29yZChGWF9CU1RSQygiL0Zvcm1cMHN0cmVhbSIpLCBUUlVFLCBzaXplKSA9PSAwOwotICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOwotICAgIHJldHVybiBUUlVFOwotfQotQ1BERl9PYmplY3QqIENQREZfUGFyc2VyOjpQYXJzZUluZGlyZWN0T2JqZWN0KENQREZfSW5kaXJlY3RPYmplY3RzKiBwT2JqTGlzdCwgRlhfRFdPUkQgb2JqbnVtLCBQQVJTRV9DT05URVhUKiBwQ29udGV4dCkKLXsKLSAgICBpZiAob2JqbnVtID49IChGWF9EV09SRCltX0Nyb3NzUmVmLkdldFNpemUoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKG1fVjVUeXBlW29iam51bV0gPT0gMSB8fCBtX1Y1VHlwZVtvYmpudW1dID09IDI1NSkgewotICAgICAgICBGWF9GSUxFU0laRSBwb3MgPSBtX0Nyb3NzUmVmW29iam51bV07Ci0gICAgICAgIGlmIChwb3MgPD0gMCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFBhcnNlSW5kaXJlY3RPYmplY3RBdChwT2JqTGlzdCwgcG9zLCBvYmpudW0sIHBDb250ZXh0KTsKLSAgICB9Ci0gICAgaWYgKG1fVjVUeXBlW29iam51bV0gPT0gMikgewotICAgICAgICBDUERGX1N0cmVhbUFjYyogcE9ialN0cmVhbSA9IEdldE9iamVjdFN0cmVhbSgoRlhfRFdPUkQpbV9Dcm9zc1JlZltvYmpudW1dKTsKLSAgICAgICAgaWYgKHBPYmpTdHJlYW0gPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfSU5UMzIgbiA9IHBPYmpTdHJlYW0tPkdldERpY3QoKS0+R2V0SW50ZWdlcihGWF9CU1RSQygiTiIpKTsKLSAgICAgICAgRlhfSU5UMzIgb2Zmc2V0ID0gcE9ialN0cmVhbS0+R2V0RGljdCgpLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJGaXJzdCIpKTsKLSAgICAgICAgQ1BERl9TeW50YXhQYXJzZXIgc3ludGF4OwotICAgICAgICBDRlhfU21hcnRQb2ludGVyPElGWF9GaWxlU3RyZWFtPiBmaWxlKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbSgoRlhfTFBCWVRFKXBPYmpTdHJlYW0tPkdldERhdGEoKSwgKHNpemVfdClwT2JqU3RyZWFtLT5HZXRTaXplKCksIEZBTFNFKSk7Ci0gICAgICAgIHN5bnRheC5Jbml0UGFyc2VyKGZpbGUuR2V0KCksIDApOwotICAgICAgICBDUERGX09iamVjdCogcFJldCA9IE5VTEw7Ci0gICAgICAgIHdoaWxlIChuKSB7Ci0gICAgICAgICAgICBGWF9EV09SRCB0aGlzbnVtID0gc3ludGF4LkdldERpcmVjdE51bSgpOwotICAgICAgICAgICAgRlhfRFdPUkQgdGhpc29mZiA9IHN5bnRheC5HZXREaXJlY3ROdW0oKTsKLSAgICAgICAgICAgIGlmICh0aGlzbnVtID09IG9iam51bSkgewotICAgICAgICAgICAgICAgIHN5bnRheC5SZXN0b3JlUG9zKG9mZnNldCArIHRoaXNvZmYpOwotICAgICAgICAgICAgICAgIHBSZXQgPSBzeW50YXguR2V0T2JqZWN0KHBPYmpMaXN0LCAwLCAwLCBwQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuIC0tOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwUmV0OwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLUNQREZfU3RyZWFtQWNjKiBDUERGX1BhcnNlcjo6R2V0T2JqZWN0U3RyZWFtKEZYX0RXT1JEIG9iam51bSkKLXsKLSAgICBDUERGX1N0cmVhbUFjYyogcFN0cmVhbUFjYyA9IE5VTEw7Ci0gICAgaWYgKG1fT2JqZWN0U3RyZWFtTWFwLkxvb2t1cCgodm9pZCopKEZYX1VJTlRQVFIpb2JqbnVtLCAodm9pZComKXBTdHJlYW1BY2MpKSB7Ci0gICAgICAgIHJldHVybiBwU3RyZWFtQWNjOwotICAgIH0KLSAgICBjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSA9IG1fcERvY3VtZW50ID8gKENQREZfU3RyZWFtKiltX3BEb2N1bWVudC0+R2V0SW5kaXJlY3RPYmplY3Qob2JqbnVtKSA6IE5VTEw7Ci0gICAgaWYgKHBTdHJlYW0gPT0gTlVMTCB8fCBwU3RyZWFtLT5HZXRUeXBlKCkgIT0gUERGT0JKX1NUUkVBTSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcFN0cmVhbUFjYyA9IG5ldyBDUERGX1N0cmVhbUFjYzsKLSAgICBwU3RyZWFtQWNjLT5Mb2FkQWxsRGF0YShwU3RyZWFtKTsKLSAgICBtX09iamVjdFN0cmVhbU1hcC5TZXRBdCgodm9pZCopKEZYX1VJTlRQVFIpb2JqbnVtLCBwU3RyZWFtQWNjKTsKLSAgICByZXR1cm4gcFN0cmVhbUFjYzsKLX0KLUZYX0ZJTEVTSVpFIENQREZfUGFyc2VyOjpHZXRPYmplY3RTaXplKEZYX0RXT1JEIG9iam51bSkKLXsKLSAgICBpZiAob2JqbnVtID49IChGWF9EV09SRCltX0Nyb3NzUmVmLkdldFNpemUoKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKG1fVjVUeXBlW29iam51bV0gPT0gMikgewotICAgICAgICBvYmpudW0gPSAoRlhfRFdPUkQpbV9Dcm9zc1JlZltvYmpudW1dOwotICAgIH0KLSAgICBpZiAobV9WNVR5cGVbb2JqbnVtXSA9PSAxIHx8IG1fVjVUeXBlW29iam51bV0gPT0gMjU1KSB7Ci0gICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IG1fQ3Jvc3NSZWZbb2JqbnVtXTsKLSAgICAgICAgaWYgKG9mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBGWF9MUFZPSUQgcFJlc3VsdCA9IEZYU1lTX2JzZWFyY2goJm9mZnNldCwgbV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLCBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksIF9Db21wYXJlRmlsZVNpemUpOwotICAgICAgICBpZiAocFJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoKEZYX0ZJTEVTSVpFKilwUmVzdWx0IC0gKEZYX0ZJTEVTSVpFKiltX1NvcnRlZE9mZnNldC5HZXREYXRhKCkgPT0gbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpIC0gMSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICgoRlhfRklMRVNJWkUqKXBSZXN1bHQpWzFdIC0gb2Zmc2V0OwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLXZvaWQgQ1BERl9QYXJzZXI6OkdldEluZGlyZWN0QmluYXJ5KEZYX0RXT1JEIG9iam51bSwgRlhfTFBCWVRFJiBwQnVmZmVyLCBGWF9EV09SRCYgc2l6ZSkKLXsKLSAgICBwQnVmZmVyID0gTlVMTDsKLSAgICBzaXplID0gMDsKLSAgICBpZiAob2JqbnVtID49IChGWF9EV09SRCltX0Nyb3NzUmVmLkdldFNpemUoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtX1Y1VHlwZVtvYmpudW1dID09IDIpIHsKLSAgICAgICAgQ1BERl9TdHJlYW1BY2MqIHBPYmpTdHJlYW0gPSBHZXRPYmplY3RTdHJlYW0oKEZYX0RXT1JEKW1fQ3Jvc3NSZWZbb2JqbnVtXSk7Ci0gICAgICAgIGlmIChwT2JqU3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBGWF9JTlQzMiBuID0gcE9ialN0cmVhbS0+R2V0RGljdCgpLT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJOIikpOwotICAgICAgICBGWF9JTlQzMiBvZmZzZXQgPSBwT2JqU3RyZWFtLT5HZXREaWN0KCktPkdldEludGVnZXIoRlhfQlNUUkMoIkZpcnN0IikpOwotICAgICAgICBDUERGX1N5bnRheFBhcnNlciBzeW50YXg7Ci0gICAgICAgIEZYX0xQQ0JZVEUgcERhdGEgPSBwT2JqU3RyZWFtLT5HZXREYXRhKCk7Ci0gICAgICAgIEZYX0RXT1JEIHRvdGFsc2l6ZSA9IHBPYmpTdHJlYW0tPkdldFNpemUoKTsKLSAgICAgICAgQ0ZYX1NtYXJ0UG9pbnRlcjxJRlhfRmlsZVN0cmVhbT4gZmlsZShGWF9DcmVhdGVNZW1vcnlTdHJlYW0oKEZYX0xQQllURSlwRGF0YSwgKHNpemVfdCl0b3RhbHNpemUsIEZBTFNFKSk7Ci0gICAgICAgIHN5bnRheC5Jbml0UGFyc2VyKGZpbGUuR2V0KCksIDApOwotICAgICAgICB3aGlsZSAobikgewotICAgICAgICAgICAgRlhfRFdPUkQgdGhpc251bSA9IHN5bnRheC5HZXREaXJlY3ROdW0oKTsKLSAgICAgICAgICAgIEZYX0RXT1JEIHRoaXNvZmYgPSBzeW50YXguR2V0RGlyZWN0TnVtKCk7Ci0gICAgICAgICAgICBpZiAodGhpc251bSA9PSBvYmpudW0pIHsKLSAgICAgICAgICAgICAgICBpZiAobiA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNpemUgPSB0b3RhbHNpemUgLSAodGhpc29mZiArIG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3ludGF4LkdldERpcmVjdE51bSgpOyAgLy8gU2tpcCBuZXh0bnVtLgotICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuZXh0b2ZmID0gc3ludGF4LkdldERpcmVjdE51bSgpOwotICAgICAgICAgICAgICAgICAgICBzaXplID0gbmV4dG9mZiAtIHRoaXNvZmY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBCdWZmZXIgPSBGWF9BbGxvYyhGWF9CWVRFLCBzaXplKTsKLSAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkzMihwQnVmZmVyLCBwRGF0YSArIHRoaXNvZmYgKyBvZmZzZXQsIHNpemUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG4gLS07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobV9WNVR5cGVbb2JqbnVtXSA9PSAxKSB7Ci0gICAgICAgIEZYX0ZJTEVTSVpFIHBvcyA9IG1fQ3Jvc3NSZWZbb2JqbnVtXTsKLSAgICAgICAgaWYgKHBvcyA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1N5bnRheC5TYXZlUG9zKCk7Ci0gICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MocG9zKTsKLSAgICAgICAgRlhfQk9PTCBiSXNOdW1iZXI7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHdvcmQgPSBtX1N5bnRheC5HZXROZXh0V29yZChiSXNOdW1iZXIpOwotICAgICAgICBpZiAoIWJJc051bWJlcikgewotICAgICAgICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRFdPUkQgcGFyc2VyX29iam51bSA9IEZYU1lTX2F0b2kod29yZCk7Ci0gICAgICAgIGlmIChwYXJzZXJfb2JqbnVtICYmIHBhcnNlcl9vYmpudW0gIT0gb2JqbnVtKSB7Ci0gICAgICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICAgICAgaWYgKCFiSXNOdW1iZXIpIHsKLSAgICAgICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX1N5bnRheC5HZXRLZXl3b3JkKCkgIT0gRlhfQlNUUkMoIm9iaiIpKSB7Ci0gICAgICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBGWF9MUFZPSUQgcFJlc3VsdCA9IEZYU1lTX2JzZWFyY2goJnBvcywgbV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLCBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksIF9Db21wYXJlRmlsZVNpemUpOwotICAgICAgICBpZiAocFJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBGWF9GSUxFU0laRSBuZXh0b2ZmID0gKChGWF9GSUxFU0laRSopcFJlc3VsdClbMV07Ci0gICAgICAgIEZYX0JPT0wgYk5leHRPZmZWYWxpZCA9IEZBTFNFOwotICAgICAgICBpZiAobmV4dG9mZiAhPSBwb3MpIHsKLSAgICAgICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MobmV4dG9mZik7Ci0gICAgICAgICAgICB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICAgICAgICAgIGlmICh3b3JkID09IEZYX0JTVFJDKCJ4cmVmIikpIHsKLSAgICAgICAgICAgICAgICBiTmV4dE9mZlZhbGlkID0gVFJVRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYklzTnVtYmVyKSB7Ci0gICAgICAgICAgICAgICAgd29yZCA9IG1fU3ludGF4LkdldE5leHRXb3JkKGJJc051bWJlcik7Ci0gICAgICAgICAgICAgICAgaWYgKGJJc051bWJlciAmJiBtX1N5bnRheC5HZXRLZXl3b3JkKCkgPT0gRlhfQlNUUkMoIm9iaiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJOZXh0T2ZmVmFsaWQgPSBUUlVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWJOZXh0T2ZmVmFsaWQpIHsKLSAgICAgICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MocG9zKTsKLSAgICAgICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fU3ludGF4LkdldEtleXdvcmQoKSA9PSBGWF9CU1RSQygiZW5kb2JqIikpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtX1N5bnRheC5TYXZlUG9zKCkgPT0gbV9TeW50YXgubV9GaWxlTGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5leHRvZmYgPSBtX1N5bnRheC5TYXZlUG9zKCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2l6ZSA9IChGWF9EV09SRCkobmV4dG9mZiAtIHBvcyk7Ci0gICAgICAgIHBCdWZmZXIgPSBGWF9BbGxvYyhGWF9CWVRFLCBzaXplKTsKLSAgICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhwb3MpOwotICAgICAgICBtX1N5bnRheC5SZWFkQmxvY2socEJ1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOwotICAgIH0KLX0KLUNQREZfT2JqZWN0KiBDUERGX1BhcnNlcjo6UGFyc2VJbmRpcmVjdE9iamVjdEF0KENQREZfSW5kaXJlY3RPYmplY3RzKiBwT2JqTGlzdCwgRlhfRklMRVNJWkUgcG9zLCBGWF9EV09SRCBvYmpudW0sCi0gICAgICAgIFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0KQotewotICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9TeW50YXguU2F2ZVBvcygpOwotICAgIG1fU3ludGF4LlJlc3RvcmVQb3MocG9zKTsKLSAgICBGWF9CT09MIGJJc051bWJlcjsKLSAgICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICBpZiAoIWJJc051bWJlcikgewotICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYX0ZJTEVTSVpFIG9iak9mZnNldCA9IG1fU3ludGF4LlNhdmVQb3MoKTsKLSAgICBvYmpPZmZzZXQgLT0gd29yZC5HZXRMZW5ndGgoKTsKLSAgICBGWF9EV09SRCBwYXJzZXJfb2JqbnVtID0gRlhTWVNfYXRvaSh3b3JkKTsKLSAgICBpZiAob2JqbnVtICYmIHBhcnNlcl9vYmpudW0gIT0gb2JqbnVtKSB7Ci0gICAgICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgd29yZCA9IG1fU3ludGF4LkdldE5leHRXb3JkKGJJc051bWJlcik7Ci0gICAgaWYgKCFiSXNOdW1iZXIpIHsKLSAgICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBGWF9EV09SRCBwYXJzZXJfZ2VubnVtID0gRlhTWVNfYXRvaSh3b3JkKTsKLSAgICBpZiAobV9TeW50YXguR2V0S2V5d29yZCgpICE9IEZYX0JTVFJDKCJvYmoiKSkgewotICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwT2JqID0gbV9TeW50YXguR2V0T2JqZWN0KHBPYmpMaXN0LCBvYmpudW0sIHBhcnNlcl9nZW5udW0sIHBDb250ZXh0KTsKLSAgICBtX1N5bnRheC5TYXZlUG9zKCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYnNXb3JkID0gbV9TeW50YXguR2V0S2V5d29yZCgpOwotICAgIGlmIChic1dvcmQgPT0gRlhfQlNUUkMoImVuZG9iaiIpKSB7Ci0gICAgICAgIG1fU3ludGF4LlNhdmVQb3MoKTsKLSAgICB9Ci0gICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7Ci0gICAgaWYgKHBPYmopIHsKLSAgICAgICAgaWYgKCFvYmpudW0pIHsKLSAgICAgICAgICAgIHBPYmotPm1fT2JqTnVtID0gcGFyc2VyX29iam51bTsKLSAgICAgICAgfQotICAgICAgICBwT2JqLT5tX0dlbk51bSA9IHBhcnNlcl9nZW5udW07Ci0gICAgfQotICAgIHJldHVybiBwT2JqOwotfQotQ1BERl9PYmplY3QqIENQREZfUGFyc2VyOjpQYXJzZUluZGlyZWN0T2JqZWN0QXRCeVN0cmljdChDUERGX0luZGlyZWN0T2JqZWN0cyogcE9iakxpc3QsIEZYX0ZJTEVTSVpFIHBvcywgRlhfRFdPUkQgb2JqbnVtLAotICAgICAgICBzdHJ1Y3QgUEFSU0VfQ09OVEVYVCogcENvbnRleHQsIEZYX0ZJTEVTSVpFICpwUmVzdWx0UG9zKQotewotICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9TeW50YXguU2F2ZVBvcygpOwotICAgIG1fU3ludGF4LlJlc3RvcmVQb3MocG9zKTsKLSAgICBGWF9CT09MIGJJc051bWJlcjsKLSAgICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICBpZiAoIWJJc051bWJlcikgewotICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYX0RXT1JEIHBhcnNlcl9vYmpudW0gPSBGWFNZU19hdG9pKHdvcmQpOwotICAgIGlmIChvYmpudW0gJiYgcGFyc2VyX29iam51bSAhPSBvYmpudW0pIHsKLSAgICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICBpZiAoIWJJc051bWJlcikgewotICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYX0RXT1JEIGdlbm51bSA9IEZYU1lTX2F0b2kod29yZCk7Ci0gICAgaWYgKG1fU3ludGF4LkdldEtleXdvcmQoKSAhPSBGWF9CU1RSQygib2JqIikpIHsKLSAgICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcE9iaiA9IG1fU3ludGF4LkdldE9iamVjdEJ5U3RyaWN0KHBPYmpMaXN0LCBvYmpudW0sIGdlbm51bSwgcENvbnRleHQpOwotICAgIGlmIChwUmVzdWx0UG9zKSB7Ci0gICAgICAgICpwUmVzdWx0UG9zID0gbV9TeW50YXgubV9Qb3M7Ci0gICAgfQotICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOwotICAgIHJldHVybiBwT2JqOwotfQotQ1BERl9EaWN0aW9uYXJ5KiBDUERGX1BhcnNlcjo6TG9hZFRyYWlsZXJWNCgpCi17Ci0gICAgaWYgKG1fU3ludGF4LkdldEtleXdvcmQoKSAhPSBGWF9CU1RSQygidHJhaWxlciIpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcE9iaiA9IG1fU3ludGF4LkdldE9iamVjdChtX3BEb2N1bWVudCwgMCwgMCwgMCk7Ci0gICAgaWYgKHBPYmogPT0gTlVMTCB8fCBwT2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgaWYgKHBPYmopIHsKLSAgICAgICAgICAgIHBPYmotPlJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIChDUERGX0RpY3Rpb25hcnkqKXBPYmo7Ci19Ci1GWF9EV09SRCBDUERGX1BhcnNlcjo6R2V0UGVybWlzc2lvbnMoRlhfQk9PTCBiQ2hlY2tSZXZpc2lvbikKLXsKLSAgICBpZiAobV9wU2VjdXJpdHlIYW5kbGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIChGWF9EV09SRCkgLSAxOwotICAgIH0KLSAgICBGWF9EV09SRCBkd1Blcm1pc3Npb24gPSBtX3BTZWN1cml0eUhhbmRsZXItPkdldFBlcm1pc3Npb25zKCk7Ci0gICAgaWYgKG1fcEVuY3J5cHREaWN0ICYmIG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkZpbHRlciIpKSA9PSBGWF9CU1RSQygiU3RhbmRhcmQiKSkgewotICAgICAgICBkd1Blcm1pc3Npb24gJj0gMHhGRkZGRkZGQzsKLSAgICAgICAgZHdQZXJtaXNzaW9uIHw9IDB4RkZGRkYwQzA7Ci0gICAgICAgIGlmKGJDaGVja1JldmlzaW9uICYmIG1fcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJSIikpID09IDIpIHsKLSAgICAgICAgICAgIGR3UGVybWlzc2lvbiAmPSAweEZGRkZGMEZGOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBkd1Blcm1pc3Npb247Ci19Ci1GWF9CT09MIENQREZfUGFyc2VyOjpJc093bmVyKCkKLXsKLSAgICByZXR1cm4gbV9wU2VjdXJpdHlIYW5kbGVyID09IE5VTEwgPyBUUlVFIDogbV9wU2VjdXJpdHlIYW5kbGVyLT5Jc093bmVyKCk7Ci19Ci12b2lkIENQREZfUGFyc2VyOjpTZXRTZWN1cml0eUhhbmRsZXIoQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIsIEZYX0JPT0wgYkZvcmNlZCkKLXsKLSAgICBBU1NFUlQobV9wU2VjdXJpdHlIYW5kbGVyID09IE5VTEwpOwotICAgIGlmIChtX3BTZWN1cml0eUhhbmRsZXIgJiYgIW1fYkZvcmNlVXNlU2VjdXJpdHlIYW5kbGVyKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BTZWN1cml0eUhhbmRsZXI7Ci0gICAgICAgIG1fcFNlY3VyaXR5SGFuZGxlciA9IE5VTEw7Ci0gICAgfQotICAgIG1fYkZvcmNlVXNlU2VjdXJpdHlIYW5kbGVyID0gYkZvcmNlZDsKLSAgICBtX3BTZWN1cml0eUhhbmRsZXIgPSBwU2VjdXJpdHlIYW5kbGVyOwotICAgIGlmIChtX2JGb3JjZVVzZVNlY3VyaXR5SGFuZGxlcikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fU3ludGF4Lm1fcENyeXB0b0hhbmRsZXIgPSBwU2VjdXJpdHlIYW5kbGVyLT5DcmVhdGVDcnlwdG9IYW5kbGVyKCk7Ci0gICAgbV9TeW50YXgubV9wQ3J5cHRvSGFuZGxlci0+SW5pdChOVUxMLCBwU2VjdXJpdHlIYW5kbGVyKTsKLX0KLUZYX0JPT0wgQ1BERl9QYXJzZXI6OklzTGluZWFyaXplZEZpbGUoSUZYX0ZpbGVSZWFkKiBwRmlsZUFjY2VzcywgRlhfRFdPUkQgb2Zmc2V0KQotewotICAgIG1fU3ludGF4LkluaXRQYXJzZXIocEZpbGVBY2Nlc3MsIG9mZnNldCk7Ci0gICAgbV9TeW50YXguUmVzdG9yZVBvcyhtX1N5bnRheC5tX0hlYWRlck9mZnNldCArIDkpOwotICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9TeW50YXguU2F2ZVBvcygpOwotICAgIEZYX0JPT0wgYklzTnVtYmVyOwotICAgIENGWF9CeXRlU3RyaW5nIHdvcmQgPSBtX1N5bnRheC5HZXROZXh0V29yZChiSXNOdW1iZXIpOwotICAgIGlmICghYklzTnVtYmVyKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfRFdPUkQgb2JqbnVtID0gRlhTWVNfYXRvaSh3b3JkKTsKLSAgICB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICBpZiAoIWJJc051bWJlcikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX0RXT1JEIGdlbm51bSA9IEZYU1lTX2F0b2kod29yZCk7Ci0gICAgaWYgKG1fU3ludGF4LkdldEtleXdvcmQoKSAhPSBGWF9CU1RSQygib2JqIikpIHsKLSAgICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9wTGluZWFyaXplZCA9IG1fU3ludGF4LkdldE9iamVjdChOVUxMLCBvYmpudW0sIGdlbm51bSwgMCk7Ci0gICAgaWYgKCFtX3BMaW5lYXJpemVkKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG1fcExpbmVhcml6ZWQtPkdldERpY3QoKSAmJiBtX3BMaW5lYXJpemVkLT5HZXREaWN0KCktPkdldEVsZW1lbnQoRlhfQlNUUkMoIkxpbmVhcml6ZWQiKSkpIHsKLSAgICAgICAgbV9TeW50YXguR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICAgICAgQ1BERl9PYmplY3QgKnBMZW4gPSBtX3BMaW5lYXJpemVkLT5HZXREaWN0KCktPkdldEVsZW1lbnQoRlhfQlNUUkMoIkwiKSk7Ci0gICAgICAgIGlmICghcExlbikgewotICAgICAgICAgICAgbV9wTGluZWFyaXplZC0+UmVsZWFzZSgpOwotICAgICAgICAgICAgbV9wTGluZWFyaXplZCA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBMZW4tPkdldEludGVnZXIoKSAhPSAoaW50KXBGaWxlQWNjZXNzLT5HZXRTaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBDUERGX09iamVjdCAqcE5vID0gbV9wTGluZWFyaXplZC0+R2V0RGljdCgpLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJQIikpOwotICAgICAgICBpZiAocE5vICYmIHBOby0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIpIHsKLSAgICAgICAgICAgIG1fZHdGaXJzdFBhZ2VObyA9IHBOby0+R2V0SW50ZWdlcigpOwotICAgICAgICB9Ci0gICAgICAgIENQREZfT2JqZWN0ICpwVGFibGUgPSBtX3BMaW5lYXJpemVkLT5HZXREaWN0KCktPkdldEVsZW1lbnQoRlhfQlNUUkMoIlQiKSk7Ci0gICAgICAgIGlmIChwVGFibGUgJiYgcFRhYmxlLT5HZXRUeXBlKCkgPT0gUERGT0JKX05VTUJFUikgewotICAgICAgICAgICAgbV9MYXN0WFJlZk9mZnNldCA9IHBUYWJsZS0+R2V0SW50ZWdlcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBtX3BMaW5lYXJpemVkLT5SZWxlYXNlKCk7Ci0gICAgbV9wTGluZWFyaXplZCA9IE5VTEw7CisKK0ZYX0JPT0wgQ1BERl9QYXJzZXI6OkxvYWRBbGxDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHhyZWZwb3MpIHsKKyAgaWYgKCFMb2FkQ3Jvc3NSZWZWNCh4cmVmcG9zLCAwLCBUUlVFKSkgewogICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX3BUcmFpbGVyID0gTG9hZFRyYWlsZXJWNCgpOworICBpZiAoIW1fcFRyYWlsZXIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpbnQzMl90IHhyZWZzaXplID0gR2V0RGlyZWN0SW50ZWdlcihtX3BUcmFpbGVyLCAiU2l6ZSIpOworICBpZiAoeHJlZnNpemUgPD0gMCB8fCB4cmVmc2l6ZSA+IGtNYXhYUmVmU2l6ZSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBTaHJpbmtPYmplY3RNYXAoeHJlZnNpemUpOworICBtX1Y1VHlwZS5TZXRTaXplKHhyZWZzaXplKTsKKyAgQ0ZYX0ZpbGVTaXplQXJyYXkgQ3Jvc3NSZWZMaXN0OworICBDRlhfRmlsZVNpemVBcnJheSBYUmVmU3RyZWFtTGlzdDsKKyAgQ3Jvc3NSZWZMaXN0LkFkZCh4cmVmcG9zKTsKKyAgWFJlZlN0cmVhbUxpc3QuQWRkKEdldERpcmVjdEludGVnZXIobV9wVHJhaWxlciwgIlhSZWZTdG0iKSk7CisKKyAgc3RkOjpzZXQ8RlhfRklMRVNJWkU+IHNlZW5feHJlZnBvczsKKyAgc2Vlbl94cmVmcG9zLmluc2VydCh4cmVmcG9zKTsKKyAgLy8gV2hlbiB8bV9wVHJhaWxlcnwgZG9lc24ndCBoYXZlIFByZXYgZW50cnkgb3IgUHJldiBlbnRyeSB2YWx1ZSBpcyBub3QKKyAgLy8gbnVtZXJpY2FsLCBHZXREaXJlY3RJbnRlZ2VyKCkgcmV0dXJucyAwLiBMb2FkaW5nIHdpbGwgZW5kLgorICB4cmVmcG9zID0gR2V0RGlyZWN0SW50ZWdlcihtX3BUcmFpbGVyLCAiUHJldiIpOworICB3aGlsZSAoeHJlZnBvcykgeworICAgIC8vIENoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzLgorICAgIGlmIChwZGZpdW06OkNvbnRhaW5zS2V5KHNlZW5feHJlZnBvcywgeHJlZnBvcykpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgc2Vlbl94cmVmcG9zLmluc2VydCh4cmVmcG9zKTsKKyAgICBDcm9zc1JlZkxpc3QuSW5zZXJ0QXQoMCwgeHJlZnBvcyk7CisgICAgTG9hZENyb3NzUmVmVjQoeHJlZnBvcywgMCwgVFJVRSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPENQREZfRGljdGlvbmFyeSwgUmVsZWFzZURlbGV0ZXI8Q1BERl9EaWN0aW9uYXJ5Pj4gcERpY3QoCisgICAgICAgIExvYWRUcmFpbGVyVjQoKSk7CisgICAgaWYgKCFwRGljdCkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB4cmVmcG9zID0gR2V0RGlyZWN0SW50ZWdlcihwRGljdC5nZXQoKSwgIlByZXYiKTsKKworICAgIFhSZWZTdHJlYW1MaXN0Lkluc2VydEF0KDAsIHBEaWN0LT5HZXRJbnRlZ2VyKCJYUmVmU3RtIikpOworICAgIG1fVHJhaWxlcnMuQWRkKHBEaWN0LnJlbGVhc2UoKSk7CisgIH0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgQ3Jvc3NSZWZMaXN0LkdldFNpemUoKTsgaSsrKSB7CisgICAgaWYgKCFMb2FkQ3Jvc3NSZWZWNChDcm9zc1JlZkxpc3RbaV0sIFhSZWZTdHJlYW1MaXN0W2ldLCBGQUxTRSkpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9EV09SRCBDUERGX1BhcnNlcjo6U3RhcnRBc3luUGFyc2UoSUZYX0ZpbGVSZWFkKiBwRmlsZUFjY2VzcywgRlhfQk9PTCBiUmVQYXJzZSwgRlhfQk9PTCBiT3duRmlsZVJlYWQpCi17Ci0gICAgQ2xvc2VQYXJzZXIoYlJlUGFyc2UpOwotICAgIG1fYlhSZWZTdHJlYW0gPSBGQUxTRTsKLSAgICBtX0xhc3RYUmVmT2Zmc2V0ID0gMDsKLSAgICBtX2JPd25GaWxlUmVhZCA9IGJPd25GaWxlUmVhZDsKLSAgICBGWF9JTlQzMiBvZmZzZXQgPSBHZXRIZWFkZXJPZmZzZXQocEZpbGVBY2Nlc3MpOwotICAgIGlmIChvZmZzZXQgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKK0ZYX0JPT0wgQ1BERl9QYXJzZXI6OkxvYWRMaW5lYXJpemVkQWxsQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSB4cmVmcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3T2JqQ291bnQpIHsKKyAgaWYgKCFMb2FkTGluZWFyaXplZENyb3NzUmVmVjQoeHJlZnBvcywgZHdPYmpDb3VudCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9wVHJhaWxlciA9IExvYWRUcmFpbGVyVjQoKTsKKyAgaWYgKCFtX3BUcmFpbGVyKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGludDMyX3QgeHJlZnNpemUgPSBHZXREaXJlY3RJbnRlZ2VyKG1fcFRyYWlsZXIsICJTaXplIik7CisgIGlmICh4cmVmc2l6ZSA9PSAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENGWF9GaWxlU2l6ZUFycmF5IENyb3NzUmVmTGlzdCwgWFJlZlN0cmVhbUxpc3Q7CisgIENyb3NzUmVmTGlzdC5BZGQoeHJlZnBvcyk7CisgIFhSZWZTdHJlYW1MaXN0LkFkZChHZXREaXJlY3RJbnRlZ2VyKG1fcFRyYWlsZXIsICJYUmVmU3RtIikpOworCisgIHN0ZDo6c2V0PEZYX0ZJTEVTSVpFPiBzZWVuX3hyZWZwb3M7CisgIHNlZW5feHJlZnBvcy5pbnNlcnQoeHJlZnBvcyk7CisgIHhyZWZwb3MgPSBHZXREaXJlY3RJbnRlZ2VyKG1fcFRyYWlsZXIsICJQcmV2Iik7CisgIHdoaWxlICh4cmVmcG9zKSB7CisgICAgLy8gQ2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMuCisgICAgaWYgKHBkZml1bTo6Q29udGFpbnNLZXkoc2Vlbl94cmVmcG9zLCB4cmVmcG9zKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBzZWVuX3hyZWZwb3MuaW5zZXJ0KHhyZWZwb3MpOworICAgIENyb3NzUmVmTGlzdC5JbnNlcnRBdCgwLCB4cmVmcG9zKTsKKyAgICBMb2FkQ3Jvc3NSZWZWNCh4cmVmcG9zLCAwLCBUUlVFKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9EaWN0aW9uYXJ5LCBSZWxlYXNlRGVsZXRlcjxDUERGX0RpY3Rpb25hcnk+PiBwRGljdCgKKyAgICAgICAgTG9hZFRyYWlsZXJWNCgpKTsKKyAgICBpZiAoIXBEaWN0KSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIGlmICghSXNMaW5lYXJpemVkRmlsZShwRmlsZUFjY2Vzcywgb2Zmc2V0KSkgewotICAgICAgICBtX1N5bnRheC5tX3BGaWxlQWNjZXNzID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIFN0YXJ0UGFyc2UocEZpbGVBY2Nlc3MsIGJSZVBhcnNlLCBiT3duRmlsZVJlYWQpOworICAgIHhyZWZwb3MgPSBHZXREaXJlY3RJbnRlZ2VyKHBEaWN0LmdldCgpLCAiUHJldiIpOworCisgICAgWFJlZlN0cmVhbUxpc3QuSW5zZXJ0QXQoMCwgcERpY3QtPkdldEludGVnZXIoIlhSZWZTdG0iKSk7CisgICAgbV9UcmFpbGVycy5BZGQocERpY3QucmVsZWFzZSgpKTsKKyAgfQorICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBDcm9zc1JlZkxpc3QuR2V0U2l6ZSgpOyBpKyspCisgICAgaWYgKCFMb2FkQ3Jvc3NSZWZWNChDcm9zc1JlZkxpc3RbaV0sIFhSZWZTdHJlYW1MaXN0W2ldLCBGQUxTRSkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgaWYgKCFiUmVQYXJzZSkgewotICAgICAgICBtX3BEb2N1bWVudCA9IG5ldyBDUERGX0RvY3VtZW50KHRoaXMpOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9QYXJzZXI6OkxvYWRMaW5lYXJpemVkQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdPYmpDb3VudCkgeworICBGWF9GSUxFU0laRSBkd1N0YXJ0UG9zID0gcG9zIC0gbV9TeW50YXgubV9IZWFkZXJPZmZzZXQ7CisgIG1fU3ludGF4LlJlc3RvcmVQb3MoZHdTdGFydFBvcyk7CisgIHZvaWQqIHBSZXN1bHQgPQorICAgICAgRlhTWVNfYnNlYXJjaCgmcG9zLCBtX1NvcnRlZE9mZnNldC5HZXREYXRhKCksIG1fU29ydGVkT2Zmc2V0LkdldFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZYX0ZJTEVTSVpFKSwgQ29tcGFyZUZpbGVTaXplKTsKKyAgaWYgKCFwUmVzdWx0KSB7CisgICAgbV9Tb3J0ZWRPZmZzZXQuQWRkKHBvcyk7CisgIH0KKyAgRlhfRFdPUkQgc3RhcnRfb2JqbnVtID0gMDsKKyAgRlhfRFdPUkQgY291bnQgPSBkd09iakNvdW50OworICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fU3ludGF4LlNhdmVQb3MoKTsKKyAgY29uc3QgaW50MzJfdCByZWNvcmRzaXplID0gMjA7CisgIHN0ZDo6dmVjdG9yPGNoYXI+IGJ1ZigxMDI0ICogcmVjb3Jkc2l6ZSArIDEpOworICBidWZbMTAyNCAqIHJlY29yZHNpemVdID0gJ1wwJzsKKyAgaW50MzJfdCBuQmxvY2tzID0gY291bnQgLyAxMDI0ICsgMTsKKyAgZm9yIChpbnQzMl90IGJsb2NrID0gMDsgYmxvY2sgPCBuQmxvY2tzOyBibG9jaysrKSB7CisgICAgaW50MzJfdCBibG9ja19zaXplID0gYmxvY2sgPT0gbkJsb2NrcyAtIDEgPyBjb3VudCAlIDEwMjQgOiAxMDI0OworICAgIEZYX0RXT1JEIGR3UmVhZFNpemUgPSBibG9ja19zaXplICogcmVjb3Jkc2l6ZTsKKyAgICBpZiAoKEZYX0ZJTEVTSVpFKShkd1N0YXJ0UG9zICsgZHdSZWFkU2l6ZSkgPiBtX1N5bnRheC5tX0ZpbGVMZW4pIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgRlhfRklMRVNJWkUgZHdGaXJzdFhSZWZPZmZzZXQgPSBtX1N5bnRheC5TYXZlUG9zKCk7Ci0gICAgRlhfQk9PTCBiWFJlZlJlYnVpbHQgPSBGQUxTRTsKLSAgICBGWF9CT09MIGJMb2FkVjQgPSBGQUxTRTsKLSAgICBpZiAoIShiTG9hZFY0ID0gTG9hZENyb3NzUmVmVjQoZHdGaXJzdFhSZWZPZmZzZXQsIDAsIEZBTFNFLCBGQUxTRSkpICYmICFMb2FkQ3Jvc3NSZWZWNShkd0ZpcnN0WFJlZk9mZnNldCwgZHdGaXJzdFhSZWZPZmZzZXQsIFRSVUUpKSB7Ci0gICAgICAgIGlmICghUmVidWlsZENyb3NzUmVmKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7CisgICAgaWYgKCFtX1N5bnRheC5SZWFkQmxvY2socmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYnVmLmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdSZWFkU2l6ZSkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYmxvY2tfc2l6ZTsgaSsrKSB7CisgICAgICBGWF9EV09SRCBvYmpudW0gPSBzdGFydF9vYmpudW0gKyBibG9jayAqIDEwMjQgKyBpOworICAgICAgY2hhciogcEVudHJ5ID0gJmJ1ZltpICogcmVjb3Jkc2l6ZV07CisgICAgICBpZiAocEVudHJ5WzE3XSA9PSAnZicpIHsKKyAgICAgICAgbV9PYmplY3RJbmZvW29iam51bV0ucG9zID0gMDsKKyAgICAgICAgbV9WNVR5cGUuU2V0QXRHcm93KG9iam51bSwgMCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQzMl90IG9mZnNldCA9IEZYU1lTX2F0b2kocEVudHJ5KTsKKyAgICAgICAgaWYgKG9mZnNldCA9PSAwKSB7CisgICAgICAgICAgZm9yIChpbnQzMl90IGMgPSAwOyBjIDwgMTA7IGMrKykgeworICAgICAgICAgICAgaWYgKCFzdGQ6OmlzZGlnaXQocEVudHJ5W2NdKSkKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBiWFJlZlJlYnVpbHQgPSBUUlVFOwotICAgICAgICBtX0xhc3RYUmVmT2Zmc2V0ID0gMDsKKyAgICAgICAgbV9PYmplY3RJbmZvW29iam51bV0ucG9zID0gb2Zmc2V0OworICAgICAgICBpbnQzMl90IHZlcnNpb24gPSBGWFNZU19hdG9pKHBFbnRyeSArIDExKTsKKyAgICAgICAgaWYgKHZlcnNpb24gPj0gMSkgeworICAgICAgICAgIG1fYlZlcnNpb25VcGRhdGVkID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgICBtX09ialZlcnNpb24uU2V0QXRHcm93KG9iam51bSwgdmVyc2lvbik7CisgICAgICAgIGlmIChtX09iamVjdEluZm9bb2JqbnVtXS5wb3MgPCBtX1N5bnRheC5tX0ZpbGVMZW4pIHsKKyAgICAgICAgICB2b2lkKiBwUmVzdWx0ID0gRlhTWVNfYnNlYXJjaCgKKyAgICAgICAgICAgICAgJm1fT2JqZWN0SW5mb1tvYmpudW1dLnBvcywgbV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLAorICAgICAgICAgICAgICBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksIENvbXBhcmVGaWxlU2l6ZSk7CisgICAgICAgICAgaWYgKCFwUmVzdWx0KSB7CisgICAgICAgICAgICBtX1NvcnRlZE9mZnNldC5BZGQobV9PYmplY3RJbmZvW29iam51bV0ucG9zKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbV9WNVR5cGUuU2V0QXRHcm93KG9iam51bSwgMSk7CisgICAgICB9CiAgICAgfQotICAgIGlmIChiTG9hZFY0KSB7Ci0gICAgICAgIG1fcFRyYWlsZXIgPSBMb2FkVHJhaWxlclY0KCk7Ci0gICAgICAgIGlmIChtX3BUcmFpbGVyID09IE5VTEwpIHsKKyAgfQorICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zICsgY291bnQgKiByZWNvcmRzaXplKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2Jvb2wgQ1BERl9QYXJzZXI6OkZpbmRQb3NJbk9mZnNldHMoRlhfRklMRVNJWkUgcG9zKSBjb25zdCB7CisgIHJldHVybiBGWFNZU19ic2VhcmNoKCZwb3MsIG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwgbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRlhfRklMRVNJWkUpLCBDb21wYXJlRmlsZVNpemUpOworfQorCitib29sIENQREZfUGFyc2VyOjpMb2FkQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBzdHJlYW1wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTa2lwKSB7CisgIG1fU3ludGF4LlJlc3RvcmVQb3MocG9zKTsKKyAgaWYgKG1fU3ludGF4LkdldEtleXdvcmQoKSAhPSAieHJlZiIpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICghRmluZFBvc0luT2Zmc2V0cyhwb3MpKQorICAgIG1fU29ydGVkT2Zmc2V0LkFkZChwb3MpOworCisgIGlmIChzdHJlYW1wb3MgJiYgIUZpbmRQb3NJbk9mZnNldHMoc3RyZWFtcG9zKSkKKyAgICAgIG1fU29ydGVkT2Zmc2V0LkFkZChzdHJlYW1wb3MpOworCisgIHdoaWxlICgxKSB7CisgICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1N5bnRheC5TYXZlUG9zKCk7CisgICAgYm9vbCBiSXNOdW1iZXI7CisgICAgQ0ZYX0J5dGVTdHJpbmcgd29yZCA9IG1fU3ludGF4LkdldE5leHRXb3JkKCZiSXNOdW1iZXIpOworICAgIGlmICh3b3JkLklzRW1wdHkoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghYklzTnVtYmVyKSB7CisgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBGWF9EV09SRCBzdGFydF9vYmpudW0gPSBGWFNZU19hdG9pKHdvcmQpOworICAgIGlmIChzdGFydF9vYmpudW0gPj0ga01heE9iamVjdE51bWJlcikKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEZYX0RXT1JEIGNvdW50ID0gbV9TeW50YXguR2V0RGlyZWN0TnVtKCk7CisgICAgbV9TeW50YXguVG9OZXh0V29yZCgpOworICAgIFNhdmVkUG9zID0gbV9TeW50YXguU2F2ZVBvcygpOworICAgIGNvbnN0IGludDMyX3QgcmVjb3Jkc2l6ZSA9IDIwOworICAgIG1fZHdYcmVmU3RhcnRPYmpOdW0gPSBzdGFydF9vYmpudW07CisgICAgaWYgKCFiU2tpcCkgeworICAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gYnVmKDEwMjQgKiByZWNvcmRzaXplICsgMSk7CisgICAgICBidWZbMTAyNCAqIHJlY29yZHNpemVdID0gJ1wwJzsKKyAgICAgIGludDMyX3QgbkJsb2NrcyA9IGNvdW50IC8gMTAyNCArIDE7CisgICAgICBmb3IgKGludDMyX3QgYmxvY2sgPSAwOyBibG9jayA8IG5CbG9ja3M7IGJsb2NrKyspIHsKKyAgICAgICAgaW50MzJfdCBibG9ja19zaXplID0gYmxvY2sgPT0gbkJsb2NrcyAtIDEgPyBjb3VudCAlIDEwMjQgOiAxMDI0OworICAgICAgICBtX1N5bnRheC5SZWFkQmxvY2socmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYnVmLmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19zaXplICogcmVjb3Jkc2l6ZSk7CisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGJsb2NrX3NpemU7IGkrKykgeworICAgICAgICAgIEZYX0RXT1JEIG9iam51bSA9IHN0YXJ0X29iam51bSArIGJsb2NrICogMTAyNCArIGk7CisgICAgICAgICAgY2hhciogcEVudHJ5ID0gJmJ1ZltpICogcmVjb3Jkc2l6ZV07CisgICAgICAgICAgaWYgKHBFbnRyeVsxN10gPT0gJ2YnKSB7CisgICAgICAgICAgICBtX09iamVjdEluZm9bb2JqbnVtXS5wb3MgPSAwOworICAgICAgICAgICAgbV9WNVR5cGUuU2V0QXRHcm93KG9iam51bSwgMCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IChGWF9GSUxFU0laRSlGWFNZU19hdG9pNjQocEVudHJ5KTsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gMCkgeworICAgICAgICAgICAgICBmb3IgKGludDMyX3QgYyA9IDA7IGMgPCAxMDsgYysrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzdGQ6OmlzZGlnaXQocEVudHJ5W2NdKSkKKyAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9PYmplY3RJbmZvW29iam51bV0ucG9zID0gb2Zmc2V0OworICAgICAgICAgICAgaW50MzJfdCB2ZXJzaW9uID0gRlhTWVNfYXRvaShwRW50cnkgKyAxMSk7CisgICAgICAgICAgICBpZiAodmVyc2lvbiA+PSAxKSB7CisgICAgICAgICAgICAgIG1fYlZlcnNpb25VcGRhdGVkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fT2JqVmVyc2lvbi5TZXRBdEdyb3cob2JqbnVtLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgIGlmIChtX09iamVjdEluZm9bb2JqbnVtXS5wb3MgPCBtX1N5bnRheC5tX0ZpbGVMZW4gJiYKKyAgICAgICAgICAgICAgICAhRmluZFBvc0luT2Zmc2V0cyhtX09iamVjdEluZm9bb2JqbnVtXS5wb3MpKSB7CisgICAgICAgICAgICAgIG1fU29ydGVkT2Zmc2V0LkFkZChtX09iamVjdEluZm9bb2JqbnVtXS5wb3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9WNVR5cGUuU2V0QXRHcm93KG9iam51bSwgMSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MgKyBjb3VudCAqIHJlY29yZHNpemUpOworICB9CisgIHJldHVybiAhc3RyZWFtcG9zIHx8IExvYWRDcm9zc1JlZlY1KCZzdHJlYW1wb3MsIEZBTFNFKTsKK30KKworRlhfQk9PTCBDUERGX1BhcnNlcjo6TG9hZEFsbENyb3NzUmVmVjUoRlhfRklMRVNJWkUgeHJlZnBvcykgeworICBpZiAoIUxvYWRDcm9zc1JlZlY1KCZ4cmVmcG9zLCBUUlVFKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBzdGQ6OnNldDxGWF9GSUxFU0laRT4gc2Vlbl94cmVmcG9zOworICB3aGlsZSAoeHJlZnBvcykgeworICAgIHNlZW5feHJlZnBvcy5pbnNlcnQoeHJlZnBvcyk7CisgICAgaWYgKCFMb2FkQ3Jvc3NSZWZWNSgmeHJlZnBvcywgRkFMU0UpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIC8vIENoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzLgorICAgIGlmIChwZGZpdW06OkNvbnRhaW5zS2V5KHNlZW5feHJlZnBvcywgeHJlZnBvcykpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKyAgbV9PYmplY3RTdHJlYW1NYXAuSW5pdEhhc2hUYWJsZSgxMDEsIEZBTFNFKTsKKyAgbV9iWFJlZlN0cmVhbSA9IFRSVUU7CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIENQREZfUGFyc2VyOjpSZWJ1aWxkQ3Jvc3NSZWYoKSB7CisgIG1fT2JqZWN0SW5mby5jbGVhcigpOworICBtX1Y1VHlwZS5SZW1vdmVBbGwoKTsKKyAgbV9Tb3J0ZWRPZmZzZXQuUmVtb3ZlQWxsKCk7CisgIG1fT2JqVmVyc2lvbi5SZW1vdmVBbGwoKTsKKyAgaWYgKG1fcFRyYWlsZXIpIHsKKyAgICBtX3BUcmFpbGVyLT5SZWxlYXNlKCk7CisgICAgbV9wVHJhaWxlciA9IE5VTEw7CisgIH0KKyAgaW50MzJfdCBzdGF0dXMgPSAwOworICBpbnQzMl90IGluc2lkZV9pbmRleCA9IDA7CisgIEZYX0RXT1JEIG9iam51bSA9IDA7CisgIEZYX0RXT1JEIGdlbm51bSA9IDA7CisgIGludDMyX3QgZGVwdGggPSAwOworICBjb25zdCBGWF9EV09SRCBrQnVmZmVyU2l6ZSA9IDQwOTY7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZmZlcihrQnVmZmVyU2l6ZSk7CisgIEZYX0ZJTEVTSVpFIHBvcyA9IG1fU3ludGF4Lm1fSGVhZGVyT2Zmc2V0OworICBGWF9GSUxFU0laRSBzdGFydF9wb3MgPSAwOworICBGWF9GSUxFU0laRSBzdGFydF9wb3MxID0gMDsKKyAgRlhfRklMRVNJWkUgbGFzdF9vYmogPSAtMTsKKyAgRlhfRklMRVNJWkUgbGFzdF94cmVmID0gLTE7CisgIEZYX0ZJTEVTSVpFIGxhc3RfdHJhaWxlciA9IC0xOworICB3aGlsZSAocG9zIDwgbV9TeW50YXgubV9GaWxlTGVuKSB7CisgICAgY29uc3QgRlhfRklMRVNJWkUgc2F2ZWRfcG9zID0gcG9zOworICAgIGJvb2wgYk92ZXJGbG93ID0gZmFsc2U7CisgICAgRlhfRFdPUkQgc2l6ZSA9IHN0ZDo6bWluKChGWF9EV09SRCkobV9TeW50YXgubV9GaWxlTGVuIC0gcG9zKSwga0J1ZmZlclNpemUpOworICAgIGlmICghbV9TeW50YXgubV9wRmlsZUFjY2Vzcy0+UmVhZEJsb2NrKGJ1ZmZlci5kYXRhKCksIHBvcywgc2l6ZSkpCisgICAgICBicmVhazsKKworICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgIHVpbnQ4X3QgYnl0ZSA9IGJ1ZmZlcltpXTsKKyAgICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBpZiAoUERGQ2hhcklzV2hpdGVzcGFjZShieXRlKSkKKyAgICAgICAgICAgIHN0YXR1cyA9IDE7CisKKyAgICAgICAgICBpZiAoc3RkOjppc2RpZ2l0KGJ5dGUpKSB7CisgICAgICAgICAgICAtLWk7CisgICAgICAgICAgICBzdGF0dXMgPSAxOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChieXRlID09ICclJykgeworICAgICAgICAgICAgaW5zaWRlX2luZGV4ID0gMDsKKyAgICAgICAgICAgIHN0YXR1cyA9IDk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGJ5dGUgPT0gJygnKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAxMDsKKyAgICAgICAgICAgIGRlcHRoID0gMTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoYnl0ZSA9PSAnPCcpIHsKKyAgICAgICAgICAgIGluc2lkZV9pbmRleCA9IDE7CisgICAgICAgICAgICBzdGF0dXMgPSAxMTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoYnl0ZSA9PSAnXFwnKQorICAgICAgICAgICAgc3RhdHVzID0gMTM7CisKKyAgICAgICAgICBpZiAoYnl0ZSA9PSAndCcpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IDc7CisgICAgICAgICAgICBpbnNpZGVfaW5kZXggPSAxOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIGlmIChQREZDaGFySXNXaGl0ZXNwYWNlKGJ5dGUpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9IGVsc2UgaWYgKHN0ZDo6aXNkaWdpdChieXRlKSkgeworICAgICAgICAgICAgc3RhcnRfcG9zID0gcG9zICsgaTsKKyAgICAgICAgICAgIHN0YXR1cyA9IDI7CisgICAgICAgICAgICBvYmpudW0gPSBGWFNZU190b0RlY2ltYWxEaWdpdChieXRlKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gJ3QnKSB7CisgICAgICAgICAgICBzdGF0dXMgPSA3OworICAgICAgICAgICAgaW5zaWRlX2luZGV4ID0gMTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gJ3gnKSB7CisgICAgICAgICAgICBzdGF0dXMgPSA4OworICAgICAgICAgICAgaW5zaWRlX2luZGV4ID0gMTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLS1pOworICAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICBpZiAoc3RkOjppc2RpZ2l0KGJ5dGUpKSB7CisgICAgICAgICAgICBvYmpudW0gPSBvYmpudW0gKiAxMCArIEZYU1lTX3RvRGVjaW1hbERpZ2l0KGJ5dGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfSBlbHNlIGlmIChQREZDaGFySXNXaGl0ZXNwYWNlKGJ5dGUpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAzOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAtLWk7CisgICAgICAgICAgICBzdGF0dXMgPSAxNDsKKyAgICAgICAgICAgIGluc2lkZV9pbmRleCA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgaWYgKHN0ZDo6aXNkaWdpdChieXRlKSkgeworICAgICAgICAgICAgc3RhcnRfcG9zMSA9IHBvcyArIGk7CisgICAgICAgICAgICBzdGF0dXMgPSA0OworICAgICAgICAgICAgZ2VubnVtID0gRlhTWVNfdG9EZWNpbWFsRGlnaXQoYnl0ZSk7CisgICAgICAgICAgfSBlbHNlIGlmIChQREZDaGFySXNXaGl0ZXNwYWNlKGJ5dGUpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gJ3QnKSB7CisgICAgICAgICAgICBzdGF0dXMgPSA3OworICAgICAgICAgICAgaW5zaWRlX2luZGV4ID0gMTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLS1pOworICAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICBpZiAoc3RkOjppc2RpZ2l0KGJ5dGUpKSB7CisgICAgICAgICAgICBnZW5udW0gPSBnZW5udW0gKiAxMCArIEZYU1lTX3RvRGVjaW1hbERpZ2l0KGJ5dGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfSBlbHNlIGlmIChQREZDaGFySXNXaGl0ZXNwYWNlKGJ5dGUpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSA1OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAtLWk7CisgICAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgIGlmIChieXRlID09ICdvJykgeworICAgICAgICAgICAgc3RhdHVzID0gNjsKKyAgICAgICAgICAgIGluc2lkZV9pbmRleCA9IDE7CisgICAgICAgICAgfSBlbHNlIGlmIChQREZDaGFySXNXaGl0ZXNwYWNlKGJ5dGUpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9IGVsc2UgaWYgKHN0ZDo6aXNkaWdpdChieXRlKSkgeworICAgICAgICAgICAgb2JqbnVtID0gZ2VubnVtOworICAgICAgICAgICAgZ2VubnVtID0gRlhTWVNfdG9EZWNpbWFsRGlnaXQoYnl0ZSk7CisgICAgICAgICAgICBzdGFydF9wb3MgPSBzdGFydF9wb3MxOworICAgICAgICAgICAgc3RhcnRfcG9zMSA9IHBvcyArIGk7CisgICAgICAgICAgICBzdGF0dXMgPSA0OworICAgICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA9PSAndCcpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IDc7CisgICAgICAgICAgICBpbnNpZGVfaW5kZXggPSAxOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAtLWk7CisgICAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgIHN3aXRjaCAoaW5zaWRlX2luZGV4KSB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgIGlmIChieXRlICE9ICdiJykgeworICAgICAgICAgICAgICAgIC0taTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluc2lkZV9pbmRleCsrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICBpZiAoYnl0ZSAhPSAnaicpIHsKKyAgICAgICAgICAgICAgICAtLWk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnNpZGVfaW5kZXgrKzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgaWYgKFBERkNoYXJJc1doaXRlc3BhY2UoYnl0ZSkgfHwgUERGQ2hhcklzRGVsaW1pdGVyKGJ5dGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKG9iam51bSA+IDB4MTAwMDAwMCkgeworICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvYmpfcG9zID0gc3RhcnRfcG9zIC0gbV9TeW50YXgubV9IZWFkZXJPZmZzZXQ7CisgICAgICAgICAgICAgICAgbGFzdF9vYmogPSBzdGFydF9wb3M7CisgICAgICAgICAgICAgICAgdm9pZCogcFJlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgIEZYU1lTX2JzZWFyY2goJm9ial9wb3MsIG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFyZUZpbGVTaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBSZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgIG1fU29ydGVkT2Zmc2V0LkFkZChvYmpfcG9zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2JqX2VuZCA9IDA7CisgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBPYmplY3QgPSBQYXJzZUluZGlyZWN0T2JqZWN0QXRCeVN0cmljdCgKKyAgICAgICAgICAgICAgICAgICAgbV9wRG9jdW1lbnQsIG9ial9wb3MsIG9iam51bSwgTlVMTCwgJm9ial9lbmQpOworICAgICAgICAgICAgICAgIGlmIChDUERGX1N0cmVhbSogcFN0cmVhbSA9IFRvU3RyZWFtKHBPYmplY3QpKSB7CisgICAgICAgICAgICAgICAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBTdHJlYW0tPkdldERpY3QoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHBEaWN0LT5LZXlFeGlzdCgiVHlwZSIpKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHBEaWN0LT5HZXRTdHJpbmcoIlR5cGUiKSA9PSAiWFJlZiIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBwRGljdC0+S2V5RXhpc3QoIlNpemUiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcFJvb3QgPSBwRGljdC0+R2V0RWxlbWVudCgiUm9vdCIpOworICAgICAgICAgICAgICAgICAgICAgIGlmIChwUm9vdCAmJiBwUm9vdC0+R2V0RGljdCgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBSb290LT5HZXREaWN0KCktPkdldEVsZW1lbnQoIlBhZ2VzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3BUcmFpbGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BUcmFpbGVyLT5SZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3BUcmFpbGVyID0gVG9EaWN0aW9uYXJ5KHBEaWN0LT5DbG9uZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhvYmpfcG9zKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBtX1N5bnRheC5GaW5kVGFnKCJvYmoiLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgbkxlbiA9IG9ial9lbmQgLSBvYmpfcG9zIC0gb2Zmc2V0OworICAgICAgICAgICAgICAgIGlmICgoRlhfRFdPUkQpbkxlbiA+IHNpemUgLSBpKSB7CisgICAgICAgICAgICAgICAgICBwb3MgPSBvYmpfZW5kICsgbV9TeW50YXgubV9IZWFkZXJPZmZzZXQ7CisgICAgICAgICAgICAgICAgICBiT3ZlckZsb3cgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBpICs9IChGWF9EV09SRCluTGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW1fT2JqZWN0SW5mby5lbXB0eSgpICYmIElzVmFsaWRPYmplY3ROdW1iZXIob2JqbnVtKSAmJgorICAgICAgICAgICAgICAgICAgICBtX09iamVjdEluZm9bb2JqbnVtXS5wb3MpIHsKKyAgICAgICAgICAgICAgICAgIGlmIChwT2JqZWN0KSB7CisgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG9sZGdlbiA9IG1fT2JqVmVyc2lvbi5HZXRBdChvYmpudW0pOworICAgICAgICAgICAgICAgICAgICBtX09iamVjdEluZm9bb2JqbnVtXS5wb3MgPSBvYmpfcG9zOworICAgICAgICAgICAgICAgICAgICBtX09ialZlcnNpb24uU2V0QXQob2JqbnVtLCAoaW50MTZfdClnZW5udW0pOworICAgICAgICAgICAgICAgICAgICBpZiAob2xkZ2VuICE9IGdlbm51bSkgeworICAgICAgICAgICAgICAgICAgICAgIG1fYlZlcnNpb25VcGRhdGVkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBtX09iamVjdEluZm9bb2JqbnVtXS5wb3MgPSBvYmpfcG9zOworICAgICAgICAgICAgICAgICAgbV9WNVR5cGUuU2V0QXRHcm93KG9iam51bSwgMSk7CisgICAgICAgICAgICAgICAgICBtX09ialZlcnNpb24uU2V0QXRHcm93KG9iam51bSwgKGludDE2X3QpZ2VubnVtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBPYmplY3QpIHsKKyAgICAgICAgICAgICAgICAgIHBPYmplY3QtPlJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgLS1pOworICAgICAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICBpZiAoaW5zaWRlX2luZGV4ID09IDcpIHsKKyAgICAgICAgICAgIGlmIChQREZDaGFySXNXaGl0ZXNwYWNlKGJ5dGUpIHx8IFBERkNoYXJJc0RlbGltaXRlcihieXRlKSkgeworICAgICAgICAgICAgICBsYXN0X3RyYWlsZXIgPSBwb3MgKyBpIC0gNzsKKyAgICAgICAgICAgICAgbV9TeW50YXguUmVzdG9yZVBvcyhwb3MgKyBpIC0gbV9TeW50YXgubV9IZWFkZXJPZmZzZXQpOworICAgICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiA9CisgICAgICAgICAgICAgICAgICBtX1N5bnRheC5HZXRPYmplY3QobV9wRG9jdW1lbnQsIDAsIDAsIG51bGxwdHIsIHRydWUpOworICAgICAgICAgICAgICBpZiAocE9iaikgeworICAgICAgICAgICAgICAgIGlmICghcE9iai0+SXNEaWN0aW9uYXJ5KCkgJiYgIXBPYmotPkFzU3RyZWFtKCkpIHsKKyAgICAgICAgICAgICAgICAgIHBPYmotPlJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwT2JqLT5Bc1N0cmVhbSgpOworICAgICAgICAgICAgICAgICAgaWYgKENQREZfRGljdGlvbmFyeSogcFRyYWlsZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtID8gcFN0cmVhbS0+R2V0RGljdCgpIDogcE9iai0+QXNEaWN0aW9uYXJ5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fcFRyYWlsZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcFJvb3QgPSBwVHJhaWxlci0+R2V0RWxlbWVudCgiUm9vdCIpOworICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVmZXJlbmNlKiBwUmVmID0gVG9SZWZlcmVuY2UocFJvb3QpOworICAgICAgICAgICAgICAgICAgICAgIGlmICghcFJvb3QgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHBSZWYgJiYgSXNWYWxpZE9iamVjdE51bWJlcihwUmVmLT5HZXRSZWZPYmpOdW0oKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fT2JqZWN0SW5mb1twUmVmLT5HZXRSZWZPYmpOdW0oKV0ucG9zICE9IDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGl0ID0gcFRyYWlsZXItPmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXQgIT0gcFRyYWlsZXItPmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXkgPSBpdC0+Zmlyc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwRWxlbWVudCA9IGl0LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3T2JqTnVtID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFbGVtZW50ID8gcEVsZW1lbnQtPkdldE9iak51bSgpIDogMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR3T2JqTnVtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wVHJhaWxlci0+U2V0QXRSZWZlcmVuY2Uoa2V5LCBtX3BEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd09iak51bSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wVHJhaWxlci0+U2V0QXQoa2V5LCBwRWxlbWVudC0+Q2xvbmUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBPYmotPlJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcE9iai0+UmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAocE9iai0+SXNTdHJlYW0oKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9wVHJhaWxlciA9IFRvRGljdGlvbmFyeShwVHJhaWxlci0+Q2xvbmUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwT2JqLT5SZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcFRyYWlsZXIgPSBwVHJhaWxlcjsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgZHdTYXZlUG9zID0gbV9TeW50YXguU2F2ZVBvcygpOworICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0cldvcmQgPSBtX1N5bnRheC5HZXRLZXl3b3JkKCk7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJXb3JkLkNvbXBhcmUoInN0YXJ0eHJlZiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJOdW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic09mZnNldCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9TeW50YXguR2V0TmV4dFdvcmQoJmJOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJOdW1iZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9MYXN0WFJlZk9mZnNldCA9IEZYU1lTX2F0b2koYnNPZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICBtX1N5bnRheC5SZXN0b3JlUG9zKGR3U2F2ZVBvcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBPYmotPlJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC0taTsKKyAgICAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgICAgICAgfSBlbHNlIGlmIChieXRlID09ICJ0cmFpbGVyIltpbnNpZGVfaW5kZXhdKSB7CisgICAgICAgICAgICBpbnNpZGVfaW5kZXgrKzsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLS1pOworICAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICBpZiAoaW5zaWRlX2luZGV4ID09IDQpIHsKKyAgICAgICAgICAgIGxhc3RfeHJlZiA9IHBvcyArIGkgLSA0OworICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gInhyZWYiW2luc2lkZV9pbmRleF0pIHsKKyAgICAgICAgICAgIGluc2lkZV9pbmRleCsrOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAtLWk7CisgICAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA5OgorICAgICAgICAgIGlmIChieXRlID09ICdccicgfHwgYnl0ZSA9PSAnXG4nKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICBpZiAoYnl0ZSA9PSAnKScpIHsKKyAgICAgICAgICAgIGlmIChkZXB0aCA+IDApIHsKKyAgICAgICAgICAgICAgZGVwdGgtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gJygnKSB7CisgICAgICAgICAgICBkZXB0aCsrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIWRlcHRoKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICBpZiAoYnl0ZSA9PSAnPicgfHwgKGJ5dGUgPT0gJzwnICYmIGluc2lkZV9pbmRleCA9PSAxKSkKKyAgICAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgICAgICAgaW5zaWRlX2luZGV4ID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICBpZiAoUERGQ2hhcklzRGVsaW1pdGVyKGJ5dGUpIHx8IFBERkNoYXJJc1doaXRlc3BhY2UoYnl0ZSkpIHsKKyAgICAgICAgICAgIC0taTsKKyAgICAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE0OgorICAgICAgICAgIGlmIChQREZDaGFySXNXaGl0ZXNwYWNlKGJ5dGUpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA9PSAnJScgfHwgYnl0ZSA9PSAnKCcgfHwgYnl0ZSA9PSAnPCcgfHwKKyAgICAgICAgICAgICAgICAgICAgIGJ5dGUgPT0gJ1xcJykgeworICAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICAgIC0taTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGluc2lkZV9pbmRleCA9PSA2KSB7CisgICAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICAgICAgLS1pOworICAgICAgICAgIH0gZWxzZSBpZiAoYnl0ZSA9PSAiZW5kb2JqIltpbnNpZGVfaW5kZXhdKSB7CisgICAgICAgICAgICBpbnNpZGVfaW5kZXgrKzsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoYk92ZXJGbG93KSB7CisgICAgICAgIHNpemUgPSAwOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcG9zICs9IHNpemU7CisKKyAgICAvLyBJZiB0aGUgcG9zaXRpb24gaGFzIG5vdCBjaGFuZ2VkIGF0IGFsbCBpbiBhIGxvb3AgaXRlcmF0aW9uLCB0aGVuIGJyZWFrCisgICAgLy8gb3V0IHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcGluZy4KKyAgICBpZiAocG9zID09IHNhdmVkX3BvcykKKyAgICAgIGJyZWFrOworICB9CisgIGlmIChsYXN0X3hyZWYgIT0gLTEgJiYgbGFzdF94cmVmID4gbGFzdF9vYmopIHsKKyAgICBsYXN0X3RyYWlsZXIgPSBsYXN0X3hyZWY7CisgIH0gZWxzZSBpZiAobGFzdF90cmFpbGVyID09IC0xIHx8IGxhc3RfeHJlZiA8IGxhc3Rfb2JqKSB7CisgICAgbGFzdF90cmFpbGVyID0gbV9TeW50YXgubV9GaWxlTGVuOworICB9CisgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IGxhc3RfdHJhaWxlciAtIG1fU3ludGF4Lm1fSGVhZGVyT2Zmc2V0OworICB2b2lkKiBwUmVzdWx0ID0KKyAgICAgIEZYU1lTX2JzZWFyY2goJm9mZnNldCwgbV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLCBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihGWF9GSUxFU0laRSksIENvbXBhcmVGaWxlU2l6ZSk7CisgIGlmICghcFJlc3VsdCkgeworICAgIG1fU29ydGVkT2Zmc2V0LkFkZChvZmZzZXQpOworICB9CisgIHJldHVybiBtX3BUcmFpbGVyICYmICFtX09iamVjdEluZm8uZW1wdHkoKTsKK30KKworRlhfQk9PTCBDUERGX1BhcnNlcjo6TG9hZENyb3NzUmVmVjUoRlhfRklMRVNJWkUqIHBvcywgRlhfQk9PTCBiTWFpblhSZWYpIHsKKyAgQ1BERl9PYmplY3QqIHBPYmplY3QgPSBQYXJzZUluZGlyZWN0T2JqZWN0QXQobV9wRG9jdW1lbnQsICpwb3MsIDAsIG51bGxwdHIpOworICBpZiAoIXBPYmplY3QpCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAobV9wRG9jdW1lbnQpIHsKKyAgICBGWF9CT09MIGJJbnNlcnRlZCA9IEZBTFNFOworICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpOworICAgIGlmICghcERpY3QgfHwgcERpY3QtPkdldE9iak51bSgpICE9IHBPYmplY3QtPm1fT2JqTnVtKSB7CisgICAgICBiSW5zZXJ0ZWQgPSBtX3BEb2N1bWVudC0+SW5zZXJ0SW5kaXJlY3RPYmplY3QocE9iamVjdC0+bV9PYmpOdW0sIHBPYmplY3QpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAocE9iamVjdC0+SXNTdHJlYW0oKSkKKyAgICAgICAgcE9iamVjdC0+UmVsZWFzZSgpOworICAgIH0KKyAgICBpZiAoIWJJbnNlcnRlZCkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gcE9iamVjdC0+QXNTdHJlYW0oKTsKKyAgaWYgKCFwU3RyZWFtKQorICAgIHJldHVybiBGQUxTRTsKKworICAqcG9zID0gcFN0cmVhbS0+R2V0RGljdCgpLT5HZXRJbnRlZ2VyKCJQcmV2Iik7CisgIGludDMyX3Qgc2l6ZSA9IHBTdHJlYW0tPkdldERpY3QoKS0+R2V0SW50ZWdlcigiU2l6ZSIpOworICBpZiAoc2l6ZSA8IDApIHsKKyAgICBwU3RyZWFtLT5SZWxlYXNlKCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChiTWFpblhSZWYpIHsKKyAgICBtX3BUcmFpbGVyID0gVG9EaWN0aW9uYXJ5KHBTdHJlYW0tPkdldERpY3QoKS0+Q2xvbmUoKSk7CisgICAgU2hyaW5rT2JqZWN0TWFwKHNpemUpOworICAgIGlmIChtX1Y1VHlwZS5TZXRTaXplKHNpemUpKSB7CisgICAgICBGWFNZU19tZW1zZXQobV9WNVR5cGUuR2V0RGF0YSgpLCAwLCBzaXplKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbV9UcmFpbGVycy5BZGQoVG9EaWN0aW9uYXJ5KHBTdHJlYW0tPkdldERpY3QoKS0+Q2xvbmUoKSkpOworICB9CisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90PiA+IGFyckluZGV4OworICBDUERGX0FycmF5KiBwQXJyYXkgPSBwU3RyZWFtLT5HZXREaWN0KCktPkdldEFycmF5KCJJbmRleCIpOworICBpZiAocEFycmF5KSB7CisgICAgRlhfRFdPUkQgblBhaXJTaXplID0gcEFycmF5LT5HZXRDb3VudCgpIC8gMjsKKyAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgblBhaXJTaXplOyBpKyspIHsKKyAgICAgIENQREZfT2JqZWN0KiBwU3RhcnROdW1PYmogPSBwQXJyYXktPkdldEVsZW1lbnQoaSAqIDIpOworICAgICAgQ1BERl9PYmplY3QqIHBDb3VudE9iaiA9IHBBcnJheS0+R2V0RWxlbWVudChpICogMiArIDEpOworICAgICAgaWYgKFRvTnVtYmVyKHBTdGFydE51bU9iaikgJiYgVG9OdW1iZXIocENvdW50T2JqKSkgeworICAgICAgICBpbnQgblN0YXJ0TnVtID0gcFN0YXJ0TnVtT2JqLT5HZXRJbnRlZ2VyKCk7CisgICAgICAgIGludCBuQ291bnQgPSBwQ291bnRPYmotPkdldEludGVnZXIoKTsKKyAgICAgICAgaWYgKG5TdGFydE51bSA+PSAwICYmIG5Db3VudCA+IDApIHsKKyAgICAgICAgICBhcnJJbmRleC5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoblN0YXJ0TnVtLCBuQ291bnQpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoYXJySW5kZXguc2l6ZSgpID09IDApIHsKKyAgICBhcnJJbmRleC5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoMCwgc2l6ZSkpOworICB9CisgIHBBcnJheSA9IHBTdHJlYW0tPkdldERpY3QoKS0+R2V0QXJyYXkoIlciKTsKKyAgaWYgKCFwQXJyYXkpIHsKKyAgICBwU3RyZWFtLT5SZWxlYXNlKCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENGWF9EV29yZEFycmF5IFdpZHRoQXJyYXk7CisgIEZYX1NBRkVfRFdPUkQgZHdBY2NXaWR0aCA9IDA7CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwQXJyYXktPkdldENvdW50KCk7IGkrKykgeworICAgIFdpZHRoQXJyYXkuQWRkKHBBcnJheS0+R2V0SW50ZWdlcihpKSk7CisgICAgZHdBY2NXaWR0aCArPSBXaWR0aEFycmF5W2ldOworICB9CisgIGlmICghZHdBY2NXaWR0aC5Jc1ZhbGlkKCkgfHwgV2lkdGhBcnJheS5HZXRTaXplKCkgPCAzKSB7CisgICAgcFN0cmVhbS0+UmVsZWFzZSgpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9EV09SRCB0b3RhbFdpZHRoID0gZHdBY2NXaWR0aC5WYWx1ZU9yRGllKCk7CisgIENQREZfU3RyZWFtQWNjIGFjYzsKKyAgYWNjLkxvYWRBbGxEYXRhKHBTdHJlYW0pOworICBjb25zdCB1aW50OF90KiBwRGF0YSA9IGFjYy5HZXREYXRhKCk7CisgIEZYX0RXT1JEIGR3VG90YWxTaXplID0gYWNjLkdldFNpemUoKTsKKyAgRlhfRFdPUkQgc2VnaW5kZXggPSAwOworICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgYXJySW5kZXguc2l6ZSgpOyBpKyspIHsKKyAgICBpbnQzMl90IHN0YXJ0bnVtID0gYXJySW5kZXhbaV0uZmlyc3Q7CisgICAgaWYgKHN0YXJ0bnVtIDwgMCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIG1fZHdYcmVmU3RhcnRPYmpOdW0gPQorICAgICAgICBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxGWF9EV09SRCwgaW50MzJfdD4oc3RhcnRudW0pOworICAgIEZYX0RXT1JEIGNvdW50ID0KKyAgICAgICAgcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlhfRFdPUkQsIGludDMyX3Q+KGFyckluZGV4W2ldLnNlY29uZCk7CisgICAgRlhfU0FGRV9EV09SRCBkd0NhY3VsYXRlZFNpemUgPSBzZWdpbmRleDsKKyAgICBkd0NhY3VsYXRlZFNpemUgKz0gY291bnQ7CisgICAgZHdDYWN1bGF0ZWRTaXplICo9IHRvdGFsV2lkdGg7CisgICAgaWYgKCFkd0NhY3VsYXRlZFNpemUuSXNWYWxpZCgpIHx8CisgICAgICAgIGR3Q2FjdWxhdGVkU2l6ZS5WYWx1ZU9yRGllKCkgPiBkd1RvdGFsU2l6ZSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGNvbnN0IHVpbnQ4X3QqIHNlZ3N0YXJ0ID0gcERhdGEgKyBzZWdpbmRleCAqIHRvdGFsV2lkdGg7CisgICAgRlhfU0FGRV9EV09SRCBkd01heE9iak51bSA9IHN0YXJ0bnVtOworICAgIGR3TWF4T2JqTnVtICs9IGNvdW50OworICAgIEZYX0RXT1JEIGR3VjVTaXplID0KKyAgICAgICAgcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlhfRFdPUkQsIGludDMyX3Q+KG1fVjVUeXBlLkdldFNpemUoKSk7CisgICAgaWYgKCFkd01heE9iak51bS5Jc1ZhbGlkKCkgfHwgZHdNYXhPYmpOdW0uVmFsdWVPckRpZSgpID4gZHdWNVNpemUpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBmb3IgKEZYX0RXT1JEIGogPSAwOyBqIDwgY291bnQ7IGorKykgeworICAgICAgaW50MzJfdCB0eXBlID0gMTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIGVudHJ5c3RhcnQgPSBzZWdzdGFydCArIGogKiB0b3RhbFdpZHRoOworICAgICAgaWYgKFdpZHRoQXJyYXlbMF0pIHsKKyAgICAgICAgdHlwZSA9IEdldFZhckludChlbnRyeXN0YXJ0LCBXaWR0aEFycmF5WzBdKTsKKyAgICAgIH0KKyAgICAgIGlmIChtX1Y1VHlwZVtzdGFydG51bSArIGpdID09IDI1NSkgeworICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQgPQorICAgICAgICAgICAgR2V0VmFySW50KGVudHJ5c3RhcnQgKyBXaWR0aEFycmF5WzBdLCBXaWR0aEFycmF5WzFdKTsKKyAgICAgICAgbV9PYmplY3RJbmZvW3N0YXJ0bnVtICsgal0ucG9zID0gb2Zmc2V0OworICAgICAgICB2b2lkKiBwUmVzdWx0ID0gRlhTWVNfYnNlYXJjaCgmb2Zmc2V0LCBtX1NvcnRlZE9mZnNldC5HZXREYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fU29ydGVkT2Zmc2V0LkdldFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZYX0ZJTEVTSVpFKSwgQ29tcGFyZUZpbGVTaXplKTsKKyAgICAgICAgaWYgKCFwUmVzdWx0KSB7CisgICAgICAgICAgbV9Tb3J0ZWRPZmZzZXQuQWRkKG9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAobV9WNVR5cGVbc3RhcnRudW0gKyBqXSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIG1fVjVUeXBlW3N0YXJ0bnVtICsgal0gPSB0eXBlOworICAgICAgaWYgKHR5cGUgPT0gMCkgeworICAgICAgICBtX09iamVjdEluZm9bc3RhcnRudW0gKyBqXS5wb3MgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0KKyAgICAgICAgICAgIEdldFZhckludChlbnRyeXN0YXJ0ICsgV2lkdGhBcnJheVswXSwgV2lkdGhBcnJheVsxXSk7CisgICAgICAgIG1fT2JqZWN0SW5mb1tzdGFydG51bSArIGpdLnBvcyA9IG9mZnNldDsKKyAgICAgICAgaWYgKHR5cGUgPT0gMSkgeworICAgICAgICAgIHZvaWQqIHBSZXN1bHQgPSBGWFNZU19ic2VhcmNoKCZvZmZzZXQsIG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZYX0ZJTEVTSVpFKSwgQ29tcGFyZUZpbGVTaXplKTsKKyAgICAgICAgICBpZiAoIXBSZXN1bHQpIHsKKyAgICAgICAgICAgIG1fU29ydGVkT2Zmc2V0LkFkZChvZmZzZXQpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gbV9WNVR5cGUuR2V0U2l6ZSgpKSB7CisgICAgICAgICAgICBwU3RyZWFtLT5SZWxlYXNlKCk7CiAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgfQorICAgICAgICAgIG1fVjVUeXBlW29mZnNldF0gPSAyNTU7CiAgICAgICAgIH0KLSAgICAgICAgRlhfSU5UMzIgeHJlZnNpemUgPSBHZXREaXJlY3RJbnRlZ2VyKG1fcFRyYWlsZXIsIEZYX0JTVFJDKCJTaXplIikpOwotICAgICAgICBpZiAoeHJlZnNpemUgPiAwKSB7Ci0gICAgICAgICAgICBtX0Nyb3NzUmVmLlNldFNpemUoeHJlZnNpemUpOwotICAgICAgICAgICAgbV9WNVR5cGUuU2V0U2l6ZSh4cmVmc2l6ZSk7Ci0gICAgICAgIH0KKyAgICAgIH0KICAgICB9Ci0gICAgRlhfRFdPUkQgZHdSZXQgPSBTZXRFbmNyeXB0SGFuZGxlcigpOworICAgIHNlZ2luZGV4ICs9IGNvdW50OworICB9CisgIHBTdHJlYW0tPlJlbGVhc2UoKTsKKyAgcmV0dXJuIFRSVUU7Cit9CitDUERGX0FycmF5KiBDUERGX1BhcnNlcjo6R2V0SURBcnJheSgpIHsKKyAgQ1BERl9PYmplY3QqIHBJRCA9IG1fcFRyYWlsZXIgPyBtX3BUcmFpbGVyLT5HZXRFbGVtZW50KCJJRCIpIDogTlVMTDsKKyAgaWYgKCFwSUQpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgaWYgKENQREZfUmVmZXJlbmNlKiBwUmVmID0gcElELT5Bc1JlZmVyZW5jZSgpKSB7CisgICAgcElEID0gUGFyc2VJbmRpcmVjdE9iamVjdChudWxscHRyLCBwUmVmLT5HZXRSZWZPYmpOdW0oKSk7CisgICAgbV9wVHJhaWxlci0+U2V0QXQoIklEIiwgcElEKTsKKyAgfQorICByZXR1cm4gVG9BcnJheShwSUQpOworfQorRlhfRFdPUkQgQ1BERl9QYXJzZXI6OkdldFJvb3RPYmpOdW0oKSB7CisgIENQREZfUmVmZXJlbmNlKiBwUmVmID0KKyAgICAgIFRvUmVmZXJlbmNlKG1fcFRyYWlsZXIgPyBtX3BUcmFpbGVyLT5HZXRFbGVtZW50KCJSb290IikgOiBudWxscHRyKTsKKyAgcmV0dXJuIHBSZWYgPyBwUmVmLT5HZXRSZWZPYmpOdW0oKSA6IDA7Cit9CitGWF9EV09SRCBDUERGX1BhcnNlcjo6R2V0SW5mb09iak51bSgpIHsKKyAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPQorICAgICAgVG9SZWZlcmVuY2UobV9wVHJhaWxlciA/IG1fcFRyYWlsZXItPkdldEVsZW1lbnQoIkluZm8iKSA6IG51bGxwdHIpOworICByZXR1cm4gcFJlZiA/IHBSZWYtPkdldFJlZk9iak51bSgpIDogMDsKK30KK0ZYX0JPT0wgQ1BERl9QYXJzZXI6OklzRm9ybVN0cmVhbShGWF9EV09SRCBvYmpudW0sIEZYX0JPT0wmIGJGb3JtKSB7CisgIGJGb3JtID0gRkFMU0U7CisgIGlmICghSXNWYWxpZE9iamVjdE51bWJlcihvYmpudW0pKQorICAgIHJldHVybiBUUlVFOworICBpZiAobV9WNVR5cGVbb2JqbnVtXSA9PSAwKQorICAgIHJldHVybiBUUlVFOworICBpZiAobV9WNVR5cGVbb2JqbnVtXSA9PSAyKQorICAgIHJldHVybiBUUlVFOworICBGWF9GSUxFU0laRSBwb3MgPSBtX09iamVjdEluZm9bb2JqbnVtXS5wb3M7CisgIHZvaWQqIHBSZXN1bHQgPQorICAgICAgRlhTWVNfYnNlYXJjaCgmcG9zLCBtX1NvcnRlZE9mZnNldC5HZXREYXRhKCksIG1fU29ydGVkT2Zmc2V0LkdldFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZYX0ZJTEVTSVpFKSwgQ29tcGFyZUZpbGVTaXplKTsKKyAgaWYgKCFwUmVzdWx0KSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKChGWF9GSUxFU0laRSopcFJlc3VsdCAtIChGWF9GSUxFU0laRSopbV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpID09CisgICAgICBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCkgLSAxKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX0ZJTEVTSVpFIHNpemUgPSAoKEZYX0ZJTEVTSVpFKilwUmVzdWx0KVsxXSAtIHBvczsKKyAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1N5bnRheC5TYXZlUG9zKCk7CisgIG1fU3ludGF4LlJlc3RvcmVQb3MocG9zKTsKKyAgY29uc3QgY2hhciBrRm9ybVN0cmVhbVtdID0gIi9Gb3JtXDBzdHJlYW0iOworICBjb25zdCBDRlhfQnl0ZVN0cmluZ0Mga0Zvcm1TdHJlYW1TdHIoa0Zvcm1TdHJlYW0sIHNpemVvZihrRm9ybVN0cmVhbSkgLSAxKTsKKyAgYkZvcm0gPSBtX1N5bnRheC5TZWFyY2hNdWx0aVdvcmQoa0Zvcm1TdHJlYW1TdHIsIFRSVUUsIHNpemUpID09IDA7CisgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOworICByZXR1cm4gVFJVRTsKK30KKworQ1BERl9PYmplY3QqIENQREZfUGFyc2VyOjpQYXJzZUluZGlyZWN0T2JqZWN0KAorICAgIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIqIHBPYmpMaXN0LAorICAgIEZYX0RXT1JEIG9iam51bSwKKyAgICBQQVJTRV9DT05URVhUKiBwQ29udGV4dCkgeworICBpZiAoIUlzVmFsaWRPYmplY3ROdW1iZXIob2JqbnVtKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICAvLyBQcmV2ZW50IGNpcmN1bGFyIHBhcnNpbmcgdGhlIHNhbWUgb2JqZWN0LgorICBpZiAocGRmaXVtOjpDb250YWluc0tleShtX1BhcnNpbmdPYmpOdW1zLCBvYmpudW0pKQorICAgIHJldHVybiBudWxscHRyOworICBTY29wZWRTZXRJbnNlcnRpb248RlhfRFdPUkQ+IGxvY2FsX2luc2VydCgmbV9QYXJzaW5nT2JqTnVtcywgb2JqbnVtKTsKKworICBpZiAobV9WNVR5cGVbb2JqbnVtXSA9PSAxIHx8IG1fVjVUeXBlW29iam51bV0gPT0gMjU1KSB7CisgICAgRlhfRklMRVNJWkUgcG9zID0gbV9PYmplY3RJbmZvW29iam51bV0ucG9zOworICAgIGlmIChwb3MgPD0gMCkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBQYXJzZUluZGlyZWN0T2JqZWN0QXQocE9iakxpc3QsIHBvcywgb2JqbnVtLCBwQ29udGV4dCk7CisgIH0KKyAgaWYgKG1fVjVUeXBlW29iam51bV0gIT0gMikKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBDUERGX1N0cmVhbUFjYyogcE9ialN0cmVhbSA9IEdldE9iamVjdFN0cmVhbShtX09iamVjdEluZm9bb2JqbnVtXS5wb3MpOworICBpZiAoIXBPYmpTdHJlYW0pCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgU2NvcGVkRmlsZVN0cmVhbSBmaWxlKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbSgKKyAgICAgICh1aW50OF90KilwT2JqU3RyZWFtLT5HZXREYXRhKCksIChzaXplX3QpcE9ialN0cmVhbS0+R2V0U2l6ZSgpLCBGQUxTRSkpOworICBDUERGX1N5bnRheFBhcnNlciBzeW50YXg7CisgIHN5bnRheC5Jbml0UGFyc2VyKGZpbGUuZ2V0KCksIDApOworICBjb25zdCBpbnQzMl90IG9mZnNldCA9IEdldFN0cmVhbUZpcnN0KHBPYmpTdHJlYW0pOworCisgIC8vIFJlYWQgb2JqZWN0IG51bWJlcnMgZnJvbSB8cE9ialN0cmVhbXwgaW50byBhIGNhY2hlLgorICBpZiAoIXBkZml1bTo6Q29udGFpbnNLZXkobV9PYmpDYWNoZSwgcE9ialN0cmVhbSkpIHsKKyAgICBmb3IgKGludDMyX3QgaSA9IEdldFN0cmVhbU5Db3VudChwT2JqU3RyZWFtKTsgaSA+IDA7IC0taSkgeworICAgICAgRlhfRFdPUkQgdGhpc251bSA9IHN5bnRheC5HZXREaXJlY3ROdW0oKTsKKyAgICAgIEZYX0RXT1JEIHRoaXNvZmYgPSBzeW50YXguR2V0RGlyZWN0TnVtKCk7CisgICAgICBtX09iakNhY2hlW3BPYmpTdHJlYW1dW3RoaXNudW1dID0gdGhpc29mZjsKKyAgICB9CisgIH0KKworICBjb25zdCBhdXRvIGl0ID0gbV9PYmpDYWNoZVtwT2JqU3RyZWFtXS5maW5kKG9iam51bSk7CisgIGlmIChpdCA9PSBtX09iakNhY2hlW3BPYmpTdHJlYW1dLmVuZCgpKQorICAgIHJldHVybiBudWxscHRyOworCisgIHN5bnRheC5SZXN0b3JlUG9zKG9mZnNldCArIGl0LT5zZWNvbmQpOworICByZXR1cm4gc3ludGF4LkdldE9iamVjdChwT2JqTGlzdCwgMCwgMCwgcENvbnRleHQsIHRydWUpOworfQorCitDUERGX1N0cmVhbUFjYyogQ1BERl9QYXJzZXI6OkdldE9iamVjdFN0cmVhbShGWF9EV09SRCBvYmpudW0pIHsKKyAgQ1BERl9TdHJlYW1BY2MqIHBTdHJlYW1BY2MgPSBudWxscHRyOworICBpZiAobV9PYmplY3RTdHJlYW1NYXAuTG9va3VwKCh2b2lkKikodWludHB0cl90KW9iam51bSwgKHZvaWQqJilwU3RyZWFtQWNjKSkKKyAgICByZXR1cm4gcFN0cmVhbUFjYzsKKworICBjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSA9IFRvU3RyZWFtKAorICAgICAgbV9wRG9jdW1lbnQgPyBtX3BEb2N1bWVudC0+R2V0SW5kaXJlY3RPYmplY3Qob2JqbnVtLCBudWxscHRyKSA6IG51bGxwdHIpOworICBpZiAoIXBTdHJlYW0pCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgcFN0cmVhbUFjYyA9IG5ldyBDUERGX1N0cmVhbUFjYzsKKyAgcFN0cmVhbUFjYy0+TG9hZEFsbERhdGEocFN0cmVhbSk7CisgIG1fT2JqZWN0U3RyZWFtTWFwLlNldEF0KCh2b2lkKikodWludHB0cl90KW9iam51bSwgcFN0cmVhbUFjYyk7CisgIHJldHVybiBwU3RyZWFtQWNjOworfQorCitGWF9GSUxFU0laRSBDUERGX1BhcnNlcjo6R2V0T2JqZWN0U2l6ZShGWF9EV09SRCBvYmpudW0pIGNvbnN0IHsKKyAgaWYgKCFJc1ZhbGlkT2JqZWN0TnVtYmVyKG9iam51bSkpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKG1fVjVUeXBlW29iam51bV0gPT0gMikKKyAgICBvYmpudW0gPSBHZXRPYmplY3RQb3NpdGlvbk9yWmVybyhvYmpudW0pOworCisgIGlmIChtX1Y1VHlwZVtvYmpudW1dID09IDEgfHwgbV9WNVR5cGVbb2JqbnVtXSA9PSAyNTUpIHsKKyAgICBGWF9GSUxFU0laRSBvZmZzZXQgPSBHZXRPYmplY3RQb3NpdGlvbk9yWmVybyhvYmpudW0pOworICAgIGlmIChvZmZzZXQgPT0gMCkKKyAgICAgIHJldHVybiAwOworCisgICAgRlhfRklMRVNJWkUqIHBSZXN1bHQgPSBzdGF0aWNfY2FzdDxGWF9GSUxFU0laRSo+KEZYU1lTX2JzZWFyY2goCisgICAgICAgICZvZmZzZXQsIG1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwgbV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLAorICAgICAgICBzaXplb2YoRlhfRklMRVNJWkUpLCBDb21wYXJlRmlsZVNpemUpKTsKKyAgICBpZiAoIXBSZXN1bHQpCisgICAgICByZXR1cm4gMDsKKworICAgIGlmIChwUmVzdWx0IC0gbV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpID09IG1fU29ydGVkT2Zmc2V0LkdldFNpemUoKSAtIDEpCisgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBwUmVzdWx0WzFdIC0gb2Zmc2V0OworICB9CisgIHJldHVybiAwOworfQorCit2b2lkIENQREZfUGFyc2VyOjpHZXRJbmRpcmVjdEJpbmFyeShGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBzaXplKSB7CisgIHBCdWZmZXIgPSBOVUxMOworICBzaXplID0gMDsKKyAgaWYgKCFJc1ZhbGlkT2JqZWN0TnVtYmVyKG9iam51bSkpCisgICAgcmV0dXJuOworCisgIGlmIChtX1Y1VHlwZVtvYmpudW1dID09IDIpIHsKKyAgICBDUERGX1N0cmVhbUFjYyogcE9ialN0cmVhbSA9IEdldE9iamVjdFN0cmVhbShtX09iamVjdEluZm9bb2JqbnVtXS5wb3MpOworICAgIGlmICghcE9ialN0cmVhbSkKKyAgICAgIHJldHVybjsKKworICAgIGludDMyX3Qgb2Zmc2V0ID0gR2V0U3RyZWFtRmlyc3QocE9ialN0cmVhbSk7CisgICAgY29uc3QgdWludDhfdCogcERhdGEgPSBwT2JqU3RyZWFtLT5HZXREYXRhKCk7CisgICAgRlhfRFdPUkQgdG90YWxzaXplID0gcE9ialN0cmVhbS0+R2V0U2l6ZSgpOworICAgIFNjb3BlZEZpbGVTdHJlYW0gZmlsZSgKKyAgICAgICAgRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKCh1aW50OF90KilwRGF0YSwgKHNpemVfdCl0b3RhbHNpemUsIEZBTFNFKSk7CisgICAgQ1BERl9TeW50YXhQYXJzZXIgc3ludGF4OworICAgIHN5bnRheC5Jbml0UGFyc2VyKGZpbGUuZ2V0KCksIDApOworICAgIGZvciAoaW50IGkgPSBHZXRTdHJlYW1OQ291bnQocE9ialN0cmVhbSk7IGkgPiAwOyAtLWkpIHsKKyAgICAgIEZYX0RXT1JEIHRoaXNudW0gPSBzeW50YXguR2V0RGlyZWN0TnVtKCk7CisgICAgICBGWF9EV09SRCB0aGlzb2ZmID0gc3ludGF4LkdldERpcmVjdE51bSgpOworICAgICAgaWYgKHRoaXNudW0gIT0gb2JqbnVtKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgaWYgKGkgPT0gMSkgeworICAgICAgICBzaXplID0gdG90YWxzaXplIC0gKHRoaXNvZmYgKyBvZmZzZXQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3ludGF4LkdldERpcmVjdE51bSgpOyAgLy8gU2tpcCBuZXh0bnVtLgorICAgICAgICBGWF9EV09SRCBuZXh0b2ZmID0gc3ludGF4LkdldERpcmVjdE51bSgpOworICAgICAgICBzaXplID0gbmV4dG9mZiAtIHRoaXNvZmY7CisgICAgICB9CisgICAgICBwQnVmZmVyID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7CisgICAgICBGWFNZU19tZW1jcHkocEJ1ZmZlciwgcERhdGEgKyB0aGlzb2ZmICsgb2Zmc2V0LCBzaXplKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKG1fVjVUeXBlW29iam51bV0gIT0gMSkKKyAgICByZXR1cm47CisKKyAgRlhfRklMRVNJWkUgcG9zID0gbV9PYmplY3RJbmZvW29iam51bV0ucG9zOworICBpZiAocG9zID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1N5bnRheC5TYXZlUG9zKCk7CisgIG1fU3ludGF4LlJlc3RvcmVQb3MocG9zKTsKKyAgYm9vbCBiSXNOdW1iZXI7CisgIENGWF9CeXRlU3RyaW5nIHdvcmQgPSBtX1N5bnRheC5HZXROZXh0V29yZCgmYklzTnVtYmVyKTsKKyAgaWYgKCFiSXNOdW1iZXIpIHsKKyAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfRFdPUkQgcGFyc2VyX29iam51bSA9IEZYU1lTX2F0b2kod29yZCk7CisgIGlmIChwYXJzZXJfb2JqbnVtICYmIHBhcnNlcl9vYmpudW0gIT0gb2JqbnVtKSB7CisgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7CisgICAgcmV0dXJuOworICB9CisgIHdvcmQgPSBtX1N5bnRheC5HZXROZXh0V29yZCgmYklzTnVtYmVyKTsKKyAgaWYgKCFiSXNOdW1iZXIpIHsKKyAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fU3ludGF4LkdldEtleXdvcmQoKSAhPSAib2JqIikgeworICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOworICAgIHJldHVybjsKKyAgfQorICB2b2lkKiBwUmVzdWx0ID0KKyAgICAgIEZYU1lTX2JzZWFyY2goJnBvcywgbV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLCBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihGWF9GSUxFU0laRSksIENvbXBhcmVGaWxlU2l6ZSk7CisgIGlmICghcFJlc3VsdCkgeworICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOworICAgIHJldHVybjsKKyAgfQorICBGWF9GSUxFU0laRSBuZXh0b2ZmID0gKChGWF9GSUxFU0laRSopcFJlc3VsdClbMV07CisgIEZYX0JPT0wgYk5leHRPZmZWYWxpZCA9IEZBTFNFOworICBpZiAobmV4dG9mZiAhPSBwb3MpIHsKKyAgICBtX1N5bnRheC5SZXN0b3JlUG9zKG5leHRvZmYpOworICAgIHdvcmQgPSBtX1N5bnRheC5HZXROZXh0V29yZCgmYklzTnVtYmVyKTsKKyAgICBpZiAod29yZCA9PSAieHJlZiIpIHsKKyAgICAgIGJOZXh0T2ZmVmFsaWQgPSBUUlVFOworICAgIH0gZWxzZSBpZiAoYklzTnVtYmVyKSB7CisgICAgICB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoJmJJc051bWJlcik7CisgICAgICBpZiAoYklzTnVtYmVyICYmIG1fU3ludGF4LkdldEtleXdvcmQoKSA9PSAib2JqIikgeworICAgICAgICBiTmV4dE9mZlZhbGlkID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKCFiTmV4dE9mZlZhbGlkKSB7CisgICAgbV9TeW50YXguUmVzdG9yZVBvcyhwb3MpOworICAgIHdoaWxlICgxKSB7CisgICAgICBpZiAobV9TeW50YXguR2V0S2V5d29yZCgpID09ICJlbmRvYmoiKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKG1fU3ludGF4LlNhdmVQb3MoKSA9PSBtX1N5bnRheC5tX0ZpbGVMZW4pIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIG5leHRvZmYgPSBtX1N5bnRheC5TYXZlUG9zKCk7CisgIH0KKyAgc2l6ZSA9IChGWF9EV09SRCkobmV4dG9mZiAtIHBvcyk7CisgIHBCdWZmZXIgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsKKyAgbV9TeW50YXguUmVzdG9yZVBvcyhwb3MpOworICBtX1N5bnRheC5SZWFkQmxvY2socEJ1ZmZlciwgc2l6ZSk7CisgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOworfQorCitDUERGX09iamVjdCogQ1BERl9QYXJzZXI6OlBhcnNlSW5kaXJlY3RPYmplY3RBdCgKKyAgICBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBwT2JqTGlzdCwKKyAgICBGWF9GSUxFU0laRSBwb3MsCisgICAgRlhfRFdPUkQgb2JqbnVtLAorICAgIFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0KSB7CisgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9TeW50YXguU2F2ZVBvcygpOworICBtX1N5bnRheC5SZXN0b3JlUG9zKHBvcyk7CisgIGJvb2wgYklzTnVtYmVyOworICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoJmJJc051bWJlcik7CisgIGlmICghYklzTnVtYmVyKSB7CisgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgRlhfRklMRVNJWkUgb2JqT2Zmc2V0ID0gbV9TeW50YXguU2F2ZVBvcygpOworICBvYmpPZmZzZXQgLT0gd29yZC5HZXRMZW5ndGgoKTsKKyAgRlhfRFdPUkQgcGFyc2VyX29iam51bSA9IEZYU1lTX2F0b2kod29yZCk7CisgIGlmIChvYmpudW0gJiYgcGFyc2VyX29iam51bSAhPSBvYmpudW0pIHsKKyAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICB3b3JkID0gbV9TeW50YXguR2V0TmV4dFdvcmQoJmJJc051bWJlcik7CisgIGlmICghYklzTnVtYmVyKSB7CisgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgRlhfRFdPUkQgcGFyc2VyX2dlbm51bSA9IEZYU1lTX2F0b2kod29yZCk7CisgIGlmIChtX1N5bnRheC5HZXRLZXl3b3JkKCkgIT0gIm9iaiIpIHsKKyAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX09iamVjdCogcE9iaiA9CisgICAgICBtX1N5bnRheC5HZXRPYmplY3QocE9iakxpc3QsIG9iam51bSwgcGFyc2VyX2dlbm51bSwgcENvbnRleHQsIHRydWUpOworICBtX1N5bnRheC5TYXZlUG9zKCk7CisgIENGWF9CeXRlU3RyaW5nIGJzV29yZCA9IG1fU3ludGF4LkdldEtleXdvcmQoKTsKKyAgaWYgKGJzV29yZCA9PSAiZW5kb2JqIikgeworICAgIG1fU3ludGF4LlNhdmVQb3MoKTsKKyAgfQorICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKKyAgaWYgKHBPYmopIHsKKyAgICBpZiAoIW9iam51bSkKKyAgICAgIHBPYmotPm1fT2JqTnVtID0gcGFyc2VyX29iam51bTsKKyAgICBwT2JqLT5tX0dlbk51bSA9IHBhcnNlcl9nZW5udW07CisgIH0KKyAgcmV0dXJuIHBPYmo7Cit9CitDUERGX09iamVjdCogQ1BERl9QYXJzZXI6OlBhcnNlSW5kaXJlY3RPYmplY3RBdEJ5U3RyaWN0KAorICAgIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIqIHBPYmpMaXN0LAorICAgIEZYX0ZJTEVTSVpFIHBvcywKKyAgICBGWF9EV09SRCBvYmpudW0sCisgICAgUEFSU0VfQ09OVEVYVCogcENvbnRleHQsCisgICAgRlhfRklMRVNJWkUqIHBSZXN1bHRQb3MpIHsKKyAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1N5bnRheC5TYXZlUG9zKCk7CisgIG1fU3ludGF4LlJlc3RvcmVQb3MocG9zKTsKKyAgYm9vbCBiSXNOdW1iZXI7CisgIENGWF9CeXRlU3RyaW5nIHdvcmQgPSBtX1N5bnRheC5HZXROZXh0V29yZCgmYklzTnVtYmVyKTsKKyAgaWYgKCFiSXNOdW1iZXIpIHsKKyAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBGWF9EV09SRCBwYXJzZXJfb2JqbnVtID0gRlhTWVNfYXRvaSh3b3JkKTsKKyAgaWYgKG9iam51bSAmJiBwYXJzZXJfb2JqbnVtICE9IG9iam51bSkgeworICAgIG1fU3ludGF4LlJlc3RvcmVQb3MoU2F2ZWRQb3MpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHdvcmQgPSBtX1N5bnRheC5HZXROZXh0V29yZCgmYklzTnVtYmVyKTsKKyAgaWYgKCFiSXNOdW1iZXIpIHsKKyAgICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBGWF9EV09SRCBnZW5udW0gPSBGWFNZU19hdG9pKHdvcmQpOworICBpZiAobV9TeW50YXguR2V0S2V5d29yZCgpICE9ICJvYmoiKSB7CisgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9PYmplY3QqIHBPYmogPQorICAgICAgbV9TeW50YXguR2V0T2JqZWN0QnlTdHJpY3QocE9iakxpc3QsIG9iam51bSwgZ2VubnVtLCBwQ29udGV4dCk7CisgIGlmIChwUmVzdWx0UG9zKSB7CisgICAgKnBSZXN1bHRQb3MgPSBtX1N5bnRheC5tX1BvczsKKyAgfQorICBtX1N5bnRheC5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKKyAgcmV0dXJuIHBPYmo7Cit9CisKK0NQREZfRGljdGlvbmFyeSogQ1BERl9QYXJzZXI6OkxvYWRUcmFpbGVyVjQoKSB7CisgIGlmIChtX1N5bnRheC5HZXRLZXl3b3JkKCkgIT0gInRyYWlsZXIiKQorICAgIHJldHVybiBudWxscHRyOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdCwgUmVsZWFzZURlbGV0ZXI8Q1BERl9PYmplY3Q+PiBwT2JqKAorICAgICAgbV9TeW50YXguR2V0T2JqZWN0KG1fcERvY3VtZW50LCAwLCAwLCBudWxscHRyLCB0cnVlKSk7CisgIGlmICghVG9EaWN0aW9uYXJ5KHBPYmouZ2V0KCkpKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gcE9iai5yZWxlYXNlKCktPkFzRGljdGlvbmFyeSgpOworfQorCitGWF9EV09SRCBDUERGX1BhcnNlcjo6R2V0UGVybWlzc2lvbnMoRlhfQk9PTCBiQ2hlY2tSZXZpc2lvbikgeworICBpZiAoIW1fcFNlY3VyaXR5SGFuZGxlcikgeworICAgIHJldHVybiAoRlhfRFdPUkQpLTE7CisgIH0KKyAgRlhfRFdPUkQgZHdQZXJtaXNzaW9uID0gbV9wU2VjdXJpdHlIYW5kbGVyLT5HZXRQZXJtaXNzaW9ucygpOworICBpZiAobV9wRW5jcnlwdERpY3QgJiYgbV9wRW5jcnlwdERpY3QtPkdldFN0cmluZygiRmlsdGVyIikgPT0gIlN0YW5kYXJkIikgeworICAgIGR3UGVybWlzc2lvbiAmPSAweEZGRkZGRkZDOworICAgIGR3UGVybWlzc2lvbiB8PSAweEZGRkZGMEMwOworICAgIGlmIChiQ2hlY2tSZXZpc2lvbiAmJiBtX3BFbmNyeXB0RGljdC0+R2V0SW50ZWdlcigiUiIpID09IDIpIHsKKyAgICAgIGR3UGVybWlzc2lvbiAmPSAweEZGRkZGMEZGOworICAgIH0KKyAgfQorICByZXR1cm4gZHdQZXJtaXNzaW9uOworfQorRlhfQk9PTCBDUERGX1BhcnNlcjo6SXNPd25lcigpIHsKKyAgcmV0dXJuICFtX3BTZWN1cml0eUhhbmRsZXIgfHwgbV9wU2VjdXJpdHlIYW5kbGVyLT5Jc093bmVyKCk7Cit9Cit2b2lkIENQREZfUGFyc2VyOjpTZXRTZWN1cml0eUhhbmRsZXIoQ1BERl9TZWN1cml0eUhhbmRsZXIqIHBTZWN1cml0eUhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRm9yY2VkKSB7CisgIG1fYkZvcmNlVXNlU2VjdXJpdHlIYW5kbGVyID0gYkZvcmNlZDsKKyAgbV9wU2VjdXJpdHlIYW5kbGVyLnJlc2V0KHBTZWN1cml0eUhhbmRsZXIpOworICBpZiAobV9iRm9yY2VVc2VTZWN1cml0eUhhbmRsZXIpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9TeW50YXgubV9wQ3J5cHRvSGFuZGxlci5yZXNldChwU2VjdXJpdHlIYW5kbGVyLT5DcmVhdGVDcnlwdG9IYW5kbGVyKCkpOworICBtX1N5bnRheC5tX3BDcnlwdG9IYW5kbGVyLT5Jbml0KE5VTEwsIHBTZWN1cml0eUhhbmRsZXIpOworfQorRlhfQk9PTCBDUERGX1BhcnNlcjo6SXNMaW5lYXJpemVkRmlsZShJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvZmZzZXQpIHsKKyAgbV9TeW50YXguSW5pdFBhcnNlcihwRmlsZUFjY2Vzcywgb2Zmc2V0KTsKKyAgbV9TeW50YXguUmVzdG9yZVBvcyhtX1N5bnRheC5tX0hlYWRlck9mZnNldCArIDkpOworICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fU3ludGF4LlNhdmVQb3MoKTsKKyAgYm9vbCBiSXNOdW1iZXI7CisgIENGWF9CeXRlU3RyaW5nIHdvcmQgPSBtX1N5bnRheC5HZXROZXh0V29yZCgmYklzTnVtYmVyKTsKKyAgaWYgKCFiSXNOdW1iZXIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhfRFdPUkQgb2JqbnVtID0gRlhTWVNfYXRvaSh3b3JkKTsKKyAgd29yZCA9IG1fU3ludGF4LkdldE5leHRXb3JkKCZiSXNOdW1iZXIpOworICBpZiAoIWJJc051bWJlcikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9EV09SRCBnZW5udW0gPSBGWFNZU19hdG9pKHdvcmQpOworICBpZiAobV9TeW50YXguR2V0S2V5d29yZCgpICE9ICJvYmoiKSB7CisgICAgbV9TeW50YXguUmVzdG9yZVBvcyhTYXZlZFBvcyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fcExpbmVhcml6ZWQgPSBtX1N5bnRheC5HZXRPYmplY3QobnVsbHB0ciwgb2JqbnVtLCBnZW5udW0sIG51bGxwdHIsIHRydWUpOworICBpZiAoIW1fcExpbmVhcml6ZWQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wTGluZWFyaXplZC0+R2V0RGljdCgpOworICBpZiAocERpY3QgJiYgcERpY3QtPkdldEVsZW1lbnQoIkxpbmVhcml6ZWQiKSkgeworICAgIG1fU3ludGF4LkdldE5leHRXb3JkKG51bGxwdHIpOworCisgICAgQ1BERl9PYmplY3QqIHBMZW4gPSBwRGljdC0+R2V0RWxlbWVudCgiTCIpOworICAgIGlmICghcExlbikgeworICAgICAgbV9wTGluZWFyaXplZC0+UmVsZWFzZSgpOworICAgICAgbV9wTGluZWFyaXplZCA9IE5VTEw7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGlmIChwTGVuLT5HZXRJbnRlZ2VyKCkgIT0gKGludClwRmlsZUFjY2Vzcy0+R2V0U2l6ZSgpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKENQREZfTnVtYmVyKiBwTm8gPSBUb051bWJlcihwRGljdC0+R2V0RWxlbWVudCgiUCIpKSkKKyAgICAgIG1fZHdGaXJzdFBhZ2VObyA9IHBOby0+R2V0SW50ZWdlcigpOworCisgICAgaWYgKENQREZfTnVtYmVyKiBwVGFibGUgPSBUb051bWJlcihwRGljdC0+R2V0RWxlbWVudCgiVCIpKSkKKyAgICAgIG1fTGFzdFhSZWZPZmZzZXQgPSBwVGFibGUtPkdldEludGVnZXIoKTsKKworICAgIHJldHVybiBUUlVFOworICB9CisgIG1fcExpbmVhcml6ZWQtPlJlbGVhc2UoKTsKKyAgbV9wTGluZWFyaXplZCA9IE5VTEw7CisgIHJldHVybiBGQUxTRTsKK30KK0ZYX0RXT1JEIENQREZfUGFyc2VyOjpTdGFydEFzeW5QYXJzZShJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlUGFyc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiT3duRmlsZVJlYWQpIHsKKyAgQ2xvc2VQYXJzZXIoYlJlUGFyc2UpOworICBtX2JYUmVmU3RyZWFtID0gRkFMU0U7CisgIG1fTGFzdFhSZWZPZmZzZXQgPSAwOworICBtX2JPd25GaWxlUmVhZCA9IGJPd25GaWxlUmVhZDsKKyAgaW50MzJfdCBvZmZzZXQgPSBHZXRIZWFkZXJPZmZzZXQocEZpbGVBY2Nlc3MpOworICBpZiAob2Zmc2V0ID09IC0xKSB7CisgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKKyAgfQorICBpZiAoIUlzTGluZWFyaXplZEZpbGUocEZpbGVBY2Nlc3MsIG9mZnNldCkpIHsKKyAgICBtX1N5bnRheC5tX3BGaWxlQWNjZXNzID0gTlVMTDsKKyAgICByZXR1cm4gU3RhcnRQYXJzZShwRmlsZUFjY2VzcywgYlJlUGFyc2UsIGJPd25GaWxlUmVhZCk7CisgIH0KKyAgaWYgKCFiUmVQYXJzZSkgeworICAgIG1fcERvY3VtZW50ID0gbmV3IENQREZfRG9jdW1lbnQodGhpcyk7CisgIH0KKyAgRlhfRklMRVNJWkUgZHdGaXJzdFhSZWZPZmZzZXQgPSBtX1N5bnRheC5TYXZlUG9zKCk7CisgIEZYX0JPT0wgYlhSZWZSZWJ1aWx0ID0gRkFMU0U7CisgIEZYX0JPT0wgYkxvYWRWNCA9IEZBTFNFOworICBpZiAoIShiTG9hZFY0ID0gTG9hZENyb3NzUmVmVjQoZHdGaXJzdFhSZWZPZmZzZXQsIDAsIEZBTFNFKSkgJiYKKyAgICAgICFMb2FkQ3Jvc3NSZWZWNSgmZHdGaXJzdFhSZWZPZmZzZXQsIFRSVUUpKSB7CisgICAgaWYgKCFSZWJ1aWxkQ3Jvc3NSZWYoKSkgeworICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKKyAgICB9CisgICAgYlhSZWZSZWJ1aWx0ID0gVFJVRTsKKyAgICBtX0xhc3RYUmVmT2Zmc2V0ID0gMDsKKyAgfQorICBpZiAoYkxvYWRWNCkgeworICAgIG1fcFRyYWlsZXIgPSBMb2FkVHJhaWxlclY0KCk7CisgICAgaWYgKCFtX3BUcmFpbGVyKSB7CisgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBpbnQzMl90IHhyZWZzaXplID0gR2V0RGlyZWN0SW50ZWdlcihtX3BUcmFpbGVyLCAiU2l6ZSIpOworICAgIGlmICh4cmVmc2l6ZSA+IDApIHsKKyAgICAgIFNocmlua09iamVjdE1hcCh4cmVmc2l6ZSk7CisgICAgICBtX1Y1VHlwZS5TZXRTaXplKHhyZWZzaXplKTsKKyAgICB9CisgIH0KKyAgRlhfRFdPUkQgZHdSZXQgPSBTZXRFbmNyeXB0SGFuZGxlcigpOworICBpZiAoZHdSZXQgIT0gUERGUEFSU0VfRVJST1JfU1VDQ0VTUykgeworICAgIHJldHVybiBkd1JldDsKKyAgfQorICBtX3BEb2N1bWVudC0+TG9hZEFzeW5Eb2MobV9wTGluZWFyaXplZC0+R2V0RGljdCgpKTsKKyAgaWYgKCFtX3BEb2N1bWVudC0+R2V0Um9vdCgpIHx8IG1fcERvY3VtZW50LT5HZXRQYWdlQ291bnQoKSA9PSAwKSB7CisgICAgaWYgKGJYUmVmUmVidWlsdCkgeworICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKKyAgICB9CisgICAgUmVsZWFzZUVuY3J5cHRIYW5kbGVyKCk7CisgICAgaWYgKCFSZWJ1aWxkQ3Jvc3NSZWYoKSkgeworICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKKyAgICB9CisgICAgZHdSZXQgPSBTZXRFbmNyeXB0SGFuZGxlcigpOwogICAgIGlmIChkd1JldCAhPSBQREZQQVJTRV9FUlJPUl9TVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBkd1JldDsKKyAgICAgIHJldHVybiBkd1JldDsKICAgICB9CiAgICAgbV9wRG9jdW1lbnQtPkxvYWRBc3luRG9jKG1fcExpbmVhcml6ZWQtPkdldERpY3QoKSk7Ci0gICAgaWYgKG1fcERvY3VtZW50LT5HZXRSb290KCkgPT0gTlVMTCB8fCBtX3BEb2N1bWVudC0+R2V0UGFnZUNvdW50KCkgPT0gMCkgewotICAgICAgICBpZiAoYlhSZWZSZWJ1aWx0KSB7Ci0gICAgICAgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOwotICAgICAgICB9Ci0gICAgICAgIFJlbGVhc2VFbmNyeXB0SGFuZGxlcigpOwotICAgICAgICBpZiAoIVJlYnVpbGRDcm9zc1JlZigpKSB7Ci0gICAgICAgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOwotICAgICAgICB9Ci0gICAgICAgIGR3UmV0ID0gU2V0RW5jcnlwdEhhbmRsZXIoKTsKLSAgICAgICAgaWYgKGR3UmV0ICE9IFBERlBBUlNFX0VSUk9SX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHJldHVybiBkd1JldDsKLSAgICAgICAgfQotICAgICAgICBtX3BEb2N1bWVudC0+TG9hZEFzeW5Eb2MobV9wTGluZWFyaXplZC0+R2V0RGljdCgpKTsKLSAgICAgICAgaWYgKG1fcERvY3VtZW50LT5HZXRSb290KCkgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKLSAgICAgICAgfQorICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFJvb3QoKSkgeworICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKICAgICB9Ci0gICAgRlhTWVNfcXNvcnQobV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLCBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksIF9Db21wYXJlRmlsZVNpemUpOwotICAgIEZYX0RXT1JEIFJvb3RPYmpOdW0gPSBHZXRSb290T2JqTnVtKCk7Ci0gICAgaWYgKFJvb3RPYmpOdW0gPT0gMCkgewotICAgICAgICBSZWxlYXNlRW5jcnlwdEhhbmRsZXIoKTsKLSAgICAgICAgUmVidWlsZENyb3NzUmVmKCk7Ci0gICAgICAgIFJvb3RPYmpOdW0gPSBHZXRSb290T2JqTnVtKCk7Ci0gICAgICAgIGlmIChSb290T2JqTnVtID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7Ci0gICAgICAgIH0KLSAgICAgICAgZHdSZXQgPSBTZXRFbmNyeXB0SGFuZGxlcigpOwotICAgICAgICBpZiAoZHdSZXQgIT0gUERGUEFSU0VfRVJST1JfU1VDQ0VTUykgewotICAgICAgICAgICAgcmV0dXJuIGR3UmV0OwotICAgICAgICB9CisgIH0KKyAgRlhTWVNfcXNvcnQobV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLCBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksCisgICAgICAgICAgICAgIHNpemVvZihGWF9GSUxFU0laRSksIENvbXBhcmVGaWxlU2l6ZSk7CisgIGlmIChHZXRSb290T2JqTnVtKCkgPT0gMCkgeworICAgIFJlbGVhc2VFbmNyeXB0SGFuZGxlcigpOworICAgIGlmICghUmVidWlsZENyb3NzUmVmKCkgfHwgR2V0Um9vdE9iak51bSgpID09IDApCisgICAgICByZXR1cm4gUERGUEFSU0VfRVJST1JfRk9STUFUOworCisgICAgZHdSZXQgPSBTZXRFbmNyeXB0SGFuZGxlcigpOworICAgIGlmIChkd1JldCAhPSBQREZQQVJTRV9FUlJPUl9TVUNDRVNTKSB7CisgICAgICByZXR1cm4gZHdSZXQ7CiAgICAgfQotICAgIGlmIChtX3BTZWN1cml0eUhhbmRsZXIgJiYgbV9wU2VjdXJpdHlIYW5kbGVyLT5Jc01ldGFkYXRhRW5jcnlwdGVkKCkpIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBNZXRhZGF0YSA9IG1fcERvY3VtZW50LT5HZXRSb290KCktPkdldEVsZW1lbnQoRlhfQlNUUkMoIk1ldGFkYXRhIikpOwotICAgICAgICBpZiAocE1ldGFkYXRhICYmIHBNZXRhZGF0YS0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKLSAgICAgICAgICAgIG1fU3ludGF4Lm1fTWV0YWRhdGFPYmpudW0gPSAoKENQREZfUmVmZXJlbmNlKikgcE1ldGFkYXRhKS0+R2V0UmVmT2JqTnVtKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX1NVQ0NFU1M7CisgIH0KKyAgaWYgKG1fcFNlY3VyaXR5SGFuZGxlciAmJiBtX3BTZWN1cml0eUhhbmRsZXItPklzTWV0YWRhdGFFbmNyeXB0ZWQoKSkgeworICAgIGlmIChDUERGX1JlZmVyZW5jZSogcE1ldGFkYXRhID0KKyAgICAgICAgICAgIFRvUmVmZXJlbmNlKG1fcERvY3VtZW50LT5HZXRSb290KCktPkdldEVsZW1lbnQoIk1ldGFkYXRhIikpKQorICAgICAgbV9TeW50YXgubV9NZXRhZGF0YU9iam51bSA9IHBNZXRhZGF0YS0+R2V0UmVmT2JqTnVtKCk7CisgIH0KKyAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX1NVQ0NFU1M7CiB9Ci1GWF9CT09MIENQREZfUGFyc2VyOjpMb2FkTGluZWFyaXplZEFsbENyb3NzUmVmVjUoRlhfRklMRVNJWkUgeHJlZnBvcykKLXsKLSAgICBpZiAoIUxvYWRDcm9zc1JlZlY1KHhyZWZwb3MsIHhyZWZwb3MsIEZBTFNFKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CitGWF9CT09MIENQREZfUGFyc2VyOjpMb2FkTGluZWFyaXplZEFsbENyb3NzUmVmVjUoRlhfRklMRVNJWkUgeHJlZnBvcykgeworICBpZiAoIUxvYWRDcm9zc1JlZlY1KCZ4cmVmcG9zLCBGQUxTRSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgc3RkOjpzZXQ8RlhfRklMRVNJWkU+IHNlZW5feHJlZnBvczsKKyAgd2hpbGUgKHhyZWZwb3MpIHsKKyAgICBzZWVuX3hyZWZwb3MuaW5zZXJ0KHhyZWZwb3MpOworICAgIGlmICghTG9hZENyb3NzUmVmVjUoJnhyZWZwb3MsIEZBTFNFKSkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICB3aGlsZSAoeHJlZnBvcykKLSAgICAgICAgaWYgKCFMb2FkQ3Jvc3NSZWZWNSh4cmVmcG9zLCB4cmVmcG9zLCBGQUxTRSkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIG1fT2JqZWN0U3RyZWFtTWFwLkluaXRIYXNoVGFibGUoMTAxLCBGQUxTRSk7Ci0gICAgbV9iWFJlZlN0cmVhbSA9IFRSVUU7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgLy8gQ2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMuCisgICAgaWYgKHBkZml1bTo6Q29udGFpbnNLZXkoc2Vlbl94cmVmcG9zLCB4cmVmcG9zKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorICBtX09iamVjdFN0cmVhbU1hcC5Jbml0SGFzaFRhYmxlKDEwMSwgRkFMU0UpOworICBtX2JYUmVmU3RyZWFtID0gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9EV09SRCBDUERGX1BhcnNlcjo6TG9hZExpbmVhcml6ZWRNYWluWFJlZlRhYmxlKCkKLXsKLSAgICBGWF9EV09SRCBkd1NhdmVNZXRhZGF0YU9iam51bSA9IG1fU3ludGF4Lm1fTWV0YWRhdGFPYmpudW07Ci0gICAgbV9TeW50YXgubV9NZXRhZGF0YU9iam51bSA9IDA7Ci0gICAgaWYgKG1fcFRyYWlsZXIpIHsKLSAgICAgICAgbV9wVHJhaWxlci0+UmVsZWFzZSgpOwotICAgICAgICBtX3BUcmFpbGVyID0gTlVMTDsKK0ZYX0RXT1JEIENQREZfUGFyc2VyOjpMb2FkTGluZWFyaXplZE1haW5YUmVmVGFibGUoKSB7CisgIEZYX0RXT1JEIGR3U2F2ZU1ldGFkYXRhT2JqbnVtID0gbV9TeW50YXgubV9NZXRhZGF0YU9iam51bTsKKyAgbV9TeW50YXgubV9NZXRhZGF0YU9iam51bSA9IDA7CisgIGlmIChtX3BUcmFpbGVyKSB7CisgICAgbV9wVHJhaWxlci0+UmVsZWFzZSgpOworICAgIG1fcFRyYWlsZXIgPSBOVUxMOworICB9CisgIG1fU3ludGF4LlJlc3RvcmVQb3MobV9MYXN0WFJlZk9mZnNldCAtIG1fU3ludGF4Lm1fSGVhZGVyT2Zmc2V0KTsKKyAgdWludDhfdCBjaCA9IDA7CisgIEZYX0RXT1JEIGR3Q291bnQgPSAwOworICBtX1N5bnRheC5HZXROZXh0Q2hhcihjaCk7CisgIHdoaWxlIChQREZDaGFySXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICsrZHdDb3VudDsKKyAgICBpZiAobV9TeW50YXgubV9GaWxlTGVuID49CisgICAgICAgIChGWF9GSUxFU0laRSkobV9TeW50YXguU2F2ZVBvcygpICsgbV9TeW50YXgubV9IZWFkZXJPZmZzZXQpKSB7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgbV9TeW50YXguUmVzdG9yZVBvcyhtX0xhc3RYUmVmT2Zmc2V0IC0gbV9TeW50YXgubV9IZWFkZXJPZmZzZXQpOwotICAgIEZYX0JZVEUgY2ggPSAwOwotICAgIEZYX0RXT1JEIGR3Q291bnQgPSAwOwogICAgIG1fU3ludGF4LkdldE5leHRDaGFyKGNoKTsKLSAgICBGWF9JTlQzMiB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKLSAgICB3aGlsZSAodHlwZSA9PSAnVycpIHsKLSAgICAgICAgKytkd0NvdW50OwotICAgICAgICBpZiAobV9TeW50YXgubV9GaWxlTGVuID49IChGWF9GSUxFU0laRSkobV9TeW50YXguU2F2ZVBvcygpICsgbV9TeW50YXgubV9IZWFkZXJPZmZzZXQpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtX1N5bnRheC5HZXROZXh0Q2hhcihjaCk7Ci0gICAgICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwotICAgIH0KLSAgICBtX0xhc3RYUmVmT2Zmc2V0ICs9IGR3Q291bnQ7Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9PYmplY3RTdHJlYW1NYXAuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgRlhfTFBWT0lEIG9iam51bTsKLSAgICAgICAgQ1BERl9TdHJlYW1BY2MqIHBTdHJlYW07Ci0gICAgICAgIG1fT2JqZWN0U3RyZWFtTWFwLkdldE5leHRBc3NvYyhwb3MsIG9iam51bSwgKHZvaWQqJilwU3RyZWFtKTsKLSAgICAgICAgZGVsZXRlIHBTdHJlYW07Ci0gICAgfQotICAgIG1fT2JqZWN0U3RyZWFtTWFwLlJlbW92ZUFsbCgpOwotICAgIGlmICghTG9hZExpbmVhcml6ZWRBbGxDcm9zc1JlZlY0KG1fTGFzdFhSZWZPZmZzZXQsIG1fZHdYcmVmU3RhcnRPYmpOdW0pICYmICFMb2FkTGluZWFyaXplZEFsbENyb3NzUmVmVjUobV9MYXN0WFJlZk9mZnNldCkpIHsKLSAgICAgICAgbV9MYXN0WFJlZk9mZnNldCA9IDA7Ci0gICAgICAgIG1fU3ludGF4Lm1fTWV0YWRhdGFPYmpudW0gPSBkd1NhdmVNZXRhZGF0YU9iam51bTsKLSAgICAgICAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX0ZPUk1BVDsKLSAgICB9Ci0gICAgRlhTWVNfcXNvcnQobV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLCBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksIF9Db21wYXJlRmlsZVNpemUpOworICB9CisgIG1fTGFzdFhSZWZPZmZzZXQgKz0gZHdDb3VudDsKKyAgRlhfUE9TSVRJT04gcG9zID0gbV9PYmplY3RTdHJlYW1NYXAuR2V0U3RhcnRQb3NpdGlvbigpOworICB3aGlsZSAocG9zKSB7CisgICAgdm9pZCogb2JqbnVtOworICAgIENQREZfU3RyZWFtQWNjKiBwU3RyZWFtOworICAgIG1fT2JqZWN0U3RyZWFtTWFwLkdldE5leHRBc3NvYyhwb3MsIG9iam51bSwgKHZvaWQqJilwU3RyZWFtKTsKKyAgICBkZWxldGUgcFN0cmVhbTsKKyAgfQorICBtX09iamVjdFN0cmVhbU1hcC5SZW1vdmVBbGwoKTsKKyAgbV9PYmpDYWNoZS5jbGVhcigpOworCisgIGlmICghTG9hZExpbmVhcml6ZWRBbGxDcm9zc1JlZlY0KG1fTGFzdFhSZWZPZmZzZXQsIG1fZHdYcmVmU3RhcnRPYmpOdW0pICYmCisgICAgICAhTG9hZExpbmVhcml6ZWRBbGxDcm9zc1JlZlY1KG1fTGFzdFhSZWZPZmZzZXQpKSB7CisgICAgbV9MYXN0WFJlZk9mZnNldCA9IDA7CiAgICAgbV9TeW50YXgubV9NZXRhZGF0YU9iam51bSA9IGR3U2F2ZU1ldGFkYXRhT2JqbnVtOwotICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9TVUNDRVNTOworICAgIHJldHVybiBQREZQQVJTRV9FUlJPUl9GT1JNQVQ7CisgIH0KKyAgRlhTWVNfcXNvcnQobV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLCBtX1NvcnRlZE9mZnNldC5HZXRTaXplKCksCisgICAgICAgICAgICAgIHNpemVvZihGWF9GSUxFU0laRSksIENvbXBhcmVGaWxlU2l6ZSk7CisgIG1fU3ludGF4Lm1fTWV0YWRhdGFPYmpudW0gPSBkd1NhdmVNZXRhZGF0YU9iam51bTsKKyAgcmV0dXJuIFBERlBBUlNFX0VSUk9SX1NVQ0NFU1M7CiB9CiAKIC8vIHN0YXRpYwogaW50IENQREZfU3ludGF4UGFyc2VyOjpzX0N1cnJlbnRSZWN1cnNpb25EZXB0aCA9IDA7CiAKLUNQREZfU3ludGF4UGFyc2VyOjpDUERGX1N5bnRheFBhcnNlcigpCi17Ci0gICAgbV9wRmlsZUFjY2VzcyA9IE5VTEw7Ci0gICAgbV9wQ3J5cHRvSGFuZGxlciA9IE5VTEw7Ci0gICAgbV9wRmlsZUJ1ZiA9IE5VTEw7Ci0gICAgbV9CdWZTaXplID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5tX0ZpbGVCdWZTaXplOwotICAgIG1fcEZpbGVCdWYgPSBOVUxMOwotICAgIG1fTWV0YWRhdGFPYmpudW0gPSAwOwotICAgIG1fZHdXb3JkUG9zID0gMDsKLSAgICBtX2JGaWxlU3RyZWFtID0gRkFMU0U7CitDUERGX1N5bnRheFBhcnNlcjo6Q1BERl9TeW50YXhQYXJzZXIoKSB7CisgIG1fcEZpbGVBY2Nlc3MgPSBOVUxMOworICBtX3BGaWxlQnVmID0gTlVMTDsKKyAgbV9CdWZTaXplID0gQ1BERl9Nb2R1bGVNZ3I6OmtGaWxlQnVmU2l6ZTsKKyAgbV9wRmlsZUJ1ZiA9IE5VTEw7CisgIG1fTWV0YWRhdGFPYmpudW0gPSAwOworICBtX2R3V29yZFBvcyA9IDA7CisgIG1fYkZpbGVTdHJlYW0gPSBGQUxTRTsKIH0KLUNQREZfU3ludGF4UGFyc2VyOjp+Q1BERl9TeW50YXhQYXJzZXIoKQotewotICAgIGlmIChtX3BGaWxlQnVmKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wRmlsZUJ1Zik7Ci0gICAgfQorCitDUERGX1N5bnRheFBhcnNlcjo6fkNQREZfU3ludGF4UGFyc2VyKCkgeworICBGWF9GcmVlKG1fcEZpbGVCdWYpOwogfQotRlhfQk9PTCBDUERGX1N5bnRheFBhcnNlcjo6R2V0Q2hhckF0KEZYX0ZJTEVTSVpFIHBvcywgRlhfQllURSYgY2gpCi17Ci0gICAgRlhfRklMRVNJWkUgc2F2ZV9wb3MgPSBtX1BvczsKLSAgICBtX1BvcyA9IHBvczsKLSAgICBGWF9CT09MIHJldCA9IEdldE5leHRDaGFyKGNoKTsKLSAgICBtX1BvcyA9IHNhdmVfcG9zOwotICAgIHJldHVybiByZXQ7CisKK0ZYX0JPT0wgQ1BERl9TeW50YXhQYXJzZXI6OkdldENoYXJBdChGWF9GSUxFU0laRSBwb3MsIHVpbnQ4X3QmIGNoKSB7CisgIENGWF9BdXRvUmVzdG9yZXI8RlhfRklMRVNJWkU+IHNhdmVfcG9zKCZtX1Bvcyk7CisgIG1fUG9zID0gcG9zOworICByZXR1cm4gR2V0TmV4dENoYXIoY2gpOwogfQotRlhfQk9PTCBDUERGX1N5bnRheFBhcnNlcjo6R2V0TmV4dENoYXIoRlhfQllURSYgY2gpCi17Ci0gICAgRlhfRklMRVNJWkUgcG9zID0gbV9Qb3MgKyBtX0hlYWRlck9mZnNldDsKLSAgICBpZiAocG9zID49IG1fRmlsZUxlbikgewotICAgICAgICByZXR1cm4gRkFMU0U7CisKK0ZYX0JPT0wgQ1BERl9TeW50YXhQYXJzZXI6OkdldE5leHRDaGFyKHVpbnQ4X3QmIGNoKSB7CisgIEZYX0ZJTEVTSVpFIHBvcyA9IG1fUG9zICsgbV9IZWFkZXJPZmZzZXQ7CisgIGlmIChwb3MgPj0gbV9GaWxlTGVuKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX0J1Zk9mZnNldCA+PSBwb3MgfHwgKEZYX0ZJTEVTSVpFKShtX0J1Zk9mZnNldCArIG1fQnVmU2l6ZSkgPD0gcG9zKSB7CisgICAgRlhfRklMRVNJWkUgcmVhZF9wb3MgPSBwb3M7CisgICAgRlhfRFdPUkQgcmVhZF9zaXplID0gbV9CdWZTaXplOworICAgIGlmICgoRlhfRklMRVNJWkUpcmVhZF9zaXplID4gbV9GaWxlTGVuKSB7CisgICAgICByZWFkX3NpemUgPSAoRlhfRFdPUkQpbV9GaWxlTGVuOwogICAgIH0KLSAgICBpZiAobV9CdWZPZmZzZXQgPj0gcG9zIHx8IChGWF9GSUxFU0laRSkobV9CdWZPZmZzZXQgKyBtX0J1ZlNpemUpIDw9IHBvcykgewotICAgICAgICBGWF9GSUxFU0laRSByZWFkX3BvcyA9IHBvczsKLSAgICAgICAgRlhfRFdPUkQgcmVhZF9zaXplID0gbV9CdWZTaXplOwotICAgICAgICBpZiAoKEZYX0ZJTEVTSVpFKXJlYWRfc2l6ZSA+IG1fRmlsZUxlbikgewotICAgICAgICAgICAgcmVhZF9zaXplID0gKEZYX0RXT1JEKW1fRmlsZUxlbjsKLSAgICAgICAgfQotICAgICAgICBpZiAoKEZYX0ZJTEVTSVpFKShyZWFkX3BvcyArIHJlYWRfc2l6ZSkgPiBtX0ZpbGVMZW4pIHsKLSAgICAgICAgICAgIGlmIChtX0ZpbGVMZW4gPCAoRlhfRklMRVNJWkUpcmVhZF9zaXplKSB7Ci0gICAgICAgICAgICAgICAgcmVhZF9wb3MgPSAwOwotICAgICAgICAgICAgICAgIHJlYWRfc2l6ZSA9IChGWF9EV09SRCltX0ZpbGVMZW47Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlYWRfcG9zID0gbV9GaWxlTGVuIC0gcmVhZF9zaXplOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghbV9wRmlsZUFjY2Vzcy0+UmVhZEJsb2NrKG1fcEZpbGVCdWYsIHJlYWRfcG9zLCByZWFkX3NpemUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgbV9CdWZPZmZzZXQgPSByZWFkX3BvczsKKyAgICBpZiAoKEZYX0ZJTEVTSVpFKShyZWFkX3BvcyArIHJlYWRfc2l6ZSkgPiBtX0ZpbGVMZW4pIHsKKyAgICAgIGlmIChtX0ZpbGVMZW4gPCAoRlhfRklMRVNJWkUpcmVhZF9zaXplKSB7CisgICAgICAgIHJlYWRfcG9zID0gMDsKKyAgICAgICAgcmVhZF9zaXplID0gKEZYX0RXT1JEKW1fRmlsZUxlbjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlYWRfcG9zID0gbV9GaWxlTGVuIC0gcmVhZF9zaXplOworICAgICAgfQogICAgIH0KLSAgICBjaCA9IG1fcEZpbGVCdWZbcG9zIC0gbV9CdWZPZmZzZXRdOwotICAgIG1fUG9zICsrOwotICAgIHJldHVybiBUUlVFOworICAgIGlmICghbV9wRmlsZUFjY2Vzcy0+UmVhZEJsb2NrKG1fcEZpbGVCdWYsIHJlYWRfcG9zLCByZWFkX3NpemUpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIG1fQnVmT2Zmc2V0ID0gcmVhZF9wb3M7CisgIH0KKyAgY2ggPSBtX3BGaWxlQnVmW3BvcyAtIG1fQnVmT2Zmc2V0XTsKKyAgbV9Qb3MrKzsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENQREZfU3ludGF4UGFyc2VyOjpHZXRDaGFyQXRCYWNrd2FyZChGWF9GSUxFU0laRSBwb3MsIEZYX0JZVEUmIGNoKQotewotICAgIHBvcyArPSBtX0hlYWRlck9mZnNldDsKLSAgICBpZiAocG9zID49IG1fRmlsZUxlbikgewotICAgICAgICByZXR1cm4gRkFMU0U7CitGWF9CT09MIENQREZfU3ludGF4UGFyc2VyOjpHZXRDaGFyQXRCYWNrd2FyZChGWF9GSUxFU0laRSBwb3MsIHVpbnQ4X3QmIGNoKSB7CisgIHBvcyArPSBtX0hlYWRlck9mZnNldDsKKyAgaWYgKHBvcyA+PSBtX0ZpbGVMZW4pIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fQnVmT2Zmc2V0ID49IHBvcyB8fCAoRlhfRklMRVNJWkUpKG1fQnVmT2Zmc2V0ICsgbV9CdWZTaXplKSA8PSBwb3MpIHsKKyAgICBGWF9GSUxFU0laRSByZWFkX3BvczsKKyAgICBpZiAocG9zIDwgKEZYX0ZJTEVTSVpFKW1fQnVmU2l6ZSkgeworICAgICAgcmVhZF9wb3MgPSAwOworICAgIH0gZWxzZSB7CisgICAgICByZWFkX3BvcyA9IHBvcyAtIG1fQnVmU2l6ZSArIDE7CiAgICAgfQotICAgIGlmIChtX0J1Zk9mZnNldCA+PSBwb3MgfHwgKEZYX0ZJTEVTSVpFKShtX0J1Zk9mZnNldCArIG1fQnVmU2l6ZSkgPD0gcG9zKSB7Ci0gICAgICAgIEZYX0ZJTEVTSVpFIHJlYWRfcG9zOwotICAgICAgICBpZiAocG9zIDwgKEZYX0ZJTEVTSVpFKW1fQnVmU2l6ZSkgewotICAgICAgICAgICAgcmVhZF9wb3MgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVhZF9wb3MgPSBwb3MgLSBtX0J1ZlNpemUgKyAxOwotICAgICAgICB9Ci0gICAgICAgIEZYX0RXT1JEIHJlYWRfc2l6ZSA9IG1fQnVmU2l6ZTsKLSAgICAgICAgaWYgKChGWF9GSUxFU0laRSkocmVhZF9wb3MgKyByZWFkX3NpemUpID4gbV9GaWxlTGVuKSB7Ci0gICAgICAgICAgICBpZiAobV9GaWxlTGVuIDwgKEZYX0ZJTEVTSVpFKXJlYWRfc2l6ZSkgewotICAgICAgICAgICAgICAgIHJlYWRfcG9zID0gMDsKLSAgICAgICAgICAgICAgICByZWFkX3NpemUgPSAoRlhfRFdPUkQpbV9GaWxlTGVuOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZWFkX3BvcyA9IG1fRmlsZUxlbiAtIHJlYWRfc2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIW1fcEZpbGVBY2Nlc3MtPlJlYWRCbG9jayhtX3BGaWxlQnVmLCByZWFkX3BvcywgcmVhZF9zaXplKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIG1fQnVmT2Zmc2V0ID0gcmVhZF9wb3M7CisgICAgRlhfRFdPUkQgcmVhZF9zaXplID0gbV9CdWZTaXplOworICAgIGlmICgoRlhfRklMRVNJWkUpKHJlYWRfcG9zICsgcmVhZF9zaXplKSA+IG1fRmlsZUxlbikgeworICAgICAgaWYgKG1fRmlsZUxlbiA8IChGWF9GSUxFU0laRSlyZWFkX3NpemUpIHsKKyAgICAgICAgcmVhZF9wb3MgPSAwOworICAgICAgICByZWFkX3NpemUgPSAoRlhfRFdPUkQpbV9GaWxlTGVuOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVhZF9wb3MgPSBtX0ZpbGVMZW4gLSByZWFkX3NpemU7CisgICAgICB9CiAgICAgfQotICAgIGNoID0gbV9wRmlsZUJ1Zltwb3MgLSBtX0J1Zk9mZnNldF07Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgaWYgKCFtX3BGaWxlQWNjZXNzLT5SZWFkQmxvY2sobV9wRmlsZUJ1ZiwgcmVhZF9wb3MsIHJlYWRfc2l6ZSkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgbV9CdWZPZmZzZXQgPSByZWFkX3BvczsKKyAgfQorICBjaCA9IG1fcEZpbGVCdWZbcG9zIC0gbV9CdWZPZmZzZXRdOworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ1BERl9TeW50YXhQYXJzZXI6OlJlYWRCbG9jayhGWF9MUEJZVEUgcEJ1ZiwgRlhfRFdPUkQgc2l6ZSkKLXsKLSAgICBpZiAoIW1fcEZpbGVBY2Nlc3MtPlJlYWRCbG9jayhwQnVmLCBtX1BvcyArIG1fSGVhZGVyT2Zmc2V0LCBzaXplKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fUG9zICs9IHNpemU7Ci0gICAgcmV0dXJuIFRSVUU7CitGWF9CT09MIENQREZfU3ludGF4UGFyc2VyOjpSZWFkQmxvY2sodWludDhfdCogcEJ1ZiwgRlhfRFdPUkQgc2l6ZSkgeworICBpZiAoIW1fcEZpbGVBY2Nlc3MtPlJlYWRCbG9jayhwQnVmLCBtX1BvcyArIG1fSGVhZGVyT2Zmc2V0LCBzaXplKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX1BvcyArPSBzaXplOworICByZXR1cm4gVFJVRTsKIH0KLSNkZWZpbmUgTUFYX1dPUkRfQlVGRkVSIDI1Ngotdm9pZCBDUERGX1N5bnRheFBhcnNlcjo6R2V0TmV4dFdvcmQoKQotewotICAgIG1fV29yZFNpemUgPSAwOwotICAgIG1fYklzTnVtYmVyID0gVFJVRTsKLSAgICBGWF9CWVRFIGNoOwotICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7CisKK3ZvaWQgQ1BERl9TeW50YXhQYXJzZXI6OkdldE5leHRXb3JkSW50ZXJuYWwoYm9vbCogYklzTnVtYmVyKSB7CisgIG1fV29yZFNpemUgPSAwOworICBpZiAoYklzTnVtYmVyKQorICAgICpiSXNOdW1iZXIgPSB0cnVlOworICB1aW50OF90IGNoOworICBpZiAoIUdldE5leHRDaGFyKGNoKSkgeworICAgIHJldHVybjsKKyAgfQorICB3aGlsZSAoMSkgeworICAgIHdoaWxlIChQREZDaGFySXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpCiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgRlhfQllURSB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKKyAgICBpZiAoY2ggIT0gJyUnKQorICAgICAgYnJlYWs7CisKICAgICB3aGlsZSAoMSkgewotICAgICAgICB3aGlsZSAodHlwZSA9PSAnVycpIHsKLSAgICAgICAgICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoICE9ICclJykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNoID09ICdccicgfHwgY2ggPT0gJ1xuJykgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOworICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpCisgICAgICAgIHJldHVybjsKKyAgICAgIGlmIChQREZDaGFySXNMaW5lRW5kaW5nKGNoKSkKKyAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIGlmICh0eXBlID09ICdEJykgewotICAgICAgICBtX2JJc051bWJlciA9IEZBTFNFOworICB9CisKKyAgaWYgKFBERkNoYXJJc0RlbGltaXRlcihjaCkpIHsKKyAgICBpZiAoYklzTnVtYmVyKQorICAgICAgKmJJc051bWJlciA9IGZhbHNlOworICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7CisgICAgaWYgKGNoID09ICcvJykgeworICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpCisgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmICghUERGQ2hhcklzT3RoZXIoY2gpICYmICFQREZDaGFySXNOdW1lcmljKGNoKSkgeworICAgICAgICAgIG1fUG9zLS07CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1fV29yZFNpemUgPCBzaXplb2YobV9Xb3JkQnVmZmVyKSAtIDEpCisgICAgICAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNoID09ICc8JykgeworICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpCisgICAgICAgIHJldHVybjsKKyAgICAgIGlmIChjaCA9PSAnPCcpCiAgICAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7Ci0gICAgICAgIGlmIChjaCA9PSAnLycpIHsKLSAgICAgICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSAnUicgJiYgdHlwZSAhPSAnTicpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9Qb3MgLS07Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1fV29yZFNpemUgPCBNQVhfV09SRF9CVUZGRVIpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJzwnKSB7Ci0gICAgICAgICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjaCA9PSAnPCcpIHsKLSAgICAgICAgICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX1BvcyAtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnPicpIHsKLSAgICAgICAgICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNoID09ICc+JykgewotICAgICAgICAgICAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fUG9zIC0tOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIG1fUG9zLS07CisgICAgfSBlbHNlIGlmIChjaCA9PSAnPicpIHsKKyAgICAgIGlmICghR2V0TmV4dENoYXIoY2gpKQogICAgICAgICByZXR1cm47CisgICAgICBpZiAoY2ggPT0gJz4nKQorICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOworICAgICAgZWxzZQorICAgICAgICBtX1Bvcy0tOwogICAgIH0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAobV9Xb3JkU2l6ZSA8IE1BWF9XT1JEX0JVRkZFUikgewotICAgICAgICAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZSAhPSAnTicpIHsKLSAgICAgICAgICAgIG1fYklzTnVtYmVyID0gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKLSAgICAgICAgaWYgKHR5cGUgPT0gJ0QnIHx8IHR5cGUgPT0gJ1cnKSB7Ci0gICAgICAgICAgICBtX1BvcyAtLTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgd2hpbGUgKDEpIHsKKyAgICBpZiAobV9Xb3JkU2l6ZSA8IHNpemVvZihtX1dvcmRCdWZmZXIpIC0gMSkKKyAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7CisKKyAgICBpZiAoIVBERkNoYXJJc051bWVyaWMoY2gpKQorICAgICAgaWYgKGJJc051bWJlcikKKyAgICAgICAgKmJJc051bWJlciA9IGZhbHNlOworICAgIGlmICghR2V0TmV4dENoYXIoY2gpKQorICAgICAgcmV0dXJuOworCisgICAgaWYgKFBERkNoYXJJc0RlbGltaXRlcihjaCkgfHwgUERGQ2hhcklzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgIG1fUG9zLS07CisgICAgICBicmVhazsKICAgICB9CisgIH0KIH0KLUNGWF9CeXRlU3RyaW5nIENQREZfU3ludGF4UGFyc2VyOjpSZWFkU3RyaW5nKCkKLXsKLSAgICBGWF9CWVRFIGNoOworCitDRlhfQnl0ZVN0cmluZyBDUERGX1N5bnRheFBhcnNlcjo6UmVhZFN0cmluZygpIHsKKyAgdWludDhfdCBjaDsKKyAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKKyAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKKyAgfQorICBDRlhfQnl0ZVRleHRCdWYgYnVmOworICBpbnQzMl90IHBhcmxldmVsID0gMDsKKyAgaW50MzJfdCBzdGF0dXMgPSAwLCBpRXNjQ29kZSA9IDA7CisgIHdoaWxlICgxKSB7CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKGNoID09ICcpJykgeworICAgICAgICAgIGlmIChwYXJsZXZlbCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gYnVmLkdldEJ5dGVTdHJpbmcoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcGFybGV2ZWwtLTsKKyAgICAgICAgICBidWYuQXBwZW5kQ2hhcignKScpOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcoJykgeworICAgICAgICAgIHBhcmxldmVsKys7CisgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJygnKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXFwnKSB7CisgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBidWYuQXBwZW5kQ2hhcihjaCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE6CisgICAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzcnKSB7CisgICAgICAgICAgaUVzY0NvZGUgPSBGWFNZU190b0RlY2ltYWxEaWdpdChjaCk7CisgICAgICAgICAgc3RhdHVzID0gMjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2ggPT0gJ24nKSB7CisgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJ1xuJyk7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ3InKSB7CisgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJ1xyJyk7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ3QnKSB7CisgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJ1x0Jyk7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ2InKSB7CisgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJ1xiJyk7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ2YnKSB7CisgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJ1xmJyk7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgIHN0YXR1cyA9IDQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKGNoKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnNycpIHsKKyAgICAgICAgICBpRXNjQ29kZSA9IGlFc2NDb2RlICogOCArIEZYU1lTX3RvRGVjaW1hbERpZ2l0KGNoKTsKKyAgICAgICAgICBzdGF0dXMgPSAzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKGlFc2NDb2RlKTsKKyAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOgorICAgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc3JykgeworICAgICAgICAgIGlFc2NDb2RlID0gaUVzY0NvZGUgKiA4ICsgRlhTWVNfdG9EZWNpbWFsRGlnaXQoY2gpOworICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKGlFc2NDb2RlKTsKKyAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKGlFc2NDb2RlKTsKKyAgICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0OgorICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICBpZiAoY2ggIT0gJ1xuJykgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgewotICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICBDRlhfQnl0ZVRleHRCdWYgYnVmOwotICAgIEZYX0lOVDMyIHBhcmxldmVsID0gMDsKLSAgICBGWF9JTlQzMiBzdGF0dXMgPSAwLCBpRXNjQ29kZSA9IDA7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJyknKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJsZXZlbCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVmLkdldEJ5dGVTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwYXJsZXZlbCAtLTsKLSAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJyknKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcoJykgewotICAgICAgICAgICAgICAgICAgICBwYXJsZXZlbCArKzsKLSAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZENoYXIoJygnKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdcXCcpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kQ2hhcihjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzcnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlFc2NDb2RlID0gY2ggLSAnMCc7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ24nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCdcbicpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ3InKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCdccicpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ3QnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCdcdCcpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ2InKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCdcYicpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ2YnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCdcZicpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSA0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kQ2hhcihjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnNycpIHsKLSAgICAgICAgICAgICAgICAgICAgaUVzY0NvZGUgPSBpRXNjQ29kZSAqIDggKyBjaCAtICcwJzsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kQ2hhcihpRXNjQ29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc3JykgewotICAgICAgICAgICAgICAgICAgICBpRXNjQ29kZSA9IGlFc2NDb2RlICogOCArIGNoIC0gJzAnOwotICAgICAgICAgICAgICAgICAgICBidWYuQXBwZW5kQ2hhcihpRXNjQ29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmLkFwcGVuZENoYXIoaUVzY0NvZGUpOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIEdldE5leHRDaGFyKGNoKTsKLSAgICByZXR1cm4gYnVmLkdldEJ5dGVTdHJpbmcoKTsKKyAgfQorICBHZXROZXh0Q2hhcihjaCk7CisgIHJldHVybiBidWYuR2V0Qnl0ZVN0cmluZygpOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9TeW50YXhQYXJzZXI6OlJlYWRIZXhTdHJpbmcoKQotewotICAgIEZYX0JZVEUgY2g7Ci0gICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci0gICAgfQotICAgIENGWF9CaW5hcnlCdWYgYnVmOwotICAgIEZYX0JPT0wgYkZpcnN0ID0gVFJVRTsKLSAgICBGWF9CWVRFIGNvZGUgPSAwOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmIChjaCA9PSAnPicpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7Ci0gICAgICAgICAgICBpZiAoYkZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgY29kZSA9IChjaCAtICcwJykgKiAxNjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29kZSArPSBjaCAtICcwJzsKLSAgICAgICAgICAgICAgICBidWYuQXBwZW5kQnl0ZSgoRlhfQllURSljb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJGaXJzdCA9ICFiRmlyc3Q7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykgewotICAgICAgICAgICAgaWYgKGJGaXJzdCkgewotICAgICAgICAgICAgICAgIGNvZGUgPSAoY2ggLSAnQScgKyAxMCkgKiAxNjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29kZSArPSBjaCAtICdBJyArIDEwOwotICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRCeXRlKChGWF9CWVRFKWNvZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYkZpcnN0ID0gIWJGaXJzdDsKLSAgICAgICAgfSBlbHNlIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKSB7Ci0gICAgICAgICAgICBpZiAoYkZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgY29kZSA9IChjaCAtICdhJyArIDEwKSAqIDE2OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb2RlICs9IGNoIC0gJ2EnICsgMTA7Ci0gICAgICAgICAgICAgICAgYnVmLkFwcGVuZEJ5dGUoKEZYX0JZVEUpY29kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiRmlyc3QgPSAhYkZpcnN0OwotICAgICAgICB9Ci0gICAgICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIWJGaXJzdCkgewotICAgICAgICBidWYuQXBwZW5kQnl0ZSgoRlhfQllURSljb2RlKTsKLSAgICB9Ci0gICAgcmV0dXJuIGJ1Zi5HZXRCeXRlU3RyaW5nKCk7Ci19Ci12b2lkIENQREZfU3ludGF4UGFyc2VyOjpUb05leHRMaW5lKCkKLXsKLSAgICBGWF9CWVRFIGNoOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoID09ICdcbicpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2ggPT0gJ1xyJykgewotICAgICAgICAgICAgR2V0TmV4dENoYXIoY2gpOwotICAgICAgICAgICAgaWYgKGNoID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fUG9zIC0tOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLXZvaWQgQ1BERl9TeW50YXhQYXJzZXI6OlRvTmV4dFdvcmQoKQotewotICAgIEZYX0JZVEUgY2g7Ci0gICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9CWVRFIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIHdoaWxlICh0eXBlID09ICdXJykgewotICAgICAgICAgICAgbV9kd1dvcmRQb3MgPSBtX1BvczsKLSAgICAgICAgICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoICE9ICclJykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNoID09ICdccicgfHwgY2ggPT0gJ1xuJykgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwotICAgIH0KLSAgICBtX1BvcyAtLTsKLX0KLUNGWF9CeXRlU3RyaW5nIENQREZfU3ludGF4UGFyc2VyOjpHZXROZXh0V29yZChGWF9CT09MJiBiSXNOdW1iZXIpCi17Ci0gICAgR2V0TmV4dFdvcmQoKTsKLSAgICBiSXNOdW1iZXIgPSBtX2JJc051bWJlcjsKLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKEZYX0xQQ1NUUiltX1dvcmRCdWZmZXIsIG1fV29yZFNpemUpOwotfQotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9TeW50YXhQYXJzZXI6OkdldEtleXdvcmQoKQotewotICAgIEdldE5leHRXb3JkKCk7Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKChGWF9MUENTVFIpbV9Xb3JkQnVmZmVyLCBtX1dvcmRTaXplKTsKLX0KLUNQREZfT2JqZWN0KiBDUERGX1N5bnRheFBhcnNlcjo6R2V0T2JqZWN0KENQREZfSW5kaXJlY3RPYmplY3RzKiBwT2JqTGlzdCwgRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0sIFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0LCBGWF9CT09MIGJEZWNyeXB0KQotewotICAgIENGWF9BdXRvUmVzdG9yZXI8aW50PiByZXN0b3Jlcigmc19DdXJyZW50UmVjdXJzaW9uRGVwdGgpOwotICAgIGlmICgrK3NfQ3VycmVudFJlY3Vyc2lvbkRlcHRoID4ga1BhcnNlck1heFJlY3Vyc2lvbkRlcHRoKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fUG9zOwotICAgIEZYX0JPT0wgYlR5cGVPbmx5ID0gcENvbnRleHQgJiYgKHBDb250ZXh0LT5tX0ZsYWdzICYgUERGUEFSU0VfVFlQRU9OTFkpOwotICAgIEZYX0JPT0wgYklzTnVtYmVyOwotICAgIENGWF9CeXRlU3RyaW5nIHdvcmQgPSBHZXROZXh0V29yZChiSXNOdW1iZXIpOwotICAgIENQREZfT2JqZWN0KiBwUmV0ID0gTlVMTDsKLSAgICBpZiAod29yZC5HZXRMZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgIGlmIChiVHlwZU9ubHkpIHsKLSAgICAgICAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9JTlZBTElEOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoYklzTnVtYmVyKSB7Ci0gICAgICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9Qb3M7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIG5leHR3b3JkID0gR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICAgICAgaWYgKGJJc051bWJlcikgewotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmV4dHdvcmQyID0gR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICAgICAgICAgIGlmIChuZXh0d29yZDIgPT0gRlhfQlNUUkMoIlIiKSkgewotICAgICAgICAgICAgICAgIEZYX0RXT1JEIG9iam51bSA9IEZYU1lTX2F0b2kod29yZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJUeXBlT25seSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfUkVGRVJFTkNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwUmV0ID0gQ1BERl9SZWZlcmVuY2U6OkNyZWF0ZShwT2JqTGlzdCwgb2JqbnVtKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcFJldDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9Qb3MgPSBTYXZlZFBvczsKLSAgICAgICAgICAgICAgICBpZiAoYlR5cGVPbmx5KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9OVU1CRVI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBSZXQgPSBDUERGX051bWJlcjo6Q3JlYXRlKHdvcmQpOwotICAgICAgICAgICAgICAgIHJldHVybiBwUmV0OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9Qb3MgPSBTYXZlZFBvczsKLSAgICAgICAgICAgIGlmIChiVHlwZU9ubHkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfTlVNQkVSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFJldCA9IENQREZfTnVtYmVyOjpDcmVhdGUod29yZCk7Ci0gICAgICAgICAgICByZXR1cm4gcFJldDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAod29yZCA9PSBGWF9CU1RSQygidHJ1ZSIpIHx8IHdvcmQgPT0gRlhfQlNUUkMoImZhbHNlIikpIHsKLSAgICAgICAgaWYgKGJUeXBlT25seSkgewotICAgICAgICAgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX0JPT0xFQU47Ci0gICAgICAgIH0KLSAgICAgICAgcFJldCA9IENQREZfQm9vbGVhbjo6Q3JlYXRlKHdvcmQgPT0gRlhfQlNUUkMoInRydWUiKSk7Ci0gICAgICAgIHJldHVybiBwUmV0OwotICAgIH0KLSAgICBpZiAod29yZCA9PSBGWF9CU1RSQygibnVsbCIpKSB7Ci0gICAgICAgIGlmIChiVHlwZU9ubHkpIHsKLSAgICAgICAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIHBSZXQgPSBDUERGX051bGw6OkNyZWF0ZSgpOwotICAgICAgICByZXR1cm4gcFJldDsKLSAgICB9Ci0gICAgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIigiKSkgewotICAgICAgICBpZiAoYlR5cGVPbmx5KSB7Ci0gICAgICAgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfU1RSSU5HOwotICAgICAgICB9Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IFJlYWRTdHJpbmcoKTsKLSAgICAgICAgaWYgKG1fcENyeXB0b0hhbmRsZXIgJiYgYkRlY3J5cHQpIHsKLSAgICAgICAgICAgIG1fcENyeXB0b0hhbmRsZXItPkRlY3J5cHQob2JqbnVtLCBnZW5udW0sIHN0cik7Ci0gICAgICAgIH0KLSAgICAgICAgcFJldCA9IENQREZfU3RyaW5nOjpDcmVhdGUoc3RyLCBGQUxTRSk7Ci0gICAgICAgIHJldHVybiBwUmV0OwotICAgIH0KLSAgICBpZiAod29yZCA9PSBGWF9CU1RSQygiPCIpKSB7Ci0gICAgICAgIGlmIChiVHlwZU9ubHkpIHsKLSAgICAgICAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9TVFJJTkc7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gUmVhZEhleFN0cmluZygpOwotICAgICAgICBpZiAobV9wQ3J5cHRvSGFuZGxlciAmJiBiRGVjcnlwdCkgewotICAgICAgICAgICAgbV9wQ3J5cHRvSGFuZGxlci0+RGVjcnlwdChvYmpudW0sIGdlbm51bSwgc3RyKTsKLSAgICAgICAgfQotICAgICAgICBwUmV0ID0gQ1BERl9TdHJpbmc6OkNyZWF0ZShzdHIsIFRSVUUpOwotICAgICAgICByZXR1cm4gcFJldDsKLSAgICB9Ci0gICAgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIlsiKSkgewotICAgICAgICBpZiAoYlR5cGVPbmx5KSB7Ci0gICAgICAgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfQVJSQVk7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gQ1BERl9BcnJheTo6Q3JlYXRlKCk7Ci0gICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IEdldE9iamVjdChwT2JqTGlzdCwgb2JqbnVtLCBnZW5udW0pOwotICAgICAgICAgICAgaWYgKHBPYmogPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBwQXJyYXk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQXJyYXktPkFkZChwT2JqKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAod29yZFswXSA9PSAnLycpIHsKLSAgICAgICAgaWYgKGJUeXBlT25seSkgewotICAgICAgICAgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX05BTUU7Ci0gICAgICAgIH0KLSAgICAgICAgcFJldCA9IENQREZfTmFtZTo6Q3JlYXRlKFBERl9OYW1lRGVjb2RlKENGWF9CeXRlU3RyaW5nQyhtX1dvcmRCdWZmZXIgKyAxLCBtX1dvcmRTaXplIC0gMSkpKTsKLSAgICAgICAgcmV0dXJuIHBSZXQ7Ci0gICAgfQotICAgIGlmICh3b3JkID09IEZYX0JTVFJDKCI8PCIpKSB7Ci0gICAgICAgIGlmIChiVHlwZU9ubHkpIHsKLSAgICAgICAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9ESUNUSU9OQVJZOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwQ29udGV4dCkgewotICAgICAgICAgICAgcENvbnRleHQtPm1fRGljdFN0YXJ0ID0gU2F2ZWRQb3M7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCk7Ci0gICAgICAgIEZYX0lOVDMyIG5LZXlzID0gMDsKLSAgICAgICAgRlhfRklMRVNJWkUgZHdTaWduVmFsdWVQb3MgPSAwOwotICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgRlhfQk9PTCBiSXNOdW1iZXI7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBrZXkgPSBHZXROZXh0V29yZChiSXNOdW1iZXIpOwotICAgICAgICAgICAgaWYgKGtleS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAocERpY3QpCi0gICAgICAgICAgICAgICAgICAgIHBEaWN0LT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fUG9zIC0ga2V5LkdldExlbmd0aCgpOwotICAgICAgICAgICAgaWYgKGtleSA9PSBGWF9CU1RSQygiPj4iKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGtleSA9PSBGWF9CU1RSQygiZW5kb2JqIikpIHsKLSAgICAgICAgICAgICAgICBtX1BvcyA9IFNhdmVkUG9zOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGtleVswXSAhPSAnLycpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5LZXlzICsrOwotICAgICAgICAgICAga2V5ID0gUERGX05hbWVEZWNvZGUoa2V5KTsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gRlhfQlNUUkMoIi9Db250ZW50cyIpKSB7Ci0gICAgICAgICAgICAgICAgZHdTaWduVmFsdWVQb3MgPSBtX1BvczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gR2V0T2JqZWN0KHBPYmpMaXN0LCBvYmpudW0sIGdlbm51bSk7Ci0gICAgICAgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoa2V5LkdldExlbmd0aCgpID49IDEpIHsKLSAgICAgICAgICAgICAgICBpZiAobktleXMgPCAzMikgewotICAgICAgICAgICAgICAgICAgICBwRGljdC0+U2V0QXQoQ0ZYX0J5dGVTdHJpbmdDKGtleS5jX3N0cigpICsgMSwga2V5LkdldExlbmd0aCgpIC0gMSksIHBPYmopOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBEaWN0LT5BZGRWYWx1ZShDRlhfQnl0ZVN0cmluZ0Moa2V5LmNfc3RyKCkgKyAxLCBrZXkuR2V0TGVuZ3RoKCkgLSAxKSwgcE9iaik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChJc1NpZ25hdHVyZURpY3QocERpY3QpKSB7Ci0gICAgICAgICAgICBGWF9GSUxFU0laRSBkd1NhdmVQb3MgPSBtX1BvczsKLSAgICAgICAgICAgIG1fUG9zID0gZHdTaWduVmFsdWVQb3M7Ci0gICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IEdldE9iamVjdChwT2JqTGlzdCwgb2JqbnVtLCBnZW5udW0sIE5VTEwsIEZBTFNFKTsKLSAgICAgICAgICAgIHBEaWN0LT5TZXRBdChGWF9CU1RSQygiQ29udGVudHMiKSwgcE9iaik7Ci0gICAgICAgICAgICBtX1BvcyA9IGR3U2F2ZVBvczsKLSAgICAgICAgfQotICAgICAgICBpZiAocENvbnRleHQpIHsKLSAgICAgICAgICAgIHBDb250ZXh0LT5tX0RpY3RFbmQgPSBtX1BvczsKLSAgICAgICAgICAgIGlmIChwQ29udGV4dC0+bV9GbGFncyAmIFBERlBBUlNFX05PU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBEaWN0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9Qb3M7Ci0gICAgICAgIEZYX0JPT0wgYklzTnVtYmVyOwotICAgICAgICBDRlhfQnl0ZVN0cmluZyBuZXh0d29yZCA9IEdldE5leHRXb3JkKGJJc051bWJlcik7Ci0gICAgICAgIGlmIChuZXh0d29yZCA9PSBGWF9CU1RSQygic3RyZWFtIikpIHsKLSAgICAgICAgICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gUmVhZFN0cmVhbShwRGljdCwgcENvbnRleHQsIG9iam51bSwgZ2VubnVtKTsKLSAgICAgICAgICAgIGlmIChwU3RyZWFtKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBTdHJlYW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocERpY3QpCi0gICAgICAgICAgICAgICAgcERpY3QtPlJlbGVhc2UoKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9Qb3MgPSBTYXZlZFBvczsKLSAgICAgICAgICAgIHJldHVybiBwRGljdDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAod29yZCA9PSBGWF9CU1RSQygiPj4iKSkgewotICAgICAgICBtX1BvcyA9IFNhdmVkUG9zOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKGJUeXBlT25seSkgewotICAgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfSU5WQUxJRDsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci1DUERGX09iamVjdCogQ1BERl9TeW50YXhQYXJzZXI6OkdldE9iamVjdEJ5U3RyaWN0KENQREZfSW5kaXJlY3RPYmplY3RzKiBwT2JqTGlzdCwgRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0sIHN0cnVjdCBQQVJTRV9DT05URVhUKiBwQ29udGV4dCkKLXsKLSAgICBDRlhfQXV0b1Jlc3RvcmVyPGludD4gcmVzdG9yZXIoJnNfQ3VycmVudFJlY3Vyc2lvbkRlcHRoKTsKLSAgICBpZiAoKytzX0N1cnJlbnRSZWN1cnNpb25EZXB0aCA+IGtQYXJzZXJNYXhSZWN1cnNpb25EZXB0aCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1BvczsKLSAgICBGWF9CT09MIGJUeXBlT25seSA9IHBDb250ZXh0ICYmIChwQ29udGV4dC0+bV9GbGFncyAmIFBERlBBUlNFX1RZUEVPTkxZKTsKLSAgICBGWF9CT09MIGJJc051bWJlcjsKLSAgICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICBpZiAod29yZC5HZXRMZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgIGlmIChiVHlwZU9ubHkpIHsKLSAgICAgICAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9JTlZBTElEOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoYklzTnVtYmVyKSB7Ci0gICAgICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9Qb3M7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIG5leHR3b3JkID0gR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICAgICAgaWYgKGJJc051bWJlcikgewotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmV4dHdvcmQyID0gR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICAgICAgICAgIGlmIChuZXh0d29yZDIgPT0gRlhfQlNUUkMoIlIiKSkgewotICAgICAgICAgICAgICAgIEZYX0RXT1JEIG9iam51bSA9IEZYU1lTX2F0b2kod29yZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJUeXBlT25seSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfUkVGRVJFTkNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gQ1BERl9SZWZlcmVuY2U6OkNyZWF0ZShwT2JqTGlzdCwgb2JqbnVtKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9Qb3MgPSBTYXZlZFBvczsKLSAgICAgICAgICAgICAgICBpZiAoYlR5cGVPbmx5KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9OVU1CRVI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBDUERGX051bWJlcjo6Q3JlYXRlKHdvcmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9Qb3MgPSBTYXZlZFBvczsKLSAgICAgICAgICAgIGlmIChiVHlwZU9ubHkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfTlVNQkVSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIENQREZfTnVtYmVyOjpDcmVhdGUod29yZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHdvcmQgPT0gRlhfQlNUUkMoInRydWUiKSB8fCB3b3JkID09IEZYX0JTVFJDKCJmYWxzZSIpKSB7Ci0gICAgICAgIGlmIChiVHlwZU9ubHkpIHsKLSAgICAgICAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9CT09MRUFOOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDUERGX0Jvb2xlYW46OkNyZWF0ZSh3b3JkID09IEZYX0JTVFJDKCJ0cnVlIikpOwotICAgIH0KLSAgICBpZiAod29yZCA9PSBGWF9CU1RSQygibnVsbCIpKSB7Ci0gICAgICAgIGlmIChiVHlwZU9ubHkpIHsKLSAgICAgICAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9OVUxMOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDUERGX051bGw6OkNyZWF0ZSgpOwotICAgIH0KLSAgICBpZiAod29yZCA9PSBGWF9CU1RSQygiKCIpKSB7Ci0gICAgICAgIGlmIChiVHlwZU9ubHkpIHsKLSAgICAgICAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9TVFJJTkc7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gUmVhZFN0cmluZygpOwotICAgICAgICBpZiAobV9wQ3J5cHRvSGFuZGxlcikgewotICAgICAgICAgICAgbV9wQ3J5cHRvSGFuZGxlci0+RGVjcnlwdChvYmpudW0sIGdlbm51bSwgc3RyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ1BERl9TdHJpbmc6OkNyZWF0ZShzdHIsIEZBTFNFKTsKLSAgICB9Ci0gICAgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIjwiKSkgewotICAgICAgICBpZiAoYlR5cGVPbmx5KSB7Ci0gICAgICAgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfU1RSSU5HOwotICAgICAgICB9Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IFJlYWRIZXhTdHJpbmcoKTsKLSAgICAgICAgaWYgKG1fcENyeXB0b0hhbmRsZXIpIHsKLSAgICAgICAgICAgIG1fcENyeXB0b0hhbmRsZXItPkRlY3J5cHQob2JqbnVtLCBnZW5udW0sIHN0cik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENQREZfU3RyaW5nOjpDcmVhdGUoc3RyLCBUUlVFKTsKLSAgICB9Ci0gICAgaWYgKHdvcmQgPT0gRlhfQlNUUkMoIlsiKSkgewotICAgICAgICBpZiAoYlR5cGVPbmx5KSB7Ci0gICAgICAgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfQVJSQVk7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gQ1BERl9BcnJheTo6Q3JlYXRlKCk7Ci0gICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IEdldE9iamVjdChwT2JqTGlzdCwgb2JqbnVtLCBnZW5udW0pOwotICAgICAgICAgICAgaWYgKHBPYmogPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmIChtX1dvcmRCdWZmZXJbMF0gPT0gJ10nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwQXJyYXk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwQXJyYXkpIHsKLSAgICAgICAgICAgICAgICAgICAgcEFycmF5LT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFycmF5LT5BZGQocE9iaik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHdvcmRbMF0gPT0gJy8nKSB7Ci0gICAgICAgIGlmIChiVHlwZU9ubHkpIHsKLSAgICAgICAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9OQU1FOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDUERGX05hbWU6OkNyZWF0ZShQREZfTmFtZURlY29kZShDRlhfQnl0ZVN0cmluZ0MobV9Xb3JkQnVmZmVyICsgMSwgbV9Xb3JkU2l6ZSAtIDEpKSk7Ci0gICAgfQotICAgIGlmICh3b3JkID09IEZYX0JTVFJDKCI8PCIpKSB7Ci0gICAgICAgIGlmIChiVHlwZU9ubHkpIHsKLSAgICAgICAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9ESUNUSU9OQVJZOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwQ29udGV4dCkgewotICAgICAgICAgICAgcENvbnRleHQtPm1fRGljdFN0YXJ0ID0gU2F2ZWRQb3M7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCk7Ci0gICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICBGWF9CT09MIGJJc051bWJlcjsKLSAgICAgICAgICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9Qb3M7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBrZXkgPSBHZXROZXh0V29yZChiSXNOdW1iZXIpOwotICAgICAgICAgICAgaWYgKGtleS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAocERpY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcERpY3QtPlJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoa2V5ID09IEZYX0JTVFJDKCI+PiIpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoa2V5ID09IEZYX0JTVFJDKCJlbmRvYmoiKSkgewotICAgICAgICAgICAgICAgIG1fUG9zID0gU2F2ZWRQb3M7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoa2V5WzBdICE9ICcvJykgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAga2V5ID0gUERGX05hbWVEZWNvZGUoa2V5KTsKLSAgICAgICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gR2V0T2JqZWN0KHBPYmpMaXN0LCBvYmpudW0sIGdlbm51bSk7Ci0gICAgICAgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBEaWN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHBEaWN0LT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZYX0JZVEUgY2g7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAweDBBIHx8IGNoID09IDB4MEQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGtleS5HZXRMZW5ndGgoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICBwRGljdC0+QWRkVmFsdWUoQ0ZYX0J5dGVTdHJpbmdDKGtleS5jX3N0cigpICsgMSwga2V5LkdldExlbmd0aCgpIC0gMSksIHBPYmopOwotICAgICAgICAgICAgfSAKLSAgICAgICAgfQotICAgICAgICBpZiAocENvbnRleHQpIHsKLSAgICAgICAgICAgIHBDb250ZXh0LT5tX0RpY3RFbmQgPSBtX1BvczsKLSAgICAgICAgICAgIGlmIChwQ29udGV4dC0+bV9GbGFncyAmIFBERlBBUlNFX05PU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBEaWN0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9Qb3M7Ci0gICAgICAgIEZYX0JPT0wgYklzTnVtYmVyOwotICAgICAgICBDRlhfQnl0ZVN0cmluZyBuZXh0d29yZCA9IEdldE5leHRXb3JkKGJJc051bWJlcik7Ci0gICAgICAgIGlmIChuZXh0d29yZCA9PSBGWF9CU1RSQygic3RyZWFtIikpIHsKLSAgICAgICAgICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gUmVhZFN0cmVhbShwRGljdCwgcENvbnRleHQsIG9iam51bSwgZ2VubnVtKTsKLSAgICAgICAgICAgIGlmIChwU3RyZWFtKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBTdHJlYW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocERpY3QpIHsKLSAgICAgICAgICAgICAgICBwRGljdC0+UmVsZWFzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX1BvcyA9IFNhdmVkUG9zOwotICAgICAgICAgICAgcmV0dXJuIHBEaWN0OwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICh3b3JkID09IEZYX0JTVFJDKCI+PiIpKSB7Ci0gICAgICAgIG1fUG9zID0gU2F2ZWRQb3M7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoYlR5cGVPbmx5KSB7Ci0gICAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9JTlZBTElEOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLUNQREZfU3RyZWFtKiBDUERGX1N5bnRheFBhcnNlcjo6UmVhZFN0cmVhbShDUERGX0RpY3Rpb25hcnkqIHBEaWN0LCBQQVJTRV9DT05URVhUKiBwQ29udGV4dCwKLSAgICAgICAgRlhfRFdPUkQgb2JqbnVtLCBGWF9EV09SRCBnZW5udW0pCi17Ci0gICAgQ1BERl9PYmplY3QqIHBMZW5PYmogPSBwRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiTGVuZ3RoIikpOwotICAgIEZYX0ZJTEVTSVpFIGxlbiA9IDA7Ci0gICAgaWYgKHBMZW5PYmogJiYgKChwTGVuT2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX1JFRkVSRU5DRSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKCgoKENQREZfUmVmZXJlbmNlKilwTGVuT2JqKS0+R2V0T2JqTGlzdCgpICE9IE5VTEwpICYmCi0gICAgICAgICAgICAgICAgICAgICAoKENQREZfUmVmZXJlbmNlKilwTGVuT2JqKS0+R2V0UmVmT2JqTnVtKCkgIT0gb2JqbnVtKSkpIHsKLSAgICAgICAgbGVuID0gcExlbk9iai0+R2V0SW50ZWdlcigpOworQ0ZYX0J5dGVTdHJpbmcgQ1BERl9TeW50YXhQYXJzZXI6OlJlYWRIZXhTdHJpbmcoKSB7CisgIHVpbnQ4X3QgY2g7CisgIGlmICghR2V0TmV4dENoYXIoY2gpKQorICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOworCisgIENGWF9CaW5hcnlCdWYgYnVmOworICBib29sIGJGaXJzdCA9IHRydWU7CisgIHVpbnQ4X3QgY29kZSA9IDA7CisgIHdoaWxlICgxKSB7CisgICAgaWYgKGNoID09ICc+JykKKyAgICAgIGJyZWFrOworCisgICAgaWYgKHN0ZDo6aXN4ZGlnaXQoY2gpKSB7CisgICAgICBpbnQgdmFsID0gRlhTWVNfdG9IZXhEaWdpdChjaCk7CisgICAgICBpZiAoYkZpcnN0KSB7CisgICAgICAgIGNvZGUgPSB2YWwgKiAxNjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvZGUgKz0gdmFsOworICAgICAgICBidWYuQXBwZW5kQnl0ZSgodWludDhfdCljb2RlKTsKKyAgICAgIH0KKyAgICAgIGJGaXJzdCA9ICFiRmlyc3Q7CiAgICAgfQogCi0gICAgVG9OZXh0TGluZSgpOwotICAgIEZYX0ZJTEVTSVpFIFN0cmVhbVN0YXJ0UG9zID0gbV9Qb3M7CisgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpCisgICAgICBicmVhazsKKyAgfQorICBpZiAoIWJGaXJzdCkKKyAgICBidWYuQXBwZW5kQnl0ZSgodWludDhfdCljb2RlKTsKKworICByZXR1cm4gYnVmLkdldEJ5dGVTdHJpbmcoKTsKK30KK3ZvaWQgQ1BERl9TeW50YXhQYXJzZXI6OlRvTmV4dExpbmUoKSB7CisgIHVpbnQ4X3QgY2g7CisgIHdoaWxlIChHZXROZXh0Q2hhcihjaCkpIHsKKyAgICBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChjaCA9PSAnXHInKSB7CisgICAgICBHZXROZXh0Q2hhcihjaCk7CisgICAgICBpZiAoY2ggIT0gJ1xuJykgeworICAgICAgICAtLW1fUG9zOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9Cit2b2lkIENQREZfU3ludGF4UGFyc2VyOjpUb05leHRXb3JkKCkgeworICB1aW50OF90IGNoOworICBpZiAoIUdldE5leHRDaGFyKGNoKSkKKyAgICByZXR1cm47CisKKyAgd2hpbGUgKDEpIHsKKyAgICB3aGlsZSAoUERGQ2hhcklzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgIG1fZHdXb3JkUG9zID0gbV9Qb3M7CisgICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChjaCAhPSAnJScpCisgICAgICBicmVhazsKKworICAgIHdoaWxlICgxKSB7CisgICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkKKyAgICAgICAgcmV0dXJuOworICAgICAgaWYgKFBERkNoYXJJc0xpbmVFbmRpbmcoY2gpKQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgbV9Qb3MtLTsKK30KKworQ0ZYX0J5dGVTdHJpbmcgQ1BERl9TeW50YXhQYXJzZXI6OkdldE5leHRXb3JkKGJvb2wqIGJJc051bWJlcikgeworICBHZXROZXh0V29yZEludGVybmFsKGJJc051bWJlcik7CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZygoY29uc3QgRlhfQ0hBUiopbV9Xb3JkQnVmZmVyLCBtX1dvcmRTaXplKTsKK30KKworQ0ZYX0J5dGVTdHJpbmcgQ1BERl9TeW50YXhQYXJzZXI6OkdldEtleXdvcmQoKSB7CisgIHJldHVybiBHZXROZXh0V29yZChudWxscHRyKTsKK30KKworQ1BERl9PYmplY3QqIENQREZfU3ludGF4UGFyc2VyOjpHZXRPYmplY3QoQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlciogcE9iakxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBnZW5udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJTRV9DT05URVhUKiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRlY3J5cHQpIHsKKyAgQ0ZYX0F1dG9SZXN0b3JlcjxpbnQ+IHJlc3RvcmVyKCZzX0N1cnJlbnRSZWN1cnNpb25EZXB0aCk7CisgIGlmICgrK3NfQ3VycmVudFJlY3Vyc2lvbkRlcHRoID4ga1BhcnNlck1heFJlY3Vyc2lvbkRlcHRoKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1BvczsKKyAgRlhfQk9PTCBiVHlwZU9ubHkgPSBwQ29udGV4dCAmJiAocENvbnRleHQtPm1fRmxhZ3MgJiBQREZQQVJTRV9UWVBFT05MWSk7CisgIGJvb2wgYklzTnVtYmVyOworICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gR2V0TmV4dFdvcmQoJmJJc051bWJlcik7CisgIGlmICh3b3JkLkdldExlbmd0aCgpID09IDApIHsKKyAgICBpZiAoYlR5cGVPbmx5KQorICAgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX0lOVkFMSUQ7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKGJJc051bWJlcikgeworICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9Qb3M7CisgICAgQ0ZYX0J5dGVTdHJpbmcgbmV4dHdvcmQgPSBHZXROZXh0V29yZCgmYklzTnVtYmVyKTsKKyAgICBpZiAoYklzTnVtYmVyKSB7CisgICAgICBDRlhfQnl0ZVN0cmluZyBuZXh0d29yZDIgPSBHZXROZXh0V29yZChudWxscHRyKTsKKyAgICAgIGlmIChuZXh0d29yZDIgPT0gIlIiKSB7CisgICAgICAgIEZYX0RXT1JEIG9iam51bSA9IEZYU1lTX2F0b2kod29yZCk7CisgICAgICAgIGlmIChiVHlwZU9ubHkpCisgICAgICAgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX1JFRkVSRU5DRTsKKyAgICAgICAgcmV0dXJuIG5ldyBDUERGX1JlZmVyZW5jZShwT2JqTGlzdCwgb2JqbnVtKTsKKyAgICAgIH0KKyAgICB9CisgICAgbV9Qb3MgPSBTYXZlZFBvczsKKyAgICBpZiAoYlR5cGVPbmx5KQorICAgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX05VTUJFUjsKKyAgICByZXR1cm4gbmV3IENQREZfTnVtYmVyKHdvcmQpOworICB9CisgIGlmICh3b3JkID09ICJ0cnVlIiB8fCB3b3JkID09ICJmYWxzZSIpIHsKKyAgICBpZiAoYlR5cGVPbmx5KQorICAgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX0JPT0xFQU47CisgICAgcmV0dXJuIG5ldyBDUERGX0Jvb2xlYW4od29yZCA9PSAidHJ1ZSIpOworICB9CisgIGlmICh3b3JkID09ICJudWxsIikgeworICAgIGlmIChiVHlwZU9ubHkpCisgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfTlVMTDsKKyAgICByZXR1cm4gbmV3IENQREZfTnVsbDsKKyAgfQorICBpZiAod29yZCA9PSAiKCIpIHsKKyAgICBpZiAoYlR5cGVPbmx5KQorICAgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX1NUUklORzsKKyAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBSZWFkU3RyaW5nKCk7CisgICAgaWYgKG1fcENyeXB0b0hhbmRsZXIgJiYgYkRlY3J5cHQpIHsKKyAgICAgIG1fcENyeXB0b0hhbmRsZXItPkRlY3J5cHQob2JqbnVtLCBnZW5udW0sIHN0cik7CisgICAgfQorICAgIHJldHVybiBuZXcgQ1BERl9TdHJpbmcoc3RyLCBGQUxTRSk7CisgIH0KKyAgaWYgKHdvcmQgPT0gIjwiKSB7CisgICAgaWYgKGJUeXBlT25seSkKKyAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9TVFJJTkc7CisgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gUmVhZEhleFN0cmluZygpOworICAgIGlmIChtX3BDcnlwdG9IYW5kbGVyICYmIGJEZWNyeXB0KSB7CisgICAgICBtX3BDcnlwdG9IYW5kbGVyLT5EZWNyeXB0KG9iam51bSwgZ2VubnVtLCBzdHIpOworICAgIH0KKyAgICByZXR1cm4gbmV3IENQREZfU3RyaW5nKHN0ciwgVFJVRSk7CisgIH0KKyAgaWYgKHdvcmQgPT0gIlsiKSB7CisgICAgaWYgKGJUeXBlT25seSkKKyAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9BUlJBWTsKKyAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBuZXcgQ1BERl9BcnJheTsKKyAgICB3aGlsZSAoQ1BERl9PYmplY3QqIHBPYmogPQorICAgICAgICAgICAgICAgR2V0T2JqZWN0KHBPYmpMaXN0LCBvYmpudW0sIGdlbm51bSwgbnVsbHB0ciwgdHJ1ZSkpIHsKKyAgICAgIHBBcnJheS0+QWRkKHBPYmopOworICAgIH0KKyAgICByZXR1cm4gcEFycmF5OworICB9CisgIGlmICh3b3JkWzBdID09ICcvJykgeworICAgIGlmIChiVHlwZU9ubHkpCisgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfTkFNRTsKKyAgICByZXR1cm4gbmV3IENQREZfTmFtZSgKKyAgICAgICAgUERGX05hbWVEZWNvZGUoQ0ZYX0J5dGVTdHJpbmdDKG1fV29yZEJ1ZmZlciArIDEsIG1fV29yZFNpemUgLSAxKSkpOworICB9CisgIGlmICh3b3JkID09ICI8PCIpIHsKKyAgICBpZiAoYlR5cGVPbmx5KQorICAgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX0RJQ1RJT05BUlk7CisKKyAgICBpZiAocENvbnRleHQpCisgICAgICBwQ29udGV4dC0+bV9EaWN0U3RhcnQgPSBTYXZlZFBvczsKKworICAgIGludDMyX3QgbktleXMgPSAwOworICAgIEZYX0ZJTEVTSVpFIGR3U2lnblZhbHVlUG9zID0gMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9EaWN0aW9uYXJ5LCBSZWxlYXNlRGVsZXRlcjxDUERGX0RpY3Rpb25hcnk+PiBwRGljdCgKKyAgICAgICAgbmV3IENQREZfRGljdGlvbmFyeSk7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgIENGWF9CeXRlU3RyaW5nIGtleSA9IEdldE5leHRXb3JkKG51bGxwdHIpOworICAgICAgaWYgKGtleS5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fUG9zIC0ga2V5LkdldExlbmd0aCgpOworICAgICAgaWYgKGtleSA9PSAiPj4iKQorICAgICAgICBicmVhazsKKworICAgICAgaWYgKGtleSA9PSAiZW5kb2JqIikgeworICAgICAgICBtX1BvcyA9IFNhdmVkUG9zOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChrZXlbMF0gIT0gJy8nKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgKytuS2V5czsKKyAgICAgIGtleSA9IFBERl9OYW1lRGVjb2RlKGtleSk7CisgICAgICBpZiAoa2V5LklzRW1wdHkoKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGlmIChrZXkgPT0gIi9Db250ZW50cyIpCisgICAgICAgIGR3U2lnblZhbHVlUG9zID0gbV9Qb3M7CisKKyAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gR2V0T2JqZWN0KHBPYmpMaXN0LCBvYmpudW0sIGdlbm51bSwgbnVsbHB0ciwgdHJ1ZSk7CisgICAgICBpZiAoIXBPYmopCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBDRlhfQnl0ZVN0cmluZ0Mga2V5Tm9TbGFzaChrZXkuY19zdHIoKSArIDEsIGtleS5HZXRMZW5ndGgoKSAtIDEpOworICAgICAgcERpY3QtPlNldEF0KGtleU5vU2xhc2gsIHBPYmopOworICAgIH0KKworICAgIC8vIE9ubHkgd2hlbiB0aGlzIGlzIGEgc2lnbmF0dXJlIGRpY3Rpb25hcnkgYW5kIGhhcyBjb250ZW50cywgd2UgcmVzZXQgdGhlCisgICAgLy8gY29udGVudHMgdG8gdGhlIHVuLWRlY3J5cHRlZCBmb3JtLgorICAgIGlmIChJc1NpZ25hdHVyZURpY3QocERpY3QuZ2V0KCkpICYmIGR3U2lnblZhbHVlUG9zKSB7CisgICAgICBDRlhfQXV0b1Jlc3RvcmVyPEZYX0ZJTEVTSVpFPiBzYXZlX3BvcygmbV9Qb3MpOworICAgICAgbV9Qb3MgPSBkd1NpZ25WYWx1ZVBvczsKKyAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gR2V0T2JqZWN0KHBPYmpMaXN0LCBvYmpudW0sIGdlbm51bSwgbnVsbHB0ciwgRkFMU0UpOworICAgICAgcERpY3QtPlNldEF0KCJDb250ZW50cyIsIHBPYmopOworICAgIH0KICAgICBpZiAocENvbnRleHQpIHsKLSAgICAgICAgcENvbnRleHQtPm1fRGF0YVN0YXJ0ID0gbV9Qb3M7CisgICAgICBwQ29udGV4dC0+bV9EaWN0RW5kID0gbV9Qb3M7CisgICAgICBpZiAocENvbnRleHQtPm1fRmxhZ3MgJiBQREZQQVJTRV9OT1NUUkVBTSkgeworICAgICAgICByZXR1cm4gcERpY3QucmVsZWFzZSgpOworICAgICAgfQorICAgIH0KKyAgICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fUG9zOworICAgIENGWF9CeXRlU3RyaW5nIG5leHR3b3JkID0gR2V0TmV4dFdvcmQobnVsbHB0cik7CisgICAgaWYgKG5leHR3b3JkICE9ICJzdHJlYW0iKSB7CisgICAgICBtX1BvcyA9IFNhdmVkUG9zOworICAgICAgcmV0dXJuIHBEaWN0LnJlbGVhc2UoKTsKICAgICB9CiAKLSAgICBDUERGX0NyeXB0b0hhbmRsZXIqIHBDcnlwdG9IYW5kbGVyID0gb2JqbnVtID09IChGWF9EV09SRCltX01ldGFkYXRhT2JqbnVtID8gTlVMTCA6IG1fcENyeXB0b0hhbmRsZXI7Ci0gICAgaWYgKHBDcnlwdG9IYW5kbGVyID09IE5VTEwpIHsKLSAgICAgICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxGWF9GSUxFU0laRT4gcG9zID0gbV9Qb3M7Ci0gICAgICAgIHBvcyArPSBsZW47Ci0gICAgICAgIGlmIChwb3MuSXNWYWxpZCgpICYmIHBvcy5WYWx1ZU9yRGllKCkgPCBtX0ZpbGVMZW4pIHsKLSAgICAgICAgICAgIG1fUG9zID0gcG9zLlZhbHVlT3JEaWUoKTsKLSAgICAgICAgfQotICAgICAgICBHZXROZXh0V29yZCgpOwotICAgICAgICBpZiAobV9Xb3JkU2l6ZSA8IDkgfHwgRlhTWVNfbWVtY21wMzIobV9Xb3JkQnVmZmVyLCAiZW5kc3RyZWFtIiwgOSkpIHsKLSAgICAgICAgICAgIG1fUG9zID0gU3RyZWFtU3RhcnRQb3M7Ci0gICAgICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQgPSBGaW5kVGFnKEZYX0JTVFJDKCJlbmRzdHJlYW0iKSwgMCk7Ci0gICAgICAgICAgICBpZiAob2Zmc2V0ID49IDApIHsKLSAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBjdXJQb3MgPSBtX1BvczsKLSAgICAgICAgICAgICAgICBtX1BvcyA9IFN0cmVhbVN0YXJ0UG9zOwotICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIGVuZG9iak9mZnNldCA9IEZpbmRUYWcoRlhfQlNUUkMoImVuZG9iaiIpLCAwKTsKLSAgICAgICAgICAgICAgICBpZiAoZW5kb2JqT2Zmc2V0IDwgb2Zmc2V0ICYmIGVuZG9iak9mZnNldCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGVuZG9iak9mZnNldDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtX1BvcyA9IGN1clBvczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhfQllURSBieXRlMSwgYnl0ZTI7Ci0gICAgICAgICAgICAgICAgR2V0Q2hhckF0KFN0cmVhbVN0YXJ0UG9zICsgb2Zmc2V0IC0gMSwgYnl0ZTEpOwotICAgICAgICAgICAgICAgIEdldENoYXJBdChTdHJlYW1TdGFydFBvcyArIG9mZnNldCAtIDIsIGJ5dGUyKTsKLSAgICAgICAgICAgICAgICBpZiAoYnl0ZTEgPT0gMHgwYSAmJiBieXRlMiA9PSAweDBkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxlbiAtPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnl0ZTEgPT0gMHgwYSB8fCBieXRlMSA9PSAweDBkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxlbiAtLTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGVuID0gKEZYX0RXT1JEKW9mZnNldDsKLSAgICAgICAgICAgICAgICBwRGljdC0+U2V0QXRJbnRlZ2VyKEZYX0JTVFJDKCJMZW5ndGgiKSwgbGVuKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9Qb3MgPSBTdHJlYW1TdGFydFBvczsKLSAgICAgICAgICAgICAgICBpZiAoRmluZFRhZyhGWF9CU1RSQygiZW5kb2JqIiksIDApIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9Qb3MgPSBTdHJlYW1TdGFydFBvczsKKyAgICByZXR1cm4gUmVhZFN0cmVhbShwRGljdC5yZWxlYXNlKCksIHBDb250ZXh0LCBvYmpudW0sIGdlbm51bSk7CisgIH0KKyAgaWYgKHdvcmQgPT0gIj4+IikgeworICAgIG1fUG9zID0gU2F2ZWRQb3M7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgaWYgKGJUeXBlT25seSkKKyAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfSU5WQUxJRDsKKworICByZXR1cm4gbnVsbHB0cjsKK30KKworQ1BERl9PYmplY3QqIENQREZfU3ludGF4UGFyc2VyOjpHZXRPYmplY3RCeVN0cmljdCgKKyAgICBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBwT2JqTGlzdCwKKyAgICBGWF9EV09SRCBvYmpudW0sCisgICAgRlhfRFdPUkQgZ2VubnVtLAorICAgIFBBUlNFX0NPTlRFWFQqIHBDb250ZXh0KSB7CisgIENGWF9BdXRvUmVzdG9yZXI8aW50PiByZXN0b3Jlcigmc19DdXJyZW50UmVjdXJzaW9uRGVwdGgpOworICBpZiAoKytzX0N1cnJlbnRSZWN1cnNpb25EZXB0aCA+IGtQYXJzZXJNYXhSZWN1cnNpb25EZXB0aCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9Qb3M7CisgIEZYX0JPT0wgYlR5cGVPbmx5ID0gcENvbnRleHQgJiYgKHBDb250ZXh0LT5tX0ZsYWdzICYgUERGUEFSU0VfVFlQRU9OTFkpOworICBib29sIGJJc051bWJlcjsKKyAgQ0ZYX0J5dGVTdHJpbmcgd29yZCA9IEdldE5leHRXb3JkKCZiSXNOdW1iZXIpOworICBpZiAod29yZC5HZXRMZW5ndGgoKSA9PSAwKSB7CisgICAgaWYgKGJUeXBlT25seSkKKyAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9JTlZBTElEOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGlmIChiSXNOdW1iZXIpIHsKKyAgICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fUG9zOworICAgIENGWF9CeXRlU3RyaW5nIG5leHR3b3JkID0gR2V0TmV4dFdvcmQoJmJJc051bWJlcik7CisgICAgaWYgKGJJc051bWJlcikgeworICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmV4dHdvcmQyID0gR2V0TmV4dFdvcmQobnVsbHB0cik7CisgICAgICBpZiAobmV4dHdvcmQyID09ICJSIikgeworICAgICAgICBpZiAoYlR5cGVPbmx5KQorICAgICAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9SRUZFUkVOQ0U7CisgICAgICAgIEZYX0RXT1JEIG9iam51bSA9IEZYU1lTX2F0b2kod29yZCk7CisgICAgICAgIHJldHVybiBuZXcgQ1BERl9SZWZlcmVuY2UocE9iakxpc3QsIG9iam51bSk7CisgICAgICB9CiAgICAgfQotICAgIENQREZfU3RyZWFtKiBwU3RyZWFtOwotICAgIEZYX0xQQllURSBwRGF0YSA9IEZYX0FsbG9jKEZYX0JZVEUsIGxlbik7CisgICAgbV9Qb3MgPSBTYXZlZFBvczsKKyAgICBpZiAoYlR5cGVPbmx5KQorICAgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX05VTUJFUjsKKyAgICByZXR1cm4gbmV3IENQREZfTnVtYmVyKHdvcmQpOworICB9CisgIGlmICh3b3JkID09ICJ0cnVlIiB8fCB3b3JkID09ICJmYWxzZSIpIHsKKyAgICBpZiAoYlR5cGVPbmx5KQorICAgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX0JPT0xFQU47CisgICAgcmV0dXJuIG5ldyBDUERGX0Jvb2xlYW4od29yZCA9PSAidHJ1ZSIpOworICB9CisgIGlmICh3b3JkID09ICJudWxsIikgeworICAgIGlmIChiVHlwZU9ubHkpCisgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfTlVMTDsKKyAgICByZXR1cm4gbmV3IENQREZfTnVsbDsKKyAgfQorICBpZiAod29yZCA9PSAiKCIpIHsKKyAgICBpZiAoYlR5cGVPbmx5KQorICAgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX1NUUklORzsKKyAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBSZWFkU3RyaW5nKCk7CisgICAgaWYgKG1fcENyeXB0b0hhbmRsZXIpCisgICAgICBtX3BDcnlwdG9IYW5kbGVyLT5EZWNyeXB0KG9iam51bSwgZ2VubnVtLCBzdHIpOworICAgIHJldHVybiBuZXcgQ1BERl9TdHJpbmcoc3RyLCBGQUxTRSk7CisgIH0KKyAgaWYgKHdvcmQgPT0gIjwiKSB7CisgICAgaWYgKGJUeXBlT25seSkKKyAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9TVFJJTkc7CisgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gUmVhZEhleFN0cmluZygpOworICAgIGlmIChtX3BDcnlwdG9IYW5kbGVyKQorICAgICAgbV9wQ3J5cHRvSGFuZGxlci0+RGVjcnlwdChvYmpudW0sIGdlbm51bSwgc3RyKTsKKyAgICByZXR1cm4gbmV3IENQREZfU3RyaW5nKHN0ciwgVFJVRSk7CisgIH0KKyAgaWYgKHdvcmQgPT0gIlsiKSB7CisgICAgaWYgKGJUeXBlT25seSkKKyAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9BUlJBWTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9BcnJheSwgUmVsZWFzZURlbGV0ZXI8Q1BERl9BcnJheT4+IHBBcnJheSgKKyAgICAgICAgbmV3IENQREZfQXJyYXkpOworICAgIHdoaWxlIChDUERGX09iamVjdCogcE9iaiA9CisgICAgICAgICAgICAgICBHZXRPYmplY3QocE9iakxpc3QsIG9iam51bSwgZ2VubnVtLCBudWxscHRyLCB0cnVlKSkgeworICAgICAgcEFycmF5LT5BZGQocE9iaik7CisgICAgfQorICAgIHJldHVybiBtX1dvcmRCdWZmZXJbMF0gPT0gJ10nID8gcEFycmF5LnJlbGVhc2UoKSA6IG51bGxwdHI7CisgIH0KKyAgaWYgKHdvcmRbMF0gPT0gJy8nKSB7CisgICAgaWYgKGJUeXBlT25seSkKKyAgICAgIHJldHVybiAoQ1BERl9PYmplY3QqKVBERk9CSl9OQU1FOworICAgIHJldHVybiBuZXcgQ1BERl9OYW1lKAorICAgICAgICBQREZfTmFtZURlY29kZShDRlhfQnl0ZVN0cmluZ0MobV9Xb3JkQnVmZmVyICsgMSwgbV9Xb3JkU2l6ZSAtIDEpKSk7CisgIH0KKyAgaWYgKHdvcmQgPT0gIjw8IikgeworICAgIGlmIChiVHlwZU9ubHkpCisgICAgICByZXR1cm4gKENQREZfT2JqZWN0KilQREZPQkpfRElDVElPTkFSWTsKKyAgICBpZiAocENvbnRleHQpCisgICAgICBwQ29udGV4dC0+bV9EaWN0U3RhcnQgPSBTYXZlZFBvczsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0RpY3Rpb25hcnksIFJlbGVhc2VEZWxldGVyPENQREZfRGljdGlvbmFyeT4+IHBEaWN0KAorICAgICAgICBuZXcgQ1BERl9EaWN0aW9uYXJ5KTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1BvczsKKyAgICAgIENGWF9CeXRlU3RyaW5nIGtleSA9IEdldE5leHRXb3JkKG51bGxwdHIpOworICAgICAgaWYgKGtleS5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICBpZiAoa2V5ID09ICI+PiIpCisgICAgICAgIGJyZWFrOworCisgICAgICBpZiAoa2V5ID09ICJlbmRvYmoiKSB7CisgICAgICAgIG1fUG9zID0gU2F2ZWRQb3M7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKGtleVswXSAhPSAnLycpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBrZXkgPSBQREZfTmFtZURlY29kZShrZXkpOworICAgICAgc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0LCBSZWxlYXNlRGVsZXRlcjxDUERGX09iamVjdD4+IG9iaigKKyAgICAgICAgICBHZXRPYmplY3QocE9iakxpc3QsIG9iam51bSwgZ2VubnVtLCBudWxscHRyLCB0cnVlKSk7CisgICAgICBpZiAoIW9iaikgeworICAgICAgICB1aW50OF90IGNoOworICAgICAgICB3aGlsZSAoR2V0TmV4dENoYXIoY2gpICYmIGNoICE9IDB4MEEgJiYgY2ggIT0gMHgwRCkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgfQorICAgICAgaWYgKGtleS5HZXRMZW5ndGgoKSA+IDEpIHsKKyAgICAgICAgcERpY3QtPlNldEF0KENGWF9CeXRlU3RyaW5nQyhrZXkuY19zdHIoKSArIDEsIGtleS5HZXRMZW5ndGgoKSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgb2JqLnJlbGVhc2UoKSk7CisgICAgICB9CisgICAgfQorICAgIGlmIChwQ29udGV4dCkgeworICAgICAgcENvbnRleHQtPm1fRGljdEVuZCA9IG1fUG9zOworICAgICAgaWYgKHBDb250ZXh0LT5tX0ZsYWdzICYgUERGUEFSU0VfTk9TVFJFQU0pIHsKKyAgICAgICAgcmV0dXJuIHBEaWN0LnJlbGVhc2UoKTsKKyAgICAgIH0KKyAgICB9CisgICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1BvczsKKyAgICBDRlhfQnl0ZVN0cmluZyBuZXh0d29yZCA9IEdldE5leHRXb3JkKG51bGxwdHIpOworICAgIGlmIChuZXh0d29yZCAhPSAic3RyZWFtIikgeworICAgICAgbV9Qb3MgPSBTYXZlZFBvczsKKyAgICAgIHJldHVybiBwRGljdC5yZWxlYXNlKCk7CisgICAgfQorCisgICAgcmV0dXJuIFJlYWRTdHJlYW0ocERpY3QucmVsZWFzZSgpLCBwQ29udGV4dCwgb2JqbnVtLCBnZW5udW0pOworICB9CisgIGlmICh3b3JkID09ICI+PiIpIHsKKyAgICBtX1BvcyA9IFNhdmVkUG9zOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGlmIChiVHlwZU9ubHkpCisgICAgcmV0dXJuIChDUERGX09iamVjdCopUERGT0JKX0lOVkFMSUQ7CisgIHJldHVybiBudWxscHRyOworfQorCit1bnNpZ25lZCBpbnQgQ1BERl9TeW50YXhQYXJzZXI6OlJlYWRFT0xNYXJrZXJzKEZYX0ZJTEVTSVpFIHBvcykgeworICB1bnNpZ25lZCBjaGFyIGJ5dGUxID0gMDsKKyAgdW5zaWduZWQgY2hhciBieXRlMiA9IDA7CisgIEdldENoYXJBdChwb3MsIGJ5dGUxKTsKKyAgR2V0Q2hhckF0KHBvcyArIDEsIGJ5dGUyKTsKKyAgdW5zaWduZWQgaW50IG1hcmtlcnMgPSAwOworICBpZiAoYnl0ZTEgPT0gJ1xyJyAmJiBieXRlMiA9PSAnXG4nKSB7CisgICAgbWFya2VycyA9IDI7CisgIH0gZWxzZSBpZiAoYnl0ZTEgPT0gJ1xyJyB8fCBieXRlMSA9PSAnXG4nKSB7CisgICAgbWFya2VycyA9IDE7CisgIH0KKyAgcmV0dXJuIG1hcmtlcnM7Cit9CitDUERGX1N0cmVhbSogQ1BERl9TeW50YXhQYXJzZXI6OlJlYWRTdHJlYW0oQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJTRV9DT05URVhUKiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZ2VubnVtKSB7CisgIENQREZfT2JqZWN0KiBwTGVuT2JqID0gcERpY3QtPkdldEVsZW1lbnQoIkxlbmd0aCIpOworICBGWF9GSUxFU0laRSBsZW4gPSAtMTsKKyAgQ1BERl9SZWZlcmVuY2UqIHBMZW5PYmpSZWYgPSBUb1JlZmVyZW5jZShwTGVuT2JqKTsKKworICBib29sIGRpZmZlcmluZ09iak51bSA9ICFwTGVuT2JqUmVmIHx8IChwTGVuT2JqUmVmLT5HZXRPYmpMaXN0KCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlbk9ialJlZi0+R2V0UmVmT2JqTnVtKCkgIT0gb2JqbnVtKTsKKyAgaWYgKHBMZW5PYmogJiYgZGlmZmVyaW5nT2JqTnVtKQorICAgIGxlbiA9IHBMZW5PYmotPkdldEludGVnZXIoKTsKKworICAvLyBMb2NhdGUgdGhlIHN0YXJ0IG9mIHN0cmVhbS4KKyAgVG9OZXh0TGluZSgpOworICBGWF9GSUxFU0laRSBzdHJlYW1TdGFydFBvcyA9IG1fUG9zOworICBpZiAocENvbnRleHQpIHsKKyAgICBwQ29udGV4dC0+bV9EYXRhU3RhcnQgPSBzdHJlYW1TdGFydFBvczsKKyAgfQorCisgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyBrRW5kU3RyZWFtU3RyKCJlbmRzdHJlYW0iKTsKKyAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDIGtFbmRPYmpTdHIoImVuZG9iaiIpOworICBDUERGX0NyeXB0b0hhbmRsZXIqIHBDcnlwdG9IYW5kbGVyID0KKyAgICAgIG9iam51bSA9PSAoRlhfRFdPUkQpbV9NZXRhZGF0YU9iam51bSA/IG51bGxwdHIgOiBtX3BDcnlwdG9IYW5kbGVyLmdldCgpOworICBpZiAoIXBDcnlwdG9IYW5kbGVyKSB7CisgICAgRlhfQk9PTCBiU2VhcmNoRm9yS2V5d29yZCA9IFRSVUU7CisgICAgaWYgKGxlbiA+PSAwKSB7CisgICAgICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPEZYX0ZJTEVTSVpFPiBwb3MgPSBtX1BvczsKKyAgICAgIHBvcyArPSBsZW47CisgICAgICBpZiAocG9zLklzVmFsaWQoKSAmJiBwb3MuVmFsdWVPckRpZSgpIDwgbV9GaWxlTGVuKSB7CisgICAgICAgIG1fUG9zID0gcG9zLlZhbHVlT3JEaWUoKTsKKyAgICAgIH0KKyAgICAgIG1fUG9zICs9IFJlYWRFT0xNYXJrZXJzKG1fUG9zKTsKKyAgICAgIEZYU1lTX21lbXNldChtX1dvcmRCdWZmZXIsIDAsIGtFbmRTdHJlYW1TdHIuR2V0TGVuZ3RoKCkgKyAxKTsKKyAgICAgIEdldE5leHRXb3JkSW50ZXJuYWwobnVsbHB0cik7CisgICAgICAvLyBFYXJsaWVyIHZlcnNpb24gb2YgUERGIHNwZWNpZmljYXRpb24gZG9lc24ndCByZXF1aXJlIEVPTCBtYXJrZXIgYmVmb3JlCisgICAgICAvLyAnZW5kc3RyZWFtJyBrZXl3b3JkLiBJZiBrZXl3b3JkICdlbmRzdHJlYW0nIGZvbGxvd3MgdGhlIGJ5dGVzIGluCisgICAgICAvLyBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBzaWduYWxzIHRoZSBlbmQgb2Ygc3RyZWFtLgorICAgICAgaWYgKEZYU1lTX21lbWNtcChtX1dvcmRCdWZmZXIsIGtFbmRTdHJlYW1TdHIuR2V0UHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgIGtFbmRTdHJlYW1TdHIuR2V0TGVuZ3RoKCkpID09IDApIHsKKyAgICAgICAgYlNlYXJjaEZvcktleXdvcmQgPSBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGJTZWFyY2hGb3JLZXl3b3JkKSB7CisgICAgICAvLyBJZiBsZW4gaXMgbm90IGF2YWlsYWJsZSwgbGVuIG5lZWRzIHRvIGJlIGNhbGN1bGF0ZWQKKyAgICAgIC8vIGJ5IHNlYXJjaGluZyB0aGUga2V5d29yZHMgImVuZHN0cmVhbSIgb3IgImVuZG9iaiIuCisgICAgICBtX1BvcyA9IHN0cmVhbVN0YXJ0UG9zOworICAgICAgRlhfRklMRVNJWkUgZW5kU3RyZWFtT2Zmc2V0ID0gMDsKKyAgICAgIHdoaWxlIChlbmRTdHJlYW1PZmZzZXQgPj0gMCkgeworICAgICAgICBlbmRTdHJlYW1PZmZzZXQgPSBGaW5kVGFnKGtFbmRTdHJlYW1TdHIsIDApOworICAgICAgICBpZiAoZW5kU3RyZWFtT2Zmc2V0IDwgMCkgeworICAgICAgICAgIC8vIENhbid0IGZpbmQgYW55ICJlbmRzdHJlYW0iLgorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChJc1dob2xlV29yZChtX1BvcyAtIGtFbmRTdHJlYW1TdHIuR2V0TGVuZ3RoKCksIG1fRmlsZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtFbmRTdHJlYW1TdHIsIFRSVUUpKSB7CisgICAgICAgICAgLy8gU3RvcCBzZWFyY2hpbmcgd2hlbiB0aGUga2V5d29yZCAiZW5kc3RyZWFtIiBpcyBmb3VuZC4KKyAgICAgICAgICBlbmRTdHJlYW1PZmZzZXQgPSBtX1BvcyAtIHN0cmVhbVN0YXJ0UG9zIC0ga0VuZFN0cmVhbVN0ci5HZXRMZW5ndGgoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbV9Qb3MgPSBzdHJlYW1TdGFydFBvczsKKyAgICAgIEZYX0ZJTEVTSVpFIGVuZE9iak9mZnNldCA9IDA7CisgICAgICB3aGlsZSAoZW5kT2JqT2Zmc2V0ID49IDApIHsKKyAgICAgICAgZW5kT2JqT2Zmc2V0ID0gRmluZFRhZyhrRW5kT2JqU3RyLCAwKTsKKyAgICAgICAgaWYgKGVuZE9iak9mZnNldCA8IDApIHsKKyAgICAgICAgICAvLyBDYW4ndCBmaW5kIGFueSAiZW5kb2JqIi4KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoSXNXaG9sZVdvcmQobV9Qb3MgLSBrRW5kT2JqU3RyLkdldExlbmd0aCgpLCBtX0ZpbGVMZW4sIGtFbmRPYmpTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKSkgeworICAgICAgICAgIC8vIFN0b3Agc2VhcmNoaW5nIHdoZW4gdGhlIGtleXdvcmQgImVuZG9iaiIgaXMgZm91bmQuCisgICAgICAgICAgZW5kT2JqT2Zmc2V0ID0gbV9Qb3MgLSBzdHJlYW1TdGFydFBvcyAtIGtFbmRPYmpTdHIuR2V0TGVuZ3RoKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChlbmRTdHJlYW1PZmZzZXQgPCAwICYmIGVuZE9iak9mZnNldCA8IDApIHsKKyAgICAgICAgLy8gQ2FuJ3QgZmluZCAiZW5kc3RyZWFtIiBvciAiZW5kb2JqIi4KKyAgICAgICAgcERpY3QtPlJlbGVhc2UoKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICB9CisgICAgICBpZiAoZW5kU3RyZWFtT2Zmc2V0IDwgMCAmJiBlbmRPYmpPZmZzZXQgPj0gMCkgeworICAgICAgICAvLyBDb3JyZWN0IHRoZSBwb3NpdGlvbiBvZiBlbmQgc3RyZWFtLgorICAgICAgICBlbmRTdHJlYW1PZmZzZXQgPSBlbmRPYmpPZmZzZXQ7CisgICAgICB9IGVsc2UgaWYgKGVuZFN0cmVhbU9mZnNldCA+PSAwICYmIGVuZE9iak9mZnNldCA8IDApIHsKKyAgICAgICAgLy8gQ29ycmVjdCB0aGUgcG9zaXRpb24gb2YgZW5kIG9iai4KKyAgICAgICAgZW5kT2JqT2Zmc2V0ID0gZW5kU3RyZWFtT2Zmc2V0OworICAgICAgfSBlbHNlIGlmIChlbmRTdHJlYW1PZmZzZXQgPiBlbmRPYmpPZmZzZXQpIHsKKyAgICAgICAgZW5kU3RyZWFtT2Zmc2V0ID0gZW5kT2JqT2Zmc2V0OworICAgICAgfQorICAgICAgbGVuID0gZW5kU3RyZWFtT2Zmc2V0OworICAgICAgaW50IG51bU1hcmtlcnMgPSBSZWFkRU9MTWFya2VycyhzdHJlYW1TdGFydFBvcyArIGVuZFN0cmVhbU9mZnNldCAtIDIpOworICAgICAgaWYgKG51bU1hcmtlcnMgPT0gMikgeworICAgICAgICBsZW4gLT0gMjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG51bU1hcmtlcnMgPSBSZWFkRU9MTWFya2VycyhzdHJlYW1TdGFydFBvcyArIGVuZFN0cmVhbU9mZnNldCAtIDEpOworICAgICAgICBpZiAobnVtTWFya2VycyA9PSAxKSB7CisgICAgICAgICAgbGVuIC09IDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChsZW4gPCAwKSB7CisgICAgICAgIHBEaWN0LT5SZWxlYXNlKCk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgfQorICAgICAgcERpY3QtPlNldEF0SW50ZWdlcigiTGVuZ3RoIiwgbGVuKTsKKyAgICB9CisgICAgbV9Qb3MgPSBzdHJlYW1TdGFydFBvczsKKyAgfQorICBpZiAobGVuIDwgMCkgeworICAgIHBEaWN0LT5SZWxlYXNlKCk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgdWludDhfdCogcERhdGEgPSBudWxscHRyOworICBpZiAobGVuID4gMCkgeworICAgIHBEYXRhID0gRlhfQWxsb2ModWludDhfdCwgbGVuKTsKICAgICBSZWFkQmxvY2socERhdGEsIGxlbik7CiAgICAgaWYgKHBDcnlwdG9IYW5kbGVyKSB7Ci0gICAgICAgIENGWF9CaW5hcnlCdWYgZGVzdF9idWY7Ci0gICAgICAgIGRlc3RfYnVmLkVzdGltYXRlU2l6ZShwQ3J5cHRvSGFuZGxlci0+RGVjcnlwdEdldFNpemUobGVuKSk7Ci0gICAgICAgIEZYX0xQVk9JRCBjb250ZXh0ID0gcENyeXB0b0hhbmRsZXItPkRlY3J5cHRTdGFydChvYmpudW0sIGdlbm51bSk7Ci0gICAgICAgIHBDcnlwdG9IYW5kbGVyLT5EZWNyeXB0U3RyZWFtKGNvbnRleHQsIHBEYXRhLCBsZW4sIGRlc3RfYnVmKTsKLSAgICAgICAgcENyeXB0b0hhbmRsZXItPkRlY3J5cHRGaW5pc2goY29udGV4dCwgZGVzdF9idWYpOwotICAgICAgICBGWF9GcmVlKHBEYXRhKTsKLSAgICAgICAgcERhdGEgPSBkZXN0X2J1Zi5HZXRCdWZmZXIoKTsKLSAgICAgICAgbGVuID0gZGVzdF9idWYuR2V0U2l6ZSgpOwotICAgICAgICBkZXN0X2J1Zi5EZXRhY2hCdWZmZXIoKTsKKyAgICAgIENGWF9CaW5hcnlCdWYgZGVzdF9idWY7CisgICAgICBkZXN0X2J1Zi5Fc3RpbWF0ZVNpemUocENyeXB0b0hhbmRsZXItPkRlY3J5cHRHZXRTaXplKGxlbikpOworICAgICAgdm9pZCogY29udGV4dCA9IHBDcnlwdG9IYW5kbGVyLT5EZWNyeXB0U3RhcnQob2JqbnVtLCBnZW5udW0pOworICAgICAgcENyeXB0b0hhbmRsZXItPkRlY3J5cHRTdHJlYW0oY29udGV4dCwgcERhdGEsIGxlbiwgZGVzdF9idWYpOworICAgICAgcENyeXB0b0hhbmRsZXItPkRlY3J5cHRGaW5pc2goY29udGV4dCwgZGVzdF9idWYpOworICAgICAgRlhfRnJlZShwRGF0YSk7CisgICAgICBwRGF0YSA9IGRlc3RfYnVmLkdldEJ1ZmZlcigpOworICAgICAgbGVuID0gZGVzdF9idWYuR2V0U2l6ZSgpOworICAgICAgZGVzdF9idWYuRGV0YWNoQnVmZmVyKCk7CiAgICAgfQotICAgIHBTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW0ocERhdGEsIGxlbiwgcERpY3QpOwotICAgIGlmIChwQ29udGV4dCkgewotICAgICAgICBwQ29udGV4dC0+bV9EYXRhRW5kID0gcENvbnRleHQtPm1fRGF0YVN0YXJ0ICsgbGVuOwotICAgIH0KLSAgICBTdHJlYW1TdGFydFBvcyA9IG1fUG9zOwotICAgIEdldE5leHRXb3JkKCk7Ci0gICAgaWYgKG1fV29yZFNpemUgPT0gNiAmJiAwID09IEZYU1lTX21lbWNtcDMyKG1fV29yZEJ1ZmZlciwgImVuZG9iaiIsIDYpKSB7Ci0gICAgICAgIG1fUG9zID0gU3RyZWFtU3RhcnRQb3M7Ci0gICAgfQotICAgIHJldHVybiBwU3RyZWFtOworICB9CisgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gbmV3IENQREZfU3RyZWFtKHBEYXRhLCBsZW4sIHBEaWN0KTsKKyAgaWYgKHBDb250ZXh0KSB7CisgICAgcENvbnRleHQtPm1fRGF0YUVuZCA9IHBDb250ZXh0LT5tX0RhdGFTdGFydCArIGxlbjsKKyAgfQorICBzdHJlYW1TdGFydFBvcyA9IG1fUG9zOworICBGWFNZU19tZW1zZXQobV9Xb3JkQnVmZmVyLCAwLCBrRW5kT2JqU3RyLkdldExlbmd0aCgpICsgMSk7CisgIEdldE5leHRXb3JkSW50ZXJuYWwobnVsbHB0cik7CisgIGludCBudW1NYXJrZXJzID0gUmVhZEVPTE1hcmtlcnMobV9Qb3MpOworICBpZiAobV9Xb3JkU2l6ZSA9PSBrRW5kT2JqU3RyLkdldExlbmd0aCgpICYmIG51bU1hcmtlcnMgIT0gMCAmJgorICAgICAgRlhTWVNfbWVtY21wKG1fV29yZEJ1ZmZlciwga0VuZE9ialN0ci5HZXRQdHIoKSwga0VuZE9ialN0ci5HZXRMZW5ndGgoKSkgPT0KKyAgICAgICAgICAwKSB7CisgICAgbV9Qb3MgPSBzdHJlYW1TdGFydFBvczsKKyAgfQorICByZXR1cm4gcFN0cmVhbTsKIH0KLXZvaWQgQ1BERl9TeW50YXhQYXJzZXI6OkluaXRQYXJzZXIoSUZYX0ZpbGVSZWFkKiBwRmlsZUFjY2VzcywgRlhfRFdPUkQgSGVhZGVyT2Zmc2V0KQotewotICAgIGlmIChtX3BGaWxlQnVmKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wRmlsZUJ1Zik7Ci0gICAgICAgIG1fcEZpbGVCdWYgPSBOVUxMOwotICAgIH0KLSAgICBtX3BGaWxlQnVmID0gRlhfQWxsb2MoRlhfQllURSwgbV9CdWZTaXplKTsKLSAgICBtX0hlYWRlck9mZnNldCA9IEhlYWRlck9mZnNldDsKLSAgICBtX0ZpbGVMZW4gPSBwRmlsZUFjY2Vzcy0+R2V0U2l6ZSgpOwotICAgIG1fUG9zID0gMDsKLSAgICBtX3BGaWxlQWNjZXNzID0gcEZpbGVBY2Nlc3M7Ci0gICAgbV9CdWZPZmZzZXQgPSAwOwotICAgIHBGaWxlQWNjZXNzLT5SZWFkQmxvY2sobV9wRmlsZUJ1ZiwgMCwgKHNpemVfdCkoKEZYX0ZJTEVTSVpFKW1fQnVmU2l6ZSA+IG1fRmlsZUxlbiA/IG1fRmlsZUxlbiA6IG1fQnVmU2l6ZSkpOwordm9pZCBDUERGX1N5bnRheFBhcnNlcjo6SW5pdFBhcnNlcihJRlhfRmlsZVJlYWQqIHBGaWxlQWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBIZWFkZXJPZmZzZXQpIHsKKyAgRlhfRnJlZShtX3BGaWxlQnVmKTsKKyAgbV9wRmlsZUJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fQnVmU2l6ZSk7CisgIG1fSGVhZGVyT2Zmc2V0ID0gSGVhZGVyT2Zmc2V0OworICBtX0ZpbGVMZW4gPSBwRmlsZUFjY2Vzcy0+R2V0U2l6ZSgpOworICBtX1BvcyA9IDA7CisgIG1fcEZpbGVBY2Nlc3MgPSBwRmlsZUFjY2VzczsKKyAgbV9CdWZPZmZzZXQgPSAwOworICBwRmlsZUFjY2Vzcy0+UmVhZEJsb2NrKAorICAgICAgbV9wRmlsZUJ1ZiwgMCwKKyAgICAgIChzaXplX3QpKChGWF9GSUxFU0laRSltX0J1ZlNpemUgPiBtX0ZpbGVMZW4gPyBtX0ZpbGVMZW4gOiBtX0J1ZlNpemUpKTsKIH0KLUZYX0lOVDMyIENQREZfU3ludGF4UGFyc2VyOjpHZXREaXJlY3ROdW0oKQotewotICAgIEdldE5leHRXb3JkKCk7Ci0gICAgaWYgKCFtX2JJc051bWJlcikgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemVdID0gMDsKLSAgICByZXR1cm4gRlhTWVNfYXRvaSgoRlhfTFBDU1RSKW1fV29yZEJ1ZmZlcik7CitpbnQzMl90IENQREZfU3ludGF4UGFyc2VyOjpHZXREaXJlY3ROdW0oKSB7CisgIGJvb2wgYklzTnVtYmVyOworICBHZXROZXh0V29yZEludGVybmFsKCZiSXNOdW1iZXIpOworICBpZiAoIWJJc051bWJlcikKKyAgICByZXR1cm4gMDsKKworICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZV0gPSAwOworICByZXR1cm4gRlhTWVNfYXRvaShyZWludGVycHJldF9jYXN0PGNvbnN0IEZYX0NIQVIqPihtX1dvcmRCdWZmZXIpKTsKIH0KLUZYX0JPT0wgQ1BERl9TeW50YXhQYXJzZXI6OklzV2hvbGVXb3JkKEZYX0ZJTEVTSVpFIHN0YXJ0cG9zLCBGWF9GSUxFU0laRSBsaW1pdCwgRlhfTFBDQllURSB0YWcsIEZYX0RXT1JEIHRhZ2xlbikKLXsKLSAgICBGWF9CWVRFIHR5cGUgPSBQREZfQ2hhclR5cGVbdGFnWzBdXTsKLSAgICBGWF9CT09MIGJDaGVja0xlZnQgPSB0eXBlICE9ICdEJyAmJiB0eXBlICE9ICdXJzsKLSAgICB0eXBlID0gUERGX0NoYXJUeXBlW3RhZ1t0YWdsZW4gLSAxXV07Ci0gICAgRlhfQk9PTCBiQ2hlY2tSaWdodCA9IHR5cGUgIT0gJ0QnICYmIHR5cGUgIT0gJ1cnOwotICAgIEZYX0JZVEUgY2g7Ci0gICAgaWYgKGJDaGVja1JpZ2h0ICYmIHN0YXJ0cG9zICsgKEZYX0lOVDMyKXRhZ2xlbiA8PSBsaW1pdCAmJiBHZXRDaGFyQXQoc3RhcnRwb3MgKyAoRlhfSU5UMzIpdGFnbGVuLCBjaCkpIHsKLSAgICAgICAgRlhfQllURSB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKLSAgICAgICAgaWYgKHR5cGUgPT0gJ04nIHx8IHR5cGUgPT0gJ1InKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KKworYm9vbCBDUERGX1N5bnRheFBhcnNlcjo6SXNXaG9sZVdvcmQoRlhfRklMRVNJWkUgc3RhcnRwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBjaGVja0tleXdvcmQpIHsKKyAgY29uc3QgRlhfRFdPUkQgdGFnbGVuID0gdGFnLkdldExlbmd0aCgpOworICBib29sIGJDaGVja0xlZnQgPSAhUERGQ2hhcklzRGVsaW1pdGVyKHRhZ1swXSkgJiYgIVBERkNoYXJJc1doaXRlc3BhY2UodGFnWzBdKTsKKyAgYm9vbCBiQ2hlY2tSaWdodCA9ICFQREZDaGFySXNEZWxpbWl0ZXIodGFnW3RhZ2xlbiAtIDFdKSAmJgorICAgICAgICAgICAgICAgICAgICAgIVBERkNoYXJJc1doaXRlc3BhY2UodGFnW3RhZ2xlbiAtIDFdKTsKKyAgdWludDhfdCBjaDsKKyAgaWYgKGJDaGVja1JpZ2h0ICYmIHN0YXJ0cG9zICsgKGludDMyX3QpdGFnbGVuIDw9IGxpbWl0ICYmCisgICAgICBHZXRDaGFyQXQoc3RhcnRwb3MgKyAoaW50MzJfdCl0YWdsZW4sIGNoKSkgeworICAgIGlmIChQREZDaGFySXNOdW1lcmljKGNoKSB8fCBQREZDaGFySXNPdGhlcihjaCkgfHwKKyAgICAgICAgKGNoZWNrS2V5d29yZCAmJiBQREZDaGFySXNEZWxpbWl0ZXIoY2gpKSkgeworICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBpZiAoYkNoZWNrTGVmdCAmJiBzdGFydHBvcyA+IDAgJiYgR2V0Q2hhckF0KHN0YXJ0cG9zIC0gMSwgY2gpKSB7Ci0gICAgICAgIEZYX0JZVEUgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07Ci0gICAgICAgIGlmICh0eXBlID09ICdOJyB8fCB0eXBlID09ICdSJykgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9CisgIH0KKworICBpZiAoYkNoZWNrTGVmdCAmJiBzdGFydHBvcyA+IDAgJiYgR2V0Q2hhckF0KHN0YXJ0cG9zIC0gMSwgY2gpKSB7CisgICAgaWYgKFBERkNoYXJJc051bWVyaWMoY2gpIHx8IFBERkNoYXJJc090aGVyKGNoKSB8fAorICAgICAgICAoY2hlY2tLZXl3b3JkICYmIFBERkNoYXJJc0RlbGltaXRlcihjaCkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX1N5bnRheFBhcnNlcjo6U2VhcmNoV29yZChGWF9CU1RSIHRhZywgRlhfQk9PTCBiV2hvbGVXb3JkLCBGWF9CT09MIGJGb3J3YXJkLCBGWF9GSUxFU0laRSBsaW1pdCkKLXsKLSAgICBGWF9JTlQzMiB0YWdsZW4gPSB0YWcuR2V0TGVuZ3RoKCk7Ci0gICAgaWYgKHRhZ2xlbiA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfRklMRVNJWkUgcG9zID0gbV9Qb3M7Ci0gICAgRlhfSU5UMzIgb2Zmc2V0ID0gMDsKLSAgICBpZiAoIWJGb3J3YXJkKSB7Ci0gICAgICAgIG9mZnNldCA9IHRhZ2xlbiAtIDE7Ci0gICAgfQotICAgIEZYX0xQQ0JZVEUgdGFnX2RhdGEgPSB0YWcuR2V0UHRyKCk7Ci0gICAgRlhfQllURSBieXRlOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmIChiRm9yd2FyZCkgewotICAgICAgICAgICAgaWYgKGxpbWl0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBvcyA+PSBtX1BvcyArIGxpbWl0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIUdldENoYXJBdChwb3MsIGJ5dGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxpbWl0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBvcyA8PSBtX1BvcyAtIGxpbWl0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIUdldENoYXJBdEJhY2t3YXJkKHBvcywgYnl0ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ5dGUgPT0gdGFnX2RhdGFbb2Zmc2V0XSkgewotICAgICAgICAgICAgaWYgKGJGb3J3YXJkKSB7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICsrOwotICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCB0YWdsZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgcG9zICsrOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG9mZnNldCAtLTsKLSAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcG9zIC0tOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9GSUxFU0laRSBzdGFydHBvcyA9IGJGb3J3YXJkID8gcG9zIC0gdGFnbGVuICsgMSA6IHBvczsKLSAgICAgICAgICAgIGlmICghYldob2xlV29yZCB8fCBJc1dob2xlV29yZChzdGFydHBvcywgbGltaXQsIHRhZy5HZXRQdHIoKSwgdGFnbGVuKSkgewotICAgICAgICAgICAgICAgIG1fUG9zID0gc3RhcnRwb3M7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJGb3J3YXJkKSB7Ci0gICAgICAgICAgICBvZmZzZXQgPSBieXRlID09IHRhZ19kYXRhWzBdID8gMSA6IDA7Ci0gICAgICAgICAgICBwb3MgKys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvZmZzZXQgPSBieXRlID09IHRhZ19kYXRhW3RhZ2xlbiAtIDFdID8gdGFnbGVuIC0gMiA6IHRhZ2xlbiAtIDE7Ci0gICAgICAgICAgICBwb3MgLS07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBvcyA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KKworRlhfQk9PTCBDUERGX1N5bnRheFBhcnNlcjo6U2VhcmNoV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiV2hvbGVXb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGb3J3YXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBsaW1pdCkgeworICBpbnQzMl90IHRhZ2xlbiA9IHRhZy5HZXRMZW5ndGgoKTsKKyAgaWYgKHRhZ2xlbiA9PSAwKSB7CiAgICAgcmV0dXJuIEZBTFNFOwotfQotc3RydWN0IF9TZWFyY2hUYWdSZWNvcmQgewotICAgIEZYX0xQQ0JZVEUJbV9wVGFnOwotICAgIEZYX0RXT1JECW1fTGVuOwotICAgIEZYX0RXT1JECW1fT2Zmc2V0OwotfTsKLUZYX0lOVDMyIENQREZfU3ludGF4UGFyc2VyOjpTZWFyY2hNdWx0aVdvcmQoRlhfQlNUUiB0YWdzLCBGWF9CT09MIGJXaG9sZVdvcmQsIEZYX0ZJTEVTSVpFIGxpbWl0KQotewotICAgIEZYX0lOVDMyIG50YWdzID0gMSwgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgdGFncy5HZXRMZW5ndGgoKTsgaSArKykKLSAgICAgICAgaWYgKHRhZ3NbaV0gPT0gMCkgewotICAgICAgICAgICAgbnRhZ3MgKys7CisgIH0KKyAgRlhfRklMRVNJWkUgcG9zID0gbV9Qb3M7CisgIGludDMyX3Qgb2Zmc2V0ID0gMDsKKyAgaWYgKCFiRm9yd2FyZCkgeworICAgIG9mZnNldCA9IHRhZ2xlbiAtIDE7CisgIH0KKyAgY29uc3QgdWludDhfdCogdGFnX2RhdGEgPSB0YWcuR2V0UHRyKCk7CisgIHVpbnQ4X3QgYnl0ZTsKKyAgd2hpbGUgKDEpIHsKKyAgICBpZiAoYkZvcndhcmQpIHsKKyAgICAgIGlmIChsaW1pdCkgeworICAgICAgICBpZiAocG9zID49IG1fUG9zICsgbGltaXQpIHsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KLSAgICBfU2VhcmNoVGFnUmVjb3JkKiBwUGF0dGVybnMgPSBGWF9BbGxvYyhfU2VhcmNoVGFnUmVjb3JkLCBudGFncyk7Ci0gICAgRlhfRFdPUkQgc3RhcnQgPSAwLCBpdGFnID0gMCwgbWF4X2xlbiA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8PSB0YWdzLkdldExlbmd0aCgpOyBpICsrKSB7Ci0gICAgICAgIGlmICh0YWdzW2ldID09IDApIHsKLSAgICAgICAgICAgIEZYX0RXT1JEIGxlbiA9IGkgLSBzdGFydDsKLSAgICAgICAgICAgIGlmIChsZW4gPiBtYXhfbGVuKSB7Ci0gICAgICAgICAgICAgICAgbWF4X2xlbiA9IGxlbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBQYXR0ZXJuc1tpdGFnXS5tX3BUYWcgPSB0YWdzLkdldFB0cigpICsgc3RhcnQ7Ci0gICAgICAgICAgICBwUGF0dGVybnNbaXRhZ10ubV9MZW4gPSBsZW47Ci0gICAgICAgICAgICBwUGF0dGVybnNbaXRhZ10ubV9PZmZzZXQgPSAwOwotICAgICAgICAgICAgc3RhcnQgPSBpICsgMTsKLSAgICAgICAgICAgIGl0YWcgKys7CisgICAgICB9CisgICAgICBpZiAoIUdldENoYXJBdChwb3MsIGJ5dGUpKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGxpbWl0KSB7CisgICAgICAgIGlmIChwb3MgPD0gbV9Qb3MgLSBsaW1pdCkgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFHZXRDaGFyQXRCYWNrd2FyZChwb3MsIGJ5dGUpKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KICAgICB9Ci0gICAgRlhfRklMRVNJWkUgcG9zID0gbV9Qb3M7Ci0gICAgRlhfQllURSBieXRlOwotICAgIEdldENoYXJBdChwb3MrKywgYnl0ZSk7Ci0gICAgRlhfSU5UMzIgZm91bmQgPSAtMTsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnRhZ3M7IGkgKyspIHsKLSAgICAgICAgICAgIGlmIChwUGF0dGVybnNbaV0ubV9wVGFnW3BQYXR0ZXJuc1tpXS5tX09mZnNldF0gPT0gYnl0ZSkgewotICAgICAgICAgICAgICAgIHBQYXR0ZXJuc1tpXS5tX09mZnNldCArKzsKLSAgICAgICAgICAgICAgICBpZiAocFBhdHRlcm5zW2ldLm1fT2Zmc2V0ID09IHBQYXR0ZXJuc1tpXS5tX0xlbikgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWJXaG9sZVdvcmQgfHwgSXNXaG9sZVdvcmQocG9zIC0gcFBhdHRlcm5zW2ldLm1fTGVuLCBsaW1pdCwgcFBhdHRlcm5zW2ldLm1fcFRhZywgcFBhdHRlcm5zW2ldLm1fTGVuKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocFBhdHRlcm5zW2ldLm1fcFRhZ1swXSA9PSBieXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhdHRlcm5zW2ldLm1fT2Zmc2V0ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhdHRlcm5zW2ldLm1fT2Zmc2V0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBQYXR0ZXJuc1tpXS5tX3BUYWdbMF0gPT0gYnl0ZSkgewotICAgICAgICAgICAgICAgICAgICBwUGF0dGVybnNbaV0ubV9PZmZzZXQgPSAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXR0ZXJuc1tpXS5tX09mZnNldCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgIGlmIChieXRlID09IHRhZ19kYXRhW29mZnNldF0pIHsKKyAgICAgIGlmIChiRm9yd2FyZCkgeworICAgICAgICBvZmZzZXQrKzsKKyAgICAgICAgaWYgKG9mZnNldCA8IHRhZ2xlbikgeworICAgICAgICAgIHBvcysrOworICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIGlmIChsaW1pdCAmJiBwb3MgPj0gbV9Qb3MgKyBsaW1pdCkgewotICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBvZmZzZXQtLTsKKyAgICAgICAgaWYgKG9mZnNldCA+PSAwKSB7CisgICAgICAgICAgcG9zLS07CisgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFHZXRDaGFyQXQocG9zLCBieXRlKSkgewotICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgIH0KLSAgICAgICAgcG9zICsrOworICAgICAgfQorICAgICAgRlhfRklMRVNJWkUgc3RhcnRwb3MgPSBiRm9yd2FyZCA/IHBvcyAtIHRhZ2xlbiArIDEgOiBwb3M7CisgICAgICBpZiAoIWJXaG9sZVdvcmQgfHwgSXNXaG9sZVdvcmQoc3RhcnRwb3MsIGxpbWl0LCB0YWcsIEZBTFNFKSkgeworICAgICAgICBtX1BvcyA9IHN0YXJ0cG9zOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KICAgICB9Ci1lbmQ6Ci0gICAgRlhfRnJlZShwUGF0dGVybnMpOwotICAgIHJldHVybiBmb3VuZDsKLX0KLUZYX0ZJTEVTSVpFIENQREZfU3ludGF4UGFyc2VyOjpGaW5kVGFnKEZYX0JTVFIgdGFnLCBGWF9GSUxFU0laRSBsaW1pdCkKLXsKLSAgICBGWF9JTlQzMiB0YWdsZW4gPSB0YWcuR2V0TGVuZ3RoKCk7Ci0gICAgRlhfSU5UMzIgbWF0Y2ggPSAwOwotICAgIGxpbWl0ICs9IG1fUG9zOwotICAgIEZYX0ZJTEVTSVpFIHN0YXJ0cG9zID0gbV9Qb3M7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgRlhfQllURSBjaDsKLSAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2ggPT0gdGFnW21hdGNoXSkgewotICAgICAgICAgICAgbWF0Y2ggKys7Ci0gICAgICAgICAgICBpZiAobWF0Y2ggPT0gdGFnbGVuKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1fUG9zIC0gc3RhcnRwb3MgLSB0YWdsZW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtYXRjaCA9IGNoID09IHRhZ1swXSA/IDEgOiAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsaW1pdCAmJiBtX1BvcyA9PSBsaW1pdCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9CisgICAgaWYgKGJGb3J3YXJkKSB7CisgICAgICBvZmZzZXQgPSBieXRlID09IHRhZ19kYXRhWzBdID8gMSA6IDA7CisgICAgICBwb3MrKzsKKyAgICB9IGVsc2UgeworICAgICAgb2Zmc2V0ID0gYnl0ZSA9PSB0YWdfZGF0YVt0YWdsZW4gLSAxXSA/IHRhZ2xlbiAtIDIgOiB0YWdsZW4gLSAxOworICAgICAgcG9zLS07CiAgICAgfQotICAgIHJldHVybiAtMTsKLX0KLXZvaWQgQ1BERl9TeW50YXhQYXJzZXI6OkdldEJpbmFyeShGWF9CWVRFKiBidWZmZXIsIEZYX0RXT1JEIHNpemUpCi17Ci0gICAgRlhfRFdPUkQgb2Zmc2V0ID0gMDsKLSAgICBGWF9CWVRFIGNoOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYnVmZmVyW29mZnNldCsrXSA9IGNoOwotICAgICAgICBpZiAob2Zmc2V0ID09IHNpemUpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisgICAgaWYgKHBvcyA8IDApIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQogCi1jbGFzcyBDUERGX0RhdGFBdmFpbCBGWF9GSU5BTCA6IHB1YmxpYyBJUERGX0RhdGFBdmFpbAotewotcHVibGljOgotICAgIENQREZfRGF0YUF2YWlsKElGWF9GaWxlQXZhaWwqIHBGaWxlQXZhaWwsIElGWF9GaWxlUmVhZCogcEZpbGVSZWFkKTsKLSAgICB+Q1BERl9EYXRhQXZhaWwoKTsKLQotICAgIHZpcnR1YWwgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgIElzRG9jQXZhaWwoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgIEZYX09WRVJSSURFOwotCi0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgU2V0RG9jdW1lbnQoQ1BERl9Eb2N1bWVudCogcERvYykgIEZYX09WRVJSSURFOwotCi0gICAgdmlydHVhbCBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgSXNQYWdlQXZhaWwoaW50IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSAgRlhfT1ZFUlJJREU7Ci0KLSAgICB2aXJ0dWFsIEZYX0lOVDMyICAgICAgICAgICAgICAgICAgICBJc0Zvcm1BdmFpbChJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKSAgRlhfT1ZFUlJJREU7Ci0KLSAgICB2aXJ0dWFsIEZYX0lOVDMyICAgICAgICAgICAgICAgICAgICBJc0xpbmVhcml6ZWRQREYoKSAgRlhfT1ZFUlJJREU7Ci0KLSAgICB2aXJ0dWFsIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICBJc0xpbmVhcml6ZWQoKSAgRlhfT1ZFUlJJREUKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2JMaW5lYXJpemVkOworaW50MzJfdCBDUERGX1N5bnRheFBhcnNlcjo6U2VhcmNoTXVsdGlXb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJXaG9sZVdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgbGltaXQpIHsKKyAgaW50MzJfdCBudGFncyA9IDE7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFncy5HZXRMZW5ndGgoKTsgKytpKSB7CisgICAgaWYgKHRhZ3NbaV0gPT0gMCkgeworICAgICAgKytudGFnczsKICAgICB9CisgIH0KIAotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIEdldExpbmVhcml6ZWRNYWluWFJlZkluZm8oRlhfRklMRVNJWkUgKnBQb3MsIEZYX0RXT1JEICpwU2l6ZSkgIEZYX09WRVJSSURFOworICBzdGQ6OnZlY3RvcjxTZWFyY2hUYWdSZWNvcmQ+IHBhdHRlcm5zKG50YWdzKTsKKyAgRlhfRFdPUkQgc3RhcnQgPSAwOworICBGWF9EV09SRCBpdGFnID0gMDsKKyAgRlhfRFdPUkQgbWF4X2xlbiA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDw9IHRhZ3MuR2V0TGVuZ3RoKCk7ICsraSkgeworICAgIGlmICh0YWdzW2ldID09IDApIHsKKyAgICAgIEZYX0RXT1JEIGxlbiA9IGkgLSBzdGFydDsKKyAgICAgIG1heF9sZW4gPSBzdGQ6Om1heChsZW4sIG1heF9sZW4pOworICAgICAgcGF0dGVybnNbaXRhZ10ubV9wVGFnID0gdGFncy5HZXRDU3RyKCkgKyBzdGFydDsKKyAgICAgIHBhdHRlcm5zW2l0YWddLm1fTGVuID0gbGVuOworICAgICAgcGF0dGVybnNbaXRhZ10ubV9PZmZzZXQgPSAwOworICAgICAgc3RhcnQgPSBpICsgMTsKKyAgICAgICsraXRhZzsKKyAgICB9CisgIH0KIAotcHJvdGVjdGVkOgotICAgIHN0YXRpYyBjb25zdCBpbnQga01heERhdGFBdmFpbFJlY3Vyc2lvbkRlcHRoID0gNjQ7Ci0gICAgc3RhdGljIGludCBzX0N1cnJlbnREYXRhQXZhaWxSZWN1cnNpb25EZXB0aDsKKyAgY29uc3QgRlhfRklMRVNJWkUgcG9zX2xpbWl0ID0gbV9Qb3MgKyBsaW1pdDsKKyAgZm9yIChGWF9GSUxFU0laRSBwb3MgPSBtX1BvczsgIWxpbWl0IHx8IHBvcyA8IHBvc19saW1pdDsgKytwb3MpIHsKKyAgICB1aW50OF90IGJ5dGU7CisgICAgaWYgKCFHZXRDaGFyQXQocG9zLCBieXRlKSkKKyAgICAgIGJyZWFrOwogCi0gICAgRlhfRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0T2JqZWN0U2l6ZShGWF9EV09SRCBvYmpudW0sIEZYX0ZJTEVTSVpFJiBvZmZzZXQpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzT2JqZWN0c0F2YWlsKENGWF9QdHJBcnJheSYgb2JqX2FycmF5LCBGWF9CT09MIGJQYXJzZVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMsIENGWF9QdHJBcnJheSAmcmV0X2FycmF5KTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0RvY1N0YXR1cyhJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0hlYWRlcihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0ZpcnN0UGFnZShJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0VuZChJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0Nyb3NzUmVmKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQ3Jvc3NSZWZJdGVtKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrVHJhaWxlcihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1Jvb3QoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tJbmZvKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrUGFnZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tQYWdlKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrUmVzb3VyY2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQW5ub3RzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQWNyb0Zvcm0oSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tBY3JvRm9ybVN1Yk9iamVjdChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1RyYWlsZXJBcHBlbmQoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tQYWdlU3RhdHVzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrQWxsQ3Jvc3NSZWZTdHJlYW0oSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudGFnczsgKytpKSB7CisgICAgICBTZWFyY2hUYWdSZWNvcmQmIHBhdCA9IHBhdHRlcm5zW2ldOworICAgICAgaWYgKHBhdC5tX3BUYWdbcGF0Lm1fT2Zmc2V0XSAhPSBieXRlKSB7CisgICAgICAgIHBhdC5tX09mZnNldCA9IChwYXQubV9wVGFnWzBdID09IGJ5dGUpID8gMSA6IDA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQogCi0gICAgRlhfSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tDcm9zc1JlZlN0cmVhbShJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzLCBGWF9GSUxFU0laRSAmeHJlZl9vZmZzZXQpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzTGluZWFyaXplZEZpbGUoRlhfTFBCWVRFIHBEYXRhLCBGWF9EV09SRCBkd0xlbik7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0U3RhcnRPZmZzZXQoRlhfRklMRVNJWkUgZHdPZmZzZXQpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldE5leHRUb2tlbihDRlhfQnl0ZVN0cmluZyAmdG9rZW4pOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldE5leHRDaGFyKEZYX0JZVEUgJmNoKTsKLSAgICBDUERGX09iamVjdAkqICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUluZGlyZWN0T2JqZWN0QXQoRlhfRklMRVNJWkUgcG9zLCBGWF9EV09SRCBvYmpudW0pOwotICAgIENQREZfT2JqZWN0CSogICAgICAgICAgICAgICAgICAgICAgIEdldE9iamVjdChGWF9EV09SRCBvYmpudW0sIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMsIEZYX0JPT0wgKnBFeGlzdEluRmlsZSk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0UGFnZUtpZHMoQ1BERl9QYXJzZXIgKnBQYXJzZXIsIENQREZfT2JqZWN0ICpwUGFnZXMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXBhcmVQYWdlSXRlbSgpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRQYWdlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkQWxsWHJlZihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkQWxsRmlsZShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0xpbmVhcml6ZWREYXRhKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrRmlsZVJlc291cmNlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1BhZ2VBbm5vdHMoaW50IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgICAgICsrcGF0Lm1fT2Zmc2V0OworICAgICAgaWYgKHBhdC5tX09mZnNldCAhPSBwYXQubV9MZW4pCisgICAgICAgIGNvbnRpbnVlOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tMaW5lYXJpemVkRmlyc3RQYWdlKGludCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGF2ZVJlc291cmNlQW5jZXN0b3IoQ1BERl9EaWN0aW9uYXJ5ICpwRGljdCk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tQYWdlKEZYX0lOVDMyIGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkRG9jUGFnZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZERvY1BhZ2UoRlhfSU5UMzIgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrUGFnZU5vZGUoQ1BERl9QYWdlTm9kZSAmcGFnZU5vZGVzLCBGWF9JTlQzMiBpUGFnZSwgRlhfSU5UMzIgJmlDb3VudCwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tVbmtvd25QYWdlTm9kZShGWF9EV09SRCBkd1BhZ2VObywgQ1BERl9QYWdlTm9kZSAqcFBhZ2VOb2RlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0FycmF5UGFnZU5vZGUoRlhfRFdPUkQgZHdQYWdlTm8sIENQREZfUGFnZU5vZGUgKnBQYWdlTm9kZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tQYWdlQ291bnQoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNGaXJzdENoZWNrKGludCBpUGFnZSk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXRGaXJzdENoZWNrKGludCBpUGFnZSk7CisgICAgICBpZiAoIWJXaG9sZVdvcmQgfHwKKyAgICAgICAgICBJc1dob2xlV29yZChwb3MgLSBwYXQubV9MZW4sIGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQyhwYXQubV9wVGFnLCBwYXQubV9MZW4pLCBGQUxTRSkpIHsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgICB9CiAKLSAgICBDUERGX1BhcnNlciAgICAgICAgICAgICAgICAgICAgICAgICBtX3BhcnNlcjsKKyAgICAgIHBhdC5tX09mZnNldCA9IChwYXQubV9wVGFnWzBdID09IGJ5dGUpID8gMSA6IDA7CisgICAgfQorICB9CisgIHJldHVybiAtMTsKK30KIAotICAgIENQREZfU3ludGF4UGFyc2VyICAgICAgICAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyOworRlhfRklMRVNJWkUgQ1BERl9TeW50YXhQYXJzZXI6OkZpbmRUYWcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBsaW1pdCkgeworICBpbnQzMl90IHRhZ2xlbiA9IHRhZy5HZXRMZW5ndGgoKTsKKyAgaW50MzJfdCBtYXRjaCA9IDA7CisgIGxpbWl0ICs9IG1fUG9zOworICBGWF9GSUxFU0laRSBzdGFydHBvcyA9IG1fUG9zOworICB3aGlsZSAoMSkgeworICAgIHVpbnQ4X3QgY2g7CisgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGNoID09IHRhZ1ttYXRjaF0pIHsKKyAgICAgIG1hdGNoKys7CisgICAgICBpZiAobWF0Y2ggPT0gdGFnbGVuKSB7CisgICAgICAgIHJldHVybiBtX1BvcyAtIHN0YXJ0cG9zIC0gdGFnbGVuOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBtYXRjaCA9IGNoID09IHRhZ1swXSA/IDEgOiAwOworICAgIH0KKyAgICBpZiAobGltaXQgJiYgbV9Qb3MgPT0gbGltaXQpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIC0xOworfQordm9pZCBDUERGX1N5bnRheFBhcnNlcjo6R2V0QmluYXJ5KHVpbnQ4X3QqIGJ1ZmZlciwgRlhfRFdPUkQgc2l6ZSkgeworICBGWF9EV09SRCBvZmZzZXQgPSAwOworICB1aW50OF90IGNoOworICB3aGlsZSAoMSkgeworICAgIGlmICghR2V0TmV4dENoYXIoY2gpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGJ1ZmZlcltvZmZzZXQrK10gPSBjaDsKKyAgICBpZiAob2Zmc2V0ID09IHNpemUpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQogCi0gICAgQ1BERl9PYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgKm1fcFJvb3Q7CitjbGFzcyBDUERGX0RhdGFBdmFpbCBmaW5hbCA6IHB1YmxpYyBJUERGX0RhdGFBdmFpbCB7CisgcHVibGljOgorICBDUERGX0RhdGFBdmFpbChJRlhfRmlsZUF2YWlsKiBwRmlsZUF2YWlsLAorICAgICAgICAgICAgICAgICBJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZCwKKyAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3VwcG9ydEhpbnRUYWJsZSk7CisgIH5DUERGX0RhdGFBdmFpbCgpIG92ZXJyaWRlOwogCi0gICAgRlhfRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd1Jvb3RPYmpOdW07CisgIC8vIElQREZfRGF0YUF2YWlsOgorICBEb2NBdmFpbFN0YXR1cyBJc0RvY0F2YWlsKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIG92ZXJyaWRlOworICB2b2lkIFNldERvY3VtZW50KENQREZfRG9jdW1lbnQqIHBEb2MpIG92ZXJyaWRlOworICBEb2NBdmFpbFN0YXR1cyBJc1BhZ2VBdmFpbChpbnQgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIG92ZXJyaWRlOworICBEb2NGb3JtU3RhdHVzIElzRm9ybUF2YWlsKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIG92ZXJyaWRlOworICBEb2NMaW5lYXJpemF0aW9uU3RhdHVzIElzTGluZWFyaXplZFBERigpIG92ZXJyaWRlOworICBGWF9CT09MIElzTGluZWFyaXplZCgpIG92ZXJyaWRlIHsgcmV0dXJuIG1fYkxpbmVhcml6ZWQ7IH0KKyAgdm9pZCBHZXRMaW5lYXJpemVkTWFpblhSZWZJbmZvKEZYX0ZJTEVTSVpFKiBwUG9zLCBGWF9EV09SRCogcFNpemUpIG92ZXJyaWRlOwogCi0gICAgRlhfRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd0luZm9PYmpOdW07CisgIGludCBHZXRQYWdlQ291bnQoKSBjb25zdDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBHZXRQYWdlKGludCBpbmRleCk7CiAKLSAgICBDUERGX09iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAqbV9wTGluZWFyaXplZDsKKyAgZnJpZW5kIGNsYXNzIENQREZfSGludFRhYmxlczsKIAotICAgIENQREZfT2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICptX3BUcmFpbGVyOworIHByb3RlY3RlZDoKKyAgc3RhdGljIGNvbnN0IGludCBrTWF4RGF0YUF2YWlsUmVjdXJzaW9uRGVwdGggPSA2NDsKKyAgc3RhdGljIGludCBzX0N1cnJlbnREYXRhQXZhaWxSZWN1cnNpb25EZXB0aDsKKyAgc3RhdGljIGNvbnN0IGludCBrTWF4UGFnZVJlY3Vyc2lvbkRlcHRoID0gMTAyNDsKIAotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkRvY0F2YWlsOworICBGWF9EV09SRCBHZXRPYmplY3RTaXplKEZYX0RXT1JEIG9iam51bSwgRlhfRklMRVNJWkUmIG9mZnNldCk7CisgIEZYX0JPT0wgSXNPYmplY3RzQXZhaWwoQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9PYmplY3QqPiYgb2JqX2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlBhcnNlUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BcnJheVRlbXBsYXRlPENQREZfT2JqZWN0Kj4mIHJldF9hcnJheSk7CisgIEZYX0JPT0wgQ2hlY2tEb2NTdGF0dXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgIEZYX0JPT0wgQ2hlY2tIZWFkZXIoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgIEZYX0JPT0wgQ2hlY2tGaXJzdFBhZ2UoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgIEZYX0JPT0wgQ2hlY2tIaW50VGFibGVzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICBGWF9CT09MIENoZWNrRW5kKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICBGWF9CT09MIENoZWNrQ3Jvc3NSZWYoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgIEZYX0JPT0wgQ2hlY2tDcm9zc1JlZkl0ZW0oSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgIEZYX0JPT0wgQ2hlY2tUcmFpbGVyKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICBGWF9CT09MIENoZWNrUm9vdChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgRlhfQk9PTCBDaGVja0luZm8oSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgIEZYX0JPT0wgQ2hlY2tQYWdlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgRlhfQk9PTCBDaGVja1BhZ2UoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgIEZYX0JPT0wgQ2hlY2tSZXNvdXJjZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgIEZYX0JPT0wgQ2hlY2tBbm5vdHMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgIEZYX0JPT0wgQ2hlY2tBY3JvRm9ybShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgRlhfQk9PTCBDaGVja0Fjcm9Gb3JtU3ViT2JqZWN0KElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICBGWF9CT09MIENoZWNrVHJhaWxlckFwcGVuZChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgRlhfQk9PTCBDaGVja1BhZ2VTdGF0dXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgIEZYX0JPT0wgQ2hlY2tBbGxDcm9zc1JlZlN0cmVhbShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKIAotICAgIEZYX0ZJTEVTSVpFICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdIZWFkZXJPZmZzZXQ7CisgIGludDMyX3QgQ2hlY2tDcm9zc1JlZlN0cmVhbShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUmIHhyZWZfb2Zmc2V0KTsKKyAgRlhfQk9PTCBJc0xpbmVhcml6ZWRGaWxlKHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBkd0xlbik7CisgIHZvaWQgU2V0U3RhcnRPZmZzZXQoRlhfRklMRVNJWkUgZHdPZmZzZXQpOworICBGWF9CT09MIEdldE5leHRUb2tlbihDRlhfQnl0ZVN0cmluZyYgdG9rZW4pOworICBGWF9CT09MIEdldE5leHRDaGFyKHVpbnQ4X3QmIGNoKTsKKyAgQ1BERl9PYmplY3QqIFBhcnNlSW5kaXJlY3RPYmplY3RBdCgKKyAgICAgIEZYX0ZJTEVTSVpFIHBvcywKKyAgICAgIEZYX0RXT1JEIG9iam51bSwKKyAgICAgIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIqIHBPYmpMaXN0ID0gTlVMTCk7CisgIENQREZfT2JqZWN0KiBHZXRPYmplY3QoRlhfRFdPUkQgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCogcEV4aXN0SW5GaWxlKTsKKyAgRlhfQk9PTCBHZXRQYWdlS2lkcyhDUERGX1BhcnNlciogcFBhcnNlciwgQ1BERl9PYmplY3QqIHBQYWdlcyk7CisgIEZYX0JPT0wgUHJlcGFyZVBhZ2VJdGVtKCk7CisgIEZYX0JPT0wgTG9hZFBhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICBGWF9CT09MIExvYWRBbGxYcmVmKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICBGWF9CT09MIExvYWRBbGxGaWxlKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICBEb2NBdmFpbFN0YXR1cyBDaGVja0xpbmVhcml6ZWREYXRhKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICBGWF9CT09MIENoZWNrUGFnZUFubm90cyhpbnQgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOwogCi0gICAgRlhfRklMRVNJWkUgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd0xhc3RYUmVmT2Zmc2V0OworICBEb2NBdmFpbFN0YXR1cyBDaGVja0xpbmVhcml6ZWRGaXJzdFBhZ2UoaW50IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgRlhfQk9PTCBIYXZlUmVzb3VyY2VBbmNlc3RvcihDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKKyAgRlhfQk9PTCBDaGVja1BhZ2UoaW50MzJfdCBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgIEZYX0JPT0wgTG9hZERvY1BhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICBGWF9CT09MIExvYWREb2NQYWdlKGludDMyX3QgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICBGWF9CT09MIENoZWNrUGFnZU5vZGUoQ1BERl9QYWdlTm9kZSYgcGFnZU5vZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpOworICBGWF9CT09MIENoZWNrVW5rb3duUGFnZU5vZGUoRlhfRFdPUkQgZHdQYWdlTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BhZ2VOb2RlKiBwUGFnZU5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgRlhfQk9PTCBDaGVja0FycmF5UGFnZU5vZGUoRlhfRFdPUkQgZHdQYWdlTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUGFnZU5vZGUqIHBQYWdlTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgIEZYX0JPT0wgQ2hlY2tQYWdlQ291bnQoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CisgIGJvb2wgSXNGaXJzdENoZWNrKGludCBpUGFnZSk7CisgIHZvaWQgUmVzZXRGaXJzdENoZWNrKGludCBpUGFnZSk7CisgIEZYX0JPT0wgSXNEYXRhQXZhaWwoRlhfRklMRVNJWkUgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cyk7CiAKLSAgICBGWF9GSUxFU0laRSAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3WFJlZk9mZnNldDsKKyAgQ1BERl9QYXJzZXIgbV9wYXJzZXI7CiAKLSAgICBGWF9GSUxFU0laRSAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3VHJhaWxlck9mZnNldDsKKyAgQ1BERl9TeW50YXhQYXJzZXIgbV9zeW50YXhQYXJzZXI7CiAKLSAgICBGWF9GSUxFU0laRSAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3Q3VycmVudE9mZnNldDsKKyAgQ1BERl9PYmplY3QqIG1fcFJvb3Q7CiAKLSAgICBQREZfREFUQUFWQUlMX1NUQVRVUyAgICAgICAgICAgICAgICBtX2RvY1N0YXR1czsKKyAgRlhfRFdPUkQgbV9kd1Jvb3RPYmpOdW07CiAKLSAgICBGWF9GSUxFU0laRQkgICAgICAgICAgICAgICAgICAgICAgICBtX2R3RmlsZUxlbjsKKyAgRlhfRFdPUkQgbV9kd0luZm9PYmpOdW07CiAKLSAgICBDUERGX0RvY3VtZW50KiAgICAgICAgICAgICAgICAgICAgICBtX3BEb2N1bWVudDsKKyAgQ1BERl9PYmplY3QqIG1fcExpbmVhcml6ZWQ7CiAKLSAgICBDUERGX1NvcnRPYmpOdW1BcnJheSAgICAgICAgICAgICAgICBtX29iam51bV9hcnJheTsKKyAgQ1BERl9PYmplY3QqIG1fcFRyYWlsZXI7CiAKLSAgICBDRlhfUHRyQXJyYXkgICAgICAgICAgICAgICAgICAgICAgICBtX29ianNfYXJyYXk7CisgIEZYX0JPT0wgbV9iRG9jQXZhaWw7CiAKLSAgICBGWF9GSUxFU0laRQkgICAgICAgICAgICAgICAgICAgICAgICBtX1BvczsKKyAgRlhfRklMRVNJWkUgbV9kd0hlYWRlck9mZnNldDsKIAotICAgIEZYX0ZJTEVTSVpFICAgICAgICAgICAgICAgICAgICAgICAgIG1fYnVmZmVyT2Zmc2V0OworICBGWF9GSUxFU0laRSBtX2R3TGFzdFhSZWZPZmZzZXQ7CiAKLSAgICBGWF9EV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2J1ZmZlclNpemU7CisgIEZYX0ZJTEVTSVpFIG1fZHdYUmVmT2Zmc2V0OwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgbV9Xb3JkQnVmOworICBGWF9GSUxFU0laRSBtX2R3VHJhaWxlck9mZnNldDsKIAotICAgIEZYX0JZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fV29yZEJ1ZmZlclsyNTddOworICBGWF9GSUxFU0laRSBtX2R3Q3VycmVudE9mZnNldDsKIAotICAgIEZYX0RXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fV29yZFNpemU7CisgIFBERl9EQVRBQVZBSUxfU1RBVFVTIG1fZG9jU3RhdHVzOwogCi0gICAgRlhfQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9idWZmZXJEYXRhWzUxMl07CisgIEZYX0ZJTEVTSVpFIG1fZHdGaWxlTGVuOwogCi0gICAgQ0ZYX0ZpbGVTaXplQXJyYXkgICAgICAgICAgICAgICAgICAgbV9Dcm9zc09mZnNldDsKKyAgQ1BERl9Eb2N1bWVudCogbV9wRG9jdW1lbnQ7CiAKLSAgICBDRlhfRFdvcmRBcnJheSAgICAgICAgICAgICAgICAgICAgICBtX1hSZWZTdHJlYW1MaXN0OworICBzdGQ6OnNldDxGWF9EV09SRD4gbV9PYmplY3RTZXQ7CiAKLSAgICBDRlhfRFdvcmRBcnJheSAgICAgICAgICAgICAgICAgICAgICBtX1BhZ2VPYmpMaXN0OworICBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX09iamVjdCo+IG1fb2Jqc19hcnJheTsKIAotICAgIEZYX0RXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fUGFnZXNPYmpOdW07CisgIEZYX0ZJTEVTSVpFIG1fUG9zOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iTGluZWFyaXplZDsKKyAgRlhfRklMRVNJWkUgbV9idWZmZXJPZmZzZXQ7CiAKLSAgICBGWF9EV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3Rmlyc3RQYWdlTm87CisgIEZYX0RXT1JEIG1fYnVmZmVyU2l6ZTsKIAotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkxpbmVhcmVkRGF0YU9LOworICBDRlhfQnl0ZVN0cmluZyBtX1dvcmRCdWY7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JNYWluWFJlZkxvYWRUcmllZDsKKyAgdWludDhfdCBtX2J1ZmZlckRhdGFbNTEyXTsKIAotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYk1haW5YUmVmTG9hZGVkT0s7CisgIENGWF9GaWxlU2l6ZUFycmF5IG1fQ3Jvc3NPZmZzZXQ7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JQYWdlc1RyZWVMb2FkOworICBDRlhfRFdvcmRBcnJheSBtX1hSZWZTdHJlYW1MaXN0OwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iUGFnZXNMb2FkOworICBDRlhfRFdvcmRBcnJheSBtX1BhZ2VPYmpMaXN0OwogCi0gICAgQ1BERl9QYXJzZXIgKiAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VycmVudFBhcnNlcjsKKyAgRlhfRFdPUkQgbV9QYWdlc09iak51bTsKIAotICAgIEZYX0ZJTEVTSVpFICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdDdXJyZW50WFJlZlN0ZWFtOworICBGWF9CT09MIG1fYkxpbmVhcml6ZWQ7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JBbm5vdHNMb2FkOworICBGWF9EV09SRCBtX2R3Rmlyc3RQYWdlTm87CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JIYXZlQWNyb0Zvcm07CisgIEZYX0JPT0wgbV9iTGluZWFyZWREYXRhT0s7CiAKLSAgICBGWF9EV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3QWNyb0Zvcm1PYmpOdW07CisgIEZYX0JPT0wgbV9iTWFpblhSZWZMb2FkVHJpZWQ7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JBY3JvRm9ybUxvYWQ7CisgIEZYX0JPT0wgbV9iTWFpblhSZWZMb2FkZWRPSzsKIAotICAgIENQREZfT2JqZWN0CSogICAgICAgICAgICAgICAgICAgICAgIG1fcEFjcm9Gb3JtOworICBGWF9CT09MIG1fYlBhZ2VzVHJlZUxvYWQ7CiAKLSAgICBDRlhfUHRyQXJyYXkgICAgICAgICAgICAgICAgICAgICAgICBtX2FycmF5QWNyb2Zvcm1zOworICBGWF9CT09MIG1fYlBhZ2VzTG9hZDsKIAotICAgIENQREZfRGljdGlvbmFyeSAqICAgICAgICAgICAgICAgICAgIG1fcFBhZ2VEaWN0OworICBDUERGX1BhcnNlciogbV9wQ3VycmVudFBhcnNlcjsKIAotICAgIENQREZfT2JqZWN0ICogICAgICAgICAgICAgICAgICAgICAgIG1fcFBhZ2VSZXNvdXJjZTsKKyAgRlhfRklMRVNJWkUgbV9kd0N1cnJlbnRYUmVmU3RlYW07CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JOZWVkRG93bkxvYWRSZXNvdXJjZTsKKyAgRlhfQk9PTCBtX2JBbm5vdHNMb2FkOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iUGFnZUxvYWRlZE9LOworICBGWF9CT09MIG1fYkhhdmVBY3JvRm9ybTsKIAotICAgIEZYX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkxpbmVhcml6ZWRGb3JtUGFyYW1Mb2FkOworICBGWF9EV09SRCBtX2R3QWNyb0Zvcm1PYmpOdW07CiAKLSAgICBDRlhfUHRyQXJyYXkgICAgICAgICAgICAgICAgICAgICAgICBtX1BhZ2VzQXJyYXk7CisgIEZYX0JPT0wgbV9iQWNyb0Zvcm1Mb2FkOwogCi0gICAgRlhfRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd0VuY3J5cHRPYmpOdW07CisgIENQREZfT2JqZWN0KiBtX3BBY3JvRm9ybTsKIAotICAgIEZYX0ZJTEVTSVpFICAgICAgICAgICAgICAgICAgICAgICAgIG1fZHdQcmV2WFJlZk9mZnNldDsKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9PYmplY3QqPiBtX2FycmF5QWNyb2Zvcm1zOwogCi0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iVG90YWxMb2FkUGFnZVRyZWU7CisgIENQREZfRGljdGlvbmFyeSogbV9wUGFnZURpY3Q7CiAKLSAgICBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JDdXJQYWdlRGljdExvYWRPSzsKKyAgQ1BERl9PYmplY3QqIG1fcFBhZ2VSZXNvdXJjZTsKIAotICAgIENQREZfUGFnZU5vZGUgICAgICAgICAgICAgICAgICAgICAgIG1fcGFnZU5vZGVzOworICBGWF9CT09MIG1fYk5lZWREb3duTG9hZFJlc291cmNlOwogCi0gICAgQ0ZYX0NNYXBEV29yZFRvRFdvcmQgKiAgICAgICAgICAgICAgbV9wYWdlTWFwQ2hlY2tTdGF0ZTsKKyAgRlhfQk9PTCBtX2JQYWdlTG9hZGVkT0s7CiAKLSAgICBDRlhfQ01hcERXb3JkVG9EV29yZCAqICAgICAgICAgICAgICBtX3BhZ2VzTG9hZFN0YXRlOworICBGWF9CT09MIG1fYkxpbmVhcml6ZWRGb3JtUGFyYW1Mb2FkOworCisgIENGWF9BcnJheVRlbXBsYXRlPENQREZfT2JqZWN0Kj4gbV9QYWdlc0FycmF5OworCisgIEZYX0RXT1JEIG1fZHdFbmNyeXB0T2JqTnVtOworCisgIEZYX0ZJTEVTSVpFIG1fZHdQcmV2WFJlZk9mZnNldDsKKworICBGWF9CT09MIG1fYlRvdGFsTG9hZFBhZ2VUcmVlOworCisgIEZYX0JPT0wgbV9iQ3VyUGFnZURpY3RMb2FkT0s7CisKKyAgQ1BERl9QYWdlTm9kZSBtX3BhZ2VOb2RlczsKKworICBzdGQ6OnNldDxGWF9EV09SRD4gbV9wYWdlTWFwQ2hlY2tTdGF0ZTsKKyAgc3RkOjpzZXQ8RlhfRFdPUkQ+IG1fcGFnZXNMb2FkU3RhdGU7CisKKyAgc3RkOjp1bmlxdWVfcHRyPENQREZfSGludFRhYmxlcz4gbV9wSGludFRhYmxlczsKKyAgRlhfQk9PTCBtX2JTdXBwb3J0SGludFRhYmxlOwogfTsKIAotSVBERl9EYXRhQXZhaWw6OklQREZfRGF0YUF2YWlsKElGWF9GaWxlQXZhaWwqIHBGaWxlQXZhaWwsIElGWF9GaWxlUmVhZCogcEZpbGVSZWFkKSA6Ci0gICAgbV9wRmlsZUF2YWlsKHBGaWxlQXZhaWwpLAotICAgIG1fcEZpbGVSZWFkKHBGaWxlUmVhZCkgewotfQorSVBERl9EYXRhQXZhaWw6OklQREZfRGF0YUF2YWlsKElGWF9GaWxlQXZhaWwqIHBGaWxlQXZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQpCisgICAgOiBtX3BGaWxlQXZhaWwocEZpbGVBdmFpbCksIG1fcEZpbGVSZWFkKHBGaWxlUmVhZCkge30KIAogLy8gc3RhdGljCi1JUERGX0RhdGFBdmFpbCogSVBERl9EYXRhQXZhaWw6OkNyZWF0ZShJRlhfRmlsZUF2YWlsKiBwRmlsZUF2YWlsLCBJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZCkKLXsKLSAgcmV0dXJuIG5ldyBDUERGX0RhdGFBdmFpbChwRmlsZUF2YWlsLCBwRmlsZVJlYWQpOworSVBERl9EYXRhQXZhaWwqIElQREZfRGF0YUF2YWlsOjpDcmVhdGUoSUZYX0ZpbGVBdmFpbCogcEZpbGVBdmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9GaWxlUmVhZCogcEZpbGVSZWFkKSB7CisgIHJldHVybiBuZXcgQ1BERl9EYXRhQXZhaWwocEZpbGVBdmFpbCwgcEZpbGVSZWFkLCBUUlVFKTsKIH0KIAogLy8gc3RhdGljCiBpbnQgQ1BERl9EYXRhQXZhaWw6OnNfQ3VycmVudERhdGFBdmFpbFJlY3Vyc2lvbkRlcHRoID0gMDsKIAotQ1BERl9EYXRhQXZhaWw6OkNQREZfRGF0YUF2YWlsKElGWF9GaWxlQXZhaWwqIHBGaWxlQXZhaWwsIElGWF9GaWxlUmVhZCogcEZpbGVSZWFkKQotICAgIDogSVBERl9EYXRhQXZhaWwocEZpbGVBdmFpbCwgcEZpbGVSZWFkKQotewotICAgIG1fUG9zID0gMDsKLSAgICBtX2R3RmlsZUxlbiA9IDA7Ci0gICAgaWYgKG1fcEZpbGVSZWFkKSB7Ci0gICAgICAgIG1fZHdGaWxlTGVuID0gKEZYX0RXT1JEKW1fcEZpbGVSZWFkLT5HZXRTaXplKCk7Ci0gICAgfQotICAgIG1fZHdDdXJyZW50T2Zmc2V0ID0gMDsKLSAgICBtX1dvcmRTaXplID0gMDsKLSAgICBtX2R3WFJlZk9mZnNldCA9IDA7Ci0gICAgbV9idWZmZXJPZmZzZXQgPSAwOwotICAgIG1fZHdGaXJzdFBhZ2VObyA9IDA7Ci0gICAgbV9idWZmZXJTaXplID0gMDsKLSAgICBtX1BhZ2VzT2JqTnVtID0gMDsKLSAgICBtX2R3Q3VycmVudFhSZWZTdGVhbSA9IDA7Ci0gICAgbV9kd0Fjcm9Gb3JtT2JqTnVtID0gMDsKLSAgICBtX2R3SW5mb09iak51bSA9IDA7Ci0gICAgbV9wRG9jdW1lbnQgPSAwOwotICAgIG1fZHdFbmNyeXB0T2JqTnVtID0gMDsKLSAgICBtX2R3UHJldlhSZWZPZmZzZXQgPSAwOwotICAgIG1fZHdMYXN0WFJlZk9mZnNldCA9IDA7Ci0gICAgbV9iRG9jQXZhaWwgPSBGQUxTRTsKLSAgICBtX2JNYWluWFJlZkxvYWRUcmllZCA9IEZBTFNFOwotICAgIG1fYkRvY0F2YWlsID0gRkFMU0U7Ci0gICAgbV9iTGluZWFyaXplZCA9IEZBTFNFOwotICAgIG1fYlBhZ2VzTG9hZCA9IEZBTFNFOwotICAgIG1fYlBhZ2VzVHJlZUxvYWQgPSBGQUxTRTsKLSAgICBtX2JNYWluWFJlZkxvYWRlZE9LID0gRkFMU0U7Ci0gICAgbV9iQW5ub3RzTG9hZCA9IEZBTFNFOwotICAgIG1fYkhhdmVBY3JvRm9ybSA9IEZBTFNFOwotICAgIG1fYkFjcm9Gb3JtTG9hZCA9IEZBTFNFOwotICAgIG1fYlBhZ2VMb2FkZWRPSyA9IEZBTFNFOwotICAgIG1fYk5lZWREb3duTG9hZFJlc291cmNlID0gRkFMU0U7Ci0gICAgbV9iTGluZWFyaXplZEZvcm1QYXJhbUxvYWQgPSBGQUxTRTsKLSAgICBtX3BMaW5lYXJpemVkID0gTlVMTDsKLSAgICBtX3BSb290ID0gTlVMTDsKLSAgICBtX3BUcmFpbGVyID0gTlVMTDsKLSAgICBtX3BDdXJyZW50UGFyc2VyID0gTlVMTDsKLSAgICBtX3BBY3JvRm9ybSA9IE5VTEw7Ci0gICAgbV9wUGFnZURpY3QgPSBOVUxMOwotICAgIG1fcFBhZ2VSZXNvdXJjZSA9IE5VTEw7Ci0gICAgbV9wYWdlTWFwQ2hlY2tTdGF0ZSA9IE5VTEw7Ci0gICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0hFQURFUjsKLSAgICBtX3BhcnNlci5tX2JPd25GaWxlUmVhZCA9IEZBTFNFOwotICAgIG1fYlRvdGFsTG9hZFBhZ2VUcmVlID0gRkFMU0U7Ci0gICAgbV9iQ3VyUGFnZURpY3RMb2FkT0sgPSBGQUxTRTsKLSAgICBtX2JMaW5lYXJlZERhdGFPSyA9IEZBTFNFOwotICAgIG1fcGFnZXNMb2FkU3RhdGUgPSBOVUxMOworQ1BERl9EYXRhQXZhaWw6OkNQREZfRGF0YUF2YWlsKElGWF9GaWxlQXZhaWwqIHBGaWxlQXZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3VwcG9ydEhpbnRUYWJsZSkKKyAgICA6IElQREZfRGF0YUF2YWlsKHBGaWxlQXZhaWwsIHBGaWxlUmVhZCkgeworICBtX1BvcyA9IDA7CisgIG1fZHdGaWxlTGVuID0gMDsKKyAgaWYgKG1fcEZpbGVSZWFkKSB7CisgICAgbV9kd0ZpbGVMZW4gPSAoRlhfRFdPUkQpbV9wRmlsZVJlYWQtPkdldFNpemUoKTsKKyAgfQorICBtX2R3Q3VycmVudE9mZnNldCA9IDA7CisgIG1fZHdYUmVmT2Zmc2V0ID0gMDsKKyAgbV9idWZmZXJPZmZzZXQgPSAwOworICBtX2R3Rmlyc3RQYWdlTm8gPSAwOworICBtX2J1ZmZlclNpemUgPSAwOworICBtX1BhZ2VzT2JqTnVtID0gMDsKKyAgbV9kd0N1cnJlbnRYUmVmU3RlYW0gPSAwOworICBtX2R3QWNyb0Zvcm1PYmpOdW0gPSAwOworICBtX2R3SW5mb09iak51bSA9IDA7CisgIG1fcERvY3VtZW50ID0gMDsKKyAgbV9kd0VuY3J5cHRPYmpOdW0gPSAwOworICBtX2R3UHJldlhSZWZPZmZzZXQgPSAwOworICBtX2R3TGFzdFhSZWZPZmZzZXQgPSAwOworICBtX2JEb2NBdmFpbCA9IEZBTFNFOworICBtX2JNYWluWFJlZkxvYWRUcmllZCA9IEZBTFNFOworICBtX2JEb2NBdmFpbCA9IEZBTFNFOworICBtX2JMaW5lYXJpemVkID0gRkFMU0U7CisgIG1fYlBhZ2VzTG9hZCA9IEZBTFNFOworICBtX2JQYWdlc1RyZWVMb2FkID0gRkFMU0U7CisgIG1fYk1haW5YUmVmTG9hZGVkT0sgPSBGQUxTRTsKKyAgbV9iQW5ub3RzTG9hZCA9IEZBTFNFOworICBtX2JIYXZlQWNyb0Zvcm0gPSBGQUxTRTsKKyAgbV9iQWNyb0Zvcm1Mb2FkID0gRkFMU0U7CisgIG1fYlBhZ2VMb2FkZWRPSyA9IEZBTFNFOworICBtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSA9IEZBTFNFOworICBtX2JMaW5lYXJpemVkRm9ybVBhcmFtTG9hZCA9IEZBTFNFOworICBtX3BMaW5lYXJpemVkID0gTlVMTDsKKyAgbV9wUm9vdCA9IE5VTEw7CisgIG1fcFRyYWlsZXIgPSBOVUxMOworICBtX3BDdXJyZW50UGFyc2VyID0gTlVMTDsKKyAgbV9wQWNyb0Zvcm0gPSBOVUxMOworICBtX3BQYWdlRGljdCA9IE5VTEw7CisgIG1fcFBhZ2VSZXNvdXJjZSA9IE5VTEw7CisgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9IRUFERVI7CisgIG1fcGFyc2VyLm1fYk93bkZpbGVSZWFkID0gRkFMU0U7CisgIG1fYlRvdGFsTG9hZFBhZ2VUcmVlID0gRkFMU0U7CisgIG1fYkN1clBhZ2VEaWN0TG9hZE9LID0gRkFMU0U7CisgIG1fYkxpbmVhcmVkRGF0YU9LID0gRkFMU0U7CisgIG1fYlN1cHBvcnRIaW50VGFibGUgPSBiU3VwcG9ydEhpbnRUYWJsZTsKIH0KLUNQREZfRGF0YUF2YWlsOjp+Q1BERl9EYXRhQXZhaWwoKQotewotICAgIGlmIChtX3BMaW5lYXJpemVkKQl7Ci0gICAgICAgIG1fcExpbmVhcml6ZWQtPlJlbGVhc2UoKTsKLSAgICB9Ci0gICAgaWYgKG1fcFJvb3QpIHsKLSAgICAgICAgbV9wUm9vdC0+UmVsZWFzZSgpOwotICAgIH0KLSAgICBpZiAobV9wVHJhaWxlcikgewotICAgICAgICBtX3BUcmFpbGVyLT5SZWxlYXNlKCk7Ci0gICAgfQotICAgIGlmIChtX3BhZ2VNYXBDaGVja1N0YXRlKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BhZ2VNYXBDaGVja1N0YXRlOwotICAgIH0KLSAgICBpZiAobV9wYWdlc0xvYWRTdGF0ZSkgewotICAgICAgICBkZWxldGUgbV9wYWdlc0xvYWRTdGF0ZTsKLSAgICB9Ci0gICAgRlhfSU5UMzIgaSA9IDA7Ci0gICAgRlhfSU5UMzIgaVNpemUgPSBtX2FycmF5QWNyb2Zvcm1zLkdldFNpemUoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaVNpemU7ICsraSkgewotICAgICAgICAoKENQREZfT2JqZWN0ICopbV9hcnJheUFjcm9mb3Jtcy5HZXRBdChpKSktPlJlbGVhc2UoKTsKLSAgICB9CitDUERGX0RhdGFBdmFpbDo6fkNQREZfRGF0YUF2YWlsKCkgeworICBpZiAobV9wTGluZWFyaXplZCkgeworICAgIG1fcExpbmVhcml6ZWQtPlJlbGVhc2UoKTsKKyAgfQorICBpZiAobV9wUm9vdCkgeworICAgIG1fcFJvb3QtPlJlbGVhc2UoKTsKKyAgfQorICBpZiAobV9wVHJhaWxlcikgeworICAgIG1fcFRyYWlsZXItPlJlbGVhc2UoKTsKKyAgfQorCisgIGludCBpU2l6ZSA9IG1fYXJyYXlBY3JvZm9ybXMuR2V0U2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IGlTaXplOyArK2kpIHsKKyAgICBtX2FycmF5QWNyb2Zvcm1zLkdldEF0KGkpLT5SZWxlYXNlKCk7CisgIH0KIH0KLXZvaWQgQ1BERl9EYXRhQXZhaWw6OlNldERvY3VtZW50KENQREZfRG9jdW1lbnQqIHBEb2MpCi17Ci0gICAgbV9wRG9jdW1lbnQgPSBwRG9jOwordm9pZCBDUERGX0RhdGFBdmFpbDo6U2V0RG9jdW1lbnQoQ1BERl9Eb2N1bWVudCogcERvYykgeworICBtX3BEb2N1bWVudCA9IHBEb2M7CiB9Ci1GWF9EV09SRCBDUERGX0RhdGFBdmFpbDo6R2V0T2JqZWN0U2l6ZShGWF9EV09SRCBvYmpudW0sIEZYX0ZJTEVTSVpFJiBvZmZzZXQpCi17Ci0gICAgQ1BERl9QYXJzZXIgKnBQYXJzZXIgPSAoQ1BERl9QYXJzZXIgKikobV9wRG9jdW1lbnQtPkdldFBhcnNlcigpKTsKLSAgICBpZiAocFBhcnNlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAob2JqbnVtID49IChGWF9EV09SRClwUGFyc2VyLT5tX0Nyb3NzUmVmLkdldFNpemUoKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKHBQYXJzZXItPm1fVjVUeXBlW29iam51bV0gPT0gMikgewotICAgICAgICBvYmpudW0gPSAoRlhfRFdPUkQpcFBhcnNlci0+bV9Dcm9zc1JlZltvYmpudW1dOwotICAgIH0KLSAgICBpZiAocFBhcnNlci0+bV9WNVR5cGVbb2JqbnVtXSA9PSAxIHx8IHBQYXJzZXItPm1fVjVUeXBlW29iam51bV0gPT0gMjU1KSB7Ci0gICAgICAgIG9mZnNldCA9IHBQYXJzZXItPm1fQ3Jvc3NSZWZbb2JqbnVtXTsKLSAgICAgICAgaWYgKG9mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBGWF9MUFZPSUQgcFJlc3VsdCA9IEZYU1lTX2JzZWFyY2goJm9mZnNldCwgcFBhcnNlci0+bV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLCBwUGFyc2VyLT5tX1NvcnRlZE9mZnNldC5HZXRTaXplKCksIHNpemVvZihGWF9GSUxFU0laRSksIF9Db21wYXJlRmlsZVNpemUpOwotICAgICAgICBpZiAocFJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoKEZYX0ZJTEVTSVpFKilwUmVzdWx0IC0gKEZYX0ZJTEVTSVpFKilwUGFyc2VyLT5tX1NvcnRlZE9mZnNldC5HZXREYXRhKCkgPT0gcFBhcnNlci0+bV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpIC0gMSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChGWF9EV09SRCkoKChGWF9GSUxFU0laRSopcFJlc3VsdClbMV0gLSBvZmZzZXQpOwotICAgIH0KK0ZYX0RXT1JEIENQREZfRGF0YUF2YWlsOjpHZXRPYmplY3RTaXplKEZYX0RXT1JEIG9iam51bSwgRlhfRklMRVNJWkUmIG9mZnNldCkgeworICBDUERGX1BhcnNlciogcFBhcnNlciA9IChDUERGX1BhcnNlciopKG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKSk7CisgIGlmICghcFBhcnNlciB8fCAhcFBhcnNlci0+SXNWYWxpZE9iamVjdE51bWJlcihvYmpudW0pKQogICAgIHJldHVybiAwOworCisgIGlmIChwUGFyc2VyLT5tX1Y1VHlwZVtvYmpudW1dID09IDIpCisgICAgb2JqbnVtID0gcFBhcnNlci0+bV9PYmplY3RJbmZvW29iam51bV0ucG9zOworCisgIGlmIChwUGFyc2VyLT5tX1Y1VHlwZVtvYmpudW1dID09IDEgfHwgcFBhcnNlci0+bV9WNVR5cGVbb2JqbnVtXSA9PSAyNTUpIHsKKyAgICBvZmZzZXQgPSBwUGFyc2VyLT5tX09iamVjdEluZm9bb2JqbnVtXS5wb3M7CisgICAgaWYgKG9mZnNldCA9PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgdm9pZCogcFJlc3VsdCA9IEZYU1lTX2JzZWFyY2goJm9mZnNldCwgcFBhcnNlci0+bV9Tb3J0ZWRPZmZzZXQuR2V0RGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJzZXItPm1fU29ydGVkT2Zmc2V0LkdldFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRlhfRklMRVNJWkUpLCBDb21wYXJlRmlsZVNpemUpOworICAgIGlmICghcFJlc3VsdCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoRlhfRklMRVNJWkUqKXBSZXN1bHQgLQorICAgICAgICAgICAgKEZYX0ZJTEVTSVpFKilwUGFyc2VyLT5tX1NvcnRlZE9mZnNldC5HZXREYXRhKCkgPT0KKyAgICAgICAgcFBhcnNlci0+bV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpIC0gMSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAoRlhfRFdPUkQpKCgoRlhfRklMRVNJWkUqKXBSZXN1bHQpWzFdIC0gb2Zmc2V0KTsKKyAgfQorICByZXR1cm4gMDsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OklzT2JqZWN0c0F2YWlsKENGWF9QdHJBcnJheSYgb2JqX2FycmF5LCBGWF9CT09MIGJQYXJzZVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMsIENGWF9QdHJBcnJheSAmcmV0X2FycmF5KQotewotICAgIGlmICghb2JqX2FycmF5LkdldFNpemUoKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgRlhfRFdPUkQgY291bnQgPSAwOwotICAgIENGWF9QdHJBcnJheSBuZXdfb2JqX2FycmF5OwotICAgIEZYX0lOVDMyIGkgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBvYmpfYXJyYXkuR2V0U2l6ZSgpOyBpKyspIHsKLSAgICAgICAgQ1BERl9PYmplY3QgKnBPYmogPSAoQ1BERl9PYmplY3QgKilvYmpfYXJyYXlbaV07Ci0gICAgICAgIGlmICghcE9iaikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfSU5UMzIgdHlwZSA9IHBPYmotPkdldFR5cGUoKTsKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFBERk9CSl9BUlJBWTogewotICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5ICpwQXJyYXkgPSBwT2JqLT5HZXRBcnJheSgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKEZYX0RXT1JEIGsgPSAwOyBrIDwgcEFycmF5LT5HZXRDb3VudCgpOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld19vYmpfYXJyYXkuQWRkKHBBcnJheS0+R2V0RWxlbWVudChrKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBERk9CSl9TVFJFQU06Ci0gICAgICAgICAgICAgICAgcE9iaiA9IHBPYmotPkdldERpY3QoKTsKLSAgICAgICAgICAgIGNhc2UgUERGT0JKX0RJQ1RJT05BUlk6IHsKLSAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5ICpwRGljdCA9IHBPYmotPkdldERpY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBEaWN0ICYmIHBEaWN0LT5HZXRTdHJpbmcoIlR5cGUiKSA9PSAiUGFnZSIgJiYgIWJQYXJzZVBhZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBEaWN0LT5HZXRTdGFydFBvcygpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCAqdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBrZXk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBEaWN0LT5HZXROZXh0RWxlbWVudChwb3MsIGtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ICE9ICJQYXJlbnQiKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X29ial9hcnJheS5BZGQodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOiB7Ci0gICAgICAgICAgICAgICAgICAgIENQREZfUmVmZXJlbmNlICpwUmVmID0gKENQREZfUmVmZXJlbmNlKilwT2JqOwotICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd051bSA9IHBSZWYtPkdldFJlZk9iak51bSgpOwotICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG9yaWdpbmFsX3NpemUgPSBHZXRPYmplY3RTaXplKGR3TnVtLCBvZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPEZYX0RXT1JEPiBzaXplID0gb3JpZ2luYWxfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUuVmFsdWVPckRlZmF1bHQoMCkgPT0gMCB8fCBvZmZzZXQgPCAwIHx8IG9mZnNldCA+PSBtX2R3RmlsZUxlbikgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHNpemUgKz0gb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICBzaXplICs9IDUxMjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzaXplLklzVmFsaWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUuVmFsdWVPckRpZSgpID4gbV9kd0ZpbGVMZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBtX2R3RmlsZUxlbiAtIG9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBvcmlnaW5hbF9zaXplICsgNTEyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc2l6ZS5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbV9wRmlsZUF2YWlsLT5Jc0RhdGFBdmFpbChvZmZzZXQsIHNpemUuVmFsdWVPckRpZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcEhpbnRzLT5BZGRTZWdtZW50KG9mZnNldCwgc2l6ZS5WYWx1ZU9yRGllKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0X2FycmF5LkFkZChwT2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1fb2JqbnVtX2FycmF5LkZpbmQoZHdOdW0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX29iam51bV9hcnJheS5BZGRPYmpOdW0oZHdOdW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QgKnBSZWZlcnJlZCA9IG1fcERvY3VtZW50LT5HZXRJbmRpcmVjdE9iamVjdChwUmVmLT5HZXRSZWZPYmpOdW0oKSwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocFJlZmVycmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X29ial9hcnJheS5BZGQocFJlZmVycmVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoY291bnQgPiAwKSB7Ci0gICAgICAgIEZYX0lOVDMyIGlTaXplID0gbmV3X29ial9hcnJheS5HZXRTaXplKCk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpU2l6ZTsgKytpKSB7Ci0gICAgICAgICAgICBDUERGX09iamVjdCAqcE9iaiA9IChDUERGX09iamVjdCAqKW5ld19vYmpfYXJyYXlbaV07Ci0gICAgICAgICAgICBGWF9JTlQzMiB0eXBlID0gcE9iai0+R2V0VHlwZSgpOwotICAgICAgICAgICAgaWYgKHR5cGUgPT0gUERGT0JKX1JFRkVSRU5DRSkgewotICAgICAgICAgICAgICAgIENQREZfUmVmZXJlbmNlICpwUmVmID0gKENQREZfUmVmZXJlbmNlICopcE9iajsKLSAgICAgICAgICAgICAgICBGWF9EV09SRCBkd051bSA9IHBSZWYtPkdldFJlZk9iak51bSgpOwotICAgICAgICAgICAgICAgIGlmICghbV9vYmpudW1fYXJyYXkuRmluZChkd051bSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0X2FycmF5LkFkZChwT2JqKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldF9hcnJheS5BZGQocE9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBvYmpfYXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgb2JqX2FycmF5LkFwcGVuZChuZXdfb2JqX2FycmF5KTsKLSAgICByZXR1cm4gSXNPYmplY3RzQXZhaWwob2JqX2FycmF5LCBGQUxTRSwgcEhpbnRzLCByZXRfYXJyYXkpOwotfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6SXNEb2NBdmFpbChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQotewotICAgIGlmICghbV9kd0ZpbGVMZW4gJiYgbV9wRmlsZVJlYWQpIHsKLSAgICAgICAgbV9kd0ZpbGVMZW4gPSAoRlhfRFdPUkQpbV9wRmlsZVJlYWQtPkdldFNpemUoKTsKLSAgICAgICAgaWYgKCFtX2R3RmlsZUxlbikgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgd2hpbGUgKCFtX2JEb2NBdmFpbCkgewotICAgICAgICBpZiAoIUNoZWNrRG9jU3RhdHVzKHBIaW50cykpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OklzT2JqZWN0c0F2YWlsKAorICAgIENGWF9BcnJheVRlbXBsYXRlPENQREZfT2JqZWN0Kj4mIG9ial9hcnJheSwKKyAgICBGWF9CT09MIGJQYXJzZVBhZ2UsCisgICAgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cywKKyAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX09iamVjdCo+JiByZXRfYXJyYXkpIHsKKyAgaWYgKCFvYmpfYXJyYXkuR2V0U2l6ZSgpKSB7CiAgICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja0Fjcm9Gb3JtU3ViT2JqZWN0KElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCi17Ci0gICAgaWYgKCFtX29ianNfYXJyYXkuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKLSAgICAgICAgbV9vYmpudW1fYXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgICAgIENGWF9QdHJBcnJheSBvYmpfYXJyYXk7Ci0gICAgICAgIG9ial9hcnJheS5BcHBlbmQobV9hcnJheUFjcm9mb3Jtcyk7Ci0gICAgICAgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG9ial9hcnJheSwgRkFMU0UsIHBIaW50cywgbV9vYmpzX2FycmF5KTsKLSAgICAgICAgaWYgKGJSZXQpIHsKLSAgICAgICAgICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKKyAgfQorICBGWF9EV09SRCBjb3VudCA9IDA7CisgIENGWF9BcnJheVRlbXBsYXRlPENQREZfT2JqZWN0Kj4gbmV3X29ial9hcnJheTsKKyAgaW50MzJfdCBpID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IG9ial9hcnJheS5HZXRTaXplKCk7IGkrKykgeworICAgIENQREZfT2JqZWN0KiBwT2JqID0gb2JqX2FycmF5W2ldOworICAgIGlmICghcE9iaikKKyAgICAgIGNvbnRpbnVlOworCisgICAgaW50MzJfdCB0eXBlID0gcE9iai0+R2V0VHlwZSgpOworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBQREZPQkpfQVJSQVk6IHsKKyAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gcE9iai0+R2V0QXJyYXkoKTsKKyAgICAgICAgZm9yIChGWF9EV09SRCBrID0gMDsgayA8IHBBcnJheS0+R2V0Q291bnQoKTsgaysrKSB7CisgICAgICAgICAgbmV3X29ial9hcnJheS5BZGQocEFycmF5LT5HZXRFbGVtZW50KGspKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gYlJldDsKLSAgICB9IGVsc2UgewotICAgICAgICBDRlhfUHRyQXJyYXkgbmV3X29ianNfYXJyYXk7Ci0gICAgICAgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG1fb2Jqc19hcnJheSwgRkFMU0UsIHBIaW50cywgbmV3X29ianNfYXJyYXkpOwotICAgICAgICBpZiAoYlJldCkgewotICAgICAgICAgICAgRlhfSU5UMzIgaVNpemUgPSBtX2FycmF5QWNyb2Zvcm1zLkdldFNpemUoKTsKLSAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpU2l6ZTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgKChDUERGX09iamVjdCAqKW1fYXJyYXlBY3JvZm9ybXMuR2V0QXQoaSkpLT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2FycmF5QWNyb2Zvcm1zLlJlbW92ZUFsbCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOwotICAgICAgICAgICAgbV9vYmpzX2FycmF5LkFwcGVuZChuZXdfb2Jqc19hcnJheSk7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBQREZPQkpfU1RSRUFNOgorICAgICAgICBwT2JqID0gcE9iai0+R2V0RGljdCgpOworICAgICAgY2FzZSBQREZPQkpfRElDVElPTkFSWTogeworICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcE9iai0+R2V0RGljdCgpOworICAgICAgICBpZiAocERpY3QgJiYgcERpY3QtPkdldFN0cmluZygiVHlwZSIpID09ICJQYWdlIiAmJiAhYlBhcnNlUGFnZSkgeworICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiUmV0OwotICAgIH0KLX0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrQWNyb0Zvcm0oSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKLXsKLSAgICBGWF9CT09MIGJFeGlzdCA9IEZBTFNFOwotICAgIG1fcEFjcm9Gb3JtID0gR2V0T2JqZWN0KG1fZHdBY3JvRm9ybU9iak51bSwgcEhpbnRzLCAmYkV4aXN0KTsKLSAgICBpZiAoIWJFeGlzdCkgewotICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRVRSRUU7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAoIW1fcEFjcm9Gb3JtKSB7Ci0gICAgICAgIGlmIChtX2RvY1N0YXR1cyA9PSBQREZfREFUQUFWQUlMX0VSUk9SKSB7Ci0gICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6ICpwRGljdCkgeworICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXkgPSBpdC5maXJzdDsKKyAgICAgICAgICBDUERGX09iamVjdCogdmFsdWUgPSBpdC5zZWNvbmQ7CisgICAgICAgICAgaWYgKGtleSAhPSAiUGFyZW50IikgeworICAgICAgICAgICAgbmV3X29ial9hcnJheS5BZGQodmFsdWUpOworICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOiB7CisgICAgICAgIENQREZfUmVmZXJlbmNlKiBwUmVmID0gcE9iai0+QXNSZWZlcmVuY2UoKTsKKyAgICAgICAgRlhfRFdPUkQgZHdOdW0gPSBwUmVmLT5HZXRSZWZPYmpOdW0oKTsKKyAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0OworICAgICAgICBGWF9EV09SRCBzaXplID0gR2V0T2JqZWN0U2l6ZShkd051bSwgb2Zmc2V0KTsKKyAgICAgICAgaWYgKHNpemUgPT0gMCB8fCBvZmZzZXQgPCAwIHx8IG9mZnNldCA+PSBtX2R3RmlsZUxlbikgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICghSXNEYXRhQXZhaWwob2Zmc2V0LCBzaXplLCBwSGludHMpKSB7CisgICAgICAgICAgcmV0X2FycmF5LkFkZChwT2JqKTsKKyAgICAgICAgICBjb3VudCsrOworICAgICAgICB9IGVsc2UgaWYgKCFwZGZpdW06OkNvbnRhaW5zS2V5KG1fT2JqZWN0U2V0LCBkd051bSkpIHsKKyAgICAgICAgICBtX09iamVjdFNldC5pbnNlcnQoZHdOdW0pOworICAgICAgICAgIENQREZfT2JqZWN0KiBwUmVmZXJyZWQgPQorICAgICAgICAgICAgICBtX3BEb2N1bWVudC0+R2V0SW5kaXJlY3RPYmplY3QocFJlZi0+R2V0UmVmT2JqTnVtKCksIG51bGxwdHIpOworICAgICAgICAgIGlmIChwUmVmZXJyZWQpIHsKKyAgICAgICAgICAgIG5ld19vYmpfYXJyYXkuQWRkKHBSZWZlcnJlZCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGJyZWFrOwogICAgIH0KLSAgICBtX2FycmF5QWNyb2Zvcm1zLkFkZChtX3BBY3JvRm9ybSk7Ci0gICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0VUUkVFOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tEb2NTdGF0dXMoSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cykKLXsKLSAgICBzd2l0Y2ggKG1fZG9jU3RhdHVzKSB7Ci0gICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9IRUFERVI6Ci0gICAgICAgICAgICByZXR1cm4gQ2hlY2tIZWFkZXIocEhpbnRzKTsKLSAgICAgICAgY2FzZSBQREZfREFUQUFWQUlMX0ZJUlNUUEFHRToKLSAgICAgICAgY2FzZSBQREZfREFUQUFWQUlMX0ZJUlNUUEFHRV9QUkVQQVJFOgotICAgICAgICAgICAgcmV0dXJuIENoZWNrRmlyc3RQYWdlKHBIaW50cyk7Ci0gICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9FTkQ6Ci0gICAgICAgICAgICByZXR1cm4gQ2hlY2tFbmQocEhpbnRzKTsKLSAgICAgICAgY2FzZSBQREZfREFUQUFWQUlMX0NST1NTUkVGOgotICAgICAgICAgICAgcmV0dXJuIENoZWNrQ3Jvc3NSZWYocEhpbnRzKTsKLSAgICAgICAgY2FzZSBQREZfREFUQUFWQUlMX0NST1NTUkVGX0lURU06Ci0gICAgICAgICAgICByZXR1cm4gQ2hlY2tDcm9zc1JlZkl0ZW0ocEhpbnRzKTsKLSAgICAgICAgY2FzZSBQREZfREFUQUFWQUlMX0NST1NTUkVGX1NUUkVBTToKLSAgICAgICAgICAgIHJldHVybiBDaGVja0FsbENyb3NzUmVmU3RyZWFtKHBIaW50cyk7Ci0gICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9UUkFJTEVSOgotICAgICAgICAgICAgcmV0dXJuIENoZWNrVHJhaWxlcihwSGludHMpOwotICAgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfVFJBSUxFUl9BUFBFTkQ6Ci0gICAgICAgICAgICByZXR1cm4gQ2hlY2tUcmFpbGVyQXBwZW5kKHBIaW50cyk7Ci0gICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9MT0FEQUxMQ1JTT1NTUkVGOgotICAgICAgICAgICAgcmV0dXJuIExvYWRBbGxYcmVmKHBIaW50cyk7Ci0gICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRToKLSAgICAgICAgICAgIHJldHVybiBMb2FkQWxsRmlsZShwSGludHMpOwotICAgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfUk9PVDoKLSAgICAgICAgICAgIHJldHVybiBDaGVja1Jvb3QocEhpbnRzKTsKLSAgICAgICAgY2FzZSBQREZfREFUQUFWQUlMX0lORk86Ci0gICAgICAgICAgICByZXR1cm4gQ2hlY2tJbmZvKHBIaW50cyk7Ci0gICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9BQ1JPRk9STToKLSAgICAgICAgICAgIHJldHVybiBDaGVja0Fjcm9Gb3JtKHBIaW50cyk7Ci0gICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9QQUdFVFJFRToKLSAgICAgICAgICAgIGlmIChtX2JUb3RhbExvYWRQYWdlVHJlZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBDaGVja1BhZ2VzKHBIaW50cyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBMb2FkRG9jUGFnZXMocEhpbnRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBQREZfREFUQUFWQUlMX1BBR0U6Ci0gICAgICAgICAgICBpZiAobV9iVG90YWxMb2FkUGFnZVRyZWUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ2hlY2tQYWdlKHBIaW50cyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9QQUdFX0xBVEVSTE9BRDsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBQREZfREFUQUFWQUlMX0VSUk9SOgotICAgICAgICAgICAgcmV0dXJuIExvYWRBbGxGaWxlKHBIaW50cyk7Ci0gICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9QQUdFX0xBVEVSTE9BRDoKLSAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9QQUdFOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgbV9iRG9jQXZhaWwgPSBUUlVFOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKGNvdW50ID4gMCkgeworICAgIGludDMyX3QgaVNpemUgPSBuZXdfb2JqX2FycmF5LkdldFNpemUoKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaVNpemU7ICsraSkgeworICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBuZXdfb2JqX2FycmF5W2ldOworICAgICAgaWYgKENQREZfUmVmZXJlbmNlKiBwUmVmID0gcE9iai0+QXNSZWZlcmVuY2UoKSkgeworICAgICAgICBGWF9EV09SRCBkd051bSA9IHBSZWYtPkdldFJlZk9iak51bSgpOworICAgICAgICBpZiAoIXBkZml1bTo6Q29udGFpbnNLZXkobV9PYmplY3RTZXQsIGR3TnVtKSkKKyAgICAgICAgICByZXRfYXJyYXkuQWRkKHBPYmopOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0X2FycmF5LkFkZChwT2JqKTsKKyAgICAgIH0KICAgICB9Ci19Ci1GWF9CT09MCUNQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VTdGF0dXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKLXsKLSAgICBzd2l0Y2ggKG1fZG9jU3RhdHVzKSB7Ci0gICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9QQUdFVFJFRToKLSAgICAgICAgICAgIHJldHVybiBDaGVja1BhZ2VzKHBIaW50cyk7Ci0gICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9QQUdFOgotICAgICAgICAgICAgcmV0dXJuIENoZWNrUGFnZShwSGludHMpOwotICAgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfRVJST1I6Ci0gICAgICAgICAgICByZXR1cm4gTG9hZEFsbEZpbGUocEhpbnRzKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIG1fYlBhZ2VzVHJlZUxvYWQgPSBUUlVFOwotICAgICAgICAgICAgbV9iUGFnZXNMb2FkID0gVFJVRTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLX0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkxvYWRBbGxGaWxlKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCi17Ci0gICAgaWYgKG1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwoMCwgKEZYX0RXT1JEKW1fZHdGaWxlTGVuKSkgewotICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRE9ORTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHBIaW50cy0+QWRkU2VnbWVudCgwLCAoRlhfRFdPUkQpbV9kd0ZpbGVMZW4pOwogICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkxvYWRBbGxYcmVmKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCi17Ci0gICAgbV9wYXJzZXIubV9TeW50YXguSW5pdFBhcnNlcihtX3BGaWxlUmVhZCwgKEZYX0RXT1JEKW1fZHdIZWFkZXJPZmZzZXQpOwotICAgIG1fcGFyc2VyLm1fYk93bkZpbGVSZWFkID0gRkFMU0U7Ci0gICAgaWYgKCFtX3BhcnNlci5Mb2FkQWxsQ3Jvc3NSZWZWNChtX2R3TGFzdFhSZWZPZmZzZXQpICYmICFtX3BhcnNlci5Mb2FkQWxsQ3Jvc3NSZWZWNShtX2R3TGFzdFhSZWZPZmZzZXQpKSB7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWFNZU19xc29ydChtX3BhcnNlci5tX1NvcnRlZE9mZnNldC5HZXREYXRhKCksIG1fcGFyc2VyLm1fU29ydGVkT2Zmc2V0LkdldFNpemUoKSwgc2l6ZW9mKEZYX0ZJTEVTSVpFKSwgX0NvbXBhcmVGaWxlU2l6ZSk7Ci0gICAgbV9kd1Jvb3RPYmpOdW0gPSBtX3BhcnNlci5HZXRSb290T2JqTnVtKCk7Ci0gICAgbV9kd0luZm9PYmpOdW0gPSBtX3BhcnNlci5HZXRJbmZvT2JqTnVtKCk7Ci0gICAgbV9wQ3VycmVudFBhcnNlciA9ICZtX3BhcnNlcjsKLSAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUk9PVDsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUNQREZfT2JqZWN0KiBDUERGX0RhdGFBdmFpbDo6R2V0T2JqZWN0KEZYX0RXT1JEIG9iam51bSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cywgRlhfQk9PTCAqcEV4aXN0SW5GaWxlKQotewotICAgIENQREZfT2JqZWN0ICpwUmV0ICAgICAgICAgPSBOVUxMOwotICAgIEZYX0RXT1JEICAgIG9yaWdpbmFsX3NpemUgPSAwOwotICAgIEZYX0ZJTEVTSVpFIG9mZnNldCAgICAgICAgPSAwOwotICAgIENQREZfUGFyc2VyICpwUGFyc2VyICAgICAgPSBOVUxMOwotCi0gICAgaWYgKHBFeGlzdEluRmlsZSkgeyAKLSAgICAgICAgKnBFeGlzdEluRmlsZSA9IFRSVUU7Ci0gICAgfQotCi0gICAgaWYgKG1fcERvY3VtZW50ID09IE5VTEwpIHsKLSAgICAgICAgb3JpZ2luYWxfc2l6ZSA9IChGWF9EV09SRCltX3BhcnNlci5HZXRPYmplY3RTaXplKG9iam51bSk7Ci0gICAgICAgIG9mZnNldCAgICAgICAgPSBtX3BhcnNlci5HZXRPYmplY3RPZmZzZXQob2JqbnVtKTsKLSAgICAgICAgcFBhcnNlciAgICAgICA9ICZtX3BhcnNlcjsgCi0gICAgfSBlbHNlIHsKLSAgICAgICAgb3JpZ2luYWxfc2l6ZSA9IEdldE9iamVjdFNpemUob2JqbnVtLCBvZmZzZXQpOwotICAgICAgICBwUGFyc2VyICAgICAgID0gKENQREZfUGFyc2VyICopKG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKSk7Ci0gICAgfQotCi0gICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxGWF9EV09SRD4gc2l6ZSA9IG9yaWdpbmFsX3NpemU7Ci0gICAgaWYgKHNpemUuVmFsdWVPckRlZmF1bHQoMCkgPT0gMCB8fCBvZmZzZXQgPCAwIHx8IG9mZnNldCA+PSBtX2R3RmlsZUxlbikgewotICAgICAgICBpZiAocEV4aXN0SW5GaWxlKQotICAgICAgICAgICAqcEV4aXN0SW5GaWxlID0gRkFMU0U7Ci0KLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotIAotICAgIHNpemUgKz0gb2Zmc2V0OwotICAgIHNpemUgKz0gNTEyOwotICAgIGlmICghc2l6ZS5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHNpemUuVmFsdWVPckRpZSgpID4gbV9kd0ZpbGVMZW4pIHsKLSAgICAgICAgc2l6ZSA9IG1fZHdGaWxlTGVuIC0gb2Zmc2V0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNpemUgPSBvcmlnaW5hbF9zaXplICsgNTEyOwotICAgIH0KLQotICAgIGlmICghc2l6ZS5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKCFtX3BGaWxlQXZhaWwtPklzRGF0YUF2YWlsKG9mZnNldCwgc2l6ZS5WYWx1ZU9yRGllKCkpKSB7Ci0gICAgICAgIHBIaW50cy0+QWRkU2VnbWVudChvZmZzZXQsIHNpemUuVmFsdWVPckRpZSgpKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKHBQYXJzZXIpIHsKLSAgICAgICAgcFJldCA9IHBQYXJzZXItPlBhcnNlSW5kaXJlY3RPYmplY3QoTlVMTCwgb2JqbnVtLCBOVUxMKTsKLSAgICB9Ci0KLSAgICBpZiAoIXBSZXQgJiYgcEV4aXN0SW5GaWxlKSB7Ci0gICAgICAgICpwRXhpc3RJbkZpbGUgPSBGQUxTRTsKLSAgICB9Ci0gCi0gICAgcmV0dXJuIHBSZXQ7CisgIH0KKyAgb2JqX2FycmF5LlJlbW92ZUFsbCgpOworICBvYmpfYXJyYXkuQXBwZW5kKG5ld19vYmpfYXJyYXkpOworICByZXR1cm4gSXNPYmplY3RzQXZhaWwob2JqX2FycmF5LCBGQUxTRSwgcEhpbnRzLCByZXRfYXJyYXkpOwogfQogCi1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja0luZm8oSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKLXsKLSAgICBGWF9CT09MIGJFeGlzdCA9IEZBTFNFOwotICAgIENQREZfT2JqZWN0ICpwSW5mbyA9IEdldE9iamVjdChtX2R3SW5mb09iak51bSwgcEhpbnRzLCAmYkV4aXN0KTsKLSAgICBpZiAoIWJFeGlzdCkgewotICAgICAgICBpZiAobV9iSGF2ZUFjcm9Gb3JtKSB7Ci0gICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfQUNST0ZPUk07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRVRSRUU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CitJUERGX0RhdGFBdmFpbDo6RG9jQXZhaWxTdGF0dXMgQ1BERl9EYXRhQXZhaWw6OklzRG9jQXZhaWwoCisgICAgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgeworICBpZiAoIW1fZHdGaWxlTGVuICYmIG1fcEZpbGVSZWFkKSB7CisgICAgbV9kd0ZpbGVMZW4gPSAoRlhfRFdPUkQpbV9wRmlsZVJlYWQtPkdldFNpemUoKTsKKyAgICBpZiAoIW1fZHdGaWxlTGVuKSB7CisgICAgICByZXR1cm4gRGF0YUVycm9yOwogICAgIH0KLSAgICBpZiAoIXBJbmZvKSB7Ci0gICAgICAgIGlmIChtX2RvY1N0YXR1cyA9PSBQREZfREFUQUFWQUlMX0VSUk9SKSB7Ci0gICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9Qb3MgPT0gbV9kd0ZpbGVMZW4pIHsKLSAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgd2hpbGUgKCFtX2JEb2NBdmFpbCkgeworICAgIGlmICghQ2hlY2tEb2NTdGF0dXMocEhpbnRzKSkgeworICAgICAgcmV0dXJuIERhdGFOb3RBdmFpbGFibGU7CiAgICAgfQotICAgIGlmIChwSW5mbykgewotICAgICAgICBwSW5mby0+UmVsZWFzZSgpOwotICAgIH0KLSAgICBpZiAobV9iSGF2ZUFjcm9Gb3JtKSB7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9BQ1JPRk9STTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRVRSRUU7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBEYXRhQXZhaWxhYmxlOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tSb290KElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCi17Ci0gICAgRlhfQk9PTCBiRXhpc3QgPSBGQUxTRTsKLSAgICBtX3BSb290ID0gR2V0T2JqZWN0KG1fZHdSb290T2JqTnVtLCBwSGludHMsICZiRXhpc3QpOwotICAgIGlmICghYkV4aXN0KSB7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisKK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrQWNyb0Zvcm1TdWJPYmplY3QoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgeworICBpZiAoIW1fb2Jqc19hcnJheS5HZXRTaXplKCkpIHsKKyAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7CisgICAgbV9PYmplY3RTZXQuY2xlYXIoKTsKKyAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX09iamVjdCo+IG9ial9hcnJheTsKKyAgICBvYmpfYXJyYXkuQXBwZW5kKG1fYXJyYXlBY3JvZm9ybXMpOworICAgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG9ial9hcnJheSwgRkFMU0UsIHBIaW50cywgbV9vYmpzX2FycmF5KTsKKyAgICBpZiAoYlJldCkgeworICAgICAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOwogICAgIH0KLSAgICBpZiAoIW1fcFJvb3QpIHsKLSAgICAgICAgaWYgKG1fZG9jU3RhdHVzID09IFBERl9EQVRBQVZBSUxfRVJST1IpIHsKLSAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gYlJldDsKKyAgfQorICBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX09iamVjdCo+IG5ld19vYmpzX2FycmF5OworICBGWF9CT09MIGJSZXQgPSBJc09iamVjdHNBdmFpbChtX29ianNfYXJyYXksIEZBTFNFLCBwSGludHMsIG5ld19vYmpzX2FycmF5KTsKKyAgaWYgKGJSZXQpIHsKKyAgICBpbnQzMl90IGlTaXplID0gbV9hcnJheUFjcm9mb3Jtcy5HZXRTaXplKCk7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7ICsraSkgeworICAgICAgbV9hcnJheUFjcm9mb3Jtcy5HZXRBdChpKS0+UmVsZWFzZSgpOwogICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wUm9vdC0+R2V0RGljdCgpOwotICAgIGlmICghcERpY3QpIHsKLSAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENQREZfUmVmZXJlbmNlKiBwUmVmID0gKENQREZfUmVmZXJlbmNlKilwRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiUGFnZXMiKSk7Ci0gICAgaWYgKHBSZWYgPT0gTlVMTCB8fCBwUmVmLT5HZXRUeXBlKCkgIT0gUERGT0JKX1JFRkVSRU5DRSkgewotICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9QYWdlc09iak51bSA9IHBSZWYtPkdldFJlZk9iak51bSgpOwotICAgIENQREZfUmVmZXJlbmNlKiBwQWNyb0Zvcm1SZWYgPSAoQ1BERl9SZWZlcmVuY2UqKW1fcFJvb3QtPkdldERpY3QoKS0+R2V0RWxlbWVudChGWF9CU1RSQygiQWNyb0Zvcm0iKSk7Ci0gICAgaWYgKHBBY3JvRm9ybVJlZiAmJiBwQWNyb0Zvcm1SZWYtPkdldFR5cGUoKSA9PSBQREZPQkpfUkVGRVJFTkNFKSB7Ci0gICAgICAgIG1fYkhhdmVBY3JvRm9ybSA9IFRSVUU7Ci0gICAgICAgIG1fZHdBY3JvRm9ybU9iak51bSA9IHBBY3JvRm9ybVJlZi0+R2V0UmVmT2JqTnVtKCk7Ci0gICAgfQotICAgIGlmIChtX2R3SW5mb09iak51bSkgewotICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfSU5GTzsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAobV9iSGF2ZUFjcm9Gb3JtKSB7Ci0gICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfQUNST0ZPUk07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRVRSRUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgbV9hcnJheUFjcm9mb3Jtcy5SZW1vdmVBbGwoKTsKKyAgfSBlbHNlIHsKKyAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7CisgICAgbV9vYmpzX2FycmF5LkFwcGVuZChuZXdfb2Jqc19hcnJheSk7CisgIH0KKyAgcmV0dXJuIGJSZXQ7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpQcmVwYXJlUGFnZUl0ZW0oKQotewotICAgIENQREZfRGljdGlvbmFyeSAqcFJvb3QgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpOwotICAgIENQREZfUmVmZXJlbmNlKiBwUmVmID0gcFJvb3QgPyAoQ1BERl9SZWZlcmVuY2UqKXBSb290LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJQYWdlcyIpKSA6IE5VTEw7Ci0gICAgaWYgKHBSZWYgPT0gTlVMTCB8fCBwUmVmLT5HZXRUeXBlKCkgIT0gUERGT0JKX1JFRkVSRU5DRSkgewotICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9QYWdlc09iak51bSA9IHBSZWYtPkdldFJlZk9iak51bSgpOwotICAgIG1fcEN1cnJlbnRQYXJzZXIgPSAoQ1BERl9QYXJzZXIgKiltX3BEb2N1bWVudC0+R2V0UGFyc2VyKCk7CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja0Fjcm9Gb3JtKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgRlhfQk9PTCBiRXhpc3QgPSBGQUxTRTsKKyAgbV9wQWNyb0Zvcm0gPSBHZXRPYmplY3QobV9kd0Fjcm9Gb3JtT2JqTnVtLCBwSGludHMsICZiRXhpc3QpOworICBpZiAoIWJFeGlzdCkgewogICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9QQUdFVFJFRTsKICAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoIW1fcEFjcm9Gb3JtKSB7CisgICAgaWYgKG1fZG9jU3RhdHVzID09IFBERl9EQVRBQVZBSUxfRVJST1IpIHsKKyAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9hcnJheUFjcm9mb3Jtcy5BZGQobV9wQWNyb0Zvcm0pOworICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRVRSRUU7CisgIHJldHVybiBUUlVFOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6SXNGaXJzdENoZWNrKGludCBpUGFnZSkKLXsKLSAgICBpZiAoTlVMTCA9PSBtX3BhZ2VNYXBDaGVja1N0YXRlKSB7Ci0gICAgICAgIG1fcGFnZU1hcENoZWNrU3RhdGUgPSBuZXcgQ0ZYX0NNYXBEV29yZFRvRFdvcmQoKTsKLSAgICB9Ci0gICAgRlhfRFdPUkQgZHdWYWx1ZSA9IDA7Ci0gICAgaWYgKCFtX3BhZ2VNYXBDaGVja1N0YXRlLT5Mb29rdXAoaVBhZ2UsIGR3VmFsdWUpKSB7Ci0gICAgICAgIG1fcGFnZU1hcENoZWNrU3RhdGUtPlNldEF0KGlQYWdlLCAxKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmIChkd1ZhbHVlICE9IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX3BhZ2VNYXBDaGVja1N0YXRlLT5TZXRBdChpUGFnZSwgMSk7CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja0RvY1N0YXR1cyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIHN3aXRjaCAobV9kb2NTdGF0dXMpIHsKKyAgICBjYXNlIFBERl9EQVRBQVZBSUxfSEVBREVSOgorICAgICAgcmV0dXJuIENoZWNrSGVhZGVyKHBIaW50cyk7CisgICAgY2FzZSBQREZfREFUQUFWQUlMX0ZJUlNUUEFHRToKKyAgICBjYXNlIFBERl9EQVRBQVZBSUxfRklSU1RQQUdFX1BSRVBBUkU6CisgICAgICByZXR1cm4gQ2hlY2tGaXJzdFBhZ2UocEhpbnRzKTsKKyAgICBjYXNlIFBERl9EQVRBQVZBSUxfSElOVFRBQkxFOgorICAgICAgcmV0dXJuIENoZWNrSGludFRhYmxlcyhwSGludHMpOworICAgIGNhc2UgUERGX0RBVEFBVkFJTF9FTkQ6CisgICAgICByZXR1cm4gQ2hlY2tFbmQocEhpbnRzKTsKKyAgICBjYXNlIFBERl9EQVRBQVZBSUxfQ1JPU1NSRUY6CisgICAgICByZXR1cm4gQ2hlY2tDcm9zc1JlZihwSGludHMpOworICAgIGNhc2UgUERGX0RBVEFBVkFJTF9DUk9TU1JFRl9JVEVNOgorICAgICAgcmV0dXJuIENoZWNrQ3Jvc3NSZWZJdGVtKHBIaW50cyk7CisgICAgY2FzZSBQREZfREFUQUFWQUlMX0NST1NTUkVGX1NUUkVBTToKKyAgICAgIHJldHVybiBDaGVja0FsbENyb3NzUmVmU3RyZWFtKHBIaW50cyk7CisgICAgY2FzZSBQREZfREFUQUFWQUlMX1RSQUlMRVI6CisgICAgICByZXR1cm4gQ2hlY2tUcmFpbGVyKHBIaW50cyk7CisgICAgY2FzZSBQREZfREFUQUFWQUlMX1RSQUlMRVJfQVBQRU5EOgorICAgICAgcmV0dXJuIENoZWNrVHJhaWxlckFwcGVuZChwSGludHMpOworICAgIGNhc2UgUERGX0RBVEFBVkFJTF9MT0FEQUxMQ1JPU1NSRUY6CisgICAgICByZXR1cm4gTG9hZEFsbFhyZWYocEhpbnRzKTsKKyAgICBjYXNlIFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU6CisgICAgICByZXR1cm4gTG9hZEFsbEZpbGUocEhpbnRzKTsKKyAgICBjYXNlIFBERl9EQVRBQVZBSUxfUk9PVDoKKyAgICAgIHJldHVybiBDaGVja1Jvb3QocEhpbnRzKTsKKyAgICBjYXNlIFBERl9EQVRBQVZBSUxfSU5GTzoKKyAgICAgIHJldHVybiBDaGVja0luZm8ocEhpbnRzKTsKKyAgICBjYXNlIFBERl9EQVRBQVZBSUxfQUNST0ZPUk06CisgICAgICByZXR1cm4gQ2hlY2tBY3JvRm9ybShwSGludHMpOworICAgIGNhc2UgUERGX0RBVEFBVkFJTF9QQUdFVFJFRToKKyAgICAgIGlmIChtX2JUb3RhbExvYWRQYWdlVHJlZSkgeworICAgICAgICByZXR1cm4gQ2hlY2tQYWdlcyhwSGludHMpOworICAgICAgfQorICAgICAgcmV0dXJuIExvYWREb2NQYWdlcyhwSGludHMpOworICAgIGNhc2UgUERGX0RBVEFBVkFJTF9QQUdFOgorICAgICAgaWYgKG1fYlRvdGFsTG9hZFBhZ2VUcmVlKSB7CisgICAgICAgIHJldHVybiBDaGVja1BhZ2UocEhpbnRzKTsKKyAgICAgIH0KKyAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9QQUdFX0xBVEVSTE9BRDsKKyAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgUERGX0RBVEFBVkFJTF9FUlJPUjoKKyAgICAgIHJldHVybiBMb2FkQWxsRmlsZShwSGludHMpOworICAgIGNhc2UgUERGX0RBVEFBVkFJTF9QQUdFX0xBVEVSTE9BRDoKKyAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9QQUdFOworICAgIGRlZmF1bHQ6CisgICAgICBtX2JEb2NBdmFpbCA9IFRSVUU7CisgICAgICByZXR1cm4gVFJVRTsKKyAgfQorfQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlU3RhdHVzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgc3dpdGNoIChtX2RvY1N0YXR1cykgeworICAgIGNhc2UgUERGX0RBVEFBVkFJTF9QQUdFVFJFRToKKyAgICAgIHJldHVybiBDaGVja1BhZ2VzKHBIaW50cyk7CisgICAgY2FzZSBQREZfREFUQUFWQUlMX1BBR0U6CisgICAgICByZXR1cm4gQ2hlY2tQYWdlKHBIaW50cyk7CisgICAgY2FzZSBQREZfREFUQUFWQUlMX0VSUk9SOgorICAgICAgcmV0dXJuIExvYWRBbGxGaWxlKHBIaW50cyk7CisgICAgZGVmYXVsdDoKKyAgICAgIG1fYlBhZ2VzVHJlZUxvYWQgPSBUUlVFOworICAgICAgbV9iUGFnZXNMb2FkID0gVFJVRTsKKyAgICAgIHJldHVybiBUUlVFOworICB9Cit9CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpMb2FkQWxsRmlsZShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIGlmIChtX3BGaWxlQXZhaWwtPklzRGF0YUF2YWlsKDAsIChGWF9EV09SRCltX2R3RmlsZUxlbikpIHsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRE9ORTsKICAgICByZXR1cm4gVFJVRTsKKyAgfQorICBwSGludHMtPkFkZFNlZ21lbnQoMCwgKEZYX0RXT1JEKW1fZHdGaWxlTGVuKTsKKyAgcmV0dXJuIEZBTFNFOwogfQotdm9pZCBDUERGX0RhdGFBdmFpbDo6UmVzZXRGaXJzdENoZWNrKGludCBpUGFnZSkKLXsKLSAgICBpZiAoTlVMTCA9PSBtX3BhZ2VNYXBDaGVja1N0YXRlKSB7Ci0gICAgICAgIG1fcGFnZU1hcENoZWNrU3RhdGUgPSBuZXcgQ0ZYX0NNYXBEV29yZFRvRFdvcmQoKTsKLSAgICB9Ci0gICAgRlhfRFdPUkQgZHdWYWx1ZSA9IDE7Ci0gICAgaWYgKCFtX3BhZ2VNYXBDaGVja1N0YXRlLT5Mb29rdXAoaVBhZ2UsIGR3VmFsdWUpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wYWdlTWFwQ2hlY2tTdGF0ZS0+U2V0QXQoaVBhZ2UsIDApOworRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6TG9hZEFsbFhyZWYoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgeworICBtX3BhcnNlci5tX1N5bnRheC5Jbml0UGFyc2VyKG1fcEZpbGVSZWFkLCAoRlhfRFdPUkQpbV9kd0hlYWRlck9mZnNldCk7CisgIG1fcGFyc2VyLm1fYk93bkZpbGVSZWFkID0gRkFMU0U7CisgIGlmICghbV9wYXJzZXIuTG9hZEFsbENyb3NzUmVmVjQobV9kd0xhc3RYUmVmT2Zmc2V0KSAmJgorICAgICAgIW1fcGFyc2VyLkxvYWRBbGxDcm9zc1JlZlY1KG1fZHdMYXN0WFJlZk9mZnNldCkpIHsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYU1lTX3Fzb3J0KG1fcGFyc2VyLm1fU29ydGVkT2Zmc2V0LkdldERhdGEoKSwKKyAgICAgICAgICAgICAgbV9wYXJzZXIubV9Tb3J0ZWRPZmZzZXQuR2V0U2l6ZSgpLCBzaXplb2YoRlhfRklMRVNJWkUpLAorICAgICAgICAgICAgICBDb21wYXJlRmlsZVNpemUpOworICBtX2R3Um9vdE9iak51bSA9IG1fcGFyc2VyLkdldFJvb3RPYmpOdW0oKTsKKyAgbV9kd0luZm9PYmpOdW0gPSBtX3BhcnNlci5HZXRJbmZvT2JqTnVtKCk7CisgIG1fcEN1cnJlbnRQYXJzZXIgPSAmbV9wYXJzZXI7CisgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9ST09UOworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrUGFnZShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQotewotICAgIEZYX0RXT1JEIGlQYWdlT2JqcyA9IG1fUGFnZU9iakxpc3QuR2V0U2l6ZSgpOwotICAgIENGWF9EV29yZEFycmF5IFVuYXZhaWxPYmpMaXN0OwotICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBpUGFnZU9ianM7ICsraSkgewotICAgICAgICBGWF9EV09SRCBkd1BhZ2VPYmpOdW0gPSBtX1BhZ2VPYmpMaXN0LkdldEF0KGkpOwotICAgICAgICBGWF9CT09MIGJFeGlzdCA9IEZBTFNFOwotICAgICAgICBDUERGX09iamVjdCAqcE9iaiA9IEdldE9iamVjdChkd1BhZ2VPYmpOdW0sIHBIaW50cywgJmJFeGlzdCk7Ci0gICAgICAgIGlmICghcE9iaikgewotICAgICAgICAgICAgaWYgKGJFeGlzdCkgewotICAgICAgICAgICAgICAgIFVuYXZhaWxPYmpMaXN0LkFkZChkd1BhZ2VPYmpOdW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgICAgIENQREZfQXJyYXkgKnBBcnJheSA9IHBPYmotPkdldEFycmF5KCk7Ci0gICAgICAgICAgICBpZiAocEFycmF5KSB7Ci0gICAgICAgICAgICAgICAgRlhfSU5UMzIgaVNpemUgPSBwQXJyYXktPkdldENvdW50KCk7Ci0gICAgICAgICAgICAgICAgQ1BERl9PYmplY3QgKnBJdGVtID0gTlVMTDsKLSAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGogPSAwOyBqIDwgaVNpemU7ICsraikgewotICAgICAgICAgICAgICAgICAgICBwSXRlbSA9IHBBcnJheS0+R2V0RWxlbWVudChqKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBJdGVtICYmIHBJdGVtLT5HZXRUeXBlKCkgPT0gUERGT0JKX1JFRkVSRU5DRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgVW5hdmFpbE9iakxpc3QuQWRkKCgoQ1BERl9SZWZlcmVuY2UgKilwSXRlbSktPkdldFJlZk9iak51bSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocE9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgICAgICBwT2JqLT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDRlhfQnl0ZVN0cmluZyB0eXBlID0gcE9iai0+R2V0RGljdCgpLT5HZXRTdHJpbmcoRlhfQlNUUkMoIlR5cGUiKSk7Ci0gICAgICAgIGlmICh0eXBlID09IEZYX0JTVFJDKCJQYWdlcyIpKSB7Ci0gICAgICAgICAgICBtX1BhZ2VzQXJyYXkuQWRkKHBPYmopOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgcE9iai0+UmVsZWFzZSgpOwotICAgIH0KLSAgICBtX1BhZ2VPYmpMaXN0LlJlbW92ZUFsbCgpOwotICAgIGlmIChVbmF2YWlsT2JqTGlzdC5HZXRTaXplKCkpIHsKLSAgICAgICAgbV9QYWdlT2JqTGlzdC5BcHBlbmQoVW5hdmFpbE9iakxpc3QpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX0RXT1JEIGlQYWdlcyA9IG1fUGFnZXNBcnJheS5HZXRTaXplKCk7Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGlQYWdlczsgaSsrKSB7Ci0gICAgICAgIENQREZfT2JqZWN0ICpwUGFnZXMgPSAoQ1BERl9PYmplY3QgKiltX1BhZ2VzQXJyYXkuR2V0QXQoaSk7Ci0gICAgICAgIGlmICghcFBhZ2VzKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIUdldFBhZ2VLaWRzKG1fcEN1cnJlbnRQYXJzZXIsIHBQYWdlcykpIHsKLSAgICAgICAgICAgIHBQYWdlcy0+UmVsZWFzZSgpOwotICAgICAgICAgICAgd2hpbGUgKCsraSA8IGlQYWdlcykgewotICAgICAgICAgICAgICAgIHBQYWdlcyA9IChDUERGX09iamVjdCAqKW1fUGFnZXNBcnJheS5HZXRBdChpKTsKLSAgICAgICAgICAgICAgICBwUGFnZXMtPlJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fUGFnZXNBcnJheS5SZW1vdmVBbGwoKTsKLSAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBwUGFnZXMtPlJlbGVhc2UoKTsKLSAgICB9Ci0gICAgbV9QYWdlc0FycmF5LlJlbW92ZUFsbCgpOwotICAgIGlmICghbV9QYWdlT2JqTGlzdC5HZXRTaXplKCkpIHsKLSAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0RPTkU7CitDUERGX09iamVjdCogQ1BERl9EYXRhQXZhaWw6OkdldE9iamVjdChGWF9EV09SRCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCogcEV4aXN0SW5GaWxlKSB7CisgIENQREZfT2JqZWN0KiBwUmV0ID0gbnVsbHB0cjsKKyAgRlhfRFdPUkQgc2l6ZSA9IDA7CisgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IDA7CisgIENQREZfUGFyc2VyKiBwUGFyc2VyID0gbnVsbHB0cjsKKyAgaWYgKHBFeGlzdEluRmlsZSkKKyAgICAqcEV4aXN0SW5GaWxlID0gVFJVRTsKKworICBpZiAobV9wRG9jdW1lbnQpIHsKKyAgICBzaXplID0gR2V0T2JqZWN0U2l6ZShvYmpudW0sIG9mZnNldCk7CisgICAgcFBhcnNlciA9IChDUERGX1BhcnNlciopKG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKSk7CisgIH0gZWxzZSB7CisgICAgc2l6ZSA9IChGWF9EV09SRCltX3BhcnNlci5HZXRPYmplY3RTaXplKG9iam51bSk7CisgICAgb2Zmc2V0ID0gbV9wYXJzZXIuR2V0T2JqZWN0T2Zmc2V0KG9iam51bSk7CisgICAgcFBhcnNlciA9ICZtX3BhcnNlcjsKKyAgfQorICBpZiAoIUlzRGF0YUF2YWlsKG9mZnNldCwgc2l6ZSwgcEhpbnRzKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGlmIChwUGFyc2VyKSB7CisgICAgcFJldCA9IHBQYXJzZXItPlBhcnNlSW5kaXJlY3RPYmplY3QoTlVMTCwgb2JqbnVtLCBOVUxMKTsKKyAgfQorCisgIGlmICghcFJldCAmJiBwRXhpc3RJbkZpbGUpIHsKKyAgICAqcEV4aXN0SW5GaWxlID0gRkFMU0U7CisgIH0KKworICByZXR1cm4gcFJldDsKK30KKworRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tJbmZvKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgRlhfQk9PTCBiRXhpc3QgPSBGQUxTRTsKKyAgQ1BERl9PYmplY3QqIHBJbmZvID0gR2V0T2JqZWN0KG1fZHdJbmZvT2JqTnVtLCBwSGludHMsICZiRXhpc3QpOworICBpZiAoIWJFeGlzdCkgeworICAgIGlmIChtX2JIYXZlQWNyb0Zvcm0pIHsKKyAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9BQ1JPRk9STTsKKyAgICB9IGVsc2UgeworICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0VUUkVFOwogICAgIH0KICAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoIXBJbmZvKSB7CisgICAgaWYgKG1fZG9jU3RhdHVzID09IFBERl9EQVRBQVZBSUxfRVJST1IpIHsKKyAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBpZiAobV9Qb3MgPT0gbV9kd0ZpbGVMZW4pIHsKKyAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChwSW5mbykgeworICAgIHBJbmZvLT5SZWxlYXNlKCk7CisgIH0KKyAgaWYgKG1fYkhhdmVBY3JvRm9ybSkgeworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9BQ1JPRk9STTsKKyAgfSBlbHNlIHsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRVRSRUU7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpHZXRQYWdlS2lkcyhDUERGX1BhcnNlciAqcFBhcnNlciwgQ1BERl9PYmplY3QgKnBQYWdlcykKLXsKLSAgICBpZiAoIXBQYXJzZXIpIHsKLSAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwUGFnZXMtPkdldERpY3QoKTsKLSAgICBDUERGX09iamVjdCAqcEtpZHMgPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJLaWRzIikpIDogTlVMTDsKLSAgICBpZiAoIXBLaWRzKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBzd2l0Y2ggKHBLaWRzLT5HZXRUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOiB7Ci0gICAgICAgICAgICAgICAgQ1BERl9SZWZlcmVuY2UgKnBLaWQgPSAoQ1BERl9SZWZlcmVuY2UgKilwS2lkczsKLSAgICAgICAgICAgICAgICBtX1BhZ2VPYmpMaXN0LkFkZChwS2lkLT5HZXRSZWZPYmpOdW0oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQREZPQkpfQVJSQVk6IHsKLSAgICAgICAgICAgICAgICBDUERGX0FycmF5ICpwS2lkc0FycmF5ID0gKENQREZfQXJyYXkgKilwS2lkczsKLSAgICAgICAgICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEtpZHNBcnJheS0+R2V0Q291bnQoKTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0ICpwS2lkID0gKENQREZfT2JqZWN0ICopcEtpZHNBcnJheS0+R2V0RWxlbWVudChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBLaWQgJiYgcEtpZC0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fUGFnZU9iakxpc3QuQWRkKCgoQ1BERl9SZWZlcmVuY2UgKilwS2lkKS0+R2V0UmVmT2JqTnVtKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tSb290KElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgRlhfQk9PTCBiRXhpc3QgPSBGQUxTRTsKKyAgbV9wUm9vdCA9IEdldE9iamVjdChtX2R3Um9vdE9iak51bSwgcEhpbnRzLCAmYkV4aXN0KTsKKyAgaWYgKCFiRXhpc3QpIHsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7CiAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKCFtX3BSb290KSB7CisgICAgaWYgKG1fZG9jU3RhdHVzID09IFBERl9EQVRBQVZBSUxfRVJST1IpIHsKKyAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcFJvb3QtPkdldERpY3QoKTsKKyAgaWYgKCFwRGljdCkgeworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSBUb1JlZmVyZW5jZShwRGljdC0+R2V0RWxlbWVudCgiUGFnZXMiKSk7CisgIGlmICghcFJlZikgeworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBtX1BhZ2VzT2JqTnVtID0gcFJlZi0+R2V0UmVmT2JqTnVtKCk7CisgIENQREZfUmVmZXJlbmNlKiBwQWNyb0Zvcm1SZWYgPQorICAgICAgVG9SZWZlcmVuY2UobV9wUm9vdC0+R2V0RGljdCgpLT5HZXRFbGVtZW50KCJBY3JvRm9ybSIpKTsKKyAgaWYgKHBBY3JvRm9ybVJlZikgeworICAgIG1fYkhhdmVBY3JvRm9ybSA9IFRSVUU7CisgICAgbV9kd0Fjcm9Gb3JtT2JqTnVtID0gcEFjcm9Gb3JtUmVmLT5HZXRSZWZPYmpOdW0oKTsKKyAgfQorCisgIGlmIChtX2R3SW5mb09iak51bSkgeworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9JTkZPOworICB9IGVsc2UgeworICAgIG1fZG9jU3RhdHVzID0KKyAgICAgICAgbV9iSGF2ZUFjcm9Gb3JtID8gUERGX0RBVEFBVkFJTF9BQ1JPRk9STSA6IFBERl9EQVRBQVZBSUxfUEFHRVRSRUU7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCi17CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpQcmVwYXJlUGFnZUl0ZW0oKSB7CisgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpOworICBDUERGX1JlZmVyZW5jZSogcFJlZiA9CisgICAgICBUb1JlZmVyZW5jZShwUm9vdCA/IHBSb290LT5HZXRFbGVtZW50KCJQYWdlcyIpIDogbnVsbHB0cik7CisgIGlmICghcFJlZikgeworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBtX1BhZ2VzT2JqTnVtID0gcFJlZi0+R2V0UmVmT2JqTnVtKCk7CisgIG1fcEN1cnJlbnRQYXJzZXIgPSAoQ1BERl9QYXJzZXIqKW1fcERvY3VtZW50LT5HZXRQYXJzZXIoKTsKKyAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0VUUkVFOworICByZXR1cm4gVFJVRTsKK30KK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OklzRmlyc3RDaGVjayhpbnQgaVBhZ2UpIHsKKyAgcmV0dXJuIG1fcGFnZU1hcENoZWNrU3RhdGUuaW5zZXJ0KGlQYWdlKS5zZWNvbmQ7Cit9Cit2b2lkIENQREZfRGF0YUF2YWlsOjpSZXNldEZpcnN0Q2hlY2soaW50IGlQYWdlKSB7CisgIG1fcGFnZU1hcENoZWNrU3RhdGUuZXJhc2UoaVBhZ2UpOworfQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgRlhfRFdPUkQgaVBhZ2VPYmpzID0gbV9QYWdlT2JqTGlzdC5HZXRTaXplKCk7CisgIENGWF9EV29yZEFycmF5IFVuYXZhaWxPYmpMaXN0OworICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgaVBhZ2VPYmpzOyArK2kpIHsKKyAgICBGWF9EV09SRCBkd1BhZ2VPYmpOdW0gPSBtX1BhZ2VPYmpMaXN0LkdldEF0KGkpOwogICAgIEZYX0JPT0wgYkV4aXN0ID0gRkFMU0U7Ci0gICAgQ1BERl9PYmplY3QgKnBQYWdlcyA9IEdldE9iamVjdChtX1BhZ2VzT2JqTnVtLCBwSGludHMsICZiRXhpc3QpOwotICAgIGlmICghYkV4aXN0KSB7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgQ1BERl9PYmplY3QqIHBPYmogPSBHZXRPYmplY3QoZHdQYWdlT2JqTnVtLCBwSGludHMsICZiRXhpc3QpOworICAgIGlmICghcE9iaikgeworICAgICAgaWYgKGJFeGlzdCkgeworICAgICAgICBVbmF2YWlsT2JqTGlzdC5BZGQoZHdQYWdlT2JqTnVtKTsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpZiAoIXBQYWdlcykgewotICAgICAgICBpZiAobV9kb2NTdGF0dXMgPT0gUERGX0RBVEFBVkFJTF9FUlJPUikgewotICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgaWYgKHBPYmotPklzQXJyYXkoKSkgeworICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gcE9iai0+R2V0QXJyYXkoKTsKKyAgICAgIGlmIChwQXJyYXkpIHsKKyAgICAgICAgaW50MzJfdCBpU2l6ZSA9IHBBcnJheS0+R2V0Q291bnQoKTsKKyAgICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaVNpemU7ICsraikgeworICAgICAgICAgIGlmIChDUERGX1JlZmVyZW5jZSogcFJlZiA9IFRvUmVmZXJlbmNlKHBBcnJheS0+R2V0RWxlbWVudChqKSkpCisgICAgICAgICAgICBVbmF2YWlsT2JqTGlzdC5BZGQocFJlZi0+R2V0UmVmT2JqTnVtKCkpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KICAgICB9CisgICAgaWYgKCFwT2JqLT5Jc0RpY3Rpb25hcnkoKSkgeworICAgICAgcE9iai0+UmVsZWFzZSgpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIENGWF9CeXRlU3RyaW5nIHR5cGUgPSBwT2JqLT5HZXREaWN0KCktPkdldFN0cmluZygiVHlwZSIpOworICAgIGlmICh0eXBlID09ICJQYWdlcyIpIHsKKyAgICAgIG1fUGFnZXNBcnJheS5BZGQocE9iaik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgcE9iai0+UmVsZWFzZSgpOworICB9CisgIG1fUGFnZU9iakxpc3QuUmVtb3ZlQWxsKCk7CisgIGlmIChVbmF2YWlsT2JqTGlzdC5HZXRTaXplKCkpIHsKKyAgICBtX1BhZ2VPYmpMaXN0LkFwcGVuZChVbmF2YWlsT2JqTGlzdCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX0RXT1JEIGlQYWdlcyA9IG1fUGFnZXNBcnJheS5HZXRTaXplKCk7CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBpUGFnZXM7IGkrKykgeworICAgIENQREZfT2JqZWN0KiBwUGFnZXMgPSBtX1BhZ2VzQXJyYXkuR2V0QXQoaSk7CisgICAgaWYgKCFwUGFnZXMpCisgICAgICBjb250aW51ZTsKKwogICAgIGlmICghR2V0UGFnZUtpZHMobV9wQ3VycmVudFBhcnNlciwgcFBhZ2VzKSkgeworICAgICAgcFBhZ2VzLT5SZWxlYXNlKCk7CisgICAgICB3aGlsZSAoKytpIDwgaVBhZ2VzKSB7CisgICAgICAgIHBQYWdlcyA9IG1fUGFnZXNBcnJheS5HZXRBdChpKTsKICAgICAgICAgcFBhZ2VzLT5SZWxlYXNlKCk7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgbV9QYWdlc0FycmF5LlJlbW92ZUFsbCgpOworICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBwUGFnZXMtPlJlbGVhc2UoKTsKLSAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRTsKKyAgfQorICBtX1BhZ2VzQXJyYXkuUmVtb3ZlQWxsKCk7CisgIGlmICghbV9QYWdlT2JqTGlzdC5HZXRTaXplKCkpIHsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRE9ORTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkdldFBhZ2VLaWRzKENQREZfUGFyc2VyKiBwUGFyc2VyLCBDUERGX09iamVjdCogcFBhZ2VzKSB7CisgIGlmICghcFBhcnNlcikgeworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBQYWdlcy0+R2V0RGljdCgpOworICBDUERGX09iamVjdCogcEtpZHMgPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50KCJLaWRzIikgOiBOVUxMOworICBpZiAoIXBLaWRzKSB7CiAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgc3dpdGNoIChwS2lkcy0+R2V0VHlwZSgpKSB7CisgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOgorICAgICAgbV9QYWdlT2JqTGlzdC5BZGQocEtpZHMtPkFzUmVmZXJlbmNlKCktPkdldFJlZk9iak51bSgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUERGT0JKX0FSUkFZOiB7CisgICAgICBDUERGX0FycmF5KiBwS2lkc0FycmF5ID0gcEtpZHMtPkFzQXJyYXkoKTsKKyAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwS2lkc0FycmF5LT5HZXRDb3VudCgpOyArK2kpIHsKKyAgICAgICAgaWYgKENQREZfUmVmZXJlbmNlKiBwUmVmID0gVG9SZWZlcmVuY2UocEtpZHNBcnJheS0+R2V0RWxlbWVudChpKSkpCisgICAgICAgICAgbV9QYWdlT2JqTGlzdC5BZGQocFJlZi0+R2V0UmVmT2JqTnVtKCkpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrSGVhZGVyKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCi17Ci0gICAgRlhfRFdPUkQgcmVxX3NpemUgPSAxMDI0OwotICAgIGlmICgoRlhfRklMRVNJWkUpcmVxX3NpemUgPiBtX2R3RmlsZUxlbikgewotICAgICAgICByZXFfc2l6ZSA9IChGWF9EV09SRCltX2R3RmlsZUxlbjsKK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrUGFnZXMoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgeworICBGWF9CT09MIGJFeGlzdCA9IEZBTFNFOworICBDUERGX09iamVjdCogcFBhZ2VzID0gR2V0T2JqZWN0KG1fUGFnZXNPYmpOdW0sIHBIaW50cywgJmJFeGlzdCk7CisgIGlmICghYkV4aXN0KSB7CisgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmICghcFBhZ2VzKSB7CisgICAgaWYgKG1fZG9jU3RhdHVzID09IFBERl9EQVRBQVZBSUxfRVJST1IpIHsKKyAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKKyAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICBpZiAobV9wRmlsZUF2YWlsLT5Jc0RhdGFBdmFpbCgwLCByZXFfc2l6ZSkpIHsKLSAgICAgICAgRlhfQllURSBidWZmZXJbMTAyNF07Ci0gICAgICAgIG1fcEZpbGVSZWFkLT5SZWFkQmxvY2soYnVmZmVyLCAwLCByZXFfc2l6ZSk7Ci0gICAgICAgIGlmIChJc0xpbmVhcml6ZWRGaWxlKGJ1ZmZlciwgcmVxX3NpemUpKSB7Ci0gICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRklSU1RQQUdFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1fZG9jU3RhdHVzID09IFBERl9EQVRBQVZBSUxfRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRU5EOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBwSGludHMtPkFkZFNlZ21lbnQoMCwgcmVxX3NpemUpOwogICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrRmlyc3RQYWdlKElGWF9Eb3dubG9hZEhpbnRzICpwSGludHMpCi17Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcExpbmVhcml6ZWQtPkdldERpY3QoKTsKLSAgICBDUERGX09iamVjdCAqcEVuZE9mZlNldCA9IHBEaWN0ID8gcERpY3QtPkdldEVsZW1lbnQoRlhfQlNUUkMoIkUiKSkgOiBOVUxMOwotICAgIGlmICghcEVuZE9mZlNldCkgewotICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QgKnBYUmVmT2Zmc2V0ID0gcERpY3QgPyBwRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiVCIpKSA6IE5VTEw7Ci0gICAgaWYgKCFwWFJlZk9mZnNldCkgewotICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QgKnBGaWxlTGVuID0gcERpY3QgPyBwRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiTCIpKSA6IE5VTEw7Ci0gICAgaWYgKCFwRmlsZUxlbikgewotICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfQk9PTCBiTmVlZERvd25Mb2FkID0gRkFMU0U7Ci0gICAgaWYgKHBFbmRPZmZTZXQtPkdldFR5cGUoKSA9PSBQREZPQkpfTlVNQkVSKSB7Ci0gICAgICAgIEZYX0RXT1JEIGR3RW5kID0gcEVuZE9mZlNldC0+R2V0SW50ZWdlcigpOwotICAgICAgICBkd0VuZCArPSA1MTI7Ci0gICAgICAgIGlmICgoRlhfRklMRVNJWkUpZHdFbmQgPiBtX2R3RmlsZUxlbikgewotICAgICAgICAgICAgZHdFbmQgPSAoRlhfRFdPUkQpbV9kd0ZpbGVMZW47Ci0gICAgICAgIH0KLSAgICAgICAgRlhfSU5UMzIgaVN0YXJ0UG9zID0gKEZYX0lOVDMyKShtX2R3RmlsZUxlbiA+IDEwMjQgPyAxMDI0IDogbV9kd0ZpbGVMZW4pOwotICAgICAgICBGWF9JTlQzMiBpU2l6ZSA9IGR3RW5kID4gMTAyNCA/IGR3RW5kIC0gMTAyNCA6IDA7Ci0gICAgICAgIGlmICghbV9wRmlsZUF2YWlsLT5Jc0RhdGFBdmFpbChpU3RhcnRQb3MsIGlTaXplKSkgewotICAgICAgICAgICAgcEhpbnRzLT5BZGRTZWdtZW50KGlTdGFydFBvcywgaVNpemUpOwotICAgICAgICAgICAgYk5lZWREb3duTG9hZCA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9kd0xhc3RYUmVmT2Zmc2V0ID0gMDsKLSAgICBGWF9GSUxFU0laRSBkd0ZpbGVMZW4gPSAwOwotICAgIGlmIChwWFJlZk9mZnNldC0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIpIHsKLSAgICAgICAgbV9kd0xhc3RYUmVmT2Zmc2V0ID0gcFhSZWZPZmZzZXQtPkdldEludGVnZXIoKTsKLSAgICB9Ci0gICAgaWYgKHBGaWxlTGVuLT5HZXRUeXBlKCkgPT0gUERGT0JKX05VTUJFUikgewotICAgICAgICBkd0ZpbGVMZW4gPSBwRmlsZUxlbi0+R2V0SW50ZWdlcigpOwotICAgIH0KLSAgICBpZiAoIW1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwobV9kd0xhc3RYUmVmT2Zmc2V0LCAoRlhfRFdPUkQpKGR3RmlsZUxlbiAtIG1fZHdMYXN0WFJlZk9mZnNldCkpKSB7Ci0gICAgICAgIGlmIChtX2RvY1N0YXR1cyA9PSBQREZfREFUQUFWQUlMX0ZJUlNUUEFHRSkJewotICAgICAgICAgICAgRlhfRFdPUkQgZHdTaXplID0gKEZYX0RXT1JEKShkd0ZpbGVMZW4gLSBtX2R3TGFzdFhSZWZPZmZzZXQpOwotICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0gbV9kd0xhc3RYUmVmT2Zmc2V0OwotICAgICAgICAgICAgaWYgKGR3U2l6ZSA8IDUxMiAmJiBkd0ZpbGVMZW4gPiA1MTIpIHsKLSAgICAgICAgICAgICAgICBkd1NpemUgPSA1MTI7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ID0gZHdGaWxlTGVuIC0gNTEyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEhpbnRzLT5BZGRTZWdtZW50KG9mZnNldCwgZHdTaXplKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9GSVJTVFBBR0VfUFJFUEFSRTsKLSAgICB9Ci0gICAgaWYgKCFiTmVlZERvd25Mb2FkICYmIG1fZG9jU3RhdHVzID09IFBERl9EQVRBQVZBSUxfRklSU1RQQUdFX1BSRVBBUkUpIHsKLSAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0RPTkU7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRklSU1RQQUdFX1BSRVBBUkU7CisgIH0KKyAgaWYgKCFHZXRQYWdlS2lkcyhtX3BDdXJyZW50UGFyc2VyLCBwUGFnZXMpKSB7CisgICAgcFBhZ2VzLT5SZWxlYXNlKCk7CisgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwogICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBwUGFnZXMtPlJlbGVhc2UoKTsKKyAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0U7CisgIHJldHVybiBUUlVFOwogfQotQ1BERl9PYmplY3QJKiBDUERGX0RhdGFBdmFpbDo6UGFyc2VJbmRpcmVjdE9iamVjdEF0KEZYX0ZJTEVTSVpFIHBvcywgRlhfRFdPUkQgb2JqbnVtKQotewotICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9zeW50YXhQYXJzZXIuU2F2ZVBvcygpOwotICAgIG1fc3ludGF4UGFyc2VyLlJlc3RvcmVQb3MocG9zKTsKLSAgICBGWF9CT09MIGJJc051bWJlcjsKLSAgICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gbV9zeW50YXhQYXJzZXIuR2V0TmV4dFdvcmQoYklzTnVtYmVyKTsKLSAgICBpZiAoIWJJc051bWJlcikgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgRlhfRFdPUkQgcGFyc2VyX29iam51bSA9IEZYU1lTX2F0b2kod29yZCk7Ci0gICAgaWYgKG9iam51bSAmJiBwYXJzZXJfb2JqbnVtICE9IG9iam51bSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgd29yZCA9IG1fc3ludGF4UGFyc2VyLkdldE5leHRXb3JkKGJJc051bWJlcik7Ci0gICAgaWYgKCFiSXNOdW1iZXIpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYX0RXT1JEIGdlbm51bSA9IEZYU1lTX2F0b2kod29yZCk7Ci0gICAgaWYgKG1fc3ludGF4UGFyc2VyLkdldEtleXdvcmQoKSAhPSBGWF9CU1RSQygib2JqIikpIHsKLSAgICAgICAgbV9zeW50YXhQYXJzZXIuUmVzdG9yZVBvcyhTYXZlZFBvcyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcE9iaiA9IG1fc3ludGF4UGFyc2VyLkdldE9iamVjdChOVUxMLCBvYmpudW0sIGdlbm51bSwgMCk7Ci0gICAgbV9zeW50YXhQYXJzZXIuUmVzdG9yZVBvcyhTYXZlZFBvcyk7Ci0gICAgcmV0dXJuIHBPYmo7Ci19Ci1GWF9JTlQzMiBDUERGX0RhdGFBdmFpbDo6SXNMaW5lYXJpemVkUERGKCkKLXsKLSAgICBGWF9EV09SRCByZXFfc2l6ZSA9IDEwMjQ7Ci0gICAgaWYgKCFtX3BGaWxlQXZhaWwtPklzRGF0YUF2YWlsKDAsIHJlcV9zaXplKSkgewotICAgICAgICByZXR1cm4gUERGX1VOS05PV19MSU5FQVJJWkVEOwotICAgIH0KLSAgICBpZiAoIW1fcEZpbGVSZWFkKSB7Ci0gICAgICAgIHJldHVybiBQREZfTk9UX0xJTkVBUklaRUQ7Ci0gICAgfQotICAgIEZYX0ZJTEVTSVpFIGR3U2l6ZSA9IG1fcEZpbGVSZWFkLT5HZXRTaXplKCk7Ci0gICAgaWYgKGR3U2l6ZSA8IChGWF9GSUxFU0laRSlyZXFfc2l6ZSkgewotICAgICAgICByZXR1cm4gUERGX1VOS05PV19MSU5FQVJJWkVEOwotICAgIH0KLSAgICBGWF9CWVRFIGJ1ZmZlclsxMDI0XTsKK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrSGVhZGVyKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgRlhfRFdPUkQgcmVxX3NpemUgPSAxMDI0OworICBpZiAoKEZYX0ZJTEVTSVpFKXJlcV9zaXplID4gbV9kd0ZpbGVMZW4pIHsKKyAgICByZXFfc2l6ZSA9IChGWF9EV09SRCltX2R3RmlsZUxlbjsKKyAgfQorICBpZiAobV9wRmlsZUF2YWlsLT5Jc0RhdGFBdmFpbCgwLCByZXFfc2l6ZSkpIHsKKyAgICB1aW50OF90IGJ1ZmZlclsxMDI0XTsKICAgICBtX3BGaWxlUmVhZC0+UmVhZEJsb2NrKGJ1ZmZlciwgMCwgcmVxX3NpemUpOwogICAgIGlmIChJc0xpbmVhcml6ZWRGaWxlKGJ1ZmZlciwgcmVxX3NpemUpKSB7Ci0gICAgICAgIHJldHVybiBQREZfSVNfTElORUFSSVpFRDsKLSAgICB9Ci0gICAgcmV0dXJuIFBERl9OT1RfTElORUFSSVpFRDsKLX0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OklzTGluZWFyaXplZEZpbGUoRlhfTFBCWVRFIHBEYXRhLCBGWF9EV09SRCBkd0xlbikKLXsKLSAgICBDRlhfU21hcnRQb2ludGVyPElGWF9GaWxlU3RyZWFtPiBmaWxlKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShwRGF0YSwgKHNpemVfdClkd0xlbiwgRkFMU0UpKTsKLSAgICBGWF9JTlQzMiBvZmZzZXQgPSBHZXRIZWFkZXJPZmZzZXQoZmlsZS5HZXQoKSk7Ci0gICAgaWYgKG9mZnNldCA9PSAtMSkgewotICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9kd0hlYWRlck9mZnNldCA9IG9mZnNldDsKLSAgICBtX3N5bnRheFBhcnNlci5Jbml0UGFyc2VyKGZpbGUuR2V0KCksIG9mZnNldCk7Ci0gICAgbV9zeW50YXhQYXJzZXIuUmVzdG9yZVBvcyhtX3N5bnRheFBhcnNlci5tX0hlYWRlck9mZnNldCArIDkpOwotICAgIEZYX0JPT0wgYk51bWJlciA9IEZBTFNFOwotICAgIENGWF9CeXRlU3RyaW5nIHdvcmRPYmpOdW0gPSBtX3N5bnRheFBhcnNlci5HZXROZXh0V29yZChiTnVtYmVyKTsKLSAgICBpZiAoIWJOdW1iZXIpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9EV09SRCBvYmpudW0gPSBGWFNZU19hdG9pKHdvcmRPYmpOdW0pOwotICAgIGlmIChtX3BMaW5lYXJpemVkKSB7Ci0gICAgICAgIG1fcExpbmVhcml6ZWQtPlJlbGVhc2UoKTsKLSAgICAgICAgbV9wTGluZWFyaXplZCA9IE5VTEw7Ci0gICAgfQotICAgIG1fcExpbmVhcml6ZWQgPSBQYXJzZUluZGlyZWN0T2JqZWN0QXQobV9zeW50YXhQYXJzZXIubV9IZWFkZXJPZmZzZXQgKyA5LCBvYmpudW0pOwotICAgIGlmICghbV9wTGluZWFyaXplZCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX3BMaW5lYXJpemVkLT5HZXREaWN0KCkgJiYgbV9wTGluZWFyaXplZC0+R2V0RGljdCgpLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJMaW5lYXJpemVkIikpKSB7Ci0gICAgICAgIENQREZfT2JqZWN0ICpwTGVuID0gbV9wTGluZWFyaXplZC0+R2V0RGljdCgpLT5HZXRFbGVtZW50KEZYX0JTVFJDKCJMIikpOwotICAgICAgICBpZiAoIXBMZW4pIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKEZYX0ZJTEVTSVpFKXBMZW4tPkdldEludGVnZXIoKSAhPSBtX3BGaWxlUmVhZC0+R2V0U2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgbV9iTGluZWFyaXplZCA9IFRSVUU7Ci0gICAgICAgIENQREZfT2JqZWN0ICpwTm8gPSBtX3BMaW5lYXJpemVkLT5HZXREaWN0KCktPkdldEVsZW1lbnQoRlhfQlNUUkMoIlAiKSk7Ci0gICAgICAgIGlmIChwTm8gJiYgcE5vLT5HZXRUeXBlKCkgPT0gUERGT0JKX05VTUJFUikgewotICAgICAgICAgICAgbV9kd0ZpcnN0UGFnZU5vID0gcE5vLT5HZXRJbnRlZ2VyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrRW5kKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCi17Ci0gICAgRlhfRFdPUkQgcmVxX3BvcyA9IChGWF9EV09SRCkobV9kd0ZpbGVMZW4gPiAxMDI0ID8gbV9kd0ZpbGVMZW4gLSAxMDI0IDogMCk7Ci0gICAgRlhfRFdPUkQgZHdTaXplID0gKEZYX0RXT1JEKShtX2R3RmlsZUxlbiAtIHJlcV9wb3MpOwotICAgIGlmIChtX3BGaWxlQXZhaWwtPklzRGF0YUF2YWlsKHJlcV9wb3MsIGR3U2l6ZSkpIHsKLSAgICAgICAgRlhfQllURSBidWZmZXJbMTAyNF07Ci0gICAgICAgIG1fcEZpbGVSZWFkLT5SZWFkQmxvY2soYnVmZmVyLCByZXFfcG9zLCBkd1NpemUpOwotICAgICAgICBDRlhfU21hcnRQb2ludGVyPElGWF9GaWxlU3RyZWFtPiBmaWxlKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShidWZmZXIsIChzaXplX3QpZHdTaXplLCBGQUxTRSkpOwotICAgICAgICBtX3N5bnRheFBhcnNlci5Jbml0UGFyc2VyKGZpbGUuR2V0KCksIDApOwotICAgICAgICBtX3N5bnRheFBhcnNlci5SZXN0b3JlUG9zKGR3U2l6ZSAtIDEpOwotICAgICAgICBpZiAobV9zeW50YXhQYXJzZXIuU2VhcmNoV29yZChGWF9CU1RSQygic3RhcnR4cmVmIiksIFRSVUUsIEZBTFNFLCBkd1NpemUpKSB7Ci0gICAgICAgICAgICBGWF9CT09MIGJOdW1iZXI7Ci0gICAgICAgICAgICBtX3N5bnRheFBhcnNlci5HZXROZXh0V29yZChiTnVtYmVyKTsKLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHhyZWZwb3Nfc3RyID0gbV9zeW50YXhQYXJzZXIuR2V0TmV4dFdvcmQoYk51bWJlcik7Ci0gICAgICAgICAgICBpZiAoIWJOdW1iZXIpIHsKLSAgICAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9kd1hSZWZPZmZzZXQgPSAoRlhfRklMRVNJWkUpRlhTWVNfYXRvaTY0KHhyZWZwb3Nfc3RyKTsKLSAgICAgICAgICAgIGlmICghbV9kd1hSZWZPZmZzZXQgfHwgbV9kd1hSZWZPZmZzZXQgPiBtX2R3RmlsZUxlbikgewotICAgICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fZHdMYXN0WFJlZk9mZnNldCA9IG1fZHdYUmVmT2Zmc2V0OwotICAgICAgICAgICAgU2V0U3RhcnRPZmZzZXQobV9kd1hSZWZPZmZzZXQpOwotICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0NST1NTUkVGOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwSGludHMtPkFkZFNlZ21lbnQocmVxX3BvcywgZHdTaXplKTsKLSAgICByZXR1cm4gRkFMU0U7Ci19Ci1GWF9JTlQzMiBDUERGX0RhdGFBdmFpbDo6Q2hlY2tDcm9zc1JlZlN0cmVhbShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzLCBGWF9GSUxFU0laRSAmeHJlZl9vZmZzZXQpCi17Ci0gICAgeHJlZl9vZmZzZXQgPSAwOwotICAgIEZYX0RXT1JEIHJlcV9zaXplID0gKEZYX0RXT1JEKShtX1BvcyArIDUxMiA+IG1fZHdGaWxlTGVuID8gbV9kd0ZpbGVMZW4gLSBtX1BvcyA6IDUxMik7Ci0gICAgaWYgKG1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwobV9Qb3MsIHJlcV9zaXplKSkgewotICAgICAgICBGWF9JTlQzMiBpU2l6ZSA9IChGWF9JTlQzMikobV9Qb3MgKyByZXFfc2l6ZSAtIG1fZHdDdXJyZW50WFJlZlN0ZWFtKTsKLSAgICAgICAgQ0ZYX0JpbmFyeUJ1ZiBidWYoaVNpemUpOwotICAgICAgICBGWF9MUEJZVEUgcEJ1ZiA9IGJ1Zi5HZXRCdWZmZXIoKTsKLSAgICAgICAgbV9wRmlsZVJlYWQtPlJlYWRCbG9jayhwQnVmLCBtX2R3Q3VycmVudFhSZWZTdGVhbSwgaVNpemUpOwotICAgICAgICBDRlhfU21hcnRQb2ludGVyPElGWF9GaWxlU3RyZWFtPiBmaWxlKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShwQnVmLCAoc2l6ZV90KWlTaXplLCBGQUxTRSkpOwotICAgICAgICBtX3BhcnNlci5tX1N5bnRheC5Jbml0UGFyc2VyKGZpbGUuR2V0KCksIDApOwotICAgICAgICBGWF9CT09MIGJOdW1iZXIgPSBGQUxTRTsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgb2JqbnVtID0gbV9wYXJzZXIubV9TeW50YXguR2V0TmV4dFdvcmQoYk51bWJlcik7Ci0gICAgICAgIGlmICghYk51bWJlcikgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIEZYX0RXT1JEIG9iak51bSA9IEZYU1lTX2F0b2kob2JqbnVtKTsKLSAgICAgICAgQ1BERl9PYmplY3QgKnBPYmogPSBtX3BhcnNlci5QYXJzZUluZGlyZWN0T2JqZWN0QXQoTlVMTCwgMCwgb2JqTnVtLCBOVUxMKTsKLSAgICAgICAgaWYgKCFwT2JqKSB7Ci0gICAgICAgICAgICBtX1BvcyArPSBtX3BhcnNlci5tX1N5bnRheC5TYXZlUG9zKCk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcE9iai0+R2V0RGljdCgpOwotICAgICAgICBDUERGX09iamVjdCAqcE5hbWUgPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJUeXBlIikpIDogTlVMTDsKLSAgICAgICAgaWYgKHBOYW1lICYmIHBOYW1lLT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKLSAgICAgICAgICAgIGlmIChwTmFtZS0+R2V0U3RyaW5nKCkgPT0gRlhfQlNUUkMoIlhSZWYiKSkgewotICAgICAgICAgICAgICAgIG1fUG9zICs9IG1fcGFyc2VyLm1fU3ludGF4LlNhdmVQb3MoKTsKLSAgICAgICAgICAgICAgICB4cmVmX29mZnNldCA9IHBPYmotPkdldERpY3QoKS0+R2V0SW50ZWdlcihGWF9CU1RSQygiUHJldiIpKTsKLSAgICAgICAgICAgICAgICBwT2JqLT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBPYmotPlJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcE9iai0+UmVsZWFzZSgpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHBIaW50cy0+QWRkU2VnbWVudChtX1BvcywgcmVxX3NpemUpOwotICAgIHJldHVybiAwOwotfQotaW5saW5lIHZvaWQgQ1BERl9EYXRhQXZhaWw6OlNldFN0YXJ0T2Zmc2V0KEZYX0ZJTEVTSVpFIGR3T2Zmc2V0KQotewotICAgIG1fUG9zID0gZHdPZmZzZXQ7Ci19Ci0jZGVmaW5lIE1BWF9XT1JEX0JVRkZFUiAyNTYKLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkdldE5leHRUb2tlbihDRlhfQnl0ZVN0cmluZyAmdG9rZW4pCi17Ci0gICAgbV9Xb3JkU2l6ZSA9IDA7Ci0gICAgRlhfQllURSBjaDsKLSAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX0JZVEUgdHlwZSA9IFBERl9DaGFyVHlwZVtjaF07Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgd2hpbGUgKHR5cGUgPT0gJ1cnKSB7Ci0gICAgICAgICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjaCAhPSAnJScpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjaCA9PSAnXHInIHx8IGNoID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKLSAgICB9Ci0gICAgaWYgKHR5cGUgPT0gJ0QnKSB7Ci0gICAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7Ci0gICAgICAgIGlmIChjaCA9PSAnLycpIHsKLSAgICAgICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSAnUicgJiYgdHlwZSAhPSAnTicpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9Qb3MgLS07Ci0gICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHJldChtX1dvcmRCdWZmZXIsIG1fV29yZFNpemUpOwotICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHJldDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtX1dvcmRTaXplIDwgTUFYX1dPUkRfQlVGRkVSKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fV29yZEJ1ZmZlclttX1dvcmRTaXplKytdID0gY2g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc8JykgewotICAgICAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2ggPT0gJzwnKSB7Ci0gICAgICAgICAgICAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9Qb3MgLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJz4nKSB7Ci0gICAgICAgICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjaCA9PSAnPicpIHsKLSAgICAgICAgICAgICAgICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZSsrXSA9IGNoOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX1BvcyAtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBDRlhfQnl0ZVN0cmluZyByZXQobV9Xb3JkQnVmZmVyLCBtX1dvcmRTaXplKTsKLSAgICAgICAgdG9rZW4gPSByZXQ7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAobV9Xb3JkU2l6ZSA8IE1BWF9XT1JEX0JVRkZFUikgewotICAgICAgICAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemUrK10gPSBjaDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIHR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwotICAgICAgICBpZiAodHlwZSA9PSAnRCcgfHwgdHlwZSA9PSAnVycpIHsKLSAgICAgICAgICAgIG1fUG9zIC0tOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgcmV0KG1fV29yZEJ1ZmZlciwgbV9Xb3JkU2l6ZSk7Ci0gICAgdG9rZW4gPSByZXQ7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpHZXROZXh0Q2hhcihGWF9CWVRFICZjaCkKLXsKLSAgICBGWF9GSUxFU0laRSBwb3MgPSBtX1BvczsKLSAgICBpZiAocG9zID49IG1fZHdGaWxlTGVuKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG1fYnVmZmVyT2Zmc2V0ID49IHBvcyB8fCAoRlhfRklMRVNJWkUpKG1fYnVmZmVyT2Zmc2V0ICsgbV9idWZmZXJTaXplKSA8PSBwb3MpIHsKLSAgICAgICAgRlhfRklMRVNJWkUgcmVhZF9wb3MgPSBwb3M7Ci0gICAgICAgIEZYX0RXT1JEIHJlYWRfc2l6ZSA9IDUxMjsKLSAgICAgICAgaWYgKChGWF9GSUxFU0laRSlyZWFkX3NpemUgPiBtX2R3RmlsZUxlbikgewotICAgICAgICAgICAgcmVhZF9zaXplID0gKEZYX0RXT1JEKW1fZHdGaWxlTGVuOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoRlhfRklMRVNJWkUpKHJlYWRfcG9zICsgcmVhZF9zaXplKSA+IG1fZHdGaWxlTGVuKSB7Ci0gICAgICAgICAgICByZWFkX3BvcyA9IG1fZHdGaWxlTGVuIC0gcmVhZF9zaXplOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbV9wRmlsZVJlYWQtPlJlYWRCbG9jayhtX2J1ZmZlckRhdGEsIHJlYWRfcG9zLCByZWFkX3NpemUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgbV9idWZmZXJPZmZzZXQgPSByZWFkX3BvczsKLSAgICAgICAgbV9idWZmZXJTaXplID0gcmVhZF9zaXplOwotICAgIH0KLSAgICBjaCA9IG1fYnVmZmVyRGF0YVtwb3MgLSBtX2J1ZmZlck9mZnNldF07Ci0gICAgbV9Qb3MgKys7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja0Nyb3NzUmVmSXRlbShJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKQotewotICAgIEZYX0lOVDMyIGlTaXplID0gMDsKLSAgICBDRlhfQnl0ZVN0cmluZyB0b2tlbjsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoIUdldE5leHRUb2tlbih0b2tlbikpIHsKLSAgICAgICAgICAgIGlTaXplID0gKEZYX0lOVDMyKShtX1BvcyArIDUxMiA+IG1fZHdGaWxlTGVuID8gbV9kd0ZpbGVMZW4gLSBtX1BvcyA6IDUxMik7Ci0gICAgICAgICAgICBwSGludHMtPkFkZFNlZ21lbnQobV9Qb3MsIGlTaXplKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAodG9rZW4gPT0gInRyYWlsZXIiKSB7Ci0gICAgICAgICAgICBtX2R3VHJhaWxlck9mZnNldCA9IG1fUG9zOwotICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1RSQUlMRVI7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLX0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrQWxsQ3Jvc3NSZWZTdHJlYW0oSUZYX0Rvd25sb2FkSGludHMgKnBIaW50cykKLXsKLSAgICBGWF9GSUxFU0laRSB4cmVmX29mZnNldCA9IDA7Ci0gICAgRlhfSU5UMzIgblJldCA9IENoZWNrQ3Jvc3NSZWZTdHJlYW0ocEhpbnRzLCB4cmVmX29mZnNldCk7Ci0gICAgaWYgKG5SZXQgPT0gMSkgewotICAgICAgICBpZiAoIXhyZWZfb2Zmc2V0KSB7Ci0gICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTENSU09TU1JFRjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fZHdDdXJyZW50WFJlZlN0ZWFtID0geHJlZl9vZmZzZXQ7Ci0gICAgICAgICAgICBtX1BvcyA9IHhyZWZfb2Zmc2V0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0gZWxzZSBpZiAoblJldCA9PSAtMSkgewotICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrQ3Jvc3NSZWYoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKLXsKLSAgICBGWF9JTlQzMiBpU2l6ZSA9IDA7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgdG9rZW47Ci0gICAgaWYgKCFHZXROZXh0VG9rZW4odG9rZW4pKSB7Ci0gICAgICAgIGlTaXplID0gKEZYX0lOVDMyKShtX1BvcyArIDUxMiA+IG1fZHdGaWxlTGVuID8gbV9kd0ZpbGVMZW4gLSBtX1BvcyA6IDUxMik7Ci0gICAgICAgIHBIaW50cy0+QWRkU2VnbWVudChtX1BvcywgaVNpemUpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmICh0b2tlbiA9PSAieHJlZiIpIHsKLSAgICAgICAgbV9Dcm9zc09mZnNldC5JbnNlcnRBdCgwLCBtX2R3WFJlZk9mZnNldCk7Ci0gICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICBpZiAoIUdldE5leHRUb2tlbih0b2tlbikpIHsKLSAgICAgICAgICAgICAgICBpU2l6ZSA9IChGWF9JTlQzMikobV9Qb3MgKyA1MTIgPiBtX2R3RmlsZUxlbiA/IG1fZHdGaWxlTGVuIC0gbV9Qb3MgOiA1MTIpOwotICAgICAgICAgICAgICAgIHBIaW50cy0+QWRkU2VnbWVudChtX1BvcywgaVNpemUpOwotICAgICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9DUk9TU1JFRl9JVEVNOwotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0b2tlbiA9PSAidHJhaWxlciIpIHsKLSAgICAgICAgICAgICAgICBtX2R3VHJhaWxlck9mZnNldCA9IG1fUG9zOwotICAgICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9UUkFJTEVSOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRklSU1RQQUdFOwogICAgIH0gZWxzZSB7CisgICAgICBpZiAobV9kb2NTdGF0dXMgPT0gUERGX0RBVEFBVkFJTF9FUlJPUikgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRU5EOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBwSGludHMtPkFkZFNlZ21lbnQoMCwgcmVxX3NpemUpOworICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja0ZpcnN0UGFnZShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BMaW5lYXJpemVkLT5HZXREaWN0KCk7CisgIENQREZfT2JqZWN0KiBwRW5kT2ZmU2V0ID0gcERpY3QgPyBwRGljdC0+R2V0RWxlbWVudCgiRSIpIDogTlVMTDsKKyAgaWYgKCFwRW5kT2ZmU2V0KSB7CisgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDUERGX09iamVjdCogcFhSZWZPZmZzZXQgPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50KCJUIikgOiBOVUxMOworICBpZiAoIXBYUmVmT2Zmc2V0KSB7CisgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDUERGX09iamVjdCogcEZpbGVMZW4gPSBwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50KCJMIikgOiBOVUxMOworICBpZiAoIXBGaWxlTGVuKSB7CisgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9CT09MIGJOZWVkRG93bkxvYWQgPSBGQUxTRTsKKyAgaWYgKHBFbmRPZmZTZXQtPklzTnVtYmVyKCkpIHsKKyAgICBGWF9EV09SRCBkd0VuZCA9IHBFbmRPZmZTZXQtPkdldEludGVnZXIoKTsKKyAgICBkd0VuZCArPSA1MTI7CisgICAgaWYgKChGWF9GSUxFU0laRSlkd0VuZCA+IG1fZHdGaWxlTGVuKSB7CisgICAgICBkd0VuZCA9IChGWF9EV09SRCltX2R3RmlsZUxlbjsKKyAgICB9CisgICAgaW50MzJfdCBpU3RhcnRQb3MgPSAoaW50MzJfdCkobV9kd0ZpbGVMZW4gPiAxMDI0ID8gMTAyNCA6IG1fZHdGaWxlTGVuKTsKKyAgICBpbnQzMl90IGlTaXplID0gZHdFbmQgPiAxMDI0ID8gZHdFbmQgLSAxMDI0IDogMDsKKyAgICBpZiAoIW1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwoaVN0YXJ0UG9zLCBpU2l6ZSkpIHsKKyAgICAgIHBIaW50cy0+QWRkU2VnbWVudChpU3RhcnRQb3MsIGlTaXplKTsKKyAgICAgIGJOZWVkRG93bkxvYWQgPSBUUlVFOworICAgIH0KKyAgfQorICBtX2R3TGFzdFhSZWZPZmZzZXQgPSAwOworICBGWF9GSUxFU0laRSBkd0ZpbGVMZW4gPSAwOworICBpZiAocFhSZWZPZmZzZXQtPklzTnVtYmVyKCkpCisgICAgbV9kd0xhc3RYUmVmT2Zmc2V0ID0gcFhSZWZPZmZzZXQtPkdldEludGVnZXIoKTsKKworICBpZiAocEZpbGVMZW4tPklzTnVtYmVyKCkpCisgICAgZHdGaWxlTGVuID0gcEZpbGVMZW4tPkdldEludGVnZXIoKTsKKworICBpZiAoIW1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwobV9kd0xhc3RYUmVmT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0RXT1JEKShkd0ZpbGVMZW4gLSBtX2R3TGFzdFhSZWZPZmZzZXQpKSkgeworICAgIGlmIChtX2RvY1N0YXR1cyA9PSBQREZfREFUQUFWQUlMX0ZJUlNUUEFHRSkgeworICAgICAgRlhfRFdPUkQgZHdTaXplID0gKEZYX0RXT1JEKShkd0ZpbGVMZW4gLSBtX2R3TGFzdFhSZWZPZmZzZXQpOworICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0gbV9kd0xhc3RYUmVmT2Zmc2V0OworICAgICAgaWYgKGR3U2l6ZSA8IDUxMiAmJiBkd0ZpbGVMZW4gPiA1MTIpIHsKKyAgICAgICAgZHdTaXplID0gNTEyOworICAgICAgICBvZmZzZXQgPSBkd0ZpbGVMZW4gLSA1MTI7CisgICAgICB9CisgICAgICBwSGludHMtPkFkZFNlZ21lbnQob2Zmc2V0LCBkd1NpemUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRklSU1RQQUdFX1BSRVBBUkU7CisgIH0KKyAgaWYgKGJOZWVkRG93bkxvYWQgfHwgbV9kb2NTdGF0dXMgIT0gUERGX0RBVEFBVkFJTF9GSVJTVFBBR0VfUFJFUEFSRSkgeworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9GSVJTVFBBR0VfUFJFUEFSRTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9kb2NTdGF0dXMgPQorICAgICAgbV9iU3VwcG9ydEhpbnRUYWJsZSA/IFBERl9EQVRBQVZBSUxfSElOVFRBQkxFIDogUERGX0RBVEFBVkFJTF9ET05FOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OklzRGF0YUF2YWlsKEZYX0ZJTEVTSVpFIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIGlmIChvZmZzZXQgPiBtX2R3RmlsZUxlbikKKyAgICByZXR1cm4gVFJVRTsKKyAgRlhfU0FGRV9EV09SRCBzYWZlU2l6ZSA9IHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PEZYX0RXT1JEPihvZmZzZXQpOworICBzYWZlU2l6ZSArPSBzaXplOworICBzYWZlU2l6ZSArPSA1MTI7CisgIGlmICghc2FmZVNpemUuSXNWYWxpZCgpIHx8IHNhZmVTaXplLlZhbHVlT3JEaWUoKSA+IG1fZHdGaWxlTGVuKQorICAgIHNpemUgPSBtX2R3RmlsZUxlbiAtIG9mZnNldDsKKyAgZWxzZQorICAgIHNpemUgKz0gNTEyOworICBpZiAoIW1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwob2Zmc2V0LCBzaXplKSkgeworICAgIHBIaW50cy0+QWRkU2VnbWVudChvZmZzZXQsIHNpemUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrSGludFRhYmxlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BMaW5lYXJpemVkLT5HZXREaWN0KCk7CisgIGlmICghcERpY3QpIHsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghcERpY3QtPktleUV4aXN0KCJIIikgfHwgIXBEaWN0LT5LZXlFeGlzdCgiTyIpIHx8ICFwRGljdC0+S2V5RXhpc3QoIk4iKSkgeworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW50IG5QYWdlQ291bnQgPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKCJOIiktPkdldEludGVnZXIoKTsKKyAgaWYgKG5QYWdlQ291bnQgPD0gMSkgeworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9ET05FOworICAgIHJldHVybiBUUlVFOworICB9CisgIENQREZfQXJyYXkqIHBIaW50U3RyZWFtUmFuZ2UgPSBwRGljdC0+R2V0QXJyYXkoIkgiKTsKKyAgRlhfRklMRVNJWkUgc3pIU1N0YXJ0ID0KKyAgICAgIHBIaW50U3RyZWFtUmFuZ2UtPkdldEVsZW1lbnRWYWx1ZSgwKQorICAgICAgICAgID8gcEhpbnRTdHJlYW1SYW5nZS0+R2V0RWxlbWVudFZhbHVlKDApLT5HZXRJbnRlZ2VyKCkKKyAgICAgICAgICA6IDA7CisgIEZYX0ZJTEVTSVpFIHN6SFNMZW5ndGggPQorICAgICAgcEhpbnRTdHJlYW1SYW5nZS0+R2V0RWxlbWVudFZhbHVlKDEpCisgICAgICAgICAgPyBwSGludFN0cmVhbVJhbmdlLT5HZXRFbGVtZW50VmFsdWUoMSktPkdldEludGVnZXIoKQorICAgICAgICAgIDogMDsKKyAgaWYgKHN6SFNTdGFydCA8IDAgfHwgc3pIU0xlbmd0aCA8PSAwKSB7CisgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoIUlzRGF0YUF2YWlsKHN6SFNTdGFydCwgc3pIU0xlbmd0aCwgcEhpbnRzKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX3N5bnRheFBhcnNlci5Jbml0UGFyc2VyKG1fcEZpbGVSZWFkLCBtX2R3SGVhZGVyT2Zmc2V0KTsKKyAgc3RkOjp1bmlxdWVfcHRyPENQREZfSGludFRhYmxlcz4gcEhpbnRUYWJsZXMoCisgICAgICBuZXcgQ1BERl9IaW50VGFibGVzKHRoaXMsIHBEaWN0KSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdCwgUmVsZWFzZURlbGV0ZXI8Q1BERl9PYmplY3Q+PiBwSGludFN0cmVhbSgKKyAgICAgIFBhcnNlSW5kaXJlY3RPYmplY3RBdChzekhTU3RhcnQsIDApKTsKKyAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBUb1N0cmVhbShwSGludFN0cmVhbS5nZXQoKSk7CisgIGlmIChwU3RyZWFtICYmIHBIaW50VGFibGVzLT5Mb2FkSGludFN0cmVhbShwU3RyZWFtKSkKKyAgICBtX3BIaW50VGFibGVzID0gc3RkOjptb3ZlKHBIaW50VGFibGVzKTsKKworICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRE9ORTsKKyAgcmV0dXJuIFRSVUU7Cit9CitDUERGX09iamVjdCogQ1BERl9EYXRhQXZhaWw6OlBhcnNlSW5kaXJlY3RPYmplY3RBdCgKKyAgICBGWF9GSUxFU0laRSBwb3MsCisgICAgRlhfRFdPUkQgb2JqbnVtLAorICAgIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIqIHBPYmpMaXN0KSB7CisgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9zeW50YXhQYXJzZXIuU2F2ZVBvcygpOworICBtX3N5bnRheFBhcnNlci5SZXN0b3JlUG9zKHBvcyk7CisgIGJvb2wgYklzTnVtYmVyOworICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gbV9zeW50YXhQYXJzZXIuR2V0TmV4dFdvcmQoJmJJc051bWJlcik7CisgIGlmICghYklzTnVtYmVyKQorICAgIHJldHVybiBudWxscHRyOworCisgIEZYX0RXT1JEIHBhcnNlcl9vYmpudW0gPSBGWFNZU19hdG9pKHdvcmQpOworICBpZiAob2JqbnVtICYmIHBhcnNlcl9vYmpudW0gIT0gb2JqbnVtKQorICAgIHJldHVybiBudWxscHRyOworCisgIHdvcmQgPSBtX3N5bnRheFBhcnNlci5HZXROZXh0V29yZCgmYklzTnVtYmVyKTsKKyAgaWYgKCFiSXNOdW1iZXIpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgRlhfRFdPUkQgZ2VubnVtID0gRlhTWVNfYXRvaSh3b3JkKTsKKyAgaWYgKG1fc3ludGF4UGFyc2VyLkdldEtleXdvcmQoKSAhPSAib2JqIikgeworICAgIG1fc3ludGF4UGFyc2VyLlJlc3RvcmVQb3MoU2F2ZWRQb3MpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIENQREZfT2JqZWN0KiBwT2JqID0KKyAgICAgIG1fc3ludGF4UGFyc2VyLkdldE9iamVjdChwT2JqTGlzdCwgcGFyc2VyX29iam51bSwgZ2VubnVtLCBudWxscHRyLCB0cnVlKTsKKyAgbV9zeW50YXhQYXJzZXIuUmVzdG9yZVBvcyhTYXZlZFBvcyk7CisgIHJldHVybiBwT2JqOworfQorSVBERl9EYXRhQXZhaWw6OkRvY0xpbmVhcml6YXRpb25TdGF0dXMgQ1BERl9EYXRhQXZhaWw6OklzTGluZWFyaXplZFBERigpIHsKKyAgRlhfRFdPUkQgcmVxX3NpemUgPSAxMDI0OworICBpZiAoIW1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwoMCwgcmVxX3NpemUpKSB7CisgICAgcmV0dXJuIExpbmVhcml6YXRpb25Vbmtub3duOworICB9CisgIGlmICghbV9wRmlsZVJlYWQpIHsKKyAgICByZXR1cm4gTm90TGluZWFyaXplZDsKKyAgfQorICBGWF9GSUxFU0laRSBkd1NpemUgPSBtX3BGaWxlUmVhZC0+R2V0U2l6ZSgpOworICBpZiAoZHdTaXplIDwgKEZYX0ZJTEVTSVpFKXJlcV9zaXplKSB7CisgICAgcmV0dXJuIExpbmVhcml6YXRpb25Vbmtub3duOworICB9CisgIHVpbnQ4X3QgYnVmZmVyWzEwMjRdOworICBtX3BGaWxlUmVhZC0+UmVhZEJsb2NrKGJ1ZmZlciwgMCwgcmVxX3NpemUpOworICBpZiAoSXNMaW5lYXJpemVkRmlsZShidWZmZXIsIHJlcV9zaXplKSkgeworICAgIHJldHVybiBMaW5lYXJpemVkOworICB9CisgIHJldHVybiBOb3RMaW5lYXJpemVkOworfQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6SXNMaW5lYXJpemVkRmlsZSh1aW50OF90KiBwRGF0YSwgRlhfRFdPUkQgZHdMZW4pIHsKKyAgU2NvcGVkRmlsZVN0cmVhbSBmaWxlKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShwRGF0YSwgKHNpemVfdClkd0xlbiwgRkFMU0UpKTsKKyAgaW50MzJfdCBvZmZzZXQgPSBHZXRIZWFkZXJPZmZzZXQoZmlsZS5nZXQoKSk7CisgIGlmIChvZmZzZXQgPT0gLTEpIHsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fZHdIZWFkZXJPZmZzZXQgPSBvZmZzZXQ7CisgIG1fc3ludGF4UGFyc2VyLkluaXRQYXJzZXIoZmlsZS5nZXQoKSwgb2Zmc2V0KTsKKyAgbV9zeW50YXhQYXJzZXIuUmVzdG9yZVBvcyhtX3N5bnRheFBhcnNlci5tX0hlYWRlck9mZnNldCArIDkpOworICBib29sIGJOdW1iZXI7CisgIENGWF9CeXRlU3RyaW5nIHdvcmRPYmpOdW0gPSBtX3N5bnRheFBhcnNlci5HZXROZXh0V29yZCgmYk51bWJlcik7CisgIGlmICghYk51bWJlcikKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgRlhfRFdPUkQgb2JqbnVtID0gRlhTWVNfYXRvaSh3b3JkT2JqTnVtKTsKKyAgaWYgKG1fcExpbmVhcml6ZWQpIHsKKyAgICBtX3BMaW5lYXJpemVkLT5SZWxlYXNlKCk7CisgICAgbV9wTGluZWFyaXplZCA9IE5VTEw7CisgIH0KKyAgbV9wTGluZWFyaXplZCA9CisgICAgICBQYXJzZUluZGlyZWN0T2JqZWN0QXQobV9zeW50YXhQYXJzZXIubV9IZWFkZXJPZmZzZXQgKyA5LCBvYmpudW0pOworICBpZiAoIW1fcExpbmVhcml6ZWQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wTGluZWFyaXplZC0+R2V0RGljdCgpOworICBpZiAocERpY3QgJiYgcERpY3QtPkdldEVsZW1lbnQoIkxpbmVhcml6ZWQiKSkgeworICAgIENQREZfT2JqZWN0KiBwTGVuID0gcERpY3QtPkdldEVsZW1lbnQoIkwiKTsKKyAgICBpZiAoIXBMZW4pIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKChGWF9GSUxFU0laRSlwTGVuLT5HZXRJbnRlZ2VyKCkgIT0gbV9wRmlsZVJlYWQtPkdldFNpemUoKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBtX2JMaW5lYXJpemVkID0gVFJVRTsKKworICAgIGlmIChDUERGX051bWJlciogcE5vID0gVG9OdW1iZXIocERpY3QtPkdldEVsZW1lbnQoIlAiKSkpCisgICAgICBtX2R3Rmlyc3RQYWdlTm8gPSBwTm8tPkdldEludGVnZXIoKTsKKworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKK30KK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrRW5kKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgRlhfRFdPUkQgcmVxX3BvcyA9IChGWF9EV09SRCkobV9kd0ZpbGVMZW4gPiAxMDI0ID8gbV9kd0ZpbGVMZW4gLSAxMDI0IDogMCk7CisgIEZYX0RXT1JEIGR3U2l6ZSA9IChGWF9EV09SRCkobV9kd0ZpbGVMZW4gLSByZXFfcG9zKTsKKyAgaWYgKG1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwocmVxX3BvcywgZHdTaXplKSkgeworICAgIHVpbnQ4X3QgYnVmZmVyWzEwMjRdOworICAgIG1fcEZpbGVSZWFkLT5SZWFkQmxvY2soYnVmZmVyLCByZXFfcG9zLCBkd1NpemUpOworICAgIFNjb3BlZEZpbGVTdHJlYW0gZmlsZShGWF9DcmVhdGVNZW1vcnlTdHJlYW0oYnVmZmVyLCAoc2l6ZV90KWR3U2l6ZSwgRkFMU0UpKTsKKyAgICBtX3N5bnRheFBhcnNlci5Jbml0UGFyc2VyKGZpbGUuZ2V0KCksIDApOworICAgIG1fc3ludGF4UGFyc2VyLlJlc3RvcmVQb3MoZHdTaXplIC0gMSk7CisgICAgaWYgKG1fc3ludGF4UGFyc2VyLlNlYXJjaFdvcmQoInN0YXJ0eHJlZiIsIFRSVUUsIEZBTFNFLCBkd1NpemUpKSB7CisgICAgICBtX3N5bnRheFBhcnNlci5HZXROZXh0V29yZChudWxscHRyKTsKKyAgICAgIGJvb2wgYk51bWJlcjsKKyAgICAgIENGWF9CeXRlU3RyaW5nIHhyZWZwb3Nfc3RyID0gbV9zeW50YXhQYXJzZXIuR2V0TmV4dFdvcmQoJmJOdW1iZXIpOworICAgICAgaWYgKCFiTnVtYmVyKSB7CisgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgbV9kd1hSZWZPZmZzZXQgPSAoRlhfRklMRVNJWkUpRlhTWVNfYXRvaTY0KHhyZWZwb3Nfc3RyKTsKKyAgICAgIGlmICghbV9kd1hSZWZPZmZzZXQgfHwgbV9kd1hSZWZPZmZzZXQgPiBtX2R3RmlsZUxlbikgewogICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7CiAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQorICAgICAgbV9kd0xhc3RYUmVmT2Zmc2V0ID0gbV9kd1hSZWZPZmZzZXQ7CisgICAgICBTZXRTdGFydE9mZnNldChtX2R3WFJlZk9mZnNldCk7CisgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfQ1JPU1NSRUY7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBwSGludHMtPkFkZFNlZ21lbnQocmVxX3BvcywgZHdTaXplKTsKKyAgcmV0dXJuIEZBTFNFOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tUcmFpbGVyQXBwZW5kKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCi17Ci0gICAgaWYgKG1fUG9zIDwgbV9kd0ZpbGVMZW4pIHsKLSAgICAgICAgRlhfRklMRVNJWkUgZHdBcHBlbmRQb3MgPSBtX1BvcyArIG1fc3ludGF4UGFyc2VyLlNhdmVQb3MoKTsKLSAgICAgICAgRlhfSU5UMzIgaVNpemUgPSAoRlhfSU5UMzIpKGR3QXBwZW5kUG9zICsgNTEyID4gbV9kd0ZpbGVMZW4gPyBtX2R3RmlsZUxlbiAtIGR3QXBwZW5kUG9zIDogNTEyKTsKLSAgICAgICAgaWYgKCFtX3BGaWxlQXZhaWwtPklzRGF0YUF2YWlsKGR3QXBwZW5kUG9zLCBpU2l6ZSkpIHsKLSAgICAgICAgICAgIHBIaW50cy0+QWRkU2VnbWVudChkd0FwcGVuZFBvcywgaVNpemUpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9CitpbnQzMl90IENQREZfRGF0YUF2YWlsOjpDaGVja0Nyb3NzUmVmU3RyZWFtKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFJiB4cmVmX29mZnNldCkgeworICB4cmVmX29mZnNldCA9IDA7CisgIEZYX0RXT1JEIHJlcV9zaXplID0KKyAgICAgIChGWF9EV09SRCkobV9Qb3MgKyA1MTIgPiBtX2R3RmlsZUxlbiA/IG1fZHdGaWxlTGVuIC0gbV9Qb3MgOiA1MTIpOworICBpZiAobV9wRmlsZUF2YWlsLT5Jc0RhdGFBdmFpbChtX1BvcywgcmVxX3NpemUpKSB7CisgICAgaW50MzJfdCBpU2l6ZSA9IChpbnQzMl90KShtX1BvcyArIHJlcV9zaXplIC0gbV9kd0N1cnJlbnRYUmVmU3RlYW0pOworICAgIENGWF9CaW5hcnlCdWYgYnVmKGlTaXplKTsKKyAgICB1aW50OF90KiBwQnVmID0gYnVmLkdldEJ1ZmZlcigpOworICAgIG1fcEZpbGVSZWFkLT5SZWFkQmxvY2socEJ1ZiwgbV9kd0N1cnJlbnRYUmVmU3RlYW0sIGlTaXplKTsKKyAgICBTY29wZWRGaWxlU3RyZWFtIGZpbGUoRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKHBCdWYsIChzaXplX3QpaVNpemUsIEZBTFNFKSk7CisgICAgbV9wYXJzZXIubV9TeW50YXguSW5pdFBhcnNlcihmaWxlLmdldCgpLCAwKTsKKyAgICBib29sIGJOdW1iZXI7CisgICAgQ0ZYX0J5dGVTdHJpbmcgb2JqbnVtID0gbV9wYXJzZXIubV9TeW50YXguR2V0TmV4dFdvcmQoJmJOdW1iZXIpOworICAgIGlmICghYk51bWJlcikKKyAgICAgIHJldHVybiAtMTsKKworICAgIEZYX0RXT1JEIG9iak51bSA9IEZYU1lTX2F0b2kob2JqbnVtKTsKKyAgICBDUERGX09iamVjdCogcE9iaiA9IG1fcGFyc2VyLlBhcnNlSW5kaXJlY3RPYmplY3RBdChOVUxMLCAwLCBvYmpOdW0sIE5VTEwpOworICAgIGlmICghcE9iaikgeworICAgICAgbV9Qb3MgKz0gbV9wYXJzZXIubV9TeW50YXguU2F2ZVBvcygpOworICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIGlmIChtX2R3UHJldlhSZWZPZmZzZXQpIHsKLSAgICAgICAgU2V0U3RhcnRPZmZzZXQobV9kd1ByZXZYUmVmT2Zmc2V0KTsKLSAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0NST1NTUkVGOworICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwT2JqLT5HZXREaWN0KCk7CisgICAgQ1BERl9OYW1lKiBwTmFtZSA9IFRvTmFtZShwRGljdCA/IHBEaWN0LT5HZXRFbGVtZW50KCJUeXBlIikgOiBudWxscHRyKTsKKyAgICBpZiAocE5hbWUpIHsKKyAgICAgIGlmIChwTmFtZS0+R2V0U3RyaW5nKCkgPT0gIlhSZWYiKSB7CisgICAgICAgIG1fUG9zICs9IG1fcGFyc2VyLm1fU3ludGF4LlNhdmVQb3MoKTsKKyAgICAgICAgeHJlZl9vZmZzZXQgPSBwT2JqLT5HZXREaWN0KCktPkdldEludGVnZXIoIlByZXYiKTsKKyAgICAgICAgcE9iai0+UmVsZWFzZSgpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9CisgICAgcE9iai0+UmVsZWFzZSgpOworICAgIHJldHVybiAtMTsKKyAgfQorICBwSGludHMtPkFkZFNlZ21lbnQobV9Qb3MsIHJlcV9zaXplKTsKKyAgcmV0dXJuIDA7Cit9CitpbmxpbmUgdm9pZCBDUERGX0RhdGFBdmFpbDo6U2V0U3RhcnRPZmZzZXQoRlhfRklMRVNJWkUgZHdPZmZzZXQpIHsKKyAgbV9Qb3MgPSBkd09mZnNldDsKK30KKworRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6R2V0TmV4dFRva2VuKENGWF9CeXRlU3RyaW5nJiB0b2tlbikgeworICB1aW50OF90IGNoOworICBpZiAoIUdldE5leHRDaGFyKGNoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgd2hpbGUgKDEpIHsKKyAgICB3aGlsZSAoUERGQ2hhcklzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgIGlmICghR2V0TmV4dENoYXIoY2gpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKGNoICE9ICclJykKKyAgICAgIGJyZWFrOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgIGlmICghR2V0TmV4dENoYXIoY2gpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBpZiAoUERGQ2hhcklzTGluZUVuZGluZyhjaCkpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHVpbnQ4X3QgYnVmZmVyWzI1Nl07CisgIEZYX0RXT1JEIGluZGV4ID0gMDsKKyAgaWYgKFBERkNoYXJJc0RlbGltaXRlcihjaCkpIHsKKyAgICBidWZmZXJbaW5kZXgrK10gPSBjaDsKKyAgICBpZiAoY2ggPT0gJy8nKSB7CisgICAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgaWYgKCFQREZDaGFySXNPdGhlcihjaCkgJiYgIVBERkNoYXJJc051bWVyaWMoY2gpKSB7CisgICAgICAgICAgbV9Qb3MtLTsKKyAgICAgICAgICBDRlhfQnl0ZVN0cmluZyByZXQoYnVmZmVyLCBpbmRleCk7CisgICAgICAgICAgdG9rZW4gPSByZXQ7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5kZXggPCBzaXplb2YoYnVmZmVyKSkKKyAgICAgICAgICBidWZmZXJbaW5kZXgrK10gPSBjaDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNoID09ICc8JykgeworICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgaWYgKGNoID09ICc8JykKKyAgICAgICAgYnVmZmVyW2luZGV4KytdID0gY2g7CisgICAgICBlbHNlCisgICAgICAgIG1fUG9zLS07CisgICAgfSBlbHNlIGlmIChjaCA9PSAnPicpIHsKKyAgICAgIGlmICghR2V0TmV4dENoYXIoY2gpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmIChjaCA9PSAnPicpCisgICAgICAgIGJ1ZmZlcltpbmRleCsrXSA9IGNoOworICAgICAgZWxzZQorICAgICAgICBtX1Bvcy0tOworICAgIH0KKworICAgIENGWF9CeXRlU3RyaW5nIHJldChidWZmZXIsIGluZGV4KTsKKyAgICB0b2tlbiA9IHJldDsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHdoaWxlICgxKSB7CisgICAgaWYgKGluZGV4IDwgc2l6ZW9mKGJ1ZmZlcikpCisgICAgICBidWZmZXJbaW5kZXgrK10gPSBjaDsKKworICAgIGlmICghR2V0TmV4dENoYXIoY2gpKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKFBERkNoYXJJc0RlbGltaXRlcihjaCkgfHwgUERGQ2hhcklzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgIG1fUG9zLS07CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICB0b2tlbiA9IENGWF9CeXRlU3RyaW5nKGJ1ZmZlciwgaW5kZXgpOworICByZXR1cm4gVFJVRTsKK30KKworRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6R2V0TmV4dENoYXIodWludDhfdCYgY2gpIHsKKyAgRlhfRklMRVNJWkUgcG9zID0gbV9Qb3M7CisgIGlmIChwb3MgPj0gbV9kd0ZpbGVMZW4pIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fYnVmZmVyT2Zmc2V0ID49IHBvcyB8fAorICAgICAgKEZYX0ZJTEVTSVpFKShtX2J1ZmZlck9mZnNldCArIG1fYnVmZmVyU2l6ZSkgPD0gcG9zKSB7CisgICAgRlhfRklMRVNJWkUgcmVhZF9wb3MgPSBwb3M7CisgICAgRlhfRFdPUkQgcmVhZF9zaXplID0gNTEyOworICAgIGlmICgoRlhfRklMRVNJWkUpcmVhZF9zaXplID4gbV9kd0ZpbGVMZW4pIHsKKyAgICAgIHJlYWRfc2l6ZSA9IChGWF9EV09SRCltX2R3RmlsZUxlbjsKKyAgICB9CisgICAgaWYgKChGWF9GSUxFU0laRSkocmVhZF9wb3MgKyByZWFkX3NpemUpID4gbV9kd0ZpbGVMZW4pIHsKKyAgICAgIHJlYWRfcG9zID0gbV9kd0ZpbGVMZW4gLSByZWFkX3NpemU7CisgICAgfQorICAgIGlmICghbV9wRmlsZVJlYWQtPlJlYWRCbG9jayhtX2J1ZmZlckRhdGEsIHJlYWRfcG9zLCByZWFkX3NpemUpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIG1fYnVmZmVyT2Zmc2V0ID0gcmVhZF9wb3M7CisgICAgbV9idWZmZXJTaXplID0gcmVhZF9zaXplOworICB9CisgIGNoID0gbV9idWZmZXJEYXRhW3BvcyAtIG1fYnVmZmVyT2Zmc2V0XTsKKyAgbV9Qb3MrKzsKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja0Nyb3NzUmVmSXRlbShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIGludDMyX3QgaVNpemUgPSAwOworICBDRlhfQnl0ZVN0cmluZyB0b2tlbjsKKyAgd2hpbGUgKDEpIHsKKyAgICBpZiAoIUdldE5leHRUb2tlbih0b2tlbikpIHsKKyAgICAgIGlTaXplID0gKGludDMyX3QpKG1fUG9zICsgNTEyID4gbV9kd0ZpbGVMZW4gPyBtX2R3RmlsZUxlbiAtIG1fUG9zIDogNTEyKTsKKyAgICAgIHBIaW50cy0+QWRkU2VnbWVudChtX1BvcywgaVNpemUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZiAodG9rZW4gPT0gInRyYWlsZXIiKSB7CisgICAgICBtX2R3VHJhaWxlck9mZnNldCA9IG1fUG9zOworICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1RSQUlMRVI7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KK30KK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrQWxsQ3Jvc3NSZWZTdHJlYW0oSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgeworICBGWF9GSUxFU0laRSB4cmVmX29mZnNldCA9IDA7CisgIGludDMyX3QgblJldCA9IENoZWNrQ3Jvc3NSZWZTdHJlYW0ocEhpbnRzLCB4cmVmX29mZnNldCk7CisgIGlmIChuUmV0ID09IDEpIHsKKyAgICBpZiAoIXhyZWZfb2Zmc2V0KSB7CisgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTENST1NTUkVGOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMQ1JTT1NTUkVGOworICAgICAgbV9kd0N1cnJlbnRYUmVmU3RlYW0gPSB4cmVmX29mZnNldDsKKyAgICAgIG1fUG9zID0geHJlZl9vZmZzZXQ7CiAgICAgfQogICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChuUmV0ID09IC0xKSB7CisgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrVHJhaWxlcihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQotewotICAgIEZYX0lOVDMyIGlUcmFpbGVyU2l6ZSA9IChGWF9JTlQzMikobV9Qb3MgKyA1MTIgPiBtX2R3RmlsZUxlbiA/IG1fZHdGaWxlTGVuIC0gbV9Qb3MgOiA1MTIpOwotICAgIGlmIChtX3BGaWxlQXZhaWwtPklzRGF0YUF2YWlsKG1fUG9zLCBpVHJhaWxlclNpemUpKSB7Ci0gICAgICAgIEZYX0lOVDMyIGlTaXplID0gKEZYX0lOVDMyKShtX1BvcyArIGlUcmFpbGVyU2l6ZSAtIG1fZHdUcmFpbGVyT2Zmc2V0KTsKLSAgICAgICAgQ0ZYX0JpbmFyeUJ1ZiBidWYoaVNpemUpOwotICAgICAgICBGWF9MUEJZVEUgcEJ1ZiA9IGJ1Zi5HZXRCdWZmZXIoKTsKLSAgICAgICAgaWYgKCFwQnVmKSB7Ci0gICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtX3BGaWxlUmVhZC0+UmVhZEJsb2NrKHBCdWYsIG1fZHdUcmFpbGVyT2Zmc2V0LCBpU2l6ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBDRlhfU21hcnRQb2ludGVyPElGWF9GaWxlU3RyZWFtPiBmaWxlKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShwQnVmLCAoc2l6ZV90KWlTaXplLCBGQUxTRSkpOwotICAgICAgICBtX3N5bnRheFBhcnNlci5Jbml0UGFyc2VyKGZpbGUuR2V0KCksIDApOwotICAgICAgICBDUERGX09iamVjdCAqcFRyYWlsZXIgPSBtX3N5bnRheFBhcnNlci5HZXRPYmplY3QoTlVMTCwgMCwgMCwgMCk7Ci0gICAgICAgIGlmICghcFRyYWlsZXIpIHsKLSAgICAgICAgICAgIG1fUG9zICs9IG1fc3ludGF4UGFyc2VyLlNhdmVQb3MoKTsKLSAgICAgICAgICAgIHBIaW50cy0+QWRkU2VnbWVudChtX1BvcywgaVRyYWlsZXJTaXplKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAocFRyYWlsZXItPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSAqcFRyYWlsZXJEaWN0ID0gcFRyYWlsZXItPkdldERpY3QoKTsKLSAgICAgICAgaWYgKHBUcmFpbGVyRGljdCkgewotICAgICAgICAgICAgQ1BERl9PYmplY3QgKnBFbmNyeXB0ID0gcFRyYWlsZXJEaWN0LT5HZXRFbGVtZW50KCJFbmNyeXB0Iik7Ci0gICAgICAgICAgICBpZiAocEVuY3J5cHQgJiYgcEVuY3J5cHQtPkdldFR5cGUoKSA9PSBQREZPQkpfUkVGRVJFTkNFKSB7Ci0gICAgICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOwotICAgICAgICAgICAgICAgIHBUcmFpbGVyLT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRFdPUkQgeHJlZnBvcyA9IEdldERpcmVjdEludGVnZXIocFRyYWlsZXItPkdldERpY3QoKSwgRlhfQlNUUkMoIlByZXYiKSk7Ci0gICAgICAgIGlmICh4cmVmcG9zKSB7Ci0gICAgICAgICAgICBtX2R3UHJldlhSZWZPZmZzZXQgPSBHZXREaXJlY3RJbnRlZ2VyKHBUcmFpbGVyLT5HZXREaWN0KCksIEZYX0JTVFJDKCJYUmVmU3RtIikpOwotICAgICAgICAgICAgcFRyYWlsZXItPlJlbGVhc2UoKTsKLSAgICAgICAgICAgIGlmIChtX2R3UHJldlhSZWZPZmZzZXQpIHsKLSAgICAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fZHdQcmV2WFJlZk9mZnNldCA9IHhyZWZwb3M7Ci0gICAgICAgICAgICAgICAgaWYgKG1fZHdQcmV2WFJlZk9mZnNldCA+PSBtX2R3RmlsZUxlbikgewotICAgICAgICAgICAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU2V0U3RhcnRPZmZzZXQobV9kd1ByZXZYUmVmT2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1RSQUlMRVJfQVBQRU5EOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOworRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tDcm9zc1JlZihJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIGludDMyX3QgaVNpemUgPSAwOworICBDRlhfQnl0ZVN0cmluZyB0b2tlbjsKKyAgaWYgKCFHZXROZXh0VG9rZW4odG9rZW4pKSB7CisgICAgaVNpemUgPSAoaW50MzJfdCkobV9Qb3MgKyA1MTIgPiBtX2R3RmlsZUxlbiA/IG1fZHdGaWxlTGVuIC0gbV9Qb3MgOiA1MTIpOworICAgIHBIaW50cy0+QWRkU2VnbWVudChtX1BvcywgaVNpemUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAodG9rZW4gPT0gInhyZWYiKSB7CisgICAgbV9Dcm9zc09mZnNldC5JbnNlcnRBdCgwLCBtX2R3WFJlZk9mZnNldCk7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgIGlmICghR2V0TmV4dFRva2VuKHRva2VuKSkgeworICAgICAgICBpU2l6ZSA9CisgICAgICAgICAgICAoaW50MzJfdCkobV9Qb3MgKyA1MTIgPiBtX2R3RmlsZUxlbiA/IG1fZHdGaWxlTGVuIC0gbV9Qb3MgOiA1MTIpOworICAgICAgICBwSGludHMtPkFkZFNlZ21lbnQobV9Qb3MsIGlTaXplKTsKKyAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0NST1NTUkVGX0lURU07CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGlmICh0b2tlbiA9PSAidHJhaWxlciIpIHsKKyAgICAgICAgbV9kd1RyYWlsZXJPZmZzZXQgPSBtX1BvczsKKyAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1RSQUlMRVI7CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tUcmFpbGVyQXBwZW5kKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgaWYgKG1fUG9zIDwgbV9kd0ZpbGVMZW4pIHsKKyAgICBGWF9GSUxFU0laRSBkd0FwcGVuZFBvcyA9IG1fUG9zICsgbV9zeW50YXhQYXJzZXIuU2F2ZVBvcygpOworICAgIGludDMyX3QgaVNpemUgPSAoaW50MzJfdCkoCisgICAgICAgIGR3QXBwZW5kUG9zICsgNTEyID4gbV9kd0ZpbGVMZW4gPyBtX2R3RmlsZUxlbiAtIGR3QXBwZW5kUG9zIDogNTEyKTsKKyAgICBpZiAoIW1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwoZHdBcHBlbmRQb3MsIGlTaXplKSkgeworICAgICAgcEhpbnRzLT5BZGRTZWdtZW50KGR3QXBwZW5kUG9zLCBpU2l6ZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CisgIGlmIChtX2R3UHJldlhSZWZPZmZzZXQpIHsKKyAgICBTZXRTdGFydE9mZnNldChtX2R3UHJldlhSZWZPZmZzZXQpOworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9DUk9TU1JFRjsKKyAgfSBlbHNlIHsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTENST1NTUkVGOworICB9CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1RyYWlsZXIoSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgeworICBpbnQzMl90IGlUcmFpbGVyU2l6ZSA9CisgICAgICAoaW50MzJfdCkobV9Qb3MgKyA1MTIgPiBtX2R3RmlsZUxlbiA/IG1fZHdGaWxlTGVuIC0gbV9Qb3MgOiA1MTIpOworICBpZiAobV9wRmlsZUF2YWlsLT5Jc0RhdGFBdmFpbChtX1BvcywgaVRyYWlsZXJTaXplKSkgeworICAgIGludDMyX3QgaVNpemUgPSAoaW50MzJfdCkobV9Qb3MgKyBpVHJhaWxlclNpemUgLSBtX2R3VHJhaWxlck9mZnNldCk7CisgICAgQ0ZYX0JpbmFyeUJ1ZiBidWYoaVNpemUpOworICAgIHVpbnQ4X3QqIHBCdWYgPSBidWYuR2V0QnVmZmVyKCk7CisgICAgaWYgKCFwQnVmKSB7CisgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGlmICghbV9wRmlsZVJlYWQtPlJlYWRCbG9jayhwQnVmLCBtX2R3VHJhaWxlck9mZnNldCwgaVNpemUpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIFNjb3BlZEZpbGVTdHJlYW0gZmlsZShGWF9DcmVhdGVNZW1vcnlTdHJlYW0ocEJ1ZiwgKHNpemVfdClpU2l6ZSwgRkFMU0UpKTsKKyAgICBtX3N5bnRheFBhcnNlci5Jbml0UGFyc2VyKGZpbGUuZ2V0KCksIDApOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdCwgUmVsZWFzZURlbGV0ZXI8Q1BERl9PYmplY3Q+PiBwVHJhaWxlcigKKyAgICAgICAgbV9zeW50YXhQYXJzZXIuR2V0T2JqZWN0KG51bGxwdHIsIDAsIDAsIG51bGxwdHIsIHRydWUpKTsKKyAgICBpZiAoIXBUcmFpbGVyKSB7CisgICAgICBtX1BvcyArPSBtX3N5bnRheFBhcnNlci5TYXZlUG9zKCk7CisgICAgICBwSGludHMtPkFkZFNlZ21lbnQobV9Qb3MsIGlUcmFpbGVyU2l6ZSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGlmICghcFRyYWlsZXItPklzRGljdGlvbmFyeSgpKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwVHJhaWxlckRpY3QgPSBwVHJhaWxlci0+R2V0RGljdCgpOworICAgIENQREZfT2JqZWN0KiBwRW5jcnlwdCA9IHBUcmFpbGVyRGljdC0+R2V0RWxlbWVudCgiRW5jcnlwdCIpOworICAgIGlmIChUb1JlZmVyZW5jZShwRW5jcnlwdCkpIHsKKyAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIEZYX0RXT1JEIHhyZWZwb3MgPSBHZXREaXJlY3RJbnRlZ2VyKHBUcmFpbGVyRGljdCwgIlByZXYiKTsKKyAgICBpZiAoeHJlZnBvcykgeworICAgICAgbV9kd1ByZXZYUmVmT2Zmc2V0ID0gR2V0RGlyZWN0SW50ZWdlcihwVHJhaWxlckRpY3QsICJYUmVmU3RtIik7CisgICAgICBpZiAobV9kd1ByZXZYUmVmT2Zmc2V0KSB7CisgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fZHdQcmV2WFJlZk9mZnNldCA9IHhyZWZwb3M7CisgICAgICAgIGlmIChtX2R3UHJldlhSZWZPZmZzZXQgPj0gbV9kd0ZpbGVMZW4pIHsKKyAgICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX2R3UHJldlhSZWZPZmZzZXQgPSAwOwotICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1RSQUlMRVJfQVBQRU5EOwotICAgICAgICAgICAgcFRyYWlsZXItPlJlbGVhc2UoKTsKKyAgICAgICAgICBTZXRTdGFydE9mZnNldChtX2R3UHJldlhSZWZPZmZzZXQpOworICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9UUkFJTEVSX0FQUEVORDsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICBwSGludHMtPkFkZFNlZ21lbnQobV9Qb3MsIGlUcmFpbGVyU2l6ZSk7Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlKEZYX0lOVDMyIGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQotewotICAgIHdoaWxlIChUUlVFKSB7Ci0gICAgICAgIHN3aXRjaCAobV9kb2NTdGF0dXMpIHsKLSAgICAgICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9QQUdFVFJFRToKLSAgICAgICAgICAgICAgICBpZiAoIUxvYWREb2NQYWdlcyhwSGludHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfUEFHRToKLSAgICAgICAgICAgICAgICBpZiAoIUxvYWREb2NQYWdlKGlQYWdlLCBwSGludHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfRVJST1I6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIExvYWRBbGxGaWxlKHBIaW50cyk7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIG1fYlBhZ2VzVHJlZUxvYWQgPSBUUlVFOwotICAgICAgICAgICAgICAgIG1fYlBhZ2VzTG9hZCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgbV9iQ3VyUGFnZURpY3RMb2FkT0sgPSBUUlVFOwotICAgICAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9QQUdFOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQotfQotRlhfQk9PTAlDUERGX0RhdGFBdmFpbDo6Q2hlY2tBcnJheVBhZ2VOb2RlKEZYX0RXT1JEIGR3UGFnZU5vLCBDUERGX1BhZ2VOb2RlICpwUGFnZU5vZGUsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCi17Ci0gICAgRlhfQk9PTCBiRXhpc3QgPSBGQUxTRTsKLSAgICBDUERGX09iamVjdCAqcFBhZ2VzID0gR2V0T2JqZWN0KGR3UGFnZU5vLCBwSGludHMsICZiRXhpc3QpOwotICAgIGlmICghYkV4aXN0KSB7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoIXBQYWdlcykgewotICAgICAgICBpZiAobV9kb2NTdGF0dXMgPT0gUERGX0RBVEFBVkFJTF9FUlJPUikgewotICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKHBQYWdlcy0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewotICAgICAgICBwUGFnZXMtPlJlbGVhc2UoKTsKLSAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHBQYWdlTm9kZS0+bV90eXBlID0gUERGX1BBR0VOT0RFX1BBR0VTOwotICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwUGFnZXM7Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBBcnJheS0+R2V0Q291bnQoKTsgKytpKSB7Ci0gICAgICAgIENQREZfT2JqZWN0ICpwS2lkID0gKENQREZfT2JqZWN0ICopcEFycmF5LT5HZXRFbGVtZW50KGkpOwotICAgICAgICBpZiAoIXBLaWQgfHwgcEtpZC0+R2V0VHlwZSgpICE9IFBERk9CSl9SRUZFUkVOQ0UpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIENQREZfUGFnZU5vZGUgKnBOb2RlID0gbmV3IENQREZfUGFnZU5vZGUoKTsKLSAgICAgICAgcFBhZ2VOb2RlLT5tX2NoaWxkTm9kZS5BZGQocE5vZGUpOwotICAgICAgICBwTm9kZS0+bV9kd1BhZ2VObyA9ICgoQ1BERl9SZWZlcmVuY2UqKXBLaWQpLT5HZXRSZWZPYmpOdW0oKTsKLSAgICB9Ci0gICAgcFBhZ2VzLT5SZWxlYXNlKCk7CisgICAgbV9kd1ByZXZYUmVmT2Zmc2V0ID0gMDsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfVFJBSUxFUl9BUFBFTkQ7CiAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcEhpbnRzLT5BZGRTZWdtZW50KG1fUG9zLCBpVHJhaWxlclNpemUpOworICByZXR1cm4gRkFMU0U7CiB9Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1Vua293blBhZ2VOb2RlKEZYX0RXT1JEIGR3UGFnZU5vLCBDUERGX1BhZ2VOb2RlICpwUGFnZU5vZGUsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCi17Ci0gICAgRlhfQk9PTCBiRXhpc3QgPSBGQUxTRTsKLSAgICBDUERGX09iamVjdCAqcFBhZ2UgPSBHZXRPYmplY3QoZHdQYWdlTm8sIHBIaW50cywgJmJFeGlzdCk7Ci0gICAgaWYgKCFiRXhpc3QpIHsKLSAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmICghcFBhZ2UpIHsKLSAgICAgICAgaWYgKG1fZG9jU3RhdHVzID09IFBERl9EQVRBQVZBSUxfRVJST1IpIHsKLSAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlKGludDMyX3QgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgd2hpbGUgKFRSVUUpIHsKKyAgICBzd2l0Y2ggKG1fZG9jU3RhdHVzKSB7CisgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfUEFHRVRSRUU6CisgICAgICAgIGlmICghTG9hZERvY1BhZ2VzKHBIaW50cykpIHsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAocFBhZ2UtPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgcFBhZ2VOb2RlLT5tX2R3UGFnZU5vID0gZHdQYWdlTm87Ci0gICAgICAgIHBQYWdlTm9kZS0+bV90eXBlID0gUERGX1BBR0VOT0RFX0FSUkFZOwotICAgICAgICBwUGFnZS0+UmVsZWFzZSgpOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKHBQYWdlLT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgcFBhZ2UtPlJlbGVhc2UoKTsKLSAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHBQYWdlTm9kZS0+bV9kd1BhZ2VObyA9IGR3UGFnZU5vOwotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwUGFnZS0+R2V0RGljdCgpOwotICAgIENGWF9CeXRlU3RyaW5nIHR5cGUgPSBwRGljdCA/IHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlR5cGUiKSkgOiBDRlhfQnl0ZVN0cmluZygpOwotICAgIGlmICh0eXBlID09IEZYX0JTVFJDKCJQYWdlcyIpKSB7Ci0gICAgICAgIHBQYWdlTm9kZS0+bV90eXBlID0gUERGX1BBR0VOT0RFX1BBR0VTOwotICAgICAgICBDUERGX09iamVjdCAqcEtpZHMgPSBwRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiS2lkcyIpKTsKLSAgICAgICAgaWYgKCFwS2lkcykgewotICAgICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0U7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBERl9EQVRBQVZBSUxfUEFHRToKKyAgICAgICAgaWYgKCFMb2FkRG9jUGFnZShpUGFnZSwgcEhpbnRzKSkgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKHBLaWRzLT5HZXRUeXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgUERGT0JKX1JFRkVSRU5DRTogewotICAgICAgICAgICAgICAgICAgICBDUERGX1JlZmVyZW5jZSAqcEtpZCA9IChDUERGX1JlZmVyZW5jZSAqKXBLaWRzOwotICAgICAgICAgICAgICAgICAgICBDUERGX1BhZ2VOb2RlICpwTm9kZSA9IG5ldyBDUERGX1BhZ2VOb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHBQYWdlTm9kZS0+bV9jaGlsZE5vZGUuQWRkKHBOb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgcE5vZGUtPm1fZHdQYWdlTm8gPSBwS2lkLT5HZXRSZWZPYmpOdW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBERk9CSl9BUlJBWTogewotICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5ICpwS2lkc0FycmF5ID0gKENQREZfQXJyYXkgKilwS2lkczsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBLaWRzQXJyYXktPkdldENvdW50KCk7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QgKnBLaWQgPSAoQ1BERl9PYmplY3QgKilwS2lkc0FycmF5LT5HZXRFbGVtZW50KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwS2lkIHx8IHBLaWQtPkdldFR5cGUoKSAhPSBQREZPQkpfUkVGRVJFTkNFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BhZ2VOb2RlICpwTm9kZSA9IG5ldyBDUERGX1BhZ2VOb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUGFnZU5vZGUtPm1fY2hpbGROb2RlLkFkZChwTm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwTm9kZS0+bV9kd1BhZ2VObyA9ICgoQ1BERl9SZWZlcmVuY2UqKXBLaWQpLT5HZXRSZWZPYmpOdW0oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gRlhfQlNUUkMoIlBhZ2UiKSkgewotICAgICAgICBwUGFnZU5vZGUtPm1fdHlwZSA9IFBERl9QQUdFTk9ERV9QQUdFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBQYWdlLT5SZWxlYXNlKCk7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBwUGFnZS0+UmVsZWFzZSgpOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlTm9kZShDUERGX1BhZ2VOb2RlICZwYWdlTm9kZXMsIEZYX0lOVDMyIGlQYWdlLCBGWF9JTlQzMiAmaUNvdW50LCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQotewotICAgIEZYX0lOVDMyIGlTaXplID0gcGFnZU5vZGVzLm1fY2hpbGROb2RlLkdldFNpemUoKTsKLSAgICBpZiAoaVNpemUgPD0gMCB8fCBpUGFnZSA+PSBpU2l6ZSkgewotICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IGlTaXplOyArK2kpIHsKLSAgICAgICAgQ1BERl9QYWdlTm9kZSAqcE5vZGUgPSAoQ1BERl9QYWdlTm9kZSopcGFnZU5vZGVzLm1fY2hpbGROb2RlLkdldEF0KGkpOwotICAgICAgICBpZiAoIXBOb2RlKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKHBOb2RlLT5tX3R5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgUERGX1BBR0VOT0RFX1VOS09XTjoKLSAgICAgICAgICAgICAgICBpZiAoIUNoZWNrVW5rb3duUGFnZU5vZGUocE5vZGUtPm1fZHdQYWdlTm8sIHBOb2RlLCBwSGludHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLS1pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQREZfUEFHRU5PREVfUEFHRToKLSAgICAgICAgICAgICAgICBpQ291bnQrKzsKLSAgICAgICAgICAgICAgICBpZiAoaVBhZ2UgPT0gaUNvdW50ICYmIG1fcERvY3VtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcERvY3VtZW50LT5tX1BhZ2VMaXN0LlNldEF0KGlQYWdlLCBwTm9kZS0+bV9kd1BhZ2VObyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQREZfUEFHRU5PREVfUEFHRVM6Ci0gICAgICAgICAgICAgICAgaWYgKCFDaGVja1BhZ2VOb2RlKCpwTm9kZSwgaVBhZ2UsIGlDb3VudCwgcEhpbnRzKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQREZfUEFHRU5PREVfQVJSQVk6Ci0gICAgICAgICAgICAgICAgaWYgKCFDaGVja0FycmF5UGFnZU5vZGUocE5vZGUtPm1fZHdQYWdlTm8sIHBOb2RlLCBwSGludHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLS1pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpUGFnZSA9PSBpQ291bnQpIHsKLSAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9ET05FOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpMb2FkRG9jUGFnZShGWF9JTlQzMiBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKLXsKLSAgICBpZiAobV9wRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpIDw9IGlQYWdlIHx8IG1fcERvY3VtZW50LT5tX1BhZ2VMaXN0LkdldEF0KGlQYWdlKSkgewotICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRE9ORTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmIChtX3BhZ2VOb2Rlcy5tX3R5cGUgPT0gUERGX1BBR0VOT0RFX1BBR0UpIHsKLSAgICAgICAgaWYgKGlQYWdlID09IDApIHsKLSAgICAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9ET05FOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgRlhfSU5UMzIgaUNvdW50ID0gLTE7Ci0gICAgcmV0dXJuIENoZWNrUGFnZU5vZGUobV9wYWdlTm9kZXMsIGlQYWdlLCBpQ291bnQsIHBIaW50cyk7Ci19Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VDb3VudChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQotewotICAgIEZYX0JPT0wgYkV4aXN0ID0gRkFMU0U7Ci0gICAgQ1BERl9PYmplY3QgKnBQYWdlcyA9IEdldE9iamVjdChtX1BhZ2VzT2JqTnVtLCBwSGludHMsICZiRXhpc3QpOwotICAgIGlmICghYkV4aXN0KSB7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoIXBQYWdlcykgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VzRGljdCA9IHBQYWdlcy0+R2V0RGljdCgpOwotICAgIGlmICghcFBhZ2VzRGljdCkgewotICAgICAgICBwUGFnZXMtPlJlbGVhc2UoKTsKLSAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmICghcFBhZ2VzRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIktpZHMiKSkpIHsKLSAgICAgICAgcFBhZ2VzLT5SZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpbnQgY291bnQgPSBwUGFnZXNEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJDb3VudCIpKTsKLSAgICBpZiAoY291bnQgPiAwKSB7Ci0gICAgICAgIHBQYWdlcy0+UmVsZWFzZSgpOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcFBhZ2VzLT5SZWxlYXNlKCk7Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6TG9hZERvY1BhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCi17Ci0gICAgaWYgKCFDaGVja1Vua293blBhZ2VOb2RlKG1fUGFnZXNPYmpOdW0sICZtX3BhZ2VOb2RlcywgcEhpbnRzKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChDaGVja1BhZ2VDb3VudChwSGludHMpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQREZfREFUQUFWQUlMX0VSUk9SOgorICAgICAgICByZXR1cm4gTG9hZEFsbEZpbGUocEhpbnRzKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIG1fYlBhZ2VzVHJlZUxvYWQgPSBUUlVFOworICAgICAgICBtX2JQYWdlc0xvYWQgPSBUUlVFOworICAgICAgICBtX2JDdXJQYWdlRGljdExvYWRPSyA9IFRSVUU7CiAgICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9QQUdFOwogICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX2JUb3RhbExvYWRQYWdlVHJlZSA9IFRSVUU7CisgICAgfQorICB9Cit9CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja0FycmF5UGFnZU5vZGUoRlhfRFdPUkQgZHdQYWdlTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYWdlTm9kZSogcFBhZ2VOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgRlhfQk9PTCBiRXhpc3QgPSBGQUxTRTsKKyAgQ1BERl9PYmplY3QqIHBQYWdlcyA9IEdldE9iamVjdChkd1BhZ2VObywgcEhpbnRzLCAmYkV4aXN0KTsKKyAgaWYgKCFiRXhpc3QpIHsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghcFBhZ2VzKSB7CisgICAgaWYgKG1fZG9jU3RhdHVzID09IFBERl9EQVRBQVZBSUxfRVJST1IpIHsKKyAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgcmV0dXJuIEZBTFNFOwotfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6TG9hZFBhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCi17Ci0gICAgd2hpbGUgKCFtX2JQYWdlc1RyZWVMb2FkKSB7Ci0gICAgICAgIGlmICghQ2hlY2tQYWdlU3RhdHVzKHBIaW50cykpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9iUGFnZXNMb2FkKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBtX3BEb2N1bWVudC0+TG9hZFBhZ2VzKCk7CisgIH0KKworICBDUERGX0FycmF5KiBwQXJyYXkgPSBwUGFnZXMtPkFzQXJyYXkoKTsKKyAgaWYgKCFwQXJyYXkpIHsKKyAgICBwUGFnZXMtPlJlbGVhc2UoKTsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7CiAgICAgcmV0dXJuIEZBTFNFOwotfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tMaW5lYXJpemVkRGF0YShJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQotewotICAgIGlmIChtX2JMaW5lYXJlZERhdGFPSykgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9CisgIH0KIAotICAgIGlmICghbV9iTWFpblhSZWZMb2FkVHJpZWQpIHsKLSAgICAgICAgRlhfU0FGRV9EV09SRCBkYXRhX3NpemUgPSBtX2R3RmlsZUxlbjsKLSAgICAgICAgZGF0YV9zaXplIC09IG1fZHdMYXN0WFJlZk9mZnNldDsKLSAgICAgICAgaWYgKCFkYXRhX3NpemUuSXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtX3BGaWxlQXZhaWwtPklzRGF0YUF2YWlsKG1fZHdMYXN0WFJlZk9mZnNldCwgZGF0YV9zaXplLlZhbHVlT3JEaWUoKSkpIHsKLSAgICAgICAgICAgIHBIaW50cy0+QWRkU2VnbWVudChtX2R3TGFzdFhSZWZPZmZzZXQsIGRhdGFfc2l6ZS5WYWx1ZU9yRGllKCkpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIEZYX0RXT1JEIGR3UmV0ID0gKChDUERGX1BhcnNlciAqKW1fcERvY3VtZW50LT5HZXRQYXJzZXIoKSktPkxvYWRMaW5lYXJpemVkTWFpblhSZWZUYWJsZSgpOwotICAgICAgICBtX2JNYWluWFJlZkxvYWRUcmllZCA9IFRSVUU7Ci0gICAgICAgIGlmIChkd1JldCAhPSBQREZQQVJTRV9FUlJPUl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFQcmVwYXJlUGFnZUl0ZW0oKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIG1fYk1haW5YUmVmTG9hZGVkT0sgPSBUUlVFOwotICAgICAgICBtX2JMaW5lYXJlZERhdGFPSyAgID0gVFJVRTsKLSAgICB9CisgIHBQYWdlTm9kZS0+bV90eXBlID0gUERGX1BBR0VOT0RFX1BBR0VTOworICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyArK2kpIHsKKyAgICBDUERGX1JlZmVyZW5jZSogcEtpZCA9IFRvUmVmZXJlbmNlKHBBcnJheS0+R2V0RWxlbWVudChpKSk7CisgICAgaWYgKCFwS2lkKQorICAgICAgY29udGludWU7CiAKLSAgICByZXR1cm4gbV9iTGluZWFyZWREYXRhT0s7CisgICAgQ1BERl9QYWdlTm9kZSogcE5vZGUgPSBuZXcgQ1BERl9QYWdlTm9kZSgpOworICAgIHBQYWdlTm9kZS0+bV9jaGlsZE5vZGUuQWRkKHBOb2RlKTsKKyAgICBwTm9kZS0+bV9kd1BhZ2VObyA9IHBLaWQtPkdldFJlZk9iak51bSgpOworICB9CisgIHBQYWdlcy0+UmVsZWFzZSgpOworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrUGFnZUFubm90cyhGWF9JTlQzMiBpUGFnZSwgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykKLXsKLSAgICBpZiAoIW1fb2Jqc19hcnJheS5HZXRTaXplKCkpIHsKLSAgICAgICAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOwotICAgICAgICBtX29iam51bV9hcnJheS5SZW1vdmVBbGwoKTsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5ICpwUGFnZURpY3QgPSBtX3BEb2N1bWVudC0+R2V0UGFnZShpUGFnZSk7Ci0gICAgICAgIGlmICghcFBhZ2VEaWN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBDUERGX09iamVjdCAqcEFubm90cyA9IHBQYWdlRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiQW5ub3RzIikpOwotICAgICAgICBpZiAoIXBBbm5vdHMpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIENGWF9QdHJBcnJheSBvYmpfYXJyYXk7Ci0gICAgICAgIG9ial9hcnJheS5BZGQocEFubm90cyk7Ci0gICAgICAgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG9ial9hcnJheSwgRkFMU0UsIHBIaW50cywgbV9vYmpzX2FycmF5KTsKLSAgICAgICAgaWYgKGJSZXQpIHsKLSAgICAgICAgICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYlJldDsKLSAgICB9IGVsc2UgewotICAgICAgICBDRlhfUHRyQXJyYXkgbmV3X29ianNfYXJyYXk7Ci0gICAgICAgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG1fb2Jqc19hcnJheSwgRkFMU0UsIHBIaW50cywgbmV3X29ianNfYXJyYXkpOwotICAgICAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgICAgIGlmICghYlJldCkgewotICAgICAgICAgICAgbV9vYmpzX2FycmF5LkFwcGVuZChuZXdfb2Jqc19hcnJheSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJSZXQ7CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1Vua293blBhZ2VOb2RlKEZYX0RXT1JEIGR3UGFnZU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BhZ2VOb2RlKiBwUGFnZU5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgRlhfQk9PTCBiRXhpc3QgPSBGQUxTRTsKKyAgQ1BERl9PYmplY3QqIHBQYWdlID0gR2V0T2JqZWN0KGR3UGFnZU5vLCBwSGludHMsICZiRXhpc3QpOworICBpZiAoIWJFeGlzdCkgeworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKCFwUGFnZSkgeworICAgIGlmIChtX2RvY1N0YXR1cyA9PSBQREZfREFUQUFWQUlMX0VSUk9SKSB7CisgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tMaW5lYXJpemVkRmlyc3RQYWdlKEZYX0lOVDMyIGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQotewotICAgIGlmICghbV9iQW5ub3RzTG9hZCkgewotICAgICAgICBpZiAoIUNoZWNrUGFnZUFubm90cyhpUGFnZSwgcEhpbnRzKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIG1fYkFubm90c0xvYWQgPSBUUlVFOwotICAgIH0KLSAgICBpZiAobV9iQW5ub3RzTG9hZCkKLSAgICAgICAgaWYgKCFDaGVja0xpbmVhcml6ZWREYXRhKHBIaW50cykpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIG1fYlBhZ2VMb2FkZWRPSyA9IEZBTFNFOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAocFBhZ2UtPklzQXJyYXkoKSkgeworICAgIHBQYWdlTm9kZS0+bV9kd1BhZ2VObyA9IGR3UGFnZU5vOworICAgIHBQYWdlTm9kZS0+bV90eXBlID0gUERGX1BBR0VOT0RFX0FSUkFZOworICAgIHBQYWdlLT5SZWxlYXNlKCk7CiAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKCFwUGFnZS0+SXNEaWN0aW9uYXJ5KCkpIHsKKyAgICBwUGFnZS0+UmVsZWFzZSgpOworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcFBhZ2VOb2RlLT5tX2R3UGFnZU5vID0gZHdQYWdlTm87CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwUGFnZS0+R2V0RGljdCgpOworICBDRlhfQnl0ZVN0cmluZyB0eXBlID0gcERpY3QtPkdldFN0cmluZygiVHlwZSIpOworICBpZiAodHlwZSA9PSAiUGFnZXMiKSB7CisgICAgcFBhZ2VOb2RlLT5tX3R5cGUgPSBQREZfUEFHRU5PREVfUEFHRVM7CisgICAgQ1BERl9PYmplY3QqIHBLaWRzID0gcERpY3QtPkdldEVsZW1lbnQoIktpZHMiKTsKKyAgICBpZiAoIXBLaWRzKSB7CisgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBzd2l0Y2ggKHBLaWRzLT5HZXRUeXBlKCkpIHsKKyAgICAgIGNhc2UgUERGT0JKX1JFRkVSRU5DRTogeworICAgICAgICBDUERGX1JlZmVyZW5jZSogcEtpZCA9IHBLaWRzLT5Bc1JlZmVyZW5jZSgpOworICAgICAgICBDUERGX1BhZ2VOb2RlKiBwTm9kZSA9IG5ldyBDUERGX1BhZ2VOb2RlKCk7CisgICAgICAgIHBQYWdlTm9kZS0+bV9jaGlsZE5vZGUuQWRkKHBOb2RlKTsKKyAgICAgICAgcE5vZGUtPm1fZHdQYWdlTm8gPSBwS2lkLT5HZXRSZWZPYmpOdW0oKTsKKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIFBERk9CSl9BUlJBWTogeworICAgICAgICBDUERGX0FycmF5KiBwS2lkc0FycmF5ID0gcEtpZHMtPkFzQXJyYXkoKTsKKyAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBLaWRzQXJyYXktPkdldENvdW50KCk7ICsraSkgeworICAgICAgICAgIENQREZfUmVmZXJlbmNlKiBwS2lkID0gVG9SZWZlcmVuY2UocEtpZHNBcnJheS0+R2V0RWxlbWVudChpKSk7CisgICAgICAgICAgaWYgKCFwS2lkKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICBDUERGX1BhZ2VOb2RlKiBwTm9kZSA9IG5ldyBDUERGX1BhZ2VOb2RlKCk7CisgICAgICAgICAgcFBhZ2VOb2RlLT5tX2NoaWxkTm9kZS5BZGQocE5vZGUpOworICAgICAgICAgIHBOb2RlLT5tX2R3UGFnZU5vID0gcEtpZC0+R2V0UmVmT2JqTnVtKCk7CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZSA9PSAiUGFnZSIpIHsKKyAgICBwUGFnZU5vZGUtPm1fdHlwZSA9IFBERl9QQUdFTk9ERV9QQUdFOworICB9IGVsc2UgeworICAgIHBQYWdlLT5SZWxlYXNlKCk7CisgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBwUGFnZS0+UmVsZWFzZSgpOworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkhhdmVSZXNvdXJjZUFuY2VzdG9yKENQREZfRGljdGlvbmFyeSAqcERpY3QpCi17Ci0gICAgQ0ZYX0F1dG9SZXN0b3JlcjxpbnQ+IHJlc3RvcmVyKCZzX0N1cnJlbnREYXRhQXZhaWxSZWN1cnNpb25EZXB0aCk7Ci0gICAgaWYgKCsrc19DdXJyZW50RGF0YUF2YWlsUmVjdXJzaW9uRGVwdGggPiBrTWF4RGF0YUF2YWlsUmVjdXJzaW9uRGVwdGgpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlTm9kZShDUERGX1BhZ2VOb2RlJiBwYWdlTm9kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsKSB7CisgIGlmIChsZXZlbCA+PSBrTWF4UGFnZVJlY3Vyc2lvbkRlcHRoKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGludDMyX3QgaVNpemUgPSBwYWdlTm9kZXMubV9jaGlsZE5vZGUuR2V0U2l6ZSgpOworICBpZiAoaVNpemUgPD0gMCB8fCBpUGFnZSA+PSBpU2l6ZSkgeworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7ICsraSkgeworICAgIENQREZfUGFnZU5vZGUqIHBOb2RlID0gcGFnZU5vZGVzLm1fY2hpbGROb2RlLkdldEF0KGkpOworICAgIGlmICghcE5vZGUpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBDUERGX09iamVjdCAqcFBhcmVudCA9IHBEaWN0LT5HZXRFbGVtZW50KCJQYXJlbnQiKTsKLSAgICBpZiAoIXBQYXJlbnQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIHN3aXRjaCAocE5vZGUtPm1fdHlwZSkgeworICAgICAgY2FzZSBQREZfUEFHRU5PREVfVU5LT1dOOgorICAgICAgICBpZiAoIUNoZWNrVW5rb3duUGFnZU5vZGUocE5vZGUtPm1fZHdQYWdlTm8sIHBOb2RlLCBwSGludHMpKSB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIC0taTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBERl9QQUdFTk9ERV9QQUdFOgorICAgICAgICBpQ291bnQrKzsKKyAgICAgICAgaWYgKGlQYWdlID09IGlDb3VudCAmJiBtX3BEb2N1bWVudCkgeworICAgICAgICAgIG1fcERvY3VtZW50LT5tX1BhZ2VMaXN0LlNldEF0KGlQYWdlLCBwTm9kZS0+bV9kd1BhZ2VObyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBERl9QQUdFTk9ERV9QQUdFUzoKKyAgICAgICAgaWYgKCFDaGVja1BhZ2VOb2RlKCpwTm9kZSwgaVBhZ2UsIGlDb3VudCwgcEhpbnRzLCBsZXZlbCArIDEpKSB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQREZfUEFHRU5PREVfQVJSQVk6CisgICAgICAgIGlmICghQ2hlY2tBcnJheVBhZ2VOb2RlKHBOb2RlLT5tX2R3UGFnZU5vLCBwTm9kZSwgcEhpbnRzKSkgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICAtLWk7CisgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkgKnBQYXJlbnREaWN0ID0gcFBhcmVudC0+R2V0RGljdCgpOwotICAgIGlmICghcFBhcmVudERpY3QpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmIChpUGFnZSA9PSBpQ291bnQpIHsKKyAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9ET05FOworICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIENQREZfT2JqZWN0ICpwUmV0ID0gcFBhcmVudERpY3QtPkdldEVsZW1lbnQoIlJlc291cmNlcyIpOwotICAgIGlmIChwUmV0KSB7Ci0gICAgICAgIG1fcFBhZ2VSZXNvdXJjZSA9IHBSZXQ7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gSGF2ZVJlc291cmNlQW5jZXN0b3IocFBhcmVudERpY3QpOworICB9CisgIHJldHVybiBUUlVFOwogfQotRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6SXNQYWdlQXZhaWwoRlhfSU5UMzIgaVBhZ2UsIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpCi17Ci0gICAgaWYgKCFtX3BEb2N1bWVudCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpMb2FkRG9jUGFnZShpbnQzMl90IGlQYWdlLCBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIGlmIChtX3BEb2N1bWVudC0+R2V0UGFnZUNvdW50KCkgPD0gaVBhZ2UgfHwKKyAgICAgIG1fcERvY3VtZW50LT5tX1BhZ2VMaXN0LkdldEF0KGlQYWdlKSkgeworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9ET05FOworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChtX3BhZ2VOb2Rlcy5tX3R5cGUgPT0gUERGX1BBR0VOT0RFX1BBR0UpIHsKKyAgICBpZiAoaVBhZ2UgPT0gMCkgeworICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0RPTkU7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgaWYgKElzRmlyc3RDaGVjayhpUGFnZSkpIHsKLSAgICAgICAgbV9iQ3VyUGFnZURpY3RMb2FkT0sgPSBGQUxTRTsKLSAgICAgICAgbV9iUGFnZUxvYWRlZE9LID0gRkFMU0U7Ci0gICAgICAgIG1fYkFubm90c0xvYWQgPSBGQUxTRTsKLSAgICAgICAgbV9iTmVlZERvd25Mb2FkUmVzb3VyY2UgPSBGQUxTRTsKLSAgICAgICAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOwotICAgICAgICBtX29iam51bV9hcnJheS5SZW1vdmVBbGwoKTsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaW50MzJfdCBpQ291bnQgPSAtMTsKKyAgcmV0dXJuIENoZWNrUGFnZU5vZGUobV9wYWdlTm9kZXMsIGlQYWdlLCBpQ291bnQsIHBIaW50cywgMCk7Cit9CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VDb3VudChJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIEZYX0JPT0wgYkV4aXN0ID0gRkFMU0U7CisgIENQREZfT2JqZWN0KiBwUGFnZXMgPSBHZXRPYmplY3QobV9QYWdlc09iak51bSwgcEhpbnRzLCAmYkV4aXN0KTsKKyAgaWYgKCFiRXhpc3QpIHsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghcFBhZ2VzKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfRGljdGlvbmFyeSogcFBhZ2VzRGljdCA9IHBQYWdlcy0+R2V0RGljdCgpOworICBpZiAoIXBQYWdlc0RpY3QpIHsKKyAgICBwUGFnZXMtPlJlbGVhc2UoKTsKKyAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghcFBhZ2VzRGljdC0+S2V5RXhpc3QoIktpZHMiKSkgeworICAgIHBQYWdlcy0+UmVsZWFzZSgpOworICAgIHJldHVybiBUUlVFOworICB9CisgIGludCBjb3VudCA9IHBQYWdlc0RpY3QtPkdldEludGVnZXIoIkNvdW50Iik7CisgIGlmIChjb3VudCA+IDApIHsKKyAgICBwUGFnZXMtPlJlbGVhc2UoKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBwUGFnZXMtPlJlbGVhc2UoKTsKKyAgcmV0dXJuIEZBTFNFOworfQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6TG9hZERvY1BhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgaWYgKCFDaGVja1Vua293blBhZ2VOb2RlKG1fUGFnZXNPYmpOdW0sICZtX3BhZ2VOb2RlcywgcEhpbnRzKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoQ2hlY2tQYWdlQ291bnQocEhpbnRzKSkgeworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9QQUdFOworICAgIHJldHVybiBUUlVFOworICB9CisgIG1fYlRvdGFsTG9hZFBhZ2VUcmVlID0gVFJVRTsKKyAgcmV0dXJuIEZBTFNFOworfQorRlhfQk9PTCBDUERGX0RhdGFBdmFpbDo6TG9hZFBhZ2VzKElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgd2hpbGUgKCFtX2JQYWdlc1RyZWVMb2FkKSB7CisgICAgaWYgKCFDaGVja1BhZ2VTdGF0dXMocEhpbnRzKSkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBpZiAobV9wYWdlc0xvYWRTdGF0ZSA9PSBOVUxMKSB7Ci0gICAgICAgIG1fcGFnZXNMb2FkU3RhdGUgPSBuZXcgQ0ZYX0NNYXBEV29yZFRvRFdvcmQoKTsKKyAgfQorICBpZiAobV9iUGFnZXNMb2FkKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgbV9wRG9jdW1lbnQtPkxvYWRQYWdlcygpOworICByZXR1cm4gRkFMU0U7Cit9CitJUERGX0RhdGFBdmFpbDo6RG9jQXZhaWxTdGF0dXMgQ1BERl9EYXRhQXZhaWw6OkNoZWNrTGluZWFyaXplZERhdGEoCisgICAgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgeworICBpZiAobV9iTGluZWFyZWREYXRhT0spIHsKKyAgICByZXR1cm4gRGF0YUF2YWlsYWJsZTsKKyAgfQorCisgIGlmICghbV9iTWFpblhSZWZMb2FkVHJpZWQpIHsKKyAgICBGWF9TQUZFX0RXT1JEIGRhdGFfc2l6ZSA9IG1fZHdGaWxlTGVuOworICAgIGRhdGFfc2l6ZSAtPSBtX2R3TGFzdFhSZWZPZmZzZXQ7CisgICAgaWYgKCFkYXRhX3NpemUuSXNWYWxpZCgpKSB7CisgICAgICByZXR1cm4gRGF0YUVycm9yOwogICAgIH0KLSAgICBGWF9EV09SRCBkd1BhZ2VMb2FkID0gMDsKLSAgICBpZiAobV9wYWdlc0xvYWRTdGF0ZS0+TG9va3VwKGlQYWdlLCBkd1BhZ2VMb2FkKSAmJiBkd1BhZ2VMb2FkICE9IDApIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgaWYgKCFtX3BGaWxlQXZhaWwtPklzRGF0YUF2YWlsKG1fZHdMYXN0WFJlZk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9zaXplLlZhbHVlT3JEaWUoKSkpIHsKKyAgICAgIHBIaW50cy0+QWRkU2VnbWVudChtX2R3TGFzdFhSZWZPZmZzZXQsIGRhdGFfc2l6ZS5WYWx1ZU9yRGllKCkpOworICAgICAgcmV0dXJuIERhdGFOb3RBdmFpbGFibGU7CiAgICAgfQotICAgIGlmIChtX2JMaW5lYXJpemVkKSB7Ci0gICAgICAgIGlmICgoRlhfRFdPUkQpaVBhZ2UgPT0gbV9kd0ZpcnN0UGFnZU5vKSB7Ci0gICAgICAgICAgICBtX3BhZ2VzTG9hZFN0YXRlLT5TZXRBdChpUGFnZSwgVFJVRSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIUNoZWNrTGluZWFyaXplZERhdGEocEhpbnRzKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX2JNYWluWFJlZkxvYWRlZE9LKSB7Ci0gICAgICAgICAgICBpZiAobV9iVG90YWxMb2FkUGFnZVRyZWUpIHsKLSAgICAgICAgICAgICAgICBpZiAoIUxvYWRQYWdlcyhwSGludHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICghbV9iQ3VyUGFnZURpY3RMb2FkT0sgJiYgIUNoZWNrUGFnZShpUGFnZSwgcEhpbnRzKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCFMb2FkQWxsRmlsZShwSGludHMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKChDUERGX1BhcnNlciAqKW1fcERvY3VtZW50LT5HZXRQYXJzZXIoKSktPlJlYnVpbGRDcm9zc1JlZigpOwotICAgICAgICAgICAgUmVzZXRGaXJzdENoZWNrKGlQYWdlKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFtX2JUb3RhbExvYWRQYWdlVHJlZSkgewotICAgICAgICAgICAgaWYgKCFtX2JDdXJQYWdlRGljdExvYWRPSyAmJiAhQ2hlY2tQYWdlKGlQYWdlLCBwSGludHMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgRlhfRFdPUkQgZHdSZXQgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkxvYWRMaW5lYXJpemVkTWFpblhSZWZUYWJsZSgpOworICAgIG1fYk1haW5YUmVmTG9hZFRyaWVkID0gVFJVRTsKKyAgICBpZiAoZHdSZXQgIT0gUERGUEFSU0VfRVJST1JfU1VDQ0VTUykgeworICAgICAgcmV0dXJuIERhdGFFcnJvcjsKICAgICB9Ci0gICAgaWYgKG1fYkhhdmVBY3JvRm9ybSAmJiAhbV9iQWNyb0Zvcm1Mb2FkKSB7Ci0gICAgICAgIGlmICghQ2hlY2tBY3JvRm9ybVN1Yk9iamVjdChwSGludHMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgbV9iQWNyb0Zvcm1Mb2FkID0gVFJVRTsKKyAgICBpZiAoIVByZXBhcmVQYWdlSXRlbSgpKSB7CisgICAgICByZXR1cm4gRGF0YU5vdEF2YWlsYWJsZTsKICAgICB9Ci0gICAgaWYgKCFtX2JQYWdlTG9hZGVkT0spIHsKLSAgICAgICAgaWYgKCFtX29ianNfYXJyYXkuR2V0U2l6ZSgpKSB7Ci0gICAgICAgICAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICBtX29iam51bV9hcnJheS5SZW1vdmVBbGwoKTsKLSAgICAgICAgICAgIG1fcFBhZ2VEaWN0ID0gbV9wRG9jdW1lbnQtPkdldFBhZ2UoaVBhZ2UpOwotICAgICAgICAgICAgaWYgKCFtX3BQYWdlRGljdCkgewotICAgICAgICAgICAgICAgIFJlc2V0Rmlyc3RDaGVjayhpUGFnZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDRlhfUHRyQXJyYXkgb2JqX2FycmF5OwotICAgICAgICAgICAgb2JqX2FycmF5LkFkZChtX3BQYWdlRGljdCk7Ci0gICAgICAgICAgICBGWF9CT09MIGJSZXQgPSBJc09iamVjdHNBdmFpbChvYmpfYXJyYXksIFRSVUUsIHBIaW50cywgbV9vYmpzX2FycmF5KTsKLSAgICAgICAgICAgIGlmIChiUmV0KSB7Ci0gICAgICAgICAgICAgICAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOwotICAgICAgICAgICAgICAgIG1fYlBhZ2VMb2FkZWRPSyA9IFRSVUU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBiUmV0OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ0ZYX1B0ckFycmF5IG5ld19vYmpzX2FycmF5OwotICAgICAgICAgICAgRlhfQk9PTCBiUmV0ID0gSXNPYmplY3RzQXZhaWwobV9vYmpzX2FycmF5LCBGQUxTRSwgcEhpbnRzLCBuZXdfb2Jqc19hcnJheSk7Ci0gICAgICAgICAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICBpZiAoYlJldCkgewotICAgICAgICAgICAgICAgIG1fYlBhZ2VMb2FkZWRPSyA9IFRSVUU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fb2Jqc19hcnJheS5BcHBlbmQobmV3X29ianNfYXJyYXkpOwotICAgICAgICAgICAgICAgIHJldHVybiBiUmV0OwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgbV9iTWFpblhSZWZMb2FkZWRPSyA9IFRSVUU7CisgICAgbV9iTGluZWFyZWREYXRhT0sgPSBUUlVFOworICB9CisKKyAgcmV0dXJuIG1fYkxpbmVhcmVkRGF0YU9LID8gRGF0YUF2YWlsYWJsZSA6IERhdGFOb3RBdmFpbGFibGU7Cit9CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VBbm5vdHMoaW50MzJfdCBpUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIGlmICghbV9vYmpzX2FycmF5LkdldFNpemUoKSkgeworICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKKyAgICBtX09iamVjdFNldC5jbGVhcigpOworICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gbV9wRG9jdW1lbnQtPkdldFBhZ2UoaVBhZ2UpOworICAgIGlmICghcFBhZ2VEaWN0KSB7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgaWYgKG1fYlBhZ2VMb2FkZWRPSykgewotICAgICAgICBpZiAoIW1fYkFubm90c0xvYWQpIHsKLSAgICAgICAgICAgIGlmICghQ2hlY2tQYWdlQW5ub3RzKGlQYWdlLCBwSGludHMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9iQW5ub3RzTG9hZCA9IFRSVUU7Ci0gICAgICAgIH0KKyAgICBDUERGX09iamVjdCogcEFubm90cyA9IHBQYWdlRGljdC0+R2V0RWxlbWVudCgiQW5ub3RzIik7CisgICAgaWYgKCFwQW5ub3RzKSB7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgaWYgKG1fcFBhZ2VEaWN0ICYmICFtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSkgewotICAgICAgICBtX3BQYWdlUmVzb3VyY2UgPSBtX3BQYWdlRGljdC0+R2V0RWxlbWVudCgiUmVzb3VyY2VzIik7Ci0gICAgICAgIGlmICghbV9wUGFnZVJlc291cmNlKSB7Ci0gICAgICAgICAgICBtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSA9IEhhdmVSZXNvdXJjZUFuY2VzdG9yKG1fcFBhZ2VEaWN0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fYk5lZWREb3duTG9hZFJlc291cmNlID0gVFJVRTsKLSAgICAgICAgfQorICAgIENGWF9BcnJheVRlbXBsYXRlPENQREZfT2JqZWN0Kj4gb2JqX2FycmF5OworICAgIG9ial9hcnJheS5BZGQocEFubm90cyk7CisgICAgRlhfQk9PTCBiUmV0ID0gSXNPYmplY3RzQXZhaWwob2JqX2FycmF5LCBGQUxTRSwgcEhpbnRzLCBtX29ianNfYXJyYXkpOworICAgIGlmIChiUmV0KSB7CisgICAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7CiAgICAgfQotICAgIGlmIChtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSkgewotICAgICAgICBGWF9CT09MIGJSZXQgPSBDaGVja1Jlc291cmNlcyhwSGludHMpOwotICAgICAgICBpZiAoIWJSZXQpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSA9IEZBTFNFOworICAgIHJldHVybiBiUmV0OworICB9CisgIENGWF9BcnJheVRlbXBsYXRlPENQREZfT2JqZWN0Kj4gbmV3X29ianNfYXJyYXk7CisgIEZYX0JPT0wgYlJldCA9IElzT2JqZWN0c0F2YWlsKG1fb2Jqc19hcnJheSwgRkFMU0UsIHBIaW50cywgbmV3X29ianNfYXJyYXkpOworICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7CisgIGlmICghYlJldCkgeworICAgIG1fb2Jqc19hcnJheS5BcHBlbmQobmV3X29ianNfYXJyYXkpOworICB9CisgIHJldHVybiBiUmV0OworfQorSVBERl9EYXRhQXZhaWw6OkRvY0F2YWlsU3RhdHVzIENQREZfRGF0YUF2YWlsOjpDaGVja0xpbmVhcml6ZWRGaXJzdFBhZ2UoCisgICAgaW50MzJfdCBpUGFnZSwKKyAgICBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIGlmICghbV9iQW5ub3RzTG9hZCkgeworICAgIGlmICghQ2hlY2tQYWdlQW5ub3RzKGlQYWdlLCBwSGludHMpKSB7CisgICAgICByZXR1cm4gRGF0YU5vdEF2YWlsYWJsZTsKICAgICB9CisgICAgbV9iQW5ub3RzTG9hZCA9IFRSVUU7CisgIH0KKworICBEb2NBdmFpbFN0YXR1cyBuUmV0ID0gQ2hlY2tMaW5lYXJpemVkRGF0YShwSGludHMpOworICBpZiAoblJldCA9PSBEYXRhQXZhaWxhYmxlKQorICAgIG1fYlBhZ2VMb2FkZWRPSyA9IEZBTFNFOworICByZXR1cm4gblJldDsKK30KK0ZYX0JPT0wgQ1BERl9EYXRhQXZhaWw6OkhhdmVSZXNvdXJjZUFuY2VzdG9yKENQREZfRGljdGlvbmFyeSogcERpY3QpIHsKKyAgQ0ZYX0F1dG9SZXN0b3JlcjxpbnQ+IHJlc3RvcmVyKCZzX0N1cnJlbnREYXRhQXZhaWxSZWN1cnNpb25EZXB0aCk7CisgIGlmICgrK3NfQ3VycmVudERhdGFBdmFpbFJlY3Vyc2lvbkRlcHRoID4ga01heERhdGFBdmFpbFJlY3Vyc2lvbkRlcHRoKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfT2JqZWN0KiBwUGFyZW50ID0gcERpY3QtPkdldEVsZW1lbnQoIlBhcmVudCIpOworICBpZiAoIXBQYXJlbnQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyZW50RGljdCA9IHBQYXJlbnQtPkdldERpY3QoKTsKKyAgaWYgKCFwUGFyZW50RGljdCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDUERGX09iamVjdCogcFJldCA9IHBQYXJlbnREaWN0LT5HZXRFbGVtZW50KCJSZXNvdXJjZXMiKTsKKyAgaWYgKHBSZXQpIHsKKyAgICBtX3BQYWdlUmVzb3VyY2UgPSBwUmV0OworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBIYXZlUmVzb3VyY2VBbmNlc3RvcihwUGFyZW50RGljdCk7Cit9CitJUERGX0RhdGFBdmFpbDo6RG9jQXZhaWxTdGF0dXMgQ1BERl9EYXRhQXZhaWw6OklzUGFnZUF2YWlsKAorICAgIGludDMyX3QgaVBhZ2UsCisgICAgSUZYX0Rvd25sb2FkSGludHMqIHBIaW50cykgeworICBpZiAoIW1fcERvY3VtZW50KSB7CisgICAgcmV0dXJuIERhdGFFcnJvcjsKKyAgfQorICBpZiAoSXNGaXJzdENoZWNrKGlQYWdlKSkgeworICAgIG1fYkN1clBhZ2VEaWN0TG9hZE9LID0gRkFMU0U7CiAgICAgbV9iUGFnZUxvYWRlZE9LID0gRkFMU0U7CiAgICAgbV9iQW5ub3RzTG9hZCA9IEZBTFNFOwotICAgIG1fYkN1clBhZ2VEaWN0TG9hZE9LID0gRkFMU0U7Ci0gICAgUmVzZXRGaXJzdENoZWNrKGlQYWdlKTsKLSAgICBtX3BhZ2VzTG9hZFN0YXRlLT5TZXRBdChpUGFnZSwgVFJVRSk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1Jlc291cmNlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKQotewotICAgIGlmICghbV9vYmpzX2FycmF5LkdldFNpemUoKSkgewotICAgICAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgICAgIENGWF9QdHJBcnJheSBvYmpfYXJyYXk7Ci0gICAgICAgIG9ial9hcnJheS5BZGQobV9wUGFnZVJlc291cmNlKTsKLSAgICAgICAgRlhfQk9PTCBiUmV0ID0gSXNPYmplY3RzQXZhaWwob2JqX2FycmF5LCBUUlVFLCBwSGludHMsIG1fb2Jqc19hcnJheSk7Ci0gICAgICAgIGlmIChiUmV0KSB7Ci0gICAgICAgICAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJSZXQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQ0ZYX1B0ckFycmF5IG5ld19vYmpzX2FycmF5OwotICAgICAgICBGWF9CT09MIGJSZXQgPSBJc09iamVjdHNBdmFpbChtX29ianNfYXJyYXksIEZBTFNFLCBwSGludHMsIG5ld19vYmpzX2FycmF5KTsKLSAgICAgICAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOwotICAgICAgICBpZiAoIWJSZXQpIHsKLSAgICAgICAgICAgIG1fb2Jqc19hcnJheS5BcHBlbmQobmV3X29ianNfYXJyYXkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiUmV0OwotICAgIH0KLX0KLXZvaWQgQ1BERl9EYXRhQXZhaWw6OkdldExpbmVhcml6ZWRNYWluWFJlZkluZm8oRlhfRklMRVNJWkUgKnBQb3MsIEZYX0RXT1JEICpwU2l6ZSkKLXsKLSAgICBpZiAocFBvcykgewotICAgICAgICAqcFBvcyA9IG1fZHdMYXN0WFJlZk9mZnNldDsKLSAgICB9Ci0gICAgaWYgKHBTaXplKSB7Ci0gICAgICAgICpwU2l6ZSA9IChGWF9EV09SRCkobV9kd0ZpbGVMZW4gLSBtX2R3TGFzdFhSZWZPZmZzZXQpOwotICAgIH0KLX0KLUZYX0lOVDMyIENQREZfRGF0YUF2YWlsOjpJc0Zvcm1BdmFpbChJRlhfRG93bmxvYWRIaW50cyAqcEhpbnRzKQotewotICAgIGlmICghbV9wRG9jdW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIFBERkZPUk1fQVZBSUw7Ci0gICAgfQotICAgIGlmICghbV9iTGluZWFyaXplZEZvcm1QYXJhbUxvYWQpIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5ICpwUm9vdCA9IG1fcERvY3VtZW50LT5HZXRSb290KCk7Ci0gICAgICAgIGlmICghcFJvb3QpIHsKLSAgICAgICAgICAgIHJldHVybiBQREZGT1JNX0FWQUlMOwotICAgICAgICB9Ci0gICAgICAgIENQREZfT2JqZWN0ICpwQWNyb0Zvcm0gPSBwUm9vdC0+R2V0RWxlbWVudChGWF9CU1RSQygiQWNyb0Zvcm0iKSk7Ci0gICAgICAgIGlmICghcEFjcm9Gb3JtKSB7Ci0gICAgICAgICAgICByZXR1cm4gUERGRk9STV9OT1RFWElTVDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIUNoZWNrTGluZWFyaXplZERhdGEocEhpbnRzKSkgewotICAgICAgICAgICAgcmV0dXJuIFBERkZPUk1fTk9UQVZBSUw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtX29ianNfYXJyYXkuR2V0U2l6ZSgpKSB7Ci0gICAgICAgICAgICBtX29ianNfYXJyYXkuQWRkKHBBY3JvRm9ybS0+R2V0RGljdCgpKTsKLSAgICAgICAgfQotICAgICAgICBtX2JMaW5lYXJpemVkRm9ybVBhcmFtTG9hZCA9IFRSVUU7Ci0gICAgfQotICAgIENGWF9QdHJBcnJheSBuZXdfb2Jqc19hcnJheTsKLSAgICBGWF9CT09MIGJSZXQgPSBJc09iamVjdHNBdmFpbChtX29ianNfYXJyYXksIEZBTFNFLCBwSGludHMsIG5ld19vYmpzX2FycmF5KTsKKyAgICBtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSA9IEZBTFNFOwogICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKLSAgICBpZiAoIWJSZXQpIHsKKyAgICBtX09iamVjdFNldC5jbGVhcigpOworICB9CisgIGlmIChwZGZpdW06OkNvbnRhaW5zS2V5KG1fcGFnZXNMb2FkU3RhdGUsIGlQYWdlKSkKKyAgICByZXR1cm4gRGF0YUF2YWlsYWJsZTsKKworICBpZiAobV9iTGluZWFyaXplZCkgeworICAgIGlmICgoRlhfRFdPUkQpaVBhZ2UgPT0gbV9kd0ZpcnN0UGFnZU5vKSB7CisgICAgICBEb2NBdmFpbFN0YXR1cyBuUmV0ID0gQ2hlY2tMaW5lYXJpemVkRmlyc3RQYWdlKGlQYWdlLCBwSGludHMpOworICAgICAgaWYgKG5SZXQgPT0gRGF0YUF2YWlsYWJsZSkKKyAgICAgICAgbV9wYWdlc0xvYWRTdGF0ZS5pbnNlcnQoaVBhZ2UpOworICAgICAgcmV0dXJuIG5SZXQ7CisgICAgfQorICAgIERvY0F2YWlsU3RhdHVzIG5SZXN1bHQgPSBDaGVja0xpbmVhcml6ZWREYXRhKHBIaW50cyk7CisgICAgaWYgKG5SZXN1bHQgIT0gRGF0YUF2YWlsYWJsZSkgeworICAgICAgcmV0dXJuIG5SZXN1bHQ7CisgICAgfQorICAgIGlmIChtX3BIaW50VGFibGVzKSB7CisgICAgICBuUmVzdWx0ID0gbV9wSGludFRhYmxlcy0+Q2hlY2tQYWdlKGlQYWdlLCBwSGludHMpOworICAgICAgaWYgKG5SZXN1bHQgIT0gRGF0YUF2YWlsYWJsZSkKKyAgICAgICAgcmV0dXJuIG5SZXN1bHQ7CisgICAgICBtX3BhZ2VzTG9hZFN0YXRlLmluc2VydChpUGFnZSk7CisgICAgICByZXR1cm4gRGF0YUF2YWlsYWJsZTsKKyAgICB9CisgICAgaWYgKG1fYk1haW5YUmVmTG9hZGVkT0spIHsKKyAgICAgIGlmIChtX2JUb3RhbExvYWRQYWdlVHJlZSkgeworICAgICAgICBpZiAoIUxvYWRQYWdlcyhwSGludHMpKSB7CisgICAgICAgICAgcmV0dXJuIERhdGFOb3RBdmFpbGFibGU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghbV9iQ3VyUGFnZURpY3RMb2FkT0sgJiYgIUNoZWNrUGFnZShpUGFnZSwgcEhpbnRzKSkgeworICAgICAgICAgIHJldHVybiBEYXRhTm90QXZhaWxhYmxlOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghTG9hZEFsbEZpbGUocEhpbnRzKSkgeworICAgICAgICByZXR1cm4gRGF0YU5vdEF2YWlsYWJsZTsKKyAgICAgIH0KKyAgICAgICgoQ1BERl9QYXJzZXIqKW1fcERvY3VtZW50LT5HZXRQYXJzZXIoKSktPlJlYnVpbGRDcm9zc1JlZigpOworICAgICAgUmVzZXRGaXJzdENoZWNrKGlQYWdlKTsKKyAgICAgIHJldHVybiBEYXRhQXZhaWxhYmxlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoIW1fYlRvdGFsTG9hZFBhZ2VUcmVlKSB7CisgICAgICBpZiAoIW1fYkN1clBhZ2VEaWN0TG9hZE9LICYmICFDaGVja1BhZ2UoaVBhZ2UsIHBIaW50cykpIHsKKyAgICAgICAgcmV0dXJuIERhdGFOb3RBdmFpbGFibGU7CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChtX2JIYXZlQWNyb0Zvcm0gJiYgIW1fYkFjcm9Gb3JtTG9hZCkgeworICAgIGlmICghQ2hlY2tBY3JvRm9ybVN1Yk9iamVjdChwSGludHMpKSB7CisgICAgICByZXR1cm4gRGF0YU5vdEF2YWlsYWJsZTsKKyAgICB9CisgICAgbV9iQWNyb0Zvcm1Mb2FkID0gVFJVRTsKKyAgfQorICBpZiAoIW1fYlBhZ2VMb2FkZWRPSykgeworICAgIGlmICghbV9vYmpzX2FycmF5LkdldFNpemUoKSkgeworICAgICAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOworICAgICAgbV9PYmplY3RTZXQuY2xlYXIoKTsKKyAgICAgIG1fcFBhZ2VEaWN0ID0gbV9wRG9jdW1lbnQtPkdldFBhZ2UoaVBhZ2UpOworICAgICAgaWYgKCFtX3BQYWdlRGljdCkgeworICAgICAgICBSZXNldEZpcnN0Q2hlY2soaVBhZ2UpOworICAgICAgICByZXR1cm4gRGF0YUF2YWlsYWJsZTsKKyAgICAgIH0KKyAgICAgIENGWF9BcnJheVRlbXBsYXRlPENQREZfT2JqZWN0Kj4gb2JqX2FycmF5OworICAgICAgb2JqX2FycmF5LkFkZChtX3BQYWdlRGljdCk7CisgICAgICBGWF9CT09MIGJSZXQgPSBJc09iamVjdHNBdmFpbChvYmpfYXJyYXksIFRSVUUsIHBIaW50cywgbV9vYmpzX2FycmF5KTsKKyAgICAgIGlmICghYlJldCkKKyAgICAgICAgcmV0dXJuIERhdGFOb3RBdmFpbGFibGU7CisKKyAgICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKKyAgICB9IGVsc2UgeworICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9PYmplY3QqPiBuZXdfb2Jqc19hcnJheTsKKyAgICAgIEZYX0JPT0wgYlJldCA9CisgICAgICAgICAgSXNPYmplY3RzQXZhaWwobV9vYmpzX2FycmF5LCBGQUxTRSwgcEhpbnRzLCBuZXdfb2Jqc19hcnJheSk7CisgICAgICBtX29ianNfYXJyYXkuUmVtb3ZlQWxsKCk7CisgICAgICBpZiAoIWJSZXQpIHsKICAgICAgICAgbV9vYmpzX2FycmF5LkFwcGVuZChuZXdfb2Jqc19hcnJheSk7Ci0gICAgICAgIHJldHVybiBQREZGT1JNX05PVEFWQUlMOworICAgICAgICByZXR1cm4gRGF0YU5vdEF2YWlsYWJsZTsKKyAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFBERkZPUk1fQVZBSUw7Ci19Ci12b2lkIENQREZfU29ydE9iak51bUFycmF5OjpBZGRPYmpOdW0oRlhfRFdPUkQgZHdPYmpOdW0pCi17Ci0gICAgRlhfSU5UMzIgaU5leHQgPSAwOwotICAgIGlmIChCaW5hcnlTZWFyY2goZHdPYmpOdW0sIGlOZXh0KSkgewotICAgICAgICByZXR1cm47CisgICAgbV9iUGFnZUxvYWRlZE9LID0gVFJVRTsKKyAgfQorCisgIGlmICghbV9iQW5ub3RzTG9hZCkgeworICAgIGlmICghQ2hlY2tQYWdlQW5ub3RzKGlQYWdlLCBwSGludHMpKSB7CisgICAgICByZXR1cm4gRGF0YU5vdEF2YWlsYWJsZTsKICAgICB9Ci0gICAgbV9udW1iZXJfYXJyYXkuSW5zZXJ0QXQoaU5leHQsIGR3T2JqTnVtKTsKLX0KLUZYX0JPT0wgQ1BERl9Tb3J0T2JqTnVtQXJyYXk6OkZpbmQoRlhfRFdPUkQgZHdPYmpOdW0pCi17Ci0gICAgRlhfSU5UMzIgaU5leHQgPSAwOwotICAgIHJldHVybiBCaW5hcnlTZWFyY2goZHdPYmpOdW0sIGlOZXh0KTsKLX0KLUZYX0JPT0wgQ1BERl9Tb3J0T2JqTnVtQXJyYXk6OkJpbmFyeVNlYXJjaChGWF9EV09SRCB2YWx1ZSwgRlhfSU5UMzIgJmlOZXh0KQotewotICAgIEZYX0lOVDMyIGlMZW4gPSBtX251bWJlcl9hcnJheS5HZXRTaXplKCk7Ci0gICAgRlhfSU5UMzIgaUxvdyA9IDA7Ci0gICAgRlhfSU5UMzIgaUhpZ2ggPSBpTGVuIC0gMTsKLSAgICBGWF9JTlQzMiBpTWlkID0gMDsKLSAgICB3aGlsZSAoaUxvdyA8PSBpSGlnaCkgewotICAgICAgICBpTWlkID0gKGlMb3cgKyBpSGlnaCkgLyAyOwotICAgICAgICBpZiAobV9udW1iZXJfYXJyYXkuR2V0QXQoaU1pZCkgPT0gdmFsdWUpIHsKLSAgICAgICAgICAgIGlOZXh0ID0gaU1pZDsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9IGVsc2UgaWYgKG1fbnVtYmVyX2FycmF5LkdldEF0KGlNaWQpID4gdmFsdWUpIHsKLSAgICAgICAgICAgIGlIaWdoID0gaU1pZCAtIDE7Ci0gICAgICAgIH0gZWxzZSBpZiAobV9udW1iZXJfYXJyYXkuR2V0QXQoaU1pZCkgPCB2YWx1ZSkgewotICAgICAgICAgICAgaUxvdyA9IGlNaWQgKyAxOwotICAgICAgICB9CisgICAgbV9iQW5ub3RzTG9hZCA9IFRSVUU7CisgIH0KKworICBpZiAobV9wUGFnZURpY3QgJiYgIW1fYk5lZWREb3duTG9hZFJlc291cmNlKSB7CisgICAgbV9wUGFnZVJlc291cmNlID0gbV9wUGFnZURpY3QtPkdldEVsZW1lbnQoIlJlc291cmNlcyIpOworICAgIGlmICghbV9wUGFnZVJlc291cmNlKSB7CisgICAgICBtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSA9IEhhdmVSZXNvdXJjZUFuY2VzdG9yKG1fcFBhZ2VEaWN0KTsKKyAgICB9IGVsc2UgeworICAgICAgbV9iTmVlZERvd25Mb2FkUmVzb3VyY2UgPSBUUlVFOwogICAgIH0KLSAgICBpTmV4dCA9IGlMb3c7CisgIH0KKyAgaWYgKG1fYk5lZWREb3duTG9hZFJlc291cmNlKSB7CisgICAgRlhfQk9PTCBiUmV0ID0gQ2hlY2tSZXNvdXJjZXMocEhpbnRzKTsKKyAgICBpZiAoIWJSZXQpIHsKKyAgICAgIHJldHVybiBEYXRhTm90QXZhaWxhYmxlOworICAgIH0KKyAgICBtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSA9IEZBTFNFOworICB9CisgIG1fYlBhZ2VMb2FkZWRPSyA9IEZBTFNFOworICBtX2JBbm5vdHNMb2FkID0gRkFMU0U7CisgIG1fYkN1clBhZ2VEaWN0TG9hZE9LID0gRkFMU0U7CisgIFJlc2V0Rmlyc3RDaGVjayhpUGFnZSk7CisgIG1fcGFnZXNMb2FkU3RhdGUuaW5zZXJ0KGlQYWdlKTsKKyAgcmV0dXJuIERhdGFBdmFpbGFibGU7Cit9CitGWF9CT09MIENQREZfRGF0YUF2YWlsOjpDaGVja1Jlc291cmNlcyhJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIGlmICghbV9vYmpzX2FycmF5LkdldFNpemUoKSkgeworICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKKyAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX09iamVjdCo+IG9ial9hcnJheTsKKyAgICBvYmpfYXJyYXkuQWRkKG1fcFBhZ2VSZXNvdXJjZSk7CisgICAgRlhfQk9PTCBiUmV0ID0gSXNPYmplY3RzQXZhaWwob2JqX2FycmF5LCBUUlVFLCBwSGludHMsIG1fb2Jqc19hcnJheSk7CisgICAgaWYgKGJSZXQpIHsKKyAgICAgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKKyAgICB9CisgICAgcmV0dXJuIGJSZXQ7CisgIH0KKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9PYmplY3QqPiBuZXdfb2Jqc19hcnJheTsKKyAgRlhfQk9PTCBiUmV0ID0gSXNPYmplY3RzQXZhaWwobV9vYmpzX2FycmF5LCBGQUxTRSwgcEhpbnRzLCBuZXdfb2Jqc19hcnJheSk7CisgIG1fb2Jqc19hcnJheS5SZW1vdmVBbGwoKTsKKyAgaWYgKCFiUmV0KSB7CisgICAgbV9vYmpzX2FycmF5LkFwcGVuZChuZXdfb2Jqc19hcnJheSk7CisgIH0KKyAgcmV0dXJuIGJSZXQ7Cit9Cit2b2lkIENQREZfRGF0YUF2YWlsOjpHZXRMaW5lYXJpemVkTWFpblhSZWZJbmZvKEZYX0ZJTEVTSVpFKiBwUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcFNpemUpIHsKKyAgaWYgKHBQb3MpIHsKKyAgICAqcFBvcyA9IG1fZHdMYXN0WFJlZk9mZnNldDsKKyAgfQorICBpZiAocFNpemUpIHsKKyAgICAqcFNpemUgPSAoRlhfRFdPUkQpKG1fZHdGaWxlTGVuIC0gbV9kd0xhc3RYUmVmT2Zmc2V0KTsKKyAgfQorfQoraW50IENQREZfRGF0YUF2YWlsOjpHZXRQYWdlQ291bnQoKSBjb25zdCB7CisgIGlmIChtX3BMaW5lYXJpemVkKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcExpbmVhcml6ZWQtPkdldERpY3QoKTsKKyAgICBDUERGX09iamVjdCogcE9iaiA9IHBEaWN0ID8gcERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiTiIpIDogbnVsbHB0cjsKKyAgICByZXR1cm4gcE9iaiA/IHBPYmotPkdldEludGVnZXIoKSA6IDA7CisgIH0KKyAgcmV0dXJuIG1fcERvY3VtZW50ID8gbV9wRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpIDogMDsKK30KK0NQREZfRGljdGlvbmFyeSogQ1BERl9EYXRhQXZhaWw6OkdldFBhZ2UoaW50IGluZGV4KSB7CisgIGlmICghbV9wRG9jdW1lbnQgfHwgaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMtPkdldFBhZ2VDb3VudCgpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgaWYgKG1fcExpbmVhcml6ZWQpIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wTGluZWFyaXplZC0+R2V0RGljdCgpOworICAgIENQREZfT2JqZWN0KiBwT2JqID0gcERpY3QgPyBwRGljdC0+R2V0RWxlbWVudFZhbHVlKCJQIikgOiBudWxscHRyOworICAgIGludCBwYWdlTnVtID0gcE9iaiA/IHBPYmotPkdldEludGVnZXIoKSA6IDA7CisgICAgaWYgKG1fcEhpbnRUYWJsZXMgJiYgaW5kZXggIT0gcGFnZU51bSkgeworICAgICAgRlhfRklMRVNJWkUgc3pQYWdlU3RhcnRQb3MgPSAwOworICAgICAgRlhfRklMRVNJWkUgc3pQYWdlTGVuZ3RoID0gMDsKKyAgICAgIEZYX0RXT1JEIGR3T2JqTnVtID0gMDsKKyAgICAgIEZYX0JPT0wgYlBhZ2VQb3NHb3QgPSBtX3BIaW50VGFibGVzLT5HZXRQYWdlUG9zKGluZGV4LCBzelBhZ2VTdGFydFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6UGFnZUxlbmd0aCwgZHdPYmpOdW0pOworICAgICAgaWYgKCFiUGFnZVBvc0dvdCkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIH0KKyAgICAgIG1fc3ludGF4UGFyc2VyLkluaXRQYXJzZXIobV9wRmlsZVJlYWQsIChGWF9EV09SRClzelBhZ2VTdGFydFBvcyk7CisgICAgICBDUERGX09iamVjdCogcFBhZ2VEaWN0ID0gUGFyc2VJbmRpcmVjdE9iamVjdEF0KDAsIGR3T2JqTnVtLCBtX3BEb2N1bWVudCk7CisgICAgICBpZiAoIXBQYWdlRGljdCkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIH0KKyAgICAgIGlmICghbV9wRG9jdW1lbnQtPkluc2VydEluZGlyZWN0T2JqZWN0KGR3T2JqTnVtLCBwUGFnZURpY3QpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIHJldHVybiBwUGFnZURpY3QtPkdldERpY3QoKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG1fcERvY3VtZW50LT5HZXRQYWdlKGluZGV4KTsKK30KK0lQREZfRGF0YUF2YWlsOjpEb2NGb3JtU3RhdHVzIENQREZfRGF0YUF2YWlsOjpJc0Zvcm1BdmFpbCgKKyAgICBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIGlmICghbV9wRG9jdW1lbnQpIHsKKyAgICByZXR1cm4gRm9ybUF2YWlsYWJsZTsKKyAgfQorICBpZiAoIW1fYkxpbmVhcml6ZWRGb3JtUGFyYW1Mb2FkKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IG1fcERvY3VtZW50LT5HZXRSb290KCk7CisgICAgaWYgKCFwUm9vdCkgeworICAgICAgcmV0dXJuIEZvcm1BdmFpbGFibGU7CisgICAgfQorICAgIENQREZfT2JqZWN0KiBwQWNyb0Zvcm0gPSBwUm9vdC0+R2V0RWxlbWVudCgiQWNyb0Zvcm0iKTsKKyAgICBpZiAoIXBBY3JvRm9ybSkgeworICAgICAgcmV0dXJuIEZvcm1Ob3RFeGlzdDsKKyAgICB9CisgICAgRG9jQXZhaWxTdGF0dXMgbkRvY1N0YXR1cyA9IENoZWNrTGluZWFyaXplZERhdGEocEhpbnRzKTsKKyAgICBpZiAobkRvY1N0YXR1cyA9PSBEYXRhRXJyb3IpCisgICAgICByZXR1cm4gRm9ybUVycm9yOworICAgIGlmIChuRG9jU3RhdHVzID09IERhdGFOb3RBdmFpbGFibGUpCisgICAgICByZXR1cm4gRm9ybU5vdEF2YWlsYWJsZTsKKworICAgIGlmICghbV9vYmpzX2FycmF5LkdldFNpemUoKSkgeworICAgICAgbV9vYmpzX2FycmF5LkFkZChwQWNyb0Zvcm0tPkdldERpY3QoKSk7CisgICAgfQorICAgIG1fYkxpbmVhcml6ZWRGb3JtUGFyYW1Mb2FkID0gVFJVRTsKKyAgfQorICBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX09iamVjdCo+IG5ld19vYmpzX2FycmF5OworICBGWF9CT09MIGJSZXQgPSBJc09iamVjdHNBdmFpbChtX29ianNfYXJyYXksIEZBTFNFLCBwSGludHMsIG5ld19vYmpzX2FycmF5KTsKKyAgbV9vYmpzX2FycmF5LlJlbW92ZUFsbCgpOworICBpZiAoIWJSZXQpIHsKKyAgICBtX29ianNfYXJyYXkuQXBwZW5kKG5ld19vYmpzX2FycmF5KTsKKyAgICByZXR1cm4gRm9ybU5vdEF2YWlsYWJsZTsKKyAgfQorICByZXR1cm4gRm9ybUF2YWlsYWJsZTsKK30KKworQ1BERl9QYWdlTm9kZTo6fkNQREZfUGFnZU5vZGUoKSB7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fY2hpbGROb2RlLkdldFNpemUoKTsgKytpKSB7CisgICAgZGVsZXRlIG1fY2hpbGROb2RlW2ldOworICB9CisgIG1fY2hpbGROb2RlLlJlbW92ZUFsbCgpOworfQorQ1BERl9IaW50VGFibGVzOjp+Q1BERl9IaW50VGFibGVzKCkgeworICBtX2R3RGVsdGFOT2Jqc0FycmF5LlJlbW92ZUFsbCgpOworICBtX2R3TlNoYXJlZE9ianNBcnJheS5SZW1vdmVBbGwoKTsKKyAgbV9kd1NoYXJlZE9iak51bUFycmF5LlJlbW92ZUFsbCgpOworICBtX2R3SWRlbnRpZmllckFycmF5LlJlbW92ZUFsbCgpOworICBtX3N6UGFnZU9mZnNldEFycmF5LlJlbW92ZUFsbCgpOworICBtX3N6U2hhcmVkT2JqT2Zmc2V0QXJyYXkuUmVtb3ZlQWxsKCk7Cit9CitGWF9EV09SRCBDUERGX0hpbnRUYWJsZXM6OkdldEl0ZW1MZW5ndGgoaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9GaWxlU2l6ZUFycmF5JiBzekFycmF5KSB7CisgIGlmIChpbmRleCA8IDAgfHwgc3pBcnJheS5HZXRTaXplKCkgPCAyIHx8IGluZGV4ID4gc3pBcnJheS5HZXRTaXplKCkgLSAyIHx8CisgICAgICBzekFycmF5W2luZGV4XSA+IHN6QXJyYXlbaW5kZXggKyAxXSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIHN6QXJyYXlbaW5kZXggKyAxXSAtIHN6QXJyYXlbaW5kZXhdOworfQorRlhfQk9PTCBDUERGX0hpbnRUYWJsZXM6OlJlYWRQYWdlSGludFRhYmxlKENGWF9CaXRTdHJlYW0qIGhTdHJlYW0pIHsKKyAgaWYgKCFoU3RyZWFtIHx8IGhTdHJlYW0tPklzRU9GKCkpCiAgICAgcmV0dXJuIEZBTFNFOwotfQotQ1BERl9QYWdlTm9kZTo6fkNQREZfUGFnZU5vZGUoKQotewotICAgIEZYX0lOVDMyIGlTaXplID0gbV9jaGlsZE5vZGUuR2V0U2l6ZSgpOwotICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpU2l6ZTsgKytpKSB7Ci0gICAgICAgIENQREZfUGFnZU5vZGUgKnBOb2RlID0gKENQREZfUGFnZU5vZGUqKW1fY2hpbGROb2RlW2ldOwotICAgICAgICBpZiAocE5vZGUpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwTm9kZTsKLSAgICAgICAgfQorICBpbnQgblN0cmVhbU9mZnNldCA9IFJlYWRQcmltYXJ5SGludFN0cmVhbU9mZnNldCgpOworICBpbnQgblN0cmVhbUxlbiA9IFJlYWRQcmltYXJ5SGludFN0cmVhbUxlbmd0aCgpOworICBpZiAoblN0cmVhbU9mZnNldCA8IDAgfHwgblN0cmVhbUxlbiA8IDEpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGNvbnN0IEZYX0RXT1JEIGtIZWFkZXJTaXplID0gMjg4OworICBpZiAoaFN0cmVhbS0+Qml0c1JlbWFpbmluZygpIDwga0hlYWRlclNpemUpCisgICAgcmV0dXJuIEZBTFNFOworICAvLyBJdGVtIDE6IFRoZSBsZWFzdCBudW1iZXIgb2Ygb2JqZWN0cyBpbiBhIHBhZ2UuCisgIEZYX0RXT1JEIGR3T2JqTGVhc3ROdW0gPSBoU3RyZWFtLT5HZXRCaXRzKDMyKTsKKyAgLy8gSXRlbSAyOiBUaGUgbG9jYXRpb24gb2YgdGhlIGZpcnN0IHBhZ2UncyBwYWdlIG9iamVjdC4KKyAgRlhfRFdPUkQgZHdGaXJzdE9iakxvYyA9IGhTdHJlYW0tPkdldEJpdHMoMzIpOworICBpZiAoZHdGaXJzdE9iakxvYyA+IG5TdHJlYW1PZmZzZXQpIHsKKyAgICBGWF9TQUZFX0RXT1JEIHNhZmVMb2MgPSBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxGWF9EV09SRD4oblN0cmVhbUxlbik7CisgICAgc2FmZUxvYyArPSBkd0ZpcnN0T2JqTG9jOworICAgIGlmICghc2FmZUxvYy5Jc1ZhbGlkKCkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgbV9zekZpcnN0UGFnZU9iak9mZnNldCA9CisgICAgICAgIHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PEZYX0ZJTEVTSVpFPihzYWZlTG9jLlZhbHVlT3JEaWUoKSk7CisgIH0gZWxzZSB7CisgICAgbV9zekZpcnN0UGFnZU9iak9mZnNldCA9CisgICAgICAgIHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PEZYX0ZJTEVTSVpFPihkd0ZpcnN0T2JqTG9jKTsKKyAgfQorICAvLyBJdGVtIDM6IFRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8gcmVwcmVzZW50IHRoZSBkaWZmZXJlbmNlCisgIC8vIGJldHdlZW4gdGhlIGdyZWF0ZXN0IGFuZCBsZWFzdCBudW1iZXIgb2Ygb2JqZWN0cyBpbiBhIHBhZ2UuCisgIEZYX0RXT1JEIGR3RGVsdGFPYmplY3RzQml0cyA9IGhTdHJlYW0tPkdldEJpdHMoMTYpOworICAvLyBJdGVtIDQ6IFRoZSBsZWFzdCBsZW5ndGggb2YgYSBwYWdlIGluIGJ5dGVzLgorICBGWF9EV09SRCBkd1BhZ2VMZWFzdExlbiA9IGhTdHJlYW0tPkdldEJpdHMoMzIpOworICAvLyBJdGVtIDU6IFRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8gcmVwcmVzZW50IHRoZSBkaWZmZXJlbmNlCisgIC8vIGJldHdlZW4gdGhlIGdyZWF0ZXN0IGFuZCBsZWFzdCBsZW5ndGggb2YgYSBwYWdlLCBpbiBieXRlcy4KKyAgRlhfRFdPUkQgZHdEZWx0YVBhZ2VMZW5CaXRzID0gaFN0cmVhbS0+R2V0Qml0cygxNik7CisgIC8vIFNraXAgSXRlbSA2LCA3LCA4LCA5IHRvdGFsIDk2IGJpdHMuCisgIGhTdHJlYW0tPlNraXBCaXRzKDk2KTsKKyAgLy8gSXRlbSAxMDogVGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgdGhlIGdyZWF0ZXN0CisgIC8vIG51bWJlciBvZiBzaGFyZWQgb2JqZWN0IHJlZmVyZW5jZXMuCisgIEZYX0RXT1JEIGR3U2hhcmVkT2JqQml0cyA9IGhTdHJlYW0tPkdldEJpdHMoMTYpOworICAvLyBJdGVtIDExOiBUaGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIHJlcHJlc2VudCB0aGUgbnVtZXJpY2FsbHkKKyAgLy8gZ3JlYXRlc3Qgc2hhcmVkIG9iamVjdCBpZGVudGlmaWVyIHVzZWQgYnkgdGhlIHBhZ2VzLgorICBGWF9EV09SRCBkd1NoYXJlZElkQml0cyA9IGhTdHJlYW0tPkdldEJpdHMoMTYpOworICAvLyBJdGVtIDEyOiBUaGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIHJlcHJlc2VudCB0aGUgbnVtZXJhdG9yIG9mCisgIC8vIHRoZSBmcmFjdGlvbmFsIHBvc2l0aW9uIGZvciBlYWNoIHNoYXJlZCBvYmplY3QgcmVmZXJlbmNlLiBGb3IgZWFjaAorICAvLyBzaGFyZWQgb2JqZWN0IHJlZmVyZW5jZWQgZnJvbSBhIHBhZ2UsIHRoZXJlIGlzIGFuIGluZGljYXRpb24gb2YKKyAgLy8gd2hlcmUgaW4gdGhlIHBhZ2UncyBjb250ZW50IHN0cmVhbSB0aGUgb2JqZWN0IGlzIGZpcnN0IHJlZmVyZW5jZWQuCisgIEZYX0RXT1JEIGR3U2hhcmVkTnVtZXJhdG9yQml0cyA9IGhTdHJlYW0tPkdldEJpdHMoMTYpOworICAvLyBJdGVtIDEzOiBTa2lwIEl0ZW0gMTMgd2hpY2ggaGFzIDE2IGJpdHMuCisgIGhTdHJlYW0tPlNraXBCaXRzKDE2KTsKKyAgQ1BERl9PYmplY3QqIHBQYWdlTnVtID0gbV9wTGluZWFyaXplZERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiTiIpOworICBpbnQgblBhZ2VzID0gcFBhZ2VOdW0gPyBwUGFnZU51bS0+R2V0SW50ZWdlcigpIDogMDsKKyAgaWYgKG5QYWdlcyA8IDEpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEZYX1NBRkVfRFdPUkQgcmVxdWlyZWRfYml0cyA9IGR3RGVsdGFPYmplY3RzQml0czsKKyAgcmVxdWlyZWRfYml0cyAqPSBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxGWF9EV09SRD4oblBhZ2VzKTsKKyAgaWYgKCFDYW5SZWFkRnJvbUJpdFN0cmVhbShoU3RyZWFtLCByZXF1aXJlZF9iaXRzKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgblBhZ2VzOyArK2kpIHsKKyAgICBGWF9TQUZFX0RXT1JEIHNhZmVEZWx0YU9iaiA9IGhTdHJlYW0tPkdldEJpdHMoZHdEZWx0YU9iamVjdHNCaXRzKTsKKyAgICBzYWZlRGVsdGFPYmogKz0gZHdPYmpMZWFzdE51bTsKKyAgICBpZiAoIXNhZmVEZWx0YU9iai5Jc1ZhbGlkKCkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgbV9kd0RlbHRhTk9ianNBcnJheS5BZGQoc2FmZURlbHRhT2JqLlZhbHVlT3JEaWUoKSk7CisgIH0KKyAgaFN0cmVhbS0+Qnl0ZUFsaWduKCk7CisKKyAgcmVxdWlyZWRfYml0cyA9IGR3RGVsdGFQYWdlTGVuQml0czsKKyAgcmVxdWlyZWRfYml0cyAqPSBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxGWF9EV09SRD4oblBhZ2VzKTsKKyAgaWYgKCFDYW5SZWFkRnJvbUJpdFN0cmVhbShoU3RyZWFtLCByZXF1aXJlZF9iaXRzKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIENGWF9EV29yZEFycmF5IGR3UGFnZUxlbkFycmF5OworICBmb3IgKGludCBpID0gMDsgaSA8IG5QYWdlczsgKytpKSB7CisgICAgRlhfU0FGRV9EV09SRCBzYWZlUGFnZUxlbiA9IGhTdHJlYW0tPkdldEJpdHMoZHdEZWx0YVBhZ2VMZW5CaXRzKTsKKyAgICBzYWZlUGFnZUxlbiArPSBkd1BhZ2VMZWFzdExlbjsKKyAgICBpZiAoIXNhZmVQYWdlTGVuLklzVmFsaWQoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBkd1BhZ2VMZW5BcnJheS5BZGQoc2FmZVBhZ2VMZW4uVmFsdWVPckRpZSgpKTsKKyAgfQorICBDUERGX09iamVjdCogcE9mZnNldEUgPSBtX3BMaW5lYXJpemVkRGljdC0+R2V0RWxlbWVudFZhbHVlKCJFIik7CisgIGludCBuT2Zmc2V0RSA9IHBPZmZzZXRFID8gcE9mZnNldEUtPkdldEludGVnZXIoKSA6IC0xOworICBpZiAobk9mZnNldEUgPCAwKQorICAgIHJldHVybiBGQUxTRTsKKyAgQ1BERl9PYmplY3QqIHBGaXJzdFBhZ2VOdW0gPSBtX3BMaW5lYXJpemVkRGljdC0+R2V0RWxlbWVudFZhbHVlKCJQIik7CisgIGludCBuRmlyc3RQYWdlTnVtID0gcEZpcnN0UGFnZU51bSA/IHBGaXJzdFBhZ2VOdW0tPkdldEludGVnZXIoKSA6IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgblBhZ2VzOyArK2kpIHsKKyAgICBpZiAoaSA9PSBuRmlyc3RQYWdlTnVtKSB7CisgICAgICBtX3N6UGFnZU9mZnNldEFycmF5LkFkZChtX3N6Rmlyc3RQYWdlT2JqT2Zmc2V0KTsKKyAgICB9IGVsc2UgaWYgKGkgPT0gbkZpcnN0UGFnZU51bSArIDEpIHsKKyAgICAgIGlmIChpID09IDEpIHsKKyAgICAgICAgbV9zelBhZ2VPZmZzZXRBcnJheS5BZGQobk9mZnNldEUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbV9zelBhZ2VPZmZzZXRBcnJheS5BZGQobV9zelBhZ2VPZmZzZXRBcnJheVtpIC0gMl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1BhZ2VMZW5BcnJheVtpIC0gMl0pOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgIG1fc3pQYWdlT2Zmc2V0QXJyYXkuQWRkKG5PZmZzZXRFKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fc3pQYWdlT2Zmc2V0QXJyYXkuQWRkKG1fc3pQYWdlT2Zmc2V0QXJyYXlbaSAtIDFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdQYWdlTGVuQXJyYXlbaSAtIDFdKTsKKyAgICAgIH0KICAgICB9Ci0gICAgbV9jaGlsZE5vZGUuUmVtb3ZlQWxsKCk7CisgIH0KKyAgaWYgKG5QYWdlcyA+IDApIHsKKyAgICBtX3N6UGFnZU9mZnNldEFycmF5LkFkZChtX3N6UGFnZU9mZnNldEFycmF5W25QYWdlcyAtIDFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1BhZ2VMZW5BcnJheVtuUGFnZXMgLSAxXSk7CisgIH0KKyAgaFN0cmVhbS0+Qnl0ZUFsaWduKCk7CisKKyAgLy8gbnVtYmVyIG9mIHNoYXJlZCBvYmplY3RzCisgIHJlcXVpcmVkX2JpdHMgPSBkd1NoYXJlZE9iakJpdHM7CisgIHJlcXVpcmVkX2JpdHMgKj0gcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlhfRFdPUkQ+KG5QYWdlcyk7CisgIGlmICghQ2FuUmVhZEZyb21CaXRTdHJlYW0oaFN0cmVhbSwgcmVxdWlyZWRfYml0cykpCisgICAgcmV0dXJuIEZBTFNFOworICBmb3IgKGludCBpID0gMDsgaSA8IG5QYWdlczsgaSsrKSB7CisgICAgbV9kd05TaGFyZWRPYmpzQXJyYXkuQWRkKGhTdHJlYW0tPkdldEJpdHMoZHdTaGFyZWRPYmpCaXRzKSk7CisgIH0KKyAgaFN0cmVhbS0+Qnl0ZUFsaWduKCk7CisKKyAgLy8gYXJyYXkgb2YgaWRlbnRpZmllciwgc2l6ZXMgPSBuc2hhcmVkX29iamVjdHMKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuUGFnZXM7IGkrKykgeworICAgIHJlcXVpcmVkX2JpdHMgPSBkd1NoYXJlZElkQml0czsKKyAgICByZXF1aXJlZF9iaXRzICo9IG1fZHdOU2hhcmVkT2Jqc0FycmF5W2ldOworICAgIGlmICghQ2FuUmVhZEZyb21CaXRTdHJlYW0oaFN0cmVhbSwgcmVxdWlyZWRfYml0cykpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtX2R3TlNoYXJlZE9ianNBcnJheVtpXTsgaisrKSB7CisgICAgICBtX2R3SWRlbnRpZmllckFycmF5LkFkZChoU3RyZWFtLT5HZXRCaXRzKGR3U2hhcmVkSWRCaXRzKSk7CisgICAgfQorICB9CisgIGhTdHJlYW0tPkJ5dGVBbGlnbigpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgblBhZ2VzOyBpKyspIHsKKyAgICBGWF9TQUZFX0RXT1JEIHNhZmVTaXplID0gbV9kd05TaGFyZWRPYmpzQXJyYXlbaV07CisgICAgc2FmZVNpemUgKj0gZHdTaGFyZWROdW1lcmF0b3JCaXRzOworICAgIGlmICghQ2FuUmVhZEZyb21CaXRTdHJlYW0oaFN0cmVhbSwgc2FmZVNpemUpKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIGhTdHJlYW0tPlNraXBCaXRzKHNhZmVTaXplLlZhbHVlT3JEaWUoKSk7CisgIH0KKyAgaFN0cmVhbS0+Qnl0ZUFsaWduKCk7CisKKyAgRlhfU0FGRV9EV09SRCBzYWZlVG90YWxQYWdlTGVuID0gcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlhfRFdPUkQ+KG5QYWdlcyk7CisgIHNhZmVUb3RhbFBhZ2VMZW4gKj0gZHdEZWx0YVBhZ2VMZW5CaXRzOworICBpZiAoIUNhblJlYWRGcm9tQml0U3RyZWFtKGhTdHJlYW0sIHNhZmVUb3RhbFBhZ2VMZW4pKQorICAgIHJldHVybiBGQUxTRTsKKyAgaFN0cmVhbS0+U2tpcEJpdHMoc2FmZVRvdGFsUGFnZUxlbi5WYWx1ZU9yRGllKCkpOworICBoU3RyZWFtLT5CeXRlQWxpZ24oKTsKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENQREZfSGludFRhYmxlczo6UmVhZFNoYXJlZE9iakhpbnRUYWJsZShDRlhfQml0U3RyZWFtKiBoU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgb2Zmc2V0KSB7CisgIGlmICghaFN0cmVhbSB8fCBoU3RyZWFtLT5Jc0VPRigpKQorICAgIHJldHVybiBGQUxTRTsKKyAgaW50IG5TdHJlYW1PZmZzZXQgPSBSZWFkUHJpbWFyeUhpbnRTdHJlYW1PZmZzZXQoKTsKKyAgaW50IG5TdHJlYW1MZW4gPSBSZWFkUHJpbWFyeUhpbnRTdHJlYW1MZW5ndGgoKTsKKyAgaWYgKG5TdHJlYW1PZmZzZXQgPCAwIHx8IG5TdHJlYW1MZW4gPCAxKQorICAgIHJldHVybiBGQUxTRTsKKworICBGWF9TQUZFX0RXT1JEIGJpdF9vZmZzZXQgPSBvZmZzZXQ7CisgIGJpdF9vZmZzZXQgKj0gODsKKyAgaWYgKCFiaXRfb2Zmc2V0LklzVmFsaWQoKSB8fCBoU3RyZWFtLT5HZXRQb3MoKSA+IGJpdF9vZmZzZXQuVmFsdWVPckRpZSgpKQorICAgIHJldHVybiBGQUxTRTsKKyAgaFN0cmVhbS0+U2tpcEJpdHMoYml0X29mZnNldC5WYWx1ZU9yRGllKCkgLSBoU3RyZWFtLT5HZXRQb3MoKSk7CisKKyAgY29uc3QgRlhfRFdPUkQga0hlYWRlclNpemUgPSAxOTI7CisgIGlmIChoU3RyZWFtLT5CaXRzUmVtYWluaW5nKCkgPCBrSGVhZGVyU2l6ZSkKKyAgICByZXR1cm4gRkFMU0U7CisgIC8vIEl0ZW0gMTogVGhlIG9iamVjdCBudW1iZXIgb2YgdGhlIGZpcnN0IG9iamVjdCBpbiB0aGUgc2hhcmVkIG9iamVjdHMKKyAgLy8gc2VjdGlvbi4KKyAgRlhfRFdPUkQgZHdGaXJzdFNoYXJlZE9iak51bSA9IGhTdHJlYW0tPkdldEJpdHMoMzIpOworICAvLyBJdGVtIDI6IFRoZSBsb2NhdGlvbiBvZiB0aGUgZmlyc3Qgb2JqZWN0IGluIHRoZSBzaGFyZWQgb2JqZWN0cyBzZWN0aW9uLgorICBGWF9EV09SRCBkd0ZpcnN0U2hhcmVkT2JqTG9jID0gaFN0cmVhbS0+R2V0Qml0cygzMik7CisgIGlmIChkd0ZpcnN0U2hhcmVkT2JqTG9jID4gblN0cmVhbU9mZnNldCkKKyAgICBkd0ZpcnN0U2hhcmVkT2JqTG9jICs9IG5TdHJlYW1MZW47CisgIC8vIEl0ZW0gMzogVGhlIG51bWJlciBvZiBzaGFyZWQgb2JqZWN0IGVudHJpZXMgZm9yIHRoZSBmaXJzdCBwYWdlLgorICBtX25GaXJzdFBhZ2VTaGFyZWRPYmpzID0gaFN0cmVhbS0+R2V0Qml0cygzMik7CisgIC8vIEl0ZW0gNDogVGhlIG51bWJlciBvZiBzaGFyZWQgb2JqZWN0IGVudHJpZXMgZm9yIHRoZSBzaGFyZWQgb2JqZWN0cworICAvLyBzZWN0aW9uLCBpbmNsdWRpbmcgdGhlIG51bWJlciBvZiBzaGFyZWQgb2JqZWN0IGVudHJpZXMgZm9yIHRoZSBmaXJzdCBwYWdlLgorICBGWF9EV09SRCBkd1NoYXJlZE9ialRvdGFsID0gaFN0cmVhbS0+R2V0Qml0cygzMik7CisgIC8vIEl0ZW0gNTogVGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgdGhlIGdyZWF0ZXN0IG51bWJlciBvZgorICAvLyBvYmplY3RzIGluIGEgc2hhcmVkIG9iamVjdCBncm91cC4gU2tpcHBlZC4KKyAgaFN0cmVhbS0+U2tpcEJpdHMoMTYpOworICAvLyBJdGVtIDY6IFRoZSBsZWFzdCBsZW5ndGggb2YgYSBzaGFyZWQgb2JqZWN0IGdyb3VwIGluIGJ5dGVzLgorICBGWF9EV09SRCBkd0dyb3VwTGVhc3RMZW4gPSBoU3RyZWFtLT5HZXRCaXRzKDMyKTsKKyAgLy8gSXRlbSA3OiBUaGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIHJlcHJlc2VudCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQorICAvLyBncmVhdGVzdCBhbmQgbGVhc3QgbGVuZ3RoIG9mIGEgc2hhcmVkIG9iamVjdCBncm91cCwgaW4gYnl0ZXMuCisgIEZYX0RXT1JEIGR3RGVsdGFHcm91cExlbiA9IGhTdHJlYW0tPkdldEJpdHMoMTYpOworICBDUERGX09iamVjdCogcEZpcnN0UGFnZU9iaiA9IG1fcExpbmVhcml6ZWREaWN0LT5HZXRFbGVtZW50VmFsdWUoIk8iKTsKKyAgaW50IG5GaXJzdFBhZ2VPYmpOdW0gPSBwRmlyc3RQYWdlT2JqID8gcEZpcnN0UGFnZU9iai0+R2V0SW50ZWdlcigpIDogLTE7CisgIGlmIChuRmlyc3RQYWdlT2JqTnVtIDwgMCkKKyAgICByZXR1cm4gRkFMU0U7CisgIEZYX0RXT1JEIGR3UHJldk9iakxlbiA9IDA7CisgIEZYX0RXT1JEIGR3Q3VyT2JqTGVuID0gMDsKKyAgRlhfU0FGRV9EV09SRCByZXF1aXJlZF9iaXRzID0gZHdTaGFyZWRPYmpUb3RhbDsKKyAgcmVxdWlyZWRfYml0cyAqPSBkd0RlbHRhR3JvdXBMZW47CisgIGlmICghQ2FuUmVhZEZyb21CaXRTdHJlYW0oaFN0cmVhbSwgcmVxdWlyZWRfYml0cykpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZHdTaGFyZWRPYmpUb3RhbDsgKytpKSB7CisgICAgZHdQcmV2T2JqTGVuID0gZHdDdXJPYmpMZW47CisgICAgRlhfU0FGRV9EV09SRCBzYWZlT2JqTGVuID0gaFN0cmVhbS0+R2V0Qml0cyhkd0RlbHRhR3JvdXBMZW4pOworICAgIHNhZmVPYmpMZW4gKz0gZHdHcm91cExlYXN0TGVuOworICAgIGlmICghc2FmZU9iakxlbi5Jc1ZhbGlkKCkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgZHdDdXJPYmpMZW4gPSBzYWZlT2JqTGVuLlZhbHVlT3JEaWUoKTsKKyAgICBpZiAoaSA8IG1fbkZpcnN0UGFnZVNoYXJlZE9ianMpIHsKKyAgICAgIG1fZHdTaGFyZWRPYmpOdW1BcnJheS5BZGQobkZpcnN0UGFnZU9iak51bSArIGkpOworICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgbV9zelNoYXJlZE9iak9mZnNldEFycmF5LkFkZChtX3N6Rmlyc3RQYWdlT2JqT2Zmc2V0KTsKKyAgICB9IGVsc2UgeworICAgICAgRlhfU0FGRV9EV09SRCBzYWZlT2JqTnVtID0gZHdGaXJzdFNoYXJlZE9iak51bTsKKyAgICAgIHNhZmVPYmpOdW0gKz0gaSAtIG1fbkZpcnN0UGFnZVNoYXJlZE9ianM7CisgICAgICBpZiAoIXNhZmVPYmpOdW0uSXNWYWxpZCgpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBtX2R3U2hhcmVkT2JqTnVtQXJyYXkuQWRkKHNhZmVPYmpOdW0uVmFsdWVPckRpZSgpKTsKKyAgICAgIGlmIChpID09IG1fbkZpcnN0UGFnZVNoYXJlZE9ianMpCisgICAgICAgIG1fc3pTaGFyZWRPYmpPZmZzZXRBcnJheS5BZGQoCisgICAgICAgICAgICBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxpbnQzMl90Pihkd0ZpcnN0U2hhcmVkT2JqTG9jKSk7CisgICAgfQorICAgIGlmIChpICE9IDAgJiYgaSAhPSBtX25GaXJzdFBhZ2VTaGFyZWRPYmpzKSB7CisgICAgICBGWF9TQUZFX0lOVDMyIHNhZmVMb2MgPSBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxpbnQzMl90Pihkd1ByZXZPYmpMZW4pOworICAgICAgc2FmZUxvYyArPSBtX3N6U2hhcmVkT2JqT2Zmc2V0QXJyYXlbaSAtIDFdOworICAgICAgaWYgKCFzYWZlTG9jLklzVmFsaWQoKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgbV9zelNoYXJlZE9iak9mZnNldEFycmF5LkFkZChzYWZlTG9jLlZhbHVlT3JEaWUoKSk7CisgICAgfQorICB9CisgIGlmIChkd1NoYXJlZE9ialRvdGFsID4gMCkgeworICAgIEZYX1NBRkVfSU5UMzIgc2FmZUxvYyA9IHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PGludDMyX3Q+KGR3Q3VyT2JqTGVuKTsKKyAgICBzYWZlTG9jICs9IG1fc3pTaGFyZWRPYmpPZmZzZXRBcnJheVtkd1NoYXJlZE9ialRvdGFsIC0gMV07CisgICAgaWYgKCFzYWZlTG9jLklzVmFsaWQoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBtX3N6U2hhcmVkT2JqT2Zmc2V0QXJyYXkuQWRkKHNhZmVMb2MuVmFsdWVPckRpZSgpKTsKKyAgfQorICBoU3RyZWFtLT5CeXRlQWxpZ24oKTsKKyAgaWYgKGhTdHJlYW0tPkJpdHNSZW1haW5pbmcoKSA8IGR3U2hhcmVkT2JqVG90YWwpCisgICAgcmV0dXJuIEZBTFNFOworICBoU3RyZWFtLT5Ta2lwQml0cyhkd1NoYXJlZE9ialRvdGFsKTsKKyAgaFN0cmVhbS0+Qnl0ZUFsaWduKCk7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUERGX0hpbnRUYWJsZXM6OkdldFBhZ2VQb3MoaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUmIHN6UGFnZVN0YXJ0UG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUmIHN6UGFnZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkd09iak51bSkgeworICBpZiAoIW1fcExpbmVhcml6ZWREaWN0KQorICAgIHJldHVybiBGQUxTRTsKKyAgc3pQYWdlU3RhcnRQb3MgPSBtX3N6UGFnZU9mZnNldEFycmF5W2luZGV4XTsKKyAgc3pQYWdlTGVuZ3RoID0gR2V0SXRlbUxlbmd0aChpbmRleCwgbV9zelBhZ2VPZmZzZXRBcnJheSk7CisgIENQREZfT2JqZWN0KiBwRmlyc3RQYWdlTnVtID0gbV9wTGluZWFyaXplZERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiUCIpOworICBpbnQgbkZpcnN0UGFnZU51bSA9IHBGaXJzdFBhZ2VOdW0gPyBwRmlyc3RQYWdlTnVtLT5HZXRJbnRlZ2VyKCkgOiAwOworICBDUERGX09iamVjdCogcEZpcnN0UGFnZU9iak51bSA9IG1fcExpbmVhcml6ZWREaWN0LT5HZXRFbGVtZW50VmFsdWUoIk8iKTsKKyAgaWYgKCFwRmlyc3RQYWdlT2JqTnVtKQorICAgIHJldHVybiBGQUxTRTsKKyAgaW50IG5GaXJzdFBhZ2VPYmpOdW0gPSBwRmlyc3RQYWdlT2JqTnVtLT5HZXRJbnRlZ2VyKCk7CisgIGlmIChpbmRleCA9PSBuRmlyc3RQYWdlTnVtKSB7CisgICAgZHdPYmpOdW0gPSBuRmlyc3RQYWdlT2JqTnVtOworICAgIHJldHVybiBUUlVFOworICB9CisgIC8vIFRoZSBvYmplY3QgbnVtYmVyIG9mIHJlbWFpbmluZyBwYWdlcyBzdGFydHMgZnJvbSAxLgorICBkd09iak51bSA9IDE7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXg7ICsraSkgeworICAgIGlmIChpID09IG5GaXJzdFBhZ2VOdW0pCisgICAgICBjb250aW51ZTsKKyAgICBkd09iak51bSArPSBtX2R3RGVsdGFOT2Jqc0FycmF5W2ldOworICB9CisgIHJldHVybiBUUlVFOworfQorSVBERl9EYXRhQXZhaWw6OkRvY0F2YWlsU3RhdHVzIENQREZfSGludFRhYmxlczo6Q2hlY2tQYWdlKAorICAgIGludCBpbmRleCwKKyAgICBJRlhfRG93bmxvYWRIaW50cyogcEhpbnRzKSB7CisgIGlmICghbV9wTGluZWFyaXplZERpY3QgfHwgIXBIaW50cykKKyAgICByZXR1cm4gSVBERl9EYXRhQXZhaWw6OkRhdGFFcnJvcjsKKyAgQ1BERl9PYmplY3QqIHBGaXJzdEF2YWlsUGFnZSA9IG1fcExpbmVhcml6ZWREaWN0LT5HZXRFbGVtZW50VmFsdWUoIlAiKTsKKyAgaW50IG5GaXJzdEF2YWlsUGFnZSA9IHBGaXJzdEF2YWlsUGFnZSA/IHBGaXJzdEF2YWlsUGFnZS0+R2V0SW50ZWdlcigpIDogMDsKKyAgaWYgKGluZGV4ID09IG5GaXJzdEF2YWlsUGFnZSkKKyAgICByZXR1cm4gSVBERl9EYXRhQXZhaWw6OkRhdGFBdmFpbGFibGU7CisgIEZYX0RXT1JEIGR3TGVuZ3RoID0gR2V0SXRlbUxlbmd0aChpbmRleCwgbV9zelBhZ2VPZmZzZXRBcnJheSk7CisgIC8vIElmIHR3byBwYWdlcyBoYXZlIHRoZSBzYW1lIG9mZnNldCwgaXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYW4gZXJyb3IuCisgIGlmICghZHdMZW5ndGgpCisgICAgcmV0dXJuIElQREZfRGF0YUF2YWlsOjpEYXRhRXJyb3I7CisgIGlmICghbV9wRGF0YUF2YWlsLT5Jc0RhdGFBdmFpbChtX3N6UGFnZU9mZnNldEFycmF5W2luZGV4XSwgZHdMZW5ndGgsIHBIaW50cykpCisgICAgcmV0dXJuIElQREZfRGF0YUF2YWlsOjpEYXRhTm90QXZhaWxhYmxlOworICAvLyBEb3dubG9hZCBkYXRhIG9mIHNoYXJlZCBvYmplY3RzIGluIHRoZSBwYWdlLgorICBGWF9EV09SRCBvZmZzZXQgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IGluZGV4OyArK2kpIHsKKyAgICBvZmZzZXQgKz0gbV9kd05TaGFyZWRPYmpzQXJyYXlbaV07CisgIH0KKyAgQ1BERl9PYmplY3QqIHBGaXJzdFBhZ2VPYmogPSBtX3BMaW5lYXJpemVkRGljdC0+R2V0RWxlbWVudFZhbHVlKCJPIik7CisgIGludCBuRmlyc3RQYWdlT2JqTnVtID0gcEZpcnN0UGFnZU9iaiA/IHBGaXJzdFBhZ2VPYmotPkdldEludGVnZXIoKSA6IC0xOworICBpZiAobkZpcnN0UGFnZU9iak51bSA8IDApCisgICAgcmV0dXJuIElQREZfRGF0YUF2YWlsOjpEYXRhRXJyb3I7CisgIEZYX0RXT1JEIGR3SW5kZXggPSAwOworICBGWF9EV09SRCBkd09iak51bSA9IDA7CisgIGZvciAoaW50IGogPSAwOyBqIDwgbV9kd05TaGFyZWRPYmpzQXJyYXlbaW5kZXhdOyArK2opIHsKKyAgICBkd0luZGV4ID0gbV9kd0lkZW50aWZpZXJBcnJheVtvZmZzZXQgKyBqXTsKKyAgICBpZiAoZHdJbmRleCA+PSBtX2R3U2hhcmVkT2JqTnVtQXJyYXkuR2V0U2l6ZSgpKQorICAgICAgcmV0dXJuIElQREZfRGF0YUF2YWlsOjpEYXRhTm90QXZhaWxhYmxlOworICAgIGR3T2JqTnVtID0gbV9kd1NoYXJlZE9iak51bUFycmF5W2R3SW5kZXhdOworICAgIGlmIChkd09iak51bSA+PSBuRmlyc3RQYWdlT2JqTnVtICYmCisgICAgICAgIGR3T2JqTnVtIDwgbkZpcnN0UGFnZU9iak51bSArIG1fbkZpcnN0UGFnZVNoYXJlZE9ianMpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBkd0xlbmd0aCA9IEdldEl0ZW1MZW5ndGgoZHdJbmRleCwgbV9zelNoYXJlZE9iak9mZnNldEFycmF5KTsKKyAgICAvLyBJZiB0d28gb2JqZWN0cyBoYXZlIHRoZSBzYW1lIG9mZnNldCwgaXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYW4gZXJyb3IuCisgICAgaWYgKCFkd0xlbmd0aCkKKyAgICAgIHJldHVybiBJUERGX0RhdGFBdmFpbDo6RGF0YUVycm9yOworICAgIGlmICghbV9wRGF0YUF2YWlsLT5Jc0RhdGFBdmFpbChtX3N6U2hhcmVkT2JqT2Zmc2V0QXJyYXlbZHdJbmRleF0sIGR3TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSGludHMpKSB7CisgICAgICByZXR1cm4gSVBERl9EYXRhQXZhaWw6OkRhdGFOb3RBdmFpbGFibGU7CisgICAgfQorICB9CisgIHJldHVybiBJUERGX0RhdGFBdmFpbDo6RGF0YUF2YWlsYWJsZTsKK30KKworRlhfQk9PTCBDUERGX0hpbnRUYWJsZXM6OkxvYWRIaW50U3RyZWFtKENQREZfU3RyZWFtKiBwSGludFN0cmVhbSkgeworICBpZiAoIXBIaW50U3RyZWFtIHx8ICFtX3BMaW5lYXJpemVkRGljdCkKKyAgICByZXR1cm4gRkFMU0U7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwSGludFN0cmVhbS0+R2V0RGljdCgpOworICBDUERGX09iamVjdCogcE9mZnNldCA9IHBEaWN0ID8gcERpY3QtPkdldEVsZW1lbnQoIlMiKSA6IG51bGxwdHI7CisgIGlmICghcE9mZnNldCB8fCBwT2Zmc2V0LT5HZXRUeXBlKCkgIT0gUERGT0JKX05VTUJFUikKKyAgICByZXR1cm4gRkFMU0U7CisgIGludCBzaGFyZWRfaGludF90YWJsZV9vZmZzZXQgPSBwT2Zmc2V0LT5HZXRJbnRlZ2VyKCk7CisgIENQREZfU3RyZWFtQWNjIGFjYzsKKyAgYWNjLkxvYWRBbGxEYXRhKHBIaW50U3RyZWFtKTsKKyAgRlhfRFdPUkQgc2l6ZSA9IGFjYy5HZXRTaXplKCk7CisgIC8vIFRoZSBoZWFkZXIgc2VjdGlvbiBvZiBwYWdlIG9mZnNldCBoaW50IHRhYmxlIGlzIDM2IGJ5dGVzLgorICAvLyBUaGUgaGVhZGVyIHNlY3Rpb24gb2Ygc2hhcmVkIG9iamVjdCBoaW50IHRhYmxlIGlzIDI0IGJ5dGVzLgorICAvLyBIaW50IHRhYmxlIGhhcyBhdCBsZWFzdCA2MCBieXRlcy4KKyAgY29uc3QgRlhfRFdPUkQgTUlOX1NUUkVBTV9MRU4gPSA2MDsKKyAgaWYgKHNpemUgPCBNSU5fU1RSRUFNX0xFTiB8fCBzaGFyZWRfaGludF90YWJsZV9vZmZzZXQgPD0gMCB8fAorICAgICAgc2l6ZSA8IHNoYXJlZF9oaW50X3RhYmxlX29mZnNldCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDRlhfQml0U3RyZWFtIGJzOworICBicy5Jbml0KGFjYy5HZXREYXRhKCksIHNpemUpOworICByZXR1cm4gUmVhZFBhZ2VIaW50VGFibGUoJmJzKSAmJgorICAgICAgICAgUmVhZFNoYXJlZE9iakhpbnRUYWJsZSgmYnMsIHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PEZYX0RXT1JEPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2hpbnRfdGFibGVfb2Zmc2V0KSk7Cit9CisKK2ludCBDUERGX0hpbnRUYWJsZXM6OlJlYWRQcmltYXJ5SGludFN0cmVhbU9mZnNldCgpIGNvbnN0IHsKKyAgaWYgKCFtX3BMaW5lYXJpemVkRGljdCkKKyAgICByZXR1cm4gLTE7CisgIENQREZfQXJyYXkqIHBSYW5nZSA9IG1fcExpbmVhcml6ZWREaWN0LT5HZXRBcnJheSgiSCIpOworICBpZiAoIXBSYW5nZSkKKyAgICByZXR1cm4gLTE7CisgIENQREZfT2JqZWN0KiBwU3RyZWFtT2Zmc2V0ID0gcFJhbmdlLT5HZXRFbGVtZW50VmFsdWUoMCk7CisgIGlmICghcFN0cmVhbU9mZnNldCkKKyAgICByZXR1cm4gLTE7CisgIHJldHVybiBwU3RyZWFtT2Zmc2V0LT5HZXRJbnRlZ2VyKCk7Cit9CitpbnQgQ1BERl9IaW50VGFibGVzOjpSZWFkUHJpbWFyeUhpbnRTdHJlYW1MZW5ndGgoKSBjb25zdCB7CisgIGlmICghbV9wTGluZWFyaXplZERpY3QpCisgICAgcmV0dXJuIC0xOworICBDUERGX0FycmF5KiBwUmFuZ2UgPSBtX3BMaW5lYXJpemVkRGljdC0+R2V0QXJyYXkoIkgiKTsKKyAgaWYgKCFwUmFuZ2UpCisgICAgcmV0dXJuIC0xOworICBDUERGX09iamVjdCogcFN0cmVhbUxlbiA9IHBSYW5nZS0+R2V0RWxlbWVudFZhbHVlKDEpOworICBpZiAoIXBTdHJlYW1MZW4pCisgICAgcmV0dXJuIC0xOworICByZXR1cm4gcFN0cmVhbUxlbi0+R2V0SW50ZWdlcigpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9wYXJzZXJfZW1iZWRkZXJ0ZXN0LmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfcGFyc2VyX2VtYmVkZGVydGVzdC5jcHAKaW5kZXggODgyYTkxNS4uZmJhNDExNyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9wYXJzZXJfZW1iZWRkZXJ0ZXN0LmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX3BhcnNlcl9lbWJlZGRlcnRlc3QuY3BwCkBAIC0yLDIxICsyLDM5IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0jaW5jbHVkZSAiLi4vLi4vLi4vdGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCiAKLWNsYXNzIEZQREZQYXJzZXJFbWJlZGRlcnRlc3QgOiBwdWJsaWMgRW1iZWRkZXJUZXN0IHsKLX07CitjbGFzcyBGUERGUGFyc2VyRW1iZWRkZXJ0ZXN0IDogcHVibGljIEVtYmVkZGVyVGVzdCB7fTsKIAogVEVTVF9GKEZQREZQYXJzZXJFbWJlZGRlcnRlc3QsIExvYWRFcnJvcl80NTQ2OTUpIHsKLSAgLy8gVGVzdCB0cmFpbGVyIGRpY3Rpb25hcnkgd2l0aCAkJHplIGluc3RlYWQgb2YgU2l6ZS4KLSAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJ0ZXN0aW5nL3Jlc291cmNlcy9idWdfNDU0Njk1LnBkZiIpKTsKKyAgLy8gVGVzdCBhIGRpY3Rpb25hcnkgd2l0aCBoZXggc3RyaW5nIGluc3RlYWQgb2YgY29ycmVjdCBjb250ZW50LgorICAvLyBWZXJpZnkgdGhhdCB0aGUgZGVmZWN0aXZlIHBkZiBzaG91bGRuJ3QgYmUgb3BlbmVkIGNvcnJlY3RseS4KKyAgRVhQRUNUX0ZBTFNFKE9wZW5Eb2N1bWVudCgiYnVnXzQ1NDY5NS5wZGYiKSk7CiB9CiAKIFRFU1RfRihGUERGUGFyc2VyRW1iZWRkZXJ0ZXN0LCBCdWdfNDgxMzYzKSB7CiAgIC8vIFRlc3QgY29sb3JzcGFjZSBvYmplY3Qgd2l0aCBtYWxmb3JtZWQgZGljdGlvbmFyeS4KLSAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJ0ZXN0aW5nL3Jlc291cmNlcy9idWdfNDgxMzYzLnBkZiIpKTsKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJidWdfNDgxMzYzLnBkZiIpKTsKICAgRlBERl9QQUdFIHBhZ2UgPSBMb2FkUGFnZSgwKTsKICAgRVhQRUNUX05FKG51bGxwdHIsIHBhZ2UpOwogICBVbmxvYWRQYWdlKHBhZ2UpOwogfQorCitURVNUX0YoRlBERlBhcnNlckVtYmVkZGVydGVzdCwgQnVnXzU0NDg4MCkgeworICAvLyBUZXN0IHNlbGYgcmVmZXJlbmNpbmcgL1BhZ2VzIG9iamVjdC4KKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJidWdfNTQ0ODgwLnBkZiIpKTsKKyAgLy8gU2hvdWxkbid0IGNyYXNoLiBXZSBkb24ndCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIGhlcmUgYmVjYXVzZSB3ZSBnZXQgdGhlCisgIC8vIHRoZSBjb3VudCBmcm9tIHRoZSAiL0NvdW50IDEiIGluIHRoZSB0ZXN0Y2FzZSAoYXQgdGhlIHRpbWUgb2Ygd3JpdGluZykKKyAgLy8gcmF0aGVyIHRoYW4gdGhlIGFjdHVhbCBjb3VudCAoMCkuCisgICh2b2lkKUdldFBhZ2VDb3VudCgpOworfQorCitURVNUX0YoRlBERlBhcnNlckVtYmVkZGVydGVzdCwgRmVhdHVyZV9MaW5lYXJpemVkX0xvYWRpbmcpIHsKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJmZWF0dXJlX2xpbmVhcml6ZWRfbG9hZGluZy5wZGYiLCB0cnVlKSk7Cit9CisKK1RFU1RfRihGUERGUGFyc2VyRW1iZWRkZXJ0ZXN0LCBCdWdfMzI1KSB7CisgIEVYUEVDVF9GQUxTRShPcGVuRG9jdW1lbnQoImJ1Z18zMjVfYS5wZGYiKSk7CisgIEVYUEVDVF9GQUxTRShPcGVuRG9jdW1lbnQoImJ1Z18zMjVfYi5wZGYiKSk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX3BhcnNlcl91bml0dGVzdC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX3BhcnNlcl91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA5MWYxNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfcGFyc2VyX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDM3MCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYXJzZXIuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyZWFtLmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy91dGlscy9wYXRoX3NlcnZpY2UuaCIKKworLy8gRnVuY3Rpb25zIHRvIGhlbHAgdGVzdCBhbiBhcnJheSdzIGNvbnRlbnQgYWdhaW5zdCBleHBlY3RlZCByZXN1bHRzLgordGVtcGxhdGUgPGNsYXNzIFRZUEU+Citib29sIENvbXBhcmVBcnJheShjb25zdCBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPiYgYXJyYXkxLAorICAgICAgICAgICAgICAgICAgY29uc3QgVFlQRSogYXJyYXkyLAorICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIHsKKyAgaWYgKGFycmF5MS5HZXRTaXplKCkgIT0gc2l6ZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpCisgICAgaWYgKGFycmF5MS5HZXRBdChpKSAhPSBhcnJheTJbaV0pCisgICAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQorCisvLyBQcm92aWRlIGEgd2F5IHRvIHJlYWQgdGVzdCBkYXRhIGZyb20gYSBidWZmZXIgaW5zdGVhZCBvZiBhIGZpbGUuCitjbGFzcyBDRlhfVGVzdEJ1ZmZlclJlYWQgOiBwdWJsaWMgSUZYX0ZpbGVSZWFkIHsKKyBwdWJsaWM6CisgIENGWF9UZXN0QnVmZmVyUmVhZChjb25zdCB1bnNpZ25lZCBjaGFyKiBidWZmZXJfaW4sIHNpemVfdCBidWZfc2l6ZSkKKyAgICAgIDogYnVmZmVyXyhidWZmZXJfaW4pLCB0b3RhbF9zaXplXyhidWZfc2l6ZSkge30KKworICAvLyBJRlhfU3RyZWFtCisgIHZvaWQgUmVsZWFzZSgpIG92ZXJyaWRlIHsgZGVsZXRlIHRoaXM7IH0KKworICAvLyBJRlhfRmlsZVJlYWQKKyAgRlhfQk9PTCBSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZSB7CisgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICsgc2l6ZSA+IHRvdGFsX3NpemVfKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgbWVtY3B5KGJ1ZmZlciwgYnVmZmVyXyArIG9mZnNldCwgc2l6ZSk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgRlhfRklMRVNJWkUgR2V0U2l6ZSgpIG92ZXJyaWRlIHsgcmV0dXJuIChGWF9GSUxFU0laRSl0b3RhbF9zaXplXzsgfTsKKworIHByb3RlY3RlZDoKKyAgY29uc3QgdW5zaWduZWQgY2hhciogYnVmZmVyXzsKKyAgc2l6ZV90IHRvdGFsX3NpemVfOworfTsKKworLy8gQSB3cmFwcGVyIGNsYXNzIHRvIGhlbHAgdGVzdCBtZW1iZXIgZnVuY3Rpb25zIG9mIENQREZfUGFyc2VyLgorY2xhc3MgQ1BERl9UZXN0UGFyc2VyIDogcHVibGljIENQREZfUGFyc2VyIHsKKyBwdWJsaWM6CisgIENQREZfVGVzdFBhcnNlcigpIHt9CisgIH5DUERGX1Rlc3RQYXJzZXIoKSB7fQorCisgIC8vIFNldHVwIHJlYWRpbmcgZnJvbSBhIGZpbGUgYW5kIGluaXRpYWwgc3RhdGVzLgorICBib29sIEluaXRUZXN0RnJvbUZpbGUoY29uc3QgRlhfQ0hBUiogcGF0aCkgeworICAgIElGWF9GaWxlUmVhZCogcEZpbGVBY2Nlc3MgPSBGWF9DcmVhdGVGaWxlUmVhZChwYXRoKTsKKyAgICBpZiAoIXBGaWxlQWNjZXNzKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gRm9yIHRoZSB0ZXN0IGZpbGUsIHRoZSBoZWFkZXIgaXMgc2V0IGF0IHRoZSBiZWdpbm5pbmcuCisgICAgbV9TeW50YXguSW5pdFBhcnNlcihwRmlsZUFjY2VzcywgMCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBTZXR1cCByZWFkaW5nIGZyb20gYSBidWZmZXIgYW5kIGluaXRpYWwgc3RhdGVzLgorICBib29sIEluaXRUZXN0RnJvbUJ1ZmZlcihjb25zdCB1bnNpZ25lZCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW4pIHsKKyAgICBDRlhfVGVzdEJ1ZmZlclJlYWQqIGJ1ZmZlcl9yZWFkZXIgPSBuZXcgQ0ZYX1Rlc3RCdWZmZXJSZWFkKGJ1ZmZlciwgbGVuKTsKKworICAgIC8vIEZvciB0aGUgdGVzdCBmaWxlLCB0aGUgaGVhZGVyIGlzIHNldCBhdCB0aGUgYmVnaW5uaW5nLgorICAgIG1fU3ludGF4LkluaXRQYXJzZXIoYnVmZmVyX3JlYWRlciwgMCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworIHByaXZhdGU6CisgIC8vIEFkZCB0ZXN0IGNhc2VzIGhlcmUgYXMgcHJpdmF0ZSBmcmllbmQgc28gdGhhdCBwcm90ZWN0ZWQgbWVtYmVycyBpbgorICAvLyBDUERGX1BhcnNlciBjYW4gYmUgYWNjZXNzZWQgYnkgdGVzdCBjYXNlcy4KKyAgLy8gTmVlZCB0byBhY2Nlc3MgUmVidWlsZENyb3NzUmVmLgorICBGUklFTkRfVEVTVChmcGRmX3BhcnNlcl9wYXJzZXIsIFJlYnVpbGRDcm9zc1JlZkNvcnJlY3RseSk7CisgIEZSSUVORF9URVNUKGZwZGZfcGFyc2VyX3BhcnNlciwgUmVidWlsZENyb3NzUmVmRmFpbGVkKTsKKyAgLy8gTmVlZCB0byBhY2Nlc3MgTG9hZENyb3NzUmVmVjQuCisgIEZSSUVORF9URVNUKGZwZGZfcGFyc2VyX3BhcnNlciwgTG9hZENyb3NzUmVmVjQpOworfTsKKworLy8gVE9ETyh0aGVzdGlnKSBVc2luZyB1bmlxdWVfcHRyIHdpdGggUmVsZWFzZURlbGV0ZXIgaXMgc3RpbGwgbm90IGlkZWFsLgorLy8gQ29tZSB1cCBvciB3YWl0IGZvciBzb21ldGhpbmcgYmV0dGVyLgordXNpbmcgU2NvcGVkRmlsZVN0cmVhbSA9CisgICAgc3RkOjp1bmlxdWVfcHRyPElGWF9GaWxlU3RyZWFtLCBSZWxlYXNlRGVsZXRlcjxJRlhfRmlsZVN0cmVhbT4+OworCitURVNUKGZwZGZfcGFyc2VyX3BhcnNlciwgUmVhZEhleFN0cmluZykgeworICB7CisgICAgLy8gRW1wdHkgc3RyaW5nLgorICAgIHVpbnQ4X3QgZGF0YVtdID0gIiI7CisgICAgU2NvcGVkRmlsZVN0cmVhbSBzdHJlYW0oRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKGRhdGEsIDAsIEZBTFNFKSk7CisKKyAgICBDUERGX1N5bnRheFBhcnNlciBwYXJzZXI7CisgICAgcGFyc2VyLkluaXRQYXJzZXIoc3RyZWFtLmdldCgpLCAwKTsKKyAgICBFWFBFQ1RfRVEoIiIsIHBhcnNlci5SZWFkSGV4U3RyaW5nKCkpOworICAgIEVYUEVDVF9FUSgwLCBwYXJzZXIuU2F2ZVBvcygpKTsKKyAgfQorCisgIHsKKyAgICAvLyBCbGFuayBzdHJpbmcuCisgICAgdWludDhfdCBkYXRhW10gPSAiICAiOworICAgIFNjb3BlZEZpbGVTdHJlYW0gc3RyZWFtKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShkYXRhLCAyLCBGQUxTRSkpOworCisgICAgQ1BERl9TeW50YXhQYXJzZXIgcGFyc2VyOworICAgIHBhcnNlci5Jbml0UGFyc2VyKHN0cmVhbS5nZXQoKSwgMCk7CisgICAgRVhQRUNUX0VRKCIiLCBwYXJzZXIuUmVhZEhleFN0cmluZygpKTsKKyAgICBFWFBFQ1RfRVEoMiwgcGFyc2VyLlNhdmVQb3MoKSk7CisgIH0KKworICB7CisgICAgLy8gU2tpcHMgdW5rbm93biBjaGFyYWN0ZXJzLgorICAgIHVpbnQ4X3QgZGF0YVtdID0gInoxMmIiOworICAgIFNjb3BlZEZpbGVTdHJlYW0gc3RyZWFtKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShkYXRhLCA0LCBGQUxTRSkpOworCisgICAgQ1BERl9TeW50YXhQYXJzZXIgcGFyc2VyOworICAgIHBhcnNlci5Jbml0UGFyc2VyKHN0cmVhbS5nZXQoKSwgMCk7CisgICAgRVhQRUNUX0VRKCJceDEyXHhiMCIsIHBhcnNlci5SZWFkSGV4U3RyaW5nKCkpOworICAgIEVYUEVDVF9FUSg0LCBwYXJzZXIuU2F2ZVBvcygpKTsKKyAgfQorCisgIHsKKyAgICAvLyBTa2lwcyB1bmtub3duIGNoYXJhY3RlcnMuCisgICAgdWludDhfdCBkYXRhW10gPSAiKjwmKiMkXiZAMSI7CisgICAgU2NvcGVkRmlsZVN0cmVhbSBzdHJlYW0oRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKGRhdGEsIDEwLCBGQUxTRSkpOworCisgICAgQ1BERl9TeW50YXhQYXJzZXIgcGFyc2VyOworICAgIHBhcnNlci5Jbml0UGFyc2VyKHN0cmVhbS5nZXQoKSwgMCk7CisgICAgRVhQRUNUX0VRKCJceDEwIiwgcGFyc2VyLlJlYWRIZXhTdHJpbmcoKSk7CisgICAgRVhQRUNUX0VRKDEwLCBwYXJzZXIuU2F2ZVBvcygpKTsKKyAgfQorCisgIHsKKyAgICAvLyBTa2lwcyB1bmtub3duIGNoYXJhY3RlcnMuCisgICAgdWludDhfdCBkYXRhW10gPSAiXHg4MHphYiI7CisgICAgU2NvcGVkRmlsZVN0cmVhbSBzdHJlYW0oRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKGRhdGEsIDQsIEZBTFNFKSk7CisKKyAgICBDUERGX1N5bnRheFBhcnNlciBwYXJzZXI7CisgICAgcGFyc2VyLkluaXRQYXJzZXIoc3RyZWFtLmdldCgpLCAwKTsKKyAgICBFWFBFQ1RfRVEoIlx4YWIiLCBwYXJzZXIuUmVhZEhleFN0cmluZygpKTsKKyAgICBFWFBFQ1RfRVEoNCwgcGFyc2VyLlNhdmVQb3MoKSk7CisgIH0KKworICB7CisgICAgLy8gU2tpcHMgdW5rbm93biBjaGFyYWN0ZXJzLgorICAgIHVpbnQ4X3QgZGF0YVtdID0gIlx4ZmZ6YWIiOworICAgIFNjb3BlZEZpbGVTdHJlYW0gc3RyZWFtKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShkYXRhLCA0LCBGQUxTRSkpOworCisgICAgQ1BERl9TeW50YXhQYXJzZXIgcGFyc2VyOworICAgIHBhcnNlci5Jbml0UGFyc2VyKHN0cmVhbS5nZXQoKSwgMCk7CisgICAgRVhQRUNUX0VRKCJceGFiIiwgcGFyc2VyLlJlYWRIZXhTdHJpbmcoKSk7CisgICAgRVhQRUNUX0VRKDQsIHBhcnNlci5TYXZlUG9zKCkpOworICB9CisKKyAgeworICAgIC8vIFJlZ3VsYXIgY29udmVyc2lvbi4KKyAgICB1aW50OF90IGRhdGFbXSA9ICIxQTJiPmFiY2QiOworICAgIFNjb3BlZEZpbGVTdHJlYW0gc3RyZWFtKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShkYXRhLCA5LCBGQUxTRSkpOworCisgICAgQ1BERl9TeW50YXhQYXJzZXIgcGFyc2VyOworICAgIHBhcnNlci5Jbml0UGFyc2VyKHN0cmVhbS5nZXQoKSwgMCk7CisgICAgRVhQRUNUX0VRKCJceDFhXHgyYiIsIHBhcnNlci5SZWFkSGV4U3RyaW5nKCkpOworICAgIEVYUEVDVF9FUSg1LCBwYXJzZXIuU2F2ZVBvcygpKTsKKyAgfQorCisgIHsKKyAgICAvLyBQb3NpdGlvbiBvdXQgb2YgYm91bmRzLgorICAgIHVpbnQ4X3QgZGF0YVtdID0gIjEyYWI+IjsKKyAgICBTY29wZWRGaWxlU3RyZWFtIHN0cmVhbShGWF9DcmVhdGVNZW1vcnlTdHJlYW0oZGF0YSwgNSwgRkFMU0UpKTsKKworICAgIENQREZfU3ludGF4UGFyc2VyIHBhcnNlcjsKKyAgICBwYXJzZXIuSW5pdFBhcnNlcihzdHJlYW0uZ2V0KCksIDApOworICAgIHBhcnNlci5SZXN0b3JlUG9zKDUpOworICAgIEVYUEVDVF9FUSgiIiwgcGFyc2VyLlJlYWRIZXhTdHJpbmcoKSk7CisKKyAgICBwYXJzZXIuUmVzdG9yZVBvcyg2KTsKKyAgICBFWFBFQ1RfRVEoIiIsIHBhcnNlci5SZWFkSGV4U3RyaW5nKCkpOworCisgICAgcGFyc2VyLlJlc3RvcmVQb3MoLTEpOworICAgIEVYUEVDVF9FUSgiIiwgcGFyc2VyLlJlYWRIZXhTdHJpbmcoKSk7CisKKyAgICBwYXJzZXIuUmVzdG9yZVBvcyhzdGQ6Om51bWVyaWNfbGltaXRzPEZYX0ZJTEVTSVpFPjo6bWF4KCkpOworICAgIEVYUEVDVF9FUSgiIiwgcGFyc2VyLlJlYWRIZXhTdHJpbmcoKSk7CisKKyAgICAvLyBDaGVjayBzdHJpbmcgc3RpbGwgcGFyc2VzIHdoZW4gc2V0IHRvIDAuCisgICAgcGFyc2VyLlJlc3RvcmVQb3MoMCk7CisgICAgRVhQRUNUX0VRKCJceDEyXHhhYiIsIHBhcnNlci5SZWFkSGV4U3RyaW5nKCkpOworICB9CisKKyAgeworICAgIC8vIE1pc3NpbmcgZW5kaW5nID4uCisgICAgdWludDhfdCBkYXRhW10gPSAiMUEyYiI7CisgICAgU2NvcGVkRmlsZVN0cmVhbSBzdHJlYW0oRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKGRhdGEsIDQsIEZBTFNFKSk7CisKKyAgICBDUERGX1N5bnRheFBhcnNlciBwYXJzZXI7CisgICAgcGFyc2VyLkluaXRQYXJzZXIoc3RyZWFtLmdldCgpLCAwKTsKKyAgICBFWFBFQ1RfRVEoIlx4MWFceDJiIiwgcGFyc2VyLlJlYWRIZXhTdHJpbmcoKSk7CisgICAgRVhQRUNUX0VRKDQsIHBhcnNlci5TYXZlUG9zKCkpOworICB9CisKKyAgeworICAgIC8vIE1pc3NpbmcgZW5kaW5nID4uCisgICAgdWludDhfdCBkYXRhW10gPSAiMTJhYnoiOworICAgIFNjb3BlZEZpbGVTdHJlYW0gc3RyZWFtKEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShkYXRhLCA1LCBGQUxTRSkpOworCisgICAgQ1BERl9TeW50YXhQYXJzZXIgcGFyc2VyOworICAgIHBhcnNlci5Jbml0UGFyc2VyKHN0cmVhbS5nZXQoKSwgMCk7CisgICAgRVhQRUNUX0VRKCJceDEyXHhhYiIsIHBhcnNlci5SZWFkSGV4U3RyaW5nKCkpOworICAgIEVYUEVDVF9FUSg1LCBwYXJzZXIuU2F2ZVBvcygpKTsKKyAgfQorCisgIHsKKyAgICAvLyBVbmV2ZW4gbnVtYmVyIG9mIGJ5dGVzLgorICAgIHVpbnQ4X3QgZGF0YVtdID0gIjFBMj5hc2RmIjsKKyAgICBTY29wZWRGaWxlU3RyZWFtIHN0cmVhbShGWF9DcmVhdGVNZW1vcnlTdHJlYW0oZGF0YSwgOCwgRkFMU0UpKTsKKworICAgIENQREZfU3ludGF4UGFyc2VyIHBhcnNlcjsKKyAgICBwYXJzZXIuSW5pdFBhcnNlcihzdHJlYW0uZ2V0KCksIDApOworICAgIEVYUEVDVF9FUSgiXHgxYVx4MjAiLCBwYXJzZXIuUmVhZEhleFN0cmluZygpKTsKKyAgICBFWFBFQ1RfRVEoNCwgcGFyc2VyLlNhdmVQb3MoKSk7CisgIH0KKworICB7CisgICAgLy8gVW5ldmVuIG51bWJlciBvZiBieXRlcy4KKyAgICB1aW50OF90IGRhdGFbXSA9ICIxQTJ6YXNkZiI7CisgICAgU2NvcGVkRmlsZVN0cmVhbSBzdHJlYW0oRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKGRhdGEsIDgsIEZBTFNFKSk7CisKKyAgICBDUERGX1N5bnRheFBhcnNlciBwYXJzZXI7CisgICAgcGFyc2VyLkluaXRQYXJzZXIoc3RyZWFtLmdldCgpLCAwKTsKKyAgICBFWFBFQ1RfRVEoIlx4MWFceDJhXHhkZiIsIHBhcnNlci5SZWFkSGV4U3RyaW5nKCkpOworICAgIEVYUEVDVF9FUSg4LCBwYXJzZXIuU2F2ZVBvcygpKTsKKyAgfQorCisgIHsKKyAgICAvLyBKdXN0IGVuZGluZyBjaGFyYWN0ZXIuCisgICAgdWludDhfdCBkYXRhW10gPSAiPiI7CisgICAgU2NvcGVkRmlsZVN0cmVhbSBzdHJlYW0oRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKGRhdGEsIDEsIEZBTFNFKSk7CisKKyAgICBDUERGX1N5bnRheFBhcnNlciBwYXJzZXI7CisgICAgcGFyc2VyLkluaXRQYXJzZXIoc3RyZWFtLmdldCgpLCAwKTsKKyAgICBFWFBFQ1RfRVEoIiIsIHBhcnNlci5SZWFkSGV4U3RyaW5nKCkpOworICAgIEVYUEVDVF9FUSgxLCBwYXJzZXIuU2F2ZVBvcygpKTsKKyAgfQorfQorCitURVNUKGZwZGZfcGFyc2VyX3BhcnNlciwgUmVidWlsZENyb3NzUmVmQ29ycmVjdGx5KSB7CisgIENQREZfVGVzdFBhcnNlciBwYXJzZXI7CisgIHN0ZDo6c3RyaW5nIHRlc3RfZmlsZTsKKyAgQVNTRVJUX1RSVUUoUGF0aFNlcnZpY2U6OkdldFRlc3RGaWxlUGF0aCgicGFyc2VyX3JlYnVpbGR4cmVmX2NvcnJlY3QucGRmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVzdF9maWxlKSk7CisgIEFTU0VSVF9UUlVFKHBhcnNlci5Jbml0VGVzdEZyb21GaWxlKHRlc3RfZmlsZS5jX3N0cigpKSkgPDwgdGVzdF9maWxlOworCisgIEFTU0VSVF9UUlVFKHBhcnNlci5SZWJ1aWxkQ3Jvc3NSZWYoKSk7CisgIGNvbnN0IEZYX0ZJTEVTSVpFIG9mZnNldHNbXSA9IHswLCAxNSwgNjEsIDE1NCwgMjk2LCAzNzQsIDQ1MH07CisgIGNvbnN0IEZYX1dPUkQgdmVyc2lvbnNbXSA9IHswLCAwLCAyLCA0LCA2LCA4LCAwfTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUob2Zmc2V0cyk7ICsraSkKKyAgICBFWFBFQ1RfRVEob2Zmc2V0c1tpXSwgcGFyc2VyLm1fT2JqZWN0SW5mb1tpXS5wb3MpOworICBBU1NFUlRfVFJVRSgKKyAgICAgIENvbXBhcmVBcnJheShwYXJzZXIubV9PYmpWZXJzaW9uLCB2ZXJzaW9ucywgRlhfQXJyYXlTaXplKHZlcnNpb25zKSkpOworfQorCitURVNUKGZwZGZfcGFyc2VyX3BhcnNlciwgUmVidWlsZENyb3NzUmVmRmFpbGVkKSB7CisgIENQREZfVGVzdFBhcnNlciBwYXJzZXI7CisgIHN0ZDo6c3RyaW5nIHRlc3RfZmlsZTsKKyAgQVNTRVJUX1RSVUUoUGF0aFNlcnZpY2U6OkdldFRlc3RGaWxlUGF0aCgKKyAgICAgICJwYXJzZXJfcmVidWlsZHhyZWZfZXJyb3Jfbm90cmFpbGVyLnBkZiIsICZ0ZXN0X2ZpbGUpKTsKKyAgQVNTRVJUX1RSVUUocGFyc2VyLkluaXRUZXN0RnJvbUZpbGUodGVzdF9maWxlLmNfc3RyKCkpKSA8PCB0ZXN0X2ZpbGU7CisKKyAgQVNTRVJUX0ZBTFNFKHBhcnNlci5SZWJ1aWxkQ3Jvc3NSZWYoKSk7Cit9CisKK1RFU1QoZnBkZl9wYXJzZXJfcGFyc2VyLCBMb2FkQ3Jvc3NSZWZWNCkgeworICB7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciB4cmVmX3RhYmxlW10gPQorICAgICAgICAieHJlZiBcbiIKKyAgICAgICAgIjAgNiBcbiIKKyAgICAgICAgIjAwMDAwMDAwMDMgNjU1MzUgZiBcbiIKKyAgICAgICAgIjAwMDAwMDAwMTcgMDAwMDAgbiBcbiIKKyAgICAgICAgIjAwMDAwMDAwODEgMDAwMDAgbiBcbiIKKyAgICAgICAgIjAwMDAwMDAwMDAgMDAwMDcgZiBcbiIKKyAgICAgICAgIjAwMDAwMDAzMzEgMDAwMDAgbiBcbiIKKyAgICAgICAgIjAwMDAwMDA0MDkgMDAwMDAgbiBcbiIKKyAgICAgICAgInRyYWlsIjsgIC8vIE5lZWRlZCB0byBlbmQgY3Jvc3MgcmVmIHRhYmxlIHJlYWRpbmcuCisgICAgQ1BERl9UZXN0UGFyc2VyIHBhcnNlcjsKKyAgICBBU1NFUlRfVFJVRSgKKyAgICAgICAgcGFyc2VyLkluaXRUZXN0RnJvbUJ1ZmZlcih4cmVmX3RhYmxlLCBGWF9BcnJheVNpemUoeHJlZl90YWJsZSkpKTsKKworICAgIEFTU0VSVF9UUlVFKHBhcnNlci5Mb2FkQ3Jvc3NSZWZWNCgwLCAwLCBGQUxTRSkpOworICAgIGNvbnN0IEZYX0ZJTEVTSVpFIG9mZnNldHNbXSA9IHswLCAxNywgODEsIDAsIDMzMSwgNDA5fTsKKyAgICBjb25zdCB1aW50OF90IHR5cGVzW10gPSB7MCwgMSwgMSwgMCwgMSwgMX07CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUob2Zmc2V0cyk7ICsraSkKKyAgICAgIEVYUEVDVF9FUShvZmZzZXRzW2ldLCBwYXJzZXIubV9PYmplY3RJbmZvW2ldLnBvcyk7CisgICAgQVNTRVJUX1RSVUUoQ29tcGFyZUFycmF5KHBhcnNlci5tX1Y1VHlwZSwgdHlwZXMsIEZYX0FycmF5U2l6ZSh0eXBlcykpKTsKKyAgfQorICB7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciB4cmVmX3RhYmxlW10gPQorICAgICAgICAieHJlZiBcbiIKKyAgICAgICAgIjAgMSBcbiIKKyAgICAgICAgIjAwMDAwMDAwMDAgNjU1MzUgZiBcbiIKKyAgICAgICAgIjMgMSBcbiIKKyAgICAgICAgIjAwMDAwMjUzMjUgMDAwMDAgbiBcbiIKKyAgICAgICAgIjggMiBcbiIKKyAgICAgICAgIjAwMDAwMjU1MTggMDAwMDIgbiBcbiIKKyAgICAgICAgIjAwMDAwMjU2MzUgMDAwMDAgbiBcbiIKKyAgICAgICAgIjEyIDEgXG4iCisgICAgICAgICIwMDAwMDI1Nzc3IDAwMDAwIG4gXG4iCisgICAgICAgICJ0cmFpbCI7ICAvLyBOZWVkZWQgdG8gZW5kIGNyb3NzIHJlZiB0YWJsZSByZWFkaW5nLgorICAgIENQREZfVGVzdFBhcnNlciBwYXJzZXI7CisgICAgQVNTRVJUX1RSVUUoCisgICAgICAgIHBhcnNlci5Jbml0VGVzdEZyb21CdWZmZXIoeHJlZl90YWJsZSwgRlhfQXJyYXlTaXplKHhyZWZfdGFibGUpKSk7CisKKyAgICBBU1NFUlRfVFJVRShwYXJzZXIuTG9hZENyb3NzUmVmVjQoMCwgMCwgRkFMU0UpKTsKKyAgICBjb25zdCBGWF9GSUxFU0laRSBvZmZzZXRzW10gPSB7MCwgMCwgICAgIDAsICAgICAyNTMyNSwgMCwgMCwgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMjU1MTgsIDI1NjM1LCAwLCAgICAgMCwgMjU3Nzd9OworICAgIGNvbnN0IHVpbnQ4X3QgdHlwZXNbXSA9IHswLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAwLCAxfTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShvZmZzZXRzKTsgKytpKQorICAgICAgRVhQRUNUX0VRKG9mZnNldHNbaV0sIHBhcnNlci5tX09iamVjdEluZm9baV0ucG9zKTsKKyAgICBBU1NFUlRfVFJVRShDb21wYXJlQXJyYXkocGFyc2VyLm1fVjVUeXBlLCB0eXBlcywgRlhfQXJyYXlTaXplKHR5cGVzKSkpOworICB9CisgIHsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIHhyZWZfdGFibGVbXSA9CisgICAgICAgICJ4cmVmIFxuIgorICAgICAgICAiMCAxIFxuIgorICAgICAgICAiMDAwMDAwMDAwMCA2NTUzNSBmIFxuIgorICAgICAgICAiMyAxIFxuIgorICAgICAgICAiMDAwMDAyNTMyNSAwMDAwMCBuIFxuIgorICAgICAgICAiOCAyIFxuIgorICAgICAgICAiMDAwMDAwMDAwMCA2NTUzNSBmIFxuIgorICAgICAgICAiMDAwMDAyNTYzNSAwMDAwMCBuIFxuIgorICAgICAgICAiMTIgMSBcbiIKKyAgICAgICAgIjAwMDAwMjU3NzcgMDAwMDAgbiBcbiIKKyAgICAgICAgInRyYWlsIjsgIC8vIE5lZWRlZCB0byBlbmQgY3Jvc3MgcmVmIHRhYmxlIHJlYWRpbmcuCisgICAgQ1BERl9UZXN0UGFyc2VyIHBhcnNlcjsKKyAgICBBU1NFUlRfVFJVRSgKKyAgICAgICAgcGFyc2VyLkluaXRUZXN0RnJvbUJ1ZmZlcih4cmVmX3RhYmxlLCBGWF9BcnJheVNpemUoeHJlZl90YWJsZSkpKTsKKworICAgIEFTU0VSVF9UUlVFKHBhcnNlci5Mb2FkQ3Jvc3NSZWZWNCgwLCAwLCBGQUxTRSkpOworICAgIGNvbnN0IEZYX0ZJTEVTSVpFIG9mZnNldHNbXSA9IHswLCAwLCAwLCAgICAgMjUzMjUsIDAsIDAsICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDI1NjM1LCAwLCAgICAgMCwgMjU3Nzd9OworICAgIGNvbnN0IHVpbnQ4X3QgdHlwZXNbXSA9IHswLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAxfTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShvZmZzZXRzKTsgKytpKQorICAgICAgRVhQRUNUX0VRKG9mZnNldHNbaV0sIHBhcnNlci5tX09iamVjdEluZm9baV0ucG9zKTsKKyAgICBBU1NFUlRfVFJVRShDb21wYXJlQXJyYXkocGFyc2VyLm1fVjVUeXBlLCB0eXBlcywgRlhfQXJyYXlTaXplKHR5cGVzKSkpOworICB9CisgIHsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIHhyZWZfdGFibGVbXSA9CisgICAgICAgICJ4cmVmIFxuIgorICAgICAgICAiMCA3IFxuIgorICAgICAgICAiMDAwMDAwMDAwMiA2NTUzNSBmIFxuIgorICAgICAgICAiMDAwMDAwMDAyMyAwMDAwMCBuIFxuIgorICAgICAgICAiMDAwMDAwMDAwMyA2NTUzNSBmIFxuIgorICAgICAgICAiMDAwMDAwMDAwNCA2NTUzNSBmIFxuIgorICAgICAgICAiMDAwMDAwMDAwMCA2NTUzNSBmIFxuIgorICAgICAgICAiMDAwMDAwMDA0NSAwMDAwMCBuIFxuIgorICAgICAgICAiMDAwMDAwMDE3OSAwMDAwMCBuIFxuIgorICAgICAgICAidHJhaWwiOyAgLy8gTmVlZGVkIHRvIGVuZCBjcm9zcyByZWYgdGFibGUgcmVhZGluZy4KKyAgICBDUERGX1Rlc3RQYXJzZXIgcGFyc2VyOworICAgIEFTU0VSVF9UUlVFKAorICAgICAgICBwYXJzZXIuSW5pdFRlc3RGcm9tQnVmZmVyKHhyZWZfdGFibGUsIEZYX0FycmF5U2l6ZSh4cmVmX3RhYmxlKSkpOworCisgICAgQVNTRVJUX1RSVUUocGFyc2VyLkxvYWRDcm9zc1JlZlY0KDAsIDAsIEZBTFNFKSk7CisgICAgY29uc3QgRlhfRklMRVNJWkUgb2Zmc2V0c1tdID0gezAsIDIzLCAwLCAwLCAwLCA0NSwgMTc5fTsKKyAgICBjb25zdCB1aW50OF90IHR5cGVzW10gPSB7MCwgMSwgMCwgMCwgMCwgMSwgMX07CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUob2Zmc2V0cyk7ICsraSkKKyAgICAgIEVYUEVDVF9FUShvZmZzZXRzW2ldLCBwYXJzZXIubV9PYmplY3RJbmZvW2ldLnBvcyk7CisgICAgQVNTRVJUX1RSVUUoQ29tcGFyZUFycmF5KHBhcnNlci5tX1Y1VHlwZSwgdHlwZXMsIEZYX0FycmF5U2l6ZSh0eXBlcykpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl91dGlsaXR5LmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfdXRpbGl0eS5jcHAKaW5kZXggZGYxNTRlYS4uMWFiZjY2NSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl91dGlsaXR5LmNwcAorKysgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX3V0aWxpdHkuY3BwCkBAIC0xLDQ3OSArMSw0NjEgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhcnNlci5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFyc2VyLmgiCisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfZXh0LmgiCisKKy8vIEluZGV4ZWQgYnkgOC1iaXQgY2hhcmFjdGVyIGNvZGUsIGNvbnRhaW5zIGVpdGhlcjoKKy8vICAgJ1cnIC0gZm9yIHdoaXRlc3BhY2U6IE5VTCwgVEFCLCBDUiwgTEYsIEZGLCBTUEFDRSwgMHg4MCwgMHhmZgorLy8gICAnTicgLSBmb3IgbnVtZXJpYzogMDEyMzQ1Njc4OSstLgorLy8gICAnRCcgLSBmb3IgZGVsaW1pdGVyOiAlKCkvPD5bXXt9CisvLyAgICdSJyAtIG90aGVyd2lzZS4KIGNvbnN0IGNoYXIgUERGX0NoYXJUeXBlWzI1Nl0gPSB7Ci0gIC8vTlVMICBTT0ggIFNUWCAgRVRYICBFT1QgIEVOUSAgQUNLICBCRUwgIEJTICAgSFQgICBMRiAgIFZUICAgRkYgICBDUiAgIFNPICAgU0kKLSAgICAnVycsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnVycsICdXJywgJ1InLCAnVycsICdXJywgJ1InLCAnUicsCisgICAgLy8gTlVMICBTT0ggIFNUWCAgRVRYICBFT1QgIEVOUSAgQUNLICBCRUwgIEJTICAgSFQgICBMRiAgIFZUICAgRkYgICBDUiAgIFNPCisgICAgLy8gU0kKKyAgICAnVycsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnVycsICdXJywgJ1InLCAnVycsICdXJywgJ1InLAorICAgICdSJywKIAotICAvL0RMRSAgREMxICBEQzIgIERDMyAgREM0ICBOQUsgIFNZTiAgRVRCICBDQU4gIEVNICAgU1VCICBFU0MgIEZTICAgR1MgICBSUyAgIFVTCi0gICAgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLAorICAgIC8vIERMRSAgREMxICBEQzIgIERDMyAgREM0ICBOQUsgIFNZTiAgRVRCICBDQU4gIEVNICAgU1VCICBFU0MgIEZTICAgR1MgICBSUworICAgIC8vIFVTCisgICAgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywKKyAgICAnUicsCiAKLSAgLy9TUCAgICAhICAgICIgICAgIyAgICAkICAgICUgICAgJiAgICDCtCAgICAoICAgICkgICAgKiAgICArICAgICwgICAgLSAgICAuICAgIC8KLSAgICAnVycsICdSJywgJ1InLCAnUicsICdSJywgJ0QnLCAnUicsICdSJywgJ0QnLCAnRCcsICdSJywgJ04nLCAnUicsICdOJywgJ04nLCAnRCcsCisgICAgLy8gU1AgICAgISAgICAiICAgICMgICAgJCAgICAlICAgICYgICAgwrQgICAgKCAgICApICAgICogICAgKyAgICAsICAgIC0gICAgLgorICAgIC8vIC8KKyAgICAnVycsICdSJywgJ1InLCAnUicsICdSJywgJ0QnLCAnUicsICdSJywgJ0QnLCAnRCcsICdSJywgJ04nLCAnUicsICdOJywgJ04nLAorICAgICdEJywKIAotICAvLyAwICAgIDEgICAgMiAgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgOCAgICA5ICAgIDogICAgOyAgICA8ICAgID0gICAgPiAgICA/Ci0gICAgJ04nLCAnTicsICdOJywgJ04nLCAnTicsICdOJywgJ04nLCAnTicsICdOJywgJ04nLCAnUicsICdSJywgJ0QnLCAnUicsICdEJywgJ1InLAorICAgIC8vIDAgICAgMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgOiAgICA7ICAgIDwgICAgPSAgICA+ID8KKyAgICAnTicsICdOJywgJ04nLCAnTicsICdOJywgJ04nLCAnTicsICdOJywgJ04nLCAnTicsICdSJywgJ1InLCAnRCcsICdSJywgJ0QnLAorICAgICdSJywKIAotICAvLyBAICAgIEEgICAgQiAgICBDICAgIEQgICAgRSAgICBGICAgIEcgICAgSCAgICBJICAgIEogICAgSyAgICBMICAgIE0gICAgTiAgICBPCi0gICAgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLAorICAgIC8vIEAgICAgQSAgICBCICAgIEMgICAgRCAgICBFICAgIEYgICAgRyAgICBIICAgIEkgICAgSiAgICBLICAgIEwgICAgTSAgICBOIE8KKyAgICAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLAorICAgICdSJywKIAotICAvLyBQICAgIFEgICAgUiAgICBTICAgIFQgICAgVSAgICBWICAgIFcgICAgWCAgICBZICAgIFogICAgWyAgICBcICAgIF0gICAgXiAgICBfCi0gICAgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdEJywgJ1InLCAnRCcsICdSJywgJ1InLAorICAgIC8vIFAgICAgUSAgICBSICAgIFMgICAgVCAgICBVICAgIFYgICAgVyAgICBYICAgIFkgICAgWiAgICBbICAgIFwgICAgXSAgICBeIF8KKyAgICAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ0QnLCAnUicsICdEJywgJ1InLAorICAgICdSJywKIAotICAvLyBgICAgIGEgICAgYiAgICBjICAgIGQgICAgZSAgICBmICAgIGcgICAgaCAgICBpICAgIGogICAgayAgICBsICAgIG0gICAgbiAgICBvCi0gICAgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLAorICAgIC8vIGAgICAgYSAgICBiICAgIGMgICAgZCAgICBlICAgIGYgICAgZyAgICBoICAgIGkgICAgaiAgICBrICAgIGwgICAgbSAgICBuIG8KKyAgICAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLAorICAgICdSJywKIAotICAvLyBwICAgIHEgICAgciAgICBzICAgIHQgICAgdSAgICB2ICAgIHcgICAgeCAgICB5ICAgIHogICAgeyAgICB8ICAgIH0gICAgfiAgIERFTAotICAgICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnRCcsICdSJywgJ0QnLCAnUicsICdSJywKKyAgICAvLyBwICAgIHEgICAgciAgICBzICAgIHQgICAgdSAgICB2ICAgIHcgICAgeCAgICB5ICAgIHogICAgeyAgICB8ICAgIH0gICAgfgorICAgIC8vIERFTAorICAgICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnRCcsICdSJywgJ0QnLCAnUicsCisgICAgJ1InLAogCi0gICAgJ1cnLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLAotICAgICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywKLSAgICAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsCi0gICAgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLAotICAgICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywKLSAgICAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsCi0gICAgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLAotICAgICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdXJwotfTsKKyAgICAnVycsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLAorICAgICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsCisgICAgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywKKyAgICAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLAorICAgICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsCisgICAgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywKKyAgICAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLAorICAgICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsCisgICAgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnVyd9OwogCi0jaWZuZGVmIE1BWF9QQVRICi0jZGVmaW5lIE1BWF9QQVRIIDQwOTYKLSNlbmRpZgotQ1BERl9TaW1wbGVQYXJzZXI6OkNQREZfU2ltcGxlUGFyc2VyKEZYX0xQQ0JZVEUgcERhdGEsIEZYX0RXT1JEIGR3U2l6ZSkKLXsKLSAgICBtX3BEYXRhID0gcERhdGE7Ci0gICAgbV9kd1NpemUgPSBkd1NpemU7Ci0gICAgbV9kd0N1clBvcyA9IDA7CitDUERGX1NpbXBsZVBhcnNlcjo6Q1BERl9TaW1wbGVQYXJzZXIoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3U2l6ZSkgeworICBtX3BEYXRhID0gcERhdGE7CisgIG1fZHdTaXplID0gZHdTaXplOworICBtX2R3Q3VyUG9zID0gMDsKIH0KLUNQREZfU2ltcGxlUGFyc2VyOjpDUERGX1NpbXBsZVBhcnNlcihGWF9CU1RSIHN0cikKLXsKLSAgICBtX3BEYXRhID0gc3RyLkdldFB0cigpOwotICAgIG1fZHdTaXplID0gc3RyLkdldExlbmd0aCgpOwotICAgIG1fZHdDdXJQb3MgPSAwOworQ1BERl9TaW1wbGVQYXJzZXI6OkNQREZfU2ltcGxlUGFyc2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSB7CisgIG1fcERhdGEgPSBzdHIuR2V0UHRyKCk7CisgIG1fZHdTaXplID0gc3RyLkdldExlbmd0aCgpOworICBtX2R3Q3VyUG9zID0gMDsKIH0KLXZvaWQgQ1BERl9TaW1wbGVQYXJzZXI6OlBhcnNlV29yZChGWF9MUENCWVRFJiBwU3RhcnQsIEZYX0RXT1JEJiBkd1NpemUsIGludCYgdHlwZSkKLXsKLSAgICBwU3RhcnQgPSBOVUxMOwotICAgIGR3U2l6ZSA9IDA7Ci0gICAgdHlwZSA9IFBERldPUkRfRU9GOwotICAgIEZYX0JZVEUgY2g7Ci0gICAgY2hhciBjaGFydHlwZTsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAobV9kd1NpemUgPD0gbV9kd0N1clBvcykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNoID0gbV9wRGF0YVttX2R3Q3VyUG9zKytdOwotICAgICAgICBjaGFydHlwZSA9IFBERl9DaGFyVHlwZVtjaF07Ci0gICAgICAgIHdoaWxlIChjaGFydHlwZSA9PSAnVycpIHsKLSAgICAgICAgICAgIGlmIChtX2R3U2l6ZSA8PSBtX2R3Q3VyUG9zKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2ggPSBtX3BEYXRhW21fZHdDdXJQb3MrK107Ci0gICAgICAgICAgICBjaGFydHlwZSA9IFBERl9DaGFyVHlwZVtjaF07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoICE9ICclJykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgIGlmIChtX2R3U2l6ZSA8PSBtX2R3Q3VyUG9zKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2ggPSBtX3BEYXRhW21fZHdDdXJQb3MrK107Ci0gICAgICAgICAgICBpZiAoY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2hhcnR5cGUgPSBQREZfQ2hhclR5cGVbY2hdOwotICAgIH0KLSAgICBGWF9EV09SRCBzdGFydF9wb3MgPSBtX2R3Q3VyUG9zIC0gMTsKLSAgICBwU3RhcnQgPSBtX3BEYXRhICsgc3RhcnRfcG9zOwotICAgIGlmIChjaGFydHlwZSA9PSAnRCcpIHsKLSAgICAgICAgaWYgKGNoID09ICcvJykgewotICAgICAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgICAgICBpZiAobV9kd1NpemUgPD0gbV9kd0N1clBvcykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNoID0gbV9wRGF0YVttX2R3Q3VyUG9zKytdOwotICAgICAgICAgICAgICAgIGNoYXJ0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKLSAgICAgICAgICAgICAgICBpZiAoY2hhcnR5cGUgIT0gJ1InICYmIGNoYXJ0eXBlICE9ICdOJykgewotICAgICAgICAgICAgICAgICAgICBtX2R3Q3VyUG9zIC0tOwotICAgICAgICAgICAgICAgICAgICBkd1NpemUgPSBtX2R3Q3VyUG9zIC0gc3RhcnRfcG9zOwotICAgICAgICAgICAgICAgICAgICB0eXBlID0gUERGV09SRF9OQU1FOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHlwZSA9IFBERldPUkRfREVMSU1JVEVSOwotICAgICAgICAgICAgZHdTaXplID0gMTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnPCcpIHsKLSAgICAgICAgICAgICAgICBpZiAobV9kd1NpemUgPD0gbV9kd0N1clBvcykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNoID0gbV9wRGF0YVttX2R3Q3VyUG9zKytdOwotICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnPCcpIHsKLSAgICAgICAgICAgICAgICAgICAgZHdTaXplID0gMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtX2R3Q3VyUG9zIC0tOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJz4nKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fZHdTaXplIDw9IG1fZHdDdXJQb3MpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjaCA9IG1fcERhdGFbbV9kd0N1clBvcysrXTsKLSAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJz4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGR3U2l6ZSA9IDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbV9kd0N1clBvcyAtLTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KK3ZvaWQgQ1BERl9TaW1wbGVQYXJzZXI6OlBhcnNlV29yZChjb25zdCB1aW50OF90KiYgcFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkd1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiB0eXBlKSB7CisgIHBTdGFydCA9IE5VTEw7CisgIGR3U2l6ZSA9IDA7CisgIHR5cGUgPSBQREZXT1JEX0VPRjsKKyAgdWludDhfdCBjaDsKKyAgd2hpbGUgKDEpIHsKKyAgICBpZiAobV9kd1NpemUgPD0gbV9kd0N1clBvcykKKyAgICAgIHJldHVybjsKKyAgICBjaCA9IG1fcERhdGFbbV9kd0N1clBvcysrXTsKKyAgICB3aGlsZSAoUERGQ2hhcklzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgIGlmIChtX2R3U2l6ZSA8PSBtX2R3Q3VyUG9zKQogICAgICAgICByZXR1cm47CisgICAgICBjaCA9IG1fcERhdGFbbV9kd0N1clBvcysrXTsKICAgICB9Ci0gICAgdHlwZSA9IFBERldPUkRfTlVNQkVSOwotICAgIGR3U2l6ZSA9IDE7CisKKyAgICBpZiAoY2ggIT0gJyUnKQorICAgICAgYnJlYWs7CisKICAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoY2hhcnR5cGUgIT0gJ04nKSB7Ci0gICAgICAgICAgICB0eXBlID0gUERGV09SRF9URVhUOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX2R3U2l6ZSA8PSBtX2R3Q3VyUG9zKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICAgIGlmIChtX2R3U2l6ZSA8PSBtX2R3Q3VyUG9zKQorICAgICAgICByZXR1cm47CisgICAgICBjaCA9IG1fcERhdGFbbV9kd0N1clBvcysrXTsKKyAgICAgIGlmIChjaCA9PSAnXHInIHx8IGNoID09ICdcbicpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIEZYX0RXT1JEIHN0YXJ0X3BvcyA9IG1fZHdDdXJQb3MgLSAxOworICBwU3RhcnQgPSBtX3BEYXRhICsgc3RhcnRfcG9zOworICBpZiAoUERGQ2hhcklzRGVsaW1pdGVyKGNoKSkgeworICAgIGlmIChjaCA9PSAnLycpIHsKKyAgICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmIChtX2R3U2l6ZSA8PSBtX2R3Q3VyUG9zKQorICAgICAgICAgIHJldHVybjsKICAgICAgICAgY2ggPSBtX3BEYXRhW21fZHdDdXJQb3MrK107Ci0gICAgICAgIGNoYXJ0eXBlID0gUERGX0NoYXJUeXBlW2NoXTsKLSAgICAgICAgaWYgKGNoYXJ0eXBlID09ICdEJyB8fCBjaGFydHlwZSA9PSAnVycpIHsKLSAgICAgICAgICAgIG1fZHdDdXJQb3MgLS07Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKCFQREZDaGFySXNPdGhlcihjaCkgJiYgIVBERkNoYXJJc051bWVyaWMoY2gpKSB7CisgICAgICAgICAgbV9kd0N1clBvcy0tOworICAgICAgICAgIGR3U2l6ZSA9IG1fZHdDdXJQb3MgLSBzdGFydF9wb3M7CisgICAgICAgICAgdHlwZSA9IFBERldPUkRfTkFNRTsKKyAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgZHdTaXplICsrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB0eXBlID0gUERGV09SRF9ERUxJTUlURVI7CisgICAgICBkd1NpemUgPSAxOworICAgICAgaWYgKGNoID09ICc8JykgeworICAgICAgICBpZiAobV9kd1NpemUgPD0gbV9kd0N1clBvcykKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIGNoID0gbV9wRGF0YVttX2R3Q3VyUG9zKytdOworICAgICAgICBpZiAoY2ggPT0gJzwnKQorICAgICAgICAgIGR3U2l6ZSA9IDI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBtX2R3Q3VyUG9zLS07CisgICAgICB9IGVsc2UgaWYgKGNoID09ICc+JykgeworICAgICAgICBpZiAobV9kd1NpemUgPD0gbV9kd0N1clBvcykKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIGNoID0gbV9wRGF0YVttX2R3Q3VyUG9zKytdOworICAgICAgICBpZiAoY2ggPT0gJz4nKQorICAgICAgICAgIGR3U2l6ZSA9IDI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBtX2R3Q3VyUG9zLS07CisgICAgICB9CiAgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIHR5cGUgPSBQREZXT1JEX05VTUJFUjsKKyAgZHdTaXplID0gMTsKKyAgd2hpbGUgKDEpIHsKKyAgICBpZiAoIVBERkNoYXJJc051bWVyaWMoY2gpKQorICAgICAgdHlwZSA9IFBERldPUkRfVEVYVDsKKyAgICBpZiAobV9kd1NpemUgPD0gbV9kd0N1clBvcykKKyAgICAgIHJldHVybjsKKyAgICBjaCA9IG1fcERhdGFbbV9kd0N1clBvcysrXTsKKworICAgIGlmIChQREZDaGFySXNEZWxpbWl0ZXIoY2gpIHx8IFBERkNoYXJJc1doaXRlc3BhY2UoY2gpKSB7CisgICAgICBtX2R3Q3VyUG9zLS07CisgICAgICBicmVhazsKKyAgICB9CisgICAgZHdTaXplKys7CisgIH0KIH0KLUNGWF9CeXRlU3RyaW5nQyBDUERGX1NpbXBsZVBhcnNlcjo6R2V0V29yZCgpCi17Ci0gICAgRlhfTFBDQllURSBwU3RhcnQ7Ci0gICAgRlhfRFdPUkQgZHdTaXplOwotICAgIGludCB0eXBlOwotICAgIFBhcnNlV29yZChwU3RhcnQsIGR3U2l6ZSwgdHlwZSk7Ci0gICAgaWYgKGR3U2l6ZSA9PSAxICYmIHBTdGFydFswXSA9PSAnPCcpIHsKLSAgICAgICAgd2hpbGUgKG1fZHdDdXJQb3MgPCBtX2R3U2l6ZSAmJiBtX3BEYXRhW21fZHdDdXJQb3NdICE9ICc+JykgewotICAgICAgICAgICAgbV9kd0N1clBvcyArKzsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9kd0N1clBvcyA8IG1fZHdTaXplKSB7Ci0gICAgICAgICAgICBtX2R3Q3VyUG9zICsrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MocFN0YXJ0LCAoRlhfU1RSU0laRSkobV9kd0N1clBvcyAtIChwU3RhcnQgLSBtX3BEYXRhKSkpOwotICAgIH0gZWxzZSBpZiAoZHdTaXplID09IDEgJiYgcFN0YXJ0WzBdID09ICcoJykgewotICAgICAgICBpbnQgbGV2ZWwgPSAxOwotICAgICAgICB3aGlsZSAobV9kd0N1clBvcyA8IG1fZHdTaXplKSB7Ci0gICAgICAgICAgICBpZiAobV9wRGF0YVttX2R3Q3VyUG9zXSA9PSAnKScpIHsKLSAgICAgICAgICAgICAgICBsZXZlbCAtLTsKLSAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9wRGF0YVttX2R3Q3VyUG9zXSA9PSAnXFwnKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fZHdTaXplIDw9IG1fZHdDdXJQb3MpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fZHdDdXJQb3MgKys7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1fcERhdGFbbV9kd0N1clBvc10gPT0gJygnKSB7Ci0gICAgICAgICAgICAgICAgbGV2ZWwgKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9kd1NpemUgPD0gbV9kd0N1clBvcykgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9kd0N1clBvcyArKzsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9kd0N1clBvcyA8IG1fZHdTaXplKSB7Ci0gICAgICAgICAgICBtX2R3Q3VyUG9zICsrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MocFN0YXJ0LCAoRlhfU1RSU0laRSkobV9kd0N1clBvcyAtIChwU3RhcnQgLSBtX3BEYXRhKSkpOworQ0ZYX0J5dGVTdHJpbmdDIENQREZfU2ltcGxlUGFyc2VyOjpHZXRXb3JkKCkgeworICBjb25zdCB1aW50OF90KiBwU3RhcnQ7CisgIEZYX0RXT1JEIGR3U2l6ZTsKKyAgaW50IHR5cGU7CisgIFBhcnNlV29yZChwU3RhcnQsIGR3U2l6ZSwgdHlwZSk7CisgIGlmIChkd1NpemUgPT0gMSAmJiBwU3RhcnRbMF0gPT0gJzwnKSB7CisgICAgd2hpbGUgKG1fZHdDdXJQb3MgPCBtX2R3U2l6ZSAmJiBtX3BEYXRhW21fZHdDdXJQb3NdICE9ICc+JykgeworICAgICAgbV9kd0N1clBvcysrOwogICAgIH0KLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKHBTdGFydCwgZHdTaXplKTsKKyAgICBpZiAobV9kd0N1clBvcyA8IG1fZHdTaXplKSB7CisgICAgICBtX2R3Q3VyUG9zKys7CisgICAgfQorICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MocFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX1NUUlNJWkUpKG1fZHdDdXJQb3MgLSAocFN0YXJ0IC0gbV9wRGF0YSkpKTsKKyAgfQorICBpZiAoZHdTaXplID09IDEgJiYgcFN0YXJ0WzBdID09ICcoJykgeworICAgIGludCBsZXZlbCA9IDE7CisgICAgd2hpbGUgKG1fZHdDdXJQb3MgPCBtX2R3U2l6ZSkgeworICAgICAgaWYgKG1fcERhdGFbbV9kd0N1clBvc10gPT0gJyknKSB7CisgICAgICAgIGxldmVsLS07CisgICAgICAgIGlmIChsZXZlbCA9PSAwKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChtX3BEYXRhW21fZHdDdXJQb3NdID09ICdcXCcpIHsKKyAgICAgICAgaWYgKG1fZHdTaXplIDw9IG1fZHdDdXJQb3MpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBtX2R3Q3VyUG9zKys7CisgICAgICB9IGVsc2UgaWYgKG1fcERhdGFbbV9kd0N1clBvc10gPT0gJygnKSB7CisgICAgICAgIGxldmVsKys7CisgICAgICB9CisgICAgICBpZiAobV9kd1NpemUgPD0gbV9kd0N1clBvcykgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIG1fZHdDdXJQb3MrKzsKKyAgICB9CisgICAgaWYgKG1fZHdDdXJQb3MgPCBtX2R3U2l6ZSkgeworICAgICAgbV9kd0N1clBvcysrOworICAgIH0KKyAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKHBTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9TVFJTSVpFKShtX2R3Q3VyUG9zIC0gKHBTdGFydCAtIG1fcERhdGEpKSk7CisgIH0KKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQyhwU3RhcnQsIGR3U2l6ZSk7CiB9Ci1GWF9CT09MIENQREZfU2ltcGxlUGFyc2VyOjpTZWFyY2hUb2tlbihGWF9CU1RSIHRva2VuKQotewotICAgIGludCB0b2tlbl9sZW4gPSB0b2tlbi5HZXRMZW5ndGgoKTsKLSAgICB3aGlsZSAobV9kd0N1clBvcyA8IG1fZHdTaXplIC0gdG9rZW5fbGVuKSB7Ci0gICAgICAgIGlmIChGWFNZU19tZW1jbXAzMihtX3BEYXRhICsgbV9kd0N1clBvcywgdG9rZW4uR2V0UHRyKCksIHRva2VuX2xlbikgPT0gMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbV9kd0N1clBvcyArKzsKK0ZYX0JPT0wgQ1BERl9TaW1wbGVQYXJzZXI6OlNlYXJjaFRva2VuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdG9rZW4pIHsKKyAgaW50IHRva2VuX2xlbiA9IHRva2VuLkdldExlbmd0aCgpOworICB3aGlsZSAobV9kd0N1clBvcyA8IG1fZHdTaXplIC0gdG9rZW5fbGVuKSB7CisgICAgaWYgKEZYU1lTX21lbWNtcChtX3BEYXRhICsgbV9kd0N1clBvcywgdG9rZW4uR2V0UHRyKCksIHRva2VuX2xlbikgPT0gMCkgeworICAgICAgYnJlYWs7CiAgICAgfQotICAgIGlmIChtX2R3Q3VyUG9zID09IG1fZHdTaXplIC0gdG9rZW5fbGVuKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9kd0N1clBvcyArPSB0b2tlbl9sZW47Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENQREZfU2ltcGxlUGFyc2VyOjpTa2lwV29yZChGWF9CU1RSIHRva2VuKQotewotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nQyB3b3JkID0gR2V0V29yZCgpOwotICAgICAgICBpZiAod29yZC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAod29yZCA9PSB0b2tlbikgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICB9CisgICAgbV9kd0N1clBvcysrOworICB9CisgIGlmIChtX2R3Q3VyUG9zID09IG1fZHdTaXplIC0gdG9rZW5fbGVuKSB7CiAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fZHdDdXJQb3MgKz0gdG9rZW5fbGVuOworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ1BERl9TaW1wbGVQYXJzZXI6OkZpbmRUYWdQYWlyKEZYX0JTVFIgc3RhcnRfdG9rZW4sIEZYX0JTVFIgZW5kX3Rva2VuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHN0YXJ0X3BvcywgRlhfRFdPUkQmIGVuZF9wb3MpCi17Ci0gICAgaWYgKCFzdGFydF90b2tlbi5Jc0VtcHR5KCkpIHsKLSAgICAgICAgaWYgKCFTa2lwV29yZChzdGFydF90b2tlbikpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBzdGFydF9wb3MgPSBtX2R3Q3VyUG9zOworRlhfQk9PTCBDUERGX1NpbXBsZVBhcnNlcjo6U2tpcFdvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0b2tlbikgeworICB3aGlsZSAoMSkgeworICAgIENGWF9CeXRlU3RyaW5nQyB3b3JkID0gR2V0V29yZCgpOworICAgIGlmICh3b3JkLklzRW1wdHkoKSkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBlbmRfcG9zID0gbV9kd0N1clBvczsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDIHdvcmQgPSBHZXRXb3JkKCk7Ci0gICAgICAgIGlmICh3b3JkLklzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3b3JkID09IGVuZF90b2tlbikgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KKyAgICBpZiAod29yZCA9PSB0b2tlbikgeworICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1GWF9CT09MIENQREZfU2ltcGxlUGFyc2VyOjpGaW5kVGFnUGFyYW0oRlhfQlNUUiB0b2tlbiwgaW50IG5QYXJhbXMpCi17Ci0gICAgblBhcmFtcyArKzsKLSAgICBGWF9EV09SRCogcEJ1ZiA9IEZYX0FsbG9jKEZYX0RXT1JELCBuUGFyYW1zKTsKLSAgICBpbnQgYnVmX2luZGV4ID0gMDsKLSAgICBpbnQgYnVmX2NvdW50ID0gMDsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBwQnVmW2J1Zl9pbmRleCsrXSA9IG1fZHdDdXJQb3M7Ci0gICAgICAgIGlmIChidWZfaW5kZXggPT0gblBhcmFtcykgewotICAgICAgICAgICAgYnVmX2luZGV4ID0gMDsKLSAgICAgICAgfQotICAgICAgICBidWZfY291bnQgKys7Ci0gICAgICAgIGlmIChidWZfY291bnQgPiBuUGFyYW1zKSB7Ci0gICAgICAgICAgICBidWZfY291bnQgPSBuUGFyYW1zOwotICAgICAgICB9Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nQyB3b3JkID0gR2V0V29yZCgpOwotICAgICAgICBpZiAod29yZC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIEZYX0ZyZWUocEJ1Zik7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdvcmQgPT0gdG9rZW4pIHsKLSAgICAgICAgICAgIGlmIChidWZfY291bnQgPCBuUGFyYW1zKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2R3Q3VyUG9zID0gcEJ1ZltidWZfaW5kZXhdOwotICAgICAgICAgICAgRlhfRnJlZShwQnVmKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9CitGWF9CT09MIENQREZfU2ltcGxlUGFyc2VyOjpGaW5kVGFnUGFpcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0YXJ0X3Rva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBlbmRfdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgc3RhcnRfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGVuZF9wb3MpIHsKKyAgaWYgKCFzdGFydF90b2tlbi5Jc0VtcHR5KCkpIHsKKyAgICBpZiAoIVNraXBXb3JkKHN0YXJ0X3Rva2VuKSkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgc3RhcnRfcG9zID0gbV9kd0N1clBvczsKKyAgfQorICB3aGlsZSAoMSkgeworICAgIGVuZF9wb3MgPSBtX2R3Q3VyUG9zOworICAgIENGWF9CeXRlU3RyaW5nQyB3b3JkID0gR2V0V29yZCgpOworICAgIGlmICh3b3JkLklzRW1wdHkoKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZiAod29yZCA9PSBlbmRfdG9rZW4pIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1zdGF0aWMgaW50IF9oZXgyZGVjKGNoYXIgY2gpCi17Ci0gICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKLSAgICAgICAgcmV0dXJuIGNoIC0gJzAnOworRlhfQk9PTCBDUERGX1NpbXBsZVBhcnNlcjo6RmluZFRhZ1BhcmFtKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5QYXJhbXMpIHsKKyAgblBhcmFtcysrOworICBGWF9EV09SRCogcEJ1ZiA9IEZYX0FsbG9jKEZYX0RXT1JELCBuUGFyYW1zKTsKKyAgaW50IGJ1Zl9pbmRleCA9IDA7CisgIGludCBidWZfY291bnQgPSAwOworICB3aGlsZSAoMSkgeworICAgIHBCdWZbYnVmX2luZGV4KytdID0gbV9kd0N1clBvczsKKyAgICBpZiAoYnVmX2luZGV4ID09IG5QYXJhbXMpIHsKKyAgICAgIGJ1Zl9pbmRleCA9IDA7CiAgICAgfQotICAgIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKSB7Ci0gICAgICAgIHJldHVybiBjaCAtICdhJyArIDEwOworICAgIGJ1Zl9jb3VudCsrOworICAgIGlmIChidWZfY291bnQgPiBuUGFyYW1zKSB7CisgICAgICBidWZfY291bnQgPSBuUGFyYW1zOwogICAgIH0KLSAgICBpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykgewotICAgICAgICByZXR1cm4gY2ggLSAnQScgKyAxMDsKKyAgICBDRlhfQnl0ZVN0cmluZ0Mgd29yZCA9IEdldFdvcmQoKTsKKyAgICBpZiAod29yZC5Jc0VtcHR5KCkpIHsKKyAgICAgIEZYX0ZyZWUocEJ1Zik7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIHJldHVybiAwOworICAgIGlmICh3b3JkID09IHRva2VuKSB7CisgICAgICBpZiAoYnVmX2NvdW50IDwgblBhcmFtcykgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIG1fZHdDdXJQb3MgPSBwQnVmW2J1Zl9pbmRleF07CisgICAgICBGWF9GcmVlKHBCdWYpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIHJldHVybiBGQUxTRTsKIH0KLUNGWF9CeXRlU3RyaW5nIFBERl9OYW1lRGVjb2RlKEZYX0JTVFIgYnN0cikKLXsKLSAgICBpbnQgc2l6ZSA9IGJzdHIuR2V0TGVuZ3RoKCk7Ci0gICAgRlhfTFBDU1RSIHBTcmMgPSBic3RyLkdldENTdHIoKTsKLSAgICBpZiAoRlhTWVNfbWVtY2hyKHBTcmMsICcjJywgc2l6ZSkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gYnN0cjsKKworQ0ZYX0J5dGVTdHJpbmcgUERGX05hbWVEZWNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic3RyKSB7CisgIGludCBzaXplID0gYnN0ci5HZXRMZW5ndGgoKTsKKyAgY29uc3QgRlhfQ0hBUiogcFNyYyA9IGJzdHIuR2V0Q1N0cigpOworICBpZiAoIUZYU1lTX21lbWNocihwU3JjLCAnIycsIHNpemUpKSB7CisgICAgcmV0dXJuIGJzdHI7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0OworICBGWF9DSEFSKiBwRGVzdFN0YXJ0ID0gcmVzdWx0LkdldEJ1ZmZlcihzaXplKTsKKyAgRlhfQ0hBUiogcERlc3QgPSBwRGVzdFN0YXJ0OworICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIGlmIChwU3JjW2ldID09ICcjJyAmJiBpIDwgc2l6ZSAtIDIpIHsKKyAgICAgICpwRGVzdCsrID0KKyAgICAgICAgICBGWFNZU190b0hleERpZ2l0KHBTcmNbaSArIDFdKSAqIDE2ICsgRlhTWVNfdG9IZXhEaWdpdChwU3JjW2kgKyAyXSk7CisgICAgICBpICs9IDI7CisgICAgfSBlbHNlIHsKKyAgICAgICpwRGVzdCsrID0gcFNyY1tpXTsKICAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0OwotICAgIEZYX0xQU1RSIHBEZXN0U3RhcnQgPSByZXN1bHQuR2V0QnVmZmVyKHNpemUpOwotICAgIEZYX0xQU1RSIHBEZXN0ID0gcERlc3RTdGFydDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkgKyspIHsKLSAgICAgICAgaWYgKHBTcmNbaV0gPT0gJyMnICYmIGkgPCBzaXplIC0gMikgewotICAgICAgICAgICAgKnBEZXN0ICsrID0gX2hleDJkZWMocFNyY1tpICsgMV0pICogMTYgKyBfaGV4MmRlYyhwU3JjW2kgKyAyXSk7Ci0gICAgICAgICAgICBpICs9IDI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqcERlc3QgKysgPSBwU3JjW2ldOwotICAgICAgICB9Ci0gICAgfQotICAgIHJlc3VsdC5SZWxlYXNlQnVmZmVyKChGWF9TVFJTSVpFKShwRGVzdCAtIHBEZXN0U3RhcnQpKTsKLSAgICByZXR1cm4gcmVzdWx0OworICB9CisgIHJlc3VsdC5SZWxlYXNlQnVmZmVyKChGWF9TVFJTSVpFKShwRGVzdCAtIHBEZXN0U3RhcnQpKTsKKyAgcmV0dXJuIHJlc3VsdDsKIH0KLUNGWF9CeXRlU3RyaW5nIFBERl9OYW1lRGVjb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvcmlnKQotewotICAgIGlmIChGWFNZU19tZW1jaHIob3JpZy5jX3N0cigpLCAnIycsIG9yaWcuR2V0TGVuZ3RoKCkpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIG9yaWc7Ci0gICAgfQotICAgIHJldHVybiBQREZfTmFtZURlY29kZShDRlhfQnl0ZVN0cmluZ0Mob3JpZykpOworQ0ZYX0J5dGVTdHJpbmcgUERGX05hbWVEZWNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG9yaWcpIHsKKyAgaWYgKCFGWFNZU19tZW1jaHIob3JpZy5jX3N0cigpLCAnIycsIG9yaWcuR2V0TGVuZ3RoKCkpKSB7CisgICAgcmV0dXJuIG9yaWc7CisgIH0KKyAgcmV0dXJuIFBERl9OYW1lRGVjb2RlKENGWF9CeXRlU3RyaW5nQyhvcmlnKSk7CiB9Ci1DRlhfQnl0ZVN0cmluZyBQREZfTmFtZUVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgb3JpZykKLXsKLSAgICBGWF9MUEJZVEUgc3JjX2J1ZiA9IChGWF9MUEJZVEUpb3JpZy5jX3N0cigpOwotICAgIGludCBzcmNfbGVuID0gb3JpZy5HZXRMZW5ndGgoKTsKLSAgICBpbnQgZGVzdF9sZW4gPSAwOwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBzcmNfbGVuOyBpICsrKSB7Ci0gICAgICAgIEZYX0JZVEUgY2ggPSBzcmNfYnVmW2ldOwotICAgICAgICBpZiAoY2ggPj0gMHg4MCB8fCBQREZfQ2hhclR5cGVbY2hdID09ICdXJyB8fCBjaCA9PSAnIycgfHwKLSAgICAgICAgICAgICAgICBQREZfQ2hhclR5cGVbY2hdID09ICdEJykgewotICAgICAgICAgICAgZGVzdF9sZW4gKz0gMzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlc3RfbGVuICsrOwotICAgICAgICB9CitDRlhfQnl0ZVN0cmluZyBQREZfTmFtZUVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgb3JpZykgeworICB1aW50OF90KiBzcmNfYnVmID0gKHVpbnQ4X3QqKW9yaWcuY19zdHIoKTsKKyAgaW50IHNyY19sZW4gPSBvcmlnLkdldExlbmd0aCgpOworICBpbnQgZGVzdF9sZW4gPSAwOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHNyY19sZW47IGkrKykgeworICAgIHVpbnQ4X3QgY2ggPSBzcmNfYnVmW2ldOworICAgIGlmIChjaCA+PSAweDgwIHx8IFBERkNoYXJJc1doaXRlc3BhY2UoY2gpIHx8IGNoID09ICcjJyB8fAorICAgICAgICBQREZDaGFySXNEZWxpbWl0ZXIoY2gpKSB7CisgICAgICBkZXN0X2xlbiArPSAzOworICAgIH0gZWxzZSB7CisgICAgICBkZXN0X2xlbisrOwogICAgIH0KLSAgICBpZiAoZGVzdF9sZW4gPT0gc3JjX2xlbikgewotICAgICAgICByZXR1cm4gb3JpZzsKKyAgfQorICBpZiAoZGVzdF9sZW4gPT0gc3JjX2xlbikKKyAgICByZXR1cm4gb3JpZzsKKworICBDRlhfQnl0ZVN0cmluZyByZXM7CisgIEZYX0NIQVIqIGRlc3RfYnVmID0gcmVzLkdldEJ1ZmZlcihkZXN0X2xlbik7CisgIGRlc3RfbGVuID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IHNyY19sZW47IGkrKykgeworICAgIHVpbnQ4X3QgY2ggPSBzcmNfYnVmW2ldOworICAgIGlmIChjaCA+PSAweDgwIHx8IFBERkNoYXJJc1doaXRlc3BhY2UoY2gpIHx8IGNoID09ICcjJyB8fAorICAgICAgICBQREZDaGFySXNEZWxpbWl0ZXIoY2gpKSB7CisgICAgICBkZXN0X2J1ZltkZXN0X2xlbisrXSA9ICcjJzsKKyAgICAgIGRlc3RfYnVmW2Rlc3RfbGVuKytdID0gIjAxMjM0NTY3ODlBQkNERUYiW2NoIC8gMTZdOworICAgICAgZGVzdF9idWZbZGVzdF9sZW4rK10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiJbY2ggJSAxNl07CisgICAgfSBlbHNlIHsKKyAgICAgIGRlc3RfYnVmW2Rlc3RfbGVuKytdID0gY2g7CiAgICAgfQotICAgIENGWF9CeXRlU3RyaW5nIHJlczsKLSAgICBGWF9MUFNUUiBkZXN0X2J1ZiA9IHJlcy5HZXRCdWZmZXIoZGVzdF9sZW4pOwotICAgIGRlc3RfbGVuID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc3JjX2xlbjsgaSArKykgewotICAgICAgICBGWF9CWVRFIGNoID0gc3JjX2J1ZltpXTsKLSAgICAgICAgaWYgKGNoID49IDB4ODAgfHwgUERGX0NoYXJUeXBlW2NoXSA9PSAnVycgfHwgY2ggPT0gJyMnIHx8Ci0gICAgICAgICAgICAgICAgUERGX0NoYXJUeXBlW2NoXSA9PSAnRCcpIHsKLSAgICAgICAgICAgIGRlc3RfYnVmW2Rlc3RfbGVuKytdID0gJyMnOwotICAgICAgICAgICAgZGVzdF9idWZbZGVzdF9sZW4rK10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiJbY2ggLyAxNl07Ci0gICAgICAgICAgICBkZXN0X2J1ZltkZXN0X2xlbisrXSA9ICIwMTIzNDU2Nzg5QUJDREVGIltjaCAlIDE2XTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlc3RfYnVmW2Rlc3RfbGVuKytdID0gY2g7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZGVzdF9idWZbZGVzdF9sZW5dID0gMDsKLSAgICByZXMuUmVsZWFzZUJ1ZmZlcigpOwotICAgIHJldHVybiByZXM7CisgIH0KKyAgZGVzdF9idWZbZGVzdF9sZW5dID0gMDsKKyAgcmVzLlJlbGVhc2VCdWZmZXIoKTsKKyAgcmV0dXJuIHJlczsKIH0KLUNGWF9CeXRlVGV4dEJ1ZiYgb3BlcmF0b3IgPDwgKENGWF9CeXRlVGV4dEJ1ZiYgYnVmLCBjb25zdCBDUERGX09iamVjdCogcE9iaikKLXsKLSAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiIG51bGwiKTsKLSAgICAgICAgcmV0dXJuIGJ1ZjsKLSAgICB9Ci0gICAgc3dpdGNoIChwT2JqLT5HZXRUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBQREZPQkpfTlVMTDoKLSAgICAgICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiIG51bGwiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBERk9CSl9CT09MRUFOOgotICAgICAgICBjYXNlIFBERk9CSl9OVU1CRVI6Ci0gICAgICAgICAgICBidWYgPDwgIiAiIDw8IHBPYmotPkdldFN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUERGT0JKX1NUUklORzogewotICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IHBPYmotPkdldFN0cmluZygpOwotICAgICAgICAgICAgICAgIEZYX0JPT0wgYkhleCA9ICgoQ1BERl9TdHJpbmcqKXBPYmopLT5Jc0hleCgpOwotICAgICAgICAgICAgICAgIGJ1ZiA8PCBQREZfRW5jb2RlU3RyaW5nKHN0ciwgYkhleCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgUERGT0JKX05BTUU6IHsKLSAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBwT2JqLT5HZXRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBidWYgPDwgRlhfQlNUUkMoIi8iKSA8PCBQREZfTmFtZUVuY29kZShzdHIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIFBERk9CSl9SRUZFUkVOQ0U6IHsKLSAgICAgICAgICAgICAgICBDUERGX1JlZmVyZW5jZSogcCA9IChDUERGX1JlZmVyZW5jZSopcE9iajsKLSAgICAgICAgICAgICAgICBidWYgPDwgIiAiIDw8IHAtPkdldFJlZk9iak51bSgpIDw8IEZYX0JTVFJDKCIgMCBSICIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIFBERk9CSl9BUlJBWTogewotICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHAgPSAoQ1BERl9BcnJheSopcE9iajsKLSAgICAgICAgICAgICAgICBidWYgPDwgRlhfQlNUUkMoIlsiKTsKLSAgICAgICAgICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcC0+R2V0Q291bnQoKTsgaSArKykgewotICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcEVsZW1lbnQgPSBwLT5HZXRFbGVtZW50KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocEVsZW1lbnQtPkdldE9iak51bSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWYgPDwgIiAiIDw8IHBFbGVtZW50LT5HZXRPYmpOdW0oKSA8PCBGWF9CU1RSQygiIDAgUiIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmIDw8IHBFbGVtZW50OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiXSIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIFBERk9CSl9ESUNUSU9OQVJZOiB7Ci0gICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwID0gKENQREZfRGljdGlvbmFyeSopcE9iajsKLSAgICAgICAgICAgICAgICBidWYgPDwgRlhfQlNUUkMoIjw8Iik7Ci0gICAgICAgICAgICAgICAgRlhfUE9TSVRJT04gcG9zID0gcC0+R2V0U3RhcnRQb3MoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGtleTsKLSAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IHAtPkdldE5leHRFbGVtZW50KHBvcywga2V5KTsKLSAgICAgICAgICAgICAgICAgICAgYnVmIDw8IEZYX0JTVFJDKCIvIikgPDwgUERGX05hbWVFbmNvZGUoa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBWYWx1ZS0+R2V0T2JqTnVtKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA8PCAiICIgPDwgcFZhbHVlLT5HZXRPYmpOdW0oKSA8PCBGWF9CU1RSQygiIDAgUiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA8PCBwVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVmIDw8IEZYX0JTVFJDKCI+PiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIFBERk9CSl9TVFJFQU06IHsKLSAgICAgICAgICAgICAgICBDUERGX1N0cmVhbSogcCA9IChDUERGX1N0cmVhbSopcE9iajsKLSAgICAgICAgICAgICAgICBidWYgPDwgcC0+R2V0RGljdCgpIDw8IEZYX0JTVFJDKCJzdHJlYW1cclxuIik7Ci0gICAgICAgICAgICAgICAgQ1BERl9TdHJlYW1BY2MgYWNjOwotICAgICAgICAgICAgICAgIGFjYy5Mb2FkQWxsRGF0YShwLCBUUlVFKTsKLSAgICAgICAgICAgICAgICBidWYuQXBwZW5kQmxvY2soYWNjLkdldERhdGEoKSwgYWNjLkdldFNpemUoKSk7Ci0gICAgICAgICAgICAgICAgYnVmIDw8IEZYX0JTVFJDKCJcclxuZW5kc3RyZWFtIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBU1NFUlQoRkFMU0UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQorQ0ZYX0J5dGVUZXh0QnVmJiBvcGVyYXRvcjw8KENGWF9CeXRlVGV4dEJ1ZiYgYnVmLCBjb25zdCBDUERGX09iamVjdCogcE9iaikgeworICBpZiAoIXBPYmopIHsKKyAgICBidWYgPDwgIiBudWxsIjsKICAgICByZXR1cm4gYnVmOworICB9CisgIHN3aXRjaCAocE9iai0+R2V0VHlwZSgpKSB7CisgICAgY2FzZSBQREZPQkpfTlVMTDoKKyAgICAgIGJ1ZiA8PCAiIG51bGwiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQREZPQkpfQk9PTEVBTjoKKyAgICBjYXNlIFBERk9CSl9OVU1CRVI6CisgICAgICBidWYgPDwgIiAiIDw8IHBPYmotPkdldFN0cmluZygpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQREZPQkpfU1RSSU5HOgorICAgICAgYnVmIDw8IFBERl9FbmNvZGVTdHJpbmcocE9iai0+R2V0U3RyaW5nKCksIHBPYmotPkFzU3RyaW5nKCktPklzSGV4KCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQREZPQkpfTkFNRTogeworICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gcE9iai0+R2V0U3RyaW5nKCk7CisgICAgICBidWYgPDwgIi8iIDw8IFBERl9OYW1lRW5jb2RlKHN0cik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQREZPQkpfUkVGRVJFTkNFOiB7CisgICAgICBidWYgPDwgIiAiIDw8IHBPYmotPkFzUmVmZXJlbmNlKCktPkdldFJlZk9iak51bSgpIDw8ICIgMCBSICI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQREZPQkpfQVJSQVk6IHsKKyAgICAgIGNvbnN0IENQREZfQXJyYXkqIHAgPSBwT2JqLT5Bc0FycmF5KCk7CisgICAgICBidWYgPDwgIlsiOworICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHAtPkdldENvdW50KCk7IGkrKykgeworICAgICAgICBDUERGX09iamVjdCogcEVsZW1lbnQgPSBwLT5HZXRFbGVtZW50KGkpOworICAgICAgICBpZiAocEVsZW1lbnQtPkdldE9iak51bSgpKSB7CisgICAgICAgICAgYnVmIDw8ICIgIiA8PCBwRWxlbWVudC0+R2V0T2JqTnVtKCkgPDwgIiAwIFIiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJ1ZiA8PCBwRWxlbWVudDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnVmIDw8ICJdIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBERk9CSl9ESUNUSU9OQVJZOiB7CisgICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHAgPSBwT2JqLT5Bc0RpY3Rpb25hcnkoKTsKKyAgICAgIGJ1ZiA8PCAiPDwiOworICAgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6ICpwKSB7CisgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXkgPSBpdC5maXJzdDsKKyAgICAgICAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IGl0LnNlY29uZDsKKyAgICAgICAgYnVmIDw8ICIvIiA8PCBQREZfTmFtZUVuY29kZShrZXkpOworICAgICAgICBpZiAocFZhbHVlICYmIHBWYWx1ZS0+R2V0T2JqTnVtKCkpIHsKKyAgICAgICAgICBidWYgPDwgIiAiIDw8IHBWYWx1ZS0+R2V0T2JqTnVtKCkgPDwgIiAwIFIgIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBidWYgPDwgcFZhbHVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBidWYgPDwgIj4+IjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBERk9CSl9TVFJFQU06IHsKKyAgICAgIGNvbnN0IENQREZfU3RyZWFtKiBwID0gcE9iai0+QXNTdHJlYW0oKTsKKyAgICAgIGJ1ZiA8PCBwLT5HZXREaWN0KCkgPDwgInN0cmVhbVxyXG4iOworICAgICAgQ1BERl9TdHJlYW1BY2MgYWNjOworICAgICAgYWNjLkxvYWRBbGxEYXRhKHAsIFRSVUUpOworICAgICAgYnVmLkFwcGVuZEJsb2NrKGFjYy5HZXREYXRhKCksIGFjYy5HZXRTaXplKCkpOworICAgICAgYnVmIDw8ICJcclxuZW5kc3RyZWFtIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgQVNTRVJUKEZBTFNFKTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBidWY7CiB9Ci1GWF9GTE9BVCBQREZfQ2xpcEZsb2F0KEZYX0ZMT0FUIGYpCi17Ci0gICAgaWYgKGYgPCAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoZiA+IDEuMGYpIHsKLSAgICAgICAgcmV0dXJuIDEuMGY7Ci0gICAgfQotICAgIHJldHVybiBmOworRlhfRkxPQVQgUERGX0NsaXBGbG9hdChGWF9GTE9BVCBmKSB7CisgIGlmIChmIDwgMCkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChmID4gMS4wZikgeworICAgIHJldHVybiAxLjBmOworICB9CisgIHJldHVybiBmOwogfQotc3RhdGljIENQREZfT2JqZWN0KiBTZWFyY2hOdW1iZXJOb2RlKENQREZfRGljdGlvbmFyeSogcE5vZGUsIGludCBudW0pCi17Ci0gICAgQ1BERl9BcnJheSogcExpbWl0cyA9IHBOb2RlLT5HZXRBcnJheSgiTGltaXRzIik7Ci0gICAgaWYgKHBMaW1pdHMgJiYgKG51bSA8IHBMaW1pdHMtPkdldEludGVnZXIoMCkgfHwgbnVtID4gcExpbWl0cy0+R2V0SW50ZWdlcigxKSkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBOdW1iZXJzID0gcE5vZGUtPkdldEFycmF5KCJOdW1zIik7Ci0gICAgaWYgKHBOdW1iZXJzKSB7Ci0gICAgICAgIEZYX0RXT1JEIGR3Q291bnQgPSBwTnVtYmVycy0+R2V0Q291bnQoKSAvIDI7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBkd0NvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBwTnVtYmVycy0+R2V0SW50ZWdlcihpICogMik7Ci0gICAgICAgICAgICBpZiAobnVtID09IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBOdW1iZXJzLT5HZXRFbGVtZW50VmFsdWUoaSAqIDIgKyAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpbmRleCA+IG51bSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX0FycmF5KiBwS2lkcyA9IHBOb2RlLT5HZXRBcnJheSgiS2lkcyIpOwotICAgIGlmIChwS2lkcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEtpZHMtPkdldENvdW50KCk7IGkgKyspIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwS2lkID0gcEtpZHMtPkdldERpY3QoaSk7Ci0gICAgICAgIGlmIChwS2lkID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIENQREZfT2JqZWN0KiBwRm91bmQgPSBTZWFyY2hOdW1iZXJOb2RlKHBLaWQsIG51bSk7Ci0gICAgICAgIGlmIChwRm91bmQpIHsKLSAgICAgICAgICAgIHJldHVybiBwRm91bmQ7Ci0gICAgICAgIH0KK3N0YXRpYyBDUERGX09iamVjdCogU2VhcmNoTnVtYmVyTm9kZShDUERGX0RpY3Rpb25hcnkqIHBOb2RlLCBpbnQgbnVtKSB7CisgIENQREZfQXJyYXkqIHBMaW1pdHMgPSBwTm9kZS0+R2V0QXJyYXkoIkxpbWl0cyIpOworICBpZiAocExpbWl0cyAmJgorICAgICAgKG51bSA8IHBMaW1pdHMtPkdldEludGVnZXIoMCkgfHwgbnVtID4gcExpbWl0cy0+R2V0SW50ZWdlcigxKSkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX0FycmF5KiBwTnVtYmVycyA9IHBOb2RlLT5HZXRBcnJheSgiTnVtcyIpOworICBpZiAocE51bWJlcnMpIHsKKyAgICBGWF9EV09SRCBkd0NvdW50ID0gcE51bWJlcnMtPkdldENvdW50KCkgLyAyOworICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBkd0NvdW50OyBpKyspIHsKKyAgICAgIGludCBpbmRleCA9IHBOdW1iZXJzLT5HZXRJbnRlZ2VyKGkgKiAyKTsKKyAgICAgIGlmIChudW0gPT0gaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIHBOdW1iZXJzLT5HZXRFbGVtZW50VmFsdWUoaSAqIDIgKyAxKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmRleCA+IG51bSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9BcnJheSogcEtpZHMgPSBwTm9kZS0+R2V0QXJyYXkoIktpZHMiKTsKKyAgaWYgKCFwS2lkcykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwS2lkcy0+R2V0Q291bnQoKTsgaSsrKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwS2lkID0gcEtpZHMtPkdldERpY3QoaSk7CisgICAgaWYgKCFwS2lkKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgQ1BERl9PYmplY3QqIHBGb3VuZCA9IFNlYXJjaE51bWJlck5vZGUocEtpZCwgbnVtKTsKKyAgICBpZiAocEZvdW5kKSB7CisgICAgICByZXR1cm4gcEZvdW5kOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKIH0KLUNQREZfT2JqZWN0KiBDUERGX051bWJlclRyZWU6Okxvb2t1cFZhbHVlKGludCBudW0pCi17Ci0gICAgcmV0dXJuIFNlYXJjaE51bWJlck5vZGUobV9wUm9vdCwgbnVtKTsKK0NQREZfT2JqZWN0KiBDUERGX051bWJlclRyZWU6Okxvb2t1cFZhbHVlKGludCBudW0pIHsKKyAgcmV0dXJuIFNlYXJjaE51bWJlck5vZGUobV9wUm9vdCwgbnVtKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvcGFyc2VyX2ludC5oIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9wYXJzZXJfaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBiNWZjZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvcGFyc2VyX2ludC5oCkBAIC0wLDAgKzEsNTcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX1NSQ19GUERGQVBJX0ZQREZfUEFSU0VSX1BBUlNFUl9JTlRfSF8KKyNkZWZpbmUgQ09SRV9TUkNfRlBERkFQSV9GUERGX1BBUlNFUl9QQVJTRVJfSU5UX0hfCisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyZWFtLmgiCisKK2NsYXNzIENGWF9CaXRTdHJlYW07CitjbGFzcyBDUERGX0RhdGFBdmFpbDsKK2NsYXNzIENQREZfRGljdGlvbmFyeTsKK2NsYXNzIENQREZfU3RyZWFtOworY2xhc3MgSUZYX0Rvd25sb2FkSGludHM7CisKK2NsYXNzIENQREZfSGludFRhYmxlcyB7CisgcHVibGljOgorICBDUERGX0hpbnRUYWJsZXMoQ1BERl9EYXRhQXZhaWwqIHBEYXRhQXZhaWwsIENQREZfRGljdGlvbmFyeSogcExpbmVhcml6ZWQpCisgICAgICA6IG1fcExpbmVhcml6ZWREaWN0KHBMaW5lYXJpemVkKSwKKyAgICAgICAgbV9wRGF0YUF2YWlsKHBEYXRhQXZhaWwpLAorICAgICAgICBtX25GaXJzdFBhZ2VTaGFyZWRPYmpzKDApLAorICAgICAgICBtX3N6Rmlyc3RQYWdlT2JqT2Zmc2V0KDApIHt9CisgIH5DUERGX0hpbnRUYWJsZXMoKTsKKworICBGWF9CT09MIEdldFBhZ2VQb3MoaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUmIHN6UGFnZVN0YXJ0UG9zLAorICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUmIHN6UGFnZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkd09iak51bSk7CisgIElQREZfRGF0YUF2YWlsOjpEb2NBdmFpbFN0YXR1cyBDaGVja1BhZ2UoaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Eb3dubG9hZEhpbnRzKiBwSGludHMpOworICBGWF9CT09MIExvYWRIaW50U3RyZWFtKENQREZfU3RyZWFtKiBwSGludFN0cmVhbSk7CisKKyBwcm90ZWN0ZWQ6CisgIEZYX0JPT0wgUmVhZFBhZ2VIaW50VGFibGUoQ0ZYX0JpdFN0cmVhbSogaFN0cmVhbSk7CisgIEZYX0JPT0wgUmVhZFNoYXJlZE9iakhpbnRUYWJsZShDRlhfQml0U3RyZWFtKiBoU3RyZWFtLCBGWF9EV09SRCBvZmZzZXQpOworICBGWF9EV09SRCBHZXRJdGVtTGVuZ3RoKGludCBpbmRleCwgY29uc3QgQ0ZYX0ZpbGVTaXplQXJyYXkmIHN6QXJyYXkpOworCisgcHJpdmF0ZToKKyAgaW50IFJlYWRQcmltYXJ5SGludFN0cmVhbU9mZnNldCgpIGNvbnN0OworICBpbnQgUmVhZFByaW1hcnlIaW50U3RyZWFtTGVuZ3RoKCkgY29uc3Q7CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BMaW5lYXJpemVkRGljdDsKKyAgQ1BERl9EYXRhQXZhaWwqIG1fcERhdGFBdmFpbDsKKyAgRlhfRFdPUkQgbV9uRmlyc3RQYWdlU2hhcmVkT2JqczsKKyAgRlhfRklMRVNJWkUgbV9zekZpcnN0UGFnZU9iak9mZnNldDsKKyAgQ0ZYX0RXb3JkQXJyYXkgbV9kd0RlbHRhTk9ianNBcnJheTsKKyAgQ0ZYX0RXb3JkQXJyYXkgbV9kd05TaGFyZWRPYmpzQXJyYXk7CisgIENGWF9EV29yZEFycmF5IG1fZHdTaGFyZWRPYmpOdW1BcnJheTsKKyAgQ0ZYX0RXb3JkQXJyYXkgbV9kd0lkZW50aWZpZXJBcnJheTsKKyAgQ0ZYX0ZpbGVTaXplQXJyYXkgbV9zelBhZ2VPZmZzZXRBcnJheTsKKyAgQ0ZYX0ZpbGVTaXplQXJyYXkgbV9zelNoYXJlZE9iak9mZnNldEFycmF5OworfTsKKworI2VuZGlmICAvLyBDT1JFX1NSQ19GUERGQVBJX0ZQREZfUEFSU0VSX1BBUlNFUl9JTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXIuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlci5jcHAKaW5kZXggYTkyMTI1Mi4uNmE4MjFlYyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlci5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlci5jcHAKQEAgLTEsMTQyMCArMSwxNDA3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZW5kZXIuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKLSNpbmNsdWRlICIuLi9mcGRmX3BhZ2UvcGFnZWludC5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhnZS9meF9nZS5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIgogI2luY2x1ZGUgInJlbmRlcl9pbnQuaCIKKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZW5kZXIuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9nZS5oIgorI2luY2x1ZGUgImNvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL3BhZ2VpbnQuaCIKKwogQ1BERl9Eb2NSZW5kZXJEYXRhOjpDUERGX0RvY1JlbmRlckRhdGEoQ1BERl9Eb2N1bWVudCogcFBERkRvYykKLSAgICA6IG1fcFBERkRvYyhwUERGRG9jKQotICAgICwgbV9wRm9udENhY2hlKE5VTEwpCi17CisgICAgOiBtX3BQREZEb2MocFBERkRvYyksIG1fcEZvbnRDYWNoZShuZXcgQ0ZYX0ZvbnRDYWNoZSkge30KKworQ1BERl9Eb2NSZW5kZXJEYXRhOjp+Q1BERl9Eb2NSZW5kZXJEYXRhKCkgeworICBDbGVhcihUUlVFKTsKIH0KLUNQREZfRG9jUmVuZGVyRGF0YTo6fkNQREZfRG9jUmVuZGVyRGF0YSgpCi17Ci0gICAgQ2xlYXIoVFJVRSk7CisKK3ZvaWQgQ1BERl9Eb2NSZW5kZXJEYXRhOjpDbGVhcihGWF9CT09MIGJSZWxlYXNlKSB7CisgIGZvciAoYXV0byBpdCA9IG1fVHlwZTNGYWNlTWFwLmJlZ2luKCk7IGl0ICE9IG1fVHlwZTNGYWNlTWFwLmVuZCgpOykgeworICAgIGF1dG8gY3Vycl9pdCA9IGl0Kys7CisgICAgQ1BERl9Db3VudGVkT2JqZWN0PENQREZfVHlwZTNDYWNoZT4qIGNhY2hlID0gY3Vycl9pdC0+c2Vjb25kOworICAgIGlmIChiUmVsZWFzZSB8fCBjYWNoZS0+dXNlX2NvdW50KCkgPCAyKSB7CisgICAgICBkZWxldGUgY2FjaGUtPmdldCgpOworICAgICAgZGVsZXRlIGNhY2hlOworICAgICAgbV9UeXBlM0ZhY2VNYXAuZXJhc2UoY3Vycl9pdCk7CisgICAgfQorICB9CisKKyAgZm9yIChhdXRvIGl0ID0gbV9UcmFuc2ZlckZ1bmNNYXAuYmVnaW4oKTsgaXQgIT0gbV9UcmFuc2ZlckZ1bmNNYXAuZW5kKCk7KSB7CisgICAgYXV0byBjdXJyX2l0ID0gaXQrKzsKKyAgICBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9UcmFuc2ZlckZ1bmM+KiB2YWx1ZSA9IGN1cnJfaXQtPnNlY29uZDsKKyAgICBpZiAoYlJlbGVhc2UgfHwgdmFsdWUtPnVzZV9jb3VudCgpIDwgMikgeworICAgICAgZGVsZXRlIHZhbHVlLT5nZXQoKTsKKyAgICAgIGRlbGV0ZSB2YWx1ZTsKKyAgICAgIG1fVHJhbnNmZXJGdW5jTWFwLmVyYXNlKGN1cnJfaXQpOworICAgIH0KKyAgfQorCisgIGlmIChtX3BGb250Q2FjaGUpIHsKKyAgICBpZiAoYlJlbGVhc2UpIHsKKyAgICAgIGRlbGV0ZSBtX3BGb250Q2FjaGU7CisgICAgICBtX3BGb250Q2FjaGUgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICBtX3BGb250Q2FjaGUtPkZyZWVDYWNoZShGQUxTRSk7CisgICAgfQorICB9CiB9Ci12b2lkIENQREZfRG9jUmVuZGVyRGF0YTo6Q2xlYXIoRlhfQk9PTCBiUmVsZWFzZSkKLXsKLSAgICBGWF9QT1NJVElPTiBwb3M7Ci0gICAgewotICAgICAgICBwb3MgPSBtX1R5cGUzRmFjZU1hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQ7Ci0gICAgICAgICAgICBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9UeXBlM0NhY2hlKj4qIGNhY2hlOwotICAgICAgICAgICAgbV9UeXBlM0ZhY2VNYXAuR2V0TmV4dEFzc29jKHBvcywgcEZvbnQsIGNhY2hlKTsKLSAgICAgICAgICAgIGlmIChiUmVsZWFzZSB8fCBjYWNoZS0+bV9uQ291bnQgPCAyKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlLT5tX09iajsKLSAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGU7Ci0gICAgICAgICAgICAgICAgbV9UeXBlM0ZhY2VNYXAuUmVtb3ZlS2V5KHBGb250KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICB7Ci0gICAgICAgIHBvcyA9IG1fVHJhbnNmZXJGdW5jTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICAgICAgd2hpbGUgKHBvcykgewotICAgICAgICAgICAgQ1BERl9PYmplY3QqIGtleTsKLSAgICAgICAgICAgIENQREZfQ291bnRlZE9iamVjdDxDUERGX1RyYW5zZmVyRnVuYyo+KiB2YWx1ZTsKLSAgICAgICAgICAgIG1fVHJhbnNmZXJGdW5jTWFwLkdldE5leHRBc3NvYyhwb3MsIGtleSwgdmFsdWUpOwotICAgICAgICAgICAgaWYgKGJSZWxlYXNlIHx8IHZhbHVlLT5tX25Db3VudCA8IDIpIHsKLSAgICAgICAgICAgICAgICBkZWxldGUgdmFsdWUtPm1fT2JqOwotICAgICAgICAgICAgICAgIGRlbGV0ZSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBtX1RyYW5zZmVyRnVuY01hcC5SZW1vdmVLZXkoa2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9wRm9udENhY2hlKSB7Ci0gICAgICAgIGlmIChiUmVsZWFzZSkgewotICAgICAgICAgICAgZGVsZXRlIG1fcEZvbnRDYWNoZTsKLSAgICAgICAgICAgIG1fcEZvbnRDYWNoZSA9IE5VTEw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX3BGb250Q2FjaGUtPkZyZWVDYWNoZShGQUxTRSk7Ci0gICAgICAgIH0KLSAgICB9CisKK0NQREZfVHlwZTNDYWNoZSogQ1BERl9Eb2NSZW5kZXJEYXRhOjpHZXRDYWNoZWRUeXBlMyhDUERGX1R5cGUzRm9udCogcEZvbnQpIHsKKyAgQ1BERl9Db3VudGVkT2JqZWN0PENQREZfVHlwZTNDYWNoZT4qIHBDYWNoZTsKKyAgYXV0byBpdCA9IG1fVHlwZTNGYWNlTWFwLmZpbmQocEZvbnQpOworICBpZiAoaXQgPT0gbV9UeXBlM0ZhY2VNYXAuZW5kKCkpIHsKKyAgICBDUERGX1R5cGUzQ2FjaGUqIHBUeXBlMyA9IG5ldyBDUERGX1R5cGUzQ2FjaGUocEZvbnQpOworICAgIHBDYWNoZSA9IG5ldyBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9UeXBlM0NhY2hlPihwVHlwZTMpOworICAgIG1fVHlwZTNGYWNlTWFwW3BGb250XSA9IHBDYWNoZTsKKyAgfSBlbHNlIHsKKyAgICBwQ2FjaGUgPSBpdC0+c2Vjb25kOworICB9CisgIHJldHVybiBwQ2FjaGUtPkFkZFJlZigpOwogfQotRlhfQk9PTCBDUERGX0RvY1JlbmRlckRhdGE6OkluaXRpYWxpemUoKQotewotICAgIG1fcEZvbnRDYWNoZSA9IG5ldyBDRlhfRm9udENhY2hlOwotICAgIHJldHVybiBUUlVFOworCit2b2lkIENQREZfRG9jUmVuZGVyRGF0YTo6UmVsZWFzZUNhY2hlZFR5cGUzKENQREZfVHlwZTNGb250KiBwRm9udCkgeworICBhdXRvIGl0ID0gbV9UeXBlM0ZhY2VNYXAuZmluZChwRm9udCk7CisgIGlmIChpdCAhPSBtX1R5cGUzRmFjZU1hcC5lbmQoKSkKKyAgICBpdC0+c2Vjb25kLT5SZW1vdmVSZWYoKTsKIH0KLUNQREZfVHlwZTNDYWNoZSogQ1BERl9Eb2NSZW5kZXJEYXRhOjpHZXRDYWNoZWRUeXBlMyhDUERGX1R5cGUzRm9udCogcEZvbnQpCi17Ci0gICAgQ1BERl9Db3VudGVkT2JqZWN0PENQREZfVHlwZTNDYWNoZSo+KiBwQ2FjaGU7Ci0gICAgaWYgKCFtX1R5cGUzRmFjZU1hcC5Mb29rdXAocEZvbnQsIHBDYWNoZSkpIHsKLSAgICAgICAgQ1BERl9UeXBlM0NhY2hlKiBwVHlwZTMgPSBuZXcgQ1BERl9UeXBlM0NhY2hlKHBGb250KTsKLSAgICAgICAgcENhY2hlID0gbmV3IENQREZfQ291bnRlZE9iamVjdDxDUERGX1R5cGUzQ2FjaGUqPjsKLSAgICAgICAgcENhY2hlLT5tX09iaiA9IHBUeXBlMzsKLSAgICAgICAgcENhY2hlLT5tX25Db3VudCA9IDE7Ci0gICAgICAgIG1fVHlwZTNGYWNlTWFwLlNldEF0KHBGb250LCBwQ2FjaGUpOwotICAgIH0KLSAgICBwQ2FjaGUtPm1fbkNvdW50Kys7Ci0gICAgcmV0dXJuIHBDYWNoZS0+bV9PYmo7Ci19Ci12b2lkIENQREZfRG9jUmVuZGVyRGF0YTo6UmVsZWFzZUNhY2hlZFR5cGUzKENQREZfVHlwZTNGb250KiBwRm9udCkKLXsKLSAgICBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9UeXBlM0NhY2hlKj4qIHBDYWNoZTsKLSAgICBpZiAoIW1fVHlwZTNGYWNlTWFwLkxvb2t1cChwRm9udCwgcENhY2hlKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHBDYWNoZS0+bV9uQ291bnQtLTsKLX0KLWNsYXNzIENQREZfUmVuZGVyTW9kdWxlIDogcHVibGljIENQREZfUmVuZGVyTW9kdWxlRGVmCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+Q1BERl9SZW5kZXJNb2R1bGUoKSB7fQotICAgIHZpcnR1YWwgRlhfQk9PTAlJbnN0YWxsZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHZpcnR1YWwgQ1BERl9Eb2NSZW5kZXJEYXRhKglDcmVhdGVEb2NEYXRhKENQREZfRG9jdW1lbnQqIHBEb2MpOwotICAgIHZpcnR1YWwgdm9pZAlEZXN0cm95RG9jRGF0YShDUERGX0RvY1JlbmRlckRhdGEqIHApOwotICAgIHZpcnR1YWwgdm9pZAlDbGVhckRvY0RhdGEoQ1BERl9Eb2NSZW5kZXJEYXRhKiBwKTsKLSAgICB2aXJ0dWFsIENQREZfRG9jUmVuZGVyRGF0YSogR2V0UmVuZGVyRGF0YSgpCi0gICAgewotICAgICAgICByZXR1cm4gJm1fUmVuZGVyRGF0YTsKLSAgICB9Ci0gICAgdmlydHVhbCBDUERGX1BhZ2VSZW5kZXJDYWNoZSoJQ3JlYXRlUGFnZUNhY2hlKENQREZfUGFnZSogcFBhZ2UpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IENQREZfUGFnZVJlbmRlckNhY2hlKHBQYWdlKTsKLSAgICB9Ci0gICAgdmlydHVhbCB2b2lkCURlc3Ryb3lQYWdlQ2FjaGUoQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBDYWNoZSk7Ci0gICAgdmlydHVhbCBDUERGX1JlbmRlckNvbmZpZyoJR2V0Q29uZmlnKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAmbV9SZW5kZXJDb25maWc7Ci0gICAgfQotcHJpdmF0ZToKLSAgICBDUERGX0RvY1JlbmRlckRhdGEJbV9SZW5kZXJEYXRhOwotICAgIENQREZfUmVuZGVyQ29uZmlnCW1fUmVuZGVyQ29uZmlnOworCitjbGFzcyBDUERGX1JlbmRlck1vZHVsZSA6IHB1YmxpYyBJUERGX1JlbmRlck1vZHVsZSB7CisgcHVibGljOgorICBDUERGX1JlbmRlck1vZHVsZSgpIHt9CisKKyBwcml2YXRlOgorICB+Q1BERl9SZW5kZXJNb2R1bGUoKSBvdmVycmlkZSB7fQorCisgIENQREZfRG9jUmVuZGVyRGF0YSogQ3JlYXRlRG9jRGF0YShDUERGX0RvY3VtZW50KiBwRG9jKSBvdmVycmlkZTsKKyAgdm9pZCBEZXN0cm95RG9jRGF0YShDUERGX0RvY1JlbmRlckRhdGEqIHApIG92ZXJyaWRlOworICB2b2lkIENsZWFyRG9jRGF0YShDUERGX0RvY1JlbmRlckRhdGEqIHApIG92ZXJyaWRlOworCisgIENQREZfRG9jUmVuZGVyRGF0YSogR2V0UmVuZGVyRGF0YSgpIG92ZXJyaWRlIHsgcmV0dXJuICZtX1JlbmRlckRhdGE7IH0KKworICBDUERGX1BhZ2VSZW5kZXJDYWNoZSogQ3JlYXRlUGFnZUNhY2hlKENQREZfUGFnZSogcFBhZ2UpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gbmV3IENQREZfUGFnZVJlbmRlckNhY2hlKHBQYWdlKTsKKyAgfQorCisgIHZvaWQgRGVzdHJveVBhZ2VDYWNoZShDUERGX1BhZ2VSZW5kZXJDYWNoZSogcENhY2hlKSBvdmVycmlkZTsKKworICBDUERGX1JlbmRlckNvbmZpZyogR2V0Q29uZmlnKCkgb3ZlcnJpZGUgeyByZXR1cm4gJm1fUmVuZGVyQ29uZmlnOyB9CisKKyAgQ1BERl9Eb2NSZW5kZXJEYXRhIG1fUmVuZGVyRGF0YTsKKyAgQ1BERl9SZW5kZXJDb25maWcgbV9SZW5kZXJDb25maWc7CiB9OwotQ1BERl9Eb2NSZW5kZXJEYXRhKglDUERGX1JlbmRlck1vZHVsZTo6Q3JlYXRlRG9jRGF0YShDUERGX0RvY3VtZW50KiBwRG9jKQotewotICAgIENQREZfRG9jUmVuZGVyRGF0YSogcERhdGEgPSBuZXcgQ1BERl9Eb2NSZW5kZXJEYXRhKHBEb2MpOwotICAgIHBEYXRhLT5Jbml0aWFsaXplKCk7Ci0gICAgcmV0dXJuIHBEYXRhOworCitDUERGX0RvY1JlbmRlckRhdGEqIENQREZfUmVuZGVyTW9kdWxlOjpDcmVhdGVEb2NEYXRhKENQREZfRG9jdW1lbnQqIHBEb2MpIHsKKyAgcmV0dXJuIG5ldyBDUERGX0RvY1JlbmRlckRhdGEocERvYyk7CiB9Ci12b2lkIENQREZfUmVuZGVyTW9kdWxlOjpEZXN0cm95RG9jRGF0YShDUERGX0RvY1JlbmRlckRhdGEqIHBEb2NEYXRhKQotewotICAgIGRlbGV0ZSBwRG9jRGF0YTsKK3ZvaWQgQ1BERl9SZW5kZXJNb2R1bGU6OkRlc3Ryb3lEb2NEYXRhKENQREZfRG9jUmVuZGVyRGF0YSogcERvY0RhdGEpIHsKKyAgZGVsZXRlIHBEb2NEYXRhOwogfQotdm9pZCBDUERGX1JlbmRlck1vZHVsZTo6Q2xlYXJEb2NEYXRhKENQREZfRG9jUmVuZGVyRGF0YSogcCkKLXsKLSAgICBpZiAocCkgewotICAgICAgICBwLT5DbGVhcihGQUxTRSk7Ci0gICAgfQordm9pZCBDUERGX1JlbmRlck1vZHVsZTo6Q2xlYXJEb2NEYXRhKENQREZfRG9jUmVuZGVyRGF0YSogcCkgeworICBpZiAocCkgeworICAgIHAtPkNsZWFyKEZBTFNFKTsKKyAgfQogfQotdm9pZCBDUERGX1JlbmRlck1vZHVsZTo6RGVzdHJveVBhZ2VDYWNoZShDUERGX1BhZ2VSZW5kZXJDYWNoZSogcENhY2hlKQotewotICAgIGRlbGV0ZSBwQ2FjaGU7Cit2b2lkIENQREZfUmVuZGVyTW9kdWxlOjpEZXN0cm95UGFnZUNhY2hlKENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUpIHsKKyAgZGVsZXRlIHBDYWNoZTsKIH0KLXZvaWQgQ1BERl9Nb2R1bGVNZ3I6OkluaXRSZW5kZXJNb2R1bGUoKQotewotICAgIGRlbGV0ZSBtX3BSZW5kZXJNb2R1bGU7Ci0gICAgbV9wUmVuZGVyTW9kdWxlID0gbmV3IENQREZfUmVuZGVyTW9kdWxlOworCit2b2lkIENQREZfTW9kdWxlTWdyOjpJbml0UmVuZGVyTW9kdWxlKCkgeworICBtX3BSZW5kZXJNb2R1bGUucmVzZXQobmV3IENQREZfUmVuZGVyTW9kdWxlKTsKIH0KKwogQ1BERl9SZW5kZXJPcHRpb25zOjpDUERGX1JlbmRlck9wdGlvbnMoKQotICAgIDogbV9Db2xvck1vZGUoUkVOREVSX0NPTE9SX05PUk1BTCkKLSAgICAsIG1fRmxhZ3MoUkVOREVSX0NMRUFSVFlQRSkKLSAgICAsIG1fSW50ZXJwb2xhdGlvbigwKQotICAgICwgbV9BZGRGbGFncygwKQotICAgICwgbV9wT0NDb250ZXh0KE5VTEwpCi0gICAgLCBtX2R3TGltaXRDYWNoZVNpemUoMTAyNCAqIDEwMjQgKiAxMDApCi0gICAgLCBtX0hhbGZ0b25lTGltaXQoLTEpCi17Ci19Ci1GWF9BUkdCIENQREZfUmVuZGVyT3B0aW9uczo6VHJhbnNsYXRlQ29sb3IoRlhfQVJHQiBhcmdiKSBjb25zdAotewotICAgIGlmIChtX0NvbG9yTW9kZSA9PSBSRU5ERVJfQ09MT1JfTk9STUFMKSB7Ci0gICAgICAgIHJldHVybiBhcmdiOworICAgIDogbV9Db2xvck1vZGUoUkVOREVSX0NPTE9SX05PUk1BTCksCisgICAgICBtX0ZsYWdzKFJFTkRFUl9DTEVBUlRZUEUpLAorICAgICAgbV9JbnRlcnBvbGF0aW9uKDApLAorICAgICAgbV9BZGRGbGFncygwKSwKKyAgICAgIG1fcE9DQ29udGV4dChOVUxMKSwKKyAgICAgIG1fZHdMaW1pdENhY2hlU2l6ZSgxMDI0ICogMTAyNCAqIDEwMCksCisgICAgICBtX0hhbGZ0b25lTGltaXQoLTEpIHt9CitGWF9BUkdCIENQREZfUmVuZGVyT3B0aW9uczo6VHJhbnNsYXRlQ29sb3IoRlhfQVJHQiBhcmdiKSBjb25zdCB7CisgIGlmIChtX0NvbG9yTW9kZSA9PSBSRU5ERVJfQ09MT1JfTk9STUFMKSB7CisgICAgcmV0dXJuIGFyZ2I7CisgIH0KKyAgaWYgKG1fQ29sb3JNb2RlID09IFJFTkRFUl9DT0xPUl9BTFBIQSkgeworICAgIHJldHVybiBhcmdiOworICB9CisgIGludCBhLCByLCBnLCBiOworICBBcmdiRGVjb2RlKGFyZ2IsIGEsIHIsIGcsIGIpOworICBpbnQgZ3JheSA9IEZYUkdCMkdSQVkociwgZywgYik7CisgIGlmIChtX0NvbG9yTW9kZSA9PSBSRU5ERVJfQ09MT1JfVFdPQ09MT1IpIHsKKyAgICBpbnQgY29sb3IgPSAociAtIGdyYXkpICogKHIgLSBncmF5KSArIChnIC0gZ3JheSkgKiAoZyAtIGdyYXkpICsKKyAgICAgICAgICAgICAgICAoYiAtIGdyYXkpICogKGIgLSBncmF5KTsKKyAgICBpZiAoZ3JheSA8IDM1ICYmIGNvbG9yIDwgMjApIHsKKyAgICAgIHJldHVybiBBcmdiRW5jb2RlKGEsIG1fRm9yZUNvbG9yKTsKICAgICB9Ci0gICAgaWYgKG1fQ29sb3JNb2RlID09IFJFTkRFUl9DT0xPUl9BTFBIQSkgewotICAgICAgICByZXR1cm4gYXJnYjsKKyAgICBpZiAoZ3JheSA+IDIyMSAmJiBjb2xvciA8IDIwKSB7CisgICAgICByZXR1cm4gQXJnYkVuY29kZShhLCBtX0JhY2tDb2xvcik7CiAgICAgfQotICAgIGludCBhLCByLCBnLCBiOwotICAgIEFyZ2JEZWNvZGUoYXJnYiwgYSwgciwgZywgYik7Ci0gICAgaW50IGdyYXkgPSBGWFJHQjJHUkFZKHIsIGcsIGIpOwotICAgIGlmIChtX0NvbG9yTW9kZSA9PSBSRU5ERVJfQ09MT1JfVFdPQ09MT1IpIHsKLSAgICAgICAgaW50IGNvbG9yID0gKHIgLSBncmF5KSAqIChyIC0gZ3JheSkgKyAoZyAtIGdyYXkpICogKGcgLSBncmF5KSArIChiIC0gZ3JheSkgKiAoYiAtIGdyYXkpOwotICAgICAgICBpZiAoZ3JheSA8IDM1ICYmIGNvbG9yIDwgMjApIHsKLSAgICAgICAgICAgIHJldHVybiBBcmdiRW5jb2RlKGEsIG1fRm9yZUNvbG9yKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ3JheSA+IDIyMSAmJiBjb2xvciA8IDIwKSB7Ci0gICAgICAgICAgICByZXR1cm4gQXJnYkVuY29kZShhLCBtX0JhY2tDb2xvcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFyZ2I7Ci0gICAgfQotICAgIGludCBmciA9IEZYU1lTX0dldFJWYWx1ZShtX0ZvcmVDb2xvcik7Ci0gICAgaW50IGZnID0gRlhTWVNfR2V0R1ZhbHVlKG1fRm9yZUNvbG9yKTsKLSAgICBpbnQgZmIgPSBGWFNZU19HZXRCVmFsdWUobV9Gb3JlQ29sb3IpOwotICAgIGludCBiciA9IEZYU1lTX0dldFJWYWx1ZShtX0JhY2tDb2xvcik7Ci0gICAgaW50IGJnID0gRlhTWVNfR2V0R1ZhbHVlKG1fQmFja0NvbG9yKTsKLSAgICBpbnQgYmIgPSBGWFNZU19HZXRCVmFsdWUobV9CYWNrQ29sb3IpOwotICAgIHIgPSAoYnIgLSBmcikgKiBncmF5IC8gMjU1ICsgZnI7Ci0gICAgZyA9IChiZyAtIGZnKSAqIGdyYXkgLyAyNTUgKyBmZzsKLSAgICBiID0gKGJiIC0gZmIpICogZ3JheSAvIDI1NSArIGZiOwotICAgIHJldHVybiBBcmdiRW5jb2RlKGEsIHIsIGcsIGIpOworICAgIHJldHVybiBhcmdiOworICB9CisgIGludCBmciA9IEZYU1lTX0dldFJWYWx1ZShtX0ZvcmVDb2xvcik7CisgIGludCBmZyA9IEZYU1lTX0dldEdWYWx1ZShtX0ZvcmVDb2xvcik7CisgIGludCBmYiA9IEZYU1lTX0dldEJWYWx1ZShtX0ZvcmVDb2xvcik7CisgIGludCBiciA9IEZYU1lTX0dldFJWYWx1ZShtX0JhY2tDb2xvcik7CisgIGludCBiZyA9IEZYU1lTX0dldEdWYWx1ZShtX0JhY2tDb2xvcik7CisgIGludCBiYiA9IEZYU1lTX0dldEJWYWx1ZShtX0JhY2tDb2xvcik7CisgIHIgPSAoYnIgLSBmcikgKiBncmF5IC8gMjU1ICsgZnI7CisgIGcgPSAoYmcgLSBmZykgKiBncmF5IC8gMjU1ICsgZmc7CisgIGIgPSAoYmIgLSBmYikgKiBncmF5IC8gMjU1ICsgZmI7CisgIHJldHVybiBBcmdiRW5jb2RlKGEsIHIsIGcsIGIpOwogfQogCiAvLyBzdGF0aWMKIGludCBDUERGX1JlbmRlclN0YXR1czo6c19DdXJyZW50UmVjdXJzaW9uRGVwdGggPSAwOwogCiBDUERGX1JlbmRlclN0YXR1czo6Q1BERl9SZW5kZXJTdGF0dXMoKQotewotICAgIG1fcENvbnRleHQgPSBOVUxMOwotICAgIG1fYlN0b3BwZWQgPSBGQUxTRTsKLSAgICBtX3BEZXZpY2UgPSBOVUxMOwotICAgIG1fcEN1ck9iaiA9IE5VTEw7Ci0gICAgbV9wU3RvcE9iaiA9IE5VTEw7Ci0gICAgbV9IYWxmdG9uZUxpbWl0ID0gMDsKLSAgICBtX3BPYmplY3RSZW5kZXJlciA9IE5VTEw7Ci0gICAgbV9iUHJpbnQgPSBGQUxTRTsKLSAgICBtX1RyYW5zcGFyZW5jeSA9IDA7Ci0gICAgbV9EaXRoZXJCaXRzID0gMDsKLSAgICBtX2JEcm9wT2JqZWN0cyA9IEZBTFNFOwotICAgIG1fYlN0ZENTID0gRkFMU0U7Ci0gICAgbV9Hcm91cEZhbWlseSA9IDA7Ci0gICAgbV9iTG9hZE1hc2sgPSBGQUxTRTsKLSAgICBtX3BUeXBlM0NoYXIgPSBOVUxMOwotICAgIG1fVDNGaWxsQ29sb3IgPSAwOwotICAgIG1fcEZvcm1SZXNvdXJjZSA9IE5VTEw7Ci0gICAgbV9wUGFnZVJlc291cmNlID0gTlVMTDsKLSAgICBtX2N1ckJsZW5kID0gRlhESUJfQkxFTkRfTk9STUFMOworICAgIDogbV9wRm9ybVJlc291cmNlKG51bGxwdHIpLAorICAgICAgbV9wUGFnZVJlc291cmNlKG51bGxwdHIpLAorICAgICAgbV9wQ29udGV4dChudWxscHRyKSwKKyAgICAgIG1fYlN0b3BwZWQoRkFMU0UpLAorICAgICAgbV9wRGV2aWNlKG51bGxwdHIpLAorICAgICAgbV9wQ3VyT2JqKG51bGxwdHIpLAorICAgICAgbV9wU3RvcE9iaihudWxscHRyKSwKKyAgICAgIG1fSGFsZnRvbmVMaW1pdCgwKSwKKyAgICAgIG1fYlByaW50KEZBTFNFKSwKKyAgICAgIG1fVHJhbnNwYXJlbmN5KDApLAorICAgICAgbV9EaXRoZXJCaXRzKDApLAorICAgICAgbV9iRHJvcE9iamVjdHMoRkFMU0UpLAorICAgICAgbV9iU3RkQ1MoRkFMU0UpLAorICAgICAgbV9Hcm91cEZhbWlseSgwKSwKKyAgICAgIG1fYkxvYWRNYXNrKEZBTFNFKSwKKyAgICAgIG1fcFR5cGUzQ2hhcihudWxscHRyKSwKKyAgICAgIG1fVDNGaWxsQ29sb3IoMCksCisgICAgICBtX2N1ckJsZW5kKEZYRElCX0JMRU5EX05PUk1BTCkge30KKworQ1BERl9SZW5kZXJTdGF0dXM6On5DUERGX1JlbmRlclN0YXR1cygpIHsKIH0KIAotQ1BERl9SZW5kZXJTdGF0dXM6On5DUERGX1JlbmRlclN0YXR1cygpCi17Ci0gICAgaWYgKG1fcE9iamVjdFJlbmRlcmVyKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BPYmplY3RSZW5kZXJlcjsKK0ZYX0JPT0wgQ1BERl9SZW5kZXJTdGF0dXM6OkluaXRpYWxpemUoQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcERldmljZU1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwU3RvcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJTdGF0dXMqIHBQYXJlbnRTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9HcmFwaGljU3RhdGVzKiBwSW5pdGlhbFN0YXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5zcGFyZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRHJvcE9iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfVHlwZTNDaGFyKiBwVHlwZTNDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGZpbGxfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIEdyb3VwRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJMb2FkTWFzaykgeworICBtX3BDb250ZXh0ID0gcENvbnRleHQ7CisgIG1fcERldmljZSA9IHBEZXZpY2U7CisgIG1fRGl0aGVyQml0cyA9IHBEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19ESVRIRVJfQklUUyk7CisgIG1fYlByaW50ID0gbV9wRGV2aWNlLT5HZXREZXZpY2VDbGFzcygpICE9IEZYRENfRElTUExBWTsKKyAgaWYgKHBEZXZpY2VNYXRyaXgpIHsKKyAgICBtX0RldmljZU1hdHJpeCA9ICpwRGV2aWNlTWF0cml4OworICB9CisgIG1fcFN0b3BPYmogPSBwU3RvcE9iajsKKyAgaWYgKHBPcHRpb25zKSB7CisgICAgbV9PcHRpb25zID0gKnBPcHRpb25zOworICB9CisgIG1fYkRyb3BPYmplY3RzID0gYkRyb3BPYmplY3RzOworICBtX2JTdGRDUyA9IGJTdGRDUzsKKyAgbV9UM0ZpbGxDb2xvciA9IGZpbGxfY29sb3I7CisgIG1fcFR5cGUzQ2hhciA9IHBUeXBlM0NoYXI7CisgIG1fR3JvdXBGYW1pbHkgPSBHcm91cEZhbWlseTsKKyAgbV9iTG9hZE1hc2sgPSBiTG9hZE1hc2s7CisgIG1fcEZvcm1SZXNvdXJjZSA9IHBGb3JtUmVzb3VyY2U7CisgIG1fcFBhZ2VSZXNvdXJjZSA9IG1fcENvbnRleHQtPm1fcFBhZ2VSZXNvdXJjZXM7CisgIGlmIChwSW5pdGlhbFN0YXRlcyAmJiAhbV9wVHlwZTNDaGFyKSB7CisgICAgbV9Jbml0aWFsU3RhdGVzLkNvcHlTdGF0ZXMoKnBJbml0aWFsU3RhdGVzKTsKKyAgICBpZiAocFBhcmVudFN0YXRlKSB7CisgICAgICBDUERGX0NvbG9yU3RhdGVEYXRhKiBwQ29sb3JEYXRhID0KKyAgICAgICAgICAoQ1BERl9Db2xvclN0YXRlRGF0YSopKGNvbnN0IENQREZfQ29sb3JTdGF0ZURhdGEqKQorICAgICAgICAgICAgICBtX0luaXRpYWxTdGF0ZXMubV9Db2xvclN0YXRlOworICAgICAgQ1BERl9Db2xvclN0YXRlRGF0YSogcFBhcmVudERhdGEgPQorICAgICAgICAgIChDUERGX0NvbG9yU3RhdGVEYXRhKikoY29uc3QgQ1BERl9Db2xvclN0YXRlRGF0YSopCisgICAgICAgICAgICAgIHBQYXJlbnRTdGF0ZS0+bV9Jbml0aWFsU3RhdGVzLm1fQ29sb3JTdGF0ZTsKKyAgICAgIGlmICghcENvbG9yRGF0YSB8fCBwQ29sb3JEYXRhLT5tX0ZpbGxDb2xvci5Jc051bGwoKSkgeworICAgICAgICBDUERGX0NvbG9yU3RhdGVEYXRhKiBwRGF0YSA9IG1fSW5pdGlhbFN0YXRlcy5tX0NvbG9yU3RhdGUuR2V0TW9kaWZ5KCk7CisgICAgICAgIHBEYXRhLT5tX0ZpbGxSR0IgPSBwUGFyZW50RGF0YS0+bV9GaWxsUkdCOworICAgICAgICBwRGF0YS0+bV9GaWxsQ29sb3IuQ29weSgmcFBhcmVudERhdGEtPm1fRmlsbENvbG9yKTsKKyAgICAgIH0KKyAgICAgIGlmICghcENvbG9yRGF0YSB8fCBwQ29sb3JEYXRhLT5tX1N0cm9rZUNvbG9yLklzTnVsbCgpKSB7CisgICAgICAgIENQREZfQ29sb3JTdGF0ZURhdGEqIHBEYXRhID0gbV9Jbml0aWFsU3RhdGVzLm1fQ29sb3JTdGF0ZS5HZXRNb2RpZnkoKTsKKyAgICAgICAgcERhdGEtPm1fU3Ryb2tlUkdCID0gcFBhcmVudERhdGEtPm1fRmlsbFJHQjsKKyAgICAgICAgcERhdGEtPm1fU3Ryb2tlQ29sb3IuQ29weSgmcFBhcmVudERhdGEtPm1fU3Ryb2tlQ29sb3IpOworICAgICAgfQogICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtX0luaXRpYWxTdGF0ZXMuRGVmYXVsdFN0YXRlcygpOworICB9CisgIG1fcE9iamVjdFJlbmRlcmVyLnJlc2V0KCk7CisgIG1fVHJhbnNwYXJlbmN5ID0gdHJhbnNwYXJlbmN5OworICByZXR1cm4gVFJVRTsKK30KK3ZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OlJlbmRlck9iamVjdExpc3QoY29uc3QgQ1BERl9QYWdlT2JqZWN0cyogcE9ianMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlKSB7CisgIENGWF9GbG9hdFJlY3QgY2xpcF9yZWN0ID0gbV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7CisgIENGWF9NYXRyaXggZGV2aWNlMm9iamVjdDsKKyAgZGV2aWNlMm9iamVjdC5TZXRSZXZlcnNlKCpwT2JqMkRldmljZSk7CisgIGRldmljZTJvYmplY3QuVHJhbnNmb3JtUmVjdChjbGlwX3JlY3QpOworICBpbnQgaW5kZXggPSAwOworICBGWF9QT1NJVElPTiBwb3MgPSBwT2Jqcy0+R2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpOworICB3aGlsZSAocG9zKSB7CisgICAgaW5kZXgrKzsKKyAgICBDUERGX1BhZ2VPYmplY3QqIHBDdXJPYmogPSBwT2Jqcy0+R2V0TmV4dE9iamVjdChwb3MpOworICAgIGlmIChwQ3VyT2JqID09IG1fcFN0b3BPYmopIHsKKyAgICAgIG1fYlN0b3BwZWQgPSBUUlVFOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIXBDdXJPYmopIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoIXBDdXJPYmogfHwgcEN1ck9iai0+bV9MZWZ0ID4gY2xpcF9yZWN0LnJpZ2h0IHx8CisgICAgICAgIHBDdXJPYmotPm1fUmlnaHQgPCBjbGlwX3JlY3QubGVmdCB8fAorICAgICAgICBwQ3VyT2JqLT5tX0JvdHRvbSA+IGNsaXBfcmVjdC50b3AgfHwKKyAgICAgICAgcEN1ck9iai0+bV9Ub3AgPCBjbGlwX3JlY3QuYm90dG9tKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgUmVuZGVyU2luZ2xlT2JqZWN0KHBDdXJPYmosIHBPYmoyRGV2aWNlKTsKKyAgICBpZiAobV9iU3RvcHBlZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorfQordm9pZCBDUERGX1JlbmRlclN0YXR1czo6UmVuZGVyU2luZ2xlT2JqZWN0KGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSkgeworICBDRlhfQXV0b1Jlc3RvcmVyPGludD4gcmVzdG9yZXIoJnNfQ3VycmVudFJlY3Vyc2lvbkRlcHRoKTsKKyAgaWYgKCsrc19DdXJyZW50UmVjdXJzaW9uRGVwdGggPiBrUmVuZGVyTWF4UmVjdXJzaW9uRGVwdGgpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wQ3VyT2JqID0gcE9iajsKKyAgaWYgKG1fT3B0aW9ucy5tX3BPQ0NvbnRleHQgJiYgcE9iai0+bV9Db250ZW50TWFyay5Ob3ROdWxsKCkpIHsKKyAgICBpZiAoIW1fT3B0aW9ucy5tX3BPQ0NvbnRleHQtPkNoZWNrT2JqZWN0VmlzaWJsZShwT2JqKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBQcm9jZXNzQ2xpcFBhdGgocE9iai0+bV9DbGlwUGF0aCwgcE9iajJEZXZpY2UpOworICBpZiAoUHJvY2Vzc1RyYW5zcGFyZW5jeShwT2JqLCBwT2JqMkRldmljZSkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgUHJvY2Vzc09iamVjdE5vQ2xpcChwT2JqLCBwT2JqMkRldmljZSk7CiB9CiAKLUZYX0JPT0wgQ1BERl9SZW5kZXJTdGF0dXM6OkluaXRpYWxpemUoQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcERldmljZU1hdHJpeCwgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwU3RvcE9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJTdGF0dXMqIHBQYXJlbnRTdGF0ZSwgY29uc3QgQ1BERl9HcmFwaGljU3RhdGVzKiBwSW5pdGlhbFN0YXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywgaW50IHRyYW5zcGFyZW5jeSwgRlhfQk9PTCBiRHJvcE9iamVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSwgRlhfQk9PTCBiU3RkQ1MsIENQREZfVHlwZTNDaGFyKiBwVHlwZTNDaGFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGZpbGxfY29sb3IsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJMb2FkTWFzaykKLXsKLSAgICBtX3BDb250ZXh0ID0gcENvbnRleHQ7Ci0gICAgbV9wRGV2aWNlID0gcERldmljZTsKLSAgICBtX0RpdGhlckJpdHMgPSBwRGV2aWNlLT5HZXREZXZpY2VDYXBzKEZYRENfRElUSEVSX0JJVFMpOwotICAgIG1fYlByaW50ID0gbV9wRGV2aWNlLT5HZXREZXZpY2VDbGFzcygpICE9IEZYRENfRElTUExBWTsKLSAgICBpZiAocERldmljZU1hdHJpeCkgewotICAgICAgICBtX0RldmljZU1hdHJpeCA9ICpwRGV2aWNlTWF0cml4OwotICAgIH0KLSAgICBtX3BTdG9wT2JqID0gcFN0b3BPYmo7Ci0gICAgaWYgKHBPcHRpb25zKSB7Ci0gICAgICAgIG1fT3B0aW9ucyA9ICpwT3B0aW9uczsKLSAgICB9Ci0gICAgbV9iRHJvcE9iamVjdHMgPSBiRHJvcE9iamVjdHM7Ci0gICAgbV9iU3RkQ1MgPSBiU3RkQ1M7Ci0gICAgbV9UM0ZpbGxDb2xvciA9IGZpbGxfY29sb3I7Ci0gICAgbV9wVHlwZTNDaGFyID0gcFR5cGUzQ2hhcjsKLSAgICBtX0dyb3VwRmFtaWx5ID0gR3JvdXBGYW1pbHk7Ci0gICAgbV9iTG9hZE1hc2sgPSBiTG9hZE1hc2s7Ci0gICAgbV9wRm9ybVJlc291cmNlID0gcEZvcm1SZXNvdXJjZTsKLSAgICBtX3BQYWdlUmVzb3VyY2UgPSBtX3BDb250ZXh0LT5tX3BQYWdlUmVzb3VyY2VzOwotICAgIGlmIChwSW5pdGlhbFN0YXRlcyAmJiAhbV9wVHlwZTNDaGFyKSB7Ci0gICAgICAgIG1fSW5pdGlhbFN0YXRlcy5Db3B5U3RhdGVzKCpwSW5pdGlhbFN0YXRlcyk7Ci0gICAgICAgIGlmIChwUGFyZW50U3RhdGUpIHsKLSAgICAgICAgICAgIENQREZfQ29sb3JTdGF0ZURhdGEqIHBDb2xvckRhdGEgPSAoQ1BERl9Db2xvclN0YXRlRGF0YSopKGNvbnN0IENQREZfQ29sb3JTdGF0ZURhdGEqKW1fSW5pdGlhbFN0YXRlcy5tX0NvbG9yU3RhdGU7Ci0gICAgICAgICAgICBDUERGX0NvbG9yU3RhdGVEYXRhKiBwUGFyZW50RGF0YSA9IChDUERGX0NvbG9yU3RhdGVEYXRhKikoY29uc3QgQ1BERl9Db2xvclN0YXRlRGF0YSopcFBhcmVudFN0YXRlLT5tX0luaXRpYWxTdGF0ZXMubV9Db2xvclN0YXRlOwotICAgICAgICAgICAgaWYgKCFwQ29sb3JEYXRhIHx8IHBDb2xvckRhdGEtPm1fRmlsbENvbG9yLklzTnVsbCgpKSB7Ci0gICAgICAgICAgICAgICAgQ1BERl9Db2xvclN0YXRlRGF0YSogcERhdGEgPSBtX0luaXRpYWxTdGF0ZXMubV9Db2xvclN0YXRlLkdldE1vZGlmeSgpOwotICAgICAgICAgICAgICAgIHBEYXRhLT5tX0ZpbGxSR0IgPSBwUGFyZW50RGF0YS0+bV9GaWxsUkdCOwotICAgICAgICAgICAgICAgIHBEYXRhLT5tX0ZpbGxDb2xvci5Db3B5KCZwUGFyZW50RGF0YS0+bV9GaWxsQ29sb3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFwQ29sb3JEYXRhIHx8IHBDb2xvckRhdGEtPm1fU3Ryb2tlQ29sb3IuSXNOdWxsKCkpIHsKLSAgICAgICAgICAgICAgICBDUERGX0NvbG9yU3RhdGVEYXRhKiBwRGF0YSA9IG1fSW5pdGlhbFN0YXRlcy5tX0NvbG9yU3RhdGUuR2V0TW9kaWZ5KCk7Ci0gICAgICAgICAgICAgICAgcERhdGEtPm1fU3Ryb2tlUkdCID0gcFBhcmVudERhdGEtPm1fRmlsbFJHQjsKLSAgICAgICAgICAgICAgICBwRGF0YS0+bV9TdHJva2VDb2xvci5Db3B5KCZwUGFyZW50RGF0YS0+bV9TdHJva2VDb2xvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtX0luaXRpYWxTdGF0ZXMuRGVmYXVsdFN0YXRlcygpOwotICAgIH0KLSAgICBtX3BPYmplY3RSZW5kZXJlciA9IE5VTEw7Ci0gICAgbV9UcmFuc3BhcmVuY3kgPSB0cmFuc3BhcmVuY3k7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci12b2lkIENQREZfUmVuZGVyU3RhdHVzOjpSZW5kZXJPYmplY3RMaXN0KGNvbnN0IENQREZfUGFnZU9iamVjdHMqIHBPYmpzLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKLXsKLSAgICBDRlhfRmxvYXRSZWN0IGNsaXBfcmVjdCA9IG1fcERldmljZS0+R2V0Q2xpcEJveCgpOwotICAgIENGWF9BZmZpbmVNYXRyaXggZGV2aWNlMm9iamVjdDsKLSAgICBkZXZpY2Uyb2JqZWN0LlNldFJldmVyc2UoKnBPYmoyRGV2aWNlKTsKLSAgICBkZXZpY2Uyb2JqZWN0LlRyYW5zZm9ybVJlY3QoY2xpcF9yZWN0KTsKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBPYmpzLT5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUocG9zKSB7Ci0gICAgICAgIGluZGV4ICsrOwotICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBDdXJPYmogPSBwT2Jqcy0+R2V0TmV4dE9iamVjdChwb3MpOwotICAgICAgICBpZiAocEN1ck9iaiA9PSBtX3BTdG9wT2JqKSB7Ci0gICAgICAgICAgICBtX2JTdG9wcGVkID0gVFJVRTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXBDdXJPYmopIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmKHBDdXJPYmogPT0gTlVMTCB8fCBwQ3VyT2JqLT5tX0xlZnQgPiBjbGlwX3JlY3QucmlnaHQgfHwgcEN1ck9iai0+bV9SaWdodCA8IGNsaXBfcmVjdC5sZWZ0IHx8Ci0gICAgICAgICAgICAgICAgcEN1ck9iai0+bV9Cb3R0b20gPiBjbGlwX3JlY3QudG9wIHx8IHBDdXJPYmotPm1fVG9wIDwgY2xpcF9yZWN0LmJvdHRvbSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgUmVuZGVyU2luZ2xlT2JqZWN0KHBDdXJPYmosIHBPYmoyRGV2aWNlKTsKLSAgICAgICAgaWYgKG1fYlN0b3BwZWQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLX0KLXZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OlJlbmRlclNpbmdsZU9iamVjdChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQotewotICAgIENGWF9BdXRvUmVzdG9yZXI8aW50PiByZXN0b3Jlcigmc19DdXJyZW50UmVjdXJzaW9uRGVwdGgpOwotICAgIGlmICgrK3NfQ3VycmVudFJlY3Vyc2lvbkRlcHRoID4ga1JlbmRlck1heFJlY3Vyc2lvbkRlcHRoKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wQ3VyT2JqID0gcE9iajsKLSAgICBpZiAobV9PcHRpb25zLm1fcE9DQ29udGV4dCAmJiBwT2JqLT5tX0NvbnRlbnRNYXJrLk5vdE51bGwoKSkgewotICAgICAgICBpZiAoIW1fT3B0aW9ucy5tX3BPQ0NvbnRleHQtPkNoZWNrT2JqZWN0VmlzaWJsZShwT2JqKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotICAgIFByb2Nlc3NDbGlwUGF0aChwT2JqLT5tX0NsaXBQYXRoLCBwT2JqMkRldmljZSk7Ci0gICAgaWYgKFByb2Nlc3NUcmFuc3BhcmVuY3kocE9iaiwgcE9iajJEZXZpY2UpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgUHJvY2Vzc09iamVjdE5vQ2xpcChwT2JqLCBwT2JqMkRldmljZSk7Ci19Ci1GWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpDb250aW51ZVNpbmdsZU9iamVjdChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBpZiAobV9wT2JqZWN0UmVuZGVyZXIpIHsKLSAgICAgICAgaWYgKG1fcE9iamVjdFJlbmRlcmVyLT5Db250aW51ZShwUGF1c2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1fcE9iamVjdFJlbmRlcmVyLT5tX1Jlc3VsdCkgewotICAgICAgICAgICAgRHJhd09ialdpdGhCYWNrZ3JvdW5kKHBPYmosIHBPYmoyRGV2aWNlKTsKLSAgICAgICAgfQotICAgICAgICBkZWxldGUgbV9wT2JqZWN0UmVuZGVyZXI7Ci0gICAgICAgIG1fcE9iamVjdFJlbmRlcmVyID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX3BDdXJPYmogPSBwT2JqOwotICAgIGlmIChtX09wdGlvbnMubV9wT0NDb250ZXh0ICYmIHBPYmotPm1fQ29udGVudE1hcmsuTm90TnVsbCgpKQotICAgICAgICBpZiAoIW1fT3B0aW9ucy5tX3BPQ0NvbnRleHQtPkNoZWNrT2JqZWN0VmlzaWJsZShwT2JqKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgUHJvY2Vzc0NsaXBQYXRoKHBPYmotPm1fQ2xpcFBhdGgsIHBPYmoyRGV2aWNlKTsKLSAgICBpZiAoUHJvY2Vzc1RyYW5zcGFyZW5jeShwT2JqLCBwT2JqMkRldmljZSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAocE9iai0+bV9UeXBlID09IFBERlBBR0VfSU1BR0UpIHsKLSAgICAgICAgbV9wT2JqZWN0UmVuZGVyZXIgPSBJUERGX09iamVjdFJlbmRlcmVyOjpDcmVhdGUocE9iai0+bV9UeXBlKTsKLSAgICAgICAgaWYgKCFtX3BPYmplY3RSZW5kZXJlci0+U3RhcnQodGhpcywgcE9iaiwgcE9iajJEZXZpY2UsIEZBTFNFKSkgewotICAgICAgICAgICAgaWYgKCFtX3BPYmplY3RSZW5kZXJlci0+bV9SZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBEcmF3T2JqV2l0aEJhY2tncm91bmQocE9iaiwgcE9iajJEZXZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVsZXRlIG1fcE9iamVjdFJlbmRlcmVyOwotICAgICAgICAgICAgbV9wT2JqZWN0UmVuZGVyZXIgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDb250aW51ZVNpbmdsZU9iamVjdChwT2JqLCBwT2JqMkRldmljZSwgcFBhdXNlKTsKLSAgICB9Ci0gICAgUHJvY2Vzc09iamVjdE5vQ2xpcChwT2JqLCBwT2JqMkRldmljZSk7CitGWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpDb250aW51ZVNpbmdsZU9iamVjdChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIGlmIChtX3BPYmplY3RSZW5kZXJlcikgeworICAgIGlmIChtX3BPYmplY3RSZW5kZXJlci0+Q29udGludWUocFBhdXNlKSkKKyAgICAgIHJldHVybiBUUlVFOworCisgICAgaWYgKCFtX3BPYmplY3RSZW5kZXJlci0+bV9SZXN1bHQpCisgICAgICBEcmF3T2JqV2l0aEJhY2tncm91bmQocE9iaiwgcE9iajJEZXZpY2UpOworICAgIG1fcE9iamVjdFJlbmRlcmVyLnJlc2V0KCk7CiAgICAgcmV0dXJuIEZBTFNFOwotfQotSVBERl9PYmplY3RSZW5kZXJlciogSVBERl9PYmplY3RSZW5kZXJlcjo6Q3JlYXRlKGludCB0eXBlKQotewotICAgIGlmICh0eXBlICE9IFBERlBBR0VfSU1BR0UpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBuZXcgQ1BERl9JbWFnZVJlbmRlcmVyOwotfQotRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6R2V0T2JqZWN0Q2xpcHBlZFJlY3QoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgRlhfQk9PTCBiTG9naWNhbCwgRlhfUkVDVCAmcmVjdCkgY29uc3QKLXsKLSAgICByZWN0ID0gcE9iai0+R2V0QkJveChwT2JqMkRldmljZSk7Ci0gICAgRlhfUkVDVCBydENsaXAgPSBtX3BEZXZpY2UtPkdldENsaXBCb3goKTsKLSAgICBpZiAoIWJMb2dpY2FsKSB7Ci0gICAgICAgIENGWF9NYXRyaXggZENUTSA9IG1fcERldmljZS0+R2V0Q1RNKCk7Ci0gICAgICAgIEZYX0ZMT0FUIGEgPSBGWFNZU19mYWJzKGRDVE0uYSk7Ci0gICAgICAgIEZYX0ZMT0FUIGQgPSBGWFNZU19mYWJzKGRDVE0uZCk7Ci0gICAgICAgIGlmIChhICE9IDEuMGYgfHwgZCAhPSAxLjBmKSB7Ci0gICAgICAgICAgICByZWN0LnJpZ2h0ID0gcmVjdC5sZWZ0ICsgKEZYX0lOVDMyKUZYU1lTX2NlaWwoKEZYX0ZMT0FUKXJlY3QuV2lkdGgoKSAqIGEpOwotICAgICAgICAgICAgcmVjdC5ib3R0b20gPSByZWN0LnRvcCArIChGWF9JTlQzMilGWFNZU19jZWlsKChGWF9GTE9BVClyZWN0LkhlaWdodCgpICogZCk7Ci0gICAgICAgICAgICBydENsaXAucmlnaHQgPSBydENsaXAubGVmdCArIChGWF9JTlQzMilGWFNZU19jZWlsKChGWF9GTE9BVClydENsaXAuV2lkdGgoKSAqIGEpOwotICAgICAgICAgICAgcnRDbGlwLmJvdHRvbSA9IHJ0Q2xpcC50b3AgKyAoRlhfSU5UMzIpRlhTWVNfY2VpbCgoRlhfRkxPQVQpcnRDbGlwLkhlaWdodCgpICogZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmVjdC5JbnRlcnNlY3QocnRDbGlwKTsKLSAgICByZXR1cm4gcmVjdC5Jc0VtcHR5KCk7Ci19Ci12b2lkIENQREZfUmVuZGVyU3RhdHVzOjpEaXRoZXJPYmplY3RBcmVhKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCi17Ci0gICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gbV9wRGV2aWNlLT5HZXRCaXRtYXAoKTsKLSAgICBpZiAocEJpdG1hcCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfUkVDVCByZWN0OwotICAgIGlmIChHZXRPYmplY3RDbGlwcGVkUmVjdChwT2JqLCBwT2JqMkRldmljZSwgRkFMU0UsIHJlY3QpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1fRGl0aGVyQml0cyA9PSAyKSB7Ci0gICAgICAgIHN0YXRpYyBGWF9BUkdCIHBhbFs0XSA9IHswLCA4NSwgMTcwLCAyNTV9OwotICAgICAgICBwQml0bWFwLT5EaXRoZXJGUyhwYWwsIDQsICZyZWN0KTsKLSAgICB9IGVsc2UgaWYgKG1fRGl0aGVyQml0cyA9PSAzKSB7Ci0gICAgICAgIHN0YXRpYyBGWF9BUkdCIHBhbFs4XSA9IHswLCAzNiwgNzMsIDEwOSwgMTQ2LCAxODIsIDIxOSwgMjU1fTsKLSAgICAgICAgcEJpdG1hcC0+RGl0aGVyRlMocGFsLCA4LCAmcmVjdCk7Ci0gICAgfSBlbHNlIGlmIChtX0RpdGhlckJpdHMgPT0gNCkgewotICAgICAgICBzdGF0aWMgRlhfQVJHQiBwYWxbMTZdID0gezAsIDE3LCAzNCwgNTEsIDY4LCA4NSwgMTAyLCAxMTksIDEzNiwgMTUzLCAxNzAsIDE4NywgMjA0LCAyMjEsIDIzOCwgMjU1fTsKLSAgICAgICAgcEJpdG1hcC0+RGl0aGVyRlMocGFsLCAxNiwgJnJlY3QpOwotICAgIH0KLX0KLXZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NPYmplY3ROb0NsaXAoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKLXsKLSAgICBGWF9CT09MIGJSZXQgPSBGQUxTRTsKLSAgICBzd2l0Y2ggKHBPYmotPm1fVHlwZSkgewotICAgICAgICBjYXNlIFBERlBBR0VfVEVYVDoKLSAgICAgICAgICAgIGJSZXQgPSBQcm9jZXNzVGV4dCgoQ1BERl9UZXh0T2JqZWN0KilwT2JqLCBwT2JqMkRldmljZSwgTlVMTCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQREZQQUdFX1BBVEg6Ci0gICAgICAgICAgICBiUmV0ID0gUHJvY2Vzc1BhdGgoKENQREZfUGF0aE9iamVjdCopcE9iaiwgcE9iajJEZXZpY2UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUERGUEFHRV9JTUFHRToKLSAgICAgICAgICAgIGJSZXQgPSBQcm9jZXNzSW1hZ2UoKENQREZfSW1hZ2VPYmplY3QqKXBPYmosIHBPYmoyRGV2aWNlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBERlBBR0VfU0hBRElORzoKLSAgICAgICAgICAgIGJSZXQgPSBQcm9jZXNzU2hhZGluZygoQ1BERl9TaGFkaW5nT2JqZWN0KilwT2JqLCBwT2JqMkRldmljZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQREZQQUdFX0ZPUk06Ci0gICAgICAgICAgICBiUmV0ID0gUHJvY2Vzc0Zvcm0oKENQREZfRm9ybU9iamVjdCopcE9iaiwgcE9iajJEZXZpY2UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmICghYlJldCkgeworICB9CisKKyAgbV9wQ3VyT2JqID0gcE9iajsKKyAgaWYgKG1fT3B0aW9ucy5tX3BPQ0NvbnRleHQgJiYgcE9iai0+bV9Db250ZW50TWFyay5Ob3ROdWxsKCkgJiYKKyAgICAgICFtX09wdGlvbnMubV9wT0NDb250ZXh0LT5DaGVja09iamVjdFZpc2libGUocE9iaikpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBQcm9jZXNzQ2xpcFBhdGgocE9iai0+bV9DbGlwUGF0aCwgcE9iajJEZXZpY2UpOworICBpZiAoUHJvY2Vzc1RyYW5zcGFyZW5jeShwT2JqLCBwT2JqMkRldmljZSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChwT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9JTUFHRSkgeworICAgIG1fcE9iamVjdFJlbmRlcmVyLnJlc2V0KElQREZfT2JqZWN0UmVuZGVyZXI6OkNyZWF0ZShwT2JqLT5tX1R5cGUpKTsKKyAgICBpZiAoIW1fcE9iamVjdFJlbmRlcmVyLT5TdGFydCh0aGlzLCBwT2JqLCBwT2JqMkRldmljZSwgRkFMU0UpKSB7CisgICAgICBpZiAoIW1fcE9iamVjdFJlbmRlcmVyLT5tX1Jlc3VsdCkKICAgICAgICAgRHJhd09ialdpdGhCYWNrZ3JvdW5kKHBPYmosIHBPYmoyRGV2aWNlKTsKKyAgICAgIG1fcE9iamVjdFJlbmRlcmVyLnJlc2V0KCk7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQorICAgIHJldHVybiBDb250aW51ZVNpbmdsZU9iamVjdChwT2JqLCBwT2JqMkRldmljZSwgcFBhdXNlKTsKKyAgfQorCisgIFByb2Nlc3NPYmplY3ROb0NsaXAocE9iaiwgcE9iajJEZXZpY2UpOworICByZXR1cm4gRkFMU0U7CiB9Ci1GWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3T2JqV2l0aEJsZW5kKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCi17Ci0gICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7Ci0gICAgc3dpdGNoIChwT2JqLT5tX1R5cGUpIHsKLSAgICAgICAgY2FzZSBQREZQQUdFX1BBVEg6Ci0gICAgICAgICAgICBiUmV0ID0gUHJvY2Vzc1BhdGgoKENQREZfUGF0aE9iamVjdCopcE9iaiwgcE9iajJEZXZpY2UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUERGUEFHRV9JTUFHRToKLSAgICAgICAgICAgIGJSZXQgPSBQcm9jZXNzSW1hZ2UoKENQREZfSW1hZ2VPYmplY3QgKilwT2JqLCBwT2JqMkRldmljZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQREZQQUdFX0ZPUk06Ci0gICAgICAgICAgICBiUmV0ID0gUHJvY2Vzc0Zvcm0oKENQREZfRm9ybU9iamVjdCopcE9iaiwgcE9iajJEZXZpY2UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBiUmV0OworCitJUERGX09iamVjdFJlbmRlcmVyKiBJUERGX09iamVjdFJlbmRlcmVyOjpDcmVhdGUoaW50IHR5cGUpIHsKKyAgaWYgKHR5cGUgIT0gUERGUEFHRV9JTUFHRSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBuZXcgQ1BERl9JbWFnZVJlbmRlcmVyOwogfQotdm9pZCBDUERGX1JlbmRlclN0YXR1czo6R2V0U2NhbGVkTWF0cml4KENGWF9NYXRyaXggJm1hdHJpeCkgY29uc3QKLXsKK0ZYX0JPT0wgQ1BERl9SZW5kZXJTdGF0dXM6OkdldE9iamVjdENsaXBwZWRSZWN0KGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTG9naWNhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QmIHJlY3QpIGNvbnN0IHsKKyAgcmVjdCA9IHBPYmotPkdldEJCb3gocE9iajJEZXZpY2UpOworICBGWF9SRUNUIHJ0Q2xpcCA9IG1fcERldmljZS0+R2V0Q2xpcEJveCgpOworICBpZiAoIWJMb2dpY2FsKSB7CiAgICAgQ0ZYX01hdHJpeCBkQ1RNID0gbV9wRGV2aWNlLT5HZXRDVE0oKTsKLSAgICBtYXRyaXguYSAqPSBGWFNZU19mYWJzKGRDVE0uYSk7Ci0gICAgbWF0cml4LmQgKj0gRlhTWVNfZmFicyhkQ1RNLmQpOworICAgIEZYX0ZMT0FUIGEgPSBGWFNZU19mYWJzKGRDVE0uYSk7CisgICAgRlhfRkxPQVQgZCA9IEZYU1lTX2ZhYnMoZENUTS5kKTsKKyAgICBpZiAoYSAhPSAxLjBmIHx8IGQgIT0gMS4wZikgeworICAgICAgcmVjdC5yaWdodCA9IHJlY3QubGVmdCArIChpbnQzMl90KUZYU1lTX2NlaWwoKEZYX0ZMT0FUKXJlY3QuV2lkdGgoKSAqIGEpOworICAgICAgcmVjdC5ib3R0b20gPSByZWN0LnRvcCArIChpbnQzMl90KUZYU1lTX2NlaWwoKEZYX0ZMT0FUKXJlY3QuSGVpZ2h0KCkgKiBkKTsKKyAgICAgIHJ0Q2xpcC5yaWdodCA9CisgICAgICAgICAgcnRDbGlwLmxlZnQgKyAoaW50MzJfdClGWFNZU19jZWlsKChGWF9GTE9BVClydENsaXAuV2lkdGgoKSAqIGEpOworICAgICAgcnRDbGlwLmJvdHRvbSA9CisgICAgICAgICAgcnRDbGlwLnRvcCArIChpbnQzMl90KUZYU1lTX2NlaWwoKEZYX0ZMT0FUKXJ0Q2xpcC5IZWlnaHQoKSAqIGQpOworICAgIH0KKyAgfQorICByZWN0LkludGVyc2VjdChydENsaXApOworICByZXR1cm4gcmVjdC5Jc0VtcHR5KCk7CiB9Ci12b2lkIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3T2JqV2l0aEJhY2tncm91bmQoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKLXsKLSAgICBGWF9SRUNUIHJlY3Q7Ci0gICAgaWYgKEdldE9iamVjdENsaXBwZWRSZWN0KHBPYmosIHBPYmoyRGV2aWNlLCBGQUxTRSwgcmVjdCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgcmVzID0gMzAwOwotICAgIGlmIChwT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9JTUFHRSAmJiBtX3BEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19ERVZJQ0VfQ0xBU1MpID09IEZYRENfUFJJTlRFUikgewotICAgICAgICByZXMgPSAwOwotICAgIH0KLSAgICBDUERGX1NjYWxlZFJlbmRlckJ1ZmZlciBidWZmZXI7Ci0gICAgaWYgKCFidWZmZXIuSW5pdGlhbGl6ZShtX3BDb250ZXh0LCBtX3BEZXZpY2UsICZyZWN0LCBwT2JqLCAmbV9PcHRpb25zLCByZXMpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXggPSAqcE9iajJEZXZpY2U7Ci0gICAgbWF0cml4LkNvbmNhdCgqYnVmZmVyLkdldE1hdHJpeCgpKTsKLSAgICBHZXRTY2FsZWRNYXRyaXgobWF0cml4KTsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2UgPSBOVUxMOwotICAgIGlmIChwT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9GT1JNKSB7Ci0gICAgICAgIENQREZfRm9ybU9iamVjdCogcEZvcm1PYmogPSAoQ1BERl9Gb3JtT2JqZWN0KilwT2JqOwotICAgICAgICBpZiAocEZvcm1PYmotPm1fcEZvcm0gJiYgcEZvcm1PYmotPm1fcEZvcm0tPm1fcEZvcm1EaWN0KSB7Ci0gICAgICAgICAgICBwRm9ybVJlc291cmNlID0gcEZvcm1PYmotPm1fcEZvcm0tPm1fcEZvcm1EaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJSZXNvdXJjZXMiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQ1BERl9SZW5kZXJTdGF0dXMgc3RhdHVzOwotICAgIHN0YXR1cy5Jbml0aWFsaXplKG1fcENvbnRleHQsIGJ1ZmZlci5HZXREZXZpY2UoKSwgYnVmZmVyLkdldE1hdHJpeCgpLCBOVUxMLCBOVUxMLCBOVUxMLCAmbV9PcHRpb25zLCBtX1RyYW5zcGFyZW5jeSwgbV9iRHJvcE9iamVjdHMsIHBGb3JtUmVzb3VyY2UpOwotICAgIHN0YXR1cy5SZW5kZXJTaW5nbGVPYmplY3QocE9iaiwgJm1hdHJpeCk7Ci0gICAgYnVmZmVyLk91dHB1dFRvRGV2aWNlKCk7Cit2b2lkIENQREZfUmVuZGVyU3RhdHVzOjpEaXRoZXJPYmplY3RBcmVhKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UpIHsKKyAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gbV9wRGV2aWNlLT5HZXRCaXRtYXAoKTsKKyAgaWYgKCFwQml0bWFwKSB7CisgICAgcmV0dXJuOworICB9CisgIEZYX1JFQ1QgcmVjdDsKKyAgaWYgKEdldE9iamVjdENsaXBwZWRSZWN0KHBPYmosIHBPYmoyRGV2aWNlLCBGQUxTRSwgcmVjdCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fRGl0aGVyQml0cyA9PSAyKSB7CisgICAgc3RhdGljIEZYX0FSR0IgcGFsWzRdID0gezAsIDg1LCAxNzAsIDI1NX07CisgICAgcEJpdG1hcC0+RGl0aGVyRlMocGFsLCA0LCAmcmVjdCk7CisgIH0gZWxzZSBpZiAobV9EaXRoZXJCaXRzID09IDMpIHsKKyAgICBzdGF0aWMgRlhfQVJHQiBwYWxbOF0gPSB7MCwgMzYsIDczLCAxMDksIDE0NiwgMTgyLCAyMTksIDI1NX07CisgICAgcEJpdG1hcC0+RGl0aGVyRlMocGFsLCA4LCAmcmVjdCk7CisgIH0gZWxzZSBpZiAobV9EaXRoZXJCaXRzID09IDQpIHsKKyAgICBzdGF0aWMgRlhfQVJHQiBwYWxbMTZdID0gezAsICAgMTcsICAzNCwgIDUxLCAgNjgsICA4NSwgIDEwMiwgMTE5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM2LCAxNTMsIDE3MCwgMTg3LCAyMDQsIDIyMSwgMjM4LCAyNTV9OworICAgIHBCaXRtYXAtPkRpdGhlckZTKHBhbCwgMTYsICZyZWN0KTsKKyAgfQogfQotRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc0Zvcm0oQ1BERl9Gb3JtT2JqZWN0KiBwRm9ybU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCi17Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwT0MgPSBwRm9ybU9iai0+bV9wRm9ybS0+bV9wRm9ybURpY3QtPkdldERpY3QoRlhfQlNUUkMoIk9DIikpOwotICAgIGlmIChwT0MgJiYgbV9PcHRpb25zLm1fcE9DQ29udGV4dCAmJiAhbV9PcHRpb25zLm1fcE9DQ29udGV4dC0+Q2hlY2tPQ0dWaXNpYmxlKHBPQykpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4ID0gcEZvcm1PYmotPm1fRm9ybU1hdHJpeDsKLSAgICBtYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzb3VyY2VzID0gTlVMTDsKK3ZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NPYmplY3ROb0NsaXAoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSkgeworICBGWF9CT09MIGJSZXQgPSBGQUxTRTsKKyAgc3dpdGNoIChwT2JqLT5tX1R5cGUpIHsKKyAgICBjYXNlIFBERlBBR0VfVEVYVDoKKyAgICAgIGJSZXQgPSBQcm9jZXNzVGV4dCgoQ1BERl9UZXh0T2JqZWN0KilwT2JqLCBwT2JqMkRldmljZSwgTlVMTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBERlBBR0VfUEFUSDoKKyAgICAgIGJSZXQgPSBQcm9jZXNzUGF0aCgoQ1BERl9QYXRoT2JqZWN0KilwT2JqLCBwT2JqMkRldmljZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBERlBBR0VfSU1BR0U6CisgICAgICBiUmV0ID0gUHJvY2Vzc0ltYWdlKChDUERGX0ltYWdlT2JqZWN0KilwT2JqLCBwT2JqMkRldmljZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBERlBBR0VfU0hBRElORzoKKyAgICAgIGJSZXQgPSBQcm9jZXNzU2hhZGluZygoQ1BERl9TaGFkaW5nT2JqZWN0KilwT2JqLCBwT2JqMkRldmljZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBERlBBR0VfRk9STToKKyAgICAgIGJSZXQgPSBQcm9jZXNzRm9ybSgoQ1BERl9Gb3JtT2JqZWN0KilwT2JqLCBwT2JqMkRldmljZSk7CisgICAgICBicmVhazsKKyAgfQorICBpZiAoIWJSZXQpIHsKKyAgICBEcmF3T2JqV2l0aEJhY2tncm91bmQocE9iaiwgcE9iajJEZXZpY2UpOworICB9Cit9CitGWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3T2JqV2l0aEJsZW5kKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UpIHsKKyAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7CisgIHN3aXRjaCAocE9iai0+bV9UeXBlKSB7CisgICAgY2FzZSBQREZQQUdFX1BBVEg6CisgICAgICBiUmV0ID0gUHJvY2Vzc1BhdGgoKENQREZfUGF0aE9iamVjdCopcE9iaiwgcE9iajJEZXZpY2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQREZQQUdFX0lNQUdFOgorICAgICAgYlJldCA9IFByb2Nlc3NJbWFnZSgoQ1BERl9JbWFnZU9iamVjdCopcE9iaiwgcE9iajJEZXZpY2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQREZQQUdFX0ZPUk06CisgICAgICBiUmV0ID0gUHJvY2Vzc0Zvcm0oKENQREZfRm9ybU9iamVjdCopcE9iaiwgcE9iajJEZXZpY2UpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGJSZXQ7Cit9Cit2b2lkIENQREZfUmVuZGVyU3RhdHVzOjpHZXRTY2FsZWRNYXRyaXgoQ0ZYX01hdHJpeCYgbWF0cml4KSBjb25zdCB7CisgIENGWF9NYXRyaXggZENUTSA9IG1fcERldmljZS0+R2V0Q1RNKCk7CisgIG1hdHJpeC5hICo9IEZYU1lTX2ZhYnMoZENUTS5hKTsKKyAgbWF0cml4LmQgKj0gRlhTWVNfZmFicyhkQ1RNLmQpOworfQordm9pZCBDUERGX1JlbmRlclN0YXR1czo6RHJhd09ialdpdGhCYWNrZ3JvdW5kKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSkgeworICBGWF9SRUNUIHJlY3Q7CisgIGlmIChHZXRPYmplY3RDbGlwcGVkUmVjdChwT2JqLCBwT2JqMkRldmljZSwgRkFMU0UsIHJlY3QpKSB7CisgICAgcmV0dXJuOworICB9CisgIGludCByZXMgPSAzMDA7CisgIGlmIChwT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9JTUFHRSAmJgorICAgICAgbV9wRGV2aWNlLT5HZXREZXZpY2VDYXBzKEZYRENfREVWSUNFX0NMQVNTKSA9PSBGWERDX1BSSU5URVIpIHsKKyAgICByZXMgPSAwOworICB9CisgIENQREZfU2NhbGVkUmVuZGVyQnVmZmVyIGJ1ZmZlcjsKKyAgaWYgKCFidWZmZXIuSW5pdGlhbGl6ZShtX3BDb250ZXh0LCBtX3BEZXZpY2UsIHJlY3QsIHBPYmosICZtX09wdGlvbnMsIHJlcykpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ0ZYX01hdHJpeCBtYXRyaXggPSAqcE9iajJEZXZpY2U7CisgIG1hdHJpeC5Db25jYXQoKmJ1ZmZlci5HZXRNYXRyaXgoKSk7CisgIEdldFNjYWxlZE1hdHJpeChtYXRyaXgpOworICBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2UgPSBOVUxMOworICBpZiAocE9iai0+bV9UeXBlID09IFBERlBBR0VfRk9STSkgeworICAgIENQREZfRm9ybU9iamVjdCogcEZvcm1PYmogPSAoQ1BERl9Gb3JtT2JqZWN0KilwT2JqOwogICAgIGlmIChwRm9ybU9iai0+bV9wRm9ybSAmJiBwRm9ybU9iai0+bV9wRm9ybS0+bV9wRm9ybURpY3QpIHsKLSAgICAgICAgcFJlc291cmNlcyA9IHBGb3JtT2JqLT5tX3BGb3JtLT5tX3BGb3JtRGljdC0+R2V0RGljdChGWF9CU1RSQygiUmVzb3VyY2VzIikpOworICAgICAgcEZvcm1SZXNvdXJjZSA9IHBGb3JtT2JqLT5tX3BGb3JtLT5tX3BGb3JtRGljdC0+R2V0RGljdCgiUmVzb3VyY2VzIik7CiAgICAgfQotICAgIENQREZfUmVuZGVyU3RhdHVzIHN0YXR1czsKLSAgICBzdGF0dXMuSW5pdGlhbGl6ZShtX3BDb250ZXh0LCBtX3BEZXZpY2UsIE5VTEwsIG1fcFN0b3BPYmosCi0gICAgICAgICAgICAgICAgICAgICAgdGhpcywgcEZvcm1PYmosICZtX09wdGlvbnMsIG1fVHJhbnNwYXJlbmN5LCBtX2JEcm9wT2JqZWN0cywgcFJlc291cmNlcywgRkFMU0UpOwotICAgIHN0YXR1cy5tX2N1ckJsZW5kID0gbV9jdXJCbGVuZDsKLSAgICBtX3BEZXZpY2UtPlNhdmVTdGF0ZSgpOwotICAgIHN0YXR1cy5SZW5kZXJPYmplY3RMaXN0KHBGb3JtT2JqLT5tX3BGb3JtLCAmbWF0cml4KTsKLSAgICBtX2JTdG9wcGVkID0gc3RhdHVzLm1fYlN0b3BwZWQ7Ci0gICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgfQorICBDUERGX1JlbmRlclN0YXR1cyBzdGF0dXM7CisgIHN0YXR1cy5Jbml0aWFsaXplKG1fcENvbnRleHQsIGJ1ZmZlci5HZXREZXZpY2UoKSwgYnVmZmVyLkdldE1hdHJpeCgpLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCAmbV9PcHRpb25zLCBtX1RyYW5zcGFyZW5jeSwgbV9iRHJvcE9iamVjdHMsCisgICAgICAgICAgICAgICAgICAgIHBGb3JtUmVzb3VyY2UpOworICBzdGF0dXMuUmVuZGVyU2luZ2xlT2JqZWN0KHBPYmosICZtYXRyaXgpOworICBidWZmZXIuT3V0cHV0VG9EZXZpY2UoKTsKIH0KLUZYX0JPT0wgSXNBdmFpbGFibGVNYXRyaXgoY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KQotewotICAgIGlmIChtYXRyaXguYSA9PSAwIHx8IG1hdHJpeC5kID09IDApIHsKLSAgICAgICAgcmV0dXJuIG1hdHJpeC5iICE9IDAgJiYgbWF0cml4LmMgIT0gMDsKLSAgICB9Ci0gICAgaWYgKG1hdHJpeC5iID09IDAgfHwgbWF0cml4LmMgPT0gMCkgewotICAgICAgICByZXR1cm4gbWF0cml4LmEgIT0gMCAmJiBtYXRyaXguZCAhPSAwOwotICAgIH0KK0ZYX0JPT0wgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NGb3JtKENQREZfRm9ybU9iamVjdCogcEZvcm1PYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSkgeworICBDUERGX0RpY3Rpb25hcnkqIHBPQyA9IHBGb3JtT2JqLT5tX3BGb3JtLT5tX3BGb3JtRGljdC0+R2V0RGljdCgiT0MiKTsKKyAgaWYgKHBPQyAmJiBtX09wdGlvbnMubV9wT0NDb250ZXh0ICYmCisgICAgICAhbV9PcHRpb25zLm1fcE9DQ29udGV4dC0+Q2hlY2tPQ0dWaXNpYmxlKHBPQykpIHsKICAgICByZXR1cm4gVFJVRTsKKyAgfQorICBDRlhfTWF0cml4IG1hdHJpeCA9IHBGb3JtT2JqLT5tX0Zvcm1NYXRyaXg7CisgIG1hdHJpeC5Db25jYXQoKnBPYmoyRGV2aWNlKTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzb3VyY2VzID0gTlVMTDsKKyAgaWYgKHBGb3JtT2JqLT5tX3BGb3JtICYmIHBGb3JtT2JqLT5tX3BGb3JtLT5tX3BGb3JtRGljdCkgeworICAgIHBSZXNvdXJjZXMgPSBwRm9ybU9iai0+bV9wRm9ybS0+bV9wRm9ybURpY3QtPkdldERpY3QoIlJlc291cmNlcyIpOworICB9CisgIENQREZfUmVuZGVyU3RhdHVzIHN0YXR1czsKKyAgc3RhdHVzLkluaXRpYWxpemUobV9wQ29udGV4dCwgbV9wRGV2aWNlLCBOVUxMLCBtX3BTdG9wT2JqLCB0aGlzLCBwRm9ybU9iaiwKKyAgICAgICAgICAgICAgICAgICAgJm1fT3B0aW9ucywgbV9UcmFuc3BhcmVuY3ksIG1fYkRyb3BPYmplY3RzLCBwUmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisgIHN0YXR1cy5tX2N1ckJsZW5kID0gbV9jdXJCbGVuZDsKKyAgbV9wRGV2aWNlLT5TYXZlU3RhdGUoKTsKKyAgc3RhdHVzLlJlbmRlck9iamVjdExpc3QocEZvcm1PYmotPm1fcEZvcm0sICZtYXRyaXgpOworICBtX2JTdG9wcGVkID0gc3RhdHVzLm1fYlN0b3BwZWQ7CisgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CisgIHJldHVybiBUUlVFOwogfQotRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc1BhdGgoQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCi17Ci0gICAgaW50IEZpbGxUeXBlID0gcFBhdGhPYmotPm1fRmlsbFR5cGU7Ci0gICAgRlhfQk9PTCBiU3Ryb2tlID0gcFBhdGhPYmotPm1fYlN0cm9rZTsKLSAgICBQcm9jZXNzUGF0aFBhdHRlcm4ocFBhdGhPYmosIHBPYmoyRGV2aWNlLCBGaWxsVHlwZSwgYlN0cm9rZSk7Ci0gICAgaWYgKEZpbGxUeXBlID09IDAgJiYgIWJTdHJva2UpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CitGWF9CT09MIElzQXZhaWxhYmxlTWF0cml4KGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgeworICBpZiAobWF0cml4LmEgPT0gMCB8fCBtYXRyaXguZCA9PSAwKSB7CisgICAgcmV0dXJuIG1hdHJpeC5iICE9IDAgJiYgbWF0cml4LmMgIT0gMDsKKyAgfQorICBpZiAobWF0cml4LmIgPT0gMCB8fCBtYXRyaXguYyA9PSAwKSB7CisgICAgcmV0dXJuIG1hdHJpeC5hICE9IDAgJiYgbWF0cml4LmQgIT0gMDsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NQYXRoKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSkgeworICBpbnQgRmlsbFR5cGUgPSBwUGF0aE9iai0+bV9GaWxsVHlwZTsKKyAgRlhfQk9PTCBiU3Ryb2tlID0gcFBhdGhPYmotPm1fYlN0cm9rZTsKKyAgUHJvY2Vzc1BhdGhQYXR0ZXJuKHBQYXRoT2JqLCBwT2JqMkRldmljZSwgRmlsbFR5cGUsIGJTdHJva2UpOworICBpZiAoRmlsbFR5cGUgPT0gMCAmJiAhYlN0cm9rZSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIEZYX0RXT1JEIGZpbGxfYXJnYiA9IDA7CisgIGlmIChGaWxsVHlwZSkgeworICAgIGZpbGxfYXJnYiA9IEdldEZpbGxBcmdiKHBQYXRoT2JqKTsKKyAgfQorICBGWF9EV09SRCBzdHJva2VfYXJnYiA9IDA7CisgIGlmIChiU3Ryb2tlKSB7CisgICAgc3Ryb2tlX2FyZ2IgPSBHZXRTdHJva2VBcmdiKHBQYXRoT2JqKTsKKyAgfQorICBDRlhfTWF0cml4IHBhdGhfbWF0cml4ID0gcFBhdGhPYmotPm1fTWF0cml4OworICBwYXRoX21hdHJpeC5Db25jYXQoKnBPYmoyRGV2aWNlKTsKKyAgaWYgKCFJc0F2YWlsYWJsZU1hdHJpeChwYXRoX21hdHJpeCkpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoRmlsbFR5cGUgJiYgKG1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX1JFQ1RfQUEpKSB7CisgICAgRmlsbFR5cGUgfD0gRlhGSUxMX1JFQ1RfQUE7CisgIH0KKyAgaWYgKG1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX0ZJTExfRlVMTENPVkVSKSB7CisgICAgRmlsbFR5cGUgfD0gRlhGSUxMX0ZVTExDT1ZFUjsKKyAgfQorICBpZiAobV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfTk9QQVRIU01PT1RIKSB7CisgICAgRmlsbFR5cGUgfD0gRlhGSUxMX05PUEFUSFNNT09USDsKKyAgfQorICBpZiAoYlN0cm9rZSkgeworICAgIEZpbGxUeXBlIHw9IEZYX0ZJTExfU1RST0tFOworICB9CisgIGNvbnN0IENQREZfR2VuZXJhbFN0YXRlRGF0YSogcEdlbmVyYWxEYXRhID0KKyAgICAgICgoQ1BERl9QYWdlT2JqZWN0KilwUGF0aE9iaiktPm1fR2VuZXJhbFN0YXRlOworICBpZiAocEdlbmVyYWxEYXRhICYmIHBHZW5lcmFsRGF0YS0+bV9TdHJva2VBZGp1c3QpIHsKKyAgICBGaWxsVHlwZSB8PSBGWF9TVFJPS0VfQURKVVNUOworICB9CisgIGlmIChtX3BUeXBlM0NoYXIpIHsKKyAgICBGaWxsVHlwZSB8PSBGWF9GSUxMX1RFWFRfTU9ERTsKKyAgfQorICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3JhcGhTdGF0ZSgqcFBhdGhPYmotPm1fR3JhcGhTdGF0ZSk7CisgIGlmIChtX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9USElOTElORSkgeworICAgIGdyYXBoU3RhdGUubV9MaW5lV2lkdGggPSAwOworICB9CisgIHJldHVybiBtX3BEZXZpY2UtPkRyYXdQYXRoKHBQYXRoT2JqLT5tX1BhdGgsICZwYXRoX21hdHJpeCwgJmdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfYXJnYiwgc3Ryb2tlX2FyZ2IsIEZpbGxUeXBlLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2N1ckJsZW5kKTsKK30KK0NQREZfVHJhbnNmZXJGdW5jKiBDUERGX1JlbmRlclN0YXR1czo6R2V0VHJhbnNmZXJGdW5jKENQREZfT2JqZWN0KiBwT2JqKSBjb25zdCB7CisgIEFTU0VSVChwT2JqKTsKKyAgQ1BERl9Eb2NSZW5kZXJEYXRhKiBwRG9jQ2FjaGUgPSBtX3BDb250ZXh0LT5tX3BEb2N1bWVudC0+R2V0UmVuZGVyRGF0YSgpOworICByZXR1cm4gcERvY0NhY2hlID8gcERvY0NhY2hlLT5HZXRUcmFuc2ZlckZ1bmMocE9iaikgOiBudWxscHRyOworfQorRlhfQVJHQiBDUERGX1JlbmRlclN0YXR1czo6R2V0RmlsbEFyZ2IoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHlwZTMpIGNvbnN0IHsKKyAgQ1BERl9Db2xvclN0YXRlRGF0YSogcENvbG9yRGF0YSA9CisgICAgICAoQ1BERl9Db2xvclN0YXRlRGF0YSopKGNvbnN0IENQREZfQ29sb3JTdGF0ZURhdGEqKXBPYmotPm1fQ29sb3JTdGF0ZTsKKyAgaWYgKG1fcFR5cGUzQ2hhciAmJiAhYlR5cGUzICYmCisgICAgICAoIW1fcFR5cGUzQ2hhci0+bV9iQ29sb3JlZCB8fAorICAgICAgIChtX3BUeXBlM0NoYXItPm1fYkNvbG9yZWQgJiYKKyAgICAgICAgKCFwQ29sb3JEYXRhIHx8IHBDb2xvckRhdGEtPm1fRmlsbENvbG9yLklzTnVsbCgpKSkpKSB7CisgICAgcmV0dXJuIG1fVDNGaWxsQ29sb3I7CisgIH0KKyAgaWYgKCFwQ29sb3JEYXRhIHx8IHBDb2xvckRhdGEtPm1fRmlsbENvbG9yLklzTnVsbCgpKSB7CisgICAgcENvbG9yRGF0YSA9IChDUERGX0NvbG9yU3RhdGVEYXRhKikoY29uc3QgQ1BERl9Db2xvclN0YXRlRGF0YSopCisgICAgICAgICAgICAgICAgICAgICBtX0luaXRpYWxTdGF0ZXMubV9Db2xvclN0YXRlOworICB9CisgIEZYX0NPTE9SUkVGIHJnYiA9IHBDb2xvckRhdGEtPm1fRmlsbFJHQjsKKyAgaWYgKHJnYiA9PSAoRlhfRFdPUkQpLTEpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBjb25zdCBDUERGX0dlbmVyYWxTdGF0ZURhdGEqIHBHZW5lcmFsRGF0YSA9IHBPYmotPm1fR2VuZXJhbFN0YXRlOworICBpbnQgYWxwaGE7CisgIGlmIChwR2VuZXJhbERhdGEpIHsKKyAgICBhbHBoYSA9IChpbnQzMl90KShwR2VuZXJhbERhdGEtPm1fRmlsbEFscGhhICogMjU1KTsKKyAgICBpZiAocEdlbmVyYWxEYXRhLT5tX3BUUikgeworICAgICAgaWYgKCFwR2VuZXJhbERhdGEtPm1fcFRyYW5zZmVyRnVuYykgeworICAgICAgICAoKENQREZfR2VuZXJhbFN0YXRlRGF0YSopcEdlbmVyYWxEYXRhKS0+bV9wVHJhbnNmZXJGdW5jID0KKyAgICAgICAgICAgIEdldFRyYW5zZmVyRnVuYyhwR2VuZXJhbERhdGEtPm1fcFRSKTsKKyAgICAgIH0KKyAgICAgIGlmIChwR2VuZXJhbERhdGEtPm1fcFRyYW5zZmVyRnVuYykgeworICAgICAgICByZ2IgPSBwR2VuZXJhbERhdGEtPm1fcFRyYW5zZmVyRnVuYy0+VHJhbnNsYXRlQ29sb3IocmdiKTsKKyAgICAgIH0KICAgICB9Ci0gICAgRlhfRFdPUkQgZmlsbF9hcmdiID0gMDsKLSAgICBpZiAoRmlsbFR5cGUpIHsKLSAgICAgICAgZmlsbF9hcmdiID0gR2V0RmlsbEFyZ2IocFBhdGhPYmopOworICB9IGVsc2UgeworICAgIGFscGhhID0gMjU1OworICB9CisgIHJldHVybiBtX09wdGlvbnMuVHJhbnNsYXRlQ29sb3IoQXJnYkVuY29kZShhbHBoYSwgcmdiKSk7Cit9CitGWF9BUkdCIENQREZfUmVuZGVyU3RhdHVzOjpHZXRTdHJva2VBcmdiKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaikgY29uc3QgeworICBDUERGX0NvbG9yU3RhdGVEYXRhKiBwQ29sb3JEYXRhID0KKyAgICAgIChDUERGX0NvbG9yU3RhdGVEYXRhKikoY29uc3QgQ1BERl9Db2xvclN0YXRlRGF0YSopcE9iai0+bV9Db2xvclN0YXRlOworICBpZiAobV9wVHlwZTNDaGFyICYmICghbV9wVHlwZTNDaGFyLT5tX2JDb2xvcmVkIHx8CisgICAgICAgICAgICAgICAgICAgICAgIChtX3BUeXBlM0NoYXItPm1fYkNvbG9yZWQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICghcENvbG9yRGF0YSB8fCBwQ29sb3JEYXRhLT5tX1N0cm9rZUNvbG9yLklzTnVsbCgpKSkpKSB7CisgICAgcmV0dXJuIG1fVDNGaWxsQ29sb3I7CisgIH0KKyAgaWYgKCFwQ29sb3JEYXRhIHx8IHBDb2xvckRhdGEtPm1fU3Ryb2tlQ29sb3IuSXNOdWxsKCkpIHsKKyAgICBwQ29sb3JEYXRhID0gKENQREZfQ29sb3JTdGF0ZURhdGEqKShjb25zdCBDUERGX0NvbG9yU3RhdGVEYXRhKikKKyAgICAgICAgICAgICAgICAgICAgIG1fSW5pdGlhbFN0YXRlcy5tX0NvbG9yU3RhdGU7CisgIH0KKyAgRlhfQ09MT1JSRUYgcmdiID0gcENvbG9yRGF0YS0+bV9TdHJva2VSR0I7CisgIGlmIChyZ2IgPT0gKEZYX0RXT1JEKS0xKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgY29uc3QgQ1BERl9HZW5lcmFsU3RhdGVEYXRhKiBwR2VuZXJhbERhdGEgPSBwT2JqLT5tX0dlbmVyYWxTdGF0ZTsKKyAgaW50IGFscGhhOworICBpZiAocEdlbmVyYWxEYXRhKSB7CisgICAgYWxwaGEgPSAoaW50MzJfdCkocEdlbmVyYWxEYXRhLT5tX1N0cm9rZUFscGhhICogMjU1KTsKKyAgICBpZiAocEdlbmVyYWxEYXRhLT5tX3BUUikgeworICAgICAgaWYgKCFwR2VuZXJhbERhdGEtPm1fcFRyYW5zZmVyRnVuYykgeworICAgICAgICAoKENQREZfR2VuZXJhbFN0YXRlRGF0YSopcEdlbmVyYWxEYXRhKS0+bV9wVHJhbnNmZXJGdW5jID0KKyAgICAgICAgICAgIEdldFRyYW5zZmVyRnVuYyhwR2VuZXJhbERhdGEtPm1fcFRSKTsKKyAgICAgIH0KKyAgICAgIGlmIChwR2VuZXJhbERhdGEtPm1fcFRyYW5zZmVyRnVuYykgeworICAgICAgICByZ2IgPSBwR2VuZXJhbERhdGEtPm1fcFRyYW5zZmVyRnVuYy0+VHJhbnNsYXRlQ29sb3IocmdiKTsKKyAgICAgIH0KICAgICB9Ci0gICAgRlhfRFdPUkQgc3Ryb2tlX2FyZ2IgPSAwOwotICAgIGlmIChiU3Ryb2tlKSB7Ci0gICAgICAgIHN0cm9rZV9hcmdiID0gR2V0U3Ryb2tlQXJnYihwUGF0aE9iaik7CisgIH0gZWxzZSB7CisgICAgYWxwaGEgPSAyNTU7CisgIH0KKyAgcmV0dXJuIG1fT3B0aW9ucy5UcmFuc2xhdGVDb2xvcihBcmdiRW5jb2RlKGFscGhhLCByZ2IpKTsKK30KK3ZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NDbGlwUGF0aChDUERGX0NsaXBQYXRoIENsaXBQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlKSB7CisgIGlmIChDbGlwUGF0aC5Jc051bGwoKSkgeworICAgIGlmICghbV9MYXN0Q2xpcFBhdGguSXNOdWxsKCkpIHsKKyAgICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKFRSVUUpOworICAgICAgbV9MYXN0Q2xpcFBhdGguU2V0TnVsbCgpOwogICAgIH0KLSAgICBDRlhfQWZmaW5lTWF0cml4IHBhdGhfbWF0cml4ID0gcFBhdGhPYmotPm1fTWF0cml4OwotICAgIHBhdGhfbWF0cml4LkNvbmNhdCgqcE9iajJEZXZpY2UpOwotICAgIGlmICghSXNBdmFpbGFibGVNYXRyaXgocGF0aF9tYXRyaXgpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9MYXN0Q2xpcFBhdGggPT0gQ2xpcFBhdGgpCisgICAgcmV0dXJuOworCisgIG1fTGFzdENsaXBQYXRoID0gQ2xpcFBhdGg7CisgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKFRSVUUpOworICBpbnQgbkNsaXBQYXRoID0gQ2xpcFBhdGguR2V0UGF0aENvdW50KCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNsaXBQYXRoOyArK2kpIHsKKyAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSA9IENsaXBQYXRoLkdldFBhdGgoaSk7CisgICAgaWYgKCFwUGF0aERhdGEpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChwUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSA9PSAwKSB7CisgICAgICBDRlhfUGF0aERhdGEgRW1wdHlQYXRoOworICAgICAgRW1wdHlQYXRoLkFwcGVuZFJlY3QoLTEsIC0xLCAwLCAwKTsKKyAgICAgIGludCBmaWxsX21vZGUgPSBGWEZJTExfV0lORElORzsKKyAgICAgIG1fcERldmljZS0+U2V0Q2xpcF9QYXRoRmlsbCgmRW1wdHlQYXRoLCBudWxscHRyLCBmaWxsX21vZGUpOworICAgIH0gZWxzZSB7CisgICAgICBpbnQgQ2xpcFR5cGUgPSBDbGlwUGF0aC5HZXRDbGlwVHlwZShpKTsKKyAgICAgIG1fcERldmljZS0+U2V0Q2xpcF9QYXRoRmlsbChwUGF0aERhdGEsIHBPYmoyRGV2aWNlLCBDbGlwVHlwZSk7CiAgICAgfQotICAgIGlmIChGaWxsVHlwZSAmJiAobV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfUkVDVF9BQSkpIHsKLSAgICAgICAgRmlsbFR5cGUgfD0gRlhGSUxMX1JFQ1RfQUE7CisgIH0KKyAgaW50IHRleHRjb3VudCA9IENsaXBQYXRoLkdldFRleHRDb3VudCgpOworICBpZiAodGV4dGNvdW50ID09IDApCisgICAgcmV0dXJuOworCisgIGlmIChtX3BEZXZpY2UtPkdldERldmljZUNsYXNzKCkgPT0gRlhEQ19ESVNQTEFZICYmCisgICAgICAhKG1fcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX1JFTkRFUl9DQVBTKSAmIEZYUkNfU09GVF9DTElQKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfUGF0aERhdGE+IHBUZXh0Q2xpcHBpbmdQYXRoOworICBmb3IgKGludCBpID0gMDsgaSA8IHRleHRjb3VudDsgKytpKSB7CisgICAgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dCA9IENsaXBQYXRoLkdldFRleHQoaSk7CisgICAgaWYgKHBUZXh0KSB7CisgICAgICBpZiAoIXBUZXh0Q2xpcHBpbmdQYXRoKQorICAgICAgICBwVGV4dENsaXBwaW5nUGF0aC5yZXNldChuZXcgQ0ZYX1BhdGhEYXRhKTsKKyAgICAgIFByb2Nlc3NUZXh0KHBUZXh0LCBwT2JqMkRldmljZSwgcFRleHRDbGlwcGluZ1BhdGguZ2V0KCkpOworICAgICAgY29udGludWU7CiAgICAgfQotICAgIGlmIChtX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9GSUxMX0ZVTExDT1ZFUikgewotICAgICAgICBGaWxsVHlwZSB8PSBGWEZJTExfRlVMTENPVkVSOworCisgICAgaWYgKCFwVGV4dENsaXBwaW5nUGF0aCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaW50IGZpbGxfbW9kZSA9IEZYRklMTF9XSU5ESU5HOworICAgIGlmIChtX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9OT1RFWFRTTU9PVEgpCisgICAgICBmaWxsX21vZGUgfD0gRlhGSUxMX05PUEFUSFNNT09USDsKKyAgICBtX3BEZXZpY2UtPlNldENsaXBfUGF0aEZpbGwocFRleHRDbGlwcGluZ1BhdGguZ2V0KCksIG51bGxwdHIsIGZpbGxfbW9kZSk7CisgICAgcFRleHRDbGlwcGluZ1BhdGgucmVzZXQoKTsKKyAgfQorfQorCit2b2lkIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3Q2xpcFBhdGgoQ1BERl9DbGlwUGF0aCBDbGlwUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSkgeworICBpZiAoQ2xpcFBhdGguSXNOdWxsKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IGZpbGxfbW9kZSA9IDA7CisgIGlmIChtX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9OT1BBVEhTTU9PVEgpIHsKKyAgICBmaWxsX21vZGUgfD0gRlhGSUxMX05PUEFUSFNNT09USDsKKyAgfQorICBpbnQgbkNsaXBQYXRoID0gQ2xpcFBhdGguR2V0UGF0aENvdW50KCk7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbkNsaXBQYXRoOyBpKyspIHsKKyAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSA9IENsaXBQYXRoLkdldFBhdGgoaSk7CisgICAgaWYgKCFwUGF0aERhdGEpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpZiAobV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfTk9QQVRIU01PT1RIKSB7Ci0gICAgICAgIEZpbGxUeXBlIHw9IEZYRklMTF9OT1BBVEhTTU9PVEg7CisgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIHN0cm9rZV9zdGF0ZTsKKyAgICBpZiAobV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfVEhJTkxJTkUpIHsKKyAgICAgIHN0cm9rZV9zdGF0ZS5tX0xpbmVXaWR0aCA9IDA7CiAgICAgfQotICAgIGlmIChiU3Ryb2tlKSB7Ci0gICAgICAgIEZpbGxUeXBlIHw9IEZYX0ZJTExfU1RST0tFOwotICAgIH0KLSAgICBjb25zdCBDUERGX0dlbmVyYWxTdGF0ZURhdGEqIHBHZW5lcmFsRGF0YSA9ICgoQ1BERl9QYWdlT2JqZWN0KilwUGF0aE9iaiktPm1fR2VuZXJhbFN0YXRlOwotICAgIGlmIChwR2VuZXJhbERhdGEgJiYgcEdlbmVyYWxEYXRhLT5tX1N0cm9rZUFkanVzdCkgewotICAgICAgICBGaWxsVHlwZSB8PSBGWF9TVFJPS0VfQURKVVNUOwotICAgIH0KLSAgICBpZiAobV9wVHlwZTNDaGFyKSB7Ci0gICAgICAgIEZpbGxUeXBlIHw9IEZYX0ZJTExfVEVYVF9NT0RFOwotICAgIH0KKyAgICBtX3BEZXZpY2UtPkRyYXdQYXRoKHBQYXRoRGF0YSwgcE9iajJEZXZpY2UsICZzdHJva2Vfc3RhdGUsIDAsIDB4ZmZmZjAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX21vZGUpOworICB9Cit9CitGWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpTZWxlY3RDbGlwUGF0aChDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdHJva2UpIHsKKyAgQ0ZYX01hdHJpeCBwYXRoX21hdHJpeCA9IHBQYXRoT2JqLT5tX01hdHJpeDsKKyAgcGF0aF9tYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7CisgIGlmIChiU3Ryb2tlKSB7CiAgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdyYXBoU3RhdGUoKnBQYXRoT2JqLT5tX0dyYXBoU3RhdGUpOwogICAgIGlmIChtX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9USElOTElORSkgewotICAgICAgICBncmFwaFN0YXRlLm1fTGluZVdpZHRoID0gMDsKKyAgICAgIGdyYXBoU3RhdGUubV9MaW5lV2lkdGggPSAwOwogICAgIH0KLSAgICByZXR1cm4gbV9wRGV2aWNlLT5EcmF3UGF0aChwUGF0aE9iai0+bV9QYXRoLCAmcGF0aF9tYXRyaXgsICZncmFwaFN0YXRlLCBmaWxsX2FyZ2IsIHN0cm9rZV9hcmdiLCBGaWxsVHlwZSwgMCwgTlVMTCwgbV9jdXJCbGVuZCk7CisgICAgcmV0dXJuIG1fcERldmljZS0+U2V0Q2xpcF9QYXRoU3Ryb2tlKHBQYXRoT2JqLT5tX1BhdGgsICZwYXRoX21hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyYXBoU3RhdGUpOworICB9CisgIGludCBmaWxsX21vZGUgPSBwUGF0aE9iai0+bV9GaWxsVHlwZTsKKyAgaWYgKG1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX05PUEFUSFNNT09USCkgeworICAgIGZpbGxfbW9kZSB8PSBGWEZJTExfTk9QQVRIU01PT1RIOworICB9CisgIHJldHVybiBtX3BEZXZpY2UtPlNldENsaXBfUGF0aEZpbGwocFBhdGhPYmotPm1fUGF0aCwgJnBhdGhfbWF0cml4LCBmaWxsX21vZGUpOwogfQotQ1BERl9UcmFuc2ZlckZ1bmMqIENQREZfUmVuZGVyU3RhdHVzOjpHZXRUcmFuc2ZlckZ1bmMoQ1BERl9PYmplY3QqIHBPYmopIGNvbnN0Ci17Ci0gICAgQVNTRVJUKHBPYmogIT0gTlVMTCk7Ci0gICAgQ1BERl9Eb2NSZW5kZXJEYXRhKiBwRG9jQ2FjaGUgPSBtX3BDb250ZXh0LT5tX3BEb2N1bWVudC0+R2V0UmVuZGVyRGF0YSgpOwotICAgIGlmICghcERvY0NhY2hlKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc1RyYW5zcGFyZW5jeShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSkgeworICBjb25zdCBDUERGX0dlbmVyYWxTdGF0ZURhdGEqIHBHZW5lcmFsU3RhdGUgPSBwUGFnZU9iai0+bV9HZW5lcmFsU3RhdGU7CisgIGludCBibGVuZF90eXBlID0KKyAgICAgIHBHZW5lcmFsU3RhdGUgPyBwR2VuZXJhbFN0YXRlLT5tX0JsZW5kVHlwZSA6IEZYRElCX0JMRU5EX05PUk1BTDsKKyAgaWYgKGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfVU5TVVBQT1JURUQpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBTTWFza0RpY3QgPQorICAgICAgcEdlbmVyYWxTdGF0ZSA/IFRvRGljdGlvbmFyeShwR2VuZXJhbFN0YXRlLT5tX3BTb2Z0TWFzaykgOiBOVUxMOworICBpZiAocFNNYXNrRGljdCkgeworICAgIGlmIChwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfSU1BR0UgJiYKKyAgICAgICAgKChDUERGX0ltYWdlT2JqZWN0KilwUGFnZU9iaiktPm1fcEltYWdlLT5HZXREaWN0KCktPktleUV4aXN0KCJTTWFzayIpKSB7CisgICAgICBwU01hc2tEaWN0ID0gTlVMTDsKICAgICB9Ci0gICAgcmV0dXJuIHBEb2NDYWNoZS0+R2V0VHJhbnNmZXJGdW5jKHBPYmopOwotfQotRlhfQVJHQiBDUERGX1JlbmRlclN0YXR1czo6R2V0RmlsbEFyZ2IoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBGWF9CT09MIGJUeXBlMykgY29uc3QKLXsKLSAgICBDUERGX0NvbG9yU3RhdGVEYXRhKiBwQ29sb3JEYXRhID0gKENQREZfQ29sb3JTdGF0ZURhdGEqKShjb25zdCBDUERGX0NvbG9yU3RhdGVEYXRhKilwT2JqLT5tX0NvbG9yU3RhdGU7Ci0gICAgaWYgKG1fcFR5cGUzQ2hhciAmJiAhYlR5cGUzICYmICghbV9wVHlwZTNDaGFyLT5tX2JDb2xvcmVkIHx8IChtX3BUeXBlM0NoYXItPm1fYkNvbG9yZWQgJiYgKCFwQ29sb3JEYXRhIHx8IHBDb2xvckRhdGEtPm1fRmlsbENvbG9yLklzTnVsbCgpKSkpKSB7Ci0gICAgICAgIHJldHVybiBtX1QzRmlsbENvbG9yOwotICAgIH0gZWxzZSBpZiAoIXBDb2xvckRhdGEgfHwgcENvbG9yRGF0YS0+bV9GaWxsQ29sb3IuSXNOdWxsKCkpIHsKLSAgICAgICAgcENvbG9yRGF0YSA9IChDUERGX0NvbG9yU3RhdGVEYXRhKikoY29uc3QgQ1BERl9Db2xvclN0YXRlRGF0YSopbV9Jbml0aWFsU3RhdGVzLm1fQ29sb3JTdGF0ZTsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2UgPSBOVUxMOworICBGWF9GTE9BVCBncm91cF9hbHBoYSA9IDEuMGY7CisgIGludCBUcmFuc3BhcmVuY3kgPSBtX1RyYW5zcGFyZW5jeTsKKyAgRlhfQk9PTCBiR3JvdXBUcmFuc3BhcmVudCA9IEZBTFNFOworICBpZiAocFBhZ2VPYmotPm1fVHlwZSA9PSBQREZQQUdFX0ZPUk0pIHsKKyAgICBDUERGX0Zvcm1PYmplY3QqIHBGb3JtT2JqID0gKENQREZfRm9ybU9iamVjdCopcFBhZ2VPYmo7CisgICAgY29uc3QgQ1BERl9HZW5lcmFsU3RhdGVEYXRhKiBwU3RhdGVEYXRhID0KKyAgICAgICAgcEZvcm1PYmotPm1fR2VuZXJhbFN0YXRlLkdldE9iamVjdCgpOworICAgIGlmIChwU3RhdGVEYXRhKSB7CisgICAgICBncm91cF9hbHBoYSA9IHBTdGF0ZURhdGEtPm1fRmlsbEFscGhhOwogICAgIH0KLSAgICBGWF9DT0xPUlJFRiByZ2IgPSBwQ29sb3JEYXRhLT5tX0ZpbGxSR0I7Ci0gICAgaWYgKHJnYiA9PSAoRlhfRFdPUkQpIC0gMSkgewotICAgICAgICByZXR1cm4gMDsKKyAgICBUcmFuc3BhcmVuY3kgPSBwRm9ybU9iai0+bV9wRm9ybS0+bV9UcmFuc3BhcmVuY3k7CisgICAgYkdyb3VwVHJhbnNwYXJlbnQgPSAhIShUcmFuc3BhcmVuY3kgJiBQREZUUkFOU19JU09MQVRFRCk7CisgICAgaWYgKHBGb3JtT2JqLT5tX3BGb3JtLT5tX3BGb3JtRGljdCkgeworICAgICAgcEZvcm1SZXNvdXJjZSA9IHBGb3JtT2JqLT5tX3BGb3JtLT5tX3BGb3JtRGljdC0+R2V0RGljdCgiUmVzb3VyY2VzIik7CiAgICAgfQotICAgIGNvbnN0IENQREZfR2VuZXJhbFN0YXRlRGF0YSogcEdlbmVyYWxEYXRhID0gcE9iai0+bV9HZW5lcmFsU3RhdGU7Ci0gICAgaW50IGFscGhhOwotICAgIGlmIChwR2VuZXJhbERhdGEpIHsKLSAgICAgICAgYWxwaGEgPSAoRlhfSU5UMzIpKHBHZW5lcmFsRGF0YS0+bV9GaWxsQWxwaGEgKiAyNTUpOwotICAgICAgICBpZiAocEdlbmVyYWxEYXRhLT5tX3BUUikgewotICAgICAgICAgICAgaWYgKCFwR2VuZXJhbERhdGEtPm1fcFRyYW5zZmVyRnVuYykgewotICAgICAgICAgICAgICAgICgoQ1BERl9HZW5lcmFsU3RhdGVEYXRhKilwR2VuZXJhbERhdGEpLT5tX3BUcmFuc2ZlckZ1bmMgPSBHZXRUcmFuc2ZlckZ1bmMocEdlbmVyYWxEYXRhLT5tX3BUUik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocEdlbmVyYWxEYXRhLT5tX3BUcmFuc2ZlckZ1bmMpIHsKLSAgICAgICAgICAgICAgICByZ2IgPSBwR2VuZXJhbERhdGEtPm1fcFRyYW5zZmVyRnVuYy0+VHJhbnNsYXRlQ29sb3IocmdiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICB9CisgIEZYX0JPT0wgYlRleHRDbGlwID0gRkFMU0U7CisgIGlmIChwUGFnZU9iai0+bV9DbGlwUGF0aC5Ob3ROdWxsKCkgJiYgcFBhZ2VPYmotPm1fQ2xpcFBhdGguR2V0VGV4dENvdW50KCkgJiYKKyAgICAgIG1fcERldmljZS0+R2V0RGV2aWNlQ2xhc3MoKSA9PSBGWERDX0RJU1BMQVkgJiYKKyAgICAgICEobV9wRGV2aWNlLT5HZXREZXZpY2VDYXBzKEZYRENfUkVOREVSX0NBUFMpICYgRlhSQ19TT0ZUX0NMSVApKSB7CisgICAgYlRleHRDbGlwID0gVFJVRTsKKyAgfQorICBpZiAoKG1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX09WRVJQUklOVCkgJiYKKyAgICAgIHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9JTUFHRSAmJiBwR2VuZXJhbFN0YXRlICYmCisgICAgICBwR2VuZXJhbFN0YXRlLT5tX0ZpbGxPUCAmJiBwR2VuZXJhbFN0YXRlLT5tX1N0cm9rZU9QKSB7CisgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gTlVMTDsKKyAgICBDUERGX1BhZ2UqIHBQYWdlID0gTlVMTDsKKyAgICBpZiAobV9wQ29udGV4dC0+bV9wUGFnZUNhY2hlKSB7CisgICAgICBwUGFnZSA9IG1fcENvbnRleHQtPm1fcFBhZ2VDYWNoZS0+R2V0UGFnZSgpOworICAgICAgcERvY3VtZW50ID0gcFBhZ2UtPm1fcERvY3VtZW50OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGFscGhhID0gMjU1OworICAgICAgcERvY3VtZW50ID0gKChDUERGX0ltYWdlT2JqZWN0KilwUGFnZU9iaiktPm1fcEltYWdlLT5HZXREb2N1bWVudCgpOwogICAgIH0KLSAgICByZXR1cm4gbV9PcHRpb25zLlRyYW5zbGF0ZUNvbG9yKEFyZ2JFbmNvZGUoYWxwaGEsIHJnYikpOwotfQotRlhfQVJHQiBDUERGX1JlbmRlclN0YXR1czo6R2V0U3Ryb2tlQXJnYihjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmopIGNvbnN0Ci17Ci0gICAgQ1BERl9Db2xvclN0YXRlRGF0YSogcENvbG9yRGF0YSA9IChDUERGX0NvbG9yU3RhdGVEYXRhKikoY29uc3QgQ1BERl9Db2xvclN0YXRlRGF0YSopcE9iai0+bV9Db2xvclN0YXRlOwotICAgIGlmIChtX3BUeXBlM0NoYXIgJiYgKCFtX3BUeXBlM0NoYXItPm1fYkNvbG9yZWQgfHwgKG1fcFR5cGUzQ2hhci0+bV9iQ29sb3JlZCAmJiAoIXBDb2xvckRhdGEgfHwgcENvbG9yRGF0YS0+bV9TdHJva2VDb2xvci5Jc051bGwoKSkpKSkgewotICAgICAgICByZXR1cm4gbV9UM0ZpbGxDb2xvcjsKLSAgICB9IGVsc2UgaWYgKCFwQ29sb3JEYXRhIHx8IHBDb2xvckRhdGEtPm1fU3Ryb2tlQ29sb3IuSXNOdWxsKCkpIHsKLSAgICAgICAgcENvbG9yRGF0YSA9IChDUERGX0NvbG9yU3RhdGVEYXRhKikoY29uc3QgQ1BERl9Db2xvclN0YXRlRGF0YSopbV9Jbml0aWFsU3RhdGVzLm1fQ29sb3JTdGF0ZTsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzID0gcFBhZ2UgPyBwUGFnZS0+bV9wUGFnZVJlc291cmNlcyA6IE5VTEw7CisgICAgQ1BERl9PYmplY3QqIHBDU09iaiA9ICgoQ1BERl9JbWFnZU9iamVjdCopcFBhZ2VPYmopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPm1fcEltYWdlLT5HZXRTdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5HZXREaWN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0RWxlbWVudFZhbHVlKCJDb2xvclNwYWNlIik7CisgICAgQ1BERl9Db2xvclNwYWNlKiBwQ29sb3JTcGFjZSA9CisgICAgICAgIHBEb2N1bWVudC0+TG9hZENvbG9yU3BhY2UocENTT2JqLCBwUGFnZVJlc291cmNlcyk7CisgICAgaWYgKHBDb2xvclNwYWNlKSB7CisgICAgICBpbnQgZm9ybWF0ID0gcENvbG9yU3BhY2UtPkdldEZhbWlseSgpOworICAgICAgaWYgKGZvcm1hdCA9PSBQREZDU19ERVZJQ0VDTVlLIHx8IGZvcm1hdCA9PSBQREZDU19TRVBBUkFUSU9OIHx8CisgICAgICAgICAgZm9ybWF0ID09IFBERkNTX0RFVklDRU4pIHsKKyAgICAgICAgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX0RBUktFTjsKKyAgICAgIH0KKyAgICAgIHBEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+UmVsZWFzZUNvbG9yU3BhY2UocENTT2JqKTsKICAgICB9Ci0gICAgRlhfQ09MT1JSRUYgcmdiID0gcENvbG9yRGF0YS0+bV9TdHJva2VSR0I7Ci0gICAgaWYgKHJnYiA9PSAoRlhfRFdPUkQpIC0gMSkgewotICAgICAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIXBTTWFza0RpY3QgJiYgZ3JvdXBfYWxwaGEgPT0gMS4wZiAmJiBibGVuZF90eXBlID09IEZYRElCX0JMRU5EX05PUk1BTCAmJgorICAgICAgIWJUZXh0Q2xpcCAmJiAhYkdyb3VwVHJhbnNwYXJlbnQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhfQk9PTCBpc29sYXRlZCA9IFRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0lTT0xBVEVEOworICBpZiAobV9iUHJpbnQpIHsKKyAgICBGWF9CT09MIGJSZXQgPSBGQUxTRTsKKyAgICBpbnQgcmVuZENhcHMgPSBtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKTsKKyAgICBpZiAoISgoVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQpIHx8IHBTTWFza0RpY3QgfHwgYlRleHRDbGlwKSAmJgorICAgICAgICAocmVuZENhcHMgJiBGWFJDX0JMRU5EX01PREUpKSB7CisgICAgICBpbnQgb2xkQmxlbmQgPSBtX2N1ckJsZW5kOworICAgICAgbV9jdXJCbGVuZCA9IGJsZW5kX3R5cGU7CisgICAgICBiUmV0ID0gRHJhd09ialdpdGhCbGVuZChwUGFnZU9iaiwgcE9iajJEZXZpY2UpOworICAgICAgbV9jdXJCbGVuZCA9IG9sZEJsZW5kOwogICAgIH0KLSAgICBjb25zdCBDUERGX0dlbmVyYWxTdGF0ZURhdGEqIHBHZW5lcmFsRGF0YSA9IHBPYmotPm1fR2VuZXJhbFN0YXRlOwotICAgIGludCBhbHBoYTsKLSAgICBpZiAocEdlbmVyYWxEYXRhKSB7Ci0gICAgICAgIGFscGhhID0gKEZYX0lOVDMyKShwR2VuZXJhbERhdGEtPm1fU3Ryb2tlQWxwaGEgKiAyNTUpOwotICAgICAgICBpZiAocEdlbmVyYWxEYXRhLT5tX3BUUikgewotICAgICAgICAgICAgaWYgKCFwR2VuZXJhbERhdGEtPm1fcFRyYW5zZmVyRnVuYykgewotICAgICAgICAgICAgICAgICgoQ1BERl9HZW5lcmFsU3RhdGVEYXRhKilwR2VuZXJhbERhdGEpLT5tX3BUcmFuc2ZlckZ1bmMgPSBHZXRUcmFuc2ZlckZ1bmMocEdlbmVyYWxEYXRhLT5tX3BUUik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocEdlbmVyYWxEYXRhLT5tX3BUcmFuc2ZlckZ1bmMpIHsKLSAgICAgICAgICAgICAgICByZ2IgPSBwR2VuZXJhbERhdGEtPm1fcFRyYW5zZmVyRnVuYy0+VHJhbnNsYXRlQ29sb3IocmdiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGFscGhhID0gMjU1OwotICAgIH0KLSAgICByZXR1cm4gbV9PcHRpb25zLlRyYW5zbGF0ZUNvbG9yKEFyZ2JFbmNvZGUoYWxwaGEsIHJnYikpOwotfQotdm9pZCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc0NsaXBQYXRoKENQREZfQ2xpcFBhdGggQ2xpcFBhdGgsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQotewotICAgIGlmIChDbGlwUGF0aC5Jc051bGwoKSkgewotICAgICAgICBpZiAobV9MYXN0Q2xpcFBhdGguSXNOdWxsKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZShUUlVFKTsKLSAgICAgICAgbV9MYXN0Q2xpcFBhdGguU2V0TnVsbCgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtX0xhc3RDbGlwUGF0aCA9PSBDbGlwUGF0aCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fTGFzdENsaXBQYXRoID0gQ2xpcFBhdGg7Ci0gICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoVFJVRSk7Ci0gICAgaW50IG5DbGlwUGF0aCA9IENsaXBQYXRoLkdldFBhdGhDb3VudCgpOwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBuQ2xpcFBhdGg7IGkrKykgewotICAgICAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSA9IENsaXBQYXRoLkdldFBhdGgoaSk7Ci0gICAgICAgIGlmIChwUGF0aERhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID09IDApIHsKLSAgICAgICAgICAgIENGWF9QYXRoRGF0YSBFbXB0eVBhdGg7Ci0gICAgICAgICAgICBFbXB0eVBhdGguQXBwZW5kUmVjdCgtMSwgLTEsIDAsIDApOwotICAgICAgICAgICAgaW50IGZpbGxfbW9kZSA9IEZYRklMTF9XSU5ESU5HOwotICAgICAgICAgICAgbV9wRGV2aWNlLT5TZXRDbGlwX1BhdGhGaWxsKCZFbXB0eVBhdGgsIE5VTEwsIGZpbGxfbW9kZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgQ2xpcFR5cGUgPSBDbGlwUGF0aC5HZXRDbGlwVHlwZShpKTsKLSAgICAgICAgICAgIG1fcERldmljZS0+U2V0Q2xpcF9QYXRoRmlsbChwUGF0aERhdGEsIHBPYmoyRGV2aWNlLCBDbGlwVHlwZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaW50IHRleHRjb3VudCA9IENsaXBQYXRoLkdldFRleHRDb3VudCgpOwotICAgIGlmICh0ZXh0Y291bnQgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtX3BEZXZpY2UtPkdldERldmljZUNsYXNzKCkgPT0gRlhEQ19ESVNQTEFZICYmICEobV9wRGV2aWNlLT5HZXREZXZpY2VDYXBzKEZYRENfUkVOREVSX0NBUFMpICYgRlhSQ19TT0ZUX0NMSVApKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ0ZYX1BhdGhEYXRhKiBwVGV4dENsaXBwaW5nUGF0aCA9IE5VTEw7Ci0gICAgZm9yIChpID0gMDsgaSA8IHRleHRjb3VudDsgaSArKykgewotICAgICAgICBDUERGX1RleHRPYmplY3QqIHBUZXh0ID0gQ2xpcFBhdGguR2V0VGV4dChpKTsKLSAgICAgICAgaWYgKHBUZXh0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChwVGV4dENsaXBwaW5nUGF0aCkgewotICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUgPSBGWEZJTExfV0lORElORzsKLSAgICAgICAgICAgICAgICBpZiAobV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfTk9URVhUU01PT1RIKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGxfbW9kZSB8PSBGWEZJTExfTk9QQVRIU01PT1RIOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX3BEZXZpY2UtPlNldENsaXBfUGF0aEZpbGwocFRleHRDbGlwcGluZ1BhdGgsIE5VTEwsIGZpbGxfbW9kZSk7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIHBUZXh0Q2xpcHBpbmdQYXRoOwotICAgICAgICAgICAgICAgIHBUZXh0Q2xpcHBpbmdQYXRoID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChwVGV4dENsaXBwaW5nUGF0aCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcFRleHRDbGlwcGluZ1BhdGggPSBuZXcgQ0ZYX1BhdGhEYXRhOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUHJvY2Vzc1RleHQocFRleHQsIHBPYmoyRGV2aWNlLCBwVGV4dENsaXBwaW5nUGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBUZXh0Q2xpcHBpbmdQYXRoKSB7Ci0gICAgICAgIGRlbGV0ZSBwVGV4dENsaXBwaW5nUGF0aDsKLSAgICB9Ci19Ci12b2lkIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3Q2xpcFBhdGgoQ1BERl9DbGlwUGF0aCBDbGlwUGF0aCwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpCi17Ci0gICAgaWYgKENsaXBQYXRoLklzTnVsbCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IGZpbGxfbW9kZSA9IDA7Ci0gICAgaWYgKG1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX05PUEFUSFNNT09USCkgewotICAgICAgICBmaWxsX21vZGUgfD0gRlhGSUxMX05PUEFUSFNNT09USDsKLSAgICB9Ci0gICAgaW50IG5DbGlwUGF0aCA9IENsaXBQYXRoLkdldFBhdGhDb3VudCgpOwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBuQ2xpcFBhdGg7IGkrKykgewotICAgICAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSA9IENsaXBQYXRoLkdldFBhdGgoaSk7Ci0gICAgICAgIGlmIChwUGF0aERhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIHN0cm9rZV9zdGF0ZTsKLSAgICAgICAgaWYgKG1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX1RISU5MSU5FKSB7Ci0gICAgICAgICAgICBzdHJva2Vfc3RhdGUubV9MaW5lV2lkdGggPSAwOwotICAgICAgICB9Ci0gICAgICAgIG1fcERldmljZS0+RHJhd1BhdGgocFBhdGhEYXRhLCBwT2JqMkRldmljZSwgJnN0cm9rZV9zdGF0ZSwgMCwgMHhmZmZmMDAwMCwgZmlsbF9tb2RlKTsKLSAgICB9Ci19Ci1GWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpTZWxlY3RDbGlwUGF0aChDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgRlhfQk9PTCBiU3Ryb2tlKQotewotICAgIENGWF9BZmZpbmVNYXRyaXggcGF0aF9tYXRyaXggPSBwUGF0aE9iai0+bV9NYXRyaXg7Ci0gICAgcGF0aF9tYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7Ci0gICAgaWYgKGJTdHJva2UpIHsKLSAgICAgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdyYXBoU3RhdGUoKnBQYXRoT2JqLT5tX0dyYXBoU3RhdGUpOwotICAgICAgICBpZiAobV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfVEhJTkxJTkUpIHsKLSAgICAgICAgICAgIGdyYXBoU3RhdGUubV9MaW5lV2lkdGggPSAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtX3BEZXZpY2UtPlNldENsaXBfUGF0aFN0cm9rZShwUGF0aE9iai0+bV9QYXRoLCAmcGF0aF9tYXRyaXgsICZncmFwaFN0YXRlKTsKLSAgICB9Ci0gICAgaW50IGZpbGxfbW9kZSA9IHBQYXRoT2JqLT5tX0ZpbGxUeXBlOwotICAgIGlmIChtX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9OT1BBVEhTTU9PVEgpIHsKLSAgICAgICAgZmlsbF9tb2RlIHw9IEZYRklMTF9OT1BBVEhTTU9PVEg7Ci0gICAgfQotICAgIHJldHVybiBtX3BEZXZpY2UtPlNldENsaXBfUGF0aEZpbGwocFBhdGhPYmotPm1fUGF0aCwgJnBhdGhfbWF0cml4LCBmaWxsX21vZGUpOwotfQotRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc1RyYW5zcGFyZW5jeShjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKLXsKLSAgICBjb25zdCBDUERGX0dlbmVyYWxTdGF0ZURhdGEqIHBHZW5lcmFsU3RhdGUgPSBwUGFnZU9iai0+bV9HZW5lcmFsU3RhdGU7Ci0gICAgaW50IGJsZW5kX3R5cGUgPSBwR2VuZXJhbFN0YXRlID8gcEdlbmVyYWxTdGF0ZS0+bV9CbGVuZFR5cGUgOiBGWERJQl9CTEVORF9OT1JNQUw7Ci0gICAgaWYgKGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfVU5TVVBQT1JURUQpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcFNNYXNrRGljdCA9IHBHZW5lcmFsU3RhdGUgPyAoQ1BERl9EaWN0aW9uYXJ5KilwR2VuZXJhbFN0YXRlLT5tX3BTb2Z0TWFzayA6IE5VTEw7Ci0gICAgaWYgKHBTTWFza0RpY3QpIHsKLSAgICAgICAgaWYgKHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9JTUFHRSAmJgotICAgICAgICAgICAgICAgICgoQ1BERl9JbWFnZU9iamVjdCopcFBhZ2VPYmopLT5tX3BJbWFnZS0+R2V0RGljdCgpLT5LZXlFeGlzdChGWF9CU1RSQygiU01hc2siKSkpIHsKLSAgICAgICAgICAgIHBTTWFza0RpY3QgPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSA9IE5VTEw7Ci0gICAgRlhfRkxPQVQgZ3JvdXBfYWxwaGEgPSAxLjBmOwotICAgIGludCBUcmFuc3BhcmVuY3kgPSBtX1RyYW5zcGFyZW5jeTsKLSAgICBGWF9CT09MIGJHcm91cFRyYW5zcGFyZW50ID0gRkFMU0U7Ci0gICAgaWYgKHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9GT1JNKSB7Ci0gICAgICAgIENQREZfRm9ybU9iamVjdCogcEZvcm1PYmogPSAoQ1BERl9Gb3JtT2JqZWN0KilwUGFnZU9iajsKLSAgICAgICAgY29uc3QgQ1BERl9HZW5lcmFsU3RhdGVEYXRhICpwU3RhdGVEYXRhID0gcEZvcm1PYmotPm1fR2VuZXJhbFN0YXRlLkdldE9iamVjdCgpOwotICAgICAgICBpZiAocFN0YXRlRGF0YSkgewotICAgICAgICAgICAgZ3JvdXBfYWxwaGEgPSBwU3RhdGVEYXRhLT5tX0ZpbGxBbHBoYTsKLSAgICAgICAgfQotICAgICAgICBUcmFuc3BhcmVuY3kgPSBwRm9ybU9iai0+bV9wRm9ybS0+bV9UcmFuc3BhcmVuY3k7Ci0gICAgICAgIGJHcm91cFRyYW5zcGFyZW50ID0gVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQgPyBUUlVFIDogRkFMU0U7Ci0gICAgICAgIGlmIChwRm9ybU9iai0+bV9wRm9ybS0+bV9wRm9ybURpY3QpIHsKLSAgICAgICAgICAgIHBGb3JtUmVzb3VyY2UgPSBwRm9ybU9iai0+bV9wRm9ybS0+bV9wRm9ybURpY3QtPkdldERpY3QoIlJlc291cmNlcyIpOwotICAgICAgICB9Ci0gICAgfQotICAgIEZYX0JPT0wgYlRleHRDbGlwID0gRkFMU0U7Ci0gICAgaWYgKHBQYWdlT2JqLT5tX0NsaXBQYXRoLk5vdE51bGwoKSAmJiBwUGFnZU9iai0+bV9DbGlwUGF0aC5HZXRUZXh0Q291bnQoKSAmJgotICAgICAgICAgICAgbV9wRGV2aWNlLT5HZXREZXZpY2VDbGFzcygpID09IEZYRENfRElTUExBWSAmJiAhKG1fcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX1JFTkRFUl9DQVBTKSAmIEZYUkNfU09GVF9DTElQKSkgewotICAgICAgICBiVGV4dENsaXAgPSBUUlVFOwotICAgIH0KLSAgICBpZiAoKG1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX09WRVJQUklOVCkgJiYgcFBhZ2VPYmotPm1fVHlwZSA9PSBQREZQQUdFX0lNQUdFICYmIHBHZW5lcmFsU3RhdGUgJiYgcEdlbmVyYWxTdGF0ZS0+bV9GaWxsT1AgJiYgcEdlbmVyYWxTdGF0ZS0+bV9TdHJva2VPUCkgewotICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBOVUxMOwotICAgICAgICBDUERGX1BhZ2UqIHBQYWdlID0gTlVMTDsKLSAgICAgICAgaWYgKG1fcENvbnRleHQtPm1fcFBhZ2VDYWNoZSkgewotICAgICAgICAgICAgcFBhZ2UgPSBtX3BDb250ZXh0LT5tX3BQYWdlQ2FjaGUtPkdldFBhZ2UoKTsKLSAgICAgICAgICAgIHBEb2N1bWVudCA9IHBQYWdlLT5tX3BEb2N1bWVudDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBEb2N1bWVudCA9ICgoQ1BERl9JbWFnZU9iamVjdCopcFBhZ2VPYmopLT5tX3BJbWFnZS0+R2V0RG9jdW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzID0gcFBhZ2UgPyBwUGFnZS0+bV9wUGFnZVJlc291cmNlcyA6IE5VTEw7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwQ1NPYmogPSAoKENQREZfSW1hZ2VPYmplY3QqKXBQYWdlT2JqKS0+bV9wSW1hZ2UtPkdldFN0cmVhbSgpLT5HZXREaWN0KCktPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiQ29sb3JTcGFjZSIpKTsKLSAgICAgICAgQ1BERl9Db2xvclNwYWNlKiBwQ29sb3JTcGFjZSA9IHBEb2N1bWVudC0+TG9hZENvbG9yU3BhY2UocENTT2JqLCBwUGFnZVJlc291cmNlcyk7Ci0gICAgICAgIGlmIChwQ29sb3JTcGFjZSkgewotICAgICAgICAgICAgaW50IGZvcm1hdCA9IHBDb2xvclNwYWNlLT5HZXRGYW1pbHkoKTsKLSAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gUERGQ1NfREVWSUNFQ01ZSyB8fCBmb3JtYXQgPT0gUERGQ1NfU0VQQVJBVElPTiB8fCBmb3JtYXQgPT0gUERGQ1NfREVWSUNFTikgewotICAgICAgICAgICAgICAgIGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9EQVJLRU47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VDb2xvclNwYWNlKHBDU09iaik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBTTWFza0RpY3QgPT0gTlVMTCAmJiBncm91cF9hbHBoYSA9PSAxLjBmICYmIGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTk9STUFMICYmICFiVGV4dENsaXAgJiYgIWJHcm91cFRyYW5zcGFyZW50KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfQk9PTCBpc29sYXRlZCA9IFRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0lTT0xBVEVEOwotICAgIGlmIChtX2JQcmludCkgewotICAgICAgICBGWF9CT09MIGJSZXQgPSBGQUxTRTsKLSAgICAgICAgaW50IHJlbmRDYXBzID0gbV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCk7Ci0gICAgICAgIGlmICghKChUcmFuc3BhcmVuY3kgJiBQREZUUkFOU19JU09MQVRFRCkgfHwgcFNNYXNrRGljdCB8fCBiVGV4dENsaXApICYmIChyZW5kQ2FwcyAmIEZYUkNfQkxFTkRfTU9ERSkpIHsKLSAgICAgICAgICAgIGludCBvbGRCbGVuZCA9IG1fY3VyQmxlbmQ7Ci0gICAgICAgICAgICBtX2N1ckJsZW5kID0gYmxlbmRfdHlwZTsKLSAgICAgICAgICAgIGJSZXQgPSBEcmF3T2JqV2l0aEJsZW5kKHBQYWdlT2JqLCBwT2JqMkRldmljZSk7Ci0gICAgICAgICAgICBtX2N1ckJsZW5kID0gb2xkQmxlbmQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFiUmV0KSB7Ci0gICAgICAgICAgICBEcmF3T2JqV2l0aEJhY2tncm91bmQocFBhZ2VPYmosIHBPYmoyRGV2aWNlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgRlhfUkVDVCByZWN0ID0gcFBhZ2VPYmotPkdldEJCb3gocE9iajJEZXZpY2UpOwotICAgIHJlY3QuSW50ZXJzZWN0KG1fcERldmljZS0+R2V0Q2xpcEJveCgpKTsKLSAgICBpZiAocmVjdC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIENGWF9NYXRyaXggZGV2aWNlQ1RNID0gbV9wRGV2aWNlLT5HZXRDVE0oKTsKLSAgICBGWF9GTE9BVCBzY2FsZVggPSBGWFNZU19mYWJzKGRldmljZUNUTS5hKTsKLSAgICBGWF9GTE9BVCBzY2FsZVkgPSBGWFNZU19mYWJzKGRldmljZUNUTS5kKTsKLSAgICBpbnQgd2lkdGggPSBGWFNZU19yb3VuZCgoRlhfRkxPQVQpcmVjdC5XaWR0aCgpICogc2NhbGVYKTsKLSAgICBpbnQgaGVpZ2h0ID0gRlhTWVNfcm91bmQoKEZYX0ZMT0FUKXJlY3QuSGVpZ2h0KCkgKiBzY2FsZVkpOwotICAgIENGWF9GeGdlRGV2aWNlIGJpdG1hcF9kZXZpY2U7Ci0gICAgQ0ZYX0RJQml0bWFwKiBvcmlEZXZpY2UgPSBOVUxMOwotICAgIGlmICghaXNvbGF0ZWQgJiYgKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19HRVRfQklUUykpIHsKLSAgICAgICAgb3JpRGV2aWNlID0gbmV3IENGWF9ESUJpdG1hcDsKLSAgICAgICAgaWYgKCFtX3BEZXZpY2UtPkNyZWF0ZUNvbXBhdGlibGVCaXRtYXAob3JpRGV2aWNlLCB3aWR0aCwgaGVpZ2h0KSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wRGV2aWNlLT5HZXRESUJpdHMob3JpRGV2aWNlLCByZWN0LmxlZnQsIHJlY3QudG9wKTsKLSAgICB9Ci0gICAgaWYgKCFiaXRtYXBfZGV2aWNlLkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9BcmdiLCAwLCBvcmlEZXZpY2UpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBDRlhfRElCaXRtYXAqIGJpdG1hcCA9IGJpdG1hcF9kZXZpY2UuR2V0Qml0bWFwKCk7Ci0gICAgYml0bWFwLT5DbGVhcigwKTsKLSAgICBDRlhfQWZmaW5lTWF0cml4IG5ld19tYXRyaXggPSAqcE9iajJEZXZpY2U7Ci0gICAgbmV3X21hdHJpeC5UcmFuc2xhdGVJKC1yZWN0LmxlZnQsIC1yZWN0LnRvcCk7Ci0gICAgbmV3X21hdHJpeC5TY2FsZShzY2FsZVgsIHNjYWxlWSk7Ci0gICAgQ0ZYX0RJQml0bWFwKiBwVGV4dE1hc2sgPSBOVUxMOwotICAgIGlmIChiVGV4dENsaXApIHsKLSAgICAgICAgcFRleHRNYXNrID0gbmV3IENGWF9ESUJpdG1hcDsKLSAgICAgICAgaWYgKCFwVGV4dE1hc2stPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl84YnBwTWFzaykpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwVGV4dE1hc2s7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBwVGV4dE1hc2stPkNsZWFyKDApOwotICAgICAgICBDRlhfRnhnZURldmljZSB0ZXh0X2RldmljZTsKLSAgICAgICAgdGV4dF9kZXZpY2UuQXR0YWNoKHBUZXh0TWFzayk7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwUGFnZU9iai0+bV9DbGlwUGF0aC5HZXRUZXh0Q291bnQoKTsgaSArKykgewotICAgICAgICAgICAgQ1BERl9UZXh0T2JqZWN0KiB0ZXh0b2JqID0gcFBhZ2VPYmotPm1fQ2xpcFBhdGguR2V0VGV4dChpKTsKLSAgICAgICAgICAgIGlmICh0ZXh0b2JqID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXggdGV4dF9tYXRyaXg7Ci0gICAgICAgICAgICB0ZXh0b2JqLT5HZXRUZXh0TWF0cml4KCZ0ZXh0X21hdHJpeCk7Ci0gICAgICAgICAgICBDUERGX1RleHRSZW5kZXJlcjo6RHJhd1RleHRQYXRoKCZ0ZXh0X2RldmljZSwgdGV4dG9iai0+bV9uQ2hhcnMsIHRleHRvYmotPm1fcENoYXJDb2RlcywgdGV4dG9iai0+bV9wQ2hhclBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dG9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udCgpLCB0ZXh0b2JqLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dF9tYXRyaXgsICZuZXdfbWF0cml4LCB0ZXh0b2JqLT5tX0dyYXBoU3RhdGUsIChGWF9BUkdCKSAtIDEsIDAsIE5VTEwpOwotICAgICAgICB9Ci0gICAgfQotICAgIENQREZfUmVuZGVyU3RhdHVzIGJpdG1hcF9yZW5kZXI7Ci0gICAgYml0bWFwX3JlbmRlci5Jbml0aWFsaXplKG1fcENvbnRleHQsICZiaXRtYXBfZGV2aWNlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BTdG9wT2JqLCBOVUxMLCBOVUxMLCAmbV9PcHRpb25zLCAwLCBtX2JEcm9wT2JqZWN0cywgcEZvcm1SZXNvdXJjZSwgVFJVRSk7Ci0gICAgYml0bWFwX3JlbmRlci5Qcm9jZXNzT2JqZWN0Tm9DbGlwKHBQYWdlT2JqLCAmbmV3X21hdHJpeCk7Ci0gICAgbV9iU3RvcHBlZCA9IGJpdG1hcF9yZW5kZXIubV9iU3RvcHBlZDsKLSAgICBpZiAocFNNYXNrRGljdCkgewotICAgICAgICBDRlhfQWZmaW5lTWF0cml4IHNtYXNrX21hdHJpeDsKLSAgICAgICAgRlhTWVNfbWVtY3B5MzIoJnNtYXNrX21hdHJpeCwgcEdlbmVyYWxTdGF0ZS0+bV9TTWFza01hdHJpeCwgc2l6ZW9mIHNtYXNrX21hdHJpeCk7Ci0gICAgICAgIHNtYXNrX21hdHJpeC5Db25jYXQoKnBPYmoyRGV2aWNlKTsKLSAgICAgICAgQ0ZYX0RJQlNvdXJjZSogcFNNYXNrU291cmNlID0gTG9hZFNNYXNrKHBTTWFza0RpY3QsICZyZWN0LCAmc21hc2tfbWF0cml4KTsKLSAgICAgICAgaWYgKHBTTWFza1NvdXJjZSkgewotICAgICAgICAgICAgYml0bWFwLT5NdWx0aXBseUFscGhhKHBTTWFza1NvdXJjZSk7Ci0gICAgICAgICAgICBkZWxldGUgcFNNYXNrU291cmNlOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwVGV4dE1hc2spIHsKLSAgICAgICAgYml0bWFwLT5NdWx0aXBseUFscGhhKHBUZXh0TWFzayk7Ci0gICAgICAgIGRlbGV0ZSBwVGV4dE1hc2s7Ci0gICAgICAgIHBUZXh0TWFzayA9IE5VTEw7Ci0gICAgfQotICAgIGlmIChUcmFuc3BhcmVuY3kgJiBQREZUUkFOU19HUk9VUCAmJiBncm91cF9hbHBoYSAhPSAxLjBmKSB7Ci0gICAgICAgIGJpdG1hcC0+TXVsdGlwbHlBbHBoYSgoRlhfSU5UMzIpKGdyb3VwX2FscGhhICogMjU1KSk7Ci0gICAgfQotICAgIFRyYW5zcGFyZW5jeSA9IG1fVHJhbnNwYXJlbmN5OwotICAgIGlmIChwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfRk9STSkgewotICAgICAgICBUcmFuc3BhcmVuY3kgfD0gUERGVFJBTlNfR1JPVVA7Ci0gICAgfQotICAgIENvbXBvc2l0ZURJQml0bWFwKGJpdG1hcCwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgMCwgMjU1LCBibGVuZF90eXBlLCBUcmFuc3BhcmVuY3kpOwotICAgIGlmIChvcmlEZXZpY2UpIHsKLSAgICAgICAgZGVsZXRlIG9yaURldmljZTsKKyAgICBpZiAoIWJSZXQpIHsKKyAgICAgIERyYXdPYmpXaXRoQmFja2dyb3VuZChwUGFnZU9iaiwgcE9iajJEZXZpY2UpOwogICAgIH0KICAgICByZXR1cm4gVFJVRTsKLX0KLUNGWF9ESUJpdG1hcCogQ1BERl9SZW5kZXJTdGF0dXM6OkdldEJhY2tkcm9wKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgRlhfUkVDVCYgcmVjdCwgaW50JiBsZWZ0LCBpbnQmIHRvcCwKLSAgICAgICAgRlhfQk9PTCBiQmFja0FscGhhUmVxdWlyZWQpCi17Ci0gICAgRlhfUkVDVCBiYm94ID0gcmVjdDsKLSAgICBiYm94LkludGVyc2VjdChtX3BEZXZpY2UtPkdldENsaXBCb3goKSk7Ci0gICAgbGVmdCA9IGJib3gubGVmdDsKLSAgICB0b3AgPSBiYm94LnRvcDsKLSAgICBDRlhfTWF0cml4IGRldmljZUNUTSA9IG1fcERldmljZS0+R2V0Q1RNKCk7Ci0gICAgRlhfRkxPQVQgc2NhbGVYID0gRlhTWVNfZmFicyhkZXZpY2VDVE0uYSk7Ci0gICAgRlhfRkxPQVQgc2NhbGVZID0gRlhTWVNfZmFicyhkZXZpY2VDVE0uZCk7Ci0gICAgaW50IHdpZHRoID0gRlhTWVNfcm91bmQoYmJveC5XaWR0aCgpICogc2NhbGVYKTsKLSAgICBpbnQgaGVpZ2h0ID0gRlhTWVNfcm91bmQoYmJveC5IZWlnaHQoKSAqIHNjYWxlWSk7Ci0gICAgQ0ZYX0RJQml0bWFwKiBwQmFja2Ryb3AgPSBuZXcgQ0ZYX0RJQml0bWFwOwotICAgIGlmIChiQmFja0FscGhhUmVxdWlyZWQgJiYgIW1fYkRyb3BPYmplY3RzKSB7Ci0gICAgICAgIHBCYWNrZHJvcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCX0FyZ2IpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcERldmljZS0+Q3JlYXRlQ29tcGF0aWJsZUJpdG1hcChwQmFja2Ryb3AsIHdpZHRoLCBoZWlnaHQpOwotICAgIH0KLSAgICBpZiAocEJhY2tkcm9wLT5HZXRCdWZmZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBwQmFja2Ryb3A7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBGWF9CT09MIGJOZWVkRHJhdzsKLSAgICBpZiAocEJhY2tkcm9wLT5IYXNBbHBoYSgpKSB7Ci0gICAgICAgIGJOZWVkRHJhdyA9ICEobV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0FMUEhBX09VVFBVVCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYk5lZWREcmF3ID0gIShtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfR0VUX0JJVFMpOwotICAgIH0KLSAgICBpZiAoIWJOZWVkRHJhdykgewotICAgICAgICBtX3BEZXZpY2UtPkdldERJQml0cyhwQmFja2Ryb3AsIGxlZnQsIHRvcCk7Ci0gICAgICAgIHJldHVybiBwQmFja2Ryb3A7Ci0gICAgfQotICAgIENGWF9BZmZpbmVNYXRyaXggRmluYWxNYXRyaXggPSBtX0RldmljZU1hdHJpeDsKLSAgICBGaW5hbE1hdHJpeC5UcmFuc2xhdGVJKC1sZWZ0LCAtdG9wKTsKLSAgICBGaW5hbE1hdHJpeC5TY2FsZShzY2FsZVgsIHNjYWxlWSk7Ci0gICAgcEJhY2tkcm9wLT5DbGVhcihwQmFja2Ryb3AtPkhhc0FscGhhKCkgPyAwIDogMHhmZmZmZmZmZik7Ci0gICAgQ0ZYX0Z4Z2VEZXZpY2UgZGV2aWNlOwotICAgIGRldmljZS5BdHRhY2gocEJhY2tkcm9wKTsKLSAgICBtX3BDb250ZXh0LT5SZW5kZXIoJmRldmljZSwgcE9iaiwgJm1fT3B0aW9ucywgJkZpbmFsTWF0cml4KTsKLSAgICByZXR1cm4gcEJhY2tkcm9wOwotfQotdm9pZCBDUERGX1JlbmRlckNvbnRleHQ6OkdldEJhY2tncm91bmQoQ0ZYX0RJQml0bWFwKiBwQnVmZmVyLCBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLCBDRlhfQWZmaW5lTWF0cml4KiBwRmluYWxNYXRyaXgpCi17Ci0gICAgQ0ZYX0Z4Z2VEZXZpY2UgZGV2aWNlOwotICAgIGRldmljZS5BdHRhY2gocEJ1ZmZlcik7CisgIH0KKyAgRlhfUkVDVCByZWN0ID0gcFBhZ2VPYmotPkdldEJCb3gocE9iajJEZXZpY2UpOworICByZWN0LkludGVyc2VjdChtX3BEZXZpY2UtPkdldENsaXBCb3goKSk7CisgIGlmIChyZWN0LklzRW1wdHkoKSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIENGWF9NYXRyaXggZGV2aWNlQ1RNID0gbV9wRGV2aWNlLT5HZXRDVE0oKTsKKyAgRlhfRkxPQVQgc2NhbGVYID0gRlhTWVNfZmFicyhkZXZpY2VDVE0uYSk7CisgIEZYX0ZMT0FUIHNjYWxlWSA9IEZYU1lTX2ZhYnMoZGV2aWNlQ1RNLmQpOworICBpbnQgd2lkdGggPSBGWFNZU19yb3VuZCgoRlhfRkxPQVQpcmVjdC5XaWR0aCgpICogc2NhbGVYKTsKKyAgaW50IGhlaWdodCA9IEZYU1lTX3JvdW5kKChGWF9GTE9BVClyZWN0LkhlaWdodCgpICogc2NhbGVZKTsKKyAgQ0ZYX0Z4Z2VEZXZpY2UgYml0bWFwX2RldmljZTsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWF9ESUJpdG1hcD4gb3JpRGV2aWNlOworICBpZiAoIWlzb2xhdGVkICYmIChtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfR0VUX0JJVFMpKSB7CisgICAgb3JpRGV2aWNlLnJlc2V0KG5ldyBDRlhfRElCaXRtYXApOworICAgIGlmICghbV9wRGV2aWNlLT5DcmVhdGVDb21wYXRpYmxlQml0bWFwKG9yaURldmljZS5nZXQoKSwgd2lkdGgsIGhlaWdodCkpCisgICAgICByZXR1cm4gVFJVRTsKIAotICAgIEZYX1JFQ1QgcmVjdCgwLCAwLCBkZXZpY2UuR2V0V2lkdGgoKSwgZGV2aWNlLkdldEhlaWdodCgpKTsKLSAgICBkZXZpY2UuRmlsbFJlY3QoJnJlY3QsIDB4ZmZmZmZmZmYpOwotICAgIFJlbmRlcigmZGV2aWNlLCBwT2JqLCBwT3B0aW9ucywgcEZpbmFsTWF0cml4KTsKLX0KLUNQREZfR3JhcGhpY1N0YXRlcyogQ1BERl9SZW5kZXJTdGF0dXM6OkNsb25lT2JqU3RhdGVzKGNvbnN0IENQREZfR3JhcGhpY1N0YXRlcyogcFNyY1N0YXRlcywgRlhfQk9PTCBiU3Ryb2tlKQotewotICAgIGlmICghcFNyY1N0YXRlcykgewotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtX3BEZXZpY2UtPkdldERJQml0cyhvcmlEZXZpY2UuZ2V0KCksIHJlY3QubGVmdCwgcmVjdC50b3ApOworICB9CisgIGlmICghYml0bWFwX2RldmljZS5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfQXJnYiwgMCwgb3JpRGV2aWNlLmdldCgpKSkKKyAgICByZXR1cm4gVFJVRTsKKworICBDRlhfRElCaXRtYXAqIGJpdG1hcCA9IGJpdG1hcF9kZXZpY2UuR2V0Qml0bWFwKCk7CisgIGJpdG1hcC0+Q2xlYXIoMCk7CisgIENGWF9NYXRyaXggbmV3X21hdHJpeCA9ICpwT2JqMkRldmljZTsKKyAgbmV3X21hdHJpeC5UcmFuc2xhdGVJKC1yZWN0LmxlZnQsIC1yZWN0LnRvcCk7CisgIG5ld19tYXRyaXguU2NhbGUoc2NhbGVYLCBzY2FsZVkpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBwVGV4dE1hc2s7CisgIGlmIChiVGV4dENsaXApIHsKKyAgICBwVGV4dE1hc2sucmVzZXQobmV3IENGWF9ESUJpdG1hcCk7CisgICAgaWYgKCFwVGV4dE1hc2stPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl84YnBwTWFzaykpCisgICAgICByZXR1cm4gVFJVRTsKKworICAgIHBUZXh0TWFzay0+Q2xlYXIoMCk7CisgICAgQ0ZYX0Z4Z2VEZXZpY2UgdGV4dF9kZXZpY2U7CisgICAgdGV4dF9kZXZpY2UuQXR0YWNoKHBUZXh0TWFzay5nZXQoKSk7CisgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBQYWdlT2JqLT5tX0NsaXBQYXRoLkdldFRleHRDb3VudCgpOyBpKyspIHsKKyAgICAgIENQREZfVGV4dE9iamVjdCogdGV4dG9iaiA9IHBQYWdlT2JqLT5tX0NsaXBQYXRoLkdldFRleHQoaSk7CisgICAgICBpZiAoIXRleHRvYmopIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBDRlhfTWF0cml4IHRleHRfbWF0cml4OworICAgICAgdGV4dG9iai0+R2V0VGV4dE1hdHJpeCgmdGV4dF9tYXRyaXgpOworICAgICAgQ1BERl9UZXh0UmVuZGVyZXI6OkRyYXdUZXh0UGF0aCgKKyAgICAgICAgICAmdGV4dF9kZXZpY2UsIHRleHRvYmotPm1fbkNoYXJzLCB0ZXh0b2JqLT5tX3BDaGFyQ29kZXMsCisgICAgICAgICAgdGV4dG9iai0+bV9wQ2hhclBvcywgdGV4dG9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udCgpLAorICAgICAgICAgIHRleHRvYmotPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCksICZ0ZXh0X21hdHJpeCwgJm5ld19tYXRyaXgsCisgICAgICAgICAgdGV4dG9iai0+bV9HcmFwaFN0YXRlLCAoRlhfQVJHQiktMSwgMCwgTlVMTCk7CiAgICAgfQotICAgIENQREZfR3JhcGhpY1N0YXRlcyogcFN0YXRlcyA9IG5ldyBDUERGX0dyYXBoaWNTdGF0ZXM7Ci0gICAgcFN0YXRlcy0+Q29weVN0YXRlcygqcFNyY1N0YXRlcyk7Ci0gICAgQ1BERl9Db2xvciogcE9iakNvbG9yID0gYlN0cm9rZSA/IHBTcmNTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5HZXRTdHJva2VDb2xvcigpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjU3RhdGVzLT5tX0NvbG9yU3RhdGUuR2V0RmlsbENvbG9yKCk7Ci0gICAgaWYgKCFwT2JqQ29sb3ItPklzTnVsbCgpKSB7Ci0gICAgICAgIENQREZfQ29sb3JTdGF0ZURhdGEqIHBDb2xvckRhdGEgPSBwU3RhdGVzLT5tX0NvbG9yU3RhdGUuR2V0TW9kaWZ5KCk7Ci0gICAgICAgIHBDb2xvckRhdGEtPm1fRmlsbFJHQiA9IGJTdHJva2UgPyBwU3JjU3RhdGVzLT5tX0NvbG9yU3RhdGUuR2V0T2JqZWN0KCktPm1fU3Ryb2tlUkdCIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY1N0YXRlcy0+bV9Db2xvclN0YXRlLkdldE9iamVjdCgpLT5tX0ZpbGxSR0I7Ci0gICAgICAgIHBDb2xvckRhdGEtPm1fU3Ryb2tlUkdCID0gcENvbG9yRGF0YS0+bV9GaWxsUkdCOwotICAgIH0KLSAgICByZXR1cm4gcFN0YXRlczsKKyAgfQorICBDUERGX1JlbmRlclN0YXR1cyBiaXRtYXBfcmVuZGVyOworICBiaXRtYXBfcmVuZGVyLkluaXRpYWxpemUobV9wQ29udGV4dCwgJmJpdG1hcF9kZXZpY2UsIE5VTEwsIG1fcFN0b3BPYmosIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmbV9PcHRpb25zLCAwLCBtX2JEcm9wT2JqZWN0cywgcEZvcm1SZXNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpOworICBiaXRtYXBfcmVuZGVyLlByb2Nlc3NPYmplY3ROb0NsaXAocFBhZ2VPYmosICZuZXdfbWF0cml4KTsKKyAgbV9iU3RvcHBlZCA9IGJpdG1hcF9yZW5kZXIubV9iU3RvcHBlZDsKKyAgaWYgKHBTTWFza0RpY3QpIHsKKyAgICBDRlhfTWF0cml4IHNtYXNrX21hdHJpeDsKKyAgICBGWFNZU19tZW1jcHkoJnNtYXNrX21hdHJpeCwgcEdlbmVyYWxTdGF0ZS0+bV9TTWFza01hdHJpeCwKKyAgICAgICAgICAgICAgICAgc2l6ZW9mIHNtYXNrX21hdHJpeCk7CisgICAgc21hc2tfbWF0cml4LkNvbmNhdCgqcE9iajJEZXZpY2UpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCU291cmNlPiBwU01hc2tTb3VyY2UoCisgICAgICAgIExvYWRTTWFzayhwU01hc2tEaWN0LCAmcmVjdCwgJnNtYXNrX21hdHJpeCkpOworICAgIGlmIChwU01hc2tTb3VyY2UpCisgICAgICBiaXRtYXAtPk11bHRpcGx5QWxwaGEocFNNYXNrU291cmNlLmdldCgpKTsKKyAgfQorICBpZiAocFRleHRNYXNrKSB7CisgICAgYml0bWFwLT5NdWx0aXBseUFscGhhKHBUZXh0TWFzay5nZXQoKSk7CisgICAgcFRleHRNYXNrLnJlc2V0KCk7CisgIH0KKyAgaWYgKFRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0dST1VQICYmIGdyb3VwX2FscGhhICE9IDEuMGYpIHsKKyAgICBiaXRtYXAtPk11bHRpcGx5QWxwaGEoKGludDMyX3QpKGdyb3VwX2FscGhhICogMjU1KSk7CisgIH0KKyAgVHJhbnNwYXJlbmN5ID0gbV9UcmFuc3BhcmVuY3k7CisgIGlmIChwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfRk9STSkgeworICAgIFRyYW5zcGFyZW5jeSB8PSBQREZUUkFOU19HUk9VUDsKKyAgfQorICBDb21wb3NpdGVESUJpdG1hcChiaXRtYXAsIHJlY3QubGVmdCwgcmVjdC50b3AsIDAsIDI1NSwgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgVHJhbnNwYXJlbmN5KTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1DUERGX1JlbmRlckNvbnRleHQ6OkNQREZfUmVuZGVyQ29udGV4dCgpCi17CisKK0NGWF9ESUJpdG1hcCogQ1BERl9SZW5kZXJTdGF0dXM6OkdldEJhY2tkcm9wKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkJhY2tBbHBoYVJlcXVpcmVkKSB7CisgIEZYX1JFQ1QgYmJveCA9IHJlY3Q7CisgIGJib3guSW50ZXJzZWN0KG1fcERldmljZS0+R2V0Q2xpcEJveCgpKTsKKyAgbGVmdCA9IGJib3gubGVmdDsKKyAgdG9wID0gYmJveC50b3A7CisgIENGWF9NYXRyaXggZGV2aWNlQ1RNID0gbV9wRGV2aWNlLT5HZXRDVE0oKTsKKyAgRlhfRkxPQVQgc2NhbGVYID0gRlhTWVNfZmFicyhkZXZpY2VDVE0uYSk7CisgIEZYX0ZMT0FUIHNjYWxlWSA9IEZYU1lTX2ZhYnMoZGV2aWNlQ1RNLmQpOworICBpbnQgd2lkdGggPSBGWFNZU19yb3VuZChiYm94LldpZHRoKCkgKiBzY2FsZVgpOworICBpbnQgaGVpZ2h0ID0gRlhTWVNfcm91bmQoYmJveC5IZWlnaHQoKSAqIHNjYWxlWSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IHBCYWNrZHJvcChuZXcgQ0ZYX0RJQml0bWFwKTsKKyAgaWYgKGJCYWNrQWxwaGFSZXF1aXJlZCAmJiAhbV9iRHJvcE9iamVjdHMpCisgICAgcEJhY2tkcm9wLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfQXJnYik7CisgIGVsc2UKKyAgICBtX3BEZXZpY2UtPkNyZWF0ZUNvbXBhdGlibGVCaXRtYXAocEJhY2tkcm9wLmdldCgpLCB3aWR0aCwgaGVpZ2h0KTsKKworICBpZiAoIXBCYWNrZHJvcC0+R2V0QnVmZmVyKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgRlhfQk9PTCBiTmVlZERyYXc7CisgIGlmIChwQmFja2Ryb3AtPkhhc0FscGhhKCkpCisgICAgYk5lZWREcmF3ID0gIShtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQUxQSEFfT1VUUFVUKTsKKyAgZWxzZQorICAgIGJOZWVkRHJhdyA9ICEobV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0dFVF9CSVRTKTsKKworICBpZiAoIWJOZWVkRHJhdykgeworICAgIG1fcERldmljZS0+R2V0RElCaXRzKHBCYWNrZHJvcC5nZXQoKSwgbGVmdCwgdG9wKTsKKyAgICByZXR1cm4gcEJhY2tkcm9wLnJlbGVhc2UoKTsKKyAgfQorCisgIENGWF9NYXRyaXggRmluYWxNYXRyaXggPSBtX0RldmljZU1hdHJpeDsKKyAgRmluYWxNYXRyaXguVHJhbnNsYXRlSSgtbGVmdCwgLXRvcCk7CisgIEZpbmFsTWF0cml4LlNjYWxlKHNjYWxlWCwgc2NhbGVZKTsKKyAgcEJhY2tkcm9wLT5DbGVhcihwQmFja2Ryb3AtPkhhc0FscGhhKCkgPyAwIDogMHhmZmZmZmZmZik7CisgIENGWF9GeGdlRGV2aWNlIGRldmljZTsKKyAgZGV2aWNlLkF0dGFjaChwQmFja2Ryb3AuZ2V0KCkpOworICBtX3BDb250ZXh0LT5SZW5kZXIoJmRldmljZSwgcE9iaiwgJm1fT3B0aW9ucywgJkZpbmFsTWF0cml4KTsKKyAgcmV0dXJuIHBCYWNrZHJvcC5yZWxlYXNlKCk7CiB9Ci12b2lkIENQREZfUmVuZGVyQ29udGV4dDo6Q3JlYXRlKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwUGFnZUNhY2hlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLCBGWF9CT09MIGJGaXJzdExheWVyKQotewotICAgIG1fcERvY3VtZW50ID0gcERvYzsKLSAgICBtX3BQYWdlUmVzb3VyY2VzID0gcFBhZ2VSZXNvdXJjZXM7Ci0gICAgbV9wUGFnZUNhY2hlID0gcFBhZ2VDYWNoZTsKLSAgICBtX2JGaXJzdExheWVyID0gYkZpcnN0TGF5ZXI7CisKK3ZvaWQgQ1BERl9SZW5kZXJDb250ZXh0OjpHZXRCYWNrZ3JvdW5kKENGWF9ESUJpdG1hcCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwRmluYWxNYXRyaXgpIHsKKyAgQ0ZYX0Z4Z2VEZXZpY2UgZGV2aWNlOworICBkZXZpY2UuQXR0YWNoKHBCdWZmZXIpOworCisgIEZYX1JFQ1QgcmVjdCgwLCAwLCBkZXZpY2UuR2V0V2lkdGgoKSwgZGV2aWNlLkdldEhlaWdodCgpKTsKKyAgZGV2aWNlLkZpbGxSZWN0KCZyZWN0LCAweGZmZmZmZmZmKTsKKyAgUmVuZGVyKCZkZXZpY2UsIHBPYmosIHBPcHRpb25zLCBwRmluYWxNYXRyaXgpOwogfQotdm9pZCBDUERGX1JlbmRlckNvbnRleHQ6OkNyZWF0ZShDUERGX1BhZ2UqIHBQYWdlLCBGWF9CT09MIGJGaXJzdExheWVyKQotewotICAgIG1fcERvY3VtZW50ID0gcFBhZ2UtPm1fcERvY3VtZW50OwotICAgIG1fcFBhZ2VSZXNvdXJjZXMgPSBwUGFnZS0+bV9wUGFnZVJlc291cmNlczsKLSAgICBtX3BQYWdlQ2FjaGUgPSBwUGFnZS0+R2V0UmVuZGVyQ2FjaGUoKTsKLSAgICBtX2JGaXJzdExheWVyID0gYkZpcnN0TGF5ZXI7CitDUERGX0dyYXBoaWNTdGF0ZXMqIENQREZfUmVuZGVyU3RhdHVzOjpDbG9uZU9ialN0YXRlcygKKyAgICBjb25zdCBDUERGX0dyYXBoaWNTdGF0ZXMqIHBTcmNTdGF0ZXMsCisgICAgRlhfQk9PTCBiU3Ryb2tlKSB7CisgIGlmICghcFNyY1N0YXRlcykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfR3JhcGhpY1N0YXRlcyogcFN0YXRlcyA9IG5ldyBDUERGX0dyYXBoaWNTdGF0ZXM7CisgIHBTdGF0ZXMtPkNvcHlTdGF0ZXMoKnBTcmNTdGF0ZXMpOworICBDUERGX0NvbG9yKiBwT2JqQ29sb3IgPSBiU3Ryb2tlID8gcFNyY1N0YXRlcy0+bV9Db2xvclN0YXRlLkdldFN0cm9rZUNvbG9yKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBTcmNTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5HZXRGaWxsQ29sb3IoKTsKKyAgaWYgKCFwT2JqQ29sb3ItPklzTnVsbCgpKSB7CisgICAgQ1BERl9Db2xvclN0YXRlRGF0YSogcENvbG9yRGF0YSA9IHBTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5HZXRNb2RpZnkoKTsKKyAgICBwQ29sb3JEYXRhLT5tX0ZpbGxSR0IgPQorICAgICAgICBiU3Ryb2tlID8gcFNyY1N0YXRlcy0+bV9Db2xvclN0YXRlLkdldE9iamVjdCgpLT5tX1N0cm9rZVJHQgorICAgICAgICAgICAgICAgIDogcFNyY1N0YXRlcy0+bV9Db2xvclN0YXRlLkdldE9iamVjdCgpLT5tX0ZpbGxSR0I7CisgICAgcENvbG9yRGF0YS0+bV9TdHJva2VSR0IgPSBwQ29sb3JEYXRhLT5tX0ZpbGxSR0I7CisgIH0KKyAgcmV0dXJuIHBTdGF0ZXM7CiB9Ci1DUERGX1JlbmRlckNvbnRleHQ6On5DUERGX1JlbmRlckNvbnRleHQoKQoteworQ1BERl9SZW5kZXJDb250ZXh0OjpDUERGX1JlbmRlckNvbnRleHQoQ1BERl9QYWdlKiBwUGFnZSkKKyAgICA6IG1fcERvY3VtZW50KHBQYWdlLT5tX3BEb2N1bWVudCksCisgICAgICBtX3BQYWdlUmVzb3VyY2VzKHBQYWdlLT5tX3BQYWdlUmVzb3VyY2VzKSwKKyAgICAgIG1fcFBhZ2VDYWNoZShwUGFnZS0+R2V0UmVuZGVyQ2FjaGUoKSksCisgICAgICBtX2JGaXJzdExheWVyKFRSVUUpIHt9CitDUERGX1JlbmRlckNvbnRleHQ6OkNQREZfUmVuZGVyQ29udGV4dChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBQYWdlQ2FjaGUpCisgICAgOiBtX3BEb2N1bWVudChwRG9jKSwKKyAgICAgIG1fcFBhZ2VSZXNvdXJjZXMobnVsbHB0ciksCisgICAgICBtX3BQYWdlQ2FjaGUocFBhZ2VDYWNoZSksCisgICAgICBtX2JGaXJzdExheWVyKFRSVUUpIHt9CitDUERGX1JlbmRlckNvbnRleHQ6On5DUERGX1JlbmRlckNvbnRleHQoKSB7fQordm9pZCBDUERGX1JlbmRlckNvbnRleHQ6OkFwcGVuZE9iamVjdExpc3QoQ1BERl9QYWdlT2JqZWN0cyogcE9ianMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSkgeworICBfUERGX1JlbmRlckl0ZW0qIHBJdGVtID0gbV9Db250ZW50TGlzdC5BZGRTcGFjZSgpOworICBwSXRlbS0+bV9wT2JqZWN0TGlzdCA9IHBPYmpzOworICBpZiAocE9iamVjdDJEZXZpY2UpIHsKKyAgICBwSXRlbS0+bV9NYXRyaXggPSAqcE9iamVjdDJEZXZpY2U7CisgIH0gZWxzZSB7CisgICAgcEl0ZW0tPm1fTWF0cml4LlNldElkZW50aXR5KCk7CisgIH0KIH0KLXZvaWQgQ1BERl9SZW5kZXJDb250ZXh0OjpDbGVhcigpCi17Ci0gICAgbV9wRG9jdW1lbnQgPSBOVUxMOwotICAgIG1fcFBhZ2VSZXNvdXJjZXMgPSBOVUxMOwotICAgIG1fcFBhZ2VDYWNoZSA9IE5VTEw7Ci0gICAgbV9iRmlyc3RMYXllciA9IFRSVUU7Ci0gICAgbV9Db250ZW50TGlzdC5SZW1vdmVBbGwoKTsKK3ZvaWQgQ1BERl9SZW5kZXJDb250ZXh0OjpSZW5kZXIoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcExhc3RNYXRyaXgpIHsKKyAgUmVuZGVyKHBEZXZpY2UsIE5VTEwsIHBPcHRpb25zLCBwTGFzdE1hdHJpeCk7CiB9Ci12b2lkIENQREZfUmVuZGVyQ29udGV4dDo6QXBwZW5kT2JqZWN0TGlzdChDUERGX1BhZ2VPYmplY3RzKiBwT2JqcywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UpCi17Ci0gICAgX1BERl9SZW5kZXJJdGVtKiBwSXRlbSA9IG1fQ29udGVudExpc3QuQWRkU3BhY2UoKTsKLSAgICBwSXRlbS0+bV9wT2JqZWN0TGlzdCA9IHBPYmpzOwotICAgIGlmIChwT2JqZWN0MkRldmljZSkgewotICAgICAgICBwSXRlbS0+bV9NYXRyaXggPSAqcE9iamVjdDJEZXZpY2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcEl0ZW0tPm1fTWF0cml4LlNldElkZW50aXR5KCk7Ci0gICAgfQotfQotdm9pZCBDUERGX1JlbmRlckNvbnRleHQ6OlJlbmRlcihDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTGFzdE1hdHJpeCkKLXsKLSAgICBSZW5kZXIocERldmljZSwgTlVMTCwgcE9wdGlvbnMsIHBMYXN0TWF0cml4KTsKLX0KLXZvaWQgQ1BERl9SZW5kZXJDb250ZXh0OjpSZW5kZXIoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwU3RvcE9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcExhc3RNYXRyaXgpCi17Ci0gICAgaW50IGNvdW50ID0gbV9Db250ZW50TGlzdC5HZXRTaXplKCk7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgaiArKykgewotICAgICAgICBwRGV2aWNlLT5TYXZlU3RhdGUoKTsKLSAgICAgICAgX1BERl9SZW5kZXJJdGVtKiBwSXRlbSA9IG1fQ29udGVudExpc3QuR2V0RGF0YVB0cihqKTsKLSAgICAgICAgaWYgKHBMYXN0TWF0cml4KSB7Ci0gICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4IEZpbmFsTWF0cml4ID0gcEl0ZW0tPm1fTWF0cml4OwotICAgICAgICAgICAgRmluYWxNYXRyaXguQ29uY2F0KCpwTGFzdE1hdHJpeCk7Ci0gICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyBzdGF0dXM7Ci0gICAgICAgICAgICBzdGF0dXMuSW5pdGlhbGl6ZSh0aGlzLCBwRGV2aWNlLCBwTGFzdE1hdHJpeCwgcFN0b3BPYmosIE5VTEwsIE5VTEwsIHBPcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEl0ZW0tPm1fcE9iamVjdExpc3QtPm1fVHJhbnNwYXJlbmN5LCBGQUxTRSwgTlVMTCk7Ci0gICAgICAgICAgICBzdGF0dXMuUmVuZGVyT2JqZWN0TGlzdChwSXRlbS0+bV9wT2JqZWN0TGlzdCwgJkZpbmFsTWF0cml4KTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMubV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfTElNSVRFRElNQUdFQ0FDSEUpIHsKLSAgICAgICAgICAgICAgICBtX3BQYWdlQ2FjaGUtPkNhY2hlT3B0aW1pemF0aW9uKHN0YXR1cy5tX09wdGlvbnMubV9kd0xpbWl0Q2FjaGVTaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdGF0dXMubV9iU3RvcHBlZCkgewotICAgICAgICAgICAgICAgIHBEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMgc3RhdHVzOwotICAgICAgICAgICAgc3RhdHVzLkluaXRpYWxpemUodGhpcywgcERldmljZSwgTlVMTCwgcFN0b3BPYmosIE5VTEwsIE5VTEwsIHBPcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEl0ZW0tPm1fcE9iamVjdExpc3QtPm1fVHJhbnNwYXJlbmN5LCBGQUxTRSwgTlVMTCk7Ci0gICAgICAgICAgICBzdGF0dXMuUmVuZGVyT2JqZWN0TGlzdChwSXRlbS0+bV9wT2JqZWN0TGlzdCwgJnBJdGVtLT5tX01hdHJpeCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzLm1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX0xJTUlURURJTUFHRUNBQ0hFKSB7Ci0gICAgICAgICAgICAgICAgbV9wUGFnZUNhY2hlLT5DYWNoZU9wdGltaXphdGlvbihzdGF0dXMubV9PcHRpb25zLm1fZHdMaW1pdENhY2hlU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhdHVzLm1fYlN0b3BwZWQpIHsKLSAgICAgICAgICAgICAgICBwRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQordm9pZCBDUERGX1JlbmRlckNvbnRleHQ6OlJlbmRlcihDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTdG9wT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTGFzdE1hdHJpeCkgeworICBpbnQgY291bnQgPSBtX0NvbnRlbnRMaXN0LkdldFNpemUoKTsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7CisgICAgcERldmljZS0+U2F2ZVN0YXRlKCk7CisgICAgX1BERl9SZW5kZXJJdGVtKiBwSXRlbSA9IG1fQ29udGVudExpc3QuR2V0RGF0YVB0cihqKTsKKyAgICBpZiAocExhc3RNYXRyaXgpIHsKKyAgICAgIENGWF9NYXRyaXggRmluYWxNYXRyaXggPSBwSXRlbS0+bV9NYXRyaXg7CisgICAgICBGaW5hbE1hdHJpeC5Db25jYXQoKnBMYXN0TWF0cml4KTsKKyAgICAgIENQREZfUmVuZGVyU3RhdHVzIHN0YXR1czsKKyAgICAgIHN0YXR1cy5Jbml0aWFsaXplKHRoaXMsIHBEZXZpY2UsIHBMYXN0TWF0cml4LCBwU3RvcE9iaiwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBPcHRpb25zLCBwSXRlbS0+bV9wT2JqZWN0TGlzdC0+bV9UcmFuc3BhcmVuY3ksIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICBzdGF0dXMuUmVuZGVyT2JqZWN0TGlzdChwSXRlbS0+bV9wT2JqZWN0TGlzdCwgJkZpbmFsTWF0cml4KTsKKyAgICAgIGlmIChzdGF0dXMubV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfTElNSVRFRElNQUdFQ0FDSEUpIHsKKyAgICAgICAgbV9wUGFnZUNhY2hlLT5DYWNoZU9wdGltaXphdGlvbihzdGF0dXMubV9PcHRpb25zLm1fZHdMaW1pdENhY2hlU2l6ZSk7CisgICAgICB9CisgICAgICBpZiAoc3RhdHVzLm1fYlN0b3BwZWQpIHsKICAgICAgICAgcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBDUERGX1JlbmRlclN0YXR1cyBzdGF0dXM7CisgICAgICBzdGF0dXMuSW5pdGlhbGl6ZSh0aGlzLCBwRGV2aWNlLCBOVUxMLCBwU3RvcE9iaiwgTlVMTCwgTlVMTCwgcE9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBwSXRlbS0+bV9wT2JqZWN0TGlzdC0+bV9UcmFuc3BhcmVuY3ksIEZBTFNFLCBOVUxMKTsKKyAgICAgIHN0YXR1cy5SZW5kZXJPYmplY3RMaXN0KHBJdGVtLT5tX3BPYmplY3RMaXN0LCAmcEl0ZW0tPm1fTWF0cml4KTsKKyAgICAgIGlmIChzdGF0dXMubV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfTElNSVRFRElNQUdFQ0FDSEUpIHsKKyAgICAgICAgbV9wUGFnZUNhY2hlLT5DYWNoZU9wdGltaXphdGlvbihzdGF0dXMubV9PcHRpb25zLm1fZHdMaW1pdENhY2hlU2l6ZSk7CisgICAgICB9CisgICAgICBpZiAoc3RhdHVzLm1fYlN0b3BwZWQpIHsKKyAgICAgICAgcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQogICAgIH0KKyAgICBwRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKKyAgfQogfQotdm9pZCBDUERGX1JlbmRlckNvbnRleHQ6OkRyYXdPYmplY3RMaXN0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfUGFnZU9iamVjdHMqIHBPYmpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLCBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKQotewotICAgIEFwcGVuZE9iamVjdExpc3QocE9ianMsIHBPYmplY3QyRGV2aWNlKTsKLSAgICBSZW5kZXIocERldmljZSwgcE9wdGlvbnMpOwordm9pZCBDUERGX1JlbmRlckNvbnRleHQ6OkRyYXdPYmplY3RMaXN0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYWdlT2JqZWN0cyogcE9ianMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykgeworICBBcHBlbmRPYmplY3RMaXN0KHBPYmpzLCBwT2JqZWN0MkRldmljZSk7CisgIFJlbmRlcihwRGV2aWNlLCBwT3B0aW9ucyk7CiB9Ci1DUERGX1Byb2dyZXNzaXZlUmVuZGVyZXI6OkNQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcigpCi17Ci0gICAgbV9wUmVuZGVyZXIgPSBOVUxMOwotICAgIG1fcENvbnRleHQgPSBOVUxMOwotICAgIG1fcERldmljZSA9IE5VTEw7Ci0gICAgbV9TdGF0dXMgPSBSZWFkeTsKKworQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyOjpDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXIoCisgICAgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKKyAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpCisgICAgOiBtX1N0YXR1cyhSZWFkeSksCisgICAgICBtX3BDb250ZXh0KHBDb250ZXh0KSwKKyAgICAgIG1fcERldmljZShwRGV2aWNlKSwKKyAgICAgIG1fcE9wdGlvbnMocE9wdGlvbnMpLAorICAgICAgbV9MYXllckluZGV4KDApLAorICAgICAgbV9PYmplY3RJbmRleCgwKSwKKyAgICAgIG1fT2JqZWN0UG9zKG51bGxwdHIpLAorICAgICAgbV9QcmV2TGFzdFBvcyhudWxscHRyKSB7CiB9Ci1DUERGX1Byb2dyZXNzaXZlUmVuZGVyZXI6On5DUERGX1Byb2dyZXNzaXZlUmVuZGVyZXIoKQotewotICAgIENsZWFyKCk7CisKK0NQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcjo6fkNQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcigpIHsKKyAgaWYgKG1fcFJlbmRlclN0YXR1cykKKyAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwogfQotdm9pZCBDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXI6OkNsZWFyKCkKLXsKLSAgICBpZiAobV9wUmVuZGVyZXIpIHsKLSAgICAgICAgZGVsZXRlIG1fcFJlbmRlcmVyOwotICAgICAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwotICAgICAgICBtX3BSZW5kZXJlciA9IE5VTEw7Ci0gICAgfQotICAgIG1fU3RhdHVzID0gUmVhZHk7CisKK3ZvaWQgQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyOjpTdGFydChJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpZiAoIW1fcENvbnRleHQgfHwgIW1fcERldmljZSB8fCBtX1N0YXR1cyAhPSBSZWFkeSkgeworICAgIG1fU3RhdHVzID0gRmFpbGVkOworICAgIHJldHVybjsKKyAgfQorICBtX1N0YXR1cyA9IFRvQmVDb250aW51ZWQ7CisgIENvbnRpbnVlKHBQYXVzZSk7CiB9Ci12b2lkIENQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcjo6U3RhcnQoQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLCBJRlhfUGF1c2UqIHBQYXVzZSwgRlhfQk9PTCBiRHJvcE9iamVjdHMpCi17Ci0gICAgaWYgKG1fU3RhdHVzICE9IFJlYWR5KSB7Ci0gICAgICAgIG1fU3RhdHVzID0gRmFpbGVkOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fcENvbnRleHQgPSBwQ29udGV4dDsKLSAgICBtX3BEZXZpY2UgPSBwRGV2aWNlOwotICAgIG1fcE9wdGlvbnMgPSBwT3B0aW9uczsKLSAgICBtX2JEcm9wT2JqZWN0cyA9IGJEcm9wT2JqZWN0czsKLSAgICBpZiAocENvbnRleHQgPT0gTlVMTCB8fCBwRGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgbV9TdGF0dXMgPSBGYWlsZWQ7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9TdGF0dXMgPSBUb0JlQ29udGludWVkOwotICAgIG1fT2JqZWN0UG9zID0gTlVMTDsKLSAgICBtX0xheWVySW5kZXggPSAwOwotICAgIG1fT2JqZWN0SW5kZXggPSAwOwotICAgIG1fUHJldkxhc3RQb3MgPSBOVUxMOwotICAgIENvbnRpbnVlKHBQYXVzZSk7Ci19CisKICNkZWZpbmUgUkVOREVSX1NURVBfTElNSVQgMTAwCi12b2lkIENQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcjo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgaWYgKG1fU3RhdHVzICE9IFRvQmVDb250aW51ZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9EV09SRCBuTGF5ZXJzID0gbV9wQ29udGV4dC0+bV9Db250ZW50TGlzdC5HZXRTaXplKCk7Ci0gICAgZm9yICg7IG1fTGF5ZXJJbmRleCA8IG5MYXllcnM7IG1fTGF5ZXJJbmRleCArKykgewotICAgICAgICBfUERGX1JlbmRlckl0ZW0qIHBJdGVtID0gbV9wQ29udGV4dC0+bV9Db250ZW50TGlzdC5HZXREYXRhUHRyKG1fTGF5ZXJJbmRleCk7Ci0gICAgICAgIEZYX1BPU0lUSU9OIExhc3RQb3MgPSBwSXRlbS0+bV9wT2JqZWN0TGlzdC0+R2V0TGFzdE9iamVjdFBvc2l0aW9uKCk7Ci0gICAgICAgIGlmIChtX09iamVjdFBvcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoTGFzdFBvcyA9PSBtX1ByZXZMYXN0UG9zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFwSXRlbS0+bV9wT2JqZWN0TGlzdC0+SXNQYXJzZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBwSXRlbS0+bV9wT2JqZWN0TGlzdC0+Q29udGludWVQYXJzZShwUGF1c2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXBJdGVtLT5tX3BPYmplY3RMaXN0LT5Jc1BhcnNlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTGFzdFBvcyA9IHBJdGVtLT5tX3BPYmplY3RMaXN0LT5HZXRMYXN0T2JqZWN0UG9zaXRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTGFzdFBvcyA9PSBtX1ByZXZMYXN0UG9zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fcFJlbmRlcmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtX3BSZW5kZXJlcjsKLSAgICAgICAgICAgICAgICAgICAgbV9wUmVuZGVyZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBtX09iamVjdFBvcyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIG1fUHJldkxhc3RQb3MgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX1ByZXZMYXN0UG9zKSB7Ci0gICAgICAgICAgICAgICAgbV9PYmplY3RQb3MgPSBtX1ByZXZMYXN0UG9zOwotICAgICAgICAgICAgICAgIHBJdGVtLT5tX3BPYmplY3RMaXN0LT5HZXROZXh0T2JqZWN0KG1fT2JqZWN0UG9zKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9PYmplY3RQb3MgPSBwSXRlbS0+bV9wT2JqZWN0TGlzdC0+R2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9QcmV2TGFzdFBvcyA9IExhc3RQb3M7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fcFJlbmRlcmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1fT2JqZWN0UG9zID0gcEl0ZW0tPm1fcE9iamVjdExpc3QtPkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKTsKLSAgICAgICAgICAgIG1fT2JqZWN0SW5kZXggPSAwOwotICAgICAgICAgICAgbV9wUmVuZGVyZXIgPSBuZXcgQ1BERl9SZW5kZXJTdGF0dXMoKTsKLSAgICAgICAgICAgIG1fcFJlbmRlcmVyLT5Jbml0aWFsaXplKG1fcENvbnRleHQsIG1fcERldmljZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE9wdGlvbnMsIHBJdGVtLT5tX3BPYmplY3RMaXN0LT5tX1RyYW5zcGFyZW5jeSwgbV9iRHJvcE9iamVjdHMsIE5VTEwpOwotICAgICAgICAgICAgbV9wRGV2aWNlLT5TYXZlU3RhdGUoKTsKLSAgICAgICAgICAgIG1fQ2xpcFJlY3QgPSBtX3BEZXZpY2UtPkdldENsaXBCb3goKTsKLSAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXggZGV2aWNlMm9iamVjdDsKLSAgICAgICAgICAgIGRldmljZTJvYmplY3QuU2V0UmV2ZXJzZShwSXRlbS0+bV9NYXRyaXgpOwotICAgICAgICAgICAgZGV2aWNlMm9iamVjdC5UcmFuc2Zvcm1SZWN0KG1fQ2xpcFJlY3QpOwotICAgICAgICB9Ci0gICAgICAgIGludCBvYmpzX3RvX2dvID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRSZW5kZXJNb2R1bGUoKS0+R2V0Q29uZmlnKCktPm1fUmVuZGVyU3RlcExpbWl0OwotICAgICAgICB3aGlsZSAobV9PYmplY3RQb3MpIHsKLSAgICAgICAgICAgIENQREZfUGFnZU9iamVjdCogcEN1ck9iaiA9IHBJdGVtLT5tX3BPYmplY3RMaXN0LT5HZXRPYmplY3RBdChtX09iamVjdFBvcyk7Ci0gICAgICAgICAgICBpZiAocEN1ck9iaiAmJiBwQ3VyT2JqLT5tX0xlZnQgPD0gbV9DbGlwUmVjdC5yaWdodCAmJiBwQ3VyT2JqLT5tX1JpZ2h0ID49IG1fQ2xpcFJlY3QubGVmdCAmJgotICAgICAgICAgICAgICAgICAgICBwQ3VyT2JqLT5tX0JvdHRvbSA8PSBtX0NsaXBSZWN0LnRvcCAmJiBwQ3VyT2JqLT5tX1RvcCA+PSBtX0NsaXBSZWN0LmJvdHRvbSkgewotICAgICAgICAgICAgICAgIGlmIChtX3BSZW5kZXJlci0+Q29udGludWVTaW5nbGVPYmplY3QocEN1ck9iaiwgJnBJdGVtLT5tX01hdHJpeCwgcFBhdXNlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwQ3VyT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9JTUFHRSAmJiBtX3BSZW5kZXJlci0+bV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfTElNSVRFRElNQUdFQ0FDSEUpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9wQ29udGV4dC0+R2V0UGFnZUNhY2hlKCktPkNhY2hlT3B0aW1pemF0aW9uKG1fcFJlbmRlcmVyLT5tX09wdGlvbnMubV9kd0xpbWl0Q2FjaGVTaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBDdXJPYmotPm1fVHlwZSA9PSBQREZQQUdFX0ZPUk0gfHwgcEN1ck9iai0+bV9UeXBlID09IFBERlBBR0VfU0hBRElORykgewotICAgICAgICAgICAgICAgICAgICBvYmpzX3RvX2dvID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBvYmpzX3RvX2dvIC0tOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fT2JqZWN0SW5kZXggKys7Ci0gICAgICAgICAgICBwSXRlbS0+bV9wT2JqZWN0TGlzdC0+R2V0TmV4dE9iamVjdChtX09iamVjdFBvcyk7Ci0gICAgICAgICAgICBpZiAob2Jqc190b19nbyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvYmpzX3RvX2dvID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRSZW5kZXJNb2R1bGUoKS0+R2V0Q29uZmlnKCktPm1fUmVuZGVyU3RlcExpbWl0OwotICAgICAgICAgICAgfQotICAgICAgICB9Cit2b2lkIENQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcjo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgaWYgKG1fU3RhdHVzICE9IFRvQmVDb250aW51ZWQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfRFdPUkQgbkxheWVycyA9IG1fcENvbnRleHQtPm1fQ29udGVudExpc3QuR2V0U2l6ZSgpOworICBmb3IgKDsgbV9MYXllckluZGV4IDwgbkxheWVyczsgbV9MYXllckluZGV4KyspIHsKKyAgICBfUERGX1JlbmRlckl0ZW0qIHBJdGVtID0gbV9wQ29udGV4dC0+bV9Db250ZW50TGlzdC5HZXREYXRhUHRyKG1fTGF5ZXJJbmRleCk7CisgICAgRlhfUE9TSVRJT04gTGFzdFBvcyA9IHBJdGVtLT5tX3BPYmplY3RMaXN0LT5HZXRMYXN0T2JqZWN0UG9zaXRpb24oKTsKKyAgICBpZiAoIW1fT2JqZWN0UG9zKSB7CisgICAgICBpZiAoTGFzdFBvcyA9PSBtX1ByZXZMYXN0UG9zKSB7CiAgICAgICAgIGlmICghcEl0ZW0tPm1fcE9iamVjdExpc3QtPklzUGFyc2VkKCkpIHsKKyAgICAgICAgICBwSXRlbS0+bV9wT2JqZWN0TGlzdC0+Q29udGludWVQYXJzZShwUGF1c2UpOworICAgICAgICAgIGlmICghcEl0ZW0tPm1fcE9iamVjdExpc3QtPklzUGFyc2VkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgICAgTGFzdFBvcyA9IHBJdGVtLT5tX3BPYmplY3RMaXN0LT5HZXRMYXN0T2JqZWN0UG9zaXRpb24oKTsKICAgICAgICAgfQotICAgICAgICBkZWxldGUgbV9wUmVuZGVyZXI7Ci0gICAgICAgIG1fcFJlbmRlcmVyID0gTlVMTDsKLSAgICAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKLSAgICAgICAgbV9PYmplY3RQb3MgPSBOVUxMOwotICAgICAgICBtX1ByZXZMYXN0UG9zID0gTlVMTDsKLSAgICAgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgIG1fTGF5ZXJJbmRleCsrOwotICAgICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaWYgKExhc3RQb3MgPT0gbV9QcmV2TGFzdFBvcykgeworICAgICAgICBpZiAobV9wUmVuZGVyU3RhdHVzKSB7CisgICAgICAgICAgbV9wUmVuZGVyU3RhdHVzLnJlc2V0KCk7CisgICAgICAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKKyAgICAgICAgICBtX09iamVjdFBvcyA9IE5VTEw7CisgICAgICAgICAgbV9QcmV2TGFzdFBvcyA9IE5VTEw7CiAgICAgICAgIH0KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAobV9QcmV2TGFzdFBvcykgeworICAgICAgICBtX09iamVjdFBvcyA9IG1fUHJldkxhc3RQb3M7CisgICAgICAgIHBJdGVtLT5tX3BPYmplY3RMaXN0LT5HZXROZXh0T2JqZWN0KG1fT2JqZWN0UG9zKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fT2JqZWN0UG9zID0gcEl0ZW0tPm1fcE9iamVjdExpc3QtPkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKTsKKyAgICAgIH0KKyAgICAgIG1fUHJldkxhc3RQb3MgPSBMYXN0UG9zOwogICAgIH0KLSAgICBtX1N0YXR1cyA9IERvbmU7Ci19Ci1pbnQgQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyOjpFc3RpbWF0ZVByb2dyZXNzKCkKLXsKLSAgICBpZiAoIW1fcENvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFtX3BSZW5kZXJTdGF0dXMpIHsKKyAgICAgIG1fT2JqZWN0UG9zID0gcEl0ZW0tPm1fcE9iamVjdExpc3QtPkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKTsKKyAgICAgIG1fT2JqZWN0SW5kZXggPSAwOworICAgICAgbV9wUmVuZGVyU3RhdHVzLnJlc2V0KG5ldyBDUERGX1JlbmRlclN0YXR1cygpKTsKKyAgICAgIG1fcFJlbmRlclN0YXR1cy0+SW5pdGlhbGl6ZSgKKyAgICAgICAgICBtX3BDb250ZXh0LCBtX3BEZXZpY2UsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIG1fcE9wdGlvbnMsCisgICAgICAgICAgcEl0ZW0tPm1fcE9iamVjdExpc3QtPm1fVHJhbnNwYXJlbmN5LCBGQUxTRSwgTlVMTCk7CisgICAgICBtX3BEZXZpY2UtPlNhdmVTdGF0ZSgpOworICAgICAgbV9DbGlwUmVjdCA9IG1fcERldmljZS0+R2V0Q2xpcEJveCgpOworICAgICAgQ0ZYX01hdHJpeCBkZXZpY2Uyb2JqZWN0OworICAgICAgZGV2aWNlMm9iamVjdC5TZXRSZXZlcnNlKHBJdGVtLT5tX01hdHJpeCk7CisgICAgICBkZXZpY2Uyb2JqZWN0LlRyYW5zZm9ybVJlY3QobV9DbGlwUmVjdCk7CiAgICAgfQotICAgIEZYX0RXT1JEIG5MYXllcnMgPSBtX3BDb250ZXh0LT5tX0NvbnRlbnRMaXN0LkdldFNpemUoKTsKLSAgICBpbnQgblRvdGFsID0gMCwgblJlbmRlcmVkID0gMDsKLSAgICBmb3IgKEZYX0RXT1JEIGxheWVyID0gMDsgbGF5ZXIgPCBuTGF5ZXJzOyBsYXllciArKykgewotICAgICAgICBfUERGX1JlbmRlckl0ZW0qIHBJdGVtID0gbV9wQ29udGV4dC0+bV9Db250ZW50TGlzdC5HZXREYXRhUHRyKGxheWVyKTsKLSAgICAgICAgaW50IG5PYmpzID0gcEl0ZW0tPm1fcE9iamVjdExpc3QtPkNvdW50T2JqZWN0cygpOwotICAgICAgICBpZiAobGF5ZXIgPT0gbV9MYXllckluZGV4KSB7Ci0gICAgICAgICAgICBuUmVuZGVyZWQgKz0gbV9PYmplY3RJbmRleDsKLSAgICAgICAgfSBlbHNlIGlmIChsYXllciA8IG1fTGF5ZXJJbmRleCkgewotICAgICAgICAgICAgblJlbmRlcmVkICs9IG5PYmpzOworICAgIGludCBvYmpzX3RvX2dvID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgLT5HZXRSZW5kZXJNb2R1bGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0Q29uZmlnKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAtPm1fUmVuZGVyU3RlcExpbWl0OworICAgIHdoaWxlIChtX09iamVjdFBvcykgeworICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwQ3VyT2JqID0gcEl0ZW0tPm1fcE9iamVjdExpc3QtPkdldE9iamVjdEF0KG1fT2JqZWN0UG9zKTsKKyAgICAgIGlmIChwQ3VyT2JqICYmIHBDdXJPYmotPm1fTGVmdCA8PSBtX0NsaXBSZWN0LnJpZ2h0ICYmCisgICAgICAgICAgcEN1ck9iai0+bV9SaWdodCA+PSBtX0NsaXBSZWN0LmxlZnQgJiYKKyAgICAgICAgICBwQ3VyT2JqLT5tX0JvdHRvbSA8PSBtX0NsaXBSZWN0LnRvcCAmJgorICAgICAgICAgIHBDdXJPYmotPm1fVG9wID49IG1fQ2xpcFJlY3QuYm90dG9tKSB7CisgICAgICAgIGlmIChtX3BSZW5kZXJTdGF0dXMtPkNvbnRpbnVlU2luZ2xlT2JqZWN0KHBDdXJPYmosICZwSXRlbS0+bV9NYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXVzZSkpIHsKKyAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgblRvdGFsICs9IG5PYmpzOwotICAgIH0KLSAgICBpZiAoblRvdGFsID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAxMDAgKiBuUmVuZGVyZWQgLyBuVG90YWw7Ci19Ci1DUERGX1RyYW5zZmVyRnVuYyogQ1BERl9Eb2NSZW5kZXJEYXRhOjpHZXRUcmFuc2ZlckZ1bmMoQ1BERl9PYmplY3QqIHBPYmopCi17Ci0gICAgaWYgKHBPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9Db3VudGVkT2JqZWN0PENQREZfVHJhbnNmZXJGdW5jKj4qIHBUcmFuc2ZlckNvdW50ZXI7Ci0gICAgaWYgKCFtX1RyYW5zZmVyRnVuY01hcC5Mb29rdXAocE9iaiwgcFRyYW5zZmVyQ291bnRlcikpIHsKLSAgICAgICAgQ1BERl9UcmFuc2ZlckZ1bmMqIHBUcmFuc2ZlciA9IE5VTEw7Ci0gICAgICAgIENQREZfRnVuY3Rpb24qIHBGdW5jc1szXSA9IHtOVUxMLCBOVUxMLCBOVUxMfTsKLSAgICAgICAgRlhfQk9PTCBiVW5pVHJhbnNmZXIgPSBUUlVFOwotICAgICAgICBpbnQgaTsKLSAgICAgICAgRlhfQk9PTCBiSWRlbnRpdHkgPSBUUlVFOwotICAgICAgICBpZiAocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICAgICAgYlVuaVRyYW5zZmVyID0gRkFMU0U7Ci0gICAgICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcE9iajsKLSAgICAgICAgICAgIGlmIChwQXJyYXktPkdldENvdW50KCkgPCAzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgMzsgaSArKykgewotICAgICAgICAgICAgICAgIHBGdW5jc1syIC0gaV0gPSBDUERGX0Z1bmN0aW9uOjpMb2FkKHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKGkpKTsKLSAgICAgICAgICAgICAgICBpZiAocEZ1bmNzWzIgLSBpXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKHBDdXJPYmotPm1fVHlwZSA9PSBQREZQQUdFX0lNQUdFICYmCisgICAgICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPm1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX0xJTUlURURJTUFHRUNBQ0hFKSB7CisgICAgICAgICAgbV9wQ29udGV4dC0+R2V0UGFnZUNhY2hlKCktPkNhY2hlT3B0aW1pemF0aW9uKAorICAgICAgICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPm1fT3B0aW9ucy5tX2R3TGltaXRDYWNoZVNpemUpOworICAgICAgICB9CisgICAgICAgIGlmIChwQ3VyT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9GT1JNIHx8CisgICAgICAgICAgICBwQ3VyT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9TSEFESU5HKSB7CisgICAgICAgICAgb2Jqc190b19nbyA9IDA7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwRnVuY3NbMF0gPSBDUERGX0Z1bmN0aW9uOjpMb2FkKHBPYmopOwotICAgICAgICAgICAgaWYgKHBGdW5jc1swXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgb2Jqc190b19nby0tOwogICAgICAgICB9Ci0gICAgICAgIHBUcmFuc2ZlciA9IG5ldyBDUERGX1RyYW5zZmVyRnVuYzsKLSAgICAgICAgcFRyYW5zZmVyLT5tX3BQREZEb2MgPSBtX3BQREZEb2M7Ci0gICAgICAgIHBUcmFuc2ZlckNvdW50ZXIgPSBuZXcgQ1BERl9Db3VudGVkT2JqZWN0PENQREZfVHJhbnNmZXJGdW5jKj47Ci0gICAgICAgIHBUcmFuc2ZlckNvdW50ZXItPm1fbkNvdW50ID0gMTsKLSAgICAgICAgcFRyYW5zZmVyQ291bnRlci0+bV9PYmogPSBwVHJhbnNmZXI7Ci0gICAgICAgIG1fVHJhbnNmZXJGdW5jTWFwLlNldEF0KHBPYmosIHBUcmFuc2ZlckNvdW50ZXIpOwotICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtNYXhPdXRwdXRzID0gMTY7Ci0gICAgICAgIEZYX0ZMT0FUIG91dHB1dFtrTWF4T3V0cHV0c107Ci0gICAgICAgIEZYU1lTX21lbXNldDMyKG91dHB1dCwgMCwgc2l6ZW9mKG91dHB1dCkpOwotICAgICAgICBGWF9GTE9BVCBpbnB1dDsKLSAgICAgICAgaW50IG5vdXRwdXQ7Ci0gICAgICAgIGZvciAoaW50IHYgPSAwOyB2IDwgMjU2OyB2ICsrKSB7Ci0gICAgICAgICAgICBpbnB1dCA9IChGWF9GTE9BVCl2IC8gMjU1LjBmOwotICAgICAgICAgICAgaWYgKGJVbmlUcmFuc2ZlcikgewotICAgICAgICAgICAgICAgIGlmIChwRnVuY3NbMF0gJiYgcEZ1bmNzWzBdLT5Db3VudE91dHB1dHMoKSA8PSBrTWF4T3V0cHV0cykgewotICAgICAgICAgICAgICAgICAgICBwRnVuY3NbMF0tPkNhbGwoJmlucHV0LCAxLCBvdXRwdXQsIG5vdXRwdXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgbyA9IEZYU1lTX3JvdW5kKG91dHB1dFswXSAqIDI1NSk7Ci0gICAgICAgICAgICAgICAgaWYgKG8gIT0gdikgewotICAgICAgICAgICAgICAgICAgICBiSWRlbnRpdHkgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcFRyYW5zZmVyLT5tX1NhbXBsZXNbaSAqIDI1NiArIHZdID0gbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSArKykgewotICAgICAgICAgICAgICAgICAgICBpZiAocEZ1bmNzW2ldICYmIHBGdW5jc1tpXS0+Q291bnRPdXRwdXRzKCkgPD0ga01heE91dHB1dHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBGdW5jc1tpXS0+Q2FsbCgmaW5wdXQsIDEsIG91dHB1dCwgbm91dHB1dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbyA9IEZYU1lTX3JvdW5kKG91dHB1dFswXSAqIDI1NSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobyAhPSB2KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYklkZW50aXR5ID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwVHJhbnNmZXItPm1fU2FtcGxlc1tpICogMjU2ICsgdl0gPSBvOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcFRyYW5zZmVyLT5tX1NhbXBsZXNbaSAqIDI1NiArIHZdID0gdjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG1fT2JqZWN0SW5kZXgrKzsKKyAgICAgIHBJdGVtLT5tX3BPYmplY3RMaXN0LT5HZXROZXh0T2JqZWN0KG1fT2JqZWN0UG9zKTsKKyAgICAgIGlmIChvYmpzX3RvX2dvID09IDApIHsKKyAgICAgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKKyAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkgKyspCi0gICAgICAgICAgICBpZiAocEZ1bmNzW2ldKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIHBGdW5jc1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgcFRyYW5zZmVyLT5tX2JJZGVudGl0eSA9IGJJZGVudGl0eTsKKyAgICAgICAgb2Jqc190b19nbyA9IENQREZfTW9kdWxlTWdyOjpHZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0UmVuZGVyTW9kdWxlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldENvbmZpZygpCisgICAgICAgICAgICAgICAgICAgICAgICAgLT5tX1JlbmRlclN0ZXBMaW1pdDsKKyAgICAgIH0KICAgICB9Ci0gICAgcFRyYW5zZmVyQ291bnRlci0+bV9uQ291bnQrKzsKLSAgICByZXR1cm4gcFRyYW5zZmVyQ291bnRlci0+bV9PYmo7Ci19Ci12b2lkIENQREZfRG9jUmVuZGVyRGF0YTo6UmVsZWFzZVRyYW5zZmVyRnVuYyhDUERGX09iamVjdCogcE9iaikKLXsKLSAgICBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9UcmFuc2ZlckZ1bmMqPiogcFRyYW5zZmVyQ291bnRlcjsKLSAgICBpZiAoIW1fVHJhbnNmZXJGdW5jTWFwLkxvb2t1cChwT2JqLCBwVHJhbnNmZXJDb3VudGVyKSkgewotICAgICAgICByZXR1cm47CisgICAgaWYgKCFwSXRlbS0+bV9wT2JqZWN0TGlzdC0+SXNQYXJzZWQoKSkgeworICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBwVHJhbnNmZXJDb3VudGVyLT5tX25Db3VudC0tOworICAgIG1fcFJlbmRlclN0YXR1cy5yZXNldCgpOworICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CisgICAgbV9PYmplY3RQb3MgPSBOVUxMOworICAgIG1fUHJldkxhc3RQb3MgPSBOVUxMOworICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7CisgICAgICBtX0xheWVySW5kZXgrKzsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgbV9TdGF0dXMgPSBEb25lOwogfQotQ1BERl9SZW5kZXJDb25maWc6OkNQREZfUmVuZGVyQ29uZmlnKCkKLXsKLSAgICBtX0hhbGZ0b25lTGltaXQgPSAwOwotICAgIG1fUmVuZGVyU3RlcExpbWl0ID0gMTAwOworaW50IENQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcjo6RXN0aW1hdGVQcm9ncmVzcygpIHsKKyAgaWYgKCFtX3BDb250ZXh0KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgRlhfRFdPUkQgbkxheWVycyA9IG1fcENvbnRleHQtPm1fQ29udGVudExpc3QuR2V0U2l6ZSgpOworICBpbnQgblRvdGFsID0gMCwgblJlbmRlcmVkID0gMDsKKyAgZm9yIChGWF9EV09SRCBsYXllciA9IDA7IGxheWVyIDwgbkxheWVyczsgbGF5ZXIrKykgeworICAgIF9QREZfUmVuZGVySXRlbSogcEl0ZW0gPSBtX3BDb250ZXh0LT5tX0NvbnRlbnRMaXN0LkdldERhdGFQdHIobGF5ZXIpOworICAgIGludCBuT2JqcyA9IHBJdGVtLT5tX3BPYmplY3RMaXN0LT5Db3VudE9iamVjdHMoKTsKKyAgICBpZiAobGF5ZXIgPT0gbV9MYXllckluZGV4KSB7CisgICAgICBuUmVuZGVyZWQgKz0gbV9PYmplY3RJbmRleDsKKyAgICB9IGVsc2UgaWYgKGxheWVyIDwgbV9MYXllckluZGV4KSB7CisgICAgICBuUmVuZGVyZWQgKz0gbk9ianM7CisgICAgfQorICAgIG5Ub3RhbCArPSBuT2JqczsKKyAgfQorICBpZiAoblRvdGFsID09IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTAwICogblJlbmRlcmVkIC8gblRvdGFsOwogfQotQ1BERl9SZW5kZXJDb25maWc6On5DUERGX1JlbmRlckNvbmZpZygpCi17CitDUERGX1RyYW5zZmVyRnVuYyogQ1BERl9Eb2NSZW5kZXJEYXRhOjpHZXRUcmFuc2ZlckZ1bmMoQ1BERl9PYmplY3QqIHBPYmopIHsKKyAgaWYgKCFwT2JqKQorICAgIHJldHVybiBudWxscHRyOworCisgIGF1dG8gaXQgPSBtX1RyYW5zZmVyRnVuY01hcC5maW5kKHBPYmopOworICBpZiAoaXQgIT0gbV9UcmFuc2ZlckZ1bmNNYXAuZW5kKCkpIHsKKyAgICBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9UcmFuc2ZlckZ1bmM+KiBwVHJhbnNmZXJDb3VudGVyID0gaXQtPnNlY29uZDsKKyAgICByZXR1cm4gcFRyYW5zZmVyQ291bnRlci0+QWRkUmVmKCk7CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9GdW5jdGlvbj4gcEZ1bmNzWzNdOworICBGWF9CT09MIGJVbmlUcmFuc2ZlciA9IFRSVUU7CisgIEZYX0JPT0wgYklkZW50aXR5ID0gVFJVRTsKKyAgaWYgKENQREZfQXJyYXkqIHBBcnJheSA9IHBPYmotPkFzQXJyYXkoKSkgeworICAgIGJVbmlUcmFuc2ZlciA9IEZBTFNFOworICAgIGlmIChwQXJyYXktPkdldENvdW50KCkgPCAzKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgICBwRnVuY3NbMiAtIGldLnJlc2V0KENQREZfRnVuY3Rpb246OkxvYWQocEFycmF5LT5HZXRFbGVtZW50VmFsdWUoaSkpKTsKKyAgICAgIGlmICghcEZ1bmNzWzIgLSBpXSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICB9IGVsc2UgeworICAgIHBGdW5jc1swXS5yZXNldChDUERGX0Z1bmN0aW9uOjpMb2FkKHBPYmopKTsKKyAgICBpZiAoIXBGdW5jc1swXSkKKyAgICAgIHJldHVybiBudWxscHRyOworICB9CisgIENQREZfVHJhbnNmZXJGdW5jKiBwVHJhbnNmZXIgPSBuZXcgQ1BERl9UcmFuc2ZlckZ1bmMobV9wUERGRG9jKTsKKyAgQ1BERl9Db3VudGVkT2JqZWN0PENQREZfVHJhbnNmZXJGdW5jPiogcFRyYW5zZmVyQ291bnRlciA9CisgICAgICBuZXcgQ1BERl9Db3VudGVkT2JqZWN0PENQREZfVHJhbnNmZXJGdW5jPihwVHJhbnNmZXIpOworICBtX1RyYW5zZmVyRnVuY01hcFtwT2JqXSA9IHBUcmFuc2ZlckNvdW50ZXI7CisgIHN0YXRpYyBjb25zdCBpbnQga01heE91dHB1dHMgPSAxNjsKKyAgRlhfRkxPQVQgb3V0cHV0W2tNYXhPdXRwdXRzXTsKKyAgRlhTWVNfbWVtc2V0KG91dHB1dCwgMCwgc2l6ZW9mKG91dHB1dCkpOworICBGWF9GTE9BVCBpbnB1dDsKKyAgaW50IG5vdXRwdXQ7CisgIGZvciAoaW50IHYgPSAwOyB2IDwgMjU2OyArK3YpIHsKKyAgICBpbnB1dCA9IChGWF9GTE9BVCl2IC8gMjU1LjBmOworICAgIGlmIChiVW5pVHJhbnNmZXIpIHsKKyAgICAgIGlmIChwRnVuY3NbMF0gJiYgcEZ1bmNzWzBdLT5Db3VudE91dHB1dHMoKSA8PSBrTWF4T3V0cHV0cykKKyAgICAgICAgcEZ1bmNzWzBdLT5DYWxsKCZpbnB1dCwgMSwgb3V0cHV0LCBub3V0cHV0KTsKKyAgICAgIGludCBvID0gRlhTWVNfcm91bmQob3V0cHV0WzBdICogMjU1KTsKKyAgICAgIGlmIChvICE9IHYpCisgICAgICAgIGJJZGVudGl0eSA9IEZBTFNFOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgcFRyYW5zZmVyLT5tX1NhbXBsZXNbaSAqIDI1NiArIHZdID0gbzsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgaWYgKHBGdW5jc1tpXSAmJiBwRnVuY3NbaV0tPkNvdW50T3V0cHV0cygpIDw9IGtNYXhPdXRwdXRzKSB7CisgICAgICAgICAgcEZ1bmNzW2ldLT5DYWxsKCZpbnB1dCwgMSwgb3V0cHV0LCBub3V0cHV0KTsKKyAgICAgICAgICBpbnQgbyA9IEZYU1lTX3JvdW5kKG91dHB1dFswXSAqIDI1NSk7CisgICAgICAgICAgaWYgKG8gIT0gdikKKyAgICAgICAgICAgIGJJZGVudGl0eSA9IEZBTFNFOworICAgICAgICAgIHBUcmFuc2Zlci0+bV9TYW1wbGVzW2kgKiAyNTYgKyB2XSA9IG87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcFRyYW5zZmVyLT5tX1NhbXBsZXNbaSAqIDI1NiArIHZdID0gdjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHBUcmFuc2Zlci0+bV9iSWRlbnRpdHkgPSBiSWRlbnRpdHk7CisgIHJldHVybiBwVHJhbnNmZXJDb3VudGVyLT5BZGRSZWYoKTsKIH0KKwordm9pZCBDUERGX0RvY1JlbmRlckRhdGE6OlJlbGVhc2VUcmFuc2ZlckZ1bmMoQ1BERl9PYmplY3QqIHBPYmopIHsKKyAgYXV0byBpdCA9IG1fVHJhbnNmZXJGdW5jTWFwLmZpbmQocE9iaik7CisgIGlmIChpdCAhPSBtX1RyYW5zZmVyRnVuY01hcC5lbmQoKSkKKyAgICBpdC0+c2Vjb25kLT5SZW1vdmVSZWYoKTsKK30KK0NQREZfUmVuZGVyQ29uZmlnOjpDUERGX1JlbmRlckNvbmZpZygpIHsKKyAgbV9IYWxmdG9uZUxpbWl0ID0gMDsKKyAgbV9SZW5kZXJTdGVwTGltaXQgPSAxMDA7Cit9CitDUERGX1JlbmRlckNvbmZpZzo6fkNQREZfUmVuZGVyQ29uZmlnKCkge30KKwogQ1BERl9EZXZpY2VCdWZmZXI6OkNQREZfRGV2aWNlQnVmZmVyKCkKLXsKLSAgICBtX3BCaXRtYXAgPSBOVUxMOwotICAgIG1fcERldmljZSA9IE5VTEw7Ci0gICAgbV9wQ29udGV4dCA9IE5VTEw7Ci0gICAgbV9wT2JqZWN0ID0gTlVMTDsKKyAgICA6IG1fcERldmljZShudWxscHRyKSwgbV9wQ29udGV4dChudWxscHRyKSwgbV9wT2JqZWN0KG51bGxwdHIpIHt9CisKK0NQREZfRGV2aWNlQnVmZmVyOjp+Q1BERl9EZXZpY2VCdWZmZXIoKSB7CiB9Ci1DUERGX0RldmljZUJ1ZmZlcjo6fkNQREZfRGV2aWNlQnVmZmVyKCkKLXsKLSAgICBpZiAobV9wQml0bWFwKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BCaXRtYXA7Ci0gICAgfQotfQotRlhfQk9PTCBDUERGX0RldmljZUJ1ZmZlcjo6SW5pdGlhbGl6ZShDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBGWF9SRUNUKiBwUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBpbnQgbWF4X2RwaSkKLXsKLSAgICBtX3BEZXZpY2UgPSBwRGV2aWNlOwotICAgIG1fcENvbnRleHQgPSBwQ29udGV4dDsKLSAgICBtX1JlY3QgPSAqcFJlY3Q7Ci0gICAgbV9wT2JqZWN0ID0gcE9iajsKLSAgICBtX01hdHJpeC5UcmFuc2xhdGVJKC1wUmVjdC0+bGVmdCwgLXBSZWN0LT50b3ApOworCitGWF9CT09MIENQREZfRGV2aWNlQnVmZmVyOjpJbml0aWFsaXplKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QqIHBSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfZHBpKSB7CisgIG1fcERldmljZSA9IHBEZXZpY2U7CisgIG1fcENvbnRleHQgPSBwQ29udGV4dDsKKyAgbV9SZWN0ID0gKnBSZWN0OworICBtX3BPYmplY3QgPSBwT2JqOworICBtX01hdHJpeC5UcmFuc2xhdGVJKC1wUmVjdC0+bGVmdCwgLXBSZWN0LT50b3ApOwogI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgaW50IGhvcnpfc2l6ZSA9IHBEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19IT1JaX1NJWkUpOwotICAgIGludCB2ZXJ0X3NpemUgPSBwRGV2aWNlLT5HZXREZXZpY2VDYXBzKEZYRENfVkVSVF9TSVpFKTsKLSAgICBpZiAoaG9yel9zaXplICYmIHZlcnRfc2l6ZSAmJiBtYXhfZHBpKSB7Ci0gICAgICAgIGludCBkcGloID0gcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKSAqIDI1NCAvIChob3J6X3NpemUgKiAxMCk7Ci0gICAgICAgIGludCBkcGl2ID0gcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkgKiAyNTQgLyAodmVydF9zaXplICogMTApOwotICAgICAgICBpZiAoZHBpaCA+IG1heF9kcGkpIHsKLSAgICAgICAgICAgIG1fTWF0cml4LlNjYWxlKChGWF9GTE9BVCkobWF4X2RwaSkgLyBkcGloLCAxLjBmKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZHBpdiA+IG1heF9kcGkpIHsKLSAgICAgICAgICAgIG1fTWF0cml4LlNjYWxlKDEuMGYsIChGWF9GTE9BVCkobWF4X2RwaSkgLyAoRlhfRkxPQVQpZHBpdik7Ci0gICAgICAgIH0KKyAgaW50IGhvcnpfc2l6ZSA9IHBEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19IT1JaX1NJWkUpOworICBpbnQgdmVydF9zaXplID0gcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX1ZFUlRfU0laRSk7CisgIGlmIChob3J6X3NpemUgJiYgdmVydF9zaXplICYmIG1heF9kcGkpIHsKKyAgICBpbnQgZHBpaCA9CisgICAgICAgIHBEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCkgKiAyNTQgLyAoaG9yel9zaXplICogMTApOworICAgIGludCBkcGl2ID0KKyAgICAgICAgcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkgKiAyNTQgLyAodmVydF9zaXplICogMTApOworICAgIGlmIChkcGloID4gbWF4X2RwaSkgeworICAgICAgbV9NYXRyaXguU2NhbGUoKEZYX0ZMT0FUKShtYXhfZHBpKSAvIGRwaWgsIDEuMGYpOwogICAgIH0KKyAgICBpZiAoZHBpdiA+IG1heF9kcGkpIHsKKyAgICAgIG1fTWF0cml4LlNjYWxlKDEuMGYsIChGWF9GTE9BVCkobWF4X2RwaSkgLyAoRlhfRkxPQVQpZHBpdik7CisgICAgfQorICB9CiAjZW5kaWYKLSAgICBDRlhfTWF0cml4IGN0bSA9IG1fcERldmljZS0+R2V0Q1RNKCk7Ci0gICAgRlhfRkxPQVQgZlNjYWxlWCA9IEZYU1lTX2ZhYnMoY3RtLmEpOwotICAgIEZYX0ZMT0FUIGZTY2FsZVkgPSBGWFNZU19mYWJzKGN0bS5kKTsKLSAgICBtX01hdHJpeC5Db25jYXQoZlNjYWxlWCwgMCwgMCwgZlNjYWxlWSwgMCwgMCk7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByZWN0KCpwUmVjdCk7CisgIENGWF9NYXRyaXggY3RtID0gbV9wRGV2aWNlLT5HZXRDVE0oKTsKKyAgRlhfRkxPQVQgZlNjYWxlWCA9IEZYU1lTX2ZhYnMoY3RtLmEpOworICBGWF9GTE9BVCBmU2NhbGVZID0gRlhTWVNfZmFicyhjdG0uZCk7CisgIG1fTWF0cml4LkNvbmNhdChmU2NhbGVYLCAwLCAwLCBmU2NhbGVZLCAwLCAwKTsKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0KCpwUmVjdCk7CisgIG1fTWF0cml4LlRyYW5zZm9ybVJlY3QocmVjdCk7CisgIEZYX1JFQ1QgYml0bWFwX3JlY3QgPSByZWN0LkdldE91dHRlclJlY3QoKTsKKyAgbV9wQml0bWFwLnJlc2V0KG5ldyBDRlhfRElCaXRtYXApOworICBtX3BCaXRtYXAtPkNyZWF0ZShiaXRtYXBfcmVjdC5XaWR0aCgpLCBiaXRtYXBfcmVjdC5IZWlnaHQoKSwgRlhESUJfQXJnYik7CisgIHJldHVybiBUUlVFOworfQordm9pZCBDUERGX0RldmljZUJ1ZmZlcjo6T3V0cHV0VG9EZXZpY2UoKSB7CisgIGlmIChtX3BEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19SRU5ERVJfQ0FQUykgJiBGWFJDX0dFVF9CSVRTKSB7CisgICAgaWYgKG1fTWF0cml4LmEgPT0gMS4wZiAmJiBtX01hdHJpeC5kID09IDEuMGYpIHsKKyAgICAgIG1fcERldmljZS0+U2V0RElCaXRzKG1fcEJpdG1hcC5nZXQoKSwgbV9SZWN0LmxlZnQsIG1fUmVjdC50b3ApOworICAgIH0gZWxzZSB7CisgICAgICBtX3BEZXZpY2UtPlN0cmV0Y2hESUJpdHMobV9wQml0bWFwLmdldCgpLCBtX1JlY3QubGVmdCwgbV9SZWN0LnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1JlY3QuV2lkdGgoKSwgbV9SZWN0LkhlaWdodCgpKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgQ0ZYX0RJQml0bWFwIGJ1ZmZlcjsKKyAgICBtX3BEZXZpY2UtPkNyZWF0ZUNvbXBhdGlibGVCaXRtYXAoJmJ1ZmZlciwgbV9wQml0bWFwLT5HZXRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BCaXRtYXAtPkdldEhlaWdodCgpKTsKKyAgICBtX3BDb250ZXh0LT5HZXRCYWNrZ3JvdW5kKCZidWZmZXIsIG1fcE9iamVjdCwgTlVMTCwgJm1fTWF0cml4KTsKKyAgICBidWZmZXIuQ29tcG9zaXRlQml0bWFwKDAsIDAsIGJ1ZmZlci5HZXRXaWR0aCgpLCBidWZmZXIuR2V0SGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BCaXRtYXAuZ2V0KCksIDAsIDApOworICAgIG1fcERldmljZS0+U3RyZXRjaERJQml0cygmYnVmZmVyLCBtX1JlY3QubGVmdCwgbV9SZWN0LnRvcCwgbV9SZWN0LldpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fUmVjdC5IZWlnaHQoKSk7CisgIH0KK30KKworQ1BERl9TY2FsZWRSZW5kZXJCdWZmZXI6OkNQREZfU2NhbGVkUmVuZGVyQnVmZmVyKCkge30KKworQ1BERl9TY2FsZWRSZW5kZXJCdWZmZXI6On5DUERGX1NjYWxlZFJlbmRlckJ1ZmZlcigpIHt9CisKKyNkZWZpbmUgX0ZQREZBUElfSU1BR0VTSVpFX0xJTUlUXyAoMzAgKiAxMDI0ICogMTAyNCkKK0ZYX0JPT0wgQ1BERl9TY2FsZWRSZW5kZXJCdWZmZXI6OkluaXRpYWxpemUoQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCYgcFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9kcGkpIHsKKyAgbV9wRGV2aWNlID0gcERldmljZTsKKyAgaWYgKG1fcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX1JFTkRFUl9DQVBTKSAmIEZYUkNfR0VUX0JJVFMpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBtX3BDb250ZXh0ID0gcENvbnRleHQ7CisgIG1fUmVjdCA9IHBSZWN0OworICBtX3BPYmplY3QgPSBwT2JqOworICBtX01hdHJpeC5UcmFuc2xhdGVJKC1wUmVjdC5sZWZ0LCAtcFJlY3QudG9wKTsKKyAgaW50IGhvcnpfc2l6ZSA9IHBEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19IT1JaX1NJWkUpOworICBpbnQgdmVydF9zaXplID0gcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX1ZFUlRfU0laRSk7CisgIGlmIChob3J6X3NpemUgJiYgdmVydF9zaXplICYmIG1heF9kcGkpIHsKKyAgICBpbnQgZHBpaCA9CisgICAgICAgIHBEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCkgKiAyNTQgLyAoaG9yel9zaXplICogMTApOworICAgIGludCBkcGl2ID0KKyAgICAgICAgcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkgKiAyNTQgLyAodmVydF9zaXplICogMTApOworICAgIGlmIChkcGloID4gbWF4X2RwaSkgeworICAgICAgbV9NYXRyaXguU2NhbGUoKEZYX0ZMT0FUKShtYXhfZHBpKSAvIGRwaWgsIDEuMGYpOworICAgIH0KKyAgICBpZiAoZHBpdiA+IG1heF9kcGkpIHsKKyAgICAgIG1fTWF0cml4LlNjYWxlKDEuMGYsIChGWF9GTE9BVCkobWF4X2RwaSkgLyAoRlhfRkxPQVQpZHBpdik7CisgICAgfQorICB9CisgIG1fcEJpdG1hcERldmljZS5yZXNldChuZXcgQ0ZYX0Z4Z2VEZXZpY2UpOworICBGWERJQl9Gb3JtYXQgZGliRm9ybWF0ID0gRlhESUJfUmdiOworICBpbnQzMl90IGJwcCA9IDI0OworICBpZiAobV9wRGV2aWNlLT5HZXREZXZpY2VDYXBzKEZYRENfUkVOREVSX0NBUFMpICYgRlhSQ19BTFBIQV9PVVRQVVQpIHsKKyAgICBkaWJGb3JtYXQgPSBGWERJQl9BcmdiOworICAgIGJwcCA9IDMyOworICB9CisgIENGWF9GbG9hdFJlY3QgcmVjdDsKKyAgaW50MzJfdCBpV2lkdGgsIGlIZWlnaHQsIGlQaXRjaDsKKyAgd2hpbGUgKDEpIHsKKyAgICByZWN0ID0gcFJlY3Q7CiAgICAgbV9NYXRyaXguVHJhbnNmb3JtUmVjdChyZWN0KTsKICAgICBGWF9SRUNUIGJpdG1hcF9yZWN0ID0gcmVjdC5HZXRPdXR0ZXJSZWN0KCk7Ci0gICAgbV9wQml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsKLSAgICBtX3BCaXRtYXAtPkNyZWF0ZShiaXRtYXBfcmVjdC5XaWR0aCgpLCBiaXRtYXBfcmVjdC5IZWlnaHQoKSwgRlhESUJfQXJnYik7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgaVdpZHRoID0gYml0bWFwX3JlY3QuV2lkdGgoKTsKKyAgICBpSGVpZ2h0ID0gYml0bWFwX3JlY3QuSGVpZ2h0KCk7CisgICAgaVBpdGNoID0gKGlXaWR0aCAqIGJwcCArIDMxKSAvIDMyICogNDsKKyAgICBpZiAoaVdpZHRoICogaUhlaWdodCA8IDEpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKGlQaXRjaCAqIGlIZWlnaHQgPD0gX0ZQREZBUElfSU1BR0VTSVpFX0xJTUlUXyAmJgorICAgICAgICBtX3BCaXRtYXBEZXZpY2UtPkNyZWF0ZShpV2lkdGgsIGlIZWlnaHQsIGRpYkZvcm1hdCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBtX01hdHJpeC5TY2FsZSgwLjVmLCAwLjVmKTsKKyAgfQorICBtX3BDb250ZXh0LT5HZXRCYWNrZ3JvdW5kKG1fcEJpdG1hcERldmljZS0+R2V0Qml0bWFwKCksIG1fcE9iamVjdCwgcE9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fTWF0cml4KTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci12b2lkIENQREZfRGV2aWNlQnVmZmVyOjpPdXRwdXRUb0RldmljZSgpCi17Ci0gICAgaWYgKG1fcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX1JFTkRFUl9DQVBTKSAmIEZYUkNfR0VUX0JJVFMpIHsKLSAgICAgICAgaWYgKG1fTWF0cml4LmEgPT0gMS4wZiAmJiBtX01hdHJpeC5kID09IDEuMGYpIHsKLSAgICAgICAgICAgIG1fcERldmljZS0+U2V0RElCaXRzKG1fcEJpdG1hcCwgbV9SZWN0LmxlZnQsIG1fUmVjdC50b3ApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9wRGV2aWNlLT5TdHJldGNoRElCaXRzKG1fcEJpdG1hcCwgbV9SZWN0LmxlZnQsIG1fUmVjdC50b3AsIG1fUmVjdC5XaWR0aCgpLCBtX1JlY3QuSGVpZ2h0KCkpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQ0ZYX0RJQml0bWFwIGJ1ZmZlcjsKLSAgICAgICAgbV9wRGV2aWNlLT5DcmVhdGVDb21wYXRpYmxlQml0bWFwKCZidWZmZXIsIG1fcEJpdG1hcC0+R2V0V2lkdGgoKSwgbV9wQml0bWFwLT5HZXRIZWlnaHQoKSk7Ci0gICAgICAgIG1fcENvbnRleHQtPkdldEJhY2tncm91bmQoJmJ1ZmZlciwgbV9wT2JqZWN0LCBOVUxMLCAmbV9NYXRyaXgpOwotICAgICAgICBidWZmZXIuQ29tcG9zaXRlQml0bWFwKDAsIDAsIGJ1ZmZlci5HZXRXaWR0aCgpLCBidWZmZXIuR2V0SGVpZ2h0KCksIG1fcEJpdG1hcCwgMCwgMCk7Ci0gICAgICAgIG1fcERldmljZS0+U3RyZXRjaERJQml0cygmYnVmZmVyLCBtX1JlY3QubGVmdCwgbV9SZWN0LnRvcCwgbV9SZWN0LldpZHRoKCksIG1fUmVjdC5IZWlnaHQoKSk7Ci0gICAgfQordm9pZCBDUERGX1NjYWxlZFJlbmRlckJ1ZmZlcjo6T3V0cHV0VG9EZXZpY2UoKSB7CisgIGlmIChtX3BCaXRtYXBEZXZpY2UpIHsKKyAgICBtX3BEZXZpY2UtPlN0cmV0Y2hESUJpdHMobV9wQml0bWFwRGV2aWNlLT5HZXRCaXRtYXAoKSwgbV9SZWN0LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fUmVjdC50b3AsIG1fUmVjdC5XaWR0aCgpLCBtX1JlY3QuSGVpZ2h0KCkpOworICB9CiB9Ci1DUERGX1NjYWxlZFJlbmRlckJ1ZmZlcjo6Q1BERl9TY2FsZWRSZW5kZXJCdWZmZXIoKQotewotICAgIG1fcEJpdG1hcERldmljZSA9IE5VTEw7Ci19Ci1DUERGX1NjYWxlZFJlbmRlckJ1ZmZlcjo6fkNQREZfU2NhbGVkUmVuZGVyQnVmZmVyKCkKLXsKLSAgICBpZiAobV9wQml0bWFwRGV2aWNlKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BCaXRtYXBEZXZpY2U7CitGWF9CT09MIElQREZfT0NDb250ZXh0OjpDaGVja09iamVjdFZpc2libGUoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqKSB7CisgIGNvbnN0IENQREZfQ29udGVudE1hcmtEYXRhKiBwRGF0YSA9IHBPYmotPm1fQ29udGVudE1hcms7CisgIGludCBuSXRlbXMgPSBwRGF0YS0+Q291bnRJdGVtcygpOworICBmb3IgKGludCBpID0gMDsgaSA8IG5JdGVtczsgaSsrKSB7CisgICAgQ1BERl9Db250ZW50TWFya0l0ZW0mIGl0ZW0gPSBwRGF0YS0+R2V0SXRlbShpKTsKKyAgICBpZiAoaXRlbS5HZXROYW1lKCkgPT0gIk9DIiAmJgorICAgICAgICBpdGVtLkdldFBhcmFtVHlwZSgpID09IENQREZfQ29udGVudE1hcmtJdGVtOjpQcm9wZXJ0aWVzRGljdCkgeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwT0NHID0KKyAgICAgICAgICBUb0RpY3Rpb25hcnkoc3RhdGljX2Nhc3Q8Q1BERl9PYmplY3QqPihpdGVtLkdldFBhcmFtKCkpKTsKKyAgICAgIGlmICghQ2hlY2tPQ0dWaXNpYmxlKHBPQ0cpKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KICAgICB9Ci19Ci0jZGVmaW5lIF9GUERGQVBJX0lNQUdFU0laRV9MSU1JVF8JKDMwICogMTAyNCAqIDEwMjQpCi1GWF9CT09MIENQREZfU2NhbGVkUmVuZGVyQnVmZmVyOjpJbml0aWFsaXplKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIEZYX1JFQ1QqIHBSZWN0LAotICAgICAgICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyAqcE9wdGlvbnMsIGludCBtYXhfZHBpKQotewotICAgIEZYU1lTX2Fzc2VydChwUmVjdCAhPSBOVUxMKTsKLSAgICBtX3BEZXZpY2UgPSBwRGV2aWNlOwotICAgIGlmIChtX3BEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19SRU5ERVJfQ0FQUykgJiBGWFJDX0dFVF9CSVRTKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBtX3BDb250ZXh0ID0gcENvbnRleHQ7Ci0gICAgbV9SZWN0ID0gKnBSZWN0OwotICAgIG1fcE9iamVjdCA9IHBPYmo7Ci0gICAgbV9NYXRyaXguVHJhbnNsYXRlSSgtcFJlY3QtPmxlZnQsIC1wUmVjdC0+dG9wKTsKLSAgICBpbnQgaG9yel9zaXplID0gcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX0hPUlpfU0laRSk7Ci0gICAgaW50IHZlcnRfc2l6ZSA9IHBEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19WRVJUX1NJWkUpOwotICAgIGlmIChob3J6X3NpemUgJiYgdmVydF9zaXplICYmIG1heF9kcGkpIHsKLSAgICAgICAgaW50IGRwaWggPSBwRGV2aWNlLT5HZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpICogMjU0IC8gKGhvcnpfc2l6ZSAqIDEwKTsKLSAgICAgICAgaW50IGRwaXYgPSBwRGV2aWNlLT5HZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSAqIDI1NCAvICh2ZXJ0X3NpemUgKiAxMCk7Ci0gICAgICAgIGlmIChkcGloID4gbWF4X2RwaSkgewotICAgICAgICAgICAgbV9NYXRyaXguU2NhbGUoKEZYX0ZMT0FUKShtYXhfZHBpKSAvIGRwaWgsIDEuMGYpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkcGl2ID4gbWF4X2RwaSkgewotICAgICAgICAgICAgbV9NYXRyaXguU2NhbGUoMS4wZiwgKEZYX0ZMT0FUKShtYXhfZHBpKSAvIChGWF9GTE9BVClkcGl2KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtX3BCaXRtYXBEZXZpY2UgPSBuZXcgQ0ZYX0Z4Z2VEZXZpY2U7Ci0gICAgRlhESUJfRm9ybWF0IGRpYkZvcm1hdCA9IEZYRElCX1JnYjsKLSAgICBGWF9JTlQzMiBicHAgPSAyNDsKLSAgICBpZiAobV9wRGV2aWNlLT5HZXREZXZpY2VDYXBzKEZYRENfUkVOREVSX0NBUFMpICYgRlhSQ19BTFBIQV9PVVRQVVQpIHsKLSAgICAgICAgZGliRm9ybWF0ID0gRlhESUJfQXJnYjsKLSAgICAgICAgYnBwID0gMzI7Ci0gICAgfQotICAgIENGWF9GbG9hdFJlY3QgcmVjdDsKLSAgICBGWF9JTlQzMiBpV2lkdGgsIGlIZWlnaHQsIGlQaXRjaDsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICByZWN0ID0gKnBSZWN0OwotICAgICAgICBtX01hdHJpeC5UcmFuc2Zvcm1SZWN0KHJlY3QpOwotICAgICAgICBGWF9SRUNUIGJpdG1hcF9yZWN0ID0gcmVjdC5HZXRPdXR0ZXJSZWN0KCk7Ci0gICAgICAgIGlXaWR0aCA9IGJpdG1hcF9yZWN0LldpZHRoKCk7Ci0gICAgICAgIGlIZWlnaHQgPSBiaXRtYXBfcmVjdC5IZWlnaHQoKTsKLSAgICAgICAgaVBpdGNoID0gKGlXaWR0aCAqIGJwcCArIDMxKSAvIDMyICogNDsKLSAgICAgICAgaWYgKGlXaWR0aCAqIGlIZWlnaHQgPCAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlQaXRjaCAqIGlIZWlnaHQgPD0gX0ZQREZBUElfSU1BR0VTSVpFX0xJTUlUXyAmJgotICAgICAgICAgICAgICAgIG1fcEJpdG1hcERldmljZS0+Q3JlYXRlKGlXaWR0aCwgaUhlaWdodCwgZGliRm9ybWF0KSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbV9NYXRyaXguU2NhbGUoMC41ZiwgMC41Zik7Ci0gICAgfQotICAgIG1fcENvbnRleHQtPkdldEJhY2tncm91bmQobV9wQml0bWFwRGV2aWNlLT5HZXRCaXRtYXAoKSwgbV9wT2JqZWN0LCBwT3B0aW9ucywgJm1fTWF0cml4KTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLXZvaWQgQ1BERl9TY2FsZWRSZW5kZXJCdWZmZXI6Ok91dHB1dFRvRGV2aWNlKCkKLXsKLSAgICBpZiAobV9wQml0bWFwRGV2aWNlKSB7Ci0gICAgICAgIG1fcERldmljZS0+U3RyZXRjaERJQml0cyhtX3BCaXRtYXBEZXZpY2UtPkdldEJpdG1hcCgpLCBtX1JlY3QubGVmdCwgbV9SZWN0LnRvcCwgbV9SZWN0LldpZHRoKCksIG1fUmVjdC5IZWlnaHQoKSk7Ci0gICAgfQotfQotRlhfQk9PTCBJUERGX09DQ29udGV4dDo6Q2hlY2tPYmplY3RWaXNpYmxlKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaikKLXsKLSAgICBjb25zdCBDUERGX0NvbnRlbnRNYXJrRGF0YSogcERhdGEgPSBwT2JqLT5tX0NvbnRlbnRNYXJrOwotICAgIGludCBuSXRlbXMgPSBwRGF0YS0+Q291bnRJdGVtcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkl0ZW1zOyBpICsrKSB7Ci0gICAgICAgIENQREZfQ29udGVudE1hcmtJdGVtJiBpdGVtID0gcERhdGEtPkdldEl0ZW0oaSk7Ci0gICAgICAgIGlmIChpdGVtLkdldE5hbWUoKSA9PSBGWF9CU1RSQygiT0MiKSAmJiBpdGVtLkdldFBhcmFtVHlwZSgpID09IENQREZfQ29udGVudE1hcmtJdGVtOjpQcm9wZXJ0aWVzRGljdCkgewotICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwT0NHID0gKENQREZfRGljdGlvbmFyeSopaXRlbS5HZXRQYXJhbSgpOwotICAgICAgICAgICAgaWYgKCFDaGVja09DR1Zpc2libGUocE9DRykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2NhY2hlLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfY2FjaGUuY3BwCmluZGV4IDgzZDVmMGEuLjNlNWUyNzAgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfY2FjaGUuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfY2FjaGUuY3BwCkBAIC0xLDM1NSArMSwzNDEgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3JlbmRlci5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2VvYmouaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKLSNpbmNsdWRlICIuLi9mcGRmX3BhZ2UvcGFnZWludC5oIgogI2luY2x1ZGUgInJlbmRlcl9pbnQuaCIKLXN0cnVjdCBDQUNIRUlORk8gewotICAgIEZYX0RXT1JEIHRpbWU7Ci0gICAgQ1BERl9TdHJlYW0qIHBTdHJlYW07Ci19OwotZXh0ZXJuICJDIiB7Ci0gICAgc3RhdGljIGludCBjb21wYXJlKGNvbnN0IHZvaWQqIGRhdGExLCBjb25zdCB2b2lkKiBkYXRhMikKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKENBQ0hFSU5GTyopZGF0YTEpLT50aW1lIC0gKChDQUNIRUlORk8qKWRhdGEyKS0+dGltZTsKLSAgICB9Ci19Owotdm9pZCBDUERGX1BhZ2U6OkNsZWFyUmVuZGVyQ2FjaGUoKQotewotICAgIGlmIChtX3BQYWdlUmVuZGVyKSB7Ci0gICAgICAgIG1fcFBhZ2VSZW5kZXItPkNsZWFyQWxsKCk7Ci0gICAgfQotfQotdm9pZCBDUERGX1BhZ2VSZW5kZXJDYWNoZTo6Q2xlYXJBbGwoKQotewotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fSW1hZ2VDYWNoZXMuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgRlhfTFBWT0lEIGtleSwgdmFsdWU7Ci0gICAgICAgIG1fSW1hZ2VDYWNoZXMuR2V0TmV4dEFzc29jKHBvcywga2V5LCB2YWx1ZSk7Ci0gICAgICAgIGRlbGV0ZSAoQ1BERl9JbWFnZUNhY2hlKil2YWx1ZTsKLSAgICB9Ci0gICAgbV9JbWFnZUNhY2hlcy5SZW1vdmVBbGwoKTsKLSAgICBtX25DYWNoZVNpemUgPSAwOwotICAgIG1fblRpbWVDb3VudCA9IDA7Ci19Ci12b2lkIENQREZfUGFnZVJlbmRlckNhY2hlOjpDYWNoZU9wdGltaXphdGlvbihGWF9JTlQzMiBkd0xpbWl0Q2FjaGVTaXplKQotewotICAgIGlmIChtX25DYWNoZVNpemUgPD0gKEZYX0RXT1JEKWR3TGltaXRDYWNoZVNpemUpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgbkNvdW50ID0gbV9JbWFnZUNhY2hlcy5HZXRDb3VudCgpOwotICAgIENBQ0hFSU5GTyogcENBQ0hFSU5GTyA9IChDQUNIRUlORk8qKUZYX0FsbG9jMkQoRlhfQllURSwgc2l6ZW9mKENBQ0hFSU5GTyksIG5Db3VudCk7Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9JbWFnZUNhY2hlcy5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgaW50IGkgPSAwOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgRlhfTFBWT0lEIGtleSwgdmFsdWU7Ci0gICAgICAgIG1fSW1hZ2VDYWNoZXMuR2V0TmV4dEFzc29jKHBvcywga2V5LCB2YWx1ZSk7Ci0gICAgICAgIHBDQUNIRUlORk9baV0udGltZSA9ICgoQ1BERl9JbWFnZUNhY2hlKil2YWx1ZSktPkdldFRpbWVDb3VudCgpOwotICAgICAgICBwQ0FDSEVJTkZPW2krK10ucFN0cmVhbSA9ICgoQ1BERl9JbWFnZUNhY2hlKil2YWx1ZSktPkdldFN0cmVhbSgpOwotICAgIH0KLSAgICBGWFNZU19xc29ydChwQ0FDSEVJTkZPLCBuQ291bnQsIHNpemVvZiAoQ0FDSEVJTkZPKSwgY29tcGFyZSk7Ci0gICAgRlhfRFdPUkQgblRpbWVDb3VudCA9IG1fblRpbWVDb3VudDsKLSAgICBpZiAoblRpbWVDb3VudCArIDEgPCBuVGltZUNvdW50KSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBuQ291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgICgoQ1BERl9JbWFnZUNhY2hlKikobV9JbWFnZUNhY2hlc1twQ0FDSEVJTkZPW2ldLnBTdHJlYW1dKSktPm1fZHdUaW1lQ291bnQgPSBpOwotICAgICAgICB9Ci0gICAgICAgIG1fblRpbWVDb3VudCA9IG5Db3VudDsKLSAgICB9Ci0gICAgaSA9IDA7Ci0gICAgd2hpbGUobkNvdW50ID4gMTUpIHsKLSAgICAgICAgQ2xlYXJJbWFnZUNhY2hlKHBDQUNIRUlORk9baSsrXS5wU3RyZWFtKTsKLSAgICAgICAgbkNvdW50LS07Ci0gICAgfQotICAgIHdoaWxlIChtX25DYWNoZVNpemUgPiAoRlhfRFdPUkQpZHdMaW1pdENhY2hlU2l6ZSkgewotICAgICAgICBDbGVhckltYWdlQ2FjaGUocENBQ0hFSU5GT1tpKytdLnBTdHJlYW0pOwotICAgIH0KLSAgICBGWF9GcmVlKHBDQUNIRUlORk8pOwotfQotdm9pZCBDUERGX1BhZ2VSZW5kZXJDYWNoZTo6Q2xlYXJJbWFnZUNhY2hlKENQREZfU3RyZWFtKiBwU3RyZWFtKQotewotICAgIEZYX0xQVk9JRCB2YWx1ZSA9IG1fSW1hZ2VDYWNoZXMuR2V0VmFsdWVBdChwU3RyZWFtKTsKLSAgICBpZiAodmFsdWUgPT0gTlVMTCkJewotICAgICAgICBtX0ltYWdlQ2FjaGVzLlJlbW92ZUtleShwU3RyZWFtKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX25DYWNoZVNpemUgLT0gKChDUERGX0ltYWdlQ2FjaGUqKXZhbHVlKS0+RXN0aW1hdGVTaXplKCk7Ci0gICAgZGVsZXRlIChDUERGX0ltYWdlQ2FjaGUqKXZhbHVlOwotICAgIG1fSW1hZ2VDYWNoZXMuUmVtb3ZlS2V5KHBTdHJlYW0pOwotfQotRlhfRFdPUkQgQ1BERl9QYWdlUmVuZGVyQ2FjaGU6OkVzdGltYXRlU2l6ZSgpCi17Ci0gICAgRlhfRFdPUkQgZHdTaXplID0gMDsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBtX0ltYWdlQ2FjaGVzLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIEZYX0xQVk9JRCBrZXksIHZhbHVlOwotICAgICAgICBtX0ltYWdlQ2FjaGVzLkdldE5leHRBc3NvYyhwb3MsIGtleSwgdmFsdWUpOwotICAgICAgICBkd1NpemUgKz0gKChDUERGX0ltYWdlQ2FjaGUqKXZhbHVlKS0+RXN0aW1hdGVTaXplKCk7Ci0gICAgfQotICAgIG1fbkNhY2hlU2l6ZSA9IGR3U2l6ZTsKLSAgICByZXR1cm4gZHdTaXplOwotfQotRlhfRFdPUkQgQ1BERl9QYWdlUmVuZGVyQ2FjaGU6OkdldENhY2hlZFNpemUoQ1BERl9TdHJlYW0qIHBTdHJlYW0pIGNvbnN0Ci17Ci0gICAgaWYgKHBTdHJlYW0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gbV9uQ2FjaGVTaXplOwotICAgIH0KLSAgICBDUERGX0ltYWdlQ2FjaGUqIHBJbWFnZUNhY2hlOwotICAgIGlmICghbV9JbWFnZUNhY2hlcy5Mb29rdXAocFN0cmVhbSwgKEZYX0xQVk9JRCYpcEltYWdlQ2FjaGUpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gcEltYWdlQ2FjaGUtPkVzdGltYXRlU2l6ZSgpOwotfQotdm9pZCBDUERGX1BhZ2VSZW5kZXJDYWNoZTo6R2V0Q2FjaGVkQml0bWFwKENQREZfU3RyZWFtKiBwU3RyZWFtLCBDRlhfRElCU291cmNlKiYgcEJpdG1hcCwgQ0ZYX0RJQlNvdXJjZSomIHBNYXNrLCBGWF9EV09SRCYgTWF0dGVDb2xvciwKLSAgICAgICAgRlhfQk9PTCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBGWF9CT09MIGJMb2FkTWFzaywgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMsCi0gICAgICAgIEZYX0lOVDMyIGRvd25zYW1wbGVXaWR0aCwgRlhfSU5UMzIgZG93bnNhbXBsZUhlaWdodCkKLXsKLSAgICBDUERGX0ltYWdlQ2FjaGUqIHBJbWFnZUNhY2hlOwotICAgIEZYX0JPT0wgYkZpbmQgPSBtX0ltYWdlQ2FjaGVzLkxvb2t1cChwU3RyZWFtLCAoRlhfTFBWT0lEJilwSW1hZ2VDYWNoZSk7Ci0gICAgaWYgKCFiRmluZCkgewotICAgICAgICBwSW1hZ2VDYWNoZSA9IG5ldyBDUERGX0ltYWdlQ2FjaGUobV9wUGFnZS0+bV9wRG9jdW1lbnQsIHBTdHJlYW0pOwotICAgIH0KLSAgICBtX25UaW1lQ291bnQgKys7Ci0gICAgRlhfQk9PTCBiQ2FjaGVkID0gcEltYWdlQ2FjaGUtPkdldENhY2hlZEJpdG1hcChwQml0bWFwLCBwTWFzaywgTWF0dGVDb2xvciwgbV9wUGFnZS0+bV9wUGFnZVJlc291cmNlcywgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrLCBwUmVuZGVyU3RhdHVzLCBkb3duc2FtcGxlV2lkdGgsIGRvd25zYW1wbGVIZWlnaHQpOwotICAgIGlmICghYkZpbmQpIHsKLSAgICAgICAgbV9JbWFnZUNhY2hlcy5TZXRBdChwU3RyZWFtLCBwSW1hZ2VDYWNoZSk7Ci0gICAgfQotICAgIGlmICghYkNhY2hlZCkgewotICAgICAgICBtX25DYWNoZVNpemUgKz0gcEltYWdlQ2FjaGUtPkVzdGltYXRlU2l6ZSgpOwotICAgIH0KLX0KLUZYX0JPT0wJQ1BERl9QYWdlUmVuZGVyQ2FjaGU6OlN0YXJ0R2V0Q2FjaGVkQml0bWFwKENQREZfU3RyZWFtKiBwU3RyZWFtLCBGWF9CT09MIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIEZYX0JPT0wgYkxvYWRNYXNrLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cywgRlhfSU5UMzIgZG93bnNhbXBsZVdpZHRoLCBGWF9JTlQzMiBkb3duc2FtcGxlSGVpZ2h0KQotewotICAgIG1fYkN1ckZpbmRDYWNoZSA9IG1fSW1hZ2VDYWNoZXMuTG9va3VwKHBTdHJlYW0sIChGWF9MUFZPSUQmKW1fcEN1ckltYWdlQ2FjaGUpOwotICAgIGlmICghbV9iQ3VyRmluZENhY2hlKSB7Ci0gICAgICAgIG1fcEN1ckltYWdlQ2FjaGUgPSBuZXcgQ1BERl9JbWFnZUNhY2hlKG1fcFBhZ2UtPm1fcERvY3VtZW50LCBwU3RyZWFtKTsKLSAgICB9Ci0gICAgaW50IHJldCA9IG1fcEN1ckltYWdlQ2FjaGUtPlN0YXJ0R2V0Q2FjaGVkQml0bWFwKHBSZW5kZXJTdGF0dXMtPm1fcEZvcm1SZXNvdXJjZSwgbV9wUGFnZS0+bV9wUGFnZVJlc291cmNlcywgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrLCBwUmVuZGVyU3RhdHVzLCBkb3duc2FtcGxlV2lkdGgsIGRvd25zYW1wbGVIZWlnaHQpOwotICAgIGlmIChyZXQgPT0gMikgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgbV9uVGltZUNvdW50ICsrOwotICAgIGlmICghbV9iQ3VyRmluZENhY2hlKSB7Ci0gICAgICAgIG1fSW1hZ2VDYWNoZXMuU2V0QXQocFN0cmVhbSwgbV9wQ3VySW1hZ2VDYWNoZSk7Ci0gICAgfQotICAgIGlmICghcmV0KSB7Ci0gICAgICAgIG1fbkNhY2hlU2l6ZSArPSBtX3BDdXJJbWFnZUNhY2hlLT5Fc3RpbWF0ZVNpemUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotRlhfQk9PTAlDUERGX1BhZ2VSZW5kZXJDYWNoZTo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgaW50IHJldCA9IG1fcEN1ckltYWdlQ2FjaGUtPkNvbnRpbnVlKHBQYXVzZSk7Ci0gICAgaWYgKHJldCA9PSAyKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBtX25UaW1lQ291bnQgKys7Ci0gICAgaWYgKCFtX2JDdXJGaW5kQ2FjaGUpIHsKLSAgICAgICAgbV9JbWFnZUNhY2hlcy5TZXRBdChtX3BDdXJJbWFnZUNhY2hlLT5HZXRTdHJlYW0oKSwgbV9wQ3VySW1hZ2VDYWNoZSk7Ci0gICAgfQotICAgIGlmICghcmV0KSB7Ci0gICAgICAgIG1fbkNhY2hlU2l6ZSArPSBtX3BDdXJJbWFnZUNhY2hlLT5Fc3RpbWF0ZVNpemUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotdm9pZCBDUERGX1BhZ2VSZW5kZXJDYWNoZTo6UmVzZXRCaXRtYXAoQ1BERl9TdHJlYW0qIHBTdHJlYW0sIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCkKLXsKLSAgICBDUERGX0ltYWdlQ2FjaGUqIHBJbWFnZUNhY2hlOwotICAgIGlmICghbV9JbWFnZUNhY2hlcy5Mb29rdXAocFN0cmVhbSwgKEZYX0xQVk9JRCYpcEltYWdlQ2FjaGUpKSB7Ci0gICAgICAgIGlmIChwQml0bWFwID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBwSW1hZ2VDYWNoZSA9IG5ldyBDUERGX0ltYWdlQ2FjaGUobV9wUGFnZS0+bV9wRG9jdW1lbnQsIHBTdHJlYW0pOwotICAgICAgICBtX0ltYWdlQ2FjaGVzLlNldEF0KHBTdHJlYW0sIHBJbWFnZUNhY2hlKTsKLSAgICB9Ci0gICAgaW50IG9sZHNpemUgPSBwSW1hZ2VDYWNoZS0+RXN0aW1hdGVTaXplKCk7Ci0gICAgcEltYWdlQ2FjaGUtPlJlc2V0KHBCaXRtYXApOwotICAgIG1fbkNhY2hlU2l6ZSA9IHBJbWFnZUNhY2hlLT5Fc3RpbWF0ZVNpemUoKSAtIG9sZHNpemU7Ci19Ci1DUERGX0ltYWdlQ2FjaGU6OkNQREZfSW1hZ2VDYWNoZShDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX1N0cmVhbSogcFN0cmVhbSkKLSAgICA6IG1fZHdUaW1lQ291bnQoMCkKLSAgICAsIG1fcEN1ckJpdG1hcChOVUxMKQotICAgICwgbV9wQ3VyTWFzayhOVUxMKQotICAgICwgbV9NYXR0ZUNvbG9yKDApCi0gICAgLCBtX3BSZW5kZXJTdGF0dXMoTlVMTCkKLSAgICAsIG1fcERvY3VtZW50KHBEb2MpCi0gICAgLCBtX3BTdHJlYW0ocFN0cmVhbSkKLSAgICAsIG1fcENhY2hlZEJpdG1hcChOVUxMKQotICAgICwgbV9wQ2FjaGVkTWFzayhOVUxMKQotICAgICwgbV9kd0NhY2hlU2l6ZSgwKQotewotfQotQ1BERl9JbWFnZUNhY2hlOjp+Q1BERl9JbWFnZUNhY2hlKCkKLXsKLSAgICBpZiAobV9wQ2FjaGVkQml0bWFwKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BDYWNoZWRCaXRtYXA7Ci0gICAgICAgIG1fcENhY2hlZEJpdG1hcCA9IE5VTEw7Ci0gICAgfQotICAgIGlmIChtX3BDYWNoZWRNYXNrKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BDYWNoZWRNYXNrOwotICAgICAgICBtX3BDYWNoZWRNYXNrID0gTlVMTDsKLSAgICB9Ci19Ci12b2lkIENQREZfSW1hZ2VDYWNoZTo6UmVzZXQoY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwKQotewotICAgIGlmIChtX3BDYWNoZWRCaXRtYXApIHsKLSAgICAgICAgZGVsZXRlIG1fcENhY2hlZEJpdG1hcDsKLSAgICB9Ci0gICAgbV9wQ2FjaGVkQml0bWFwID0gTlVMTDsKLSAgICBpZiAocEJpdG1hcCkgewotICAgICAgICBtX3BDYWNoZWRCaXRtYXAgPSBwQml0bWFwLT5DbG9uZSgpOwotICAgIH0KLSAgICBDYWxjU2l6ZSgpOwotfQotdm9pZCBDUERGX1BhZ2VSZW5kZXJDYWNoZTo6Q2xlYXJJbWFnZURhdGEoKQotewotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fSW1hZ2VDYWNoZXMuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgRlhfTFBWT0lEIGtleSwgdmFsdWU7Ci0gICAgICAgIG1fSW1hZ2VDYWNoZXMuR2V0TmV4dEFzc29jKHBvcywga2V5LCB2YWx1ZSk7Ci0gICAgICAgICgoQ1BERl9JbWFnZUNhY2hlKil2YWx1ZSktPkNsZWFySW1hZ2VEYXRhKCk7Ci0gICAgfQotfQotdm9pZCBDUERGX0ltYWdlQ2FjaGU6OkNsZWFySW1hZ2VEYXRhKCkKLXsKLSAgICBpZiAobV9wQ2FjaGVkQml0bWFwICYmIG1fcENhY2hlZEJpdG1hcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgewotICAgICAgICAoKENQREZfRElCU291cmNlKiltX3BDYWNoZWRCaXRtYXApLT5DbGVhckltYWdlRGF0YSgpOwotICAgIH0KLX0KLXN0YXRpYyBGWF9EV09SRCBGUERGX0ltYWdlQ2FjaGVfRXN0aW1hdGVJbWFnZVNpemUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcERJQikKLXsKLSAgICByZXR1cm4gcERJQiAmJiBwRElCLT5HZXRCdWZmZXIoKSA/IChGWF9EV09SRClwRElCLT5HZXRIZWlnaHQoKSAqIHBESUItPkdldFBpdGNoKCkgKyAoRlhfRFdPUkQpcERJQi0+R2V0UGFsZXR0ZVNpemUoKSAqIDQgOiAwOwotfQotRlhfQk9PTCBDUERGX0ltYWdlQ2FjaGU6OkdldENhY2hlZEJpdG1hcChDRlhfRElCU291cmNlKiYgcEJpdG1hcCwgQ0ZYX0RJQlNvdXJjZSomIHBNYXNrLCBGWF9EV09SRCYgTWF0dGVDb2xvciwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywKLSAgICAgICAgRlhfQk9PTCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBGWF9CT09MIGJMb2FkTWFzaywgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMsCi0gICAgICAgIEZYX0lOVDMyIGRvd25zYW1wbGVXaWR0aCwgRlhfSU5UMzIgZG93bnNhbXBsZUhlaWdodCkKLXsKLSAgICBpZiAobV9wQ2FjaGVkQml0bWFwKSB7Ci0gICAgICAgIHBCaXRtYXAgPSBtX3BDYWNoZWRCaXRtYXA7Ci0gICAgICAgIHBNYXNrID0gbV9wQ2FjaGVkTWFzazsKLSAgICAgICAgTWF0dGVDb2xvciA9IG1fTWF0dGVDb2xvcjsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmICghcFJlbmRlclN0YXR1cykgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENQREZfUmVuZGVyQ29udGV4dCpwQ29udGV4dCA9IHBSZW5kZXJTdGF0dXMtPkdldENvbnRleHQoKTsKLSAgICBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcFBhZ2VSZW5kZXJDYWNoZSA9IHBDb250ZXh0LT5tX3BQYWdlQ2FjaGU7Ci0gICAgbV9kd1RpbWVDb3VudCA9IHBQYWdlUmVuZGVyQ2FjaGUtPkdldFRpbWVDb3VudCgpOwotICAgIENQREZfRElCU291cmNlKiBwU3JjID0gbmV3IENQREZfRElCU291cmNlOwotICAgIENQREZfRElCU291cmNlKiBwTWFza1NyYyA9IE5VTEw7Ci0gICAgaWYgKCFwU3JjLT5Mb2FkKG1fcERvY3VtZW50LCBtX3BTdHJlYW0sICZwTWFza1NyYywgJk1hdHRlQ29sb3IsIHBSZW5kZXJTdGF0dXMtPm1fcEZvcm1SZXNvdXJjZSwgcFBhZ2VSZXNvdXJjZXMsIGJTdGRDUywgR3JvdXBGYW1pbHksIGJMb2FkTWFzaykpIHsKLSAgICAgICAgZGVsZXRlIHBTcmM7Ci0gICAgICAgIHBCaXRtYXAgPSBOVUxMOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fTWF0dGVDb2xvciA9IE1hdHRlQ29sb3I7Ci0gICAgaWYgKHBTcmMtPkdldFBpdGNoKCkgKiBwU3JjLT5HZXRIZWlnaHQoKSA8IEZQREZfSFVHRV9JTUFHRV9TSVpFKSB7Ci0gICAgICAgIG1fcENhY2hlZEJpdG1hcCA9IHBTcmMtPkNsb25lKCk7Ci0gICAgICAgIGRlbGV0ZSBwU3JjOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcENhY2hlZEJpdG1hcCA9IHBTcmM7Ci0gICAgfQotICAgIGlmIChwTWFza1NyYykgewotICAgICAgICBtX3BDYWNoZWRNYXNrID0gcE1hc2tTcmMtPkNsb25lKCk7Ci0gICAgICAgIGRlbGV0ZSBwTWFza1NyYzsKLSAgICB9CiAKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2VvYmouaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3JlbmRlci5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2dlLmgiCisjaW5jbHVkZSAiY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvcGFnZWludC5oIgorCitzdHJ1Y3QgQ0FDSEVJTkZPIHsKKyAgRlhfRFdPUkQgdGltZTsKKyAgQ1BERl9TdHJlYW0qIHBTdHJlYW07Cit9OworCitleHRlcm4gIkMiIHsKK3N0YXRpYyBpbnQgY29tcGFyZShjb25zdCB2b2lkKiBkYXRhMSwgY29uc3Qgdm9pZCogZGF0YTIpIHsKKyAgcmV0dXJuICgoQ0FDSEVJTkZPKilkYXRhMSktPnRpbWUgLSAoKENBQ0hFSU5GTyopZGF0YTIpLT50aW1lOworfQorfSAgLy8gZXh0ZXJuICJDIgorCitDUERGX1BhZ2VSZW5kZXJDYWNoZTo6fkNQREZfUGFnZVJlbmRlckNhY2hlKCkgeworICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogbV9JbWFnZUNhY2hlKQorICAgIGRlbGV0ZSBpdC5zZWNvbmQ7Cit9Cit2b2lkIENQREZfUGFnZVJlbmRlckNhY2hlOjpDYWNoZU9wdGltaXphdGlvbihpbnQzMl90IGR3TGltaXRDYWNoZVNpemUpIHsKKyAgaWYgKG1fbkNhY2hlU2l6ZSA8PSAoRlhfRFdPUkQpZHdMaW1pdENhY2hlU2l6ZSkKKyAgICByZXR1cm47CisKKyAgc2l6ZV90IG5Db3VudCA9IG1fSW1hZ2VDYWNoZS5zaXplKCk7CisgIENBQ0hFSU5GTyogcENBQ0hFSU5GTyA9IEZYX0FsbG9jKENBQ0hFSU5GTywgbkNvdW50KTsKKyAgc2l6ZV90IGkgPSAwOworICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogbV9JbWFnZUNhY2hlKSB7CisgICAgcENBQ0hFSU5GT1tpXS50aW1lID0gaXQuc2Vjb25kLT5HZXRUaW1lQ291bnQoKTsKKyAgICBwQ0FDSEVJTkZPW2krK10ucFN0cmVhbSA9IGl0LnNlY29uZC0+R2V0U3RyZWFtKCk7CisgIH0KKyAgRlhTWVNfcXNvcnQocENBQ0hFSU5GTywgbkNvdW50LCBzaXplb2YoQ0FDSEVJTkZPKSwgY29tcGFyZSk7CisgIEZYX0RXT1JEIG5UaW1lQ291bnQgPSBtX25UaW1lQ291bnQ7CisKKyAgLy8gQ2hlY2sgaWYgdGltZSB2YWx1ZSBpcyBhYm91dCB0byByb2xsIG92ZXIgYW5kIHJlc2V0IGFsbCBlbnRyaWVzLgorICAvLyBUaGUgY29tcGFyaXNpb24gaXMgbGVnYWwgYmVjYXVzZSBGWF9EV09SRCBpcyBhbiB1bnNpZ25lZCB0eXBlLgorICBpZiAoblRpbWVDb3VudCArIDEgPCBuVGltZUNvdW50KSB7CisgICAgZm9yIChpID0gMDsgaSA8IG5Db3VudDsgaSsrKQorICAgICAgbV9JbWFnZUNhY2hlW3BDQUNIRUlORk9baV0ucFN0cmVhbV0tPm1fZHdUaW1lQ291bnQgPSBpOworICAgIG1fblRpbWVDb3VudCA9IG5Db3VudDsKKyAgfQorCisgIGkgPSAwOworICB3aGlsZSAoaSArIDE1IDwgbkNvdW50KQorICAgIENsZWFySW1hZ2VDYWNoZUVudHJ5KHBDQUNIRUlORk9baSsrXS5wU3RyZWFtKTsKKworICB3aGlsZSAoaSA8IG5Db3VudCAmJiBtX25DYWNoZVNpemUgPiAoRlhfRFdPUkQpZHdMaW1pdENhY2hlU2l6ZSkKKyAgICBDbGVhckltYWdlQ2FjaGVFbnRyeShwQ0FDSEVJTkZPW2krK10ucFN0cmVhbSk7CisKKyAgRlhfRnJlZShwQ0FDSEVJTkZPKTsKK30KK3ZvaWQgQ1BERl9QYWdlUmVuZGVyQ2FjaGU6OkNsZWFySW1hZ2VDYWNoZUVudHJ5KENQREZfU3RyZWFtKiBwU3RyZWFtKSB7CisgIGF1dG8gaXQgPSBtX0ltYWdlQ2FjaGUuZmluZChwU3RyZWFtKTsKKyAgaWYgKGl0ID09IG1fSW1hZ2VDYWNoZS5lbmQoKSkKKyAgICByZXR1cm47CisKKyAgbV9uQ2FjaGVTaXplIC09IGl0LT5zZWNvbmQtPkVzdGltYXRlU2l6ZSgpOworICBkZWxldGUgaXQtPnNlY29uZDsKKyAgbV9JbWFnZUNhY2hlLmVyYXNlKGl0KTsKK30KK0ZYX0RXT1JEIENQREZfUGFnZVJlbmRlckNhY2hlOjpFc3RpbWF0ZVNpemUoKSB7CisgIEZYX0RXT1JEIGR3U2l6ZSA9IDA7CisgIGZvciAoY29uc3QgYXV0byYgaXQgOiBtX0ltYWdlQ2FjaGUpCisgICAgZHdTaXplICs9IGl0LnNlY29uZC0+RXN0aW1hdGVTaXplKCk7CisKKyAgbV9uQ2FjaGVTaXplID0gZHdTaXplOworICByZXR1cm4gZHdTaXplOworfQordm9pZCBDUERGX1BhZ2VSZW5kZXJDYWNoZTo6R2V0Q2FjaGVkQml0bWFwKENQREZfU3RyZWFtKiBwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJTb3VyY2UqJiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJTb3VyY2UqJiBwTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgTWF0dGVDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBHcm91cEZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJMb2FkTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRvd25zYW1wbGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRvd25zYW1wbGVIZWlnaHQpIHsKKyAgQ1BERl9JbWFnZUNhY2hlRW50cnkqIHBFbnRyeTsKKyAgY29uc3QgYXV0byBpdCA9IG1fSW1hZ2VDYWNoZS5maW5kKHBTdHJlYW0pOworICBGWF9CT09MIGJGb3VuZCA9IGl0ICE9IG1fSW1hZ2VDYWNoZS5lbmQoKTsKKyAgaWYgKGJGb3VuZCkKKyAgICBwRW50cnkgPSBpdC0+c2Vjb25kOworICBlbHNlCisgICAgcEVudHJ5ID0gbmV3IENQREZfSW1hZ2VDYWNoZUVudHJ5KG1fcFBhZ2UtPm1fcERvY3VtZW50LCBwU3RyZWFtKTsKKworICBtX25UaW1lQ291bnQrKzsKKyAgRlhfQk9PTCBiQWxyZWFkeUNhY2hlZCA9IHBFbnRyeS0+R2V0Q2FjaGVkQml0bWFwKAorICAgICAgcEJpdG1hcCwgcE1hc2ssIE1hdHRlQ29sb3IsIG1fcFBhZ2UtPm1fcFBhZ2VSZXNvdXJjZXMsIGJTdGRDUywKKyAgICAgIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2ssIHBSZW5kZXJTdGF0dXMsIGRvd25zYW1wbGVXaWR0aCwgZG93bnNhbXBsZUhlaWdodCk7CisKKyAgaWYgKCFiRm91bmQpCisgICAgbV9JbWFnZUNhY2hlW3BTdHJlYW1dID0gcEVudHJ5OworCisgIGlmICghYkFscmVhZHlDYWNoZWQpCisgICAgbV9uQ2FjaGVTaXplICs9IHBFbnRyeS0+RXN0aW1hdGVTaXplKCk7Cit9CitGWF9CT09MIENQREZfUGFnZVJlbmRlckNhY2hlOjpTdGFydEdldENhY2hlZEJpdG1hcCgKKyAgICBDUERGX1N0cmVhbSogcFN0cmVhbSwKKyAgICBGWF9CT09MIGJTdGRDUywKKyAgICBGWF9EV09SRCBHcm91cEZhbWlseSwKKyAgICBGWF9CT09MIGJMb2FkTWFzaywKKyAgICBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cywKKyAgICBpbnQzMl90IGRvd25zYW1wbGVXaWR0aCwKKyAgICBpbnQzMl90IGRvd25zYW1wbGVIZWlnaHQpIHsKKyAgY29uc3QgYXV0byBpdCA9IG1fSW1hZ2VDYWNoZS5maW5kKHBTdHJlYW0pOworICBtX2JDdXJGaW5kQ2FjaGUgPSBpdCAhPSBtX0ltYWdlQ2FjaGUuZW5kKCk7CisgIGlmIChtX2JDdXJGaW5kQ2FjaGUpIHsKKyAgICBtX3BDdXJJbWFnZUNhY2hlRW50cnkgPSBpdC0+c2Vjb25kOworICB9IGVsc2UgeworICAgIG1fcEN1ckltYWdlQ2FjaGVFbnRyeSA9CisgICAgICAgIG5ldyBDUERGX0ltYWdlQ2FjaGVFbnRyeShtX3BQYWdlLT5tX3BEb2N1bWVudCwgcFN0cmVhbSk7CisgIH0KKyAgaW50IHJldCA9IG1fcEN1ckltYWdlQ2FjaGVFbnRyeS0+U3RhcnRHZXRDYWNoZWRCaXRtYXAoCisgICAgICBwUmVuZGVyU3RhdHVzLT5tX3BGb3JtUmVzb3VyY2UsIG1fcFBhZ2UtPm1fcFBhZ2VSZXNvdXJjZXMsIGJTdGRDUywKKyAgICAgIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2ssIHBSZW5kZXJTdGF0dXMsIGRvd25zYW1wbGVXaWR0aCwgZG93bnNhbXBsZUhlaWdodCk7CisgIGlmIChyZXQgPT0gMikKKyAgICByZXR1cm4gVFJVRTsKKworICBtX25UaW1lQ291bnQrKzsKKyAgaWYgKCFtX2JDdXJGaW5kQ2FjaGUpCisgICAgbV9JbWFnZUNhY2hlW3BTdHJlYW1dID0gbV9wQ3VySW1hZ2VDYWNoZUVudHJ5OworCisgIGlmICghcmV0KQorICAgIG1fbkNhY2hlU2l6ZSArPSBtX3BDdXJJbWFnZUNhY2hlRW50cnktPkVzdGltYXRlU2l6ZSgpOworCisgIHJldHVybiBGQUxTRTsKK30KK0ZYX0JPT0wgQ1BERl9QYWdlUmVuZGVyQ2FjaGU6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKSB7CisgIGludCByZXQgPSBtX3BDdXJJbWFnZUNhY2hlRW50cnktPkNvbnRpbnVlKHBQYXVzZSk7CisgIGlmIChyZXQgPT0gMikKKyAgICByZXR1cm4gVFJVRTsKKyAgbV9uVGltZUNvdW50Kys7CisgIGlmICghbV9iQ3VyRmluZENhY2hlKQorICAgIG1fSW1hZ2VDYWNoZVttX3BDdXJJbWFnZUNhY2hlRW50cnktPkdldFN0cmVhbSgpXSA9IG1fcEN1ckltYWdlQ2FjaGVFbnRyeTsKKyAgaWYgKCFyZXQpCisgICAgbV9uQ2FjaGVTaXplICs9IG1fcEN1ckltYWdlQ2FjaGVFbnRyeS0+RXN0aW1hdGVTaXplKCk7CisgIHJldHVybiBGQUxTRTsKK30KK3ZvaWQgQ1BERl9QYWdlUmVuZGVyQ2FjaGU6OlJlc2V0Qml0bWFwKENQREZfU3RyZWFtKiBwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwKSB7CisgIENQREZfSW1hZ2VDYWNoZUVudHJ5KiBwRW50cnk7CisgIGNvbnN0IGF1dG8gaXQgPSBtX0ltYWdlQ2FjaGUuZmluZChwU3RyZWFtKTsKKyAgaWYgKGl0ID09IG1fSW1hZ2VDYWNoZS5lbmQoKSkgeworICAgIGlmICghcEJpdG1hcCkKKyAgICAgIHJldHVybjsKKyAgICBwRW50cnkgPSBuZXcgQ1BERl9JbWFnZUNhY2hlRW50cnkobV9wUGFnZS0+bV9wRG9jdW1lbnQsIHBTdHJlYW0pOworICAgIG1fSW1hZ2VDYWNoZVtwU3RyZWFtXSA9IHBFbnRyeTsKKyAgfSBlbHNlIHsKKyAgICBwRW50cnkgPSBpdC0+c2Vjb25kOworICB9CisgIG1fbkNhY2hlU2l6ZSAtPSBwRW50cnktPkVzdGltYXRlU2l6ZSgpOworICBwRW50cnktPlJlc2V0KHBCaXRtYXApOworICBtX25DYWNoZVNpemUgKz0gcEVudHJ5LT5Fc3RpbWF0ZVNpemUoKTsKK30KK0NQREZfSW1hZ2VDYWNoZUVudHJ5OjpDUERGX0ltYWdlQ2FjaGVFbnRyeShDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwU3RyZWFtKQorICAgIDogbV9kd1RpbWVDb3VudCgwKSwKKyAgICAgIG1fcEN1ckJpdG1hcChOVUxMKSwKKyAgICAgIG1fcEN1ck1hc2soTlVMTCksCisgICAgICBtX01hdHRlQ29sb3IoMCksCisgICAgICBtX3BSZW5kZXJTdGF0dXMoTlVMTCksCisgICAgICBtX3BEb2N1bWVudChwRG9jKSwKKyAgICAgIG1fcFN0cmVhbShwU3RyZWFtKSwKKyAgICAgIG1fcENhY2hlZEJpdG1hcChOVUxMKSwKKyAgICAgIG1fcENhY2hlZE1hc2soTlVMTCksCisgICAgICBtX2R3Q2FjaGVTaXplKDApIHt9CitDUERGX0ltYWdlQ2FjaGVFbnRyeTo6fkNQREZfSW1hZ2VDYWNoZUVudHJ5KCkgeworICBkZWxldGUgbV9wQ2FjaGVkQml0bWFwOworICBkZWxldGUgbV9wQ2FjaGVkTWFzazsKK30KK3ZvaWQgQ1BERl9JbWFnZUNhY2hlRW50cnk6OlJlc2V0KGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCkgeworICBkZWxldGUgbV9wQ2FjaGVkQml0bWFwOworICBtX3BDYWNoZWRCaXRtYXAgPSBOVUxMOworICBpZiAocEJpdG1hcCkgeworICAgIG1fcENhY2hlZEJpdG1hcCA9IHBCaXRtYXAtPkNsb25lKCk7CisgIH0KKyAgQ2FsY1NpemUoKTsKK30KK3ZvaWQgQ1BERl9QYWdlUmVuZGVyQ2FjaGU6OkNsZWFySW1hZ2VEYXRhKCkgeworICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogbV9JbWFnZUNhY2hlKQorICAgIGl0LnNlY29uZC0+Q2xlYXJJbWFnZURhdGEoKTsKK30KK3ZvaWQgQ1BERl9JbWFnZUNhY2hlRW50cnk6OkNsZWFySW1hZ2VEYXRhKCkgeworICBpZiAobV9wQ2FjaGVkQml0bWFwICYmICFtX3BDYWNoZWRCaXRtYXAtPkdldEJ1ZmZlcigpKSB7CisgICAgKChDUERGX0RJQlNvdXJjZSopbV9wQ2FjaGVkQml0bWFwKS0+Q2xlYXJJbWFnZURhdGEoKTsKKyAgfQorfQorc3RhdGljIEZYX0RXT1JEIEZQREZfSW1hZ2VDYWNoZV9Fc3RpbWF0ZUltYWdlU2l6ZShjb25zdCBDRlhfRElCU291cmNlKiBwRElCKSB7CisgIHJldHVybiBwRElCICYmIHBESUItPkdldEJ1ZmZlcigpCisgICAgICAgICAgICAgPyAoRlhfRFdPUkQpcERJQi0+R2V0SGVpZ2h0KCkgKiBwRElCLT5HZXRQaXRjaCgpICsKKyAgICAgICAgICAgICAgICAgICAoRlhfRFdPUkQpcERJQi0+R2V0UGFsZXR0ZVNpemUoKSAqIDQKKyAgICAgICAgICAgICA6IDA7Cit9CitGWF9CT09MIENQREZfSW1hZ2VDYWNoZUVudHJ5OjpHZXRDYWNoZWRCaXRtYXAoQ0ZYX0RJQlNvdXJjZSomIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQlNvdXJjZSomIHBNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBNYXR0ZUNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgR3JvdXBGYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTG9hZE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkb3duc2FtcGxlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkb3duc2FtcGxlSGVpZ2h0KSB7CisgIGlmIChtX3BDYWNoZWRCaXRtYXApIHsKICAgICBwQml0bWFwID0gbV9wQ2FjaGVkQml0bWFwOwogICAgIHBNYXNrID0gbV9wQ2FjaGVkTWFzazsKLSAgICBDYWxjU2l6ZSgpOworICAgIE1hdHRlQ29sb3IgPSBtX01hdHRlQ29sb3I7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKCFwUmVuZGVyU3RhdHVzKSB7CiAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQgPSBwUmVuZGVyU3RhdHVzLT5HZXRDb250ZXh0KCk7CisgIENQREZfUGFnZVJlbmRlckNhY2hlKiBwUGFnZVJlbmRlckNhY2hlID0gcENvbnRleHQtPkdldFBhZ2VDYWNoZSgpOworICBtX2R3VGltZUNvdW50ID0gcFBhZ2VSZW5kZXJDYWNoZS0+R2V0VGltZUNvdW50KCk7CisgIENQREZfRElCU291cmNlKiBwU3JjID0gbmV3IENQREZfRElCU291cmNlOworICBDUERGX0RJQlNvdXJjZSogcE1hc2tTcmMgPSBOVUxMOworICBpZiAoIXBTcmMtPkxvYWQobV9wRG9jdW1lbnQsIG1fcFN0cmVhbSwgJnBNYXNrU3JjLCAmTWF0dGVDb2xvciwKKyAgICAgICAgICAgICAgICAgIHBSZW5kZXJTdGF0dXMtPm1fcEZvcm1SZXNvdXJjZSwgcFBhZ2VSZXNvdXJjZXMsIGJTdGRDUywKKyAgICAgICAgICAgICAgICAgIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2spKSB7CisgICAgZGVsZXRlIHBTcmM7CisgICAgcEJpdG1hcCA9IE5VTEw7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fTWF0dGVDb2xvciA9IE1hdHRlQ29sb3I7CisgIGlmIChwU3JjLT5HZXRQaXRjaCgpICogcFNyYy0+R2V0SGVpZ2h0KCkgPCBGUERGX0hVR0VfSU1BR0VfU0laRSkgeworICAgIG1fcENhY2hlZEJpdG1hcCA9IHBTcmMtPkNsb25lKCk7CisgICAgZGVsZXRlIHBTcmM7CisgIH0gZWxzZSB7CisgICAgbV9wQ2FjaGVkQml0bWFwID0gcFNyYzsKKyAgfQorICBpZiAocE1hc2tTcmMpIHsKKyAgICBtX3BDYWNoZWRNYXNrID0gcE1hc2tTcmMtPkNsb25lKCk7CisgICAgZGVsZXRlIHBNYXNrU3JjOworICB9CisKKyAgcEJpdG1hcCA9IG1fcENhY2hlZEJpdG1hcDsKKyAgcE1hc2sgPSBtX3BDYWNoZWRNYXNrOworICBDYWxjU2l6ZSgpOworICByZXR1cm4gRkFMU0U7CiB9Ci1DRlhfRElCU291cmNlKiBDUERGX0ltYWdlQ2FjaGU6OkRldGFjaEJpdG1hcCgpCi17Ci0gICAgQ0ZYX0RJQlNvdXJjZSogcERJQlNvdXJjZSA9IG1fcEN1ckJpdG1hcDsKLSAgICBtX3BDdXJCaXRtYXAgPSBOVUxMOwotICAgIHJldHVybiBwRElCU291cmNlOworQ0ZYX0RJQlNvdXJjZSogQ1BERl9JbWFnZUNhY2hlRW50cnk6OkRldGFjaEJpdG1hcCgpIHsKKyAgQ0ZYX0RJQlNvdXJjZSogcERJQlNvdXJjZSA9IG1fcEN1ckJpdG1hcDsKKyAgbV9wQ3VyQml0bWFwID0gTlVMTDsKKyAgcmV0dXJuIHBESUJTb3VyY2U7CiB9Ci1DRlhfRElCU291cmNlKiBDUERGX0ltYWdlQ2FjaGU6OkRldGFjaE1hc2soKQotewotICAgIENGWF9ESUJTb3VyY2UqIHBESUJTb3VyY2UgPSBtX3BDdXJNYXNrOwotICAgIG1fcEN1ck1hc2sgPSBOVUxMOwotICAgIHJldHVybiBwRElCU291cmNlOworQ0ZYX0RJQlNvdXJjZSogQ1BERl9JbWFnZUNhY2hlRW50cnk6OkRldGFjaE1hc2soKSB7CisgIENGWF9ESUJTb3VyY2UqIHBESUJTb3VyY2UgPSBtX3BDdXJNYXNrOworICBtX3BDdXJNYXNrID0gTlVMTDsKKyAgcmV0dXJuIHBESUJTb3VyY2U7CiB9Ci1pbnQJQ1BERl9JbWFnZUNhY2hlOjpTdGFydEdldENhY2hlZEJpdG1hcChDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2VzLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLCBGWF9CT09MIGJTdGRDUywKLSAgICAgICAgRlhfRFdPUkQgR3JvdXBGYW1pbHksIEZYX0JPT0wgYkxvYWRNYXNrLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cywKLSAgICAgICAgRlhfSU5UMzIgZG93bnNhbXBsZVdpZHRoLCBGWF9JTlQzMiBkb3duc2FtcGxlSGVpZ2h0KQotewotICAgIGlmIChtX3BDYWNoZWRCaXRtYXApIHsKLSAgICAgICAgbV9wQ3VyQml0bWFwID0gbV9wQ2FjaGVkQml0bWFwOwotICAgICAgICBtX3BDdXJNYXNrID0gbV9wQ2FjaGVkTWFzazsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmICghcFJlbmRlclN0YXR1cykgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgbV9wUmVuZGVyU3RhdHVzID0gcFJlbmRlclN0YXR1czsKLSAgICBtX3BDdXJCaXRtYXAgPSBuZXcgQ1BERl9ESUJTb3VyY2U7Ci0gICAgaW50IHJldCA9ICgoQ1BERl9ESUJTb3VyY2UqKW1fcEN1ckJpdG1hcCktPlN0YXJ0TG9hZERJQlNvdXJjZShtX3BEb2N1bWVudCwgbV9wU3RyZWFtLCBUUlVFLCBwRm9ybVJlc291cmNlcywgcFBhZ2VSZXNvdXJjZXMsIGJTdGRDUywgR3JvdXBGYW1pbHksIGJMb2FkTWFzayk7Ci0gICAgaWYgKHJldCA9PSAyKSB7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGlmICghcmV0KSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BDdXJCaXRtYXA7Ci0gICAgICAgIG1fcEN1ckJpdG1hcCA9IE5VTEw7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBDb250aW51ZUdldENhY2hlZEJpdG1hcCgpOwotICAgIHJldHVybiAwOwotfQotaW50IENQREZfSW1hZ2VDYWNoZTo6Q29udGludWVHZXRDYWNoZWRCaXRtYXAoKQotewotICAgIG1fTWF0dGVDb2xvciA9ICgoQ1BERl9ESUJTb3VyY2UqKW1fcEN1ckJpdG1hcCktPm1fTWF0dGVDb2xvcjsKLSAgICBtX3BDdXJNYXNrID0gKChDUERGX0RJQlNvdXJjZSopbV9wQ3VyQml0bWFwKS0+RGV0YWNoTWFzaygpOwotICAgIENQREZfUmVuZGVyQ29udGV4dCpwQ29udGV4dCA9IG1fcFJlbmRlclN0YXR1cy0+R2V0Q29udGV4dCgpOwotICAgIENQREZfUGFnZVJlbmRlckNhY2hlKiBwUGFnZVJlbmRlckNhY2hlID0gcENvbnRleHQtPm1fcFBhZ2VDYWNoZTsKLSAgICBtX2R3VGltZUNvdW50ID0gcFBhZ2VSZW5kZXJDYWNoZS0+R2V0VGltZUNvdW50KCk7Ci0gICAgaWYgKG1fcEN1ckJpdG1hcC0+R2V0UGl0Y2goKSAqIG1fcEN1ckJpdG1hcC0+R2V0SGVpZ2h0KCkgPCBGUERGX0hVR0VfSU1BR0VfU0laRSkgewotICAgICAgICBtX3BDYWNoZWRCaXRtYXAgPSBtX3BDdXJCaXRtYXAtPkNsb25lKCk7Ci0gICAgICAgIGRlbGV0ZSBtX3BDdXJCaXRtYXA7Ci0gICAgICAgIG1fcEN1ckJpdG1hcCA9IE5VTEw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wQ2FjaGVkQml0bWFwID0gbV9wQ3VyQml0bWFwOwotICAgIH0KLSAgICBpZiAobV9wQ3VyTWFzaykgewotICAgICAgICBtX3BDYWNoZWRNYXNrID0gbV9wQ3VyTWFzay0+Q2xvbmUoKTsKLSAgICAgICAgZGVsZXRlIG1fcEN1ck1hc2s7Ci0gICAgICAgIG1fcEN1ck1hc2sgPSBOVUxMOwotICAgIH0KK2ludCBDUERGX0ltYWdlQ2FjaGVFbnRyeTo6U3RhcnRHZXRDYWNoZWRCaXRtYXAoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIEdyb3VwRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJMb2FkTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZG93bnNhbXBsZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRvd25zYW1wbGVIZWlnaHQpIHsKKyAgaWYgKG1fcENhY2hlZEJpdG1hcCkgewogICAgIG1fcEN1ckJpdG1hcCA9IG1fcENhY2hlZEJpdG1hcDsKICAgICBtX3BDdXJNYXNrID0gbV9wQ2FjaGVkTWFzazsKLSAgICBDYWxjU2l6ZSgpOworICAgIHJldHVybiAxOworICB9CisgIGlmICghcFJlbmRlclN0YXR1cykgewogICAgIHJldHVybiAwOwotfQotaW50CUNQREZfSW1hZ2VDYWNoZTo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgaW50IHJldCA9ICgoQ1BERl9ESUJTb3VyY2UqKW1fcEN1ckJpdG1hcCktPkNvbnRpbnVlTG9hZERJQlNvdXJjZShwUGF1c2UpOwotICAgIGlmIChyZXQgPT0gMikgewotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBpZiAoIXJldCkgewotICAgICAgICBkZWxldGUgbV9wQ3VyQml0bWFwOwotICAgICAgICBtX3BDdXJCaXRtYXAgPSBOVUxMOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgQ29udGludWVHZXRDYWNoZWRCaXRtYXAoKTsKKyAgfQorICBtX3BSZW5kZXJTdGF0dXMgPSBwUmVuZGVyU3RhdHVzOworICBtX3BDdXJCaXRtYXAgPSBuZXcgQ1BERl9ESUJTb3VyY2U7CisgIGludCByZXQgPQorICAgICAgKChDUERGX0RJQlNvdXJjZSopbV9wQ3VyQml0bWFwKQorICAgICAgICAgIC0+U3RhcnRMb2FkRElCU291cmNlKG1fcERvY3VtZW50LCBtX3BTdHJlYW0sIFRSVUUsIHBGb3JtUmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYWdlUmVzb3VyY2VzLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2spOworICBpZiAocmV0ID09IDIpIHsKKyAgICByZXR1cm4gcmV0OworICB9CisgIGlmICghcmV0KSB7CisgICAgZGVsZXRlIG1fcEN1ckJpdG1hcDsKKyAgICBtX3BDdXJCaXRtYXAgPSBOVUxMOwogICAgIHJldHVybiAwOworICB9CisgIENvbnRpbnVlR2V0Q2FjaGVkQml0bWFwKCk7CisgIHJldHVybiAwOwogfQotdm9pZCBDUERGX0ltYWdlQ2FjaGU6OkNhbGNTaXplKCkKLXsKLSAgICBtX2R3Q2FjaGVTaXplID0gRlBERl9JbWFnZUNhY2hlX0VzdGltYXRlSW1hZ2VTaXplKG1fcENhY2hlZEJpdG1hcCkgKyBGUERGX0ltYWdlQ2FjaGVfRXN0aW1hdGVJbWFnZVNpemUobV9wQ2FjaGVkTWFzayk7Cit2b2lkIENQREZfSW1hZ2VDYWNoZUVudHJ5OjpDb250aW51ZUdldENhY2hlZEJpdG1hcCgpIHsKKyAgbV9NYXR0ZUNvbG9yID0gKChDUERGX0RJQlNvdXJjZSopbV9wQ3VyQml0bWFwKS0+bV9NYXR0ZUNvbG9yOworICBtX3BDdXJNYXNrID0gKChDUERGX0RJQlNvdXJjZSopbV9wQ3VyQml0bWFwKS0+RGV0YWNoTWFzaygpOworICBDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0ID0gbV9wUmVuZGVyU3RhdHVzLT5HZXRDb250ZXh0KCk7CisgIENQREZfUGFnZVJlbmRlckNhY2hlKiBwUGFnZVJlbmRlckNhY2hlID0gcENvbnRleHQtPkdldFBhZ2VDYWNoZSgpOworICBtX2R3VGltZUNvdW50ID0gcFBhZ2VSZW5kZXJDYWNoZS0+R2V0VGltZUNvdW50KCk7CisgIGlmIChtX3BDdXJCaXRtYXAtPkdldFBpdGNoKCkgKiBtX3BDdXJCaXRtYXAtPkdldEhlaWdodCgpIDwKKyAgICAgIEZQREZfSFVHRV9JTUFHRV9TSVpFKSB7CisgICAgbV9wQ2FjaGVkQml0bWFwID0gbV9wQ3VyQml0bWFwLT5DbG9uZSgpOworICAgIGRlbGV0ZSBtX3BDdXJCaXRtYXA7CisgICAgbV9wQ3VyQml0bWFwID0gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICBtX3BDYWNoZWRCaXRtYXAgPSBtX3BDdXJCaXRtYXA7CisgIH0KKyAgaWYgKG1fcEN1ck1hc2spIHsKKyAgICBtX3BDYWNoZWRNYXNrID0gbV9wQ3VyTWFzay0+Q2xvbmUoKTsKKyAgICBkZWxldGUgbV9wQ3VyTWFzazsKKyAgICBtX3BDdXJNYXNrID0gTlVMTDsKKyAgfQorICBtX3BDdXJCaXRtYXAgPSBtX3BDYWNoZWRCaXRtYXA7CisgIG1fcEN1ck1hc2sgPSBtX3BDYWNoZWRNYXNrOworICBDYWxjU2l6ZSgpOwogfQotdm9pZCBDUERGX0RvY3VtZW50OjpDbGVhclJlbmRlckZvbnQoKQotewotICAgIGlmIChtX3BEb2NSZW5kZXIpIHsKLSAgICAgICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlID0gbV9wRG9jUmVuZGVyLT5HZXRGb250Q2FjaGUoKTsKLSAgICAgICAgaWYgKHBDYWNoZSkgewotICAgICAgICAgICAgcENhY2hlLT5GcmVlQ2FjaGUoRkFMU0UpOwotICAgICAgICB9CitpbnQgQ1BERl9JbWFnZUNhY2hlRW50cnk6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKSB7CisgIGludCByZXQgPSAoKENQREZfRElCU291cmNlKiltX3BDdXJCaXRtYXApLT5Db250aW51ZUxvYWRESUJTb3VyY2UocFBhdXNlKTsKKyAgaWYgKHJldCA9PSAyKSB7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICBpZiAoIXJldCkgeworICAgIGRlbGV0ZSBtX3BDdXJCaXRtYXA7CisgICAgbV9wQ3VyQml0bWFwID0gTlVMTDsKKyAgICByZXR1cm4gMDsKKyAgfQorICBDb250aW51ZUdldENhY2hlZEJpdG1hcCgpOworICByZXR1cm4gMDsKK30KK3ZvaWQgQ1BERl9JbWFnZUNhY2hlRW50cnk6OkNhbGNTaXplKCkgeworICBtX2R3Q2FjaGVTaXplID0gRlBERl9JbWFnZUNhY2hlX0VzdGltYXRlSW1hZ2VTaXplKG1fcENhY2hlZEJpdG1hcCkgKworICAgICAgICAgICAgICAgICAgRlBERl9JbWFnZUNhY2hlX0VzdGltYXRlSW1hZ2VTaXplKG1fcENhY2hlZE1hc2spOworfQordm9pZCBDUERGX0RvY3VtZW50OjpDbGVhclJlbmRlckZvbnQoKSB7CisgIGlmIChtX3BEb2NSZW5kZXIpIHsKKyAgICBDRlhfRm9udENhY2hlKiBwQ2FjaGUgPSBtX3BEb2NSZW5kZXItPkdldEZvbnRDYWNoZSgpOworICAgIGlmIChwQ2FjaGUpIHsKKyAgICAgIHBDYWNoZS0+RnJlZUNhY2hlKEZBTFNFKTsKICAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfaW1hZ2UuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9pbWFnZS5jcHAKaW5kZXggOWExMWZhOC4uM2Y3MzQ3YiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9pbWFnZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9pbWFnZS5jcHAKQEAgLTEsMTA5MiArMSw5OTMgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhnZS9meF9nZS5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3JlbmRlci5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2VvYmouaCIKLSNpbmNsdWRlICIuLi8uLi9meGNydC9meF9zYWZlX3R5cGVzLmgiCi0jaW5jbHVkZSAiLi4vZnBkZl9wYWdlL3BhZ2VpbnQuaCIKICNpbmNsdWRlICJyZW5kZXJfaW50LmgiCi1GWF9CT09MIENQREZfUmVuZGVyU3RhdHVzOjpQcm9jZXNzSW1hZ2UoQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKLXsKLSAgICBDUERGX0ltYWdlUmVuZGVyZXIgcmVuZGVyOwotICAgIGlmIChyZW5kZXIuU3RhcnQodGhpcywgcEltYWdlT2JqLCBwT2JqMkRldmljZSwgbV9iU3RkQ1MsIG1fY3VyQmxlbmQpKSB7Ci0gICAgICAgIHJlbmRlci5Db250aW51ZShOVUxMKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlbmRlci5tX1Jlc3VsdDsKKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2VvYmouaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3JlbmRlci5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9nZS5oIgorI2luY2x1ZGUgImNvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL3BhZ2VpbnQuaCIKKworRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc0ltYWdlKENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSkgeworICBDUERGX0ltYWdlUmVuZGVyZXIgcmVuZGVyOworICBpZiAocmVuZGVyLlN0YXJ0KHRoaXMsIHBJbWFnZU9iaiwgcE9iajJEZXZpY2UsIG1fYlN0ZENTLCBtX2N1ckJsZW5kKSkgeworICAgIHJlbmRlci5Db250aW51ZShOVUxMKTsKKyAgfQorICByZXR1cm4gcmVuZGVyLm1fUmVzdWx0OwogfQotdm9pZCBDUERGX1JlbmRlclN0YXR1czo6Q29tcG9zaXRlRElCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCBGWF9BUkdCIG1hc2tfYXJnYiwKLSAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwgaW50IGJsZW5kX21vZGUsIGludCBUcmFuc3BhcmVuY3kpCi17Ci0gICAgaWYgKHBESUJpdG1hcCA9PSBOVUxMKSB7Cit2b2lkIENQREZfUmVuZGVyU3RhdHVzOjpDb21wb3NpdGVESUJpdG1hcChDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgbWFza19hcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFRyYW5zcGFyZW5jeSkgeworICBpZiAoIXBESUJpdG1hcCkgeworICAgIHJldHVybjsKKyAgfQorICBGWF9CT09MIGJJc29sYXRlZCA9IFRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0lTT0xBVEVEOworICBGWF9CT09MIGJHcm91cCA9IFRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0dST1VQOworICBpZiAoYmxlbmRfbW9kZSA9PSBGWERJQl9CTEVORF9OT1JNQUwpIHsKKyAgICBpZiAoIXBESUJpdG1hcC0+SXNBbHBoYU1hc2soKSkgeworICAgICAgaWYgKGJpdG1hcF9hbHBoYSA8IDI1NSkgeworICAgICAgICBwRElCaXRtYXAtPk11bHRpcGx5QWxwaGEoYml0bWFwX2FscGhhKTsKKyAgICAgIH0KKyAgICAgIGlmIChtX3BEZXZpY2UtPlNldERJQml0cyhwRElCaXRtYXAsIGxlZnQsIHRvcCkpIHsKICAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9CT09MIGJJc29sYXRlZCA9IFRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0lTT0xBVEVEOwotICAgIEZYX0JPT0wgYkdyb3VwID0gVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfR1JPVVA7Ci0gICAgaWYgKGJsZW5kX21vZGUgPT0gRlhESUJfQkxFTkRfTk9STUFMKSB7Ci0gICAgICAgIGlmICghcERJQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7Ci0gICAgICAgICAgICBpZiAoYml0bWFwX2FscGhhIDwgMjU1KSB7Ci0gICAgICAgICAgICAgICAgcERJQml0bWFwLT5NdWx0aXBseUFscGhhKGJpdG1hcF9hbHBoYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9wRGV2aWNlLT5TZXRESUJpdHMocERJQml0bWFwLCBsZWZ0LCB0b3ApKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9hcmdiID0gbV9PcHRpb25zLlRyYW5zbGF0ZUNvbG9yKG1hc2tfYXJnYik7Ci0gICAgICAgICAgICBpZiAoYml0bWFwX2FscGhhIDwgMjU1KSB7Ci0gICAgICAgICAgICAgICAgKChGWF9CWVRFKikmZmlsbF9hcmdiKVszXSA9ICgoRlhfQllURSopJmZpbGxfYXJnYilbM10gKiBiaXRtYXBfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9wRGV2aWNlLT5TZXRCaXRNYXNrKHBESUJpdG1hcCwgbGVmdCwgdG9wLCBmaWxsX2FyZ2IpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIEZYX0JPT0wgYkJhY2tBbHBoYVJlcXVpcmVkID0gYmxlbmRfbW9kZSAmJiBiSXNvbGF0ZWQgJiYgIW1fYkRyb3BPYmplY3RzOwotICAgIEZYX0JPT0wgYkdldEJhY2tHcm91bmQgPSAoKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19BTFBIQV9PVVRQVVQpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIShtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQUxQSEFfT1VUUFVUKSAmJiAobV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIEZYUkNfR0VUX0JJVFMpICYmICFiQmFja0FscGhhUmVxdWlyZWQpOwotICAgIGlmIChiR2V0QmFja0dyb3VuZCkgewotICAgICAgICBpZiAoYklzb2xhdGVkIHx8ICFiR3JvdXApIHsKLSAgICAgICAgICAgIGlmIChwRElCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX3BEZXZpY2UtPlNldERJQml0cyhwRElCaXRtYXAsIGxlZnQsIHRvcCwgYmxlbmRfbW9kZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGWF9SRUNUIHJlY3QobGVmdCwgdG9wLCBsZWZ0ICsgcERJQml0bWFwLT5HZXRXaWR0aCgpLCB0b3AgKyBwRElCaXRtYXAtPkdldEhlaWdodCgpKTsKLSAgICAgICAgICAgIHJlY3QuSW50ZXJzZWN0KG1fcERldmljZS0+R2V0Q2xpcEJveCgpKTsKLSAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcENsb25lID0gTlVMTDsKLSAgICAgICAgICAgIEZYX0JPT0wgYkNsb25lID0gRkFMU0U7Ci0gICAgICAgICAgICBpZiAobV9wRGV2aWNlLT5HZXRCYWNrRHJvcCgpICYmIG1fcERldmljZS0+R2V0Qml0bWFwKCkpIHsKLSAgICAgICAgICAgICAgICBiQ2xvbmUgPSBUUlVFOwotICAgICAgICAgICAgICAgIHBDbG9uZSA9IG1fcERldmljZS0+R2V0QmFja0Ryb3AoKS0+Q2xvbmUoJnJlY3QpOwotICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCAqcEZvcmVCaXRtYXAgPSBtX3BEZXZpY2UtPkdldEJpdG1hcCgpOwotICAgICAgICAgICAgICAgIHBDbG9uZS0+Q29tcG9zaXRlQml0bWFwKDAsIDAsIHBDbG9uZS0+R2V0V2lkdGgoKSwgcENsb25lLT5HZXRIZWlnaHQoKSwgcEZvcmVCaXRtYXAsIHJlY3QubGVmdCwgcmVjdC50b3ApOwotICAgICAgICAgICAgICAgIGxlZnQgPSBsZWZ0ID49IDAgPyAwIDogbGVmdDsKLSAgICAgICAgICAgICAgICB0b3AgPSB0b3AgPj0gMCA/IDAgOiB0b3A7Ci0gICAgICAgICAgICAgICAgaWYgKCFwRElCaXRtYXAtPklzQWxwaGFNYXNrKCkpCi0gICAgICAgICAgICAgICAgICAgIHBDbG9uZS0+Q29tcG9zaXRlQml0bWFwKDAsIDAsIHBDbG9uZS0+R2V0V2lkdGgoKSwgcENsb25lLT5HZXRIZWlnaHQoKSwgcERJQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0LCB0b3AsIGJsZW5kX21vZGUpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcENsb25lLT5Db21wb3NpdGVNYXNrKDAsIDAsIHBDbG9uZS0+R2V0V2lkdGgoKSwgcENsb25lLT5HZXRIZWlnaHQoKSwgcERJQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza19hcmdiLCBsZWZ0LCB0b3AsIGJsZW5kX21vZGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwQ2xvbmUgPSBwRElCaXRtYXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9wRGV2aWNlLT5HZXRCYWNrRHJvcCgpKSB7Ci0gICAgICAgICAgICAgICAgbV9wRGV2aWNlLT5TZXRESUJpdHMocENsb25lLCByZWN0LmxlZnQsIHJlY3QudG9wKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBESUJpdG1hcC0+SXNBbHBoYU1hc2soKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fcERldmljZS0+U2V0RElCaXRzKHBESUJpdG1hcCwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgYmxlbmRfbW9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYkNsb25lKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIHBDbG9uZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludCBiYWNrX2xlZnQsIGJhY2tfdG9wOwotICAgIEZYX1JFQ1QgcmVjdChsZWZ0LCB0b3AsIGxlZnQgKyBwRElCaXRtYXAtPkdldFdpZHRoKCksIHRvcCArIHBESUJpdG1hcC0+R2V0SGVpZ2h0KCkpOwotICAgIENGWF9ESUJpdG1hcCogcEJhY2tkcm9wID0gR2V0QmFja2Ryb3AobV9wQ3VyT2JqLCByZWN0LCBiYWNrX2xlZnQsIGJhY2tfdG9wLCBibGVuZF9tb2RlID4gRlhESUJfQkxFTkRfTk9STUFMICYmIGJJc29sYXRlZCk7Ci0gICAgaWYgKCFwQmFja2Ryb3ApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoIXBESUJpdG1hcC0+SXNBbHBoYU1hc2soKSkKLSAgICAgICAgcEJhY2tkcm9wLT5Db21wb3NpdGVCaXRtYXAobGVmdCAtIGJhY2tfbGVmdCwgdG9wIC0gYmFja190b3AsIHBESUJpdG1hcC0+R2V0V2lkdGgoKSwgcERJQml0bWFwLT5HZXRIZWlnaHQoKSwgcERJQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBibGVuZF9tb2RlKTsKLSAgICBlbHNlCi0gICAgICAgIHBCYWNrZHJvcC0+Q29tcG9zaXRlTWFzayhsZWZ0IC0gYmFja19sZWZ0LCB0b3AgLSBiYWNrX3RvcCwgcERJQml0bWFwLT5HZXRXaWR0aCgpLCBwRElCaXRtYXAtPkdldEhlaWdodCgpLCBwRElCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrX2FyZ2IsIDAsIDAsIGJsZW5kX21vZGUpOwotICAgIENGWF9ESUJpdG1hcCogcEJhY2tkcm9wMSA9IG5ldyBDRlhfRElCaXRtYXA7Ci0gICAgcEJhY2tkcm9wMS0+Q3JlYXRlKHBCYWNrZHJvcC0+R2V0V2lkdGgoKSwgcEJhY2tkcm9wLT5HZXRIZWlnaHQoKSwgRlhESUJfUmdiMzIpOwotICAgIHBCYWNrZHJvcDEtPkNsZWFyKChGWF9EV09SRCkgLSAxKTsKLSAgICBwQmFja2Ryb3AxLT5Db21wb3NpdGVCaXRtYXAoMCwgMCwgcEJhY2tkcm9wLT5HZXRXaWR0aCgpLCBwQmFja2Ryb3AtPkdldEhlaWdodCgpLCBwQmFja2Ryb3AsIDAsIDApOwotICAgIGRlbGV0ZSBwQmFja2Ryb3A7Ci0gICAgcEJhY2tkcm9wID0gcEJhY2tkcm9wMTsKLSAgICBtX3BEZXZpY2UtPlNldERJQml0cyhwQmFja2Ryb3AsIGJhY2tfbGVmdCwgYmFja190b3ApOwotICAgIGRlbGV0ZSBwQmFja2Ryb3A7Ci19Ci1GWF9DT0xPUlJFRiBDUERGX1RyYW5zZmVyRnVuYzo6VHJhbnNsYXRlQ29sb3IoRlhfQ09MT1JSRUYgcmdiKQotewotICAgIHJldHVybiBGWFNZU19SR0IobV9TYW1wbGVzW0ZYU1lTX0dldFJWYWx1ZShyZ2IpXSwgbV9TYW1wbGVzWzI1NiArIEZYU1lTX0dldEdWYWx1ZShyZ2IpXSwKLSAgICAgICAgICAgICAgICAgICAgIG1fU2FtcGxlc1s1MTIgKyBGWFNZU19HZXRCVmFsdWUocmdiKV0pOwotfQotQ0ZYX0RJQlNvdXJjZSogQ1BERl9UcmFuc2ZlckZ1bmM6OlRyYW5zbGF0ZUltYWdlKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsIEZYX0JPT0wgYkF1dG9Ecm9wU3JjKQotewotICAgIENQREZfRElCVHJhbnNmZXJGdW5jKiBwRGVzdCA9IG5ldyBDUERGX0RJQlRyYW5zZmVyRnVuYyh0aGlzKTsKLSAgICBwRGVzdC0+TG9hZFNyYyhwU3JjLCBiQXV0b0Ryb3BTcmMpOwotICAgIHJldHVybiBwRGVzdDsKLX0KLUZYRElCX0Zvcm1hdCBDUERGX0RJQlRyYW5zZmVyRnVuYzo6R2V0RGVzdEZvcm1hdCgpCi17Ci0gICAgaWYgKG1fcFNyYy0+SXNBbHBoYU1hc2soKSkgewotICAgICAgICByZXR1cm4gRlhESUJfOGJwcE1hc2s7Ci0gICAgfQotI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgIHJldHVybiAobV9wU3JjLT5IYXNBbHBoYSgpKSA/IEZYRElCX0FyZ2IgOiBGWERJQl9SZ2IzMjsKLSNlbHNlCi0gICAgcmV0dXJuIChtX3BTcmMtPkhhc0FscGhhKCkpID8gRlhESUJfQXJnYiA6IEZYRElCX1JnYjsKLSNlbmRpZgotfQotQ1BERl9ESUJUcmFuc2ZlckZ1bmM6OkNQREZfRElCVHJhbnNmZXJGdW5jKGNvbnN0IENQREZfVHJhbnNmZXJGdW5jKiBwVHJhbnNmZXJGdW5jKQotewotICAgIG1fUmFtcFIgPSBwVHJhbnNmZXJGdW5jLT5tX1NhbXBsZXM7Ci0gICAgbV9SYW1wRyA9ICZwVHJhbnNmZXJGdW5jLT5tX1NhbXBsZXNbMjU2XTsKLSAgICBtX1JhbXBCID0gJnBUcmFuc2ZlckZ1bmMtPm1fU2FtcGxlc1s1MTJdOwotfQotdm9pZCBDUERGX0RJQlRyYW5zZmVyRnVuYzo6VHJhbnNsYXRlU2NhbmxpbmUoRlhfTFBCWVRFIGRlc3RfYnVmLCBGWF9MUENCWVRFIHNyY19idWYpIGNvbnN0Ci17Ci0gICAgaW50IGk7Ci0gICAgRlhfQk9PTCBiU2tpcCA9IEZBTFNFOwotICAgIHN3aXRjaCAobV9wU3JjLT5HZXRGb3JtYXQoKSkgewotICAgICAgICBjYXNlIEZYRElCXzFicHBSZ2I6IHsKLSAgICAgICAgICAgICAgICBpbnQgcjAgPSBtX1JhbXBSWzBdLCBnMCA9IG1fUmFtcEdbMF0sIGIwID0gbV9SYW1wQlswXTsKLSAgICAgICAgICAgICAgICBpbnQgcjEgPSBtX1JhbXBSWzI1NV0sIGcxID0gbV9SYW1wR1syNTVdLCBiMSA9IG1fUmFtcEJbMjU1XTsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9XaWR0aDsgaSArKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2J1ZltpIC8gOF0gJiAoMSA8PCAoNyAtIGkgJSA4KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X2J1ZisrID0gYjE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9idWYrKyA9IGcxOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfYnVmKysgPSByMTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X2J1ZisrID0gYjA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9idWYrKyA9IGcwOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfYnVmKysgPSByMDsKLSAgICAgICAgICAgICAgICAgICAgfQotI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgICAgICAgICAgICAgICAgICBkZXN0X2J1ZisrOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIEZYRElCXzFicHBNYXNrOiB7Ci0gICAgICAgICAgICAgICAgaW50IG0wID0gbV9SYW1wUlswXSwgbTEgPSBtX1JhbXBSWzI1NV07Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1fV2lkdGg7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19idWZbaSAvIDhdICYgKDEgPDwgKDcgLSBpICUgOCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9idWYrKyA9IG0xOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfYnVmKysgPSBtMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGWERJQl84YnBwUmdiOiB7Ci0gICAgICAgICAgICAgICAgRlhfQVJHQiogcFBhbCA9IG1fcFNyYy0+R2V0UGFsZXR0ZSgpOwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtX1dpZHRoOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwUGFsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIHNyY19hcmdiID0gcFBhbFsqc3JjX2J1Zl07Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcEJbRlhBUkdCX1Ioc3JjX2FyZ2IpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wR1tGWEFSR0JfRyhzcmNfYXJnYildOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBSW0ZYQVJHQl9CKHNyY19hcmdiKV07Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfYnl0ZSA9ICpzcmNfYnVmOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBCW3NyY19ieXRlXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wR1tzcmNfYnl0ZV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcFJbc3JjX2J5dGVdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNyY19idWYgKys7Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgICAgICAgICAgICAgICAgIGRlc3RfYnVmKys7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9XaWR0aDsgaSArKykgewotICAgICAgICAgICAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wUlsqKHNyY19idWYrKyldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhESUJfUmdiOgotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1fV2lkdGg7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcEJbKihzcmNfYnVmKyspXTsKLSAgICAgICAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcEdbKihzcmNfYnVmKyspXTsKLSAgICAgICAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcFJbKihzcmNfYnVmKyspXTsKLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICAgICAgICAgICAgICBkZXN0X2J1ZisrOwotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWERJQl9SZ2IzMjoKLSAgICAgICAgICAgIGJTa2lwID0gVFJVRTsKLSAgICAgICAgY2FzZSBGWERJQl9BcmdiOgotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1fV2lkdGg7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcEJbKihzcmNfYnVmKyspXTsKLSAgICAgICAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcEdbKihzcmNfYnVmKyspXTsKLSAgICAgICAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcFJbKihzcmNfYnVmKyspXTsKLSAgICAgICAgICAgICAgICBpZiAoIWJTa2lwKSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X2J1ZisrID0gKnNyY19idWY7Ci0gICAgICAgICAgICAgICAgfQotI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBkZXN0X2J1ZisrOwotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgIHNyY19idWYgKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLXZvaWQgQ1BERl9ESUJUcmFuc2ZlckZ1bmM6OlRyYW5zbGF0ZURvd25TYW1wbGVzKEZYX0xQQllURSBkZXN0X2J1ZiwgRlhfTFBDQllURSBzcmNfYnVmLCBpbnQgcGl4ZWxzLCBpbnQgQnBwKSBjb25zdAotewotICAgIGlmIChCcHAgPT0gOCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSArKykgewotICAgICAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBSWyooc3JjX2J1ZisrKV07Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKEJwcCA9PSAyNCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSArKykgewotICAgICAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBCWyooc3JjX2J1ZisrKV07Ci0gICAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcEdbKihzcmNfYnVmKyspXTsKLSAgICAgICAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wUlsqKHNyY19idWYrKyldOwotICAgICAgICB9CisgICAgICB9CiAgICAgfSBlbHNlIHsKLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICAgICAgaWYgKCFtX3BTcmMtPkhhc0FscGhhKCkpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBCWyooc3JjX2J1ZisrKV07Ci0gICAgICAgICAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBHWyooc3JjX2J1ZisrKV07Ci0gICAgICAgICAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBSWyooc3JjX2J1ZisrKV07Ci0gICAgICAgICAgICAgICAgZGVzdF9idWYrKzsKLSAgICAgICAgICAgICAgICBzcmNfYnVmKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQorICAgICAgRlhfRFdPUkQgZmlsbF9hcmdiID0gbV9PcHRpb25zLlRyYW5zbGF0ZUNvbG9yKG1hc2tfYXJnYik7CisgICAgICBpZiAoYml0bWFwX2FscGhhIDwgMjU1KSB7CisgICAgICAgICgodWludDhfdCopJmZpbGxfYXJnYilbM10gPQorICAgICAgICAgICAgKCh1aW50OF90KikmZmlsbF9hcmdiKVszXSAqIGJpdG1hcF9hbHBoYSAvIDI1NTsKKyAgICAgIH0KKyAgICAgIGlmIChtX3BEZXZpY2UtPlNldEJpdE1hc2socERJQml0bWFwLCBsZWZ0LCB0b3AsIGZpbGxfYXJnYikpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgfQorICBGWF9CT09MIGJCYWNrQWxwaGFSZXF1aXJlZCA9IGJsZW5kX21vZGUgJiYgYklzb2xhdGVkICYmICFtX2JEcm9wT2JqZWN0czsKKyAgRlhfQk9PTCBiR2V0QmFja0dyb3VuZCA9CisgICAgICAoKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19BTFBIQV9PVVRQVVQpKSB8fAorICAgICAgKCEobV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0FMUEhBX09VVFBVVCkgJiYKKyAgICAgICAobV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0dFVF9CSVRTKSAmJiAhYkJhY2tBbHBoYVJlcXVpcmVkKTsKKyAgaWYgKGJHZXRCYWNrR3JvdW5kKSB7CisgICAgaWYgKGJJc29sYXRlZCB8fCAhYkdyb3VwKSB7CisgICAgICBpZiAocERJQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIG1fcERldmljZS0+U2V0RElCaXRzKHBESUJpdG1hcCwgbGVmdCwgdG9wLCBibGVuZF9tb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgRlhfUkVDVCByZWN0KGxlZnQsIHRvcCwgbGVmdCArIHBESUJpdG1hcC0+R2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICB0b3AgKyBwRElCaXRtYXAtPkdldEhlaWdodCgpKTsKKyAgICAgIHJlY3QuSW50ZXJzZWN0KG1fcERldmljZS0+R2V0Q2xpcEJveCgpKTsKKyAgICAgIENGWF9ESUJpdG1hcCogcENsb25lID0gTlVMTDsKKyAgICAgIEZYX0JPT0wgYkNsb25lID0gRkFMU0U7CisgICAgICBpZiAobV9wRGV2aWNlLT5HZXRCYWNrRHJvcCgpICYmIG1fcERldmljZS0+R2V0Qml0bWFwKCkpIHsKKyAgICAgICAgYkNsb25lID0gVFJVRTsKKyAgICAgICAgcENsb25lID0gbV9wRGV2aWNlLT5HZXRCYWNrRHJvcCgpLT5DbG9uZSgmcmVjdCk7CisgICAgICAgIENGWF9ESUJpdG1hcCogcEZvcmVCaXRtYXAgPSBtX3BEZXZpY2UtPkdldEJpdG1hcCgpOworICAgICAgICBwQ2xvbmUtPkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCBwQ2xvbmUtPkdldFdpZHRoKCksIHBDbG9uZS0+R2V0SGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JlQml0bWFwLCByZWN0LmxlZnQsIHJlY3QudG9wKTsKKyAgICAgICAgbGVmdCA9IGxlZnQgPj0gMCA/IDAgOiBsZWZ0OworICAgICAgICB0b3AgPSB0b3AgPj0gMCA/IDAgOiB0b3A7CisgICAgICAgIGlmICghcERJQml0bWFwLT5Jc0FscGhhTWFzaygpKQorICAgICAgICAgIHBDbG9uZS0+Q29tcG9zaXRlQml0bWFwKDAsIDAsIHBDbG9uZS0+R2V0V2lkdGgoKSwgcENsb25lLT5HZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRElCaXRtYXAsIGxlZnQsIHRvcCwgYmxlbmRfbW9kZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwQ2xvbmUtPkNvbXBvc2l0ZU1hc2soMCwgMCwgcENsb25lLT5HZXRXaWR0aCgpLCBwQ2xvbmUtPkdldEhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRElCaXRtYXAsIG1hc2tfYXJnYiwgbGVmdCwgdG9wLCBibGVuZF9tb2RlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBDbG9uZSA9IHBESUJpdG1hcDsKKyAgICAgIH0KKyAgICAgIGlmIChtX3BEZXZpY2UtPkdldEJhY2tEcm9wKCkpIHsKKyAgICAgICAgbV9wRGV2aWNlLT5TZXRESUJpdHMocENsb25lLCByZWN0LmxlZnQsIHJlY3QudG9wKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwRElCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbV9wRGV2aWNlLT5TZXRESUJpdHMocERJQml0bWFwLCByZWN0LmxlZnQsIHJlY3QudG9wLCBibGVuZF9tb2RlKTsKKyAgICAgIH0KKyAgICAgIGlmIChiQ2xvbmUpIHsKKyAgICAgICAgZGVsZXRlIHBDbG9uZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGludCBiYWNrX2xlZnQsIGJhY2tfdG9wOworICBGWF9SRUNUIHJlY3QobGVmdCwgdG9wLCBsZWZ0ICsgcERJQml0bWFwLT5HZXRXaWR0aCgpLAorICAgICAgICAgICAgICAgdG9wICsgcERJQml0bWFwLT5HZXRIZWlnaHQoKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IHBCYWNrZHJvcCgKKyAgICAgIEdldEJhY2tkcm9wKG1fcEN1ck9iaiwgcmVjdCwgYmFja19sZWZ0LCBiYWNrX3RvcCwKKyAgICAgICAgICAgICAgICAgIGJsZW5kX21vZGUgPiBGWERJQl9CTEVORF9OT1JNQUwgJiYgYklzb2xhdGVkKSk7CisgIGlmICghcEJhY2tkcm9wKQorICAgIHJldHVybjsKKworICBpZiAoIXBESUJpdG1hcC0+SXNBbHBoYU1hc2soKSkgeworICAgIHBCYWNrZHJvcC0+Q29tcG9zaXRlQml0bWFwKGxlZnQgLSBiYWNrX2xlZnQsIHRvcCAtIGJhY2tfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBESUJpdG1hcC0+R2V0V2lkdGgoKSwgcERJQml0bWFwLT5HZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRElCaXRtYXAsIDAsIDAsIGJsZW5kX21vZGUpOworICB9IGVsc2UgeworICAgIHBCYWNrZHJvcC0+Q29tcG9zaXRlTWFzayhsZWZ0IC0gYmFja19sZWZ0LCB0b3AgLSBiYWNrX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERJQml0bWFwLT5HZXRXaWR0aCgpLCBwRElCaXRtYXAtPkdldEhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRElCaXRtYXAsIG1hc2tfYXJnYiwgMCwgMCwgYmxlbmRfbW9kZSk7CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBwQmFja2Ryb3AxKG5ldyBDRlhfRElCaXRtYXApOworICBwQmFja2Ryb3AxLT5DcmVhdGUocEJhY2tkcm9wLT5HZXRXaWR0aCgpLCBwQmFja2Ryb3AtPkdldEhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgRlhESUJfUmdiMzIpOworICBwQmFja2Ryb3AxLT5DbGVhcigoRlhfRFdPUkQpLTEpOworICBwQmFja2Ryb3AxLT5Db21wb3NpdGVCaXRtYXAoMCwgMCwgcEJhY2tkcm9wLT5HZXRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJhY2tkcm9wLT5HZXRIZWlnaHQoKSwgcEJhY2tkcm9wLmdldCgpLCAwLCAwKTsKKyAgcEJhY2tkcm9wID0gc3RkOjptb3ZlKHBCYWNrZHJvcDEpOworICBtX3BEZXZpY2UtPlNldERJQml0cyhwQmFja2Ryb3AuZ2V0KCksIGJhY2tfbGVmdCwgYmFja190b3ApOworfQorCitDUERGX1RyYW5zZmVyRnVuYzo6Q1BERl9UcmFuc2ZlckZ1bmMoQ1BERl9Eb2N1bWVudCogcERvYykgOiBtX3BQREZEb2MocERvYykge30KKworRlhfQ09MT1JSRUYgQ1BERl9UcmFuc2ZlckZ1bmM6OlRyYW5zbGF0ZUNvbG9yKEZYX0NPTE9SUkVGIHJnYikgY29uc3QgeworICByZXR1cm4gRlhTWVNfUkdCKG1fU2FtcGxlc1tGWFNZU19HZXRSVmFsdWUocmdiKV0sCisgICAgICAgICAgICAgICAgICAgbV9TYW1wbGVzWzI1NiArIEZYU1lTX0dldEdWYWx1ZShyZ2IpXSwKKyAgICAgICAgICAgICAgICAgICBtX1NhbXBsZXNbNTEyICsgRlhTWVNfR2V0QlZhbHVlKHJnYildKTsKK30KKworQ0ZYX0RJQlNvdXJjZSogQ1BERl9UcmFuc2ZlckZ1bmM6OlRyYW5zbGF0ZUltYWdlKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQXV0b0Ryb3BTcmMpIHsKKyAgQ1BERl9ESUJUcmFuc2ZlckZ1bmMqIHBEZXN0ID0gbmV3IENQREZfRElCVHJhbnNmZXJGdW5jKHRoaXMpOworICBwRGVzdC0+TG9hZFNyYyhwU3JjLCBiQXV0b0Ryb3BTcmMpOworICByZXR1cm4gcERlc3Q7Cit9CisKK0NQREZfRElCVHJhbnNmZXJGdW5jOjp+Q1BERl9ESUJUcmFuc2ZlckZ1bmMoKSB7Cit9CisKK0ZYRElCX0Zvcm1hdCBDUERGX0RJQlRyYW5zZmVyRnVuYzo6R2V0RGVzdEZvcm1hdCgpIHsKKyAgaWYgKG1fcFNyYy0+SXNBbHBoYU1hc2soKSkgeworICAgIHJldHVybiBGWERJQl84YnBwTWFzazsKKyAgfQorI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisgIHJldHVybiAobV9wU3JjLT5IYXNBbHBoYSgpKSA/IEZYRElCX0FyZ2IgOiBGWERJQl9SZ2IzMjsKKyNlbHNlCisgIHJldHVybiAobV9wU3JjLT5IYXNBbHBoYSgpKSA/IEZYRElCX0FyZ2IgOiBGWERJQl9SZ2I7CiAjZW5kaWYKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBCWyooc3JjX2J1ZisrKV07Ci0gICAgICAgICAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBHWyooc3JjX2J1ZisrKV07Ci0gICAgICAgICAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBSWyooc3JjX2J1ZisrKV07Ci0gICAgICAgICAgICAgICAgKmRlc3RfYnVmKysgPSAqKHNyY19idWYrKyk7Ci0gICAgICAgICAgICB9Ci0gICAgfQogfQotc3RhdGljIEZYX0JPT0wgX0lzU3VwcG9ydGVkKENQREZfQ29sb3JTcGFjZSogcENTKQotewotICAgIGlmIChwQ1MtPkdldEZhbWlseSgpID09IFBERkNTX0RFVklDRVJHQiB8fCBwQ1MtPkdldEZhbWlseSgpID09IFBERkNTX0RFVklDRUdSQVkgfHwKLSAgICAgICAgICAgIHBDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfREVWSUNFQ01ZSyB8fCBwQ1MtPkdldEZhbWlseSgpID09IFBERkNTX0NBTEdSQVkgfHwKLSAgICAgICAgICAgIHBDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfQ0FMUkdCKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAocENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19JTkRFWEVEICYmIF9Jc1N1cHBvcnRlZChwQ1MtPkdldEJhc2VDUygpKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworQ1BERl9ESUJUcmFuc2ZlckZ1bmM6OkNQREZfRElCVHJhbnNmZXJGdW5jKAorICAgIGNvbnN0IENQREZfVHJhbnNmZXJGdW5jKiBwVHJhbnNmZXJGdW5jKSB7CisgIG1fUmFtcFIgPSBwVHJhbnNmZXJGdW5jLT5tX1NhbXBsZXM7CisgIG1fUmFtcEcgPSAmcFRyYW5zZmVyRnVuYy0+bV9TYW1wbGVzWzI1Nl07CisgIG1fUmFtcEIgPSAmcFRyYW5zZmVyRnVuYy0+bV9TYW1wbGVzWzUxMl07CiB9Ci1DUERGX0ltYWdlUmVuZGVyZXI6OkNQREZfSW1hZ2VSZW5kZXJlcigpCi17Ci0gICAgbV9wUmVuZGVyU3RhdHVzID0gTlVMTDsKLSAgICBtX3BJbWFnZU9iamVjdCA9IE5VTEw7Ci0gICAgbV9SZXN1bHQgPSBUUlVFOwotICAgIG1fU3RhdHVzID0gMDsKLSAgICBtX3BRdWlja1N0cmV0Y2hlciA9IE5VTEw7Ci0gICAgbV9wVHJhbnNmb3JtZXIgPSBOVUxMOwotICAgIG1fRGV2aWNlSGFuZGxlID0gTlVMTDsKLSAgICBtX0xvYWRIYW5kbGUgPSBOVUxMOwotICAgIG1fcENsb25lID0gTlVMTDsKLSAgICBtX2JTdGRDUyA9IEZBTFNFOwotICAgIG1fYlBhdHRlcm5Db2xvciA9IEZBTFNFOwotICAgIG1fQmxlbmRUeXBlID0gRlhESUJfQkxFTkRfTk9STUFMOwotICAgIG1fcFBhdHRlcm4gPSBOVUxMOwotICAgIG1fcE9iajJEZXZpY2UgPSBOVUxMOwordm9pZCBDUERGX0RJQlRyYW5zZmVyRnVuYzo6VHJhbnNsYXRlU2NhbmxpbmUodWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmKSBjb25zdCB7CisgIGludCBpOworICBGWF9CT09MIGJTa2lwID0gRkFMU0U7CisgIHN3aXRjaCAobV9wU3JjLT5HZXRGb3JtYXQoKSkgeworICAgIGNhc2UgRlhESUJfMWJwcFJnYjogeworICAgICAgaW50IHIwID0gbV9SYW1wUlswXSwgZzAgPSBtX1JhbXBHWzBdLCBiMCA9IG1fUmFtcEJbMF07CisgICAgICBpbnQgcjEgPSBtX1JhbXBSWzI1NV0sIGcxID0gbV9SYW1wR1syNTVdLCBiMSA9IG1fUmFtcEJbMjU1XTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBtX1dpZHRoOyBpKyspIHsKKyAgICAgICAgaWYgKHNyY19idWZbaSAvIDhdICYgKDEgPDwgKDcgLSBpICUgOCkpKSB7CisgICAgICAgICAgKmRlc3RfYnVmKysgPSBiMTsKKyAgICAgICAgICAqZGVzdF9idWYrKyA9IGcxOworICAgICAgICAgICpkZXN0X2J1ZisrID0gcjE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKmRlc3RfYnVmKysgPSBiMDsKKyAgICAgICAgICAqZGVzdF9idWYrKyA9IGcwOworICAgICAgICAgICpkZXN0X2J1ZisrID0gcjA7CisgICAgICAgIH0KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworICAgICAgICBkZXN0X2J1ZisrOworI2VuZGlmCisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGWERJQl8xYnBwTWFzazogeworICAgICAgaW50IG0wID0gbV9SYW1wUlswXSwgbTEgPSBtX1JhbXBSWzI1NV07CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9XaWR0aDsgaSsrKSB7CisgICAgICAgIGlmIChzcmNfYnVmW2kgLyA4XSAmICgxIDw8ICg3IC0gaSAlIDgpKSkgeworICAgICAgICAgICpkZXN0X2J1ZisrID0gbTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKmRlc3RfYnVmKysgPSBtMDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRlhESUJfOGJwcFJnYjogeworICAgICAgRlhfQVJHQiogcFBhbCA9IG1fcFNyYy0+R2V0UGFsZXR0ZSgpOworICAgICAgZm9yIChpID0gMDsgaSA8IG1fV2lkdGg7IGkrKykgeworICAgICAgICBpZiAocFBhbCkgeworICAgICAgICAgIEZYX0FSR0Igc3JjX2FyZ2IgPSBwUGFsWypzcmNfYnVmXTsKKyAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcEJbRlhBUkdCX1Ioc3JjX2FyZ2IpXTsKKyAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcEdbRlhBUkdCX0coc3JjX2FyZ2IpXTsKKyAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcFJbRlhBUkdCX0Ioc3JjX2FyZ2IpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBGWF9EV09SRCBzcmNfYnl0ZSA9ICpzcmNfYnVmOworICAgICAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wQltzcmNfYnl0ZV07CisgICAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBHW3NyY19ieXRlXTsKKyAgICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcFJbc3JjX2J5dGVdOworICAgICAgICB9CisgICAgICAgIHNyY19idWYrKzsKKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworICAgICAgICBkZXN0X2J1ZisrOworI2VuZGlmCisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGWERJQl84YnBwTWFzazoKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBtX1dpZHRoOyBpKyspIHsKKyAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBSWyooc3JjX2J1ZisrKV07CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCX1JnYjoKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBtX1dpZHRoOyBpKyspIHsKKyAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBCWyooc3JjX2J1ZisrKV07CisgICAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wR1sqKHNyY19idWYrKyldOworICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcFJbKihzcmNfYnVmKyspXTsKKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworICAgICAgICBkZXN0X2J1ZisrOworI2VuZGlmCisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCX1JnYjMyOgorICAgICAgYlNraXAgPSBUUlVFOworICAgIGNhc2UgRlhESUJfQXJnYjoKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBtX1dpZHRoOyBpKyspIHsKKyAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBCWyooc3JjX2J1ZisrKV07CisgICAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wR1sqKHNyY19idWYrKyldOworICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcFJbKihzcmNfYnVmKyspXTsKKyAgICAgICAgaWYgKCFiU2tpcCkgeworICAgICAgICAgICpkZXN0X2J1ZisrID0gKnNyY19idWY7CisgICAgICAgIH0KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworICAgICAgICBlbHNlIHsKKyAgICAgICAgICBkZXN0X2J1ZisrOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgc3JjX2J1ZisrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CiB9Ci1DUERGX0ltYWdlUmVuZGVyZXI6On5DUERGX0ltYWdlUmVuZGVyZXIoKQotewotICAgIGlmIChtX3BRdWlja1N0cmV0Y2hlcikgewotICAgICAgICBkZWxldGUgbV9wUXVpY2tTdHJldGNoZXI7Cit2b2lkIENQREZfRElCVHJhbnNmZXJGdW5jOjpUcmFuc2xhdGVEb3duU2FtcGxlcyh1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCkgY29uc3QgeworICBpZiAoQnBwID09IDgpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7CisgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcFJbKihzcmNfYnVmKyspXTsKICAgICB9Ci0gICAgaWYgKG1fcFRyYW5zZm9ybWVyKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BUcmFuc2Zvcm1lcjsKKyAgfSBlbHNlIGlmIChCcHAgPT0gMjQpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7CisgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcEJbKihzcmNfYnVmKyspXTsKKyAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wR1sqKHNyY19idWYrKyldOworICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBSWyooc3JjX2J1ZisrKV07CiAgICAgfQotICAgIGlmIChtX0RldmljZUhhbmRsZSkgewotICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+Q2FuY2VsRElCaXRzKG1fRGV2aWNlSGFuZGxlKTsKLSAgICB9CisgIH0gZWxzZSB7CisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyAgICBpZiAoIW1fcFNyYy0+SGFzQWxwaGEoKSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHM7IGkrKykgeworICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcEJbKihzcmNfYnVmKyspXTsKKyAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBHWyooc3JjX2J1ZisrKV07CisgICAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wUlsqKHNyY19idWYrKyldOworICAgICAgICBkZXN0X2J1ZisrOworICAgICAgICBzcmNfYnVmKys7CisgICAgICB9CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzOyBpKyspIHsKKyAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBCWyooc3JjX2J1ZisrKV07CisgICAgICAgICpkZXN0X2J1ZisrID0gbV9SYW1wR1sqKHNyY19idWYrKyldOworICAgICAgICAqZGVzdF9idWYrKyA9IG1fUmFtcFJbKihzcmNfYnVmKyspXTsKKyAgICAgICAgKmRlc3RfYnVmKysgPSAqKHNyY19idWYrKyk7CisgICAgICB9CisgIH0KK30KK0NQREZfSW1hZ2VSZW5kZXJlcjo6Q1BERl9JbWFnZVJlbmRlcmVyKCkgeworICBtX3BSZW5kZXJTdGF0dXMgPSBOVUxMOworICBtX3BJbWFnZU9iamVjdCA9IE5VTEw7CisgIG1fUmVzdWx0ID0gVFJVRTsKKyAgbV9TdGF0dXMgPSAwOworICBtX3BUcmFuc2Zvcm1lciA9IE5VTEw7CisgIG1fRGV2aWNlSGFuZGxlID0gTlVMTDsKKyAgbV9Mb2FkSGFuZGxlID0gTlVMTDsKKyAgbV9wQ2xvbmUgPSBOVUxMOworICBtX2JTdGRDUyA9IEZBTFNFOworICBtX2JQYXR0ZXJuQ29sb3IgPSBGQUxTRTsKKyAgbV9CbGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUw7CisgIG1fcFBhdHRlcm4gPSBOVUxMOworICBtX3BPYmoyRGV2aWNlID0gTlVMTDsKK30KK0NQREZfSW1hZ2VSZW5kZXJlcjo6fkNQREZfSW1hZ2VSZW5kZXJlcigpIHsKKyAgZGVsZXRlIG1fcFRyYW5zZm9ybWVyOworICBpZiAobV9EZXZpY2VIYW5kbGUpIHsKKyAgICBtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+Q2FuY2VsRElCaXRzKG1fRGV2aWNlSGFuZGxlKTsKKyAgfQorICBkZWxldGUgbV9Mb2FkSGFuZGxlOworICBkZWxldGUgbV9wQ2xvbmU7Cit9CitGWF9CT09MIENQREZfSW1hZ2VSZW5kZXJlcjo6U3RhcnRMb2FkRElCU291cmNlKCkgeworICBDRlhfRmxvYXRSZWN0IGltYWdlX3JlY3RfZiA9IG1fSW1hZ2VNYXRyaXguR2V0VW5pdFJlY3QoKTsKKyAgRlhfUkVDVCBpbWFnZV9yZWN0ID0gaW1hZ2VfcmVjdF9mLkdldE91dHRlclJlY3QoKTsKKyAgaW50IGRlc3Rfd2lkdGggPSBpbWFnZV9yZWN0LldpZHRoKCk7CisgIGludCBkZXN0X2hlaWdodCA9IGltYWdlX3JlY3QuSGVpZ2h0KCk7CisgIGlmIChtX0ltYWdlTWF0cml4LmEgPCAwKSB7CisgICAgZGVzdF93aWR0aCA9IC1kZXN0X3dpZHRoOworICB9CisgIGlmIChtX0ltYWdlTWF0cml4LmQgPiAwKSB7CisgICAgZGVzdF9oZWlnaHQgPSAtZGVzdF9oZWlnaHQ7CisgIH0KKyAgaWYgKG1fTG9hZGVyLlN0YXJ0KG1fcEltYWdlT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgbV9wUmVuZGVyU3RhdHVzLT5tX3BDb250ZXh0LT5HZXRQYWdlQ2FjaGUoKSwgbV9Mb2FkSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgbV9iU3RkQ1MsIG1fcFJlbmRlclN0YXR1cy0+bV9Hcm91cEZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgIG1fcFJlbmRlclN0YXR1cy0+bV9iTG9hZE1hc2ssIG1fcFJlbmRlclN0YXR1cywgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgIGRlc3RfaGVpZ2h0KSkgewogICAgIGlmIChtX0xvYWRIYW5kbGUpIHsKLSAgICAgICAgZGVsZXRlIChDUERGX1Byb2dyZXNzaXZlSW1hZ2VMb2FkZXJIYW5kbGUqKW1fTG9hZEhhbmRsZTsKKyAgICAgIG1fU3RhdHVzID0gNDsKKyAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICBpZiAobV9wQ2xvbmUpIHsKLSAgICAgICAgZGVsZXRlIG1fcENsb25lOwotICAgIH0KKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1GWF9CT09MIENQREZfSW1hZ2VSZW5kZXJlcjo6U3RhcnRMb2FkRElCU291cmNlKCkKLXsKLSAgICBDRlhfRmxvYXRSZWN0IGltYWdlX3JlY3RfZiA9IG1fSW1hZ2VNYXRyaXguR2V0VW5pdFJlY3QoKTsKLSAgICBGWF9SRUNUIGltYWdlX3JlY3QgPSBpbWFnZV9yZWN0X2YuR2V0T3V0dGVyUmVjdCgpOwotICAgIGludCBkZXN0X3dpZHRoID0gaW1hZ2VfcmVjdC5XaWR0aCgpOwotICAgIGludCBkZXN0X2hlaWdodCA9IGltYWdlX3JlY3QuSGVpZ2h0KCk7Ci0gICAgaWYgKG1fSW1hZ2VNYXRyaXguYSA8IDApIHsKLSAgICAgICAgZGVzdF93aWR0aCA9IC1kZXN0X3dpZHRoOworRlhfQk9PTCBDUERGX0ltYWdlUmVuZGVyZXI6OlN0YXJ0UmVuZGVyRElCU291cmNlKCkgeworICBpZiAoIW1fTG9hZGVyLm1fcEJpdG1hcCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX0JpdG1hcEFscGhhID0gMjU1OworICBjb25zdCBDUERGX0dlbmVyYWxTdGF0ZURhdGEqIHBHZW5lcmFsU3RhdGUgPSBtX3BJbWFnZU9iamVjdC0+bV9HZW5lcmFsU3RhdGU7CisgIGlmIChwR2VuZXJhbFN0YXRlKSB7CisgICAgbV9CaXRtYXBBbHBoYSA9IEZYU1lTX3JvdW5kKHBHZW5lcmFsU3RhdGUtPm1fRmlsbEFscGhhICogMjU1KTsKKyAgfQorICBtX3BESUJTb3VyY2UgPSBtX0xvYWRlci5tX3BCaXRtYXA7CisgIGlmIChtX3BSZW5kZXJTdGF0dXMtPm1fT3B0aW9ucy5tX0NvbG9yTW9kZSA9PSBSRU5ERVJfQ09MT1JfQUxQSEEgJiYKKyAgICAgICFtX0xvYWRlci5tX3BNYXNrKSB7CisgICAgcmV0dXJuIFN0YXJ0Qml0bWFwQWxwaGEoKTsKKyAgfQorICBpZiAocEdlbmVyYWxTdGF0ZSAmJiBwR2VuZXJhbFN0YXRlLT5tX3BUUikgeworICAgIGlmICghcEdlbmVyYWxTdGF0ZS0+bV9wVHJhbnNmZXJGdW5jKSB7CisgICAgICAoKENQREZfR2VuZXJhbFN0YXRlRGF0YSopcEdlbmVyYWxTdGF0ZSktPm1fcFRyYW5zZmVyRnVuYyA9CisgICAgICAgICAgbV9wUmVuZGVyU3RhdHVzLT5HZXRUcmFuc2ZlckZ1bmMocEdlbmVyYWxTdGF0ZS0+bV9wVFIpOwogICAgIH0KLSAgICBpZiAobV9JbWFnZU1hdHJpeC5kID4gMCkgewotICAgICAgICBkZXN0X2hlaWdodCA9IC1kZXN0X2hlaWdodDsKKyAgICBpZiAocEdlbmVyYWxTdGF0ZS0+bV9wVHJhbnNmZXJGdW5jICYmCisgICAgICAgICFwR2VuZXJhbFN0YXRlLT5tX3BUcmFuc2ZlckZ1bmMtPm1fYklkZW50aXR5KSB7CisgICAgICBtX3BESUJTb3VyY2UgPSBtX0xvYWRlci5tX3BCaXRtYXAgPQorICAgICAgICAgIHBHZW5lcmFsU3RhdGUtPm1fcFRyYW5zZmVyRnVuYy0+VHJhbnNsYXRlSW1hZ2UobV9Mb2FkZXIubV9wQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW1fTG9hZGVyLm1fYkNhY2hlZCk7CisgICAgICBpZiAobV9Mb2FkZXIubV9iQ2FjaGVkICYmIG1fTG9hZGVyLm1fcE1hc2spIHsKKyAgICAgICAgbV9Mb2FkZXIubV9wTWFzayA9IG1fTG9hZGVyLm1fcE1hc2stPkNsb25lKCk7CisgICAgICB9CisgICAgICBtX0xvYWRlci5tX2JDYWNoZWQgPSBGQUxTRTsKICAgICB9Ci0gICAgaWYgKG1fTG9hZGVyLlN0YXJ0TG9hZEltYWdlKG1fcEltYWdlT2JqZWN0LCBtX3BSZW5kZXJTdGF0dXMtPm1fcENvbnRleHQtPm1fcFBhZ2VDYWNoZSwgbV9Mb2FkSGFuZGxlLCBtX2JTdGRDUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVuZGVyU3RhdHVzLT5tX0dyb3VwRmFtaWx5LCBtX3BSZW5kZXJTdGF0dXMtPm1fYkxvYWRNYXNrLCBtX3BSZW5kZXJTdGF0dXMsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0KSkgewotICAgICAgICBpZiAobV9Mb2FkSGFuZGxlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1fU3RhdHVzID0gNDsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworICB9CisgIG1fRmlsbEFyZ2IgPSAwOworICBtX2JQYXR0ZXJuQ29sb3IgPSBGQUxTRTsKKyAgbV9wUGF0dGVybiA9IE5VTEw7CisgIGlmIChtX3BESUJTb3VyY2UtPklzQWxwaGFNYXNrKCkpIHsKKyAgICBDUERGX0NvbG9yKiBwQ29sb3IgPSBtX3BJbWFnZU9iamVjdC0+bV9Db2xvclN0YXRlLkdldEZpbGxDb2xvcigpOworICAgIGlmIChwQ29sb3IgJiYgcENvbG9yLT5Jc1BhdHRlcm4oKSkgeworICAgICAgbV9wUGF0dGVybiA9IHBDb2xvci0+R2V0UGF0dGVybigpOworICAgICAgaWYgKG1fcFBhdHRlcm4pIHsKKyAgICAgICAgbV9iUGF0dGVybkNvbG9yID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgICAgbV9GaWxsQXJnYiA9IG1fcFJlbmRlclN0YXR1cy0+R2V0RmlsbEFyZ2IobV9wSW1hZ2VPYmplY3QpOworICB9IGVsc2UgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9PcHRpb25zLm1fQ29sb3JNb2RlID09IFJFTkRFUl9DT0xPUl9HUkFZKSB7CisgICAgbV9wQ2xvbmUgPSBtX3BESUJTb3VyY2UtPkNsb25lKCk7CisgICAgbV9wQ2xvbmUtPkNvbnZlcnRDb2xvclNjYWxlKG1fcFJlbmRlclN0YXR1cy0+bV9PcHRpb25zLm1fQmFja0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPm1fT3B0aW9ucy5tX0ZvcmVDb2xvcik7CisgICAgbV9wRElCU291cmNlID0gbV9wQ2xvbmU7CisgIH0KKyAgbV9GbGFncyA9IDA7CisgIGlmIChtX3BSZW5kZXJTdGF0dXMtPm1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX0ZPUkNFX0RPV05TQU1QTEUpIHsKKyAgICBtX0ZsYWdzIHw9IFJFTkRFUl9GT1JDRV9ET1dOU0FNUExFOworICB9IGVsc2UgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfRk9SQ0VfSEFMRlRPTkUpIHsKKyAgICBtX0ZsYWdzIHw9IFJFTkRFUl9GT1JDRV9IQUxGVE9ORTsKKyAgfQorICBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPkdldERldmljZUNsYXNzKCkgIT0gRlhEQ19ESVNQTEFZKSB7CisgICAgQ1BERl9PYmplY3QqIHBGaWx0ZXJzID0KKyAgICAgICAgbV9wSW1hZ2VPYmplY3QtPm1fcEltYWdlLT5HZXRTdHJlYW0oKS0+R2V0RGljdCgpLT5HZXRFbGVtZW50VmFsdWUoCisgICAgICAgICAgICAiRmlsdGVyIik7CisgICAgaWYgKHBGaWx0ZXJzKSB7CisgICAgICBpZiAocEZpbHRlcnMtPklzTmFtZSgpKSB7CisgICAgICAgIENGWF9CeXRlU3RyaW5nQyBic0RlY29kZVR5cGUgPSBwRmlsdGVycy0+R2V0Q29uc3RTdHJpbmcoKTsKKyAgICAgICAgaWYgKGJzRGVjb2RlVHlwZSA9PSAiRENURGVjb2RlIiB8fCBic0RlY29kZVR5cGUgPT0gIkpQWERlY29kZSIpIHsKKyAgICAgICAgICBtX0ZsYWdzIHw9IEZYUkVOREVSX0lNQUdFX0xPU1NZOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0gZWxzZSBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcEZpbHRlcnMtPkFzQXJyYXkoKSkgeworICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyBpKyspIHsKKyAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0MgYnNEZWNvZGVUeXBlID0gcEFycmF5LT5HZXRDb25zdFN0cmluZyhpKTsKKyAgICAgICAgICBpZiAoYnNEZWNvZGVUeXBlID09ICJEQ1REZWNvZGUiIHx8IGJzRGVjb2RlVHlwZSA9PSAiSlBYRGVjb2RlIikgeworICAgICAgICAgICAgbV9GbGFncyB8PSBGWFJFTkRFUl9JTUFHRV9MT1NTWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9OT0lNQUdFU01PT1RIKSB7CisgICAgbV9GbGFncyB8PSBGWERJQl9OT1NNT09USDsKKyAgfSBlbHNlIGlmIChtX3BJbWFnZU9iamVjdC0+bV9wSW1hZ2UtPklzSW50ZXJwb2woKSkgeworICAgIG1fRmxhZ3MgfD0gRlhESUJfSU5URVJQT0w7CisgIH0KKyAgaWYgKG1fTG9hZGVyLm1fcE1hc2spIHsKKyAgICByZXR1cm4gRHJhd01hc2tlZEltYWdlKCk7CisgIH0KKyAgaWYgKG1fYlBhdHRlcm5Db2xvcikgeworICAgIHJldHVybiBEcmF3UGF0dGVybkltYWdlKG1fcE9iajJEZXZpY2UpOworICB9CisgIGlmIChtX0JpdG1hcEFscGhhID09IDI1NSAmJiBwR2VuZXJhbFN0YXRlICYmIHBHZW5lcmFsU3RhdGUtPm1fRmlsbE9QICYmCisgICAgICBwR2VuZXJhbFN0YXRlLT5tX09QTW9kZSA9PSAwICYmCisgICAgICBwR2VuZXJhbFN0YXRlLT5tX0JsZW5kVHlwZSA9PSBGWERJQl9CTEVORF9OT1JNQUwgJiYKKyAgICAgIHBHZW5lcmFsU3RhdGUtPm1fU3Ryb2tlQWxwaGEgPT0gMSAmJiBwR2VuZXJhbFN0YXRlLT5tX0ZpbGxBbHBoYSA9PSAxKSB7CisgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gTlVMTDsKKyAgICBDUERGX1BhZ2UqIHBQYWdlID0gTlVMTDsKKyAgICBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX3BDb250ZXh0LT5HZXRQYWdlQ2FjaGUoKSkgeworICAgICAgcFBhZ2UgPSBtX3BSZW5kZXJTdGF0dXMtPm1fcENvbnRleHQtPkdldFBhZ2VDYWNoZSgpLT5HZXRQYWdlKCk7CisgICAgICBwRG9jdW1lbnQgPSBwUGFnZS0+bV9wRG9jdW1lbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHBEb2N1bWVudCA9IG1fcEltYWdlT2JqZWN0LT5tX3BJbWFnZS0+R2V0RG9jdW1lbnQoKTsKKyAgICB9CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcyA9IHBQYWdlID8gcFBhZ2UtPm1fcFBhZ2VSZXNvdXJjZXMgOiBOVUxMOworICAgIENQREZfT2JqZWN0KiBwQ1NPYmogPQorICAgICAgICBtX3BJbWFnZU9iamVjdC0+bV9wSW1hZ2UtPkdldFN0cmVhbSgpLT5HZXREaWN0KCktPkdldEVsZW1lbnRWYWx1ZSgKKyAgICAgICAgICAgICJDb2xvclNwYWNlIik7CisgICAgQ1BERl9Db2xvclNwYWNlKiBwQ29sb3JTcGFjZSA9CisgICAgICAgIHBEb2N1bWVudC0+TG9hZENvbG9yU3BhY2UocENTT2JqLCBwUGFnZVJlc291cmNlcyk7CisgICAgaWYgKHBDb2xvclNwYWNlKSB7CisgICAgICBpbnQgZm9ybWF0ID0gcENvbG9yU3BhY2UtPkdldEZhbWlseSgpOworICAgICAgaWYgKGZvcm1hdCA9PSBQREZDU19ERVZJQ0VDTVlLIHx8IGZvcm1hdCA9PSBQREZDU19TRVBBUkFUSU9OIHx8CisgICAgICAgICAgZm9ybWF0ID09IFBERkNTX0RFVklDRU4pIHsKKyAgICAgICAgbV9CbGVuZFR5cGUgPSBGWERJQl9CTEVORF9EQVJLRU47CisgICAgICB9CisgICAgICBwRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VDb2xvclNwYWNlKHBDU09iaik7CisgICAgfQorICB9CisgIHJldHVybiBTdGFydERJQlNvdXJjZSgpOworfQorRlhfQk9PTCBDUERGX0ltYWdlUmVuZGVyZXI6OlN0YXJ0KENQREZfUmVuZGVyU3RhdHVzKiBwU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRUeXBlKSB7CisgIG1fcFJlbmRlclN0YXR1cyA9IHBTdGF0dXM7CisgIG1fYlN0ZENTID0gYlN0ZENTOworICBtX3BJbWFnZU9iamVjdCA9IChDUERGX0ltYWdlT2JqZWN0KilwT2JqOworICBtX0JsZW5kVHlwZSA9IGJsZW5kVHlwZTsKKyAgbV9wT2JqMkRldmljZSA9IHBPYmoyRGV2aWNlOworICBDUERGX0RpY3Rpb25hcnkqIHBPQyA9IG1fcEltYWdlT2JqZWN0LT5tX3BJbWFnZS0+R2V0T0MoKTsKKyAgaWYgKHBPQyAmJiBtX3BSZW5kZXJTdGF0dXMtPm1fT3B0aW9ucy5tX3BPQ0NvbnRleHQgJiYKKyAgICAgICFtX3BSZW5kZXJTdGF0dXMtPm1fT3B0aW9ucy5tX3BPQ0NvbnRleHQtPkNoZWNrT0NHVmlzaWJsZShwT0MpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fSW1hZ2VNYXRyaXggPSBtX3BJbWFnZU9iamVjdC0+bV9NYXRyaXg7CisgIG1fSW1hZ2VNYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7CisgIGlmIChTdGFydExvYWRESUJTb3VyY2UoKSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBTdGFydFJlbmRlckRJQlNvdXJjZSgpOworfQorRlhfQk9PTCBDUERGX0ltYWdlUmVuZGVyZXI6OlN0YXJ0KENQREZfUmVuZGVyU3RhdHVzKiBwU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBESUJTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBiaXRtYXBfYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBJbWFnZTJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kVHlwZSkgeworICBtX3BSZW5kZXJTdGF0dXMgPSBwU3RhdHVzOworICBtX3BESUJTb3VyY2UgPSBwRElCU291cmNlOworICBtX0ZpbGxBcmdiID0gYml0bWFwX2FyZ2I7CisgIG1fQml0bWFwQWxwaGEgPSBiaXRtYXBfYWxwaGE7CisgIG1fSW1hZ2VNYXRyaXggPSAqcEltYWdlMkRldmljZTsKKyAgbV9GbGFncyA9IGZsYWdzOworICBtX2JTdGRDUyA9IGJTdGRDUzsKKyAgbV9CbGVuZFR5cGUgPSBibGVuZFR5cGU7CisgIHJldHVybiBTdGFydERJQlNvdXJjZSgpOworfQorRlhfQk9PTCBDUERGX0ltYWdlUmVuZGVyZXI6OkRyYXdQYXR0ZXJuSW1hZ2UoY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UpIHsKKyAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9iUHJpbnQgJiYKKyAgICAgICEobV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQkxFTkRfTU9ERSkpIHsKKyAgICBtX1Jlc3VsdCA9IEZBTFNFOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9SRUNUIHJlY3QgPSBtX0ltYWdlTWF0cml4LkdldFVuaXRSZWN0KCkuR2V0T3V0dGVyUmVjdCgpOworICByZWN0LkludGVyc2VjdChtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+R2V0Q2xpcEJveCgpKTsKKyAgaWYgKHJlY3QuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENGWF9NYXRyaXggbmV3X21hdHJpeCA9IG1fSW1hZ2VNYXRyaXg7CisgIG5ld19tYXRyaXguVHJhbnNsYXRlSSgtcmVjdC5sZWZ0LCAtcmVjdC50b3ApOworICBpbnQgd2lkdGggPSByZWN0LldpZHRoKCk7CisgIGludCBoZWlnaHQgPSByZWN0LkhlaWdodCgpOworICBDRlhfRnhnZURldmljZSBiaXRtYXBfZGV2aWNlMTsKKyAgaWYgKCFiaXRtYXBfZGV2aWNlMS5DcmVhdGUocmVjdC5XaWR0aCgpLCByZWN0LkhlaWdodCgpLCBGWERJQl9SZ2IzMikpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBiaXRtYXBfZGV2aWNlMS5HZXRCaXRtYXAoKS0+Q2xlYXIoMHhmZmZmZmYpOworICB7CisgICAgQ1BERl9SZW5kZXJTdGF0dXMgYml0bWFwX3JlbmRlcjsKKyAgICBiaXRtYXBfcmVuZGVyLkluaXRpYWxpemUobV9wUmVuZGVyU3RhdHVzLT5tX3BDb250ZXh0LCAmYml0bWFwX2RldmljZTEsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsICZtX3BSZW5kZXJTdGF0dXMtPm1fT3B0aW9ucywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVuZGVyU3RhdHVzLT5tX2JEcm9wT2JqZWN0cywgTlVMTCwgVFJVRSk7CisgICAgQ0ZYX01hdHJpeCBwYXR0ZXJuRGV2aWNlID0gKnBPYmoyRGV2aWNlOworICAgIHBhdHRlcm5EZXZpY2UuVHJhbnNsYXRlKChGWF9GTE9BVCktcmVjdC5sZWZ0LCAoRlhfRkxPQVQpLXJlY3QudG9wKTsKKyAgICBpZiAobV9wUGF0dGVybi0+bV9QYXR0ZXJuVHlwZSA9PSBDUERGX1BhdHRlcm46OlRJTElORykgeworICAgICAgYml0bWFwX3JlbmRlci5EcmF3VGlsaW5nUGF0dGVybigKKyAgICAgICAgICBzdGF0aWNfY2FzdDxDUERGX1RpbGluZ1BhdHRlcm4qPihtX3BQYXR0ZXJuKSwgbV9wSW1hZ2VPYmplY3QsCisgICAgICAgICAgJnBhdHRlcm5EZXZpY2UsIEZBTFNFKTsKKyAgICB9IGVsc2UgeworICAgICAgYml0bWFwX3JlbmRlci5EcmF3U2hhZGluZ1BhdHRlcm4oCisgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1BERl9TaGFkaW5nUGF0dGVybio+KG1fcFBhdHRlcm4pLCBtX3BJbWFnZU9iamVjdCwKKyAgICAgICAgICAmcGF0dGVybkRldmljZSwgRkFMU0UpOworICAgIH0KKyAgfQorICB7CisgICAgQ0ZYX0Z4Z2VEZXZpY2UgYml0bWFwX2RldmljZTI7CisgICAgaWYgKCFiaXRtYXBfZGV2aWNlMi5DcmVhdGUocmVjdC5XaWR0aCgpLCByZWN0LkhlaWdodCgpLCBGWERJQl84YnBwUmdiKSkgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGJpdG1hcF9kZXZpY2UyLkdldEJpdG1hcCgpLT5DbGVhcigwKTsKKyAgICBDUERGX1JlbmRlclN0YXR1cyBiaXRtYXBfcmVuZGVyOworICAgIGJpdG1hcF9yZW5kZXIuSW5pdGlhbGl6ZShtX3BSZW5kZXJTdGF0dXMtPm1fcENvbnRleHQsICZiaXRtYXBfZGV2aWNlMiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVuZGVyU3RhdHVzLT5tX2JEcm9wT2JqZWN0cywgTlVMTCwgVFJVRSk7CisgICAgQ1BERl9JbWFnZVJlbmRlcmVyIGltYWdlX3JlbmRlcjsKKyAgICBpZiAoaW1hZ2VfcmVuZGVyLlN0YXJ0KCZiaXRtYXBfcmVuZGVyLCBtX3BESUJTb3VyY2UsIDB4ZmZmZmZmZmYsIDI1NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdfbWF0cml4LCBtX0ZsYWdzLCBUUlVFKSkgeworICAgICAgaW1hZ2VfcmVuZGVyLkNvbnRpbnVlKE5VTEwpOworICAgIH0KKyAgICBpZiAobV9Mb2FkZXIubV9NYXR0ZUNvbG9yICE9IDB4ZmZmZmZmZmYpIHsKKyAgICAgIGludCBtYXR0ZV9yID0gRlhBUkdCX1IobV9Mb2FkZXIubV9NYXR0ZUNvbG9yKTsKKyAgICAgIGludCBtYXR0ZV9nID0gRlhBUkdCX0cobV9Mb2FkZXIubV9NYXR0ZUNvbG9yKTsKKyAgICAgIGludCBtYXR0ZV9iID0gRlhBUkdCX0IobV9Mb2FkZXIubV9NYXR0ZUNvbG9yKTsKKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0KKyAgICAgICAgICAgICh1aW50OF90KiliaXRtYXBfZGV2aWNlMS5HZXRCaXRtYXAoKS0+R2V0U2NhbmxpbmUocm93KTsKKyAgICAgICAgY29uc3QgdWludDhfdCogbWFza19zY2FuID0gYml0bWFwX2RldmljZTIuR2V0Qml0bWFwKCktPkdldFNjYW5saW5lKHJvdyk7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICAgIGludCBhbHBoYSA9ICptYXNrX3NjYW4rKzsKKyAgICAgICAgICBpZiAoYWxwaGEpIHsKKyAgICAgICAgICAgIGludCBvcmlnID0gKCpkZXN0X3NjYW4gLSBtYXR0ZV9iKSAqIDI1NSAvIGFscGhhICsgbWF0dGVfYjsKKyAgICAgICAgICAgIGlmIChvcmlnIDwgMCkgeworICAgICAgICAgICAgICBvcmlnID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3JpZyA+IDI1NSkgeworICAgICAgICAgICAgICBvcmlnID0gMjU1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gb3JpZzsKKyAgICAgICAgICAgIG9yaWcgPSAoKmRlc3Rfc2NhbiAtIG1hdHRlX2cpICogMjU1IC8gYWxwaGEgKyBtYXR0ZV9nOworICAgICAgICAgICAgaWYgKG9yaWcgPCAwKSB7CisgICAgICAgICAgICAgIG9yaWcgPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChvcmlnID4gMjU1KSB7CisgICAgICAgICAgICAgIG9yaWcgPSAyNTU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBvcmlnOworICAgICAgICAgICAgb3JpZyA9ICgqZGVzdF9zY2FuIC0gbWF0dGVfcikgKiAyNTUgLyBhbHBoYSArIG1hdHRlX3I7CisgICAgICAgICAgICBpZiAob3JpZyA8IDApIHsKKyAgICAgICAgICAgICAgb3JpZyA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9yaWcgPiAyNTUpIHsKKyAgICAgICAgICAgICAgb3JpZyA9IDI1NTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG9yaWc7CisgICAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGJpdG1hcF9kZXZpY2UyLkdldEJpdG1hcCgpLT5Db252ZXJ0Rm9ybWF0KEZYRElCXzhicHBNYXNrKTsKKyAgICBiaXRtYXBfZGV2aWNlMS5HZXRCaXRtYXAoKS0+TXVsdGlwbHlBbHBoYShiaXRtYXBfZGV2aWNlMi5HZXRCaXRtYXAoKSk7CisgICAgYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCktPk11bHRpcGx5QWxwaGEoMjU1KTsKKyAgfQorICBtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+U2V0RElCaXRzKGJpdG1hcF9kZXZpY2UxLkdldEJpdG1hcCgpLCByZWN0LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC50b3AsIG1fQmxlbmRUeXBlKTsKKyAgcmV0dXJuIEZBTFNFOworfQorRlhfQk9PTCBDUERGX0ltYWdlUmVuZGVyZXI6OkRyYXdNYXNrZWRJbWFnZSgpIHsKKyAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9iUHJpbnQgJiYKKyAgICAgICEobV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQkxFTkRfTU9ERSkpIHsKKyAgICBtX1Jlc3VsdCA9IEZBTFNFOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9SRUNUIHJlY3QgPSBtX0ltYWdlTWF0cml4LkdldFVuaXRSZWN0KCkuR2V0T3V0dGVyUmVjdCgpOworICByZWN0LkludGVyc2VjdChtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+R2V0Q2xpcEJveCgpKTsKKyAgaWYgKHJlY3QuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENGWF9NYXRyaXggbmV3X21hdHJpeCA9IG1fSW1hZ2VNYXRyaXg7CisgIG5ld19tYXRyaXguVHJhbnNsYXRlSSgtcmVjdC5sZWZ0LCAtcmVjdC50b3ApOworICBpbnQgd2lkdGggPSByZWN0LldpZHRoKCk7CisgIGludCBoZWlnaHQgPSByZWN0LkhlaWdodCgpOworICBDRlhfRnhnZURldmljZSBiaXRtYXBfZGV2aWNlMTsKKyAgaWYgKCFiaXRtYXBfZGV2aWNlMS5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfUmdiMzIpKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCktPkNsZWFyKDB4ZmZmZmZmKTsKKyAgeworICAgIENQREZfUmVuZGVyU3RhdHVzIGJpdG1hcF9yZW5kZXI7CisgICAgYml0bWFwX3JlbmRlci5Jbml0aWFsaXplKG1fcFJlbmRlclN0YXR1cy0+bV9wQ29udGV4dCwgJmJpdG1hcF9kZXZpY2UxLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPm1fYkRyb3BPYmplY3RzLCBOVUxMLCBUUlVFKTsKKyAgICBDUERGX0ltYWdlUmVuZGVyZXIgaW1hZ2VfcmVuZGVyOworICAgIGlmIChpbWFnZV9yZW5kZXIuU3RhcnQoJmJpdG1hcF9yZW5kZXIsIG1fcERJQlNvdXJjZSwgMCwgMjU1LCAmbmV3X21hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fRmxhZ3MsIFRSVUUpKSB7CisgICAgICBpbWFnZV9yZW5kZXIuQ29udGludWUoTlVMTCk7CisgICAgfQorICB9CisgIHsKKyAgICBDRlhfRnhnZURldmljZSBiaXRtYXBfZGV2aWNlMjsKKyAgICBpZiAoIWJpdG1hcF9kZXZpY2UyLkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl84YnBwUmdiKSkgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGJpdG1hcF9kZXZpY2UyLkdldEJpdG1hcCgpLT5DbGVhcigwKTsKKyAgICBDUERGX1JlbmRlclN0YXR1cyBiaXRtYXBfcmVuZGVyOworICAgIGJpdG1hcF9yZW5kZXIuSW5pdGlhbGl6ZShtX3BSZW5kZXJTdGF0dXMtPm1fcENvbnRleHQsICZiaXRtYXBfZGV2aWNlMiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVuZGVyU3RhdHVzLT5tX2JEcm9wT2JqZWN0cywgTlVMTCwgVFJVRSk7CisgICAgQ1BERl9JbWFnZVJlbmRlcmVyIGltYWdlX3JlbmRlcjsKKyAgICBpZiAoaW1hZ2VfcmVuZGVyLlN0YXJ0KCZiaXRtYXBfcmVuZGVyLCBtX0xvYWRlci5tX3BNYXNrLCAweGZmZmZmZmZmLCAyNTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3X21hdHJpeCwgbV9GbGFncywgVFJVRSkpIHsKKyAgICAgIGltYWdlX3JlbmRlci5Db250aW51ZShOVUxMKTsKKyAgICB9CisgICAgaWYgKG1fTG9hZGVyLm1fTWF0dGVDb2xvciAhPSAweGZmZmZmZmZmKSB7CisgICAgICBpbnQgbWF0dGVfciA9IEZYQVJHQl9SKG1fTG9hZGVyLm1fTWF0dGVDb2xvcik7CisgICAgICBpbnQgbWF0dGVfZyA9IEZYQVJHQl9HKG1fTG9hZGVyLm1fTWF0dGVDb2xvcik7CisgICAgICBpbnQgbWF0dGVfYiA9IEZYQVJHQl9CKG1fTG9hZGVyLm1fTWF0dGVDb2xvcik7CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9CisgICAgICAgICAgICAodWludDhfdCopYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCktPkdldFNjYW5saW5lKHJvdyk7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIG1hc2tfc2NhbiA9IGJpdG1hcF9kZXZpY2UyLkdldEJpdG1hcCgpLT5HZXRTY2FubGluZShyb3cpOworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgICBpbnQgYWxwaGEgPSAqbWFza19zY2FuKys7CisgICAgICAgICAgaWYgKGFscGhhKSB7CisgICAgICAgICAgICBpbnQgb3JpZyA9ICgqZGVzdF9zY2FuIC0gbWF0dGVfYikgKiAyNTUgLyBhbHBoYSArIG1hdHRlX2I7CisgICAgICAgICAgICBpZiAob3JpZyA8IDApIHsKKyAgICAgICAgICAgICAgb3JpZyA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9yaWcgPiAyNTUpIHsKKyAgICAgICAgICAgICAgb3JpZyA9IDI1NTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG9yaWc7CisgICAgICAgICAgICBvcmlnID0gKCpkZXN0X3NjYW4gLSBtYXR0ZV9nKSAqIDI1NSAvIGFscGhhICsgbWF0dGVfZzsKKyAgICAgICAgICAgIGlmIChvcmlnIDwgMCkgeworICAgICAgICAgICAgICBvcmlnID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3JpZyA+IDI1NSkgeworICAgICAgICAgICAgICBvcmlnID0gMjU1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gb3JpZzsKKyAgICAgICAgICAgIG9yaWcgPSAoKmRlc3Rfc2NhbiAtIG1hdHRlX3IpICogMjU1IC8gYWxwaGEgKyBtYXR0ZV9yOworICAgICAgICAgICAgaWYgKG9yaWcgPCAwKSB7CisgICAgICAgICAgICAgIG9yaWcgPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChvcmlnID4gMjU1KSB7CisgICAgICAgICAgICAgIG9yaWcgPSAyNTU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBvcmlnOworICAgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBiaXRtYXBfZGV2aWNlMi5HZXRCaXRtYXAoKS0+Q29udmVydEZvcm1hdChGWERJQl84YnBwTWFzayk7CisgICAgYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCktPk11bHRpcGx5QWxwaGEoYml0bWFwX2RldmljZTIuR2V0Qml0bWFwKCkpOworICAgIGlmIChtX0JpdG1hcEFscGhhIDwgMjU1KSB7CisgICAgICBiaXRtYXBfZGV2aWNlMS5HZXRCaXRtYXAoKS0+TXVsdGlwbHlBbHBoYShtX0JpdG1hcEFscGhhKTsKKyAgICB9CisgIH0KKyAgbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPlNldERJQml0cyhiaXRtYXBfZGV2aWNlMS5HZXRCaXRtYXAoKSwgcmVjdC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QudG9wLCBtX0JsZW5kVHlwZSk7CisgIHJldHVybiBGQUxTRTsKK30KK0ZYX0JPT0wgQ1BERl9JbWFnZVJlbmRlcmVyOjpTdGFydERJQlNvdXJjZSgpIHsKKyAgaWYgKCEobV9GbGFncyAmIFJFTkRFUl9GT1JDRV9ET1dOU0FNUExFKSAmJiBtX3BESUJTb3VyY2UtPkdldEJQUCgpID4gMSkgeworICAgIGludCBpbWFnZV9zaXplID0gbV9wRElCU291cmNlLT5HZXRCUFAoKSAvIDggKiBtX3BESUJTb3VyY2UtPkdldFdpZHRoKCkgKgorICAgICAgICAgICAgICAgICAgICAgbV9wRElCU291cmNlLT5HZXRIZWlnaHQoKTsKKyAgICBpZiAoaW1hZ2Vfc2l6ZSA+IEZQREZfSFVHRV9JTUFHRV9TSVpFICYmCisgICAgICAgICEobV9GbGFncyAmIFJFTkRFUl9GT1JDRV9IQUxGVE9ORSkpIHsKKyAgICAgIG1fRmxhZ3MgfD0gUkVOREVSX0ZPUkNFX0RPV05TQU1QTEU7CisgICAgfQorICB9CisgIGlmIChtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+U3RhcnRESUJpdHMoCisgICAgICAgICAgbV9wRElCU291cmNlLCBtX0JpdG1hcEFscGhhLCBtX0ZpbGxBcmdiLCAmbV9JbWFnZU1hdHJpeCwgbV9GbGFncywKKyAgICAgICAgICBtX0RldmljZUhhbmRsZSwgMCwgTlVMTCwgbV9CbGVuZFR5cGUpKSB7CisgICAgaWYgKG1fRGV2aWNlSGFuZGxlKSB7CisgICAgICBtX1N0YXR1cyA9IDM7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgcmV0dXJuIEZBTFNFOwotfQotRlhfQk9PTCBDUERGX0ltYWdlUmVuZGVyZXI6OlN0YXJ0UmVuZGVyRElCU291cmNlKCkKLXsKLSAgICBpZiAobV9Mb2FkZXIubV9wQml0bWFwID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX0JpdG1hcEFscGhhID0gMjU1OwotICAgIGNvbnN0IENQREZfR2VuZXJhbFN0YXRlRGF0YSogcEdlbmVyYWxTdGF0ZSA9IG1fcEltYWdlT2JqZWN0LT5tX0dlbmVyYWxTdGF0ZTsKLSAgICBpZiAocEdlbmVyYWxTdGF0ZSkgewotICAgICAgICBtX0JpdG1hcEFscGhhID0gRlhTWVNfcm91bmQocEdlbmVyYWxTdGF0ZS0+bV9GaWxsQWxwaGEgKiAyNTUpOwotICAgIH0KLSAgICBtX3BESUJTb3VyY2UgPSBtX0xvYWRlci5tX3BCaXRtYXA7Ci0gICAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9PcHRpb25zLm1fQ29sb3JNb2RlID09IFJFTkRFUl9DT0xPUl9BTFBIQSAmJiBtX0xvYWRlci5tX3BNYXNrID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFN0YXJ0Qml0bWFwQWxwaGEoKTsKLSAgICB9Ci0gICAgaWYgKHBHZW5lcmFsU3RhdGUgJiYgcEdlbmVyYWxTdGF0ZS0+bV9wVFIpIHsKLSAgICAgICAgaWYgKCFwR2VuZXJhbFN0YXRlLT5tX3BUcmFuc2ZlckZ1bmMpIHsKLSAgICAgICAgICAgICgoQ1BERl9HZW5lcmFsU3RhdGVEYXRhKilwR2VuZXJhbFN0YXRlKS0+bV9wVHJhbnNmZXJGdW5jID0gbV9wUmVuZGVyU3RhdHVzLT5HZXRUcmFuc2ZlckZ1bmMocEdlbmVyYWxTdGF0ZS0+bV9wVFIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwR2VuZXJhbFN0YXRlLT5tX3BUcmFuc2ZlckZ1bmMgJiYgIXBHZW5lcmFsU3RhdGUtPm1fcFRyYW5zZmVyRnVuYy0+bV9iSWRlbnRpdHkpIHsKLSAgICAgICAgICAgIG1fcERJQlNvdXJjZSA9IG1fTG9hZGVyLm1fcEJpdG1hcCA9IHBHZW5lcmFsU3RhdGUtPm1fcFRyYW5zZmVyRnVuYy0+VHJhbnNsYXRlSW1hZ2UobV9Mb2FkZXIubV9wQml0bWFwLCAhbV9Mb2FkZXIubV9iQ2FjaGVkKTsKLSAgICAgICAgICAgIGlmIChtX0xvYWRlci5tX2JDYWNoZWQgJiYgbV9Mb2FkZXIubV9wTWFzaykgewotICAgICAgICAgICAgICAgIG1fTG9hZGVyLm1fcE1hc2sgPSBtX0xvYWRlci5tX3BNYXNrLT5DbG9uZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9Mb2FkZXIubV9iQ2FjaGVkID0gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9GaWxsQXJnYiA9IDA7Ci0gICAgbV9iUGF0dGVybkNvbG9yID0gRkFMU0U7Ci0gICAgbV9wUGF0dGVybiA9IE5VTEw7Ci0gICAgaWYgKG1fcERJQlNvdXJjZS0+SXNBbHBoYU1hc2soKSkgewotICAgICAgICBDUERGX0NvbG9yKiBwQ29sb3IgPSBtX3BJbWFnZU9iamVjdC0+bV9Db2xvclN0YXRlLkdldEZpbGxDb2xvcigpOwotICAgICAgICBpZiAocENvbG9yICYmIHBDb2xvci0+SXNQYXR0ZXJuKCkpIHsKLSAgICAgICAgICAgIG1fcFBhdHRlcm4gPSBwQ29sb3ItPkdldFBhdHRlcm4oKTsKLSAgICAgICAgICAgIGlmIChtX3BQYXR0ZXJuICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtX2JQYXR0ZXJuQ29sb3IgPSBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1fRmlsbEFyZ2IgPSBtX3BSZW5kZXJTdGF0dXMtPkdldEZpbGxBcmdiKG1fcEltYWdlT2JqZWN0KTsKLSAgICB9IGVsc2UgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9PcHRpb25zLm1fQ29sb3JNb2RlID09IFJFTkRFUl9DT0xPUl9HUkFZKSB7Ci0gICAgICAgIG1fcENsb25lID0gbV9wRElCU291cmNlLT5DbG9uZSgpOwotICAgICAgICBtX3BDbG9uZS0+Q29udmVydENvbG9yU2NhbGUobV9wUmVuZGVyU3RhdHVzLT5tX09wdGlvbnMubV9CYWNrQ29sb3IsIG1fcFJlbmRlclN0YXR1cy0+bV9PcHRpb25zLm1fRm9yZUNvbG9yKTsKLSAgICAgICAgbV9wRElCU291cmNlID0gbV9wQ2xvbmU7Ci0gICAgfQotICAgIG1fRmxhZ3MgPSAwOwotICAgIGlmIChtX3BSZW5kZXJTdGF0dXMtPm1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX0ZPUkNFX0RPV05TQU1QTEUpIHsKLSAgICAgICAgbV9GbGFncyB8PSBSRU5ERVJfRk9SQ0VfRE9XTlNBTVBMRTsKLSAgICB9IGVsc2UgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfRk9SQ0VfSEFMRlRPTkUpIHsKLSAgICAgICAgbV9GbGFncyB8PSBSRU5ERVJfRk9SQ0VfSEFMRlRPTkU7Ci0gICAgfQotICAgIGlmIChtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+R2V0RGV2aWNlQ2xhc3MoKSAhPSBGWERDX0RJU1BMQVkpIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBGaWx0ZXJzID0gbV9wSW1hZ2VPYmplY3QtPm1fcEltYWdlLT5HZXRTdHJlYW0oKS0+R2V0RGljdCgpLT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkZpbHRlciIpKTsKLSAgICAgICAgaWYgKHBGaWx0ZXJzKSB7Ci0gICAgICAgICAgICBpZiAocEZpbHRlcnMtPkdldFR5cGUoKSA9PSBQREZPQkpfTkFNRSkgewotICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQyBic0RlY29kZVR5cGUgPSBwRmlsdGVycy0+R2V0Q29uc3RTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBpZiAoYnNEZWNvZGVUeXBlID09IEZYX0JTVFJDKCJEQ1REZWNvZGUiKSB8fCBic0RlY29kZVR5cGUgPT0gRlhfQlNUUkMoIkpQWERlY29kZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fRmxhZ3MgfD0gRlhSRU5ERVJfSU1BR0VfTE9TU1k7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChwRmlsdGVycy0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwRmlsdGVyczsKLSAgICAgICAgICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQyBic0RlY29kZVR5cGUgPSBwQXJyYXktPkdldENvbnN0U3RyaW5nKGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYnNEZWNvZGVUeXBlID09IEZYX0JTVFJDKCJEQ1REZWNvZGUiKSB8fCBic0RlY29kZVR5cGUgPT0gRlhfQlNUUkMoIkpQWERlY29kZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX0ZsYWdzIHw9IEZYUkVOREVSX0lNQUdFX0xPU1NZOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfTk9JTUFHRVNNT09USCkgewotICAgICAgICBtX0ZsYWdzIHw9IEZYRElCX05PU01PT1RIOwotICAgIH0gZWxzZSBpZiAobV9wSW1hZ2VPYmplY3QtPm1fcEltYWdlLT5Jc0ludGVycG9sKCkpIHsKLSAgICAgICAgbV9GbGFncyB8PSBGWERJQl9JTlRFUlBPTDsKLSAgICB9Ci0gICAgaWYgKG1fTG9hZGVyLm1fcE1hc2spIHsKLSAgICAgICAgcmV0dXJuIERyYXdNYXNrZWRJbWFnZSgpOwotICAgIH0KLSAgICBpZiAobV9iUGF0dGVybkNvbG9yKSB7Ci0gICAgICAgIHJldHVybiBEcmF3UGF0dGVybkltYWdlKG1fcE9iajJEZXZpY2UpOwotICAgIH0KLSAgICBpZiAobV9CaXRtYXBBbHBoYSA9PSAyNTUgJiYgcEdlbmVyYWxTdGF0ZSAmJiBwR2VuZXJhbFN0YXRlLT5tX0ZpbGxPUCAmJgotICAgICAgICAgICAgcEdlbmVyYWxTdGF0ZS0+bV9PUE1vZGUgPT0gMCAmJiBwR2VuZXJhbFN0YXRlLT5tX0JsZW5kVHlwZSA9PSBGWERJQl9CTEVORF9OT1JNQUwgJiYgcEdlbmVyYWxTdGF0ZS0+bV9TdHJva2VBbHBoYSA9PSAxICYmIHBHZW5lcmFsU3RhdGUtPm1fRmlsbEFscGhhID09IDEpIHsKLSAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gTlVMTDsKLSAgICAgICAgQ1BERl9QYWdlKiBwUGFnZSA9IE5VTEw7Ci0gICAgICAgIGlmIChtX3BSZW5kZXJTdGF0dXMtPm1fcENvbnRleHQtPm1fcFBhZ2VDYWNoZSkgewotICAgICAgICAgICAgcFBhZ2UgPSBtX3BSZW5kZXJTdGF0dXMtPm1fcENvbnRleHQtPm1fcFBhZ2VDYWNoZS0+R2V0UGFnZSgpOwotICAgICAgICAgICAgcERvY3VtZW50ID0gcFBhZ2UtPm1fcERvY3VtZW50OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcERvY3VtZW50ID0gbV9wSW1hZ2VPYmplY3QtPm1fcEltYWdlLT5HZXREb2N1bWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMgPSBwUGFnZSA/IHBQYWdlLT5tX3BQYWdlUmVzb3VyY2VzIDogTlVMTDsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBDU09iaiA9IG1fcEltYWdlT2JqZWN0LT5tX3BJbWFnZS0+R2V0U3RyZWFtKCktPkdldERpY3QoKS0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJDb2xvclNwYWNlIikpOwotICAgICAgICBDUERGX0NvbG9yU3BhY2UqIHBDb2xvclNwYWNlID0gcERvY3VtZW50LT5Mb2FkQ29sb3JTcGFjZShwQ1NPYmosIHBQYWdlUmVzb3VyY2VzKTsKLSAgICAgICAgaWYgKHBDb2xvclNwYWNlKSB7Ci0gICAgICAgICAgICBpbnQgZm9ybWF0ID0gcENvbG9yU3BhY2UtPkdldEZhbWlseSgpOwotICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBQREZDU19ERVZJQ0VDTVlLIHx8IGZvcm1hdCA9PSBQREZDU19TRVBBUkFUSU9OIHx8IGZvcm1hdCA9PSBQREZDU19ERVZJQ0VOKSB7Ci0gICAgICAgICAgICAgICAgbV9CbGVuZFR5cGUgPSBGWERJQl9CTEVORF9EQVJLRU47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VDb2xvclNwYWNlKHBDU09iaik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFN0YXJ0RElCU291cmNlKCk7Ci19Ci1GWF9CT09MIENQREZfSW1hZ2VSZW5kZXJlcjo6U3RhcnQoQ1BERl9SZW5kZXJTdGF0dXMqIHBTdGF0dXMsIGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIEZYX0JPT0wgYlN0ZENTLCBpbnQgYmxlbmRUeXBlKQotewotICAgIG1fcFJlbmRlclN0YXR1cyA9IHBTdGF0dXM7Ci0gICAgbV9iU3RkQ1MgPSBiU3RkQ1M7Ci0gICAgbV9wSW1hZ2VPYmplY3QgPSAoQ1BERl9JbWFnZU9iamVjdCopcE9iajsKLSAgICBtX0JsZW5kVHlwZSA9IGJsZW5kVHlwZTsKLSAgICBtX3BPYmoyRGV2aWNlID0gcE9iajJEZXZpY2U7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwT0MgPSBtX3BJbWFnZU9iamVjdC0+bV9wSW1hZ2UtPkdldE9DKCk7Ci0gICAgaWYgKHBPQyAmJiBtX3BSZW5kZXJTdGF0dXMtPm1fT3B0aW9ucy5tX3BPQ0NvbnRleHQgJiYgIW1fcFJlbmRlclN0YXR1cy0+bV9PcHRpb25zLm1fcE9DQ29udGV4dC0+Q2hlY2tPQ0dWaXNpYmxlKHBPQykpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX0ltYWdlTWF0cml4ID0gbV9wSW1hZ2VPYmplY3QtPm1fTWF0cml4OwotICAgIG1fSW1hZ2VNYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7Ci0gICAgaWYgKFN0YXJ0TG9hZERJQlNvdXJjZSgpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gU3RhcnRSZW5kZXJESUJTb3VyY2UoKTsKLX0KLUZYX0JPT0wgQ1BERl9JbWFnZVJlbmRlcmVyOjpTdGFydChDUERGX1JlbmRlclN0YXR1cyogcFN0YXR1cywgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcERJQlNvdXJjZSwgRlhfQVJHQiBiaXRtYXBfYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwSW1hZ2UyRGV2aWNlLCBGWF9EV09SRCBmbGFncywgRlhfQk9PTCBiU3RkQ1MsIGludCBibGVuZFR5cGUpCi17Ci0gICAgbV9wUmVuZGVyU3RhdHVzID0gcFN0YXR1czsKLSAgICBtX3BESUJTb3VyY2UgPSBwRElCU291cmNlOwotICAgIG1fRmlsbEFyZ2IgPSBiaXRtYXBfYXJnYjsKLSAgICBtX0JpdG1hcEFscGhhID0gYml0bWFwX2FscGhhOwotICAgIG1fSW1hZ2VNYXRyaXggPSAqcEltYWdlMkRldmljZTsKLSAgICBtX0ZsYWdzID0gZmxhZ3M7Ci0gICAgbV9iU3RkQ1MgPSBiU3RkQ1M7Ci0gICAgbV9CbGVuZFR5cGUgPSBibGVuZFR5cGU7Ci0gICAgcmV0dXJuIFN0YXJ0RElCU291cmNlKCk7Ci19Ci1GWF9CT09MCUNQREZfSW1hZ2VSZW5kZXJlcjo6RHJhd1BhdHRlcm5JbWFnZShjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSkKLXsKLSAgICBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX2JQcmludCAmJiAhKG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0JMRU5EX01PREUpKSB7Ci0gICAgICAgIG1fUmVzdWx0ID0gRkFMU0U7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfUkVDVCByZWN0ID0gbV9JbWFnZU1hdHJpeC5HZXRVbml0UmVjdCgpLkdldE91dHRlclJlY3QoKTsKLSAgICByZWN0LkludGVyc2VjdChtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+R2V0Q2xpcEJveCgpKTsKLSAgICBpZiAocmVjdC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDRlhfQWZmaW5lTWF0cml4IG5ld19tYXRyaXggPSBtX0ltYWdlTWF0cml4OwotICAgIG5ld19tYXRyaXguVHJhbnNsYXRlSSgtcmVjdC5sZWZ0LCAtcmVjdC50b3ApOwotICAgIGludCB3aWR0aCA9IHJlY3QuV2lkdGgoKTsKLSAgICBpbnQgaGVpZ2h0ID0gcmVjdC5IZWlnaHQoKTsKLSAgICBDRlhfRnhnZURldmljZSBiaXRtYXBfZGV2aWNlMTsKLSAgICBpZiAoIWJpdG1hcF9kZXZpY2UxLkNyZWF0ZShyZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCksIEZYRElCX1JnYjMyKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCktPkNsZWFyKDB4ZmZmZmZmKTsKLSAgICB7Ci0gICAgICAgIENQREZfUmVuZGVyU3RhdHVzIGJpdG1hcF9yZW5kZXI7Ci0gICAgICAgIGJpdG1hcF9yZW5kZXIuSW5pdGlhbGl6ZShtX3BSZW5kZXJTdGF0dXMtPm1fcENvbnRleHQsICZiaXRtYXBfZGV2aWNlMSwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsICZtX3BSZW5kZXJTdGF0dXMtPm1fT3B0aW9ucywgMCwgbV9wUmVuZGVyU3RhdHVzLT5tX2JEcm9wT2JqZWN0cywgTlVMTCwgVFJVRSk7Ci0gICAgICAgIENGWF9NYXRyaXggcGF0dGVybkRldmljZSA9ICpwT2JqMkRldmljZTsKLSAgICAgICAgcGF0dGVybkRldmljZS5UcmFuc2xhdGUoKEZYX0ZMT0FUKSAtIHJlY3QubGVmdCwgKEZYX0ZMT0FUKSAtIHJlY3QudG9wKTsKLSAgICAgICAgaWYobV9wUGF0dGVybi0+bV9QYXR0ZXJuVHlwZSA9PSBQQVRURVJOX1RJTElORykgewotICAgICAgICAgICAgYml0bWFwX3JlbmRlci5EcmF3VGlsaW5nUGF0dGVybigoQ1BERl9UaWxpbmdQYXR0ZXJuKiltX3BQYXR0ZXJuLCBtX3BJbWFnZU9iamVjdCwgJnBhdHRlcm5EZXZpY2UsIEZBTFNFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJpdG1hcF9yZW5kZXIuRHJhd1NoYWRpbmdQYXR0ZXJuKChDUERGX1NoYWRpbmdQYXR0ZXJuKiltX3BQYXR0ZXJuLCBtX3BJbWFnZU9iamVjdCwgJnBhdHRlcm5EZXZpY2UsIEZBTFNFKTsKLSAgICAgICAgfQotICAgIH0KLSAgICB7Ci0gICAgICAgIENGWF9GeGdlRGV2aWNlIGJpdG1hcF9kZXZpY2UyOwotICAgICAgICBpZiAoIWJpdG1hcF9kZXZpY2UyLkNyZWF0ZShyZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCksIEZYRElCXzhicHBSZ2IpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBiaXRtYXBfZGV2aWNlMi5HZXRCaXRtYXAoKS0+Q2xlYXIoMCk7Ci0gICAgICAgIENQREZfUmVuZGVyU3RhdHVzIGJpdG1hcF9yZW5kZXI7Ci0gICAgICAgIGJpdG1hcF9yZW5kZXIuSW5pdGlhbGl6ZShtX3BSZW5kZXJTdGF0dXMtPm1fcENvbnRleHQsICZiaXRtYXBfZGV2aWNlMiwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIDAsIG1fcFJlbmRlclN0YXR1cy0+bV9iRHJvcE9iamVjdHMsIE5VTEwsIFRSVUUpOwotICAgICAgICBDUERGX0ltYWdlUmVuZGVyZXIgaW1hZ2VfcmVuZGVyOwotICAgICAgICBpZiAoaW1hZ2VfcmVuZGVyLlN0YXJ0KCZiaXRtYXBfcmVuZGVyLCBtX3BESUJTb3VyY2UsIDB4ZmZmZmZmZmYsIDI1NSwgJm5ld19tYXRyaXgsIG1fRmxhZ3MsIFRSVUUpKSB7Ci0gICAgICAgICAgICBpbWFnZV9yZW5kZXIuQ29udGludWUoTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fTG9hZGVyLm1fTWF0dGVDb2xvciAhPSAweGZmZmZmZmZmKSB7Ci0gICAgICAgICAgICBpbnQgbWF0dGVfciA9IEZYQVJHQl9SKG1fTG9hZGVyLm1fTWF0dGVDb2xvcik7Ci0gICAgICAgICAgICBpbnQgbWF0dGVfZyA9IEZYQVJHQl9HKG1fTG9hZGVyLm1fTWF0dGVDb2xvcik7Ci0gICAgICAgICAgICBpbnQgbWF0dGVfYiA9IEZYQVJHQl9CKG1fTG9hZGVyLm1fTWF0dGVDb2xvcik7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X3NjYW4gPSAoRlhfTFBCWVRFKWJpdG1hcF9kZXZpY2UxLkdldEJpdG1hcCgpLT5HZXRTY2FubGluZShyb3cpOwotICAgICAgICAgICAgICAgIEZYX0xQQ0JZVEUgbWFza19zY2FuID0gYml0bWFwX2RldmljZTIuR2V0Qml0bWFwKCktPkdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEgPSAqbWFza19zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWxwaGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcmlnID0gKCpkZXN0X3NjYW4gLSBtYXR0ZV9iKSAqIDI1NSAvIGFscGhhICsgbWF0dGVfYjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmlnIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWcgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcmlnID4gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZyA9IDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG9yaWc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcmlnID0gKCpkZXN0X3NjYW4gLSBtYXR0ZV9nKSAqIDI1NSAvIGFscGhhICsgbWF0dGVfZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmlnIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWcgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcmlnID4gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZyA9IDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG9yaWc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcmlnID0gKCpkZXN0X3NjYW4gLSBtYXR0ZV9yKSAqIDI1NSAvIGFscGhhICsgbWF0dGVfcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmlnIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWcgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcmlnID4gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZyA9IDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG9yaWc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBiaXRtYXBfZGV2aWNlMi5HZXRCaXRtYXAoKS0+Q29udmVydEZvcm1hdChGWERJQl84YnBwTWFzayk7Ci0gICAgICAgIGJpdG1hcF9kZXZpY2UxLkdldEJpdG1hcCgpLT5NdWx0aXBseUFscGhhKGJpdG1hcF9kZXZpY2UyLkdldEJpdG1hcCgpKTsKLSAgICAgICAgYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCktPk11bHRpcGx5QWxwaGEoMjU1KTsKLSAgICB9Ci0gICAgbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPlNldERJQml0cyhiaXRtYXBfZGV2aWNlMS5HZXRCaXRtYXAoKSwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgbV9CbGVuZFR5cGUpOwotICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wgQ1BERl9JbWFnZVJlbmRlcmVyOjpEcmF3TWFza2VkSW1hZ2UoKQotewotICAgIGlmIChtX3BSZW5kZXJTdGF0dXMtPm1fYlByaW50ICYmICEobV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQkxFTkRfTU9ERSkpIHsKLSAgICAgICAgbV9SZXN1bHQgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9SRUNUIHJlY3QgPSBtX0ltYWdlTWF0cml4LkdldFVuaXRSZWN0KCkuR2V0T3V0dGVyUmVjdCgpOwotICAgIHJlY3QuSW50ZXJzZWN0KG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5HZXRDbGlwQm94KCkpOwotICAgIGlmIChyZWN0LklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENGWF9BZmZpbmVNYXRyaXggbmV3X21hdHJpeCA9IG1fSW1hZ2VNYXRyaXg7Ci0gICAgbmV3X21hdHJpeC5UcmFuc2xhdGVJKC1yZWN0LmxlZnQsIC1yZWN0LnRvcCk7Ci0gICAgaW50IHdpZHRoID0gcmVjdC5XaWR0aCgpOwotICAgIGludCBoZWlnaHQgPSByZWN0LkhlaWdodCgpOwotICAgIENGWF9GeGdlRGV2aWNlIGJpdG1hcF9kZXZpY2UxOwotICAgIGlmICghYml0bWFwX2RldmljZTEuQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCX1JnYjMyKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCktPkNsZWFyKDB4ZmZmZmZmKTsKLSAgICB7Ci0gICAgICAgIENQREZfUmVuZGVyU3RhdHVzIGJpdG1hcF9yZW5kZXI7Ci0gICAgICAgIGJpdG1hcF9yZW5kZXIuSW5pdGlhbGl6ZShtX3BSZW5kZXJTdGF0dXMtPm1fcENvbnRleHQsICZiaXRtYXBfZGV2aWNlMSwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIDAsIG1fcFJlbmRlclN0YXR1cy0+bV9iRHJvcE9iamVjdHMsIE5VTEwsIFRSVUUpOwotICAgICAgICBDUERGX0ltYWdlUmVuZGVyZXIgaW1hZ2VfcmVuZGVyOwotICAgICAgICBpZiAoaW1hZ2VfcmVuZGVyLlN0YXJ0KCZiaXRtYXBfcmVuZGVyLCBtX3BESUJTb3VyY2UsIDAsIDI1NSwgJm5ld19tYXRyaXgsIG1fRmxhZ3MsIFRSVUUpKSB7Ci0gICAgICAgICAgICBpbWFnZV9yZW5kZXIuQ29udGludWUoTlVMTCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgewotICAgICAgICBDRlhfRnhnZURldmljZSBiaXRtYXBfZGV2aWNlMjsKLSAgICAgICAgaWYgKCFiaXRtYXBfZGV2aWNlMi5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfOGJwcFJnYikpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGJpdG1hcF9kZXZpY2UyLkdldEJpdG1hcCgpLT5DbGVhcigwKTsKLSAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMgYml0bWFwX3JlbmRlcjsKLSAgICAgICAgYml0bWFwX3JlbmRlci5Jbml0aWFsaXplKG1fcFJlbmRlclN0YXR1cy0+bV9wQ29udGV4dCwgJmJpdG1hcF9kZXZpY2UyLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgMCwgbV9wUmVuZGVyU3RhdHVzLT5tX2JEcm9wT2JqZWN0cywgTlVMTCwgVFJVRSk7Ci0gICAgICAgIENQREZfSW1hZ2VSZW5kZXJlciBpbWFnZV9yZW5kZXI7Ci0gICAgICAgIGlmIChpbWFnZV9yZW5kZXIuU3RhcnQoJmJpdG1hcF9yZW5kZXIsIG1fTG9hZGVyLm1fcE1hc2ssIDB4ZmZmZmZmZmYsIDI1NSwgJm5ld19tYXRyaXgsIG1fRmxhZ3MsIFRSVUUpKSB7Ci0gICAgICAgICAgICBpbWFnZV9yZW5kZXIuQ29udGludWUoTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fTG9hZGVyLm1fTWF0dGVDb2xvciAhPSAweGZmZmZmZmZmKSB7Ci0gICAgICAgICAgICBpbnQgbWF0dGVfciA9IEZYQVJHQl9SKG1fTG9hZGVyLm1fTWF0dGVDb2xvcik7Ci0gICAgICAgICAgICBpbnQgbWF0dGVfZyA9IEZYQVJHQl9HKG1fTG9hZGVyLm1fTWF0dGVDb2xvcik7Ci0gICAgICAgICAgICBpbnQgbWF0dGVfYiA9IEZYQVJHQl9CKG1fTG9hZGVyLm1fTWF0dGVDb2xvcik7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X3NjYW4gPSAoRlhfTFBCWVRFKWJpdG1hcF9kZXZpY2UxLkdldEJpdG1hcCgpLT5HZXRTY2FubGluZShyb3cpOwotICAgICAgICAgICAgICAgIEZYX0xQQ0JZVEUgbWFza19zY2FuID0gYml0bWFwX2RldmljZTIuR2V0Qml0bWFwKCktPkdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEgPSAqbWFza19zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWxwaGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcmlnID0gKCpkZXN0X3NjYW4gLSBtYXR0ZV9iKSAqIDI1NSAvIGFscGhhICsgbWF0dGVfYjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmlnIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWcgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcmlnID4gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZyA9IDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG9yaWc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcmlnID0gKCpkZXN0X3NjYW4gLSBtYXR0ZV9nKSAqIDI1NSAvIGFscGhhICsgbWF0dGVfZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmlnIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWcgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcmlnID4gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZyA9IDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG9yaWc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcmlnID0gKCpkZXN0X3NjYW4gLSBtYXR0ZV9yKSAqIDI1NSAvIGFscGhhICsgbWF0dGVfcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmlnIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWcgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcmlnID4gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZyA9IDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG9yaWc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBiaXRtYXBfZGV2aWNlMi5HZXRCaXRtYXAoKS0+Q29udmVydEZvcm1hdChGWERJQl84YnBwTWFzayk7Ci0gICAgICAgIGJpdG1hcF9kZXZpY2UxLkdldEJpdG1hcCgpLT5NdWx0aXBseUFscGhhKGJpdG1hcF9kZXZpY2UyLkdldEJpdG1hcCgpKTsKLSAgICAgICAgaWYgKG1fQml0bWFwQWxwaGEgPCAyNTUpIHsKLSAgICAgICAgICAgIGJpdG1hcF9kZXZpY2UxLkdldEJpdG1hcCgpLT5NdWx0aXBseUFscGhhKG1fQml0bWFwQWxwaGEpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TZXRESUJpdHMoYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCksIHJlY3QubGVmdCwgcmVjdC50b3AsIG1fQmxlbmRUeXBlKTsKLSAgICByZXR1cm4gRkFMU0U7Ci19Ci1GWF9CT09MIENQREZfSW1hZ2VSZW5kZXJlcjo6U3RhcnRESUJTb3VyY2UoKQotewotICAgIGlmICghKG1fRmxhZ3MgJiBSRU5ERVJfRk9SQ0VfRE9XTlNBTVBMRSkgJiYgbV9wRElCU291cmNlLT5HZXRCUFAoKSA+IDEpIHsKLSAgICAgICAgaW50IGltYWdlX3NpemUgPSBtX3BESUJTb3VyY2UtPkdldEJQUCgpIC8gOCAqIG1fcERJQlNvdXJjZS0+R2V0V2lkdGgoKSAqIG1fcERJQlNvdXJjZS0+R2V0SGVpZ2h0KCk7Ci0gICAgICAgIGlmIChpbWFnZV9zaXplID4gRlBERl9IVUdFX0lNQUdFX1NJWkUgJiYgIShtX0ZsYWdzICYgUkVOREVSX0ZPUkNFX0hBTEZUT05FKSkgewotICAgICAgICAgICAgbV9GbGFncyB8PSBSRU5ERVJfRk9SQ0VfRE9XTlNBTVBMRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPlN0YXJ0RElCaXRzKG1fcERJQlNvdXJjZSwgbV9CaXRtYXBBbHBoYSwgbV9GaWxsQXJnYiwKLSAgICAgICAgICAgICZtX0ltYWdlTWF0cml4LCBtX0ZsYWdzLCBtX0RldmljZUhhbmRsZSwgMCwgTlVMTCwgbV9CbGVuZFR5cGUpKSB7Ci0gICAgICAgIGlmIChtX0RldmljZUhhbmRsZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtX1N0YXR1cyA9IDM7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENGWF9GbG9hdFJlY3QgaW1hZ2VfcmVjdF9mID0gbV9JbWFnZU1hdHJpeC5HZXRVbml0UmVjdCgpOwotICAgIEZYX1JFQ1QgaW1hZ2VfcmVjdCA9IGltYWdlX3JlY3RfZi5HZXRPdXR0ZXJSZWN0KCk7Ci0gICAgaW50IGRlc3Rfd2lkdGggPSBpbWFnZV9yZWN0LldpZHRoKCk7Ci0gICAgaW50IGRlc3RfaGVpZ2h0ID0gaW1hZ2VfcmVjdC5IZWlnaHQoKTsKLSAgICBpZiAoKEZYU1lTX2ZhYnMobV9JbWFnZU1hdHJpeC5iKSA+PSAwLjVmIHx8IG1fSW1hZ2VNYXRyaXguYSA9PSAwKSB8fAotICAgICAgICAgICAgKEZYU1lTX2ZhYnMobV9JbWFnZU1hdHJpeC5jKSA+PSAwLjVmIHx8IG1fSW1hZ2VNYXRyaXguZCA9PSAwKSApIHsKLSAgICAgICAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9iUHJpbnQgJiYgIShtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19CTEVORF9NT0RFKSkgewotICAgICAgICAgICAgbV9SZXN1bHQgPSBGQUxTRTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBGWF9SRUNUIGNsaXBfYm94ID0gbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPkdldENsaXBCb3goKTsKLSAgICAgICAgY2xpcF9ib3guSW50ZXJzZWN0KGltYWdlX3JlY3QpOwotICAgICAgICBtX1N0YXR1cyA9IDI7Ci0gICAgICAgIG1fcFRyYW5zZm9ybWVyID0gbmV3IENGWF9JbWFnZVRyYW5zZm9ybWVyOwotICAgICAgICBtX3BUcmFuc2Zvcm1lci0+U3RhcnQobV9wRElCU291cmNlLCAmbV9JbWFnZU1hdHJpeCwgbV9GbGFncywgJmNsaXBfYm94KTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmIChtX0ltYWdlTWF0cml4LmEgPCAwKSB7Ci0gICAgICAgIGRlc3Rfd2lkdGggPSAtZGVzdF93aWR0aDsKLSAgICB9Ci0gICAgaWYgKG1fSW1hZ2VNYXRyaXguZCA+IDApIHsKLSAgICAgICAgZGVzdF9oZWlnaHQgPSAtZGVzdF9oZWlnaHQ7Ci0gICAgfQotICAgIGludCBkZXN0X2xlZnQsIGRlc3RfdG9wOwotICAgIGRlc3RfbGVmdCA9IGRlc3Rfd2lkdGggPiAwID8gaW1hZ2VfcmVjdC5sZWZ0IDogaW1hZ2VfcmVjdC5yaWdodDsKLSAgICBkZXN0X3RvcCA9IGRlc3RfaGVpZ2h0ID4gMCA/IGltYWdlX3JlY3QudG9wIDogaW1hZ2VfcmVjdC5ib3R0b207Ci0gICAgaWYgKG1fcERJQlNvdXJjZS0+SXNPcGFxdWVJbWFnZSgpICYmIG1fQml0bWFwQWxwaGEgPT0gMjU1KSB7Ci0gICAgICAgIGlmIChtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+U3RyZXRjaERJQml0cyhtX3BESUJTb3VyY2UsIGRlc3RfbGVmdCwgZGVzdF90b3AsCi0gICAgICAgICAgICAgICAgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIG1fRmxhZ3MsIE5VTEwsIG1fQmxlbmRUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtX3BESUJTb3VyY2UtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgaWYgKG1fQml0bWFwQWxwaGEgIT0gMjU1KSB7Ci0gICAgICAgICAgICBtX0ZpbGxBcmdiID0gRlhBUkdCX01VTF9BTFBIQShtX0ZpbGxBcmdiLCBtX0JpdG1hcEFscGhhKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPlN0cmV0Y2hCaXRNYXNrKG1fcERJQlNvdXJjZSwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIG1fRmlsbEFyZ2IsIG1fRmxhZ3MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9iUHJpbnQgJiYgIShtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19CTEVORF9NT0RFKSkgewotICAgICAgICBtX1Jlc3VsdCA9IEZBTFNFOwotICAgICAgICByZXR1cm4gVFJVRTsKKyAgfQorICBDRlhfRmxvYXRSZWN0IGltYWdlX3JlY3RfZiA9IG1fSW1hZ2VNYXRyaXguR2V0VW5pdFJlY3QoKTsKKyAgRlhfUkVDVCBpbWFnZV9yZWN0ID0gaW1hZ2VfcmVjdF9mLkdldE91dHRlclJlY3QoKTsKKyAgaW50IGRlc3Rfd2lkdGggPSBpbWFnZV9yZWN0LldpZHRoKCk7CisgIGludCBkZXN0X2hlaWdodCA9IGltYWdlX3JlY3QuSGVpZ2h0KCk7CisgIGlmICgoRlhTWVNfZmFicyhtX0ltYWdlTWF0cml4LmIpID49IDAuNWYgfHwgbV9JbWFnZU1hdHJpeC5hID09IDApIHx8CisgICAgICAoRlhTWVNfZmFicyhtX0ltYWdlTWF0cml4LmMpID49IDAuNWYgfHwgbV9JbWFnZU1hdHJpeC5kID09IDApKSB7CisgICAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9iUHJpbnQgJiYKKyAgICAgICAgIShtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19CTEVORF9NT0RFKSkgeworICAgICAgbV9SZXN1bHQgPSBGQUxTRTsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgRlhfUkVDVCBjbGlwX2JveCA9IG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7Ci0gICAgRlhfUkVDVCBkZXN0X3JlY3QgPSBjbGlwX2JveDsKLSAgICBkZXN0X3JlY3QuSW50ZXJzZWN0KGltYWdlX3JlY3QpOwotICAgIEZYX1JFQ1QgZGVzdF9jbGlwKGRlc3RfcmVjdC5sZWZ0IC0gaW1hZ2VfcmVjdC5sZWZ0LCBkZXN0X3JlY3QudG9wIC0gaW1hZ2VfcmVjdC50b3AsCi0gICAgICAgICAgICAgICAgICAgICAgZGVzdF9yZWN0LnJpZ2h0IC0gaW1hZ2VfcmVjdC5sZWZ0LCBkZXN0X3JlY3QuYm90dG9tIC0gaW1hZ2VfcmVjdC50b3ApOwotICAgIENGWF9ESUJpdG1hcCogcFN0cmV0Y2hlZCA9IG1fcERJQlNvdXJjZS0+U3RyZXRjaFRvKGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBtX0ZsYWdzLCAmZGVzdF9jbGlwKTsKLSAgICBpZiAocFN0cmV0Y2hlZCkgewotICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPkNvbXBvc2l0ZURJQml0bWFwKHBTdHJldGNoZWQsIGRlc3RfcmVjdC5sZWZ0LCBkZXN0X3JlY3QudG9wLCBtX0ZpbGxBcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQml0bWFwQWxwaGEsIG1fQmxlbmRUeXBlLCBGQUxTRSk7Ci0gICAgICAgIGRlbGV0ZSBwU3RyZXRjaGVkOwotICAgICAgICBwU3RyZXRjaGVkID0gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotRlhfQk9PTCBDUERGX0ltYWdlUmVuZGVyZXI6OlN0YXJ0Qml0bWFwQWxwaGEoKQotewotICAgIGlmIChtX3BESUJTb3VyY2UtPklzT3BhcXVlSW1hZ2UoKSkgewotICAgICAgICBDRlhfUGF0aERhdGEgcGF0aDsKLSAgICAgICAgcGF0aC5BcHBlbmRSZWN0KDAsIDAsIDEsIDEpOwotICAgICAgICBwYXRoLlRyYW5zZm9ybSgmbV9JbWFnZU1hdHJpeCk7Ci0gICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IgPSBBcmdiRW5jb2RlKDB4ZmYsIG1fQml0bWFwQWxwaGEsIG1fQml0bWFwQWxwaGEsIG1fQml0bWFwQWxwaGEpOwotICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIE5VTEwsIE5VTEwsIGZpbGxfY29sb3IsIDAsIEZYRklMTF9XSU5ESU5HKTsKLSAgICB9IGVsc2UgewotICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwQWxwaGFNYXNrID0gbV9wRElCU291cmNlLT5Jc0FscGhhTWFzaygpID8gbV9wRElCU291cmNlIDogbV9wRElCU291cmNlLT5HZXRBbHBoYU1hc2soKTsKLSAgICAgICAgaWYgKEZYU1lTX2ZhYnMobV9JbWFnZU1hdHJpeC5iKSA+PSAwLjVmIHx8IEZYU1lTX2ZhYnMobV9JbWFnZU1hdHJpeC5jKSA+PSAwLjVmKSB7Ci0gICAgICAgICAgICBpbnQgbGVmdCwgdG9wOwotICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwVHJhbnNmb3JtZWQgPSBwQWxwaGFNYXNrLT5UcmFuc2Zvcm1UbygmbV9JbWFnZU1hdHJpeCwgbGVmdCwgdG9wKTsKLSAgICAgICAgICAgIGlmIChwVHJhbnNmb3JtZWQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPlNldEJpdE1hc2socFRyYW5zZm9ybWVkLCBsZWZ0LCB0b3AsIEFyZ2JFbmNvZGUoMHhmZiwgbV9CaXRtYXBBbHBoYSwgbV9CaXRtYXBBbHBoYSwgbV9CaXRtYXBBbHBoYSkpOwotICAgICAgICAgICAgZGVsZXRlIHBUcmFuc2Zvcm1lZDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENGWF9GbG9hdFJlY3QgaW1hZ2VfcmVjdF9mID0gbV9JbWFnZU1hdHJpeC5HZXRVbml0UmVjdCgpOwotICAgICAgICAgICAgRlhfUkVDVCBpbWFnZV9yZWN0ID0gaW1hZ2VfcmVjdF9mLkdldE91dHRlclJlY3QoKTsKLSAgICAgICAgICAgIGludCBkZXN0X3dpZHRoID0gbV9JbWFnZU1hdHJpeC5hID4gMCA/IGltYWdlX3JlY3QuV2lkdGgoKSA6IC1pbWFnZV9yZWN0LldpZHRoKCk7Ci0gICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQgPSBtX0ltYWdlTWF0cml4LmQgPiAwID8gLWltYWdlX3JlY3QuSGVpZ2h0KCkgOiBpbWFnZV9yZWN0LkhlaWdodCgpOwotICAgICAgICAgICAgaW50IGxlZnQgPSBkZXN0X3dpZHRoID4gMCA/IGltYWdlX3JlY3QubGVmdCA6IGltYWdlX3JlY3QucmlnaHQ7Ci0gICAgICAgICAgICBpbnQgdG9wID0gZGVzdF9oZWlnaHQgPiAwID8gaW1hZ2VfcmVjdC50b3AgOiBpbWFnZV9yZWN0LmJvdHRvbTsKLSAgICAgICAgICAgIG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TdHJldGNoQml0TWFzayhwQWxwaGFNYXNrLCBsZWZ0LCB0b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBBcmdiRW5jb2RlKDB4ZmYsIG1fQml0bWFwQWxwaGEsIG1fQml0bWFwQWxwaGEsIG1fQml0bWFwQWxwaGEpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9wRElCU291cmNlICE9IHBBbHBoYU1hc2spIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwQWxwaGFNYXNrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wgQ1BERl9JbWFnZVJlbmRlcmVyOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBpZiAobV9TdGF0dXMgPT0gMSkgewotICAgICAgICBpZiAobV9wUXVpY2tTdHJldGNoZXItPkNvbnRpbnVlKHBQYXVzZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX3BRdWlja1N0cmV0Y2hlci0+bV9wQml0bWFwLT5Jc0FscGhhTWFzaygpKQotICAgICAgICAgICAgbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPlNldEJpdE1hc2sobV9wUXVpY2tTdHJldGNoZXItPm1fcEJpdG1hcCwgbV9wUXVpY2tTdHJldGNoZXItPm1fUmVzdWx0TGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFF1aWNrU3RyZXRjaGVyLT5tX1Jlc3VsdFRvcCwgbV9GaWxsQXJnYik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TZXRESUJpdHMobV9wUXVpY2tTdHJldGNoZXItPm1fcEJpdG1hcCwgbV9wUXVpY2tTdHJldGNoZXItPm1fUmVzdWx0TGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUXVpY2tTdHJldGNoZXItPm1fUmVzdWx0VG9wLCBtX0JsZW5kVHlwZSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9IGVsc2UgaWYgKG1fU3RhdHVzID09IDIpIHsKLSAgICAgICAgaWYgKG1fcFRyYW5zZm9ybWVyLT5Db250aW51ZShwUGF1c2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBtX3BUcmFuc2Zvcm1lci0+bV9TdG9yZXIuRGV0YWNoKCk7Ci0gICAgICAgIGlmIChwQml0bWFwID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAocEJpdG1hcC0+SXNBbHBoYU1hc2soKSkgewotICAgICAgICAgICAgaWYgKG1fQml0bWFwQWxwaGEgIT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgbV9GaWxsQXJnYiA9IEZYQVJHQl9NVUxfQUxQSEEobV9GaWxsQXJnYiwgbV9CaXRtYXBBbHBoYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX1Jlc3VsdCA9IG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TZXRCaXRNYXNrKHBCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdExlZnQsIG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdFRvcCwgbV9GaWxsQXJnYik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobV9CaXRtYXBBbHBoYSAhPSAyNTUpIHsKLSAgICAgICAgICAgICAgICBwQml0bWFwLT5NdWx0aXBseUFscGhhKG1fQml0bWFwQWxwaGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9SZXN1bHQgPSBtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+U2V0RElCaXRzKHBCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdExlZnQsIG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdFRvcCwgbV9CbGVuZFR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZSBwQml0bWFwOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfSBlbHNlIGlmIChtX1N0YXR1cyA9PSAzKSB7Ci0gICAgICAgIHJldHVybiBtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+Q29udGludWVESUJpdHMobV9EZXZpY2VIYW5kbGUsIHBQYXVzZSk7Ci0gICAgfSBlbHNlIGlmIChtX1N0YXR1cyA9PSA0KSB7Ci0gICAgICAgIGlmIChtX0xvYWRlci5Db250aW51ZShtX0xvYWRIYW5kbGUsIHBQYXVzZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChTdGFydFJlbmRlckRJQlNvdXJjZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29udGludWUocFBhdXNlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLUNQREZfUXVpY2tTdHJldGNoZXI6OkNQREZfUXVpY2tTdHJldGNoZXIoKQotewotICAgIG1fcEJpdG1hcCA9IE5VTEw7Ci0gICAgbV9wRGVjb2RlciA9IE5VTEw7Ci0gICAgbV9wQ1MgPSBOVUxMOwotfQotQ1BERl9RdWlja1N0cmV0Y2hlcjo6fkNQREZfUXVpY2tTdHJldGNoZXIoKQotewotICAgIGlmIChtX3BCaXRtYXApIHsKLSAgICAgICAgZGVsZXRlIG1fcEJpdG1hcDsKLSAgICB9Ci0gICAgaWYgKG1fcENTKSB7Ci0gICAgICAgIG1fcENTLT5SZWxlYXNlQ1MoKTsKLSAgICB9Ci0gICAgaWYgKG1fcERlY29kZXIpIHsKLSAgICAgICAgZGVsZXRlIG1fcERlY29kZXI7Ci0gICAgfQotfQotSUNvZGVjX1NjYW5saW5lRGVjb2RlciogRlBERkFQSV9DcmVhdGVGbGF0ZURlY29kZXIoRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICBpbnQgbkNvbXBzLCBpbnQgYnBjLCBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXMpOwotRlhfQk9PTCBDUERGX1F1aWNrU3RyZXRjaGVyOjpTdGFydChDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmosIENGWF9BZmZpbmVNYXRyaXgqIHBJbWFnZTJEZXZpY2UsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwQm94KQotewotICAgIGlmIChGWFNZU19mYWJzKHBJbWFnZTJEZXZpY2UtPmEpIDwgRlhTWVNfZmFicyhwSW1hZ2UyRGV2aWNlLT5iKSAqIDEwICYmIEZYU1lTX2ZhYnMocEltYWdlMkRldmljZS0+ZCkgPCBGWFNZU19mYWJzKHBJbWFnZTJEZXZpY2UtPmMpICogMTApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDRlhfRmxvYXRSZWN0IGltYWdlX3JlY3RfZiA9IHBJbWFnZTJEZXZpY2UtPkdldFVuaXRSZWN0KCk7Ci0gICAgRlhfUkVDVCBpbWFnZV9yZWN0ID0gaW1hZ2VfcmVjdF9mLkdldE91dHRlclJlY3QoKTsKLSAgICBtX0Rlc3RXaWR0aCA9IGltYWdlX3JlY3QuV2lkdGgoKTsKLSAgICBtX0Rlc3RIZWlnaHQgPSBpbWFnZV9yZWN0LkhlaWdodCgpOwotICAgIG1fYkZsaXBYID0gcEltYWdlMkRldmljZS0+YSA8IDA7Ci0gICAgbV9iRmxpcFkgPSBwSW1hZ2UyRGV2aWNlLT5kID4gMDsKLSAgICBGWF9SRUNUIHJlc3VsdF9yZWN0ID0gKnBDbGlwQm94OwotICAgIHJlc3VsdF9yZWN0LkludGVyc2VjdChpbWFnZV9yZWN0KTsKLSAgICBpZiAocmVzdWx0X3JlY3QuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9SZXN1bHRXaWR0aCA9IHJlc3VsdF9yZWN0LldpZHRoKCk7Ci0gICAgbV9SZXN1bHRIZWlnaHQgPSByZXN1bHRfcmVjdC5IZWlnaHQoKTsKLSAgICBtX1Jlc3VsdExlZnQgPSByZXN1bHRfcmVjdC5sZWZ0OwotICAgIG1fUmVzdWx0VG9wID0gcmVzdWx0X3JlY3QudG9wOwotICAgIG1fQ2xpcExlZnQgPSByZXN1bHRfcmVjdC5sZWZ0IC0gaW1hZ2VfcmVjdC5sZWZ0OwotICAgIG1fQ2xpcFRvcCA9IHJlc3VsdF9yZWN0LnRvcCAtIGltYWdlX3JlY3QudG9wOwotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwSW1hZ2VPYmotPm1fcEltYWdlLT5HZXREaWN0KCk7Ci0gICAgaWYgKHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJCaXRzUGVyQ29tcG9uZW50IikpICE9IDgpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAocERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJTTWFzayIpKSB8fCBwRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIk1hc2siKSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX1NyY1dpZHRoID0gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIldpZHRoIikpOwotICAgIG1fU3JjSGVpZ2h0ID0gcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIkhlaWdodCIpKTsKLSAgICBtX3BDUyA9IE5VTEw7Ci0gICAgbV9CcHAgPSAzOwotICAgIENQREZfT2JqZWN0KiBwQ1NPYmogPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJDb2xvclNwYWNlIikpOwotICAgIGlmIChwQ1NPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fcENTID0gQ1BERl9Db2xvclNwYWNlOjpMb2FkKHBJbWFnZU9iai0+bV9wSW1hZ2UtPkdldERvY3VtZW50KCksIHBDU09iaik7Ci0gICAgaWYgKG1fcENTID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoIV9Jc1N1cHBvcnRlZChtX3BDUykpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX0JwcCA9IG1fcENTLT5Db3VudENvbXBvbmVudHMoKTsKLSAgICBpZiAobV9wQ1MtPnNSR0IoKSkgewotICAgICAgICBtX3BDUy0+UmVsZWFzZUNTKCk7Ci0gICAgICAgIG1fcENTID0gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwSW1hZ2VPYmotPm1fcEltYWdlLT5HZXRTdHJlYW0oKTsKLSAgICBtX1N0cmVhbUFjYy5Mb2FkQWxsRGF0YShwU3RyZWFtLCBGQUxTRSwgbV9TcmNXaWR0aCAqIG1fU3JjSGVpZ2h0ICogbV9CcHAsIFRSVUUpOwotICAgIG1fcERlY29kZXIgPSBOVUxMOwotICAgIGlmICghbV9TdHJlYW1BY2MuR2V0SW1hZ2VEZWNvZGVyKCkuSXNFbXB0eSgpKSB7Ci0gICAgICAgIGlmIChtX1N0cmVhbUFjYy5HZXRJbWFnZURlY29kZXIoKSA9PSBGWF9CU1RSQygiRENURGVjb2RlIikpIHsKLSAgICAgICAgICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhcmFtID0gbV9TdHJlYW1BY2MuR2V0SW1hZ2VQYXJhbSgpOwotICAgICAgICAgICAgbV9wRGVjb2RlciA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SnBlZ01vZHVsZSgpLT5DcmVhdGVEZWNvZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1N0cmVhbUFjYy5HZXREYXRhKCksIG1fU3RyZWFtQWNjLkdldFNpemUoKSwgbV9TcmNXaWR0aCwgbV9TcmNIZWlnaHQsIG1fQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW0gPyBwUGFyYW0tPkdldEludGVnZXIoRlhfQlNUUkMoIkNvbG9yVHJhbnNmb3JtIiksIDEpIDogMSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobV9TdHJlYW1BY2MuR2V0SW1hZ2VEZWNvZGVyKCkgPT0gRlhfQlNUUkMoIkZsYXRlRGVjb2RlIikpIHsKLSAgICAgICAgICAgIG1fcERlY29kZXIgPSBGUERGQVBJX0NyZWF0ZUZsYXRlRGVjb2RlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9TdHJlYW1BY2MuR2V0RGF0YSgpLCBtX1N0cmVhbUFjYy5HZXRTaXplKCksIG1fU3JjV2lkdGgsIG1fU3JjSGVpZ2h0LCBtX0JwcCwgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9TdHJlYW1BY2MuR2V0SW1hZ2VQYXJhbSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBtX3BEZWNvZGVyLT5Eb3duU2NhbGUobV9EZXN0V2lkdGgsIG1fRGVzdEhlaWdodCk7Ci0gICAgfQotICAgIG1fcEJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgbV9wQml0bWFwLT5DcmVhdGUobV9SZXN1bHRXaWR0aCwgbV9SZXN1bHRIZWlnaHQsIEZYRElCX1JnYjMyKTsKLSNlbHNlCi0gICAgbV9wQml0bWFwLT5DcmVhdGUobV9SZXN1bHRXaWR0aCwgbV9SZXN1bHRIZWlnaHQsIEZYRElCX1JnYik7Ci0jZW5kaWYKLSAgICBtX0xpbmVJbmRleCA9IDA7CisgICAgY2xpcF9ib3guSW50ZXJzZWN0KGltYWdlX3JlY3QpOworICAgIG1fU3RhdHVzID0gMjsKKyAgICBtX3BUcmFuc2Zvcm1lciA9IG5ldyBDRlhfSW1hZ2VUcmFuc2Zvcm1lcjsKKyAgICBtX3BUcmFuc2Zvcm1lci0+U3RhcnQobV9wRElCU291cmNlLCAmbV9JbWFnZU1hdHJpeCwgbV9GbGFncywgJmNsaXBfYm94KTsKICAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ1BERl9RdWlja1N0cmV0Y2hlcjo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgRlhfTFBCWVRFIHJlc3VsdF9idWYgPSBtX3BCaXRtYXAtPkdldEJ1ZmZlcigpOwotICAgIGludCBzcmNfd2lkdGggPSBtX3BEZWNvZGVyID8gbV9wRGVjb2Rlci0+R2V0V2lkdGgoKSA6IG1fU3JjV2lkdGg7Ci0gICAgaW50IHNyY19oZWlnaHQgPSBtX3BEZWNvZGVyID8gbV9wRGVjb2Rlci0+R2V0SGVpZ2h0KCkgOiBtX1NyY0hlaWdodDsKLSAgICBpbnQgc3JjX3BpdGNoID0gc3JjX3dpZHRoICogbV9CcHA7Ci0gICAgd2hpbGUgKG1fTGluZUluZGV4IDwgbV9SZXN1bHRIZWlnaHQpIHsKLSAgICAgICAgaW50IGRlc3RfeSwgc3JjX3k7Ci0gICAgICAgIGlmIChtX2JGbGlwWSkgewotICAgICAgICAgICAgZGVzdF95ID0gbV9SZXN1bHRIZWlnaHQgLSBtX0xpbmVJbmRleCAtIDE7Ci0gICAgICAgICAgICBzcmNfeSA9IChtX0Rlc3RIZWlnaHQgLSAoZGVzdF95ICsgbV9DbGlwVG9wKSAtIDEpICogc3JjX2hlaWdodCAvIG1fRGVzdEhlaWdodDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlc3RfeSA9IG1fTGluZUluZGV4OwotICAgICAgICAgICAgc3JjX3kgPSAoZGVzdF95ICsgbV9DbGlwVG9wKSAqIHNyY19oZWlnaHQgLyBtX0Rlc3RIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfTFBDQllURSBzcmNfc2NhbjsKLSAgICAgICAgaWYgKG1fcERlY29kZXIpIHsKLSAgICAgICAgICAgIHNyY19zY2FuID0gbV9wRGVjb2Rlci0+R2V0U2NhbmxpbmUoc3JjX3kpOwotICAgICAgICAgICAgaWYgKHNyY19zY2FuID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNyY19zY2FuID0gbV9TdHJlYW1BY2MuR2V0RGF0YSgpOwotICAgICAgICAgICAgaWYgKHNyY19zY2FuID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY195ICogc3JjX3BpdGNoOwotICAgICAgICB9Ci0gICAgICAgIEZYX0xQQllURSByZXN1bHRfc2NhbiA9IHJlc3VsdF9idWYgKyBkZXN0X3kgKiBtX3BCaXRtYXAtPkdldFBpdGNoKCk7Ci0gICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgbV9SZXN1bHRXaWR0aDsgeCArKykgewotICAgICAgICAgICAgaW50IGRlc3RfeCA9IG1fQ2xpcExlZnQgKyB4OwotICAgICAgICAgICAgaW50IHNyY194ID0gKG1fYkZsaXBYID8gKG1fRGVzdFdpZHRoIC0gZGVzdF94IC0gMSkgOiBkZXN0X3gpICogc3JjX3dpZHRoIC8gbV9EZXN0V2lkdGg7Ci0gICAgICAgICAgICBGWF9MUENCWVRFIHNyY19waXhlbCA9IHNyY19zY2FuICsgc3JjX3ggKiBtX0JwcDsKLSAgICAgICAgICAgIGlmIChtX3BDUyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgKnJlc3VsdF9zY2FuID0gc3JjX3BpeGVsWzJdOwotICAgICAgICAgICAgICAgIHJlc3VsdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICpyZXN1bHRfc2NhbiA9IHNyY19waXhlbFsxXTsKLSAgICAgICAgICAgICAgICByZXN1bHRfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAqcmVzdWx0X3NjYW4gPSBzcmNfcGl4ZWxbMF07Ci0gICAgICAgICAgICAgICAgcmVzdWx0X3NjYW4gKys7Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgICAgICAgICAgICAgcmVzdWx0X3NjYW4gKys7Ci0jZW5kaWYKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9wQ1MtPlRyYW5zbGF0ZUltYWdlTGluZShyZXN1bHRfc2Nhbiwgc3JjX3BpeGVsLCAxLCAwLCAwKTsKLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICAgICAgICAgICAgICByZXN1bHRfc2NhbiArPSA0OwotI2Vsc2UKLSAgICAgICAgICAgICAgICByZXN1bHRfc2NhbiArPSAzOwotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9MaW5lSW5kZXggKys7Ci0gICAgICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQorICB9CisgIGlmIChtX0ltYWdlTWF0cml4LmEgPCAwKSB7CisgICAgZGVzdF93aWR0aCA9IC1kZXN0X3dpZHRoOworICB9CisgIGlmIChtX0ltYWdlTWF0cml4LmQgPiAwKSB7CisgICAgZGVzdF9oZWlnaHQgPSAtZGVzdF9oZWlnaHQ7CisgIH0KKyAgaW50IGRlc3RfbGVmdCwgZGVzdF90b3A7CisgIGRlc3RfbGVmdCA9IGRlc3Rfd2lkdGggPiAwID8gaW1hZ2VfcmVjdC5sZWZ0IDogaW1hZ2VfcmVjdC5yaWdodDsKKyAgZGVzdF90b3AgPSBkZXN0X2hlaWdodCA+IDAgPyBpbWFnZV9yZWN0LnRvcCA6IGltYWdlX3JlY3QuYm90dG9tOworICBpZiAobV9wRElCU291cmNlLT5Jc09wYXF1ZUltYWdlKCkgJiYgbV9CaXRtYXBBbHBoYSA9PSAyNTUpIHsKKyAgICBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPlN0cmV0Y2hESUJpdHMoCisgICAgICAgICAgICBtX3BESUJTb3VyY2UsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBtX0ZsYWdzLAorICAgICAgICAgICAgTlVMTCwgbV9CbGVuZFR5cGUpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQorICB9CisgIGlmIChtX3BESUJTb3VyY2UtPklzQWxwaGFNYXNrKCkpIHsKKyAgICBpZiAobV9CaXRtYXBBbHBoYSAhPSAyNTUpIHsKKyAgICAgIG1fRmlsbEFyZ2IgPSBGWEFSR0JfTVVMX0FMUEhBKG1fRmlsbEFyZ2IsIG1fQml0bWFwQWxwaGEpOworICAgIH0KKyAgICBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPlN0cmV0Y2hCaXRNYXNrKAorICAgICAgICAgICAgbV9wRElCU291cmNlLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgIG1fRmlsbEFyZ2IsIG1fRmxhZ3MpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CisgIGlmIChtX3BSZW5kZXJTdGF0dXMtPm1fYlByaW50ICYmCisgICAgICAhKG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0JMRU5EX01PREUpKSB7CisgICAgbV9SZXN1bHQgPSBGQUxTRTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBGWF9SRUNUIGNsaXBfYm94ID0gbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPkdldENsaXBCb3goKTsKKyAgRlhfUkVDVCBkZXN0X3JlY3QgPSBjbGlwX2JveDsKKyAgZGVzdF9yZWN0LkludGVyc2VjdChpbWFnZV9yZWN0KTsKKyAgRlhfUkVDVCBkZXN0X2NsaXAoCisgICAgICBkZXN0X3JlY3QubGVmdCAtIGltYWdlX3JlY3QubGVmdCwgZGVzdF9yZWN0LnRvcCAtIGltYWdlX3JlY3QudG9wLAorICAgICAgZGVzdF9yZWN0LnJpZ2h0IC0gaW1hZ2VfcmVjdC5sZWZ0LCBkZXN0X3JlY3QuYm90dG9tIC0gaW1hZ2VfcmVjdC50b3ApOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBwU3RyZXRjaGVkKAorICAgICAgbV9wRElCU291cmNlLT5TdHJldGNoVG8oZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIG1fRmxhZ3MsICZkZXN0X2NsaXApKTsKKyAgaWYgKHBTdHJldGNoZWQpIHsKKyAgICBtX3BSZW5kZXJTdGF0dXMtPkNvbXBvc2l0ZURJQml0bWFwKHBTdHJldGNoZWQuZ2V0KCksIGRlc3RfcmVjdC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9yZWN0LnRvcCwgbV9GaWxsQXJnYiwgbV9CaXRtYXBBbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxlbmRUeXBlLCBGQUxTRSk7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorRlhfQk9PTCBDUERGX0ltYWdlUmVuZGVyZXI6OlN0YXJ0Qml0bWFwQWxwaGEoKSB7CisgIGlmIChtX3BESUJTb3VyY2UtPklzT3BhcXVlSW1hZ2UoKSkgeworICAgIENGWF9QYXRoRGF0YSBwYXRoOworICAgIHBhdGguQXBwZW5kUmVjdCgwLCAwLCAxLCAxKTsKKyAgICBwYXRoLlRyYW5zZm9ybSgmbV9JbWFnZU1hdHJpeCk7CisgICAgRlhfRFdPUkQgZmlsbF9jb2xvciA9CisgICAgICAgIEFyZ2JFbmNvZGUoMHhmZiwgbV9CaXRtYXBBbHBoYSwgbV9CaXRtYXBBbHBoYSwgbV9CaXRtYXBBbHBoYSk7CisgICAgbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBOVUxMLCBOVUxMLCBmaWxsX2NvbG9yLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEZJTExfV0lORElORyk7CisgIH0gZWxzZSB7CisgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEFscGhhTWFzayA9IG1fcERJQlNvdXJjZS0+SXNBbHBoYU1hc2soKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtX3BESUJTb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbV9wRElCU291cmNlLT5HZXRBbHBoYU1hc2soKTsKKyAgICBpZiAoRlhTWVNfZmFicyhtX0ltYWdlTWF0cml4LmIpID49IDAuNWYgfHwKKyAgICAgICAgRlhTWVNfZmFicyhtX0ltYWdlTWF0cml4LmMpID49IDAuNWYpIHsKKyAgICAgIGludCBsZWZ0LCB0b3A7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBwVHJhbnNmb3JtZWQoCisgICAgICAgICAgcEFscGhhTWFzay0+VHJhbnNmb3JtVG8oJm1fSW1hZ2VNYXRyaXgsIGxlZnQsIHRvcCkpOworICAgICAgaWYgKCFwVHJhbnNmb3JtZWQpCisgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICBtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+U2V0Qml0TWFzaygKKyAgICAgICAgICBwVHJhbnNmb3JtZWQuZ2V0KCksIGxlZnQsIHRvcCwKKyAgICAgICAgICBBcmdiRW5jb2RlKDB4ZmYsIG1fQml0bWFwQWxwaGEsIG1fQml0bWFwQWxwaGEsIG1fQml0bWFwQWxwaGEpKTsKKyAgICB9IGVsc2UgeworICAgICAgQ0ZYX0Zsb2F0UmVjdCBpbWFnZV9yZWN0X2YgPSBtX0ltYWdlTWF0cml4LkdldFVuaXRSZWN0KCk7CisgICAgICBGWF9SRUNUIGltYWdlX3JlY3QgPSBpbWFnZV9yZWN0X2YuR2V0T3V0dGVyUmVjdCgpOworICAgICAgaW50IGRlc3Rfd2lkdGggPQorICAgICAgICAgIG1fSW1hZ2VNYXRyaXguYSA+IDAgPyBpbWFnZV9yZWN0LldpZHRoKCkgOiAtaW1hZ2VfcmVjdC5XaWR0aCgpOworICAgICAgaW50IGRlc3RfaGVpZ2h0ID0KKyAgICAgICAgICBtX0ltYWdlTWF0cml4LmQgPiAwID8gLWltYWdlX3JlY3QuSGVpZ2h0KCkgOiBpbWFnZV9yZWN0LkhlaWdodCgpOworICAgICAgaW50IGxlZnQgPSBkZXN0X3dpZHRoID4gMCA/IGltYWdlX3JlY3QubGVmdCA6IGltYWdlX3JlY3QucmlnaHQ7CisgICAgICBpbnQgdG9wID0gZGVzdF9oZWlnaHQgPiAwID8gaW1hZ2VfcmVjdC50b3AgOiBpbWFnZV9yZWN0LmJvdHRvbTsKKyAgICAgIG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TdHJldGNoQml0TWFzaygKKyAgICAgICAgICBwQWxwaGFNYXNrLCBsZWZ0LCB0b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LAorICAgICAgICAgIEFyZ2JFbmNvZGUoMHhmZiwgbV9CaXRtYXBBbHBoYSwgbV9CaXRtYXBBbHBoYSwgbV9CaXRtYXBBbHBoYSkpOworICAgIH0KKyAgICBpZiAobV9wRElCU291cmNlICE9IHBBbHBoYU1hc2spIHsKKyAgICAgIGRlbGV0ZSBwQWxwaGFNYXNrOworICAgIH0KKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIENQREZfSW1hZ2VSZW5kZXJlcjo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgaWYgKG1fU3RhdHVzID09IDIpIHsKKyAgICBpZiAobV9wVHJhbnNmb3JtZXItPkNvbnRpbnVlKHBQYXVzZSkpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBtX3BUcmFuc2Zvcm1lci0+bV9TdG9yZXIuRGV0YWNoKCk7CisgICAgaWYgKCFwQml0bWFwKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGlmIChwQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7CisgICAgICBpZiAobV9CaXRtYXBBbHBoYSAhPSAyNTUpIHsKKyAgICAgICAgbV9GaWxsQXJnYiA9IEZYQVJHQl9NVUxfQUxQSEEobV9GaWxsQXJnYiwgbV9CaXRtYXBBbHBoYSk7CisgICAgICB9CisgICAgICBtX1Jlc3VsdCA9IG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TZXRCaXRNYXNrKAorICAgICAgICAgIHBCaXRtYXAsIG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdExlZnQsIG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdFRvcCwKKyAgICAgICAgICBtX0ZpbGxBcmdiKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKG1fQml0bWFwQWxwaGEgIT0gMjU1KSB7CisgICAgICAgIHBCaXRtYXAtPk11bHRpcGx5QWxwaGEobV9CaXRtYXBBbHBoYSk7CisgICAgICB9CisgICAgICBtX1Jlc3VsdCA9IG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TZXRESUJpdHMoCisgICAgICAgICAgcEJpdG1hcCwgbV9wVHJhbnNmb3JtZXItPm1fUmVzdWx0TGVmdCwgbV9wVHJhbnNmb3JtZXItPm1fUmVzdWx0VG9wLAorICAgICAgICAgIG1fQmxlbmRUeXBlKTsKKyAgICB9CisgICAgZGVsZXRlIHBCaXRtYXA7CiAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX1N0YXR1cyA9PSAzKSB7CisgICAgcmV0dXJuIG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5Db250aW51ZURJQml0cyhtX0RldmljZUhhbmRsZSwgcFBhdXNlKTsKKyAgfQorICBpZiAobV9TdGF0dXMgPT0gNCkgeworICAgIGlmIChtX0xvYWRlci5Db250aW51ZShtX0xvYWRIYW5kbGUsIHBQYXVzZSkpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBpZiAoU3RhcnRSZW5kZXJESUJTb3VyY2UoKSkgeworICAgICAgcmV0dXJuIENvbnRpbnVlKHBQYXVzZSk7CisgICAgfQorICB9CisgIHJldHVybiBGQUxTRTsKIH0KK0lDb2RlY19TY2FubGluZURlY29kZXIqIEZQREZBUElfQ3JlYXRlRmxhdGVEZWNvZGVyKAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgaW50IHdpZHRoLAorICAgIGludCBoZWlnaHQsCisgICAgaW50IG5Db21wcywKKyAgICBpbnQgYnBjLAorICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhcmFtcyk7CiBDRlhfRElCaXRtYXAqIENQREZfUmVuZGVyU3RhdHVzOjpMb2FkU01hc2soQ1BERl9EaWN0aW9uYXJ5KiBwU01hc2tEaWN0LAotICAgICAgICBGWF9SRUNUKiBwQ2xpcFJlY3QsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgpCi17Ci0gICAgaWYgKHBTTWFza0RpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ0ZYX0RJQml0bWFwKiBwTWFzayA9IE5VTEw7Ci0gICAgaW50IHdpZHRoID0gcENsaXBSZWN0LT5yaWdodCAtIHBDbGlwUmVjdC0+bGVmdDsKLSAgICBpbnQgaGVpZ2h0ID0gcENsaXBSZWN0LT5ib3R0b20gLSBwQ2xpcFJlY3QtPnRvcDsKLSAgICBGWF9CT09MIGJMdW1pbm9zaXR5ID0gRkFMU0U7Ci0gICAgYkx1bWlub3NpdHkgPSBwU01hc2tEaWN0LT5HZXRDb25zdFN0cmluZyhGWF9CU1RSQygiUyIpKSAhPSBGWF9CU1RSQygiQWxwaGEiKTsKLSAgICBDUERGX1N0cmVhbSogcEdyb3VwID0gcFNNYXNrRGljdC0+R2V0U3RyZWFtKEZYX0JTVFJDKCJHIikpOwotICAgIGlmIChwR3JvdXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9GdW5jdGlvbiogcEZ1bmMgPSBOVUxMOwotICAgIENQREZfT2JqZWN0KiBwRnVuY09iaiA9IHBTTWFza0RpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiVFIiKSk7Ci0gICAgaWYgKHBGdW5jT2JqICYmIChwRnVuY09iai0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZIHx8IHBGdW5jT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkpIHsKLSAgICAgICAgcEZ1bmMgPSBDUERGX0Z1bmN0aW9uOjpMb2FkKHBGdW5jT2JqKTsKLSAgICB9Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXggPSAqcE1hdHJpeDsKLSAgICBtYXRyaXguVHJhbnNsYXRlSSgtcENsaXBSZWN0LT5sZWZ0LCAtcENsaXBSZWN0LT50b3ApOwotICAgIENQREZfRm9ybSBmb3JtKG1fcENvbnRleHQtPm1fcERvY3VtZW50LCBtX3BDb250ZXh0LT5tX3BQYWdlUmVzb3VyY2VzLCBwR3JvdXApOwotICAgIGZvcm0uUGFyc2VDb250ZW50KE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwotICAgIENGWF9GeGdlRGV2aWNlIGJpdG1hcF9kZXZpY2U7Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgaWYgKCFiaXRtYXBfZGV2aWNlLkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBiTHVtaW5vc2l0eSA/IEZYRElCX1JnYjMyIDogRlhESUJfOGJwcE1hc2spKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9SRUNUKiBwQ2xpcFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgeworICBpZiAoIXBTTWFza0RpY3QpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpbnQgd2lkdGggPSBwQ2xpcFJlY3QtPnJpZ2h0IC0gcENsaXBSZWN0LT5sZWZ0OworICBpbnQgaGVpZ2h0ID0gcENsaXBSZWN0LT5ib3R0b20gLSBwQ2xpcFJlY3QtPnRvcDsKKyAgRlhfQk9PTCBiTHVtaW5vc2l0eSA9IEZBTFNFOworICBiTHVtaW5vc2l0eSA9IHBTTWFza0RpY3QtPkdldENvbnN0U3RyaW5nKCJTIikgIT0gIkFscGhhIjsKKyAgQ1BERl9TdHJlYW0qIHBHcm91cCA9IHBTTWFza0RpY3QtPkdldFN0cmVhbSgiRyIpOworICBpZiAoIXBHcm91cCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0Z1bmN0aW9uPiBwRnVuYzsKKyAgQ1BERl9PYmplY3QqIHBGdW5jT2JqID0gcFNNYXNrRGljdC0+R2V0RWxlbWVudFZhbHVlKCJUUiIpOworICBpZiAocEZ1bmNPYmogJiYgKHBGdW5jT2JqLT5Jc0RpY3Rpb25hcnkoKSB8fCBwRnVuY09iai0+SXNTdHJlYW0oKSkpCisgICAgcEZ1bmMucmVzZXQoQ1BERl9GdW5jdGlvbjo6TG9hZChwRnVuY09iaikpOworCisgIENGWF9NYXRyaXggbWF0cml4ID0gKnBNYXRyaXg7CisgIG1hdHJpeC5UcmFuc2xhdGVJKC1wQ2xpcFJlY3QtPmxlZnQsIC1wQ2xpcFJlY3QtPnRvcCk7CisgIENQREZfRm9ybSBmb3JtKG1fcENvbnRleHQtPm1fcERvY3VtZW50LCBtX3BDb250ZXh0LT5tX3BQYWdlUmVzb3VyY2VzLCBwR3JvdXApOworICBmb3JtLlBhcnNlQ29udGVudChOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgQ0ZYX0Z4Z2VEZXZpY2UgYml0bWFwX2RldmljZTsKKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworICBpZiAoIWJpdG1hcF9kZXZpY2UuQ3JlYXRlKHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkx1bWlub3NpdHkgPyBGWERJQl9SZ2IzMiA6IEZYRElCXzhicHBNYXNrKSkgeworICAgIHJldHVybiBOVUxMOworICB9CiAjZWxzZQotICAgIGlmICghYml0bWFwX2RldmljZS5DcmVhdGUod2lkdGgsIGhlaWdodCwgYkx1bWlub3NpdHkgPyBGWERJQl9SZ2IgOiBGWERJQl84YnBwTWFzaykpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQorICBpZiAoIWJpdG1hcF9kZXZpY2UuQ3JlYXRlKHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkx1bWlub3NpdHkgPyBGWERJQl9SZ2IgOiBGWERJQl84YnBwTWFzaykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQogI2VuZGlmCi0gICAgQ0ZYX0RJQml0bWFwJiBiaXRtYXAgPSAqYml0bWFwX2RldmljZS5HZXRCaXRtYXAoKTsKLSAgICBDUERGX09iamVjdCogcENTT2JqID0gTlVMTDsKLSAgICBDUERGX0NvbG9yU3BhY2UqIHBDUyA9IE5VTEw7Ci0gICAgaWYgKGJMdW1pbm9zaXR5KSB7Ci0gICAgICAgIENQREZfQXJyYXkqIHBCQyA9IHBTTWFza0RpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJCQyIpKTsKLSAgICAgICAgRlhfQVJHQiBiYWNrX2NvbG9yID0gMHhmZjAwMDAwMDsKLSAgICAgICAgaWYgKHBCQykgewotICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBHcm91cC0+R2V0RGljdCgpOwotICAgICAgICAgICAgaWYgKHBEaWN0ICYmIHBEaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJHcm91cCIpKSkKLSAgICAgICAgICAgICAgICBwQ1NPYmogPSBwRGljdC0+R2V0RGljdChGWF9CU1RSQygiR3JvdXAiKSktPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiQ1MiKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcENTT2JqID0gTlVMTDsKLSAgICAgICAgICAgIHBDUyA9IG1fcENvbnRleHQtPm1fcERvY3VtZW50LT5Mb2FkQ29sb3JTcGFjZShwQ1NPYmopOwotICAgICAgICAgICAgaWYgKHBDUykgewotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIFIsIEcsIEI7Ci0gICAgICAgICAgICAgICAgRlhfRFdPUkQgY29tcHMgPSA4OwotICAgICAgICAgICAgICAgIGlmIChwQ1MtPkNvdW50Q29tcG9uZW50cygpID4gc3RhdGljX2Nhc3Q8RlhfSU5UMzI+KGNvbXBzKSkgewotICAgICAgICAgICAgICAgICAgICBjb21wcyA9IChGWF9EV09SRClwQ1MtPkNvdW50Q29tcG9uZW50cygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCA4PiBmbG9hdF9hcnJheShjb21wcyk7Ci0gICAgICAgICAgICAgICAgRlhfRkxPQVQqIHBGbG9hdHMgPSBmbG9hdF9hcnJheTsKLSAgICAgICAgICAgICAgICBGWF9TQUZFX0RXT1JEIG51bV9mbG9hdHMgPSBjb21wczsKLSAgICAgICAgICAgICAgICBudW1fZmxvYXRzICo9IHNpemVvZihGWF9GTE9BVCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFudW1fZmxvYXRzLklzVmFsaWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsgIAotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0MzIocEZsb2F0cywgMCwgbnVtX2Zsb2F0cy5WYWx1ZU9yRGllKCkpOwotICAgICAgICAgICAgICAgIGludCBjb3VudCA9IHBCQy0+R2V0Q291bnQoKSA+IDggPyA4IDogcEJDLT5HZXRDb3VudCgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcEZsb2F0c1tpXSA9IHBCQy0+R2V0TnVtYmVyKGkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwQ1MtPkdldFJHQihwRmxvYXRzLCBSLCBHLCBCKTsKLSAgICAgICAgICAgICAgICBiYWNrX2NvbG9yID0gMHhmZjAwMDAwMCB8ICgoRlhfSU5UMzIpKFIgKiAyNTUpIDw8IDE2KSB8ICgoRlhfSU5UMzIpKEcgKiAyNTUpIDw8IDgpIHwgKEZYX0lOVDMyKShCICogMjU1KTsKLSAgICAgICAgICAgICAgICBtX3BDb250ZXh0LT5tX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+UmVsZWFzZUNvbG9yU3BhY2UocENTT2JqKTsKLSAgICAgICAgICAgIH0KKyAgQ0ZYX0RJQml0bWFwJiBiaXRtYXAgPSAqYml0bWFwX2RldmljZS5HZXRCaXRtYXAoKTsKKyAgQ1BERl9PYmplY3QqIHBDU09iaiA9IE5VTEw7CisgIENQREZfQ29sb3JTcGFjZSogcENTID0gTlVMTDsKKyAgaWYgKGJMdW1pbm9zaXR5KSB7CisgICAgQ1BERl9BcnJheSogcEJDID0gcFNNYXNrRGljdC0+R2V0QXJyYXkoIkJDIik7CisgICAgRlhfQVJHQiBiYWNrX2NvbG9yID0gMHhmZjAwMDAwMDsKKyAgICBpZiAocEJDKSB7CisgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcEdyb3VwLT5HZXREaWN0KCk7CisgICAgICBpZiAocERpY3QgJiYgcERpY3QtPkdldERpY3QoIkdyb3VwIikpCisgICAgICAgIHBDU09iaiA9IHBEaWN0LT5HZXREaWN0KCJHcm91cCIpLT5HZXRFbGVtZW50VmFsdWUoIkNTIik7CisgICAgICBlbHNlCisgICAgICAgIHBDU09iaiA9IE5VTEw7CisgICAgICBwQ1MgPSBtX3BDb250ZXh0LT5tX3BEb2N1bWVudC0+TG9hZENvbG9yU3BhY2UocENTT2JqKTsKKyAgICAgIGlmIChwQ1MpIHsKKyAgICAgICAgRlhfRkxPQVQgUiwgRywgQjsKKyAgICAgICAgRlhfRFdPUkQgY29tcHMgPSA4OworICAgICAgICBpZiAocENTLT5Db3VudENvbXBvbmVudHMoKSA+IHN0YXRpY19jYXN0PGludDMyX3Q+KGNvbXBzKSkgeworICAgICAgICAgIGNvbXBzID0gKEZYX0RXT1JEKXBDUy0+Q291bnRDb21wb25lbnRzKCk7CiAgICAgICAgIH0KLSAgICAgICAgYml0bWFwLkNsZWFyKGJhY2tfY29sb3IpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJpdG1hcC5DbGVhcigwKTsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlID0gTlVMTDsKLSAgICBpZiAoZm9ybS5tX3BGb3JtRGljdCkgewotICAgICAgICBwRm9ybVJlc291cmNlID0gZm9ybS5tX3BGb3JtRGljdC0+R2V0RGljdChGWF9CU1RSQygiUmVzb3VyY2VzIikpOwotICAgIH0KLSAgICBDUERGX1JlbmRlck9wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLm1fQ29sb3JNb2RlID0gYkx1bWlub3NpdHkgPyBSRU5ERVJfQ09MT1JfTk9STUFMIDogUkVOREVSX0NPTE9SX0FMUEhBOwotICAgIENQREZfUmVuZGVyU3RhdHVzIHN0YXR1czsKLSAgICBzdGF0dXMuSW5pdGlhbGl6ZShtX3BDb250ZXh0LCAmYml0bWFwX2RldmljZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAmb3B0aW9ucywgMCwgbV9iRHJvcE9iamVjdHMsIHBGb3JtUmVzb3VyY2UsIFRSVUUsIE5VTEwsIDAsIHBDUyA/IHBDUy0+R2V0RmFtaWx5KCkgOiAwLCBiTHVtaW5vc2l0eSk7Ci0gICAgc3RhdHVzLlJlbmRlck9iamVjdExpc3QoJmZvcm0sICZtYXRyaXgpOwotICAgIHBNYXNrID0gbmV3IENGWF9ESUJpdG1hcDsKLSAgICBpZiAoIXBNYXNrLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfOGJwcE1hc2spKSB7Ci0gICAgICAgIGRlbGV0ZSBwTWFzazsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYX0xQQllURSBkZXN0X2J1ZiA9IHBNYXNrLT5HZXRCdWZmZXIoKTsKLSAgICBpbnQgZGVzdF9waXRjaCA9IHBNYXNrLT5HZXRQaXRjaCgpOwotICAgIEZYX0xQQllURSBzcmNfYnVmID0gYml0bWFwLkdldEJ1ZmZlcigpOwotICAgIGludCBzcmNfcGl0Y2ggPSBiaXRtYXAuR2V0UGl0Y2goKTsKLSAgICBGWF9MUEJZVEUgcFRyYW5zZmVyID0gRlhfQWxsb2MoRlhfQllURSwgMjU2KTsKLSAgICBpZiAocEZ1bmMpIHsKLSAgICAgICAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IHJlc3VsdHMocEZ1bmMtPkNvdW50T3V0cHV0cygpKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKLSAgICAgICAgICAgIEZYX0ZMT0FUIGlucHV0ID0gKEZYX0ZMT0FUKWkgLyAyNTUuMGY7Ci0gICAgICAgICAgICBpbnQgbnJlc3VsdDsKLSAgICAgICAgICAgIHBGdW5jLT5DYWxsKCZpbnB1dCwgMSwgcmVzdWx0cywgbnJlc3VsdCk7Ci0gICAgICAgICAgICBwVHJhbnNmZXJbaV0gPSBGWFNZU19yb3VuZChyZXN1bHRzWzBdICogMjU1KTsKKyAgICAgICAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgOD4gZmxvYXRfYXJyYXkoY29tcHMpOworICAgICAgICBGWF9GTE9BVCogcEZsb2F0cyA9IGZsb2F0X2FycmF5OworICAgICAgICBGWF9TQUZFX0RXT1JEIG51bV9mbG9hdHMgPSBjb21wczsKKyAgICAgICAgbnVtX2Zsb2F0cyAqPSBzaXplb2YoRlhfRkxPQVQpOworICAgICAgICBpZiAoIW51bV9mbG9hdHMuSXNWYWxpZCgpKSB7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSArKykgewotICAgICAgICAgICAgcFRyYW5zZmVyW2ldID0gaTsKKyAgICAgICAgRlhTWVNfbWVtc2V0KHBGbG9hdHMsIDAsIG51bV9mbG9hdHMuVmFsdWVPckRpZSgpKTsKKyAgICAgICAgaW50IGNvdW50ID0gcEJDLT5HZXRDb3VudCgpID4gOCA/IDggOiBwQkMtPkdldENvdW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgIHBGbG9hdHNbaV0gPSBwQkMtPkdldE51bWJlcihpKTsKICAgICAgICAgfQorICAgICAgICBwQ1MtPkdldFJHQihwRmxvYXRzLCBSLCBHLCBCKTsKKyAgICAgICAgYmFja19jb2xvciA9IDB4ZmYwMDAwMDAgfCAoKGludDMyX3QpKFIgKiAyNTUpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgICAgICAoKGludDMyX3QpKEcgKiAyNTUpIDw8IDgpIHwgKGludDMyX3QpKEIgKiAyNTUpOworICAgICAgICBtX3BDb250ZXh0LT5tX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+UmVsZWFzZUNvbG9yU3BhY2UocENTT2JqKTsKKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKGJMdW1pbm9zaXR5KSB7Ci0gICAgICAgIGludCBCcHAgPSBiaXRtYXAuR2V0QlBQKCkgLyA4OwotICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgRlhfTFBCWVRFIGRlc3RfcG9zID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOwotICAgICAgICAgICAgRlhfTFBCWVRFIHNyY19wb3MgPSBzcmNfYnVmICsgcm93ICogc3JjX3BpdGNoOwotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICpkZXN0X3BvcyArKyA9IHBUcmFuc2ZlcltGWFJHQjJHUkFZKHNyY19wb3NbMl0sIHNyY19wb3NbMV0sICpzcmNfcG9zKV07Ci0gICAgICAgICAgICAgICAgc3JjX3BvcyArPSBCcHA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHBGdW5jKSB7Ci0gICAgICAgIGludCBzaXplID0gZGVzdF9waXRjaCAqIGhlaWdodDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpICsrKSB7Ci0gICAgICAgICAgICBkZXN0X2J1ZltpXSA9IHBUcmFuc2ZlcltzcmNfYnVmW2ldXTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYU1lTX21lbWNweTMyKGRlc3RfYnVmLCBzcmNfYnVmLCBkZXN0X3BpdGNoICogaGVpZ2h0KTsKKyAgICBiaXRtYXAuQ2xlYXIoYmFja19jb2xvcik7CisgIH0gZWxzZSB7CisgICAgYml0bWFwLkNsZWFyKDApOworICB9CisgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSA9IE5VTEw7CisgIGlmIChmb3JtLm1fcEZvcm1EaWN0KSB7CisgICAgcEZvcm1SZXNvdXJjZSA9IGZvcm0ubV9wRm9ybURpY3QtPkdldERpY3QoIlJlc291cmNlcyIpOworICB9CisgIENQREZfUmVuZGVyT3B0aW9ucyBvcHRpb25zOworICBvcHRpb25zLm1fQ29sb3JNb2RlID0gYkx1bWlub3NpdHkgPyBSRU5ERVJfQ09MT1JfTk9STUFMIDogUkVOREVSX0NPTE9SX0FMUEhBOworICBDUERGX1JlbmRlclN0YXR1cyBzdGF0dXM7CisgIHN0YXR1cy5Jbml0aWFsaXplKG1fcENvbnRleHQsICZiaXRtYXBfZGV2aWNlLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAmb3B0aW9ucywgMCwgbV9iRHJvcE9iamVjdHMsIHBGb3JtUmVzb3VyY2UsIFRSVUUsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgIHBDUyA/IHBDUy0+R2V0RmFtaWx5KCkgOiAwLCBiTHVtaW5vc2l0eSk7CisgIHN0YXR1cy5SZW5kZXJPYmplY3RMaXN0KCZmb3JtLCAmbWF0cml4KTsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWF9ESUJpdG1hcD4gcE1hc2sobmV3IENGWF9ESUJpdG1hcCk7CisgIGlmICghcE1hc2stPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl84YnBwTWFzaykpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgdWludDhfdCogZGVzdF9idWYgPSBwTWFzay0+R2V0QnVmZmVyKCk7CisgIGludCBkZXN0X3BpdGNoID0gcE1hc2stPkdldFBpdGNoKCk7CisgIHVpbnQ4X3QqIHNyY19idWYgPSBiaXRtYXAuR2V0QnVmZmVyKCk7CisgIGludCBzcmNfcGl0Y2ggPSBiaXRtYXAuR2V0UGl0Y2goKTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdHJhbnNmZXJzKDI1Nik7CisgIGlmIChwRnVuYykgeworICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiByZXN1bHRzKHBGdW5jLT5Db3VudE91dHB1dHMoKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgRlhfRkxPQVQgaW5wdXQgPSAoRlhfRkxPQVQpaSAvIDI1NS4wZjsKKyAgICAgIGludCBucmVzdWx0OworICAgICAgcEZ1bmMtPkNhbGwoJmlucHV0LCAxLCByZXN1bHRzLCBucmVzdWx0KTsKKyAgICAgIHRyYW5zZmVyc1tpXSA9IEZYU1lTX3JvdW5kKHJlc3VsdHNbMF0gKiAyNTUpOwogICAgIH0KLSAgICBpZiAocEZ1bmMpIHsKLSAgICAgICAgZGVsZXRlIHBGdW5jOworICB9IGVsc2UgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgIHRyYW5zZmVyc1tpXSA9IGk7CiAgICAgfQotICAgIEZYX0ZyZWUocFRyYW5zZmVyKTsKLSAgICByZXR1cm4gcE1hc2s7CisgIH0KKyAgaWYgKGJMdW1pbm9zaXR5KSB7CisgICAgaW50IEJwcCA9IGJpdG1hcC5HZXRCUFAoKSAvIDg7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgICAgdWludDhfdCogZGVzdF9wb3MgPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7CisgICAgICB1aW50OF90KiBzcmNfcG9zID0gc3JjX2J1ZiArIHJvdyAqIHNyY19waXRjaDsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICAqZGVzdF9wb3MrKyA9IHRyYW5zZmVyc1tGWFJHQjJHUkFZKHNyY19wb3NbMl0sIHNyY19wb3NbMV0sICpzcmNfcG9zKV07CisgICAgICAgIHNyY19wb3MgKz0gQnBwOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmIChwRnVuYykgeworICAgIGludCBzaXplID0gZGVzdF9waXRjaCAqIGhlaWdodDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgZGVzdF9idWZbaV0gPSB0cmFuc2ZlcnNbc3JjX2J1ZltpXV07CisgICAgfQorICB9IGVsc2UgeworICAgIEZYU1lTX21lbWNweShkZXN0X2J1Ziwgc3JjX2J1ZiwgZGVzdF9waXRjaCAqIGhlaWdodCk7CisgIH0KKyAgcmV0dXJuIHBNYXNrLnJlbGVhc2UoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfbG9hZGltYWdlLmNwcCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfbG9hZGltYWdlLmNwcAppbmRleCBiNDVkOWMzLi5mNjkwYzIwIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2xvYWRpbWFnZS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9sb2FkaW1hZ2UuY3BwCkBAIC0xLDE1MTMgKzEsMTYzMCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGdlL2Z4X2dlLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcmVuZGVyLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZW9iai5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL3NyYy9meGNydC9meF9zYWZlX3R5cGVzLmgiCi0jaW5jbHVkZSAiLi4vZnBkZl9wYWdlL3BhZ2VpbnQuaCIKICNpbmNsdWRlICJyZW5kZXJfaW50LmgiCiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlb2JqLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZW5kZXIuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zYWZlX3R5cGVzLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKKyNpbmNsdWRlICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9wYWdlaW50LmgiCisKIG5hbWVzcGFjZSB7CiAKLXVuc2lnbmVkIGludCBfR2V0Qml0czgoRlhfTFBDQllURSBwRGF0YSwgaW50IGJpdHBvcywgaW50IG5iaXRzKQotewotICAgIHVuc2lnbmVkIGludCBieXRlID0gcERhdGFbYml0cG9zIC8gOF07Ci0gICAgaWYgKG5iaXRzID09IDgpIHsKLSAgICAgICAgcmV0dXJuIGJ5dGU7Ci0gICAgfSBlbHNlIGlmIChuYml0cyA9PSA0KSB7Ci0gICAgICAgIHJldHVybiAoYml0cG9zICUgOCkgPyAoYnl0ZSAmIDB4MGYpIDogKGJ5dGUgPj4gNCk7Ci0gICAgfSBlbHNlIGlmIChuYml0cyA9PSAyKSB7Ci0gICAgICAgIHJldHVybiAoYnl0ZSA+PiAoNiAtIGJpdHBvcyAlIDgpKSAmIDB4MDM7Ci0gICAgfSBlbHNlIGlmIChuYml0cyA9PSAxKSB7Ci0gICAgICAgIHJldHVybiAoYnl0ZSA+PiAoNyAtIGJpdHBvcyAlIDgpKSAmIDB4MDE7Ci0gICAgfSBlbHNlIGlmIChuYml0cyA9PSAxNikgewotICAgICAgICByZXR1cm4gYnl0ZSAqIDI1NiArIHBEYXRhW2JpdHBvcyAvIDggKyAxXTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Cit1bnNpZ25lZCBpbnQgR2V0Qml0czgoY29uc3QgdWludDhfdCogcERhdGEsIHVpbnQ2NF90IGJpdHBvcywgc2l6ZV90IG5iaXRzKSB7CisgIEFTU0VSVChuYml0cyA9PSAxIHx8IG5iaXRzID09IDIgfHwgbmJpdHMgPT0gNCB8fCBuYml0cyA9PSA4IHx8IG5iaXRzID09IDE2KTsKKyAgQVNTRVJUKChiaXRwb3MgJiAobmJpdHMgLSAxKSkgPT0gMCk7CisgIHVuc2lnbmVkIGludCBieXRlID0gcERhdGFbYml0cG9zIC8gOF07CisgIGlmIChuYml0cyA9PSA4KSB7CisgICAgcmV0dXJuIGJ5dGU7CisgIH0KKyAgaWYgKG5iaXRzID09IDQpIHsKKyAgICByZXR1cm4gKGJpdHBvcyAlIDgpID8gKGJ5dGUgJiAweDBmKSA6IChieXRlID4+IDQpOworICB9CisgIGlmIChuYml0cyA9PSAyKSB7CisgICAgcmV0dXJuIChieXRlID4+ICg2IC0gYml0cG9zICUgOCkpICYgMHgwMzsKKyAgfQorICBpZiAobmJpdHMgPT0gMSkgeworICAgIHJldHVybiAoYnl0ZSA+PiAoNyAtIGJpdHBvcyAlIDgpKSAmIDB4MDE7CisgIH0KKyAgaWYgKG5iaXRzID09IDE2KSB7CisgICAgcmV0dXJuIGJ5dGUgKiAyNTYgKyBwRGF0YVtiaXRwb3MgLyA4ICsgMV07CisgIH0KKyAgcmV0dXJuIDA7CiB9CiAKLUZYX1NBRkVfRFdPUkQgQ2FsY3VsYXRlUGl0Y2g4KEZYX0RXT1JEIGJwYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KQotewotICAgIEZYX1NBRkVfRFdPUkQgcGl0Y2ggPSBicGM7Ci0gICAgcGl0Y2ggKj0gY29tcG9uZW50czsKLSAgICBwaXRjaCAqPSB3aWR0aDsKLSAgICBwaXRjaCArPSA3OwotICAgIHBpdGNoIC89IDg7Ci0gICAgcGl0Y2ggKj0gaGVpZ2h0OwotICAgIHJldHVybiBwaXRjaDsKK0ZYX1NBRkVfRFdPUkQgQ2FsY3VsYXRlUGl0Y2g4KEZYX0RXT1JEIGJwYywgRlhfRFdPUkQgY29tcG9uZW50cywgaW50IHdpZHRoKSB7CisgIEZYX1NBRkVfRFdPUkQgcGl0Y2ggPSBicGM7CisgIHBpdGNoICo9IGNvbXBvbmVudHM7CisgIHBpdGNoICo9IHdpZHRoOworICBwaXRjaCArPSA3OworICBwaXRjaCAvPSA4OworICByZXR1cm4gcGl0Y2g7CiB9CiAKLUZYX1NBRkVfRFdPUkQgQ2FsY3VsYXRlUGl0Y2gzMihpbnQgYnBwLCBpbnQgd2lkdGgpCi17Ci0gICAgRlhfU0FGRV9EV09SRCBwaXRjaCA9IGJwcDsKLSAgICBwaXRjaCAqPSB3aWR0aDsKLSAgICBwaXRjaCArPSAzMTsKLSAgICBwaXRjaCAvPSA4OwotICAgIHJldHVybiBwaXRjaDsKK0ZYX1NBRkVfRFdPUkQgQ2FsY3VsYXRlUGl0Y2gzMihpbnQgYnBwLCBpbnQgd2lkdGgpIHsKKyAgRlhfU0FGRV9EV09SRCBwaXRjaCA9IGJwcDsKKyAgcGl0Y2ggKj0gd2lkdGg7CisgIHBpdGNoICs9IDMxOworICBwaXRjaCAvPSAzMjsgIC8vIHF1YW50aXplZCB0byBudW1iZXIgb2YgMzItYml0IHdvcmRzLgorICBwaXRjaCAqPSA0OyAgIC8vIGFuZCB0aGVuIGJhY2sgdG8gYnl0ZXMsIChub3QganVzdCAvOCBpbiBvbmUgc3RlcCkuCisgIHJldHVybiBwaXRjaDsKIH0KIAorYm9vbCBJc0FsbG93ZWRCUENWYWx1ZShpbnQgYnBjKSB7CisgIHJldHVybiBicGMgPT0gMSB8fCBicGMgPT0gMiB8fCBicGMgPT0gNCB8fCBicGMgPT0gOCB8fCBicGMgPT0gMTY7Cit9CisKKy8vIFdyYXBwZXIgY2xhc3MgdG8gdXNlIHdpdGggc3RkOjp1bmlxdWVfcHRyIGZvciBDSlBYX0RlY29kZXIuCitjbGFzcyBKcHhCaXRNYXBDb250ZXh0IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEpweEJpdE1hcENvbnRleHQoSUNvZGVjX0pweE1vZHVsZSoganB4X21vZHVsZSkKKyAgICAgIDoganB4X21vZHVsZV8oanB4X21vZHVsZSksIGRlY29kZXJfKG51bGxwdHIpIHt9CisKKyAgfkpweEJpdE1hcENvbnRleHQoKSB7CisgICAganB4X21vZHVsZV8tPkRlc3Ryb3lEZWNvZGVyKGRlY29kZXJfKTsKKyAgfQorCisgIC8vIFRha2VzIG93bmVyc2hpcCBvZiB8ZGVjb2RlcnwuCisgIHZvaWQgc2V0X2RlY29kZXIoQ0pQWF9EZWNvZGVyKiBkZWNvZGVyKSB7IGRlY29kZXJfID0gZGVjb2RlcjsgfQorCisgIENKUFhfRGVjb2RlciogZGVjb2RlcigpIHsgcmV0dXJuIGRlY29kZXJfOyB9CisKKyBwcml2YXRlOgorICBJQ29kZWNfSnB4TW9kdWxlKiBjb25zdCBqcHhfbW9kdWxlXzsgIC8vIFdlYWsgcG9pbnRlci4KKyAgQ0pQWF9EZWNvZGVyKiBkZWNvZGVyXzsgICAgICAgICAgICAgICAvLyBEZWNvZGVyLCBvd25lZC4KKworICAvLyBEaXNhbGxvdyBldmlsIGNvbnN0cnVjdG9ycworICBKcHhCaXRNYXBDb250ZXh0KGNvbnN0IEpweEJpdE1hcENvbnRleHQmKTsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSnB4Qml0TWFwQ29udGV4dCYpOworfTsKKworY29uc3QgaW50IGtNYXhJbWFnZURpbWVuc2lvbiA9IDB4MDFGRkZGOworCiB9ICAvLyBuYW1lc3BhY2UKIAotQ0ZYX0RJQlNvdXJjZSogQ1BERl9JbWFnZTo6TG9hZERJQlNvdXJjZShDRlhfRElCU291cmNlKiogcHBNYXNrLCBGWF9EV09SRCogcE1hdHRlQ29sb3IsIEZYX0JPT0wgYlN0ZENTLCBGWF9EV09SRCBHcm91cEZhbWlseSwgRlhfQk9PTCBiTG9hZE1hc2spIGNvbnN0Ci17Ci0gICAgQ1BERl9ESUJTb3VyY2UqIHBTb3VyY2UgPSBuZXcgQ1BERl9ESUJTb3VyY2U7Ci0gICAgaWYgKHBTb3VyY2UtPkxvYWQobV9wRG9jdW1lbnQsIG1fcFN0cmVhbSwgKENQREZfRElCU291cmNlKiopcHBNYXNrLCBwTWF0dGVDb2xvciwgTlVMTCwgTlVMTCwgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrKSkgewotICAgICAgICByZXR1cm4gcFNvdXJjZTsKLSAgICB9Ci0gICAgZGVsZXRlIHBTb3VyY2U7Ci0gICAgcmV0dXJuIE5VTEw7CitDRlhfRElCU291cmNlKiBDUERGX0ltYWdlOjpMb2FkRElCU291cmNlKENGWF9ESUJTb3VyY2UqKiBwcE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwTWF0dGVDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIEdyb3VwRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJMb2FkTWFzaykgY29uc3QgeworICBDUERGX0RJQlNvdXJjZSogcFNvdXJjZSA9IG5ldyBDUERGX0RJQlNvdXJjZTsKKyAgaWYgKHBTb3VyY2UtPkxvYWQobV9wRG9jdW1lbnQsIG1fcFN0cmVhbSwgKENQREZfRElCU291cmNlKiopcHBNYXNrLAorICAgICAgICAgICAgICAgICAgICBwTWF0dGVDb2xvciwgTlVMTCwgTlVMTCwgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrKSkgeworICAgIHJldHVybiBwU291cmNlOworICB9CisgIGRlbGV0ZSBwU291cmNlOworICByZXR1cm4gTlVMTDsKIH0KLUNGWF9ESUJTb3VyY2UqIENQREZfSW1hZ2U6OkRldGFjaEJpdG1hcCgpCi17Ci0gICAgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCA9IG1fcERJQlNvdXJjZTsKLSAgICBtX3BESUJTb3VyY2UgPSBOVUxMOwotICAgIHJldHVybiBwQml0bWFwOworQ0ZYX0RJQlNvdXJjZSogQ1BERl9JbWFnZTo6RGV0YWNoQml0bWFwKCkgeworICBDRlhfRElCU291cmNlKiBwQml0bWFwID0gbV9wRElCU291cmNlOworICBtX3BESUJTb3VyY2UgPSBOVUxMOworICByZXR1cm4gcEJpdG1hcDsKIH0KLUNGWF9ESUJTb3VyY2UqIENQREZfSW1hZ2U6OkRldGFjaE1hc2soKQotewotICAgIENGWF9ESUJTb3VyY2UqIHBCaXRtYXAgPSBtX3BNYXNrOwotICAgIG1fcE1hc2sgPSBOVUxMOwotICAgIHJldHVybiBwQml0bWFwOworQ0ZYX0RJQlNvdXJjZSogQ1BERl9JbWFnZTo6RGV0YWNoTWFzaygpIHsKKyAgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCA9IG1fcE1hc2s7CisgIG1fcE1hc2sgPSBOVUxMOworICByZXR1cm4gcEJpdG1hcDsKIH0KLUZYX0JPT0wgQ1BERl9JbWFnZTo6U3RhcnRMb2FkRElCU291cmNlKENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSwgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlLCBGWF9CT09MIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIEZYX0JPT0wgYkxvYWRNYXNrKQotewotICAgIG1fcERJQlNvdXJjZSA9IG5ldyBDUERGX0RJQlNvdXJjZTsKLSAgICBpbnQgcmV0ID0gKChDUERGX0RJQlNvdXJjZSopbV9wRElCU291cmNlKS0+U3RhcnRMb2FkRElCU291cmNlKG1fcERvY3VtZW50LCBtX3BTdHJlYW0sIFRSVUUsIHBGb3JtUmVzb3VyY2UsIHBQYWdlUmVzb3VyY2UsIGJTdGRDUywgR3JvdXBGYW1pbHksIGJMb2FkTWFzayk7Ci0gICAgaWYgKHJldCA9PSAyKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAoIXJldCkgewotICAgICAgICBkZWxldGUgbV9wRElCU291cmNlOwotICAgICAgICBtX3BESUJTb3VyY2UgPSBOVUxMOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fcE1hc2sgPSAoKENQREZfRElCU291cmNlKiltX3BESUJTb3VyY2UpLT5EZXRhY2hNYXNrKCk7Ci0gICAgbV9NYXR0ZUNvbG9yID0gKChDUERGX0RJQlNvdXJjZSopbV9wRElCU291cmNlKS0+bV9NYXR0ZUNvbG9yOwotICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wgQ1BERl9JbWFnZTo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgaW50IHJldCA9ICgoQ1BERl9ESUJTb3VyY2UqKW1fcERJQlNvdXJjZSktPkNvbnRpbnVlTG9hZERJQlNvdXJjZShwUGF1c2UpOwotICAgIGlmIChyZXQgPT0gMikgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKCFyZXQpIHsKLSAgICAgICAgZGVsZXRlIG1fcERJQlNvdXJjZTsKLSAgICAgICAgbV9wRElCU291cmNlID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX3BNYXNrID0gKChDUERGX0RJQlNvdXJjZSopbV9wRElCU291cmNlKS0+RGV0YWNoTWFzaygpOwotICAgIG1fTWF0dGVDb2xvciA9ICgoQ1BERl9ESUJTb3VyY2UqKW1fcERJQlNvdXJjZSktPm1fTWF0dGVDb2xvcjsKLSAgICByZXR1cm4gRkFMU0U7Ci19Ci1DUERGX0RJQlNvdXJjZTo6Q1BERl9ESUJTb3VyY2UoKQotewotICAgIG1fcERvY3VtZW50ID0gTlVMTDsKLSAgICBtX3BTdHJlYW1BY2MgPSBOVUxMOwotICAgIG1fcERpY3QgPSBOVUxMOwotICAgIG1fYnBwID0gMDsKLSAgICBtX1dpZHRoID0gbV9IZWlnaHQgPSAwOwotICAgIG1fcENvbG9yU3BhY2UgPSBOVUxMOwotICAgIG1fYkRlZmF1bHREZWNvZGUgPSBUUlVFOwotICAgIG1fYkltYWdlTWFzayA9IEZBTFNFOwotICAgIG1fYkRvQnBjQ2hlY2sgPSBUUlVFOwotICAgIG1fcFBhbGV0dGUgPSBOVUxMOwotICAgIG1fcENvbXBEYXRhID0gTlVMTDsKLSAgICBtX2JDb2xvcktleSA9IEZBTFNFOwotICAgIG1fcE1hc2tlZExpbmUgPSBtX3BMaW5lQnVmID0gTlVMTDsKLSAgICBtX3BDYWNoZWRCaXRtYXAgPSBOVUxMOwotICAgIG1fcERlY29kZXIgPSBOVUxMOwotICAgIG1fbkNvbXBvbmVudHMgPSAwOwotICAgIG1fYnBjID0gMDsKLSAgICBtX2JMb2FkTWFzayA9IEZBTFNFOwotICAgIG1fRmFtaWx5ID0gMDsKLSAgICBtX3BNYXNrID0gTlVMTDsKLSAgICBtX01hdHRlQ29sb3IgPSAwOwotICAgIG1fcEpiaWcyQ29udGV4dCA9IE5VTEw7Ci0gICAgbV9wR2xvYmFsU3RyZWFtID0gTlVMTDsKLSAgICBtX2JTdGRDUyA9IEZBTFNFOwotICAgIG1fcE1hc2tTdHJlYW0gPSBOVUxMOwotICAgIG1fU3RhdHVzID0gMDsKLSAgICBtX2JIYXNNYXNrID0gRkFMU0U7Ci19Ci1DUERGX0RJQlNvdXJjZTo6fkNQREZfRElCU291cmNlKCkKLXsKLSAgICBkZWxldGUgbV9wU3RyZWFtQWNjOwotICAgIGlmIChtX3BNYXNrZWRMaW5lKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wTWFza2VkTGluZSk7Ci0gICAgfQotICAgIGlmIChtX3BMaW5lQnVmKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wTGluZUJ1Zik7Ci0gICAgfQotICAgIGRlbGV0ZSBtX3BDYWNoZWRCaXRtYXA7Ci0gICAgZGVsZXRlIG1fcERlY29kZXI7Ci0gICAgaWYgKG1fcENvbXBEYXRhKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wQ29tcERhdGEpOwotICAgIH0KLSAgICBDUERGX0NvbG9yU3BhY2UqIHBDUyA9IG1fcENvbG9yU3BhY2U7Ci0gICAgaWYgKHBDUyAmJiBtX3BEb2N1bWVudCkgewotICAgICAgICBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+UmVsZWFzZUNvbG9yU3BhY2UocENTLT5HZXRBcnJheSgpKTsKLSAgICB9Ci0gICAgaWYgKG1fcEpiaWcyQ29udGV4dCkgewotICAgICAgICBJQ29kZWNfSmJpZzJNb2R1bGUqIHBKYmlnMk1vZHVsZSA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SmJpZzJNb2R1bGUoKTsKLSAgICAgICAgcEpiaWcyTW9kdWxlLT5EZXN0cm95SmJpZzJDb250ZXh0KG1fcEpiaWcyQ29udGV4dCk7Ci0gICAgfQotICAgIGRlbGV0ZSBtX3BHbG9iYWxTdHJlYW07Ci19Ci1DRlhfRElCaXRtYXAqIENQREZfRElCU291cmNlOjpHZXRCaXRtYXAoKSBjb25zdAotewotICAgIGlmIChtX3BDYWNoZWRCaXRtYXApIHsKLSAgICAgICAgcmV0dXJuIG1fcENhY2hlZEJpdG1hcDsKLSAgICB9Ci0gICAgcmV0dXJuIENsb25lKCk7Ci19Ci12b2lkIENQREZfRElCU291cmNlOjpSZWxlYXNlQml0bWFwKENGWF9ESUJpdG1hcCogcEJpdG1hcCkgY29uc3QKLXsKLSAgICBpZiAocEJpdG1hcCAmJiBwQml0bWFwICE9IG1fcENhY2hlZEJpdG1hcCkgewotICAgICAgICBkZWxldGUgcEJpdG1hcDsKLSAgICB9Ci19Ci1GWF9CT09MIENQREZfRElCU291cmNlOjpMb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIGNvbnN0IENQREZfU3RyZWFtKiBwU3RyZWFtLCBDUERGX0RJQlNvdXJjZSoqIHBwTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBNYXR0ZUNvbG9yLCBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2VzLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLCBGWF9CT09MIGJTdGRDUywgRlhfRFdPUkQgR3JvdXBGYW1pbHksIEZYX0JPT0wgYkxvYWRNYXNrKQotewotICAgIGlmIChwU3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX3BEb2N1bWVudCA9IHBEb2M7Ci0gICAgbV9wRGljdCA9IHBTdHJlYW0tPkdldERpY3QoKTsKLSAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9wU3RyZWFtID0gcFN0cmVhbTsKLSAgICBtX1dpZHRoID0gbV9wRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiV2lkdGgiKSk7Ci0gICAgbV9IZWlnaHQgPSBtX3BEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJIZWlnaHQiKSk7Ci0gICAgaWYgKG1fV2lkdGggPD0gMCB8fCBtX0hlaWdodCA8PSAwIHx8IG1fV2lkdGggPiAweDAxZmZmZiB8fCBtX0hlaWdodCA+IDB4MDFmZmZmKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9Hcm91cEZhbWlseSA9IEdyb3VwRmFtaWx5OwotICAgIG1fYkxvYWRNYXNrID0gYkxvYWRNYXNrOwotICAgIGlmICghTG9hZENvbG9ySW5mbyhtX3BTdHJlYW0tPkdldE9iak51bSgpICE9IDAgPyBOVUxMIDogcEZvcm1SZXNvdXJjZXMsIHBQYWdlUmVzb3VyY2VzKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX2JEb0JwY0NoZWNrICYmIChtX2JwYyA9PSAwIHx8IG1fbkNvbXBvbmVudHMgPT0gMCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9TQUZFX0RXT1JEIHNyY19waXRjaCA9Ci0gICAgICAgIENhbGN1bGF0ZVBpdGNoOChtX2JwYywgbV9uQ29tcG9uZW50cywgbV9XaWR0aCwgbV9IZWlnaHQpOwotICAgIGlmICghc3JjX3BpdGNoLklzVmFsaWQoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fcFN0cmVhbUFjYyA9IG5ldyBDUERGX1N0cmVhbUFjYzsKLSAgICBtX3BTdHJlYW1BY2MtPkxvYWRBbGxEYXRhKHBTdHJlYW0sIEZBTFNFLCBzcmNfcGl0Y2guVmFsdWVPckRpZSgpLCBUUlVFKTsKLSAgICBpZiAobV9wU3RyZWFtQWNjLT5HZXRTaXplKCkgPT0gMCB8fCBtX3BTdHJlYW1BY2MtPkdldERhdGEoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKCFDcmVhdGVEZWNvZGVyKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9iSW1hZ2VNYXNrKSB7Ci0gICAgICAgIG1fYnBwID0gMTsKLSAgICAgICAgbV9icGMgPSAxOwotICAgICAgICBtX25Db21wb25lbnRzID0gMTsKLSAgICAgICAgbV9BbHBoYUZsYWcgPSAxOwotICAgIH0gZWxzZSBpZiAobV9icGMgKiBtX25Db21wb25lbnRzID09IDEpIHsKLSAgICAgICAgbV9icHAgPSAxOwotICAgIH0gZWxzZSBpZiAobV9icGMgKiBtX25Db21wb25lbnRzIDw9IDgpIHsKLSAgICAgICAgbV9icHAgPSA4OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fYnBwID0gMjQ7Ci0gICAgfQotICAgIEZYX1NBRkVfRFdPUkQgcGl0Y2ggPSBDYWxjdWxhdGVQaXRjaDMyKG1fYnBwLCBtX1dpZHRoKTsKLSAgICBpZiAoIXBpdGNoLklzVmFsaWQoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fcExpbmVCdWYgPSBGWF9BbGxvYyhGWF9CWVRFLCBwaXRjaC5WYWx1ZU9yRGllKCkpOwotICAgIGlmIChtX3BDb2xvclNwYWNlICYmIGJTdGRDUykgewotICAgICAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKFRSVUUpOwotICAgIH0KLSAgICBMb2FkUGFsZXR0ZSgpOwotICAgIGlmIChtX2JDb2xvcktleSkgewotICAgICAgICBtX2JwcCA9IDMyOwotICAgICAgICBtX0FscGhhRmxhZyA9IDI7Ci0gICAgICAgIHBpdGNoID0gQ2FsY3VsYXRlUGl0Y2gzMihtX2JwcCwgbV9XaWR0aCk7Ci0gICAgICAgIGlmICghcGl0Y2guSXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wTWFza2VkTGluZSA9IEZYX0FsbG9jKEZYX0JZVEUsIHBpdGNoLlZhbHVlT3JEaWUoKSk7Ci0gICAgfQotICAgIG1fUGl0Y2ggPSBwaXRjaC5WYWx1ZU9yRGllKCk7Ci0gICAgaWYgKHBwTWFzaykgewotICAgICAgICAqcHBNYXNrID0gTG9hZE1hc2soKnBNYXR0ZUNvbG9yKTsKLSAgICB9Ci0gICAgaWYgKG1fcENvbG9yU3BhY2UgJiYgYlN0ZENTKSB7Ci0gICAgICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24oRkFMU0UpOwotICAgIH0KK0ZYX0JPT0wgQ1BERl9JbWFnZTo6U3RhcnRMb2FkRElCU291cmNlKENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgR3JvdXBGYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJMb2FkTWFzaykgeworICBtX3BESUJTb3VyY2UgPSBuZXcgQ1BERl9ESUJTb3VyY2U7CisgIGludCByZXQgPQorICAgICAgKChDUERGX0RJQlNvdXJjZSopbV9wRElCU291cmNlKQorICAgICAgICAgIC0+U3RhcnRMb2FkRElCU291cmNlKG1fcERvY3VtZW50LCBtX3BTdHJlYW0sIFRSVUUsIHBGb3JtUmVzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhZ2VSZXNvdXJjZSwgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrKTsKKyAgaWYgKHJldCA9PSAyKSB7CiAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKCFyZXQpIHsKKyAgICBkZWxldGUgbV9wRElCU291cmNlOworICAgIG1fcERJQlNvdXJjZSA9IE5VTEw7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fcE1hc2sgPSAoKENQREZfRElCU291cmNlKiltX3BESUJTb3VyY2UpLT5EZXRhY2hNYXNrKCk7CisgIG1fTWF0dGVDb2xvciA9ICgoQ1BERl9ESUJTb3VyY2UqKW1fcERJQlNvdXJjZSktPm1fTWF0dGVDb2xvcjsKKyAgcmV0dXJuIEZBTFNFOwogfQotaW50CUNQREZfRElCU291cmNlOjpDb250aW51ZVRvTG9hZE1hc2soKQotewotICAgIGlmIChtX2JJbWFnZU1hc2spIHsKLSAgICAgICAgbV9icHAgPSAxOwotICAgICAgICBtX2JwYyA9IDE7Ci0gICAgICAgIG1fbkNvbXBvbmVudHMgPSAxOwotICAgICAgICBtX0FscGhhRmxhZyA9IDE7Ci0gICAgfSBlbHNlIGlmIChtX2JwYyAqIG1fbkNvbXBvbmVudHMgPT0gMSkgewotICAgICAgICBtX2JwcCA9IDE7Ci0gICAgfSBlbHNlIGlmIChtX2JwYyAqIG1fbkNvbXBvbmVudHMgPD0gOCkgewotICAgICAgICBtX2JwcCA9IDg7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9icHAgPSAyNDsKLSAgICB9Ci0gICAgaWYgKCFtX2JwYyB8fCAhbV9uQ29tcG9uZW50cykgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgRlhfU0FGRV9EV09SRCBwaXRjaCA9IENhbGN1bGF0ZVBpdGNoMzIobV9icHAsIG1fV2lkdGgpOworRlhfQk9PTCBDUERGX0ltYWdlOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpbnQgcmV0ID0gKChDUERGX0RJQlNvdXJjZSopbV9wRElCU291cmNlKS0+Q29udGludWVMb2FkRElCU291cmNlKHBQYXVzZSk7CisgIGlmIChyZXQgPT0gMikgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmICghcmV0KSB7CisgICAgZGVsZXRlIG1fcERJQlNvdXJjZTsKKyAgICBtX3BESUJTb3VyY2UgPSBOVUxMOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX3BNYXNrID0gKChDUERGX0RJQlNvdXJjZSopbV9wRElCU291cmNlKS0+RGV0YWNoTWFzaygpOworICBtX01hdHRlQ29sb3IgPSAoKENQREZfRElCU291cmNlKiltX3BESUJTb3VyY2UpLT5tX01hdHRlQ29sb3I7CisgIHJldHVybiBGQUxTRTsKK30KK0NQREZfRElCU291cmNlOjpDUERGX0RJQlNvdXJjZSgpIHsKKyAgbV9wRG9jdW1lbnQgPSBOVUxMOworICBtX3BTdHJlYW1BY2MgPSBOVUxMOworICBtX3BEaWN0ID0gTlVMTDsKKyAgbV9icHAgPSAwOworICBtX1dpZHRoID0gbV9IZWlnaHQgPSAwOworICBtX3BDb2xvclNwYWNlID0gTlVMTDsKKyAgbV9iRGVmYXVsdERlY29kZSA9IFRSVUU7CisgIG1fYkltYWdlTWFzayA9IEZBTFNFOworICBtX2JEb0JwY0NoZWNrID0gVFJVRTsKKyAgbV9wUGFsZXR0ZSA9IE5VTEw7CisgIG1fcENvbXBEYXRhID0gTlVMTDsKKyAgbV9iQ29sb3JLZXkgPSBGQUxTRTsKKyAgbV9wTWFza2VkTGluZSA9IG1fcExpbmVCdWYgPSBOVUxMOworICBtX3BEZWNvZGVyID0gTlVMTDsKKyAgbV9uQ29tcG9uZW50cyA9IDA7CisgIG1fYnBjID0gMDsKKyAgbV9iTG9hZE1hc2sgPSBGQUxTRTsKKyAgbV9GYW1pbHkgPSAwOworICBtX3BNYXNrID0gTlVMTDsKKyAgbV9NYXR0ZUNvbG9yID0gMDsKKyAgbV9wSmJpZzJDb250ZXh0ID0gTlVMTDsKKyAgbV9wR2xvYmFsU3RyZWFtID0gTlVMTDsKKyAgbV9iU3RkQ1MgPSBGQUxTRTsKKyAgbV9wTWFza1N0cmVhbSA9IE5VTEw7CisgIG1fU3RhdHVzID0gMDsKKyAgbV9iSGFzTWFzayA9IEZBTFNFOworfQorQ1BERl9ESUJTb3VyY2U6On5DUERGX0RJQlNvdXJjZSgpIHsKKyAgZGVsZXRlIG1fcFN0cmVhbUFjYzsKKyAgRlhfRnJlZShtX3BNYXNrZWRMaW5lKTsKKyAgRlhfRnJlZShtX3BMaW5lQnVmKTsKKyAgbV9wQ2FjaGVkQml0bWFwLnJlc2V0KCk7CisgIGRlbGV0ZSBtX3BEZWNvZGVyOworICBGWF9GcmVlKG1fcENvbXBEYXRhKTsKKyAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBtX3BDb2xvclNwYWNlOworICBpZiAocENTICYmIG1fcERvY3VtZW50KSB7CisgICAgbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VDb2xvclNwYWNlKHBDUy0+R2V0QXJyYXkoKSk7CisgIH0KKyAgaWYgKG1fcEpiaWcyQ29udGV4dCkgeworICAgIElDb2RlY19KYmlnMk1vZHVsZSogcEpiaWcyTW9kdWxlID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRKYmlnMk1vZHVsZSgpOworICAgIHBKYmlnMk1vZHVsZS0+RGVzdHJveUpiaWcyQ29udGV4dChtX3BKYmlnMkNvbnRleHQpOworICB9CisgIGRlbGV0ZSBtX3BHbG9iYWxTdHJlYW07Cit9CitDRlhfRElCaXRtYXAqIENQREZfRElCU291cmNlOjpHZXRCaXRtYXAoKSBjb25zdCB7CisgIHJldHVybiBtX3BDYWNoZWRCaXRtYXAgPyBtX3BDYWNoZWRCaXRtYXAuZ2V0KCkgOiBDbG9uZSgpOworfQordm9pZCBDUERGX0RJQlNvdXJjZTo6UmVsZWFzZUJpdG1hcChDRlhfRElCaXRtYXAqIHBCaXRtYXApIGNvbnN0IHsKKyAgaWYgKHBCaXRtYXAgJiYgcEJpdG1hcCAhPSBtX3BDYWNoZWRCaXRtYXAuZ2V0KCkpIHsKKyAgICBkZWxldGUgcEJpdG1hcDsKKyAgfQorfQorRlhfQk9PTCBDUERGX0RJQlNvdXJjZTo6TG9hZChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9ESUJTb3VyY2UqKiBwcE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwTWF0dGVDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIEdyb3VwRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJMb2FkTWFzaykgeworICBpZiAoIXBTdHJlYW0pIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9wRG9jdW1lbnQgPSBwRG9jOworICBtX3BEaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOworICBpZiAoIW1fcERpY3QpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9wU3RyZWFtID0gcFN0cmVhbTsKKyAgbV9XaWR0aCA9IG1fcERpY3QtPkdldEludGVnZXIoIldpZHRoIik7CisgIG1fSGVpZ2h0ID0gbV9wRGljdC0+R2V0SW50ZWdlcigiSGVpZ2h0Iik7CisgIGlmIChtX1dpZHRoIDw9IDAgfHwgbV9IZWlnaHQgPD0gMCB8fCBtX1dpZHRoID4ga01heEltYWdlRGltZW5zaW9uIHx8CisgICAgICBtX0hlaWdodCA+IGtNYXhJbWFnZURpbWVuc2lvbikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX0dyb3VwRmFtaWx5ID0gR3JvdXBGYW1pbHk7CisgIG1fYkxvYWRNYXNrID0gYkxvYWRNYXNrOworICBpZiAoIUxvYWRDb2xvckluZm8obV9wU3RyZWFtLT5HZXRPYmpOdW0oKSAhPSAwID8gTlVMTCA6IHBGb3JtUmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgcFBhZ2VSZXNvdXJjZXMpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX2JEb0JwY0NoZWNrICYmIChtX2JwYyA9PSAwIHx8IG1fbkNvbXBvbmVudHMgPT0gMCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhfU0FGRV9EV09SRCBzcmNfc2l6ZSA9CisgICAgICBDYWxjdWxhdGVQaXRjaDgobV9icGMsIG1fbkNvbXBvbmVudHMsIG1fV2lkdGgpICogbV9IZWlnaHQ7CisgIGlmICghc3JjX3NpemUuSXNWYWxpZCgpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fcFN0cmVhbUFjYyA9IG5ldyBDUERGX1N0cmVhbUFjYzsKKyAgbV9wU3RyZWFtQWNjLT5Mb2FkQWxsRGF0YShwU3RyZWFtLCBGQUxTRSwgc3JjX3NpemUuVmFsdWVPckRpZSgpLCBUUlVFKTsKKyAgaWYgKG1fcFN0cmVhbUFjYy0+R2V0U2l6ZSgpID09IDAgfHwgIW1fcFN0cmVhbUFjYy0+R2V0RGF0YSgpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghQ3JlYXRlRGVjb2RlcigpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX2JJbWFnZU1hc2spIHsKKyAgICBtX2JwcCA9IDE7CisgICAgbV9icGMgPSAxOworICAgIG1fbkNvbXBvbmVudHMgPSAxOworICAgIG1fQWxwaGFGbGFnID0gMTsKKyAgfSBlbHNlIGlmIChtX2JwYyAqIG1fbkNvbXBvbmVudHMgPT0gMSkgeworICAgIG1fYnBwID0gMTsKKyAgfSBlbHNlIGlmIChtX2JwYyAqIG1fbkNvbXBvbmVudHMgPD0gOCkgeworICAgIG1fYnBwID0gODsKKyAgfSBlbHNlIHsKKyAgICBtX2JwcCA9IDI0OworICB9CisgIEZYX1NBRkVfRFdPUkQgcGl0Y2ggPSBDYWxjdWxhdGVQaXRjaDMyKG1fYnBwLCBtX1dpZHRoKTsKKyAgaWYgKCFwaXRjaC5Jc1ZhbGlkKCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9wTGluZUJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHBpdGNoLlZhbHVlT3JEaWUoKSk7CisgIGlmIChtX3BDb2xvclNwYWNlICYmIGJTdGRDUykgeworICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24oVFJVRSk7CisgIH0KKyAgTG9hZFBhbGV0dGUoKTsKKyAgaWYgKG1fYkNvbG9yS2V5KSB7CisgICAgbV9icHAgPSAzMjsKKyAgICBtX0FscGhhRmxhZyA9IDI7CisgICAgcGl0Y2ggPSBDYWxjdWxhdGVQaXRjaDMyKG1fYnBwLCBtX1dpZHRoKTsKICAgICBpZiAoIXBpdGNoLklzVmFsaWQoKSkgewotICAgICAgICByZXR1cm4gMDsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgbV9wTGluZUJ1ZiA9IEZYX0FsbG9jKEZYX0JZVEUsIHBpdGNoLlZhbHVlT3JEaWUoKSk7Ci0gICAgaWYgKG1fcENvbG9yU3BhY2UgJiYgbV9iU3RkQ1MpIHsKLSAgICAgICAgbV9wQ29sb3JTcGFjZS0+RW5hYmxlU3RkQ29udmVyc2lvbihUUlVFKTsKLSAgICB9Ci0gICAgTG9hZFBhbGV0dGUoKTsKLSAgICBpZiAobV9iQ29sb3JLZXkpIHsKLSAgICAgICAgbV9icHAgPSAzMjsKLSAgICAgICAgbV9BbHBoYUZsYWcgPSAyOwotICAgICAgICBwaXRjaCA9IENhbGN1bGF0ZVBpdGNoMzIobV9icHAsIG1fV2lkdGgpOwotICAgICAgICBpZiAoIXBpdGNoLklzVmFsaWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wTWFza2VkTGluZSA9IEZYX0FsbG9jKEZYX0JZVEUsIHBpdGNoLlZhbHVlT3JEaWUoKSk7Ci0gICAgfQotICAgIG1fUGl0Y2ggPSBwaXRjaC5WYWx1ZU9yRGllKCk7Ci0gICAgcmV0dXJuIDE7CisgICAgbV9wTWFza2VkTGluZSA9IEZYX0FsbG9jKHVpbnQ4X3QsIHBpdGNoLlZhbHVlT3JEaWUoKSk7CisgIH0KKyAgbV9QaXRjaCA9IHBpdGNoLlZhbHVlT3JEaWUoKTsKKyAgaWYgKHBwTWFzaykgeworICAgICpwcE1hc2sgPSBMb2FkTWFzaygqcE1hdHRlQ29sb3IpOworICB9CisgIGlmIChtX3BDb2xvclNwYWNlICYmIGJTdGRDUykgeworICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24oRkFMU0UpOworICB9CisgIHJldHVybiBUUlVFOwogfQotaW50CUNQREZfRElCU291cmNlOjpTdGFydExvYWRESUJTb3VyY2UoQ1BERl9Eb2N1bWVudCogcERvYywgY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0sIEZYX0JPT0wgYkhhc01hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2VzLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBGWF9CT09MIGJMb2FkTWFzaykKLXsKLSAgICBpZiAocFN0cmVhbSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOworaW50IENQREZfRElCU291cmNlOjpDb250aW51ZVRvTG9hZE1hc2soKSB7CisgIGlmIChtX2JJbWFnZU1hc2spIHsKKyAgICBtX2JwcCA9IDE7CisgICAgbV9icGMgPSAxOworICAgIG1fbkNvbXBvbmVudHMgPSAxOworICAgIG1fQWxwaGFGbGFnID0gMTsKKyAgfSBlbHNlIGlmIChtX2JwYyAqIG1fbkNvbXBvbmVudHMgPT0gMSkgeworICAgIG1fYnBwID0gMTsKKyAgfSBlbHNlIGlmIChtX2JwYyAqIG1fbkNvbXBvbmVudHMgPD0gOCkgeworICAgIG1fYnBwID0gODsKKyAgfSBlbHNlIHsKKyAgICBtX2JwcCA9IDI0OworICB9CisgIGlmICghbV9icGMgfHwgIW1fbkNvbXBvbmVudHMpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBGWF9TQUZFX0RXT1JEIHBpdGNoID0gQ2FsY3VsYXRlUGl0Y2gzMihtX2JwcCwgbV9XaWR0aCk7CisgIGlmICghcGl0Y2guSXNWYWxpZCgpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgbV9wTGluZUJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHBpdGNoLlZhbHVlT3JEaWUoKSk7CisgIGlmIChtX3BDb2xvclNwYWNlICYmIG1fYlN0ZENTKSB7CisgICAgbV9wQ29sb3JTcGFjZS0+RW5hYmxlU3RkQ29udmVyc2lvbihUUlVFKTsKKyAgfQorICBMb2FkUGFsZXR0ZSgpOworICBpZiAobV9iQ29sb3JLZXkpIHsKKyAgICBtX2JwcCA9IDMyOworICAgIG1fQWxwaGFGbGFnID0gMjsKKyAgICBwaXRjaCA9IENhbGN1bGF0ZVBpdGNoMzIobV9icHAsIG1fV2lkdGgpOworICAgIGlmICghcGl0Y2guSXNWYWxpZCgpKSB7CisgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgbV9wRG9jdW1lbnQgPSBwRG9jOwotICAgIG1fcERpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7Ci0gICAgbV9wU3RyZWFtID0gcFN0cmVhbTsKLSAgICBtX2JTdGRDUyA9IGJTdGRDUzsKLSAgICBtX2JIYXNNYXNrID0gYkhhc01hc2s7Ci0gICAgbV9XaWR0aCA9IG1fcERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIldpZHRoIikpOwotICAgIG1fSGVpZ2h0ID0gbV9wRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiSGVpZ2h0IikpOwotICAgIGlmIChtX1dpZHRoIDw9IDAgfHwgbV9IZWlnaHQgPD0gMCB8fCBtX1dpZHRoID4gMHgwMWZmZmYgfHwgbV9IZWlnaHQgPiAweDAxZmZmZikgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgbV9Hcm91cEZhbWlseSA9IEdyb3VwRmFtaWx5OwotICAgIG1fYkxvYWRNYXNrID0gYkxvYWRNYXNrOwotICAgIGlmICghTG9hZENvbG9ySW5mbyhtX3BTdHJlYW0tPkdldE9iak51bSgpICE9IDAgPyBOVUxMIDogcEZvcm1SZXNvdXJjZXMsIHBQYWdlUmVzb3VyY2VzKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKG1fYkRvQnBjQ2hlY2sgJiYgKG1fYnBjID09IDAgfHwgbV9uQ29tcG9uZW50cyA9PSAwKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgRlhfU0FGRV9EV09SRCBzcmNfcGl0Y2ggPQotICAgICAgICBDYWxjdWxhdGVQaXRjaDgobV9icGMsIG1fbkNvbXBvbmVudHMsIG1fV2lkdGgsIG1fSGVpZ2h0KTsKLSAgICBpZiAoIXNyY19waXRjaC5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIG1fcFN0cmVhbUFjYyA9IG5ldyBDUERGX1N0cmVhbUFjYzsKLSAgICBtX3BTdHJlYW1BY2MtPkxvYWRBbGxEYXRhKHBTdHJlYW0sIEZBTFNFLCBzcmNfcGl0Y2guVmFsdWVPckRpZSgpLCBUUlVFKTsKLSAgICBpZiAobV9wU3RyZWFtQWNjLT5HZXRTaXplKCkgPT0gMCB8fCBtX3BTdHJlYW1BY2MtPkdldERhdGEoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpbnQgcmV0ID0gQ3JlYXRlRGVjb2RlcigpOwotICAgIGlmIChyZXQgIT0gMSkgewotICAgICAgICBpZiAoIXJldCkgewotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIUNvbnRpbnVlVG9Mb2FkTWFzaygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9iSGFzTWFzaykgewotICAgICAgICAgICAgU3RyYXRMb2FkTWFzaygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7CisgICAgbV9wTWFza2VkTGluZSA9IEZYX0FsbG9jKHVpbnQ4X3QsIHBpdGNoLlZhbHVlT3JEaWUoKSk7CisgIH0KKyAgbV9QaXRjaCA9IHBpdGNoLlZhbHVlT3JEaWUoKTsKKyAgcmV0dXJuIDE7Cit9CitpbnQgQ1BERl9ESUJTb3VyY2U6OlN0YXJ0TG9hZERJQlNvdXJjZShDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJIYXNNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIEdyb3VwRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTG9hZE1hc2spIHsKKyAgaWYgKCFwU3RyZWFtKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgbV9wRG9jdW1lbnQgPSBwRG9jOworICBtX3BEaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOworICBtX3BTdHJlYW0gPSBwU3RyZWFtOworICBtX2JTdGRDUyA9IGJTdGRDUzsKKyAgbV9iSGFzTWFzayA9IGJIYXNNYXNrOworICBtX1dpZHRoID0gbV9wRGljdC0+R2V0SW50ZWdlcigiV2lkdGgiKTsKKyAgbV9IZWlnaHQgPSBtX3BEaWN0LT5HZXRJbnRlZ2VyKCJIZWlnaHQiKTsKKyAgaWYgKG1fV2lkdGggPD0gMCB8fCBtX0hlaWdodCA8PSAwIHx8IG1fV2lkdGggPiBrTWF4SW1hZ2VEaW1lbnNpb24gfHwKKyAgICAgIG1fSGVpZ2h0ID4ga01heEltYWdlRGltZW5zaW9uKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgbV9Hcm91cEZhbWlseSA9IEdyb3VwRmFtaWx5OworICBtX2JMb2FkTWFzayA9IGJMb2FkTWFzazsKKyAgaWYgKCFMb2FkQ29sb3JJbmZvKG1fcFN0cmVhbS0+R2V0T2JqTnVtKCkgIT0gMCA/IE5VTEwgOiBwRm9ybVJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgIHBQYWdlUmVzb3VyY2VzKSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChtX2JEb0JwY0NoZWNrICYmIChtX2JwYyA9PSAwIHx8IG1fbkNvbXBvbmVudHMgPT0gMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBGWF9TQUZFX0RXT1JEIHNyY19zaXplID0KKyAgICAgIENhbGN1bGF0ZVBpdGNoOChtX2JwYywgbV9uQ29tcG9uZW50cywgbV9XaWR0aCkgKiBtX0hlaWdodDsKKyAgaWYgKCFzcmNfc2l6ZS5Jc1ZhbGlkKCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBtX3BTdHJlYW1BY2MgPSBuZXcgQ1BERl9TdHJlYW1BY2M7CisgIG1fcFN0cmVhbUFjYy0+TG9hZEFsbERhdGEocFN0cmVhbSwgRkFMU0UsIHNyY19zaXplLlZhbHVlT3JEaWUoKSwgVFJVRSk7CisgIGlmIChtX3BTdHJlYW1BY2MtPkdldFNpemUoKSA9PSAwIHx8ICFtX3BTdHJlYW1BY2MtPkdldERhdGEoKSkgeworICAgIHJldHVybiAwOworICB9CisgIGludCByZXQgPSBDcmVhdGVEZWNvZGVyKCk7CisgIGlmIChyZXQgIT0gMSkgeworICAgIGlmICghcmV0KSB7CisgICAgICByZXR1cm4gcmV0OwogICAgIH0KICAgICBpZiAoIUNvbnRpbnVlVG9Mb2FkTWFzaygpKSB7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGlmIChtX2JIYXNNYXNrKSB7Ci0gICAgICAgIHJldCA9IFN0cmF0TG9hZE1hc2soKTsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAyKSB7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGlmIChtX3BDb2xvclNwYWNlICYmIG1fYlN0ZENTKSB7Ci0gICAgICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24oRkFMU0UpOworICAgICAgU3RyYXRMb2FkTWFzaygpOwogICAgIH0KICAgICByZXR1cm4gcmV0OwotfQotaW50CUNQREZfRElCU291cmNlOjpDb250aW51ZUxvYWRESUJTb3VyY2UoSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgRlhDT0RFQ19TVEFUVVMgcmV0OwotICAgIGlmIChtX1N0YXR1cyA9PSAxKSB7Ci0gICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBkZWNvZGVyID0gbV9wU3RyZWFtQWNjLT5HZXRJbWFnZURlY29kZXIoKTsKLSAgICAgICAgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIkpQWERlY29kZSIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBJQ29kZWNfSmJpZzJNb2R1bGUqIHBKYmlnMk1vZHVsZSA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SmJpZzJNb2R1bGUoKTsKLSAgICAgICAgaWYgKG1fcEpiaWcyQ29udGV4dCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtX3BKYmlnMkNvbnRleHQgPSBwSmJpZzJNb2R1bGUtPkNyZWF0ZUpiaWcyQ29udGV4dCgpOwotICAgICAgICAgICAgaWYgKG1fcFN0cmVhbUFjYy0+R2V0SW1hZ2VQYXJhbSgpKSB7Ci0gICAgICAgICAgICAgICAgQ1BERl9TdHJlYW0qIHBHbG9iYWxzID0gbV9wU3RyZWFtQWNjLT5HZXRJbWFnZVBhcmFtKCktPkdldFN0cmVhbShGWF9CU1RSQygiSkJJRzJHbG9iYWxzIikpOwotICAgICAgICAgICAgICAgIGlmIChwR2xvYmFscykgewotICAgICAgICAgICAgICAgICAgICBtX3BHbG9iYWxTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW1BY2M7Ci0gICAgICAgICAgICAgICAgICAgIG1fcEdsb2JhbFN0cmVhbS0+TG9hZEFsbERhdGEocEdsb2JhbHMsIEZBTFNFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXQgPSBwSmJpZzJNb2R1bGUtPlN0YXJ0RGVjb2RlKG1fcEpiaWcyQ29udGV4dCwgbV9XaWR0aCwgbV9IZWlnaHQsIG1fcFN0cmVhbUFjYy0+R2V0RGF0YSgpLCBtX3BTdHJlYW1BY2MtPkdldFNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wR2xvYmFsU3RyZWFtID8gbV9wR2xvYmFsU3RyZWFtLT5HZXREYXRhKCkgOiBOVUxMLCBtX3BHbG9iYWxTdHJlYW0gPyBtX3BHbG9iYWxTdHJlYW0tPkdldFNpemUoKSA6IDAsIG1fcENhY2hlZEJpdG1hcC0+R2V0QnVmZmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcENhY2hlZEJpdG1hcC0+R2V0UGl0Y2goKSwgcFBhdXNlKTsKLSAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIG1fcENhY2hlZEJpdG1hcDsKLSAgICAgICAgICAgICAgICBtX3BDYWNoZWRCaXRtYXAgPSBOVUxMOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBtX3BHbG9iYWxTdHJlYW07Ci0gICAgICAgICAgICAgICAgbV9wR2xvYmFsU3RyZWFtID0gTlVMTDsKLSAgICAgICAgICAgICAgICBwSmJpZzJNb2R1bGUtPkRlc3Ryb3lKYmlnMkNvbnRleHQobV9wSmJpZzJDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBtX3BKYmlnMkNvbnRleHQgPSBOVUxMOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJldCA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgcmV0MSA9IDE7Ci0gICAgICAgICAgICBpZiAobV9iSGFzTWFzaykgewotICAgICAgICAgICAgICAgIHJldDEgPSBDb250aW51ZUxvYWRNYXNrRElCKHBQYXVzZSk7Ci0gICAgICAgICAgICAgICAgbV9TdGF0dXMgPSAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJldDEgPT0gMikgewotICAgICAgICAgICAgICAgIHJldHVybiByZXQxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1fcENvbG9yU3BhY2UgJiYgbV9iU3RkQ1MpIHsKLSAgICAgICAgICAgICAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKEZBTFNFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXQxOwotICAgICAgICB9Ci0gICAgICAgIEZYQ09ERUNfU1RBVFVTIHJldCA9IHBKYmlnMk1vZHVsZS0+Q29udGludWVEZWNvZGUobV9wSmJpZzJDb250ZXh0LCBwUGF1c2UpOwotICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgZGVsZXRlIG1fcENhY2hlZEJpdG1hcDsKLSAgICAgICAgICAgIG1fcENhY2hlZEJpdG1hcCA9IE5VTEw7Ci0gICAgICAgICAgICBkZWxldGUgbV9wR2xvYmFsU3RyZWFtOwotICAgICAgICAgICAgbV9wR2xvYmFsU3RyZWFtID0gTlVMTDsKLSAgICAgICAgICAgIHBKYmlnMk1vZHVsZS0+RGVzdHJveUpiaWcyQ29udGV4dChtX3BKYmlnMkNvbnRleHQpOwotICAgICAgICAgICAgbV9wSmJpZzJDb250ZXh0ID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXQgPT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRSkgewotICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHJldDEgPSAxOwotICAgICAgICBpZiAobV9iSGFzTWFzaykgewotICAgICAgICAgICAgcmV0MSA9IENvbnRpbnVlTG9hZE1hc2tESUIocFBhdXNlKTsKLSAgICAgICAgICAgIG1fU3RhdHVzID0gMjsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0MSA9PSAyKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmV0MTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9wQ29sb3JTcGFjZSAmJiBtX2JTdGRDUykgewotICAgICAgICAgICAgbV9wQ29sb3JTcGFjZS0+RW5hYmxlU3RkQ29udmVyc2lvbihGQUxTRSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDE7Ci0gICAgfSBlbHNlIGlmIChtX1N0YXR1cyA9PSAyKSB7Ci0gICAgICAgIHJldHVybiBDb250aW51ZUxvYWRNYXNrRElCKHBQYXVzZSk7Ci0gICAgfQorICB9CisgIGlmICghQ29udGludWVUb0xvYWRNYXNrKCkpIHsKICAgICByZXR1cm4gMDsKKyAgfQorICBpZiAobV9iSGFzTWFzaykgeworICAgIHJldCA9IFN0cmF0TG9hZE1hc2soKTsKKyAgfQorICBpZiAocmV0ID09IDIpIHsKKyAgICByZXR1cm4gcmV0OworICB9CisgIGlmIChtX3BDb2xvclNwYWNlICYmIG1fYlN0ZENTKSB7CisgICAgbV9wQ29sb3JTcGFjZS0+RW5hYmxlU3RkQ29udmVyc2lvbihGQUxTRSk7CisgIH0KKyAgcmV0dXJuIHJldDsKIH0KLUZYX0JPT0wgQ1BERl9ESUJTb3VyY2U6OkxvYWRDb2xvckluZm8oQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcykKLXsKLSAgICBtX2JwY19vcmlnID0gbV9wRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiQml0c1BlckNvbXBvbmVudCIpKTsKLSAgICBpZiAobV9wRGljdC0+R2V0SW50ZWdlcigiSW1hZ2VNYXNrIikpIHsKLSAgICAgICAgbV9iSW1hZ2VNYXNrID0gVFJVRTsKLSAgICB9Ci0gICAgaWYgKG1fYkltYWdlTWFzayB8fCAhbV9wRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIkNvbG9yU3BhY2UiKSkpIHsKLSAgICAgICAgaWYgKCFtX2JJbWFnZU1hc2spIHsKLSAgICAgICAgICAgIENQREZfT2JqZWN0KiBwRmlsdGVyID0gbV9wRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJGaWx0ZXIiKSk7Ci0gICAgICAgICAgICBpZiAocEZpbHRlcikgewotICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGZpbHRlcjsKLSAgICAgICAgICAgICAgICBpZiAocEZpbHRlci0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IHBGaWx0ZXItPkdldFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyID09IEZYX0JTVFJDKCJKUFhEZWNvZGUiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9iRG9CcGNDaGVjayA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBGaWx0ZXItPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBGaWx0ZXI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwQXJyYXktPkdldFN0cmluZyhwQXJyYXktPkdldENvdW50KCkgLSAxKSA9PSBGWF9CU1RSQygiSlBYRGVjb2RlIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fYkRvQnBjQ2hlY2sgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1fYkltYWdlTWFzayA9IFRSVUU7Ci0gICAgICAgIG1fYnBjID0gbV9uQ29tcG9uZW50cyA9IDE7Ci0gICAgICAgIENQREZfQXJyYXkqIHBEZWNvZGUgPSBtX3BEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRGVjb2RlIikpOwotICAgICAgICBtX2JEZWZhdWx0RGVjb2RlID0gcERlY29kZSA9PSBOVUxMIHx8IHBEZWNvZGUtPkdldEludGVnZXIoMCkgPT0gMDsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwQ1NPYmogPSBtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkNvbG9yU3BhY2UiKSk7Ci0gICAgaWYgKHBDU09iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ1BERl9Eb2NQYWdlRGF0YSogcERvY1BhZ2VEYXRhID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCk7Ci0gICAgaWYgKHBGb3JtUmVzb3VyY2VzKSB7Ci0gICAgICAgIG1fcENvbG9yU3BhY2UgPSBwRG9jUGFnZURhdGEtPkdldENvbG9yU3BhY2UocENTT2JqLCBwRm9ybVJlc291cmNlcyk7Ci0gICAgfQotICAgIGlmIChtX3BDb2xvclNwYWNlID09IE5VTEwpIHsKLSAgICAgICAgbV9wQ29sb3JTcGFjZSA9IHBEb2NQYWdlRGF0YS0+R2V0Q29sb3JTcGFjZShwQ1NPYmosIHBQYWdlUmVzb3VyY2VzKTsKLSAgICB9Ci0gICAgaWYgKG1fcENvbG9yU3BhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fRmFtaWx5ID0gbV9wQ29sb3JTcGFjZS0+R2V0RmFtaWx5KCk7Ci0gICAgbV9uQ29tcG9uZW50cyA9IG1fcENvbG9yU3BhY2UtPkNvdW50Q29tcG9uZW50cygpOwotICAgIGlmIChtX0ZhbWlseSA9PSBQREZDU19JQ0NCQVNFRCAmJiBwQ1NPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfTkFNRSkgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBjcyA9IHBDU09iai0+R2V0U3RyaW5nKCk7Ci0gICAgICAgIGlmIChjcyA9PSBGWF9CU1RSQygiRGV2aWNlR3JheSIpKSB7Ci0gICAgICAgICAgICBtX25Db21wb25lbnRzID0gMTsKLSAgICAgICAgfSBlbHNlIGlmIChjcyA9PSBGWF9CU1RSQygiRGV2aWNlUkdCIikpIHsKLSAgICAgICAgICAgIG1fbkNvbXBvbmVudHMgPSAzOwotICAgICAgICB9IGVsc2UgaWYgKGNzID09IEZYX0JTVFJDKCJEZXZpY2VDTVlLIikpIHsKLSAgICAgICAgICAgIG1fbkNvbXBvbmVudHMgPSA0OwotICAgICAgICB9Ci0gICAgfQotICAgIFZhbGlkYXRlRGljdFBhcmFtKCk7Ci0gICAgbV9wQ29tcERhdGEgPSBHZXREZWNvZGVBbmRNYXNrQXJyYXkobV9iRGVmYXVsdERlY29kZSwgbV9iQ29sb3JLZXkpOwotICAgIGlmIChtX3BDb21wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1ESUJfQ09NUF9EQVRBKiBDUERGX0RJQlNvdXJjZTo6R2V0RGVjb2RlQW5kTWFza0FycmF5KEZYX0JPT0wmIGJEZWZhdWx0RGVjb2RlLCBGWF9CT09MJiBiQ29sb3JLZXkpCi17Ci0gICAgaWYgKG1fcENvbG9yU3BhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgRElCX0NPTVBfREFUQSogcENvbXBEYXRhID0gRlhfQWxsb2MoRElCX0NPTVBfREFUQSwgbV9uQ29tcG9uZW50cyk7Ci0gICAgaW50IG1heF9kYXRhID0gKDEgPDwgbV9icGMpIC0gMTsKLSAgICBDUERGX0FycmF5KiBwRGVjb2RlID0gbV9wRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkRlY29kZSIpKTsKLSAgICBpZiAocERlY29kZSkgewotICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgbV9uQ29tcG9uZW50czsgaSArKykgewotICAgICAgICAgICAgcENvbXBEYXRhW2ldLm1fRGVjb2RlTWluID0gcERlY29kZS0+R2V0TnVtYmVyKGkgKiAyKTsKLSAgICAgICAgICAgIEZYX0ZMT0FUIG1heCA9IHBEZWNvZGUtPkdldE51bWJlcihpICogMiArIDEpOwotICAgICAgICAgICAgcENvbXBEYXRhW2ldLm1fRGVjb2RlU3RlcCA9IChtYXggLSBwQ29tcERhdGFbaV0ubV9EZWNvZGVNaW4pIC8gbWF4X2RhdGE7Ci0gICAgICAgICAgICBGWF9GTE9BVCBkZWZfdmFsdWUsIGRlZl9taW4sIGRlZl9tYXg7Ci0gICAgICAgICAgICBtX3BDb2xvclNwYWNlLT5HZXREZWZhdWx0VmFsdWUoaSwgZGVmX3ZhbHVlLCBkZWZfbWluLCBkZWZfbWF4KTsKLSAgICAgICAgICAgIGlmIChtX0ZhbWlseSA9PSBQREZDU19JTkRFWEVEKSB7Ci0gICAgICAgICAgICAgICAgZGVmX21heCA9IChGWF9GTE9BVCltYXhfZGF0YTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkZWZfbWluICE9IHBDb21wRGF0YVtpXS5tX0RlY29kZU1pbiB8fCBkZWZfbWF4ICE9IG1heCkgewotICAgICAgICAgICAgICAgIGJEZWZhdWx0RGVjb2RlID0gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgbV9uQ29tcG9uZW50czsgaSArKykgewotICAgICAgICAgICAgRlhfRkxPQVQgZGVmX3ZhbHVlOwotICAgICAgICAgICAgbV9wQ29sb3JTcGFjZS0+R2V0RGVmYXVsdFZhbHVlKGksIGRlZl92YWx1ZSwgcENvbXBEYXRhW2ldLm1fRGVjb2RlTWluLCBwQ29tcERhdGFbaV0ubV9EZWNvZGVTdGVwKTsKLSAgICAgICAgICAgIGlmIChtX0ZhbWlseSA9PSBQREZDU19JTkRFWEVEKSB7Ci0gICAgICAgICAgICAgICAgcENvbXBEYXRhW2ldLm1fRGVjb2RlU3RlcCA9IChGWF9GTE9BVCltYXhfZGF0YTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDb21wRGF0YVtpXS5tX0RlY29kZVN0ZXAgPSAocENvbXBEYXRhW2ldLm1fRGVjb2RlU3RlcCAtIHBDb21wRGF0YVtpXS5tX0RlY29kZU1pbikgLyBtYXhfZGF0YTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIW1fcERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJTTWFzayIpKSkgewotICAgICAgICBDUERGX09iamVjdCogcE1hc2sgPSBtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIk1hc2siKSk7Ci0gICAgICAgIGlmIChwTWFzayA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gcENvbXBEYXRhOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwTWFzay0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBNYXNrOwotICAgICAgICAgICAgaWYgKHBBcnJheS0+R2V0Q291bnQoKSA+PSBtX25Db21wb25lbnRzICogMikgewotICAgICAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBtX25Db21wb25lbnRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG1pbl9udW0gPSBwQXJyYXktPkdldEludGVnZXIoaSAqIDIpOwotICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X251bSA9IHBBcnJheS0+R2V0SW50ZWdlcihpICogMiArIDEpOwotICAgICAgICAgICAgICAgICAgICBwQ29tcERhdGFbaV0ubV9Db2xvcktleU1pbiA9IEZYX01BWChtaW5fbnVtLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgcENvbXBEYXRhW2ldLm1fQ29sb3JLZXlNYXggPSBGWF9NSU4obWF4X251bSwgbWF4X2RhdGEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJDb2xvcktleSA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHBDb21wRGF0YTsKLX0KLUlDb2RlY19TY2FubGluZURlY29kZXIqIEZQREZBUElfQ3JlYXRlRmF4RGVjb2RlcihGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhcmFtcyk7Ci1JQ29kZWNfU2NhbmxpbmVEZWNvZGVyKiBGUERGQVBJX0NyZWF0ZUZsYXRlRGVjb2RlcihGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgIGludCBuQ29tcHMsIGludCBicGMsIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhcmFtcyk7Ci1pbnQgQ1BERl9ESUJTb3VyY2U6OkNyZWF0ZURlY29kZXIoKQoteworaW50IENQREZfRElCU291cmNlOjpDb250aW51ZUxvYWRESUJTb3VyY2UoSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgRlhDT0RFQ19TVEFUVVMgcmV0OworICBpZiAobV9TdGF0dXMgPT0gMSkgewogICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBkZWNvZGVyID0gbV9wU3RyZWFtQWNjLT5HZXRJbWFnZURlY29kZXIoKTsKLSAgICBpZiAoZGVjb2Rlci5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKGRlY29kZXIgPT0gIkpQWERlY29kZSIpIHsKKyAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBpZiAobV9iRG9CcGNDaGVjayAmJiBtX2JwYyA9PSAwKSB7CisgICAgSUNvZGVjX0piaWcyTW9kdWxlKiBwSmJpZzJNb2R1bGUgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpiaWcyTW9kdWxlKCk7CisgICAgaWYgKCFtX3BKYmlnMkNvbnRleHQpIHsKKyAgICAgIG1fcEpiaWcyQ29udGV4dCA9IHBKYmlnMk1vZHVsZS0+Q3JlYXRlSmJpZzJDb250ZXh0KCk7CisgICAgICBpZiAobV9wU3RyZWFtQWNjLT5HZXRJbWFnZVBhcmFtKCkpIHsKKyAgICAgICAgQ1BERl9TdHJlYW0qIHBHbG9iYWxzID0KKyAgICAgICAgICAgIG1fcFN0cmVhbUFjYy0+R2V0SW1hZ2VQYXJhbSgpLT5HZXRTdHJlYW0oIkpCSUcyR2xvYmFscyIpOworICAgICAgICBpZiAocEdsb2JhbHMpIHsKKyAgICAgICAgICBtX3BHbG9iYWxTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW1BY2M7CisgICAgICAgICAgbV9wR2xvYmFsU3RyZWFtLT5Mb2FkQWxsRGF0YShwR2xvYmFscywgRkFMU0UpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXQgPSBwSmJpZzJNb2R1bGUtPlN0YXJ0RGVjb2RlKG1fcEpiaWcyQ29udGV4dCwgbV9wRG9jdW1lbnQsIG1fV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fSGVpZ2h0LCBtX3BTdHJlYW1BY2MsIG1fcEdsb2JhbFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ2FjaGVkQml0bWFwLT5HZXRCdWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ2FjaGVkQml0bWFwLT5HZXRQaXRjaCgpLCBwUGF1c2UpOworICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgbV9wQ2FjaGVkQml0bWFwLnJlc2V0KCk7CisgICAgICAgIGRlbGV0ZSBtX3BHbG9iYWxTdHJlYW07CisgICAgICAgIG1fcEdsb2JhbFN0cmVhbSA9IE5VTEw7CisgICAgICAgIHBKYmlnMk1vZHVsZS0+RGVzdHJveUpiaWcyQ29udGV4dChtX3BKYmlnMkNvbnRleHQpOworICAgICAgICBtX3BKYmlnMkNvbnRleHQgPSBOVUxMOwogICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgRlhfTFBDQllURSBzcmNfZGF0YSA9IG1fcFN0cmVhbUFjYy0+R2V0RGF0YSgpOwotICAgIEZYX0RXT1JEIHNyY19zaXplID0gbV9wU3RyZWFtQWNjLT5HZXRTaXplKCk7Ci0gICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zID0gbV9wU3RyZWFtQWNjLT5HZXRJbWFnZVBhcmFtKCk7Ci0gICAgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIkNDSVRURmF4RGVjb2RlIikpIHsKLSAgICAgICAgbV9wRGVjb2RlciA9IEZQREZBUElfQ3JlYXRlRmF4RGVjb2RlcihzcmNfZGF0YSwgc3JjX3NpemUsIG1fV2lkdGgsIG1fSGVpZ2h0LCBwUGFyYW1zKTsKLSAgICB9IGVsc2UgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIkRDVERlY29kZSIpKSB7Ci0gICAgICAgIG1fcERlY29kZXIgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKS0+Q3JlYXRlRGVjb2RlcihzcmNfZGF0YSwgc3JjX3NpemUsIG1fV2lkdGgsIG1fSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgbV9uQ29tcG9uZW50cywgcFBhcmFtcyA/IHBQYXJhbXMtPkdldEludGVnZXIoRlhfQlNUUigiQ29sb3JUcmFuc2Zvcm0iKSwgMSkgOiAxKTsKLSAgICAgICAgaWYgKCFtX3BEZWNvZGVyKSB7Ci0gICAgICAgICAgICBGWF9CT09MIGJUcmFuc2Zvcm0gPSBGQUxTRTsKLSAgICAgICAgICAgIGludCBjb21wcywgYnBjOwotICAgICAgICAgICAgSUNvZGVjX0pwZWdNb2R1bGUqIHBKcGVnTW9kdWxlID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRKcGVnTW9kdWxlKCk7Ci0gICAgICAgICAgICBpZiAocEpwZWdNb2R1bGUtPkxvYWRJbmZvKHNyY19kYXRhLCBzcmNfc2l6ZSwgbV9XaWR0aCwgbV9IZWlnaHQsIGNvbXBzLCBicGMsIGJUcmFuc2Zvcm0pKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fbkNvbXBvbmVudHMgIT0gY29tcHMpIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfRnJlZShtX3BDb21wRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIG1fbkNvbXBvbmVudHMgPSBjb21wczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0xBQiAmJiBtX25Db21wb25lbnRzICE9IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcENvbXBEYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1fcENvbXBEYXRhID0gR2V0RGVjb2RlQW5kTWFza0FycmF5KG1fYkRlZmF1bHREZWNvZGUsIG1fYkNvbG9yS2V5KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fcENvbXBEYXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fYnBjID0gYnBjOwotICAgICAgICAgICAgICAgIG1fcERlY29kZXIgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKS0+Q3JlYXRlRGVjb2RlcihzcmNfZGF0YSwgc3JjX3NpemUsIG1fV2lkdGgsIG1fSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25Db21wb25lbnRzLCBiVHJhbnNmb3JtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiRmxhdGVEZWNvZGUiKSkgewotICAgICAgICBtX3BEZWNvZGVyID0gRlBERkFQSV9DcmVhdGVGbGF0ZURlY29kZXIoc3JjX2RhdGEsIHNyY19zaXplLCBtX1dpZHRoLCBtX0hlaWdodCwgbV9uQ29tcG9uZW50cywgbV9icGMsIHBQYXJhbXMpOwotICAgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSBGWF9CU1RSQygiSlBYRGVjb2RlIikpIHsKLSAgICAgICAgTG9hZEpweEJpdG1hcCgpOwotICAgICAgICByZXR1cm4gbV9wQ2FjaGVkQml0bWFwICE9IE5VTEwgPyAxIDogMDsKLSAgICB9IGVsc2UgaWYgKGRlY29kZXIgPT0gRlhfQlNUUkMoIkpCSUcyRGVjb2RlIikpIHsKLSAgICAgICAgbV9wQ2FjaGVkQml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsKLSAgICAgICAgaWYgKCFtX3BDYWNoZWRCaXRtYXAtPkNyZWF0ZShtX1dpZHRoLCBtX0hlaWdodCwgbV9iSW1hZ2VNYXNrID8gRlhESUJfMWJwcE1hc2sgOiBGWERJQl8xYnBwUmdiKSkgewotICAgICAgICAgICAgZGVsZXRlIG1fcENhY2hlZEJpdG1hcDsKLSAgICAgICAgICAgIG1fcENhY2hlZEJpdG1hcCA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBtX1N0YXR1cyA9IDE7CisgICAgICB9CisgICAgICBpZiAocmV0ID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsKICAgICAgICAgcmV0dXJuIDI7Ci0gICAgfSBlbHNlIGlmIChkZWNvZGVyID09IEZYX0JTVFJDKCJSdW5MZW5ndGhEZWNvZGUiKSkgewotICAgICAgICBtX3BEZWNvZGVyID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRCYXNpY01vZHVsZSgpLT5DcmVhdGVSdW5MZW5ndGhEZWNvZGVyKHNyY19kYXRhLCBzcmNfc2l6ZSwgbV9XaWR0aCwgbV9IZWlnaHQsIG1fbkNvbXBvbmVudHMsIG1fYnBjKTsKKyAgICAgIH0KKyAgICAgIGludCByZXQxID0gMTsKKyAgICAgIGlmIChtX2JIYXNNYXNrKSB7CisgICAgICAgIHJldDEgPSBDb250aW51ZUxvYWRNYXNrRElCKHBQYXVzZSk7CisgICAgICAgIG1fU3RhdHVzID0gMjsKKyAgICAgIH0KKyAgICAgIGlmIChyZXQxID09IDIpIHsKKyAgICAgICAgcmV0dXJuIHJldDE7CisgICAgICB9CisgICAgICBpZiAobV9wQ29sb3JTcGFjZSAmJiBtX2JTdGRDUykgeworICAgICAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKEZBTFNFKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXQxOwogICAgIH0KLSAgICBpZiAoIW1fcERlY29kZXIpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgRlhfU0FGRV9EV09SRCByZXF1ZXN0ZWRfcGl0Y2ggPQotICAgICAgICBDYWxjdWxhdGVQaXRjaDgobV9icGMsIG1fbkNvbXBvbmVudHMsIG1fV2lkdGgsIDEpOwotICAgIGlmICghcmVxdWVzdGVkX3BpdGNoLklzVmFsaWQoKSkgewotICAgICAgICByZXR1cm4gMDsKKyAgICBGWENPREVDX1NUQVRVUyByZXQgPSBwSmJpZzJNb2R1bGUtPkNvbnRpbnVlRGVjb2RlKG1fcEpiaWcyQ29udGV4dCwgcFBhdXNlKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgbV9wQ2FjaGVkQml0bWFwLnJlc2V0KCk7CisgICAgICBkZWxldGUgbV9wR2xvYmFsU3RyZWFtOworICAgICAgbV9wR2xvYmFsU3RyZWFtID0gTlVMTDsKKyAgICAgIHBKYmlnMk1vZHVsZS0+RGVzdHJveUpiaWcyQ29udGV4dChtX3BKYmlnMkNvbnRleHQpOworICAgICAgbV9wSmJpZzJDb250ZXh0ID0gTlVMTDsKKyAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBGWF9TQUZFX0RXT1JEIHByb3ZpZGVkX3BpdGNoID0gQ2FsY3VsYXRlUGl0Y2g4KG1fcERlY29kZXItPkdldEJQQygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGVjb2Rlci0+Q291bnRDb21wcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGVjb2Rlci0+R2V0V2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOwotICAgIGlmICghcHJvdmlkZWRfcGl0Y2guSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybiAwOworICAgIGlmIChyZXQgPT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRSkgeworICAgICAgcmV0dXJuIDI7CiAgICAgfQotICAgIGlmIChwcm92aWRlZF9waXRjaC5WYWx1ZU9yRGllKCkgPCByZXF1ZXN0ZWRfcGl0Y2guVmFsdWVPckRpZSgpKSB7Ci0gICAgICAgIHJldHVybiAwOworICAgIGludCByZXQxID0gMTsKKyAgICBpZiAobV9iSGFzTWFzaykgeworICAgICAgcmV0MSA9IENvbnRpbnVlTG9hZE1hc2tESUIocFBhdXNlKTsKKyAgICAgIG1fU3RhdHVzID0gMjsKICAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci12b2lkIENQREZfRElCU291cmNlOjpMb2FkSnB4Qml0bWFwKCkKLXsKLSAgICBJQ29kZWNfSnB4TW9kdWxlKiBwSnB4TW9kdWxlID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRKcHhNb2R1bGUoKTsKLSAgICBpZiAocEpweE1vZHVsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfTFBWT0lEIGN0eCA9IHBKcHhNb2R1bGUtPkNyZWF0ZURlY29kZXIobV9wU3RyZWFtQWNjLT5HZXREYXRhKCksIG1fcFN0cmVhbUFjYy0+R2V0U2l6ZSgpLCBtX3BDb2xvclNwYWNlICE9IE5VTEwpOwotICAgIGlmIChjdHggPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYX0RXT1JEIHdpZHRoID0gMCwgaGVpZ2h0ID0gMCwgY29kZXN0cmVhbV9uQ29tcHMgPSAwLCBpbWFnZV9uQ29tcHMgPSAwOwotICAgIHBKcHhNb2R1bGUtPkdldEltYWdlSW5mbyhjdHgsIHdpZHRoLCBoZWlnaHQsIGNvZGVzdHJlYW1fbkNvbXBzLCBpbWFnZV9uQ29tcHMpOwotICAgIGlmICgoaW50KXdpZHRoIDwgbV9XaWR0aCB8fCAoaW50KWhlaWdodCA8IG1fSGVpZ2h0KSB7Ci0gICAgICAgIHBKcHhNb2R1bGUtPkRlc3Ryb3lEZWNvZGVyKGN0eCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IG91dHB1dF9uQ29tcHM7Ci0gICAgRlhfQk9PTCBiVHJhbnNsYXRlQ29sb3IsIGJTd2FwUkdCID0gRkFMU0U7Ci0gICAgaWYgKG1fcENvbG9yU3BhY2UpIHsKLSAgICAgICAgaWYgKGNvZGVzdHJlYW1fbkNvbXBzICE9IChGWF9EV09SRCltX3BDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG91dHB1dF9uQ29tcHMgPSBjb2Rlc3RyZWFtX25Db21wczsKLSAgICAgICAgYlRyYW5zbGF0ZUNvbG9yID0gRkFMU0U7Ci0gICAgICAgIGlmIChtX3BDb2xvclNwYWNlID09IENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VSR0IpKSB7Ci0gICAgICAgICAgICBiU3dhcFJHQiA9IFRSVUU7Ci0gICAgICAgICAgICBtX3BDb2xvclNwYWNlID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJUcmFuc2xhdGVDb2xvciA9IFRSVUU7Ci0gICAgICAgIGlmIChpbWFnZV9uQ29tcHMpIHsKLSAgICAgICAgICAgIG91dHB1dF9uQ29tcHMgPSBpbWFnZV9uQ29tcHM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXRwdXRfbkNvbXBzID0gY29kZXN0cmVhbV9uQ29tcHM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG91dHB1dF9uQ29tcHMgPT0gMykgewotICAgICAgICAgICAgYlN3YXBSR0IgPSBUUlVFOwotICAgICAgICB9IGVsc2UgaWYgKG91dHB1dF9uQ29tcHMgPT0gNCkgewotICAgICAgICAgICAgbV9wQ29sb3JTcGFjZSA9IENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VDTVlLKTsKLSAgICAgICAgICAgIGJUcmFuc2xhdGVDb2xvciA9IEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIG1fbkNvbXBvbmVudHMgPSBvdXRwdXRfbkNvbXBzOwotICAgIH0KLSAgICBGWERJQl9Gb3JtYXQgZm9ybWF0OwotICAgIGlmIChvdXRwdXRfbkNvbXBzID09IDEpIHsKLSAgICAgICAgZm9ybWF0ID0gRlhESUJfOGJwcFJnYjsKLSAgICB9IGVsc2UgaWYgKG91dHB1dF9uQ29tcHMgPD0gMykgewotICAgICAgICBmb3JtYXQgPSBGWERJQl9SZ2I7Ci0gICAgfSBlbHNlIGlmIChvdXRwdXRfbkNvbXBzID09IDQpIHsKLSAgICAgICAgZm9ybWF0ID0gRlhESUJfUmdiMzI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgd2lkdGggPSAod2lkdGggKiBvdXRwdXRfbkNvbXBzICsgMikgLyAzOwotICAgICAgICBmb3JtYXQgPSBGWERJQl9SZ2I7Ci0gICAgfQotICAgIG1fcENhY2hlZEJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7Ci0gICAgaWYgKCFtX3BDYWNoZWRCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BDYWNoZWRCaXRtYXA7Ci0gICAgICAgIG1fcENhY2hlZEJpdG1hcCA9IE5VTEw7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wQ2FjaGVkQml0bWFwLT5DbGVhcigweEZGRkZGRkZGKTsKLSAgICBGWF9MUEJZVEUgb3V0cHV0X29mZnNldHMgPSBGWF9BbGxvYyhGWF9CWVRFLCBvdXRwdXRfbkNvbXBzKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG91dHB1dF9uQ29tcHM7IGkgKyspIHsKLSAgICAgICAgb3V0cHV0X29mZnNldHNbaV0gPSBpOwotICAgIH0KLSAgICBpZiAoYlN3YXBSR0IpIHsKLSAgICAgICAgb3V0cHV0X29mZnNldHNbMF0gPSAyOwotICAgICAgICBvdXRwdXRfb2Zmc2V0c1syXSA9IDA7Ci0gICAgfQotICAgIGlmICghcEpweE1vZHVsZS0+RGVjb2RlKGN0eCwgbV9wQ2FjaGVkQml0bWFwLT5HZXRCdWZmZXIoKSwgbV9wQ2FjaGVkQml0bWFwLT5HZXRQaXRjaCgpLCBiVHJhbnNsYXRlQ29sb3IsIG91dHB1dF9vZmZzZXRzKSkgewotICAgICAgICBkZWxldGUgbV9wQ2FjaGVkQml0bWFwOwotICAgICAgICBtX3BDYWNoZWRCaXRtYXAgPSBOVUxMOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYX0ZyZWUob3V0cHV0X29mZnNldHMpOwotICAgIHBKcHhNb2R1bGUtPkRlc3Ryb3lEZWNvZGVyKGN0eCk7Ci0gICAgaWYgKG1fcENvbG9yU3BhY2UgJiYgbV9wQ29sb3JTcGFjZS0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfSU5ERVhFRCAmJiBtX2JwYyA8IDgpIHsKLSAgICAgICAgaW50IHNjYWxlID0gOCAtIG1fYnBjOwotICAgICAgICBmb3IgKEZYX0RXT1JEIHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICBGWF9MUEJZVEUgc2NhbmxpbmUgPSAoRlhfTFBCWVRFKW1fcENhY2hlZEJpdG1hcC0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICpzY2FubGluZSA9ICgqc2NhbmxpbmUpID4+IHNjYWxlOwotICAgICAgICAgICAgICAgIHNjYW5saW5lKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9icGMgPSA4OwotfQotQ1BERl9ESUJTb3VyY2UqIENQREZfRElCU291cmNlOjpMb2FkTWFzayhGWF9EV09SRCYgTWF0dGVDb2xvcikKLXsKLSAgICBNYXR0ZUNvbG9yID0gMHhmZmZmZmZmZjsKLSAgICBDUERGX1N0cmVhbSogcFNvZnRNYXNrID0gbV9wRGljdC0+R2V0U3RyZWFtKEZYX0JTVFJDKCJTTWFzayIpKTsKLSAgICBpZiAocFNvZnRNYXNrKSB7Ci0gICAgICAgIENQREZfQXJyYXkqIHBNYXR0ZSA9IHBTb2Z0TWFzay0+R2V0RGljdCgpLT5HZXRBcnJheShGWF9CU1RSQygiTWF0dGUiKSk7Ci0gICAgICAgIGlmIChwTWF0dGUgIT0gTlVMTCAmJiBtX3BDb2xvclNwYWNlICYmIChGWF9EV09SRCltX3BDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKSA8PSBtX25Db21wb25lbnRzKSB7Ci0gICAgICAgICAgICBGWF9GTE9BVCogcENvbG9yID0gRlhfQWxsb2MoRlhfRkxPQVQsIG1fbkNvbXBvbmVudHMpOwotICAgICAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG1fbkNvbXBvbmVudHM7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBwQ29sb3JbaV0gPSBwTWF0dGUtPkdldEZsb2F0KGkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfRkxPQVQgUiwgRywgQjsKLSAgICAgICAgICAgIG1fcENvbG9yU3BhY2UtPkdldFJHQihwQ29sb3IsIFIsIEcsIEIpOwotICAgICAgICAgICAgRlhfRnJlZShwQ29sb3IpOwotICAgICAgICAgICAgTWF0dGVDb2xvciA9IEZYQVJHQl9NQUtFKDAsIEZYU1lTX3JvdW5kKFIgKiAyNTUpLCBGWFNZU19yb3VuZChHICogMjU1KSwgRlhTWVNfcm91bmQoQiAqIDI1NSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBMb2FkTWFza0RJQihwU29mdE1hc2spOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcE1hc2sgPSBtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIk1hc2siKSk7Ci0gICAgaWYgKHBNYXNrID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChwTWFzay0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pIHsKLSAgICAgICAgcmV0dXJuIExvYWRNYXNrRElCKChDUERGX1N0cmVhbSopcE1hc2spOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLWludAlDUERGX0RJQlNvdXJjZTo6U3RyYXRMb2FkTWFzaygpCi17Ci0gICAgbV9NYXR0ZUNvbG9yID0gMHhmZmZmZmZmZjsKLSAgICBtX3BNYXNrU3RyZWFtID0gbV9wRGljdC0+R2V0U3RyZWFtKEZYX0JTVFJDKCJTTWFzayIpKTsKLSAgICBpZiAobV9wTWFza1N0cmVhbSkgewotICAgICAgICBDUERGX0FycmF5KiBwTWF0dGUgPSBtX3BNYXNrU3RyZWFtLT5HZXREaWN0KCktPkdldEFycmF5KEZYX0JTVFJDKCJNYXR0ZSIpKTsKLSAgICAgICAgaWYgKHBNYXR0ZSAhPSBOVUxMICYmIG1fcENvbG9yU3BhY2UgJiYgKEZYX0RXT1JEKW1fcENvbG9yU3BhY2UtPkNvdW50Q29tcG9uZW50cygpIDw9IG1fbkNvbXBvbmVudHMpIHsKLSAgICAgICAgICAgIEZYX0ZMT0FUIFIsIEcsIEI7Ci0gICAgICAgICAgICBGWF9GTE9BVCogcENvbG9yID0gRlhfQWxsb2MoRlhfRkxPQVQsIG1fbkNvbXBvbmVudHMpOwotICAgICAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG1fbkNvbXBvbmVudHM7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBwQ29sb3JbaV0gPSBwTWF0dGUtPkdldEZsb2F0KGkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9wQ29sb3JTcGFjZS0+R2V0UkdCKHBDb2xvciwgUiwgRywgQik7Ci0gICAgICAgICAgICBGWF9GcmVlKHBDb2xvcik7Ci0gICAgICAgICAgICBtX01hdHRlQ29sb3IgPSBGWEFSR0JfTUFLRSgwLCBGWFNZU19yb3VuZChSICogMjU1KSwgRlhTWVNfcm91bmQoRyAqIDI1NSksIEZYU1lTX3JvdW5kKEIgKiAyNTUpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gU3RhcnRMb2FkTWFza0RJQigpOwotICAgIH0KLSAgICBtX3BNYXNrU3RyZWFtID0gbV9wRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJNYXNrIikpOwotICAgIGlmIChtX3BNYXNrU3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmIChtX3BNYXNrU3RyZWFtLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgewotICAgICAgICByZXR1cm4gU3RhcnRMb2FkTWFza0RJQigpOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLWludAlDUERGX0RJQlNvdXJjZTo6Q29udGludWVMb2FkTWFza0RJQihJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBpZiAobV9wTWFzayA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpbnQgcmV0ID0gbV9wTWFzay0+Q29udGludWVMb2FkRElCU291cmNlKHBQYXVzZSk7Ci0gICAgaWYgKHJldCA9PSAyKSB7Ci0gICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKHJldDEgPT0gMikgeworICAgICAgcmV0dXJuIHJldDE7CiAgICAgfQogICAgIGlmIChtX3BDb2xvclNwYWNlICYmIG1fYlN0ZENTKSB7Ci0gICAgICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24oRkFMU0UpOworICAgICAgbV9wQ29sb3JTcGFjZS0+RW5hYmxlU3RkQ29udmVyc2lvbihGQUxTRSk7CiAgICAgfQotICAgIGlmICghcmV0KSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BNYXNrOwotICAgICAgICBtX3BNYXNrID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIHJldDE7CisgIH0KKyAgaWYgKG1fU3RhdHVzID09IDIpIHsKKyAgICByZXR1cm4gQ29udGludWVMb2FkTWFza0RJQihwUGF1c2UpOworICB9CisgIHJldHVybiAwOwogfQotQ1BERl9ESUJTb3VyY2UqCUNQREZfRElCU291cmNlOjpEZXRhY2hNYXNrKCkKLXsKLSAgICBDUERGX0RJQlNvdXJjZSogcERJQlNvdXJjZSA9IG1fcE1hc2s7Ci0gICAgbV9wTWFzayA9IE5VTEw7Ci0gICAgcmV0dXJuIHBESUJTb3VyY2U7CisKK2Jvb2wgQ1BERl9ESUJTb3VyY2U6OkxvYWRDb2xvckluZm8oY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcykgeworICBtX2JwY19vcmlnID0gbV9wRGljdC0+R2V0SW50ZWdlcigiQml0c1BlckNvbXBvbmVudCIpOworICBpZiAobV9wRGljdC0+R2V0SW50ZWdlcigiSW1hZ2VNYXNrIikpCisgICAgbV9iSW1hZ2VNYXNrID0gVFJVRTsKKworICBpZiAobV9iSW1hZ2VNYXNrIHx8ICFtX3BEaWN0LT5LZXlFeGlzdCgiQ29sb3JTcGFjZSIpKSB7CisgICAgaWYgKCFtX2JJbWFnZU1hc2spIHsKKyAgICAgIENQREZfT2JqZWN0KiBwRmlsdGVyID0gbV9wRGljdC0+R2V0RWxlbWVudFZhbHVlKCJGaWx0ZXIiKTsKKyAgICAgIGlmIChwRmlsdGVyKSB7CisgICAgICAgIENGWF9CeXRlU3RyaW5nIGZpbHRlcjsKKyAgICAgICAgaWYgKHBGaWx0ZXItPklzTmFtZSgpKSB7CisgICAgICAgICAgZmlsdGVyID0gcEZpbHRlci0+R2V0U3RyaW5nKCk7CisgICAgICAgIH0gZWxzZSBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcEZpbHRlci0+QXNBcnJheSgpKSB7CisgICAgICAgICAgZmlsdGVyID0gcEFycmF5LT5HZXRTdHJpbmcocEFycmF5LT5HZXRDb3VudCgpIC0gMSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmlsdGVyID09ICJKUFhEZWNvZGUiKSB7CisgICAgICAgICAgbV9iRG9CcGNDaGVjayA9IEZBTFNFOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIG1fYkltYWdlTWFzayA9IFRSVUU7CisgICAgbV9icGMgPSBtX25Db21wb25lbnRzID0gMTsKKyAgICBDUERGX0FycmF5KiBwRGVjb2RlID0gbV9wRGljdC0+R2V0QXJyYXkoIkRlY29kZSIpOworICAgIG1fYkRlZmF1bHREZWNvZGUgPSAhcERlY29kZSB8fCAhcERlY29kZS0+R2V0SW50ZWdlcigwKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIENQREZfT2JqZWN0KiBwQ1NPYmogPSBtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoIkNvbG9yU3BhY2UiKTsKKyAgaWYgKCFwQ1NPYmopCisgICAgcmV0dXJuIGZhbHNlOworCisgIENQREZfRG9jUGFnZURhdGEqIHBEb2NQYWdlRGF0YSA9IG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpOworICBpZiAocEZvcm1SZXNvdXJjZXMpCisgICAgbV9wQ29sb3JTcGFjZSA9IHBEb2NQYWdlRGF0YS0+R2V0Q29sb3JTcGFjZShwQ1NPYmosIHBGb3JtUmVzb3VyY2VzKTsKKyAgaWYgKCFtX3BDb2xvclNwYWNlKQorICAgIG1fcENvbG9yU3BhY2UgPSBwRG9jUGFnZURhdGEtPkdldENvbG9yU3BhY2UocENTT2JqLCBwUGFnZVJlc291cmNlcyk7CisgIGlmICghbV9wQ29sb3JTcGFjZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbV9GYW1pbHkgPSBtX3BDb2xvclNwYWNlLT5HZXRGYW1pbHkoKTsKKyAgbV9uQ29tcG9uZW50cyA9IG1fcENvbG9yU3BhY2UtPkNvdW50Q29tcG9uZW50cygpOworICBpZiAobV9GYW1pbHkgPT0gUERGQ1NfSUNDQkFTRUQgJiYgcENTT2JqLT5Jc05hbWUoKSkgeworICAgIENGWF9CeXRlU3RyaW5nIGNzID0gcENTT2JqLT5HZXRTdHJpbmcoKTsKKyAgICBpZiAoY3MgPT0gIkRldmljZUdyYXkiKSB7CisgICAgICBtX25Db21wb25lbnRzID0gMTsKKyAgICB9IGVsc2UgaWYgKGNzID09ICJEZXZpY2VSR0IiKSB7CisgICAgICBtX25Db21wb25lbnRzID0gMzsKKyAgICB9IGVsc2UgaWYgKGNzID09ICJEZXZpY2VDTVlLIikgeworICAgICAgbV9uQ29tcG9uZW50cyA9IDQ7CisgICAgfQorICB9CisgIFZhbGlkYXRlRGljdFBhcmFtKCk7CisgIG1fcENvbXBEYXRhID0gR2V0RGVjb2RlQW5kTWFza0FycmF5KG1fYkRlZmF1bHREZWNvZGUsIG1fYkNvbG9yS2V5KTsKKyAgcmV0dXJuICEhbV9wQ29tcERhdGE7CiB9Ci1DUERGX0RJQlNvdXJjZSogQ1BERl9ESUJTb3VyY2U6OkxvYWRNYXNrRElCKENQREZfU3RyZWFtKiBwTWFzaykKLXsKLSAgICBDUERGX0RJQlNvdXJjZSogcE1hc2tTb3VyY2UgPSBuZXcgQ1BERl9ESUJTb3VyY2U7Ci0gICAgaWYgKCFwTWFza1NvdXJjZS0+TG9hZChtX3BEb2N1bWVudCwgcE1hc2ssIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIFRSVUUpKSB7Ci0gICAgICAgIGRlbGV0ZSBwTWFza1NvdXJjZTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBwTWFza1NvdXJjZTsKLX0KLWludCBDUERGX0RJQlNvdXJjZTo6U3RhcnRMb2FkTWFza0RJQigpCi17Ci0gICAgbV9wTWFzayA9IG5ldyBDUERGX0RJQlNvdXJjZTsKLSAgICBpbnQgcmV0ID0gbV9wTWFzay0+U3RhcnRMb2FkRElCU291cmNlKG1fcERvY3VtZW50LCAoQ1BERl9TdHJlYW0qKW1fcE1hc2tTdHJlYW0sIEZBTFNFLCBOVUxMLCBOVUxMLCBUUlVFKTsKLSAgICBpZiAocmV0ID09IDIpIHsKLSAgICAgICAgaWYgKG1fU3RhdHVzID09IDApIHsKLSAgICAgICAgICAgIG1fU3RhdHVzID0gMjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0gICAgaWYgKCFyZXQpIHsKLSAgICAgICAgZGVsZXRlIG1fcE1hc2s7Ci0gICAgICAgIG1fcE1hc2sgPSBOVUxMOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci12b2lkIENQREZfRElCU291cmNlOjpMb2FkUGFsZXR0ZSgpCi17Ci0gICAgaWYgKG1fYnBjID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobV9icGMgKiBtX25Db21wb25lbnRzID4gOCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtX3BDb2xvclNwYWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobV9icGMgKiBtX25Db21wb25lbnRzID09IDEpIHsKLSAgICAgICAgaWYgKG1fYkRlZmF1bHREZWNvZGUgJiYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRUdSQVkgfHwgbV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFUkdCKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX3BDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKSA+IDMpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBGWF9GTE9BVCBjb2xvcl92YWx1ZXNbM107Ci0gICAgICAgIGNvbG9yX3ZhbHVlc1swXSA9IG1fcENvbXBEYXRhWzBdLm1fRGVjb2RlTWluOwotICAgICAgICBjb2xvcl92YWx1ZXNbMV0gPSBjb2xvcl92YWx1ZXNbMl0gPSBjb2xvcl92YWx1ZXNbMF07Ci0gICAgICAgIEZYX0ZMT0FUIFI9MC4wZiwgRz0wLjBmLCBCPTAuMGY7Ci0gICAgICAgIG1fcENvbG9yU3BhY2UtPkdldFJHQihjb2xvcl92YWx1ZXMsIFIsIEcsIEIpOwotICAgICAgICBGWF9BUkdCIGFyZ2IwID0gQXJnYkVuY29kZSgyNTUsIEZYU1lTX3JvdW5kKFIgKiAyNTUpLCBGWFNZU19yb3VuZChHICogMjU1KSwgRlhTWVNfcm91bmQoQiAqIDI1NSkpOwotICAgICAgICBjb2xvcl92YWx1ZXNbMF0gKz0gbV9wQ29tcERhdGFbMF0ubV9EZWNvZGVTdGVwOwotICAgICAgICBjb2xvcl92YWx1ZXNbMV0gKz0gbV9wQ29tcERhdGFbMF0ubV9EZWNvZGVTdGVwOwotICAgICAgICBjb2xvcl92YWx1ZXNbMl0gKz0gbV9wQ29tcERhdGFbMF0ubV9EZWNvZGVTdGVwOwotICAgICAgICBtX3BDb2xvclNwYWNlLT5HZXRSR0IoY29sb3JfdmFsdWVzLCBSLCBHLCBCKTsKLSAgICAgICAgRlhfQVJHQiBhcmdiMSA9IEFyZ2JFbmNvZGUoMjU1LCBGWFNZU19yb3VuZChSICogMjU1KSwgRlhTWVNfcm91bmQoRyAqIDI1NSksIEZYU1lTX3JvdW5kKEIgKiAyNTUpKTsKLSAgICAgICAgaWYgKGFyZ2IwICE9IDB4RkYwMDAwMDAgfHwgYXJnYjEgIT0gMHhGRkZGRkZGRikgewotICAgICAgICAgICAgU2V0UGFsZXR0ZUFyZ2IoMCwgYXJnYjApOwotICAgICAgICAgICAgU2V0UGFsZXR0ZUFyZ2IoMSwgYXJnYjEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1fcENvbG9yU3BhY2UgPT0gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRUdSQVkpICYmIG1fYnBjID09IDggJiYgbV9iRGVmYXVsdERlY29kZSkgewotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBwYWxldHRlX2NvdW50ID0gMSA8PCAobV9icGMgKiBtX25Db21wb25lbnRzKTsKLSAgICAgICAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IGNvbG9yX3ZhbHVlcyhtX25Db21wb25lbnRzKTsKLSAgICAgICAgRlhfRkxPQVQqIGNvbG9yX3ZhbHVlID0gY29sb3JfdmFsdWVzOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhbGV0dGVfY291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIGludCBjb2xvcl9kYXRhID0gaTsKLSAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgaiA9IDA7IGogPCBtX25Db21wb25lbnRzOyBqICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGVuY29kZWRfY29tcG9uZW50ID0gY29sb3JfZGF0YSAlICgxIDw8IG1fYnBjKTsKLSAgICAgICAgICAgICAgICBjb2xvcl9kYXRhIC89IDEgPDwgbV9icGM7Ci0gICAgICAgICAgICAgICAgY29sb3JfdmFsdWVbal0gPSBtX3BDb21wRGF0YVtqXS5tX0RlY29kZU1pbiArIG1fcENvbXBEYXRhW2pdLm1fRGVjb2RlU3RlcCAqIGVuY29kZWRfY29tcG9uZW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfRkxPQVQgUiA9IDAsIEcgPSAwLCBCID0gMDsKLSAgICAgICAgICAgIGlmIChtX25Db21wb25lbnRzID09IDEgJiYgbV9GYW1pbHkgPT0gUERGQ1NfSUNDQkFTRUQgJiYgbV9wQ29sb3JTcGFjZS0+Q291bnRDb21wb25lbnRzKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgaW50IG5Db21wb25lbnRzID0gbV9wQ29sb3JTcGFjZS0+Q291bnRDb21wb25lbnRzKCk7Ci0gICAgICAgICAgICAgICAgRlhfRkxPQVQqIHRlbXBfYnVmID0gRlhfQWxsb2MoRlhfRkxPQVQsIG5Db21wb25lbnRzKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Db21wb25lbnRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcF9idWZbaV0gPSAqY29sb3JfdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fcENvbG9yU3BhY2UtPkdldFJHQih0ZW1wX2J1ZiwgUiwgRywgQik7Ci0gICAgICAgICAgICAgICAgRlhfRnJlZSh0ZW1wX2J1Zik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fcENvbG9yU3BhY2UtPkdldFJHQihjb2xvcl92YWx1ZSwgUiwgRywgQik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXRQYWxldHRlQXJnYihpLCBBcmdiRW5jb2RlKDI1NSwgRlhTWVNfcm91bmQoUiAqIDI1NSksIEZYU1lTX3JvdW5kKEcgKiAyNTUpLCBGWFNZU19yb3VuZChCICogMjU1KSkpOwotICAgICAgICB9Ci0gICAgfQotfQotdm9pZCBDUERGX0RJQlNvdXJjZTo6VmFsaWRhdGVEaWN0UGFyYW0oKQotewotICAgIG1fYnBjID0gbV9icGNfb3JpZzsKLSAgICBDUERGX09iamVjdCAqIHBGaWx0ZXIgPSBtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIkZpbHRlciIpKTsKLSAgICBpZiAocEZpbHRlcikgewotICAgICAgICBpZiAocEZpbHRlci0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSB7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBmaWx0ZXIgPSBwRmlsdGVyLT5HZXRTdHJpbmcoKTsKLSAgICAgICAgICAgIGlmIChmaWx0ZXIgPT0gRlhfQlNUUkMoIkNDSVRURmF4RGVjb2RlIikgfHwgZmlsdGVyID09IEZYX0JTVFJDKCJKQklHMkRlY29kZSIpKSB7Ci0gICAgICAgICAgICAgICAgbV9icGMgPSAxOwotICAgICAgICAgICAgICAgIG1fbkNvbXBvbmVudHMgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZpbHRlciA9PSBGWF9CU1RSQygiUnVuTGVuZ3RoRGVjb2RlIikgfHwgZmlsdGVyID09IEZYX0JTVFJDKCJEQ1REZWNvZGUiKSkgewotICAgICAgICAgICAgICAgIG1fYnBjID0gODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwRmlsdGVyLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgICAgICBDUERGX0FycmF5ICpwQXJyYXkgPSAoQ1BERl9BcnJheSAqKXBGaWx0ZXI7Ci0gICAgICAgICAgICBpZiAocEFycmF5LT5HZXRTdHJpbmcocEFycmF5LT5HZXRDb3VudCgpIC0gMSkgPT0gRlhfQlNUUkMoIkNDSVRURmF4RGVjb2RlIikgfHwKLSAgICAgICAgICAgICAgICAgICAgcEFycmF5LT5HZXRTdHJpbmcocEFycmF5LT5HZXRDb3VudCgpIC0gMSkgPT0gRlhfQlNUUkMoIkpCSUcyRGVjb2RlIikpIHsKLSAgICAgICAgICAgICAgICBtX2JwYyA9IDE7Ci0gICAgICAgICAgICAgICAgbV9uQ29tcG9uZW50cyA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocEFycmF5LT5HZXRTdHJpbmcocEFycmF5LT5HZXRDb3VudCgpIC0gMSkgPT0gRlhfQlNUUkMoIkRDVERlY29kZSIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gUHJldmlvdXNseSwgcEFycmF5LT5HZXRTdHJpbmcocEFycmF5LT5HZXRDb3VudCgpIC0gMSkgPT0gRlhfQlNUUkMoIlJ1bkxlbmd0aERlY29kZSIpIHdhcyBjaGVja2VkIGluIHRoZSAiaWYiIHN0YXRlbWVudCBhcyB3ZWxsLAotICAgICAgICAgICAgICAgIC8vIGJ1dCB0b28gbWFueSBkb2N1bWVudHMgZG9uJ3QgY29uZm9ybSB0byBpdC4KLSAgICAgICAgICAgICAgICBtX2JwYyA9IDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fYnBjICE9IDEgJiYgbV9icGMgIT0gMiAmJiBtX2JwYyAhPSA0ICYmIG1fYnBjICE9IDggJiYgbV9icGMgIT0gMTYpIHsKLSAgICAgICAgbV9icGMgPSAwOwotICAgIH0KLX0KLSNkZWZpbmUgTk9STUFMQ09MT1JfTUFYKGNvbG9yLCBtYXgpIChjb2xvcikgPiAobWF4KSA/IChtYXgpIDogKGNvbG9yKSA8IDAgPyAwIDogKGNvbG9yKTsKLXZvaWQgQ1BERl9ESUJTb3VyY2U6OlRyYW5zbGF0ZVNjYW5saW5lMjRicHAoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbikgY29uc3QKLXsKLSAgICBpZiAobV9icGMgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludCBtYXhfZGF0YSA9ICgxIDw8IG1fYnBjKSAtIDE7Ci0gICAgaWYgKG1fYkRlZmF1bHREZWNvZGUpIHsKLSAgICAgICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRVJHQiB8fCBtX0ZhbWlseSA9PSBQREZDU19DQUxSR0IpIHsKLSAgICAgICAgICAgIEZYX0xQQ0JZVEUgc3JjX3BvcyA9IHNyY19zY2FuOwotICAgICAgICAgICAgc3dpdGNoIChtX2JwYykgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3Bvc1s0XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19wb3NbMl07Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3BvczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19wb3MgKz0gNjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbHVtbiA9IDA7IGNvbHVtbiA8IG1fV2lkdGg7IGNvbHVtbiArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3Bvc1syXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19wb3NbMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3BvczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19wb3MgKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2JpdF9wb3MgPSAwOwotICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9ieXRlX3BvcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbHVtbiA9IDA7IGNvbHVtbiA8IG1fV2lkdGg7IGNvbHVtbiArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IFIgPSBfR2V0Qml0czgoc3JjX3NjYW4sIHNyY19iaXRfcG9zLCBtX2JwYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfYml0X3BvcyArPSBtX2JwYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBHID0gX0dldEJpdHM4KHNyY19zY2FuLCBzcmNfYml0X3BvcywgbV9icGMpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2JpdF9wb3MgKz0gbV9icGM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgQiA9IF9HZXRCaXRzOChzcmNfc2Nhbiwgc3JjX2JpdF9wb3MsIG1fYnBjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19iaXRfcG9zICs9IG1fYnBjOwotICAgICAgICAgICAgICAgICAgICAgICAgUiA9IE5PUk1BTENPTE9SX01BWChSLCBtYXhfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHID0gTk9STUFMQ09MT1JfTUFYKEcsIG1heF9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEIgPSBOT1JNQUxDT0xPUl9NQVgoQiwgbWF4X2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfYnl0ZV9wb3NdID0gQiAqIDI1NSAvIG1heF9kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfYnl0ZV9wb3MgKyAxXSA9IEcgKiAyNTUgLyBtYXhfZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X2J5dGVfcG9zICsgMl0gPSBSICogMjU1IC8gbWF4X2RhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2J5dGVfcG9zICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAobV9icGMgPT0gOCkgewotICAgICAgICAgICAgaWYgKG1fbkNvbXBvbmVudHMgPT0gbV9wQ29sb3JTcGFjZS0+Q291bnRDb21wb25lbnRzKCkpCi0gICAgICAgICAgICAgICAgbV9wQ29sb3JTcGFjZS0+VHJhbnNsYXRlSW1hZ2VMaW5lKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fV2lkdGgsIG1fV2lkdGgsIG1fSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JMb2FkTWFzayAmJiBtX0dyb3VwRmFtaWx5ID09IFBERkNTX0RFVklDRUNNWUsgJiYgbV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IGNvbG9yX3ZhbHVlczEobV9uQ29tcG9uZW50cyk7Ci0gICAgRlhfRkxPQVQqIGNvbG9yX3ZhbHVlcyA9IGNvbG9yX3ZhbHVlczE7Ci0gICAgRlhfRkxPQVQgUiA9IDAuMGYsIEcgPSAwLjBmLCBCID0gMC4wZjsKLSAgICBpZiAobV9icGMgPT0gOCkgewotICAgICAgICBpbnQgc3JjX2J5dGVfcG9zID0gMDsKLSAgICAgICAgaW50IGRlc3RfYnl0ZV9wb3MgPSAwOwotICAgICAgICBmb3IgKGludCBjb2x1bW4gPSAwOyBjb2x1bW4gPCBtX1dpZHRoOyBjb2x1bW4gKyspIHsKLSAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgY29sb3IgPSAwOyBjb2xvciA8IG1fbkNvbXBvbmVudHM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGRhdGEgPSBzcmNfc2NhbltzcmNfYnl0ZV9wb3MgKytdOwotICAgICAgICAgICAgICAgIGNvbG9yX3ZhbHVlc1tjb2xvcl0gPSBtX3BDb21wRGF0YVtjb2xvcl0ubV9EZWNvZGVNaW4gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDb21wRGF0YVtjb2xvcl0ubV9EZWNvZGVTdGVwICogZGF0YTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX2JMb2FkTWFzayAmJiBtX0dyb3VwRmFtaWx5ID09IFBERkNTX0RFVklDRUNNWUsgJiYgbV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSykgewotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGsgPSAxLjBmIC0gY29sb3JfdmFsdWVzWzNdOwotICAgICAgICAgICAgICAgIFIgPSAoMS4wZiAtIGNvbG9yX3ZhbHVlc1swXSkgKiBrOwotICAgICAgICAgICAgICAgIEcgPSAoMS4wZiAtIGNvbG9yX3ZhbHVlc1sxXSkgKiBrOwotICAgICAgICAgICAgICAgIEIgPSAoMS4wZiAtIGNvbG9yX3ZhbHVlc1syXSkgKiBrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX3BDb2xvclNwYWNlLT5HZXRSR0IoY29sb3JfdmFsdWVzLCBSLCBHLCBCKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFIgPSBOT1JNQUxDT0xPUl9NQVgoUiwgMSk7Ci0gICAgICAgICAgICBHID0gTk9STUFMQ09MT1JfTUFYKEcsIDEpOwotICAgICAgICAgICAgQiA9IE5PUk1BTENPTE9SX01BWChCLCAxKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X2J5dGVfcG9zXSA9IChGWF9JTlQzMikoQiAqIDI1NSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9ieXRlX3BvcyArIDFdID0gKEZYX0lOVDMyKShHICogMjU1KTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X2J5dGVfcG9zICsgMl0gPSAoRlhfSU5UMzIpKFIgKiAyNTUpOwotICAgICAgICAgICAgZGVzdF9ieXRlX3BvcyArPSAzOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IHNyY19iaXRfcG9zID0gMDsKLSAgICAgICAgaW50IGRlc3RfYnl0ZV9wb3MgPSAwOwotICAgICAgICBmb3IgKGludCBjb2x1bW4gPSAwOyBjb2x1bW4gPCBtX1dpZHRoOyBjb2x1bW4gKyspIHsKLSAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgY29sb3IgPSAwOyBjb2xvciA8IG1fbkNvbXBvbmVudHM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGRhdGEgPSBfR2V0Qml0czgoc3JjX3NjYW4sIHNyY19iaXRfcG9zLCBtX2JwYyk7Ci0gICAgICAgICAgICAgICAgY29sb3JfdmFsdWVzW2NvbG9yXSA9IG1fcENvbXBEYXRhW2NvbG9yXS5tX0RlY29kZU1pbiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcENvbXBEYXRhW2NvbG9yXS5tX0RlY29kZVN0ZXAgKiBkYXRhOwotICAgICAgICAgICAgICAgIHNyY19iaXRfcG9zICs9IG1fYnBjOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1fYkxvYWRNYXNrICYmIG1fR3JvdXBGYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSyAmJiBtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLKSB7Ci0gICAgICAgICAgICAgICAgRlhfRkxPQVQgayA9IDEuMGYgLSBjb2xvcl92YWx1ZXNbM107Ci0gICAgICAgICAgICAgICAgUiA9ICgxLjBmIC0gY29sb3JfdmFsdWVzWzBdKSAqIGs7Ci0gICAgICAgICAgICAgICAgRyA9ICgxLjBmIC0gY29sb3JfdmFsdWVzWzFdKSAqIGs7Ci0gICAgICAgICAgICAgICAgQiA9ICgxLjBmIC0gY29sb3JfdmFsdWVzWzJdKSAqIGs7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fcENvbG9yU3BhY2UtPkdldFJHQihjb2xvcl92YWx1ZXMsIFIsIEcsIEIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUiA9IE5PUk1BTENPTE9SX01BWChSLCAxKTsKLSAgICAgICAgICAgIEcgPSBOT1JNQUxDT0xPUl9NQVgoRywgMSk7Ci0gICAgICAgICAgICBCID0gTk9STUFMQ09MT1JfTUFYKEIsIDEpOwotICAgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfYnl0ZV9wb3NdID0gKEZYX0lOVDMyKShCICogMjU1KTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X2J5dGVfcG9zICsgMV0gPSAoRlhfSU5UMzIpKEcgKiAyNTUpOwotICAgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfYnl0ZV9wb3MgKyAyXSA9IChGWF9JTlQzMikoUiAqIDI1NSk7Ci0gICAgICAgICAgICBkZXN0X2J5dGVfcG9zICs9IDM7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1GWF9MUEJZVEUgQ1BERl9ESUJTb3VyY2U6OkdldEJ1ZmZlcigpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcENhY2hlZEJpdG1hcCkgewotICAgICAgICByZXR1cm4gbV9wQ2FjaGVkQml0bWFwLT5HZXRCdWZmZXIoKTsKLSAgICB9CisKK0RJQl9DT01QX0RBVEEqIENQREZfRElCU291cmNlOjpHZXREZWNvZGVBbmRNYXNrQXJyYXkoRlhfQk9PTCYgYkRlZmF1bHREZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJDb2xvcktleSkgeworICBpZiAoIW1fcENvbG9yU3BhY2UpIHsKICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBESUJfQ09NUF9EQVRBKiBwQ29tcERhdGEgPSBGWF9BbGxvYyhESUJfQ09NUF9EQVRBLCBtX25Db21wb25lbnRzKTsKKyAgaW50IG1heF9kYXRhID0gKDEgPDwgbV9icGMpIC0gMTsKKyAgQ1BERl9BcnJheSogcERlY29kZSA9IG1fcERpY3QtPkdldEFycmF5KCJEZWNvZGUiKTsKKyAgaWYgKHBEZWNvZGUpIHsKKyAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgbV9uQ29tcG9uZW50czsgaSsrKSB7CisgICAgICBwQ29tcERhdGFbaV0ubV9EZWNvZGVNaW4gPSBwRGVjb2RlLT5HZXROdW1iZXIoaSAqIDIpOworICAgICAgRlhfRkxPQVQgbWF4ID0gcERlY29kZS0+R2V0TnVtYmVyKGkgKiAyICsgMSk7CisgICAgICBwQ29tcERhdGFbaV0ubV9EZWNvZGVTdGVwID0gKG1heCAtIHBDb21wRGF0YVtpXS5tX0RlY29kZU1pbikgLyBtYXhfZGF0YTsKKyAgICAgIEZYX0ZMT0FUIGRlZl92YWx1ZSwgZGVmX21pbiwgZGVmX21heDsKKyAgICAgIG1fcENvbG9yU3BhY2UtPkdldERlZmF1bHRWYWx1ZShpLCBkZWZfdmFsdWUsIGRlZl9taW4sIGRlZl9tYXgpOworICAgICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0lOREVYRUQpIHsKKyAgICAgICAgZGVmX21heCA9IChGWF9GTE9BVCltYXhfZGF0YTsKKyAgICAgIH0KKyAgICAgIGlmIChkZWZfbWluICE9IHBDb21wRGF0YVtpXS5tX0RlY29kZU1pbiB8fCBkZWZfbWF4ICE9IG1heCkgeworICAgICAgICBiRGVmYXVsdERlY29kZSA9IEZBTFNFOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgbV9uQ29tcG9uZW50czsgaSsrKSB7CisgICAgICBGWF9GTE9BVCBkZWZfdmFsdWU7CisgICAgICBtX3BDb2xvclNwYWNlLT5HZXREZWZhdWx0VmFsdWUoaSwgZGVmX3ZhbHVlLCBwQ29tcERhdGFbaV0ubV9EZWNvZGVNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbXBEYXRhW2ldLm1fRGVjb2RlU3RlcCk7CisgICAgICBpZiAobV9GYW1pbHkgPT0gUERGQ1NfSU5ERVhFRCkgeworICAgICAgICBwQ29tcERhdGFbaV0ubV9EZWNvZGVTdGVwID0gKEZYX0ZMT0FUKW1heF9kYXRhOworICAgICAgfQorICAgICAgcENvbXBEYXRhW2ldLm1fRGVjb2RlU3RlcCA9CisgICAgICAgICAgKHBDb21wRGF0YVtpXS5tX0RlY29kZVN0ZXAgLSBwQ29tcERhdGFbaV0ubV9EZWNvZGVNaW4pIC8gbWF4X2RhdGE7CisgICAgfQorICB9CisgIGlmICghbV9wRGljdC0+S2V5RXhpc3QoIlNNYXNrIikpIHsKKyAgICBDUERGX09iamVjdCogcE1hc2sgPSBtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoIk1hc2siKTsKKyAgICBpZiAoIXBNYXNrKSB7CisgICAgICByZXR1cm4gcENvbXBEYXRhOworICAgIH0KKyAgICBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcE1hc2stPkFzQXJyYXkoKSkgeworICAgICAgaWYgKHBBcnJheS0+R2V0Q291bnQoKSA+PSBtX25Db21wb25lbnRzICogMikgeworICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgbV9uQ29tcG9uZW50czsgaSsrKSB7CisgICAgICAgICAgaW50IG1pbl9udW0gPSBwQXJyYXktPkdldEludGVnZXIoaSAqIDIpOworICAgICAgICAgIGludCBtYXhfbnVtID0gcEFycmF5LT5HZXRJbnRlZ2VyKGkgKiAyICsgMSk7CisgICAgICAgICAgcENvbXBEYXRhW2ldLm1fQ29sb3JLZXlNaW4gPSBzdGQ6Om1heChtaW5fbnVtLCAwKTsKKyAgICAgICAgICBwQ29tcERhdGFbaV0ubV9Db2xvcktleU1heCA9IHN0ZDo6bWluKG1heF9udW0sIG1heF9kYXRhKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYkNvbG9yS2V5ID0gVFJVRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHBDb21wRGF0YTsKIH0KLUZYX0xQQ0JZVEUgQ1BERl9ESUJTb3VyY2U6OkdldFNjYW5saW5lKGludCBsaW5lKSBjb25zdAotewotICAgIGlmIChtX2JwYyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBGWF9TQUZFX0RXT1JEIHNyY19waXRjaCA9IENhbGN1bGF0ZVBpdGNoOChtX2JwYywgbV9uQ29tcG9uZW50cywgbV9XaWR0aCwgMSk7Ci0gICAgaWYgKCFzcmNfcGl0Y2guSXNWYWxpZCgpKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBGWF9EV09SRCBzcmNfcGl0Y2hfdmFsdWUgPSBzcmNfcGl0Y2guVmFsdWVPckRpZSgpOwotICAgIEZYX0xQQ0JZVEUgcFNyY0xpbmUgPSBOVUxMOwotICAgIGlmIChtX3BDYWNoZWRCaXRtYXApIHsKLSAgICAgICAgaWYgKGxpbmUgPj0gbV9wQ2FjaGVkQml0bWFwLT5HZXRIZWlnaHQoKSkgewotICAgICAgICAgICAgbGluZSA9IG1fcENhY2hlZEJpdG1hcC0+R2V0SGVpZ2h0KCkgLSAxOworSUNvZGVjX1NjYW5saW5lRGVjb2RlciogRlBERkFQSV9DcmVhdGVGYXhEZWNvZGVyKAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgaW50IHdpZHRoLAorICAgIGludCBoZWlnaHQsCisgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zKTsKK0lDb2RlY19TY2FubGluZURlY29kZXIqIEZQREZBUElfQ3JlYXRlRmxhdGVEZWNvZGVyKAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgaW50IHdpZHRoLAorICAgIGludCBoZWlnaHQsCisgICAgaW50IG5Db21wcywKKyAgICBpbnQgYnBjLAorICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhcmFtcyk7CitpbnQgQ1BERl9ESUJTb3VyY2U6OkNyZWF0ZURlY29kZXIoKSB7CisgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBkZWNvZGVyID0gbV9wU3RyZWFtQWNjLT5HZXRJbWFnZURlY29kZXIoKTsKKyAgaWYgKGRlY29kZXIuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKG1fYkRvQnBjQ2hlY2sgJiYgbV9icGMgPT0gMCkgeworICAgIHJldHVybiAwOworICB9CisgIGNvbnN0IHVpbnQ4X3QqIHNyY19kYXRhID0gbV9wU3RyZWFtQWNjLT5HZXREYXRhKCk7CisgIEZYX0RXT1JEIHNyY19zaXplID0gbV9wU3RyZWFtQWNjLT5HZXRTaXplKCk7CisgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhcmFtcyA9IG1fcFN0cmVhbUFjYy0+R2V0SW1hZ2VQYXJhbSgpOworICBpZiAoZGVjb2RlciA9PSAiQ0NJVFRGYXhEZWNvZGUiKSB7CisgICAgbV9wRGVjb2RlciA9IEZQREZBUElfQ3JlYXRlRmF4RGVjb2RlcihzcmNfZGF0YSwgc3JjX3NpemUsIG1fV2lkdGgsIG1fSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7CisgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSAiRENURGVjb2RlIikgeworICAgIG1fcERlY29kZXIgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKS0+Q3JlYXRlRGVjb2RlcigKKyAgICAgICAgc3JjX2RhdGEsIHNyY19zaXplLCBtX1dpZHRoLCBtX0hlaWdodCwgbV9uQ29tcG9uZW50cywKKyAgICAgICAgcFBhcmFtcyA/IHBQYXJhbXMtPkdldEludGVnZXIoIkNvbG9yVHJhbnNmb3JtIiwgMSkgOiAxKTsKKyAgICBpZiAoIW1fcERlY29kZXIpIHsKKyAgICAgIEZYX0JPT0wgYlRyYW5zZm9ybSA9IEZBTFNFOworICAgICAgaW50IGNvbXBzLCBicGM7CisgICAgICBJQ29kZWNfSnBlZ01vZHVsZSogcEpwZWdNb2R1bGUgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKTsKKyAgICAgIGlmIChwSnBlZ01vZHVsZS0+TG9hZEluZm8oc3JjX2RhdGEsIHNyY19zaXplLCBtX1dpZHRoLCBtX0hlaWdodCwgY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwYywgYlRyYW5zZm9ybSkpIHsKKyAgICAgICAgaWYgKG1fbkNvbXBvbmVudHMgIT0gY29tcHMpIHsKKyAgICAgICAgICBGWF9GcmVlKG1fcENvbXBEYXRhKTsKKyAgICAgICAgICBtX25Db21wb25lbnRzID0gY29tcHM7CisgICAgICAgICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0xBQiAmJiBtX25Db21wb25lbnRzICE9IDMpIHsKKyAgICAgICAgICAgIG1fcENvbXBEYXRhID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgIH0KKyAgICAgICAgICBtX3BDb21wRGF0YSA9IEdldERlY29kZUFuZE1hc2tBcnJheShtX2JEZWZhdWx0RGVjb2RlLCBtX2JDb2xvcktleSk7CisgICAgICAgICAgaWYgKCFtX3BDb21wRGF0YSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHBTcmNMaW5lID0gbV9wQ2FjaGVkQml0bWFwLT5HZXRTY2FubGluZShsaW5lKTsKLSAgICB9IGVsc2UgaWYgKG1fcERlY29kZXIpIHsKLSAgICAgICAgcFNyY0xpbmUgPSBtX3BEZWNvZGVyLT5HZXRTY2FubGluZShsaW5lKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAobV9wU3RyZWFtQWNjLT5HZXRTaXplKCkgPj0gKGxpbmUgKyAxKSAqIHNyY19waXRjaF92YWx1ZSkgewotICAgICAgICAgICAgcFNyY0xpbmUgPSBtX3BTdHJlYW1BY2MtPkdldERhdGEoKSArIGxpbmUgKiBzcmNfcGl0Y2hfdmFsdWU7Ci0gICAgICAgIH0KKyAgICAgICAgbV9icGMgPSBicGM7CisgICAgICAgIG1fcERlY29kZXIgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKS0+Q3JlYXRlRGVjb2RlcigKKyAgICAgICAgICAgIHNyY19kYXRhLCBzcmNfc2l6ZSwgbV9XaWR0aCwgbV9IZWlnaHQsIG1fbkNvbXBvbmVudHMsIGJUcmFuc2Zvcm0pOworICAgICAgfQogICAgIH0KLSAgICBpZiAocFNyY0xpbmUgPT0gTlVMTCkgewotICAgICAgICBGWF9MUEJZVEUgcExpbmVCdWYgPSBtX3BNYXNrZWRMaW5lID8gbV9wTWFza2VkTGluZSA6IG1fcExpbmVCdWY7Ci0gICAgICAgIEZYU1lTX21lbXNldDgocExpbmVCdWYsIDB4ZmYsIG1fUGl0Y2gpOwotICAgICAgICByZXR1cm4gcExpbmVCdWY7CisgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSAiRmxhdGVEZWNvZGUiKSB7CisgICAgbV9wRGVjb2RlciA9IEZQREZBUElfQ3JlYXRlRmxhdGVEZWNvZGVyKAorICAgICAgICBzcmNfZGF0YSwgc3JjX3NpemUsIG1fV2lkdGgsIG1fSGVpZ2h0LCBtX25Db21wb25lbnRzLCBtX2JwYywgcFBhcmFtcyk7CisgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSAiSlBYRGVjb2RlIikgeworICAgIExvYWRKcHhCaXRtYXAoKTsKKyAgICByZXR1cm4gbV9wQ2FjaGVkQml0bWFwID8gMSA6IDA7CisgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSAiSkJJRzJEZWNvZGUiKSB7CisgICAgbV9wQ2FjaGVkQml0bWFwLnJlc2V0KG5ldyBDRlhfRElCaXRtYXApOworICAgIGlmICghbV9wQ2FjaGVkQml0bWFwLT5DcmVhdGUoCisgICAgICAgICAgICBtX1dpZHRoLCBtX0hlaWdodCwgbV9iSW1hZ2VNYXNrID8gRlhESUJfMWJwcE1hc2sgOiBGWERJQl8xYnBwUmdiKSkgeworICAgICAgbV9wQ2FjaGVkQml0bWFwLnJlc2V0KCk7CisgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgaWYgKG1fYnBjICogbV9uQ29tcG9uZW50cyA9PSAxKSB7Ci0gICAgICAgIGlmIChtX2JJbWFnZU1hc2sgJiYgbV9iRGVmYXVsdERlY29kZSkgewotICAgICAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHNyY19waXRjaF92YWx1ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbV9wTGluZUJ1ZltpXSA9IH5wU3JjTGluZVtpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtX2JDb2xvcktleSkgewotICAgICAgICAgICAgRlhfRFdPUkQgcmVzZXRfYXJnYiwgc2V0X2FyZ2I7Ci0gICAgICAgICAgICByZXNldF9hcmdiID0gbV9wUGFsZXR0ZSA/IG1fcFBhbGV0dGVbMF0gOiAweGZmMDAwMDAwOwotICAgICAgICAgICAgc2V0X2FyZ2IgPSBtX3BQYWxldHRlID8gbV9wUGFsZXR0ZVsxXSA6IDB4ZmZmZmZmZmY7Ci0gICAgICAgICAgICBpZiAobV9wQ29tcERhdGFbMF0ubV9Db2xvcktleU1pbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmVzZXRfYXJnYiA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9wQ29tcERhdGFbMF0ubV9Db2xvcktleU1heCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgc2V0X2FyZ2IgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0X2FyZ2IgPSBGWEFSR0JfVE9ESUIoc2V0X2FyZ2IpOwotICAgICAgICAgICAgcmVzZXRfYXJnYiA9IEZYQVJHQl9UT0RJQihyZXNldF9hcmdiKTsKLSAgICAgICAgICAgIEZYX0RXT1JEKiBkZXN0X3NjYW4gPSAoRlhfRFdPUkQqKW1fcE1hc2tlZExpbmU7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocFNyY0xpbmVbY29sIC8gOF0gJiAoMSA8PCAoNyAtIGNvbCAlIDgpKSkgewotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gc2V0X2FyZ2I7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IHJlc2V0X2FyZ2I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtX3BNYXNrZWRMaW5lOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIobV9wTGluZUJ1ZiwgcFNyY0xpbmUsIHNyY19waXRjaF92YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1fcExpbmVCdWY7Ci0gICAgfQotICAgIGlmIChtX2JwYyAqIG1fbkNvbXBvbmVudHMgPD0gOCkgewotICAgICAgICBpZiAobV9icGMgPT0gOCkgewotICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIobV9wTGluZUJ1ZiwgcFNyY0xpbmUsIHNyY19waXRjaF92YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgc3JjX2JpdF9wb3MgPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGNvbG9yX2luZGV4ID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKEZYX0RXT1JEIGNvbG9yID0gMDsgY29sb3IgPCBtX25Db21wb25lbnRzOyBjb2xvciArKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgZGF0YSA9IF9HZXRCaXRzOChwU3JjTGluZSwgc3JjX2JpdF9wb3MsIG1fYnBjKTsKLSAgICAgICAgICAgICAgICAgICAgY29sb3JfaW5kZXggfD0gZGF0YSA8PCAoY29sb3IgKiBtX2JwYyk7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19iaXRfcG9zICs9IG1fYnBjOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX3BMaW5lQnVmW2NvbF0gPSBjb2xvcl9pbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobV9iQ29sb3JLZXkpIHsKLSAgICAgICAgICAgIEZYX0xQQllURSBwRGVzdFBpeGVsID0gbV9wTWFza2VkTGluZTsKLSAgICAgICAgICAgIEZYX0xQQ0JZVEUgcFNyY1BpeGVsID0gbV9wTGluZUJ1ZjsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgIEZYX0JZVEUgaW5kZXggPSAqcFNyY1BpeGVsKys7Ci0gICAgICAgICAgICAgICAgaWYgKG1fcFBhbGV0dGUpIHsKLSAgICAgICAgICAgICAgICAgICAgKnBEZXN0UGl4ZWwrKyA9IEZYQVJHQl9CKG1fcFBhbGV0dGVbaW5kZXhdKTsKLSAgICAgICAgICAgICAgICAgICAgKnBEZXN0UGl4ZWwrKyA9IEZYQVJHQl9HKG1fcFBhbGV0dGVbaW5kZXhdKTsKLSAgICAgICAgICAgICAgICAgICAgKnBEZXN0UGl4ZWwrKyA9IEZYQVJHQl9SKG1fcFBhbGV0dGVbaW5kZXhdKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAqcERlc3RQaXhlbCsrID0gaW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICpwRGVzdFBpeGVsKysgPSBpbmRleDsKLSAgICAgICAgICAgICAgICAgICAgKnBEZXN0UGl4ZWwrKyA9IGluZGV4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAqcERlc3RQaXhlbCA9IChpbmRleCA8IG1fcENvbXBEYXRhWzBdLm1fQ29sb3JLZXlNaW4gfHwgaW5kZXggPiBtX3BDb21wRGF0YVswXS5tX0NvbG9yS2V5TWF4KSA/IDB4ZmYgOiAwOwotICAgICAgICAgICAgICAgIHBEZXN0UGl4ZWwgKysgOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1fcE1hc2tlZExpbmU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1fcExpbmVCdWY7Ci0gICAgfQotICAgIGlmIChtX2JDb2xvcktleSkgewotICAgICAgICBpZiAobV9uQ29tcG9uZW50cyA9PSAzICYmIG1fYnBjID09IDgpIHsKLSAgICAgICAgICAgIEZYX0xQQllURSBhbHBoYV9jaGFubmVsID0gbV9wTWFza2VkTGluZSArIDM7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBGWF9MUENCWVRFIHBQaXhlbCA9IHBTcmNMaW5lICsgY29sICogMzsKLSAgICAgICAgICAgICAgICBhbHBoYV9jaGFubmVsW2NvbCAqIDRdID0gKHBQaXhlbFswXSA8IG1fcENvbXBEYXRhWzBdLm1fQ29sb3JLZXlNaW4gfHwgcFBpeGVsWzBdID4gbV9wQ29tcERhdGFbMF0ubV9Db2xvcktleU1heCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpeGVsWzFdIDwgbV9wQ29tcERhdGFbMV0ubV9Db2xvcktleU1pbiB8fCBwUGl4ZWxbMV0gPiBtX3BDb21wRGF0YVsxXS5tX0NvbG9yS2V5TWF4IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGl4ZWxbMl0gPCBtX3BDb21wRGF0YVsyXS5tX0NvbG9yS2V5TWluIHx8IHBQaXhlbFsyXSA+IG1fcENvbXBEYXRhWzJdLm1fQ29sb3JLZXlNYXgpID8gMHhmZiA6IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1zZXQ4KG1fcE1hc2tlZExpbmUsIDB4ZmYsIG1fUGl0Y2gpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtX3BDb2xvclNwYWNlKSB7Ci0gICAgICAgIFRyYW5zbGF0ZVNjYW5saW5lMjRicHAobV9wTGluZUJ1ZiwgcFNyY0xpbmUpOwotICAgICAgICBwU3JjTGluZSA9IG1fcExpbmVCdWY7Ci0gICAgfQotICAgIGlmIChtX2JDb2xvcktleSkgewotICAgICAgICBGWF9MUENCWVRFIHBTcmNQaXhlbCA9IHBTcmNMaW5lOwotICAgICAgICBGWF9MUEJZVEUgcERlc3RQaXhlbCA9IG1fcE1hc2tlZExpbmU7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgKnBEZXN0UGl4ZWwrKyA9ICpwU3JjUGl4ZWwrKzsKLSAgICAgICAgICAgICpwRGVzdFBpeGVsKysgPSAqcFNyY1BpeGVsKys7Ci0gICAgICAgICAgICAqcERlc3RQaXhlbCsrID0gKnBTcmNQaXhlbCsrOwotICAgICAgICAgICAgcERlc3RQaXhlbCArKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbV9wTWFza2VkTGluZTsKLSAgICB9Ci0gICAgcmV0dXJuIHBTcmNMaW5lOwotfQotRlhfQk9PTCBDUERGX0RJQlNvdXJjZTo6U2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsIElGWF9QYXVzZSogcFBhdXNlKSBjb25zdAotewotICAgIGlmIChtX3BEZWNvZGVyKSB7Ci0gICAgICAgIHJldHVybiBtX3BEZWNvZGVyLT5Ta2lwVG9TY2FubGluZShsaW5lLCBwUGF1c2UpOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci12b2lkIENQREZfRElCU291cmNlOjpEb3duU2FtcGxlU2NhbmxpbmUoaW50IGxpbmUsIEZYX0xQQllURSBkZXN0X3NjYW4sIGludCBkZXN0X2JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgRlhfQk9PTCBiRmxpcFgsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3dpZHRoKSBjb25zdAotewotICAgIGlmIChsaW5lIDwgMCB8fCBkZXN0X3NjYW4gPT0gTlVMTCB8fCBkZXN0X2JwcCA8PSAwIHx8Ci0gICAgICAgIGRlc3Rfd2lkdGggPD0gMCB8fCBjbGlwX2xlZnQgPCAwIHx8IGNsaXBfd2lkdGggPD0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQorICAgIG1fU3RhdHVzID0gMTsKKyAgICByZXR1cm4gMjsKKyAgfSBlbHNlIGlmIChkZWNvZGVyID09ICJSdW5MZW5ndGhEZWNvZGUiKSB7CisgICAgbV9wRGVjb2RlciA9IENQREZfTW9kdWxlTWdyOjpHZXQoKQorICAgICAgICAgICAgICAgICAgICAgLT5HZXRDb2RlY01vZHVsZSgpCisgICAgICAgICAgICAgICAgICAgICAtPkdldEJhc2ljTW9kdWxlKCkKKyAgICAgICAgICAgICAgICAgICAgIC0+Q3JlYXRlUnVuTGVuZ3RoRGVjb2RlcihzcmNfZGF0YSwgc3JjX3NpemUsIG1fV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9IZWlnaHQsIG1fbkNvbXBvbmVudHMsIG1fYnBjKTsKKyAgfQorICBpZiAoIW1fcERlY29kZXIpCisgICAgcmV0dXJuIDA7CiAKLSAgICBGWF9EV09SRCBzcmNfd2lkdGggPSBtX1dpZHRoOwotICAgIEZYX1NBRkVfRFdPUkQgcGl0Y2ggPSBDYWxjdWxhdGVQaXRjaDgobV9icGMsIG1fbkNvbXBvbmVudHMsIG1fV2lkdGgsIDEpOworICBGWF9TQUZFX0RXT1JEIHJlcXVlc3RlZF9waXRjaCA9CisgICAgICBDYWxjdWxhdGVQaXRjaDgobV9icGMsIG1fbkNvbXBvbmVudHMsIG1fV2lkdGgpOworICBpZiAoIXJlcXVlc3RlZF9waXRjaC5Jc1ZhbGlkKCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBGWF9TQUZFX0RXT1JEIHByb3ZpZGVkX3BpdGNoID0gQ2FsY3VsYXRlUGl0Y2g4KAorICAgICAgbV9wRGVjb2Rlci0+R2V0QlBDKCksIG1fcERlY29kZXItPkNvdW50Q29tcHMoKSwgbV9wRGVjb2Rlci0+R2V0V2lkdGgoKSk7CisgIGlmICghcHJvdmlkZWRfcGl0Y2guSXNWYWxpZCgpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKHByb3ZpZGVkX3BpdGNoLlZhbHVlT3JEaWUoKSA8IHJlcXVlc3RlZF9waXRjaC5WYWx1ZU9yRGllKCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTsKK30KK3ZvaWQgQ1BERl9ESUJTb3VyY2U6OkxvYWRKcHhCaXRtYXAoKSB7CisgIElDb2RlY19KcHhNb2R1bGUqIHBKcHhNb2R1bGUgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpweE1vZHVsZSgpOworICBpZiAoIXBKcHhNb2R1bGUpCisgICAgcmV0dXJuOworCisgIHN0ZDo6dW5pcXVlX3B0cjxKcHhCaXRNYXBDb250ZXh0PiBjb250ZXh0KG5ldyBKcHhCaXRNYXBDb250ZXh0KHBKcHhNb2R1bGUpKTsKKyAgY29udGV4dC0+c2V0X2RlY29kZXIocEpweE1vZHVsZS0+Q3JlYXRlRGVjb2RlcigKKyAgICAgIG1fcFN0cmVhbUFjYy0+R2V0RGF0YSgpLCBtX3BTdHJlYW1BY2MtPkdldFNpemUoKSwgbV9wQ29sb3JTcGFjZSkpOworICBpZiAoIWNvbnRleHQtPmRlY29kZXIoKSkKKyAgICByZXR1cm47CisKKyAgRlhfRFdPUkQgd2lkdGggPSAwOworICBGWF9EV09SRCBoZWlnaHQgPSAwOworICBGWF9EV09SRCBjb21wb25lbnRzID0gMDsKKyAgcEpweE1vZHVsZS0+R2V0SW1hZ2VJbmZvKGNvbnRleHQtPmRlY29kZXIoKSwgJndpZHRoLCAmaGVpZ2h0LCAmY29tcG9uZW50cyk7CisgIGlmICgoaW50KXdpZHRoIDwgbV9XaWR0aCB8fCAoaW50KWhlaWdodCA8IG1fSGVpZ2h0KQorICAgIHJldHVybjsKKworICBGWF9CT09MIGJTd2FwUkdCID0gRkFMU0U7CisgIGlmIChtX3BDb2xvclNwYWNlKSB7CisgICAgaWYgKGNvbXBvbmVudHMgIT0gKEZYX0RXT1JEKW1fcENvbG9yU3BhY2UtPkNvdW50Q29tcG9uZW50cygpKQorICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fcENvbG9yU3BhY2UgPT0gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRVJHQikpIHsKKyAgICAgIGJTd2FwUkdCID0gVFJVRTsKKyAgICAgIG1fcENvbG9yU3BhY2UgPSBudWxscHRyOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoY29tcG9uZW50cyA9PSAzKSB7CisgICAgICBiU3dhcFJHQiA9IFRSVUU7CisgICAgfSBlbHNlIGlmIChjb21wb25lbnRzID09IDQpIHsKKyAgICAgIG1fcENvbG9yU3BhY2UgPSBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFQ01ZSyk7CisgICAgfQorICAgIG1fbkNvbXBvbmVudHMgPSBjb21wb25lbnRzOworICB9CisKKyAgRlhESUJfRm9ybWF0IGZvcm1hdDsKKyAgaWYgKGNvbXBvbmVudHMgPT0gMSkgeworICAgIGZvcm1hdCA9IEZYRElCXzhicHBSZ2I7CisgIH0gZWxzZSBpZiAoY29tcG9uZW50cyA8PSAzKSB7CisgICAgZm9ybWF0ID0gRlhESUJfUmdiOworICB9IGVsc2UgaWYgKGNvbXBvbmVudHMgPT0gNCkgeworICAgIGZvcm1hdCA9IEZYRElCX1JnYjMyOworICB9IGVsc2UgeworICAgIHdpZHRoID0gKHdpZHRoICogY29tcG9uZW50cyArIDIpIC8gMzsKKyAgICBmb3JtYXQgPSBGWERJQl9SZ2I7CisgIH0KKworICBtX3BDYWNoZWRCaXRtYXAucmVzZXQobmV3IENGWF9ESUJpdG1hcCk7CisgIGlmICghbV9wQ2FjaGVkQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgZm9ybWF0KSkgeworICAgIG1fcENhY2hlZEJpdG1hcC5yZXNldCgpOworICAgIHJldHVybjsKKyAgfQorICBtX3BDYWNoZWRCaXRtYXAtPkNsZWFyKDB4RkZGRkZGRkYpOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBvdXRwdXRfb2Zmc2V0cyhjb21wb25lbnRzKTsKKyAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGNvbXBvbmVudHM7ICsraSkKKyAgICBvdXRwdXRfb2Zmc2V0c1tpXSA9IGk7CisgIGlmIChiU3dhcFJHQikgeworICAgIG91dHB1dF9vZmZzZXRzWzBdID0gMjsKKyAgICBvdXRwdXRfb2Zmc2V0c1syXSA9IDA7CisgIH0KKyAgaWYgKCFwSnB4TW9kdWxlLT5EZWNvZGUoY29udGV4dC0+ZGVjb2RlcigpLCBtX3BDYWNoZWRCaXRtYXAtPkdldEJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDYWNoZWRCaXRtYXAtPkdldFBpdGNoKCksIG91dHB1dF9vZmZzZXRzKSkgeworICAgIG1fcENhY2hlZEJpdG1hcC5yZXNldCgpOworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9wQ29sb3JTcGFjZSAmJiBtX3BDb2xvclNwYWNlLT5HZXRGYW1pbHkoKSA9PSBQREZDU19JTkRFWEVEICYmCisgICAgICBtX2JwYyA8IDgpIHsKKyAgICBpbnQgc2NhbGUgPSA4IC0gbV9icGM7CisgICAgZm9yIChGWF9EV09SRCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7ICsrcm93KSB7CisgICAgICB1aW50OF90KiBzY2FubGluZSA9ICh1aW50OF90KiltX3BDYWNoZWRCaXRtYXAtPkdldFNjYW5saW5lKHJvdyk7CisgICAgICBmb3IgKEZYX0RXT1JEIGNvbCA9IDA7IGNvbCA8IHdpZHRoOyArK2NvbCkgeworICAgICAgICAqc2NhbmxpbmUgPSAoKnNjYW5saW5lKSA+PiBzY2FsZTsKKyAgICAgICAgKytzY2FubGluZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgbV9icGMgPSA4OworfQorQ1BERl9ESUJTb3VyY2UqIENQREZfRElCU291cmNlOjpMb2FkTWFzayhGWF9EV09SRCYgTWF0dGVDb2xvcikgeworICBNYXR0ZUNvbG9yID0gMHhGRkZGRkZGRjsKKyAgQ1BERl9TdHJlYW0qIHBTb2Z0TWFzayA9IG1fcERpY3QtPkdldFN0cmVhbSgiU01hc2siKTsKKyAgaWYgKHBTb2Z0TWFzaykgeworICAgIENQREZfQXJyYXkqIHBNYXR0ZSA9IHBTb2Z0TWFzay0+R2V0RGljdCgpLT5HZXRBcnJheSgiTWF0dGUiKTsKKyAgICBpZiAocE1hdHRlICYmIG1fcENvbG9yU3BhY2UgJiYKKyAgICAgICAgKEZYX0RXT1JEKW1fcENvbG9yU3BhY2UtPkNvdW50Q29tcG9uZW50cygpIDw9IG1fbkNvbXBvbmVudHMpIHsKKyAgICAgIEZYX0ZMT0FUKiBwQ29sb3IgPSBGWF9BbGxvYyhGWF9GTE9BVCwgbV9uQ29tcG9uZW50cyk7CisgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgbV9uQ29tcG9uZW50czsgaSsrKSB7CisgICAgICAgIHBDb2xvcltpXSA9IHBNYXR0ZS0+R2V0RmxvYXQoaSk7CisgICAgICB9CisgICAgICBGWF9GTE9BVCBSLCBHLCBCOworICAgICAgbV9wQ29sb3JTcGFjZS0+R2V0UkdCKHBDb2xvciwgUiwgRywgQik7CisgICAgICBGWF9GcmVlKHBDb2xvcik7CisgICAgICBNYXR0ZUNvbG9yID0gRlhBUkdCX01BS0UoMCwgRlhTWVNfcm91bmQoUiAqIDI1NSksIEZYU1lTX3JvdW5kKEcgKiAyNTUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKEIgKiAyNTUpKTsKKyAgICB9CisgICAgcmV0dXJuIExvYWRNYXNrRElCKHBTb2Z0TWFzayk7CisgIH0KKworICBpZiAoQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBUb1N0cmVhbShtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoIk1hc2siKSkpCisgICAgcmV0dXJuIExvYWRNYXNrRElCKHBTdHJlYW0pOworCisgIHJldHVybiBudWxscHRyOworfQoraW50IENQREZfRElCU291cmNlOjpTdHJhdExvYWRNYXNrKCkgeworICBtX01hdHRlQ29sb3IgPSAwWEZGRkZGRkZGOworICBtX3BNYXNrU3RyZWFtID0gbV9wRGljdC0+R2V0U3RyZWFtKCJTTWFzayIpOworICBpZiAobV9wTWFza1N0cmVhbSkgeworICAgIENQREZfQXJyYXkqIHBNYXR0ZSA9IG1fcE1hc2tTdHJlYW0tPkdldERpY3QoKS0+R2V0QXJyYXkoIk1hdHRlIik7CisgICAgaWYgKHBNYXR0ZSAmJiBtX3BDb2xvclNwYWNlICYmCisgICAgICAgIChGWF9EV09SRCltX3BDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKSA8PSBtX25Db21wb25lbnRzKSB7CisgICAgICBGWF9GTE9BVCBSLCBHLCBCOworICAgICAgRlhfRkxPQVQqIHBDb2xvciA9IEZYX0FsbG9jKEZYX0ZMT0FULCBtX25Db21wb25lbnRzKTsKKyAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBtX25Db21wb25lbnRzOyBpKyspIHsKKyAgICAgICAgcENvbG9yW2ldID0gcE1hdHRlLT5HZXRGbG9hdChpKTsKKyAgICAgIH0KKyAgICAgIG1fcENvbG9yU3BhY2UtPkdldFJHQihwQ29sb3IsIFIsIEcsIEIpOworICAgICAgRlhfRnJlZShwQ29sb3IpOworICAgICAgbV9NYXR0ZUNvbG9yID0gRlhBUkdCX01BS0UoMCwgRlhTWVNfcm91bmQoUiAqIDI1NSksIEZYU1lTX3JvdW5kKEcgKiAyNTUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQoQiAqIDI1NSkpOworICAgIH0KKyAgICByZXR1cm4gU3RhcnRMb2FkTWFza0RJQigpOworICB9CisKKyAgbV9wTWFza1N0cmVhbSA9IFRvU3RyZWFtKG1fcERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiTWFzayIpKTsKKyAgcmV0dXJuIG1fcE1hc2tTdHJlYW0gPyBTdGFydExvYWRNYXNrRElCKCkgOiAxOworfQoraW50IENQREZfRElCU291cmNlOjpDb250aW51ZUxvYWRNYXNrRElCKElGWF9QYXVzZSogcFBhdXNlKSB7CisgIGlmICghbV9wTWFzaykgeworICAgIHJldHVybiAxOworICB9CisgIGludCByZXQgPSBtX3BNYXNrLT5Db250aW51ZUxvYWRESUJTb3VyY2UocFBhdXNlKTsKKyAgaWYgKHJldCA9PSAyKSB7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICBpZiAobV9wQ29sb3JTcGFjZSAmJiBtX2JTdGRDUykgeworICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24oRkFMU0UpOworICB9CisgIGlmICghcmV0KSB7CisgICAgZGVsZXRlIG1fcE1hc2s7CisgICAgbV9wTWFzayA9IE5VTEw7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICByZXR1cm4gMTsKK30KK0NQREZfRElCU291cmNlKiBDUERGX0RJQlNvdXJjZTo6RGV0YWNoTWFzaygpIHsKKyAgQ1BERl9ESUJTb3VyY2UqIHBESUJTb3VyY2UgPSBtX3BNYXNrOworICBtX3BNYXNrID0gTlVMTDsKKyAgcmV0dXJuIHBESUJTb3VyY2U7Cit9CitDUERGX0RJQlNvdXJjZSogQ1BERl9ESUJTb3VyY2U6OkxvYWRNYXNrRElCKENQREZfU3RyZWFtKiBwTWFzaykgeworICBDUERGX0RJQlNvdXJjZSogcE1hc2tTb3VyY2UgPSBuZXcgQ1BERl9ESUJTb3VyY2U7CisgIGlmICghcE1hc2tTb3VyY2UtPkxvYWQobV9wRG9jdW1lbnQsIHBNYXNrLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBUUlVFKSkgeworICAgIGRlbGV0ZSBwTWFza1NvdXJjZTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gcE1hc2tTb3VyY2U7Cit9CitpbnQgQ1BERl9ESUJTb3VyY2U6OlN0YXJ0TG9hZE1hc2tESUIoKSB7CisgIG1fcE1hc2sgPSBuZXcgQ1BERl9ESUJTb3VyY2U7CisgIGludCByZXQgPSBtX3BNYXNrLT5TdGFydExvYWRESUJTb3VyY2UobV9wRG9jdW1lbnQsIG1fcE1hc2tTdHJlYW0sIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIG51bGxwdHIsIFRSVUUpOworICBpZiAocmV0ID09IDIpIHsKKyAgICBpZiAobV9TdGF0dXMgPT0gMCkKKyAgICAgIG1fU3RhdHVzID0gMjsKKyAgICByZXR1cm4gMjsKKyAgfQorICBpZiAoIXJldCkgeworICAgIGRlbGV0ZSBtX3BNYXNrOworICAgIG1fcE1hc2sgPSBudWxscHRyOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAxOworfQordm9pZCBDUERGX0RJQlNvdXJjZTo6TG9hZFBhbGV0dGUoKSB7CisgIGlmIChtX2JwYyA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX2JwYyAqIG1fbkNvbXBvbmVudHMgPiA4KSB7CisgICAgcmV0dXJuOworICB9CisgIGlmICghbV9wQ29sb3JTcGFjZSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9icGMgKiBtX25Db21wb25lbnRzID09IDEpIHsKKyAgICBpZiAobV9iRGVmYXVsdERlY29kZSAmJgorICAgICAgICAobV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFR1JBWSB8fCBtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VSR0IpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChtX3BDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKSA+IDMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgRlhfRkxPQVQgY29sb3JfdmFsdWVzWzNdOworICAgIGNvbG9yX3ZhbHVlc1swXSA9IG1fcENvbXBEYXRhWzBdLm1fRGVjb2RlTWluOworICAgIGNvbG9yX3ZhbHVlc1sxXSA9IGNvbG9yX3ZhbHVlc1syXSA9IGNvbG9yX3ZhbHVlc1swXTsKKyAgICBGWF9GTE9BVCBSID0gMC4wZiwgRyA9IDAuMGYsIEIgPSAwLjBmOworICAgIG1fcENvbG9yU3BhY2UtPkdldFJHQihjb2xvcl92YWx1ZXMsIFIsIEcsIEIpOworICAgIEZYX0FSR0IgYXJnYjAgPSBBcmdiRW5jb2RlKDI1NSwgRlhTWVNfcm91bmQoUiAqIDI1NSksIEZYU1lTX3JvdW5kKEcgKiAyNTUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKEIgKiAyNTUpKTsKKyAgICBjb2xvcl92YWx1ZXNbMF0gKz0gbV9wQ29tcERhdGFbMF0ubV9EZWNvZGVTdGVwOworICAgIGNvbG9yX3ZhbHVlc1sxXSArPSBtX3BDb21wRGF0YVswXS5tX0RlY29kZVN0ZXA7CisgICAgY29sb3JfdmFsdWVzWzJdICs9IG1fcENvbXBEYXRhWzBdLm1fRGVjb2RlU3RlcDsKKyAgICBtX3BDb2xvclNwYWNlLT5HZXRSR0IoY29sb3JfdmFsdWVzLCBSLCBHLCBCKTsKKyAgICBGWF9BUkdCIGFyZ2IxID0gQXJnYkVuY29kZSgyNTUsIEZYU1lTX3JvdW5kKFIgKiAyNTUpLCBGWFNZU19yb3VuZChHICogMjU1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChCICogMjU1KSk7CisgICAgaWYgKGFyZ2IwICE9IDB4RkYwMDAwMDAgfHwgYXJnYjEgIT0gMHhGRkZGRkZGRikgeworICAgICAgU2V0UGFsZXR0ZUFyZ2IoMCwgYXJnYjApOworICAgICAgU2V0UGFsZXR0ZUFyZ2IoMSwgYXJnYjEpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fcENvbG9yU3BhY2UgPT0gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRUdSQVkpICYmCisgICAgICBtX2JwYyA9PSA4ICYmIG1fYkRlZmF1bHREZWNvZGUpIHsKKyAgfSBlbHNlIHsKKyAgICBpbnQgcGFsZXR0ZV9jb3VudCA9IDEgPDwgKG1fYnBjICogbV9uQ29tcG9uZW50cyk7CisgICAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IGNvbG9yX3ZhbHVlcyhtX25Db21wb25lbnRzKTsKKyAgICBGWF9GTE9BVCogY29sb3JfdmFsdWUgPSBjb2xvcl92YWx1ZXM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWxldHRlX2NvdW50OyBpKyspIHsKKyAgICAgIGludCBjb2xvcl9kYXRhID0gaTsKKyAgICAgIGZvciAoRlhfRFdPUkQgaiA9IDA7IGogPCBtX25Db21wb25lbnRzOyBqKyspIHsKKyAgICAgICAgaW50IGVuY29kZWRfY29tcG9uZW50ID0gY29sb3JfZGF0YSAlICgxIDw8IG1fYnBjKTsKKyAgICAgICAgY29sb3JfZGF0YSAvPSAxIDw8IG1fYnBjOworICAgICAgICBjb2xvcl92YWx1ZVtqXSA9IG1fcENvbXBEYXRhW2pdLm1fRGVjb2RlTWluICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDb21wRGF0YVtqXS5tX0RlY29kZVN0ZXAgKiBlbmNvZGVkX2NvbXBvbmVudDsKKyAgICAgIH0KKyAgICAgIEZYX0ZMT0FUIFIgPSAwLCBHID0gMCwgQiA9IDA7CisgICAgICBpZiAobV9uQ29tcG9uZW50cyA9PSAxICYmIG1fRmFtaWx5ID09IFBERkNTX0lDQ0JBU0VEICYmCisgICAgICAgICAgbV9wQ29sb3JTcGFjZS0+Q291bnRDb21wb25lbnRzKCkgPiAxKSB7CisgICAgICAgIGludCBuQ29tcG9uZW50cyA9IG1fcENvbG9yU3BhY2UtPkNvdW50Q29tcG9uZW50cygpOworICAgICAgICBGWF9GTE9BVCogdGVtcF9idWYgPSBGWF9BbGxvYyhGWF9GTE9BVCwgbkNvbXBvbmVudHMpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Db21wb25lbnRzOyBpKyspIHsKKyAgICAgICAgICB0ZW1wX2J1ZltpXSA9ICpjb2xvcl92YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBtX3BDb2xvclNwYWNlLT5HZXRSR0IodGVtcF9idWYsIFIsIEcsIEIpOworICAgICAgICBGWF9GcmVlKHRlbXBfYnVmKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fcENvbG9yU3BhY2UtPkdldFJHQihjb2xvcl92YWx1ZSwgUiwgRywgQik7CisgICAgICB9CisgICAgICBTZXRQYWxldHRlQXJnYihpLCBBcmdiRW5jb2RlKDI1NSwgRlhTWVNfcm91bmQoUiAqIDI1NSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKEcgKiAyNTUpLCBGWFNZU19yb3VuZChCICogMjU1KSkpOworICAgIH0KKyAgfQorfQorCit2b2lkIENQREZfRElCU291cmNlOjpWYWxpZGF0ZURpY3RQYXJhbSgpIHsKKyAgbV9icGMgPSBtX2JwY19vcmlnOworICBDUERGX09iamVjdCogcEZpbHRlciA9IG1fcERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiRmlsdGVyIik7CisgIGlmIChwRmlsdGVyKSB7CisgICAgaWYgKHBGaWx0ZXItPklzTmFtZSgpKSB7CisgICAgICBDRlhfQnl0ZVN0cmluZyBmaWx0ZXIgPSBwRmlsdGVyLT5HZXRTdHJpbmcoKTsKKyAgICAgIGlmIChmaWx0ZXIgPT0gIkNDSVRURmF4RGVjb2RlIiB8fCBmaWx0ZXIgPT0gIkpCSUcyRGVjb2RlIikgeworICAgICAgICBtX2JwYyA9IDE7CisgICAgICAgIG1fbkNvbXBvbmVudHMgPSAxOworICAgICAgfSBlbHNlIGlmIChmaWx0ZXIgPT0gIlJ1bkxlbmd0aERlY29kZSIpIHsKKyAgICAgICAgaWYgKG1fYnBjICE9IDEpIHsKKyAgICAgICAgICBtX2JwYyA9IDg7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoZmlsdGVyID09ICJEQ1REZWNvZGUiKSB7CisgICAgICAgIG1fYnBjID0gODsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKENQREZfQXJyYXkqIHBBcnJheSA9IHBGaWx0ZXItPkFzQXJyYXkoKSkgeworICAgICAgQ0ZYX0J5dGVTdHJpbmcgZmlsdGVyID0gcEFycmF5LT5HZXRTdHJpbmcocEFycmF5LT5HZXRDb3VudCgpIC0gMSk7CisgICAgICBpZiAoZmlsdGVyID09ICJDQ0lUVEZheERlY29kZSIgfHwgZmlsdGVyID09ICJKQklHMkRlY29kZSIpIHsKKyAgICAgICAgbV9icGMgPSAxOworICAgICAgICBtX25Db21wb25lbnRzID0gMTsKKyAgICAgIH0gZWxzZSBpZiAoZmlsdGVyID09ICJEQ1REZWNvZGUiKSB7CisgICAgICAgIC8vIFByZXZpb3VzbHksIGZpbHRlciA9PSAiUnVuTGVuZ3RoRGVjb2RlIiB3YXMgY2hlY2tlZCBpbiB0aGUgImlmIgorICAgICAgICAvLyBzdGF0ZW1lbnQgYXMgd2VsbCwgYnV0IHRvbyBtYW55IGRvY3VtZW50cyBkb24ndCBjb25mb3JtIHRvIGl0LgorICAgICAgICBtX2JwYyA9IDg7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKCFJc0FsbG93ZWRCUENWYWx1ZShtX2JwYykpCisgICAgbV9icGMgPSAwOworfQorCisjZGVmaW5lIE5PUk1BTENPTE9SX01BWChjb2xvciwgbWF4KSBcCisgIChjb2xvcikgPiAobWF4KSA/IChtYXgpIDogKGNvbG9yKSA8IDAgPyAwIDogKGNvbG9yKTsKK3ZvaWQgQ1BERl9ESUJTb3VyY2U6OlRyYW5zbGF0ZVNjYW5saW5lMjRicHAodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbikgY29uc3QgeworICBpZiAobV9icGMgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBpbnQgbWF4X2RhdGEgPSAoMSA8PCBtX2JwYykgLSAxOworICBpZiAobV9iRGVmYXVsdERlY29kZSkgeworICAgIGlmIChtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VSR0IgfHwgbV9GYW1pbHkgPT0gUERGQ1NfQ0FMUkdCKSB7CisgICAgICBjb25zdCB1aW50OF90KiBzcmNfcG9zID0gc3JjX3NjYW47CisgICAgICBzd2l0Y2ggKG1fYnBjKSB7CisgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19wb3NbNF07CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfcG9zWzJdOworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19wb3M7CisgICAgICAgICAgICBzcmNfcG9zICs9IDY7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgZm9yIChpbnQgY29sdW1uID0gMDsgY29sdW1uIDwgbV9XaWR0aDsgY29sdW1uKyspIHsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19wb3NbMl07CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfcG9zWzFdOworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19wb3M7CisgICAgICAgICAgICBzcmNfcG9zICs9IDM7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGludCBzcmNfYml0X3BvcyA9IDA7CisgICAgICAgICAgaW50IGRlc3RfYnl0ZV9wb3MgPSAwOworICAgICAgICAgIGZvciAoaW50IGNvbHVtbiA9IDA7IGNvbHVtbiA8IG1fV2lkdGg7IGNvbHVtbisrKSB7CisgICAgICAgICAgICBpbnQgUiA9IEdldEJpdHM4KHNyY19zY2FuLCBzcmNfYml0X3BvcywgbV9icGMpOworICAgICAgICAgICAgc3JjX2JpdF9wb3MgKz0gbV9icGM7CisgICAgICAgICAgICBpbnQgRyA9IEdldEJpdHM4KHNyY19zY2FuLCBzcmNfYml0X3BvcywgbV9icGMpOworICAgICAgICAgICAgc3JjX2JpdF9wb3MgKz0gbV9icGM7CisgICAgICAgICAgICBpbnQgQiA9IEdldEJpdHM4KHNyY19zY2FuLCBzcmNfYml0X3BvcywgbV9icGMpOworICAgICAgICAgICAgc3JjX2JpdF9wb3MgKz0gbV9icGM7CisgICAgICAgICAgICBSID0gTk9STUFMQ09MT1JfTUFYKFIsIG1heF9kYXRhKTsKKyAgICAgICAgICAgIEcgPSBOT1JNQUxDT0xPUl9NQVgoRywgbWF4X2RhdGEpOworICAgICAgICAgICAgQiA9IE5PUk1BTENPTE9SX01BWChCLCBtYXhfZGF0YSk7CisgICAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9ieXRlX3Bvc10gPSBCICogMjU1IC8gbWF4X2RhdGE7CisgICAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9ieXRlX3BvcyArIDFdID0gRyAqIDI1NSAvIG1heF9kYXRhOworICAgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfYnl0ZV9wb3MgKyAyXSA9IFIgKiAyNTUgLyBtYXhfZGF0YTsKKyAgICAgICAgICAgIGRlc3RfYnl0ZV9wb3MgKz0gMzsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChtX2JwYyA9PSA4KSB7CisgICAgICBpZiAobV9uQ29tcG9uZW50cyA9PSBtX3BDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKSkKKyAgICAgICAgbV9wQ29sb3JTcGFjZS0+VHJhbnNsYXRlSW1hZ2VMaW5lKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fV2lkdGgsIG1fV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0hlaWdodCwgVHJhbnNNYXNrKCkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCAxNj4gY29sb3JfdmFsdWVzMShtX25Db21wb25lbnRzKTsKKyAgRlhfRkxPQVQqIGNvbG9yX3ZhbHVlcyA9IGNvbG9yX3ZhbHVlczE7CisgIEZYX0ZMT0FUIFIgPSAwLjBmLCBHID0gMC4wZiwgQiA9IDAuMGY7CisgIGlmIChtX2JwYyA9PSA4KSB7CisgICAgaW50IHNyY19ieXRlX3BvcyA9IDA7CisgICAgaW50IGRlc3RfYnl0ZV9wb3MgPSAwOworICAgIGZvciAoaW50IGNvbHVtbiA9IDA7IGNvbHVtbiA8IG1fV2lkdGg7IGNvbHVtbisrKSB7CisgICAgICBmb3IgKEZYX0RXT1JEIGNvbG9yID0gMDsgY29sb3IgPCBtX25Db21wb25lbnRzOyBjb2xvcisrKSB7CisgICAgICAgIGludCBkYXRhID0gc3JjX3NjYW5bc3JjX2J5dGVfcG9zKytdOworICAgICAgICBjb2xvcl92YWx1ZXNbY29sb3JdID0gbV9wQ29tcERhdGFbY29sb3JdLm1fRGVjb2RlTWluICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcENvbXBEYXRhW2NvbG9yXS5tX0RlY29kZVN0ZXAgKiBkYXRhOworICAgICAgfQorICAgICAgaWYgKFRyYW5zTWFzaygpKSB7CisgICAgICAgIEZYX0ZMT0FUIGsgPSAxLjBmIC0gY29sb3JfdmFsdWVzWzNdOworICAgICAgICBSID0gKDEuMGYgLSBjb2xvcl92YWx1ZXNbMF0pICogazsKKyAgICAgICAgRyA9ICgxLjBmIC0gY29sb3JfdmFsdWVzWzFdKSAqIGs7CisgICAgICAgIEIgPSAoMS4wZiAtIGNvbG9yX3ZhbHVlc1syXSkgKiBrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbV9wQ29sb3JTcGFjZS0+R2V0UkdCKGNvbG9yX3ZhbHVlcywgUiwgRywgQik7CisgICAgICB9CisgICAgICBSID0gTk9STUFMQ09MT1JfTUFYKFIsIDEpOworICAgICAgRyA9IE5PUk1BTENPTE9SX01BWChHLCAxKTsKKyAgICAgIEIgPSBOT1JNQUxDT0xPUl9NQVgoQiwgMSk7CisgICAgICBkZXN0X3NjYW5bZGVzdF9ieXRlX3Bvc10gPSAoaW50MzJfdCkoQiAqIDI1NSk7CisgICAgICBkZXN0X3NjYW5bZGVzdF9ieXRlX3BvcyArIDFdID0gKGludDMyX3QpKEcgKiAyNTUpOworICAgICAgZGVzdF9zY2FuW2Rlc3RfYnl0ZV9wb3MgKyAyXSA9IChpbnQzMl90KShSICogMjU1KTsKKyAgICAgIGRlc3RfYnl0ZV9wb3MgKz0gMzsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW50IHNyY19iaXRfcG9zID0gMDsKKyAgICBpbnQgZGVzdF9ieXRlX3BvcyA9IDA7CisgICAgZm9yIChpbnQgY29sdW1uID0gMDsgY29sdW1uIDwgbV9XaWR0aDsgY29sdW1uKyspIHsKKyAgICAgIGZvciAoRlhfRFdPUkQgY29sb3IgPSAwOyBjb2xvciA8IG1fbkNvbXBvbmVudHM7IGNvbG9yKyspIHsKKyAgICAgICAgaW50IGRhdGEgPSBHZXRCaXRzOChzcmNfc2Nhbiwgc3JjX2JpdF9wb3MsIG1fYnBjKTsKKyAgICAgICAgY29sb3JfdmFsdWVzW2NvbG9yXSA9IG1fcENvbXBEYXRhW2NvbG9yXS5tX0RlY29kZU1pbiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDb21wRGF0YVtjb2xvcl0ubV9EZWNvZGVTdGVwICogZGF0YTsKKyAgICAgICAgc3JjX2JpdF9wb3MgKz0gbV9icGM7CisgICAgICB9CisgICAgICBpZiAoVHJhbnNNYXNrKCkpIHsKKyAgICAgICAgRlhfRkxPQVQgayA9IDEuMGYgLSBjb2xvcl92YWx1ZXNbM107CisgICAgICAgIFIgPSAoMS4wZiAtIGNvbG9yX3ZhbHVlc1swXSkgKiBrOworICAgICAgICBHID0gKDEuMGYgLSBjb2xvcl92YWx1ZXNbMV0pICogazsKKyAgICAgICAgQiA9ICgxLjBmIC0gY29sb3JfdmFsdWVzWzJdKSAqIGs7CisgICAgICB9IGVsc2UgeworICAgICAgICBtX3BDb2xvclNwYWNlLT5HZXRSR0IoY29sb3JfdmFsdWVzLCBSLCBHLCBCKTsKKyAgICAgIH0KKyAgICAgIFIgPSBOT1JNQUxDT0xPUl9NQVgoUiwgMSk7CisgICAgICBHID0gTk9STUFMQ09MT1JfTUFYKEcsIDEpOworICAgICAgQiA9IE5PUk1BTENPTE9SX01BWChCLCAxKTsKKyAgICAgIGRlc3Rfc2NhbltkZXN0X2J5dGVfcG9zXSA9IChpbnQzMl90KShCICogMjU1KTsKKyAgICAgIGRlc3Rfc2NhbltkZXN0X2J5dGVfcG9zICsgMV0gPSAoaW50MzJfdCkoRyAqIDI1NSk7CisgICAgICBkZXN0X3NjYW5bZGVzdF9ieXRlX3BvcyArIDJdID0gKGludDMyX3QpKFIgKiAyNTUpOworICAgICAgZGVzdF9ieXRlX3BvcyArPSAzOworICAgIH0KKyAgfQorfQordWludDhfdCogQ1BERl9ESUJTb3VyY2U6OkdldEJ1ZmZlcigpIGNvbnN0IHsKKyAgaWYgKG1fcENhY2hlZEJpdG1hcCkgeworICAgIHJldHVybiBtX3BDYWNoZWRCaXRtYXAtPkdldEJ1ZmZlcigpOworICB9CisgIHJldHVybiBOVUxMOworfQorY29uc3QgdWludDhfdCogQ1BERl9ESUJTb3VyY2U6OkdldFNjYW5saW5lKGludCBsaW5lKSBjb25zdCB7CisgIGlmIChtX2JwYyA9PSAwKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgRlhfU0FGRV9EV09SRCBzcmNfcGl0Y2ggPSBDYWxjdWxhdGVQaXRjaDgobV9icGMsIG1fbkNvbXBvbmVudHMsIG1fV2lkdGgpOworICBpZiAoIXNyY19waXRjaC5Jc1ZhbGlkKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIEZYX0RXT1JEIHNyY19waXRjaF92YWx1ZSA9IHNyY19waXRjaC5WYWx1ZU9yRGllKCk7CisgIGNvbnN0IHVpbnQ4X3QqIHBTcmNMaW5lID0gbnVsbHB0cjsKKyAgaWYgKG1fcENhY2hlZEJpdG1hcCAmJiBzcmNfcGl0Y2hfdmFsdWUgPD0gbV9wQ2FjaGVkQml0bWFwLT5HZXRQaXRjaCgpKSB7CisgICAgaWYgKGxpbmUgPj0gbV9wQ2FjaGVkQml0bWFwLT5HZXRIZWlnaHQoKSkgeworICAgICAgbGluZSA9IG1fcENhY2hlZEJpdG1hcC0+R2V0SGVpZ2h0KCkgLSAxOworICAgIH0KKyAgICBwU3JjTGluZSA9IG1fcENhY2hlZEJpdG1hcC0+R2V0U2NhbmxpbmUobGluZSk7CisgIH0gZWxzZSBpZiAobV9wRGVjb2RlcikgeworICAgIHBTcmNMaW5lID0gbV9wRGVjb2Rlci0+R2V0U2NhbmxpbmUobGluZSk7CisgIH0gZWxzZSB7CisgICAgaWYgKG1fcFN0cmVhbUFjYy0+R2V0U2l6ZSgpID49IChsaW5lICsgMSkgKiBzcmNfcGl0Y2hfdmFsdWUpIHsKKyAgICAgIHBTcmNMaW5lID0gbV9wU3RyZWFtQWNjLT5HZXREYXRhKCkgKyBsaW5lICogc3JjX3BpdGNoX3ZhbHVlOworICAgIH0KKyAgfQorICBpZiAoIXBTcmNMaW5lKSB7CisgICAgdWludDhfdCogcExpbmVCdWYgPSBtX3BNYXNrZWRMaW5lID8gbV9wTWFza2VkTGluZSA6IG1fcExpbmVCdWY7CisgICAgRlhTWVNfbWVtc2V0KHBMaW5lQnVmLCAweEZGLCBtX1BpdGNoKTsKKyAgICByZXR1cm4gcExpbmVCdWY7CisgIH0KKyAgaWYgKG1fYnBjICogbV9uQ29tcG9uZW50cyA9PSAxKSB7CisgICAgaWYgKG1fYkltYWdlTWFzayAmJiBtX2JEZWZhdWx0RGVjb2RlKSB7CisgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgc3JjX3BpdGNoX3ZhbHVlOyBpKyspIHsKKyAgICAgICAgbV9wTGluZUJ1ZltpXSA9IH5wU3JjTGluZVtpXTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1fYkNvbG9yS2V5KSB7CisgICAgICBGWF9EV09SRCByZXNldF9hcmdiLCBzZXRfYXJnYjsKKyAgICAgIHJlc2V0X2FyZ2IgPSBtX3BQYWxldHRlID8gbV9wUGFsZXR0ZVswXSA6IDB4RkYwMDAwMDA7CisgICAgICBzZXRfYXJnYiA9IG1fcFBhbGV0dGUgPyBtX3BQYWxldHRlWzFdIDogMHhGRkZGRkZGRjsKKyAgICAgIGlmIChtX3BDb21wRGF0YVswXS5tX0NvbG9yS2V5TWluID09IDApIHsKKyAgICAgICAgcmVzZXRfYXJnYiA9IDA7CisgICAgICB9CisgICAgICBpZiAobV9wQ29tcERhdGFbMF0ubV9Db2xvcktleU1heCA9PSAxKSB7CisgICAgICAgIHNldF9hcmdiID0gMDsKKyAgICAgIH0KKyAgICAgIHNldF9hcmdiID0gRlhBUkdCX1RPRElCKHNldF9hcmdiKTsKKyAgICAgIHJlc2V0X2FyZ2IgPSBGWEFSR0JfVE9ESUIocmVzZXRfYXJnYik7CisgICAgICBGWF9EV09SRCogZGVzdF9zY2FuID0gKEZYX0RXT1JEKiltX3BNYXNrZWRMaW5lOworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgaWYgKHBTcmNMaW5lW2NvbCAvIDhdICYgKDEgPDwgKDcgLSBjb2wgJSA4KSkpIHsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gc2V0X2FyZ2I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IHJlc2V0X2FyZ2I7CisgICAgICAgIH0KKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICB9CisgICAgICByZXR1cm4gbV9wTWFza2VkTGluZTsKKyAgICB9IGVsc2UgeworICAgICAgRlhTWVNfbWVtY3B5KG1fcExpbmVCdWYsIHBTcmNMaW5lLCBzcmNfcGl0Y2hfdmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gbV9wTGluZUJ1ZjsKKyAgfQorICBpZiAobV9icGMgKiBtX25Db21wb25lbnRzIDw9IDgpIHsKKyAgICBpZiAobV9icGMgPT0gOCkgeworICAgICAgRlhTWVNfbWVtY3B5KG1fcExpbmVCdWYsIHBTcmNMaW5lLCBzcmNfcGl0Y2hfdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICBpbnQgc3JjX2JpdF9wb3MgPSAwOworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgaW50IGNvbG9yX2luZGV4ID0gMDsKKyAgICAgICAgZm9yIChGWF9EV09SRCBjb2xvciA9IDA7IGNvbG9yIDwgbV9uQ29tcG9uZW50czsgY29sb3IrKykgeworICAgICAgICAgIGludCBkYXRhID0gR2V0Qml0czgocFNyY0xpbmUsIHNyY19iaXRfcG9zLCBtX2JwYyk7CisgICAgICAgICAgY29sb3JfaW5kZXggfD0gZGF0YSA8PCAoY29sb3IgKiBtX2JwYyk7CisgICAgICAgICAgc3JjX2JpdF9wb3MgKz0gbV9icGM7CisgICAgICAgIH0KKyAgICAgICAgbV9wTGluZUJ1Zltjb2xdID0gY29sb3JfaW5kZXg7CisgICAgICB9CisgICAgfQorICAgIGlmIChtX2JDb2xvcktleSkgeworICAgICAgdWludDhfdCogcERlc3RQaXhlbCA9IG1fcE1hc2tlZExpbmU7CisgICAgICBjb25zdCB1aW50OF90KiBwU3JjUGl4ZWwgPSBtX3BMaW5lQnVmOworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgdWludDhfdCBpbmRleCA9ICpwU3JjUGl4ZWwrKzsKKyAgICAgICAgaWYgKG1fcFBhbGV0dGUpIHsKKyAgICAgICAgICAqcERlc3RQaXhlbCsrID0gRlhBUkdCX0IobV9wUGFsZXR0ZVtpbmRleF0pOworICAgICAgICAgICpwRGVzdFBpeGVsKysgPSBGWEFSR0JfRyhtX3BQYWxldHRlW2luZGV4XSk7CisgICAgICAgICAgKnBEZXN0UGl4ZWwrKyA9IEZYQVJHQl9SKG1fcFBhbGV0dGVbaW5kZXhdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAqcERlc3RQaXhlbCsrID0gaW5kZXg7CisgICAgICAgICAgKnBEZXN0UGl4ZWwrKyA9IGluZGV4OworICAgICAgICAgICpwRGVzdFBpeGVsKysgPSBpbmRleDsKKyAgICAgICAgfQorICAgICAgICAqcERlc3RQaXhlbCA9IChpbmRleCA8IG1fcENvbXBEYXRhWzBdLm1fQ29sb3JLZXlNaW4gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPiBtX3BDb21wRGF0YVswXS5tX0NvbG9yS2V5TWF4KQorICAgICAgICAgICAgICAgICAgICAgICAgICA/IDB4RkYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwOworICAgICAgICBwRGVzdFBpeGVsKys7CisgICAgICB9CisgICAgICByZXR1cm4gbV9wTWFza2VkTGluZTsKKyAgICB9CisgICAgcmV0dXJuIG1fcExpbmVCdWY7CisgIH0KKyAgaWYgKG1fYkNvbG9yS2V5KSB7CisgICAgaWYgKG1fbkNvbXBvbmVudHMgPT0gMyAmJiBtX2JwYyA9PSA4KSB7CisgICAgICB1aW50OF90KiBhbHBoYV9jaGFubmVsID0gbV9wTWFza2VkTGluZSArIDM7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgeworICAgICAgICBjb25zdCB1aW50OF90KiBwUGl4ZWwgPSBwU3JjTGluZSArIGNvbCAqIDM7CisgICAgICAgIGFscGhhX2NoYW5uZWxbY29sICogNF0gPSAocFBpeGVsWzBdIDwgbV9wQ29tcERhdGFbMF0ubV9Db2xvcktleU1pbiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXhlbFswXSA+IG1fcENvbXBEYXRhWzBdLm1fQ29sb3JLZXlNYXggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGl4ZWxbMV0gPCBtX3BDb21wRGF0YVsxXS5tX0NvbG9yS2V5TWluIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBpeGVsWzFdID4gbV9wQ29tcERhdGFbMV0ubV9Db2xvcktleU1heCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaXhlbFsyXSA8IG1fcENvbXBEYXRhWzJdLm1fQ29sb3JLZXlNaW4gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGl4ZWxbMl0gPiBtX3BDb21wRGF0YVsyXS5tX0NvbG9yS2V5TWF4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMHhGRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgRlhTWVNfbWVtc2V0KG1fcE1hc2tlZExpbmUsIDB4RkYsIG1fUGl0Y2gpOworICAgIH0KKyAgfQorICBpZiAobV9wQ29sb3JTcGFjZSkgeworICAgIFRyYW5zbGF0ZVNjYW5saW5lMjRicHAobV9wTGluZUJ1ZiwgcFNyY0xpbmUpOworICAgIHBTcmNMaW5lID0gbV9wTGluZUJ1ZjsKKyAgfQorICBpZiAobV9iQ29sb3JLZXkpIHsKKyAgICBjb25zdCB1aW50OF90KiBwU3JjUGl4ZWwgPSBwU3JjTGluZTsKKyAgICB1aW50OF90KiBwRGVzdFBpeGVsID0gbV9wTWFza2VkTGluZTsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgeworICAgICAgKnBEZXN0UGl4ZWwrKyA9ICpwU3JjUGl4ZWwrKzsKKyAgICAgICpwRGVzdFBpeGVsKysgPSAqcFNyY1BpeGVsKys7CisgICAgICAqcERlc3RQaXhlbCsrID0gKnBTcmNQaXhlbCsrOworICAgICAgcERlc3RQaXhlbCsrOworICAgIH0KKyAgICByZXR1cm4gbV9wTWFza2VkTGluZTsKKyAgfQorICByZXR1cm4gcFNyY0xpbmU7Cit9CisKK0ZYX0JPT0wgQ1BERl9ESUJTb3VyY2U6OlNraXBUb1NjYW5saW5lKGludCBsaW5lLCBJRlhfUGF1c2UqIHBQYXVzZSkgY29uc3QgeworICByZXR1cm4gbV9wRGVjb2RlciAmJiBtX3BEZWNvZGVyLT5Ta2lwVG9TY2FubGluZShsaW5lLCBwUGF1c2UpOworfQorCit2b2lkIENQREZfRElCU291cmNlOjpEb3duU2FtcGxlU2NhbmxpbmUoaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGbGlwWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3dpZHRoKSBjb25zdCB7CisgIGlmIChsaW5lIDwgMCB8fCAhZGVzdF9zY2FuIHx8IGRlc3RfYnBwIDw9IDAgfHwgZGVzdF93aWR0aCA8PSAwIHx8CisgICAgICBjbGlwX2xlZnQgPCAwIHx8IGNsaXBfd2lkdGggPD0gMCkgeworICAgIHJldHVybjsKKyAgfQorCisgIEZYX0RXT1JEIHNyY193aWR0aCA9IG1fV2lkdGg7CisgIEZYX1NBRkVfRFdPUkQgcGl0Y2ggPSBDYWxjdWxhdGVQaXRjaDgobV9icGMsIG1fbkNvbXBvbmVudHMsIG1fV2lkdGgpOworICBpZiAoIXBpdGNoLklzVmFsaWQoKSkKKyAgICByZXR1cm47CisKKyAgY29uc3QgdWludDhfdCogcFNyY0xpbmUgPSBudWxscHRyOworICBpZiAobV9wQ2FjaGVkQml0bWFwKSB7CisgICAgcFNyY0xpbmUgPSBtX3BDYWNoZWRCaXRtYXAtPkdldFNjYW5saW5lKGxpbmUpOworICB9IGVsc2UgaWYgKG1fcERlY29kZXIpIHsKKyAgICBwU3JjTGluZSA9IG1fcERlY29kZXItPkdldFNjYW5saW5lKGxpbmUpOworICB9IGVsc2UgeworICAgIEZYX0RXT1JEIHNyY19waXRjaCA9IHBpdGNoLlZhbHVlT3JEaWUoKTsKKyAgICBwaXRjaCAqPSAobGluZSArIDEpOwogICAgIGlmICghcGl0Y2guSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBGWF9MUENCWVRFIHBTcmNMaW5lID0gTlVMTDsKLSAgICBpZiAobV9wQ2FjaGVkQml0bWFwKSB7Ci0gICAgICAgIHBTcmNMaW5lID0gbV9wQ2FjaGVkQml0bWFwLT5HZXRTY2FubGluZShsaW5lKTsKLSAgICB9IGVsc2UgaWYgKG1fcERlY29kZXIpIHsKLSAgICAgICAgcFNyY0xpbmUgPSBtX3BEZWNvZGVyLT5HZXRTY2FubGluZShsaW5lKTsKKyAgICBpZiAobV9wU3RyZWFtQWNjLT5HZXRTaXplKCkgPj0gcGl0Y2guVmFsdWVPckRpZSgpKSB7CisgICAgICBwU3JjTGluZSA9IG1fcFN0cmVhbUFjYy0+R2V0RGF0YSgpICsgbGluZSAqIHNyY19waXRjaDsKKyAgICB9CisgIH0KKyAgaW50IG9yaWdfQnBwID0gbV9icGMgKiBtX25Db21wb25lbnRzIC8gODsKKyAgaW50IGRlc3RfQnBwID0gZGVzdF9icHAgLyA4OworICBpZiAoIXBTcmNMaW5lKSB7CisgICAgRlhTWVNfbWVtc2V0KGRlc3Rfc2NhbiwgMHhGRiwgZGVzdF9CcHAgKiBjbGlwX3dpZHRoKTsKKyAgICByZXR1cm47CisgIH0KKworICBGWF9TQUZFX0lOVDMyIG1heF9zcmNfeCA9IGNsaXBfbGVmdDsKKyAgbWF4X3NyY194ICs9IGNsaXBfd2lkdGggLSAxOworICBtYXhfc3JjX3ggKj0gc3JjX3dpZHRoOworICBtYXhfc3JjX3ggLz0gZGVzdF93aWR0aDsKKyAgaWYgKCFtYXhfc3JjX3guSXNWYWxpZCgpKQorICAgIHJldHVybjsKKworICBpZiAobV9icGMgKiBtX25Db21wb25lbnRzID09IDEpIHsKKyAgICBEb3duU2FtcGxlU2NhbmxpbmUxQml0KG9yaWdfQnBwLCBkZXN0X0JwcCwgc3JjX3dpZHRoLCBwU3JjTGluZSwgZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF93aWR0aCwgYkZsaXBYLCBjbGlwX2xlZnQsIGNsaXBfd2lkdGgpOworICB9IGVsc2UgaWYgKG1fYnBjICogbV9uQ29tcG9uZW50cyA8PSA4KSB7CisgICAgRG93blNhbXBsZVNjYW5saW5lOEJpdChvcmlnX0JwcCwgZGVzdF9CcHAsIHNyY193aWR0aCwgcFNyY0xpbmUsIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfd2lkdGgsIGJGbGlwWCwgY2xpcF9sZWZ0LCBjbGlwX3dpZHRoKTsKKyAgfSBlbHNlIHsKKyAgICBEb3duU2FtcGxlU2NhbmxpbmUzMkJpdChvcmlnX0JwcCwgZGVzdF9CcHAsIHNyY193aWR0aCwgcFNyY0xpbmUsIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3dpZHRoLCBiRmxpcFgsIGNsaXBfbGVmdCwgY2xpcF93aWR0aCk7CisgIH0KK30KKwordm9pZCBDUERGX0RJQlNvdXJjZTo6RG93blNhbXBsZVNjYW5saW5lMUJpdChpbnQgb3JpZ19CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwU3JjTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmxpcFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3dpZHRoKSBjb25zdCB7CisgIEZYX0RXT1JEIHNldF9hcmdiID0gKEZYX0RXT1JEKS0xOworICBGWF9EV09SRCByZXNldF9hcmdiID0gMDsKKyAgaWYgKG1fYkltYWdlTWFzaykgeworICAgIGlmIChtX2JEZWZhdWx0RGVjb2RlKSB7CisgICAgICBzZXRfYXJnYiA9IDA7CisgICAgICByZXNldF9hcmdiID0gKEZYX0RXT1JEKS0xOworICAgIH0KKyAgfSBlbHNlIGlmIChtX2JDb2xvcktleSkgeworICAgIHJlc2V0X2FyZ2IgPSBtX3BQYWxldHRlID8gbV9wUGFsZXR0ZVswXSA6IDB4RkYwMDAwMDA7CisgICAgc2V0X2FyZ2IgPSBtX3BQYWxldHRlID8gbV9wUGFsZXR0ZVsxXSA6IDB4RkZGRkZGRkY7CisgICAgaWYgKG1fcENvbXBEYXRhWzBdLm1fQ29sb3JLZXlNaW4gPT0gMCkgeworICAgICAgcmVzZXRfYXJnYiA9IDA7CisgICAgfQorICAgIGlmIChtX3BDb21wRGF0YVswXS5tX0NvbG9yS2V5TWF4ID09IDEpIHsKKyAgICAgIHNldF9hcmdiID0gMDsKKyAgICB9CisgICAgc2V0X2FyZ2IgPSBGWEFSR0JfVE9ESUIoc2V0X2FyZ2IpOworICAgIHJlc2V0X2FyZ2IgPSBGWEFSR0JfVE9ESUIocmVzZXRfYXJnYik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGlwX3dpZHRoOyBpKyspIHsKKyAgICAgIEZYX0RXT1JEIHNyY194ID0gKGNsaXBfbGVmdCArIGkpICogc3JjX3dpZHRoIC8gZGVzdF93aWR0aDsKKyAgICAgIGlmIChiRmxpcFgpIHsKKyAgICAgICAgc3JjX3ggPSBzcmNfd2lkdGggLSBzcmNfeCAtIDE7CisgICAgICB9CisgICAgICBzcmNfeCAlPSBzcmNfd2lkdGg7CisgICAgICBpZiAocFNyY0xpbmVbc3JjX3ggLyA4XSAmICgxIDw8ICg3IC0gc3JjX3ggJSA4KSkpIHsKKyAgICAgICAgKChGWF9EV09SRCopZGVzdF9zY2FuKVtpXSA9IHNldF9hcmdiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKChGWF9EV09SRCopZGVzdF9zY2FuKVtpXSA9IHJlc2V0X2FyZ2I7CisgICAgICB9CisgICAgfQorICAgIHJldHVybjsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZGVzdF9CcHAgPT0gMSkgeworICAgIH0gZWxzZSBpZiAobV9wUGFsZXR0ZSkgeworICAgICAgcmVzZXRfYXJnYiA9IG1fcFBhbGV0dGVbMF07CisgICAgICBzZXRfYXJnYiA9IG1fcFBhbGV0dGVbMV07CisgICAgfQorICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xpcF93aWR0aDsgaSsrKSB7CisgICAgRlhfRFdPUkQgc3JjX3ggPSAoY2xpcF9sZWZ0ICsgaSkgKiBzcmNfd2lkdGggLyBkZXN0X3dpZHRoOworICAgIGlmIChiRmxpcFgpIHsKKyAgICAgIHNyY194ID0gc3JjX3dpZHRoIC0gc3JjX3ggLSAxOworICAgIH0KKyAgICBzcmNfeCAlPSBzcmNfd2lkdGg7CisgICAgaW50IGRlc3RfcG9zID0gaSAqIGRlc3RfQnBwOworICAgIGlmIChwU3JjTGluZVtzcmNfeCAvIDhdICYgKDEgPDwgKDcgLSBzcmNfeCAlIDgpKSkgeworICAgICAgaWYgKGRlc3RfQnBwID09IDEpIHsKKyAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zXSA9ICh1aW50OF90KXNldF9hcmdiOworICAgICAgfSBlbHNlIGlmIChkZXN0X0JwcCA9PSAzKSB7CisgICAgICAgIGRlc3Rfc2NhbltkZXN0X3Bvc10gPSBGWEFSR0JfQihzZXRfYXJnYik7CisgICAgICAgIGRlc3Rfc2NhbltkZXN0X3BvcyArIDFdID0gRlhBUkdCX0coc2V0X2FyZ2IpOworICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3MgKyAyXSA9IEZYQVJHQl9SKHNldF9hcmdiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICooRlhfRFdPUkQqKShkZXN0X3NjYW4gKyBkZXN0X3BvcykgPSBzZXRfYXJnYjsKKyAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBGWF9EV09SRCBzcmNfcGl0Y2ggPSBwaXRjaC5WYWx1ZU9yRGllKCk7Ci0gICAgICAgIHBpdGNoICo9IChsaW5lKzEpOwotICAgICAgICBpZiAoIXBpdGNoLklzVmFsaWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOworICAgICAgaWYgKGRlc3RfQnBwID09IDEpIHsKKyAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zXSA9ICh1aW50OF90KXJlc2V0X2FyZ2I7CisgICAgICB9IGVsc2UgaWYgKGRlc3RfQnBwID09IDMpIHsKKyAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zXSA9IEZYQVJHQl9CKHJlc2V0X2FyZ2IpOworICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3MgKyAxXSA9IEZYQVJHQl9HKHJlc2V0X2FyZ2IpOworICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3MgKyAyXSA9IEZYQVJHQl9SKHJlc2V0X2FyZ2IpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKihGWF9EV09SRCopKGRlc3Rfc2NhbiArIGRlc3RfcG9zKSA9IHJlc2V0X2FyZ2I7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ1BERl9ESUJTb3VyY2U6OkRvd25TYW1wbGVTY2FubGluZThCaXQoaW50IG9yaWdfQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY193aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFNyY0xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZsaXBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF93aWR0aCkgY29uc3QgeworICBpZiAobV9icGMgPCA4KSB7CisgICAgaW50IHNyY19iaXRfcG9zID0gMDsKKyAgICBmb3IgKEZYX0RXT1JEIGNvbCA9IDA7IGNvbCA8IHNyY193aWR0aDsgY29sKyspIHsKKyAgICAgIGludCBjb2xvcl9pbmRleCA9IDA7CisgICAgICBmb3IgKEZYX0RXT1JEIGNvbG9yID0gMDsgY29sb3IgPCBtX25Db21wb25lbnRzOyBjb2xvcisrKSB7CisgICAgICAgIGludCBkYXRhID0gR2V0Qml0czgocFNyY0xpbmUsIHNyY19iaXRfcG9zLCBtX2JwYyk7CisgICAgICAgIGNvbG9yX2luZGV4IHw9IGRhdGEgPDwgKGNvbG9yICogbV9icGMpOworICAgICAgICBzcmNfYml0X3BvcyArPSBtX2JwYzsKKyAgICAgIH0KKyAgICAgIG1fcExpbmVCdWZbY29sXSA9IGNvbG9yX2luZGV4OworICAgIH0KKyAgICBwU3JjTGluZSA9IG1fcExpbmVCdWY7CisgIH0KKyAgaWYgKG1fYkNvbG9yS2V5KSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGlwX3dpZHRoOyBpKyspIHsKKyAgICAgIEZYX0RXT1JEIHNyY194ID0gKGNsaXBfbGVmdCArIGkpICogc3JjX3dpZHRoIC8gZGVzdF93aWR0aDsKKyAgICAgIGlmIChiRmxpcFgpIHsKKyAgICAgICAgc3JjX3ggPSBzcmNfd2lkdGggLSBzcmNfeCAtIDE7CisgICAgICB9CisgICAgICBzcmNfeCAlPSBzcmNfd2lkdGg7CisgICAgICB1aW50OF90KiBwRGVzdFBpeGVsID0gZGVzdF9zY2FuICsgaSAqIDQ7CisgICAgICB1aW50OF90IGluZGV4ID0gcFNyY0xpbmVbc3JjX3hdOworICAgICAgaWYgKG1fcFBhbGV0dGUpIHsKKyAgICAgICAgKnBEZXN0UGl4ZWwrKyA9IEZYQVJHQl9CKG1fcFBhbGV0dGVbaW5kZXhdKTsKKyAgICAgICAgKnBEZXN0UGl4ZWwrKyA9IEZYQVJHQl9HKG1fcFBhbGV0dGVbaW5kZXhdKTsKKyAgICAgICAgKnBEZXN0UGl4ZWwrKyA9IEZYQVJHQl9SKG1fcFBhbGV0dGVbaW5kZXhdKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpwRGVzdFBpeGVsKysgPSBpbmRleDsKKyAgICAgICAgKnBEZXN0UGl4ZWwrKyA9IGluZGV4OworICAgICAgICAqcERlc3RQaXhlbCsrID0gaW5kZXg7CisgICAgICB9CisgICAgICAqcERlc3RQaXhlbCA9IChpbmRleCA8IG1fcENvbXBEYXRhWzBdLm1fQ29sb3JLZXlNaW4gfHwKKyAgICAgICAgICAgICAgICAgICAgIGluZGV4ID4gbV9wQ29tcERhdGFbMF0ubV9Db2xvcktleU1heCkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gMHhGRgorICAgICAgICAgICAgICAgICAgICAgICAgOiAwOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGlwX3dpZHRoOyBpKyspIHsKKyAgICBGWF9EV09SRCBzcmNfeCA9IChjbGlwX2xlZnQgKyBpKSAqIHNyY193aWR0aCAvIGRlc3Rfd2lkdGg7CisgICAgaWYgKGJGbGlwWCkgeworICAgICAgc3JjX3ggPSBzcmNfd2lkdGggLSBzcmNfeCAtIDE7CisgICAgfQorICAgIHNyY194ICU9IHNyY193aWR0aDsKKyAgICB1aW50OF90IGluZGV4ID0gcFNyY0xpbmVbc3JjX3hdOworICAgIGlmIChkZXN0X0JwcCA9PSAxKSB7CisgICAgICBkZXN0X3NjYW5baV0gPSBpbmRleDsKKyAgICB9IGVsc2UgeworICAgICAgaW50IGRlc3RfcG9zID0gaSAqIGRlc3RfQnBwOworICAgICAgRlhfQVJHQiBhcmdiID0gbV9wUGFsZXR0ZVtpbmRleF07CisgICAgICBkZXN0X3NjYW5bZGVzdF9wb3NdID0gRlhBUkdCX0IoYXJnYik7CisgICAgICBkZXN0X3NjYW5bZGVzdF9wb3MgKyAxXSA9IEZYQVJHQl9HKGFyZ2IpOworICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zICsgMl0gPSBGWEFSR0JfUihhcmdiKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBDUERGX0RJQlNvdXJjZTo6RG93blNhbXBsZVNjYW5saW5lMzJCaXQoaW50IG9yaWdfQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFNyY0xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZsaXBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3dpZHRoKSBjb25zdCB7CisgIGludCBsYXN0X3NyY194ID0gLTE7CisgIEZYX0FSR0IgbGFzdF9hcmdiID0gRlhBUkdCX01BS0UoMHhGRiwgMHhGRiwgMHhGRiwgMHhGRik7CisgIEZYX0ZMT0FUIHVuaXRfVG84QnBjID0gMjU1LjBmIC8gKCgxIDw8IG1fYnBjKSAtIDEpOworICBmb3IgKGludCBpID0gMDsgaSA8IGNsaXBfd2lkdGg7IGkrKykgeworICAgIGludCBkZXN0X3ggPSBjbGlwX2xlZnQgKyBpOworICAgIEZYX0RXT1JEIHNyY194ID0gKGJGbGlwWCA/IChkZXN0X3dpZHRoIC0gZGVzdF94IC0gMSkgOiBkZXN0X3gpICoKKyAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KXNyY193aWR0aCAvIGRlc3Rfd2lkdGg7CisgICAgc3JjX3ggJT0gc3JjX3dpZHRoOworCisgICAgLy8gTm8gbmVlZCB0byBjaGVjayBmb3IgMzItYml0IG92ZXJmbG93LCBhcyB8c3JjX3h8IGlzIGJvdW5kZWQgYnkKKyAgICAvLyB8c3JjX3dpZHRofCBhbmQgRG93blNhbXBsZVNjYW5saW5lIGFscmVhZHkgY2hlY2tlZCBmb3Igb3ZlcmZsb3cgd2l0aCB0aGUKKyAgICAvLyBwaXRjaCBjYWxjdWxhdGlvbi4KKyAgICBjb25zdCB1aW50OF90KiBwU3JjUGl4ZWwgPSBudWxscHRyOworICAgIHNpemVfdCBiaXRfb2Zmc2V0ID0gMDsKKyAgICBpZiAobV9icGMgJSA4ID09IDApIHsKKyAgICAgIHBTcmNQaXhlbCA9IHBTcmNMaW5lICsgc3JjX3ggKiBvcmlnX0JwcDsKKyAgICB9IGVsc2UgeworICAgICAgc2l6ZV90IG51bV9iaXRzID0gc3JjX3ggKiBtX2JwYyAqIG1fbkNvbXBvbmVudHM7CisgICAgICBwU3JjUGl4ZWwgPSBwU3JjTGluZSArIG51bV9iaXRzIC8gODsKKyAgICAgIGJpdF9vZmZzZXQgPSBudW1fYml0cyAlIDg7CisgICAgfQorCisgICAgdWludDhfdCogcERlc3RQaXhlbCA9IGRlc3Rfc2NhbiArIGkgKiBkZXN0X0JwcDsKKyAgICBGWF9BUkdCIGFyZ2I7CisgICAgaWYgKHNyY194ID09IGxhc3Rfc3JjX3gpIHsKKyAgICAgIGFyZ2IgPSBsYXN0X2FyZ2I7CisgICAgfSBlbHNlIHsKKyAgICAgIENGWF9GaXhlZEJ1Zkdyb3c8dWludDhfdCwgMTI4PiBleHRyYWN0ZWRfY29tcG9uZW50cyhtX25Db21wb25lbnRzKTsKKyAgICAgIGlmIChtX2JwYyAlIDggIT0gMCkgeworICAgICAgICB1aW50NjRfdCBzcmNfYml0X3BvcyA9IGJpdF9vZmZzZXQ7CisgICAgICAgIGZvciAoRlhfRFdPUkQgaiA9IDA7IGogPCBtX25Db21wb25lbnRzOyArK2opIHsKKyAgICAgICAgICBleHRyYWN0ZWRfY29tcG9uZW50c1tqXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KAorICAgICAgICAgICAgICBHZXRCaXRzOChwU3JjUGl4ZWwsIHNyY19iaXRfcG9zLCBtX2JwYykgKiB1bml0X1RvOEJwYyk7CisgICAgICAgICAgc3JjX2JpdF9wb3MgKz0gbV9icGM7CiAgICAgICAgIH0KKyAgICAgICAgcFNyY1BpeGVsID0gZXh0cmFjdGVkX2NvbXBvbmVudHM7CisgICAgICB9CiAKLSAgICAgICAgaWYgKG1fcFN0cmVhbUFjYy0+R2V0U2l6ZSgpID49IHBpdGNoLlZhbHVlT3JEaWUoKSkgewotICAgICAgICAgICAgcFNyY0xpbmUgPSBtX3BTdHJlYW1BY2MtPkdldERhdGEoKSArIGxpbmUgKiBzcmNfcGl0Y2g7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaW50IG9yaWdfQnBwID0gbV9icGMgKiBtX25Db21wb25lbnRzIC8gODsKLSAgICBpbnQgZGVzdF9CcHAgPSBkZXN0X2JwcCAvIDg7Ci0gICAgaWYgKHBTcmNMaW5lID09IE5VTEwpIHsKLSAgICAgICAgRlhTWVNfbWVtc2V0MzIoZGVzdF9zY2FuLCAweGZmLCBkZXN0X0JwcCAqIGNsaXBfd2lkdGgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgRlhfU0FGRV9JTlQzMiBtYXhfc3JjX3ggPSBjbGlwX2xlZnQ7Ci0gICAgbWF4X3NyY194ICs9IGNsaXBfd2lkdGggLSAxOwotICAgIG1heF9zcmNfeCAqPSBzcmNfd2lkdGg7Ci0gICAgbWF4X3NyY194IC89IGRlc3Rfd2lkdGg7Ci0gICAgaWYgKCFtYXhfc3JjX3guSXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBDRlhfRml4ZWRCdWZHcm93PEZYX0JZVEUsIDEyOD4gdGVtcChvcmlnX0JwcCk7Ci0gICAgaWYgKG1fYnBjICogbV9uQ29tcG9uZW50cyA9PSAxKSB7Ci0gICAgICAgIEZYX0RXT1JEIHNldF9hcmdiID0gKEZYX0RXT1JEKSAtIDEsIHJlc2V0X2FyZ2IgPSAwOwotICAgICAgICBpZiAobV9iSW1hZ2VNYXNrKSB7Ci0gICAgICAgICAgICBpZiAobV9iRGVmYXVsdERlY29kZSkgewotICAgICAgICAgICAgICAgIHNldF9hcmdiID0gMDsKLSAgICAgICAgICAgICAgICByZXNldF9hcmdiID0gKEZYX0RXT1JEKSAtIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobV9iQ29sb3JLZXkpIHsKLSAgICAgICAgICAgIHJlc2V0X2FyZ2IgPSBtX3BQYWxldHRlID8gbV9wUGFsZXR0ZVswXSA6IDB4ZmYwMDAwMDA7Ci0gICAgICAgICAgICBzZXRfYXJnYiA9IG1fcFBhbGV0dGUgPyBtX3BQYWxldHRlWzFdIDogMHhmZmZmZmZmZjsKLSAgICAgICAgICAgIGlmIChtX3BDb21wRGF0YVswXS5tX0NvbG9yS2V5TWluID09IDApIHsKLSAgICAgICAgICAgICAgICByZXNldF9hcmdiID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX3BDb21wRGF0YVswXS5tX0NvbG9yS2V5TWF4ID09IDEpIHsKLSAgICAgICAgICAgICAgICBzZXRfYXJnYiA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRfYXJnYiA9IEZYQVJHQl9UT0RJQihzZXRfYXJnYik7Ci0gICAgICAgICAgICByZXNldF9hcmdiID0gRlhBUkdCX1RPRElCKHJlc2V0X2FyZ2IpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGlwX3dpZHRoOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3ggPSAoY2xpcF9sZWZ0ICsgaSkgKiBzcmNfd2lkdGggLyBkZXN0X3dpZHRoOwotICAgICAgICAgICAgICAgIGlmIChiRmxpcFgpIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX3ggPSBzcmNfd2lkdGggLSBzcmNfeCAtIDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNyY194ICU9IHNyY193aWR0aDsKLSAgICAgICAgICAgICAgICBpZiAocFNyY0xpbmVbc3JjX3ggLyA4XSAmICgxIDw8ICg3IC0gc3JjX3ggJSA4KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgKChGWF9EV09SRCopZGVzdF9zY2FuKVtpXSA9IHNldF9hcmdiOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICgoRlhfRFdPUkQqKWRlc3Rfc2NhbilbaV0gPSByZXNldF9hcmdiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgIGlmIChtX3BDb2xvclNwYWNlKSB7CisgICAgICAgIHVpbnQ4X3QgY29sb3JbNF07CisgICAgICAgIGNvbnN0IEZYX0JPT0wgYlRyYW5zTWFzayA9IFRyYW5zTWFzaygpOworICAgICAgICBpZiAobV9iRGVmYXVsdERlY29kZSkgeworICAgICAgICAgIG1fcENvbG9yU3BhY2UtPlRyYW5zbGF0ZUltYWdlTGluZShjb2xvciwgcFNyY1BpeGVsLCAxLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVHJhbnNNYXNrKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChkZXN0X0JwcCA9PSAxKSB7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1fcFBhbGV0dGUpIHsKLSAgICAgICAgICAgICAgICByZXNldF9hcmdiID0gbV9wUGFsZXR0ZVswXTsKLSAgICAgICAgICAgICAgICBzZXRfYXJnYiA9IG1fcFBhbGV0dGVbMV07Ci0gICAgICAgICAgICB9CisgICAgICAgICAgZm9yIChGWF9EV09SRCBqID0gMDsgaiA8IG1fbkNvbXBvbmVudHM7ICsraikgeworICAgICAgICAgICAgRlhfRkxPQVQgY29tcG9uZW50X3ZhbHVlID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGWF9GTE9BVD4oZXh0cmFjdGVkX2NvbXBvbmVudHNbal0pOworICAgICAgICAgICAgaW50IGNvbG9yX3ZhbHVlID0KKyAgICAgICAgICAgICAgICAoaW50KSgobV9wQ29tcERhdGFbal0ubV9EZWNvZGVNaW4gKworICAgICAgICAgICAgICAgICAgICAgICBtX3BDb21wRGF0YVtqXS5tX0RlY29kZVN0ZXAgKiBjb21wb25lbnRfdmFsdWUpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1LjBmICsKKyAgICAgICAgICAgICAgICAgICAgICAwLjVmKTsKKyAgICAgICAgICAgIGV4dHJhY3RlZF9jb21wb25lbnRzW2pdID0KKyAgICAgICAgICAgICAgICBjb2xvcl92YWx1ZSA+IDI1NSA/IDI1NSA6IChjb2xvcl92YWx1ZSA8IDAgPyAwIDogY29sb3JfdmFsdWUpOworICAgICAgICAgIH0KKyAgICAgICAgICBtX3BDb2xvclNwYWNlLT5UcmFuc2xhdGVJbWFnZUxpbmUoY29sb3IsIGV4dHJhY3RlZF9jb21wb25lbnRzLCAxLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBiVHJhbnNNYXNrKTsKICAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsaXBfd2lkdGg7IGkgKyspIHsKLSAgICAgICAgICAgIEZYX0RXT1JEIHNyY194ID0gKGNsaXBfbGVmdCArIGkpICogc3JjX3dpZHRoIC8gZGVzdF93aWR0aDsKLSAgICAgICAgICAgIGlmIChiRmxpcFgpIHsKLSAgICAgICAgICAgICAgICBzcmNfeCA9IHNyY193aWR0aCAtIHNyY194IC0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNyY194ICU9IHNyY193aWR0aDsKLSAgICAgICAgICAgIGludCBkZXN0X3BvcyA9IGkgKiBkZXN0X0JwcDsKLSAgICAgICAgICAgIGlmIChwU3JjTGluZVtzcmNfeCAvIDhdICYgKDEgPDwgKDcgLSBzcmNfeCAlIDgpKSkgewotICAgICAgICAgICAgICAgIGlmIChkZXN0X0JwcCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3Bvc10gPSAoRlhfQllURSlzZXRfYXJnYjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlc3RfQnBwID09IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zXSA9IEZYQVJHQl9CKHNldF9hcmdiKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zICsgMV0gPSBGWEFSR0JfRyhzZXRfYXJnYik7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3BvcyArIDJdID0gRlhBUkdCX1Ioc2V0X2FyZ2IpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKShkZXN0X3NjYW4gKyBkZXN0X3BvcykgPSBzZXRfYXJnYjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChkZXN0X0JwcCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3Bvc10gPSAoRlhfQllURSlyZXNldF9hcmdiOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzdF9CcHAgPT0gMykgewotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3NdID0gRlhBUkdCX0IocmVzZXRfYXJnYik7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3BvcyArIDFdID0gRlhBUkdCX0cocmVzZXRfYXJnYik7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3BvcyArIDJdID0gRlhBUkdCX1IocmVzZXRfYXJnYik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopKGRlc3Rfc2NhbiArIGRlc3RfcG9zKSA9IHJlc2V0X2FyZ2I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICBhcmdiID0gRlhBUkdCX01BS0UoMHhGRiwgY29sb3JbMl0sIGNvbG9yWzFdLCBjb2xvclswXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhcmdiID0gRlhBUkdCX01BS0UoMHhGRiwgcFNyY1BpeGVsWzJdLCBwU3JjUGl4ZWxbMV0sIHBTcmNQaXhlbFswXSk7CisgICAgICB9CisgICAgICBpZiAobV9iQ29sb3JLZXkpIHsKKyAgICAgICAgaW50IGFscGhhID0gMHhGRjsKKyAgICAgICAgaWYgKG1fbkNvbXBvbmVudHMgPT0gMyAmJiBtX2JwYyA9PSA4KSB7CisgICAgICAgICAgYWxwaGEgPSAocFNyY1BpeGVsWzBdIDwgbV9wQ29tcERhdGFbMF0ubV9Db2xvcktleU1pbiB8fAorICAgICAgICAgICAgICAgICAgIHBTcmNQaXhlbFswXSA+IG1fcENvbXBEYXRhWzBdLm1fQ29sb3JLZXlNYXggfHwKKyAgICAgICAgICAgICAgICAgICBwU3JjUGl4ZWxbMV0gPCBtX3BDb21wRGF0YVsxXS5tX0NvbG9yS2V5TWluIHx8CisgICAgICAgICAgICAgICAgICAgcFNyY1BpeGVsWzFdID4gbV9wQ29tcERhdGFbMV0ubV9Db2xvcktleU1heCB8fAorICAgICAgICAgICAgICAgICAgIHBTcmNQaXhlbFsyXSA8IG1fcENvbXBEYXRhWzJdLm1fQ29sb3JLZXlNaW4gfHwKKyAgICAgICAgICAgICAgICAgICBwU3JjUGl4ZWxbMl0gPiBtX3BDb21wRGF0YVsyXS5tX0NvbG9yS2V5TWF4KQorICAgICAgICAgICAgICAgICAgICAgID8gMHhGRgorICAgICAgICAgICAgICAgICAgICAgIDogMDsKICAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChtX2JwYyAqIG1fbkNvbXBvbmVudHMgPD0gOCkgewotICAgICAgICBpZiAobV9icGMgPCA4KSB7Ci0gICAgICAgICAgICBpbnQgc3JjX2JpdF9wb3MgPSAwOwotICAgICAgICAgICAgZm9yIChGWF9EV09SRCBjb2wgPSAwOyBjb2wgPCBzcmNfd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgIGludCBjb2xvcl9pbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChGWF9EV09SRCBjb2xvciA9IDA7IGNvbG9yIDwgbV9uQ29tcG9uZW50czsgY29sb3IgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGRhdGEgPSBfR2V0Qml0czgocFNyY0xpbmUsIHNyY19iaXRfcG9zLCBtX2JwYyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbG9yX2luZGV4IHw9IGRhdGEgPDwgKGNvbG9yICogbV9icGMpOwotICAgICAgICAgICAgICAgICAgICBzcmNfYml0X3BvcyArPSBtX2JwYzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9wTGluZUJ1Zltjb2xdID0gY29sb3JfaW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwU3JjTGluZSA9IG1fcExpbmVCdWY7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fYkNvbG9yS2V5KSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsaXBfd2lkdGg7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfeCA9IChjbGlwX2xlZnQgKyBpKSAqIHNyY193aWR0aCAvIGRlc3Rfd2lkdGg7Ci0gICAgICAgICAgICAgICAgaWYgKGJGbGlwWCkgewotICAgICAgICAgICAgICAgICAgICBzcmNfeCA9IHNyY193aWR0aCAtIHNyY194IC0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3JjX3ggJT0gc3JjX3dpZHRoOwotICAgICAgICAgICAgICAgIEZYX0xQQllURSBwRGVzdFBpeGVsID0gZGVzdF9zY2FuICsgaSAqIDQ7Ci0gICAgICAgICAgICAgICAgRlhfQllURSBpbmRleCA9IHBTcmNMaW5lW3NyY194XTsKLSAgICAgICAgICAgICAgICBpZiAobV9wUGFsZXR0ZSkgewotICAgICAgICAgICAgICAgICAgICAqcERlc3RQaXhlbCsrID0gRlhBUkdCX0IobV9wUGFsZXR0ZVtpbmRleF0pOwotICAgICAgICAgICAgICAgICAgICAqcERlc3RQaXhlbCsrID0gRlhBUkdCX0cobV9wUGFsZXR0ZVtpbmRleF0pOwotICAgICAgICAgICAgICAgICAgICAqcERlc3RQaXhlbCsrID0gRlhBUkdCX1IobV9wUGFsZXR0ZVtpbmRleF0pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICpwRGVzdFBpeGVsKysgPSBpbmRleDsKLSAgICAgICAgICAgICAgICAgICAgKnBEZXN0UGl4ZWwrKyA9IGluZGV4OwotICAgICAgICAgICAgICAgICAgICAqcERlc3RQaXhlbCsrID0gaW5kZXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICpwRGVzdFBpeGVsID0gKGluZGV4IDwgbV9wQ29tcERhdGFbMF0ubV9Db2xvcktleU1pbiB8fCBpbmRleCA+IG1fcENvbXBEYXRhWzBdLm1fQ29sb3JLZXlNYXgpID8gMHhmZiA6IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGlwX3dpZHRoOyBpICsrKSB7Ci0gICAgICAgICAgICBGWF9EV09SRCBzcmNfeCA9IChjbGlwX2xlZnQgKyBpKSAqIHNyY193aWR0aCAvIGRlc3Rfd2lkdGg7Ci0gICAgICAgICAgICBpZiAoYkZsaXBYKSB7Ci0gICAgICAgICAgICAgICAgc3JjX3ggPSBzcmNfd2lkdGggLSBzcmNfeCAtIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcmNfeCAlPSBzcmNfd2lkdGg7Ci0gICAgICAgICAgICBGWF9CWVRFIGluZGV4ID0gcFNyY0xpbmVbc3JjX3hdOwotICAgICAgICAgICAgaWYgKGRlc3RfQnBwID09IDEpIHsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5baV0gPSBpbmRleDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IGRlc3RfcG9zID0gaSAqIGRlc3RfQnBwOwotICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYiA9IG1fcFBhbGV0dGVbaW5kZXhdOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3Bvc10gPSBGWEFSR0JfQihhcmdiKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3MgKyAxXSA9IEZYQVJHQl9HKGFyZ2IpOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3BvcyArIDJdID0gRlhBUkdCX1IoYXJnYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOworICAgICAgICBhcmdiICY9IDB4RkZGRkZGOworICAgICAgICBhcmdiIHw9IGFscGhhIDw8IDI0OworICAgICAgfQorICAgICAgbGFzdF9zcmNfeCA9IHNyY194OworICAgICAgbGFzdF9hcmdiID0gYXJnYjsKKyAgICB9CisgICAgaWYgKGRlc3RfQnBwID09IDQpIHsKKyAgICAgICooRlhfRFdPUkQqKXBEZXN0UGl4ZWwgPSBGWEFSR0JfVE9ESUIoYXJnYik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaW50IGxhc3Rfc3JjX3ggPSAtMTsKLSAgICAgICAgRlhfQVJHQiBsYXN0X2FyZ2I7Ci0gICAgICAgIEZYX0ZMT0FUIG9yaWdfTm90OEJwcCA9IChGWF9GTE9BVCltX2JwYyAqIChGWF9GTE9BVCltX25Db21wb25lbnRzIC8gOC4wZjsKLSAgICAgICAgRlhfRkxPQVQgdW5pdF9UbzhCcGMgPSAyNTUuMGYgLyAoKDEgPDwgbV9icGMpIC0gMSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xpcF93aWR0aDsgaSArKykgewotICAgICAgICAgICAgaW50IGRlc3RfeCA9IGNsaXBfbGVmdCArIGk7Ci0gICAgICAgICAgICBGWF9EV09SRCBzcmNfeCA9IChiRmxpcFggPyAoZGVzdF93aWR0aCAtIGRlc3RfeCAtIDEpIDogZGVzdF94KSAqIChGWF9JTlQ2NClzcmNfd2lkdGggLyBkZXN0X3dpZHRoOwotICAgICAgICAgICAgc3JjX3ggJT0gc3JjX3dpZHRoOwotICAgICAgICAgICAgRlhfTFBDQllURSBwU3JjUGl4ZWwgPSBOVUxMOwotICAgICAgICAgICAgaWYgKG1fYnBjICUgOCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcFNyY1BpeGVsID0gcFNyY0xpbmUgKyBzcmNfeCAqIG9yaWdfQnBwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwU3JjUGl4ZWwgPSBwU3JjTGluZSArIChpbnQpKHNyY194ICogb3JpZ19Ob3Q4QnBwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX0xQQllURSBwRGVzdFBpeGVsID0gZGVzdF9zY2FuICsgaSAqIGRlc3RfQnBwOwotICAgICAgICAgICAgRlhfQVJHQiBhcmdiOwotICAgICAgICAgICAgaWYgKHNyY194ID09IGxhc3Rfc3JjX3gpIHsKLSAgICAgICAgICAgICAgICBhcmdiID0gbGFzdF9hcmdiOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobV9wQ29sb3JTcGFjZSkgewotICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGNvbG9yWzRdOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1fYkRlZmF1bHREZWNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9uQ29tcG9uZW50czsgaSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xvcl92YWx1ZSA9IChpbnQpKChtX3BDb21wRGF0YVtpXS5tX0RlY29kZU1pbiArIG1fcENvbXBEYXRhW2ldLm1fRGVjb2RlU3RlcCAqIChGWF9GTE9BVClwU3JjUGl4ZWxbaV0pICogMjU1LjBmICsgMC41Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFtpXSA9IGNvbG9yX3ZhbHVlID4gMjU1ID8gMjU1IDogKGNvbG9yX3ZhbHVlIDwgMCA/IDAgOiBjb2xvcl92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BDb2xvclNwYWNlLT5UcmFuc2xhdGVJbWFnZUxpbmUoY29sb3IsIHRlbXAsIDEsIDAsIDAsIG1fYkxvYWRNYXNrICYmIG1fR3JvdXBGYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSyAmJiBtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2JwYyA8IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2JpdF9wb3MgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfeCAlIDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2JpdF9wb3MgPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgbV9uQ29tcG9uZW50czsgaSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wW2ldID0gKEZYX0JZVEUpKF9HZXRCaXRzOChwU3JjUGl4ZWwsIHNyY19iaXRfcG9zLCBtX2JwYykgKiB1bml0X1RvOEJwYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19iaXRfcG9zICs9IG1fYnBjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDb2xvclNwYWNlLT5UcmFuc2xhdGVJbWFnZUxpbmUoY29sb3IsIHRlbXAsIDEsIDAsIDAsIG1fYkxvYWRNYXNrICYmIG1fR3JvdXBGYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSyAmJiBtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ29sb3JTcGFjZS0+VHJhbnNsYXRlSW1hZ2VMaW5lKGNvbG9yLCBwU3JjUGl4ZWwsIDEsIDAsIDAsIG1fYkxvYWRNYXNrICYmIG1fR3JvdXBGYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSyAmJiBtX0ZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhcmdiID0gRlhBUkdCX01BS0UoMHhmZiwgY29sb3JbMl0sIGNvbG9yWzFdLCBjb2xvclswXSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXJnYiA9IEZYQVJHQl9NQUtFKDB4ZmYsIHBTcmNQaXhlbFsyXSwgcFNyY1BpeGVsWzFdLCBwU3JjUGl4ZWxbMF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobV9iQ29sb3JLZXkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhID0gMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fbkNvbXBvbmVudHMgPT0gMyAmJiBtX2JwYyA9PSA4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IChwU3JjUGl4ZWxbMF0gPCBtX3BDb21wRGF0YVswXS5tX0NvbG9yS2V5TWluIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjUGl4ZWxbMF0gPiBtX3BDb21wRGF0YVswXS5tX0NvbG9yS2V5TWF4IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjUGl4ZWxbMV0gPCBtX3BDb21wRGF0YVsxXS5tX0NvbG9yS2V5TWluIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjUGl4ZWxbMV0gPiBtX3BDb21wRGF0YVsxXS5tX0NvbG9yS2V5TWF4IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjUGl4ZWxbMl0gPCBtX3BDb21wRGF0YVsyXS5tX0NvbG9yS2V5TWluIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjUGl4ZWxbMl0gPiBtX3BDb21wRGF0YVsyXS5tX0NvbG9yS2V5TWF4KSA/IDB4ZmYgOiAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFyZ2IgJj0gMHhmZmZmZmY7Ci0gICAgICAgICAgICAgICAgICAgIGFyZ2IgfD0gYWxwaGEgPDwgMjQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxhc3Rfc3JjX3ggPSBzcmNfeDsKLSAgICAgICAgICAgICAgICBsYXN0X2FyZ2IgPSBhcmdiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRlc3RfQnBwID09IDQpIHsKLSAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilwRGVzdFBpeGVsID0gRlhBUkdCX1RPRElCKGFyZ2IpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAqcERlc3RQaXhlbCsrID0gRlhBUkdCX0IoYXJnYik7Ci0gICAgICAgICAgICAgICAgKnBEZXN0UGl4ZWwrKyA9IEZYQVJHQl9HKGFyZ2IpOwotICAgICAgICAgICAgICAgICpwRGVzdFBpeGVsID0gRlhBUkdCX1IoYXJnYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICpwRGVzdFBpeGVsKysgPSBGWEFSR0JfQihhcmdiKTsKKyAgICAgICpwRGVzdFBpeGVsKysgPSBGWEFSR0JfRyhhcmdiKTsKKyAgICAgICpwRGVzdFBpeGVsID0gRlhBUkdCX1IoYXJnYik7CiAgICAgfQorICB9CiB9Ci12b2lkIENQREZfRElCU291cmNlOjpTZXREb3duU2FtcGxlU2l6ZShpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0KSBjb25zdAotewotICAgIGlmIChtX3BEZWNvZGVyKSB7Ci0gICAgICAgIG1fcERlY29kZXItPkRvd25TY2FsZShkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCk7Ci0gICAgICAgICgoQ1BERl9ESUJTb3VyY2UqKXRoaXMpLT5tX1dpZHRoID0gbV9wRGVjb2Rlci0+R2V0V2lkdGgoKTsKLSAgICAgICAgKChDUERGX0RJQlNvdXJjZSopdGhpcyktPm1fSGVpZ2h0ID0gbV9wRGVjb2Rlci0+R2V0SGVpZ2h0KCk7CisKK0ZYX0JPT0wgQ1BERl9ESUJTb3VyY2U6OlRyYW5zTWFzaygpIGNvbnN0IHsKKyAgcmV0dXJuIG1fYkxvYWRNYXNrICYmIG1fR3JvdXBGYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSyAmJgorICAgICAgICAgbV9GYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSzsKK30KKwordm9pZCBDUERGX0RJQlNvdXJjZTo6U2V0RG93blNhbXBsZVNpemUoaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCkgY29uc3QgeworICBpZiAobV9wRGVjb2RlcikgeworICAgIG1fcERlY29kZXItPkRvd25TY2FsZShkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCk7CisgICAgKChDUERGX0RJQlNvdXJjZSopdGhpcyktPm1fV2lkdGggPSBtX3BEZWNvZGVyLT5HZXRXaWR0aCgpOworICAgICgoQ1BERl9ESUJTb3VyY2UqKXRoaXMpLT5tX0hlaWdodCA9IG1fcERlY29kZXItPkdldEhlaWdodCgpOworICB9Cit9CisKK3ZvaWQgQ1BERl9ESUJTb3VyY2U6OkNsZWFySW1hZ2VEYXRhKCkgeworICBpZiAobV9wRGVjb2RlcikgeworICAgIG1fcERlY29kZXItPkNsZWFySW1hZ2VEYXRhKCk7CisgIH0KK30KKworQ1BERl9JbWFnZUxvYWRlckhhbmRsZTo6Q1BERl9JbWFnZUxvYWRlckhhbmRsZSgpIHsKKyAgbV9wSW1hZ2VMb2FkZXIgPSBOVUxMOworICBtX3BDYWNoZSA9IE5VTEw7CisgIG1fcEltYWdlID0gTlVMTDsKK30KK0NQREZfSW1hZ2VMb2FkZXJIYW5kbGU6On5DUERGX0ltYWdlTG9hZGVySGFuZGxlKCkge30KK0ZYX0JPT0wgQ1BERl9JbWFnZUxvYWRlckhhbmRsZTo6U3RhcnQoQ1BERl9JbWFnZUxvYWRlciogcEltYWdlTG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBHcm91cEZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTG9hZE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Eb3duc2FtcGxlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkRvd25zYW1wbGVIZWlnaHQpIHsKKyAgbV9wSW1hZ2VMb2FkZXIgPSBwSW1hZ2VMb2FkZXI7CisgIG1fcENhY2hlID0gcENhY2hlOworICBtX3BJbWFnZSA9IChDUERGX0ltYWdlT2JqZWN0KilwSW1hZ2U7CisgIG1fbkRvd25zYW1wbGVXaWR0aCA9IG5Eb3duc2FtcGxlV2lkdGg7CisgIG1fbkRvd25zYW1wbGVIZWlnaHQgPSBuRG93bnNhbXBsZUhlaWdodDsKKyAgRlhfQk9PTCByZXQ7CisgIGlmIChwQ2FjaGUpIHsKKyAgICByZXQgPSBwQ2FjaGUtPlN0YXJ0R2V0Q2FjaGVkQml0bWFwKHBJbWFnZS0+bV9wSW1hZ2UtPkdldFN0cmVhbSgpLCBiU3RkQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cEZhbWlseSwgYkxvYWRNYXNrLCBwUmVuZGVyU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uRG93bnNhbXBsZVdpZHRoLCBtX25Eb3duc2FtcGxlSGVpZ2h0KTsKKyAgICBpZiAoIXJldCkgeworICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fYkNhY2hlZCA9IFRSVUU7CisgICAgICBtX3BJbWFnZUxvYWRlci0+bV9wQml0bWFwID0KKyAgICAgICAgICBwQ2FjaGUtPkdldEN1ckltYWdlQ2FjaGVFbnRyeSgpLT5EZXRhY2hCaXRtYXAoKTsKKyAgICAgIG1fcEltYWdlTG9hZGVyLT5tX3BNYXNrID0gcENhY2hlLT5HZXRDdXJJbWFnZUNhY2hlRW50cnkoKS0+RGV0YWNoTWFzaygpOworICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fTWF0dGVDb2xvciA9CisgICAgICAgICAgcENhY2hlLT5HZXRDdXJJbWFnZUNhY2hlRW50cnkoKS0+bV9NYXR0ZUNvbG9yOwogICAgIH0KLX0KLXZvaWQgQ1BERl9ESUJTb3VyY2U6OkNsZWFySW1hZ2VEYXRhKCkKLXsKLSAgICBpZiAobV9wRGVjb2RlcikgewotICAgICAgICBtX3BEZWNvZGVyLT5DbGVhckltYWdlRGF0YSgpOworICB9IGVsc2UgeworICAgIHJldCA9IHBJbWFnZS0+bV9wSW1hZ2UtPlN0YXJ0TG9hZERJQlNvdXJjZShwUmVuZGVyU3RhdHVzLT5tX3BGb3JtUmVzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW5kZXJTdGF0dXMtPm1fcFBhZ2VSZXNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrKTsKKyAgICBpZiAoIXJldCkgeworICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fYkNhY2hlZCA9IEZBTFNFOworICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fcEJpdG1hcCA9IG1fcEltYWdlLT5tX3BJbWFnZS0+RGV0YWNoQml0bWFwKCk7CisgICAgICBtX3BJbWFnZUxvYWRlci0+bV9wTWFzayA9IG1fcEltYWdlLT5tX3BJbWFnZS0+RGV0YWNoTWFzaygpOworICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fTWF0dGVDb2xvciA9IG1fcEltYWdlLT5tX3BJbWFnZS0+bV9NYXR0ZUNvbG9yOwogICAgIH0KKyAgfQorICByZXR1cm4gcmV0OwogfQotQ1BERl9Qcm9ncmVzc2l2ZUltYWdlTG9hZGVySGFuZGxlOjpDUERGX1Byb2dyZXNzaXZlSW1hZ2VMb2FkZXJIYW5kbGUoKQotewotICAgIG1fcEltYWdlTG9hZGVyID0gTlVMTDsKLSAgICBtX3BDYWNoZSA9IE5VTEw7Ci0gICAgbV9wSW1hZ2UgPSBOVUxMOwotfQotQ1BERl9Qcm9ncmVzc2l2ZUltYWdlTG9hZGVySGFuZGxlOjp+Q1BERl9Qcm9ncmVzc2l2ZUltYWdlTG9hZGVySGFuZGxlKCkKLXsKLX0KLUZYX0JPT0wgQ1BERl9Qcm9ncmVzc2l2ZUltYWdlTG9hZGVySGFuZGxlOjpTdGFydChDUERGX0ltYWdlTG9hZGVyKiBwSW1hZ2VMb2FkZXIsIGNvbnN0IENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZSwgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBDYWNoZSwgRlhfQk9PTCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBGWF9CT09MIGJMb2FkTWFzaywgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMsIEZYX0lOVDMyIG5Eb3duc2FtcGxlV2lkdGgsIEZYX0lOVDMyIG5Eb3duc2FtcGxlSGVpZ2h0KQotewotICAgIG1fcEltYWdlTG9hZGVyID0gcEltYWdlTG9hZGVyOwotICAgIG1fcENhY2hlID0gcENhY2hlOwotICAgIG1fcEltYWdlID0gKENQREZfSW1hZ2VPYmplY3QqKXBJbWFnZTsKLSAgICBtX25Eb3duc2FtcGxlV2lkdGggPSBuRG93bnNhbXBsZVdpZHRoOwotICAgIG1fbkRvd25zYW1wbGVIZWlnaHQgPSBuRG93bnNhbXBsZUhlaWdodDsKLSAgICBGWF9CT09MIHJldDsKLSAgICBpZiAocENhY2hlKSB7Ci0gICAgICAgIHJldCA9IHBDYWNoZS0+U3RhcnRHZXRDYWNoZWRCaXRtYXAocEltYWdlLT5tX3BJbWFnZS0+R2V0U3RyZWFtKCksIGJTdGRDUywgR3JvdXBGYW1pbHksIGJMb2FkTWFzaywgcFJlbmRlclN0YXR1cywgbV9uRG93bnNhbXBsZVdpZHRoLCBtX25Eb3duc2FtcGxlSGVpZ2h0KTsKLSAgICAgICAgaWYgKHJldCA9PSBGQUxTRSkgewotICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fYkNhY2hlZCA9IFRSVUU7Ci0gICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9wQml0bWFwID0gcENhY2hlLT5tX3BDdXJJbWFnZUNhY2hlLT5EZXRhY2hCaXRtYXAoKTsKLSAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX3BNYXNrID0gcENhY2hlLT5tX3BDdXJJbWFnZUNhY2hlLT5EZXRhY2hNYXNrKCk7Ci0gICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9NYXR0ZUNvbG9yID0gcENhY2hlLT5tX3BDdXJJbWFnZUNhY2hlLT5tX01hdHRlQ29sb3I7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICByZXQgPSBwSW1hZ2UtPm1fcEltYWdlLT5TdGFydExvYWRESUJTb3VyY2UocFJlbmRlclN0YXR1cy0+bV9wRm9ybVJlc291cmNlLCBwUmVuZGVyU3RhdHVzLT5tX3BQYWdlUmVzb3VyY2UsIGJTdGRDUywgR3JvdXBGYW1pbHksIGJMb2FkTWFzayk7Ci0gICAgICAgIGlmIChyZXQgPT0gRkFMU0UpIHsKLSAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX2JDYWNoZWQgPSBGQUxTRTsKLSAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX3BCaXRtYXAgPSBtX3BJbWFnZS0+bV9wSW1hZ2UtPkRldGFjaEJpdG1hcCgpOwotICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fcE1hc2sgPSBtX3BJbWFnZS0+bV9wSW1hZ2UtPkRldGFjaE1hc2soKTsKLSAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX01hdHRlQ29sb3IgPSBtX3BJbWFnZS0+bV9wSW1hZ2UtPm1fTWF0dGVDb2xvcjsKLSAgICAgICAgfQorRlhfQk9PTCBDUERGX0ltYWdlTG9hZGVySGFuZGxlOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkgeworICBGWF9CT09MIHJldDsKKyAgaWYgKG1fcENhY2hlKSB7CisgICAgcmV0ID0gbV9wQ2FjaGUtPkNvbnRpbnVlKHBQYXVzZSk7CisgICAgaWYgKCFyZXQpIHsKKyAgICAgIG1fcEltYWdlTG9hZGVyLT5tX2JDYWNoZWQgPSBUUlVFOworICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fcEJpdG1hcCA9CisgICAgICAgICAgbV9wQ2FjaGUtPkdldEN1ckltYWdlQ2FjaGVFbnRyeSgpLT5EZXRhY2hCaXRtYXAoKTsKKyAgICAgIG1fcEltYWdlTG9hZGVyLT5tX3BNYXNrID0gbV9wQ2FjaGUtPkdldEN1ckltYWdlQ2FjaGVFbnRyeSgpLT5EZXRhY2hNYXNrKCk7CisgICAgICBtX3BJbWFnZUxvYWRlci0+bV9NYXR0ZUNvbG9yID0KKyAgICAgICAgICBtX3BDYWNoZS0+R2V0Q3VySW1hZ2VDYWNoZUVudHJ5KCktPm1fTWF0dGVDb2xvcjsKICAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLUZYX0JPT0wgQ1BERl9Qcm9ncmVzc2l2ZUltYWdlTG9hZGVySGFuZGxlOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBGWF9CT09MIHJldDsKLSAgICBpZiAobV9wQ2FjaGUpIHsKLSAgICAgICAgcmV0ID0gbV9wQ2FjaGUtPkNvbnRpbnVlKHBQYXVzZSk7Ci0gICAgICAgIGlmIChyZXQgPT0gRkFMU0UpIHsKLSAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX2JDYWNoZWQgPSBUUlVFOwotICAgICAgICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fcEJpdG1hcCA9IG1fcENhY2hlLT5tX3BDdXJJbWFnZUNhY2hlLT5EZXRhY2hCaXRtYXAoKTsKLSAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX3BNYXNrID0gbV9wQ2FjaGUtPm1fcEN1ckltYWdlQ2FjaGUtPkRldGFjaE1hc2soKTsKLSAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX01hdHRlQ29sb3IgPSBtX3BDYWNoZS0+bV9wQ3VySW1hZ2VDYWNoZS0+bV9NYXR0ZUNvbG9yOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0ID0gbV9wSW1hZ2UtPm1fcEltYWdlLT5Db250aW51ZShwUGF1c2UpOwotICAgICAgICBpZiAocmV0ID09IEZBTFNFKSB7Ci0gICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9iQ2FjaGVkID0gRkFMU0U7Ci0gICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9wQml0bWFwID0gbV9wSW1hZ2UtPm1fcEltYWdlLT5EZXRhY2hCaXRtYXAoKTsKLSAgICAgICAgICAgIG1fcEltYWdlTG9hZGVyLT5tX3BNYXNrID0gbV9wSW1hZ2UtPm1fcEltYWdlLT5EZXRhY2hNYXNrKCk7Ci0gICAgICAgICAgICBtX3BJbWFnZUxvYWRlci0+bV9NYXR0ZUNvbG9yID0gbV9wSW1hZ2UtPm1fcEltYWdlLT5tX01hdHRlQ29sb3I7Ci0gICAgICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXQgPSBtX3BJbWFnZS0+bV9wSW1hZ2UtPkNvbnRpbnVlKHBQYXVzZSk7CisgICAgaWYgKCFyZXQpIHsKKyAgICAgIG1fcEltYWdlTG9hZGVyLT5tX2JDYWNoZWQgPSBGQUxTRTsKKyAgICAgIG1fcEltYWdlTG9hZGVyLT5tX3BCaXRtYXAgPSBtX3BJbWFnZS0+bV9wSW1hZ2UtPkRldGFjaEJpdG1hcCgpOworICAgICAgbV9wSW1hZ2VMb2FkZXItPm1fcE1hc2sgPSBtX3BJbWFnZS0+bV9wSW1hZ2UtPkRldGFjaE1hc2soKTsKKyAgICAgIG1fcEltYWdlTG9hZGVyLT5tX01hdHRlQ29sb3IgPSBtX3BJbWFnZS0+bV9wSW1hZ2UtPm1fTWF0dGVDb2xvcjsKICAgICB9Ci0gICAgcmV0dXJuIHJldDsKKyAgfQorICByZXR1cm4gcmV0OwogfQotRlhfQk9PTCBDUERGX0ltYWdlTG9hZGVyOjpMb2FkKGNvbnN0IENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZSwgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBDYWNoZSwgRlhfQk9PTCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBGWF9CT09MIGJMb2FkTWFzaywgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMpCi17Ci0gICAgaWYgKHBJbWFnZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKHBDYWNoZSkgewotICAgICAgICBwQ2FjaGUtPkdldENhY2hlZEJpdG1hcChwSW1hZ2UtPm1fcEltYWdlLT5HZXRTdHJlYW0oKSwgbV9wQml0bWFwLCBtX3BNYXNrLCBtX01hdHRlQ29sb3IsIGJTdGRDUywgR3JvdXBGYW1pbHksIGJMb2FkTWFzaywgcFJlbmRlclN0YXR1cywgbV9uRG93bnNhbXBsZVdpZHRoLCBtX25Eb3duc2FtcGxlSGVpZ2h0KTsKLSAgICAgICAgbV9iQ2FjaGVkID0gVFJVRTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX3BCaXRtYXAgPSBwSW1hZ2UtPm1fcEltYWdlLT5Mb2FkRElCU291cmNlKCZtX3BNYXNrLCAmbV9NYXR0ZUNvbG9yLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2spOwotICAgICAgICBtX2JDYWNoZWQgPSBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDUERGX0ltYWdlTG9hZGVyOjpTdGFydChjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfSW1hZ2VMb2FkZXJIYW5kbGUqJiBMb2FkSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgR3JvdXBGYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxvYWRNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRG93bnNhbXBsZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Eb3duc2FtcGxlSGVpZ2h0KSB7CisgIG1fbkRvd25zYW1wbGVXaWR0aCA9IG5Eb3duc2FtcGxlV2lkdGg7CisgIG1fbkRvd25zYW1wbGVIZWlnaHQgPSBuRG93bnNhbXBsZUhlaWdodDsKKyAgTG9hZEhhbmRsZSA9IG5ldyBDUERGX0ltYWdlTG9hZGVySGFuZGxlOworICByZXR1cm4gTG9hZEhhbmRsZS0+U3RhcnQodGhpcywgcEltYWdlLCBwQ2FjaGUsIGJTdGRDUywgR3JvdXBGYW1pbHksIGJMb2FkTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZW5kZXJTdGF0dXMsIG1fbkRvd25zYW1wbGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbkRvd25zYW1wbGVIZWlnaHQpOwogfQotRlhfQk9PTCBDUERGX0ltYWdlTG9hZGVyOjpTdGFydExvYWRJbWFnZShjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2UsIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsIEZYX0xQVk9JRCYgTG9hZEhhbmRsZSwgRlhfQk9PTCBiU3RkQ1MsIEZYX0RXT1JEIEdyb3VwRmFtaWx5LCBGWF9CT09MIGJMb2FkTWFzaywgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMsIEZYX0lOVDMyIG5Eb3duc2FtcGxlV2lkdGgsIEZYX0lOVDMyIG5Eb3duc2FtcGxlSGVpZ2h0KQotewotICAgIG1fbkRvd25zYW1wbGVXaWR0aCA9IG5Eb3duc2FtcGxlV2lkdGg7Ci0gICAgbV9uRG93bnNhbXBsZUhlaWdodCA9IG5Eb3duc2FtcGxlSGVpZ2h0OwotICAgIENQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZSogcExvYWRlckhhbmRsZSA9IG5ldyBDUERGX1Byb2dyZXNzaXZlSW1hZ2VMb2FkZXJIYW5kbGU7Ci0gICAgRlhfQk9PTCByZXQgPSBwTG9hZGVySGFuZGxlLT5TdGFydCh0aGlzLCBwSW1hZ2UsIHBDYWNoZSwgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrLCBwUmVuZGVyU3RhdHVzLCBtX25Eb3duc2FtcGxlV2lkdGgsIG1fbkRvd25zYW1wbGVIZWlnaHQpOwotICAgIExvYWRIYW5kbGUgPSBwTG9hZGVySGFuZGxlOwotICAgIHJldHVybiByZXQ7CitGWF9CT09MIENQREZfSW1hZ2VMb2FkZXI6OkNvbnRpbnVlKENQREZfSW1hZ2VMb2FkZXJIYW5kbGUqIExvYWRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIHJldHVybiBMb2FkSGFuZGxlLT5Db250aW51ZShwUGF1c2UpOwogfQotRlhfQk9PTAlDUERGX0ltYWdlTG9hZGVyOjpDb250aW51ZShGWF9MUFZPSUQgTG9hZEhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgcmV0dXJuICgoQ1BERl9Qcm9ncmVzc2l2ZUltYWdlTG9hZGVySGFuZGxlKilMb2FkSGFuZGxlKS0+Q29udGludWUocFBhdXNlKTsKLX0KLUNQREZfSW1hZ2VMb2FkZXI6On5DUERGX0ltYWdlTG9hZGVyKCkKLXsKLSAgICBpZiAoIW1fYkNhY2hlZCkgewotICAgICAgICBkZWxldGUgbV9wQml0bWFwOwotICAgICAgICBkZWxldGUgbV9wTWFzazsKLSAgICB9CitDUERGX0ltYWdlTG9hZGVyOjp+Q1BERl9JbWFnZUxvYWRlcigpIHsKKyAgaWYgKCFtX2JDYWNoZWQpIHsKKyAgICBkZWxldGUgbV9wQml0bWFwOworICAgIGRlbGV0ZSBtX3BNYXNrOworICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2xvYWRpbWFnZV9lbWJlZGRlcnRlc3QuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9sb2FkaW1hZ2VfZW1iZWRkZXJ0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjdhYmI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9sb2FkaW1hZ2VfZW1iZWRkZXJ0ZXN0LmNwcApAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgMjAxNSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJ0ZXN0aW5nL2VtYmVkZGVyX3Rlc3QuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKworY2xhc3MgRlBERlJlbmRlckxvYWRJbWFnZUVtYmVkZGVydGVzdCA6IHB1YmxpYyBFbWJlZGRlclRlc3Qge307CisKK1RFU1RfRihGUERGUmVuZGVyTG9hZEltYWdlRW1iZWRkZXJ0ZXN0LCBCdWdfNTU0MTUxKSB7CisgIC8vIFRlc3Qgc2NhbmxpbmUgZG93bnNhbXBsaW5nIHdpdGggYSBCaXRzUGVyQ29tcG9uZW50IG9mIDQuCisgIC8vIFNob3VsZCBub3QgY3Jhc2guCisgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgiYnVnXzU1NDE1MS5wZGYiKSk7CisgIEZQREZfUEFHRSBwYWdlID0gTG9hZFBhZ2UoMCk7CisgIEVYUEVDVF9ORShudWxscHRyLCBwYWdlKTsKKyAgRlBERl9CSVRNQVAgYml0bWFwID0gUmVuZGVyUGFnZShwYWdlKTsKKyAgRlBERkJpdG1hcF9EZXN0cm95KGJpdG1hcCk7CisgIFVubG9hZFBhZ2UocGFnZSk7Cit9CisKK1RFU1RfRihGUERGUmVuZGVyTG9hZEltYWdlRW1iZWRkZXJ0ZXN0LCBCdWdfNTU3MjIzKSB7CisgIC8vIFNob3VsZCBub3QgY3Jhc2gKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJidWdfNTU3MjIzLnBkZiIpKTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBMb2FkUGFnZSgwKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIHBhZ2UpOworICBGUERGX0JJVE1BUCBiaXRtYXAgPSBSZW5kZXJQYWdlKHBhZ2UpOworICBGUERGQml0bWFwX0Rlc3Ryb3koYml0bWFwKTsKKyAgVW5sb2FkUGFnZShwYWdlKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfcGF0dGVybi5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX3BhdHRlcm4uY3BwCmluZGV4IGY5ZWVjMjMuLjhjZWUxNzggMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfcGF0dGVybi5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9wYXR0ZXJuLmNwcApAQCAtMSwxMTEyICsxLDEyMTYgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3JlbmRlci5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2VvYmouaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKLSNpbmNsdWRlICIuLi9mcGRmX3BhZ2UvcGFnZWludC5oIgogI2luY2x1ZGUgInJlbmRlcl9pbnQuaCIKKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZW9iai5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcmVuZGVyLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKKyNpbmNsdWRlICJjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9wYWdlaW50LmgiCisKICNkZWZpbmUgU0hBRElOR19TVEVQUyAyNTYKLXN0YXRpYyB2b2lkIF9EcmF3QXhpYWxTaGFkaW5nKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LCBDUERGX0Z1bmN0aW9uKiogcEZ1bmNzLCBpbnQgbkZ1bmNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MsIGludCBhbHBoYSkKLXsKLSAgICBBU1NFUlQocEJpdG1hcC0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYik7Ci0gICAgQ1BERl9BcnJheSogcENvb3JkcyA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiQ29vcmRzIikpOwotICAgIGlmIChwQ29vcmRzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOworc3RhdGljIHZvaWQgRHJhd0F4aWFsU2hhZGluZyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBPYmplY3QyQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Z1bmN0aW9uKiogcEZ1bmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZ1bmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0NvbG9yU3BhY2UqIHBDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhKSB7CisgIEFTU0VSVChwQml0bWFwLT5HZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKTsKKyAgQ1BERl9BcnJheSogcENvb3JkcyA9IHBEaWN0LT5HZXRBcnJheSgiQ29vcmRzIik7CisgIGlmICghcENvb3JkcykgeworICAgIHJldHVybjsKKyAgfQorICBGWF9GTE9BVCBzdGFydF94ID0gcENvb3Jkcy0+R2V0TnVtYmVyKDApOworICBGWF9GTE9BVCBzdGFydF95ID0gcENvb3Jkcy0+R2V0TnVtYmVyKDEpOworICBGWF9GTE9BVCBlbmRfeCA9IHBDb29yZHMtPkdldE51bWJlcigyKTsKKyAgRlhfRkxPQVQgZW5kX3kgPSBwQ29vcmRzLT5HZXROdW1iZXIoMyk7CisgIEZYX0ZMT0FUIHRfbWluID0gMCwgdF9tYXggPSAxLjBmOworICBDUERGX0FycmF5KiBwQXJyYXkgPSBwRGljdC0+R2V0QXJyYXkoIkRvbWFpbiIpOworICBpZiAocEFycmF5KSB7CisgICAgdF9taW4gPSBwQXJyYXktPkdldE51bWJlcigwKTsKKyAgICB0X21heCA9IHBBcnJheS0+R2V0TnVtYmVyKDEpOworICB9CisgIEZYX0JPT0wgYlN0YXJ0RXh0ZW5kID0gRkFMU0UsIGJFbmRFeHRlbmQgPSBGQUxTRTsKKyAgcEFycmF5ID0gcERpY3QtPkdldEFycmF5KCJFeHRlbmQiKTsKKyAgaWYgKHBBcnJheSkgeworICAgIGJTdGFydEV4dGVuZCA9IHBBcnJheS0+R2V0SW50ZWdlcigwKTsKKyAgICBiRW5kRXh0ZW5kID0gcEFycmF5LT5HZXRJbnRlZ2VyKDEpOworICB9CisgIGludCB3aWR0aCA9IHBCaXRtYXAtPkdldFdpZHRoKCk7CisgIGludCBoZWlnaHQgPSBwQml0bWFwLT5HZXRIZWlnaHQoKTsKKyAgRlhfRkxPQVQgeF9zcGFuID0gZW5kX3ggLSBzdGFydF94OworICBGWF9GTE9BVCB5X3NwYW4gPSBlbmRfeSAtIHN0YXJ0X3k7CisgIEZYX0ZMT0FUIGF4aXNfbGVuX3NxdWFyZSA9CisgICAgICBGWFNZU19NdWwoeF9zcGFuLCB4X3NwYW4pICsgRlhTWVNfTXVsKHlfc3BhbiwgeV9zcGFuKTsKKyAgQ0ZYX01hdHJpeCBtYXRyaXg7CisgIG1hdHJpeC5TZXRSZXZlcnNlKCpwT2JqZWN0MkJpdG1hcCk7CisgIGludCB0b3RhbF9yZXN1bHRzID0gMDsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBuRnVuY3M7IGorKykgeworICAgIGlmIChwRnVuY3Nbal0pIHsKKyAgICAgIHRvdGFsX3Jlc3VsdHMgKz0gcEZ1bmNzW2pdLT5Db3VudE91dHB1dHMoKTsKICAgICB9Ci0gICAgRlhfRkxPQVQgc3RhcnRfeCA9IHBDb29yZHMtPkdldE51bWJlcigwKTsKLSAgICBGWF9GTE9BVCBzdGFydF95ID0gcENvb3Jkcy0+R2V0TnVtYmVyKDEpOwotICAgIEZYX0ZMT0FUIGVuZF94ID0gcENvb3Jkcy0+R2V0TnVtYmVyKDIpOwotICAgIEZYX0ZMT0FUIGVuZF95ID0gcENvb3Jkcy0+R2V0TnVtYmVyKDMpOwotICAgIEZYX0ZMT0FUIHRfbWluID0gMCwgdF9tYXggPSAxLjBmOwotICAgIENQREZfQXJyYXkqIHBBcnJheSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRG9tYWluIikpOwotICAgIGlmIChwQXJyYXkpIHsKLSAgICAgICAgdF9taW4gPSBwQXJyYXktPkdldE51bWJlcigwKTsKLSAgICAgICAgdF9tYXggPSBwQXJyYXktPkdldE51bWJlcigxKTsKLSAgICB9Ci0gICAgRlhfQk9PTCBiU3RhcnRFeHRlbmQgPSBGQUxTRSwgYkVuZEV4dGVuZCA9IEZBTFNFOwotICAgIHBBcnJheSA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRXh0ZW5kIikpOwotICAgIGlmIChwQXJyYXkpIHsKLSAgICAgICAgYlN0YXJ0RXh0ZW5kID0gcEFycmF5LT5HZXRJbnRlZ2VyKDApOwotICAgICAgICBiRW5kRXh0ZW5kID0gcEFycmF5LT5HZXRJbnRlZ2VyKDEpOwotICAgIH0KLSAgICBpbnQgd2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpOwotICAgIGludCBoZWlnaHQgPSBwQml0bWFwLT5HZXRIZWlnaHQoKTsKLSAgICBGWF9GTE9BVCB4X3NwYW4gPSBlbmRfeCAtIHN0YXJ0X3g7Ci0gICAgRlhfRkxPQVQgeV9zcGFuID0gZW5kX3kgLSBzdGFydF95OwotICAgIEZYX0ZMT0FUIGF4aXNfbGVuX3NxdWFyZSA9IEZYU1lTX011bCh4X3NwYW4sIHhfc3BhbikgKyBGWFNZU19NdWwoeV9zcGFuLCB5X3NwYW4pOwotICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwotICAgIG1hdHJpeC5TZXRSZXZlcnNlKCpwT2JqZWN0MkJpdG1hcCk7Ci0gICAgaW50IHRvdGFsX3Jlc3VsdHMgPSAwOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgbkZ1bmNzOyBqICsrKSB7Ci0gICAgICAgIGlmIChwRnVuY3Nbal0pIHsKLSAgICAgICAgICAgIHRvdGFsX3Jlc3VsdHMgKz0gcEZ1bmNzW2pdLT5Db3VudE91dHB1dHMoKTsKKyAgfQorICBpZiAocENTLT5Db3VudENvbXBvbmVudHMoKSA+IHRvdGFsX3Jlc3VsdHMpIHsKKyAgICB0b3RhbF9yZXN1bHRzID0gcENTLT5Db3VudENvbXBvbmVudHMoKTsKKyAgfQorICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCAxNj4gcmVzdWx0X2FycmF5KHRvdGFsX3Jlc3VsdHMpOworICBGWF9GTE9BVCogcFJlc3VsdHMgPSByZXN1bHRfYXJyYXk7CisgIEZYU1lTX21lbXNldChwUmVzdWx0cywgMCwgdG90YWxfcmVzdWx0cyAqIHNpemVvZihGWF9GTE9BVCkpOworICBGWF9EV09SRCByZ2JfYXJyYXlbU0hBRElOR19TVEVQU107CisgIGZvciAoaW50IGkgPSAwOyBpIDwgU0hBRElOR19TVEVQUzsgaSsrKSB7CisgICAgRlhfRkxPQVQgaW5wdXQgPSAodF9tYXggLSB0X21pbikgKiBpIC8gU0hBRElOR19TVEVQUyArIHRfbWluOworICAgIGludCBvZmZzZXQgPSAwOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgbkZ1bmNzOyBqKyspIHsKKyAgICAgIGlmIChwRnVuY3Nbal0pIHsKKyAgICAgICAgaW50IG5yZXN1bHRzID0gMDsKKyAgICAgICAgaWYgKHBGdW5jc1tqXS0+Q2FsbCgmaW5wdXQsIDEsIHBSZXN1bHRzICsgb2Zmc2V0LCBucmVzdWx0cykpIHsKKyAgICAgICAgICBvZmZzZXQgKz0gbnJlc3VsdHM7CiAgICAgICAgIH0KKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKHBDUy0+Q291bnRDb21wb25lbnRzKCkgPiB0b3RhbF9yZXN1bHRzKSB7Ci0gICAgICAgIHRvdGFsX3Jlc3VsdHMgPSBwQ1MtPkNvdW50Q29tcG9uZW50cygpOwotICAgIH0KLSAgICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCAxNj4gcmVzdWx0X2FycmF5KHRvdGFsX3Jlc3VsdHMpOwotICAgIEZYX0ZMT0FUKiBwUmVzdWx0cyA9IHJlc3VsdF9hcnJheTsKLSAgICBGWFNZU19tZW1zZXQzMihwUmVzdWx0cywgMCwgdG90YWxfcmVzdWx0cyAqIHNpemVvZihGWF9GTE9BVCkpOwotICAgIEZYX0RXT1JEIHJnYl9hcnJheVtTSEFESU5HX1NURVBTXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IFNIQURJTkdfU1RFUFM7IGkgKyspIHsKLSAgICAgICAgRlhfRkxPQVQgaW5wdXQgPSAodF9tYXggLSB0X21pbikgKiBpIC8gU0hBRElOR19TVEVQUyArIHRfbWluOwotICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuRnVuY3M7IGogKyspIHsKLSAgICAgICAgICAgIGlmIChwRnVuY3Nbal0pIHsKLSAgICAgICAgICAgICAgICBpbnQgbnJlc3VsdHMgPSAwOwotICAgICAgICAgICAgICAgIGlmIChwRnVuY3Nbal0tPkNhbGwoJmlucHV0LCAxLCBwUmVzdWx0cyArIG9mZnNldCwgbnJlc3VsdHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBucmVzdWx0czsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgRlhfRkxPQVQgUiA9IDAuMGYsIEcgPSAwLjBmLCBCID0gMC4wZjsKKyAgICBwQ1MtPkdldFJHQihwUmVzdWx0cywgUiwgRywgQik7CisgICAgcmdiX2FycmF5W2ldID0KKyAgICAgICAgRlhBUkdCX1RPRElCKEZYQVJHQl9NQUtFKGFscGhhLCBGWFNZU19yb3VuZChSICogMjU1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKEcgKiAyNTUpLCBGWFNZU19yb3VuZChCICogMjU1KSkpOworICB9CisgIGludCBwaXRjaCA9IHBCaXRtYXAtPkdldFBpdGNoKCk7CisgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICBGWF9EV09SRCogZGliX2J1ZiA9IChGWF9EV09SRCopKHBCaXRtYXAtPkdldEJ1ZmZlcigpICsgcm93ICogcGl0Y2gpOworICAgIGZvciAoaW50IGNvbHVtbiA9IDA7IGNvbHVtbiA8IHdpZHRoOyBjb2x1bW4rKykgeworICAgICAgRlhfRkxPQVQgeCA9IChGWF9GTE9BVCljb2x1bW4sIHkgPSAoRlhfRkxPQVQpcm93OworICAgICAgbWF0cml4LlRyYW5zZm9ybSh4LCB5KTsKKyAgICAgIEZYX0ZMT0FUIHNjYWxlID0gRlhTWVNfRGl2KAorICAgICAgICAgIEZYU1lTX011bCh4IC0gc3RhcnRfeCwgeF9zcGFuKSArIEZYU1lTX011bCh5IC0gc3RhcnRfeSwgeV9zcGFuKSwKKyAgICAgICAgICBheGlzX2xlbl9zcXVhcmUpOworICAgICAgaW50IGluZGV4ID0gKGludDMyX3QpKHNjYWxlICogKFNIQURJTkdfU1RFUFMgLSAxKSk7CisgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIGlmICghYlN0YXJ0RXh0ZW5kKSB7CisgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgRlhfRkxPQVQgUiA9IDAuMGYsIEcgPSAwLjBmLCBCID0gMC4wZjsKLSAgICAgICAgcENTLT5HZXRSR0IocFJlc3VsdHMsIFIsIEcsIEIpOwotICAgICAgICByZ2JfYXJyYXlbaV0gPSBGWEFSR0JfVE9ESUIoRlhBUkdCX01BS0UoYWxwaGEsIEZYU1lTX3JvdW5kKFIgKiAyNTUpLCBGWFNZU19yb3VuZChHICogMjU1KSwgRlhTWVNfcm91bmQoQiAqIDI1NSkpKTsKLSAgICB9Ci0gICAgaW50IHBpdGNoID0gcEJpdG1hcC0+R2V0UGl0Y2goKTsKLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICBGWF9EV09SRCogZGliX2J1ZiA9IChGWF9EV09SRCopKHBCaXRtYXAtPkdldEJ1ZmZlcigpICsgcm93ICogcGl0Y2gpOwotICAgICAgICBmb3IgKGludCBjb2x1bW4gPSAwOyBjb2x1bW4gPCB3aWR0aDsgY29sdW1uICsrKSB7Ci0gICAgICAgICAgICBGWF9GTE9BVCB4ID0gKEZYX0ZMT0FUKWNvbHVtbiwgeSA9IChGWF9GTE9BVClyb3c7Ci0gICAgICAgICAgICBtYXRyaXguVHJhbnNmb3JtKHgsIHkpOwotICAgICAgICAgICAgRlhfRkxPQVQgc2NhbGUgPSBGWFNZU19EaXYoRlhTWVNfTXVsKHggLSBzdGFydF94LCB4X3NwYW4pICsgRlhTWVNfTXVsKHkgLSBzdGFydF95LCB5X3NwYW4pLCBheGlzX2xlbl9zcXVhcmUpOwotICAgICAgICAgICAgaW50IGluZGV4ID0gKEZYX0lOVDMyKShzY2FsZSAqIChTSEFESU5HX1NURVBTIC0gMSkpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIGlmICghYlN0YXJ0RXh0ZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbmRleCA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID49IFNIQURJTkdfU1RFUFMpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWJFbmRFeHRlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluZGV4ID0gU0hBRElOR19TVEVQUyAtIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkaWJfYnVmW2NvbHVtbl0gPSByZ2JfYXJyYXlbaW5kZXhdOworICAgICAgICBpbmRleCA9IDA7CisgICAgICB9IGVsc2UgaWYgKGluZGV4ID49IFNIQURJTkdfU1RFUFMpIHsKKyAgICAgICAgaWYgKCFiRW5kRXh0ZW5kKSB7CisgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSBTSEFESU5HX1NURVBTIC0gMTsKKyAgICAgIH0KKyAgICAgIGRpYl9idWZbY29sdW1uXSA9IHJnYl9hcnJheVtpbmRleF07CiAgICAgfQorICB9CiB9Ci1zdGF0aWMgdm9pZCBfRHJhd1JhZGlhbFNoYWRpbmcoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LCBDUERGX0Z1bmN0aW9uKiogcEZ1bmNzLCBpbnQgbkZ1bmNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQ29sb3JTcGFjZSogcENTLCBpbnQgYWxwaGEpCi17Ci0gICAgQVNTRVJUKHBCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpOwotICAgIENQREZfQXJyYXkqIHBDb29yZHMgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIkNvb3JkcyIpKTsKLSAgICBpZiAocENvb3JkcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKK3N0YXRpYyB2b2lkIERyYXdSYWRpYWxTaGFkaW5nKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBPYmplY3QyQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRnVuY3Rpb24qKiBwRnVuY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZ1bmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEpIHsKKyAgQVNTRVJUKHBCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpOworICBDUERGX0FycmF5KiBwQ29vcmRzID0gcERpY3QtPkdldEFycmF5KCJDb29yZHMiKTsKKyAgaWYgKCFwQ29vcmRzKSB7CisgICAgcmV0dXJuOworICB9CisgIEZYX0ZMT0FUIHN0YXJ0X3ggPSBwQ29vcmRzLT5HZXROdW1iZXIoMCk7CisgIEZYX0ZMT0FUIHN0YXJ0X3kgPSBwQ29vcmRzLT5HZXROdW1iZXIoMSk7CisgIEZYX0ZMT0FUIHN0YXJ0X3IgPSBwQ29vcmRzLT5HZXROdW1iZXIoMik7CisgIEZYX0ZMT0FUIGVuZF94ID0gcENvb3Jkcy0+R2V0TnVtYmVyKDMpOworICBGWF9GTE9BVCBlbmRfeSA9IHBDb29yZHMtPkdldE51bWJlcig0KTsKKyAgRlhfRkxPQVQgZW5kX3IgPSBwQ29vcmRzLT5HZXROdW1iZXIoNSk7CisgIENGWF9NYXRyaXggbWF0cml4OworICBtYXRyaXguU2V0UmV2ZXJzZSgqcE9iamVjdDJCaXRtYXApOworICBGWF9GTE9BVCB0X21pbiA9IDAsIHRfbWF4ID0gMS4wZjsKKyAgQ1BERl9BcnJheSogcEFycmF5ID0gcERpY3QtPkdldEFycmF5KCJEb21haW4iKTsKKyAgaWYgKHBBcnJheSkgeworICAgIHRfbWluID0gcEFycmF5LT5HZXROdW1iZXIoMCk7CisgICAgdF9tYXggPSBwQXJyYXktPkdldE51bWJlcigxKTsKKyAgfQorICBGWF9CT09MIGJTdGFydEV4dGVuZCA9IEZBTFNFLCBiRW5kRXh0ZW5kID0gRkFMU0U7CisgIHBBcnJheSA9IHBEaWN0LT5HZXRBcnJheSgiRXh0ZW5kIik7CisgIGlmIChwQXJyYXkpIHsKKyAgICBiU3RhcnRFeHRlbmQgPSBwQXJyYXktPkdldEludGVnZXIoMCk7CisgICAgYkVuZEV4dGVuZCA9IHBBcnJheS0+R2V0SW50ZWdlcigxKTsKKyAgfQorICBpbnQgdG90YWxfcmVzdWx0cyA9IDA7CisgIGZvciAoaW50IGogPSAwOyBqIDwgbkZ1bmNzOyBqKyspIHsKKyAgICBpZiAocEZ1bmNzW2pdKSB7CisgICAgICB0b3RhbF9yZXN1bHRzICs9IHBGdW5jc1tqXS0+Q291bnRPdXRwdXRzKCk7CiAgICAgfQotICAgIEZYX0ZMT0FUIHN0YXJ0X3ggPSBwQ29vcmRzLT5HZXROdW1iZXIoMCk7Ci0gICAgRlhfRkxPQVQgc3RhcnRfeSA9IHBDb29yZHMtPkdldE51bWJlcigxKTsKLSAgICBGWF9GTE9BVCBzdGFydF9yID0gcENvb3Jkcy0+R2V0TnVtYmVyKDIpOwotICAgIEZYX0ZMT0FUIGVuZF94ID0gcENvb3Jkcy0+R2V0TnVtYmVyKDMpOwotICAgIEZYX0ZMT0FUIGVuZF95ID0gcENvb3Jkcy0+R2V0TnVtYmVyKDQpOwotICAgIEZYX0ZMT0FUIGVuZF9yID0gcENvb3Jkcy0+R2V0TnVtYmVyKDUpOwotICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwotICAgIG1hdHJpeC5TZXRSZXZlcnNlKCpwT2JqZWN0MkJpdG1hcCk7Ci0gICAgRlhfRkxPQVQgdF9taW4gPSAwLCB0X21heCA9IDEuMGY7Ci0gICAgQ1BERl9BcnJheSogcEFycmF5ID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJEb21haW4iKSk7Ci0gICAgaWYgKHBBcnJheSkgewotICAgICAgICB0X21pbiA9IHBBcnJheS0+R2V0TnVtYmVyKDApOwotICAgICAgICB0X21heCA9IHBBcnJheS0+R2V0TnVtYmVyKDEpOwotICAgIH0KLSAgICBGWF9CT09MIGJTdGFydEV4dGVuZCA9IEZBTFNFLCBiRW5kRXh0ZW5kID0gRkFMU0U7Ci0gICAgcEFycmF5ID0gcERpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJFeHRlbmQiKSk7Ci0gICAgaWYgKHBBcnJheSkgewotICAgICAgICBiU3RhcnRFeHRlbmQgPSBwQXJyYXktPkdldEludGVnZXIoMCk7Ci0gICAgICAgIGJFbmRFeHRlbmQgPSBwQXJyYXktPkdldEludGVnZXIoMSk7Ci0gICAgfQotICAgIGludCB0b3RhbF9yZXN1bHRzID0gMDsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IG5GdW5jczsgaiArKykgewotICAgICAgICBpZiAocEZ1bmNzW2pdKSB7Ci0gICAgICAgICAgICB0b3RhbF9yZXN1bHRzICs9IHBGdW5jc1tqXS0+Q291bnRPdXRwdXRzKCk7CisgIH0KKyAgaWYgKHBDUy0+Q291bnRDb21wb25lbnRzKCkgPiB0b3RhbF9yZXN1bHRzKSB7CisgICAgdG90YWxfcmVzdWx0cyA9IHBDUy0+Q291bnRDb21wb25lbnRzKCk7CisgIH0KKyAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IHJlc3VsdF9hcnJheSh0b3RhbF9yZXN1bHRzKTsKKyAgRlhfRkxPQVQqIHBSZXN1bHRzID0gcmVzdWx0X2FycmF5OworICBGWFNZU19tZW1zZXQocFJlc3VsdHMsIDAsIHRvdGFsX3Jlc3VsdHMgKiBzaXplb2YoRlhfRkxPQVQpKTsKKyAgRlhfRFdPUkQgcmdiX2FycmF5W1NIQURJTkdfU1RFUFNdOworICBmb3IgKGludCBpID0gMDsgaSA8IFNIQURJTkdfU1RFUFM7IGkrKykgeworICAgIEZYX0ZMT0FUIGlucHV0ID0gKHRfbWF4IC0gdF9taW4pICogaSAvIFNIQURJTkdfU1RFUFMgKyB0X21pbjsKKyAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IG5GdW5jczsgaisrKSB7CisgICAgICBpZiAocEZ1bmNzW2pdKSB7CisgICAgICAgIGludCBucmVzdWx0czsKKyAgICAgICAgaWYgKHBGdW5jc1tqXS0+Q2FsbCgmaW5wdXQsIDEsIHBSZXN1bHRzICsgb2Zmc2V0LCBucmVzdWx0cykpIHsKKyAgICAgICAgICBvZmZzZXQgKz0gbnJlc3VsdHM7CiAgICAgICAgIH0KKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKHBDUy0+Q291bnRDb21wb25lbnRzKCkgPiB0b3RhbF9yZXN1bHRzKSB7Ci0gICAgICAgIHRvdGFsX3Jlc3VsdHMgPSBwQ1MtPkNvdW50Q29tcG9uZW50cygpOworICAgIEZYX0ZMT0FUIFIgPSAwLjBmLCBHID0gMC4wZiwgQiA9IDAuMGY7CisgICAgcENTLT5HZXRSR0IocFJlc3VsdHMsIFIsIEcsIEIpOworICAgIHJnYl9hcnJheVtpXSA9CisgICAgICAgIEZYQVJHQl9UT0RJQihGWEFSR0JfTUFLRShhbHBoYSwgRlhTWVNfcm91bmQoUiAqIDI1NSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChHICogMjU1KSwgRlhTWVNfcm91bmQoQiAqIDI1NSkpKTsKKyAgfQorICBGWF9GTE9BVCBhID0gRlhTWVNfTXVsKHN0YXJ0X3ggLSBlbmRfeCwgc3RhcnRfeCAtIGVuZF94KSArCisgICAgICAgICAgICAgICBGWFNZU19NdWwoc3RhcnRfeSAtIGVuZF95LCBzdGFydF95IC0gZW5kX3kpIC0KKyAgICAgICAgICAgICAgIEZYU1lTX011bChzdGFydF9yIC0gZW5kX3IsIHN0YXJ0X3IgLSBlbmRfcik7CisgIGludCB3aWR0aCA9IHBCaXRtYXAtPkdldFdpZHRoKCk7CisgIGludCBoZWlnaHQgPSBwQml0bWFwLT5HZXRIZWlnaHQoKTsKKyAgaW50IHBpdGNoID0gcEJpdG1hcC0+R2V0UGl0Y2goKTsKKyAgRlhfQk9PTCBiRGVjcmVhc2luZyA9IEZBTFNFOworICBpZiAoc3RhcnRfciA+IGVuZF9yKSB7CisgICAgaW50IGxlbmd0aCA9IChpbnQpRlhTWVNfc3FydCgoRlhTWVNfTXVsKHN0YXJ0X3ggLSBlbmRfeCwgc3RhcnRfeCAtIGVuZF94KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfTXVsKHN0YXJ0X3kgLSBlbmRfeSwgc3RhcnRfeSAtIGVuZF95KSkpOworICAgIGlmIChsZW5ndGggPCBzdGFydF9yIC0gZW5kX3IpIHsKKyAgICAgIGJEZWNyZWFzaW5nID0gVFJVRTsKICAgICB9Ci0gICAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IHJlc3VsdF9hcnJheSh0b3RhbF9yZXN1bHRzKTsKLSAgICBGWF9GTE9BVCogcFJlc3VsdHMgPSByZXN1bHRfYXJyYXk7Ci0gICAgRlhTWVNfbWVtc2V0MzIocFJlc3VsdHMsIDAsIHRvdGFsX3Jlc3VsdHMgKiBzaXplb2YoRlhfRkxPQVQpKTsKLSAgICBGWF9EV09SRCByZ2JfYXJyYXlbU0hBRElOR19TVEVQU107Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSEFESU5HX1NURVBTOyBpICsrKSB7Ci0gICAgICAgIEZYX0ZMT0FUIGlucHV0ID0gKHRfbWF4IC0gdF9taW4pICogaSAvIFNIQURJTkdfU1RFUFMgKyB0X21pbjsKLSAgICAgICAgaW50IG9mZnNldCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbkZ1bmNzOyBqICsrKSB7Ci0gICAgICAgICAgICBpZiAocEZ1bmNzW2pdKSB7Ci0gICAgICAgICAgICAgICAgaW50IG5yZXN1bHRzOwotICAgICAgICAgICAgICAgIGlmIChwRnVuY3Nbal0tPkNhbGwoJmlucHV0LCAxLCBwUmVzdWx0cyArIG9mZnNldCwgbnJlc3VsdHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBucmVzdWx0czsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgIH0KKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgIEZYX0RXT1JEKiBkaWJfYnVmID0gKEZYX0RXT1JEKikocEJpdG1hcC0+R2V0QnVmZmVyKCkgKyByb3cgKiBwaXRjaCk7CisgICAgZm9yIChpbnQgY29sdW1uID0gMDsgY29sdW1uIDwgd2lkdGg7IGNvbHVtbisrKSB7CisgICAgICBGWF9GTE9BVCB4ID0gKEZYX0ZMT0FUKWNvbHVtbiwgeSA9IChGWF9GTE9BVClyb3c7CisgICAgICBtYXRyaXguVHJhbnNmb3JtKHgsIHkpOworICAgICAgRlhfRkxPQVQgYiA9IC0yICogKEZYU1lTX011bCh4IC0gc3RhcnRfeCwgZW5kX3ggLSBzdGFydF94KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfTXVsKHkgLSBzdGFydF95LCBlbmRfeSAtIHN0YXJ0X3kpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19NdWwoc3RhcnRfciwgZW5kX3IgLSBzdGFydF9yKSk7CisgICAgICBGWF9GTE9BVCBjID0gRlhTWVNfTXVsKHggLSBzdGFydF94LCB4IC0gc3RhcnRfeCkgKworICAgICAgICAgICAgICAgICAgIEZYU1lTX011bCh5IC0gc3RhcnRfeSwgeSAtIHN0YXJ0X3kpIC0KKyAgICAgICAgICAgICAgICAgICBGWFNZU19NdWwoc3RhcnRfciwgc3RhcnRfcik7CisgICAgICBGWF9GTE9BVCBzOworICAgICAgaWYgKGEgPT0gMCkgeworICAgICAgICBzID0gRlhTWVNfRGl2KC1jLCBiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZYX0ZMT0FUIGIyXzRhYyA9IEZYU1lTX011bChiLCBiKSAtIDQgKiBGWFNZU19NdWwoYSwgYyk7CisgICAgICAgIGlmIChiMl80YWMgPCAwKSB7CisgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgRlhfRkxPQVQgUiA9IDAuMGYsIEcgPSAwLjBmLCBCID0gMC4wZjsKLSAgICAgICAgcENTLT5HZXRSR0IocFJlc3VsdHMsIFIsIEcsIEIpOwotICAgICAgICByZ2JfYXJyYXlbaV0gPSBGWEFSR0JfVE9ESUIoRlhBUkdCX01BS0UoYWxwaGEsIEZYU1lTX3JvdW5kKFIgKiAyNTUpLCBGWFNZU19yb3VuZChHICogMjU1KSwgRlhTWVNfcm91bmQoQiAqIDI1NSkpKTsKLSAgICB9Ci0gICAgRlhfRkxPQVQgYSA9IEZYU1lTX011bChzdGFydF94IC0gZW5kX3gsIHN0YXJ0X3ggLSBlbmRfeCkgKwotICAgICAgICAgICAgICAgICBGWFNZU19NdWwoc3RhcnRfeSAtIGVuZF95LCBzdGFydF95IC0gZW5kX3kpIC0gRlhTWVNfTXVsKHN0YXJ0X3IgLSBlbmRfciwgc3RhcnRfciAtIGVuZF9yKTsKLSAgICBpbnQgd2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpOwotICAgIGludCBoZWlnaHQgPSBwQml0bWFwLT5HZXRIZWlnaHQoKTsKLSAgICBpbnQgcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpOwotICAgIEZYX0JPT0wgYkRlY3JlYXNpbmcgPSBGQUxTRTsKLSAgICBpZiAoc3RhcnRfciA+IGVuZF9yKSB7Ci0gICAgICAgIGludCBsZW5ndGggPSAoaW50KUZYU1lTX3NxcnQoKEZYU1lTX011bChzdGFydF94IC0gZW5kX3gsIHN0YXJ0X3ggLSBlbmRfeCkgKyBGWFNZU19NdWwoc3RhcnRfeSAtIGVuZF95LCBzdGFydF95IC0gZW5kX3kpKSk7Ci0gICAgICAgIGlmIChsZW5ndGggPCBzdGFydF9yIC0gZW5kX3IpIHsKLSAgICAgICAgICAgIGJEZWNyZWFzaW5nID0gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICBGWF9EV09SRCogZGliX2J1ZiA9IChGWF9EV09SRCopKHBCaXRtYXAtPkdldEJ1ZmZlcigpICsgcm93ICogcGl0Y2gpOwotICAgICAgICBmb3IgKGludCBjb2x1bW4gPSAwOyBjb2x1bW4gPCB3aWR0aDsgY29sdW1uICsrKSB7Ci0gICAgICAgICAgICBGWF9GTE9BVCB4ID0gKEZYX0ZMT0FUKWNvbHVtbiwgeSA9IChGWF9GTE9BVClyb3c7Ci0gICAgICAgICAgICBtYXRyaXguVHJhbnNmb3JtKHgsIHkpOwotICAgICAgICAgICAgRlhfRkxPQVQgYiA9IC0yICogKEZYU1lTX011bCh4IC0gc3RhcnRfeCwgZW5kX3ggLSBzdGFydF94KSArIEZYU1lTX011bCh5IC0gc3RhcnRfeSwgZW5kX3kgLSBzdGFydF95KSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfTXVsKHN0YXJ0X3IsIGVuZF9yIC0gc3RhcnRfcikpOwotICAgICAgICAgICAgRlhfRkxPQVQgYyA9IEZYU1lTX011bCh4IC0gc3RhcnRfeCwgeCAtIHN0YXJ0X3gpICsgRlhTWVNfTXVsKHkgLSBzdGFydF95LCB5IC0gc3RhcnRfeSkgLQotICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX011bChzdGFydF9yLCBzdGFydF9yKTsKLSAgICAgICAgICAgIEZYX0ZMT0FUIHM7Ci0gICAgICAgICAgICBpZiAoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcyA9IEZYU1lTX0RpdigtYywgYik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGIyXzRhYyA9IEZYU1lTX011bChiLCBiKSAtIDQgKiBGWFNZU19NdWwoYSwgYyk7Ci0gICAgICAgICAgICAgICAgaWYgKGIyXzRhYyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHJvb3QgPSBGWFNZU19zcXJ0KGIyXzRhYyk7Ci0gICAgICAgICAgICAgICAgRlhfRkxPQVQgczEsIHMyOwotICAgICAgICAgICAgICAgIGlmIChhID4gMCkgewotICAgICAgICAgICAgICAgICAgICBzMSA9IEZYU1lTX0RpdigtYiAtIHJvb3QsIDIgKiBhKTsKLSAgICAgICAgICAgICAgICAgICAgczIgPSBGWFNZU19EaXYoLWIgKyByb290LCAyICogYSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgczIgPSBGWFNZU19EaXYoLWIgLSByb290LCAyICogYSk7Ci0gICAgICAgICAgICAgICAgICAgIHMxID0gRlhTWVNfRGl2KC1iICsgcm9vdCwgMiAqIGEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYkRlY3JlYXNpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHMxID49IDAgfHwgYlN0YXJ0RXh0ZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzID0gczE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzID0gczI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoczIgPD0gMS4wZiB8fCBiRW5kRXh0ZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzID0gczI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzID0gczE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChzdGFydF9yICsgcyAqIChlbmRfciAtIHN0YXJ0X3IpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGluZGV4ID0gKEZYX0lOVDMyKShzICogKFNIQURJTkdfU1RFUFMgLSAxKSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFiU3RhcnRFeHRlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluZGV4ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpbmRleCA+PSBTSEFESU5HX1NURVBTKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFiRW5kRXh0ZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbmRleCA9IFNIQURJTkdfU1RFUFMgLSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGliX2J1Zltjb2x1bW5dID0gcmdiX2FycmF5W2luZGV4XTsKLSAgICAgICAgfQotICAgIH0KLX0KLXN0YXRpYyB2b2lkIF9EcmF3RnVuY1NoYWRpbmcoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgQ1BERl9GdW5jdGlvbioqIHBGdW5jcywgaW50IG5GdW5jcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MsIGludCBhbHBoYSkKLXsKLSAgICBBU1NFUlQocEJpdG1hcC0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYik7Ci0gICAgQ1BERl9BcnJheSogcERvbWFpbiA9IHBEaWN0LT5HZXRBcnJheShGWF9CU1RSQygiRG9tYWluIikpOwotICAgIEZYX0ZMT0FUIHhtaW4gPSAwLCB5bWluID0gMCwgeG1heCA9IDEuMGYsIHltYXggPSAxLjBmOwotICAgIGlmIChwRG9tYWluKSB7Ci0gICAgICAgIHhtaW4gPSBwRG9tYWluLT5HZXROdW1iZXIoMCk7Ci0gICAgICAgIHhtYXggPSBwRG9tYWluLT5HZXROdW1iZXIoMSk7Ci0gICAgICAgIHltaW4gPSBwRG9tYWluLT5HZXROdW1iZXIoMik7Ci0gICAgICAgIHltYXggPSBwRG9tYWluLT5HZXROdW1iZXIoMyk7Ci0gICAgfQotICAgIENGWF9BZmZpbmVNYXRyaXggbXREb21haW4yVGFyZ2V0ID0gcERpY3QtPkdldE1hdHJpeChGWF9CU1RSQygiTWF0cml4IikpOwotICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4LCByZXZlcnNlX21hdHJpeDsKLSAgICBtYXRyaXguU2V0UmV2ZXJzZSgqcE9iamVjdDJCaXRtYXApOwotICAgIHJldmVyc2VfbWF0cml4LlNldFJldmVyc2UobXREb21haW4yVGFyZ2V0KTsKLSAgICBtYXRyaXguQ29uY2F0KHJldmVyc2VfbWF0cml4KTsKLSAgICBpbnQgd2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpOwotICAgIGludCBoZWlnaHQgPSBwQml0bWFwLT5HZXRIZWlnaHQoKTsKLSAgICBpbnQgcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpOwotICAgIGludCB0b3RhbF9yZXN1bHRzID0gMDsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IG5GdW5jczsgaiArKykgewotICAgICAgICBpZiAocEZ1bmNzW2pdKSB7Ci0gICAgICAgICAgICB0b3RhbF9yZXN1bHRzICs9IHBGdW5jc1tqXS0+Q291bnRPdXRwdXRzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBDUy0+Q291bnRDb21wb25lbnRzKCkgPiB0b3RhbF9yZXN1bHRzKSB7Ci0gICAgICAgIHRvdGFsX3Jlc3VsdHMgPSBwQ1MtPkNvdW50Q29tcG9uZW50cygpOwotICAgIH0KLSAgICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCAxNj4gcmVzdWx0X2FycmF5KHRvdGFsX3Jlc3VsdHMpOwotICAgIEZYX0ZMT0FUKiBwUmVzdWx0cyA9IHJlc3VsdF9hcnJheTsKLSAgICBGWFNZU19tZW1zZXQzMihwUmVzdWx0cywgMCwgdG90YWxfcmVzdWx0cyAqIHNpemVvZihGWF9GTE9BVCkpOwotICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgIEZYX0RXT1JEKiBkaWJfYnVmID0gKEZYX0RXT1JEKikocEJpdG1hcC0+R2V0QnVmZmVyKCkgKyByb3cgKiBwaXRjaCk7Ci0gICAgICAgIGZvciAoaW50IGNvbHVtbiA9IDA7IGNvbHVtbiA8IHdpZHRoOyBjb2x1bW4gKyspIHsKLSAgICAgICAgICAgIEZYX0ZMT0FUIHggPSAoRlhfRkxPQVQpY29sdW1uLCB5ID0gKEZYX0ZMT0FUKXJvdzsKLSAgICAgICAgICAgIG1hdHJpeC5UcmFuc2Zvcm0oeCwgeSk7Ci0gICAgICAgICAgICBpZiAoeCA8IHhtaW4gfHwgeCA+IHhtYXggfHwgeSA8IHltaW4gfHwgeSA+IHltYXgpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX0ZMT0FUIGlucHV0WzJdOwotICAgICAgICAgICAgaW50IG9mZnNldCA9IDA7Ci0gICAgICAgICAgICBpbnB1dFswXSA9IHg7Ci0gICAgICAgICAgICBpbnB1dFsxXSA9IHk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG5GdW5jczsgaiArKykgewotICAgICAgICAgICAgICAgIGlmIChwRnVuY3Nbal0pIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG5yZXN1bHRzOwotICAgICAgICAgICAgICAgICAgICBpZiAocEZ1bmNzW2pdLT5DYWxsKGlucHV0LCAyLCBwUmVzdWx0cyArIG9mZnNldCwgbnJlc3VsdHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbnJlc3VsdHM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9GTE9BVCBSID0gMC4wZiwgRyA9IDAuMGYsIEIgPSAwLjBmOwotICAgICAgICAgICAgcENTLT5HZXRSR0IocFJlc3VsdHMsIFIsIEcsIEIpOwotICAgICAgICAgICAgZGliX2J1Zltjb2x1bW5dID0gRlhBUkdCX1RPRElCKEZYQVJHQl9NQUtFKGFscGhhLCAoRlhfSU5UMzIpKFIgKiAyNTUpLCAoRlhfSU5UMzIpKEcgKiAyNTUpLCAoRlhfSU5UMzIpKEIgKiAyNTUpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1GWF9CT09MIF9HZXRTY2FubGluZUludGVyc2VjdChpbnQgeSwgRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsIEZYX0ZMT0FUJiB4KQotewotICAgIGlmICh5MSA9PSB5MikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmICh5MSA8IHkyKSB7Ci0gICAgICAgIGlmICh5IDwgeTEgfHwgeSA+IHkyKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoeSA8IHkyIHx8IHkgPiB5MSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIHggPSB4MSArIEZYU1lTX011bERpdih4MiAtIHgxLCB5IC0geTEsIHkyIC0geTEpOwotICAgIHJldHVybiBUUlVFOwotfQotc3RhdGljIHZvaWQgX0RyYXdHb3VyYXVkKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGFscGhhLCBDUERGX01lc2hWZXJ0ZXggdHJpYW5nbGVbM10pCi17Ci0gICAgRlhfRkxPQVQgbWluX3kgPSB0cmlhbmdsZVswXS55LCBtYXhfeSA9IHRyaWFuZ2xlWzBdLnk7Ci0gICAgZm9yIChpbnQgaSA9IDE7IGkgPCAzOyBpICsrKSB7Ci0gICAgICAgIGlmIChtaW5feSA+IHRyaWFuZ2xlW2ldLnkpIHsKLSAgICAgICAgICAgIG1pbl95ID0gdHJpYW5nbGVbaV0ueTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWF4X3kgPCB0cmlhbmdsZVtpXS55KSB7Ci0gICAgICAgICAgICBtYXhfeSA9IHRyaWFuZ2xlW2ldLnk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1pbl95ID09IG1heF95KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IG1pbl95aSA9IChpbnQpRlhTWVNfZmxvb3IobWluX3kpLCBtYXhfeWkgPSAoaW50KUZYU1lTX2NlaWwobWF4X3kpOwotICAgIGlmIChtaW5feWkgPCAwKSB7Ci0gICAgICAgIG1pbl95aSA9IDA7Ci0gICAgfQotICAgIGlmIChtYXhfeWkgPj0gcEJpdG1hcC0+R2V0SGVpZ2h0KCkpIHsKLSAgICAgICAgbWF4X3lpID0gcEJpdG1hcC0+R2V0SGVpZ2h0KCkgLSAxOwotICAgIH0KLSAgICBmb3IgKGludCB5ID0gbWluX3lpOyB5IDw9IG1heF95aTsgeSArKykgewotICAgICAgICBpbnQgbkludGVyc2VjdHMgPSAwOwotICAgICAgICBGWF9GTE9BVCBpbnRlcl94WzNdLCByWzNdLCBnWzNdLCBiWzNdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkgKyspIHsKLSAgICAgICAgICAgIENQREZfTWVzaFZlcnRleCYgdmVydGV4MSA9IHRyaWFuZ2xlW2ldOwotICAgICAgICAgICAgQ1BERl9NZXNoVmVydGV4JiB2ZXJ0ZXgyID0gdHJpYW5nbGVbKGkgKyAxKSAlIDNdOwotICAgICAgICAgICAgRlhfQk9PTCBiSW50ZXJzZWN0ID0gX0dldFNjYW5saW5lSW50ZXJzZWN0KHksIHZlcnRleDEueCwgdmVydGV4MS55LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4Mi54LCB2ZXJ0ZXgyLnksIGludGVyX3hbbkludGVyc2VjdHNdKTsKLSAgICAgICAgICAgIGlmICghYkludGVyc2VjdCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcltuSW50ZXJzZWN0c10gPSB2ZXJ0ZXgxLnIgKyBGWFNZU19NdWxEaXYodmVydGV4Mi5yIC0gdmVydGV4MS5yLCB5IC0gdmVydGV4MS55LCB2ZXJ0ZXgyLnkgLSB2ZXJ0ZXgxLnkpOwotICAgICAgICAgICAgZ1tuSW50ZXJzZWN0c10gPSB2ZXJ0ZXgxLmcgKyBGWFNZU19NdWxEaXYodmVydGV4Mi5nIC0gdmVydGV4MS5nLCB5IC0gdmVydGV4MS55LCB2ZXJ0ZXgyLnkgLSB2ZXJ0ZXgxLnkpOwotICAgICAgICAgICAgYltuSW50ZXJzZWN0c10gPSB2ZXJ0ZXgxLmIgKyBGWFNZU19NdWxEaXYodmVydGV4Mi5iIC0gdmVydGV4MS5iLCB5IC0gdmVydGV4MS55LCB2ZXJ0ZXgyLnkgLSB2ZXJ0ZXgxLnkpOwotICAgICAgICAgICAgbkludGVyc2VjdHMgKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5JbnRlcnNlY3RzICE9IDIpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludCBtaW5feCwgbWF4X3gsIHN0YXJ0X2luZGV4LCBlbmRfaW5kZXg7Ci0gICAgICAgIGlmIChpbnRlcl94WzBdIDwgaW50ZXJfeFsxXSkgewotICAgICAgICAgICAgbWluX3ggPSAoaW50KUZYU1lTX2Zsb29yKGludGVyX3hbMF0pOwotICAgICAgICAgICAgbWF4X3ggPSAoaW50KUZYU1lTX2NlaWwoaW50ZXJfeFsxXSk7Ci0gICAgICAgICAgICBzdGFydF9pbmRleCA9IDA7Ci0gICAgICAgICAgICBlbmRfaW5kZXggPSAxOworICAgICAgICBGWF9GTE9BVCByb290ID0gRlhTWVNfc3FydChiMl80YWMpOworICAgICAgICBGWF9GTE9BVCBzMSwgczI7CisgICAgICAgIGlmIChhID4gMCkgeworICAgICAgICAgIHMxID0gRlhTWVNfRGl2KC1iIC0gcm9vdCwgMiAqIGEpOworICAgICAgICAgIHMyID0gRlhTWVNfRGl2KC1iICsgcm9vdCwgMiAqIGEpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWluX3ggPSAoaW50KUZYU1lTX2Zsb29yKGludGVyX3hbMV0pOwotICAgICAgICAgICAgbWF4X3ggPSAoaW50KUZYU1lTX2NlaWwoaW50ZXJfeFswXSk7Ci0gICAgICAgICAgICBzdGFydF9pbmRleCA9IDE7Ci0gICAgICAgICAgICBlbmRfaW5kZXggPSAwOworICAgICAgICAgIHMyID0gRlhTWVNfRGl2KC1iIC0gcm9vdCwgMiAqIGEpOworICAgICAgICAgIHMxID0gRlhTWVNfRGl2KC1iICsgcm9vdCwgMiAqIGEpOwogICAgICAgICB9Ci0gICAgICAgIGludCBzdGFydF94ID0gbWluX3gsIGVuZF94ID0gbWF4X3g7Ci0gICAgICAgIGlmIChzdGFydF94IDwgMCkgewotICAgICAgICAgICAgc3RhcnRfeCA9IDA7CisgICAgICAgIGlmIChiRGVjcmVhc2luZykgeworICAgICAgICAgIGlmIChzMSA+PSAwIHx8IGJTdGFydEV4dGVuZCkgeworICAgICAgICAgICAgcyA9IHMxOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzID0gczI7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChzMiA8PSAxLjBmIHx8IGJFbmRFeHRlbmQpIHsKKyAgICAgICAgICAgIHMgPSBzMjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcyA9IHMxOworICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoZW5kX3ggPiBwQml0bWFwLT5HZXRXaWR0aCgpKSB7Ci0gICAgICAgICAgICBlbmRfeCA9IHBCaXRtYXAtPkdldFdpZHRoKCk7CisgICAgICAgIGlmICgoc3RhcnRfciArIHMgKiAoZW5kX3IgLSBzdGFydF9yKSkgPCAwKSB7CisgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgRlhfTFBCWVRFIGRpYl9idWYgPSBwQml0bWFwLT5HZXRCdWZmZXIoKSArIHkgKiBwQml0bWFwLT5HZXRQaXRjaCgpICsgc3RhcnRfeCAqIDQ7Ci0gICAgICAgIEZYX0ZMT0FUIHJfdW5pdCA9IChyW2VuZF9pbmRleF0gLSByW3N0YXJ0X2luZGV4XSkgLyAobWF4X3ggLSBtaW5feCk7Ci0gICAgICAgIEZYX0ZMT0FUIGdfdW5pdCA9IChnW2VuZF9pbmRleF0gLSBnW3N0YXJ0X2luZGV4XSkgLyAobWF4X3ggLSBtaW5feCk7Ci0gICAgICAgIEZYX0ZMT0FUIGJfdW5pdCA9IChiW2VuZF9pbmRleF0gLSBiW3N0YXJ0X2luZGV4XSkgLyAobWF4X3ggLSBtaW5feCk7Ci0gICAgICAgIEZYX0ZMT0FUIFIgPSByW3N0YXJ0X2luZGV4XSArIChzdGFydF94IC0gbWluX3gpICogcl91bml0OwotICAgICAgICBGWF9GTE9BVCBHID0gZ1tzdGFydF9pbmRleF0gKyAoc3RhcnRfeCAtIG1pbl94KSAqIGdfdW5pdDsKLSAgICAgICAgRlhfRkxPQVQgQiA9IGJbc3RhcnRfaW5kZXhdICsgKHN0YXJ0X3ggLSBtaW5feCkgKiBiX3VuaXQ7Ci0gICAgICAgIGZvciAoaW50IHggPSBzdGFydF94OyB4IDwgZW5kX3g7IHggKyspIHsKLSAgICAgICAgICAgIFIgKz0gcl91bml0OwotICAgICAgICAgICAgRyArPSBnX3VuaXQ7Ci0gICAgICAgICAgICBCICs9IGJfdW5pdDsKLSAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGliX2J1ZiwgRlhBUkdCX01BS0UoYWxwaGEsIChGWF9JTlQzMikoUiAqIDI1NSksIChGWF9JTlQzMikoRyAqIDI1NSksIChGWF9JTlQzMikoQiAqIDI1NSkpKTsKLSAgICAgICAgICAgIGRpYl9idWYgKz0gNDsKKyAgICAgIH0KKyAgICAgIGludCBpbmRleCA9IChpbnQzMl90KShzICogKFNIQURJTkdfU1RFUFMgLSAxKSk7CisgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIGlmICghYlN0YXJ0RXh0ZW5kKSB7CisgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSAwOworICAgICAgfQorICAgICAgaWYgKGluZGV4ID49IFNIQURJTkdfU1RFUFMpIHsKKyAgICAgICAgaWYgKCFiRW5kRXh0ZW5kKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSBTSEFESU5HX1NURVBTIC0gMTsKKyAgICAgIH0KKyAgICAgIGRpYl9idWZbY29sdW1uXSA9IHJnYl9hcnJheVtpbmRleF07CiAgICAgfQorICB9CiB9Ci1zdGF0aWMgdm9pZCBfRHJhd0ZyZWVHb3VyYXVkU2hhZGluZyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9TdHJlYW0qIHBTaGFkaW5nU3RyZWFtLCBDUERGX0Z1bmN0aW9uKiogcEZ1bmNzLCBpbnQgbkZ1bmNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MsIGludCBhbHBoYSkKLXsKLSAgICBBU1NFUlQocEJpdG1hcC0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYik7Ci0gICAgaWYgKHBTaGFkaW5nU3RyZWFtLT5HZXRUeXBlKCkgIT0gUERGT0JKX1NUUkVBTSkgewotICAgICAgICByZXR1cm47CitzdGF0aWMgdm9pZCBEcmF3RnVuY1NoYWRpbmcoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBPYmplY3QyQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9GdW5jdGlvbioqIHBGdW5jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZ1bmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQ29sb3JTcGFjZSogcENTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYSkgeworICBBU1NFUlQocEJpdG1hcC0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYik7CisgIENQREZfQXJyYXkqIHBEb21haW4gPSBwRGljdC0+R2V0QXJyYXkoIkRvbWFpbiIpOworICBGWF9GTE9BVCB4bWluID0gMCwgeW1pbiA9IDAsIHhtYXggPSAxLjBmLCB5bWF4ID0gMS4wZjsKKyAgaWYgKHBEb21haW4pIHsKKyAgICB4bWluID0gcERvbWFpbi0+R2V0TnVtYmVyKDApOworICAgIHhtYXggPSBwRG9tYWluLT5HZXROdW1iZXIoMSk7CisgICAgeW1pbiA9IHBEb21haW4tPkdldE51bWJlcigyKTsKKyAgICB5bWF4ID0gcERvbWFpbi0+R2V0TnVtYmVyKDMpOworICB9CisgIENGWF9NYXRyaXggbXREb21haW4yVGFyZ2V0ID0gcERpY3QtPkdldE1hdHJpeCgiTWF0cml4Iik7CisgIENGWF9NYXRyaXggbWF0cml4LCByZXZlcnNlX21hdHJpeDsKKyAgbWF0cml4LlNldFJldmVyc2UoKnBPYmplY3QyQml0bWFwKTsKKyAgcmV2ZXJzZV9tYXRyaXguU2V0UmV2ZXJzZShtdERvbWFpbjJUYXJnZXQpOworICBtYXRyaXguQ29uY2F0KHJldmVyc2VfbWF0cml4KTsKKyAgaW50IHdpZHRoID0gcEJpdG1hcC0+R2V0V2lkdGgoKTsKKyAgaW50IGhlaWdodCA9IHBCaXRtYXAtPkdldEhlaWdodCgpOworICBpbnQgcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpOworICBpbnQgdG90YWxfcmVzdWx0cyA9IDA7CisgIGZvciAoaW50IGogPSAwOyBqIDwgbkZ1bmNzOyBqKyspIHsKKyAgICBpZiAocEZ1bmNzW2pdKSB7CisgICAgICB0b3RhbF9yZXN1bHRzICs9IHBGdW5jc1tqXS0+Q291bnRPdXRwdXRzKCk7CiAgICAgfQotICAgIENQREZfTWVzaFN0cmVhbSBzdHJlYW07Ci0gICAgaWYgKCFzdHJlYW0uTG9hZChwU2hhZGluZ1N0cmVhbSwgcEZ1bmNzLCBuRnVuY3MsIHBDUykpIHsKLSAgICAgICAgcmV0dXJuOworICB9CisgIGlmIChwQ1MtPkNvdW50Q29tcG9uZW50cygpID4gdG90YWxfcmVzdWx0cykgeworICAgIHRvdGFsX3Jlc3VsdHMgPSBwQ1MtPkNvdW50Q29tcG9uZW50cygpOworICB9CisgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiByZXN1bHRfYXJyYXkodG90YWxfcmVzdWx0cyk7CisgIEZYX0ZMT0FUKiBwUmVzdWx0cyA9IHJlc3VsdF9hcnJheTsKKyAgRlhTWVNfbWVtc2V0KHBSZXN1bHRzLCAwLCB0b3RhbF9yZXN1bHRzICogc2l6ZW9mKEZYX0ZMT0FUKSk7CisgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICBGWF9EV09SRCogZGliX2J1ZiA9IChGWF9EV09SRCopKHBCaXRtYXAtPkdldEJ1ZmZlcigpICsgcm93ICogcGl0Y2gpOworICAgIGZvciAoaW50IGNvbHVtbiA9IDA7IGNvbHVtbiA8IHdpZHRoOyBjb2x1bW4rKykgeworICAgICAgRlhfRkxPQVQgeCA9IChGWF9GTE9BVCljb2x1bW4sIHkgPSAoRlhfRkxPQVQpcm93OworICAgICAgbWF0cml4LlRyYW5zZm9ybSh4LCB5KTsKKyAgICAgIGlmICh4IDwgeG1pbiB8fCB4ID4geG1heCB8fCB5IDwgeW1pbiB8fCB5ID4geW1heCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIEZYX0ZMT0FUIGlucHV0WzJdOworICAgICAgaW50IG9mZnNldCA9IDA7CisgICAgICBpbnB1dFswXSA9IHg7CisgICAgICBpbnB1dFsxXSA9IHk7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG5GdW5jczsgaisrKSB7CisgICAgICAgIGlmIChwRnVuY3Nbal0pIHsKKyAgICAgICAgICBpbnQgbnJlc3VsdHM7CisgICAgICAgICAgaWYgKHBGdW5jc1tqXS0+Q2FsbChpbnB1dCwgMiwgcFJlc3VsdHMgKyBvZmZzZXQsIG5yZXN1bHRzKSkgeworICAgICAgICAgICAgb2Zmc2V0ICs9IG5yZXN1bHRzOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgRlhfRkxPQVQgUiA9IDAuMGYsIEcgPSAwLjBmLCBCID0gMC4wZjsKKyAgICAgIHBDUy0+R2V0UkdCKHBSZXN1bHRzLCBSLCBHLCBCKTsKKyAgICAgIGRpYl9idWZbY29sdW1uXSA9IEZYQVJHQl9UT0RJQihGWEFSR0JfTUFLRSgKKyAgICAgICAgICBhbHBoYSwgKGludDMyX3QpKFIgKiAyNTUpLCAoaW50MzJfdCkoRyAqIDI1NSksIChpbnQzMl90KShCICogMjU1KSkpOworICAgIH0KKyAgfQorfQorRlhfQk9PTCBfR2V0U2NhbmxpbmVJbnRlcnNlY3QoaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiB4KSB7CisgIGlmICh5MSA9PSB5MikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoeTEgPCB5MikgeworICAgIGlmICh5IDwgeTEgfHwgeSA+IHkyKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICh5IDwgeTIgfHwgeSA+IHkxKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CisgIHggPSB4MSArIEZYU1lTX011bERpdih4MiAtIHgxLCB5IC0geTEsIHkyIC0geTEpOworICByZXR1cm4gVFJVRTsKK30KK3N0YXRpYyB2b2lkIERyYXdHb3VyYXVkKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWVzaFZlcnRleCB0cmlhbmdsZVszXSkgeworICBGWF9GTE9BVCBtaW5feSA9IHRyaWFuZ2xlWzBdLnksIG1heF95ID0gdHJpYW5nbGVbMF0ueTsKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCAzOyBpKyspIHsKKyAgICBpZiAobWluX3kgPiB0cmlhbmdsZVtpXS55KSB7CisgICAgICBtaW5feSA9IHRyaWFuZ2xlW2ldLnk7CisgICAgfQorICAgIGlmIChtYXhfeSA8IHRyaWFuZ2xlW2ldLnkpIHsKKyAgICAgIG1heF95ID0gdHJpYW5nbGVbaV0ueTsKKyAgICB9CisgIH0KKyAgaWYgKG1pbl95ID09IG1heF95KSB7CisgICAgcmV0dXJuOworICB9CisgIGludCBtaW5feWkgPSAoaW50KUZYU1lTX2Zsb29yKG1pbl95KSwgbWF4X3lpID0gKGludClGWFNZU19jZWlsKG1heF95KTsKKyAgaWYgKG1pbl95aSA8IDApIHsKKyAgICBtaW5feWkgPSAwOworICB9CisgIGlmIChtYXhfeWkgPj0gcEJpdG1hcC0+R2V0SGVpZ2h0KCkpIHsKKyAgICBtYXhfeWkgPSBwQml0bWFwLT5HZXRIZWlnaHQoKSAtIDE7CisgIH0KKyAgZm9yIChpbnQgeSA9IG1pbl95aTsgeSA8PSBtYXhfeWk7IHkrKykgeworICAgIGludCBuSW50ZXJzZWN0cyA9IDA7CisgICAgRlhfRkxPQVQgaW50ZXJfeFszXSwgclszXSwgZ1szXSwgYlszXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgQ1BERl9NZXNoVmVydGV4JiB2ZXJ0ZXgxID0gdHJpYW5nbGVbaV07CisgICAgICBDUERGX01lc2hWZXJ0ZXgmIHZlcnRleDIgPSB0cmlhbmdsZVsoaSArIDEpICUgM107CisgICAgICBGWF9CT09MIGJJbnRlcnNlY3QgPSBfR2V0U2NhbmxpbmVJbnRlcnNlY3QoCisgICAgICAgICAgeSwgdmVydGV4MS54LCB2ZXJ0ZXgxLnksIHZlcnRleDIueCwgdmVydGV4Mi55LCBpbnRlcl94W25JbnRlcnNlY3RzXSk7CisgICAgICBpZiAoIWJJbnRlcnNlY3QpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICByW25JbnRlcnNlY3RzXSA9CisgICAgICAgICAgdmVydGV4MS5yICsgRlhTWVNfTXVsRGl2KHZlcnRleDIuciAtIHZlcnRleDEuciwgeSAtIHZlcnRleDEueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGV4Mi55IC0gdmVydGV4MS55KTsKKyAgICAgIGdbbkludGVyc2VjdHNdID0KKyAgICAgICAgICB2ZXJ0ZXgxLmcgKyBGWFNZU19NdWxEaXYodmVydGV4Mi5nIC0gdmVydGV4MS5nLCB5IC0gdmVydGV4MS55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXgyLnkgLSB2ZXJ0ZXgxLnkpOworICAgICAgYltuSW50ZXJzZWN0c10gPQorICAgICAgICAgIHZlcnRleDEuYiArIEZYU1lTX011bERpdih2ZXJ0ZXgyLmIgLSB2ZXJ0ZXgxLmIsIHkgLSB2ZXJ0ZXgxLnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleDIueSAtIHZlcnRleDEueSk7CisgICAgICBuSW50ZXJzZWN0cysrOworICAgIH0KKyAgICBpZiAobkludGVyc2VjdHMgIT0gMikgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGludCBtaW5feCwgbWF4X3gsIHN0YXJ0X2luZGV4LCBlbmRfaW5kZXg7CisgICAgaWYgKGludGVyX3hbMF0gPCBpbnRlcl94WzFdKSB7CisgICAgICBtaW5feCA9IChpbnQpRlhTWVNfZmxvb3IoaW50ZXJfeFswXSk7CisgICAgICBtYXhfeCA9IChpbnQpRlhTWVNfY2VpbChpbnRlcl94WzFdKTsKKyAgICAgIHN0YXJ0X2luZGV4ID0gMDsKKyAgICAgIGVuZF9pbmRleCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIG1pbl94ID0gKGludClGWFNZU19mbG9vcihpbnRlcl94WzFdKTsKKyAgICAgIG1heF94ID0gKGludClGWFNZU19jZWlsKGludGVyX3hbMF0pOworICAgICAgc3RhcnRfaW5kZXggPSAxOworICAgICAgZW5kX2luZGV4ID0gMDsKKyAgICB9CisgICAgaW50IHN0YXJ0X3ggPSBtaW5feCwgZW5kX3ggPSBtYXhfeDsKKyAgICBpZiAoc3RhcnRfeCA8IDApIHsKKyAgICAgIHN0YXJ0X3ggPSAwOworICAgIH0KKyAgICBpZiAoZW5kX3ggPiBwQml0bWFwLT5HZXRXaWR0aCgpKSB7CisgICAgICBlbmRfeCA9IHBCaXRtYXAtPkdldFdpZHRoKCk7CisgICAgfQorICAgIHVpbnQ4X3QqIGRpYl9idWYgPQorICAgICAgICBwQml0bWFwLT5HZXRCdWZmZXIoKSArIHkgKiBwQml0bWFwLT5HZXRQaXRjaCgpICsgc3RhcnRfeCAqIDQ7CisgICAgRlhfRkxPQVQgcl91bml0ID0gKHJbZW5kX2luZGV4XSAtIHJbc3RhcnRfaW5kZXhdKSAvIChtYXhfeCAtIG1pbl94KTsKKyAgICBGWF9GTE9BVCBnX3VuaXQgPSAoZ1tlbmRfaW5kZXhdIC0gZ1tzdGFydF9pbmRleF0pIC8gKG1heF94IC0gbWluX3gpOworICAgIEZYX0ZMT0FUIGJfdW5pdCA9IChiW2VuZF9pbmRleF0gLSBiW3N0YXJ0X2luZGV4XSkgLyAobWF4X3ggLSBtaW5feCk7CisgICAgRlhfRkxPQVQgUiA9IHJbc3RhcnRfaW5kZXhdICsgKHN0YXJ0X3ggLSBtaW5feCkgKiByX3VuaXQ7CisgICAgRlhfRkxPQVQgRyA9IGdbc3RhcnRfaW5kZXhdICsgKHN0YXJ0X3ggLSBtaW5feCkgKiBnX3VuaXQ7CisgICAgRlhfRkxPQVQgQiA9IGJbc3RhcnRfaW5kZXhdICsgKHN0YXJ0X3ggLSBtaW5feCkgKiBiX3VuaXQ7CisgICAgZm9yIChpbnQgeCA9IHN0YXJ0X3g7IHggPCBlbmRfeDsgeCsrKSB7CisgICAgICBSICs9IHJfdW5pdDsKKyAgICAgIEcgKz0gZ191bml0OworICAgICAgQiArPSBiX3VuaXQ7CisgICAgICBGWEFSR0JfU0VURElCKGRpYl9idWYsCisgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9NQUtFKGFscGhhLCAoaW50MzJfdCkoUiAqIDI1NSksIChpbnQzMl90KShHICogMjU1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpKEIgKiAyNTUpKSk7CisgICAgICBkaWJfYnVmICs9IDQ7CisgICAgfQorICB9Cit9CitzdGF0aWMgdm9pZCBEcmF3RnJlZUdvdXJhdWRTaGFkaW5nKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE9iamVjdDJCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwU2hhZGluZ1N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9GdW5jdGlvbioqIHBGdW5jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5GdW5jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYSkgeworICBBU1NFUlQocEJpdG1hcC0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYik7CisKKyAgQ1BERl9NZXNoU3RyZWFtIHN0cmVhbTsKKyAgaWYgKCFzdHJlYW0uTG9hZChwU2hhZGluZ1N0cmVhbSwgcEZ1bmNzLCBuRnVuY3MsIHBDUykpCisgICAgcmV0dXJuOworCisgIENQREZfTWVzaFZlcnRleCB0cmlhbmdsZVszXTsKKyAgRlhTWVNfbWVtc2V0KHRyaWFuZ2xlLCAwLCBzaXplb2YodHJpYW5nbGUpKTsKKworICB3aGlsZSAoIXN0cmVhbS5tX0JpdFN0cmVhbS5Jc0VPRigpKSB7CisgICAgQ1BERl9NZXNoVmVydGV4IHZlcnRleDsKKyAgICBGWF9EV09SRCBmbGFnID0gc3RyZWFtLkdldFZlcnRleCh2ZXJ0ZXgsIHBPYmplY3QyQml0bWFwKTsKKyAgICBpZiAoZmxhZyA9PSAwKSB7CisgICAgICB0cmlhbmdsZVswXSA9IHZlcnRleDsKKyAgICAgIGZvciAoaW50IGogPSAxOyBqIDwgMzsgaisrKSB7CisgICAgICAgIHN0cmVhbS5HZXRWZXJ0ZXgodHJpYW5nbGVbal0sIHBPYmplY3QyQml0bWFwKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGZsYWcgPT0gMSkgeworICAgICAgICB0cmlhbmdsZVswXSA9IHRyaWFuZ2xlWzFdOworICAgICAgfQorICAgICAgdHJpYW5nbGVbMV0gPSB0cmlhbmdsZVsyXTsKKyAgICAgIHRyaWFuZ2xlWzJdID0gdmVydGV4OworICAgIH0KKyAgICBEcmF3R291cmF1ZChwQml0bWFwLCBhbHBoYSwgdHJpYW5nbGUpOworICB9Cit9CitzdGF0aWMgdm9pZCBEcmF3TGF0dGljZUdvdXJhdWRTaGFkaW5nKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE9iamVjdDJCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwU2hhZGluZ1N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9GdW5jdGlvbioqIHBGdW5jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5GdW5jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYSkgeworICBBU1NFUlQocEJpdG1hcC0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYik7CisKKyAgaW50IHJvd192ZXJ0cyA9IHBTaGFkaW5nU3RyZWFtLT5HZXREaWN0KCktPkdldEludGVnZXIoIlZlcnRpY2VzUGVyUm93Iik7CisgIGlmIChyb3dfdmVydHMgPCAyKQorICAgIHJldHVybjsKKworICBDUERGX01lc2hTdHJlYW0gc3RyZWFtOworICBpZiAoIXN0cmVhbS5Mb2FkKHBTaGFkaW5nU3RyZWFtLCBwRnVuY3MsIG5GdW5jcywgcENTKSkKKyAgICByZXR1cm47CisKKyAgQ1BERl9NZXNoVmVydGV4KiB2ZXJ0ZXggPSBGWF9BbGxvYzJEKENQREZfTWVzaFZlcnRleCwgcm93X3ZlcnRzLCAyKTsKKyAgaWYgKCFzdHJlYW0uR2V0VmVydGV4Um93KHZlcnRleCwgcm93X3ZlcnRzLCBwT2JqZWN0MkJpdG1hcCkpIHsKKyAgICBGWF9GcmVlKHZlcnRleCk7CisgICAgcmV0dXJuOworICB9CisgIGludCBsYXN0X2luZGV4ID0gMDsKKyAgd2hpbGUgKDEpIHsKKyAgICBDUERGX01lc2hWZXJ0ZXgqIGxhc3Rfcm93ID0gdmVydGV4ICsgbGFzdF9pbmRleCAqIHJvd192ZXJ0czsKKyAgICBDUERGX01lc2hWZXJ0ZXgqIHRoaXNfcm93ID0gdmVydGV4ICsgKDEgLSBsYXN0X2luZGV4KSAqIHJvd192ZXJ0czsKKyAgICBpZiAoIXN0cmVhbS5HZXRWZXJ0ZXhSb3codGhpc19yb3csIHJvd192ZXJ0cywgcE9iamVjdDJCaXRtYXApKSB7CisgICAgICBGWF9GcmVlKHZlcnRleCk7CisgICAgICByZXR1cm47CiAgICAgfQogICAgIENQREZfTWVzaFZlcnRleCB0cmlhbmdsZVszXTsKLSAgICBGWFNZU19tZW1zZXQzMih0cmlhbmdsZSwgMCwgc2l6ZW9mKHRyaWFuZ2xlKSk7Ci0KLSAgICB3aGlsZSAoIXN0cmVhbS5tX0JpdFN0cmVhbS5Jc0VPRigpKSB7Ci0gICAgICAgIENQREZfTWVzaFZlcnRleCB2ZXJ0ZXg7Ci0gICAgICAgIEZYX0RXT1JEIGZsYWcgPSBzdHJlYW0uR2V0VmVydGV4KHZlcnRleCwgcE9iamVjdDJCaXRtYXApOwotICAgICAgICBpZiAoZmxhZyA9PSAwKSB7Ci0gICAgICAgICAgICB0cmlhbmdsZVswXSA9IHZlcnRleDsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAxOyBqIDwgMzsgaiArKykgewotICAgICAgICAgICAgICAgIHN0cmVhbS5HZXRWZXJ0ZXgodHJpYW5nbGVbal0sIHBPYmplY3QyQml0bWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChmbGFnID09IDEpIHsKLSAgICAgICAgICAgICAgICB0cmlhbmdsZVswXSA9IHRyaWFuZ2xlWzFdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJpYW5nbGVbMV0gPSB0cmlhbmdsZVsyXTsKLSAgICAgICAgICAgIHRyaWFuZ2xlWzJdID0gdmVydGV4OwotICAgICAgICB9Ci0gICAgICAgIF9EcmF3R291cmF1ZChwQml0bWFwLCBhbHBoYSwgdHJpYW5nbGUpOworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcm93X3ZlcnRzOyBpKyspIHsKKyAgICAgIHRyaWFuZ2xlWzBdID0gbGFzdF9yb3dbaV07CisgICAgICB0cmlhbmdsZVsxXSA9IHRoaXNfcm93W2kgLSAxXTsKKyAgICAgIHRyaWFuZ2xlWzJdID0gbGFzdF9yb3dbaSAtIDFdOworICAgICAgRHJhd0dvdXJhdWQocEJpdG1hcCwgYWxwaGEsIHRyaWFuZ2xlKTsKKyAgICAgIHRyaWFuZ2xlWzJdID0gdGhpc19yb3dbaV07CisgICAgICBEcmF3R291cmF1ZChwQml0bWFwLCBhbHBoYSwgdHJpYW5nbGUpOwogICAgIH0KLX0KLXN0YXRpYyB2b2lkIF9EcmF3TGF0dGljZUdvdXJhdWRTaGFkaW5nKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1N0cmVhbSogcFNoYWRpbmdTdHJlYW0sIENQREZfRnVuY3Rpb24qKiBwRnVuY3MsIGludCBuRnVuY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0NvbG9yU3BhY2UqIHBDUywgaW50IGFscGhhKQotewotICAgIEFTU0VSVChwQml0bWFwLT5HZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKTsKLSAgICBpZiAocFNoYWRpbmdTdHJlYW0tPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSRUFNKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IHJvd192ZXJ0cyA9IHBTaGFkaW5nU3RyZWFtLT5HZXREaWN0KCktPkdldEludGVnZXIoIlZlcnRpY2VzUGVyUm93Iik7Ci0gICAgaWYgKHJvd192ZXJ0cyA8IDIpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX01lc2hTdHJlYW0gc3RyZWFtOwotICAgIGlmICghc3RyZWFtLkxvYWQocFNoYWRpbmdTdHJlYW0sIHBGdW5jcywgbkZ1bmNzLCBwQ1MpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9NZXNoVmVydGV4KiB2ZXJ0ZXggPSBGWF9BbGxvYzJEKENQREZfTWVzaFZlcnRleCwgcm93X3ZlcnRzLCAyKTsKLSAgICBpZiAoIXN0cmVhbS5HZXRWZXJ0ZXhSb3codmVydGV4LCByb3dfdmVydHMsIHBPYmplY3QyQml0bWFwKSkgewotICAgICAgICBGWF9GcmVlKHZlcnRleCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IGxhc3RfaW5kZXggPSAwOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIENQREZfTWVzaFZlcnRleCogbGFzdF9yb3cgPSB2ZXJ0ZXggKyBsYXN0X2luZGV4ICogcm93X3ZlcnRzOwotICAgICAgICBDUERGX01lc2hWZXJ0ZXgqIHRoaXNfcm93ID0gdmVydGV4ICsgKDEgLSBsYXN0X2luZGV4KSAqIHJvd192ZXJ0czsKLSAgICAgICAgaWYgKCFzdHJlYW0uR2V0VmVydGV4Um93KHRoaXNfcm93LCByb3dfdmVydHMsIHBPYmplY3QyQml0bWFwKSkgewotICAgICAgICAgICAgRlhfRnJlZSh2ZXJ0ZXgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIENQREZfTWVzaFZlcnRleCB0cmlhbmdsZVszXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCByb3dfdmVydHM7IGkgKyspIHsKLSAgICAgICAgICAgIHRyaWFuZ2xlWzBdID0gbGFzdF9yb3dbaV07Ci0gICAgICAgICAgICB0cmlhbmdsZVsxXSA9IHRoaXNfcm93W2kgLSAxXTsKLSAgICAgICAgICAgIHRyaWFuZ2xlWzJdID0gbGFzdF9yb3dbaSAtIDFdOwotICAgICAgICAgICAgX0RyYXdHb3VyYXVkKHBCaXRtYXAsIGFscGhhLCB0cmlhbmdsZSk7Ci0gICAgICAgICAgICB0cmlhbmdsZVsyXSA9IHRoaXNfcm93W2ldOwotICAgICAgICAgICAgX0RyYXdHb3VyYXVkKHBCaXRtYXAsIGFscGhhLCB0cmlhbmdsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbGFzdF9pbmRleCA9IDEgLSBsYXN0X2luZGV4OwotICAgIH0KLSAgICBGWF9GcmVlKHZlcnRleCk7CisgICAgbGFzdF9pbmRleCA9IDEgLSBsYXN0X2luZGV4OworICB9CisgIEZYX0ZyZWUodmVydGV4KTsKIH0KIHN0cnVjdCBDb29uX0JlemllckNvZWZmIHsKLSAgICBmbG9hdCBhLCBiLCBjLCBkOwotICAgIHZvaWQgRnJvbVBvaW50cyhmbG9hdCBwMCwgZmxvYXQgcDEsIGZsb2F0IHAyLCBmbG9hdCBwMykKLSAgICB7Ci0gICAgICAgIGEgPSAtcDAgKyAzICogcDEgLSAzICogcDIgKyBwMzsKLSAgICAgICAgYiA9IDMgKiBwMCAtIDYgKiBwMSArIDMgKiBwMjsKLSAgICAgICAgYyA9IC0zICogcDAgKyAzICogcDE7Ci0gICAgICAgIGQgPSBwMDsKLSAgICB9Ci0gICAgQ29vbl9CZXppZXJDb2VmZiBmaXJzdF9oYWxmKCkKLSAgICB7Ci0gICAgICAgIENvb25fQmV6aWVyQ29lZmYgcmVzdWx0OwotICAgICAgICByZXN1bHQuYSA9IGEgLyA4OwotICAgICAgICByZXN1bHQuYiA9IGIgLyA0OwotICAgICAgICByZXN1bHQuYyA9IGMgLyAyOwotICAgICAgICByZXN1bHQuZCA9IGQ7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIENvb25fQmV6aWVyQ29lZmYgc2Vjb25kX2hhbGYoKQotICAgIHsKLSAgICAgICAgQ29vbl9CZXppZXJDb2VmZiByZXN1bHQ7Ci0gICAgICAgIHJlc3VsdC5hID0gYSAvIDg7Ci0gICAgICAgIHJlc3VsdC5iID0gMyAqIGEgLyA4ICsgYiAvIDQ7Ci0gICAgICAgIHJlc3VsdC5jID0gMyAqIGEgLyA4ICsgYiAvIDIgKyBjIC8gMjsKLSAgICAgICAgcmVzdWx0LmQgPSBhIC8gOCArIGIgLyA0ICsgYyAvIDIgKyBkOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICB2b2lkIEdldFBvaW50cyhmbG9hdCBwWzRdKQotICAgIHsKLSAgICAgICAgcFswXSA9IGQ7Ci0gICAgICAgIHBbMV0gPSBjIC8gMyArIHBbMF07Ci0gICAgICAgIHBbMl0gPSBiIC8gMyAtIHBbMF0gKyAyICogcFsxXTsKLSAgICAgICAgcFszXSA9IGEgKyBwWzBdIC0gMyAqIHBbMV0gKyAzICogcFsyXTsKLSAgICB9Ci0gICAgdm9pZCBHZXRQb2ludHNSZXZlcnNlKGZsb2F0IHBbNF0pCi0gICAgewotICAgICAgICBwWzNdID0gZDsKLSAgICAgICAgcFsyXSA9IGMgLyAzICsgcFszXTsKLSAgICAgICAgcFsxXSA9IGIgLyAzIC0gcFszXSArIDIgKiBwWzJdOwotICAgICAgICBwWzBdID0gYSArIHBbM10gLSAzICogcFsyXSArIDMgKiBwWzFdOwotICAgIH0KLSAgICB2b2lkIEJlemllckludGVycG9sKENvb25fQmV6aWVyQ29lZmYmIEMxLCBDb29uX0JlemllckNvZWZmJiBDMiwgQ29vbl9CZXppZXJDb2VmZiYgRDEsIENvb25fQmV6aWVyQ29lZmYmIEQyKQotICAgIHsKLSAgICAgICAgYSA9IChEMS5hICsgRDIuYSkgLyAyOwotICAgICAgICBiID0gKEQxLmIgKyBEMi5iKSAvIDI7Ci0gICAgICAgIGMgPSAoRDEuYyArIEQyLmMpIC8gMiAtIChDMS5hIC8gOCArIEMxLmIgLyA0ICsgQzEuYyAvIDIpICsgKEMyLmEgLyA4ICsgQzIuYiAvIDQpICsgKC1DMS5kICsgRDIuZCkgLyAyIC0gKEMyLmEgKyBDMi5iKSAvIDI7Ci0gICAgICAgIGQgPSBDMS5hIC8gOCArIEMxLmIgLyA0ICsgQzEuYyAvIDIgKyBDMS5kOwotICAgIH0KLSAgICBmbG9hdCBEaXN0YW5jZSgpCi0gICAgewotICAgICAgICBmbG9hdCBkaXMgPSBhICsgYiArIGM7Ci0gICAgICAgIHJldHVybiBkaXMgPCAwID8gLWRpcyA6IGRpczsKLSAgICB9CisgIGZsb2F0IGEsIGIsIGMsIGQ7CisgIHZvaWQgRnJvbVBvaW50cyhmbG9hdCBwMCwgZmxvYXQgcDEsIGZsb2F0IHAyLCBmbG9hdCBwMykgeworICAgIGEgPSAtcDAgKyAzICogcDEgLSAzICogcDIgKyBwMzsKKyAgICBiID0gMyAqIHAwIC0gNiAqIHAxICsgMyAqIHAyOworICAgIGMgPSAtMyAqIHAwICsgMyAqIHAxOworICAgIGQgPSBwMDsKKyAgfQorICBDb29uX0JlemllckNvZWZmIGZpcnN0X2hhbGYoKSB7CisgICAgQ29vbl9CZXppZXJDb2VmZiByZXN1bHQ7CisgICAgcmVzdWx0LmEgPSBhIC8gODsKKyAgICByZXN1bHQuYiA9IGIgLyA0OworICAgIHJlc3VsdC5jID0gYyAvIDI7CisgICAgcmVzdWx0LmQgPSBkOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgQ29vbl9CZXppZXJDb2VmZiBzZWNvbmRfaGFsZigpIHsKKyAgICBDb29uX0JlemllckNvZWZmIHJlc3VsdDsKKyAgICByZXN1bHQuYSA9IGEgLyA4OworICAgIHJlc3VsdC5iID0gMyAqIGEgLyA4ICsgYiAvIDQ7CisgICAgcmVzdWx0LmMgPSAzICogYSAvIDggKyBiIC8gMiArIGMgLyAyOworICAgIHJlc3VsdC5kID0gYSAvIDggKyBiIC8gNCArIGMgLyAyICsgZDsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIHZvaWQgR2V0UG9pbnRzKGZsb2F0IHBbNF0pIHsKKyAgICBwWzBdID0gZDsKKyAgICBwWzFdID0gYyAvIDMgKyBwWzBdOworICAgIHBbMl0gPSBiIC8gMyAtIHBbMF0gKyAyICogcFsxXTsKKyAgICBwWzNdID0gYSArIHBbMF0gLSAzICogcFsxXSArIDMgKiBwWzJdOworICB9CisgIHZvaWQgR2V0UG9pbnRzUmV2ZXJzZShmbG9hdCBwWzRdKSB7CisgICAgcFszXSA9IGQ7CisgICAgcFsyXSA9IGMgLyAzICsgcFszXTsKKyAgICBwWzFdID0gYiAvIDMgLSBwWzNdICsgMiAqIHBbMl07CisgICAgcFswXSA9IGEgKyBwWzNdIC0gMyAqIHBbMl0gKyAzICogcFsxXTsKKyAgfQorICB2b2lkIEJlemllckludGVycG9sKENvb25fQmV6aWVyQ29lZmYmIEMxLAorICAgICAgICAgICAgICAgICAgICAgIENvb25fQmV6aWVyQ29lZmYmIEMyLAorICAgICAgICAgICAgICAgICAgICAgIENvb25fQmV6aWVyQ29lZmYmIEQxLAorICAgICAgICAgICAgICAgICAgICAgIENvb25fQmV6aWVyQ29lZmYmIEQyKSB7CisgICAgYSA9IChEMS5hICsgRDIuYSkgLyAyOworICAgIGIgPSAoRDEuYiArIEQyLmIpIC8gMjsKKyAgICBjID0gKEQxLmMgKyBEMi5jKSAvIDIgLSAoQzEuYSAvIDggKyBDMS5iIC8gNCArIEMxLmMgLyAyKSArCisgICAgICAgIChDMi5hIC8gOCArIEMyLmIgLyA0KSArICgtQzEuZCArIEQyLmQpIC8gMiAtIChDMi5hICsgQzIuYikgLyAyOworICAgIGQgPSBDMS5hIC8gOCArIEMxLmIgLyA0ICsgQzEuYyAvIDIgKyBDMS5kOworICB9CisgIGZsb2F0IERpc3RhbmNlKCkgeworICAgIGZsb2F0IGRpcyA9IGEgKyBiICsgYzsKKyAgICByZXR1cm4gZGlzIDwgMCA/IC1kaXMgOiBkaXM7CisgIH0KIH07CiBzdHJ1Y3QgQ29vbl9CZXppZXIgewotICAgIENvb25fQmV6aWVyQ29lZmYgeCwgeTsKLSAgICB2b2lkIEZyb21Qb2ludHMoZmxvYXQgeDAsIGZsb2F0IHkwLCBmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MiwgZmxvYXQgeDMsIGZsb2F0IHkzKQotICAgIHsKLSAgICAgICAgeC5Gcm9tUG9pbnRzKHgwLCB4MSwgeDIsIHgzKTsKLSAgICAgICAgeS5Gcm9tUG9pbnRzKHkwLCB5MSwgeTIsIHkzKTsKKyAgQ29vbl9CZXppZXJDb2VmZiB4LCB5OworICB2b2lkIEZyb21Qb2ludHMoZmxvYXQgeDAsCisgICAgICAgICAgICAgICAgICBmbG9hdCB5MCwKKyAgICAgICAgICAgICAgICAgIGZsb2F0IHgxLAorICAgICAgICAgICAgICAgICAgZmxvYXQgeTEsCisgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwKKyAgICAgICAgICAgICAgICAgIGZsb2F0IHkyLAorICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsCisgICAgICAgICAgICAgICAgICBmbG9hdCB5MykgeworICAgIHguRnJvbVBvaW50cyh4MCwgeDEsIHgyLCB4Myk7CisgICAgeS5Gcm9tUG9pbnRzKHkwLCB5MSwgeTIsIHkzKTsKKyAgfQorICBDb29uX0JlemllciBmaXJzdF9oYWxmKCkgeworICAgIENvb25fQmV6aWVyIHJlc3VsdDsKKyAgICByZXN1bHQueCA9IHguZmlyc3RfaGFsZigpOworICAgIHJlc3VsdC55ID0geS5maXJzdF9oYWxmKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBDb29uX0JlemllciBzZWNvbmRfaGFsZigpIHsKKyAgICBDb29uX0JlemllciByZXN1bHQ7CisgICAgcmVzdWx0LnggPSB4LnNlY29uZF9oYWxmKCk7CisgICAgcmVzdWx0LnkgPSB5LnNlY29uZF9oYWxmKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICB2b2lkIEJlemllckludGVycG9sKENvb25fQmV6aWVyJiBDMSwKKyAgICAgICAgICAgICAgICAgICAgICBDb29uX0JlemllciYgQzIsCisgICAgICAgICAgICAgICAgICAgICAgQ29vbl9CZXppZXImIEQxLAorICAgICAgICAgICAgICAgICAgICAgIENvb25fQmV6aWVyJiBEMikgeworICAgIHguQmV6aWVySW50ZXJwb2woQzEueCwgQzIueCwgRDEueCwgRDIueCk7CisgICAgeS5CZXppZXJJbnRlcnBvbChDMS55LCBDMi55LCBEMS55LCBEMi55KTsKKyAgfQorICB2b2lkIEdldFBvaW50cyhGWF9QQVRIUE9JTlQqIHBQb2ludHMpIHsKKyAgICBmbG9hdCBwWzRdOworICAgIGludCBpOworICAgIHguR2V0UG9pbnRzKHApOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgIHBQb2ludHNbaV0ubV9Qb2ludFggPSBwW2ldOwogICAgIH0KLSAgICBDb29uX0JlemllciBmaXJzdF9oYWxmKCkKLSAgICB7Ci0gICAgICAgIENvb25fQmV6aWVyIHJlc3VsdDsKLSAgICAgICAgcmVzdWx0LnggPSB4LmZpcnN0X2hhbGYoKTsKLSAgICAgICAgcmVzdWx0LnkgPSB5LmZpcnN0X2hhbGYoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB5LkdldFBvaW50cyhwKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICBwUG9pbnRzW2ldLm1fUG9pbnRZID0gcFtpXTsKICAgICB9Ci0gICAgQ29vbl9CZXppZXIgc2Vjb25kX2hhbGYoKQotICAgIHsKLSAgICAgICAgQ29vbl9CZXppZXIgcmVzdWx0OwotICAgICAgICByZXN1bHQueCA9IHguc2Vjb25kX2hhbGYoKTsKLSAgICAgICAgcmVzdWx0LnkgPSB5LnNlY29uZF9oYWxmKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgdm9pZCBHZXRQb2ludHNSZXZlcnNlKEZYX1BBVEhQT0lOVCogcFBvaW50cykgeworICAgIGZsb2F0IHBbNF07CisgICAgaW50IGk7CisgICAgeC5HZXRQb2ludHNSZXZlcnNlKHApOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgIHBQb2ludHNbaV0ubV9Qb2ludFggPSBwW2ldOwogICAgIH0KLSAgICB2b2lkIEJlemllckludGVycG9sKENvb25fQmV6aWVyJiBDMSwgQ29vbl9CZXppZXImIEMyLCBDb29uX0JlemllciYgRDEsIENvb25fQmV6aWVyJiBEMikKLSAgICB7Ci0gICAgICAgIHguQmV6aWVySW50ZXJwb2woQzEueCwgQzIueCwgRDEueCwgRDIueCk7Ci0gICAgICAgIHkuQmV6aWVySW50ZXJwb2woQzEueSwgQzIueSwgRDEueSwgRDIueSk7CisgICAgeS5HZXRQb2ludHNSZXZlcnNlKHApOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgIHBQb2ludHNbaV0ubV9Qb2ludFkgPSBwW2ldOwogICAgIH0KLSAgICB2b2lkIEdldFBvaW50cyhGWF9QQVRIUE9JTlQqIHBQb2ludHMpCi0gICAgewotICAgICAgICBmbG9hdCBwWzRdOwotICAgICAgICBpbnQgaTsKLSAgICAgICAgeC5HZXRQb2ludHMocCk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpICsrKSB7Ci0gICAgICAgICAgICBwUG9pbnRzW2ldLm1fUG9pbnRYID0gcFtpXTsKLSAgICAgICAgfQotICAgICAgICB5LkdldFBvaW50cyhwKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkgKyspIHsKLSAgICAgICAgICAgIHBQb2ludHNbaV0ubV9Qb2ludFkgPSBwW2ldOwotICAgICAgICB9Ci0gICAgfQotICAgIHZvaWQgR2V0UG9pbnRzUmV2ZXJzZShGWF9QQVRIUE9JTlQqIHBQb2ludHMpCi0gICAgewotICAgICAgICBmbG9hdCBwWzRdOwotICAgICAgICBpbnQgaTsKLSAgICAgICAgeC5HZXRQb2ludHNSZXZlcnNlKHApOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSArKykgewotICAgICAgICAgICAgcFBvaW50c1tpXS5tX1BvaW50WCA9IHBbaV07Ci0gICAgICAgIH0KLSAgICAgICAgeS5HZXRQb2ludHNSZXZlcnNlKHApOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSArKykgewotICAgICAgICAgICAgcFBvaW50c1tpXS5tX1BvaW50WSA9IHBbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZmxvYXQgRGlzdGFuY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHguRGlzdGFuY2UoKSArIHkuRGlzdGFuY2UoKTsKLSAgICB9CisgIH0KKyAgZmxvYXQgRGlzdGFuY2UoKSB7IHJldHVybiB4LkRpc3RhbmNlKCkgKyB5LkRpc3RhbmNlKCk7IH0KIH07Ci1zdGF0aWMgaW50IF9CaUludGVycG9sKGludCBjMCwgaW50IGMxLCBpbnQgYzIsIGludCBjMywgaW50IHgsIGludCB5LCBpbnQgeF9zY2FsZSwgaW50IHlfc2NhbGUpCi17Ci0gICAgaW50IHgxID0gYzAgKyAoYzMgLSBjMCkgKiB4IC8geF9zY2FsZTsKLSAgICBpbnQgeDIgPSBjMSArIChjMiAtIGMxKSAqIHggLyB4X3NjYWxlOwotICAgIHJldHVybiB4MSArICh4MiAtIHgxKSAqIHkgLyB5X3NjYWxlOworc3RhdGljIGludCBfQmlJbnRlcnBvbChpbnQgYzAsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGMyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgYzMsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB4LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHhfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3NjYWxlKSB7CisgIGludCB4MSA9IGMwICsgKGMzIC0gYzApICogeCAvIHhfc2NhbGU7CisgIGludCB4MiA9IGMxICsgKGMyIC0gYzEpICogeCAvIHhfc2NhbGU7CisgIHJldHVybiB4MSArICh4MiAtIHgxKSAqIHkgLyB5X3NjYWxlOwogfQogc3RydWN0IENvb25fQ29sb3IgewotICAgIENvb25fQ29sb3IoKQotICAgIHsKLSAgICAgICAgRlhTWVNfbWVtc2V0MzIoY29tcCwgMCwgc2l6ZW9mKGludCkgKiAzKTsKKyAgQ29vbl9Db2xvcigpIHsgRlhTWVNfbWVtc2V0KGNvbXAsIDAsIHNpemVvZihpbnQpICogMyk7IH0KKyAgaW50IGNvbXBbM107CisgIHZvaWQgQmlJbnRlcnBvbChDb29uX0NvbG9yIGNvbG9yc1s0XSwKKyAgICAgICAgICAgICAgICAgIGludCB4LAorICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICBpbnQgeF9zY2FsZSwKKyAgICAgICAgICAgICAgICAgIGludCB5X3NjYWxlKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICBjb21wW2ldID0KKyAgICAgICAgICBfQmlJbnRlcnBvbChjb2xvcnNbMF0uY29tcFtpXSwgY29sb3JzWzFdLmNvbXBbaV0sIGNvbG9yc1syXS5jb21wW2ldLAorICAgICAgICAgICAgICAgICAgICAgIGNvbG9yc1szXS5jb21wW2ldLCB4LCB5LCB4X3NjYWxlLCB5X3NjYWxlKTsKKyAgfQorICBpbnQgRGlzdGFuY2UoQ29vbl9Db2xvciYgbykgeworICAgIGludCBtYXgsIGRpZmY7CisgICAgbWF4ID0gRlhTWVNfYWJzKGNvbXBbMF0gLSBvLmNvbXBbMF0pOworICAgIGRpZmYgPSBGWFNZU19hYnMoY29tcFsxXSAtIG8uY29tcFsxXSk7CisgICAgaWYgKG1heCA8IGRpZmYpIHsKKyAgICAgIG1heCA9IGRpZmY7CiAgICAgfQotICAgIGludAkJY29tcFszXTsKLSAgICB2b2lkCUJpSW50ZXJwb2woQ29vbl9Db2xvciBjb2xvcnNbNF0sIGludCB4LCBpbnQgeSwgaW50IHhfc2NhbGUsIGludCB5X3NjYWxlKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpICsrKQotICAgICAgICAgICAgY29tcFtpXSA9IF9CaUludGVycG9sKGNvbG9yc1swXS5jb21wW2ldLCBjb2xvcnNbMV0uY29tcFtpXSwgY29sb3JzWzJdLmNvbXBbaV0sIGNvbG9yc1szXS5jb21wW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHksIHhfc2NhbGUsIHlfc2NhbGUpOworICAgIGRpZmYgPSBGWFNZU19hYnMoY29tcFsyXSAtIG8uY29tcFsyXSk7CisgICAgaWYgKG1heCA8IGRpZmYpIHsKKyAgICAgIG1heCA9IGRpZmY7CiAgICAgfQotICAgIGludAkJRGlzdGFuY2UoQ29vbl9Db2xvciYgbykKLSAgICB7Ci0gICAgICAgIGludCBtYXgsIGRpZmY7Ci0gICAgICAgIG1heCA9IEZYU1lTX2Ficyhjb21wWzBdIC0gby5jb21wWzBdKTsKLSAgICAgICAgZGlmZiA9IEZYU1lTX2Ficyhjb21wWzFdIC0gby5jb21wWzFdKTsKLSAgICAgICAgaWYgKG1heCA8IGRpZmYpIHsKLSAgICAgICAgICAgIG1heCA9IGRpZmY7Ci0gICAgICAgIH0KLSAgICAgICAgZGlmZiA9IEZYU1lTX2Ficyhjb21wWzJdIC0gby5jb21wWzJdKTsKLSAgICAgICAgaWYgKG1heCA8IGRpZmYpIHsKLSAgICAgICAgICAgIG1heCA9IGRpZmY7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1heDsKLSAgICB9CisgICAgcmV0dXJuIG1heDsKKyAgfQogfTsKIHN0cnVjdCBDUERGX1BhdGNoRHJhd2VyIHsKLSAgICBDb29uX0NvbG9yCQkJcGF0Y2hfY29sb3JzWzRdOwotICAgIGludAkJCQkJbWF4X2RlbHRhOwotICAgIENGWF9QYXRoRGF0YQkJcGF0aDsKLSAgICBDRlhfUmVuZGVyRGV2aWNlKglwRGV2aWNlOwotICAgIGludAkJCQkJZmlsbF9tb2RlOwotICAgIGludAkJCQkJYWxwaGE7Ci0gICAgdm9pZCBEcmF3KGludCB4X3NjYWxlLCBpbnQgeV9zY2FsZSwgaW50IGxlZnQsIGludCBib3R0b20sIENvb25fQmV6aWVyIEMxLCBDb29uX0JlemllciBDMiwgQ29vbl9CZXppZXIgRDEsIENvb25fQmV6aWVyIEQyKQotICAgIHsKLSAgICAgICAgRlhfQk9PTCBiU21hbGwgPSBDMS5EaXN0YW5jZSgpIDwgMiAmJiBDMi5EaXN0YW5jZSgpIDwgMiAmJiBEMS5EaXN0YW5jZSgpIDwgMiAmJiBEMi5EaXN0YW5jZSgpIDwgMjsKLSAgICAgICAgQ29vbl9Db2xvciBkaXZfY29sb3JzWzRdOwotICAgICAgICBpbnQgZF9ib3R0b20sIGRfbGVmdCwgZF90b3AsIGRfcmlnaHQ7Ci0gICAgICAgIGRpdl9jb2xvcnNbMF0uQmlJbnRlcnBvbChwYXRjaF9jb2xvcnMsIGxlZnQsIGJvdHRvbSwgeF9zY2FsZSwgeV9zY2FsZSk7Ci0gICAgICAgIGlmICghYlNtYWxsKSB7Ci0gICAgICAgICAgICBkaXZfY29sb3JzWzFdLkJpSW50ZXJwb2wocGF0Y2hfY29sb3JzLCBsZWZ0LCBib3R0b20gKyAxLCB4X3NjYWxlLCB5X3NjYWxlKTsKLSAgICAgICAgICAgIGRpdl9jb2xvcnNbMl0uQmlJbnRlcnBvbChwYXRjaF9jb2xvcnMsIGxlZnQgKyAxLCBib3R0b20gKyAxLCB4X3NjYWxlLCB5X3NjYWxlKTsKLSAgICAgICAgICAgIGRpdl9jb2xvcnNbM10uQmlJbnRlcnBvbChwYXRjaF9jb2xvcnMsIGxlZnQgKyAxLCBib3R0b20sIHhfc2NhbGUsIHlfc2NhbGUpOwotICAgICAgICAgICAgZF9ib3R0b20gPSBkaXZfY29sb3JzWzNdLkRpc3RhbmNlKGRpdl9jb2xvcnNbMF0pOwotICAgICAgICAgICAgZF9sZWZ0ID0gZGl2X2NvbG9yc1sxXS5EaXN0YW5jZShkaXZfY29sb3JzWzBdKTsKLSAgICAgICAgICAgIGRfdG9wID0gZGl2X2NvbG9yc1sxXS5EaXN0YW5jZShkaXZfY29sb3JzWzJdKTsKLSAgICAgICAgICAgIGRfcmlnaHQgPSBkaXZfY29sb3JzWzJdLkRpc3RhbmNlKGRpdl9jb2xvcnNbM10pOwotICAgICAgICB9Ci0jZGVmaW5lIENPT05DT0xPUl9USFJFU0hPTEQgNAotICAgICAgICBpZiAoYlNtYWxsIHx8IChkX2JvdHRvbSA8IENPT05DT0xPUl9USFJFU0hPTEQgJiYgZF9sZWZ0IDwgQ09PTkNPTE9SX1RIUkVTSE9MRCAmJgotICAgICAgICAgICAgICAgICAgICAgICBkX3RvcCA8IENPT05DT0xPUl9USFJFU0hPTEQgJiYgZF9yaWdodCA8IENPT05DT0xPUl9USFJFU0hPTEQpKSB7Ci0gICAgICAgICAgICBGWF9QQVRIUE9JTlQqIHBQb2ludHMgPSBwYXRoLkdldFBvaW50cygpOwotICAgICAgICAgICAgQzEuR2V0UG9pbnRzKHBQb2ludHMpOwotICAgICAgICAgICAgRDIuR2V0UG9pbnRzKHBQb2ludHMgKyAzKTsKLSAgICAgICAgICAgIEMyLkdldFBvaW50c1JldmVyc2UocFBvaW50cyArIDYpOwotICAgICAgICAgICAgRDEuR2V0UG9pbnRzUmV2ZXJzZShwUG9pbnRzICsgOSk7Ci0gICAgICAgICAgICBpbnQgZmlsbEZsYWdzID0gRlhGSUxMX1dJTkRJTkcgfCBGWEZJTExfRlVMTENPVkVSOwotICAgICAgICAgICAgaWYgKGZpbGxfbW9kZSAmIFJFTkRFUl9OT1BBVEhTTU9PVEgpIHsKLSAgICAgICAgICAgICAgICBmaWxsRmxhZ3MgfD0gRlhGSUxMX05PUEFUSFNNT09USDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBOVUxMLCBOVUxMLCBGWEFSR0JfTUFLRShhbHBoYSwgZGl2X2NvbG9yc1swXS5jb21wWzBdLCBkaXZfY29sb3JzWzBdLmNvbXBbMV0sIGRpdl9jb2xvcnNbMF0uY29tcFsyXSksIDAsIGZpbGxGbGFncyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZF9ib3R0b20gPCBDT09OQ09MT1JfVEhSRVNIT0xEICYmIGRfdG9wIDwgQ09PTkNPTE9SX1RIUkVTSE9MRCkgewotICAgICAgICAgICAgICAgIENvb25fQmV6aWVyIG0xOwotICAgICAgICAgICAgICAgIG0xLkJlemllckludGVycG9sKEQxLCBEMiwgQzEsIEMyKTsKLSAgICAgICAgICAgICAgICB5X3NjYWxlICo9IDI7Ci0gICAgICAgICAgICAgICAgYm90dG9tICo9IDI7Ci0gICAgICAgICAgICAgICAgRHJhdyh4X3NjYWxlLCB5X3NjYWxlLCBsZWZ0LCBib3R0b20sIEMxLCBtMSwgRDEuZmlyc3RfaGFsZigpLCBEMi5maXJzdF9oYWxmKCkpOwotICAgICAgICAgICAgICAgIERyYXcoeF9zY2FsZSwgeV9zY2FsZSwgbGVmdCwgYm90dG9tICsgMSwgbTEsIEMyLCBEMS5zZWNvbmRfaGFsZigpLCBEMi5zZWNvbmRfaGFsZigpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZF9sZWZ0IDwgQ09PTkNPTE9SX1RIUkVTSE9MRCAmJiBkX3JpZ2h0IDwgQ09PTkNPTE9SX1RIUkVTSE9MRCkgewotICAgICAgICAgICAgICAgIENvb25fQmV6aWVyIG0yOwotICAgICAgICAgICAgICAgIG0yLkJlemllckludGVycG9sKEMxLCBDMiwgRDEsIEQyKTsKLSAgICAgICAgICAgICAgICB4X3NjYWxlICo9IDI7Ci0gICAgICAgICAgICAgICAgbGVmdCAqPSAyOwotICAgICAgICAgICAgICAgIERyYXcoeF9zY2FsZSwgeV9zY2FsZSwgbGVmdCwgYm90dG9tLCBDMS5maXJzdF9oYWxmKCksIEMyLmZpcnN0X2hhbGYoKSwgRDEsIG0yKTsKLSAgICAgICAgICAgICAgICBEcmF3KHhfc2NhbGUsIHlfc2NhbGUsIGxlZnQgKyAxLCBib3R0b20sIEMxLnNlY29uZF9oYWxmKCksIEMyLnNlY29uZF9oYWxmKCksIG0yLCBEMik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENvb25fQmV6aWVyIG0xLCBtMjsKLSAgICAgICAgICAgICAgICBtMS5CZXppZXJJbnRlcnBvbChEMSwgRDIsIEMxLCBDMik7Ci0gICAgICAgICAgICAgICAgbTIuQmV6aWVySW50ZXJwb2woQzEsIEMyLCBEMSwgRDIpOwotICAgICAgICAgICAgICAgIENvb25fQmV6aWVyIG0xZiA9IG0xLmZpcnN0X2hhbGYoKTsKLSAgICAgICAgICAgICAgICBDb29uX0JlemllciBtMXMgPSBtMS5zZWNvbmRfaGFsZigpOwotICAgICAgICAgICAgICAgIENvb25fQmV6aWVyIG0yZiA9IG0yLmZpcnN0X2hhbGYoKTsKLSAgICAgICAgICAgICAgICBDb29uX0JlemllciBtMnMgPSBtMi5zZWNvbmRfaGFsZigpOwotICAgICAgICAgICAgICAgIHhfc2NhbGUgKj0gMjsKLSAgICAgICAgICAgICAgICB5X3NjYWxlICo9IDI7Ci0gICAgICAgICAgICAgICAgbGVmdCAqPSAyOwotICAgICAgICAgICAgICAgIGJvdHRvbSAqPSAyOwotICAgICAgICAgICAgICAgIERyYXcoeF9zY2FsZSwgeV9zY2FsZSwgbGVmdCwgYm90dG9tLCBDMS5maXJzdF9oYWxmKCksIG0xZiwgRDEuZmlyc3RfaGFsZigpLCBtMmYpOwotICAgICAgICAgICAgICAgIERyYXcoeF9zY2FsZSwgeV9zY2FsZSwgbGVmdCwgYm90dG9tICsgMSwgbTFmLCBDMi5maXJzdF9oYWxmKCksIEQxLnNlY29uZF9oYWxmKCksIG0ycyk7Ci0gICAgICAgICAgICAgICAgRHJhdyh4X3NjYWxlLCB5X3NjYWxlLCBsZWZ0ICsgMSwgYm90dG9tLCBDMS5zZWNvbmRfaGFsZigpLCBtMXMsIG0yZiwgRDIuZmlyc3RfaGFsZigpKTsKLSAgICAgICAgICAgICAgICBEcmF3KHhfc2NhbGUsIHlfc2NhbGUsIGxlZnQgKyAxLCBib3R0b20gKyAxLCBtMXMsIEMyLnNlY29uZF9oYWxmKCksIG0ycywgRDIuc2Vjb25kX2hhbGYoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgQ29vbl9Db2xvciBwYXRjaF9jb2xvcnNbNF07CisgIGludCBtYXhfZGVsdGE7CisgIENGWF9QYXRoRGF0YSBwYXRoOworICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlOworICBpbnQgZmlsbF9tb2RlOworICBpbnQgYWxwaGE7CisgIHZvaWQgRHJhdyhpbnQgeF9zY2FsZSwKKyAgICAgICAgICAgIGludCB5X3NjYWxlLAorICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICBpbnQgYm90dG9tLAorICAgICAgICAgICAgQ29vbl9CZXppZXIgQzEsCisgICAgICAgICAgICBDb29uX0JlemllciBDMiwKKyAgICAgICAgICAgIENvb25fQmV6aWVyIEQxLAorICAgICAgICAgICAgQ29vbl9CZXppZXIgRDIpIHsKKyAgICBGWF9CT09MIGJTbWFsbCA9IEMxLkRpc3RhbmNlKCkgPCAyICYmIEMyLkRpc3RhbmNlKCkgPCAyICYmCisgICAgICAgICAgICAgICAgICAgICBEMS5EaXN0YW5jZSgpIDwgMiAmJiBEMi5EaXN0YW5jZSgpIDwgMjsKKyAgICBDb29uX0NvbG9yIGRpdl9jb2xvcnNbNF07CisgICAgaW50IGRfYm90dG9tLCBkX2xlZnQsIGRfdG9wLCBkX3JpZ2h0OworICAgIGRpdl9jb2xvcnNbMF0uQmlJbnRlcnBvbChwYXRjaF9jb2xvcnMsIGxlZnQsIGJvdHRvbSwgeF9zY2FsZSwgeV9zY2FsZSk7CisgICAgaWYgKCFiU21hbGwpIHsKKyAgICAgIGRpdl9jb2xvcnNbMV0uQmlJbnRlcnBvbChwYXRjaF9jb2xvcnMsIGxlZnQsIGJvdHRvbSArIDEsIHhfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeV9zY2FsZSk7CisgICAgICBkaXZfY29sb3JzWzJdLkJpSW50ZXJwb2wocGF0Y2hfY29sb3JzLCBsZWZ0ICsgMSwgYm90dG9tICsgMSwgeF9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5X3NjYWxlKTsKKyAgICAgIGRpdl9jb2xvcnNbM10uQmlJbnRlcnBvbChwYXRjaF9jb2xvcnMsIGxlZnQgKyAxLCBib3R0b20sIHhfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeV9zY2FsZSk7CisgICAgICBkX2JvdHRvbSA9IGRpdl9jb2xvcnNbM10uRGlzdGFuY2UoZGl2X2NvbG9yc1swXSk7CisgICAgICBkX2xlZnQgPSBkaXZfY29sb3JzWzFdLkRpc3RhbmNlKGRpdl9jb2xvcnNbMF0pOworICAgICAgZF90b3AgPSBkaXZfY29sb3JzWzFdLkRpc3RhbmNlKGRpdl9jb2xvcnNbMl0pOworICAgICAgZF9yaWdodCA9IGRpdl9jb2xvcnNbMl0uRGlzdGFuY2UoZGl2X2NvbG9yc1szXSk7CiAgICAgfQorI2RlZmluZSBDT09OQ09MT1JfVEhSRVNIT0xEIDQKKyAgICBpZiAoYlNtYWxsIHx8CisgICAgICAgIChkX2JvdHRvbSA8IENPT05DT0xPUl9USFJFU0hPTEQgJiYgZF9sZWZ0IDwgQ09PTkNPTE9SX1RIUkVTSE9MRCAmJgorICAgICAgICAgZF90b3AgPCBDT09OQ09MT1JfVEhSRVNIT0xEICYmIGRfcmlnaHQgPCBDT09OQ09MT1JfVEhSRVNIT0xEKSkgeworICAgICAgRlhfUEFUSFBPSU5UKiBwUG9pbnRzID0gcGF0aC5HZXRQb2ludHMoKTsKKyAgICAgIEMxLkdldFBvaW50cyhwUG9pbnRzKTsKKyAgICAgIEQyLkdldFBvaW50cyhwUG9pbnRzICsgMyk7CisgICAgICBDMi5HZXRQb2ludHNSZXZlcnNlKHBQb2ludHMgKyA2KTsKKyAgICAgIEQxLkdldFBvaW50c1JldmVyc2UocFBvaW50cyArIDkpOworICAgICAgaW50IGZpbGxGbGFncyA9IEZYRklMTF9XSU5ESU5HIHwgRlhGSUxMX0ZVTExDT1ZFUjsKKyAgICAgIGlmIChmaWxsX21vZGUgJiBSRU5ERVJfTk9QQVRIU01PT1RIKSB7CisgICAgICAgIGZpbGxGbGFncyB8PSBGWEZJTExfTk9QQVRIU01PT1RIOworICAgICAgfQorICAgICAgcERldmljZS0+RHJhd1BhdGgoCisgICAgICAgICAgJnBhdGgsIE5VTEwsIE5VTEwsCisgICAgICAgICAgRlhBUkdCX01BS0UoYWxwaGEsIGRpdl9jb2xvcnNbMF0uY29tcFswXSwgZGl2X2NvbG9yc1swXS5jb21wWzFdLAorICAgICAgICAgICAgICAgICAgICAgIGRpdl9jb2xvcnNbMF0uY29tcFsyXSksCisgICAgICAgICAgMCwgZmlsbEZsYWdzKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGRfYm90dG9tIDwgQ09PTkNPTE9SX1RIUkVTSE9MRCAmJiBkX3RvcCA8IENPT05DT0xPUl9USFJFU0hPTEQpIHsKKyAgICAgICAgQ29vbl9CZXppZXIgbTE7CisgICAgICAgIG0xLkJlemllckludGVycG9sKEQxLCBEMiwgQzEsIEMyKTsKKyAgICAgICAgeV9zY2FsZSAqPSAyOworICAgICAgICBib3R0b20gKj0gMjsKKyAgICAgICAgRHJhdyh4X3NjYWxlLCB5X3NjYWxlLCBsZWZ0LCBib3R0b20sIEMxLCBtMSwgRDEuZmlyc3RfaGFsZigpLAorICAgICAgICAgICAgIEQyLmZpcnN0X2hhbGYoKSk7CisgICAgICAgIERyYXcoeF9zY2FsZSwgeV9zY2FsZSwgbGVmdCwgYm90dG9tICsgMSwgbTEsIEMyLCBEMS5zZWNvbmRfaGFsZigpLAorICAgICAgICAgICAgIEQyLnNlY29uZF9oYWxmKCkpOworICAgICAgfSBlbHNlIGlmIChkX2xlZnQgPCBDT09OQ09MT1JfVEhSRVNIT0xEICYmCisgICAgICAgICAgICAgICAgIGRfcmlnaHQgPCBDT09OQ09MT1JfVEhSRVNIT0xEKSB7CisgICAgICAgIENvb25fQmV6aWVyIG0yOworICAgICAgICBtMi5CZXppZXJJbnRlcnBvbChDMSwgQzIsIEQxLCBEMik7CisgICAgICAgIHhfc2NhbGUgKj0gMjsKKyAgICAgICAgbGVmdCAqPSAyOworICAgICAgICBEcmF3KHhfc2NhbGUsIHlfc2NhbGUsIGxlZnQsIGJvdHRvbSwgQzEuZmlyc3RfaGFsZigpLCBDMi5maXJzdF9oYWxmKCksCisgICAgICAgICAgICAgRDEsIG0yKTsKKyAgICAgICAgRHJhdyh4X3NjYWxlLCB5X3NjYWxlLCBsZWZ0ICsgMSwgYm90dG9tLCBDMS5zZWNvbmRfaGFsZigpLAorICAgICAgICAgICAgIEMyLnNlY29uZF9oYWxmKCksIG0yLCBEMik7CisgICAgICB9IGVsc2UgeworICAgICAgICBDb29uX0JlemllciBtMSwgbTI7CisgICAgICAgIG0xLkJlemllckludGVycG9sKEQxLCBEMiwgQzEsIEMyKTsKKyAgICAgICAgbTIuQmV6aWVySW50ZXJwb2woQzEsIEMyLCBEMSwgRDIpOworICAgICAgICBDb29uX0JlemllciBtMWYgPSBtMS5maXJzdF9oYWxmKCk7CisgICAgICAgIENvb25fQmV6aWVyIG0xcyA9IG0xLnNlY29uZF9oYWxmKCk7CisgICAgICAgIENvb25fQmV6aWVyIG0yZiA9IG0yLmZpcnN0X2hhbGYoKTsKKyAgICAgICAgQ29vbl9CZXppZXIgbTJzID0gbTIuc2Vjb25kX2hhbGYoKTsKKyAgICAgICAgeF9zY2FsZSAqPSAyOworICAgICAgICB5X3NjYWxlICo9IDI7CisgICAgICAgIGxlZnQgKj0gMjsKKyAgICAgICAgYm90dG9tICo9IDI7CisgICAgICAgIERyYXcoeF9zY2FsZSwgeV9zY2FsZSwgbGVmdCwgYm90dG9tLCBDMS5maXJzdF9oYWxmKCksIG0xZiwKKyAgICAgICAgICAgICBEMS5maXJzdF9oYWxmKCksIG0yZik7CisgICAgICAgIERyYXcoeF9zY2FsZSwgeV9zY2FsZSwgbGVmdCwgYm90dG9tICsgMSwgbTFmLCBDMi5maXJzdF9oYWxmKCksCisgICAgICAgICAgICAgRDEuc2Vjb25kX2hhbGYoKSwgbTJzKTsKKyAgICAgICAgRHJhdyh4X3NjYWxlLCB5X3NjYWxlLCBsZWZ0ICsgMSwgYm90dG9tLCBDMS5zZWNvbmRfaGFsZigpLCBtMXMsIG0yZiwKKyAgICAgICAgICAgICBEMi5maXJzdF9oYWxmKCkpOworICAgICAgICBEcmF3KHhfc2NhbGUsIHlfc2NhbGUsIGxlZnQgKyAxLCBib3R0b20gKyAxLCBtMXMsIEMyLnNlY29uZF9oYWxmKCksIG0ycywKKyAgICAgICAgICAgICBEMi5zZWNvbmRfaGFsZigpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KIH07CiAKLUZYX0JPT0wgX0NoZWNrQ29vblRlbnNvclBhcmEoY29uc3QgQ1BERl9NZXNoU3RyZWFtICZzdHJlYW0pCi17Ci0gICAgRlhfQk9PTCBiQ29vckJpdHMgPSAoIHN0cmVhbS5tX25Db29yZEJpdHM9PSAxICAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkNvb3JkQml0cyA9PSAyICB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubV9uQ29vcmRCaXRzID09IDQgIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tX25Db29yZEJpdHMgPT0gOCAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkNvb3JkQml0cyA9PSAxMiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubV9uQ29vcmRCaXRzID09IDE2IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tX25Db29yZEJpdHMgPT0gMjQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkNvb3JkQml0cyA9PSAzMiAgICk7CitGWF9CT09MIF9DaGVja0Nvb25UZW5zb3JQYXJhKGNvbnN0IENQREZfTWVzaFN0cmVhbSYgc3RyZWFtKSB7CisgIEZYX0JPT0wgYkNvb3JCaXRzID0gKHN0cmVhbS5tX25Db29yZEJpdHMgPT0gMSB8fCBzdHJlYW0ubV9uQ29vcmRCaXRzID09IDIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkNvb3JkQml0cyA9PSA0IHx8IHN0cmVhbS5tX25Db29yZEJpdHMgPT0gOCB8fAorICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubV9uQ29vcmRCaXRzID09IDEyIHx8IHN0cmVhbS5tX25Db29yZEJpdHMgPT0gMTYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkNvb3JkQml0cyA9PSAyNCB8fCBzdHJlYW0ubV9uQ29vcmRCaXRzID09IDMyKTsKIAotICAgIEZYX0JPT0wgYkNvbXBCaXRzID0gKCBzdHJlYW0ubV9uQ29tcEJpdHMgPT0gMSAgfHwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tX25Db21wQml0cyA9PSAyICB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubV9uQ29tcEJpdHMgPT0gNCAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkNvbXBCaXRzID09IDggIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tX25Db21wQml0cyA9PSAxMiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubV9uQ29tcEJpdHMgPT0gMTYgICApOworICBGWF9CT09MIGJDb21wQml0cyA9IChzdHJlYW0ubV9uQ29tcEJpdHMgPT0gMSB8fCBzdHJlYW0ubV9uQ29tcEJpdHMgPT0gMiB8fAorICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubV9uQ29tcEJpdHMgPT0gNCB8fCBzdHJlYW0ubV9uQ29tcEJpdHMgPT0gOCB8fAorICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ubV9uQ29tcEJpdHMgPT0gMTIgfHwgc3RyZWFtLm1fbkNvbXBCaXRzID09IDE2KTsKIAotICAgIEZYX0JPT0wgYkZsYWdCaXRzID0gKCBzdHJlYW0ubV9uRmxhZ0JpdHMgPT0gMiAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLm1fbkZsYWdCaXRzID09IDQgIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tX25GbGFnQml0cyA9PSA4ICAgICk7CisgIEZYX0JPT0wgYkZsYWdCaXRzID0gKHN0cmVhbS5tX25GbGFnQml0cyA9PSAyIHx8IHN0cmVhbS5tX25GbGFnQml0cyA9PSA0IHx8CisgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tX25GbGFnQml0cyA9PSA4KTsKIAotICAgIHJldHVybiBiQ29vckJpdHMgJiYgYkNvbXBCaXRzICYmIGJGbGFnQml0czsgCisgIHJldHVybiBiQ29vckJpdHMgJiYgYkNvbXBCaXRzICYmIGJGbGFnQml0czsKIH0KIAotc3RhdGljIHZvaWQgX0RyYXdDb29uUGF0Y2hNZXNoZXMoRlhfQk9PTCBiVGVuc29yLCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9TdHJlYW0qIHBTaGFkaW5nU3RyZWFtLCBDUERGX0Z1bmN0aW9uKiogcEZ1bmNzLCBpbnQgbkZ1bmNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MsIGludCBmaWxsX21vZGUsIGludCBhbHBoYSkKLXsKLSAgICBBU1NFUlQocEJpdG1hcC0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYik7Ci0gICAgaWYgKHBTaGFkaW5nU3RyZWFtLT5HZXRUeXBlKCkgIT0gUERGT0JKX1NUUkVBTSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENGWF9GeGdlRGV2aWNlIGRldmljZTsKLSAgICBkZXZpY2UuQXR0YWNoKHBCaXRtYXApOwotICAgIENQREZfTWVzaFN0cmVhbSBzdHJlYW07Ci0gICAgaWYgKCFzdHJlYW0uTG9hZChwU2hhZGluZ1N0cmVhbSwgcEZ1bmNzLCBuRnVuY3MsIHBDUykpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KK3N0YXRpYyB2b2lkIERyYXdDb29uUGF0Y2hNZXNoZXMoRlhfQk9PTCBiVGVuc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBPYmplY3QyQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1N0cmVhbSogcFNoYWRpbmdTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRnVuY3Rpb24qKiBwRnVuY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuRnVuY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQ29sb3JTcGFjZSogcENTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEpIHsKKyAgQVNTRVJUKHBCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpOwogCi0gICAgaWYgKCFfQ2hlY2tDb29uVGVuc29yUGFyYShzdHJlYW0pKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gCi0gICAgQ1BERl9QYXRjaERyYXdlciBwYXRjaDsKLSAgICBwYXRjaC5hbHBoYSA9IGFscGhhOwotICAgIHBhdGNoLnBEZXZpY2UgPSAmZGV2aWNlOwotICAgIHBhdGNoLmZpbGxfbW9kZSA9IGZpbGxfbW9kZTsKLSAgICBwYXRjaC5wYXRoLlNldFBvaW50Q291bnQoMTMpOwotICAgIEZYX1BBVEhQT0lOVCogcFBvaW50cyA9IHBhdGNoLnBhdGguR2V0UG9pbnRzKCk7Ci0gICAgcFBvaW50c1swXS5tX0ZsYWcgPSBGWFBUX01PVkVUTzsKLSAgICBmb3IgKGludCBpID0gMTsgaSA8IDEzOyBpICsrKSB7Ci0gICAgICAgIHBQb2ludHNbaV0ubV9GbGFnID0gRlhQVF9CRVpJRVJUTzsKLSAgICB9Ci0gICAgQ0ZYX0Zsb2F0UG9pbnQgY29vcmRzWzE2XTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpICsrKSB7Ci0gICAgICAgIGNvb3Jkc1tpXS5TZXQoMC4wZiwgMC4wZik7Ci0gICAgfQorICBDRlhfRnhnZURldmljZSBkZXZpY2U7CisgIGRldmljZS5BdHRhY2gocEJpdG1hcCk7CisgIENQREZfTWVzaFN0cmVhbSBzdHJlYW07CisgIGlmICghc3RyZWFtLkxvYWQocFNoYWRpbmdTdHJlYW0sIHBGdW5jcywgbkZ1bmNzLCBwQ1MpKQorICAgIHJldHVybjsKKyAgaWYgKCFfQ2hlY2tDb29uVGVuc29yUGFyYShzdHJlYW0pKQorICAgIHJldHVybjsKIAotICAgIGludCBwb2ludF9jb3VudCA9IGJUZW5zb3IgPyAxNiA6IDEyOwotICAgIHdoaWxlICghc3RyZWFtLm1fQml0U3RyZWFtLklzRU9GKCkpIHsKLSAgICAgICAgRlhfRFdPUkQgZmxhZyA9IHN0cmVhbS5HZXRGbGFnKCk7Ci0gICAgICAgIGludCBpU3RhcnRQb2ludCA9IDAsIGlTdGFydENvbG9yID0gMCwgaSA9IDA7Ci0gICAgICAgIGlmIChmbGFnKSB7Ci0gICAgICAgICAgICBpU3RhcnRQb2ludCA9IDQ7Ci0gICAgICAgICAgICBpU3RhcnRDb2xvciA9IDI7Ci0gICAgICAgICAgICBDRlhfRmxvYXRQb2ludCB0ZW1wQ29vcmRzWzRdOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkgKyspIHsKLSAgICAgICAgICAgICAgICB0ZW1wQ29vcmRzW2ldID0gY29vcmRzWyhmbGFnICogMyArIGkpICUgMTJdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIoY29vcmRzLCB0ZW1wQ29vcmRzLCBzaXplb2YoQ0ZYX0Zsb2F0UG9pbnQpICogNCk7Ci0gICAgICAgICAgICBDb29uX0NvbG9yIHRlbXBDb2xvcnNbMl07Ci0gICAgICAgICAgICB0ZW1wQ29sb3JzWzBdID0gcGF0Y2gucGF0Y2hfY29sb3JzW2ZsYWddOwotICAgICAgICAgICAgdGVtcENvbG9yc1sxXSA9IHBhdGNoLnBhdGNoX2NvbG9yc1soZmxhZyArIDEpICUgNF07Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkzMihwYXRjaC5wYXRjaF9jb2xvcnMsIHRlbXBDb2xvcnMsIHNpemVvZihDb29uX0NvbG9yKSAqIDIpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaSA9IGlTdGFydFBvaW50OyBpIDwgcG9pbnRfY291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIHN0cmVhbS5HZXRDb29yZHMoY29vcmRzW2ldLngsIGNvb3Jkc1tpXS55KTsKLSAgICAgICAgICAgIHBPYmplY3QyQml0bWFwLT5UcmFuc2Zvcm0oY29vcmRzW2ldLngsIGNvb3Jkc1tpXS55KTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGkgPSBpU3RhcnRDb2xvcjsgaSA8IDQ7IGkgKyspIHsKLSAgICAgICAgICAgIEZYX0ZMT0FUIHI9MC4wZiwgZz0wLjBmLCBiPTAuMGY7Ci0gICAgICAgICAgICBzdHJlYW0uR2V0Q29sb3IociwgZywgYik7Ci0gICAgICAgICAgICBwYXRjaC5wYXRjaF9jb2xvcnNbaV0uY29tcFswXSA9IChGWF9JTlQzMikociAqIDI1NSk7Ci0gICAgICAgICAgICBwYXRjaC5wYXRjaF9jb2xvcnNbaV0uY29tcFsxXSA9IChGWF9JTlQzMikoZyAqIDI1NSk7Ci0gICAgICAgICAgICBwYXRjaC5wYXRjaF9jb2xvcnNbaV0uY29tcFsyXSA9IChGWF9JTlQzMikoYiAqIDI1NSk7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0Zsb2F0UmVjdCBiYm94ID0gQ0ZYX0Zsb2F0UmVjdDo6R2V0QkJveChjb29yZHMsIHBvaW50X2NvdW50KTsKLSAgICAgICAgaWYgKGJib3gucmlnaHQgPD0gMCB8fCBiYm94LmxlZnQgPj0gKEZYX0ZMT0FUKXBCaXRtYXAtPkdldFdpZHRoKCkgfHwgYmJveC50b3AgPD0gMCB8fAotICAgICAgICAgICAgICAgIGJib3guYm90dG9tID49IChGWF9GTE9BVClwQml0bWFwLT5HZXRIZWlnaHQoKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ29vbl9CZXppZXIgQzEsIEMyLCBEMSwgRDI7Ci0gICAgICAgIEMxLkZyb21Qb2ludHMoY29vcmRzWzBdLngsIGNvb3Jkc1swXS55LCBjb29yZHNbMTFdLngsIGNvb3Jkc1sxMV0ueSwgY29vcmRzWzEwXS54LCBjb29yZHNbMTBdLnksCi0gICAgICAgICAgICAgICAgICAgICAgY29vcmRzWzldLngsIGNvb3Jkc1s5XS55KTsKLSAgICAgICAgQzIuRnJvbVBvaW50cyhjb29yZHNbM10ueCwgY29vcmRzWzNdLnksIGNvb3Jkc1s0XS54LCBjb29yZHNbNF0ueSwgY29vcmRzWzVdLngsIGNvb3Jkc1s1XS55LAotICAgICAgICAgICAgICAgICAgICAgIGNvb3Jkc1s2XS54LCBjb29yZHNbNl0ueSk7Ci0gICAgICAgIEQxLkZyb21Qb2ludHMoY29vcmRzWzBdLngsIGNvb3Jkc1swXS55LCBjb29yZHNbMV0ueCwgY29vcmRzWzFdLnksIGNvb3Jkc1syXS54LCBjb29yZHNbMl0ueSwKLSAgICAgICAgICAgICAgICAgICAgICBjb29yZHNbM10ueCwgY29vcmRzWzNdLnkpOwotICAgICAgICBEMi5Gcm9tUG9pbnRzKGNvb3Jkc1s5XS54LCBjb29yZHNbOV0ueSwgY29vcmRzWzhdLngsIGNvb3Jkc1s4XS55LCBjb29yZHNbN10ueCwgY29vcmRzWzddLnksCi0gICAgICAgICAgICAgICAgICAgICAgY29vcmRzWzZdLngsIGNvb3Jkc1s2XS55KTsKLSAgICAgICAgcGF0Y2guRHJhdygxLCAxLCAwLCAwLCBDMSwgQzIsIEQxLCBEMik7CisgIENQREZfUGF0Y2hEcmF3ZXIgcGF0Y2g7CisgIHBhdGNoLmFscGhhID0gYWxwaGE7CisgIHBhdGNoLnBEZXZpY2UgPSAmZGV2aWNlOworICBwYXRjaC5maWxsX21vZGUgPSBmaWxsX21vZGU7CisgIHBhdGNoLnBhdGguU2V0UG9pbnRDb3VudCgxMyk7CisgIEZYX1BBVEhQT0lOVCogcFBvaW50cyA9IHBhdGNoLnBhdGguR2V0UG9pbnRzKCk7CisgIHBQb2ludHNbMF0ubV9GbGFnID0gRlhQVF9NT1ZFVE87CisgIGZvciAoaW50IGkgPSAxOyBpIDwgMTM7IGkrKykgeworICAgIHBQb2ludHNbaV0ubV9GbGFnID0gRlhQVF9CRVpJRVJUTzsKKyAgfQorICBDRlhfRmxvYXRQb2ludCBjb29yZHNbMTZdOworICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICBjb29yZHNbaV0uU2V0KDAuMGYsIDAuMGYpOworICB9CisKKyAgaW50IHBvaW50X2NvdW50ID0gYlRlbnNvciA/IDE2IDogMTI7CisgIHdoaWxlICghc3RyZWFtLm1fQml0U3RyZWFtLklzRU9GKCkpIHsKKyAgICBGWF9EV09SRCBmbGFnID0gc3RyZWFtLkdldEZsYWcoKTsKKyAgICBpbnQgaVN0YXJ0UG9pbnQgPSAwLCBpU3RhcnRDb2xvciA9IDAsIGkgPSAwOworICAgIGlmIChmbGFnKSB7CisgICAgICBpU3RhcnRQb2ludCA9IDQ7CisgICAgICBpU3RhcnRDb2xvciA9IDI7CisgICAgICBDRlhfRmxvYXRQb2ludCB0ZW1wQ29vcmRzWzRdOworICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICB0ZW1wQ29vcmRzW2ldID0gY29vcmRzWyhmbGFnICogMyArIGkpICUgMTJdOworICAgICAgfQorICAgICAgRlhTWVNfbWVtY3B5KGNvb3JkcywgdGVtcENvb3Jkcywgc2l6ZW9mKENGWF9GbG9hdFBvaW50KSAqIDQpOworICAgICAgQ29vbl9Db2xvciB0ZW1wQ29sb3JzWzJdOworICAgICAgdGVtcENvbG9yc1swXSA9IHBhdGNoLnBhdGNoX2NvbG9yc1tmbGFnXTsKKyAgICAgIHRlbXBDb2xvcnNbMV0gPSBwYXRjaC5wYXRjaF9jb2xvcnNbKGZsYWcgKyAxKSAlIDRdOworICAgICAgRlhTWVNfbWVtY3B5KHBhdGNoLnBhdGNoX2NvbG9ycywgdGVtcENvbG9ycywgc2l6ZW9mKENvb25fQ29sb3IpICogMik7CiAgICAgfQorICAgIGZvciAoaSA9IGlTdGFydFBvaW50OyBpIDwgcG9pbnRfY291bnQ7IGkrKykgeworICAgICAgc3RyZWFtLkdldENvb3Jkcyhjb29yZHNbaV0ueCwgY29vcmRzW2ldLnkpOworICAgICAgcE9iamVjdDJCaXRtYXAtPlRyYW5zZm9ybShjb29yZHNbaV0ueCwgY29vcmRzW2ldLnkpOworICAgIH0KKyAgICBmb3IgKGkgPSBpU3RhcnRDb2xvcjsgaSA8IDQ7IGkrKykgeworICAgICAgRlhfRkxPQVQgciA9IDAuMGYsIGcgPSAwLjBmLCBiID0gMC4wZjsKKyAgICAgIHN0cmVhbS5HZXRDb2xvcihyLCBnLCBiKTsKKyAgICAgIHBhdGNoLnBhdGNoX2NvbG9yc1tpXS5jb21wWzBdID0gKGludDMyX3QpKHIgKiAyNTUpOworICAgICAgcGF0Y2gucGF0Y2hfY29sb3JzW2ldLmNvbXBbMV0gPSAoaW50MzJfdCkoZyAqIDI1NSk7CisgICAgICBwYXRjaC5wYXRjaF9jb2xvcnNbaV0uY29tcFsyXSA9IChpbnQzMl90KShiICogMjU1KTsKKyAgICB9CisgICAgQ0ZYX0Zsb2F0UmVjdCBiYm94ID0gQ0ZYX0Zsb2F0UmVjdDo6R2V0QkJveChjb29yZHMsIHBvaW50X2NvdW50KTsKKyAgICBpZiAoYmJveC5yaWdodCA8PSAwIHx8IGJib3gubGVmdCA+PSAoRlhfRkxPQVQpcEJpdG1hcC0+R2V0V2lkdGgoKSB8fAorICAgICAgICBiYm94LnRvcCA8PSAwIHx8IGJib3guYm90dG9tID49IChGWF9GTE9BVClwQml0bWFwLT5HZXRIZWlnaHQoKSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIENvb25fQmV6aWVyIEMxLCBDMiwgRDEsIEQyOworICAgIEMxLkZyb21Qb2ludHMoY29vcmRzWzBdLngsIGNvb3Jkc1swXS55LCBjb29yZHNbMTFdLngsIGNvb3Jkc1sxMV0ueSwKKyAgICAgICAgICAgICAgICAgIGNvb3Jkc1sxMF0ueCwgY29vcmRzWzEwXS55LCBjb29yZHNbOV0ueCwgY29vcmRzWzldLnkpOworICAgIEMyLkZyb21Qb2ludHMoY29vcmRzWzNdLngsIGNvb3Jkc1szXS55LCBjb29yZHNbNF0ueCwgY29vcmRzWzRdLnksCisgICAgICAgICAgICAgICAgICBjb29yZHNbNV0ueCwgY29vcmRzWzVdLnksIGNvb3Jkc1s2XS54LCBjb29yZHNbNl0ueSk7CisgICAgRDEuRnJvbVBvaW50cyhjb29yZHNbMF0ueCwgY29vcmRzWzBdLnksIGNvb3Jkc1sxXS54LCBjb29yZHNbMV0ueSwKKyAgICAgICAgICAgICAgICAgIGNvb3Jkc1syXS54LCBjb29yZHNbMl0ueSwgY29vcmRzWzNdLngsIGNvb3Jkc1szXS55KTsKKyAgICBEMi5Gcm9tUG9pbnRzKGNvb3Jkc1s5XS54LCBjb29yZHNbOV0ueSwgY29vcmRzWzhdLngsIGNvb3Jkc1s4XS55LAorICAgICAgICAgICAgICAgICAgY29vcmRzWzddLngsIGNvb3Jkc1s3XS55LCBjb29yZHNbNl0ueCwgY29vcmRzWzZdLnkpOworICAgIHBhdGNoLkRyYXcoMSwgMSwgMCwgMCwgQzEsIEMyLCBEMSwgRDIpOworICB9CiB9Ci12b2lkIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3U2hhZGluZyhDUERGX1NoYWRpbmdQYXR0ZXJuKiBwUGF0dGVybiwgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QmIGNsaXBfcmVjdCwgaW50IGFscGhhLCBGWF9CT09MIGJBbHBoYU1vZGUpCi17Ci0gICAgQ1BERl9GdW5jdGlvbioqIHBGdW5jcyA9IHBQYXR0ZXJuLT5tX3BGdW5jdGlvbnM7Ci0gICAgaW50IG5GdW5jcyA9IHBQYXR0ZXJuLT5tX25GdW5jczsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFBhdHRlcm4tPm1fcFNoYWRpbmdPYmotPkdldERpY3QoKTsKLSAgICBDUERGX0NvbG9yU3BhY2UqIHBDb2xvclNwYWNlID0gcFBhdHRlcm4tPm1fcENTOwotICAgIGlmIChwQ29sb3JTcGFjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKK3ZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdTaGFkaW5nKENQREZfU2hhZGluZ1BhdHRlcm4qIHBQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QmIGNsaXBfcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFscGhhTW9kZSkgeworICBDUERGX0Z1bmN0aW9uKiogcEZ1bmNzID0gcFBhdHRlcm4tPm1fcEZ1bmN0aW9uczsKKyAgaW50IG5GdW5jcyA9IHBQYXR0ZXJuLT5tX25GdW5jczsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBQYXR0ZXJuLT5tX3BTaGFkaW5nT2JqLT5HZXREaWN0KCk7CisgIENQREZfQ29sb3JTcGFjZSogcENvbG9yU3BhY2UgPSBwUGF0dGVybi0+bV9wQ1M7CisgIGlmICghcENvbG9yU3BhY2UpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfQVJHQiBiYWNrZ3JvdW5kID0gMDsKKyAgaWYgKCFwUGF0dGVybi0+bV9iU2hhZGluZ09iaiAmJgorICAgICAgcFBhdHRlcm4tPm1fcFNoYWRpbmdPYmotPkdldERpY3QoKS0+S2V5RXhpc3QoIkJhY2tncm91bmQiKSkgeworICAgIENQREZfQXJyYXkqIHBCYWNrQ29sb3IgPQorICAgICAgICBwUGF0dGVybi0+bV9wU2hhZGluZ09iai0+R2V0RGljdCgpLT5HZXRBcnJheSgiQmFja2dyb3VuZCIpOworICAgIGlmIChwQmFja0NvbG9yICYmCisgICAgICAgIHBCYWNrQ29sb3ItPkdldENvdW50KCkgPj0gKEZYX0RXT1JEKXBDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKSkgeworICAgICAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IGNvbXBzKHBDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKSk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKTsgaSsrKSB7CisgICAgICAgIGNvbXBzW2ldID0gcEJhY2tDb2xvci0+R2V0TnVtYmVyKGkpOworICAgICAgfQorICAgICAgRlhfRkxPQVQgUiA9IDAuMGYsIEcgPSAwLjBmLCBCID0gMC4wZjsKKyAgICAgIHBDb2xvclNwYWNlLT5HZXRSR0IoY29tcHMsIFIsIEcsIEIpOworICAgICAgYmFja2dyb3VuZCA9IEFyZ2JFbmNvZGUoMjU1LCAoaW50MzJfdCkoUiAqIDI1NSksIChpbnQzMl90KShHICogMjU1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KShCICogMjU1KSk7CiAgICAgfQotICAgIEZYX0FSR0IgYmFja2dyb3VuZCA9IDA7Ci0gICAgaWYgKCFwUGF0dGVybi0+bV9iU2hhZGluZ09iaiAmJiBwUGF0dGVybi0+bV9wU2hhZGluZ09iai0+R2V0RGljdCgpLT5LZXlFeGlzdChGWF9CU1RSQygiQmFja2dyb3VuZCIpKSkgewotICAgICAgICBDUERGX0FycmF5KiBwQmFja0NvbG9yID0gcFBhdHRlcm4tPm1fcFNoYWRpbmdPYmotPkdldERpY3QoKS0+R2V0QXJyYXkoRlhfQlNUUkMoIkJhY2tncm91bmQiKSk7Ci0gICAgICAgIGlmIChwQmFja0NvbG9yICYmIHBCYWNrQ29sb3ItPkdldENvdW50KCkgPj0gKEZYX0RXT1JEKXBDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKSkgewotICAgICAgICAgICAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IGNvbXBzKHBDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKTsgaSArKykgewotICAgICAgICAgICAgICAgIGNvbXBzW2ldID0gcEJhY2tDb2xvci0+R2V0TnVtYmVyKGkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfRkxPQVQgUiA9IDAuMGYsIEcgPSAwLjBmLCBCID0gMC4wZjsKLSAgICAgICAgICAgIHBDb2xvclNwYWNlLT5HZXRSR0IoY29tcHMsIFIsIEcsIEIpOwotICAgICAgICAgICAgYmFja2dyb3VuZCA9IEFyZ2JFbmNvZGUoMjU1LCAoRlhfSU5UMzIpKFIgKiAyNTUpLCAoRlhfSU5UMzIpKEcgKiAyNTUpLCAoRlhfSU5UMzIpKEIgKiAyNTUpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJCQm94IikpKSB7Ci0gICAgICAgIENGWF9GbG9hdFJlY3QgcmVjdCA9IHBEaWN0LT5HZXRSZWN0KEZYX0JTVFJDKCJCQm94IikpOwotICAgICAgICByZWN0LlRyYW5zZm9ybShwTWF0cml4KTsKLSAgICAgICAgY2xpcF9yZWN0LkludGVyc2VjdChyZWN0LkdldE91dHRlclJlY3QoKSk7Ci0gICAgfQotICAgIENQREZfRGV2aWNlQnVmZmVyIGJ1ZmZlcjsKLSAgICBidWZmZXIuSW5pdGlhbGl6ZShtX3BDb250ZXh0LCBtX3BEZXZpY2UsICZjbGlwX3JlY3QsIG1fcEN1ck9iaiwgMTUwKTsKLSAgICBDRlhfQWZmaW5lTWF0cml4IEZpbmFsTWF0cml4ID0gKnBNYXRyaXg7Ci0gICAgRmluYWxNYXRyaXguQ29uY2F0KCpidWZmZXIuR2V0TWF0cml4KCkpOwotICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IGJ1ZmZlci5HZXRCaXRtYXAoKTsKLSAgICBpZiAocEJpdG1hcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHBCaXRtYXAtPkNsZWFyKGJhY2tncm91bmQpOwotICAgIGludCBmaWxsX21vZGUgPSBtX09wdGlvbnMubV9GbGFnczsKLSAgICBzd2l0Y2ggKHBQYXR0ZXJuLT5tX1NoYWRpbmdUeXBlKSB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIF9EcmF3RnVuY1NoYWRpbmcocEJpdG1hcCwgJkZpbmFsTWF0cml4LCBwRGljdCwgcEZ1bmNzLCBuRnVuY3MsIHBDb2xvclNwYWNlLCBhbHBoYSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgX0RyYXdBeGlhbFNoYWRpbmcocEJpdG1hcCwgJkZpbmFsTWF0cml4LCBwRGljdCwgcEZ1bmNzLCBuRnVuY3MsIHBDb2xvclNwYWNlLCBhbHBoYSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgX0RyYXdSYWRpYWxTaGFkaW5nKHBCaXRtYXAsICZGaW5hbE1hdHJpeCwgcERpY3QsIHBGdW5jcywgbkZ1bmNzLCBwQ29sb3JTcGFjZSwgYWxwaGEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDogewotICAgICAgICAgICAgICAgIF9EcmF3RnJlZUdvdXJhdWRTaGFkaW5nKHBCaXRtYXAsICZGaW5hbE1hdHJpeCwgKENQREZfU3RyZWFtKilwUGF0dGVybi0+bV9wU2hhZGluZ09iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRnVuY3MsIG5GdW5jcywgcENvbG9yU3BhY2UsIGFscGhhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU6IHsKLSAgICAgICAgICAgICAgICBfRHJhd0xhdHRpY2VHb3VyYXVkU2hhZGluZyhwQml0bWFwLCAmRmluYWxNYXRyaXgsIChDUERGX1N0cmVhbSopcFBhdHRlcm4tPm1fcFNoYWRpbmdPYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZ1bmNzLCBuRnVuY3MsIHBDb2xvclNwYWNlLCBhbHBoYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2OgotICAgICAgICBjYXNlIDc6IHsKLSAgICAgICAgICAgICAgICBfRHJhd0Nvb25QYXRjaE1lc2hlcyhwUGF0dGVybi0+bV9TaGFkaW5nVHlwZSAtIDYsIHBCaXRtYXAsICZGaW5hbE1hdHJpeCwgKENQREZfU3RyZWFtKilwUGF0dGVybi0+bV9wU2hhZGluZ09iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRnVuY3MsIG5GdW5jcywgcENvbG9yU3BhY2UsIGZpbGxfbW9kZSwgYWxwaGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChiQWxwaGFNb2RlKSB7Ci0gICAgICAgIHBCaXRtYXAtPkxvYWRDaGFubmVsKEZYRElCX1JlZCwgcEJpdG1hcCwgRlhESUJfQWxwaGEpOwotICAgIH0KLSAgICBpZiAobV9PcHRpb25zLm1fQ29sb3JNb2RlID09IFJFTkRFUl9DT0xPUl9HUkFZKSB7Ci0gICAgICAgIHBCaXRtYXAtPkNvbnZlcnRDb2xvclNjYWxlKG1fT3B0aW9ucy5tX0ZvcmVDb2xvciwgbV9PcHRpb25zLm1fQmFja0NvbG9yKTsKLSAgICB9Ci0gICAgYnVmZmVyLk91dHB1dFRvRGV2aWNlKCk7CisgIH0KKyAgaWYgKHBEaWN0LT5LZXlFeGlzdCgiQkJveCIpKSB7CisgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0ID0gcERpY3QtPkdldFJlY3QoIkJCb3giKTsKKyAgICByZWN0LlRyYW5zZm9ybShwTWF0cml4KTsKKyAgICBjbGlwX3JlY3QuSW50ZXJzZWN0KHJlY3QuR2V0T3V0dGVyUmVjdCgpKTsKKyAgfQorICBDUERGX0RldmljZUJ1ZmZlciBidWZmZXI7CisgIGJ1ZmZlci5Jbml0aWFsaXplKG1fcENvbnRleHQsIG1fcERldmljZSwgJmNsaXBfcmVjdCwgbV9wQ3VyT2JqLCAxNTApOworICBDRlhfTWF0cml4IEZpbmFsTWF0cml4ID0gKnBNYXRyaXg7CisgIEZpbmFsTWF0cml4LkNvbmNhdCgqYnVmZmVyLkdldE1hdHJpeCgpKTsKKyAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gYnVmZmVyLkdldEJpdG1hcCgpOworICBpZiAoIXBCaXRtYXAtPkdldEJ1ZmZlcigpKSB7CisgICAgcmV0dXJuOworICB9CisgIHBCaXRtYXAtPkNsZWFyKGJhY2tncm91bmQpOworICBpbnQgZmlsbF9tb2RlID0gbV9PcHRpb25zLm1fRmxhZ3M7CisgIHN3aXRjaCAocFBhdHRlcm4tPm1fU2hhZGluZ1R5cGUpIHsKKyAgICBjYXNlIGtJbnZhbGlkU2hhZGluZzoKKyAgICBjYXNlIGtNYXhTaGFkaW5nOgorICAgICAgcmV0dXJuOworICAgIGNhc2Uga0Z1bmN0aW9uQmFzZWRTaGFkaW5nOgorICAgICAgRHJhd0Z1bmNTaGFkaW5nKHBCaXRtYXAsICZGaW5hbE1hdHJpeCwgcERpY3QsIHBGdW5jcywgbkZ1bmNzLCBwQ29sb3JTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtBeGlhbFNoYWRpbmc6CisgICAgICBEcmF3QXhpYWxTaGFkaW5nKHBCaXRtYXAsICZGaW5hbE1hdHJpeCwgcERpY3QsIHBGdW5jcywgbkZ1bmNzLAorICAgICAgICAgICAgICAgICAgICAgICBwQ29sb3JTcGFjZSwgYWxwaGEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBrUmFkaWFsU2hhZGluZzoKKyAgICAgIERyYXdSYWRpYWxTaGFkaW5nKHBCaXRtYXAsICZGaW5hbE1hdHJpeCwgcERpY3QsIHBGdW5jcywgbkZ1bmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgcENvbG9yU3BhY2UsIGFscGhhKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga0ZyZWVGb3JtR291cmF1ZFRyaWFuZ2xlTWVzaFNoYWRpbmc6IHsKKyAgICAgIERyYXdGcmVlR291cmF1ZFNoYWRpbmcocEJpdG1hcCwgJkZpbmFsTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb1N0cmVhbShwUGF0dGVybi0+bV9wU2hhZGluZ09iaiksIHBGdW5jcywgbkZ1bmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29sb3JTcGFjZSwgYWxwaGEpOworICAgIH0gYnJlYWs7CisgICAgY2FzZSBrTGF0dGljZUZvcm1Hb3VyYXVkVHJpYW5nbGVNZXNoU2hhZGluZzogeworICAgICAgRHJhd0xhdHRpY2VHb3VyYXVkU2hhZGluZyhwQml0bWFwLCAmRmluYWxNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvU3RyZWFtKHBQYXR0ZXJuLT5tX3BTaGFkaW5nT2JqKSwgcEZ1bmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuRnVuY3MsIHBDb2xvclNwYWNlLCBhbHBoYSk7CisgICAgfSBicmVhazsKKyAgICBjYXNlIGtDb29uc1BhdGNoTWVzaFNoYWRpbmc6CisgICAgY2FzZSBrVGVuc29yUHJvZHVjdFBhdGNoTWVzaFNoYWRpbmc6IHsKKyAgICAgIERyYXdDb29uUGF0Y2hNZXNoZXMoCisgICAgICAgICAgcFBhdHRlcm4tPm1fU2hhZGluZ1R5cGUgPT0ga1RlbnNvclByb2R1Y3RQYXRjaE1lc2hTaGFkaW5nLCBwQml0bWFwLAorICAgICAgICAgICZGaW5hbE1hdHJpeCwgVG9TdHJlYW0ocFBhdHRlcm4tPm1fcFNoYWRpbmdPYmopLCBwRnVuY3MsIG5GdW5jcywKKyAgICAgICAgICBwQ29sb3JTcGFjZSwgZmlsbF9tb2RlLCBhbHBoYSk7CisgICAgfSBicmVhazsKKyAgfQorICBpZiAoYkFscGhhTW9kZSkgeworICAgIHBCaXRtYXAtPkxvYWRDaGFubmVsKEZYRElCX1JlZCwgcEJpdG1hcCwgRlhESUJfQWxwaGEpOworICB9CisgIGlmIChtX09wdGlvbnMubV9Db2xvck1vZGUgPT0gUkVOREVSX0NPTE9SX0dSQVkpIHsKKyAgICBwQml0bWFwLT5Db252ZXJ0Q29sb3JTY2FsZShtX09wdGlvbnMubV9Gb3JlQ29sb3IsIG1fT3B0aW9ucy5tX0JhY2tDb2xvcik7CisgIH0KKyAgYnVmZmVyLk91dHB1dFRvRGV2aWNlKCk7CiB9Ci12b2lkIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3U2hhZGluZ1BhdHRlcm4oQ1BERl9TaGFkaW5nUGF0dGVybiogcGF0dGVybiwgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIEZYX0JPT0wgYlN0cm9rZSkKLXsKLSAgICBpZiAoIXBhdHRlcm4tPkxvYWQoKSkgewotICAgICAgICByZXR1cm47Cit2b2lkIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3U2hhZGluZ1BhdHRlcm4oQ1BERl9TaGFkaW5nUGF0dGVybiogcGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0cm9rZSkgeworICBpZiAoIXBhdHRlcm4tPkxvYWQoKSkgeworICAgIHJldHVybjsKKyAgfQorICBtX3BEZXZpY2UtPlNhdmVTdGF0ZSgpOworICBpZiAocFBhZ2VPYmotPm1fVHlwZSA9PSBQREZQQUdFX1BBVEgpIHsKKyAgICBpZiAoIVNlbGVjdENsaXBQYXRoKChDUERGX1BhdGhPYmplY3QqKXBQYWdlT2JqLCBwT2JqMkRldmljZSwgYlN0cm9rZSkpIHsKKyAgICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIG1fcERldmljZS0+U2F2ZVN0YXRlKCk7Ci0gICAgaWYgKHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9QQVRIKSB7Ci0gICAgICAgIGlmICghU2VsZWN0Q2xpcFBhdGgoKENQREZfUGF0aE9iamVjdCopcFBhZ2VPYmosIHBPYmoyRGV2aWNlLCBiU3Ryb2tlKSkgewotICAgICAgICAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAocFBhZ2VPYmotPm1fVHlwZSA9PSBQREZQQUdFX0lNQUdFKSB7Ci0gICAgICAgIEZYX1JFQ1QgcmVjdCA9IHBQYWdlT2JqLT5HZXRCQm94KHBPYmoyRGV2aWNlKTsKLSAgICAgICAgbV9wRGV2aWNlLT5TZXRDbGlwX1JlY3QoJnJlY3QpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfUkVDVCByZWN0OwotICAgIGlmIChHZXRPYmplY3RDbGlwcGVkUmVjdChwUGFnZU9iaiwgcE9iajJEZXZpY2UsIEZBTFNFLCByZWN0KSkgewotICAgICAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4ID0gcGF0dGVybi0+bV9QYXR0ZXJuMkZvcm07Ci0gICAgbWF0cml4LkNvbmNhdCgqcE9iajJEZXZpY2UpOwotICAgIEdldFNjYWxlZE1hdHJpeChtYXRyaXgpOwotICAgIGludCBhbHBoYSA9IHBQYWdlT2JqLT5tX0dlbmVyYWxTdGF0ZS5HZXRBbHBoYShiU3Ryb2tlKTsKLSAgICBEcmF3U2hhZGluZyhwYXR0ZXJuLCAmbWF0cml4LCByZWN0LCBhbHBoYSwgbV9PcHRpb25zLm1fQ29sb3JNb2RlID09IFJFTkRFUl9DT0xPUl9BTFBIQSk7CisgIH0gZWxzZSBpZiAocFBhZ2VPYmotPm1fVHlwZSA9PSBQREZQQUdFX0lNQUdFKSB7CisgICAgRlhfUkVDVCByZWN0ID0gcFBhZ2VPYmotPkdldEJCb3gocE9iajJEZXZpY2UpOworICAgIG1fcERldmljZS0+U2V0Q2xpcF9SZWN0KCZyZWN0KTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfUkVDVCByZWN0OworICBpZiAoR2V0T2JqZWN0Q2xpcHBlZFJlY3QocFBhZ2VPYmosIHBPYmoyRGV2aWNlLCBGQUxTRSwgcmVjdCkpIHsKICAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOworICAgIHJldHVybjsKKyAgfQorICBDRlhfTWF0cml4IG1hdHJpeCA9IHBhdHRlcm4tPm1fUGF0dGVybjJGb3JtOworICBtYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7CisgIEdldFNjYWxlZE1hdHJpeChtYXRyaXgpOworICBpbnQgYWxwaGEgPSBwUGFnZU9iai0+bV9HZW5lcmFsU3RhdGUuR2V0QWxwaGEoYlN0cm9rZSk7CisgIERyYXdTaGFkaW5nKHBhdHRlcm4sICZtYXRyaXgsIHJlY3QsIGFscGhhLAorICAgICAgICAgICAgICBtX09wdGlvbnMubV9Db2xvck1vZGUgPT0gUkVOREVSX0NPTE9SX0FMUEhBKTsKKyAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKIH0KLUZYX0JPT0wgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NTaGFkaW5nKENQREZfU2hhZGluZ09iamVjdCogcFNoYWRpbmdPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKQotewotICAgIEZYX1JFQ1QgcmVjdCA9IHBTaGFkaW5nT2JqLT5HZXRCQm94KHBPYmoyRGV2aWNlKTsKLSAgICBGWF9SRUNUIGNsaXBfYm94ID0gbV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7Ci0gICAgcmVjdC5JbnRlcnNlY3QoY2xpcF9ib3gpOwotICAgIGlmIChyZWN0LklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXggPSBwU2hhZGluZ09iai0+bV9NYXRyaXg7Ci0gICAgbWF0cml4LkNvbmNhdCgqcE9iajJEZXZpY2UpOwotICAgIERyYXdTaGFkaW5nKHBTaGFkaW5nT2JqLT5tX3BTaGFkaW5nLCAmbWF0cml4LCByZWN0LCBwU2hhZGluZ09iai0+bV9HZW5lcmFsU3RhdGUuR2V0QWxwaGEoRkFMU0UpLAotICAgICAgICAgICAgICAgIG1fT3B0aW9ucy5tX0NvbG9yTW9kZSA9PSBSRU5ERVJfQ09MT1JfQUxQSEEpOworRlhfQk9PTCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc1NoYWRpbmcoQ1BERl9TaGFkaW5nT2JqZWN0KiBwU2hhZGluZ09iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlKSB7CisgIEZYX1JFQ1QgcmVjdCA9IHBTaGFkaW5nT2JqLT5HZXRCQm94KHBPYmoyRGV2aWNlKTsKKyAgRlhfUkVDVCBjbGlwX2JveCA9IG1fcERldmljZS0+R2V0Q2xpcEJveCgpOworICByZWN0LkludGVyc2VjdChjbGlwX2JveCk7CisgIGlmIChyZWN0LklzRW1wdHkoKSkgewogICAgIHJldHVybiBUUlVFOworICB9CisgIENGWF9NYXRyaXggbWF0cml4ID0gcFNoYWRpbmdPYmotPm1fTWF0cml4OworICBtYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7CisgIERyYXdTaGFkaW5nKHBTaGFkaW5nT2JqLT5tX3BTaGFkaW5nLCAmbWF0cml4LCByZWN0LAorICAgICAgICAgICAgICBwU2hhZGluZ09iai0+bV9HZW5lcmFsU3RhdGUuR2V0QWxwaGEoRkFMU0UpLAorICAgICAgICAgICAgICBtX09wdGlvbnMubV9Db2xvck1vZGUgPT0gUkVOREVSX0NPTE9SX0FMUEhBKTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1zdGF0aWMgQ0ZYX0RJQml0bWFwKiBEcmF3UGF0dGVybkJpdG1hcChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcENhY2hlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9UaWxpbmdQYXR0ZXJuKiBwUGF0dGVybiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmbGFncykKLXsKLSAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOwotICAgIGlmICghcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIHBQYXR0ZXJuLT5tX2JDb2xvcmVkID8gRlhESUJfQXJnYiA6IEZYRElCXzhicHBNYXNrKSkgewotICAgICAgICBkZWxldGUgcEJpdG1hcDsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENGWF9GeGdlRGV2aWNlIGJpdG1hcF9kZXZpY2U7Ci0gICAgYml0bWFwX2RldmljZS5BdHRhY2gocEJpdG1hcCk7Ci0gICAgcEJpdG1hcC0+Q2xlYXIoMCk7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCBjZWxsX2Jib3ggPSBwUGF0dGVybi0+bV9CQm94OwotICAgIHBQYXR0ZXJuLT5tX1BhdHRlcm4yRm9ybS5UcmFuc2Zvcm1SZWN0KGNlbGxfYmJveCk7Ci0gICAgcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybVJlY3QoY2VsbF9iYm94KTsKLSAgICBDRlhfRmxvYXRSZWN0IGJpdG1hcF9yZWN0KDAuMGYsIDAuMGYsIChGWF9GTE9BVCl3aWR0aCwgKEZYX0ZMT0FUKWhlaWdodCk7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBtdEFkanVzdDsKLSAgICBtdEFkanVzdC5NYXRjaFJlY3QoYml0bWFwX3JlY3QsIGNlbGxfYmJveCk7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBtdFBhdHRlcm4yQml0bWFwID0gKnBPYmplY3QyRGV2aWNlOwotICAgIG10UGF0dGVybjJCaXRtYXAuQ29uY2F0KG10QWRqdXN0KTsKLSAgICBDUERGX1JlbmRlck9wdGlvbnMgb3B0aW9uczsKLSAgICBpZiAoIXBQYXR0ZXJuLT5tX2JDb2xvcmVkKSB7Ci0gICAgICAgIG9wdGlvbnMubV9Db2xvck1vZGUgPSBSRU5ERVJfQ09MT1JfQUxQSEE7Ci0gICAgfQotICAgIGZsYWdzIHw9IFJFTkRFUl9GT1JDRV9IQUxGVE9ORTsKLSAgICBvcHRpb25zLm1fRmxhZ3MgPSBmbGFnczsKLSAgICBDUERGX1JlbmRlckNvbnRleHQgY29udGV4dDsKLSAgICBjb250ZXh0LkNyZWF0ZShwRG9jLCBwQ2FjaGUsIE5VTEwpOwotICAgIGNvbnRleHQuRHJhd09iamVjdExpc3QoJmJpdG1hcF9kZXZpY2UsIHBQYXR0ZXJuLT5tX3BGb3JtLCAmbXRQYXR0ZXJuMkJpdG1hcCwgJm9wdGlvbnMpOwotICAgIHJldHVybiBwQml0bWFwOworc3RhdGljIENGWF9ESUJpdG1hcCogRHJhd1BhdHRlcm5CaXRtYXAoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1RpbGluZ1BhdHRlcm4qIHBQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKSB7CisgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7CisgIGlmICghcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIHBQYXR0ZXJuLT5tX2JDb2xvcmVkID8gRlhESUJfQXJnYiA6IEZYRElCXzhicHBNYXNrKSkgeworICAgIGRlbGV0ZSBwQml0bWFwOworICAgIHJldHVybiBOVUxMOworICB9CisgIENGWF9GeGdlRGV2aWNlIGJpdG1hcF9kZXZpY2U7CisgIGJpdG1hcF9kZXZpY2UuQXR0YWNoKHBCaXRtYXApOworICBwQml0bWFwLT5DbGVhcigwKTsKKyAgQ0ZYX0Zsb2F0UmVjdCBjZWxsX2Jib3ggPSBwUGF0dGVybi0+bV9CQm94OworICBwUGF0dGVybi0+bV9QYXR0ZXJuMkZvcm0uVHJhbnNmb3JtUmVjdChjZWxsX2Jib3gpOworICBwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtUmVjdChjZWxsX2Jib3gpOworICBDRlhfRmxvYXRSZWN0IGJpdG1hcF9yZWN0KDAuMGYsIDAuMGYsIChGWF9GTE9BVCl3aWR0aCwgKEZYX0ZMT0FUKWhlaWdodCk7CisgIENGWF9NYXRyaXggbXRBZGp1c3Q7CisgIG10QWRqdXN0Lk1hdGNoUmVjdChiaXRtYXBfcmVjdCwgY2VsbF9iYm94KTsKKyAgQ0ZYX01hdHJpeCBtdFBhdHRlcm4yQml0bWFwID0gKnBPYmplY3QyRGV2aWNlOworICBtdFBhdHRlcm4yQml0bWFwLkNvbmNhdChtdEFkanVzdCk7CisgIENQREZfUmVuZGVyT3B0aW9ucyBvcHRpb25zOworICBpZiAoIXBQYXR0ZXJuLT5tX2JDb2xvcmVkKSB7CisgICAgb3B0aW9ucy5tX0NvbG9yTW9kZSA9IFJFTkRFUl9DT0xPUl9BTFBIQTsKKyAgfQorICBmbGFncyB8PSBSRU5ERVJfRk9SQ0VfSEFMRlRPTkU7CisgIG9wdGlvbnMubV9GbGFncyA9IGZsYWdzOworICBDUERGX1JlbmRlckNvbnRleHQgY29udGV4dChwRG9jLCBwQ2FjaGUpOworICBjb250ZXh0LkRyYXdPYmplY3RMaXN0KCZiaXRtYXBfZGV2aWNlLCBwUGF0dGVybi0+bV9wRm9ybSwgJm10UGF0dGVybjJCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgJm9wdGlvbnMpOworICByZXR1cm4gcEJpdG1hcDsKIH0KLXZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdUaWxpbmdQYXR0ZXJuKENQREZfVGlsaW5nUGF0dGVybiogcFBhdHRlcm4sIENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBGWF9CT09MIGJTdHJva2UpCi17Ci0gICAgaWYgKCFwUGF0dGVybi0+TG9hZCgpKSB7Ci0gICAgICAgIHJldHVybjsKK3ZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdUaWxpbmdQYXR0ZXJuKENQREZfVGlsaW5nUGF0dGVybiogcFBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdHJva2UpIHsKKyAgaWYgKCFwUGF0dGVybi0+TG9hZCgpKSB7CisgICAgcmV0dXJuOworICB9CisgIG1fcERldmljZS0+U2F2ZVN0YXRlKCk7CisgIGlmIChwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfUEFUSCkgeworICAgIGlmICghU2VsZWN0Q2xpcFBhdGgoKENQREZfUGF0aE9iamVjdCopcFBhZ2VPYmosIHBPYmoyRGV2aWNlLCBiU3Ryb2tlKSkgeworICAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKKyAgICAgIHJldHVybjsKICAgICB9Ci0gICAgbV9wRGV2aWNlLT5TYXZlU3RhdGUoKTsKLSAgICBpZiAocFBhZ2VPYmotPm1fVHlwZSA9PSBQREZQQUdFX1BBVEgpIHsKLSAgICAgICAgaWYgKCFTZWxlY3RDbGlwUGF0aCgoQ1BERl9QYXRoT2JqZWN0KilwUGFnZU9iaiwgcE9iajJEZXZpY2UsIGJTdHJva2UpKSB7Ci0gICAgICAgICAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfSU1BR0UpIHsKLSAgICAgICAgRlhfUkVDVCByZWN0ID0gcFBhZ2VPYmotPkdldEJCb3gocE9iajJEZXZpY2UpOwotICAgICAgICBtX3BEZXZpY2UtPlNldENsaXBfUmVjdCgmcmVjdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9SRUNUIGNsaXBfYm94ID0gbV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7Ci0gICAgaWYgKGNsaXBfYm94LklzRW1wdHkoKSkgewotICAgICAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENGWF9NYXRyaXggZENUTSA9IG1fcERldmljZS0+R2V0Q1RNKCk7Ci0gICAgRlhfRkxPQVQgc2EgPSBGWFNZU19mYWJzKGRDVE0uYSk7Ci0gICAgRlhfRkxPQVQgc2QgPSBGWFNZU19mYWJzKGRDVE0uZCk7Ci0gICAgY2xpcF9ib3gucmlnaHQgPSBjbGlwX2JveC5sZWZ0ICsgKEZYX0lOVDMyKUZYU1lTX2NlaWwoY2xpcF9ib3guV2lkdGgoKSAqIHNhKTsKLSAgICBjbGlwX2JveC5ib3R0b20gPSBjbGlwX2JveC50b3AgKyAoRlhfSU5UMzIpRlhTWVNfY2VpbChjbGlwX2JveC5IZWlnaHQoKSAqIHNkKTsKLSAgICBDRlhfQWZmaW5lTWF0cml4IG10UGF0dGVybjJEZXZpY2UgPSBwUGF0dGVybi0+bV9QYXR0ZXJuMkZvcm07Ci0gICAgbXRQYXR0ZXJuMkRldmljZS5Db25jYXQoKnBPYmoyRGV2aWNlKTsKLSAgICBHZXRTY2FsZWRNYXRyaXgobXRQYXR0ZXJuMkRldmljZSk7Ci0gICAgRlhfQk9PTCBiQWxpZ25lZCA9IEZBTFNFOwotICAgIGlmIChwUGF0dGVybi0+bV9CQm94LmxlZnQgPT0gMCAmJiBwUGF0dGVybi0+bV9CQm94LmJvdHRvbSA9PSAwICYmCi0gICAgICAgICAgICBwUGF0dGVybi0+bV9CQm94LnJpZ2h0ID09IHBQYXR0ZXJuLT5tX1hTdGVwICYmIHBQYXR0ZXJuLT5tX0JCb3gudG9wID09IHBQYXR0ZXJuLT5tX1lTdGVwICYmCi0gICAgICAgICAgICAobXRQYXR0ZXJuMkRldmljZS5Jc1NjYWxlZCgpIHx8IG10UGF0dGVybjJEZXZpY2UuSXM5MFJvdGF0ZWQoKSkpIHsKLSAgICAgICAgYkFsaWduZWQgPSBUUlVFOwotICAgIH0KLSAgICBDRlhfRmxvYXRSZWN0IGNlbGxfYmJveCA9IHBQYXR0ZXJuLT5tX0JCb3g7Ci0gICAgbXRQYXR0ZXJuMkRldmljZS5UcmFuc2Zvcm1SZWN0KGNlbGxfYmJveCk7Ci0gICAgaW50IHdpZHRoID0gKGludClGWFNZU19jZWlsKGNlbGxfYmJveC5XaWR0aCgpKTsKLSAgICBpbnQgaGVpZ2h0ID0gKGludClGWFNZU19jZWlsKGNlbGxfYmJveC5IZWlnaHQoKSk7Ci0gICAgaWYgKHdpZHRoID09IDApIHsKLSAgICAgICAgd2lkdGggPSAxOwotICAgIH0KLSAgICBpZiAoaGVpZ2h0ID09IDApIHsKLSAgICAgICAgaGVpZ2h0ID0gMTsKLSAgICB9Ci0gICAgaW50IG1pbl9jb2wsIG1heF9jb2wsIG1pbl9yb3csIG1heF9yb3c7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBtdERldmljZTJQYXR0ZXJuOwotICAgIG10RGV2aWNlMlBhdHRlcm4uU2V0UmV2ZXJzZShtdFBhdHRlcm4yRGV2aWNlKTsKLSAgICBDRlhfRmxvYXRSZWN0IGNsaXBfYm94X3AoY2xpcF9ib3gpOwotICAgIGNsaXBfYm94X3AuVHJhbnNmb3JtKCZtdERldmljZTJQYXR0ZXJuKTsKLSAgICBtaW5fY29sID0gKGludClGWFNZU19jZWlsKEZYU1lTX0RpdihjbGlwX2JveF9wLmxlZnQgLSBwUGF0dGVybi0+bV9CQm94LnJpZ2h0LCBwUGF0dGVybi0+bV9YU3RlcCkpOwotICAgIG1heF9jb2wgPSAoaW50KUZYU1lTX2Zsb29yKEZYU1lTX0RpdihjbGlwX2JveF9wLnJpZ2h0IC0gcFBhdHRlcm4tPm1fQkJveC5sZWZ0LCBwUGF0dGVybi0+bV9YU3RlcCkpOwotICAgIG1pbl9yb3cgPSAoaW50KUZYU1lTX2NlaWwoRlhTWVNfRGl2KGNsaXBfYm94X3AuYm90dG9tIC0gcFBhdHRlcm4tPm1fQkJveC50b3AsIHBQYXR0ZXJuLT5tX1lTdGVwKSk7Ci0gICAgbWF4X3JvdyA9IChpbnQpRlhTWVNfZmxvb3IoRlhTWVNfRGl2KGNsaXBfYm94X3AudG9wIC0gcFBhdHRlcm4tPm1fQkJveC5ib3R0b20sIHBQYXR0ZXJuLT5tX1lTdGVwKSk7Ci0gICAgaWYgKHdpZHRoID4gY2xpcF9ib3guV2lkdGgoKSB8fCBoZWlnaHQgPiBjbGlwX2JveC5IZWlnaHQoKSB8fCB3aWR0aCAqIGhlaWdodCA+IGNsaXBfYm94LldpZHRoKCkgKiBjbGlwX2JveC5IZWlnaHQoKSkgewotICAgICAgICBDUERGX0dyYXBoaWNTdGF0ZXMqIHBTdGF0ZXMgPSBOVUxMOwotICAgICAgICBpZiAoIXBQYXR0ZXJuLT5tX2JDb2xvcmVkKSB7Ci0gICAgICAgICAgICBwU3RhdGVzID0gQ2xvbmVPYmpTdGF0ZXMocFBhZ2VPYmosIGJTdHJva2UpOwotICAgICAgICB9Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSA9IE5VTEw7Ci0gICAgICAgIGlmIChwUGF0dGVybi0+bV9wRm9ybS0+bV9wRm9ybURpY3QpIHsKLSAgICAgICAgICAgIHBGb3JtUmVzb3VyY2UgPSBwUGF0dGVybi0+bV9wRm9ybS0+bV9wRm9ybURpY3QtPkdldERpY3QoRlhfQlNUUkMoIlJlc291cmNlcyIpKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBjb2wgPSBtaW5fY29sOyBjb2wgPD0gbWF4X2NvbDsgY29sICsrKQotICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gbWluX3Jvdzsgcm93IDw9IG1heF9yb3c7IHJvdyArKykgewotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG9yaWdfeCwgb3JpZ195OwotICAgICAgICAgICAgICAgIG9yaWdfeCA9IGNvbCAqIHBQYXR0ZXJuLT5tX1hTdGVwOwotICAgICAgICAgICAgICAgIG9yaWdfeSA9IHJvdyAqIHBQYXR0ZXJuLT5tX1lTdGVwOwotICAgICAgICAgICAgICAgIG10UGF0dGVybjJEZXZpY2UuVHJhbnNmb3JtKG9yaWdfeCwgb3JpZ195KTsKLSAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeCA9ICpwT2JqMkRldmljZTsKLSAgICAgICAgICAgICAgICBtYXRyaXguVHJhbnNsYXRlKG9yaWdfeCAtIG10UGF0dGVybjJEZXZpY2UuZSwgb3JpZ195IC0gbXRQYXR0ZXJuMkRldmljZS5mKTsKLSAgICAgICAgICAgICAgICBtX3BEZXZpY2UtPlNhdmVTdGF0ZSgpOwotICAgICAgICAgICAgICAgIENQREZfUmVuZGVyU3RhdHVzIHN0YXR1czsKLSAgICAgICAgICAgICAgICBzdGF0dXMuSW5pdGlhbGl6ZShtX3BDb250ZXh0LCBtX3BEZXZpY2UsIE5VTEwsIE5VTEwsIHRoaXMsIHBTdGF0ZXMsICZtX09wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhdHRlcm4tPm1fcEZvcm0tPm1fVHJhbnNwYXJlbmN5LCBtX2JEcm9wT2JqZWN0cywgcEZvcm1SZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLlJlbmRlck9iamVjdExpc3QocFBhdHRlcm4tPm1fcEZvcm0sICZtYXRyaXgpOwotICAgICAgICAgICAgICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKCk7Ci0gICAgICAgIGlmIChwU3RhdGVzKSB7Ci0gICAgICAgICAgICBkZWxldGUgcFN0YXRlczsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChiQWxpZ25lZCkgewotICAgICAgICBpbnQgb3JpZ194ID0gRlhTWVNfcm91bmQobXRQYXR0ZXJuMkRldmljZS5lKTsKLSAgICAgICAgaW50IG9yaWdfeSA9IEZYU1lTX3JvdW5kKG10UGF0dGVybjJEZXZpY2UuZik7Ci0gICAgICAgIG1pbl9jb2wgPSAoY2xpcF9ib3gubGVmdCAtIG9yaWdfeCkgLyB3aWR0aDsKLSAgICAgICAgaWYgKGNsaXBfYm94LmxlZnQgPCBvcmlnX3gpIHsKLSAgICAgICAgICAgIG1pbl9jb2wgLS07Ci0gICAgICAgIH0KLSAgICAgICAgbWF4X2NvbCA9IChjbGlwX2JveC5yaWdodCAtIG9yaWdfeCkgLyB3aWR0aDsKLSAgICAgICAgaWYgKGNsaXBfYm94LnJpZ2h0IDw9IG9yaWdfeCkgewotICAgICAgICAgICAgbWF4X2NvbCAtLTsKLSAgICAgICAgfQotICAgICAgICBtaW5fcm93ID0gKGNsaXBfYm94LnRvcCAtIG9yaWdfeSkgLyBoZWlnaHQ7Ci0gICAgICAgIGlmIChjbGlwX2JveC50b3AgPCBvcmlnX3kpIHsKLSAgICAgICAgICAgIG1pbl9yb3cgLS07Ci0gICAgICAgIH0KLSAgICAgICAgbWF4X3JvdyA9IChjbGlwX2JveC5ib3R0b20gLSBvcmlnX3kpIC8gaGVpZ2h0OwotICAgICAgICBpZiAoY2xpcF9ib3guYm90dG9tIDw9IG9yaWdfeSkgewotICAgICAgICAgICAgbWF4X3JvdyAtLTsKLSAgICAgICAgfQotICAgIH0KLSAgICBGWF9GTE9BVCBsZWZ0X29mZnNldCA9IGNlbGxfYmJveC5sZWZ0IC0gbXRQYXR0ZXJuMkRldmljZS5lOwotICAgIEZYX0ZMT0FUIHRvcF9vZmZzZXQgPSBjZWxsX2Jib3guYm90dG9tIC0gbXRQYXR0ZXJuMkRldmljZS5mOwotICAgIENGWF9ESUJpdG1hcCogcFBhdHRlcm5CaXRtYXAgPSBOVUxMOwotICAgIGlmICh3aWR0aCAqIGhlaWdodCA8IDE2KSB7Ci0gICAgICAgIENGWF9ESUJpdG1hcCogcEVubGFyZ2VkQml0bWFwID0gRHJhd1BhdHRlcm5CaXRtYXAobV9wQ29udGV4dC0+bV9wRG9jdW1lbnQsIG1fcENvbnRleHQtPm1fcFBhZ2VDYWNoZSwgcFBhdHRlcm4sIHBPYmoyRGV2aWNlLCA4LCA4LCBtX09wdGlvbnMubV9GbGFncyk7Ci0gICAgICAgIHBQYXR0ZXJuQml0bWFwID0gcEVubGFyZ2VkQml0bWFwLT5TdHJldGNoVG8od2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIGRlbGV0ZSBwRW5sYXJnZWRCaXRtYXA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcFBhdHRlcm5CaXRtYXAgPSBEcmF3UGF0dGVybkJpdG1hcChtX3BDb250ZXh0LT5tX3BEb2N1bWVudCwgbV9wQ29udGV4dC0+bV9wUGFnZUNhY2hlLCBwUGF0dGVybiwgcE9iajJEZXZpY2UsIHdpZHRoLCBoZWlnaHQsIG1fT3B0aW9ucy5tX0ZsYWdzKTsKLSAgICB9Ci0gICAgaWYgKHBQYXR0ZXJuQml0bWFwID09IE5VTEwpIHsKLSAgICAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobV9PcHRpb25zLm1fQ29sb3JNb2RlID09IFJFTkRFUl9DT0xPUl9HUkFZKSB7Ci0gICAgICAgIHBQYXR0ZXJuQml0bWFwLT5Db252ZXJ0Q29sb3JTY2FsZShtX09wdGlvbnMubV9Gb3JlQ29sb3IsIG1fT3B0aW9ucy5tX0JhY2tDb2xvcik7Ci0gICAgfQotICAgIEZYX0FSR0IgZmlsbF9hcmdiID0gR2V0RmlsbEFyZ2IocFBhZ2VPYmopOwotICAgIGludCBjbGlwX3dpZHRoID0gY2xpcF9ib3gucmlnaHQgLSBjbGlwX2JveC5sZWZ0OwotICAgIGludCBjbGlwX2hlaWdodCA9IGNsaXBfYm94LmJvdHRvbSAtIGNsaXBfYm94LnRvcDsKLSAgICBDRlhfRElCaXRtYXAgc2NyZWVuOwotICAgIGlmICghc2NyZWVuLkNyZWF0ZShjbGlwX3dpZHRoLCBjbGlwX2hlaWdodCwgRlhESUJfQXJnYikpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzY3JlZW4uQ2xlYXIoMCk7Ci0gICAgRlhfRFdPUkQqIHNyY19idWYgPSAoRlhfRFdPUkQqKXBQYXR0ZXJuQml0bWFwLT5HZXRCdWZmZXIoKTsKLSAgICBmb3IgKGludCBjb2wgPSBtaW5fY29sOyBjb2wgPD0gbWF4X2NvbDsgY29sICsrKSB7Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IG1pbl9yb3c7IHJvdyA8PSBtYXhfcm93OyByb3cgKyspIHsKLSAgICAgICAgICAgIGludCBzdGFydF94LCBzdGFydF95OwotICAgICAgICAgICAgaWYgKGJBbGlnbmVkKSB7Ci0gICAgICAgICAgICAgICAgc3RhcnRfeCA9IEZYU1lTX3JvdW5kKG10UGF0dGVybjJEZXZpY2UuZSkgKyBjb2wgKiB3aWR0aCAtIGNsaXBfYm94LmxlZnQ7Ci0gICAgICAgICAgICAgICAgc3RhcnRfeSA9IEZYU1lTX3JvdW5kKG10UGF0dGVybjJEZXZpY2UuZikgKyByb3cgKiBoZWlnaHQgLSBjbGlwX2JveC50b3A7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG9yaWdfeCA9IGNvbCAqIHBQYXR0ZXJuLT5tX1hTdGVwOwotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG9yaWdfeSA9IHJvdyAqIHBQYXR0ZXJuLT5tX1lTdGVwOwotICAgICAgICAgICAgICAgIG10UGF0dGVybjJEZXZpY2UuVHJhbnNmb3JtKG9yaWdfeCwgb3JpZ195KTsKLSAgICAgICAgICAgICAgICBzdGFydF94ID0gRlhTWVNfcm91bmQob3JpZ194ICsgbGVmdF9vZmZzZXQpIC0gY2xpcF9ib3gubGVmdDsKLSAgICAgICAgICAgICAgICBzdGFydF95ID0gRlhTWVNfcm91bmQob3JpZ195ICsgdG9wX29mZnNldCkgLSBjbGlwX2JveC50b3A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAod2lkdGggPT0gMSAmJiBoZWlnaHQgPT0gMSkgewotICAgICAgICAgICAgICAgIGlmIChzdGFydF94IDwgMCB8fCBzdGFydF94ID49IGNsaXBfYm94LldpZHRoKCkgfHwgc3RhcnRfeSA8IDAgfHwgc3RhcnRfeSA+PSBjbGlwX2JveC5IZWlnaHQoKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhfRFdPUkQqIGRlc3RfYnVmID0gKEZYX0RXT1JEKikoc2NyZWVuLkdldEJ1ZmZlcigpICsgc2NyZWVuLkdldFBpdGNoKCkgKiBzdGFydF95ICsgc3RhcnRfeCAqIDQpOwotICAgICAgICAgICAgICAgIGlmIChwUGF0dGVybi0+bV9iQ29sb3JlZCkgewotICAgICAgICAgICAgICAgICAgICAqZGVzdF9idWYgPSAqc3JjX2J1ZjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAqZGVzdF9idWYgPSAoKihGWF9MUEJZVEUpc3JjX2J1ZiA8PCAyNCkgfCAoZmlsbF9hcmdiICYgMHhmZmZmZmYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBQYXR0ZXJuLT5tX2JDb2xvcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjcmVlbi5Db21wb3NpdGVCaXRtYXAoc3RhcnRfeCwgc3RhcnRfeSwgd2lkdGgsIGhlaWdodCwgcFBhdHRlcm5CaXRtYXAsIDAsIDApOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjcmVlbi5Db21wb3NpdGVNYXNrKHN0YXJ0X3gsIHN0YXJ0X3ksIHdpZHRoLCBoZWlnaHQsIHBQYXR0ZXJuQml0bWFwLCBmaWxsX2FyZ2IsIDAsIDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBDb21wb3NpdGVESUJpdG1hcCgmc2NyZWVuLCBjbGlwX2JveC5sZWZ0LCBjbGlwX2JveC50b3AsIDAsIDI1NSwgRlhESUJfQkxFTkRfTk9STUFMLCBGQUxTRSk7CisgIH0gZWxzZSBpZiAocFBhZ2VPYmotPm1fVHlwZSA9PSBQREZQQUdFX0lNQUdFKSB7CisgICAgRlhfUkVDVCByZWN0ID0gcFBhZ2VPYmotPkdldEJCb3gocE9iajJEZXZpY2UpOworICAgIG1fcERldmljZS0+U2V0Q2xpcF9SZWN0KCZyZWN0KTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfUkVDVCBjbGlwX2JveCA9IG1fcERldmljZS0+R2V0Q2xpcEJveCgpOworICBpZiAoY2xpcF9ib3guSXNFbXB0eSgpKSB7CiAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKLSAgICBkZWxldGUgcFBhdHRlcm5CaXRtYXA7Ci19Ci12b2lkIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3UGF0aFdpdGhQYXR0ZXJuKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBDUERGX0NvbG9yKiBwQ29sb3IsIEZYX0JPT0wgYlN0cm9rZSkKLXsKLSAgICBDUERGX1BhdHRlcm4qIHBhdHRlcm4gPSBwQ29sb3ItPkdldFBhdHRlcm4oKTsKLSAgICBpZiAocGF0dGVybiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICByZXR1cm47CisgIH0KKyAgQ0ZYX01hdHJpeCBkQ1RNID0gbV9wRGV2aWNlLT5HZXRDVE0oKTsKKyAgRlhfRkxPQVQgc2EgPSBGWFNZU19mYWJzKGRDVE0uYSk7CisgIEZYX0ZMT0FUIHNkID0gRlhTWVNfZmFicyhkQ1RNLmQpOworICBjbGlwX2JveC5yaWdodCA9IGNsaXBfYm94LmxlZnQgKyAoaW50MzJfdClGWFNZU19jZWlsKGNsaXBfYm94LldpZHRoKCkgKiBzYSk7CisgIGNsaXBfYm94LmJvdHRvbSA9IGNsaXBfYm94LnRvcCArIChpbnQzMl90KUZYU1lTX2NlaWwoY2xpcF9ib3guSGVpZ2h0KCkgKiBzZCk7CisgIENGWF9NYXRyaXggbXRQYXR0ZXJuMkRldmljZSA9IHBQYXR0ZXJuLT5tX1BhdHRlcm4yRm9ybTsKKyAgbXRQYXR0ZXJuMkRldmljZS5Db25jYXQoKnBPYmoyRGV2aWNlKTsKKyAgR2V0U2NhbGVkTWF0cml4KG10UGF0dGVybjJEZXZpY2UpOworICBGWF9CT09MIGJBbGlnbmVkID0gRkFMU0U7CisgIGlmIChwUGF0dGVybi0+bV9CQm94LmxlZnQgPT0gMCAmJiBwUGF0dGVybi0+bV9CQm94LmJvdHRvbSA9PSAwICYmCisgICAgICBwUGF0dGVybi0+bV9CQm94LnJpZ2h0ID09IHBQYXR0ZXJuLT5tX1hTdGVwICYmCisgICAgICBwUGF0dGVybi0+bV9CQm94LnRvcCA9PSBwUGF0dGVybi0+bV9ZU3RlcCAmJgorICAgICAgKG10UGF0dGVybjJEZXZpY2UuSXNTY2FsZWQoKSB8fCBtdFBhdHRlcm4yRGV2aWNlLklzOTBSb3RhdGVkKCkpKSB7CisgICAgYkFsaWduZWQgPSBUUlVFOworICB9CisgIENGWF9GbG9hdFJlY3QgY2VsbF9iYm94ID0gcFBhdHRlcm4tPm1fQkJveDsKKyAgbXRQYXR0ZXJuMkRldmljZS5UcmFuc2Zvcm1SZWN0KGNlbGxfYmJveCk7CisgIGludCB3aWR0aCA9IChpbnQpRlhTWVNfY2VpbChjZWxsX2Jib3guV2lkdGgoKSk7CisgIGludCBoZWlnaHQgPSAoaW50KUZYU1lTX2NlaWwoY2VsbF9iYm94LkhlaWdodCgpKTsKKyAgaWYgKHdpZHRoID09IDApIHsKKyAgICB3aWR0aCA9IDE7CisgIH0KKyAgaWYgKGhlaWdodCA9PSAwKSB7CisgICAgaGVpZ2h0ID0gMTsKKyAgfQorICBpbnQgbWluX2NvbCwgbWF4X2NvbCwgbWluX3JvdywgbWF4X3JvdzsKKyAgQ0ZYX01hdHJpeCBtdERldmljZTJQYXR0ZXJuOworICBtdERldmljZTJQYXR0ZXJuLlNldFJldmVyc2UobXRQYXR0ZXJuMkRldmljZSk7CisgIENGWF9GbG9hdFJlY3QgY2xpcF9ib3hfcChjbGlwX2JveCk7CisgIGNsaXBfYm94X3AuVHJhbnNmb3JtKCZtdERldmljZTJQYXR0ZXJuKTsKKyAgbWluX2NvbCA9IChpbnQpRlhTWVNfY2VpbCgKKyAgICAgIEZYU1lTX0RpdihjbGlwX2JveF9wLmxlZnQgLSBwUGF0dGVybi0+bV9CQm94LnJpZ2h0LCBwUGF0dGVybi0+bV9YU3RlcCkpOworICBtYXhfY29sID0gKGludClGWFNZU19mbG9vcigKKyAgICAgIEZYU1lTX0RpdihjbGlwX2JveF9wLnJpZ2h0IC0gcFBhdHRlcm4tPm1fQkJveC5sZWZ0LCBwUGF0dGVybi0+bV9YU3RlcCkpOworICBtaW5fcm93ID0gKGludClGWFNZU19jZWlsKAorICAgICAgRlhTWVNfRGl2KGNsaXBfYm94X3AuYm90dG9tIC0gcFBhdHRlcm4tPm1fQkJveC50b3AsIHBQYXR0ZXJuLT5tX1lTdGVwKSk7CisgIG1heF9yb3cgPSAoaW50KUZYU1lTX2Zsb29yKAorICAgICAgRlhTWVNfRGl2KGNsaXBfYm94X3AudG9wIC0gcFBhdHRlcm4tPm1fQkJveC5ib3R0b20sIHBQYXR0ZXJuLT5tX1lTdGVwKSk7CisgIGlmICh3aWR0aCA+IGNsaXBfYm94LldpZHRoKCkgfHwgaGVpZ2h0ID4gY2xpcF9ib3guSGVpZ2h0KCkgfHwKKyAgICAgIHdpZHRoICogaGVpZ2h0ID4gY2xpcF9ib3guV2lkdGgoKSAqIGNsaXBfYm94LkhlaWdodCgpKSB7CisgICAgQ1BERl9HcmFwaGljU3RhdGVzKiBwU3RhdGVzID0gTlVMTDsKKyAgICBpZiAoIXBQYXR0ZXJuLT5tX2JDb2xvcmVkKSB7CisgICAgICBwU3RhdGVzID0gQ2xvbmVPYmpTdGF0ZXMocFBhZ2VPYmosIGJTdHJva2UpOwogICAgIH0KLSAgICBpZihwYXR0ZXJuLT5tX1BhdHRlcm5UeXBlID09IFBBVFRFUk5fVElMSU5HKSB7Ci0gICAgICAgIERyYXdUaWxpbmdQYXR0ZXJuKChDUERGX1RpbGluZ1BhdHRlcm4qKXBhdHRlcm4sIHBQYXRoT2JqLCBwT2JqMkRldmljZSwgYlN0cm9rZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRHJhd1NoYWRpbmdQYXR0ZXJuKChDUERGX1NoYWRpbmdQYXR0ZXJuKilwYXR0ZXJuLCBwUGF0aE9iaiwgcE9iajJEZXZpY2UsIGJTdHJva2UpOworICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSA9IE5VTEw7CisgICAgaWYgKHBQYXR0ZXJuLT5tX3BGb3JtLT5tX3BGb3JtRGljdCkgeworICAgICAgcEZvcm1SZXNvdXJjZSA9IHBQYXR0ZXJuLT5tX3BGb3JtLT5tX3BGb3JtRGljdC0+R2V0RGljdCgiUmVzb3VyY2VzIik7CiAgICAgfQotfQotdm9pZCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc1BhdGhQYXR0ZXJuKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBpbnQmIGZpbGx0eXBlLCBGWF9CT09MJiBiU3Ryb2tlKQotewotICAgIGlmKGZpbGx0eXBlKSB7Ci0gICAgICAgIENQREZfQ29sb3ImIEZpbGxDb2xvciA9ICpwUGF0aE9iai0+bV9Db2xvclN0YXRlLkdldEZpbGxDb2xvcigpOwotICAgICAgICBpZihGaWxsQ29sb3IubV9wQ1MgJiYgRmlsbENvbG9yLm1fcENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19QQVRURVJOKSB7Ci0gICAgICAgICAgICBEcmF3UGF0aFdpdGhQYXR0ZXJuKHBQYXRoT2JqLCBwT2JqMkRldmljZSwgJkZpbGxDb2xvciwgRkFMU0UpOwotICAgICAgICAgICAgZmlsbHR5cGUgPSAwOworICAgIGZvciAoaW50IGNvbCA9IG1pbl9jb2w7IGNvbCA8PSBtYXhfY29sOyBjb2wrKykKKyAgICAgIGZvciAoaW50IHJvdyA9IG1pbl9yb3c7IHJvdyA8PSBtYXhfcm93OyByb3crKykgeworICAgICAgICBGWF9GTE9BVCBvcmlnX3gsIG9yaWdfeTsKKyAgICAgICAgb3JpZ194ID0gY29sICogcFBhdHRlcm4tPm1fWFN0ZXA7CisgICAgICAgIG9yaWdfeSA9IHJvdyAqIHBQYXR0ZXJuLT5tX1lTdGVwOworICAgICAgICBtdFBhdHRlcm4yRGV2aWNlLlRyYW5zZm9ybShvcmlnX3gsIG9yaWdfeSk7CisgICAgICAgIENGWF9NYXRyaXggbWF0cml4ID0gKnBPYmoyRGV2aWNlOworICAgICAgICBtYXRyaXguVHJhbnNsYXRlKG9yaWdfeCAtIG10UGF0dGVybjJEZXZpY2UuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnX3kgLSBtdFBhdHRlcm4yRGV2aWNlLmYpOworICAgICAgICBtX3BEZXZpY2UtPlNhdmVTdGF0ZSgpOworICAgICAgICBDUERGX1JlbmRlclN0YXR1cyBzdGF0dXM7CisgICAgICAgIHN0YXR1cy5Jbml0aWFsaXplKG1fcENvbnRleHQsIG1fcERldmljZSwgTlVMTCwgTlVMTCwgdGhpcywgcFN0YXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fT3B0aW9ucywgcFBhdHRlcm4tPm1fcEZvcm0tPm1fVHJhbnNwYXJlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JEcm9wT2JqZWN0cywgcEZvcm1SZXNvdXJjZSk7CisgICAgICAgIHN0YXR1cy5SZW5kZXJPYmplY3RMaXN0KHBQYXR0ZXJuLT5tX3BGb3JtLCAmbWF0cml4KTsKKyAgICAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKKyAgICAgIH0KKyAgICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOworICAgIGRlbGV0ZSBwU3RhdGVzOworICAgIHJldHVybjsKKyAgfQorICBpZiAoYkFsaWduZWQpIHsKKyAgICBpbnQgb3JpZ194ID0gRlhTWVNfcm91bmQobXRQYXR0ZXJuMkRldmljZS5lKTsKKyAgICBpbnQgb3JpZ195ID0gRlhTWVNfcm91bmQobXRQYXR0ZXJuMkRldmljZS5mKTsKKyAgICBtaW5fY29sID0gKGNsaXBfYm94LmxlZnQgLSBvcmlnX3gpIC8gd2lkdGg7CisgICAgaWYgKGNsaXBfYm94LmxlZnQgPCBvcmlnX3gpIHsKKyAgICAgIG1pbl9jb2wtLTsKKyAgICB9CisgICAgbWF4X2NvbCA9IChjbGlwX2JveC5yaWdodCAtIG9yaWdfeCkgLyB3aWR0aDsKKyAgICBpZiAoY2xpcF9ib3gucmlnaHQgPD0gb3JpZ194KSB7CisgICAgICBtYXhfY29sLS07CisgICAgfQorICAgIG1pbl9yb3cgPSAoY2xpcF9ib3gudG9wIC0gb3JpZ195KSAvIGhlaWdodDsKKyAgICBpZiAoY2xpcF9ib3gudG9wIDwgb3JpZ195KSB7CisgICAgICBtaW5fcm93LS07CisgICAgfQorICAgIG1heF9yb3cgPSAoY2xpcF9ib3guYm90dG9tIC0gb3JpZ195KSAvIGhlaWdodDsKKyAgICBpZiAoY2xpcF9ib3guYm90dG9tIDw9IG9yaWdfeSkgeworICAgICAgbWF4X3Jvdy0tOworICAgIH0KKyAgfQorICBGWF9GTE9BVCBsZWZ0X29mZnNldCA9IGNlbGxfYmJveC5sZWZ0IC0gbXRQYXR0ZXJuMkRldmljZS5lOworICBGWF9GTE9BVCB0b3Bfb2Zmc2V0ID0gY2VsbF9iYm94LmJvdHRvbSAtIG10UGF0dGVybjJEZXZpY2UuZjsKKyAgQ0ZYX0RJQml0bWFwKiBwUGF0dGVybkJpdG1hcCA9IE5VTEw7CisgIGlmICh3aWR0aCAqIGhlaWdodCA8IDE2KSB7CisgICAgQ0ZYX0RJQml0bWFwKiBwRW5sYXJnZWRCaXRtYXAgPQorICAgICAgICBEcmF3UGF0dGVybkJpdG1hcChtX3BDb250ZXh0LT5tX3BEb2N1bWVudCwgbV9wQ29udGV4dC0+bV9wUGFnZUNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwUGF0dGVybiwgcE9iajJEZXZpY2UsIDgsIDgsIG1fT3B0aW9ucy5tX0ZsYWdzKTsKKyAgICBwUGF0dGVybkJpdG1hcCA9IHBFbmxhcmdlZEJpdG1hcC0+U3RyZXRjaFRvKHdpZHRoLCBoZWlnaHQpOworICAgIGRlbGV0ZSBwRW5sYXJnZWRCaXRtYXA7CisgIH0gZWxzZSB7CisgICAgcFBhdHRlcm5CaXRtYXAgPSBEcmF3UGF0dGVybkJpdG1hcCgKKyAgICAgICAgbV9wQ29udGV4dC0+bV9wRG9jdW1lbnQsIG1fcENvbnRleHQtPm1fcFBhZ2VDYWNoZSwgcFBhdHRlcm4sCisgICAgICAgIHBPYmoyRGV2aWNlLCB3aWR0aCwgaGVpZ2h0LCBtX09wdGlvbnMubV9GbGFncyk7CisgIH0KKyAgaWYgKCFwUGF0dGVybkJpdG1hcCkgeworICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX09wdGlvbnMubV9Db2xvck1vZGUgPT0gUkVOREVSX0NPTE9SX0dSQVkpIHsKKyAgICBwUGF0dGVybkJpdG1hcC0+Q29udmVydENvbG9yU2NhbGUobV9PcHRpb25zLm1fRm9yZUNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX09wdGlvbnMubV9CYWNrQ29sb3IpOworICB9CisgIEZYX0FSR0IgZmlsbF9hcmdiID0gR2V0RmlsbEFyZ2IocFBhZ2VPYmopOworICBpbnQgY2xpcF93aWR0aCA9IGNsaXBfYm94LnJpZ2h0IC0gY2xpcF9ib3gubGVmdDsKKyAgaW50IGNsaXBfaGVpZ2h0ID0gY2xpcF9ib3guYm90dG9tIC0gY2xpcF9ib3gudG9wOworICBDRlhfRElCaXRtYXAgc2NyZWVuOworICBpZiAoIXNjcmVlbi5DcmVhdGUoY2xpcF93aWR0aCwgY2xpcF9oZWlnaHQsIEZYRElCX0FyZ2IpKSB7CisgICAgcmV0dXJuOworICB9CisgIHNjcmVlbi5DbGVhcigwKTsKKyAgRlhfRFdPUkQqIHNyY19idWYgPSAoRlhfRFdPUkQqKXBQYXR0ZXJuQml0bWFwLT5HZXRCdWZmZXIoKTsKKyAgZm9yIChpbnQgY29sID0gbWluX2NvbDsgY29sIDw9IG1heF9jb2w7IGNvbCsrKSB7CisgICAgZm9yIChpbnQgcm93ID0gbWluX3Jvdzsgcm93IDw9IG1heF9yb3c7IHJvdysrKSB7CisgICAgICBpbnQgc3RhcnRfeCwgc3RhcnRfeTsKKyAgICAgIGlmIChiQWxpZ25lZCkgeworICAgICAgICBzdGFydF94ID0gRlhTWVNfcm91bmQobXRQYXR0ZXJuMkRldmljZS5lKSArIGNvbCAqIHdpZHRoIC0gY2xpcF9ib3gubGVmdDsKKyAgICAgICAgc3RhcnRfeSA9IEZYU1lTX3JvdW5kKG10UGF0dGVybjJEZXZpY2UuZikgKyByb3cgKiBoZWlnaHQgLSBjbGlwX2JveC50b3A7CisgICAgICB9IGVsc2UgeworICAgICAgICBGWF9GTE9BVCBvcmlnX3ggPSBjb2wgKiBwUGF0dGVybi0+bV9YU3RlcDsKKyAgICAgICAgRlhfRkxPQVQgb3JpZ195ID0gcm93ICogcFBhdHRlcm4tPm1fWVN0ZXA7CisgICAgICAgIG10UGF0dGVybjJEZXZpY2UuVHJhbnNmb3JtKG9yaWdfeCwgb3JpZ195KTsKKyAgICAgICAgc3RhcnRfeCA9IEZYU1lTX3JvdW5kKG9yaWdfeCArIGxlZnRfb2Zmc2V0KSAtIGNsaXBfYm94LmxlZnQ7CisgICAgICAgIHN0YXJ0X3kgPSBGWFNZU19yb3VuZChvcmlnX3kgKyB0b3Bfb2Zmc2V0KSAtIGNsaXBfYm94LnRvcDsKKyAgICAgIH0KKyAgICAgIGlmICh3aWR0aCA9PSAxICYmIGhlaWdodCA9PSAxKSB7CisgICAgICAgIGlmIChzdGFydF94IDwgMCB8fCBzdGFydF94ID49IGNsaXBfYm94LldpZHRoKCkgfHwgc3RhcnRfeSA8IDAgfHwKKyAgICAgICAgICAgIHN0YXJ0X3kgPj0gY2xpcF9ib3guSGVpZ2h0KCkpIHsKKyAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgIH0KLSAgICBpZihiU3Ryb2tlKSB7Ci0gICAgICAgIENQREZfQ29sb3ImIFN0cm9rZUNvbG9yID0gKnBQYXRoT2JqLT5tX0NvbG9yU3RhdGUuR2V0U3Ryb2tlQ29sb3IoKTsKLSAgICAgICAgaWYoU3Ryb2tlQ29sb3IubV9wQ1MgJiYgU3Ryb2tlQ29sb3IubV9wQ1MtPkdldEZhbWlseSgpID09IFBERkNTX1BBVFRFUk4pIHsKLSAgICAgICAgICAgIERyYXdQYXRoV2l0aFBhdHRlcm4ocFBhdGhPYmosIHBPYmoyRGV2aWNlLCAmU3Ryb2tlQ29sb3IsIFRSVUUpOwotICAgICAgICAgICAgYlN0cm9rZSA9IEZBTFNFOworICAgICAgICBGWF9EV09SRCogZGVzdF9idWYgPQorICAgICAgICAgICAgKEZYX0RXT1JEKikoc2NyZWVuLkdldEJ1ZmZlcigpICsgc2NyZWVuLkdldFBpdGNoKCkgKiBzdGFydF95ICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3ggKiA0KTsKKyAgICAgICAgaWYgKHBQYXR0ZXJuLT5tX2JDb2xvcmVkKSB7CisgICAgICAgICAgKmRlc3RfYnVmID0gKnNyY19idWY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKmRlc3RfYnVmID0gKCoodWludDhfdCopc3JjX2J1ZiA8PCAyNCkgfCAoZmlsbF9hcmdiICYgMHhmZmZmZmYpOwogICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAocFBhdHRlcm4tPm1fYkNvbG9yZWQpIHsKKyAgICAgICAgICBzY3JlZW4uQ29tcG9zaXRlQml0bWFwKHN0YXJ0X3gsIHN0YXJ0X3ksIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGF0dGVybkJpdG1hcCwgMCwgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2NyZWVuLkNvbXBvc2l0ZU1hc2soc3RhcnRfeCwgc3RhcnRfeSwgd2lkdGgsIGhlaWdodCwgcFBhdHRlcm5CaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9hcmdiLCAwLCAwKTsKKyAgICAgICAgfQorICAgICAgfQogICAgIH0KKyAgfQorICBDb21wb3NpdGVESUJpdG1hcCgmc2NyZWVuLCBjbGlwX2JveC5sZWZ0LCBjbGlwX2JveC50b3AsIDAsIDI1NSwKKyAgICAgICAgICAgICAgICAgICAgRlhESUJfQkxFTkRfTk9STUFMLCBGQUxTRSk7CisgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CisgIGRlbGV0ZSBwUGF0dGVybkJpdG1hcDsKK30KK3ZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdQYXRoV2l0aFBhdHRlcm4oQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQ29sb3IqIHBDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3Ryb2tlKSB7CisgIENQREZfUGF0dGVybiogcGF0dGVybiA9IHBDb2xvci0+R2V0UGF0dGVybigpOworICBpZiAoIXBhdHRlcm4pIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHBhdHRlcm4tPm1fUGF0dGVyblR5cGUgPT0gQ1BERl9QYXR0ZXJuOjpUSUxJTkcpIHsKKyAgICBEcmF3VGlsaW5nUGF0dGVybihzdGF0aWNfY2FzdDxDUERGX1RpbGluZ1BhdHRlcm4qPihwYXR0ZXJuKSwgcFBhdGhPYmosCisgICAgICAgICAgICAgICAgICAgICAgcE9iajJEZXZpY2UsIGJTdHJva2UpOworICB9IGVsc2UgeworICAgIERyYXdTaGFkaW5nUGF0dGVybihzdGF0aWNfY2FzdDxDUERGX1NoYWRpbmdQYXR0ZXJuKj4ocGF0dGVybiksIHBQYXRoT2JqLAorICAgICAgICAgICAgICAgICAgICAgICBwT2JqMkRldmljZSwgYlN0cm9rZSk7CisgIH0KK30KK3ZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NQYXRoUGF0dGVybihDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgZmlsbHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlN0cm9rZSkgeworICBpZiAoZmlsbHR5cGUpIHsKKyAgICBDUERGX0NvbG9yJiBGaWxsQ29sb3IgPSAqcFBhdGhPYmotPm1fQ29sb3JTdGF0ZS5HZXRGaWxsQ29sb3IoKTsKKyAgICBpZiAoRmlsbENvbG9yLm1fcENTICYmIEZpbGxDb2xvci5tX3BDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfUEFUVEVSTikgeworICAgICAgRHJhd1BhdGhXaXRoUGF0dGVybihwUGF0aE9iaiwgcE9iajJEZXZpY2UsICZGaWxsQ29sb3IsIEZBTFNFKTsKKyAgICAgIGZpbGx0eXBlID0gMDsKKyAgICB9CisgIH0KKyAgaWYgKGJTdHJva2UpIHsKKyAgICBDUERGX0NvbG9yJiBTdHJva2VDb2xvciA9ICpwUGF0aE9iai0+bV9Db2xvclN0YXRlLkdldFN0cm9rZUNvbG9yKCk7CisgICAgaWYgKFN0cm9rZUNvbG9yLm1fcENTICYmIFN0cm9rZUNvbG9yLm1fcENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19QQVRURVJOKSB7CisgICAgICBEcmF3UGF0aFdpdGhQYXR0ZXJuKHBQYXRoT2JqLCBwT2JqMkRldmljZSwgJlN0cm9rZUNvbG9yLCBUUlVFKTsKKyAgICAgIGJTdHJva2UgPSBGQUxTRTsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfcGF0dGVybl9lbWJlZGRlcnRlc3QuY3BwIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9wYXR0ZXJuX2VtYmVkZGVydGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc2YzkyMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfcGF0dGVybl9lbWJlZGRlcnRlc3QuY3BwCkBAIC0wLDAgKzEsMTcgQEAKKy8vIENvcHlyaWdodCAyMDE1IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgInRlc3RpbmcvZW1iZWRkZXJfdGVzdC5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCitjbGFzcyBGUERGUmVuZGVyUGF0dGVybkVtYmVkZGVydGVzdCA6IHB1YmxpYyBFbWJlZGRlclRlc3Qge307CisKK1RFU1RfRihGUERGUmVuZGVyUGF0dGVybkVtYmVkZGVydGVzdCwgTG9hZEVycm9yXzU0NzcwNikgeworICAvLyBUZXN0IHNoYWRpbmcgd2hlcmUgb2JqZWN0IGlzIGEgZGljdGlvbmFyeSBpbnN0ZWFkIG9mIGEgc3RyZWFtLgorICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoImJ1Z181NDc3MDYucGRmIikpOworICBGUERGX1BBR0UgcGFnZSA9IExvYWRQYWdlKDApOworICBGUERGX0JJVE1BUCBiaXRtYXAgPSBSZW5kZXJQYWdlKHBhZ2UpOworICBGUERGQml0bWFwX0Rlc3Ryb3koYml0bWFwKTsKKyAgVW5sb2FkUGFnZShwYWdlKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfdGV4dC5jcHAgYi9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX3RleHQuY3BwCmluZGV4IDA5ODQzYzkuLjA1YTVlMDQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvZnBkZl9yZW5kZXJfdGV4dC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl90ZXh0LmNwcApAQCAtMSw3NDYgKzEsNzkxIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZW5kZXIuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlb2JqLmgiCi0jaW5jbHVkZSAiLi4vZnBkZl9wYWdlL3BhZ2VpbnQuaCIKICNpbmNsdWRlICJyZW5kZXJfaW50LmgiCi1leHRlcm4gRlhfQk9PTCBJc0F2YWlsYWJsZU1hdHJpeChjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgpOwotQ1BERl9UeXBlM0NhY2hlOjp+Q1BERl9UeXBlM0NhY2hlKCkKLXsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBtX1NpemVNYXAuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIENGWF9CeXRlU3RyaW5nIEtleTsKLSAgICBDUERGX1R5cGUzR2x5cGhzKiBwU2l6ZUNhY2hlID0gTlVMTDsKLSAgICB3aGlsZShwb3MpIHsKLSAgICAgICAgcFNpemVDYWNoZSA9IChDUERGX1R5cGUzR2x5cGhzKiltX1NpemVNYXAuR2V0TmV4dFZhbHVlKHBvcyk7Ci0gICAgICAgIGRlbGV0ZSBwU2l6ZUNhY2hlOwotICAgIH0KLSAgICBtX1NpemVNYXAuUmVtb3ZlQWxsKCk7CisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2VvYmouaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3JlbmRlci5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2dlLmgiCisjaW5jbHVkZSAiY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvcGFnZWludC5oIgorCitDUERGX1R5cGUzQ2FjaGU6On5DUERGX1R5cGUzQ2FjaGUoKSB7CisgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG1fU2l6ZU1hcCkgeworICAgIGRlbGV0ZSBwYWlyLnNlY29uZDsKKyAgfQorICBtX1NpemVNYXAuY2xlYXIoKTsKIH0KLUNGWF9HbHlwaEJpdG1hcCogQ1BERl9UeXBlM0NhY2hlOjpMb2FkR2x5cGgoRlhfRFdPUkQgY2hhcmNvZGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0ZMT0FUIHJldGluYVNjYWxlWCwgRlhfRkxPQVQgcmV0aW5hU2NhbGVZKQotewotICAgIF9DUERGX1VuaXF1ZUtleUdlbiBrZXlnZW47Ci0gICAga2V5Z2VuLkdlbmVyYXRlKDQsIEZYU1lTX3JvdW5kKHBNYXRyaXgtPmEgKiAxMDAwMCksIEZYU1lTX3JvdW5kKHBNYXRyaXgtPmIgKiAxMDAwMCksCi0gICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKHBNYXRyaXgtPmMgKiAxMDAwMCksIEZYU1lTX3JvdW5kKHBNYXRyaXgtPmQgKiAxMDAwMCkpOwotICAgIENGWF9CeXRlU3RyaW5nQyBGYWNlR2x5cGhzS2V5KGtleWdlbi5tX0tleSwga2V5Z2VuLm1fS2V5TGVuKTsKLSAgICBDUERGX1R5cGUzR2x5cGhzKiBwU2l6ZUNhY2hlID0gTlVMTDsKLSAgICBpZighbV9TaXplTWFwLkxvb2t1cChGYWNlR2x5cGhzS2V5LCAodm9pZComKXBTaXplQ2FjaGUpKSB7Ci0gICAgICAgIHBTaXplQ2FjaGUgPSBuZXcgQ1BERl9UeXBlM0dseXBoczsKLSAgICAgICAgbV9TaXplTWFwLlNldEF0KEZhY2VHbHlwaHNLZXksIHBTaXplQ2FjaGUpOwotICAgIH0KLSAgICBDRlhfR2x5cGhCaXRtYXAqIHBHbHlwaEJpdG1hcDsKLSAgICBpZihwU2l6ZUNhY2hlLT5tX0dseXBoTWFwLkxvb2t1cCgoRlhfTFBWT0lEKShGWF9VSU5UUFRSKWNoYXJjb2RlLCAodm9pZComKXBHbHlwaEJpdG1hcCkpIHsKLSAgICAgICAgcmV0dXJuIHBHbHlwaEJpdG1hcDsKLSAgICB9Ci0gICAgcEdseXBoQml0bWFwID0gUmVuZGVyR2x5cGgocFNpemVDYWNoZSwgY2hhcmNvZGUsIHBNYXRyaXgsIHJldGluYVNjYWxlWCwgcmV0aW5hU2NhbGVZKTsKLSAgICBwU2l6ZUNhY2hlLT5tX0dseXBoTWFwLlNldEF0KChGWF9MUFZPSUQpKEZYX1VJTlRQVFIpY2hhcmNvZGUsIHBHbHlwaEJpdG1hcCk7Ci0gICAgcmV0dXJuIHBHbHlwaEJpdG1hcDsKK0NGWF9HbHlwaEJpdG1hcCogQ1BERl9UeXBlM0NhY2hlOjpMb2FkR2x5cGgoRlhfRFdPUkQgY2hhcmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHJldGluYVNjYWxlWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcmV0aW5hU2NhbGVZKSB7CisgIF9DUERGX1VuaXF1ZUtleUdlbiBrZXlnZW47CisgIGtleWdlbi5HZW5lcmF0ZSgKKyAgICAgIDQsIEZYU1lTX3JvdW5kKHBNYXRyaXgtPmEgKiAxMDAwMCksIEZYU1lTX3JvdW5kKHBNYXRyaXgtPmIgKiAxMDAwMCksCisgICAgICBGWFNZU19yb3VuZChwTWF0cml4LT5jICogMTAwMDApLCBGWFNZU19yb3VuZChwTWF0cml4LT5kICogMTAwMDApKTsKKyAgQ0ZYX0J5dGVTdHJpbmdDIEZhY2VHbHlwaHNLZXkoa2V5Z2VuLm1fS2V5LCBrZXlnZW4ubV9LZXlMZW4pOworICBDUERGX1R5cGUzR2x5cGhzKiBwU2l6ZUNhY2hlOworICBhdXRvIGl0ID0gbV9TaXplTWFwLmZpbmQoRmFjZUdseXBoc0tleSk7CisgIGlmIChpdCA9PSBtX1NpemVNYXAuZW5kKCkpIHsKKyAgICBwU2l6ZUNhY2hlID0gbmV3IENQREZfVHlwZTNHbHlwaHM7CisgICAgbV9TaXplTWFwW0ZhY2VHbHlwaHNLZXldID0gcFNpemVDYWNoZTsKKyAgfSBlbHNlIHsKKyAgICBwU2l6ZUNhY2hlID0gaXQtPnNlY29uZDsKKyAgfQorICBhdXRvIGl0MiA9IHBTaXplQ2FjaGUtPm1fR2x5cGhNYXAuZmluZChjaGFyY29kZSk7CisgIGlmIChpdDIgIT0gcFNpemVDYWNoZS0+bV9HbHlwaE1hcC5lbmQoKSkKKyAgICByZXR1cm4gaXQyLT5zZWNvbmQ7CisKKyAgQ0ZYX0dseXBoQml0bWFwKiBwR2x5cGhCaXRtYXAgPQorICAgICAgUmVuZGVyR2x5cGgocFNpemVDYWNoZSwgY2hhcmNvZGUsIHBNYXRyaXgsIHJldGluYVNjYWxlWCwgcmV0aW5hU2NhbGVZKTsKKyAgcFNpemVDYWNoZS0+bV9HbHlwaE1hcFtjaGFyY29kZV0gPSBwR2x5cGhCaXRtYXA7CisgIHJldHVybiBwR2x5cGhCaXRtYXA7CiB9Ci1DUERGX1R5cGUzR2x5cGhzOjp+Q1BERl9UeXBlM0dseXBocygpCi17Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9HbHlwaE1hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgRlhfTFBWT0lEIEtleTsKLSAgICBDRlhfR2x5cGhCaXRtYXAqIHBHbHlwaEJpdG1hcDsKLSAgICB3aGlsZShwb3MpIHsKLSAgICAgICAgbV9HbHlwaE1hcC5HZXROZXh0QXNzb2MocG9zLCBLZXksICh2b2lkKiYpcEdseXBoQml0bWFwKTsKLSAgICAgICAgZGVsZXRlIHBHbHlwaEJpdG1hcDsKLSAgICB9CitDUERGX1R5cGUzR2x5cGhzOjp+Q1BERl9UeXBlM0dseXBocygpIHsKKyAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbV9HbHlwaE1hcCkKKyAgICBkZWxldGUgcGFpci5zZWNvbmQ7CiB9Ci1zdGF0aWMgaW50IF9BZGp1c3RCbHVlKEZYX0ZMT0FUIHBvcywgaW50JiBjb3VudCwgaW50IGJsdWVzW10pCi17Ci0gICAgRlhfRkxPQVQgbWluX2Rpc3RhbmNlID0gMTAwMDAwMC4wZiAqIDEuMGY7Ci0gICAgaW50IGNsb3Nlc3RfcG9zID0gLTE7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgewotICAgICAgICBGWF9GTE9BVCBkaXN0YW5jZSA9IChGWF9GTE9BVClGWFNZU19mYWJzKHBvcyAtIChGWF9GTE9BVClibHVlc1tpXSk7Ci0gICAgICAgIGlmIChkaXN0YW5jZSA8IDEuMGYgKiA4MC4wZiAvIDEwMC4wZiAmJiBkaXN0YW5jZSA8IG1pbl9kaXN0YW5jZSkgewotICAgICAgICAgICAgbWluX2Rpc3RhbmNlID0gZGlzdGFuY2U7Ci0gICAgICAgICAgICBjbG9zZXN0X3BvcyA9IGk7Ci0gICAgICAgIH0KK3N0YXRpYyBpbnQgX0FkanVzdEJsdWUoRlhfRkxPQVQgcG9zLCBpbnQmIGNvdW50LCBpbnQgYmx1ZXNbXSkgeworICBGWF9GTE9BVCBtaW5fZGlzdGFuY2UgPSAxMDAwMDAwLjBmICogMS4wZjsKKyAgaW50IGNsb3Nlc3RfcG9zID0gLTE7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgIEZYX0ZMT0FUIGRpc3RhbmNlID0gKEZYX0ZMT0FUKUZYU1lTX2ZhYnMocG9zIC0gKEZYX0ZMT0FUKWJsdWVzW2ldKTsKKyAgICBpZiAoZGlzdGFuY2UgPCAxLjBmICogODAuMGYgLyAxMDAuMGYgJiYgZGlzdGFuY2UgPCBtaW5fZGlzdGFuY2UpIHsKKyAgICAgIG1pbl9kaXN0YW5jZSA9IGRpc3RhbmNlOworICAgICAgY2xvc2VzdF9wb3MgPSBpOwogICAgIH0KLSAgICBpZiAoY2xvc2VzdF9wb3MgPj0gMCkgewotICAgICAgICByZXR1cm4gYmx1ZXNbY2xvc2VzdF9wb3NdOwotICAgIH0KLSAgICBpbnQgbmV3X3BvcyA9IEZYU1lTX3JvdW5kKHBvcyk7Ci0gICAgaWYgKGNvdW50ID09IFRZUEUzX01BWF9CTFVFUykgewotICAgICAgICByZXR1cm4gbmV3X3BvczsKLSAgICB9Ci0gICAgYmx1ZXNbY291bnQrK10gPSBuZXdfcG9zOworICB9CisgIGlmIChjbG9zZXN0X3BvcyA+PSAwKSB7CisgICAgcmV0dXJuIGJsdWVzW2Nsb3Nlc3RfcG9zXTsKKyAgfQorICBpbnQgbmV3X3BvcyA9IEZYU1lTX3JvdW5kKHBvcyk7CisgIGlmIChjb3VudCA9PSBUWVBFM19NQVhfQkxVRVMpIHsKICAgICByZXR1cm4gbmV3X3BvczsKKyAgfQorICBibHVlc1tjb3VudCsrXSA9IG5ld19wb3M7CisgIHJldHVybiBuZXdfcG9zOwogfQotdm9pZCBDUERGX1R5cGUzR2x5cGhzOjpBZGp1c3RCbHVlKEZYX0ZMT0FUIHRvcCwgRlhfRkxPQVQgYm90dG9tLCBpbnQmIHRvcF9saW5lLCBpbnQmIGJvdHRvbV9saW5lKQotewotICAgIHRvcF9saW5lID0gX0FkanVzdEJsdWUodG9wLCBtX1RvcEJsdWVDb3VudCwgbV9Ub3BCbHVlKTsKLSAgICBib3R0b21fbGluZSA9IF9BZGp1c3RCbHVlKGJvdHRvbSwgbV9Cb3R0b21CbHVlQ291bnQsIG1fQm90dG9tQmx1ZSk7Cit2b2lkIENQREZfVHlwZTNHbHlwaHM6OkFkanVzdEJsdWUoRlhfRkxPQVQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHRvcF9saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgYm90dG9tX2xpbmUpIHsKKyAgdG9wX2xpbmUgPSBfQWRqdXN0Qmx1ZSh0b3AsIG1fVG9wQmx1ZUNvdW50LCBtX1RvcEJsdWUpOworICBib3R0b21fbGluZSA9IF9BZGp1c3RCbHVlKGJvdHRvbSwgbV9Cb3R0b21CbHVlQ291bnQsIG1fQm90dG9tQmx1ZSk7CiB9Ci1zdGF0aWMgRlhfQk9PTCBfSXNTY2FuTGluZTFicHAoRlhfTFBCWVRFIHBCdWYsIGludCB3aWR0aCkKLXsKLSAgICBpbnQgc2l6ZSA9IHdpZHRoIC8gODsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkgKyspCi0gICAgICAgIGlmIChwQnVmW2ldKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIGlmICh3aWR0aCAlIDgpCi0gICAgICAgIGlmIChwQnVmW3dpZHRoIC8gOF0gJiAoMHhmZiA8PCAoOCAtIHdpZHRoICUgOCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLXN0YXRpYyBGWF9CT09MIF9Jc1NjYW5MaW5lOGJwcChGWF9MUEJZVEUgcEJ1ZiwgaW50IHdpZHRoKQotewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2lkdGg7IGkgKyspCi0gICAgICAgIGlmIChwQnVmW2ldID4gMHg0MCkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci1zdGF0aWMgaW50IF9EZXRlY3RGaXJzdExhc3RTY2FuKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgRlhfQk9PTCBiRmlyc3QpCi17Ci0gICAgaW50IGhlaWdodCA9IHBCaXRtYXAtPkdldEhlaWdodCgpLCBwaXRjaCA9IHBCaXRtYXAtPkdldFBpdGNoKCksIHdpZHRoID0gcEJpdG1hcC0+R2V0V2lkdGgoKTsKLSAgICBpbnQgYnBwID0gcEJpdG1hcC0+R2V0QlBQKCk7Ci0gICAgaWYgKGJwcCA+IDgpIHsKLSAgICAgICAgd2lkdGggKj0gYnBwIC8gODsKK3N0YXRpYyBGWF9CT09MIF9Jc1NjYW5MaW5lMWJwcCh1aW50OF90KiBwQnVmLCBpbnQgd2lkdGgpIHsKKyAgaW50IHNpemUgPSB3aWR0aCAvIDg7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgIGlmIChwQnVmW2ldKSB7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgRlhfTFBCWVRFIHBCdWYgPSBwQml0bWFwLT5HZXRCdWZmZXIoKTsKLSAgICBpbnQgbGluZSA9IGJGaXJzdCA/IDAgOiBoZWlnaHQgLSAxOwotICAgIGludCBsaW5lX3N0ZXAgPSBiRmlyc3QgPyAxIDogLTE7Ci0gICAgaW50IGxpbmVfZW5kID0gYkZpcnN0ID8gaGVpZ2h0IDogLTE7Ci0gICAgd2hpbGUgKGxpbmUgIT0gbGluZV9lbmQpIHsKLSAgICAgICAgaWYgKGJwcCA9PSAxKSB7Ci0gICAgICAgICAgICBpZiAoX0lzU2NhbkxpbmUxYnBwKHBCdWYgKyBsaW5lICogcGl0Y2gsIHdpZHRoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW5lOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKF9Jc1NjYW5MaW5lOGJwcChwQnVmICsgbGluZSAqIHBpdGNoLCB3aWR0aCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGluZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsaW5lICs9IGxpbmVfc3RlcDsKKyAgaWYgKHdpZHRoICUgOCkKKyAgICBpZiAocEJ1Zlt3aWR0aCAvIDhdICYgKDB4ZmYgPDwgKDggLSB3aWR0aCAlIDgpKSkgeworICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiAtMTsKKyAgcmV0dXJuIEZBTFNFOwogfQotQ0ZYX0dseXBoQml0bWFwKiBDUERGX1R5cGUzQ2FjaGU6OlJlbmRlckdseXBoKENQREZfVHlwZTNHbHlwaHMqIHBTaXplLCBGWF9EV09SRCBjaGFyY29kZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfRkxPQVQgcmV0aW5hU2NhbGVYLCBGWF9GTE9BVCByZXRpbmFTY2FsZVkpCi17Ci0gICAgQ1BERl9UeXBlM0NoYXIqIHBDaGFyID0gbV9wRm9udC0+TG9hZENoYXIoY2hhcmNvZGUpOwotICAgIGlmIChwQ2hhciA9PSBOVUxMIHx8IHBDaGFyLT5tX3BCaXRtYXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKK3N0YXRpYyBGWF9CT09MIF9Jc1NjYW5MaW5lOGJwcCh1aW50OF90KiBwQnVmLCBpbnQgd2lkdGgpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQorICAgIGlmIChwQnVmW2ldID4gMHg0MCkgeworICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IHBDaGFyLT5tX3BCaXRtYXA7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBpbWFnZV9tYXRyaXgsIHRleHRfbWF0cml4OwotICAgIGltYWdlX21hdHJpeCA9IHBDaGFyLT5tX0ltYWdlTWF0cml4OwotICAgIHRleHRfbWF0cml4LlNldChwTWF0cml4LT5hLCBwTWF0cml4LT5iLCBwTWF0cml4LT5jLCBwTWF0cml4LT5kLCAwLCAwKTsKLSAgICBpbWFnZV9tYXRyaXguQ29uY2F0KHRleHRfbWF0cml4KTsKLSAgICBDRlhfRElCaXRtYXAqIHBSZXNCaXRtYXAgPSBOVUxMOwotICAgIGludCBsZWZ0LCB0b3A7Ci0gICAgaWYgKEZYU1lTX2ZhYnMoaW1hZ2VfbWF0cml4LmIpIDwgRlhTWVNfZmFicyhpbWFnZV9tYXRyaXguYSkgLyAxMDAgJiYgRlhTWVNfZmFicyhpbWFnZV9tYXRyaXguYykgPCBGWFNZU19mYWJzKGltYWdlX21hdHJpeC5kKSAvIDEwMCkgewotICAgICAgICBpbnQgdG9wX2xpbmUsIGJvdHRvbV9saW5lOwotICAgICAgICB0b3BfbGluZSA9IF9EZXRlY3RGaXJzdExhc3RTY2FuKHBCaXRtYXAsIFRSVUUpOwotICAgICAgICBib3R0b21fbGluZSA9IF9EZXRlY3RGaXJzdExhc3RTY2FuKHBCaXRtYXAsIEZBTFNFKTsKLSAgICAgICAgaWYgKHRvcF9saW5lID09IDAgJiYgYm90dG9tX2xpbmUgPT0gcEJpdG1hcC0+R2V0SGVpZ2h0KCkgLSAxKSB7Ci0gICAgICAgICAgICBGWF9GTE9BVCB0b3BfeSA9IGltYWdlX21hdHJpeC5kICsgaW1hZ2VfbWF0cml4LmY7Ci0gICAgICAgICAgICBGWF9GTE9BVCBib3R0b21feSA9IGltYWdlX21hdHJpeC5mOwotICAgICAgICAgICAgRlhfQk9PTCBiRmxpcHBlZCA9IHRvcF95ID4gYm90dG9tX3k7Ci0gICAgICAgICAgICBpZiAoYkZsaXBwZWQpIHsKLSAgICAgICAgICAgICAgICBGWF9GTE9BVCB0ZW1wID0gdG9wX3k7Ci0gICAgICAgICAgICAgICAgdG9wX3kgPSBib3R0b21feTsKLSAgICAgICAgICAgICAgICBib3R0b21feSA9IHRlbXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwU2l6ZS0+QWRqdXN0Qmx1ZSh0b3BfeSwgYm90dG9tX3ksIHRvcF9saW5lLCBib3R0b21fbGluZSk7Ci0gICAgICAgICAgICBwUmVzQml0bWFwID0gcEJpdG1hcC0+U3RyZXRjaFRvKChpbnQpKEZYU1lTX3JvdW5kKGltYWdlX21hdHJpeC5hKSAqIHJldGluYVNjYWxlWCksIChpbnQpKChiRmxpcHBlZCA/IHRvcF9saW5lIC0gYm90dG9tX2xpbmUgOiBib3R0b21fbGluZSAtIHRvcF9saW5lKSAqIHJldGluYVNjYWxlWSkpOwotICAgICAgICAgICAgdG9wID0gdG9wX2xpbmU7Ci0gICAgICAgICAgICBpZiAoaW1hZ2VfbWF0cml4LmEgPCAwKSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2VfbWF0cml4LlNjYWxlKHJldGluYVNjYWxlWCwgcmV0aW5hU2NhbGVZKTsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gRlhTWVNfcm91bmQoaW1hZ2VfbWF0cml4LmUgKyBpbWFnZV9tYXRyaXguYSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxlZnQgPSBGWFNZU19yb3VuZChpbWFnZV9tYXRyaXguZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorc3RhdGljIGludCBfRGV0ZWN0Rmlyc3RMYXN0U2Nhbihjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIEZYX0JPT0wgYkZpcnN0KSB7CisgIGludCBoZWlnaHQgPSBwQml0bWFwLT5HZXRIZWlnaHQoKSwgcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpLAorICAgICAgd2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpOworICBpbnQgYnBwID0gcEJpdG1hcC0+R2V0QlBQKCk7CisgIGlmIChicHAgPiA4KSB7CisgICAgd2lkdGggKj0gYnBwIC8gODsKKyAgfQorICB1aW50OF90KiBwQnVmID0gcEJpdG1hcC0+R2V0QnVmZmVyKCk7CisgIGludCBsaW5lID0gYkZpcnN0ID8gMCA6IGhlaWdodCAtIDE7CisgIGludCBsaW5lX3N0ZXAgPSBiRmlyc3QgPyAxIDogLTE7CisgIGludCBsaW5lX2VuZCA9IGJGaXJzdCA/IGhlaWdodCA6IC0xOworICB3aGlsZSAobGluZSAhPSBsaW5lX2VuZCkgeworICAgIGlmIChicHAgPT0gMSkgeworICAgICAgaWYgKF9Jc1NjYW5MaW5lMWJwcChwQnVmICsgbGluZSAqIHBpdGNoLCB3aWR0aCkpIHsKKyAgICAgICAgcmV0dXJuIGxpbmU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChfSXNTY2FuTGluZThicHAocEJ1ZiArIGxpbmUgKiBwaXRjaCwgd2lkdGgpKSB7CisgICAgICAgIHJldHVybiBsaW5lOworICAgICAgfQogICAgIH0KLSAgICBpZiAocFJlc0JpdG1hcCA9PSBOVUxMKSB7CisgICAgbGluZSArPSBsaW5lX3N0ZXA7CisgIH0KKyAgcmV0dXJuIC0xOworfQorQ0ZYX0dseXBoQml0bWFwKiBDUERGX1R5cGUzQ2FjaGU6OlJlbmRlckdseXBoKENQREZfVHlwZTNHbHlwaHMqIHBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNoYXJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcmV0aW5hU2NhbGVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHJldGluYVNjYWxlWSkgeworICBjb25zdCBDUERGX1R5cGUzQ2hhciogcENoYXIgPSBtX3BGb250LT5Mb2FkQ2hhcihjaGFyY29kZSk7CisgIGlmICghcENoYXIgfHwgIXBDaGFyLT5tX3BCaXRtYXApCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gcENoYXItPm1fcEJpdG1hcDsKKyAgQ0ZYX01hdHJpeCBpbWFnZV9tYXRyaXgsIHRleHRfbWF0cml4OworICBpbWFnZV9tYXRyaXggPSBwQ2hhci0+bV9JbWFnZU1hdHJpeDsKKyAgdGV4dF9tYXRyaXguU2V0KHBNYXRyaXgtPmEsIHBNYXRyaXgtPmIsIHBNYXRyaXgtPmMsIHBNYXRyaXgtPmQsIDAsIDApOworICBpbWFnZV9tYXRyaXguQ29uY2F0KHRleHRfbWF0cml4KTsKKyAgQ0ZYX0RJQml0bWFwKiBwUmVzQml0bWFwID0gTlVMTDsKKyAgaW50IGxlZnQsIHRvcDsKKyAgaWYgKEZYU1lTX2ZhYnMoaW1hZ2VfbWF0cml4LmIpIDwgRlhTWVNfZmFicyhpbWFnZV9tYXRyaXguYSkgLyAxMDAgJiYKKyAgICAgIEZYU1lTX2ZhYnMoaW1hZ2VfbWF0cml4LmMpIDwgRlhTWVNfZmFicyhpbWFnZV9tYXRyaXguZCkgLyAxMDApIHsKKyAgICBpbnQgdG9wX2xpbmUsIGJvdHRvbV9saW5lOworICAgIHRvcF9saW5lID0gX0RldGVjdEZpcnN0TGFzdFNjYW4ocEJpdG1hcCwgVFJVRSk7CisgICAgYm90dG9tX2xpbmUgPSBfRGV0ZWN0Rmlyc3RMYXN0U2NhbihwQml0bWFwLCBGQUxTRSk7CisgICAgaWYgKHRvcF9saW5lID09IDAgJiYgYm90dG9tX2xpbmUgPT0gcEJpdG1hcC0+R2V0SGVpZ2h0KCkgLSAxKSB7CisgICAgICBGWF9GTE9BVCB0b3BfeSA9IGltYWdlX21hdHJpeC5kICsgaW1hZ2VfbWF0cml4LmY7CisgICAgICBGWF9GTE9BVCBib3R0b21feSA9IGltYWdlX21hdHJpeC5mOworICAgICAgRlhfQk9PTCBiRmxpcHBlZCA9IHRvcF95ID4gYm90dG9tX3k7CisgICAgICBpZiAoYkZsaXBwZWQpIHsKKyAgICAgICAgRlhfRkxPQVQgdGVtcCA9IHRvcF95OworICAgICAgICB0b3BfeSA9IGJvdHRvbV95OworICAgICAgICBib3R0b21feSA9IHRlbXA7CisgICAgICB9CisgICAgICBwU2l6ZS0+QWRqdXN0Qmx1ZSh0b3BfeSwgYm90dG9tX3ksIHRvcF9saW5lLCBib3R0b21fbGluZSk7CisgICAgICBwUmVzQml0bWFwID0gcEJpdG1hcC0+U3RyZXRjaFRvKAorICAgICAgICAgIChpbnQpKEZYU1lTX3JvdW5kKGltYWdlX21hdHJpeC5hKSAqIHJldGluYVNjYWxlWCksCisgICAgICAgICAgKGludCkoKGJGbGlwcGVkID8gdG9wX2xpbmUgLSBib3R0b21fbGluZSA6IGJvdHRvbV9saW5lIC0gdG9wX2xpbmUpICoKKyAgICAgICAgICAgICAgICByZXRpbmFTY2FsZVkpKTsKKyAgICAgIHRvcCA9IHRvcF9saW5lOworICAgICAgaWYgKGltYWdlX21hdHJpeC5hIDwgMCkgewogICAgICAgICBpbWFnZV9tYXRyaXguU2NhbGUocmV0aW5hU2NhbGVYLCByZXRpbmFTY2FsZVkpOwotICAgICAgICBwUmVzQml0bWFwID0gcEJpdG1hcC0+VHJhbnNmb3JtVG8oJmltYWdlX21hdHJpeCwgbGVmdCwgdG9wKTsKLSAgICB9Ci0gICAgaWYgKHBSZXNCaXRtYXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ0ZYX0dseXBoQml0bWFwKiBwR2x5cGggPSBuZXcgQ0ZYX0dseXBoQml0bWFwOwotICAgIHBHbHlwaC0+bV9MZWZ0ID0gbGVmdDsKLSAgICBwR2x5cGgtPm1fVG9wID0gLXRvcDsKLSAgICBwR2x5cGgtPm1fQml0bWFwLlRha2VPdmVyKHBSZXNCaXRtYXApOwotICAgIGRlbGV0ZSBwUmVzQml0bWFwOwotICAgIHJldHVybiBwR2x5cGg7Ci19Ci12b2lkIF9DUERGX1VuaXF1ZUtleUdlbjo6R2VuZXJhdGUoaW50IGNvdW50LCAuLi4pCi17Ci0gICAgdmFfbGlzdCBhcmdMaXN0OwotICAgIHZhX3N0YXJ0KGFyZ0xpc3QsIGNvdW50KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpICsrKSB7Ci0gICAgICAgIGludCBwID0gdmFfYXJnKGFyZ0xpc3QsIGludCk7Ci0gICAgICAgICgoRlhfRFdPUkQqKW1fS2V5KVtpXSA9IHA7Ci0gICAgfQotICAgIHZhX2VuZChhcmdMaXN0KTsKLSAgICBtX0tleUxlbiA9IGNvdW50ICogc2l6ZW9mKEZYX0RXT1JEKTsKLX0KLUZYX0JPT0wgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NUZXh0KGNvbnN0IENQREZfVGV4dE9iamVjdCogdGV4dG9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIENGWF9QYXRoRGF0YSogcENsaXBwaW5nUGF0aCkKLXsKLSAgICBpZih0ZXh0b2JqLT5tX25DaGFycyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpbnQgdGV4dF9yZW5kZXJfbW9kZSA9IHRleHRvYmotPm1fVGV4dFN0YXRlLkdldE9iamVjdCgpLT5tX1RleHRNb2RlOwotICAgIGlmICh0ZXh0X3JlbmRlcl9tb2RlID09IDMpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIENQREZfRm9udCogcEZvbnQgPSB0ZXh0b2JqLT5tX1RleHRTdGF0ZS5HZXRGb250KCk7Ci0gICAgaWYgKHBGb250LT5HZXRGb250VHlwZSgpID09IFBERkZPTlRfVFlQRTMpIHsKLSAgICAgICAgcmV0dXJuIFByb2Nlc3NUeXBlM1RleHQodGV4dG9iaiwgcE9iajJEZXZpY2UpOwotICAgIH0KLSAgICBGWF9CT09MIGJGaWxsID0gRkFMU0UsIGJTdHJva2UgPSBGQUxTRSwgYkNsaXAgPSBGQUxTRTsKLSAgICBpZiAocENsaXBwaW5nUGF0aCkgewotICAgICAgICBiQ2xpcCA9IFRSVUU7CisgICAgICAgIGxlZnQgPSBGWFNZU19yb3VuZChpbWFnZV9tYXRyaXguZSArIGltYWdlX21hdHJpeC5hKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxlZnQgPSBGWFNZU19yb3VuZChpbWFnZV9tYXRyaXguZSk7CisgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICh0ZXh0X3JlbmRlcl9tb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgYkZpbGwgPSBUUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgIGlmIChwRm9udC0+R2V0RmFjZSgpID09IE5VTEwgJiYgIShwRm9udC0+R2V0U3Vic3RGb250KCktPm1fU3Vic3RGbGFncyAmIEZYRk9OVF9TVUJTVF9HTFlQSFBBVEgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJGaWxsID0gVFJVRTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiU3Ryb2tlID0gVFJVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgaWYgKHBGb250LT5HZXRGYWNlKCkgPT0gTlVMTCAmJiAhKHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX0dMWVBIUEFUSCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYkZpbGwgPSBUUlVFOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJGaWxsID0gYlN0cm9rZSA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBiRmlsbCA9IFRSVUU7Ci0gICAgICAgIH0KICAgICB9Ci0gICAgRlhfQVJHQiBzdHJva2VfYXJnYiA9IDAsIGZpbGxfYXJnYiA9IDA7Ci0gICAgRlhfQk9PTCBiUGF0dGVybiA9IEZBTFNFOwotICAgIGlmIChiU3Ryb2tlKSB7Ci0gICAgICAgIGlmICh0ZXh0b2JqLT5tX0NvbG9yU3RhdGUuR2V0U3Ryb2tlQ29sb3IoKS0+SXNQYXR0ZXJuKCkpIHsKLSAgICAgICAgICAgIGJQYXR0ZXJuID0gVFJVRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0cm9rZV9hcmdiID0gR2V0U3Ryb2tlQXJnYih0ZXh0b2JqKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoYkZpbGwpIHsKLSAgICAgICAgaWYgKHRleHRvYmotPm1fQ29sb3JTdGF0ZS5HZXRGaWxsQ29sb3IoKS0+SXNQYXR0ZXJuKCkpIHsKLSAgICAgICAgICAgIGJQYXR0ZXJuID0gVFJVRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpbGxfYXJnYiA9IEdldEZpbGxBcmdiKHRleHRvYmopOwotICAgICAgICB9Ci0gICAgfQotICAgIENGWF9BZmZpbmVNYXRyaXggdGV4dF9tYXRyaXg7Ci0gICAgdGV4dG9iai0+R2V0VGV4dE1hdHJpeCgmdGV4dF9tYXRyaXgpOwotICAgIGlmKElzQXZhaWxhYmxlTWF0cml4KHRleHRfbWF0cml4KSA9PSBGQUxTRSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgRlhfRkxPQVQgZm9udF9zaXplID0gdGV4dG9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKTsKLSAgICBpZiAoYlBhdHRlcm4pIHsKLSAgICAgICAgRHJhd1RleHRQYXRoV2l0aFBhdHRlcm4odGV4dG9iaiwgcE9iajJEZXZpY2UsIHBGb250LCBmb250X3NpemUsICZ0ZXh0X21hdHJpeCwgYkZpbGwsIGJTdHJva2UpOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKGJDbGlwIHx8IGJTdHJva2UpIHsKLSAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcERldmljZU1hdHJpeCA9IHBPYmoyRGV2aWNlOwotICAgICAgICBDRlhfQWZmaW5lTWF0cml4IGRldmljZV9tYXRyaXg7Ci0gICAgICAgIGlmIChiU3Ryb2tlKSB7Ci0gICAgICAgICAgICBjb25zdCBGWF9GTE9BVCogcENUTSA9IHRleHRvYmotPm1fVGV4dFN0YXRlLkdldE9iamVjdCgpLT5tX0NUTTsKLSAgICAgICAgICAgIGlmIChwQ1RNWzBdICE9IDEuMGYgfHwgcENUTVszXSAhPSAxLjBmKSB7Ci0gICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBjdG0ocENUTVswXSwgcENUTVsxXSwgcENUTVsyXSwgcENUTVszXSwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgdGV4dF9tYXRyaXguQ29uY2F0SW52ZXJzZShjdG0pOwotICAgICAgICAgICAgICAgIGRldmljZV9tYXRyaXguQ29weShjdG0pOwotICAgICAgICAgICAgICAgIGRldmljZV9tYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7Ci0gICAgICAgICAgICAgICAgcERldmljZU1hdHJpeCA9ICZkZXZpY2VfbWF0cml4OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludCBmbGFnID0gMDsKLSAgICAgICAgaWYgKGJTdHJva2UgJiYgYkZpbGwpIHsKLSAgICAgICAgICAgIGZsYWcgfD0gRlhfRklMTF9TVFJPS0U7Ci0gICAgICAgICAgICBmbGFnIHw9IEZYX1NUUk9LRV9URVhUX01PREU7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3QgQ1BERl9HZW5lcmFsU3RhdGVEYXRhKiBwR2VuZXJhbERhdGEgPSAoKENQREZfUGFnZU9iamVjdCopdGV4dG9iaiktPm1fR2VuZXJhbFN0YXRlOwotICAgICAgICBpZiAocEdlbmVyYWxEYXRhICYmIHBHZW5lcmFsRGF0YS0+bV9TdHJva2VBZGp1c3QpIHsKLSAgICAgICAgICAgIGZsYWcgfD0gRlhfU1RST0tFX0FESlVTVDsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfTk9URVhUU01PT1RIKSB7Ci0gICAgICAgICAgICBmbGFnIHw9IEZYRklMTF9OT1BBVEhTTU9PVEg7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENQREZfVGV4dFJlbmRlcmVyOjpEcmF3VGV4dFBhdGgobV9wRGV2aWNlLCB0ZXh0b2JqLT5tX25DaGFycywgdGV4dG9iai0+bV9wQ2hhckNvZGVzLCB0ZXh0b2JqLT5tX3BDaGFyUG9zLCBwRm9udCwgZm9udF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dF9tYXRyaXgsIHBEZXZpY2VNYXRyaXgsIHRleHRvYmotPm1fR3JhcGhTdGF0ZSwgZmlsbF9hcmdiLCBzdHJva2VfYXJnYiwgcENsaXBwaW5nUGF0aCwgZmxhZyk7Ci0gICAgfQotICAgIHRleHRfbWF0cml4LkNvbmNhdCgqcE9iajJEZXZpY2UpOwotICAgIHJldHVybiBDUERGX1RleHRSZW5kZXJlcjo6RHJhd05vcm1hbFRleHQobV9wRGV2aWNlLCB0ZXh0b2JqLT5tX25DaGFycywgdGV4dG9iai0+bV9wQ2hhckNvZGVzLCB0ZXh0b2JqLT5tX3BDaGFyUG9zLCBwRm9udCwgZm9udF9zaXplLAotICAgICAgICAgICAgJnRleHRfbWF0cml4LCBmaWxsX2FyZ2IsICZtX09wdGlvbnMpOworICB9CisgIGlmICghcFJlc0JpdG1hcCkgeworICAgIGltYWdlX21hdHJpeC5TY2FsZShyZXRpbmFTY2FsZVgsIHJldGluYVNjYWxlWSk7CisgICAgcFJlc0JpdG1hcCA9IHBCaXRtYXAtPlRyYW5zZm9ybVRvKCZpbWFnZV9tYXRyaXgsIGxlZnQsIHRvcCk7CisgIH0KKyAgaWYgKCFwUmVzQml0bWFwKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ0ZYX0dseXBoQml0bWFwKiBwR2x5cGggPSBuZXcgQ0ZYX0dseXBoQml0bWFwOworICBwR2x5cGgtPm1fTGVmdCA9IGxlZnQ7CisgIHBHbHlwaC0+bV9Ub3AgPSAtdG9wOworICBwR2x5cGgtPm1fQml0bWFwLlRha2VPdmVyKHBSZXNCaXRtYXApOworICBkZWxldGUgcFJlc0JpdG1hcDsKKyAgcmV0dXJuIHBHbHlwaDsKIH0KLUNQREZfVHlwZTNDYWNoZSogQ1BERl9SZW5kZXJTdGF0dXM6OkdldENhY2hlZFR5cGUzKENQREZfVHlwZTNGb250KiBwRm9udCkKLXsKLSAgICBpZiAocEZvbnQtPm1fcERvY3VtZW50ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHBGb250LT5tX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+R2V0Rm9udChwRm9udC0+R2V0Rm9udERpY3QoKSwgRkFMU0UpOwotICAgIHJldHVybiBwRm9udC0+bV9wRG9jdW1lbnQtPkdldFJlbmRlckRhdGEoKS0+R2V0Q2FjaGVkVHlwZTMocEZvbnQpOwordm9pZCBfQ1BERl9VbmlxdWVLZXlHZW46OkdlbmVyYXRlKGludCBjb3VudCwgLi4uKSB7CisgIHZhX2xpc3QgYXJnTGlzdDsKKyAgdmFfc3RhcnQoYXJnTGlzdCwgY291bnQpOworICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBpbnQgcCA9IHZhX2FyZyhhcmdMaXN0LCBpbnQpOworICAgICgoRlhfRFdPUkQqKW1fS2V5KVtpXSA9IHA7CisgIH0KKyAgdmFfZW5kKGFyZ0xpc3QpOworICBtX0tleUxlbiA9IGNvdW50ICogc2l6ZW9mKEZYX0RXT1JEKTsKIH0KLXN0YXRpYyB2b2lkIFJlbGVhc2VDYWNoZWRUeXBlMyhDUERGX1R5cGUzRm9udCogcEZvbnQpCi17Ci0gICAgaWYgKHBGb250LT5tX3BEb2N1bWVudCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcEZvbnQtPm1fcERvY3VtZW50LT5HZXRSZW5kZXJEYXRhKCktPlJlbGVhc2VDYWNoZWRUeXBlMyhwRm9udCk7Ci0gICAgcEZvbnQtPm1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlRm9udChwRm9udC0+R2V0Rm9udERpY3QoKSk7Ci19Ci1GWF9CT09MIENQREZfVHlwZTNDaGFyOjpMb2FkQml0bWFwKENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQpCi17Ci0gICAgaWYgKG1fcEJpdG1hcCAhPSBOVUxMIHx8IG1fcEZvcm0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKG1fcEZvcm0tPkNvdW50T2JqZWN0cygpID09IDEgJiYgIW1fYkNvbG9yZWQpIHsKLSAgICAgICAgQ1BERl9QYWdlT2JqZWN0ICpwUGFnZU9iaiA9IG1fcEZvcm0tPkdldE9iamVjdEF0KG1fcEZvcm0tPkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKSk7Ci0gICAgICAgIGlmIChwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfSU1BR0UpIHsKLSAgICAgICAgICAgIENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZSA9IChDUERGX0ltYWdlT2JqZWN0KilwUGFnZU9iajsKLSAgICAgICAgICAgIG1fSW1hZ2VNYXRyaXggPSBwSW1hZ2UtPm1fTWF0cml4OwotICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSA9IHBJbWFnZS0+bV9wSW1hZ2UtPkxvYWRESUJTb3VyY2UoKTsKLSAgICAgICAgICAgIGlmIChwU291cmNlKSB7Ci0gICAgICAgICAgICAgICAgbV9wQml0bWFwID0gcFNvdXJjZS0+Q2xvbmUoKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgcFNvdXJjZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlbGV0ZSBtX3BGb3JtOwotICAgICAgICAgICAgbV9wRm9ybSA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAocFBhZ2VPYmotPm1fVHlwZSA9PSBQREZQQUdFX0lOTElORVMpIHsKLSAgICAgICAgICAgIENQREZfSW5saW5lSW1hZ2VzICpwSW5saW5lcyA9IChDUERGX0lubGluZUltYWdlcyAqKXBQYWdlT2JqOwotICAgICAgICAgICAgaWYgKHBJbmxpbmVzLT5tX3BTdHJlYW0pIHsKLSAgICAgICAgICAgICAgICBtX0ltYWdlTWF0cml4ID0gcElubGluZXMtPm1fTWF0cmljZXNbMF07Ci0gICAgICAgICAgICAgICAgQ1BERl9ESUJTb3VyY2UgZGlic3JjOwotICAgICAgICAgICAgICAgIGlmICghZGlic3JjLkxvYWQocENvbnRleHQtPm1fcERvY3VtZW50LCBwSW5saW5lcy0+bV9wU3RyZWFtLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fcEJpdG1hcCA9IGRpYnNyYy5DbG9uZSgpOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBtX3BGb3JtOwotICAgICAgICAgICAgICAgIG1fcEZvcm0gPSBOVUxMOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLWNsYXNzIENQREZfUmVmVHlwZTNDYWNoZQotewotcHVibGljOgotICAgIENQREZfUmVmVHlwZTNDYWNoZShDUERGX1R5cGUzRm9udCogcFR5cGUzRm9udCkKLSAgICB7Ci0gICAgICAgIG1fZHdDb3VudCA9IDA7Ci0gICAgICAgIG1fcFR5cGUzRm9udCA9IHBUeXBlM0ZvbnQ7Ci0gICAgfQotICAgIH5DUERGX1JlZlR5cGUzQ2FjaGUoKQotICAgIHsKLSAgICAgICAgd2hpbGUobV9kd0NvdW50LS0pIHsKLSAgICAgICAgICAgIFJlbGVhc2VDYWNoZWRUeXBlMyhtX3BUeXBlM0ZvbnQpOwotICAgICAgICB9Ci0gICAgfQotICAgIEZYX0RXT1JEIG1fZHdDb3VudDsKLSAgICBDUERGX1R5cGUzRm9udCogbV9wVHlwZTNGb250OwotfTsKLUZYX0JPT0wgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NUeXBlM1RleHQoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiB0ZXh0b2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSkKLXsKLSAgICBDUERGX1R5cGUzRm9udCogcFR5cGUzRm9udCA9IHRleHRvYmotPm1fVGV4dFN0YXRlLkdldEZvbnQoKS0+R2V0VHlwZTNGb250KCk7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBtX1R5cGUzRm9udENhY2hlLkdldFNpemUoKTsgaisrKQotICAgICAgICBpZiAoKENQREZfVHlwZTNGb250KiltX1R5cGUzRm9udENhY2hlLkdldEF0KGopID09IHBUeXBlM0ZvbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgQ0ZYX01hdHJpeCBkQ1RNID0gbV9wRGV2aWNlLT5HZXRDVE0oKTsKLSAgICBGWF9GTE9BVCBzYSA9IEZYU1lTX2ZhYnMoZENUTS5hKTsKLSAgICBGWF9GTE9BVCBzZCA9IEZYU1lTX2ZhYnMoZENUTS5kKTsKLSAgICBDRlhfQWZmaW5lTWF0cml4IHRleHRfbWF0cml4OwotICAgIHRleHRvYmotPkdldFRleHRNYXRyaXgoJnRleHRfbWF0cml4KTsKLSAgICBDRlhfQWZmaW5lTWF0cml4IGNoYXJfbWF0cml4ID0gcFR5cGUzRm9udC0+R2V0Rm9udE1hdHJpeCgpOwotICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSA9IHRleHRvYmotPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCk7Ci0gICAgY2hhcl9tYXRyaXguU2NhbGUoZm9udF9zaXplLCBmb250X3NpemUpOwotICAgIEZYX0FSR0IgZmlsbF9hcmdiID0gR2V0RmlsbEFyZ2IodGV4dG9iaiwgVFJVRSk7Ci0gICAgaW50IGZpbGxfYWxwaGEgPSBGWEFSR0JfQShmaWxsX2FyZ2IpOwotICAgIGludCBkZXZpY2VfY2xhc3MgPSBtX3BEZXZpY2UtPkdldERldmljZUNsYXNzKCk7Ci0gICAgRlhURVhUX0dMWVBIUE9TKiBwR2x5cGhBbmRQb3MgPSBOVUxMOwotICAgIGlmIChkZXZpY2VfY2xhc3MgPT0gRlhEQ19ESVNQTEFZKSB7Ci0gICAgICAgIHBHbHlwaEFuZFBvcyA9IEZYX0FsbG9jKEZYVEVYVF9HTFlQSFBPUywgdGV4dG9iai0+bV9uQ2hhcnMpOwotICAgIH0gZWxzZSBpZiAoZmlsbF9hbHBoYSA8IDI1NSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENQREZfUmVmVHlwZTNDYWNoZSByZWZUeXBlQ2FjaGUocFR5cGUzRm9udCk7Ci0gICAgRlhfRFdPUkQgKnBDaGFycyA9IHRleHRvYmotPm1fcENoYXJDb2RlczsKLSAgICBpZiAodGV4dG9iai0+bV9uQ2hhcnMgPT0gMSkgewotICAgICAgICBwQ2hhcnMgPSAoRlhfRFdPUkQqKSgmdGV4dG9iai0+bV9wQ2hhckNvZGVzKTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaUNoYXIgPSAwOyBpQ2hhciA8IHRleHRvYmotPm1fbkNoYXJzOyBpQ2hhciArKykgewotICAgICAgICBGWF9EV09SRCBjaGFyY29kZSA9IHBDaGFyc1tpQ2hhcl07Ci0gICAgICAgIGlmIChjaGFyY29kZSA9PSAoRlhfRFdPUkQpIC0gMSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9UeXBlM0NoYXIqIHBUeXBlM0NoYXIgPSBwVHlwZTNGb250LT5Mb2FkQ2hhcihjaGFyY29kZSk7Ci0gICAgICAgIGlmIChwVHlwZTNDaGFyID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4ID0gY2hhcl9tYXRyaXg7Ci0gICAgICAgIG1hdHJpeC5lICs9IGlDaGFyID8gdGV4dG9iai0+bV9wQ2hhclBvc1tpQ2hhciAtIDFdIDogMDsKLSAgICAgICAgbWF0cml4LkNvbmNhdCh0ZXh0X21hdHJpeCk7Ci0gICAgICAgIG1hdHJpeC5Db25jYXQoKnBPYmoyRGV2aWNlKTsKLSAgICAgICAgaWYgKCFwVHlwZTNDaGFyLT5Mb2FkQml0bWFwKG1fcENvbnRleHQpKSB7Ci0gICAgICAgICAgICBpZiAocEdseXBoQW5kUG9zKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ2hhcjsgaSArKykgewotICAgICAgICAgICAgICAgICAgICBGWFRFWFRfR0xZUEhQT1MmIGdseXBoID0gcEdseXBoQW5kUG9zW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoZ2x5cGgubV9wR2x5cGggPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbV9wRGV2aWNlLT5TZXRCaXRNYXNrKCZnbHlwaC5tX3BHbHlwaC0+bV9CaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaC5tX09yaWdpblggKyBnbHlwaC5tX3BHbHlwaC0+bV9MZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGgubV9PcmlnaW5ZIC0gZ2x5cGgubV9wR2x5cGgtPm1fVG9wLCBmaWxsX2FyZ2IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7Ci0gICAgICAgICAgICAgICAgcEdseXBoQW5kUG9zID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENQREZfR3JhcGhpY1N0YXRlcyogcFN0YXRlcyA9IENsb25lT2JqU3RhdGVzKHRleHRvYmosIEZBTFNFKTsKLSAgICAgICAgICAgIENQREZfUmVuZGVyT3B0aW9ucyBPcHRpb25zID0gbV9PcHRpb25zOwotICAgICAgICAgICAgT3B0aW9ucy5tX0ZsYWdzIHw9IFJFTkRFUl9GT1JDRV9IQUxGVE9ORSB8IFJFTkRFUl9SRUNUX0FBOwotICAgICAgICAgICAgT3B0aW9ucy5tX0ZsYWdzICY9IH5SRU5ERVJfRk9SQ0VfRE9XTlNBTVBMRTsKLSAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSA9IE5VTEw7Ci0gICAgICAgICAgICBpZiAocFR5cGUzQ2hhci0+bV9wRm9ybSAmJiBwVHlwZTNDaGFyLT5tX3BGb3JtLT5tX3BGb3JtRGljdCkgewotICAgICAgICAgICAgICAgIHBGb3JtUmVzb3VyY2UgPSBwVHlwZTNDaGFyLT5tX3BGb3JtLT5tX3BGb3JtRGljdC0+R2V0RGljdChGWF9CU1RSQygiUmVzb3VyY2VzIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZpbGxfYWxwaGEgPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMgc3RhdHVzOwotICAgICAgICAgICAgICAgIHN0YXR1cy5Jbml0aWFsaXplKG1fcENvbnRleHQsIG1fcERldmljZSwgTlVMTCwgTlVMTCwgdGhpcywgcFN0YXRlcywgJk9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFR5cGUzQ2hhci0+bV9wRm9ybS0+bV9UcmFuc3BhcmVuY3ksIG1fYkRyb3BPYmplY3RzLCBwRm9ybVJlc291cmNlLCBGQUxTRSwgcFR5cGUzQ2hhciwgZmlsbF9hcmdiKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMubV9UeXBlM0ZvbnRDYWNoZS5BcHBlbmQobV9UeXBlM0ZvbnRDYWNoZSk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLm1fVHlwZTNGb250Q2FjaGUuQWRkKHBUeXBlM0ZvbnQpOwotICAgICAgICAgICAgICAgIG1fcERldmljZS0+U2F2ZVN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLlJlbmRlck9iamVjdExpc3QocFR5cGUzQ2hhci0+bV9wRm9ybSwgJm1hdHJpeCk7Ci0gICAgICAgICAgICAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0X2YgPSBwVHlwZTNDaGFyLT5tX3BGb3JtLT5DYWxjQm91bmRpbmdCb3goKTsKLSAgICAgICAgICAgICAgICByZWN0X2YuVHJhbnNmb3JtKCZtYXRyaXgpOwotICAgICAgICAgICAgICAgIEZYX1JFQ1QgcmVjdCA9IHJlY3RfZi5HZXRPdXR0ZXJSZWN0KCk7Ci0gICAgICAgICAgICAgICAgQ0ZYX0Z4Z2VEZXZpY2UgYml0bWFwX2RldmljZTsKLSAgICAgICAgICAgICAgICBpZiAoIWJpdG1hcF9kZXZpY2UuQ3JlYXRlKChpbnQpKHJlY3QuV2lkdGgoKSAqIHNhKSwgKGludCkocmVjdC5IZWlnaHQoKSAqIHNkKSwgRlhESUJfQXJnYikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJpdG1hcF9kZXZpY2UuR2V0Qml0bWFwKCktPkNsZWFyKDApOwotICAgICAgICAgICAgICAgIENQREZfUmVuZGVyU3RhdHVzIHN0YXR1czsKLSAgICAgICAgICAgICAgICBzdGF0dXMuSW5pdGlhbGl6ZShtX3BDb250ZXh0LCAmYml0bWFwX2RldmljZSwgTlVMTCwgTlVMTCwgdGhpcywgcFN0YXRlcywgJk9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFR5cGUzQ2hhci0+bV9wRm9ybS0+bV9UcmFuc3BhcmVuY3ksIG1fYkRyb3BPYmplY3RzLCBwRm9ybVJlc291cmNlLCBGQUxTRSwgcFR5cGUzQ2hhciwgZmlsbF9hcmdiKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMubV9UeXBlM0ZvbnRDYWNoZS5BcHBlbmQobV9UeXBlM0ZvbnRDYWNoZSk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLm1fVHlwZTNGb250Q2FjaGUuQWRkKHBUeXBlM0ZvbnQpOwotICAgICAgICAgICAgICAgIG1hdHJpeC5UcmFuc2xhdGVJKC1yZWN0LmxlZnQsIC1yZWN0LnRvcCk7Ci0gICAgICAgICAgICAgICAgbWF0cml4LlNjYWxlKHNhLCBzZCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzLlJlbmRlck9iamVjdExpc3QocFR5cGUzQ2hhci0+bV9wRm9ybSwgJm1hdHJpeCk7Ci0gICAgICAgICAgICAgICAgbV9wRGV2aWNlLT5TZXRESUJpdHMoYml0bWFwX2RldmljZS5HZXRCaXRtYXAoKSwgcmVjdC5sZWZ0LCByZWN0LnRvcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWxldGUgcFN0YXRlczsKLSAgICAgICAgfSBlbHNlIGlmIChwVHlwZTNDaGFyLT5tX3BCaXRtYXApIHsKLSAgICAgICAgICAgIGlmIChkZXZpY2VfY2xhc3MgPT0gRlhEQ19ESVNQTEFZKSB7Ci0gICAgICAgICAgICAgICAgQ1BERl9UeXBlM0NhY2hlKiBwQ2FjaGUgPSBHZXRDYWNoZWRUeXBlMyhwVHlwZTNGb250KTsKLSAgICAgICAgICAgICAgICByZWZUeXBlQ2FjaGUubV9kd0NvdW50Kys7Ci0gICAgICAgICAgICAgICAgQ0ZYX0dseXBoQml0bWFwKiBwQml0bWFwID0gcENhY2hlLT5Mb2FkR2x5cGgoY2hhcmNvZGUsICZtYXRyaXgsIHNhLCBzZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IG9yaWdpbl94ID0gRlhTWVNfcm91bmQobWF0cml4LmUpOwotICAgICAgICAgICAgICAgIGludCBvcmlnaW5feSA9IEZYU1lTX3JvdW5kKG1hdHJpeC5mKTsKLSAgICAgICAgICAgICAgICBpZiAocEdseXBoQW5kUG9zKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBHbHlwaEFuZFBvc1tpQ2hhcl0ubV9wR2x5cGggPSBwQml0bWFwOwotICAgICAgICAgICAgICAgICAgICBwR2x5cGhBbmRQb3NbaUNoYXJdLm1fT3JpZ2luWCA9IG9yaWdpbl94OwotICAgICAgICAgICAgICAgICAgICBwR2x5cGhBbmRQb3NbaUNoYXJdLm1fT3JpZ2luWSA9IG9yaWdpbl95OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcERldmljZS0+U2V0Qml0TWFzaygmcEJpdG1hcC0+bV9CaXRtYXAsIG9yaWdpbl94ICsgcEJpdG1hcC0+bV9MZWZ0LCBvcmlnaW5feSAtIHBCaXRtYXAtPm1fVG9wLCBmaWxsX2FyZ2IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBpbWFnZV9tYXRyaXggPSBwVHlwZTNDaGFyLT5tX0ltYWdlTWF0cml4OwotICAgICAgICAgICAgICAgIGltYWdlX21hdHJpeC5Db25jYXQobWF0cml4KTsKLSAgICAgICAgICAgICAgICBDUERGX0ltYWdlUmVuZGVyZXIgcmVuZGVyZXI7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbmRlcmVyLlN0YXJ0KHRoaXMsIHBUeXBlM0NoYXItPm1fcEJpdG1hcCwgZmlsbF9hcmdiLCAyNTUsICZpbWFnZV9tYXRyaXgsIDAsIEZBTFNFKSkgewotICAgICAgICAgICAgICAgICAgICByZW5kZXJlci5Db250aW51ZShOVUxMKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFyZW5kZXJlci5tX1Jlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwR2x5cGhBbmRQb3MpIHsKLSAgICAgICAgRlhfUkVDVCByZWN0ID0gRlhHRV9HZXRHbHlwaHNCQm94KHBHbHlwaEFuZFBvcywgdGV4dG9iai0+bV9uQ2hhcnMsIDAsIHNhLCBzZCk7Ci0gICAgICAgIENGWF9ESUJpdG1hcCBiaXRtYXA7Ci0gICAgICAgIGlmICghYml0bWFwLkNyZWF0ZSgoaW50KShyZWN0LldpZHRoKCkgKiBzYSksIChpbnQpKHJlY3QuSGVpZ2h0KCkgKiBzZCksIEZYRElCXzhicHBNYXNrKSkgewotICAgICAgICAgICAgRlhfRnJlZShwR2x5cGhBbmRQb3MpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgYml0bWFwLkNsZWFyKDApOwotICAgICAgICBmb3IgKGludCBpQ2hhciA9IDA7IGlDaGFyIDwgdGV4dG9iai0+bV9uQ2hhcnM7IGlDaGFyICsrKSB7Ci0gICAgICAgICAgICBGWFRFWFRfR0xZUEhQT1MmIGdseXBoID0gcEdseXBoQW5kUG9zW2lDaGFyXTsKLSAgICAgICAgICAgIGlmIChnbHlwaC5tX3BHbHlwaCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiaXRtYXAuVHJhbnNmZXJCaXRtYXAoKGludCkoKGdseXBoLm1fT3JpZ2luWCArIGdseXBoLm1fcEdseXBoLT5tX0xlZnQgLSByZWN0LmxlZnQpICogc2EpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKChnbHlwaC5tX09yaWdpblkgLSBnbHlwaC5tX3BHbHlwaC0+bV9Ub3AgLSByZWN0LnRvcCkgKiBzZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGgubV9wR2x5cGgtPm1fQml0bWFwLkdldFdpZHRoKCksIGdseXBoLm1fcEdseXBoLT5tX0JpdG1hcC5HZXRIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2x5cGgubV9wR2x5cGgtPm1fQml0bWFwLCAwLCAwKTsKLSAgICAgICAgfQotICAgICAgICBtX3BEZXZpY2UtPlNldEJpdE1hc2soJmJpdG1hcCwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgZmlsbF9hcmdiKTsKLSAgICAgICAgRlhfRnJlZShwR2x5cGhBbmRQb3MpOwotICAgIH0KK0ZYX0JPT0wgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NUZXh0KGNvbnN0IENQREZfVGV4dE9iamVjdCogdGV4dG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhKiBwQ2xpcHBpbmdQYXRoKSB7CisgIGlmICh0ZXh0b2JqLT5tX25DaGFycyA9PSAwKSB7CiAgICAgcmV0dXJuIFRSVUU7Ci19Ci1jbGFzcyBDUERGX0NoYXJQb3NMaXN0Ci17Ci1wdWJsaWM6Ci0gICAgQ1BERl9DaGFyUG9zTGlzdCgpOwotICAgIH5DUERGX0NoYXJQb3NMaXN0KCk7Ci0gICAgdm9pZAkJCQlMb2FkKGludCBuQ2hhcnMsIEZYX0RXT1JEKiBwQ2hhckNvZGVzLCBGWF9GTE9BVCogcENoYXJQb3MsIENQREZfRm9udCogcEZvbnQsIEZYX0ZMT0FUIGZvbnRfc2l6ZSk7Ci0gICAgRlhURVhUX0NIQVJQT1MqCQltX3BDaGFyUG9zOwotICAgIEZYX0RXT1JECQkJbV9uQ2hhcnM7Ci19OwotRlhfRkxPQVQgX0NJRFRyYW5zZm9ybVRvRmxvYXQoRlhfQllURSBjaCk7Ci1DUERGX0NoYXJQb3NMaXN0OjpDUERGX0NoYXJQb3NMaXN0KCkKLXsKLSAgICBtX3BDaGFyUG9zID0gTlVMTDsKLX0KLUNQREZfQ2hhclBvc0xpc3Q6On5DUERGX0NoYXJQb3NMaXN0KCkKLXsKLSAgICBpZiAobV9wQ2hhclBvcykgewotICAgICAgICBGWF9GcmVlKG1fcENoYXJQb3MpOwotICAgIH0KLX0KLXZvaWQgQ1BERl9DaGFyUG9zTGlzdDo6TG9hZChpbnQgbkNoYXJzLCBGWF9EV09SRCogcENoYXJDb2RlcywgRlhfRkxPQVQqIHBDaGFyUG9zLCBDUERGX0ZvbnQqIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEZvbnRTaXplKQotewotICAgIG1fcENoYXJQb3MgPSBGWF9BbGxvYyhGWFRFWFRfQ0hBUlBPUywgbkNoYXJzKTsKLSAgICBtX25DaGFycyA9IDA7Ci0gICAgQ1BERl9DSURGb250KiBwQ0lERm9udCA9IHBGb250LT5HZXRDSURGb250KCk7Ci0gICAgRlhfQk9PTCBiVmVydFdyaXRpbmcgPSBwQ0lERm9udCAmJiBwQ0lERm9udC0+SXNWZXJ0V3JpdGluZygpOwotICAgIGZvciAoaW50IGlDaGFyID0gMDsgaUNoYXIgPCBuQ2hhcnM7IGlDaGFyICsrKSB7Ci0gICAgICAgIEZYX0RXT1JEIENoYXJDb2RlID0gbkNoYXJzID09IDEgPyAoRlhfRFdPUkQpKEZYX1VJTlRQVFIpcENoYXJDb2RlcyA6IHBDaGFyQ29kZXNbaUNoYXJdOwotICAgICAgICBpZiAoQ2hhckNvZGUgPT0gKEZYX0RXT1JEKSAtIDEpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEZYX0JPT0wgYlZlcnQgPSBGQUxTRTsKLSAgICAgICAgRlhURVhUX0NIQVJQT1MmIGNoYXJwb3MgPSBtX3BDaGFyUG9zW21fbkNoYXJzKytdOwotICAgICAgICBpZiAocENJREZvbnQpIHsKLSAgICAgICAgICAgIGNoYXJwb3MubV9iRm9udFN0eWxlID0gcENJREZvbnQtPklzRm9udFN0eWxlRnJvbUNoYXJDb2RlKENoYXJDb2RlKTsKLSAgICAgICAgfQotICAgICAgICBjaGFycG9zLm1fR2x5cGhJbmRleCA9IHBGb250LT5HbHlwaEZyb21DaGFyQ29kZShDaGFyQ29kZSwgJmJWZXJ0KTsKLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICAgICAgY2hhcnBvcy5tX0V4dEdJRCA9IHBGb250LT5HbHlwaEZyb21DaGFyQ29kZUV4dChDaGFyQ29kZSk7Ci0jZW5kaWYKLSAgICAgICAgaWYgKCFwRm9udC0+SXNFbWJlZGRlZCgpICYmIHBGb250LT5HZXRGb250VHlwZSgpICE9IFBERkZPTlRfQ0lERk9OVCkgewotICAgICAgICAgICAgY2hhcnBvcy5tX0ZvbnRDaGFyV2lkdGggPSBwRm9udC0+R2V0Q2hhcldpZHRoRihDaGFyQ29kZSk7CisgIH0KKyAgaW50IHRleHRfcmVuZGVyX21vZGUgPSB0ZXh0b2JqLT5tX1RleHRTdGF0ZS5HZXRPYmplY3QoKS0+bV9UZXh0TW9kZTsKKyAgaWYgKHRleHRfcmVuZGVyX21vZGUgPT0gMykgeworICAgIHJldHVybiBUUlVFOworICB9CisgIENQREZfRm9udCogcEZvbnQgPSB0ZXh0b2JqLT5tX1RleHRTdGF0ZS5HZXRGb250KCk7CisgIGlmIChwRm9udC0+R2V0Rm9udFR5cGUoKSA9PSBQREZGT05UX1RZUEUzKSB7CisgICAgcmV0dXJuIFByb2Nlc3NUeXBlM1RleHQodGV4dG9iaiwgcE9iajJEZXZpY2UpOworICB9CisgIEZYX0JPT0wgYkZpbGwgPSBGQUxTRSwgYlN0cm9rZSA9IEZBTFNFLCBiQ2xpcCA9IEZBTFNFOworICBpZiAocENsaXBwaW5nUGF0aCkgeworICAgIGJDbGlwID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKHRleHRfcmVuZGVyX21vZGUpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgYkZpbGwgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMToKKyAgICAgIGNhc2UgNToKKyAgICAgICAgaWYgKCFwRm9udC0+R2V0RmFjZSgpICYmCisgICAgICAgICAgICAhKHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX0dMWVBIUEFUSCkpIHsKKyAgICAgICAgICBiRmlsbCA9IFRSVUU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjaGFycG9zLm1fRm9udENoYXJXaWR0aCA9IDA7CisgICAgICAgICAgYlN0cm9rZSA9IFRSVUU7CiAgICAgICAgIH0KLSAgICAgICAgY2hhcnBvcy5tX09yaWdpblggPSBpQ2hhciA/IHBDaGFyUG9zW2lDaGFyIC0gMV0gOiAwOwotICAgICAgICBjaGFycG9zLm1fT3JpZ2luWSA9IDA7Ci0gICAgICAgIGNoYXJwb3MubV9iR2x5cGhBZGp1c3QgPSBGQUxTRTsKLSAgICAgICAgaWYgKHBDSURGb250ID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgaWYgKCFwRm9udC0+R2V0RmFjZSgpICYmCisgICAgICAgICAgICAhKHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX0dMWVBIUEFUSCkpIHsKKyAgICAgICAgICBiRmlsbCA9IFRSVUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYkZpbGwgPSBiU3Ryb2tlID0gVFJVRTsKICAgICAgICAgfQotICAgICAgICBGWF9XT1JEIENJRCA9IHBDSURGb250LT5DSURGcm9tQ2hhckNvZGUoQ2hhckNvZGUpOwotICAgICAgICBpZiAoYlZlcnRXcml0aW5nKSB7Ci0gICAgICAgICAgICBjaGFycG9zLm1fT3JpZ2luWSA9IGNoYXJwb3MubV9PcmlnaW5YOwotICAgICAgICAgICAgY2hhcnBvcy5tX09yaWdpblggPSAwOwotICAgICAgICAgICAgc2hvcnQgdngsIHZ5OwotICAgICAgICAgICAgcENJREZvbnQtPkdldFZlcnRPcmlnaW4oQ0lELCB2eCwgdnkpOwotICAgICAgICAgICAgY2hhcnBvcy5tX09yaWdpblggLT0gRm9udFNpemUgKiB2eCAvIDEwMDA7Ci0gICAgICAgICAgICBjaGFycG9zLm1fT3JpZ2luWSAtPSBGb250U2l6ZSAqIHZ5IC8gMTAwMDsKLSAgICAgICAgfQotICAgICAgICBGWF9MUENCWVRFIHBUcmFuc2Zvcm0gPSBwQ0lERm9udC0+R2V0Q0lEVHJhbnNmb3JtKENJRCk7Ci0gICAgICAgIGlmIChwVHJhbnNmb3JtICYmICFiVmVydCkgewotICAgICAgICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFswXSA9IF9DSURUcmFuc2Zvcm1Ub0Zsb2F0KHBUcmFuc2Zvcm1bMF0pOwotICAgICAgICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFsyXSA9IF9DSURUcmFuc2Zvcm1Ub0Zsb2F0KHBUcmFuc2Zvcm1bMl0pOwotICAgICAgICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFsxXSA9IF9DSURUcmFuc2Zvcm1Ub0Zsb2F0KHBUcmFuc2Zvcm1bMV0pOwotICAgICAgICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFszXSA9IF9DSURUcmFuc2Zvcm1Ub0Zsb2F0KHBUcmFuc2Zvcm1bM10pOwotICAgICAgICAgICAgY2hhcnBvcy5tX09yaWdpblggKz0gX0NJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVs0XSkgKiBGb250U2l6ZTsKLSAgICAgICAgICAgIGNoYXJwb3MubV9PcmlnaW5ZICs9IF9DSURUcmFuc2Zvcm1Ub0Zsb2F0KHBUcmFuc2Zvcm1bNV0pICogRm9udFNpemU7Ci0gICAgICAgICAgICBjaGFycG9zLm1fYkdseXBoQWRqdXN0ID0gVFJVRTsKLSAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzoKKyAgICAgIGNhc2UgNzoKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBiRmlsbCA9IFRSVUU7CiAgICAgfQorICB9CisgIEZYX0FSR0Igc3Ryb2tlX2FyZ2IgPSAwLCBmaWxsX2FyZ2IgPSAwOworICBGWF9CT09MIGJQYXR0ZXJuID0gRkFMU0U7CisgIGlmIChiU3Ryb2tlKSB7CisgICAgaWYgKHRleHRvYmotPm1fQ29sb3JTdGF0ZS5HZXRTdHJva2VDb2xvcigpLT5Jc1BhdHRlcm4oKSkgeworICAgICAgYlBhdHRlcm4gPSBUUlVFOworICAgIH0gZWxzZSB7CisgICAgICBzdHJva2VfYXJnYiA9IEdldFN0cm9rZUFyZ2IodGV4dG9iaik7CisgICAgfQorICB9CisgIGlmIChiRmlsbCkgeworICAgIGlmICh0ZXh0b2JqLT5tX0NvbG9yU3RhdGUuR2V0RmlsbENvbG9yKCktPklzUGF0dGVybigpKSB7CisgICAgICBiUGF0dGVybiA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIGZpbGxfYXJnYiA9IEdldEZpbGxBcmdiKHRleHRvYmopOworICAgIH0KKyAgfQorICBDRlhfTWF0cml4IHRleHRfbWF0cml4OworICB0ZXh0b2JqLT5HZXRUZXh0TWF0cml4KCZ0ZXh0X21hdHJpeCk7CisgIGlmIChJc0F2YWlsYWJsZU1hdHJpeCh0ZXh0X21hdHJpeCkgPT0gRkFMU0UpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBGWF9GTE9BVCBmb250X3NpemUgPSB0ZXh0b2JqLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpOworICBpZiAoYlBhdHRlcm4pIHsKKyAgICBEcmF3VGV4dFBhdGhXaXRoUGF0dGVybih0ZXh0b2JqLCBwT2JqMkRldmljZSwgcEZvbnQsIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dF9tYXRyaXgsIGJGaWxsLCBiU3Ryb2tlKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoYkNsaXAgfHwgYlN0cm9rZSkgeworICAgIGNvbnN0IENGWF9NYXRyaXgqIHBEZXZpY2VNYXRyaXggPSBwT2JqMkRldmljZTsKKyAgICBDRlhfTWF0cml4IGRldmljZV9tYXRyaXg7CisgICAgaWYgKGJTdHJva2UpIHsKKyAgICAgIGNvbnN0IEZYX0ZMT0FUKiBwQ1RNID0gdGV4dG9iai0+bV9UZXh0U3RhdGUuR2V0T2JqZWN0KCktPm1fQ1RNOworICAgICAgaWYgKHBDVE1bMF0gIT0gMS4wZiB8fCBwQ1RNWzNdICE9IDEuMGYpIHsKKyAgICAgICAgQ0ZYX01hdHJpeCBjdG0ocENUTVswXSwgcENUTVsxXSwgcENUTVsyXSwgcENUTVszXSwgMCwgMCk7CisgICAgICAgIHRleHRfbWF0cml4LkNvbmNhdEludmVyc2UoY3RtKTsKKyAgICAgICAgZGV2aWNlX21hdHJpeC5Db3B5KGN0bSk7CisgICAgICAgIGRldmljZV9tYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7CisgICAgICAgIHBEZXZpY2VNYXRyaXggPSAmZGV2aWNlX21hdHJpeDsKKyAgICAgIH0KKyAgICB9CisgICAgaW50IGZsYWcgPSAwOworICAgIGlmIChiU3Ryb2tlICYmIGJGaWxsKSB7CisgICAgICBmbGFnIHw9IEZYX0ZJTExfU1RST0tFOworICAgICAgZmxhZyB8PSBGWF9TVFJPS0VfVEVYVF9NT0RFOworICAgIH0KKyAgICBjb25zdCBDUERGX0dlbmVyYWxTdGF0ZURhdGEqIHBHZW5lcmFsRGF0YSA9CisgICAgICAgICgoQ1BERl9QYWdlT2JqZWN0Kil0ZXh0b2JqKS0+bV9HZW5lcmFsU3RhdGU7CisgICAgaWYgKHBHZW5lcmFsRGF0YSAmJiBwR2VuZXJhbERhdGEtPm1fU3Ryb2tlQWRqdXN0KSB7CisgICAgICBmbGFnIHw9IEZYX1NUUk9LRV9BREpVU1Q7CisgICAgfQorICAgIGlmIChtX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9OT1RFWFRTTU9PVEgpIHsKKyAgICAgIGZsYWcgfD0gRlhGSUxMX05PUEFUSFNNT09USDsKKyAgICB9CisgICAgcmV0dXJuIENQREZfVGV4dFJlbmRlcmVyOjpEcmF3VGV4dFBhdGgoCisgICAgICAgIG1fcERldmljZSwgdGV4dG9iai0+bV9uQ2hhcnMsIHRleHRvYmotPm1fcENoYXJDb2RlcywKKyAgICAgICAgdGV4dG9iai0+bV9wQ2hhclBvcywgcEZvbnQsIGZvbnRfc2l6ZSwgJnRleHRfbWF0cml4LCBwRGV2aWNlTWF0cml4LAorICAgICAgICB0ZXh0b2JqLT5tX0dyYXBoU3RhdGUsIGZpbGxfYXJnYiwgc3Ryb2tlX2FyZ2IsIHBDbGlwcGluZ1BhdGgsIGZsYWcpOworICB9CisgIHRleHRfbWF0cml4LkNvbmNhdCgqcE9iajJEZXZpY2UpOworICByZXR1cm4gQ1BERl9UZXh0UmVuZGVyZXI6OkRyYXdOb3JtYWxUZXh0KAorICAgICAgbV9wRGV2aWNlLCB0ZXh0b2JqLT5tX25DaGFycywgdGV4dG9iai0+bV9wQ2hhckNvZGVzLCB0ZXh0b2JqLT5tX3BDaGFyUG9zLAorICAgICAgcEZvbnQsIGZvbnRfc2l6ZSwgJnRleHRfbWF0cml4LCBmaWxsX2FyZ2IsICZtX09wdGlvbnMpOwogfQotRlhfQk9PTCBDUERGX1RleHRSZW5kZXJlcjo6RHJhd1RleHRQYXRoKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGludCBuQ2hhcnMsIEZYX0RXT1JEKiBwQ2hhckNvZGVzLCBGWF9GTE9BVCogcENoYXJQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwgRlhfRkxPQVQgZm9udF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBUZXh0MlVzZXIsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwKK0NQREZfVHlwZTNDYWNoZSogQ1BERl9SZW5kZXJTdGF0dXM6OkdldENhY2hlZFR5cGUzKENQREZfVHlwZTNGb250KiBwRm9udCkgeworICBpZiAoIXBGb250LT5tX3BEb2N1bWVudCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHBGb250LT5tX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+R2V0Rm9udChwRm9udC0+R2V0Rm9udERpY3QoKSwgRkFMU0UpOworICByZXR1cm4gcEZvbnQtPm1fcERvY3VtZW50LT5HZXRSZW5kZXJEYXRhKCktPkdldENhY2hlZFR5cGUzKHBGb250KTsKK30KK3N0YXRpYyB2b2lkIFJlbGVhc2VDYWNoZWRUeXBlMyhDUERGX1R5cGUzRm9udCogcEZvbnQpIHsKKyAgaWYgKCFwRm9udC0+bV9wRG9jdW1lbnQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgcEZvbnQtPm1fcERvY3VtZW50LT5HZXRSZW5kZXJEYXRhKCktPlJlbGVhc2VDYWNoZWRUeXBlMyhwRm9udCk7CisgIHBGb250LT5tX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+UmVsZWFzZUZvbnQocEZvbnQtPkdldEZvbnREaWN0KCkpOworfQorRlhfQk9PTCBDUERGX1R5cGUzQ2hhcjo6TG9hZEJpdG1hcChDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0KSB7CisgIGlmIChtX3BCaXRtYXAgfHwgIW1fcEZvcm0pIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAobV9wRm9ybS0+Q291bnRPYmplY3RzKCkgPT0gMSAmJiAhbV9iQ29sb3JlZCkgeworICAgIENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmogPQorICAgICAgICBtX3BGb3JtLT5HZXRPYmplY3RBdChtX3BGb3JtLT5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCkpOworICAgIGlmIChwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfSU1BR0UpIHsKKyAgICAgIENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZSA9IChDUERGX0ltYWdlT2JqZWN0KilwUGFnZU9iajsKKyAgICAgIG1fSW1hZ2VNYXRyaXggPSBwSW1hZ2UtPm1fTWF0cml4OworICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSA9IHBJbWFnZS0+bV9wSW1hZ2UtPkxvYWRESUJTb3VyY2UoKTsKKyAgICAgIGlmIChwU291cmNlKSB7CisgICAgICAgIG1fcEJpdG1hcCA9IHBTb3VyY2UtPkNsb25lKCk7CisgICAgICAgIGRlbGV0ZSBwU291cmNlOworICAgICAgfQorICAgICAgZGVsZXRlIG1fcEZvcm07CisgICAgICBtX3BGb3JtID0gTlVMTDsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitjbGFzcyBDUERGX1JlZlR5cGUzQ2FjaGUgeworIHB1YmxpYzoKKyAgQ1BERl9SZWZUeXBlM0NhY2hlKENQREZfVHlwZTNGb250KiBwVHlwZTNGb250KSB7CisgICAgbV9kd0NvdW50ID0gMDsKKyAgICBtX3BUeXBlM0ZvbnQgPSBwVHlwZTNGb250OworICB9CisgIH5DUERGX1JlZlR5cGUzQ2FjaGUoKSB7CisgICAgd2hpbGUgKG1fZHdDb3VudC0tKSB7CisgICAgICBSZWxlYXNlQ2FjaGVkVHlwZTMobV9wVHlwZTNGb250KTsKKyAgICB9CisgIH0KKyAgRlhfRFdPUkQgbV9kd0NvdW50OworICBDUERGX1R5cGUzRm9udCogbV9wVHlwZTNGb250OworfTsKK0ZYX0JPT0wgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NUeXBlM1RleHQoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiB0ZXh0b2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSkgeworICBDUERGX1R5cGUzRm9udCogcFR5cGUzRm9udCA9IHRleHRvYmotPm1fVGV4dFN0YXRlLkdldEZvbnQoKS0+R2V0VHlwZTNGb250KCk7CisgIGZvciAoaW50IGogPSAwOyBqIDwgbV9UeXBlM0ZvbnRDYWNoZS5HZXRTaXplKCk7IGorKykgeworICAgIGlmIChtX1R5cGUzRm9udENhY2hlLkdldEF0KGopID09IHBUeXBlM0ZvbnQpCisgICAgICByZXR1cm4gVFJVRTsKKyAgfQorICBDRlhfTWF0cml4IGRDVE0gPSBtX3BEZXZpY2UtPkdldENUTSgpOworICBGWF9GTE9BVCBzYSA9IEZYU1lTX2ZhYnMoZENUTS5hKTsKKyAgRlhfRkxPQVQgc2QgPSBGWFNZU19mYWJzKGRDVE0uZCk7CisgIENGWF9NYXRyaXggdGV4dF9tYXRyaXg7CisgIHRleHRvYmotPkdldFRleHRNYXRyaXgoJnRleHRfbWF0cml4KTsKKyAgQ0ZYX01hdHJpeCBjaGFyX21hdHJpeCA9IHBUeXBlM0ZvbnQtPkdldEZvbnRNYXRyaXgoKTsKKyAgRlhfRkxPQVQgZm9udF9zaXplID0gdGV4dG9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKTsKKyAgY2hhcl9tYXRyaXguU2NhbGUoZm9udF9zaXplLCBmb250X3NpemUpOworICBGWF9BUkdCIGZpbGxfYXJnYiA9IEdldEZpbGxBcmdiKHRleHRvYmosIFRSVUUpOworICBpbnQgZmlsbF9hbHBoYSA9IEZYQVJHQl9BKGZpbGxfYXJnYik7CisgIGludCBkZXZpY2VfY2xhc3MgPSBtX3BEZXZpY2UtPkdldERldmljZUNsYXNzKCk7CisgIEZYVEVYVF9HTFlQSFBPUyogcEdseXBoQW5kUG9zID0gTlVMTDsKKyAgaWYgKGRldmljZV9jbGFzcyA9PSBGWERDX0RJU1BMQVkpIHsKKyAgICBwR2x5cGhBbmRQb3MgPSBGWF9BbGxvYyhGWFRFWFRfR0xZUEhQT1MsIHRleHRvYmotPm1fbkNoYXJzKTsKKyAgfSBlbHNlIGlmIChmaWxsX2FscGhhIDwgMjU1KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfUmVmVHlwZTNDYWNoZSByZWZUeXBlQ2FjaGUocFR5cGUzRm9udCk7CisgIEZYX0RXT1JEKiBwQ2hhcnMgPSB0ZXh0b2JqLT5tX3BDaGFyQ29kZXM7CisgIGlmICh0ZXh0b2JqLT5tX25DaGFycyA9PSAxKSB7CisgICAgcENoYXJzID0gKEZYX0RXT1JEKikoJnRleHRvYmotPm1fcENoYXJDb2Rlcyk7CisgIH0KKyAgZm9yIChpbnQgaUNoYXIgPSAwOyBpQ2hhciA8IHRleHRvYmotPm1fbkNoYXJzOyBpQ2hhcisrKSB7CisgICAgRlhfRFdPUkQgY2hhcmNvZGUgPSBwQ2hhcnNbaUNoYXJdOworICAgIGlmIChjaGFyY29kZSA9PSAoRlhfRFdPUkQpLTEpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBDUERGX1R5cGUzQ2hhciogcFR5cGUzQ2hhciA9IHBUeXBlM0ZvbnQtPkxvYWRDaGFyKGNoYXJjb2RlKTsKKyAgICBpZiAoIXBUeXBlM0NoYXIpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBDRlhfTWF0cml4IG1hdHJpeCA9IGNoYXJfbWF0cml4OworICAgIG1hdHJpeC5lICs9IGlDaGFyID8gdGV4dG9iai0+bV9wQ2hhclBvc1tpQ2hhciAtIDFdIDogMDsKKyAgICBtYXRyaXguQ29uY2F0KHRleHRfbWF0cml4KTsKKyAgICBtYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7CisgICAgaWYgKCFwVHlwZTNDaGFyLT5Mb2FkQml0bWFwKG1fcENvbnRleHQpKSB7CisgICAgICBpZiAocEdseXBoQW5kUG9zKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNoYXI7IGkrKykgeworICAgICAgICAgIEZYVEVYVF9HTFlQSFBPUyYgZ2x5cGggPSBwR2x5cGhBbmRQb3NbaV07CisgICAgICAgICAgaWYgKCFnbHlwaC5tX3BHbHlwaCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIG1fcERldmljZS0+U2V0Qml0TWFzaygmZ2x5cGgubV9wR2x5cGgtPm1fQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaC5tX09yaWdpblggKyBnbHlwaC5tX3BHbHlwaC0+bV9MZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaC5tX09yaWdpblkgLSBnbHlwaC5tX3BHbHlwaC0+bV9Ub3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfYXJnYik7CisgICAgICAgIH0KKyAgICAgICAgRlhfRnJlZShwR2x5cGhBbmRQb3MpOworICAgICAgICBwR2x5cGhBbmRQb3MgPSBOVUxMOworICAgICAgfQorICAgICAgQ1BERl9HcmFwaGljU3RhdGVzKiBwU3RhdGVzID0gQ2xvbmVPYmpTdGF0ZXModGV4dG9iaiwgRkFMU0UpOworICAgICAgQ1BERl9SZW5kZXJPcHRpb25zIE9wdGlvbnMgPSBtX09wdGlvbnM7CisgICAgICBPcHRpb25zLm1fRmxhZ3MgfD0gUkVOREVSX0ZPUkNFX0hBTEZUT05FIHwgUkVOREVSX1JFQ1RfQUE7CisgICAgICBPcHRpb25zLm1fRmxhZ3MgJj0gflJFTkRFUl9GT1JDRV9ET1dOU0FNUExFOworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlID0gTlVMTDsKKyAgICAgIGlmIChwVHlwZTNDaGFyLT5tX3BGb3JtICYmIHBUeXBlM0NoYXItPm1fcEZvcm0tPm1fcEZvcm1EaWN0KSB7CisgICAgICAgIHBGb3JtUmVzb3VyY2UgPSBwVHlwZTNDaGFyLT5tX3BGb3JtLT5tX3BGb3JtRGljdC0+R2V0RGljdCgiUmVzb3VyY2VzIik7CisgICAgICB9CisgICAgICBpZiAoZmlsbF9hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMgc3RhdHVzOworICAgICAgICBzdGF0dXMuSW5pdGlhbGl6ZShtX3BDb250ZXh0LCBtX3BEZXZpY2UsIE5VTEwsIE5VTEwsIHRoaXMsIHBTdGF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZPcHRpb25zLCBwVHlwZTNDaGFyLT5tX3BGb3JtLT5tX1RyYW5zcGFyZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iRHJvcE9iamVjdHMsIHBGb3JtUmVzb3VyY2UsIEZBTFNFLCBwVHlwZTNDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2FyZ2IpOworICAgICAgICBzdGF0dXMubV9UeXBlM0ZvbnRDYWNoZS5BcHBlbmQobV9UeXBlM0ZvbnRDYWNoZSk7CisgICAgICAgIHN0YXR1cy5tX1R5cGUzRm9udENhY2hlLkFkZChwVHlwZTNGb250KTsKKyAgICAgICAgbV9wRGV2aWNlLT5TYXZlU3RhdGUoKTsKKyAgICAgICAgc3RhdHVzLlJlbmRlck9iamVjdExpc3QocFR5cGUzQ2hhci0+bV9wRm9ybSwgJm1hdHJpeCk7CisgICAgICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBDRlhfRmxvYXRSZWN0IHJlY3RfZiA9IHBUeXBlM0NoYXItPm1fcEZvcm0tPkNhbGNCb3VuZGluZ0JveCgpOworICAgICAgICByZWN0X2YuVHJhbnNmb3JtKCZtYXRyaXgpOworICAgICAgICBGWF9SRUNUIHJlY3QgPSByZWN0X2YuR2V0T3V0dGVyUmVjdCgpOworICAgICAgICBDRlhfRnhnZURldmljZSBiaXRtYXBfZGV2aWNlOworICAgICAgICBpZiAoIWJpdG1hcF9kZXZpY2UuQ3JlYXRlKChpbnQpKHJlY3QuV2lkdGgoKSAqIHNhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShyZWN0LkhlaWdodCgpICogc2QpLCBGWERJQl9BcmdiKSkgeworICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICAgIGJpdG1hcF9kZXZpY2UuR2V0Qml0bWFwKCktPkNsZWFyKDApOworICAgICAgICBDUERGX1JlbmRlclN0YXR1cyBzdGF0dXM7CisgICAgICAgIHN0YXR1cy5Jbml0aWFsaXplKG1fcENvbnRleHQsICZiaXRtYXBfZGV2aWNlLCBOVUxMLCBOVUxMLCB0aGlzLCBwU3RhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmT3B0aW9ucywgcFR5cGUzQ2hhci0+bV9wRm9ybS0+bV9UcmFuc3BhcmVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkRyb3BPYmplY3RzLCBwRm9ybVJlc291cmNlLCBGQUxTRSwgcFR5cGUzQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9hcmdiKTsKKyAgICAgICAgc3RhdHVzLm1fVHlwZTNGb250Q2FjaGUuQXBwZW5kKG1fVHlwZTNGb250Q2FjaGUpOworICAgICAgICBzdGF0dXMubV9UeXBlM0ZvbnRDYWNoZS5BZGQocFR5cGUzRm9udCk7CisgICAgICAgIG1hdHJpeC5UcmFuc2xhdGVJKC1yZWN0LmxlZnQsIC1yZWN0LnRvcCk7CisgICAgICAgIG1hdHJpeC5TY2FsZShzYSwgc2QpOworICAgICAgICBzdGF0dXMuUmVuZGVyT2JqZWN0TGlzdChwVHlwZTNDaGFyLT5tX3BGb3JtLCAmbWF0cml4KTsKKyAgICAgICAgbV9wRGV2aWNlLT5TZXRESUJpdHMoYml0bWFwX2RldmljZS5HZXRCaXRtYXAoKSwgcmVjdC5sZWZ0LCByZWN0LnRvcCk7CisgICAgICB9CisgICAgICBkZWxldGUgcFN0YXRlczsKKyAgICB9IGVsc2UgaWYgKHBUeXBlM0NoYXItPm1fcEJpdG1hcCkgeworICAgICAgaWYgKGRldmljZV9jbGFzcyA9PSBGWERDX0RJU1BMQVkpIHsKKyAgICAgICAgQ1BERl9UeXBlM0NhY2hlKiBwQ2FjaGUgPSBHZXRDYWNoZWRUeXBlMyhwVHlwZTNGb250KTsKKyAgICAgICAgcmVmVHlwZUNhY2hlLm1fZHdDb3VudCsrOworICAgICAgICBDRlhfR2x5cGhCaXRtYXAqIHBCaXRtYXAgPSBwQ2FjaGUtPkxvYWRHbHlwaChjaGFyY29kZSwgJm1hdHJpeCwgc2EsIHNkKTsKKyAgICAgICAgaWYgKCFwQml0bWFwKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaW50IG9yaWdpbl94ID0gRlhTWVNfcm91bmQobWF0cml4LmUpOworICAgICAgICBpbnQgb3JpZ2luX3kgPSBGWFNZU19yb3VuZChtYXRyaXguZik7CisgICAgICAgIGlmIChwR2x5cGhBbmRQb3MpIHsKKyAgICAgICAgICBwR2x5cGhBbmRQb3NbaUNoYXJdLm1fcEdseXBoID0gcEJpdG1hcDsKKyAgICAgICAgICBwR2x5cGhBbmRQb3NbaUNoYXJdLm1fT3JpZ2luWCA9IG9yaWdpbl94OworICAgICAgICAgIHBHbHlwaEFuZFBvc1tpQ2hhcl0ubV9PcmlnaW5ZID0gb3JpZ2luX3k7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbV9wRGV2aWNlLT5TZXRCaXRNYXNrKCZwQml0bWFwLT5tX0JpdG1hcCwgb3JpZ2luX3ggKyBwQml0bWFwLT5tX0xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbl95IC0gcEJpdG1hcC0+bV9Ub3AsIGZpbGxfYXJnYik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENGWF9NYXRyaXggaW1hZ2VfbWF0cml4ID0gcFR5cGUzQ2hhci0+bV9JbWFnZU1hdHJpeDsKKyAgICAgICAgaW1hZ2VfbWF0cml4LkNvbmNhdChtYXRyaXgpOworICAgICAgICBDUERGX0ltYWdlUmVuZGVyZXIgcmVuZGVyZXI7CisgICAgICAgIGlmIChyZW5kZXJlci5TdGFydCh0aGlzLCBwVHlwZTNDaGFyLT5tX3BCaXRtYXAsIGZpbGxfYXJnYiwgMjU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlX21hdHJpeCwgMCwgRkFMU0UpKSB7CisgICAgICAgICAgcmVuZGVyZXIuQ29udGludWUoTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFyZW5kZXJlci5tX1Jlc3VsdCkgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAocEdseXBoQW5kUG9zKSB7CisgICAgRlhfUkVDVCByZWN0ID0KKyAgICAgICAgRlhHRV9HZXRHbHlwaHNCQm94KHBHbHlwaEFuZFBvcywgdGV4dG9iai0+bV9uQ2hhcnMsIDAsIHNhLCBzZCk7CisgICAgQ0ZYX0RJQml0bWFwIGJpdG1hcDsKKyAgICBpZiAoIWJpdG1hcC5DcmVhdGUoKGludCkocmVjdC5XaWR0aCgpICogc2EpLCAoaW50KShyZWN0LkhlaWdodCgpICogc2QpLAorICAgICAgICAgICAgICAgICAgICAgICBGWERJQl84YnBwTWFzaykpIHsKKyAgICAgIEZYX0ZyZWUocEdseXBoQW5kUG9zKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBiaXRtYXAuQ2xlYXIoMCk7CisgICAgZm9yIChpbnQgaUNoYXIgPSAwOyBpQ2hhciA8IHRleHRvYmotPm1fbkNoYXJzOyBpQ2hhcisrKSB7CisgICAgICBGWFRFWFRfR0xZUEhQT1MmIGdseXBoID0gcEdseXBoQW5kUG9zW2lDaGFyXTsKKyAgICAgIGlmICghZ2x5cGgubV9wR2x5cGgpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBiaXRtYXAuVHJhbnNmZXJCaXRtYXAoCisgICAgICAgICAgKGludCkoKGdseXBoLm1fT3JpZ2luWCArIGdseXBoLm1fcEdseXBoLT5tX0xlZnQgLSByZWN0LmxlZnQpICogc2EpLAorICAgICAgICAgIChpbnQpKChnbHlwaC5tX09yaWdpblkgLSBnbHlwaC5tX3BHbHlwaC0+bV9Ub3AgLSByZWN0LnRvcCkgKiBzZCksCisgICAgICAgICAgZ2x5cGgubV9wR2x5cGgtPm1fQml0bWFwLkdldFdpZHRoKCksCisgICAgICAgICAgZ2x5cGgubV9wR2x5cGgtPm1fQml0bWFwLkdldEhlaWdodCgpLCAmZ2x5cGgubV9wR2x5cGgtPm1fQml0bWFwLCAwLAorICAgICAgICAgIDApOworICAgIH0KKyAgICBtX3BEZXZpY2UtPlNldEJpdE1hc2soJmJpdG1hcCwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgZmlsbF9hcmdiKTsKKyAgICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitjbGFzcyBDUERGX0NoYXJQb3NMaXN0IHsKKyBwdWJsaWM6CisgIENQREZfQ2hhclBvc0xpc3QoKTsKKyAgfkNQREZfQ2hhclBvc0xpc3QoKTsKKyAgdm9pZCBMb2FkKGludCBuQ2hhcnMsCisgICAgICAgICAgICBGWF9EV09SRCogcENoYXJDb2RlcywKKyAgICAgICAgICAgIEZYX0ZMT0FUKiBwQ2hhclBvcywKKyAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsCisgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUpOworICBGWFRFWFRfQ0hBUlBPUyogbV9wQ2hhclBvczsKKyAgRlhfRFdPUkQgbV9uQ2hhcnM7Cit9OworCitDUERGX0NoYXJQb3NMaXN0OjpDUERGX0NoYXJQb3NMaXN0KCkgeworICBtX3BDaGFyUG9zID0gTlVMTDsKK30KK0NQREZfQ2hhclBvc0xpc3Q6On5DUERGX0NoYXJQb3NMaXN0KCkgeworICBGWF9GcmVlKG1fcENoYXJQb3MpOworfQordm9pZCBDUERGX0NoYXJQb3NMaXN0OjpMb2FkKGludCBuQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBDaGFyQ29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgRm9udFNpemUpIHsKKyAgbV9wQ2hhclBvcyA9IEZYX0FsbG9jKEZYVEVYVF9DSEFSUE9TLCBuQ2hhcnMpOworICBtX25DaGFycyA9IDA7CisgIENQREZfQ0lERm9udCogcENJREZvbnQgPSBwRm9udC0+R2V0Q0lERm9udCgpOworICBGWF9CT09MIGJWZXJ0V3JpdGluZyA9IHBDSURGb250ICYmIHBDSURGb250LT5Jc1ZlcnRXcml0aW5nKCk7CisgIGZvciAoaW50IGlDaGFyID0gMDsgaUNoYXIgPCBuQ2hhcnM7IGlDaGFyKyspIHsKKyAgICBGWF9EV09SRCBDaGFyQ29kZSA9CisgICAgICAgIG5DaGFycyA9PSAxID8gKEZYX0RXT1JEKSh1aW50cHRyX3QpcENoYXJDb2RlcyA6IHBDaGFyQ29kZXNbaUNoYXJdOworICAgIGlmIChDaGFyQ29kZSA9PSAoRlhfRFdPUkQpLTEpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBGWF9CT09MIGJWZXJ0ID0gRkFMU0U7CisgICAgRlhURVhUX0NIQVJQT1MmIGNoYXJwb3MgPSBtX3BDaGFyUG9zW21fbkNoYXJzKytdOworICAgIGlmIChwQ0lERm9udCkgeworICAgICAgY2hhcnBvcy5tX2JGb250U3R5bGUgPSBwQ0lERm9udC0+SXNGb250U3R5bGVGcm9tQ2hhckNvZGUoQ2hhckNvZGUpOworICAgIH0KKyAgICBjaGFycG9zLm1fR2x5cGhJbmRleCA9IHBGb250LT5HbHlwaEZyb21DaGFyQ29kZShDaGFyQ29kZSwgJmJWZXJ0KTsKKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworICAgIGNoYXJwb3MubV9FeHRHSUQgPSBwRm9udC0+R2x5cGhGcm9tQ2hhckNvZGVFeHQoQ2hhckNvZGUpOworI2VuZGlmCisgICAgaWYgKCFwRm9udC0+SXNFbWJlZGRlZCgpICYmIHBGb250LT5HZXRGb250VHlwZSgpICE9IFBERkZPTlRfQ0lERk9OVCkgeworICAgICAgY2hhcnBvcy5tX0ZvbnRDaGFyV2lkdGggPSBwRm9udC0+R2V0Q2hhcldpZHRoRihDaGFyQ29kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNoYXJwb3MubV9Gb250Q2hhcldpZHRoID0gMDsKKyAgICB9CisgICAgY2hhcnBvcy5tX09yaWdpblggPSBpQ2hhciA/IHBDaGFyUG9zW2lDaGFyIC0gMV0gOiAwOworICAgIGNoYXJwb3MubV9PcmlnaW5ZID0gMDsKKyAgICBjaGFycG9zLm1fYkdseXBoQWRqdXN0ID0gRkFMU0U7CisgICAgaWYgKCFwQ0lERm9udCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIEZYX1dPUkQgQ0lEID0gcENJREZvbnQtPkNJREZyb21DaGFyQ29kZShDaGFyQ29kZSk7CisgICAgaWYgKGJWZXJ0V3JpdGluZykgeworICAgICAgY2hhcnBvcy5tX09yaWdpblkgPSBjaGFycG9zLm1fT3JpZ2luWDsKKyAgICAgIGNoYXJwb3MubV9PcmlnaW5YID0gMDsKKyAgICAgIHNob3J0IHZ4LCB2eTsKKyAgICAgIHBDSURGb250LT5HZXRWZXJ0T3JpZ2luKENJRCwgdngsIHZ5KTsKKyAgICAgIGNoYXJwb3MubV9PcmlnaW5YIC09IEZvbnRTaXplICogdnggLyAxMDAwOworICAgICAgY2hhcnBvcy5tX09yaWdpblkgLT0gRm9udFNpemUgKiB2eSAvIDEwMDA7CisgICAgfQorICAgIGNvbnN0IHVpbnQ4X3QqIHBUcmFuc2Zvcm0gPSBwQ0lERm9udC0+R2V0Q0lEVHJhbnNmb3JtKENJRCk7CisgICAgaWYgKHBUcmFuc2Zvcm0gJiYgIWJWZXJ0KSB7CisgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzBdID0gcENJREZvbnQtPkNJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVswXSk7CisgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzJdID0gcENJREZvbnQtPkNJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVsyXSk7CisgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzFdID0gcENJREZvbnQtPkNJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVsxXSk7CisgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzNdID0gcENJREZvbnQtPkNJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVszXSk7CisgICAgICBjaGFycG9zLm1fT3JpZ2luWCArPQorICAgICAgICAgIHBDSURGb250LT5DSURUcmFuc2Zvcm1Ub0Zsb2F0KHBUcmFuc2Zvcm1bNF0pICogRm9udFNpemU7CisgICAgICBjaGFycG9zLm1fT3JpZ2luWSArPQorICAgICAgICAgIHBDSURGb250LT5DSURUcmFuc2Zvcm1Ub0Zsb2F0KHBUcmFuc2Zvcm1bNV0pICogRm9udFNpemU7CisgICAgICBjaGFycG9zLm1fYkdseXBoQWRqdXN0ID0gVFJVRTsKKyAgICB9CisgIH0KK30KK0ZYX0JPT0wgQ1BERl9UZXh0UmVuZGVyZXI6OkRyYXdUZXh0UGF0aChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBDaGFyQ29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBUZXh0MlVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBmaWxsX2FyZ2IsIEZYX0FSR0Igc3Ryb2tlX2FyZ2IsIENGWF9QYXRoRGF0YSogcENsaXBwaW5nUGF0aCwgaW50IG5GbGFnKQotewotICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSA9IHBGb250LT5tX3BEb2N1bWVudCA/IHBGb250LT5tX3BEb2N1bWVudC0+R2V0UmVuZGVyRGF0YSgpLT5HZXRGb250Q2FjaGUoKSA6IE5VTEw7Ci0gICAgQ1BERl9DaGFyUG9zTGlzdCBDaGFyUG9zTGlzdDsKLSAgICBDaGFyUG9zTGlzdC5Mb2FkKG5DaGFycywgcENoYXJDb2RlcywgcENoYXJQb3MsIHBGb250LCBmb250X3NpemUpOwotICAgIHJldHVybiBwRGV2aWNlLT5EcmF3VGV4dFBhdGgoQ2hhclBvc0xpc3QubV9uQ2hhcnMsIENoYXJQb3NMaXN0Lm1fcENoYXJQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEZvbnQtPm1fRm9udCwgcENhY2hlLCBmb250X3NpemUsIHBUZXh0MlVzZXIsIHBVc2VyMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBHcmFwaFN0YXRlLCBmaWxsX2FyZ2IsIHN0cm9rZV9hcmdiLCBwQ2xpcHBpbmdQYXRoLCBuRmxhZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBmaWxsX2FyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBzdHJva2VfYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEqIHBDbGlwcGluZ1BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5GbGFnKSB7CisgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSA9CisgICAgICBwRm9udC0+bV9wRG9jdW1lbnQgPyBwRm9udC0+bV9wRG9jdW1lbnQtPkdldFJlbmRlckRhdGEoKS0+R2V0Rm9udENhY2hlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7CisgIENQREZfQ2hhclBvc0xpc3QgQ2hhclBvc0xpc3Q7CisgIENoYXJQb3NMaXN0LkxvYWQobkNoYXJzLCBwQ2hhckNvZGVzLCBwQ2hhclBvcywgcEZvbnQsIGZvbnRfc2l6ZSk7CisgIHJldHVybiBwRGV2aWNlLT5EcmF3VGV4dFBhdGgoQ2hhclBvc0xpc3QubV9uQ2hhcnMsIENoYXJQb3NMaXN0Lm1fcENoYXJQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBGb250LT5tX0ZvbnQsIHBDYWNoZSwgZm9udF9zaXplLCBwVGV4dDJVc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyMkRldmljZSwgcEdyYXBoU3RhdGUsIGZpbGxfYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VfYXJnYiwgcENsaXBwaW5nUGF0aCwgbkZsYWcpOwogfQotdm9pZCBDUERGX1RleHRSZW5kZXJlcjo6RHJhd1RleHRTdHJpbmcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgaW50IGxlZnQsIGludCB0b3AsIENQREZfRm9udCogcEZvbnQsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyLCBGWF9BUkdCIGFyZ2IpCi17Ci0gICAgRlhfUkVDVCBmb250X2Jib3g7Ci0gICAgcEZvbnQtPkdldEZvbnRCQm94KGZvbnRfYmJveCk7Ci0gICAgRlhfRkxPQVQgZm9udF9zaXplID0gKEZYX0ZMT0FUKWhlaWdodCAqIDEwMDAuMGYgLyAoRlhfRkxPQVQpKGZvbnRfYmJveC50b3AgLSBmb250X2Jib3guYm90dG9tKTsKLSAgICBGWF9GTE9BVCBvcmlnaW5feCA9IChGWF9GTE9BVClsZWZ0OwotICAgIEZYX0ZMT0FUIG9yaWdpbl95ID0gKEZYX0ZMT0FUKXRvcCArIGZvbnRfc2l6ZSAqIChGWF9GTE9BVClmb250X2Jib3gudG9wIC8gMTAwMC4wZjsKLSAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeCgxLjBmLCAwLCAwLCAtMS4wZiwgMCwgMCk7Ci0gICAgRHJhd1RleHRTdHJpbmcocERldmljZSwgb3JpZ2luX3gsIG9yaWdpbl95LCBwRm9udCwgZm9udF9zaXplLCAmbWF0cml4LCBzdHIsIGFyZ2IpOwordm9pZCBDUERGX1RleHRSZW5kZXJlcjo6RHJhd1RleHRTdHJpbmcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYikgeworICBGWF9SRUNUIGZvbnRfYmJveDsKKyAgcEZvbnQtPkdldEZvbnRCQm94KGZvbnRfYmJveCk7CisgIEZYX0ZMT0FUIGZvbnRfc2l6ZSA9CisgICAgICAoRlhfRkxPQVQpaGVpZ2h0ICogMTAwMC4wZiAvIChGWF9GTE9BVCkoZm9udF9iYm94LnRvcCAtIGZvbnRfYmJveC5ib3R0b20pOworICBGWF9GTE9BVCBvcmlnaW5feCA9IChGWF9GTE9BVClsZWZ0OworICBGWF9GTE9BVCBvcmlnaW5feSA9CisgICAgICAoRlhfRkxPQVQpdG9wICsgZm9udF9zaXplICogKEZYX0ZMT0FUKWZvbnRfYmJveC50b3AgLyAxMDAwLjBmOworICBDRlhfTWF0cml4IG1hdHJpeCgxLjBmLCAwLCAwLCAtMS4wZiwgMCwgMCk7CisgIERyYXdUZXh0U3RyaW5nKHBEZXZpY2UsIG9yaWdpbl94LCBvcmlnaW5feSwgcEZvbnQsIGZvbnRfc2l6ZSwgJm1hdHJpeCwgc3RyLAorICAgICAgICAgICAgICAgICBhcmdiKTsKIH0KLXZvaWQgQ1BERl9UZXh0UmVuZGVyZXI6OkRyYXdUZXh0U3RyaW5nKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIEZYX0ZMT0FUIG9yaWdpbl94LCBGWF9GTE9BVCBvcmlnaW5feSwgQ1BERl9Gb250KiBwRm9udCwgRlhfRkxPQVQgZm9udF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0ciwgRlhfQVJHQiBmaWxsX2FyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIHN0cm9rZV9hcmdiLCBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLCBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKQotewotICAgIGludCBuQ2hhcnMgPSBwRm9udC0+Q291bnRDaGFyKHN0ciwgc3RyLkdldExlbmd0aCgpKTsKLSAgICBpZiAobkNoYXJzID09IDApIHsKLSAgICAgICAgcmV0dXJuOwordm9pZCBDUERGX1RleHRSZW5kZXJlcjo6RHJhd1RleHRTdHJpbmcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG9yaWdpbl94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgb3JpZ2luX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGZpbGxfYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0Igc3Ryb2tlX2FyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykgeworICBpbnQgbkNoYXJzID0gcEZvbnQtPkNvdW50Q2hhcihzdHIsIHN0ci5HZXRMZW5ndGgoKSk7CisgIGlmIChuQ2hhcnMgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBGWF9EV09SRCBjaGFyY29kZTsKKyAgaW50IG9mZnNldCA9IDA7CisgIEZYX0RXT1JEKiBwQ2hhckNvZGVzOworICBGWF9GTE9BVCogcENoYXJQb3M7CisgIGlmIChuQ2hhcnMgPT0gMSkgeworICAgIGNoYXJjb2RlID0gcEZvbnQtPkdldE5leHRDaGFyKHN0ciwgc3RyLkdldExlbmd0aCgpLCBvZmZzZXQpOworICAgIHBDaGFyQ29kZXMgPSAoRlhfRFdPUkQqKSh1aW50cHRyX3QpY2hhcmNvZGU7CisgICAgcENoYXJQb3MgPSBOVUxMOworICB9IGVsc2UgeworICAgIHBDaGFyQ29kZXMgPSBGWF9BbGxvYyhGWF9EV09SRCwgbkNoYXJzKTsKKyAgICBwQ2hhclBvcyA9IEZYX0FsbG9jKEZYX0ZMT0FULCBuQ2hhcnMgLSAxKTsKKyAgICBGWF9GTE9BVCBjdXJfcG9zID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5DaGFyczsgaSsrKSB7CisgICAgICBwQ2hhckNvZGVzW2ldID0gcEZvbnQtPkdldE5leHRDaGFyKHN0ciwgc3RyLkdldExlbmd0aCgpLCBvZmZzZXQpOworICAgICAgaWYgKGkpIHsKKyAgICAgICAgcENoYXJQb3NbaSAtIDFdID0gY3VyX3BvczsKKyAgICAgIH0KKyAgICAgIGN1cl9wb3MgKz0gcEZvbnQtPkdldENoYXJXaWR0aEYocENoYXJDb2Rlc1tpXSkgKiBmb250X3NpemUgLyAxMDAwOwogICAgIH0KLSAgICBGWF9EV09SRCBjaGFyY29kZTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBGWF9EV09SRCogcENoYXJDb2RlczsKLSAgICBGWF9GTE9BVCogcENoYXJQb3M7Ci0gICAgaWYgKG5DaGFycyA9PSAxKSB7Ci0gICAgICAgIGNoYXJjb2RlID0gcEZvbnQtPkdldE5leHRDaGFyKHN0ciwgc3RyLkdldExlbmd0aCgpLCBvZmZzZXQpOwotICAgICAgICBwQ2hhckNvZGVzID0gKEZYX0RXT1JEKikoRlhfVUlOVFBUUiljaGFyY29kZTsKLSAgICAgICAgcENoYXJQb3MgPSBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBDaGFyQ29kZXMgPSBGWF9BbGxvYyhGWF9EV09SRCwgbkNoYXJzKTsKLSAgICAgICAgcENoYXJQb3MgPSBGWF9BbGxvYyhGWF9GTE9BVCwgbkNoYXJzIC0gMSk7Ci0gICAgICAgIEZYX0ZMT0FUIGN1cl9wb3MgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5DaGFyczsgaSArKykgewotICAgICAgICAgICAgcENoYXJDb2Rlc1tpXSA9IHBGb250LT5HZXROZXh0Q2hhcihzdHIsIHN0ci5HZXRMZW5ndGgoKSwgb2Zmc2V0KTsKLSAgICAgICAgICAgIGlmIChpKSB7Ci0gICAgICAgICAgICAgICAgcENoYXJQb3NbaSAtIDFdID0gY3VyX3BvczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGN1cl9wb3MgKz0gcEZvbnQtPkdldENoYXJXaWR0aEYocENoYXJDb2Rlc1tpXSkgKiBmb250X3NpemUgLyAxMDAwOwotICAgICAgICB9Ci0gICAgfQotICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwotICAgIGlmIChwTWF0cml4KSB7Ci0gICAgICAgIG1hdHJpeCA9ICpwTWF0cml4OwotICAgIH0KLSAgICBtYXRyaXguZSA9IG9yaWdpbl94OwotICAgIG1hdHJpeC5mID0gb3JpZ2luX3k7Ci0gICAgaWYgKHBGb250LT5HZXRGb250VHlwZSgpID09IFBERkZPTlRfVFlQRTMpCi0gICAgICAgIDsKLSAgICBlbHNlIGlmIChzdHJva2VfYXJnYiA9PSAwKSB7Ci0gICAgICAgIERyYXdOb3JtYWxUZXh0KHBEZXZpY2UsIG5DaGFycywgcENoYXJDb2RlcywgcENoYXJQb3MsIHBGb250LCBmb250X3NpemUsICZtYXRyaXgsIGZpbGxfYXJnYiwgcE9wdGlvbnMpOwotICAgIH0gZWxzZQotICAgICAgICBEcmF3VGV4dFBhdGgocERldmljZSwgbkNoYXJzLCBwQ2hhckNvZGVzLCBwQ2hhclBvcywgcEZvbnQsIGZvbnRfc2l6ZSwgJm1hdHJpeCwgTlVMTCwgcEdyYXBoU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICBmaWxsX2FyZ2IsIHN0cm9rZV9hcmdiLCBOVUxMKTsKLSAgICBpZiAobkNoYXJzID4gMSkgewotICAgICAgICBGWF9GcmVlKHBDaGFyQ29kZXMpOwotICAgICAgICBGWF9GcmVlKHBDaGFyUG9zKTsKLSAgICB9CisgIH0KKyAgQ0ZYX01hdHJpeCBtYXRyaXg7CisgIGlmIChwTWF0cml4KSB7CisgICAgbWF0cml4ID0gKnBNYXRyaXg7CisgIH0KKyAgbWF0cml4LmUgPSBvcmlnaW5feDsKKyAgbWF0cml4LmYgPSBvcmlnaW5feTsKKyAgaWYgKHBGb250LT5HZXRGb250VHlwZSgpID09IFBERkZPTlRfVFlQRTMpCisgICAgOworICBlbHNlIGlmIChzdHJva2VfYXJnYiA9PSAwKSB7CisgICAgRHJhd05vcm1hbFRleHQocERldmljZSwgbkNoYXJzLCBwQ2hhckNvZGVzLCBwQ2hhclBvcywgcEZvbnQsIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAmbWF0cml4LCBmaWxsX2FyZ2IsIHBPcHRpb25zKTsKKyAgfSBlbHNlCisgICAgRHJhd1RleHRQYXRoKHBEZXZpY2UsIG5DaGFycywgcENoYXJDb2RlcywgcENoYXJQb3MsIHBGb250LCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICZtYXRyaXgsIE5VTEwsIHBHcmFwaFN0YXRlLCBmaWxsX2FyZ2IsIHN0cm9rZV9hcmdiLCBOVUxMKTsKKyAgaWYgKG5DaGFycyA+IDEpIHsKKyAgICBGWF9GcmVlKHBDaGFyQ29kZXMpOworICAgIEZYX0ZyZWUocENoYXJQb3MpOworICB9CiB9Ci1GWF9CT09MIENQREZfVGV4dFJlbmRlcmVyOjpEcmF3Tm9ybWFsVGV4dChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBpbnQgbkNoYXJzLCBGWF9EV09SRCogcENoYXJDb2RlcywgRlhfRkxPQVQqIHBDaGFyUG9zLAotICAgICAgICBDUERGX0ZvbnQqIHBGb250LCBGWF9GTE9BVCBmb250X3NpemUsCi0gICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBUZXh0MkRldmljZSwKLSAgICAgICAgRlhfQVJHQiBmaWxsX2FyZ2IsIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpCi17Ci0gICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlID0gcEZvbnQtPm1fcERvY3VtZW50ID8gcEZvbnQtPm1fcERvY3VtZW50LT5HZXRSZW5kZXJEYXRhKCktPkdldEZvbnRDYWNoZSgpIDogTlVMTDsKLSAgICBDUERGX0NoYXJQb3NMaXN0IENoYXJQb3NMaXN0OwotICAgIENoYXJQb3NMaXN0LkxvYWQobkNoYXJzLCBwQ2hhckNvZGVzLCBwQ2hhclBvcywgcEZvbnQsIGZvbnRfc2l6ZSk7Ci0gICAgaW50IEZYR0VfZmxhZ3MgPSAwOwotICAgIGlmIChwT3B0aW9ucykgewotICAgICAgICBGWF9EV09SRCBkd0ZsYWdzID0gcE9wdGlvbnMtPm1fRmxhZ3M7Ci0gICAgICAgIGlmIChkd0ZsYWdzICYgUkVOREVSX0NMRUFSVFlQRSkgewotICAgICAgICAgICAgRlhHRV9mbGFncyB8PSBGWFRFWFRfQ0xFQVJUWVBFOwotICAgICAgICAgICAgaWYgKGR3RmxhZ3MgJiBSRU5ERVJfQkdSX1NUUklQRSkgewotICAgICAgICAgICAgICAgIEZYR0VfZmxhZ3MgfD0gRlhURVhUX0JHUl9TVFJJUEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGR3RmxhZ3MgJiBSRU5ERVJfTk9URVhUU01PT1RIKSB7Ci0gICAgICAgICAgICBGWEdFX2ZsYWdzIHw9IEZYVEVYVF9OT1NNT09USDsKLSAgICAgICAgfQotICAgICAgICBpZiAoZHdGbGFncyAmIFJFTkRFUl9QUklOVEdSQVBISUNURVhUKSB7Ci0gICAgICAgICAgICBGWEdFX2ZsYWdzIHw9IEZYVEVYVF9QUklOVEdSQVBISUNURVhUOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkd0ZsYWdzICYgUkVOREVSX05PX05BVElWRVRFWFQpIHsKLSAgICAgICAgICAgIEZYR0VfZmxhZ3MgfD0gRlhURVhUX05PX05BVElWRVRFWFQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGR3RmxhZ3MgJiBSRU5ERVJfUFJJTlRJTUFHRVRFWFQpIHsKLSAgICAgICAgICAgIEZYR0VfZmxhZ3MgfD0gRlhURVhUX1BSSU5USU1BR0VURVhUOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRlhHRV9mbGFncyA9IEZYVEVYVF9DTEVBUlRZUEU7CitGWF9CT09MIENQREZfVGV4dFJlbmRlcmVyOjpEcmF3Tm9ybWFsVGV4dChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5DaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwQ2hhckNvZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBUZXh0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZmlsbF9hcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykgeworICBDRlhfRm9udENhY2hlKiBwQ2FjaGUgPQorICAgICAgcEZvbnQtPm1fcERvY3VtZW50ID8gcEZvbnQtPm1fcERvY3VtZW50LT5HZXRSZW5kZXJEYXRhKCktPkdldEZvbnRDYWNoZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOworICBDUERGX0NoYXJQb3NMaXN0IENoYXJQb3NMaXN0OworICBDaGFyUG9zTGlzdC5Mb2FkKG5DaGFycywgcENoYXJDb2RlcywgcENoYXJQb3MsIHBGb250LCBmb250X3NpemUpOworICBpbnQgRlhHRV9mbGFncyA9IDA7CisgIGlmIChwT3B0aW9ucykgeworICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSBwT3B0aW9ucy0+bV9GbGFnczsKKyAgICBpZiAoZHdGbGFncyAmIFJFTkRFUl9DTEVBUlRZUEUpIHsKKyAgICAgIEZYR0VfZmxhZ3MgfD0gRlhURVhUX0NMRUFSVFlQRTsKKyAgICAgIGlmIChkd0ZsYWdzICYgUkVOREVSX0JHUl9TVFJJUEUpIHsKKyAgICAgICAgRlhHRV9mbGFncyB8PSBGWFRFWFRfQkdSX1NUUklQRTsKKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKHBGb250LT5HZXRGb250VHlwZSgpICYgUERGRk9OVF9DSURGT05UKSB7Ci0gICAgICAgIEZYR0VfZmxhZ3MgfD0gRlhGT05UX0NJREZPTlQ7CisgICAgaWYgKGR3RmxhZ3MgJiBSRU5ERVJfTk9URVhUU01PT1RIKSB7CisgICAgICBGWEdFX2ZsYWdzIHw9IEZYVEVYVF9OT1NNT09USDsKICAgICB9Ci0gICAgcmV0dXJuIHBEZXZpY2UtPkRyYXdOb3JtYWxUZXh0KENoYXJQb3NMaXN0Lm1fbkNoYXJzLCBDaGFyUG9zTGlzdC5tX3BDaGFyUG9zLCAmcEZvbnQtPm1fRm9udCwgcENhY2hlLCBmb250X3NpemUsIHBUZXh0MkRldmljZSwgZmlsbF9hcmdiLCBGWEdFX2ZsYWdzKTsKKyAgICBpZiAoZHdGbGFncyAmIFJFTkRFUl9QUklOVEdSQVBISUNURVhUKSB7CisgICAgICBGWEdFX2ZsYWdzIHw9IEZYVEVYVF9QUklOVEdSQVBISUNURVhUOworICAgIH0KKyAgICBpZiAoZHdGbGFncyAmIFJFTkRFUl9OT19OQVRJVkVURVhUKSB7CisgICAgICBGWEdFX2ZsYWdzIHw9IEZYVEVYVF9OT19OQVRJVkVURVhUOworICAgIH0KKyAgICBpZiAoZHdGbGFncyAmIFJFTkRFUl9QUklOVElNQUdFVEVYVCkgeworICAgICAgRlhHRV9mbGFncyB8PSBGWFRFWFRfUFJJTlRJTUFHRVRFWFQ7CisgICAgfQorICB9IGVsc2UgeworICAgIEZYR0VfZmxhZ3MgPSBGWFRFWFRfQ0xFQVJUWVBFOworICB9CisgIGlmIChwRm9udC0+R2V0Rm9udFR5cGUoKSAmIFBERkZPTlRfQ0lERk9OVCkgeworICAgIEZYR0VfZmxhZ3MgfD0gRlhGT05UX0NJREZPTlQ7CisgIH0KKyAgcmV0dXJuIHBEZXZpY2UtPkRyYXdOb3JtYWxUZXh0KENoYXJQb3NMaXN0Lm1fbkNoYXJzLCBDaGFyUG9zTGlzdC5tX3BDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBGb250LT5tX0ZvbnQsIHBDYWNoZSwgZm9udF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRleHQyRGV2aWNlLCBmaWxsX2FyZ2IsIEZYR0VfZmxhZ3MpOwogfQotdm9pZCBDUERGX1JlbmRlclN0YXR1czo6RHJhd1RleHRQYXRoV2l0aFBhdHRlcm4oY29uc3QgQ1BERl9UZXh0T2JqZWN0KiB0ZXh0b2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwKLSAgICAgICAgQ1BERl9Gb250KiBwRm9udCwgRlhfRkxPQVQgZm9udF9zaXplLAotICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dE1hdHJpeCwgRlhfQk9PTCBiRmlsbCwgRlhfQk9PTCBiU3Ryb2tlKQotewotICAgIGlmICghYlN0cm9rZSkgewotICAgICAgICBDUERGX1BhdGhPYmplY3QgcGF0aDsKLSAgICAgICAgQ1BERl9UZXh0T2JqZWN0KiBwQ29weSA9IG5ldyBDUERGX1RleHRPYmplY3Q7Ci0gICAgICAgIHBDb3B5LT5Db3B5KHRleHRvYmopOwotICAgICAgICBwYXRoLm1fYlN0cm9rZSA9IEZBTFNFOwotICAgICAgICBwYXRoLm1fRmlsbFR5cGUgPSBGWEZJTExfV0lORElORzsKLSAgICAgICAgcGF0aC5tX0NsaXBQYXRoLkFwcGVuZFRleHRzKCZwQ29weSwgMSk7Ci0gICAgICAgIHBhdGgubV9Db2xvclN0YXRlID0gdGV4dG9iai0+bV9Db2xvclN0YXRlOwotICAgICAgICBwYXRoLm1fUGF0aC5OZXcoKS0+QXBwZW5kUmVjdCh0ZXh0b2JqLT5tX0xlZnQsIHRleHRvYmotPm1fQm90dG9tLCB0ZXh0b2JqLT5tX1JpZ2h0LCB0ZXh0b2JqLT5tX1RvcCk7Ci0gICAgICAgIHBhdGgubV9MZWZ0ID0gdGV4dG9iai0+bV9MZWZ0OwotICAgICAgICBwYXRoLm1fQm90dG9tID0gdGV4dG9iai0+bV9Cb3R0b207Ci0gICAgICAgIHBhdGgubV9SaWdodCA9IHRleHRvYmotPm1fUmlnaHQ7Ci0gICAgICAgIHBhdGgubV9Ub3AgPSB0ZXh0b2JqLT5tX1RvcDsKLSAgICAgICAgUmVuZGVyU2luZ2xlT2JqZWN0KCZwYXRoLCBwT2JqMkRldmljZSk7Ci0gICAgICAgIHJldHVybjsKK3ZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdUZXh0UGF0aFdpdGhQYXR0ZXJuKGNvbnN0IENQREZfVGV4dE9iamVjdCogdGV4dG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBUZXh0TWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmlsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0cm9rZSkgeworICBpZiAoIWJTdHJva2UpIHsKKyAgICBDUERGX1BhdGhPYmplY3QgcGF0aDsKKyAgICBDUERGX1RleHRPYmplY3QqIHBDb3B5ID0gbmV3IENQREZfVGV4dE9iamVjdDsKKyAgICBwQ29weS0+Q29weSh0ZXh0b2JqKTsKKyAgICBwYXRoLm1fYlN0cm9rZSA9IEZBTFNFOworICAgIHBhdGgubV9GaWxsVHlwZSA9IEZYRklMTF9XSU5ESU5HOworICAgIHBhdGgubV9DbGlwUGF0aC5BcHBlbmRUZXh0cygmcENvcHksIDEpOworICAgIHBhdGgubV9Db2xvclN0YXRlID0gdGV4dG9iai0+bV9Db2xvclN0YXRlOworICAgIHBhdGgubV9QYXRoLk5ldygpLT5BcHBlbmRSZWN0KHRleHRvYmotPm1fTGVmdCwgdGV4dG9iai0+bV9Cb3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dG9iai0+bV9SaWdodCwgdGV4dG9iai0+bV9Ub3ApOworICAgIHBhdGgubV9MZWZ0ID0gdGV4dG9iai0+bV9MZWZ0OworICAgIHBhdGgubV9Cb3R0b20gPSB0ZXh0b2JqLT5tX0JvdHRvbTsKKyAgICBwYXRoLm1fUmlnaHQgPSB0ZXh0b2JqLT5tX1JpZ2h0OworICAgIHBhdGgubV9Ub3AgPSB0ZXh0b2JqLT5tX1RvcDsKKyAgICBSZW5kZXJTaW5nbGVPYmplY3QoJnBhdGgsIHBPYmoyRGV2aWNlKTsKKyAgICByZXR1cm47CisgIH0KKyAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlOworICBpZiAocEZvbnQtPm1fcERvY3VtZW50KSB7CisgICAgcENhY2hlID0gcEZvbnQtPm1fcERvY3VtZW50LT5HZXRSZW5kZXJEYXRhKCktPkdldEZvbnRDYWNoZSgpOworICB9IGVsc2UgeworICAgIHBDYWNoZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpOworICB9CisgIENGWF9GYWNlQ2FjaGUqIHBGYWNlQ2FjaGUgPSBwQ2FjaGUtPkdldENhY2hlZEZhY2UoJnBGb250LT5tX0ZvbnQpOworICBGWF9GT05UQ0FDSEVfREVGSU5FKHBDYWNoZSwgJnBGb250LT5tX0ZvbnQpOworICBDUERGX0NoYXJQb3NMaXN0IENoYXJQb3NMaXN0OworICBDaGFyUG9zTGlzdC5Mb2FkKHRleHRvYmotPm1fbkNoYXJzLCB0ZXh0b2JqLT5tX3BDaGFyQ29kZXMsCisgICAgICAgICAgICAgICAgICAgdGV4dG9iai0+bV9wQ2hhclBvcywgcEZvbnQsIGZvbnRfc2l6ZSk7CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBDaGFyUG9zTGlzdC5tX25DaGFyczsgaSsrKSB7CisgICAgRlhURVhUX0NIQVJQT1MmIGNoYXJwb3MgPSBDaGFyUG9zTGlzdC5tX3BDaGFyUG9zW2ldOworICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGggPSBwRmFjZUNhY2hlLT5Mb2FkR2x5cGhQYXRoKAorICAgICAgICAmcEZvbnQtPm1fRm9udCwgY2hhcnBvcy5tX0dseXBoSW5kZXgsIGNoYXJwb3MubV9Gb250Q2hhcldpZHRoKTsKKyAgICBpZiAoIXBQYXRoKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlOwotICAgIGlmIChwRm9udC0+bV9wRG9jdW1lbnQpIHsKLSAgICAgICAgcENhY2hlID0gcEZvbnQtPm1fcERvY3VtZW50LT5HZXRSZW5kZXJEYXRhKCktPkdldEZvbnRDYWNoZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBDYWNoZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpOwotICAgIH0KLSAgICBDRlhfRmFjZUNhY2hlKiBwRmFjZUNhY2hlID0gcENhY2hlLT5HZXRDYWNoZWRGYWNlKCZwRm9udC0+bV9Gb250KTsKLSAgICBGWF9GT05UQ0FDSEVfREVGSU5FKHBDYWNoZSwgJnBGb250LT5tX0ZvbnQpOwotICAgIENQREZfQ2hhclBvc0xpc3QgQ2hhclBvc0xpc3Q7Ci0gICAgQ2hhclBvc0xpc3QuTG9hZCh0ZXh0b2JqLT5tX25DaGFycywgdGV4dG9iai0+bV9wQ2hhckNvZGVzLCB0ZXh0b2JqLT5tX3BDaGFyUG9zLCBwRm9udCwgZm9udF9zaXplKTsKLSAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgQ2hhclBvc0xpc3QubV9uQ2hhcnM7IGkgKyspIHsKLSAgICAgICAgRlhURVhUX0NIQVJQT1MmIGNoYXJwb3MgPSBDaGFyUG9zTGlzdC5tX3BDaGFyUG9zW2ldOwotICAgICAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoID0gcEZhY2VDYWNoZS0+TG9hZEdseXBoUGF0aCgmcEZvbnQtPm1fRm9udCwgY2hhcnBvcy5tX0dseXBoSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFycG9zLm1fRm9udENoYXJXaWR0aCk7Ci0gICAgICAgIGlmIChwUGF0aCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDUERGX1BhdGhPYmplY3QgcGF0aDsKLSAgICAgICAgcGF0aC5tX0dyYXBoU3RhdGUgPSB0ZXh0b2JqLT5tX0dyYXBoU3RhdGU7Ci0gICAgICAgIHBhdGgubV9Db2xvclN0YXRlID0gdGV4dG9iai0+bV9Db2xvclN0YXRlOwotICAgICAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKLSAgICAgICAgaWYgKGNoYXJwb3MubV9iR2x5cGhBZGp1c3QpCi0gICAgICAgICAgICBtYXRyaXguU2V0KGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMF0sIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMl0sIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbM10sIDAsIDApOwotICAgICAgICBtYXRyaXguQ29uY2F0KGZvbnRfc2l6ZSwgMCwgMCwgZm9udF9zaXplLCBjaGFycG9zLm1fT3JpZ2luWCwgY2hhcnBvcy5tX09yaWdpblkpOwotICAgICAgICBwYXRoLm1fUGF0aC5OZXcoKS0+QXBwZW5kKHBQYXRoLCAmbWF0cml4KTsKLSAgICAgICAgcGF0aC5tX01hdHJpeCA9ICpwVGV4dE1hdHJpeDsKLSAgICAgICAgcGF0aC5tX2JTdHJva2UgPSBiU3Ryb2tlOwotICAgICAgICBwYXRoLm1fRmlsbFR5cGUgPSBiRmlsbCA/IEZYRklMTF9XSU5ESU5HIDogMDsKLSAgICAgICAgcGF0aC5DYWxjQm91bmRpbmdCb3goKTsKLSAgICAgICAgUHJvY2Vzc1BhdGgoJnBhdGgsIHBPYmoyRGV2aWNlKTsKLSAgICB9CisgICAgQ1BERl9QYXRoT2JqZWN0IHBhdGg7CisgICAgcGF0aC5tX0dyYXBoU3RhdGUgPSB0ZXh0b2JqLT5tX0dyYXBoU3RhdGU7CisgICAgcGF0aC5tX0NvbG9yU3RhdGUgPSB0ZXh0b2JqLT5tX0NvbG9yU3RhdGU7CisgICAgQ0ZYX01hdHJpeCBtYXRyaXg7CisgICAgaWYgKGNoYXJwb3MubV9iR2x5cGhBZGp1c3QpCisgICAgICBtYXRyaXguU2V0KGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMF0sIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMV0sCisgICAgICAgICAgICAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMl0sIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbM10sIDAsIDApOworICAgIG1hdHJpeC5Db25jYXQoZm9udF9zaXplLCAwLCAwLCBmb250X3NpemUsIGNoYXJwb3MubV9PcmlnaW5YLAorICAgICAgICAgICAgICAgICAgY2hhcnBvcy5tX09yaWdpblkpOworICAgIHBhdGgubV9QYXRoLk5ldygpLT5BcHBlbmQocFBhdGgsICZtYXRyaXgpOworICAgIHBhdGgubV9NYXRyaXggPSAqcFRleHRNYXRyaXg7CisgICAgcGF0aC5tX2JTdHJva2UgPSBiU3Ryb2tlOworICAgIHBhdGgubV9GaWxsVHlwZSA9IGJGaWxsID8gRlhGSUxMX1dJTkRJTkcgOiAwOworICAgIHBhdGguQ2FsY0JvdW5kaW5nQm94KCk7CisgICAgUHJvY2Vzc1BhdGgoJnBhdGgsIHBPYmoyRGV2aWNlKTsKKyAgfQogfQotQ0ZYX1BhdGhEYXRhKiBDUERGX0ZvbnQ6OkxvYWRHbHlwaFBhdGgoRlhfRFdPUkQgY2hhcmNvZGUsIGludCBkZXN0X3dpZHRoKQotewotICAgIGludCBnbHlwaF9pbmRleCA9IEdseXBoRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKLSAgICBpZiAobV9Gb250Lm1fRmFjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbV9Gb250LkxvYWRHbHlwaFBhdGgoZ2x5cGhfaW5kZXgsIGRlc3Rfd2lkdGgpOworCitDRlhfUGF0aERhdGEqIENQREZfRm9udDo6TG9hZEdseXBoUGF0aChGWF9EV09SRCBjaGFyY29kZSwgaW50IGRlc3Rfd2lkdGgpIHsKKyAgaW50IGdseXBoX2luZGV4ID0gR2x5cGhGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOworICBpZiAoIW1fRm9udC5HZXRGYWNlKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiBtX0ZvbnQuTG9hZEdseXBoUGF0aChnbHlwaF9pbmRleCwgZGVzdF93aWR0aCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL3JlbmRlcl9pbnQuaCBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvcmVuZGVyX2ludC5oCmluZGV4IGNmMjA3NGYuLjU1MzA3NTQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvcmVuZGVyX2ludC5oCisrKyBiL2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9yZW5kZXIvcmVuZGVyX2ludC5oCkBAIC0xLDQ3MSArMSw2MjMgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBDT1JFX1NSQ19GUERGQVBJX0ZQREZfUkVOREVSX1JFTkRFUl9JTlRfSF8KICNkZWZpbmUgQ09SRV9TUkNfRlBERkFQSV9GUERGX1JFTkRFUl9SRU5ERVJfSU5UX0hfCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlb2JqLmgiCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAotY2xhc3MgQ1BERl9RdWlja1N0cmV0Y2hlcjsKLSNkZWZpbmUgVFlQRTNfTUFYX0JMVUVTCQkxNgotY2xhc3MgQ1BERl9UeXBlM0dseXBocyAKLXsKLXB1YmxpYzoKLSAgICBDUERGX1R5cGUzR2x5cGhzKCkKLSAgICB7Ci0gICAgICAgIG1fR2x5cGhNYXAuSW5pdEhhc2hUYWJsZSgyNTMpOwotICAgICAgICBtX1RvcEJsdWVDb3VudCA9IG1fQm90dG9tQmx1ZUNvdW50ID0gMDsKLSAgICB9Ci0gICAgfkNQREZfVHlwZTNHbHlwaHMoKTsKLSAgICBDRlhfTWFwUHRyVG9QdHIJCQltX0dseXBoTWFwOwotICAgIHZvaWQJCQkJCUFkanVzdEJsdWUoRlhfRkxPQVQgdG9wLCBGWF9GTE9BVCBib3R0b20sIGludCYgdG9wX2xpbmUsIGludCYgYm90dG9tX2xpbmUpOworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZW9iai5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcmVuZGVyLmgiCiAKLSAgICBpbnQJCQkJCQltX1RvcEJsdWVbVFlQRTNfTUFYX0JMVUVTXSwgbV9Cb3R0b21CbHVlW1RZUEUzX01BWF9CTFVFU107Ci0gICAgaW50CQkJCQkJbV9Ub3BCbHVlQ291bnQsIG1fQm90dG9tQmx1ZUNvdW50OwotfTsKIGNsYXNzIENGWF9HbHlwaEJpdG1hcDsKLWNsYXNzIENQREZfVHlwZTNDYWNoZSAKLXsKLXB1YmxpYzoKLSAgICBDUERGX1R5cGUzQ2FjaGUoQ1BERl9UeXBlM0ZvbnQqIHBGb250KQotICAgIHsKLSAgICAgICAgbV9wRm9udCA9IHBGb250OwotICAgIH0KLSAgICB+Q1BERl9UeXBlM0NhY2hlKCk7Ci0gICAgQ0ZYX0dseXBoQml0bWFwKgkJTG9hZEdseXBoKEZYX0RXT1JEIGNoYXJjb2RlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9GTE9BVCByZXRpbmFTY2FsZVggPSAxLjBmLCBGWF9GTE9BVCByZXRpbmFTY2FsZVkgPSAxLjBmKTsKLXByb3RlY3RlZDoKLSAgICBDRlhfR2x5cGhCaXRtYXAqCQlSZW5kZXJHbHlwaChDUERGX1R5cGUzR2x5cGhzKiBwU2l6ZSwgRlhfRFdPUkQgY2hhcmNvZGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0ZMT0FUIHJldGluYVNjYWxlWCA9IDEuMGYsIEZYX0ZMT0FUIHJldGluYVNjYWxlWSA9IDEuMGYpOwotICAgIENQREZfVHlwZTNGb250KgkJCW1fcEZvbnQ7Ci0gICAgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cgltX1NpemVNYXA7Ci19OwotY2xhc3MgQ1BERl9UcmFuc2ZlckZ1bmMgCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9Eb2N1bWVudCoJbV9wUERGRG9jOwotICAgIEZYX0JZVEUJCQltX1NhbXBsZXNbMjU2ICogM107Ci0gICAgRlhfQk9PTAkJCW1fYklkZW50aXR5OworY2xhc3MgQ0ZYX0ltYWdlVHJhbnNmb3JtZXI7CitjbGFzcyBDUERGX0ltYWdlQ2FjaGVFbnRyeTsKK2NsYXNzIENQREZfSW1hZ2VMb2FkZXJIYW5kbGU7CitjbGFzcyBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyOwogCi0gICAgQ0ZYX0RJQlNvdXJjZSoJVHJhbnNsYXRlSW1hZ2UoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYywgRlhfQk9PTCBiQXV0b0Ryb3BTcmMpOwotICAgIEZYX0NPTE9SUkVGCQlUcmFuc2xhdGVDb2xvcihGWF9DT0xPUlJFRiBzcmMpOworI2RlZmluZSBUWVBFM19NQVhfQkxVRVMgMTYKKworY2xhc3MgQ1BERl9UeXBlM0dseXBocyB7CisgcHVibGljOgorICBDUERGX1R5cGUzR2x5cGhzKCkgOiBtX1RvcEJsdWVDb3VudCgwKSwgbV9Cb3R0b21CbHVlQ291bnQoMCkge30KKyAgfkNQREZfVHlwZTNHbHlwaHMoKTsKKyAgdm9pZCBBZGp1c3RCbHVlKEZYX0ZMT0FUIHRvcCwKKyAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgIGludCYgdG9wX2xpbmUsCisgICAgICAgICAgICAgICAgICBpbnQmIGJvdHRvbV9saW5lKTsKKworICBzdGQ6Om1hcDxGWF9EV09SRCwgQ0ZYX0dseXBoQml0bWFwKj4gbV9HbHlwaE1hcDsKKyAgaW50IG1fVG9wQmx1ZVtUWVBFM19NQVhfQkxVRVNdOworICBpbnQgbV9Cb3R0b21CbHVlW1RZUEUzX01BWF9CTFVFU107CisgIGludCBtX1RvcEJsdWVDb3VudDsKKyAgaW50IG1fQm90dG9tQmx1ZUNvdW50OwogfTsKLXR5cGVkZWYgQ0ZYX01hcFB0clRlbXBsYXRlPENQREZfRm9udCosIENQREZfQ291bnRlZE9iamVjdDxDUERGX1R5cGUzQ2FjaGUqPio+IENQREZfVHlwZTNDYWNoZU1hcDsKLXR5cGVkZWYgQ0ZYX01hcFB0clRlbXBsYXRlPENQREZfT2JqZWN0KiwgQ1BERl9Db3VudGVkT2JqZWN0PENQREZfVHJhbnNmZXJGdW5jKj4qPiBDUERGX1RyYW5zZmVyRnVuY01hcDsKLWNsYXNzIENQREZfRG9jUmVuZGVyRGF0YSAKLXsKLXB1YmxpYzoKLSAgICBDUERGX0RvY1JlbmRlckRhdGEoQ1BERl9Eb2N1bWVudCogcFBERkRvYyA9IE5VTEwpOwotICAgIH5DUERGX0RvY1JlbmRlckRhdGEoKTsKLSAgICBGWF9CT09MCQkJCUluaXRpYWxpemUoKTsKLSAgICBDUERGX1R5cGUzQ2FjaGUqCUdldENhY2hlZFR5cGUzKENQREZfVHlwZTNGb250KiBwRm9udCk7Ci0gICAgQ1BERl9UcmFuc2ZlckZ1bmMqCUdldFRyYW5zZmVyRnVuYyhDUERGX09iamVjdCogcE9iaik7Ci0gICAgQ0ZYX0ZvbnRDYWNoZSoJCUdldEZvbnRDYWNoZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wRm9udENhY2hlOwotICAgIH0KLSAgICB2b2lkCQkJCUNsZWFyKEZYX0JPT0wgYlJlbGVhc2UgPSBGQUxTRSk7Ci0gICAgdm9pZAkJCQlSZWxlYXNlQ2FjaGVkVHlwZTMoQ1BERl9UeXBlM0ZvbnQqIHBGb250KTsKLSAgICB2b2lkCQkJCVJlbGVhc2VUcmFuc2ZlckZ1bmMoQ1BERl9PYmplY3QqIHBPYmopOwotcHJpdmF0ZToKLSAgICBDUERGX0RvY3VtZW50KgkJbV9wUERGRG9jOwotICAgIENGWF9Gb250Q2FjaGUqCQltX3BGb250Q2FjaGU7Ci0gICAgQ1BERl9UeXBlM0NhY2hlTWFwCW1fVHlwZTNGYWNlTWFwOwotICAgIENQREZfVHJhbnNmZXJGdW5jTWFwCW1fVHJhbnNmZXJGdW5jTWFwOworY2xhc3MgQ1BERl9UeXBlM0NhY2hlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENQREZfVHlwZTNDYWNoZShDUERGX1R5cGUzRm9udCogcEZvbnQpIDogbV9wRm9udChwRm9udCkge30KKyAgfkNQREZfVHlwZTNDYWNoZSgpOworCisgIENGWF9HbHlwaEJpdG1hcCogTG9hZEdseXBoKEZYX0RXT1JEIGNoYXJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCByZXRpbmFTY2FsZVggPSAxLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCByZXRpbmFTY2FsZVkgPSAxLjBmKTsKKworIHByb3RlY3RlZDoKKyAgQ0ZYX0dseXBoQml0bWFwKiBSZW5kZXJHbHlwaChDUERGX1R5cGUzR2x5cGhzKiBwU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjaGFyY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHJldGluYVNjYWxlWCA9IDEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcmV0aW5hU2NhbGVZID0gMS4wZik7CisgIENQREZfVHlwZTNGb250KiBjb25zdCBtX3BGb250OworICBzdGQ6Om1hcDxDRlhfQnl0ZVN0cmluZywgQ1BERl9UeXBlM0dseXBocyo+IG1fU2l6ZU1hcDsKK307CisKK2NsYXNzIENQREZfVHJhbnNmZXJGdW5jIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENQREZfVHJhbnNmZXJGdW5jKENQREZfRG9jdW1lbnQqIHBEb2MpOworCisgIEZYX0NPTE9SUkVGIFRyYW5zbGF0ZUNvbG9yKEZYX0NPTE9SUkVGIHNyYykgY29uc3Q7CisgIENGWF9ESUJTb3VyY2UqIFRyYW5zbGF0ZUltYWdlKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkF1dG9Ecm9wU3JjKTsKKworICBDUERGX0RvY3VtZW50KiBjb25zdCBtX3BQREZEb2M7CisgIEZYX0JPT0wgbV9iSWRlbnRpdHk7CisgIHVpbnQ4X3QgbV9TYW1wbGVzWzI1NiAqIDNdOworfTsKKworY2xhc3MgQ1BERl9Eb2NSZW5kZXJEYXRhIHsKKyBwdWJsaWM6CisgIENQREZfRG9jUmVuZGVyRGF0YShDUERGX0RvY3VtZW50KiBwUERGRG9jID0gTlVMTCk7CisgIH5DUERGX0RvY1JlbmRlckRhdGEoKTsKKyAgQ1BERl9UeXBlM0NhY2hlKiBHZXRDYWNoZWRUeXBlMyhDUERGX1R5cGUzRm9udCogcEZvbnQpOworICBDUERGX1RyYW5zZmVyRnVuYyogR2V0VHJhbnNmZXJGdW5jKENQREZfT2JqZWN0KiBwT2JqKTsKKyAgQ0ZYX0ZvbnRDYWNoZSogR2V0Rm9udENhY2hlKCkgeyByZXR1cm4gbV9wRm9udENhY2hlOyB9CisgIHZvaWQgQ2xlYXIoRlhfQk9PTCBiUmVsZWFzZSA9IEZBTFNFKTsKKyAgdm9pZCBSZWxlYXNlQ2FjaGVkVHlwZTMoQ1BERl9UeXBlM0ZvbnQqIHBGb250KTsKKyAgdm9pZCBSZWxlYXNlVHJhbnNmZXJGdW5jKENQREZfT2JqZWN0KiBwT2JqKTsKKworIHByaXZhdGU6CisgIHVzaW5nIENQREZfVHlwZTNDYWNoZU1hcCA9CisgICAgICBzdGQ6Om1hcDxDUERGX0ZvbnQqLCBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9UeXBlM0NhY2hlPio+OworICB1c2luZyBDUERGX1RyYW5zZmVyRnVuY01hcCA9CisgICAgICBzdGQ6Om1hcDxDUERGX09iamVjdCosIENQREZfQ291bnRlZE9iamVjdDxDUERGX1RyYW5zZmVyRnVuYz4qPjsKKworICBDUERGX0RvY3VtZW50KiBtX3BQREZEb2M7CisgIENGWF9Gb250Q2FjaGUqIG1fcEZvbnRDYWNoZTsKKyAgQ1BERl9UeXBlM0NhY2hlTWFwIG1fVHlwZTNGYWNlTWFwOworICBDUERGX1RyYW5zZmVyRnVuY01hcCBtX1RyYW5zZmVyRnVuY01hcDsKIH07CiBzdHJ1Y3QgX1BERl9SZW5kZXJJdGVtIHsKLXB1YmxpYzoKLSAgICBDUERGX1BhZ2VPYmplY3RzKgkJCW1fcE9iamVjdExpc3Q7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeAkJCW1fTWF0cml4OworIHB1YmxpYzoKKyAgQ1BERl9QYWdlT2JqZWN0cyogbV9wT2JqZWN0TGlzdDsKKyAgQ0ZYX01hdHJpeCBtX01hdHJpeDsKIH07Ci10eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPF9QREZfUmVuZGVySXRlbT4JQ1BERl9SZW5kZXJMYXllcjsKLWNsYXNzIElQREZfT2JqZWN0UmVuZGVyZXIgCi17Ci1wdWJsaWM6Ci0gICAgc3RhdGljIElQREZfT2JqZWN0UmVuZGVyZXIqIENyZWF0ZShpbnQgdHlwZSk7Ci0gICAgdmlydHVhbCB+SVBERl9PYmplY3RSZW5kZXJlcigpIHt9Ci0gICAgdmlydHVhbCBGWF9CT09MIFN0YXJ0KENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLCBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBGWF9CT09MIGJTdGRDUywgaW50IGJsZW5kVHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCkgPSAwOwotICAgIHZpcnR1YWwgRlhfQk9PTCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkgPSAwOwotICAgIEZYX0JPT0wJCW1fUmVzdWx0OwotfTsKLWNsYXNzIENQREZfUmVuZGVyU3RhdHVzIAotewotcHVibGljOgotICAgIENQREZfUmVuZGVyU3RhdHVzKCk7Ci0gICAgfkNQREZfUmVuZGVyU3RhdHVzKCk7Ci0gICAgRlhfQk9PTAkJCUluaXRpYWxpemUoY2xhc3MgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcERldmljZU1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTdG9wT2JqLCBjb25zdCBDUERGX1JlbmRlclN0YXR1cyogcFBhcmVudFN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0dyYXBoaWNTdGF0ZXMqIHBJbml0aWFsU3RhdGVzLCBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuc3BhcmVuY3ksIEZYX0JPT0wgYkRyb3BPYmplY3RzLCBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2UgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsCUNQREZfVHlwZTNDaGFyKiBwVHlwZTNDaGFyID0gTlVMTCwgRlhfQVJHQiBmaWxsX2NvbG9yID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UpOwotICAgIHZvaWQJCQlSZW5kZXJPYmplY3RMaXN0KGNvbnN0IENQREZfUGFnZU9iamVjdHMqIHBPYmpzLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7Ci0gICAgdm9pZAkJCVJlbmRlclNpbmdsZU9iamVjdChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKLSAgICBGWF9CT09MCQkJQ29udGludWVTaW5nbGVPYmplY3QoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgSUZYX1BhdXNlKiBwUGF1c2UpOwotICAgIENQREZfUmVuZGVyT3B0aW9ucwltX09wdGlvbnM7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiAgICBtX3BGb3JtUmVzb3VyY2U7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiAgICBtX3BQYWdlUmVzb3VyY2U7Ci0gICAgQ0ZYX1B0ckFycmF5CQltX1R5cGUzRm9udENhY2hlOwotICAgIENQREZfUmVuZGVyQ29udGV4dCogR2V0Q29udGV4dCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wQ29udGV4dDsKLSAgICB9Ci1wcm90ZWN0ZWQ6Ci0gICAgZnJpZW5kIGNsYXNzCUNQREZfSW1hZ2VSZW5kZXJlcjsKLSAgICBmcmllbmQgY2xhc3MJQ1BERl9SZW5kZXJDb250ZXh0OwotICAgIHZvaWQJCQlQcm9jZXNzQ2xpcFBhdGgoQ1BERl9DbGlwUGF0aCBDbGlwUGF0aCwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOwotICAgIHZvaWQJCQlEcmF3Q2xpcFBhdGgoQ1BERl9DbGlwUGF0aCBDbGlwUGF0aCwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOwotICAgIEZYX0JPT0wJCQlQcm9jZXNzVHJhbnNwYXJlbmN5KGNvbnN0IENQREZfUGFnZU9iamVjdCogUGFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOwotICAgIHZvaWQJCQlQcm9jZXNzT2JqZWN0Tm9DbGlwKGNvbnN0IENQREZfUGFnZU9iamVjdCogUGFnZU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOwotICAgIHZvaWQJCQlEcmF3T2JqV2l0aEJhY2tncm91bmQoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7Ci0gICAgRlhfQk9PTCAgICAgICAgIERyYXdPYmpXaXRoQmxlbmQoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7Ci0gICAgRlhfQk9PTAkJCVByb2Nlc3NQYXRoKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKLSAgICB2b2lkCQkJUHJvY2Vzc1BhdGhQYXR0ZXJuKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBpbnQmIGZpbGx0eXBlLCBGWF9CT09MJiBiU3Ryb2tlKTsKLSAgICB2b2lkCQkJRHJhd1BhdGhXaXRoUGF0dGVybihDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgQ1BERl9Db2xvciogcENvbG9yLCBGWF9CT09MIGJTdHJva2UpOwotICAgIHZvaWQJCQlEcmF3VGlsaW5nUGF0dGVybihDUERGX1RpbGluZ1BhdHRlcm4qIHBQYXR0ZXJuLCBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgRlhfQk9PTCBiU3Ryb2tlKTsKLSAgICB2b2lkCQkJRHJhd1NoYWRpbmdQYXR0ZXJuKENQREZfU2hhZGluZ1BhdHRlcm4qIHBQYXR0ZXJuLCBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgRlhfQk9PTCBiU3Ryb2tlKTsKLSAgICBGWF9CT09MCQkJU2VsZWN0Q2xpcFBhdGgoQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIEZYX0JPT0wgYlN0cm9rZSk7Ci0gICAgRlhfQk9PTAkJCVByb2Nlc3NJbWFnZShDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKLSAgICBGWF9CT09MCQkJT3V0cHV0Qml0bWFwQWxwaGEoQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwSW1hZ2UyRGV2aWNlKTsKLSAgICBGWF9CT09MCQkJT3V0cHV0SW1hZ2UoQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwSW1hZ2UyRGV2aWNlKTsKLSAgICBGWF9CT09MCQkJT3V0cHV0RElCU291cmNlKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBPdXRwdXRCaXRtYXAsIEZYX0FSR0IgZmlsbF9hcmdiLCBpbnQgYml0bWFwX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSwgQ1BERl9JbWFnZUNhY2hlKiBwSW1hZ2VDYWNoZSwgRlhfRFdPUkQgZmxhZ3MpOwotICAgIHZvaWQJCQlDb21wb3NpdGVESUJpdG1hcChDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIEZYX0FSR0IgbWFza19hcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLCBpbnQgYmxlbmRfbW9kZSwgaW50IGJJc29sYXRlZCk7Ci0gICAgRlhfQk9PTAkJCVByb2Nlc3NJbmxpbmVzKENQREZfSW5saW5lSW1hZ2VzKiBwSW5saW5lcywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOwotICAgIEZYX0JPT0wJCQlQcm9jZXNzU2hhZGluZyhDUERGX1NoYWRpbmdPYmplY3QqIHBTaGFkaW5nT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSk7Ci0gICAgdm9pZAkJCURyYXdTaGFkaW5nKENQREZfU2hhZGluZ1BhdHRlcm4qIHBQYXR0ZXJuLCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9SRUNUJiBjbGlwX3JlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYSwgRlhfQk9PTCBiQWxwaGFNb2RlKTsKLSAgICBGWF9CT09MCQkJUHJvY2Vzc1R5cGUzVGV4dChjb25zdCBDUERGX1RleHRPYmplY3QqIHRleHRvYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlKTsKLSAgICBGWF9CT09MCQkJUHJvY2Vzc1RleHQoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiB0ZXh0b2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwgQ0ZYX1BhdGhEYXRhKiBwQ2xpcHBpbmdQYXRoKTsKLSAgICB2b2lkCQkJRHJhd1RleHRQYXRoV2l0aFBhdHRlcm4oY29uc3QgQ1BERl9UZXh0T2JqZWN0KiB0ZXh0b2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwgRlhfRkxPQVQgZm9udF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dE1hdHJpeCwgRlhfQk9PTCBiRmlsbCwgRlhfQk9PTCBiU3Ryb2tlKTsKLSAgICBGWF9CT09MCQkJUHJvY2Vzc0Zvcm0oQ1BERl9Gb3JtT2JqZWN0KiBwRm9ybU9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOwotICAgIENGWF9ESUJpdG1hcCoJR2V0QmFja2Ryb3AoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBGWF9SRUNUJiByZWN0LCBpbnQmIGxlZnQsIGludCYgdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJCYWNrQWxwaGFSZXF1aXJlZCk7Ci0gICAgQ0ZYX0RJQml0bWFwKglMb2FkU01hc2soQ1BERl9EaWN0aW9uYXJ5KiBwU01hc2tEaWN0LCBGWF9SRUNUKiBwQ2xpcFJlY3QsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgpOwotICAgIHZvaWQJCQlJbml0KENQREZfUmVuZGVyQ29udGV4dCogcFBhcmVudCk7Ci0gICAgc3RhdGljIGNsYXNzIENQREZfVHlwZTNDYWNoZSoJR2V0Q2FjaGVkVHlwZTMoQ1BERl9UeXBlM0ZvbnQqIHBGb250KTsKLSAgICBzdGF0aWMgQ1BERl9HcmFwaGljU3RhdGVzKiBDbG9uZU9ialN0YXRlcyhjb25zdCBDUERGX0dyYXBoaWNTdGF0ZXMqIHBQYXRoT2JqLCBGWF9CT09MIGJTdHJva2UpOwotICAgIENQREZfVHJhbnNmZXJGdW5jKglHZXRUcmFuc2ZlckZ1bmMoQ1BERl9PYmplY3QqIHBPYmplY3QpIGNvbnN0OwotICAgIEZYX0FSR0IJCQlHZXRGaWxsQXJnYihjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIEZYX0JPT0wgYlR5cGUzID0gRkFMU0UpIGNvbnN0OwotICAgIEZYX0FSR0IJCQlHZXRTdHJva2VBcmdiKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaikgY29uc3Q7Ci0gICAgQ1BERl9SZW5kZXJDb250ZXh0KgkJbV9wQ29udGV4dDsKLSAgICBGWF9CT09MCQkJCQltX2JTdG9wcGVkOwotICAgIHZvaWQJCQlEaXRoZXJPYmplY3RBcmVhKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UpOwotICAgIEZYX0JPT0wJCQlHZXRPYmplY3RDbGlwcGVkUmVjdChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmoyRGV2aWNlLCBGWF9CT09MIGJMb2dpY2FsLCBGWF9SRUNUICZyZWN0KSBjb25zdDsKLSAgICB2b2lkCQkJR2V0U2NhbGVkTWF0cml4KENGWF9NYXRyaXggJm1hdHJpeCkgY29uc3Q7CiAKLXByb3RlY3RlZDoKLSAgICBzdGF0aWMgY29uc3QgaW50IGtSZW5kZXJNYXhSZWN1cnNpb25EZXB0aCA9IDY0OwotICAgIHN0YXRpYyBpbnQgc19DdXJyZW50UmVjdXJzaW9uRGVwdGg7Cit0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPF9QREZfUmVuZGVySXRlbT4gQ1BERl9SZW5kZXJMYXllcjsKIAotICAgIENGWF9SZW5kZXJEZXZpY2UqCQltX3BEZXZpY2U7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeAkJbV9EZXZpY2VNYXRyaXg7Ci0gICAgQ1BERl9DbGlwUGF0aAkJCW1fTGFzdENsaXBQYXRoOwotICAgIGNvbnN0IENQREZfUGFnZU9iamVjdCoJbV9wQ3VyT2JqOwotICAgIGNvbnN0IENQREZfUGFnZU9iamVjdCoJbV9wU3RvcE9iajsKLSAgICBDUERGX0dyYXBoaWNTdGF0ZXMJCW1fSW5pdGlhbFN0YXRlczsKLSAgICBpbnQJCQkJCQltX0hhbGZ0b25lTGltaXQ7Ci0gICAgSVBERl9PYmplY3RSZW5kZXJlcioJbV9wT2JqZWN0UmVuZGVyZXI7Ci0gICAgRlhfQk9PTAkJCQkJbV9iUHJpbnQ7Ci0gICAgaW50CQkJCQkJbV9UcmFuc3BhcmVuY3k7Ci0gICAgaW50CQkJCQkJbV9EaXRoZXJCaXRzOwotICAgIEZYX0JPT0wJCQkJCW1fYkRyb3BPYmplY3RzOwotICAgIEZYX0JPT0wJCQkJCW1fYlN0ZENTOwotICAgIEZYX0RXT1JEICAgICAgICAgICAgICAgIG1fR3JvdXBGYW1pbHk7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICAgICAgbV9iTG9hZE1hc2s7Ci0gICAgQ1BERl9UeXBlM0NoYXIgKiAgICAgICAgbV9wVHlwZTNDaGFyOwotICAgIEZYX0FSR0IJCQkJCW1fVDNGaWxsQ29sb3I7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgbV9jdXJCbGVuZDsKK2NsYXNzIElQREZfT2JqZWN0UmVuZGVyZXIgeworIHB1YmxpYzoKKyAgc3RhdGljIElQREZfT2JqZWN0UmVuZGVyZXIqIENyZWF0ZShpbnQgdHlwZSk7CisgIHZpcnR1YWwgfklQREZfT2JqZWN0UmVuZGVyZXIoKSB7fQorICB2aXJ0dWFsIEZYX0JPT0wgU3RhcnQoQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kVHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpID0gMDsKKyAgRlhfQk9PTCBtX1Jlc3VsdDsKIH07Ci1jbGFzcyBDUERGX0ltYWdlTG9hZGVyIAotewotcHVibGljOgotICAgIENQREZfSW1hZ2VMb2FkZXIoKQotICAgIHsKLSAgICAgICAgbV9wQml0bWFwID0gTlVMTDsKLSAgICAgICAgbV9wTWFzayA9IE5VTEw7Ci0gICAgICAgIG1fTWF0dGVDb2xvciA9IDA7Ci0gICAgICAgIG1fYkNhY2hlZCA9IEZBTFNFOwotICAgICAgICBtX25Eb3duc2FtcGxlV2lkdGggPSAwOwotICAgICAgICBtX25Eb3duc2FtcGxlSGVpZ2h0ID0gMDsKLSAgICB9CiAKLSAgICBGWF9CT09MCQkJCQlMb2FkKGNvbnN0IENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZSwgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBDYWNoZSwgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLCBGWF9CT09MIGJMb2FkTWFzayA9IEZBTFNFLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwpOworY2xhc3MgQ1BERl9SZW5kZXJTdGF0dXMgeworIHB1YmxpYzoKKyAgQ1BERl9SZW5kZXJTdGF0dXMoKTsKKyAgfkNQREZfUmVuZGVyU3RhdHVzKCk7CisgIEZYX0JPT0wgSW5pdGlhbGl6ZShjbGFzcyBDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBEZXZpY2VNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBTdG9wT2JqLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJTdGF0dXMqIHBQYXJlbnRTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0dyYXBoaWNTdGF0ZXMqIHBJbml0aWFsU3RhdGVzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuc3BhcmVuY3ksCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEcm9wT2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgQ1BERl9UeXBlM0NoYXIqIHBUeXBlM0NoYXIgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBmaWxsX2NvbG9yID0gMCwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UpOworICB2b2lkIFJlbmRlck9iamVjdExpc3QoY29uc3QgQ1BERl9QYWdlT2JqZWN0cyogcE9ianMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSk7CisgIHZvaWQgUmVuZGVyU2luZ2xlT2JqZWN0KGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UpOworICBGWF9CT09MIENvbnRpbnVlU2luZ2xlT2JqZWN0KGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIENQREZfUmVuZGVyQ29udGV4dCogR2V0Q29udGV4dCgpIHsgcmV0dXJuIG1fcENvbnRleHQ7IH0KIAotICAgIEZYX0JPT0wJCQkJCVN0YXJ0TG9hZEltYWdlKGNvbnN0IENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZSwgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBDYWNoZSwgRlhfTFBWT0lEJiBMb2FkSGFuZGxlLCBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UsIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzID0gTlVMTCwgRlhfSU5UMzIgbkRvd25zYW1wbGVXaWR0aCA9IDAsIEZYX0lOVDMyIG5Eb3duc2FtcGxlSGVpZ2h0ID0gMCk7Ci0gICAgRlhfQk9PTAkJCQkJQ29udGludWUoRlhfTFBWT0lEIExvYWRIYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKTsKLSAgICB+Q1BERl9JbWFnZUxvYWRlcigpOwotICAgIENGWF9ESUJTb3VyY2UqCQkJbV9wQml0bWFwOwotICAgIENGWF9ESUJTb3VyY2UqCQkJbV9wTWFzazsKLSAgICBGWF9EV09SRAkJCQltX01hdHRlQ29sb3I7Ci0gICAgRlhfQk9PTAkJCQkJbV9iQ2FjaGVkOwotcHJvdGVjdGVkOgotICAgIEZYX0lOVDMyICAgICAgICAgICAgICAgIG1fbkRvd25zYW1wbGVXaWR0aDsKLSAgICBGWF9JTlQzMiAgICAgICAgICAgICAgICBtX25Eb3duc2FtcGxlSGVpZ2h0OwotfTsKLWNsYXNzIENQREZfUHJvZ3Jlc3NpdmVJbWFnZUxvYWRlckhhbmRsZSAKLXsKLXB1YmxpYzoKLSAgICBDUERGX1Byb2dyZXNzaXZlSW1hZ2VMb2FkZXJIYW5kbGUoKTsKLSAgICB+Q1BERl9Qcm9ncmVzc2l2ZUltYWdlTG9hZGVySGFuZGxlKCk7CisgIENQREZfUmVuZGVyT3B0aW9ucyBtX09wdGlvbnM7CisgIENQREZfRGljdGlvbmFyeSogbV9wRm9ybVJlc291cmNlOworICBDUERGX0RpY3Rpb25hcnkqIG1fcFBhZ2VSZXNvdXJjZTsKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9UeXBlM0ZvbnQqPiBtX1R5cGUzRm9udENhY2hlOwogCi0gICAgRlhfQk9PTAkJCVN0YXJ0KENQREZfSW1hZ2VMb2FkZXIqIHBJbWFnZUxvYWRlciwgY29uc3QgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlLCBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcENhY2hlLCBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UsIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzID0gTlVMTCwgRlhfSU5UMzIgbkRvd25zYW1wbGVXaWR0aCA9IDAsIEZYX0lOVDMyIG5Eb3duc2FtcGxlSGVpZ2h0ID0gMCk7Ci0gICAgRlhfQk9PTAkJCUNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKLXByb3RlY3RlZDoKLSAgICBDUERGX0ltYWdlTG9hZGVyKgltX3BJbWFnZUxvYWRlcjsKLSAgICBDUERGX1BhZ2VSZW5kZXJDYWNoZSogbV9wQ2FjaGU7Ci0gICAgQ1BERl9JbWFnZU9iamVjdCogbV9wSW1hZ2U7Ci0gICAgRlhfSU5UMzIgICAgICAgICAgICBtX25Eb3duc2FtcGxlV2lkdGg7Ci0gICAgRlhfSU5UMzIgICAgICAgICAgICBtX25Eb3duc2FtcGxlSGVpZ2h0OworIHByb3RlY3RlZDoKKyAgZnJpZW5kIGNsYXNzIENQREZfSW1hZ2VSZW5kZXJlcjsKKyAgZnJpZW5kIGNsYXNzIENQREZfUmVuZGVyQ29udGV4dDsKKyAgdm9pZCBQcm9jZXNzQ2xpcFBhdGgoQ1BERl9DbGlwUGF0aCBDbGlwUGF0aCwgY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UpOworICB2b2lkIERyYXdDbGlwUGF0aChDUERGX0NsaXBQYXRoIENsaXBQYXRoLCBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSk7CisgIEZYX0JPT0wgUHJvY2Vzc1RyYW5zcGFyZW5jeShjb25zdCBDUERGX1BhZ2VPYmplY3QqIFBhZ2VPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSk7CisgIHZvaWQgUHJvY2Vzc09iamVjdE5vQ2xpcChjb25zdCBDUERGX1BhZ2VPYmplY3QqIFBhZ2VPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSk7CisgIHZvaWQgRHJhd09ialdpdGhCYWNrZ3JvdW5kKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UpOworICBGWF9CT09MIERyYXdPYmpXaXRoQmxlbmQoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UpOworICBGWF9CT09MIFByb2Nlc3NQYXRoKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosIGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlKTsKKyAgdm9pZCBQcm9jZXNzUGF0aFBhdHRlcm4oQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgZmlsbHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJTdHJva2UpOworICB2b2lkIERyYXdQYXRoV2l0aFBhdHRlcm4oQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Db2xvciogcENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3Ryb2tlKTsKKyAgdm9pZCBEcmF3VGlsaW5nUGF0dGVybihDUERGX1RpbGluZ1BhdHRlcm4qIHBQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3Ryb2tlKTsKKyAgdm9pZCBEcmF3U2hhZGluZ1BhdHRlcm4oQ1BERl9TaGFkaW5nUGF0dGVybiogcFBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdHJva2UpOworICBGWF9CT09MIFNlbGVjdENsaXBQYXRoKENQREZfUGF0aE9iamVjdCogcFBhdGhPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3Ryb2tlKTsKKyAgRlhfQk9PTCBQcm9jZXNzSW1hZ2UoQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSk7CisgIEZYX0JPT0wgT3V0cHV0Qml0bWFwQWxwaGEoQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBJbWFnZTJEZXZpY2UpOworICBGWF9CT09MIE91dHB1dEltYWdlKENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwSW1hZ2UyRGV2aWNlKTsKKyAgRlhfQk9PTCBPdXRwdXRESUJTb3VyY2UoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcE91dHB1dEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBmaWxsX2FyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBJbWFnZTJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfSW1hZ2VDYWNoZUVudHJ5KiBwSW1hZ2VDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MpOworICB2b2lkIENvbXBvc2l0ZURJQml0bWFwKENGWF9ESUJpdG1hcCogcERJQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBtYXNrX2FyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYklzb2xhdGVkKTsKKyAgRlhfQk9PTCBQcm9jZXNzU2hhZGluZyhDUERGX1NoYWRpbmdPYmplY3QqIHBTaGFkaW5nT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlKTsKKyAgdm9pZCBEcmF3U2hhZGluZyhDUERGX1NoYWRpbmdQYXR0ZXJuKiBwUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QmIGNsaXBfcmVjdCwKKyAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWxwaGFNb2RlKTsKKyAgRlhfQk9PTCBQcm9jZXNzVHlwZTNUZXh0KGNvbnN0IENQREZfVGV4dE9iamVjdCogdGV4dG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlKTsKKyAgRlhfQk9PTCBQcm9jZXNzVGV4dChjb25zdCBDUERGX1RleHRPYmplY3QqIHRleHRvYmosCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhKiBwQ2xpcHBpbmdQYXRoKTsKKyAgdm9pZCBEcmF3VGV4dFBhdGhXaXRoUGF0dGVybihjb25zdCBDUERGX1RleHRPYmplY3QqIHRleHRvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFRleHRNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmlsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdHJva2UpOworICBGWF9CT09MIFByb2Nlc3NGb3JtKENQREZfRm9ybU9iamVjdCogcEZvcm1PYmosIGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlKTsKKyAgQ0ZYX0RJQml0bWFwKiBHZXRCYWNrZHJvcChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQmFja0FscGhhUmVxdWlyZWQpOworICBDRlhfRElCaXRtYXAqIExvYWRTTWFzayhDUERGX0RpY3Rpb25hcnkqIHBTTWFza0RpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QqIHBDbGlwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7CisgIHZvaWQgSW5pdChDUERGX1JlbmRlckNvbnRleHQqIHBQYXJlbnQpOworICBzdGF0aWMgY2xhc3MgQ1BERl9UeXBlM0NhY2hlKiBHZXRDYWNoZWRUeXBlMyhDUERGX1R5cGUzRm9udCogcEZvbnQpOworICBzdGF0aWMgQ1BERl9HcmFwaGljU3RhdGVzKiBDbG9uZU9ialN0YXRlcyhjb25zdCBDUERGX0dyYXBoaWNTdGF0ZXMqIHBQYXRoT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdHJva2UpOworICBDUERGX1RyYW5zZmVyRnVuYyogR2V0VHJhbnNmZXJGdW5jKENQREZfT2JqZWN0KiBwT2JqZWN0KSBjb25zdDsKKyAgRlhfQVJHQiBHZXRGaWxsQXJnYihjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHlwZTMgPSBGQUxTRSkgY29uc3Q7CisgIEZYX0FSR0IgR2V0U3Ryb2tlQXJnYihjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmopIGNvbnN0OworICBDUERGX1JlbmRlckNvbnRleHQqIG1fcENvbnRleHQ7CisgIEZYX0JPT0wgbV9iU3RvcHBlZDsKKyAgdm9pZCBEaXRoZXJPYmplY3RBcmVhKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlKTsKKyAgRlhfQk9PTCBHZXRPYmplY3RDbGlwcGVkUmVjdChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTG9naWNhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9SRUNUJiByZWN0KSBjb25zdDsKKyAgdm9pZCBHZXRTY2FsZWRNYXRyaXgoQ0ZYX01hdHJpeCYgbWF0cml4KSBjb25zdDsKKworIHByb3RlY3RlZDoKKyAgc3RhdGljIGNvbnN0IGludCBrUmVuZGVyTWF4UmVjdXJzaW9uRGVwdGggPSA2NDsKKyAgc3RhdGljIGludCBzX0N1cnJlbnRSZWN1cnNpb25EZXB0aDsKKworICBDRlhfUmVuZGVyRGV2aWNlKiBtX3BEZXZpY2U7CisgIENGWF9NYXRyaXggbV9EZXZpY2VNYXRyaXg7CisgIENQREZfQ2xpcFBhdGggbV9MYXN0Q2xpcFBhdGg7CisgIGNvbnN0IENQREZfUGFnZU9iamVjdCogbV9wQ3VyT2JqOworICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIG1fcFN0b3BPYmo7CisgIENQREZfR3JhcGhpY1N0YXRlcyBtX0luaXRpYWxTdGF0ZXM7CisgIGludCBtX0hhbGZ0b25lTGltaXQ7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERGX09iamVjdFJlbmRlcmVyPiBtX3BPYmplY3RSZW5kZXJlcjsKKyAgRlhfQk9PTCBtX2JQcmludDsKKyAgaW50IG1fVHJhbnNwYXJlbmN5OworICBpbnQgbV9EaXRoZXJCaXRzOworICBGWF9CT09MIG1fYkRyb3BPYmplY3RzOworICBGWF9CT09MIG1fYlN0ZENTOworICBGWF9EV09SRCBtX0dyb3VwRmFtaWx5OworICBGWF9CT09MIG1fYkxvYWRNYXNrOworICBDUERGX1R5cGUzQ2hhciogbV9wVHlwZTNDaGFyOworICBGWF9BUkdCIG1fVDNGaWxsQ29sb3I7CisgIGludCBtX2N1ckJsZW5kOwogfTsKLWNsYXNzIENGWF9JbWFnZVRyYW5zZm9ybWVyOwotY2xhc3MgQ1BERl9JbWFnZVJlbmRlcmVyIDogcHVibGljIElQREZfT2JqZWN0UmVuZGVyZXIKLXsKLXB1YmxpYzoKLSAgICBDUERGX0ltYWdlUmVuZGVyZXIoKTsKLSAgICB+Q1BERl9JbWFnZVJlbmRlcmVyKCk7Ci0gICAgRlhfQk9PTAkJU3RhcnQoQ1BERl9SZW5kZXJTdGF0dXMqIHBTdGF0dXMsIGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iajJEZXZpY2UsIEZYX0JPT0wgYlN0ZENTLCBpbnQgYmxlbmRUeXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKLSAgICBGWF9CT09MCQlTdGFydChDUERGX1JlbmRlclN0YXR1cyogcFN0YXR1cywgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcERJQlNvdXJjZSwgRlhfQVJHQiBiaXRtYXBfYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwSW1hZ2UyRGV2aWNlLCBGWF9EV09SRCBmbGFncywgRlhfQk9PTCBiU3RkQ1MsIGludCBibGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOwotICAgIEZYX0JPT0wJCUNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKLXByb3RlY3RlZDoKLSAgICBDUERGX1JlbmRlclN0YXR1cyoJbV9wUmVuZGVyU3RhdHVzOwotICAgIENQREZfSW1hZ2VPYmplY3QqCW1fcEltYWdlT2JqZWN0OwotICAgIGludAkJCQkJbV9TdGF0dXM7Ci0gICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogbV9wT2JqMkRldmljZTsKLSAgICBDRlhfQWZmaW5lTWF0cml4CW1fSW1hZ2VNYXRyaXg7Ci0gICAgQ1BERl9JbWFnZUxvYWRlcgltX0xvYWRlcjsKLSAgICBjb25zdCBDRlhfRElCU291cmNlKgkJbV9wRElCU291cmNlOwotICAgIENGWF9ESUJpdG1hcCoJCW1fcENsb25lOwotICAgIGludAkJCQkJbV9CaXRtYXBBbHBoYTsKLSAgICBGWF9CT09MCQkJCW1fYlBhdHRlcm5Db2xvcjsKLSAgICBDUERGX1BhdHRlcm4qCQltX3BQYXR0ZXJuOwotICAgIEZYX0FSR0IJCQkJbV9GaWxsQXJnYjsKLSAgICBGWF9EV09SRAkJCW1fRmxhZ3M7Ci0gICAgQ1BERl9RdWlja1N0cmV0Y2hlcioJbV9wUXVpY2tTdHJldGNoZXI7Ci0gICAgQ0ZYX0ltYWdlVHJhbnNmb3JtZXIqCW1fcFRyYW5zZm9ybWVyOwotICAgIENQREZfSW1hZ2VSZW5kZXJlcioJbV9wUmVuZGVyZXIyOwotICAgIEZYX0xQVk9JRAkJCW1fRGV2aWNlSGFuZGxlOwotICAgIEZYX0xQVk9JRCAgICAgICAgICAgbV9Mb2FkSGFuZGxlOwotICAgIEZYX0JPT0wJCQkJbV9iU3RkQ1M7Ci0gICAgaW50CQkJCQltX0JsZW5kVHlwZTsKLSAgICBGWF9CT09MCQkJCVN0YXJ0Qml0bWFwQWxwaGEoKTsKLSAgICBGWF9CT09MCQkJCVN0YXJ0RElCU291cmNlKCk7Ci0gICAgRlhfQk9PTAkJCQlTdGFydFJlbmRlckRJQlNvdXJjZSgpOwotICAgIEZYX0JPT0wJCQkJU3RhcnRMb2FkRElCU291cmNlKCk7Ci0gICAgRlhfQk9PTAkJCQlEcmF3TWFza2VkSW1hZ2UoKTsKLSAgICBGWF9CT09MCQkJCURyYXdQYXR0ZXJuSW1hZ2UoY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UpOworY2xhc3MgQ1BERl9JbWFnZUxvYWRlciB7CisgcHVibGljOgorICBDUERGX0ltYWdlTG9hZGVyKCkKKyAgICAgIDogbV9wQml0bWFwKG51bGxwdHIpLAorICAgICAgICBtX3BNYXNrKG51bGxwdHIpLAorICAgICAgICBtX01hdHRlQ29sb3IoMCksCisgICAgICAgIG1fYkNhY2hlZChGQUxTRSksCisgICAgICAgIG1fbkRvd25zYW1wbGVXaWR0aCgwKSwKKyAgICAgICAgbV9uRG93bnNhbXBsZUhlaWdodCgwKSB7fQorICB+Q1BERl9JbWFnZUxvYWRlcigpOworCisgIEZYX0JPT0wgU3RhcnQoY29uc3QgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlLAorICAgICAgICAgICAgICAgIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsCisgICAgICAgICAgICAgICAgQ1BERl9JbWFnZUxvYWRlckhhbmRsZSomIExvYWRIYW5kbGUsCisgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsCisgICAgICAgICAgICAgICAgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwsCisgICAgICAgICAgICAgICAgaW50MzJfdCBuRG93bnNhbXBsZVdpZHRoID0gMCwKKyAgICAgICAgICAgICAgICBpbnQzMl90IG5Eb3duc2FtcGxlSGVpZ2h0ID0gMCk7CisgIEZYX0JPT0wgQ29udGludWUoQ1BERl9JbWFnZUxvYWRlckhhbmRsZSogTG9hZEhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpOworCisgIENGWF9ESUJTb3VyY2UqIG1fcEJpdG1hcDsKKyAgQ0ZYX0RJQlNvdXJjZSogbV9wTWFzazsKKyAgRlhfRFdPUkQgbV9NYXR0ZUNvbG9yOworICBGWF9CT09MIG1fYkNhY2hlZDsKKworIHByb3RlY3RlZDoKKyAgaW50MzJfdCBtX25Eb3duc2FtcGxlV2lkdGg7CisgIGludDMyX3QgbV9uRG93bnNhbXBsZUhlaWdodDsKIH07Ci1jbGFzcyBDUERGX1NjYWxlZFJlbmRlckJ1ZmZlciAKLXsKLXB1YmxpYzoKLSAgICBDUERGX1NjYWxlZFJlbmRlckJ1ZmZlcigpOwotICAgIH5DUERGX1NjYWxlZFJlbmRlckJ1ZmZlcigpOwotICAgIEZYX0JPT0wJCQkJSW5pdGlhbGl6ZShDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBGWF9SRUNUKiBwUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMgKnBPcHRpb25zID0gTlVMTCwgaW50IG1heF9kcGkgPSAwKTsKLSAgICBDRlhfUmVuZGVyRGV2aWNlKglHZXREZXZpY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEJpdG1hcERldmljZSA/IG1fcEJpdG1hcERldmljZSA6IG1fcERldmljZTsKLSAgICB9Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCoJR2V0TWF0cml4KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAmbV9NYXRyaXg7Ci0gICAgfQotICAgIHZvaWQJCQkJT3V0cHV0VG9EZXZpY2UoKTsKLXByaXZhdGU6Ci0gICAgQ0ZYX1JlbmRlckRldmljZSoJbV9wRGV2aWNlOwotICAgIENQREZfUmVuZGVyQ29udGV4dCoJbV9wQ29udGV4dDsKLSAgICBGWF9SRUNUCQkJCW1fUmVjdDsKLSAgICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIG1fcE9iamVjdDsKLSAgICBDRlhfRnhnZURldmljZSoJbV9wQml0bWFwRGV2aWNlOwotICAgIENGWF9BZmZpbmVNYXRyaXgJbV9NYXRyaXg7CitjbGFzcyBDUERGX0ltYWdlTG9hZGVySGFuZGxlIHsKKyBwdWJsaWM6CisgIENQREZfSW1hZ2VMb2FkZXJIYW5kbGUoKTsKKyAgfkNQREZfSW1hZ2VMb2FkZXJIYW5kbGUoKTsKKworICBGWF9CT09MIFN0YXJ0KENQREZfSW1hZ2VMb2FkZXIqIHBJbWFnZUxvYWRlciwKKyAgICAgICAgICAgICAgICBjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2UsCisgICAgICAgICAgICAgICAgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBDYWNoZSwKKyAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLAorICAgICAgICAgICAgICAgIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwKKyAgICAgICAgICAgICAgICBGWF9CT09MIGJMb2FkTWFzayA9IEZBTFNFLAorICAgICAgICAgICAgICAgIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzID0gTlVMTCwKKyAgICAgICAgICAgICAgICBpbnQzMl90IG5Eb3duc2FtcGxlV2lkdGggPSAwLAorICAgICAgICAgICAgICAgIGludDMyX3QgbkRvd25zYW1wbGVIZWlnaHQgPSAwKTsKKyAgRlhfQk9PTCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CisKKyBwcm90ZWN0ZWQ6CisgIENQREZfSW1hZ2VMb2FkZXIqIG1fcEltYWdlTG9hZGVyOworICBDUERGX1BhZ2VSZW5kZXJDYWNoZSogbV9wQ2FjaGU7CisgIENQREZfSW1hZ2VPYmplY3QqIG1fcEltYWdlOworICBpbnQzMl90IG1fbkRvd25zYW1wbGVXaWR0aDsKKyAgaW50MzJfdCBtX25Eb3duc2FtcGxlSGVpZ2h0OwogfTsKLWNsYXNzIElDb2RlY19TY2FubGluZURlY29kZXI7Ci1jbGFzcyBDUERGX1F1aWNrU3RyZXRjaGVyIAotewotcHVibGljOgotICAgIENQREZfUXVpY2tTdHJldGNoZXIoKTsKLSAgICB+Q1BERl9RdWlja1N0cmV0Y2hlcigpOwotICAgIEZYX0JPT0wJCVN0YXJ0KENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiwgQ0ZYX0FmZmluZU1hdHJpeCogcEltYWdlMkRldmljZSwgY29uc3QgRlhfUkVDVCogcENsaXBCb3gpOwotICAgIEZYX0JPT0wJCUNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKLSAgICBDRlhfRElCaXRtYXAqCW1fcEJpdG1hcDsKLSAgICBpbnQJCQltX1Jlc3VsdExlZnQsIG1fUmVzdWx0VG9wLCBtX0NsaXBMZWZ0LCBtX0NsaXBUb3A7Ci0gICAgaW50CQkJbV9EZXN0V2lkdGgsIG1fRGVzdEhlaWdodCwgbV9SZXN1bHRXaWR0aCwgbV9SZXN1bHRIZWlnaHQ7Ci0gICAgaW50CQkJbV9CcHAsIG1fU3JjV2lkdGgsIG1fU3JjSGVpZ2h0OwotICAgIEZYX0JPT0wJCW1fYkZsaXBYLCBtX2JGbGlwWTsKLSAgICBDUERGX0NvbG9yU3BhY2UqCW1fcENTOwotICAgIElDb2RlY19TY2FubGluZURlY29kZXIqCW1fcERlY29kZXI7Ci0gICAgQ1BERl9TdHJlYW1BY2MgbV9TdHJlYW1BY2M7Ci0gICAgaW50CQkJbV9MaW5lSW5kZXg7CisKK2NsYXNzIENQREZfSW1hZ2VSZW5kZXJlciA6IHB1YmxpYyBJUERGX09iamVjdFJlbmRlcmVyIHsKKyBwdWJsaWM6CisgIENQREZfSW1hZ2VSZW5kZXJlcigpOworICB+Q1BERl9JbWFnZVJlbmRlcmVyKCkgb3ZlcnJpZGU7CisKKyAgLy8gSVBERl9PYmplY3RSZW5kZXJlcgorICBGWF9CT09MIFN0YXJ0KENQREZfUmVuZGVyU3RhdHVzKiBwU3RhdHVzLAorICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSwKKyAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUywKKyAgICAgICAgICAgICAgICBpbnQgYmxlbmRUeXBlID0gRlhESUJfQkxFTkRfTk9STUFMKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkgb3ZlcnJpZGU7CisKKyAgRlhfQk9PTCBTdGFydChDUERGX1JlbmRlclN0YXR1cyogcFN0YXR1cywKKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwRElCU291cmNlLAorICAgICAgICAgICAgICAgIEZYX0FSR0IgYml0bWFwX2FyZ2IsCisgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwSW1hZ2UyRGV2aWNlLAorICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTLAorICAgICAgICAgICAgICAgIGludCBibGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOworCisgcHJvdGVjdGVkOgorICBDUERGX1JlbmRlclN0YXR1cyogbV9wUmVuZGVyU3RhdHVzOworICBDUERGX0ltYWdlT2JqZWN0KiBtX3BJbWFnZU9iamVjdDsKKyAgaW50IG1fU3RhdHVzOworICBjb25zdCBDRlhfTWF0cml4KiBtX3BPYmoyRGV2aWNlOworICBDRlhfTWF0cml4IG1fSW1hZ2VNYXRyaXg7CisgIENQREZfSW1hZ2VMb2FkZXIgbV9Mb2FkZXI7CisgIGNvbnN0IENGWF9ESUJTb3VyY2UqIG1fcERJQlNvdXJjZTsKKyAgQ0ZYX0RJQml0bWFwKiBtX3BDbG9uZTsKKyAgaW50IG1fQml0bWFwQWxwaGE7CisgIEZYX0JPT0wgbV9iUGF0dGVybkNvbG9yOworICBDUERGX1BhdHRlcm4qIG1fcFBhdHRlcm47CisgIEZYX0FSR0IgbV9GaWxsQXJnYjsKKyAgRlhfRFdPUkQgbV9GbGFnczsKKyAgQ0ZYX0ltYWdlVHJhbnNmb3JtZXIqIG1fcFRyYW5zZm9ybWVyOworICB2b2lkKiBtX0RldmljZUhhbmRsZTsKKyAgQ1BERl9JbWFnZUxvYWRlckhhbmRsZSogbV9Mb2FkSGFuZGxlOworICBGWF9CT09MIG1fYlN0ZENTOworICBpbnQgbV9CbGVuZFR5cGU7CisgIEZYX0JPT0wgU3RhcnRCaXRtYXBBbHBoYSgpOworICBGWF9CT09MIFN0YXJ0RElCU291cmNlKCk7CisgIEZYX0JPT0wgU3RhcnRSZW5kZXJESUJTb3VyY2UoKTsKKyAgRlhfQk9PTCBTdGFydExvYWRESUJTb3VyY2UoKTsKKyAgRlhfQk9PTCBEcmF3TWFza2VkSW1hZ2UoKTsKKyAgRlhfQk9PTCBEcmF3UGF0dGVybkltYWdlKGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlKTsKIH07Ci1jbGFzcyBDUERGX0RldmljZUJ1ZmZlciAKLXsKLXB1YmxpYzoKLSAgICBDUERGX0RldmljZUJ1ZmZlcigpOwotICAgIH5DUERGX0RldmljZUJ1ZmZlcigpOwotICAgIEZYX0JPT0wJCQkJSW5pdGlhbGl6ZShDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBGWF9SRUNUKiBwUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBpbnQgbWF4X2RwaSA9IDApOwotICAgIHZvaWQJCQkJT3V0cHV0VG9EZXZpY2UoKTsKLSAgICBDRlhfRElCaXRtYXAqCQlHZXRCaXRtYXAoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEJpdG1hcDsKLSAgICB9Ci0gICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCoJR2V0TWF0cml4KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiAmbV9NYXRyaXg7Ci0gICAgfQotcHJpdmF0ZToKLSAgICBDRlhfUmVuZGVyRGV2aWNlKgltX3BEZXZpY2U7Ci0gICAgQ1BERl9SZW5kZXJDb250ZXh0KgltX3BDb250ZXh0OwotICAgIEZYX1JFQ1QJCQkJbV9SZWN0OwotICAgIGNvbnN0IENQREZfUGFnZU9iamVjdCogbV9wT2JqZWN0OwotICAgIENGWF9ESUJpdG1hcCoJCW1fcEJpdG1hcDsKLSAgICBDRlhfQWZmaW5lTWF0cml4CW1fTWF0cml4OworCitjbGFzcyBDUERGX1NjYWxlZFJlbmRlckJ1ZmZlciB7CisgcHVibGljOgorICBDUERGX1NjYWxlZFJlbmRlckJ1ZmZlcigpOworICB+Q1BERl9TY2FsZWRSZW5kZXJCdWZmZXIoKTsKKworICBGWF9CT09MIEluaXRpYWxpemUoQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUJiBwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9kcGkgPSAwKTsKKyAgQ0ZYX1JlbmRlckRldmljZSogR2V0RGV2aWNlKCkgeworICAgIHJldHVybiBtX3BCaXRtYXBEZXZpY2UgPyBtX3BCaXRtYXBEZXZpY2UuZ2V0KCkgOiBtX3BEZXZpY2U7CisgIH0KKyAgQ0ZYX01hdHJpeCogR2V0TWF0cml4KCkgeyByZXR1cm4gJm1fTWF0cml4OyB9CisgIHZvaWQgT3V0cHV0VG9EZXZpY2UoKTsKKworIHByaXZhdGU6CisgIENGWF9SZW5kZXJEZXZpY2UqIG1fcERldmljZTsKKyAgQ1BERl9SZW5kZXJDb250ZXh0KiBtX3BDb250ZXh0OworICBGWF9SRUNUIG1fUmVjdDsKKyAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBtX3BPYmplY3Q7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRnhnZURldmljZT4gbV9wQml0bWFwRGV2aWNlOworICBDRlhfTWF0cml4IG1fTWF0cml4OwogfTsKLWNsYXNzIENQREZfSW1hZ2VDYWNoZSAKLXsKLXB1YmxpYzoKLSAgICBDUERGX0ltYWdlQ2FjaGUoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9TdHJlYW0qIHBTdHJlYW0pOwotICAgIH5DUERGX0ltYWdlQ2FjaGUoKTsKLSAgICB2b2lkCQkJCUNsZWFySW1hZ2VEYXRhKCk7Ci0gICAgdm9pZAkJCQlSZXNldChjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXApOwotICAgIEZYX0JPT0wJCQkJR2V0Q2FjaGVkQml0bWFwKENGWF9ESUJTb3VyY2UqJiBwQml0bWFwLCBDRlhfRElCU291cmNlKiYgcE1hc2ssIEZYX0RXT1JEJiBNYXR0ZUNvbG9yLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwsIEZYX0lOVDMyIGRvd25zYW1wbGVXaWR0aCA9IDAsIEZYX0lOVDMyIGRvd25zYW1wbGVIZWlnaHQgPSAwKTsKLSAgICBGWF9EV09SRAkJCUVzdGltYXRlU2l6ZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9kd0NhY2hlU2l6ZTsKLSAgICB9Ci0gICAgRlhfRFdPUkQJCQlHZXRUaW1lQ291bnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fZHdUaW1lQ291bnQ7Ci0gICAgfQotICAgIENQREZfU3RyZWFtKgkJR2V0U3RyZWFtKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BTdHJlYW07Ci0gICAgfQotICAgIHZvaWQJCQkJU2V0VGltZUNvdW50KEZYX0RXT1JEIGR3VGltZUNvdW50KQotICAgIHsKLSAgICAgICAgbV9kd1RpbWVDb3VudCA9IGR3VGltZUNvdW50OwotICAgIH0KLSAgICBpbnQJCQkJCW1fZHdUaW1lQ291bnQ7Ci1wdWJsaWM6Ci0gICAgaW50CQkJCQlTdGFydEdldENhY2hlZEJpdG1hcChDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2VzLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLAotICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLAotICAgICAgICAgICAgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSwgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMgPSBOVUxMLCBGWF9JTlQzMiBkb3duc2FtcGxlV2lkdGggPSAwLCBGWF9JTlQzMiBkb3duc2FtcGxlSGVpZ2h0ID0gMCk7Ci0gICAgaW50CQkJCQlDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gICAgaW50IAkJCQlDb250aW51ZUdldENhY2hlZEJpdG1hcCgpOwotICAgIENGWF9ESUJTb3VyY2UqCQlEZXRhY2hCaXRtYXAoKTsKLSAgICBDRlhfRElCU291cmNlKgkJRGV0YWNoTWFzaygpOwotICAgIENGWF9ESUJTb3VyY2UqCQltX3BDdXJCaXRtYXA7Ci0gICAgQ0ZYX0RJQlNvdXJjZSoJCW1fcEN1ck1hc2s7Ci0gICAgRlhfRFdPUkQJCQltX01hdHRlQ29sb3I7Ci0gICAgQ1BERl9SZW5kZXJTdGF0dXMqICBtX3BSZW5kZXJTdGF0dXM7Ci1wcm90ZWN0ZWQ6Ci0gICAgQ1BERl9Eb2N1bWVudCoJCW1fcERvY3VtZW50OwotICAgIENQREZfU3RyZWFtKgkJbV9wU3RyZWFtOwotICAgIENGWF9ESUJTb3VyY2UqCQltX3BDYWNoZWRCaXRtYXA7Ci0gICAgQ0ZYX0RJQlNvdXJjZSoJCW1fcENhY2hlZE1hc2s7Ci0gICAgRlhfRFdPUkQJCQltX2R3Q2FjaGVTaXplOwotICAgIHZvaWQJQ2FsY1NpemUoKTsKKworY2xhc3MgQ1BERl9EZXZpY2VCdWZmZXIgeworIHB1YmxpYzoKKyAgQ1BERl9EZXZpY2VCdWZmZXIoKTsKKyAgfkNQREZfRGV2aWNlQnVmZmVyKCk7CisgIEZYX0JPT0wgSW5pdGlhbGl6ZShDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QqIHBSZWN0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9kcGkgPSAwKTsKKyAgdm9pZCBPdXRwdXRUb0RldmljZSgpOworICBDRlhfRElCaXRtYXAqIEdldEJpdG1hcCgpIGNvbnN0IHsgcmV0dXJuIG1fcEJpdG1hcC5nZXQoKTsgfQorICBjb25zdCBDRlhfTWF0cml4KiBHZXRNYXRyaXgoKSBjb25zdCB7IHJldHVybiAmbV9NYXRyaXg7IH0KKworIHByaXZhdGU6CisgIENGWF9SZW5kZXJEZXZpY2UqIG1fcERldmljZTsKKyAgQ1BERl9SZW5kZXJDb250ZXh0KiBtX3BDb250ZXh0OworICBGWF9SRUNUIG1fUmVjdDsKKyAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBtX3BPYmplY3Q7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IG1fcEJpdG1hcDsKKyAgQ0ZYX01hdHJpeCBtX01hdHJpeDsKK307CisKK2NsYXNzIENQREZfSW1hZ2VDYWNoZUVudHJ5IHsKKyBwdWJsaWM6CisgIENQREZfSW1hZ2VDYWNoZUVudHJ5KENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfU3RyZWFtKiBwU3RyZWFtKTsKKyAgfkNQREZfSW1hZ2VDYWNoZUVudHJ5KCk7CisgIHZvaWQgQ2xlYXJJbWFnZURhdGEoKTsKKyAgdm9pZCBSZXNldChjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXApOworICBGWF9CT09MIEdldENhY2hlZEJpdG1hcChDRlhfRElCU291cmNlKiYgcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQlNvdXJjZSomIHBNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgTWF0dGVDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJMb2FkTWFzayA9IEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZG93bnNhbXBsZVdpZHRoID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkb3duc2FtcGxlSGVpZ2h0ID0gMCk7CisgIEZYX0RXT1JEIEVzdGltYXRlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZHdDYWNoZVNpemU7IH0KKyAgRlhfRFdPUkQgR2V0VGltZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbV9kd1RpbWVDb3VudDsgfQorICBDUERGX1N0cmVhbSogR2V0U3RyZWFtKCkgY29uc3QgeyByZXR1cm4gbV9wU3RyZWFtOyB9CisgIHZvaWQgU2V0VGltZUNvdW50KEZYX0RXT1JEIGR3VGltZUNvdW50KSB7IG1fZHdUaW1lQ291bnQgPSBkd1RpbWVDb3VudDsgfQorICBpbnQgbV9kd1RpbWVDb3VudDsKKworIHB1YmxpYzoKKyAgaW50IFN0YXJ0R2V0Q2FjaGVkQml0bWFwKENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RkQ1MgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRvd25zYW1wbGVXaWR0aCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRvd25zYW1wbGVIZWlnaHQgPSAwKTsKKyAgaW50IENvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgQ0ZYX0RJQlNvdXJjZSogRGV0YWNoQml0bWFwKCk7CisgIENGWF9ESUJTb3VyY2UqIERldGFjaE1hc2soKTsKKyAgQ0ZYX0RJQlNvdXJjZSogbV9wQ3VyQml0bWFwOworICBDRlhfRElCU291cmNlKiBtX3BDdXJNYXNrOworICBGWF9EV09SRCBtX01hdHRlQ29sb3I7CisgIENQREZfUmVuZGVyU3RhdHVzKiBtX3BSZW5kZXJTdGF0dXM7CisKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgQ29udGludWVHZXRDYWNoZWRCaXRtYXAoKTsKKworICBDUERGX0RvY3VtZW50KiBtX3BEb2N1bWVudDsKKyAgQ1BERl9TdHJlYW0qIG1fcFN0cmVhbTsKKyAgQ0ZYX0RJQlNvdXJjZSogbV9wQ2FjaGVkQml0bWFwOworICBDRlhfRElCU291cmNlKiBtX3BDYWNoZWRNYXNrOworICBGWF9EV09SRCBtX2R3Q2FjaGVTaXplOworICB2b2lkIENhbGNTaXplKCk7CiB9OwogdHlwZWRlZiBzdHJ1Y3QgewotICAgIEZYX0ZMT0FUCQkJbV9EZWNvZGVNaW47Ci0gICAgRlhfRkxPQVQJCQltX0RlY29kZVN0ZXA7Ci0gICAgaW50CQkJCQltX0NvbG9yS2V5TWluOwotICAgIGludAkJCQkJbV9Db2xvcktleU1heDsKKyAgRlhfRkxPQVQgbV9EZWNvZGVNaW47CisgIEZYX0ZMT0FUIG1fRGVjb2RlU3RlcDsKKyAgaW50IG1fQ29sb3JLZXlNaW47CisgIGludCBtX0NvbG9yS2V5TWF4OwogfSBESUJfQ09NUF9EQVRBOwotY2xhc3MgQ1BERl9ESUJTb3VyY2UgOiBwdWJsaWMgQ0ZYX0RJQlNvdXJjZQotewotcHVibGljOgotICAgIENQREZfRElCU291cmNlKCk7Ci0gICAgdmlydHVhbCB+Q1BERl9ESUJTb3VyY2UoKTsKLSAgICBGWF9CT09MCQkJCUxvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRElCU291cmNlKiogcHBNYXNrLCBGWF9EV09SRCogcE1hdHRlQ29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZXMsIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsIEZYX0RXT1JEIEdyb3VwRmFtaWx5ID0gMCwgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlTa2lwVG9TY2FubGluZShpbnQgbGluZSwgSUZYX1BhdXNlKiBwUGF1c2UpIGNvbnN0OwotICAgIHZpcnR1YWwJRlhfTFBCWVRFCUdldEJ1ZmZlcigpIGNvbnN0OwotICAgIHZpcnR1YWwgRlhfTFBDQllURQlHZXRTY2FubGluZShpbnQgbGluZSkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkCQlEb3duU2FtcGxlU2NhbmxpbmUoaW50IGxpbmUsIEZYX0xQQllURSBkZXN0X3NjYW4sIGludCBkZXN0X2JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgRlhfQk9PTCBiRmxpcFgsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3dpZHRoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQJCVNldERvd25TYW1wbGVTaXplKGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQpIGNvbnN0OwotICAgIENGWF9ESUJpdG1hcCoJCUdldEJpdG1hcCgpIGNvbnN0OwotICAgIHZvaWQJCQkJUmVsZWFzZUJpdG1hcChDRlhfRElCaXRtYXAqKSBjb25zdDsKLSAgICB2b2lkCQkJCUNsZWFySW1hZ2VEYXRhKCk7Ci1wdWJsaWM6Ci0gICAgaW50CQkJCQlTdGFydExvYWRESUJTb3VyY2UoQ1BERl9Eb2N1bWVudCogcERvYywgY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0sIEZYX0JPT0wgYkhhc01hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLCBGWF9EV09SRCBHcm91cEZhbWlseSA9IDAsIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UpOwotICAgIGludAkJCQkJQ29udGludWVMb2FkRElCU291cmNlKElGWF9QYXVzZSogcFBhdXNlKTsKLSAgICBpbnQJCQkJCVN0cmF0TG9hZE1hc2soKTsKLSAgICBpbnQJCQkJCVN0YXJ0TG9hZE1hc2tESUIoKTsKLSAgICBpbnQJCQkJCUNvbnRpbnVlTG9hZE1hc2tESUIoSUZYX1BhdXNlKiBwUGF1c2UpOwotICAgIGludAkJCQkJQ29udGludWVUb0xvYWRNYXNrKCk7Ci0gICAgQ1BERl9ESUJTb3VyY2UqCQlEZXRhY2hNYXNrKCk7Ci0gICAgQ1BERl9ESUJTb3VyY2UqCQltX3BNYXNrOwotICAgIEZYX0RXT1JECQkJbV9NYXR0ZUNvbG9yOwotICAgIEZYX0xQVk9JRAkJCW1fcEpiaWcyQ29udGV4dDsKLSAgICBDUERGX1N0cmVhbUFjYyoJCW1fcEdsb2JhbFN0cmVhbTsKLSAgICBGWF9CT09MCQkJCW1fYlN0ZENTOwotICAgIGludAkJCQkJbV9TdGF0dXM7Ci0gICAgQ1BERl9PYmplY3QqCQltX3BNYXNrU3RyZWFtOwotICAgIEZYX0JPT0wJCQkJbV9iSGFzTWFzazsKLXByb3RlY3RlZDoKLSAgICBGWF9CT09MCQkJCUxvYWRDb2xvckluZm8oQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcyk7Ci0gICAgRElCX0NPTVBfREFUQSogICAgICBHZXREZWNvZGVBbmRNYXNrQXJyYXkoRlhfQk9PTCYgYkRlZmF1bHREZWNvZGUsIEZYX0JPT0wmIGJDb2xvcktleSk7Ci0gICAgQ1BERl9ESUJTb3VyY2UqCQlMb2FkTWFzayhGWF9EV09SRCYgTWF0dGVDb2xvcik7Ci0gICAgQ1BERl9ESUJTb3VyY2UqCQlMb2FkTWFza0RJQihDUERGX1N0cmVhbSogcE1hc2spOwotICAgIHZvaWQJCQkJTG9hZEpweEJpdG1hcCgpOwotICAgIHZvaWQJCQkJTG9hZFBhbGV0dGUoKTsKLSAgICBpbnQJCQkJCUNyZWF0ZURlY29kZXIoKTsKLSAgICB2b2lkCQkJCVRyYW5zbGF0ZVNjYW5saW5lMjRicHAoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbikgY29uc3Q7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBWYWxpZGF0ZURpY3RQYXJhbSgpOwotICAgIENQREZfRG9jdW1lbnQqCQltX3BEb2N1bWVudDsKLSAgICBjb25zdCBDUERGX1N0cmVhbSoJbV9wU3RyZWFtOwotICAgIENQREZfU3RyZWFtQWNjKgkJbV9wU3RyZWFtQWNjOwotICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSoJbV9wRGljdDsKLSAgICBDUERGX0NvbG9yU3BhY2UqCW1fcENvbG9yU3BhY2U7Ci0gICAgRlhfRFdPUkQJCQltX0ZhbWlseTsKLSAgICBGWF9EV09SRAkJCW1fYnBjOwotICAgIEZYX0RXT1JECQkJbV9icGNfb3JpZzsKLSAgICBGWF9EV09SRAkJCW1fbkNvbXBvbmVudHM7Ci0gICAgRlhfRFdPUkQJCQltX0dyb3VwRmFtaWx5OwotICAgIEZYX0JPT0wJCQkJbV9iTG9hZE1hc2s7Ci0gICAgRlhfQk9PTAkJCQltX2JEZWZhdWx0RGVjb2RlOwotICAgIEZYX0JPT0wJCQkJbV9iSW1hZ2VNYXNrOwotICAgIEZYX0JPT0wJCQkJbV9iRG9CcGNDaGVjazsKLSAgICBGWF9CT09MCQkJCW1fYkNvbG9yS2V5OwotICAgIERJQl9DT01QX0RBVEEqCQltX3BDb21wRGF0YTsKLSAgICBGWF9MUEJZVEUJCQltX3BMaW5lQnVmOwotICAgIEZYX0xQQllURQkJCW1fcE1hc2tlZExpbmU7Ci0gICAgQ0ZYX0RJQml0bWFwKgkJbV9wQ2FjaGVkQml0bWFwOwotICAgIElDb2RlY19TY2FubGluZURlY29kZXIqCW1fcERlY29kZXI7CisKK2NsYXNzIENQREZfRElCU291cmNlIDogcHVibGljIENGWF9ESUJTb3VyY2UgeworIHB1YmxpYzoKKyAgQ1BERl9ESUJTb3VyY2UoKTsKKyAgfkNQREZfRElCU291cmNlKCkgb3ZlcnJpZGU7CisKKyAgRlhfQk9PTCBMb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICBjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSwKKyAgICAgICAgICAgICAgIENQREZfRElCU291cmNlKiogcHBNYXNrLAorICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBNYXR0ZUNvbG9yLAorICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywKKyAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsCisgICAgICAgICAgICAgICBGWF9CT09MIGJTdGRDUyA9IEZBTFNFLAorICAgICAgICAgICAgICAgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLAorICAgICAgICAgICAgICAgRlhfQk9PTCBiTG9hZE1hc2sgPSBGQUxTRSk7CisKKyAgLy8gQ0ZYX0RJQlNvdXJjZQorICBGWF9CT09MIFNraXBUb1NjYW5saW5lKGludCBsaW5lLCBJRlhfUGF1c2UqIHBQYXVzZSkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ4X3QqIEdldEJ1ZmZlcigpIGNvbnN0IG92ZXJyaWRlOworICBjb25zdCB1aW50OF90KiBHZXRTY2FubGluZShpbnQgbGluZSkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgRG93blNhbXBsZVNjYW5saW5lKGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZsaXBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF93aWR0aCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2V0RG93blNhbXBsZVNpemUoaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgQ0ZYX0RJQml0bWFwKiBHZXRCaXRtYXAoKSBjb25zdDsKKyAgdm9pZCBSZWxlYXNlQml0bWFwKENGWF9ESUJpdG1hcCopIGNvbnN0OworICB2b2lkIENsZWFySW1hZ2VEYXRhKCk7CisKKyAgaW50IFN0YXJ0TG9hZERJQlNvdXJjZShDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfU3RyZWFtKiBwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkhhc01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0ZENTID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgR3JvdXBGYW1pbHkgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxvYWRNYXNrID0gRkFMU0UpOworICBpbnQgQ29udGludWVMb2FkRElCU291cmNlKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgaW50IFN0cmF0TG9hZE1hc2soKTsKKyAgaW50IFN0YXJ0TG9hZE1hc2tESUIoKTsKKyAgaW50IENvbnRpbnVlTG9hZE1hc2tESUIoSUZYX1BhdXNlKiBwUGF1c2UpOworICBpbnQgQ29udGludWVUb0xvYWRNYXNrKCk7CisgIENQREZfRElCU291cmNlKiBEZXRhY2hNYXNrKCk7CisgIENQREZfRElCU291cmNlKiBtX3BNYXNrOworICBGWF9EV09SRCBtX01hdHRlQ29sb3I7CisgIHZvaWQqIG1fcEpiaWcyQ29udGV4dDsKKyAgQ1BERl9TdHJlYW1BY2MqIG1fcEdsb2JhbFN0cmVhbTsKKyAgRlhfQk9PTCBtX2JTdGRDUzsKKyAgaW50IG1fU3RhdHVzOworICBDUERGX1N0cmVhbSogbV9wTWFza1N0cmVhbTsKKyAgRlhfQk9PTCBtX2JIYXNNYXNrOworCisgcHJpdmF0ZToKKyAgYm9vbCBMb2FkQ29sb3JJbmZvKGNvbnN0IENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzKTsKKyAgRElCX0NPTVBfREFUQSogR2V0RGVjb2RlQW5kTWFza0FycmF5KEZYX0JPT0wmIGJEZWZhdWx0RGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkNvbG9yS2V5KTsKKyAgQ1BERl9ESUJTb3VyY2UqIExvYWRNYXNrKEZYX0RXT1JEJiBNYXR0ZUNvbG9yKTsKKyAgQ1BERl9ESUJTb3VyY2UqIExvYWRNYXNrRElCKENQREZfU3RyZWFtKiBwTWFzayk7CisgIHZvaWQgTG9hZEpweEJpdG1hcCgpOworICB2b2lkIExvYWRQYWxldHRlKCk7CisgIGludCBDcmVhdGVEZWNvZGVyKCk7CisgIHZvaWQgVHJhbnNsYXRlU2NhbmxpbmUyNGJwcCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbikgY29uc3Q7CisgIHZvaWQgVmFsaWRhdGVEaWN0UGFyYW0oKTsKKyAgdm9pZCBEb3duU2FtcGxlU2NhbmxpbmUxQml0KGludCBvcmlnX0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY193aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBTcmNMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGbGlwWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF93aWR0aCkgY29uc3Q7CisgIHZvaWQgRG93blNhbXBsZVNjYW5saW5lOEJpdChpbnQgb3JpZ19CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwU3JjTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmxpcFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfd2lkdGgpIGNvbnN0OworICB2b2lkIERvd25TYW1wbGVTY2FubGluZTMyQml0KGludCBvcmlnX0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBTcmNMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGbGlwWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3dpZHRoKSBjb25zdDsKKyAgRlhfQk9PTCBUcmFuc01hc2soKSBjb25zdDsKKworICBDUERGX0RvY3VtZW50KiBtX3BEb2N1bWVudDsKKyAgY29uc3QgQ1BERl9TdHJlYW0qIG1fcFN0cmVhbTsKKyAgQ1BERl9TdHJlYW1BY2MqIG1fcFN0cmVhbUFjYzsKKyAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBtX3BEaWN0OworICBDUERGX0NvbG9yU3BhY2UqIG1fcENvbG9yU3BhY2U7CisgIEZYX0RXT1JEIG1fRmFtaWx5OworICBGWF9EV09SRCBtX2JwYzsKKyAgRlhfRFdPUkQgbV9icGNfb3JpZzsKKyAgRlhfRFdPUkQgbV9uQ29tcG9uZW50czsKKyAgRlhfRFdPUkQgbV9Hcm91cEZhbWlseTsKKyAgRlhfQk9PTCBtX2JMb2FkTWFzazsKKyAgRlhfQk9PTCBtX2JEZWZhdWx0RGVjb2RlOworICBGWF9CT09MIG1fYkltYWdlTWFzazsKKyAgRlhfQk9PTCBtX2JEb0JwY0NoZWNrOworICBGWF9CT09MIG1fYkNvbG9yS2V5OworICBESUJfQ09NUF9EQVRBKiBtX3BDb21wRGF0YTsKKyAgdWludDhfdCogbV9wTGluZUJ1ZjsKKyAgdWludDhfdCogbV9wTWFza2VkTGluZTsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWF9ESUJpdG1hcD4gbV9wQ2FjaGVkQml0bWFwOworICBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKiBtX3BEZWNvZGVyOwogfTsKLSNkZWZpbmUgRlBERl9IVUdFX0lNQUdFX1NJWkUJNjAwMDAwMDAKLWNsYXNzIENQREZfRElCVHJhbnNmZXJGdW5jIDogcHVibGljIENGWF9GaWx0ZXJlZERJQgotewotcHVibGljOgotICAgIENQREZfRElCVHJhbnNmZXJGdW5jKGNvbnN0IENQREZfVHJhbnNmZXJGdW5jKiBwVHJhbnNmZXJGdW5jKTsKLSAgICB2aXJ0dWFsIEZYRElCX0Zvcm1hdAlHZXREZXN0Rm9ybWF0KCk7Ci0gICAgdmlydHVhbCBGWF9BUkdCKgkJR2V0RGVzdFBhbGV0dGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZAkJCVRyYW5zbGF0ZVNjYW5saW5lKEZYX0xQQllURSBkZXN0X2J1ZiwgRlhfTFBDQllURSBzcmNfYnVmKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQJCQlUcmFuc2xhdGVEb3duU2FtcGxlcyhGWF9MUEJZVEUgZGVzdF9idWYsIEZYX0xQQ0JZVEUgc3JjX2J1ZiwgaW50IHBpeGVscywgaW50IEJwcCkgY29uc3Q7Ci0gICAgRlhfTFBDQllURQkJCQltX1JhbXBSOwotICAgIEZYX0xQQ0JZVEUJCQkJbV9SYW1wRzsKLSAgICBGWF9MUENCWVRFCQkJCW1fUmFtcEI7CisKKyNkZWZpbmUgRlBERl9IVUdFX0lNQUdFX1NJWkUgNjAwMDAwMDAKK2NsYXNzIENQREZfRElCVHJhbnNmZXJGdW5jIDogcHVibGljIENGWF9GaWx0ZXJlZERJQiB7CisgcHVibGljOgorICBDUERGX0RJQlRyYW5zZmVyRnVuYyhjb25zdCBDUERGX1RyYW5zZmVyRnVuYyogcFRyYW5zZmVyRnVuYyk7CisgIH5DUERGX0RJQlRyYW5zZmVyRnVuYygpIG92ZXJyaWRlOworCisgIC8vIENGWF9GaWx0ZXJlZERJQgorICBGWERJQl9Gb3JtYXQgR2V0RGVzdEZvcm1hdCgpIG92ZXJyaWRlOworICBGWF9BUkdCKiBHZXREZXN0UGFsZXR0ZSgpIG92ZXJyaWRlIHsgcmV0dXJuIE5VTEw7IH0KKyAgdm9pZCBUcmFuc2xhdGVTY2FubGluZSh1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBUcmFuc2xhdGVEb3duU2FtcGxlcyh1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgY29uc3QgdWludDhfdCogbV9SYW1wUjsKKyAgY29uc3QgdWludDhfdCogbV9SYW1wRzsKKyAgY29uc3QgdWludDhfdCogbV9SYW1wQjsKIH07CisKIHN0cnVjdCBfQ1BERl9VbmlxdWVLZXlHZW4gewotICAgIHZvaWQJCUdlbmVyYXRlKGludCBjb3VudCwgLi4uKTsKLSAgICBGWF9DSEFSCQltX0tleVsxMjhdOwotICAgIGludAkJCW1fS2V5TGVuOworICB2b2lkIEdlbmVyYXRlKGludCBjb3VudCwgLi4uKTsKKyAgRlhfQ0hBUiBtX0tleVsxMjhdOworICBpbnQgbV9LZXlMZW47CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfU1JDX0ZQREZBUElfRlBERl9SRU5ERVJfUkVOREVSX0lOVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfYWN0aW9uLmNwcCBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2FjdGlvbi5jcHAKaW5kZXggYWM0MDMzNS4uMjhkMTdjZCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfYWN0aW9uLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19hY3Rpb24uY3BwCkBAIC0xLDM2NSArMSwyOTEgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oIgotQ1BERl9EZXN0IENQREZfQWN0aW9uOjpHZXREZXN0KENQREZfRG9jdW1lbnQqIHBEb2MpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3BEaWN0KSB7Ci0gICAgICAgIHJldHVybiBDUERGX0Rlc3QoKTsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgdHlwZSA9IG1fcERpY3QtPkdldFN0cmluZygiUyIpOwotICAgIGlmICh0eXBlICE9ICJHb1RvIiAmJiB0eXBlICE9ICJHb1RvUiIpIHsKLSAgICAgICAgcmV0dXJuIENQREZfRGVzdCgpOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcERlc3QgPSBtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoIkQiKTsKLSAgICBpZiAoIXBEZXN0KSB7Ci0gICAgICAgIHJldHVybiBDUERGX0Rlc3QoKTsKLSAgICB9Ci0gICAgaWYgKHBEZXN0LT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUklORyB8fCBwRGVzdC0+R2V0VHlwZSgpID09IFBERk9CSl9OQU1FKSB7Ci0gICAgICAgIENQREZfTmFtZVRyZWUgbmFtZV90cmVlKHBEb2MsIEZYX0JTVFJDKCJEZXN0cyIpKTsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDIG5hbWUgPSBwRGVzdC0+R2V0U3RyaW5nKCk7Ci0gICAgICAgIHJldHVybiBDUERGX0Rlc3QobmFtZV90cmVlLkxvb2t1cE5hbWVkRGVzdChwRG9jLCBuYW1lKSk7Ci0gICAgfQotICAgIGlmIChwRGVzdC0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm4gQ1BERl9EZXN0KChDUERGX0FycmF5KilwRGVzdCk7Ci0gICAgfQorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgiCisKK0NQREZfRGVzdCBDUERGX0FjdGlvbjo6R2V0RGVzdChDUERGX0RvY3VtZW50KiBwRG9jKSBjb25zdCB7CisgIGlmICghbV9wRGljdCkgewogICAgIHJldHVybiBDUERGX0Rlc3QoKTsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyB0eXBlID0gbV9wRGljdC0+R2V0U3RyaW5nKCJTIik7CisgIGlmICh0eXBlICE9ICJHb1RvIiAmJiB0eXBlICE9ICJHb1RvUiIpIHsKKyAgICByZXR1cm4gQ1BERl9EZXN0KCk7CisgIH0KKyAgQ1BERl9PYmplY3QqIHBEZXN0ID0gbV9wRGljdC0+R2V0RWxlbWVudFZhbHVlKCJEIik7CisgIGlmICghcERlc3QpIHsKKyAgICByZXR1cm4gQ1BERl9EZXN0KCk7CisgIH0KKyAgaWYgKHBEZXN0LT5Jc1N0cmluZygpIHx8IHBEZXN0LT5Jc05hbWUoKSkgeworICAgIENQREZfTmFtZVRyZWUgbmFtZV90cmVlKHBEb2MsICJEZXN0cyIpOworICAgIENGWF9CeXRlU3RyaW5nQyBuYW1lID0gcERlc3QtPkdldFN0cmluZygpOworICAgIHJldHVybiBDUERGX0Rlc3QobmFtZV90cmVlLkxvb2t1cE5hbWVkRGVzdChwRG9jLCBuYW1lKSk7CisgIH0KKyAgaWYgKENQREZfQXJyYXkqIHBBcnJheSA9IHBEZXN0LT5Bc0FycmF5KCkpCisgICAgcmV0dXJuIENQREZfRGVzdChwQXJyYXkpOworICByZXR1cm4gQ1BERl9EZXN0KCk7CiB9Ci1jb25zdCBGWF9DSEFSKiBnX3NBVHlwZXNbXSA9IHsiVW5rbm93biIsICJHb1RvIiwgIkdvVG9SIiwgIkdvVG9FIiwgIkxhdW5jaCIsICJUaHJlYWQiLCAiVVJJIiwgIlNvdW5kIiwgIk1vdmllIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIaWRlIiwJIk5hbWVkIiwgIlN1Ym1pdEZvcm0iLCAiUmVzZXRGb3JtIiwgIkltcG9ydERhdGEiLCAiSmF2YVNjcmlwdCIsICJTZXRPQ0dTdGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVuZGl0aW9uIiwgIlRyYW5zIiwgIkdvVG8zRFZpZXciLCAiIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotQ1BERl9BY3Rpb246OkFjdGlvblR5cGUgQ1BERl9BY3Rpb246OkdldFR5cGUoKSBjb25zdAotewotICAgIEFjdGlvblR5cGUgZVR5cGUgPSBVbmtub3duOwotICAgIGlmIChtX3BEaWN0ICE9IE5VTEwpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NUeXBlID0gbV9wRGljdC0+R2V0U3RyaW5nKCJTIik7Ci0gICAgICAgIGlmICghY3NUeXBlLklzRW1wdHkoKSkgewotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgd2hpbGUgKGdfc0FUeXBlc1tpXVswXSAhPSAnXDAnKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNzVHlwZSA9PSBnX3NBVHlwZXNbaV0pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChBY3Rpb25UeXBlKWk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGkgKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVUeXBlOwotfQotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9BY3Rpb246OkdldEZpbGVQYXRoKCkgY29uc3QKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyB0eXBlID0gbV9wRGljdC0+R2V0U3RyaW5nKCJTIik7Ci0gICAgaWYgKHR5cGUgIT0gIkdvVG9SIiAmJiB0eXBlICE9ICJMYXVuY2giICYmCi0gICAgICAgICAgICB0eXBlICE9ICJTdWJtaXRGb3JtIiAmJiB0eXBlICE9ICJJbXBvcnREYXRhIikgewotICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBGaWxlID0gbV9wRGljdC0+R2V0RWxlbWVudFZhbHVlKCJGIik7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgcGF0aDsKLSAgICBpZiAocEZpbGUgPT0gTlVMTCkgewotICAgICAgICBpZiAodHlwZSA9PSAiTGF1bmNoIikgewotICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwV2luRGljdCA9IG1fcERpY3QtPkdldERpY3QoRlhfQlNUUkMoIldpbiIpKTsKLSAgICAgICAgICAgIGlmIChwV2luRGljdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBXaW5EaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkYiKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXRoOwotICAgIH0KLSAgICBDUERGX0ZpbGVTcGVjIGZpbGVzcGVjKHBGaWxlKTsKLSAgICBmaWxlc3BlYy5HZXRGaWxlTmFtZShwYXRoKTsKLSAgICByZXR1cm4gcGF0aDsKLX0KLUNGWF9CeXRlU3RyaW5nIENQREZfQWN0aW9uOjpHZXRVUkkoQ1BERl9Eb2N1bWVudCogcERvYykgY29uc3QKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc1VSSTsKLSAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBjc1VSSTsKLSAgICB9Ci0gICAgaWYgKG1fcERpY3QtPkdldFN0cmluZygiUyIpICE9ICJVUkkiKSB7Ci0gICAgICAgIHJldHVybiBjc1VSSTsKLSAgICB9Ci0gICAgY3NVUkkgPSBtX3BEaWN0LT5HZXRTdHJpbmcoIlVSSSIpOwotICAgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBwRG9jLT5HZXRSb290KCk7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwVVJJID0gcFJvb3QtPkdldERpY3QoIlVSSSIpOwotICAgIGlmIChwVVJJICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKGNzVVJJLkZpbmQoRlhfQlNUUkMoIjoiKSwgMCkgPCAxKSB7Ci0gICAgICAgICAgICBjc1VSSSA9IHBVUkktPkdldFN0cmluZygiQmFzZSIpICsgY3NVUkk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGNzVVJJOwotfQotRlhfRFdPUkQgQ1BERl9BY3Rpb25GaWVsZHM6OkdldEZpZWxkc0NvdW50KCkgY29uc3QKLXsKLSAgICBpZiAobV9wQWN0aW9uID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BBY3Rpb24tPkdldERpY3QoKTsKLSAgICBpZiAocERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NUeXBlID0gcERpY3QtPkdldFN0cmluZygiUyIpOwotICAgIENQREZfT2JqZWN0KiBwRmllbGRzID0gTlVMTDsKLSAgICBpZiAoY3NUeXBlID09ICJIaWRlIikgewotICAgICAgICBwRmllbGRzID0gcERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiVCIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBGaWVsZHMgPSBwRGljdC0+R2V0QXJyYXkoIkZpZWxkcyIpOwotICAgIH0KLSAgICBpZiAocEZpZWxkcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpbnQgaVR5cGUgPSBwRmllbGRzLT5HZXRUeXBlKCk7Ci0gICAgaWYgKGlUeXBlID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSBpZiAoaVR5cGUgPT0gUERGT0JKX1NUUklORykgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgaWYgKGlUeXBlID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm4gKChDUERGX0FycmF5KilwRmllbGRzKS0+R2V0Q291bnQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci12b2lkIENQREZfQWN0aW9uRmllbGRzOjpHZXRBbGxGaWVsZHMoQ0ZYX1B0ckFycmF5JiBmaWVsZE9iamVjdHMpIGNvbnN0Ci17Ci0gICAgZmllbGRPYmplY3RzLlJlbW92ZUFsbCgpOwotICAgIGlmIChtX3BBY3Rpb24gPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BBY3Rpb24tPkdldERpY3QoKTsKLSAgICBpZiAocERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGNzVHlwZSA9IHBEaWN0LT5HZXRTdHJpbmcoIlMiKTsKLSAgICBDUERGX09iamVjdCogcEZpZWxkcyA9IE5VTEw7Ci0gICAgaWYgKGNzVHlwZSA9PSAiSGlkZSIpIHsKLSAgICAgICAgcEZpZWxkcyA9IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoIlQiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwRmllbGRzID0gcERpY3QtPkdldEFycmF5KCJGaWVsZHMiKTsKLSAgICB9Ci0gICAgaWYgKHBGaWVsZHMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludCBpVHlwZSA9IHBGaWVsZHMtPkdldFR5cGUoKTsKLSAgICBpZiAoaVR5cGUgPT0gUERGT0JKX0RJQ1RJT05BUlkgfHwgaVR5cGUgPT0gUERGT0JKX1NUUklORykgewotICAgICAgICBmaWVsZE9iamVjdHMuQWRkKHBGaWVsZHMpOwotICAgIH0gZWxzZSBpZiAoaVR5cGUgPT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwRmllbGRzOwotICAgICAgICBGWF9EV09SRCBpQ291bnQgPSBwQXJyYXktPkdldENvdW50KCk7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoaSk7Ci0gICAgICAgICAgICBpZiAocE9iaiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZmllbGRPYmplY3RzLkFkZChwT2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLUNQREZfT2JqZWN0KiBDUERGX0FjdGlvbkZpZWxkczo6R2V0RmllbGQoRlhfRFdPUkQgaUluZGV4KSBjb25zdAotewotICAgIGlmIChtX3BBY3Rpb24gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcEFjdGlvbi0+R2V0RGljdCgpOwotICAgIGlmIChwRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBjc1R5cGUgPSBwRGljdC0+R2V0U3RyaW5nKCJTIik7Ci0gICAgQ1BERl9PYmplY3QqIHBGaWVsZHMgPSBOVUxMOwotICAgIGlmIChjc1R5cGUgPT0gIkhpZGUiKSB7Ci0gICAgICAgIHBGaWVsZHMgPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKCJUIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcEZpZWxkcyA9IHBEaWN0LT5HZXRBcnJheSgiRmllbGRzIik7Ci0gICAgfQotICAgIGlmIChwRmllbGRzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwRmluZE9iaiA9IE5VTEw7Ci0gICAgaW50IGlUeXBlID0gcEZpZWxkcy0+R2V0VHlwZSgpOwotICAgIGlmIChpVHlwZSA9PSBQREZPQkpfRElDVElPTkFSWSB8fCBpVHlwZSA9PSBQREZPQkpfU1RSSU5HKSB7Ci0gICAgICAgIGlmIChpSW5kZXggPT0gMCkgewotICAgICAgICAgICAgcEZpbmRPYmogPSBwRmllbGRzOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChpVHlwZSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgcEZpbmRPYmogPSAoKENQREZfQXJyYXkqKXBGaWVsZHMpLT5HZXRFbGVtZW50VmFsdWUoaUluZGV4KTsKLSAgICB9Ci0gICAgcmV0dXJuIHBGaW5kT2JqOwotfQotQ1BERl9MV2luUGFyYW0gQ1BERl9BY3Rpb246OkdldFdpblBhcmFtKCkgY29uc3QKLXsKLSAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAobV9wRGljdC0+R2V0U3RyaW5nKCJTIikgIT0gIkxhdW5jaCIpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBtX3BEaWN0LT5HZXREaWN0KCJXaW4iKTsKLX0KLUNGWF9XaWRlU3RyaW5nIENQREZfQWN0aW9uOjpHZXRKYXZhU2NyaXB0KCkgY29uc3QKLXsKLSAgICBDRlhfV2lkZVN0cmluZyBjc0pTOwotICAgIGlmIChtX3BEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGNzSlM7Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwSlMgPSBtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoIkpTIik7Ci0gICAgaWYgKHBKUyAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBwSlMtPkdldFVuaWNvZGVUZXh0KCk7Ci0gICAgfQotICAgIHJldHVybiBjc0pTOwotfQotQ1BERl9EaWN0aW9uYXJ5KiBDUERGX0FjdGlvbjo6R2V0QW5ub3QoKSBjb25zdAotewotICAgIGlmIChtX3BEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQorY29uc3QgRlhfQ0hBUiogZ19zQVR5cGVzW10gPSB7CisgICAgIlVua25vd24iLCAgICAgIkdvVG8iLCAgICAgICAiR29Ub1IiLCAgICAgIkdvVG9FIiwgICAgICAiTGF1bmNoIiwKKyAgICAiVGhyZWFkIiwgICAgICAiVVJJIiwgICAgICAgICJTb3VuZCIsICAgICAiTW92aWUiLCAgICAgICJIaWRlIiwKKyAgICAiTmFtZWQiLCAgICAgICAiU3VibWl0Rm9ybSIsICJSZXNldEZvcm0iLCAiSW1wb3J0RGF0YSIsICJKYXZhU2NyaXB0IiwKKyAgICAiU2V0T0NHU3RhdGUiLCAiUmVuZGl0aW9uIiwgICJUcmFucyIsICAgICAiR29UbzNEVmlldyIsICIifTsKK0NQREZfQWN0aW9uOjpBY3Rpb25UeXBlIENQREZfQWN0aW9uOjpHZXRUeXBlKCkgY29uc3QgeworICBBY3Rpb25UeXBlIGVUeXBlID0gVW5rbm93bjsKKyAgaWYgKG1fcERpY3QpIHsKICAgICBDRlhfQnl0ZVN0cmluZyBjc1R5cGUgPSBtX3BEaWN0LT5HZXRTdHJpbmcoIlMiKTsKLSAgICBpZiAoY3NUeXBlID09IEZYX0JTVFJDKCJSZW5kaXRpb24iKSkgewotICAgICAgICByZXR1cm4gbV9wRGljdC0+R2V0RGljdCgiQU4iKTsKLSAgICB9IGVsc2UgaWYgKGNzVHlwZSA9PSBGWF9CU1RSQygiTW92aWUiKSkgewotICAgICAgICByZXR1cm4gbV9wRGljdC0+R2V0RGljdCgiQW5ub3RhdGlvbiIpOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLUZYX0lOVDMyIENQREZfQWN0aW9uOjpHZXRPcGVyYXRpb25UeXBlKCkgY29uc3QKLXsKLSAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBjc1R5cGUgPSBtX3BEaWN0LT5HZXRTdHJpbmcoIlMiKTsKLSAgICBpZiAoY3NUeXBlID09IEZYX0JTVFJDKCJSZW5kaXRpb24iKSkgewotICAgICAgICByZXR1cm4gbV9wRGljdC0+R2V0SW50ZWdlcigiT1AiKTsKLSAgICB9IGVsc2UgaWYgKGNzVHlwZSA9PSBGWF9CU1RSQygiTW92aWUiKSkgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBjc09QID0gbV9wRGljdC0+R2V0U3RyaW5nKCJPcGVyYXRpb24iKTsKLSAgICAgICAgaWYgKGNzT1AgPT0gRlhfQlNUUkMoIlBsYXkiKSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0gZWxzZSBpZiAoY3NPUCA9PSBGWF9CU1RSQygiU3RvcCIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfSBlbHNlIGlmIChjc09QID09IEZYX0JTVFJDKCJQYXVzZSIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgfSBlbHNlIGlmIChjc09QID09IEZYX0JTVFJDKCJSZXN1bWUiKSkgewotICAgICAgICAgICAgcmV0dXJuIDM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci1GWF9EV09SRCBDUERGX0FjdGlvbjo6R2V0U3ViQWN0aW9uc0NvdW50KCkgY29uc3QKLXsKLSAgICBpZiAobV9wRGljdCA9PSBOVUxMIHx8ICFtX3BEaWN0LT5LZXlFeGlzdCgiTmV4dCIpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcE5leHQgPSBtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoIk5leHQiKTsKLSAgICBpZiAoIXBOZXh0KSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpbnQgaU9ialR5cGUgPSBwTmV4dC0+R2V0VHlwZSgpOwotICAgIGlmIChpT2JqVHlwZSA9PSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaWYgKGlPYmpUeXBlID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm4gKChDUERGX0FycmF5KilwTmV4dCktPkdldENvdW50KCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotQ1BERl9BY3Rpb24gQ1BERl9BY3Rpb246OkdldFN1YkFjdGlvbihGWF9EV09SRCBpSW5kZXgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcERpY3QgPT0gTlVMTCB8fCAhbV9wRGljdC0+S2V5RXhpc3QoIk5leHQiKSkgewotICAgICAgICByZXR1cm4gQ1BERl9BY3Rpb24oKTsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBOZXh0ID0gbV9wRGljdC0+R2V0RWxlbWVudFZhbHVlKCJOZXh0Iik7Ci0gICAgaW50IGlPYmpUeXBlID0gcE5leHQtPkdldFR5cGUoKTsKLSAgICBpZiAoaU9ialR5cGUgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5ICpwRGljdCA9IHN0YXRpY19jYXN0PENQREZfRGljdGlvbmFyeSo+KHBOZXh0KTsKLSAgICAgICAgaWYgKGlJbmRleCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ1BERl9BY3Rpb24ocERpY3QpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChpT2JqVHlwZSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gc3RhdGljX2Nhc3Q8Q1BERl9BcnJheSo+KHBOZXh0KTsKLSAgICAgICAgcmV0dXJuIENQREZfQWN0aW9uKHBBcnJheS0+R2V0RGljdChpSW5kZXgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIENQREZfQWN0aW9uKCk7Ci19Ci1jb25zdCBGWF9DSEFSKiBnX3NBQVR5cGVzW10gPSB7IkUiLCAiWCIsICJEIiwgIlUiLCAiRm8iLCAiQmwiLCAiUE8iLCAiUEMiLCAiUFYiLCAiUEkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPIiwgIkMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLIiwgIkYiLCAiViIsICJDIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0MiLCAiV1MiLCAiRFMiLCAiV1AiLCAiRFAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotRlhfQk9PTCBDUERGX0FBY3Rpb246OkFjdGlvbkV4aXN0KEFBY3Rpb25UeXBlIGVUeXBlKSBjb25zdAotewotICAgIGlmIChtX3BEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gbV9wRGljdC0+S2V5RXhpc3QoZ19zQUFUeXBlc1soaW50KWVUeXBlXSk7Ci19Ci1DUERGX0FjdGlvbiBDUERGX0FBY3Rpb246OkdldEFjdGlvbihBQWN0aW9uVHlwZSBlVHlwZSkgY29uc3QKLXsKLSAgICBpZiAoIW1fcERpY3QpIHsKLSAgICAgICAgcmV0dXJuIENQREZfQWN0aW9uKCk7Ci0gICAgfQotICAgIHJldHVybiBDUERGX0FjdGlvbihtX3BEaWN0LT5HZXREaWN0KGdfc0FBVHlwZXNbKGludCllVHlwZV0pKTsKLX0KLUZYX1BPU0lUSU9OIENQREZfQUFjdGlvbjo6R2V0U3RhcnRQb3MoKSBjb25zdAotewotICAgIGlmIChtX3BEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBtX3BEaWN0LT5HZXRTdGFydFBvcygpOwotfQotQ1BERl9BY3Rpb24gQ1BERl9BQWN0aW9uOjpHZXROZXh0QWN0aW9uKEZYX1BPU0lUSU9OJiBwb3MsIEFBY3Rpb25UeXBlJiBlVHlwZSkgY29uc3QKLXsKLSAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBDUERGX0FjdGlvbigpOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBjc0tleTsKLSAgICBDUERGX09iamVjdCogcE9iaiA9IG1fcERpY3QtPkdldE5leHRFbGVtZW50KHBvcywgY3NLZXkpOwotICAgIGlmICghcE9iaikgewotICAgICAgICByZXR1cm4gQ1BERl9BY3Rpb24oKTsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBEaXJlY3QgPSBwT2JqLT5HZXREaXJlY3QoKTsKLSAgICBpZiAoIXBEaXJlY3QgfHwgcERpcmVjdC0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgIHJldHVybiBDUERGX0FjdGlvbigpOwotICAgIH0KLSAgICBpbnQgaSA9IDA7Ci0gICAgd2hpbGUgKGdfc0FBVHlwZXNbaV1bMF0gIT0gJ1wwJykgewotICAgICAgICBpZiAoY3NLZXkgPT0gZ19zQUFUeXBlc1tpXSkgewotICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKCFjc1R5cGUuSXNFbXB0eSgpKSB7CisgICAgICBpbnQgaSA9IDA7CisgICAgICB3aGlsZSAoZ19zQVR5cGVzW2ldWzBdICE9ICdcMCcpIHsKKyAgICAgICAgaWYgKGNzVHlwZSA9PSBnX3NBVHlwZXNbaV0pIHsKKyAgICAgICAgICByZXR1cm4gKEFjdGlvblR5cGUpaTsKICAgICAgICAgfQogICAgICAgICBpKys7CisgICAgICB9CiAgICAgfQotICAgIGVUeXBlID0gKEFBY3Rpb25UeXBlKWk7Ci0gICAgcmV0dXJuIENQREZfQWN0aW9uKHN0YXRpY19jYXN0PENQREZfRGljdGlvbmFyeSo+KHBEaXJlY3QpKTsKKyAgfQorICByZXR1cm4gZVR5cGU7CiB9Ci1DUERGX0RvY0pTQWN0aW9uczo6Q1BERl9Eb2NKU0FjdGlvbnMoQ1BERl9Eb2N1bWVudCogcERvYykKLXsKLSAgICBtX3BEb2N1bWVudCA9IHBEb2M7Ci19Ci1pbnQgQ1BERl9Eb2NKU0FjdGlvbnM6OkNvdW50SlNBY3Rpb25zKCkgY29uc3QKLXsKLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0gICAgQ1BERl9OYW1lVHJlZSBuYW1lX3RyZWUobV9wRG9jdW1lbnQsIEZYX0JTVFJDKCJKYXZhU2NyaXB0IikpOwotICAgIHJldHVybiBuYW1lX3RyZWUuR2V0Q291bnQoKTsKLX0KLUNQREZfQWN0aW9uIENQREZfRG9jSlNBY3Rpb25zOjpHZXRKU0FjdGlvbihpbnQgaW5kZXgsIENGWF9CeXRlU3RyaW5nJiBjc05hbWUpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotICAgIENQREZfTmFtZVRyZWUgbmFtZV90cmVlKG1fcERvY3VtZW50LCBGWF9CU1RSQygiSmF2YVNjcmlwdCIpKTsKLSAgICBDUERGX09iamVjdCAqcEFjdGlvbiA9IG5hbWVfdHJlZS5Mb29rdXBWYWx1ZShpbmRleCwgY3NOYW1lKTsKLSAgICBpZiAocEFjdGlvbiA9PSBOVUxMIHx8IHBBY3Rpb24tPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICByZXR1cm4gQ1BERl9BY3Rpb24oKTsKK0NGWF9XaWRlU3RyaW5nIENQREZfQWN0aW9uOjpHZXRGaWxlUGF0aCgpIGNvbnN0IHsKKyAgQ0ZYX0J5dGVTdHJpbmcgdHlwZSA9IG1fcERpY3QtPkdldFN0cmluZygiUyIpOworICBpZiAodHlwZSAhPSAiR29Ub1IiICYmIHR5cGUgIT0gIkxhdW5jaCIgJiYgdHlwZSAhPSAiU3VibWl0Rm9ybSIgJiYKKyAgICAgIHR5cGUgIT0gIkltcG9ydERhdGEiKSB7CisgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7CisgIH0KKyAgQ1BERl9PYmplY3QqIHBGaWxlID0gbV9wRGljdC0+R2V0RWxlbWVudFZhbHVlKCJGIik7CisgIENGWF9XaWRlU3RyaW5nIHBhdGg7CisgIGlmICghcEZpbGUpIHsKKyAgICBpZiAodHlwZSA9PSAiTGF1bmNoIikgeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwV2luRGljdCA9IG1fcERpY3QtPkdldERpY3QoIldpbiIpOworICAgICAgaWYgKHBXaW5EaWN0KSB7CisgICAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBXaW5EaWN0LT5HZXRTdHJpbmcoIkYiKSk7CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiBDUERGX0FjdGlvbihwQWN0aW9uLT5HZXREaWN0KCkpOworICAgIHJldHVybiBwYXRoOworICB9CisgIENQREZfRmlsZVNwZWMgZmlsZXNwZWMocEZpbGUpOworICBmaWxlc3BlYy5HZXRGaWxlTmFtZShwYXRoKTsKKyAgcmV0dXJuIHBhdGg7CiB9Ci1DUERGX0FjdGlvbiBDUERGX0RvY0pTQWN0aW9uczo6R2V0SlNBY3Rpb24oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZSkgY29uc3QKLXsKLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0gICAgQ1BERl9OYW1lVHJlZSBuYW1lX3RyZWUobV9wRG9jdW1lbnQsIEZYX0JTVFJDKCJKYXZhU2NyaXB0IikpOwotICAgIENQREZfT2JqZWN0ICpwQWN0aW9uID0gbmFtZV90cmVlLkxvb2t1cFZhbHVlKGNzTmFtZSk7Ci0gICAgaWYgKHBBY3Rpb24gPT0gTlVMTCB8fCBwQWN0aW9uLT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgcmV0dXJuIENQREZfQWN0aW9uKCk7CitDRlhfQnl0ZVN0cmluZyBDUERGX0FjdGlvbjo6R2V0VVJJKENQREZfRG9jdW1lbnQqIHBEb2MpIGNvbnN0IHsKKyAgQ0ZYX0J5dGVTdHJpbmcgY3NVUkk7CisgIGlmICghbV9wRGljdCkgeworICAgIHJldHVybiBjc1VSSTsKKyAgfQorICBpZiAobV9wRGljdC0+R2V0U3RyaW5nKCJTIikgIT0gIlVSSSIpIHsKKyAgICByZXR1cm4gY3NVUkk7CisgIH0KKyAgY3NVUkkgPSBtX3BEaWN0LT5HZXRTdHJpbmcoIlVSSSIpOworICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gcERvYy0+R2V0Um9vdCgpOworICBDUERGX0RpY3Rpb25hcnkqIHBVUkkgPSBwUm9vdC0+R2V0RGljdCgiVVJJIik7CisgIGlmIChwVVJJKSB7CisgICAgaWYgKGNzVVJJLkZpbmQoIjoiLCAwKSA8IDEpIHsKKyAgICAgIGNzVVJJID0gcFVSSS0+R2V0U3RyaW5nKCJCYXNlIikgKyBjc1VSSTsKICAgICB9Ci0gICAgcmV0dXJuIENQREZfQWN0aW9uKHBBY3Rpb24tPkdldERpY3QoKSk7CisgIH0KKyAgcmV0dXJuIGNzVVJJOwogfQotaW50IENQREZfRG9jSlNBY3Rpb25zOjpGaW5kSlNBY3Rpb24oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZSkgY29uc3QKLXsKLSAgICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0gICAgQ1BERl9OYW1lVHJlZSBuYW1lX3RyZWUobV9wRG9jdW1lbnQsIEZYX0JTVFJDKCJKYXZhU2NyaXB0IikpOwotICAgIHJldHVybiBuYW1lX3RyZWUuR2V0SW5kZXgoY3NOYW1lKTsKK0ZYX0RXT1JEIENQREZfQWN0aW9uRmllbGRzOjpHZXRGaWVsZHNDb3VudCgpIGNvbnN0IHsKKyAgaWYgKCFtX3BBY3Rpb24pIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wQWN0aW9uLT5HZXREaWN0KCk7CisgIGlmICghcERpY3QpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBjc1R5cGUgPSBwRGljdC0+R2V0U3RyaW5nKCJTIik7CisgIENQREZfT2JqZWN0KiBwRmllbGRzID0gTlVMTDsKKyAgaWYgKGNzVHlwZSA9PSAiSGlkZSIpIHsKKyAgICBwRmllbGRzID0gcERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiVCIpOworICB9IGVsc2UgeworICAgIHBGaWVsZHMgPSBwRGljdC0+R2V0QXJyYXkoIkZpZWxkcyIpOworICB9CisgIGlmICghcEZpZWxkcykKKyAgICByZXR1cm4gMDsKKyAgaWYgKHBGaWVsZHMtPklzRGljdGlvbmFyeSgpKQorICAgIHJldHVybiAxOworICBpZiAocEZpZWxkcy0+SXNTdHJpbmcoKSkKKyAgICByZXR1cm4gMTsKKyAgaWYgKENQREZfQXJyYXkqIHBBcnJheSA9IHBGaWVsZHMtPkFzQXJyYXkoKSkKKyAgICByZXR1cm4gcEFycmF5LT5HZXRDb3VudCgpOworICByZXR1cm4gMDsKK30KKworc3RkOjp2ZWN0b3I8Q1BERl9PYmplY3QqPiBDUERGX0FjdGlvbkZpZWxkczo6R2V0QWxsRmllbGRzKCkgY29uc3QgeworICBzdGQ6OnZlY3RvcjxDUERGX09iamVjdCo+IGZpZWxkczsKKyAgaWYgKCFtX3BBY3Rpb24pCisgICAgcmV0dXJuIGZpZWxkczsKKworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wQWN0aW9uLT5HZXREaWN0KCk7CisgIGlmICghcERpY3QpCisgICAgcmV0dXJuIGZpZWxkczsKKworICBDRlhfQnl0ZVN0cmluZyBjc1R5cGUgPSBwRGljdC0+R2V0U3RyaW5nKCJTIik7CisgIENQREZfT2JqZWN0KiBwRmllbGRzOworICBpZiAoY3NUeXBlID09ICJIaWRlIikKKyAgICBwRmllbGRzID0gcERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiVCIpOworICBlbHNlCisgICAgcEZpZWxkcyA9IHBEaWN0LT5HZXRBcnJheSgiRmllbGRzIik7CisgIGlmICghcEZpZWxkcykKKyAgICByZXR1cm4gZmllbGRzOworCisgIGlmIChwRmllbGRzLT5Jc0RpY3Rpb25hcnkoKSB8fCBwRmllbGRzLT5Jc1N0cmluZygpKSB7CisgICAgZmllbGRzLnB1c2hfYmFjayhwRmllbGRzKTsKKyAgfSBlbHNlIGlmIChDUERGX0FycmF5KiBwQXJyYXkgPSBwRmllbGRzLT5Bc0FycmF5KCkpIHsKKyAgICBGWF9EV09SRCBpQ291bnQgPSBwQXJyYXktPkdldENvdW50KCk7CisgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGlDb3VudDsgKytpKSB7CisgICAgICBDUERGX09iamVjdCogcE9iaiA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKGkpOworICAgICAgaWYgKHBPYmopIHsKKyAgICAgICAgZmllbGRzLnB1c2hfYmFjayhwT2JqKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGZpZWxkczsKK30KKworQ1BERl9PYmplY3QqIENQREZfQWN0aW9uRmllbGRzOjpHZXRGaWVsZChGWF9EV09SRCBpSW5kZXgpIGNvbnN0IHsKKyAgaWYgKCFtX3BBY3Rpb24pIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wQWN0aW9uLT5HZXREaWN0KCk7CisgIGlmICghcERpY3QpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBjc1R5cGUgPSBwRGljdC0+R2V0U3RyaW5nKCJTIik7CisgIENQREZfT2JqZWN0KiBwRmllbGRzID0gTlVMTDsKKyAgaWYgKGNzVHlwZSA9PSAiSGlkZSIpIHsKKyAgICBwRmllbGRzID0gcERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiVCIpOworICB9IGVsc2UgeworICAgIHBGaWVsZHMgPSBwRGljdC0+R2V0QXJyYXkoIkZpZWxkcyIpOworICB9CisgIGlmICghcEZpZWxkcykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfT2JqZWN0KiBwRmluZE9iaiA9IE5VTEw7CisgIGlmIChwRmllbGRzLT5Jc0RpY3Rpb25hcnkoKSB8fCBwRmllbGRzLT5Jc1N0cmluZygpKSB7CisgICAgaWYgKGlJbmRleCA9PSAwKQorICAgICAgcEZpbmRPYmogPSBwRmllbGRzOworICB9IGVsc2UgaWYgKENQREZfQXJyYXkqIHBBcnJheSA9IHBGaWVsZHMtPkFzQXJyYXkoKSkgeworICAgIHBGaW5kT2JqID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoaUluZGV4KTsKKyAgfQorICByZXR1cm4gcEZpbmRPYmo7Cit9CisKK0NGWF9XaWRlU3RyaW5nIENQREZfQWN0aW9uOjpHZXRKYXZhU2NyaXB0KCkgY29uc3QgeworICBDRlhfV2lkZVN0cmluZyBjc0pTOworICBpZiAoIW1fcERpY3QpIHsKKyAgICByZXR1cm4gY3NKUzsKKyAgfQorICBDUERGX09iamVjdCogcEpTID0gbV9wRGljdC0+R2V0RWxlbWVudFZhbHVlKCJKUyIpOworICByZXR1cm4gcEpTID8gcEpTLT5HZXRVbmljb2RlVGV4dCgpIDogY3NKUzsKK30KK0NQREZfRGljdGlvbmFyeSogQ1BERl9BY3Rpb246OkdldEFubm90KCkgY29uc3QgeworICBpZiAoIW1fcERpY3QpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBjc1R5cGUgPSBtX3BEaWN0LT5HZXRTdHJpbmcoIlMiKTsKKyAgaWYgKGNzVHlwZSA9PSAiUmVuZGl0aW9uIikgeworICAgIHJldHVybiBtX3BEaWN0LT5HZXREaWN0KCJBTiIpOworICB9CisgIGlmIChjc1R5cGUgPT0gIk1vdmllIikgeworICAgIHJldHVybiBtX3BEaWN0LT5HZXREaWN0KCJBbm5vdGF0aW9uIik7CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CitpbnQzMl90IENQREZfQWN0aW9uOjpHZXRPcGVyYXRpb25UeXBlKCkgY29uc3QgeworICBpZiAoIW1fcERpY3QpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBjc1R5cGUgPSBtX3BEaWN0LT5HZXRTdHJpbmcoIlMiKTsKKyAgaWYgKGNzVHlwZSA9PSAiUmVuZGl0aW9uIikgeworICAgIHJldHVybiBtX3BEaWN0LT5HZXRJbnRlZ2VyKCJPUCIpOworICB9CisgIGlmIChjc1R5cGUgPT0gIk1vdmllIikgeworICAgIENGWF9CeXRlU3RyaW5nIGNzT1AgPSBtX3BEaWN0LT5HZXRTdHJpbmcoIk9wZXJhdGlvbiIpOworICAgIGlmIChjc09QID09ICJQbGF5IikgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChjc09QID09ICJTdG9wIikgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChjc09QID09ICJQYXVzZSIpIHsKKyAgICAgIHJldHVybiAyOworICAgIH0KKyAgICBpZiAoY3NPUCA9PSAiUmVzdW1lIikgeworICAgICAgcmV0dXJuIDM7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorRlhfRFdPUkQgQ1BERl9BY3Rpb246OkdldFN1YkFjdGlvbnNDb3VudCgpIGNvbnN0IHsKKyAgaWYgKCFtX3BEaWN0IHx8ICFtX3BEaWN0LT5LZXlFeGlzdCgiTmV4dCIpKQorICAgIHJldHVybiAwOworCisgIENQREZfT2JqZWN0KiBwTmV4dCA9IG1fcERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiTmV4dCIpOworICBpZiAoIXBOZXh0KQorICAgIHJldHVybiAwOworICBpZiAocE5leHQtPklzRGljdGlvbmFyeSgpKQorICAgIHJldHVybiAxOworICBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcE5leHQtPkFzQXJyYXkoKSkKKyAgICByZXR1cm4gcEFycmF5LT5HZXRDb3VudCgpOworICByZXR1cm4gMDsKK30KK0NQREZfQWN0aW9uIENQREZfQWN0aW9uOjpHZXRTdWJBY3Rpb24oRlhfRFdPUkQgaUluZGV4KSBjb25zdCB7CisgIGlmICghbV9wRGljdCB8fCAhbV9wRGljdC0+S2V5RXhpc3QoIk5leHQiKSkgeworICAgIHJldHVybiBDUERGX0FjdGlvbigpOworICB9CisgIENQREZfT2JqZWN0KiBwTmV4dCA9IG1fcERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiTmV4dCIpOworICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IFRvRGljdGlvbmFyeShwTmV4dCkpIHsKKyAgICBpZiAoaUluZGV4ID09IDApCisgICAgICByZXR1cm4gQ1BERl9BY3Rpb24ocERpY3QpOworICB9IGVsc2UgaWYgKENQREZfQXJyYXkqIHBBcnJheSA9IFRvQXJyYXkocE5leHQpKSB7CisgICAgcmV0dXJuIENQREZfQWN0aW9uKHBBcnJheS0+R2V0RGljdChpSW5kZXgpKTsKKyAgfQorICByZXR1cm4gQ1BERl9BY3Rpb24oKTsKK30KK2NvbnN0IEZYX0NIQVIqIGdfc0FBVHlwZXNbXSA9IHsiRSIsICAiWCIsICAiRCIsICAiVSIsICAiRm8iLCAiQmwiLCAiUE8iLCAiUEMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQViIsICJQSSIsICJPIiwgICJDIiwgICJLIiwgICJGIiwgICJWIiwgICJDIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0MiLCAiV1MiLCAiRFMiLCAiV1AiLCAiRFAiLCAiIn07CitGWF9CT09MIENQREZfQUFjdGlvbjo6QWN0aW9uRXhpc3QoQUFjdGlvblR5cGUgZVR5cGUpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcERpY3QgJiYgbV9wRGljdC0+S2V5RXhpc3QoZ19zQUFUeXBlc1soaW50KWVUeXBlXSk7Cit9CitDUERGX0FjdGlvbiBDUERGX0FBY3Rpb246OkdldEFjdGlvbihBQWN0aW9uVHlwZSBlVHlwZSkgY29uc3QgeworICBpZiAoIW1fcERpY3QpIHsKKyAgICByZXR1cm4gQ1BERl9BY3Rpb24oKTsKKyAgfQorICByZXR1cm4gQ1BERl9BY3Rpb24obV9wRGljdC0+R2V0RGljdChnX3NBQVR5cGVzWyhpbnQpZVR5cGVdKSk7Cit9CisKK0NQREZfRG9jSlNBY3Rpb25zOjpDUERGX0RvY0pTQWN0aW9ucyhDUERGX0RvY3VtZW50KiBwRG9jKSA6IG1fcERvY3VtZW50KHBEb2MpIHt9CisKK2ludCBDUERGX0RvY0pTQWN0aW9uczo6Q291bnRKU0FjdGlvbnMoKSBjb25zdCB7CisgIEFTU0VSVChtX3BEb2N1bWVudCk7CisgIENQREZfTmFtZVRyZWUgbmFtZV90cmVlKG1fcERvY3VtZW50LCAiSmF2YVNjcmlwdCIpOworICByZXR1cm4gbmFtZV90cmVlLkdldENvdW50KCk7Cit9CitDUERGX0FjdGlvbiBDUERGX0RvY0pTQWN0aW9uczo6R2V0SlNBY3Rpb24oaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBjc05hbWUpIGNvbnN0IHsKKyAgQVNTRVJUKG1fcERvY3VtZW50KTsKKyAgQ1BERl9OYW1lVHJlZSBuYW1lX3RyZWUobV9wRG9jdW1lbnQsICJKYXZhU2NyaXB0Iik7CisgIENQREZfT2JqZWN0KiBwQWN0aW9uID0gbmFtZV90cmVlLkxvb2t1cFZhbHVlKGluZGV4LCBjc05hbWUpOworICBpZiAoIVRvRGljdGlvbmFyeShwQWN0aW9uKSkgeworICAgIHJldHVybiBDUERGX0FjdGlvbigpOworICB9CisgIHJldHVybiBDUERGX0FjdGlvbihwQWN0aW9uLT5HZXREaWN0KCkpOworfQorQ1BERl9BY3Rpb24gQ1BERl9Eb2NKU0FjdGlvbnM6OkdldEpTQWN0aW9uKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc05hbWUpIGNvbnN0IHsKKyAgQVNTRVJUKG1fcERvY3VtZW50KTsKKyAgQ1BERl9OYW1lVHJlZSBuYW1lX3RyZWUobV9wRG9jdW1lbnQsICJKYXZhU2NyaXB0Iik7CisgIENQREZfT2JqZWN0KiBwQWN0aW9uID0gbmFtZV90cmVlLkxvb2t1cFZhbHVlKGNzTmFtZSk7CisgIGlmICghVG9EaWN0aW9uYXJ5KHBBY3Rpb24pKSB7CisgICAgcmV0dXJuIENQREZfQWN0aW9uKCk7CisgIH0KKyAgcmV0dXJuIENQREZfQWN0aW9uKHBBY3Rpb24tPkdldERpY3QoKSk7Cit9CitpbnQgQ1BERl9Eb2NKU0FjdGlvbnM6OkZpbmRKU0FjdGlvbihjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lKSBjb25zdCB7CisgIEFTU0VSVChtX3BEb2N1bWVudCk7CisgIENQREZfTmFtZVRyZWUgbmFtZV90cmVlKG1fcERvY3VtZW50LCAiSmF2YVNjcmlwdCIpOworICByZXR1cm4gbmFtZV90cmVlLkdldEluZGV4KGNzTmFtZSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19hbm5vdC5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19hbm5vdC5jcHAKaW5kZXggMGRkY2IyMy4uODE0NDk2ZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfYW5ub3QuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Fubm90LmNwcApAQCAtMSw0OTcgKzEsMzQ1IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi90aGlyZF9wYXJ0eS9iYXNlL25vbnN0ZF91bmlxdWVfcHRyLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZW9iai5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZW9iai5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgiCiAKIENQREZfQW5ub3RMaXN0OjpDUERGX0Fubm90TGlzdChDUERGX1BhZ2UqIHBQYWdlKQotewotICAgIEFTU0VSVChwUGFnZSAhPSBOVUxMKTsKLSAgICBtX3BQYWdlRGljdCA9IHBQYWdlLT5tX3BGb3JtRGljdDsKLSAgICBpZiAobV9wUGFnZURpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47CisgICAgOiBtX3BEb2N1bWVudChwUGFnZS0+bV9wRG9jdW1lbnQpIHsKKyAgaWYgKCFwUGFnZS0+bV9wRm9ybURpY3QpCisgICAgcmV0dXJuOworCisgIENQREZfQXJyYXkqIHBBbm5vdHMgPSBwUGFnZS0+bV9wRm9ybURpY3QtPkdldEFycmF5KCJBbm5vdHMiKTsKKyAgaWYgKCFwQW5ub3RzKQorICAgIHJldHVybjsKKworICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQWNyb0Zvcm0gPSBwUm9vdC0+R2V0RGljdCgiQWNyb0Zvcm0iKTsKKyAgRlhfQk9PTCBiUmVnZW5lcmF0ZUFQID0gcEFjcm9Gb3JtICYmIHBBY3JvRm9ybS0+R2V0Qm9vbGVhbigiTmVlZEFwcGVhcmFuY2VzIik7CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwQW5ub3RzLT5HZXRDb3VudCgpOyArK2kpIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gVG9EaWN0aW9uYXJ5KHBBbm5vdHMtPkdldEVsZW1lbnRWYWx1ZShpKSk7CisgICAgaWYgKCFwRGljdCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgRlhfRFdPUkQgZHdPYmpOdW0gPSBwRGljdC0+R2V0T2JqTnVtKCk7CisgICAgaWYgKGR3T2JqTnVtID09IDApIHsKKyAgICAgIGR3T2JqTnVtID0gbV9wRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBEaWN0KTsKKyAgICAgIENQREZfUmVmZXJlbmNlKiBwQWN0aW9uID0gbmV3IENQREZfUmVmZXJlbmNlKG1fcERvY3VtZW50LCBkd09iak51bSk7CisgICAgICBwQW5ub3RzLT5JbnNlcnRBdChpLCBwQWN0aW9uKTsKKyAgICAgIHBBbm5vdHMtPlJlbW92ZUF0KGkgKyAxKTsKKyAgICAgIHBEaWN0ID0gcEFubm90cy0+R2V0RGljdChpKTsKICAgICB9Ci0gICAgbV9wRG9jdW1lbnQgPSBwUGFnZS0+bV9wRG9jdW1lbnQ7Ci0gICAgQ1BERl9BcnJheSogcEFubm90cyA9IG1fcFBhZ2VEaWN0LT5HZXRBcnJheSgiQW5ub3RzIik7Ci0gICAgaWYgKHBBbm5vdHMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47CisgICAgbV9Bbm5vdExpc3QucHVzaF9iYWNrKG5ldyBDUERGX0Fubm90KHBEaWN0LCB0aGlzKSk7CisgICAgaWYgKGJSZWdlbmVyYXRlQVAgJiYgcERpY3QtPkdldENvbnN0U3RyaW5nKCJTdWJ0eXBlIikgPT0gIldpZGdldCIgJiYKKyAgICAgICAgQ1BERl9JbnRlckZvcm06OlVwZGF0aW5nQVBFbmFibGVkKCkpIHsKKyAgICAgIEZQREZfR2VuZXJhdGVBUChtX3BEb2N1bWVudCwgcERpY3QpOwogICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKTsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBBY3JvRm9ybSA9IHBSb290LT5HZXREaWN0KCJBY3JvRm9ybSIpOwotICAgIEZYX0JPT0wgYlJlZ2VuZXJhdGVBUCA9IHBBY3JvRm9ybSAmJiBwQWNyb0Zvcm0tPkdldEJvb2xlYW4oIk5lZWRBcHBlYXJhbmNlcyIpOwotICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwQW5ub3RzLT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwQW5ub3RzLT5HZXRFbGVtZW50VmFsdWUoaSk7Ci0gICAgICAgIGlmIChwRGljdCA9PSBOVUxMIHx8IHBEaWN0LT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEZYX0RXT1JEIGR3T2JqTnVtID0gcERpY3QtPkdldE9iak51bSgpOwotICAgICAgICBpZiAoZHdPYmpOdW0gPT0gMCkgewotICAgICAgICAgICAgZHdPYmpOdW0gPSBtX3BEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocERpY3QpOwotICAgICAgICAgICAgQ1BERl9SZWZlcmVuY2UqIHBBY3Rpb24gPSBDUERGX1JlZmVyZW5jZTo6Q3JlYXRlKG1fcERvY3VtZW50LCBkd09iak51bSk7Ci0gICAgICAgICAgICBpZiAocEFjdGlvbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQW5ub3RzLT5JbnNlcnRBdChpLCBwQWN0aW9uKTsKLSAgICAgICAgICAgIHBBbm5vdHMtPlJlbW92ZUF0KGkgKyAxKTsKLSAgICAgICAgICAgIHBEaWN0ID0gcEFubm90cy0+R2V0RGljdChpKTsKLSAgICAgICAgfQotICAgICAgICBDUERGX0Fubm90KiBwQW5ub3QgPSBuZXcgQ1BERl9Bbm5vdChwRGljdCk7Ci0gICAgICAgIHBBbm5vdC0+bV9wTGlzdCA9IHRoaXM7Ci0gICAgICAgIG1fQW5ub3RMaXN0LkFkZChwQW5ub3QpOwotICAgICAgICBpZiAoYlJlZ2VuZXJhdGVBUCAmJiBwRGljdC0+R2V0Q29uc3RTdHJpbmcoRlhfQlNUUkMoIlN1YnR5cGUiKSkgPT0gRlhfQlNUUkMoIldpZGdldCIpKQotICAgICAgICAgICAgaWYgKENQREZfSW50ZXJGb3JtOjpVcGRhdGluZ0FQRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgRlBERl9HZW5lcmF0ZUFQKG1fcERvY3VtZW50LCBwRGljdCk7Ci0gICAgICAgICAgICB9Ci0gICAgfQorICB9CiB9Ci1DUERGX0Fubm90TGlzdDo6fkNQREZfQW5ub3RMaXN0KCkKLXsKLSAgICBpbnQgaSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IG1fQW5ub3RMaXN0LkdldFNpemUoKTsgaSArKykgewotICAgICAgICBkZWxldGUgKENQREZfQW5ub3QqKW1fQW5ub3RMaXN0W2ldOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbV9Cb3JkZXJzLkdldFNpemUoKTsgKytpKSB7Ci0gICAgICAgIGRlbGV0ZSAoQ1BERl9QYWdlT2JqZWN0cyopbV9Cb3JkZXJzW2ldOwotICAgIH0KKworQ1BERl9Bbm5vdExpc3Q6On5DUERGX0Fubm90TGlzdCgpIHsKKyAgZm9yIChDUERGX0Fubm90KiBhbm5vdCA6IG1fQW5ub3RMaXN0KQorICAgIGRlbGV0ZSBhbm5vdDsKIH0KLXZvaWQgQ1BERl9Bbm5vdExpc3Q6OkRpc3BsYXlQYXNzKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBGWF9CT09MIGJQcmludGluZywgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYldpZGdldFBhc3MsIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsIEZYX1JFQ1QqIGNsaXBfcmVjdCkKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fQW5ub3RMaXN0LkdldFNpemUoKTsgaSArKykgewotICAgICAgICBDUERGX0Fubm90KiBwQW5ub3QgPSAoQ1BERl9Bbm5vdCopbV9Bbm5vdExpc3RbaV07Ci0gICAgICAgIEZYX0JPT0wgYldpZGdldCA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiOwotICAgICAgICBpZiAoKGJXaWRnZXRQYXNzICYmICFiV2lkZ2V0KSB8fCAoIWJXaWRnZXRQYXNzICYmIGJXaWRnZXQpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBGWF9EV09SRCBhbm5vdF9mbGFncyA9IHBBbm5vdC0+R2V0RmxhZ3MoKTsKLSAgICAgICAgaWYgKGFubm90X2ZsYWdzICYgQU5OT1RGTEFHX0hJRERFTikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJQcmludGluZyAmJiAoYW5ub3RfZmxhZ3MgJiBBTk5PVEZMQUdfUFJJTlQpID09IDApIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghYlByaW50aW5nICYmIChhbm5vdF9mbGFncyAmIEFOTk9URkxBR19OT1ZJRVcpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocE9wdGlvbnMgIT0gTlVMTCkgewotICAgICAgICAgICAgSVBERl9PQ0NvbnRleHQqIHBPQ0NvbnRleHQgPSBwT3B0aW9ucy0+bV9wT0NDb250ZXh0OwotICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0ID0gcEFubm90LT5tX3BBbm5vdERpY3Q7Ci0gICAgICAgICAgICBpZiAocE9DQ29udGV4dCAhPSBOVUxMICYmIHBBbm5vdERpY3QgIT0gTlVMTCAmJgotICAgICAgICAgICAgICAgICAgICAhcE9DQ29udGV4dC0+Q2hlY2tPQ0dWaXNpYmxlKHBBbm5vdERpY3QtPkdldERpY3QoRlhfQlNUUkMoIk9DIikpKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIENQREZfUmVjdCBhbm5vdF9yZWN0X2Y7Ci0gICAgICAgIHBBbm5vdC0+R2V0UmVjdChhbm5vdF9yZWN0X2YpOwotICAgICAgICBDRlhfTWF0cml4IG1hdHJpeDsKLSAgICAgICAgbWF0cml4ID0gKnBNYXRyaXg7Ci0gICAgICAgIGlmIChjbGlwX3JlY3QpIHsKLSAgICAgICAgICAgIGFubm90X3JlY3RfZi5UcmFuc2Zvcm0oJm1hdHJpeCk7Ci0gICAgICAgICAgICBGWF9SRUNUIGFubm90X3JlY3QgPSBhbm5vdF9yZWN0X2YuR2V0T3V0dGVyUmVjdCgpOwotICAgICAgICAgICAgYW5ub3RfcmVjdC5JbnRlcnNlY3QoKmNsaXBfcmVjdCk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RfcmVjdC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocENvbnRleHQpIHsKLSAgICAgICAgICAgIHBBbm5vdC0+RHJhd0luQ29udGV4dChwUGFnZSwgcENvbnRleHQsICZtYXRyaXgsIENQREZfQW5ub3Q6Ok5vcm1hbCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXBBbm5vdC0+RHJhd0FwcGVhcmFuY2UocFBhZ2UsIHBEZXZpY2UsICZtYXRyaXgsIENQREZfQW5ub3Q6Ok5vcm1hbCwgcE9wdGlvbnMpKSB7Ci0gICAgICAgICAgICBwQW5ub3QtPkRyYXdCb3JkZXIocERldmljZSwgJm1hdHJpeCwgcE9wdGlvbnMpOwotICAgICAgICB9CisKK3ZvaWQgQ1BERl9Bbm5vdExpc3Q6OkRpc3BsYXlQYXNzKENQREZfUGFnZSogcFBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlByaW50aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYldpZGdldFBhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfUkVDVCogY2xpcF9yZWN0KSB7CisgIGZvciAoQ1BERl9Bbm5vdCogcEFubm90IDogbV9Bbm5vdExpc3QpIHsKKyAgICBGWF9CT09MIGJXaWRnZXQgPSBwQW5ub3QtPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0IjsKKyAgICBpZiAoKGJXaWRnZXRQYXNzICYmICFiV2lkZ2V0KSB8fCAoIWJXaWRnZXRQYXNzICYmIGJXaWRnZXQpKQorICAgICAgY29udGludWU7CisKKyAgICBGWF9EV09SRCBhbm5vdF9mbGFncyA9IHBBbm5vdC0+R2V0RmxhZ3MoKTsKKyAgICBpZiAoYW5ub3RfZmxhZ3MgJiBBTk5PVEZMQUdfSElEREVOKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoYlByaW50aW5nICYmIChhbm5vdF9mbGFncyAmIEFOTk9URkxBR19QUklOVCkgPT0gMCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKCFiUHJpbnRpbmcgJiYgKGFubm90X2ZsYWdzICYgQU5OT1RGTEFHX05PVklFVykpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChwT3B0aW9ucykgeworICAgICAgSVBERl9PQ0NvbnRleHQqIHBPQ0NvbnRleHQgPSBwT3B0aW9ucy0+bV9wT0NDb250ZXh0OworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0ID0gcEFubm90LT5HZXRBbm5vdERpY3QoKTsKKyAgICAgIGlmIChwT0NDb250ZXh0ICYmIHBBbm5vdERpY3QgJiYKKyAgICAgICAgICAhcE9DQ29udGV4dC0+Q2hlY2tPQ0dWaXNpYmxlKHBBbm5vdERpY3QtPkdldERpY3QoIk9DIikpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQogICAgIH0KKyAgICBDUERGX1JlY3QgYW5ub3RfcmVjdF9mOworICAgIHBBbm5vdC0+R2V0UmVjdChhbm5vdF9yZWN0X2YpOworICAgIENGWF9NYXRyaXggbWF0cml4ID0gKnBNYXRyaXg7CisgICAgaWYgKGNsaXBfcmVjdCkgeworICAgICAgYW5ub3RfcmVjdF9mLlRyYW5zZm9ybSgmbWF0cml4KTsKKyAgICAgIEZYX1JFQ1QgYW5ub3RfcmVjdCA9IGFubm90X3JlY3RfZi5HZXRPdXR0ZXJSZWN0KCk7CisgICAgICBhbm5vdF9yZWN0LkludGVyc2VjdCgqY2xpcF9yZWN0KTsKKyAgICAgIGlmIChhbm5vdF9yZWN0LklzRW1wdHkoKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHBDb250ZXh0KSB7CisgICAgICBwQW5ub3QtPkRyYXdJbkNvbnRleHQocFBhZ2UsIHBDb250ZXh0LCAmbWF0cml4LCBDUERGX0Fubm90OjpOb3JtYWwpOworICAgIH0gZWxzZSBpZiAoIXBBbm5vdC0+RHJhd0FwcGVhcmFuY2UocFBhZ2UsIHBEZXZpY2UsICZtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Fubm90OjpOb3JtYWwsIHBPcHRpb25zKSkgeworICAgICAgcEFubm90LT5EcmF3Qm9yZGVyKHBEZXZpY2UsICZtYXRyaXgsIHBPcHRpb25zKTsKKyAgICB9CisgIH0KIH0KLXZvaWQgQ1BERl9Bbm5vdExpc3Q6OkRpc3BsYXlBbm5vdHMoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcFVzZXIyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaG93V2lkZ2V0LCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKQotewotICAgIEZYX1JFQ1QgY2xpcF9yZWN0OwotICAgIGlmIChwRGV2aWNlKSB7Ci0gICAgICAgIGNsaXBfcmVjdCA9IHBEZXZpY2UtPkdldENsaXBCb3goKTsKLSAgICB9Ci0gICAgRlhfQk9PTCBiUHJpbnRpbmcgPSBwRGV2aWNlLT5HZXREZXZpY2VDbGFzcygpID09IEZYRENfUFJJTlRFUiB8fCAocE9wdGlvbnMgJiYgKHBPcHRpb25zLT5tX0ZsYWdzICYgUkVOREVSX1BSSU5UUFJFVklFVykpOwotICAgIERpc3BsYXlBbm5vdHMocFBhZ2UsIHBEZXZpY2UsIE5VTEwsIGJQcmludGluZywgcFVzZXIyRGV2aWNlLCBiU2hvd1dpZGdldCA/IDMgOiAxLCBwT3B0aW9ucywgJmNsaXBfcmVjdCk7CisKK3ZvaWQgQ1BERl9Bbm5vdExpc3Q6OkRpc3BsYXlBbm5vdHMoQ1BERl9QYWdlKiBwUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJpbnRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdBbm5vdEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9SRUNUKiBwQ2xpcFJlY3QpIHsKKyAgaWYgKGR3QW5ub3RGbGFncyAmIDB4MDEpIHsKKyAgICBEaXNwbGF5UGFzcyhwUGFnZSwgcERldmljZSwgcENvbnRleHQsIGJQcmludGluZywgcFVzZXIyRGV2aWNlLCBGQUxTRSwKKyAgICAgICAgICAgICAgICBwT3B0aW9ucywgcENsaXBSZWN0KTsKKyAgfQorICBpZiAoZHdBbm5vdEZsYWdzICYgMHgwMikgeworICAgIERpc3BsYXlQYXNzKHBQYWdlLCBwRGV2aWNlLCBwQ29udGV4dCwgYlByaW50aW5nLCBwVXNlcjJEZXZpY2UsIFRSVUUsCisgICAgICAgICAgICAgICAgcE9wdGlvbnMsIHBDbGlwUmVjdCk7CisgIH0KIH0KLXZvaWQgQ1BERl9Bbm5vdExpc3Q6OkRpc3BsYXlBbm5vdHMoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJpbnRpbmcsIENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwgRlhfRFdPUkQgZHdBbm5vdEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLCBGWF9SRUNUKiBwQ2xpcFJlY3QpCi17Ci0gICAgaWYgKGR3QW5ub3RGbGFncyAmIDB4MDEpIHsKLSAgICAgICAgRGlzcGxheVBhc3MocFBhZ2UsIHBEZXZpY2UsIHBDb250ZXh0LCBiUHJpbnRpbmcsIHBVc2VyMkRldmljZSwgRkFMU0UsIHBPcHRpb25zLCBwQ2xpcFJlY3QpOwotICAgIH0KLSAgICBpZiAoZHdBbm5vdEZsYWdzICYgMHgwMikgewotICAgICAgICBEaXNwbGF5UGFzcyhwUGFnZSwgcERldmljZSwgcENvbnRleHQsIGJQcmludGluZywgcFVzZXIyRGV2aWNlLCBUUlVFLCBwT3B0aW9ucywgcENsaXBSZWN0KTsKLSAgICB9CisKK0NQREZfQW5ub3Q6OkNQREZfQW5ub3QoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgQ1BERl9Bbm5vdExpc3QqIHBMaXN0KQorICAgIDogbV9wQW5ub3REaWN0KHBEaWN0KSwKKyAgICAgIG1fcExpc3QocExpc3QpLAorICAgICAgbV9zU3VidHlwZShtX3BBbm5vdERpY3QtPkdldENvbnN0U3RyaW5nKCJTdWJ0eXBlIikpIHt9CitDUERGX0Fubm90Ojp+Q1BERl9Bbm5vdCgpIHsKKyAgQ2xlYXJDYWNoZWRBUCgpOwogfQotaW50IENQREZfQW5ub3RMaXN0OjpHZXRJbmRleChDUERGX0Fubm90KiBwQW5ub3QpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX0Fubm90TGlzdC5HZXRTaXplKCk7IGkgKyspCi0gICAgICAgIGlmIChtX0Fubm90TGlzdFtpXSA9PSAoRlhfTFBWT0lEKXBBbm5vdCkgewotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLSAgICByZXR1cm4gLTE7Cit2b2lkIENQREZfQW5ub3Q6OkNsZWFyQ2FjaGVkQVAoKSB7CisgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG1fQVBNYXApIHsKKyAgICBkZWxldGUgcGFpci5zZWNvbmQ7CisgIH0KKyAgbV9BUE1hcC5jbGVhcigpOwogfQotQ1BERl9Bbm5vdDo6Q1BERl9Bbm5vdChDUERGX0RpY3Rpb25hcnkqIHBEaWN0KQotewotICAgIG1fcExpc3QgPSBOVUxMOwotICAgIG1fcEFubm90RGljdCA9IHBEaWN0OworQ0ZYX0J5dGVTdHJpbmcgQ1BERl9Bbm5vdDo6R2V0U3ViVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fc1N1YnR5cGU7CiB9Ci1DUERGX0Fubm90Ojp+Q1BERl9Bbm5vdCgpCi17Ci0gICAgQ2xlYXJDYWNoZWRBUCgpOworCit2b2lkIENQREZfQW5ub3Q6OkdldFJlY3QoQ1BERl9SZWN0JiByZWN0KSBjb25zdCB7CisgIGlmICghbV9wQW5ub3REaWN0KSB7CisgICAgcmV0dXJuOworICB9CisgIHJlY3QgPSBtX3BBbm5vdERpY3QtPkdldFJlY3QoIlJlY3QiKTsKKyAgcmVjdC5Ob3JtYWxpemUoKTsKIH0KLUNQREZfUmVmZXJlbmNlKiBDUERGX0Fubm90OjpOZXdBbm5vdFJlZigpCi17Ci0gICAgaWYgKG1fcEFubm90RGljdC0+R2V0T2JqTnVtKCkgPT0gMCkgewotICAgICAgICBtX3BMaXN0LT5tX3BEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QobV9wQW5ub3REaWN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIENQREZfUmVmZXJlbmNlOjpDcmVhdGUobV9wTGlzdC0+bV9wRG9jdW1lbnQsIG1fcEFubm90RGljdC0+R2V0T2JqTnVtKCkpOworCitGWF9EV09SRCBDUERGX0Fubm90OjpHZXRGbGFncygpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEFubm90RGljdC0+R2V0SW50ZWdlcigiRiIpOwogfQotdm9pZCBDUERGX0Fubm90OjpDbGVhckNhY2hlZEFQKCkKLXsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBtX0FQTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIHZvaWQqIHBGb3JtOwotICAgICAgICB2b2lkKiBwT2JqZWN0czsKLSAgICAgICAgbV9BUE1hcC5HZXROZXh0QXNzb2MocG9zLCBwRm9ybSwgcE9iamVjdHMpOwotICAgICAgICBkZWxldGUgKENQREZfUGFnZU9iamVjdHMqKXBPYmplY3RzOwotICAgIH0KLSAgICBtX0FQTWFwLlJlbW92ZUFsbCgpOwotfQotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9Bbm5vdDo6R2V0U3ViVHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcEFubm90RGljdCA/IG1fcEFubm90RGljdC0+R2V0Q29uc3RTdHJpbmcoRlhfQlNUUkMoIlN1YnR5cGUiKSkgOiBDRlhfQnl0ZVN0cmluZ0MoKTsKLX0KLXZvaWQgQ1BERl9Bbm5vdDo6R2V0UmVjdChDUERGX1JlY3QmIHJlY3QpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcEFubm90RGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcmVjdCA9IG1fcEFubm90RGljdC0+R2V0UmVjdCgiUmVjdCIpOwotICAgIHJlY3QuTm9ybWFsaXplKCk7Ci19Ci1DUERGX1N0cmVhbSogRlBERkRPQ19HZXRBbm5vdEFQKENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCwgQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSkKLXsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBBUCA9IHBBbm5vdERpY3QtPkdldERpY3QoIkFQIik7Ci0gICAgaWYgKHBBUCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBjb25zdCBGWF9DSEFSKiBhcF9lbnRyeSA9ICJOIjsKLSAgICBpZiAobW9kZSA9PSBDUERGX0Fubm90OjpEb3duKSB7Ci0gICAgICAgIGFwX2VudHJ5ID0gIkQiOwotICAgIH0gZWxzZSBpZiAobW9kZSA9PSBDUERGX0Fubm90OjpSb2xsb3ZlcikgewotICAgICAgICBhcF9lbnRyeSA9ICJSIjsKLSAgICB9Ci0gICAgaWYgKCFwQVAtPktleUV4aXN0KGFwX2VudHJ5KSkgewotICAgICAgICBhcF9lbnRyeSA9ICJOIjsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBzdWIgPSBwQVAtPkdldEVsZW1lbnRWYWx1ZShhcF9lbnRyeSk7Ci0gICAgaWYgKHBzdWIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBOVUxMOwotICAgIGlmIChwc3ViLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgewotICAgICAgICBwU3RyZWFtID0gKENQREZfU3RyZWFtKilwc3ViOwotICAgIH0gZWxzZSBpZiAocHN1Yi0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGFzID0gcEFubm90RGljdC0+R2V0U3RyaW5nKCJBUyIpOwotICAgICAgICBpZiAoYXMuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyB2YWx1ZSA9IHBBbm5vdERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiViIpKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcEFubm90RGljdC0+R2V0RGljdChGWF9CU1RSQygiUGFyZW50IikpOwotICAgICAgICAgICAgICAgIHZhbHVlID0gcERpY3QgPyBwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJWIikpIDogQ0ZYX0J5dGVTdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2YWx1ZS5Jc0VtcHR5KCkgfHwgISgoQ1BERl9EaWN0aW9uYXJ5Kilwc3ViKS0+S2V5RXhpc3QodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgYXMgPSBGWF9CU1RSQygiT2ZmIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFzID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcFN0cmVhbSA9ICgoQ1BERl9EaWN0aW9uYXJ5Kilwc3ViKS0+R2V0U3RyZWFtKGFzKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBTdHJlYW07Ci19Ci1DUERGX0Zvcm0qIENQREZfQW5ub3Q6OkdldEFQRm9ybShjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBBcHBlYXJhbmNlTW9kZSBtb2RlKQotewotICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gRlBERkRPQ19HZXRBbm5vdEFQKG1fcEFubm90RGljdCwgbW9kZSk7Ci0gICAgaWYgKHBTdHJlYW0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9Gb3JtKiBwRm9ybTsKLSAgICBpZiAobV9BUE1hcC5Mb29rdXAocFN0cmVhbSwgKHZvaWQqJilwRm9ybSkpIHsKLSAgICAgICAgcmV0dXJuIHBGb3JtOwotICAgIH0KLSAgICBwRm9ybSA9IG5ldyBDUERGX0Zvcm0obV9wTGlzdC0+bV9wRG9jdW1lbnQsIHBQYWdlLT5tX3BSZXNvdXJjZXMsIHBTdHJlYW0pOwotICAgIHBGb3JtLT5QYXJzZUNvbnRlbnQoTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0gICAgbV9BUE1hcC5TZXRBdChwU3RyZWFtLCBwRm9ybSk7Ci0gICAgcmV0dXJuIHBGb3JtOwotfQotc3RhdGljIENQREZfRm9ybSogRlBERkRPQ19Bbm5vdF9HZXRNYXRyaXgoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ1BERl9Bbm5vdCogcEFubm90LCBDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVXNlcjJEZXZpY2UsIENGWF9NYXRyaXggJm1hdHJpeCkKLXsKLSAgICBDUERGX0Zvcm0qIHBGb3JtID0gcEFubm90LT5HZXRBUEZvcm0ocFBhZ2UsIG1vZGUpOwotICAgIGlmICghcEZvcm0pIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENGWF9GbG9hdFJlY3QgZm9ybV9iYm94ID0gcEZvcm0tPm1fcEZvcm1EaWN0LT5HZXRSZWN0KEZYX0JTVFJDKCJCQm94IikpOwotICAgIENGWF9NYXRyaXggZm9ybV9tYXRyaXggPSBwRm9ybS0+bV9wRm9ybURpY3QtPkdldE1hdHJpeChGWF9CU1RSQygiTWF0cml4IikpOwotICAgIGZvcm1fbWF0cml4LlRyYW5zZm9ybVJlY3QoZm9ybV9iYm94KTsKLSAgICBDUERGX1JlY3QgYXJlY3Q7Ci0gICAgcEFubm90LT5HZXRSZWN0KGFyZWN0KTsKLSAgICBtYXRyaXguTWF0Y2hSZWN0KGFyZWN0LCBmb3JtX2Jib3gpOwotICAgIG1hdHJpeC5Db25jYXQoKnBVc2VyMkRldmljZSk7Ci0gICAgcmV0dXJuIHBGb3JtOwotfQotRlhfQk9PTCBDUERGX0Fubm90OjpEcmF3QXBwZWFyYW5jZShjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGVhcmFuY2VNb2RlIG1vZGUsIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpCi17Ci0gICAgQ0ZYX01hdHJpeCBtYXRyaXg7Ci0gICAgQ1BERl9Gb3JtKiBwRm9ybSA9IEZQREZET0NfQW5ub3RfR2V0TWF0cml4KHBQYWdlLCB0aGlzLCBtb2RlLCBwVXNlcjJEZXZpY2UsIG1hdHJpeCk7Ci0gICAgaWYgKCFwRm9ybSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENQREZfUmVuZGVyQ29udGV4dCBjb250ZXh0OwotICAgIGNvbnRleHQuQ3JlYXRlKChDUERGX1BhZ2UqKXBQYWdlKTsKLSAgICBjb250ZXh0LkRyYXdPYmplY3RMaXN0KHBEZXZpY2UsIHBGb3JtLCAmbWF0cml4LCBwT3B0aW9ucyk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENQREZfQW5ub3Q6OkRyYXdJbkNvbnRleHQoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgY29uc3QgQ1BERl9SZW5kZXJDb250ZXh0KiBwQ29udGV4dCwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFVzZXIyRGV2aWNlLCBBcHBlYXJhbmNlTW9kZSBtb2RlKQotewotICAgIENGWF9NYXRyaXggbWF0cml4OwotICAgIENQREZfRm9ybSogcEZvcm0gPSBGUERGRE9DX0Fubm90X0dldE1hdHJpeChwUGFnZSwgdGhpcywgbW9kZSwgcFVzZXIyRGV2aWNlLCBtYXRyaXgpOwotICAgIGlmICghcEZvcm0pIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICAoKENQREZfUmVuZGVyQ29udGV4dCopcENvbnRleHQpLT5BcHBlbmRPYmplY3RMaXN0KHBGb3JtLCAmbWF0cml4KTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUNQREZfUGFnZU9iamVjdCogQ1BERl9Bbm5vdDo6R2V0Qm9yZGVyKEZYX0JPT0wgYlByaW50LCBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKQotewotICAgIGlmIChHZXRTdWJUeXBlKCkgPT0gIlBvcHVwIikgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgRlhfRFdPUkQgYW5ub3RfZmxhZ3MgPSBHZXRGbGFncygpOwotICAgIGlmIChhbm5vdF9mbGFncyAmIEFOTk9URkxBR19ISURERU4pIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYX0JPT0wgYlByaW50aW5nID0gYlByaW50IHx8IChwT3B0aW9ucyAmJiAocE9wdGlvbnMtPm1fRmxhZ3MgJiBSRU5ERVJfUFJJTlRQUkVWSUVXKSk7Ci0gICAgaWYgKGJQcmludGluZyAmJiAoYW5ub3RfZmxhZ3MgJiBBTk5PVEZMQUdfUFJJTlQpID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmICghYlByaW50aW5nICYmIChhbm5vdF9mbGFncyAmIEFOTk9URkxBR19OT1ZJRVcpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBCUyA9IG1fcEFubm90RGljdC0+R2V0RGljdCgiQlMiKTsKLSAgICBjaGFyIHN0eWxlX2NoYXI7Ci0gICAgRlhfRkxPQVQgd2lkdGg7Ci0gICAgQ1BERl9BcnJheSogcERhc2hBcnJheSA9IE5VTEw7Ci0gICAgaWYgKHBCUyA9PSBOVUxMKSB7Ci0gICAgICAgIENQREZfQXJyYXkqIHBCb3JkZXJBcnJheSA9IG1fcEFubm90RGljdC0+R2V0QXJyYXkoIkJvcmRlciIpOwotICAgICAgICBzdHlsZV9jaGFyID0gJ1MnOwotICAgICAgICBpZiAocEJvcmRlckFycmF5KSB7Ci0gICAgICAgICAgICB3aWR0aCA9IHBCb3JkZXJBcnJheS0+R2V0TnVtYmVyKDIpOwotICAgICAgICAgICAgaWYgKHBCb3JkZXJBcnJheS0+R2V0Q291bnQoKSA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgcERhc2hBcnJheSA9IHBCb3JkZXJBcnJheS0+R2V0QXJyYXkoMyk7Ci0gICAgICAgICAgICAgICAgaWYgKHBEYXNoQXJyYXkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3R5bGVfY2hhciA9ICdEJzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdpZHRoID0gMTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHN0eWxlID0gcEJTLT5HZXRTdHJpbmcoIlMiKTsKLSAgICAgICAgcERhc2hBcnJheSA9IHBCUy0+R2V0QXJyYXkoIkQiKTsKLSAgICAgICAgc3R5bGVfY2hhciA9IHN0eWxlWzFdOwotICAgICAgICB3aWR0aCA9IHBCUy0+R2V0TnVtYmVyKCJXIik7Ci0gICAgfQotICAgIGlmICh3aWR0aCA8PSAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX0FycmF5KiBwQ29sb3IgPSBtX3BBbm5vdERpY3QtPkdldEFycmF5KCJDIik7Ci0gICAgRlhfRFdPUkQgYXJnYiA9IDB4ZmYwMDAwMDA7Ci0gICAgaWYgKHBDb2xvciAhPSBOVUxMKSB7Ci0gICAgICAgIGludCBSID0gKEZYX0lOVDMyKShwQ29sb3ItPkdldE51bWJlcigwKSAqIDI1NSk7Ci0gICAgICAgIGludCBHID0gKEZYX0lOVDMyKShwQ29sb3ItPkdldE51bWJlcigxKSAqIDI1NSk7Ci0gICAgICAgIGludCBCID0gKEZYX0lOVDMyKShwQ29sb3ItPkdldE51bWJlcigyKSAqIDI1NSk7Ci0gICAgICAgIGFyZ2IgPSBBcmdiRW5jb2RlKDB4ZmYsIFIsIEcsIEIpOwotICAgIH0KLSAgICBub25zdGQ6OnVuaXF1ZV9wdHI8Q1BERl9QYXRoT2JqZWN0PiBwUGF0aE9iamVjdChuZXcgQ1BERl9QYXRoT2JqZWN0KCkpOwotICAgIENQREZfR3JhcGhTdGF0ZURhdGEgKnBHcmFwaFN0YXRlID0gcFBhdGhPYmplY3QtPm1fR3JhcGhTdGF0ZS5HZXRNb2RpZnkoKTsKLSAgICBpZiAoIXBHcmFwaFN0YXRlKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBwR3JhcGhTdGF0ZS0+bV9MaW5lV2lkdGggPSB3aWR0aDsKLSAgICBDUERGX0NvbG9yU3RhdGVEYXRhICpwQ29sb3JEYXRhID0gcFBhdGhPYmplY3QtPm1fQ29sb3JTdGF0ZS5HZXRNb2RpZnkoKTsKLSAgICBpZiAoIXBDb2xvckRhdGEpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHBDb2xvckRhdGEtPm1fU3Ryb2tlUkdCID0gYXJnYjsKLSAgICBwUGF0aE9iamVjdC0+bV9iU3Ryb2tlID0gVFJVRTsKLSAgICBwUGF0aE9iamVjdC0+bV9GaWxsVHlwZSA9IDA7Ci0gICAgaWYgKHN0eWxlX2NoYXIgPT0gJ0QnKSB7Ci0gICAgICAgIGlmIChwRGFzaEFycmF5KSB7Ci0gICAgICAgICAgICBGWF9EV09SRCBkYXNoX2NvdW50ID0gcERhc2hBcnJheS0+R2V0Q291bnQoKTsKLSAgICAgICAgICAgIGlmIChkYXNoX2NvdW50ICUgMikgewotICAgICAgICAgICAgICAgIGRhc2hfY291bnQgKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwR3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXkgPSBGWF9BbGxvYyhGWF9GTE9BVCwgZGFzaF9jb3VudCk7Ci0gICAgICAgICAgICBwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQgPSBkYXNoX2NvdW50OwotICAgICAgICAgICAgRlhfRFdPUkQgaTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwRGFzaEFycmF5LT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgcEdyYXBoU3RhdGUtPm1fRGFzaEFycmF5W2ldID0gcERhc2hBcnJheS0+R2V0TnVtYmVyKGkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkgPCBkYXNoX2NvdW50KSB7Ci0gICAgICAgICAgICAgICAgcEdyYXBoU3RhdGUtPm1fRGFzaEFycmF5W2ldID0gcEdyYXBoU3RhdGUtPm1fRGFzaEFycmF5W2kgLSAxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBHcmFwaFN0YXRlLT5tX0Rhc2hBcnJheSA9IEZYX0FsbG9jKEZYX0ZMT0FULCAyKTsKLSAgICAgICAgICAgIHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudCA9IDI7Ci0gICAgICAgICAgICBwR3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXlbMF0gPSBwR3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXlbMV0gPSAzICogMS4wZjsKLSAgICAgICAgfQotICAgIH0KLSAgICBDRlhfRmxvYXRSZWN0IHJlY3Q7Ci0gICAgR2V0UmVjdChyZWN0KTsKLSAgICB3aWR0aCAvPSAyOwotICAgIENQREZfUGF0aERhdGEgKnBQYXRoRGF0YSA9IHBQYXRoT2JqZWN0LT5tX1BhdGguR2V0TW9kaWZ5KCk7Ci0gICAgaWYgKHBQYXRoRGF0YSkgewotICAgICAgICBwUGF0aERhdGEtPkFwcGVuZFJlY3QocmVjdC5sZWZ0ICsgd2lkdGgsIHJlY3QuYm90dG9tICsgd2lkdGgsIHJlY3QucmlnaHQgLSB3aWR0aCwgcmVjdC50b3AgLSB3aWR0aCk7Ci0gICAgfQotICAgIHBQYXRoT2JqZWN0LT5DYWxjQm91bmRpbmdCb3goKTsKLSAgICByZXR1cm4gcFBhdGhPYmplY3QucmVsZWFzZSgpOwotfQotdm9pZCBDUERGX0Fubm90OjpEcmF3Qm9yZGVyKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykKLXsKLSAgICBpZiAoR2V0U3ViVHlwZSgpID09ICJQb3B1cCIpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9EV09SRCBhbm5vdF9mbGFncyA9IEdldEZsYWdzKCk7Ci0gICAgaWYgKGFubm90X2ZsYWdzICYgQU5OT1RGTEFHX0hJRERFTikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYX0JPT0wgYlByaW50aW5nID0gcERldmljZS0+R2V0RGV2aWNlQ2xhc3MoKSA9PSBGWERDX1BSSU5URVIgfHwgKHBPcHRpb25zICYmIChwT3B0aW9ucy0+bV9GbGFncyAmIFJFTkRFUl9QUklOVFBSRVZJRVcpKTsKLSAgICBpZiAoYlByaW50aW5nICYmIChhbm5vdF9mbGFncyAmIEFOTk9URkxBR19QUklOVCkgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICghYlByaW50aW5nICYmIChhbm5vdF9mbGFncyAmIEFOTk9URkxBR19OT1ZJRVcpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwQlMgPSBtX3BBbm5vdERpY3QtPkdldERpY3QoIkJTIik7Ci0gICAgY2hhciBzdHlsZV9jaGFyOwotICAgIEZYX0ZMT0FUIHdpZHRoOwotICAgIENQREZfQXJyYXkqIHBEYXNoQXJyYXkgPSBOVUxMOwotICAgIGlmIChwQlMgPT0gTlVMTCkgewotICAgICAgICBDUERGX0FycmF5KiBwQm9yZGVyQXJyYXkgPSBtX3BBbm5vdERpY3QtPkdldEFycmF5KCJCb3JkZXIiKTsKLSAgICAgICAgc3R5bGVfY2hhciA9ICdTJzsKLSAgICAgICAgaWYgKHBCb3JkZXJBcnJheSkgewotICAgICAgICAgICAgd2lkdGggPSBwQm9yZGVyQXJyYXktPkdldE51bWJlcigyKTsKLSAgICAgICAgICAgIGlmIChwQm9yZGVyQXJyYXktPkdldENvdW50KCkgPT0gNCkgewotICAgICAgICAgICAgICAgIHBEYXNoQXJyYXkgPSBwQm9yZGVyQXJyYXktPkdldEFycmF5KDMpOwotICAgICAgICAgICAgICAgIGlmIChwRGFzaEFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgbkxlbiA9IHBEYXNoQXJyYXktPkdldENvdW50KCk7Ci0gICAgICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgbkxlbjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KnBPYmogPSBwRGFzaEFycmF5LT5HZXRFbGVtZW50VmFsdWUoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwT2JqICYmIHBPYmotPkdldEludGVnZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGkgPT0gbkxlbikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0eWxlX2NoYXIgPSAnRCc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3aWR0aCA9IDE7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHlsZSA9IHBCUy0+R2V0U3RyaW5nKCJTIik7Ci0gICAgICAgIHBEYXNoQXJyYXkgPSBwQlMtPkdldEFycmF5KCJEIik7Ci0gICAgICAgIHN0eWxlX2NoYXIgPSBzdHlsZVsxXTsKLSAgICAgICAgd2lkdGggPSBwQlMtPkdldE51bWJlcigiVyIpOwotICAgIH0KLSAgICBpZiAod2lkdGggPD0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBDb2xvciA9IG1fcEFubm90RGljdC0+R2V0QXJyYXkoIkMiKTsKLSAgICBGWF9EV09SRCBhcmdiID0gMHhmZjAwMDAwMDsKLSAgICBpZiAocENvbG9yICE9IE5VTEwpIHsKLSAgICAgICAgaW50IFIgPSAoRlhfSU5UMzIpKHBDb2xvci0+R2V0TnVtYmVyKDApICogMjU1KTsKLSAgICAgICAgaW50IEcgPSAoRlhfSU5UMzIpKHBDb2xvci0+R2V0TnVtYmVyKDEpICogMjU1KTsKLSAgICAgICAgaW50IEIgPSAoRlhfSU5UMzIpKHBDb2xvci0+R2V0TnVtYmVyKDIpICogMjU1KTsKLSAgICAgICAgYXJnYiA9IEFyZ2JFbmNvZGUoMHhmZiwgUiwgRywgQik7Ci0gICAgfQotICAgIENQREZfR3JhcGhTdGF0ZURhdGEgZ3JhcGhfc3RhdGU7Ci0gICAgZ3JhcGhfc3RhdGUubV9MaW5lV2lkdGggPSB3aWR0aDsKLSAgICBpZiAoc3R5bGVfY2hhciA9PSAnRCcpIHsKLSAgICAgICAgaWYgKHBEYXNoQXJyYXkpIHsKLSAgICAgICAgICAgIEZYX0RXT1JEIGRhc2hfY291bnQgPSBwRGFzaEFycmF5LT5HZXRDb3VudCgpOwotICAgICAgICAgICAgaWYgKGRhc2hfY291bnQgJSAyKSB7Ci0gICAgICAgICAgICAgICAgZGFzaF9jb3VudCArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdyYXBoX3N0YXRlLm1fRGFzaEFycmF5ID0gRlhfQWxsb2MoRlhfRkxPQVQsIGRhc2hfY291bnQpOwotICAgICAgICAgICAgZ3JhcGhfc3RhdGUubV9EYXNoQ291bnQgPSBkYXNoX2NvdW50OwotICAgICAgICAgICAgRlhfRFdPUkQgaTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwRGFzaEFycmF5LT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgZ3JhcGhfc3RhdGUubV9EYXNoQXJyYXlbaV0gPSBwRGFzaEFycmF5LT5HZXROdW1iZXIoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaSA8IGRhc2hfY291bnQpIHsKLSAgICAgICAgICAgICAgICBncmFwaF9zdGF0ZS5tX0Rhc2hBcnJheVtpXSA9IGdyYXBoX3N0YXRlLm1fRGFzaEFycmF5W2kgLSAxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdyYXBoX3N0YXRlLm1fRGFzaEFycmF5ID0gRlhfQWxsb2MoRlhfRkxPQVQsIDIpOwotICAgICAgICAgICAgZ3JhcGhfc3RhdGUubV9EYXNoQ291bnQgPSAyOwotICAgICAgICAgICAgZ3JhcGhfc3RhdGUubV9EYXNoQXJyYXlbMF0gPSBncmFwaF9zdGF0ZS5tX0Rhc2hBcnJheVsxXSA9IDMgKiAxLjBmOwotICAgICAgICB9Ci0gICAgfQotICAgIENGWF9GbG9hdFJlY3QgcmVjdDsKLSAgICBHZXRSZWN0KHJlY3QpOwotICAgIENQREZfUGF0aERhdGEgcGF0aDsKLSAgICB3aWR0aCAvPSAyOwotICAgIHBhdGguQXBwZW5kUmVjdChyZWN0LmxlZnQgKyB3aWR0aCwgcmVjdC5ib3R0b20gKyB3aWR0aCwgcmVjdC5yaWdodCAtIHdpZHRoLCByZWN0LnRvcCAtIHdpZHRoKTsKLSAgICBpbnQgZmlsbF90eXBlID0gMDsKLSAgICBpZiAocE9wdGlvbnMgJiYgKHBPcHRpb25zLT5tX0ZsYWdzICYgUkVOREVSX05PUEFUSFNNT09USCkpIHsKLSAgICAgICAgZmlsbF90eXBlIHw9IEZYRklMTF9OT1BBVEhTTU9PVEg7Ci0gICAgfQotICAgIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsICZncmFwaF9zdGF0ZSwgYXJnYiwgYXJnYiwgZmlsbF90eXBlKTsKLX0KLWludCBDUERGX0Fubm90OjpDb3VudElSVE5vdGVzKCkKLXsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9wTGlzdC0+Q291bnQoKTsgaSArKykgewotICAgICAgICBDUERGX0Fubm90KiBwQW5ub3QgPSBtX3BMaXN0LT5HZXRBdChpKTsKLSAgICAgICAgaWYgKHBBbm5vdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBJUlQgPSBwQW5ub3QtPm1fcEFubm90RGljdC0+R2V0RGljdCgiSVJUIik7Ci0gICAgICAgIGlmIChwSVJUICE9IG1fcEFubm90RGljdCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgY291bnQgKys7Ci0gICAgfQotICAgIHJldHVybiBjb3VudDsKLX0KLUNQREZfQW5ub3QqIENQREZfQW5ub3Q6OkdldElSVE5vdGUoaW50IGluZGV4KQotewotICAgIGludCBjb3VudCA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3BMaXN0LT5Db3VudCgpOyBpICsrKSB7Ci0gICAgICAgIENQREZfQW5ub3QqIHBBbm5vdCA9IG1fcExpc3QtPkdldEF0KGkpOwotICAgICAgICBpZiAocEFubm90ID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcElSVCA9IHBBbm5vdC0+bV9wQW5ub3REaWN0LT5HZXREaWN0KCJJUlQiKTsKLSAgICAgICAgaWYgKHBJUlQgIT0gbV9wQW5ub3REaWN0KSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY291bnQgPT0gaW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBwQW5ub3Q7Ci0gICAgICAgIH0KLSAgICAgICAgY291bnQgKys7Ci0gICAgfQorCitDUERGX1N0cmVhbSogRlBERkRPQ19HZXRBbm5vdEFQKENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSkgeworICBDUERGX0RpY3Rpb25hcnkqIHBBUCA9IHBBbm5vdERpY3QtPkdldERpY3QoIkFQIik7CisgIGlmICghcEFQKSB7CiAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgY29uc3QgRlhfQ0hBUiogYXBfZW50cnkgPSAiTiI7CisgIGlmIChtb2RlID09IENQREZfQW5ub3Q6OkRvd24pCisgICAgYXBfZW50cnkgPSAiRCI7CisgIGVsc2UgaWYgKG1vZGUgPT0gQ1BERl9Bbm5vdDo6Um9sbG92ZXIpCisgICAgYXBfZW50cnkgPSAiUiI7CisgIGlmICghcEFQLT5LZXlFeGlzdChhcF9lbnRyeSkpCisgICAgYXBfZW50cnkgPSAiTiI7CisKKyAgQ1BERl9PYmplY3QqIHBzdWIgPSBwQVAtPkdldEVsZW1lbnRWYWx1ZShhcF9lbnRyeSk7CisgIGlmICghcHN1YikKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgaWYgKENQREZfU3RyZWFtKiBwU3RyZWFtID0gcHN1Yi0+QXNTdHJlYW0oKSkKKyAgICByZXR1cm4gcFN0cmVhbTsKKworICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBzdWItPkFzRGljdGlvbmFyeSgpKSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgYXMgPSBwQW5ub3REaWN0LT5HZXRTdHJpbmcoIkFTIik7CisgICAgaWYgKGFzLklzRW1wdHkoKSkgeworICAgICAgQ0ZYX0J5dGVTdHJpbmcgdmFsdWUgPSBwQW5ub3REaWN0LT5HZXRTdHJpbmcoIlYiKTsKKyAgICAgIGlmICh2YWx1ZS5Jc0VtcHR5KCkpIHsKKyAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBBbm5vdERpY3QtPkdldERpY3QoIlBhcmVudCIpOworICAgICAgICB2YWx1ZSA9IHBEaWN0ID8gcERpY3QtPkdldFN0cmluZygiViIpIDogQ0ZYX0J5dGVTdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIGlmICh2YWx1ZS5Jc0VtcHR5KCkgfHwgIXBEaWN0LT5LZXlFeGlzdCh2YWx1ZSkpCisgICAgICAgIGFzID0gIk9mZiI7CisgICAgICBlbHNlCisgICAgICAgIGFzID0gdmFsdWU7CisgICAgfQorICAgIHJldHVybiBwRGljdC0+R2V0U3RyZWFtKGFzKTsKKyAgfQorICByZXR1cm4gbnVsbHB0cjsKK30KKworQ1BERl9Gb3JtKiBDUERGX0Fubm90OjpHZXRBUEZvcm0oY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQXBwZWFyYW5jZU1vZGUgbW9kZSkgeworICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IEZQREZET0NfR2V0QW5ub3RBUChtX3BBbm5vdERpY3QsIG1vZGUpOworICBpZiAoIXBTdHJlYW0pCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgYXV0byBpdCA9IG1fQVBNYXAuZmluZChwU3RyZWFtKTsKKyAgaWYgKGl0ICE9IG1fQVBNYXAuZW5kKCkpCisgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisKKyAgQ1BERl9Gb3JtKiBwTmV3Rm9ybSA9CisgICAgICBuZXcgQ1BERl9Gb3JtKG1fcExpc3QtPkdldERvY3VtZW50KCksIHBQYWdlLT5tX3BSZXNvdXJjZXMsIHBTdHJlYW0pOworICBwTmV3Rm9ybS0+UGFyc2VDb250ZW50KG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpOworICBtX0FQTWFwW3BTdHJlYW1dID0gcE5ld0Zvcm07CisgIHJldHVybiBwTmV3Rm9ybTsKK30KKworc3RhdGljIENQREZfRm9ybSogRlBERkRPQ19Bbm5vdF9HZXRNYXRyaXgoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4JiBtYXRyaXgpIHsKKyAgQ1BERl9Gb3JtKiBwRm9ybSA9IHBBbm5vdC0+R2V0QVBGb3JtKHBQYWdlLCBtb2RlKTsKKyAgaWYgKCFwRm9ybSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENGWF9GbG9hdFJlY3QgZm9ybV9iYm94ID0gcEZvcm0tPm1fcEZvcm1EaWN0LT5HZXRSZWN0KCJCQm94Iik7CisgIENGWF9NYXRyaXggZm9ybV9tYXRyaXggPSBwRm9ybS0+bV9wRm9ybURpY3QtPkdldE1hdHJpeCgiTWF0cml4Iik7CisgIGZvcm1fbWF0cml4LlRyYW5zZm9ybVJlY3QoZm9ybV9iYm94KTsKKyAgQ1BERl9SZWN0IGFyZWN0OworICBwQW5ub3QtPkdldFJlY3QoYXJlY3QpOworICBtYXRyaXguTWF0Y2hSZWN0KGFyZWN0LCBmb3JtX2Jib3gpOworICBtYXRyaXguQ29uY2F0KCpwVXNlcjJEZXZpY2UpOworICByZXR1cm4gcEZvcm07Cit9CitGWF9CT09MIENQREZfQW5ub3Q6OkRyYXdBcHBlYXJhbmNlKENQREZfUGFnZSogcFBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwZWFyYW5jZU1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykgeworICBDRlhfTWF0cml4IG1hdHJpeDsKKyAgQ1BERl9Gb3JtKiBwRm9ybSA9CisgICAgICBGUERGRE9DX0Fubm90X0dldE1hdHJpeChwUGFnZSwgdGhpcywgbW9kZSwgcFVzZXIyRGV2aWNlLCBtYXRyaXgpOworICBpZiAoIXBGb3JtKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfUmVuZGVyQ29udGV4dCBjb250ZXh0KHBQYWdlKTsKKyAgY29udGV4dC5EcmF3T2JqZWN0TGlzdChwRGV2aWNlLCBwRm9ybSwgJm1hdHJpeCwgcE9wdGlvbnMpOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9Bbm5vdDo6RHJhd0luQ29udGV4dChjb25zdCBDUERGX1BhZ2UqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGVhcmFuY2VNb2RlIG1vZGUpIHsKKyAgQ0ZYX01hdHJpeCBtYXRyaXg7CisgIENQREZfRm9ybSogcEZvcm0gPQorICAgICAgRlBERkRPQ19Bbm5vdF9HZXRNYXRyaXgocFBhZ2UsIHRoaXMsIG1vZGUsIHBVc2VyMkRldmljZSwgbWF0cml4KTsKKyAgaWYgKCFwRm9ybSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBwQ29udGV4dC0+QXBwZW5kT2JqZWN0TGlzdChwRm9ybSwgJm1hdHJpeCk7CisgIHJldHVybiBUUlVFOworfQordm9pZCBDUERGX0Fubm90OjpEcmF3Qm9yZGVyKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpIHsKKyAgaWYgKEdldFN1YlR5cGUoKSA9PSAiUG9wdXAiKSB7CisgICAgcmV0dXJuOworICB9CisgIEZYX0RXT1JEIGFubm90X2ZsYWdzID0gR2V0RmxhZ3MoKTsKKyAgaWYgKGFubm90X2ZsYWdzICYgQU5OT1RGTEFHX0hJRERFTikgeworICAgIHJldHVybjsKKyAgfQorICBGWF9CT09MIGJQcmludGluZyA9IHBEZXZpY2UtPkdldERldmljZUNsYXNzKCkgPT0gRlhEQ19QUklOVEVSIHx8CisgICAgICAgICAgICAgICAgICAgICAgKHBPcHRpb25zICYmIChwT3B0aW9ucy0+bV9GbGFncyAmIFJFTkRFUl9QUklOVFBSRVZJRVcpKTsKKyAgaWYgKGJQcmludGluZyAmJiAoYW5ub3RfZmxhZ3MgJiBBTk5PVEZMQUdfUFJJTlQpID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFiUHJpbnRpbmcgJiYgKGFubm90X2ZsYWdzICYgQU5OT1RGTEFHX05PVklFVykpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQlMgPSBtX3BBbm5vdERpY3QtPkdldERpY3QoIkJTIik7CisgIGNoYXIgc3R5bGVfY2hhcjsKKyAgRlhfRkxPQVQgd2lkdGg7CisgIENQREZfQXJyYXkqIHBEYXNoQXJyYXkgPSBOVUxMOworICBpZiAoIXBCUykgeworICAgIENQREZfQXJyYXkqIHBCb3JkZXJBcnJheSA9IG1fcEFubm90RGljdC0+R2V0QXJyYXkoIkJvcmRlciIpOworICAgIHN0eWxlX2NoYXIgPSAnUyc7CisgICAgaWYgKHBCb3JkZXJBcnJheSkgeworICAgICAgd2lkdGggPSBwQm9yZGVyQXJyYXktPkdldE51bWJlcigyKTsKKyAgICAgIGlmIChwQm9yZGVyQXJyYXktPkdldENvdW50KCkgPT0gNCkgeworICAgICAgICBwRGFzaEFycmF5ID0gcEJvcmRlckFycmF5LT5HZXRBcnJheSgzKTsKKyAgICAgICAgaWYgKCFwRGFzaEFycmF5KSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGludCBuTGVuID0gcERhc2hBcnJheS0+R2V0Q291bnQoKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKDsgaSA8IG5MZW47ICsraSkgeworICAgICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gcERhc2hBcnJheS0+R2V0RWxlbWVudFZhbHVlKGkpOworICAgICAgICAgIGlmIChwT2JqICYmIHBPYmotPkdldEludGVnZXIoKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpID09IG5MZW4pIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3R5bGVfY2hhciA9ICdEJzsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgd2lkdGggPSAxOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBzdHlsZSA9IHBCUy0+R2V0U3RyaW5nKCJTIik7CisgICAgcERhc2hBcnJheSA9IHBCUy0+R2V0QXJyYXkoIkQiKTsKKyAgICBzdHlsZV9jaGFyID0gc3R5bGVbMV07CisgICAgd2lkdGggPSBwQlMtPkdldE51bWJlcigiVyIpOworICB9CisgIGlmICh3aWR0aCA8PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIENQREZfQXJyYXkqIHBDb2xvciA9IG1fcEFubm90RGljdC0+R2V0QXJyYXkoIkMiKTsKKyAgRlhfRFdPUkQgYXJnYiA9IDB4ZmYwMDAwMDA7CisgIGlmIChwQ29sb3IpIHsKKyAgICBpbnQgUiA9IChpbnQzMl90KShwQ29sb3ItPkdldE51bWJlcigwKSAqIDI1NSk7CisgICAgaW50IEcgPSAoaW50MzJfdCkocENvbG9yLT5HZXROdW1iZXIoMSkgKiAyNTUpOworICAgIGludCBCID0gKGludDMyX3QpKHBDb2xvci0+R2V0TnVtYmVyKDIpICogMjU1KTsKKyAgICBhcmdiID0gQXJnYkVuY29kZSgweGZmLCBSLCBHLCBCKTsKKyAgfQorICBDUERGX0dyYXBoU3RhdGVEYXRhIGdyYXBoX3N0YXRlOworICBncmFwaF9zdGF0ZS5tX0xpbmVXaWR0aCA9IHdpZHRoOworICBpZiAoc3R5bGVfY2hhciA9PSAnRCcpIHsKKyAgICBpZiAocERhc2hBcnJheSkgeworICAgICAgRlhfRFdPUkQgZGFzaF9jb3VudCA9IHBEYXNoQXJyYXktPkdldENvdW50KCk7CisgICAgICBpZiAoZGFzaF9jb3VudCAlIDIpIHsKKyAgICAgICAgZGFzaF9jb3VudCsrOworICAgICAgfQorICAgICAgZ3JhcGhfc3RhdGUubV9EYXNoQXJyYXkgPSBGWF9BbGxvYyhGWF9GTE9BVCwgZGFzaF9jb3VudCk7CisgICAgICBncmFwaF9zdGF0ZS5tX0Rhc2hDb3VudCA9IGRhc2hfY291bnQ7CisgICAgICBGWF9EV09SRCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IHBEYXNoQXJyYXktPkdldENvdW50KCk7ICsraSkgeworICAgICAgICBncmFwaF9zdGF0ZS5tX0Rhc2hBcnJheVtpXSA9IHBEYXNoQXJyYXktPkdldE51bWJlcihpKTsKKyAgICAgIH0KKyAgICAgIGlmIChpIDwgZGFzaF9jb3VudCkgeworICAgICAgICBncmFwaF9zdGF0ZS5tX0Rhc2hBcnJheVtpXSA9IGdyYXBoX3N0YXRlLm1fRGFzaEFycmF5W2kgLSAxXTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZ3JhcGhfc3RhdGUubV9EYXNoQXJyYXkgPSBGWF9BbGxvYyhGWF9GTE9BVCwgMik7CisgICAgICBncmFwaF9zdGF0ZS5tX0Rhc2hDb3VudCA9IDI7CisgICAgICBncmFwaF9zdGF0ZS5tX0Rhc2hBcnJheVswXSA9IGdyYXBoX3N0YXRlLm1fRGFzaEFycmF5WzFdID0gMyAqIDEuMGY7CisgICAgfQorICB9CisgIENGWF9GbG9hdFJlY3QgcmVjdDsKKyAgR2V0UmVjdChyZWN0KTsKKyAgQ1BERl9QYXRoRGF0YSBwYXRoOworICB3aWR0aCAvPSAyOworICBwYXRoLkFwcGVuZFJlY3QocmVjdC5sZWZ0ICsgd2lkdGgsIHJlY3QuYm90dG9tICsgd2lkdGgsIHJlY3QucmlnaHQgLSB3aWR0aCwKKyAgICAgICAgICAgICAgICAgIHJlY3QudG9wIC0gd2lkdGgpOworICBpbnQgZmlsbF90eXBlID0gMDsKKyAgaWYgKHBPcHRpb25zICYmIChwT3B0aW9ucy0+bV9GbGFncyAmIFJFTkRFUl9OT1BBVEhTTU9PVEgpKSB7CisgICAgZmlsbF90eXBlIHw9IEZYRklMTF9OT1BBVEhTTU9PVEg7CisgIH0KKyAgcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgJmdyYXBoX3N0YXRlLCBhcmdiLCBhcmdiLCBmaWxsX3R5cGUpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfYXAuY3BwIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfYXAuY3BwCmluZGV4IDhhMTk1YTcuLmQwYWRjMDYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2FwLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19hcC5jcHAKQEAgLTEsODEwICsxLDkyMiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmZG9jL2ZwZGZfdnQuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2FwLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9kb2MuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3Z0LmgiCisjaW5jbHVkZSAiZG9jX3V0aWxzLmgiCiAjaW5jbHVkZSAicGRmX3Z0LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmZG9jL2ZwZGZfYXAuaCIKLUZYX0JPT0wgRlBERl9HZW5lcmF0ZUFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkKLXsKLSAgICBpZiAoIXBBbm5vdERpY3QgfHwgcEFubm90RGljdC0+R2V0Q29uc3RTdHJpbmcoIlN1YnR5cGUiKSAhPSBGWF9CU1RSQygiV2lkZ2V0IikpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBmaWVsZF90eXBlID0gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIkZUIiktPkdldFN0cmluZygpOwotICAgIEZYX0RXT1JEIGZsYWdzID0gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIkZmIik/IEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJGZiIpLT5HZXRJbnRlZ2VyKCkgOiAwOwotICAgIGlmIChmaWVsZF90eXBlID09ICJUeCIpIHsKLSAgICAgICAgcmV0dXJuIENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVUZXh0RmllbGRBUChwRG9jLCBwQW5ub3REaWN0KTsKLSAgICB9IGVsc2UgaWYgKGZpZWxkX3R5cGUgPT0gIkNoIikgewotICAgICAgICBpZiAoZmxhZ3MgJiAoMSA8PCAxNykpIHsKLSAgICAgICAgICAgIHJldHVybiBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29tYm9Cb3hBUChwRG9jLCBwQW5ub3REaWN0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlTGlzdEJveEFQKHBEb2MsIHBBbm5vdERpY3QpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChmaWVsZF90eXBlID09ICJCdG4iKSB7Ci0gICAgICAgIGlmICghKGZsYWdzICYgKDEgPDwgMTYpKSkgewotICAgICAgICAgICAgaWYgKCFwQW5ub3REaWN0LT5LZXlFeGlzdCgiQVMiKSkgewotICAgICAgICAgICAgICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBQYXJlbnREaWN0ID0gcEFubm90RGljdC0+R2V0RGljdCgiUGFyZW50IikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBQYXJlbnREaWN0LT5LZXlFeGlzdCgiQVMiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcEFubm90RGljdC0+U2V0QXRTdHJpbmcoIkFTIiwgcFBhcmVudERpY3QtPkdldFN0cmluZygiQVMiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisKK0ZYX0JPT0wgRlBERl9HZW5lcmF0ZUFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkgeworICBpZiAoIXBBbm5vdERpY3QgfHwgcEFubm90RGljdC0+R2V0Q29uc3RTdHJpbmcoIlN1YnR5cGUiKSAhPSAiV2lkZ2V0IikgewogICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBmaWVsZF90eXBlID0gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIkZUIiktPkdldFN0cmluZygpOworICBGWF9EV09SRCBmbGFncyA9IEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJGZiIpCisgICAgICAgICAgICAgICAgICAgICAgID8gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIkZmIiktPkdldEludGVnZXIoKQorICAgICAgICAgICAgICAgICAgICAgICA6IDA7CisgIGlmIChmaWVsZF90eXBlID09ICJUeCIpIHsKKyAgICByZXR1cm4gQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZVRleHRGaWVsZEFQKHBEb2MsIHBBbm5vdERpY3QpOworICB9CisgIGlmIChmaWVsZF90eXBlID09ICJDaCIpIHsKKyAgICByZXR1cm4gKGZsYWdzICYgKDEgPDwgMTcpKQorICAgICAgICAgICAgICAgPyBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29tYm9Cb3hBUChwRG9jLCBwQW5ub3REaWN0KQorICAgICAgICAgICAgICAgOiBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlTGlzdEJveEFQKHBEb2MsIHBBbm5vdERpY3QpOworICB9CisgIGlmIChmaWVsZF90eXBlID09ICJCdG4iKSB7CisgICAgaWYgKCEoZmxhZ3MgJiAoMSA8PCAxNikpKSB7CisgICAgICBpZiAoIXBBbm5vdERpY3QtPktleUV4aXN0KCJBUyIpKSB7CisgICAgICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBQYXJlbnREaWN0ID0gcEFubm90RGljdC0+R2V0RGljdCgiUGFyZW50IikpIHsKKyAgICAgICAgICBpZiAocFBhcmVudERpY3QtPktleUV4aXN0KCJBUyIpKSB7CisgICAgICAgICAgICBwQW5ub3REaWN0LT5TZXRBdFN0cmluZygiQVMiLCBwUGFyZW50RGljdC0+R2V0U3RyaW5nKCJBUyIpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQotY2xhc3MgQ1BWVF9Gb250TWFwIDogcHVibGljIElQVlRfRm9udE1hcAotewotcHVibGljOgotICAgIENQVlRfRm9udE1hcChDUERGX0RvY3VtZW50ICogcERvYywgQ1BERl9EaWN0aW9uYXJ5ICogcFJlc0RpY3QsIENQREZfRm9udCAqIHBEZWZGb250LAotICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyAmIHNEZWZGb250QWxpYXMpOwotICAgIHZpcnR1YWwgfkNQVlRfRm9udE1hcCgpOwotICAgIENQREZfRm9udCoJCQkJCQlHZXRQREZGb250KEZYX0lOVDMyIG5Gb250SW5kZXgpOwotICAgIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRQREZGb250QWxpYXMoRlhfSU5UMzIgbkZvbnRJbmRleCk7Ci0gICAgc3RhdGljIHZvaWQJCQkJCQlHZXRBbm5vdFN5c1BERkZvbnQoQ1BERl9Eb2N1bWVudCAqIHBEb2MsIENQREZfRGljdGlvbmFyeSAqIHBSZXNEaWN0LAotICAgICAgICAgICAgQ1BERl9Gb250ICogJiBwU3lzRm9udCwgQ0ZYX0J5dGVTdHJpbmcgJiBzU3lzRm9udEFsaWFzKTsKLXByaXZhdGU6Ci0gICAgQ1BERl9Eb2N1bWVudCoJCQkJCW1fcERvY3VtZW50OwotICAgIENQREZfRGljdGlvbmFyeSoJCQkJbV9wUmVzRGljdDsKLSAgICBDUERGX0ZvbnQqCQkJCQkJbV9wRGVmRm9udDsKLSAgICBDRlhfQnl0ZVN0cmluZwkJCQkJbV9zRGVmRm9udEFsaWFzOwotICAgIENQREZfRm9udCoJCQkJCQltX3BTeXNGb250OwotICAgIENGWF9CeXRlU3RyaW5nCQkJCQltX3NTeXNGb250QWxpYXM7CisKK2NsYXNzIENQVlRfRm9udE1hcCA6IHB1YmxpYyBJUFZUX0ZvbnRNYXAgeworIHB1YmxpYzoKKyAgQ1BWVF9Gb250TWFwKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBSZXNEaWN0LAorICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRGVmRm9udCwKKyAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRGVmRm9udEFsaWFzKTsKKyAgfkNQVlRfRm9udE1hcCgpIG92ZXJyaWRlOworCisgIC8vIElQVlRfRm9udE1hcAorICBDUERGX0ZvbnQqIEdldFBERkZvbnQoaW50MzJfdCBuRm9udEluZGV4KSBvdmVycmlkZTsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0UERGRm9udEFsaWFzKGludDMyX3QgbkZvbnRJbmRleCkgb3ZlcnJpZGU7CisKKyAgc3RhdGljIHZvaWQgR2V0QW5ub3RTeXNQREZGb250KENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBSZXNEaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiYgcFN5c0ZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc1N5c0ZvbnRBbGlhcyk7CisKKyBwcml2YXRlOgorICBDUERGX0RvY3VtZW50KiBtX3BEb2N1bWVudDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BSZXNEaWN0OworICBDUERGX0ZvbnQqIG1fcERlZkZvbnQ7CisgIENGWF9CeXRlU3RyaW5nIG1fc0RlZkZvbnRBbGlhczsKKyAgQ1BERl9Gb250KiBtX3BTeXNGb250OworICBDRlhfQnl0ZVN0cmluZyBtX3NTeXNGb250QWxpYXM7CiB9OwotQ1BWVF9Gb250TWFwOjpDUFZUX0ZvbnRNYXAoQ1BERl9Eb2N1bWVudCAqIHBEb2MsIENQREZfRGljdGlvbmFyeSAqIHBSZXNEaWN0LCBDUERGX0ZvbnQgKiBwRGVmRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nICYgc0RlZkZvbnRBbGlhcykgOgotICAgIG1fcERvY3VtZW50KHBEb2MpLAotICAgIG1fcFJlc0RpY3QocFJlc0RpY3QpLAotICAgIG1fcERlZkZvbnQocERlZkZvbnQpLAotICAgIG1fc0RlZkZvbnRBbGlhcyhzRGVmRm9udEFsaWFzKSwKLSAgICBtX3BTeXNGb250KE5VTEwpLAotICAgIG1fc1N5c0ZvbnRBbGlhcygpCi17Ci19Ci1DUFZUX0ZvbnRNYXA6On5DUFZUX0ZvbnRNYXAoKQotewotfQotZXh0ZXJuIENQREZfRm9udCoJCUFkZE5hdGl2ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiYgcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwotdm9pZCBDUFZUX0ZvbnRNYXA6OkdldEFubm90U3lzUERGRm9udChDUERGX0RvY3VtZW50ICogcERvYywgQ1BERl9EaWN0aW9uYXJ5ICogcFJlc0RpY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCAqICYgcFN5c0ZvbnQsIENGWF9CeXRlU3RyaW5nICYgc1N5c0ZvbnRBbGlhcykKLXsKLSAgICBpZiAocERvYyAmJiBwUmVzRGljdCkgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBzRm9udEFsaWFzOwotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCA9IHBEb2MtPkdldFJvb3QoKS0+R2V0RGljdCgiQWNyb0Zvcm0iKTsKLSAgICAgICAgaWYgKENQREZfRm9udCAqIHBQREZGb250ID0gQWRkTmF0aXZlSW50ZXJGb3JtRm9udChwRm9ybURpY3QsIHBEb2MsIHNTeXNGb250QWxpYXMpKSB7Ci0gICAgICAgICAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5ICogcEZvbnRMaXN0ID0gcFJlc0RpY3QtPkdldERpY3QoIkZvbnQiKSkgewotICAgICAgICAgICAgICAgIGlmICghcEZvbnRMaXN0LT5LZXlFeGlzdChzU3lzRm9udEFsaWFzKSkgewotICAgICAgICAgICAgICAgICAgICBwRm9udExpc3QtPlNldEF0UmVmZXJlbmNlKHNTeXNGb250QWxpYXMsIHBEb2MsIHBQREZGb250LT5HZXRGb250RGljdCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwU3lzRm9udCA9IHBQREZGb250OworCitDUFZUX0ZvbnRNYXA6OkNQVlRfRm9udE1hcChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcERlZkZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0RlZkZvbnRBbGlhcykKKyAgICA6IG1fcERvY3VtZW50KHBEb2MpLAorICAgICAgbV9wUmVzRGljdChwUmVzRGljdCksCisgICAgICBtX3BEZWZGb250KHBEZWZGb250KSwKKyAgICAgIG1fc0RlZkZvbnRBbGlhcyhzRGVmRm9udEFsaWFzKSwKKyAgICAgIG1fcFN5c0ZvbnQoTlVMTCksCisgICAgICBtX3NTeXNGb250QWxpYXMoKSB7fQorQ1BWVF9Gb250TWFwOjp+Q1BWVF9Gb250TWFwKCkge30KK3ZvaWQgQ1BWVF9Gb250TWFwOjpHZXRBbm5vdFN5c1BERkZvbnQoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiYgcFN5c0ZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzU3lzRm9udEFsaWFzKSB7CisgIGlmIChwRG9jICYmIHBSZXNEaWN0KSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnRBbGlhczsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCA9IHBEb2MtPkdldFJvb3QoKS0+R2V0RGljdCgiQWNyb0Zvcm0iKTsKKyAgICBpZiAoQ1BERl9Gb250KiBwUERGRm9udCA9CisgICAgICAgICAgICBBZGROYXRpdmVJbnRlckZvcm1Gb250KHBGb3JtRGljdCwgcERvYywgc1N5c0ZvbnRBbGlhcykpIHsKKyAgICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBGb250TGlzdCA9IHBSZXNEaWN0LT5HZXREaWN0KCJGb250IikpIHsKKyAgICAgICAgaWYgKCFwRm9udExpc3QtPktleUV4aXN0KHNTeXNGb250QWxpYXMpKSB7CisgICAgICAgICAgcEZvbnRMaXN0LT5TZXRBdFJlZmVyZW5jZShzU3lzRm9udEFsaWFzLCBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBERkZvbnQtPkdldEZvbnREaWN0KCkpOwogICAgICAgICB9CisgICAgICB9CisgICAgICBwU3lzRm9udCA9IHBQREZGb250OwogICAgIH0KKyAgfQogfQotQ1BERl9Gb250KiBDUFZUX0ZvbnRNYXA6OkdldFBERkZvbnQoRlhfSU5UMzIgbkZvbnRJbmRleCkKLXsKLSAgICBzd2l0Y2ggKG5Gb250SW5kZXgpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgcmV0dXJuIG1fcERlZkZvbnQ7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGlmICghbV9wU3lzRm9udCkgewotICAgICAgICAgICAgICAgIEdldEFubm90U3lzUERGRm9udChtX3BEb2N1bWVudCwgbV9wUmVzRGljdCwgbV9wU3lzRm9udCwgbV9zU3lzRm9udEFsaWFzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtX3BTeXNGb250OwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKK0NQREZfRm9udCogQ1BWVF9Gb250TWFwOjpHZXRQREZGb250KGludDMyX3QgbkZvbnRJbmRleCkgeworICBzd2l0Y2ggKG5Gb250SW5kZXgpIHsKKyAgICBjYXNlIDA6CisgICAgICByZXR1cm4gbV9wRGVmRm9udDsKKyAgICBjYXNlIDE6CisgICAgICBpZiAoIW1fcFN5c0ZvbnQpIHsKKyAgICAgICAgR2V0QW5ub3RTeXNQREZGb250KG1fcERvY3VtZW50LCBtX3BSZXNEaWN0LCBtX3BTeXNGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zU3lzRm9udEFsaWFzKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBtX3BTeXNGb250OworICB9CisgIHJldHVybiBOVUxMOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1BWVF9Gb250TWFwOjpHZXRQREZGb250QWxpYXMoRlhfSU5UMzIgbkZvbnRJbmRleCkKLXsKLSAgICBzd2l0Y2ggKG5Gb250SW5kZXgpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgcmV0dXJuIG1fc0RlZkZvbnRBbGlhczsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgaWYgKCFtX3BTeXNGb250KSB7Ci0gICAgICAgICAgICAgICAgR2V0QW5ub3RTeXNQREZGb250KG1fcERvY3VtZW50LCBtX3BSZXNEaWN0LCBtX3BTeXNGb250LCBtX3NTeXNGb250QWxpYXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1fc1N5c0ZvbnRBbGlhczsKLSAgICB9Ci0gICAgcmV0dXJuICIiOworQ0ZYX0J5dGVTdHJpbmcgQ1BWVF9Gb250TWFwOjpHZXRQREZGb250QWxpYXMoaW50MzJfdCBuRm9udEluZGV4KSB7CisgIHN3aXRjaCAobkZvbnRJbmRleCkgeworICAgIGNhc2UgMDoKKyAgICAgIHJldHVybiBtX3NEZWZGb250QWxpYXM7CisgICAgY2FzZSAxOgorICAgICAgaWYgKCFtX3BTeXNGb250KSB7CisgICAgICAgIEdldEFubm90U3lzUERGRm9udChtX3BEb2N1bWVudCwgbV9wUmVzRGljdCwgbV9wU3lzRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc1N5c0ZvbnRBbGlhcyk7CisgICAgICB9CisgICAgICByZXR1cm4gbV9zU3lzRm9udEFsaWFzOworICB9CisgIHJldHVybiAiIjsKIH0KLUNQVlRfUHJvdmlkZXI6OkNQVlRfUHJvdmlkZXIoSVBWVF9Gb250TWFwICogcEZvbnRNYXApIDogbV9wRm9udE1hcChwRm9udE1hcCkKLXsKLSAgICBBU1NFUlQgKG1fcEZvbnRNYXAgIT0gTlVMTCk7CitDUFZUX1Byb3ZpZGVyOjpDUFZUX1Byb3ZpZGVyKElQVlRfRm9udE1hcCogcEZvbnRNYXApIDogbV9wRm9udE1hcChwRm9udE1hcCkgeworICBBU1NFUlQobV9wRm9udE1hcCk7CiB9Ci1DUFZUX1Byb3ZpZGVyOjp+Q1BWVF9Qcm92aWRlcigpCi17CitDUFZUX1Byb3ZpZGVyOjp+Q1BWVF9Qcm92aWRlcigpIHt9CitpbnQzMl90IENQVlRfUHJvdmlkZXI6OkdldENoYXJXaWR0aChpbnQzMl90IG5Gb250SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Xb3JkU3R5bGUpIHsKKyAgaWYgKENQREZfRm9udCogcFBERkZvbnQgPSBtX3BGb250TWFwLT5HZXRQREZGb250KG5Gb250SW5kZXgpKSB7CisgICAgRlhfRFdPUkQgY2hhcmNvZGUgPSBwUERGRm9udC0+Q2hhckNvZGVGcm9tVW5pY29kZSh3b3JkKTsKKyAgICBpZiAoY2hhcmNvZGUgIT0gQ1BERl9Gb250OjprSW52YWxpZENoYXJDb2RlKSB7CisgICAgICByZXR1cm4gcFBERkZvbnQtPkdldENoYXJXaWR0aEYoY2hhcmNvZGUpOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKIH0KLUZYX0lOVDMyIENQVlRfUHJvdmlkZXI6OkdldENoYXJXaWR0aChGWF9JTlQzMiBuRm9udEluZGV4LCBGWF9XT1JEIHdvcmQsIEZYX0lOVDMyIG5Xb3JkU3R5bGUpCi17Ci0gICAgaWYgKENQREZfRm9udCogcFBERkZvbnQgPSBtX3BGb250TWFwLT5HZXRQREZGb250KG5Gb250SW5kZXgpKSB7Ci0gICAgICAgIEZYX0RXT1JEIGNoYXJjb2RlID0gcFBERkZvbnQtPkNoYXJDb2RlRnJvbVVuaWNvZGUod29yZCk7Ci0gICAgICAgIGlmIChjaGFyY29kZSAhPSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIHBQREZGb250LT5HZXRDaGFyV2lkdGhGKGNoYXJjb2RlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKK2ludDMyX3QgQ1BWVF9Qcm92aWRlcjo6R2V0VHlwZUFzY2VudChpbnQzMl90IG5Gb250SW5kZXgpIHsKKyAgaWYgKENQREZfRm9udCogcFBERkZvbnQgPSBtX3BGb250TWFwLT5HZXRQREZGb250KG5Gb250SW5kZXgpKSB7CisgICAgcmV0dXJuIHBQREZGb250LT5HZXRUeXBlQXNjZW50KCk7CisgIH0KKyAgcmV0dXJuIDA7CiB9Ci1GWF9JTlQzMiBDUFZUX1Byb3ZpZGVyOjpHZXRUeXBlQXNjZW50KEZYX0lOVDMyIG5Gb250SW5kZXgpCi17Ci0gICAgaWYgKENQREZfRm9udCogcFBERkZvbnQgPSBtX3BGb250TWFwLT5HZXRQREZGb250KG5Gb250SW5kZXgpKSB7Ci0gICAgICAgIHJldHVybiBwUERGRm9udC0+R2V0VHlwZUFzY2VudCgpOwotICAgIH0KLSAgICByZXR1cm4gMDsKK2ludDMyX3QgQ1BWVF9Qcm92aWRlcjo6R2V0VHlwZURlc2NlbnQoaW50MzJfdCBuRm9udEluZGV4KSB7CisgIGlmIChDUERGX0ZvbnQqIHBQREZGb250ID0gbV9wRm9udE1hcC0+R2V0UERGRm9udChuRm9udEluZGV4KSkgeworICAgIHJldHVybiBwUERGRm9udC0+R2V0VHlwZURlc2NlbnQoKTsKKyAgfQorICByZXR1cm4gMDsKIH0KLUZYX0lOVDMyIENQVlRfUHJvdmlkZXI6OkdldFR5cGVEZXNjZW50KEZYX0lOVDMyIG5Gb250SW5kZXgpCi17Ci0gICAgaWYgKENQREZfRm9udCogcFBERkZvbnQgPSBtX3BGb250TWFwLT5HZXRQREZGb250KG5Gb250SW5kZXgpKSB7Ci0gICAgICAgIHJldHVybiBwUERGRm9udC0+R2V0VHlwZURlc2NlbnQoKTsKK2ludDMyX3QgQ1BWVF9Qcm92aWRlcjo6R2V0V29yZEZvbnRJbmRleChGWF9XT1JEIHdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZvbnRJbmRleCkgeworICBpZiAoQ1BERl9Gb250KiBwRGVmRm9udCA9IG1fcEZvbnRNYXAtPkdldFBERkZvbnQoMCkpIHsKKyAgICBpZiAocERlZkZvbnQtPkNoYXJDb2RlRnJvbVVuaWNvZGUod29yZCkgIT0gQ1BERl9Gb250OjprSW52YWxpZENoYXJDb2RlKSB7CisgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKENQREZfRm9udCogcFN5c0ZvbnQgPSBtX3BGb250TWFwLT5HZXRQREZGb250KDEpKSB7CisgICAgaWYgKHBTeXNGb250LT5DaGFyQ29kZUZyb21Vbmljb2RlKHdvcmQpICE9IENQREZfRm9udDo6a0ludmFsaWRDaGFyQ29kZSkgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIHJldHVybiAtMTsKIH0KLUZYX0lOVDMyIENQVlRfUHJvdmlkZXI6OkdldFdvcmRGb250SW5kZXgoRlhfV09SRCB3b3JkLCBGWF9JTlQzMiBjaGFyc2V0LCBGWF9JTlQzMiBuRm9udEluZGV4KQotewotICAgIGlmIChDUERGX0ZvbnQqIHBEZWZGb250ID0gbV9wRm9udE1hcC0+R2V0UERGRm9udCgwKSkgewotICAgICAgICBpZiAocERlZkZvbnQtPkNoYXJDb2RlRnJvbVVuaWNvZGUod29yZCkgIT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChDUERGX0ZvbnQqIHBTeXNGb250ID0gbV9wRm9udE1hcC0+R2V0UERGRm9udCgxKSkKLSAgICAgICAgaWYgKHBTeXNGb250LT5DaGFyQ29kZUZyb21Vbmljb2RlKHdvcmQpICE9IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIHJldHVybiAtMTsKLX0KLUZYX0JPT0wgQ1BWVF9Qcm92aWRlcjo6SXNMYXRpbldvcmQoRlhfV09SRCB3b3JkKQotewotICAgIGlmICgod29yZCA+PSAweDYxICYmIHdvcmQgPD0gMHg3QSkgfHwgKHdvcmQgPj0gMHg0MSAmJiB3b3JkIDw9IDB4NUEpIHx8IHdvcmQgPT0gMHgyRCB8fCB3b3JkID09IDB4MjcpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0lOVDMyIENQVlRfUHJvdmlkZXI6OkdldERlZmF1bHRGb250SW5kZXgoKQotewotICAgIHJldHVybiAwOwotfQotc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldFBERldvcmRTdHJpbmcoSVBWVF9Gb250TWFwICogcEZvbnRNYXAsIEZYX0lOVDMyIG5Gb250SW5kZXgsIEZYX1dPUkQgV29yZCwgRlhfV09SRCBTdWJXb3JkKQotewotICAgIENGWF9CeXRlU3RyaW5nIHNXb3JkOwotICAgIGlmIChTdWJXb3JkID4gMCkgewotICAgICAgICBzV29yZC5Gb3JtYXQoIiVjIiwgU3ViV29yZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHBGb250TWFwKSB7Ci0gICAgICAgICAgICBpZiAoQ1BERl9Gb250ICogcFBERkZvbnQgPSBwRm9udE1hcC0+R2V0UERGRm9udChuRm9udEluZGV4KSkgewotICAgICAgICAgICAgICAgIGlmIChwUERGRm9udC0+R2V0QmFzZUZvbnQoKS5Db21wYXJlKCJTeW1ib2wiKSA9PSAwIHx8IHBQREZGb250LT5HZXRCYXNlRm9udCgpLkNvbXBhcmUoIlphcGZEaW5nYmF0cyIpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc1dvcmQuRm9ybWF0KCIlYyIsIFdvcmQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Q2hhckNvZGUgPSBwUERGRm9udC0+Q2hhckNvZGVGcm9tVW5pY29kZShXb3JkKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGR3Q2hhckNvZGUgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQREZGb250LT5BcHBlbmRDaGFyKHNXb3JkLCBkd0NoYXJDb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc1dvcmQ7Ci19Ci1zdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0V29yZFJlbmRlclN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyAmIHN0cldvcmRzKQotewotICAgIGlmIChzdHJXb3Jkcy5HZXRMZW5ndGgoKSA+IDApIHsKLSAgICAgICAgcmV0dXJuIFBERl9FbmNvZGVTdHJpbmcoc3RyV29yZHMpICsgIiBUalxuIjsKLSAgICB9Ci0gICAgcmV0dXJuICIiOwotfQotc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldEZvbnRTZXRTdHJpbmcoSVBWVF9Gb250TWFwICogcEZvbnRNYXAsIEZYX0lOVDMyIG5Gb250SW5kZXgsIEZYX0ZMT0FUIGZGb250U2l6ZSkKLXsKLSAgICBDRlhfQnl0ZVRleHRCdWYgc1JldDsKLSAgICBpZiAocEZvbnRNYXApIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnRBbGlhcyA9IHBGb250TWFwLT5HZXRQREZGb250QWxpYXMobkZvbnRJbmRleCk7Ci0gICAgICAgIGlmIChzRm9udEFsaWFzLkdldExlbmd0aCgpID4gMCAmJiBmRm9udFNpemUgPiAwICkgewotICAgICAgICAgICAgc1JldCA8PCAiLyIgPDwgc0ZvbnRBbGlhcyA8PCAiICIgPDwgZkZvbnRTaXplIDw8ICIgVGZcbiI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNSZXQuR2V0Qnl0ZVN0cmluZygpOwotfQotc3RhdGljIENQVlRfQ29sb3IgUGFyc2VDb2xvcihjb25zdCBDRlhfQnl0ZVN0cmluZyAmIHN0cikKLXsKLSAgICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgoc3RyKTsKLSAgICBzeW50YXguU2V0UG9zKDApOwotICAgIGlmIChzeW50YXguRmluZFRhZ1BhcmFtKCJnIiwgMSkpIHsKLSAgICAgICAgcmV0dXJuIENQVlRfQ29sb3IoQ1RfR1JBWSwgRlhfYXRvZihzeW50YXguR2V0V29yZCgpKSk7Ci0gICAgfQotICAgIHN5bnRheC5TZXRQb3MoMCk7Ci0gICAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oInJnIiwgMykpIHsKLSAgICAgICAgRlhfRkxPQVQgZjEgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOwotICAgICAgICBGWF9GTE9BVCBmMiA9IEZYX2F0b2Yoc3ludGF4LkdldFdvcmQoKSk7Ci0gICAgICAgIEZYX0ZMT0FUIGYzID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKTsKLSAgICAgICAgcmV0dXJuIENQVlRfQ29sb3IoQ1RfUkdCLCBmMSwgZjIsIGYzKTsKLSAgICB9Ci0gICAgc3ludGF4LlNldFBvcygwKTsKLSAgICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbSgiayIsIDQpKSB7Ci0gICAgICAgIEZYX0ZMT0FUIGYxID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKTsKLSAgICAgICAgRlhfRkxPQVQgZjIgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOwotICAgICAgICBGWF9GTE9BVCBmMyA9IEZYX2F0b2Yoc3ludGF4LkdldFdvcmQoKSk7Ci0gICAgICAgIEZYX0ZMT0FUIGY0ID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKTsKLSAgICAgICAgcmV0dXJuIENQVlRfQ29sb3IoQ1RfQ01ZSywgZjEsIGYyLCBmMywgZjQpOwotICAgIH0KLSAgICByZXR1cm4gQ1BWVF9Db2xvcihDVF9UUkFOU1BBUkVOVCk7Ci19Ci1zdGF0aWMgQ1BWVF9Db2xvciBQYXJzZUNvbG9yKGNvbnN0IENQREZfQXJyYXkgJiBhcnJheSkKLXsKLSAgICBDUFZUX0NvbG9yIHJ0OwotICAgIHN3aXRjaCAoYXJyYXkuR2V0Q291bnQoKSkgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBydCA9IENQVlRfQ29sb3IoQ1RfR1JBWSwgYXJyYXkuR2V0RmxvYXQoMCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIHJ0ID0gQ1BWVF9Db2xvcihDVF9SR0IsIGFycmF5LkdldEZsb2F0KDApLCBhcnJheS5HZXRGbG9hdCgxKSwgYXJyYXkuR2V0RmxvYXQoMikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIHJ0ID0gQ1BWVF9Db2xvcihDVF9DTVlLLCBhcnJheS5HZXRGbG9hdCgwKSwgYXJyYXkuR2V0RmxvYXQoMSksIGFycmF5LkdldEZsb2F0KDIpLCBhcnJheS5HZXRGbG9hdCgzKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIHJ0OwotfQotc3RhdGljIEZYX0JPT0wgR2VuZXJhdGVXaWRnZXRBUChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QsIGNvbnN0IEZYX0lOVDMyICYgbldpZGdldFR5cGUpCi17Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QgPSBOVUxMOwotICAgIGlmIChDUERGX0RpY3Rpb25hcnkgKiBwUm9vdERpY3QgPSBwRG9jLT5HZXRSb290KCkpIHsKLSAgICAgICAgcEZvcm1EaWN0ID0gcFJvb3REaWN0LT5HZXREaWN0KCJBY3JvRm9ybSIpOwotICAgIH0KLSAgICBpZiAoIXBGb3JtRGljdCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIERBOwotICAgIGlmIChDUERGX09iamVjdCogcERBT2JqID0gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIkRBIikpIHsKLSAgICAgICAgREEgPSBwREFPYmotPkdldFN0cmluZygpOwotICAgIH0KLSAgICBpZiAoREEuSXNFbXB0eSgpKSB7Ci0gICAgICAgIERBID0gcEZvcm1EaWN0LT5HZXRTdHJpbmcoIkRBIik7Ci0gICAgfQotICAgIGlmIChEQS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgoREEpOwotICAgIHN5bnRheC5GaW5kVGFnUGFyYW0oIlRmIiwgMik7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnROYW1lID0gc3ludGF4LkdldFdvcmQoKTsKLSAgICBzRm9udE5hbWUgPSBQREZfTmFtZURlY29kZShzRm9udE5hbWUpOwotICAgIGlmIChzRm9udE5hbWUuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfRkxPQVQgZkZvbnRTaXplID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKTsKLSAgICBDUFZUX0NvbG9yIGNyVGV4dCA9IFBhcnNlQ29sb3IoREEpOwotICAgIEZYX0JPT0wgYlVzZUZvcm1SZXMgPSBGQUxTRTsKLSAgICBDUERGX0RpY3Rpb25hcnkgKiBwRm9udERpY3QgPSBOVUxMOwotICAgIENQREZfRGljdGlvbmFyeSogcERSRGljdCA9IHBBbm5vdERpY3QtPkdldERpY3QoRlhfQlNUUkMoIkRSIikpOwotICAgIGlmIChwRFJEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcERSRGljdCA9IHBGb3JtRGljdC0+R2V0RGljdChGWF9CU1RSQygiRFIiKSk7Ci0gICAgICAgIGJVc2VGb3JtUmVzID0gVFJVRTsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5ICogcERSRm9udERpY3QgPSBOVUxMOwotICAgIGlmIChwRFJEaWN0ICYmIChwRFJGb250RGljdCA9IHBEUkRpY3QtPkdldERpY3QoIkZvbnQiKSkpIHsKLSAgICAgICAgcEZvbnREaWN0ID0gcERSRm9udERpY3QtPkdldERpY3Qoc0ZvbnROYW1lLk1pZCgxKSk7Ci0gICAgICAgIGlmICghcEZvbnREaWN0ICYmICFiVXNlRm9ybVJlcykgewotICAgICAgICAgICAgcERSRGljdCA9IHBGb3JtRGljdC0+R2V0RGljdChGWF9CU1RSQygiRFIiKSk7Ci0gICAgICAgICAgICBwRFJGb250RGljdCA9IHBEUkRpY3QtPkdldERpY3QoIkZvbnQiKTsKLSAgICAgICAgICAgIGlmIChwRFJGb250RGljdCkgewotICAgICAgICAgICAgICAgIHBGb250RGljdCA9IHBEUkZvbnREaWN0LT5HZXREaWN0KHNGb250TmFtZS5NaWQoMSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghcERSRm9udERpY3QpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoIXBGb250RGljdCkgewotICAgICAgICBwRm9udERpY3QgPSBDUERGX0RpY3Rpb25hcnk6OkNyZWF0ZSgpOwotICAgICAgICBpZiAocEZvbnREaWN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBwRm9udERpY3QtPlNldEF0TmFtZShGWF9CU1RSQygiVHlwZSIpLCAiRm9udCIpOwotICAgICAgICBwRm9udERpY3QtPlNldEF0TmFtZShGWF9CU1RSQygiU3VidHlwZSIpLCAiVHlwZTEiKTsKLSAgICAgICAgcEZvbnREaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIkJhc2VGb250IiksICJIZWx2ZXRpY2EiKTsKLSAgICAgICAgcEZvbnREaWN0LT5TZXRBdE5hbWUoRlhfQlNUUkMoIkVuY29kaW5nIiksICJXaW5BbnNpRW5jb2RpbmciKTsKLSAgICAgICAgcERvYy0+QWRkSW5kaXJlY3RPYmplY3QocEZvbnREaWN0KTsKLSAgICAgICAgcERSRm9udERpY3QtPlNldEF0UmVmZXJlbmNlKHNGb250TmFtZS5NaWQoMSksIHBEb2MsIHBGb250RGljdCk7Ci0gICAgfQotICAgIENQREZfRm9udCogcERlZkZvbnQgPSBwRG9jLT5Mb2FkRm9udChwRm9udERpY3QpOwotICAgIGlmICghcERlZkZvbnQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDUERGX1JlY3QgcmNBbm5vdCA9IHBBbm5vdERpY3QtPkdldFJlY3QoIlJlY3QiKTsKLSAgICBGWF9JTlQzMiBuUm90YXRlID0gMDsKLSAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5ICogcE1LRGljdCA9IHBBbm5vdERpY3QtPkdldERpY3QoIk1LIikpIHsKLSAgICAgICAgblJvdGF0ZSA9IHBNS0RpY3QtPkdldEludGVnZXIoIlIiKTsKLSAgICB9Ci0gICAgQ1BERl9SZWN0IHJjQkJveDsKLSAgICBDUERGX01hdHJpeCBtYXRyaXg7Ci0gICAgc3dpdGNoIChuUm90YXRlICUgMzYwKSB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHJjQkJveCA9IENQREZfUmVjdCgwLCAwLCByY0Fubm90LnJpZ2h0IC0gcmNBbm5vdC5sZWZ0LCByY0Fubm90LnRvcCAtIHJjQW5ub3QuYm90dG9tKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDkwOgotICAgICAgICAgICAgbWF0cml4ID0gQ1BERl9NYXRyaXgoMCwgMSwgLTEsIDAsIHJjQW5ub3QucmlnaHQgLSByY0Fubm90LmxlZnQsIDApOwotICAgICAgICAgICAgcmNCQm94ID0gQ1BERl9SZWN0KDAsIDAsIHJjQW5ub3QudG9wIC0gcmNBbm5vdC5ib3R0b20sIHJjQW5ub3QucmlnaHQgLSByY0Fubm90LmxlZnQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTgwOgotICAgICAgICAgICAgbWF0cml4ID0gQ1BERl9NYXRyaXgoLTEsIDAsIDAsIC0xLCByY0Fubm90LnJpZ2h0IC0gcmNBbm5vdC5sZWZ0LCByY0Fubm90LnRvcCAtIHJjQW5ub3QuYm90dG9tKTsKLSAgICAgICAgICAgIHJjQkJveCA9IENQREZfUmVjdCgwLCAwLCByY0Fubm90LnJpZ2h0IC0gcmNBbm5vdC5sZWZ0LCByY0Fubm90LnRvcCAtIHJjQW5ub3QuYm90dG9tKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI3MDoKLSAgICAgICAgICAgIG1hdHJpeCA9IENQREZfTWF0cml4KDAsIC0xLCAxLCAwLCAwLCByY0Fubm90LnRvcCAtIHJjQW5ub3QuYm90dG9tKTsKLSAgICAgICAgICAgIHJjQkJveCA9IENQREZfUmVjdCgwLCAwLCByY0Fubm90LnRvcCAtIHJjQW5ub3QuYm90dG9tLCByY0Fubm90LnJpZ2h0IC0gcmNBbm5vdC5sZWZ0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBGWF9JTlQzMiBuQm9yZGVyU3R5bGUgPSBQQlNfU09MSUQ7Ci0gICAgRlhfRkxPQVQgZkJvcmRlcldpZHRoID0gMTsKLSAgICBDUFZUX0Rhc2ggZHNCb3JkZXIoMywgMCwgMCk7Ci0gICAgQ1BWVF9Db2xvciBjckxlZnRUb3AsIGNyUmlnaHRCb3R0b207Ci0gICAgaWYgKENQREZfRGljdGlvbmFyeSAqIHBCU0RpY3QgPSBwQW5ub3REaWN0LT5HZXREaWN0KCJCUyIpKSB7Ci0gICAgICAgIGlmIChwQlNEaWN0LT5LZXlFeGlzdCgiVyIpKSB7Ci0gICAgICAgICAgICBmQm9yZGVyV2lkdGggPSBwQlNEaWN0LT5HZXROdW1iZXIoIlciKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQ1BERl9BcnJheSAqIHBBcnJheSA9IHBCU0RpY3QtPkdldEFycmF5KCJEIikpIHsKLSAgICAgICAgICAgIGRzQm9yZGVyID0gQ1BWVF9EYXNoKHBBcnJheS0+R2V0SW50ZWdlcigwKSwgcEFycmF5LT5HZXRJbnRlZ2VyKDEpLCBwQXJyYXktPkdldEludGVnZXIoMikpOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAocEJTRGljdC0+R2V0U3RyaW5nKCJTIikuR2V0QXQoMCkpIHsKLSAgICAgICAgICAgIGNhc2UgJ1MnOgotICAgICAgICAgICAgICAgIG5Cb3JkZXJTdHlsZSA9IFBCU19TT0xJRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ0QnOgotICAgICAgICAgICAgICAgIG5Cb3JkZXJTdHlsZSA9IFBCU19EQVNIOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnQic6Ci0gICAgICAgICAgICAgICAgbkJvcmRlclN0eWxlID0gUEJTX0JFVkVMRUQ7Ci0gICAgICAgICAgICAgICAgZkJvcmRlcldpZHRoICo9IDI7Ci0gICAgICAgICAgICAgICAgY3JMZWZ0VG9wID0gQ1BWVF9Db2xvcihDVF9HUkFZLCAxKTsKLSAgICAgICAgICAgICAgICBjclJpZ2h0Qm90dG9tID0gQ1BWVF9Db2xvcihDVF9HUkFZLCAwLjUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnSSc6Ci0gICAgICAgICAgICAgICAgbkJvcmRlclN0eWxlID0gUEJTX0lOU0VUOwotICAgICAgICAgICAgICAgIGZCb3JkZXJXaWR0aCAqPSAyOwotICAgICAgICAgICAgICAgIGNyTGVmdFRvcCA9IENQVlRfQ29sb3IoQ1RfR1JBWSwgMC41KTsKLSAgICAgICAgICAgICAgICBjclJpZ2h0Qm90dG9tID0gQ1BWVF9Db2xvcihDVF9HUkFZLCAwLjc1KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ1UnOgotICAgICAgICAgICAgICAgIG5Cb3JkZXJTdHlsZSA9IFBCU19VTkRFUkxJTkVEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIENQVlRfQ29sb3IgY3JCb3JkZXIsIGNyQkc7Ci0gICAgaWYgKENQREZfRGljdGlvbmFyeSAqIHBNS0RpY3QgPSBwQW5ub3REaWN0LT5HZXREaWN0KCJNSyIpKSB7Ci0gICAgICAgIGlmIChDUERGX0FycmF5ICogcEFycmF5ID0gcE1LRGljdC0+R2V0QXJyYXkoIkJDIikpIHsKLSAgICAgICAgICAgIGNyQm9yZGVyID0gUGFyc2VDb2xvcigqcEFycmF5KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQ1BERl9BcnJheSAqIHBBcnJheSA9IHBNS0RpY3QtPkdldEFycmF5KCJCRyIpKSB7Ci0gICAgICAgICAgICBjckJHID0gUGFyc2VDb2xvcigqcEFycmF5KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBDRlhfQnl0ZVRleHRCdWYgc0FwcFN0cmVhbTsKLSAgICBDRlhfQnl0ZVN0cmluZyBzQkcgPSBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUChjckJHLCBUUlVFKTsKLSAgICBpZiAoc0JHLkdldExlbmd0aCgpID4gMCkgewotICAgICAgICBzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IHNCRyA8PCByY0JCb3gubGVmdCA8PCAiICIgPDwgcmNCQm94LmJvdHRvbSA8PCAiICIKLSAgICAgICAgICAgICAgICAgICA8PCByY0JCb3guV2lkdGgoKSA8PCAiICIgPDwgcmNCQm94LkhlaWdodCgpIDw8ICIgcmUgZlxuIiA8PCAiUVxuIjsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc0JvcmRlclN0cmVhbSA9IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVCb3JkZXJBUChyY0JCb3gsIGZCb3JkZXJXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCb3JkZXIsIGNyTGVmdFRvcCwgY3JSaWdodEJvdHRvbSwgbkJvcmRlclN0eWxlLCBkc0JvcmRlcik7Ci0gICAgaWYgKHNCb3JkZXJTdHJlYW0uR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIHNBcHBTdHJlYW0gPDwgInFcbiIgPDwgc0JvcmRlclN0cmVhbSA8PCAiUVxuIjsKLSAgICB9Ci0gICAgQ1BERl9SZWN0IHJjQm9keSA9IENQREZfUmVjdChyY0JCb3gubGVmdCArIGZCb3JkZXJXaWR0aCwgcmNCQm94LmJvdHRvbSArIGZCb3JkZXJXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC5yaWdodCAtIGZCb3JkZXJXaWR0aCwgcmNCQm94LnRvcCAtIGZCb3JkZXJXaWR0aCk7Ci0gICAgcmNCb2R5Lk5vcm1hbGl6ZSgpOwotICAgIENQREZfRGljdGlvbmFyeSogcEFQRGljdCA9IHBBbm5vdERpY3QtPkdldERpY3QoIkFQIik7Ci0gICAgaWYgKHBBUERpY3QgPT0gTlVMTCkgewotICAgICAgICBwQVBEaWN0ID0gQ1BERl9EaWN0aW9uYXJ5OjpDcmVhdGUoKTsKLSAgICAgICAgaWYgKHBBUERpY3QgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIHBBbm5vdERpY3QtPlNldEF0KCJBUCIsIHBBUERpY3QpOwotICAgIH0KLSAgICBDUERGX1N0cmVhbSogcE5vcm1hbFN0cmVhbSA9IHBBUERpY3QtPkdldFN0cmVhbSgiTiIpOwotICAgIGlmIChwTm9ybWFsU3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgcE5vcm1hbFN0cmVhbSA9IENQREZfU3RyZWFtOjpDcmVhdGUoTlVMTCwgMCwgTlVMTCk7Ci0gICAgICAgIGlmIChwTm9ybWFsU3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBGWF9JTlQzMiBvYmpudW0gPSBwRG9jLT5BZGRJbmRpcmVjdE9iamVjdChwTm9ybWFsU3RyZWFtKTsKLSAgICAgICAgcEFubm90RGljdC0+R2V0RGljdCgiQVAiKS0+U2V0QXRSZWZlcmVuY2UoIk4iLCBwRG9jLCBvYmpudW0pOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkgKiBwU3RyZWFtRGljdCA9IHBOb3JtYWxTdHJlYW0tPkdldERpY3QoKTsKLSAgICBpZiAocFN0cmVhbURpY3QpIHsKLSAgICAgICAgcFN0cmVhbURpY3QtPlNldEF0TWF0cml4KCJNYXRyaXgiLCBtYXRyaXgpOwotICAgICAgICBwU3RyZWFtRGljdC0+U2V0QXRSZWN0KCJCQm94IiwgcmNCQm94KTsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwU3RyZWFtUmVzTGlzdCA9IHBTdHJlYW1EaWN0LT5HZXREaWN0KCJSZXNvdXJjZXMiKTsKLSAgICAgICAgaWYgKHBTdHJlYW1SZXNMaXN0KSB7Ci0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1SZXNGb250TGlzdCA9IHBTdHJlYW1SZXNMaXN0LT5HZXREaWN0KCJGb250Iik7Ci0gICAgICAgICAgICBpZiAoIXBTdHJlYW1SZXNGb250TGlzdCkgewotICAgICAgICAgICAgICAgIHBTdHJlYW1SZXNGb250TGlzdCA9IENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBTdHJlYW1SZXNGb250TGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcFN0cmVhbVJlc0xpc3QtPlNldEF0KCJGb250IiwgcFN0cmVhbVJlc0ZvbnRMaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghcFN0cmVhbVJlc0ZvbnRMaXN0LT5LZXlFeGlzdChzRm9udE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcFN0cmVhbVJlc0ZvbnRMaXN0LT5TZXRBdFJlZmVyZW5jZShzRm9udE5hbWUsIHBEb2MsIHBGb250RGljdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwU3RyZWFtRGljdC0+U2V0QXQoIlJlc291cmNlcyIsIHBGb3JtRGljdC0+R2V0RGljdCgiRFIiKS0+Q2xvbmUoKSk7Ci0gICAgICAgICAgICBwU3RyZWFtUmVzTGlzdCA9IHBTdHJlYW1EaWN0LT5HZXREaWN0KCJSZXNvdXJjZXMiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBzd2l0Y2ggKG5XaWRnZXRUeXBlKSB7Ci0gICAgICAgIGNhc2UgMDogewotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHN3VmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiViIpPyBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiViIpLT5HZXRVbmljb2RlVGV4dCgpIDogQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBGWF9JTlQzMiBuQWxpZ24gPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiUSIpPyBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiUSIpLT5HZXRJbnRlZ2VyKCkgOiAwOwotICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiRmYiKT8gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIkZmIiktPkdldEludGVnZXIoKSA6IDA7Ci0gICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdNYXhMZW4gPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiTWF4TGVuIikgPyBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiTWF4TGVuIiktPkdldEludGVnZXIoKSA6IDA7Ci0gICAgICAgICAgICAgICAgQ1BWVF9Gb250TWFwIG1hcChwRG9jLCBwU3RyZWFtRGljdCA/IHBTdHJlYW1EaWN0LT5HZXREaWN0KCJSZXNvdXJjZXMiKSA6IE5VTEwgLCBwRGVmRm9udCwgc0ZvbnROYW1lLlJpZ2h0KHNGb250TmFtZS5HZXRMZW5ndGgoKSAtIDEpKTsKLSAgICAgICAgICAgICAgICBDUFZUX1Byb3ZpZGVyIHByZCgmbWFwKTsKLSAgICAgICAgICAgICAgICBDUERGX1ZhcmlhYmxlVGV4dCB2dDsKLSAgICAgICAgICAgICAgICB2dC5TZXRQcm92aWRlcigmcHJkKTsKLSAgICAgICAgICAgICAgICB2dC5TZXRQbGF0ZVJlY3QocmNCb2R5KTsKLSAgICAgICAgICAgICAgICB2dC5TZXRBbGlnbm1lbnQobkFsaWduKTsKLSAgICAgICAgICAgICAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkgewotICAgICAgICAgICAgICAgICAgICB2dC5TZXRBdXRvRm9udFNpemUoVFJVRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdnQuU2V0Rm9udFNpemUoZkZvbnRTaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhfQk9PTCBiTXVsdGlMaW5lID0gKGR3RmxhZ3MgPj4gMTIpICYgMTsKLSAgICAgICAgICAgICAgICBpZiAoYk11bHRpTGluZSkgewotICAgICAgICAgICAgICAgICAgICB2dC5TZXRNdWx0aUxpbmUoVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIHZ0LlNldEF1dG9SZXR1cm4oVFJVRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZYX1dPUkQgc3ViV29yZCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKChkd0ZsYWdzID4+IDEzKSAmIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgc3ViV29yZCA9ICcqJzsKLSAgICAgICAgICAgICAgICAgICAgdnQuU2V0UGFzc3dvcmRDaGFyKHN1YldvcmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFyQXJyYXkgPSAoZHdGbGFncyA+PiAyNCkgJiAxOwotICAgICAgICAgICAgICAgIGlmIChiQ2hhckFycmF5KSB7Ci0gICAgICAgICAgICAgICAgICAgIHZ0LlNldENoYXJBcnJheShkd01heExlbik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdnQuU2V0TGltaXRDaGFyKGR3TWF4TGVuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdnQuSW5pdGlhbGl6ZSgpOwotICAgICAgICAgICAgICAgIHZ0LlNldFRleHQoc3dWYWx1ZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICB2dC5SZWFycmFuZ2VBbGwoKTsKLSAgICAgICAgICAgICAgICBDUERGX1JlY3QgcmNDb250ZW50ID0gdnQuR2V0Q29udGVudFJlY3QoKTsKLSAgICAgICAgICAgICAgICBDUERGX1BvaW50IHB0T2Zmc2V0KDAuMGYsIDAuMGYpOwotICAgICAgICAgICAgICAgIGlmICghYk11bHRpTGluZSkgewotICAgICAgICAgICAgICAgICAgICBwdE9mZnNldCA9IENQREZfUG9pbnQoMC4wZiwgKHJjQ29udGVudC5IZWlnaHQoKSAtIHJjQm9keS5IZWlnaHQoKSkgLyAyLjBmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0JvZHkgPSBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlRWRpdEFQKCZtYXAsIHZ0LkdldEl0ZXJhdG9yKCksIHB0T2Zmc2V0LCAhYkNoYXJBcnJheSwgc3ViV29yZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNCb2R5LkdldExlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8ICIvVHggQk1DXG4iIDw8ICJxXG4iOwotICAgICAgICAgICAgICAgICAgICBpZiAocmNDb250ZW50LldpZHRoKCkgPiByY0JvZHkuV2lkdGgoKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ29udGVudC5IZWlnaHQoKSA+IHJjQm9keS5IZWlnaHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCByY0JvZHkubGVmdCA8PCAiICIgPDwgcmNCb2R5LmJvdHRvbSA8PCAiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcmNCb2R5LldpZHRoKCkgPDwgIiAiIDw8IHJjQm9keS5IZWlnaHQoKSA8PCAiIHJlXG5XXG5uXG4iOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgIkJUXG4iIDw8IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKGNyVGV4dCwgVFJVRSkgPDwgc0JvZHkgPDwgIkVUXG4iIDw8ICJRXG5FTUNcbiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTogewotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHN3VmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiViIpID8gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIlYiKS0+R2V0VW5pY29kZVRleHQoKSA6IENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgQ1BWVF9Gb250TWFwIG1hcChwRG9jLCBwU3RyZWFtRGljdCA/IHBTdHJlYW1EaWN0LT5HZXREaWN0KCJSZXNvdXJjZXMiKTpOVUxMLCBwRGVmRm9udCwgc0ZvbnROYW1lLlJpZ2h0KHNGb250TmFtZS5HZXRMZW5ndGgoKSAtIDEpKTsKLSAgICAgICAgICAgICAgICBDUFZUX1Byb3ZpZGVyIHByZCgmbWFwKTsKLSAgICAgICAgICAgICAgICBDUERGX1ZhcmlhYmxlVGV4dCB2dDsKLSAgICAgICAgICAgICAgICB2dC5TZXRQcm92aWRlcigmcHJkKTsKLSAgICAgICAgICAgICAgICBDUERGX1JlY3QgcmNCdXR0b24gPSByY0JvZHk7Ci0gICAgICAgICAgICAgICAgcmNCdXR0b24ubGVmdCA9IHJjQnV0dG9uLnJpZ2h0IC0gMTM7Ci0gICAgICAgICAgICAgICAgcmNCdXR0b24uTm9ybWFsaXplKCk7Ci0gICAgICAgICAgICAgICAgQ1BERl9SZWN0IHJjRWRpdCA9IHJjQm9keTsKLSAgICAgICAgICAgICAgICByY0VkaXQucmlnaHQgPSByY0J1dHRvbi5sZWZ0OwotICAgICAgICAgICAgICAgIHJjRWRpdC5Ob3JtYWxpemUoKTsKLSAgICAgICAgICAgICAgICB2dC5TZXRQbGF0ZVJlY3QocmNFZGl0KTsKLSAgICAgICAgICAgICAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkgewotICAgICAgICAgICAgICAgICAgICB2dC5TZXRBdXRvRm9udFNpemUoVFJVRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdnQuU2V0Rm9udFNpemUoZkZvbnRTaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdnQuSW5pdGlhbGl6ZSgpOwotICAgICAgICAgICAgICAgIHZ0LlNldFRleHQoc3dWYWx1ZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICB2dC5SZWFycmFuZ2VBbGwoKTsKLSAgICAgICAgICAgICAgICBDUERGX1JlY3QgcmNDb250ZW50ID0gdnQuR2V0Q29udGVudFJlY3QoKTsKLSAgICAgICAgICAgICAgICBDUERGX1BvaW50IHB0T2Zmc2V0ID0gQ1BERl9Qb2ludCgwLjBmLCAocmNDb250ZW50LkhlaWdodCgpIC0gcmNFZGl0LkhlaWdodCgpKSAvIDIuMGYpOwotICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNFZGl0ID0gQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUVkaXRBUCgmbWFwLCB2dC5HZXRJdGVyYXRvcigpLCBwdE9mZnNldCwgVFJVRSwgMCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNFZGl0LkdldExlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8ICIvVHggQk1DXG4iIDw8ICJxXG4iOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHJjRWRpdC5sZWZ0IDw8ICIgIiA8PCByY0VkaXQuYm90dG9tIDw8ICIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHJjRWRpdC5XaWR0aCgpIDw8ICIgIiA8PCByY0VkaXQuSGVpZ2h0KCkgPDwgIiByZVxuV1xublxuIjsKLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCAiQlRcbiIgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoY3JUZXh0LCBUUlVFKSA8PCBzRWRpdCA8PCAiRVRcbiIgPDwgIlFcbkVNQ1xuIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0J1dHRvbiA9IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKENQVlRfQ29sb3IoQ1RfUkdCLCAyMjAuMGYgLyAyNTUuMGYsIDIyMC4wZiAvIDI1NS4wZiwgMjIwLjBmIC8gMjU1LjBmKSwgVFJVRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNCdXR0b24uR2V0TGVuZ3RoKCkgPiAwICYmICFyY0J1dHRvbi5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBzQnV0dG9uOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHJjQnV0dG9uLmxlZnQgPDwgIiAiIDw8IHJjQnV0dG9uLmJvdHRvbSA8PCAiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCByY0J1dHRvbi5XaWR0aCgpIDw8ICIgIiA8PCByY0J1dHRvbi5IZWlnaHQoKSA8PCAiIHJlIGZcbiI7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgIlFcbiI7Ci0gICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNCdXR0b25Cb3JkZXIgPSBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQm9yZGVyQVAocmNCdXR0b24sIDIsIENQVlRfQ29sb3IoQ1RfR1JBWSwgMCksIENQVlRfQ29sb3IoQ1RfR1JBWSwgMSksIENQVlRfQ29sb3IoQ1RfR1JBWSwgMC41KSwgUEJTX0JFVkVMRUQsIENQVlRfRGFzaCgzLCAwLCAwKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzQnV0dG9uQm9yZGVyLkdldExlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBzQnV0dG9uQm9yZGVyIDw8ICJRXG4iOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIENQREZfUG9pbnQgcHRDZW50ZXIgPSBDUERGX1BvaW50KChyY0J1dHRvbi5sZWZ0ICsgcmNCdXR0b24ucmlnaHQpIC8gMiwgKHJjQnV0dG9uLnRvcCArIHJjQnV0dG9uLmJvdHRvbSkgLyAyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKElzRmxvYXRCaWdnZXIocmNCdXR0b24uV2lkdGgoKSwgNikgJiYgSXNGbG9hdEJpZ2dlcihyY0J1dHRvbi5IZWlnaHQoKSwgNikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgInFcbiIgPDwgIiAwIGdcbiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHB0Q2VudGVyLnggLSAzIDw8ICIgIiA8PCBwdENlbnRlci55ICsgMS41ZiA8PCAiIG1cbiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHB0Q2VudGVyLnggKyAzIDw8ICIgIiA8PCBwdENlbnRlci55ICsgMS41ZiA8PCAiIGxcbiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHB0Q2VudGVyLnggPDwgIiAiIDw8IHB0Q2VudGVyLnkgLSAxLjVmIDw8ICIgbFxuIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgcHRDZW50ZXIueCAtIDMgPDwgIiAiIDw8IHB0Q2VudGVyLnkgKyAxLjVmIDw8ICIgbCBmXG4iOwotICAgICAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQnV0dG9uIDw8ICJRXG4iOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjogewotICAgICAgICAgICAgICAgIENQVlRfRm9udE1hcCBtYXAocERvYywgcFN0cmVhbURpY3QgPyBwU3RyZWFtRGljdC0+R2V0RGljdCgiUmVzb3VyY2VzIik6TlVMTCwgcERlZkZvbnQsIHNGb250TmFtZS5SaWdodChzRm9udE5hbWUuR2V0TGVuZ3RoKCkgLSAxKSk7Ci0gICAgICAgICAgICAgICAgQ1BWVF9Qcm92aWRlciBwcmQoJm1hcCk7Ci0gICAgICAgICAgICAgICAgQ1BERl9BcnJheSAqIHBPcHRzID0gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIk9wdCIpID8gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIk9wdCIpLT5HZXRBcnJheSgpIDogTlVMTDsKLSAgICAgICAgICAgICAgICBDUERGX0FycmF5ICogcFNlbHMgPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiSSIpID8gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIkkiKS0+R2V0QXJyYXkoKSA6IE5VTEw7Ci0gICAgICAgICAgICAgICAgRlhfSU5UMzIgblRvcCA9IEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJUSSIpID8gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIlRJIiktPkdldEludGVnZXIoKSA6IDA7Ci0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmIHNCb2R5OwotICAgICAgICAgICAgICAgIGlmIChwT3B0cykgewotICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSA9IHJjQm9keS50b3A7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IG5Ub3AsIHN6ID0gcE9wdHMtPkdldENvdW50KCk7IGkgPCBzejsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoSXNGbG9hdFNtYWxsZXIoZnksIHJjQm9keS5ib3R0b20pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ1BERl9PYmplY3QqIHBPcHQgPSBwT3B0cy0+R2V0RWxlbWVudFZhbHVlKGkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dJdGVtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwT3B0LT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUklORykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd0l0ZW0gPSBwT3B0LT5HZXRVbmljb2RlVGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocE9wdC0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd0l0ZW0gPSAoKENQREZfQXJyYXkqKXBPcHQpLT5HZXRFbGVtZW50VmFsdWUoMSktPkdldFVuaWNvZGVUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNlbGVjdGVkID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBTZWxzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoRlhfRFdPUkQgcyA9IDAsIHNzeiA9IHBTZWxzLT5HZXRDb3VudCgpOyBzIDwgc3N6OyBzKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IHBTZWxzLT5HZXRJbnRlZ2VyKHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNlbGVjdGVkID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1ZhcmlhYmxlVGV4dCB2dDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dC5TZXRQcm92aWRlcigmcHJkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dC5TZXRQbGF0ZVJlY3QoQ1BERl9SZWN0KHJjQm9keS5sZWZ0LCAwLjBmLCByY0JvZHkucmlnaHQsIDAuMGYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dC5TZXRGb250U2l6ZSgxMi4wZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnQuU2V0Rm9udFNpemUoZkZvbnRTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdnQuSW5pdGlhbGl6ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0LlNldFRleHQoc3dJdGVtLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0LlJlYXJyYW5nZUFsbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZJdGVtSGVpZ2h0ID0gdnQuR2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYlNlbGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVjdCByY0l0ZW0gPSBDUERGX1JlY3QocmNCb2R5LmxlZnQsIGZ5IC0gZkl0ZW1IZWlnaHQsIHJjQm9keS5yaWdodCwgZnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQm9keSA8PCAicVxuIiA8PCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUChDUFZUX0NvbG9yKENUX1JHQiwgMCwgNTEuMGYgLyAyNTUuMGYsIDExMy4wZiAvIDI1NS4wZiksIFRSVUUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHJjSXRlbS5sZWZ0IDw8ICIgIiA8PCByY0l0ZW0uYm90dG9tIDw8ICIgIiA8PCByY0l0ZW0uV2lkdGgoKSA8PCAiICIgPDwgcmNJdGVtLkhlaWdodCgpIDw8ICIgcmUgZlxuIiA8PCAiUVxuIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0JvZHkgPDwgIkJUXG4iIDw8IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKENQVlRfQ29sb3IoQ1RfR1JBWSwgMSksIFRSVUUpIDw8IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVFZGl0QVAoJm1hcCwgdnQuR2V0SXRlcmF0b3IoKSwgQ1BERl9Qb2ludCgwLjBmLCBmeSksIFRSVUUsIDApIDw8ICJFVFxuIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQm9keSA8PCAiQlRcbiIgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoY3JUZXh0LCBUUlVFKSA8PCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlRWRpdEFQKCZtYXAsIHZ0LkdldEl0ZXJhdG9yKCksIENQREZfUG9pbnQoMC4wZiwgZnkpLCBUUlVFLCAwKSA8PCAiRVRcbiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ5IC09IGZJdGVtSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzQm9keS5HZXRTaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgIi9UeCBCTUNcbiIgPDwgInFcbiI7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgcmNCb2R5LmxlZnQgPDwgIiAiIDw8IHJjQm9keS5ib3R0b20gPDwgIiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcmNCb2R5LldpZHRoKCkgPDwgIiAiIDw8IHJjQm9keS5IZWlnaHQoKSA8PCAiIHJlXG5XXG5uXG4iOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHNCb2R5LkdldEJ5dGVTdHJpbmcoKSA8PCAiUVxuRU1DXG4iOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAocE5vcm1hbFN0cmVhbSkgewotICAgICAgICBwTm9ybWFsU3RyZWFtLT5TZXREYXRhKChGWF9CWVRFKilzQXBwU3RyZWFtLkdldEJ1ZmZlcigpLCBzQXBwU3RyZWFtLkdldFNpemUoKSwgRkFMU0UsIEZBTFNFKTsKLSAgICAgICAgcFN0cmVhbURpY3QgPSBwTm9ybWFsU3RyZWFtLT5HZXREaWN0KCk7Ci0gICAgICAgIGlmIChwU3RyZWFtRGljdCkgewotICAgICAgICAgICAgcFN0cmVhbURpY3QtPlNldEF0TWF0cml4KCJNYXRyaXgiLCBtYXRyaXgpOwotICAgICAgICAgICAgcFN0cmVhbURpY3QtPlNldEF0UmVjdCgiQkJveCIsIHJjQkJveCk7Ci0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1SZXNMaXN0ID0gcFN0cmVhbURpY3QtPkdldERpY3QoIlJlc291cmNlcyIpOwotICAgICAgICAgICAgaWYgKHBTdHJlYW1SZXNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwU3RyZWFtUmVzRm9udExpc3QgPSBwU3RyZWFtUmVzTGlzdC0+R2V0RGljdCgiRm9udCIpOwotICAgICAgICAgICAgICAgIGlmICghcFN0cmVhbVJlc0ZvbnRMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1SZXNGb250TGlzdCA9IENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwU3RyZWFtUmVzRm9udExpc3QgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1SZXNMaXN0LT5TZXRBdCgiRm9udCIsIHBTdHJlYW1SZXNGb250TGlzdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghcFN0cmVhbVJlc0ZvbnRMaXN0LT5LZXlFeGlzdChzRm9udE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW1SZXNGb250TGlzdC0+U2V0QXRSZWZlcmVuY2Uoc0ZvbnROYW1lLCBwRG9jLCBwRm9udERpY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcFN0cmVhbURpY3QtPlNldEF0KCJSZXNvdXJjZXMiLCBwRm9ybURpY3QtPkdldERpY3QoIkRSIiktPkNsb25lKCkpOwotICAgICAgICAgICAgICAgIHBTdHJlYW1SZXNMaXN0ID0gcFN0cmVhbURpY3QtPkdldERpY3QoIlJlc291cmNlcyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQorRlhfQk9PTCBDUFZUX1Byb3ZpZGVyOjpJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpIHsKKyAgaWYgKCh3b3JkID49IDB4NjEgJiYgd29yZCA8PSAweDdBKSB8fCAod29yZCA+PSAweDQxICYmIHdvcmQgPD0gMHg1QSkgfHwKKyAgICAgIHdvcmQgPT0gMHgyRCB8fCB3b3JkID09IDB4MjcpIHsKICAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1GWF9CT09MIENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVUZXh0RmllbGRBUChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpCi17Ci0gICAgcmV0dXJuIEdlbmVyYXRlV2lkZ2V0QVAocERvYywgcEFubm90RGljdCwgMCk7CitpbnQzMl90IENQVlRfUHJvdmlkZXI6OkdldERlZmF1bHRGb250SW5kZXgoKSB7CisgIHJldHVybiAwOwogfQotRlhfQk9PTCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29tYm9Cb3hBUChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpCi17Ci0gICAgcmV0dXJuIEdlbmVyYXRlV2lkZ2V0QVAocERvYywgcEFubm90RGljdCwgMSk7CisKK3N0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRQREZXb3JkU3RyaW5nKElQVlRfRm9udE1hcCogcEZvbnRNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Gb250SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIFdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIFN1YldvcmQpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgc1dvcmQ7CisgIGlmIChTdWJXb3JkID4gMCkgeworICAgIHNXb3JkLkZvcm1hdCgiJWMiLCBTdWJXb3JkKTsKKyAgICByZXR1cm4gc1dvcmQ7CisgIH0KKworICBpZiAoIXBGb250TWFwKQorICAgIHJldHVybiBzV29yZDsKKworICBpZiAoQ1BERl9Gb250KiBwUERGRm9udCA9IHBGb250TWFwLT5HZXRQREZGb250KG5Gb250SW5kZXgpKSB7CisgICAgaWYgKHBQREZGb250LT5HZXRCYXNlRm9udCgpLkNvbXBhcmUoIlN5bWJvbCIpID09IDAgfHwKKyAgICAgICAgcFBERkZvbnQtPkdldEJhc2VGb250KCkuQ29tcGFyZSgiWmFwZkRpbmdiYXRzIikgPT0gMCkgeworICAgICAgc1dvcmQuRm9ybWF0KCIlYyIsIFdvcmQpOworICAgIH0gZWxzZSB7CisgICAgICBGWF9EV09SRCBkd0NoYXJDb2RlID0gcFBERkZvbnQtPkNoYXJDb2RlRnJvbVVuaWNvZGUoV29yZCk7CisgICAgICBpZiAoZHdDaGFyQ29kZSAhPSBDUERGX0ZvbnQ6OmtJbnZhbGlkQ2hhckNvZGUpIHsKKyAgICAgICAgcFBERkZvbnQtPkFwcGVuZENoYXIoc1dvcmQsIGR3Q2hhckNvZGUpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gc1dvcmQ7CiB9Ci1GWF9CT09MIENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVMaXN0Qm94QVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KQotewotICAgIHJldHVybiBHZW5lcmF0ZVdpZGdldEFQKHBEb2MsIHBBbm5vdERpY3QsIDIpOworCitzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0V29yZFJlbmRlclN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyV29yZHMpIHsKKyAgaWYgKHN0cldvcmRzLkdldExlbmd0aCgpID4gMCkgeworICAgIHJldHVybiBQREZfRW5jb2RlU3RyaW5nKHN0cldvcmRzKSArICIgVGpcbiI7CisgIH0KKyAgcmV0dXJuICIiOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUVkaXRBUChJUFZUX0ZvbnRNYXAgKiBwRm9udE1hcCwgSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIHBJdGVyYXRvciwgY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0LCBGWF9CT09MIGJDb250aW51b3VzLCBGWF9XT1JEIFN1YldvcmQsIGNvbnN0IENQVlRfV29yZFJhbmdlICogcFZpc2libGUpCi17Ci0gICAgQ0ZYX0J5dGVUZXh0QnVmIHNFZGl0U3RyZWFtLCBzTGluZVN0cmVhbSwgc1dvcmRzOwotICAgIENQREZfUG9pbnQgcHRPbGQoMC4wZiwgMC4wZiksIHB0TmV3KDAuMGYsIDAuMGYpOwotICAgIEZYX0lOVDMyIG5DdXJGb250SW5kZXggPSAtMTsKLSAgICBpZiAocEl0ZXJhdG9yKSB7Ci0gICAgICAgIGlmIChwVmlzaWJsZSkgewotICAgICAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdChwVmlzaWJsZS0+QmVnaW5Qb3MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdCgwKTsKK3N0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRGb250U2V0U3RyaW5nKElQVlRfRm9udE1hcCogcEZvbnRNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Gb250SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNSZXQ7CisgIGlmIChwRm9udE1hcCkgeworICAgIENGWF9CeXRlU3RyaW5nIHNGb250QWxpYXMgPSBwRm9udE1hcC0+R2V0UERGRm9udEFsaWFzKG5Gb250SW5kZXgpOworICAgIGlmIChzRm9udEFsaWFzLkdldExlbmd0aCgpID4gMCAmJiBmRm9udFNpemUgPiAwKSB7CisgICAgICBzUmV0IDw8ICIvIiA8PCBzRm9udEFsaWFzIDw8ICIgIiA8PCBmRm9udFNpemUgPDwgIiBUZlxuIjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNSZXQuR2V0Qnl0ZVN0cmluZygpOworfQorc3RhdGljIENQVlRfQ29sb3IgUGFyc2VDb2xvcihjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKSB7CisgIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChzdHIpOworICBzeW50YXguU2V0UG9zKDApOworICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbSgiZyIsIDEpKSB7CisgICAgcmV0dXJuIENQVlRfQ29sb3IoQ1RfR1JBWSwgRlhfYXRvZihzeW50YXguR2V0V29yZCgpKSk7CisgIH0KKyAgc3ludGF4LlNldFBvcygwKTsKKyAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oInJnIiwgMykpIHsKKyAgICBGWF9GTE9BVCBmMSA9IEZYX2F0b2Yoc3ludGF4LkdldFdvcmQoKSk7CisgICAgRlhfRkxPQVQgZjIgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOworICAgIEZYX0ZMT0FUIGYzID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKTsKKyAgICByZXR1cm4gQ1BWVF9Db2xvcihDVF9SR0IsIGYxLCBmMiwgZjMpOworICB9CisgIHN5bnRheC5TZXRQb3MoMCk7CisgIGlmIChzeW50YXguRmluZFRhZ1BhcmFtKCJrIiwgNCkpIHsKKyAgICBGWF9GTE9BVCBmMSA9IEZYX2F0b2Yoc3ludGF4LkdldFdvcmQoKSk7CisgICAgRlhfRkxPQVQgZjIgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOworICAgIEZYX0ZMT0FUIGYzID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKTsKKyAgICBGWF9GTE9BVCBmNCA9IEZYX2F0b2Yoc3ludGF4LkdldFdvcmQoKSk7CisgICAgcmV0dXJuIENQVlRfQ29sb3IoQ1RfQ01ZSywgZjEsIGYyLCBmMywgZjQpOworICB9CisgIHJldHVybiBDUFZUX0NvbG9yKENUX1RSQU5TUEFSRU5UKTsKK30KK3N0YXRpYyBDUFZUX0NvbG9yIFBhcnNlQ29sb3IoY29uc3QgQ1BERl9BcnJheSYgYXJyYXkpIHsKKyAgQ1BWVF9Db2xvciBydDsKKyAgc3dpdGNoIChhcnJheS5HZXRDb3VudCgpKSB7CisgICAgY2FzZSAxOgorICAgICAgcnQgPSBDUFZUX0NvbG9yKENUX0dSQVksIGFycmF5LkdldEZsb2F0KDApKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIHJ0ID0gQ1BWVF9Db2xvcihDVF9SR0IsIGFycmF5LkdldEZsb2F0KDApLCBhcnJheS5HZXRGbG9hdCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICBhcnJheS5HZXRGbG9hdCgyKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBydCA9IENQVlRfQ29sb3IoQ1RfQ01ZSywgYXJyYXkuR2V0RmxvYXQoMCksIGFycmF5LkdldEZsb2F0KDEpLAorICAgICAgICAgICAgICAgICAgICAgIGFycmF5LkdldEZsb2F0KDIpLCBhcnJheS5HZXRGbG9hdCgzKSk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcnQ7Cit9CitzdGF0aWMgRlhfQk9PTCBHZW5lcmF0ZVdpZGdldEFQKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCYgbldpZGdldFR5cGUpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QgPSBOVUxMOworICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdERpY3QgPSBwRG9jLT5HZXRSb290KCkpIHsKKyAgICBwRm9ybURpY3QgPSBwUm9vdERpY3QtPkdldERpY3QoIkFjcm9Gb3JtIik7CisgIH0KKyAgaWYgKCFwRm9ybURpY3QpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgREE7CisgIGlmIChDUERGX09iamVjdCogcERBT2JqID0gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIkRBIikpIHsKKyAgICBEQSA9IHBEQU9iai0+R2V0U3RyaW5nKCk7CisgIH0KKyAgaWYgKERBLklzRW1wdHkoKSkgeworICAgIERBID0gcEZvcm1EaWN0LT5HZXRTdHJpbmcoIkRBIik7CisgIH0KKyAgaWYgKERBLklzRW1wdHkoKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgoREEpOworICBzeW50YXguRmluZFRhZ1BhcmFtKCJUZiIsIDIpOworICBDRlhfQnl0ZVN0cmluZyBzRm9udE5hbWUgPSBzeW50YXguR2V0V29yZCgpOworICBzRm9udE5hbWUgPSBQREZfTmFtZURlY29kZShzRm9udE5hbWUpOworICBpZiAoc0ZvbnROYW1lLklzRW1wdHkoKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9GTE9BVCBmRm9udFNpemUgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOworICBDUFZUX0NvbG9yIGNyVGV4dCA9IFBhcnNlQ29sb3IoREEpOworICBGWF9CT09MIGJVc2VGb3JtUmVzID0gRkFMU0U7CisgIENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0ID0gTlVMTDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRFJEaWN0ID0gcEFubm90RGljdC0+R2V0RGljdCgiRFIiKTsKKyAgaWYgKCFwRFJEaWN0KSB7CisgICAgcERSRGljdCA9IHBGb3JtRGljdC0+R2V0RGljdCgiRFIiKTsKKyAgICBiVXNlRm9ybVJlcyA9IFRSVUU7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRFJGb250RGljdCA9IE5VTEw7CisgIGlmIChwRFJEaWN0ICYmIChwRFJGb250RGljdCA9IHBEUkRpY3QtPkdldERpY3QoIkZvbnQiKSkpIHsKKyAgICBwRm9udERpY3QgPSBwRFJGb250RGljdC0+R2V0RGljdChzRm9udE5hbWUuTWlkKDEpKTsKKyAgICBpZiAoIXBGb250RGljdCAmJiAhYlVzZUZvcm1SZXMpIHsKKyAgICAgIHBEUkRpY3QgPSBwRm9ybURpY3QtPkdldERpY3QoIkRSIik7CisgICAgICBwRFJGb250RGljdCA9IHBEUkRpY3QtPkdldERpY3QoIkZvbnQiKTsKKyAgICAgIGlmIChwRFJGb250RGljdCkgeworICAgICAgICBwRm9udERpY3QgPSBwRFJGb250RGljdC0+R2V0RGljdChzRm9udE5hbWUuTWlkKDEpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKCFwRFJGb250RGljdCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoIXBGb250RGljdCkgeworICAgIHBGb250RGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgICAgcEZvbnREaWN0LT5TZXRBdE5hbWUoIlR5cGUiLCAiRm9udCIpOworICAgIHBGb250RGljdC0+U2V0QXROYW1lKCJTdWJ0eXBlIiwgIlR5cGUxIik7CisgICAgcEZvbnREaWN0LT5TZXRBdE5hbWUoIkJhc2VGb250IiwgIkhlbHZldGljYSIpOworICAgIHBGb250RGljdC0+U2V0QXROYW1lKCJFbmNvZGluZyIsICJXaW5BbnNpRW5jb2RpbmciKTsKKyAgICBwRG9jLT5BZGRJbmRpcmVjdE9iamVjdChwRm9udERpY3QpOworICAgIHBEUkZvbnREaWN0LT5TZXRBdFJlZmVyZW5jZShzRm9udE5hbWUuTWlkKDEpLCBwRG9jLCBwRm9udERpY3QpOworICB9CisgIENQREZfRm9udCogcERlZkZvbnQgPSBwRG9jLT5Mb2FkRm9udChwRm9udERpY3QpOworICBpZiAoIXBEZWZGb250KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfUmVjdCByY0Fubm90ID0gcEFubm90RGljdC0+R2V0UmVjdCgiUmVjdCIpOworICBpbnQzMl90IG5Sb3RhdGUgPSAwOworICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwTUtEaWN0ID0gcEFubm90RGljdC0+R2V0RGljdCgiTUsiKSkgeworICAgIG5Sb3RhdGUgPSBwTUtEaWN0LT5HZXRJbnRlZ2VyKCJSIik7CisgIH0KKyAgQ1BERl9SZWN0IHJjQkJveDsKKyAgQ0ZYX01hdHJpeCBtYXRyaXg7CisgIHN3aXRjaCAoblJvdGF0ZSAlIDM2MCkgeworICAgIGNhc2UgMDoKKyAgICAgIHJjQkJveCA9IENQREZfUmVjdCgwLCAwLCByY0Fubm90LnJpZ2h0IC0gcmNBbm5vdC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHJjQW5ub3QudG9wIC0gcmNBbm5vdC5ib3R0b20pOworICAgICAgYnJlYWs7CisgICAgY2FzZSA5MDoKKyAgICAgIG1hdHJpeCA9IENGWF9NYXRyaXgoMCwgMSwgLTEsIDAsIHJjQW5ub3QucmlnaHQgLSByY0Fubm90LmxlZnQsIDApOworICAgICAgcmNCQm94ID0gQ1BERl9SZWN0KDAsIDAsIHJjQW5ub3QudG9wIC0gcmNBbm5vdC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgcmNBbm5vdC5yaWdodCAtIHJjQW5ub3QubGVmdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE4MDoKKyAgICAgIG1hdHJpeCA9IENGWF9NYXRyaXgoLTEsIDAsIDAsIC0xLCByY0Fubm90LnJpZ2h0IC0gcmNBbm5vdC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICByY0Fubm90LnRvcCAtIHJjQW5ub3QuYm90dG9tKTsKKyAgICAgIHJjQkJveCA9IENQREZfUmVjdCgwLCAwLCByY0Fubm90LnJpZ2h0IC0gcmNBbm5vdC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHJjQW5ub3QudG9wIC0gcmNBbm5vdC5ib3R0b20pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNzA6CisgICAgICBtYXRyaXggPSBDRlhfTWF0cml4KDAsIC0xLCAxLCAwLCAwLCByY0Fubm90LnRvcCAtIHJjQW5ub3QuYm90dG9tKTsKKyAgICAgIHJjQkJveCA9IENQREZfUmVjdCgwLCAwLCByY0Fubm90LnRvcCAtIHJjQW5ub3QuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJjQW5ub3QucmlnaHQgLSByY0Fubm90LmxlZnQpOworICAgICAgYnJlYWs7CisgIH0KKyAgaW50MzJfdCBuQm9yZGVyU3R5bGUgPSBQQlNfU09MSUQ7CisgIEZYX0ZMT0FUIGZCb3JkZXJXaWR0aCA9IDE7CisgIENQVlRfRGFzaCBkc0JvcmRlcigzLCAwLCAwKTsKKyAgQ1BWVF9Db2xvciBjckxlZnRUb3AsIGNyUmlnaHRCb3R0b207CisgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBCU0RpY3QgPSBwQW5ub3REaWN0LT5HZXREaWN0KCJCUyIpKSB7CisgICAgaWYgKHBCU0RpY3QtPktleUV4aXN0KCJXIikpIHsKKyAgICAgIGZCb3JkZXJXaWR0aCA9IHBCU0RpY3QtPkdldE51bWJlcigiVyIpOworICAgIH0KKyAgICBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcEJTRGljdC0+R2V0QXJyYXkoIkQiKSkgeworICAgICAgZHNCb3JkZXIgPSBDUFZUX0Rhc2gocEFycmF5LT5HZXRJbnRlZ2VyKDApLCBwQXJyYXktPkdldEludGVnZXIoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXJyYXktPkdldEludGVnZXIoMikpOworICAgIH0KKyAgICBzd2l0Y2ggKHBCU0RpY3QtPkdldFN0cmluZygiUyIpLkdldEF0KDApKSB7CisgICAgICBjYXNlICdTJzoKKyAgICAgICAgbkJvcmRlclN0eWxlID0gUEJTX1NPTElEOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ0QnOgorICAgICAgICBuQm9yZGVyU3R5bGUgPSBQQlNfREFTSDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdCJzoKKyAgICAgICAgbkJvcmRlclN0eWxlID0gUEJTX0JFVkVMRUQ7CisgICAgICAgIGZCb3JkZXJXaWR0aCAqPSAyOworICAgICAgICBjckxlZnRUb3AgPSBDUFZUX0NvbG9yKENUX0dSQVksIDEpOworICAgICAgICBjclJpZ2h0Qm90dG9tID0gQ1BWVF9Db2xvcihDVF9HUkFZLCAwLjUpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ0knOgorICAgICAgICBuQm9yZGVyU3R5bGUgPSBQQlNfSU5TRVQ7CisgICAgICAgIGZCb3JkZXJXaWR0aCAqPSAyOworICAgICAgICBjckxlZnRUb3AgPSBDUFZUX0NvbG9yKENUX0dSQVksIDAuNSk7CisgICAgICAgIGNyUmlnaHRCb3R0b20gPSBDUFZUX0NvbG9yKENUX0dSQVksIDAuNzUpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1UnOgorICAgICAgICBuQm9yZGVyU3R5bGUgPSBQQlNfVU5ERVJMSU5FRDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIENQVlRfQ29sb3IgY3JCb3JkZXIsIGNyQkc7CisgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBNS0RpY3QgPSBwQW5ub3REaWN0LT5HZXREaWN0KCJNSyIpKSB7CisgICAgaWYgKENQREZfQXJyYXkqIHBBcnJheSA9IHBNS0RpY3QtPkdldEFycmF5KCJCQyIpKSB7CisgICAgICBjckJvcmRlciA9IFBhcnNlQ29sb3IoKnBBcnJheSk7CisgICAgfQorICAgIGlmIChDUERGX0FycmF5KiBwQXJyYXkgPSBwTUtEaWN0LT5HZXRBcnJheSgiQkciKSkgeworICAgICAgY3JCRyA9IFBhcnNlQ29sb3IoKnBBcnJheSk7CisgICAgfQorICB9CisgIENGWF9CeXRlVGV4dEJ1ZiBzQXBwU3RyZWFtOworICBDRlhfQnl0ZVN0cmluZyBzQkcgPSBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUChjckJHLCBUUlVFKTsKKyAgaWYgKHNCRy5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICBzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IHNCRyA8PCByY0JCb3gubGVmdCA8PCAiICIgPDwgcmNCQm94LmJvdHRvbSA8PCAiICIKKyAgICAgICAgICAgICAgIDw8IHJjQkJveC5XaWR0aCgpIDw8ICIgIiA8PCByY0JCb3guSGVpZ2h0KCkgPDwgIiByZSBmXG4iCisgICAgICAgICAgICAgICA8PCAiUVxuIjsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBzQm9yZGVyU3RyZWFtID0gQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUJvcmRlckFQKAorICAgICAgcmNCQm94LCBmQm9yZGVyV2lkdGgsIGNyQm9yZGVyLCBjckxlZnRUb3AsIGNyUmlnaHRCb3R0b20sIG5Cb3JkZXJTdHlsZSwKKyAgICAgIGRzQm9yZGVyKTsKKyAgaWYgKHNCb3JkZXJTdHJlYW0uR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBzQm9yZGVyU3RyZWFtIDw8ICJRXG4iOworICB9CisgIENQREZfUmVjdCByY0JvZHkgPQorICAgICAgQ1BERl9SZWN0KHJjQkJveC5sZWZ0ICsgZkJvcmRlcldpZHRoLCByY0JCb3guYm90dG9tICsgZkJvcmRlcldpZHRoLAorICAgICAgICAgICAgICAgIHJjQkJveC5yaWdodCAtIGZCb3JkZXJXaWR0aCwgcmNCQm94LnRvcCAtIGZCb3JkZXJXaWR0aCk7CisgIHJjQm9keS5Ob3JtYWxpemUoKTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQVBEaWN0ID0gcEFubm90RGljdC0+R2V0RGljdCgiQVAiKTsKKyAgaWYgKCFwQVBEaWN0KSB7CisgICAgcEFQRGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgICAgcEFubm90RGljdC0+U2V0QXQoIkFQIiwgcEFQRGljdCk7CisgIH0KKyAgQ1BERl9TdHJlYW0qIHBOb3JtYWxTdHJlYW0gPSBwQVBEaWN0LT5HZXRTdHJlYW0oIk4iKTsKKyAgaWYgKCFwTm9ybWFsU3RyZWFtKSB7CisgICAgcE5vcm1hbFN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbShudWxscHRyLCAwLCBudWxscHRyKTsKKyAgICBpbnQzMl90IG9iam51bSA9IHBEb2MtPkFkZEluZGlyZWN0T2JqZWN0KHBOb3JtYWxTdHJlYW0pOworICAgIHBBbm5vdERpY3QtPkdldERpY3QoIkFQIiktPlNldEF0UmVmZXJlbmNlKCJOIiwgcERvYywgb2JqbnVtKTsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1EaWN0ID0gcE5vcm1hbFN0cmVhbS0+R2V0RGljdCgpOworICBpZiAocFN0cmVhbURpY3QpIHsKKyAgICBwU3RyZWFtRGljdC0+U2V0QXRNYXRyaXgoIk1hdHJpeCIsIG1hdHJpeCk7CisgICAgcFN0cmVhbURpY3QtPlNldEF0UmVjdCgiQkJveCIsIHJjQkJveCk7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwU3RyZWFtUmVzTGlzdCA9IHBTdHJlYW1EaWN0LT5HZXREaWN0KCJSZXNvdXJjZXMiKTsKKyAgICBpZiAocFN0cmVhbVJlc0xpc3QpIHsKKyAgICAgIENQREZfRGljdGlvbmFyeSogcFN0cmVhbVJlc0ZvbnRMaXN0ID0gcFN0cmVhbVJlc0xpc3QtPkdldERpY3QoIkZvbnQiKTsKKyAgICAgIGlmICghcFN0cmVhbVJlc0ZvbnRMaXN0KSB7CisgICAgICAgIHBTdHJlYW1SZXNGb250TGlzdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgICAgICAgIHBTdHJlYW1SZXNMaXN0LT5TZXRBdCgiRm9udCIsIHBTdHJlYW1SZXNGb250TGlzdCk7CisgICAgICB9CisgICAgICBpZiAoIXBTdHJlYW1SZXNGb250TGlzdC0+S2V5RXhpc3Qoc0ZvbnROYW1lKSkgeworICAgICAgICBwU3RyZWFtUmVzRm9udExpc3QtPlNldEF0UmVmZXJlbmNlKHNGb250TmFtZSwgcERvYywgcEZvbnREaWN0KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcFN0cmVhbURpY3QtPlNldEF0KCJSZXNvdXJjZXMiLCBwRm9ybURpY3QtPkdldERpY3QoIkRSIiktPkNsb25lKCkpOworICAgICAgcFN0cmVhbVJlc0xpc3QgPSBwU3RyZWFtRGljdC0+R2V0RGljdCgiUmVzb3VyY2VzIik7CisgICAgfQorICB9CisgIHN3aXRjaCAobldpZGdldFR5cGUpIHsKKyAgICBjYXNlIDA6IHsKKyAgICAgIENGWF9XaWRlU3RyaW5nIHN3VmFsdWUgPQorICAgICAgICAgIEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJWIikKKyAgICAgICAgICAgICAgPyBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiViIpLT5HZXRVbmljb2RlVGV4dCgpCisgICAgICAgICAgICAgIDogQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgICAgIGludDMyX3QgbkFsaWduID0gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIlEiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiUSIpLT5HZXRJbnRlZ2VyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiRmYiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJGZiIpLT5HZXRJbnRlZ2VyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwOworICAgICAgRlhfRFdPUkQgZHdNYXhMZW4gPQorICAgICAgICAgIEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJNYXhMZW4iKQorICAgICAgICAgICAgICA/IEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJNYXhMZW4iKS0+R2V0SW50ZWdlcigpCisgICAgICAgICAgICAgIDogMDsKKyAgICAgIENQVlRfRm9udE1hcCBtYXAocERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbURpY3QgPyBwU3RyZWFtRGljdC0+R2V0RGljdCgiUmVzb3VyY2VzIikgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBwRGVmRm9udCwgc0ZvbnROYW1lLlJpZ2h0KHNGb250TmFtZS5HZXRMZW5ndGgoKSAtIDEpKTsKKyAgICAgIENQVlRfUHJvdmlkZXIgcHJkKCZtYXApOworICAgICAgQ1BERl9WYXJpYWJsZVRleHQgdnQ7CisgICAgICB2dC5TZXRQcm92aWRlcigmcHJkKTsKKyAgICAgIHZ0LlNldFBsYXRlUmVjdChyY0JvZHkpOworICAgICAgdnQuU2V0QWxpZ25tZW50KG5BbGlnbik7CisgICAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkgeworICAgICAgICB2dC5TZXRBdXRvRm9udFNpemUoVFJVRSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB2dC5TZXRGb250U2l6ZShmRm9udFNpemUpOworICAgICAgfQorICAgICAgRlhfQk9PTCBiTXVsdGlMaW5lID0gKGR3RmxhZ3MgPj4gMTIpICYgMTsKKyAgICAgIGlmIChiTXVsdGlMaW5lKSB7CisgICAgICAgIHZ0LlNldE11bHRpTGluZShUUlVFKTsKKyAgICAgICAgdnQuU2V0QXV0b1JldHVybihUUlVFKTsKKyAgICAgIH0KKyAgICAgIEZYX1dPUkQgc3ViV29yZCA9IDA7CisgICAgICBpZiAoKGR3RmxhZ3MgPj4gMTMpICYgMSkgeworICAgICAgICBzdWJXb3JkID0gJyonOworICAgICAgICB2dC5TZXRQYXNzd29yZENoYXIoc3ViV29yZCk7CisgICAgICB9CisgICAgICBGWF9CT09MIGJDaGFyQXJyYXkgPSAoZHdGbGFncyA+PiAyNCkgJiAxOworICAgICAgaWYgKGJDaGFyQXJyYXkpIHsKKyAgICAgICAgdnQuU2V0Q2hhckFycmF5KGR3TWF4TGVuKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZ0LlNldExpbWl0Q2hhcihkd01heExlbik7CisgICAgICB9CisgICAgICB2dC5Jbml0aWFsaXplKCk7CisgICAgICB2dC5TZXRUZXh0KHN3VmFsdWUuY19zdHIoKSk7CisgICAgICB2dC5SZWFycmFuZ2VBbGwoKTsKKyAgICAgIENQREZfUmVjdCByY0NvbnRlbnQgPSB2dC5HZXRDb250ZW50UmVjdCgpOworICAgICAgQ1BERl9Qb2ludCBwdE9mZnNldCgwLjBmLCAwLjBmKTsKKyAgICAgIGlmICghYk11bHRpTGluZSkgeworICAgICAgICBwdE9mZnNldCA9CisgICAgICAgICAgICBDUERGX1BvaW50KDAuMGYsIChyY0NvbnRlbnQuSGVpZ2h0KCkgLSByY0JvZHkuSGVpZ2h0KCkpIC8gMi4wZik7CisgICAgICB9CisgICAgICBDRlhfQnl0ZVN0cmluZyBzQm9keSA9IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVFZGl0QVAoCisgICAgICAgICAgJm1hcCwgdnQuR2V0SXRlcmF0b3IoKSwgcHRPZmZzZXQsICFiQ2hhckFycmF5LCBzdWJXb3JkKTsKKyAgICAgIGlmIChzQm9keS5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgc0FwcFN0cmVhbSA8PCAiL1R4IEJNQ1xuIgorICAgICAgICAgICAgICAgICAgIDw8ICJxXG4iOworICAgICAgICBpZiAocmNDb250ZW50LldpZHRoKCkgPiByY0JvZHkuV2lkdGgoKSB8fAorICAgICAgICAgICAgcmNDb250ZW50LkhlaWdodCgpID4gcmNCb2R5LkhlaWdodCgpKSB7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCByY0JvZHkubGVmdCA8PCAiICIgPDwgcmNCb2R5LmJvdHRvbSA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHJjQm9keS5XaWR0aCgpIDw8ICIgIiA8PCByY0JvZHkuSGVpZ2h0KCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgcmVcbldcbm5cbiI7CiAgICAgICAgIH0KLSAgICAgICAgQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2U7Ci0gICAgICAgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpIHsKLSAgICAgICAgICAgIENQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOwotICAgICAgICAgICAgaWYgKHBWaXNpYmxlICYmIHBsYWNlLldvcmRDbXAocFZpc2libGUtPkVuZFBvcykgPiAwKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHNBcHBTdHJlYW0gPDwgIkJUXG4iIDw8IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKGNyVGV4dCwgVFJVRSkKKyAgICAgICAgICAgICAgICAgICA8PCBzQm9keSA8PCAiRVRcbiIKKyAgICAgICAgICAgICAgICAgICA8PCAiUVxuRU1DXG4iOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSAxOiB7CisgICAgICBDRlhfV2lkZVN0cmluZyBzd1ZhbHVlID0KKyAgICAgICAgICBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiViIpCisgICAgICAgICAgICAgID8gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIlYiKS0+R2V0VW5pY29kZVRleHQoKQorICAgICAgICAgICAgICA6IENGWF9XaWRlU3RyaW5nKCk7CisgICAgICBDUFZUX0ZvbnRNYXAgbWFwKHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1EaWN0ID8gcFN0cmVhbURpY3QtPkdldERpY3QoIlJlc291cmNlcyIpIDogTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgcERlZkZvbnQsIHNGb250TmFtZS5SaWdodChzRm9udE5hbWUuR2V0TGVuZ3RoKCkgLSAxKSk7CisgICAgICBDUFZUX1Byb3ZpZGVyIHByZCgmbWFwKTsKKyAgICAgIENQREZfVmFyaWFibGVUZXh0IHZ0OworICAgICAgdnQuU2V0UHJvdmlkZXIoJnByZCk7CisgICAgICBDUERGX1JlY3QgcmNCdXR0b24gPSByY0JvZHk7CisgICAgICByY0J1dHRvbi5sZWZ0ID0gcmNCdXR0b24ucmlnaHQgLSAxMzsKKyAgICAgIHJjQnV0dG9uLk5vcm1hbGl6ZSgpOworICAgICAgQ1BERl9SZWN0IHJjRWRpdCA9IHJjQm9keTsKKyAgICAgIHJjRWRpdC5yaWdodCA9IHJjQnV0dG9uLmxlZnQ7CisgICAgICByY0VkaXQuTm9ybWFsaXplKCk7CisgICAgICB2dC5TZXRQbGF0ZVJlY3QocmNFZGl0KTsKKyAgICAgIGlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKSB7CisgICAgICAgIHZ0LlNldEF1dG9Gb250U2l6ZShUUlVFKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZ0LlNldEZvbnRTaXplKGZGb250U2l6ZSk7CisgICAgICB9CisgICAgICB2dC5Jbml0aWFsaXplKCk7CisgICAgICB2dC5TZXRUZXh0KHN3VmFsdWUuY19zdHIoKSk7CisgICAgICB2dC5SZWFycmFuZ2VBbGwoKTsKKyAgICAgIENQREZfUmVjdCByY0NvbnRlbnQgPSB2dC5HZXRDb250ZW50UmVjdCgpOworICAgICAgQ1BERl9Qb2ludCBwdE9mZnNldCA9CisgICAgICAgICAgQ1BERl9Qb2ludCgwLjBmLCAocmNDb250ZW50LkhlaWdodCgpIC0gcmNFZGl0LkhlaWdodCgpKSAvIDIuMGYpOworICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0VkaXQgPSBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlRWRpdEFQKAorICAgICAgICAgICZtYXAsIHZ0LkdldEl0ZXJhdG9yKCksIHB0T2Zmc2V0LCBUUlVFLCAwKTsKKyAgICAgIGlmIChzRWRpdC5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgc0FwcFN0cmVhbSA8PCAiL1R4IEJNQ1xuIgorICAgICAgICAgICAgICAgICAgIDw8ICJxXG4iOworICAgICAgICBzQXBwU3RyZWFtIDw8IHJjRWRpdC5sZWZ0IDw8ICIgIiA8PCByY0VkaXQuYm90dG9tIDw8ICIgIgorICAgICAgICAgICAgICAgICAgIDw8IHJjRWRpdC5XaWR0aCgpIDw8ICIgIiA8PCByY0VkaXQuSGVpZ2h0KCkgPDwgIiByZVxuV1xublxuIjsKKyAgICAgICAgc0FwcFN0cmVhbSA8PCAiQlRcbiIgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoY3JUZXh0LCBUUlVFKQorICAgICAgICAgICAgICAgICAgIDw8IHNFZGl0IDw8ICJFVFxuIgorICAgICAgICAgICAgICAgICAgIDw8ICJRXG5FTUNcbiI7CisgICAgICB9CisgICAgICBDRlhfQnl0ZVN0cmluZyBzQnV0dG9uID0gQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoCisgICAgICAgICAgQ1BWVF9Db2xvcihDVF9SR0IsIDIyMC4wZiAvIDI1NS4wZiwgMjIwLjBmIC8gMjU1LjBmLCAyMjAuMGYgLyAyNTUuMGYpLAorICAgICAgICAgIFRSVUUpOworICAgICAgaWYgKHNCdXR0b24uR2V0TGVuZ3RoKCkgPiAwICYmICFyY0J1dHRvbi5Jc0VtcHR5KCkpIHsKKyAgICAgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBzQnV0dG9uOworICAgICAgICBzQXBwU3RyZWFtIDw8IHJjQnV0dG9uLmxlZnQgPDwgIiAiIDw8IHJjQnV0dG9uLmJvdHRvbSA8PCAiICIKKyAgICAgICAgICAgICAgICAgICA8PCByY0J1dHRvbi5XaWR0aCgpIDw8ICIgIiA8PCByY0J1dHRvbi5IZWlnaHQoKSA8PCAiIHJlIGZcbiI7CisgICAgICAgIHNBcHBTdHJlYW0gPDwgIlFcbiI7CisgICAgICAgIENGWF9CeXRlU3RyaW5nIHNCdXR0b25Cb3JkZXIgPSBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQm9yZGVyQVAoCisgICAgICAgICAgICByY0J1dHRvbiwgMiwgQ1BWVF9Db2xvcihDVF9HUkFZLCAwKSwgQ1BWVF9Db2xvcihDVF9HUkFZLCAxKSwKKyAgICAgICAgICAgIENQVlRfQ29sb3IoQ1RfR1JBWSwgMC41KSwgUEJTX0JFVkVMRUQsIENQVlRfRGFzaCgzLCAwLCAwKSk7CisgICAgICAgIGlmIChzQnV0dG9uQm9yZGVyLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgInFcbiIgPDwgc0J1dHRvbkJvcmRlciA8PCAiUVxuIjsKKyAgICAgICAgfQorICAgICAgICBDUERGX1BvaW50IHB0Q2VudGVyID0gQ1BERl9Qb2ludCgocmNCdXR0b24ubGVmdCArIHJjQnV0dG9uLnJpZ2h0KSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyY0J1dHRvbi50b3AgKyByY0J1dHRvbi5ib3R0b20pIC8gMik7CisgICAgICAgIGlmIChJc0Zsb2F0QmlnZ2VyKHJjQnV0dG9uLldpZHRoKCksIDYpICYmCisgICAgICAgICAgICBJc0Zsb2F0QmlnZ2VyKHJjQnV0dG9uLkhlaWdodCgpLCA2KSkgeworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgInFcbiIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgMCBnXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgcHRDZW50ZXIueCAtIDMgPDwgIiAiIDw8IHB0Q2VudGVyLnkgKyAxLjVmIDw8ICIgbVxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IHB0Q2VudGVyLnggKyAzIDw8ICIgIiA8PCBwdENlbnRlci55ICsgMS41ZiA8PCAiIGxcbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBwdENlbnRlci54IDw8ICIgIiA8PCBwdENlbnRlci55IC0gMS41ZiA8PCAiIGxcbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBwdENlbnRlci54IC0gMyA8PCAiICIgPDwgcHRDZW50ZXIueSArIDEuNWYgPDwgIiBsIGZcbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQnV0dG9uIDw8ICJRXG4iOworICAgICAgICB9CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIDI6IHsKKyAgICAgIENQVlRfRm9udE1hcCBtYXAocERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbURpY3QgPyBwU3RyZWFtRGljdC0+R2V0RGljdCgiUmVzb3VyY2VzIikgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBwRGVmRm9udCwgc0ZvbnROYW1lLlJpZ2h0KHNGb250TmFtZS5HZXRMZW5ndGgoKSAtIDEpKTsKKyAgICAgIENQVlRfUHJvdmlkZXIgcHJkKCZtYXApOworICAgICAgQ1BERl9BcnJheSogcE9wdHMgPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiT3B0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIk9wdCIpLT5HZXRBcnJheSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7CisgICAgICBDUERGX0FycmF5KiBwU2VscyA9IEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJJIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIkkiKS0+R2V0QXJyYXkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOworICAgICAgaW50MzJfdCBuVG9wID0gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIlRJIikKKyAgICAgICAgICAgICAgICAgICAgICAgICA/IEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJUSSIpLT5HZXRJbnRlZ2VyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7CisgICAgICBDRlhfQnl0ZVRleHRCdWYgc0JvZHk7CisgICAgICBpZiAocE9wdHMpIHsKKyAgICAgICAgRlhfRkxPQVQgZnkgPSByY0JvZHkudG9wOworICAgICAgICBmb3IgKGludDMyX3QgaSA9IG5Ub3AsIHN6ID0gcE9wdHMtPkdldENvdW50KCk7IGkgPCBzejsgaSsrKSB7CisgICAgICAgICAgaWYgKElzRmxvYXRTbWFsbGVyKGZ5LCByY0JvZHkuYm90dG9tKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChDUERGX09iamVjdCogcE9wdCA9IHBPcHRzLT5HZXRFbGVtZW50VmFsdWUoaSkpIHsKKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHN3SXRlbTsKKyAgICAgICAgICAgIGlmIChwT3B0LT5Jc1N0cmluZygpKQorICAgICAgICAgICAgICBzd0l0ZW0gPSBwT3B0LT5HZXRVbmljb2RlVGV4dCgpOworICAgICAgICAgICAgZWxzZSBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcE9wdC0+QXNBcnJheSgpKQorICAgICAgICAgICAgICBzd0l0ZW0gPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZSgxKS0+R2V0VW5pY29kZVRleHQoKTsKKworICAgICAgICAgICAgRlhfQk9PTCBiU2VsZWN0ZWQgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwU2VscykgeworICAgICAgICAgICAgICBmb3IgKEZYX0RXT1JEIHMgPSAwLCBzc3ogPSBwU2Vscy0+R2V0Q291bnQoKTsgcyA8IHNzejsgcysrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gcFNlbHMtPkdldEludGVnZXIocykpIHsKKyAgICAgICAgICAgICAgICAgIGJTZWxlY3RlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiQ29udGludW91cykgewotICAgICAgICAgICAgICAgIGlmIChwbGFjZS5MaW5lQ21wKG9sZHBsYWNlKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzV29yZHMuR2V0U2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc0xpbmVTdHJlYW0gPDwgR2V0V29yZFJlbmRlclN0cmluZyhzV29yZHMuR2V0Qnl0ZVN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNFZGl0U3RyZWFtIDw8IHNMaW5lU3RyZWFtOwotICAgICAgICAgICAgICAgICAgICAgICAgc0xpbmVTdHJlYW0uQ2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNXb3Jkcy5DbGVhcigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIENQVlRfV29yZCB3b3JkOwotICAgICAgICAgICAgICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdE5ldyA9IENQREZfUG9pbnQod29yZC5wdFdvcmQueCArIHB0T2Zmc2V0LngsIHdvcmQucHRXb3JkLnkgKyBwdE9mZnNldC55KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENQVlRfTGluZSBsaW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgcEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHROZXcgPSBDUERGX1BvaW50KGxpbmUucHRMaW5lLnggKyBwdE9mZnNldC54LCBsaW5lLnB0TGluZS55ICsgcHRPZmZzZXQueSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHB0TmV3LnggIT0gcHRPbGQueCB8fCBwdE5ldy55ICE9IHB0T2xkLnkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNMaW5lU3RyZWFtIDw8IHB0TmV3LnggLSBwdE9sZC54IDw8ICIgIiA8PCBwdE5ldy55IC0gcHRPbGQueSA8PCAiIFRkXG4iOwotICAgICAgICAgICAgICAgICAgICAgICAgcHRPbGQgPSBwdE5ldzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDUFZUX1dvcmQgd29yZDsKLSAgICAgICAgICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3b3JkLm5Gb250SW5kZXggIT0gbkN1ckZvbnRJbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNXb3Jkcy5HZXRTaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc0xpbmVTdHJlYW0gPDwgR2V0V29yZFJlbmRlclN0cmluZyhzV29yZHMuR2V0Qnl0ZVN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzV29yZHMuQ2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNMaW5lU3RyZWFtIDw8IEdldEZvbnRTZXRTdHJpbmcocEZvbnRNYXAsIHdvcmQubkZvbnRJbmRleCwgd29yZC5mRm9udFNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbkN1ckZvbnRJbmRleCA9IHdvcmQubkZvbnRJbmRleDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzV29yZHMgPDwgR2V0UERGV29yZFN0cmluZyhwRm9udE1hcCwgbkN1ckZvbnRJbmRleCwgd29yZC5Xb3JkLCBTdWJXb3JkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2xkcGxhY2UgPSBwbGFjZTsKKyAgICAgICAgICAgIENQREZfVmFyaWFibGVUZXh0IHZ0OworICAgICAgICAgICAgdnQuU2V0UHJvdmlkZXIoJnByZCk7CisgICAgICAgICAgICB2dC5TZXRQbGF0ZVJlY3QoQ1BERl9SZWN0KHJjQm9keS5sZWZ0LCAwLjBmLCByY0JvZHkucmlnaHQsIDAuMGYpKTsKKyAgICAgICAgICAgIGlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKSB7CisgICAgICAgICAgICAgIHZ0LlNldEZvbnRTaXplKDEyLjBmKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQ1BWVF9Xb3JkIHdvcmQ7Ci0gICAgICAgICAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgewotICAgICAgICAgICAgICAgICAgICBwdE5ldyA9IENQREZfUG9pbnQod29yZC5wdFdvcmQueCArIHB0T2Zmc2V0LngsIHdvcmQucHRXb3JkLnkgKyBwdE9mZnNldC55KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHB0TmV3LnggIT0gcHRPbGQueCB8fCBwdE5ldy55ICE9IHB0T2xkLnkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNFZGl0U3RyZWFtIDw8IHB0TmV3LnggLSBwdE9sZC54IDw8ICIgIiA8PCBwdE5ldy55IC0gcHRPbGQueSA8PCAiIFRkXG4iOwotICAgICAgICAgICAgICAgICAgICAgICAgcHRPbGQgPSBwdE5ldzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAod29yZC5uRm9udEluZGV4ICE9IG5DdXJGb250SW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNFZGl0U3RyZWFtIDw8IEdldEZvbnRTZXRTdHJpbmcocEZvbnRNYXAsIHdvcmQubkZvbnRJbmRleCwgd29yZC5mRm9udFNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbkN1ckZvbnRJbmRleCA9IHdvcmQubkZvbnRJbmRleDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzRWRpdFN0cmVhbSA8PCBHZXRXb3JkUmVuZGVyU3RyaW5nKEdldFBERldvcmRTdHJpbmcocEZvbnRNYXAsIG5DdXJGb250SW5kZXgsIHdvcmQuV29yZCwgU3ViV29yZCkpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgdnQuU2V0Rm9udFNpemUoZkZvbnRTaXplKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZ0LkluaXRpYWxpemUoKTsKKyAgICAgICAgICAgIHZ0LlNldFRleHQoc3dJdGVtLmNfc3RyKCkpOworICAgICAgICAgICAgdnQuUmVhcnJhbmdlQWxsKCk7CisgICAgICAgICAgICBGWF9GTE9BVCBmSXRlbUhlaWdodCA9IHZ0LkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7CisgICAgICAgICAgICBpZiAoYlNlbGVjdGVkKSB7CisgICAgICAgICAgICAgIENQREZfUmVjdCByY0l0ZW0gPQorICAgICAgICAgICAgICAgICAgQ1BERl9SZWN0KHJjQm9keS5sZWZ0LCBmeSAtIGZJdGVtSGVpZ2h0LCByY0JvZHkucmlnaHQsIGZ5KTsKKyAgICAgICAgICAgICAgc0JvZHkgPDwgInFcbiIgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFZUX0NvbG9yKENUX1JHQiwgMCwgNTEuMGYgLyAyNTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMy4wZiAvIDI1NS4wZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKQorICAgICAgICAgICAgICAgICAgICA8PCByY0l0ZW0ubGVmdCA8PCAiICIgPDwgcmNJdGVtLmJvdHRvbSA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgPDwgcmNJdGVtLldpZHRoKCkgPDwgIiAiIDw8IHJjSXRlbS5IZWlnaHQoKSA8PCAiIHJlIGZcbiIKKyAgICAgICAgICAgICAgICAgICAgPDwgIlFcbiI7CisgICAgICAgICAgICAgIHNCb2R5IDw8ICJCVFxuIiA8PCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFZUX0NvbG9yKENUX0dSQVksIDEpLCBUUlVFKQorICAgICAgICAgICAgICAgICAgICA8PCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlRWRpdEFQKCZtYXAsIHZ0LkdldEl0ZXJhdG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Qb2ludCgwLjBmLCBmeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgMCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkVUXG4iOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc0JvZHkgPDwgIkJUXG4iIDw8IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKGNyVGV4dCwgVFJVRSkKKyAgICAgICAgICAgICAgICAgICAgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUVkaXRBUCgmbWFwLCB2dC5HZXRJdGVyYXRvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUG9pbnQoMC4wZiwgZnkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsIDApCisgICAgICAgICAgICAgICAgICAgIDw8ICJFVFxuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZ5IC09IGZJdGVtSGVpZ2h0OworICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoc1dvcmRzLkdldFNpemUoKSA+IDApIHsKKyAgICAgIH0KKyAgICAgIGlmIChzQm9keS5HZXRTaXplKCkgPiAwKSB7CisgICAgICAgIHNBcHBTdHJlYW0gPDwgIi9UeCBCTUNcbiIKKyAgICAgICAgICAgICAgICAgICA8PCAicVxuIjsKKyAgICAgICAgc0FwcFN0cmVhbSA8PCByY0JvZHkubGVmdCA8PCAiICIgPDwgcmNCb2R5LmJvdHRvbSA8PCAiICIKKyAgICAgICAgICAgICAgICAgICA8PCByY0JvZHkuV2lkdGgoKSA8PCAiICIgPDwgcmNCb2R5LkhlaWdodCgpIDw8ICIgcmVcbldcbm5cbiI7CisgICAgICAgIHNBcHBTdHJlYW0gPDwgc0JvZHkuR2V0Qnl0ZVN0cmluZygpIDw8ICJRXG5FTUNcbiI7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgfQorICBpZiAocE5vcm1hbFN0cmVhbSkgeworICAgIHBOb3JtYWxTdHJlYW0tPlNldERhdGEoKHVpbnQ4X3QqKXNBcHBTdHJlYW0uR2V0QnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtLkdldFNpemUoKSwgRkFMU0UsIEZBTFNFKTsKKyAgICBwU3RyZWFtRGljdCA9IHBOb3JtYWxTdHJlYW0tPkdldERpY3QoKTsKKyAgICBpZiAocFN0cmVhbURpY3QpIHsKKyAgICAgIHBTdHJlYW1EaWN0LT5TZXRBdE1hdHJpeCgiTWF0cml4IiwgbWF0cml4KTsKKyAgICAgIHBTdHJlYW1EaWN0LT5TZXRBdFJlY3QoIkJCb3giLCByY0JCb3gpOworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwU3RyZWFtUmVzTGlzdCA9IHBTdHJlYW1EaWN0LT5HZXREaWN0KCJSZXNvdXJjZXMiKTsKKyAgICAgIGlmIChwU3RyZWFtUmVzTGlzdCkgeworICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1SZXNGb250TGlzdCA9IHBTdHJlYW1SZXNMaXN0LT5HZXREaWN0KCJGb250Iik7CisgICAgICAgIGlmICghcFN0cmVhbVJlc0ZvbnRMaXN0KSB7CisgICAgICAgICAgcFN0cmVhbVJlc0ZvbnRMaXN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgICAgICAgICBwU3RyZWFtUmVzTGlzdC0+U2V0QXQoIkZvbnQiLCBwU3RyZWFtUmVzRm9udExpc3QpOworICAgICAgICB9CisgICAgICAgIGlmICghcFN0cmVhbVJlc0ZvbnRMaXN0LT5LZXlFeGlzdChzRm9udE5hbWUpKSB7CisgICAgICAgICAgcFN0cmVhbVJlc0ZvbnRMaXN0LT5TZXRBdFJlZmVyZW5jZShzRm9udE5hbWUsIHBEb2MsIHBGb250RGljdCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBTdHJlYW1EaWN0LT5TZXRBdCgiUmVzb3VyY2VzIiwgcEZvcm1EaWN0LT5HZXREaWN0KCJEUiIpLT5DbG9uZSgpKTsKKyAgICAgICAgcFN0cmVhbVJlc0xpc3QgPSBwU3RyZWFtRGljdC0+R2V0RGljdCgiUmVzb3VyY2VzIik7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlVGV4dEZpZWxkQVAoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkgeworICByZXR1cm4gR2VuZXJhdGVXaWRnZXRBUChwRG9jLCBwQW5ub3REaWN0LCAwKTsKK30KK0ZYX0JPT0wgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbWJvQm94QVAoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KSB7CisgIHJldHVybiBHZW5lcmF0ZVdpZGdldEFQKHBEb2MsIHBBbm5vdERpY3QsIDEpOworfQorRlhfQk9PTCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlTGlzdEJveEFQKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KSB7CisgIHJldHVybiBHZW5lcmF0ZVdpZGdldEFQKHBEb2MsIHBBbm5vdERpY3QsIDIpOworfQorQ0ZYX0J5dGVTdHJpbmcgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUVkaXRBUCgKKyAgICBJUFZUX0ZvbnRNYXAqIHBGb250TWFwLAorICAgIElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKiBwSXRlcmF0b3IsCisgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsCisgICAgRlhfQk9PTCBiQ29udGludW91cywKKyAgICBGWF9XT1JEIFN1YldvcmQsCisgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBWaXNpYmxlKSB7CisgIENGWF9CeXRlVGV4dEJ1ZiBzRWRpdFN0cmVhbSwgc0xpbmVTdHJlYW0sIHNXb3JkczsKKyAgQ1BERl9Qb2ludCBwdE9sZCgwLjBmLCAwLjBmKSwgcHROZXcoMC4wZiwgMC4wZik7CisgIGludDMyX3QgbkN1ckZvbnRJbmRleCA9IC0xOworICBpZiAocEl0ZXJhdG9yKSB7CisgICAgaWYgKHBWaXNpYmxlKSB7CisgICAgICBwSXRlcmF0b3ItPlNldEF0KHBWaXNpYmxlLT5CZWdpblBvcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBJdGVyYXRvci0+U2V0QXQoMCk7CisgICAgfQorICAgIENQVlRfV29yZFBsYWNlIG9sZHBsYWNlOworICAgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpIHsKKyAgICAgIENQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOworICAgICAgaWYgKHBWaXNpYmxlICYmIHBsYWNlLldvcmRDbXAocFZpc2libGUtPkVuZFBvcykgPiAwKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKGJDb250aW51b3VzKSB7CisgICAgICAgIGlmIChwbGFjZS5MaW5lQ21wKG9sZHBsYWNlKSAhPSAwKSB7CisgICAgICAgICAgaWYgKHNXb3Jkcy5HZXRTaXplKCkgPiAwKSB7CiAgICAgICAgICAgICBzTGluZVN0cmVhbSA8PCBHZXRXb3JkUmVuZGVyU3RyaW5nKHNXb3Jkcy5HZXRCeXRlU3RyaW5nKCkpOwogICAgICAgICAgICAgc0VkaXRTdHJlYW0gPDwgc0xpbmVTdHJlYW07CisgICAgICAgICAgICBzTGluZVN0cmVhbS5DbGVhcigpOwogICAgICAgICAgICAgc1dvcmRzLkNsZWFyKCk7CisgICAgICAgICAgfQorICAgICAgICAgIENQVlRfV29yZCB3b3JkOworICAgICAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKKyAgICAgICAgICAgIHB0TmV3ID0gQ1BERl9Qb2ludCh3b3JkLnB0V29yZC54ICsgcHRPZmZzZXQueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkLnB0V29yZC55ICsgcHRPZmZzZXQueSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENQVlRfTGluZSBsaW5lOworICAgICAgICAgICAgcEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpOworICAgICAgICAgICAgcHROZXcgPSBDUERGX1BvaW50KGxpbmUucHRMaW5lLnggKyBwdE9mZnNldC54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUucHRMaW5lLnkgKyBwdE9mZnNldC55KTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHB0TmV3LnggIT0gcHRPbGQueCB8fCBwdE5ldy55ICE9IHB0T2xkLnkpIHsKKyAgICAgICAgICAgIHNMaW5lU3RyZWFtIDw8IHB0TmV3LnggLSBwdE9sZC54IDw8ICIgIiA8PCBwdE5ldy55IC0gcHRPbGQueQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBUZFxuIjsKKyAgICAgICAgICAgIHB0T2xkID0gcHROZXc7CisgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzRWRpdFN0cmVhbS5HZXRCeXRlU3RyaW5nKCk7Ci19Ci1DRlhfQnl0ZVN0cmluZyBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQm9yZGVyQVAoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCwgRlhfRkxPQVQgZldpZHRoLAotICAgICAgICBjb25zdCBDUFZUX0NvbG9yICYgY29sb3IsIGNvbnN0IENQVlRfQ29sb3IgJiBjckxlZnRUb3AsIGNvbnN0IENQVlRfQ29sb3IgJiBjclJpZ2h0Qm90dG9tLAotICAgICAgICBGWF9JTlQzMiBuU3R5bGUsIGNvbnN0IENQVlRfRGFzaCAmIGRhc2gpCi17Ci0gICAgQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc0NvbG9yOwotICAgIEZYX0ZMT0FUIGZMZWZ0ID0gcmVjdC5sZWZ0OwotICAgIEZYX0ZMT0FUIGZSaWdodCA9IHJlY3QucmlnaHQ7Ci0gICAgRlhfRkxPQVQgZlRvcCA9IHJlY3QudG9wOwotICAgIEZYX0ZMT0FUIGZCb3R0b20gPSByZWN0LmJvdHRvbTsKLSAgICBpZiAoZldpZHRoID4gMC4wZikgewotICAgICAgICBGWF9GTE9BVCBmSGFsZldpZHRoID0gZldpZHRoIC8gMi4wZjsKLSAgICAgICAgc3dpdGNoIChuU3R5bGUpIHsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBjYXNlIFBCU19TT0xJRDoKLSAgICAgICAgICAgICAgICBzQ29sb3IgPSBHZW5lcmF0ZUNvbG9yQVAoY29sb3IsIFRSVUUpOwotICAgICAgICAgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0IDw8ICIgIiA8PCBmQm90dG9tIDw8ICIgIiA8PCBmUmlnaHQgLSBmTGVmdCA8PCAiICIgPDwgZlRvcCAtIGZCb3R0b20gPDwgIiByZVxuIjsKLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZXaWR0aCA8PCAiICIgPDwgZkJvdHRvbSArIGZXaWR0aCA8PCAiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBmUmlnaHQgLSBmTGVmdCAtIGZXaWR0aCAqIDIgPDwgIiAiIDw8IGZUb3AgLSBmQm90dG9tIC0gZldpZHRoICogMiA8PCAiIHJlXG4iOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8ICJmKlxuIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBCU19EQVNIOgotICAgICAgICAgICAgICAgIHNDb2xvciA9IEdlbmVyYXRlQ29sb3JBUChjb2xvciwgRkFMU0UpOwotICAgICAgICAgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZXaWR0aCA8PCAiIHciIDw8ICIgWyIgPDwgZGFzaC5uRGFzaCA8PCAiICIgPDwgZGFzaC5uR2FwIDw8ICJdICIgPDwgZGFzaC5uUGhhc2UgPDwgIiBkXG4iOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZldpZHRoIC8gMiA8PCAiICIgPDwgZkJvdHRvbSArIGZXaWR0aCAvIDIgPDwgIiBtXG4iOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZldpZHRoIC8gMiA8PCAiICIgPDwgZlRvcCAtIGZXaWR0aCAvIDIgPDwgIiBsXG4iOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZXaWR0aCAvIDIgPDwgIiAiIDw8IGZUb3AgLSBmV2lkdGggLyAyIDw8ICIgbFxuIjsKLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmV2lkdGggLyAyIDw8ICIgIiA8PCBmQm90dG9tICsgZldpZHRoIC8gMiA8PCAiIGxcbiI7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmV2lkdGggLyAyIDw8ICIgIiA8PCBmQm90dG9tICsgZldpZHRoIC8gMiA8PCAiIGwgU1xuIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBCU19CRVZFTEVEOgotICAgICAgICAgICAgY2FzZSBQQlNfSU5TRVQ6Ci0gICAgICAgICAgICAgICAgc0NvbG9yID0gR2VuZXJhdGVDb2xvckFQKGNyTGVmdFRvcCwgVFJVRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQ29sb3I7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoIDw8ICIgIiA8PCBmQm90dG9tICsgZkhhbGZXaWR0aCA8PCAiIG1cbiI7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoIDw8ICIgIiA8PCBmVG9wIC0gZkhhbGZXaWR0aCA8PCAiIGxcbiI7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCA8PCAiICIgPDwgZlRvcCAtIGZIYWxmV2lkdGggPDwgIiBsXG4iOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZIYWxmV2lkdGggKiAyIDw8ICIgIiA8PCBmVG9wIC0gZkhhbGZXaWR0aCAqIDIgPDwgIiBsXG4iOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZkhhbGZXaWR0aCAqIDIgPDwgIiAiIDw8IGZUb3AgLSBmSGFsZldpZHRoICogMiA8PCAiIGxcbiI7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoICogMiA8PCAiICIgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGggKiAyIDw8ICIgbCBmXG4iOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzQ29sb3IgPSBHZW5lcmF0ZUNvbG9yQVAoY3JSaWdodEJvdHRvbSwgVFJVRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQ29sb3I7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCA8PCAiICIgPDwJZlRvcCAtIGZIYWxmV2lkdGggPDwgIiBtXG4iOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZIYWxmV2lkdGggPDwgIiAiIDw8CWZCb3R0b20gKyBmSGFsZldpZHRoIDw8ICIgbFxuIjsKLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZIYWxmV2lkdGggPDwgIiAiIDw8IAlmQm90dG9tICsgZkhhbGZXaWR0aCA8PCAiIGxcbiI7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoICogMiA8PCAiICIgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGggKiAyIDw8ICIgbFxuIjsKLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmSGFsZldpZHRoICogMiA8PCAiICIgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGggKiAyIDw8ICIgbFxuIjsKLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmSGFsZldpZHRoICogMiA8PCAiICIgPDwgZlRvcCAtIGZIYWxmV2lkdGggKiAyIDw8ICIgbCBmXG4iOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzQ29sb3IgPSBHZW5lcmF0ZUNvbG9yQVAoY29sb3IsIFRSVUUpOwotICAgICAgICAgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0IDw8ICIgIiA8PCBmQm90dG9tIDw8ICIgIiA8PAlmUmlnaHQgLSBmTGVmdCA8PCAiICIgPDwgZlRvcCAtIGZCb3R0b20gPDwgIiByZVxuIjsKLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZIYWxmV2lkdGggPDwgIiAiIDw8IGZCb3R0b20gKyBmSGFsZldpZHRoIDw8ICIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGZSaWdodCAtIGZMZWZ0IC0gZkhhbGZXaWR0aCAqIDIgPDwgIiAiIDw8IGZUb3AgLSBmQm90dG9tIC0gZkhhbGZXaWR0aCAqIDIgPDwgIiByZSBmKlxuIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBCU19VTkRFUkxJTkVEOgotICAgICAgICAgICAgICAgIHNDb2xvciA9IEdlbmVyYXRlQ29sb3JBUChjb2xvciwgRkFMU0UpOwotICAgICAgICAgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOwotICAgICAgICAgICAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZXaWR0aCA8PCAiIHdcbiI7Ci0gICAgICAgICAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgPDwgIiAiIDw8IGZCb3R0b20gKyBmV2lkdGggLyAyIDw8ICIgbVxuIjsKLSAgICAgICAgICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgPDwgIiAiIDw8IGZCb3R0b20gKyBmV2lkdGggLyAyIDw8ICIgbCBTXG4iOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgQ1BWVF9Xb3JkIHdvcmQ7CisgICAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKKyAgICAgICAgICBpZiAod29yZC5uRm9udEluZGV4ICE9IG5DdXJGb250SW5kZXgpIHsKKyAgICAgICAgICAgIGlmIChzV29yZHMuR2V0U2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICBzTGluZVN0cmVhbSA8PCBHZXRXb3JkUmVuZGVyU3RyaW5nKHNXb3Jkcy5HZXRCeXRlU3RyaW5nKCkpOworICAgICAgICAgICAgICBzV29yZHMuQ2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNMaW5lU3RyZWFtIDw8IEdldEZvbnRTZXRTdHJpbmcocEZvbnRNYXAsIHdvcmQubkZvbnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZC5mRm9udFNpemUpOworICAgICAgICAgICAgbkN1ckZvbnRJbmRleCA9IHdvcmQubkZvbnRJbmRleDsKKyAgICAgICAgICB9CisgICAgICAgICAgc1dvcmRzIDw8IEdldFBERldvcmRTdHJpbmcocEZvbnRNYXAsIG5DdXJGb250SW5kZXgsIHdvcmQuV29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJXb3JkKTsKICAgICAgICAgfQorICAgICAgICBvbGRwbGFjZSA9IHBsYWNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ1BWVF9Xb3JkIHdvcmQ7CisgICAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKKyAgICAgICAgICBwdE5ldyA9IENQREZfUG9pbnQod29yZC5wdFdvcmQueCArIHB0T2Zmc2V0LngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQucHRXb3JkLnkgKyBwdE9mZnNldC55KTsKKyAgICAgICAgICBpZiAocHROZXcueCAhPSBwdE9sZC54IHx8IHB0TmV3LnkgIT0gcHRPbGQueSkgeworICAgICAgICAgICAgc0VkaXRTdHJlYW0gPDwgcHROZXcueCAtIHB0T2xkLnggPDwgIiAiIDw8IHB0TmV3LnkgLSBwdE9sZC55CisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIFRkXG4iOworICAgICAgICAgICAgcHRPbGQgPSBwdE5ldzsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHdvcmQubkZvbnRJbmRleCAhPSBuQ3VyRm9udEluZGV4KSB7CisgICAgICAgICAgICBzRWRpdFN0cmVhbSA8PCBHZXRGb250U2V0U3RyaW5nKHBGb250TWFwLCB3b3JkLm5Gb250SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQuZkZvbnRTaXplKTsKKyAgICAgICAgICAgIG5DdXJGb250SW5kZXggPSB3b3JkLm5Gb250SW5kZXg7CisgICAgICAgICAgfQorICAgICAgICAgIHNFZGl0U3RyZWFtIDw8IEdldFdvcmRSZW5kZXJTdHJpbmcoCisgICAgICAgICAgICAgIEdldFBERldvcmRTdHJpbmcocEZvbnRNYXAsIG5DdXJGb250SW5kZXgsIHdvcmQuV29yZCwgU3ViV29yZCkpOworICAgICAgICB9CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiBzQXBwU3RyZWFtLkdldEJ5dGVTdHJpbmcoKTsKKyAgICBpZiAoc1dvcmRzLkdldFNpemUoKSA+IDApIHsKKyAgICAgIHNMaW5lU3RyZWFtIDw8IEdldFdvcmRSZW5kZXJTdHJpbmcoc1dvcmRzLkdldEJ5dGVTdHJpbmcoKSk7CisgICAgICBzRWRpdFN0cmVhbSA8PCBzTGluZVN0cmVhbTsKKyAgICAgIHNXb3Jkcy5DbGVhcigpOworICAgIH0KKyAgfQorICByZXR1cm4gc0VkaXRTdHJlYW0uR2V0Qnl0ZVN0cmluZygpOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoY29uc3QgQ1BWVF9Db2xvciAmIGNvbG9yLCBjb25zdCBGWF9CT09MICYgYkZpbGxPclN0cm9rZSkKLXsKLSAgICBDRlhfQnl0ZVRleHRCdWYgc0NvbG9yU3RyZWFtOwotICAgIHN3aXRjaCAoY29sb3IubkNvbG9yVHlwZSkgewotICAgICAgICBjYXNlIENUX1JHQjoKLSAgICAgICAgICAgIHNDb2xvclN0cmVhbSA8PCBjb2xvci5mQ29sb3IxIDw8ICIgIiA8PCBjb2xvci5mQ29sb3IyIDw8ICIgIiA8PCBjb2xvci5mQ29sb3IzIDw8ICIgIgotICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChiRmlsbE9yU3Ryb2tlID8gInJnIiA6ICJSRyIpIDw8ICJcbiI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDVF9HUkFZOgotICAgICAgICAgICAgc0NvbG9yU3RyZWFtIDw8IGNvbG9yLmZDb2xvcjEgPDwgIiAiIDw8IChiRmlsbE9yU3Ryb2tlID8gImciIDogIkciKSA8PCAiXG4iOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1RfQ01ZSzoKLSAgICAgICAgICAgIHNDb2xvclN0cmVhbSA8PCBjb2xvci5mQ29sb3IxIDw8ICIgIiA8PCBjb2xvci5mQ29sb3IyIDw8ICIgIiA8PCBjb2xvci5mQ29sb3IzIDw8ICIgIiA8PCBjb2xvci5mQ29sb3I0IDw8ICIgIgotICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChiRmlsbE9yU3Ryb2tlID8gImsiIDogIksiKSA8PCAiXG4iOwotICAgICAgICAgICAgYnJlYWs7CitDRlhfQnl0ZVN0cmluZyBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQm9yZGVyQVAoCisgICAgY29uc3QgQ1BERl9SZWN0JiByZWN0LAorICAgIEZYX0ZMT0FUIGZXaWR0aCwKKyAgICBjb25zdCBDUFZUX0NvbG9yJiBjb2xvciwKKyAgICBjb25zdCBDUFZUX0NvbG9yJiBjckxlZnRUb3AsCisgICAgY29uc3QgQ1BWVF9Db2xvciYgY3JSaWdodEJvdHRvbSwKKyAgICBpbnQzMl90IG5TdHlsZSwKKyAgICBjb25zdCBDUFZUX0Rhc2gmIGRhc2gpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07CisgIENGWF9CeXRlU3RyaW5nIHNDb2xvcjsKKyAgRlhfRkxPQVQgZkxlZnQgPSByZWN0LmxlZnQ7CisgIEZYX0ZMT0FUIGZSaWdodCA9IHJlY3QucmlnaHQ7CisgIEZYX0ZMT0FUIGZUb3AgPSByZWN0LnRvcDsKKyAgRlhfRkxPQVQgZkJvdHRvbSA9IHJlY3QuYm90dG9tOworICBpZiAoZldpZHRoID4gMC4wZikgeworICAgIEZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmV2lkdGggLyAyLjBmOworICAgIHN3aXRjaCAoblN0eWxlKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgY2FzZSBQQlNfU09MSUQ6CisgICAgICAgIHNDb2xvciA9IEdlbmVyYXRlQ29sb3JBUChjb2xvciwgVFJVRSk7CisgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQ29sb3I7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCA8PCAiICIgPDwgZkJvdHRvbSA8PCAiICIgPDwgZlJpZ2h0IC0gZkxlZnQgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBmVG9wIC0gZkJvdHRvbSA8PCAiIHJlXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmV2lkdGggPDwgIiAiIDw8IGZCb3R0b20gKyBmV2lkdGggPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBmUmlnaHQgLSBmTGVmdCAtIGZXaWR0aCAqIDIgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBmVG9wIC0gZkJvdHRvbSAtIGZXaWR0aCAqIDIgPDwgIiByZVxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8ICJmKlxuIjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUEJTX0RBU0g6CisgICAgICAgIHNDb2xvciA9IEdlbmVyYXRlQ29sb3JBUChjb2xvciwgRkFMU0UpOworICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZldpZHRoIDw8ICIgdyIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgWyIgPDwgZGFzaC5uRGFzaCA8PCAiICIgPDwgZGFzaC5uR2FwIDw8ICJdICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGRhc2gublBoYXNlIDw8ICIgZFxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZldpZHRoIC8gMiA8PCAiICIgPDwgZkJvdHRvbSArIGZXaWR0aCAvIDIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgbVxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZldpZHRoIC8gMiA8PCAiICIgPDwgZlRvcCAtIGZXaWR0aCAvIDIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgbFxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZXaWR0aCAvIDIgPDwgIiAiIDw8IGZUb3AgLSBmV2lkdGggLyAyCisgICAgICAgICAgICAgICAgICAgICA8PCAiIGxcbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmV2lkdGggLyAyIDw8ICIgIiA8PCBmQm90dG9tICsgZldpZHRoIC8gMgorICAgICAgICAgICAgICAgICAgICAgPDwgIiBsXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmV2lkdGggLyAyIDw8ICIgIiA8PCBmQm90dG9tICsgZldpZHRoIC8gMgorICAgICAgICAgICAgICAgICAgICAgPDwgIiBsIFNcbiI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBCU19CRVZFTEVEOgorICAgICAgY2FzZSBQQlNfSU5TRVQ6CisgICAgICAgIHNDb2xvciA9IEdlbmVyYXRlQ29sb3JBUChjckxlZnRUb3AsIFRSVUUpOworICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoIDw8ICIgIiA8PCBmQm90dG9tICsgZkhhbGZXaWR0aAorICAgICAgICAgICAgICAgICAgICAgPDwgIiBtXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoIDw8ICIgIiA8PCBmVG9wIC0gZkhhbGZXaWR0aAorICAgICAgICAgICAgICAgICAgICAgPDwgIiBsXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCA8PCAiICIgPDwgZlRvcCAtIGZIYWxmV2lkdGgKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgbFxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZIYWxmV2lkdGggKiAyIDw8ICIgIiA8PCBmVG9wIC0gZkhhbGZXaWR0aCAqIDIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgbFxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZkhhbGZXaWR0aCAqIDIgPDwgIiAiIDw8IGZUb3AgLSBmSGFsZldpZHRoICogMgorICAgICAgICAgICAgICAgICAgICAgPDwgIiBsXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoICogMiA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGZCb3R0b20gKyBmSGFsZldpZHRoICogMiA8PCAiIGwgZlxuIjsKKyAgICAgICAgfQorICAgICAgICBzQ29sb3IgPSBHZW5lcmF0ZUNvbG9yQVAoY3JSaWdodEJvdHRvbSwgVFJVRSk7CisgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQ29sb3I7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmSGFsZldpZHRoIDw8ICIgIiA8PCBmVG9wIC0gZkhhbGZXaWR0aAorICAgICAgICAgICAgICAgICAgICAgPDwgIiBtXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCA8PCAiICIgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGgKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgbFxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZkhhbGZXaWR0aCA8PCAiICIgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGgKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgbFxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZkhhbGZXaWR0aCAqIDIgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBmQm90dG9tICsgZkhhbGZXaWR0aCAqIDIgPDwgIiBsXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCAqIDIgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBmQm90dG9tICsgZkhhbGZXaWR0aCAqIDIgPDwgIiBsXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCAqIDIgPDwgIiAiIDw8IGZUb3AgLSBmSGFsZldpZHRoICogMgorICAgICAgICAgICAgICAgICAgICAgPDwgIiBsIGZcbiI7CisgICAgICAgIH0KKyAgICAgICAgc0NvbG9yID0gR2VuZXJhdGVDb2xvckFQKGNvbG9yLCBUUlVFKTsKKyAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IHNDb2xvcjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0IDw8ICIgIiA8PCBmQm90dG9tIDw8ICIgIiA8PCBmUmlnaHQgLSBmTGVmdCA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGZUb3AgLSBmQm90dG9tIDw8ICIgcmVcbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZIYWxmV2lkdGggPDwgIiAiIDw8IGZCb3R0b20gKyBmSGFsZldpZHRoIDw8ICIgIgorICAgICAgICAgICAgICAgICAgICAgPDwgZlJpZ2h0IC0gZkxlZnQgLSBmSGFsZldpZHRoICogMiA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGZUb3AgLSBmQm90dG9tIC0gZkhhbGZXaWR0aCAqIDIgPDwgIiByZSBmKlxuIjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUEJTX1VOREVSTElORUQ6CisgICAgICAgIHNDb2xvciA9IEdlbmVyYXRlQ29sb3JBUChjb2xvciwgRkFMU0UpOworICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZldpZHRoIDw8ICIgd1xuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0IDw8ICIgIiA8PCBmQm90dG9tICsgZldpZHRoIC8gMiA8PCAiIG1cbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgPDwgIiAiIDw8IGZCb3R0b20gKyBmV2lkdGggLyAyIDw8ICIgbCBTXG4iOworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICByZXR1cm4gc0NvbG9yU3RyZWFtLkdldEJ5dGVTdHJpbmcoKTsKKyAgfQorICByZXR1cm4gc0FwcFN0cmVhbS5HZXRCeXRlU3RyaW5nKCk7Cit9CitDRlhfQnl0ZVN0cmluZyBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUChjb25zdCBDUFZUX0NvbG9yJiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0JPT0wmIGJGaWxsT3JTdHJva2UpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNDb2xvclN0cmVhbTsKKyAgc3dpdGNoIChjb2xvci5uQ29sb3JUeXBlKSB7CisgICAgY2FzZSBDVF9SR0I6CisgICAgICBzQ29sb3JTdHJlYW0gPDwgY29sb3IuZkNvbG9yMSA8PCAiICIgPDwgY29sb3IuZkNvbG9yMiA8PCAiICIKKyAgICAgICAgICAgICAgICAgICA8PCBjb2xvci5mQ29sb3IzIDw8ICIgIiA8PCAoYkZpbGxPclN0cm9rZSA/ICJyZyIgOiAiUkciKQorICAgICAgICAgICAgICAgICAgIDw8ICJcbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIENUX0dSQVk6CisgICAgICBzQ29sb3JTdHJlYW0gPDwgY29sb3IuZkNvbG9yMSA8PCAiICIgPDwgKGJGaWxsT3JTdHJva2UgPyAiZyIgOiAiRyIpCisgICAgICAgICAgICAgICAgICAgPDwgIlxuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1RfQ01ZSzoKKyAgICAgIHNDb2xvclN0cmVhbSA8PCBjb2xvci5mQ29sb3IxIDw8ICIgIiA8PCBjb2xvci5mQ29sb3IyIDw8ICIgIgorICAgICAgICAgICAgICAgICAgIDw8IGNvbG9yLmZDb2xvcjMgPDwgIiAiIDw8IGNvbG9yLmZDb2xvcjQgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgPDwgKGJGaWxsT3JTdHJva2UgPyAiayIgOiAiSyIpIDw8ICJcbiI7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gc0NvbG9yU3RyZWFtLkdldEJ5dGVTdHJpbmcoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Jhc2ljLmNwcCBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Jhc2ljLmNwcAppbmRleCA0OGYzY2NhLi4zZmI5OTc4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19iYXNpYy5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfYmFzaWMuY3BwCkBAIC0xLDU3MiArMSw1MzMgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgiCisKIGNvbnN0IGludCBuTWF4UmVjdXJzaW9uID0gMzI7Ci1pbnQgQ1BERl9EZXN0OjpHZXRQYWdlSW5kZXgoQ1BERl9Eb2N1bWVudCogcERvYykKLXsKLSAgICBpZiAobV9wT2JqID09IE5VTEwgfHwgbV9wT2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcFBhZ2UgPSAoKENQREZfQXJyYXkqKW1fcE9iaiktPkdldEVsZW1lbnRWYWx1ZSgwKTsKLSAgICBpZiAocFBhZ2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKHBQYWdlLT5HZXRUeXBlKCkgPT0gUERGT0JKX05VTUJFUikgewotICAgICAgICByZXR1cm4gcFBhZ2UtPkdldEludGVnZXIoKTsKLSAgICB9Ci0gICAgaWYgKHBQYWdlLT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBwRG9jLT5HZXRQYWdlSW5kZXgocFBhZ2UtPkdldE9iak51bSgpKTsKLX0KLUZYX0RXT1JEIENQREZfRGVzdDo6R2V0UGFnZU9iak51bSgpCi17Ci0gICAgaWYgKG1fcE9iaiA9PSBOVUxMIHx8IG1fcE9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBQYWdlID0gKChDUERGX0FycmF5KiltX3BPYmopLT5HZXRFbGVtZW50VmFsdWUoMCk7Ci0gICAgaWYgKHBQYWdlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChwUGFnZS0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIpIHsKLSAgICAgICAgcmV0dXJuIHBQYWdlLT5HZXRJbnRlZ2VyKCk7Ci0gICAgfQotICAgIGlmIChwUGFnZS0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgIHJldHVybiBwUGFnZS0+R2V0T2JqTnVtKCk7Ci0gICAgfQoraW50IENQREZfRGVzdDo6R2V0UGFnZUluZGV4KENQREZfRG9jdW1lbnQqIHBEb2MpIHsKKyAgQ1BERl9BcnJheSogcEFycmF5ID0gVG9BcnJheShtX3BPYmopOworICBpZiAoIXBBcnJheSkKICAgICByZXR1cm4gMDsKLX0KLWNvbnN0IEZYX0NIQVIqIGdfc1pvb21Nb2Rlc1tdID0geyJYWVoiLCAiRml0IiwgIkZpdEgiLCAiRml0ViIsICJGaXRSIiwgIkZpdEIiLCAiRml0QkgiLCAiRml0QlYiLCAiIn07Ci1pbnQgQ1BERl9EZXN0OjpHZXRab29tTW9kZSgpCi17Ci0gICAgaWYgKG1fcE9iaiA9PSBOVUxMIHx8IG1fcE9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgbW9kZTsKLSAgICBDUERGX09iamVjdCogcE9iaiA9ICgoQ1BERl9BcnJheSopbV9wT2JqKS0+R2V0RWxlbWVudFZhbHVlKDEpOwotICAgIG1vZGUgPSBwT2JqID8gcE9iai0+R2V0U3RyaW5nKCkgOiBDRlhfQnl0ZVN0cmluZygpOwotICAgIGludCBpID0gMDsKLSAgICB3aGlsZSAoZ19zWm9vbU1vZGVzW2ldWzBdICE9ICdcMCcpIHsKLSAgICAgICAgaWYgKG1vZGUgPT0gZ19zWm9vbU1vZGVzW2ldKSB7Ci0gICAgICAgICAgICByZXR1cm4gaSArIDE7Ci0gICAgICAgIH0KLSAgICAgICAgaSArKzsKLSAgICB9CisKKyAgQ1BERl9PYmplY3QqIHBQYWdlID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMCk7CisgIGlmICghcFBhZ2UpCiAgICAgcmV0dXJuIDA7CisgIGlmIChwUGFnZS0+SXNOdW1iZXIoKSkKKyAgICByZXR1cm4gcFBhZ2UtPkdldEludGVnZXIoKTsKKyAgaWYgKCFwUGFnZS0+SXNEaWN0aW9uYXJ5KCkpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBwRG9jLT5HZXRQYWdlSW5kZXgocFBhZ2UtPkdldE9iak51bSgpKTsKIH0KLUZYX0ZMT0FUIENQREZfRGVzdDo6R2V0UGFyYW0oaW50IGluZGV4KQotewotICAgIGlmIChtX3BPYmogPT0gTlVMTCB8fCBtX3BPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAoKENQREZfQXJyYXkqKW1fcE9iaiktPkdldE51bWJlcigyICsgaW5kZXgpOworRlhfRFdPUkQgQ1BERl9EZXN0OjpHZXRQYWdlT2JqTnVtKCkgeworICBDUERGX0FycmF5KiBwQXJyYXkgPSBUb0FycmF5KG1fcE9iaik7CisgIGlmICghcEFycmF5KQorICAgIHJldHVybiAwOworCisgIENQREZfT2JqZWN0KiBwUGFnZSA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKDApOworICBpZiAoIXBQYWdlKQorICAgIHJldHVybiAwOworICBpZiAocFBhZ2UtPklzTnVtYmVyKCkpCisgICAgcmV0dXJuIHBQYWdlLT5HZXRJbnRlZ2VyKCk7CisgIGlmIChwUGFnZS0+SXNEaWN0aW9uYXJ5KCkpCisgICAgcmV0dXJuIHBQYWdlLT5HZXRPYmpOdW0oKTsKKyAgcmV0dXJuIDA7CiB9Ci1DRlhfQnl0ZVN0cmluZyBDUERGX0Rlc3Q6OkdldFJlbW90ZU5hbWUoKQotewotICAgIGlmIChtX3BPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKK2NvbnN0IEZYX0NIQVIqIGdfc1pvb21Nb2Rlc1tdID0geyJYWVoiLCAgIkZpdCIsICAgIkZpdEgiLCAgIkZpdFYiLCAiRml0UiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRml0QiIsICJGaXRCSCIsICJGaXRCViIsICIifTsKK2ludCBDUERGX0Rlc3Q6OkdldFpvb21Nb2RlKCkgeworICBDUERGX0FycmF5KiBwQXJyYXkgPSBUb0FycmF5KG1fcE9iaik7CisgIGlmICghcEFycmF5KQorICAgIHJldHVybiAwOworCisgIENGWF9CeXRlU3RyaW5nIG1vZGU7CisgIENQREZfT2JqZWN0KiBwT2JqID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoMSk7CisgIG1vZGUgPSBwT2JqID8gcE9iai0+R2V0U3RyaW5nKCkgOiBDRlhfQnl0ZVN0cmluZygpOworICBpbnQgaSA9IDA7CisgIHdoaWxlIChnX3Nab29tTW9kZXNbaV1bMF0gIT0gJ1wwJykgeworICAgIGlmIChtb2RlID09IGdfc1pvb21Nb2Rlc1tpXSkgeworICAgICAgcmV0dXJuIGkgKyAxOwogICAgIH0KLSAgICByZXR1cm4gbV9wT2JqLT5HZXRTdHJpbmcoKTsKKyAgICBpKys7CisgIH0KKyAgcmV0dXJuIDA7CiB9Ci1DUERGX05hbWVUcmVlOjpDUERGX05hbWVUcmVlKENQREZfRG9jdW1lbnQqIHBEb2MsIEZYX0JTVFIgY2F0ZWdvcnkpCi17Ci0gICAgaWYgKHBEb2MtPkdldFJvb3QoKSAmJiBwRG9jLT5HZXRSb290KCktPkdldERpY3QoRlhfQlNUUkMoIk5hbWVzIikpKQotICAgICAgICBtX3BSb290ID0gcERvYy0+R2V0Um9vdCgpLT5HZXREaWN0KEZYX0JTVFJDKCJOYW1lcyIpKS0+R2V0RGljdChjYXRlZ29yeSk7Ci0gICAgZWxzZQotICAgICAgICBtX3BSb290ID0gTlVMTDsKK0ZYX0ZMT0FUIENQREZfRGVzdDo6R2V0UGFyYW0oaW50IGluZGV4KSB7CisgIENQREZfQXJyYXkqIHBBcnJheSA9IFRvQXJyYXkobV9wT2JqKTsKKyAgcmV0dXJuIHBBcnJheSA/IHBBcnJheS0+R2V0TnVtYmVyKDIgKyBpbmRleCkgOiAwOwogfQotc3RhdGljIENQREZfT2JqZWN0KiBTZWFyY2hOYW1lTm9kZShDUERGX0RpY3Rpb25hcnkqIHBOb2RlLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5JbmRleCwgQ1BERl9BcnJheSoqIHBwRmluZCwgaW50IG5MZXZlbCA9IDApCi17Ci0gICAgaWYgKG5MZXZlbCA+IG5NYXhSZWN1cnNpb24pIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBMaW1pdHMgPSBwTm9kZS0+R2V0QXJyYXkoRlhfQlNUUkMoIkxpbWl0cyIpKTsKLSAgICBpZiAocExpbWl0cyAhPSBOVUxMKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGNzTGVmdCA9IHBMaW1pdHMtPkdldFN0cmluZygwKTsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NSaWdodCA9IHBMaW1pdHMtPkdldFN0cmluZygxKTsKLSAgICAgICAgaWYgKGNzTGVmdC5Db21wYXJlKGNzUmlnaHQpID4gMCkgewotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NUbXAgPSBjc1JpZ2h0OwotICAgICAgICAgICAgY3NSaWdodCA9IGNzTGVmdDsKLSAgICAgICAgICAgIGNzTGVmdCA9IGNzVG1wOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjc05hbWUuQ29tcGFyZShjc0xlZnQpIDwgMCB8fCBjc05hbWUuQ29tcGFyZShjc1JpZ2h0KSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBOYW1lcyA9IHBOb2RlLT5HZXRBcnJheShGWF9CU1RSQygiTmFtZXMiKSk7Ci0gICAgaWYgKHBOYW1lcykgewotICAgICAgICBGWF9EV09SRCBkd0NvdW50ID0gcE5hbWVzLT5HZXRDb3VudCgpIC8gMjsKLSAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGR3Q291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNzVmFsdWUgPSBwTmFtZXMtPkdldFN0cmluZyhpICogMik7Ci0gICAgICAgICAgICBGWF9JTlQzMiBpQ29tcGFyZSA9IGNzVmFsdWUuQ29tcGFyZShjc05hbWUpOwotICAgICAgICAgICAgaWYgKGlDb21wYXJlIDw9IDApIHsKLSAgICAgICAgICAgICAgICBpZiAocHBGaW5kICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgKnBwRmluZCA9IHBOYW1lczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGlDb21wYXJlIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbkluZGV4ICs9IGk7Ci0gICAgICAgICAgICByZXR1cm4gcE5hbWVzLT5HZXRFbGVtZW50VmFsdWUoaSAqIDIgKyAxKTsKLSAgICAgICAgfQotICAgICAgICBuSW5kZXggKz0gZHdDb3VudDsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBLaWRzID0gcE5vZGUtPkdldEFycmF5KEZYX0JTVFJDKCJLaWRzIikpOwotICAgIGlmIChwS2lkcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEtpZHMtPkdldENvdW50KCk7IGkgKyspIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwS2lkID0gcEtpZHMtPkdldERpY3QoaSk7Ci0gICAgICAgIGlmIChwS2lkID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIENQREZfT2JqZWN0KiBwRm91bmQgPSBTZWFyY2hOYW1lTm9kZShwS2lkLCBjc05hbWUsIG5JbmRleCwgcHBGaW5kLCBuTGV2ZWwgKyAxKTsKLSAgICAgICAgaWYgKHBGb3VuZCkgewotICAgICAgICAgICAgcmV0dXJuIHBGb3VuZDsKLSAgICAgICAgfQotICAgIH0KK0NGWF9CeXRlU3RyaW5nIENQREZfRGVzdDo6R2V0UmVtb3RlTmFtZSgpIHsKKyAgcmV0dXJuIG1fcE9iaiA/IG1fcE9iai0+R2V0U3RyaW5nKCkgOiBDRlhfQnl0ZVN0cmluZygpOworfQorQ1BERl9OYW1lVHJlZTo6Q1BERl9OYW1lVHJlZShDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNhdGVnb3J5KSB7CisgIGlmIChwRG9jLT5HZXRSb290KCkgJiYgcERvYy0+R2V0Um9vdCgpLT5HZXREaWN0KCJOYW1lcyIpKQorICAgIG1fcFJvb3QgPSBwRG9jLT5HZXRSb290KCktPkdldERpY3QoIk5hbWVzIiktPkdldERpY3QoY2F0ZWdvcnkpOworICBlbHNlCisgICAgbV9wUm9vdCA9IE5VTEw7Cit9CitzdGF0aWMgQ1BERl9PYmplY3QqIFNlYXJjaE5hbWVOb2RlKENQREZfRGljdGlvbmFyeSogcE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiogcHBGaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkxldmVsID0gMCkgeworICBpZiAobkxldmVsID4gbk1heFJlY3Vyc2lvbikgewogICAgIHJldHVybiBOVUxMOwotfQotc3RhdGljIENQREZfT2JqZWN0KiBTZWFyY2hOYW1lTm9kZShDUERGX0RpY3Rpb25hcnkqIHBOb2RlLCBpbnQgbkluZGV4LCBpbnQmIG5DdXJJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZSwgQ1BERl9BcnJheSoqIHBwRmluZCwgaW50IG5MZXZlbCA9IDApCi17Ci0gICAgaWYgKG5MZXZlbCA+IG5NYXhSZWN1cnNpb24pIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9BcnJheSogcExpbWl0cyA9IHBOb2RlLT5HZXRBcnJheSgiTGltaXRzIik7CisgIGlmIChwTGltaXRzKSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgY3NMZWZ0ID0gcExpbWl0cy0+R2V0U3RyaW5nKDApOworICAgIENGWF9CeXRlU3RyaW5nIGNzUmlnaHQgPSBwTGltaXRzLT5HZXRTdHJpbmcoMSk7CisgICAgaWYgKGNzTGVmdC5Db21wYXJlKGNzUmlnaHQpID4gMCkgeworICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NUbXAgPSBjc1JpZ2h0OworICAgICAgY3NSaWdodCA9IGNzTGVmdDsKKyAgICAgIGNzTGVmdCA9IGNzVG1wOwogICAgIH0KLSAgICBDUERGX0FycmF5KiBwTmFtZXMgPSBwTm9kZS0+R2V0QXJyYXkoRlhfQlNUUkMoIk5hbWVzIikpOwotICAgIGlmIChwTmFtZXMpIHsKLSAgICAgICAgaW50IG5Db3VudCA9IHBOYW1lcy0+R2V0Q291bnQoKSAvIDI7Ci0gICAgICAgIGlmIChuSW5kZXggPj0gbkN1ckluZGV4ICsgbkNvdW50KSB7Ci0gICAgICAgICAgICBuQ3VySW5kZXggKz0gbkNvdW50OwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAocHBGaW5kICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqcHBGaW5kID0gcE5hbWVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY3NOYW1lID0gcE5hbWVzLT5HZXRTdHJpbmcoKG5JbmRleCAtIG5DdXJJbmRleCkgKiAyKTsKLSAgICAgICAgICAgIHJldHVybiBwTmFtZXMtPkdldEVsZW1lbnRWYWx1ZSgobkluZGV4IC0gbkN1ckluZGV4KSAqIDIgKyAxKTsKKyAgICBpZiAoY3NOYW1lLkNvbXBhcmUoY3NMZWZ0KSA8IDAgfHwgY3NOYW1lLkNvbXBhcmUoY3NSaWdodCkgPiAwKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKyAgQ1BERl9BcnJheSogcE5hbWVzID0gcE5vZGUtPkdldEFycmF5KCJOYW1lcyIpOworICBpZiAocE5hbWVzKSB7CisgICAgRlhfRFdPUkQgZHdDb3VudCA9IHBOYW1lcy0+R2V0Q291bnQoKSAvIDI7CisgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGR3Q291bnQ7IGkrKykgeworICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NWYWx1ZSA9IHBOYW1lcy0+R2V0U3RyaW5nKGkgKiAyKTsKKyAgICAgIGludDMyX3QgaUNvbXBhcmUgPSBjc1ZhbHVlLkNvbXBhcmUoY3NOYW1lKTsKKyAgICAgIGlmIChpQ29tcGFyZSA8PSAwKSB7CisgICAgICAgIGlmIChwcEZpbmQpIHsKKyAgICAgICAgICAqcHBGaW5kID0gcE5hbWVzOwogICAgICAgICB9Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBLaWRzID0gcE5vZGUtPkdldEFycmF5KEZYX0JTVFJDKCJLaWRzIikpOwotICAgIGlmIChwS2lkcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEtpZHMtPkdldENvdW50KCk7IGkgKyspIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwS2lkID0gcEtpZHMtPkdldERpY3QoaSk7Ci0gICAgICAgIGlmIChwS2lkID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoaUNvbXBhcmUgPCAwKSB7CisgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgQ1BERl9PYmplY3QqIHBGb3VuZCA9IFNlYXJjaE5hbWVOb2RlKHBLaWQsIG5JbmRleCwgbkN1ckluZGV4LCBjc05hbWUsIHBwRmluZCwgbkxldmVsICsgMSk7Ci0gICAgICAgIGlmIChwRm91bmQpIHsKLSAgICAgICAgICAgIHJldHVybiBwRm91bmQ7Ci0gICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgbkluZGV4ICs9IGk7CisgICAgICByZXR1cm4gcE5hbWVzLT5HZXRFbGVtZW50VmFsdWUoaSAqIDIgKyAxKTsKICAgICB9CisgICAgbkluZGV4ICs9IGR3Q291bnQ7CiAgICAgcmV0dXJuIE5VTEw7Ci19Ci1zdGF0aWMgaW50IENvdW50TmFtZXMoQ1BERl9EaWN0aW9uYXJ5KiBwTm9kZSwgaW50IG5MZXZlbCA9IDApCi17Ci0gICAgaWYgKG5MZXZlbCA+IG5NYXhSZWN1cnNpb24pIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBOYW1lcyA9IHBOb2RlLT5HZXRBcnJheShGWF9CU1RSQygiTmFtZXMiKSk7Ci0gICAgaWYgKHBOYW1lcykgewotICAgICAgICByZXR1cm4gcE5hbWVzLT5HZXRDb3VudCgpIC8gMjsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcEtpZHMgPSBwTm9kZS0+R2V0QXJyYXkoRlhfQlNUUkMoIktpZHMiKSk7Ci0gICAgaWYgKHBLaWRzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGludCBuQ291bnQgPSAwOwotICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwS2lkcy0+R2V0Q291bnQoKTsgaSArKykgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBLaWQgPSBwS2lkcy0+R2V0RGljdChpKTsKLSAgICAgICAgaWYgKHBLaWQgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgbkNvdW50ICs9IENvdW50TmFtZXMocEtpZCwgbkxldmVsICsgMSk7Ci0gICAgfQotICAgIHJldHVybiBuQ291bnQ7Ci19Ci1pbnQgQ1BERl9OYW1lVHJlZTo6R2V0Q291bnQoKSBjb25zdAotewotICAgIGlmIChtX3BSb290ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiA6OkNvdW50TmFtZXMobV9wUm9vdCk7Ci19Ci1pbnQgQ1BERl9OYW1lVHJlZTo6R2V0SW5kZXgoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZSkgY29uc3QKLXsKLSAgICBpZiAobV9wUm9vdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaW50IG5JbmRleCA9IDA7Ci0gICAgaWYgKFNlYXJjaE5hbWVOb2RlKG1fcFJvb3QsIGNzTmFtZSwgbkluZGV4LCBOVUxMKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIG5JbmRleDsKLX0KLUNQREZfT2JqZWN0KiBDUERGX05hbWVUcmVlOjpMb29rdXBWYWx1ZShpbnQgbkluZGV4LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lKSBjb25zdAotewotICAgIGlmIChtX3BSb290ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGludCBuQ3VySW5kZXggPSAwOwotICAgIHJldHVybiBTZWFyY2hOYW1lTm9kZShtX3BSb290LCBuSW5kZXgsIG5DdXJJbmRleCwgY3NOYW1lLCBOVUxMKTsKLX0KLUNQREZfT2JqZWN0KiBDUERGX05hbWVUcmVlOjpMb29rdXBWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lKSBjb25zdAotewotICAgIGlmIChtX3BSb290ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGludCBuSW5kZXggPSAwOwotICAgIHJldHVybiBTZWFyY2hOYW1lTm9kZShtX3BSb290LCBjc05hbWUsIG5JbmRleCwgTlVMTCk7Ci19Ci1DUERGX0FycmF5KglDUERGX05hbWVUcmVlOjpMb29rdXBOYW1lZERlc3QoQ1BERl9Eb2N1bWVudCogcERvYywgRlhfQlNUUiBzTmFtZSkKLXsKLSAgICBDUERGX09iamVjdCogcFZhbHVlID0gTG9va3VwVmFsdWUoc05hbWUpOwotICAgIGlmIChwVmFsdWUgPT0gTlVMTCkgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEZXN0cyA9IHBEb2MtPkdldFJvb3QoKS0+R2V0RGljdChGWF9CU1RSQygiRGVzdHMiKSk7Ci0gICAgICAgIGlmIChwRGVzdHMgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcFZhbHVlID0gcERlc3RzLT5HZXRFbGVtZW50VmFsdWUoc05hbWUpOwotICAgIH0KLSAgICBpZiAocFZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChwVmFsdWUtPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgcmV0dXJuIChDUERGX0FycmF5KilwVmFsdWU7Ci0gICAgfQotICAgIGlmIChwVmFsdWUtPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICByZXR1cm4gKChDUERGX0RpY3Rpb25hcnkqKXBWYWx1ZSktPkdldEFycmF5KEZYX0JTVFJDKCJEIikpOwotICAgIH0KKyAgfQorICBDUERGX0FycmF5KiBwS2lkcyA9IHBOb2RlLT5HZXRBcnJheSgiS2lkcyIpOworICBpZiAoIXBLaWRzKSB7CiAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBLaWRzLT5HZXRDb3VudCgpOyBpKyspIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBLaWQgPSBwS2lkcy0+R2V0RGljdChpKTsKKyAgICBpZiAoIXBLaWQpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBDUERGX09iamVjdCogcEZvdW5kID0KKyAgICAgICAgU2VhcmNoTmFtZU5vZGUocEtpZCwgY3NOYW1lLCBuSW5kZXgsIHBwRmluZCwgbkxldmVsICsgMSk7CisgICAgaWYgKHBGb3VuZCkgeworICAgICAgcmV0dXJuIHBGb3VuZDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7CiB9Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfIHx8IF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi1zdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgQ2hhbmdlU2xhc2hUb1BsYXRmb3JtKEZYX0xQQ1dTVFIgc3RyKQotewotICAgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKLSAgICB3aGlsZSAoKnN0cikgewotICAgICAgICBpZiAoKnN0ciA9PSAnLycpIHsKLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICAgICAgICAgIHJlc3VsdCArPSAnOic7Ci0jZWxzZQotICAgICAgICAgICAgcmVzdWx0ICs9ICdcXCc7Ci0jZW5kaWYKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCArPSAqc3RyOwotICAgICAgICB9Ci0gICAgICAgIHN0cisrOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotc3RhdGljIENGWF9XaWRlU3RyaW5nIENoYW5nZVNsYXNoVG9QREYoRlhfTFBDV1NUUiBzdHIpCi17Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0OwotICAgIHdoaWxlICgqc3RyKSB7Ci0gICAgICAgIGlmICgqc3RyID09ICdcXCcgfHwgKnN0ciA9PSAnOicpIHsKLSAgICAgICAgICAgIHJlc3VsdCArPSAnLyc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQgKz0gKnN0cjsKLSAgICAgICAgfQotICAgICAgICBzdHIrKzsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLSNlbmRpZgotc3RhdGljIENGWF9XaWRlU3RyaW5nIEZJTEVTUEVDX0RlY29kZUZpbGVOYW1lKEZYX1dTVFIgZmlsZXBhdGgpCi17Ci0gICAgaWYgKGZpbGVwYXRoLkdldExlbmd0aCgpIDw9IDEpIHsKLSAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgfQotI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgIGlmIChmaWxlcGF0aC5MZWZ0KHNpemVvZigiL01hYyIpIC0gMSkgPT0gQ0ZYX1dpZGVTdHJpbmdDKEwiL01hYyIpKSB7Ci0gICAgICAgIHJldHVybiBDaGFuZ2VTbGFzaFRvUGxhdGZvcm0oZmlsZXBhdGguR2V0UHRyKCkgKyAxKTsKLSAgICB9Ci0gICAgcmV0dXJuIENoYW5nZVNsYXNoVG9QbGF0Zm9ybShmaWxlcGF0aC5HZXRQdHIoKSk7Ci0jZWxpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotICAgIGlmIChmaWxlcGF0aC5HZXRBdCgwKSAhPSAnLycpIHsKLSAgICAgICAgcmV0dXJuIENoYW5nZVNsYXNoVG9QbGF0Zm9ybShmaWxlcGF0aC5HZXRQdHIoKSk7Ci0gICAgfQotICAgIGlmIChmaWxlcGF0aC5HZXRBdCgxKSA9PSAnLycpIHsKLSAgICAgICAgcmV0dXJuIENoYW5nZVNsYXNoVG9QbGF0Zm9ybShmaWxlcGF0aC5HZXRQdHIoKSArIDEpOwotICAgIH0KLSAgICBpZiAoZmlsZXBhdGguR2V0QXQoMikgPT0gJy8nKSB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKLSAgICAgICAgcmVzdWx0ICs9IGZpbGVwYXRoLkdldEF0KDEpOwotICAgICAgICByZXN1bHQgKz0gJzonOwotICAgICAgICByZXN1bHQgKz0gQ2hhbmdlU2xhc2hUb1BsYXRmb3JtKGZpbGVwYXRoLkdldFB0cigpICsgMik7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKLSAgICByZXN1bHQgKz0gJ1xcJzsKLSAgICByZXN1bHQgKz0gQ2hhbmdlU2xhc2hUb1BsYXRmb3JtKGZpbGVwYXRoLkdldFB0cigpKTsKLSAgICByZXR1cm4gcmVzdWx0OwotI2Vsc2UKLSAgICByZXR1cm4gZmlsZXBhdGg7Ci0jZW5kaWYKLX0KLUZYX0JPT0wgQ1BERl9GaWxlU3BlYzo6R2V0RmlsZU5hbWUoQ0ZYX1dpZGVTdHJpbmcgJmNzRmlsZU5hbWUpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG1fcE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KiltX3BPYmo7Ci0gICAgICAgIGNzRmlsZU5hbWUgPSBwRGljdC0+R2V0VW5pY29kZVRleHQoRlhfQlNUUkMoIlVGIikpOwotICAgICAgICBpZiAoY3NGaWxlTmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGNzRmlsZU5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkYiKSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJGUyIpKSA9PSBGWF9CU1RSQygiVVJMIikpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjc0ZpbGVOYW1lLklzRW1wdHkoKSkgewotICAgICAgICAgICAgaWYgKHBEaWN0LT5LZXlFeGlzdChGWF9CU1RSQygiRE9TIikpKSB7Ci0gICAgICAgICAgICAgICAgY3NGaWxlTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwocERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiRE9TIikpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJNYWMiKSkpIHsKLSAgICAgICAgICAgICAgICBjc0ZpbGVOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJNYWMiKSkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwRGljdC0+S2V5RXhpc3QoRlhfQlNUUkMoIlVuaXgiKSkpIHsKLSAgICAgICAgICAgICAgICBjc0ZpbGVOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJVbml4IikpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY3NGaWxlTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwobV9wT2JqLT5HZXRTdHJpbmcoKSk7Ci0gICAgfQotICAgIGNzRmlsZU5hbWUgPSBGSUxFU1BFQ19EZWNvZGVGaWxlTmFtZShjc0ZpbGVOYW1lKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUNQREZfRmlsZVNwZWM6OkNQREZfRmlsZVNwZWMoKQotewotICAgIG1fcE9iaiA9IENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCk7Ci0gICAgaWYgKG1fcE9iaiAhPSBOVUxMKSB7Ci0gICAgICAgICgoQ1BERl9EaWN0aW9uYXJ5KiltX3BPYmopLT5TZXRBdE5hbWUoRlhfQlNUUkMoIlR5cGUiKSwgRlhfQlNUUkMoIkZpbGVzcGVjIikpOwotICAgIH0KLX0KLUZYX0JPT0wgQ1BERl9GaWxlU3BlYzo6SXNVUkwoKSBjb25zdAotewotICAgIGlmIChtX3BPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX3BPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiAoKENQREZfRGljdGlvbmFyeSopbV9wT2JqKS0+R2V0U3RyaW5nKEZYX0JTVFJDKCJGUyIpKSA9PSBGWF9CU1RSQygiVVJMIik7Ci19Ci1DRlhfV2lkZVN0cmluZyBGSUxFU1BFQ19FbmNvZGVGaWxlTmFtZShGWF9XU1RSIGZpbGVwYXRoKQotewotICAgIGlmIChmaWxlcGF0aC5HZXRMZW5ndGgoKSA8PSAxKSB7Ci0gICAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotICAgIH0KLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotICAgIGlmIChmaWxlcGF0aC5HZXRBdCgxKSA9PSAnOicpIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0OwotICAgICAgICByZXN1bHQgPSAnLyc7Ci0gICAgICAgIHJlc3VsdCArPSBmaWxlcGF0aC5HZXRBdCgwKTsKLSAgICAgICAgaWYgKGZpbGVwYXRoLkdldEF0KDIpICE9ICdcXCcpIHsKLSAgICAgICAgICAgIHJlc3VsdCArPSAnLyc7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0ICs9IENoYW5nZVNsYXNoVG9QREYoZmlsZXBhdGguR2V0UHRyKCkgKyAyKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgaWYgKGZpbGVwYXRoLkdldEF0KDApID09ICdcXCcgJiYgZmlsZXBhdGguR2V0QXQoMSkgPT0gJ1xcJykgewotICAgICAgICByZXR1cm4gQ2hhbmdlU2xhc2hUb1BERihmaWxlcGF0aC5HZXRQdHIoKSArIDEpOwotICAgIH0KLSAgICBpZiAoZmlsZXBhdGguR2V0QXQoMCkgPT0gJ1xcJykgewotICAgICAgICBDRlhfV2lkZVN0cmluZyByZXN1bHQ7Ci0gICAgICAgIHJlc3VsdCA9ICcvJzsKLSAgICAgICAgcmVzdWx0ICs9IENoYW5nZVNsYXNoVG9QREYoZmlsZXBhdGguR2V0UHRyKCkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICByZXR1cm4gQ2hhbmdlU2xhc2hUb1BERihmaWxlcGF0aC5HZXRQdHIoKSk7Ci0jZWxpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICBpZiAoZmlsZXBhdGguTGVmdChzaXplb2YoIk1hYyIpIC0gMSkgPT0gRlhfV1NUUkMoTCJNYWMiKSkgewotICAgICAgICBDRlhfV2lkZVN0cmluZyByZXN1bHQ7Ci0gICAgICAgIHJlc3VsdCA9ICcvJzsKLSAgICAgICAgcmVzdWx0ICs9IENoYW5nZVNsYXNoVG9QREYoZmlsZXBhdGguR2V0UHRyKCkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICByZXR1cm4gQ2hhbmdlU2xhc2hUb1BERihmaWxlcGF0aC5HZXRQdHIoKSk7Ci0jZWxzZQotICAgIHJldHVybiBmaWxlcGF0aDsKLSNlbmRpZgotfQotQ1BERl9TdHJlYW0qIENQREZfRmlsZVNwZWM6OkdldEZpbGVTdHJlYW0oKSBjb25zdAotewotICAgIGlmIChtX3BPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgRlhfSU5UMzIgaVR5cGUgPSBtX3BPYmotPkdldFR5cGUoKTsKLSAgICBpZiAoaVR5cGUgPT0gUERGT0JKX1NUUkVBTSkgewotICAgICAgICByZXR1cm4gKENQREZfU3RyZWFtKiltX3BPYmo7Ci0gICAgfSBlbHNlIGlmIChpVHlwZSA9PSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkgKnBFRiA9ICgoQ1BERl9EaWN0aW9uYXJ5KiltX3BPYmopLT5HZXREaWN0KEZYX0JTVFJDKCJFRiIpKTsKLSAgICAgICAgaWYgKHBFRiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcEVGLT5HZXRTdHJlYW0oRlhfQlNUUkMoIkYiKSk7Ci0gICAgfQorc3RhdGljIENQREZfT2JqZWN0KiBTZWFyY2hOYW1lTm9kZShDUERGX0RpY3Rpb25hcnkqIHBOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5DdXJJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSoqIHBwRmluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5MZXZlbCA9IDApIHsKKyAgaWYgKG5MZXZlbCA+IG5NYXhSZWN1cnNpb24pIHsKICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX0FycmF5KiBwTmFtZXMgPSBwTm9kZS0+R2V0QXJyYXkoIk5hbWVzIik7CisgIGlmIChwTmFtZXMpIHsKKyAgICBpbnQgbkNvdW50ID0gcE5hbWVzLT5HZXRDb3VudCgpIC8gMjsKKyAgICBpZiAobkluZGV4ID49IG5DdXJJbmRleCArIG5Db3VudCkgeworICAgICAgbkN1ckluZGV4ICs9IG5Db3VudDsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAocHBGaW5kKSB7CisgICAgICAqcHBGaW5kID0gcE5hbWVzOworICAgIH0KKyAgICBjc05hbWUgPSBwTmFtZXMtPkdldFN0cmluZygobkluZGV4IC0gbkN1ckluZGV4KSAqIDIpOworICAgIHJldHVybiBwTmFtZXMtPkdldEVsZW1lbnRWYWx1ZSgobkluZGV4IC0gbkN1ckluZGV4KSAqIDIgKyAxKTsKKyAgfQorICBDUERGX0FycmF5KiBwS2lkcyA9IHBOb2RlLT5HZXRBcnJheSgiS2lkcyIpOworICBpZiAoIXBLaWRzKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBLaWRzLT5HZXRDb3VudCgpOyBpKyspIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBLaWQgPSBwS2lkcy0+R2V0RGljdChpKTsKKyAgICBpZiAoIXBLaWQpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBDUERGX09iamVjdCogcEZvdW5kID0KKyAgICAgICAgU2VhcmNoTmFtZU5vZGUocEtpZCwgbkluZGV4LCBuQ3VySW5kZXgsIGNzTmFtZSwgcHBGaW5kLCBuTGV2ZWwgKyAxKTsKKyAgICBpZiAocEZvdW5kKSB7CisgICAgICByZXR1cm4gcEZvdW5kOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKIH0KLXN0YXRpYyB2b2lkIEZQREZET0NfRklMRVNQRUNfU2V0RmlsZU5hbWUoQ1BERl9PYmplY3QgKnBPYmosIEZYX1dTVFIgd3NGaWxlTmFtZSwgRlhfQk9PTCBiVVJMKQotewotICAgIEFTU0VSVChwT2JqICE9IE5VTEwpOwotICAgIENGWF9XaWRlU3RyaW5nIHdzU3RyOwotICAgIGlmIChiVVJMKSB7Ci0gICAgICAgIHdzU3RyID0gd3NGaWxlTmFtZTsKLSAgICB9IGVsc2UgewotICAgICAgICB3c1N0ciA9IEZJTEVTUEVDX0VuY29kZUZpbGVOYW1lKHdzRmlsZU5hbWUpOworc3RhdGljIGludCBDb3VudE5hbWVzKENQREZfRGljdGlvbmFyeSogcE5vZGUsIGludCBuTGV2ZWwgPSAwKSB7CisgIGlmIChuTGV2ZWwgPiBuTWF4UmVjdXJzaW9uKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgQ1BERl9BcnJheSogcE5hbWVzID0gcE5vZGUtPkdldEFycmF5KCJOYW1lcyIpOworICBpZiAocE5hbWVzKSB7CisgICAgcmV0dXJuIHBOYW1lcy0+R2V0Q291bnQoKSAvIDI7CisgIH0KKyAgQ1BERl9BcnJheSogcEtpZHMgPSBwTm9kZS0+R2V0QXJyYXkoIktpZHMiKTsKKyAgaWYgKCFwS2lkcykgeworICAgIHJldHVybiAwOworICB9CisgIGludCBuQ291bnQgPSAwOworICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEtpZHMtPkdldENvdW50KCk7IGkrKykgeworICAgIENQREZfRGljdGlvbmFyeSogcEtpZCA9IHBLaWRzLT5HZXREaWN0KGkpOworICAgIGlmICghcEtpZCkgeworICAgICAgY29udGludWU7CiAgICAgfQotICAgIEZYX0lOVDMyIGlUeXBlID0gcE9iai0+R2V0VHlwZSgpOwotICAgIGlmIChpVHlwZSA9PSBQREZPQkpfU1RSSU5HKSB7Ci0gICAgICAgIHBPYmotPlNldFN0cmluZyhDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUod3NTdHIpKTsKLSAgICB9IGVsc2UgaWYgKGlUeXBlID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwT2JqOwotICAgICAgICBwRGljdC0+U2V0QXRTdHJpbmcoRlhfQlNUUkMoIkYiKSwgQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHdzU3RyKSk7Ci0gICAgICAgIHBEaWN0LT5TZXRBdFN0cmluZyhGWF9CU1RSQygiVUYiKSwgUERGX0VuY29kZVRleHQod3NTdHIpKTsKLSAgICB9CisgICAgbkNvdW50ICs9IENvdW50TmFtZXMocEtpZCwgbkxldmVsICsgMSk7CisgIH0KKyAgcmV0dXJuIG5Db3VudDsKIH0KLXZvaWQgQ1BERl9GaWxlU3BlYzo6U2V0RmlsZU5hbWUoRlhfV1NUUiB3c0ZpbGVOYW1lLCBGWF9CT09MIGJVUkwpCi17Ci0gICAgQVNTRVJUKG1fcE9iaiAhPSBOVUxMKTsKLSAgICBpZiAobV9wT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkgJiYgYlVSTCkgewotICAgICAgICAoKENQREZfRGljdGlvbmFyeSopbV9wT2JqKS0+U2V0QXROYW1lKEZYX0JTVFJDKCJGUyIpLCAiVVJMIik7Ci0gICAgfQotICAgIEZQREZET0NfRklMRVNQRUNfU2V0RmlsZU5hbWUobV9wT2JqLCB3c0ZpbGVOYW1lLCBiVVJMKTsKK2ludCBDUERGX05hbWVUcmVlOjpHZXRDb3VudCgpIGNvbnN0IHsKKyAgaWYgKCFtX3BSb290KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDo6Q291bnROYW1lcyhtX3BSb290KTsKIH0KLXN0YXRpYyBDRlhfV2lkZVN0cmluZyBfTWFrZVJvbWFuKGludCBudW0pCi17Ci0gICAgY29uc3QgaW50IGFyYWJpY1tdID0gewotICAgICAgICAxMDAwLCA5MDAsIDUwMCwgNDAwLCAxMDAsIDkwLCA1MCwgNDAsIDEwLCA5LCA1LCA0LCAxCi0gICAgfTsKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZyByb21hbltdID0gewotICAgICAgICBMIm0iLCBMImNtIiwgTCJkIiwgTCJjZCIsIEwiYyIsIEwieGMiLCBMImwiLCBMInhsIiwgTCJ4IiwgTCJpeCIsIEwidiIsIEwiaXYiLCBMImkiCi0gICAgfTsKLSAgICBjb25zdCBpbnQgbk1heE51bSA9IDEwMDAwMDA7Ci0gICAgbnVtICU9IG5NYXhOdW07Ci0gICAgaW50IGkgPSAwOwotICAgIENGWF9XaWRlU3RyaW5nIHdzUm9tYW5OdW1iZXI7Ci0gICAgd2hpbGUgKG51bSA+IDApIHsKLSAgICAgICAgd2hpbGUgKG51bSA+PSBhcmFiaWNbaV0pIHsKLSAgICAgICAgICAgIG51bSA9IG51bSAtIGFyYWJpY1tpXTsKLSAgICAgICAgICAgIHdzUm9tYW5OdW1iZXIgKz0gcm9tYW5baV07Ci0gICAgICAgIH0KLSAgICAgICAgaSA9IGkgKyAxOwotICAgIH0KLSAgICByZXR1cm4gd3NSb21hbk51bWJlcjsKLX0KLXN0YXRpYyBDRlhfV2lkZVN0cmluZyBfTWFrZUxldHRlcnMoaW50IG51bSkKLXsKLSAgICBpZiAobnVtID09IDApIHsKLSAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgfQotICAgIENGWF9XaWRlU3RyaW5nIHdzTGV0dGVyczsKLSAgICBjb25zdCBpbnQgbk1heENvdW50ID0gMTAwMDsKLSAgICBjb25zdCBpbnQgbkxldHRlckNvdW50ID0gMjY7Ci0gICAgbnVtIC09IDE7Ci0gICAgaW50IGNvdW50ID0gbnVtIC8gbkxldHRlckNvdW50ICsgMTsKLSAgICBjb3VudCAlPSBuTWF4Q291bnQ7Ci0gICAgRlhfV0NIQVIgY2ggPSBMJ2EnICsgbnVtICUgbkxldHRlckNvdW50OwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICB3c0xldHRlcnMgKz0gY2g7Ci0gICAgfQotICAgIHJldHVybiB3c0xldHRlcnM7Ci19Ci1zdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgX0dldExhYmVsTnVtUG9ydGlvbihpbnQgbnVtLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgYnNTdHlsZSkKLXsKLSAgICBDRlhfV2lkZVN0cmluZyB3c051bVBvcnRpb247Ci0gICAgaWYJCShic1N0eWxlLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gd3NOdW1Qb3J0aW9uOwotICAgIH0KLSAgICBpZiAoYnNTdHlsZSA9PSAiRCIpIHsKLSAgICAgICAgd3NOdW1Qb3J0aW9uLkZvcm1hdChMIiVkIiwgbnVtKTsKLSAgICB9IGVsc2UgaWYgKGJzU3R5bGUgPT0gIlIiKSB7Ci0gICAgICAgIHdzTnVtUG9ydGlvbiA9IF9NYWtlUm9tYW4obnVtKTsKLSAgICAgICAgd3NOdW1Qb3J0aW9uLk1ha2VVcHBlcigpOwotICAgIH0gZWxzZSBpZiAoYnNTdHlsZSA9PSAiciIpIHsKLSAgICAgICAgd3NOdW1Qb3J0aW9uID0gX01ha2VSb21hbihudW0pOwotICAgIH0gZWxzZSBpZiAoYnNTdHlsZSA9PSAiQSIpIHsKLSAgICAgICAgd3NOdW1Qb3J0aW9uID0gX01ha2VMZXR0ZXJzKG51bSk7Ci0gICAgICAgIHdzTnVtUG9ydGlvbi5NYWtlVXBwZXIoKTsKLSAgICB9IGVsc2UgaWYgKGJzU3R5bGUgPT0gImEiKSB7Ci0gICAgICAgIHdzTnVtUG9ydGlvbiA9IF9NYWtlTGV0dGVycyhudW0pOwotICAgIH0KLSAgICByZXR1cm4gd3NOdW1Qb3J0aW9uOwotfQotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9QYWdlTGFiZWw6OkdldExhYmVsKGludCBuUGFnZSkgY29uc3QKLXsKLSAgICBDRlhfV2lkZVN0cmluZyB3c0xhYmVsOwotICAgIGlmIChtX3BEb2N1bWVudCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiB3c0xhYmVsOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBQREZSb290ID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKTsKLSAgICBpZiAocFBERlJvb3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gd3NMYWJlbDsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwTGFiZWxzID0gcFBERlJvb3QtPkdldERpY3QoRlhfQlNUUkMoIlBhZ2VMYWJlbHMiKSk7Ci0gICAgQ1BERl9OdW1iZXJUcmVlIG51bWJlclRyZWUocExhYmVscyk7Ci0gICAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IE5VTEw7Ci0gICAgaW50IG4gPSBuUGFnZTsKLSAgICB3aGlsZSAobiA+PSAwKSB7Ci0gICAgICAgIHBWYWx1ZSA9IG51bWJlclRyZWUuTG9va3VwVmFsdWUobik7Ci0gICAgICAgIGlmIChwVmFsdWUgIT0gTlVMTCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbi0tOwotICAgIH0KLSAgICBpZiAocFZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgcFZhbHVlID0gcFZhbHVlLT5HZXREaXJlY3QoKTsKLSAgICAgICAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBMYWJlbCA9IChDUERGX0RpY3Rpb25hcnkqKXBWYWx1ZTsKLSAgICAgICAgICAgIGlmIChwTGFiZWwtPktleUV4aXN0KEZYX0JTVFJDKCJQIikpKSB7Ci0gICAgICAgICAgICAgICAgd3NMYWJlbCArPSBwTGFiZWwtPkdldFVuaWNvZGVUZXh0KEZYX0JTVFJDKCJQIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNOdW1iZXJpbmdTdHlsZSA9IHBMYWJlbC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJTIiksIE5VTEwpOwotICAgICAgICAgICAgaW50IG5MYWJlbE51bSA9IG5QYWdlIC0gbiArIHBMYWJlbC0+R2V0SW50ZWdlcihGWF9CU1RSQygiU3QiKSwgMSk7Ci0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c051bVBvcnRpb24gPSBfR2V0TGFiZWxOdW1Qb3J0aW9uKG5MYWJlbE51bSwgYnNOdW1iZXJpbmdTdHlsZSk7Ci0gICAgICAgICAgICB3c0xhYmVsICs9IHdzTnVtUG9ydGlvbjsKLSAgICAgICAgICAgIHJldHVybiB3c0xhYmVsOwotICAgICAgICB9Ci0gICAgfQotICAgIHdzTGFiZWwuRm9ybWF0KEwiJWQiLCBuUGFnZSArIDEpOwotICAgIHJldHVybiB3c0xhYmVsOwotfQotRlhfSU5UMzIgQ1BERl9QYWdlTGFiZWw6OkdldFBhZ2VCeUxhYmVsKEZYX0JTVFIgYnNMYWJlbCkgY29uc3QKLXsKLSAgICBpZiAobV9wRG9jdW1lbnQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcFBERlJvb3QgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpOwotICAgIGlmIChwUERGUm9vdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaW50IG5QYWdlcyA9IG1fcERvY3VtZW50LT5HZXRQYWdlQ291bnQoKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBic0xibDsKLSAgICBDRlhfQnl0ZVN0cmluZyBic09yaWcgPSBic0xhYmVsOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgblBhZ2VzOyBpKyspIHsKLSAgICAgICAgYnNMYmwgPSBQREZfRW5jb2RlVGV4dChHZXRMYWJlbChpKSk7Ci0gICAgICAgIGlmICghYnNMYmwuQ29tcGFyZShic09yaWcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQotICAgIH0KLSAgICBic0xibCA9IGJzT3JpZzsKLSAgICBpbnQgblBhZ2UgPSBGWFNZU19hdG9pKGJzTGJsKTsKLSAgICBpZiAoblBhZ2UgPiAwICYmIG5QYWdlIDw9IG5QYWdlcykgewotICAgICAgICByZXR1cm4gblBhZ2U7Ci0gICAgfQoraW50IENQREZfTmFtZVRyZWU6OkdldEluZGV4KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc05hbWUpIGNvbnN0IHsKKyAgaWYgKCFtX3BSb290KSB7CiAgICAgcmV0dXJuIC0xOworICB9CisgIGludCBuSW5kZXggPSAwOworICBpZiAoIVNlYXJjaE5hbWVOb2RlKG1fcFJvb3QsIGNzTmFtZSwgbkluZGV4LCBOVUxMKSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gbkluZGV4OwogfQotRlhfSU5UMzIgQ1BERl9QYWdlTGFiZWw6OkdldFBhZ2VCeUxhYmVsKEZYX1dTVFIgd3NMYWJlbCkgY29uc3QKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBic0xhYmVsID0gUERGX0VuY29kZVRleHQod3NMYWJlbC5HZXRQdHIoKSk7Ci0gICAgcmV0dXJuIEdldFBhZ2VCeUxhYmVsKGJzTGFiZWwpOworQ1BERl9PYmplY3QqIENQREZfTmFtZVRyZWU6Okxvb2t1cFZhbHVlKGludCBuSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZSkgY29uc3QgeworICBpZiAoIW1fcFJvb3QpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpbnQgbkN1ckluZGV4ID0gMDsKKyAgcmV0dXJuIFNlYXJjaE5hbWVOb2RlKG1fcFJvb3QsIG5JbmRleCwgbkN1ckluZGV4LCBjc05hbWUsIE5VTEwpOworfQorQ1BERl9PYmplY3QqIENQREZfTmFtZVRyZWU6Okxvb2t1cFZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc05hbWUpIGNvbnN0IHsKKyAgaWYgKCFtX3BSb290KSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaW50IG5JbmRleCA9IDA7CisgIHJldHVybiBTZWFyY2hOYW1lTm9kZShtX3BSb290LCBjc05hbWUsIG5JbmRleCwgTlVMTCk7Cit9CitDUERGX0FycmF5KiBDUERGX05hbWVUcmVlOjpMb29rdXBOYW1lZERlc3QoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNOYW1lKSB7CisgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBMb29rdXBWYWx1ZShzTmFtZSk7CisgIGlmICghcFZhbHVlKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGVzdHMgPSBwRG9jLT5HZXRSb290KCktPkdldERpY3QoIkRlc3RzIik7CisgICAgaWYgKCFwRGVzdHMpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICBwVmFsdWUgPSBwRGVzdHMtPkdldEVsZW1lbnRWYWx1ZShzTmFtZSk7CisgIH0KKyAgaWYgKCFwVmFsdWUpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIGlmIChDUERGX0FycmF5KiBwQXJyYXkgPSBwVmFsdWUtPkFzQXJyYXkoKSkKKyAgICByZXR1cm4gcEFycmF5OworICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBWYWx1ZS0+QXNEaWN0aW9uYXJ5KCkpCisgICAgcmV0dXJuIHBEaWN0LT5HZXRBcnJheSgiRCIpOworICByZXR1cm4gbnVsbHB0cjsKK30KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXyB8fCBcCisgICAgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXworc3RhdGljIENGWF9XaWRlU3RyaW5nIENoYW5nZVNsYXNoVG9QbGF0Zm9ybShjb25zdCBGWF9XQ0hBUiogc3RyKSB7CisgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKKyAgd2hpbGUgKCpzdHIpIHsKKyAgICBpZiAoKnN0ciA9PSAnLycpIHsKKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworICAgICAgcmVzdWx0ICs9ICc6JzsKKyNlbHNlCisgICAgICByZXN1bHQgKz0gJ1xcJzsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gKnN0cjsKKyAgICB9CisgICAgc3RyKys7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KK3N0YXRpYyBDRlhfV2lkZVN0cmluZyBDaGFuZ2VTbGFzaFRvUERGKGNvbnN0IEZYX1dDSEFSKiBzdHIpIHsKKyAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0OworICB3aGlsZSAoKnN0cikgeworICAgIGlmICgqc3RyID09ICdcXCcgfHwgKnN0ciA9PSAnOicpIHsKKyAgICAgIHJlc3VsdCArPSAnLyc7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAqc3RyOworICAgIH0KKyAgICBzdHIrKzsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCitzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgRklMRVNQRUNfRGVjb2RlRmlsZU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlcGF0aCkgeworICBpZiAoZmlsZXBhdGguR2V0TGVuZ3RoKCkgPD0gMSkgeworICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICB9CisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyAgaWYgKGZpbGVwYXRoLkxlZnQoc2l6ZW9mKCIvTWFjIikgLSAxKSA9PSBDRlhfV2lkZVN0cmluZ0MoTCIvTWFjIikpIHsKKyAgICByZXR1cm4gQ2hhbmdlU2xhc2hUb1BsYXRmb3JtKGZpbGVwYXRoLkdldFB0cigpICsgMSk7CisgIH0KKyAgcmV0dXJuIENoYW5nZVNsYXNoVG9QbGF0Zm9ybShmaWxlcGF0aC5HZXRQdHIoKSk7CisjZWxpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisgIGlmIChmaWxlcGF0aC5HZXRBdCgwKSAhPSAnLycpIHsKKyAgICByZXR1cm4gQ2hhbmdlU2xhc2hUb1BsYXRmb3JtKGZpbGVwYXRoLkdldFB0cigpKTsKKyAgfQorICBpZiAoZmlsZXBhdGguR2V0QXQoMSkgPT0gJy8nKSB7CisgICAgcmV0dXJuIENoYW5nZVNsYXNoVG9QbGF0Zm9ybShmaWxlcGF0aC5HZXRQdHIoKSArIDEpOworICB9CisgIGlmIChmaWxlcGF0aC5HZXRBdCgyKSA9PSAnLycpIHsKKyAgICBDRlhfV2lkZVN0cmluZyByZXN1bHQ7CisgICAgcmVzdWx0ICs9IGZpbGVwYXRoLkdldEF0KDEpOworICAgIHJlc3VsdCArPSAnOic7CisgICAgcmVzdWx0ICs9IENoYW5nZVNsYXNoVG9QbGF0Zm9ybShmaWxlcGF0aC5HZXRQdHIoKSArIDIpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0OworICByZXN1bHQgKz0gJ1xcJzsKKyAgcmVzdWx0ICs9IENoYW5nZVNsYXNoVG9QbGF0Zm9ybShmaWxlcGF0aC5HZXRQdHIoKSk7CisgIHJldHVybiByZXN1bHQ7CisjZWxzZQorICByZXR1cm4gZmlsZXBhdGg7CisjZW5kaWYKK30KK0ZYX0JPT0wgQ1BERl9GaWxlU3BlYzo6R2V0RmlsZU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIGNzRmlsZU5hbWUpIGNvbnN0IHsKKyAgaWYgKCFtX3BPYmopIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BPYmotPkFzRGljdGlvbmFyeSgpKSB7CisgICAgY3NGaWxlTmFtZSA9IHBEaWN0LT5HZXRVbmljb2RlVGV4dCgiVUYiKTsKKyAgICBpZiAoY3NGaWxlTmFtZS5Jc0VtcHR5KCkpIHsKKyAgICAgIGNzRmlsZU5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBEaWN0LT5HZXRTdHJpbmcoIkYiKSk7CisgICAgfQorICAgIGlmIChwRGljdC0+R2V0U3RyaW5nKCJGUyIpID09ICJVUkwiKSB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgaWYgKGNzRmlsZU5hbWUuSXNFbXB0eSgpKSB7CisgICAgICBpZiAocERpY3QtPktleUV4aXN0KCJET1MiKSkgeworICAgICAgICBjc0ZpbGVOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChwRGljdC0+R2V0U3RyaW5nKCJET1MiKSk7CisgICAgICB9IGVsc2UgaWYgKHBEaWN0LT5LZXlFeGlzdCgiTWFjIikpIHsKKyAgICAgICAgY3NGaWxlTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwocERpY3QtPkdldFN0cmluZygiTWFjIikpOworICAgICAgfSBlbHNlIGlmIChwRGljdC0+S2V5RXhpc3QoIlVuaXgiKSkgeworICAgICAgICBjc0ZpbGVOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChwRGljdC0+R2V0U3RyaW5nKCJVbml4IikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjc0ZpbGVOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChtX3BPYmotPkdldFN0cmluZygpKTsKKyAgfQorICBjc0ZpbGVOYW1lID0gRklMRVNQRUNfRGVjb2RlRmlsZU5hbWUoY3NGaWxlTmFtZSk7CisgIHJldHVybiBUUlVFOworfQorQ1BERl9GaWxlU3BlYzo6Q1BERl9GaWxlU3BlYygpIHsKKyAgbV9wT2JqID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgaWYgKENQREZfRGljdGlvbmFyeSogcERpY3QgPSBUb0RpY3Rpb25hcnkobV9wT2JqKSkgeworICAgIHBEaWN0LT5TZXRBdE5hbWUoIlR5cGUiLCAiRmlsZXNwZWMiKTsKKyAgfQorfQorRlhfQk9PTCBDUERGX0ZpbGVTcGVjOjpJc1VSTCgpIGNvbnN0IHsKKyAgaWYgKENQREZfRGljdGlvbmFyeSogcERpY3QgPSBUb0RpY3Rpb25hcnkobV9wT2JqKSkgeworICAgIHJldHVybiBwRGljdC0+R2V0U3RyaW5nKCJGUyIpID09ICJVUkwiOworICB9CisgIHJldHVybiBGQUxTRTsKK30KK0NGWF9XaWRlU3RyaW5nIEZJTEVTUEVDX0VuY29kZUZpbGVOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZXBhdGgpIHsKKyAgaWYgKGZpbGVwYXRoLkdldExlbmd0aCgpIDw9IDEpIHsKKyAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgfQorI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyAgaWYgKGZpbGVwYXRoLkdldEF0KDEpID09ICc6JykgeworICAgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKKyAgICByZXN1bHQgPSAnLyc7CisgICAgcmVzdWx0ICs9IGZpbGVwYXRoLkdldEF0KDApOworICAgIGlmIChmaWxlcGF0aC5HZXRBdCgyKSAhPSAnXFwnKSB7CisgICAgICByZXN1bHQgKz0gJy8nOworICAgIH0KKyAgICByZXN1bHQgKz0gQ2hhbmdlU2xhc2hUb1BERihmaWxlcGF0aC5HZXRQdHIoKSArIDIpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgaWYgKGZpbGVwYXRoLkdldEF0KDApID09ICdcXCcgJiYgZmlsZXBhdGguR2V0QXQoMSkgPT0gJ1xcJykgeworICAgIHJldHVybiBDaGFuZ2VTbGFzaFRvUERGKGZpbGVwYXRoLkdldFB0cigpICsgMSk7CisgIH0KKyAgaWYgKGZpbGVwYXRoLkdldEF0KDApID09ICdcXCcpIHsKKyAgICBDRlhfV2lkZVN0cmluZyByZXN1bHQ7CisgICAgcmVzdWx0ID0gJy8nOworICAgIHJlc3VsdCArPSBDaGFuZ2VTbGFzaFRvUERGKGZpbGVwYXRoLkdldFB0cigpKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIHJldHVybiBDaGFuZ2VTbGFzaFRvUERGKGZpbGVwYXRoLkdldFB0cigpKTsKKyNlbGlmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisgIGlmIChmaWxlcGF0aC5MZWZ0KHNpemVvZigiTWFjIikgLSAxKSA9PSBGWF9XU1RSQyhMIk1hYyIpKSB7CisgICAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0OworICAgIHJlc3VsdCA9ICcvJzsKKyAgICByZXN1bHQgKz0gQ2hhbmdlU2xhc2hUb1BERihmaWxlcGF0aC5HZXRQdHIoKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICByZXR1cm4gQ2hhbmdlU2xhc2hUb1BERihmaWxlcGF0aC5HZXRQdHIoKSk7CisjZWxzZQorICByZXR1cm4gZmlsZXBhdGg7CisjZW5kaWYKK30KK0NQREZfU3RyZWFtKiBDUERGX0ZpbGVTcGVjOjpHZXRGaWxlU3RyZWFtKCkgY29uc3QgeworICBpZiAoIW1fcE9iaikKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgaWYgKENQREZfU3RyZWFtKiBwU3RyZWFtID0gbV9wT2JqLT5Bc1N0cmVhbSgpKQorICAgIHJldHVybiBwU3RyZWFtOworICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRUYgPSBtX3BPYmotPkFzRGljdGlvbmFyeSgpLT5HZXREaWN0KCJFRiIpKQorICAgIHJldHVybiBwRUYtPkdldFN0cmVhbSgiRiIpOworICByZXR1cm4gbnVsbHB0cjsKK30KK3N0YXRpYyB2b2lkIEZQREZET0NfRklMRVNQRUNfU2V0RmlsZU5hbWUoQ1BERl9PYmplY3QqIHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVVJMKSB7CisgIENGWF9XaWRlU3RyaW5nIHdzU3RyOworICBpZiAoYlVSTCkgeworICAgIHdzU3RyID0gd3NGaWxlTmFtZTsKKyAgfSBlbHNlIHsKKyAgICB3c1N0ciA9IEZJTEVTUEVDX0VuY29kZUZpbGVOYW1lKHdzRmlsZU5hbWUpOworICB9CisgIGlmIChwT2JqLT5Jc1N0cmluZygpKSB7CisgICAgcE9iai0+U2V0U3RyaW5nKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh3c1N0cikpOworICB9IGVsc2UgaWYgKENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwT2JqLT5Bc0RpY3Rpb25hcnkoKSkgeworICAgIHBEaWN0LT5TZXRBdFN0cmluZygiRiIsIENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh3c1N0cikpOworICAgIHBEaWN0LT5TZXRBdFN0cmluZygiVUYiLCBQREZfRW5jb2RlVGV4dCh3c1N0cikpOworICB9Cit9Cit2b2lkIENQREZfRmlsZVNwZWM6OlNldEZpbGVOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVVJMKSB7CisgIGlmIChiVVJMKSB7CisgICAgaWYgKENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BPYmotPkFzRGljdGlvbmFyeSgpKSB7CisgICAgICBwRGljdC0+U2V0QXROYW1lKCJGUyIsICJVUkwiKTsKKyAgICB9CisgIH0KKyAgRlBERkRPQ19GSUxFU1BFQ19TZXRGaWxlTmFtZShtX3BPYmosIHdzRmlsZU5hbWUsIGJVUkwpOworfQorc3RhdGljIENGWF9XaWRlU3RyaW5nIF9NYWtlUm9tYW4oaW50IG51bSkgeworICBjb25zdCBpbnQgYXJhYmljW10gPSB7MTAwMCwgOTAwLCA1MDAsIDQwMCwgMTAwLCA5MCwgNTAsIDQwLCAxMCwgOSwgNSwgNCwgMX07CisgIGNvbnN0IENGWF9XaWRlU3RyaW5nIHJvbWFuW10gPSB7TCJtIiwgIEwiY20iLCBMImQiLCAgTCJjZCIsIEwiYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJ4YyIsIEwibCIsICBMInhsIiwgTCJ4IiwgIEwiaXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwidiIsICBMIml2IiwgTCJpIn07CisgIGNvbnN0IGludCBuTWF4TnVtID0gMTAwMDAwMDsKKyAgbnVtICU9IG5NYXhOdW07CisgIGludCBpID0gMDsKKyAgQ0ZYX1dpZGVTdHJpbmcgd3NSb21hbk51bWJlcjsKKyAgd2hpbGUgKG51bSA+IDApIHsKKyAgICB3aGlsZSAobnVtID49IGFyYWJpY1tpXSkgeworICAgICAgbnVtID0gbnVtIC0gYXJhYmljW2ldOworICAgICAgd3NSb21hbk51bWJlciArPSByb21hbltpXTsKKyAgICB9CisgICAgaSA9IGkgKyAxOworICB9CisgIHJldHVybiB3c1JvbWFuTnVtYmVyOworfQorc3RhdGljIENGWF9XaWRlU3RyaW5nIF9NYWtlTGV0dGVycyhpbnQgbnVtKSB7CisgIGlmIChudW0gPT0gMCkgeworICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICB9CisgIENGWF9XaWRlU3RyaW5nIHdzTGV0dGVyczsKKyAgY29uc3QgaW50IG5NYXhDb3VudCA9IDEwMDA7CisgIGNvbnN0IGludCBuTGV0dGVyQ291bnQgPSAyNjsKKyAgbnVtIC09IDE7CisgIGludCBjb3VudCA9IG51bSAvIG5MZXR0ZXJDb3VudCArIDE7CisgIGNvdW50ICU9IG5NYXhDb3VudDsKKyAgRlhfV0NIQVIgY2ggPSBMJ2EnICsgbnVtICUgbkxldHRlckNvdW50OworICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICB3c0xldHRlcnMgKz0gY2g7CisgIH0KKyAgcmV0dXJuIHdzTGV0dGVyczsKK30KK3N0YXRpYyBDRlhfV2lkZVN0cmluZyBfR2V0TGFiZWxOdW1Qb3J0aW9uKGludCBudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgYnNTdHlsZSkgeworICBDRlhfV2lkZVN0cmluZyB3c051bVBvcnRpb247CisgIGlmIChic1N0eWxlLklzRW1wdHkoKSkgeworICAgIHJldHVybiB3c051bVBvcnRpb247CisgIH0KKyAgaWYgKGJzU3R5bGUgPT0gIkQiKSB7CisgICAgd3NOdW1Qb3J0aW9uLkZvcm1hdChMIiVkIiwgbnVtKTsKKyAgfSBlbHNlIGlmIChic1N0eWxlID09ICJSIikgeworICAgIHdzTnVtUG9ydGlvbiA9IF9NYWtlUm9tYW4obnVtKTsKKyAgICB3c051bVBvcnRpb24uTWFrZVVwcGVyKCk7CisgIH0gZWxzZSBpZiAoYnNTdHlsZSA9PSAiciIpIHsKKyAgICB3c051bVBvcnRpb24gPSBfTWFrZVJvbWFuKG51bSk7CisgIH0gZWxzZSBpZiAoYnNTdHlsZSA9PSAiQSIpIHsKKyAgICB3c051bVBvcnRpb24gPSBfTWFrZUxldHRlcnMobnVtKTsKKyAgICB3c051bVBvcnRpb24uTWFrZVVwcGVyKCk7CisgIH0gZWxzZSBpZiAoYnNTdHlsZSA9PSAiYSIpIHsKKyAgICB3c051bVBvcnRpb24gPSBfTWFrZUxldHRlcnMobnVtKTsKKyAgfQorICByZXR1cm4gd3NOdW1Qb3J0aW9uOworfQorQ0ZYX1dpZGVTdHJpbmcgQ1BERl9QYWdlTGFiZWw6OkdldExhYmVsKGludCBuUGFnZSkgY29uc3QgeworICBDRlhfV2lkZVN0cmluZyB3c0xhYmVsOworICBpZiAoIW1fcERvY3VtZW50KSB7CisgICAgcmV0dXJuIHdzTGFiZWw7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUERGUm9vdCA9IG1fcERvY3VtZW50LT5HZXRSb290KCk7CisgIGlmICghcFBERlJvb3QpIHsKKyAgICByZXR1cm4gd3NMYWJlbDsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBMYWJlbHMgPSBwUERGUm9vdC0+R2V0RGljdCgiUGFnZUxhYmVscyIpOworICBDUERGX051bWJlclRyZWUgbnVtYmVyVHJlZShwTGFiZWxzKTsKKyAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IE5VTEw7CisgIGludCBuID0gblBhZ2U7CisgIHdoaWxlIChuID49IDApIHsKKyAgICBwVmFsdWUgPSBudW1iZXJUcmVlLkxvb2t1cFZhbHVlKG4pOworICAgIGlmIChwVmFsdWUpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBuLS07CisgIH0KKyAgaWYgKHBWYWx1ZSkgeworICAgIHBWYWx1ZSA9IHBWYWx1ZS0+R2V0RGlyZWN0KCk7CisgICAgaWYgKENQREZfRGljdGlvbmFyeSogcExhYmVsID0gcFZhbHVlLT5Bc0RpY3Rpb25hcnkoKSkgeworICAgICAgaWYgKHBMYWJlbC0+S2V5RXhpc3QoIlAiKSkgeworICAgICAgICB3c0xhYmVsICs9IHBMYWJlbC0+R2V0VW5pY29kZVRleHQoIlAiKTsKKyAgICAgIH0KKyAgICAgIENGWF9CeXRlU3RyaW5nIGJzTnVtYmVyaW5nU3R5bGUgPSBwTGFiZWwtPkdldFN0cmluZygiUyIsIE5VTEwpOworICAgICAgaW50IG5MYWJlbE51bSA9IG5QYWdlIC0gbiArIHBMYWJlbC0+R2V0SW50ZWdlcigiU3QiLCAxKTsKKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzTnVtUG9ydGlvbiA9CisgICAgICAgICAgX0dldExhYmVsTnVtUG9ydGlvbihuTGFiZWxOdW0sIGJzTnVtYmVyaW5nU3R5bGUpOworICAgICAgd3NMYWJlbCArPSB3c051bVBvcnRpb247CisgICAgICByZXR1cm4gd3NMYWJlbDsKKyAgICB9CisgIH0KKyAgd3NMYWJlbC5Gb3JtYXQoTCIlZCIsIG5QYWdlICsgMSk7CisgIHJldHVybiB3c0xhYmVsOworfQoraW50MzJfdCBDUERGX1BhZ2VMYWJlbDo6R2V0UGFnZUJ5TGFiZWwoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0xhYmVsKSBjb25zdCB7CisgIGlmICghbV9wRG9jdW1lbnQpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUERGUm9vdCA9IG1fcERvY3VtZW50LT5HZXRSb290KCk7CisgIGlmICghcFBERlJvb3QpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaW50IG5QYWdlcyA9IG1fcERvY3VtZW50LT5HZXRQYWdlQ291bnQoKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnNMYmw7CisgIENGWF9CeXRlU3RyaW5nIGJzT3JpZyA9IGJzTGFiZWw7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgblBhZ2VzOyBpKyspIHsKKyAgICBic0xibCA9IFBERl9FbmNvZGVUZXh0KEdldExhYmVsKGkpKTsKKyAgICBpZiAoIWJzTGJsLkNvbXBhcmUoYnNPcmlnKSkgeworICAgICAgcmV0dXJuIGk7CisgICAgfQorICB9CisgIGJzTGJsID0gYnNPcmlnOworICBpbnQgblBhZ2UgPSBGWFNZU19hdG9pKGJzTGJsKTsKKyAgaWYgKG5QYWdlID4gMCAmJiBuUGFnZSA8PSBuUGFnZXMpIHsKKyAgICByZXR1cm4gblBhZ2U7CisgIH0KKyAgcmV0dXJuIC0xOworfQoraW50MzJfdCBDUERGX1BhZ2VMYWJlbDo6R2V0UGFnZUJ5TGFiZWwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0xhYmVsKSBjb25zdCB7CisgIENGWF9CeXRlU3RyaW5nIGJzTGFiZWwgPSBQREZfRW5jb2RlVGV4dCh3c0xhYmVsLkdldFB0cigpKTsKKyAgcmV0dXJuIEdldFBhZ2VCeUxhYmVsKGJzTGFiZWwpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfYm9va21hcmsuY3BwIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfYm9va21hcmsuY3BwCmluZGV4IDEwZWYwN2UuLmI0MzVmYzYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Jvb2ttYXJrLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19ib29rbWFyay5jcHAKQEAgLTEsOTggKzEsOTEgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKLSNpbmNsdWRlICIuLi8uLi8uLi90aGlyZF9wYXJ0eS9iYXNlL25vbnN0ZF91bmlxdWVfcHRyLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9kb2MuaCIKIAotQ1BERl9Cb29rbWFyayBDUERGX0Jvb2ttYXJrVHJlZTo6R2V0Rmlyc3RDaGlsZChjb25zdCBDUERGX0Jvb2ttYXJrJiBwYXJlbnQpIGNvbnN0Ci17Ci0gICAgaWYgKCFwYXJlbnQubV9wRGljdCkgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKS0+R2V0RGljdCgiT3V0bGluZXMiKTsKLSAgICAgICAgaWYgKCFwUm9vdCkgewotICAgICAgICAgICAgcmV0dXJuIENQREZfQm9va21hcmsoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ1BERl9Cb29rbWFyayhwUm9vdC0+R2V0RGljdCgiRmlyc3QiKSk7CitDUERGX0Jvb2ttYXJrIENQREZfQm9va21hcmtUcmVlOjpHZXRGaXJzdENoaWxkKAorICAgIGNvbnN0IENQREZfQm9va21hcmsmIHBhcmVudCkgY29uc3QgeworICBpZiAoIXBhcmVudC5tX3BEaWN0KSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IG1fcERvY3VtZW50LT5HZXRSb290KCktPkdldERpY3QoIk91dGxpbmVzIik7CisgICAgaWYgKCFwUm9vdCkgeworICAgICAgcmV0dXJuIENQREZfQm9va21hcmsoKTsKICAgICB9Ci0gICAgcmV0dXJuIENQREZfQm9va21hcmsocGFyZW50Lm1fcERpY3QtPkdldERpY3QoIkZpcnN0IikpOworICAgIHJldHVybiBDUERGX0Jvb2ttYXJrKHBSb290LT5HZXREaWN0KCJGaXJzdCIpKTsKKyAgfQorICByZXR1cm4gQ1BERl9Cb29rbWFyayhwYXJlbnQubV9wRGljdC0+R2V0RGljdCgiRmlyc3QiKSk7CiB9Ci1DUERGX0Jvb2ttYXJrIENQREZfQm9va21hcmtUcmVlOjpHZXROZXh0U2libGluZyhjb25zdCBDUERGX0Jvb2ttYXJrJiBib29rbWFyaykgY29uc3QKLXsKLSAgICBpZiAoIWJvb2ttYXJrLm1fcERpY3QpIHsKLSAgICAgICAgcmV0dXJuIENQREZfQm9va21hcmsoKTsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5ICpwTmV4dCA9IGJvb2ttYXJrLm1fcERpY3QtPkdldERpY3QoIk5leHQiKTsKLSAgICByZXR1cm4gcE5leHQgPT0gYm9va21hcmsubV9wRGljdCA/IENQREZfQm9va21hcmsoKSA6IENQREZfQm9va21hcmsocE5leHQpOworQ1BERl9Cb29rbWFyayBDUERGX0Jvb2ttYXJrVHJlZTo6R2V0TmV4dFNpYmxpbmcoCisgICAgY29uc3QgQ1BERl9Cb29rbWFyayYgYm9va21hcmspIGNvbnN0IHsKKyAgaWYgKCFib29rbWFyay5tX3BEaWN0KSB7CisgICAgcmV0dXJuIENQREZfQm9va21hcmsoKTsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBOZXh0ID0gYm9va21hcmsubV9wRGljdC0+R2V0RGljdCgiTmV4dCIpOworICByZXR1cm4gcE5leHQgPT0gYm9va21hcmsubV9wRGljdCA/IENQREZfQm9va21hcmsoKSA6IENQREZfQm9va21hcmsocE5leHQpOwogfQotRlhfRFdPUkQgQ1BERl9Cb29rbWFyazo6R2V0Q29sb3JSZWYoKSBjb25zdAotewotICAgIGlmICghbV9wRGljdCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcENvbG9yID0gbV9wRGljdC0+R2V0QXJyYXkoIkMiKTsKLSAgICBpZiAoIXBDb2xvcikgewotICAgICAgICByZXR1cm4gRlhTWVNfUkdCKDAsIDAsIDApOwotICAgIH0KLSAgICBpbnQgciA9IEZYU1lTX3JvdW5kKHBDb2xvci0+R2V0TnVtYmVyKDApICogMjU1KTsKLSAgICBpbnQgZyA9IEZYU1lTX3JvdW5kKHBDb2xvci0+R2V0TnVtYmVyKDEpICogMjU1KTsKLSAgICBpbnQgYiA9IEZYU1lTX3JvdW5kKHBDb2xvci0+R2V0TnVtYmVyKDIpICogMjU1KTsKLSAgICByZXR1cm4gRlhTWVNfUkdCKHIsIGcsIGIpOworRlhfRFdPUkQgQ1BERl9Cb29rbWFyazo6R2V0Q29sb3JSZWYoKSBjb25zdCB7CisgIGlmICghbV9wRGljdCkgeworICAgIHJldHVybiAwOworICB9CisgIENQREZfQXJyYXkqIHBDb2xvciA9IG1fcERpY3QtPkdldEFycmF5KCJDIik7CisgIGlmICghcENvbG9yKSB7CisgICAgcmV0dXJuIEZYU1lTX1JHQigwLCAwLCAwKTsKKyAgfQorICBpbnQgciA9IEZYU1lTX3JvdW5kKHBDb2xvci0+R2V0TnVtYmVyKDApICogMjU1KTsKKyAgaW50IGcgPSBGWFNZU19yb3VuZChwQ29sb3ItPkdldE51bWJlcigxKSAqIDI1NSk7CisgIGludCBiID0gRlhTWVNfcm91bmQocENvbG9yLT5HZXROdW1iZXIoMikgKiAyNTUpOworICByZXR1cm4gRlhTWVNfUkdCKHIsIGcsIGIpOwogfQotRlhfRFdPUkQgQ1BERl9Cb29rbWFyazo6R2V0Rm9udFN0eWxlKCkgY29uc3QKLXsKLSAgICBpZiAoIW1fcERpY3QpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBtX3BEaWN0LT5HZXRJbnRlZ2VyKCJGIik7CitGWF9EV09SRCBDUERGX0Jvb2ttYXJrOjpHZXRGb250U3R5bGUoKSBjb25zdCB7CisgIGlmICghbV9wRGljdCkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBtX3BEaWN0LT5HZXRJbnRlZ2VyKCJGIik7CiB9Ci1DRlhfV2lkZVN0cmluZyBDUERGX0Jvb2ttYXJrOjpHZXRUaXRsZSgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3BEaWN0KSB7Ci0gICAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotICAgIH0KLSAgICBDUERGX1N0cmluZyogcFN0cmluZyA9IChDUERGX1N0cmluZyopbV9wRGljdC0+R2V0RWxlbWVudFZhbHVlKCJUaXRsZSIpOwotICAgIGlmICghcFN0cmluZyB8fCBwU3RyaW5nLT5HZXRUeXBlKCkgIT0gUERGT0JKX1NUUklORykgewotICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgICB9Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgdGl0bGUgPSBwU3RyaW5nLT5HZXRVbmljb2RlVGV4dCgpOwotICAgIGludCBsZW4gPSB0aXRsZS5HZXRMZW5ndGgoKTsKLSAgICBpZiAoIWxlbikgewotICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgICB9Ci0gICAgbm9uc3RkOjp1bmlxdWVfcHRyPEZYX1dDSEFSW10+IGJ1ZihuZXcgRlhfV0NIQVJbbGVuXSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICBGWF9XQ0hBUiB3ID0gdGl0bGVbaV07Ci0gICAgICAgIGJ1ZltpXSA9IHcgPiAweDIwID8gdyA6IDB4MjA7Ci0gICAgfQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZyhidWYuZ2V0KCksIGxlbik7CitDRlhfV2lkZVN0cmluZyBDUERGX0Jvb2ttYXJrOjpHZXRUaXRsZSgpIGNvbnN0IHsKKyAgaWYgKCFtX3BEaWN0KSB7CisgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7CisgIH0KKyAgQ1BERl9TdHJpbmcqIHBTdHJpbmcgPSBUb1N0cmluZyhtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoIlRpdGxlIikpOworICBpZiAoIXBTdHJpbmcpCisgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7CisKKyAgQ0ZYX1dpZGVTdHJpbmcgdGl0bGUgPSBwU3RyaW5nLT5HZXRVbmljb2RlVGV4dCgpOworICBpbnQgbGVuID0gdGl0bGUuR2V0TGVuZ3RoKCk7CisgIGlmICghbGVuKSB7CisgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7CisgIH0KKyAgc3RkOjp1bmlxdWVfcHRyPEZYX1dDSEFSW10+IGJ1ZihuZXcgRlhfV0NIQVJbbGVuXSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBGWF9XQ0hBUiB3ID0gdGl0bGVbaV07CisgICAgYnVmW2ldID0gdyA+IDB4MjAgPyB3IDogMHgyMDsKKyAgfQorICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoYnVmLmdldCgpLCBsZW4pOwogfQotQ1BERl9EZXN0IENQREZfQm9va21hcms6OkdldERlc3QoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KSBjb25zdAotewotICAgIGlmICghbV9wRGljdCkgewotICAgICAgICByZXR1cm4gQ1BERl9EZXN0KCk7Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwRGVzdCA9IG1fcERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiRGVzdCIpOwotICAgIGlmICghcERlc3QpIHsKLSAgICAgICAgcmV0dXJuIENQREZfRGVzdCgpOwotICAgIH0KLSAgICBpZiAocERlc3QtPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSSU5HIHx8IHBEZXN0LT5HZXRUeXBlKCkgPT0gUERGT0JKX05BTUUpIHsKLSAgICAgICAgQ1BERl9OYW1lVHJlZSBuYW1lX3RyZWUocERvY3VtZW50LCBGWF9CU1RSQygiRGVzdHMiKSk7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nQyBuYW1lID0gcERlc3QtPkdldFN0cmluZygpOwotICAgICAgICByZXR1cm4gQ1BERl9EZXN0KG5hbWVfdHJlZS5Mb29rdXBOYW1lZERlc3QocERvY3VtZW50LCBuYW1lKSk7Ci0gICAgfQotICAgIGlmIChwRGVzdC0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm4gQ1BERl9EZXN0KChDUERGX0FycmF5KilwRGVzdCk7Ci0gICAgfQorQ1BERl9EZXN0IENQREZfQm9va21hcms6OkdldERlc3QoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KSBjb25zdCB7CisgIGlmICghbV9wRGljdCkKICAgICByZXR1cm4gQ1BERl9EZXN0KCk7CisKKyAgQ1BERl9PYmplY3QqIHBEZXN0ID0gbV9wRGljdC0+R2V0RWxlbWVudFZhbHVlKCJEZXN0Iik7CisgIGlmICghcERlc3QpCisgICAgcmV0dXJuIENQREZfRGVzdCgpOworICBpZiAocERlc3QtPklzU3RyaW5nKCkgfHwgcERlc3QtPklzTmFtZSgpKSB7CisgICAgQ1BERl9OYW1lVHJlZSBuYW1lX3RyZWUocERvY3VtZW50LCAiRGVzdHMiKTsKKyAgICBDRlhfQnl0ZVN0cmluZ0MgbmFtZSA9IHBEZXN0LT5HZXRTdHJpbmcoKTsKKyAgICByZXR1cm4gQ1BERl9EZXN0KG5hbWVfdHJlZS5Mb29rdXBOYW1lZERlc3QocERvY3VtZW50LCBuYW1lKSk7CisgIH0KKyAgaWYgKENQREZfQXJyYXkqIHBBcnJheSA9IHBEZXN0LT5Bc0FycmF5KCkpCisgICAgcmV0dXJuIENQREZfRGVzdChwQXJyYXkpOworICByZXR1cm4gQ1BERl9EZXN0KCk7CiB9Ci1DUERGX0FjdGlvbiBDUERGX0Jvb2ttYXJrOjpHZXRBY3Rpb24oKSBjb25zdAotewotICAgIGlmICghbV9wRGljdCkgewotICAgICAgICByZXR1cm4gQ1BERl9BY3Rpb24oKTsKLSAgICB9Ci0gICAgcmV0dXJuIENQREZfQWN0aW9uKG1fcERpY3QtPkdldERpY3QoIkEiKSk7CitDUERGX0FjdGlvbiBDUERGX0Jvb2ttYXJrOjpHZXRBY3Rpb24oKSBjb25zdCB7CisgIGlmICghbV9wRGljdCkgeworICAgIHJldHVybiBDUERGX0FjdGlvbigpOworICB9CisgIHJldHVybiBDUERGX0FjdGlvbihtX3BEaWN0LT5HZXREaWN0KCJBIikpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfZm9ybS5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19mb3JtLmNwcAppbmRleCAzMjlkNTNiLi44Nzc2MzM3IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19mb3JtLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19mb3JtLmNwcApAQCAtMSwxNjQwICsxLDEyMzYgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfeG1sLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9kb2MuaCIKICNpbmNsdWRlICJkb2NfdXRpbHMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCiAKIGNvbnN0IGludCBuTWF4UmVjdXJzaW9uID0gMzI7CiAKLWNsYXNzIF9DRmllbGROYW1lRXh0cmFjdG9yIAotewotcHVibGljOgotICAgIF9DRmllbGROYW1lRXh0cmFjdG9yKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmdWxsX25hbWUpCi0gICAgewotICAgICAgICBtX3BTdGFydCA9IGZ1bGxfbmFtZS5jX3N0cigpOwotICAgICAgICBtX3BFbmQgPSBtX3BTdGFydCArIGZ1bGxfbmFtZS5HZXRMZW5ndGgoKTsKLSAgICAgICAgbV9wQ3VyID0gbV9wU3RhcnQ7CitjbGFzcyBDRmllbGROYW1lRXh0cmFjdG9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENGaWVsZE5hbWVFeHRyYWN0b3IoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZ1bGxfbmFtZSkgeworICAgIG1fcFN0YXJ0ID0gZnVsbF9uYW1lLmNfc3RyKCk7CisgICAgbV9wRW5kID0gbV9wU3RhcnQgKyBmdWxsX25hbWUuR2V0TGVuZ3RoKCk7CisgICAgbV9wQ3VyID0gbV9wU3RhcnQ7CisgIH0KKyAgdm9pZCBHZXROZXh0KGNvbnN0IEZYX1dDSEFSKiYgcFN1Yk5hbWUsIEZYX1NUUlNJWkUmIHNpemUpIHsKKyAgICBwU3ViTmFtZSA9IG1fcEN1cjsKKyAgICB3aGlsZSAobV9wQ3VyIDwgbV9wRW5kICYmIG1fcEN1clswXSAhPSBMJy4nKSB7CisgICAgICBtX3BDdXIrKzsKICAgICB9Ci0gICAgdm9pZCBHZXROZXh0KEZYX0xQQ1dTVFIgJnBTdWJOYW1lLCBGWF9TVFJTSVpFJiBzaXplKQotICAgIHsKLSAgICAgICAgcFN1Yk5hbWUgPSBtX3BDdXI7Ci0gICAgICAgIHdoaWxlIChtX3BDdXIgPCBtX3BFbmQgJiYgbV9wQ3VyWzBdICE9IEwnLicpIHsKLSAgICAgICAgICAgIG1fcEN1cisrOwotICAgICAgICB9Ci0gICAgICAgIHNpemUgPSAoRlhfU1RSU0laRSkobV9wQ3VyIC0gcFN1Yk5hbWUpOwotICAgICAgICBpZiAobV9wQ3VyIDwgbV9wRW5kICYmIG1fcEN1clswXSA9PSBMJy4nKSB7Ci0gICAgICAgICAgICBtX3BDdXIrKzsKLSAgICAgICAgfQorICAgIHNpemUgPSAoRlhfU1RSU0laRSkobV9wQ3VyIC0gcFN1Yk5hbWUpOworICAgIGlmIChtX3BDdXIgPCBtX3BFbmQgJiYgbV9wQ3VyWzBdID09IEwnLicpIHsKKyAgICAgIG1fcEN1cisrOwogICAgIH0KLXByb3RlY3RlZDoKLSAgICBGWF9MUENXU1RSIG1fcFN0YXJ0OwotICAgIEZYX0xQQ1dTVFIgbV9wRW5kOwotICAgIEZYX0xQQ1dTVFIgbV9wQ3VyOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIGNvbnN0IEZYX1dDSEFSKiBtX3BTdGFydDsKKyAgY29uc3QgRlhfV0NIQVIqIG1fcEVuZDsKKyAgY29uc3QgRlhfV0NIQVIqIG1fcEN1cjsKIH07Ci1jbGFzcyBDRmllbGRUcmVlIAotewotcHVibGljOgotICAgIHN0cnVjdCBfTm9kZSAgewotICAgICAgICBfTm9kZSAqcGFyZW50OwotICAgICAgICBDRlhfUHRyQXJyYXkgY2hpbGRyZW47Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHNob3J0X25hbWU7Ci0gICAgICAgIENQREZfRm9ybUZpZWxkICpmaWVsZF9wdHI7Ci0gICAgICAgIGludCBDb3VudEZpZWxkcyhpbnQgbkxldmVsID0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG5MZXZlbCA+IG5NYXhSZWN1cnNpb24pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmaWVsZF9wdHIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLkdldFNpemUoKTsgaSArKykgewotICAgICAgICAgICAgICAgIGNvdW50ICs9ICgoX05vZGUgKiljaGlsZHJlbi5HZXRBdChpKSktPkNvdW50RmllbGRzKG5MZXZlbCArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvdW50OworY2xhc3MgQ0ZpZWxkVHJlZSB7CisgcHVibGljOgorICBzdHJ1Y3QgX05vZGUgeworICAgIF9Ob2RlKiBwYXJlbnQ7CisgICAgQ0ZYX0FycmF5VGVtcGxhdGU8X05vZGUqPiBjaGlsZHJlbjsKKyAgICBDRlhfV2lkZVN0cmluZyBzaG9ydF9uYW1lOworICAgIENQREZfRm9ybUZpZWxkKiBmaWVsZF9wdHI7CisgICAgaW50IENvdW50RmllbGRzKGludCBuTGV2ZWwgPSAwKSB7CisgICAgICBpZiAobkxldmVsID4gbk1heFJlY3Vyc2lvbikgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF9wdHIpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBpbnQgY291bnQgPSAwOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5HZXRTaXplKCk7IGkrKykgeworICAgICAgICBjb3VudCArPSBjaGlsZHJlbi5HZXRBdChpKS0+Q291bnRGaWVsZHMobkxldmVsICsgMSk7CisgICAgICB9CisgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorICAgIENQREZfRm9ybUZpZWxkKiBHZXRGaWVsZChpbnQqIGZpZWxkc190b19nbykgeworICAgICAgaWYgKGZpZWxkX3B0cikgeworICAgICAgICBpZiAoKmZpZWxkc190b19nbyA9PSAwKSB7CisgICAgICAgICAgcmV0dXJuIGZpZWxkX3B0cjsKICAgICAgICAgfQotICAgICAgICBDUERGX0Zvcm1GaWVsZCogR2V0RmllbGQoaW50KiBmaWVsZHNfdG9fZ28pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChmaWVsZF9wdHIpIHsKLSAgICAgICAgICAgICAgICBpZiAoKmZpZWxkc190b19nbyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZF9wdHI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC0tKmZpZWxkc190b19nbzsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uR2V0U2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBfTm9kZSAqcE5vZGUgPSAoX05vZGUgKiljaGlsZHJlbi5HZXRBdChpKTsKLSAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gcE5vZGUtPkdldEZpZWxkKGZpZWxkc190b19nbyk7Ci0gICAgICAgICAgICAgICAgaWYgKHBGaWVsZCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcEZpZWxkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIENQREZfRm9ybUZpZWxkKiBHZXRGaWVsZChpbnQgaW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBmaWVsZHNfdG9fZ28gPSBpbmRleDsKLSAgICAgICAgICAgIHJldHVybiBHZXRGaWVsZCgmZmllbGRzX3RvX2dvKTsKLSAgICAgICAgfQotICAgIH07Ci0gICAgQ0ZpZWxkVHJlZSgpOwotICAgIH5DRmllbGRUcmVlKCk7Ci0gICAgdm9pZCBTZXRGaWVsZChjb25zdCBDRlhfV2lkZVN0cmluZyAmZnVsbF9uYW1lLCBDUERGX0Zvcm1GaWVsZCAqZmllbGRfcHRyKTsKLSAgICBDUERGX0Zvcm1GaWVsZCAqR2V0RmllbGQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJmZ1bGxfbmFtZSk7Ci0gICAgQ1BERl9Gb3JtRmllbGQgKlJlbW92ZUZpZWxkKGNvbnN0IENGWF9XaWRlU3RyaW5nICZmdWxsX25hbWUpOwotICAgIHZvaWQgUmVtb3ZlQWxsKCk7Ci0gICAgX05vZGUgKkZpbmROb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nICZmdWxsX25hbWUpOwotICAgIF9Ob2RlICogQWRkQ2hpbGQoX05vZGUgKnBQYXJlbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZzaG9ydF9uYW1lLCBDUERGX0Zvcm1GaWVsZCAqZmllbGRfcHRyKTsKLSAgICB2b2lkIFJlbW92ZU5vZGUoX05vZGUgKnBOb2RlLCBpbnQgbkxldmVsID0gMCk7Ci0gICAgX05vZGUgKl9Mb29rdXAoX05vZGUgKnBQYXJlbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZzaG9ydF9uYW1lKTsKLSAgICBfTm9kZSBtX1Jvb3Q7Ci19OwotQ0ZpZWxkVHJlZTo6Q0ZpZWxkVHJlZSgpCi17Ci0gICAgbV9Sb290LnBhcmVudCA9IE5VTEw7Ci0gICAgbV9Sb290LmZpZWxkX3B0ciA9IE5VTEw7Ci19Ci1DRmllbGRUcmVlOjp+Q0ZpZWxkVHJlZSgpCi17Ci0gICAgUmVtb3ZlQWxsKCk7Ci19Ci1DRmllbGRUcmVlOjpfTm9kZSAqQ0ZpZWxkVHJlZTo6QWRkQ2hpbGQoX05vZGUgKnBQYXJlbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZzaG9ydF9uYW1lLCBDUERGX0Zvcm1GaWVsZCAqZmllbGRfcHRyKQotewotICAgIGlmIChwUGFyZW50ID09IE5VTEwpIHsKKyAgICAgICAgLS0qZmllbGRzX3RvX2dvOwogICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uR2V0U2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBjaGlsZHJlbi5HZXRBdChpKS0+R2V0RmllbGQoZmllbGRzX3RvX2dvKSkKKyAgICAgICAgICByZXR1cm4gcEZpZWxkOworICAgICAgfQorICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIF9Ob2RlKiBwTm9kZSA9IG5ldyBfTm9kZTsKLSAgICBwTm9kZS0+cGFyZW50ID0gcFBhcmVudDsKLSAgICBwTm9kZS0+c2hvcnRfbmFtZSA9IHNob3J0X25hbWU7CisgICAgQ1BERl9Gb3JtRmllbGQqIEdldEZpZWxkKGludCBpbmRleCkgeworICAgICAgaW50IGZpZWxkc190b19nbyA9IGluZGV4OworICAgICAgcmV0dXJuIEdldEZpZWxkKCZmaWVsZHNfdG9fZ28pOworICAgIH0KKyAgfTsKKyAgQ0ZpZWxkVHJlZSgpOworICB+Q0ZpZWxkVHJlZSgpOworICB2b2lkIFNldEZpZWxkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmdWxsX25hbWUsIENQREZfRm9ybUZpZWxkKiBmaWVsZF9wdHIpOworICBDUERGX0Zvcm1GaWVsZCogR2V0RmllbGQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZ1bGxfbmFtZSk7CisgIENQREZfRm9ybUZpZWxkKiBSZW1vdmVGaWVsZChjb25zdCBDRlhfV2lkZVN0cmluZyYgZnVsbF9uYW1lKTsKKyAgdm9pZCBSZW1vdmVBbGwoKTsKKyAgX05vZGUqIEZpbmROb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmdWxsX25hbWUpOworICBfTm9kZSogQWRkQ2hpbGQoX05vZGUqIHBQYXJlbnQsCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2hvcnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBmaWVsZF9wdHIpOworICB2b2lkIFJlbW92ZU5vZGUoX05vZGUqIHBOb2RlLCBpbnQgbkxldmVsID0gMCk7CisgIF9Ob2RlKiBfTG9va3VwKF9Ob2RlKiBwUGFyZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2hvcnRfbmFtZSk7CisgIF9Ob2RlIG1fUm9vdDsKK307CitDRmllbGRUcmVlOjpDRmllbGRUcmVlKCkgeworICBtX1Jvb3QucGFyZW50ID0gTlVMTDsKKyAgbV9Sb290LmZpZWxkX3B0ciA9IE5VTEw7Cit9CitDRmllbGRUcmVlOjp+Q0ZpZWxkVHJlZSgpIHsKKyAgUmVtb3ZlQWxsKCk7Cit9CitDRmllbGRUcmVlOjpfTm9kZSogQ0ZpZWxkVHJlZTo6QWRkQ2hpbGQoX05vZGUqIHBQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNob3J0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIGZpZWxkX3B0cikgeworICBpZiAoIXBQYXJlbnQpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBfTm9kZSogcE5vZGUgPSBuZXcgX05vZGU7CisgIHBOb2RlLT5wYXJlbnQgPSBwUGFyZW50OworICBwTm9kZS0+c2hvcnRfbmFtZSA9IHNob3J0X25hbWU7CisgIHBOb2RlLT5maWVsZF9wdHIgPSBmaWVsZF9wdHI7CisgIHBQYXJlbnQtPmNoaWxkcmVuLkFkZChwTm9kZSk7CisgIHJldHVybiBwTm9kZTsKK30KK3ZvaWQgQ0ZpZWxkVHJlZTo6UmVtb3ZlTm9kZShfTm9kZSogcE5vZGUsIGludCBuTGV2ZWwpIHsKKyAgaWYgKCFwTm9kZSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAobkxldmVsIDw9IG5NYXhSZWN1cnNpb24pIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBOb2RlLT5jaGlsZHJlbi5HZXRTaXplKCk7IGkrKykgeworICAgICAgUmVtb3ZlTm9kZShwTm9kZS0+Y2hpbGRyZW5baV0sIG5MZXZlbCArIDEpOworICAgIH0KKyAgfQorICBkZWxldGUgcE5vZGU7Cit9CitDRmllbGRUcmVlOjpfTm9kZSogQ0ZpZWxkVHJlZTo6X0xvb2t1cChfTm9kZSogcFBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzaG9ydF9uYW1lKSB7CisgIGlmICghcFBhcmVudCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcFBhcmVudC0+Y2hpbGRyZW4uR2V0U2l6ZSgpOyBpKyspIHsKKyAgICBfTm9kZSogcE5vZGUgPSBwUGFyZW50LT5jaGlsZHJlbltpXTsKKyAgICBpZiAocE5vZGUtPnNob3J0X25hbWUuR2V0TGVuZ3RoKCkgPT0gc2hvcnRfbmFtZS5HZXRMZW5ndGgoKSAmJgorICAgICAgICBGWFNZU19tZW1jbXAocE5vZGUtPnNob3J0X25hbWUuY19zdHIoKSwgc2hvcnRfbmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgc2hvcnRfbmFtZS5HZXRMZW5ndGgoKSAqIHNpemVvZihGWF9XQ0hBUikpID09IDApIHsKKyAgICAgIHJldHVybiBwTm9kZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9Cit2b2lkIENGaWVsZFRyZWU6OlJlbW92ZUFsbCgpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1Jvb3QuY2hpbGRyZW4uR2V0U2l6ZSgpOyBpKyspIHsKKyAgICBSZW1vdmVOb2RlKG1fUm9vdC5jaGlsZHJlbltpXSk7CisgIH0KK30KK3ZvaWQgQ0ZpZWxkVHJlZTo6U2V0RmllbGQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZ1bGxfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIGZpZWxkX3B0cikgeworICBpZiAoZnVsbF9uYW1lID09IEwiIikgeworICAgIHJldHVybjsKKyAgfQorICBDRmllbGROYW1lRXh0cmFjdG9yIG5hbWVfZXh0cmFjdG9yKGZ1bGxfbmFtZSk7CisgIGNvbnN0IEZYX1dDSEFSKiBwTmFtZTsKKyAgRlhfU1RSU0laRSBuTGVuZ3RoOworICBuYW1lX2V4dHJhY3Rvci5HZXROZXh0KHBOYW1lLCBuTGVuZ3RoKTsKKyAgX05vZGUgKnBOb2RlID0gJm1fUm9vdCwgKnBMYXN0ID0gTlVMTDsKKyAgd2hpbGUgKG5MZW5ndGggPiAwKSB7CisgICAgcExhc3QgPSBwTm9kZTsKKyAgICBDRlhfV2lkZVN0cmluZyBuYW1lID0gQ0ZYX1dpZGVTdHJpbmcocE5hbWUsIG5MZW5ndGgpOworICAgIHBOb2RlID0gX0xvb2t1cChwTGFzdCwgbmFtZSk7CisgICAgaWYgKCFwTm9kZSkgeworICAgICAgcE5vZGUgPSBBZGRDaGlsZChwTGFzdCwgbmFtZSwgTlVMTCk7CisgICAgfQorICAgIG5hbWVfZXh0cmFjdG9yLkdldE5leHQocE5hbWUsIG5MZW5ndGgpOworICB9CisgIGlmIChwTm9kZSAhPSAmbV9Sb290KSB7CiAgICAgcE5vZGUtPmZpZWxkX3B0ciA9IGZpZWxkX3B0cjsKLSAgICBwUGFyZW50LT5jaGlsZHJlbi5BZGQocE5vZGUpOwotICAgIHJldHVybiBwTm9kZTsKKyAgfQogfQotdm9pZCBDRmllbGRUcmVlOjpSZW1vdmVOb2RlKF9Ob2RlICpwTm9kZSwgaW50IG5MZXZlbCkKLXsKLSAgICBpZiAocE5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gOwotICAgIH0KLSAgICBpZiAobkxldmVsID4gbk1heFJlY3Vyc2lvbikgewotICAgICAgICBkZWxldGUgcE5vZGU7Ci0gICAgICAgIHJldHVybiA7Ci0gICAgfQotICAgIENGWF9QdHJBcnJheSYgcHRyX2FycmF5ID0gcE5vZGUtPmNoaWxkcmVuOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHRyX2FycmF5LkdldFNpemUoKTsgaSArKykgewotICAgICAgICBfTm9kZSAqcENoaWxkID0gKF9Ob2RlICopcHRyX2FycmF5W2ldOwotICAgICAgICBSZW1vdmVOb2RlKHBDaGlsZCwgbkxldmVsICsgMSk7Ci0gICAgfQotICAgIGRlbGV0ZSBwTm9kZTsKLX0KLUNGaWVsZFRyZWU6Ol9Ob2RlICpDRmllbGRUcmVlOjpfTG9va3VwKF9Ob2RlICpwUGFyZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyAmc2hvcnRfbmFtZSkKLXsKLSAgICBpZiAocFBhcmVudCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDRlhfUHRyQXJyYXkmIHB0cl9hcnJheSA9IHBQYXJlbnQtPmNoaWxkcmVuOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHRyX2FycmF5LkdldFNpemUoKTsgaSArKykgewotICAgICAgICBfTm9kZSAqcE5vZGUgPSAoX05vZGUgKilwdHJfYXJyYXlbaV07Ci0gICAgICAgIGlmIChwTm9kZS0+c2hvcnRfbmFtZS5HZXRMZW5ndGgoKSA9PSBzaG9ydF9uYW1lLkdldExlbmd0aCgpICYmCi0gICAgICAgICAgICAgICAgRlhTWVNfbWVtY21wMzIocE5vZGUtPnNob3J0X25hbWUuY19zdHIoKSwgc2hvcnRfbmFtZS5jX3N0cigpLCBzaG9ydF9uYW1lLkdldExlbmd0aCgpKnNpemVvZihGWF9XQ0hBUikpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBwTm9kZTsKLSAgICAgICAgfQotICAgIH0KK0NQREZfRm9ybUZpZWxkKiBDRmllbGRUcmVlOjpHZXRGaWVsZChjb25zdCBDRlhfV2lkZVN0cmluZyYgZnVsbF9uYW1lKSB7CisgIGlmIChmdWxsX25hbWUgPT0gTCIiKSB7CiAgICAgcmV0dXJuIE5VTEw7Ci19Ci12b2lkIENGaWVsZFRyZWU6OlJlbW92ZUFsbCgpCi17Ci0gICAgQ0ZYX1B0ckFycmF5JiBwdHJfYXJyYXkgPSBtX1Jvb3QuY2hpbGRyZW47Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwdHJfYXJyYXkuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIF9Ob2RlICpwTm9kZSA9IChfTm9kZSAqKXB0cl9hcnJheVtpXTsKLSAgICAgICAgUmVtb3ZlTm9kZShwTm9kZSk7Ci0gICAgfQotfQotdm9pZCBDRmllbGRUcmVlOjpTZXRGaWVsZChjb25zdCBDRlhfV2lkZVN0cmluZyAmZnVsbF9uYW1lLCBDUERGX0Zvcm1GaWVsZCAqZmllbGRfcHRyKQotewotICAgIGlmIChmdWxsX25hbWUgPT0gTCIiKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgX0NGaWVsZE5hbWVFeHRyYWN0b3IgbmFtZV9leHRyYWN0b3IoZnVsbF9uYW1lKTsKLSAgICBGWF9MUENXU1RSIHBOYW1lOwotICAgIEZYX1NUUlNJWkUgbkxlbmd0aDsKKyAgfQorICBDRmllbGROYW1lRXh0cmFjdG9yIG5hbWVfZXh0cmFjdG9yKGZ1bGxfbmFtZSk7CisgIGNvbnN0IEZYX1dDSEFSKiBwTmFtZTsKKyAgRlhfU1RSU0laRSBuTGVuZ3RoOworICBuYW1lX2V4dHJhY3Rvci5HZXROZXh0KHBOYW1lLCBuTGVuZ3RoKTsKKyAgX05vZGUgKnBOb2RlID0gJm1fUm9vdCwgKnBMYXN0ID0gTlVMTDsKKyAgd2hpbGUgKG5MZW5ndGggPiAwICYmIHBOb2RlKSB7CisgICAgcExhc3QgPSBwTm9kZTsKKyAgICBDRlhfV2lkZVN0cmluZyBuYW1lID0gQ0ZYX1dpZGVTdHJpbmcocE5hbWUsIG5MZW5ndGgpOworICAgIHBOb2RlID0gX0xvb2t1cChwTGFzdCwgbmFtZSk7CiAgICAgbmFtZV9leHRyYWN0b3IuR2V0TmV4dChwTmFtZSwgbkxlbmd0aCk7Ci0gICAgX05vZGUgKnBOb2RlID0gJm1fUm9vdCwgKnBMYXN0ID0gTlVMTDsKLSAgICB3aGlsZSAobkxlbmd0aCA+IDApIHsKLSAgICAgICAgcExhc3QgPSBwTm9kZTsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgbmFtZSA9IENGWF9XaWRlU3RyaW5nKHBOYW1lLCBuTGVuZ3RoKTsKLSAgICAgICAgcE5vZGUgPSBfTG9va3VwKHBMYXN0LCBuYW1lKTsKLSAgICAgICAgaWYgKHBOb2RlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHBOb2RlID0gQWRkQ2hpbGQocExhc3QsIG5hbWUsIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIG5hbWVfZXh0cmFjdG9yLkdldE5leHQocE5hbWUsIG5MZW5ndGgpOwotICAgIH0KLSAgICBpZiAocE5vZGUgIT0gJm1fUm9vdCkgewotICAgICAgICBwTm9kZS0+ZmllbGRfcHRyID0gZmllbGRfcHRyOwotICAgIH0KKyAgfQorICByZXR1cm4gcE5vZGUgPyBwTm9kZS0+ZmllbGRfcHRyIDogTlVMTDsKIH0KLUNQREZfRm9ybUZpZWxkICpDRmllbGRUcmVlOjpHZXRGaWVsZChjb25zdCBDRlhfV2lkZVN0cmluZyAmZnVsbF9uYW1lKQotewotICAgIGlmIChmdWxsX25hbWUgPT0gTCIiKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBfQ0ZpZWxkTmFtZUV4dHJhY3RvciBuYW1lX2V4dHJhY3RvcihmdWxsX25hbWUpOwotICAgIEZYX0xQQ1dTVFIgcE5hbWU7Ci0gICAgRlhfU1RSU0laRSBuTGVuZ3RoOwotICAgIG5hbWVfZXh0cmFjdG9yLkdldE5leHQocE5hbWUsIG5MZW5ndGgpOwotICAgIF9Ob2RlICpwTm9kZSA9ICZtX1Jvb3QsICpwTGFzdCA9IE5VTEw7Ci0gICAgd2hpbGUgKG5MZW5ndGggPiAwICYmIHBOb2RlKSB7Ci0gICAgICAgIHBMYXN0ID0gcE5vZGU7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIG5hbWUgPSBDRlhfV2lkZVN0cmluZyhwTmFtZSwgbkxlbmd0aCk7Ci0gICAgICAgIHBOb2RlID0gX0xvb2t1cChwTGFzdCwgbmFtZSk7Ci0gICAgICAgIG5hbWVfZXh0cmFjdG9yLkdldE5leHQocE5hbWUsIG5MZW5ndGgpOwotICAgIH0KLSAgICByZXR1cm4gcE5vZGUgPyBwTm9kZS0+ZmllbGRfcHRyIDogTlVMTDsKLX0KLUNQREZfRm9ybUZpZWxkICpDRmllbGRUcmVlOjpSZW1vdmVGaWVsZChjb25zdCBDRlhfV2lkZVN0cmluZyAmIGZ1bGxfbmFtZSkKLXsKLSAgICBpZiAoZnVsbF9uYW1lID09IEwiIikgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgX0NGaWVsZE5hbWVFeHRyYWN0b3IgbmFtZV9leHRyYWN0b3IoZnVsbF9uYW1lKTsKLSAgICBGWF9MUENXU1RSIHBOYW1lOwotICAgIEZYX1NUUlNJWkUgbkxlbmd0aDsKLSAgICBuYW1lX2V4dHJhY3Rvci5HZXROZXh0KHBOYW1lLCBuTGVuZ3RoKTsKLSAgICBfTm9kZSAqcE5vZGUgPSAmbV9Sb290LCAqcExhc3QgPSBOVUxMOwotICAgIHdoaWxlIChuTGVuZ3RoID4gMCAmJiBwTm9kZSkgewotICAgICAgICBwTGFzdCA9IHBOb2RlOwotICAgICAgICBDRlhfV2lkZVN0cmluZyBuYW1lID0gQ0ZYX1dpZGVTdHJpbmcocE5hbWUsIG5MZW5ndGgpOwotICAgICAgICBwTm9kZSA9IF9Mb29rdXAocExhc3QsIG5hbWUpOwotICAgICAgICBuYW1lX2V4dHJhY3Rvci5HZXROZXh0KHBOYW1lLCBuTGVuZ3RoKTsKLSAgICB9Ci0gICAgaWYgKHBOb2RlICYmIHBOb2RlICE9ICZtX1Jvb3QpIHsKLSAgICAgICAgQ0ZYX1B0ckFycmF5JiBwdHJfYXJyYXkgPSBwTGFzdC0+Y2hpbGRyZW47Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHRyX2FycmF5LkdldFNpemUoKTsgaSArKykgewotICAgICAgICAgICAgaWYgKHBOb2RlID09IChfTm9kZSAqKXB0cl9hcnJheVtpXSkgewotICAgICAgICAgICAgICAgIHB0cl9hcnJheS5SZW1vdmVBdChpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBDUERGX0Zvcm1GaWVsZCAqcEZpZWxkID0gcE5vZGUtPmZpZWxkX3B0cjsKLSAgICAgICAgUmVtb3ZlTm9kZShwTm9kZSk7Ci0gICAgICAgIHJldHVybiBwRmllbGQ7Ci0gICAgfQorQ1BERl9Gb3JtRmllbGQqIENGaWVsZFRyZWU6OlJlbW92ZUZpZWxkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmdWxsX25hbWUpIHsKKyAgaWYgKGZ1bGxfbmFtZSA9PSBMIiIpIHsKICAgICByZXR1cm4gTlVMTDsKLX0KLUNGaWVsZFRyZWU6Ol9Ob2RlICpDRmllbGRUcmVlOjpGaW5kTm9kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgZnVsbF9uYW1lKQotewotICAgIGlmIChmdWxsX25hbWUgPT0gTCIiKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBfQ0ZpZWxkTmFtZUV4dHJhY3RvciBuYW1lX2V4dHJhY3RvcihmdWxsX25hbWUpOwotICAgIEZYX0xQQ1dTVFIgcE5hbWU7Ci0gICAgRlhfU1RSU0laRSBuTGVuZ3RoOworICB9CisgIENGaWVsZE5hbWVFeHRyYWN0b3IgbmFtZV9leHRyYWN0b3IoZnVsbF9uYW1lKTsKKyAgY29uc3QgRlhfV0NIQVIqIHBOYW1lOworICBGWF9TVFJTSVpFIG5MZW5ndGg7CisgIG5hbWVfZXh0cmFjdG9yLkdldE5leHQocE5hbWUsIG5MZW5ndGgpOworICBfTm9kZSAqcE5vZGUgPSAmbV9Sb290LCAqcExhc3QgPSBOVUxMOworICB3aGlsZSAobkxlbmd0aCA+IDAgJiYgcE5vZGUpIHsKKyAgICBwTGFzdCA9IHBOb2RlOworICAgIENGWF9XaWRlU3RyaW5nIG5hbWUgPSBDRlhfV2lkZVN0cmluZyhwTmFtZSwgbkxlbmd0aCk7CisgICAgcE5vZGUgPSBfTG9va3VwKHBMYXN0LCBuYW1lKTsKICAgICBuYW1lX2V4dHJhY3Rvci5HZXROZXh0KHBOYW1lLCBuTGVuZ3RoKTsKLSAgICBfTm9kZSAqcE5vZGUgPSAmbV9Sb290LCAqcExhc3QgPSBOVUxMOwotICAgIHdoaWxlIChuTGVuZ3RoID4gMCAmJiBwTm9kZSkgewotICAgICAgICBwTGFzdCA9IHBOb2RlOwotICAgICAgICBDRlhfV2lkZVN0cmluZyBuYW1lID0gQ0ZYX1dpZGVTdHJpbmcocE5hbWUsIG5MZW5ndGgpOwotICAgICAgICBwTm9kZSA9IF9Mb29rdXAocExhc3QsIG5hbWUpOwotICAgICAgICBuYW1lX2V4dHJhY3Rvci5HZXROZXh0KHBOYW1lLCBuTGVuZ3RoKTsKKyAgfQorICBpZiAocE5vZGUgJiYgcE5vZGUgIT0gJm1fUm9vdCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcExhc3QtPmNoaWxkcmVuLkdldFNpemUoKTsgaSsrKSB7CisgICAgICBpZiAocE5vZGUgPT0gcExhc3QtPmNoaWxkcmVuW2ldKSB7CisgICAgICAgIHBMYXN0LT5jaGlsZHJlbi5SZW1vdmVBdChpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiBwTm9kZTsKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gcE5vZGUtPmZpZWxkX3B0cjsKKyAgICBSZW1vdmVOb2RlKHBOb2RlKTsKKyAgICByZXR1cm4gcEZpZWxkOworICB9CisgIHJldHVybiBOVUxMOwogfQotQ1BERl9JbnRlckZvcm06OkNQREZfSW50ZXJGb3JtKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgRlhfQk9PTCBiR2VuZXJhdGVBUCkgOiBDRlhfUHJpdmF0ZURhdGEoKQotewotICAgIG1fcERvY3VtZW50ID0gcERvY3VtZW50OwotICAgIG1fYkdlbmVyYXRlQVAgPSBiR2VuZXJhdGVBUDsKLSAgICBtX3BGb3JtTm90aWZ5ID0gTlVMTDsKLSAgICBtX2JVcGRhdGVkID0gRkFMU0U7Ci0gICAgbV9wRmllbGRUcmVlID0gbmV3IENGaWVsZFRyZWU7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IG1fcERvY3VtZW50LT5HZXRSb290KCk7Ci0gICAgbV9wRm9ybURpY3QgPSBwUm9vdC0+R2V0RGljdCgiQWNyb0Zvcm0iKTsKLSAgICBpZiAobV9wRm9ybURpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBGaWVsZHMgPSBtX3BGb3JtRGljdC0+R2V0QXJyYXkoIkZpZWxkcyIpOwotICAgIGlmIChwRmllbGRzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgY291bnQgPSBwRmllbGRzLT5HZXRDb3VudCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkgKyspIHsKLSAgICAgICAgTG9hZEZpZWxkKHBGaWVsZHMtPkdldERpY3QoaSkpOwotICAgIH0KK0NGaWVsZFRyZWU6Ol9Ob2RlKiBDRmllbGRUcmVlOjpGaW5kTm9kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgZnVsbF9uYW1lKSB7CisgIGlmIChmdWxsX25hbWUgPT0gTCIiKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ0ZpZWxkTmFtZUV4dHJhY3RvciBuYW1lX2V4dHJhY3RvcihmdWxsX25hbWUpOworICBjb25zdCBGWF9XQ0hBUiogcE5hbWU7CisgIEZYX1NUUlNJWkUgbkxlbmd0aDsKKyAgbmFtZV9leHRyYWN0b3IuR2V0TmV4dChwTmFtZSwgbkxlbmd0aCk7CisgIF9Ob2RlICpwTm9kZSA9ICZtX1Jvb3QsICpwTGFzdCA9IE5VTEw7CisgIHdoaWxlIChuTGVuZ3RoID4gMCAmJiBwTm9kZSkgeworICAgIHBMYXN0ID0gcE5vZGU7CisgICAgQ0ZYX1dpZGVTdHJpbmcgbmFtZSA9IENGWF9XaWRlU3RyaW5nKHBOYW1lLCBuTGVuZ3RoKTsKKyAgICBwTm9kZSA9IF9Mb29rdXAocExhc3QsIG5hbWUpOworICAgIG5hbWVfZXh0cmFjdG9yLkdldE5leHQocE5hbWUsIG5MZW5ndGgpOworICB9CisgIHJldHVybiBwTm9kZTsKIH0KLUNQREZfSW50ZXJGb3JtOjp+Q1BERl9JbnRlckZvcm0oKQotewotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fQ29udHJvbE1hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBGWF9MUFZPSUQga2V5LCB2YWx1ZTsKLSAgICAgICAgbV9Db250cm9sTWFwLkdldE5leHRBc3NvYyhwb3MsIGtleSwgdmFsdWUpOwotICAgICAgICBkZWxldGUgKENQREZfRm9ybUNvbnRyb2wqKXZhbHVlOwotICAgIH0KLSAgICBpZiAobV9wRmllbGRUcmVlICE9IE5VTEwpIHsKLSAgICAgICAgaW50IG5Db3VudCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkNvdW50RmllbGRzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIENQREZfRm9ybUZpZWxkICpwRmllbGQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5HZXRGaWVsZChpKTsKLSAgICAgICAgICAgIGRlbGV0ZSBwRmllbGQ7Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZXRlIG1fcEZpZWxkVHJlZTsKLSAgICB9CitDUERGX0ludGVyRm9ybTo6Q1BERl9JbnRlckZvcm0oQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBGWF9CT09MIGJHZW5lcmF0ZUFQKQorICAgIDogQ0ZYX1ByaXZhdGVEYXRhKCksCisgICAgICBtX3BEb2N1bWVudChwRG9jdW1lbnQpLAorICAgICAgbV9iR2VuZXJhdGVBUChiR2VuZXJhdGVBUCksCisgICAgICBtX3BGb3JtRGljdChudWxscHRyKSwKKyAgICAgIG1fcEZpZWxkVHJlZShuZXcgQ0ZpZWxkVHJlZSksCisgICAgICBtX3BGb3JtTm90aWZ5KG51bGxwdHIpLAorICAgICAgbV9iVXBkYXRlZChGQUxTRSkgeworICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKTsKKyAgaWYgKCFwUm9vdCkKKyAgICByZXR1cm47CisKKyAgbV9wRm9ybURpY3QgPSBwUm9vdC0+R2V0RGljdCgiQWNyb0Zvcm0iKTsKKyAgaWYgKCFtX3BGb3JtRGljdCkKKyAgICByZXR1cm47CisKKyAgQ1BERl9BcnJheSogcEZpZWxkcyA9IG1fcEZvcm1EaWN0LT5HZXRBcnJheSgiRmllbGRzIik7CisgIGlmICghcEZpZWxkcykKKyAgICByZXR1cm47CisKKyAgaW50IGNvdW50ID0gcEZpZWxkcy0+R2V0Q291bnQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgTG9hZEZpZWxkKHBGaWVsZHMtPkdldERpY3QoaSkpOworICB9CiB9Ci1GWF9CT09MCUNQREZfSW50ZXJGb3JtOjptX2JVcGRhdGVBUCA9IFRSVUU7Ci1GWF9CT09MIENQREZfSW50ZXJGb3JtOjpVcGRhdGluZ0FQRW5hYmxlZCgpCi17Ci0gICAgcmV0dXJuIG1fYlVwZGF0ZUFQOworCitDUERGX0ludGVyRm9ybTo6fkNQREZfSW50ZXJGb3JtKCkgeworICBmb3IgKGF1dG8gaXQgOiBtX0NvbnRyb2xNYXApCisgICAgZGVsZXRlIGl0LnNlY29uZDsKKworICBpbnQgbkNvdW50ID0gbV9wRmllbGRUcmVlLT5tX1Jvb3QuQ291bnRGaWVsZHMoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ291bnQ7ICsraSkgeworICAgIGRlbGV0ZSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5HZXRGaWVsZChpKTsKKyAgfQogfQotdm9pZCBDUERGX0ludGVyRm9ybTo6RW5hYmxlVXBkYXRlQVAoRlhfQk9PTCBiVXBkYXRlQVApCi17Ci0gICAgbV9iVXBkYXRlQVAgPSBiVXBkYXRlQVA7CisKK0ZYX0JPT0wgQ1BERl9JbnRlckZvcm06Om1fYlVwZGF0ZUFQID0gVFJVRTsKK0ZYX0JPT0wgQ1BERl9JbnRlckZvcm06OlVwZGF0aW5nQVBFbmFibGVkKCkgeworICByZXR1cm4gbV9iVXBkYXRlQVA7CiB9Ci1DRlhfQnl0ZVN0cmluZyBDUERGX0ludGVyRm9ybTo6R2VuZXJhdGVOZXdSZXNvdXJjZU5hbWUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzRGljdCwgRlhfTFBDU1RSIGNzVHlwZSwgaW50IGlNaW5MZW4sIEZYX0xQQ1NUUiBjc1ByZWZpeCkKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc1N0ciA9IGNzUHJlZml4OwotICAgIENGWF9CeXRlU3RyaW5nIGNzQlR5cGUgPSBjc1R5cGU7Ci0gICAgaWYgKGNzU3RyLklzRW1wdHkoKSkgewotICAgICAgICBpZiAoY3NCVHlwZSA9PSAiRXh0R1N0YXRlIikgewotICAgICAgICAgICAgY3NTdHIgPSAiR1MiOwotICAgICAgICB9IGVsc2UgaWYgKGNzQlR5cGUgPT0gIkNvbG9yU3BhY2UiKSB7Ci0gICAgICAgICAgICBjc1N0ciA9ICJDUyI7Ci0gICAgICAgIH0gZWxzZSBpZiAoY3NCVHlwZSA9PSAiRm9udCIpIHsKLSAgICAgICAgICAgIGNzU3RyID0gIlppVGkiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY3NTdHIgPSAiUmVzIjsKLSAgICAgICAgfQotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBjc1RtcCA9IGNzU3RyOwotICAgIGludCBpQ291bnQgPSBjc1N0ci5HZXRMZW5ndGgoKTsKLSAgICBpbnQgbSA9IDA7Ci0gICAgaWYgKGlNaW5MZW4gPiAwKSB7Ci0gICAgICAgIGNzVG1wID0gIiI7Ci0gICAgICAgIHdoaWxlIChtIDwgaU1pbkxlbiAmJiBtIDwgaUNvdW50KSB7Ci0gICAgICAgICAgICBjc1RtcCArPSBjc1N0clttICsrXTsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAobSA8IGlNaW5MZW4pIHsKLSAgICAgICAgICAgIGNzVG1wICs9ICcwJyArIG0gJSAxMDsKLSAgICAgICAgICAgIG0gKys7Ci0gICAgICAgIH0KK3ZvaWQgQ1BERl9JbnRlckZvcm06OkVuYWJsZVVwZGF0ZUFQKEZYX0JPT0wgYlVwZGF0ZUFQKSB7CisgIG1fYlVwZGF0ZUFQID0gYlVwZGF0ZUFQOworfQorQ0ZYX0J5dGVTdHJpbmcgQ1BERl9JbnRlckZvcm06OkdlbmVyYXRlTmV3UmVzb3VyY2VOYW1lKAorICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFJlc0RpY3QsCisgICAgY29uc3QgRlhfQ0hBUiogY3NUeXBlLAorICAgIGludCBpTWluTGVuLAorICAgIGNvbnN0IEZYX0NIQVIqIGNzUHJlZml4KSB7CisgIENGWF9CeXRlU3RyaW5nIGNzU3RyID0gY3NQcmVmaXg7CisgIENGWF9CeXRlU3RyaW5nIGNzQlR5cGUgPSBjc1R5cGU7CisgIGlmIChjc1N0ci5Jc0VtcHR5KCkpIHsKKyAgICBpZiAoY3NCVHlwZSA9PSAiRXh0R1N0YXRlIikgeworICAgICAgY3NTdHIgPSAiR1MiOworICAgIH0gZWxzZSBpZiAoY3NCVHlwZSA9PSAiQ29sb3JTcGFjZSIpIHsKKyAgICAgIGNzU3RyID0gIkNTIjsKKyAgICB9IGVsc2UgaWYgKGNzQlR5cGUgPT0gIkZvbnQiKSB7CisgICAgICBjc1N0ciA9ICJaaVRpIjsKICAgICB9IGVsc2UgewotICAgICAgICBtID0gaUNvdW50OworICAgICAgY3NTdHIgPSAiUmVzIjsKICAgICB9Ci0gICAgaWYgKHBSZXNEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGNzVG1wOworICB9CisgIENGWF9CeXRlU3RyaW5nIGNzVG1wID0gY3NTdHI7CisgIGludCBpQ291bnQgPSBjc1N0ci5HZXRMZW5ndGgoKTsKKyAgaW50IG0gPSAwOworICBpZiAoaU1pbkxlbiA+IDApIHsKKyAgICBjc1RtcCA9ICIiOworICAgIHdoaWxlIChtIDwgaU1pbkxlbiAmJiBtIDwgaUNvdW50KSB7CisgICAgICBjc1RtcCArPSBjc1N0clttKytdOwogICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFJlc0RpY3QtPkdldERpY3QoY3NUeXBlKTsKLSAgICBpZiAocERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gY3NUbXA7CisgICAgd2hpbGUgKG0gPCBpTWluTGVuKSB7CisgICAgICBjc1RtcCArPSAnMCcgKyBtICUgMTA7CisgICAgICBtKys7CiAgICAgfQotICAgIGludCBudW0gPSAwOwotICAgIENGWF9CeXRlU3RyaW5nIGJzTnVtOwotICAgIHdoaWxlIChUUlVFKSB7Ci0gICAgICAgIGlmICghcERpY3QtPktleUV4aXN0KGNzVG1wICsgYnNOdW0pKSB7Ci0gICAgICAgICAgICByZXR1cm4gY3NUbXAgKyBic051bTsKLSAgICAgICAgfQotICAgICAgICBpZiAobSA8IGlDb3VudCkgewotICAgICAgICAgICAgY3NUbXAgKz0gY3NTdHJbbSArK107Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBic051bS5Gb3JtYXQoIiVkIiwgbnVtKyspOwotICAgICAgICB9Ci0gICAgICAgIG0gKys7Ci0gICAgfQorICB9IGVsc2UgeworICAgIG0gPSBpQ291bnQ7CisgIH0KKyAgaWYgKCFwUmVzRGljdCkgewogICAgIHJldHVybiBjc1RtcDsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFJlc0RpY3QtPkdldERpY3QoY3NUeXBlKTsKKyAgaWYgKCFwRGljdCkgeworICAgIHJldHVybiBjc1RtcDsKKyAgfQorICBpbnQgbnVtID0gMDsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnNOdW07CisgIHdoaWxlIChUUlVFKSB7CisgICAgaWYgKCFwRGljdC0+S2V5RXhpc3QoY3NUbXAgKyBic051bSkpIHsKKyAgICAgIHJldHVybiBjc1RtcCArIGJzTnVtOworICAgIH0KKyAgICBpZiAobSA8IGlDb3VudCkgeworICAgICAgY3NUbXAgKz0gY3NTdHJbbSsrXTsKKyAgICB9IGVsc2UgeworICAgICAgYnNOdW0uRm9ybWF0KCIlZCIsIG51bSsrKTsKKyAgICB9CisgICAgbSsrOworICB9CisgIHJldHVybiBjc1RtcDsKIH0KICNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCiB0eXBlZGVmIHN0cnVjdCBfUERGX0ZPTlREQVRBIHsKLSAgICBGWF9CT09MCQliRmluZDsKLSAgICBMT0dGT05UQQlsZjsKKyAgRlhfQk9PTCBiRmluZDsKKyAgTE9HRk9OVEEgbGY7CiB9IFBERl9GT05UREFUQSwgRkFSKiBMUERGX0ZPTlREQVRBOwotc3RhdGljIGludCBDQUxMQkFDSyBFbnVtRm9udEZhbUV4UHJvYygJRU5VTUxPR0ZPTlRFWEEgKmxwZWxmZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVdURVhUTUVUUklDRVggKmxwbnRtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBGb250VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAgIGlmIChGb250VHlwZSAhPSAweDAwNCB8fCBzdHJjaHIobHBlbGZlLT5lbGZMb2dGb250LmxmRmFjZU5hbWUsICdAJykgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgICBMUERGX0ZPTlREQVRBIHBEYXRhID0gKExQREZfRk9OVERBVEEpbFBhcmFtOwotICAgICAgICBtZW1jcHkoJnBEYXRhLT5sZiwgJmxwZWxmZS0+ZWxmTG9nRm9udCwgc2l6ZW9mKExPR0ZPTlRBKSk7Ci0gICAgICAgIHBEYXRhLT5iRmluZCA9IFRSVUU7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KK3N0YXRpYyBpbnQgQ0FMTEJBQ0sgRW51bUZvbnRGYW1FeFByb2MoRU5VTUxPR0ZPTlRFWEEqIGxwZWxmZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVXVEVYVE1FVFJJQ0VYKiBscG50bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEZvbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtKSB7CisgIGlmIChGb250VHlwZSAhPSAweDAwNCB8fCBzdHJjaHIobHBlbGZlLT5lbGZMb2dGb250LmxmRmFjZU5hbWUsICdAJykpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICBMUERGX0ZPTlREQVRBIHBEYXRhID0gKExQREZfRk9OVERBVEEpbFBhcmFtOworICBtZW1jcHkoJnBEYXRhLT5sZiwgJmxwZWxmZS0+ZWxmTG9nRm9udCwgc2l6ZW9mKExPR0ZPTlRBKSk7CisgIHBEYXRhLT5iRmluZCA9IFRSVUU7CisgIHJldHVybiAwOwogfQotc3RhdGljIEZYX0JPT0wgUmV0cmlldmVTcGVjaWZpY0ZvbnQoTE9HRk9OVEEmIGxmKQotewotICAgIFBERl9GT05UREFUQSBmZDsKLSAgICBtZW1zZXQoJmZkLCAwLCBzaXplb2YoUERGX0ZPTlREQVRBKSk7Ci0gICAgSERDIGhEQyA9IDo6R2V0REMoTlVMTCk7Ci0gICAgRW51bUZvbnRGYW1pbGllc0V4QShoREMsICZsZiwgKEZPTlRFTlVNUFJPQ0EpRW51bUZvbnRGYW1FeFByb2MsIChMUEFSQU0pJmZkLCAwKTsKLSAgICA6OlJlbGVhc2VEQyhOVUxMLCBoREMpOwotICAgIGlmIChmZC5iRmluZCkgewotICAgICAgICBtZW1jcHkoJmxmLCAmZmQubGYsIHNpemVvZihMT0dGT05UQSkpOwotICAgIH0KLSAgICByZXR1cm4gZmQuYkZpbmQ7CitzdGF0aWMgRlhfQk9PTCBSZXRyaWV2ZVNwZWNpZmljRm9udChMT0dGT05UQSYgbGYpIHsKKyAgUERGX0ZPTlREQVRBIGZkOworICBtZW1zZXQoJmZkLCAwLCBzaXplb2YoUERGX0ZPTlREQVRBKSk7CisgIEhEQyBoREMgPSA6OkdldERDKE5VTEwpOworICBFbnVtRm9udEZhbWlsaWVzRXhBKGhEQywgJmxmLCAoRk9OVEVOVU1QUk9DQSlFbnVtRm9udEZhbUV4UHJvYywgKExQQVJBTSkmZmQsCisgICAgICAgICAgICAgICAgICAgICAgMCk7CisgIDo6UmVsZWFzZURDKE5VTEwsIGhEQyk7CisgIGlmIChmZC5iRmluZCkgeworICAgIG1lbWNweSgmbGYsICZmZC5sZiwgc2l6ZW9mKExPR0ZPTlRBKSk7CisgIH0KKyAgcmV0dXJuIGZkLmJGaW5kOwogfQotc3RhdGljIEZYX0JPT0wgUmV0cmlldmVTcGVjaWZpY0ZvbnQoRlhfQllURSBjaGFyU2V0LCBGWF9CWVRFIHBpdGNoQW5kRmFtaWx5LCBMUENTVFIgcGNzRm9udE5hbWUsIExPR0ZPTlRBJiBsZikKLXsKK3N0YXRpYyBGWF9CT09MIFJldHJpZXZlU3BlY2lmaWNGb250KHVpbnQ4X3QgY2hhclNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGl0Y2hBbmRGYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgcGNzRm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dGT05UQSYgbGYpIHsKKyAgbWVtc2V0KCZsZiwgMCwgc2l6ZW9mKExPR0ZPTlRBKSk7CisgIGxmLmxmQ2hhclNldCA9IGNoYXJTZXQ7CisgIGxmLmxmUGl0Y2hBbmRGYW1pbHkgPSBwaXRjaEFuZEZhbWlseTsKKyAgaWYgKHBjc0ZvbnROYW1lKSB7CisgICAgc3RyY3B5KGxmLmxmRmFjZU5hbWUsIHBjc0ZvbnROYW1lKTsKKyAgfQorICByZXR1cm4gUmV0cmlldmVTcGVjaWZpY0ZvbnQobGYpOworfQorI2lmZGVmIFBERl9FTkFCTEVfWEZBCitzdGF0aWMgRlhfQk9PTCBSZXRyaWV2ZVN0b2NrRm9udChpbnQgaUZvbnRPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNoYXJTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dGT05UQSYgbGYpIHsKKyAgSEZPTlQgaEZvbnQgPSAoSEZPTlQpOjpHZXRTdG9ja09iamVjdChpRm9udE9iamVjdCk7CisgIGlmIChoRm9udCAhPSBOVUxMKSB7CiAgICAgbWVtc2V0KCZsZiwgMCwgc2l6ZW9mKExPR0ZPTlRBKSk7Ci0gICAgbGYubGZDaGFyU2V0ID0gY2hhclNldDsKLSAgICBsZi5sZlBpdGNoQW5kRmFtaWx5ID0gcGl0Y2hBbmRGYW1pbHk7Ci0gICAgaWYgKHBjc0ZvbnROYW1lICE9IE5VTEwpIHsKLSAgICAgICAgc3RyY3B5KGxmLmxmRmFjZU5hbWUsIHBjc0ZvbnROYW1lKTsKKyAgICBpbnQgaVJldCA9IDo6R2V0T2JqZWN0KGhGb250LCBzaXplb2YoTE9HRk9OVEEpLCAmbGYpOworICAgIGlmIChpUmV0ID4gMCAmJiAobGYubGZDaGFyU2V0ID09IGNoYXJTZXQgfHwgY2hhclNldCA9PSAyNTUpKSB7CisgICAgICByZXR1cm4gUmV0cmlldmVTcGVjaWZpY0ZvbnQobGYpOwogICAgIH0KLSAgICByZXR1cm4gUmV0cmlldmVTcGVjaWZpY0ZvbnQobGYpOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KLXN0YXRpYyBGWF9CT09MIFJldHJpZXZlU3RvY2tGb250KGludCBpRm9udE9iamVjdCwgRlhfQllURSBjaGFyU2V0LCBMT0dGT05UQSYgbGYpCi17Ci0gICAgSEZPTlQgaEZvbnQgPSAoSEZPTlQpOjpHZXRTdG9ja09iamVjdChpRm9udE9iamVjdCk7Ci0gICAgaWYgKGhGb250ICE9IE5VTEwpIHsKLSAgICAgICAgbWVtc2V0KCZsZiwgMCwgc2l6ZW9mKExPR0ZPTlRBKSk7Ci0gICAgICAgIGludCBpUmV0ID0gOjpHZXRPYmplY3QoaEZvbnQsIHNpemVvZihMT0dGT05UQSksICZsZik7Ci0gICAgICAgIGlmIChpUmV0ID4gMCAmJiAobGYubGZDaGFyU2V0ID09IGNoYXJTZXQgfHwgY2hhclNldCA9PSAyNTUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gUmV0cmlldmVTcGVjaWZpY0ZvbnQobGYpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyNlbmRpZiAgLy8gX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXworCitDUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpBZGRTdGFuZGFyZEZvbnQoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUpIHsKKyAgaWYgKCFwRG9jdW1lbnQgfHwgY3NGb250TmFtZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgaWYgKGNzRm9udE5hbWUgPT0gIlphcGZEaW5nYmF0cyIpCisgICAgcmV0dXJuIHBEb2N1bWVudC0+QWRkU3RhbmRhcmRGb250KGNzRm9udE5hbWUuY19zdHIoKSwgbnVsbHB0cik7CisKKyAgQ1BERl9Gb250RW5jb2RpbmcgZW5jb2RpbmcoUERGRk9OVF9FTkNPRElOR19XSU5BTlNJKTsKKyAgcmV0dXJuIHBEb2N1bWVudC0+QWRkU3RhbmRhcmRGb250KGNzRm9udE5hbWUuY19zdHIoKSwgJmVuY29kaW5nKTsKIH0KLSNlbmRpZgotQ1BERl9Gb250KiBDUERGX0ludGVyRm9ybTo6QWRkU3lzdGVtRGVmYXVsdEZvbnQoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KQotewotICAgIGlmIChwRG9jdW1lbnQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9Gb250KiBwRm9udCA9IE5VTEw7CisKK0NGWF9CeXRlU3RyaW5nIENQREZfSW50ZXJGb3JtOjpHZXROYXRpdmVGb250KHVpbnQ4X3QgY2hhclNldCwgdm9pZCogcExvZ0ZvbnQpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZTsKICNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0gICAgTE9HRk9OVEEgbGY7Ci0gICAgRlhfQk9PTCBiUmV0OwotICAgIGJSZXQgPSBSZXRyaWV2ZVN0b2NrRm9udChERUZBVUxUX0dVSV9GT05ULCAyNTUsIGxmKTsKLSAgICBpZiAoIWJSZXQpIHsKLSAgICAgICAgYlJldCA9IFJldHJpZXZlU3RvY2tGb250KFNZU1RFTV9GT05ULCAyNTUsIGxmKTsKLSAgICB9Ci0gICAgaWYgKGJSZXQpIHsKLSAgICAgICAgcEZvbnQgPSAoKENQREZfRG9jdW1lbnQqKXBEb2N1bWVudCktPkFkZFdpbmRvd3NGb250KCZsZiwgRkFMU0UsIFRSVUUpOwotICAgIH0KLSNlbmRpZgotICAgIHJldHVybiBwRm9udDsKLX0KLUNQREZfRm9udCogQ1BERl9JbnRlckZvcm06OkFkZFN5c3RlbUZvbnQoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lLCBGWF9CWVRFIGlDaGFyU2V0KQotewotICAgIGlmIChwRG9jdW1lbnQgPT0gTlVMTCB8fCBjc0ZvbnROYW1lLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotICAgIGlmIChpQ2hhclNldCA9PSAxKSB7Ci0gICAgICAgIGlDaGFyU2V0ID0gR2V0TmF0aXZlQ2hhclNldCgpOwotICAgIH0KLSAgICBIRk9OVCBoRm9udCA9IDo6Q3JlYXRlRm9udEEoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgaUNoYXJTZXQsIE9VVF9ERUZBVUxUX1BSRUNJUywgQ0xJUF9ERUZBVUxUX1BSRUNJUywgREVGQVVMVF9RVUFMSVRZLCBERUZBVUxUX1BJVENIIHwgRkZfRE9OVENBUkUsIGNzRm9udE5hbWUuY19zdHIoKSk7Ci0gICAgaWYgKGhGb250ICE9IE5VTEwpIHsKLSAgICAgICAgTE9HRk9OVEEgbGY7Ci0gICAgICAgIG1lbXNldCgmbGYsIDAsIHNpemVvZihMT0dGT05UQSkpOwotICAgICAgICA6OkdldE9iamVjdEEoaEZvbnQsIHNpemVvZihMT0dGT05UQSksICZsZik7Ci0gICAgICAgIDo6RGVsZXRlT2JqZWN0KGhGb250KTsKLSAgICAgICAgaWYgKHN0cmxlbihsZi5sZkZhY2VOYW1lKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiAoKENQREZfRG9jdW1lbnQqKXBEb2N1bWVudCktPkFkZFdpbmRvd3NGb250KCZsZiwgRkFMU0UsIFRSVUUpOwotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci1DUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpBZGRTeXN0ZW1Gb250KGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0ZYX1dpZGVTdHJpbmcgY3NGb250TmFtZSwgRlhfQllURSBpQ2hhclNldCkKLXsKLSAgICBpZiAocERvY3VtZW50ID09IE5VTEwgfHwgY3NGb250TmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgICBpZiAoaUNoYXJTZXQgPT0gMSkgewotICAgICAgICBpQ2hhclNldCA9IEdldE5hdGl2ZUNoYXJTZXQoKTsKLSAgICB9Ci0gICAgSEZPTlQgaEZvbnQgPSA6OkNyZWF0ZUZvbnRXKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIGlDaGFyU2V0LCBPVVRfREVGQVVMVF9QUkVDSVMsIENMSVBfREVGQVVMVF9QUkVDSVMsIERFRkFVTFRfUVVBTElUWSwgREVGQVVMVF9QSVRDSCB8IEZGX0RPTlRDQVJFLCBjc0ZvbnROYW1lLmNfc3RyKCkpOwotICAgIGlmIChoRm9udCAhPSBOVUxMKSB7Ci0gICAgICAgIExPR0ZPTlRBIGxmOwotICAgICAgICBtZW1zZXQoJmxmLCAwLCBzaXplb2YoTE9HRk9OVEEpKTsKLSAgICAgICAgOjpHZXRPYmplY3QoaEZvbnQsIHNpemVvZihMT0dGT05UQSksICZsZik7Ci0gICAgICAgIDo6RGVsZXRlT2JqZWN0KGhGb250KTsKLSAgICAgICAgaWYgKHN0cmxlbihsZi5sZkZhY2VOYW1lKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiAoKENQREZfRG9jdW1lbnQqKXBEb2N1bWVudCktPkFkZFdpbmRvd3NGb250KCZsZiwgRkFMU0UsIFRSVUUpOwotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci1DUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpBZGRTdGFuZGFyZEZvbnQoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lKQotewotICAgIGlmIChwRG9jdW1lbnQgPT0gTlVMTCB8fCBjc0ZvbnROYW1lLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9Gb250KiBwRm9udCA9IE5VTEw7Ci0gICAgaWYgKGNzRm9udE5hbWUgPT0gIlphcGZEaW5nYmF0cyIpIHsKLSAgICAgICAgcEZvbnQgPSAoKENQREZfRG9jdW1lbnQqKXBEb2N1bWVudCktPkFkZFN0YW5kYXJkRm9udChjc0ZvbnROYW1lLCBOVUxMKTsKLSAgICB9IGVsc2UgewotICAgICAgICBDUERGX0ZvbnRFbmNvZGluZyBlbmNvZGluZyhQREZGT05UX0VOQ09ESU5HX1dJTkFOU0kpOwotICAgICAgICBwRm9udCA9ICgoQ1BERl9Eb2N1bWVudCopcERvY3VtZW50KS0+QWRkU3RhbmRhcmRGb250KGNzRm9udE5hbWUsICZlbmNvZGluZyk7Ci0gICAgfQotICAgIHJldHVybiBwRm9udDsKLX0KLUNGWF9CeXRlU3RyaW5nIENQREZfSW50ZXJGb3JtOjpHZXROYXRpdmVGb250KEZYX0JZVEUgY2hhclNldCwgRlhfTFBWT0lEIHBMb2dGb250KQotewotICAgIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWU7Ci0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotICAgIExPR0ZPTlRBIGxmOwotICAgIEZYX0JPT0wgYlJldDsKLSAgICBpZiAoY2hhclNldCA9PSBBTlNJX0NIQVJTRVQpIHsKLSAgICAgICAgY3NGb250TmFtZSA9ICJIZWx2ZXRpY2EiOwotICAgICAgICByZXR1cm4gY3NGb250TmFtZTsKLSAgICB9Ci0gICAgYlJldCA9IEZBTFNFOwotICAgIGlmIChjaGFyU2V0ID09IFNISUZUSklTX0NIQVJTRVQpIHsKLSAgICAgICAgYlJldCA9IFJldHJpZXZlU3BlY2lmaWNGb250KGNoYXJTZXQsIERFRkFVTFRfUElUQ0ggfCBGRl9ET05UQ0FSRSwgIk1TIE1pbmNobyIsIGxmKTsKLSAgICB9IGVsc2UgaWYgKGNoYXJTZXQgPT0gR0IyMzEyX0NIQVJTRVQpIHsKLSAgICAgICAgYlJldCA9IFJldHJpZXZlU3BlY2lmaWNGb250KGNoYXJTZXQsIERFRkFVTFRfUElUQ0ggfCBGRl9ET05UQ0FSRSwgIlNpbVN1biIsIGxmKTsKLSAgICB9IGVsc2UgaWYgKGNoYXJTZXQgPT0gQ0hJTkVTRUJJRzVfQ0hBUlNFVCkgewotICAgICAgICBiUmV0ID0gUmV0cmlldmVTcGVjaWZpY0ZvbnQoY2hhclNldCwgREVGQVVMVF9QSVRDSCB8IEZGX0RPTlRDQVJFLCAiTWluZ0xpVSIsIGxmKTsKLSAgICB9Ci0gICAgaWYgKCFiUmV0KSB7Ci0gICAgICAgIGJSZXQgPSBSZXRyaWV2ZVNwZWNpZmljRm9udChjaGFyU2V0LCBERUZBVUxUX1BJVENIIHwgRkZfRE9OVENBUkUsICJBcmlhbCBVbmljb2RlIE1TIiwgbGYpOwotICAgIH0KLSAgICBpZiAoIWJSZXQpIHsKLSAgICAgICAgYlJldCA9IFJldHJpZXZlU3BlY2lmaWNGb250KGNoYXJTZXQsIERFRkFVTFRfUElUQ0ggfCBGRl9ET05UQ0FSRSwgIk1pY3Jvc29mdCBTYW5zIFNlcmlmIiwgbGYpOwotICAgIH0KLSAgICBpZiAoIWJSZXQpIHsKLSAgICAgICAgYlJldCA9IFJldHJpZXZlU3BlY2lmaWNGb250KGNoYXJTZXQsIERFRkFVTFRfUElUQ0ggfCBGRl9ET05UQ0FSRSwgTlVMTCwgbGYpOwotICAgIH0KLSAgICBpZiAoYlJldCkgewotICAgICAgICBpZiAocExvZ0ZvbnQgIT0gTlVMTCkgewotICAgICAgICAgICAgbWVtY3B5KHBMb2dGb250LCAmbGYsIHNpemVvZihMT0dGT05UQSkpOwotICAgICAgICB9Ci0gICAgICAgIGNzRm9udE5hbWUgPSBsZi5sZkZhY2VOYW1lOwotICAgICAgICByZXR1cm4gY3NGb250TmFtZTsKLSAgICB9Ci0jZW5kaWYKKyAgTE9HRk9OVEEgbGY7CisgIEZYX0JPT0wgYlJldDsKKyAgaWYgKGNoYXJTZXQgPT0gQU5TSV9DSEFSU0VUKSB7CisgICAgY3NGb250TmFtZSA9ICJIZWx2ZXRpY2EiOwogICAgIHJldHVybiBjc0ZvbnROYW1lOworICB9CisgIGJSZXQgPSBGQUxTRTsKKyAgaWYgKGNoYXJTZXQgPT0gU0hJRlRKSVNfQ0hBUlNFVCkgeworICAgIGJSZXQgPSBSZXRyaWV2ZVNwZWNpZmljRm9udChjaGFyU2V0LCBERUZBVUxUX1BJVENIIHwgRkZfRE9OVENBUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNUyBNaW5jaG8iLCBsZik7CisgIH0gZWxzZSBpZiAoY2hhclNldCA9PSBHQjIzMTJfQ0hBUlNFVCkgeworICAgIGJSZXQgPSBSZXRyaWV2ZVNwZWNpZmljRm9udChjaGFyU2V0LCBERUZBVUxUX1BJVENIIHwgRkZfRE9OVENBUkUsICJTaW1TdW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZik7CisgIH0gZWxzZSBpZiAoY2hhclNldCA9PSBDSElORVNFQklHNV9DSEFSU0VUKSB7CisgICAgYlJldCA9IFJldHJpZXZlU3BlY2lmaWNGb250KGNoYXJTZXQsIERFRkFVTFRfUElUQ0ggfCBGRl9ET05UQ0FSRSwgIk1pbmdMaVUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZik7CisgIH0KKyAgaWYgKCFiUmV0KSB7CisgICAgYlJldCA9IFJldHJpZXZlU3BlY2lmaWNGb250KGNoYXJTZXQsIERFRkFVTFRfUElUQ0ggfCBGRl9ET05UQ0FSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFyaWFsIFVuaWNvZGUgTVMiLCBsZik7CisgIH0KKyAgaWYgKCFiUmV0KSB7CisgICAgYlJldCA9IFJldHJpZXZlU3BlY2lmaWNGb250KGNoYXJTZXQsIERFRkFVTFRfUElUQ0ggfCBGRl9ET05UQ0FSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pY3Jvc29mdCBTYW5zIFNlcmlmIiwgbGYpOworICB9CisgIGlmICghYlJldCkgeworICAgIGJSZXQgPSBSZXRyaWV2ZVNwZWNpZmljRm9udChjaGFyU2V0LCBERUZBVUxUX1BJVENIIHwgRkZfRE9OVENBUkUsIE5VTEwsIGxmKTsKKyAgfQorICBpZiAoYlJldCkgeworICAgIGlmIChwTG9nRm9udCkgeworICAgICAgbWVtY3B5KHBMb2dGb250LCAmbGYsIHNpemVvZihMT0dGT05UQSkpOworICAgIH0KKyAgICBjc0ZvbnROYW1lID0gbGYubGZGYWNlTmFtZTsKKyAgICByZXR1cm4gY3NGb250TmFtZTsKKyAgfQorI2VuZGlmCisgIHJldHVybiBjc0ZvbnROYW1lOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9JbnRlckZvcm06OkdldE5hdGl2ZUZvbnQoRlhfTFBWT0lEIHBMb2dGb250KQoteworQ0ZYX0J5dGVTdHJpbmcgQ1BERl9JbnRlckZvcm06OkdldE5hdGl2ZUZvbnQodm9pZCogcExvZ0ZvbnQpIHsKICNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0gICAgRlhfQllURSBjaGFyU2V0ID0gR2V0TmF0aXZlQ2hhclNldCgpOwotICAgIHJldHVybiBHZXROYXRpdmVGb250KGNoYXJTZXQsIHBMb2dGb250KTsKKyAgdWludDhfdCBjaGFyU2V0ID0gR2V0TmF0aXZlQ2hhclNldCgpOworICByZXR1cm4gR2V0TmF0aXZlRm9udChjaGFyU2V0LCBwTG9nRm9udCk7CiAjZWxzZQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOworICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKICNlbmRpZgogfQotRlhfQllURSBDUERGX0ludGVyRm9ybTo6R2V0TmF0aXZlQ2hhclNldCgpCi17Cit1aW50OF90IENQREZfSW50ZXJGb3JtOjpHZXROYXRpdmVDaGFyU2V0KCkgewogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgICBGWF9CWVRFIGNoYXJTZXQgPSBBTlNJX0NIQVJTRVQ7Ci0gICAgVUlOVCBpQ29kZVBhZ2UgPSA6OkdldEFDUCgpOwotICAgIHN3aXRjaCAoaUNvZGVQYWdlKSB7Ci0gICAgICAgIGNhc2UgOTMyOgotICAgICAgICAgICAgY2hhclNldCA9IFNISUZUSklTX0NIQVJTRVQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA5MzY6Ci0gICAgICAgICAgICBjaGFyU2V0ID0gR0IyMzEyX0NIQVJTRVQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA5NTA6Ci0gICAgICAgICAgICBjaGFyU2V0ID0gQ0hJTkVTRUJJRzVfQ0hBUlNFVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEyNTI6Ci0gICAgICAgICAgICBjaGFyU2V0ID0gQU5TSV9DSEFSU0VUOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgODc0OgotICAgICAgICAgICAgY2hhclNldCA9IFRIQUlfQ0hBUlNFVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDk0OToKLSAgICAgICAgICAgIGNoYXJTZXQgPSBIQU5HVUxfQ0hBUlNFVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEyMDA6Ci0gICAgICAgICAgICBjaGFyU2V0ID0gQU5TSV9DSEFSU0VUOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI1MDoKLSAgICAgICAgICAgIGNoYXJTZXQgPSBFQVNURVVST1BFX0NIQVJTRVQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMjUxOgotICAgICAgICAgICAgY2hhclNldCA9IFJVU1NJQU5fQ0hBUlNFVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEyNTM6Ci0gICAgICAgICAgICBjaGFyU2V0ID0gR1JFRUtfQ0hBUlNFVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEyNTQ6Ci0gICAgICAgICAgICBjaGFyU2V0ID0gVFVSS0lTSF9DSEFSU0VUOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI1NToKLSAgICAgICAgICAgIGNoYXJTZXQgPSBIRUJSRVdfQ0hBUlNFVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEyNTY6Ci0gICAgICAgICAgICBjaGFyU2V0ID0gQVJBQklDX0NIQVJTRVQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMjU3OgotICAgICAgICAgICAgY2hhclNldCA9IEJBTFRJQ19DSEFSU0VUOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI1ODoKLSAgICAgICAgICAgIGNoYXJTZXQgPSBWSUVUTkFNRVNFX0NIQVJTRVQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMzYxOgotICAgICAgICAgICAgY2hhclNldCA9IEpPSEFCX0NIQVJTRVQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIGNoYXJTZXQ7CisgIHVpbnQ4X3QgY2hhclNldCA9IEFOU0lfQ0hBUlNFVDsKKyAgVUlOVCBpQ29kZVBhZ2UgPSA6OkdldEFDUCgpOworICBzd2l0Y2ggKGlDb2RlUGFnZSkgeworICAgIGNhc2UgOTMyOgorICAgICAgY2hhclNldCA9IFNISUZUSklTX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDkzNjoKKyAgICAgIGNoYXJTZXQgPSBHQjIzMTJfQ0hBUlNFVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgOTUwOgorICAgICAgY2hhclNldCA9IENISU5FU0VCSUc1X0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyNTI6CisgICAgICBjaGFyU2V0ID0gQU5TSV9DSEFSU0VUOworICAgICAgYnJlYWs7CisgICAgY2FzZSA4NzQ6CisgICAgICBjaGFyU2V0ID0gVEhBSV9DSEFSU0VUOworICAgICAgYnJlYWs7CisgICAgY2FzZSA5NDk6CisgICAgICBjaGFyU2V0ID0gSEFOR1VMX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyMDA6CisgICAgICBjaGFyU2V0ID0gQU5TSV9DSEFSU0VUOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjUwOgorICAgICAgY2hhclNldCA9IEVBU1RFVVJPUEVfQ0hBUlNFVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTI1MToKKyAgICAgIGNoYXJTZXQgPSBSVVNTSUFOX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyNTM6CisgICAgICBjaGFyU2V0ID0gR1JFRUtfQ0hBUlNFVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTI1NDoKKyAgICAgIGNoYXJTZXQgPSBUVVJLSVNIX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyNTU6CisgICAgICBjaGFyU2V0ID0gSEVCUkVXX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyNTY6CisgICAgICBjaGFyU2V0ID0gQVJBQklDX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyNTc6CisgICAgICBjaGFyU2V0ID0gQkFMVElDX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyNTg6CisgICAgICBjaGFyU2V0ID0gVklFVE5BTUVTRV9DSEFSU0VUOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMzYxOgorICAgICAgY2hhclNldCA9IEpPSEFCX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gY2hhclNldDsKICNlbHNlCisgIHJldHVybiAwOworI2VuZGlmCit9CisKK0NQREZfRm9udCogQ1BERl9JbnRlckZvcm06OkFkZE5hdGl2ZUZvbnQodWludDhfdCBjaGFyU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsKKyAgaWYgKCFwRG9jdW1lbnQpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisgIExPR0ZPTlRBIGxmOworICBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lID0gR2V0TmF0aXZlRm9udChjaGFyU2V0LCAmbGYpOworICBpZiAoIWNzRm9udE5hbWUuSXNFbXB0eSgpKSB7CisgICAgaWYgKGNzRm9udE5hbWUgPT0gIkhlbHZldGljYSIpCisgICAgICByZXR1cm4gQWRkU3RhbmRhcmRGb250KHBEb2N1bWVudCwgY3NGb250TmFtZSk7CisgICAgcmV0dXJuIHBEb2N1bWVudC0+QWRkV2luZG93c0ZvbnQoJmxmLCBGQUxTRSwgVFJVRSk7CisgIH0KKyNlbmRpZgorICByZXR1cm4gbnVsbHB0cjsKK30KKworQ1BERl9Gb250KiBDUERGX0ludGVyRm9ybTo6QWRkTmF0aXZlRm9udChDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsKKyAgcmV0dXJuIHBEb2N1bWVudCA/IEFkZE5hdGl2ZUZvbnQoR2V0TmF0aXZlQ2hhclNldCgpLCBwRG9jdW1lbnQpIDogbnVsbHB0cjsKK30KKworRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6VmFsaWRhdGVGaWVsZE5hbWUoCisgICAgQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lLAorICAgIGludCBpVHlwZSwKKyAgICBjb25zdCBDUERGX0Zvcm1GaWVsZCogcEV4Y2x1ZGVkRmllbGQsCisgICAgY29uc3QgQ1BERl9Gb3JtQ29udHJvbCogcEV4Y2x1ZGVkQ29udHJvbCkgeworICBpZiAoY3NOZXdGaWVsZE5hbWUuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGludCBpUG9zID0gMDsKKyAgaW50IGlMZW5ndGggPSBjc05ld0ZpZWxkTmFtZS5HZXRMZW5ndGgoKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgY3NTdWI7CisgIHdoaWxlIChUUlVFKSB7CisgICAgd2hpbGUgKGlQb3MgPCBpTGVuZ3RoICYmCisgICAgICAgICAgIChjc05ld0ZpZWxkTmFtZVtpUG9zXSA9PSBMJy4nIHx8IGNzTmV3RmllbGROYW1lW2lQb3NdID09IEwnICcpKSB7CisgICAgICBpUG9zKys7CisgICAgfQorICAgIGlmIChpUG9zIDwgaUxlbmd0aCAmJiAhY3NTdWIuSXNFbXB0eSgpKSB7CisgICAgICBjc1N1YiArPSBMJy4nOworICAgIH0KKyAgICB3aGlsZSAoaVBvcyA8IGlMZW5ndGggJiYgY3NOZXdGaWVsZE5hbWVbaVBvc10gIT0gTCcuJykgeworICAgICAgY3NTdWIgKz0gY3NOZXdGaWVsZE5hbWVbaVBvcysrXTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IGNzU3ViLkdldExlbmd0aCgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKKyAgICAgIGlmIChjc1N1YltpXSA9PSBMJyAnIHx8IGNzU3ViW2ldID09IEwnLicpIHsKKyAgICAgICAgY3NTdWIuU2V0QXQoaSwgTCdcMCcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIEZYX0RXT1JEIGR3Q291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOworICAgIGZvciAoRlhfRFdPUkQgbSA9IDA7IG0gPCBkd0NvdW50OyBtKyspIHsKKyAgICAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5HZXRGaWVsZChtKTsKKyAgICAgIGlmICghcEZpZWxkKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHBGaWVsZCA9PSBwRXhjbHVkZWRGaWVsZCkgeworICAgICAgICBpZiAocEV4Y2x1ZGVkQ29udHJvbCkgeworICAgICAgICAgIGlmIChwRmllbGQtPkNvdW50Q29udHJvbHMoKSA8IDIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NGdWxsTmFtZSA9IHBGaWVsZC0+R2V0RnVsbE5hbWUoKTsKKyAgICAgIGludCBpUmV0ID0gQ29tcGFyZUZpZWxkTmFtZShjc1N1YiwgY3NGdWxsTmFtZSk7CisgICAgICBpZiAoaVJldCA9PSAxKSB7CisgICAgICAgIGlmIChwRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IGlUeXBlKSB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGlSZXQgPT0gMiAmJiBjc1N1YiA9PSBjc05ld0ZpZWxkTmFtZSkgeworICAgICAgICBpZiAoY3NGdWxsTmFtZVtpUG9zXSA9PSBMJy4nKSB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGlSZXQgPT0gMyAmJiBjc1N1YiA9PSBjc05ld0ZpZWxkTmFtZSkgeworICAgICAgICBpZiAoY3NOZXdGaWVsZE5hbWVbY3NGdWxsTmFtZS5HZXRMZW5ndGgoKV0gPT0gTCcuJykgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoaVBvcyA+PSBpTGVuZ3RoKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKGNzU3ViLklzRW1wdHkoKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBjc05ld0ZpZWxkTmFtZSA9IGNzU3ViOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9JbnRlckZvcm06OlZhbGlkYXRlRmllbGROYW1lKENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpVHlwZSkgeworICByZXR1cm4gVmFsaWRhdGVGaWVsZE5hbWUoY3NOZXdGaWVsZE5hbWUsIGlUeXBlLCBOVUxMLCBOVUxMKTsKK30KK0ZYX0JPT0wgQ1BERl9JbnRlckZvcm06OlZhbGlkYXRlRmllbGROYW1lKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgY3NOZXdGaWVsZE5hbWUpIHsKKyAgcmV0dXJuIHBGaWVsZCAmJiAhY3NOZXdGaWVsZE5hbWUuSXNFbXB0eSgpICYmCisgICAgICAgICBWYWxpZGF0ZUZpZWxkTmFtZShjc05ld0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ1BERl9Gb3JtRmllbGQqKXBGaWVsZCktPkdldEZpZWxkVHlwZSgpLCBwRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKK30KK0ZYX0JPT0wgQ1BERl9JbnRlckZvcm06OlZhbGlkYXRlRmllbGROYW1lKGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lKSB7CisgIGlmICghcENvbnRyb2wgfHwgY3NOZXdGaWVsZE5hbWUuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSAoKENQREZfRm9ybUNvbnRyb2wqKXBDb250cm9sKS0+R2V0RmllbGQoKTsKKyAgcmV0dXJuIFZhbGlkYXRlRmllbGROYW1lKGNzTmV3RmllbGROYW1lLCBwRmllbGQtPkdldEZpZWxkVHlwZSgpLCBwRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udHJvbCk7Cit9CitpbnQgQ1BERl9JbnRlckZvcm06OkNvbXBhcmVGaWVsZE5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lMikgeworICBjb25zdCBGWF9DSEFSKiBwdHIxID0gbmFtZTE7CisgIGNvbnN0IEZYX0NIQVIqIHB0cjIgPSBuYW1lMjsKKyAgaWYgKG5hbWUxLkdldExlbmd0aCgpID09IG5hbWUyLkdldExlbmd0aCgpKSB7CisgICAgcmV0dXJuIG5hbWUxID09IG5hbWUyID8gMSA6IDA7CisgIH0KKyAgaW50IGkgPSAwOworICB3aGlsZSAocHRyMVtpXSA9PSBwdHIyW2ldKSB7CisgICAgaSsrOworICB9CisgIGlmIChpID09IG5hbWUxLkdldExlbmd0aCgpKSB7CisgICAgcmV0dXJuIDI7CisgIH0KKyAgaWYgKGkgPT0gbmFtZTIuR2V0TGVuZ3RoKCkpIHsKKyAgICByZXR1cm4gMzsKKyAgfQorICByZXR1cm4gMDsKK30KK2ludCBDUERGX0ludGVyRm9ybTo6Q29tcGFyZUZpZWxkTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgbmFtZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG5hbWUyKSB7CisgIGNvbnN0IEZYX1dDSEFSKiBwdHIxID0gbmFtZTEuY19zdHIoKTsKKyAgY29uc3QgRlhfV0NIQVIqIHB0cjIgPSBuYW1lMi5jX3N0cigpOworICBpZiAobmFtZTEuR2V0TGVuZ3RoKCkgPT0gbmFtZTIuR2V0TGVuZ3RoKCkpIHsKKyAgICByZXR1cm4gbmFtZTEgPT0gbmFtZTIgPyAxIDogMDsKKyAgfQorICBpbnQgaSA9IDA7CisgIHdoaWxlIChwdHIxW2ldID09IHB0cjJbaV0pIHsKKyAgICBpKys7CisgIH0KKyAgaWYgKGkgPT0gbmFtZTEuR2V0TGVuZ3RoKCkpIHsKKyAgICByZXR1cm4gMjsKKyAgfQorICBpZiAoaSA9PSBuYW1lMi5HZXRMZW5ndGgoKSkgeworICAgIHJldHVybiAzOworICB9CisgIHJldHVybiAwOworfQorRlhfRFdPUkQgQ1BERl9JbnRlckZvcm06OkNvdW50RmllbGRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSkgeworICBpZiAoY3NGaWVsZE5hbWUuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIChGWF9EV09SRCltX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOworICB9CisgIENGaWVsZFRyZWU6Ol9Ob2RlKiBwTm9kZSA9IG1fcEZpZWxkVHJlZS0+RmluZE5vZGUoY3NGaWVsZE5hbWUpOworICByZXR1cm4gcE5vZGUgPyBwTm9kZS0+Q291bnRGaWVsZHMoKSA6IDA7Cit9CitDUERGX0Zvcm1GaWVsZCogQ1BERl9JbnRlckZvcm06OkdldEZpZWxkKEZYX0RXT1JEIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NGaWVsZE5hbWUpIHsKKyAgaWYgKGNzRmllbGROYW1lID09IEwiIikgeworICAgIHJldHVybiBtX3BGaWVsZFRyZWUtPm1fUm9vdC5HZXRGaWVsZChpbmRleCk7CisgIH0KKyAgQ0ZpZWxkVHJlZTo6X05vZGUqIHBOb2RlID0gbV9wRmllbGRUcmVlLT5GaW5kTm9kZShjc0ZpZWxkTmFtZSk7CisgIHJldHVybiBwTm9kZSA/IHBOb2RlLT5HZXRGaWVsZChpbmRleCkgOiBudWxscHRyOworfQordm9pZCBDUERGX0ludGVyRm9ybTo6R2V0QWxsRmllbGROYW1lcyhDRlhfV2lkZVN0cmluZ0FycmF5JiBhbGxGaWVsZE5hbWVzKSB7CisgIGFsbEZpZWxkTmFtZXMuUmVtb3ZlQWxsKCk7CisgIGludCBuQ291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOworICBmb3IgKGludCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7CisgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkdldEZpZWxkKGkpOworICAgIGlmIChwRmllbGQpIHsKKyAgICAgIENGWF9XaWRlU3RyaW5nIGZ1bGxfbmFtZSA9IEdldEZ1bGxOYW1lKHBGaWVsZC0+R2V0RmllbGREaWN0KCkpOworICAgICAgYWxsRmllbGROYW1lcy5BZGQoZnVsbF9uYW1lKTsKKyAgICB9CisgIH0KK30KKworQ1BERl9Gb3JtRmllbGQqIENQREZfSW50ZXJGb3JtOjpHZXRGaWVsZEJ5RGljdCgKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpIGNvbnN0IHsKKyAgaWYgKCFwRmllbGREaWN0KSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ0ZYX1dpZGVTdHJpbmcgY3NXTmFtZSA9IEdldEZ1bGxOYW1lKHBGaWVsZERpY3QpOworICByZXR1cm4gbV9wRmllbGRUcmVlLT5HZXRGaWVsZChjc1dOYW1lKTsKK30KKworQ1BERl9Gb3JtQ29udHJvbCogQ1BERl9JbnRlckZvcm06OkdldENvbnRyb2xBdFBvaW50KENQREZfUGFnZSogcFBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcGRmX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcGRmX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB6X29yZGVyKSBjb25zdCB7CisgIENQREZfQXJyYXkqIHBBbm5vdExpc3QgPSBwUGFnZS0+bV9wRm9ybURpY3QtPkdldEFycmF5KCJBbm5vdHMiKTsKKyAgaWYgKCFwQW5ub3RMaXN0KQorICAgIHJldHVybiBudWxscHRyOworCisgIGZvciAoRlhfRFdPUkQgaSA9IHBBbm5vdExpc3QtPkdldENvdW50KCk7IGkgPiAwOyAtLWkpIHsKKyAgICBGWF9EV09SRCBhbm5vdF9pbmRleCA9IGkgLSAxOworICAgIENQREZfRGljdGlvbmFyeSogcEFubm90ID0gcEFubm90TGlzdC0+R2V0RGljdChhbm5vdF9pbmRleCk7CisgICAgaWYgKCFwQW5ub3QpCisgICAgICBjb250aW51ZTsKKworICAgIGNvbnN0IGF1dG8gaXQgPSBtX0NvbnRyb2xNYXAuZmluZChwQW5ub3QpOworICAgIGlmIChpdCA9PSBtX0NvbnRyb2xNYXAuZW5kKCkpCisgICAgICBjb250aW51ZTsKKworICAgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gaXQtPnNlY29uZDsKKyAgICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBwQ29udHJvbC0+R2V0UmVjdCgpOworICAgIGlmICghcmVjdC5Db250YWlucyhwZGZfeCwgcGRmX3kpKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoel9vcmRlcikKKyAgICAgICp6X29yZGVyID0gYW5ub3RfaW5kZXg7CisgICAgcmV0dXJuIHBDb250cm9sOworICB9CisgIHJldHVybiBudWxscHRyOworfQorCitDUERGX0Zvcm1Db250cm9sKiBDUERGX0ludGVyRm9ybTo6R2V0Q29udHJvbEJ5RGljdCgKKyAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBXaWRnZXREaWN0KSBjb25zdCB7CisgIGNvbnN0IGF1dG8gaXQgPSBtX0NvbnRyb2xNYXAuZmluZChwV2lkZ2V0RGljdCk7CisgIHJldHVybiBpdCAhPSBtX0NvbnRyb2xNYXAuZW5kKCkgPyBpdC0+c2Vjb25kIDogbnVsbHB0cjsKK30KKworRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6TmVlZENvbnN0cnVjdEFQKCkgeworICByZXR1cm4gbV9wRm9ybURpY3QgJiYgbV9wRm9ybURpY3QtPkdldEJvb2xlYW4oIk5lZWRBcHBlYXJhbmNlcyIpOworfQordm9pZCBDUERGX0ludGVyRm9ybTo6TmVlZENvbnN0cnVjdEFQKEZYX0JPT0wgYk5lZWRBUCkgeworICBpZiAoIW1fcEZvcm1EaWN0KSB7CisgICAgSW5pdEludGVyRm9ybURpY3QobV9wRm9ybURpY3QsIG1fcERvY3VtZW50KTsKKyAgfQorICBtX3BGb3JtRGljdC0+U2V0QXRCb29sZWFuKCJOZWVkQXBwZWFyYW5jZXMiLCBiTmVlZEFQKTsKKyAgbV9iR2VuZXJhdGVBUCA9IGJOZWVkQVA7Cit9CitpbnQgQ1BERl9JbnRlckZvcm06OkNvdW50RmllbGRzSW5DYWxjdWxhdGlvbk9yZGVyKCkgeworICBpZiAoIW1fcEZvcm1EaWN0KSB7CiAgICAgcmV0dXJuIDA7Ci0jZW5kaWYKKyAgfQorICBDUERGX0FycmF5KiBwQXJyYXkgPSBtX3BGb3JtRGljdC0+R2V0QXJyYXkoIkNPIik7CisgIHJldHVybiBwQXJyYXkgPyBwQXJyYXktPkdldENvdW50KCkgOiAwOwogfQotQ1BERl9Gb250KiBDUERGX0ludGVyRm9ybTo6QWRkTmF0aXZlRm9udChGWF9CWVRFIGNoYXJTZXQsIGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLSAgICBpZiAocERvY3VtZW50ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfRm9udCogcEZvbnQgPSBOVUxMOwotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgICBMT0dGT05UQSBsZjsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lID0gR2V0TmF0aXZlRm9udChjaGFyU2V0LCAmbGYpOwotICAgIGlmICghY3NGb250TmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgaWYgKGNzRm9udE5hbWUgPT0gIkhlbHZldGljYSIpIHsKLSAgICAgICAgICAgIHBGb250ID0gQWRkU3RhbmRhcmRGb250KHBEb2N1bWVudCwgY3NGb250TmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwRm9udCA9ICgoQ1BERl9Eb2N1bWVudCopcERvY3VtZW50KS0+QWRkV2luZG93c0ZvbnQoJmxmLCBGQUxTRSwgVFJVRSk7Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLSAgICByZXR1cm4gcEZvbnQ7Ci19Ci1DUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpBZGROYXRpdmVGb250KGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLSAgICBpZiAocERvY3VtZW50ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfRm9udCogcEZvbnQgPSBOVUxMOwotICAgIEZYX0JZVEUgY2hhclNldCA9IEdldE5hdGl2ZUNoYXJTZXQoKTsKLSAgICBwRm9udCA9IEFkZE5hdGl2ZUZvbnQoY2hhclNldCwgcERvY3VtZW50KTsKLSAgICByZXR1cm4gcEZvbnQ7Ci19Ci1GWF9CT09MIENQREZfSW50ZXJGb3JtOjpWYWxpZGF0ZUZpZWxkTmFtZShDRlhfV2lkZVN0cmluZyYgY3NOZXdGaWVsZE5hbWUsIGludCBpVHlwZSwgY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBFeGNsdWRlZEZpZWxkLCBjb25zdCBDUERGX0Zvcm1Db250cm9sKiBwRXhjbHVkZWRDb250cm9sKQotewotICAgIGlmIChjc05ld0ZpZWxkTmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpbnQgaVBvcyA9IDA7Ci0gICAgaW50IGlMZW5ndGggPSBjc05ld0ZpZWxkTmFtZS5HZXRMZW5ndGgoKTsKLSAgICBDRlhfV2lkZVN0cmluZyBjc1N1YjsKLSAgICB3aGlsZSAoVFJVRSkgewotICAgICAgICB3aGlsZSAoaVBvcyA8IGlMZW5ndGggJiYgKGNzTmV3RmllbGROYW1lW2lQb3NdID09IEwnLicgfHwgY3NOZXdGaWVsZE5hbWVbaVBvc10gPT0gTCcgJykpIHsKLSAgICAgICAgICAgIGlQb3MgKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlQb3MgPCBpTGVuZ3RoICYmICFjc1N1Yi5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGNzU3ViICs9IEwnLic7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKGlQb3MgPCBpTGVuZ3RoICYmIGNzTmV3RmllbGROYW1lW2lQb3NdICE9IEwnLicpIHsKLSAgICAgICAgICAgIGNzU3ViICs9IGNzTmV3RmllbGROYW1lW2lQb3MgKytdOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSBjc1N1Yi5HZXRMZW5ndGgoKSAtIDE7IGkgPiAtMTsgaSAtLSkgewotICAgICAgICAgICAgaWYgKGNzU3ViW2ldID09IEwnICcgfHwgY3NTdWJbaV0gPT0gTCcuJykgewotICAgICAgICAgICAgICAgIGNzU3ViLlNldEF0KGksIEwnXDAnKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRFdPUkQgZHdDb3VudCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkNvdW50RmllbGRzKCk7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgbSA9IDA7IG0gPCBkd0NvdW50OyBtICsrKSB7Ci0gICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gbV9wRmllbGRUcmVlLT5tX1Jvb3QuR2V0RmllbGQobSk7Ci0gICAgICAgICAgICBpZiAocEZpZWxkID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwRmllbGQgPT0gcEV4Y2x1ZGVkRmllbGQpIHsKLSAgICAgICAgICAgICAgICBpZiAocEV4Y2x1ZGVkQ29udHJvbCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwRmllbGQtPkNvdW50Q29udHJvbHMoKSA8IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NGdWxsTmFtZSA9IHBGaWVsZC0+R2V0RnVsbE5hbWUoKTsKLSAgICAgICAgICAgIGludCBpUmV0ID0gQ29tcGFyZUZpZWxkTmFtZShjc1N1YiwgY3NGdWxsTmFtZSk7Ci0gICAgICAgICAgICBpZiAoaVJldCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBGaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gaVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaVJldCA9PSAyICYmIGNzU3ViID09IGNzTmV3RmllbGROYW1lKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNzRnVsbE5hbWVbaVBvc10gPT0gTCcuJykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChpUmV0ID09IDMgJiYgY3NTdWIgPT0gY3NOZXdGaWVsZE5hbWUpIHsKLSAgICAgICAgICAgICAgICBpZiAoY3NOZXdGaWVsZE5hbWVbY3NGdWxsTmFtZS5HZXRMZW5ndGgoKV0gPT0gTCcuJykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChpUG9zID49IGlMZW5ndGgpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChjc1N1Yi5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBjc05ld0ZpZWxkTmFtZSA9IGNzU3ViOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6VmFsaWRhdGVGaWVsZE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lLCBpbnQgaVR5cGUpCi17Ci0gICAgcmV0dXJuIFZhbGlkYXRlRmllbGROYW1lKGNzTmV3RmllbGROYW1lLCBpVHlwZSwgTlVMTCwgTlVMTCk7Ci19Ci1GWF9CT09MIENQREZfSW50ZXJGb3JtOjpWYWxpZGF0ZUZpZWxkTmFtZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBDRlhfV2lkZVN0cmluZyYgY3NOZXdGaWVsZE5hbWUpCi17Ci0gICAgaWYgKHBGaWVsZCA9PSBOVUxMIHx8IGNzTmV3RmllbGROYW1lLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBWYWxpZGF0ZUZpZWxkTmFtZShjc05ld0ZpZWxkTmFtZSwgKChDUERGX0Zvcm1GaWVsZCopcEZpZWxkKS0+R2V0RmllbGRUeXBlKCksIHBGaWVsZCwgTlVMTCk7Ci19Ci1GWF9CT09MIENQREZfSW50ZXJGb3JtOjpWYWxpZGF0ZUZpZWxkTmFtZShjb25zdCBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCwgQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lKQotewotICAgIGlmIChwQ29udHJvbCA9PSBOVUxMIHx8IGNzTmV3RmllbGROYW1lLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSAoKENQREZfRm9ybUNvbnRyb2wqKXBDb250cm9sKS0+R2V0RmllbGQoKTsKLSAgICByZXR1cm4gVmFsaWRhdGVGaWVsZE5hbWUoY3NOZXdGaWVsZE5hbWUsIHBGaWVsZC0+R2V0RmllbGRUeXBlKCksIHBGaWVsZCwgcENvbnRyb2wpOwotfQotaW50IENQREZfSW50ZXJGb3JtOjpDb21wYXJlRmllbGROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lMSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUyKQotewotICAgIEZYX0xQQ1NUUiBwdHIxID0gbmFtZTEsIHB0cjIgPSBuYW1lMjsKLSAgICBpZiAobmFtZTEuR2V0TGVuZ3RoKCkgIT0gbmFtZTIuR2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB3aGlsZSAocHRyMVtpXSA9PSBwdHIyW2ldKSB7Ci0gICAgICAgICAgICBpICsrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpID09IG5hbWUxLkdldExlbmd0aCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgfQotICAgICAgICBpZiAoaSA9PSBuYW1lMi5HZXRMZW5ndGgoKSkgewotICAgICAgICAgICAgcmV0dXJuIDM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG5hbWUxID09IG5hbWUyID8gMSA6IDA7Ci0gICAgfQotfQotaW50IENQREZfSW50ZXJGb3JtOjpDb21wYXJlRmllbGROYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBuYW1lMSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG5hbWUyKQotewotICAgIEZYX0xQQ1dTVFIgcHRyMSA9IG5hbWUxLmNfc3RyKCk7Ci0gICAgRlhfTFBDV1NUUiBwdHIyID0gbmFtZTIuY19zdHIoKTsKLSAgICBpZiAobmFtZTEuR2V0TGVuZ3RoKCkgIT0gbmFtZTIuR2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB3aGlsZSAocHRyMVtpXSA9PSBwdHIyW2ldKSB7Ci0gICAgICAgICAgICBpICsrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpID09IG5hbWUxLkdldExlbmd0aCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgfQotICAgICAgICBpZiAoaSA9PSBuYW1lMi5HZXRMZW5ndGgoKSkgewotICAgICAgICAgICAgcmV0dXJuIDM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG5hbWUxID09IG5hbWUyID8gMSA6IDA7Ci0gICAgfQotfQotRlhfRFdPUkQgQ1BERl9JbnRlckZvcm06OkNvdW50RmllbGRzKGNvbnN0IENGWF9XaWRlU3RyaW5nICZjc0ZpZWxkTmFtZSkKLXsKLSAgICBpZiAoY3NGaWVsZE5hbWUuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiAoRlhfRFdPUkQpbV9wRmllbGRUcmVlLT5tX1Jvb3QuQ291bnRGaWVsZHMoKTsKLSAgICB9Ci0gICAgQ0ZpZWxkVHJlZTo6X05vZGUgKnBOb2RlID0gbV9wRmllbGRUcmVlLT5GaW5kTm9kZShjc0ZpZWxkTmFtZSk7Ci0gICAgaWYgKHBOb2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBwTm9kZS0+Q291bnRGaWVsZHMoKTsKLX0KLUNQREZfRm9ybUZpZWxkKiBDUERGX0ludGVyRm9ybTo6R2V0RmllbGQoRlhfRFdPUkQgaW5kZXgsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZjc0ZpZWxkTmFtZSkKLXsKLSAgICBpZiAoY3NGaWVsZE5hbWUgPT0gTCIiKSB7Ci0gICAgICAgIHJldHVybiBtX3BGaWVsZFRyZWUtPm1fUm9vdC5HZXRGaWVsZChpbmRleCk7Ci0gICAgfQotICAgIENGaWVsZFRyZWU6Ol9Ob2RlICpwTm9kZSA9IG1fcEZpZWxkVHJlZS0+RmluZE5vZGUoY3NGaWVsZE5hbWUpOwotICAgIGlmIChwTm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gcE5vZGUtPkdldEZpZWxkKGluZGV4KTsKLX0KLXZvaWQgQ1BERl9JbnRlckZvcm06OkdldEFsbEZpZWxkTmFtZXMoQ0ZYX1dpZGVTdHJpbmdBcnJheSYgYWxsRmllbGROYW1lcykKLXsKLSAgICBhbGxGaWVsZE5hbWVzLlJlbW92ZUFsbCgpOwotICAgIGludCBuQ291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpICsrKSB7Ci0gICAgICAgIENQREZfRm9ybUZpZWxkICpwRmllbGQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5HZXRGaWVsZChpKTsKLSAgICAgICAgaWYgKHBGaWVsZCkgewotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgZnVsbF9uYW1lID0gR2V0RnVsbE5hbWUocEZpZWxkLT5HZXRGaWVsZERpY3QoKSk7Ci0gICAgICAgICAgICBhbGxGaWVsZE5hbWVzLkFkZChmdWxsX25hbWUpOwotICAgICAgICB9Ci0gICAgfQotfQotRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6SXNWYWxpZEZvcm1GaWVsZChjb25zdCB2b2lkKiBwRmllbGQpCi17Ci0gICAgaWYgKHBGaWVsZCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaW50IG5Db3VudCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkNvdW50RmllbGRzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgewotICAgICAgICBDUERGX0Zvcm1GaWVsZCAqcEZvcm1GaWVsZCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkdldEZpZWxkKGkpOwotICAgICAgICBpZiAocEZpZWxkID09IHBGb3JtRmllbGQpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLUNQREZfRm9ybUZpZWxkKiBDUERGX0ludGVyRm9ybTo6R2V0RmllbGRCeURpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0KSBjb25zdAotewotICAgIGlmIChwRmllbGREaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENGWF9XaWRlU3RyaW5nIGNzV05hbWUgPSBHZXRGdWxsTmFtZShwRmllbGREaWN0KTsKLSAgICByZXR1cm4gbV9wRmllbGRUcmVlLT5HZXRGaWVsZChjc1dOYW1lKTsKLX0KLUZYX0RXT1JEIENQREZfSW50ZXJGb3JtOjpDb3VudENvbnRyb2xzKENGWF9XaWRlU3RyaW5nIGNzRmllbGROYW1lKQotewotICAgIGlmIChjc0ZpZWxkTmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIChGWF9EV09SRCltX0NvbnRyb2xNYXAuR2V0Q291bnQoKTsKLSAgICB9Ci0gICAgQ1BERl9Gb3JtRmllbGQgKnBGaWVsZCA9IG1fcEZpZWxkVHJlZS0+R2V0RmllbGQoY3NGaWVsZE5hbWUpOwotICAgIGlmIChwRmllbGQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHBGaWVsZC0+bV9Db250cm9sTGlzdC5HZXRTaXplKCk7Ci19Ci1DUERGX0Zvcm1Db250cm9sKiBDUERGX0ludGVyRm9ybTo6R2V0Q29udHJvbChGWF9EV09SRCBpbmRleCwgQ0ZYX1dpZGVTdHJpbmcgY3NGaWVsZE5hbWUpCi17Ci0gICAgQ1BERl9Gb3JtRmllbGQgKnBGaWVsZCA9IG1fcEZpZWxkVHJlZS0+R2V0RmllbGQoY3NGaWVsZE5hbWUpOwotICAgIGlmIChwRmllbGQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKGluZGV4IDwgKEZYX0RXT1JEKXBGaWVsZC0+bV9Db250cm9sTGlzdC5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIChDUERGX0Zvcm1Db250cm9sICopcEZpZWxkLT5tX0NvbnRyb2xMaXN0LkdldEF0KGluZGV4KTsKLSAgICB9CitDUERGX0Zvcm1GaWVsZCogQ1BERl9JbnRlckZvcm06OkdldEZpZWxkSW5DYWxjdWxhdGlvbk9yZGVyKGludCBpbmRleCkgeworICBpZiAoIW1fcEZvcm1EaWN0IHx8IGluZGV4IDwgMCkgewogICAgIHJldHVybiBOVUxMOwotfQotRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6SXNWYWxpZEZvcm1Db250cm9sKGNvbnN0IHZvaWQqIHBDb250cm9sKQotewotICAgIGlmIChwQ29udHJvbCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9Db250cm9sTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcFdpZGdldERpY3QgPSBOVUxMOwotICAgICAgICB2b2lkKiBwRm9ybUNvbnRyb2wgPSBOVUxMOwotICAgICAgICBtX0NvbnRyb2xNYXAuR2V0TmV4dEFzc29jKHBvcywgKEZYX0xQVk9JRCYpcFdpZGdldERpY3QsIHBGb3JtQ29udHJvbCk7Ci0gICAgICAgIGlmIChwQ29udHJvbCA9PSBwRm9ybUNvbnRyb2wpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLWludCBDUERGX0ludGVyRm9ybTo6Q291bnRQYWdlQ29udHJvbHMoQ1BERl9QYWdlKiBwUGFnZSkgY29uc3QKLXsKLSAgICBDUERGX0FycmF5KiBwQW5ub3RMaXN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRBcnJheSgiQW5ub3RzIik7Ci0gICAgaWYgKHBBbm5vdExpc3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW50IGNvdW50ID0gMDsKLSAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFubm90TGlzdC0+R2V0Q291bnQoKTsgaSArKykgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdCA9IHBBbm5vdExpc3QtPkdldERpY3QoaSk7Ci0gICAgICAgIGlmIChwQW5ub3QgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2w7Ci0gICAgICAgIGlmICghbV9Db250cm9sTWFwLkxvb2t1cChwQW5ub3QsIChGWF9MUFZPSUQmKXBDb250cm9sKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgY291bnQgKys7Ci0gICAgfQotICAgIHJldHVybiBjb3VudDsKLX0KLUNQREZfRm9ybUNvbnRyb2wqIENQREZfSW50ZXJGb3JtOjpHZXRQYWdlQ29udHJvbChDUERGX1BhZ2UqIHBQYWdlLCBpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgQ1BERl9BcnJheSogcEFubm90TGlzdCA9IHBQYWdlLT5tX3BGb3JtRGljdC0+R2V0QXJyYXkoIkFubm90cyIpOwotICAgIGlmIChwQW5ub3RMaXN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGludCBjb3VudCA9IDA7Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBBbm5vdExpc3QtPkdldENvdW50KCk7IGkgKyspIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3QgPSBwQW5ub3RMaXN0LT5HZXREaWN0KGkpOwotICAgICAgICBpZiAocEFubm90ID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sOwotICAgICAgICBpZiAoIW1fQ29udHJvbE1hcC5Mb29rdXAocEFubm90LCAoRlhfTFBWT0lEJilwQ29udHJvbCkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbmRleCA9PSBjb3VudCkgewotICAgICAgICAgICAgcmV0dXJuIHBDb250cm9sOwotICAgICAgICB9Ci0gICAgICAgIGNvdW50ICsrOwotICAgIH0KKyAgfQorICBDUERGX0FycmF5KiBwQXJyYXkgPSBtX3BGb3JtRGljdC0+R2V0QXJyYXkoIkNPIik7CisgIGlmICghcEFycmF5KSB7CiAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKENQREZfRGljdGlvbmFyeSogcEVsZW1lbnQgPQorICAgICAgICAgIFRvRGljdGlvbmFyeShwQXJyYXktPkdldEVsZW1lbnRWYWx1ZShpbmRleCkpKSB7CisgICAgcmV0dXJuIEdldEZpZWxkQnlEaWN0KHBFbGVtZW50KTsKKyAgfQorICByZXR1cm4gTlVMTDsKIH0KLUNQREZfRm9ybUNvbnRyb2wqIENQREZfSW50ZXJGb3JtOjpHZXRDb250cm9sQXRQb2ludChDUERGX1BhZ2UqIHBQYWdlLCBGWF9GTE9BVCBwZGZfeCwgRlhfRkxPQVQgcGRmX3kpIGNvbnN0Ci17Ci0gICAgQ1BERl9BcnJheSogcEFubm90TGlzdCA9IHBQYWdlLT5tX3BGb3JtRGljdC0+R2V0QXJyYXkoIkFubm90cyIpOwotICAgIGlmIChwQW5ub3RMaXN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGZvciAoRlhfRFdPUkQgaSA9IHBBbm5vdExpc3QtPkdldENvdW50KCk7IGkgPiAwOyBpIC0tKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcEFubm90ID0gcEFubm90TGlzdC0+R2V0RGljdChpIC0gMSk7Ci0gICAgICAgIGlmIChwQW5ub3QgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2w7Ci0gICAgICAgIGlmICghbV9Db250cm9sTWFwLkxvb2t1cChwQW5ub3QsIChGWF9MUFZPSUQmKXBDb250cm9sKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0ID0gcENvbnRyb2wtPkdldFJlY3QoKTsKLSAgICAgICAgaWYgKHJlY3QuQ29udGFpbnMocGRmX3gsIHBkZl95KSkgewotICAgICAgICAgICAgcmV0dXJuIHBDb250cm9sOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotQ1BERl9Gb3JtQ29udHJvbCogQ1BERl9JbnRlckZvcm06OkdldENvbnRyb2xCeURpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwV2lkZ2V0RGljdCkgY29uc3QKLXsKLSAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IE5VTEw7Ci0gICAgbV9Db250cm9sTWFwLkxvb2t1cChwV2lkZ2V0RGljdCwgKEZYX0xQVk9JRCYpcENvbnRyb2wpOwotICAgIHJldHVybiBwQ29udHJvbDsKLX0KLUZYX0RXT1JEIENQREZfSW50ZXJGb3JtOjpDb3VudEludGVybmFsRmllbGRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSkgY29uc3QKLXsKLSAgICBpZiAobV9wRm9ybURpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcEFycmF5ID0gbV9wRm9ybURpY3QtPkdldEFycmF5KCJGaWVsZHMiKTsKLSAgICBpZiAocEFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChjc0ZpZWxkTmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIHBBcnJheS0+R2V0Q291bnQoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgaUxlbmd0aCA9IGNzRmllbGROYW1lLkdldExlbmd0aCgpOwotICAgICAgICBpbnQgaVBvcyA9IDA7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBOVUxMOwotICAgICAgICB3aGlsZSAocEFycmF5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzU3ViOwotICAgICAgICAgICAgaWYgKGlQb3MgPCBpTGVuZ3RoICYmIGNzRmllbGROYW1lW2lQb3NdID09IEwnLicpIHsKLSAgICAgICAgICAgICAgICBpUG9zICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKGlQb3MgPCBpTGVuZ3RoICYmIGNzRmllbGROYW1lW2lQb3NdICE9IEwnLicpIHsKLSAgICAgICAgICAgICAgICBjc1N1YiArPSBjc0ZpZWxkTmFtZVtpUG9zICsrXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBpQ291bnQgPSBwQXJyYXktPkdldENvdW50KCk7Ci0gICAgICAgICAgICBGWF9CT09MIGJGaW5kID0gRkFMU0U7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewotICAgICAgICAgICAgICAgIHBEaWN0ID0gcEFycmF5LT5HZXREaWN0KGkpOwotICAgICAgICAgICAgICAgIGlmIChwRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc1QgPSBwRGljdC0+R2V0VW5pY29kZVRleHQoIlQiKTsKLSAgICAgICAgICAgICAgICBpZiAoY3NUID09IGNzU3ViKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJGaW5kID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFiRmluZCkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlQb3MgPj0gaUxlbmd0aCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFycmF5ID0gcERpY3QtPkdldEFycmF5KCJLaWRzIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcEFycmF5ID0gcERpY3QtPkdldEFycmF5KCJLaWRzIik7Ci0gICAgICAgICAgICBpZiAocEFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBBcnJheS0+R2V0Q291bnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLUNQREZfRGljdGlvbmFyeSogQ1BERl9JbnRlckZvcm06OkdldEludGVybmFsRmllbGQoRlhfRFdPUkQgaW5kZXgsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSkgY29uc3QKLXsKLSAgICBpZiAobV9wRm9ybURpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcEFycmF5ID0gbV9wRm9ybURpY3QtPkdldEFycmF5KCJGaWVsZHMiKTsKLSAgICBpZiAocEFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChjc0ZpZWxkTmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIHBBcnJheS0+R2V0RGljdChpbmRleCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IGlMZW5ndGggPSBjc0ZpZWxkTmFtZS5HZXRMZW5ndGgoKTsKLSAgICAgICAgaW50IGlQb3MgPSAwOwotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gTlVMTDsKLSAgICAgICAgd2hpbGUgKHBBcnJheSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc1N1YjsKLSAgICAgICAgICAgIGlmIChpUG9zIDwgaUxlbmd0aCAmJiBjc0ZpZWxkTmFtZVtpUG9zXSA9PSBMJy4nKSB7Ci0gICAgICAgICAgICAgICAgaVBvcyArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChpUG9zIDwgaUxlbmd0aCAmJiBjc0ZpZWxkTmFtZVtpUG9zXSAhPSBMJy4nKSB7Ci0gICAgICAgICAgICAgICAgY3NTdWIgKz0gY3NGaWVsZE5hbWVbaVBvcyArK107Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgaUNvdW50ID0gcEFycmF5LT5HZXRDb3VudCgpOwotICAgICAgICAgICAgRlhfQk9PTCBiRmluZCA9IEZBTFNFOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBwRGljdCA9IHBBcnJheS0+R2V0RGljdChpKTsKLSAgICAgICAgICAgICAgICBpZiAocERpY3QgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NUID0gcERpY3QtPkdldFVuaWNvZGVUZXh0KCJUIik7Ci0gICAgICAgICAgICAgICAgaWYgKGNzVCA9PSBjc1N1YikgewotICAgICAgICAgICAgICAgICAgICBiRmluZCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghYkZpbmQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpUG9zID49IGlMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBBcnJheSA9IHBEaWN0LT5HZXRBcnJheSgiS2lkcyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBBcnJheSA9IHBEaWN0LT5HZXRBcnJheSgiS2lkcyIpOwotICAgICAgICAgICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBEaWN0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcEFycmF5LT5HZXREaWN0KGluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLUZYX0JPT0wgQ1BERl9JbnRlckZvcm06Ok5lZWRDb25zdHJ1Y3RBUCgpCi17Ci0gICAgaWYgKG1fcEZvcm1EaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gbV9wRm9ybURpY3QtPkdldEJvb2xlYW4oIk5lZWRBcHBlYXJhbmNlcyIpOwotfQotdm9pZCBDUERGX0ludGVyRm9ybTo6TmVlZENvbnN0cnVjdEFQKEZYX0JPT0wgYk5lZWRBUCkKLXsKLSAgICBpZiAobV9wRm9ybURpY3QgPT0gTlVMTCkgewotICAgICAgICBJbml0SW50ZXJGb3JtRGljdChtX3BGb3JtRGljdCwgbV9wRG9jdW1lbnQpOwotICAgIH0KLSAgICBtX3BGb3JtRGljdC0+U2V0QXRCb29sZWFuKCJOZWVkQXBwZWFyYW5jZXMiLCBiTmVlZEFQKTsKLSAgICBtX2JHZW5lcmF0ZUFQID0gYk5lZWRBUDsKLX0KLWludCBDUERGX0ludGVyRm9ybTo6Q291bnRGaWVsZHNJbkNhbGN1bGF0aW9uT3JkZXIoKQotewotICAgIGlmIChtX3BGb3JtRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBtX3BGb3JtRGljdC0+R2V0QXJyYXkoIkNPIik7Ci0gICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gcEFycmF5LT5HZXRDb3VudCgpOwotfQotQ1BERl9Gb3JtRmllbGQqIENQREZfSW50ZXJGb3JtOjpHZXRGaWVsZEluQ2FsY3VsYXRpb25PcmRlcihpbnQgaW5kZXgpCi17Ci0gICAgaWYgKG1fcEZvcm1EaWN0ID09IE5VTEwgfHwgaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBtX3BGb3JtRGljdC0+R2V0QXJyYXkoIkNPIik7Ci0gICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcEVsZW1lbnQgPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZShpbmRleCk7Ci0gICAgaWYgKHBFbGVtZW50ICE9IE5VTEwgJiYgcEVsZW1lbnQtPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICByZXR1cm4gR2V0RmllbGRCeURpY3QoKENQREZfRGljdGlvbmFyeSopcEVsZW1lbnQpOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLWludCBDUERGX0ludGVyRm9ybTo6RmluZEZpZWxkSW5DYWxjdWxhdGlvbk9yZGVyKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQpCi17Ci0gICAgaWYgKG1fcEZvcm1EaWN0ID09IE5VTEwgfHwgcEZpZWxkID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBtX3BGb3JtRGljdC0+R2V0QXJyYXkoIkNPIik7Ci0gICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBBcnJheS0+R2V0Q291bnQoKTsgaSArKykgewotICAgICAgICBDUERGX09iamVjdCogcEVsZW1lbnQgPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZShpKTsKLSAgICAgICAgaWYgKHBFbGVtZW50ID09IHBGaWVsZC0+bV9wRGljdCkgewotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLSAgICB9CitpbnQgQ1BERl9JbnRlckZvcm06OkZpbmRGaWVsZEluQ2FsY3VsYXRpb25PcmRlcihjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkKSB7CisgIGlmICghbV9wRm9ybURpY3QgfHwgIXBGaWVsZCkgewogICAgIHJldHVybiAtMTsKLX0KLUZYX0RXT1JEIENQREZfSW50ZXJGb3JtOjpDb3VudEZvcm1Gb250cygpCi17Ci0gICAgcmV0dXJuIENvdW50SW50ZXJGb3JtRm9udHMobV9wRm9ybURpY3QpOwotfQotQ1BERl9Gb250KiBDUERGX0ludGVyRm9ybTo6R2V0Rm9ybUZvbnQoRlhfRFdPUkQgaW5kZXgsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCi17Ci0gICAgcmV0dXJuIEdldEludGVyRm9ybUZvbnQobV9wRm9ybURpY3QsIG1fcERvY3VtZW50LCBpbmRleCwgY3NOYW1lVGFnKTsKLX0KLUNQREZfRm9udCogQ1BERl9JbnRlckZvcm06OkdldEZvcm1Gb250KENGWF9CeXRlU3RyaW5nIGNzTmFtZVRhZykKLXsKLSAgICByZXR1cm4gR2V0SW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgbV9wRG9jdW1lbnQsIGNzTmFtZVRhZyk7Ci19Ci1DUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpHZXRGb3JtRm9udChDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lLCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKQotewotICAgIHJldHVybiBHZXRJbnRlckZvcm1Gb250KG1fcEZvcm1EaWN0LCBtX3BEb2N1bWVudCwgY3NGb250TmFtZSwgY3NOYW1lVGFnKTsKLX0KLUNQREZfRm9udCogQ1BERl9JbnRlckZvcm06OkdldE5hdGl2ZUZvcm1Gb250KEZYX0JZVEUgY2hhclNldCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKLXsKLSAgICByZXR1cm4gR2V0TmF0aXZlSW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgbV9wRG9jdW1lbnQsIGNoYXJTZXQsIGNzTmFtZVRhZyk7Ci19Ci1DUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpHZXROYXRpdmVGb3JtRm9udChDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKQotewotICAgIHJldHVybiBHZXROYXRpdmVJbnRlckZvcm1Gb250KG1fcEZvcm1EaWN0LCBtX3BEb2N1bWVudCwgY3NOYW1lVGFnKTsKLX0KLUZYX0JPT0wgQ1BERl9JbnRlckZvcm06OkZpbmRGb3JtRm9udChjb25zdCBDUERGX0ZvbnQqIHBGb250LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKQotewotICAgIHJldHVybiBGaW5kSW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgcEZvbnQsIGNzTmFtZVRhZyk7Ci19Ci1GWF9CT09MIENQREZfSW50ZXJGb3JtOjpGaW5kRm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwgQ1BERl9Gb250KiYgcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCi17Ci0gICAgcmV0dXJuIEZpbmRJbnRlckZvcm1Gb250KG1fcEZvcm1EaWN0LCBtX3BEb2N1bWVudCwgY3NGb250TmFtZSwgcEZvbnQsIGNzTmFtZVRhZyk7Ci19Ci12b2lkIENQREZfSW50ZXJGb3JtOjpBZGRGb3JtRm9udChjb25zdCBDUERGX0ZvbnQqIHBGb250LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKQotewotICAgIEFkZEludGVyRm9ybUZvbnQobV9wRm9ybURpY3QsIG1fcERvY3VtZW50LCBwRm9udCwgY3NOYW1lVGFnKTsKLSAgICBtX2JVcGRhdGVkID0gVFJVRTsKLX0KLUNQREZfRm9udCogQ1BERl9JbnRlckZvcm06OkFkZE5hdGl2ZUZvcm1Gb250KEZYX0JZVEUgY2hhclNldCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKLXsKLSAgICBtX2JVcGRhdGVkID0gVFJVRTsKLSAgICByZXR1cm4gQWRkTmF0aXZlSW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgbV9wRG9jdW1lbnQsIGNoYXJTZXQsIGNzTmFtZVRhZyk7Ci19Ci1DUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpBZGROYXRpdmVGb3JtRm9udChDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKQotewotICAgIG1fYlVwZGF0ZWQgPSBUUlVFOwotICAgIHJldHVybiBBZGROYXRpdmVJbnRlckZvcm1Gb250KG1fcEZvcm1EaWN0LCBtX3BEb2N1bWVudCwgY3NOYW1lVGFnKTsKLX0KLXZvaWQgQ1BERl9JbnRlckZvcm06OlJlbW92ZUZvcm1Gb250KGNvbnN0IENQREZfRm9udCogcEZvbnQpCi17Ci0gICAgbV9iVXBkYXRlZCA9IFRSVUU7Ci0gICAgUmVtb3ZlSW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgcEZvbnQpOwotfQotdm9pZCBDUERGX0ludGVyRm9ybTo6UmVtb3ZlRm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcgY3NOYW1lVGFnKQotewotICAgIG1fYlVwZGF0ZWQgPSBUUlVFOwotICAgIFJlbW92ZUludGVyRm9ybUZvbnQobV9wRm9ybURpY3QsIGNzTmFtZVRhZyk7Ci19Ci1DUERGX0RlZmF1bHRBcHBlYXJhbmNlIENQREZfSW50ZXJGb3JtOjpHZXREZWZhdWx0QXBwZWFyYW5jZSgpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NEQTsKLSAgICBpZiAobV9wRm9ybURpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gY3NEQTsKKyAgfQorICBDUERGX0FycmF5KiBwQXJyYXkgPSBtX3BGb3JtRGljdC0+R2V0QXJyYXkoIkNPIik7CisgIGlmICghcEFycmF5KSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwQXJyYXktPkdldENvdW50KCk7IGkrKykgeworICAgIENQREZfT2JqZWN0KiBwRWxlbWVudCA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKGkpOworICAgIGlmIChwRWxlbWVudCA9PSBwRmllbGQtPm1fcERpY3QpIHsKKyAgICAgIHJldHVybiBpOwogICAgIH0KLSAgICBjc0RBID0gbV9wRm9ybURpY3QtPkdldFN0cmluZygiREEiKTsKKyAgfQorICByZXR1cm4gLTE7Cit9CitGWF9EV09SRCBDUERGX0ludGVyRm9ybTo6Q291bnRGb3JtRm9udHMoKSB7CisgIHJldHVybiBDb3VudEludGVyRm9ybUZvbnRzKG1fcEZvcm1EaWN0KTsKK30KK0NQREZfRm9udCogQ1BERl9JbnRlckZvcm06OkdldEZvcm1Gb250KEZYX0RXT1JEIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykgeworICByZXR1cm4gR2V0SW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgbV9wRG9jdW1lbnQsIGluZGV4LCBjc05hbWVUYWcpOworfQorQ1BERl9Gb250KiBDUERGX0ludGVyRm9ybTo6R2V0Rm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcgY3NOYW1lVGFnKSB7CisgIHJldHVybiBHZXRJbnRlckZvcm1Gb250KG1fcEZvcm1EaWN0LCBtX3BEb2N1bWVudCwgY3NOYW1lVGFnKTsKK30KK0NQREZfRm9udCogQ1BERl9JbnRlckZvcm06OkdldEZvcm1Gb250KENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKSB7CisgIHJldHVybiBHZXRJbnRlckZvcm1Gb250KG1fcEZvcm1EaWN0LCBtX3BEb2N1bWVudCwgY3NGb250TmFtZSwgY3NOYW1lVGFnKTsKK30KK0NQREZfRm9udCogQ1BERl9JbnRlckZvcm06OkdldE5hdGl2ZUZvcm1Gb250KHVpbnQ4X3QgY2hhclNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpIHsKKyAgcmV0dXJuIEdldE5hdGl2ZUludGVyRm9ybUZvbnQobV9wRm9ybURpY3QsIG1fcERvY3VtZW50LCBjaGFyU2V0LCBjc05hbWVUYWcpOworfQorQ1BERl9Gb250KiBDUERGX0ludGVyRm9ybTo6R2V0TmF0aXZlRm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykgeworICByZXR1cm4gR2V0TmF0aXZlSW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgbV9wRG9jdW1lbnQsIGNzTmFtZVRhZyk7Cit9CitGWF9CT09MIENQREZfSW50ZXJGb3JtOjpGaW5kRm9ybUZvbnQoY29uc3QgQ1BERl9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKSB7CisgIHJldHVybiBGaW5kSW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgcEZvbnQsIGNzTmFtZVRhZyk7Cit9CitGWF9CT09MIENQREZfSW50ZXJGb3JtOjpGaW5kRm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqJiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKSB7CisgIHJldHVybiBGaW5kSW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgbV9wRG9jdW1lbnQsIGNzRm9udE5hbWUsIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NOYW1lVGFnKTsKK30KK3ZvaWQgQ1BERl9JbnRlckZvcm06OkFkZEZvcm1Gb250KGNvbnN0IENQREZfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKSB7CisgIEFkZEludGVyRm9ybUZvbnQobV9wRm9ybURpY3QsIG1fcERvY3VtZW50LCBwRm9udCwgY3NOYW1lVGFnKTsKKyAgbV9iVXBkYXRlZCA9IFRSVUU7Cit9CitDUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpBZGROYXRpdmVGb3JtRm9udCh1aW50OF90IGNoYXJTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKSB7CisgIG1fYlVwZGF0ZWQgPSBUUlVFOworICByZXR1cm4gQWRkTmF0aXZlSW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgbV9wRG9jdW1lbnQsIGNoYXJTZXQsIGNzTmFtZVRhZyk7Cit9CitDUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpBZGROYXRpdmVGb3JtRm9udChDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKSB7CisgIG1fYlVwZGF0ZWQgPSBUUlVFOworICByZXR1cm4gQWRkTmF0aXZlSW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgbV9wRG9jdW1lbnQsIGNzTmFtZVRhZyk7Cit9Cit2b2lkIENQREZfSW50ZXJGb3JtOjpSZW1vdmVGb3JtRm9udChjb25zdCBDUERGX0ZvbnQqIHBGb250KSB7CisgIG1fYlVwZGF0ZWQgPSBUUlVFOworICBSZW1vdmVJbnRlckZvcm1Gb250KG1fcEZvcm1EaWN0LCBwRm9udCk7Cit9Cit2b2lkIENQREZfSW50ZXJGb3JtOjpSZW1vdmVGb3JtRm9udChDRlhfQnl0ZVN0cmluZyBjc05hbWVUYWcpIHsKKyAgbV9iVXBkYXRlZCA9IFRSVUU7CisgIFJlbW92ZUludGVyRm9ybUZvbnQobV9wRm9ybURpY3QsIGNzTmFtZVRhZyk7Cit9CitDUERGX0RlZmF1bHRBcHBlYXJhbmNlIENQREZfSW50ZXJGb3JtOjpHZXREZWZhdWx0QXBwZWFyYW5jZSgpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgY3NEQTsKKyAgaWYgKCFtX3BGb3JtRGljdCkgewogICAgIHJldHVybiBjc0RBOworICB9CisgIGNzREEgPSBtX3BGb3JtRGljdC0+R2V0U3RyaW5nKCJEQSIpOworICByZXR1cm4gY3NEQTsKIH0KLUNQREZfRm9udCogQ1BERl9JbnRlckZvcm06OkdldERlZmF1bHRGb3JtRm9udCgpCi17Ci0gICAgcmV0dXJuIEdldERlZmF1bHRJbnRlckZvcm1Gb250KG1fcEZvcm1EaWN0LCBtX3BEb2N1bWVudCk7CitDUERGX0ZvbnQqIENQREZfSW50ZXJGb3JtOjpHZXREZWZhdWx0Rm9ybUZvbnQoKSB7CisgIHJldHVybiBHZXREZWZhdWx0SW50ZXJGb3JtRm9udChtX3BGb3JtRGljdCwgbV9wRG9jdW1lbnQpOwogfQotaW50IENQREZfSW50ZXJGb3JtOjpHZXRGb3JtQWxpZ25tZW50KCkKLXsKLSAgICBpZiAobV9wRm9ybURpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIG1fcEZvcm1EaWN0LT5HZXRJbnRlZ2VyKCJRIiwgMCk7CitpbnQgQ1BERl9JbnRlckZvcm06OkdldEZvcm1BbGlnbm1lbnQoKSB7CisgIHJldHVybiBtX3BGb3JtRGljdCA/IG1fcEZvcm1EaWN0LT5HZXRJbnRlZ2VyKCJRIiwgMCkgOiAwOwogfQotRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6UmVzZXRGb3JtKGNvbnN0IENGWF9QdHJBcnJheSYgZmllbGRzLCBGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlLCBGWF9CT09MIGJOb3RpZnkpCi17Ci0gICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7Ci0gICAgICAgIGludCBpUmV0ID0gbV9wRm9ybU5vdGlmeS0+QmVmb3JlRm9ybVJlc2V0KHRoaXMpOwotICAgICAgICBpZiAoaVJldCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpbnQgbkNvdW50ID0gbV9wRmllbGRUcmVlLT5tX1Jvb3QuQ291bnRGaWVsZHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7Ci0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5HZXRGaWVsZChpKTsKLSAgICAgICAgaWYgKHBGaWVsZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBGWF9CT09MIGJGaW5kID0gRkFMU0U7Ci0gICAgICAgIGludCBpQ291bnQgPSBmaWVsZHMuR2V0U2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewotICAgICAgICAgICAgaWYgKHBGaWVsZCA9PSAoQ1BERl9Gb3JtRmllbGQqKWZpZWxkc1tpXSkgewotICAgICAgICAgICAgICAgIGJGaW5kID0gVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoKGJJbmNsdWRlT3JFeGNsdWRlICYmIGJGaW5kKSB8fCAoIWJJbmNsdWRlT3JFeGNsdWRlICYmICFiRmluZCkpIHsKLSAgICAgICAgICAgIHBGaWVsZC0+UmVzZXRGaWVsZChiTm90aWZ5KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKLSAgICAgICAgbV9wRm9ybU5vdGlmeS0+QWZ0ZXJGb3JtUmVzZXQodGhpcyk7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOworCitib29sIENQREZfSW50ZXJGb3JtOjpSZXNldEZvcm0oY29uc3Qgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiYgZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkluY2x1ZGVPckV4Y2x1ZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5KSB7CisgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm1Ob3RpZnkgJiYgbV9wRm9ybU5vdGlmeS0+QmVmb3JlRm9ybVJlc2V0KHRoaXMpIDwgMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW50IG5Db3VudCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkNvdW50RmllbGRzKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyArK2kpIHsKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gbV9wRmllbGRUcmVlLT5tX1Jvb3QuR2V0RmllbGQoaSk7CisgICAgaWYgKCFwRmllbGQpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChiSW5jbHVkZU9yRXhjbHVkZSA9PSBwZGZpdW06OkNvbnRhaW5zVmFsdWUoZmllbGRzLCBwRmllbGQpKQorICAgICAgcEZpZWxkLT5SZXNldEZpZWxkKGJOb3RpZnkpOworICB9CisgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm1Ob3RpZnkpCisgICAgbV9wRm9ybU5vdGlmeS0+QWZ0ZXJGb3JtUmVzZXQodGhpcyk7CisgIHJldHVybiB0cnVlOwogfQotRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6UmVzZXRGb3JtKEZYX0JPT0wgYk5vdGlmeSkKLXsKLSAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKLSAgICAgICAgaW50IGlSZXQgPSBtX3BGb3JtTm90aWZ5LT5CZWZvcmVGb3JtUmVzZXQodGhpcyk7Ci0gICAgICAgIGlmIChpUmV0IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIGludCBuQ291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKLSAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkdldEZpZWxkKGkpOwotICAgICAgICBpZiAocEZpZWxkID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHBGaWVsZC0+UmVzZXRGaWVsZChiTm90aWZ5KTsKLSAgICB9Ci0gICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7Ci0gICAgICAgIG1fcEZvcm1Ob3RpZnktPkFmdGVyRm9ybVJlc2V0KHRoaXMpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKworYm9vbCBDUERGX0ludGVyRm9ybTo6UmVzZXRGb3JtKGJvb2wgYk5vdGlmeSkgeworICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtTm90aWZ5ICYmIG1fcEZvcm1Ob3RpZnktPkJlZm9yZUZvcm1SZXNldCh0aGlzKSA8IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIGludCBuQ291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOworICBmb3IgKGludCBpID0gMDsgaSA8IG5Db3VudDsgKytpKSB7CisgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkdldEZpZWxkKGkpOworICAgIGlmICghcEZpZWxkKQorICAgICAgY29udGludWU7CisKKyAgICBwRmllbGQtPlJlc2V0RmllbGQoYk5vdGlmeSk7CisgIH0KKyAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybU5vdGlmeSkKKyAgICBtX3BGb3JtTm90aWZ5LT5BZnRlckZvcm1SZXNldCh0aGlzKTsKKyAgcmV0dXJuIHRydWU7CiB9Ci12b2lkIENQREZfSW50ZXJGb3JtOjpSZWxvYWRGb3JtKCkKLXsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBtX0NvbnRyb2xNYXAuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwV2lkZ2V0RGljdDsKLSAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2w7Ci0gICAgICAgIG1fQ29udHJvbE1hcC5HZXROZXh0QXNzb2MocG9zLCAoRlhfTFBWT0lEJilwV2lkZ2V0RGljdCwgKEZYX0xQVk9JRCYpcENvbnRyb2wpOwotICAgICAgICBkZWxldGUgcENvbnRyb2w7CisKK3ZvaWQgQ1BERl9JbnRlckZvcm06OkxvYWRGaWVsZChDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QsIGludCBuTGV2ZWwpIHsKKyAgaWYgKG5MZXZlbCA+IG5NYXhSZWN1cnNpb24pIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFwRmllbGREaWN0KSB7CisgICAgcmV0dXJuOworICB9CisgIEZYX0RXT1JEIGR3UGFyZW50T2JqTnVtID0gcEZpZWxkRGljdC0+R2V0T2JqTnVtKCk7CisgIENQREZfQXJyYXkqIHBLaWRzID0gcEZpZWxkRGljdC0+R2V0QXJyYXkoIktpZHMiKTsKKyAgaWYgKCFwS2lkcykgeworICAgIEFkZFRlcm1pbmFsRmllbGQocEZpZWxkRGljdCk7CisgICAgcmV0dXJuOworICB9CisgIENQREZfRGljdGlvbmFyeSogcEZpcnN0S2lkID0gcEtpZHMtPkdldERpY3QoMCk7CisgIGlmICghcEZpcnN0S2lkKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChwRmlyc3RLaWQtPktleUV4aXN0KCJUIikgfHwgcEZpcnN0S2lkLT5LZXlFeGlzdCgiS2lkcyIpKSB7CisgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBLaWRzLT5HZXRDb3VudCgpOyBpKyspIHsKKyAgICAgIENQREZfRGljdGlvbmFyeSogcENoaWxkRGljdCA9IHBLaWRzLT5HZXREaWN0KGkpOworICAgICAgaWYgKHBDaGlsZERpY3QpIHsKKyAgICAgICAgaWYgKHBDaGlsZERpY3QtPkdldE9iak51bSgpICE9IGR3UGFyZW50T2JqTnVtKSB7CisgICAgICAgICAgTG9hZEZpZWxkKHBDaGlsZERpY3QsIG5MZXZlbCArIDEpOworICAgICAgICB9CisgICAgICB9CiAgICAgfQotICAgIG1fQ29udHJvbE1hcC5SZW1vdmVBbGwoKTsKLSAgICBpbnQgbkNvdW50ID0gbV9wRmllbGRUcmVlLT5tX1Jvb3QuQ291bnRGaWVsZHMoKTsKLSAgICBmb3IgKGludCBrID0gMDsgayA8IG5Db3VudDsgayArKykgewotICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gbV9wRmllbGRUcmVlLT5tX1Jvb3QuR2V0RmllbGQoayk7Ci0gICAgICAgIGRlbGV0ZSBwRmllbGQ7Ci0gICAgfQotICAgIG1fcEZpZWxkVHJlZS0+UmVtb3ZlQWxsKCk7Ci0gICAgaWYgKG1fcEZvcm1EaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX0FycmF5KiBwRmllbGRzID0gbV9wRm9ybURpY3QtPkdldEFycmF5KCJGaWVsZHMiKTsKLSAgICBpZiAocEZpZWxkcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IGlDb3VudCA9IHBGaWVsZHMtPkdldENvdW50KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsKLSAgICAgICAgTG9hZEZpZWxkKHBGaWVsZHMtPkdldERpY3QoaSkpOwotICAgIH0KKyAgfSBlbHNlIHsKKyAgICBBZGRUZXJtaW5hbEZpZWxkKHBGaWVsZERpY3QpOworICB9CiB9Ci12b2lkIENQREZfSW50ZXJGb3JtOjpMb2FkRmllbGQoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0LCBpbnQgbkxldmVsKQotewotICAgIGlmIChuTGV2ZWwgPiBuTWF4UmVjdXJzaW9uKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHBGaWVsZERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYX0RXT1JEIGR3UGFyZW50T2JqTnVtID0gcEZpZWxkRGljdC0+R2V0T2JqTnVtKCk7Ci0gICAgQ1BERl9BcnJheSogcEtpZHMgPSBwRmllbGREaWN0LT5HZXRBcnJheSgiS2lkcyIpOwotICAgIGlmICghcEtpZHMpIHsKLSAgICAgICAgQWRkVGVybWluYWxGaWVsZChwRmllbGREaWN0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBGaXJzdEtpZCA9IHBLaWRzLT5HZXREaWN0KDApOwotICAgIGlmIChwRmlyc3RLaWQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwRmlyc3RLaWQtPktleUV4aXN0KCJUIikgfHwgcEZpcnN0S2lkLT5LZXlFeGlzdCgiS2lkcyIpKSB7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwS2lkcy0+R2V0Q291bnQoKTsgaSArKykgewotICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5ICogcENoaWxkRGljdCA9IHBLaWRzLT5HZXREaWN0KGkpOwotICAgICAgICAgICAgaWYgKHBDaGlsZERpY3QpIHsKLSAgICAgICAgICAgICAgICBpZiAocENoaWxkRGljdC0+R2V0T2JqTnVtKCkgIT0gZHdQYXJlbnRPYmpOdW0pIHsKLSAgICAgICAgICAgICAgICAgICAgTG9hZEZpZWxkKHBDaGlsZERpY3QsIG5MZXZlbCArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFkZFRlcm1pbmFsRmllbGQocEZpZWxkRGljdCk7Ci0gICAgfQorRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6SGFzWEZBRm9ybSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEZvcm1EaWN0ICYmIG1fcEZvcm1EaWN0LT5HZXRBcnJheSgiWEZBIik7CiB9Ci1GWF9CT09MIENQREZfSW50ZXJGb3JtOjpIYXNYRkFGb3JtKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wRm9ybURpY3QgJiYgbV9wRm9ybURpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJYRkEiKSkgIT0gTlVMTDsKK3ZvaWQgQ1BERl9JbnRlckZvcm06OkZpeFBhZ2VGaWVsZHMoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSkgeworICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IHBQYWdlLT5tX3BGb3JtRGljdDsKKyAgaWYgKCFwUGFnZURpY3QpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9BcnJheSogcEFubm90cyA9IHBQYWdlRGljdC0+R2V0QXJyYXkoIkFubm90cyIpOworICBpZiAoIXBBbm5vdHMpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IGlBbm5vdENvdW50ID0gcEFubm90cy0+R2V0Q291bnQoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQW5ub3RDb3VudDsgaSsrKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3QgPSBwQW5ub3RzLT5HZXREaWN0KGkpOworICAgIGlmIChwQW5ub3QgJiYgcEFubm90LT5HZXRTdHJpbmcoIlN1YnR5cGUiKSA9PSAiV2lkZ2V0IikgeworICAgICAgTG9hZEZpZWxkKHBBbm5vdCk7CisgICAgfQorICB9CiB9Ci12b2lkIENQREZfSW50ZXJGb3JtOjpGaXhQYWdlRmllbGRzKGNvbnN0IENQREZfUGFnZSogcFBhZ2UpCi17Ci0gICAgQVNTRVJUKHBQYWdlICE9IE5VTEwpOwotICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0OwotICAgIGlmIChwUGFnZURpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBBbm5vdHMgPSBwUGFnZURpY3QtPkdldEFycmF5KEZYX0JTVFJDKCJBbm5vdHMiKSk7Ci0gICAgaWYgKHBBbm5vdHMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludCBpQW5ub3RDb3VudCA9IHBBbm5vdHMtPkdldENvdW50KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQW5ub3RDb3VudDsgaSsrKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcEFubm90ID0gcEFubm90cy0+R2V0RGljdChpKTsKLSAgICAgICAgaWYgKHBBbm5vdCAhPSBOVUxMICYmIHBBbm5vdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJTdWJ0eXBlIikpID09ICJXaWRnZXQiKSB7Ci0gICAgICAgICAgICBMb2FkRmllbGQocEFubm90KTsKLSAgICAgICAgfQotICAgIH0KLX0KLUNQREZfRm9ybUZpZWxkKiBDUERGX0ludGVyRm9ybTo6QWRkVGVybWluYWxGaWVsZChjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpCi17Ci0gICAgaWYgKCFwRmllbGREaWN0LT5LZXlFeGlzdChGWF9CU1RSQygiVCIpKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBGaWVsZERpY3Q7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgY3NXTmFtZSA9IEdldEZ1bGxOYW1lKHBEaWN0KTsKLSAgICBpZiAoY3NXTmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBOVUxMOwotICAgIHBGaWVsZCA9IG1fcEZpZWxkVHJlZS0+R2V0RmllbGQoY3NXTmFtZSk7Ci0gICAgaWYgKHBGaWVsZCA9PSBOVUxMKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSAqcFBhcmVudCA9IChDUERGX0RpY3Rpb25hcnkqKXBGaWVsZERpY3Q7Ci0gICAgICAgIGlmICghcEZpZWxkRGljdC0+S2V5RXhpc3QoRlhfQlNUUigiVCIpKSAmJgotICAgICAgICAgICAgICAgIHBGaWVsZERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiU3VidHlwZSIpKSA9PSBGWF9CU1RSQygiV2lkZ2V0IikpIHsKLSAgICAgICAgICAgIHBQYXJlbnQgPSBwRmllbGREaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJQYXJlbnQiKSk7Ci0gICAgICAgICAgICBpZiAoIXBQYXJlbnQpIHsKLSAgICAgICAgICAgICAgICBwUGFyZW50ID0gKENQREZfRGljdGlvbmFyeSopcEZpZWxkRGljdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocFBhcmVudCAmJiBwUGFyZW50ICE9IHBGaWVsZERpY3QgJiYgIXBQYXJlbnQtPktleUV4aXN0KEZYX0JTVFJDKCJGVCIpKSkgewotICAgICAgICAgICAgaWYgKHBGaWVsZERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJGVCIpKSkgewotICAgICAgICAgICAgICAgIENQREZfT2JqZWN0ICpwRlRWYWx1ZSA9IHBGaWVsZERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRlQiKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBGVFZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJlbnQtPlNldEF0KEZYX0JTVFJDKCJGVCIpLCBwRlRWYWx1ZS0+Q2xvbmUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBGaWVsZERpY3QtPktleUV4aXN0KEZYX0JTVFJDKCJGZiIpKSkgewotICAgICAgICAgICAgICAgIENQREZfT2JqZWN0ICpwRmZWYWx1ZSA9IHBGaWVsZERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiRmYiKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBGZlZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBQYXJlbnQtPlNldEF0KEZYX0JTVFJDKCJGZiIpLCBwRmZWYWx1ZS0+Q2xvbmUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBGaWVsZCA9IG5ldyBDUERGX0Zvcm1GaWVsZCh0aGlzLCBwUGFyZW50KTsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBUT2JqID0gcERpY3QtPkdldEVsZW1lbnQoIlQiKTsKLSAgICAgICAgaWYgKHBUT2JqICYmIHBUT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1JFRkVSRU5DRSkgewotICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBDbG9uZSA9IHBUT2JqLT5DbG9uZShUUlVFKTsKLSAgICAgICAgICAgIGlmIChwQ2xvbmUpIHsKLSAgICAgICAgICAgICAgICBwRGljdC0+U2V0QXQoIlQiLCBwQ2xvbmUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwRGljdC0+U2V0QXROYW1lKCJUIiwgIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1fcEZpZWxkVHJlZS0+U2V0RmllbGQoY3NXTmFtZSwgcEZpZWxkKTsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcEtpZHMgPSBwRmllbGREaWN0LT5HZXRBcnJheSgiS2lkcyIpOwotICAgIGlmIChwS2lkcyA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChwRmllbGREaWN0LT5HZXRTdHJpbmcoIlN1YnR5cGUiKSA9PSAiV2lkZ2V0IikgewotICAgICAgICAgICAgQWRkQ29udHJvbChwRmllbGQsIHBGaWVsZERpY3QpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBLaWRzLT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBLaWQgPSBwS2lkcy0+R2V0RGljdChpKTsKLSAgICAgICAgICAgIGlmIChwS2lkID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwS2lkLT5HZXRTdHJpbmcoIlN1YnR5cGUiKSAhPSAiV2lkZ2V0IikgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQWRkQ29udHJvbChwRmllbGQsIHBLaWQpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwRmllbGQ7Ci19Ci1DUERGX0Zvcm1Db250cm9sKiBDUERGX0ludGVyRm9ybTo6QWRkQ29udHJvbChjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBXaWRnZXREaWN0KQotewotICAgIHZvaWQgKnJWYWx1ZSA9IE5VTEw7Ci0gICAgaWYgKG1fQ29udHJvbE1hcC5Mb29rdXAoKENQREZfRGljdGlvbmFyeSopcFdpZGdldERpY3QsIHJWYWx1ZSkpIHsKLSAgICAgICAgcmV0dXJuIChDUERGX0Zvcm1Db250cm9sKilyVmFsdWU7Ci0gICAgfQotICAgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gbmV3IENQREZfRm9ybUNvbnRyb2woKENQREZfRm9ybUZpZWxkKilwRmllbGQsIChDUERGX0RpY3Rpb25hcnkqKXBXaWRnZXREaWN0KTsKLSAgICBtX0NvbnRyb2xNYXAuU2V0QXQoKENQREZfRGljdGlvbmFyeSopcFdpZGdldERpY3QsIHBDb250cm9sKTsKLSAgICAoKENQREZfRm9ybUZpZWxkKilwRmllbGQpLT5tX0NvbnRyb2xMaXN0LkFkZChwQ29udHJvbCk7Ci0gICAgcmV0dXJuIHBDb250cm9sOwotfQotQ1BERl9Gb3JtRmllbGQqIENQREZfSW50ZXJGb3JtOjpDaGVja1JlcXVpcmVkRmllbGRzKGNvbnN0IENGWF9QdHJBcnJheSAqZmllbGRzLCBGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlKSBjb25zdAotewotICAgIGludCBuQ291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKLSAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkdldEZpZWxkKGkpOwotICAgICAgICBpZiAocEZpZWxkID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEZYX0lOVDMyIGlUeXBlID0gcEZpZWxkLT5HZXRUeXBlKCk7Ci0gICAgICAgIGlmIChpVHlwZSA9PSBDUERGX0Zvcm1GaWVsZDo6UHVzaEJ1dHRvbiB8fCBpVHlwZSA9PSBDUERGX0Zvcm1GaWVsZDo6Q2hlY2tCb3ggfHwgaVR5cGUgPT0gQ1BERl9Gb3JtRmllbGQ6Okxpc3RCb3gpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSBwRmllbGQtPkdldEZpZWxkRmxhZ3MoKTsKLSAgICAgICAgaWYgKGR3RmxhZ3MgJiAweDA0KSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBGWF9CT09MIGJGaW5kID0gVFJVRTsKLSAgICAgICAgaWYgKGZpZWxkcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBiRmluZCA9IGZpZWxkcy0+RmluZChwRmllbGQsIDApID49IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChiSW5jbHVkZU9yRXhjbHVkZSAmJiBiRmluZCkgfHwgKCFiSW5jbHVkZU9yRXhjbHVkZSAmJiAhYkZpbmQpKSB7Ci0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkgKnBGaWVsZERpY3QgPSBwRmllbGQtPm1fcERpY3Q7Ci0gICAgICAgICAgICBpZiAoKGR3RmxhZ3MgJiAweDAyKSAhPSAwICYmIHBGaWVsZERpY3QtPkdldFN0cmluZygiViIpLklzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBwRmllbGQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CitDUERGX0Zvcm1GaWVsZCogQ1BERl9JbnRlckZvcm06OkFkZFRlcm1pbmFsRmllbGQoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0KSB7CisgIGlmICghcEZpZWxkRGljdC0+S2V5RXhpc3QoIlQiKSkgewogICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwRmllbGREaWN0OworICBDRlhfV2lkZVN0cmluZyBjc1dOYW1lID0gR2V0RnVsbE5hbWUocEZpZWxkRGljdCk7CisgIGlmIChjc1dOYW1lLklzRW1wdHkoKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBOVUxMOworICBwRmllbGQgPSBtX3BGaWVsZFRyZWUtPkdldEZpZWxkKGNzV05hbWUpOworICBpZiAoIXBGaWVsZCkgeworICAgIENQREZfRGljdGlvbmFyeSogcFBhcmVudCA9IHBGaWVsZERpY3Q7CisgICAgaWYgKCFwRmllbGREaWN0LT5LZXlFeGlzdCgiVCIpICYmCisgICAgICAgIHBGaWVsZERpY3QtPkdldFN0cmluZygiU3VidHlwZSIpID09ICJXaWRnZXQiKSB7CisgICAgICBwUGFyZW50ID0gcEZpZWxkRGljdC0+R2V0RGljdCgiUGFyZW50Iik7CisgICAgICBpZiAoIXBQYXJlbnQpIHsKKyAgICAgICAgcFBhcmVudCA9IHBGaWVsZERpY3Q7CisgICAgICB9CisgICAgfQorICAgIGlmIChwUGFyZW50ICYmIHBQYXJlbnQgIT0gcEZpZWxkRGljdCAmJiAhcFBhcmVudC0+S2V5RXhpc3QoIkZUIikpIHsKKyAgICAgIGlmIChwRmllbGREaWN0LT5LZXlFeGlzdCgiRlQiKSkgeworICAgICAgICBDUERGX09iamVjdCogcEZUVmFsdWUgPSBwRmllbGREaWN0LT5HZXRFbGVtZW50VmFsdWUoIkZUIik7CisgICAgICAgIGlmIChwRlRWYWx1ZSkgeworICAgICAgICAgIHBQYXJlbnQtPlNldEF0KCJGVCIsIHBGVFZhbHVlLT5DbG9uZSgpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHBGaWVsZERpY3QtPktleUV4aXN0KCJGZiIpKSB7CisgICAgICAgIENQREZfT2JqZWN0KiBwRmZWYWx1ZSA9IHBGaWVsZERpY3QtPkdldEVsZW1lbnRWYWx1ZSgiRmYiKTsKKyAgICAgICAgaWYgKHBGZlZhbHVlKSB7CisgICAgICAgICAgcFBhcmVudC0+U2V0QXQoIkZmIiwgcEZmVmFsdWUtPkNsb25lKCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHBGaWVsZCA9IG5ldyBDUERGX0Zvcm1GaWVsZCh0aGlzLCBwUGFyZW50KTsKKyAgICBDUERGX09iamVjdCogcFRPYmogPSBwRGljdC0+R2V0RWxlbWVudCgiVCIpOworICAgIGlmIChUb1JlZmVyZW5jZShwVE9iaikpIHsKKyAgICAgIENQREZfT2JqZWN0KiBwQ2xvbmUgPSBwVE9iai0+Q2xvbmUoVFJVRSk7CisgICAgICBpZiAocENsb25lKQorICAgICAgICBwRGljdC0+U2V0QXQoIlQiLCBwQ2xvbmUpOworICAgICAgZWxzZQorICAgICAgICBwRGljdC0+U2V0QXROYW1lKCJUIiwgIiIpOworICAgIH0KKyAgICBtX3BGaWVsZFRyZWUtPlNldEZpZWxkKGNzV05hbWUsIHBGaWVsZCk7CisgIH0KKyAgQ1BERl9BcnJheSogcEtpZHMgPSBwRmllbGREaWN0LT5HZXRBcnJheSgiS2lkcyIpOworICBpZiAoIXBLaWRzKSB7CisgICAgaWYgKHBGaWVsZERpY3QtPkdldFN0cmluZygiU3VidHlwZSIpID09ICJXaWRnZXQiKSB7CisgICAgICBBZGRDb250cm9sKHBGaWVsZCwgcEZpZWxkRGljdCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwS2lkcy0+R2V0Q291bnQoKTsgaSsrKSB7CisgICAgICBDUERGX0RpY3Rpb25hcnkqIHBLaWQgPSBwS2lkcy0+R2V0RGljdChpKTsKKyAgICAgIGlmICghcEtpZCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChwS2lkLT5HZXRTdHJpbmcoIlN1YnR5cGUiKSAhPSAiV2lkZ2V0IikgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIEFkZENvbnRyb2wocEZpZWxkLCBwS2lkKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHBGaWVsZDsKIH0KLUNGREZfRG9jdW1lbnQqIENQREZfSW50ZXJGb3JtOjpFeHBvcnRUb0ZERihGWF9XU1RSIHBkZl9wYXRoLCBGWF9CT09MIGJTaW1wbGVGaWxlU3BlYykgY29uc3QKLXsKLSAgICBDRlhfUHRyQXJyYXkgZmllbGRzOwotICAgIGludCBuQ291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpICsrKSB7Ci0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5HZXRGaWVsZChpKTsKLSAgICAgICAgZmllbGRzLkFkZChwRmllbGQpOwotICAgIH0KLSAgICByZXR1cm4gRXhwb3J0VG9GREYocGRmX3BhdGgsIGZpZWxkcywgVFJVRSwgYlNpbXBsZUZpbGVTcGVjKTsKK0NQREZfRm9ybUNvbnRyb2wqIENQREZfSW50ZXJGb3JtOjpBZGRDb250cm9sKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBXaWRnZXREaWN0KSB7CisgIGNvbnN0IGF1dG8gaXQgPSBtX0NvbnRyb2xNYXAuZmluZChwV2lkZ2V0RGljdCk7CisgIGlmIChpdCAhPSBtX0NvbnRyb2xNYXAuZW5kKCkpCisgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisKKyAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPQorICAgICAgbmV3IENQREZfRm9ybUNvbnRyb2woKENQREZfRm9ybUZpZWxkKilwRmllbGQsIHBXaWRnZXREaWN0KTsKKyAgbV9Db250cm9sTWFwW3BXaWRnZXREaWN0XSA9IHBDb250cm9sOworICAoKENQREZfRm9ybUZpZWxkKilwRmllbGQpLT5tX0NvbnRyb2xMaXN0LkFkZChwQ29udHJvbCk7CisgIHJldHVybiBwQ29udHJvbDsKIH0KLUNGWF9XaWRlU3RyaW5nIEZJTEVTUEVDX0VuY29kZUZpbGVOYW1lKEZYX1dTVFIgZmlsZXBhdGgpOwotQ0ZERl9Eb2N1bWVudCogQ1BERl9JbnRlckZvcm06OkV4cG9ydFRvRkRGKEZYX1dTVFIgcGRmX3BhdGgsIENGWF9QdHJBcnJheSYgZmllbGRzLCBGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlLCBGWF9CT09MIGJTaW1wbGVGaWxlU3BlYykgY29uc3QKLXsKLSAgICBDRkRGX0RvY3VtZW50KiBwRG9jID0gQ0ZERl9Eb2N1bWVudDo6Q3JlYXRlTmV3RG9jKCk7Ci0gICAgaWYgKHBEb2MgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKKworQ1BERl9Gb3JtRmllbGQqIENQREZfSW50ZXJGb3JtOjpDaGVja1JlcXVpcmVkRmllbGRzKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4qIGZpZWxkcywKKyAgICBib29sIGJJbmNsdWRlT3JFeGNsdWRlKSBjb25zdCB7CisgIGludCBuQ291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOworICBmb3IgKGludCBpID0gMDsgaSA8IG5Db3VudDsgKytpKSB7CisgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkdldEZpZWxkKGkpOworICAgIGlmICghcEZpZWxkKQorICAgICAgY29udGludWU7CisKKyAgICBpbnQzMl90IGlUeXBlID0gcEZpZWxkLT5HZXRUeXBlKCk7CisgICAgaWYgKGlUeXBlID09IENQREZfRm9ybUZpZWxkOjpQdXNoQnV0dG9uIHx8CisgICAgICAgIGlUeXBlID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCB8fCBpVHlwZSA9PSBDUERGX0Zvcm1GaWVsZDo6TGlzdEJveCkgeworICAgICAgY29udGludWU7CiAgICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcE1haW5EaWN0ID0gcERvYy0+R2V0Um9vdCgpLT5HZXREaWN0KCJGREYiKTsKLSAgICBpZiAoIXBkZl9wYXRoLklzRW1wdHkoKSkgewotICAgICAgICBpZiAoYlNpbXBsZUZpbGVTcGVjKSB7Ci0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0ZpbGVQYXRoID0gRklMRVNQRUNfRW5jb2RlRmlsZU5hbWUocGRmX3BhdGgpOwotICAgICAgICAgICAgcE1haW5EaWN0LT5TZXRBdFN0cmluZyhGWF9CU1RSQygiRiIpLCBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUod3NGaWxlUGF0aCkpOwotICAgICAgICAgICAgcE1haW5EaWN0LT5TZXRBdFN0cmluZyhGWF9CU1RSQygiVUYiKSwgUERGX0VuY29kZVRleHQod3NGaWxlUGF0aCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ1BERl9GaWxlU3BlYyBmaWxlc3BlYzsKLSAgICAgICAgICAgIGZpbGVzcGVjLlNldEZpbGVOYW1lKHBkZl9wYXRoKTsKLSAgICAgICAgICAgIHBNYWluRGljdC0+U2V0QXQoIkYiLCAoQ1BERl9PYmplY3QqKWZpbGVzcGVjKTsKLSAgICAgICAgfQorICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSBwRmllbGQtPkdldEZpZWxkRmxhZ3MoKTsKKyAgICAvLyBUT0RPKHRoZXN0aWcpOiBMb29rIHVwIHRoZXNlIG1hZ2ljIG51bWJlcnMgYW5kIGFkZCBjb25zdGFudHMgZm9yIHRoZW0uCisgICAgaWYgKGR3RmxhZ3MgJiAweDA0KQorICAgICAgY29udGludWU7CisKKyAgICBib29sIGJGaW5kID0gdHJ1ZTsKKyAgICBpZiAoZmllbGRzKQorICAgICAgYkZpbmQgPSBwZGZpdW06OkNvbnRhaW5zVmFsdWUoKmZpZWxkcywgcEZpZWxkKTsKKyAgICBpZiAoYkluY2x1ZGVPckV4Y2x1ZGUgPT0gYkZpbmQpIHsKKyAgICAgIENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCA9IHBGaWVsZC0+bV9wRGljdDsKKyAgICAgIGlmICgoZHdGbGFncyAmIDB4MDIpICE9IDAgJiYgcEZpZWxkRGljdC0+R2V0U3RyaW5nKCJWIikuSXNFbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBwRmllbGQ7CisgICAgICB9CiAgICAgfQotICAgIENQREZfQXJyYXkqIHBGaWVsZHMgPSBDUERGX0FycmF5OjpDcmVhdGUoKTsKLSAgICBpZiAocEZpZWxkcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBudWxscHRyOworfQorCitDRkRGX0RvY3VtZW50KiBDUERGX0ludGVyRm9ybTo6RXhwb3J0VG9GREYoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBwZGZfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaW1wbGVGaWxlU3BlYykgY29uc3QgeworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IGZpZWxkczsKKyAgaW50IG5Db3VudCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkNvdW50RmllbGRzKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyArK2kpCisgICAgZmllbGRzLnB1c2hfYmFjayhtX3BGaWVsZFRyZWUtPm1fUm9vdC5HZXRGaWVsZChpKSk7CisgIHJldHVybiBFeHBvcnRUb0ZERihwZGZfcGF0aCwgZmllbGRzLCB0cnVlLCBiU2ltcGxlRmlsZVNwZWMpOworfQorCitDRkRGX0RvY3VtZW50KiBDUERGX0ludGVyRm9ybTo6RXhwb3J0VG9GREYoCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBwZGZfcGF0aCwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+JiBmaWVsZHMsCisgICAgYm9vbCBiSW5jbHVkZU9yRXhjbHVkZSwKKyAgICBib29sIGJTaW1wbGVGaWxlU3BlYykgY29uc3QgeworICBDRkRGX0RvY3VtZW50KiBwRG9jID0gQ0ZERl9Eb2N1bWVudDo6Q3JlYXRlTmV3RG9jKCk7CisgIGlmICghcERvYykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfRGljdGlvbmFyeSogcE1haW5EaWN0ID0gcERvYy0+R2V0Um9vdCgpLT5HZXREaWN0KCJGREYiKTsKKyAgaWYgKCFwZGZfcGF0aC5Jc0VtcHR5KCkpIHsKKyAgICBpZiAoYlNpbXBsZUZpbGVTcGVjKSB7CisgICAgICBDRlhfV2lkZVN0cmluZyB3c0ZpbGVQYXRoID0gRklMRVNQRUNfRW5jb2RlRmlsZU5hbWUocGRmX3BhdGgpOworICAgICAgcE1haW5EaWN0LT5TZXRBdFN0cmluZygiRiIsIENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh3c0ZpbGVQYXRoKSk7CisgICAgICBwTWFpbkRpY3QtPlNldEF0U3RyaW5nKCJVRiIsIFBERl9FbmNvZGVUZXh0KHdzRmlsZVBhdGgpKTsKKyAgICB9IGVsc2UgeworICAgICAgQ1BERl9GaWxlU3BlYyBmaWxlc3BlYzsKKyAgICAgIGZpbGVzcGVjLlNldEZpbGVOYW1lKHBkZl9wYXRoKTsKKyAgICAgIHBNYWluRGljdC0+U2V0QXQoIkYiLCBzdGF0aWNfY2FzdDxDUERGX09iamVjdCo+KGZpbGVzcGVjKSk7CiAgICAgfQotICAgIHBNYWluRGljdC0+U2V0QXQoIkZpZWxkcyIsIHBGaWVsZHMpOwotICAgIGludCBuQ291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpICsrKSB7Ci0gICAgICAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5HZXRGaWVsZChpKTsKLSAgICAgICAgaWYgKHBGaWVsZCA9PSBOVUxMIHx8IHBGaWVsZC0+R2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpQdXNoQnV0dG9uKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBGWF9EV09SRCBkd0ZsYWdzID0gcEZpZWxkLT5HZXRGaWVsZEZsYWdzKCk7Ci0gICAgICAgIGlmIChkd0ZsYWdzICYgMHgwNCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfQk9PTCBiRmluZCA9IGZpZWxkcy5GaW5kKHBGaWVsZCwgMCkgPj0gMDsKLSAgICAgICAgaWYgKChiSW5jbHVkZU9yRXhjbHVkZSAmJiBiRmluZCkgfHwgKCFiSW5jbHVkZU9yRXhjbHVkZSAmJiAhYkZpbmQpKSB7Ci0gICAgICAgICAgICBpZiAoKGR3RmxhZ3MgJiAweDAyKSAhPSAwICYmIHBGaWVsZC0+bV9wRGljdC0+R2V0U3RyaW5nKCJWIikuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBmdWxsbmFtZSA9IEdldEZ1bGxOYW1lKHBGaWVsZC0+R2V0RmllbGREaWN0KCkpOwotICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0ID0gQ1BERl9EaWN0aW9uYXJ5OjpDcmVhdGUoKTsKLSAgICAgICAgICAgIGlmIChwRmllbGREaWN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENQREZfU3RyaW5nKiBwU3RyaW5nID0gQ1BERl9TdHJpbmc6OkNyZWF0ZShmdWxsbmFtZSk7Ci0gICAgICAgICAgICBpZiAocFN0cmluZyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcEZpZWxkRGljdC0+UmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEZpZWxkRGljdC0+U2V0QXQoIlQiLCBwU3RyaW5nKTsKLSAgICAgICAgICAgIGlmIChwRmllbGQtPkdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6Q2hlY2tCb3ggfHwgcEZpZWxkLT5HZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uKSB7Ci0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NFeHBvcnQgPSBwRmllbGQtPkdldENoZWNrVmFsdWUoRkFMU0UpOwotICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNzQkV4cG9ydCA9IFBERl9FbmNvZGVUZXh0KGNzRXhwb3J0KTsKLSAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcE9wdCA9IEZQREZfR2V0RmllbGRBdHRyKHBGaWVsZC0+bV9wRGljdCwgIk9wdCIpOwotICAgICAgICAgICAgICAgIGlmIChwT3B0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcEZpZWxkRGljdC0+U2V0QXROYW1lKCJWIiwgY3NCRXhwb3J0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwRmllbGREaWN0LT5TZXRBdFN0cmluZygiViIsIGNzQkV4cG9ydCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcFYgPSBGUERGX0dldEZpZWxkQXR0cihwRmllbGQtPm1fcERpY3QsICJWIik7Ci0gICAgICAgICAgICAgICAgaWYgKHBWICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcEZpZWxkRGljdC0+U2V0QXQoIlYiLCBwVi0+Q2xvbmUoVFJVRSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBGaWVsZHMtPkFkZChwRmllbGREaWN0KTsKLSAgICAgICAgfQorICB9CisgIENQREZfQXJyYXkqIHBGaWVsZHMgPSBuZXcgQ1BERl9BcnJheTsKKyAgcE1haW5EaWN0LT5TZXRBdCgiRmllbGRzIiwgcEZpZWxkcyk7CisgIGludCBuQ291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOworICBmb3IgKGludCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7CisgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcEZpZWxkVHJlZS0+bV9Sb290LkdldEZpZWxkKGkpOworICAgIGlmICghcEZpZWxkIHx8IHBGaWVsZC0+R2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpQdXNoQnV0dG9uKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgcmV0dXJuIHBEb2M7CisgICAgRlhfRFdPUkQgZHdGbGFncyA9IHBGaWVsZC0+R2V0RmllbGRGbGFncygpOworICAgIGlmIChkd0ZsYWdzICYgMHgwNCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKGJJbmNsdWRlT3JFeGNsdWRlID09IHBkZml1bTo6Q29udGFpbnNWYWx1ZShmaWVsZHMsIHBGaWVsZCkpIHsKKyAgICAgIGlmICgoZHdGbGFncyAmIDB4MDIpICE9IDAgJiYgcEZpZWxkLT5tX3BEaWN0LT5HZXRTdHJpbmcoIlYiKS5Jc0VtcHR5KCkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBDRlhfV2lkZVN0cmluZyBmdWxsbmFtZSA9IEdldEZ1bGxOYW1lKHBGaWVsZC0+R2V0RmllbGREaWN0KCkpOworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgICAgIHBGaWVsZERpY3QtPlNldEF0KCJUIiwgbmV3IENQREZfU3RyaW5nKGZ1bGxuYW1lKSk7CisgICAgICBpZiAocEZpZWxkLT5HZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94IHx8CisgICAgICAgICAgcEZpZWxkLT5HZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uKSB7CisgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzRXhwb3J0ID0gcEZpZWxkLT5HZXRDaGVja1ZhbHVlKEZBTFNFKTsKKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NCRXhwb3J0ID0gUERGX0VuY29kZVRleHQoY3NFeHBvcnQpOworICAgICAgICBDUERGX09iamVjdCogcE9wdCA9IEZQREZfR2V0RmllbGRBdHRyKHBGaWVsZC0+bV9wRGljdCwgIk9wdCIpOworICAgICAgICBpZiAocE9wdCkKKyAgICAgICAgICBwRmllbGREaWN0LT5TZXRBdFN0cmluZygiViIsIGNzQkV4cG9ydCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwRmllbGREaWN0LT5TZXRBdE5hbWUoIlYiLCBjc0JFeHBvcnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ1BERl9PYmplY3QqIHBWID0gRlBERl9HZXRGaWVsZEF0dHIocEZpZWxkLT5tX3BEaWN0LCAiViIpOworICAgICAgICBpZiAocFYpCisgICAgICAgICAgcEZpZWxkRGljdC0+U2V0QXQoIlYiLCBwVi0+Q2xvbmUoVFJVRSkpOworICAgICAgfQorICAgICAgcEZpZWxkcy0+QWRkKHBGaWVsZERpY3QpOworICAgIH0KKyAgfQorICByZXR1cm4gcERvYzsKIH0KIGNvbnN0IHN0cnVjdCBfU3VwcG9ydEZpZWxkRW5jb2RpbmcgewotICAgIEZYX0xQQ1NUUiBtX25hbWU7Ci0gICAgRlhfSU5UMzIgbV9jb2RlUGFnZTsKKyAgY29uc3QgRlhfQ0hBUiogbV9uYW1lOworICBpbnQzMl90IG1fY29kZVBhZ2U7CiB9IGdfZmllbGRFbmNvZGluZ1tdID0gewotICAgIHsgIkJpZ0ZpdmUiLCA5NTAgfSwKLSAgICB7ICJHQksiLCA5MzYgfSwKLSAgICB7ICJTaGlmdC1KSVMiLCA5MzIgfSwKLSAgICB7ICJVSEMiLCA5NDkgfSwKKyAgICB7IkJpZ0ZpdmUiLCA5NTB9LAorICAgIHsiR0JLIiwgOTM2fSwKKyAgICB7IlNoaWZ0LUpJUyIsIDkzMn0sCisgICAgeyJVSEMiLCA5NDl9LAogfTsKLXN0YXRpYyB2b2lkIEZQREZET0NfRkRGX0dldEZpZWxkVmFsdWUoQ1BERl9EaWN0aW9uYXJ5ICpwRmllbGREaWN0LCBDRlhfV2lkZVN0cmluZyAmY3NWYWx1ZSwgQ0ZYX0J5dGVTdHJpbmcgJmJzRW5jb2RpbmcpCi17Ci0gICAgQVNTRVJUKHBGaWVsZERpY3QgIT0gTlVMTCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NCVmFsdWUgPSBwRmllbGREaWN0LT5HZXRTdHJpbmcoIlYiKTsKLSAgICBGWF9JTlQzMiBpQ291bnQgPSBzaXplb2YoZ19maWVsZEVuY29kaW5nKSAvIHNpemVvZihnX2ZpZWxkRW5jb2RpbmdbMF0pOwotICAgIEZYX0lOVDMyIGkgPSAwOwotICAgIGZvciAoOyBpIDwgaUNvdW50OyArK2kpCi0gICAgICAgIGlmIChic0VuY29kaW5nID09IGdfZmllbGRFbmNvZGluZ1tpXS5tX25hbWUpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgaWYgKGkgPCBpQ291bnQpIHsKLSAgICAgICAgQ0ZYX0NoYXJNYXAgKnBDaGFyTWFwID0gQ0ZYX0NoYXJNYXA6OkdldERlZmF1bHRNYXBwZXIoZ19maWVsZEVuY29kaW5nW2ldLm1fY29kZVBhZ2UpOwotICAgICAgICBGWFNZU19hc3NlcnQocENoYXJNYXAgIT0gTlVMTCk7Ci0gICAgICAgIGNzVmFsdWUuQ29udmVydEZyb20oY3NCVmFsdWUsIHBDaGFyTWFwKTsKLSAgICAgICAgcmV0dXJuOworc3RhdGljIHZvaWQgRlBERkRPQ19GREZfR2V0RmllbGRWYWx1ZShDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBjc1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgYnNFbmNvZGluZykgeworICBDRlhfQnl0ZVN0cmluZyBjc0JWYWx1ZSA9IHBGaWVsZERpY3QtPkdldFN0cmluZygiViIpOworICBpbnQzMl90IGlDb3VudCA9IHNpemVvZihnX2ZpZWxkRW5jb2RpbmcpIC8gc2l6ZW9mKGdfZmllbGRFbmNvZGluZ1swXSk7CisgIGludDMyX3QgaSA9IDA7CisgIGZvciAoOyBpIDwgaUNvdW50OyArK2kpCisgICAgaWYgKGJzRW5jb2RpbmcgPT0gZ19maWVsZEVuY29kaW5nW2ldLm1fbmFtZSkgeworICAgICAgYnJlYWs7CiAgICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGNzVGVtcCA9IGNzQlZhbHVlLkxlZnQoMik7Ci0gICAgaWYgKGNzVGVtcCA9PSAiXHhGRlx4RkUiIHx8IGNzVGVtcCA9PSAiXHhGRVx4RkYiKSB7Ci0gICAgICAgIGNzVmFsdWUgPSBQREZfRGVjb2RlVGV4dChjc0JWYWx1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY3NWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoY3NCVmFsdWUpOwotICAgIH0KKyAgaWYgKGkgPCBpQ291bnQpIHsKKyAgICBDRlhfQ2hhck1hcCogcENoYXJNYXAgPQorICAgICAgICBDRlhfQ2hhck1hcDo6R2V0RGVmYXVsdE1hcHBlcihnX2ZpZWxkRW5jb2RpbmdbaV0ubV9jb2RlUGFnZSk7CisgICAgRlhTWVNfYXNzZXJ0KHBDaGFyTWFwKTsKKyAgICBjc1ZhbHVlLkNvbnZlcnRGcm9tKGNzQlZhbHVlLCBwQ2hhck1hcCk7CisgICAgcmV0dXJuOworICB9CisgIENGWF9CeXRlU3RyaW5nIGNzVGVtcCA9IGNzQlZhbHVlLkxlZnQoMik7CisgIGlmIChjc1RlbXAgPT0gIlx4RkZceEZFIiB8fCBjc1RlbXAgPT0gIlx4RkVceEZGIikgeworICAgIGNzVmFsdWUgPSBQREZfRGVjb2RlVGV4dChjc0JWYWx1ZSk7CisgIH0gZWxzZSB7CisgICAgY3NWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoY3NCVmFsdWUpOworICB9CiB9Ci12b2lkIENQREZfSW50ZXJGb3JtOjpGREZfSW1wb3J0RmllbGQoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgcGFyZW50X25hbWUsIEZYX0JPT0wgYk5vdGlmeSwgaW50IG5MZXZlbCkKLXsKLSAgICBDRlhfV2lkZVN0cmluZyBuYW1lOwotICAgIGlmICghcGFyZW50X25hbWUuSXNFbXB0eSgpKSB7Ci0gICAgICAgIG5hbWUgPSBwYXJlbnRfbmFtZSArIEwiLiI7Cit2b2lkIENQREZfSW50ZXJGb3JtOjpGREZfSW1wb3J0RmllbGQoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBwYXJlbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5MZXZlbCkgeworICBDRlhfV2lkZVN0cmluZyBuYW1lOworICBpZiAoIXBhcmVudF9uYW1lLklzRW1wdHkoKSkgeworICAgIG5hbWUgPSBwYXJlbnRfbmFtZSArIEwiLiI7CisgIH0KKyAgbmFtZSArPSBwRmllbGREaWN0LT5HZXRVbmljb2RlVGV4dCgiVCIpOworICBDUERGX0FycmF5KiBwS2lkcyA9IHBGaWVsZERpY3QtPkdldEFycmF5KCJLaWRzIik7CisgIGlmIChwS2lkcykgeworICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwS2lkcy0+R2V0Q291bnQoKTsgaSsrKSB7CisgICAgICBDUERGX0RpY3Rpb25hcnkqIHBLaWQgPSBwS2lkcy0+R2V0RGljdChpKTsKKyAgICAgIGlmICghcEtpZCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChuTGV2ZWwgPD0gbk1heFJlY3Vyc2lvbikgeworICAgICAgICBGREZfSW1wb3J0RmllbGQocEtpZCwgbmFtZSwgYk5vdGlmeSwgbkxldmVsICsgMSk7CisgICAgICB9CiAgICAgfQotICAgIG5hbWUgKz0gcEZpZWxkRGljdC0+R2V0VW5pY29kZVRleHQoIlQiKTsKLSAgICBDUERGX0FycmF5KiBwS2lkcyA9IHBGaWVsZERpY3QtPkdldEFycmF5KCJLaWRzIik7Ci0gICAgaWYgKHBLaWRzKSB7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwS2lkcy0+R2V0Q291bnQoKTsgaSArKykgewotICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwS2lkID0gcEtpZHMtPkdldERpY3QoaSk7Ci0gICAgICAgICAgICBpZiAocEtpZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobkxldmVsIDw9IG5NYXhSZWN1cnNpb24pIHsKLSAgICAgICAgICAgICAgICBGREZfSW1wb3J0RmllbGQocEtpZCwgbmFtZSwgYk5vdGlmeSwgbkxldmVsICsgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIXBGaWVsZERpY3QtPktleUV4aXN0KCJWIikpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcEZpZWxkVHJlZS0+R2V0RmllbGQobmFtZSk7CisgIGlmICghcEZpZWxkKSB7CisgICAgcmV0dXJuOworICB9CisgIENGWF9XaWRlU3RyaW5nIGNzV1ZhbHVlOworICBGUERGRE9DX0ZERl9HZXRGaWVsZFZhbHVlKHBGaWVsZERpY3QsIGNzV1ZhbHVlLCBtX2JzRW5jb2RpbmcpOworICBpbnQgaVR5cGUgPSBwRmllbGQtPkdldEZpZWxkVHlwZSgpOworICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtTm90aWZ5KSB7CisgICAgaW50IGlSZXQgPSAwOworICAgIGlmIChpVHlwZSA9PSBGSUVMRFRZUEVfTElTVEJPWCkgeworICAgICAgaVJldCA9IG1fcEZvcm1Ob3RpZnktPkJlZm9yZVNlbGVjdGlvbkNoYW5nZShwRmllbGQsIGNzV1ZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGlUeXBlID09IEZJRUxEVFlQRV9DT01CT0JPWCB8fCBpVHlwZSA9PSBGSUVMRFRZUEVfVEVYVEZJRUxEKSB7CisgICAgICBpUmV0ID0gbV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UocEZpZWxkLCBjc1dWYWx1ZSk7CiAgICAgfQotICAgIGlmICghcEZpZWxkRGljdC0+S2V5RXhpc3QoIlYiKSkgewotICAgICAgICByZXR1cm47CisgICAgaWYgKGlSZXQgPCAwKSB7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBtX3BGaWVsZFRyZWUtPkdldEZpZWxkKG5hbWUpOwotICAgIGlmIChwRmllbGQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENGWF9XaWRlU3RyaW5nIGNzV1ZhbHVlOwotICAgIEZQREZET0NfRkRGX0dldEZpZWxkVmFsdWUocEZpZWxkRGljdCwgY3NXVmFsdWUsIG1fYnNFbmNvZGluZyk7Ci0gICAgaW50IGlUeXBlID0gcEZpZWxkLT5HZXRGaWVsZFR5cGUoKTsKLSAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKLSAgICAgICAgaW50IGlSZXQgPSAwOwotICAgICAgICBpZiAoaVR5cGUgPT0gRklFTERUWVBFX0xJU1RCT1gpIHsKLSAgICAgICAgICAgIGlSZXQgPSBtX3BGb3JtTm90aWZ5LT5CZWZvcmVTZWxlY3Rpb25DaGFuZ2UocEZpZWxkLCBjc1dWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaVR5cGUgPT0gRklFTERUWVBFX0NPTUJPQk9YIHx8IGlUeXBlID09IEZJRUxEVFlQRV9URVhURklFTEQpIHsKLSAgICAgICAgICAgIGlSZXQgPSBtX3BGb3JtTm90aWZ5LT5CZWZvcmVWYWx1ZUNoYW5nZShwRmllbGQsIGNzV1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaVJldCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLSAgICBDRlhfQnl0ZUFycmF5IHN0YXR1c0FycmF5OworICB9CisgIENGWF9CeXRlQXJyYXkgc3RhdHVzQXJyYXk7CisgIGlmIChpVHlwZSA9PSBGSUVMRFRZUEVfQ0hFQ0tCT1ggfHwgaVR5cGUgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKSB7CisgICAgU2F2ZUNoZWNrZWRGaWVsZFN0YXR1cyhwRmllbGQsIHN0YXR1c0FycmF5KTsKKyAgfQorICBwRmllbGQtPlNldFZhbHVlKGNzV1ZhbHVlKTsKKyAgQ1BERl9Gb3JtRmllbGQ6OlR5cGUgZVR5cGUgPSBwRmllbGQtPkdldFR5cGUoKTsKKyAgaWYgKChlVHlwZSA9PSBDUERGX0Zvcm1GaWVsZDo6TGlzdEJveCB8fCBlVHlwZSA9PSBDUERGX0Zvcm1GaWVsZDo6Q29tYm9Cb3gpICYmCisgICAgICBwRmllbGREaWN0LT5LZXlFeGlzdCgiT3B0IikpIHsKKyAgICBwRmllbGQtPm1fcERpY3QtPlNldEF0KCJPcHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZpZWxkRGljdC0+R2V0RWxlbWVudFZhbHVlKCJPcHQiKS0+Q2xvbmUoVFJVRSkpOworICB9CisgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm1Ob3RpZnkpIHsKICAgICBpZiAoaVR5cGUgPT0gRklFTERUWVBFX0NIRUNLQk9YIHx8IGlUeXBlID09IEZJRUxEVFlQRV9SQURJT0JVVFRPTikgewotICAgICAgICBTYXZlQ2hlY2tlZEZpZWxkU3RhdHVzKHBGaWVsZCwgc3RhdHVzQXJyYXkpOworICAgICAgbV9wRm9ybU5vdGlmeS0+QWZ0ZXJDaGVja2VkU3RhdHVzQ2hhbmdlKHBGaWVsZCwgc3RhdHVzQXJyYXkpOworICAgIH0gZWxzZSBpZiAoaVR5cGUgPT0gRklFTERUWVBFX0xJU1RCT1gpIHsKKyAgICAgIG1fcEZvcm1Ob3RpZnktPkFmdGVyU2VsZWN0aW9uQ2hhbmdlKHBGaWVsZCk7CisgICAgfSBlbHNlIGlmIChpVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1ggfHwgaVR5cGUgPT0gRklFTERUWVBFX1RFWFRGSUVMRCkgeworICAgICAgbV9wRm9ybU5vdGlmeS0+QWZ0ZXJWYWx1ZUNoYW5nZShwRmllbGQpOwogICAgIH0KLSAgICBwRmllbGQtPlNldFZhbHVlKGNzV1ZhbHVlKTsKLSAgICBDUERGX0Zvcm1GaWVsZDo6VHlwZSBlVHlwZSA9IHBGaWVsZC0+R2V0VHlwZSgpOwotICAgIGlmICgoZVR5cGUgPT0gQ1BERl9Gb3JtRmllbGQ6Okxpc3RCb3ggfHwgZVR5cGUgPT0gQ1BERl9Gb3JtRmllbGQ6OkNvbWJvQm94KSAmJiBwRmllbGREaWN0LT5LZXlFeGlzdCgiT3B0IikpIHsKLSAgICAgICAgcEZpZWxkLT5tX3BEaWN0LT5TZXRBdCgiT3B0IiwgcEZpZWxkRGljdC0+R2V0RWxlbWVudFZhbHVlKCJPcHQiKS0+Q2xvbmUoVFJVRSkpOwotICAgIH0KLSAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKGlUeXBlID09IEZJRUxEVFlQRV9DSEVDS0JPWCB8fCBpVHlwZSA9PSBGSUVMRFRZUEVfUkFESU9CVVRUT04pIHsKLSAgICAgICAgICAgIG1fcEZvcm1Ob3RpZnktPkFmdGVyQ2hlY2tlZFN0YXR1c0NoYW5nZShwRmllbGQsIHN0YXR1c0FycmF5KTsKLSAgICAgICAgfSBlbHNlIGlmIChpVHlwZSA9PSBGSUVMRFRZUEVfTElTVEJPWCkgewotICAgICAgICAgICAgbV9wRm9ybU5vdGlmeS0+QWZ0ZXJTZWxlY3Rpb25DaGFuZ2UocEZpZWxkKTsKLSAgICAgICAgfSBlbHNlIGlmIChpVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1ggfHwgaVR5cGUgPT0gRklFTERUWVBFX1RFWFRGSUVMRCkgewotICAgICAgICAgICAgbV9wRm9ybU5vdGlmeS0+QWZ0ZXJWYWx1ZUNoYW5nZShwRmllbGQpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChDUERGX0ludGVyRm9ybTo6bV9iVXBkYXRlQVApIHsKLSAgICAgICAgcEZpZWxkLT5VcGRhdGVBUChOVUxMKTsKLSAgICB9CisgIH0KKyAgaWYgKENQREZfSW50ZXJGb3JtOjptX2JVcGRhdGVBUCkgeworICAgIHBGaWVsZC0+VXBkYXRlQVAoTlVMTCk7CisgIH0KIH0KLUZYX0JPT0wgQ1BERl9JbnRlckZvcm06OkltcG9ydEZyb21GREYoY29uc3QgQ0ZERl9Eb2N1bWVudCogcEZERiwgRlhfQk9PTCBiTm90aWZ5KQotewotICAgIGlmIChwRkRGID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDUERGX0ludGVyRm9ybTo6SW1wb3J0RnJvbUZERihjb25zdCBDRkRGX0RvY3VtZW50KiBwRkRGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkpIHsKKyAgaWYgKCFwRkRGKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfRGljdGlvbmFyeSogcE1haW5EaWN0ID0gcEZERi0+R2V0Um9vdCgpLT5HZXREaWN0KCJGREYiKTsKKyAgaWYgKCFwTWFpbkRpY3QpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1BERl9BcnJheSogcEZpZWxkcyA9IHBNYWluRGljdC0+R2V0QXJyYXkoIkZpZWxkcyIpOworICBpZiAoIXBGaWVsZHMpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9ic0VuY29kaW5nID0gcE1haW5EaWN0LT5HZXRTdHJpbmcoIkVuY29kaW5nIik7CisgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm1Ob3RpZnkpIHsKKyAgICBpbnQgaVJldCA9IG1fcEZvcm1Ob3RpZnktPkJlZm9yZUZvcm1JbXBvcnREYXRhKHRoaXMpOworICAgIGlmIChpUmV0IDwgMCkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBNYWluRGljdCA9IHBGREYtPkdldFJvb3QoKS0+R2V0RGljdCgiRkRGIik7Ci0gICAgaWYgKHBNYWluRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEZpZWxkcy0+R2V0Q291bnQoKTsgaSsrKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGQgPSBwRmllbGRzLT5HZXREaWN0KGkpOworICAgIGlmICghcEZpZWxkKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgQ1BERl9BcnJheSogcEZpZWxkcyA9IHBNYWluRGljdC0+R2V0QXJyYXkoIkZpZWxkcyIpOwotICAgIGlmIChwRmllbGRzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX2JzRW5jb2RpbmcgPSBwTWFpbkRpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiRW5jb2RpbmciKSk7Ci0gICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7Ci0gICAgICAgIGludCBpUmV0ID0gbV9wRm9ybU5vdGlmeS0+QmVmb3JlRm9ybUltcG9ydERhdGEodGhpcyk7Ci0gICAgICAgIGlmIChpUmV0IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwRmllbGRzLT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcEZpZWxkID0gcEZpZWxkcy0+R2V0RGljdChpKTsKLSAgICAgICAgaWYgKHBGaWVsZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBGREZfSW1wb3J0RmllbGQocEZpZWxkLCBMIiIsIGJOb3RpZnkpOwotICAgIH0KLSAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKLSAgICAgICAgbV9wRm9ybU5vdGlmeS0+QWZ0ZXJGb3JtSW1wb3J0RGF0YSh0aGlzKTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgRkRGX0ltcG9ydEZpZWxkKHBGaWVsZCwgTCIiLCBiTm90aWZ5KTsKKyAgfQorICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtTm90aWZ5KSB7CisgICAgbV9wRm9ybU5vdGlmeS0+QWZ0ZXJGb3JtSW1wb3J0RGF0YSh0aGlzKTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLXZvaWQgQ1BERl9JbnRlckZvcm06OlNldEZvcm1Ob3RpZnkoY29uc3QgQ1BERl9Gb3JtTm90aWZ5KiBwTm90aWZ5KQotewotICAgIG1fcEZvcm1Ob3RpZnkgPSAoQ1BERl9Gb3JtTm90aWZ5KilwTm90aWZ5OwotfQotaW50IENQREZfSW50ZXJGb3JtOjpHZXRQYWdlV2l0aFdpZGdldChpbnQgaUN1clBhZ2UsIEZYX0JPT0wgYk5leHQpCi17Ci0gICAgaWYgKGlDdXJQYWdlIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGludCBpUGFnZUNvdW50ID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpOwotICAgIGlmIChpQ3VyUGFnZSA+PSBpUGFnZUNvdW50KSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaW50IGlOZXdQYWdlID0gaUN1clBhZ2U7Ci0gICAgZG8gewotICAgICAgICBpTmV3UGFnZSArPSBiTmV4dCA/IDEgOiAtMTsKLSAgICAgICAgaWYgKGlOZXdQYWdlID49IGlQYWdlQ291bnQpIHsKLSAgICAgICAgICAgIGlOZXdQYWdlID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaU5ld1BhZ2UgPCAwKSB7Ci0gICAgICAgICAgICBpTmV3UGFnZSA9IGlQYWdlQ291bnQgLSAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpTmV3UGFnZSA9PSBpQ3VyUGFnZSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBtX3BEb2N1bWVudC0+R2V0UGFnZShpTmV3UGFnZSk7Ci0gICAgICAgIGlmIChwUGFnZURpY3QgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9BcnJheSogcEFubm90cyA9IHBQYWdlRGljdC0+R2V0QXJyYXkoIkFubm90cyIpOwotICAgICAgICBpZiAocEFubm90cyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBGWF9EV09SRCBkd0NvdW50ID0gcEFubm90cy0+R2V0Q291bnQoKTsKLSAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGR3Q291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIENQREZfT2JqZWN0KiBwQW5ub3REaWN0ID0gcEFubm90cy0+R2V0RWxlbWVudFZhbHVlKGkpOwotICAgICAgICAgICAgaWYgKHBBbm5vdERpY3QgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBOVUxMOwotICAgICAgICAgICAgaWYgKG1fQ29udHJvbE1hcC5Mb29rdXAocEFubm90RGljdCwgKHZvaWQqJilwQ29udHJvbCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaU5ld1BhZ2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChUUlVFKTsKLSAgICByZXR1cm4gLTE7Cit2b2lkIENQREZfSW50ZXJGb3JtOjpTZXRGb3JtTm90aWZ5KGNvbnN0IENQREZfRm9ybU5vdGlmeSogcE5vdGlmeSkgeworICBtX3BGb3JtTm90aWZ5ID0gKENQREZfRm9ybU5vdGlmeSopcE5vdGlmeTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Zvcm1jb250cm9sLmNwcCBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Zvcm1jb250cm9sLmNwcAppbmRleCAxYWI2MzIzLi5iZjM3ZDg1IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19mb3JtY29udHJvbC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfZm9ybWNvbnRyb2wuY3BwCkBAIC0xLDQ2MCArMSw0MjUgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oIgotQ1BERl9Gb3JtQ29udHJvbDo6Q1BERl9Gb3JtQ29udHJvbChDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBDUERGX0RpY3Rpb25hcnkqIHBXaWRnZXREaWN0KQotewotICAgIG1fcEZpZWxkID0gcEZpZWxkOwotICAgIG1fcFdpZGdldERpY3QgPSBwV2lkZ2V0RGljdDsKLSAgICBtX3BGb3JtID0gbV9wRmllbGQtPm1fcEZvcm07CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9kb2MuaCIKKworQ1BERl9Gb3JtQ29udHJvbDo6Q1BERl9Gb3JtQ29udHJvbChDUERGX0Zvcm1GaWVsZCogcEZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBXaWRnZXREaWN0KSB7CisgIG1fcEZpZWxkID0gcEZpZWxkOworICBtX3BXaWRnZXREaWN0ID0gcFdpZGdldERpY3Q7CisgIG1fcEZvcm0gPSBtX3BGaWVsZC0+bV9wRm9ybTsKIH0KLUNGWF9GbG9hdFJlY3QgQ1BERl9Gb3JtQ29udHJvbDo6R2V0UmVjdCgpCi17Ci0gICAgcmV0dXJuIG1fcFdpZGdldERpY3QtPkdldFJlY3QoIlJlY3QiKTsKK0NGWF9GbG9hdFJlY3QgQ1BERl9Gb3JtQ29udHJvbDo6R2V0UmVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcFdpZGdldERpY3QtPkdldFJlY3QoIlJlY3QiKTsKIH0KLUNGWF9CeXRlU3RyaW5nIENQREZfRm9ybUNvbnRyb2w6OkdldE9uU3RhdGVOYW1lKCkKLXsKLSAgICBBU1NFUlQoR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCB8fCBHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc09uOwotICAgIENQREZfRGljdGlvbmFyeSogcEFQID0gbV9wV2lkZ2V0RGljdC0+R2V0RGljdCgiQVAiKTsKLSAgICBpZiAocEFQID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGNzT247Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcE4gPSBwQVAtPkdldERpY3QoIk4iKTsKLSAgICBpZiAocE4gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gY3NPbjsKLSAgICB9Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gcE4tPkdldFN0YXJ0UG9zKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBwTi0+R2V0TmV4dEVsZW1lbnQocG9zLCBjc09uKTsKLSAgICAgICAgaWYgKGNzT24gIT0gIk9mZiIpIHsKLSAgICAgICAgICAgIHJldHVybiBjc09uOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwotfQotdm9pZCBDUERGX0Zvcm1Db250cm9sOjpTZXRPblN0YXRlTmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NPbikKLXsKLSAgICBBU1NFUlQoR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCB8fCBHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc1ZhbHVlID0gY3NPbjsKLSAgICBpZiAoY3NWYWx1ZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgY3NWYWx1ZSA9ICJZZXMiOwotICAgIH0KLSAgICBpZiAoY3NWYWx1ZSA9PSAiT2ZmIikgewotICAgICAgICBjc1ZhbHVlID0gIlllcyI7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGNzQVMgPSBtX3BXaWRnZXREaWN0LT5HZXRTdHJpbmcoIkFTIiwgIk9mZiIpOwotICAgIGlmIChjc0FTICE9ICJPZmYiKSB7Ci0gICAgICAgIG1fcFdpZGdldERpY3QtPlNldEF0TmFtZSgiQVMiLCBjc1ZhbHVlKTsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwQVAgPSBtX3BXaWRnZXREaWN0LT5HZXREaWN0KCJBUCIpOwotICAgIGlmIChwQVAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYX1BPU0lUSU9OIHBvczEgPSBwQVAtPkdldFN0YXJ0UG9zKCk7Ci0gICAgd2hpbGUgKHBvczEpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NLZXkxOwotICAgICAgICBDUERGX09iamVjdCogcE9iajEgPSBwQVAtPkdldE5leHRFbGVtZW50KHBvczEsIGNzS2V5MSk7Ci0gICAgICAgIGlmIChwT2JqMSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDUERGX09iamVjdCogcE9iakRpcmVjdDEgPSBwT2JqMS0+R2V0RGlyZWN0KCk7Ci0gICAgICAgIGlmIChwT2JqRGlyZWN0MS0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBTdWJEaWN0ID0gKENQREZfRGljdGlvbmFyeSopcE9iakRpcmVjdDE7Ci0gICAgICAgIEZYX1BPU0lUSU9OIHBvczIgPSBwU3ViRGljdC0+R2V0U3RhcnRQb3MoKTsKLSAgICAgICAgd2hpbGUgKHBvczIpIHsKLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNzS2V5MjsKLSAgICAgICAgICAgIENQREZfT2JqZWN0KiBwT2JqMiA9IHBTdWJEaWN0LT5HZXROZXh0RWxlbWVudChwb3MyLCBjc0tleTIpOwotICAgICAgICAgICAgaWYgKHBPYmoyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjc0tleTIgIT0gIk9mZiIpIHsKLSAgICAgICAgICAgICAgICBwU3ViRGljdC0+UmVwbGFjZUtleShjc0tleTIsIGNzVmFsdWUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9Gb3JtQ29udHJvbDo6R2V0Q2hlY2tlZEFQU3RhdGUoKQotewotICAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94IHx8IEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6UmFkaW9CdXR0b24pOwotICAgIENGWF9CeXRlU3RyaW5nIGNzT24gPSBHZXRPblN0YXRlTmFtZSgpOwotICAgIGlmIChHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uIHx8IEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6Q2hlY2tCb3gpIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBPcHQgPSBGUERGX0dldEZpZWxkQXR0cihtX3BGaWVsZC0+bV9wRGljdCwgIk9wdCIpOwotICAgICAgICBpZiAocE9wdCAhPSBOVUxMICYmIHBPcHQtPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgICAgIGludCBpSW5kZXggPSBtX3BGaWVsZC0+R2V0Q29udHJvbEluZGV4KHRoaXMpOwotICAgICAgICAgICAgY3NPbi5Gb3JtYXQoIiVkIiwgaUluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoY3NPbi5Jc0VtcHR5KCkpIHsKLSAgICAgICAgY3NPbiA9ICJZZXMiOwotICAgIH0KK0NGWF9CeXRlU3RyaW5nIENQREZfRm9ybUNvbnRyb2w6OkdldE9uU3RhdGVOYW1lKCkgeworICBBU1NFUlQoR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCB8fAorICAgICAgICAgR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpSYWRpb0J1dHRvbik7CisgIENGWF9CeXRlU3RyaW5nIGNzT247CisgIENQREZfRGljdGlvbmFyeSogcEFQID0gbV9wV2lkZ2V0RGljdC0+R2V0RGljdCgiQVAiKTsKKyAgaWYgKCFwQVApIHsKICAgICByZXR1cm4gY3NPbjsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBOID0gcEFQLT5HZXREaWN0KCJOIik7CisgIGlmICghcE4pIHsKKyAgICByZXR1cm4gY3NPbjsKKyAgfQorICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogKnBOKSB7CisgICAgaWYgKGl0LmZpcnN0ICE9ICJPZmYiKSB7CisgICAgICByZXR1cm4gaXQuZmlyc3Q7CisgICAgfQorICB9CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwogfQotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtQ29udHJvbDo6R2V0RXhwb3J0VmFsdWUoKQotewotICAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94IHx8IEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6UmFkaW9CdXR0b24pOwotICAgIENGWF9CeXRlU3RyaW5nIGNzT24gPSBHZXRPblN0YXRlTmFtZSgpOwotICAgIGlmIChHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uIHx8IEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6Q2hlY2tCb3gpIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBPcHQgPSBGUERGX0dldEZpZWxkQXR0cihtX3BGaWVsZC0+bV9wRGljdCwgIk9wdCIpOwotICAgICAgICBpZiAocE9wdCAhPSBOVUxMICYmIHBPcHQtPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgICAgIGludCBpSW5kZXggPSBtX3BGaWVsZC0+R2V0Q29udHJvbEluZGV4KHRoaXMpOwotICAgICAgICAgICAgY3NPbiA9ICgoQ1BERl9BcnJheSopcE9wdCktPkdldFN0cmluZyhpSW5kZXgpOwotICAgICAgICB9Cit2b2lkIENQREZfRm9ybUNvbnRyb2w6OlNldE9uU3RhdGVOYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc09uKSB7CisgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94IHx8CisgICAgICAgICBHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgY3NWYWx1ZSA9IGNzT247CisgIGlmIChjc1ZhbHVlLklzRW1wdHkoKSkgeworICAgIGNzVmFsdWUgPSAiWWVzIjsKKyAgfQorICBpZiAoY3NWYWx1ZSA9PSAiT2ZmIikgeworICAgIGNzVmFsdWUgPSAiWWVzIjsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBjc0FTID0gbV9wV2lkZ2V0RGljdC0+R2V0U3RyaW5nKCJBUyIsICJPZmYiKTsKKyAgaWYgKGNzQVMgIT0gIk9mZiIpIHsKKyAgICBtX3BXaWRnZXREaWN0LT5TZXRBdE5hbWUoIkFTIiwgY3NWYWx1ZSk7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQVAgPSBtX3BXaWRnZXREaWN0LT5HZXREaWN0KCJBUCIpOworICBpZiAoIXBBUCkgeworICAgIHJldHVybjsKKyAgfQorICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogKnBBUCkgeworICAgIENQREZfT2JqZWN0KiBwT2JqMSA9IGl0LnNlY29uZDsKKyAgICBpZiAoIXBPYmoxKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgaWYgKGNzT24uSXNFbXB0eSgpKSB7Ci0gICAgICAgIGNzT24gPSAiWWVzIjsKKyAgICBDUERGX09iamVjdCogcE9iakRpcmVjdDEgPSBwT2JqMS0+R2V0RGlyZWN0KCk7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwU3ViRGljdCA9IHBPYmpEaXJlY3QxLT5Bc0RpY3Rpb25hcnkoKTsKKyAgICBpZiAoIXBTdWJEaWN0KQorICAgICAgY29udGludWU7CisKKyAgICBhdXRvIHN1YmRpY3RfaXQgPSBwU3ViRGljdC0+YmVnaW4oKTsKKyAgICB3aGlsZSAoc3ViZGljdF9pdCAhPSBwU3ViRGljdC0+ZW5kKCkpIHsKKyAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc0tleTIgPSBzdWJkaWN0X2l0LT5maXJzdDsKKyAgICAgIENQREZfT2JqZWN0KiBwT2JqMiA9IHN1YmRpY3RfaXQtPnNlY29uZDsKKyAgICAgICsrc3ViZGljdF9pdDsKKyAgICAgIGlmICghcE9iajIpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoY3NLZXkyICE9ICJPZmYiKSB7CisgICAgICAgIHBTdWJEaWN0LT5SZXBsYWNlS2V5KGNzS2V5MiwgY3NWYWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQogICAgIH0KLSAgICBDRlhfV2lkZVN0cmluZyBjc1dPbiA9IFBERl9EZWNvZGVUZXh0KGNzT24pOwotICAgIHJldHVybiBjc1dPbjsKKyAgfQogfQotRlhfQk9PTCBDUERGX0Zvcm1Db250cm9sOjpJc0NoZWNrZWQoKQotewotICAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94IHx8IEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6UmFkaW9CdXR0b24pOwotICAgIENGWF9CeXRlU3RyaW5nIGNzT24gPSBHZXRPblN0YXRlTmFtZSgpOwotICAgIENGWF9CeXRlU3RyaW5nIGNzQVMgPSBtX3BXaWRnZXREaWN0LT5HZXRTdHJpbmcoIkFTIik7Ci0gICAgcmV0dXJuIGNzQVMgPT0gY3NPbjsKK0NGWF9CeXRlU3RyaW5nIENQREZfRm9ybUNvbnRyb2w6OkdldENoZWNrZWRBUFN0YXRlKCkgeworICBBU1NFUlQoR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCB8fAorICAgICAgICAgR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpSYWRpb0J1dHRvbik7CisgIENGWF9CeXRlU3RyaW5nIGNzT24gPSBHZXRPblN0YXRlTmFtZSgpOworICBpZiAoR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpSYWRpb0J1dHRvbiB8fAorICAgICAgR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCkgeworICAgIGlmIChUb0FycmF5KEZQREZfR2V0RmllbGRBdHRyKG1fcEZpZWxkLT5tX3BEaWN0LCAiT3B0IikpKSB7CisgICAgICBpbnQgaUluZGV4ID0gbV9wRmllbGQtPkdldENvbnRyb2xJbmRleCh0aGlzKTsKKyAgICAgIGNzT24uRm9ybWF0KCIlZCIsIGlJbmRleCk7CisgICAgfQorICB9CisgIGlmIChjc09uLklzRW1wdHkoKSkKKyAgICBjc09uID0gIlllcyI7CisgIHJldHVybiBjc09uOwogfQotRlhfQk9PTCBDUERGX0Zvcm1Db250cm9sOjpJc0RlZmF1bHRDaGVja2VkKCkKLXsKLSAgICBBU1NFUlQoR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCB8fCBHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uKTsKLSAgICBDUERGX09iamVjdCogcERWID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRmllbGQtPm1fcERpY3QsICJEViIpOwotICAgIGlmIChwRFYgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CitDRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1Db250cm9sOjpHZXRFeHBvcnRWYWx1ZSgpIHsKKyAgQVNTRVJUKEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6Q2hlY2tCb3ggfHwKKyAgICAgICAgIEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6UmFkaW9CdXR0b24pOworICBDRlhfQnl0ZVN0cmluZyBjc09uID0gR2V0T25TdGF0ZU5hbWUoKTsKKyAgaWYgKEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6UmFkaW9CdXR0b24gfHwKKyAgICAgIEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6Q2hlY2tCb3gpIHsKKyAgICBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0KKyAgICAgICAgICAgIFRvQXJyYXkoRlBERl9HZXRGaWVsZEF0dHIobV9wRmllbGQtPm1fcERpY3QsICJPcHQiKSkpIHsKKyAgICAgIGludCBpSW5kZXggPSBtX3BGaWVsZC0+R2V0Q29udHJvbEluZGV4KHRoaXMpOworICAgICAgY3NPbiA9IHBBcnJheS0+R2V0U3RyaW5nKGlJbmRleCk7CiAgICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGNzRFYgPSBwRFYtPkdldFN0cmluZygpOwotICAgIENGWF9CeXRlU3RyaW5nIGNzT24gPSBHZXRPblN0YXRlTmFtZSgpOwotICAgIHJldHVybiAoY3NEViA9PSBjc09uKTsKKyAgfQorICBpZiAoY3NPbi5Jc0VtcHR5KCkpIHsKKyAgICBjc09uID0gIlllcyI7CisgIH0KKyAgQ0ZYX1dpZGVTdHJpbmcgY3NXT24gPSBQREZfRGVjb2RlVGV4dChjc09uKTsKKyAgcmV0dXJuIGNzV09uOwogfQotdm9pZCBDUERGX0Zvcm1Db250cm9sOjpDaGVja0NvbnRyb2woRlhfQk9PTCBiQ2hlY2tlZCkKLXsKLSAgICBBU1NFUlQoR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCB8fCBHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc09uID0gR2V0T25TdGF0ZU5hbWUoKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc09sZEFTID0gbV9wV2lkZ2V0RGljdC0+R2V0U3RyaW5nKCJBUyIsICJPZmYiKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc0FTID0gIk9mZiI7Ci0gICAgaWYgKGJDaGVja2VkKSB7Ci0gICAgICAgIGNzQVMgPSBjc09uOwotICAgIH0KLSAgICBpZiAoY3NPbGRBUyA9PSBjc0FTKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wV2lkZ2V0RGljdC0+U2V0QXROYW1lKCJBUyIsIGNzQVMpOwotICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSBUUlVFOworRlhfQk9PTCBDUERGX0Zvcm1Db250cm9sOjpJc0NoZWNrZWQoKSB7CisgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94IHx8CisgICAgICAgICBHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgY3NPbiA9IEdldE9uU3RhdGVOYW1lKCk7CisgIENGWF9CeXRlU3RyaW5nIGNzQVMgPSBtX3BXaWRnZXREaWN0LT5HZXRTdHJpbmcoIkFTIik7CisgIHJldHVybiBjc0FTID09IGNzT247CiB9Ci1DUERGX1N0cmVhbSogRlBERkRPQ19HZXRBbm5vdEFQKENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCwgQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSk7Ci12b2lkIENQREZfRm9ybUNvbnRyb2w6OkRyYXdDb250cm9sKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIENQREZfUGFnZSogcFBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUsIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpCi17Ci0gICAgaWYgKG1fcFdpZGdldERpY3QtPkdldEludGVnZXIoIkYiKSAmIEFOTk9URkxBR19ISURERU4pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IEZQREZET0NfR2V0QW5ub3RBUChtX3BXaWRnZXREaWN0LCBtb2RlKTsKLSAgICBpZiAocFN0cmVhbSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ0ZYX0Zsb2F0UmVjdCBmb3JtX2Jib3ggPSBwU3RyZWFtLT5HZXREaWN0KCktPkdldFJlY3QoIkJCb3giKTsKLSAgICBDRlhfQWZmaW5lTWF0cml4IGZvcm1fbWF0cml4ID0gcFN0cmVhbS0+R2V0RGljdCgpLT5HZXRNYXRyaXgoIk1hdHJpeCIpOwotICAgIGZvcm1fbWF0cml4LlRyYW5zZm9ybVJlY3QoZm9ybV9iYm94KTsKLSAgICBDRlhfRmxvYXRSZWN0IGFyZWN0ID0gbV9wV2lkZ2V0RGljdC0+R2V0UmVjdCgiUmVjdCIpOwotICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwotICAgIG1hdHJpeC5NYXRjaFJlY3QoYXJlY3QsIGZvcm1fYmJveCk7Ci0gICAgbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7Ci0gICAgQ1BERl9Gb3JtIGZvcm0obV9wRmllbGQtPm1fcEZvcm0tPm1fcERvY3VtZW50LCBtX3BGaWVsZC0+bV9wRm9ybS0+bV9wRm9ybURpY3QtPkdldERpY3QoIkRSIiksIHBTdHJlYW0pOwotICAgIGZvcm0uUGFyc2VDb250ZW50KE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwotICAgIENQREZfUmVuZGVyQ29udGV4dCBjb250ZXh0OwotICAgIGNvbnRleHQuQ3JlYXRlKHBQYWdlKTsKLSAgICBjb250ZXh0LkRyYXdPYmplY3RMaXN0KHBEZXZpY2UsICZmb3JtLCAmbWF0cml4LCBwT3B0aW9ucyk7CitGWF9CT09MIENQREZfRm9ybUNvbnRyb2w6OklzRGVmYXVsdENoZWNrZWQoKSB7CisgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94IHx8CisgICAgICAgICBHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uKTsKKyAgQ1BERl9PYmplY3QqIHBEViA9IEZQREZfR2V0RmllbGRBdHRyKG1fcEZpZWxkLT5tX3BEaWN0LCAiRFYiKTsKKyAgaWYgKCFwRFYpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgY3NEViA9IHBEVi0+R2V0U3RyaW5nKCk7CisgIENGWF9CeXRlU3RyaW5nIGNzT24gPSBHZXRPblN0YXRlTmFtZSgpOworICByZXR1cm4gKGNzRFYgPT0gY3NPbik7CiB9Ci1jb25zdCBGWF9DSEFSKiBnX3NIaWdobGlnaHRpbmdNb2RlW10gPSB7Ik4iLCAiSSIsICJPIiwgIlAiLCAiVCIsICIifTsKLUNQREZfRm9ybUNvbnRyb2w6OkhpZ2hsaWdodGluZ01vZGUgQ1BERl9Gb3JtQ29udHJvbDo6R2V0SGlnaGxpZ2h0aW5nTW9kZSgpCi17Ci0gICAgaWYgKG1fcFdpZGdldERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gSW52ZXJ0OwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBjc0ggPSBtX3BXaWRnZXREaWN0LT5HZXRTdHJpbmcoIkgiLCAiSSIpOwotICAgIGludCBpID0gMDsKLSAgICB3aGlsZSAoZ19zSGlnaGxpZ2h0aW5nTW9kZVtpXVswXSAhPSAnXDAnKSB7Ci0gICAgICAgIGlmIChjc0guRXF1YWwoZ19zSGlnaGxpZ2h0aW5nTW9kZVtpXSkpIHsKLSAgICAgICAgICAgIHJldHVybiAoSGlnaGxpZ2h0aW5nTW9kZSlpOwotICAgICAgICB9Ci0gICAgICAgIGkgKys7Ci0gICAgfQordm9pZCBDUERGX0Zvcm1Db250cm9sOjpDaGVja0NvbnRyb2woRlhfQk9PTCBiQ2hlY2tlZCkgeworICBBU1NFUlQoR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCB8fAorICAgICAgICAgR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpSYWRpb0J1dHRvbik7CisgIENGWF9CeXRlU3RyaW5nIGNzT24gPSBHZXRPblN0YXRlTmFtZSgpOworICBDRlhfQnl0ZVN0cmluZyBjc09sZEFTID0gbV9wV2lkZ2V0RGljdC0+R2V0U3RyaW5nKCJBUyIsICJPZmYiKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgY3NBUyA9ICJPZmYiOworICBpZiAoYkNoZWNrZWQpIHsKKyAgICBjc0FTID0gY3NPbjsKKyAgfQorICBpZiAoY3NPbGRBUyA9PSBjc0FTKSB7CisgICAgcmV0dXJuOworICB9CisgIG1fcFdpZGdldERpY3QtPlNldEF0TmFtZSgiQVMiLCBjc0FTKTsKKyAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7Cit9CitDUERGX1N0cmVhbSogRlBERkRPQ19HZXRBbm5vdEFQKENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSk7Cit2b2lkIENQREZfRm9ybUNvbnRyb2w6OkRyYXdDb250cm9sKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUGFnZSogcFBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpIHsKKyAgaWYgKG1fcFdpZGdldERpY3QtPkdldEludGVnZXIoIkYiKSAmIEFOTk9URkxBR19ISURERU4pIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBGUERGRE9DX0dldEFubm90QVAobV9wV2lkZ2V0RGljdCwgbW9kZSk7CisgIGlmICghcFN0cmVhbSkgeworICAgIHJldHVybjsKKyAgfQorICBDRlhfRmxvYXRSZWN0IGZvcm1fYmJveCA9IHBTdHJlYW0tPkdldERpY3QoKS0+R2V0UmVjdCgiQkJveCIpOworICBDRlhfTWF0cml4IGZvcm1fbWF0cml4ID0gcFN0cmVhbS0+R2V0RGljdCgpLT5HZXRNYXRyaXgoIk1hdHJpeCIpOworICBmb3JtX21hdHJpeC5UcmFuc2Zvcm1SZWN0KGZvcm1fYmJveCk7CisgIENGWF9GbG9hdFJlY3QgYXJlY3QgPSBtX3BXaWRnZXREaWN0LT5HZXRSZWN0KCJSZWN0Iik7CisgIENGWF9NYXRyaXggbWF0cml4OworICBtYXRyaXguTWF0Y2hSZWN0KGFyZWN0LCBmb3JtX2Jib3gpOworICBtYXRyaXguQ29uY2F0KCpwTWF0cml4KTsKKyAgQ1BERl9Gb3JtIGZvcm0obV9wRmllbGQtPm1fcEZvcm0tPm1fcERvY3VtZW50LAorICAgICAgICAgICAgICAgICBtX3BGaWVsZC0+bV9wRm9ybS0+bV9wRm9ybURpY3QtPkdldERpY3QoIkRSIiksIHBTdHJlYW0pOworICBmb3JtLlBhcnNlQ29udGVudChOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgQ1BERl9SZW5kZXJDb250ZXh0IGNvbnRleHQocFBhZ2UpOworICBjb250ZXh0LkRyYXdPYmplY3RMaXN0KHBEZXZpY2UsICZmb3JtLCAmbWF0cml4LCBwT3B0aW9ucyk7Cit9CitzdGF0aWMgY29uc3QgRlhfQ0hBUiogY29uc3QgZ19zSGlnaGxpZ2h0aW5nTW9kZVtdID0geworICAgIC8vIE11c3QgbWF0Y2ggb3JkZXIgb2YgSGlnbGlnaHRpbmdNb2RlIGVudW0uCisgICAgIk4iLCAiSSIsICJPIiwgIlAiLCAiVCIsIG51bGxwdHJ9OworQ1BERl9Gb3JtQ29udHJvbDo6SGlnaGxpZ2h0aW5nTW9kZSBDUERGX0Zvcm1Db250cm9sOjpHZXRIaWdobGlnaHRpbmdNb2RlKCkgeworICBpZiAoIW1fcFdpZGdldERpY3QpIHsKICAgICByZXR1cm4gSW52ZXJ0OworICB9CisgIENGWF9CeXRlU3RyaW5nIGNzSCA9IG1fcFdpZGdldERpY3QtPkdldFN0cmluZygiSCIsICJJIik7CisgIGZvciAoaW50IGkgPSAwOyBnX3NIaWdobGlnaHRpbmdNb2RlW2ldOyArK2kpIHsKKyAgICBpZiAoY3NILkVxdWFsKGdfc0hpZ2hsaWdodGluZ01vZGVbaV0pKQorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhpZ2hsaWdodGluZ01vZGU+KGkpOworICB9CisgIHJldHVybiBJbnZlcnQ7CiB9Ci1DUERGX0FwU2V0dGluZ3MgQ1BERl9Gb3JtQ29udHJvbDo6R2V0TUsoRlhfQk9PTCBiQ3JlYXRlKQotewotICAgIGlmICghbV9wV2lkZ2V0RGljdCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9BcFNldHRpbmdzIG1rID0gbV9wV2lkZ2V0RGljdC0+R2V0RGljdChGWF9CU1RSQygiTUsiKSk7Ci0gICAgaWYgKCFtayAmJiBiQ3JlYXRlKSB7Ci0gICAgICAgIG1rID0gQ1BERl9EaWN0aW9uYXJ5OjpDcmVhdGUoKTsKLSAgICAgICAgaWYgKG1rID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworCitDUERGX0FwU2V0dGluZ3MgQ1BERl9Gb3JtQ29udHJvbDo6R2V0TUsoKSBjb25zdCB7CisgIHJldHVybiBDUERGX0FwU2V0dGluZ3MobV9wV2lkZ2V0RGljdCA/IG1fcFdpZGdldERpY3QtPkdldERpY3QoIk1LIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbHB0cik7Cit9CisKK2Jvb2wgQ1BERl9Gb3JtQ29udHJvbDo6SGFzTUtFbnRyeShDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KSBjb25zdCB7CisgIHJldHVybiBHZXRNSygpLkhhc01LRW50cnkoY3NFbnRyeSk7Cit9CisKK2ludCBDUERGX0Zvcm1Db250cm9sOjpHZXRSb3RhdGlvbigpIHsKKyAgcmV0dXJuIEdldE1LKCkuR2V0Um90YXRpb24oKTsKK30KKworRlhfQVJHQiBDUERGX0Zvcm1Db250cm9sOjpHZXRDb2xvcihpbnQmIGlDb2xvclR5cGUsIENGWF9CeXRlU3RyaW5nIGNzRW50cnkpIHsKKyAgcmV0dXJuIEdldE1LKCkuR2V0Q29sb3IoaUNvbG9yVHlwZSwgY3NFbnRyeSk7Cit9CisKK0ZYX0ZMT0FUIENQREZfRm9ybUNvbnRyb2w6OkdldE9yaWdpbmFsQ29sb3IoaW50IGluZGV4LCBDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KSB7CisgIHJldHVybiBHZXRNSygpLkdldE9yaWdpbmFsQ29sb3IoaW5kZXgsIGNzRW50cnkpOworfQorCit2b2lkIENQREZfRm9ybUNvbnRyb2w6OkdldE9yaWdpbmFsQ29sb3IoaW50JiBpQ29sb3JUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZjWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNzRW50cnkpIHsKKyAgR2V0TUsoKS5HZXRPcmlnaW5hbENvbG9yKGlDb2xvclR5cGUsIGZjLCBjc0VudHJ5KTsKK30KK0NGWF9XaWRlU3RyaW5nIENQREZfRm9ybUNvbnRyb2w6OkdldENhcHRpb24oQ0ZYX0J5dGVTdHJpbmcgY3NFbnRyeSkgeworICByZXR1cm4gR2V0TUsoKS5HZXRDYXB0aW9uKGNzRW50cnkpOworfQorCitDUERGX1N0cmVhbSogQ1BERl9Gb3JtQ29udHJvbDo6R2V0SWNvbihDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KSB7CisgIHJldHVybiBHZXRNSygpLkdldEljb24oY3NFbnRyeSk7Cit9CisKK0NQREZfSWNvbkZpdCBDUERGX0Zvcm1Db250cm9sOjpHZXRJY29uRml0KCkgeworICByZXR1cm4gR2V0TUsoKS5HZXRJY29uRml0KCk7Cit9CisKK2ludCBDUERGX0Zvcm1Db250cm9sOjpHZXRUZXh0UG9zaXRpb24oKSB7CisgIHJldHVybiBHZXRNSygpLkdldFRleHRQb3NpdGlvbigpOworfQorCitDUERGX0FjdGlvbiBDUERGX0Zvcm1Db250cm9sOjpHZXRBY3Rpb24oKSB7CisgIGlmICghbV9wV2lkZ2V0RGljdCkgeworICAgIHJldHVybiBDUERGX0FjdGlvbigpOworICB9CisgIGlmIChtX3BXaWRnZXREaWN0LT5LZXlFeGlzdCgiQSIpKSB7CisgICAgcmV0dXJuIENQREZfQWN0aW9uKG1fcFdpZGdldERpY3QtPkdldERpY3QoIkEiKSk7CisgIH0KKyAgQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BGaWVsZC0+bV9wRGljdCwgIkEiKTsKKyAgaWYgKCFwT2JqKSB7CisgICAgcmV0dXJuIENQREZfQWN0aW9uKCk7CisgIH0KKyAgcmV0dXJuIENQREZfQWN0aW9uKHBPYmotPkdldERpY3QoKSk7Cit9CitDUERGX0FBY3Rpb24gQ1BERl9Gb3JtQ29udHJvbDo6R2V0QWRkaXRpb25hbEFjdGlvbigpIHsKKyAgaWYgKCFtX3BXaWRnZXREaWN0KSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgaWYgKG1fcFdpZGdldERpY3QtPktleUV4aXN0KCJBQSIpKSB7CisgICAgcmV0dXJuIG1fcFdpZGdldERpY3QtPkdldERpY3QoIkFBIik7CisgIH0KKyAgcmV0dXJuIG1fcEZpZWxkLT5HZXRBZGRpdGlvbmFsQWN0aW9uKCk7Cit9CitDUERGX0RlZmF1bHRBcHBlYXJhbmNlIENQREZfRm9ybUNvbnRyb2w6OkdldERlZmF1bHRBcHBlYXJhbmNlKCkgeworICBpZiAoIW1fcFdpZGdldERpY3QpIHsKKyAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKKyAgfQorICBpZiAobV9wV2lkZ2V0RGljdC0+S2V5RXhpc3QoIkRBIikpIHsKKyAgICByZXR1cm4gbV9wV2lkZ2V0RGljdC0+R2V0U3RyaW5nKCJEQSIpOworICB9CisgIENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRmllbGQtPm1fcERpY3QsICJEQSIpOworICBpZiAoIXBPYmopIHsKKyAgICByZXR1cm4gbV9wRmllbGQtPm1fcEZvcm0tPkdldERlZmF1bHRBcHBlYXJhbmNlKCk7CisgIH0KKyAgcmV0dXJuIHBPYmotPkdldFN0cmluZygpOworfQorCitDUERGX0ZvbnQqIENQREZfRm9ybUNvbnRyb2w6OkdldERlZmF1bHRDb250cm9sRm9udCgpIHsKKyAgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSBjREEgPSBHZXREZWZhdWx0QXBwZWFyYW5jZSgpOworICBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lVGFnOworICBGWF9GTE9BVCBmRm9udFNpemU7CisgIGNEQS5HZXRGb250KGNzRm9udE5hbWVUYWcsIGZGb250U2l6ZSk7CisgIGlmIChjc0ZvbnROYW1lVGFnLklzRW1wdHkoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcFdpZGdldERpY3QsICJEUiIpOworICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IFRvRGljdGlvbmFyeShwT2JqKSkgeworICAgIENQREZfRGljdGlvbmFyeSogcEZvbnRzID0gcERpY3QtPkdldERpY3QoIkZvbnQiKTsKKyAgICBpZiAocEZvbnRzKSB7CisgICAgICBDUERGX0RpY3Rpb25hcnkqIHBFbGVtZW50ID0gcEZvbnRzLT5HZXREaWN0KGNzRm9udE5hbWVUYWcpOworICAgICAgaWYgKHBFbGVtZW50KSB7CisgICAgICAgIENQREZfRm9udCogcEZvbnQgPSBtX3BGaWVsZC0+bV9wRm9ybS0+bV9wRG9jdW1lbnQtPkxvYWRGb250KHBFbGVtZW50KTsKKyAgICAgICAgaWYgKHBGb250KSB7CisgICAgICAgICAgcmV0dXJuIHBGb250OwogICAgICAgICB9Ci0gICAgICAgIG1fcFdpZGdldERpY3QtPlNldEF0KEZYX0JTVFJDKCJNSyIpLCBtayk7CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiBtazsKLX0KLUZYX0JPT0wgQ1BERl9Gb3JtQ29udHJvbDo6SGFzTUtFbnRyeShDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KQotewotICAgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKEZBTFNFKTsKLSAgICByZXR1cm4gbWsuSGFzTUtFbnRyeShjc0VudHJ5KTsKLX0KLWludCBDUERGX0Zvcm1Db250cm9sOjpHZXRSb3RhdGlvbigpCi17Ci0gICAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoRkFMU0UpOwotICAgIHJldHVybiBtay5HZXRSb3RhdGlvbigpOwotfQotRlhfQVJHQiBDUERGX0Zvcm1Db250cm9sOjpHZXRDb2xvcihpbnQmIGlDb2xvclR5cGUsIENGWF9CeXRlU3RyaW5nIGNzRW50cnkpCi17Ci0gICAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoRkFMU0UpOwotICAgIHJldHVybiBtay5HZXRDb2xvcihpQ29sb3JUeXBlLCBjc0VudHJ5KTsKLX0KLUZYX0ZMT0FUIENQREZfRm9ybUNvbnRyb2w6OkdldE9yaWdpbmFsQ29sb3IoaW50IGluZGV4LCBDRlhfQnl0ZVN0cmluZyBjc0VudHJ5KQotewotICAgIENQREZfQXBTZXR0aW5ncyBtayA9IEdldE1LKEZBTFNFKTsKLSAgICByZXR1cm4gbWsuR2V0T3JpZ2luYWxDb2xvcihpbmRleCwgY3NFbnRyeSk7Ci19Ci12b2lkIENQREZfRm9ybUNvbnRyb2w6OkdldE9yaWdpbmFsQ29sb3IoaW50JiBpQ29sb3JUeXBlLCBGWF9GTE9BVCBmY1s0XSwgQ0ZYX0J5dGVTdHJpbmcgY3NFbnRyeSkKLXsKLSAgICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhGQUxTRSk7Ci0gICAgbWsuR2V0T3JpZ2luYWxDb2xvcihpQ29sb3JUeXBlLCBmYywgY3NFbnRyeSk7Ci19Ci1DRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1Db250cm9sOjpHZXRDYXB0aW9uKENGWF9CeXRlU3RyaW5nIGNzRW50cnkpCi17Ci0gICAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoRkFMU0UpOwotICAgIHJldHVybiBtay5HZXRDYXB0aW9uKGNzRW50cnkpOwotfQotQ1BERl9TdHJlYW0qIENQREZfRm9ybUNvbnRyb2w6OkdldEljb24oQ0ZYX0J5dGVTdHJpbmcgY3NFbnRyeSkKLXsKLSAgICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhGQUxTRSk7Ci0gICAgcmV0dXJuIG1rLkdldEljb24oY3NFbnRyeSk7Ci19Ci1DUERGX0ljb25GaXQgQ1BERl9Gb3JtQ29udHJvbDo6R2V0SWNvbkZpdCgpCi17Ci0gICAgQ1BERl9BcFNldHRpbmdzIG1rID0gR2V0TUsoRkFMU0UpOwotICAgIHJldHVybiBtay5HZXRJY29uRml0KCk7Ci19Ci1pbnQgQ1BERl9Gb3JtQ29udHJvbDo6R2V0VGV4dFBvc2l0aW9uKCkKLXsKLSAgICBDUERGX0FwU2V0dGluZ3MgbWsgPSBHZXRNSyhGQUxTRSk7Ci0gICAgcmV0dXJuIG1rLkdldFRleHRQb3NpdGlvbigpOwotfQotQ1BERl9BY3Rpb24gQ1BERl9Gb3JtQ29udHJvbDo6R2V0QWN0aW9uKCkKLXsKLSAgICBpZiAoIW1fcFdpZGdldERpY3QpIHsKLSAgICAgICAgcmV0dXJuIENQREZfQWN0aW9uKCk7Ci0gICAgfQotICAgIGlmIChtX3BXaWRnZXREaWN0LT5LZXlFeGlzdCgiQSIpKSB7Ci0gICAgICAgIHJldHVybiBDUERGX0FjdGlvbihtX3BXaWRnZXREaWN0LT5HZXREaWN0KCJBIikpOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcEZpZWxkLT5tX3BEaWN0LCAiQSIpOwotICAgIGlmICghcE9iaikgewotICAgICAgICByZXR1cm4gQ1BERl9BY3Rpb24oKTsKLSAgICB9Ci0gICAgcmV0dXJuIENQREZfQWN0aW9uKHBPYmotPkdldERpY3QoKSk7Ci19Ci1DUERGX0FBY3Rpb24gQ1BERl9Gb3JtQ29udHJvbDo6R2V0QWRkaXRpb25hbEFjdGlvbigpCi17Ci0gICAgaWYgKG1fcFdpZGdldERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKG1fcFdpZGdldERpY3QtPktleUV4aXN0KCJBQSIpKSB7Ci0gICAgICAgIHJldHVybiBtX3BXaWRnZXREaWN0LT5HZXREaWN0KCJBQSIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtX3BGaWVsZC0+R2V0QWRkaXRpb25hbEFjdGlvbigpOwotICAgIH0KLX0KLUNQREZfRGVmYXVsdEFwcGVhcmFuY2UgQ1BERl9Gb3JtQ29udHJvbDo6R2V0RGVmYXVsdEFwcGVhcmFuY2UoKQotewotICAgIGlmIChtX3BXaWRnZXREaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci0gICAgfQotICAgIGlmIChtX3BXaWRnZXREaWN0LT5LZXlFeGlzdCgiREEiKSkgewotICAgICAgICByZXR1cm4gbV9wV2lkZ2V0RGljdC0+R2V0U3RyaW5nKCJEQSIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRmllbGQtPm1fcERpY3QsICJEQSIpOwotICAgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gbV9wRmllbGQtPm1fcEZvcm0tPkdldERlZmF1bHRBcHBlYXJhbmNlKCk7CisgIH0KKyAgaWYgKENQREZfRm9udCogcEZvcm1Gb250ID0gbV9wRmllbGQtPm1fcEZvcm0tPkdldEZvcm1Gb250KGNzRm9udE5hbWVUYWcpKQorICAgIHJldHVybiBwRm9ybUZvbnQ7CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBtX3BXaWRnZXREaWN0LT5HZXREaWN0KCJQIik7CisgIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihwUGFnZURpY3QsICJSZXNvdXJjZXMiKTsKKyAgaWYgKENQREZfRGljdGlvbmFyeSogcERpY3QgPSBUb0RpY3Rpb25hcnkocE9iaikpIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBGb250cyA9IHBEaWN0LT5HZXREaWN0KCJGb250Iik7CisgICAgaWYgKHBGb250cykgeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRWxlbWVudCA9IHBGb250cy0+R2V0RGljdChjc0ZvbnROYW1lVGFnKTsKKyAgICAgIGlmIChwRWxlbWVudCkgeworICAgICAgICBDUERGX0ZvbnQqIHBGb250ID0gbV9wRmllbGQtPm1fcEZvcm0tPm1fcERvY3VtZW50LT5Mb2FkRm9udChwRWxlbWVudCk7CisgICAgICAgIGlmIChwRm9udCkgeworICAgICAgICAgIHJldHVybiBwRm9udDsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcE9iai0+R2V0U3RyaW5nKCk7CisgICAgICB9CiAgICAgfQorICB9CisgIHJldHVybiBudWxscHRyOwogfQotQ1BERl9Gb250KiBDUERGX0Zvcm1Db250cm9sOjpHZXREZWZhdWx0Q29udHJvbEZvbnQoKQotewotICAgIENQREZfRGVmYXVsdEFwcGVhcmFuY2UgY0RBID0gR2V0RGVmYXVsdEFwcGVhcmFuY2UoKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lVGFnOwotICAgIEZYX0ZMT0FUIGZGb250U2l6ZTsKLSAgICBjREEuR2V0Rm9udChjc0ZvbnROYW1lVGFnLCBmRm9udFNpemUpOwotICAgIGlmIChjc0ZvbnROYW1lVGFnLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BXaWRnZXREaWN0LCAiRFIiKTsKLSAgICBpZiAocE9iaiAhPSBOVUxMICYmIHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBGb250cyA9ICgoQ1BERl9EaWN0aW9uYXJ5KilwT2JqKS0+R2V0RGljdCgiRm9udCIpOwotICAgICAgICBpZiAocEZvbnRzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSAqcEVsZW1lbnQgPSBwRm9udHMtPkdldERpY3QoY3NGb250TmFtZVRhZyk7Ci0gICAgICAgICAgICBDUERGX0ZvbnQgKnBGb250ID0gbV9wRmllbGQtPm1fcEZvcm0tPm1fcERvY3VtZW50LT5Mb2FkRm9udChwRWxlbWVudCk7Ci0gICAgICAgICAgICBpZiAocEZvbnQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBwRm9udDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBDUERGX0ZvbnQgKnBGb250ID0gbV9wRmllbGQtPm1fcEZvcm0tPkdldEZvcm1Gb250KGNzRm9udE5hbWVUYWcpOwotICAgIGlmIChwRm9udCAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBwRm9udDsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5ICpwUGFnZURpY3QgPSBtX3BXaWRnZXREaWN0LT5HZXREaWN0KCJQIik7Ci0gICAgcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKHBQYWdlRGljdCwgIlJlc291cmNlcyIpOwotICAgIGlmIChwT2JqICE9IE5VTEwgJiYgcE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcEZvbnRzID0gKChDUERGX0RpY3Rpb25hcnkqKXBPYmopLT5HZXREaWN0KCJGb250Iik7Ci0gICAgICAgIGlmIChwRm9udHMgIT0gTlVMTCkgewotICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5ICpwRWxlbWVudCA9IHBGb250cy0+R2V0RGljdChjc0ZvbnROYW1lVGFnKTsKLSAgICAgICAgICAgIENQREZfRm9udCAqcEZvbnQgPSBtX3BGaWVsZC0+bV9wRm9ybS0+bV9wRG9jdW1lbnQtPkxvYWRGb250KHBFbGVtZW50KTsKLSAgICAgICAgICAgIGlmIChwRm9udCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBGb250OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotaW50IENQREZfRm9ybUNvbnRyb2w6OkdldENvbnRyb2xBbGlnbm1lbnQoKQotewotICAgIGlmIChtX3BXaWRnZXREaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChtX3BXaWRnZXREaWN0LT5LZXlFeGlzdCgiUSIpKSB7Ci0gICAgICAgIHJldHVybiBtX3BXaWRnZXREaWN0LT5HZXRJbnRlZ2VyKCJRIiwgMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BGaWVsZC0+bV9wRGljdCwgIlEiKTsKLSAgICAgICAgaWYgKHBPYmogPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIG1fcEZpZWxkLT5tX3BGb3JtLT5HZXRGb3JtQWxpZ25tZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBPYmotPkdldEludGVnZXIoKTsKLSAgICB9Ci19Ci1GWF9CT09MIENQREZfQXBTZXR0aW5nczo6SGFzTUtFbnRyeShGWF9CU1RSIGNzRW50cnkpCi17Ci0gICAgaWYgKG1fcERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBtX3BEaWN0LT5LZXlFeGlzdChjc0VudHJ5KTsKLX0KLWludCBDUERGX0FwU2V0dGluZ3M6OkdldFJvdGF0aW9uKCkKLXsKLSAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gbV9wRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiUiIpKTsKLX0KLUZYX0FSR0IgQ1BERl9BcFNldHRpbmdzOjpHZXRDb2xvcihpbnQmIGlDb2xvclR5cGUsIEZYX0JTVFIgY3NFbnRyeSkKLXsKLSAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOwotICAgIGlmIChtX3BEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIEZYX0FSR0IgY29sb3IgPSAwOwotICAgIENQREZfQXJyYXkqIHBFbnRyeSA9IG1fcERpY3QtPkdldEFycmF5KGNzRW50cnkpOwotICAgIGlmIChwRW50cnkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gY29sb3I7Ci0gICAgfQotICAgIEZYX0RXT1JEIGR3Q291bnQgPSBwRW50cnktPkdldENvdW50KCk7Ci0gICAgaWYgKGR3Q291bnQgPT0gMSkgewotICAgICAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX0dSQVk7Ci0gICAgICAgIEZYX0ZMT0FUIGcgPSBwRW50cnktPkdldE51bWJlcigwKSAqIDI1NTsKLSAgICAgICAgY29sb3IgPSBBcmdiRW5jb2RlKDI1NSwgKGludClnLCAoaW50KWcsIChpbnQpZyk7Ci0gICAgfSBlbHNlIGlmIChkd0NvdW50ID09IDMpIHsKLSAgICAgICAgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9SR0I7Ci0gICAgICAgIEZYX0ZMT0FUIHIgPSBwRW50cnktPkdldE51bWJlcigwKSAqIDI1NTsKLSAgICAgICAgRlhfRkxPQVQgZyA9IHBFbnRyeS0+R2V0TnVtYmVyKDEpICogMjU1OwotICAgICAgICBGWF9GTE9BVCBiID0gcEVudHJ5LT5HZXROdW1iZXIoMikgKiAyNTU7Ci0gICAgICAgIGNvbG9yID0gQXJnYkVuY29kZSgyNTUsIChpbnQpciwgKGludClnLCAoaW50KWIpOwotICAgIH0gZWxzZSBpZiAoZHdDb3VudCA9PSA0KSB7Ci0gICAgICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfQ01ZSzsKLSAgICAgICAgRlhfRkxPQVQgYyA9IHBFbnRyeS0+R2V0TnVtYmVyKDApOwotICAgICAgICBGWF9GTE9BVCBtID0gcEVudHJ5LT5HZXROdW1iZXIoMSk7Ci0gICAgICAgIEZYX0ZMT0FUIHkgPSBwRW50cnktPkdldE51bWJlcigyKTsKLSAgICAgICAgRlhfRkxPQVQgayA9IHBFbnRyeS0+R2V0TnVtYmVyKDMpOwotICAgICAgICBGWF9GTE9BVCByID0gMS4wZiAtIEZYX01JTigxLjBmLCBjICsgayk7Ci0gICAgICAgIEZYX0ZMT0FUIGcgPSAxLjBmIC0gRlhfTUlOKDEuMGYsIG0gKyBrKTsKLSAgICAgICAgRlhfRkxPQVQgYiA9IDEuMGYgLSBGWF9NSU4oMS4wZiwgeSArIGspOwotICAgICAgICBjb2xvciA9IEFyZ2JFbmNvZGUoMjU1LCAoaW50KShyICogMjU1KSwgKGludCkoZyAqIDI1NSksIChpbnQpKGIgKiAyNTUpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbG9yOwotfQotRlhfRkxPQVQgQ1BERl9BcFNldHRpbmdzOjpHZXRPcmlnaW5hbENvbG9yKGludCBpbmRleCwgRlhfQlNUUiBjc0VudHJ5KQotewotICAgIGlmIChtX3BEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBFbnRyeSA9IG1fcERpY3QtPkdldEFycmF5KGNzRW50cnkpOwotICAgIGlmIChwRW50cnkgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gcEVudHJ5LT5HZXROdW1iZXIoaW5kZXgpOwotICAgIH0KKworaW50IENQREZfRm9ybUNvbnRyb2w6OkdldENvbnRyb2xBbGlnbm1lbnQoKSB7CisgIGlmICghbV9wV2lkZ2V0RGljdCkgewogICAgIHJldHVybiAwOworICB9CisgIGlmIChtX3BXaWRnZXREaWN0LT5LZXlFeGlzdCgiUSIpKSB7CisgICAgcmV0dXJuIG1fcFdpZGdldERpY3QtPkdldEludGVnZXIoIlEiLCAwKTsKKyAgfQorICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcEZpZWxkLT5tX3BEaWN0LCAiUSIpOworICBpZiAocE9iaikKKyAgICByZXR1cm4gcE9iai0+R2V0SW50ZWdlcigpOworICByZXR1cm4gbV9wRmllbGQtPm1fcEZvcm0tPkdldEZvcm1BbGlnbm1lbnQoKTsKIH0KLXZvaWQgQ1BERl9BcFNldHRpbmdzOjpHZXRPcmlnaW5hbENvbG9yKGludCYgaUNvbG9yVHlwZSwgRlhfRkxPQVQgZmNbNF0sIEZYX0JTVFIgY3NFbnRyeSkKLXsKLSAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSArKykgewotICAgICAgICBmY1tpXSA9IDA7Ci0gICAgfQotICAgIGlmIChtX3BEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX0FycmF5KiBwRW50cnkgPSBtX3BEaWN0LT5HZXRBcnJheShjc0VudHJ5KTsKLSAgICBpZiAocEVudHJ5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9EV09SRCBkd0NvdW50ID0gcEVudHJ5LT5HZXRDb3VudCgpOwotICAgIGlmIChkd0NvdW50ID09IDEpIHsKLSAgICAgICAgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9HUkFZOwotICAgICAgICBmY1swXSA9IHBFbnRyeS0+R2V0TnVtYmVyKDApOwotICAgIH0gZWxzZSBpZiAoZHdDb3VudCA9PSAzKSB7Ci0gICAgICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfUkdCOwotICAgICAgICBmY1swXSA9IHBFbnRyeS0+R2V0TnVtYmVyKDApOwotICAgICAgICBmY1sxXSA9IHBFbnRyeS0+R2V0TnVtYmVyKDEpOwotICAgICAgICBmY1syXSA9IHBFbnRyeS0+R2V0TnVtYmVyKDIpOwotICAgIH0gZWxzZSBpZiAoZHdDb3VudCA9PSA0KSB7Ci0gICAgICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfQ01ZSzsKLSAgICAgICAgZmNbMF0gPSBwRW50cnktPkdldE51bWJlcigwKTsKLSAgICAgICAgZmNbMV0gPSBwRW50cnktPkdldE51bWJlcigxKTsKLSAgICAgICAgZmNbMl0gPSBwRW50cnktPkdldE51bWJlcigyKTsKLSAgICAgICAgZmNbM10gPSBwRW50cnktPkdldE51bWJlcigzKTsKLSAgICB9CisKK0NQREZfQXBTZXR0aW5nczo6Q1BERl9BcFNldHRpbmdzKENQREZfRGljdGlvbmFyeSogcERpY3QpIDogbV9wRGljdChwRGljdCkge30KKworYm9vbCBDUERGX0FwU2V0dGluZ3M6Okhhc01LRW50cnkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBjc0VudHJ5KSBjb25zdCB7CisgIHJldHVybiBtX3BEaWN0ICYmIG1fcERpY3QtPktleUV4aXN0KGNzRW50cnkpOwogfQotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9BcFNldHRpbmdzOjpHZXRDYXB0aW9uKEZYX0JTVFIgY3NFbnRyeSkKLXsKLSAgICBDRlhfV2lkZVN0cmluZyBjc0NhcHRpb247Ci0gICAgaWYgKG1fcERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gY3NDYXB0aW9uOwotICAgIH0KLSAgICByZXR1cm4gbV9wRGljdC0+R2V0VW5pY29kZVRleHQoY3NFbnRyeSk7CisKK2ludCBDUERGX0FwU2V0dGluZ3M6OkdldFJvdGF0aW9uKCkgY29uc3QgeworICByZXR1cm4gbV9wRGljdCA/IG1fcERpY3QtPkdldEludGVnZXIoIlIiKSA6IDA7CiB9Ci1DUERGX1N0cmVhbSogQ1BERl9BcFNldHRpbmdzOjpHZXRJY29uKEZYX0JTVFIgY3NFbnRyeSkKLXsKLSAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbV9wRGljdC0+R2V0U3RyZWFtKGNzRW50cnkpOworCitGWF9BUkdCIENQREZfQXBTZXR0aW5nczo6R2V0Q29sb3IoaW50JiBpQ29sb3JUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NFbnRyeSkgY29uc3QgeworICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOworICBpZiAoIW1fcERpY3QpCisgICAgcmV0dXJuIDA7CisKKyAgQ1BERl9BcnJheSogcEVudHJ5ID0gbV9wRGljdC0+R2V0QXJyYXkoY3NFbnRyeSk7CisgIGlmICghcEVudHJ5KQorICAgIHJldHVybiAwOworCisgIEZYX0FSR0IgY29sb3IgPSAwOworICBGWF9EV09SRCBkd0NvdW50ID0gcEVudHJ5LT5HZXRDb3VudCgpOworICBpZiAoZHdDb3VudCA9PSAxKSB7CisgICAgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9HUkFZOworICAgIEZYX0ZMT0FUIGcgPSBwRW50cnktPkdldE51bWJlcigwKSAqIDI1NTsKKyAgICBjb2xvciA9IEFyZ2JFbmNvZGUoMjU1LCAoaW50KWcsIChpbnQpZywgKGludClnKTsKKyAgfSBlbHNlIGlmIChkd0NvdW50ID09IDMpIHsKKyAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX1JHQjsKKyAgICBGWF9GTE9BVCByID0gcEVudHJ5LT5HZXROdW1iZXIoMCkgKiAyNTU7CisgICAgRlhfRkxPQVQgZyA9IHBFbnRyeS0+R2V0TnVtYmVyKDEpICogMjU1OworICAgIEZYX0ZMT0FUIGIgPSBwRW50cnktPkdldE51bWJlcigyKSAqIDI1NTsKKyAgICBjb2xvciA9IEFyZ2JFbmNvZGUoMjU1LCAoaW50KXIsIChpbnQpZywgKGludCliKTsKKyAgfSBlbHNlIGlmIChkd0NvdW50ID09IDQpIHsKKyAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX0NNWUs7CisgICAgRlhfRkxPQVQgYyA9IHBFbnRyeS0+R2V0TnVtYmVyKDApOworICAgIEZYX0ZMT0FUIG0gPSBwRW50cnktPkdldE51bWJlcigxKTsKKyAgICBGWF9GTE9BVCB5ID0gcEVudHJ5LT5HZXROdW1iZXIoMik7CisgICAgRlhfRkxPQVQgayA9IHBFbnRyeS0+R2V0TnVtYmVyKDMpOworICAgIEZYX0ZMT0FUIHIgPSAxLjBmIC0gc3RkOjptaW4oMS4wZiwgYyArIGspOworICAgIEZYX0ZMT0FUIGcgPSAxLjBmIC0gc3RkOjptaW4oMS4wZiwgbSArIGspOworICAgIEZYX0ZMT0FUIGIgPSAxLjBmIC0gc3RkOjptaW4oMS4wZiwgeSArIGspOworICAgIGNvbG9yID0gQXJnYkVuY29kZSgyNTUsIChpbnQpKHIgKiAyNTUpLCAoaW50KShnICogMjU1KSwgKGludCkoYiAqIDI1NSkpOworICB9CisgIHJldHVybiBjb2xvcjsKIH0KLUNQREZfSWNvbkZpdCBDUERGX0FwU2V0dGluZ3M6OkdldEljb25GaXQoKQotewotICAgIGlmIChtX3BEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBtX3BEaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJJRiIpKTsKKworRlhfRkxPQVQgQ1BERl9BcFNldHRpbmdzOjpHZXRPcmlnaW5hbENvbG9yKAorICAgIGludCBpbmRleCwKKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzRW50cnkpIGNvbnN0IHsKKyAgaWYgKCFtX3BEaWN0KQorICAgIHJldHVybiAwOworCisgIENQREZfQXJyYXkqIHBFbnRyeSA9IG1fcERpY3QtPkdldEFycmF5KGNzRW50cnkpOworICByZXR1cm4gcEVudHJ5ID8gcEVudHJ5LT5HZXROdW1iZXIoaW5kZXgpIDogMDsKIH0KLWludCBDUERGX0FwU2V0dGluZ3M6OkdldFRleHRQb3NpdGlvbigpCi17Ci0gICAgaWYgKG1fcERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVEVYVFBPU19DQVBUSU9OOwotICAgIH0KLSAgICByZXR1cm4gbV9wRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiVFAiKSwgVEVYVFBPU19DQVBUSU9OKTsKKwordm9pZCBDUERGX0FwU2V0dGluZ3M6OkdldE9yaWdpbmFsQ29sb3IoaW50JiBpQ29sb3JUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZmNbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzRW50cnkpIGNvbnN0IHsKKyAgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9UUkFOU1BBUkVOVDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICBmY1tpXSA9IDA7CisgIH0KKyAgaWYgKCFtX3BEaWN0KSB7CisgICAgcmV0dXJuOworICB9CisgIENQREZfQXJyYXkqIHBFbnRyeSA9IG1fcERpY3QtPkdldEFycmF5KGNzRW50cnkpOworICBpZiAoIXBFbnRyeSkgeworICAgIHJldHVybjsKKyAgfQorICBGWF9EV09SRCBkd0NvdW50ID0gcEVudHJ5LT5HZXRDb3VudCgpOworICBpZiAoZHdDb3VudCA9PSAxKSB7CisgICAgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9HUkFZOworICAgIGZjWzBdID0gcEVudHJ5LT5HZXROdW1iZXIoMCk7CisgIH0gZWxzZSBpZiAoZHdDb3VudCA9PSAzKSB7CisgICAgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9SR0I7CisgICAgZmNbMF0gPSBwRW50cnktPkdldE51bWJlcigwKTsKKyAgICBmY1sxXSA9IHBFbnRyeS0+R2V0TnVtYmVyKDEpOworICAgIGZjWzJdID0gcEVudHJ5LT5HZXROdW1iZXIoMik7CisgIH0gZWxzZSBpZiAoZHdDb3VudCA9PSA0KSB7CisgICAgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9DTVlLOworICAgIGZjWzBdID0gcEVudHJ5LT5HZXROdW1iZXIoMCk7CisgICAgZmNbMV0gPSBwRW50cnktPkdldE51bWJlcigxKTsKKyAgICBmY1syXSA9IHBFbnRyeS0+R2V0TnVtYmVyKDIpOworICAgIGZjWzNdID0gcEVudHJ5LT5HZXROdW1iZXIoMyk7CisgIH0KK30KKworQ0ZYX1dpZGVTdHJpbmcgQ1BERl9BcFNldHRpbmdzOjpHZXRDYXB0aW9uKAorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NFbnRyeSkgY29uc3QgeworICByZXR1cm4gbV9wRGljdCA/IG1fcERpY3QtPkdldFVuaWNvZGVUZXh0KGNzRW50cnkpIDogQ0ZYX1dpZGVTdHJpbmcoKTsKK30KKworQ1BERl9TdHJlYW0qIENQREZfQXBTZXR0aW5nczo6R2V0SWNvbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzRW50cnkpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcERpY3QgPyBtX3BEaWN0LT5HZXRTdHJlYW0oY3NFbnRyeSkgOiBudWxscHRyOworfQorCitDUERGX0ljb25GaXQgQ1BERl9BcFNldHRpbmdzOjpHZXRJY29uRml0KCkgY29uc3QgeworICByZXR1cm4gbV9wRGljdCA/IG1fcERpY3QtPkdldERpY3QoIklGIikgOiBudWxscHRyOworfQorCitpbnQgQ1BERl9BcFNldHRpbmdzOjpHZXRUZXh0UG9zaXRpb24oKSBjb25zdCB7CisgIHJldHVybiBtX3BEaWN0ID8gbV9wRGljdC0+R2V0SW50ZWdlcigiVFAiLCBURVhUUE9TX0NBUFRJT04pIDogVEVYVFBPU19DQVBUSU9OOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfZm9ybWZpZWxkLmNwcCBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2Zvcm1maWVsZC5jcHAKaW5kZXggYTc3YmMyZi4uYjYyZjhiYSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfZm9ybWZpZWxkLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19mb3JtZmllbGQuY3BwCkBAIC0xLDExMDUgKzEsMTEwMSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9kb2MuaCIKICNpbmNsdWRlICJkb2NfdXRpbHMuaCIKIAotRlhfQk9PTCBQREZfRm9ybUZpZWxkX0lzVW5pc29uKENQREZfRm9ybUZpZWxkICpwRmllbGQpCi17Ci0gICAgRlhfQk9PTCBiVW5pc29uID0gRkFMU0U7Ci0gICAgaWYgKHBGaWVsZC0+R2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCkgewotICAgICAgICBiVW5pc29uID0gVFJVRTsKK0ZYX0JPT0wgUERGX0Zvcm1GaWVsZF9Jc1VuaXNvbihDUERGX0Zvcm1GaWVsZCogcEZpZWxkKSB7CisgIEZYX0JPT0wgYlVuaXNvbiA9IEZBTFNFOworICBpZiAocEZpZWxkLT5HZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94KSB7CisgICAgYlVuaXNvbiA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgRlhfRFdPUkQgZHdGbGFncyA9IHBGaWVsZC0+R2V0RmllbGRGbGFncygpOworICAgIGJVbmlzb24gPSAoKGR3RmxhZ3MgJiAweDIwMDAwMDApICE9IDApOworICB9CisgIHJldHVybiBiVW5pc29uOworfQorQ1BERl9Gb3JtRmllbGQ6OkNQREZfRm9ybUZpZWxkKENQREZfSW50ZXJGb3JtKiBwRm9ybSwgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgeworICBtX3BEaWN0ID0gcERpY3Q7CisgIG1fVHlwZSA9IFVua25vd247CisgIG1fcEZvcm0gPSBwRm9ybTsKKyAgbV9wRm9udCA9IE5VTEw7CisgIG1fRm9udFNpemUgPSAwOworICBTeW5jRmllbGRGbGFncygpOworfQorQ1BERl9Gb3JtRmllbGQ6On5DUERGX0Zvcm1GaWVsZCgpIHt9Cit2b2lkIENQREZfRm9ybUZpZWxkOjpTeW5jRmllbGRGbGFncygpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgdHlwZV9uYW1lID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkZUIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkZUIiktPkdldFN0cmluZygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENGWF9CeXRlU3RyaW5nKCk7CisgIEZYX0RXT1JEIGZsYWdzID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkZmIikKKyAgICAgICAgICAgICAgICAgICAgICAgPyBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiRmYiKS0+R2V0SW50ZWdlcigpCisgICAgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgbV9GbGFncyA9IDA7CisgIGlmIChmbGFncyAmIDEpIHsKKyAgICBtX0ZsYWdzIHw9IEZPUk1GSUVMRF9SRUFET05MWTsKKyAgfQorICBpZiAoZmxhZ3MgJiAyKSB7CisgICAgbV9GbGFncyB8PSBGT1JNRklFTERfUkVRVUlSRUQ7CisgIH0KKyAgaWYgKGZsYWdzICYgNCkgeworICAgIG1fRmxhZ3MgfD0gRk9STUZJRUxEX05PRVhQT1JUOworICB9CisgIGlmICh0eXBlX25hbWUgPT0gIkJ0biIpIHsKKyAgICBpZiAoZmxhZ3MgJiAweDgwMDApIHsKKyAgICAgIG1fVHlwZSA9IFJhZGlvQnV0dG9uOworICAgICAgaWYgKGZsYWdzICYgMHg0MDAwKSB7CisgICAgICAgIG1fRmxhZ3MgfD0gRk9STVJBRElPX05PVE9HR0xFT0ZGOworICAgICAgfQorICAgICAgaWYgKGZsYWdzICYgMHgyMDAwMDAwKSB7CisgICAgICAgIG1fRmxhZ3MgfD0gRk9STVJBRElPX1VOSVNPTjsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGZsYWdzICYgMHgxMDAwMCkgeworICAgICAgbV9UeXBlID0gUHVzaEJ1dHRvbjsKICAgICB9IGVsc2UgewotICAgICAgICBGWF9EV09SRCBkd0ZsYWdzID0gcEZpZWxkLT5HZXRGaWVsZEZsYWdzKCk7Ci0gICAgICAgIGJVbmlzb24gPSAoKGR3RmxhZ3MgJiAweDIwMDAwMDApICE9IDApOworICAgICAgbV9UeXBlID0gQ2hlY2tCb3g7CiAgICAgfQotICAgIHJldHVybiBiVW5pc29uOwotfQotQ1BERl9Gb3JtRmllbGQ6OkNQREZfRm9ybUZpZWxkKENQREZfSW50ZXJGb3JtKiBwRm9ybSwgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkKLXsKLSAgICBtX3BEaWN0ID0gcERpY3Q7Ci0gICAgbV9UeXBlID0gVW5rbm93bjsKLSAgICBtX3BGb3JtID0gcEZvcm07Ci0gICAgbV9wRm9udCA9IE5VTEw7Ci0gICAgbV9Gb250U2l6ZSA9IDA7Ci0gICAgU3luY0ZpZWxkRmxhZ3MoKTsKLX0KLUNQREZfRm9ybUZpZWxkOjp+Q1BERl9Gb3JtRmllbGQoKQotewotfQotdm9pZCBDUERGX0Zvcm1GaWVsZDo6U3luY0ZpZWxkRmxhZ3MoKQotewotICAgIENGWF9CeXRlU3RyaW5nIHR5cGVfbmFtZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJGVCIpID8gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkZUIiktPkdldFN0cmluZygpIDogQ0ZYX0J5dGVTdHJpbmcoKTsKLSAgICBGWF9EV09SRCBmbGFncyA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJGZiIpPyBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiRmYiKS0+R2V0SW50ZWdlcigpIDogMDsKLSAgICBtX0ZsYWdzID0gMDsKLSAgICBpZiAoZmxhZ3MgJiAxKSB7Ci0gICAgICAgIG1fRmxhZ3MgfD0gRk9STUZJRUxEX1JFQURPTkxZOwotICAgIH0KLSAgICBpZiAoZmxhZ3MgJiAyKSB7Ci0gICAgICAgIG1fRmxhZ3MgfD0gRk9STUZJRUxEX1JFUVVJUkVEOwotICAgIH0KLSAgICBpZiAoZmxhZ3MgJiA0KSB7Ci0gICAgICAgIG1fRmxhZ3MgfD0gRk9STUZJRUxEX05PRVhQT1JUOwotICAgIH0KLSAgICBpZiAodHlwZV9uYW1lID09ICJCdG4iKSB7Ci0gICAgICAgIGlmIChmbGFncyAmIDB4ODAwMCkgewotICAgICAgICAgICAgbV9UeXBlID0gUmFkaW9CdXR0b247Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgJiAweDQwMDApIHsKLSAgICAgICAgICAgICAgICBtX0ZsYWdzIHw9IEZPUk1SQURJT19OT1RPR0dMRU9GRjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmbGFncyAmIDB4MjAwMDAwMCkgewotICAgICAgICAgICAgICAgIG1fRmxhZ3MgfD0gRk9STVJBRElPX1VOSVNPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChmbGFncyAmIDB4MTAwMDApIHsKLSAgICAgICAgICAgIG1fVHlwZSA9IFB1c2hCdXR0b247Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX1R5cGUgPSBDaGVja0JveDsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZV9uYW1lID09ICJUeCIpIHsKLSAgICAgICAgaWYgKGZsYWdzICYgMHgxMDAwMDApIHsKLSAgICAgICAgICAgIG1fVHlwZSA9IEZpbGU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiAweDIwMDAwMDApIHsKLSAgICAgICAgICAgIG1fVHlwZSA9IFJpY2hUZXh0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9UeXBlID0gVGV4dDsKLSAgICAgICAgICAgIGlmIChmbGFncyAmIDB4MTAwMCkgewotICAgICAgICAgICAgICAgIG1fRmxhZ3MgfD0gRk9STVRFWFRfTVVMVElMSU5FOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZsYWdzICYgMHgyMDAwKSB7Ci0gICAgICAgICAgICAgICAgbV9GbGFncyB8PSBGT1JNVEVYVF9QQVNTV09SRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmbGFncyAmIDB4ODAwMDAwKSB7Ci0gICAgICAgICAgICAgICAgbV9GbGFncyB8PSBGT1JNVEVYVF9OT1NDUk9MTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmbGFncyAmIDB4MTAwMDAwKSB7Ci0gICAgICAgICAgICAgICAgbV9GbGFncyB8PSBGT1JNVEVYVF9DT01COwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIExvYWREQSgpOwotICAgIH0gZWxzZSBpZiAodHlwZV9uYW1lID09ICJDaCIpIHsKLSAgICAgICAgaWYgKGZsYWdzICYgMHgyMDAwMCkgewotICAgICAgICAgICAgbV9UeXBlID0gQ29tYm9Cb3g7Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgJiAweDQwMDAwKSB7Ci0gICAgICAgICAgICAgICAgbV9GbGFncyB8PSBGT1JNQ09NQk9fRURJVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fVHlwZSA9IExpc3RCb3g7Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgJiAweDIwMDAwMCkgewotICAgICAgICAgICAgICAgIG1fRmxhZ3MgfD0gRk9STUxJU1RfTVVMVElTRUxFQ1Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgTG9hZERBKCk7Ci0gICAgfSBlbHNlIGlmICh0eXBlX25hbWUgPT0gIlNpZyIpIHsKLSAgICAgICAgbV9UeXBlID0gU2lnbjsKLSAgICB9Ci19Ci1DRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0RnVsbE5hbWUoKQotewotICAgIHJldHVybiA6OkdldEZ1bGxOYW1lKG1fcERpY3QpOwotfQotRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6UmVzZXRGaWVsZChGWF9CT09MIGJOb3RpZnkpCi17Ci0gICAgc3dpdGNoIChtX1R5cGUpIHsKLSAgICAgICAgY2FzZSBDUERGX0Zvcm1GaWVsZDo6Q2hlY2tCb3g6Ci0gICAgICAgIGNhc2UgQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uOiB7Ci0gICAgICAgICAgICAgICAgQ0ZYX0J5dGVBcnJheSBzdGF0dXNBcnJheTsKLSAgICAgICAgICAgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgU2F2ZUNoZWNrZWRGaWVsZFN0YXR1cyh0aGlzLCBzdGF0dXNBcnJheSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludCBpQ291bnQgPSBDb3VudENvbnRyb2xzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGlDb3VudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoUERGX0Zvcm1GaWVsZF9Jc1VuaXNvbih0aGlzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tDb250cm9sKGksIEdldENvbnRyb2woaSktPklzRGVmYXVsdENoZWNrZWQoKSwgRkFMU0UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldENvbnRyb2woaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hlY2tlZCA9IHBDb250cm9sLT5Jc0RlZmF1bHRDaGVja2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tDb250cm9sKGksIGJDaGVja2VkLCBGQUxTRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyQ2hlY2tlZFN0YXR1c0NoYW5nZSh0aGlzLCBzdGF0dXNBcnJheSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1BERl9Gb3JtRmllbGQ6OkNvbWJvQm94OiB7Ci0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZTsKLSAgICAgICAgICAgICAgICBDbGVhclNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGludCBpSW5kZXggPSBHZXREZWZhdWx0U2VsZWN0ZWRJdGVtKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGlJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNzVmFsdWUgPSBHZXRPcHRpb25MYWJlbChpSW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVWYWx1ZUNoYW5nZSh0aGlzLCBjc1ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlSZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU2V0SXRlbVNlbGVjdGlvbihpSW5kZXgsIFRSVUUpOwotICAgICAgICAgICAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclZhbHVlQ2hhbmdlKHRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENQREZfRm9ybUZpZWxkOjpMaXN0Qm94OiB7Ci0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZTsKLSAgICAgICAgICAgICAgICBDbGVhclNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGludCBpSW5kZXggPSBHZXREZWZhdWx0U2VsZWN0ZWRJdGVtKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGlJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNzVmFsdWUgPSBHZXRPcHRpb25MYWJlbChpSW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVTZWxlY3Rpb25DaGFuZ2UodGhpcywgY3NWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpUmV0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNldEl0ZW1TZWxlY3Rpb24oaUluZGV4LCBUUlVFKTsKLSAgICAgICAgICAgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJTZWxlY3Rpb25DaGFuZ2UodGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1BERl9Gb3JtRmllbGQ6OlRleHQ6Ci0gICAgICAgIGNhc2UgQ1BERl9Gb3JtRmllbGQ6OlJpY2hUZXh0OgotICAgICAgICBjYXNlIENQREZfRm9ybUZpZWxkOjpGaWxlOgotICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBEViA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJEViIpOwotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzRFZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChwRFYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBjc0RWYWx1ZSA9IHBEVi0+R2V0VW5pY29kZVRleHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBWID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIlYiKTsKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc1ZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChwViAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNzVmFsdWUgPSBwVi0+R2V0VW5pY29kZVRleHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBSViA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJSViIpOwotICAgICAgICAgICAgICAgIGlmICghcFJWICYmIChjc0RWYWx1ZSA9PSBjc1ZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVZhbHVlQ2hhbmdlKHRoaXMsIGNzRFZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlSZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBEViA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcERpY3QtPlJlbW92ZUF0KCJWIik7Ci0gICAgICAgICAgICAgICAgICAgIG1fcERpY3QtPlJlbW92ZUF0KCJSViIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwQ2xvbmUgPSBwRFYtPkNsb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwQ2xvbmUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1fcERpY3QtPlNldEF0KCJWIiwgcENsb25lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYocFJWKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcENsb25lUiA9IHBEVi0+Q2xvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcERpY3QtPlNldEF0KCJSViIsIHBDbG9uZVIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclZhbHVlQ2hhbmdlKHRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLWludCBDUERGX0Zvcm1GaWVsZDo6R2V0Q29udHJvbEluZGV4KGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sKQotewotICAgIGlmIChwQ29udHJvbCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaW50IGlDb3VudCA9IG1fQ29udHJvbExpc3QuR2V0U2l6ZSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7Ci0gICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGaW5kID0gKENQREZfRm9ybUNvbnRyb2wqKW1fQ29udHJvbExpc3QuR2V0QXQoaSk7Ci0gICAgICAgIGlmIChwRmluZCA9PSBwQ29udHJvbCkgewotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotaW50IENQREZfRm9ybUZpZWxkOjpHZXRGaWVsZFR5cGUoKQotewotICAgIHN3aXRjaCAobV9UeXBlKSB7Ci0gICAgICAgIGNhc2UgUHVzaEJ1dHRvbjoKLSAgICAgICAgICAgIHJldHVybiBGSUVMRFRZUEVfUFVTSEJVVFRPTjsKLSAgICAgICAgY2FzZSBDaGVja0JveDoKLSAgICAgICAgICAgIHJldHVybiBGSUVMRFRZUEVfQ0hFQ0tCT1g7Ci0gICAgICAgIGNhc2UgUmFkaW9CdXR0b246Ci0gICAgICAgICAgICByZXR1cm4gRklFTERUWVBFX1JBRElPQlVUVE9OOwotICAgICAgICBjYXNlIENvbWJvQm94OgotICAgICAgICAgICAgcmV0dXJuIEZJRUxEVFlQRV9DT01CT0JPWDsKLSAgICAgICAgY2FzZSBMaXN0Qm94OgotICAgICAgICAgICAgcmV0dXJuIEZJRUxEVFlQRV9MSVNUQk9YOwotICAgICAgICBjYXNlIFRleHQ6Ci0gICAgICAgIGNhc2UgUmljaFRleHQ6Ci0gICAgICAgIGNhc2UgRmlsZToKLSAgICAgICAgICAgIHJldHVybiBGSUVMRFRZUEVfVEVYVEZJRUxEOwotICAgICAgICBjYXNlIFNpZ246Ci0gICAgICAgICAgICByZXR1cm4gRklFTERUWVBFX1NJR05BVFVSRTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gRklFTERUWVBFX1VOS05PV047Ci19Ci1DUERGX0FBY3Rpb24gQ1BERl9Gb3JtRmllbGQ6OkdldEFkZGl0aW9uYWxBY3Rpb24oKQotewotICAgIENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkFBIik7Ci0gICAgaWYgKHBPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIHBPYmotPkdldERpY3QoKTsKLX0KLUNGWF9XaWRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXRBbHRlcm5hdGVOYW1lKCkKLXsKLSAgICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJUVSIpOwotICAgIGlmIChwT2JqID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEwiIjsKLSAgICB9Ci0gICAgcmV0dXJuIHBPYmotPkdldFVuaWNvZGVUZXh0KCk7Ci19Ci1DRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0TWFwcGluZ05hbWUoKQotewotICAgIENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIlRNIik7Ci0gICAgaWYgKHBPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTCIiOwotICAgIH0KLSAgICByZXR1cm4gcE9iai0+R2V0VW5pY29kZVRleHQoKTsKLX0KLUZYX0RXT1JEIENQREZfRm9ybUZpZWxkOjpHZXRGaWVsZEZsYWdzKCkKLXsKLSAgICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJGZiIpOwotICAgIGlmIChwT2JqID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBwT2JqLT5HZXRJbnRlZ2VyKCk7Ci19Ci1DRlhfQnl0ZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0RGVmYXVsdFN0eWxlKCkKLXsKLSAgICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJEUyIpOwotICAgIGlmIChwT2JqID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuICIiOwotICAgIH0KLSAgICByZXR1cm4gcE9iai0+R2V0U3RyaW5nKCk7Ci19Ci1DRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0UmljaFRleHRTdHJpbmcoKQotewotICAgIENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIlJWIik7Ci0gICAgaWYgKHBPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTCIiOwotICAgIH0KLSAgICByZXR1cm4gcE9iai0+R2V0VW5pY29kZVRleHQoKTsKLX0KLUNGWF9XaWRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXRWYWx1ZShGWF9CT09MIGJEZWZhdWx0KQotewotICAgIGlmIChHZXRUeXBlKCkgPT0gQ2hlY2tCb3ggfHwgR2V0VHlwZSgpID09IFJhZGlvQnV0dG9uKSB7Ci0gICAgICAgIHJldHVybiBHZXRDaGVja1ZhbHVlKGJEZWZhdWx0KTsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsIGJEZWZhdWx0ID8gIkRWIiA6ICJWIik7Ci0gICAgaWYgKHBWYWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgIGlmICghYkRlZmF1bHQpIHsKLSAgICAgICAgICAgIGlmIChtX1R5cGUgPT0gUmljaFRleHQpIHsKLSAgICAgICAgICAgICAgICBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiViIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBWYWx1ZSA9PSBOVUxMICYmIG1fVHlwZSAhPSBUZXh0KSB7Ci0gICAgICAgICAgICAgICAgcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkRWIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBWYWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBzd2l0Y2ggKHBWYWx1ZS0+R2V0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgUERGT0JKX1NUUklORzoKLSAgICAgICAgY2FzZSBQREZPQkpfU1RSRUFNOgotICAgICAgICAgICAgcmV0dXJuIHBWYWx1ZS0+R2V0VW5pY29kZVRleHQoKTsKLSAgICAgICAgY2FzZSBQREZPQkpfQVJSQVk6Ci0gICAgICAgICAgICBwVmFsdWUgPSAoKENQREZfQXJyYXkqKXBWYWx1ZSktPkdldEVsZW1lbnRWYWx1ZSgwKTsKLSAgICAgICAgICAgIGlmIChwVmFsdWUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcFZhbHVlLT5HZXRVbmljb2RlVGV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotfQotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldFZhbHVlKCkKLXsKLSAgICByZXR1cm4gR2V0VmFsdWUoRkFMU0UpOwotfQotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldERlZmF1bHRWYWx1ZSgpCi17Ci0gICAgcmV0dXJuIEdldFZhbHVlKFRSVUUpOwotfQotRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6U2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBGWF9CT09MIGJEZWZhdWx0LCBGWF9CT09MIGJOb3RpZnkpCi17Ci0gICAgc3dpdGNoIChtX1R5cGUpIHsKLSAgICAgICAgY2FzZSBDaGVja0JveDoKLSAgICAgICAgY2FzZSBSYWRpb0J1dHRvbjogewotICAgICAgICAgICAgICAgIFNldENoZWNrVmFsdWUodmFsdWUsIGJEZWZhdWx0LCBiTm90aWZ5KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGaWxlOgotICAgICAgICBjYXNlIFJpY2hUZXh0OgotICAgICAgICBjYXNlIFRleHQ6Ci0gICAgICAgIGNhc2UgQ29tYm9Cb3g6IHsKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc1ZhbHVlID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgY3NWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpUmV0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludCBpSW5kZXggPSBGaW5kT3B0aW9uVmFsdWUoY3NWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNFbmNvZGVUZXh0ID0gUERGX0VuY29kZVRleHQoY3NWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1fcERpY3QtPlNldEF0U3RyaW5nKGJEZWZhdWx0ID8gIkRWIiA6ICJWIiwgYnNFbmNvZGVUZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fVHlwZSA9PSBSaWNoVGV4dCAmJiAhYkRlZmF1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcERpY3QtPlNldEF0U3RyaW5nKCJSViIsIGJzRW5jb2RlVGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbV9wRGljdC0+UmVtb3ZlQXQoIkkiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtX3BEaWN0LT5TZXRBdFN0cmluZyhiRGVmYXVsdCA/ICJEViIgOiAiViIsIFBERl9FbmNvZGVUZXh0KGNzVmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJEZWZhdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGVhclNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgU2V0SXRlbVNlbGVjdGlvbihpSW5kZXgsIFRSVUUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclZhbHVlQ2hhbmdlKHRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExpc3RCb3g6IHsKLSAgICAgICAgICAgICAgICBpbnQgaUluZGV4ID0gRmluZE9wdGlvblZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZiAoaUluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChiRGVmYXVsdCAmJiBpSW5kZXggPT0gR2V0RGVmYXVsdFNlbGVjdGVkSXRlbSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzVmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVTZWxlY3Rpb25DaGFuZ2UodGhpcywgY3NWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpUmV0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChiRGVmYXVsdCkgewotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIENsZWFyU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIFNldEl0ZW1TZWxlY3Rpb24oaUluZGV4LCBUUlVFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyU2VsZWN0aW9uQ2hhbmdlKHRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoQ1BERl9JbnRlckZvcm06Om1fYlVwZGF0ZUFQKSB7Ci0gICAgICAgIFVwZGF0ZUFQKE5VTEwpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OlNldFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSwgRlhfQk9PTCBiTm90aWZ5KQotewotICAgIHJldHVybiBTZXRWYWx1ZSh2YWx1ZSwgRkFMU0UsIGJOb3RpZnkpOwotfQotaW50IENQREZfRm9ybUZpZWxkOjpHZXRNYXhMZW4oKQotewotICAgIENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIk1heExlbiIpOwotICAgIGlmIChwT2JqID09IE5VTEwpIHsKLSAgICAgICAgaW50IGlDb3VudCA9IG1fQ29udHJvbExpc3QuR2V0U2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewotICAgICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSAoQ1BERl9Gb3JtQ29udHJvbCopbV9Db250cm9sTGlzdC5HZXRBdChpKTsKLSAgICAgICAgICAgIGlmIChwQ29udHJvbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBXaWRnZXREaWN0ID0gcENvbnRyb2wtPm1fcFdpZGdldERpY3Q7Ci0gICAgICAgICAgICBpZiAocFdpZGdldERpY3QtPktleUV4aXN0KCJNYXhMZW4iKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBwV2lkZ2V0RGljdC0+R2V0SW50ZWdlcigiTWF4TGVuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBwT2JqLT5HZXRJbnRlZ2VyKCk7Ci19Ci1pbnQgQ1BERl9Gb3JtRmllbGQ6OkNvdW50U2VsZWN0ZWRJdGVtcygpCi17Ci0gICAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJWIik7Ci0gICAgaWYgKHBWYWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJJIik7Ci0gICAgICAgIGlmIChwVmFsdWUgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcpIHsKLSAgICAgICAgaWYgKHBWYWx1ZS0+R2V0U3RyaW5nKCkuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIpIHsKLSAgICAgICAgaWYgKHBWYWx1ZS0+R2V0U3RyaW5nKCkuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuICgoQ1BERl9BcnJheSopcFZhbHVlKS0+R2V0Q291bnQoKTsKLX0KLWludCBDUERGX0Zvcm1GaWVsZDo6R2V0U2VsZWN0ZWRJbmRleChpbnQgaW5kZXgpCi17Ci0gICAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJWIik7Ci0gICAgaWYgKHBWYWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJJIik7Ci0gICAgICAgIGlmIChwVmFsdWUgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQotICAgIENGWF9XaWRlU3RyaW5nIHNlbF92YWx1ZTsKLSAgICBpZiAocFZhbHVlLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUklORykgewotICAgICAgICBpZiAoaW5kZXggIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHNlbF92YWx1ZSA9IHBWYWx1ZS0+R2V0VW5pY29kZVRleHQoKTsKLSAgICB9IGVsc2UgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIpIHsKLSAgICAgICAgcmV0dXJuIHBWYWx1ZS0+R2V0SW50ZWdlcigpOworICB9IGVsc2UgaWYgKHR5cGVfbmFtZSA9PSAiVHgiKSB7CisgICAgaWYgKGZsYWdzICYgMHgxMDAwMDApIHsKKyAgICAgIG1fVHlwZSA9IEZpbGU7CisgICAgfSBlbHNlIGlmIChmbGFncyAmIDB4MjAwMDAwMCkgeworICAgICAgbV9UeXBlID0gUmljaFRleHQ7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBDUERGX09iamVjdCogZWxlbWVudFZhbHVlID0gKChDUERGX0FycmF5KilwVmFsdWUpLT5HZXRFbGVtZW50VmFsdWUoaW5kZXgpOwotICAgICAgICBzZWxfdmFsdWUgPSBlbGVtZW50VmFsdWUgPyBlbGVtZW50VmFsdWUtPkdldFVuaWNvZGVUZXh0KCkgOiBDRlhfV2lkZVN0cmluZygpOworICAgICAgbV9UeXBlID0gVGV4dDsKKyAgICAgIGlmIChmbGFncyAmIDB4MTAwMCkgeworICAgICAgICBtX0ZsYWdzIHw9IEZPUk1URVhUX01VTFRJTElORTsKKyAgICAgIH0KKyAgICAgIGlmIChmbGFncyAmIDB4MjAwMCkgeworICAgICAgICBtX0ZsYWdzIHw9IEZPUk1URVhUX1BBU1NXT1JEOworICAgICAgfQorICAgICAgaWYgKGZsYWdzICYgMHg4MDAwMDApIHsKKyAgICAgICAgbV9GbGFncyB8PSBGT1JNVEVYVF9OT1NDUk9MTDsKKyAgICAgIH0KKyAgICAgIGlmIChmbGFncyAmIDB4MTAwMDAwKSB7CisgICAgICAgIG1fRmxhZ3MgfD0gRk9STVRFWFRfQ09NQjsKKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKGluZGV4IDwgQ291bnRTZWxlY3RlZE9wdGlvbnMoKSkgewotICAgICAgICBpbnQgaU9wdEluZGV4ID0gR2V0U2VsZWN0ZWRPcHRpb25JbmRleChpbmRleCk7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIGNzT3B0ID0gR2V0T3B0aW9uVmFsdWUoaU9wdEluZGV4KTsKLSAgICAgICAgaWYgKGNzT3B0ID09IHNlbF92YWx1ZSkgewotICAgICAgICAgICAgcmV0dXJuIGlPcHRJbmRleDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpbnQgbk9wdHMgPSBDb3VudE9wdGlvbnMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5PcHRzOyBpICsrKSB7Ci0gICAgICAgIGlmIChzZWxfdmFsdWUgPT0gR2V0T3B0aW9uVmFsdWUoaSkpIHsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLUZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OkNsZWFyU2VsZWN0aW9uKEZYX0JPT0wgYk5vdGlmeSkKLXsKLSAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKLSAgICAgICAgaW50IGlSZXQgPSAwOwotICAgICAgICBDRlhfV2lkZVN0cmluZyBjc1ZhbHVlOwotICAgICAgICBpbnQgaUluZGV4ID0gR2V0U2VsZWN0ZWRJbmRleCgwKTsKLSAgICAgICAgaWYgKGlJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBjc1ZhbHVlID0gR2V0T3B0aW9uTGFiZWwoaUluZGV4KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoR2V0VHlwZSgpID09IExpc3RCb3gpIHsKLSAgICAgICAgICAgIGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVTZWxlY3Rpb25DaGFuZ2UodGhpcywgY3NWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEdldFR5cGUoKSA9PSBDb21ib0JveCkgewotICAgICAgICAgICAgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVZhbHVlQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpUmV0IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIG1fcERpY3QtPlJlbW92ZUF0KCJWIik7Ci0gICAgbV9wRGljdC0+UmVtb3ZlQXQoIkkiKTsKLSAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKEdldFR5cGUoKSA9PSBMaXN0Qm94KSB7Ci0gICAgICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclNlbGVjdGlvbkNoYW5nZSh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoR2V0VHlwZSgpID09IENvbWJvQm94KSB7Ci0gICAgICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclZhbHVlQ2hhbmdlKHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChDUERGX0ludGVyRm9ybTo6bV9iVXBkYXRlQVApIHsKLSAgICAgICAgVXBkYXRlQVAoTlVMTCk7Ci0gICAgfQotICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSBUUlVFOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6SXNJdGVtU2VsZWN0ZWQoaW50IGluZGV4KQotewotICAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ29tYm9Cb3ggfHwgR2V0VHlwZSgpID09IExpc3RCb3gpOwotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQ291bnRPcHRpb25zKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoSXNPcHRpb25TZWxlY3RlZChpbmRleCkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIENGWF9XaWRlU3RyaW5nIG9wdF92YWx1ZSA9IEdldE9wdGlvblZhbHVlKGluZGV4KTsKLSAgICBDUERGX09iamVjdCogcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIlYiKTsKLSAgICBpZiAocFZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkkiKTsKLSAgICAgICAgaWYgKHBWYWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcpIHsKLSAgICAgICAgaWYgKHBWYWx1ZS0+R2V0VW5pY29kZVRleHQoKSA9PSBvcHRfdmFsdWUpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpID09IFBERk9CSl9OVU1CRVIpIHsKLSAgICAgICAgaWYgKHBWYWx1ZS0+R2V0U3RyaW5nKCkuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBWYWx1ZS0+R2V0SW50ZWdlcigpID09IGluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChwVmFsdWUtPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcFZhbHVlOwotICAgIGludCBpUG9zID0gLTE7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBDb3VudFNlbGVjdGVkT3B0aW9ucygpOyBqICsrKSB7Ci0gICAgICAgIGlmIChHZXRTZWxlY3RlZE9wdGlvbkluZGV4KGopID09IGluZGV4KSB7Ci0gICAgICAgICAgICBpUG9zID0gajsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwQXJyYXktPkdldENvdW50KCk7IGkgKyspCi0gICAgICAgIGlmIChwQXJyYXktPkdldEVsZW1lbnRWYWx1ZShpKS0+R2V0VW5pY29kZVRleHQoKSA9PSBvcHRfdmFsdWUgJiYgKGludClpID09IGlQb3MpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6U2V0SXRlbVNlbGVjdGlvbihpbnQgaW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkLCBGWF9CT09MIGJOb3RpZnkpCi17Ci0gICAgQVNTRVJUKEdldFR5cGUoKSA9PSBDb21ib0JveCB8fCBHZXRUeXBlKCkgPT0gTGlzdEJveCk7Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBDb3VudE9wdGlvbnMoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENGWF9XaWRlU3RyaW5nIG9wdF92YWx1ZSA9IEdldE9wdGlvblZhbHVlKGluZGV4KTsKLSAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKLSAgICAgICAgaW50IGlSZXQgPSAwOwotICAgICAgICBpZiAoR2V0VHlwZSgpID09IExpc3RCb3gpIHsKLSAgICAgICAgICAgIGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVTZWxlY3Rpb25DaGFuZ2UodGhpcywgb3B0X3ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoR2V0VHlwZSgpID09IENvbWJvQm94KSB7Ci0gICAgICAgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgb3B0X3ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaVJldCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIWJTZWxlY3RlZCkgewotICAgICAgICBDUERGX09iamVjdCogcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIlYiKTsKLSAgICAgICAgaWYgKHBWYWx1ZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAobV9UeXBlID09IExpc3RCb3gpIHsKLSAgICAgICAgICAgICAgICBTZWxlY3RPcHRpb24oaW5kZXgsIEZBTFNFKTsKLSAgICAgICAgICAgICAgICBpZiAocFZhbHVlLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUklORykgewotICAgICAgICAgICAgICAgICAgICBpZiAocFZhbHVlLT5HZXRVbmljb2RlVGV4dCgpID09IG9wdF92YWx1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGljdC0+UmVtb3ZlQXQoIlYiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocFZhbHVlLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSA9IENQREZfQXJyYXk6OkNyZWF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocEFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbnQgaUNvdW50ID0gQ291bnRPcHRpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSBpbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJc0l0ZW1TZWxlY3RlZChpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfdmFsdWUgPSBHZXRPcHRpb25WYWx1ZShpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFycmF5LT5BZGRTdHJpbmcoUERGX0VuY29kZVRleHQob3B0X3ZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwQXJyYXktPkdldENvdW50KCkgPCAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQXJyYXktPlJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcERpY3QtPlNldEF0KCJWIiwgcEFycmF5KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobV9UeXBlID09IENvbWJvQm94KSB7Ci0gICAgICAgICAgICAgICAgbV9wRGljdC0+UmVtb3ZlQXQoIlYiKTsKLSAgICAgICAgICAgICAgICBtX3BEaWN0LT5SZW1vdmVBdCgiSSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgTG9hZERBKCk7CisgIH0gZWxzZSBpZiAodHlwZV9uYW1lID09ICJDaCIpIHsKKyAgICBpZiAoZmxhZ3MgJiAweDIwMDAwKSB7CisgICAgICBtX1R5cGUgPSBDb21ib0JveDsKKyAgICAgIGlmIChmbGFncyAmIDB4NDAwMDApIHsKKyAgICAgICAgbV9GbGFncyB8PSBGT1JNQ09NQk9fRURJVDsKKyAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBpZiAobV9UeXBlID09IExpc3RCb3gpIHsKLSAgICAgICAgICAgIFNlbGVjdE9wdGlvbihpbmRleCwgVFJVRSk7Ci0gICAgICAgICAgICBpZiAoIShtX0ZsYWdzICYgRk9STUxJU1RfTVVMVElTRUxFQ1QpKSB7Ci0gICAgICAgICAgICAgICAgbV9wRGljdC0+U2V0QXRTdHJpbmcoIlYiLCBQREZfRW5jb2RlVGV4dChvcHRfdmFsdWUpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gQ1BERl9BcnJheTo6Q3JlYXRlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhfQk9PTCBiU2VsZWN0ZWQ7Ci0gICAgICAgICAgICAgICAgaW50IGlDb3VudCA9IENvdW50T3B0aW9ucygpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpICE9IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiU2VsZWN0ZWQgPSBJc0l0ZW1TZWxlY3RlZChpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJTZWxlY3RlZCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJTZWxlY3RlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3B0X3ZhbHVlID0gR2V0T3B0aW9uVmFsdWUoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQXJyYXktPkFkZFN0cmluZyhQREZfRW5jb2RlVGV4dChvcHRfdmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX3BEaWN0LT5TZXRBdCgiViIsIHBBcnJheSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobV9UeXBlID09IENvbWJvQm94KSB7Ci0gICAgICAgICAgICBtX3BEaWN0LT5TZXRBdFN0cmluZygiViIsIFBERl9FbmNvZGVUZXh0KG9wdF92YWx1ZSkpOwotICAgICAgICAgICAgQ1BERl9BcnJheSogcEkgPSBDUERGX0FycmF5OjpDcmVhdGUoKTsKLSAgICAgICAgICAgIGlmIChwSSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEktPkFkZEludGVnZXIoaW5kZXgpOwotICAgICAgICAgICAgbV9wRGljdC0+U2V0QXQoIkkiLCBwSSk7Ci0gICAgICAgIH0KKyAgICAgIG1fVHlwZSA9IExpc3RCb3g7CisgICAgICBpZiAoZmxhZ3MgJiAweDIwMDAwMCkgeworICAgICAgICBtX0ZsYWdzIHw9IEZPUk1MSVNUX01VTFRJU0VMRUNUOworICAgICAgfQogICAgIH0KLSAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKEdldFR5cGUoKSA9PSBMaXN0Qm94KSB7Ci0gICAgICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclNlbGVjdGlvbkNoYW5nZSh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoR2V0VHlwZSgpID09IENvbWJvQm94KSB7Ci0gICAgICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclZhbHVlQ2hhbmdlKHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChDUERGX0ludGVyRm9ybTo6bV9iVXBkYXRlQVApIHsKLSAgICAgICAgVXBkYXRlQVAoTlVMTCk7Ci0gICAgfQotICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSBUUlVFOwotICAgIHJldHVybiBUUlVFOworICAgIExvYWREQSgpOworICB9IGVsc2UgaWYgKHR5cGVfbmFtZSA9PSAiU2lnIikgeworICAgIG1fVHlwZSA9IFNpZ247CisgIH0KIH0KLUZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OklzSXRlbURlZmF1bHRTZWxlY3RlZChpbnQgaW5kZXgpCi17Ci0gICAgQVNTRVJUKEdldFR5cGUoKSA9PSBDb21ib0JveCB8fCBHZXRUeXBlKCkgPT0gTGlzdEJveCk7Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBDb3VudE9wdGlvbnMoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGludCBpRFZJbmRleCA9IEdldERlZmF1bHRTZWxlY3RlZEl0ZW0oKTsKLSAgICBpZiAoaURWSW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIChpRFZJbmRleCA9PSBpbmRleCk7CitDRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0RnVsbE5hbWUoKSB7CisgIHJldHVybiA6OkdldEZ1bGxOYW1lKG1fcERpY3QpOwogfQotaW50IENQREZfRm9ybUZpZWxkOjpHZXREZWZhdWx0U2VsZWN0ZWRJdGVtKCkKLXsKLSAgICBBU1NFUlQoR2V0VHlwZSgpID09IENvbWJvQm94IHx8IEdldFR5cGUoKSA9PSBMaXN0Qm94KTsKLSAgICBDUERGX09iamVjdCogcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkRWIik7Ci0gICAgaWYgKHBWYWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgY3NEViA9IHBWYWx1ZS0+R2V0VW5pY29kZVRleHQoKTsKLSAgICBpZiAoY3NEVi5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpbnQgaUNvdW50ID0gQ291bnRPcHRpb25zKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsKLSAgICAgICAgaWYgKGNzRFYgPT0gR2V0T3B0aW9uVmFsdWUoaSkpIHsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLXZvaWQgQ1BERl9Gb3JtRmllbGQ6OlVwZGF0ZUFQKENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sKQotewotICAgIGlmIChtX1R5cGUgPT0gUHVzaEJ1dHRvbikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtX1R5cGUgPT0gUmFkaW9CdXR0b24gfHwgbV9UeXBlID09IENoZWNrQm94KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCFtX3BGb3JtLT5tX2JHZW5lcmF0ZUFQKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBDb3VudENvbnRyb2xzKCk7IGkgKyspIHsKLSAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBHZXRDb250cm9sKGkpOwotICAgICAgICBGUERGX0dlbmVyYXRlQVAobV9wRm9ybS0+bV9wRG9jdW1lbnQsIHBDb250cm9sLT5tX3BXaWRnZXREaWN0KTsKLSAgICB9Ci19Ci1pbnQgQ1BERl9Gb3JtRmllbGQ6OkNvdW50T3B0aW9ucygpCi17Ci0gICAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJPcHQiKTsKLSAgICBpZiAocFZhbHVlID09IE5VTEwgfHwgcFZhbHVlLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gKChDUERGX0FycmF5KilwVmFsdWUpLT5HZXRDb3VudCgpOwotfQotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldE9wdGlvblRleHQoaW50IGluZGV4LCBpbnQgc3ViX2luZGV4KQotewotICAgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiT3B0Iik7Ci0gICAgaWYgKHBWYWx1ZSA9PSBOVUxMIHx8IHBWYWx1ZS0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBPcHRpb24gPSAoKENQREZfQXJyYXkqKXBWYWx1ZSktPkdldEVsZW1lbnRWYWx1ZShpbmRleCk7Ci0gICAgaWYgKHBPcHRpb24gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgICB9Ci0gICAgaWYgKHBPcHRpb24tPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgcE9wdGlvbiA9ICgoQ1BERl9BcnJheSopcE9wdGlvbiktPkdldEVsZW1lbnRWYWx1ZShzdWJfaW5kZXgpOwotICAgIH0KLSAgICBpZiAocE9wdGlvbiA9PSBOVUxMIHx8IHBPcHRpb24tPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSSU5HKSB7Ci0gICAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gKChDUERGX1N0cmluZyopcE9wdGlvbiktPkdldFVuaWNvZGVUZXh0KCk7Ci19Ci1DRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0T3B0aW9uTGFiZWwoaW50IGluZGV4KQotewotICAgIHJldHVybiBHZXRPcHRpb25UZXh0KGluZGV4LCAxKTsKLX0KLUNGWF9XaWRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXRPcHRpb25WYWx1ZShpbnQgaW5kZXgpCi17Ci0gICAgcmV0dXJuIEdldE9wdGlvblRleHQoaW5kZXgsIDApOwotfQotaW50IENQREZfRm9ybUZpZWxkOjpGaW5kT3B0aW9uKENGWF9XaWRlU3RyaW5nIGNzT3B0TGFiZWwpCi17Ci0gICAgaW50IGlDb3VudCA9IENvdW50T3B0aW9ucygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIGNzVmFsdWUgPSBHZXRPcHRpb25WYWx1ZShpKTsKLSAgICAgICAgaWYgKGNzVmFsdWUgPT0gY3NPcHRMYWJlbCkgewotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotaW50IENQREZfRm9ybUZpZWxkOjpGaW5kT3B0aW9uVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzT3B0VmFsdWUsIGludCBpU3RhcnRJbmRleCkKLXsKLSAgICBpZiAoaVN0YXJ0SW5kZXggPCAwKSB7Ci0gICAgICAgIGlTdGFydEluZGV4ID0gMDsKLSAgICB9Ci0gICAgaW50IGlDb3VudCA9IENvdW50T3B0aW9ucygpOwotICAgIGZvciAoOyBpU3RhcnRJbmRleCA8IGlDb3VudDsgaVN0YXJ0SW5kZXggKyspIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZSA9IEdldE9wdGlvblZhbHVlKGlTdGFydEluZGV4KTsKLSAgICAgICAgaWYgKGNzVmFsdWUgPT0gY3NPcHRWYWx1ZSkgewotICAgICAgICAgICAgcmV0dXJuIGlTdGFydEluZGV4OwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLUZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQ29udHJvbChpbnQgaUNvbnRyb2xJbmRleCwgRlhfQk9PTCBiQ2hlY2tlZCwgRlhfQk9PTCBiTm90aWZ5KQotewotICAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ2hlY2tCb3ggfHwgR2V0VHlwZSgpID09IFJhZGlvQnV0dG9uKTsKLSAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldENvbnRyb2woaUNvbnRyb2xJbmRleCk7Ci0gICAgaWYgKHBDb250cm9sID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoIWJDaGVja2VkICYmIHBDb250cm9sLT5Jc0NoZWNrZWQoKSA9PSBiQ2hlY2tlZCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENGWF9CeXRlQXJyYXkgc3RhdHVzQXJyYXk7Ci0gICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CitGWF9CT09MIENQREZfRm9ybUZpZWxkOjpSZXNldEZpZWxkKEZYX0JPT0wgYk5vdGlmeSkgeworICBzd2l0Y2ggKG1fVHlwZSkgeworICAgIGNhc2UgQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94OgorICAgIGNhc2UgQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uOiB7CisgICAgICBDRlhfQnl0ZUFycmF5IHN0YXR1c0FycmF5OworICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSkgewogICAgICAgICBTYXZlQ2hlY2tlZEZpZWxkU3RhdHVzKHRoaXMsIHN0YXR1c0FycmF5KTsKLSAgICB9Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgY3NXRXhwb3J0ID0gcENvbnRyb2wtPkdldEV4cG9ydFZhbHVlKCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NCRXhwb3J0ID0gUERGX0VuY29kZVRleHQoY3NXRXhwb3J0KTsKLSAgICBpbnQgaUNvdW50ID0gQ291bnRDb250cm9scygpOwotICAgIEZYX0JPT0wgYlVuaXNvbiA9IFBERl9Gb3JtRmllbGRfSXNVbmlzb24odGhpcyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsKLSAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEN0cmwgPSBHZXRDb250cm9sKGkpOwotICAgICAgICBpZiAoYlVuaXNvbikgewotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NFVmFsdWUgPSBwQ3RybC0+R2V0RXhwb3J0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChjc0VWYWx1ZSA9PSBjc1dFeHBvcnQpIHsKLSAgICAgICAgICAgICAgICBpZiAocEN0cmwtPkdldE9uU3RhdGVOYW1lKCkgPT0gcENvbnRyb2wtPkdldE9uU3RhdGVOYW1lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcEN0cmwtPkNoZWNrQ29udHJvbChiQ2hlY2tlZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiQ2hlY2tlZCkgewotICAgICAgICAgICAgICAgICAgICBwQ3RybC0+Q2hlY2tDb250cm9sKEZBTFNFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGJDaGVja2VkKSB7Ci0gICAgICAgICAgICAgICAgcEN0cmwtPkNoZWNrQ29udHJvbChGQUxTRSk7Ci0gICAgICAgICAgICB9CisgICAgICB9CisgICAgICBpbnQgaUNvdW50ID0gQ291bnRDb250cm9scygpOworICAgICAgaWYgKGlDb3VudCkgeworICAgICAgICBpZiAoUERGX0Zvcm1GaWVsZF9Jc1VuaXNvbih0aGlzKSkgeworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIENoZWNrQ29udHJvbChpLCBHZXRDb250cm9sKGkpLT5Jc0RlZmF1bHRDaGVja2VkKCksIEZBTFNFKTsKKyAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoaSA9PSBpQ29udHJvbEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgcEN0cmwtPkNoZWNrQ29udHJvbChiQ2hlY2tlZCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGJDaGVja2VkKSB7Ci0gICAgICAgICAgICAgICAgcEN0cmwtPkNoZWNrQ29udHJvbChGQUxTRSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBHZXRDb250cm9sKGkpOworICAgICAgICAgICAgRlhfQk9PTCBiQ2hlY2tlZCA9IHBDb250cm9sLT5Jc0RlZmF1bHRDaGVja2VkKCk7CisgICAgICAgICAgICBDaGVja0NvbnRyb2woaSwgYkNoZWNrZWQsIEZBTFNFKTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBPcHQgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiT3B0Iik7Ci0gICAgaWYgKHBPcHQgPT0gTlVMTCB8fCBwT3B0LT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIGlmIChiQ2hlY2tlZCkgewotICAgICAgICAgICAgbV9wRGljdC0+U2V0QXROYW1lKCJWIiwgY3NCRXhwb3J0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNzVjsKLSAgICAgICAgICAgIENQREZfT2JqZWN0KiBwViA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJWIik7Ci0gICAgICAgICAgICBpZiAocFYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGNzViA9IHBWLT5HZXRTdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjc1YgPT0gY3NCRXhwb3J0KSB7Ci0gICAgICAgICAgICAgICAgbV9wRGljdC0+U2V0QXROYW1lKCJWIiwgIk9mZiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChiQ2hlY2tlZCkgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBjc0luZGV4OwotICAgICAgICBjc0luZGV4LkZvcm1hdCgiJWQiLCBpQ29udHJvbEluZGV4KTsKLSAgICAgICAgbV9wRGljdC0+U2V0QXROYW1lKCJWIiwgY3NJbmRleCk7Ci0gICAgfQotICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgeworICAgICAgfQorICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSkgewogICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlckNoZWNrZWRTdGF0dXNDaGFuZ2UodGhpcywgc3RhdHVzQXJyYXkpOwotICAgIH0KLSAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgQ1BERl9Gb3JtRmllbGQ6OkNvbWJvQm94OiB7CisgICAgICBDRlhfV2lkZVN0cmluZyBjc1ZhbHVlOworICAgICAgQ2xlYXJTZWxlY3Rpb24oKTsKKyAgICAgIGludCBpSW5kZXggPSBHZXREZWZhdWx0U2VsZWN0ZWRJdGVtKCk7CisgICAgICBpZiAoaUluZGV4ID49IDApIHsKKyAgICAgICAgY3NWYWx1ZSA9IEdldE9wdGlvbkxhYmVsKGlJbmRleCk7CisgICAgICB9CisgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5KSB7CisgICAgICAgIGludCBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgY3NWYWx1ZSk7CisgICAgICAgIGlmIChpUmV0IDwgMCkgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgU2V0SXRlbVNlbGVjdGlvbihpSW5kZXgsIFRSVUUpOworICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSkgeworICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclZhbHVlQ2hhbmdlKHRoaXMpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBDUERGX0Zvcm1GaWVsZDo6TGlzdEJveDogeworICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZTsKKyAgICAgIENsZWFyU2VsZWN0aW9uKCk7CisgICAgICBpbnQgaUluZGV4ID0gR2V0RGVmYXVsdFNlbGVjdGVkSXRlbSgpOworICAgICAgaWYgKGlJbmRleCA+PSAwKSB7CisgICAgICAgIGNzVmFsdWUgPSBHZXRPcHRpb25MYWJlbChpSW5kZXgpOworICAgICAgfQorICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSkgeworICAgICAgICBpbnQgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVNlbGVjdGlvbkNoYW5nZSh0aGlzLCBjc1ZhbHVlKTsKKyAgICAgICAgaWYgKGlSZXQgPCAwKSB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICB9CisgICAgICBTZXRJdGVtU2VsZWN0aW9uKGlJbmRleCwgVFJVRSk7CisgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5KSB7CisgICAgICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyU2VsZWN0aW9uQ2hhbmdlKHRoaXMpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBDUERGX0Zvcm1GaWVsZDo6VGV4dDoKKyAgICBjYXNlIENQREZfRm9ybUZpZWxkOjpSaWNoVGV4dDoKKyAgICBjYXNlIENQREZfRm9ybUZpZWxkOjpGaWxlOgorICAgIGRlZmF1bHQ6IHsKKyAgICAgIENQREZfT2JqZWN0KiBwRFYgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiRFYiKTsKKyAgICAgIENGWF9XaWRlU3RyaW5nIGNzRFZhbHVlOworICAgICAgaWYgKHBEVikgeworICAgICAgICBjc0RWYWx1ZSA9IHBEVi0+R2V0VW5pY29kZVRleHQoKTsKKyAgICAgIH0KKyAgICAgIENQREZfT2JqZWN0KiBwViA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJWIik7CisgICAgICBDRlhfV2lkZVN0cmluZyBjc1ZhbHVlOworICAgICAgaWYgKHBWKSB7CisgICAgICAgIGNzVmFsdWUgPSBwVi0+R2V0VW5pY29kZVRleHQoKTsKKyAgICAgIH0KKyAgICAgIENQREZfT2JqZWN0KiBwUlYgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiUlYiKTsKKyAgICAgIGlmICghcFJWICYmIChjc0RWYWx1ZSA9PSBjc1ZhbHVlKSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5KSB7CisgICAgICAgIGludCBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgY3NEVmFsdWUpOworICAgICAgICBpZiAoaVJldCA8IDApIHsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChwRFYpIHsKKyAgICAgICAgQ1BERl9PYmplY3QqIHBDbG9uZSA9IHBEVi0+Q2xvbmUoKTsKKyAgICAgICAgaWYgKCFwQ2xvbmUpIHsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgbV9wRGljdC0+U2V0QXQoIlYiLCBwQ2xvbmUpOworICAgICAgICBpZiAocFJWKSB7CisgICAgICAgICAgQ1BERl9PYmplY3QqIHBDbG9uZVIgPSBwRFYtPkNsb25lKCk7CisgICAgICAgICAgbV9wRGljdC0+U2V0QXQoIlJWIiwgcENsb25lUik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fcERpY3QtPlJlbW92ZUF0KCJWIik7CisgICAgICAgIG1fcERpY3QtPlJlbW92ZUF0KCJSViIpOworICAgICAgfQorICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSkgeworICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclZhbHVlQ2hhbmdlKHRoaXMpOworICAgICAgfQorICAgICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7CisgICAgfSBicmVhazsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLUNGWF9XaWRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXRDaGVja1ZhbHVlKEZYX0JPT0wgYkRlZmF1bHQpCi17Ci0gICAgQVNTRVJUKEdldFR5cGUoKSA9PSBDaGVja0JveCB8fCBHZXRUeXBlKCkgPT0gUmFkaW9CdXR0b24pOwotICAgIENGWF9XaWRlU3RyaW5nIGNzRXhwb3J0ID0gTCJPZmYiOwotICAgIEZYX0JPT0wgYkNoZWNrZWQ7Ci0gICAgaW50IGlDb3VudCA9IENvdW50Q29udHJvbHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewotICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldENvbnRyb2woaSk7CitpbnQgQ1BERl9Gb3JtRmllbGQ6OkdldENvbnRyb2xJbmRleChjb25zdCBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCkgeworICBpZiAoIXBDb250cm9sKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9Db250cm9sTGlzdC5HZXRTaXplKCk7IGkrKykgeworICAgIGlmIChtX0NvbnRyb2xMaXN0LkdldEF0KGkpID09IHBDb250cm9sKQorICAgICAgcmV0dXJuIGk7CisgIH0KKyAgcmV0dXJuIC0xOworfQoraW50IENQREZfRm9ybUZpZWxkOjpHZXRGaWVsZFR5cGUoKSB7CisgIHN3aXRjaCAobV9UeXBlKSB7CisgICAgY2FzZSBQdXNoQnV0dG9uOgorICAgICAgcmV0dXJuIEZJRUxEVFlQRV9QVVNIQlVUVE9OOworICAgIGNhc2UgQ2hlY2tCb3g6CisgICAgICByZXR1cm4gRklFTERUWVBFX0NIRUNLQk9YOworICAgIGNhc2UgUmFkaW9CdXR0b246CisgICAgICByZXR1cm4gRklFTERUWVBFX1JBRElPQlVUVE9OOworICAgIGNhc2UgQ29tYm9Cb3g6CisgICAgICByZXR1cm4gRklFTERUWVBFX0NPTUJPQk9YOworICAgIGNhc2UgTGlzdEJveDoKKyAgICAgIHJldHVybiBGSUVMRFRZUEVfTElTVEJPWDsKKyAgICBjYXNlIFRleHQ6CisgICAgY2FzZSBSaWNoVGV4dDoKKyAgICBjYXNlIEZpbGU6CisgICAgICByZXR1cm4gRklFTERUWVBFX1RFWFRGSUVMRDsKKyAgICBjYXNlIFNpZ246CisgICAgICByZXR1cm4gRklFTERUWVBFX1NJR05BVFVSRTsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIEZJRUxEVFlQRV9VTktOT1dOOworfQorQ1BERl9BQWN0aW9uIENQREZfRm9ybUZpZWxkOjpHZXRBZGRpdGlvbmFsQWN0aW9uKCkgeworICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJBQSIpOworICBpZiAoIXBPYmopIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gcE9iai0+R2V0RGljdCgpOworfQorQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldEFsdGVybmF0ZU5hbWUoKSB7CisgIENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIlRVIik7CisgIGlmICghcE9iaikgeworICAgIHJldHVybiBMIiI7CisgIH0KKyAgcmV0dXJuIHBPYmotPkdldFVuaWNvZGVUZXh0KCk7Cit9CitDRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0TWFwcGluZ05hbWUoKSB7CisgIENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIlRNIik7CisgIGlmICghcE9iaikgeworICAgIHJldHVybiBMIiI7CisgIH0KKyAgcmV0dXJuIHBPYmotPkdldFVuaWNvZGVUZXh0KCk7Cit9CitGWF9EV09SRCBDUERGX0Zvcm1GaWVsZDo6R2V0RmllbGRGbGFncygpIHsKKyAgQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiRmYiKTsKKyAgaWYgKCFwT2JqKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIHBPYmotPkdldEludGVnZXIoKTsKK30KK0NGWF9CeXRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXREZWZhdWx0U3R5bGUoKSB7CisgIENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkRTIik7CisgIGlmICghcE9iaikgeworICAgIHJldHVybiAiIjsKKyAgfQorICByZXR1cm4gcE9iai0+R2V0U3RyaW5nKCk7Cit9CitDRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0UmljaFRleHRTdHJpbmcoKSB7CisgIENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIlJWIik7CisgIGlmICghcE9iaikgeworICAgIHJldHVybiBMIiI7CisgIH0KKyAgcmV0dXJuIHBPYmotPkdldFVuaWNvZGVUZXh0KCk7Cit9CitDRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0VmFsdWUoRlhfQk9PTCBiRGVmYXVsdCkgeworICBpZiAoR2V0VHlwZSgpID09IENoZWNrQm94IHx8IEdldFR5cGUoKSA9PSBSYWRpb0J1dHRvbikgeworICAgIHJldHVybiBHZXRDaGVja1ZhbHVlKGJEZWZhdWx0KTsKKyAgfQorICBDUERGX09iamVjdCogcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgYkRlZmF1bHQgPyAiRFYiIDogIlYiKTsKKyAgaWYgKCFwVmFsdWUpIHsKKyAgICBpZiAoIWJEZWZhdWx0KSB7CisgICAgICBpZiAobV9UeXBlID09IFJpY2hUZXh0KSB7CisgICAgICAgIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJWIik7CisgICAgICB9CisgICAgICBpZiAoIXBWYWx1ZSAmJiBtX1R5cGUgIT0gVGV4dCkgeworICAgICAgICBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiRFYiKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFwVmFsdWUpIHsKKyAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICAgIH0KKyAgfQorICBzd2l0Y2ggKHBWYWx1ZS0+R2V0VHlwZSgpKSB7CisgICAgY2FzZSBQREZPQkpfU1RSSU5HOgorICAgIGNhc2UgUERGT0JKX1NUUkVBTToKKyAgICAgIHJldHVybiBwVmFsdWUtPkdldFVuaWNvZGVUZXh0KCk7CisgICAgY2FzZSBQREZPQkpfQVJSQVk6CisgICAgICBwVmFsdWUgPSBwVmFsdWUtPkFzQXJyYXkoKS0+R2V0RWxlbWVudFZhbHVlKDApOworICAgICAgaWYgKHBWYWx1ZSkKKyAgICAgICAgcmV0dXJuIHBWYWx1ZS0+R2V0VW5pY29kZVRleHQoKTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworfQorQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldFZhbHVlKCkgeworICByZXR1cm4gR2V0VmFsdWUoRkFMU0UpOworfQorQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldERlZmF1bHRWYWx1ZSgpIHsKKyAgcmV0dXJuIEdldFZhbHVlKFRSVUUpOworfQorRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6U2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSkgeworICBzd2l0Y2ggKG1fVHlwZSkgeworICAgIGNhc2UgQ2hlY2tCb3g6CisgICAgY2FzZSBSYWRpb0J1dHRvbjogeworICAgICAgU2V0Q2hlY2tWYWx1ZSh2YWx1ZSwgYkRlZmF1bHQsIGJOb3RpZnkpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGNhc2UgRmlsZToKKyAgICBjYXNlIFJpY2hUZXh0OgorICAgIGNhc2UgVGV4dDoKKyAgICBjYXNlIENvbWJvQm94OiB7CisgICAgICBDRlhfV2lkZVN0cmluZyBjc1ZhbHVlID0gdmFsdWU7CisgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5KSB7CisgICAgICAgIGludCBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgY3NWYWx1ZSk7CisgICAgICAgIGlmIChpUmV0IDwgMCkgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaW50IGlJbmRleCA9IEZpbmRPcHRpb25WYWx1ZShjc1ZhbHVlKTsKKyAgICAgIGlmIChpSW5kZXggPCAwKSB7CisgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzRW5jb2RlVGV4dCA9IFBERl9FbmNvZGVUZXh0KGNzVmFsdWUpOworICAgICAgICBtX3BEaWN0LT5TZXRBdFN0cmluZyhiRGVmYXVsdCA/ICJEViIgOiAiViIsIGJzRW5jb2RlVGV4dCk7CisgICAgICAgIGlmIChtX1R5cGUgPT0gUmljaFRleHQgJiYgIWJEZWZhdWx0KSB7CisgICAgICAgICAgbV9wRGljdC0+U2V0QXRTdHJpbmcoIlJWIiwgYnNFbmNvZGVUZXh0KTsKKyAgICAgICAgfQorICAgICAgICBtX3BEaWN0LT5SZW1vdmVBdCgiSSIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbV9wRGljdC0+U2V0QXRTdHJpbmcoYkRlZmF1bHQgPyAiRFYiIDogIlYiLCBQREZfRW5jb2RlVGV4dChjc1ZhbHVlKSk7CiAgICAgICAgIGlmIChiRGVmYXVsdCkgewotICAgICAgICAgICAgYkNoZWNrZWQgPSBwQ29udHJvbC0+SXNEZWZhdWx0Q2hlY2tlZCgpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYkNoZWNrZWQgPSBwQ29udHJvbC0+SXNDaGVja2VkKCk7CisgICAgICAgICAgQ2xlYXJTZWxlY3Rpb24oKTsKKyAgICAgICAgICBTZXRJdGVtU2VsZWN0aW9uKGlJbmRleCwgVFJVRSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGJDaGVja2VkKSB7Ci0gICAgICAgICAgICBjc0V4cG9ydCA9IHBDb250cm9sLT5HZXRFeHBvcnRWYWx1ZSgpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5KSB7CisgICAgICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyVmFsdWVDaGFuZ2UodGhpcyk7CisgICAgICB9CisgICAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgTGlzdEJveDogeworICAgICAgaW50IGlJbmRleCA9IEZpbmRPcHRpb25WYWx1ZSh2YWx1ZSk7CisgICAgICBpZiAoaUluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBpZiAoYkRlZmF1bHQgJiYgaUluZGV4ID09IEdldERlZmF1bHRTZWxlY3RlZEl0ZW0oKSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5KSB7CisgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzVmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgaW50IGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVTZWxlY3Rpb25DaGFuZ2UodGhpcywgY3NWYWx1ZSk7CisgICAgICAgIGlmIChpUmV0IDwgMCkgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGJEZWZhdWx0KSB7CisgICAgICB9IGVsc2UgeworICAgICAgICBDbGVhclNlbGVjdGlvbigpOworICAgICAgICBTZXRJdGVtU2VsZWN0aW9uKGlJbmRleCwgVFJVRSk7CisgICAgICB9CisgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5KSB7CisgICAgICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyU2VsZWN0aW9uQ2hhbmdlKHRoaXMpOworICAgICAgfQorICAgICAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgcmV0dXJuIGNzRXhwb3J0OworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICBpZiAoQ1BERl9JbnRlckZvcm06Om1fYlVwZGF0ZUFQKSB7CisgICAgVXBkYXRlQVAoTlVMTCk7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENQREZfRm9ybUZpZWxkOjpTZXRDaGVja1ZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSwgRlhfQk9PTCBiRGVmYXVsdCwgRlhfQk9PTCBiTm90aWZ5KQotewotICAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ2hlY2tCb3ggfHwgR2V0VHlwZSgpID09IFJhZGlvQnV0dG9uKTsKLSAgICBDRlhfQnl0ZUFycmF5IHN0YXR1c0FycmF5OwotICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewotICAgICAgICBTYXZlQ2hlY2tlZEZpZWxkU3RhdHVzKHRoaXMsIHN0YXR1c0FycmF5KTsKLSAgICB9Ci0gICAgaW50IGlDb3VudCA9IENvdW50Q29udHJvbHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewotICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldENvbnRyb2woaSk7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIGNzRXhwb3J0ID0gcENvbnRyb2wtPkdldEV4cG9ydFZhbHVlKCk7Ci0gICAgICAgIGlmIChjc0V4cG9ydCA9PSB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKGJEZWZhdWx0KSB7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENoZWNrQ29udHJvbChHZXRDb250cm9sSW5kZXgocENvbnRyb2wpLCBUUlVFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGJEZWZhdWx0KSB7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENoZWNrQ29udHJvbChHZXRDb250cm9sSW5kZXgocENvbnRyb2wpLCBGQUxTRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7Ci0gICAgICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyQ2hlY2tlZFN0YXR1c0NoYW5nZSh0aGlzLCBzdGF0dXNBcnJheSk7Ci0gICAgfQotICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSBUUlVFOwotICAgIHJldHVybiBUUlVFOworRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6U2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLCBGWF9CT09MIGJOb3RpZnkpIHsKKyAgcmV0dXJuIFNldFZhbHVlKHZhbHVlLCBGQUxTRSwgYk5vdGlmeSk7CiB9Ci1pbnQgQ1BERl9Gb3JtRmllbGQ6OkdldFRvcFZpc2libGVJbmRleCgpCi17Ci0gICAgQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiVEkiKTsKLSAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KK2ludCBDUERGX0Zvcm1GaWVsZDo6R2V0TWF4TGVuKCkgeworICBpZiAoQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiTWF4TGVuIikpCiAgICAgcmV0dXJuIHBPYmotPkdldEludGVnZXIoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG1fQ29udHJvbExpc3QuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IG1fQ29udHJvbExpc3QuR2V0QXQoaSk7CisgICAgaWYgKCFwQ29udHJvbCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwV2lkZ2V0RGljdCA9IHBDb250cm9sLT5tX3BXaWRnZXREaWN0OworICAgIGlmIChwV2lkZ2V0RGljdC0+S2V5RXhpc3QoIk1heExlbiIpKQorICAgICAgcmV0dXJuIHBXaWRnZXREaWN0LT5HZXRJbnRlZ2VyKCJNYXhMZW4iKTsKKyAgfQorICByZXR1cm4gMDsKIH0KLWludCBDUERGX0Zvcm1GaWVsZDo6Q291bnRTZWxlY3RlZE9wdGlvbnMoKQotewotICAgIENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkkiKTsKLSAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBwT2JqLT5HZXRBcnJheSgpOwotICAgIGlmIChwQXJyYXkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIChpbnQpcEFycmF5LT5HZXRDb3VudCgpOworaW50IENQREZfRm9ybUZpZWxkOjpDb3VudFNlbGVjdGVkSXRlbXMoKSB7CisgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiViIpOworICBpZiAoIXBWYWx1ZSkgeworICAgIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJJIik7CisgICAgaWYgKCFwVmFsdWUpCisgICAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChwVmFsdWUtPklzU3RyaW5nKCkgfHwgcFZhbHVlLT5Jc051bWJlcigpKQorICAgIHJldHVybiBwVmFsdWUtPkdldFN0cmluZygpLklzRW1wdHkoKSA/IDAgOiAxOworICBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcFZhbHVlLT5Bc0FycmF5KCkpCisgICAgcmV0dXJuIHBBcnJheS0+R2V0Q291bnQoKTsKKyAgcmV0dXJuIDA7CiB9Ci1pbnQgQ1BERl9Gb3JtRmllbGQ6OkdldFNlbGVjdGVkT3B0aW9uSW5kZXgoaW50IGluZGV4KQotewotICAgIENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkkiKTsKLSAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtMTsKK2ludCBDUERGX0Zvcm1GaWVsZDo6R2V0U2VsZWN0ZWRJbmRleChpbnQgaW5kZXgpIHsKKyAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJWIik7CisgIGlmICghcFZhbHVlKSB7CisgICAgcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkkiKTsKKyAgICBpZiAoIXBWYWx1ZSkKKyAgICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAocFZhbHVlLT5Jc051bWJlcigpKQorICAgIHJldHVybiBwVmFsdWUtPkdldEludGVnZXIoKTsKKworICBDRlhfV2lkZVN0cmluZyBzZWxfdmFsdWU7CisgIGlmIChwVmFsdWUtPklzU3RyaW5nKCkpIHsKKyAgICBpZiAoaW5kZXggIT0gMCkKKyAgICAgIHJldHVybiAtMTsKKyAgICBzZWxfdmFsdWUgPSBwVmFsdWUtPkdldFVuaWNvZGVUZXh0KCk7CisgIH0gZWxzZSB7CisgICAgQ1BERl9BcnJheSogcEFycmF5ID0gcFZhbHVlLT5Bc0FycmF5KCk7CisgICAgaWYgKCFwQXJyYXkgfHwgaW5kZXggPCAwKQorICAgICAgcmV0dXJuIC0xOworCisgICAgQ1BERl9PYmplY3QqIGVsZW1lbnRWYWx1ZSA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKGluZGV4KTsKKyAgICBzZWxfdmFsdWUgPQorICAgICAgICBlbGVtZW50VmFsdWUgPyBlbGVtZW50VmFsdWUtPkdldFVuaWNvZGVUZXh0KCkgOiBDRlhfV2lkZVN0cmluZygpOworICB9CisgIGlmIChpbmRleCA8IENvdW50U2VsZWN0ZWRPcHRpb25zKCkpIHsKKyAgICBpbnQgaU9wdEluZGV4ID0gR2V0U2VsZWN0ZWRPcHRpb25JbmRleChpbmRleCk7CisgICAgQ0ZYX1dpZGVTdHJpbmcgY3NPcHQgPSBHZXRPcHRpb25WYWx1ZShpT3B0SW5kZXgpOworICAgIGlmIChjc09wdCA9PSBzZWxfdmFsdWUpIHsKKyAgICAgIHJldHVybiBpT3B0SW5kZXg7CiAgICAgfQotICAgIENQREZfQXJyYXkqIHBBcnJheSA9IHBPYmotPkdldEFycmF5KCk7Ci0gICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgfQorICBpbnQgbk9wdHMgPSBDb3VudE9wdGlvbnMoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuT3B0czsgaSsrKSB7CisgICAgaWYgKHNlbF92YWx1ZSA9PSBHZXRPcHRpb25WYWx1ZShpKSkgeworICAgICAgcmV0dXJuIGk7CiAgICAgfQotICAgIGludCBpQ291bnQgPSAoaW50KXBBcnJheS0+R2V0Q291bnQoKTsKLSAgICBpZiAoaUNvdW50ID4gMCAmJiBpbmRleCA8IGlDb3VudCkgewotICAgICAgICByZXR1cm4gcEFycmF5LT5HZXRJbnRlZ2VyKGluZGV4KTsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiAtMTsKIH0KLUZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OklzT3B0aW9uU2VsZWN0ZWQoaW50IGlPcHRJbmRleCkKLXsKLSAgICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJJIik7Ci0gICAgaWYgKHBPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CitGWF9CT09MIENQREZfRm9ybUZpZWxkOjpDbGVhclNlbGVjdGlvbihGWF9CT09MIGJOb3RpZnkpIHsKKyAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSkgeworICAgIGludCBpUmV0ID0gMDsKKyAgICBDRlhfV2lkZVN0cmluZyBjc1ZhbHVlOworICAgIGludCBpSW5kZXggPSBHZXRTZWxlY3RlZEluZGV4KDApOworICAgIGlmIChpSW5kZXggPj0gMCkgeworICAgICAgY3NWYWx1ZSA9IEdldE9wdGlvbkxhYmVsKGlJbmRleCk7CiAgICAgfQotICAgIENQREZfQXJyYXkqIHBBcnJheSA9IHBPYmotPkdldEFycmF5KCk7Ci0gICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoR2V0VHlwZSgpID09IExpc3RCb3gpIHsKKyAgICAgIGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVTZWxlY3Rpb25DaGFuZ2UodGhpcywgY3NWYWx1ZSk7CiAgICAgfQotICAgIGludCBpQ291bnQgPSAoaW50KXBBcnJheS0+R2V0Q291bnQoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewotICAgICAgICBpZiAocEFycmF5LT5HZXRJbnRlZ2VyKGkpID09IGlPcHRJbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KKyAgICBpZiAoR2V0VHlwZSgpID09IENvbWJvQm94KSB7CisgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgY3NWYWx1ZSk7CiAgICAgfQorICAgIGlmIChpUmV0IDwgMCkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorICBtX3BEaWN0LT5SZW1vdmVBdCgiViIpOworICBtX3BEaWN0LT5SZW1vdmVBdCgiSSIpOworICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5KSB7CisgICAgaWYgKEdldFR5cGUoKSA9PSBMaXN0Qm94KSB7CisgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclNlbGVjdGlvbkNoYW5nZSh0aGlzKTsKKyAgICB9CisgICAgaWYgKEdldFR5cGUoKSA9PSBDb21ib0JveCkgeworICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJWYWx1ZUNoYW5nZSh0aGlzKTsKKyAgICB9CisgIH0KKyAgaWYgKENQREZfSW50ZXJGb3JtOjptX2JVcGRhdGVBUCkgeworICAgIFVwZGF0ZUFQKE5VTEwpOworICB9CisgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSBUUlVFOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OklzSXRlbVNlbGVjdGVkKGludCBpbmRleCkgeworICBBU1NFUlQoR2V0VHlwZSgpID09IENvbWJvQm94IHx8IEdldFR5cGUoKSA9PSBMaXN0Qm94KTsKKyAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBDb3VudE9wdGlvbnMoKSkgewogICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OlNlbGVjdE9wdGlvbihpbnQgaU9wdEluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCwgRlhfQk9PTCBiTm90aWZ5KQotewotICAgIENQREZfQXJyYXkqIHBBcnJheSA9IG1fcERpY3QtPkdldEFycmF5KCJJIik7Ci0gICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgIGlmICghYlNlbGVjdGVkKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBwQXJyYXkgPSBDUERGX0FycmF5OjpDcmVhdGUoKTsKLSAgICAgICAgaWYgKHBBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wRGljdC0+U2V0QXQoIkkiLCBwQXJyYXkpOwotICAgIH0KLSAgICBGWF9CT09MIGJSZXR1cm4gPSBGQUxTRTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpcEFycmF5LT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgIGludCBpRmluZCA9IHBBcnJheS0+R2V0SW50ZWdlcihpKTsKLSAgICAgICAgaWYgKGlGaW5kID09IGlPcHRJbmRleCkgewotICAgICAgICAgICAgaWYgKGJTZWxlY3RlZCkgewotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaW50IGlSZXQgPSAwOwotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzVmFsdWUgPSBHZXRPcHRpb25MYWJlbChpT3B0SW5kZXgpOwotICAgICAgICAgICAgICAgIGlmIChHZXRUeXBlKCkgPT0gTGlzdEJveCkgewotICAgICAgICAgICAgICAgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlU2VsZWN0aW9uQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoR2V0VHlwZSgpID09IENvbWJvQm94KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVWYWx1ZUNoYW5nZSh0aGlzLCBjc1ZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGlSZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQXJyYXktPlJlbW92ZUF0KGkpOwotICAgICAgICAgICAgYlJldHVybiA9IFRSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIGlmIChpRmluZCA+IGlPcHRJbmRleCkgewotICAgICAgICAgICAgaWYgKCFiU2VsZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGludCBpUmV0ID0gMDsKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc1ZhbHVlID0gR2V0T3B0aW9uTGFiZWwoaU9wdEluZGV4KTsKLSAgICAgICAgICAgICAgICBpZiAoR2V0VHlwZSgpID09IExpc3RCb3gpIHsKLSAgICAgICAgICAgICAgICAgICAgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVNlbGVjdGlvbkNoYW5nZSh0aGlzLCBjc1ZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKEdldFR5cGUoKSA9PSBDb21ib0JveCkgewotICAgICAgICAgICAgICAgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgY3NWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpUmV0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ1BERl9OdW1iZXIqIHBOdW0gPSBDUERGX051bWJlcjo6Q3JlYXRlKGlPcHRJbmRleCk7Ci0gICAgICAgICAgICBpZiAocE51bSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcEFycmF5LT5JbnNlcnRBdChpLCBwTnVtKTsKLSAgICAgICAgICAgIGJSZXR1cm4gPSBUUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFiUmV0dXJuKSB7Ci0gICAgICAgIGlmIChiU2VsZWN0ZWQpIHsKLSAgICAgICAgICAgIHBBcnJheS0+QWRkSW50ZWdlcihpT3B0SW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwQXJyYXktPkdldENvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgbV9wRGljdC0+UmVtb3ZlQXQoIkkiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5ICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKEdldFR5cGUoKSA9PSBMaXN0Qm94KSB7Ci0gICAgICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclNlbGVjdGlvbkNoYW5nZSh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoR2V0VHlwZSgpID09IENvbWJvQm94KSB7Ci0gICAgICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclZhbHVlQ2hhbmdlKHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSBUUlVFOworICB9CisgIGlmIChJc09wdGlvblNlbGVjdGVkKGluZGV4KSkgewogICAgIHJldHVybiBUUlVFOworICB9CisgIENGWF9XaWRlU3RyaW5nIG9wdF92YWx1ZSA9IEdldE9wdGlvblZhbHVlKGluZGV4KTsKKyAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJWIik7CisgIGlmICghcFZhbHVlKSB7CisgICAgcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkkiKTsKKyAgICBpZiAoIXBWYWx1ZSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorCisgIGlmIChwVmFsdWUtPklzU3RyaW5nKCkpCisgICAgcmV0dXJuIHBWYWx1ZS0+R2V0VW5pY29kZVRleHQoKSA9PSBvcHRfdmFsdWU7CisKKyAgaWYgKHBWYWx1ZS0+SXNOdW1iZXIoKSkgeworICAgIGlmIChwVmFsdWUtPkdldFN0cmluZygpLklzRW1wdHkoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gKHBWYWx1ZS0+R2V0SW50ZWdlcigpID09IGluZGV4KTsKKyAgfQorCisgIENQREZfQXJyYXkqIHBBcnJheSA9IHBWYWx1ZS0+QXNBcnJheSgpOworICBpZiAoIXBBcnJheSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaW50IGlQb3MgPSAtMTsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBDb3VudFNlbGVjdGVkT3B0aW9ucygpOyBqKyspIHsKKyAgICBpZiAoR2V0U2VsZWN0ZWRPcHRpb25JbmRleChqKSA9PSBpbmRleCkgeworICAgICAgaVBvcyA9IGo7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBBcnJheS0+R2V0Q291bnQoKTsgaSsrKQorICAgIGlmIChwQXJyYXktPkdldEVsZW1lbnRWYWx1ZShpKS0+R2V0VW5pY29kZVRleHQoKSA9PSBvcHRfdmFsdWUgJiYKKyAgICAgICAgKGludClpID09IGlQb3MpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQotRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6Q2xlYXJTZWxlY3RlZE9wdGlvbnMoRlhfQk9PTCBiTm90aWZ5KQotewotICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkgIT0gTlVMTCkgewotICAgICAgICBpbnQgaVJldCA9IDA7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIGNzVmFsdWU7Ci0gICAgICAgIGludCBpSW5kZXggPSBHZXRTZWxlY3RlZEluZGV4KDApOwotICAgICAgICBpZiAoaUluZGV4ID49IDApIHsKLSAgICAgICAgICAgIGNzVmFsdWUgPSBHZXRPcHRpb25MYWJlbChpSW5kZXgpOworRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6U2V0SXRlbVNlbGVjdGlvbihpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNlbGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkpIHsKKyAgQVNTRVJUKEdldFR5cGUoKSA9PSBDb21ib0JveCB8fCBHZXRUeXBlKCkgPT0gTGlzdEJveCk7CisgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQ291bnRPcHRpb25zKCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0ZYX1dpZGVTdHJpbmcgb3B0X3ZhbHVlID0gR2V0T3B0aW9uVmFsdWUoaW5kZXgpOworICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5KSB7CisgICAgaW50IGlSZXQgPSAwOworICAgIGlmIChHZXRUeXBlKCkgPT0gTGlzdEJveCkgeworICAgICAgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVNlbGVjdGlvbkNoYW5nZSh0aGlzLCBvcHRfdmFsdWUpOworICAgIH0KKyAgICBpZiAoR2V0VHlwZSgpID09IENvbWJvQm94KSB7CisgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgb3B0X3ZhbHVlKTsKKyAgICB9CisgICAgaWYgKGlSZXQgPCAwKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CisgIGlmICghYlNlbGVjdGVkKSB7CisgICAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJWIik7CisgICAgaWYgKHBWYWx1ZSkgeworICAgICAgaWYgKG1fVHlwZSA9PSBMaXN0Qm94KSB7CisgICAgICAgIFNlbGVjdE9wdGlvbihpbmRleCwgRkFMU0UpOworICAgICAgICBpZiAocFZhbHVlLT5Jc1N0cmluZygpKSB7CisgICAgICAgICAgaWYgKHBWYWx1ZS0+R2V0VW5pY29kZVRleHQoKSA9PSBvcHRfdmFsdWUpIHsKKyAgICAgICAgICAgIG1fcERpY3QtPlJlbW92ZUF0KCJWIik7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHBWYWx1ZS0+SXNBcnJheSgpKSB7CisgICAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gbmV3IENQREZfQXJyYXk7CisgICAgICAgICAgaW50IGlDb3VudCA9IENvdW50T3B0aW9ucygpOworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpICE9IGluZGV4KSB7CisgICAgICAgICAgICAgIGlmIChJc0l0ZW1TZWxlY3RlZChpKSkgeworICAgICAgICAgICAgICAgIG9wdF92YWx1ZSA9IEdldE9wdGlvblZhbHVlKGkpOworICAgICAgICAgICAgICAgIHBBcnJheS0+QWRkU3RyaW5nKFBERl9FbmNvZGVUZXh0KG9wdF92YWx1ZSkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChwQXJyYXktPkdldENvdW50KCkgPCAxKSB7CisgICAgICAgICAgICBwQXJyYXktPlJlbGVhc2UoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbV9wRGljdC0+U2V0QXQoIlYiLCBwQXJyYXkpOworICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChtX1R5cGUgPT0gQ29tYm9Cb3gpIHsKKyAgICAgICAgbV9wRGljdC0+UmVtb3ZlQXQoIlYiKTsKKyAgICAgICAgbV9wRGljdC0+UmVtb3ZlQXQoIkkiKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKG1fVHlwZSA9PSBMaXN0Qm94KSB7CisgICAgICBTZWxlY3RPcHRpb24oaW5kZXgsIFRSVUUpOworICAgICAgaWYgKCEobV9GbGFncyAmIEZPUk1MSVNUX01VTFRJU0VMRUNUKSkgeworICAgICAgICBtX3BEaWN0LT5TZXRBdFN0cmluZygiViIsIFBERl9FbmNvZGVUZXh0KG9wdF92YWx1ZSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gbmV3IENQREZfQXJyYXk7CisgICAgICAgIGludCBpQ291bnQgPSBDb3VudE9wdGlvbnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgICAgICAgIEZYX0JPT0wgYlNlbGVjdGVkOworICAgICAgICAgIGlmIChpICE9IGluZGV4KSB7CisgICAgICAgICAgICBiU2VsZWN0ZWQgPSBJc0l0ZW1TZWxlY3RlZChpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYlNlbGVjdGVkID0gVFJVRTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGJTZWxlY3RlZCkgeworICAgICAgICAgICAgb3B0X3ZhbHVlID0gR2V0T3B0aW9uVmFsdWUoaSk7CisgICAgICAgICAgICBwQXJyYXktPkFkZFN0cmluZyhQREZfRW5jb2RlVGV4dChvcHRfdmFsdWUpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbV9wRGljdC0+U2V0QXQoIlYiLCBwQXJyYXkpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAobV9UeXBlID09IENvbWJvQm94KSB7CisgICAgICBtX3BEaWN0LT5TZXRBdFN0cmluZygiViIsIFBERl9FbmNvZGVUZXh0KG9wdF92YWx1ZSkpOworICAgICAgQ1BERl9BcnJheSogcEkgPSBuZXcgQ1BERl9BcnJheTsKKyAgICAgIHBJLT5BZGRJbnRlZ2VyKGluZGV4KTsKKyAgICAgIG1fcERpY3QtPlNldEF0KCJJIiwgcEkpOworICAgIH0KKyAgfQorICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5KSB7CisgICAgaWYgKEdldFR5cGUoKSA9PSBMaXN0Qm94KSB7CisgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclNlbGVjdGlvbkNoYW5nZSh0aGlzKTsKKyAgICB9CisgICAgaWYgKEdldFR5cGUoKSA9PSBDb21ib0JveCkgeworICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJWYWx1ZUNoYW5nZSh0aGlzKTsKKyAgICB9CisgIH0KKyAgaWYgKENQREZfSW50ZXJGb3JtOjptX2JVcGRhdGVBUCkgeworICAgIFVwZGF0ZUFQKE5VTEwpOworICB9CisgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSBUUlVFOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OklzSXRlbURlZmF1bHRTZWxlY3RlZChpbnQgaW5kZXgpIHsKKyAgQVNTRVJUKEdldFR5cGUoKSA9PSBDb21ib0JveCB8fCBHZXRUeXBlKCkgPT0gTGlzdEJveCk7CisgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gQ291bnRPcHRpb25zKCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW50IGlEVkluZGV4ID0gR2V0RGVmYXVsdFNlbGVjdGVkSXRlbSgpOworICBpZiAoaURWSW5kZXggPCAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiAoaURWSW5kZXggPT0gaW5kZXgpOworfQoraW50IENQREZfRm9ybUZpZWxkOjpHZXREZWZhdWx0U2VsZWN0ZWRJdGVtKCkgeworICBBU1NFUlQoR2V0VHlwZSgpID09IENvbWJvQm94IHx8IEdldFR5cGUoKSA9PSBMaXN0Qm94KTsKKyAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJEViIpOworICBpZiAoIXBWYWx1ZSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBDRlhfV2lkZVN0cmluZyBjc0RWID0gcFZhbHVlLT5HZXRVbmljb2RlVGV4dCgpOworICBpZiAoY3NEVi5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaW50IGlDb3VudCA9IENvdW50T3B0aW9ucygpOworICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7CisgICAgaWYgKGNzRFYgPT0gR2V0T3B0aW9uVmFsdWUoaSkpIHsKKyAgICAgIHJldHVybiBpOworICAgIH0KKyAgfQorICByZXR1cm4gLTE7Cit9Cit2b2lkIENQREZfRm9ybUZpZWxkOjpVcGRhdGVBUChDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCkgeworICBpZiAobV9UeXBlID09IFB1c2hCdXR0b24pIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fVHlwZSA9PSBSYWRpb0J1dHRvbiB8fCBtX1R5cGUgPT0gQ2hlY2tCb3gpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFtX3BGb3JtLT5tX2JHZW5lcmF0ZUFQKSB7CisgICAgcmV0dXJuOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgQ291bnRDb250cm9scygpOyBpKyspIHsKKyAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldENvbnRyb2woaSk7CisgICAgRlBERl9HZW5lcmF0ZUFQKG1fcEZvcm0tPm1fcERvY3VtZW50LCBwQ29udHJvbC0+bV9wV2lkZ2V0RGljdCk7CisgIH0KK30KK2ludCBDUERGX0Zvcm1GaWVsZDo6Q291bnRPcHRpb25zKCkgeworICBDUERGX0FycmF5KiBwQXJyYXkgPSBUb0FycmF5KEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJPcHQiKSk7CisgIHJldHVybiBwQXJyYXkgPyBwQXJyYXktPkdldENvdW50KCkgOiAwOworfQorQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldE9wdGlvblRleHQoaW50IGluZGV4LCBpbnQgc3ViX2luZGV4KSB7CisgIENQREZfQXJyYXkqIHBBcnJheSA9IFRvQXJyYXkoRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIk9wdCIpKTsKKyAgaWYgKCFwQXJyYXkpCisgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7CisKKyAgQ1BERl9PYmplY3QqIHBPcHRpb24gPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZShpbmRleCk7CisgIGlmICghcE9wdGlvbikKKyAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgaWYgKENQREZfQXJyYXkqIHBPcHRpb25BcnJheSA9IHBPcHRpb24tPkFzQXJyYXkoKSkKKyAgICBwT3B0aW9uID0gcE9wdGlvbkFycmF5LT5HZXRFbGVtZW50VmFsdWUoc3ViX2luZGV4KTsKKworICBDUERGX1N0cmluZyogcFN0cmluZyA9IFRvU3RyaW5nKHBPcHRpb24pOworICByZXR1cm4gcFN0cmluZyA/IHBTdHJpbmctPkdldFVuaWNvZGVUZXh0KCkgOiBDRlhfV2lkZVN0cmluZygpOworfQorQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldE9wdGlvbkxhYmVsKGludCBpbmRleCkgeworICByZXR1cm4gR2V0T3B0aW9uVGV4dChpbmRleCwgMSk7Cit9CitDRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0T3B0aW9uVmFsdWUoaW50IGluZGV4KSB7CisgIHJldHVybiBHZXRPcHRpb25UZXh0KGluZGV4LCAwKTsKK30KK2ludCBDUERGX0Zvcm1GaWVsZDo6RmluZE9wdGlvbihDRlhfV2lkZVN0cmluZyBjc09wdExhYmVsKSB7CisgIGludCBpQ291bnQgPSBDb3VudE9wdGlvbnMoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgIENGWF9XaWRlU3RyaW5nIGNzVmFsdWUgPSBHZXRPcHRpb25WYWx1ZShpKTsKKyAgICBpZiAoY3NWYWx1ZSA9PSBjc09wdExhYmVsKSB7CisgICAgICByZXR1cm4gaTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIC0xOworfQoraW50IENQREZfRm9ybUZpZWxkOjpGaW5kT3B0aW9uVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzT3B0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaVN0YXJ0SW5kZXgpIHsKKyAgaWYgKGlTdGFydEluZGV4IDwgMCkgeworICAgIGlTdGFydEluZGV4ID0gMDsKKyAgfQorICBpbnQgaUNvdW50ID0gQ291bnRPcHRpb25zKCk7CisgIGZvciAoOyBpU3RhcnRJbmRleCA8IGlDb3VudDsgaVN0YXJ0SW5kZXgrKykgeworICAgIENGWF9XaWRlU3RyaW5nIGNzVmFsdWUgPSBHZXRPcHRpb25WYWx1ZShpU3RhcnRJbmRleCk7CisgICAgaWYgKGNzVmFsdWUgPT0gY3NPcHRWYWx1ZSkgeworICAgICAgcmV0dXJuIGlTdGFydEluZGV4OworICAgIH0KKyAgfQorICByZXR1cm4gLTE7Cit9CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK2ludCBDUERGX0Zvcm1GaWVsZDo6SW5zZXJ0T3B0aW9uKENGWF9XaWRlU3RyaW5nIGNzT3B0TGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkpIHsKKyAgaWYgKGNzT3B0TGFiZWwuSXNFbXB0eSgpKQorICAgIHJldHVybiAtMTsKKworICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5KSB7CisgICAgaW50IGlSZXQgPSAwOworICAgIGlmIChHZXRUeXBlKCkgPT0gTGlzdEJveCkKKyAgICAgIGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVTZWxlY3Rpb25DaGFuZ2UodGhpcywgY3NPcHRMYWJlbCk7CisgICAgaWYgKEdldFR5cGUoKSA9PSBDb21ib0JveCkKKyAgICAgIGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVWYWx1ZUNoYW5nZSh0aGlzLCBjc09wdExhYmVsKTsKKyAgICBpZiAoaVJldCA8IDApCisgICAgICByZXR1cm4gLTE7CisgIH0KKworICBDRlhfQnl0ZVN0cmluZyBjc1N0ciA9IFBERl9FbmNvZGVUZXh0KGNzT3B0TGFiZWwsIGNzT3B0TGFiZWwuR2V0TGVuZ3RoKCkpOworICBDUERGX09iamVjdCogcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIk9wdCIpOworICBDUERGX0FycmF5KiBwT3B0ID0gVG9BcnJheShwVmFsdWUpOworICBpZiAoIXBPcHQpIHsKKyAgICBwT3B0ID0gbmV3IENQREZfQXJyYXk7CisgICAgbV9wRGljdC0+U2V0QXQoIk9wdCIsIHBPcHQpOworICB9CisKKyAgaW50IGlDb3VudCA9IChpbnQpcE9wdC0+R2V0Q291bnQoKTsKKyAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBpQ291bnQpIHsKKyAgICBwT3B0LT5BZGRTdHJpbmcoY3NTdHIpOworICAgIGluZGV4ID0gaUNvdW50OworICB9IGVsc2UgeworICAgIENQREZfU3RyaW5nKiBwU3RyaW5nID0gbmV3IENQREZfU3RyaW5nKGNzU3RyLCBGQUxTRSk7CisgICAgcE9wdC0+SW5zZXJ0QXQoaW5kZXgsIHBTdHJpbmcpOworICB9CisKKyAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSkgeworICAgIGlmIChHZXRUeXBlKCkgPT0gTGlzdEJveCkKKyAgICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyU2VsZWN0aW9uQ2hhbmdlKHRoaXMpOworICAgIGlmIChHZXRUeXBlKCkgPT0gQ29tYm9Cb3gpCisgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclZhbHVlQ2hhbmdlKHRoaXMpOworICB9CisgIG1fcEZvcm0tPm1fYlVwZGF0ZWQgPSBUUlVFOworICByZXR1cm4gaW5kZXg7Cit9CitGWF9CT09MIENQREZfRm9ybUZpZWxkOjpDbGVhck9wdGlvbnMoRlhfQk9PTCBiTm90aWZ5KSB7CisgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkpIHsKKyAgICBpbnQgaVJldCA9IDA7CisgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZTsKKyAgICBpbnQgaUluZGV4ID0gR2V0U2VsZWN0ZWRJbmRleCgwKTsKKyAgICBpZiAoaUluZGV4ID49IDApCisgICAgICBjc1ZhbHVlID0gR2V0T3B0aW9uTGFiZWwoaUluZGV4KTsKKyAgICBpZiAoR2V0VHlwZSgpID09IExpc3RCb3gpCisgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlU2VsZWN0aW9uQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOworICAgIGlmIChHZXRUeXBlKCkgPT0gQ29tYm9Cb3gpCisgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgY3NWYWx1ZSk7CisgICAgaWYgKGlSZXQgPCAwKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgbV9wRGljdC0+UmVtb3ZlQXQoIk9wdCIpOworICBtX3BEaWN0LT5SZW1vdmVBdCgiViIpOworICBtX3BEaWN0LT5SZW1vdmVBdCgiRFYiKTsKKyAgbV9wRGljdC0+UmVtb3ZlQXQoIkkiKTsKKyAgbV9wRGljdC0+UmVtb3ZlQXQoIlRJIik7CisKKyAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSkgeworICAgIGlmIChHZXRUeXBlKCkgPT0gTGlzdEJveCkKKyAgICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyU2VsZWN0aW9uQ2hhbmdlKHRoaXMpOworICAgIGlmIChHZXRUeXBlKCkgPT0gQ29tYm9Cb3gpCisgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclZhbHVlQ2hhbmdlKHRoaXMpOworICB9CisKKyAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7CisgIHJldHVybiBUUlVFOworfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorRlhfQk9PTCBDUERGX0Zvcm1GaWVsZDo6Q2hlY2tDb250cm9sKGludCBpQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoZWNrZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5KSB7CisgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ2hlY2tCb3ggfHwgR2V0VHlwZSgpID09IFJhZGlvQnV0dG9uKTsKKyAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBHZXRDb250cm9sKGlDb250cm9sSW5kZXgpOworICBpZiAoIXBDb250cm9sKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghYkNoZWNrZWQgJiYgcENvbnRyb2wtPklzQ2hlY2tlZCgpID09IGJDaGVja2VkKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENGWF9CeXRlQXJyYXkgc3RhdHVzQXJyYXk7CisgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkpIHsKKyAgICBTYXZlQ2hlY2tlZEZpZWxkU3RhdHVzKHRoaXMsIHN0YXR1c0FycmF5KTsKKyAgfQorICBDRlhfV2lkZVN0cmluZyBjc1dFeHBvcnQgPSBwQ29udHJvbC0+R2V0RXhwb3J0VmFsdWUoKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgY3NCRXhwb3J0ID0gUERGX0VuY29kZVRleHQoY3NXRXhwb3J0KTsKKyAgaW50IGlDb3VudCA9IENvdW50Q29udHJvbHMoKTsKKyAgRlhfQk9PTCBiVW5pc29uID0gUERGX0Zvcm1GaWVsZF9Jc1VuaXNvbih0aGlzKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgIENQREZfRm9ybUNvbnRyb2wqIHBDdHJsID0gR2V0Q29udHJvbChpKTsKKyAgICBpZiAoYlVuaXNvbikgeworICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NFVmFsdWUgPSBwQ3RybC0+R2V0RXhwb3J0VmFsdWUoKTsKKyAgICAgIGlmIChjc0VWYWx1ZSA9PSBjc1dFeHBvcnQpIHsKKyAgICAgICAgaWYgKHBDdHJsLT5HZXRPblN0YXRlTmFtZSgpID09IHBDb250cm9sLT5HZXRPblN0YXRlTmFtZSgpKSB7CisgICAgICAgICAgcEN0cmwtPkNoZWNrQ29udHJvbChiQ2hlY2tlZCk7CisgICAgICAgIH0gZWxzZSBpZiAoYkNoZWNrZWQpIHsKKyAgICAgICAgICBwQ3RybC0+Q2hlY2tDb250cm9sKEZBTFNFKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChiQ2hlY2tlZCkgeworICAgICAgICBwQ3RybC0+Q2hlY2tDb250cm9sKEZBTFNFKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGkgPT0gaUNvbnRyb2xJbmRleCkgeworICAgICAgICBwQ3RybC0+Q2hlY2tDb250cm9sKGJDaGVja2VkKTsKKyAgICAgIH0gZWxzZSBpZiAoYkNoZWNrZWQpIHsKKyAgICAgICAgcEN0cmwtPkNoZWNrQ29udHJvbChGQUxTRSk7CisgICAgICB9CisgICAgfQorICB9CisgIENQREZfT2JqZWN0KiBwT3B0ID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIk9wdCIpOworICBpZiAoIVRvQXJyYXkocE9wdCkpIHsKKyAgICBpZiAoYkNoZWNrZWQpIHsKKyAgICAgIG1fcERpY3QtPlNldEF0TmFtZSgiViIsIGNzQkV4cG9ydCk7CisgICAgfSBlbHNlIHsKKyAgICAgIENGWF9CeXRlU3RyaW5nIGNzVjsKKyAgICAgIENQREZfT2JqZWN0KiBwViA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJWIik7CisgICAgICBpZiAocFYpIHsKKyAgICAgICAgY3NWID0gcFYtPkdldFN0cmluZygpOworICAgICAgfQorICAgICAgaWYgKGNzViA9PSBjc0JFeHBvcnQpIHsKKyAgICAgICAgbV9wRGljdC0+U2V0QXROYW1lKCJWIiwgIk9mZiIpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmIChiQ2hlY2tlZCkgeworICAgIENGWF9CeXRlU3RyaW5nIGNzSW5kZXg7CisgICAgY3NJbmRleC5Gb3JtYXQoIiVkIiwgaUNvbnRyb2xJbmRleCk7CisgICAgbV9wRGljdC0+U2V0QXROYW1lKCJWIiwgY3NJbmRleCk7CisgIH0KKyAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSkgeworICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyQ2hlY2tlZFN0YXR1c0NoYW5nZSh0aGlzLCBzdGF0dXNBcnJheSk7CisgIH0KKyAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7CisgIHJldHVybiBUUlVFOworfQorQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldENoZWNrVmFsdWUoRlhfQk9PTCBiRGVmYXVsdCkgeworICBBU1NFUlQoR2V0VHlwZSgpID09IENoZWNrQm94IHx8IEdldFR5cGUoKSA9PSBSYWRpb0J1dHRvbik7CisgIENGWF9XaWRlU3RyaW5nIGNzRXhwb3J0ID0gTCJPZmYiOworICBGWF9CT09MIGJDaGVja2VkOworICBpbnQgaUNvdW50ID0gQ291bnRDb250cm9scygpOworICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7CisgICAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBHZXRDb250cm9sKGkpOworICAgIGlmIChiRGVmYXVsdCkgeworICAgICAgYkNoZWNrZWQgPSBwQ29udHJvbC0+SXNEZWZhdWx0Q2hlY2tlZCgpOworICAgIH0gZWxzZSB7CisgICAgICBiQ2hlY2tlZCA9IHBDb250cm9sLT5Jc0NoZWNrZWQoKTsKKyAgICB9CisgICAgaWYgKGJDaGVja2VkKSB7CisgICAgICBjc0V4cG9ydCA9IHBDb250cm9sLT5HZXRFeHBvcnRWYWx1ZSgpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBjc0V4cG9ydDsKK30KK0ZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OlNldENoZWNrVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkpIHsKKyAgQVNTRVJUKEdldFR5cGUoKSA9PSBDaGVja0JveCB8fCBHZXRUeXBlKCkgPT0gUmFkaW9CdXR0b24pOworICBDRlhfQnl0ZUFycmF5IHN0YXR1c0FycmF5OworICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5KSB7CisgICAgU2F2ZUNoZWNrZWRGaWVsZFN0YXR1cyh0aGlzLCBzdGF0dXNBcnJheSk7CisgIH0KKyAgaW50IGlDb3VudCA9IENvdW50Q29udHJvbHMoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gR2V0Q29udHJvbChpKTsKKyAgICBDRlhfV2lkZVN0cmluZyBjc0V4cG9ydCA9IHBDb250cm9sLT5HZXRFeHBvcnRWYWx1ZSgpOworICAgIGlmIChjc0V4cG9ydCA9PSB2YWx1ZSkgeworICAgICAgaWYgKGJEZWZhdWx0KSB7CisgICAgICB9IGVsc2UgeworICAgICAgICBDaGVja0NvbnRyb2woR2V0Q29udHJvbEluZGV4KHBDb250cm9sKSwgVFJVRSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGJEZWZhdWx0KSB7CisgICAgICB9IGVsc2UgeworICAgICAgICBDaGVja0NvbnRyb2woR2V0Q29udHJvbEluZGV4KHBDb250cm9sKSwgRkFMU0UpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5KSB7CisgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJDaGVja2VkU3RhdHVzQ2hhbmdlKHRoaXMsIHN0YXR1c0FycmF5KTsKKyAgfQorICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKKyAgcmV0dXJuIFRSVUU7Cit9CitpbnQgQ1BERl9Gb3JtRmllbGQ6OkdldFRvcFZpc2libGVJbmRleCgpIHsKKyAgQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiVEkiKTsKKyAgaWYgKCFwT2JqKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIHBPYmotPkdldEludGVnZXIoKTsKK30KK2ludCBDUERGX0Zvcm1GaWVsZDo6Q291bnRTZWxlY3RlZE9wdGlvbnMoKSB7CisgIENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkkiKTsKKyAgaWYgKCFwT2JqKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgQ1BERl9BcnJheSogcEFycmF5ID0gcE9iai0+R2V0QXJyYXkoKTsKKyAgaWYgKCFwQXJyYXkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gKGludClwQXJyYXktPkdldENvdW50KCk7Cit9CitpbnQgQ1BERl9Gb3JtRmllbGQ6OkdldFNlbGVjdGVkT3B0aW9uSW5kZXgoaW50IGluZGV4KSB7CisgIENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkkiKTsKKyAgaWYgKCFwT2JqKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIENQREZfQXJyYXkqIHBBcnJheSA9IHBPYmotPkdldEFycmF5KCk7CisgIGlmICghcEFycmF5KSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGludCBpQ291bnQgPSAoaW50KXBBcnJheS0+R2V0Q291bnQoKTsKKyAgaWYgKGlDb3VudCA+IDAgJiYgaW5kZXggPCBpQ291bnQpIHsKKyAgICByZXR1cm4gcEFycmF5LT5HZXRJbnRlZ2VyKGluZGV4KTsKKyAgfQorICByZXR1cm4gLTE7Cit9CitGWF9CT09MIENQREZfRm9ybUZpZWxkOjpJc09wdGlvblNlbGVjdGVkKGludCBpT3B0SW5kZXgpIHsKKyAgQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiSSIpOworICBpZiAoIXBPYmopIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1BERl9BcnJheSogcEFycmF5ID0gcE9iai0+R2V0QXJyYXkoKTsKKyAgaWYgKCFwQXJyYXkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW50IGlDb3VudCA9IChpbnQpcEFycmF5LT5HZXRDb3VudCgpOworICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7CisgICAgaWYgKHBBcnJheS0+R2V0SW50ZWdlcihpKSA9PSBpT3B0SW5kZXgpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIENQREZfRm9ybUZpZWxkOjpTZWxlY3RPcHRpb24oaW50IGlPcHRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZWxlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkpIHsKKyAgQ1BERl9BcnJheSogcEFycmF5ID0gbV9wRGljdC0+R2V0QXJyYXkoIkkiKTsKKyAgaWYgKCFwQXJyYXkpIHsKKyAgICBpZiAoIWJTZWxlY3RlZCkgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHBBcnJheSA9IG5ldyBDUERGX0FycmF5OworICAgIG1fcERpY3QtPlNldEF0KCJJIiwgcEFycmF5KTsKKyAgfQorICBGWF9CT09MIGJSZXR1cm4gPSBGQUxTRTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KXBBcnJheS0+R2V0Q291bnQoKTsgaSsrKSB7CisgICAgaW50IGlGaW5kID0gcEFycmF5LT5HZXRJbnRlZ2VyKGkpOworICAgIGlmIChpRmluZCA9PSBpT3B0SW5kZXgpIHsKKyAgICAgIGlmIChiU2VsZWN0ZWQpIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9CisgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5KSB7CisgICAgICAgIGludCBpUmV0ID0gMDsKKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZSA9IEdldE9wdGlvbkxhYmVsKGlPcHRJbmRleCk7CiAgICAgICAgIGlmIChHZXRUeXBlKCkgPT0gTGlzdEJveCkgewotICAgICAgICAgICAgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVNlbGVjdGlvbkNoYW5nZSh0aGlzLCBjc1ZhbHVlKTsKKyAgICAgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlU2VsZWN0aW9uQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOwogICAgICAgICB9CiAgICAgICAgIGlmIChHZXRUeXBlKCkgPT0gQ29tYm9Cb3gpIHsKLSAgICAgICAgICAgIGlSZXQgPSBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVWYWx1ZUNoYW5nZSh0aGlzLCBjc1ZhbHVlKTsKKyAgICAgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgY3NWYWx1ZSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlSZXQgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9Ci0gICAgfQotICAgIG1fcERpY3QtPlJlbW92ZUF0KCJJIik7Ci0gICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSAhPSBOVUxMKSB7CisgICAgICB9CisgICAgICBwQXJyYXktPlJlbW92ZUF0KGkpOworICAgICAgYlJldHVybiA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKGlGaW5kID4gaU9wdEluZGV4KSB7CisgICAgICBpZiAoIWJTZWxlY3RlZCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkpIHsKKyAgICAgICAgaW50IGlSZXQgPSAwOworICAgICAgICBDRlhfV2lkZVN0cmluZyBjc1ZhbHVlID0gR2V0T3B0aW9uTGFiZWwoaU9wdEluZGV4KTsKICAgICAgICAgaWYgKEdldFR5cGUoKSA9PSBMaXN0Qm94KSB7Ci0gICAgICAgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclNlbGVjdGlvbkNoYW5nZSh0aGlzKTsKKyAgICAgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlU2VsZWN0aW9uQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOwogICAgICAgICB9CiAgICAgICAgIGlmIChHZXRUeXBlKCkgPT0gQ29tYm9Cb3gpIHsKLSAgICAgICAgICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyVmFsdWVDaGFuZ2UodGhpcyk7CisgICAgICAgICAgaVJldCA9IG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkJlZm9yZVZhbHVlQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOwogICAgICAgICB9CisgICAgICAgIGlmIChpUmV0IDwgMCkgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgQ1BERl9OdW1iZXIqIHBOdW0gPSBuZXcgQ1BERl9OdW1iZXIoaU9wdEluZGV4KTsKKyAgICAgIHBBcnJheS0+SW5zZXJ0QXQoaSwgcE51bSk7CisgICAgICBiUmV0dXJuID0gVFJVRTsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICBtX3BGb3JtLT5tX2JVcGRhdGVkID0gVFJVRTsKLSAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoIWJSZXR1cm4pIHsKKyAgICBpZiAoYlNlbGVjdGVkKSB7CisgICAgICBwQXJyYXktPkFkZEludGVnZXIoaU9wdEluZGV4KTsKKyAgICB9CisgICAgaWYgKHBBcnJheS0+R2V0Q291bnQoKSA9PSAwKSB7CisgICAgICBtX3BEaWN0LT5SZW1vdmVBdCgiSSIpOworICAgIH0KKyAgfQorICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5KSB7CisgICAgaWYgKEdldFR5cGUoKSA9PSBMaXN0Qm94KSB7CisgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclNlbGVjdGlvbkNoYW5nZSh0aGlzKTsKKyAgICB9CisgICAgaWYgKEdldFR5cGUoKSA9PSBDb21ib0JveCkgeworICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJWYWx1ZUNoYW5nZSh0aGlzKTsKKyAgICB9CisgIH0KKyAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7CisgIHJldHVybiBUUlVFOwogfQotdm9pZCBDUERGX0Zvcm1GaWVsZDo6TG9hZERBKCkKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBEQTsKLSAgICBpZiAoQ1BERl9PYmplY3QqIHBPYmpfdCA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJEQSIpKSB7Ci0gICAgICAgIERBID0gcE9ial90LT5HZXRTdHJpbmcoKTsKK0ZYX0JPT0wgQ1BERl9Gb3JtRmllbGQ6OkNsZWFyU2VsZWN0ZWRPcHRpb25zKEZYX0JPT0wgYk5vdGlmeSkgeworICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5KSB7CisgICAgaW50IGlSZXQgPSAwOworICAgIENGWF9XaWRlU3RyaW5nIGNzVmFsdWU7CisgICAgaW50IGlJbmRleCA9IEdldFNlbGVjdGVkSW5kZXgoMCk7CisgICAgaWYgKGlJbmRleCA+PSAwKSB7CisgICAgICBjc1ZhbHVlID0gR2V0T3B0aW9uTGFiZWwoaUluZGV4KTsKICAgICB9Ci0gICAgaWYgKERBLklzRW1wdHkoKSAmJiBtX3BGb3JtLT5tX3BGb3JtRGljdCkgewotICAgICAgICBEQSA9IG1fcEZvcm0tPm1fcEZvcm1EaWN0LT5HZXRTdHJpbmcoIkRBIik7CisgICAgaWYgKEdldFR5cGUoKSA9PSBMaXN0Qm94KSB7CisgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlU2VsZWN0aW9uQ2hhbmdlKHRoaXMsIGNzVmFsdWUpOwogICAgIH0KLSAgICBpZiAoREEuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAoR2V0VHlwZSgpID09IENvbWJvQm94KSB7CisgICAgICBpUmV0ID0gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgY3NWYWx1ZSk7CiAgICAgfQotICAgIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChEQSk7Ci0gICAgc3ludGF4LkZpbmRUYWdQYXJhbSgiVGYiLCAyKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBmb250X25hbWUgPSBzeW50YXguR2V0V29yZCgpOwotICAgIENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0ID0gTlVMTDsKLSAgICBpZiAobV9wRm9ybS0+bV9wRm9ybURpY3QgJiYgbV9wRm9ybS0+bV9wRm9ybURpY3QtPkdldERpY3QoIkRSIikgJiYKLSAgICAgICAgbV9wRm9ybS0+bV9wRm9ybURpY3QtPkdldERpY3QoIkRSIiktPkdldERpY3QoIkZvbnQiKSApCi0gICAgcEZvbnREaWN0ID0gbV9wRm9ybS0+bV9wRm9ybURpY3QtPkdldERpY3QoIkRSIiktPkdldERpY3QoIkZvbnQiKS0+R2V0RGljdChmb250X25hbWUpOworICAgIGlmIChpUmV0IDwgMCkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorICBtX3BEaWN0LT5SZW1vdmVBdCgiSSIpOworICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5KSB7CisgICAgaWYgKEdldFR5cGUoKSA9PSBMaXN0Qm94KSB7CisgICAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclNlbGVjdGlvbkNoYW5nZSh0aGlzKTsKKyAgICB9CisgICAgaWYgKEdldFR5cGUoKSA9PSBDb21ib0JveCkgeworICAgICAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJWYWx1ZUNoYW5nZSh0aGlzKTsKKyAgICB9CisgIH0KKyAgbV9wRm9ybS0+bV9iVXBkYXRlZCA9IFRSVUU7CisgIHJldHVybiBUUlVFOworfQordm9pZCBDUERGX0Zvcm1GaWVsZDo6TG9hZERBKCkgeworICBDRlhfQnl0ZVN0cmluZyBEQTsKKyAgaWYgKENQREZfT2JqZWN0KiBwT2JqX3QgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiREEiKSkgeworICAgIERBID0gcE9ial90LT5HZXRTdHJpbmcoKTsKKyAgfQorICBpZiAoREEuSXNFbXB0eSgpICYmIG1fcEZvcm0tPm1fcEZvcm1EaWN0KSB7CisgICAgREEgPSBtX3BGb3JtLT5tX3BGb3JtRGljdC0+R2V0U3RyaW5nKCJEQSIpOworICB9CisgIGlmIChEQS5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KERBKTsKKyAgc3ludGF4LkZpbmRUYWdQYXJhbSgiVGYiLCAyKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgZm9udF9uYW1lID0gc3ludGF4LkdldFdvcmQoKTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QgPSBOVUxMOworICBpZiAobV9wRm9ybS0+bV9wRm9ybURpY3QgJiYgbV9wRm9ybS0+bV9wRm9ybURpY3QtPkdldERpY3QoIkRSIikgJiYKKyAgICAgIG1fcEZvcm0tPm1fcEZvcm1EaWN0LT5HZXREaWN0KCJEUiIpLT5HZXREaWN0KCJGb250IikpCisgICAgcEZvbnREaWN0ID0gbV9wRm9ybS0+bV9wRm9ybURpY3QtPkdldERpY3QoIkRSIiktPkdldERpY3QoIkZvbnQiKS0+R2V0RGljdCgKKyAgICAgICAgZm9udF9uYW1lKTsKIAotICAgIGlmIChwRm9udERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fcEZvbnQgPSBtX3BGb3JtLT5tX3BEb2N1bWVudC0+TG9hZEZvbnQocEZvbnREaWN0KTsKLSAgICBtX0ZvbnRTaXplID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKTsKKyAgaWYgKCFwRm9udERpY3QpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wRm9udCA9IG1fcEZvcm0tPm1fcERvY3VtZW50LT5Mb2FkRm9udChwRm9udERpY3QpOworICBtX0ZvbnRTaXplID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX2xpbmsuY3BwIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfbGluay5jcHAKaW5kZXggOWEwOGQxNS4uYjdkZGI3ZSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfbGluay5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfbGluay5jcHAKQEAgLTEsMTA1ICsxLDkwIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9kb2MuaCIKLSNpbmNsdWRlICIuLi8uLi9zcmMvZnhjcnQvZnhfc2FmZV90eXBlcy5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgiCiAKLUNQREZfTGlua0xpc3Q6On5DUERGX0xpbmtMaXN0KCkKLXsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBtX1BhZ2VNYXAuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgRlhfTFBWT0lEIGtleSwgdmFsdWU7Ci0gICAgICAgIG1fUGFnZU1hcC5HZXROZXh0QXNzb2MocG9zLCBrZXksIHZhbHVlKTsKLSAgICAgICAgZGVsZXRlIChDRlhfUHRyQXJyYXkqKXZhbHVlOwotICAgIH0KK0NQREZfTGlua0xpc3Q6OkNQREZfTGlua0xpc3QoKSB7CiB9Ci1DRlhfUHRyQXJyYXkqIENQREZfTGlua0xpc3Q6OkdldFBhZ2VMaW5rcyhDUERGX1BhZ2UqIHBQYWdlKQotewotICAgIEZYX0RXT1JEIG9iam51bSA9IHBQYWdlLT5tX3BGb3JtRGljdC0+R2V0T2JqTnVtKCk7Ci0gICAgaWYgKG9iam51bSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDRlhfUHRyQXJyYXkqIHBQYWdlTGlua0xpc3QgPSBOVUxMOwotICAgIGlmICghbV9QYWdlTWFwLkxvb2t1cCgoRlhfTFBWT0lEKShGWF9VSU5UUFRSKW9iam51bSwgKEZYX0xQVk9JRCYpcFBhZ2VMaW5rTGlzdCkpIHsKLSAgICAgICAgcFBhZ2VMaW5rTGlzdCA9IG5ldyBDRlhfUHRyQXJyYXk7Ci0gICAgICAgIG1fUGFnZU1hcC5TZXRBdCgoRlhfTFBWT0lEKShGWF9VSU5UUFRSKW9iam51bSwgcFBhZ2VMaW5rTGlzdCk7Ci0gICAgICAgIExvYWRQYWdlTGlua3MocFBhZ2UsIHBQYWdlTGlua0xpc3QpOwotICAgIH0KLSAgICByZXR1cm4gcFBhZ2VMaW5rTGlzdDsKKworQ1BERl9MaW5rTGlzdDo6fkNQREZfTGlua0xpc3QoKSB7CiB9Ci1pbnQgQ1BERl9MaW5rTGlzdDo6Q291bnRMaW5rcyhDUERGX1BhZ2UqIHBQYWdlKQotewotICAgIENGWF9QdHJBcnJheSogcFBhZ2VMaW5rTGlzdCA9IEdldFBhZ2VMaW5rcyhwUGFnZSk7Ci0gICAgaWYgKHBQYWdlTGlua0xpc3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHBQYWdlTGlua0xpc3QtPkdldFNpemUoKTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8Q1BERl9EaWN0aW9uYXJ5Kj4qIENQREZfTGlua0xpc3Q6OkdldFBhZ2VMaW5rcygKKyAgICBDUERGX1BhZ2UqIHBQYWdlKSB7CisgIEZYX0RXT1JEIG9iam51bSA9IHBQYWdlLT5tX3BGb3JtRGljdC0+R2V0T2JqTnVtKCk7CisgIGlmIChvYmpudW0gPT0gMCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBhdXRvIGl0ID0gbV9QYWdlTWFwLmZpbmQob2JqbnVtKTsKKyAgaWYgKGl0ICE9IG1fUGFnZU1hcC5lbmQoKSkKKyAgICByZXR1cm4gJml0LT5zZWNvbmQ7CisKKyAgLy8gc3RkOjptYXA6Om9wZXJhdG9yW10gZm9yY2VzIHRoZSBjcmVhdGlvbiBvZiBhIG1hcCBlbnRyeS4KKyAgc3RkOjp2ZWN0b3I8Q1BERl9EaWN0aW9uYXJ5Kj4mIHBhZ2VfbGlua19saXN0ID0gbV9QYWdlTWFwW29iam51bV07CisgIExvYWRQYWdlTGlua3MocFBhZ2UsICZwYWdlX2xpbmtfbGlzdCk7CisgIHJldHVybiAmcGFnZV9saW5rX2xpc3Q7CiB9Ci1DUERGX0xpbmsgQ1BERl9MaW5rTGlzdDo6R2V0TGluayhDUERGX1BhZ2UqIHBQYWdlLCBpbnQgaW5kZXgpCi17Ci0gICAgQ0ZYX1B0ckFycmF5KiBwUGFnZUxpbmtMaXN0ID0gR2V0UGFnZUxpbmtzKHBQYWdlKTsKLSAgICBpZiAoIXBQYWdlTGlua0xpc3QpIHsKLSAgICAgICAgcmV0dXJuIENQREZfTGluaygpOwotICAgIH0KLSAgICByZXR1cm4gQ1BERl9MaW5rKChDUERGX0RpY3Rpb25hcnkqKXBQYWdlTGlua0xpc3QtPkdldEF0KGluZGV4KSk7Ci19Ci1DUERGX0xpbmsgQ1BERl9MaW5rTGlzdDo6R2V0TGlua0F0UG9pbnQoQ1BERl9QYWdlKiBwUGFnZSwgRlhfRkxPQVQgcGRmX3gsIEZYX0ZMT0FUIHBkZl95KQotewotICAgIENGWF9QdHJBcnJheSogcFBhZ2VMaW5rTGlzdCA9IEdldFBhZ2VMaW5rcyhwUGFnZSk7Ci0gICAgaWYgKCFwUGFnZUxpbmtMaXN0KSB7Ci0gICAgICAgIHJldHVybiBDUERGX0xpbmsoKTsKLSAgICB9Ci0gICAgaW50IHNpemUgPSBwUGFnZUxpbmtMaXN0LT5HZXRTaXplKCk7Ci0gICAgZm9yIChpbnQgaSA9IHNpemUgLSAxOyBpID49IDA7IC0taSkgewotICAgICAgICBDUERGX0xpbmsgbGluaygoQ1BERl9EaWN0aW9uYXJ5KilwUGFnZUxpbmtMaXN0LT5HZXRBdChpKSk7Ci0gICAgICAgIENQREZfUmVjdCByZWN0ID0gbGluay5HZXRSZWN0KCk7Ci0gICAgICAgIGlmIChyZWN0LkNvbnRhaW5zKHBkZl94LCBwZGZfeSkpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW5rOwotICAgICAgICB9Ci0gICAgfQorCitDUERGX0xpbmsgQ1BERl9MaW5rTGlzdDo6R2V0TGlua0F0UG9pbnQoQ1BERl9QYWdlKiBwUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwZGZfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwZGZfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHpfb3JkZXIpIHsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Q1BERl9EaWN0aW9uYXJ5Kj4qIHBQYWdlTGlua0xpc3QgPSBHZXRQYWdlTGlua3MocFBhZ2UpOworICBpZiAoIXBQYWdlTGlua0xpc3QpCiAgICAgcmV0dXJuIENQREZfTGluaygpOworCisgIGZvciAoc2l6ZV90IGkgPSBwUGFnZUxpbmtMaXN0LT5zaXplKCk7IGkgPiAwOyAtLWkpIHsKKyAgICBzaXplX3QgYW5ub3RfaW5kZXggPSBpIC0gMTsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdCA9ICgqcFBhZ2VMaW5rTGlzdClbYW5ub3RfaW5kZXhdOworICAgIGlmICghcEFubm90KQorICAgICAgY29udGludWU7CisKKyAgICBDUERGX0xpbmsgbGluayhwQW5ub3QpOworICAgIENQREZfUmVjdCByZWN0ID0gbGluay5HZXRSZWN0KCk7CisgICAgaWYgKCFyZWN0LkNvbnRhaW5zKHBkZl94LCBwZGZfeSkpCisgICAgICBjb250aW51ZTsKKworICAgIGlmICh6X29yZGVyKQorICAgICAgKnpfb3JkZXIgPSBhbm5vdF9pbmRleDsKKyAgICByZXR1cm4gbGluazsKKyAgfQorICByZXR1cm4gQ1BERl9MaW5rKCk7CiB9Ci12b2lkIENQREZfTGlua0xpc3Q6OkxvYWRQYWdlTGlua3MoQ1BERl9QYWdlKiBwUGFnZSwgQ0ZYX1B0ckFycmF5KiBwTGlzdCkKLXsKLSAgICBDUERGX0FycmF5KiBwQW5ub3RMaXN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRBcnJheSgiQW5ub3RzIik7Ci0gICAgaWYgKHBBbm5vdExpc3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwQW5ub3RMaXN0LT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcEFubm90ID0gcEFubm90TGlzdC0+R2V0RGljdChpKTsKLSAgICAgICAgaWYgKHBBbm5vdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocEFubm90LT5HZXRTdHJpbmcoIlN1YnR5cGUiKSAhPSAiTGluayIpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHBMaXN0LT5BZGQocEFubm90KTsKLSAgICB9CisKK3ZvaWQgQ1BERl9MaW5rTGlzdDo6TG9hZFBhZ2VMaW5rcyhDUERGX1BhZ2UqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPENQREZfRGljdGlvbmFyeSo+KiBwTGlzdCkgeworICBDUERGX0FycmF5KiBwQW5ub3RMaXN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRBcnJheSgiQW5ub3RzIik7CisgIGlmICghcEFubm90TGlzdCkKKyAgICByZXR1cm47CisKKyAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBBbm5vdExpc3QtPkdldENvdW50KCk7ICsraSkgeworICAgIENQREZfRGljdGlvbmFyeSogcEFubm90ID0gcEFubm90TGlzdC0+R2V0RGljdChpKTsKKyAgICBib29sIGFkZF9saW5rID0gKHBBbm5vdCAmJiBwQW5ub3QtPkdldFN0cmluZygiU3VidHlwZSIpID09ICJMaW5rIik7CisgICAgLy8gQWRkIG5vbi1saW5rcyBhcyBudWxscHRycyB0byBwcmVzZXJ2ZSB6LW9yZGVyLgorICAgIHBMaXN0LT5wdXNoX2JhY2soYWRkX2xpbmsgPyBwQW5ub3QgOiBudWxscHRyKTsKKyAgfQogfQotQ1BERl9SZWN0IENQREZfTGluazo6R2V0UmVjdCgpCi17Ci0gICAgcmV0dXJuIG1fcERpY3QtPkdldFJlY3QoIlJlY3QiKTsKKworQ1BERl9SZWN0IENQREZfTGluazo6R2V0UmVjdCgpIHsKKyAgcmV0dXJuIG1fcERpY3QtPkdldFJlY3QoIlJlY3QiKTsKIH0KLUNQREZfRGVzdCBDUERGX0xpbms6OkdldERlc3QoQ1BERl9Eb2N1bWVudCogcERvYykKLXsKLSAgICBDUERGX09iamVjdCogcERlc3QgPSBtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoIkRlc3QiKTsKLSAgICBpZiAocERlc3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQ1BERl9EZXN0KCk7Ci0gICAgfQotICAgIGlmIChwRGVzdC0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJJTkcgfHwgcERlc3QtPkdldFR5cGUoKSA9PSBQREZPQkpfTkFNRSkgewotICAgICAgICBDUERGX05hbWVUcmVlIG5hbWVfdHJlZShwRG9jLCBGWF9CU1RSQygiRGVzdHMiKSk7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nQyBuYW1lID0gcERlc3QtPkdldFN0cmluZygpOwotICAgICAgICByZXR1cm4gQ1BERl9EZXN0KG5hbWVfdHJlZS5Mb29rdXBOYW1lZERlc3QocERvYywgbmFtZSkpOwotICAgIH0KLSAgICBpZiAocERlc3QtPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgcmV0dXJuIENQREZfRGVzdCgoQ1BERl9BcnJheSopcERlc3QpOwotICAgIH0KK0NQREZfRGVzdCBDUERGX0xpbms6OkdldERlc3QoQ1BERl9Eb2N1bWVudCogcERvYykgeworICBDUERGX09iamVjdCogcERlc3QgPSBtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoIkRlc3QiKTsKKyAgaWYgKCFwRGVzdCkKICAgICByZXR1cm4gQ1BERl9EZXN0KCk7CisKKyAgaWYgKHBEZXN0LT5Jc1N0cmluZygpIHx8IHBEZXN0LT5Jc05hbWUoKSkgeworICAgIENQREZfTmFtZVRyZWUgbmFtZV90cmVlKHBEb2MsICJEZXN0cyIpOworICAgIENGWF9CeXRlU3RyaW5nQyBuYW1lID0gcERlc3QtPkdldFN0cmluZygpOworICAgIHJldHVybiBDUERGX0Rlc3QobmFtZV90cmVlLkxvb2t1cE5hbWVkRGVzdChwRG9jLCBuYW1lKSk7CisgIH0KKyAgaWYgKENQREZfQXJyYXkqIHBBcnJheSA9IHBEZXN0LT5Bc0FycmF5KCkpCisgICAgcmV0dXJuIENQREZfRGVzdChwQXJyYXkpOworICByZXR1cm4gQ1BERl9EZXN0KCk7CiB9Ci1DUERGX0FjdGlvbiBDUERGX0xpbms6OkdldEFjdGlvbigpCi17Ci0gICAgcmV0dXJuIENQREZfQWN0aW9uKG1fcERpY3QtPkdldERpY3QoIkEiKSk7CitDUERGX0FjdGlvbiBDUERGX0xpbms6OkdldEFjdGlvbigpIHsKKyAgcmV0dXJuIENQREZfQWN0aW9uKG1fcERpY3QtPkdldERpY3QoIkEiKSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY19tZXRhZGF0YS5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19tZXRhZGF0YS5jcHAKaW5kZXggZTZjN2E2NC4uZjI1MDA3MyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfbWV0YWRhdGEuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX21ldGFkYXRhLmNwcApAQCAtMSwxNDggKzEsMjggQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfeG1sLmgiCi10eXBlZGVmIHN0cnVjdCBfUERGRE9DX01FVEFEQVRBIHsKLSAgICBDUERGX0RvY3VtZW50ICptX3BEb2M7Ci0gICAgQ1hNTF9FbGVtZW50ICptX3BYbWxFbG1udDsKLSAgICBDWE1MX0VsZW1lbnQgKm1fcEVsbW50UmRmOwotICAgIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyICptX3BTdHJpbmdNYXA7Ci19IFBERkRPQ19NRVRBREFUQSwgKiBQREZET0NfTFBNRVRBREFUQTsKLXR5cGVkZWYgUERGRE9DX01FVEFEQVRBIGNvbnN0ICogUERGRE9DX0xQQ01FVEFEQVRBOwotY29uc3QgRlhfTFBDU1RSIGdzX0ZQREZET0NfTWV0YWRhdGFfVGl0bGVzW10gPSB7Ci0gICAgIlRpdGxlIiwgInRpdGxlIiwKLSAgICAiU3ViamVjdCIsICJkZXNjcmlwdGlvbiIsCi0gICAgIkF1dGhvciIsICJjcmVhdG9yIiwKLSAgICAiS2V5d29yZHMiLCAiS2V5d29yZHMiLAotICAgICJQcm9kdWNlciIsICJQcm9kdWNlciIsCi0gICAgIkNyZWF0b3IiLCAiQ3JlYXRvclRvb2wiLAotICAgICJDcmVhdGlvbkRhdGUiLCAiQ3JlYXRlRGF0ZSIsCi0gICAgIk1vZERhdGUiLCAiTW9kaWZ5RGF0ZSIsCi0gICAgIk1ldGFkYXRhRGF0ZSIsICJNZXRhZGF0YURhdGUiCi19OwotQ1BERl9NZXRhZGF0YTo6Q1BERl9NZXRhZGF0YSgpCi17Ci0gICAgbV9wRGF0YSA9IEZYX0FsbG9jKFBERkRPQ19NRVRBREFUQSwgMSk7Ci0gICAgQ0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHIgKiZwU3RyaW5nTWFwID0gKChQREZET0NfTFBNRVRBREFUQSltX3BEYXRhKS0+bV9wU3RyaW5nTWFwOwotICAgIHBTdHJpbmdNYXAgPSBuZXcgQ0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHI7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYnN0cjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDE4OyBpICs9IDIpIHsKLSAgICAgICAgYnN0ciA9IGdzX0ZQREZET0NfTWV0YWRhdGFfVGl0bGVzW2ldOwotICAgICAgICBwU3RyaW5nTWFwLT5BZGRWYWx1ZShic3RyLCAodm9pZCopZ3NfRlBERkRPQ19NZXRhZGF0YV9UaXRsZXNbaSArIDFdKTsKLSAgICB9CisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9kb2MuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfeG1sLmgiCiAKK0NQREZfTWV0YWRhdGE6OkNQREZfTWV0YWRhdGEoQ1BERl9Eb2N1bWVudCogcERvYykgeworICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gcERvYy0+R2V0Um9vdCgpOworICBpZiAoIXBSb290KQorICAgIHJldHVybjsKKworICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IHBSb290LT5HZXRTdHJlYW0oIk1ldGFkYXRhIik7CisgIGlmICghcFN0cmVhbSkKKyAgICByZXR1cm47CisKKyAgQ1BERl9TdHJlYW1BY2MgYWNjOworICBhY2MuTG9hZEFsbERhdGEocFN0cmVhbSwgRkFMU0UpOworICBtX3BYbWxFbGVtZW50LnJlc2V0KENYTUxfRWxlbWVudDo6UGFyc2UoYWNjLkdldERhdGEoKSwgYWNjLkdldFNpemUoKSkpOwogfQotQ1BERl9NZXRhZGF0YTo6fkNQREZfTWV0YWRhdGEoKQotewotICAgIEZYU1lTX2Fzc2VydChtX3BEYXRhICE9IE5VTEwpOwotICAgIENYTUxfRWxlbWVudCAqJnAgPSAoKFBERkRPQ19MUE1FVEFEQVRBKW1fcERhdGEpLT5tX3BYbWxFbG1udDsKLSAgICBkZWxldGUgcDsKLSAgICBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0ciAqcFN0cmluZ01hcCA9ICgoUERGRE9DX0xQTUVUQURBVEEpbV9wRGF0YSktPm1fcFN0cmluZ01hcDsKLSAgICBpZiAocFN0cmluZ01hcCkgewotICAgICAgICBwU3RyaW5nTWFwLT5SZW1vdmVBbGwoKTsKLSAgICAgICAgZGVsZXRlIHBTdHJpbmdNYXA7Ci0gICAgfQotICAgIEZYX0ZyZWUobV9wRGF0YSk7Ci19Ci12b2lkIENQREZfTWV0YWRhdGE6OkxvYWREb2MoQ1BERl9Eb2N1bWVudCAqcERvYykKLXsKLSAgICBGWFNZU19hc3NlcnQocERvYyAhPSBOVUxMKTsKLSAgICAoKFBERkRPQ19MUE1FVEFEQVRBKW1fcERhdGEpLT5tX3BEb2MgPSBwRG9jOwotICAgIENQREZfRGljdGlvbmFyeSAqcFJvb3QgPSBwRG9jLT5HZXRSb290KCk7Ci0gICAgQ1BERl9TdHJlYW0gKnBTdHJlYW0gPSBwUm9vdC0+R2V0U3RyZWFtKEZYX0JTVFJDKCJNZXRhZGF0YSIpKTsKLSAgICBpZiAoIXBTdHJlYW0pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX1N0cmVhbUFjYyBhY2M7Ci0gICAgYWNjLkxvYWRBbGxEYXRhKHBTdHJlYW0sIEZBTFNFKTsKLSAgICBpbnQgc2l6ZSA9IGFjYy5HZXRTaXplKCk7Ci0gICAgRlhfTFBDQllURSBwQnVmID0gYWNjLkdldERhdGEoKTsKLSAgICBDWE1MX0VsZW1lbnQgKiZwWG1sRWxtbnQgPSAoKFBERkRPQ19MUE1FVEFEQVRBKW1fcERhdGEpLT5tX3BYbWxFbG1udDsKLSAgICBwWG1sRWxtbnQgPSBDWE1MX0VsZW1lbnQ6OlBhcnNlKHBCdWYsIHNpemUpOwotICAgIGlmICghcFhtbEVsbW50KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1hNTF9FbGVtZW50IComcEVsbW50UmRmID0gKChQREZET0NfTFBNRVRBREFUQSltX3BEYXRhKS0+bV9wRWxtbnRSZGY7Ci0gICAgaWYgKHBYbWxFbG1udC0+R2V0VGFnTmFtZSgpID09IEZYX0JTVFJDKCJSREYiKSkgewotICAgICAgICBwRWxtbnRSZGYgPSBwWG1sRWxtbnQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcEVsbW50UmRmID0gcFhtbEVsbW50LT5HZXRFbGVtZW50KE5VTEwsIEZYX0JTVFJDKCJSREYiKSk7Ci0gICAgfQotfQotRlhfSU5UMzIgQ1BERl9NZXRhZGF0YTo6R2V0U3RyaW5nKEZYX0JTVFIgYnNJdGVtLCBDRlhfV2lkZVN0cmluZyAmd3NTdHIpCi17Ci0gICAgaWYgKCEoKFBERkRPQ19MUE1FVEFEQVRBKW1fcERhdGEpLT5tX3BYbWxFbG1udCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmICghKChQREZET0NfTFBNRVRBREFUQSltX3BEYXRhKS0+bV9wU3RyaW5nTWFwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgdm9pZCAqc3pUYWc7Ci0gICAgaWYgKCEoKFBERkRPQ19MUE1FVEFEQVRBKW1fcERhdGEpLT5tX3BTdHJpbmdNYXAtPkxvb2t1cChic0l0ZW0sIHN6VGFnKSkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGJzVGFnID0gKEZYX0xQQ1NUUilzelRhZzsKLSAgICB3c1N0ciA9IEwiIjsKLSAgICBDWE1MX0VsZW1lbnQgKnBFbG1udFJkZiA9ICgoUERGRE9DX0xQTUVUQURBVEEpbV9wRGF0YSktPm1fcEVsbW50UmRmOwotICAgIGlmICghcEVsbW50UmRmKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaW50IG5DaGlsZCA9IHBFbG1udFJkZi0+Q291bnRDaGlsZHJlbigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNoaWxkOyBpKyspIHsKLSAgICAgICAgQ1hNTF9FbGVtZW50ICpwVGFnID0gcEVsbW50UmRmLT5HZXRFbGVtZW50KE5VTEwsIEZYX0JTVFJDKCJEZXNjcmlwdGlvbiIpLCBpKTsKLSAgICAgICAgaWYgKCFwVGFnKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnNJdGVtID09IEZYX0JTVFJDKCJUaXRsZSIpIHx8IGJzSXRlbSA9PSBGWF9CU1RSQygiU3ViamVjdCIpKSB7Ci0gICAgICAgICAgICBDWE1MX0VsZW1lbnQgKnBFbG1udCA9IHBUYWctPkdldEVsZW1lbnQoTlVMTCwgYnNUYWcpOwotICAgICAgICAgICAgaWYgKCFwRWxtbnQpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBFbG1udCA9IHBFbG1udC0+R2V0RWxlbWVudChOVUxMLCBGWF9CU1RSQygiQWx0IikpOwotICAgICAgICAgICAgaWYgKCFwRWxtbnQpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBFbG1udCA9IHBFbG1udC0+R2V0RWxlbWVudChOVUxMLCBGWF9CU1RSQygibGkiKSk7Ci0gICAgICAgICAgICBpZiAoIXBFbG1udCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd3NTdHIgPSBwRWxtbnQtPkdldENvbnRlbnQoMCk7Ci0gICAgICAgICAgICByZXR1cm4gd3NTdHIuR2V0TGVuZ3RoKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYnNJdGVtID09IEZYX0JTVFJDKCJBdXRob3IiKSkgewotICAgICAgICAgICAgQ1hNTF9FbGVtZW50ICpwRWxtbnQgPSBwVGFnLT5HZXRFbGVtZW50KE5VTEwsIGJzVGFnKTsKLSAgICAgICAgICAgIGlmICghcEVsbW50KSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRWxtbnQgPSBwRWxtbnQtPkdldEVsZW1lbnQoTlVMTCwgRlhfQlNUUkMoIlNlcSIpKTsKLSAgICAgICAgICAgIGlmICghcEVsbW50KSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRWxtbnQgPSBwRWxtbnQtPkdldEVsZW1lbnQoTlVMTCwgRlhfQlNUUkMoImxpIikpOwotICAgICAgICAgICAgaWYgKCFwRWxtbnQpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdzU3RyID0gcEVsbW50LT5HZXRDb250ZW50KDApOwotICAgICAgICAgICAgcmV0dXJuIHdzU3RyLkdldExlbmd0aCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ1hNTF9FbGVtZW50ICpwRWxtbnQgPSBwVGFnLT5HZXRFbGVtZW50KE5VTEwsIGJzVGFnKTsKLSAgICAgICAgICAgIGlmICghcEVsbW50KSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3c1N0ciA9IHBFbG1udC0+R2V0Q29udGVudCgwKTsKLSAgICAgICAgICAgIHJldHVybiB3c1N0ci5HZXRMZW5ndGgoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci1DWE1MX0VsZW1lbnQqIENQREZfTWV0YWRhdGE6OkdldFJvb3QoKSBjb25zdAotewotICAgIHJldHVybiAoKFBERkRPQ19MUE1FVEFEQVRBKW1fcERhdGEpLT5tX3BYbWxFbG1udDsKLX0KLUNYTUxfRWxlbWVudCogQ1BERl9NZXRhZGF0YTo6R2V0UkRGKCkgY29uc3QKLXsKLSAgICByZXR1cm4gKChQREZET0NfTFBNRVRBREFUQSltX3BEYXRhKS0+bV9wRWxtbnRSZGY7CisKK0NQREZfTWV0YWRhdGE6On5DUERGX01ldGFkYXRhKCkge30KKworY29uc3QgQ1hNTF9FbGVtZW50KiBDUERGX01ldGFkYXRhOjpHZXRSb290KCkgY29uc3QgeworICByZXR1cm4gbV9wWG1sRWxlbWVudC5nZXQoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX29jZy5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY19vY2cuY3BwCmluZGV4IDBjYTlmYzAuLjUzOWMwMzggMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX29jZy5jcHAKKysrIGIvY29yZS9zcmMvZnBkZmRvYy9kb2Nfb2NnLmNwcApAQCAtMSwzMDAgKzEsMjgyIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9kb2MuaCIKLXN0YXRpYyBGWF9JTlQzMiBGUERGRE9DX09DR19GaW5kR3JvdXAoY29uc3QgQ1BERl9PYmplY3QgKnBPYmplY3QsIGNvbnN0IENQREZfRGljdGlvbmFyeSAqcEdyb3VwRGljdCkKLXsKLSAgICBpZiAocE9iamVjdCA9PSBOVUxMIHx8IHBHcm91cERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIEZYX0lOVDMyIGlUeXBlID0gcE9iamVjdC0+R2V0VHlwZSgpOwotICAgIGlmIChpVHlwZSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgRlhfRFdPUkQgZHdDb3VudCA9ICgoQ1BERl9BcnJheSopcE9iamVjdCktPkdldENvdW50KCk7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBkd0NvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGlmICgoKENQREZfQXJyYXkqKXBPYmplY3QpLT5HZXREaWN0KGkpID09IHBHcm91cERpY3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChwT2JqZWN0LT5HZXREaWN0KCkgPT0gcEdyb3VwRGljdCkgewotICAgICAgICByZXR1cm4gMDsKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oIgorCitzdGF0aWMgaW50MzJfdCBGUERGRE9DX09DR19GaW5kR3JvdXAoY29uc3QgQ1BERl9PYmplY3QqIHBPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwR3JvdXBEaWN0KSB7CisgIGlmICghcE9iamVjdCB8fCAhcEdyb3VwRGljdCkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKGNvbnN0IENQREZfQXJyYXkqIHBBcnJheSA9IHBPYmplY3QtPkFzQXJyYXkoKSkgeworICAgIEZYX0RXT1JEIGR3Q291bnQgPSBwQXJyYXktPkdldENvdW50KCk7CisgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGR3Q291bnQ7IGkrKykgeworICAgICAgaWYgKHBBcnJheS0+R2V0RGljdChpKSA9PSBwR3JvdXBEaWN0KQorICAgICAgICByZXR1cm4gaTsKICAgICB9CiAgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiBwT2JqZWN0LT5HZXREaWN0KCkgPT0gcEdyb3VwRGljdCA/IDAgOiAtMTsKIH0KLXN0YXRpYyBGWF9CT09MIEZQREZET0NfT0NHX0hhc0ludGVudChjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBEaWN0LCBGWF9CU1RSIGNzRWxlbWVudCwgRlhfQlNUUiBjc0RlZiA9IEZYX0JTVFJDKCIiKSkKLXsKLSAgICBGWFNZU19hc3NlcnQocERpY3QgIT0gTlVMTCk7Ci0gICAgQ1BERl9PYmplY3QgKnBJbnRlbnQgPSBwRGljdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJJbnRlbnQiKSk7Ci0gICAgaWYgKHBJbnRlbnQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gY3NFbGVtZW50ID09IGNzRGVmOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBic0ludGVudDsKLSAgICBpZiAocEludGVudC0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICBGWF9EV09SRCBkd0NvdW50ID0gKChDUERGX0FycmF5KilwSW50ZW50KS0+R2V0Q291bnQoKTsKLSAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGR3Q291bnQ7IGkrKykgewotICAgICAgICAgICAgYnNJbnRlbnQgPSAoKENQREZfQXJyYXkqKXBJbnRlbnQpLT5HZXRTdHJpbmcoaSk7Ci0gICAgICAgICAgICBpZiAoYnNJbnRlbnQgPT0gRlhfQlNUUkMoIkFsbCIpIHx8IGJzSW50ZW50ID09IGNzRWxlbWVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgYnNJbnRlbnQgPSBwSW50ZW50LT5HZXRTdHJpbmcoKTsKLSAgICByZXR1cm4gYnNJbnRlbnQgPT0gRlhfQlNUUkMoIkFsbCIpIHx8IGJzSW50ZW50ID09IGNzRWxlbWVudDsKLX0KLXN0YXRpYyBDUERGX0RpY3Rpb25hcnkqIEZQREZET0NfT0NHX0dldENvbmZpZyhDUERGX0RvY3VtZW50ICpwRG9jLCBjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ0dEaWN0LCBGWF9CU1RSIGJzU3RhdGUpCi17Ci0gICAgRlhTWVNfYXNzZXJ0KHBEb2MgJiYgcE9DR0RpY3QpOwotICAgIENQREZfRGljdGlvbmFyeSAqcE9DUHJvcGVydGllcyA9IHBEb2MtPkdldFJvb3QoKS0+R2V0RGljdChGWF9CU1RSQygiT0NQcm9wZXJ0aWVzIikpOwotICAgIGlmICghcE9DUHJvcGVydGllcykgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSAqcE9DR3MgPSBwT0NQcm9wZXJ0aWVzLT5HZXRBcnJheShGWF9CU1RSQygiT0NHcyIpKTsKLSAgICBpZiAoIXBPQ0dzKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoRlBERkRPQ19PQ0dfRmluZEdyb3VwKHBPQ0dzLCBwT0NHRGljdCkgPCAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkgKnBDb25maWcgPSBwT0NQcm9wZXJ0aWVzLT5HZXREaWN0KEZYX0JTVFJDKCJEIikpOwotICAgIENQREZfQXJyYXkgKnBDb25maWdzID0gcE9DUHJvcGVydGllcy0+R2V0QXJyYXkoRlhfQlNUUkMoIkNvbmZpZ3MiKSk7Ci0gICAgaWYgKHBDb25maWdzKSB7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSAqcEZpbmQ7Ci0gICAgICAgIEZYX0lOVDMyIGlDb3VudCA9IHBDb25maWdzLT5HZXRDb3VudCgpOwotICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICBwRmluZCA9IHBDb25maWdzLT5HZXREaWN0KGkpOwotICAgICAgICAgICAgaWYgKCFwRmluZCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFGUERGRE9DX09DR19IYXNJbnRlbnQocEZpbmQsIEZYX0JTVFJDKCJWaWV3IiksIEZYX0JTVFJDKCJWaWV3IikpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwQ29uZmlnID0gcEZpbmQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcENvbmZpZzsKLX0KLXN0YXRpYyBDRlhfQnl0ZVN0cmluZyBGUERGRE9DX09DR19HZXRVc2FnZVR5cGVTdHJpbmcoQ1BERl9PQ0NvbnRleHQ6OlVzYWdlVHlwZSBlVHlwZSkKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc1N0YXRlID0gRlhfQlNUUkMoIlZpZXciKTsKLSAgICBpZiAoZVR5cGUgPT0gQ1BERl9PQ0NvbnRleHQ6OkRlc2lnbikgewotICAgICAgICBjc1N0YXRlID0gRlhfQlNUUkMoIkRlc2lnbiIpOwotICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gQ1BERl9PQ0NvbnRleHQ6OlByaW50KSB7Ci0gICAgICAgIGNzU3RhdGUgPSBGWF9CU1RSQygiUHJpbnQiKTsKLSAgICB9IGVsc2UgaWYgKGVUeXBlID09IENQREZfT0NDb250ZXh0OjpFeHBvcnQpIHsKLSAgICAgICAgY3NTdGF0ZSA9IEZYX0JTVFJDKCJFeHBvcnQiKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNzU3RhdGU7Ci19Ci1DUERGX09DQ29udGV4dDo6Q1BERl9PQ0NvbnRleHQoQ1BERl9Eb2N1bWVudCAqcERvYywgVXNhZ2VUeXBlIGVVc2FnZVR5cGUpCi17Ci0gICAgRlhTWVNfYXNzZXJ0KHBEb2MgIT0gTlVMTCk7Ci0gICAgbV9wRG9jdW1lbnQgPSBwRG9jOwotICAgIG1fZVVzYWdlVHlwZSA9IGVVc2FnZVR5cGU7Ci19Ci1DUERGX09DQ29udGV4dDo6fkNQREZfT0NDb250ZXh0KCkKLXsKLSAgICBtX09DR1N0YXRlcy5SZW1vdmVBbGwoKTsKLX0KLUZYX0JPT0wgQ1BERl9PQ0NvbnRleHQ6OkxvYWRPQ0dTdGF0ZUZyb21Db25maWcoRlhfQlNUUiBjc0NvbmZpZywgY29uc3QgQ1BERl9EaWN0aW9uYXJ5ICpwT0NHRGljdCwgRlhfQk9PTCAmYlZhbGlkQ29uZmlnKSBjb25zdAotewotICAgIENQREZfRGljdGlvbmFyeSAqcENvbmZpZyA9IEZQREZET0NfT0NHX0dldENvbmZpZyhtX3BEb2N1bWVudCwgcE9DR0RpY3QsIGNzQ29uZmlnKTsKLSAgICBpZiAoIXBDb25maWcpIHsKK3N0YXRpYyBGWF9CT09MIEZQREZET0NfT0NHX0hhc0ludGVudChjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NEZWYgPSAiIikgeworICBDUERGX09iamVjdCogcEludGVudCA9IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoIkludGVudCIpOworICBpZiAoIXBJbnRlbnQpIHsKKyAgICByZXR1cm4gY3NFbGVtZW50ID09IGNzRGVmOworICB9CisgIENGWF9CeXRlU3RyaW5nIGJzSW50ZW50OworICBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcEludGVudC0+QXNBcnJheSgpKSB7CisgICAgRlhfRFdPUkQgZHdDb3VudCA9IHBBcnJheS0+R2V0Q291bnQoKTsKKyAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgZHdDb3VudDsgaSsrKSB7CisgICAgICBic0ludGVudCA9IHBBcnJheS0+R2V0U3RyaW5nKGkpOworICAgICAgaWYgKGJzSW50ZW50ID09ICJBbGwiIHx8IGJzSW50ZW50ID09IGNzRWxlbWVudCkKICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIGJWYWxpZENvbmZpZyA9IFRSVUU7Ci0gICAgRlhfQk9PTCBiU3RhdGUgPSBwQ29uZmlnLT5HZXRTdHJpbmcoRlhfQlNUUkMoIkJhc2VTdGF0ZSIpLCBGWF9CU1RSQygiT04iKSkgIT0gRlhfQlNUUkMoIk9GRiIpOwotICAgIENQREZfQXJyYXkgKnBBcnJheSA9IHBDb25maWctPkdldEFycmF5KEZYX0JTVFJDKCJPTiIpKTsKLSAgICBpZiAocEFycmF5KSB7Ci0gICAgICAgIGlmIChGUERGRE9DX09DR19GaW5kR3JvdXAocEFycmF5LCBwT0NHRGljdCkgPj0gMCkgewotICAgICAgICAgICAgYlN0YXRlID0gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwQXJyYXkgPSBwQ29uZmlnLT5HZXRBcnJheShGWF9CU1RSQygiT0ZGIikpOwotICAgIGlmIChwQXJyYXkpIHsKLSAgICAgICAgaWYgKEZQREZET0NfT0NHX0ZpbmRHcm91cChwQXJyYXksIHBPQ0dEaWN0KSA+PSAwKSB7Ci0gICAgICAgICAgICBiU3RhdGUgPSBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwQXJyYXkgPSBwQ29uZmlnLT5HZXRBcnJheShGWF9CU1RSQygiQVMiKSk7Ci0gICAgaWYgKHBBcnJheSkgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBjc0ZpbmQgPSBjc0NvbmZpZyArIEZYX0JTVFJDKCJTdGF0ZSIpOwotICAgICAgICBGWF9JTlQzMiBpQ291bnQgPSBwQXJyYXktPkdldENvdW50KCk7Ci0gICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSAqcFVzYWdlID0gcEFycmF5LT5HZXREaWN0KGkpOwotICAgICAgICAgICAgaWYgKCFwVXNhZ2UpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwVXNhZ2UtPkdldFN0cmluZyhGWF9CU1RSQygiRXZlbnQiKSwgRlhfQlNUUkMoIlZpZXciKSkgIT0gY3NDb25maWcpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENQREZfQXJyYXkgKnBPQ0dzID0gcFVzYWdlLT5HZXRBcnJheShGWF9CU1RSQygiT0NHcyIpKTsKLSAgICAgICAgICAgIGlmICghcE9DR3MpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChGUERGRE9DX09DR19GaW5kR3JvdXAocE9DR3MsIHBPQ0dEaWN0KSA8IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSAqcFN0YXRlID0gcFVzYWdlLT5HZXREaWN0KGNzQ29uZmlnKTsKLSAgICAgICAgICAgIGlmICghcFN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiU3RhdGUgPSBwU3RhdGUtPkdldFN0cmluZyhjc0ZpbmQpICE9IEZYX0JTVFJDKCJPRkYiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYlN0YXRlOwotfQotRlhfQk9PTCBDUERGX09DQ29udGV4dDo6TG9hZE9DR1N0YXRlKGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DR0RpY3QpIGNvbnN0Ci17Ci0gICAgaWYgKCFGUERGRE9DX09DR19IYXNJbnRlbnQocE9DR0RpY3QsIEZYX0JTVFJDKCJWaWV3IiksIEZYX0JTVFJDKCJWaWV3IikpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBjc1N0YXRlID0gRlBERkRPQ19PQ0dfR2V0VXNhZ2VUeXBlU3RyaW5nKG1fZVVzYWdlVHlwZSk7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5ICpwVXNhZ2UgPSBwT0NHRGljdC0+R2V0RGljdChGWF9CU1RSQygiVXNhZ2UiKSk7Ci0gICAgaWYgKHBVc2FnZSkgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkgKnBTdGF0ZSA9IHBVc2FnZS0+R2V0RGljdChjc1N0YXRlKTsKLSAgICAgICAgaWYgKHBTdGF0ZSkgewotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NGaW5kID0gY3NTdGF0ZSArIEZYX0JTVFJDKCJTdGF0ZSIpOwotICAgICAgICAgICAgaWYgKHBTdGF0ZS0+S2V5RXhpc3QoY3NGaW5kKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBwU3RhdGUtPkdldFN0cmluZyhjc0ZpbmQpICE9IEZYX0JTVFJDKCJPRkYiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoY3NTdGF0ZSAhPSBGWF9CU1RSQygiVmlldyIpKSB7Ci0gICAgICAgICAgICBwU3RhdGUgPSBwVXNhZ2UtPkdldERpY3QoRlhfQlNUUkMoIlZpZXciKSk7Ci0gICAgICAgICAgICBpZiAocFN0YXRlICYmIHBTdGF0ZS0+S2V5RXhpc3QoRlhfQlNUUkMoIlZpZXdTdGF0ZSIpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBwU3RhdGUtPkdldFN0cmluZyhGWF9CU1RSQygiVmlld1N0YXRlIikpICE9IEZYX0JTVFJDKCJPRkYiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBGWF9CT09MIGJEZWZWYWxpZCA9IEZBTFNFOwotICAgIHJldHVybiBMb2FkT0NHU3RhdGVGcm9tQ29uZmlnKGNzU3RhdGUsIHBPQ0dEaWN0LCBiRGVmVmFsaWQpOwotfQotRlhfQk9PTCBDUERGX09DQ29udGV4dDo6R2V0T0NHVmlzaWJsZShjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ0dEaWN0KQotewotICAgIGlmICghcE9DR0RpY3QpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9MUFZPSUQgYlN0YXRlID0gTlVMTDsKLSAgICBpZiAobV9PQ0dTdGF0ZXMuTG9va3VwKHBPQ0dEaWN0LCBiU3RhdGUpKSB7Ci0gICAgICAgIHJldHVybiAoRlhfVUlOVFBUUiliU3RhdGUgIT0gMDsKLSAgICB9Ci0gICAgYlN0YXRlID0gKEZYX0xQVk9JRCkoRlhfVUlOVFBUUilMb2FkT0NHU3RhdGUocE9DR0RpY3QpOwotICAgIG1fT0NHU3RhdGVzLlNldEF0KHBPQ0dEaWN0LCBiU3RhdGUpOwotICAgIHJldHVybiAoRlhfVUlOVFBUUiliU3RhdGUgIT0gMDsKLX0KLUZYX0JPT0wgQ1BERl9PQ0NvbnRleHQ6OkdldE9DR1ZFKENQREZfQXJyYXkgKnBFeHByZXNzaW9uLCBGWF9CT09MIGJGcm9tQ29uZmlnLCBpbnQgbkxldmVsKQotewotICAgIGlmIChuTGV2ZWwgPiAzMikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChwRXhwcmVzc2lvbiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfSU5UMzIgaUNvdW50ID0gcEV4cHJlc3Npb24tPkdldENvdW50KCk7Ci0gICAgQ1BERl9PYmplY3QgKnBPQ0dPYmo7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NPcGVyYXRvciA9IHBFeHByZXNzaW9uLT5HZXRTdHJpbmcoMCk7Ci0gICAgaWYgKGNzT3BlcmF0b3IgPT0gRlhfQlNUUkMoIk5vdCIpKSB7Ci0gICAgICAgIHBPQ0dPYmogPSBwRXhwcmVzc2lvbi0+R2V0RWxlbWVudFZhbHVlKDEpOwotICAgICAgICBpZiAocE9DR09iaiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBPQ0dPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICAgICAgcmV0dXJuICEoYkZyb21Db25maWcgPyBMb2FkT0NHU3RhdGUoKENQREZfRGljdGlvbmFyeSopcE9DR09iaikgOiBHZXRPQ0dWaXNpYmxlKChDUERGX0RpY3Rpb25hcnkqKXBPQ0dPYmopKTsKLSAgICAgICAgfSBlbHNlIGlmIChwT0NHT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgICAgICByZXR1cm4gIUdldE9DR1ZFKChDUERGX0FycmF5KilwT0NHT2JqLCBiRnJvbUNvbmZpZywgbkxldmVsICsgMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGNzT3BlcmF0b3IgPT0gRlhfQlNUUkMoIk9yIikgfHwgY3NPcGVyYXRvciA9PSBGWF9CU1RSQygiQW5kIikpIHsKLSAgICAgICAgRlhfQk9PTCBiVmFsdWUgPSBGQUxTRTsKLSAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMTsgaSA8IGlDb3VudDsgaSArKykgewotICAgICAgICAgICAgcE9DR09iaiA9IHBFeHByZXNzaW9uLT5HZXRFbGVtZW50VmFsdWUoMSk7Ci0gICAgICAgICAgICBpZiAocE9DR09iaiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9CT09MIGJJdGVtID0gRkFMU0U7Ci0gICAgICAgICAgICBpZiAocE9DR09iai0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgICAgICAgICAgYkl0ZW0gPSBiRnJvbUNvbmZpZyA/IExvYWRPQ0dTdGF0ZSgoQ1BERl9EaWN0aW9uYXJ5KilwT0NHT2JqKSA6IEdldE9DR1Zpc2libGUoKENQREZfRGljdGlvbmFyeSopcE9DR09iaik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBPQ0dPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgICAgICAgICBiSXRlbSA9IEdldE9DR1ZFKChDUERGX0FycmF5KilwT0NHT2JqLCBiRnJvbUNvbmZpZywgbkxldmVsICsgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgYlZhbHVlID0gYkl0ZW07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChjc09wZXJhdG9yID09IEZYX0JTVFJDKCJPciIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWx1ZSA9IGJWYWx1ZSB8fCBiSXRlbTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiVmFsdWUgPSBiVmFsdWUgJiYgYkl0ZW07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiVmFsdWU7Ci0gICAgfQogICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBic0ludGVudCA9IHBJbnRlbnQtPkdldFN0cmluZygpOworICByZXR1cm4gYnNJbnRlbnQgPT0gIkFsbCIgfHwgYnNJbnRlbnQgPT0gY3NFbGVtZW50OwogfQotRlhfQk9PTCBDUERGX09DQ29udGV4dDo6TG9hZE9DTURTdGF0ZShjb25zdCBDUERGX0RpY3Rpb25hcnkgKnBPQ01ERGljdCwgRlhfQk9PTCBiRnJvbUNvbmZpZykKLXsKLSAgICBGWFNZU19hc3NlcnQocE9DTUREaWN0ICE9IE5VTEwpOwotICAgIENQREZfQXJyYXkgKnBWRSA9IHBPQ01ERGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIlZFIikpOwotICAgIGlmIChwVkUgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gR2V0T0NHVkUocFZFLCBiRnJvbUNvbmZpZyk7CitzdGF0aWMgQ1BERl9EaWN0aW9uYXJ5KiBGUERGRE9DX09DR19HZXRDb25maWcoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBPQ0dEaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNTdGF0ZSkgeworICBGWFNZU19hc3NlcnQocERvYyAmJiBwT0NHRGljdCk7CisgIENQREZfRGljdGlvbmFyeSogcE9DUHJvcGVydGllcyA9IHBEb2MtPkdldFJvb3QoKS0+R2V0RGljdCgiT0NQcm9wZXJ0aWVzIik7CisgIGlmICghcE9DUHJvcGVydGllcykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfQXJyYXkqIHBPQ0dzID0gcE9DUHJvcGVydGllcy0+R2V0QXJyYXkoIk9DR3MiKTsKKyAgaWYgKCFwT0NHcykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChGUERGRE9DX09DR19GaW5kR3JvdXAocE9DR3MsIHBPQ0dEaWN0KSA8IDApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBDb25maWcgPSBwT0NQcm9wZXJ0aWVzLT5HZXREaWN0KCJEIik7CisgIENQREZfQXJyYXkqIHBDb25maWdzID0gcE9DUHJvcGVydGllcy0+R2V0QXJyYXkoIkNvbmZpZ3MiKTsKKyAgaWYgKHBDb25maWdzKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRmluZDsKKyAgICBpbnQzMl90IGlDb3VudCA9IHBDb25maWdzLT5HZXRDb3VudCgpOworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7CisgICAgICBwRmluZCA9IHBDb25maWdzLT5HZXREaWN0KGkpOworICAgICAgaWYgKCFwRmluZCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmICghRlBERkRPQ19PQ0dfSGFzSW50ZW50KHBGaW5kLCAiVmlldyIsICJWaWV3IikpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBwQ29uZmlnID0gcEZpbmQ7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NQID0gcE9DTUREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlAiKSwgRlhfQlNUUkMoIkFueU9uIikpOwotICAgIENQREZfT2JqZWN0ICpwT0NHT2JqID0gcE9DTUREaWN0LT5HZXRFbGVtZW50VmFsdWUoRlhfQlNUUkMoIk9DR3MiKSk7Ci0gICAgaWYgKHBPQ0dPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKHBPQ0dPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICByZXR1cm4gYkZyb21Db25maWcgPyBMb2FkT0NHU3RhdGUoKENQREZfRGljdGlvbmFyeSopcE9DR09iaikgOiBHZXRPQ0dWaXNpYmxlKChDUERGX0RpY3Rpb25hcnkqKXBPQ0dPYmopOwotICAgIH0KLSAgICBpZiAocE9DR09iai0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgRlhfQk9PTCBiU3RhdGUgPSBGQUxTRTsKLSAgICBpZiAoY3NQID09IEZYX0JTVFJDKCJBbGxPbiIpIHx8IGNzUCA9PSBGWF9CU1RSQygiQWxsT2ZmIikpIHsKLSAgICAgICAgYlN0YXRlID0gVFJVRTsKLSAgICB9Ci0gICAgRlhfSU5UMzIgaUNvdW50ID0gKChDUERGX0FycmF5KilwT0NHT2JqKS0+R2V0Q291bnQoKTsKLSAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7Ci0gICAgICAgIEZYX0JPT0wgYkl0ZW0gPSBUUlVFOwotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBJdGVtRGljdCA9ICgoQ1BERl9BcnJheSopcE9DR09iaiktPkdldERpY3QoaSk7Ci0gICAgICAgIGlmIChwSXRlbURpY3QpIHsKLSAgICAgICAgICAgIGJJdGVtID0gYkZyb21Db25maWcgPyBMb2FkT0NHU3RhdGUocEl0ZW1EaWN0KSA6IEdldE9DR1Zpc2libGUocEl0ZW1EaWN0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY3NQID09IEZYX0JTVFJDKCJBbnlPbiIpICYmIGJJdGVtKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY3NQID09IEZYX0JTVFJDKCJBbnlPZmYiKSAmJiAhYkl0ZW0pIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjc1AgPT0gRlhfQlNUUkMoIkFsbE9uIikgJiYgIWJJdGVtKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNzUCA9PSBGWF9CU1RSQygiQWxsT2ZmIikgJiYgYkl0ZW0pIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYlN0YXRlOworICB9CisgIHJldHVybiBwQ29uZmlnOwogfQotRlhfQk9PTCBDUERGX09DQ29udGV4dDo6Q2hlY2tPQ0dWaXNpYmxlKGNvbnN0IENQREZfRGljdGlvbmFyeSAqcE9DR0RpY3QpCi17Ci0gICAgaWYgKHBPQ0dEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGNzVHlwZSA9IHBPQ0dEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlR5cGUiKSwgRlhfQlNUUkMoIk9DRyIpKTsKLSAgICBpZiAoY3NUeXBlID09IEZYX0JTVFJDKCJPQ0ciKSkgewotICAgICAgICByZXR1cm4gR2V0T0NHVmlzaWJsZShwT0NHRGljdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIExvYWRPQ01EU3RhdGUocE9DR0RpY3QsIEZBTFNFKTsKLSAgICB9CitzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgRlBERkRPQ19PQ0dfR2V0VXNhZ2VUeXBlU3RyaW5nKAorICAgIENQREZfT0NDb250ZXh0OjpVc2FnZVR5cGUgZVR5cGUpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgY3NTdGF0ZSA9ICJWaWV3IjsKKyAgaWYgKGVUeXBlID09IENQREZfT0NDb250ZXh0OjpEZXNpZ24pIHsKKyAgICBjc1N0YXRlID0gIkRlc2lnbiI7CisgIH0gZWxzZSBpZiAoZVR5cGUgPT0gQ1BERl9PQ0NvbnRleHQ6OlByaW50KSB7CisgICAgY3NTdGF0ZSA9ICJQcmludCI7CisgIH0gZWxzZSBpZiAoZVR5cGUgPT0gQ1BERl9PQ0NvbnRleHQ6OkV4cG9ydCkgeworICAgIGNzU3RhdGUgPSAiRXhwb3J0IjsKKyAgfQorICByZXR1cm4gY3NTdGF0ZTsKIH0KLXZvaWQgQ1BERl9PQ0NvbnRleHQ6OlJlc2V0T0NDb250ZXh0KCkKLXsKLSAgICBtX09DR1N0YXRlcy5SZW1vdmVBbGwoKTsKK0NQREZfT0NDb250ZXh0OjpDUERGX09DQ29udGV4dChDUERGX0RvY3VtZW50KiBwRG9jLCBVc2FnZVR5cGUgZVVzYWdlVHlwZSkgeworICBGWFNZU19hc3NlcnQocERvYyk7CisgIG1fcERvY3VtZW50ID0gcERvYzsKKyAgbV9lVXNhZ2VUeXBlID0gZVVzYWdlVHlwZTsKK30KK0NQREZfT0NDb250ZXh0Ojp+Q1BERl9PQ0NvbnRleHQoKSB7CisgIG1fT0NHU3RhdGVzLmNsZWFyKCk7Cit9CitGWF9CT09MIENQREZfT0NDb250ZXh0OjpMb2FkT0NHU3RhdGVGcm9tQ29uZmlnKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcE9DR0RpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJWYWxpZENvbmZpZykgY29uc3QgeworICBDUERGX0RpY3Rpb25hcnkqIHBDb25maWcgPQorICAgICAgRlBERkRPQ19PQ0dfR2V0Q29uZmlnKG1fcERvY3VtZW50LCBwT0NHRGljdCwgY3NDb25maWcpOworICBpZiAoIXBDb25maWcpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBiVmFsaWRDb25maWcgPSBUUlVFOworICBGWF9CT09MIGJTdGF0ZSA9IHBDb25maWctPkdldFN0cmluZygiQmFzZVN0YXRlIiwgIk9OIikgIT0gIk9GRiI7CisgIENQREZfQXJyYXkqIHBBcnJheSA9IHBDb25maWctPkdldEFycmF5KCJPTiIpOworICBpZiAocEFycmF5KSB7CisgICAgaWYgKEZQREZET0NfT0NHX0ZpbmRHcm91cChwQXJyYXksIHBPQ0dEaWN0KSA+PSAwKSB7CisgICAgICBiU3RhdGUgPSBUUlVFOworICAgIH0KKyAgfQorICBwQXJyYXkgPSBwQ29uZmlnLT5HZXRBcnJheSgiT0ZGIik7CisgIGlmIChwQXJyYXkpIHsKKyAgICBpZiAoRlBERkRPQ19PQ0dfRmluZEdyb3VwKHBBcnJheSwgcE9DR0RpY3QpID49IDApIHsKKyAgICAgIGJTdGF0ZSA9IEZBTFNFOworICAgIH0KKyAgfQorICBwQXJyYXkgPSBwQ29uZmlnLT5HZXRBcnJheSgiQVMiKTsKKyAgaWYgKHBBcnJheSkgeworICAgIENGWF9CeXRlU3RyaW5nIGNzRmluZCA9IGNzQ29uZmlnICsgIlN0YXRlIjsKKyAgICBpbnQzMl90IGlDb3VudCA9IHBBcnJheS0+R2V0Q291bnQoKTsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwVXNhZ2UgPSBwQXJyYXktPkdldERpY3QoaSk7CisgICAgICBpZiAoIXBVc2FnZSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChwVXNhZ2UtPkdldFN0cmluZygiRXZlbnQiLCAiVmlldyIpICE9IGNzQ29uZmlnKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgQ1BERl9BcnJheSogcE9DR3MgPSBwVXNhZ2UtPkdldEFycmF5KCJPQ0dzIik7CisgICAgICBpZiAoIXBPQ0dzKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKEZQREZET0NfT0NHX0ZpbmRHcm91cChwT0NHcywgcE9DR0RpY3QpIDwgMCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIENQREZfRGljdGlvbmFyeSogcFN0YXRlID0gcFVzYWdlLT5HZXREaWN0KGNzQ29uZmlnKTsKKyAgICAgIGlmICghcFN0YXRlKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgYlN0YXRlID0gcFN0YXRlLT5HZXRTdHJpbmcoY3NGaW5kKSAhPSAiT0ZGIjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGJTdGF0ZTsKK30KK0ZYX0JPT0wgQ1BERl9PQ0NvbnRleHQ6OkxvYWRPQ0dTdGF0ZShjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBPQ0dEaWN0KSBjb25zdCB7CisgIGlmICghRlBERkRPQ19PQ0dfSGFzSW50ZW50KHBPQ0dEaWN0LCAiVmlldyIsICJWaWV3IikpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBjc1N0YXRlID0gRlBERkRPQ19PQ0dfR2V0VXNhZ2VUeXBlU3RyaW5nKG1fZVVzYWdlVHlwZSk7CisgIENQREZfRGljdGlvbmFyeSogcFVzYWdlID0gcE9DR0RpY3QtPkdldERpY3QoIlVzYWdlIik7CisgIGlmIChwVXNhZ2UpIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBTdGF0ZSA9IHBVc2FnZS0+R2V0RGljdChjc1N0YXRlKTsKKyAgICBpZiAocFN0YXRlKSB7CisgICAgICBDRlhfQnl0ZVN0cmluZyBjc0ZpbmQgPSBjc1N0YXRlICsgIlN0YXRlIjsKKyAgICAgIGlmIChwU3RhdGUtPktleUV4aXN0KGNzRmluZCkpIHsKKyAgICAgICAgcmV0dXJuIHBTdGF0ZS0+R2V0U3RyaW5nKGNzRmluZCkgIT0gIk9GRiI7CisgICAgICB9CisgICAgfQorICAgIGlmIChjc1N0YXRlICE9ICJWaWV3IikgeworICAgICAgcFN0YXRlID0gcFVzYWdlLT5HZXREaWN0KCJWaWV3Iik7CisgICAgICBpZiAocFN0YXRlICYmIHBTdGF0ZS0+S2V5RXhpc3QoIlZpZXdTdGF0ZSIpKSB7CisgICAgICAgIHJldHVybiBwU3RhdGUtPkdldFN0cmluZygiVmlld1N0YXRlIikgIT0gIk9GRiI7CisgICAgICB9CisgICAgfQorICB9CisgIEZYX0JPT0wgYkRlZlZhbGlkID0gRkFMU0U7CisgIHJldHVybiBMb2FkT0NHU3RhdGVGcm9tQ29uZmlnKGNzU3RhdGUsIHBPQ0dEaWN0LCBiRGVmVmFsaWQpOworfQorCitGWF9CT09MIENQREZfT0NDb250ZXh0OjpHZXRPQ0dWaXNpYmxlKGNvbnN0IENQREZfRGljdGlvbmFyeSogcE9DR0RpY3QpIHsKKyAgaWYgKCFwT0NHRGljdCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgY29uc3QgYXV0byBpdCA9IG1fT0NHU3RhdGVzLmZpbmQocE9DR0RpY3QpOworICBpZiAoaXQgIT0gbV9PQ0dTdGF0ZXMuZW5kKCkpCisgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisKKyAgRlhfQk9PTCBiU3RhdGUgPSBMb2FkT0NHU3RhdGUocE9DR0RpY3QpOworICBtX09DR1N0YXRlc1twT0NHRGljdF0gPSBiU3RhdGU7CisgIHJldHVybiBiU3RhdGU7Cit9CisKK0ZYX0JPT0wgQ1BERl9PQ0NvbnRleHQ6OkdldE9DR1ZFKENQREZfQXJyYXkqIHBFeHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRnJvbUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuTGV2ZWwpIHsKKyAgaWYgKG5MZXZlbCA+IDMyKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghcEV4cHJlc3Npb24pIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW50MzJfdCBpQ291bnQgPSBwRXhwcmVzc2lvbi0+R2V0Q291bnQoKTsKKyAgQ1BERl9PYmplY3QqIHBPQ0dPYmo7CisgIENGWF9CeXRlU3RyaW5nIGNzT3BlcmF0b3IgPSBwRXhwcmVzc2lvbi0+R2V0U3RyaW5nKDApOworICBpZiAoY3NPcGVyYXRvciA9PSAiTm90IikgeworICAgIHBPQ0dPYmogPSBwRXhwcmVzc2lvbi0+R2V0RWxlbWVudFZhbHVlKDEpOworICAgIGlmICghcE9DR09iaikKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBPQ0dPYmotPkFzRGljdGlvbmFyeSgpKQorICAgICAgcmV0dXJuICEoYkZyb21Db25maWcgPyBMb2FkT0NHU3RhdGUocERpY3QpIDogR2V0T0NHVmlzaWJsZShwRGljdCkpOworICAgIGlmIChDUERGX0FycmF5KiBwQXJyYXkgPSBwT0NHT2JqLT5Bc0FycmF5KCkpCisgICAgICByZXR1cm4gIUdldE9DR1ZFKHBBcnJheSwgYkZyb21Db25maWcsIG5MZXZlbCArIDEpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoY3NPcGVyYXRvciA9PSAiT3IiIHx8IGNzT3BlcmF0b3IgPT0gIkFuZCIpIHsKKyAgICBGWF9CT09MIGJWYWx1ZSA9IEZBTFNFOworICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IGlDb3VudDsgaSsrKSB7CisgICAgICBwT0NHT2JqID0gcEV4cHJlc3Npb24tPkdldEVsZW1lbnRWYWx1ZSgxKTsKKyAgICAgIGlmICghcE9DR09iaikgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIEZYX0JPT0wgYkl0ZW0gPSBGQUxTRTsKKyAgICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcE9DR09iai0+QXNEaWN0aW9uYXJ5KCkpCisgICAgICAgIGJJdGVtID0gYkZyb21Db25maWcgPyBMb2FkT0NHU3RhdGUocERpY3QpIDogR2V0T0NHVmlzaWJsZShwRGljdCk7CisgICAgICBlbHNlIGlmIChDUERGX0FycmF5KiBwQXJyYXkgPSBwT0NHT2JqLT5Bc0FycmF5KCkpCisgICAgICAgIGJJdGVtID0gR2V0T0NHVkUocEFycmF5LCBiRnJvbUNvbmZpZywgbkxldmVsICsgMSk7CisKKyAgICAgIGlmIChpID09IDEpIHsKKyAgICAgICAgYlZhbHVlID0gYkl0ZW07CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoY3NPcGVyYXRvciA9PSAiT3IiKSB7CisgICAgICAgICAgYlZhbHVlID0gYlZhbHVlIHx8IGJJdGVtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJWYWx1ZSA9IGJWYWx1ZSAmJiBiSXRlbTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYlZhbHVlOworICB9CisgIHJldHVybiBGQUxTRTsKK30KK0ZYX0JPT0wgQ1BERl9PQ0NvbnRleHQ6OkxvYWRPQ01EU3RhdGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwT0NNRERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZyb21Db25maWcpIHsKKyAgQ1BERl9BcnJheSogcFZFID0gcE9DTUREaWN0LT5HZXRBcnJheSgiVkUiKTsKKyAgaWYgKHBWRSkgeworICAgIHJldHVybiBHZXRPQ0dWRShwVkUsIGJGcm9tQ29uZmlnKTsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBjc1AgPSBwT0NNRERpY3QtPkdldFN0cmluZygiUCIsICJBbnlPbiIpOworICBDUERGX09iamVjdCogcE9DR09iaiA9IHBPQ01ERGljdC0+R2V0RWxlbWVudFZhbHVlKCJPQ0dzIik7CisgIGlmICghcE9DR09iaikKKyAgICByZXR1cm4gVFJVRTsKKyAgaWYgKGNvbnN0IENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwT0NHT2JqLT5Bc0RpY3Rpb25hcnkoKSkKKyAgICByZXR1cm4gYkZyb21Db25maWcgPyBMb2FkT0NHU3RhdGUocERpY3QpIDogR2V0T0NHVmlzaWJsZShwRGljdCk7CisKKyAgQ1BERl9BcnJheSogcEFycmF5ID0gcE9DR09iai0+QXNBcnJheSgpOworICBpZiAoIXBBcnJheSkKKyAgICByZXR1cm4gVFJVRTsKKworICBGWF9CT09MIGJTdGF0ZSA9IEZBTFNFOworICBpZiAoY3NQID09ICJBbGxPbiIgfHwgY3NQID09ICJBbGxPZmYiKSB7CisgICAgYlN0YXRlID0gVFJVRTsKKyAgfQorICBpbnQzMl90IGlDb3VudCA9IHBBcnJheS0+R2V0Q291bnQoKTsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKKyAgICBGWF9CT09MIGJJdGVtID0gVFJVRTsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBJdGVtRGljdCA9IHBBcnJheS0+R2V0RGljdChpKTsKKyAgICBpZiAocEl0ZW1EaWN0KQorICAgICAgYkl0ZW0gPSBiRnJvbUNvbmZpZyA/IExvYWRPQ0dTdGF0ZShwSXRlbURpY3QpIDogR2V0T0NHVmlzaWJsZShwSXRlbURpY3QpOworCisgICAgaWYgKChjc1AgPT0gIkFueU9uIiAmJiBiSXRlbSkgfHwgKGNzUCA9PSAiQW55T2ZmIiAmJiAhYkl0ZW0pKQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgaWYgKChjc1AgPT0gIkFsbE9uIiAmJiAhYkl0ZW0pIHx8IChjc1AgPT0gIkFsbE9mZiIgJiYgYkl0ZW0pKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBiU3RhdGU7Cit9CitGWF9CT09MIENQREZfT0NDb250ZXh0OjpDaGVja09DR1Zpc2libGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwT0NHRGljdCkgeworICBpZiAoIXBPQ0dEaWN0KSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgY3NUeXBlID0gcE9DR0RpY3QtPkdldFN0cmluZygiVHlwZSIsICJPQ0ciKTsKKyAgaWYgKGNzVHlwZSA9PSAiT0NHIikgeworICAgIHJldHVybiBHZXRPQ0dWaXNpYmxlKHBPQ0dEaWN0KTsKKyAgfQorICByZXR1cm4gTG9hZE9DTURTdGF0ZShwT0NHRGljdCwgRkFMU0UpOworfQordm9pZCBDUERGX09DQ29udGV4dDo6UmVzZXRPQ0NvbnRleHQoKSB7CisgIG1fT0NHU3RhdGVzLmNsZWFyKCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY190YWdnZWQuY3BwIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfdGFnZ2VkLmNwcAppbmRleCBlM2NkNzQ0Li5kNTE3NDNiIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL2RvY190YWdnZWQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3RhZ2dlZC5jcHAKQEAgLTEsNDM4ICsxLDQzMiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFyc2VyLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3RhZ2dlZC5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFyc2VyLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl90YWdnZWQuaCIKICNpbmNsdWRlICJ0YWdnZWRfaW50LmgiCisKIGNvbnN0IGludCBuTWF4UmVjdXJzaW9uID0gMzI7Ci1zdGF0aWMgRlhfQk9PTCBJc1RhZ2dlZChjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jKQotewotICAgIENQREZfRGljdGlvbmFyeSogcENhdGFsb2cgPSBwRG9jLT5HZXRSb290KCk7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwTWFya0luZm8gPSBwQ2F0YWxvZy0+R2V0RGljdChGWF9CU1RSQygiTWFya0luZm8iKSk7Ci0gICAgcmV0dXJuIHBNYXJrSW5mbyAhPSBOVUxMICYmIHBNYXJrSW5mby0+R2V0SW50ZWdlcihGWF9CU1RSQygiTWFya2VkIikpOworc3RhdGljIEZYX0JPT0wgSXNUYWdnZWQoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvYykgeworICBDUERGX0RpY3Rpb25hcnkqIHBDYXRhbG9nID0gcERvYy0+R2V0Um9vdCgpOworICBDUERGX0RpY3Rpb25hcnkqIHBNYXJrSW5mbyA9IHBDYXRhbG9nLT5HZXREaWN0KCJNYXJrSW5mbyIpOworICByZXR1cm4gcE1hcmtJbmZvICE9IE5VTEwgJiYgcE1hcmtJbmZvLT5HZXRJbnRlZ2VyKCJNYXJrZWQiKTsKIH0KLUNQREZfU3RydWN0VHJlZSogQ1BERl9TdHJ1Y3RUcmVlOjpMb2FkUGFnZShjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jLCBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCkKLXsKLSAgICBpZiAoIUlzVGFnZ2VkKHBEb2MpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX1N0cnVjdFRyZWVJbXBsKiBwVHJlZSA9IG5ldyBDUERGX1N0cnVjdFRyZWVJbXBsKHBEb2MpOwotICAgIHBUcmVlLT5Mb2FkUGFnZVRyZWUocFBhZ2VEaWN0KTsKLSAgICByZXR1cm4gcFRyZWU7CitDUERGX1N0cnVjdFRyZWUqIENQREZfU3RydWN0VHJlZTo6TG9hZFBhZ2UoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCkgeworICBpZiAoIUlzVGFnZ2VkKHBEb2MpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9TdHJ1Y3RUcmVlSW1wbCogcFRyZWUgPSBuZXcgQ1BERl9TdHJ1Y3RUcmVlSW1wbChwRG9jKTsKKyAgcFRyZWUtPkxvYWRQYWdlVHJlZShwUGFnZURpY3QpOworICByZXR1cm4gcFRyZWU7CiB9Ci1DUERGX1N0cnVjdFRyZWUqIENQREZfU3RydWN0VHJlZTo6TG9hZERvYyhjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jKQotewotICAgIGlmICghSXNUYWdnZWQocERvYykpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfU3RydWN0VHJlZUltcGwqIHBUcmVlID0gbmV3IENQREZfU3RydWN0VHJlZUltcGwocERvYyk7Ci0gICAgcFRyZWUtPkxvYWREb2NUcmVlKCk7Ci0gICAgcmV0dXJuIHBUcmVlOworQ1BERl9TdHJ1Y3RUcmVlKiBDUERGX1N0cnVjdFRyZWU6OkxvYWREb2MoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvYykgeworICBpZiAoIUlzVGFnZ2VkKHBEb2MpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9TdHJ1Y3RUcmVlSW1wbCogcFRyZWUgPSBuZXcgQ1BERl9TdHJ1Y3RUcmVlSW1wbChwRG9jKTsKKyAgcFRyZWUtPkxvYWREb2NUcmVlKCk7CisgIHJldHVybiBwVHJlZTsKIH0KLUNQREZfU3RydWN0VHJlZUltcGw6OkNQREZfU3RydWN0VHJlZUltcGwoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvYykKLXsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBDYXRhbG9nID0gcERvYy0+R2V0Um9vdCgpOwotICAgIG1fcFRyZWVSb290ID0gcENhdGFsb2ctPkdldERpY3QoRlhfQlNUUkMoIlN0cnVjdFRyZWVSb290IikpOwotICAgIGlmIChtX3BUcmVlUm9vdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wUm9sZU1hcCA9IG1fcFRyZWVSb290LT5HZXREaWN0KEZYX0JTVFJDKCJSb2xlTWFwIikpOworQ1BERl9TdHJ1Y3RUcmVlSW1wbDo6Q1BERl9TdHJ1Y3RUcmVlSW1wbChjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jKSB7CisgIENQREZfRGljdGlvbmFyeSogcENhdGFsb2cgPSBwRG9jLT5HZXRSb290KCk7CisgIG1fcFRyZWVSb290ID0gcENhdGFsb2ctPkdldERpY3QoIlN0cnVjdFRyZWVSb290Iik7CisgIGlmICghbV9wVHJlZVJvb3QpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wUm9sZU1hcCA9IG1fcFRyZWVSb290LT5HZXREaWN0KCJSb2xlTWFwIik7CiB9Ci1DUERGX1N0cnVjdFRyZWVJbXBsOjp+Q1BERl9TdHJ1Y3RUcmVlSW1wbCgpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX0tpZHMuR2V0U2l6ZSgpOyBpICsrKQotICAgICAgICBpZiAobV9LaWRzW2ldKSB7Ci0gICAgICAgICAgICBtX0tpZHNbaV0tPlJlbGVhc2UoKTsKLSAgICAgICAgfQotfQotdm9pZCBDUERGX1N0cnVjdFRyZWVJbXBsOjpMb2FkRG9jVHJlZSgpCi17Ci0gICAgbV9wUGFnZSA9IE5VTEw7Ci0gICAgaWYgKG1fcFRyZWVSb290ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcEtpZHMgPSBtX3BUcmVlUm9vdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJLIikpOwotICAgIGlmIChwS2lkcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHBLaWRzLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogcFN0cnVjdEVsZW1lbnRJbXBsID0gbmV3IENQREZfU3RydWN0RWxlbWVudEltcGwodGhpcywgTlVMTCwgKENQREZfRGljdGlvbmFyeSopcEtpZHMpOwotICAgICAgICBtX0tpZHMuQWRkKHBTdHJ1Y3RFbGVtZW50SW1wbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHBLaWRzLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBLaWRzOwotICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwQXJyYXktPkdldENvdW50KCk7IGkgKyspIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwS2lkID0gcEFycmF5LT5HZXREaWN0KGkpOwotICAgICAgICBDUERGX1N0cnVjdEVsZW1lbnRJbXBsKiBwU3RydWN0RWxlbWVudEltcGwgPSBuZXcgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCh0aGlzLCBOVUxMLCBwS2lkKTsKLSAgICAgICAgbV9LaWRzLkFkZChwU3RydWN0RWxlbWVudEltcGwpOworQ1BERl9TdHJ1Y3RUcmVlSW1wbDo6fkNQREZfU3RydWN0VHJlZUltcGwoKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9LaWRzLkdldFNpemUoKTsgaSsrKQorICAgIGlmIChtX0tpZHNbaV0pIHsKKyAgICAgIG1fS2lkc1tpXS0+UmVsZWFzZSgpOwogICAgIH0KIH0KLXZvaWQgQ1BERl9TdHJ1Y3RUcmVlSW1wbDo6TG9hZFBhZ2VUcmVlKGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0KQotewotICAgIG1fcFBhZ2UgPSBwUGFnZURpY3Q7Ci0gICAgaWYgKG1fcFRyZWVSb290ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX09iamVjdCogcEtpZHMgPSBtX3BUcmVlUm9vdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJLIikpOwotICAgIGlmIChwS2lkcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfRFdPUkQgZHdLaWRzID0gMDsKLSAgICBpZiAocEtpZHMtPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICBkd0tpZHMgPSAxOwotICAgIH0gZWxzZSBpZiAocEtpZHMtPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgZHdLaWRzID0gKChDUERGX0FycmF5KilwS2lkcyktPkdldENvdW50KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9EV09SRCBpOwotICAgIG1fS2lkcy5TZXRTaXplKGR3S2lkcyk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGR3S2lkczsgaSArKykgewotICAgICAgICBtX0tpZHNbaV0gPSBOVUxMOwotICAgIH0KLSAgICBDRlhfTWFwUHRyVG9QdHIgZWxlbWVudF9tYXA7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyZW50VHJlZSA9IG1fcFRyZWVSb290LT5HZXREaWN0KEZYX0JTVFJDKCJQYXJlbnRUcmVlIikpOwotICAgIGlmIChwUGFyZW50VHJlZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9OdW1iZXJUcmVlIHBhcmVudF90cmVlKHBQYXJlbnRUcmVlKTsKLSAgICBpbnQgcGFyZW50c19pZCA9IHBQYWdlRGljdC0+R2V0SW50ZWdlcihGWF9CU1RSQygiU3RydWN0UGFyZW50cyIpLCAtMSk7Ci0gICAgaWYgKHBhcmVudHNfaWQgPj0gMCkgewotICAgICAgICBDUERGX09iamVjdCogcFBhcmVudHMgPSBwYXJlbnRfdHJlZS5Mb29rdXBWYWx1ZShwYXJlbnRzX2lkKTsKLSAgICAgICAgaWYgKHBQYXJlbnRzID09IE5VTEwgfHwgcFBhcmVudHMtPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBDUERGX0FycmF5KiBwUGFyZW50QXJyYXkgPSAoQ1BERl9BcnJheSopcFBhcmVudHM7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGFyZW50QXJyYXktPkdldENvdW50KCk7IGkgKyspIHsKLSAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhcmVudCA9IHBQYXJlbnRBcnJheS0+R2V0RGljdChpKTsKLSAgICAgICAgICAgIGlmIChwUGFyZW50ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFkZFBhZ2VOb2RlKHBQYXJlbnQsIGVsZW1lbnRfbWFwKTsKLSAgICAgICAgfQotICAgIH0KK3ZvaWQgQ1BERl9TdHJ1Y3RUcmVlSW1wbDo6TG9hZERvY1RyZWUoKSB7CisgIG1fcFBhZ2UgPSBudWxscHRyOworICBpZiAoIW1fcFRyZWVSb290KQorICAgIHJldHVybjsKKworICBDUERGX09iamVjdCogcEtpZHMgPSBtX3BUcmVlUm9vdC0+R2V0RWxlbWVudFZhbHVlKCJLIik7CisgIGlmICghcEtpZHMpCisgICAgcmV0dXJuOworICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBLaWRzLT5Bc0RpY3Rpb25hcnkoKSkgeworICAgIENQREZfU3RydWN0RWxlbWVudEltcGwqIHBTdHJ1Y3RFbGVtZW50SW1wbCA9CisgICAgICAgIG5ldyBDUERGX1N0cnVjdEVsZW1lbnRJbXBsKHRoaXMsIG51bGxwdHIsIHBEaWN0KTsKKyAgICBtX0tpZHMuQWRkKHBTdHJ1Y3RFbGVtZW50SW1wbCk7CisgICAgcmV0dXJuOworICB9CisgIENQREZfQXJyYXkqIHBBcnJheSA9IHBLaWRzLT5Bc0FycmF5KCk7CisgIGlmICghcEFycmF5KQorICAgIHJldHVybjsKKworICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyBpKyspIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBLaWQgPSBwQXJyYXktPkdldERpY3QoaSk7CisgICAgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogcFN0cnVjdEVsZW1lbnRJbXBsID0KKyAgICAgICAgbmV3IENQREZfU3RydWN0RWxlbWVudEltcGwodGhpcywgbnVsbHB0ciwgcEtpZCk7CisgICAgbV9LaWRzLkFkZChwU3RydWN0RWxlbWVudEltcGwpOworICB9CiB9Ci1DUERGX1N0cnVjdEVsZW1lbnRJbXBsKiBDUERGX1N0cnVjdFRyZWVJbXBsOjpBZGRQYWdlTm9kZShDUERGX0RpY3Rpb25hcnkqIHBEaWN0LCBDRlhfTWFwUHRyVG9QdHImIG1hcCwgaW50IG5MZXZlbCkKLXsKLSAgICBpZiAobkxldmVsID4gbk1heFJlY3Vyc2lvbikgewotICAgICAgICByZXR1cm4gTlVMTDsKK3ZvaWQgQ1BERl9TdHJ1Y3RUcmVlSW1wbDo6TG9hZFBhZ2VUcmVlKGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0KSB7CisgIG1fcFBhZ2UgPSBwUGFnZURpY3Q7CisgIGlmICghbV9wVHJlZVJvb3QpCisgICAgcmV0dXJuOworCisgIENQREZfT2JqZWN0KiBwS2lkcyA9IG1fcFRyZWVSb290LT5HZXRFbGVtZW50VmFsdWUoIksiKTsKKyAgaWYgKCFwS2lkcykKKyAgICByZXR1cm47CisKKyAgRlhfRFdPUkQgZHdLaWRzID0gMDsKKyAgaWYgKHBLaWRzLT5Jc0RpY3Rpb25hcnkoKSkKKyAgICBkd0tpZHMgPSAxOworICBlbHNlIGlmIChDUERGX0FycmF5KiBwQXJyYXkgPSBwS2lkcy0+QXNBcnJheSgpKQorICAgIGR3S2lkcyA9IHBBcnJheS0+R2V0Q291bnQoKTsKKyAgZWxzZQorICAgIHJldHVybjsKKworICBGWF9EV09SRCBpOworICBtX0tpZHMuU2V0U2l6ZShkd0tpZHMpOworICBmb3IgKGkgPSAwOyBpIDwgZHdLaWRzOyBpKyspIHsKKyAgICBtX0tpZHNbaV0gPSBOVUxMOworICB9CisgIENGWF9NYXBQdHJUb1B0ciBlbGVtZW50X21hcDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyZW50VHJlZSA9IG1fcFRyZWVSb290LT5HZXREaWN0KCJQYXJlbnRUcmVlIik7CisgIGlmICghcFBhcmVudFRyZWUpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9OdW1iZXJUcmVlIHBhcmVudF90cmVlKHBQYXJlbnRUcmVlKTsKKyAgaW50IHBhcmVudHNfaWQgPSBwUGFnZURpY3QtPkdldEludGVnZXIoIlN0cnVjdFBhcmVudHMiLCAtMSk7CisgIGlmIChwYXJlbnRzX2lkID49IDApIHsKKyAgICBDUERGX0FycmF5KiBwUGFyZW50QXJyYXkgPSBUb0FycmF5KHBhcmVudF90cmVlLkxvb2t1cFZhbHVlKHBhcmVudHNfaWQpKTsKKyAgICBpZiAoIXBQYXJlbnRBcnJheSkKKyAgICAgIHJldHVybjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwUGFyZW50QXJyYXktPkdldENvdW50KCk7IGkrKykgeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyZW50ID0gcFBhcmVudEFycmF5LT5HZXREaWN0KGkpOworICAgICAgaWYgKCFwUGFyZW50KSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgQWRkUGFnZU5vZGUocFBhcmVudCwgZWxlbWVudF9tYXApOwogICAgIH0KLSAgICBDUERGX1N0cnVjdEVsZW1lbnRJbXBsKiBwRWxlbWVudCA9IE5VTEw7Ci0gICAgaWYgKG1hcC5Mb29rdXAocERpY3QsIChGWF9MUFZPSUQmKXBFbGVtZW50KSkgewotICAgICAgICByZXR1cm4gcEVsZW1lbnQ7Ci0gICAgfQotICAgIHBFbGVtZW50ID0gbmV3IENQREZfU3RydWN0RWxlbWVudEltcGwodGhpcywgTlVMTCwgcERpY3QpOwotICAgIG1hcC5TZXRBdChwRGljdCwgcEVsZW1lbnQpOwotICAgIENQREZfRGljdGlvbmFyeSogcFBhcmVudCA9IHBEaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJQIikpOwotICAgIGlmIChwUGFyZW50ID09IE5VTEwgfHwgcFBhcmVudC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJUeXBlIikpID09IEZYX0JTVFJDKCJTdHJ1Y3RUcmVlUm9vdCIpKSB7Ci0gICAgICAgIGlmICghQWRkVG9wTGV2ZWxOb2RlKHBEaWN0LCBwRWxlbWVudCkpIHsKLSAgICAgICAgICAgIHBFbGVtZW50LT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICBtYXAuUmVtb3ZlS2V5KHBEaWN0KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIENQREZfU3RydWN0RWxlbWVudEltcGwqIHBQYXJlbnRFbGVtZW50ID0gQWRkUGFnZU5vZGUocFBhcmVudCwgbWFwLCBuTGV2ZWwgKyAxKTsKLSAgICAgICAgRlhfQk9PTCBiU2F2ZSA9IEZBTFNFOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBQYXJlbnRFbGVtZW50LT5tX0tpZHMuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgICAgICBpZiAocFBhcmVudEVsZW1lbnQtPm1fS2lkc1tpXS5tX1R5cGUgIT0gQ1BERl9TdHJ1Y3RLaWQ6OkVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwUGFyZW50RWxlbWVudC0+bV9LaWRzW2ldLm1fRWxlbWVudC5tX3BEaWN0ICE9IHBEaWN0KSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwUGFyZW50RWxlbWVudC0+bV9LaWRzW2ldLm1fRWxlbWVudC5tX3BFbGVtZW50ID0gcEVsZW1lbnQtPlJldGFpbigpOwotICAgICAgICAgICAgYlNhdmUgPSBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGlmICghYlNhdmUpIHsKLSAgICAgICAgICAgIHBFbGVtZW50LT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICBtYXAuUmVtb3ZlS2V5KHBEaWN0KTsKLSAgICAgICAgfQotICAgIH0KKyAgfQorfQorQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogQ1BERl9TdHJ1Y3RUcmVlSW1wbDo6QWRkUGFnZU5vZGUoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXBQdHJUb1B0ciYgbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5MZXZlbCkgeworICBpZiAobkxldmVsID4gbk1heFJlY3Vyc2lvbikgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfU3RydWN0RWxlbWVudEltcGwqIHBFbGVtZW50ID0gTlVMTDsKKyAgaWYgKG1hcC5Mb29rdXAocERpY3QsICh2b2lkKiYpcEVsZW1lbnQpKSB7CiAgICAgcmV0dXJuIHBFbGVtZW50OworICB9CisgIHBFbGVtZW50ID0gbmV3IENQREZfU3RydWN0RWxlbWVudEltcGwodGhpcywgTlVMTCwgcERpY3QpOworICBtYXAuU2V0QXQocERpY3QsIHBFbGVtZW50KTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyZW50ID0gcERpY3QtPkdldERpY3QoIlAiKTsKKyAgaWYgKCFwUGFyZW50IHx8IHBQYXJlbnQtPkdldFN0cmluZygiVHlwZSIpID09ICJTdHJ1Y3RUcmVlUm9vdCIpIHsKKyAgICBpZiAoIUFkZFRvcExldmVsTm9kZShwRGljdCwgcEVsZW1lbnQpKSB7CisgICAgICBwRWxlbWVudC0+UmVsZWFzZSgpOworICAgICAgbWFwLlJlbW92ZUtleShwRGljdCk7CisgICAgfQorICB9IGVsc2UgeworICAgIENQREZfU3RydWN0RWxlbWVudEltcGwqIHBQYXJlbnRFbGVtZW50ID0KKyAgICAgICAgQWRkUGFnZU5vZGUocFBhcmVudCwgbWFwLCBuTGV2ZWwgKyAxKTsKKyAgICBGWF9CT09MIGJTYXZlID0gRkFMU0U7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwUGFyZW50RWxlbWVudC0+bV9LaWRzLkdldFNpemUoKTsgaSsrKSB7CisgICAgICBpZiAocFBhcmVudEVsZW1lbnQtPm1fS2lkc1tpXS5tX1R5cGUgIT0gQ1BERl9TdHJ1Y3RLaWQ6OkVsZW1lbnQpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAocFBhcmVudEVsZW1lbnQtPm1fS2lkc1tpXS5tX0VsZW1lbnQubV9wRGljdCAhPSBwRGljdCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHBQYXJlbnRFbGVtZW50LT5tX0tpZHNbaV0ubV9FbGVtZW50Lm1fcEVsZW1lbnQgPSBwRWxlbWVudC0+UmV0YWluKCk7CisgICAgICBiU2F2ZSA9IFRSVUU7CisgICAgfQorICAgIGlmICghYlNhdmUpIHsKKyAgICAgIHBFbGVtZW50LT5SZWxlYXNlKCk7CisgICAgICBtYXAuUmVtb3ZlS2V5KHBEaWN0KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHBFbGVtZW50OwogfQotRlhfQk9PTCBDUERGX1N0cnVjdFRyZWVJbXBsOjpBZGRUb3BMZXZlbE5vZGUoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogcEVsZW1lbnQpCi17Ci0gICAgQ1BERl9PYmplY3QgKnBPYmogPSBtX3BUcmVlUm9vdC0+R2V0RWxlbWVudFZhbHVlKEZYX0JTVFJDKCJLIikpOwotICAgIGlmICghcE9iaikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgaWYgKHBPYmotPkdldE9iak51bSgpID09IHBEaWN0LT5HZXRPYmpOdW0oKSkgewotICAgICAgICAgICAgaWYgKG1fS2lkc1swXSkgewotICAgICAgICAgICAgICAgIG1fS2lkc1swXS0+UmVsZWFzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9LaWRzWzBdID0gcEVsZW1lbnQtPlJldGFpbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKSB7Ci0gICAgICAgIENQREZfQXJyYXkqIHBUb3BLaWRzID0gKENQREZfQXJyYXkqKXBPYmo7Ci0gICAgICAgIEZYX0RXT1JEIGk7Ci0gICAgICAgIEZYX0JPT0wgYlNhdmUgPSBGQUxTRTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHBUb3BLaWRzLT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgICAgICBDUERGX09iamVjdCogcEtpZFJlZiA9IHBUb3BLaWRzLT5HZXRFbGVtZW50KGkpOwotICAgICAgICAgICAgaWYgKHBLaWRSZWYgPT0gTlVMTCB8fCBwS2lkUmVmLT5HZXRUeXBlKCkgIT0gUERGT0JKX1JFRkVSRU5DRSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCgoQ1BERl9SZWZlcmVuY2UqKSBwS2lkUmVmKS0+R2V0UmVmT2JqTnVtKCkgIT0gcERpY3QtPkdldE9iak51bSgpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9LaWRzW2ldKSB7Ci0gICAgICAgICAgICAgICAgbV9LaWRzW2ldLT5SZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX0tpZHNbaV0gPSBwRWxlbWVudC0+UmV0YWluKCk7Ci0gICAgICAgICAgICBiU2F2ZSA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFiU2F2ZSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6Q1BERl9TdHJ1Y3RFbGVtZW50SW1wbChDUERGX1N0cnVjdFRyZWVJbXBsKiBwVHJlZSwgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogcFBhcmVudCwgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkKLSAgICA6IG1fUmVmQ291bnQoMCkKLXsKLSAgICBtX3BUcmVlID0gcFRyZWU7Ci0gICAgbV9wRGljdCA9IHBEaWN0OwotICAgIG1fVHlwZSA9IHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlMiKSk7Ci0gICAgaWYgKHBUcmVlLT5tX3BSb2xlTWFwKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIG1hcHBlZCA9IHBUcmVlLT5tX3BSb2xlTWFwLT5HZXRTdHJpbmcobV9UeXBlKTsKLSAgICAgICAgaWYgKCFtYXBwZWQuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBtX1R5cGUgPSBtYXBwZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9wUGFyZW50ID0gcFBhcmVudDsKLSAgICBMb2FkS2lkcyhwRGljdCk7Ci19Ci1DUERGX1N0cnVjdEVsZW1lbnRJbXBsOjp+Q1BERl9TdHJ1Y3RFbGVtZW50SW1wbCgpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX0tpZHMuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIGlmIChtX0tpZHNbaV0ubV9UeXBlID09IENQREZfU3RydWN0S2lkOjpFbGVtZW50ICYmIG1fS2lkc1tpXS5tX0VsZW1lbnQubV9wRWxlbWVudCkgewotICAgICAgICAgICAgKChDUERGX1N0cnVjdEVsZW1lbnRJbXBsKiltX0tpZHNbaV0ubV9FbGVtZW50Lm1fcEVsZW1lbnQpLT5SZWxlYXNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1DUERGX1N0cnVjdEVsZW1lbnRJbXBsKiBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpSZXRhaW4oKQotewotICAgIG1fUmVmQ291bnQrKzsKLSAgICByZXR1cm4gdGhpczsKLX0KLXZvaWQgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6UmVsZWFzZSgpCi17Ci0gICAgaWYoLS1tX1JlZkNvdW50IDwgMSkgewotICAgICAgICBkZWxldGUgdGhpczsKLSAgICB9Ci19Ci12b2lkIENQREZfU3RydWN0RWxlbWVudEltcGw6OkxvYWRLaWRzKENQREZfRGljdGlvbmFyeSogcERpY3QpCi17Ci0gICAgQ1BERl9PYmplY3QqIHBPYmogPSBwRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiUGciKSk7Ci0gICAgRlhfRFdPUkQgUGFnZU9iak51bSA9IDA7Ci0gICAgaWYgKHBPYmogJiYgcE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKLSAgICAgICAgUGFnZU9iak51bSA9ICgoQ1BERl9SZWZlcmVuY2UqKXBPYmopLT5HZXRSZWZPYmpOdW0oKTsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBLaWRzID0gcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiSyIpKTsKLSAgICBpZiAocEtpZHMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwS2lkcy0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcEtpZHM7Ci0gICAgICAgIG1fS2lkcy5TZXRTaXplKHBBcnJheS0+R2V0Q291bnQoKSk7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwQXJyYXktPkdldENvdW50KCk7IGkgKyspIHsKLSAgICAgICAgICAgIENQREZfT2JqZWN0KiBwS2lkID0gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoaSk7Ci0gICAgICAgICAgICBMb2FkS2lkKFBhZ2VPYmpOdW0sIHBLaWQsICZtX0tpZHNbaV0pOwotICAgICAgICB9CitGWF9CT09MIENQREZfU3RydWN0VHJlZUltcGw6OkFkZFRvcExldmVsTm9kZShDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogcEVsZW1lbnQpIHsKKyAgQ1BERl9PYmplY3QqIHBPYmogPSBtX3BUcmVlUm9vdC0+R2V0RWxlbWVudFZhbHVlKCJLIik7CisgIGlmICghcE9iaikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAocE9iai0+SXNEaWN0aW9uYXJ5KCkpIHsKKyAgICBpZiAocE9iai0+R2V0T2JqTnVtKCkgPT0gcERpY3QtPkdldE9iak51bSgpKSB7CisgICAgICBpZiAobV9LaWRzWzBdKSB7CisgICAgICAgIG1fS2lkc1swXS0+UmVsZWFzZSgpOworICAgICAgfQorICAgICAgbV9LaWRzWzBdID0gcEVsZW1lbnQtPlJldGFpbigpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fS2lkcy5TZXRTaXplKDEpOwotICAgICAgICBMb2FkS2lkKFBhZ2VPYmpOdW0sIHBLaWRzLCAmbV9LaWRzWzBdKTsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CisgIH0KKyAgaWYgKENQREZfQXJyYXkqIHBUb3BLaWRzID0gcE9iai0+QXNBcnJheSgpKSB7CisgICAgRlhfRFdPUkQgaTsKKyAgICBGWF9CT09MIGJTYXZlID0gRkFMU0U7CisgICAgZm9yIChpID0gMDsgaSA8IHBUb3BLaWRzLT5HZXRDb3VudCgpOyBpKyspIHsKKyAgICAgIENQREZfUmVmZXJlbmNlKiBwS2lkUmVmID0gVG9SZWZlcmVuY2UocFRvcEtpZHMtPkdldEVsZW1lbnQoaSkpOworICAgICAgaWYgKCFwS2lkUmVmKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGlmIChwS2lkUmVmLT5HZXRSZWZPYmpOdW0oKSAhPSBwRGljdC0+R2V0T2JqTnVtKCkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAobV9LaWRzW2ldKQorICAgICAgICBtX0tpZHNbaV0tPlJlbGVhc2UoKTsKKyAgICAgIG1fS2lkc1tpXSA9IHBFbGVtZW50LT5SZXRhaW4oKTsKKyAgICAgIGJTYXZlID0gVFJVRTsKKyAgICB9CisgICAgaWYgKCFiU2F2ZSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLXZvaWQgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6TG9hZEtpZChGWF9EV09SRCBQYWdlT2JqTnVtLCBDUERGX09iamVjdCogcEtpZE9iaiwgQ1BERl9TdHJ1Y3RLaWQqIHBLaWQpCi17Ci0gICAgcEtpZC0+bV9UeXBlID0gQ1BERl9TdHJ1Y3RLaWQ6OkludmFsaWQ7Ci0gICAgaWYgKHBLaWRPYmogPT0gTlVMTCkgewotICAgICAgICByZXR1cm47CitDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpDUERGX1N0cnVjdEVsZW1lbnRJbXBsKENQREZfU3RydWN0VHJlZUltcGwqIHBUcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1N0cnVjdEVsZW1lbnRJbXBsKiBwUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KQorICAgIDogbV9SZWZDb3VudCgwKSB7CisgIG1fcFRyZWUgPSBwVHJlZTsKKyAgbV9wRGljdCA9IHBEaWN0OworICBtX1R5cGUgPSBwRGljdC0+R2V0U3RyaW5nKCJTIik7CisgIGlmIChwVHJlZS0+bV9wUm9sZU1hcCkgeworICAgIENGWF9CeXRlU3RyaW5nIG1hcHBlZCA9IHBUcmVlLT5tX3BSb2xlTWFwLT5HZXRTdHJpbmcobV9UeXBlKTsKKyAgICBpZiAoIW1hcHBlZC5Jc0VtcHR5KCkpIHsKKyAgICAgIG1fVHlwZSA9IG1hcHBlZDsKICAgICB9Ci0gICAgaWYgKHBLaWRPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfTlVNQkVSKSB7Ci0gICAgICAgIGlmIChtX3BUcmVlLT5tX3BQYWdlICYmIG1fcFRyZWUtPm1fcFBhZ2UtPkdldE9iak51bSgpICE9IFBhZ2VPYmpOdW0pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBwS2lkLT5tX1R5cGUgPSBDUERGX1N0cnVjdEtpZDo6UGFnZUNvbnRlbnQ7Ci0gICAgICAgIHBLaWQtPm1fUGFnZUNvbnRlbnQubV9Db250ZW50SWQgPSBwS2lkT2JqLT5HZXRJbnRlZ2VyKCk7Ci0gICAgICAgIHBLaWQtPm1fUGFnZUNvbnRlbnQubV9QYWdlT2JqTnVtID0gUGFnZU9iak51bTsKLSAgICAgICAgcmV0dXJuOworICB9CisgIG1fcFBhcmVudCA9IHBQYXJlbnQ7CisgIExvYWRLaWRzKHBEaWN0KTsKK30KK0NQREZfU3RydWN0RWxlbWVudEltcGw6On5DUERGX1N0cnVjdEVsZW1lbnRJbXBsKCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IG1fS2lkcy5HZXRTaXplKCk7IGkrKykgeworICAgIGlmIChtX0tpZHNbaV0ubV9UeXBlID09IENQREZfU3RydWN0S2lkOjpFbGVtZW50ICYmCisgICAgICAgIG1fS2lkc1tpXS5tX0VsZW1lbnQubV9wRWxlbWVudCkgeworICAgICAgKChDUERGX1N0cnVjdEVsZW1lbnRJbXBsKiltX0tpZHNbaV0ubV9FbGVtZW50Lm1fcEVsZW1lbnQpLT5SZWxlYXNlKCk7CiAgICAgfQotICAgIGlmIChwS2lkT2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgcmV0dXJuOworICB9Cit9CitDUERGX1N0cnVjdEVsZW1lbnRJbXBsKiBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpSZXRhaW4oKSB7CisgIG1fUmVmQ291bnQrKzsKKyAgcmV0dXJuIHRoaXM7Cit9Cit2b2lkIENQREZfU3RydWN0RWxlbWVudEltcGw6OlJlbGVhc2UoKSB7CisgIGlmICgtLW1fUmVmQ291bnQgPCAxKSB7CisgICAgZGVsZXRlIHRoaXM7CisgIH0KK30KK3ZvaWQgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6TG9hZEtpZHMoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgeworICBDUERGX09iamVjdCogcE9iaiA9IHBEaWN0LT5HZXRFbGVtZW50KCJQZyIpOworICBGWF9EV09SRCBQYWdlT2JqTnVtID0gMDsKKyAgaWYgKENQREZfUmVmZXJlbmNlKiBwUmVmID0gVG9SZWZlcmVuY2UocE9iaikpCisgICAgUGFnZU9iak51bSA9IHBSZWYtPkdldFJlZk9iak51bSgpOworCisgIENQREZfT2JqZWN0KiBwS2lkcyA9IHBEaWN0LT5HZXRFbGVtZW50VmFsdWUoIksiKTsKKyAgaWYgKCFwS2lkcykKKyAgICByZXR1cm47CisKKyAgaWYgKENQREZfQXJyYXkqIHBBcnJheSA9IHBLaWRzLT5Bc0FycmF5KCkpIHsKKyAgICBtX0tpZHMuU2V0U2l6ZShwQXJyYXktPkdldENvdW50KCkpOworICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwQXJyYXktPkdldENvdW50KCk7IGkrKykgeworICAgICAgQ1BERl9PYmplY3QqIHBLaWQgPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZShpKTsKKyAgICAgIExvYWRLaWQoUGFnZU9iak51bSwgcEtpZCwgJm1fS2lkc1tpXSk7CiAgICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcEtpZERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwS2lkT2JqOwotICAgIENQREZfT2JqZWN0KiBwUGFnZU9iaiA9IHBLaWREaWN0LT5HZXRFbGVtZW50KEZYX0JTVFJDKCJQZyIpKTsKLSAgICBpZiAocFBhZ2VPYmogJiYgcFBhZ2VPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfUkVGRVJFTkNFKSB7Ci0gICAgICAgIFBhZ2VPYmpOdW0gPSAoKENQREZfUmVmZXJlbmNlKilwUGFnZU9iaiktPkdldFJlZk9iak51bSgpOworICB9IGVsc2UgeworICAgIG1fS2lkcy5TZXRTaXplKDEpOworICAgIExvYWRLaWQoUGFnZU9iak51bSwgcEtpZHMsICZtX0tpZHNbMF0pOworICB9Cit9Cit2b2lkIENQREZfU3RydWN0RWxlbWVudEltcGw6OkxvYWRLaWQoRlhfRFdPUkQgUGFnZU9iak51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcEtpZE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1N0cnVjdEtpZCogcEtpZCkgeworICBwS2lkLT5tX1R5cGUgPSBDUERGX1N0cnVjdEtpZDo6SW52YWxpZDsKKyAgaWYgKCFwS2lkT2JqKQorICAgIHJldHVybjsKKworICBpZiAocEtpZE9iai0+SXNOdW1iZXIoKSkgeworICAgIGlmIChtX3BUcmVlLT5tX3BQYWdlICYmIG1fcFRyZWUtPm1fcFBhZ2UtPkdldE9iak51bSgpICE9IFBhZ2VPYmpOdW0pIHsKKyAgICAgIHJldHVybjsKICAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgdHlwZSA9IHBLaWREaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlR5cGUiKSk7Ci0gICAgaWYgKHR5cGUgPT0gRlhfQlNUUkMoIk1DUiIpKSB7Ci0gICAgICAgIGlmIChtX3BUcmVlLT5tX3BQYWdlICYmIG1fcFRyZWUtPm1fcFBhZ2UtPkdldE9iak51bSgpICE9IFBhZ2VPYmpOdW0pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBwS2lkLT5tX1R5cGUgPSBDUERGX1N0cnVjdEtpZDo6U3RyZWFtQ29udGVudDsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBTdHJlYW1PYmogPSBwS2lkRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiU3RtIikpOwotICAgICAgICBpZiAocFN0cmVhbU9iaiAmJiBwU3RyZWFtT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1JFRkVSRU5DRSkgewotICAgICAgICAgICAgcEtpZC0+bV9TdHJlYW1Db250ZW50Lm1fUmVmT2JqTnVtID0gKChDUERGX1JlZmVyZW5jZSopcFN0cmVhbU9iaiktPkdldFJlZk9iak51bSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcEtpZC0+bV9TdHJlYW1Db250ZW50Lm1fUmVmT2JqTnVtID0gMDsKLSAgICAgICAgfQotICAgICAgICBwS2lkLT5tX1N0cmVhbUNvbnRlbnQubV9QYWdlT2JqTnVtID0gUGFnZU9iak51bTsKLSAgICAgICAgcEtpZC0+bV9TdHJlYW1Db250ZW50Lm1fQ29udGVudElkID0gcEtpZERpY3QtPkdldEludGVnZXIoRlhfQlNUUkMoIk1DSUQiKSk7Ci0gICAgfSBlbHNlIGlmICh0eXBlID09IEZYX0JTVFJDKCJPQkpSIikpIHsKLSAgICAgICAgaWYgKG1fcFRyZWUtPm1fcFBhZ2UgJiYgbV9wVHJlZS0+bV9wUGFnZS0+R2V0T2JqTnVtKCkgIT0gUGFnZU9iak51bSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHBLaWQtPm1fVHlwZSA9IENQREZfU3RydWN0S2lkOjpPYmplY3Q7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gcEtpZERpY3QtPkdldEVsZW1lbnQoRlhfQlNUUkMoIk9iaiIpKTsKLSAgICAgICAgaWYgKHBPYmogJiYgcE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKLSAgICAgICAgICAgIHBLaWQtPm1fT2JqZWN0Lm1fUmVmT2JqTnVtID0gKChDUERGX1JlZmVyZW5jZSopcE9iaiktPkdldFJlZk9iak51bSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcEtpZC0+bV9PYmplY3QubV9SZWZPYmpOdW0gPSAwOwotICAgICAgICB9Ci0gICAgICAgIHBLaWQtPm1fT2JqZWN0Lm1fUGFnZU9iak51bSA9IFBhZ2VPYmpOdW07CisgICAgcEtpZC0+bV9UeXBlID0gQ1BERl9TdHJ1Y3RLaWQ6OlBhZ2VDb250ZW50OworICAgIHBLaWQtPm1fUGFnZUNvbnRlbnQubV9Db250ZW50SWQgPSBwS2lkT2JqLT5HZXRJbnRlZ2VyKCk7CisgICAgcEtpZC0+bV9QYWdlQ29udGVudC5tX1BhZ2VPYmpOdW0gPSBQYWdlT2JqTnVtOworICAgIHJldHVybjsKKyAgfQorCisgIENQREZfRGljdGlvbmFyeSogcEtpZERpY3QgPSBwS2lkT2JqLT5Bc0RpY3Rpb25hcnkoKTsKKyAgaWYgKCFwS2lkRGljdCkKKyAgICByZXR1cm47CisKKyAgaWYgKENQREZfUmVmZXJlbmNlKiBwUmVmID0gVG9SZWZlcmVuY2UocEtpZERpY3QtPkdldEVsZW1lbnQoIlBnIikpKQorICAgIFBhZ2VPYmpOdW0gPSBwUmVmLT5HZXRSZWZPYmpOdW0oKTsKKworICBDRlhfQnl0ZVN0cmluZyB0eXBlID0gcEtpZERpY3QtPkdldFN0cmluZygiVHlwZSIpOworICBpZiAodHlwZSA9PSAiTUNSIikgeworICAgIGlmIChtX3BUcmVlLT5tX3BQYWdlICYmIG1fcFRyZWUtPm1fcFBhZ2UtPkdldE9iak51bSgpICE9IFBhZ2VPYmpOdW0pIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgcEtpZC0+bV9UeXBlID0gQ1BERl9TdHJ1Y3RLaWQ6OlN0cmVhbUNvbnRlbnQ7CisgICAgaWYgKENQREZfUmVmZXJlbmNlKiBwUmVmID0gVG9SZWZlcmVuY2UocEtpZERpY3QtPkdldEVsZW1lbnQoIlN0bSIpKSkgeworICAgICAgcEtpZC0+bV9TdHJlYW1Db250ZW50Lm1fUmVmT2JqTnVtID0gcFJlZi0+R2V0UmVmT2JqTnVtKCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcEtpZC0+bV9UeXBlID0gQ1BERl9TdHJ1Y3RLaWQ6OkVsZW1lbnQ7Ci0gICAgICAgIHBLaWQtPm1fRWxlbWVudC5tX3BEaWN0ID0gcEtpZERpY3Q7Ci0gICAgICAgIGlmIChtX3BUcmVlLT5tX3BQYWdlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHBLaWQtPm1fRWxlbWVudC5tX3BFbGVtZW50ID0gbmV3IENQREZfU3RydWN0RWxlbWVudEltcGwobV9wVHJlZSwgdGhpcywgcEtpZERpY3QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcEtpZC0+bV9FbGVtZW50Lm1fcEVsZW1lbnQgPSBOVUxMOwotICAgICAgICB9CisgICAgICBwS2lkLT5tX1N0cmVhbUNvbnRlbnQubV9SZWZPYmpOdW0gPSAwOwogICAgIH0KKyAgICBwS2lkLT5tX1N0cmVhbUNvbnRlbnQubV9QYWdlT2JqTnVtID0gUGFnZU9iak51bTsKKyAgICBwS2lkLT5tX1N0cmVhbUNvbnRlbnQubV9Db250ZW50SWQgPSBwS2lkRGljdC0+R2V0SW50ZWdlcigiTUNJRCIpOworICB9IGVsc2UgaWYgKHR5cGUgPT0gIk9CSlIiKSB7CisgICAgaWYgKG1fcFRyZWUtPm1fcFBhZ2UgJiYgbV9wVHJlZS0+bV9wUGFnZS0+R2V0T2JqTnVtKCkgIT0gUGFnZU9iak51bSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwS2lkLT5tX1R5cGUgPSBDUERGX1N0cnVjdEtpZDo6T2JqZWN0OworICAgIGlmIChDUERGX1JlZmVyZW5jZSogcE9iaiA9IFRvUmVmZXJlbmNlKHBLaWREaWN0LT5HZXRFbGVtZW50KCJPYmoiKSkpIHsKKyAgICAgIHBLaWQtPm1fT2JqZWN0Lm1fUmVmT2JqTnVtID0gcE9iai0+R2V0UmVmT2JqTnVtKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBLaWQtPm1fT2JqZWN0Lm1fUmVmT2JqTnVtID0gMDsKKyAgICB9CisgICAgcEtpZC0+bV9PYmplY3QubV9QYWdlT2JqTnVtID0gUGFnZU9iak51bTsKKyAgfSBlbHNlIHsKKyAgICBwS2lkLT5tX1R5cGUgPSBDUERGX1N0cnVjdEtpZDo6RWxlbWVudDsKKyAgICBwS2lkLT5tX0VsZW1lbnQubV9wRGljdCA9IHBLaWREaWN0OworICAgIGlmICghbV9wVHJlZS0+bV9wUGFnZSkgeworICAgICAgcEtpZC0+bV9FbGVtZW50Lm1fcEVsZW1lbnQgPQorICAgICAgICAgIG5ldyBDUERGX1N0cnVjdEVsZW1lbnRJbXBsKG1fcFRyZWUsIHRoaXMsIHBLaWREaWN0KTsKKyAgICB9IGVsc2UgeworICAgICAgcEtpZC0+bV9FbGVtZW50Lm1fcEVsZW1lbnQgPSBOVUxMOworICAgIH0KKyAgfQogfQotc3RhdGljIENQREZfRGljdGlvbmFyeSogRmluZEF0dHJEaWN0KENQREZfT2JqZWN0KiBwQXR0cnMsIEZYX0JTVFIgb3duZXIsIEZYX0ZMT0FUIG5MZXZlbCA9IDAuMEYpCi17Ci0gICAgaWYgKG5MZXZlbCA+IG5NYXhSZWN1cnNpb24pIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChwQXR0cnMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IE5VTEw7Ci0gICAgaWYgKHBBdHRycy0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgIHBEaWN0ID0gKENQREZfRGljdGlvbmFyeSopcEF0dHJzOwotICAgIH0gZWxzZSBpZiAocEF0dHJzLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgewotICAgICAgICBwRGljdCA9ICgoQ1BERl9TdHJlYW0qKXBBdHRycyktPkdldERpY3QoKTsKLSAgICB9IGVsc2UgaWYgKHBBdHRycy0+R2V0VHlwZSgpID09IFBERk9CSl9BUlJBWSkgewotICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSAoQ1BERl9BcnJheSopcEF0dHJzOwotICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgICAgICBDUERGX09iamVjdCogcEVsZW1lbnQgPSBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZShpKTsKLSAgICAgICAgICAgIHBEaWN0ID0gRmluZEF0dHJEaWN0KHBFbGVtZW50LCBvd25lciwgbkxldmVsICsgMSk7Ci0gICAgICAgICAgICBpZiAocERpY3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcERpY3Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBEaWN0ICYmIHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIk8iKSkgPT0gb3duZXIpIHsKK3N0YXRpYyBDUERGX0RpY3Rpb25hcnkqIEZpbmRBdHRyRGljdChDUERGX09iamVjdCogcEF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbkxldmVsID0gMC4wRikgeworICBpZiAobkxldmVsID4gbk1heFJlY3Vyc2lvbikKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgaWYgKCFwQXR0cnMpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG51bGxwdHI7CisgIGlmIChwQXR0cnMtPklzRGljdGlvbmFyeSgpKSB7CisgICAgcERpY3QgPSBwQXR0cnMtPkFzRGljdGlvbmFyeSgpOworICB9IGVsc2UgaWYgKENQREZfU3RyZWFtKiBwU3RyZWFtID0gcEF0dHJzLT5Bc1N0cmVhbSgpKSB7CisgICAgcERpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7CisgIH0gZWxzZSBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcEF0dHJzLT5Bc0FycmF5KCkpIHsKKyAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyBpKyspIHsKKyAgICAgIENQREZfT2JqZWN0KiBwRWxlbWVudCA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKGkpOworICAgICAgcERpY3QgPSBGaW5kQXR0ckRpY3QocEVsZW1lbnQsIG93bmVyLCBuTGV2ZWwgKyAxKTsKKyAgICAgIGlmIChwRGljdCkKICAgICAgICAgcmV0dXJuIHBEaWN0OwogICAgIH0KLSAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAocERpY3QgJiYgcERpY3QtPkdldFN0cmluZygiTyIpID09IG93bmVyKQorICAgIHJldHVybiBwRGljdDsKKyAgcmV0dXJuIG51bGxwdHI7CiB9Ci1DUERGX09iamVjdCogQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6R2V0QXR0cihGWF9CU1RSIG93bmVyLCBGWF9CU1RSIG5hbWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlLCBGWF9GTE9BVCBmTGV2ZWwpCi17Ci0gICAgaWYgKGZMZXZlbCA+IG5NYXhSZWN1cnNpb24pIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CitDUERGX09iamVjdCogQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6R2V0QXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW5oZXJpdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTGV2ZWwpIHsKKyAgaWYgKGZMZXZlbCA+IG5NYXhSZWN1cnNpb24pIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoYkluaGVyaXRhYmxlKSB7CisgICAgQ1BERl9PYmplY3QqIHBBdHRyID0gR2V0QXR0cihvd25lciwgbmFtZSwgRkFMU0UpOworICAgIGlmIChwQXR0cikgeworICAgICAgcmV0dXJuIHBBdHRyOwogICAgIH0KLSAgICBpZiAoYkluaGVyaXRhYmxlKSB7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwQXR0ciA9IEdldEF0dHIob3duZXIsIG5hbWUsIEZBTFNFKTsKLSAgICAgICAgaWYgKHBBdHRyKSB7Ci0gICAgICAgICAgICByZXR1cm4gcEF0dHI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fcFBhcmVudCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbV9wUGFyZW50LT5HZXRBdHRyKG93bmVyLCBuYW1lLCBUUlVFLCBmTGV2ZWwgKyAxKTsKKyAgICBpZiAoIW1fcFBhcmVudCkgeworICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIENQREZfT2JqZWN0KiBwQSA9IG1fcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiQSIpKTsKLSAgICBpZiAocEEpIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQXR0ckRpY3QgPSBGaW5kQXR0ckRpY3QocEEsIG93bmVyKTsKLSAgICAgICAgaWYgKHBBdHRyRGljdCkgewotICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBBdHRyID0gcEF0dHJEaWN0LT5HZXRFbGVtZW50VmFsdWUobmFtZSk7Ci0gICAgICAgICAgICBpZiAocEF0dHIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcEF0dHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICByZXR1cm4gbV9wUGFyZW50LT5HZXRBdHRyKG93bmVyLCBuYW1lLCBUUlVFLCBmTGV2ZWwgKyAxKTsKKyAgfQorICBDUERGX09iamVjdCogcEEgPSBtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoIkEiKTsKKyAgaWYgKHBBKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQXR0ckRpY3QgPSBGaW5kQXR0ckRpY3QocEEsIG93bmVyKTsKKyAgICBpZiAocEF0dHJEaWN0KSB7CisgICAgICBDUERGX09iamVjdCogcEF0dHIgPSBwQXR0ckRpY3QtPkdldEVsZW1lbnRWYWx1ZShuYW1lKTsKKyAgICAgIGlmIChwQXR0cikgeworICAgICAgICByZXR1cm4gcEF0dHI7CisgICAgICB9CiAgICAgfQotICAgIENQREZfT2JqZWN0KiBwQyA9IG1fcERpY3QtPkdldEVsZW1lbnRWYWx1ZShGWF9CU1RSQygiQyIpKTsKLSAgICBpZiAocEMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwQ2xhc3NNYXAgPSBtX3BUcmVlLT5tX3BUcmVlUm9vdC0+R2V0RGljdChGWF9CU1RSQygiQ2xhc3NNYXAiKSk7Ci0gICAgaWYgKHBDbGFzc01hcCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAocEMtPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBDOwotICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyBpICsrKSB7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBjbGFzc19uYW1lID0gcEFycmF5LT5HZXRTdHJpbmcoaSk7Ci0gICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBDbGFzc0RpY3QgPSBwQ2xhc3NNYXAtPkdldERpY3QoY2xhc3NfbmFtZSk7Ci0gICAgICAgICAgICBpZiAocENsYXNzRGljdCAmJiBwQ2xhc3NEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIk8iKSkgPT0gb3duZXIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcENsYXNzRGljdC0+R2V0RWxlbWVudFZhbHVlKG5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBjbGFzc19uYW1lID0gcEMtPkdldFN0cmluZygpOwotICAgIENQREZfRGljdGlvbmFyeSogcENsYXNzRGljdCA9IHBDbGFzc01hcC0+R2V0RGljdChjbGFzc19uYW1lKTsKLSAgICBpZiAocENsYXNzRGljdCAmJiBwQ2xhc3NEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIk8iKSkgPT0gb3duZXIpIHsKKyAgfQorICBDUERGX09iamVjdCogcEMgPSBtX3BEaWN0LT5HZXRFbGVtZW50VmFsdWUoIkMiKTsKKyAgaWYgKCFwQykKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBDUERGX0RpY3Rpb25hcnkqIHBDbGFzc01hcCA9IG1fcFRyZWUtPm1fcFRyZWVSb290LT5HZXREaWN0KCJDbGFzc01hcCIpOworICBpZiAoIXBDbGFzc01hcCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcEMtPkFzQXJyYXkoKSkgeworICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwQXJyYXktPkdldENvdW50KCk7IGkrKykgeworICAgICAgQ0ZYX0J5dGVTdHJpbmcgY2xhc3NfbmFtZSA9IHBBcnJheS0+R2V0U3RyaW5nKGkpOworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQ2xhc3NEaWN0ID0gcENsYXNzTWFwLT5HZXREaWN0KGNsYXNzX25hbWUpOworICAgICAgaWYgKHBDbGFzc0RpY3QgJiYgcENsYXNzRGljdC0+R2V0U3RyaW5nKCJPIikgPT0gb3duZXIpCiAgICAgICAgIHJldHVybiBwQ2xhc3NEaWN0LT5HZXRFbGVtZW50VmFsdWUobmFtZSk7CiAgICAgfQotICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIENGWF9CeXRlU3RyaW5nIGNsYXNzX25hbWUgPSBwQy0+R2V0U3RyaW5nKCk7CisgIENQREZfRGljdGlvbmFyeSogcENsYXNzRGljdCA9IHBDbGFzc01hcC0+R2V0RGljdChjbGFzc19uYW1lKTsKKyAgaWYgKHBDbGFzc0RpY3QgJiYgcENsYXNzRGljdC0+R2V0U3RyaW5nKCJPIikgPT0gb3duZXIpCisgICAgcmV0dXJuIHBDbGFzc0RpY3QtPkdldEVsZW1lbnRWYWx1ZShuYW1lKTsKKyAgcmV0dXJuIG51bGxwdHI7CiB9Ci1DUERGX09iamVjdCogQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6R2V0QXR0cihGWF9CU1RSIG93bmVyLCBGWF9CU1RSIG5hbWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlLCBpbnQgc3ViaW5kZXgpCi17Ci0gICAgQ1BERl9PYmplY3QqIHBBdHRyID0gR2V0QXR0cihvd25lciwgbmFtZSwgYkluaGVyaXRhYmxlKTsKLSAgICBpZiAocEF0dHIgPT0gTlVMTCB8fCBzdWJpbmRleCA9PSAtMSB8fCBwQXR0ci0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkgewotICAgICAgICByZXR1cm4gcEF0dHI7Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwQXR0cjsKLSAgICBpZiAoc3ViaW5kZXggPj0gKGludClwQXJyYXktPkdldENvdW50KCkpIHsKLSAgICAgICAgcmV0dXJuIHBBdHRyOwotICAgIH0KLSAgICByZXR1cm4gcEFycmF5LT5HZXRFbGVtZW50VmFsdWUoc3ViaW5kZXgpOworQ1BERl9PYmplY3QqIENQREZfU3RydWN0RWxlbWVudEltcGw6OkdldEF0dHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkluaGVyaXRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YmluZGV4KSB7CisgIENQREZfT2JqZWN0KiBwQXR0ciA9IEdldEF0dHIob3duZXIsIG5hbWUsIGJJbmhlcml0YWJsZSk7CisgIENQREZfQXJyYXkqIHBBcnJheSA9IFRvQXJyYXkocEF0dHIpOworICBpZiAoIXBBcnJheSB8fCBzdWJpbmRleCA9PSAtMSkKKyAgICByZXR1cm4gcEF0dHI7CisKKyAgaWYgKHN1YmluZGV4ID49IHN0YXRpY19jYXN0PGludD4ocEFycmF5LT5HZXRDb3VudCgpKSkKKyAgICByZXR1cm4gcEF0dHI7CisgIHJldHVybiBwQXJyYXktPkdldEVsZW1lbnRWYWx1ZShzdWJpbmRleCk7CiB9Ci1DRlhfQnl0ZVN0cmluZyBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXROYW1lKEZYX0JTVFIgb3duZXIsIEZYX0JTVFIgbmFtZSwgRlhfQlNUUiBkZWZhdWx0X3ZhbHVlLCBGWF9CT09MIGJJbmhlcml0YWJsZSwgaW50IHN1YmluZGV4KQotewotICAgIENQREZfT2JqZWN0KiBwQXR0ciA9IEdldEF0dHIob3duZXIsIG5hbWUsIGJJbmhlcml0YWJsZSwgc3ViaW5kZXgpOwotICAgIGlmIChwQXR0ciA9PSBOVUxMIHx8IHBBdHRyLT5HZXRUeXBlKCkgIT0gUERGT0JKX05BTUUpIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7Ci0gICAgfQorQ0ZYX0J5dGVTdHJpbmcgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6R2V0TmFtZSgKKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLAorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGRlZmF1bHRfdmFsdWUsCisgICAgRlhfQk9PTCBiSW5oZXJpdGFibGUsCisgICAgaW50IHN1YmluZGV4KSB7CisgIENQREZfT2JqZWN0KiBwQXR0ciA9IEdldEF0dHIob3duZXIsIG5hbWUsIGJJbmhlcml0YWJsZSwgc3ViaW5kZXgpOworICBpZiAoVG9OYW1lKHBBdHRyKSkKICAgICByZXR1cm4gcEF0dHItPkdldFN0cmluZygpOworICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKIH0KLUZYX0FSR0IJQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6R2V0Q29sb3IoRlhfQlNUUiBvd25lciwgRlhfQlNUUiBuYW1lLCBGWF9BUkdCIGRlZmF1bHRfdmFsdWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlLCBpbnQgc3ViaW5kZXgpCi17Ci0gICAgQ1BERl9PYmplY3QqIHBBdHRyID0gR2V0QXR0cihvd25lciwgbmFtZSwgYkluaGVyaXRhYmxlLCBzdWJpbmRleCk7Ci0gICAgaWYgKHBBdHRyID09IE5VTEwgfHwgcEF0dHItPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7Ci0gICAgfQotICAgIENQREZfQXJyYXkqIHBBcnJheSA9IChDUERGX0FycmF5KilwQXR0cjsKLSAgICByZXR1cm4gMHhmZjAwMDAwMCB8ICgoaW50KShwQXJyYXktPkdldE51bWJlcigwKSAqIDI1NSkgPDwgMTYpIHwgKChpbnQpKHBBcnJheS0+R2V0TnVtYmVyKDEpICogMjU1KSA8PCA4KSB8IChpbnQpKHBBcnJheS0+R2V0TnVtYmVyKDIpICogMjU1KTsKKworRlhfQVJHQiBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXRDb2xvcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZGVmYXVsdF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW5oZXJpdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJpbmRleCkgeworICBDUERGX0FycmF5KiBwQXJyYXkgPSBUb0FycmF5KEdldEF0dHIob3duZXIsIG5hbWUsIGJJbmhlcml0YWJsZSwgc3ViaW5kZXgpKTsKKyAgaWYgKCFwQXJyYXkpCisgICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7CisgIHJldHVybiAweGZmMDAwMDAwIHwgKChpbnQpKHBBcnJheS0+R2V0TnVtYmVyKDApICogMjU1KSA8PCAxNikgfAorICAgICAgICAgKChpbnQpKHBBcnJheS0+R2V0TnVtYmVyKDEpICogMjU1KSA8PCA4KSB8CisgICAgICAgICAoaW50KShwQXJyYXktPkdldE51bWJlcigyKSAqIDI1NSk7CiB9Ci1GWF9GTE9BVCBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOjpHZXROdW1iZXIoRlhfQlNUUiBvd25lciwgRlhfQlNUUiBuYW1lLCBGWF9GTE9BVCBkZWZhdWx0X3ZhbHVlLCBGWF9CT09MIGJJbmhlcml0YWJsZSwgaW50IHN1YmluZGV4KQotewotICAgIENQREZfT2JqZWN0KiBwQXR0ciA9IEdldEF0dHIob3duZXIsIG5hbWUsIGJJbmhlcml0YWJsZSwgc3ViaW5kZXgpOwotICAgIGlmIChwQXR0ciA9PSBOVUxMIHx8IHBBdHRyLT5HZXRUeXBlKCkgIT0gUERGT0JKX05VTUJFUikgewotICAgICAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHBBdHRyLT5HZXROdW1iZXIoKTsKK0ZYX0ZMT0FUIENQREZfU3RydWN0RWxlbWVudEltcGw6OkdldE51bWJlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkZWZhdWx0X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkluaGVyaXRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJpbmRleCkgeworICBDUERGX09iamVjdCogcEF0dHIgPSBHZXRBdHRyKG93bmVyLCBuYW1lLCBiSW5oZXJpdGFibGUsIHN1YmluZGV4KTsKKyAgcmV0dXJuIFRvTnVtYmVyKHBBdHRyKSA/IHBBdHRyLT5HZXROdW1iZXIoKSA6IGRlZmF1bHRfdmFsdWU7CiB9Ci1pbnQJQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6R2V0SW50ZWdlcihGWF9CU1RSIG93bmVyLCBGWF9CU1RSIG5hbWUsIGludCBkZWZhdWx0X3ZhbHVlLCBGWF9CT09MIGJJbmhlcml0YWJsZSwgaW50IHN1YmluZGV4KQotewotICAgIENQREZfT2JqZWN0KiBwQXR0ciA9IEdldEF0dHIob3duZXIsIG5hbWUsIGJJbmhlcml0YWJsZSwgc3ViaW5kZXgpOwotICAgIGlmIChwQXR0ciA9PSBOVUxMIHx8IHBBdHRyLT5HZXRUeXBlKCkgIT0gUERGT0JKX05VTUJFUikgewotICAgICAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHBBdHRyLT5HZXRJbnRlZ2VyKCk7CitpbnQgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDo6R2V0SW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbmhlcml0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJpbmRleCkgeworICBDUERGX09iamVjdCogcEF0dHIgPSBHZXRBdHRyKG93bmVyLCBuYW1lLCBiSW5oZXJpdGFibGUsIHN1YmluZGV4KTsKKyAgcmV0dXJuIFRvTnVtYmVyKHBBdHRyKSA/IHBBdHRyLT5HZXRJbnRlZ2VyKCkgOiBkZWZhdWx0X3ZhbHVlOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfdXRpbHMuY3BwIGIvY29yZS9zcmMvZnBkZmRvYy9kb2NfdXRpbHMuY3BwCmluZGV4IDM1ZTAwMWUuLjQ4NTZjYjUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3V0aWxzLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY191dGlscy5jcHAKQEAgLTEsNzMwICsxLDcxMCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9kb2MuaCIKICNpbmNsdWRlICJkb2NfdXRpbHMuaCIKIAogc3RhdGljIGNvbnN0IGludCBGUERGRE9DX1VUSUxTX01BWFJFQ1VSU0lPTiA9IDMyOwogCi1DRlhfV2lkZVN0cmluZyBHZXRGdWxsTmFtZShDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpCi17Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgZnVsbF9uYW1lOwotICAgIENQREZfRGljdGlvbmFyeSogcExldmVsID0gcEZpZWxkRGljdDsKLSAgICB3aGlsZSAocExldmVsKSB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHNob3J0X25hbWUgPSBwTGV2ZWwtPkdldFVuaWNvZGVUZXh0KCJUIik7Ci0gICAgICAgIGlmIChzaG9ydF9uYW1lICE9IEwiIikgewotICAgICAgICAgICAgaWYgKGZ1bGxfbmFtZSA9PSBMIiIpIHsKLSAgICAgICAgICAgICAgICBmdWxsX25hbWUgPSBzaG9ydF9uYW1lOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmdWxsX25hbWUgPSBzaG9ydF9uYW1lICsgTCIuIiArIGZ1bGxfbmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwTGV2ZWwgPSBwTGV2ZWwtPkdldERpY3QoIlBhcmVudCIpOworQ0ZYX1dpZGVTdHJpbmcgR2V0RnVsbE5hbWUoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0KSB7CisgIENGWF9XaWRlU3RyaW5nIGZ1bGxfbmFtZTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwTGV2ZWwgPSBwRmllbGREaWN0OworICB3aGlsZSAocExldmVsKSB7CisgICAgQ0ZYX1dpZGVTdHJpbmcgc2hvcnRfbmFtZSA9IHBMZXZlbC0+R2V0VW5pY29kZVRleHQoIlQiKTsKKyAgICBpZiAoc2hvcnRfbmFtZSAhPSBMIiIpIHsKKyAgICAgIGlmIChmdWxsX25hbWUgPT0gTCIiKSB7CisgICAgICAgIGZ1bGxfbmFtZSA9IHNob3J0X25hbWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBmdWxsX25hbWUgPSBzaG9ydF9uYW1lICsgTCIuIiArIGZ1bGxfbmFtZTsKKyAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZ1bGxfbmFtZTsKKyAgICBwTGV2ZWwgPSBwTGV2ZWwtPkdldERpY3QoIlBhcmVudCIpOworICB9CisgIHJldHVybiBmdWxsX25hbWU7CiB9Ci1GWF9CT09MIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6Okhhc0ZvbnQoKQotewotICAgIGlmIChtX2NzREEuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KG1fY3NEQSk7Ci0gICAgcmV0dXJuIHN5bnRheC5GaW5kVGFnUGFyYW0oIlRmIiwgMik7CitGWF9CT09MIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6Okhhc0ZvbnQoKSB7CisgIGlmIChtX2NzREEuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChtX2NzREEpOworICByZXR1cm4gc3ludGF4LkZpbmRUYWdQYXJhbSgiVGYiLCAyKTsKIH0KLUNGWF9CeXRlU3RyaW5nIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6OkdldEZvbnRTdHJpbmcoKQotewotICAgIENGWF9CeXRlU3RyaW5nIGNzRm9udDsKLSAgICBpZiAobV9jc0RBLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gY3NGb250OwotICAgIH0KLSAgICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBKTsKLSAgICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbSgiVGYiLCAyKSkgewotICAgICAgICBjc0ZvbnQgKz0gKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCk7Ci0gICAgICAgIGNzRm9udCArPSAiICI7Ci0gICAgICAgIGNzRm9udCArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKLSAgICAgICAgY3NGb250ICs9ICIgIjsKLSAgICAgICAgY3NGb250ICs9IChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpOwotICAgIH0KK0NGWF9CeXRlU3RyaW5nIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6OkdldEZvbnRTdHJpbmcoKSB7CisgIENGWF9CeXRlU3RyaW5nIGNzRm9udDsKKyAgaWYgKG1fY3NEQS5Jc0VtcHR5KCkpIHsKICAgICByZXR1cm4gY3NGb250OworICB9CisgIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChtX2NzREEpOworICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbSgiVGYiLCAyKSkgeworICAgIGNzRm9udCArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKKyAgICBjc0ZvbnQgKz0gIiAiOworICAgIGNzRm9udCArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKKyAgICBjc0ZvbnQgKz0gIiAiOworICAgIGNzRm9udCArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKKyAgfQorICByZXR1cm4gY3NGb250OwogfQotdm9pZCBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpHZXRGb250KENGWF9CeXRlU3RyaW5nJiBjc0ZvbnROYW1lVGFnLCBGWF9GTE9BVCYgZkZvbnRTaXplKQotewotICAgIGNzRm9udE5hbWVUYWcgPSAiIjsKLSAgICBmRm9udFNpemUgPSAwOwotICAgIGlmIChtX2NzREEuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KG1fY3NEQSk7Ci0gICAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oIlRmIiwgMikpIHsKLSAgICAgICAgY3NGb250TmFtZVRhZyA9IChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpOwotICAgICAgICBjc0ZvbnROYW1lVGFnLkRlbGV0ZSgwLCAxKTsKLSAgICAgICAgZkZvbnRTaXplID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7Ci0gICAgfQotICAgIGNzRm9udE5hbWVUYWcgPSBQREZfTmFtZURlY29kZShjc0ZvbnROYW1lVGFnKTsKK3ZvaWQgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6R2V0Rm9udChDRlhfQnl0ZVN0cmluZyYgY3NGb250TmFtZVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkZvbnRTaXplKSB7CisgIGNzRm9udE5hbWVUYWcgPSAiIjsKKyAgZkZvbnRTaXplID0gMDsKKyAgaWYgKG1fY3NEQS5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KG1fY3NEQSk7CisgIGlmIChzeW50YXguRmluZFRhZ1BhcmFtKCJUZiIsIDIpKSB7CisgICAgY3NGb250TmFtZVRhZyA9IChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpOworICAgIGNzRm9udE5hbWVUYWcuRGVsZXRlKDAsIDEpOworICAgIGZGb250U2l6ZSA9IEZYX2F0b2YoKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCkpOworICB9CisgIGNzRm9udE5hbWVUYWcgPSBQREZfTmFtZURlY29kZShjc0ZvbnROYW1lVGFnKTsKIH0KLUZYX0JPT0wgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6SGFzQ29sb3IoRlhfQk9PTCBiU3Ryb2tpbmdPcGVyYXRpb24pCi17Ci0gICAgaWYgKG1fY3NEQS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBKTsKLSAgICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbShiU3Ryb2tpbmdPcGVyYXRpb24gPyAiRyIgOiAiZyIsIDEpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBzeW50YXguU2V0UG9zKDApOwotICAgIGlmIChzeW50YXguRmluZFRhZ1BhcmFtKGJTdHJva2luZ09wZXJhdGlvbiA/ICJSRyIgOiAicmciLCAzKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgc3ludGF4LlNldFBvcygwKTsKLSAgICByZXR1cm4gc3ludGF4LkZpbmRUYWdQYXJhbShiU3Ryb2tpbmdPcGVyYXRpb24gPyAiSyIgOiAiayIsIDQpOworRlhfQk9PTCBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpIYXNDb2xvcihGWF9CT09MIGJTdHJva2luZ09wZXJhdGlvbikgeworICBpZiAobV9jc0RBLklzRW1wdHkoKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBKTsKKyAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIkciIDogImciLCAxKSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIHN5bnRheC5TZXRQb3MoMCk7CisgIGlmIChzeW50YXguRmluZFRhZ1BhcmFtKGJTdHJva2luZ09wZXJhdGlvbiA/ICJSRyIgOiAicmciLCAzKSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIHN5bnRheC5TZXRQb3MoMCk7CisgIHJldHVybiBzeW50YXguRmluZFRhZ1BhcmFtKGJTdHJva2luZ09wZXJhdGlvbiA/ICJLIiA6ICJrIiwgNCk7CiB9Ci1DRlhfQnl0ZVN0cmluZyBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpHZXRDb2xvclN0cmluZyhGWF9CT09MIGJTdHJva2luZ09wZXJhdGlvbikKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc0NvbG9yOwotICAgIGlmIChtX2NzREEuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBjc0NvbG9yOwotICAgIH0KLSAgICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBKTsKLSAgICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbShiU3Ryb2tpbmdPcGVyYXRpb24gPyAiRyIgOiAiZyIsIDEpKSB7Ci0gICAgICAgIGNzQ29sb3IgKz0gKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCk7Ci0gICAgICAgIGNzQ29sb3IgKz0gIiAiOwotICAgICAgICBjc0NvbG9yICs9IChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpOwotICAgICAgICByZXR1cm4gY3NDb2xvcjsKLSAgICB9Ci0gICAgc3ludGF4LlNldFBvcygwKTsKLSAgICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbShiU3Ryb2tpbmdPcGVyYXRpb24gPyAiUkciIDogInJnIiwgMykpIHsKLSAgICAgICAgY3NDb2xvciArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKLSAgICAgICAgY3NDb2xvciArPSAiICI7Ci0gICAgICAgIGNzQ29sb3IgKz0gKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCk7Ci0gICAgICAgIGNzQ29sb3IgKz0gIiAiOwotICAgICAgICBjc0NvbG9yICs9IChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpOwotICAgICAgICBjc0NvbG9yICs9ICIgIjsKLSAgICAgICAgY3NDb2xvciArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKLSAgICAgICAgcmV0dXJuIGNzQ29sb3I7Ci0gICAgfQotICAgIHN5bnRheC5TZXRQb3MoMCk7Ci0gICAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIksiIDogImsiLCA0KSkgewotICAgICAgICBjc0NvbG9yICs9IChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpOwotICAgICAgICBjc0NvbG9yICs9ICIgIjsKLSAgICAgICAgY3NDb2xvciArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKLSAgICAgICAgY3NDb2xvciArPSAiICI7Ci0gICAgICAgIGNzQ29sb3IgKz0gKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCk7Ci0gICAgICAgIGNzQ29sb3IgKz0gIiAiOwotICAgICAgICBjc0NvbG9yICs9IChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpOwotICAgICAgICBjc0NvbG9yICs9ICIgIjsKLSAgICAgICAgY3NDb2xvciArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKLSAgICB9CitDRlhfQnl0ZVN0cmluZyBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpHZXRDb2xvclN0cmluZygKKyAgICBGWF9CT09MIGJTdHJva2luZ09wZXJhdGlvbikgeworICBDRlhfQnl0ZVN0cmluZyBjc0NvbG9yOworICBpZiAobV9jc0RBLklzRW1wdHkoKSkgewogICAgIHJldHVybiBjc0NvbG9yOworICB9CisgIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChtX2NzREEpOworICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbShiU3Ryb2tpbmdPcGVyYXRpb24gPyAiRyIgOiAiZyIsIDEpKSB7CisgICAgY3NDb2xvciArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKKyAgICBjc0NvbG9yICs9ICIgIjsKKyAgICBjc0NvbG9yICs9IChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpOworICAgIHJldHVybiBjc0NvbG9yOworICB9CisgIHN5bnRheC5TZXRQb3MoMCk7CisgIGlmIChzeW50YXguRmluZFRhZ1BhcmFtKGJTdHJva2luZ09wZXJhdGlvbiA/ICJSRyIgOiAicmciLCAzKSkgeworICAgIGNzQ29sb3IgKz0gKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCk7CisgICAgY3NDb2xvciArPSAiICI7CisgICAgY3NDb2xvciArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKKyAgICBjc0NvbG9yICs9ICIgIjsKKyAgICBjc0NvbG9yICs9IChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpOworICAgIGNzQ29sb3IgKz0gIiAiOworICAgIGNzQ29sb3IgKz0gKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCk7CisgICAgcmV0dXJuIGNzQ29sb3I7CisgIH0KKyAgc3ludGF4LlNldFBvcygwKTsKKyAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIksiIDogImsiLCA0KSkgeworICAgIGNzQ29sb3IgKz0gKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCk7CisgICAgY3NDb2xvciArPSAiICI7CisgICAgY3NDb2xvciArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKKyAgICBjc0NvbG9yICs9ICIgIjsKKyAgICBjc0NvbG9yICs9IChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpOworICAgIGNzQ29sb3IgKz0gIiAiOworICAgIGNzQ29sb3IgKz0gKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCk7CisgICAgY3NDb2xvciArPSAiICI7CisgICAgY3NDb2xvciArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKKyAgfQorICByZXR1cm4gY3NDb2xvcjsKIH0KLXZvaWQgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6R2V0Q29sb3IoaW50JiBpQ29sb3JUeXBlLCBGWF9GTE9BVCBmY1s0XSwgRlhfQk9PTCBiU3Ryb2tpbmdPcGVyYXRpb24pCi17Ci0gICAgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9UUkFOU1BBUkVOVDsKLSAgICBmb3IgKGludCBjID0gMDsgYyA8IDQ7IGMgKyspIHsKLSAgICAgICAgZmNbY10gPSAwOwotICAgIH0KLSAgICBpZiAobV9jc0RBLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChtX2NzREEpOwotICAgIGlmIChzeW50YXguRmluZFRhZ1BhcmFtKGJTdHJva2luZ09wZXJhdGlvbiA/ICJHIiA6ICJnIiwgMSkpIHsKLSAgICAgICAgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9HUkFZOwotICAgICAgICBmY1swXSA9IEZYX2F0b2YoKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN5bnRheC5TZXRQb3MoMCk7Ci0gICAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIlJHIiA6ICJyZyIsIDMpKSB7Ci0gICAgICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfUkdCOwotICAgICAgICBmY1swXSA9IEZYX2F0b2YoKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCkpOwotICAgICAgICBmY1sxXSA9IEZYX2F0b2YoKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCkpOwotICAgICAgICBmY1syXSA9IEZYX2F0b2YoKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN5bnRheC5TZXRQb3MoMCk7Ci0gICAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIksiIDogImsiLCA0KSkgewotICAgICAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX0NNWUs7Ci0gICAgICAgIGZjWzBdID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7Ci0gICAgICAgIGZjWzFdID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7Ci0gICAgICAgIGZjWzJdID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7Ci0gICAgICAgIGZjWzNdID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7Ci0gICAgfQordm9pZCBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpHZXRDb2xvcihpbnQmIGlDb2xvclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZjWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdHJva2luZ09wZXJhdGlvbikgeworICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOworICBmb3IgKGludCBjID0gMDsgYyA8IDQ7IGMrKykgeworICAgIGZjW2NdID0gMDsKKyAgfQorICBpZiAobV9jc0RBLklzRW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBKTsKKyAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIkciIDogImciLCAxKSkgeworICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfR1JBWTsKKyAgICBmY1swXSA9IEZYX2F0b2YoKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCkpOworICAgIHJldHVybjsKKyAgfQorICBzeW50YXguU2V0UG9zKDApOworICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbShiU3Ryb2tpbmdPcGVyYXRpb24gPyAiUkciIDogInJnIiwgMykpIHsKKyAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX1JHQjsKKyAgICBmY1swXSA9IEZYX2F0b2YoKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCkpOworICAgIGZjWzFdID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7CisgICAgZmNbMl0gPSBGWF9hdG9mKChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpKTsKKyAgICByZXR1cm47CisgIH0KKyAgc3ludGF4LlNldFBvcygwKTsKKyAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIksiIDogImsiLCA0KSkgeworICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfQ01ZSzsKKyAgICBmY1swXSA9IEZYX2F0b2YoKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCkpOworICAgIGZjWzFdID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7CisgICAgZmNbMl0gPSBGWF9hdG9mKChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpKTsKKyAgICBmY1szXSA9IEZYX2F0b2YoKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCkpOworICB9CiB9Ci12b2lkIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6OkdldENvbG9yKEZYX0FSR0ImIGNvbG9yLCBpbnQmIGlDb2xvclR5cGUsIEZYX0JPT0wgYlN0cm9raW5nT3BlcmF0aW9uKQotewotICAgIGNvbG9yID0gMDsKLSAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOwotICAgIGlmIChtX2NzREEuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KG1fY3NEQSk7Ci0gICAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIkciIDogImciLCAxKSkgewotICAgICAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX0dSQVk7Ci0gICAgICAgIEZYX0ZMT0FUIGcgPSBGWF9hdG9mKChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpKSAqIDI1NSArIDAuNWY7Ci0gICAgICAgIGNvbG9yID0gQXJnYkVuY29kZSgyNTUsIChpbnQpZywgKGludClnLCAoaW50KWcpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN5bnRheC5TZXRQb3MoMCk7Ci0gICAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIlJHIiA6ICJyZyIsIDMpKSB7Ci0gICAgICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfUkdCOwotICAgICAgICBGWF9GTE9BVCByID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSkgKiAyNTUgKyAwLjVmOwotICAgICAgICBGWF9GTE9BVCBnID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSkgKiAyNTUgKyAwLjVmOwotICAgICAgICBGWF9GTE9BVCBiID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSkgKiAyNTUgKyAwLjVmOwotICAgICAgICBjb2xvciA9IEFyZ2JFbmNvZGUoMjU1LCAoaW50KXIsIChpbnQpZywgKGludCliKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzeW50YXguU2V0UG9zKDApOwotICAgIGlmIChzeW50YXguRmluZFRhZ1BhcmFtKGJTdHJva2luZ09wZXJhdGlvbiA/ICJLIiA6ICJrIiwgNCkpIHsKLSAgICAgICAgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9DTVlLOwotICAgICAgICBGWF9GTE9BVCBjID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7Ci0gICAgICAgIEZYX0ZMT0FUIG0gPSBGWF9hdG9mKChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpKTsKLSAgICAgICAgRlhfRkxPQVQgeSA9IEZYX2F0b2YoKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCkpOwotICAgICAgICBGWF9GTE9BVCBrID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7Ci0gICAgICAgIEZYX0ZMT0FUIHIgPSAxLjBmIC0gRlhfTUlOKDEuMGYsIGMgKyBrKTsKLSAgICAgICAgRlhfRkxPQVQgZyA9IDEuMGYgLSBGWF9NSU4oMS4wZiwgbSArIGspOwotICAgICAgICBGWF9GTE9BVCBiID0gMS4wZiAtIEZYX01JTigxLjBmLCB5ICsgayk7Ci0gICAgICAgIGNvbG9yID0gQXJnYkVuY29kZSgyNTUsIChpbnQpKHIgKiAyNTUgKyAwLjVmKSwgKGludCkoZyAqIDI1NSArIDAuNWYpLCAoaW50KShiICogMjU1ICsgMC41ZikpOwotICAgIH0KK3ZvaWQgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6R2V0Q29sb3IoRlhfQVJHQiYgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgaUNvbG9yVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3Ryb2tpbmdPcGVyYXRpb24pIHsKKyAgY29sb3IgPSAwOworICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOworICBpZiAobV9jc0RBLklzRW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBKTsKKyAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIkciIDogImciLCAxKSkgeworICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfR1JBWTsKKyAgICBGWF9GTE9BVCBnID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSkgKiAyNTUgKyAwLjVmOworICAgIGNvbG9yID0gQXJnYkVuY29kZSgyNTUsIChpbnQpZywgKGludClnLCAoaW50KWcpOworICAgIHJldHVybjsKKyAgfQorICBzeW50YXguU2V0UG9zKDApOworICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbShiU3Ryb2tpbmdPcGVyYXRpb24gPyAiUkciIDogInJnIiwgMykpIHsKKyAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX1JHQjsKKyAgICBGWF9GTE9BVCByID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSkgKiAyNTUgKyAwLjVmOworICAgIEZYX0ZMT0FUIGcgPSBGWF9hdG9mKChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpKSAqIDI1NSArIDAuNWY7CisgICAgRlhfRkxPQVQgYiA9IEZYX2F0b2YoKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCkpICogMjU1ICsgMC41ZjsKKyAgICBjb2xvciA9IEFyZ2JFbmNvZGUoMjU1LCAoaW50KXIsIChpbnQpZywgKGludCliKTsKKyAgICByZXR1cm47CisgIH0KKyAgc3ludGF4LlNldFBvcygwKTsKKyAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oYlN0cm9raW5nT3BlcmF0aW9uID8gIksiIDogImsiLCA0KSkgeworICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfQ01ZSzsKKyAgICBGWF9GTE9BVCBjID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7CisgICAgRlhfRkxPQVQgbSA9IEZYX2F0b2YoKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCkpOworICAgIEZYX0ZMT0FUIHkgPSBGWF9hdG9mKChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpKTsKKyAgICBGWF9GTE9BVCBrID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7CisgICAgRlhfRkxPQVQgciA9IDEuMGYgLSBzdGQ6Om1pbigxLjBmLCBjICsgayk7CisgICAgRlhfRkxPQVQgZyA9IDEuMGYgLSBzdGQ6Om1pbigxLjBmLCBtICsgayk7CisgICAgRlhfRkxPQVQgYiA9IDEuMGYgLSBzdGQ6Om1pbigxLjBmLCB5ICsgayk7CisgICAgY29sb3IgPSBBcmdiRW5jb2RlKDI1NSwgKGludCkociAqIDI1NSArIDAuNWYpLCAoaW50KShnICogMjU1ICsgMC41ZiksCisgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGIgKiAyNTUgKyAwLjVmKSk7CisgIH0KIH0KLUZYX0JPT0wgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6SGFzVGV4dE1hdHJpeCgpCi17Ci0gICAgaWYgKG1fY3NEQS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBKTsKLSAgICByZXR1cm4gc3ludGF4LkZpbmRUYWdQYXJhbSgiVG0iLCA2KTsKK0ZYX0JPT0wgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6SGFzVGV4dE1hdHJpeCgpIHsKKyAgaWYgKG1fY3NEQS5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KG1fY3NEQSk7CisgIHJldHVybiBzeW50YXguRmluZFRhZ1BhcmFtKCJUbSIsIDYpOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6R2V0VGV4dE1hdHJpeFN0cmluZygpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NUTTsKLSAgICBpZiAobV9jc0RBLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gY3NUTTsKLSAgICB9Ci0gICAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KG1fY3NEQSk7Ci0gICAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oIlRtIiwgNikpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpICsrKSB7Ci0gICAgICAgICAgICBjc1RNICs9IChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpOwotICAgICAgICAgICAgY3NUTSArPSAiICI7Ci0gICAgICAgIH0KLSAgICAgICAgY3NUTSArPSAoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKTsKLSAgICB9CitDRlhfQnl0ZVN0cmluZyBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpHZXRUZXh0TWF0cml4U3RyaW5nKCkgeworICBDRlhfQnl0ZVN0cmluZyBjc1RNOworICBpZiAobV9jc0RBLklzRW1wdHkoKSkgewogICAgIHJldHVybiBjc1RNOworICB9CisgIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChtX2NzREEpOworICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbSgiVG0iLCA2KSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICBjc1RNICs9IChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpOworICAgICAgY3NUTSArPSAiICI7CisgICAgfQorICAgIGNzVE0gKz0gKENGWF9CeXRlU3RyaW5nKXN5bnRheC5HZXRXb3JkKCk7CisgIH0KKyAgcmV0dXJuIGNzVE07CiB9Ci1DRlhfQWZmaW5lTWF0cml4IENQREZfRGVmYXVsdEFwcGVhcmFuY2U6OkdldFRleHRNYXRyaXgoKQotewotICAgIENGWF9BZmZpbmVNYXRyaXggdG07Ci0gICAgaWYgKG1fY3NEQS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIHRtOwotICAgIH0KLSAgICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBKTsKLSAgICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbSgiVG0iLCA2KSkgewotICAgICAgICBGWF9GTE9BVCBmWzZdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkgKyspIHsKLSAgICAgICAgICAgIGZbaV0gPSBGWF9hdG9mKChDRlhfQnl0ZVN0cmluZylzeW50YXguR2V0V29yZCgpKTsKLSAgICAgICAgfQotICAgICAgICB0bS5TZXQoZlswXSwgZlsxXSwgZlsyXSwgZlszXSwgZls0XSwgZls1XSk7Ci0gICAgfQorQ0ZYX01hdHJpeCBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpHZXRUZXh0TWF0cml4KCkgeworICBDRlhfTWF0cml4IHRtOworICBpZiAobV9jc0RBLklzRW1wdHkoKSkgewogICAgIHJldHVybiB0bTsKKyAgfQorICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBKTsKKyAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW0oIlRtIiwgNikpIHsKKyAgICBGWF9GTE9BVCBmWzZdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICBmW2ldID0gRlhfYXRvZigoQ0ZYX0J5dGVTdHJpbmcpc3ludGF4LkdldFdvcmQoKSk7CisgICAgfQorICAgIHRtLlNldChmWzBdLCBmWzFdLCBmWzJdLCBmWzNdLCBmWzRdLCBmWzVdKTsKKyAgfQorICByZXR1cm4gdG07CiB9Ci12b2lkIEluaXRJbnRlckZvcm1EaWN0KENQREZfRGljdGlvbmFyeSomIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KQotewotICAgIGlmIChwRG9jdW1lbnQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Cit2b2lkIEluaXRJbnRlckZvcm1EaWN0KENQREZfRGljdGlvbmFyeSomIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KSB7CisgIGlmICghcERvY3VtZW50KSB7CisgICAgcmV0dXJuOworICB9CisgIGlmICghcEZvcm1EaWN0KSB7CisgICAgcEZvcm1EaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgICBGWF9EV09SRCBkd09iak51bSA9IHBEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocEZvcm1EaWN0KTsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gcERvY3VtZW50LT5HZXRSb290KCk7CisgICAgcFJvb3QtPlNldEF0UmVmZXJlbmNlKCJBY3JvRm9ybSIsIHBEb2N1bWVudCwgZHdPYmpOdW0pOworICB9CisgIENGWF9CeXRlU3RyaW5nIGNzREE7CisgIGlmICghcEZvcm1EaWN0LT5LZXlFeGlzdCgiRFIiKSkgeworICAgIENQREZfRm9udCogcEZvbnQgPSBOVUxMOworICAgIENGWF9CeXRlU3RyaW5nIGNzQmFzZU5hbWUsIGNzRGVmYXVsdDsKKyAgICB1aW50OF90IGNoYXJTZXQgPSBDUERGX0ludGVyRm9ybTo6R2V0TmF0aXZlQ2hhclNldCgpOworICAgIHBGb250ID0gQ1BERl9JbnRlckZvcm06OkFkZFN0YW5kYXJkRm9udChwRG9jdW1lbnQsICJIZWx2ZXRpY2EiKTsKKyAgICBpZiAocEZvbnQpIHsKKyAgICAgIEFkZEludGVyRm9ybUZvbnQocEZvcm1EaWN0LCBwRG9jdW1lbnQsIHBGb250LCBjc0Jhc2VOYW1lKTsKKyAgICAgIGNzRGVmYXVsdCA9IGNzQmFzZU5hbWU7CiAgICAgfQotICAgIGlmIChwRm9ybURpY3QgPT0gTlVMTCkgewotICAgICAgICBwRm9ybURpY3QgPSBDUERGX0RpY3Rpb25hcnk6OkNyZWF0ZSgpOwotICAgICAgICBpZiAocEZvcm1EaWN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICBpZiAoY2hhclNldCAhPSAwKSB7CisgICAgICBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lID0gQ1BERl9JbnRlckZvcm06OkdldE5hdGl2ZUZvbnQoY2hhclNldCwgTlVMTCk7CisgICAgICBpZiAoIXBGb250IHx8IGNzRm9udE5hbWUgIT0gIkhlbHZldGljYSIpIHsKKyAgICAgICAgcEZvbnQgPSBDUERGX0ludGVyRm9ybTo6QWRkTmF0aXZlRm9udChwRG9jdW1lbnQpOworICAgICAgICBpZiAocEZvbnQpIHsKKyAgICAgICAgICBjc0Jhc2VOYW1lID0gIiI7CisgICAgICAgICAgQWRkSW50ZXJGb3JtRm9udChwRm9ybURpY3QsIHBEb2N1bWVudCwgcEZvbnQsIGNzQmFzZU5hbWUpOworICAgICAgICAgIGNzRGVmYXVsdCA9IGNzQmFzZU5hbWU7CiAgICAgICAgIH0KLSAgICAgICAgRlhfRFdPUkQgZHdPYmpOdW0gPSBwRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBGb3JtRGljdCk7Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBwRG9jdW1lbnQtPkdldFJvb3QoKTsKLSAgICAgICAgcFJvb3QtPlNldEF0UmVmZXJlbmNlKCJBY3JvRm9ybSIsIHBEb2N1bWVudCwgZHdPYmpOdW0pOworICAgICAgfQogICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBjc0RBOwotICAgIGlmICghcEZvcm1EaWN0LT5LZXlFeGlzdCgiRFIiKSkgewotICAgICAgICBDUERGX0ZvbnQqIHBGb250ID0gTlVMTDsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NCYXNlTmFtZSwgY3NEZWZhdWx0OwotICAgICAgICBGWF9CWVRFIGNoYXJTZXQgPSBDUERGX0ludGVyRm9ybTo6R2V0TmF0aXZlQ2hhclNldCgpOwotICAgICAgICBwRm9udCA9IENQREZfSW50ZXJGb3JtOjpBZGRTdGFuZGFyZEZvbnQocERvY3VtZW50LCAiSGVsdmV0aWNhIik7Ci0gICAgICAgIGlmIChwRm9udCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBBZGRJbnRlckZvcm1Gb250KHBGb3JtRGljdCwgcERvY3VtZW50LCBwRm9udCwgY3NCYXNlTmFtZSk7Ci0gICAgICAgICAgICBjc0RlZmF1bHQgPSBjc0Jhc2VOYW1lOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjaGFyU2V0ICE9IDApIHsKLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUgPSBDUERGX0ludGVyRm9ybTo6R2V0TmF0aXZlRm9udChjaGFyU2V0LCBOVUxMKTsKLSAgICAgICAgICAgIGlmIChwRm9udCA9PSBOVUxMIHx8IGNzRm9udE5hbWUgIT0gIkhlbHZldGljYSIpIHsKLSAgICAgICAgICAgICAgICBwRm9udCA9IENQREZfSW50ZXJGb3JtOjpBZGROYXRpdmVGb250KHBEb2N1bWVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBGb250ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgY3NCYXNlTmFtZSA9ICIiOwotICAgICAgICAgICAgICAgICAgICBBZGRJbnRlckZvcm1Gb250KHBGb3JtRGljdCwgcERvY3VtZW50LCBwRm9udCwgY3NCYXNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNzRGVmYXVsdCA9IGNzQmFzZU5hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwRm9udCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjc0RBID0gIi8iICsgUERGX05hbWVFbmNvZGUoY3NEZWZhdWx0KSArICIgMCBUZiI7Ci0gICAgICAgIH0KKyAgICBpZiAocEZvbnQpIHsKKyAgICAgIGNzREEgPSAiLyIgKyBQREZfTmFtZUVuY29kZShjc0RlZmF1bHQpICsgIiAwIFRmIjsKICAgICB9Ci0gICAgaWYgKCFjc0RBLklzRW1wdHkoKSkgewotICAgICAgICBjc0RBICs9ICIgIjsKLSAgICB9Ci0gICAgY3NEQSArPSAiMCBnIjsKLSAgICBpZiAoIXBGb3JtRGljdC0+S2V5RXhpc3QoIkRBIikpIHsKLSAgICAgICAgcEZvcm1EaWN0LT5TZXRBdFN0cmluZygiREEiLCBjc0RBKTsKLSAgICB9CisgIH0KKyAgaWYgKCFjc0RBLklzRW1wdHkoKSkgeworICAgIGNzREEgKz0gIiAiOworICB9CisgIGNzREEgKz0gIjAgZyI7CisgIGlmICghcEZvcm1EaWN0LT5LZXlFeGlzdCgiREEiKSkgeworICAgIHBGb3JtRGljdC0+U2V0QXRTdHJpbmcoIkRBIiwgY3NEQSk7CisgIH0KIH0KLUZYX0RXT1JEIENvdW50SW50ZXJGb3JtRm9udHMoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QpCi17Ci0gICAgaWYgKHBGb3JtRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOworRlhfRFdPUkQgQ291bnRJbnRlckZvcm1Gb250cyhDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCkgeworICBpZiAoIXBGb3JtRGljdCkgeworICAgIHJldHVybiAwOworICB9CisgIENQREZfRGljdGlvbmFyeSogcERSID0gcEZvcm1EaWN0LT5HZXREaWN0KCJEUiIpOworICBpZiAoIXBEUikgeworICAgIHJldHVybiAwOworICB9CisgIENQREZfRGljdGlvbmFyeSogcEZvbnRzID0gcERSLT5HZXREaWN0KCJGb250Iik7CisgIGlmICghcEZvbnRzKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgRlhfRFdPUkQgZHdDb3VudCA9IDA7CisgIGZvciAoY29uc3QgYXV0byYgaXQgOiAqcEZvbnRzKSB7CisgICAgQ1BERl9PYmplY3QqIHBPYmogPSBpdC5zZWNvbmQ7CisgICAgaWYgKCFwT2JqKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRFIgPSBwRm9ybURpY3QtPkdldERpY3QoIkRSIik7Ci0gICAgaWYgKHBEUiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOworICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBEaXJlY3QgPSBUb0RpY3Rpb25hcnkocE9iai0+R2V0RGlyZWN0KCkpKSB7CisgICAgICBpZiAocERpcmVjdC0+R2V0U3RyaW5nKCJUeXBlIikgPT0gIkZvbnQiKSB7CisgICAgICAgIGR3Q291bnQrKzsKKyAgICAgIH0KICAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udHMgPSBwRFItPkdldERpY3QoIkZvbnQiKTsKLSAgICBpZiAocEZvbnRzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIEZYX0RXT1JEIGR3Q291bnQgPSAwOwotICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBGb250cy0+R2V0U3RhcnRQb3MoKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gTlVMTDsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NLZXk7Ci0gICAgICAgIHBPYmogPSBwRm9udHMtPkdldE5leHRFbGVtZW50KHBvcywgY3NLZXkpOwotICAgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDUERGX09iamVjdCogcERpcmVjdCA9IHBPYmotPkdldERpcmVjdCgpOwotICAgICAgICBpZiAocERpcmVjdCAhPSBOVUxMICYmIHBEaXJlY3QtPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICAgICAgaWYgKCgoQ1BERl9EaWN0aW9uYXJ5KilwRGlyZWN0KS0+R2V0U3RyaW5nKCJUeXBlIikgPT0gIkZvbnQiKSB7Ci0gICAgICAgICAgICAgICAgZHdDb3VudCArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZHdDb3VudDsKKyAgfQorICByZXR1cm4gZHdDb3VudDsKIH0KLUNQREZfRm9udCogR2V0SW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBGWF9EV09SRCBpbmRleCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKLXsKLSAgICBpZiAocEZvcm1EaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcERSID0gcEZvcm1EaWN0LT5HZXREaWN0KCJEUiIpOwotICAgIGlmIChwRFIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udHMgPSBwRFItPkdldERpY3QoIkZvbnQiKTsKLSAgICBpZiAocEZvbnRzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYX0RXT1JEIGR3Q291bnQgPSAwOwotICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBGb250cy0+R2V0U3RhcnRQb3MoKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gTlVMTDsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NLZXk7Ci0gICAgICAgIHBPYmogPSBwRm9udHMtPkdldE5leHRFbGVtZW50KHBvcywgY3NLZXkpOwotICAgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDUERGX09iamVjdCogcERpcmVjdCA9IHBPYmotPkdldERpcmVjdCgpOwotICAgICAgICBpZiAocERpcmVjdCA9PSBOVUxMIHx8IHBEaXJlY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRWxlbWVudCA9IChDUERGX0RpY3Rpb25hcnkqKXBEaXJlY3Q7Ci0gICAgICAgIGlmIChwRWxlbWVudC0+R2V0U3RyaW5nKCJUeXBlIikgIT0gIkZvbnQiKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZHdDb3VudCA9PSBpbmRleCkgewotICAgICAgICAgICAgY3NOYW1lVGFnID0gY3NLZXk7Ci0gICAgICAgICAgICByZXR1cm4gcERvY3VtZW50LT5Mb2FkRm9udChwRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZHdDb3VudCArKzsKLSAgICB9CitDUERGX0ZvbnQqIEdldEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpIHsKKyAgaWYgKCFwRm9ybURpY3QpIHsKICAgICByZXR1cm4gTlVMTDsKLX0KLUNQREZfRm9udCogR2V0SW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfQnl0ZVN0cmluZyBjc05hbWVUYWcpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NBbGlhcyA9IFBERl9OYW1lRGVjb2RlKGNzTmFtZVRhZyk7Ci0gICAgaWYgKHBGb3JtRGljdCA9PSBOVUxMIHx8IGNzQWxpYXMuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEUiA9IHBGb3JtRGljdC0+R2V0RGljdCgiRFIiKTsKLSAgICBpZiAocERSID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcEZvbnRzID0gcERSLT5HZXREaWN0KCJGb250Iik7Ci0gICAgaWYgKHBGb250cyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBFbGVtZW50ID0gcEZvbnRzLT5HZXREaWN0KGNzQWxpYXMpOwotICAgIGlmIChwRWxlbWVudCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAocEVsZW1lbnQtPkdldFN0cmluZygiVHlwZSIpID09ICJGb250IikgewotICAgICAgICByZXR1cm4gcERvY3VtZW50LT5Mb2FkRm9udChwRWxlbWVudCk7Ci0gICAgfQorICB9CisgIENQREZfRGljdGlvbmFyeSogcERSID0gcEZvcm1EaWN0LT5HZXREaWN0KCJEUiIpOworICBpZiAoIXBEUikgewogICAgIHJldHVybiBOVUxMOwotfQotQ1BERl9Gb250KiBHZXRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCi17Ci0gICAgaWYgKHBGb3JtRGljdCA9PSBOVUxMIHx8IGNzRm9udE5hbWUuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEUiA9IHBGb3JtRGljdC0+R2V0RGljdCgiRFIiKTsKLSAgICBpZiAocERSID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcEZvbnRzID0gcERSLT5HZXREaWN0KCJGb250Iik7Ci0gICAgaWYgKHBGb250cyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBGWF9QT1NJVElPTiBwb3MgPSBwRm9udHMtPkdldFN0YXJ0UG9zKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IE5VTEw7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGNzS2V5OwotICAgICAgICBwT2JqID0gcEZvbnRzLT5HZXROZXh0RWxlbWVudChwb3MsIGNzS2V5KTsKLSAgICAgICAgaWYgKHBPYmogPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9PYmplY3QqIHBEaXJlY3QgPSBwT2JqLT5HZXREaXJlY3QoKTsKLSAgICAgICAgaWYgKHBEaXJlY3QgPT0gTlVMTCB8fCBwRGlyZWN0LT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIENQREZfRGljdGlvbmFyeSogcEVsZW1lbnQgPSAoQ1BERl9EaWN0aW9uYXJ5KilwRGlyZWN0OwotICAgICAgICBpZiAocEVsZW1lbnQtPkdldFN0cmluZygiVHlwZSIpICE9ICJGb250IikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9Gb250KiBwRmluZCA9IHBEb2N1bWVudC0+TG9hZEZvbnQocEVsZW1lbnQpOwotICAgICAgICBpZiAocEZpbmQgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NCYXNlRm9udDsKLSAgICAgICAgY3NCYXNlRm9udCA9IHBGaW5kLT5HZXRCYXNlRm9udCgpOwotICAgICAgICBjc0Jhc2VGb250LlJlbW92ZSgnICcpOwotICAgICAgICBpZiAoY3NCYXNlRm9udCA9PSBjc0ZvbnROYW1lKSB7Ci0gICAgICAgICAgICBjc05hbWVUYWcgPSBjc0tleTsKLSAgICAgICAgICAgIHJldHVybiBwRmluZDsKLSAgICAgICAgfQotICAgIH0KKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBGb250cyA9IHBEUi0+R2V0RGljdCgiRm9udCIpOworICBpZiAoIXBGb250cykgewogICAgIHJldHVybiBOVUxMOworICB9CisgIEZYX0RXT1JEIGR3Q291bnQgPSAwOworICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogKnBGb250cykgeworICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc0tleSA9IGl0LmZpcnN0OworICAgIENQREZfT2JqZWN0KiBwT2JqID0gaXQuc2Vjb25kOworICAgIGlmICghcE9iaikgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIENQREZfRGljdGlvbmFyeSogcEVsZW1lbnQgPSBUb0RpY3Rpb25hcnkocE9iai0+R2V0RGlyZWN0KCkpOworICAgIGlmICghcEVsZW1lbnQpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAocEVsZW1lbnQtPkdldFN0cmluZygiVHlwZSIpICE9ICJGb250IikKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChkd0NvdW50ID09IGluZGV4KSB7CisgICAgICBjc05hbWVUYWcgPSBjc0tleTsKKyAgICAgIHJldHVybiBwRG9jdW1lbnQtPkxvYWRGb250KHBFbGVtZW50KTsKKyAgICB9CisgICAgZHdDb3VudCsrOworICB9CisgIHJldHVybiBOVUxMOwogfQotQ1BERl9Gb250KiBHZXROYXRpdmVJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIEZYX0JZVEUgY2hhclNldCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKLXsKLSAgICBpZiAocEZvcm1EaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcERSID0gcEZvcm1EaWN0LT5HZXREaWN0KCJEUiIpOwotICAgIGlmIChwRFIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udHMgPSBwRFItPkdldERpY3QoIkZvbnQiKTsKLSAgICBpZiAocEZvbnRzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBGb250cy0+R2V0U3RhcnRQb3MoKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gTlVMTDsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NLZXk7Ci0gICAgICAgIHBPYmogPSBwRm9udHMtPkdldE5leHRFbGVtZW50KHBvcywgY3NLZXkpOwotICAgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDUERGX09iamVjdCogcERpcmVjdCA9IHBPYmotPkdldERpcmVjdCgpOwotICAgICAgICBpZiAocERpcmVjdCA9PSBOVUxMIHx8IHBEaXJlY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRWxlbWVudCA9IChDUERGX0RpY3Rpb25hcnkqKXBEaXJlY3Q7Ci0gICAgICAgIGlmIChwRWxlbWVudC0+R2V0U3RyaW5nKCJUeXBlIikgIT0gIkZvbnQiKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDUERGX0ZvbnQqIHBGaW5kID0gcERvY3VtZW50LT5Mb2FkRm9udChwRWxlbWVudCk7Ci0gICAgICAgIGlmIChwRmluZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDRlhfU3Vic3RGb250KiBwU3Vic3QgPSAoQ0ZYX1N1YnN0Rm9udCopcEZpbmQtPkdldFN1YnN0Rm9udCgpOwotICAgICAgICBpZiAocFN1YnN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwU3Vic3QtPm1fQ2hhcnNldCA9PSAoaW50KWNoYXJTZXQpIHsKLSAgICAgICAgICAgIGNzTmFtZVRhZyA9IGNzS2V5OwotICAgICAgICAgICAgcmV0dXJuIHBGaW5kOwotICAgICAgICB9Ci0gICAgfQorQ1BERl9Gb250KiBHZXRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBjc05hbWVUYWcpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgY3NBbGlhcyA9IFBERl9OYW1lRGVjb2RlKGNzTmFtZVRhZyk7CisgIGlmICghcEZvcm1EaWN0IHx8IGNzQWxpYXMuSXNFbXB0eSgpKSB7CiAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRFIgPSBwRm9ybURpY3QtPkdldERpY3QoIkRSIik7CisgIGlmICghcERSKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udHMgPSBwRFItPkdldERpY3QoIkZvbnQiKTsKKyAgaWYgKCFwRm9udHMpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBFbGVtZW50ID0gcEZvbnRzLT5HZXREaWN0KGNzQWxpYXMpOworICBpZiAoIXBFbGVtZW50KSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHBFbGVtZW50LT5HZXRTdHJpbmcoIlR5cGUiKSA9PSAiRm9udCIpIHsKKyAgICByZXR1cm4gcERvY3VtZW50LT5Mb2FkRm9udChwRWxlbWVudCk7CisgIH0KKyAgcmV0dXJuIE5VTEw7CiB9Ci1DUERGX0ZvbnQqIEdldE5hdGl2ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKLXsKLSAgICBjc05hbWVUYWcgPSAiIjsKLSAgICBGWF9CWVRFIGNoYXJTZXQgPSBDUERGX0ludGVyRm9ybTo6R2V0TmF0aXZlQ2hhclNldCgpOwotICAgIENGWF9TdWJzdEZvbnQqIHBTdWJzdDsKLSAgICBDUERGX0ZvbnQqIHBGb250ID0gR2V0RGVmYXVsdEludGVyRm9ybUZvbnQocEZvcm1EaWN0LCBwRG9jdW1lbnQpOwotICAgIGlmIChwRm9udCAhPSBOVUxMKSB7Ci0gICAgICAgIHBTdWJzdCA9IChDRlhfU3Vic3RGb250KilwRm9udC0+R2V0U3Vic3RGb250KCk7Ci0gICAgICAgIGlmIChwU3Vic3QgIT0gTlVMTCAmJiBwU3Vic3QtPm1fQ2hhcnNldCA9PSAoaW50KWNoYXJTZXQpIHsKLSAgICAgICAgICAgIEZpbmRJbnRlckZvcm1Gb250KHBGb3JtRGljdCwgcEZvbnQsIGNzTmFtZVRhZyk7Ci0gICAgICAgICAgICByZXR1cm4gcEZvbnQ7Ci0gICAgICAgIH0KK0NQREZfRm9udCogR2V0SW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKSB7CisgIGlmICghcEZvcm1EaWN0IHx8IGNzRm9udE5hbWUuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRFIgPSBwRm9ybURpY3QtPkdldERpY3QoIkRSIik7CisgIGlmICghcERSKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udHMgPSBwRFItPkdldERpY3QoIkZvbnQiKTsKKyAgaWYgKCFwRm9udHMpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogKnBGb250cykgeworICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc0tleSA9IGl0LmZpcnN0OworICAgIENQREZfT2JqZWN0KiBwT2JqID0gaXQuc2Vjb25kOworICAgIGlmICghcE9iaikgeworICAgICAgY29udGludWU7CiAgICAgfQotICAgIHJldHVybiBHZXROYXRpdmVJbnRlckZvcm1Gb250KHBGb3JtRGljdCwgcERvY3VtZW50LCBjaGFyU2V0LCBjc05hbWVUYWcpOworICAgIENQREZfRGljdGlvbmFyeSogcEVsZW1lbnQgPSBUb0RpY3Rpb25hcnkocE9iai0+R2V0RGlyZWN0KCkpOworICAgIGlmICghcEVsZW1lbnQpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAocEVsZW1lbnQtPkdldFN0cmluZygiVHlwZSIpICE9ICJGb250IikKKyAgICAgIGNvbnRpbnVlOworCisgICAgQ1BERl9Gb250KiBwRmluZCA9IHBEb2N1bWVudC0+TG9hZEZvbnQocEVsZW1lbnQpOworICAgIGlmICghcEZpbmQpCisgICAgICBjb250aW51ZTsKKworICAgIENGWF9CeXRlU3RyaW5nIGNzQmFzZUZvbnQ7CisgICAgY3NCYXNlRm9udCA9IHBGaW5kLT5HZXRCYXNlRm9udCgpOworICAgIGNzQmFzZUZvbnQuUmVtb3ZlKCcgJyk7CisgICAgaWYgKGNzQmFzZUZvbnQgPT0gY3NGb250TmFtZSkgeworICAgICAgY3NOYW1lVGFnID0gY3NLZXk7CisgICAgICByZXR1cm4gcEZpbmQ7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOwogfQotRlhfQk9PTCBGaW5kSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgY29uc3QgQ1BERl9Gb250KiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKLXsKLSAgICBpZiAocEZvcm1EaWN0ID09IE5VTEwgfHwgcEZvbnQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CitDUERGX0ZvbnQqIEdldE5hdGl2ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2hhclNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKSB7CisgIGlmICghcEZvcm1EaWN0KSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRFIgPSBwRm9ybURpY3QtPkdldERpY3QoIkRSIik7CisgIGlmICghcERSKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udHMgPSBwRFItPkdldERpY3QoIkZvbnQiKTsKKyAgaWYgKCFwRm9udHMpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogKnBGb250cykgeworICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc0tleSA9IGl0LmZpcnN0OworICAgIENQREZfT2JqZWN0KiBwT2JqID0gaXQuc2Vjb25kOworICAgIGlmICghcE9iaikgeworICAgICAgY29udGludWU7CiAgICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcERSID0gcEZvcm1EaWN0LT5HZXREaWN0KCJEUiIpOwotICAgIGlmIChwRFIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRWxlbWVudCA9IFRvRGljdGlvbmFyeShwT2JqLT5HZXREaXJlY3QoKSk7CisgICAgaWYgKCFwRWxlbWVudCkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChwRWxlbWVudC0+R2V0U3RyaW5nKCJUeXBlIikgIT0gIkZvbnQiKQorICAgICAgY29udGludWU7CisgICAgQ1BERl9Gb250KiBwRmluZCA9IHBEb2N1bWVudC0+TG9hZEZvbnQocEVsZW1lbnQpOworICAgIGlmICghcEZpbmQpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBGb250cyA9IHBEUi0+R2V0RGljdCgiRm9udCIpOwotICAgIGlmIChwRm9udHMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0ID0gKENGWF9TdWJzdEZvbnQqKXBGaW5kLT5HZXRTdWJzdEZvbnQoKTsKKyAgICBpZiAoIXBTdWJzdCkgeworICAgICAgY29udGludWU7CiAgICAgfQotICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBGb250cy0+R2V0U3RhcnRQb3MoKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwT2JqID0gTlVMTDsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NLZXk7Ci0gICAgICAgIHBPYmogPSBwRm9udHMtPkdldE5leHRFbGVtZW50KHBvcywgY3NLZXkpOwotICAgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDUERGX09iamVjdCogcERpcmVjdCA9IHBPYmotPkdldERpcmVjdCgpOwotICAgICAgICBpZiAocERpcmVjdCA9PSBOVUxMIHx8IHBEaXJlY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRWxlbWVudCA9IChDUERGX0RpY3Rpb25hcnkqKXBEaXJlY3Q7Ci0gICAgICAgIGlmIChwRWxlbWVudC0+R2V0U3RyaW5nKCJUeXBlIikgIT0gIkZvbnQiKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocEZvbnQtPkdldEZvbnREaWN0KCkgPT0gcEVsZW1lbnQpIHsKLSAgICAgICAgICAgIGNzTmFtZVRhZyA9IGNzS2V5OwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KKyAgICBpZiAocFN1YnN0LT5tX0NoYXJzZXQgPT0gKGludCljaGFyU2V0KSB7CisgICAgICBjc05hbWVUYWcgPSBjc0tleTsKKyAgICAgIHJldHVybiBwRmluZDsKICAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CitDUERGX0ZvbnQqIEdldE5hdGl2ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpIHsKKyAgY3NOYW1lVGFnID0gIiI7CisgIHVpbnQ4X3QgY2hhclNldCA9IENQREZfSW50ZXJGb3JtOjpHZXROYXRpdmVDaGFyU2V0KCk7CisgIENGWF9TdWJzdEZvbnQqIHBTdWJzdDsKKyAgQ1BERl9Gb250KiBwRm9udCA9IEdldERlZmF1bHRJbnRlckZvcm1Gb250KHBGb3JtRGljdCwgcERvY3VtZW50KTsKKyAgaWYgKHBGb250KSB7CisgICAgcFN1YnN0ID0gKENGWF9TdWJzdEZvbnQqKXBGb250LT5HZXRTdWJzdEZvbnQoKTsKKyAgICBpZiAocFN1YnN0ICYmIHBTdWJzdC0+bV9DaGFyc2V0ID09IChpbnQpY2hhclNldCkgeworICAgICAgRmluZEludGVyRm9ybUZvbnQocEZvcm1EaWN0LCBwRm9udCwgY3NOYW1lVGFnKTsKKyAgICAgIHJldHVybiBwRm9udDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEdldE5hdGl2ZUludGVyRm9ybUZvbnQocEZvcm1EaWN0LCBwRG9jdW1lbnQsIGNoYXJTZXQsIGNzTmFtZVRhZyk7Cit9CitGWF9CT09MIEZpbmRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKSB7CisgIGlmICghcEZvcm1EaWN0IHx8ICFwRm9udCkgewogICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wgRmluZEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwgQ1BERl9Gb250KiYgcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpCi17Ci0gICAgaWYgKHBGb3JtRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRFIgPSBwRm9ybURpY3QtPkdldERpY3QoIkRSIik7Ci0gICAgaWYgKHBEUiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udHMgPSBwRFItPkdldERpY3QoIkZvbnQiKTsKLSAgICBpZiAocEZvbnRzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoY3NGb250TmFtZS5HZXRMZW5ndGgoKSA+IDApIHsKLSAgICAgICAgY3NGb250TmFtZS5SZW1vdmUoJyAnKTsKLSAgICB9Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gcEZvbnRzLT5HZXRTdGFydFBvcygpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBOVUxMOwotICAgICAgICBDRlhfQnl0ZVN0cmluZyBjc0tleSwgY3NUbXA7Ci0gICAgICAgIHBPYmogPSBwRm9udHMtPkdldE5leHRFbGVtZW50KHBvcywgY3NLZXkpOwotICAgICAgICBpZiAocE9iaiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDUERGX09iamVjdCogcERpcmVjdCA9IHBPYmotPkdldERpcmVjdCgpOwotICAgICAgICBpZiAocERpcmVjdCA9PSBOVUxMIHx8IHBEaXJlY3QtPkdldFR5cGUoKSAhPSBQREZPQkpfRElDVElPTkFSWSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRWxlbWVudCA9IChDUERGX0RpY3Rpb25hcnkqKXBEaXJlY3Q7Ci0gICAgICAgIGlmIChwRWxlbWVudC0+R2V0U3RyaW5nKCJUeXBlIikgIT0gIkZvbnQiKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBwRm9udCA9IHBEb2N1bWVudC0+TG9hZEZvbnQocEVsZW1lbnQpOwotICAgICAgICBpZiAocEZvbnQgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NCYXNlRm9udDsKLSAgICAgICAgY3NCYXNlRm9udCA9IHBGb250LT5HZXRCYXNlRm9udCgpOwotICAgICAgICBjc0Jhc2VGb250LlJlbW92ZSgnICcpOwotICAgICAgICBpZiAoY3NCYXNlRm9udCA9PSBjc0ZvbnROYW1lKSB7Ci0gICAgICAgICAgICBjc05hbWVUYWcgPSBjc0tleTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQorICB9CisgIENQREZfRGljdGlvbmFyeSogcERSID0gcEZvcm1EaWN0LT5HZXREaWN0KCJEUiIpOworICBpZiAoIXBEUikgewogICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBGb250cyA9IHBEUi0+R2V0RGljdCgiRm9udCIpOworICBpZiAoIXBGb250cykgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogKnBGb250cykgeworICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc0tleSA9IGl0LmZpcnN0OworICAgIENQREZfT2JqZWN0KiBwT2JqID0gaXQuc2Vjb25kOworICAgIGlmICghcE9iaikgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIENQREZfRGljdGlvbmFyeSogcEVsZW1lbnQgPSBUb0RpY3Rpb25hcnkocE9iai0+R2V0RGlyZWN0KCkpOworICAgIGlmICghcEVsZW1lbnQpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAocEVsZW1lbnQtPkdldFN0cmluZygiVHlwZSIpICE9ICJGb250IikgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChwRm9udC0+R2V0Rm9udERpY3QoKSA9PSBwRWxlbWVudCkgeworICAgICAgY3NOYW1lVGFnID0gY3NLZXk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQotdm9pZCBBZGRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSomIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDUERGX0ZvbnQqIHBGb250LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKQotewotICAgIGlmIChwRm9udCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKK0ZYX0JPT0wgRmluZEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiYgcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpIHsKKyAgaWYgKCFwRm9ybURpY3QpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRFIgPSBwRm9ybURpY3QtPkdldERpY3QoIkRSIik7CisgIGlmICghcERSKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZfRGljdGlvbmFyeSogcEZvbnRzID0gcERSLT5HZXREaWN0KCJGb250Iik7CisgIGlmICghcEZvbnRzKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChjc0ZvbnROYW1lLkdldExlbmd0aCgpID4gMCkgeworICAgIGNzRm9udE5hbWUuUmVtb3ZlKCcgJyk7CisgIH0KKyAgZm9yIChjb25zdCBhdXRvJiBpdCA6ICpwRm9udHMpIHsKKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NLZXkgPSBpdC5maXJzdDsKKyAgICBDUERGX09iamVjdCogcE9iaiA9IGl0LnNlY29uZDsKKyAgICBpZiAoIXBPYmopIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpZiAocEZvcm1EaWN0ID09IE5VTEwpIHsKLSAgICAgICAgSW5pdEludGVyRm9ybURpY3QocEZvcm1EaWN0LCBwRG9jdW1lbnQpOworICAgIENQREZfRGljdGlvbmFyeSogcEVsZW1lbnQgPSBUb0RpY3Rpb25hcnkocE9iai0+R2V0RGlyZWN0KCkpOworICAgIGlmICghcEVsZW1lbnQpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAocEVsZW1lbnQtPkdldFN0cmluZygiVHlwZSIpICE9ICJGb250IikgeworICAgICAgY29udGludWU7CiAgICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGNzVGFnOwotICAgIGlmIChGaW5kSW50ZXJGb3JtRm9udChwRm9ybURpY3QsIHBGb250LCBjc1RhZykpIHsKLSAgICAgICAgY3NOYW1lVGFnID0gY3NUYWc7Ci0gICAgICAgIHJldHVybjsKKyAgICBwRm9udCA9IHBEb2N1bWVudC0+TG9hZEZvbnQocEVsZW1lbnQpOworICAgIGlmICghcEZvbnQpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpZiAocEZvcm1EaWN0ID09IE5VTEwpIHsKLSAgICAgICAgSW5pdEludGVyRm9ybURpY3QocEZvcm1EaWN0LCBwRG9jdW1lbnQpOworICAgIENGWF9CeXRlU3RyaW5nIGNzQmFzZUZvbnQ7CisgICAgY3NCYXNlRm9udCA9IHBGb250LT5HZXRCYXNlRm9udCgpOworICAgIGNzQmFzZUZvbnQuUmVtb3ZlKCcgJyk7CisgICAgaWYgKGNzQmFzZUZvbnQgPT0gY3NGb250TmFtZSkgeworICAgICAgY3NOYW1lVGFnID0gY3NLZXk7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRFIgPSBwRm9ybURpY3QtPkdldERpY3QoIkRSIik7Ci0gICAgaWYgKHBEUiA9PSBOVUxMKSB7Ci0gICAgICAgIHBEUiA9IENQREZfRGljdGlvbmFyeTo6Q3JlYXRlKCk7Ci0gICAgICAgIGlmIChwRFIgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHBGb3JtRGljdC0+U2V0QXQoIkRSIiwgcERSKTsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udHMgPSBwRFItPkdldERpY3QoIkZvbnQiKTsKLSAgICBpZiAocEZvbnRzID09IE5VTEwpIHsKLSAgICAgICAgcEZvbnRzID0gQ1BERl9EaWN0aW9uYXJ5OjpDcmVhdGUoKTsKLSAgICAgICAgcERSLT5TZXRBdCgiRm9udCIsIHBGb250cyk7Ci0gICAgfQotICAgIGlmIChjc05hbWVUYWcuSXNFbXB0eSgpKSB7Ci0gICAgICAgIGNzTmFtZVRhZyA9IHBGb250LT5HZXRCYXNlRm9udCgpOwotICAgIH0KLSAgICBjc05hbWVUYWcuUmVtb3ZlKCcgJyk7Ci0gICAgY3NOYW1lVGFnID0gQ1BERl9JbnRlckZvcm06OkdlbmVyYXRlTmV3UmVzb3VyY2VOYW1lKHBEUiwgIkZvbnQiLCA0LCBjc05hbWVUYWcpOwotICAgIHBGb250cy0+U2V0QXRSZWZlcmVuY2UoY3NOYW1lVGFnLCBwRG9jdW1lbnQsIHBGb250LT5HZXRGb250RGljdCgpKTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1DUERGX0ZvbnQqIEFkZE5hdGl2ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiYgcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIEZYX0JZVEUgY2hhclNldCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykKLXsKLSAgICBpZiAocEZvcm1EaWN0ID09IE5VTEwpIHsKLSAgICAgICAgSW5pdEludGVyRm9ybURpY3QocEZvcm1EaWN0LCBwRG9jdW1lbnQpOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBjc1RlbXA7Ci0gICAgQ1BERl9Gb250KiBwRm9udCA9IEdldE5hdGl2ZUludGVyRm9ybUZvbnQocEZvcm1EaWN0LCBwRG9jdW1lbnQsIGNoYXJTZXQsIGNzVGVtcCk7Ci0gICAgaWYgKHBGb250ICE9IE5VTEwpIHsKLSAgICAgICAgY3NOYW1lVGFnID0gY3NUZW1wOwotICAgICAgICByZXR1cm4gcEZvbnQ7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUgPSBDUERGX0ludGVyRm9ybTo6R2V0TmF0aXZlRm9udChjaGFyU2V0KTsKLSAgICBpZiAoIWNzRm9udE5hbWUuSXNFbXB0eSgpKSB7Ci0gICAgICAgIGlmIChGaW5kSW50ZXJGb3JtRm9udChwRm9ybURpY3QsIHBEb2N1bWVudCwgY3NGb250TmFtZSwgcEZvbnQsIGNzTmFtZVRhZykpIHsKLSAgICAgICAgICAgIHJldHVybiBwRm9udDsKLSAgICAgICAgfQotICAgIH0KLSAgICBwRm9udCA9IENQREZfSW50ZXJGb3JtOjpBZGROYXRpdmVGb250KGNoYXJTZXQsIHBEb2N1bWVudCk7Ci0gICAgaWYgKHBGb250ICE9IE5VTEwpIHsKLSAgICAgICAgQWRkSW50ZXJGb3JtRm9udChwRm9ybURpY3QsIHBEb2N1bWVudCwgcEZvbnQsIGNzTmFtZVRhZyk7Ci0gICAgfQordm9pZCBBZGRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSomIHBGb3JtRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKSB7CisgIGlmICghcEZvbnQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFwRm9ybURpY3QpIHsKKyAgICBJbml0SW50ZXJGb3JtRGljdChwRm9ybURpY3QsIHBEb2N1bWVudCk7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgY3NUYWc7CisgIGlmIChGaW5kSW50ZXJGb3JtRm9udChwRm9ybURpY3QsIHBGb250LCBjc1RhZykpIHsKKyAgICBjc05hbWVUYWcgPSBjc1RhZzsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFwRm9ybURpY3QpIHsKKyAgICBJbml0SW50ZXJGb3JtRGljdChwRm9ybURpY3QsIHBEb2N1bWVudCk7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRFIgPSBwRm9ybURpY3QtPkdldERpY3QoIkRSIik7CisgIGlmICghcERSKSB7CisgICAgcERSID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgICBwRm9ybURpY3QtPlNldEF0KCJEUiIsIHBEUik7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udHMgPSBwRFItPkdldERpY3QoIkZvbnQiKTsKKyAgaWYgKCFwRm9udHMpIHsKKyAgICBwRm9udHMgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICAgIHBEUi0+U2V0QXQoIkZvbnQiLCBwRm9udHMpOworICB9CisgIGlmIChjc05hbWVUYWcuSXNFbXB0eSgpKSB7CisgICAgY3NOYW1lVGFnID0gcEZvbnQtPkdldEJhc2VGb250KCk7CisgIH0KKyAgY3NOYW1lVGFnLlJlbW92ZSgnICcpOworICBjc05hbWVUYWcgPQorICAgICAgQ1BERl9JbnRlckZvcm06OkdlbmVyYXRlTmV3UmVzb3VyY2VOYW1lKHBEUiwgIkZvbnQiLCA0LCBjc05hbWVUYWcpOworICBwRm9udHMtPlNldEF0UmVmZXJlbmNlKGNzTmFtZVRhZywgcERvY3VtZW50LCBwRm9udC0+R2V0Rm9udERpY3QoKSk7Cit9CitDUERGX0ZvbnQqIEFkZE5hdGl2ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiYgcEZvcm1EaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNoYXJTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykgeworICBpZiAoIXBGb3JtRGljdCkgeworICAgIEluaXRJbnRlckZvcm1EaWN0KHBGb3JtRGljdCwgcERvY3VtZW50KTsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBjc1RlbXA7CisgIENQREZfRm9udCogcEZvbnQgPQorICAgICAgR2V0TmF0aXZlSW50ZXJGb3JtRm9udChwRm9ybURpY3QsIHBEb2N1bWVudCwgY2hhclNldCwgY3NUZW1wKTsKKyAgaWYgKHBGb250KSB7CisgICAgY3NOYW1lVGFnID0gY3NUZW1wOwogICAgIHJldHVybiBwRm9udDsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lID0gQ1BERl9JbnRlckZvcm06OkdldE5hdGl2ZUZvbnQoY2hhclNldCk7CisgIGlmICghY3NGb250TmFtZS5Jc0VtcHR5KCkpIHsKKyAgICBpZiAoRmluZEludGVyRm9ybUZvbnQocEZvcm1EaWN0LCBwRG9jdW1lbnQsIGNzRm9udE5hbWUsIHBGb250LCBjc05hbWVUYWcpKSB7CisgICAgICByZXR1cm4gcEZvbnQ7CisgICAgfQorICB9CisgIHBGb250ID0gQ1BERl9JbnRlckZvcm06OkFkZE5hdGl2ZUZvbnQoY2hhclNldCwgcERvY3VtZW50KTsKKyAgaWYgKHBGb250KSB7CisgICAgQWRkSW50ZXJGb3JtRm9udChwRm9ybURpY3QsIHBEb2N1bWVudCwgcEZvbnQsIGNzTmFtZVRhZyk7CisgIH0KKyAgcmV0dXJuIHBGb250OwogfQotQ1BERl9Gb250KiBBZGROYXRpdmVJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSomIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKQotewotICAgIEZYX0JZVEUgY2hhclNldCA9IENQREZfSW50ZXJGb3JtOjpHZXROYXRpdmVDaGFyU2V0KCk7Ci0gICAgcmV0dXJuIEFkZE5hdGl2ZUludGVyRm9ybUZvbnQocEZvcm1EaWN0LCBwRG9jdW1lbnQsIGNoYXJTZXQsIGNzTmFtZVRhZyk7CitDUERGX0ZvbnQqIEFkZE5hdGl2ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiYgcEZvcm1EaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKSB7CisgIHVpbnQ4X3QgY2hhclNldCA9IENQREZfSW50ZXJGb3JtOjpHZXROYXRpdmVDaGFyU2V0KCk7CisgIHJldHVybiBBZGROYXRpdmVJbnRlckZvcm1Gb250KHBGb3JtRGljdCwgcERvY3VtZW50LCBjaGFyU2V0LCBjc05hbWVUYWcpOwogfQotdm9pZCBSZW1vdmVJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LCBjb25zdCBDUERGX0ZvbnQqIHBGb250KQotewotICAgIGlmIChwRm9ybURpY3QgPT0gTlVMTCB8fCBwRm9udCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NUYWc7Ci0gICAgaWYgKCFGaW5kSW50ZXJGb3JtRm9udChwRm9ybURpY3QsIHBGb250LCBjc1RhZykpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEUiA9IHBGb3JtRGljdC0+R2V0RGljdCgiRFIiKTsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBGb250cyA9IHBEUi0+R2V0RGljdCgiRm9udCIpOwotICAgIHBGb250cy0+UmVtb3ZlQXQoY3NUYWcpOwordm9pZCBSZW1vdmVJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LCBjb25zdCBDUERGX0ZvbnQqIHBGb250KSB7CisgIGlmICghcEZvcm1EaWN0IHx8ICFwRm9udCkgeworICAgIHJldHVybjsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBjc1RhZzsKKyAgaWYgKCFGaW5kSW50ZXJGb3JtRm9udChwRm9ybURpY3QsIHBGb250LCBjc1RhZykpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRFIgPSBwRm9ybURpY3QtPkdldERpY3QoIkRSIik7CisgIENQREZfRGljdGlvbmFyeSogcEZvbnRzID0gcERSLT5HZXREaWN0KCJGb250Iik7CisgIHBGb250cy0+UmVtb3ZlQXQoY3NUYWcpOwogfQotdm9pZCBSZW1vdmVJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LCBDRlhfQnl0ZVN0cmluZyBjc05hbWVUYWcpCi17Ci0gICAgaWYgKHBGb3JtRGljdCA9PSBOVUxMIHx8IGNzTmFtZVRhZy5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEUiA9IHBGb3JtRGljdC0+R2V0RGljdCgiRFIiKTsKLSAgICBpZiAocERSID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBGb250cyA9IHBEUi0+R2V0RGljdCgiRm9udCIpOwotICAgIGlmIChwRm9udHMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHBGb250cy0+UmVtb3ZlQXQoY3NOYW1lVGFnKTsKK3ZvaWQgUmVtb3ZlSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgQ0ZYX0J5dGVTdHJpbmcgY3NOYW1lVGFnKSB7CisgIGlmICghcEZvcm1EaWN0IHx8IGNzTmFtZVRhZy5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRFIgPSBwRm9ybURpY3QtPkdldERpY3QoIkRSIik7CisgIGlmICghcERSKSB7CisgICAgcmV0dXJuOworICB9CisgIENQREZfRGljdGlvbmFyeSogcEZvbnRzID0gcERSLT5HZXREaWN0KCJGb250Iik7CisgIGlmICghcEZvbnRzKSB7CisgICAgcmV0dXJuOworICB9CisgIHBGb250cy0+UmVtb3ZlQXQoY3NOYW1lVGFnKTsKIH0KLUNQREZfRm9udCogR2V0RGVmYXVsdEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLSAgICBpZiAocEZvcm1EaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfRGVmYXVsdEFwcGVhcmFuY2UgY0RBID0gcEZvcm1EaWN0LT5HZXRTdHJpbmcoIkRBIik7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZVRhZzsKLSAgICBGWF9GTE9BVCBmRm9udFNpemU7Ci0gICAgY0RBLkdldEZvbnQoY3NGb250TmFtZVRhZywgZkZvbnRTaXplKTsKLSAgICByZXR1cm4gR2V0SW50ZXJGb3JtRm9udChwRm9ybURpY3QsIHBEb2N1bWVudCwgY3NGb250TmFtZVRhZyk7CitDUERGX0ZvbnQqIEdldERlZmF1bHRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsKKyAgaWYgKCFwRm9ybURpY3QpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX0RlZmF1bHRBcHBlYXJhbmNlIGNEQSA9IHBGb3JtRGljdC0+R2V0U3RyaW5nKCJEQSIpOworICBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lVGFnOworICBGWF9GTE9BVCBmRm9udFNpemU7CisgIGNEQS5HZXRGb250KGNzRm9udE5hbWVUYWcsIGZGb250U2l6ZSk7CisgIHJldHVybiBHZXRJbnRlckZvcm1Gb250KHBGb3JtRGljdCwgcERvY3VtZW50LCBjc0ZvbnROYW1lVGFnKTsKIH0KLUNQREZfSWNvbkZpdDo6U2NhbGVNZXRob2QgQ1BERl9JY29uRml0OjpHZXRTY2FsZU1ldGhvZCgpCi17Ci0gICAgaWYgKG1fcERpY3QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQWx3YXlzOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBjc1NXID0gbV9wRGljdC0+R2V0U3RyaW5nKCJTVyIsICJBIik7Ci0gICAgaWYgKGNzU1cgPT0gIkIiKSB7Ci0gICAgICAgIHJldHVybiBCaWdnZXI7Ci0gICAgfSBlbHNlIGlmIChjc1NXID09ICJTIikgewotICAgICAgICByZXR1cm4gU21hbGxlcjsKLSAgICB9IGVsc2UgaWYgKGNzU1cgPT0gIk4iKSB7Ci0gICAgICAgIHJldHVybiBOZXZlcjsKLSAgICB9CitDUERGX0ljb25GaXQ6OlNjYWxlTWV0aG9kIENQREZfSWNvbkZpdDo6R2V0U2NhbGVNZXRob2QoKSB7CisgIGlmICghbV9wRGljdCkgewogICAgIHJldHVybiBBbHdheXM7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgY3NTVyA9IG1fcERpY3QtPkdldFN0cmluZygiU1ciLCAiQSIpOworICBpZiAoY3NTVyA9PSAiQiIpIHsKKyAgICByZXR1cm4gQmlnZ2VyOworICB9CisgIGlmIChjc1NXID09ICJTIikgeworICAgIHJldHVybiBTbWFsbGVyOworICB9CisgIGlmIChjc1NXID09ICJOIikgeworICAgIHJldHVybiBOZXZlcjsKKyAgfQorICByZXR1cm4gQWx3YXlzOwogfQotRlhfQk9PTCBDUERGX0ljb25GaXQ6OklzUHJvcG9ydGlvbmFsU2NhbGUoKQotewotICAgIGlmIChtX3BEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHJldHVybiBtX3BEaWN0LT5HZXRTdHJpbmcoIlMiLCAiUCIpICE9ICJBIjsKK0ZYX0JPT0wgQ1BERl9JY29uRml0OjpJc1Byb3BvcnRpb25hbFNjYWxlKCkgeworICBpZiAoIW1fcERpY3QpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gbV9wRGljdC0+R2V0U3RyaW5nKCJTIiwgIlAiKSAhPSAiQSI7CiB9Ci12b2lkIENQREZfSWNvbkZpdDo6R2V0SWNvblBvc2l0aW9uKEZYX0ZMT0FUJiBmTGVmdCwgRlhfRkxPQVQmIGZCb3R0b20pCi17Ci0gICAgZkxlZnQgPSBmQm90dG9tID0gMC41OwotICAgIGlmIChtX3BEaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwordm9pZCBDUERGX0ljb25GaXQ6OkdldEljb25Qb3NpdGlvbihGWF9GTE9BVCYgZkxlZnQsIEZYX0ZMT0FUJiBmQm90dG9tKSB7CisgIGZMZWZ0ID0gZkJvdHRvbSA9IDAuNTsKKyAgaWYgKCFtX3BEaWN0KSB7CisgICAgcmV0dXJuOworICB9CisgIENQREZfQXJyYXkqIHBBID0gbV9wRGljdC0+R2V0QXJyYXkoIkEiKTsKKyAgaWYgKHBBKSB7CisgICAgRlhfRFdPUkQgZHdDb3VudCA9IHBBLT5HZXRDb3VudCgpOworICAgIGlmIChkd0NvdW50ID4gMCkgeworICAgICAgZkxlZnQgPSBwQS0+R2V0TnVtYmVyKDApOwogICAgIH0KLSAgICBDUERGX0FycmF5KiBwQSA9IG1fcERpY3QtPkdldEFycmF5KCJBIik7Ci0gICAgaWYgKHBBICE9IE5VTEwpIHsKLSAgICAgICAgRlhfRFdPUkQgZHdDb3VudCA9IHBBLT5HZXRDb3VudCgpOwotICAgICAgICBpZiAoZHdDb3VudCA+IDApIHsKLSAgICAgICAgICAgIGZMZWZ0ID0gcEEtPkdldE51bWJlcigwKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZHdDb3VudCA+IDEpIHsKLSAgICAgICAgICAgIGZCb3R0b20gPSBwQS0+R2V0TnVtYmVyKDEpOwotICAgICAgICB9CisgICAgaWYgKGR3Q291bnQgPiAxKSB7CisgICAgICBmQm90dG9tID0gcEEtPkdldE51bWJlcigxKTsKICAgICB9CisgIH0KIH0KLUZYX0JPT0wgQ1BERl9JY29uRml0OjpHZXRGaXR0aW5nQm91bmRzKCkKLXsKLSAgICBpZiAobV9wRGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIG1fcERpY3QtPkdldEJvb2xlYW4oIkZCIik7CitGWF9CT09MIENQREZfSWNvbkZpdDo6R2V0Rml0dGluZ0JvdW5kcygpIHsKKyAgaWYgKCFtX3BEaWN0KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBtX3BEaWN0LT5HZXRCb29sZWFuKCJGQiIpOwogfQotdm9pZCBTYXZlQ2hlY2tlZEZpZWxkU3RhdHVzKENQREZfRm9ybUZpZWxkKiBwRmllbGQsIENGWF9CeXRlQXJyYXkmIHN0YXR1c0FycmF5KQotewotICAgIGludCBpQ291bnQgPSBwRmllbGQtPkNvdW50Q29udHJvbHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykgewotICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IHBGaWVsZC0+R2V0Q29udHJvbChpKTsKLSAgICAgICAgaWYgKHBDb250cm9sID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1c0FycmF5LkFkZChwQ29udHJvbC0+SXNDaGVja2VkKCkgPyAxIDogMCk7Cit2b2lkIFNhdmVDaGVja2VkRmllbGRTdGF0dXMoQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZUFycmF5JiBzdGF0dXNBcnJheSkgeworICBpbnQgaUNvdW50ID0gcEZpZWxkLT5Db3VudENvbnRyb2xzKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKKyAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IHBGaWVsZC0+R2V0Q29udHJvbChpKTsKKyAgICBpZiAoIXBDb250cm9sKSB7CisgICAgICBjb250aW51ZTsKICAgICB9CisgICAgc3RhdHVzQXJyYXkuQWRkKHBDb250cm9sLT5Jc0NoZWNrZWQoKSA/IDEgOiAwKTsKKyAgfQogfQotQ1BERl9PYmplY3QqIEZQREZfR2V0RmllbGRBdHRyKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCwgY29uc3QgRlhfQ0hBUiogbmFtZSwgaW50IG5MZXZlbCkKLXsKLSAgICBpZiAobkxldmVsID4gRlBERkRPQ19VVElMU19NQVhSRUNVUlNJT04pIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChwRmllbGREaWN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfT2JqZWN0KiBwQXR0ciA9IHBGaWVsZERpY3QtPkdldEVsZW1lbnRWYWx1ZShuYW1lKTsKLSAgICBpZiAocEF0dHIpIHsKLSAgICAgICAgcmV0dXJuIHBBdHRyOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBQYXJlbnQgPSBwRmllbGREaWN0LT5HZXREaWN0KCJQYXJlbnQiKTsKLSAgICBpZiAocFBhcmVudCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gRlBERl9HZXRGaWVsZEF0dHIocFBhcmVudCwgbmFtZSwgbkxldmVsICsgMSk7CitDUERGX09iamVjdCogRlBERl9HZXRGaWVsZEF0dHIoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5MZXZlbCkgeworICBpZiAobkxldmVsID4gRlBERkRPQ19VVElMU19NQVhSRUNVUlNJT04pIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoIXBGaWVsZERpY3QpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX09iamVjdCogcEF0dHIgPSBwRmllbGREaWN0LT5HZXRFbGVtZW50VmFsdWUobmFtZSk7CisgIGlmIChwQXR0cikgeworICAgIHJldHVybiBwQXR0cjsKKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBQYXJlbnQgPSBwRmllbGREaWN0LT5HZXREaWN0KCJQYXJlbnQiKTsKKyAgaWYgKCFwUGFyZW50KSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIEZQREZfR2V0RmllbGRBdHRyKHBQYXJlbnQsIG5hbWUsIG5MZXZlbCArIDEpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfdXRpbHMuaCBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3V0aWxzLmgKaW5kZXggMDhjNGU3ZS4uNGE2NjUyZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfdXRpbHMuaAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY191dGlscy5oCkBAIC03LDI3ICs3LDU3IEBACiAjaWZuZGVmIENPUkVfU1JDX0ZQREZET0NfRE9DX1VUSUxTX0hfCiAjZGVmaW5lIENPUkVfU1JDX0ZQREZET0NfRE9DX1VUSUxTX0hfCiAKLUNGWF9XaWRlU3RyaW5nCUdldEZ1bGxOYW1lKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCk7Ci12b2lkCQkJSW5pdEludGVyRm9ybURpY3QoQ1BERl9EaWN0aW9uYXJ5KiYgcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotRlhfRFdPUkQJCUNvdW50SW50ZXJGb3JtRm9udHMoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QpOwotQ1BERl9Gb250KgkJR2V0SW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBGWF9EV09SRCBpbmRleCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7Ci1DUERGX0ZvbnQqCQlHZXRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9CeXRlU3RyaW5nIGNzTmFtZVRhZyk7Ci1DUERGX0ZvbnQqCQlHZXRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwotQ1BERl9Gb250KgkJR2V0TmF0aXZlSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBGWF9CWVRFIGNoYXJTZXQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwotQ1BERl9Gb250KgkJR2V0TmF0aXZlSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKLUZYX0JPT0wJCQlGaW5kSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgY29uc3QgQ1BERl9Gb250KiBwRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7Ci1GWF9CT09MCQkJRmluZEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwgQ1BERl9Gb250KiYgcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwotdm9pZAkJCUFkZEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiYgcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENQREZfRm9udCogcEZvbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwotQ1BERl9Gb250KgkJQWRkTmF0aXZlSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqJiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgRlhfQllURSBjaGFyU2V0LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKLUNQREZfRm9udCoJCUFkZE5hdGl2ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiYgcEZvcm1EaWN0LCBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwotdm9pZAkJCVJlbW92ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIGNvbnN0IENQREZfRm9udCogcEZvbnQpOwotdm9pZAkJCVJlbW92ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsIENGWF9CeXRlU3RyaW5nIGNzTmFtZVRhZyk7Ci1DUERGX0ZvbnQqCQlHZXREZWZhdWx0SW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KTsKLXZvaWQJCQlTZXREZWZhdWx0SW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqJiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ1BERl9Gb250KiBwRm9udCk7Ci12b2lkCQkJU2F2ZUNoZWNrZWRGaWVsZFN0YXR1cyhDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBDRlhfQnl0ZUFycmF5JiBzdGF0dXNBcnJheSk7Ci1GWF9CT09MCQkJTmVlZFBERkVuY29kZUZvckZpZWxkRnVsbE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lKTsKLUZYX0JPT0wJCQlOZWVkUERGRW5jb2RlRm9yRmllbGRUcmVlKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCwgaW50IG5MZXZlbCA9IDApOwotdm9pZAkJCUVuY29kZUZpZWxkTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NOYW1lLCBDRlhfQnl0ZVN0cmluZyYgY3NUKTsKLXZvaWQJCQlVcGRhdGVFbmNvZGVGaWVsZE5hbWUoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0LCBpbnQgbkxldmVsID0gMCk7CitDRlhfV2lkZVN0cmluZyBHZXRGdWxsTmFtZShDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpOwordm9pZCBJbml0SW50ZXJGb3JtRGljdChDUERGX0RpY3Rpb25hcnkqJiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCk7CitGWF9EV09SRCBDb3VudEludGVyRm9ybUZvbnRzKENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0KTsKK0NQREZfRm9udCogR2V0SW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7CitDUERGX0ZvbnQqIEdldEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNzTmFtZVRhZyk7CitDUERGX0ZvbnQqIEdldEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7CitDUERGX0ZvbnQqIEdldE5hdGl2ZUludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2hhclNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKK0NQREZfRm9udCogR2V0TmF0aXZlSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7CitGWF9CT09MIEZpbmRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKK0ZYX0JPT0wgRmluZEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiYgcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwordm9pZCBBZGRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSomIHBGb3JtRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKK0NQREZfRm9udCogQWRkTmF0aXZlSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqJiBwRm9ybURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2hhclNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKK0NQREZfRm9udCogQWRkTmF0aXZlSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqJiBwRm9ybURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpOwordm9pZCBSZW1vdmVJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LCBjb25zdCBDUERGX0ZvbnQqIHBGb250KTsKK3ZvaWQgUmVtb3ZlSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwgQ0ZYX0J5dGVTdHJpbmcgY3NOYW1lVGFnKTsKK0NQREZfRm9udCogR2V0RGVmYXVsdEludGVyRm9ybUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCk7Cit2b2lkIFNldERlZmF1bHRJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSomIHBGb3JtRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0ZvbnQqIHBGb250KTsKK3ZvaWQgU2F2ZUNoZWNrZWRGaWVsZFN0YXR1cyhDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBDRlhfQnl0ZUFycmF5JiBzdGF0dXNBcnJheSk7CitGWF9CT09MIE5lZWRQREZFbmNvZGVGb3JGaWVsZEZ1bGxOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSk7CitGWF9CT09MIE5lZWRQREZFbmNvZGVGb3JGaWVsZFRyZWUoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0LCBpbnQgbkxldmVsID0gMCk7Cit2b2lkIEVuY29kZUZpZWxkTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NOYW1lLCBDRlhfQnl0ZVN0cmluZyYgY3NUKTsKK3ZvaWQgVXBkYXRlRW5jb2RlRmllbGROYW1lKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCwgaW50IG5MZXZlbCA9IDApOwogCiAjZW5kaWYgIC8vIENPUkVfU1JDX0ZQREZET0NfRE9DX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY192aWV3ZXJQcmVmZXJlbmNlcy5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY192aWV3ZXJQcmVmZXJlbmNlcy5jcHAKaW5kZXggZjY4ZDNmYi4uMDVmNTBjMCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2Nfdmlld2VyUHJlZmVyZW5jZXMuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3ZpZXdlclByZWZlcmVuY2VzLmNwcApAQCAtMSw2MCArMSw1MyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgiCi1DUERGX1ZpZXdlclByZWZlcmVuY2VzOjpDUERGX1ZpZXdlclByZWZlcmVuY2VzKENQREZfRG9jdW1lbnQgKnBEb2MpOiBtX3BEb2MocERvYykKLXsKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oIgorCitDUERGX1ZpZXdlclByZWZlcmVuY2VzOjpDUERGX1ZpZXdlclByZWZlcmVuY2VzKENQREZfRG9jdW1lbnQqIHBEb2MpCisgICAgOiBtX3BEb2MocERvYykge30KK0NQREZfVmlld2VyUHJlZmVyZW5jZXM6On5DUERGX1ZpZXdlclByZWZlcmVuY2VzKCkge30KK0ZYX0JPT0wgQ1BERl9WaWV3ZXJQcmVmZXJlbmNlczo6SXNEaXJlY3Rpb25SMkwoKSBjb25zdCB7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BEb2MtPkdldFJvb3QoKTsKKyAgcERpY3QgPSBwRGljdC0+R2V0RGljdCgiVmlld2VyUHJlZmVyZW5jZXMiKTsKKyAgaWYgKCFwRGljdCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gIlIyTCIgPT0gcERpY3QtPkdldFN0cmluZygiRGlyZWN0aW9uIik7CiB9Ci1DUERGX1ZpZXdlclByZWZlcmVuY2VzOjp+Q1BERl9WaWV3ZXJQcmVmZXJlbmNlcygpCi17CitGWF9CT09MIENQREZfVmlld2VyUHJlZmVyZW5jZXM6OlByaW50U2NhbGluZygpIGNvbnN0IHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcERvYy0+R2V0Um9vdCgpOworICBwRGljdCA9IHBEaWN0LT5HZXREaWN0KCJWaWV3ZXJQcmVmZXJlbmNlcyIpOworICBpZiAoIXBEaWN0KSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuICJOb25lIiAhPSBwRGljdC0+R2V0U3RyaW5nKCJQcmludFNjYWxpbmciKTsKIH0KLUZYX0JPT0wgQ1BERl9WaWV3ZXJQcmVmZXJlbmNlczo6SXNEaXJlY3Rpb25SMkwoKSBjb25zdAotewotICAgIENQREZfRGljdGlvbmFyeSAqcERpY3QgPSBtX3BEb2MtPkdldFJvb3QoKTsKLSAgICBwRGljdCA9IHBEaWN0LT5HZXREaWN0KEZYX0JTVFJDKCJWaWV3ZXJQcmVmZXJlbmNlcyIpKTsKLSAgICBpZiAoIXBEaWN0KQl7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZYX0JTVFJDKCJSMkwiKSA9PSBwRGljdC0+R2V0U3RyaW5nKEZYX0JTVFJDKCJEaXJlY3Rpb24iKSk7CitpbnQzMl90IENQREZfVmlld2VyUHJlZmVyZW5jZXM6Ok51bUNvcGllcygpIGNvbnN0IHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcERvYy0+R2V0Um9vdCgpOworICBwRGljdCA9IHBEaWN0LT5HZXREaWN0KCJWaWV3ZXJQcmVmZXJlbmNlcyIpOworICBpZiAoIXBEaWN0KSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIHBEaWN0LT5HZXRJbnRlZ2VyKCJOdW1Db3BpZXMiKTsKIH0KLUZYX0JPT0wgQ1BERl9WaWV3ZXJQcmVmZXJlbmNlczo6UHJpbnRTY2FsaW5nKCkgY29uc3QKLXsKLSAgICBDUERGX0RpY3Rpb25hcnkgKnBEaWN0ID0gbV9wRG9jLT5HZXRSb290KCk7Ci0gICAgcERpY3QgPSBwRGljdC0+R2V0RGljdChGWF9CU1RSQygiVmlld2VyUHJlZmVyZW5jZXMiKSk7Ci0gICAgaWYgKCFwRGljdCkJewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZYX0JTVFJDKCJOb25lIikgIT0gcERpY3QtPkdldFN0cmluZyhGWF9CU1RSQygiUHJpbnRTY2FsaW5nIikpOwotfQotRlhfSU5UMzIgQ1BERl9WaWV3ZXJQcmVmZXJlbmNlczo6TnVtQ29waWVzKCkgY29uc3QKLXsKLSAgICBDUERGX0RpY3Rpb25hcnkgKnBEaWN0ID0gbV9wRG9jLT5HZXRSb290KCk7Ci0gICAgcERpY3QgPSBwRGljdC0+R2V0RGljdChGWF9CU1RSQygiVmlld2VyUHJlZmVyZW5jZXMiKSk7Ci0gICAgaWYgKCFwRGljdCkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgcmV0dXJuIHBEaWN0LT5HZXRJbnRlZ2VyKEZYX0JTVFJDKCJOdW1Db3BpZXMiKSk7Ci19Ci1DUERGX0FycmF5KiBDUERGX1ZpZXdlclByZWZlcmVuY2VzOjpQcmludFBhZ2VSYW5nZSgpIGNvbnN0Ci17Ci0gICAgQ1BERl9EaWN0aW9uYXJ5ICpwRGljdCA9IG1fcERvYy0+R2V0Um9vdCgpOwotICAgIENQREZfQXJyYXkgKnBSYW5nZSA9IE5VTEw7Ci0gICAgcERpY3QgPSBwRGljdC0+R2V0RGljdChGWF9CU1RSQygiVmlld2VyUHJlZmVyZW5jZXMiKSk7Ci0gICAgaWYgKCFwRGljdCkgewotICAgICAgICByZXR1cm4gcFJhbmdlOwotICAgIH0KLSAgICBwUmFuZ2UgPSBwRGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIlByaW50UGFnZVJhbmdlIikpOworQ1BERl9BcnJheSogQ1BERl9WaWV3ZXJQcmVmZXJlbmNlczo6UHJpbnRQYWdlUmFuZ2UoKSBjb25zdCB7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BEb2MtPkdldFJvb3QoKTsKKyAgQ1BERl9BcnJheSogcFJhbmdlID0gTlVMTDsKKyAgcERpY3QgPSBwRGljdC0+R2V0RGljdCgiVmlld2VyUHJlZmVyZW5jZXMiKTsKKyAgaWYgKCFwRGljdCkgewogICAgIHJldHVybiBwUmFuZ2U7CisgIH0KKyAgcFJhbmdlID0gcERpY3QtPkdldEFycmF5KCJQcmludFBhZ2VSYW5nZSIpOworICByZXR1cm4gcFJhbmdlOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9WaWV3ZXJQcmVmZXJlbmNlczo6RHVwbGV4KCkgY29uc3QKLXsKLSAgICBDUERGX0RpY3Rpb25hcnkgKnBEaWN0ID0gbV9wRG9jLT5HZXRSb290KCk7Ci0gICAgcERpY3QgPSBwRGljdC0+R2V0RGljdChGWF9CU1RSQygiVmlld2VyUHJlZmVyZW5jZXMiKSk7Ci0gICAgaWYgKCFwRGljdCkgewotICAgICAgICByZXR1cm4gRlhfQlNUUkMoIk5vbmUiKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIkR1cGxleCIpKTsKK0NGWF9CeXRlU3RyaW5nIENQREZfVmlld2VyUHJlZmVyZW5jZXM6OkR1cGxleCgpIGNvbnN0IHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcERvYy0+R2V0Um9vdCgpOworICBwRGljdCA9IHBEaWN0LT5HZXREaWN0KCJWaWV3ZXJQcmVmZXJlbmNlcyIpOworICBpZiAoIXBEaWN0KSB7CisgICAgcmV0dXJuICJOb25lIjsKKyAgfQorICByZXR1cm4gcERpY3QtPkdldFN0cmluZygiRHVwbGV4Iik7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY192dC5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY192dC5jcHAKaW5kZXggM2FlMjNmZi4uZTVjOWFkOCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfdnQuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3Z0LmNwcApAQCAtMSwxODU3ICsxLDE4MjUgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3Z0LmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9kb2MuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3Z0LmgiCiAjaW5jbHVkZSAicGRmX3Z0LmgiCi1jb25zdCBGWF9CWVRFIGdGb250U2l6ZVN0ZXBzW10gPSB7CTQsIDYsIDgsIDksIDEwLAkxMiwgMTQsIDE4LCAyMCwgMjUsCTMwLCAzNSwgNDAsIDQ1LCA1MCwJNTUsIDYwLCA3MCwgODAsIDkwLAkxMDAsIDExMCwgMTIwLCAxMzAsIDE0NH07Ci0jZGVmaW5lIFBWVF9SRVRVUk5fTEVOR1RICQkJCQkxCi0jZGVmaW5lIFBWVF9ERUZBVUxUX0ZPTlRTSVpFCQkJCTE4LjBmCi0jZGVmaW5lIFBWVFdPUkRfU0NSSVBUX05PUk1BTAkJCQkwCi0jZGVmaW5lIFBWVFdPUkRfU0NSSVBUX1NVUEVSCQkJCTEKLSNkZWZpbmUgUFZUV09SRF9TQ1JJUFRfU1VCCQkJCQkyCi0jZGVmaW5lCVBWVF9GT05UU0NBTEUJCQkJCQkwLjAwMWYKLSNkZWZpbmUgUFZUX1BFUkNFTlQJCQkJCQkJMC4wMWYKLSNkZWZpbmUgUFZUX0hBTEYJCQkJCQkJMC41ZgotQ0xpbmU6OkNMaW5lKCkKLXsKKworY29uc3QgdWludDhfdCBnRm9udFNpemVTdGVwc1tdID0gezQsICA2LCAgOCwgICA5LCAgIDEwLCAgMTIsICAxNCwgMTgsIDIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1LCAzMCwgMzUsICA0MCwgIDQ1LCAgNTAsICA1NSwgNjAsIDcwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwLCA5MCwgMTAwLCAxMTAsIDEyMCwgMTMwLCAxNDR9OworI2RlZmluZSBQVlRfUkVUVVJOX0xFTkdUSCAxCisjZGVmaW5lIFBWVF9ERUZBVUxUX0ZPTlRTSVpFIDE4LjBmCisjZGVmaW5lIFBWVFdPUkRfU0NSSVBUX05PUk1BTCAwCisjZGVmaW5lIFBWVFdPUkRfU0NSSVBUX1NVUEVSIDEKKyNkZWZpbmUgUFZUV09SRF9TQ1JJUFRfU1VCIDIKKyNkZWZpbmUgUFZUX0ZPTlRTQ0FMRSAwLjAwMWYKKyNkZWZpbmUgUFZUX1BFUkNFTlQgMC4wMWYKKyNkZWZpbmUgUFZUX0hBTEYgMC41ZgorQ0xpbmU6OkNMaW5lKCkge30KK0NMaW5lOjp+Q0xpbmUoKSB7fQorQ1BWVF9Xb3JkUGxhY2UgQ0xpbmU6OkdldEJlZ2luV29yZFBsYWNlKCkgY29uc3QgeworICByZXR1cm4gQ1BWVF9Xb3JkUGxhY2UoTGluZVBsYWNlLm5TZWNJbmRleCwgTGluZVBsYWNlLm5MaW5lSW5kZXgsIC0xKTsKIH0KLUNMaW5lOjp+Q0xpbmUoKQoteworQ1BWVF9Xb3JkUGxhY2UgQ0xpbmU6OkdldEVuZFdvcmRQbGFjZSgpIGNvbnN0IHsKKyAgcmV0dXJuIENQVlRfV29yZFBsYWNlKExpbmVQbGFjZS5uU2VjSW5kZXgsIExpbmVQbGFjZS5uTGluZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgbV9MaW5lSW5mby5uRW5kV29yZEluZGV4KTsKIH0KLUNQVlRfV29yZFBsYWNlIENMaW5lOjpHZXRCZWdpbldvcmRQbGFjZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIENQVlRfV29yZFBsYWNlKExpbmVQbGFjZS5uU2VjSW5kZXgsIExpbmVQbGFjZS5uTGluZUluZGV4LCAtMSk7CitDUFZUX1dvcmRQbGFjZSBDTGluZTo6R2V0UHJldldvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IHsKKyAgaWYgKHBsYWNlLm5Xb3JkSW5kZXggPiBtX0xpbmVJbmZvLm5FbmRXb3JkSW5kZXgpIHsKKyAgICByZXR1cm4gQ1BWVF9Xb3JkUGxhY2UocGxhY2UublNlY0luZGV4LCBwbGFjZS5uTGluZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBtX0xpbmVJbmZvLm5FbmRXb3JkSW5kZXgpOworICB9CisgIHJldHVybiBDUFZUX1dvcmRQbGFjZShwbGFjZS5uU2VjSW5kZXgsIHBsYWNlLm5MaW5lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZS5uV29yZEluZGV4IC0gMSk7CiB9Ci1DUFZUX1dvcmRQbGFjZSBDTGluZTo6R2V0RW5kV29yZFBsYWNlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gQ1BWVF9Xb3JkUGxhY2UoTGluZVBsYWNlLm5TZWNJbmRleCwgTGluZVBsYWNlLm5MaW5lSW5kZXgsIG1fTGluZUluZm8ubkVuZFdvcmRJbmRleCk7CitDUFZUX1dvcmRQbGFjZSBDTGluZTo6R2V0TmV4dFdvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IHsKKyAgaWYgKHBsYWNlLm5Xb3JkSW5kZXggPCBtX0xpbmVJbmZvLm5CZWdpbldvcmRJbmRleCkgeworICAgIHJldHVybiBDUFZUX1dvcmRQbGFjZShwbGFjZS5uU2VjSW5kZXgsIHBsYWNlLm5MaW5lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1fTGluZUluZm8ubkJlZ2luV29yZEluZGV4KTsKKyAgfQorICByZXR1cm4gQ1BWVF9Xb3JkUGxhY2UocGxhY2UublNlY0luZGV4LCBwbGFjZS5uTGluZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UubldvcmRJbmRleCArIDEpOwogfQotQ1BWVF9Xb3JkUGxhY2UgQ0xpbmU6OkdldFByZXZXb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QKLXsKLSAgICBpZiAocGxhY2UubldvcmRJbmRleCA+IG1fTGluZUluZm8ubkVuZFdvcmRJbmRleCkgewotICAgICAgICByZXR1cm4gQ1BWVF9Xb3JkUGxhY2UocGxhY2UublNlY0luZGV4LCBwbGFjZS5uTGluZUluZGV4LCBtX0xpbmVJbmZvLm5FbmRXb3JkSW5kZXgpOworQ1NlY3Rpb246OkNTZWN0aW9uKENQREZfVmFyaWFibGVUZXh0KiBwVlQpIDogbV9wVlQocFZUKSB7fQorQ1NlY3Rpb246On5DU2VjdGlvbigpIHsKKyAgUmVzZXRBbGwoKTsKK30KK3ZvaWQgQ1NlY3Rpb246OlJlc2V0QWxsKCkgeworICBSZXNldFdvcmRBcnJheSgpOworICBSZXNldExpbmVBcnJheSgpOworfQordm9pZCBDU2VjdGlvbjo6UmVzZXRMaW5lQXJyYXkoKSB7CisgIG1fTGluZUFycmF5LlJlbW92ZUFsbCgpOworfQordm9pZCBDU2VjdGlvbjo6UmVzZXRXb3JkQXJyYXkoKSB7CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX1dvcmRBcnJheS5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgZGVsZXRlIG1fV29yZEFycmF5LkdldEF0KGkpOworICB9CisgIG1fV29yZEFycmF5LlJlbW92ZUFsbCgpOworfQordm9pZCBDU2VjdGlvbjo6UmVzZXRMaW5lUGxhY2UoKSB7CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX0xpbmVBcnJheS5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgaWYgKENMaW5lKiBwTGluZSA9IG1fTGluZUFycmF5LkdldEF0KGkpKSB7CisgICAgICBwTGluZS0+TGluZVBsYWNlID0gQ1BWVF9Xb3JkUGxhY2UoU2VjUGxhY2UublNlY0luZGV4LCBpLCAtMSk7CiAgICAgfQotICAgIHJldHVybiBDUFZUX1dvcmRQbGFjZShwbGFjZS5uU2VjSW5kZXgsIHBsYWNlLm5MaW5lSW5kZXgsIHBsYWNlLm5Xb3JkSW5kZXggLSAxKTsKKyAgfQogfQotQ1BWVF9Xb3JkUGxhY2UgQ0xpbmU6OkdldE5leHRXb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QKLXsKLSAgICBpZiAocGxhY2UubldvcmRJbmRleCA8IG1fTGluZUluZm8ubkJlZ2luV29yZEluZGV4KSB7Ci0gICAgICAgIHJldHVybiBDUFZUX1dvcmRQbGFjZShwbGFjZS5uU2VjSW5kZXgsIHBsYWNlLm5MaW5lSW5kZXgsIG1fTGluZUluZm8ubkJlZ2luV29yZEluZGV4KTsKLSAgICB9Ci0gICAgcmV0dXJuIENQVlRfV29yZFBsYWNlKHBsYWNlLm5TZWNJbmRleCwgcGxhY2UubkxpbmVJbmRleCwgcGxhY2UubldvcmRJbmRleCArIDEpOworQ1BWVF9Xb3JkUGxhY2UgQ1NlY3Rpb246OkFkZFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkSW5mbyYgd29yZGluZm8pIHsKKyAgQ1BWVF9Xb3JkSW5mbyogcFdvcmQgPSBuZXcgQ1BWVF9Xb3JkSW5mbyh3b3JkaW5mbyk7CisgIGludDMyX3QgbldvcmRJbmRleCA9CisgICAgICBzdGQ6Om1heChzdGQ6Om1pbihwbGFjZS5uV29yZEluZGV4LCBtX1dvcmRBcnJheS5HZXRTaXplKCkpLCAwKTsKKyAgaWYgKG5Xb3JkSW5kZXggPT0gbV9Xb3JkQXJyYXkuR2V0U2l6ZSgpKSB7CisgICAgbV9Xb3JkQXJyYXkuQWRkKHBXb3JkKTsKKyAgfSBlbHNlIHsKKyAgICBtX1dvcmRBcnJheS5JbnNlcnRBdChuV29yZEluZGV4LCBwV29yZCk7CisgIH0KKyAgcmV0dXJuIHBsYWNlOwogfQotQ1NlY3Rpb246OkNTZWN0aW9uKENQREZfVmFyaWFibGVUZXh0ICogcFZUKSA6IG1fcFZUKHBWVCkKLXsKK0NQVlRfV29yZFBsYWNlIENTZWN0aW9uOjpBZGRMaW5lKGNvbnN0IENQVlRfTGluZUluZm8mIGxpbmVpbmZvKSB7CisgIHJldHVybiBDUFZUX1dvcmRQbGFjZShTZWNQbGFjZS5uU2VjSW5kZXgsIG1fTGluZUFycmF5LkFkZChsaW5laW5mbyksIC0xKTsKIH0KLUNTZWN0aW9uOjp+Q1NlY3Rpb24oKQotewotICAgIFJlc2V0QWxsKCk7CitDUFZUX0Zsb2F0UmVjdCBDU2VjdGlvbjo6UmVhcnJhbmdlKCkgeworICBpZiAobV9wVlQtPm1fbkNoYXJBcnJheSA+IDApIHsKKyAgICByZXR1cm4gQ1R5cGVzZXQodGhpcykuQ2hhckFycmF5KCk7CisgIH0KKyAgcmV0dXJuIENUeXBlc2V0KHRoaXMpLlR5cGVzZXQoKTsKIH0KLXZvaWQgQ1NlY3Rpb246OlJlc2V0QWxsKCkKLXsKLSAgICBSZXNldFdvcmRBcnJheSgpOwotICAgIFJlc2V0TGluZUFycmF5KCk7CitDUFZUX1NpemUgQ1NlY3Rpb246OkdldFNlY3Rpb25TaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgeworICByZXR1cm4gQ1R5cGVzZXQodGhpcykuR2V0RWRpdFNpemUoZkZvbnRTaXplKTsKIH0KLXZvaWQgQ1NlY3Rpb246OlJlc2V0TGluZUFycmF5KCkKLXsKLSAgICBtX0xpbmVBcnJheS5SZW1vdmVBbGwoKTsKK0NQVlRfV29yZFBsYWNlIENTZWN0aW9uOjpHZXRCZWdpbldvcmRQbGFjZSgpIGNvbnN0IHsKKyAgaWYgKENMaW5lKiBwTGluZSA9IG1fTGluZUFycmF5LkdldEF0KDApKSB7CisgICAgcmV0dXJuIHBMaW5lLT5HZXRCZWdpbldvcmRQbGFjZSgpOworICB9CisgIHJldHVybiBTZWNQbGFjZTsKIH0KLXZvaWQgQ1NlY3Rpb246OlJlc2V0V29yZEFycmF5KCkKLXsKLSAgICBmb3IgKEZYX0lOVDMyIGkgPSAwLCBzeiA9IG1fV29yZEFycmF5LkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKLSAgICAgICAgZGVsZXRlIG1fV29yZEFycmF5LkdldEF0KGkpOwotICAgIH0KLSAgICBtX1dvcmRBcnJheS5SZW1vdmVBbGwoKTsKK0NQVlRfV29yZFBsYWNlIENTZWN0aW9uOjpHZXRFbmRXb3JkUGxhY2UoKSBjb25zdCB7CisgIGlmIChDTGluZSogcExpbmUgPSBtX0xpbmVBcnJheS5HZXRBdChtX0xpbmVBcnJheS5HZXRTaXplKCkgLSAxKSkgeworICAgIHJldHVybiBwTGluZS0+R2V0RW5kV29yZFBsYWNlKCk7CisgIH0KKyAgcmV0dXJuIFNlY1BsYWNlOwogfQotdm9pZCBDU2VjdGlvbjo6UmVzZXRMaW5lUGxhY2UoKQotewotICAgIGZvciAoRlhfSU5UMzIgaSA9IDAsIHN6ID0gbV9MaW5lQXJyYXkuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgewotICAgICAgICBpZiAoQ0xpbmUgKiBwTGluZSA9IG1fTGluZUFycmF5LkdldEF0KGkpKSB7Ci0gICAgICAgICAgICBwTGluZS0+TGluZVBsYWNlID0gQ1BWVF9Xb3JkUGxhY2UoU2VjUGxhY2UublNlY0luZGV4LCBpLCAtMSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1DUFZUX1dvcmRQbGFjZSBDU2VjdGlvbjo6QWRkV29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRJbmZvICYgd29yZGluZm8pCi17Ci0gICAgQ1BWVF9Xb3JkSW5mbyAqIHBXb3JkID0gbmV3IENQVlRfV29yZEluZm8od29yZGluZm8pOwotICAgIEZYX0lOVDMyIG5Xb3JkSW5kZXggPSBGUERGX01BWChGUERGX01JTihwbGFjZS5uV29yZEluZGV4LCB0aGlzLT5tX1dvcmRBcnJheS5HZXRTaXplKCkpLCAwKTsKLSAgICBpZiAobldvcmRJbmRleCA9PSBtX1dvcmRBcnJheS5HZXRTaXplKCkpIHsKLSAgICAgICAgbV9Xb3JkQXJyYXkuQWRkKHBXb3JkKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX1dvcmRBcnJheS5JbnNlcnRBdChuV29yZEluZGV4LCBwV29yZCk7Ci0gICAgfQotICAgIHJldHVybiBwbGFjZTsKLX0KLUNQVlRfV29yZFBsYWNlIENTZWN0aW9uOjpBZGRMaW5lKGNvbnN0IENQVlRfTGluZUluZm8gJiBsaW5laW5mbykKLXsKLSAgICByZXR1cm4gQ1BWVF9Xb3JkUGxhY2UoU2VjUGxhY2UublNlY0luZGV4LCBtX0xpbmVBcnJheS5BZGQobGluZWluZm8pLCAtMSk7Ci19Ci1DUFZUX0Zsb2F0UmVjdCBDU2VjdGlvbjo6UmVhcnJhbmdlKCkKLXsKLSAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7Ci0gICAgaWYgKG1fcFZULT5tX25DaGFyQXJyYXkgPiAwKSB7Ci0gICAgICAgIHJldHVybiBDVHlwZXNldCh0aGlzKS5DaGFyQXJyYXkoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gQ1R5cGVzZXQodGhpcykuVHlwZXNldCgpOwotICAgIH0KLX0KLUNQVlRfU2l6ZSBDU2VjdGlvbjo6R2V0U2VjdGlvblNpemUoRlhfRkxPQVQgZkZvbnRTaXplKQotewotICAgIHJldHVybiBDVHlwZXNldCh0aGlzKS5HZXRFZGl0U2l6ZShmRm9udFNpemUpOwotfQotQ1BWVF9Xb3JkUGxhY2UgQ1NlY3Rpb246OkdldEJlZ2luV29yZFBsYWNlKCkgY29uc3QKLXsKLSAgICBpZiAoQ0xpbmUgKiBwTGluZSA9IG1fTGluZUFycmF5LkdldEF0KDApKSB7Ci0gICAgICAgIHJldHVybiBwTGluZS0+R2V0QmVnaW5Xb3JkUGxhY2UoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gU2VjUGxhY2U7Ci0gICAgfQotfQotQ1BWVF9Xb3JkUGxhY2UgQ1NlY3Rpb246OkdldEVuZFdvcmRQbGFjZSgpIGNvbnN0Ci17Ci0gICAgaWYgKENMaW5lICogcExpbmUgPSBtX0xpbmVBcnJheS5HZXRBdChtX0xpbmVBcnJheS5HZXRTaXplKCkgLSAxKSkgewotICAgICAgICByZXR1cm4gcExpbmUtPkdldEVuZFdvcmRQbGFjZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiB0aGlzLT5TZWNQbGFjZTsKLSAgICB9Ci19Ci1DUFZUX1dvcmRQbGFjZSBDU2VjdGlvbjo6R2V0UHJldldvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdAotewotICAgIGlmIChwbGFjZS5uTGluZUluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKLSAgICB9Ci0gICAgaWYgKHBsYWNlLm5MaW5lSW5kZXggPj0gbV9MaW5lQXJyYXkuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBHZXRFbmRXb3JkUGxhY2UoKTsKLSAgICB9Ci0gICAgaWYgKENMaW5lICogcExpbmUgPSBtX0xpbmVBcnJheS5HZXRBdChwbGFjZS5uTGluZUluZGV4KSkgewotICAgICAgICBpZiAocGxhY2UubldvcmRJbmRleCA9PSBwTGluZS0+bV9MaW5lSW5mby5uQmVnaW5Xb3JkSW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBDUFZUX1dvcmRQbGFjZShwbGFjZS5uU2VjSW5kZXgsIHBsYWNlLm5MaW5lSW5kZXgsIC0xKTsKLSAgICAgICAgfSBlbHNlIGlmIChwbGFjZS5uV29yZEluZGV4IDwgcExpbmUtPm1fTGluZUluZm8ubkJlZ2luV29yZEluZGV4KSB7Ci0gICAgICAgICAgICBpZiAoQ0xpbmUgKiBwUHJldkxpbmUgPSBtX0xpbmVBcnJheS5HZXRBdChwbGFjZS5uTGluZUluZGV4IC0gMSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcFByZXZMaW5lLT5HZXRFbmRXb3JkUGxhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBwTGluZS0+R2V0UHJldldvcmRQbGFjZShwbGFjZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHBsYWNlOwotfQotQ1BWVF9Xb3JkUGxhY2UgQ1NlY3Rpb246OkdldE5leHRXb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QKLXsKLSAgICBpZiAocGxhY2UubkxpbmVJbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIEdldEJlZ2luV29yZFBsYWNlKCk7Ci0gICAgfQotICAgIGlmIChwbGFjZS5uTGluZUluZGV4ID49IG1fTGluZUFycmF5LkdldFNpemUoKSkgewotICAgICAgICByZXR1cm4gR2V0RW5kV29yZFBsYWNlKCk7Ci0gICAgfQotICAgIGlmIChDTGluZSAqIHBMaW5lID0gbV9MaW5lQXJyYXkuR2V0QXQocGxhY2UubkxpbmVJbmRleCkpIHsKLSAgICAgICAgaWYgKHBsYWNlLm5Xb3JkSW5kZXggPj0gcExpbmUtPm1fTGluZUluZm8ubkVuZFdvcmRJbmRleCkgewotICAgICAgICAgICAgaWYgKENMaW5lICogcE5leHRMaW5lID0gbV9MaW5lQXJyYXkuR2V0QXQocGxhY2UubkxpbmVJbmRleCArIDEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBOZXh0TGluZS0+R2V0QmVnaW5Xb3JkUGxhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBwTGluZS0+R2V0TmV4dFdvcmRQbGFjZShwbGFjZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHBsYWNlOwotfQotdm9pZCBDU2VjdGlvbjo6VXBkYXRlV29yZFBsYWNlKENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0Ci17Ci0gICAgRlhfSU5UMzIgbkxlZnQgPSAwOwotICAgIEZYX0lOVDMyIG5SaWdodCA9IG1fTGluZUFycmF5LkdldFNpemUoKSAtIDE7Ci0gICAgRlhfSU5UMzIgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOwotICAgIHdoaWxlIChuTGVmdCA8PSBuUmlnaHQpIHsKLSAgICAgICAgaWYgKENMaW5lICogcExpbmUgPSBtX0xpbmVBcnJheS5HZXRBdChuTWlkKSkgewotICAgICAgICAgICAgaWYgKHBsYWNlLm5Xb3JkSW5kZXggPCBwTGluZS0+bV9MaW5lSW5mby5uQmVnaW5Xb3JkSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBuUmlnaHQgPSBuTWlkIC0gMTsKLSAgICAgICAgICAgICAgICBuTWlkID0gKG5MZWZ0ICsgblJpZ2h0KSAvIDI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBsYWNlLm5Xb3JkSW5kZXggPiBwTGluZS0+bV9MaW5lSW5mby5uRW5kV29yZEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgbkxlZnQgPSBuTWlkICsgMTsKLSAgICAgICAgICAgICAgICBuTWlkID0gKG5MZWZ0ICsgblJpZ2h0KSAvIDI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBsYWNlLm5MaW5lSW5kZXggPSBuTWlkOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotfQotQ1BWVF9Xb3JkUGxhY2UgQ1NlY3Rpb246OlNlYXJjaFdvcmRQbGFjZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOwotICAgIENQVlRfV29yZFBsYWNlIHBsYWNlID0gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKLSAgICBGWF9CT09MIGJVcCA9IFRSVUU7Ci0gICAgRlhfQk9PTCBiRG93biA9IFRSVUU7Ci0gICAgRlhfSU5UMzIgbkxlZnQgPSAwOwotICAgIEZYX0lOVDMyIG5SaWdodCA9IG1fTGluZUFycmF5LkdldFNpemUoKSAtIDE7Ci0gICAgRlhfSU5UMzIgbk1pZCA9IG1fTGluZUFycmF5LkdldFNpemUoKSAvIDI7Ci0gICAgRlhfRkxPQVQgZlRvcCA9IDA7Ci0gICAgRlhfRkxPQVQgZkJvdHRvbSA9IDA7Ci0gICAgd2hpbGUgKG5MZWZ0IDw9IG5SaWdodCkgewotICAgICAgICBpZiAoQ0xpbmUgKiBwTGluZSA9IG1fTGluZUFycmF5LkdldEF0KG5NaWQpKSB7Ci0gICAgICAgICAgICBmVG9wID0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVZIC0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVBc2NlbnQgLSBtX3BWVC0+R2V0TGluZUxlYWRpbmcobV9TZWNJbmZvKTsKLSAgICAgICAgICAgIGZCb3R0b20gPSBwTGluZS0+bV9MaW5lSW5mby5mTGluZVkgLSBwTGluZS0+bV9MaW5lSW5mby5mTGluZURlc2NlbnQ7Ci0gICAgICAgICAgICBpZiAoSXNGbG9hdEJpZ2dlcihwb2ludC55LCBmVG9wKSkgewotICAgICAgICAgICAgICAgIGJVcCA9IEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKElzRmxvYXRTbWFsbGVyKHBvaW50LnksIGZCb3R0b20pKSB7Ci0gICAgICAgICAgICAgICAgYkRvd24gPSBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChJc0Zsb2F0U21hbGxlcihwb2ludC55LCBmVG9wKSkgewotICAgICAgICAgICAgICAgIG5SaWdodCA9IG5NaWQgLSAxOwotICAgICAgICAgICAgICAgIG5NaWQgPSAobkxlZnQgKyBuUmlnaHQpIC8gMjsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoSXNGbG9hdEJpZ2dlcihwb2ludC55LCBmQm90dG9tKSkgewotICAgICAgICAgICAgICAgIG5MZWZ0ID0gbk1pZCArIDE7Ci0gICAgICAgICAgICAgICAgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwbGFjZSA9IFNlYXJjaFdvcmRQbGFjZShwb2ludC54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVlRfV29yZFJhbmdlKHBMaW5lLT5HZXROZXh0V29yZFBsYWNlKHBMaW5lLT5HZXRCZWdpbldvcmRQbGFjZSgpKSwgcExpbmUtPkdldEVuZFdvcmRQbGFjZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICBwbGFjZS5uTGluZUluZGV4ID0gbk1pZDsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGxhY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGJVcCkgewotICAgICAgICBwbGFjZSA9IEdldEJlZ2luV29yZFBsYWNlKCk7Ci0gICAgfQotICAgIGlmIChiRG93bikgewotICAgICAgICBwbGFjZSA9IEdldEVuZFdvcmRQbGFjZSgpOwotICAgIH0KLSAgICByZXR1cm4gcGxhY2U7Ci19Ci1DUFZUX1dvcmRQbGFjZSBDU2VjdGlvbjo6U2VhcmNoV29yZFBsYWNlKEZYX0ZMT0FUIGZ4LCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIGxpbmVwbGFjZSkgY29uc3QKLXsKLSAgICBpZiAoQ0xpbmUgKiBwTGluZSA9IG1fTGluZUFycmF5LkdldEF0KGxpbmVwbGFjZS5uTGluZUluZGV4KSkgewotICAgICAgICByZXR1cm4gU2VhcmNoV29yZFBsYWNlKGZ4IC0gbV9TZWNJbmZvLnJjU2VjdGlvbi5sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVlRfV29yZFJhbmdlKHBMaW5lLT5HZXROZXh0V29yZFBsYWNlKHBMaW5lLT5HZXRCZWdpbldvcmRQbGFjZSgpKSwgcExpbmUtPkdldEVuZFdvcmRQbGFjZSgpKSk7Ci0gICAgfQorQ1BWVF9Xb3JkUGxhY2UgQ1NlY3Rpb246OkdldFByZXZXb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCB7CisgIGlmIChwbGFjZS5uTGluZUluZGV4IDwgMCkgewogICAgIHJldHVybiBHZXRCZWdpbldvcmRQbGFjZSgpOwotfQotQ1BWVF9Xb3JkUGxhY2UgQ1NlY3Rpb246OlNlYXJjaFdvcmRQbGFjZShGWF9GTE9BVCBmeCwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiByYW5nZSkgY29uc3QKLXsKLSAgICBDUFZUX1dvcmRQbGFjZSB3b3JkcGxhY2UgPSByYW5nZS5CZWdpblBvczsKLSAgICB3b3JkcGxhY2UubldvcmRJbmRleCA9IC0xOwotICAgIGlmICghbV9wVlQpCXsKLSAgICAgICAgcmV0dXJuIHdvcmRwbGFjZTsKKyAgfQorICBpZiAocGxhY2UubkxpbmVJbmRleCA+PSBtX0xpbmVBcnJheS5HZXRTaXplKCkpIHsKKyAgICByZXR1cm4gR2V0RW5kV29yZFBsYWNlKCk7CisgIH0KKyAgaWYgKENMaW5lKiBwTGluZSA9IG1fTGluZUFycmF5LkdldEF0KHBsYWNlLm5MaW5lSW5kZXgpKSB7CisgICAgaWYgKHBsYWNlLm5Xb3JkSW5kZXggPT0gcExpbmUtPm1fTGluZUluZm8ubkJlZ2luV29yZEluZGV4KSB7CisgICAgICByZXR1cm4gQ1BWVF9Xb3JkUGxhY2UocGxhY2UublNlY0luZGV4LCBwbGFjZS5uTGluZUluZGV4LCAtMSk7CiAgICAgfQotICAgIEZYX0lOVDMyIG5MZWZ0ID0gcmFuZ2UuQmVnaW5Qb3MubldvcmRJbmRleDsKLSAgICBGWF9JTlQzMiBuUmlnaHQgPSByYW5nZS5FbmRQb3MubldvcmRJbmRleCArIDE7Ci0gICAgRlhfSU5UMzIgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOwotICAgIHdoaWxlIChuTGVmdCA8IG5SaWdodCkgewotICAgICAgICBpZiAobk1pZCA9PSBuTGVmdCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5NaWQgPT0gblJpZ2h0KSB7Ci0gICAgICAgICAgICBuTWlkLS07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoQ1BWVF9Xb3JkSW5mbyAqIHBXb3JkID0gbV9Xb3JkQXJyYXkuR2V0QXQobk1pZCkpIHsKLSAgICAgICAgICAgIGlmIChmeCA+IHBXb3JkLT5mV29yZFggKyBtX3BWVC0+R2V0V29yZFdpZHRoKCpwV29yZCkgKiBQVlRfSEFMRikgewotICAgICAgICAgICAgICAgIG5MZWZ0ID0gbk1pZDsKLSAgICAgICAgICAgICAgICBuTWlkID0gKG5MZWZ0ICsgblJpZ2h0KSAvIDI7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5SaWdodCA9IG5NaWQ7Ci0gICAgICAgICAgICAgICAgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKENQVlRfV29yZEluZm8gKiBwV29yZCA9IG1fV29yZEFycmF5LkdldEF0KG5NaWQpKSB7Ci0gICAgICAgIGlmIChmeCA+IHBXb3JkLT5mV29yZFggKyBtX3BWVC0+R2V0V29yZFdpZHRoKCpwV29yZCkgKiBQVlRfSEFMRikgewotICAgICAgICAgICAgd29yZHBsYWNlLm5Xb3JkSW5kZXggPSBuTWlkOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB3b3JkcGxhY2U7Ci19Ci12b2lkIENTZWN0aW9uOjpDbGVhckxlZnRXb3JkcyhGWF9JTlQzMiBuV29yZEluZGV4KQotewotICAgIGZvciAoRlhfSU5UMzIgaSA9IG5Xb3JkSW5kZXg7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgIGRlbGV0ZSBtX1dvcmRBcnJheS5HZXRBdChpKTsKLSAgICAgICAgbV9Xb3JkQXJyYXkuUmVtb3ZlQXQoaSk7Ci0gICAgfQotfQotdm9pZCBDU2VjdGlvbjo6Q2xlYXJSaWdodFdvcmRzKEZYX0lOVDMyIG5Xb3JkSW5kZXgpCi17Ci0gICAgZm9yIChGWF9JTlQzMiBpID0gbV9Xb3JkQXJyYXkuR2V0U2l6ZSgpIC0gMTsgaSA+IG5Xb3JkSW5kZXg7IGktLSkgewotICAgICAgICBkZWxldGUgbV9Xb3JkQXJyYXkuR2V0QXQoaSk7Ci0gICAgICAgIG1fV29yZEFycmF5LlJlbW92ZUF0KGkpOwotICAgIH0KLX0KLXZvaWQgQ1NlY3Rpb246OkNsZWFyTWlkV29yZHMoRlhfSU5UMzIgbkJlZ2luSW5kZXgsIEZYX0lOVDMyIG5FbmRJbmRleCkKLXsKLSAgICBmb3IgKEZYX0lOVDMyIGkgPSBuRW5kSW5kZXg7IGkgPiBuQmVnaW5JbmRleDsgaS0tKSB7Ci0gICAgICAgIGRlbGV0ZSBtX1dvcmRBcnJheS5HZXRBdChpKTsKLSAgICAgICAgbV9Xb3JkQXJyYXkuUmVtb3ZlQXQoaSk7Ci0gICAgfQotfQotdm9pZCBDU2VjdGlvbjo6Q2xlYXJXb3Jkcyhjb25zdCBDUFZUX1dvcmRSYW5nZSAmIFBsYWNlUmFuZ2UpCi17Ci0gICAgQ1BWVF9Xb3JkUGxhY2UgU2VjQmVnaW5Qb3MgPSBHZXRCZWdpbldvcmRQbGFjZSgpOwotICAgIENQVlRfV29yZFBsYWNlIFNlY0VuZFBvcyA9IEdldEVuZFdvcmRQbGFjZSgpOwotICAgIGlmIChQbGFjZVJhbmdlLkJlZ2luUG9zLldvcmRDbXAoU2VjQmVnaW5Qb3MpID49IDApIHsKLSAgICAgICAgaWYgKFBsYWNlUmFuZ2UuRW5kUG9zLldvcmRDbXAoU2VjRW5kUG9zKSA8PSAwKSB7Ci0gICAgICAgICAgICBDbGVhck1pZFdvcmRzKFBsYWNlUmFuZ2UuQmVnaW5Qb3MubldvcmRJbmRleCwgUGxhY2VSYW5nZS5FbmRQb3MubldvcmRJbmRleCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDbGVhclJpZ2h0V29yZHMoUGxhY2VSYW5nZS5CZWdpblBvcy5uV29yZEluZGV4KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoUGxhY2VSYW5nZS5FbmRQb3MuV29yZENtcChTZWNFbmRQb3MpIDw9IDApIHsKLSAgICAgICAgQ2xlYXJMZWZ0V29yZHMoUGxhY2VSYW5nZS5FbmRQb3MubldvcmRJbmRleCk7CisgICAgaWYgKHBsYWNlLm5Xb3JkSW5kZXggPCBwTGluZS0+bV9MaW5lSW5mby5uQmVnaW5Xb3JkSW5kZXgpIHsKKyAgICAgIGlmIChDTGluZSogcFByZXZMaW5lID0gbV9MaW5lQXJyYXkuR2V0QXQocGxhY2UubkxpbmVJbmRleCAtIDEpKSB7CisgICAgICAgIHJldHVybiBwUHJldkxpbmUtPkdldEVuZFdvcmRQbGFjZSgpOworICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIFJlc2V0V29yZEFycmF5KCk7CisgICAgICByZXR1cm4gcExpbmUtPkdldFByZXZXb3JkUGxhY2UocGxhY2UpOwogICAgIH0KKyAgfQorICByZXR1cm4gcGxhY2U7CiB9Ci12b2lkIENTZWN0aW9uOjpDbGVhcldvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkKLXsKLSAgICBkZWxldGUgbV9Xb3JkQXJyYXkuR2V0QXQocGxhY2UubldvcmRJbmRleCk7Ci0gICAgbV9Xb3JkQXJyYXkuUmVtb3ZlQXQocGxhY2UubldvcmRJbmRleCk7Ci19Ci1DVHlwZXNldDo6Q1R5cGVzZXQoQ1NlY3Rpb24gKiBwU2VjdGlvbikgOiBtX3JjUmV0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpLCBtX3BWVChwU2VjdGlvbi0+bV9wVlQpLCBtX3BTZWN0aW9uKHBTZWN0aW9uKQotewotfQotQ1R5cGVzZXQ6On5DVHlwZXNldCgpCi17Ci19Ci1DUFZUX0Zsb2F0UmVjdCBDVHlwZXNldDo6Q2hhckFycmF5KCkKLXsKLSAgICBBU1NFUlQobV9wU2VjdGlvbiAhPSBOVUxMKTsKLSAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7Ci0gICAgRlhfRkxPQVQgZkxpbmVBc2NlbnQgPSBtX3BWVC0+R2V0Rm9udEFzY2VudChtX3BWVC0+R2V0RGVmYXVsdEZvbnRJbmRleCgpLCBtX3BWVC0+R2V0Rm9udFNpemUoKSk7Ci0gICAgRlhfRkxPQVQgZkxpbmVEZXNjZW50ID0gbV9wVlQtPkdldEZvbnREZXNjZW50KG1fcFZULT5HZXREZWZhdWx0Rm9udEluZGV4KCksIG1fcFZULT5HZXRGb250U2l6ZSgpKTsKLSAgICBtX3JjUmV0LkRlZmF1bHQoKTsKLSAgICBGWF9GTE9BVCB4ID0gMC4wZiwgeSA9IDAuMGY7Ci0gICAgRlhfRkxPQVQgZk5leHRXaWR0aDsKLSAgICBGWF9JTlQzMiBuU3RhcnQgPSAwOwotICAgIEZYX0ZMT0FUIGZOb2RlV2lkdGggPSBtX3BWVC0+R2V0UGxhdGVXaWR0aCgpIC8gKG1fcFZULT5tX25DaGFyQXJyYXkgPD0gMCA/IDEgOiBtX3BWVC0+bV9uQ2hhckFycmF5KTsKLSAgICBpZiAoQ0xpbmUgKiBwTGluZSA9IG1fcFNlY3Rpb24tPm1fTGluZUFycmF5LkdldEF0KDApKSB7Ci0gICAgICAgIHggPSAwLjBmOwotICAgICAgICB5ICs9ICBtX3BWVC0+R2V0TGluZUxlYWRpbmcobV9wU2VjdGlvbi0+bV9TZWNJbmZvKTsKLSAgICAgICAgeSArPSBmTGluZUFzY2VudDsKLSAgICAgICAgblN0YXJ0ID0gMDsKLSAgICAgICAgc3dpdGNoIChtX3BWVC0+R2V0QWxpZ25tZW50KG1fcFNlY3Rpb24tPm1fU2VjSW5mbykpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBwTGluZS0+bV9MaW5lSW5mby5mTGluZVggPSBmTm9kZVdpZHRoICogUFZUX0hBTEY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgblN0YXJ0ID0gKG1fcFZULT5tX25DaGFyQXJyYXkgLSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCkpIC8gMjsKLSAgICAgICAgICAgICAgICBwTGluZS0+bV9MaW5lSW5mby5mTGluZVggPSBmTm9kZVdpZHRoICogblN0YXJ0IC0gZk5vZGVXaWR0aCAqIFBWVF9IQUxGOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIG5TdGFydCA9IG1fcFZULT5tX25DaGFyQXJyYXkgLSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCk7Ci0gICAgICAgICAgICAgICAgcExpbmUtPm1fTGluZUluZm8uZkxpbmVYID0gZk5vZGVXaWR0aCAqIG5TdGFydCAtIGZOb2RlV2lkdGggKiBQVlRfSEFMRjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBmb3IgKEZYX0lOVDMyIHcgPSAwLCBzeiA9IG1fcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldFNpemUoKTsgdyA8IHN6OyB3KyspIHsKLSAgICAgICAgICAgIGlmICh3ID49IG1fcFZULT5tX25DaGFyQXJyYXkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZOZXh0V2lkdGggPSAwOwotICAgICAgICAgICAgaWYgKENQVlRfV29yZEluZm8gKiBwTmV4dFdvcmQgPSAoQ1BWVF9Xb3JkSW5mbyAqKW1fcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldEF0KHcgKyAxKSkgewotICAgICAgICAgICAgICAgIHBOZXh0V29yZC0+ZldvcmRUYWlsID0gMDsKLSAgICAgICAgICAgICAgICBmTmV4dFdpZHRoID0gbV9wVlQtPkdldFdvcmRXaWR0aCgqcE5leHRXb3JkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChDUFZUX1dvcmRJbmZvICogcFdvcmQgPSAoQ1BWVF9Xb3JkSW5mbyAqKW1fcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldEF0KHcpKSB7Ci0gICAgICAgICAgICAgICAgcFdvcmQtPmZXb3JkVGFpbCA9IDA7Ci0gICAgICAgICAgICAgICAgRlhfRkxPQVQgZldvcmRXaWR0aCA9IG1fcFZULT5HZXRXb3JkV2lkdGgoKnBXb3JkKTsKLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV29yZEFzY2VudCA9IG1fcFZULT5HZXRXb3JkQXNjZW50KCpwV29yZCk7Ci0gICAgICAgICAgICAgICAgRlhfRkxPQVQgZldvcmREZXNjZW50ID0gbV9wVlQtPkdldFdvcmREZXNjZW50KCpwV29yZCk7Ci0gICAgICAgICAgICAgICAgeCA9IChGWF9GTE9BVCkoZk5vZGVXaWR0aCAqICh3ICsgblN0YXJ0ICsgMC41KSAtIGZXb3JkV2lkdGggKiBQVlRfSEFMRik7Ci0gICAgICAgICAgICAgICAgcFdvcmQtPmZXb3JkWCA9IHg7Ci0gICAgICAgICAgICAgICAgcFdvcmQtPmZXb3JkWSA9IHk7Ci0gICAgICAgICAgICAgICAgaWYgKHcgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBwTGluZS0+bV9MaW5lSW5mby5mTGluZVggPSB4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodyAhPSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCkgLSAxKQotICAgICAgICAgICAgICAgICAgICBwV29yZC0+ZldvcmRUYWlsID0gKGZOb2RlV2lkdGggLSAoZldvcmRXaWR0aCArIGZOZXh0V2lkdGgpICogUFZUX0hBTEYgPiAwID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmTm9kZVdpZHRoIC0gKGZXb3JkV2lkdGggKyBmTmV4dFdpZHRoKSAqIFBWVF9IQUxGIDogMCk7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBXb3JkLT5mV29yZFRhaWwgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4ICs9IGZXb3JkV2lkdGg7Ci0gICAgICAgICAgICAgICAgZkxpbmVBc2NlbnQgPSBGUERGX01BWChmTGluZUFzY2VudCwgZldvcmRBc2NlbnQpOwotICAgICAgICAgICAgICAgIGZMaW5lRGVzY2VudCA9IEZQREZfTUlOKGZMaW5lRGVzY2VudCwgZldvcmREZXNjZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwTGluZS0+bV9MaW5lSW5mby5uQmVnaW5Xb3JkSW5kZXggPSAwOwotICAgICAgICBwTGluZS0+bV9MaW5lSW5mby5uRW5kV29yZEluZGV4ID0gbV9wU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpIC0gMTsKLSAgICAgICAgcExpbmUtPm1fTGluZUluZm8uZkxpbmVZID0geTsKLSAgICAgICAgcExpbmUtPm1fTGluZUluZm8uZkxpbmVXaWR0aCA9IAl4IC0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVYOwotICAgICAgICBwTGluZS0+bV9MaW5lSW5mby5mTGluZUFzY2VudCA9IGZMaW5lQXNjZW50OwotICAgICAgICBwTGluZS0+bV9MaW5lSW5mby5mTGluZURlc2NlbnQgPSBmTGluZURlc2NlbnQ7Ci0gICAgICAgIHkgKz0gKC1mTGluZURlc2NlbnQpOworQ1BWVF9Xb3JkUGxhY2UgQ1NlY3Rpb246OkdldE5leHRXb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCB7CisgIGlmIChwbGFjZS5uTGluZUluZGV4IDwgMCkgeworICAgIHJldHVybiBHZXRCZWdpbldvcmRQbGFjZSgpOworICB9CisgIGlmIChwbGFjZS5uTGluZUluZGV4ID49IG1fTGluZUFycmF5LkdldFNpemUoKSkgeworICAgIHJldHVybiBHZXRFbmRXb3JkUGxhY2UoKTsKKyAgfQorICBpZiAoQ0xpbmUqIHBMaW5lID0gbV9MaW5lQXJyYXkuR2V0QXQocGxhY2UubkxpbmVJbmRleCkpIHsKKyAgICBpZiAocGxhY2UubldvcmRJbmRleCA+PSBwTGluZS0+bV9MaW5lSW5mby5uRW5kV29yZEluZGV4KSB7CisgICAgICBpZiAoQ0xpbmUqIHBOZXh0TGluZSA9IG1fTGluZUFycmF5LkdldEF0KHBsYWNlLm5MaW5lSW5kZXggKyAxKSkgeworICAgICAgICByZXR1cm4gcE5leHRMaW5lLT5HZXRCZWdpbldvcmRQbGFjZSgpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gcExpbmUtPkdldE5leHRXb3JkUGxhY2UocGxhY2UpOwogICAgIH0KLSAgICByZXR1cm4gbV9yY1JldCA9IENQVlRfRmxvYXRSZWN0KDAsIDAsIHgsIHkpOworICB9CisgIHJldHVybiBwbGFjZTsKIH0KLUNQVlRfU2l6ZSBDVHlwZXNldDo6R2V0RWRpdFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKQotewotICAgIEFTU0VSVChtX3BTZWN0aW9uICE9IE5VTEwpOwotICAgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKLSAgICBTcGxpdExpbmVzKEZBTFNFLCBmRm9udFNpemUpOwotICAgIHJldHVybiBDUFZUX1NpemUobV9yY1JldC5XaWR0aCgpLCBtX3JjUmV0LkhlaWdodCgpKTsKK3ZvaWQgQ1NlY3Rpb246OlVwZGF0ZVdvcmRQbGFjZShDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IHsKKyAgaW50MzJfdCBuTGVmdCA9IDA7CisgIGludDMyX3QgblJpZ2h0ID0gbV9MaW5lQXJyYXkuR2V0U2l6ZSgpIC0gMTsKKyAgaW50MzJfdCBuTWlkID0gKG5MZWZ0ICsgblJpZ2h0KSAvIDI7CisgIHdoaWxlIChuTGVmdCA8PSBuUmlnaHQpIHsKKyAgICBpZiAoQ0xpbmUqIHBMaW5lID0gbV9MaW5lQXJyYXkuR2V0QXQobk1pZCkpIHsKKyAgICAgIGlmIChwbGFjZS5uV29yZEluZGV4IDwgcExpbmUtPm1fTGluZUluZm8ubkJlZ2luV29yZEluZGV4KSB7CisgICAgICAgIG5SaWdodCA9IG5NaWQgLSAxOworICAgICAgICBuTWlkID0gKG5MZWZ0ICsgblJpZ2h0KSAvIDI7CisgICAgICB9IGVsc2UgaWYgKHBsYWNlLm5Xb3JkSW5kZXggPiBwTGluZS0+bV9MaW5lSW5mby5uRW5kV29yZEluZGV4KSB7CisgICAgICAgIG5MZWZ0ID0gbk1pZCArIDE7CisgICAgICAgIG5NaWQgPSAobkxlZnQgKyBuUmlnaHQpIC8gMjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBsYWNlLm5MaW5lSW5kZXggPSBuTWlkOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQogfQotQ1BWVF9GbG9hdFJlY3QgQ1R5cGVzZXQ6OlR5cGVzZXQoKQotewotICAgIEFTU0VSVChtX3BTZWN0aW9uICE9IE5VTEwpOwotICAgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKLSAgICBtX3BTZWN0aW9uLT5tX0xpbmVBcnJheS5FbXB0eSgpOwotICAgIFNwbGl0TGluZXMoVFJVRSwgMC4wZik7Ci0gICAgbV9wU2VjdGlvbi0+bV9MaW5lQXJyYXkuQ2xlYXIoKTsKLSAgICBPdXRwdXRMaW5lcygpOwotICAgIHJldHVybiBtX3JjUmV0OworQ1BWVF9Xb3JkUGxhY2UgQ1NlY3Rpb246OlNlYXJjaFdvcmRQbGFjZShjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3QgeworICBBU1NFUlQobV9wVlQpOworICBDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IEdldEJlZ2luV29yZFBsYWNlKCk7CisgIEZYX0JPT0wgYlVwID0gVFJVRTsKKyAgRlhfQk9PTCBiRG93biA9IFRSVUU7CisgIGludDMyX3QgbkxlZnQgPSAwOworICBpbnQzMl90IG5SaWdodCA9IG1fTGluZUFycmF5LkdldFNpemUoKSAtIDE7CisgIGludDMyX3Qgbk1pZCA9IG1fTGluZUFycmF5LkdldFNpemUoKSAvIDI7CisgIEZYX0ZMT0FUIGZUb3AgPSAwOworICBGWF9GTE9BVCBmQm90dG9tID0gMDsKKyAgd2hpbGUgKG5MZWZ0IDw9IG5SaWdodCkgeworICAgIGlmIChDTGluZSogcExpbmUgPSBtX0xpbmVBcnJheS5HZXRBdChuTWlkKSkgeworICAgICAgZlRvcCA9IHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWSAtIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lQXNjZW50IC0KKyAgICAgICAgICAgICBtX3BWVC0+R2V0TGluZUxlYWRpbmcobV9TZWNJbmZvKTsKKyAgICAgIGZCb3R0b20gPSBwTGluZS0+bV9MaW5lSW5mby5mTGluZVkgLSBwTGluZS0+bV9MaW5lSW5mby5mTGluZURlc2NlbnQ7CisgICAgICBpZiAoSXNGbG9hdEJpZ2dlcihwb2ludC55LCBmVG9wKSkgeworICAgICAgICBiVXAgPSBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGlmIChJc0Zsb2F0U21hbGxlcihwb2ludC55LCBmQm90dG9tKSkgeworICAgICAgICBiRG93biA9IEZBTFNFOworICAgICAgfQorICAgICAgaWYgKElzRmxvYXRTbWFsbGVyKHBvaW50LnksIGZUb3ApKSB7CisgICAgICAgIG5SaWdodCA9IG5NaWQgLSAxOworICAgICAgICBuTWlkID0gKG5MZWZ0ICsgblJpZ2h0KSAvIDI7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlIGlmIChJc0Zsb2F0QmlnZ2VyKHBvaW50LnksIGZCb3R0b20pKSB7CisgICAgICAgIG5MZWZ0ID0gbk1pZCArIDE7CisgICAgICAgIG5NaWQgPSAobkxlZnQgKyBuUmlnaHQpIC8gMjsKKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBwbGFjZSA9IFNlYXJjaFdvcmRQbGFjZSgKKyAgICAgICAgICAgIHBvaW50LngsCisgICAgICAgICAgICBDUFZUX1dvcmRSYW5nZShwTGluZS0+R2V0TmV4dFdvcmRQbGFjZShwTGluZS0+R2V0QmVnaW5Xb3JkUGxhY2UoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZS0+R2V0RW5kV29yZFBsYWNlKCkpKTsKKyAgICAgICAgcGxhY2UubkxpbmVJbmRleCA9IG5NaWQ7CisgICAgICAgIHJldHVybiBwbGFjZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKGJVcCkgeworICAgIHBsYWNlID0gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKKyAgfQorICBpZiAoYkRvd24pIHsKKyAgICBwbGFjZSA9IEdldEVuZFdvcmRQbGFjZSgpOworICB9CisgIHJldHVybiBwbGFjZTsKK30KK0NQVlRfV29yZFBsYWNlIENTZWN0aW9uOjpTZWFyY2hXb3JkUGxhY2UoCisgICAgRlhfRkxPQVQgZngsCisgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIGxpbmVwbGFjZSkgY29uc3QgeworICBpZiAoQ0xpbmUqIHBMaW5lID0gbV9MaW5lQXJyYXkuR2V0QXQobGluZXBsYWNlLm5MaW5lSW5kZXgpKSB7CisgICAgcmV0dXJuIFNlYXJjaFdvcmRQbGFjZSgKKyAgICAgICAgZnggLSBtX1NlY0luZm8ucmNTZWN0aW9uLmxlZnQsCisgICAgICAgIENQVlRfV29yZFJhbmdlKHBMaW5lLT5HZXROZXh0V29yZFBsYWNlKHBMaW5lLT5HZXRCZWdpbldvcmRQbGFjZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcExpbmUtPkdldEVuZFdvcmRQbGFjZSgpKSk7CisgIH0KKyAgcmV0dXJuIEdldEJlZ2luV29yZFBsYWNlKCk7Cit9CitDUFZUX1dvcmRQbGFjZSBDU2VjdGlvbjo6U2VhcmNoV29yZFBsYWNlKEZYX0ZMT0FUIGZ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSYgcmFuZ2UpIGNvbnN0IHsKKyAgQ1BWVF9Xb3JkUGxhY2Ugd29yZHBsYWNlID0gcmFuZ2UuQmVnaW5Qb3M7CisgIHdvcmRwbGFjZS5uV29yZEluZGV4ID0gLTE7CisgIGlmICghbV9wVlQpIHsKKyAgICByZXR1cm4gd29yZHBsYWNlOworICB9CisgIGludDMyX3QgbkxlZnQgPSByYW5nZS5CZWdpblBvcy5uV29yZEluZGV4OworICBpbnQzMl90IG5SaWdodCA9IHJhbmdlLkVuZFBvcy5uV29yZEluZGV4ICsgMTsKKyAgaW50MzJfdCBuTWlkID0gKG5MZWZ0ICsgblJpZ2h0KSAvIDI7CisgIHdoaWxlIChuTGVmdCA8IG5SaWdodCkgeworICAgIGlmIChuTWlkID09IG5MZWZ0KSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKG5NaWQgPT0gblJpZ2h0KSB7CisgICAgICBuTWlkLS07CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKENQVlRfV29yZEluZm8qIHBXb3JkID0gbV9Xb3JkQXJyYXkuR2V0QXQobk1pZCkpIHsKKyAgICAgIGlmIChmeCA+IHBXb3JkLT5mV29yZFggKyBtX3BWVC0+R2V0V29yZFdpZHRoKCpwV29yZCkgKiBQVlRfSEFMRikgeworICAgICAgICBuTGVmdCA9IG5NaWQ7CisgICAgICAgIG5NaWQgPSAobkxlZnQgKyBuUmlnaHQpIC8gMjsKKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBuUmlnaHQgPSBuTWlkOworICAgICAgICBuTWlkID0gKG5MZWZ0ICsgblJpZ2h0KSAvIDI7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKENQVlRfV29yZEluZm8qIHBXb3JkID0gbV9Xb3JkQXJyYXkuR2V0QXQobk1pZCkpIHsKKyAgICBpZiAoZnggPiBwV29yZC0+ZldvcmRYICsgbV9wVlQtPkdldFdvcmRXaWR0aCgqcFdvcmQpICogUFZUX0hBTEYpIHsKKyAgICAgIHdvcmRwbGFjZS5uV29yZEluZGV4ID0gbk1pZDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHdvcmRwbGFjZTsKK30KK3ZvaWQgQ1NlY3Rpb246OkNsZWFyTGVmdFdvcmRzKGludDMyX3QgbldvcmRJbmRleCkgeworICBmb3IgKGludDMyX3QgaSA9IG5Xb3JkSW5kZXg7IGkgPj0gMDsgaS0tKSB7CisgICAgZGVsZXRlIG1fV29yZEFycmF5LkdldEF0KGkpOworICAgIG1fV29yZEFycmF5LlJlbW92ZUF0KGkpOworICB9Cit9Cit2b2lkIENTZWN0aW9uOjpDbGVhclJpZ2h0V29yZHMoaW50MzJfdCBuV29yZEluZGV4KSB7CisgIGZvciAoaW50MzJfdCBpID0gbV9Xb3JkQXJyYXkuR2V0U2l6ZSgpIC0gMTsgaSA+IG5Xb3JkSW5kZXg7IGktLSkgeworICAgIGRlbGV0ZSBtX1dvcmRBcnJheS5HZXRBdChpKTsKKyAgICBtX1dvcmRBcnJheS5SZW1vdmVBdChpKTsKKyAgfQorfQordm9pZCBDU2VjdGlvbjo6Q2xlYXJNaWRXb3JkcyhpbnQzMl90IG5CZWdpbkluZGV4LCBpbnQzMl90IG5FbmRJbmRleCkgeworICBmb3IgKGludDMyX3QgaSA9IG5FbmRJbmRleDsgaSA+IG5CZWdpbkluZGV4OyBpLS0pIHsKKyAgICBkZWxldGUgbV9Xb3JkQXJyYXkuR2V0QXQoaSk7CisgICAgbV9Xb3JkQXJyYXkuUmVtb3ZlQXQoaSk7CisgIH0KK30KK3ZvaWQgQ1NlY3Rpb246OkNsZWFyV29yZHMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIFBsYWNlUmFuZ2UpIHsKKyAgQ1BWVF9Xb3JkUGxhY2UgU2VjQmVnaW5Qb3MgPSBHZXRCZWdpbldvcmRQbGFjZSgpOworICBDUFZUX1dvcmRQbGFjZSBTZWNFbmRQb3MgPSBHZXRFbmRXb3JkUGxhY2UoKTsKKyAgaWYgKFBsYWNlUmFuZ2UuQmVnaW5Qb3MuV29yZENtcChTZWNCZWdpblBvcykgPj0gMCkgeworICAgIGlmIChQbGFjZVJhbmdlLkVuZFBvcy5Xb3JkQ21wKFNlY0VuZFBvcykgPD0gMCkgeworICAgICAgQ2xlYXJNaWRXb3JkcyhQbGFjZVJhbmdlLkJlZ2luUG9zLm5Xb3JkSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIFBsYWNlUmFuZ2UuRW5kUG9zLm5Xb3JkSW5kZXgpOworICAgIH0gZWxzZSB7CisgICAgICBDbGVhclJpZ2h0V29yZHMoUGxhY2VSYW5nZS5CZWdpblBvcy5uV29yZEluZGV4KTsKKyAgICB9CisgIH0gZWxzZSBpZiAoUGxhY2VSYW5nZS5FbmRQb3MuV29yZENtcChTZWNFbmRQb3MpIDw9IDApIHsKKyAgICBDbGVhckxlZnRXb3JkcyhQbGFjZVJhbmdlLkVuZFBvcy5uV29yZEluZGV4KTsKKyAgfSBlbHNlIHsKKyAgICBSZXNldFdvcmRBcnJheSgpOworICB9Cit9Cit2b2lkIENTZWN0aW9uOjpDbGVhcldvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSB7CisgIGRlbGV0ZSBtX1dvcmRBcnJheS5HZXRBdChwbGFjZS5uV29yZEluZGV4KTsKKyAgbV9Xb3JkQXJyYXkuUmVtb3ZlQXQocGxhY2UubldvcmRJbmRleCk7Cit9CitDVHlwZXNldDo6Q1R5cGVzZXQoQ1NlY3Rpb24qIHBTZWN0aW9uKQorICAgIDogbV9yY1JldCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKSwKKyAgICAgIG1fcFZUKHBTZWN0aW9uLT5tX3BWVCksCisgICAgICBtX3BTZWN0aW9uKHBTZWN0aW9uKSB7fQorQ1R5cGVzZXQ6On5DVHlwZXNldCgpIHt9CitDUFZUX0Zsb2F0UmVjdCBDVHlwZXNldDo6Q2hhckFycmF5KCkgeworICBBU1NFUlQobV9wU2VjdGlvbik7CisgIEZYX0ZMT0FUIGZMaW5lQXNjZW50ID0KKyAgICAgIG1fcFZULT5HZXRGb250QXNjZW50KG1fcFZULT5HZXREZWZhdWx0Rm9udEluZGV4KCksIG1fcFZULT5HZXRGb250U2l6ZSgpKTsKKyAgRlhfRkxPQVQgZkxpbmVEZXNjZW50ID0KKyAgICAgIG1fcFZULT5HZXRGb250RGVzY2VudChtX3BWVC0+R2V0RGVmYXVsdEZvbnRJbmRleCgpLCBtX3BWVC0+R2V0Rm9udFNpemUoKSk7CisgIG1fcmNSZXQuRGVmYXVsdCgpOworICBGWF9GTE9BVCB4ID0gMC4wZiwgeSA9IDAuMGY7CisgIEZYX0ZMT0FUIGZOZXh0V2lkdGg7CisgIGludDMyX3QgblN0YXJ0ID0gMDsKKyAgRlhfRkxPQVQgZk5vZGVXaWR0aCA9IG1fcFZULT5HZXRQbGF0ZVdpZHRoKCkgLworICAgICAgICAgICAgICAgICAgICAgICAgKG1fcFZULT5tX25DaGFyQXJyYXkgPD0gMCA/IDEgOiBtX3BWVC0+bV9uQ2hhckFycmF5KTsKKyAgaWYgKENMaW5lKiBwTGluZSA9IG1fcFNlY3Rpb24tPm1fTGluZUFycmF5LkdldEF0KDApKSB7CisgICAgeCA9IDAuMGY7CisgICAgeSArPSBtX3BWVC0+R2V0TGluZUxlYWRpbmcobV9wU2VjdGlvbi0+bV9TZWNJbmZvKTsKKyAgICB5ICs9IGZMaW5lQXNjZW50OworICAgIG5TdGFydCA9IDA7CisgICAgc3dpdGNoIChtX3BWVC0+R2V0QWxpZ25tZW50KG1fcFNlY3Rpb24tPm1fU2VjSW5mbykpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgcExpbmUtPm1fTGluZUluZm8uZkxpbmVYID0gZk5vZGVXaWR0aCAqIFBWVF9IQUxGOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgblN0YXJ0ID0gKG1fcFZULT5tX25DaGFyQXJyYXkgLSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCkpIC8gMjsKKyAgICAgICAgcExpbmUtPm1fTGluZUluZm8uZkxpbmVYID0gZk5vZGVXaWR0aCAqIG5TdGFydCAtIGZOb2RlV2lkdGggKiBQVlRfSEFMRjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIG5TdGFydCA9IG1fcFZULT5tX25DaGFyQXJyYXkgLSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCk7CisgICAgICAgIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWCA9IGZOb2RlV2lkdGggKiBuU3RhcnQgLSBmTm9kZVdpZHRoICogUFZUX0hBTEY7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBmb3IgKGludDMyX3QgdyA9IDAsIHN6ID0gbV9wU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpOyB3IDwgc3o7IHcrKykgeworICAgICAgaWYgKHcgPj0gbV9wVlQtPm1fbkNoYXJBcnJheSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGZOZXh0V2lkdGggPSAwOworICAgICAgaWYgKENQVlRfV29yZEluZm8qIHBOZXh0V29yZCA9CisgICAgICAgICAgICAgIChDUFZUX1dvcmRJbmZvKiltX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdCh3ICsgMSkpIHsKKyAgICAgICAgcE5leHRXb3JkLT5mV29yZFRhaWwgPSAwOworICAgICAgICBmTmV4dFdpZHRoID0gbV9wVlQtPkdldFdvcmRXaWR0aCgqcE5leHRXb3JkKTsKKyAgICAgIH0KKyAgICAgIGlmIChDUFZUX1dvcmRJbmZvKiBwV29yZCA9CisgICAgICAgICAgICAgIChDUFZUX1dvcmRJbmZvKiltX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdCh3KSkgeworICAgICAgICBwV29yZC0+ZldvcmRUYWlsID0gMDsKKyAgICAgICAgRlhfRkxPQVQgZldvcmRXaWR0aCA9IG1fcFZULT5HZXRXb3JkV2lkdGgoKnBXb3JkKTsKKyAgICAgICAgRlhfRkxPQVQgZldvcmRBc2NlbnQgPSBtX3BWVC0+R2V0V29yZEFzY2VudCgqcFdvcmQpOworICAgICAgICBGWF9GTE9BVCBmV29yZERlc2NlbnQgPSBtX3BWVC0+R2V0V29yZERlc2NlbnQoKnBXb3JkKTsKKyAgICAgICAgeCA9IChGWF9GTE9BVCkoZk5vZGVXaWR0aCAqICh3ICsgblN0YXJ0ICsgMC41KSAtIGZXb3JkV2lkdGggKiBQVlRfSEFMRik7CisgICAgICAgIHBXb3JkLT5mV29yZFggPSB4OworICAgICAgICBwV29yZC0+ZldvcmRZID0geTsKKyAgICAgICAgaWYgKHcgPT0gMCkgeworICAgICAgICAgIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWCA9IHg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHcgIT0gbV9wU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpIC0gMSkgeworICAgICAgICAgIHBXb3JkLT5mV29yZFRhaWwgPQorICAgICAgICAgICAgICAoZk5vZGVXaWR0aCAtIChmV29yZFdpZHRoICsgZk5leHRXaWR0aCkgKiBQVlRfSEFMRiA+IDAKKyAgICAgICAgICAgICAgICAgICA/IGZOb2RlV2lkdGggLSAoZldvcmRXaWR0aCArIGZOZXh0V2lkdGgpICogUFZUX0hBTEYKKyAgICAgICAgICAgICAgICAgICA6IDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBXb3JkLT5mV29yZFRhaWwgPSAwOworICAgICAgICB9CisgICAgICAgIHggKz0gZldvcmRXaWR0aDsKKyAgICAgICAgZkxpbmVBc2NlbnQgPSBzdGQ6Om1heChmTGluZUFzY2VudCwgZldvcmRBc2NlbnQpOworICAgICAgICBmTGluZURlc2NlbnQgPSBzdGQ6Om1pbihmTGluZURlc2NlbnQsIGZXb3JkRGVzY2VudCk7CisgICAgICB9CisgICAgfQorICAgIHBMaW5lLT5tX0xpbmVJbmZvLm5CZWdpbldvcmRJbmRleCA9IDA7CisgICAgcExpbmUtPm1fTGluZUluZm8ubkVuZFdvcmRJbmRleCA9IG1fcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldFNpemUoKSAtIDE7CisgICAgcExpbmUtPm1fTGluZUluZm8uZkxpbmVZID0geTsKKyAgICBwTGluZS0+bV9MaW5lSW5mby5mTGluZVdpZHRoID0geCAtIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWDsKKyAgICBwTGluZS0+bV9MaW5lSW5mby5mTGluZUFzY2VudCA9IGZMaW5lQXNjZW50OworICAgIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lRGVzY2VudCA9IGZMaW5lRGVzY2VudDsKKyAgICB5ICs9ICgtZkxpbmVEZXNjZW50KTsKKyAgfQorICByZXR1cm4gbV9yY1JldCA9IENQVlRfRmxvYXRSZWN0KDAsIDAsIHgsIHkpOworfQorQ1BWVF9TaXplIENUeXBlc2V0OjpHZXRFZGl0U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpIHsKKyAgQVNTRVJUKG1fcFNlY3Rpb24pOworICBBU1NFUlQobV9wVlQpOworICBTcGxpdExpbmVzKEZBTFNFLCBmRm9udFNpemUpOworICByZXR1cm4gQ1BWVF9TaXplKG1fcmNSZXQuV2lkdGgoKSwgbV9yY1JldC5IZWlnaHQoKSk7Cit9CitDUFZUX0Zsb2F0UmVjdCBDVHlwZXNldDo6VHlwZXNldCgpIHsKKyAgQVNTRVJUKG1fcFZUKTsKKyAgbV9wU2VjdGlvbi0+bV9MaW5lQXJyYXkuRW1wdHkoKTsKKyAgU3BsaXRMaW5lcyhUUlVFLCAwLjBmKTsKKyAgbV9wU2VjdGlvbi0+bV9MaW5lQXJyYXkuQ2xlYXIoKTsKKyAgT3V0cHV0TGluZXMoKTsKKyAgcmV0dXJuIG1fcmNSZXQ7CiB9CiBzdGF0aWMgaW50IHNwZWNpYWxfY2hhcnNbMTI4XSA9IHsKLSAgICAweDAwMDAsIDB4MDAwQywgMHgwMDA4LCAweDAwMEMsIDB4MDAwOCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwOCwgMHgwMDA4LCAweDAwMDAsIDB4MDAxMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAyOCwKLSAgICAweDAwMEMsIDB4MDAwOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAyOCwgMHgwMDI4LCAweDAwMjgsIDB4MDAyOCwKLSAgICAweDAwMDIsIDB4MDAwMiwgMHgwMDAyLCAweDAwMDIsIDB4MDAwMiwgMHgwMDAyLCAweDAwMDIsIDB4MDAwMiwKLSAgICAweDAwMDIsIDB4MDAwMiwgMHgwMDA4LCAweDAwMDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwOCwKLSAgICAweDAwMDAsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwKLSAgICAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwKLSAgICAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwKLSAgICAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMEMsIDB4MDAwMCwgMHgwMDA4LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwKLSAgICAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwKLSAgICAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwKLSAgICAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMEMsIDB4MDAwMCwgMHgwMDA4LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwQywgMHgwMDA4LCAweDAwMEMsIDB4MDAwOCwgMHgwMDAwLCAweDAwMjAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDgsIDB4MDAwOCwgMHgwMDAwLAorICAgIDB4MDAxMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAyOCwgMHgwMDBDLCAweDAwMDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMjgsCisgICAgMHgwMDI4LCAweDAwMjgsIDB4MDAyOCwgMHgwMDAyLCAweDAwMDIsIDB4MDAwMiwgMHgwMDAyLCAweDAwMDIsIDB4MDAwMiwKKyAgICAweDAwMDIsIDB4MDAwMiwgMHgwMDAyLCAweDAwMDIsIDB4MDAwOCwgMHgwMDA4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwOCwgMHgwMDAwLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsCisgICAgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwKKyAgICAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLAorICAgIDB4MDAwMSwgMHgwMDBDLCAweDAwMDAsIDB4MDAwOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAxLCAweDAwMDEsCisgICAgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwKKyAgICAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLAorICAgIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwQywgMHgwMDAwLCAweDAwMDgsCisgICAgMHgwMDAwLCAweDAwMDAsCiB9Owotc3RhdGljIEZYX0JPT0wgSXNMYXRpbihGWF9XT1JEIHdvcmQpCi17Ci0gICAgaWYgKHdvcmQgPD0gMHgwMDdGKSB7Ci0gICAgICAgIGlmIChzcGVjaWFsX2NoYXJzW3dvcmRdICYgMHgwMDAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQorc3RhdGljIEZYX0JPT0wgSXNMYXRpbihGWF9XT1JEIHdvcmQpIHsKKyAgaWYgKHdvcmQgPD0gMHgwMDdGKSB7CisgICAgaWYgKHNwZWNpYWxfY2hhcnNbd29yZF0gJiAweDAwMDEpIHsKKyAgICAgIHJldHVybiBUUlVFOwogICAgIH0KLSAgICBpZiAoKHdvcmQgPj0gMHgwMEMwICYmIHdvcmQgPD0gMHgwMEZGKSB8fAotICAgICAgICAgICAgKHdvcmQgPj0gMHgwMTAwICYmIHdvcmQgPD0gMHgwMjRGKSB8fAotICAgICAgICAgICAgKHdvcmQgPj0gMHgxRTAwICYmIHdvcmQgPD0gMHgxRUZGKSB8fAotICAgICAgICAgICAgKHdvcmQgPj0gMHgyQzYwICYmIHdvcmQgPD0gMHgyQzdGKSB8fAotICAgICAgICAgICAgKHdvcmQgPj0gMHhBNzIwICYmIHdvcmQgPD0gMHhBN0ZGKSB8fAotICAgICAgICAgICAgKHdvcmQgPj0gMHhGRjIxICYmIHdvcmQgPD0gMHhGRjNBKSB8fAotICAgICAgICAgICAgKHdvcmQgPj0gMHhGRjQxICYmIHdvcmQgPD0gMHhGRjVBKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoKHdvcmQgPj0gMHgwMEMwICYmIHdvcmQgPD0gMHgwMEZGKSB8fAorICAgICAgKHdvcmQgPj0gMHgwMTAwICYmIHdvcmQgPD0gMHgwMjRGKSB8fAorICAgICAgKHdvcmQgPj0gMHgxRTAwICYmIHdvcmQgPD0gMHgxRUZGKSB8fAorICAgICAgKHdvcmQgPj0gMHgyQzYwICYmIHdvcmQgPD0gMHgyQzdGKSB8fAorICAgICAgKHdvcmQgPj0gMHhBNzIwICYmIHdvcmQgPD0gMHhBN0ZGKSB8fAorICAgICAgKHdvcmQgPj0gMHhGRjIxICYmIHdvcmQgPD0gMHhGRjNBKSB8fAorICAgICAgKHdvcmQgPj0gMHhGRjQxICYmIHdvcmQgPD0gMHhGRjVBKSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKK30KK3N0YXRpYyBGWF9CT09MIElzRGlnaXQoRlhfRFdPUkQgd29yZCkgeworICByZXR1cm4gd29yZCA+PSAweDAwMzAgJiYgd29yZCA8PSAweDAwMzk7Cit9CitzdGF0aWMgRlhfQk9PTCBJc0NKSyhGWF9EV09SRCB3b3JkKSB7CisgIGlmICgod29yZCA+PSAweDExMDAgJiYgd29yZCA8PSAweDExRkYpIHx8CisgICAgICAod29yZCA+PSAweDJFODAgJiYgd29yZCA8PSAweDJGRkYpIHx8CisgICAgICAod29yZCA+PSAweDMwNDAgJiYgd29yZCA8PSAweDlGQkYpIHx8CisgICAgICAod29yZCA+PSAweEFDMDAgJiYgd29yZCA8PSAweEQ3QUYpIHx8CisgICAgICAod29yZCA+PSAweEY5MDAgJiYgd29yZCA8PSAweEZBRkYpIHx8CisgICAgICAod29yZCA+PSAweEZFMzAgJiYgd29yZCA8PSAweEZFNEYpIHx8CisgICAgICAod29yZCA+PSAweDIwMDAwICYmIHdvcmQgPD0gMHgyQTZERikgfHwKKyAgICAgICh3b3JkID49IDB4MkY4MDAgJiYgd29yZCA8PSAweDJGQTFGKSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmICh3b3JkID49IDB4MzAwMCAmJiB3b3JkIDw9IDB4MzAzRikgeworICAgIGlmICh3b3JkID09IDB4MzAwNSB8fCB3b3JkID09IDB4MzAwNiB8fCB3b3JkID09IDB4MzAyMSB8fCB3b3JkID09IDB4MzAyMiB8fAorICAgICAgICB3b3JkID09IDB4MzAyMyB8fCB3b3JkID09IDB4MzAyNCB8fCB3b3JkID09IDB4MzAyNSB8fCB3b3JkID09IDB4MzAyNiB8fAorICAgICAgICB3b3JkID09IDB4MzAyNyB8fCB3b3JkID09IDB4MzAyOCB8fCB3b3JkID09IDB4MzAyOSB8fCB3b3JkID09IDB4MzAzMSB8fAorICAgICAgICB3b3JkID09IDB4MzAzMiB8fCB3b3JkID09IDB4MzAzMyB8fCB3b3JkID09IDB4MzAzNCB8fCB3b3JkID09IDB4MzAzNSkgeworICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAod29yZCA+PSAweEZGNjYgJiYgd29yZCA8PSAweEZGOUQpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1zdGF0aWMgRlhfQk9PTCBJc0RpZ2l0KEZYX0RXT1JEIHdvcmQpCi17Ci0gICAgcmV0dXJuICh3b3JkID49IDB4MDAzMCAmJiB3b3JkIDw9IDB4MDAzOSkgPyBUUlVFIDogRkFMU0U7CitzdGF0aWMgRlhfQk9PTCBJc1B1bmN0dWF0aW9uKEZYX0RXT1JEIHdvcmQpIHsKKyAgaWYgKHdvcmQgPD0gMHgwMDdGKSB7CisgICAgaWYgKChzcGVjaWFsX2NoYXJzW3dvcmRdID4+IDMpICYgMSkgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9IGVsc2UgaWYgKHdvcmQgPj0gMHgwMDgwICYmIHdvcmQgPD0gMHgwMEZGKSB7CisgICAgaWYgKHdvcmQgPT0gMHgwMDgyIHx8IHdvcmQgPT0gMHgwMDg0IHx8IHdvcmQgPT0gMHgwMDg1IHx8IHdvcmQgPT0gMHgwMDkxIHx8CisgICAgICAgIHdvcmQgPT0gMHgwMDkyIHx8IHdvcmQgPT0gMHgwMDkzIHx8IHdvcmQgPD0gMHgwMDk0IHx8IHdvcmQgPT0gMHgwMDk2IHx8CisgICAgICAgIHdvcmQgPT0gMHgwMEI0IHx8IHdvcmQgPT0gMHgwMEI4KSB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0gZWxzZSBpZiAod29yZCA+PSAweDIwMDAgJiYgd29yZCA8PSAweDIwNkYpIHsKKyAgICBpZiAod29yZCA9PSAweDIwMTAgfHwgd29yZCA9PSAweDIwMTEgfHwgd29yZCA9PSAweDIwMTIgfHwgd29yZCA9PSAweDIwMTMgfHwKKyAgICAgICAgd29yZCA9PSAweDIwMTggfHwgd29yZCA9PSAweDIwMTkgfHwgd29yZCA9PSAweDIwMUEgfHwgd29yZCA9PSAweDIwMUIgfHwKKyAgICAgICAgd29yZCA9PSAweDIwMUMgfHwgd29yZCA9PSAweDIwMUQgfHwgd29yZCA9PSAweDIwMUUgfHwgd29yZCA9PSAweDIwMUYgfHwKKyAgICAgICAgd29yZCA9PSAweDIwMzIgfHwgd29yZCA9PSAweDIwMzMgfHwgd29yZCA9PSAweDIwMzQgfHwgd29yZCA9PSAweDIwMzUgfHwKKyAgICAgICAgd29yZCA9PSAweDIwMzYgfHwgd29yZCA9PSAweDIwMzcgfHwgd29yZCA9PSAweDIwM0MgfHwgd29yZCA9PSAweDIwM0QgfHwKKyAgICAgICAgd29yZCA9PSAweDIwM0UgfHwgd29yZCA9PSAweDIwNDQpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfSBlbHNlIGlmICh3b3JkID49IDB4MzAwMCAmJiB3b3JkIDw9IDB4MzAzRikgeworICAgIGlmICh3b3JkID09IDB4MzAwMSB8fCB3b3JkID09IDB4MzAwMiB8fCB3b3JkID09IDB4MzAwMyB8fCB3b3JkID09IDB4MzAwNSB8fAorICAgICAgICB3b3JkID09IDB4MzAwOSB8fCB3b3JkID09IDB4MzAwQSB8fCB3b3JkID09IDB4MzAwQiB8fCB3b3JkID09IDB4MzAwQyB8fAorICAgICAgICB3b3JkID09IDB4MzAwRCB8fCB3b3JkID09IDB4MzAwRiB8fCB3b3JkID09IDB4MzAwRSB8fCB3b3JkID09IDB4MzAxMCB8fAorICAgICAgICB3b3JkID09IDB4MzAxMSB8fCB3b3JkID09IDB4MzAxNCB8fCB3b3JkID09IDB4MzAxNSB8fCB3b3JkID09IDB4MzAxNiB8fAorICAgICAgICB3b3JkID09IDB4MzAxNyB8fCB3b3JkID09IDB4MzAxOCB8fCB3b3JkID09IDB4MzAxOSB8fCB3b3JkID09IDB4MzAxQSB8fAorICAgICAgICB3b3JkID09IDB4MzAxQiB8fCB3b3JkID09IDB4MzAxRCB8fCB3b3JkID09IDB4MzAxRSB8fCB3b3JkID09IDB4MzAxRikgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9IGVsc2UgaWYgKHdvcmQgPj0gMHhGRTUwICYmIHdvcmQgPD0gMHhGRTZGKSB7CisgICAgaWYgKCh3b3JkID49IDB4RkU1MCAmJiB3b3JkIDw9IDB4RkU1RSkgfHwgd29yZCA9PSAweEZFNjMpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfSBlbHNlIGlmICh3b3JkID49IDB4RkYwMCAmJiB3b3JkIDw9IDB4RkZFRikgeworICAgIGlmICh3b3JkID09IDB4RkYwMSB8fCB3b3JkID09IDB4RkYwMiB8fCB3b3JkID09IDB4RkYwNyB8fCB3b3JkID09IDB4RkYwOCB8fAorICAgICAgICB3b3JkID09IDB4RkYwOSB8fCB3b3JkID09IDB4RkYwQyB8fCB3b3JkID09IDB4RkYwRSB8fCB3b3JkID09IDB4RkYwRiB8fAorICAgICAgICB3b3JkID09IDB4RkYxQSB8fCB3b3JkID09IDB4RkYxQiB8fCB3b3JkID09IDB4RkYxRiB8fCB3b3JkID09IDB4RkYzQiB8fAorICAgICAgICB3b3JkID09IDB4RkYzRCB8fCB3b3JkID09IDB4RkY0MCB8fCB3b3JkID09IDB4RkY1QiB8fCB3b3JkID09IDB4RkY1QyB8fAorICAgICAgICB3b3JkID09IDB4RkY1RCB8fCB3b3JkID09IDB4RkY2MSB8fCB3b3JkID09IDB4RkY2MiB8fCB3b3JkID09IDB4RkY2MyB8fAorICAgICAgICB3b3JkID09IDB4RkY2NCB8fCB3b3JkID09IDB4RkY2NSB8fCB3b3JkID09IDB4RkY5RSB8fCB3b3JkID09IDB4RkY5RikgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIHJldHVybiBGQUxTRTsKIH0KLXN0YXRpYyBGWF9CT09MIElzQ0pLKEZYX0RXT1JEIHdvcmQpCi17Ci0gICAgaWYgKCh3b3JkID49IDB4MTEwMCAmJiB3b3JkIDw9IDB4MTFGRikgfHwKLSAgICAgICAgICAgICh3b3JkID49IDB4MkU4MCAmJiB3b3JkIDw9IDB4MkZGRikgfHwKLSAgICAgICAgICAgICh3b3JkID49IDB4MzA0MCAmJiB3b3JkIDw9IDB4OUZCRikgfHwKLSAgICAgICAgICAgICh3b3JkID49IDB4QUMwMCAmJiB3b3JkIDw9IDB4RDdBRikgfHwKLSAgICAgICAgICAgICh3b3JkID49IDB4RjkwMCAmJiB3b3JkIDw9IDB4RkFGRikgfHwKLSAgICAgICAgICAgICh3b3JkID49IDB4RkUzMCAmJiB3b3JkIDw9IDB4RkU0RikgfHwKLSAgICAgICAgICAgICh3b3JkID49IDB4MjAwMDAgJiYgd29yZCA8PSAweDJBNkRGKSB8fAotICAgICAgICAgICAgKHdvcmQgPj0gMHgyRjgwMCAmJiB3b3JkIDw9IDB4MkZBMUYpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworc3RhdGljIEZYX0JPT0wgSXNDb25uZWN0aXZlU3ltYm9sKEZYX0RXT1JEIHdvcmQpIHsKKyAgaWYgKHdvcmQgPD0gMHgwMDdGKSB7CisgICAgaWYgKChzcGVjaWFsX2NoYXJzW3dvcmRdID4+IDUpICYgMSkgeworICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIGlmICh3b3JkID49IDB4MzAwMCAmJiB3b3JkIDw9IDB4MzAzRikgewotICAgICAgICBpZiAod29yZCA9PSAweDMwMDUgfHwgd29yZCA9PSAweDMwMDYgfHwgd29yZCA9PSAweDMwMjEgfHwgd29yZCA9PSAweDMwMjIgfHwKLSAgICAgICAgICAgICAgICB3b3JkID09IDB4MzAyMyB8fCB3b3JkID09IDB4MzAyNCB8fCB3b3JkID09IDB4MzAyNSB8fCB3b3JkID09IDB4MzAyNiB8fAotICAgICAgICAgICAgICAgIHdvcmQgPT0gMHgzMDI3IHx8IHdvcmQgPT0gMHgzMDI4IHx8IHdvcmQgPT0gMHgzMDI5IHx8IHdvcmQgPT0gMHgzMDMxIHx8Ci0gICAgICAgICAgICAgICAgd29yZCA9PSAweDMwMzIgfHwgd29yZCA9PSAweDMwMzMgfHwgd29yZCA9PSAweDMwMzQgfHwgd29yZCA9PSAweDMwMzUpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitzdGF0aWMgRlhfQk9PTCBJc09wZW5TdHlsZVB1bmN0dWF0aW9uKEZYX0RXT1JEIHdvcmQpIHsKKyAgaWYgKHdvcmQgPD0gMHgwMDdGKSB7CisgICAgaWYgKChzcGVjaWFsX2NoYXJzW3dvcmRdID4+IDIpICYgMSkgeworICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIGlmICh3b3JkID49IDB4RkY2NiAmJiB3b3JkIDw9IDB4RkY5RCkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9CisgIH0gZWxzZSBpZiAod29yZCA9PSAweDMwMEEgfHwgd29yZCA9PSAweDMwMEMgfHwgd29yZCA9PSAweDMwMEUgfHwKKyAgICAgICAgICAgICB3b3JkID09IDB4MzAxMCB8fCB3b3JkID09IDB4MzAxNCB8fCB3b3JkID09IDB4MzAxNiB8fAorICAgICAgICAgICAgIHdvcmQgPT0gMHgzMDE4IHx8IHdvcmQgPT0gMHgzMDFBIHx8IHdvcmQgPT0gMHhGRjA4IHx8CisgICAgICAgICAgICAgd29yZCA9PSAweEZGM0IgfHwgd29yZCA9PSAweEZGNUIgfHwgd29yZCA9PSAweEZGNjIpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitzdGF0aWMgRlhfQk9PTCBJc0N1cnJlbmN5U3ltYm9sKEZYX1dPUkQgd29yZCkgeworICBpZiAod29yZCA9PSAweDAwMjQgfHwgd29yZCA9PSAweDAwODAgfHwgd29yZCA9PSAweDAwQTIgfHwgd29yZCA9PSAweDAwQTMgfHwKKyAgICAgIHdvcmQgPT0gMHgwMEE0IHx8IHdvcmQgPT0gMHgwMEE1IHx8ICh3b3JkID49IDB4MjBBMCAmJiB3b3JkIDw9IDB4MjBDRikgfHwKKyAgICAgIHdvcmQgPT0gMHhGRTY5IHx8IHdvcmQgPT0gMHhGRjA0IHx8IHdvcmQgPT0gMHhGRkUwIHx8IHdvcmQgPT0gMHhGRkUxIHx8CisgICAgICB3b3JkID09IDB4RkZFNSB8fCB3b3JkID09IDB4RkZFNikgeworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKK30KK3N0YXRpYyBGWF9CT09MIElzUHJlZml4U3ltYm9sKEZYX1dPUkQgd29yZCkgeworICBpZiAoSXNDdXJyZW5jeVN5bWJvbCh3b3JkKSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmICh3b3JkID09IDB4MjExNikgeworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKK30KK3N0YXRpYyBGWF9CT09MIElzU3BhY2UoRlhfV09SRCB3b3JkKSB7CisgIHJldHVybiB3b3JkID09IDB4MDAyMCB8fCB3b3JkID09IDB4MzAwMDsKK30KK3N0YXRpYyBGWF9CT09MIE5lZWREaXZpc2lvbihGWF9XT1JEIHByZXZXb3JkLCBGWF9XT1JEIGN1cldvcmQpIHsKKyAgaWYgKChJc0xhdGluKHByZXZXb3JkKSB8fCBJc0RpZ2l0KHByZXZXb3JkKSkgJiYKKyAgICAgIChJc0xhdGluKGN1cldvcmQpIHx8IElzRGlnaXQoY3VyV29yZCkpKSB7CiAgICAgcmV0dXJuIEZBTFNFOwotfQotc3RhdGljIEZYX0JPT0wgSXNQdW5jdHVhdGlvbihGWF9EV09SRCB3b3JkKQotewotICAgIGlmICh3b3JkIDw9IDB4MDA3RikgewotICAgICAgICBpZiAoKHNwZWNpYWxfY2hhcnNbd29yZF0gPj4gMykgJiAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAod29yZCA+PSAweDAwODAgJiYgd29yZCA8PSAweDAwRkYpIHsKLSAgICAgICAgaWYgKHdvcmQgPT0gMHgwMDgyIHx8IHdvcmQgPT0gMHgwMDg0IHx8IHdvcmQgPT0gMHgwMDg1IHx8IHdvcmQgPT0gMHgwMDkxIHx8Ci0gICAgICAgICAgICAgICAgd29yZCA9PSAweDAwOTIgfHwgd29yZCA9PSAweDAwOTMgfHwgd29yZCA8PSAweDAwOTQgfHwgd29yZCA9PSAweDAwOTYgfHwKLSAgICAgICAgICAgICAgICB3b3JkID09IDB4MDBCNCB8fCB3b3JkID09IDB4MDBCOCkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHdvcmQgPj0gMHgyMDAwICYmIHdvcmQgPD0gMHgyMDZGKSB7Ci0gICAgICAgIGlmICh3b3JkID09IDB4MjAxMCB8fCB3b3JkID09IDB4MjAxMSB8fCB3b3JkID09IDB4MjAxMiB8fCB3b3JkID09IDB4MjAxMyB8fAotICAgICAgICAgICAgICAgIHdvcmQgPT0gMHgyMDE4IHx8IHdvcmQgPT0gMHgyMDE5IHx8IHdvcmQgPT0gMHgyMDFBIHx8IHdvcmQgPT0gMHgyMDFCIHx8Ci0gICAgICAgICAgICAgICAgd29yZCA9PSAweDIwMUMgfHwgd29yZCA9PSAweDIwMUQgfHwgd29yZCA9PSAweDIwMUUgfHwgd29yZCA9PSAweDIwMUYgfHwKLSAgICAgICAgICAgICAgICB3b3JkID09IDB4MjAzMiB8fCB3b3JkID09IDB4MjAzMyB8fCB3b3JkID09IDB4MjAzNCB8fCB3b3JkID09IDB4MjAzNSB8fAotICAgICAgICAgICAgICAgIHdvcmQgPT0gMHgyMDM2IHx8IHdvcmQgPT0gMHgyMDM3IHx8IHdvcmQgPT0gMHgyMDNDIHx8IHdvcmQgPT0gMHgyMDNEIHx8Ci0gICAgICAgICAgICAgICAgd29yZCA9PSAweDIwM0UgfHwgd29yZCA9PSAweDIwNDQpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICh3b3JkID49IDB4MzAwMCAmJiB3b3JkIDw9IDB4MzAzRikgewotICAgICAgICBpZiAod29yZCA9PSAweDMwMDEgfHwgd29yZCA9PSAweDMwMDIgfHwgd29yZCA9PSAweDMwMDMgfHwgd29yZCA9PSAweDMwMDUgfHwKLSAgICAgICAgICAgICAgICB3b3JkID09IDB4MzAwOSB8fCB3b3JkID09IDB4MzAwQSB8fCB3b3JkID09IDB4MzAwQiB8fCB3b3JkID09IDB4MzAwQyB8fAotICAgICAgICAgICAgICAgIHdvcmQgPT0gMHgzMDBEIHx8IHdvcmQgPT0gMHgzMDBGIHx8IHdvcmQgPT0gMHgzMDBFIHx8IHdvcmQgPT0gMHgzMDEwIHx8Ci0gICAgICAgICAgICAgICAgd29yZCA9PSAweDMwMTEgfHwgd29yZCA9PSAweDMwMTQgfHwgd29yZCA9PSAweDMwMTUgfHwgd29yZCA9PSAweDMwMTYgfHwKLSAgICAgICAgICAgICAgICB3b3JkID09IDB4MzAxNyB8fCB3b3JkID09IDB4MzAxOCB8fCB3b3JkID09IDB4MzAxOSB8fCB3b3JkID09IDB4MzAxQSB8fAotICAgICAgICAgICAgICAgIHdvcmQgPT0gMHgzMDFCIHx8IHdvcmQgPT0gMHgzMDFEIHx8IHdvcmQgPT0gMHgzMDFFIHx8IHdvcmQgPT0gMHgzMDFGKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAod29yZCA+PSAweEZFNTAgJiYgd29yZCA8PSAweEZFNkYpIHsKLSAgICAgICAgaWYgKCh3b3JkID49IDB4RkU1MCAmJiB3b3JkIDw9IDB4RkU1RSkgfHwgd29yZCA9PSAweEZFNjMpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICh3b3JkID49IDB4RkYwMCAmJiB3b3JkIDw9IDB4RkZFRikgewotICAgICAgICBpZiAod29yZCA9PSAweEZGMDEgfHwgd29yZCA9PSAweEZGMDIgfHwgd29yZCA9PSAweEZGMDcgfHwgd29yZCA9PSAweEZGMDggfHwKLSAgICAgICAgICAgICAgICB3b3JkID09IDB4RkYwOSB8fCB3b3JkID09IDB4RkYwQyB8fCB3b3JkID09IDB4RkYwRSB8fCB3b3JkID09IDB4RkYwRiB8fAotICAgICAgICAgICAgICAgIHdvcmQgPT0gMHhGRjFBIHx8IHdvcmQgPT0gMHhGRjFCIHx8IHdvcmQgPT0gMHhGRjFGIHx8IHdvcmQgPT0gMHhGRjNCIHx8Ci0gICAgICAgICAgICAgICAgd29yZCA9PSAweEZGM0QgfHwgd29yZCA9PSAweEZGNDAgfHwgd29yZCA9PSAweEZGNUIgfHwgd29yZCA9PSAweEZGNUMgfHwKLSAgICAgICAgICAgICAgICB3b3JkID09IDB4RkY1RCB8fCB3b3JkID09IDB4RkY2MSB8fCB3b3JkID09IDB4RkY2MiB8fCB3b3JkID09IDB4RkY2MyB8fAotICAgICAgICAgICAgICAgIHdvcmQgPT0gMHhGRjY0IHx8IHdvcmQgPT0gMHhGRjY1IHx8IHdvcmQgPT0gMHhGRjlFIHx8IHdvcmQgPT0gMHhGRjlGKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KKyAgfQorICBpZiAoSXNTcGFjZShjdXJXb3JkKSB8fCBJc1B1bmN0dWF0aW9uKGN1cldvcmQpKSB7CiAgICAgcmV0dXJuIEZBTFNFOwotfQotc3RhdGljIEZYX0JPT0wgSXNDb25uZWN0aXZlU3ltYm9sKEZYX0RXT1JEIHdvcmQpCi17Ci0gICAgaWYgKHdvcmQgPD0gMHgwMDdGKSB7Ci0gICAgICAgIGlmICgoc3BlY2lhbF9jaGFyc1t3b3JkXSA+PiA1KSAmIDEpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQorICB9CisgIGlmIChJc0Nvbm5lY3RpdmVTeW1ib2wocHJldldvcmQpIHx8IElzQ29ubmVjdGl2ZVN5bWJvbChjdXJXb3JkKSkgewogICAgIHJldHVybiBGQUxTRTsKLX0KLXN0YXRpYyBGWF9CT09MIElzT3BlblN0eWxlUHVuY3R1YXRpb24oRlhfRFdPUkQgd29yZCkKLXsKLSAgICBpZiAod29yZCA8PSAweDAwN0YpIHsKLSAgICAgICAgaWYgKChzcGVjaWFsX2NoYXJzW3dvcmRdID4+IDIpICYgMSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gMHgzMDBBIHx8IHdvcmQgPT0gMHgzMDBDIHx8IHdvcmQgPT0gMHgzMDBFIHx8IHdvcmQgPT0gMHgzMDEwIHx8Ci0gICAgICAgICAgICAgICB3b3JkID09IDB4MzAxNCB8fCB3b3JkID09IDB4MzAxNiB8fCB3b3JkID09IDB4MzAxOCB8fCB3b3JkID09IDB4MzAxQSB8fAotICAgICAgICAgICAgICAgd29yZCA9PSAweEZGMDggfHwgd29yZCA9PSAweEZGM0IgfHwgd29yZCA9PSAweEZGNUIgfHwgd29yZCA9PSAweEZGNjIpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQorICB9CisgIGlmIChJc1NwYWNlKHByZXZXb3JkKSB8fCBJc1B1bmN0dWF0aW9uKHByZXZXb3JkKSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChJc1ByZWZpeFN5bWJvbChwcmV2V29yZCkpIHsKICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKElzUHJlZml4U3ltYm9sKGN1cldvcmQpIHx8IElzQ0pLKGN1cldvcmQpKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKElzQ0pLKHByZXZXb3JkKSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KLXN0YXRpYyBGWF9CT09MIElzQ3VycmVuY3lTeW1ib2woRlhfV09SRCB3b3JkKQotewotICAgIGlmICh3b3JkID09IDB4MDAyNCB8fCB3b3JkID09IDB4MDA4MCB8fCB3b3JkID09IDB4MDBBMiB8fCB3b3JkID09IDB4MDBBMyB8fAotICAgICAgICAgICAgd29yZCA9PSAweDAwQTQgfHwgd29yZCA9PSAweDAwQTUgfHwgKHdvcmQgPj0gMHgyMEEwICYmIHdvcmQgPD0gMHgyMENGKSB8fAotICAgICAgICAgICAgd29yZCA9PSAweEZFNjkgfHwgd29yZCA9PSAweEZGMDQgfHwgd29yZCA9PSAweEZGRTAgfHwgd29yZCA9PSAweEZGRTEgfHwKLSAgICAgICAgICAgIHdvcmQgPT0gMHhGRkU1IHx8IHdvcmQgPT0gMHhGRkU2KSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci1zdGF0aWMgRlhfQk9PTCBJc1ByZWZpeFN5bWJvbChGWF9XT1JEIHdvcmQpCi17Ci0gICAgaWYgKElzQ3VycmVuY3lTeW1ib2wod29yZCkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmICh3b3JkID09IDB4MjExNikgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotc3RhdGljIEZYX0JPT0wgSXNTcGFjZShGWF9XT1JEIHdvcmQpCi17Ci0gICAgcmV0dXJuICh3b3JkID09IDB4MDAyMCB8fCB3b3JkID09IDB4MzAwMCkgPyBUUlVFIDogRkFMU0U7Ci19Ci1zdGF0aWMgRlhfQk9PTCBOZWVkRGl2aXNpb24oRlhfV09SRCBwcmV2V29yZCwgRlhfV09SRCBjdXJXb3JkKQotewotICAgIGlmICgoSXNMYXRpbihwcmV2V29yZCkgfHwgSXNEaWdpdChwcmV2V29yZCkpICYmIChJc0xhdGluKGN1cldvcmQpIHx8IElzRGlnaXQoY3VyV29yZCkpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9IGVsc2UgaWYgKElzU3BhY2UoY3VyV29yZCkgfHwgSXNQdW5jdHVhdGlvbihjdXJXb3JkKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfSBlbHNlIGlmIChJc0Nvbm5lY3RpdmVTeW1ib2wocHJldldvcmQpIHx8IElzQ29ubmVjdGl2ZVN5bWJvbChjdXJXb3JkKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfSBlbHNlIGlmIChJc1NwYWNlKHByZXZXb3JkKSB8fCBJc1B1bmN0dWF0aW9uKHByZXZXb3JkKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9IGVsc2UgaWYgKElzUHJlZml4U3ltYm9sKHByZXZXb3JkKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfSBlbHNlIGlmIChJc1ByZWZpeFN5bWJvbChjdXJXb3JkKSB8fCBJc0NKSyhjdXJXb3JkKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9IGVsc2UgaWYgKElzQ0pLKHByZXZXb3JkKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotdm9pZCBDVHlwZXNldDo6U3BsaXRMaW5lcyhGWF9CT09MIGJUeXBlc2V0LCBGWF9GTE9BVCBmRm9udFNpemUpCi17Ci0gICAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOwotICAgIEFTU0VSVChtX3BTZWN0aW9uICE9IE5VTEwpOwotICAgIEZYX0lOVDMyIG5MaW5lSGVhZCA9IDA7Ci0gICAgRlhfSU5UMzIgbkxpbmVUYWlsID0gMDsKLSAgICBGWF9GTE9BVCBmTWF4WCA9IDAuMGYsIGZNYXhZID0gMC4wZjsKLSAgICBGWF9GTE9BVCBmTGluZVdpZHRoID0gMC4wZiwgZkJhY2t1cExpbmVXaWR0aCA9IDAuMGY7Ci0gICAgRlhfRkxPQVQgZkxpbmVBc2NlbnQgPSAwLjBmLCBmQmFja3VwTGluZUFzY2VudCA9IDAuMGY7Ci0gICAgRlhfRkxPQVQgZkxpbmVEZXNjZW50ID0gMC4wZiwgZkJhY2t1cExpbmVEZXNjZW50ID0gMC4wZjsKLSAgICBGWF9JTlQzMiBuV29yZFN0YXJ0UG9zID0gMDsKLSAgICBGWF9CT09MIGJGdWxsV29yZCA9IEZBTFNFOwotICAgIEZYX0lOVDMyIG5MaW5lRnVsbFdvcmRJbmRleCA9IDA7Ci0gICAgRlhfSU5UMzIgbkNoYXJJbmRleCA9IDA7Ci0gICAgQ1BWVF9MaW5lSW5mbyBsaW5lOwotICAgIEZYX0ZMT0FUIGZXb3JkV2lkdGggPSAwOwotICAgIEZYX0ZMT0FUIGZUeXBlc2V0V2lkdGggPSBGUERGX01BWChtX3BWVC0+R2V0UGxhdGVXaWR0aCgpIC0gbV9wVlQtPkdldExpbmVJbmRlbnQobV9wU2VjdGlvbi0+bV9TZWNJbmZvKSwgMC4wZik7Ci0gICAgRlhfSU5UMzIgblRvdGFsV29yZHMgPSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCk7Ci0gICAgRlhfQk9PTCBiT3BlbmVkID0gRkFMU0U7Ci0gICAgaWYgKG5Ub3RhbFdvcmRzID4gMCkgewotICAgICAgICBGWF9JTlQzMiBpID0gMDsKLSAgICAgICAgd2hpbGUgKGkgPCBuVG90YWxXb3JkcykgewotICAgICAgICAgICAgQ1BWVF9Xb3JkSW5mbyAqIHBXb3JkID0gbV9wU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0QXQoaSk7Ci0gICAgICAgICAgICBDUFZUX1dvcmRJbmZvKiBwT2xkV29yZCA9IHBXb3JkOwotICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcE9sZFdvcmQgPSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdChpIC0gMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocFdvcmQpIHsKLSAgICAgICAgICAgICAgICBpZiAoYlR5cGVzZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgZkxpbmVBc2NlbnQgPSBGUERGX01BWChmTGluZUFzY2VudCwgbV9wVlQtPkdldFdvcmRBc2NlbnQoKnBXb3JkLCBUUlVFKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZMaW5lRGVzY2VudCA9IEZQREZfTUlOKGZMaW5lRGVzY2VudCwgbV9wVlQtPkdldFdvcmREZXNjZW50KCpwV29yZCwgVFJVRSkpOwotICAgICAgICAgICAgICAgICAgICBmV29yZFdpZHRoID0gbV9wVlQtPkdldFdvcmRXaWR0aCgqcFdvcmQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZMaW5lQXNjZW50ID0gRlBERl9NQVgoZkxpbmVBc2NlbnQsIG1fcFZULT5HZXRXb3JkQXNjZW50KCpwV29yZCwgZkZvbnRTaXplKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZMaW5lRGVzY2VudCA9IEZQREZfTUlOKGZMaW5lRGVzY2VudCwgbV9wVlQtPkdldFdvcmREZXNjZW50KCpwV29yZCwgZkZvbnRTaXplKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZXb3JkV2lkdGggPSBtX3BWVC0+R2V0V29yZFdpZHRoKHBXb3JkLT5uRm9udEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29yZC0+V29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wVlQtPm1fd1N1YldvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFZULT5tX2ZDaGFyU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFZULT5tX25Ib3J6U2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZGb250U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmQtPmZXb3JkVGFpbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghYk9wZW5lZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoSXNPcGVuU3R5bGVQdW5jdHVhdGlvbihwV29yZC0+V29yZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJPcGVuZWQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgYkZ1bGxXb3JkID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwT2xkV29yZCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoTmVlZERpdmlzaW9uKHBPbGRXb3JkLT5Xb3JkLCBwV29yZC0+V29yZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRnVsbFdvcmQgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1NwYWNlKHBXb3JkLT5Xb3JkKSAmJiAhSXNPcGVuU3R5bGVQdW5jdHVhdGlvbihwV29yZC0+V29yZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJPcGVuZWQgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYkZ1bGxXb3JkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJGdWxsV29yZCA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICBpZiAobkNoYXJJbmRleCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5MaW5lRnVsbFdvcmRJbmRleCArKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuV29yZFN0YXJ0UG9zID0gaTsKLSAgICAgICAgICAgICAgICAgICAgZkJhY2t1cExpbmVXaWR0aCA9IGZMaW5lV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIGZCYWNrdXBMaW5lQXNjZW50ID0gZkxpbmVBc2NlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGZCYWNrdXBMaW5lRGVzY2VudCA9IGZMaW5lRGVzY2VudDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbkNoYXJJbmRleCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1fcFZULT5tX2JMaW1pdFdpZHRoICYmIGZUeXBlc2V0V2lkdGggPiAwICYmCi0gICAgICAgICAgICAgICAgICAgIGZMaW5lV2lkdGggKyBmV29yZFdpZHRoID4gZlR5cGVzZXRXaWR0aCkgewotICAgICAgICAgICAgICAgIGlmIChuTGluZUZ1bGxXb3JkSW5kZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGkgPSBuV29yZFN0YXJ0UG9zOwotICAgICAgICAgICAgICAgICAgICBmTGluZVdpZHRoID0gZkJhY2t1cExpbmVXaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgZkxpbmVBc2NlbnQgPSBmQmFja3VwTGluZUFzY2VudDsKLSAgICAgICAgICAgICAgICAgICAgZkxpbmVEZXNjZW50ID0gZkJhY2t1cExpbmVEZXNjZW50OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobkNoYXJJbmRleCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZMaW5lV2lkdGggPSAgZldvcmRXaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuTGluZVRhaWwgPSBpIC0gMTsKLSAgICAgICAgICAgICAgICBpZiAoYlR5cGVzZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZS5uQmVnaW5Xb3JkSW5kZXggPSBuTGluZUhlYWQ7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUubkVuZFdvcmRJbmRleCA9IG5MaW5lVGFpbDsKLSAgICAgICAgICAgICAgICAgICAgbGluZS5uVG90YWxXb3JkID0gbkxpbmVUYWlsIC0gbkxpbmVIZWFkICsgMTsKLSAgICAgICAgICAgICAgICAgICAgbGluZS5mTGluZVdpZHRoID0gZkxpbmVXaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgbGluZS5mTGluZUFzY2VudCA9IGZMaW5lQXNjZW50OwotICAgICAgICAgICAgICAgICAgICBsaW5lLmZMaW5lRGVzY2VudCA9IGZMaW5lRGVzY2VudDsKLSAgICAgICAgICAgICAgICAgICAgbV9wU2VjdGlvbi0+QWRkTGluZShsaW5lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZk1heFkgKz0gKGZMaW5lQXNjZW50ICsgbV9wVlQtPkdldExpbmVMZWFkaW5nKG1fcFNlY3Rpb24tPm1fU2VjSW5mbykpOwotICAgICAgICAgICAgICAgIGZNYXhZICs9ICgtZkxpbmVEZXNjZW50KTsKLSAgICAgICAgICAgICAgICBmTWF4WCA9IEZQREZfTUFYKGZMaW5lV2lkdGgsIGZNYXhYKTsKLSAgICAgICAgICAgICAgICBuTGluZUhlYWQgPSBpOwotICAgICAgICAgICAgICAgIGZMaW5lV2lkdGggPSAwLjBmOwotICAgICAgICAgICAgICAgIGZMaW5lQXNjZW50ID0gMC4wZjsKLSAgICAgICAgICAgICAgICBmTGluZURlc2NlbnQgPSAwLjBmOwotICAgICAgICAgICAgICAgIG5DaGFySW5kZXggPSAwOwotICAgICAgICAgICAgICAgIG5MaW5lRnVsbFdvcmRJbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgYkZ1bGxXb3JkID0gRkFMU0U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZMaW5lV2lkdGggKz0gZldvcmRXaWR0aDsKLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5MaW5lSGVhZCA8PSBuVG90YWxXb3JkcyAtIDEpIHsKLSAgICAgICAgICAgIG5MaW5lVGFpbCA9IG5Ub3RhbFdvcmRzIC0gMTsKLSAgICAgICAgICAgIGlmIChiVHlwZXNldCkgewotICAgICAgICAgICAgICAgIGxpbmUubkJlZ2luV29yZEluZGV4ID0gbkxpbmVIZWFkOwotICAgICAgICAgICAgICAgIGxpbmUubkVuZFdvcmRJbmRleCA9IG5MaW5lVGFpbDsKLSAgICAgICAgICAgICAgICBsaW5lLm5Ub3RhbFdvcmQgPSBuTGluZVRhaWwgLSBuTGluZUhlYWQgKyAxOwotICAgICAgICAgICAgICAgIGxpbmUuZkxpbmVXaWR0aCA9IGZMaW5lV2lkdGg7Ci0gICAgICAgICAgICAgICAgbGluZS5mTGluZUFzY2VudCA9IGZMaW5lQXNjZW50OwotICAgICAgICAgICAgICAgIGxpbmUuZkxpbmVEZXNjZW50ID0gZkxpbmVEZXNjZW50OwotICAgICAgICAgICAgICAgIG1fcFNlY3Rpb24tPkFkZExpbmUobGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmTWF4WSArPSAoZkxpbmVBc2NlbnQgKyBtX3BWVC0+R2V0TGluZUxlYWRpbmcobV9wU2VjdGlvbi0+bV9TZWNJbmZvKSk7Ci0gICAgICAgICAgICBmTWF4WSArPSAoLWZMaW5lRGVzY2VudCk7Ci0gICAgICAgICAgICBmTWF4WCA9IEZQREZfTUFYKGZMaW5lV2lkdGgsIGZNYXhYKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Cit2b2lkIENUeXBlc2V0OjpTcGxpdExpbmVzKEZYX0JPT0wgYlR5cGVzZXQsIEZYX0ZMT0FUIGZGb250U2l6ZSkgeworICBBU1NFUlQobV9wVlQpOworICBBU1NFUlQobV9wU2VjdGlvbik7CisgIGludDMyX3QgbkxpbmVIZWFkID0gMDsKKyAgaW50MzJfdCBuTGluZVRhaWwgPSAwOworICBGWF9GTE9BVCBmTWF4WCA9IDAuMGYsIGZNYXhZID0gMC4wZjsKKyAgRlhfRkxPQVQgZkxpbmVXaWR0aCA9IDAuMGYsIGZCYWNrdXBMaW5lV2lkdGggPSAwLjBmOworICBGWF9GTE9BVCBmTGluZUFzY2VudCA9IDAuMGYsIGZCYWNrdXBMaW5lQXNjZW50ID0gMC4wZjsKKyAgRlhfRkxPQVQgZkxpbmVEZXNjZW50ID0gMC4wZiwgZkJhY2t1cExpbmVEZXNjZW50ID0gMC4wZjsKKyAgaW50MzJfdCBuV29yZFN0YXJ0UG9zID0gMDsKKyAgRlhfQk9PTCBiRnVsbFdvcmQgPSBGQUxTRTsKKyAgaW50MzJfdCBuTGluZUZ1bGxXb3JkSW5kZXggPSAwOworICBpbnQzMl90IG5DaGFySW5kZXggPSAwOworICBDUFZUX0xpbmVJbmZvIGxpbmU7CisgIEZYX0ZMT0FUIGZXb3JkV2lkdGggPSAwOworICBGWF9GTE9BVCBmVHlwZXNldFdpZHRoID0gc3RkOjptYXgoCisgICAgICBtX3BWVC0+R2V0UGxhdGVXaWR0aCgpIC0gbV9wVlQtPkdldExpbmVJbmRlbnQobV9wU2VjdGlvbi0+bV9TZWNJbmZvKSwKKyAgICAgIDAuMGYpOworICBpbnQzMl90IG5Ub3RhbFdvcmRzID0gbV9wU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpOworICBGWF9CT09MIGJPcGVuZWQgPSBGQUxTRTsKKyAgaWYgKG5Ub3RhbFdvcmRzID4gMCkgeworICAgIGludDMyX3QgaSA9IDA7CisgICAgd2hpbGUgKGkgPCBuVG90YWxXb3JkcykgeworICAgICAgQ1BWVF9Xb3JkSW5mbyogcFdvcmQgPSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdChpKTsKKyAgICAgIENQVlRfV29yZEluZm8qIHBPbGRXb3JkID0gcFdvcmQ7CisgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgcE9sZFdvcmQgPSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdChpIC0gMSk7CisgICAgICB9CisgICAgICBpZiAocFdvcmQpIHsKICAgICAgICAgaWYgKGJUeXBlc2V0KSB7Ci0gICAgICAgICAgICBmTGluZUFzY2VudCA9IG1fcFZULT5HZXRMaW5lQXNjZW50KG1fcFNlY3Rpb24tPm1fU2VjSW5mbyk7Ci0gICAgICAgICAgICBmTGluZURlc2NlbnQgPSBtX3BWVC0+R2V0TGluZURlc2NlbnQobV9wU2VjdGlvbi0+bV9TZWNJbmZvKTsKKyAgICAgICAgICBmTGluZUFzY2VudCA9CisgICAgICAgICAgICAgIHN0ZDo6bWF4KGZMaW5lQXNjZW50LCBtX3BWVC0+R2V0V29yZEFzY2VudCgqcFdvcmQsIFRSVUUpKTsKKyAgICAgICAgICBmTGluZURlc2NlbnQgPQorICAgICAgICAgICAgICBzdGQ6Om1pbihmTGluZURlc2NlbnQsIG1fcFZULT5HZXRXb3JkRGVzY2VudCgqcFdvcmQsIFRSVUUpKTsKKyAgICAgICAgICBmV29yZFdpZHRoID0gbV9wVlQtPkdldFdvcmRXaWR0aCgqcFdvcmQpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZkxpbmVBc2NlbnQgPSBtX3BWVC0+R2V0Rm9udEFzY2VudChtX3BWVC0+R2V0RGVmYXVsdEZvbnRJbmRleCgpLCBmRm9udFNpemUpOwotICAgICAgICAgICAgZkxpbmVEZXNjZW50ID0gbV9wVlQtPkdldEZvbnREZXNjZW50KG1fcFZULT5HZXREZWZhdWx0Rm9udEluZGV4KCksIGZGb250U2l6ZSk7CisgICAgICAgICAgZkxpbmVBc2NlbnQgPQorICAgICAgICAgICAgICBzdGQ6Om1heChmTGluZUFzY2VudCwgbV9wVlQtPkdldFdvcmRBc2NlbnQoKnBXb3JkLCBmRm9udFNpemUpKTsKKyAgICAgICAgICBmTGluZURlc2NlbnQgPQorICAgICAgICAgICAgICBzdGQ6Om1pbihmTGluZURlc2NlbnQsIG1fcFZULT5HZXRXb3JkRGVzY2VudCgqcFdvcmQsIGZGb250U2l6ZSkpOworICAgICAgICAgIGZXb3JkV2lkdGggPSBtX3BWVC0+R2V0V29yZFdpZHRoKAorICAgICAgICAgICAgICBwV29yZC0+bkZvbnRJbmRleCwgcFdvcmQtPldvcmQsIG1fcFZULT5tX3dTdWJXb3JkLAorICAgICAgICAgICAgICBtX3BWVC0+bV9mQ2hhclNwYWNlLCBtX3BWVC0+bV9uSG9yelNjYWxlLCBmRm9udFNpemUsCisgICAgICAgICAgICAgIHBXb3JkLT5mV29yZFRhaWwsIDApOwogICAgICAgICB9CisgICAgICAgIGlmICghYk9wZW5lZCkgeworICAgICAgICAgIGlmIChJc09wZW5TdHlsZVB1bmN0dWF0aW9uKHBXb3JkLT5Xb3JkKSkgeworICAgICAgICAgICAgYk9wZW5lZCA9IFRSVUU7CisgICAgICAgICAgICBiRnVsbFdvcmQgPSBUUlVFOworICAgICAgICAgIH0gZWxzZSBpZiAocE9sZFdvcmQpIHsKKyAgICAgICAgICAgIGlmIChOZWVkRGl2aXNpb24ocE9sZFdvcmQtPldvcmQsIHBXb3JkLT5Xb3JkKSkgeworICAgICAgICAgICAgICBiRnVsbFdvcmQgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoIUlzU3BhY2UocFdvcmQtPldvcmQpICYmICFJc09wZW5TdHlsZVB1bmN0dWF0aW9uKHBXb3JkLT5Xb3JkKSkgeworICAgICAgICAgICAgYk9wZW5lZCA9IEZBTFNFOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYkZ1bGxXb3JkKSB7CisgICAgICAgICAgYkZ1bGxXb3JkID0gRkFMU0U7CisgICAgICAgICAgaWYgKG5DaGFySW5kZXggPiAwKSB7CisgICAgICAgICAgICBuTGluZUZ1bGxXb3JkSW5kZXgrKzsKKyAgICAgICAgICB9CisgICAgICAgICAgbldvcmRTdGFydFBvcyA9IGk7CisgICAgICAgICAgZkJhY2t1cExpbmVXaWR0aCA9IGZMaW5lV2lkdGg7CisgICAgICAgICAgZkJhY2t1cExpbmVBc2NlbnQgPSBmTGluZUFzY2VudDsKKyAgICAgICAgICBmQmFja3VwTGluZURlc2NlbnQgPSBmTGluZURlc2NlbnQ7CisgICAgICAgIH0KKyAgICAgICAgbkNoYXJJbmRleCsrOworICAgICAgfQorICAgICAgaWYgKG1fcFZULT5tX2JMaW1pdFdpZHRoICYmIGZUeXBlc2V0V2lkdGggPiAwICYmCisgICAgICAgICAgZkxpbmVXaWR0aCArIGZXb3JkV2lkdGggPiBmVHlwZXNldFdpZHRoKSB7CisgICAgICAgIGlmIChuTGluZUZ1bGxXb3JkSW5kZXggPiAwKSB7CisgICAgICAgICAgaSA9IG5Xb3JkU3RhcnRQb3M7CisgICAgICAgICAgZkxpbmVXaWR0aCA9IGZCYWNrdXBMaW5lV2lkdGg7CisgICAgICAgICAgZkxpbmVBc2NlbnQgPSBmQmFja3VwTGluZUFzY2VudDsKKyAgICAgICAgICBmTGluZURlc2NlbnQgPSBmQmFja3VwTGluZURlc2NlbnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5DaGFySW5kZXggPT0gMSkgeworICAgICAgICAgIGZMaW5lV2lkdGggPSBmV29yZFdpZHRoOworICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgICAgICBuTGluZVRhaWwgPSBpIC0gMTsKICAgICAgICAgaWYgKGJUeXBlc2V0KSB7Ci0gICAgICAgICAgICBsaW5lLm5CZWdpbldvcmRJbmRleCA9IC0xOwotICAgICAgICAgICAgbGluZS5uRW5kV29yZEluZGV4ID0gLTE7Ci0gICAgICAgICAgICBsaW5lLm5Ub3RhbFdvcmQgPSAwOwotICAgICAgICAgICAgbGluZS5mTGluZVdpZHRoID0gMDsKLSAgICAgICAgICAgIGxpbmUuZkxpbmVBc2NlbnQgPSBmTGluZUFzY2VudDsKLSAgICAgICAgICAgIGxpbmUuZkxpbmVEZXNjZW50ID0gZkxpbmVEZXNjZW50OwotICAgICAgICAgICAgbV9wU2VjdGlvbi0+QWRkTGluZShsaW5lKTsKKyAgICAgICAgICBsaW5lLm5CZWdpbldvcmRJbmRleCA9IG5MaW5lSGVhZDsKKyAgICAgICAgICBsaW5lLm5FbmRXb3JkSW5kZXggPSBuTGluZVRhaWw7CisgICAgICAgICAgbGluZS5uVG90YWxXb3JkID0gbkxpbmVUYWlsIC0gbkxpbmVIZWFkICsgMTsKKyAgICAgICAgICBsaW5lLmZMaW5lV2lkdGggPSBmTGluZVdpZHRoOworICAgICAgICAgIGxpbmUuZkxpbmVBc2NlbnQgPSBmTGluZUFzY2VudDsKKyAgICAgICAgICBsaW5lLmZMaW5lRGVzY2VudCA9IGZMaW5lRGVzY2VudDsKKyAgICAgICAgICBtX3BTZWN0aW9uLT5BZGRMaW5lKGxpbmUpOwogICAgICAgICB9Ci0gICAgICAgIGZNYXhZICs9IChtX3BWVC0+R2V0TGluZUxlYWRpbmcobV9wU2VjdGlvbi0+bV9TZWNJbmZvKSArIGZMaW5lQXNjZW50ICsgKC1mTGluZURlc2NlbnQpKTsKKyAgICAgICAgZk1heFkgKz0gKGZMaW5lQXNjZW50ICsgbV9wVlQtPkdldExpbmVMZWFkaW5nKG1fcFNlY3Rpb24tPm1fU2VjSW5mbykpOworICAgICAgICBmTWF4WSArPSAoLWZMaW5lRGVzY2VudCk7CisgICAgICAgIGZNYXhYID0gc3RkOjptYXgoZkxpbmVXaWR0aCwgZk1heFgpOworICAgICAgICBuTGluZUhlYWQgPSBpOworICAgICAgICBmTGluZVdpZHRoID0gMC4wZjsKKyAgICAgICAgZkxpbmVBc2NlbnQgPSAwLjBmOworICAgICAgICBmTGluZURlc2NlbnQgPSAwLjBmOworICAgICAgICBuQ2hhckluZGV4ID0gMDsKKyAgICAgICAgbkxpbmVGdWxsV29yZEluZGV4ID0gMDsKKyAgICAgICAgYkZ1bGxXb3JkID0gRkFMU0U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmTGluZVdpZHRoICs9IGZXb3JkV2lkdGg7CisgICAgICAgIGkrKzsKKyAgICAgIH0KICAgICB9Ci0gICAgbV9yY1JldCA9IENQVlRfRmxvYXRSZWN0KDAsIDAsIGZNYXhYLCBmTWF4WSk7Ci19Ci12b2lkIENUeXBlc2V0OjpPdXRwdXRMaW5lcygpCi17Ci0gICAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOwotICAgIEFTU0VSVChtX3BTZWN0aW9uICE9IE5VTEwpOwotICAgIEZYX0ZMT0FUIGZNaW5YID0gMC4wZiwgZk1pblkgPSAwLjBmLCBmTWF4WCA9IDAuMGYsIGZNYXhZID0gMC4wZjsKLSAgICBGWF9GTE9BVCBmUG9zWCA9IDAuMGYsIGZQb3NZID0gMC4wZjsKLSAgICBGWF9GTE9BVCBmTGluZUluZGVudCA9IG1fcFZULT5HZXRMaW5lSW5kZW50KG1fcFNlY3Rpb24tPm1fU2VjSW5mbyk7Ci0gICAgRlhfRkxPQVQgZlR5cGVzZXRXaWR0aCA9IEZQREZfTUFYKG1fcFZULT5HZXRQbGF0ZVdpZHRoKCkgLSBmTGluZUluZGVudCwgMC4wZik7Ci0gICAgc3dpdGNoIChtX3BWVC0+R2V0QWxpZ25tZW50KG1fcFNlY3Rpb24tPm1fU2VjSW5mbykpIHsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgZk1pblggPSAwLjBmOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGZNaW5YID0gKGZUeXBlc2V0V2lkdGggLSBtX3JjUmV0LldpZHRoKCkpICAqIFBWVF9IQUxGOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGZNaW5YID0gZlR5cGVzZXRXaWR0aCAtIG1fcmNSZXQuV2lkdGgoKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChuTGluZUhlYWQgPD0gblRvdGFsV29yZHMgLSAxKSB7CisgICAgICBuTGluZVRhaWwgPSBuVG90YWxXb3JkcyAtIDE7CisgICAgICBpZiAoYlR5cGVzZXQpIHsKKyAgICAgICAgbGluZS5uQmVnaW5Xb3JkSW5kZXggPSBuTGluZUhlYWQ7CisgICAgICAgIGxpbmUubkVuZFdvcmRJbmRleCA9IG5MaW5lVGFpbDsKKyAgICAgICAgbGluZS5uVG90YWxXb3JkID0gbkxpbmVUYWlsIC0gbkxpbmVIZWFkICsgMTsKKyAgICAgICAgbGluZS5mTGluZVdpZHRoID0gZkxpbmVXaWR0aDsKKyAgICAgICAgbGluZS5mTGluZUFzY2VudCA9IGZMaW5lQXNjZW50OworICAgICAgICBsaW5lLmZMaW5lRGVzY2VudCA9IGZMaW5lRGVzY2VudDsKKyAgICAgICAgbV9wU2VjdGlvbi0+QWRkTGluZShsaW5lKTsKKyAgICAgIH0KKyAgICAgIGZNYXhZICs9IChmTGluZUFzY2VudCArIG1fcFZULT5HZXRMaW5lTGVhZGluZyhtX3BTZWN0aW9uLT5tX1NlY0luZm8pKTsKKyAgICAgIGZNYXhZICs9ICgtZkxpbmVEZXNjZW50KTsKKyAgICAgIGZNYXhYID0gc3RkOjptYXgoZkxpbmVXaWR0aCwgZk1heFgpOwogICAgIH0KLSAgICBmTWF4WCA9IGZNaW5YICsgbV9yY1JldC5XaWR0aCgpOwotICAgIGZNaW5ZID0gMC4wZjsKLSAgICBmTWF4WSA9IG1fcmNSZXQuSGVpZ2h0KCk7Ci0gICAgRlhfSU5UMzIgblRvdGFsTGluZXMgPSBtX3BTZWN0aW9uLT5tX0xpbmVBcnJheS5HZXRTaXplKCk7Ci0gICAgaWYgKG5Ub3RhbExpbmVzID4gMCkgewotICAgICAgICBtX3BTZWN0aW9uLT5tX1NlY0luZm8ublRvdGFsTGluZSA9IG5Ub3RhbExpbmVzOwotICAgICAgICBmb3IgKEZYX0lOVDMyIGwgPSAwOyBsIDwgblRvdGFsTGluZXM7IGwrKykgewotICAgICAgICAgICAgaWYgKENMaW5lICogcExpbmUgPSBtX3BTZWN0aW9uLT5tX0xpbmVBcnJheS5HZXRBdChsKSkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAobV9wVlQtPkdldEFsaWdubWVudChtX3BTZWN0aW9uLT5tX1NlY0luZm8pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGZQb3NYID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgICAgICBmUG9zWCA9IChmVHlwZXNldFdpZHRoIC0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVXaWR0aCkgKiBQVlRfSEFMRjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBmUG9zWCA9IGZUeXBlc2V0V2lkdGggLSBwTGluZS0+bV9MaW5lSW5mby5mTGluZVdpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZQb3NYICs9IGZMaW5lSW5kZW50OwotICAgICAgICAgICAgICAgIGZQb3NZICs9IG1fcFZULT5HZXRMaW5lTGVhZGluZyhtX3BTZWN0aW9uLT5tX1NlY0luZm8pOwotICAgICAgICAgICAgICAgIGZQb3NZICs9IHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lQXNjZW50OwotICAgICAgICAgICAgICAgIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWCA9IGZQb3NYIC0gZk1pblg7Ci0gICAgICAgICAgICAgICAgcExpbmUtPm1fTGluZUluZm8uZkxpbmVZID0gZlBvc1kgLSBmTWluWTsKLSAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIHcgPSBwTGluZS0+bV9MaW5lSW5mby5uQmVnaW5Xb3JkSW5kZXg7IHcgPD0gcExpbmUtPm1fTGluZUluZm8ubkVuZFdvcmRJbmRleDsgdysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChDUFZUX1dvcmRJbmZvICogcFdvcmQgPSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdCh3KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmQtPmZXb3JkWCA9IGZQb3NYIC0gZk1pblg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocFdvcmQtPnBXb3JkUHJvcHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBXb3JkLT5wV29yZFByb3BzLT5uU2NyaXB0VHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBWVFdPUkRfU0NSSVBUX05PUk1BTDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JkLT5mV29yZFkgPSBmUG9zWSAtIGZNaW5ZOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUFZUV09SRF9TQ1JJUFRfU1VQRVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29yZC0+ZldvcmRZID0gZlBvc1kgLSBtX3BWVC0+R2V0V29yZEFzY2VudCgqcFdvcmQpIC0gZk1pblk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQVlRXT1JEX1NDUklQVF9TVUI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29yZC0+ZldvcmRZID0gZlBvc1kgLSBtX3BWVC0+R2V0V29yZERlc2NlbnQoKnBXb3JkKSAtIGZNaW5ZOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29yZC0+ZldvcmRZID0gZlBvc1kgLSBmTWluWTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZQb3NYICs9IG1fcFZULT5HZXRXb3JkV2lkdGgoKnBXb3JkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmUG9zWSArPSAoLXBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lRGVzY2VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9yY1JldCA9IENQVlRfRmxvYXRSZWN0KGZNaW5YLCBmTWluWSwgZk1heFgsIGZNYXhZKTsKLX0KLUNQREZfVmFyaWFibGVUZXh0OjpDUERGX1ZhcmlhYmxlVGV4dCgpIDoKLSAgICBtX25MaW1pdENoYXIoMCksCi0gICAgbV9uQ2hhckFycmF5KDApLAotICAgIG1fYk11bHRpTGluZShGQUxTRSksCi0gICAgbV9iTGltaXRXaWR0aChGQUxTRSksCi0gICAgbV9iQXV0b0ZvbnRTaXplKEZBTFNFKSwKLSAgICBtX25BbGlnbm1lbnQoMCksCi0gICAgbV9mTGluZUxlYWRpbmcoMC4wZiksCi0gICAgbV9mQ2hhclNwYWNlKDAuMGYpLAotICAgIG1fbkhvcnpTY2FsZSgxMDApLAotICAgIG1fd1N1YldvcmQoMCksCi0gICAgbV9mRm9udFNpemUoMC4wZiksCi0gICAgbV9iSW5pdGlhbChGQUxTRSksCi0gICAgbV9iUmljaFRleHQoRkFMU0UpLAotICAgIG1fcFZUUHJvdmlkZXIoTlVMTCksCi0gICAgbV9wVlRJdGVyYXRvcihOVUxMKQotewotfQotQ1BERl9WYXJpYWJsZVRleHQ6On5DUERGX1ZhcmlhYmxlVGV4dCgpCi17Ci0gICAgaWYgKG1fcFZUSXRlcmF0b3IpIHsKLSAgICAgICAgZGVsZXRlIG1fcFZUSXRlcmF0b3I7Ci0gICAgICAgIG1fcFZUSXRlcmF0b3IgPSBOVUxMOwotICAgIH0KLSAgICBSZXNldEFsbCgpOwotfQotdm9pZCBDUERGX1ZhcmlhYmxlVGV4dDo6SW5pdGlhbGl6ZSgpCi17Ci0gICAgaWYgKCFtX2JJbml0aWFsKSB7Ci0gICAgICAgIENQVlRfU2VjdGlvbkluZm8gc2VjaW5mbzsKLSAgICAgICAgaWYgKG1fYlJpY2hUZXh0KSB7Ci0gICAgICAgICAgICBzZWNpbmZvLnBTZWNQcm9wcyA9IG5ldyBDUFZUX1NlY1Byb3BzKDAuMGYsIDAuMGYsIDApOwotICAgICAgICAgICAgc2VjaW5mby5wV29yZFByb3BzID0gbmV3IENQVlRfV29yZFByb3BzKEdldERlZmF1bHRGb250SW5kZXgoKSwgUFZUX0RFRkFVTFRfRk9OVFNJWkUsIDAsIDAsIDApOwotICAgICAgICB9Ci0gICAgICAgIENQVlRfV29yZFBsYWNlIHBsYWNlOwotICAgICAgICBwbGFjZS5uU2VjSW5kZXggPSAwOwotICAgICAgICBBZGRTZWN0aW9uKHBsYWNlLCBzZWNpbmZvKTsKLSAgICAgICAgQ1BWVF9MaW5lSW5mbyBsaW5laW5mbzsKLSAgICAgICAgbGluZWluZm8uZkxpbmVBc2NlbnQgPSBHZXRGb250QXNjZW50KEdldERlZmF1bHRGb250SW5kZXgoKSwgR2V0Rm9udFNpemUoKSk7Ci0gICAgICAgIGxpbmVpbmZvLmZMaW5lRGVzY2VudCA9IEdldEZvbnREZXNjZW50KEdldERlZmF1bHRGb250SW5kZXgoKSwgR2V0Rm9udFNpemUoKSk7Ci0gICAgICAgIEFkZExpbmUocGxhY2UsIGxpbmVpbmZvKTsKLSAgICAgICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdCgwKSkgewotICAgICAgICAgICAgcFNlY3Rpb24tPlJlc2V0TGluZVBsYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9iSW5pdGlhbCA9IFRSVUU7Ci0gICAgfQotfQotdm9pZCBDUERGX1ZhcmlhYmxlVGV4dDo6UmVzZXRBbGwoKQotewotICAgIG1fYkluaXRpYWwgPSBGQUxTRTsKLSAgICBSZXNldFNlY3Rpb25BcnJheSgpOwotfQotQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6Okluc2VydFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgRlhfV09SRCB3b3JkLCBGWF9JTlQzMiBjaGFyc2V0LAotICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMpCi17Ci0gICAgRlhfSU5UMzIgblRvdGxhV29yZHMgPSB0aGlzLT5HZXRUb3RhbFdvcmRzKCk7Ci0gICAgaWYgKG1fbkxpbWl0Q2hhciA+IDAgJiYgblRvdGxhV29yZHMgPj0gbV9uTGltaXRDaGFyKSB7Ci0gICAgICAgIHJldHVybiBwbGFjZTsKLSAgICB9Ci0gICAgaWYgKG1fbkNoYXJBcnJheSA+IDAgJiYgblRvdGxhV29yZHMgPj0gbV9uQ2hhckFycmF5KSB7Ci0gICAgICAgIHJldHVybiBwbGFjZTsKLSAgICB9Ci0gICAgQ1BWVF9Xb3JkUGxhY2UgbmV3cGxhY2UgPSBwbGFjZTsKLSAgICBuZXdwbGFjZS5uV29yZEluZGV4ICsrOwotICAgIGlmIChtX2JSaWNoVGV4dCkgewotICAgICAgICBDUFZUX1dvcmRQcm9wcyAqIHBOZXdQcm9wcyA9IHBXb3JkUHJvcHMgPyBuZXcgQ1BWVF9Xb3JkUHJvcHMoKnBXb3JkUHJvcHMpIDogbmV3IENQVlRfV29yZFByb3BzKCk7Ci0gICAgICAgIHBOZXdQcm9wcy0+bkZvbnRJbmRleCA9IEdldFdvcmRGb250SW5kZXgod29yZCwgY2hhcnNldCwgcFdvcmRQcm9wcy0+bkZvbnRJbmRleCk7Ci0gICAgICAgIHJldHVybiBBZGRXb3JkKG5ld3BsYWNlLCBDUFZUX1dvcmRJbmZvKHdvcmQsIGNoYXJzZXQsIC0xLCBwTmV3UHJvcHMpKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoYlR5cGVzZXQpIHsKKyAgICAgIGZMaW5lQXNjZW50ID0gbV9wVlQtPkdldExpbmVBc2NlbnQobV9wU2VjdGlvbi0+bV9TZWNJbmZvKTsKKyAgICAgIGZMaW5lRGVzY2VudCA9IG1fcFZULT5HZXRMaW5lRGVzY2VudChtX3BTZWN0aW9uLT5tX1NlY0luZm8pOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYX0lOVDMyIG5Gb250SW5kZXggPSBHZXRTdWJXb3JkKCkgPiAwID8gR2V0RGVmYXVsdEZvbnRJbmRleCgpIDogR2V0V29yZEZvbnRJbmRleCh3b3JkLCBjaGFyc2V0LCBHZXREZWZhdWx0Rm9udEluZGV4KCkpOwotICAgICAgICByZXR1cm4gQWRkV29yZChuZXdwbGFjZSwgQ1BWVF9Xb3JkSW5mbyh3b3JkLCBjaGFyc2V0LCBuRm9udEluZGV4LCBOVUxMKSk7CisgICAgICBmTGluZUFzY2VudCA9CisgICAgICAgICAgbV9wVlQtPkdldEZvbnRBc2NlbnQobV9wVlQtPkdldERlZmF1bHRGb250SW5kZXgoKSwgZkZvbnRTaXplKTsKKyAgICAgIGZMaW5lRGVzY2VudCA9CisgICAgICAgICAgbV9wVlQtPkdldEZvbnREZXNjZW50KG1fcFZULT5HZXREZWZhdWx0Rm9udEluZGV4KCksIGZGb250U2l6ZSk7CiAgICAgfQotICAgIHJldHVybiBwbGFjZTsKKyAgICBpZiAoYlR5cGVzZXQpIHsKKyAgICAgIGxpbmUubkJlZ2luV29yZEluZGV4ID0gLTE7CisgICAgICBsaW5lLm5FbmRXb3JkSW5kZXggPSAtMTsKKyAgICAgIGxpbmUublRvdGFsV29yZCA9IDA7CisgICAgICBsaW5lLmZMaW5lV2lkdGggPSAwOworICAgICAgbGluZS5mTGluZUFzY2VudCA9IGZMaW5lQXNjZW50OworICAgICAgbGluZS5mTGluZURlc2NlbnQgPSBmTGluZURlc2NlbnQ7CisgICAgICBtX3BTZWN0aW9uLT5BZGRMaW5lKGxpbmUpOworICAgIH0KKyAgICBmTWF4WSArPSAobV9wVlQtPkdldExpbmVMZWFkaW5nKG1fcFNlY3Rpb24tPm1fU2VjSW5mbykgKyBmTGluZUFzY2VudCArCisgICAgICAgICAgICAgICgtZkxpbmVEZXNjZW50KSk7CisgIH0KKyAgbV9yY1JldCA9IENQVlRfRmxvYXRSZWN0KDAsIDAsIGZNYXhYLCBmTWF4WSk7CiB9Ci1DUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6SW5zZXJ0U2VjdGlvbihjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLAotICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMpCi17Ci0gICAgRlhfSU5UMzIgblRvdGxhV29yZHMgPSB0aGlzLT5HZXRUb3RhbFdvcmRzKCk7Ci0gICAgaWYgKG1fbkxpbWl0Q2hhciA+IDAgJiYgblRvdGxhV29yZHMgPj0gbV9uTGltaXRDaGFyKSB7Ci0gICAgICAgIHJldHVybiBwbGFjZTsKLSAgICB9Ci0gICAgaWYgKG1fbkNoYXJBcnJheSA+IDAgJiYgblRvdGxhV29yZHMgPj0gbV9uQ2hhckFycmF5KSB7Ci0gICAgICAgIHJldHVybiBwbGFjZTsKLSAgICB9Ci0gICAgaWYgKCFtX2JNdWx0aUxpbmUpIHsKLSAgICAgICAgcmV0dXJuIHBsYWNlOwotICAgIH0KLSAgICBDUFZUX1dvcmRQbGFjZSB3b3JkcGxhY2UgPSBwbGFjZTsKLSAgICBVcGRhdGVXb3JkUGxhY2Uod29yZHBsYWNlKTsKLSAgICBDUFZUX1dvcmRQbGFjZSBuZXdwbGFjZSA9IHBsYWNlOwotICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQod29yZHBsYWNlLm5TZWNJbmRleCkpIHsKLSAgICAgICAgQ1BWVF9Xb3JkUGxhY2UgTmV3UGxhY2Uod29yZHBsYWNlLm5TZWNJbmRleCArIDEsIDAsIC0xKTsKLSAgICAgICAgQ1BWVF9TZWN0aW9uSW5mbyBzZWNpbmZvOwotICAgICAgICBpZiAobV9iUmljaFRleHQpIHsKLSAgICAgICAgICAgIGlmIChwU2VjUHJvcHMpIHsKLSAgICAgICAgICAgICAgICBzZWNpbmZvLnBTZWNQcm9wcyA9IG5ldyBDUFZUX1NlY1Byb3BzKCpwU2VjUHJvcHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBXb3JkUHJvcHMpIHsKLSAgICAgICAgICAgICAgICBzZWNpbmZvLnBXb3JkUHJvcHMgPSBuZXcgQ1BWVF9Xb3JkUHJvcHMoKnBXb3JkUHJvcHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEFkZFNlY3Rpb24oTmV3UGxhY2UsIHNlY2luZm8pOwotICAgICAgICBuZXdwbGFjZSA9IE5ld1BsYWNlOwotICAgICAgICBpZiAoQ1NlY3Rpb24gKiBwTmV3U2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KE5ld1BsYWNlLm5TZWNJbmRleCkpIHsKLSAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgdyA9IHdvcmRwbGFjZS5uV29yZEluZGV4ICsgMSwgc3ogPSBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpOyB3IDwgc3o7IHcrKykgewotICAgICAgICAgICAgICAgIGlmIChDUFZUX1dvcmRJbmZvICogcFdvcmQgPSBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0QXQodykpIHsKLSAgICAgICAgICAgICAgICAgICAgTmV3UGxhY2UubldvcmRJbmRleCsrOwotICAgICAgICAgICAgICAgICAgICBwTmV3U2VjdGlvbi0+QWRkV29yZChOZXdQbGFjZSwgKnBXb3JkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQ2xlYXJTZWN0aW9uUmlnaHRXb3Jkcyh3b3JkcGxhY2UpOwotICAgIH0KLSAgICByZXR1cm4gbmV3cGxhY2U7Ci19Ci1DUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6SW5zZXJ0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBGWF9MUENXU1RSIHRleHQsIEZYX0lOVDMyIGNoYXJzZXQsCi0gICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFByb3BzKQotewotICAgIENGWF9XaWRlU3RyaW5nIHN3VGV4dCA9IHRleHQ7Ci0gICAgQ1BWVF9Xb3JkUGxhY2Ugd3AgPSBwbGFjZTsKLSAgICBmb3IgKEZYX0lOVDMyIGkgPSAwLCBzeiA9IHN3VGV4dC5HZXRMZW5ndGgoKTsgaSA8IHN6OyBpKyspIHsKLSAgICAgICAgQ1BWVF9Xb3JkUGxhY2Ugb2xkd3AgPSB3cDsKLSAgICAgICAgRlhfV09SRCB3b3JkID0gc3dUZXh0LkdldEF0KGkpOwotICAgICAgICBzd2l0Y2ggKHdvcmQpIHsKLSAgICAgICAgICAgIGNhc2UgMHgwRDoKLSAgICAgICAgICAgICAgICBpZiAobV9iTXVsdGlMaW5lKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzd1RleHQuR2V0QXQoaSArIDEpID09IDB4MEEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB3cCA9IEluc2VydFNlY3Rpb24od3AsIHBTZWNQcm9wcywgcFByb3BzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDB4MEE6Ci0gICAgICAgICAgICAgICAgaWYgKG1fYk11bHRpTGluZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3dUZXh0LkdldEF0KGkgKyAxKSA9PSAweDBEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd3AgPSBJbnNlcnRTZWN0aW9uKHdwLCBwU2VjUHJvcHMsIHBQcm9wcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAweDA5OgotICAgICAgICAgICAgICAgIHdvcmQgPSAweDIwOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB3cCA9IEluc2VydFdvcmQod3AsIHdvcmQsIGNoYXJzZXQsIHBQcm9wcyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdwID09IG9sZHdwKSB7Cit2b2lkIENUeXBlc2V0OjpPdXRwdXRMaW5lcygpIHsKKyAgQVNTRVJUKG1fcFZUKTsKKyAgQVNTRVJUKG1fcFNlY3Rpb24pOworICBGWF9GTE9BVCBmTWluWCA9IDAuMGYsIGZNaW5ZID0gMC4wZiwgZk1heFggPSAwLjBmLCBmTWF4WSA9IDAuMGY7CisgIEZYX0ZMT0FUIGZQb3NYID0gMC4wZiwgZlBvc1kgPSAwLjBmOworICBGWF9GTE9BVCBmTGluZUluZGVudCA9IG1fcFZULT5HZXRMaW5lSW5kZW50KG1fcFNlY3Rpb24tPm1fU2VjSW5mbyk7CisgIEZYX0ZMT0FUIGZUeXBlc2V0V2lkdGggPSBzdGQ6Om1heChtX3BWVC0+R2V0UGxhdGVXaWR0aCgpIC0gZkxpbmVJbmRlbnQsIDAuMGYpOworICBzd2l0Y2ggKG1fcFZULT5HZXRBbGlnbm1lbnQobV9wU2VjdGlvbi0+bV9TZWNJbmZvKSkgeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSAwOgorICAgICAgZk1pblggPSAwLjBmOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgZk1pblggPSAoZlR5cGVzZXRXaWR0aCAtIG1fcmNSZXQuV2lkdGgoKSkgKiBQVlRfSEFMRjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIGZNaW5YID0gZlR5cGVzZXRXaWR0aCAtIG1fcmNSZXQuV2lkdGgoKTsKKyAgICAgIGJyZWFrOworICB9CisgIGZNYXhYID0gZk1pblggKyBtX3JjUmV0LldpZHRoKCk7CisgIGZNaW5ZID0gMC4wZjsKKyAgZk1heFkgPSBtX3JjUmV0LkhlaWdodCgpOworICBpbnQzMl90IG5Ub3RhbExpbmVzID0gbV9wU2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0U2l6ZSgpOworICBpZiAoblRvdGFsTGluZXMgPiAwKSB7CisgICAgbV9wU2VjdGlvbi0+bV9TZWNJbmZvLm5Ub3RhbExpbmUgPSBuVG90YWxMaW5lczsKKyAgICBmb3IgKGludDMyX3QgbCA9IDA7IGwgPCBuVG90YWxMaW5lczsgbCsrKSB7CisgICAgICBpZiAoQ0xpbmUqIHBMaW5lID0gbV9wU2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0QXQobCkpIHsKKyAgICAgICAgc3dpdGNoIChtX3BWVC0+R2V0QWxpZ25tZW50KG1fcFNlY3Rpb24tPm1fU2VjSW5mbykpIHsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGZQb3NYID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGZQb3NYID0gKGZUeXBlc2V0V2lkdGggLSBwTGluZS0+bV9MaW5lSW5mby5mTGluZVdpZHRoKSAqIFBWVF9IQUxGOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgZlBvc1ggPSBmVHlwZXNldFdpZHRoIC0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVXaWR0aDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB3cDsKLX0KLUNQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpEZWxldGVXb3Jkcyhjb25zdCBDUFZUX1dvcmRSYW5nZSAmIFBsYWNlUmFuZ2UpCi17Ci0gICAgRlhfQk9PTCBiTGFzdFNlY1BvcyA9IEZBTFNFOwotICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQoUGxhY2VSYW5nZS5FbmRQb3MublNlY0luZGV4KSkgewotICAgICAgICBiTGFzdFNlY1BvcyA9IChQbGFjZVJhbmdlLkVuZFBvcyA9PSBwU2VjdGlvbi0+R2V0RW5kV29yZFBsYWNlKCkpOwotICAgIH0KLSAgICBDbGVhcldvcmRzKFBsYWNlUmFuZ2UpOwotICAgIGlmIChQbGFjZVJhbmdlLkJlZ2luUG9zLm5TZWNJbmRleCAhPSBQbGFjZVJhbmdlLkVuZFBvcy5uU2VjSW5kZXgpIHsKLSAgICAgICAgQ2xlYXJFbXB0eVNlY3Rpb25zKFBsYWNlUmFuZ2UpOwotICAgICAgICBpZiAoIWJMYXN0U2VjUG9zKSB7Ci0gICAgICAgICAgICBMaW5rTGF0dGVyU2VjdGlvbihQbGFjZVJhbmdlLkJlZ2luUG9zKTsKKyAgICAgICAgZlBvc1ggKz0gZkxpbmVJbmRlbnQ7CisgICAgICAgIGZQb3NZICs9IG1fcFZULT5HZXRMaW5lTGVhZGluZyhtX3BTZWN0aW9uLT5tX1NlY0luZm8pOworICAgICAgICBmUG9zWSArPSBwTGluZS0+bV9MaW5lSW5mby5mTGluZUFzY2VudDsKKyAgICAgICAgcExpbmUtPm1fTGluZUluZm8uZkxpbmVYID0gZlBvc1ggLSBmTWluWDsKKyAgICAgICAgcExpbmUtPm1fTGluZUluZm8uZkxpbmVZID0gZlBvc1kgLSBmTWluWTsKKyAgICAgICAgZm9yIChpbnQzMl90IHcgPSBwTGluZS0+bV9MaW5lSW5mby5uQmVnaW5Xb3JkSW5kZXg7CisgICAgICAgICAgICAgdyA8PSBwTGluZS0+bV9MaW5lSW5mby5uRW5kV29yZEluZGV4OyB3KyspIHsKKyAgICAgICAgICBpZiAoQ1BWVF9Xb3JkSW5mbyogcFdvcmQgPSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdCh3KSkgeworICAgICAgICAgICAgcFdvcmQtPmZXb3JkWCA9IGZQb3NYIC0gZk1pblg7CisgICAgICAgICAgICBpZiAocFdvcmQtPnBXb3JkUHJvcHMpIHsKKyAgICAgICAgICAgICAgc3dpdGNoIChwV29yZC0+cFdvcmRQcm9wcy0+blNjcmlwdFR5cGUpIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGNhc2UgUFZUV09SRF9TQ1JJUFRfTk9STUFMOgorICAgICAgICAgICAgICAgICAgcFdvcmQtPmZXb3JkWSA9IGZQb3NZIC0gZk1pblk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFBWVFdPUkRfU0NSSVBUX1NVUEVSOgorICAgICAgICAgICAgICAgICAgcFdvcmQtPmZXb3JkWSA9IGZQb3NZIC0gbV9wVlQtPkdldFdvcmRBc2NlbnQoKnBXb3JkKSAtIGZNaW5ZOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQVlRXT1JEX1NDUklQVF9TVUI6CisgICAgICAgICAgICAgICAgICBwV29yZC0+ZldvcmRZID0gZlBvc1kgLSBtX3BWVC0+R2V0V29yZERlc2NlbnQoKnBXb3JkKSAtIGZNaW5ZOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHBXb3JkLT5mV29yZFkgPSBmUG9zWSAtIGZNaW5ZOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZlBvc1ggKz0gbV9wVlQtPkdldFdvcmRXaWR0aCgqcFdvcmQpOworICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBmUG9zWSArPSAoLXBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lRGVzY2VudCk7CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiBQbGFjZVJhbmdlLkJlZ2luUG9zOworICB9CisgIG1fcmNSZXQgPSBDUFZUX0Zsb2F0UmVjdChmTWluWCwgZk1pblksIGZNYXhYLCBmTWF4WSk7CiB9Ci1DUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6RGVsZXRlV29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKQotewotICAgIHJldHVybiBDbGVhclJpZ2h0V29yZChBanVzdExpbmVIZWFkZXIocGxhY2UsIFRSVUUpKTsKK0NQREZfVmFyaWFibGVUZXh0OjpDUERGX1ZhcmlhYmxlVGV4dCgpCisgICAgOiBtX25MaW1pdENoYXIoMCksCisgICAgICBtX25DaGFyQXJyYXkoMCksCisgICAgICBtX2JNdWx0aUxpbmUoRkFMU0UpLAorICAgICAgbV9iTGltaXRXaWR0aChGQUxTRSksCisgICAgICBtX2JBdXRvRm9udFNpemUoRkFMU0UpLAorICAgICAgbV9uQWxpZ25tZW50KDApLAorICAgICAgbV9mTGluZUxlYWRpbmcoMC4wZiksCisgICAgICBtX2ZDaGFyU3BhY2UoMC4wZiksCisgICAgICBtX25Ib3J6U2NhbGUoMTAwKSwKKyAgICAgIG1fd1N1YldvcmQoMCksCisgICAgICBtX2ZGb250U2l6ZSgwLjBmKSwKKyAgICAgIG1fYkluaXRpYWwoRkFMU0UpLAorICAgICAgbV9iUmljaFRleHQoRkFMU0UpLAorICAgICAgbV9wVlRQcm92aWRlcihOVUxMKSwKKyAgICAgIG1fcFZUSXRlcmF0b3IoTlVMTCkge30KK0NQREZfVmFyaWFibGVUZXh0Ojp+Q1BERl9WYXJpYWJsZVRleHQoKSB7CisgIGRlbGV0ZSBtX3BWVEl0ZXJhdG9yOworICBtX3BWVEl0ZXJhdG9yID0gTlVMTDsKKyAgUmVzZXRBbGwoKTsKIH0KLUNQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpCYWNrU3BhY2VXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpCi17Ci0gICAgcmV0dXJuIENsZWFyTGVmdFdvcmQoQWp1c3RMaW5lSGVhZGVyKHBsYWNlLCBUUlVFKSk7Ci19Ci12b2lkIENQREZfVmFyaWFibGVUZXh0OjpTZXRUZXh0KEZYX0xQQ1dTVFIgdGV4dCwgRlhfSU5UMzIgY2hhcnNldCwgY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzKQotewotICAgIERlbGV0ZVdvcmRzKENQVlRfV29yZFJhbmdlKEdldEJlZ2luV29yZFBsYWNlKCksIEdldEVuZFdvcmRQbGFjZSgpKSk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc3dUZXh0ID0gdGV4dDsKLSAgICBDUFZUX1dvcmRQbGFjZQl3cCgwLCAwLCAtMSk7Cit2b2lkIENQREZfVmFyaWFibGVUZXh0OjpJbml0aWFsaXplKCkgeworICBpZiAoIW1fYkluaXRpYWwpIHsKICAgICBDUFZUX1NlY3Rpb25JbmZvIHNlY2luZm87CiAgICAgaWYgKG1fYlJpY2hUZXh0KSB7Ci0gICAgICAgIGlmIChwU2VjUHJvcHMpIHsKLSAgICAgICAgICAgIHNlY2luZm8ucFNlY1Byb3BzID0gbmV3IENQVlRfU2VjUHJvcHMoKnBTZWNQcm9wcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBXb3JkUHJvcHMpIHsKLSAgICAgICAgICAgIHNlY2luZm8ucFdvcmRQcm9wcyA9IG5ldyBDUFZUX1dvcmRQcm9wcygqcFdvcmRQcm9wcyk7Ci0gICAgICAgIH0KKyAgICAgIHNlY2luZm8ucFNlY1Byb3BzID0gbmV3IENQVlRfU2VjUHJvcHMoMC4wZiwgMC4wZiwgMCk7CisgICAgICBzZWNpbmZvLnBXb3JkUHJvcHMgPSBuZXcgQ1BWVF9Xb3JkUHJvcHMoR2V0RGVmYXVsdEZvbnRJbmRleCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBWVF9ERUZBVUxUX0ZPTlRTSVpFLCAwLCAwLCAwKTsKICAgICB9Ci0gICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdCgwKSkgewotICAgICAgICBwU2VjdGlvbi0+bV9TZWNJbmZvID0gc2VjaW5mbzsKLSAgICB9Ci0gICAgRlhfSU5UMzIgbkNoYXJDb3VudCA9IDA7Ci0gICAgZm9yIChGWF9JTlQzMiBpID0gMCwgc3ogPSBzd1RleHQuR2V0TGVuZ3RoKCk7IGkgPCBzejsgaSsrKSB7Ci0gICAgICAgIGlmIChtX25MaW1pdENoYXIgPiAwICYmIG5DaGFyQ291bnQgPj0gbV9uTGltaXRDaGFyKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9uQ2hhckFycmF5ID4gMCAmJiBuQ2hhckNvdW50ID49IG1fbkNoYXJBcnJheSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfV09SRCB3b3JkID0gc3dUZXh0LkdldEF0KGkpOwotICAgICAgICBzd2l0Y2ggKHdvcmQpIHsKLSAgICAgICAgICAgIGNhc2UgMHgwRDoKLSAgICAgICAgICAgICAgICBpZiAobV9iTXVsdGlMaW5lKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzd1RleHQuR2V0QXQoaSArIDEpID09IDB4MEEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB3cC5uU2VjSW5kZXggKys7Ci0gICAgICAgICAgICAgICAgICAgIHdwLm5MaW5lSW5kZXggPSAwOwotICAgICAgICAgICAgICAgICAgICB3cC5uV29yZEluZGV4ID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIEFkZFNlY3Rpb24od3AsIHNlY2luZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMHgwQToKLSAgICAgICAgICAgICAgICBpZiAobV9iTXVsdGlMaW5lKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzd1RleHQuR2V0QXQoaSArIDEpID09IDB4MEQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB3cC5uU2VjSW5kZXggKys7Ci0gICAgICAgICAgICAgICAgICAgIHdwLm5MaW5lSW5kZXggPSAwOwotICAgICAgICAgICAgICAgICAgICB3cC5uV29yZEluZGV4ID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIEFkZFNlY3Rpb24od3AsIHNlY2luZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMHgwOToKLSAgICAgICAgICAgICAgICB3b3JkID0gMHgyMDsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgd3AgPSBJbnNlcnRXb3JkKHdwLCB3b3JkLCBjaGFyc2V0LCBwV29yZFByb3BzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBuQ2hhckNvdW50Kys7Ci0gICAgfQotfQotdm9pZCBDUERGX1ZhcmlhYmxlVGV4dDo6VXBkYXRlV29yZFBsYWNlKENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0Ci17Ci0gICAgaWYgKHBsYWNlLm5TZWNJbmRleCA8IDApIHsKLSAgICAgICAgcGxhY2UgPSBHZXRCZWdpbldvcmRQbGFjZSgpOwotICAgIH0KLSAgICBpZiAocGxhY2UublNlY0luZGV4ID49IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKSkgewotICAgICAgICBwbGFjZSA9IEdldEVuZFdvcmRQbGFjZSgpOwotICAgIH0KLSAgICBwbGFjZSA9IEFqdXN0TGluZUhlYWRlcihwbGFjZSwgVFJVRSk7Ci0gICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7Ci0gICAgICAgIHBTZWN0aW9uLT5VcGRhdGVXb3JkUGxhY2UocGxhY2UpOwotICAgIH0KLX0KLUZYX0lOVDMyIENQREZfVmFyaWFibGVUZXh0OjpXb3JkUGxhY2VUb1dvcmRJbmRleChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdAotewotICAgIENQVlRfV29yZFBsYWNlIG5ld3BsYWNlID0gcGxhY2U7Ci0gICAgVXBkYXRlV29yZFBsYWNlKG5ld3BsYWNlKTsKLSAgICBGWF9JTlQzMiBuSW5kZXggPSAwOwotICAgIEZYX0lOVDMyIGkgPSAwOwotICAgIEZYX0lOVDMyIHN6ID0gMDsKLSAgICBmb3IgKGkgPSAwLCBzeiA9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKTsgaSA8IHN6ICYmIGkgPCBuZXdwbGFjZS5uU2VjSW5kZXg7IGkrKykgewotICAgICAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KGkpKSB7Ci0gICAgICAgICAgICBuSW5kZXggKz0gcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldFNpemUoKTsKLSAgICAgICAgICAgIGlmIChpICE9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKSAtIDEpIHsKLSAgICAgICAgICAgICAgICBuSW5kZXggKz0gUFZUX1JFVFVSTl9MRU5HVEg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGkgPj0gMCAmJiBpIDwgbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIG5JbmRleCArPSBuZXdwbGFjZS5uV29yZEluZGV4ICsgUFZUX1JFVFVSTl9MRU5HVEg7Ci0gICAgfQotICAgIHJldHVybiBuSW5kZXg7Ci19Ci1DUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6V29yZEluZGV4VG9Xb3JkUGxhY2UoRlhfSU5UMzIgaW5kZXgpIGNvbnN0Ci17Ci0gICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBHZXRCZWdpbldvcmRQbGFjZSgpOwotICAgIEZYX0lOVDMyIG5PbGRJbmRleCA9IDAgLCBuSW5kZXggPSAwOwotICAgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKLSAgICBmb3IgKEZYX0lOVDMyIGkgPSAwLCBzeiA9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKLSAgICAgICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChpKSkgewotICAgICAgICAgICAgbkluZGV4ICs9IHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCk7Ci0gICAgICAgICAgICBpZiAobkluZGV4ID09IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgcGxhY2UgPSBwU2VjdGlvbi0+R2V0RW5kV29yZFBsYWNlKCk7Ci0gICAgICAgICAgICAgICAgYkZpbmQgPSBUUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuSW5kZXggPiBpbmRleCkgewotICAgICAgICAgICAgICAgIHBsYWNlLm5TZWNJbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgcGxhY2UubldvcmRJbmRleCA9IGluZGV4IC0gbk9sZEluZGV4IC0gMTsKLSAgICAgICAgICAgICAgICBwU2VjdGlvbi0+VXBkYXRlV29yZFBsYWNlKHBsYWNlKTsKLSAgICAgICAgICAgICAgICBiRmluZCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaSAhPSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgLSAxKSB7Ci0gICAgICAgICAgICAgICAgbkluZGV4ICs9IFBWVF9SRVRVUk5fTEVOR1RIOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbk9sZEluZGV4ID0gbkluZGV4OwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghYkZpbmQpIHsKLSAgICAgICAgcGxhY2UgPSBHZXRFbmRXb3JkUGxhY2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBsYWNlOwotfQotQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkdldEJlZ2luV29yZFBsYWNlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9iSW5pdGlhbCA/IENQVlRfV29yZFBsYWNlKDAsIDAsIC0xKSA6IENQVlRfV29yZFBsYWNlKCk7Ci19Ci1DUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0RW5kV29yZFBsYWNlKCkgY29uc3QKLXsKLSAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KG1fU2VjdGlvbkFycmF5LkdldFNpemUoKSAtIDEpKSB7Ci0gICAgICAgIHJldHVybiBwU2VjdGlvbi0+R2V0RW5kV29yZFBsYWNlKCk7Ci0gICAgfQotICAgIHJldHVybiBDUFZUX1dvcmRQbGFjZSgpOwotfQotQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFByZXZXb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QKLXsKLSAgICBpZiggcGxhY2UublNlY0luZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKLSAgICB9Ci0gICAgaWYgKHBsYWNlLm5TZWNJbmRleCA+PSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIEdldEVuZFdvcmRQbGFjZSgpOwotICAgIH0KLSAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKLSAgICAgICAgaWYgKHBsYWNlLldvcmRDbXAocFNlY3Rpb24tPkdldEJlZ2luV29yZFBsYWNlKCkpIDw9IDApIHsKLSAgICAgICAgICAgIGlmIChDU2VjdGlvbiAqIHBQcmV2U2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCAtIDEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBQcmV2U2VjdGlvbi0+R2V0RW5kV29yZFBsYWNlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRCZWdpbldvcmRQbGFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHBTZWN0aW9uLT5HZXRQcmV2V29yZFBsYWNlKHBsYWNlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcGxhY2U7Ci19Ci1DUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0TmV4dFdvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdAotewotICAgIGlmIChwbGFjZS5uU2VjSW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBHZXRCZWdpbldvcmRQbGFjZSgpOwotICAgIH0KLSAgICBpZiAocGxhY2UublNlY0luZGV4ID49IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKSkgewotICAgICAgICByZXR1cm4gR2V0RW5kV29yZFBsYWNlKCk7Ci0gICAgfQotICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgewotICAgICAgICBpZiAocGxhY2UuV29yZENtcChwU2VjdGlvbi0+R2V0RW5kV29yZFBsYWNlKCkpID49IDApIHsKLSAgICAgICAgICAgIGlmIChDU2VjdGlvbiAqIHBOZXh0U2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCArIDEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBOZXh0U2VjdGlvbi0+R2V0QmVnaW5Xb3JkUGxhY2UoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldEVuZFdvcmRQbGFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHBTZWN0aW9uLT5HZXROZXh0V29yZFBsYWNlKHBsYWNlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcGxhY2U7Ci19Ci1DUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6U2VhcmNoV29yZFBsYWNlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3QKLXsKLSAgICBDUERGX1BvaW50IHB0ID0gT3V0VG9Jbihwb2ludCk7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBHZXRCZWdpbldvcmRQbGFjZSgpOwotICAgIEZYX0lOVDMyIG5MZWZ0ID0gMDsKLSAgICBGWF9JTlQzMiBuUmlnaHQgPSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgLSAxOwotICAgIEZYX0lOVDMyIG5NaWQgPSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgLyAyOwotICAgIEZYX0JPT0wgYlVwID0gVFJVRTsKLSAgICBGWF9CT09MIGJEb3duID0gVFJVRTsKLSAgICB3aGlsZSAobkxlZnQgPD0gblJpZ2h0KSB7Ci0gICAgICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQobk1pZCkpIHsKLSAgICAgICAgICAgIGlmIChJc0Zsb2F0QmlnZ2VyKHB0LnksIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLnRvcCkpIHsKLSAgICAgICAgICAgICAgICBiVXAgPSBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChJc0Zsb2F0QmlnZ2VyKHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLmJvdHRvbSwgcHQueSkpIHsKLSAgICAgICAgICAgICAgICBiRG93biA9IEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKElzRmxvYXRTbWFsbGVyKHB0LnksIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLnRvcCkpIHsKLSAgICAgICAgICAgICAgICBuUmlnaHQgPSBuTWlkIC0gMTsKLSAgICAgICAgICAgICAgICBuTWlkID0gKG5MZWZ0ICsgblJpZ2h0KSAvIDI7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKElzRmxvYXRCaWdnZXIocHQueSwgcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24uYm90dG9tKSkgewotICAgICAgICAgICAgICAgIG5MZWZ0ID0gbk1pZCArIDE7Ci0gICAgICAgICAgICAgICAgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwbGFjZSA9IHBTZWN0aW9uLT5TZWFyY2hXb3JkUGxhY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Qb2ludChwdC54IC0gcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24ubGVmdCwgcHQueSAtIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLnRvcCkKLSAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgcGxhY2UublNlY0luZGV4ID0gbk1pZDsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGxhY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoYlVwKSB7Ci0gICAgICAgIHBsYWNlID0gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKLSAgICB9Ci0gICAgaWYgKGJEb3duKSB7Ci0gICAgICAgIHBsYWNlID0gR2V0RW5kV29yZFBsYWNlKCk7Ci0gICAgfQotICAgIHJldHVybiBwbGFjZTsKLX0KLUNQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpHZXRVcFdvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0Ci17Ci0gICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7Ci0gICAgICAgIENQVlRfV29yZFBsYWNlIHRlbXAgPSAgcGxhY2U7Ci0gICAgICAgIENQREZfUG9pbnQgcHQgPSBPdXRUb0luKHBvaW50KTsKLSAgICAgICAgaWYgKHRlbXAubkxpbmVJbmRleC0tID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIHBTZWN0aW9uLT5TZWFyY2hXb3JkUGxhY2UocHQueCAtIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLmxlZnQsIHRlbXApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHRlbXAublNlY0luZGV4LS0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKENTZWN0aW9uICogcExhc3RTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQodGVtcC5uU2VjSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXAubkxpbmVJbmRleCA9IHBMYXN0U2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0U2l6ZSgpIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBMYXN0U2VjdGlvbi0+U2VhcmNoV29yZFBsYWNlKHB0LnggLSBwTGFzdFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24ubGVmdCwgdGVtcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwbGFjZTsKLX0KLUNQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpHZXREb3duV29yZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3QKLXsKLSAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKLSAgICAgICAgQ1BWVF9Xb3JkUGxhY2UgdGVtcCA9ICBwbGFjZTsKLSAgICAgICAgQ1BERl9Qb2ludCBwdCA9IE91dFRvSW4ocG9pbnQpOwotICAgICAgICBpZiAodGVtcC5uTGluZUluZGV4KysgPCBwU2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0U2l6ZSgpIC0gMSkgewotICAgICAgICAgICAgcmV0dXJuIHBTZWN0aW9uLT5TZWFyY2hXb3JkUGxhY2UocHQueCAtIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLmxlZnQsIHRlbXApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHRlbXAublNlY0luZGV4KysgPCBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgLSAxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKENTZWN0aW9uICogcE5leHRTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQodGVtcC5uU2VjSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXAubkxpbmVJbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwTmV4dFNlY3Rpb24tPlNlYXJjaFdvcmRQbGFjZShwdC54IC0gcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24ubGVmdCwgdGVtcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwbGFjZTsKLX0KLUNQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpHZXRMaW5lQmVnaW5QbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdAotewotICAgIHJldHVybiBDUFZUX1dvcmRQbGFjZShwbGFjZS5uU2VjSW5kZXgsIHBsYWNlLm5MaW5lSW5kZXgsIC0xKTsKLX0KLUNQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpHZXRMaW5lRW5kUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QKLXsKLSAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpCi0gICAgICAgIGlmIChDTGluZSAqIHBMaW5lID0gcFNlY3Rpb24tPm1fTGluZUFycmF5LkdldEF0KHBsYWNlLm5MaW5lSW5kZXgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gcExpbmUtPkdldEVuZFdvcmRQbGFjZSgpOwotICAgICAgICB9Ci0gICAgcmV0dXJuIHBsYWNlOwotfQotQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFNlY3Rpb25CZWdpblBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIENQVlRfV29yZFBsYWNlKHBsYWNlLm5TZWNJbmRleCwgMCwgLTEpOwotfQotQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFNlY3Rpb25FbmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdAotewotICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgewotICAgICAgICByZXR1cm4gcFNlY3Rpb24tPkdldEVuZFdvcmRQbGFjZSgpOwotICAgIH0KLSAgICByZXR1cm4gcGxhY2U7Ci19Ci1GWF9JTlQzMiBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0VG90YWxXb3JkcygpIGNvbnN0Ci17Ci0gICAgRlhfSU5UMzIgblRvdGFsID0gMDsKLSAgICBmb3IgKEZYX0lOVDMyIGkgPSAwLCBzeiA9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKTsgaSA8IHN6OyBpKyspCi0gICAgICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQoaSkpIHsKLSAgICAgICAgICAgIG5Ub3RhbCArPSAocFNlY3Rpb24tPm1fV29yZEFycmF5LkdldFNpemUoKSArIFBWVF9SRVRVUk5fTEVOR1RIKTsKLSAgICAgICAgfQotICAgIHJldHVybiBuVG90YWwgLSBQVlRfUkVUVVJOX0xFTkdUSDsKLX0KLXZvaWQgQ1BERl9WYXJpYWJsZVRleHQ6OlJlc2V0U2VjdGlvbkFycmF5KCkKLXsKLSAgICBmb3IgKEZYX0lOVDMyIHMgPSAwLCBzeiA9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKTsgcyA8IHN6OyBzKyspIHsKLSAgICAgICAgZGVsZXRlIG1fU2VjdGlvbkFycmF5LkdldEF0KHMpOwotICAgIH0KLSAgICBtX1NlY3Rpb25BcnJheS5SZW1vdmVBbGwoKTsKLX0KLUNQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpBZGRTZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGNvbnN0IENQVlRfU2VjdGlvbkluZm8gJiBzZWNpbmZvKQotewotICAgIGlmIChJc1ZhbGlkKCkgJiYgIW1fYk11bHRpTGluZSkgewotICAgICAgICByZXR1cm4gcGxhY2U7Ci0gICAgfQotICAgIEZYX0lOVDMyIG5TZWNJbmRleCA9IEZQREZfTUFYKEZQREZfTUlOKHBsYWNlLm5TZWNJbmRleCwgbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpKSwgMCk7Ci0gICAgQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG5ldyBDU2VjdGlvbih0aGlzKTsKLSAgICBwU2VjdGlvbi0+bV9TZWNJbmZvID0gc2VjaW5mbzsKLSAgICBwU2VjdGlvbi0+U2VjUGxhY2UublNlY0luZGV4ID0gblNlY0luZGV4OwotICAgIGlmIChuU2VjSW5kZXggPT0gbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIG1fU2VjdGlvbkFycmF5LkFkZChwU2VjdGlvbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9TZWN0aW9uQXJyYXkuSW5zZXJ0QXQoblNlY0luZGV4LCBwU2VjdGlvbik7Ci0gICAgfQotICAgIHJldHVybiBwbGFjZTsKLX0KLUNQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpBZGRMaW5lKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGNvbnN0IENQVlRfTGluZUluZm8gJiBsaW5laW5mbykKLXsKLSAgICBpZiAobV9TZWN0aW9uQXJyYXkuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBwbGFjZTsKLSAgICB9Ci0gICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7Ci0gICAgICAgIHJldHVybiBwU2VjdGlvbi0+QWRkTGluZShsaW5laW5mbyk7Ci0gICAgfQotICAgIHJldHVybiBwbGFjZTsKLX0KLUNQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpBZGRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGNvbnN0IENQVlRfV29yZEluZm8gJiB3b3JkaW5mbykKLXsKLSAgICBpZiAobV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHsKLSAgICAgICAgcmV0dXJuIHBsYWNlOwotICAgIH0KLSAgICBDUFZUX1dvcmRQbGFjZSBuZXdwbGFjZSA9IHBsYWNlOwotICAgIG5ld3BsYWNlLm5TZWNJbmRleCA9IEZQREZfTUFYKEZQREZfTUlOKG5ld3BsYWNlLm5TZWNJbmRleCwgbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpIC0gMSksIDApOwotICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQobmV3cGxhY2UublNlY0luZGV4KSkgewotICAgICAgICByZXR1cm4gcFNlY3Rpb24tPkFkZFdvcmQobmV3cGxhY2UsIHdvcmRpbmZvKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBsYWNlOwotfQotRlhfQk9PTCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZEluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgQ1BWVF9Xb3JkSW5mbyAmIHdvcmRpbmZvKQotewotICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgewotICAgICAgICBpZiAoQ1BWVF9Xb3JkSW5mbyAqIHBXb3JkID0gcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldEF0KHBsYWNlLm5Xb3JkSW5kZXgpKSB7Ci0gICAgICAgICAgICB3b3JkaW5mbyA9ICpwV29yZDsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wgQ1BERl9WYXJpYWJsZVRleHQ6OlNldFdvcmRJbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGNvbnN0IENQVlRfV29yZEluZm8gJiB3b3JkaW5mbykKLXsKLSAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKLSAgICAgICAgaWYgKENQVlRfV29yZEluZm8gKiBwV29yZCA9IHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdChwbGFjZS5uV29yZEluZGV4KSkgewotICAgICAgICAgICAgKnBXb3JkID0gd29yZGluZm87Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci1GWF9CT09MIENQREZfVmFyaWFibGVUZXh0OjpHZXRMaW5lSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBDUFZUX0xpbmVJbmZvICYgbGluZWluZm8pCi17Ci0gICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7Ci0gICAgICAgIGlmIChDTGluZSAqIHBMaW5lID0gcFNlY3Rpb24tPm1fTGluZUFycmF5LkdldEF0KHBsYWNlLm5MaW5lSW5kZXgpKSB7Ci0gICAgICAgICAgICBsaW5laW5mbyA9IHBMaW5lLT5tX0xpbmVJbmZvOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotRlhfQk9PTCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0U2VjdGlvbkluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgQ1BWVF9TZWN0aW9uSW5mbyAmIHNlY2luZm8pCi17Ci0gICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7Ci0gICAgICAgIHNlY2luZm8gPSBwU2VjdGlvbi0+bV9TZWNJbmZvOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotQ1BERl9SZWN0IENQREZfVmFyaWFibGVUZXh0OjpHZXRDb250ZW50UmVjdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIEluVG9PdXQoQ1BERl9FZGl0Q29udGFpbmVyOjpHZXRDb250ZW50UmVjdCgpKTsKLX0KLUZYX0ZMT0FUIENQREZfVmFyaWFibGVUZXh0OjpHZXRXb3JkRm9udFNpemUoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBGWF9CT09MIGJGYWN0Rm9udFNpemUpCi17Ci0gICAgcmV0dXJuIG1fYlJpY2hUZXh0ICYmIFdvcmRJbmZvLnBXb3JkUHJvcHMgPyAoV29yZEluZm8ucFdvcmRQcm9wcy0+blNjcmlwdFR5cGUgPT0gUFZUV09SRF9TQ1JJUFRfTk9STUFMIHx8IGJGYWN0Rm9udFNpemUgPyBXb3JkSW5mby5wV29yZFByb3BzLT5mRm9udFNpemUgOiBXb3JkSW5mby5wV29yZFByb3BzLT5mRm9udFNpemUgKiBQVlRfSEFMRikgOiBHZXRGb250U2l6ZSgpOwotfQotRlhfSU5UMzIgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmRGb250SW5kZXgoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvKQotewotICAgIHJldHVybiBtX2JSaWNoVGV4dCAmJiBXb3JkSW5mby5wV29yZFByb3BzID8gV29yZEluZm8ucFdvcmRQcm9wcy0+bkZvbnRJbmRleCA6IFdvcmRJbmZvLm5Gb250SW5kZXg7Ci19Ci1GWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZFdpZHRoKEZYX0lOVDMyIG5Gb250SW5kZXgsIEZYX1dPUkQgV29yZCwgRlhfV09SRCBTdWJXb3JkLAotICAgICAgICBGWF9GTE9BVCBmQ2hhclNwYWNlLCBGWF9JTlQzMiBuSG9yelNjYWxlLAotICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUsIEZYX0ZMT0FUIGZXb3JkVGFpbCwgRlhfSU5UMzIgbldvcmRTdHlsZSkKLXsKLSAgICByZXR1cm4gKEdldENoYXJXaWR0aChuRm9udEluZGV4LCBXb3JkLCBTdWJXb3JkLCBuV29yZFN0eWxlKSAqIGZGb250U2l6ZSAqIFBWVF9GT05UU0NBTEUgKyBmQ2hhclNwYWNlKSAqIG5Ib3J6U2NhbGUgKiBQVlRfUEVSQ0VOVCArIGZXb3JkVGFpbDsKLX0KLUZYX0ZMT0FUIENQREZfVmFyaWFibGVUZXh0OjpHZXRXb3JkV2lkdGgoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvKQotewotICAgIHJldHVybiBHZXRXb3JkV2lkdGgoR2V0V29yZEZvbnRJbmRleChXb3JkSW5mbyksIFdvcmRJbmZvLldvcmQsIEdldFN1YldvcmQoKSwgR2V0Q2hhclNwYWNlKFdvcmRJbmZvKSwgR2V0SG9yelNjYWxlKFdvcmRJbmZvKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdldFdvcmRGb250U2l6ZShXb3JkSW5mbyksIFdvcmRJbmZvLmZXb3JkVGFpbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdvcmRJbmZvLnBXb3JkUHJvcHMgPyBXb3JkSW5mby5wV29yZFByb3BzLT5uV29yZFN0eWxlIDogMCk7Ci19Ci1GWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0TGluZUFzY2VudChjb25zdCBDUFZUX1NlY3Rpb25JbmZvICYgU2VjSW5mbykKLXsKLSAgICByZXR1cm4gbV9iUmljaFRleHQgJiYgU2VjSW5mby5wV29yZFByb3BzID8gR2V0Rm9udEFzY2VudChTZWNJbmZvLnBXb3JkUHJvcHMtPm5Gb250SW5kZXgsIFNlY0luZm8ucFdvcmRQcm9wcy0+ZkZvbnRTaXplKSA6Ci0gICAgICAgICAgIEdldEZvbnRBc2NlbnQoR2V0RGVmYXVsdEZvbnRJbmRleCgpLCBHZXRGb250U2l6ZSgpKTsKLX0KLUZYX0ZMT0FUIENQREZfVmFyaWFibGVUZXh0OjpHZXRMaW5lRGVzY2VudChjb25zdCBDUFZUX1NlY3Rpb25JbmZvICYgU2VjSW5mbykKLXsKLSAgICByZXR1cm4gbV9iUmljaFRleHQgJiYgU2VjSW5mby5wV29yZFByb3BzID8gR2V0Rm9udERlc2NlbnQoU2VjSW5mby5wV29yZFByb3BzLT5uRm9udEluZGV4LCBTZWNJbmZvLnBXb3JkUHJvcHMtPmZGb250U2l6ZSkgOgotICAgICAgICAgICBHZXRGb250RGVzY2VudChHZXREZWZhdWx0Rm9udEluZGV4KCksIEdldEZvbnRTaXplKCkpOwotfQotRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldEZvbnRBc2NlbnQoRlhfSU5UMzIgbkZvbnRJbmRleCwgRlhfRkxPQVQgZkZvbnRTaXplKQotewotICAgIHJldHVybiAoRlhfRkxPQVQpR2V0VHlwZUFzY2VudChuRm9udEluZGV4KSAqIGZGb250U2l6ZSAqIFBWVF9GT05UU0NBTEU7Ci19Ci1GWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0Rm9udERlc2NlbnQoRlhfSU5UMzIgbkZvbnRJbmRleCwgRlhfRkxPQVQgZkZvbnRTaXplKQotewotICAgIHJldHVybiAoRlhfRkxPQVQpR2V0VHlwZURlc2NlbnQobkZvbnRJbmRleCkgKiBmRm9udFNpemUgKiBQVlRfRk9OVFNDQUxFOwotfQotRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmRBc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBGWF9GTE9BVCBmRm9udFNpemUpCi17Ci0gICAgcmV0dXJuIEdldEZvbnRBc2NlbnQoR2V0V29yZEZvbnRJbmRleChXb3JkSW5mbyksIGZGb250U2l6ZSk7Ci19Ci1GWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZERlc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBGWF9GTE9BVCBmRm9udFNpemUpCi17Ci0gICAgcmV0dXJuIEdldEZvbnREZXNjZW50KEdldFdvcmRGb250SW5kZXgoV29yZEluZm8pLCBmRm9udFNpemUpOwotfQotRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmRBc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBGWF9CT09MIGJGYWN0Rm9udFNpemUpCi17Ci0gICAgcmV0dXJuIEdldEZvbnRBc2NlbnQoR2V0V29yZEZvbnRJbmRleChXb3JkSW5mbyksIEdldFdvcmRGb250U2l6ZShXb3JkSW5mbywgYkZhY3RGb250U2l6ZSkpOwotfQotRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmREZXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8gJiBXb3JkSW5mbywgRlhfQk9PTCBiRmFjdEZvbnRTaXplKQotewotICAgIHJldHVybiBHZXRGb250RGVzY2VudChHZXRXb3JkRm9udEluZGV4KFdvcmRJbmZvKSwgR2V0V29yZEZvbnRTaXplKFdvcmRJbmZvLCBiRmFjdEZvbnRTaXplKSk7Ci19Ci1GWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0TGluZUxlYWRpbmcoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyAmIFNlY0luZm8pCi17Ci0gICAgcmV0dXJuIG1fYlJpY2hUZXh0ICYmIFNlY0luZm8ucFNlY1Byb3BzID8gU2VjSW5mby5wU2VjUHJvcHMtPmZMaW5lTGVhZGluZyA6IG1fZkxpbmVMZWFkaW5nOwotfQotRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldExpbmVJbmRlbnQoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyAmIFNlY0luZm8pCi17Ci0gICAgcmV0dXJuIG1fYlJpY2hUZXh0ICYmIFNlY0luZm8ucFNlY1Byb3BzID8gU2VjSW5mby5wU2VjUHJvcHMtPmZMaW5lSW5kZW50IDogMC4wZjsKLX0KLUZYX0lOVDMyIENQREZfVmFyaWFibGVUZXh0OjpHZXRBbGlnbm1lbnQoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyYgU2VjSW5mbykKLXsKLSAgICByZXR1cm4gbV9iUmljaFRleHQgJiYgU2VjSW5mby5wU2VjUHJvcHMgPyBTZWNJbmZvLnBTZWNQcm9wcy0+bkFsaWdubWVudCA6IHRoaXMtPm1fbkFsaWdubWVudDsKLX0KLUZYX0ZMT0FUIENQREZfVmFyaWFibGVUZXh0OjpHZXRDaGFyU3BhY2UoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvKQotewotICAgIHJldHVybiBtX2JSaWNoVGV4dCAmJiBXb3JkSW5mby5wV29yZFByb3BzID8gV29yZEluZm8ucFdvcmRQcm9wcy0+ZkNoYXJTcGFjZSA6IG1fZkNoYXJTcGFjZTsKLX0KLUZYX0lOVDMyIENQREZfVmFyaWFibGVUZXh0OjpHZXRIb3J6U2NhbGUoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvKQotewotICAgIHJldHVybiBtX2JSaWNoVGV4dCAmJiBXb3JkSW5mby5wV29yZFByb3BzID8gV29yZEluZm8ucFdvcmRQcm9wcy0+bkhvcnpTY2FsZSA6IG1fbkhvcnpTY2FsZTsKLX0KLXZvaWQgQ1BERl9WYXJpYWJsZVRleHQ6OkNsZWFyU2VjdGlvblJpZ2h0V29yZHMoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkKLXsKLSAgICBDUFZUX1dvcmRQbGFjZSB3b3JkcGxhY2UgPSBBanVzdExpbmVIZWFkZXIocGxhY2UsIFRSVUUpOwotICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgewotICAgICAgICBmb3IgKEZYX0lOVDMyIHcgPSBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpIC0gMTsgdyA+IHdvcmRwbGFjZS5uV29yZEluZGV4OyB3LS0pIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0QXQodyk7Ci0gICAgICAgICAgICBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuUmVtb3ZlQXQodyk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1DUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6QWp1c3RMaW5lSGVhZGVyKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIEZYX0JPT0wgYlByZXZPck5leHQpIGNvbnN0Ci17Ci0gICAgaWYgKHBsYWNlLm5Xb3JkSW5kZXggPCAwICYmIHBsYWNlLm5MaW5lSW5kZXggPiAwKSB7Ci0gICAgICAgIGlmIChiUHJldk9yTmV4dCkgewotICAgICAgICAgICAgcmV0dXJuIEdldFByZXZXb3JkUGxhY2UocGxhY2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIEdldE5leHRXb3JkUGxhY2UocGxhY2UpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwbGFjZTsKLX0KLUZYX0JPT0wgQ1BERl9WYXJpYWJsZVRleHQ6OkNsZWFyRW1wdHlTZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpCi17Ci0gICAgaWYgKHBsYWNlLm5TZWNJbmRleCA9PSAwICYmIG1fU2VjdGlvbkFycmF5LkdldFNpemUoKSA9PSAxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7Ci0gICAgICAgIGlmIChwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwU2VjdGlvbjsKLSAgICAgICAgICAgIG1fU2VjdGlvbkFycmF5LlJlbW92ZUF0KHBsYWNlLm5TZWNJbmRleCk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci12b2lkIENQREZfVmFyaWFibGVUZXh0OjpDbGVhckVtcHR5U2VjdGlvbnMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKQotewotICAgIENQVlRfV29yZFBsYWNlIHdvcmRwbGFjZTsKLSAgICBmb3IgKEZYX0lOVDMyIHMgPSBQbGFjZVJhbmdlLkVuZFBvcy5uU2VjSW5kZXg7IHMgPiBQbGFjZVJhbmdlLkJlZ2luUG9zLm5TZWNJbmRleDsgcy0tKSB7Ci0gICAgICAgIHdvcmRwbGFjZS5uU2VjSW5kZXggPSBzOwotICAgICAgICBDbGVhckVtcHR5U2VjdGlvbih3b3JkcGxhY2UpOwotICAgIH0KLX0KLXZvaWQgQ1BERl9WYXJpYWJsZVRleHQ6OkxpbmtMYXR0ZXJTZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpCi17Ci0gICAgQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2UgPSBBanVzdExpbmVIZWFkZXIocGxhY2UsIFRSVUUpOwotICAgIGlmIChDU2VjdGlvbiAqIHBOZXh0U2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCArIDEpKSB7Ci0gICAgICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQob2xkcGxhY2UublNlY0luZGV4KSkgewotICAgICAgICAgICAgZm9yIChGWF9JTlQzMiB3ID0gMCwgc3ogPSBwTmV4dFNlY3Rpb24tPm1fV29yZEFycmF5LkdldFNpemUoKTsgdyA8IHN6OyB3KyspIHsKLSAgICAgICAgICAgICAgICBpZiAoQ1BWVF9Xb3JkSW5mbyAqIHBXb3JkID0gcE5leHRTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdCh3KSkgewotICAgICAgICAgICAgICAgICAgICBvbGRwbGFjZS5uV29yZEluZGV4ICsrOwotICAgICAgICAgICAgICAgICAgICBwU2VjdGlvbi0+QWRkV29yZChvbGRwbGFjZSwgKnBXb3JkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZXRlIHBOZXh0U2VjdGlvbjsKLSAgICAgICAgbV9TZWN0aW9uQXJyYXkuUmVtb3ZlQXQocGxhY2UublNlY0luZGV4ICsgMSk7Ci0gICAgfQotfQotdm9pZCBDUERGX1ZhcmlhYmxlVGV4dDo6Q2xlYXJXb3Jkcyhjb25zdCBDUFZUX1dvcmRSYW5nZSAmIFBsYWNlUmFuZ2UpCi17Ci0gICAgQ1BWVF9Xb3JkUmFuZ2UgTmV3UmFuZ2U7Ci0gICAgTmV3UmFuZ2UuQmVnaW5Qb3MgPSBBanVzdExpbmVIZWFkZXIoUGxhY2VSYW5nZS5CZWdpblBvcywgVFJVRSk7Ci0gICAgTmV3UmFuZ2UuRW5kUG9zID0gQWp1c3RMaW5lSGVhZGVyKFBsYWNlUmFuZ2UuRW5kUG9zLCBUUlVFKTsKLSAgICBmb3IgKEZYX0lOVDMyIHMgPSBOZXdSYW5nZS5FbmRQb3MublNlY0luZGV4OyBzID49IE5ld1JhbmdlLkJlZ2luUG9zLm5TZWNJbmRleDsgcy0tKSB7Ci0gICAgICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocykpIHsKLSAgICAgICAgICAgIHBTZWN0aW9uLT5DbGVhcldvcmRzKE5ld1JhbmdlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLUNQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpDbGVhckxlZnRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpCi17Ci0gICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7Ci0gICAgICAgIENQVlRfV29yZFBsYWNlIGxlZnRwbGFjZSA9IHRoaXMtPkdldFByZXZXb3JkUGxhY2UocGxhY2UpOwotICAgICAgICBpZiAobGVmdHBsYWNlICE9IHBsYWNlKSB7Ci0gICAgICAgICAgICBpZiAobGVmdHBsYWNlLm5TZWNJbmRleCAhPSBwbGFjZS5uU2VjSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBpZiAocFNlY3Rpb24tPm1fV29yZEFycmF5LkdldFNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMtPkNsZWFyRW1wdHlTZWN0aW9uKHBsYWNlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aGlzLT5MaW5rTGF0dGVyU2VjdGlvbihsZWZ0cGxhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcFNlY3Rpb24tPkNsZWFyV29yZChwbGFjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxlZnRwbGFjZTsKLSAgICB9Ci0gICAgcmV0dXJuIHBsYWNlOwotfQotQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkNsZWFyUmlnaHRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpCi17Ci0gICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7Ci0gICAgICAgIENQVlRfV29yZFBsYWNlIHJpZ2h0cGxhY2UgPSBBanVzdExpbmVIZWFkZXIodGhpcy0+R2V0TmV4dFdvcmRQbGFjZShwbGFjZSksIEZBTFNFKTsKLSAgICAgICAgaWYgKHJpZ2h0cGxhY2UgIT0gcGxhY2UpIHsKLSAgICAgICAgICAgIGlmKHJpZ2h0cGxhY2UublNlY0luZGV4ICE9IHBsYWNlLm5TZWNJbmRleCkgewotICAgICAgICAgICAgICAgIExpbmtMYXR0ZXJTZWN0aW9uKHBsYWNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcFNlY3Rpb24tPkNsZWFyV29yZChyaWdodHBsYWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcGxhY2U7Ci19Ci12b2lkIENQREZfVmFyaWFibGVUZXh0OjpSZWFycmFuZ2VBbGwoKQotewotICAgIFJlYXJyYW5nZShDUFZUX1dvcmRSYW5nZShHZXRCZWdpbldvcmRQbGFjZSgpLCBHZXRFbmRXb3JkUGxhY2UoKSkpOwotfQotdm9pZCBDUERGX1ZhcmlhYmxlVGV4dDo6UmVhcnJhbmdlUGFydChjb25zdCBDUFZUX1dvcmRSYW5nZSAmIFBsYWNlUmFuZ2UpCi17Ci0gICAgUmVhcnJhbmdlKFBsYWNlUmFuZ2UpOwotfQotQ1BWVF9GbG9hdFJlY3QgQ1BERl9WYXJpYWJsZVRleHQ6OlJlYXJyYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSAmIFBsYWNlUmFuZ2UpCi17Ci0gICAgQ1BWVF9GbG9hdFJlY3QgcmNSZXQ7Ci0gICAgaWYgKElzVmFsaWQoKSkgewotICAgICAgICBpZiAobV9iQXV0b0ZvbnRTaXplKSB7Ci0gICAgICAgICAgICBTZXRGb250U2l6ZShHZXRBdXRvRm9udFNpemUoKSk7Ci0gICAgICAgICAgICByY1JldCA9IFJlYXJyYW5nZVNlY3Rpb25zKENQVlRfV29yZFJhbmdlKEdldEJlZ2luV29yZFBsYWNlKCksIEdldEVuZFdvcmRQbGFjZSgpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByY1JldCA9IFJlYXJyYW5nZVNlY3Rpb25zKFBsYWNlUmFuZ2UpOwotICAgICAgICB9Ci0gICAgfQotICAgIFNldENvbnRlbnRSZWN0KHJjUmV0KTsKLSAgICByZXR1cm4gcmNSZXQ7Ci19Ci1GWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0QXV0b0ZvbnRTaXplKCkKLXsKLSAgICBGWF9JTlQzMiBuVG90YWwgPSBzaXplb2YoZ0ZvbnRTaXplU3RlcHMpIC8gc2l6ZW9mKEZYX0JZVEUpOwotICAgIGlmIChJc011bHRpTGluZSgpKSB7Ci0gICAgICAgIG5Ub3RhbCAvPSA0OwotICAgIH0KLSAgICBpZiAoblRvdGFsIDw9IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChHZXRQbGF0ZVdpZHRoKCkgPD0gMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgRlhfSU5UMzIgbkxlZnQgPSAwOwotICAgIEZYX0lOVDMyIG5SaWdodCA9IG5Ub3RhbCAtIDE7Ci0gICAgRlhfSU5UMzIgbk1pZCA9IG5Ub3RhbCAvIDI7Ci0gICAgd2hpbGUgKG5MZWZ0IDw9IG5SaWdodCkgewotICAgICAgICBpZiAoSXNCaWdnZXIoZ0ZvbnRTaXplU3RlcHNbbk1pZF0pKSB7Ci0gICAgICAgICAgICBuUmlnaHQgPSBuTWlkIC0gMTsKLSAgICAgICAgICAgIG5NaWQgPSAobkxlZnQgKyBuUmlnaHQpIC8gMjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbkxlZnQgPSBuTWlkICsgMTsKLSAgICAgICAgICAgIG5NaWQgPSAobkxlZnQgKyBuUmlnaHQpIC8gMjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoRlhfRkxPQVQpZ0ZvbnRTaXplU3RlcHNbbk1pZF07Ci19Ci1GWF9CT09MCUNQREZfVmFyaWFibGVUZXh0OjpJc0JpZ2dlcihGWF9GTE9BVCBmRm9udFNpemUpCi17Ci0gICAgRlhfQk9PTCBiQmlnZ2VyID0gIEZBTFNFOwotICAgIENQVlRfU2l6ZSBzelRvdGFsOwotICAgIGZvciAoRlhfSU5UMzIgcyA9IDAsIHN6ID0gbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpOyBzIDwgc3o7IHMrKykgewotICAgICAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHMpKSB7Ci0gICAgICAgICAgICBDUFZUX1NpemUgc2l6ZSA9IHBTZWN0aW9uLT5HZXRTZWN0aW9uU2l6ZShmRm9udFNpemUpOwotICAgICAgICAgICAgc3pUb3RhbC54ID0gRlBERl9NQVgoc2l6ZS54LCBzelRvdGFsLngpOwotICAgICAgICAgICAgc3pUb3RhbC55ICs9IHNpemUueTsKLSAgICAgICAgICAgIGlmIChJc0Zsb2F0QmlnZ2VyKHN6VG90YWwueCwgR2V0UGxhdGVXaWR0aCgpKQotICAgICAgICAgICAgICAgICAgICB8fCBJc0Zsb2F0QmlnZ2VyKHN6VG90YWwueSwgR2V0UGxhdGVIZWlnaHQoKSkKLSAgICAgICAgICAgICAgICkgewotICAgICAgICAgICAgICAgIGJCaWdnZXIgPSBUUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBiQmlnZ2VyOwotfQotQ1BWVF9GbG9hdFJlY3QgQ1BERl9WYXJpYWJsZVRleHQ6OlJlYXJyYW5nZVNlY3Rpb25zKGNvbnN0IENQVlRfV29yZFJhbmdlICYgUGxhY2VSYW5nZSkKLXsKICAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZTsKLSAgICBGWF9GTE9BVCBmUG9zWSA9IDA7Ci0gICAgRlhfRkxPQVQgZk9sZEhlaWdodDsKLSAgICBGWF9JTlQzMiBuU1NlY0luZGV4ID0gUGxhY2VSYW5nZS5CZWdpblBvcy5uU2VjSW5kZXg7Ci0gICAgRlhfSU5UMzIgbkVTZWNJbmRleCA9IFBsYWNlUmFuZ2UuRW5kUG9zLm5TZWNJbmRleDsKLSAgICBDUFZUX0Zsb2F0UmVjdCByY1JldDsKLSAgICBmb3IgKEZYX0lOVDMyIHMgPSAwLCBzeiA9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKTsgcyA8IHN6OyBzKyspIHsKLSAgICAgICAgcGxhY2UublNlY0luZGV4ID0gczsKLSAgICAgICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChzKSkgewotICAgICAgICAgICAgcFNlY3Rpb24tPlNlY1BsYWNlID0gcGxhY2U7Ci0gICAgICAgICAgICBDUFZUX0Zsb2F0UmVjdCByY1NlYyA9IHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uOwotICAgICAgICAgICAgaWYgKHMgPj0gblNTZWNJbmRleCkgewotICAgICAgICAgICAgICAgIGlmIChzIDw9IG5FU2VjSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmNTZWMgPSBwU2VjdGlvbi0+UmVhcnJhbmdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJjU2VjLnRvcCArPSBmUG9zWTsKLSAgICAgICAgICAgICAgICAgICAgcmNTZWMuYm90dG9tICs9IGZQb3NZOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZPbGRIZWlnaHQgPSBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbi5ib3R0b20gLSBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbi50b3A7Ci0gICAgICAgICAgICAgICAgICAgIHJjU2VjLnRvcCA9IGZQb3NZOwotICAgICAgICAgICAgICAgICAgICByY1NlYy5ib3R0b20gPSBmUG9zWSArIGZPbGRIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uID0gcmNTZWM7Ci0gICAgICAgICAgICAgICAgcFNlY3Rpb24tPlJlc2V0TGluZVBsYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmNSZXQgPSByY1NlYzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmNSZXQubGVmdCA9IEZQREZfTUlOKHJjU2VjLmxlZnQsIHJjUmV0LmxlZnQpOwotICAgICAgICAgICAgICAgIHJjUmV0LnRvcCA9IEZQREZfTUlOKHJjU2VjLnRvcCwgcmNSZXQudG9wKTsKLSAgICAgICAgICAgICAgICByY1JldC5yaWdodCA9IEZQREZfTUFYKHJjU2VjLnJpZ2h0LCByY1JldC5yaWdodCk7Ci0gICAgICAgICAgICAgICAgcmNSZXQuYm90dG9tID0gRlBERl9NQVgocmNTZWMuYm90dG9tLCByY1JldC5ib3R0b20pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZlBvc1kgKz0gcmNTZWMuSGVpZ2h0KCk7Ci0gICAgICAgIH0KKyAgICBwbGFjZS5uU2VjSW5kZXggPSAwOworICAgIEFkZFNlY3Rpb24ocGxhY2UsIHNlY2luZm8pOworICAgIENQVlRfTGluZUluZm8gbGluZWluZm87CisgICAgbGluZWluZm8uZkxpbmVBc2NlbnQgPSBHZXRGb250QXNjZW50KEdldERlZmF1bHRGb250SW5kZXgoKSwgR2V0Rm9udFNpemUoKSk7CisgICAgbGluZWluZm8uZkxpbmVEZXNjZW50ID0KKyAgICAgICAgR2V0Rm9udERlc2NlbnQoR2V0RGVmYXVsdEZvbnRJbmRleCgpLCBHZXRGb250U2l6ZSgpKTsKKyAgICBBZGRMaW5lKHBsYWNlLCBsaW5laW5mbyk7CisgICAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KDApKSB7CisgICAgICBwU2VjdGlvbi0+UmVzZXRMaW5lUGxhY2UoKTsKICAgICB9Ci0gICAgcmV0dXJuIHJjUmV0OworICAgIG1fYkluaXRpYWwgPSBUUlVFOworICB9CiB9Ci1GWF9JTlQzMiBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0Q2hhcldpZHRoKEZYX0lOVDMyIG5Gb250SW5kZXgsIEZYX1dPUkQgV29yZCwgRlhfV09SRCBTdWJXb3JkLCBGWF9JTlQzMiBuV29yZFN0eWxlKQotewotICAgIGlmIChtX3BWVFByb3ZpZGVyKSB7Ci0gICAgICAgIGlmIChTdWJXb3JkID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIG1fcFZUUHJvdmlkZXItPkdldENoYXJXaWR0aChuRm9udEluZGV4LCBTdWJXb3JkLCBuV29yZFN0eWxlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBtX3BWVFByb3ZpZGVyLT5HZXRDaGFyV2lkdGgobkZvbnRJbmRleCwgV29yZCwgbldvcmRTdHlsZSk7Ci0gICAgICAgIH0KK3ZvaWQgQ1BERl9WYXJpYWJsZVRleHQ6OlJlc2V0QWxsKCkgeworICBtX2JJbml0aWFsID0gRkFMU0U7CisgIFJlc2V0U2VjdGlvbkFycmF5KCk7Cit9CitDUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6SW5zZXJ0V29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcykgeworICBpbnQzMl90IG5Ub3RsYVdvcmRzID0gR2V0VG90YWxXb3JkcygpOworICBpZiAobV9uTGltaXRDaGFyID4gMCAmJiBuVG90bGFXb3JkcyA+PSBtX25MaW1pdENoYXIpIHsKKyAgICByZXR1cm4gcGxhY2U7CisgIH0KKyAgaWYgKG1fbkNoYXJBcnJheSA+IDAgJiYgblRvdGxhV29yZHMgPj0gbV9uQ2hhckFycmF5KSB7CisgICAgcmV0dXJuIHBsYWNlOworICB9CisgIENQVlRfV29yZFBsYWNlIG5ld3BsYWNlID0gcGxhY2U7CisgIG5ld3BsYWNlLm5Xb3JkSW5kZXgrKzsKKyAgaWYgKG1fYlJpY2hUZXh0KSB7CisgICAgQ1BWVF9Xb3JkUHJvcHMqIHBOZXdQcm9wcyA9CisgICAgICAgIHBXb3JkUHJvcHMgPyBuZXcgQ1BWVF9Xb3JkUHJvcHMoKnBXb3JkUHJvcHMpIDogbmV3IENQVlRfV29yZFByb3BzKCk7CisgICAgcE5ld1Byb3BzLT5uRm9udEluZGV4ID0KKyAgICAgICAgR2V0V29yZEZvbnRJbmRleCh3b3JkLCBjaGFyc2V0LCBwV29yZFByb3BzLT5uRm9udEluZGV4KTsKKyAgICByZXR1cm4gQWRkV29yZChuZXdwbGFjZSwgQ1BWVF9Xb3JkSW5mbyh3b3JkLCBjaGFyc2V0LCAtMSwgcE5ld1Byb3BzKSk7CisgIH0KKyAgaW50MzJfdCBuRm9udEluZGV4ID0KKyAgICAgIEdldFN1YldvcmQoKSA+IDAgPyBHZXREZWZhdWx0Rm9udEluZGV4KCkKKyAgICAgICAgICAgICAgICAgICAgICAgOiBHZXRXb3JkRm9udEluZGV4KHdvcmQsIGNoYXJzZXQsIEdldERlZmF1bHRGb250SW5kZXgoKSk7CisgIHJldHVybiBBZGRXb3JkKG5ld3BsYWNlLCBDUFZUX1dvcmRJbmZvKHdvcmQsIGNoYXJzZXQsIG5Gb250SW5kZXgsIE5VTEwpKTsKK30KK0NQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpJbnNlcnRTZWN0aW9uKAorICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICBjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMsCisgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMpIHsKKyAgaW50MzJfdCBuVG90bGFXb3JkcyA9IEdldFRvdGFsV29yZHMoKTsKKyAgaWYgKG1fbkxpbWl0Q2hhciA+IDAgJiYgblRvdGxhV29yZHMgPj0gbV9uTGltaXRDaGFyKSB7CisgICAgcmV0dXJuIHBsYWNlOworICB9CisgIGlmIChtX25DaGFyQXJyYXkgPiAwICYmIG5Ub3RsYVdvcmRzID49IG1fbkNoYXJBcnJheSkgeworICAgIHJldHVybiBwbGFjZTsKKyAgfQorICBpZiAoIW1fYk11bHRpTGluZSkgeworICAgIHJldHVybiBwbGFjZTsKKyAgfQorICBDUFZUX1dvcmRQbGFjZSB3b3JkcGxhY2UgPSBwbGFjZTsKKyAgVXBkYXRlV29yZFBsYWNlKHdvcmRwbGFjZSk7CisgIENQVlRfV29yZFBsYWNlIG5ld3BsYWNlID0gcGxhY2U7CisgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdCh3b3JkcGxhY2UublNlY0luZGV4KSkgeworICAgIENQVlRfV29yZFBsYWNlIE5ld1BsYWNlKHdvcmRwbGFjZS5uU2VjSW5kZXggKyAxLCAwLCAtMSk7CisgICAgQ1BWVF9TZWN0aW9uSW5mbyBzZWNpbmZvOworICAgIGlmIChtX2JSaWNoVGV4dCkgeworICAgICAgaWYgKHBTZWNQcm9wcykgeworICAgICAgICBzZWNpbmZvLnBTZWNQcm9wcyA9IG5ldyBDUFZUX1NlY1Byb3BzKCpwU2VjUHJvcHMpOworICAgICAgfQorICAgICAgaWYgKHBXb3JkUHJvcHMpIHsKKyAgICAgICAgc2VjaW5mby5wV29yZFByb3BzID0gbmV3IENQVlRfV29yZFByb3BzKCpwV29yZFByb3BzKTsKKyAgICAgIH0KICAgICB9CisgICAgQWRkU2VjdGlvbihOZXdQbGFjZSwgc2VjaW5mbyk7CisgICAgbmV3cGxhY2UgPSBOZXdQbGFjZTsKKyAgICBpZiAoQ1NlY3Rpb24qIHBOZXdTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQoTmV3UGxhY2UublNlY0luZGV4KSkgeworICAgICAgZm9yIChpbnQzMl90IHcgPSB3b3JkcGxhY2UubldvcmRJbmRleCArIDEsCisgICAgICAgICAgICAgICAgICAgc3ogPSBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpOworICAgICAgICAgICB3IDwgc3o7IHcrKykgeworICAgICAgICBpZiAoQ1BWVF9Xb3JkSW5mbyogcFdvcmQgPSBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0QXQodykpIHsKKyAgICAgICAgICBOZXdQbGFjZS5uV29yZEluZGV4Kys7CisgICAgICAgICAgcE5ld1NlY3Rpb24tPkFkZFdvcmQoTmV3UGxhY2UsICpwV29yZCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgQ2xlYXJTZWN0aW9uUmlnaHRXb3Jkcyh3b3JkcGxhY2UpOworICB9CisgIHJldHVybiBuZXdwbGFjZTsKK30KK0NQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpJbnNlcnRUZXh0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBQcm9wcykgeworICBDRlhfV2lkZVN0cmluZyBzd1RleHQgPSB0ZXh0OworICBDUFZUX1dvcmRQbGFjZSB3cCA9IHBsYWNlOworICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gc3dUZXh0LkdldExlbmd0aCgpOyBpIDwgc3o7IGkrKykgeworICAgIENQVlRfV29yZFBsYWNlIG9sZHdwID0gd3A7CisgICAgRlhfV09SRCB3b3JkID0gc3dUZXh0LkdldEF0KGkpOworICAgIHN3aXRjaCAod29yZCkgeworICAgICAgY2FzZSAweDBEOgorICAgICAgICBpZiAobV9iTXVsdGlMaW5lKSB7CisgICAgICAgICAgaWYgKHN3VGV4dC5HZXRBdChpICsgMSkgPT0gMHgwQSkgeworICAgICAgICAgICAgaSArPSAxOworICAgICAgICAgIH0KKyAgICAgICAgICB3cCA9IEluc2VydFNlY3Rpb24od3AsIHBTZWNQcm9wcywgcFByb3BzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMHgwQToKKyAgICAgICAgaWYgKG1fYk11bHRpTGluZSkgeworICAgICAgICAgIGlmIChzd1RleHQuR2V0QXQoaSArIDEpID09IDB4MEQpIHsKKyAgICAgICAgICAgIGkgKz0gMTsKKyAgICAgICAgICB9CisgICAgICAgICAgd3AgPSBJbnNlcnRTZWN0aW9uKHdwLCBwU2VjUHJvcHMsIHBQcm9wcyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDB4MDk6CisgICAgICAgIHdvcmQgPSAweDIwOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgd3AgPSBJbnNlcnRXb3JkKHdwLCB3b3JkLCBjaGFyc2V0LCBwUHJvcHMpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHdwID09IG9sZHdwKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHdwOworfQorQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkRlbGV0ZVdvcmRzKAorICAgIGNvbnN0IENQVlRfV29yZFJhbmdlJiBQbGFjZVJhbmdlKSB7CisgIEZYX0JPT0wgYkxhc3RTZWNQb3MgPSBGQUxTRTsKKyAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KFBsYWNlUmFuZ2UuRW5kUG9zLm5TZWNJbmRleCkpIHsKKyAgICBiTGFzdFNlY1BvcyA9IChQbGFjZVJhbmdlLkVuZFBvcyA9PSBwU2VjdGlvbi0+R2V0RW5kV29yZFBsYWNlKCkpOworICB9CisgIENsZWFyV29yZHMoUGxhY2VSYW5nZSk7CisgIGlmIChQbGFjZVJhbmdlLkJlZ2luUG9zLm5TZWNJbmRleCAhPSBQbGFjZVJhbmdlLkVuZFBvcy5uU2VjSW5kZXgpIHsKKyAgICBDbGVhckVtcHR5U2VjdGlvbnMoUGxhY2VSYW5nZSk7CisgICAgaWYgKCFiTGFzdFNlY1BvcykgeworICAgICAgTGlua0xhdHRlclNlY3Rpb24oUGxhY2VSYW5nZS5CZWdpblBvcyk7CisgICAgfQorICB9CisgIHJldHVybiBQbGFjZVJhbmdlLkJlZ2luUG9zOworfQorQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkRlbGV0ZVdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSB7CisgIHJldHVybiBDbGVhclJpZ2h0V29yZChBZGp1c3RMaW5lSGVhZGVyKHBsYWNlLCBUUlVFKSk7Cit9CitDUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6QmFja1NwYWNlV29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIHsKKyAgcmV0dXJuIENsZWFyTGVmdFdvcmQoQWRqdXN0TGluZUhlYWRlcihwbGFjZSwgVFJVRSkpOworfQordm9pZCBDUERGX1ZhcmlhYmxlVGV4dDo6U2V0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzKSB7CisgIERlbGV0ZVdvcmRzKENQVlRfV29yZFJhbmdlKEdldEJlZ2luV29yZFBsYWNlKCksIEdldEVuZFdvcmRQbGFjZSgpKSk7CisgIENGWF9XaWRlU3RyaW5nIHN3VGV4dCA9IHRleHQ7CisgIENQVlRfV29yZFBsYWNlIHdwKDAsIDAsIC0xKTsKKyAgQ1BWVF9TZWN0aW9uSW5mbyBzZWNpbmZvOworICBpZiAobV9iUmljaFRleHQpIHsKKyAgICBpZiAocFNlY1Byb3BzKSB7CisgICAgICBzZWNpbmZvLnBTZWNQcm9wcyA9IG5ldyBDUFZUX1NlY1Byb3BzKCpwU2VjUHJvcHMpOworICAgIH0KKyAgICBpZiAocFdvcmRQcm9wcykgeworICAgICAgc2VjaW5mby5wV29yZFByb3BzID0gbmV3IENQVlRfV29yZFByb3BzKCpwV29yZFByb3BzKTsKKyAgICB9CisgIH0KKyAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KDApKSB7CisgICAgcFNlY3Rpb24tPm1fU2VjSW5mbyA9IHNlY2luZm87CisgIH0KKyAgaW50MzJfdCBuQ2hhckNvdW50ID0gMDsKKyAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IHN3VGV4dC5HZXRMZW5ndGgoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAobV9uTGltaXRDaGFyID4gMCAmJiBuQ2hhckNvdW50ID49IG1fbkxpbWl0Q2hhcikgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChtX25DaGFyQXJyYXkgPiAwICYmIG5DaGFyQ291bnQgPj0gbV9uQ2hhckFycmF5KSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgRlhfV09SRCB3b3JkID0gc3dUZXh0LkdldEF0KGkpOworICAgIHN3aXRjaCAod29yZCkgeworICAgICAgY2FzZSAweDBEOgorICAgICAgICBpZiAobV9iTXVsdGlMaW5lKSB7CisgICAgICAgICAgaWYgKHN3VGV4dC5HZXRBdChpICsgMSkgPT0gMHgwQSkgeworICAgICAgICAgICAgaSArPSAxOworICAgICAgICAgIH0KKyAgICAgICAgICB3cC5uU2VjSW5kZXgrKzsKKyAgICAgICAgICB3cC5uTGluZUluZGV4ID0gMDsKKyAgICAgICAgICB3cC5uV29yZEluZGV4ID0gLTE7CisgICAgICAgICAgQWRkU2VjdGlvbih3cCwgc2VjaW5mbyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDB4MEE6CisgICAgICAgIGlmIChtX2JNdWx0aUxpbmUpIHsKKyAgICAgICAgICBpZiAoc3dUZXh0LkdldEF0KGkgKyAxKSA9PSAweDBEKSB7CisgICAgICAgICAgICBpICs9IDE7CisgICAgICAgICAgfQorICAgICAgICAgIHdwLm5TZWNJbmRleCsrOworICAgICAgICAgIHdwLm5MaW5lSW5kZXggPSAwOworICAgICAgICAgIHdwLm5Xb3JkSW5kZXggPSAtMTsKKyAgICAgICAgICBBZGRTZWN0aW9uKHdwLCBzZWNpbmZvKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMHgwOToKKyAgICAgICAgd29yZCA9IDB4MjA7CisgICAgICBkZWZhdWx0OgorICAgICAgICB3cCA9IEluc2VydFdvcmQod3AsIHdvcmQsIGNoYXJzZXQsIHBXb3JkUHJvcHMpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgbkNoYXJDb3VudCsrOworICB9Cit9Cit2b2lkIENQREZfVmFyaWFibGVUZXh0OjpVcGRhdGVXb3JkUGxhY2UoQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCB7CisgIGlmIChwbGFjZS5uU2VjSW5kZXggPCAwKSB7CisgICAgcGxhY2UgPSBHZXRCZWdpbldvcmRQbGFjZSgpOworICB9CisgIGlmIChwbGFjZS5uU2VjSW5kZXggPj0gbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpKSB7CisgICAgcGxhY2UgPSBHZXRFbmRXb3JkUGxhY2UoKTsKKyAgfQorICBwbGFjZSA9IEFkanVzdExpbmVIZWFkZXIocGxhY2UsIFRSVUUpOworICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgeworICAgIHBTZWN0aW9uLT5VcGRhdGVXb3JkUGxhY2UocGxhY2UpOworICB9Cit9CitpbnQzMl90IENQREZfVmFyaWFibGVUZXh0OjpXb3JkUGxhY2VUb1dvcmRJbmRleCgKKyAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IHsKKyAgQ1BWVF9Xb3JkUGxhY2UgbmV3cGxhY2UgPSBwbGFjZTsKKyAgVXBkYXRlV29yZFBsYWNlKG5ld3BsYWNlKTsKKyAgaW50MzJfdCBuSW5kZXggPSAwOworICBpbnQzMl90IGkgPSAwOworICBpbnQzMl90IHN6ID0gMDsKKyAgZm9yIChpID0gMCwgc3ogPSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCk7IGkgPCBzeiAmJiBpIDwgbmV3cGxhY2UublNlY0luZGV4OworICAgICAgIGkrKykgeworICAgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChpKSkgeworICAgICAgbkluZGV4ICs9IHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCk7CisgICAgICBpZiAoaSAhPSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgLSAxKSB7CisgICAgICAgIG5JbmRleCArPSBQVlRfUkVUVVJOX0xFTkdUSDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKGkgPj0gMCAmJiBpIDwgbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpKSB7CisgICAgbkluZGV4ICs9IG5ld3BsYWNlLm5Xb3JkSW5kZXggKyBQVlRfUkVUVVJOX0xFTkdUSDsKKyAgfQorICByZXR1cm4gbkluZGV4OworfQorQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OldvcmRJbmRleFRvV29yZFBsYWNlKGludDMyX3QgaW5kZXgpIGNvbnN0IHsKKyAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBHZXRCZWdpbldvcmRQbGFjZSgpOworICBpbnQzMl90IG5PbGRJbmRleCA9IDAsIG5JbmRleCA9IDA7CisgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKKyAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQoaSkpIHsKKyAgICAgIG5JbmRleCArPSBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpOworICAgICAgaWYgKG5JbmRleCA9PSBpbmRleCkgeworICAgICAgICBwbGFjZSA9IHBTZWN0aW9uLT5HZXRFbmRXb3JkUGxhY2UoKTsKKyAgICAgICAgYkZpbmQgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSBpZiAobkluZGV4ID4gaW5kZXgpIHsKKyAgICAgICAgcGxhY2UublNlY0luZGV4ID0gaTsKKyAgICAgICAgcGxhY2UubldvcmRJbmRleCA9IGluZGV4IC0gbk9sZEluZGV4IC0gMTsKKyAgICAgICAgcFNlY3Rpb24tPlVwZGF0ZVdvcmRQbGFjZShwbGFjZSk7CisgICAgICAgIGJGaW5kID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoaSAhPSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgLSAxKSB7CisgICAgICAgIG5JbmRleCArPSBQVlRfUkVUVVJOX0xFTkdUSDsKKyAgICAgIH0KKyAgICAgIG5PbGRJbmRleCA9IG5JbmRleDsKKyAgICB9CisgIH0KKyAgaWYgKCFiRmluZCkgeworICAgIHBsYWNlID0gR2V0RW5kV29yZFBsYWNlKCk7CisgIH0KKyAgcmV0dXJuIHBsYWNlOworfQorQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkdldEJlZ2luV29yZFBsYWNlKCkgY29uc3QgeworICByZXR1cm4gbV9iSW5pdGlhbCA/IENQVlRfV29yZFBsYWNlKDAsIDAsIC0xKSA6IENQVlRfV29yZFBsYWNlKCk7Cit9CitDUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0RW5kV29yZFBsYWNlKCkgY29uc3QgeworICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQobV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpIC0gMSkpIHsKKyAgICByZXR1cm4gcFNlY3Rpb24tPkdldEVuZFdvcmRQbGFjZSgpOworICB9CisgIHJldHVybiBDUFZUX1dvcmRQbGFjZSgpOworfQorQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFByZXZXb3JkUGxhY2UoCisgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCB7CisgIGlmIChwbGFjZS5uU2VjSW5kZXggPCAwKSB7CisgICAgcmV0dXJuIEdldEJlZ2luV29yZFBsYWNlKCk7CisgIH0KKyAgaWYgKHBsYWNlLm5TZWNJbmRleCA+PSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkpIHsKKyAgICByZXR1cm4gR2V0RW5kV29yZFBsYWNlKCk7CisgIH0KKyAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKKyAgICBpZiAocGxhY2UuV29yZENtcChwU2VjdGlvbi0+R2V0QmVnaW5Xb3JkUGxhY2UoKSkgPD0gMCkgeworICAgICAgaWYgKENTZWN0aW9uKiBwUHJldlNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXggLSAxKSkgeworICAgICAgICByZXR1cm4gcFByZXZTZWN0aW9uLT5HZXRFbmRXb3JkUGxhY2UoKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBHZXRCZWdpbldvcmRQbGFjZSgpOworICAgIH0KKyAgICByZXR1cm4gcFNlY3Rpb24tPkdldFByZXZXb3JkUGxhY2UocGxhY2UpOworICB9CisgIHJldHVybiBwbGFjZTsKK30KK0NQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpHZXROZXh0V29yZFBsYWNlKAorICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgeworICBpZiAocGxhY2UublNlY0luZGV4IDwgMCkgeworICAgIHJldHVybiBHZXRCZWdpbldvcmRQbGFjZSgpOworICB9CisgIGlmIChwbGFjZS5uU2VjSW5kZXggPj0gbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpKSB7CisgICAgcmV0dXJuIEdldEVuZFdvcmRQbGFjZSgpOworICB9CisgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7CisgICAgaWYgKHBsYWNlLldvcmRDbXAocFNlY3Rpb24tPkdldEVuZFdvcmRQbGFjZSgpKSA+PSAwKSB7CisgICAgICBpZiAoQ1NlY3Rpb24qIHBOZXh0U2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCArIDEpKSB7CisgICAgICAgIHJldHVybiBwTmV4dFNlY3Rpb24tPkdldEJlZ2luV29yZFBsYWNlKCk7CisgICAgICB9CisgICAgICByZXR1cm4gR2V0RW5kV29yZFBsYWNlKCk7CisgICAgfQorICAgIHJldHVybiBwU2VjdGlvbi0+R2V0TmV4dFdvcmRQbGFjZShwbGFjZSk7CisgIH0KKyAgcmV0dXJuIHBsYWNlOworfQorQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OlNlYXJjaFdvcmRQbGFjZSgKKyAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3QgeworICBDUERGX1BvaW50IHB0ID0gT3V0VG9Jbihwb2ludCk7CisgIENQVlRfV29yZFBsYWNlIHBsYWNlID0gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKKyAgaW50MzJfdCBuTGVmdCA9IDA7CisgIGludDMyX3QgblJpZ2h0ID0gbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpIC0gMTsKKyAgaW50MzJfdCBuTWlkID0gbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpIC8gMjsKKyAgRlhfQk9PTCBiVXAgPSBUUlVFOworICBGWF9CT09MIGJEb3duID0gVFJVRTsKKyAgd2hpbGUgKG5MZWZ0IDw9IG5SaWdodCkgeworICAgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChuTWlkKSkgeworICAgICAgaWYgKElzRmxvYXRCaWdnZXIocHQueSwgcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24udG9wKSkgeworICAgICAgICBiVXAgPSBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGlmIChJc0Zsb2F0QmlnZ2VyKHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLmJvdHRvbSwgcHQueSkpIHsKKyAgICAgICAgYkRvd24gPSBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGlmIChJc0Zsb2F0U21hbGxlcihwdC55LCBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbi50b3ApKSB7CisgICAgICAgIG5SaWdodCA9IG5NaWQgLSAxOworICAgICAgICBuTWlkID0gKG5MZWZ0ICsgblJpZ2h0KSAvIDI7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlIGlmIChJc0Zsb2F0QmlnZ2VyKHB0LnksIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLmJvdHRvbSkpIHsKKyAgICAgICAgbkxlZnQgPSBuTWlkICsgMTsKKyAgICAgICAgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBsYWNlID0gcFNlY3Rpb24tPlNlYXJjaFdvcmRQbGFjZSgKKyAgICAgICAgICAgIENQREZfUG9pbnQocHQueCAtIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgIHB0LnkgLSBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbi50b3ApKTsKKyAgICAgICAgcGxhY2UublNlY0luZGV4ID0gbk1pZDsKKyAgICAgICAgcmV0dXJuIHBsYWNlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKGJVcCkgeworICAgIHBsYWNlID0gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKKyAgfQorICBpZiAoYkRvd24pIHsKKyAgICBwbGFjZSA9IEdldEVuZFdvcmRQbGFjZSgpOworICB9CisgIHJldHVybiBwbGFjZTsKK30KK0NQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpHZXRVcFdvcmRQbGFjZSgKKyAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0IHsKKyAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKKyAgICBDUFZUX1dvcmRQbGFjZSB0ZW1wID0gcGxhY2U7CisgICAgQ1BERl9Qb2ludCBwdCA9IE91dFRvSW4ocG9pbnQpOworICAgIGlmICh0ZW1wLm5MaW5lSW5kZXgtLSA+IDApIHsKKyAgICAgIHJldHVybiBwU2VjdGlvbi0+U2VhcmNoV29yZFBsYWNlKAorICAgICAgICAgIHB0LnggLSBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbi5sZWZ0LCB0ZW1wKTsKKyAgICB9CisgICAgaWYgKHRlbXAublNlY0luZGV4LS0gPiAwKSB7CisgICAgICBpZiAoQ1NlY3Rpb24qIHBMYXN0U2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHRlbXAublNlY0luZGV4KSkgeworICAgICAgICB0ZW1wLm5MaW5lSW5kZXggPSBwTGFzdFNlY3Rpb24tPm1fTGluZUFycmF5LkdldFNpemUoKSAtIDE7CisgICAgICAgIHJldHVybiBwTGFzdFNlY3Rpb24tPlNlYXJjaFdvcmRQbGFjZSgKKyAgICAgICAgICAgIHB0LnggLSBwTGFzdFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24ubGVmdCwgdGVtcCk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBwbGFjZTsKK30KK0NQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpHZXREb3duV29yZFBsYWNlKAorICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3QgeworICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgeworICAgIENQVlRfV29yZFBsYWNlIHRlbXAgPSBwbGFjZTsKKyAgICBDUERGX1BvaW50IHB0ID0gT3V0VG9Jbihwb2ludCk7CisgICAgaWYgKHRlbXAubkxpbmVJbmRleCsrIDwgcFNlY3Rpb24tPm1fTGluZUFycmF5LkdldFNpemUoKSAtIDEpIHsKKyAgICAgIHJldHVybiBwU2VjdGlvbi0+U2VhcmNoV29yZFBsYWNlKAorICAgICAgICAgIHB0LnggLSBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbi5sZWZ0LCB0ZW1wKTsKKyAgICB9CisgICAgaWYgKHRlbXAublNlY0luZGV4KysgPCBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgLSAxKSB7CisgICAgICBpZiAoQ1NlY3Rpb24qIHBOZXh0U2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHRlbXAublNlY0luZGV4KSkgeworICAgICAgICB0ZW1wLm5MaW5lSW5kZXggPSAwOworICAgICAgICByZXR1cm4gcE5leHRTZWN0aW9uLT5TZWFyY2hXb3JkUGxhY2UoCisgICAgICAgICAgICBwdC54IC0gcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24ubGVmdCwgdGVtcCk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBwbGFjZTsKK30KK0NQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpHZXRMaW5lQmVnaW5QbGFjZSgKKyAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IHsKKyAgcmV0dXJuIENQVlRfV29yZFBsYWNlKHBsYWNlLm5TZWNJbmRleCwgcGxhY2UubkxpbmVJbmRleCwgLTEpOworfQorQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkdldExpbmVFbmRQbGFjZSgKKyAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IHsKKyAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKKyAgICBpZiAoQ0xpbmUqIHBMaW5lID0gcFNlY3Rpb24tPm1fTGluZUFycmF5LkdldEF0KHBsYWNlLm5MaW5lSW5kZXgpKQorICAgICAgcmV0dXJuIHBMaW5lLT5HZXRFbmRXb3JkUGxhY2UoKTsKKyAgfQorICByZXR1cm4gcGxhY2U7Cit9CitDUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0U2VjdGlvbkJlZ2luUGxhY2UoCisgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCB7CisgIHJldHVybiBDUFZUX1dvcmRQbGFjZShwbGFjZS5uU2VjSW5kZXgsIDAsIC0xKTsKK30KK0NQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpHZXRTZWN0aW9uRW5kUGxhY2UoCisgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCB7CisgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7CisgICAgcmV0dXJuIHBTZWN0aW9uLT5HZXRFbmRXb3JkUGxhY2UoKTsKKyAgfQorICByZXR1cm4gcGxhY2U7Cit9CitpbnQzMl90IENQREZfVmFyaWFibGVUZXh0OjpHZXRUb3RhbFdvcmRzKCkgY29uc3QgeworICBpbnQzMl90IG5Ub3RhbCA9IDA7CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCk7IGkgPCBzejsgaSsrKQorICAgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChpKSkgeworICAgICAgblRvdGFsICs9IChwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpICsgUFZUX1JFVFVSTl9MRU5HVEgpOworICAgIH0KKyAgcmV0dXJuIG5Ub3RhbCAtIFBWVF9SRVRVUk5fTEVOR1RIOworfQordm9pZCBDUERGX1ZhcmlhYmxlVGV4dDo6UmVzZXRTZWN0aW9uQXJyYXkoKSB7CisgIGZvciAoaW50MzJfdCBzID0gMCwgc3ogPSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCk7IHMgPCBzejsgcysrKSB7CisgICAgZGVsZXRlIG1fU2VjdGlvbkFycmF5LkdldEF0KHMpOworICB9CisgIG1fU2VjdGlvbkFycmF5LlJlbW92ZUFsbCgpOworfQorQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkFkZFNlY3Rpb24oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyYgc2VjaW5mbykgeworICBpZiAoSXNWYWxpZCgpICYmICFtX2JNdWx0aUxpbmUpIHsKKyAgICByZXR1cm4gcGxhY2U7CisgIH0KKyAgaW50MzJfdCBuU2VjSW5kZXggPQorICAgICAgc3RkOjptYXgoc3RkOjptaW4ocGxhY2UublNlY0luZGV4LCBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkpLCAwKTsKKyAgQ1NlY3Rpb24qIHBTZWN0aW9uID0gbmV3IENTZWN0aW9uKHRoaXMpOworICBwU2VjdGlvbi0+bV9TZWNJbmZvID0gc2VjaW5mbzsKKyAgcFNlY3Rpb24tPlNlY1BsYWNlLm5TZWNJbmRleCA9IG5TZWNJbmRleDsKKyAgaWYgKG5TZWNJbmRleCA9PSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkpIHsKKyAgICBtX1NlY3Rpb25BcnJheS5BZGQocFNlY3Rpb24pOworICB9IGVsc2UgeworICAgIG1fU2VjdGlvbkFycmF5Lkluc2VydEF0KG5TZWNJbmRleCwgcFNlY3Rpb24pOworICB9CisgIHJldHVybiBwbGFjZTsKK30KK0NQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpBZGRMaW5lKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfTGluZUluZm8mIGxpbmVpbmZvKSB7CisgIGlmIChtX1NlY3Rpb25BcnJheS5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gcGxhY2U7CisgIH0KKyAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKKyAgICByZXR1cm4gcFNlY3Rpb24tPkFkZExpbmUobGluZWluZm8pOworICB9CisgIHJldHVybiBwbGFjZTsKK30KK0NQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpBZGRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZEluZm8mIHdvcmRpbmZvKSB7CisgIGlmIChtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgPD0gMCkgeworICAgIHJldHVybiBwbGFjZTsKKyAgfQorICBDUFZUX1dvcmRQbGFjZSBuZXdwbGFjZSA9IHBsYWNlOworICBuZXdwbGFjZS5uU2VjSW5kZXggPQorICAgICAgc3RkOjptYXgoc3RkOjptaW4obmV3cGxhY2UublNlY0luZGV4LCBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgLSAxKSwgMCk7CisgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChuZXdwbGFjZS5uU2VjSW5kZXgpKSB7CisgICAgcmV0dXJuIHBTZWN0aW9uLT5BZGRXb3JkKG5ld3BsYWNlLCB3b3JkaW5mbyk7CisgIH0KKyAgcmV0dXJuIHBsYWNlOworfQorRlhfQk9PTCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZEluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BWVF9Xb3JkSW5mbyYgd29yZGluZm8pIHsKKyAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKKyAgICBpZiAoQ1BWVF9Xb3JkSW5mbyogcFdvcmQgPSBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0QXQocGxhY2UubldvcmRJbmRleCkpIHsKKyAgICAgIHdvcmRpbmZvID0gKnBXb3JkOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIHJldHVybiBGQUxTRTsKK30KK0ZYX0JPT0wgQ1BERl9WYXJpYWJsZVRleHQ6OlNldFdvcmRJbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZEluZm8mIHdvcmRpbmZvKSB7CisgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7CisgICAgaWYgKENQVlRfV29yZEluZm8qIHBXb3JkID0gcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldEF0KHBsYWNlLm5Xb3JkSW5kZXgpKSB7CisgICAgICAqcFdvcmQgPSB3b3JkaW5mbzsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIENQREZfVmFyaWFibGVUZXh0OjpHZXRMaW5lSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFZUX0xpbmVJbmZvJiBsaW5laW5mbykgeworICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgeworICAgIGlmIChDTGluZSogcExpbmUgPSBwU2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0QXQocGxhY2UubkxpbmVJbmRleCkpIHsKKyAgICAgIGxpbmVpbmZvID0gcExpbmUtPm1fTGluZUluZm87CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorRlhfQk9PTCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0U2VjdGlvbkluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BWVF9TZWN0aW9uSW5mbyYgc2VjaW5mbykgeworICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgeworICAgIHNlY2luZm8gPSBwU2VjdGlvbi0+bV9TZWNJbmZvOworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKK30KK0NQREZfUmVjdCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0Q29udGVudFJlY3QoKSBjb25zdCB7CisgIHJldHVybiBJblRvT3V0KENQVlRfRmxvYXRSZWN0KENQREZfRWRpdENvbnRhaW5lcjo6R2V0Q29udGVudFJlY3QoKSkpOworfQorRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmRGb250U2l6ZShjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmFjdEZvbnRTaXplKSB7CisgIHJldHVybiBtX2JSaWNoVGV4dCAmJiBXb3JkSW5mby5wV29yZFByb3BzCisgICAgICAgICAgICAgPyAoV29yZEluZm8ucFdvcmRQcm9wcy0+blNjcmlwdFR5cGUgPT0gUFZUV09SRF9TQ1JJUFRfTk9STUFMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBiRmFjdEZvbnRTaXplCisgICAgICAgICAgICAgICAgICAgID8gV29yZEluZm8ucFdvcmRQcm9wcy0+ZkZvbnRTaXplCisgICAgICAgICAgICAgICAgICAgIDogV29yZEluZm8ucFdvcmRQcm9wcy0+ZkZvbnRTaXplICogUFZUX0hBTEYpCisgICAgICAgICAgICAgOiBHZXRGb250U2l6ZSgpOworfQoraW50MzJfdCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZEZvbnRJbmRleChjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbykgeworICByZXR1cm4gbV9iUmljaFRleHQgJiYgV29yZEluZm8ucFdvcmRQcm9wcyA/IFdvcmRJbmZvLnBXb3JkUHJvcHMtPm5Gb250SW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBXb3JkSW5mby5uRm9udEluZGV4OworfQorRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmRXaWR0aChpbnQzMl90IG5Gb250SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgV29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCBTdWJXb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ2hhclNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Ib3J6U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZldvcmRUYWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Xb3JkU3R5bGUpIHsKKyAgcmV0dXJuIChHZXRDaGFyV2lkdGgobkZvbnRJbmRleCwgV29yZCwgU3ViV29yZCwgbldvcmRTdHlsZSkgKiBmRm9udFNpemUgKgorICAgICAgICAgICAgICBQVlRfRk9OVFNDQUxFICsKKyAgICAgICAgICBmQ2hhclNwYWNlKSAqCisgICAgICAgICAgICAgbkhvcnpTY2FsZSAqIFBWVF9QRVJDRU5UICsKKyAgICAgICAgIGZXb3JkVGFpbDsKK30KK0ZYX0ZMT0FUIENQREZfVmFyaWFibGVUZXh0OjpHZXRXb3JkV2lkdGgoY29uc3QgQ1BWVF9Xb3JkSW5mbyYgV29yZEluZm8pIHsKKyAgcmV0dXJuIEdldFdvcmRXaWR0aCgKKyAgICAgIEdldFdvcmRGb250SW5kZXgoV29yZEluZm8pLCBXb3JkSW5mby5Xb3JkLCBHZXRTdWJXb3JkKCksCisgICAgICBHZXRDaGFyU3BhY2UoV29yZEluZm8pLCBHZXRIb3J6U2NhbGUoV29yZEluZm8pLCBHZXRXb3JkRm9udFNpemUoV29yZEluZm8pLAorICAgICAgV29yZEluZm8uZldvcmRUYWlsLAorICAgICAgV29yZEluZm8ucFdvcmRQcm9wcyA/IFdvcmRJbmZvLnBXb3JkUHJvcHMtPm5Xb3JkU3R5bGUgOiAwKTsKK30KK0ZYX0ZMT0FUIENQREZfVmFyaWFibGVUZXh0OjpHZXRMaW5lQXNjZW50KGNvbnN0IENQVlRfU2VjdGlvbkluZm8mIFNlY0luZm8pIHsKKyAgcmV0dXJuIG1fYlJpY2hUZXh0ICYmIFNlY0luZm8ucFdvcmRQcm9wcworICAgICAgICAgICAgID8gR2V0Rm9udEFzY2VudChTZWNJbmZvLnBXb3JkUHJvcHMtPm5Gb250SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY0luZm8ucFdvcmRQcm9wcy0+ZkZvbnRTaXplKQorICAgICAgICAgICAgIDogR2V0Rm9udEFzY2VudChHZXREZWZhdWx0Rm9udEluZGV4KCksIEdldEZvbnRTaXplKCkpOworfQorRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldExpbmVEZXNjZW50KGNvbnN0IENQVlRfU2VjdGlvbkluZm8mIFNlY0luZm8pIHsKKyAgcmV0dXJuIG1fYlJpY2hUZXh0ICYmIFNlY0luZm8ucFdvcmRQcm9wcworICAgICAgICAgICAgID8gR2V0Rm9udERlc2NlbnQoU2VjSW5mby5wV29yZFByb3BzLT5uRm9udEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjSW5mby5wV29yZFByb3BzLT5mRm9udFNpemUpCisgICAgICAgICAgICAgOiBHZXRGb250RGVzY2VudChHZXREZWZhdWx0Rm9udEluZGV4KCksIEdldEZvbnRTaXplKCkpOworfQorRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldEZvbnRBc2NlbnQoaW50MzJfdCBuRm9udEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplKSB7CisgIHJldHVybiAoRlhfRkxPQVQpR2V0VHlwZUFzY2VudChuRm9udEluZGV4KSAqIGZGb250U2l6ZSAqIFBWVF9GT05UU0NBTEU7Cit9CitGWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0Rm9udERlc2NlbnQoaW50MzJfdCBuRm9udEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSkgeworICByZXR1cm4gKEZYX0ZMT0FUKUdldFR5cGVEZXNjZW50KG5Gb250SW5kZXgpICogZkZvbnRTaXplICogUFZUX0ZPTlRTQ0FMRTsKK30KK0ZYX0ZMT0FUIENQREZfVmFyaWFibGVUZXh0OjpHZXRXb3JkQXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8mIFdvcmRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplKSB7CisgIHJldHVybiBHZXRGb250QXNjZW50KEdldFdvcmRGb250SW5kZXgoV29yZEluZm8pLCBmRm9udFNpemUpOworfQorRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmREZXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8mIFdvcmRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSkgeworICByZXR1cm4gR2V0Rm9udERlc2NlbnQoR2V0V29yZEZvbnRJbmRleChXb3JkSW5mbyksIGZGb250U2l6ZSk7Cit9CitGWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZEFzY2VudChjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZhY3RGb250U2l6ZSkgeworICByZXR1cm4gR2V0Rm9udEFzY2VudChHZXRXb3JkRm9udEluZGV4KFdvcmRJbmZvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgR2V0V29yZEZvbnRTaXplKFdvcmRJbmZvLCBiRmFjdEZvbnRTaXplKSk7Cit9CitGWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZERlc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyYgV29yZEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmFjdEZvbnRTaXplKSB7CisgIHJldHVybiBHZXRGb250RGVzY2VudChHZXRXb3JkRm9udEluZGV4KFdvcmRJbmZvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldFdvcmRGb250U2l6ZShXb3JkSW5mbywgYkZhY3RGb250U2l6ZSkpOworfQorRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldExpbmVMZWFkaW5nKGNvbnN0IENQVlRfU2VjdGlvbkluZm8mIFNlY0luZm8pIHsKKyAgcmV0dXJuIG1fYlJpY2hUZXh0ICYmIFNlY0luZm8ucFNlY1Byb3BzID8gU2VjSW5mby5wU2VjUHJvcHMtPmZMaW5lTGVhZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX2ZMaW5lTGVhZGluZzsKK30KK0ZYX0ZMT0FUIENQREZfVmFyaWFibGVUZXh0OjpHZXRMaW5lSW5kZW50KGNvbnN0IENQVlRfU2VjdGlvbkluZm8mIFNlY0luZm8pIHsKKyAgcmV0dXJuIG1fYlJpY2hUZXh0ICYmIFNlY0luZm8ucFNlY1Byb3BzID8gU2VjSW5mby5wU2VjUHJvcHMtPmZMaW5lSW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDAuMGY7Cit9CitpbnQzMl90IENQREZfVmFyaWFibGVUZXh0OjpHZXRBbGlnbm1lbnQoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyYgU2VjSW5mbykgeworICByZXR1cm4gbV9iUmljaFRleHQgJiYgU2VjSW5mby5wU2VjUHJvcHMgPyBTZWNJbmZvLnBTZWNQcm9wcy0+bkFsaWdubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX25BbGlnbm1lbnQ7Cit9CitGWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0Q2hhclNwYWNlKGNvbnN0IENQVlRfV29yZEluZm8mIFdvcmRJbmZvKSB7CisgIHJldHVybiBtX2JSaWNoVGV4dCAmJiBXb3JkSW5mby5wV29yZFByb3BzID8gV29yZEluZm8ucFdvcmRQcm9wcy0+ZkNoYXJTcGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1fZkNoYXJTcGFjZTsKK30KK2ludDMyX3QgQ1BERl9WYXJpYWJsZVRleHQ6OkdldEhvcnpTY2FsZShjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbykgeworICByZXR1cm4gbV9iUmljaFRleHQgJiYgV29yZEluZm8ucFdvcmRQcm9wcyA/IFdvcmRJbmZvLnBXb3JkUHJvcHMtPm5Ib3J6U2NhbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX25Ib3J6U2NhbGU7Cit9Cit2b2lkIENQREZfVmFyaWFibGVUZXh0OjpDbGVhclNlY3Rpb25SaWdodFdvcmRzKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgeworICBDUFZUX1dvcmRQbGFjZSB3b3JkcGxhY2UgPSBBZGp1c3RMaW5lSGVhZGVyKHBsYWNlLCBUUlVFKTsKKyAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKKyAgICBmb3IgKGludDMyX3QgdyA9IHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCkgLSAxOworICAgICAgICAgdyA+IHdvcmRwbGFjZS5uV29yZEluZGV4OyB3LS0pIHsKKyAgICAgIGRlbGV0ZSBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0QXQodyk7CisgICAgICBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuUmVtb3ZlQXQodyk7CisgICAgfQorICB9Cit9CitDUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6QWRqdXN0TGluZUhlYWRlcihjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcmV2T3JOZXh0KSBjb25zdCB7CisgIGlmIChwbGFjZS5uV29yZEluZGV4IDwgMCAmJiBwbGFjZS5uTGluZUluZGV4ID4gMCkgeworICAgIHJldHVybiBiUHJldk9yTmV4dCA/IEdldFByZXZXb3JkUGxhY2UocGxhY2UpIDogR2V0TmV4dFdvcmRQbGFjZShwbGFjZSk7CisgIH0KKyAgcmV0dXJuIHBsYWNlOworfQorRlhfQk9PTCBDUERGX1ZhcmlhYmxlVGV4dDo6Q2xlYXJFbXB0eVNlY3Rpb24oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSB7CisgIGlmIChwbGFjZS5uU2VjSW5kZXggPT0gMCAmJiBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgPT0gMSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgeworICAgIGlmIChwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpID09IDApIHsKKyAgICAgIGRlbGV0ZSBwU2VjdGlvbjsKKyAgICAgIG1fU2VjdGlvbkFycmF5LlJlbW92ZUF0KHBsYWNlLm5TZWNJbmRleCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQordm9pZCBDUERGX1ZhcmlhYmxlVGV4dDo6Q2xlYXJFbXB0eVNlY3Rpb25zKGNvbnN0IENQVlRfV29yZFJhbmdlJiBQbGFjZVJhbmdlKSB7CisgIENQVlRfV29yZFBsYWNlIHdvcmRwbGFjZTsKKyAgZm9yIChpbnQzMl90IHMgPSBQbGFjZVJhbmdlLkVuZFBvcy5uU2VjSW5kZXg7CisgICAgICAgcyA+IFBsYWNlUmFuZ2UuQmVnaW5Qb3MublNlY0luZGV4OyBzLS0pIHsKKyAgICB3b3JkcGxhY2UublNlY0luZGV4ID0gczsKKyAgICBDbGVhckVtcHR5U2VjdGlvbih3b3JkcGxhY2UpOworICB9Cit9Cit2b2lkIENQREZfVmFyaWFibGVUZXh0OjpMaW5rTGF0dGVyU2VjdGlvbihjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIHsKKyAgQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2UgPSBBZGp1c3RMaW5lSGVhZGVyKHBsYWNlLCBUUlVFKTsKKyAgaWYgKENTZWN0aW9uKiBwTmV4dFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXggKyAxKSkgeworICAgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChvbGRwbGFjZS5uU2VjSW5kZXgpKSB7CisgICAgICBmb3IgKGludDMyX3QgdyA9IDAsIHN6ID0gcE5leHRTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCk7IHcgPCBzejsKKyAgICAgICAgICAgdysrKSB7CisgICAgICAgIGlmIChDUFZUX1dvcmRJbmZvKiBwV29yZCA9IHBOZXh0U2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0QXQodykpIHsKKyAgICAgICAgICBvbGRwbGFjZS5uV29yZEluZGV4Kys7CisgICAgICAgICAgcFNlY3Rpb24tPkFkZFdvcmQob2xkcGxhY2UsICpwV29yZCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZGVsZXRlIHBOZXh0U2VjdGlvbjsKKyAgICBtX1NlY3Rpb25BcnJheS5SZW1vdmVBdChwbGFjZS5uU2VjSW5kZXggKyAxKTsKKyAgfQorfQordm9pZCBDUERGX1ZhcmlhYmxlVGV4dDo6Q2xlYXJXb3Jkcyhjb25zdCBDUFZUX1dvcmRSYW5nZSYgUGxhY2VSYW5nZSkgeworICBDUFZUX1dvcmRSYW5nZSBOZXdSYW5nZTsKKyAgTmV3UmFuZ2UuQmVnaW5Qb3MgPSBBZGp1c3RMaW5lSGVhZGVyKFBsYWNlUmFuZ2UuQmVnaW5Qb3MsIFRSVUUpOworICBOZXdSYW5nZS5FbmRQb3MgPSBBZGp1c3RMaW5lSGVhZGVyKFBsYWNlUmFuZ2UuRW5kUG9zLCBUUlVFKTsKKyAgZm9yIChpbnQzMl90IHMgPSBOZXdSYW5nZS5FbmRQb3MublNlY0luZGV4OyBzID49IE5ld1JhbmdlLkJlZ2luUG9zLm5TZWNJbmRleDsKKyAgICAgICBzLS0pIHsKKyAgICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocykpIHsKKyAgICAgIHBTZWN0aW9uLT5DbGVhcldvcmRzKE5ld1JhbmdlKTsKKyAgICB9CisgIH0KK30KK0NQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpDbGVhckxlZnRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgeworICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgeworICAgIENQVlRfV29yZFBsYWNlIGxlZnRwbGFjZSA9IEdldFByZXZXb3JkUGxhY2UocGxhY2UpOworICAgIGlmIChsZWZ0cGxhY2UgIT0gcGxhY2UpIHsKKyAgICAgIGlmIChsZWZ0cGxhY2UublNlY0luZGV4ICE9IHBsYWNlLm5TZWNJbmRleCkgeworICAgICAgICBpZiAocFNlY3Rpb24tPm1fV29yZEFycmF5LkdldFNpemUoKSA9PSAwKSB7CisgICAgICAgICAgQ2xlYXJFbXB0eVNlY3Rpb24ocGxhY2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIExpbmtMYXR0ZXJTZWN0aW9uKGxlZnRwbGFjZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBTZWN0aW9uLT5DbGVhcldvcmQocGxhY2UpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbGVmdHBsYWNlOworICB9CisgIHJldHVybiBwbGFjZTsKK30KK0NQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpDbGVhclJpZ2h0V29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIHsKKyAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKKyAgICBDUFZUX1dvcmRQbGFjZSByaWdodHBsYWNlID0KKyAgICAgICAgQWRqdXN0TGluZUhlYWRlcihHZXROZXh0V29yZFBsYWNlKHBsYWNlKSwgRkFMU0UpOworICAgIGlmIChyaWdodHBsYWNlICE9IHBsYWNlKSB7CisgICAgICBpZiAocmlnaHRwbGFjZS5uU2VjSW5kZXggIT0gcGxhY2UublNlY0luZGV4KSB7CisgICAgICAgIExpbmtMYXR0ZXJTZWN0aW9uKHBsYWNlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBTZWN0aW9uLT5DbGVhcldvcmQocmlnaHRwbGFjZSk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBwbGFjZTsKK30KK3ZvaWQgQ1BERl9WYXJpYWJsZVRleHQ6OlJlYXJyYW5nZUFsbCgpIHsKKyAgUmVhcnJhbmdlKENQVlRfV29yZFJhbmdlKEdldEJlZ2luV29yZFBsYWNlKCksIEdldEVuZFdvcmRQbGFjZSgpKSk7Cit9Cit2b2lkIENQREZfVmFyaWFibGVUZXh0OjpSZWFycmFuZ2VQYXJ0KGNvbnN0IENQVlRfV29yZFJhbmdlJiBQbGFjZVJhbmdlKSB7CisgIFJlYXJyYW5nZShQbGFjZVJhbmdlKTsKK30KK0NQVlRfRmxvYXRSZWN0IENQREZfVmFyaWFibGVUZXh0OjpSZWFycmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIFBsYWNlUmFuZ2UpIHsKKyAgQ1BWVF9GbG9hdFJlY3QgcmNSZXQ7CisgIGlmIChJc1ZhbGlkKCkpIHsKKyAgICBpZiAobV9iQXV0b0ZvbnRTaXplKSB7CisgICAgICBTZXRGb250U2l6ZShHZXRBdXRvRm9udFNpemUoKSk7CisgICAgICByY1JldCA9IFJlYXJyYW5nZVNlY3Rpb25zKAorICAgICAgICAgIENQVlRfV29yZFJhbmdlKEdldEJlZ2luV29yZFBsYWNlKCksIEdldEVuZFdvcmRQbGFjZSgpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJjUmV0ID0gUmVhcnJhbmdlU2VjdGlvbnMoUGxhY2VSYW5nZSk7CisgICAgfQorICB9CisgIFNldENvbnRlbnRSZWN0KHJjUmV0KTsKKyAgcmV0dXJuIHJjUmV0OworfQorRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldEF1dG9Gb250U2l6ZSgpIHsKKyAgaW50MzJfdCBuVG90YWwgPSBzaXplb2YoZ0ZvbnRTaXplU3RlcHMpIC8gc2l6ZW9mKHVpbnQ4X3QpOworICBpZiAoSXNNdWx0aUxpbmUoKSkgeworICAgIG5Ub3RhbCAvPSA0OworICB9CisgIGlmIChuVG90YWwgPD0gMCkgewogICAgIHJldHVybiAwOwotfQotRlhfSU5UMzIgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFR5cGVBc2NlbnQoRlhfSU5UMzIgbkZvbnRJbmRleCkKLXsKLSAgICByZXR1cm4gbV9wVlRQcm92aWRlciA/IG1fcFZUUHJvdmlkZXItPkdldFR5cGVBc2NlbnQobkZvbnRJbmRleCkgOiAwOwotfQotRlhfSU5UMzIgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFR5cGVEZXNjZW50KEZYX0lOVDMyIG5Gb250SW5kZXgpCi17Ci0gICAgcmV0dXJuIG1fcFZUUHJvdmlkZXIgPyBtX3BWVFByb3ZpZGVyLT5HZXRUeXBlRGVzY2VudChuRm9udEluZGV4KSA6IDA7Ci19Ci1GWF9JTlQzMiBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZEZvbnRJbmRleChGWF9XT1JEIHdvcmQsIEZYX0lOVDMyIGNoYXJzZXQsIEZYX0lOVDMyIG5Gb250SW5kZXgpCi17Ci0gICAgcmV0dXJuIG1fcFZUUHJvdmlkZXIgPyBtX3BWVFByb3ZpZGVyLT5HZXRXb3JkRm9udEluZGV4KHdvcmQsIGNoYXJzZXQsIG5Gb250SW5kZXgpIDogLTE7Ci19Ci1GWF9JTlQzMiBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0RGVmYXVsdEZvbnRJbmRleCgpCi17Ci0gICAgcmV0dXJuIG1fcFZUUHJvdmlkZXIgPyBtX3BWVFByb3ZpZGVyLT5HZXREZWZhdWx0Rm9udEluZGV4KCkgOiAtMTsKLX0KLUZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHQ6OklzTGF0aW5Xb3JkKEZYX1dPUkQgd29yZCkKLXsKLSAgICByZXR1cm4gbV9wVlRQcm92aWRlciA/IG1fcFZUUHJvdmlkZXItPklzTGF0aW5Xb3JkKHdvcmQpIDogRkFMU0U7Ci19Ci1JUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciAqIENQREZfVmFyaWFibGVUZXh0OjpHZXRJdGVyYXRvcigpCi17Ci0gICAgaWYgKCFtX3BWVEl0ZXJhdG9yKSB7Ci0gICAgICAgIG1fcFZUSXRlcmF0b3IgPSBuZXcgQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IodGhpcyk7CisgIH0KKyAgaWYgKEdldFBsYXRlV2lkdGgoKSA8PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaW50MzJfdCBuTGVmdCA9IDA7CisgIGludDMyX3QgblJpZ2h0ID0gblRvdGFsIC0gMTsKKyAgaW50MzJfdCBuTWlkID0gblRvdGFsIC8gMjsKKyAgd2hpbGUgKG5MZWZ0IDw9IG5SaWdodCkgeworICAgIGlmIChJc0JpZ2dlcihnRm9udFNpemVTdGVwc1tuTWlkXSkpIHsKKyAgICAgIG5SaWdodCA9IG5NaWQgLSAxOworICAgICAgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOworICAgICAgY29udGludWU7CisgICAgfSBlbHNlIHsKKyAgICAgIG5MZWZ0ID0gbk1pZCArIDE7CisgICAgICBuTWlkID0gKG5MZWZ0ICsgblJpZ2h0KSAvIDI7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgcmV0dXJuIG1fcFZUSXRlcmF0b3I7CisgIH0KKyAgcmV0dXJuIChGWF9GTE9BVClnRm9udFNpemVTdGVwc1tuTWlkXTsKIH0KLUlQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyKglDUERGX1ZhcmlhYmxlVGV4dDo6U2V0UHJvdmlkZXIoSVBERl9WYXJpYWJsZVRleHRfUHJvdmlkZXIgKiBwUHJvdmlkZXIpCi17Ci0gICAgSVBERl9WYXJpYWJsZVRleHRfUHJvdmlkZXIqIHBPbGQgPSBtX3BWVFByb3ZpZGVyOwotICAgIG1fcFZUUHJvdmlkZXIgPSBwUHJvdmlkZXI7Ci0gICAgcmV0dXJuIHBPbGQ7Ci19Ci1DUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6Q1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IoQ1BERl9WYXJpYWJsZVRleHQgKiBwVlQpOgotICAgIG1fQ3VyUG9zKC0xLCAtMSwgLTEpLAotICAgIG1fcFZUKHBWVCkKLXsKLX0KLUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjp+Q1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IoKQotewotfQotdm9pZCBDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6U2V0QXQoRlhfSU5UMzIgbldvcmRJbmRleCkKLXsKLSAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7Ci0gICAgbV9DdXJQb3MgPSBtX3BWVC0+V29yZEluZGV4VG9Xb3JkUGxhY2UobldvcmRJbmRleCk7Ci19Ci12b2lkIENQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpTZXRBdChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKQotewotICAgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKLSAgICBtX0N1clBvcyA9IHBsYWNlOwotfQotRlhfQk9PTAlDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6TmV4dFdvcmQoKQotewotICAgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKLSAgICBpZiAobV9DdXJQb3MgPT0gbV9wVlQtPkdldEVuZFdvcmRQbGFjZSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1BERl9WYXJpYWJsZVRleHQ6OklzQmlnZ2VyKEZYX0ZMT0FUIGZGb250U2l6ZSkgeworICBGWF9CT09MIGJCaWdnZXIgPSBGQUxTRTsKKyAgQ1BWVF9TaXplIHN6VG90YWw7CisgIGZvciAoaW50MzJfdCBzID0gMCwgc3ogPSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCk7IHMgPCBzejsgcysrKSB7CisgICAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHMpKSB7CisgICAgICBDUFZUX1NpemUgc2l6ZSA9IHBTZWN0aW9uLT5HZXRTZWN0aW9uU2l6ZShmRm9udFNpemUpOworICAgICAgc3pUb3RhbC54ID0gc3RkOjptYXgoc2l6ZS54LCBzelRvdGFsLngpOworICAgICAgc3pUb3RhbC55ICs9IHNpemUueTsKKyAgICAgIGlmIChJc0Zsb2F0QmlnZ2VyKHN6VG90YWwueCwgR2V0UGxhdGVXaWR0aCgpKSB8fAorICAgICAgICAgIElzRmxvYXRCaWdnZXIoc3pUb3RhbC55LCBHZXRQbGF0ZUhlaWdodCgpKSkgeworICAgICAgICBiQmlnZ2VyID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CiAgICAgfQotICAgIG1fQ3VyUG9zID0gbV9wVlQtPkdldE5leHRXb3JkUGxhY2UobV9DdXJQb3MpOwotICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBiQmlnZ2VyOwogfQotRlhfQk9PTAlDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6UHJldldvcmQoKQotewotICAgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKLSAgICBpZiAobV9DdXJQb3MgPT0gbV9wVlQtPkdldEJlZ2luV29yZFBsYWNlKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX0N1clBvcyA9IG1fcFZULT5HZXRQcmV2V29yZFBsYWNlKG1fQ3VyUG9zKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6Ok5leHRMaW5lKCkKLXsKLSAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7Ci0gICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX3BWVC0+bV9TZWN0aW9uQXJyYXkuR2V0QXQobV9DdXJQb3MublNlY0luZGV4KSkgewotICAgICAgICBpZiAobV9DdXJQb3MubkxpbmVJbmRleCA8IHBTZWN0aW9uLT5tX0xpbmVBcnJheS5HZXRTaXplKCkgLSAxKSB7Ci0gICAgICAgICAgICBtX0N1clBvcyA9IENQVlRfV29yZFBsYWNlKG1fQ3VyUG9zLm5TZWNJbmRleCwgbV9DdXJQb3MubkxpbmVJbmRleCArIDEsIC0xKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOworQ1BWVF9GbG9hdFJlY3QgQ1BERl9WYXJpYWJsZVRleHQ6OlJlYXJyYW5nZVNlY3Rpb25zKAorICAgIGNvbnN0IENQVlRfV29yZFJhbmdlJiBQbGFjZVJhbmdlKSB7CisgIENQVlRfV29yZFBsYWNlIHBsYWNlOworICBGWF9GTE9BVCBmUG9zWSA9IDA7CisgIEZYX0ZMT0FUIGZPbGRIZWlnaHQ7CisgIGludDMyX3QgblNTZWNJbmRleCA9IFBsYWNlUmFuZ2UuQmVnaW5Qb3MublNlY0luZGV4OworICBpbnQzMl90IG5FU2VjSW5kZXggPSBQbGFjZVJhbmdlLkVuZFBvcy5uU2VjSW5kZXg7CisgIENQVlRfRmxvYXRSZWN0IHJjUmV0OworICBmb3IgKGludDMyX3QgcyA9IDAsIHN6ID0gbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpOyBzIDwgc3o7IHMrKykgeworICAgIHBsYWNlLm5TZWNJbmRleCA9IHM7CisgICAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHMpKSB7CisgICAgICBwU2VjdGlvbi0+U2VjUGxhY2UgPSBwbGFjZTsKKyAgICAgIENQVlRfRmxvYXRSZWN0IHJjU2VjID0gcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb247CisgICAgICBpZiAocyA+PSBuU1NlY0luZGV4KSB7CisgICAgICAgIGlmIChzIDw9IG5FU2VjSW5kZXgpIHsKKyAgICAgICAgICByY1NlYyA9IHBTZWN0aW9uLT5SZWFycmFuZ2UoKTsKKyAgICAgICAgICByY1NlYy50b3AgKz0gZlBvc1k7CisgICAgICAgICAgcmNTZWMuYm90dG9tICs9IGZQb3NZOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1fQ3VyUG9zLm5TZWNJbmRleCA8IG1fcFZULT5tX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgLSAxKSB7Ci0gICAgICAgICAgICAgICAgbV9DdXJQb3MgPSBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXggKyAxLCAwLCAtMSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgZk9sZEhlaWdodCA9IHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLmJvdHRvbSAtCisgICAgICAgICAgICAgICAgICAgICAgIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLnRvcDsKKyAgICAgICAgICByY1NlYy50b3AgPSBmUG9zWTsKKyAgICAgICAgICByY1NlYy5ib3R0b20gPSBmUG9zWSArIGZPbGRIZWlnaHQ7CiAgICAgICAgIH0KKyAgICAgICAgcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24gPSByY1NlYzsKKyAgICAgICAgcFNlY3Rpb24tPlJlc2V0TGluZVBsYWNlKCk7CisgICAgICB9CisgICAgICBpZiAocyA9PSAwKSB7CisgICAgICAgIHJjUmV0ID0gcmNTZWM7CisgICAgICB9IGVsc2UgeworICAgICAgICByY1JldC5sZWZ0ID0gc3RkOjptaW4ocmNTZWMubGVmdCwgcmNSZXQubGVmdCk7CisgICAgICAgIHJjUmV0LnRvcCA9IHN0ZDo6bWluKHJjU2VjLnRvcCwgcmNSZXQudG9wKTsKKyAgICAgICAgcmNSZXQucmlnaHQgPSBzdGQ6Om1heChyY1NlYy5yaWdodCwgcmNSZXQucmlnaHQpOworICAgICAgICByY1JldC5ib3R0b20gPSBzdGQ6Om1heChyY1NlYy5ib3R0b20sIHJjUmV0LmJvdHRvbSk7CisgICAgICB9CisgICAgICBmUG9zWSArPSByY1NlYy5IZWlnaHQoKTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiByY1JldDsKIH0KLUZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OlByZXZMaW5lKCkKLXsKLSAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7Ci0gICAgaWYgKG1fcFZULT5tX1NlY3Rpb25BcnJheS5HZXRBdChtX0N1clBvcy5uU2VjSW5kZXgpKSB7Ci0gICAgICAgIGlmIChtX0N1clBvcy5uTGluZUluZGV4ID4gMCkgewotICAgICAgICAgICAgbV9DdXJQb3MgPSBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXgsIG1fQ3VyUG9zLm5MaW5lSW5kZXggLSAxLCAtMSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtX0N1clBvcy5uU2VjSW5kZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKENTZWN0aW9uICogcExhc3RTZWN0aW9uID0gbV9wVlQtPm1fU2VjdGlvbkFycmF5LkdldEF0KG1fQ3VyUG9zLm5TZWNJbmRleCAtIDEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fQ3VyUG9zID0gQ1BWVF9Xb3JkUGxhY2UobV9DdXJQb3MublNlY0luZGV4IC0gMSwgcExhc3RTZWN0aW9uLT5tX0xpbmVBcnJheS5HZXRTaXplKCkgLSAxLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQoraW50MzJfdCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0Q2hhcldpZHRoKGludDMyX3QgbkZvbnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIFdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCBTdWJXb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbldvcmRTdHlsZSkgeworICBpZiAoIW1fcFZUUHJvdmlkZXIpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoU3ViV29yZCA+IDApIHsKKyAgICByZXR1cm4gbV9wVlRQcm92aWRlci0+R2V0Q2hhcldpZHRoKG5Gb250SW5kZXgsIFN1YldvcmQsIG5Xb3JkU3R5bGUpOworICB9CisgIHJldHVybiBtX3BWVFByb3ZpZGVyLT5HZXRDaGFyV2lkdGgobkZvbnRJbmRleCwgV29yZCwgbldvcmRTdHlsZSk7Cit9CitpbnQzMl90IENQREZfVmFyaWFibGVUZXh0OjpHZXRUeXBlQXNjZW50KGludDMyX3QgbkZvbnRJbmRleCkgeworICByZXR1cm4gbV9wVlRQcm92aWRlciA/IG1fcFZUUHJvdmlkZXItPkdldFR5cGVBc2NlbnQobkZvbnRJbmRleCkgOiAwOworfQoraW50MzJfdCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0VHlwZURlc2NlbnQoaW50MzJfdCBuRm9udEluZGV4KSB7CisgIHJldHVybiBtX3BWVFByb3ZpZGVyID8gbV9wVlRQcm92aWRlci0+R2V0VHlwZURlc2NlbnQobkZvbnRJbmRleCkgOiAwOworfQoraW50MzJfdCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZEZvbnRJbmRleChGWF9XT1JEIHdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRm9udEluZGV4KSB7CisgIHJldHVybiBtX3BWVFByb3ZpZGVyCisgICAgICAgICAgICAgPyBtX3BWVFByb3ZpZGVyLT5HZXRXb3JkRm9udEluZGV4KHdvcmQsIGNoYXJzZXQsIG5Gb250SW5kZXgpCisgICAgICAgICAgICAgOiAtMTsKK30KK2ludDMyX3QgQ1BERl9WYXJpYWJsZVRleHQ6OkdldERlZmF1bHRGb250SW5kZXgoKSB7CisgIHJldHVybiBtX3BWVFByb3ZpZGVyID8gbV9wVlRQcm92aWRlci0+R2V0RGVmYXVsdEZvbnRJbmRleCgpIDogLTE7Cit9CitGWF9CT09MIENQREZfVmFyaWFibGVUZXh0OjpJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpIHsKKyAgcmV0dXJuIG1fcFZUUHJvdmlkZXIgPyBtX3BWVFByb3ZpZGVyLT5Jc0xhdGluV29yZCh3b3JkKSA6IEZBTFNFOworfQorSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIENQREZfVmFyaWFibGVUZXh0OjpHZXRJdGVyYXRvcigpIHsKKyAgaWYgKCFtX3BWVEl0ZXJhdG9yKSB7CisgICAgbV9wVlRJdGVyYXRvciA9IG5ldyBDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcih0aGlzKTsKKyAgfQorICByZXR1cm4gbV9wVlRJdGVyYXRvcjsKK30KK0lQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyKiBDUERGX1ZhcmlhYmxlVGV4dDo6U2V0UHJvdmlkZXIoCisgICAgSVBERl9WYXJpYWJsZVRleHRfUHJvdmlkZXIqIHBQcm92aWRlcikgeworICBJUERGX1ZhcmlhYmxlVGV4dF9Qcm92aWRlciogcE9sZCA9IG1fcFZUUHJvdmlkZXI7CisgIG1fcFZUUHJvdmlkZXIgPSBwUHJvdmlkZXI7CisgIHJldHVybiBwT2xkOworfQorQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OkNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKENQREZfVmFyaWFibGVUZXh0KiBwVlQpCisgICAgOiBtX0N1clBvcygtMSwgLTEsIC0xKSwgbV9wVlQocFZUKSB7fQorQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6On5DUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcigpIHt9Cit2b2lkIENQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpTZXRBdChpbnQzMl90IG5Xb3JkSW5kZXgpIHsKKyAgbV9DdXJQb3MgPSBtX3BWVC0+V29yZEluZGV4VG9Xb3JkUGxhY2UobldvcmRJbmRleCk7Cit9Cit2b2lkIENQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpTZXRBdChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIHsKKyAgQVNTRVJUKG1fcFZUKTsKKyAgbV9DdXJQb3MgPSBwbGFjZTsKK30KK0ZYX0JPT0wgQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6Ok5leHRXb3JkKCkgeworICBpZiAobV9DdXJQb3MgPT0gbV9wVlQtPkdldEVuZFdvcmRQbGFjZSgpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fQ3VyUG9zID0gbV9wVlQtPkdldE5leHRXb3JkUGxhY2UobV9DdXJQb3MpOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OlByZXZXb3JkKCkgeworICBpZiAobV9DdXJQb3MgPT0gbV9wVlQtPkdldEJlZ2luV29yZFBsYWNlKCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9DdXJQb3MgPSBtX3BWVC0+R2V0UHJldldvcmRQbGFjZShtX0N1clBvcyk7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6TmV4dExpbmUoKSB7CisgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX3BWVC0+bV9TZWN0aW9uQXJyYXkuR2V0QXQobV9DdXJQb3MublNlY0luZGV4KSkgeworICAgIGlmIChtX0N1clBvcy5uTGluZUluZGV4IDwgcFNlY3Rpb24tPm1fTGluZUFycmF5LkdldFNpemUoKSAtIDEpIHsKKyAgICAgIG1fQ3VyUG9zID0KKyAgICAgICAgICBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXgsIG1fQ3VyUG9zLm5MaW5lSW5kZXggKyAxLCAtMSk7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotRlhfQk9PTAlDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6TmV4dFNlY3Rpb24oKQotewotICAgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKICAgICBpZiAobV9DdXJQb3MublNlY0luZGV4IDwgbV9wVlQtPm1fU2VjdGlvbkFycmF5LkdldFNpemUoKSAtIDEpIHsKLSAgICAgICAgbV9DdXJQb3MgPSBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXggKyAxLCAwLCAtMSk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgbV9DdXJQb3MgPSBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXggKyAxLCAwLCAtMSk7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KLUZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OlByZXZTZWN0aW9uKCkKLXsKLSAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7CitGWF9CT09MIENQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpQcmV2TGluZSgpIHsKKyAgaWYgKG1fcFZULT5tX1NlY3Rpb25BcnJheS5HZXRBdChtX0N1clBvcy5uU2VjSW5kZXgpKSB7CisgICAgaWYgKG1fQ3VyUG9zLm5MaW5lSW5kZXggPiAwKSB7CisgICAgICBtX0N1clBvcyA9CisgICAgICAgICAgQ1BWVF9Xb3JkUGxhY2UobV9DdXJQb3MublNlY0luZGV4LCBtX0N1clBvcy5uTGluZUluZGV4IC0gMSwgLTEpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQogICAgIGlmIChtX0N1clBvcy5uU2VjSW5kZXggPiAwKSB7Ci0gICAgICAgIG1fQ3VyUG9zID0gQ1BWVF9Xb3JkUGxhY2UobV9DdXJQb3MublNlY0luZGV4IC0gMSwgMCwgLTEpOworICAgICAgaWYgKENTZWN0aW9uKiBwTGFzdFNlY3Rpb24gPQorICAgICAgICAgICAgICBtX3BWVC0+bV9TZWN0aW9uQXJyYXkuR2V0QXQobV9DdXJQb3MublNlY0luZGV4IC0gMSkpIHsKKyAgICAgICAgbV9DdXJQb3MgPSBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXN0U2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0U2l6ZSgpIC0gMSwgLTEpOwogICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KLUZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OkdldFdvcmQoQ1BWVF9Xb3JkICYgd29yZCkgY29uc3QKLXsKLSAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7Ci0gICAgd29yZC5Xb3JkUGxhY2UgPSBtX0N1clBvczsKLSAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fcFZULT5tX1NlY3Rpb25BcnJheS5HZXRBdChtX0N1clBvcy5uU2VjSW5kZXgpKSB7Ci0gICAgICAgIGlmIChwU2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0QXQobV9DdXJQb3MubkxpbmVJbmRleCkpIHsKLSAgICAgICAgICAgIGlmIChDUFZUX1dvcmRJbmZvICogcFdvcmQgPSBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0QXQobV9DdXJQb3MubldvcmRJbmRleCkpIHsKLSAgICAgICAgICAgICAgICB3b3JkLldvcmQgPSBwV29yZC0+V29yZDsKLSAgICAgICAgICAgICAgICB3b3JkLm5DaGFyc2V0ID0gcFdvcmQtPm5DaGFyc2V0OwotICAgICAgICAgICAgICAgIHdvcmQuZldpZHRoID0gbV9wVlQtPkdldFdvcmRXaWR0aCgqcFdvcmQpOwotICAgICAgICAgICAgICAgIHdvcmQucHRXb3JkID0gbV9wVlQtPkluVG9PdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Qb2ludChwV29yZC0+ZldvcmRYICsgcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24ubGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JkLT5mV29yZFkgKyBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbi50b3ApICk7Ci0gICAgICAgICAgICAgICAgd29yZC5mQXNjZW50ID0gbV9wVlQtPkdldFdvcmRBc2NlbnQoKnBXb3JkKTsKLSAgICAgICAgICAgICAgICB3b3JkLmZEZXNjZW50ID0gbV9wVlQtPkdldFdvcmREZXNjZW50KCpwV29yZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBXb3JkLT5wV29yZFByb3BzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmQuV29yZFByb3BzID0gKnBXb3JkLT5wV29yZFByb3BzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3b3JkLm5Gb250SW5kZXggPSBtX3BWVC0+R2V0V29yZEZvbnRJbmRleCgqcFdvcmQpOwotICAgICAgICAgICAgICAgIHdvcmQuZkZvbnRTaXplID0gbV9wVlQtPkdldFdvcmRGb250U2l6ZSgqcFdvcmQpOwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6Ok5leHRTZWN0aW9uKCkgeworICBpZiAobV9DdXJQb3MublNlY0luZGV4IDwgbV9wVlQtPm1fU2VjdGlvbkFycmF5LkdldFNpemUoKSAtIDEpIHsKKyAgICBtX0N1clBvcyA9IENQVlRfV29yZFBsYWNlKG1fQ3VyUG9zLm5TZWNJbmRleCArIDEsIDAsIC0xKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1GWF9CT09MCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpTZXRXb3JkKGNvbnN0IENQVlRfV29yZCAmIHdvcmQpCi17Ci0gICAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOwotICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9wVlQtPm1fU2VjdGlvbkFycmF5LkdldEF0KG1fQ3VyUG9zLm5TZWNJbmRleCkpIHsKLSAgICAgICAgaWYgKENQVlRfV29yZEluZm8gKiBwV29yZCA9IHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdChtX0N1clBvcy5uV29yZEluZGV4KSkgewotICAgICAgICAgICAgaWYgKHBXb3JkLT5wV29yZFByb3BzKSB7Ci0gICAgICAgICAgICAgICAgKnBXb3JkLT5wV29yZFByb3BzID0gd29yZC5Xb3JkUHJvcHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CitGWF9CT09MIENQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpQcmV2U2VjdGlvbigpIHsKKyAgQVNTRVJUKG1fcFZUKTsKKyAgaWYgKG1fQ3VyUG9zLm5TZWNJbmRleCA+IDApIHsKKyAgICBtX0N1clBvcyA9IENQVlRfV29yZFBsYWNlKG1fQ3VyUG9zLm5TZWNJbmRleCAtIDEsIDAsIC0xKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1GWF9CT09MCUNQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpHZXRMaW5lKENQVlRfTGluZSAmIGxpbmUpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1fcFZUICE9IE5VTEwpOwotICAgIGxpbmUubGluZXBsYWNlID0gQ1BWVF9Xb3JkUGxhY2UobV9DdXJQb3MublNlY0luZGV4LCBtX0N1clBvcy5uTGluZUluZGV4LCAtMSk7Ci0gICAgaWYgKENTZWN0aW9uICogcFNlY3Rpb24gPSBtX3BWVC0+bV9TZWN0aW9uQXJyYXkuR2V0QXQobV9DdXJQb3MublNlY0luZGV4KSkgewotICAgICAgICBpZiAoQ0xpbmUgKiBwTGluZSA9IHBTZWN0aW9uLT5tX0xpbmVBcnJheS5HZXRBdChtX0N1clBvcy5uTGluZUluZGV4KSkgewotICAgICAgICAgICAgbGluZS5wdExpbmUgPSBtX3BWVC0+SW5Ub091dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUG9pbnQocExpbmUtPm1fTGluZUluZm8uZkxpbmVYICsgcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24ubGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmUtPm1fTGluZUluZm8uZkxpbmVZICsgcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24udG9wKSApOwotICAgICAgICAgICAgbGluZS5mTGluZVdpZHRoID0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVXaWR0aDsKLSAgICAgICAgICAgIGxpbmUuZkxpbmVBc2NlbnQgPSBwTGluZS0+bV9MaW5lSW5mby5mTGluZUFzY2VudDsKLSAgICAgICAgICAgIGxpbmUuZkxpbmVEZXNjZW50ID0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVEZXNjZW50OwotICAgICAgICAgICAgbGluZS5saW5lRW5kID0gcExpbmUtPkdldEVuZFdvcmRQbGFjZSgpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CitGWF9CT09MIENQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpHZXRXb3JkKENQVlRfV29yZCYgd29yZCkgY29uc3QgeworICB3b3JkLldvcmRQbGFjZSA9IG1fQ3VyUG9zOworICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9wVlQtPm1fU2VjdGlvbkFycmF5LkdldEF0KG1fQ3VyUG9zLm5TZWNJbmRleCkpIHsKKyAgICBpZiAocFNlY3Rpb24tPm1fTGluZUFycmF5LkdldEF0KG1fQ3VyUG9zLm5MaW5lSW5kZXgpKSB7CisgICAgICBpZiAoQ1BWVF9Xb3JkSW5mbyogcFdvcmQgPQorICAgICAgICAgICAgICBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0QXQobV9DdXJQb3MubldvcmRJbmRleCkpIHsKKyAgICAgICAgd29yZC5Xb3JkID0gcFdvcmQtPldvcmQ7CisgICAgICAgIHdvcmQubkNoYXJzZXQgPSBwV29yZC0+bkNoYXJzZXQ7CisgICAgICAgIHdvcmQuZldpZHRoID0gbV9wVlQtPkdldFdvcmRXaWR0aCgqcFdvcmQpOworICAgICAgICB3b3JkLnB0V29yZCA9IG1fcFZULT5JblRvT3V0KAorICAgICAgICAgICAgQ1BERl9Qb2ludChwV29yZC0+ZldvcmRYICsgcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24ubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgcFdvcmQtPmZXb3JkWSArIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLnRvcCkpOworICAgICAgICB3b3JkLmZBc2NlbnQgPSBtX3BWVC0+R2V0V29yZEFzY2VudCgqcFdvcmQpOworICAgICAgICB3b3JkLmZEZXNjZW50ID0gbV9wVlQtPkdldFdvcmREZXNjZW50KCpwV29yZCk7CisgICAgICAgIGlmIChwV29yZC0+cFdvcmRQcm9wcykgeworICAgICAgICAgIHdvcmQuV29yZFByb3BzID0gKnBXb3JkLT5wV29yZFByb3BzOwogICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wJQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OkdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uICYgc2VjdGlvbikgY29uc3QKLXsKLSAgICBBU1NFUlQobV9wVlQgIT0gTlVMTCk7Ci0gICAgc2VjdGlvbi5zZWNwbGFjZSA9IENQVlRfV29yZFBsYWNlKG1fQ3VyUG9zLm5TZWNJbmRleCwgMCwgLTEpOwotICAgIGlmIChDU2VjdGlvbiAqIHBTZWN0aW9uID0gbV9wVlQtPm1fU2VjdGlvbkFycmF5LkdldEF0KG1fQ3VyUG9zLm5TZWNJbmRleCkpIHsKLSAgICAgICAgc2VjdGlvbi5yY1NlY3Rpb24gPSBtX3BWVC0+SW5Ub091dChwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbik7Ci0gICAgICAgIGlmIChwU2VjdGlvbi0+bV9TZWNJbmZvLnBTZWNQcm9wcykgewotICAgICAgICAgICAgc2VjdGlvbi5TZWNQcm9wcyA9ICpwU2VjdGlvbi0+bV9TZWNJbmZvLnBTZWNQcm9wczsKLSAgICAgICAgfQotICAgICAgICBpZiAocFNlY3Rpb24tPm1fU2VjSW5mby5wV29yZFByb3BzKSB7Ci0gICAgICAgICAgICBzZWN0aW9uLldvcmRQcm9wcyA9ICpwU2VjdGlvbi0+bV9TZWNJbmZvLnBXb3JkUHJvcHM7Ci0gICAgICAgIH0KKyAgICAgICAgd29yZC5uRm9udEluZGV4ID0gbV9wVlQtPkdldFdvcmRGb250SW5kZXgoKnBXb3JkKTsKKyAgICAgICAgd29yZC5mRm9udFNpemUgPSBtX3BWVC0+R2V0V29yZEZvbnRTaXplKCpwV29yZCk7CiAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQotRlhfQk9PTAlDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjo6U2V0U2VjdGlvbihjb25zdCBDUFZUX1NlY3Rpb24gJiBzZWN0aW9uKQotewotICAgIEFTU0VSVChtX3BWVCAhPSBOVUxMKTsKLSAgICBpZiAoQ1NlY3Rpb24gKiBwU2VjdGlvbiA9IG1fcFZULT5tX1NlY3Rpb25BcnJheS5HZXRBdChtX0N1clBvcy5uU2VjSW5kZXgpKSB7Ci0gICAgICAgIGlmIChwU2VjdGlvbi0+bV9TZWNJbmZvLnBTZWNQcm9wcykgewotICAgICAgICAgICAgKnBTZWN0aW9uLT5tX1NlY0luZm8ucFNlY1Byb3BzID0gc2VjdGlvbi5TZWNQcm9wczsKLSAgICAgICAgfQotICAgICAgICBpZiAocFNlY3Rpb24tPm1fU2VjSW5mby5wV29yZFByb3BzKSB7Ci0gICAgICAgICAgICAqcFNlY3Rpb24tPm1fU2VjSW5mby5wV29yZFByb3BzID0gc2VjdGlvbi5Xb3JkUHJvcHM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7CitGWF9CT09MIENQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOjpTZXRXb3JkKGNvbnN0IENQVlRfV29yZCYgd29yZCkgeworICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9wVlQtPm1fU2VjdGlvbkFycmF5LkdldEF0KG1fQ3VyUG9zLm5TZWNJbmRleCkpIHsKKyAgICBpZiAoQ1BWVF9Xb3JkSW5mbyogcFdvcmQgPQorICAgICAgICAgICAgcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldEF0KG1fQ3VyUG9zLm5Xb3JkSW5kZXgpKSB7CisgICAgICBpZiAocFdvcmQtPnBXb3JkUHJvcHMpIHsKKyAgICAgICAgKnBXb3JkLT5wV29yZFByb3BzID0gd29yZC5Xb3JkUHJvcHM7CisgICAgICB9CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBGQUxTRTsKK30KK0ZYX0JPT0wgQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OkdldExpbmUoQ1BWVF9MaW5lJiBsaW5lKSBjb25zdCB7CisgIEFTU0VSVChtX3BWVCk7CisgIGxpbmUubGluZXBsYWNlID0gQ1BWVF9Xb3JkUGxhY2UobV9DdXJQb3MublNlY0luZGV4LCBtX0N1clBvcy5uTGluZUluZGV4LCAtMSk7CisgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX3BWVC0+bV9TZWN0aW9uQXJyYXkuR2V0QXQobV9DdXJQb3MublNlY0luZGV4KSkgeworICAgIGlmIChDTGluZSogcExpbmUgPSBwU2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0QXQobV9DdXJQb3MubkxpbmVJbmRleCkpIHsKKyAgICAgIGxpbmUucHRMaW5lID0gbV9wVlQtPkluVG9PdXQoQ1BERl9Qb2ludCgKKyAgICAgICAgICBwTGluZS0+bV9MaW5lSW5mby5mTGluZVggKyBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbi5sZWZ0LAorICAgICAgICAgIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWSArIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLnRvcCkpOworICAgICAgbGluZS5mTGluZVdpZHRoID0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVXaWR0aDsKKyAgICAgIGxpbmUuZkxpbmVBc2NlbnQgPSBwTGluZS0+bV9MaW5lSW5mby5mTGluZUFzY2VudDsKKyAgICAgIGxpbmUuZkxpbmVEZXNjZW50ID0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVEZXNjZW50OworICAgICAgbGluZS5saW5lRW5kID0gcExpbmUtPkdldEVuZFdvcmRQbGFjZSgpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIHJldHVybiBGQUxTRTsKK30KK0ZYX0JPT0wgQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OkdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uJiBzZWN0aW9uKSBjb25zdCB7CisgIHNlY3Rpb24uc2VjcGxhY2UgPSBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXgsIDAsIC0xKTsKKyAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fcFZULT5tX1NlY3Rpb25BcnJheS5HZXRBdChtX0N1clBvcy5uU2VjSW5kZXgpKSB7CisgICAgc2VjdGlvbi5yY1NlY3Rpb24gPSBtX3BWVC0+SW5Ub091dChwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbik7CisgICAgaWYgKHBTZWN0aW9uLT5tX1NlY0luZm8ucFNlY1Byb3BzKSB7CisgICAgICBzZWN0aW9uLlNlY1Byb3BzID0gKnBTZWN0aW9uLT5tX1NlY0luZm8ucFNlY1Byb3BzOworICAgIH0KKyAgICBpZiAocFNlY3Rpb24tPm1fU2VjSW5mby5wV29yZFByb3BzKSB7CisgICAgICBzZWN0aW9uLldvcmRQcm9wcyA9ICpwU2VjdGlvbi0+bV9TZWNJbmZvLnBXb3JkUHJvcHM7CisgICAgfQorICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKK30KK0ZYX0JPT0wgQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3I6OlNldFNlY3Rpb24oY29uc3QgQ1BWVF9TZWN0aW9uJiBzZWN0aW9uKSB7CisgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX3BWVC0+bV9TZWN0aW9uQXJyYXkuR2V0QXQobV9DdXJQb3MublNlY0luZGV4KSkgeworICAgIGlmIChwU2VjdGlvbi0+bV9TZWNJbmZvLnBTZWNQcm9wcykgeworICAgICAgKnBTZWN0aW9uLT5tX1NlY0luZm8ucFNlY1Byb3BzID0gc2VjdGlvbi5TZWNQcm9wczsKKyAgICB9CisgICAgaWYgKHBTZWN0aW9uLT5tX1NlY0luZm8ucFdvcmRQcm9wcykgeworICAgICAgKnBTZWN0aW9uLT5tX1NlY0luZm8ucFdvcmRQcm9wcyA9IHNlY3Rpb24uV29yZFByb3BzOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL2RvY192dG1vZHVsZS5jcHAgYi9jb3JlL3NyYy9mcGRmZG9jL2RvY192dG1vZHVsZS5jcHAKaW5kZXggZjgyZGUyNS4uYzY3Yjk2MCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnBkZmRvYy9kb2NfdnRtb2R1bGUuY3BwCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvZG9jX3Z0bW9kdWxlLmNwcApAQCAtMSwxNyArMSwxNiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmZG9jL2ZwZGZfdnQuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfdnQuaCIKICNpbmNsdWRlICJwZGZfdnQuaCIKLUlQREZfVmFyaWFibGVUZXh0KiBJUERGX1ZhcmlhYmxlVGV4dDo6TmV3VmFyaWFibGVUZXh0KCkKLXsKLSAgICByZXR1cm4gbmV3IENQREZfVmFyaWFibGVUZXh0KCk7CisKK0lQREZfVmFyaWFibGVUZXh0KiBJUERGX1ZhcmlhYmxlVGV4dDo6TmV3VmFyaWFibGVUZXh0KCkgeworICByZXR1cm4gbmV3IENQREZfVmFyaWFibGVUZXh0KCk7CiB9Ci12b2lkIElQREZfVmFyaWFibGVUZXh0OjpEZWxWYXJpYWJsZVRleHQoSVBERl9WYXJpYWJsZVRleHQqIHBWVCkKLXsKLSAgICBkZWxldGUgKENQREZfVmFyaWFibGVUZXh0KilwVlQ7Cit2b2lkIElQREZfVmFyaWFibGVUZXh0OjpEZWxWYXJpYWJsZVRleHQoSVBERl9WYXJpYWJsZVRleHQqIHBWVCkgeworICBkZWxldGUgKENQREZfVmFyaWFibGVUZXh0KilwVlQ7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmZG9jL3BkZl92dC5oIGIvY29yZS9zcmMvZnBkZmRvYy9wZGZfdnQuaAppbmRleCA0MDYyYmY5Li4yODZmYWQ1IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL3BkZl92dC5oCisrKyBiL2NvcmUvc3JjL2ZwZGZkb2MvcGRmX3Z0LmgKQEAgLTEsNyArMSw3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgQ09SRV9TUkNfRlBERkRPQ19QREZfVlRfSF8KQEAgLTE5LDYyMCArMTksNTQxIEBACiBjbGFzcyBDUERGX0VkaXRDb250YWluZXI7CiBjbGFzcyBDUERGX1ZhcmlhYmxlVGV4dDsKIGNsYXNzIENQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yOwotI2RlZmluZSBJc0Zsb2F0WmVybyhmKQkJCQkJCSgoZikgPCAwLjAwMDEgJiYgKGYpID4gLTAuMDAwMSkKLSNkZWZpbmUgSXNGbG9hdEJpZ2dlcihmYSxmYikJCQkJKChmYSkgPiAoZmIpICYmICFJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkpCi0jZGVmaW5lIElzRmxvYXRTbWFsbGVyKGZhLGZiKQkJCQkoKGZhKSA8IChmYikgJiYgIUlzRmxvYXRaZXJvKChmYSkgLSAoZmIpKSkKLXRlbXBsYXRlPGNsYXNzIFQ+IFQgRlBERl9NSU4gKGNvbnN0IFQgJiBpLCBjb25zdCBUICYgaikKLXsKLSAgICByZXR1cm4gKChpIDwgaikgPyBpIDogaik7Ci19Ci10ZW1wbGF0ZTxjbGFzcyBUPiBUIEZQREZfTUFYIChjb25zdCBUICYgaSwgY29uc3QgVCAmIGopCi17Ci0gICAgcmV0dXJuICgoaSA+IGopID8gaSA6IGopOwotfQotY2xhc3MgQ1BWVF9TaXplCi17Ci1wdWJsaWM6Ci0gICAgQ1BWVF9TaXplKCkgOiB4KDAuMGYpLCB5KDAuMGYpCi0gICAgewotICAgIH0KLSAgICBDUFZUX1NpemUoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkKLSAgICB7Ci0gICAgICAgIHRoaXMtPnggPSB4OwotICAgICAgICB0aGlzLT55ID0geTsKLSAgICB9Ci0gICAgRlhfRkxPQVQgeCwgeTsKKyNkZWZpbmUgSXNGbG9hdFplcm8oZikgKChmKSA8IDAuMDAwMSAmJiAoZikgPiAtMC4wMDAxKQorI2RlZmluZSBJc0Zsb2F0QmlnZ2VyKGZhLCBmYikgKChmYSkgPiAoZmIpICYmICFJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkpCisjZGVmaW5lIElzRmxvYXRTbWFsbGVyKGZhLCBmYikgKChmYSkgPCAoZmIpICYmICFJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkpCisKK2NsYXNzIENQVlRfU2l6ZSB7CisgcHVibGljOgorICBDUFZUX1NpemUoKSA6IHgoMC4wZiksIHkoMC4wZikge30KKyAgQ1BWVF9TaXplKEZYX0ZMT0FUIG90aGVyX3gsIEZYX0ZMT0FUIG90aGVyX3kpIHsKKyAgICB4ID0gb3RoZXJfeDsKKyAgICB5ID0gb3RoZXJfeTsKKyAgfQorICBGWF9GTE9BVCB4LCB5OwogfTsKLWNsYXNzIENQVlRfRmxvYXRSZWN0IDogcHVibGljIENGWF9GbG9hdFJlY3QKLXsKLXB1YmxpYzoKLSAgICBDUFZUX0Zsb2F0UmVjdCgpCi0gICAgewotICAgICAgICBsZWZ0ID0gdG9wID0gcmlnaHQgPSBib3R0b20gPSAwLjBmOwotICAgIH0KLSAgICBDUFZUX0Zsb2F0UmVjdChGWF9GTE9BVCBsZWZ0LCBGWF9GTE9BVCB0b3AsCi0gICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcmlnaHQsIEZYX0ZMT0FUIGJvdHRvbSkKLSAgICB7Ci0gICAgICAgIHRoaXMtPmxlZnQgPSBsZWZ0OwotICAgICAgICB0aGlzLT50b3AgPSB0b3A7Ci0gICAgICAgIHRoaXMtPnJpZ2h0ID0gcmlnaHQ7Ci0gICAgICAgIHRoaXMtPmJvdHRvbSA9IGJvdHRvbTsKLSAgICB9Ci0gICAgQ1BWVF9GbG9hdFJlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkKLSAgICB7Ci0gICAgICAgIHRoaXMtPmxlZnQgPSByZWN0LmxlZnQ7Ci0gICAgICAgIHRoaXMtPnRvcCA9IHJlY3QudG9wOwotICAgICAgICB0aGlzLT5yaWdodCA9IHJlY3QucmlnaHQ7Ci0gICAgICAgIHRoaXMtPmJvdHRvbSA9IHJlY3QuYm90dG9tOwotICAgIH0KLSAgICB2b2lkIERlZmF1bHQoKQotICAgIHsKLSAgICAgICAgbGVmdCA9IHRvcCA9IHJpZ2h0ID0gYm90dG9tID0gMC4wZjsKLSAgICB9Ci0gICAgRlhfRkxPQVQgSGVpZ2h0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmKHRoaXMtPnRvcCA+IHRoaXMtPmJvdHRvbSkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMtPnRvcCAtIHRoaXMtPmJvdHRvbTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLT5ib3R0b20gLSB0aGlzLT50b3A7Ci0gICAgICAgIH0KLSAgICB9CitjbGFzcyBDUFZUX0Zsb2F0UmVjdCA6IHB1YmxpYyBDRlhfRmxvYXRSZWN0IHsKKyBwdWJsaWM6CisgIENQVlRfRmxvYXRSZWN0KCkgeyBsZWZ0ID0gdG9wID0gcmlnaHQgPSBib3R0b20gPSAwLjBmOyB9CisgIENQVlRfRmxvYXRSZWN0KEZYX0ZMT0FUIG90aGVyX2xlZnQsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG90aGVyX3RvcCwKKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQgb3RoZXJfcmlnaHQsCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG90aGVyX2JvdHRvbSkgeworICAgIGxlZnQgPSBvdGhlcl9sZWZ0OworICAgIHRvcCA9IG90aGVyX3RvcDsKKyAgICByaWdodCA9IG90aGVyX3JpZ2h0OworICAgIGJvdHRvbSA9IG90aGVyX2JvdHRvbTsKKyAgfQorICBleHBsaWNpdCBDUFZUX0Zsb2F0UmVjdChjb25zdCBDUERGX1JlY3QmIHJlY3QpIHsKKyAgICBsZWZ0ID0gcmVjdC5sZWZ0OworICAgIHRvcCA9IHJlY3QudG9wOworICAgIHJpZ2h0ID0gcmVjdC5yaWdodDsKKyAgICBib3R0b20gPSByZWN0LmJvdHRvbTsKKyAgfQorICB2b2lkIERlZmF1bHQoKSB7IGxlZnQgPSB0b3AgPSByaWdodCA9IGJvdHRvbSA9IDAuMGY7IH0KKyAgRlhfRkxPQVQgSGVpZ2h0KCkgY29uc3QgeworICAgIGlmICh0b3AgPiBib3R0b20pCisgICAgICByZXR1cm4gdG9wIC0gYm90dG9tOworICAgIHJldHVybiBib3R0b20gLSB0b3A7CisgIH0KIH07CiBzdHJ1Y3QgQ1BWVF9TZWN0aW9uSW5mbyB7Ci0gICAgQ1BWVF9TZWN0aW9uSW5mbygpIDogcmNTZWN0aW9uKCksIG5Ub3RhbExpbmUoMCksIHBTZWNQcm9wcyhOVUxMKSwgcFdvcmRQcm9wcyhOVUxMKQotICAgIHsKKyAgQ1BWVF9TZWN0aW9uSW5mbygpCisgICAgICA6IHJjU2VjdGlvbigpLCBuVG90YWxMaW5lKDApLCBwU2VjUHJvcHMoTlVMTCksIHBXb3JkUHJvcHMoTlVMTCkge30KKyAgdmlydHVhbCB+Q1BWVF9TZWN0aW9uSW5mbygpIHsKKyAgICBkZWxldGUgcFNlY1Byb3BzOworICAgIGRlbGV0ZSBwV29yZFByb3BzOworICB9CisgIENQVlRfU2VjdGlvbkluZm8oY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyYgb3RoZXIpCisgICAgICA6IHJjU2VjdGlvbigpLCBuVG90YWxMaW5lKDApLCBwU2VjUHJvcHMoTlVMTCksIHBXb3JkUHJvcHMoTlVMTCkgeworICAgIG9wZXJhdG9yPShvdGhlcik7CisgIH0KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyYgb3RoZXIpIHsKKyAgICBpZiAodGhpcyA9PSAmb3RoZXIpIHsKKyAgICAgIHJldHVybjsKICAgICB9Ci0gICAgdmlydHVhbCB+Q1BWVF9TZWN0aW9uSW5mbygpCi0gICAgewotICAgICAgICBpZiAocFNlY1Byb3BzKSB7Ci0gICAgICAgICAgICBkZWxldGUgcFNlY1Byb3BzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwV29yZFByb3BzKSB7Ci0gICAgICAgICAgICBkZWxldGUgcFdvcmRQcm9wczsKLSAgICAgICAgfQorICAgIHJjU2VjdGlvbiA9IG90aGVyLnJjU2VjdGlvbjsKKyAgICBuVG90YWxMaW5lID0gb3RoZXIublRvdGFsTGluZTsKKyAgICBpZiAob3RoZXIucFNlY1Byb3BzKSB7CisgICAgICBpZiAocFNlY1Byb3BzKSB7CisgICAgICAgICpwU2VjUHJvcHMgPSAqb3RoZXIucFNlY1Byb3BzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcFNlY1Byb3BzID0gbmV3IENQVlRfU2VjUHJvcHMoKm90aGVyLnBTZWNQcm9wcyk7CisgICAgICB9CiAgICAgfQotICAgIENQVlRfU2VjdGlvbkluZm8oY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyAmIG90aGVyKTogcmNTZWN0aW9uKCksIG5Ub3RhbExpbmUoMCksIHBTZWNQcm9wcyhOVUxMKSwgcFdvcmRQcm9wcyhOVUxMKQotICAgIHsKLSAgICAgICAgb3BlcmF0b3IgPSAob3RoZXIpOworICAgIGlmIChvdGhlci5wV29yZFByb3BzKSB7CisgICAgICBpZiAocFdvcmRQcm9wcykgeworICAgICAgICAqcFdvcmRQcm9wcyA9ICpvdGhlci5wV29yZFByb3BzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcFdvcmRQcm9wcyA9IG5ldyBDUFZUX1dvcmRQcm9wcygqb3RoZXIucFdvcmRQcm9wcyk7CisgICAgICB9CiAgICAgfQotICAgIHZvaWQgb3BlcmF0b3IgPSAoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyAmIG90aGVyKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMgPT0gJm90aGVyKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy0+cmNTZWN0aW9uID0gb3RoZXIucmNTZWN0aW9uOwotICAgICAgICB0aGlzLT5uVG90YWxMaW5lID0gb3RoZXIublRvdGFsTGluZTsKLSAgICAgICAgaWYgKG90aGVyLnBTZWNQcm9wcykgewotICAgICAgICAgICAgaWYgKHBTZWNQcm9wcykgewotICAgICAgICAgICAgICAgICpwU2VjUHJvcHMgPSAqb3RoZXIucFNlY1Byb3BzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwU2VjUHJvcHMgPSBuZXcgQ1BWVF9TZWNQcm9wcygqb3RoZXIucFNlY1Byb3BzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAob3RoZXIucFdvcmRQcm9wcykgewotICAgICAgICAgICAgaWYgKHBXb3JkUHJvcHMpIHsKLSAgICAgICAgICAgICAgICAqcFdvcmRQcm9wcyA9ICpvdGhlci5wV29yZFByb3BzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwV29yZFByb3BzID0gbmV3IENQVlRfV29yZFByb3BzKCpvdGhlci5wV29yZFByb3BzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBDUFZUX0Zsb2F0UmVjdAkJCQlyY1NlY3Rpb247Ci0gICAgRlhfSU5UMzIJCQkJCW5Ub3RhbExpbmU7Ci0gICAgQ1BWVF9TZWNQcm9wcyoJCQkJcFNlY1Byb3BzOwotICAgIENQVlRfV29yZFByb3BzKgkJCQlwV29yZFByb3BzOworICB9CisgIENQVlRfRmxvYXRSZWN0IHJjU2VjdGlvbjsKKyAgaW50MzJfdCBuVG90YWxMaW5lOworICBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHM7CisgIENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzOwogfTsKIHN0cnVjdCBDUFZUX0xpbmVJbmZvIHsKLSAgICBDUFZUX0xpbmVJbmZvKCkgOiBuVG90YWxXb3JkKDApLCBuQmVnaW5Xb3JkSW5kZXgoLTEpLCBuRW5kV29yZEluZGV4KC0xKSwKLSAgICAgICAgZkxpbmVYKDAuMGYpLCBmTGluZVkoMC4wZiksIGZMaW5lV2lkdGgoMC4wZiksIGZMaW5lQXNjZW50KDAuMGYpLCBmTGluZURlc2NlbnQoMC4wZikKLSAgICB7Ci0gICAgfQotICAgIEZYX0lOVDMyCQkJCQluVG90YWxXb3JkOwotICAgIEZYX0lOVDMyCQkJCQluQmVnaW5Xb3JkSW5kZXg7Ci0gICAgRlhfSU5UMzIJCQkJCW5FbmRXb3JkSW5kZXg7Ci0gICAgRlhfRkxPQVQJCQkJCWZMaW5lWDsKLSAgICBGWF9GTE9BVAkJCQkJZkxpbmVZOwotICAgIEZYX0ZMT0FUCQkJCQlmTGluZVdpZHRoOwotICAgIEZYX0ZMT0FUCQkJCQlmTGluZUFzY2VudDsKLSAgICBGWF9GTE9BVAkJCQkJZkxpbmVEZXNjZW50OworICBDUFZUX0xpbmVJbmZvKCkKKyAgICAgIDogblRvdGFsV29yZCgwKSwKKyAgICAgICAgbkJlZ2luV29yZEluZGV4KC0xKSwKKyAgICAgICAgbkVuZFdvcmRJbmRleCgtMSksCisgICAgICAgIGZMaW5lWCgwLjBmKSwKKyAgICAgICAgZkxpbmVZKDAuMGYpLAorICAgICAgICBmTGluZVdpZHRoKDAuMGYpLAorICAgICAgICBmTGluZUFzY2VudCgwLjBmKSwKKyAgICAgICAgZkxpbmVEZXNjZW50KDAuMGYpIHt9CisgIGludDMyX3QgblRvdGFsV29yZDsKKyAgaW50MzJfdCBuQmVnaW5Xb3JkSW5kZXg7CisgIGludDMyX3QgbkVuZFdvcmRJbmRleDsKKyAgRlhfRkxPQVQgZkxpbmVYOworICBGWF9GTE9BVCBmTGluZVk7CisgIEZYX0ZMT0FUIGZMaW5lV2lkdGg7CisgIEZYX0ZMT0FUIGZMaW5lQXNjZW50OworICBGWF9GTE9BVCBmTGluZURlc2NlbnQ7CiB9Owotc3RydWN0IENQVlRfV29yZEluZm8gIHsKLSAgICBDUFZUX1dvcmRJbmZvKCkgOiBXb3JkKDApLCBuQ2hhcnNldCgwKSwKLSAgICAgICAgZldvcmRYKDAuMGYpLCBmV29yZFkoMC4wZiksIGZXb3JkVGFpbCgwLjBmKSwgbkZvbnRJbmRleCgtMSksIHBXb3JkUHJvcHMoTlVMTCkKLSAgICB7CitzdHJ1Y3QgQ1BWVF9Xb3JkSW5mbyB7CisgIENQVlRfV29yZEluZm8oKQorICAgICAgOiBXb3JkKDApLAorICAgICAgICBuQ2hhcnNldCgwKSwKKyAgICAgICAgZldvcmRYKDAuMGYpLAorICAgICAgICBmV29yZFkoMC4wZiksCisgICAgICAgIGZXb3JkVGFpbCgwLjBmKSwKKyAgICAgICAgbkZvbnRJbmRleCgtMSksCisgICAgICAgIHBXb3JkUHJvcHMoTlVMTCkge30KKyAgQ1BWVF9Xb3JkSW5mbyhGWF9XT1JEIHdvcmQsCisgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAorICAgICAgICAgICAgICAgIGludDMyX3QgZm9udEluZGV4LAorICAgICAgICAgICAgICAgIENQVlRfV29yZFByb3BzKiBwUHJvcHMpCisgICAgICA6IFdvcmQod29yZCksCisgICAgICAgIG5DaGFyc2V0KGNoYXJzZXQpLAorICAgICAgICBmV29yZFgoMC4wZiksCisgICAgICAgIGZXb3JkWSgwLjBmKSwKKyAgICAgICAgZldvcmRUYWlsKDAuMGYpLAorICAgICAgICBuRm9udEluZGV4KGZvbnRJbmRleCksCisgICAgICAgIHBXb3JkUHJvcHMocFByb3BzKSB7fQorICB2aXJ0dWFsIH5DUFZUX1dvcmRJbmZvKCkgeyBkZWxldGUgcFdvcmRQcm9wczsgfQorICBDUFZUX1dvcmRJbmZvKGNvbnN0IENQVlRfV29yZEluZm8mIHdvcmQpCisgICAgICA6IFdvcmQoMCksCisgICAgICAgIG5DaGFyc2V0KDApLAorICAgICAgICBmV29yZFgoMC4wZiksCisgICAgICAgIGZXb3JkWSgwLjBmKSwKKyAgICAgICAgZldvcmRUYWlsKDAuMGYpLAorICAgICAgICBuRm9udEluZGV4KC0xKSwKKyAgICAgICAgcFdvcmRQcm9wcyhOVUxMKSB7CisgICAgb3BlcmF0b3I9KHdvcmQpOworICB9CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENQVlRfV29yZEluZm8mIHdvcmQpIHsKKyAgICBpZiAodGhpcyA9PSAmd29yZCkgeworICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBDUFZUX1dvcmRJbmZvKEZYX1dPUkQgd29yZCwgRlhfSU5UMzIgY2hhcnNldCwgRlhfSU5UMzIgZm9udEluZGV4LCBDUFZUX1dvcmRQcm9wcyAqIHBQcm9wcyk6Ci0gICAgICAgIFdvcmQod29yZCksIG5DaGFyc2V0KGNoYXJzZXQpLCBmV29yZFgoMC4wZiksIGZXb3JkWSgwLjBmKSwgZldvcmRUYWlsKDAuMGYpLAotICAgICAgICBuRm9udEluZGV4KGZvbnRJbmRleCksIHBXb3JkUHJvcHMocFByb3BzKQotICAgIHsKKyAgICBXb3JkID0gd29yZC5Xb3JkOworICAgIG5DaGFyc2V0ID0gd29yZC5uQ2hhcnNldDsKKyAgICBuRm9udEluZGV4ID0gd29yZC5uRm9udEluZGV4OworICAgIGlmICh3b3JkLnBXb3JkUHJvcHMpIHsKKyAgICAgIGlmIChwV29yZFByb3BzKSB7CisgICAgICAgICpwV29yZFByb3BzID0gKndvcmQucFdvcmRQcm9wczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBXb3JkUHJvcHMgPSBuZXcgQ1BWVF9Xb3JkUHJvcHMoKndvcmQucFdvcmRQcm9wcyk7CisgICAgICB9CiAgICAgfQotICAgIHZpcnR1YWwgfkNQVlRfV29yZEluZm8oKQotICAgIHsKLSAgICAgICAgaWYgKHBXb3JkUHJvcHMpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwV29yZFByb3BzOwotICAgICAgICB9Ci0gICAgfQotICAgIENQVlRfV29yZEluZm8oY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIHdvcmQpOiBXb3JkKDApLCBuQ2hhcnNldCgwKSwKLSAgICAgICAgZldvcmRYKDAuMGYpLCBmV29yZFkoMC4wZiksIGZXb3JkVGFpbCgwLjBmKSwgbkZvbnRJbmRleCgtMSksIHBXb3JkUHJvcHMoTlVMTCkKLSAgICB7Ci0gICAgICAgIG9wZXJhdG9yID0gKHdvcmQpOwotICAgIH0KLSAgICB2b2lkIG9wZXJhdG9yID0gKGNvbnN0IENQVlRfV29yZEluZm8gJiB3b3JkKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMgPT0gJndvcmQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0aGlzLT5Xb3JkID0gd29yZC5Xb3JkOwotICAgICAgICB0aGlzLT5uQ2hhcnNldCA9IHdvcmQubkNoYXJzZXQ7Ci0gICAgICAgIHRoaXMtPm5Gb250SW5kZXggPSB3b3JkLm5Gb250SW5kZXg7Ci0gICAgICAgIGlmICh3b3JkLnBXb3JkUHJvcHMpIHsKLSAgICAgICAgICAgIGlmIChwV29yZFByb3BzKSB7Ci0gICAgICAgICAgICAgICAgKnBXb3JkUHJvcHMgPSAqd29yZC5wV29yZFByb3BzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwV29yZFByb3BzID0gbmV3IENQVlRfV29yZFByb3BzKCp3b3JkLnBXb3JkUHJvcHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIEZYX1dPUkQJCQkJCQlXb3JkOwotICAgIEZYX0lOVDMyCQkJCQluQ2hhcnNldDsKLSAgICBGWF9GTE9BVAkJCQkJZldvcmRYOwotICAgIEZYX0ZMT0FUCQkJCQlmV29yZFk7Ci0gICAgRlhfRkxPQVQJCQkJCWZXb3JkVGFpbDsKLSAgICBGWF9JTlQzMgkJCQkJbkZvbnRJbmRleDsKLSAgICBDUFZUX1dvcmRQcm9wcyoJCQkJcFdvcmRQcm9wczsKKyAgfQorICBGWF9XT1JEIFdvcmQ7CisgIGludDMyX3QgbkNoYXJzZXQ7CisgIEZYX0ZMT0FUIGZXb3JkWDsKKyAgRlhfRkxPQVQgZldvcmRZOworICBGWF9GTE9BVCBmV29yZFRhaWw7CisgIGludDMyX3QgbkZvbnRJbmRleDsKKyAgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHM7CiB9Owogc3RydWN0IENQVlRfRmxvYXRSYW5nZSB7Ci0gICAgQ1BWVF9GbG9hdFJhbmdlKCkgOiBmTWluKDAuMGYpLCBmTWF4KDAuMGYpCi0gICAgewotICAgIH0KLSAgICBDUFZUX0Zsb2F0UmFuZ2UoRlhfRkxPQVQgbWluLCBGWF9GTE9BVCBtYXgpIDogZk1pbihtaW4pLCBmTWF4KG1heCkKLSAgICB7Ci0gICAgfQotICAgIEZYX0ZMT0FUIFJhbmdlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBmTWF4IC0gZk1pbjsKLSAgICB9Ci0gICAgRlhfRkxPQVQgZk1pbiwgZk1heDsKKyAgQ1BWVF9GbG9hdFJhbmdlKCkgOiBmTWluKDAuMGYpLCBmTWF4KDAuMGYpIHt9CisgIENQVlRfRmxvYXRSYW5nZShGWF9GTE9BVCBtaW4sIEZYX0ZMT0FUIG1heCkgOiBmTWluKG1pbiksIGZNYXgobWF4KSB7fQorICBGWF9GTE9BVCBSYW5nZSgpIGNvbnN0IHsgcmV0dXJuIGZNYXggLSBmTWluOyB9CisgIEZYX0ZMT0FUIGZNaW4sIGZNYXg7CiB9OwotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gY2xhc3MgQ1BWVF9BcnJheVRlbXBsYXRlIDogcHVibGljIENGWF9BcnJheVRlbXBsYXRlPFRZUEU+Ci17Ci1wdWJsaWM6Ci0gICAgRlhfQk9PTCBJc0VtcHR5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0U2l6ZSgpIDw9IDA7Cit0ZW1wbGF0ZSA8Y2xhc3MgVFlQRT4KK2NsYXNzIENQVlRfQXJyYXlUZW1wbGF0ZSA6IHB1YmxpYyBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPiB7CisgcHVibGljOgorICBGWF9CT09MIElzRW1wdHkoKSB7IHJldHVybiBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0U2l6ZSgpIDw9IDA7IH0KKyAgVFlQRSBHZXRBdChpbnQgbkluZGV4KSBjb25zdCB7CisgICAgaWYgKG5JbmRleCA+PSAwICYmIG5JbmRleCA8IENGWF9BcnJheVRlbXBsYXRlPFRZUEU+OjpHZXRTaXplKCkpIHsKKyAgICAgIHJldHVybiBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0QXQobkluZGV4KTsKICAgICB9Ci0gICAgVFlQRSBHZXRBdChpbnQgbkluZGV4KSBjb25zdAotICAgIHsKLSAgICAgICAgaWYgKG5JbmRleCA+PSAwICYmIG5JbmRleCA8IENGWF9BcnJheVRlbXBsYXRlPFRZUEU+OjpHZXRTaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0QXQobkluZGV4KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICB2b2lkIFJlbW92ZUF0KGludCBuSW5kZXgpIHsKKyAgICBpZiAobkluZGV4ID49IDAgJiYgbkluZGV4IDwgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OkdldFNpemUoKSkgeworICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OlJlbW92ZUF0KG5JbmRleCk7CiAgICAgfQotICAgIHZvaWQgUmVtb3ZlQXQoaW50IG5JbmRleCkKLSAgICB7Ci0gICAgICAgIGlmIChuSW5kZXggPj0gMCAmJiBuSW5kZXggPCBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0U2l6ZSgpKSB7Ci0gICAgICAgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6UmVtb3ZlQXQobkluZGV4KTsKLSAgICAgICAgfQotICAgIH0KKyAgfQogfTsKLWNsYXNzIENMaW5lIAotewotcHVibGljOgotICAgIENMaW5lKCk7Ci0gICAgdmlydHVhbCB+Q0xpbmUoKTsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlHZXRCZWdpbldvcmRQbGFjZSgpIGNvbnN0OwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCUdldEVuZFdvcmRQbGFjZSgpIGNvbnN0OwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCUdldFByZXZXb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3Q7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJR2V0TmV4dFdvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdDsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlMaW5lUGxhY2U7Ci0gICAgQ1BWVF9MaW5lSW5mbwkJCQkJCQltX0xpbmVJbmZvOworY2xhc3MgQ0xpbmUgeworIHB1YmxpYzoKKyAgQ0xpbmUoKTsKKyAgdmlydHVhbCB+Q0xpbmUoKTsKKyAgQ1BWVF9Xb3JkUGxhY2UgR2V0QmVnaW5Xb3JkUGxhY2UoKSBjb25zdDsKKyAgQ1BWVF9Xb3JkUGxhY2UgR2V0RW5kV29yZFBsYWNlKCkgY29uc3Q7CisgIENQVlRfV29yZFBsYWNlIEdldFByZXZXb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdDsKKyAgQ1BWVF9Xb3JkUGxhY2UgR2V0TmV4dFdvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0OworICBDUFZUX1dvcmRQbGFjZSBMaW5lUGxhY2U7CisgIENQVlRfTGluZUluZm8gbV9MaW5lSW5mbzsKIH07Ci1jbGFzcyBDTGluZXMKLXsKLXB1YmxpYzoKLSAgICBDTGluZXMoKSA6IG1fblRvdGFsKDApIHt9Ci0gICAgdmlydHVhbCB+Q0xpbmVzKCkKLSAgICB7Ci0gICAgICAgIFJlbW92ZUFsbCgpOworY2xhc3MgQ0xpbmVzIHsKKyBwdWJsaWM6CisgIENMaW5lcygpIDogbV9uVG90YWwoMCkge30KKyAgdmlydHVhbCB+Q0xpbmVzKCkgeyBSZW1vdmVBbGwoKTsgfQorICBpbnQzMl90IEdldFNpemUoKSBjb25zdCB7IHJldHVybiBtX0xpbmVzLkdldFNpemUoKTsgfQorICBDTGluZSogR2V0QXQoaW50MzJfdCBuSW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fTGluZXMuR2V0QXQobkluZGV4KTsgfQorICB2b2lkIEVtcHR5KCkgeyBtX25Ub3RhbCA9IDA7IH0KKyAgdm9pZCBSZW1vdmVBbGwoKSB7CisgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IEdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgIGRlbGV0ZSBHZXRBdChpKTsKICAgICB9Ci0gICAgRlhfSU5UMzIJCQkJCQkJCUdldFNpemUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fTGluZXMuR2V0U2l6ZSgpOworICAgIG1fTGluZXMuUmVtb3ZlQWxsKCk7CisgICAgbV9uVG90YWwgPSAwOworICB9CisgIGludDMyX3QgQWRkKGNvbnN0IENQVlRfTGluZUluZm8mIGxpbmVpbmZvKSB7CisgICAgaWYgKG1fblRvdGFsID49IEdldFNpemUoKSkgeworICAgICAgQ0xpbmUqIHBMaW5lID0gbmV3IENMaW5lOworICAgICAgcExpbmUtPm1fTGluZUluZm8gPSBsaW5laW5mbzsKKyAgICAgIG1fTGluZXMuQWRkKHBMaW5lKTsKKyAgICB9IGVsc2UgaWYgKENMaW5lKiBwTGluZSA9IEdldEF0KG1fblRvdGFsKSkgeworICAgICAgcExpbmUtPm1fTGluZUluZm8gPSBsaW5laW5mbzsKICAgICB9Ci0gICAgQ0xpbmUgKgkJCQkJCQkJCUdldEF0KEZYX0lOVDMyIG5JbmRleCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX0xpbmVzLkdldEF0KG5JbmRleCk7CisgICAgcmV0dXJuIG1fblRvdGFsKys7CisgIH0KKyAgdm9pZCBDbGVhcigpIHsKKyAgICBmb3IgKGludDMyX3QgaSA9IEdldFNpemUoKSAtIDE7IGkgPj0gbV9uVG90YWw7IGktLSkgeworICAgICAgZGVsZXRlIEdldEF0KGkpOworICAgICAgbV9MaW5lcy5SZW1vdmVBdChpKTsKICAgICB9Ci0gICAgdm9pZAkJCQkJCQkJCUVtcHR5KCkKLSAgICB7Ci0gICAgICAgIG1fblRvdGFsID0gMDsKLSAgICB9Ci0gICAgdm9pZAkJCQkJCQkJCVJlbW92ZUFsbCgpCi0gICAgewotICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwLCBzeiA9IEdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKLSAgICAgICAgICAgIGRlbGV0ZSBHZXRBdChpKTsKLSAgICAgICAgfQotICAgICAgICBtX0xpbmVzLlJlbW92ZUFsbCgpOwotICAgICAgICBtX25Ub3RhbCA9IDA7Ci0gICAgfQotICAgIEZYX0lOVDMyCQkJCQkJCQlBZGQoY29uc3QgQ1BWVF9MaW5lSW5mbyAmIGxpbmVpbmZvKQotICAgIHsKLSAgICAgICAgaWYgKG1fblRvdGFsID49IEdldFNpemUoKSkgewotICAgICAgICAgICAgQ0xpbmUqIHBMaW5lID0gbmV3IENMaW5lOwotICAgICAgICAgICAgcExpbmUtPm1fTGluZUluZm8gPSBsaW5laW5mbzsKLSAgICAgICAgICAgIG1fTGluZXMuQWRkKHBMaW5lKTsKLSAgICAgICAgfSBlbHNlIGlmIChDTGluZSogcExpbmUgPSBHZXRBdChtX25Ub3RhbCkpIHsKLSAgICAgICAgICAgIHBMaW5lLT5tX0xpbmVJbmZvID0gbGluZWluZm87Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1fblRvdGFsKys7Ci0gICAgfQotICAgIHZvaWQJCQkJCQkJCQlDbGVhcigpCi0gICAgewotICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSBHZXRTaXplKCkgLSAxOyBpID49IG1fblRvdGFsOyBpLS0pIHsKLSAgICAgICAgICAgIGRlbGV0ZSBHZXRBdChpKTsKLSAgICAgICAgICAgIG1fTGluZXMuUmVtb3ZlQXQoaSk7Ci0gICAgICAgIH0KLSAgICB9Ci1wcml2YXRlOgotICAgIENQVlRfQXJyYXlUZW1wbGF0ZTxDTGluZSo+CQkJCW1fTGluZXM7Ci0gICAgRlhfSU5UMzIJCQkJCQkJCW1fblRvdGFsOwotfTsKLWNsYXNzIENTZWN0aW9uIAotewotICAgIGZyaWVuZCBjbGFzcyBDVHlwZXNldDsKLXB1YmxpYzoKLSAgICBDU2VjdGlvbihDUERGX1ZhcmlhYmxlVGV4dCAqIHBWVCk7Ci0gICAgdmlydHVhbCB+Q1NlY3Rpb24oKTsKLSAgICB2b2lkCQkJCQkJCQkJUmVzZXRBbGwoKTsKLSAgICB2b2lkCQkJCQkJCQkJUmVzZXRMaW5lQXJyYXkoKTsKLSAgICB2b2lkCQkJCQkJCQkJUmVzZXRXb3JkQXJyYXkoKTsKLSAgICB2b2lkCQkJCQkJCQkJUmVzZXRMaW5lUGxhY2UoKTsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlBZGRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGNvbnN0IENQVlRfV29yZEluZm8gJiB3b3JkaW5mbyk7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJQWRkTGluZShjb25zdCBDUFZUX0xpbmVJbmZvICYgbGluZWluZm8pOwotICAgIHZvaWQJCQkJCQkJCQlDbGVhcldvcmRzKGNvbnN0IENQVlRfV29yZFJhbmdlICYgUGxhY2VSYW5nZSk7Ci0gICAgdm9pZAkJCQkJCQkJCUNsZWFyV29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKTsKLSAgICBDUFZUX0Zsb2F0UmVjdAkJCQkJCQlSZWFycmFuZ2UoKTsKLSAgICBDUFZUX1NpemUJCQkJCQkJCUdldFNlY3Rpb25TaXplKEZYX0ZMT0FUIGZGb250U2l6ZSk7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJR2V0QmVnaW5Xb3JkUGxhY2UoKSBjb25zdDsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlHZXRFbmRXb3JkUGxhY2UoKSBjb25zdDsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlHZXRQcmV2V29yZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0OwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCUdldE5leHRXb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3Q7Ci0gICAgdm9pZAkJCQkJCQkJCVVwZGF0ZVdvcmRQbGFjZShDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdDsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlTZWFyY2hXb3JkUGxhY2UoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdDsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlTZWFyY2hXb3JkUGxhY2UoRlhfRkxPQVQgZngsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgbGluZXBsYWNlKSBjb25zdDsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlTZWFyY2hXb3JkUGxhY2UoRlhfRkxPQVQgZngsIGNvbnN0IENQVlRfV29yZFJhbmdlICYgcmFuZ2UpIGNvbnN0OwotcHVibGljOgotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCVNlY1BsYWNlOwotICAgIENQVlRfU2VjdGlvbkluZm8JCQkJCQltX1NlY0luZm87Ci0gICAgQ0xpbmVzCQkJCQkJCQkJbV9MaW5lQXJyYXk7Ci0gICAgQ1BWVF9BcnJheVRlbXBsYXRlPENQVlRfV29yZEluZm8qPgkJbV9Xb3JkQXJyYXk7Ci1wcml2YXRlOgotICAgIHZvaWQJCQkJCQkJCQlDbGVhckxlZnRXb3JkcyhGWF9JTlQzMiBuV29yZEluZGV4KTsKLSAgICB2b2lkCQkJCQkJCQkJQ2xlYXJSaWdodFdvcmRzKEZYX0lOVDMyIG5Xb3JkSW5kZXgpOwotICAgIHZvaWQJCQkJCQkJCQlDbGVhck1pZFdvcmRzKEZYX0lOVDMyIG5CZWdpbkluZGV4LCBGWF9JTlQzMiBuRW5kSW5kZXgpOworICB9CiAKLSAgICBDUERGX1ZhcmlhYmxlVGV4dAkJCQkJCSptX3BWVDsKKyBwcml2YXRlOgorICBDUFZUX0FycmF5VGVtcGxhdGU8Q0xpbmUqPiBtX0xpbmVzOworICBpbnQzMl90IG1fblRvdGFsOwogfTsKLWNsYXNzIENUeXBlc2V0Ci17Ci1wdWJsaWM6Ci0gICAgQ1R5cGVzZXQoQ1NlY3Rpb24gKiBwU2VjdGlvbik7Ci0gICAgdmlydHVhbCB+Q1R5cGVzZXQoKTsKLSAgICBDUFZUX1NpemUJCQkJCQkJCUdldEVkaXRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSk7Ci0gICAgQ1BWVF9GbG9hdFJlY3QJCQkJCQkJVHlwZXNldCgpOwotICAgIENQVlRfRmxvYXRSZWN0CQkJCQkJCUNoYXJBcnJheSgpOwotcHJpdmF0ZToKLSAgICB2b2lkCQkJCQkJCQkJU3BsaXRMaW5lcyhGWF9CT09MIGJUeXBlc2V0LCBGWF9GTE9BVCBmRm9udFNpemUpOwotICAgIHZvaWQJCQkJCQkJCQlPdXRwdXRMaW5lcygpOworY2xhc3MgQ1NlY3Rpb24geworICBmcmllbmQgY2xhc3MgQ1R5cGVzZXQ7CiAKLSAgICBDUFZUX0Zsb2F0UmVjdAkJCQkJCQltX3JjUmV0OwotICAgIENQREZfVmFyaWFibGVUZXh0CQkJCQkJKiBtX3BWVDsKLSAgICBDU2VjdGlvbgkJCQkJCQkJKiBtX3BTZWN0aW9uOworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1NlY3Rpb24oQ1BERl9WYXJpYWJsZVRleHQqIHBWVCk7CisgIHZpcnR1YWwgfkNTZWN0aW9uKCk7CisgIHZvaWQgUmVzZXRBbGwoKTsKKyAgdm9pZCBSZXNldExpbmVBcnJheSgpOworICB2b2lkIFJlc2V0V29yZEFycmF5KCk7CisgIHZvaWQgUmVzZXRMaW5lUGxhY2UoKTsKKyAgQ1BWVF9Xb3JkUGxhY2UgQWRkV29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkSW5mbyYgd29yZGluZm8pOworICBDUFZUX1dvcmRQbGFjZSBBZGRMaW5lKGNvbnN0IENQVlRfTGluZUluZm8mIGxpbmVpbmZvKTsKKyAgdm9pZCBDbGVhcldvcmRzKGNvbnN0IENQVlRfV29yZFJhbmdlJiBQbGFjZVJhbmdlKTsKKyAgdm9pZCBDbGVhcldvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKTsKKyAgQ1BWVF9GbG9hdFJlY3QgUmVhcnJhbmdlKCk7CisgIENQVlRfU2l6ZSBHZXRTZWN0aW9uU2l6ZShGWF9GTE9BVCBmRm9udFNpemUpOworICBDUFZUX1dvcmRQbGFjZSBHZXRCZWdpbldvcmRQbGFjZSgpIGNvbnN0OworICBDUFZUX1dvcmRQbGFjZSBHZXRFbmRXb3JkUGxhY2UoKSBjb25zdDsKKyAgQ1BWVF9Xb3JkUGxhY2UgR2V0UHJldldvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0OworICBDUFZUX1dvcmRQbGFjZSBHZXROZXh0V29yZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3Q7CisgIHZvaWQgVXBkYXRlV29yZFBsYWNlKENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3Q7CisgIENQVlRfV29yZFBsYWNlIFNlYXJjaFdvcmRQbGFjZShjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3Q7CisgIENQVlRfV29yZFBsYWNlIFNlYXJjaFdvcmRQbGFjZShGWF9GTE9BVCBmeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBsaW5lcGxhY2UpIGNvbnN0OworICBDUFZUX1dvcmRQbGFjZSBTZWFyY2hXb3JkUGxhY2UoRlhfRkxPQVQgZngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSYgcmFuZ2UpIGNvbnN0OworCisgcHVibGljOgorICBDUFZUX1dvcmRQbGFjZSBTZWNQbGFjZTsKKyAgQ1BWVF9TZWN0aW9uSW5mbyBtX1NlY0luZm87CisgIENMaW5lcyBtX0xpbmVBcnJheTsKKyAgQ1BWVF9BcnJheVRlbXBsYXRlPENQVlRfV29yZEluZm8qPiBtX1dvcmRBcnJheTsKKworIHByaXZhdGU6CisgIHZvaWQgQ2xlYXJMZWZ0V29yZHMoaW50MzJfdCBuV29yZEluZGV4KTsKKyAgdm9pZCBDbGVhclJpZ2h0V29yZHMoaW50MzJfdCBuV29yZEluZGV4KTsKKyAgdm9pZCBDbGVhck1pZFdvcmRzKGludDMyX3QgbkJlZ2luSW5kZXgsIGludDMyX3QgbkVuZEluZGV4KTsKKworICBDUERGX1ZhcmlhYmxlVGV4dCogbV9wVlQ7CiB9OwotY2xhc3MgQ1BERl9FZGl0Q29udGFpbmVyCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9FZGl0Q29udGFpbmVyKCk6IG1fcmNQbGF0ZSgwLCAwLCAwLCAwKSwgbV9yY0NvbnRlbnQoMCwgMCwgMCwgMCkge307Ci0gICAgdmlydHVhbCB+Q1BERl9FZGl0Q29udGFpbmVyKCkge307Ci0gICAgdmlydHVhbCB2b2lkCQkJCQkJCVNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0KQotICAgIHsKLSAgICAgICAgbV9yY1BsYXRlID0gcmVjdDsKLSAgICB9OwotICAgIHZpcnR1YWwgY29uc3QgQ1BERl9SZWN0ICYJCQkJR2V0UGxhdGVSZWN0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3JjUGxhdGU7Ci0gICAgfTsKLSAgICB2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0Q29udGVudFJlY3QoY29uc3QgQ1BWVF9GbG9hdFJlY3QgJiByZWN0KQotICAgIHsKLSAgICAgICAgbV9yY0NvbnRlbnQgPSByZWN0OwotICAgIH07Ci0gICAgdmlydHVhbCBDUERGX1JlY3QgCQkJCQkJR2V0Q29udGVudFJlY3QoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcmNDb250ZW50OwotICAgIH07Ci0gICAgRlhfRkxPQVQJCQkJCQkJCUdldFBsYXRlV2lkdGgoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcmNQbGF0ZS5yaWdodCAtIG1fcmNQbGF0ZS5sZWZ0OwotICAgIH07Ci0gICAgRlhfRkxPQVQJCQkJCQkJCUdldFBsYXRlSGVpZ2h0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3JjUGxhdGUudG9wIC0gbV9yY1BsYXRlLmJvdHRvbTsKLSAgICB9OwotICAgIENQVlRfU2l6ZQkJCQkJCQkJR2V0UGxhdGVTaXplKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBDUFZUX1NpemUoR2V0UGxhdGVXaWR0aCgpLCBHZXRQbGF0ZUhlaWdodCgpKTsKLSAgICB9OwotICAgIENQREZfUG9pbnQJCQkJCQkJCUdldEJUUG9pbnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIENQREZfUG9pbnQobV9yY1BsYXRlLmxlZnQsIG1fcmNQbGF0ZS50b3ApOwotICAgIH07Ci0gICAgQ1BERl9Qb2ludAkJCQkJCQkJR2V0RVRQb2ludCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gQ1BERl9Qb2ludChtX3JjUGxhdGUucmlnaHQsIG1fcmNQbGF0ZS5ib3R0b20pOwotICAgIH07Ci0gICAgaW5saW5lIENQREZfUG9pbnQJCQkJCQlJblRvT3V0KGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBDUERGX1BvaW50KHBvaW50LnggKyBHZXRCVFBvaW50KCkueCwgR2V0QlRQb2ludCgpLnkgLSBwb2ludC55KTsKLSAgICB9OwotICAgIGlubGluZSBDUERGX1BvaW50CQkJCQkJT3V0VG9Jbihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gQ1BERl9Qb2ludChwb2ludC54IC0gR2V0QlRQb2ludCgpLngsIEdldEJUUG9pbnQoKS55IC0gcG9pbnQueSk7Ci0gICAgfTsKLSAgICBpbmxpbmUgQ1BERl9SZWN0CQkJCQkJSW5Ub091dChjb25zdCBDUFZUX0Zsb2F0UmVjdCAmIHJlY3QpIGNvbnN0Ci0gICAgewotICAgICAgICBDUERGX1BvaW50IHB0TGVmdFRvcCA9IEluVG9PdXQoQ1BERl9Qb2ludChyZWN0LmxlZnQsIHJlY3QudG9wKSk7Ci0gICAgICAgIENQREZfUG9pbnQgcHRSaWdodEJvdHRvbSA9IEluVG9PdXQoQ1BERl9Qb2ludChyZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSkpOwotICAgICAgICByZXR1cm4gQ1BERl9SZWN0KHB0TGVmdFRvcC54LCBwdFJpZ2h0Qm90dG9tLnksIHB0UmlnaHRCb3R0b20ueCwgcHRMZWZ0VG9wLnkpOwotICAgIH07Ci0gICAgaW5saW5lIENQVlRfRmxvYXRSZWN0CQkJCQlPdXRUb0luKGNvbnN0IENQREZfUmVjdCAmIHJlY3QpIGNvbnN0Ci0gICAgewotICAgICAgICBDUERGX1BvaW50IHB0TGVmdFRvcCA9IE91dFRvSW4oQ1BERl9Qb2ludChyZWN0LmxlZnQsIHJlY3QudG9wKSk7Ci0gICAgICAgIENQREZfUG9pbnQgcHRSaWdodEJvdHRvbSA9IE91dFRvSW4oQ1BERl9Qb2ludChyZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSkpOwotICAgICAgICByZXR1cm4gQ1BWVF9GbG9hdFJlY3QocHRMZWZ0VG9wLngsIHB0TGVmdFRvcC55LCBwdFJpZ2h0Qm90dG9tLngsIHB0UmlnaHRCb3R0b20ueSk7Ci0gICAgfTsKK2NsYXNzIENUeXBlc2V0IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENUeXBlc2V0KENTZWN0aW9uKiBwU2VjdGlvbik7CisgIHZpcnR1YWwgfkNUeXBlc2V0KCk7CisgIENQVlRfU2l6ZSBHZXRFZGl0U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpOworICBDUFZUX0Zsb2F0UmVjdCBUeXBlc2V0KCk7CisgIENQVlRfRmxvYXRSZWN0IENoYXJBcnJheSgpOwogCi1wcml2YXRlOgotICAgIENQREZfUmVjdAkJCQkJCQkJbV9yY1BsYXRlOwotICAgIENQVlRfRmxvYXRSZWN0CQkJCQkJCW1fcmNDb250ZW50OworIHByaXZhdGU6CisgIHZvaWQgU3BsaXRMaW5lcyhGWF9CT09MIGJUeXBlc2V0LCBGWF9GTE9BVCBmRm9udFNpemUpOworICB2b2lkIE91dHB1dExpbmVzKCk7CisKKyAgQ1BWVF9GbG9hdFJlY3QgbV9yY1JldDsKKyAgQ1BERl9WYXJpYWJsZVRleHQqIG1fcFZUOworICBDU2VjdGlvbiogbV9wU2VjdGlvbjsKIH07Ci1jbGFzcyBDUERGX1ZhcmlhYmxlVGV4dCA6IHB1YmxpYyBJUERGX1ZhcmlhYmxlVGV4dCwgcHJpdmF0ZSBDUERGX0VkaXRDb250YWluZXIKLXsKLSAgICBmcmllbmQgY2xhc3MgQ1R5cGVzZXQ7Ci0gICAgZnJpZW5kIGNsYXNzIENTZWN0aW9uOwotICAgIGZyaWVuZCBjbGFzcyBDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjsKLXB1YmxpYzoKLSAgICBDUERGX1ZhcmlhYmxlVGV4dCgpOwotICAgIHZpcnR1YWwgfkNQREZfVmFyaWFibGVUZXh0KCk7Ci0gICAgSVBERl9WYXJpYWJsZVRleHRfUHJvdmlkZXIqCQkJCVNldFByb3ZpZGVyKElQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyICogcFByb3ZpZGVyKTsKLSAgICBJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcioJCQkJR2V0SXRlcmF0b3IoKTsKLSAgICB2b2lkCQkJCQkJCQkJU2V0UGxhdGVSZWN0KGNvbnN0IENQREZfUmVjdCAmIHJlY3QpCi0gICAgewotICAgICAgICBDUERGX0VkaXRDb250YWluZXI6OlNldFBsYXRlUmVjdChyZWN0KTsKLSAgICB9Ci0gICAgdm9pZAkJCQkJCQkJCVNldEFsaWdubWVudChGWF9JTlQzMiBuRm9ybWF0ID0gMCkKLSAgICB7Ci0gICAgICAgIG1fbkFsaWdubWVudCA9IG5Gb3JtYXQ7Ci0gICAgfQotICAgIHZvaWQJCQkJCQkJCQlTZXRQYXNzd29yZENoYXIoRlhfV09SRCB3U3ViV29yZCA9ICcqJykKLSAgICB7Ci0gICAgICAgIG1fd1N1YldvcmQgPSB3U3ViV29yZDsKLSAgICB9Ci0gICAgdm9pZAkJCQkJCQkJCVNldExpbWl0Q2hhcihGWF9JTlQzMiBuTGltaXRDaGFyID0gMCkKLSAgICB7Ci0gICAgICAgIG1fbkxpbWl0Q2hhciA9IG5MaW1pdENoYXI7Ci0gICAgfQotICAgIHZvaWQJCQkJCQkJCQlTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSA9IDAuMGYpCi0gICAgewotICAgICAgICBtX2ZDaGFyU3BhY2UgPSBmQ2hhclNwYWNlOwotICAgIH0KLSAgICB2b2lkCQkJCQkJCQkJU2V0SG9yelNjYWxlKEZYX0lOVDMyIG5Ib3J6U2NhbGUgPSAxMDApCi0gICAgewotICAgICAgICBtX25Ib3J6U2NhbGUgPSBuSG9yelNjYWxlOwotICAgIH0KLSAgICB2b2lkCQkJCQkJCQkJU2V0TXVsdGlMaW5lKEZYX0JPT0wgYk11bHRpTGluZSA9IFRSVUUpCi0gICAgewotICAgICAgICBtX2JNdWx0aUxpbmUgPSBiTXVsdGlMaW5lOwotICAgIH0KLSAgICB2b2lkCQkJCQkJCQkJU2V0QXV0b1JldHVybihGWF9CT09MIGJBdXRvID0gVFJVRSkKLSAgICB7Ci0gICAgICAgIG1fYkxpbWl0V2lkdGggPSBiQXV0bzsKLSAgICB9Ci0gICAgdm9pZAkJCQkJCQkJCVNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkKLSAgICB7Ci0gICAgICAgIG1fZkZvbnRTaXplID0gZkZvbnRTaXplOwotICAgIH0KLSAgICB2b2lkCQkJCQkJCQkJU2V0Q2hhckFycmF5KEZYX0lOVDMyIG5DaGFyQXJyYXkgPSAwKQotICAgIHsKLSAgICAgICAgbV9uQ2hhckFycmF5ID0gbkNoYXJBcnJheTsKLSAgICB9Ci0gICAgdm9pZAkJCQkJCQkJCVNldEF1dG9Gb250U2l6ZShGWF9CT09MIGJBdXRvID0gVFJVRSkKLSAgICB7Ci0gICAgICAgIG1fYkF1dG9Gb250U2l6ZSA9IGJBdXRvOwotICAgIH0KLSAgICB2b2lkCQkJCQkJCQkJU2V0UmljaFRleHQoRlhfQk9PTCBiUmljaFRleHQpCi0gICAgewotICAgICAgICBtX2JSaWNoVGV4dCA9IGJSaWNoVGV4dDsKLSAgICB9Ci0gICAgdm9pZAkJCQkJCQkJCVNldExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZykKLSAgICB7Ci0gICAgICAgIG1fZkxpbmVMZWFkaW5nID0gZkxpbmVMZWFkaW5nOwotICAgIH0KLSAgICB2b2lkCQkJCQkJCQkJSW5pdGlhbGl6ZSgpOwotICAgIEZYX0JPT0wJCQkJCQkJCQlJc1ZhbGlkKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2JJbml0aWFsOwotICAgIH0KLSAgICBGWF9CT09MCQkJCQkJCQkJSXNSaWNoVGV4dCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9iUmljaFRleHQ7Ci0gICAgfQotICAgIHZvaWQJCQkJCQkJCQlSZWFycmFuZ2VBbGwoKTsKLSAgICB2b2lkCQkJCQkJCQkJUmVhcnJhbmdlUGFydChjb25zdCBDUFZUX1dvcmRSYW5nZSAmIFBsYWNlUmFuZ2UpOwotICAgIHZvaWQJCQkJCQkJCQlSZXNldEFsbCgpOwotICAgIHZvaWQJCQkJCQkJCQlTZXRUZXh0KEZYX0xQQ1dTVFIgdGV4dCwgRlhfSU5UMzIgY2hhcnNldCA9IDEsIGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMgPSBOVUxMLAotICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzID0gTlVMTCk7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJSW5zZXJ0V29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBGWF9XT1JEIHdvcmQsIEZYX0lOVDMyIGNoYXJzZXQgPSAxLAotICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzID0gTlVMTCk7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJSW5zZXJ0U2VjdGlvbihjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzID0gTlVMTCwKLSAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpOwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCUluc2VydFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgRlhfTFBDV1NUUiB0ZXh0LCBGWF9JTlQzMiBjaGFyc2V0ID0gMSwKLSAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMgPSBOVUxMLAljb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgPSBOVUxMKTsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlEZWxldGVXb3Jkcyhjb25zdCBDUFZUX1dvcmRSYW5nZSAmIFBsYWNlUmFuZ2UpOwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCURlbGV0ZVdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSk7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJQmFja1NwYWNlV29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKTsKLSAgICBjb25zdCBDUERGX1JlY3QgJgkJCQkJCUdldFBsYXRlUmVjdCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gQ1BERl9FZGl0Q29udGFpbmVyOjpHZXRQbGF0ZVJlY3QoKTsKLSAgICB9Ci0gICAgQ1BERl9SZWN0CQkJCQkJCQlHZXRDb250ZW50UmVjdCgpIGNvbnN0OwotICAgIEZYX0lOVDMyCQkJCQkJCQlHZXRUb3RhbFdvcmRzKCkgY29uc3Q7Ci0gICAgRlhfRkxPQVQJCQkJCQkJCUdldEZvbnRTaXplKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2ZGb250U2l6ZTsKLSAgICB9Ci0gICAgRlhfSU5UMzIJCQkJCQkJCUdldEFsaWdubWVudCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9uQWxpZ25tZW50OwotICAgIH0KLSAgICBGWF9JTlQzMgkJCQkJCQkJR2V0Q2hhckFycmF5KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX25DaGFyQXJyYXk7Ci0gICAgfQotICAgIEZYX0lOVDMyCQkJCQkJCQlHZXRMaW1pdENoYXIoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbkxpbWl0Q2hhcjsKLSAgICB9Ci0gICAgRlhfQk9PTAkJCQkJCQkJCUlzTXVsdGlMaW5lKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2JNdWx0aUxpbmU7Ci0gICAgfQotICAgIEZYX0lOVDMyCQkJCQkJCQlHZXRIb3J6U2NhbGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbkhvcnpTY2FsZTsKLSAgICB9Ci0gICAgRlhfRkxPQVQJCQkJCQkJCUdldENoYXJTcGFjZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9mQ2hhclNwYWNlOwotICAgIH0KK2NsYXNzIENQREZfRWRpdENvbnRhaW5lciB7CisgcHVibGljOgorICBDUERGX0VkaXRDb250YWluZXIoKSA6IG1fcmNQbGF0ZSgwLCAwLCAwLCAwKSwgbV9yY0NvbnRlbnQoMCwgMCwgMCwgMCkge30KKyAgdmlydHVhbCB+Q1BERl9FZGl0Q29udGFpbmVyKCkge30KKyAgdmlydHVhbCB2b2lkIFNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QmIHJlY3QpIHsgbV9yY1BsYXRlID0gcmVjdDsgfQorICB2aXJ0dWFsIGNvbnN0IENQREZfUmVjdCYgR2V0UGxhdGVSZWN0KCkgY29uc3QgeyByZXR1cm4gbV9yY1BsYXRlOyB9CisgIHZpcnR1YWwgdm9pZCBTZXRDb250ZW50UmVjdChjb25zdCBDUFZUX0Zsb2F0UmVjdCYgcmVjdCkgeworICAgIG1fcmNDb250ZW50ID0gcmVjdDsKKyAgfQorICB2aXJ0dWFsIENQREZfUmVjdCBHZXRDb250ZW50UmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fcmNDb250ZW50OyB9CisgIEZYX0ZMT0FUIEdldFBsYXRlV2lkdGgoKSBjb25zdCB7IHJldHVybiBtX3JjUGxhdGUucmlnaHQgLSBtX3JjUGxhdGUubGVmdDsgfQorICBGWF9GTE9BVCBHZXRQbGF0ZUhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fcmNQbGF0ZS50b3AgLSBtX3JjUGxhdGUuYm90dG9tOyB9CisgIENQVlRfU2l6ZSBHZXRQbGF0ZVNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIENQVlRfU2l6ZShHZXRQbGF0ZVdpZHRoKCksIEdldFBsYXRlSGVpZ2h0KCkpOworICB9CisgIENQREZfUG9pbnQgR2V0QlRQb2ludCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ1BERl9Qb2ludChtX3JjUGxhdGUubGVmdCwgbV9yY1BsYXRlLnRvcCk7CisgIH0KKyAgQ1BERl9Qb2ludCBHZXRFVFBvaW50KCkgY29uc3QgeworICAgIHJldHVybiBDUERGX1BvaW50KG1fcmNQbGF0ZS5yaWdodCwgbV9yY1BsYXRlLmJvdHRvbSk7CisgIH0KKyAgaW5saW5lIENQREZfUG9pbnQgSW5Ub091dChjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3QgeworICAgIHJldHVybiBDUERGX1BvaW50KHBvaW50LnggKyBHZXRCVFBvaW50KCkueCwgR2V0QlRQb2ludCgpLnkgLSBwb2ludC55KTsKKyAgfQorICBpbmxpbmUgQ1BERl9Qb2ludCBPdXRUb0luKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdCB7CisgICAgcmV0dXJuIENQREZfUG9pbnQocG9pbnQueCAtIEdldEJUUG9pbnQoKS54LCBHZXRCVFBvaW50KCkueSAtIHBvaW50LnkpOworICB9CisgIGlubGluZSBDUERGX1JlY3QgSW5Ub091dChjb25zdCBDUFZUX0Zsb2F0UmVjdCYgcmVjdCkgY29uc3QgeworICAgIENQREZfUG9pbnQgcHRMZWZ0VG9wID0gSW5Ub091dChDUERGX1BvaW50KHJlY3QubGVmdCwgcmVjdC50b3ApKTsKKyAgICBDUERGX1BvaW50IHB0UmlnaHRCb3R0b20gPSBJblRvT3V0KENQREZfUG9pbnQocmVjdC5yaWdodCwgcmVjdC5ib3R0b20pKTsKKyAgICByZXR1cm4gQ1BERl9SZWN0KHB0TGVmdFRvcC54LCBwdFJpZ2h0Qm90dG9tLnksIHB0UmlnaHRCb3R0b20ueCwKKyAgICAgICAgICAgICAgICAgICAgIHB0TGVmdFRvcC55KTsKKyAgfQorICBpbmxpbmUgQ1BWVF9GbG9hdFJlY3QgT3V0VG9Jbihjb25zdCBDUERGX1JlY3QmIHJlY3QpIGNvbnN0IHsKKyAgICBDUERGX1BvaW50IHB0TGVmdFRvcCA9IE91dFRvSW4oQ1BERl9Qb2ludChyZWN0LmxlZnQsIHJlY3QudG9wKSk7CisgICAgQ1BERl9Qb2ludCBwdFJpZ2h0Qm90dG9tID0gT3V0VG9JbihDUERGX1BvaW50KHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKSk7CisgICAgcmV0dXJuIENQVlRfRmxvYXRSZWN0KHB0TGVmdFRvcC54LCBwdExlZnRUb3AueSwgcHRSaWdodEJvdHRvbS54LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwdFJpZ2h0Qm90dG9tLnkpOworICB9CiAKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlHZXRCZWdpbldvcmRQbGFjZSgpIGNvbnN0OwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCUdldEVuZFdvcmRQbGFjZSgpIGNvbnN0OwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCUdldFByZXZXb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3Q7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJR2V0TmV4dFdvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdDsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlTZWFyY2hXb3JkUGxhY2UoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdDsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlHZXRVcFdvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0OwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCUdldERvd25Xb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdDsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlHZXRMaW5lQmVnaW5QbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdDsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlHZXRMaW5lRW5kUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3Q7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJR2V0U2VjdGlvbkJlZ2luUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3Q7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJR2V0U2VjdGlvbkVuZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0OwotICAgIHZvaWQJCQkJCQkJCQlVcGRhdGVXb3JkUGxhY2UoQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3Q7Ci0gICAgRlhfSU5UMzIJCQkJCQkJCVdvcmRQbGFjZVRvV29yZEluZGV4KGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0OwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCVdvcmRJbmRleFRvV29yZFBsYWNlKEZYX0lOVDMyIGluZGV4KSBjb25zdDsKLSAgICBGWF9XT1JECQkJCQkJCQkJR2V0UGFzc3dvcmRDaGFyKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBHZXRTdWJXb3JkKCk7Ci0gICAgfQotICAgIEZYX1dPUkQJCQkJCQkJCQlHZXRTdWJXb3JkKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3dTdWJXb3JkOwotICAgIH0KLXByaXZhdGU6Ci0gICAgRlhfSU5UMzIJCQkJCQkJCUdldENoYXJXaWR0aChGWF9JTlQzMiBuRm9udEluZGV4LCBGWF9XT1JEIFdvcmQsIEZYX1dPUkQgU3ViV29yZCwgRlhfSU5UMzIgbldvcmRTdHlsZSk7Ci0gICAgRlhfSU5UMzIJCQkJCQkJCUdldFR5cGVBc2NlbnQoRlhfSU5UMzIgbkZvbnRJbmRleCk7Ci0gICAgRlhfSU5UMzIJCQkJCQkJCUdldFR5cGVEZXNjZW50KEZYX0lOVDMyIG5Gb250SW5kZXgpOwotICAgIEZYX0lOVDMyCQkJCQkJCQlHZXRXb3JkRm9udEluZGV4KEZYX1dPUkQgd29yZCwgRlhfSU5UMzIgY2hhcnNldCwgRlhfSU5UMzIgbkZvbnRJbmRleCk7Ci0gICAgRlhfSU5UMzIJCQkJCQkJCUdldERlZmF1bHRGb250SW5kZXgoKTsKLSAgICBGWF9CT09MCQkJCQkJCQkJSXNMYXRpbldvcmQoRlhfV09SRCB3b3JkKTsKLXByaXZhdGU6Ci0KLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlBZGRTZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGNvbnN0IENQVlRfU2VjdGlvbkluZm8gJiBzZWNpbmZvKTsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlBZGRMaW5lKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIGNvbnN0IENQVlRfTGluZUluZm8gJiBsaW5laW5mbyk7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJQWRkV29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRJbmZvICYgd29yZGluZm8pOwotICAgIEZYX0JPT0wJCQkJCQkJCQlHZXRXb3JkSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBDUFZUX1dvcmRJbmZvICYgd29yZGluZm8pOwotICAgIEZYX0JPT0wJCQkJCQkJCQlTZXRXb3JkSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRJbmZvICYgd29yZGluZm8pOwotICAgIEZYX0JPT0wJCQkJCQkJCQlHZXRMaW5lSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBDUFZUX0xpbmVJbmZvICYgbGluZWluZm8pOwotICAgIEZYX0JPT0wJCQkJCQkJCQlHZXRTZWN0aW9uSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBDUFZUX1NlY3Rpb25JbmZvICYgc2VjaW5mbyk7Ci0gICAgRlhfRkxPQVQJCQkJCQkJCUdldFdvcmRGb250U2l6ZShjb25zdCBDUFZUX1dvcmRJbmZvICYgV29yZEluZm8sIEZYX0JPT0wgYkZhY3RGb250U2l6ZSA9IEZBTFNFKTsKLSAgICBGWF9GTE9BVAkJCQkJCQkJR2V0V29yZFdpZHRoKEZYX0lOVDMyIG5Gb250SW5kZXgsIEZYX1dPUkQgV29yZCwgRlhfV09SRCBTdWJXb3JkLAotICAgICAgICAgICAgRlhfRkxPQVQgZkNoYXJTcGFjZSwgRlhfSU5UMzIgbkhvcnpTY2FsZSwKLSAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSwgRlhfRkxPQVQgZldvcmRUYWlsLCBGWF9JTlQzMiBuV29yZFN0eWxlKTsKLSAgICBGWF9GTE9BVAkJCQkJCQkJR2V0V29yZFdpZHRoKGNvbnN0IENQVlRfV29yZEluZm8gJiBXb3JkSW5mbyk7Ci0gICAgRlhfRkxPQVQJCQkJCQkJCUdldFdvcmRBc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBGWF9GTE9BVCBmRm9udFNpemUpOwotICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRXb3JkRGVzY2VudChjb25zdCBDUFZUX1dvcmRJbmZvICYgV29yZEluZm8sIEZYX0ZMT0FUIGZGb250U2l6ZSk7Ci0gICAgRlhfRkxPQVQJCQkJCQkJCUdldFdvcmRBc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvLCBGWF9CT09MIGJGYWN0Rm9udFNpemUgPSBGQUxTRSk7Ci0gICAgRlhfRkxPQVQJCQkJCQkJCUdldFdvcmREZXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8gJiBXb3JkSW5mbywgRlhfQk9PTCBiRmFjdEZvbnRTaXplID0gRkFMU0UpOwotICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRMaW5lQXNjZW50KGNvbnN0IENQVlRfU2VjdGlvbkluZm8gJiBTZWNJbmZvKTsKLSAgICBGWF9GTE9BVAkJCQkJCQkJR2V0TGluZURlc2NlbnQoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyAmIFNlY0luZm8pOwotICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRGb250QXNjZW50KEZYX0lOVDMyIG5Gb250SW5kZXgsIEZYX0ZMT0FUIGZGb250U2l6ZSk7Ci0gICAgRlhfRkxPQVQJCQkJCQkJCUdldEZvbnREZXNjZW50KEZYX0lOVDMyIG5Gb250SW5kZXgsIEZYX0ZMT0FUIGZGb250U2l6ZSk7Ci0gICAgRlhfSU5UMzIJCQkJCQkJCUdldFdvcmRGb250SW5kZXgoY29uc3QgQ1BWVF9Xb3JkSW5mbyAmIFdvcmRJbmZvKTsKLSAgICBGWF9GTE9BVAkJCQkJCQkJR2V0Q2hhclNwYWNlKGNvbnN0IENQVlRfV29yZEluZm8gJiBXb3JkSW5mbyk7Ci0gICAgRlhfSU5UMzIJCQkJCQkJCUdldEhvcnpTY2FsZShjb25zdCBDUFZUX1dvcmRJbmZvICYgV29yZEluZm8pOwotICAgIEZYX0ZMT0FUCQkJCQkJCQlHZXRMaW5lTGVhZGluZyhjb25zdCBDUFZUX1NlY3Rpb25JbmZvICYgU2VjSW5mbyk7Ci0gICAgRlhfRkxPQVQJCQkJCQkJCUdldExpbmVJbmRlbnQoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyAmIFNlY0luZm8pOwotICAgIEZYX0lOVDMyCQkJCQkJCQlHZXRBbGlnbm1lbnQoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyYgU2VjSW5mbyk7Ci0KLSAgICB2b2lkCQkJCQkJCQkJQ2xlYXJTZWN0aW9uUmlnaHRXb3Jkcyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKTsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlBanVzdExpbmVIZWFkZXIoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgRlhfQk9PTCBiUHJldk9yTmV4dCkgY29uc3Q7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCUNsZWFyRW1wdHlTZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpOwotICAgIHZvaWQJCQkJCQkJCQlDbGVhckVtcHR5U2VjdGlvbnMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKTsKLSAgICB2b2lkCQkJCQkJCQkJTGlua0xhdHRlclNlY3Rpb24oY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSk7Ci0gICAgdm9pZAkJCQkJCQkJCUNsZWFyV29yZHMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKTsKLSAgICBDUFZUX1dvcmRQbGFjZQkJCQkJCQlDbGVhckxlZnRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpOwotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCUNsZWFyUmlnaHRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpOwotcHJpdmF0ZToKLSAgICBDUFZUX0Zsb2F0UmVjdAkJCQkJCQlSZWFycmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKTsKLSAgICBGWF9GTE9BVAkJCQkJCQkJR2V0QXV0b0ZvbnRTaXplKCk7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCUlzQmlnZ2VyKEZYX0ZMT0FUIGZGb250U2l6ZSk7Ci0gICAgQ1BWVF9GbG9hdFJlY3QJCQkJCQkJUmVhcnJhbmdlU2VjdGlvbnMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiBQbGFjZVJhbmdlKTsKLXByaXZhdGU6Ci0gICAgdm9pZAkJCQkJCQkJCVJlc2V0U2VjdGlvbkFycmF5KCk7Ci1wcml2YXRlOgotICAgIENQVlRfQXJyYXlUZW1wbGF0ZTxDU2VjdGlvbio+CQkJbV9TZWN0aW9uQXJyYXk7Ci0gICAgRlhfSU5UMzIJCQkJCQkJCW1fbkxpbWl0Q2hhcjsKLSAgICBGWF9JTlQzMgkJCQkJCQkJbV9uQ2hhckFycmF5OwotICAgIEZYX0JPT0wJCQkJCQkJCQltX2JNdWx0aUxpbmU7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCW1fYkxpbWl0V2lkdGg7Ci0gICAgRlhfQk9PTAkJCQkJCQkJCW1fYkF1dG9Gb250U2l6ZTsKLSAgICBGWF9JTlQzMgkJCQkJCQkJbV9uQWxpZ25tZW50OwotICAgIEZYX0ZMT0FUCQkJCQkJCQltX2ZMaW5lTGVhZGluZzsKLSAgICBGWF9GTE9BVAkJCQkJCQkJbV9mQ2hhclNwYWNlOwotICAgIEZYX0lOVDMyCQkJCQkJCQltX25Ib3J6U2NhbGU7Ci0gICAgRlhfV09SRAkJCQkJCQkJCW1fd1N1YldvcmQ7Ci0gICAgRlhfRkxPQVQJCQkJCQkJCW1fZkZvbnRTaXplOwotCi1wcml2YXRlOgotICAgIEZYX0JPT0wJCQkJCQkJCQltX2JJbml0aWFsOwotICAgIEZYX0JPT0wJCQkJCQkJCQltX2JSaWNoVGV4dDsKLSAgICBJUERGX1ZhcmlhYmxlVGV4dF9Qcm92aWRlciAqCQkJbV9wVlRQcm92aWRlcjsKLSAgICBDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciAqCQkJbV9wVlRJdGVyYXRvcjsKKyBwcml2YXRlOgorICBDUERGX1JlY3QgbV9yY1BsYXRlOworICBDUFZUX0Zsb2F0UmVjdCBtX3JjQ29udGVudDsKIH07Ci1jbGFzcyBDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciA6IHB1YmxpYyBJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcgotewotcHVibGljOgotICAgIENQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKENQREZfVmFyaWFibGVUZXh0ICogcFZUKTsKLSAgICB2aXJ0dWFsIH5DUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcigpOwotICAgIEZYX0JPT0wJCQkJCQkJCQlOZXh0V29yZCgpOwotICAgIEZYX0JPT0wJCQkJCQkJCQlQcmV2V29yZCgpOwotICAgIEZYX0JPT0wJCQkJCQkJCQlOZXh0TGluZSgpOwotICAgIEZYX0JPT0wJCQkJCQkJCQlQcmV2TGluZSgpOwotICAgIEZYX0JPT0wJCQkJCQkJCQlOZXh0U2VjdGlvbigpOwotICAgIEZYX0JPT0wJCQkJCQkJCQlQcmV2U2VjdGlvbigpOwotICAgIEZYX0JPT0wJCQkJCQkJCQlTZXRXb3JkKGNvbnN0IENQVlRfV29yZCAmIHdvcmQpOwotICAgIEZYX0JPT0wJCQkJCQkJCQlHZXRXb3JkKENQVlRfV29yZCAmIHdvcmQpIGNvbnN0OwotICAgIEZYX0JPT0wJCQkJCQkJCQlHZXRMaW5lKENQVlRfTGluZSAmIGxpbmUpIGNvbnN0OwotICAgIEZYX0JPT0wJCQkJCQkJCQlHZXRTZWN0aW9uKENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pIGNvbnN0OwotICAgIEZYX0JPT0wJCQkJCQkJCQlTZXRTZWN0aW9uKGNvbnN0IENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pOwotICAgIHZvaWQJCQkJCQkJCQlTZXRBdChGWF9JTlQzMiBuV29yZEluZGV4KTsKLSAgICB2b2lkCQkJCQkJCQkJU2V0QXQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSk7Ci0gICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJgkJCQkJR2V0QXQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fQ3VyUG9zOwotICAgIH07Ci1wcml2YXRlOgotICAgIENQVlRfV29yZFBsYWNlCQkJCQkJCW1fQ3VyUG9zOwotICAgIENQREZfVmFyaWFibGVUZXh0ICoJCQkJCQltX3BWVDsKKworY2xhc3MgQ1BERl9WYXJpYWJsZVRleHQgOiBwdWJsaWMgSVBERl9WYXJpYWJsZVRleHQsIHByaXZhdGUgQ1BERl9FZGl0Q29udGFpbmVyIHsKKyAgZnJpZW5kIGNsYXNzIENUeXBlc2V0OworICBmcmllbmQgY2xhc3MgQ1NlY3Rpb247CisgIGZyaWVuZCBjbGFzcyBDUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcjsKKworIHB1YmxpYzoKKyAgQ1BERl9WYXJpYWJsZVRleHQoKTsKKyAgfkNQREZfVmFyaWFibGVUZXh0KCkgb3ZlcnJpZGU7CisKKyAgLy8gSVBERl9WYXJpYWJsZVRleHQKKyAgSVBERl9WYXJpYWJsZVRleHRfUHJvdmlkZXIqIFNldFByb3ZpZGVyKAorICAgICAgSVBERl9WYXJpYWJsZVRleHRfUHJvdmlkZXIqIHBQcm92aWRlcikgb3ZlcnJpZGU7CisgIElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKiBHZXRJdGVyYXRvcigpIG92ZXJyaWRlOworICB2b2lkIFNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QmIHJlY3QpIG92ZXJyaWRlIHsKKyAgICBDUERGX0VkaXRDb250YWluZXI6OlNldFBsYXRlUmVjdChyZWN0KTsKKyAgfQorICB2b2lkIFNldEFsaWdubWVudChpbnQzMl90IG5Gb3JtYXQgPSAwKSBvdmVycmlkZSB7IG1fbkFsaWdubWVudCA9IG5Gb3JtYXQ7IH0KKyAgdm9pZCBTZXRQYXNzd29yZENoYXIoRlhfV09SRCB3U3ViV29yZCA9ICcqJykgb3ZlcnJpZGUgeworICAgIG1fd1N1YldvcmQgPSB3U3ViV29yZDsKKyAgfQorICB2b2lkIFNldExpbWl0Q2hhcihpbnQzMl90IG5MaW1pdENoYXIgPSAwKSBvdmVycmlkZSB7CisgICAgbV9uTGltaXRDaGFyID0gbkxpbWl0Q2hhcjsKKyAgfQorICB2b2lkIFNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlID0gMC4wZikgb3ZlcnJpZGUgeworICAgIG1fZkNoYXJTcGFjZSA9IGZDaGFyU3BhY2U7CisgIH0KKyAgdm9pZCBTZXRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlID0gMTAwKSBvdmVycmlkZSB7CisgICAgbV9uSG9yelNjYWxlID0gbkhvcnpTY2FsZTsKKyAgfQorICB2b2lkIFNldE11bHRpTGluZShGWF9CT09MIGJNdWx0aUxpbmUgPSBUUlVFKSBvdmVycmlkZSB7CisgICAgbV9iTXVsdGlMaW5lID0gYk11bHRpTGluZTsKKyAgfQorICB2b2lkIFNldEF1dG9SZXR1cm4oRlhfQk9PTCBiQXV0byA9IFRSVUUpIG92ZXJyaWRlIHsgbV9iTGltaXRXaWR0aCA9IGJBdXRvOyB9CisgIHZvaWQgU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSBvdmVycmlkZSB7IG1fZkZvbnRTaXplID0gZkZvbnRTaXplOyB9CisgIHZvaWQgU2V0Q2hhckFycmF5KGludDMyX3QgbkNoYXJBcnJheSA9IDApIG92ZXJyaWRlIHsKKyAgICBtX25DaGFyQXJyYXkgPSBuQ2hhckFycmF5OworICB9CisgIHZvaWQgU2V0QXV0b0ZvbnRTaXplKEZYX0JPT0wgYkF1dG8gPSBUUlVFKSBvdmVycmlkZSB7CisgICAgbV9iQXV0b0ZvbnRTaXplID0gYkF1dG87CisgIH0KKyAgdm9pZCBTZXRSaWNoVGV4dChGWF9CT09MIGJSaWNoVGV4dCkgb3ZlcnJpZGUgeyBtX2JSaWNoVGV4dCA9IGJSaWNoVGV4dDsgfQorICB2b2lkIFNldExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZykgb3ZlcnJpZGUgeworICAgIG1fZkxpbmVMZWFkaW5nID0gZkxpbmVMZWFkaW5nOworICB9CisgIHZvaWQgSW5pdGlhbGl6ZSgpIG92ZXJyaWRlOworICBGWF9CT09MIElzVmFsaWQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtX2JJbml0aWFsOyB9CisgIEZYX0JPT0wgSXNSaWNoVGV4dCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1fYlJpY2hUZXh0OyB9CisgIHZvaWQgUmVhcnJhbmdlQWxsKCkgb3ZlcnJpZGU7CisgIHZvaWQgUmVhcnJhbmdlUGFydChjb25zdCBDUFZUX1dvcmRSYW5nZSYgUGxhY2VSYW5nZSkgb3ZlcnJpZGU7CisgIHZvaWQgUmVzZXRBbGwoKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LAorICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0ID0gMSwKKyAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMqIHBTZWNQcm9wcyA9IE5VTEwsCisgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcyA9IE5VTEwpIG92ZXJyaWRlOworICBDUFZUX1dvcmRQbGFjZSBJbnNlcnRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0ID0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcyA9IE5VTEwpIG92ZXJyaWRlOworICBDUFZUX1dvcmRQbGFjZSBJbnNlcnRTZWN0aW9uKAorICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzID0gTlVMTCwKKyAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzID0gTlVMTCkgb3ZlcnJpZGU7CisgIENQVlRfV29yZFBsYWNlIEluc2VydFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcyA9IE5VTEwpIG92ZXJyaWRlOworICBDUFZUX1dvcmRQbGFjZSBEZWxldGVXb3Jkcyhjb25zdCBDUFZUX1dvcmRSYW5nZSYgUGxhY2VSYW5nZSkgb3ZlcnJpZGU7CisgIENQVlRfV29yZFBsYWNlIERlbGV0ZVdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBvdmVycmlkZTsKKyAgQ1BWVF9Xb3JkUGxhY2UgQmFja1NwYWNlV29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIG92ZXJyaWRlOworICBjb25zdCBDUERGX1JlY3QmIEdldFBsYXRlUmVjdCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gQ1BERl9FZGl0Q29udGFpbmVyOjpHZXRQbGF0ZVJlY3QoKTsKKyAgfQorICBDUERGX1JlY3QgR2V0Q29udGVudFJlY3QoKSBjb25zdCBvdmVycmlkZTsKKyAgaW50MzJfdCBHZXRUb3RhbFdvcmRzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIEZYX0ZMT0FUIEdldEZvbnRTaXplKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbV9mRm9udFNpemU7IH0KKyAgaW50MzJfdCBHZXRBbGlnbm1lbnQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtX25BbGlnbm1lbnQ7IH0KKyAgRlhfV09SRCBHZXRQYXNzd29yZENoYXIoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBHZXRTdWJXb3JkKCk7IH0KKyAgaW50MzJfdCBHZXRDaGFyQXJyYXkoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtX25DaGFyQXJyYXk7IH0KKyAgaW50MzJfdCBHZXRMaW1pdENoYXIoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtX25MaW1pdENoYXI7IH0KKyAgRlhfQk9PTCBJc011bHRpTGluZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1fYk11bHRpTGluZTsgfQorICBpbnQzMl90IEdldEhvcnpTY2FsZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1fbkhvcnpTY2FsZTsgfQorICBGWF9GTE9BVCBHZXRDaGFyU3BhY2UoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtX2ZDaGFyU3BhY2U7IH0KKyAgQ1BWVF9Xb3JkUGxhY2UgR2V0QmVnaW5Xb3JkUGxhY2UoKSBjb25zdCBvdmVycmlkZTsKKyAgQ1BWVF9Xb3JkUGxhY2UgR2V0RW5kV29yZFBsYWNlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIENQVlRfV29yZFBsYWNlIEdldFByZXZXb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCBvdmVycmlkZTsKKyAgQ1BWVF9Xb3JkUGxhY2UgR2V0TmV4dFdvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IG92ZXJyaWRlOworICBDUFZUX1dvcmRQbGFjZSBTZWFyY2hXb3JkUGxhY2UoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0IG92ZXJyaWRlOworICBDUFZUX1dvcmRQbGFjZSBHZXRVcFdvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdCBvdmVycmlkZTsKKyAgQ1BWVF9Xb3JkUGxhY2UgR2V0RG93bldvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0IG92ZXJyaWRlOworICBDUFZUX1dvcmRQbGFjZSBHZXRMaW5lQmVnaW5QbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IG92ZXJyaWRlOworICBDUFZUX1dvcmRQbGFjZSBHZXRMaW5lRW5kUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCBvdmVycmlkZTsKKyAgQ1BWVF9Xb3JkUGxhY2UgR2V0U2VjdGlvbkJlZ2luUGxhY2UoCisgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IG92ZXJyaWRlOworICBDUFZUX1dvcmRQbGFjZSBHZXRTZWN0aW9uRW5kUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBVcGRhdGVXb3JkUGxhY2UoQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCBvdmVycmlkZTsKKyAgQ1BWVF9Xb3JkUGxhY2UgQWRqdXN0TGluZUhlYWRlcihjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJldk9yTmV4dCkgY29uc3Qgb3ZlcnJpZGU7CisgIGludDMyX3QgV29yZFBsYWNlVG9Xb3JkSW5kZXgoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCBvdmVycmlkZTsKKyAgQ1BWVF9Xb3JkUGxhY2UgV29yZEluZGV4VG9Xb3JkUGxhY2UoaW50MzJfdCBpbmRleCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgRlhfV09SRCBHZXRTdWJXb3JkKCkgY29uc3QgeyByZXR1cm4gbV93U3ViV29yZDsgfQorCisgcHJpdmF0ZToKKyAgaW50MzJfdCBHZXRDaGFyV2lkdGgoaW50MzJfdCBuRm9udEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIFdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgU3ViV29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuV29yZFN0eWxlKTsKKyAgaW50MzJfdCBHZXRUeXBlQXNjZW50KGludDMyX3QgbkZvbnRJbmRleCk7CisgIGludDMyX3QgR2V0VHlwZURlc2NlbnQoaW50MzJfdCBuRm9udEluZGV4KTsKKyAgaW50MzJfdCBHZXRXb3JkRm9udEluZGV4KEZYX1dPUkQgd29yZCwgaW50MzJfdCBjaGFyc2V0LCBpbnQzMl90IG5Gb250SW5kZXgpOworICBpbnQzMl90IEdldERlZmF1bHRGb250SW5kZXgoKTsKKyAgRlhfQk9PTCBJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpOworCisgIENQVlRfV29yZFBsYWNlIEFkZFNlY3Rpb24oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjdGlvbkluZm8mIHNlY2luZm8pOworICBDUFZUX1dvcmRQbGFjZSBBZGRMaW5lKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX0xpbmVJbmZvJiBsaW5laW5mbyk7CisgIENQVlRfV29yZFBsYWNlIEFkZFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZEluZm8mIHdvcmRpbmZvKTsKKyAgRlhfQk9PTCBHZXRXb3JkSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIENQVlRfV29yZEluZm8mIHdvcmRpbmZvKTsKKyAgRlhfQk9PTCBTZXRXb3JkSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkSW5mbyYgd29yZGluZm8pOworICBGWF9CT09MIEdldExpbmVJbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgQ1BWVF9MaW5lSW5mbyYgbGluZWluZm8pOworICBGWF9CT09MIEdldFNlY3Rpb25JbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUFZUX1NlY3Rpb25JbmZvJiBzZWNpbmZvKTsKKyAgRlhfRkxPQVQgR2V0V29yZEZvbnRTaXplKGNvbnN0IENQVlRfV29yZEluZm8mIFdvcmRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmFjdEZvbnRTaXplID0gRkFMU0UpOworICBGWF9GTE9BVCBHZXRXb3JkV2lkdGgoaW50MzJfdCBuRm9udEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCBXb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCBTdWJXb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNoYXJTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkhvcnpTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZXb3JkVGFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbldvcmRTdHlsZSk7CisgIEZYX0ZMT0FUIEdldFdvcmRXaWR0aChjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbyk7CisgIEZYX0ZMT0FUIEdldFdvcmRBc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyYgV29yZEluZm8sIEZYX0ZMT0FUIGZGb250U2l6ZSk7CisgIEZYX0ZMT0FUIEdldFdvcmREZXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8mIFdvcmRJbmZvLCBGWF9GTE9BVCBmRm9udFNpemUpOworICBGWF9GTE9BVCBHZXRXb3JkQXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8mIFdvcmRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZhY3RGb250U2l6ZSA9IEZBTFNFKTsKKyAgRlhfRkxPQVQgR2V0V29yZERlc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyYgV29yZEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZhY3RGb250U2l6ZSA9IEZBTFNFKTsKKyAgRlhfRkxPQVQgR2V0TGluZUFzY2VudChjb25zdCBDUFZUX1NlY3Rpb25JbmZvJiBTZWNJbmZvKTsKKyAgRlhfRkxPQVQgR2V0TGluZURlc2NlbnQoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyYgU2VjSW5mbyk7CisgIEZYX0ZMT0FUIEdldEZvbnRBc2NlbnQoaW50MzJfdCBuRm9udEluZGV4LCBGWF9GTE9BVCBmRm9udFNpemUpOworICBGWF9GTE9BVCBHZXRGb250RGVzY2VudChpbnQzMl90IG5Gb250SW5kZXgsIEZYX0ZMT0FUIGZGb250U2l6ZSk7CisgIGludDMyX3QgR2V0V29yZEZvbnRJbmRleChjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbyk7CisgIEZYX0ZMT0FUIEdldENoYXJTcGFjZShjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbyk7CisgIGludDMyX3QgR2V0SG9yelNjYWxlKGNvbnN0IENQVlRfV29yZEluZm8mIFdvcmRJbmZvKTsKKyAgRlhfRkxPQVQgR2V0TGluZUxlYWRpbmcoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyYgU2VjSW5mbyk7CisgIEZYX0ZMT0FUIEdldExpbmVJbmRlbnQoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyYgU2VjSW5mbyk7CisgIGludDMyX3QgR2V0QWxpZ25tZW50KGNvbnN0IENQVlRfU2VjdGlvbkluZm8mIFNlY0luZm8pOworCisgIHZvaWQgQ2xlYXJTZWN0aW9uUmlnaHRXb3Jkcyhjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpOworCisgIEZYX0JPT0wgQ2xlYXJFbXB0eVNlY3Rpb24oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKTsKKyAgdm9pZCBDbGVhckVtcHR5U2VjdGlvbnMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIFBsYWNlUmFuZ2UpOworICB2b2lkIExpbmtMYXR0ZXJTZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSk7CisgIHZvaWQgQ2xlYXJXb3Jkcyhjb25zdCBDUFZUX1dvcmRSYW5nZSYgUGxhY2VSYW5nZSk7CisgIENQVlRfV29yZFBsYWNlIENsZWFyTGVmdFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKTsKKyAgQ1BWVF9Xb3JkUGxhY2UgQ2xlYXJSaWdodFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKTsKKworIHByaXZhdGU6CisgIENQVlRfRmxvYXRSZWN0IFJlYXJyYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSYgUGxhY2VSYW5nZSk7CisgIEZYX0ZMT0FUIEdldEF1dG9Gb250U2l6ZSgpOworICBGWF9CT09MIElzQmlnZ2VyKEZYX0ZMT0FUIGZGb250U2l6ZSk7CisgIENQVlRfRmxvYXRSZWN0IFJlYXJyYW5nZVNlY3Rpb25zKGNvbnN0IENQVlRfV29yZFJhbmdlJiBQbGFjZVJhbmdlKTsKKworICB2b2lkIFJlc2V0U2VjdGlvbkFycmF5KCk7CisKKyAgQ1BWVF9BcnJheVRlbXBsYXRlPENTZWN0aW9uKj4gbV9TZWN0aW9uQXJyYXk7CisgIGludDMyX3QgbV9uTGltaXRDaGFyOworICBpbnQzMl90IG1fbkNoYXJBcnJheTsKKyAgRlhfQk9PTCBtX2JNdWx0aUxpbmU7CisgIEZYX0JPT0wgbV9iTGltaXRXaWR0aDsKKyAgRlhfQk9PTCBtX2JBdXRvRm9udFNpemU7CisgIGludDMyX3QgbV9uQWxpZ25tZW50OworICBGWF9GTE9BVCBtX2ZMaW5lTGVhZGluZzsKKyAgRlhfRkxPQVQgbV9mQ2hhclNwYWNlOworICBpbnQzMl90IG1fbkhvcnpTY2FsZTsKKyAgRlhfV09SRCBtX3dTdWJXb3JkOworICBGWF9GTE9BVCBtX2ZGb250U2l6ZTsKKworIHByaXZhdGU6CisgIEZYX0JPT0wgbV9iSW5pdGlhbDsKKyAgRlhfQk9PTCBtX2JSaWNoVGV4dDsKKyAgSVBERl9WYXJpYWJsZVRleHRfUHJvdmlkZXIqIG1fcFZUUHJvdmlkZXI7CisgIENQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKiBtX3BWVEl0ZXJhdG9yOworfTsKKworY2xhc3MgQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IgOiBwdWJsaWMgSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1BERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IoQ1BERl9WYXJpYWJsZVRleHQqIHBWVCk7CisgIH5DUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvcigpIG92ZXJyaWRlOworCisgIC8vIElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yCisgIEZYX0JPT0wgTmV4dFdvcmQoKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBQcmV2V29yZCgpIG92ZXJyaWRlOworICBGWF9CT09MIE5leHRMaW5lKCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgUHJldkxpbmUoKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBOZXh0U2VjdGlvbigpIG92ZXJyaWRlOworICBGWF9CT09MIFByZXZTZWN0aW9uKCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgU2V0V29yZChjb25zdCBDUFZUX1dvcmQmIHdvcmQpIG92ZXJyaWRlOworICBGWF9CT09MIEdldFdvcmQoQ1BWVF9Xb3JkJiB3b3JkKSBjb25zdCBvdmVycmlkZTsKKyAgRlhfQk9PTCBHZXRMaW5lKENQVlRfTGluZSYgbGluZSkgY29uc3Qgb3ZlcnJpZGU7CisgIEZYX0JPT0wgR2V0U2VjdGlvbihDUFZUX1NlY3Rpb24mIHNlY3Rpb24pIGNvbnN0IG92ZXJyaWRlOworICBGWF9CT09MIFNldFNlY3Rpb24oY29uc3QgQ1BWVF9TZWN0aW9uJiBzZWN0aW9uKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRBdChpbnQzMl90IG5Xb3JkSW5kZXgpIG92ZXJyaWRlOworICB2b2lkIFNldEF0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgb3ZlcnJpZGU7CisgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBHZXRBdCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1fQ3VyUG9zOyB9CisKKyBwcml2YXRlOgorICBDUFZUX1dvcmRQbGFjZSBtX0N1clBvczsKKyAgQ1BERl9WYXJpYWJsZVRleHQqIG1fcFZUOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX1NSQ19GUERGRE9DX1BERl9WVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZmRvYy90YWdnZWRfaW50LmggYi9jb3JlL3NyYy9mcGRmZG9jL3RhZ2dlZF9pbnQuaAppbmRleCA3NTAwNGU1Li5iOWFlODZiIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmZG9jL3RhZ2dlZF9pbnQuaAorKysgYi9jb3JlL3NyYy9mcGRmZG9jL3RhZ2dlZF9pbnQuaApAQCAtMSw5NSArMSwxMDMgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBDT1JFX1NSQ19GUERGRE9DX1RBR0dFRF9JTlRfSF8KICNkZWZpbmUgQ09SRV9TUkNfRlBERkRPQ19UQUdHRURfSU5UX0hfCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZkb2MvZnBkZl90YWdnZWQuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3RhZ2dlZC5oIgogCiBjbGFzcyBDUERGX1N0cnVjdEVsZW1lbnRJbXBsOwotY2xhc3MgQ1BERl9TdHJ1Y3RUcmVlSW1wbCA6IHB1YmxpYyBDUERGX1N0cnVjdFRyZWUKLXsKLXB1YmxpYzoKLSAgICBDUERGX1N0cnVjdFRyZWVJbXBsKGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2MpOwotICAgIH5DUERGX1N0cnVjdFRyZWVJbXBsKCk7Ci0gICAgaW50CQkJQ291bnRUb3BFbGVtZW50cygpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9LaWRzLkdldFNpemUoKTsKLSAgICB9Ci0gICAgQ1BERl9TdHJ1Y3RFbGVtZW50KglHZXRUb3BFbGVtZW50KGludCBpKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIChDUERGX1N0cnVjdEVsZW1lbnQqKW1fS2lkcy5HZXRBdChpKTsKLSAgICB9Ci0gICAgdm9pZAkJTG9hZERvY1RyZWUoKTsKLSAgICB2b2lkCQlMb2FkUGFnZVRyZWUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QpOwotICAgIENQREZfU3RydWN0RWxlbWVudEltcGwqIEFkZFBhZ2VOb2RlKENQREZfRGljdGlvbmFyeSogcEVsZW1lbnQsIENGWF9NYXBQdHJUb1B0ciYgbWFwLCBpbnQgbkxldmVsID0gMCk7Ci0gICAgRlhfQk9PTAkJQWRkVG9wTGV2ZWxOb2RlKENQREZfRGljdGlvbmFyeSogcERpY3QsIENQREZfU3RydWN0RWxlbWVudEltcGwqIHBFbGVtZW50KTsKLXByb3RlY3RlZDoKLSAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqCW1fcFRyZWVSb290OwotICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSoJbV9wUm9sZU1hcDsKLSAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqCW1fcFBhZ2U7Ci0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9TdHJ1Y3RFbGVtZW50SW1wbCo+CW1fS2lkczsKLSAgICBmcmllbmQgY2xhc3MgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbDsKKworY2xhc3MgQ1BERl9TdHJ1Y3RUcmVlSW1wbCA6IHB1YmxpYyBDUERGX1N0cnVjdFRyZWUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1BERl9TdHJ1Y3RUcmVlSW1wbChjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jKTsKKyAgfkNQREZfU3RydWN0VHJlZUltcGwoKSBvdmVycmlkZTsKKworICAvLyBDUERGX1N0cnVjdFRyZWUKKyAgaW50IENvdW50VG9wRWxlbWVudHMoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtX0tpZHMuR2V0U2l6ZSgpOyB9CisgIENQREZfU3RydWN0RWxlbWVudCogR2V0VG9wRWxlbWVudChpbnQgaSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiAoQ1BERl9TdHJ1Y3RFbGVtZW50KiltX0tpZHMuR2V0QXQoaSk7CisgIH0KKworICB2b2lkIExvYWREb2NUcmVlKCk7CisgIHZvaWQgTG9hZFBhZ2VUcmVlKGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0KTsKKyAgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogQWRkUGFnZU5vZGUoQ1BERl9EaWN0aW9uYXJ5KiBwRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hcFB0clRvUHRyJiBtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuTGV2ZWwgPSAwKTsKKyAgRlhfQk9PTCBBZGRUb3BMZXZlbE5vZGUoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogcEVsZW1lbnQpOworCisgcHJvdGVjdGVkOgorICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIG1fcFRyZWVSb290OworICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIG1fcFJvbGVNYXA7CisgIGNvbnN0IENQREZfRGljdGlvbmFyeSogbV9wUGFnZTsKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9TdHJ1Y3RFbGVtZW50SW1wbCo+IG1fS2lkczsKKyAgZnJpZW5kIGNsYXNzIENQREZfU3RydWN0RWxlbWVudEltcGw7CiB9OwotY2xhc3MgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCBGWF9GSU5BTCA6IHB1YmxpYyBDUERGX1N0cnVjdEVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBDUERGX1N0cnVjdEVsZW1lbnRJbXBsKENQREZfU3RydWN0VHJlZUltcGwqIHBUcmVlLCBDUERGX1N0cnVjdEVsZW1lbnRJbXBsKiBwUGFyZW50LCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKLSAgICBDUERGX1N0cnVjdFRyZWUqCQlHZXRUcmVlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BUcmVlOwotICAgIH0KLSAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYJR2V0VHlwZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9UeXBlOwotICAgIH0KLSAgICBDUERGX1N0cnVjdEVsZW1lbnQqCQlHZXRQYXJlbnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcFBhcmVudDsKLSAgICB9Ci0gICAgQ1BERl9EaWN0aW9uYXJ5ICoJCUdldERpY3QoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcERpY3Q7Ci0gICAgfQotICAgIGludAkJCQkJCUNvdW50S2lkcygpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9LaWRzLkdldFNpemUoKTsKLSAgICB9Ci0gICAgY29uc3QgQ1BERl9TdHJ1Y3RLaWQmCUdldEtpZChpbnQgaW5kZXgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9LaWRzLkdldERhdGEoKVtpbmRleF07Ci0gICAgfQotICAgIENGWF9QdHJBcnJheSoJCQlHZXRPYmplY3RBcnJheSgpCi0gICAgewotICAgICAgICByZXR1cm4gJm1fT2JqZWN0QXJyYXk7Ci0gICAgfQogCi0gICAgQ1BERl9PYmplY3QqCQkJR2V0QXR0cihGWF9CU1RSIG93bmVyLCBGWF9CU1RSIG5hbWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsIEZYX0ZMT0FUIGZMZXZlbCA9IDAuMEYpOworY2xhc3MgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCBmaW5hbCA6IHB1YmxpYyBDUERGX1N0cnVjdEVsZW1lbnQgeworIHB1YmxpYzoKKyAgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbChDUERGX1N0cnVjdFRyZWVJbXBsKiBwVHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1N0cnVjdEVsZW1lbnRJbXBsKiBwUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcJCQlHZXROYW1lKEZYX0JTVFIgb3duZXIsIEZYX0JTVFIgbmFtZSwgRlhfQlNUUiBkZWZhdWx0X3ZhbHVlLCBGWF9CT09MIGJJbmhlcml0YWJsZSA9IEZBTFNFLCBpbnQgc3ViaW5kZXggPSAtMSk7Ci0gICAgRlhfQVJHQgkJCQkJR2V0Q29sb3IoRlhfQlNUUiBvd25lciwgRlhfQlNUUiBuYW1lLCBGWF9BUkdCIGRlZmF1bHRfdmFsdWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsIGludCBzdWJpbmRleCA9IC0xKTsKLSAgICBGWF9GTE9BVAkJCQlHZXROdW1iZXIoRlhfQlNUUiBvd25lciwgRlhfQlNUUiBuYW1lLCBGWF9GTE9BVCBkZWZhdWx0X3ZhbHVlLCBGWF9CT09MIGJJbmhlcml0YWJsZSA9IEZBTFNFLCBpbnQgc3ViaW5kZXggPSAtMSk7Ci0gICAgaW50CQkJCQkJR2V0SW50ZWdlcihGWF9CU1RSIG93bmVyLCBGWF9CU1RSIG5hbWUsIGludCBkZWZhdWx0X3ZhbHVlLCBGWF9CT09MIGJJbmhlcml0YWJsZSA9IEZBTFNFLCBpbnQgc3ViaW5kZXggPSAtMSk7Ci0gICAgQ0ZYX1B0ckFycmF5CQkJbV9PYmplY3RBcnJheTsKLSAgICB2b2lkCQkJCQlMb2FkS2lkcyhDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKLSAgICB2b2lkCQkJCQlMb2FkS2lkKEZYX0RXT1JEIFBhZ2VPYmpOdW0sIENQREZfT2JqZWN0KiBwT2JqLCBDUERGX1N0cnVjdEtpZCogcEtpZCk7Ci0gICAgQ1BERl9PYmplY3QqCQkJR2V0QXR0cihGWF9CU1RSIG93bmVyLCBGWF9CU1RSIG5hbWUsIEZYX0JPT0wgYkluaGVyaXRhYmxlLCBpbnQgc3ViaW5kZXgpOwotICAgIENQREZfU3RydWN0RWxlbWVudEltcGwqCVJldGFpbigpOwotICAgIHZvaWQJCQkJCVJlbGVhc2UoKTsKLXByb3RlY3RlZDoKLSAgICB+Q1BERl9TdHJ1Y3RFbGVtZW50SW1wbCgpOworICAvLyBDUERGX1N0cnVjdFRyZWVJbXBsCisgIENQREZfU3RydWN0VHJlZSogR2V0VHJlZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1fcFRyZWU7IH0KKyAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIEdldFR5cGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtX1R5cGU7IH0KKyAgQ1BERl9TdHJ1Y3RFbGVtZW50KiBHZXRQYXJlbnQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtX3BQYXJlbnQ7IH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBHZXREaWN0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbV9wRGljdDsgfQorICBpbnQgQ291bnRLaWRzKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbV9LaWRzLkdldFNpemUoKTsgfQorICBjb25zdCBDUERGX1N0cnVjdEtpZCYgR2V0S2lkKGludCBpbmRleCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBtX0tpZHMuR2V0RGF0YSgpW2luZGV4XTsKKyAgfQorICBDUERGX09iamVjdCogR2V0QXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZMZXZlbCA9IDAuMEYpIG92ZXJyaWRlOworICBDRlhfQnl0ZVN0cmluZyBHZXROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZGVmYXVsdF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbmhlcml0YWJsZSA9IEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJpbmRleCA9IC0xKSBvdmVycmlkZTsKKyAgRlhfQVJHQiBHZXRDb2xvcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGRlZmF1bHRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW5oZXJpdGFibGUgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICBpbnQgc3ViaW5kZXggPSAtMSkgb3ZlcnJpZGU7CisgIEZYX0ZMT0FUIEdldE51bWJlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZGVmYXVsdF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICBpbnQgc3ViaW5kZXggPSAtMSkgb3ZlcnJpZGU7CisgIGludCBHZXRJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsCisgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRfdmFsdWUsCisgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkluaGVyaXRhYmxlID0gRkFMU0UsCisgICAgICAgICAgICAgICAgIGludCBzdWJpbmRleCA9IC0xKSBvdmVycmlkZTsKIAotICAgIENQREZfU3RydWN0VHJlZUltcGwqCW1fcFRyZWU7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcJCQltX1R5cGU7Ci0gICAgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCoJbV9wUGFyZW50OwotICAgIENQREZfRGljdGlvbmFyeSoJCW1fcERpY3Q7Ci0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9TdHJ1Y3RLaWQ+CW1fS2lkczsKLSAgICBpbnQJCQltX1JlZkNvdW50OworICB2b2lkIExvYWRLaWRzKENQREZfRGljdGlvbmFyeSogcERpY3QpOworICB2b2lkIExvYWRLaWQoRlhfRFdPUkQgUGFnZU9iak51bSwgQ1BERl9PYmplY3QqIHBPYmosIENQREZfU3RydWN0S2lkKiBwS2lkKTsKKyAgQ1BERl9PYmplY3QqIEdldEF0dHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbmhlcml0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YmluZGV4KTsKKyAgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogUmV0YWluKCk7CisgIHZvaWQgUmVsZWFzZSgpOwogCi0gICAgZnJpZW5kIGNsYXNzIENQREZfU3RydWN0VHJlZUltcGw7CisgcHJvdGVjdGVkOgorICB+Q1BERl9TdHJ1Y3RFbGVtZW50SW1wbCgpIG92ZXJyaWRlOworCisgIENQREZfU3RydWN0VHJlZUltcGwqIG1fcFRyZWU7CisgIENGWF9CeXRlU3RyaW5nIG1fVHlwZTsKKyAgQ1BERl9TdHJ1Y3RFbGVtZW50SW1wbCogbV9wUGFyZW50OworICBDUERGX0RpY3Rpb25hcnkqIG1fcERpY3Q7CisgIENGWF9BcnJheVRlbXBsYXRlPENQREZfU3RydWN0S2lkPiBtX0tpZHM7CisgIGludCBtX1JlZkNvdW50OworCisgIGZyaWVuZCBjbGFzcyBDUERGX1N0cnVjdFRyZWVJbXBsOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX1NSQ19GUERGRE9DX1RBR0dFRF9JTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dC5jcHAgYi9jb3JlL3NyYy9mcGRmdGV4dC9mcGRmX3RleHQuY3BwCmluZGV4IGU1OGI1MGQuLjRhZWE3OTcgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dC5jcHAKKysrIGIvY29yZS9zcmMvZnBkZnRleHQvZnBkZl90ZXh0LmNwcApAQCAtMSw3NzggKzEsNzg5IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZW9iai5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZnRleHQvZnBkZl90ZXh0LmgiCi0jaW5jbHVkZSAidHh0cHJvYy5oIgotI2luY2x1ZGUgInRleHRfaW50LmgiCi1leHRlcm4gRlhfTFBDU1RSIEZDU19HZXRBbHRTdHIoRlhfV0NIQVIpOwotQ0ZYX0J5dGVTdHJpbmcgQ2hhckZyb21Vbmljb2RlQWx0KEZYX1dDSEFSIHVuaWNvZGUsIGludCBkZXN0Y3AsIEZYX0xQQ1NUUiBkZWZjaGFyKQotewotICAgIGlmIChkZXN0Y3AgPT0gMCkgewotICAgICAgICBpZiAodW5pY29kZSA8IDB4ODApIHsKLSAgICAgICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygoY2hhcil1bmljb2RlKTsKLSAgICAgICAgfQotICAgICAgICBGWF9MUENTVFIgYWx0c3RyID0gRkNTX0dldEFsdFN0cih1bmljb2RlKTsKLSAgICAgICAgaWYgKGFsdHN0cikgewotICAgICAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKGFsdHN0ciwgLTEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhkZWZjaGFyLCAtMSk7Ci0gICAgfQotICAgIEZYX0JPT0wgYkRlZiA9IEZBTFNFOwotICAgIGNoYXIgYnVmWzEwXTsKLSAgICBpbnQgcmV0ID0gRlhTWVNfV2lkZUNoYXJUb011bHRpQnl0ZShkZXN0Y3AsIDAsICh3Y2hhcl90KikmdW5pY29kZSwgMSwgYnVmLCAxMCwgTlVMTCwgJmJEZWYpOwotICAgIGlmIChyZXQgJiYgIWJEZWYpIHsKLSAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKGJ1ZiwgcmV0KTsKLSAgICB9Ci0gICAgRlhfTFBDU1RSIGFsdHN0ciA9IEZDU19HZXRBbHRTdHIodW5pY29kZSk7Ci0gICAgaWYgKGFsdHN0cikgewotICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoYWx0c3RyLCAtMSk7Ci0gICAgfQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhkZWZjaGFyLCAtMSk7Ci19Ci1DVGV4dFBhZ2U6OkNUZXh0UGFnZSgpCi17Ci19Ci1DVGV4dFBhZ2U6On5DVGV4dFBhZ2UoKQotewotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBtX0Jhc2VMaW5lcy5HZXRTaXplKCk7IGkgKyspIHsKLSAgICAgICAgQ1RleHRCYXNlTGluZSogcEJhc2VMaW5lID0gKENUZXh0QmFzZUxpbmUqKW1fQmFzZUxpbmVzLkdldEF0KGkpOwotICAgICAgICBkZWxldGUgcEJhc2VMaW5lOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbV9UZXh0Q29sdW1ucy5HZXRTaXplKCk7IGkgKyspIHsKLSAgICAgICAgQ1RleHRDb2x1bW4qIHBUZXh0Q29sdW1uID0gKENUZXh0Q29sdW1uKiltX1RleHRDb2x1bW5zLkdldEF0KGkpOwotICAgICAgICBkZWxldGUgcFRleHRDb2x1bW47Ci0gICAgfQotfQotdm9pZCBDVGV4dFBhZ2U6OlByb2Nlc3NPYmplY3QoQ1BERl9QYWdlT2JqZWN0KiBwT2JqZWN0KQotewotICAgIGlmIChwT2JqZWN0LT5tX1R5cGUgIT0gUERGUEFHRV9URVhUKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dCA9IChDUERGX1RleHRPYmplY3QqKXBPYmplY3Q7Ci0gICAgQ1BERl9Gb250KiBwRm9udCA9IHBUZXh0LT5tX1RleHRTdGF0ZS5HZXRGb250KCk7Ci0gICAgaW50IGNvdW50ID0gcFRleHQtPkNvdW50SXRlbXMoKTsKLSAgICBGWF9GTE9BVCogcFBvc0FycmF5ID0gRlhfQWxsb2MyRChGWF9GTE9BVCwgY291bnQsIDIpOwotICAgIHBUZXh0LT5DYWxjQ2hhclBvcyhwUG9zQXJyYXkpOworI2luY2x1ZGUgPGNjdHlwZT4KKyNpbmNsdWRlIDxjd2N0eXBlPgorI2luY2x1ZGUgPG1lbW9yeT4KIAotICAgIEZYX0ZMT0FUIGZvbnRzaXplX2ggPSBwVGV4dC0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemVIKCk7Ci0gICAgRlhfRkxPQVQgZm9udHNpemVfdiA9IHBUZXh0LT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZVYoKTsKLSAgICBGWF9EV09SRCBzcGFjZV9jaGFyY29kZSA9IHBGb250LT5DaGFyQ29kZUZyb21Vbmljb2RlKCcgJyk7Ci0gICAgRlhfRkxPQVQgc3BhY2V3ID0gMDsKLSAgICBpZiAoc3BhY2VfY2hhcmNvZGUgIT0gLTEpIHsKLSAgICAgICAgc3BhY2V3ID0gZm9udHNpemVfaCAqIHBGb250LT5HZXRDaGFyV2lkdGhGKHNwYWNlX2NoYXJjb2RlKSAvIDEwMDA7CisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlb2JqLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZXNvdXJjZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmdGV4dC9mcGRmX3RleHQuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmlkaS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF91Y2QuaCIKKyNpbmNsdWRlICJ0ZXh0X2ludC5oIgorI2luY2x1ZGUgInR4dHByb2MuaCIKKworQ0ZYX0J5dGVTdHJpbmcgQ2hhckZyb21Vbmljb2RlQWx0KEZYX1dDSEFSIHVuaWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBkZWZjaGFyKSB7CisgIGlmIChkZXN0Y3AgPT0gMCkgeworICAgIGlmICh1bmljb2RlIDwgMHg4MCkgeworICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKChjaGFyKXVuaWNvZGUpOwogICAgIH0KLSAgICBpZiAoc3BhY2V3ID09IDApIHsKLSAgICAgICAgc3BhY2V3ID0gZm9udHNpemVfaCAvIDQ7Ci0gICAgfQotICAgIGlmIChwVGV4dC0+bV9UZXh0U3RhdGUuR2V0QmFzZWxpbmVBbmdsZSgpICE9IDApIHsKLSAgICAgICAgaW50IGNjID0gMDsKLSAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXg7Ci0gICAgICAgIHBUZXh0LT5HZXRUZXh0TWF0cml4KCZtYXRyaXgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBUZXh0LT5tX25DaGFyczsgaSArKykgewotICAgICAgICAgICAgRlhfRFdPUkQgY2hhcmNvZGUgPSBwVGV4dC0+bV9uQ2hhcnMgPT0gMSA/IChGWF9EV09SRCkoRlhfVUlOVFBUUilwVGV4dC0+bV9wQ2hhckNvZGVzIDogcFRleHQtPm1fcENoYXJDb2Rlc1tpXTsKLSAgICAgICAgICAgIGlmIChjaGFyY29kZSA9PSAoRlhfRFdPUkQpIC0gMSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfUkVDVCBjaGFyX2JveDsKLSAgICAgICAgICAgIHBGb250LT5HZXRDaGFyQkJveChjaGFyY29kZSwgY2hhcl9ib3gpOwotICAgICAgICAgICAgRlhfRkxPQVQgY2hhcl9sZWZ0ID0gcFBvc0FycmF5ID8gcFBvc0FycmF5W2NjICogMl0gOiBjaGFyX2JveC5sZWZ0ICogcFRleHQtPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCkgLyAxMDAwOwotICAgICAgICAgICAgRlhfRkxPQVQgY2hhcl9yaWdodCA9IHBQb3NBcnJheSA/IHBQb3NBcnJheVtjYyAqIDIgKyAxXSA6IGNoYXJfYm94LnJpZ2h0ICogcFRleHQtPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCkgLyAxMDAwOwotICAgICAgICAgICAgRlhfRkxPQVQgY2hhcl90b3AgPSBjaGFyX2JveC50b3AgKiBwVGV4dC0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKSAvIDEwMDA7Ci0gICAgICAgICAgICBGWF9GTE9BVCBjaGFyX2JvdHRvbSA9IGNoYXJfYm94LmJvdHRvbSAqIHBUZXh0LT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpIC8gMTAwMDsKLSAgICAgICAgICAgIGNjICsrOwotICAgICAgICAgICAgRlhfRkxPQVQgY2hhcl9vcmlneCwgY2hhcl9vcmlneTsKLSAgICAgICAgICAgIG1hdHJpeC5UcmFuc2Zvcm0oY2hhcl9sZWZ0LCAwLCBjaGFyX29yaWd4LCBjaGFyX29yaWd5KTsKLSAgICAgICAgICAgIG1hdHJpeC5UcmFuc2Zvcm1SZWN0KGNoYXJfbGVmdCwgY2hhcl9yaWdodCwgY2hhcl90b3AsIGNoYXJfYm90dG9tKTsKLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKLSAgICAgICAgICAgIHBGb250LT5BcHBlbmRDaGFyKHN0ciwgY2hhcmNvZGUpOwotICAgICAgICAgICAgSW5zZXJ0VGV4dEJveChOVUxMLCBjaGFyX29yaWd5LCBjaGFyX2xlZnQsIGNoYXJfcmlnaHQsIGNoYXJfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2JvdHRvbSwgc3BhY2V3LCBmb250c2l6ZV92LCBzdHIsIHBGb250KTsKLSAgICAgICAgfQotICAgICAgICBpZiAocFBvc0FycmF5KSB7Ci0gICAgICAgICAgICBGWF9GcmVlKHBQb3NBcnJheSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9GTE9BVCByYXRpb19oID0gZm9udHNpemVfaCAvIHBUZXh0LT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpOwotICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBjb3VudCAqIDI7IGlpICsrKSB7Ci0gICAgICAgIHBQb3NBcnJheVtpaV0gKj0gcmF0aW9faDsKLSAgICB9Ci0gICAgRlhfRkxPQVQgYmFzZWxpbmUgPSBwVGV4dC0+bV9Qb3NZOwotICAgIENUZXh0QmFzZUxpbmUqIHBCYXNlTGluZSA9IE5VTEw7Ci0gICAgRlhfRkxPQVQgdG9weSA9IHBUZXh0LT5tX1RvcDsKLSAgICBGWF9GTE9BVCBib3R0b215ID0gcFRleHQtPm1fQm90dG9tOwotICAgIEZYX0ZMT0FUIGxlZnR4ID0gcFRleHQtPm1fTGVmdDsKKyAgICBjb25zdCBGWF9DSEFSKiBhbHRzdHIgPSBGQ1NfR2V0QWx0U3RyKHVuaWNvZGUpOworICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhhbHRzdHIgPyBhbHRzdHIgOiBkZWZjaGFyKTsKKyAgfQorICBjaGFyIGJ1ZlsxMF07CisgIGludCBpRGVmID0gMDsKKyAgaW50IHJldCA9IEZYU1lTX1dpZGVDaGFyVG9NdWx0aUJ5dGUoZGVzdGNwLCAwLCAod2NoYXJfdCopJnVuaWNvZGUsIDEsIGJ1ZiwgMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZpRGVmKTsKKyAgaWYgKHJldCAmJiAhaURlZikgeworICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhidWYsIHJldCk7CisgIH0KKyAgY29uc3QgRlhfQ0hBUiogYWx0c3RyID0gRkNTX0dldEFsdFN0cih1bmljb2RlKTsKKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKGFsdHN0ciA/IGFsdHN0ciA6IGRlZmNoYXIpOworfQorQ1RleHRQYWdlOjpDVGV4dFBhZ2UoKSB7fQorQ1RleHRQYWdlOjp+Q1RleHRQYWdlKCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG1fQmFzZUxpbmVzLkdldFNpemUoKTsgaSsrKSB7CisgICAgZGVsZXRlIG1fQmFzZUxpbmVzLkdldEF0KGkpOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBtX1RleHRDb2x1bW5zLkdldFNpemUoKTsgaSsrKSB7CisgICAgZGVsZXRlIG1fVGV4dENvbHVtbnMuR2V0QXQoaSk7CisgIH0KK30KK3ZvaWQgQ1RleHRQYWdlOjpQcm9jZXNzT2JqZWN0KENQREZfUGFnZU9iamVjdCogcE9iamVjdCkgeworICBpZiAocE9iamVjdC0+bV9UeXBlICE9IFBERlBBR0VfVEVYVCkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX1RleHRPYmplY3QqIHBUZXh0ID0gKENQREZfVGV4dE9iamVjdCopcE9iamVjdDsKKyAgQ1BERl9Gb250KiBwRm9udCA9IHBUZXh0LT5tX1RleHRTdGF0ZS5HZXRGb250KCk7CisgIGludCBjb3VudCA9IHBUZXh0LT5Db3VudEl0ZW1zKCk7CisgIEZYX0ZMT0FUKiBwUG9zQXJyYXkgPSBGWF9BbGxvYzJEKEZYX0ZMT0FULCBjb3VudCwgMik7CisgIHBUZXh0LT5DYWxjQ2hhclBvcyhwUG9zQXJyYXkpOworCisgIEZYX0ZMT0FUIGZvbnRzaXplX2ggPSBwVGV4dC0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemVIKCk7CisgIEZYX0ZMT0FUIGZvbnRzaXplX3YgPSBwVGV4dC0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemVWKCk7CisgIEZYX0RXT1JEIHNwYWNlX2NoYXJjb2RlID0gcEZvbnQtPkNoYXJDb2RlRnJvbVVuaWNvZGUoJyAnKTsKKyAgRlhfRkxPQVQgc3BhY2V3ID0gMDsKKyAgaWYgKHNwYWNlX2NoYXJjb2RlICE9IC0xKSB7CisgICAgc3BhY2V3ID0gZm9udHNpemVfaCAqIHBGb250LT5HZXRDaGFyV2lkdGhGKHNwYWNlX2NoYXJjb2RlKSAvIDEwMDA7CisgIH0KKyAgaWYgKHNwYWNldyA9PSAwKSB7CisgICAgc3BhY2V3ID0gZm9udHNpemVfaCAvIDQ7CisgIH0KKyAgaWYgKHBUZXh0LT5tX1RleHRTdGF0ZS5HZXRCYXNlbGluZUFuZ2xlKCkgIT0gMCkgewogICAgIGludCBjYyA9IDA7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc2VnbWVudDsKLSAgICBpbnQgc3BhY2VfY291bnQgPSAwOwotICAgIEZYX0ZMT0FUIGxhc3RfbGVmdCA9IDAsIGxhc3RfcmlnaHQgPSAwLCBzZWdtZW50X2xlZnQgPSAwLCBzZWdtZW50X3JpZ2h0ID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHBUZXh0LT5tX25DaGFyczsgaSArKykgewotICAgICAgICBGWF9EV09SRCBjaGFyY29kZSA9IHBUZXh0LT5tX25DaGFycyA9PSAxID8gKEZYX0RXT1JEKShGWF9VSU5UUFRSKXBUZXh0LT5tX3BDaGFyQ29kZXMgOiBwVGV4dC0+bV9wQ2hhckNvZGVzW2ldOwotICAgICAgICBpZiAoY2hhcmNvZGUgPT0gKEZYX0RXT1JEKSAtIDEpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEZYX0ZMT0FUIGNoYXJfbGVmdCA9IHBQb3NBcnJheVtjYyAqIDJdOwotICAgICAgICBGWF9GTE9BVCBjaGFyX3JpZ2h0ID0gcFBvc0FycmF5W2NjICogMiArIDFdOwotICAgICAgICBjYyArKzsKLSAgICAgICAgaWYgKGNoYXJfbGVmdCA8IGxhc3RfbGVmdCB8fCAoY2hhcl9sZWZ0IC0gbGFzdF9yaWdodCkgPiBzcGFjZXcgLyAyKSB7Ci0gICAgICAgICAgICBwQmFzZUxpbmUgPSBJbnNlcnRUZXh0Qm94KHBCYXNlTGluZSwgYmFzZWxpbmUsIGxlZnR4ICsgc2VnbWVudF9sZWZ0LCBsZWZ0eCArIHNlZ21lbnRfcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcHksIGJvdHRvbXksIHNwYWNldywgZm9udHNpemVfdiwgc2VnbWVudCwgcEZvbnQpOwotICAgICAgICAgICAgc2VnbWVudF9sZWZ0ID0gY2hhcl9sZWZ0OwotICAgICAgICAgICAgc2VnbWVudCA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzcGFjZV9jb3VudCA+IDEpIHsKLSAgICAgICAgICAgIHBCYXNlTGluZSA9IEluc2VydFRleHRCb3gocEJhc2VMaW5lLCBiYXNlbGluZSwgbGVmdHggKyBzZWdtZW50X2xlZnQsIGxlZnR4ICsgc2VnbWVudF9yaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9weSwgYm90dG9teSwgc3BhY2V3LCBmb250c2l6ZV92LCBzZWdtZW50LCBwRm9udCk7Ci0gICAgICAgICAgICBzZWdtZW50ID0gIiI7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3BhY2VfY291bnQgPT0gMSkgewotICAgICAgICAgICAgcEZvbnQtPkFwcGVuZENoYXIoc2VnbWVudCwgJyAnKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VnbWVudC5HZXRMZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBzZWdtZW50X2xlZnQgPSBjaGFyX2xlZnQ7Ci0gICAgICAgIH0KLSAgICAgICAgc2VnbWVudF9yaWdodCA9IGNoYXJfcmlnaHQ7Ci0gICAgICAgIHBGb250LT5BcHBlbmRDaGFyKHNlZ21lbnQsIGNoYXJjb2RlKTsKLSAgICAgICAgc3BhY2VfY291bnQgPSAwOwotICAgICAgICBsYXN0X2xlZnQgPSBjaGFyX2xlZnQ7Ci0gICAgICAgIGxhc3RfcmlnaHQgPSBjaGFyX3JpZ2h0OworICAgIENGWF9NYXRyaXggbWF0cml4OworICAgIHBUZXh0LT5HZXRUZXh0TWF0cml4KCZtYXRyaXgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcFRleHQtPm1fbkNoYXJzOyBpKyspIHsKKyAgICAgIEZYX0RXT1JEIGNoYXJjb2RlID0gcFRleHQtPm1fbkNoYXJzID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKEZYX0RXT1JEKSh1aW50cHRyX3QpcFRleHQtPm1fcENoYXJDb2RlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwVGV4dC0+bV9wQ2hhckNvZGVzW2ldOworICAgICAgaWYgKGNoYXJjb2RlID09IChGWF9EV09SRCktMSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIEZYX1JFQ1QgY2hhcl9ib3g7CisgICAgICBwRm9udC0+R2V0Q2hhckJCb3goY2hhcmNvZGUsIGNoYXJfYm94KTsKKyAgICAgIEZYX0ZMT0FUIGNoYXJfbGVmdCA9CisgICAgICAgICAgcFBvc0FycmF5ID8gcFBvc0FycmF5W2NjICogMl0KKyAgICAgICAgICAgICAgICAgICAgOiBjaGFyX2JveC5sZWZ0ICogcFRleHQtPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCkgLyAxMDAwOworICAgICAgRlhfRkxPQVQgY2hhcl9yaWdodCA9CisgICAgICAgICAgcFBvc0FycmF5ID8gcFBvc0FycmF5W2NjICogMiArIDFdCisgICAgICAgICAgICAgICAgICAgIDogY2hhcl9ib3gucmlnaHQgKiBwVGV4dC0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKSAvIDEwMDA7CisgICAgICBGWF9GTE9BVCBjaGFyX3RvcCA9CisgICAgICAgICAgY2hhcl9ib3gudG9wICogcFRleHQtPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCkgLyAxMDAwOworICAgICAgRlhfRkxPQVQgY2hhcl9ib3R0b20gPQorICAgICAgICAgIGNoYXJfYm94LmJvdHRvbSAqIHBUZXh0LT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpIC8gMTAwMDsKKyAgICAgIGNjKys7CisgICAgICBGWF9GTE9BVCBjaGFyX29yaWd4LCBjaGFyX29yaWd5OworICAgICAgbWF0cml4LlRyYW5zZm9ybShjaGFyX2xlZnQsIDAsIGNoYXJfb3JpZ3gsIGNoYXJfb3JpZ3kpOworICAgICAgbWF0cml4LlRyYW5zZm9ybVJlY3QoY2hhcl9sZWZ0LCBjaGFyX3JpZ2h0LCBjaGFyX3RvcCwgY2hhcl9ib3R0b20pOworICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyOworICAgICAgcEZvbnQtPkFwcGVuZENoYXIoc3RyLCBjaGFyY29kZSk7CisgICAgICBJbnNlcnRUZXh0Qm94KE5VTEwsIGNoYXJfb3JpZ3ksIGNoYXJfbGVmdCwgY2hhcl9yaWdodCwgY2hhcl90b3AsCisgICAgICAgICAgICAgICAgICAgIGNoYXJfYm90dG9tLCBzcGFjZXcsIGZvbnRzaXplX3YsIHN0ciwgcEZvbnQpOwogICAgIH0KLSAgICBpZiAoc2VnbWVudC5HZXRMZW5ndGgoKSkKLSAgICAgICAgcEJhc2VMaW5lID0gSW5zZXJ0VGV4dEJveChwQmFzZUxpbmUsIGJhc2VsaW5lLCBsZWZ0eCArIHNlZ21lbnRfbGVmdCwgbGVmdHggKyBzZWdtZW50X3JpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcHksIGJvdHRvbXksIHNwYWNldywgZm9udHNpemVfdiwgc2VnbWVudCwgcEZvbnQpOwogICAgIEZYX0ZyZWUocFBvc0FycmF5KTsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfRkxPQVQgcmF0aW9faCA9IGZvbnRzaXplX2ggLyBwVGV4dC0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKTsKKyAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IGNvdW50ICogMjsgaWkrKykgeworICAgIHBQb3NBcnJheVtpaV0gKj0gcmF0aW9faDsKKyAgfQorICBGWF9GTE9BVCBiYXNlbGluZSA9IHBUZXh0LT5tX1Bvc1k7CisgIENUZXh0QmFzZUxpbmUqIHBCYXNlTGluZSA9IE5VTEw7CisgIEZYX0ZMT0FUIHRvcHkgPSBwVGV4dC0+bV9Ub3A7CisgIEZYX0ZMT0FUIGJvdHRvbXkgPSBwVGV4dC0+bV9Cb3R0b207CisgIEZYX0ZMT0FUIGxlZnR4ID0gcFRleHQtPm1fTGVmdDsKKyAgaW50IGNjID0gMDsKKyAgQ0ZYX0J5dGVTdHJpbmcgc2VnbWVudDsKKyAgaW50IHNwYWNlX2NvdW50ID0gMDsKKyAgRlhfRkxPQVQgbGFzdF9sZWZ0ID0gMCwgbGFzdF9yaWdodCA9IDAsIHNlZ21lbnRfbGVmdCA9IDAsIHNlZ21lbnRfcmlnaHQgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IHBUZXh0LT5tX25DaGFyczsgaSsrKSB7CisgICAgRlhfRFdPUkQgY2hhcmNvZGUgPSBwVGV4dC0+bV9uQ2hhcnMgPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKEZYX0RXT1JEKSh1aW50cHRyX3QpcFRleHQtPm1fcENoYXJDb2RlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcFRleHQtPm1fcENoYXJDb2Rlc1tpXTsKKyAgICBpZiAoY2hhcmNvZGUgPT0gKEZYX0RXT1JEKS0xKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgRlhfRkxPQVQgY2hhcl9sZWZ0ID0gcFBvc0FycmF5W2NjICogMl07CisgICAgRlhfRkxPQVQgY2hhcl9yaWdodCA9IHBQb3NBcnJheVtjYyAqIDIgKyAxXTsKKyAgICBjYysrOworICAgIGlmIChjaGFyX2xlZnQgPCBsYXN0X2xlZnQgfHwgKGNoYXJfbGVmdCAtIGxhc3RfcmlnaHQpID4gc3BhY2V3IC8gMikgeworICAgICAgcEJhc2VMaW5lID0gSW5zZXJ0VGV4dEJveChwQmFzZUxpbmUsIGJhc2VsaW5lLCBsZWZ0eCArIHNlZ21lbnRfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdHggKyBzZWdtZW50X3JpZ2h0LCB0b3B5LCBib3R0b215LCBzcGFjZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRzaXplX3YsIHNlZ21lbnQsIHBGb250KTsKKyAgICAgIHNlZ21lbnRfbGVmdCA9IGNoYXJfbGVmdDsKKyAgICAgIHNlZ21lbnQgPSAiIjsKKyAgICB9CisgICAgaWYgKHNwYWNlX2NvdW50ID4gMSkgeworICAgICAgcEJhc2VMaW5lID0gSW5zZXJ0VGV4dEJveChwQmFzZUxpbmUsIGJhc2VsaW5lLCBsZWZ0eCArIHNlZ21lbnRfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdHggKyBzZWdtZW50X3JpZ2h0LCB0b3B5LCBib3R0b215LCBzcGFjZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRzaXplX3YsIHNlZ21lbnQsIHBGb250KTsKKyAgICAgIHNlZ21lbnQgPSAiIjsKKyAgICB9IGVsc2UgaWYgKHNwYWNlX2NvdW50ID09IDEpIHsKKyAgICAgIHBGb250LT5BcHBlbmRDaGFyKHNlZ21lbnQsICcgJyk7CisgICAgfQorICAgIGlmIChzZWdtZW50LkdldExlbmd0aCgpID09IDApIHsKKyAgICAgIHNlZ21lbnRfbGVmdCA9IGNoYXJfbGVmdDsKKyAgICB9CisgICAgc2VnbWVudF9yaWdodCA9IGNoYXJfcmlnaHQ7CisgICAgcEZvbnQtPkFwcGVuZENoYXIoc2VnbWVudCwgY2hhcmNvZGUpOworICAgIHNwYWNlX2NvdW50ID0gMDsKKyAgICBsYXN0X2xlZnQgPSBjaGFyX2xlZnQ7CisgICAgbGFzdF9yaWdodCA9IGNoYXJfcmlnaHQ7CisgIH0KKyAgaWYgKHNlZ21lbnQuR2V0TGVuZ3RoKCkpCisgICAgcEJhc2VMaW5lID0gSW5zZXJ0VGV4dEJveChwQmFzZUxpbmUsIGJhc2VsaW5lLCBsZWZ0eCArIHNlZ21lbnRfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnR4ICsgc2VnbWVudF9yaWdodCwgdG9weSwgYm90dG9teSwgc3BhY2V3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udHNpemVfdiwgc2VnbWVudCwgcEZvbnQpOworICBGWF9GcmVlKHBQb3NBcnJheSk7CiB9Ci1DVGV4dEJhc2VMaW5lKiBDVGV4dFBhZ2U6Okluc2VydFRleHRCb3goQ1RleHRCYXNlTGluZSogcEJhc2VMaW5lLCBGWF9GTE9BVCBiYXNleSwgRlhfRkxPQVQgbGVmdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcmlnaHR4LCBGWF9GTE9BVCB0b3B5LCBGWF9GTE9BVCBib3R0b215LCBGWF9GTE9BVCBzcGFjZXcsIEZYX0ZMT0FUIGZvbnRzaXplX3YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0ciwgQ1BERl9Gb250KiBwRm9udCkKLXsKLSAgICBpZiAoc3RyLkdldExlbmd0aCgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChwQmFzZUxpbmUgPT0gTlVMTCkgewotICAgICAgICBpbnQgaTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG1fQmFzZUxpbmVzLkdldFNpemUoKTsgaSArKykgewotICAgICAgICAgICAgQ1RleHRCYXNlTGluZSogcEV4aXN0TGluZSA9IChDVGV4dEJhc2VMaW5lKiltX0Jhc2VMaW5lcy5HZXRBdChpKTsKLSAgICAgICAgICAgIGlmIChwRXhpc3RMaW5lLT5tX0Jhc2VMaW5lID09IGJhc2V5KSB7Ci0gICAgICAgICAgICAgICAgcEJhc2VMaW5lID0gcEV4aXN0TGluZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwRXhpc3RMaW5lLT5tX0Jhc2VMaW5lIDwgYmFzZXkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocEJhc2VMaW5lID09IE5VTEwpIHsKLSAgICAgICAgICAgIHBCYXNlTGluZSA9IG5ldyBDVGV4dEJhc2VMaW5lOwotICAgICAgICAgICAgcEJhc2VMaW5lLT5tX0Jhc2VMaW5lID0gYmFzZXk7Ci0gICAgICAgICAgICBtX0Jhc2VMaW5lcy5JbnNlcnRBdChpLCBwQmFzZUxpbmUpOwotICAgICAgICB9Ci0gICAgfQotICAgIENGWF9XaWRlU3RyaW5nIHRleHQ7Ci0gICAgRlhfTFBDU1RSIHBTdHIgPSBzdHI7Ci0gICAgaW50IGxlbiA9IHN0ci5HZXRMZW5ndGgoKSwgb2Zmc2V0ID0gMDsKLSAgICB3aGlsZSAob2Zmc2V0IDwgbGVuKSB7Ci0gICAgICAgIEZYX0RXT1JEIGNoID0gcEZvbnQtPkdldE5leHRDaGFyKHBTdHIsIGxlbiwgb2Zmc2V0KTsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgdW5pY29kZV9zdHIgPSBwRm9udC0+VW5pY29kZUZyb21DaGFyQ29kZShjaCk7Ci0gICAgICAgIGlmICh1bmljb2RlX3N0ci5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHRleHQgKz0gKEZYX1dDSEFSKWNoOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdGV4dCArPSB1bmljb2RlX3N0cjsKLSAgICAgICAgfQotICAgIH0KLSAgICBwQmFzZUxpbmUtPkluc2VydFRleHRCb3gobGVmdHgsIHJpZ2h0eCwgdG9weSwgYm90dG9teSwgc3BhY2V3LCBmb250c2l6ZV92LCB0ZXh0KTsKLSAgICByZXR1cm4gcEJhc2VMaW5lOwotfQotdm9pZCBDVGV4dFBhZ2U6OldyaXRlT3V0cHV0KENGWF9XaWRlU3RyaW5nQXJyYXkmIGxpbmVzLCBpbnQgaU1pbldpZHRoKQotewotICAgIEZYX0ZMT0FUIGxhc3RoZWlnaHQgPSAtMTsKLSAgICBGWF9GTE9BVCBsYXN0YmFzZWxpbmUgPSAtMTsKLSAgICBGWF9GTE9BVCBNaW5MZWZ0WCA9IDEwMDAwMDA7Ci0gICAgRlhfRkxPQVQgTWF4UmlnaHRYID0gMDsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbV9CYXNlTGluZXMuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIENUZXh0QmFzZUxpbmUqIHBCYXNlTGluZSA9IChDVGV4dEJhc2VMaW5lKiltX0Jhc2VMaW5lcy5HZXRBdChpKTsKLSAgICAgICAgRlhfRkxPQVQgbGVmdHgsIHJpZ2h0eDsKLSAgICAgICAgaWYgKHBCYXNlTGluZS0+R2V0V2lkdGgobGVmdHgsIHJpZ2h0eCkpIHsKLSAgICAgICAgICAgIGlmIChsZWZ0eCA8IE1pbkxlZnRYKSB7Ci0gICAgICAgICAgICAgICAgTWluTGVmdFggPSBsZWZ0eDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyaWdodHggPiBNYXhSaWdodFgpIHsKLSAgICAgICAgICAgICAgICBNYXhSaWdodFggPSByaWdodHg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IG1fQmFzZUxpbmVzLkdldFNpemUoKTsgaSArKykgewotICAgICAgICBDVGV4dEJhc2VMaW5lKiBwQmFzZUxpbmUgPSAoQ1RleHRCYXNlTGluZSopbV9CYXNlTGluZXMuR2V0QXQoaSk7Ci0gICAgICAgIHBCYXNlTGluZS0+TWVyZ2VCb3hlcygpOwotICAgIH0KLSAgICBmb3IgKGkgPSAxOyBpIDwgbV9CYXNlTGluZXMuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIENUZXh0QmFzZUxpbmUqIHBCYXNlTGluZSA9IChDVGV4dEJhc2VMaW5lKiltX0Jhc2VMaW5lcy5HZXRBdChpKTsKLSAgICAgICAgQ1RleHRCYXNlTGluZSogcFByZXZMaW5lID0gKENUZXh0QmFzZUxpbmUqKW1fQmFzZUxpbmVzLkdldEF0KGkgLSAxKTsKLSAgICAgICAgaWYgKHBCYXNlTGluZS0+Q2FuTWVyZ2UocFByZXZMaW5lKSkgewotICAgICAgICAgICAgcFByZXZMaW5lLT5NZXJnZShwQmFzZUxpbmUpOwotICAgICAgICAgICAgZGVsZXRlIHBCYXNlTGluZTsKLSAgICAgICAgICAgIG1fQmFzZUxpbmVzLlJlbW92ZUF0KGkpOwotICAgICAgICAgICAgaSAtLTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9iQXV0b1dpZHRoKSB7Ci0gICAgICAgIGludCogd2lkdGhzID0gRlhfQWxsb2MoaW50LCBtX0Jhc2VMaW5lcy5HZXRTaXplKCkpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9CYXNlTGluZXMuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgICAgICB3aWR0aHNbaV0gPSAwOwotICAgICAgICAgICAgQ1RleHRCYXNlTGluZSogcEJhc2VMaW5lID0gKENUZXh0QmFzZUxpbmUqKW1fQmFzZUxpbmVzLkdldEF0KGkpOwotICAgICAgICAgICAgaW50IFRvdGFsQ2hhcnMgPSAwOwotICAgICAgICAgICAgRlhfRkxPQVQgVG90YWxXaWR0aCA9IDA7Ci0gICAgICAgICAgICBpbnQgbWluY2hhcnM7Ci0gICAgICAgICAgICBwQmFzZUxpbmUtPkNvdW50Q2hhcnMoVG90YWxDaGFycywgVG90YWxXaWR0aCwgbWluY2hhcnMpOwotICAgICAgICAgICAgaWYgKFRvdGFsQ2hhcnMpIHsKLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBjaGFyd2lkdGggPSBUb3RhbFdpZHRoIC8gVG90YWxDaGFyczsKLSAgICAgICAgICAgICAgICB3aWR0aHNbaV0gPSAoaW50KSgoTWF4UmlnaHRYIC0gTWluTGVmdFgpIC8gY2hhcndpZHRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh3aWR0aHNbaV0gPiAxMDAwKSB7Ci0gICAgICAgICAgICAgICAgd2lkdGhzW2ldID0gMTAwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh3aWR0aHNbaV0gPCBtaW5jaGFycykgewotICAgICAgICAgICAgICAgIHdpZHRoc1tpXSA9IG1pbmNoYXJzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludCBBdmdXaWR0aCA9IDAsIHdpZHRoY291bnQgPSAwOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9CYXNlTGluZXMuR2V0U2l6ZSgpOyBpICsrKQotICAgICAgICAgICAgaWYgKHdpZHRoc1tpXSkgewotICAgICAgICAgICAgICAgIEF2Z1dpZHRoICs9IHdpZHRoc1tpXTsKLSAgICAgICAgICAgICAgICB3aWR0aGNvdW50ICsrOwotICAgICAgICAgICAgfQotICAgICAgICBBdmdXaWR0aCA9IGludCgoRlhfRkxPQVQpQXZnV2lkdGggLyB3aWR0aGNvdW50ICsgMC41KTsKLSAgICAgICAgaW50IE1heFdpZHRoID0gMDsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG1fQmFzZUxpbmVzLkdldFNpemUoKTsgaSArKykKLSAgICAgICAgICAgIGlmIChNYXhXaWR0aCA8IHdpZHRoc1tpXSkgewotICAgICAgICAgICAgICAgIE1heFdpZHRoID0gd2lkdGhzW2ldOwotICAgICAgICAgICAgfQotICAgICAgICBpZiAoTWF4V2lkdGggPiBBdmdXaWR0aCAqIDYgLyA1KSB7Ci0gICAgICAgICAgICBNYXhXaWR0aCA9IEF2Z1dpZHRoICogNiAvIDU7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRnJlZSh3aWR0aHMpOwotICAgICAgICBpZiAoaU1pbldpZHRoIDwgTWF4V2lkdGgpIHsKLSAgICAgICAgICAgIGlNaW5XaWR0aCA9IE1heFdpZHRoOwotICAgICAgICB9Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCBtX0Jhc2VMaW5lcy5HZXRTaXplKCk7IGkgKyspIHsKLSAgICAgICAgQ1RleHRCYXNlTGluZSogcEJhc2VMaW5lID0gKENUZXh0QmFzZUxpbmUqKW1fQmFzZUxpbmVzLkdldEF0KGkpOwotICAgICAgICBwQmFzZUxpbmUtPk1lcmdlQm94ZXMoKTsKLSAgICB9Ci0gICAgaWYgKG1fYktlZXBDb2x1bW4pIHsKLSAgICAgICAgRmluZENvbHVtbnMoKTsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IG1fQmFzZUxpbmVzLkdldFNpemUoKTsgaSArKykgewotICAgICAgICBDVGV4dEJhc2VMaW5lKiBwQmFzZUxpbmUgPSAoQ1RleHRCYXNlTGluZSopbV9CYXNlTGluZXMuR2V0QXQoaSk7Ci0gICAgICAgIGlmIChsYXN0aGVpZ2h0ID49IDApIHsKLSAgICAgICAgICAgIEZYX0ZMT0FUIGR5ID0gbGFzdGJhc2VsaW5lIC0gcEJhc2VMaW5lLT5tX0Jhc2VMaW5lOwotICAgICAgICAgICAgaWYgKGR5ID49IChwQmFzZUxpbmUtPm1fTWF4Rm9udFNpemVWKSAqIDEuNSB8fCBkeSA+PSBsYXN0aGVpZ2h0ICogMS41KSB7Ci0gICAgICAgICAgICAgICAgbGluZXMuQWRkKEwiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbGFzdGhlaWdodCA9IHBCYXNlTGluZS0+bV9NYXhGb250U2l6ZVY7Ci0gICAgICAgIGxhc3RiYXNlbGluZSA9IHBCYXNlTGluZS0+bV9CYXNlTGluZTsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyOwotICAgICAgICBwQmFzZUxpbmUtPldyaXRlT3V0cHV0KHN0ciwgTWluTGVmdFgsIE1heFJpZ2h0WCAtIE1pbkxlZnRYLCBpTWluV2lkdGgpOwotICAgICAgICBsaW5lcy5BZGQoc3RyKTsKLSAgICB9Ci19Ci12b2lkIE5vcm1hbGl6ZUNvbXBvc2l0ZUNoYXIoRlhfV0NIQVIgd0NoYXIsIENGWF9XaWRlU3RyaW5nJiBzRGVzdCkKLXsKLSAgICB3Q2hhciA9IEZYX0dldE1pcnJvckNoYXIod0NoYXIsIFRSVUUsIEZBTFNFKTsKLSAgICBGWF9MUFdTVFIgcERzdCA9IE5VTEw7Ci0gICAgRlhfU1RSU0laRSBuQ291bnQgPSBGWF9Vbmljb2RlX0dldE5vcm1hbGl6YXRpb24od0NoYXIsIHBEc3QpOwotICAgIGlmIChuQ291bnQgPCAxICkgewotICAgICAgICBzRGVzdCArPSB3Q2hhcjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwRHN0ID0gbmV3IEZYX1dDSEFSW25Db3VudF07Ci0gICAgRlhfVW5pY29kZV9HZXROb3JtYWxpemF0aW9uKHdDaGFyLCBwRHN0KTsKLSAgICBmb3IgKGludCBuSW5kZXggPSAwOyBuSW5kZXggPCBuQ291bnQ7IG5JbmRleCsrKSB7Ci0gICAgICAgIHNEZXN0ICs9IHBEc3RbbkluZGV4XTsKLSAgICB9Ci0gICAgZGVsZXRlW10gcERzdDsKLX0KLXZvaWQgTm9ybWFsaXplU3RyaW5nKENGWF9XaWRlU3RyaW5nJiBzdHIpCi17Ci0gICAgaWYgKHN0ci5HZXRMZW5ndGgoKSA8PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc0J1ZmZlcjsKLSAgICBJRlhfQmlkaUNoYXIqIEJpZGlDaGFyID0gSUZYX0JpZGlDaGFyOjpDcmVhdGUoKTsKLSAgICBpZiAoTlVMTCA9PSBCaWRpQ2hhcikJewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENGWF9Xb3JkQXJyYXkgb3JkZXI7Ci0gICAgRlhfQk9PTCBiUjJMID0gRkFMU0U7Ci0gICAgRlhfSU5UMzIgc3RhcnQgPSAwLCBjb3VudCA9IDAsIGkgPSAwOwotICAgIGludCBuUjJMID0gMCwgbkwyUiA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IHN0ci5HZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgIGlmKEJpZGlDaGFyLT5BcHBlbmRDaGFyKHN0ci5HZXRBdChpKSkpIHsKLSAgICAgICAgICAgIEZYX0lOVDMyIHJldCA9IEJpZGlDaGFyLT5HZXRCaWRpSW5mbyhzdGFydCwgY291bnQpOwotICAgICAgICAgICAgb3JkZXIuQWRkKHN0YXJ0KTsKLSAgICAgICAgICAgIG9yZGVyLkFkZChjb3VudCk7Ci0gICAgICAgICAgICBvcmRlci5BZGQocmV0KTsKLSAgICAgICAgICAgIGlmKCFiUjJMKSB7Ci0gICAgICAgICAgICAgICAgaWYocmV0ID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgblIyTCsrOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0ID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgbkwyUisrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZihCaWRpQ2hhci0+RW5kQ2hhcigpKSB7Ci0gICAgICAgIEZYX0lOVDMyIHJldCA9IEJpZGlDaGFyLT5HZXRCaWRpSW5mbyhzdGFydCwgY291bnQpOwotICAgICAgICBvcmRlci5BZGQoc3RhcnQpOwotICAgICAgICBvcmRlci5BZGQoY291bnQpOwotICAgICAgICBvcmRlci5BZGQocmV0KTsKLSAgICAgICAgaWYoIWJSMkwpIHsKLSAgICAgICAgICAgIGlmKHJldCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgblIyTCsrOwotICAgICAgICAgICAgfSBlbHNlIGlmKHJldCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgbkwyUisrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmKG5SMkwgPiAwICYmIG5SMkwgPj0gbkwyUikgewotICAgICAgICBiUjJMID0gVFJVRTsKLSAgICB9Ci0gICAgaWYoYlIyTCkgewotICAgICAgICBpbnQgY291bnQgPSBvcmRlci5HZXRTaXplKCk7Ci0gICAgICAgIGZvcihpbnQgaiA9IGNvdW50IC0gMTsgaiA+IDA7IGogLT0gMykgewotICAgICAgICAgICAgaW50IHJldCA9IG9yZGVyLkdldEF0KGopOwotICAgICAgICAgICAgaW50IHN0YXJ0ID0gb3JkZXIuR2V0QXQoaiAtIDIpOwotICAgICAgICAgICAgaW50IGNvdW50MSA9IG9yZGVyLkdldEF0KGogLSAxKTsKLSAgICAgICAgICAgIGlmKHJldCA9PSAyIHx8IHJldCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpID0gc3RhcnQgKyBjb3VudDEgLSAxOyBpID49IHN0YXJ0OyBpLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgTm9ybWFsaXplQ29tcG9zaXRlQ2hhcihzdHJbaV0sIHNCdWZmZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaSA9IGo7Ci0gICAgICAgICAgICAgICAgRlhfQk9PTCBiU3ltYm9sID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgd2hpbGUoaSA+IDAgJiYgb3JkZXIuR2V0QXQoaSkgIT0gMikgewotICAgICAgICAgICAgICAgICAgICBiU3ltYm9sID0gIW9yZGVyLkdldEF0KGkpOwotICAgICAgICAgICAgICAgICAgICBpIC09IDM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludCBlbmQgPSBzdGFydCArIGNvdW50MSA7Ci0gICAgICAgICAgICAgICAgaW50IG4gPSAwOwotICAgICAgICAgICAgICAgIGlmKGJTeW1ib2wpIHsKLSAgICAgICAgICAgICAgICAgICAgbiA9IGkgKyA2OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG4gPSBpICsgMzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYobiA+PSBqKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihpbnQgbSA9IHN0YXJ0OyBtIDwgZW5kOyBtKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNCdWZmZXIgKz0gc3RyW21dOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaSA9IGo7Ci0gICAgICAgICAgICAgICAgICAgIGogPSBuOwotICAgICAgICAgICAgICAgICAgICBmb3IoOyBuIDw9IGk7IG4gKz0gMykgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gb3JkZXIuR2V0QXQobiAtIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50MSA9IG9yZGVyLkdldEF0KG4gLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmQgPSBzdGFydCArIGNvdW50MSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoaW50IG0gPSBzdGFydDsgbSA8IGVuZDsgbSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc0J1ZmZlciArPSBzdHJbbV07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgY291bnQgPSBvcmRlci5HZXRTaXplKCk7Ci0gICAgICAgIEZYX0JPT0wgYkwyUiA9IEZBTFNFOwotICAgICAgICBmb3IoaW50IGogPSAwOyBqIDwgY291bnQ7IGogKz0gMykgewotICAgICAgICAgICAgaW50IHJldCA9IG9yZGVyLkdldEF0KGogKyAyKTsKLSAgICAgICAgICAgIGludCBzdGFydCA9IG9yZGVyLkdldEF0KGopOwotICAgICAgICAgICAgaW50IGNvdW50MSA9IG9yZGVyLkdldEF0KGogKyAxKTsKLSAgICAgICAgICAgIGlmKHJldCA9PSAyIHx8IChqID09IDAgJiYgcmV0ID09IDAgJiYgIWJMMlIpKSB7Ci0gICAgICAgICAgICAgICAgaW50IGkgPSBqICsgMzsKLSAgICAgICAgICAgICAgICB3aGlsZShiUjJMICYmIGkgPCBjb3VudCkgewotICAgICAgICAgICAgICAgICAgICBpZihvcmRlci5HZXRBdChpICsgMikgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoaSA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGogPSAtMzsKLSAgICAgICAgICAgICAgICAgICAgYkwyUiA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgZW5kID0gc3RyLkdldExlbmd0aCgpIC0gMTsKLSAgICAgICAgICAgICAgICBpZihpIDwgY291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kID0gb3JkZXIuR2V0QXQoaSkgLSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqID0gaSAtIDM7Ci0gICAgICAgICAgICAgICAgZm9yKGludCBuID0gZW5kOyBuID49IHN0YXJ0OyBuLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgTm9ybWFsaXplQ29tcG9zaXRlQ2hhcihzdHJbaV0sIHNCdWZmZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IGVuZCA9IHN0YXJ0ICsgY291bnQxIDsKLSAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNCdWZmZXIgKz0gc3RyW2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBzdHIuRW1wdHkoKTsKLSAgICBzdHIgKz0gc0J1ZmZlcjsKLSAgICBCaWRpQ2hhci0+UmVsZWFzZSgpOwotfQotc3RhdGljIEZYX0JPT0wgSXNOdW1iZXIoQ0ZYX1dpZGVTdHJpbmcmIHN0cikKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5HZXRMZW5ndGgoKTsgaSArKykgewotICAgICAgICBGWF9XQ0hBUiBjaCA9IHN0cltpXTsKLSAgICAgICAgaWYgKChjaCA8ICcwJyB8fCBjaCA+ICc5JykgJiYgY2ggIT0gJy0nICYmIGNoICE9ICcrJyAmJiBjaCAhPSAnLicgJiYgY2ggIT0gJyAnKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci12b2lkIENUZXh0UGFnZTo6RmluZENvbHVtbnMoKQotewotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBtX0Jhc2VMaW5lcy5HZXRTaXplKCk7IGkgKyspIHsKLSAgICAgICAgQ1RleHRCYXNlTGluZSogcEJhc2VMaW5lID0gKENUZXh0QmFzZUxpbmUqKW1fQmFzZUxpbmVzLkdldEF0KGkpOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHBCYXNlTGluZS0+bV9UZXh0TGlzdC5HZXRTaXplKCk7IGogKyspIHsKLSAgICAgICAgICAgIENUZXh0Qm94KiBwVGV4dEJveCA9IChDVGV4dEJveCopcEJhc2VMaW5lLT5tX1RleHRMaXN0LkdldEF0KGopOwotICAgICAgICAgICAgQ1RleHRDb2x1bW4qIHBDb2x1bW4gPSBGaW5kQ29sdW1uKHBUZXh0Qm94LT5tX1JpZ2h0KTsKLSAgICAgICAgICAgIGlmIChwQ29sdW1uID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBwQ29sdW1uID0gbmV3IENUZXh0Q29sdW1uOwotICAgICAgICAgICAgICAgIHBDb2x1bW4tPm1fQ291bnQgPSAxOwotICAgICAgICAgICAgICAgIHBDb2x1bW4tPm1fQXZnUG9zID0gcFRleHRCb3gtPm1fUmlnaHQ7Ci0gICAgICAgICAgICAgICAgcENvbHVtbi0+bV9UZXh0UG9zID0gLTE7Ci0gICAgICAgICAgICAgICAgbV9UZXh0Q29sdW1ucy5BZGQocENvbHVtbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBDb2x1bW4tPm1fQXZnUG9zID0gKHBDb2x1bW4tPm1fQ291bnQgKiBwQ29sdW1uLT5tX0F2Z1BvcyArIHBUZXh0Qm94LT5tX1JpZ2h0KSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocENvbHVtbi0+bV9Db3VudCArIDEpOwotICAgICAgICAgICAgICAgIHBDb2x1bW4tPm1fQ291bnQgKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaW50IG1pbmNvdW50ID0gbV9CYXNlTGluZXMuR2V0U2l6ZSgpIC8gNDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbV9UZXh0Q29sdW1ucy5HZXRTaXplKCk7IGkgKyspIHsKLSAgICAgICAgQ1RleHRDb2x1bW4qIHBUZXh0Q29sdW1uID0gKENUZXh0Q29sdW1uKiltX1RleHRDb2x1bW5zLkdldEF0KGkpOwotICAgICAgICBpZiAocFRleHRDb2x1bW4tPm1fQ291bnQgPj0gbWluY291bnQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZSBwVGV4dENvbHVtbjsKLSAgICAgICAgbV9UZXh0Q29sdW1ucy5SZW1vdmVBdChpKTsKLSAgICAgICAgaSAtLTsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IG1fQmFzZUxpbmVzLkdldFNpemUoKTsgaSArKykgewotICAgICAgICBDVGV4dEJhc2VMaW5lKiBwQmFzZUxpbmUgPSAoQ1RleHRCYXNlTGluZSopbV9CYXNlTGluZXMuR2V0QXQoaSk7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcEJhc2VMaW5lLT5tX1RleHRMaXN0LkdldFNpemUoKTsgaiArKykgewotICAgICAgICAgICAgQ1RleHRCb3gqIHBUZXh0Qm94ID0gKENUZXh0Qm94KilwQmFzZUxpbmUtPm1fVGV4dExpc3QuR2V0QXQoaik7Ci0gICAgICAgICAgICBpZiAoSXNOdW1iZXIocFRleHRCb3gtPm1fVGV4dCkpIHsKLSAgICAgICAgICAgICAgICBwVGV4dEJveC0+bV9wQ29sdW1uID0gRmluZENvbHVtbihwVGV4dEJveC0+bV9SaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1DVGV4dENvbHVtbiogQ1RleHRQYWdlOjpGaW5kQ29sdW1uKEZYX0ZMT0FUIHhwb3MpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1RleHRDb2x1bW5zLkdldFNpemUoKTsgaSArKykgewotICAgICAgICBDVGV4dENvbHVtbiogcENvbHVtbiA9IChDVGV4dENvbHVtbiopbV9UZXh0Q29sdW1ucy5HZXRBdChpKTsKLSAgICAgICAgaWYgKHBDb2x1bW4tPm1fQXZnUG9zIDwgeHBvcyArIDEgJiYgcENvbHVtbi0+bV9BdmdQb3MgPiB4cG9zIC0gMSkgewotICAgICAgICAgICAgcmV0dXJuIHBDb2x1bW47Ci0gICAgICAgIH0KLSAgICB9CitDVGV4dEJhc2VMaW5lKiBDVGV4dFBhZ2U6Okluc2VydFRleHRCb3goQ1RleHRCYXNlTGluZSogcEJhc2VMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJhc2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGxlZnR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHJpZ2h0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB0b3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJvdHRvbXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3BhY2V3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRzaXplX3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqIHBGb250KSB7CisgIGlmIChzdHIuR2V0TGVuZ3RoKCkgPT0gMCkgewogICAgIHJldHVybiBOVUxMOwotfQotdm9pZCBDVGV4dFBhZ2U6OkJyZWFrU3BhY2UoQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaikKLXsKLX0KLUNUZXh0QmFzZUxpbmU6OkNUZXh0QmFzZUxpbmUoKQotewotICAgIG1fVG9wID0gLTEwMDAwMDsKLSAgICBtX0JvdHRvbSA9IDEwMDAwMDsKLSAgICBtX01heEZvbnRTaXplViA9IDA7Ci19Ci1DVGV4dEJhc2VMaW5lOjp+Q1RleHRCYXNlTGluZSgpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1RleHRMaXN0LkdldFNpemUoKTsgaSArKykgewotICAgICAgICBDVGV4dEJveCogcFRleHQgPSAoQ1RleHRCb3gqKW1fVGV4dExpc3QuR2V0QXQoaSk7Ci0gICAgICAgIGRlbGV0ZSBwVGV4dDsKLSAgICB9Ci19Ci12b2lkIENUZXh0QmFzZUxpbmU6Okluc2VydFRleHRCb3goRlhfRkxPQVQgbGVmdHgsIEZYX0ZMT0FUIHJpZ2h0eCwgRlhfRkxPQVQgdG9weSwgRlhfRkxPQVQgYm90dG9teSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzcGFjZXcsIEZYX0ZMT0FUIGZvbnRzaXplX3YsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB0ZXh0KQotewotICAgIGlmIChtX1RvcCA8IHRvcHkpIHsKLSAgICAgICAgbV9Ub3AgPSB0b3B5OwotICAgIH0KLSAgICBpZiAobV9Cb3R0b20gPiBib3R0b215KSB7Ci0gICAgICAgIG1fQm90dG9tID0gYm90dG9teTsKLSAgICB9Ci0gICAgaWYgKG1fTWF4Rm9udFNpemVWIDwgZm9udHNpemVfdikgewotICAgICAgICBtX01heEZvbnRTaXplViA9IGZvbnRzaXplX3Y7Ci0gICAgfQorICB9CisgIGlmICghcEJhc2VMaW5lKSB7CiAgICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG1fVGV4dExpc3QuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIENUZXh0Qm94KiBwVGV4dCA9IChDVGV4dEJveCopbV9UZXh0TGlzdC5HZXRBdChpKTsKLSAgICAgICAgaWYgKHBUZXh0LT5tX0xlZnQgPiBsZWZ0eCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbV9CYXNlTGluZXMuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICAgIENUZXh0QmFzZUxpbmUqIHBFeGlzdExpbmUgPSBtX0Jhc2VMaW5lcy5HZXRBdChpKTsKKyAgICAgIGlmIChwRXhpc3RMaW5lLT5tX0Jhc2VMaW5lID09IGJhc2V5KSB7CisgICAgICAgIHBCYXNlTGluZSA9IHBFeGlzdExpbmU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHBFeGlzdExpbmUtPm1fQmFzZUxpbmUgPCBiYXNleSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KICAgICB9Ci0gICAgQ1RleHRCb3gqIHBUZXh0ID0gbmV3IENUZXh0Qm94OwotICAgIHBUZXh0LT5tX1RleHQgPSB0ZXh0OwotICAgIHBUZXh0LT5tX0xlZnQgPSBsZWZ0eDsKLSAgICBwVGV4dC0+bV9SaWdodCA9IHJpZ2h0eDsKLSAgICBwVGV4dC0+bV9Ub3AgPSB0b3B5OwotICAgIHBUZXh0LT5tX0JvdHRvbSA9IGJvdHRvbXk7Ci0gICAgcFRleHQtPm1fU3BhY2VXaWR0aCA9IHNwYWNldzsKLSAgICBwVGV4dC0+bV9Gb250U2l6ZVYgPSBmb250c2l6ZV92OwotICAgIHBUZXh0LT5tX3BDb2x1bW4gPSBOVUxMOwotICAgIG1fVGV4dExpc3QuSW5zZXJ0QXQoaSwgcFRleHQpOworICAgIGlmICghcEJhc2VMaW5lKSB7CisgICAgICBwQmFzZUxpbmUgPSBuZXcgQ1RleHRCYXNlTGluZTsKKyAgICAgIHBCYXNlTGluZS0+bV9CYXNlTGluZSA9IGJhc2V5OworICAgICAgbV9CYXNlTGluZXMuSW5zZXJ0QXQoaSwgcEJhc2VMaW5lKTsKKyAgICB9CisgIH0KKyAgQ0ZYX1dpZGVTdHJpbmcgdGV4dDsKKyAgY29uc3QgRlhfQ0hBUiogcFN0ciA9IHN0cjsKKyAgaW50IGxlbiA9IHN0ci5HZXRMZW5ndGgoKSwgb2Zmc2V0ID0gMDsKKyAgd2hpbGUgKG9mZnNldCA8IGxlbikgeworICAgIEZYX0RXT1JEIGNoID0gcEZvbnQtPkdldE5leHRDaGFyKHBTdHIsIGxlbiwgb2Zmc2V0KTsKKyAgICBDRlhfV2lkZVN0cmluZyB1bmljb2RlX3N0ciA9IHBGb250LT5Vbmljb2RlRnJvbUNoYXJDb2RlKGNoKTsKKyAgICBpZiAodW5pY29kZV9zdHIuSXNFbXB0eSgpKSB7CisgICAgICB0ZXh0ICs9IChGWF9XQ0hBUiljaDsKKyAgICB9IGVsc2UgeworICAgICAgdGV4dCArPSB1bmljb2RlX3N0cjsKKyAgICB9CisgIH0KKyAgcEJhc2VMaW5lLT5JbnNlcnRUZXh0Qm94KGxlZnR4LCByaWdodHgsIHRvcHksIGJvdHRvbXksIHNwYWNldywgZm9udHNpemVfdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQpOworICByZXR1cm4gcEJhc2VMaW5lOwogfQotRlhfQk9PTCBHZXRJbnRlcnNlY3Rpb24oRlhfRkxPQVQgbG93MSwgRlhfRkxPQVQgaGlnaDEsIEZYX0ZMT0FUIGxvdzIsIEZYX0ZMT0FUIGhpZ2gyLAotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGludGVybG93LCBGWF9GTE9BVCYgaW50ZXJoaWdoKTsKLUZYX0JPT0wgQ1RleHRCYXNlTGluZTo6Q2FuTWVyZ2UoQ1RleHRCYXNlTGluZSogcE90aGVyKQotewotICAgIEZYX0ZMT0FUIGludGVyX3RvcCwgaW50ZXJfYm90dG9tOwotICAgIGlmICghR2V0SW50ZXJzZWN0aW9uKG1fQm90dG9tLCBtX1RvcCwgcE90aGVyLT5tX0JvdHRvbSwgcE90aGVyLT5tX1RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcl9ib3R0b20sIGludGVyX3RvcCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwordm9pZCBDVGV4dFBhZ2U6OldyaXRlT3V0cHV0KENGWF9XaWRlU3RyaW5nQXJyYXkmIGxpbmVzLCBpbnQgaU1pbldpZHRoKSB7CisgIEZYX0ZMT0FUIGxhc3RoZWlnaHQgPSAtMTsKKyAgRlhfRkxPQVQgbGFzdGJhc2VsaW5lID0gLTE7CisgIEZYX0ZMT0FUIE1pbkxlZnRYID0gMTAwMDAwMDsKKyAgRlhfRkxPQVQgTWF4UmlnaHRYID0gMDsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBtX0Jhc2VMaW5lcy5HZXRTaXplKCk7IGkrKykgeworICAgIENUZXh0QmFzZUxpbmUqIHBCYXNlTGluZSA9IG1fQmFzZUxpbmVzLkdldEF0KGkpOworICAgIEZYX0ZMT0FUIGxlZnR4LCByaWdodHg7CisgICAgaWYgKHBCYXNlTGluZS0+R2V0V2lkdGgobGVmdHgsIHJpZ2h0eCkpIHsKKyAgICAgIGlmIChsZWZ0eCA8IE1pbkxlZnRYKSB7CisgICAgICAgIE1pbkxlZnRYID0gbGVmdHg7CisgICAgICB9CisgICAgICBpZiAocmlnaHR4ID4gTWF4UmlnaHRYKSB7CisgICAgICAgIE1heFJpZ2h0WCA9IHJpZ2h0eDsKKyAgICAgIH0KICAgICB9Ci0gICAgRlhfRkxPQVQgaW50ZXJfaCA9IGludGVyX3RvcCAtIGludGVyX2JvdHRvbTsKLSAgICBpZiAoaW50ZXJfaCA8IChtX1RvcCAtIG1fQm90dG9tKSAvIDIgJiYgaW50ZXJfaCA8IChwT3RoZXItPm1fVG9wIC0gcE90aGVyLT5tX0JvdHRvbSkgLyAyKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgbV9CYXNlTGluZXMuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICBtX0Jhc2VMaW5lcy5HZXRBdChpKS0+TWVyZ2VCb3hlcygpOworICB9CisgIGZvciAoaSA9IDE7IGkgPCBtX0Jhc2VMaW5lcy5HZXRTaXplKCk7IGkrKykgeworICAgIENUZXh0QmFzZUxpbmUqIHBCYXNlTGluZSA9IG1fQmFzZUxpbmVzLkdldEF0KGkpOworICAgIENUZXh0QmFzZUxpbmUqIHBQcmV2TGluZSA9IG1fQmFzZUxpbmVzLkdldEF0KGkgLSAxKTsKKyAgICBpZiAocEJhc2VMaW5lLT5DYW5NZXJnZShwUHJldkxpbmUpKSB7CisgICAgICBwUHJldkxpbmUtPk1lcmdlKHBCYXNlTGluZSk7CisgICAgICBkZWxldGUgcEJhc2VMaW5lOworICAgICAgbV9CYXNlTGluZXMuUmVtb3ZlQXQoaSk7CisgICAgICBpLS07CiAgICAgfQotICAgIEZYX0ZMT0FUIGR5ID0gKEZYX0ZMT0FUKUZYU1lTX2ZhYnMobV9CYXNlTGluZSAtIHBPdGhlci0+bV9CYXNlTGluZSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1RleHRMaXN0LkdldFNpemUoKTsgaSArKykgewotICAgICAgICBDVGV4dEJveCogcFRleHQgPSAoQ1RleHRCb3gqKW1fVGV4dExpc3QuR2V0QXQoaSk7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcE90aGVyLT5tX1RleHRMaXN0LkdldFNpemUoKTsgaiArKykgewotICAgICAgICAgICAgQ1RleHRCb3gqIHBPdGhlclRleHQgPSAoQ1RleHRCb3gqKXBPdGhlci0+bV9UZXh0TGlzdC5HZXRBdChqKTsKLSAgICAgICAgICAgIEZYX0ZMT0FUIGludGVyX2xlZnQsIGludGVyX3JpZ2h0OwotICAgICAgICAgICAgaWYgKCFHZXRJbnRlcnNlY3Rpb24ocFRleHQtPm1fTGVmdCwgcFRleHQtPm1fUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3RoZXJUZXh0LT5tX0xlZnQsIHBPdGhlclRleHQtPm1fUmlnaHQsIGludGVyX2xlZnQsIGludGVyX3JpZ2h0KSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfRkxPQVQgaW50ZXJfdyA9IGludGVyX3JpZ2h0IC0gaW50ZXJfbGVmdDsKLSAgICAgICAgICAgIGlmIChpbnRlcl93IDwgcFRleHQtPm1fU3BhY2VXaWR0aCAvIDIgJiYgaW50ZXJfdyA8IHBPdGhlclRleHQtPm1fU3BhY2VXaWR0aCAvIDIpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkeSA+PSAocFRleHQtPm1fQm90dG9tIC0gcFRleHQtPm1fVG9wKSAvIDIgfHwKLSAgICAgICAgICAgICAgICAgICAgZHkgPj0gKHBPdGhlclRleHQtPm1fQm90dG9tIC0gcE90aGVyVGV4dC0+bV9Ub3ApIC8gMikgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICB9CisgIGlmIChtX2JBdXRvV2lkdGgpIHsKKyAgICBpbnQqIHdpZHRocyA9IEZYX0FsbG9jKGludCwgbV9CYXNlTGluZXMuR2V0U2l6ZSgpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbV9CYXNlTGluZXMuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICAgIHdpZHRoc1tpXSA9IDA7CisgICAgICBDVGV4dEJhc2VMaW5lKiBwQmFzZUxpbmUgPSBtX0Jhc2VMaW5lcy5HZXRBdChpKTsKKyAgICAgIGludCBUb3RhbENoYXJzID0gMDsKKyAgICAgIEZYX0ZMT0FUIFRvdGFsV2lkdGggPSAwOworICAgICAgaW50IG1pbmNoYXJzOworICAgICAgcEJhc2VMaW5lLT5Db3VudENoYXJzKFRvdGFsQ2hhcnMsIFRvdGFsV2lkdGgsIG1pbmNoYXJzKTsKKyAgICAgIGlmIChUb3RhbENoYXJzKSB7CisgICAgICAgIEZYX0ZMT0FUIGNoYXJ3aWR0aCA9IFRvdGFsV2lkdGggLyBUb3RhbENoYXJzOworICAgICAgICB3aWR0aHNbaV0gPSAoaW50KSgoTWF4UmlnaHRYIC0gTWluTGVmdFgpIC8gY2hhcndpZHRoKTsKKyAgICAgIH0KKyAgICAgIGlmICh3aWR0aHNbaV0gPiAxMDAwKSB7CisgICAgICAgIHdpZHRoc1tpXSA9IDEwMDA7CisgICAgICB9CisgICAgICBpZiAod2lkdGhzW2ldIDwgbWluY2hhcnMpIHsKKyAgICAgICAgd2lkdGhzW2ldID0gbWluY2hhcnM7CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIGludCBBdmdXaWR0aCA9IDAsIHdpZHRoY291bnQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBtX0Jhc2VMaW5lcy5HZXRTaXplKCk7IGkrKykKKyAgICAgIGlmICh3aWR0aHNbaV0pIHsKKyAgICAgICAgQXZnV2lkdGggKz0gd2lkdGhzW2ldOworICAgICAgICB3aWR0aGNvdW50Kys7CisgICAgICB9CisgICAgQXZnV2lkdGggPSBpbnQoKEZYX0ZMT0FUKUF2Z1dpZHRoIC8gd2lkdGhjb3VudCArIDAuNSk7CisgICAgaW50IE1heFdpZHRoID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbV9CYXNlTGluZXMuR2V0U2l6ZSgpOyBpKyspCisgICAgICBpZiAoTWF4V2lkdGggPCB3aWR0aHNbaV0pIHsKKyAgICAgICAgTWF4V2lkdGggPSB3aWR0aHNbaV07CisgICAgICB9CisgICAgaWYgKE1heFdpZHRoID4gQXZnV2lkdGggKiA2IC8gNSkgeworICAgICAgTWF4V2lkdGggPSBBdmdXaWR0aCAqIDYgLyA1OworICAgIH0KKyAgICBGWF9GcmVlKHdpZHRocyk7CisgICAgaWYgKGlNaW5XaWR0aCA8IE1heFdpZHRoKSB7CisgICAgICBpTWluV2lkdGggPSBNYXhXaWR0aDsKKyAgICB9CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IG1fQmFzZUxpbmVzLkdldFNpemUoKTsgaSsrKSB7CisgICAgbV9CYXNlTGluZXMuR2V0QXQoaSktPk1lcmdlQm94ZXMoKTsKKyAgfQorICBpZiAobV9iS2VlcENvbHVtbikgeworICAgIEZpbmRDb2x1bW5zKCk7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IG1fQmFzZUxpbmVzLkdldFNpemUoKTsgaSsrKSB7CisgICAgQ1RleHRCYXNlTGluZSogcEJhc2VMaW5lID0gbV9CYXNlTGluZXMuR2V0QXQoaSk7CisgICAgaWYgKGxhc3RoZWlnaHQgPj0gMCkgeworICAgICAgRlhfRkxPQVQgZHkgPSBsYXN0YmFzZWxpbmUgLSBwQmFzZUxpbmUtPm1fQmFzZUxpbmU7CisgICAgICBpZiAoZHkgPj0gKHBCYXNlTGluZS0+bV9NYXhGb250U2l6ZVYpICogMS41IHx8IGR5ID49IGxhc3RoZWlnaHQgKiAxLjUpIHsKKyAgICAgICAgbGluZXMuQWRkKEwiIik7CisgICAgICB9CisgICAgfQorICAgIGxhc3RoZWlnaHQgPSBwQmFzZUxpbmUtPm1fTWF4Rm9udFNpemVWOworICAgIGxhc3RiYXNlbGluZSA9IHBCYXNlTGluZS0+bV9CYXNlTGluZTsKKyAgICBDRlhfV2lkZVN0cmluZyBzdHI7CisgICAgcEJhc2VMaW5lLT5Xcml0ZU91dHB1dChzdHIsIE1pbkxlZnRYLCBNYXhSaWdodFggLSBNaW5MZWZ0WCwgaU1pbldpZHRoKTsKKyAgICBsaW5lcy5BZGQoc3RyKTsKKyAgfQogfQotdm9pZCBDVGV4dEJhc2VMaW5lOjpNZXJnZShDVGV4dEJhc2VMaW5lKiBwT3RoZXIpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwT3RoZXItPm1fVGV4dExpc3QuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIENUZXh0Qm94KiBwVGV4dCA9IChDVGV4dEJveCopcE90aGVyLT5tX1RleHRMaXN0LkdldEF0KGkpOwotICAgICAgICBJbnNlcnRUZXh0Qm94KHBUZXh0LT5tX0xlZnQsIHBUZXh0LT5tX1JpZ2h0LCBwVGV4dC0+bV9Ub3AsIHBUZXh0LT5tX0JvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICBwVGV4dC0+bV9TcGFjZVdpZHRoLCBwVGV4dC0+bV9Gb250U2l6ZVYsIHBUZXh0LT5tX1RleHQpOwotICAgIH0KK3ZvaWQgTm9ybWFsaXplQ29tcG9zaXRlQ2hhcihGWF9XQ0hBUiB3Q2hhciwgQ0ZYX1dpZGVTdHJpbmcmIHNEZXN0KSB7CisgIHdDaGFyID0gRlhfR2V0TWlycm9yQ2hhcih3Q2hhciwgVFJVRSwgRkFMU0UpOworICBGWF9XQ0hBUiogcERzdCA9IE5VTEw7CisgIEZYX1NUUlNJWkUgbkNvdW50ID0gRlhfVW5pY29kZV9HZXROb3JtYWxpemF0aW9uKHdDaGFyLCBwRHN0KTsKKyAgaWYgKG5Db3VudCA8IDEpIHsKKyAgICBzRGVzdCArPSB3Q2hhcjsKKyAgICByZXR1cm47CisgIH0KKyAgcERzdCA9IG5ldyBGWF9XQ0hBUltuQ291bnRdOworICBGWF9Vbmljb2RlX0dldE5vcm1hbGl6YXRpb24od0NoYXIsIHBEc3QpOworICBmb3IgKGludCBuSW5kZXggPSAwOyBuSW5kZXggPCBuQ291bnQ7IG5JbmRleCsrKSB7CisgICAgc0Rlc3QgKz0gcERzdFtuSW5kZXhdOworICB9CisgIGRlbGV0ZVtdIHBEc3Q7CiB9Ci1GWF9CT09MIENUZXh0QmFzZUxpbmU6OkdldFdpZHRoKEZYX0ZMT0FUJiBsZWZ0eCwgRlhfRkxPQVQmIHJpZ2h0eCkKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbV9UZXh0TGlzdC5HZXRTaXplKCk7IGkgKyspIHsKLSAgICAgICAgQ1RleHRCb3gqIHBUZXh0ID0gKENUZXh0Qm94KiltX1RleHRMaXN0LkdldEF0KGkpOwotICAgICAgICBpZiAocFRleHQtPm1fVGV4dCAhPSBMIiAiKSB7Ci0gICAgICAgICAgICBicmVhazsKK3ZvaWQgTm9ybWFsaXplU3RyaW5nKENGWF9XaWRlU3RyaW5nJiBzdHIpIHsKKyAgaWYgKHN0ci5HZXRMZW5ndGgoKSA8PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIENGWF9XaWRlU3RyaW5nIHNCdWZmZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfQmlkaUNoYXI+IHBCaWRpQ2hhcihuZXcgQ0ZYX0JpZGlDaGFyKTsKKyAgQ0ZYX1dvcmRBcnJheSBvcmRlcjsKKyAgRlhfQk9PTCBiUjJMID0gRkFMU0U7CisgIGludDMyX3Qgc3RhcnQgPSAwLCBjb3VudCA9IDAsIGkgPSAwOworICBpbnQgblIyTCA9IDAsIG5MMlIgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgc3RyLkdldExlbmd0aCgpOyBpKyspIHsKKyAgICBpZiAocEJpZGlDaGFyLT5BcHBlbmRDaGFyKHN0ci5HZXRBdChpKSkpIHsKKyAgICAgIENGWF9CaWRpQ2hhcjo6RGlyZWN0aW9uIHJldCA9IHBCaWRpQ2hhci0+R2V0QmlkaUluZm8oJnN0YXJ0LCAmY291bnQpOworICAgICAgb3JkZXIuQWRkKHN0YXJ0KTsKKyAgICAgIG9yZGVyLkFkZChjb3VudCk7CisgICAgICBvcmRlci5BZGQocmV0KTsKKyAgICAgIGlmICghYlIyTCkgeworICAgICAgICBpZiAocmV0ID09IENGWF9CaWRpQ2hhcjo6UklHSFQpIHsKKyAgICAgICAgICBuUjJMKys7CisgICAgICAgIH0gZWxzZSBpZiAocmV0ID09IENGWF9CaWRpQ2hhcjo6TEVGVCkgeworICAgICAgICAgIG5MMlIrKzsKICAgICAgICAgfQorICAgICAgfQogICAgIH0KLSAgICBpZiAoaSA9PSBtX1RleHRMaXN0LkdldFNpemUoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKHBCaWRpQ2hhci0+RW5kQ2hhcigpKSB7CisgICAgQ0ZYX0JpZGlDaGFyOjpEaXJlY3Rpb24gcmV0ID0gcEJpZGlDaGFyLT5HZXRCaWRpSW5mbygmc3RhcnQsICZjb3VudCk7CisgICAgb3JkZXIuQWRkKHN0YXJ0KTsKKyAgICBvcmRlci5BZGQoY291bnQpOworICAgIG9yZGVyLkFkZChyZXQpOworICAgIGlmICghYlIyTCkgeworICAgICAgaWYgKHJldCA9PSBDRlhfQmlkaUNoYXI6OlJJR0hUKSB7CisgICAgICAgIG5SMkwrKzsKKyAgICAgIH0gZWxzZSBpZiAocmV0ID09IENGWF9CaWRpQ2hhcjo6TEVGVCkgeworICAgICAgICBuTDJSKys7CisgICAgICB9CiAgICAgfQotICAgIENUZXh0Qm94KiBwVGV4dCA9IChDVGV4dEJveCopbV9UZXh0TGlzdC5HZXRBdChpKTsKLSAgICBsZWZ0eCA9IHBUZXh0LT5tX0xlZnQ7Ci0gICAgZm9yIChpID0gbV9UZXh0TGlzdC5HZXRTaXplKCkgLSAxOyBpID49IDA7IGkgLS0pIHsKLSAgICAgICAgQ1RleHRCb3gqIHBUZXh0ID0gKENUZXh0Qm94KiltX1RleHRMaXN0LkdldEF0KGkpOwotICAgICAgICBpZiAocFRleHQtPm1fVGV4dCAhPSBMIiAiKSB7Ci0gICAgICAgICAgICBicmVhazsKKyAgfQorICBpZiAoblIyTCA+IDAgJiYgblIyTCA+PSBuTDJSKSB7CisgICAgYlIyTCA9IFRSVUU7CisgIH0KKyAgaWYgKGJSMkwpIHsKKyAgICBpbnQgY291bnQgPSBvcmRlci5HZXRTaXplKCk7CisgICAgZm9yIChpbnQgaiA9IGNvdW50IC0gMTsgaiA+IDA7IGogLT0gMykgeworICAgICAgaW50IHJldCA9IG9yZGVyLkdldEF0KGopOworICAgICAgaW50IHN0YXJ0ID0gb3JkZXIuR2V0QXQoaiAtIDIpOworICAgICAgaW50IGNvdW50MSA9IG9yZGVyLkdldEF0KGogLSAxKTsKKyAgICAgIGlmIChyZXQgPT0gMiB8fCByZXQgPT0gMCkgeworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQgKyBjb3VudDEgLSAxOyBpID49IHN0YXJ0OyBpLS0pIHsKKyAgICAgICAgICBOb3JtYWxpemVDb21wb3NpdGVDaGFyKHN0cltpXSwgc0J1ZmZlcik7CiAgICAgICAgIH0KLSAgICB9Ci0gICAgcFRleHQgPSAoQ1RleHRCb3gqKW1fVGV4dExpc3QuR2V0QXQoaSk7Ci0gICAgcmlnaHR4ID0gcFRleHQtPm1fUmlnaHQ7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci12b2lkIENUZXh0QmFzZUxpbmU6Ok1lcmdlQm94ZXMoKQotewotICAgIGludCBpID0gMDsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoaSA+PSBtX1RleHRMaXN0LkdldFNpemUoKSAtIDEpIHsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaSA9IGo7CisgICAgICAgIEZYX0JPT0wgYlN5bWJvbCA9IEZBTFNFOworICAgICAgICB3aGlsZSAoaSA+IDAgJiYgb3JkZXIuR2V0QXQoaSkgIT0gMikgeworICAgICAgICAgIGJTeW1ib2wgPSAhb3JkZXIuR2V0QXQoaSk7CisgICAgICAgICAgaSAtPSAzOwogICAgICAgICB9Ci0gICAgICAgIENUZXh0Qm94KiBwVGhpc1RleHQgPSAoQ1RleHRCb3gqKW1fVGV4dExpc3QuR2V0QXQoaSk7Ci0gICAgICAgIENUZXh0Qm94KiBwTmV4dFRleHQgPSAoQ1RleHRCb3gqKW1fVGV4dExpc3QuR2V0QXQoaSArIDEpOwotICAgICAgICBGWF9GTE9BVCBkeCA9IHBOZXh0VGV4dC0+bV9MZWZ0IC0gcFRoaXNUZXh0LT5tX1JpZ2h0OwotICAgICAgICBGWF9GTE9BVCBzcGFjZXcgPSAocFRoaXNUZXh0LT5tX1NwYWNlV2lkdGggPT0gMC4wKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0VGV4dC0+bV9TcGFjZVdpZHRoIDogcFRoaXNUZXh0LT5tX1NwYWNlV2lkdGg7Ci0gICAgICAgIGlmIChzcGFjZXcgPiAwLjAgJiYgZHggPCBzcGFjZXcgKiAyKSB7Ci0gICAgICAgICAgICBwVGhpc1RleHQtPm1fUmlnaHQgPSBwTmV4dFRleHQtPm1fUmlnaHQ7Ci0gICAgICAgICAgICBpZiAoZHggPiBzcGFjZXcgKiAxLjUpIHsKLSAgICAgICAgICAgICAgICBwVGhpc1RleHQtPm1fVGV4dCArPSBMIiAgIjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZHggPiBzcGFjZXcgLyAzKSB7Ci0gICAgICAgICAgICAgICAgcFRoaXNUZXh0LT5tX1RleHQgKz0gTCcgJzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBUaGlzVGV4dC0+bV9UZXh0ICs9IHBOZXh0VGV4dC0+bV9UZXh0OwotICAgICAgICAgICAgcFRoaXNUZXh0LT5tX1NwYWNlV2lkdGggPSBwTmV4dFRleHQtPm1fU3BhY2VXaWR0aCA9PSAwLjAgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZXcgOiBwTmV4dFRleHQtPm1fU3BhY2VXaWR0aDsKLSAgICAgICAgICAgIG1fVGV4dExpc3QuUmVtb3ZlQXQoaSArIDEpOwotICAgICAgICAgICAgZGVsZXRlIHBOZXh0VGV4dDsKKyAgICAgICAgaW50IGVuZCA9IHN0YXJ0ICsgY291bnQxOworICAgICAgICBpbnQgbiA9IDA7CisgICAgICAgIGlmIChiU3ltYm9sKSB7CisgICAgICAgICAgbiA9IGkgKyA2OwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaSArKzsKKyAgICAgICAgICBuID0gaSArIDM7CiAgICAgICAgIH0KLSAgICB9Ci19Ci12b2lkIENUZXh0QmFzZUxpbmU6OldyaXRlT3V0cHV0KENGWF9XaWRlU3RyaW5nJiBzdHIsIEZYX0ZMT0FUIGxlZnR4LCBGWF9GTE9BVCBwYWdld2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpVGV4dFdpZHRoKQotewotICAgIGludCBsYXN0cG9zID0gLTE7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1RleHRMaXN0LkdldFNpemUoKTsgaSArKykgewotICAgICAgICBDVGV4dEJveCogcFRleHQgPSAoQ1RleHRCb3gqKW1fVGV4dExpc3QuR2V0QXQoaSk7Ci0gICAgICAgIGludCB4cG9zOwotICAgICAgICBpZiAocFRleHQtPm1fcENvbHVtbikgewotICAgICAgICAgICAgeHBvcyA9IChpbnQpKChwVGV4dC0+bV9wQ29sdW1uLT5tX0F2Z1BvcyAtIGxlZnR4KSAqIGlUZXh0V2lkdGggLyBwYWdld2lkdGggKyAwLjUpOwotICAgICAgICAgICAgeHBvcyAtPSBwVGV4dC0+bV9UZXh0LkdldExlbmd0aCgpOworICAgICAgICBpZiAobiA+PSBqKSB7CisgICAgICAgICAgZm9yIChpbnQgbSA9IHN0YXJ0OyBtIDwgZW5kOyBtKyspIHsKKyAgICAgICAgICAgIHNCdWZmZXIgKz0gc3RyW21dOworICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHhwb3MgPSAoaW50KSgocFRleHQtPm1fTGVmdCAtIGxlZnR4KSAqIGlUZXh0V2lkdGggLyBwYWdld2lkdGggKyAwLjUpOworICAgICAgICAgIGkgPSBqOworICAgICAgICAgIGogPSBuOworICAgICAgICAgIGZvciAoOyBuIDw9IGk7IG4gKz0gMykgeworICAgICAgICAgICAgaW50IHN0YXJ0ID0gb3JkZXIuR2V0QXQobiAtIDIpOworICAgICAgICAgICAgaW50IGNvdW50MSA9IG9yZGVyLkdldEF0KG4gLSAxKTsKKyAgICAgICAgICAgIGludCBlbmQgPSBzdGFydCArIGNvdW50MTsKKyAgICAgICAgICAgIGZvciAoaW50IG0gPSBzdGFydDsgbSA8IGVuZDsgbSsrKSB7CisgICAgICAgICAgICAgIHNCdWZmZXIgKz0gc3RyW21dOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoeHBvcyA8PSBsYXN0cG9zKSB7Ci0gICAgICAgICAgICB4cG9zID0gbGFzdHBvcyArIDE7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaiA9IGxhc3Rwb3MgKyAxOyBqIDwgeHBvczsgaiArKykgewotICAgICAgICAgICAgc3RyICs9ICcgJzsKLSAgICAgICAgfQotICAgICAgICBDRlhfV2lkZVN0cmluZyBzU3JjKHBUZXh0LT5tX1RleHQpOwotICAgICAgICBOb3JtYWxpemVTdHJpbmcoc1NyYyk7Ci0gICAgICAgIHN0ciArPSBzU3JjOwotICAgICAgICBzdHIgKz0gJyAnOwotICAgICAgICBsYXN0cG9zID0geHBvcyArIHBUZXh0LT5tX1RleHQuR2V0TGVuZ3RoKCk7CisgICAgICB9CiAgICAgfQorICB9IGVsc2UgeworICAgIGludCBjb3VudCA9IG9yZGVyLkdldFNpemUoKTsKKyAgICBGWF9CT09MIGJMMlIgPSBGQUxTRTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvdW50OyBqICs9IDMpIHsKKyAgICAgIGludCByZXQgPSBvcmRlci5HZXRBdChqICsgMik7CisgICAgICBpbnQgc3RhcnQgPSBvcmRlci5HZXRBdChqKTsKKyAgICAgIGludCBjb3VudDEgPSBvcmRlci5HZXRBdChqICsgMSk7CisgICAgICBpZiAocmV0ID09IDIgfHwgKGogPT0gMCAmJiByZXQgPT0gMCAmJiAhYkwyUikpIHsKKyAgICAgICAgaW50IGkgPSBqICsgMzsKKyAgICAgICAgd2hpbGUgKGJSMkwgJiYgaSA8IGNvdW50KSB7CisgICAgICAgICAgaWYgKG9yZGVyLkdldEF0KGkgKyAyKSA9PSAxKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaSArPSAzOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaSA9PSAzKSB7CisgICAgICAgICAgaiA9IC0zOworICAgICAgICAgIGJMMlIgPSBUUlVFOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGludCBlbmQgPSBzdHIuR2V0TGVuZ3RoKCkgLSAxOworICAgICAgICBpZiAoaSA8IGNvdW50KSB7CisgICAgICAgICAgZW5kID0gb3JkZXIuR2V0QXQoaSkgLSAxOworICAgICAgICB9CisgICAgICAgIGogPSBpIC0gMzsKKyAgICAgICAgZm9yIChpbnQgbiA9IGVuZDsgbiA+PSBzdGFydDsgbi0tKSB7CisgICAgICAgICAgTm9ybWFsaXplQ29tcG9zaXRlQ2hhcihzdHJbaV0sIHNCdWZmZXIpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgZW5kID0gc3RhcnQgKyBjb3VudDE7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CisgICAgICAgICAgc0J1ZmZlciArPSBzdHJbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgc3RyLkVtcHR5KCk7CisgIHN0ciArPSBzQnVmZmVyOwogfQotdm9pZCBDVGV4dEJhc2VMaW5lOjpDb3VudENoYXJzKGludCYgY291bnQsIEZYX0ZMT0FUJiB3aWR0aCwgaW50JiBtaW5jaGFycykKLXsKLSAgICBtaW5jaGFycyA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1RleHRMaXN0LkdldFNpemUoKTsgaSArKykgewotICAgICAgICBDVGV4dEJveCogcFRleHQgPSAoQ1RleHRCb3gqKW1fVGV4dExpc3QuR2V0QXQoaSk7Ci0gICAgICAgIGlmIChwVGV4dC0+bV9SaWdodCAtIHBUZXh0LT5tX0xlZnQgPCAwLjAwMikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgY291bnQgKz0gcFRleHQtPm1fVGV4dC5HZXRMZW5ndGgoKTsKLSAgICAgICAgd2lkdGggKz0gcFRleHQtPm1fUmlnaHQgLSBwVGV4dC0+bV9MZWZ0OwotICAgICAgICBtaW5jaGFycyArPSBwVGV4dC0+bV9UZXh0LkdldExlbmd0aCgpICsgMTsKK3N0YXRpYyBGWF9CT09MIElzTnVtYmVyKENGWF9XaWRlU3RyaW5nJiBzdHIpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIuR2V0TGVuZ3RoKCk7IGkrKykgeworICAgIEZYX1dDSEFSIGNoID0gc3RyW2ldOworICAgIC8vIFRPRE8oZHNpbmNsYWlyKTogLS0uKyArLi0tIHNob3VsZCBwcm9iYWJseSBub3QgYmUgYSBudW1iZXIuCisgICAgaWYgKCFzdGQ6Omlzd2RpZ2l0KGNoKSAmJiBjaCAhPSAnLScgJiYgY2ggIT0gJysnICYmIGNoICE9ICcuJyAmJiBjaCAhPSAnICcpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9Cit2b2lkIENUZXh0UGFnZTo6RmluZENvbHVtbnMoKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbV9CYXNlTGluZXMuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICBDVGV4dEJhc2VMaW5lKiBwQmFzZUxpbmUgPSBtX0Jhc2VMaW5lcy5HZXRBdChpKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IHBCYXNlTGluZS0+bV9UZXh0TGlzdC5HZXRTaXplKCk7IGorKykgeworICAgICAgQ1RleHRCb3gqIHBUZXh0Qm94ID0gcEJhc2VMaW5lLT5tX1RleHRMaXN0LkdldEF0KGopOworICAgICAgQ1RleHRDb2x1bW4qIHBDb2x1bW4gPSBGaW5kQ29sdW1uKHBUZXh0Qm94LT5tX1JpZ2h0KTsKKyAgICAgIGlmIChwQ29sdW1uKSB7CisgICAgICAgIHBDb2x1bW4tPm1fQXZnUG9zID0KKyAgICAgICAgICAgIChwQ29sdW1uLT5tX0NvdW50ICogcENvbHVtbi0+bV9BdmdQb3MgKyBwVGV4dEJveC0+bV9SaWdodCkgLworICAgICAgICAgICAgKHBDb2x1bW4tPm1fQ291bnQgKyAxKTsKKyAgICAgICAgcENvbHVtbi0+bV9Db3VudCsrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcENvbHVtbiA9IG5ldyBDVGV4dENvbHVtbjsKKyAgICAgICAgcENvbHVtbi0+bV9Db3VudCA9IDE7CisgICAgICAgIHBDb2x1bW4tPm1fQXZnUG9zID0gcFRleHRCb3gtPm1fUmlnaHQ7CisgICAgICAgIHBDb2x1bW4tPm1fVGV4dFBvcyA9IC0xOworICAgICAgICBtX1RleHRDb2x1bW5zLkFkZChwQ29sdW1uKTsKKyAgICAgIH0KICAgICB9CisgIH0KKyAgaW50IG1pbmNvdW50ID0gbV9CYXNlTGluZXMuR2V0U2l6ZSgpIC8gNDsKKyAgZm9yIChpID0gMDsgaSA8IG1fVGV4dENvbHVtbnMuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICBDVGV4dENvbHVtbiogcFRleHRDb2x1bW4gPSBtX1RleHRDb2x1bW5zLkdldEF0KGkpOworICAgIGlmIChwVGV4dENvbHVtbi0+bV9Db3VudCA+PSBtaW5jb3VudCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGRlbGV0ZSBwVGV4dENvbHVtbjsKKyAgICBtX1RleHRDb2x1bW5zLlJlbW92ZUF0KGkpOworICAgIGktLTsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgbV9CYXNlTGluZXMuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICBDVGV4dEJhc2VMaW5lKiBwQmFzZUxpbmUgPSBtX0Jhc2VMaW5lcy5HZXRBdChpKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IHBCYXNlTGluZS0+bV9UZXh0TGlzdC5HZXRTaXplKCk7IGorKykgeworICAgICAgQ1RleHRCb3gqIHBUZXh0Qm94ID0gcEJhc2VMaW5lLT5tX1RleHRMaXN0LkdldEF0KGopOworICAgICAgaWYgKElzTnVtYmVyKHBUZXh0Qm94LT5tX1RleHQpKSB7CisgICAgICAgIHBUZXh0Qm94LT5tX3BDb2x1bW4gPSBGaW5kQ29sdW1uKHBUZXh0Qm94LT5tX1JpZ2h0KTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KK0NUZXh0Q29sdW1uKiBDVGV4dFBhZ2U6OkZpbmRDb2x1bW4oRlhfRkxPQVQgeHBvcykgeworICBmb3IgKGludCBpID0gMDsgaSA8IG1fVGV4dENvbHVtbnMuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICBDVGV4dENvbHVtbiogcENvbHVtbiA9IG1fVGV4dENvbHVtbnMuR2V0QXQoaSk7CisgICAgaWYgKHBDb2x1bW4tPm1fQXZnUG9zIDwgeHBvcyArIDEgJiYgcENvbHVtbi0+bV9BdmdQb3MgPiB4cG9zIC0gMSkgeworICAgICAgcmV0dXJuIHBDb2x1bW47CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQordm9pZCBDVGV4dFBhZ2U6OkJyZWFrU3BhY2UoQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaikge30KK0NUZXh0QmFzZUxpbmU6OkNUZXh0QmFzZUxpbmUoKSB7CisgIG1fVG9wID0gLTEwMDAwMDsKKyAgbV9Cb3R0b20gPSAxMDAwMDA7CisgIG1fTWF4Rm9udFNpemVWID0gMDsKK30KK0NUZXh0QmFzZUxpbmU6On5DVGV4dEJhc2VMaW5lKCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IG1fVGV4dExpc3QuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICBkZWxldGUgbV9UZXh0TGlzdC5HZXRBdChpKTsKKyAgfQorfQordm9pZCBDVGV4dEJhc2VMaW5lOjpJbnNlcnRUZXh0Qm94KEZYX0ZMT0FUIGxlZnR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHJpZ2h0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB0b3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJvdHRvbXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3BhY2V3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRzaXplX3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHRleHQpIHsKKyAgaWYgKG1fVG9wIDwgdG9weSkgeworICAgIG1fVG9wID0gdG9weTsKKyAgfQorICBpZiAobV9Cb3R0b20gPiBib3R0b215KSB7CisgICAgbV9Cb3R0b20gPSBib3R0b215OworICB9CisgIGlmIChtX01heEZvbnRTaXplViA8IGZvbnRzaXplX3YpIHsKKyAgICBtX01heEZvbnRTaXplViA9IGZvbnRzaXplX3Y7CisgIH0KKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBtX1RleHRMaXN0LkdldFNpemUoKTsgaSsrKSB7CisgICAgQ1RleHRCb3gqIHBUZXh0ID0gbV9UZXh0TGlzdC5HZXRBdChpKTsKKyAgICBpZiAocFRleHQtPm1fTGVmdCA+IGxlZnR4KSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgQ1RleHRCb3gqIHBUZXh0ID0gbmV3IENUZXh0Qm94OworICBwVGV4dC0+bV9UZXh0ID0gdGV4dDsKKyAgcFRleHQtPm1fTGVmdCA9IGxlZnR4OworICBwVGV4dC0+bV9SaWdodCA9IHJpZ2h0eDsKKyAgcFRleHQtPm1fVG9wID0gdG9weTsKKyAgcFRleHQtPm1fQm90dG9tID0gYm90dG9teTsKKyAgcFRleHQtPm1fU3BhY2VXaWR0aCA9IHNwYWNldzsKKyAgcFRleHQtPm1fRm9udFNpemVWID0gZm9udHNpemVfdjsKKyAgcFRleHQtPm1fcENvbHVtbiA9IE5VTEw7CisgIG1fVGV4dExpc3QuSW5zZXJ0QXQoaSwgcFRleHQpOworfQorRlhfQk9PTCBHZXRJbnRlcnNlY3Rpb24oRlhfRkxPQVQgbG93MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGhpZ2gxLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbG93MiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGhpZ2gyLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGludGVybG93LAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGludGVyaGlnaCk7CitGWF9CT09MIENUZXh0QmFzZUxpbmU6OkNhbk1lcmdlKENUZXh0QmFzZUxpbmUqIHBPdGhlcikgeworICBGWF9GTE9BVCBpbnRlcl90b3AsIGludGVyX2JvdHRvbTsKKyAgaWYgKCFHZXRJbnRlcnNlY3Rpb24obV9Cb3R0b20sIG1fVG9wLCBwT3RoZXItPm1fQm90dG9tLCBwT3RoZXItPm1fVG9wLAorICAgICAgICAgICAgICAgICAgICAgICBpbnRlcl9ib3R0b20sIGludGVyX3RvcCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhfRkxPQVQgaW50ZXJfaCA9IGludGVyX3RvcCAtIGludGVyX2JvdHRvbTsKKyAgaWYgKGludGVyX2ggPCAobV9Ub3AgLSBtX0JvdHRvbSkgLyAyICYmCisgICAgICBpbnRlcl9oIDwgKHBPdGhlci0+bV9Ub3AgLSBwT3RoZXItPm1fQm90dG9tKSAvIDIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhfRkxPQVQgZHkgPSAoRlhfRkxPQVQpRlhTWVNfZmFicyhtX0Jhc2VMaW5lIC0gcE90aGVyLT5tX0Jhc2VMaW5lKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1RleHRMaXN0LkdldFNpemUoKTsgaSsrKSB7CisgICAgQ1RleHRCb3gqIHBUZXh0ID0gbV9UZXh0TGlzdC5HZXRBdChpKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IHBPdGhlci0+bV9UZXh0TGlzdC5HZXRTaXplKCk7IGorKykgeworICAgICAgQ1RleHRCb3gqIHBPdGhlclRleHQgPSBwT3RoZXItPm1fVGV4dExpc3QuR2V0QXQoaik7CisgICAgICBGWF9GTE9BVCBpbnRlcl9sZWZ0LCBpbnRlcl9yaWdodDsKKyAgICAgIGlmICghR2V0SW50ZXJzZWN0aW9uKHBUZXh0LT5tX0xlZnQsIHBUZXh0LT5tX1JpZ2h0LCBwT3RoZXJUZXh0LT5tX0xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3RoZXJUZXh0LT5tX1JpZ2h0LCBpbnRlcl9sZWZ0LCBpbnRlcl9yaWdodCkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBGWF9GTE9BVCBpbnRlcl93ID0gaW50ZXJfcmlnaHQgLSBpbnRlcl9sZWZ0OworICAgICAgaWYgKGludGVyX3cgPCBwVGV4dC0+bV9TcGFjZVdpZHRoIC8gMiAmJgorICAgICAgICAgIGludGVyX3cgPCBwT3RoZXJUZXh0LT5tX1NwYWNlV2lkdGggLyAyKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKGR5ID49IChwVGV4dC0+bV9Cb3R0b20gLSBwVGV4dC0+bV9Ub3ApIC8gMiB8fAorICAgICAgICAgIGR5ID49IChwT3RoZXJUZXh0LT5tX0JvdHRvbSAtIHBPdGhlclRleHQtPm1fVG9wKSAvIDIpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KK3ZvaWQgQ1RleHRCYXNlTGluZTo6TWVyZ2UoQ1RleHRCYXNlTGluZSogcE90aGVyKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcE90aGVyLT5tX1RleHRMaXN0LkdldFNpemUoKTsgaSsrKSB7CisgICAgQ1RleHRCb3gqIHBUZXh0ID0gcE90aGVyLT5tX1RleHRMaXN0LkdldEF0KGkpOworICAgIEluc2VydFRleHRCb3gocFRleHQtPm1fTGVmdCwgcFRleHQtPm1fUmlnaHQsIHBUZXh0LT5tX1RvcCwgcFRleHQtPm1fQm90dG9tLAorICAgICAgICAgICAgICAgICAgcFRleHQtPm1fU3BhY2VXaWR0aCwgcFRleHQtPm1fRm9udFNpemVWLCBwVGV4dC0+bV9UZXh0KTsKKyAgfQorfQorRlhfQk9PTCBDVGV4dEJhc2VMaW5lOjpHZXRXaWR0aChGWF9GTE9BVCYgbGVmdHgsIEZYX0ZMT0FUJiByaWdodHgpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBtX1RleHRMaXN0LkdldFNpemUoKTsgaSsrKSB7CisgICAgQ1RleHRCb3gqIHBUZXh0ID0gbV9UZXh0TGlzdC5HZXRBdChpKTsKKyAgICBpZiAocFRleHQtPm1fVGV4dCAhPSBMIiAiKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKGkgPT0gbV9UZXh0TGlzdC5HZXRTaXplKCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1RleHRCb3gqIHBUZXh0ID0gbV9UZXh0TGlzdC5HZXRBdChpKTsKKyAgbGVmdHggPSBwVGV4dC0+bV9MZWZ0OworICBmb3IgKGkgPSBtX1RleHRMaXN0LkdldFNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgQ1RleHRCb3gqIHBUZXh0ID0gbV9UZXh0TGlzdC5HZXRBdChpKTsKKyAgICBpZiAocFRleHQtPm1fVGV4dCAhPSBMIiAiKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcFRleHQgPSBtX1RleHRMaXN0LkdldEF0KGkpOworICByaWdodHggPSBwVGV4dC0+bV9SaWdodDsKKyAgcmV0dXJuIFRSVUU7Cit9Cit2b2lkIENUZXh0QmFzZUxpbmU6Ok1lcmdlQm94ZXMoKSB7CisgIGludCBpID0gMDsKKyAgd2hpbGUgKDEpIHsKKyAgICBpZiAoaSA+PSBtX1RleHRMaXN0LkdldFNpemUoKSAtIDEpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBDVGV4dEJveCogcFRoaXNUZXh0ID0gbV9UZXh0TGlzdC5HZXRBdChpKTsKKyAgICBDVGV4dEJveCogcE5leHRUZXh0ID0gbV9UZXh0TGlzdC5HZXRBdChpICsgMSk7CisgICAgRlhfRkxPQVQgZHggPSBwTmV4dFRleHQtPm1fTGVmdCAtIHBUaGlzVGV4dC0+bV9SaWdodDsKKyAgICBGWF9GTE9BVCBzcGFjZXcgPSAocFRoaXNUZXh0LT5tX1NwYWNlV2lkdGggPT0gMC4wKQorICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBOZXh0VGV4dC0+bV9TcGFjZVdpZHRoCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogcFRoaXNUZXh0LT5tX1NwYWNlV2lkdGg7CisgICAgaWYgKHNwYWNldyA+IDAuMCAmJiBkeCA8IHNwYWNldyAqIDIpIHsKKyAgICAgIHBUaGlzVGV4dC0+bV9SaWdodCA9IHBOZXh0VGV4dC0+bV9SaWdodDsKKyAgICAgIGlmIChkeCA+IHNwYWNldyAqIDEuNSkgeworICAgICAgICBwVGhpc1RleHQtPm1fVGV4dCArPSBMIiAgIjsKKyAgICAgIH0gZWxzZSBpZiAoZHggPiBzcGFjZXcgLyAzKSB7CisgICAgICAgIHBUaGlzVGV4dC0+bV9UZXh0ICs9IEwnICc7CisgICAgICB9CisgICAgICBwVGhpc1RleHQtPm1fVGV4dCArPSBwTmV4dFRleHQtPm1fVGV4dDsKKyAgICAgIHBUaGlzVGV4dC0+bV9TcGFjZVdpZHRoID0KKyAgICAgICAgICBwTmV4dFRleHQtPm1fU3BhY2VXaWR0aCA9PSAwLjAgPyBzcGFjZXcgOiBwTmV4dFRleHQtPm1fU3BhY2VXaWR0aDsKKyAgICAgIG1fVGV4dExpc3QuUmVtb3ZlQXQoaSArIDEpOworICAgICAgZGVsZXRlIHBOZXh0VGV4dDsKKyAgICB9IGVsc2UgeworICAgICAgaSsrOworICAgIH0KKyAgfQorfQordm9pZCBDVGV4dEJhc2VMaW5lOjpXcml0ZU91dHB1dChDRlhfV2lkZVN0cmluZyYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBsZWZ0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcGFnZXdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaVRleHRXaWR0aCkgeworICBpbnQgbGFzdHBvcyA9IC0xOworICBmb3IgKGludCBpID0gMDsgaSA8IG1fVGV4dExpc3QuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICBDVGV4dEJveCogcFRleHQgPSBtX1RleHRMaXN0LkdldEF0KGkpOworICAgIGludCB4cG9zOworICAgIGlmIChwVGV4dC0+bV9wQ29sdW1uKSB7CisgICAgICB4cG9zID0KKyAgICAgICAgICAoaW50KSgocFRleHQtPm1fcENvbHVtbi0+bV9BdmdQb3MgLSBsZWZ0eCkgKiBpVGV4dFdpZHRoIC8gcGFnZXdpZHRoICsKKyAgICAgICAgICAgICAgICAwLjUpOworICAgICAgeHBvcyAtPSBwVGV4dC0+bV9UZXh0LkdldExlbmd0aCgpOworICAgIH0gZWxzZSB7CisgICAgICB4cG9zID0gKGludCkoKHBUZXh0LT5tX0xlZnQgLSBsZWZ0eCkgKiBpVGV4dFdpZHRoIC8gcGFnZXdpZHRoICsgMC41KTsKKyAgICB9CisgICAgaWYgKHhwb3MgPD0gbGFzdHBvcykgeworICAgICAgeHBvcyA9IGxhc3Rwb3MgKyAxOworICAgIH0KKyAgICBmb3IgKGludCBqID0gbGFzdHBvcyArIDE7IGogPCB4cG9zOyBqKyspIHsKKyAgICAgIHN0ciArPSAnICc7CisgICAgfQorICAgIENGWF9XaWRlU3RyaW5nIHNTcmMocFRleHQtPm1fVGV4dCk7CisgICAgTm9ybWFsaXplU3RyaW5nKHNTcmMpOworICAgIHN0ciArPSBzU3JjOworICAgIHN0ciArPSAnICc7CisgICAgbGFzdHBvcyA9IHhwb3MgKyBwVGV4dC0+bV9UZXh0LkdldExlbmd0aCgpOworICB9Cit9Cit2b2lkIENUZXh0QmFzZUxpbmU6OkNvdW50Q2hhcnMoaW50JiBjb3VudCwgRlhfRkxPQVQmIHdpZHRoLCBpbnQmIG1pbmNoYXJzKSB7CisgIG1pbmNoYXJzID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1RleHRMaXN0LkdldFNpemUoKTsgaSsrKSB7CisgICAgQ1RleHRCb3gqIHBUZXh0ID0gbV9UZXh0TGlzdC5HZXRBdChpKTsKKyAgICBpZiAocFRleHQtPm1fUmlnaHQgLSBwVGV4dC0+bV9MZWZ0IDwgMC4wMDIpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBjb3VudCArPSBwVGV4dC0+bV9UZXh0LkdldExlbmd0aCgpOworICAgIHdpZHRoICs9IHBUZXh0LT5tX1JpZ2h0IC0gcFRleHQtPm1fTGVmdDsKKyAgICBtaW5jaGFycyArPSBwVGV4dC0+bV9UZXh0LkdldExlbmd0aCgpICsgMTsKKyAgfQogfQogI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUKLXN0YXRpYyB2b2lkIENoZWNrUm90YXRlKENQREZfUGFnZSYgcGFnZSwgQ0ZYX0Zsb2F0UmVjdCYgcGFnZV9iYm94KQotewotICAgIGludCB0b3RhbF9jb3VudCA9IDAsIHJvdGF0ZWRfY291bnRbM10gPSB7MCwgMCwgMH07Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gcGFnZS5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBPYmogPSBwYWdlLkdldE5leHRPYmplY3QocG9zKTsKLSAgICAgICAgaWYgKHBPYmotPm1fVHlwZSAhPSBQREZQQUdFX1RFWFQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHRvdGFsX2NvdW50ICsrOwotICAgICAgICBDUERGX1RleHRPYmplY3QqIHBUZXh0ID0gKENQREZfVGV4dE9iamVjdCopcE9iajsKLSAgICAgICAgRlhfRkxPQVQgYW5nbGUgPSBwVGV4dC0+bV9UZXh0U3RhdGUuR2V0QmFzZWxpbmVBbmdsZSgpOwotICAgICAgICBpZiAoYW5nbGUgPT0gMC4wKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgZGVncmVlID0gKGludCkoYW5nbGUgKiAxODAgLyBQSSArIDAuNSk7Ci0gICAgICAgIGlmIChkZWdyZWUgJSA5MCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlZ3JlZSA8IDApIHsKLSAgICAgICAgICAgIGRlZ3JlZSArPSAzNjA7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGluZGV4ID0gZGVncmVlIC8gOTAgJSAzIC0gMTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgcm90YXRlZF9jb3VudFtpbmRleF0gKys7CitzdGF0aWMgdm9pZCBDaGVja1JvdGF0ZShDUERGX1BhZ2UmIHBhZ2UsIENGWF9GbG9hdFJlY3QmIHBhZ2VfYmJveCkgeworICBpbnQgdG90YWxfY291bnQgPSAwLCByb3RhdGVkX2NvdW50WzNdID0gezAsIDAsIDB9OworICBGWF9QT1NJVElPTiBwb3MgPSBwYWdlLkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKTsKKyAgd2hpbGUgKHBvcykgeworICAgIENQREZfUGFnZU9iamVjdCogcE9iaiA9IHBhZ2UuR2V0TmV4dE9iamVjdChwb3MpOworICAgIGlmIChwT2JqLT5tX1R5cGUgIT0gUERGUEFHRV9URVhUKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgaWYgKHRvdGFsX2NvdW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuOworICAgIHRvdGFsX2NvdW50Kys7CisgICAgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dCA9IChDUERGX1RleHRPYmplY3QqKXBPYmo7CisgICAgRlhfRkxPQVQgYW5nbGUgPSBwVGV4dC0+bV9UZXh0U3RhdGUuR2V0QmFzZWxpbmVBbmdsZSgpOworICAgIGlmIChhbmdsZSA9PSAwLjApIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKLSAgICBpZiAocm90YXRlZF9jb3VudFswXSA+IHRvdGFsX2NvdW50ICogMiAvIDMpIHsKLSAgICAgICAgbWF0cml4LlNldCgwLCAtMSwgMSwgMCwgMCwgcGFnZS5HZXRQYWdlSGVpZ2h0KCkpOwotICAgIH0gZWxzZSBpZiAocm90YXRlZF9jb3VudFsxXSA+IHRvdGFsX2NvdW50ICogMiAvIDMpIHsKLSAgICAgICAgbWF0cml4LlNldCgtMSwgMCwgMCwgLTEsIHBhZ2UuR2V0UGFnZVdpZHRoKCksIHBhZ2UuR2V0UGFnZUhlaWdodCgpKTsKLSAgICB9IGVsc2UgaWYgKHJvdGF0ZWRfY291bnRbMl0gPiB0b3RhbF9jb3VudCAqIDIgLyAzKSB7Ci0gICAgICAgIG1hdHJpeC5TZXQoMCwgMSwgLTEsIDAsIHBhZ2UuR2V0UGFnZVdpZHRoKCksIDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybjsKKyAgICBpbnQgZGVncmVlID0gKGludCkoYW5nbGUgKiAxODAgLyBQSSArIDAuNSk7CisgICAgaWYgKGRlZ3JlZSAlIDkwKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgcGFnZS5UcmFuc2Zvcm0obWF0cml4KTsKLSAgICBwYWdlX2Jib3guVHJhbnNmb3JtKCZtYXRyaXgpOworICAgIGlmIChkZWdyZWUgPCAwKSB7CisgICAgICBkZWdyZWUgKz0gMzYwOworICAgIH0KKyAgICBpbnQgaW5kZXggPSBkZWdyZWUgLyA5MCAlIDMgLSAxOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICByb3RhdGVkX2NvdW50W2luZGV4XSsrOworICB9CisgIGlmICh0b3RhbF9jb3VudCA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIENGWF9NYXRyaXggbWF0cml4OworICBpZiAocm90YXRlZF9jb3VudFswXSA+IHRvdGFsX2NvdW50ICogMiAvIDMpIHsKKyAgICBtYXRyaXguU2V0KDAsIC0xLCAxLCAwLCAwLCBwYWdlLkdldFBhZ2VIZWlnaHQoKSk7CisgIH0gZWxzZSBpZiAocm90YXRlZF9jb3VudFsxXSA+IHRvdGFsX2NvdW50ICogMiAvIDMpIHsKKyAgICBtYXRyaXguU2V0KC0xLCAwLCAwLCAtMSwgcGFnZS5HZXRQYWdlV2lkdGgoKSwgcGFnZS5HZXRQYWdlSGVpZ2h0KCkpOworICB9IGVsc2UgaWYgKHJvdGF0ZWRfY291bnRbMl0gPiB0b3RhbF9jb3VudCAqIDIgLyAzKSB7CisgICAgbWF0cml4LlNldCgwLCAxLCAtMSwgMCwgcGFnZS5HZXRQYWdlV2lkdGgoKSwgMCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuOworICB9CisgIHBhZ2UuVHJhbnNmb3JtKG1hdHJpeCk7CisgIHBhZ2VfYmJveC5UcmFuc2Zvcm0oJm1hdHJpeCk7CiB9Ci12b2lkIFBERl9HZXRQYWdlVGV4dF9Vbmljb2RlKENGWF9XaWRlU3RyaW5nQXJyYXkmIGxpbmVzLCBDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaU1pbldpZHRoLCBGWF9EV09SRCBmbGFncykKLXsKLSAgICBsaW5lcy5SZW1vdmVBbGwoKTsKLSAgICBpZiAocFBhZ2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Cit2b2lkIFBERl9HZXRQYWdlVGV4dF9Vbmljb2RlKENGWF9XaWRlU3RyaW5nQXJyYXkmIGxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaU1pbldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncykgeworICBsaW5lcy5SZW1vdmVBbGwoKTsKKyAgaWYgKCFwUGFnZSkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX1BhZ2UgcGFnZTsKKyAgcGFnZS5Mb2FkKHBEb2MsIHBQYWdlKTsKKyAgQ1BERl9QYXJzZU9wdGlvbnMgb3B0aW9uczsKKyAgb3B0aW9ucy5tX2JUZXh0T25seSA9IFRSVUU7CisgIG9wdGlvbnMubV9iU2VwYXJhdGVGb3JtID0gRkFMU0U7CisgIHBhZ2UuUGFyc2VDb250ZW50KCZvcHRpb25zKTsKKyAgQ0ZYX0Zsb2F0UmVjdCBwYWdlX2Jib3ggPSBwYWdlLkdldFBhZ2VCQm94KCk7CisgIGlmIChmbGFncyAmIFBERjJUWFRfQVVUT19ST1RBVEUpIHsKKyAgICBDaGVja1JvdGF0ZShwYWdlLCBwYWdlX2Jib3gpOworICB9CisgIENUZXh0UGFnZSB0ZXh0czsKKyAgdGV4dHMubV9iQXV0b1dpZHRoID0gZmxhZ3MgJiBQREYyVFhUX0FVVE9fV0lEVEg7CisgIHRleHRzLm1fYktlZXBDb2x1bW4gPSBmbGFncyAmIFBERjJUWFRfS0VFUF9DT0xVTU47CisgIHRleHRzLm1fYkJyZWFrU3BhY2UgPSBUUlVFOworICBGWF9QT1NJVElPTiBwb3MgPSBwYWdlLkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKTsKKyAgd2hpbGUgKHBvcykgeworICAgIENQREZfUGFnZU9iamVjdCogcE9iamVjdCA9IHBhZ2UuR2V0TmV4dE9iamVjdChwb3MpOworICAgIGlmICghKGZsYWdzICYgUERGMlRYVF9JTkNMVURFX0lOVklTSUJMRSkpIHsKKyAgICAgIENGWF9GbG9hdFJlY3QgcmVjdChwT2JqZWN0LT5tX0xlZnQsIHBPYmplY3QtPm1fQm90dG9tLCBwT2JqZWN0LT5tX1JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmplY3QtPm1fVG9wKTsKKyAgICAgIGlmICghcGFnZV9iYm94LkNvbnRhaW5zKHJlY3QpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQogICAgIH0KLSAgICBDUERGX1BhZ2UgcGFnZTsKLSAgICBwYWdlLkxvYWQocERvYywgcFBhZ2UpOwotICAgIENQREZfUGFyc2VPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5tX2JUZXh0T25seSA9IFRSVUU7Ci0gICAgb3B0aW9ucy5tX2JTZXBhcmF0ZUZvcm0gPSBGQUxTRTsKLSAgICBwYWdlLlBhcnNlQ29udGVudCgmb3B0aW9ucyk7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCBwYWdlX2Jib3ggPSBwYWdlLkdldFBhZ2VCQm94KCk7Ci0gICAgaWYgKGZsYWdzICYgUERGMlRYVF9BVVRPX1JPVEFURSkgewotICAgICAgICBDaGVja1JvdGF0ZShwYWdlLCBwYWdlX2Jib3gpOwotICAgIH0KLSAgICBDVGV4dFBhZ2UgdGV4dHM7Ci0gICAgdGV4dHMubV9iQXV0b1dpZHRoID0gZmxhZ3MgJiBQREYyVFhUX0FVVE9fV0lEVEg7Ci0gICAgdGV4dHMubV9iS2VlcENvbHVtbiA9IGZsYWdzICYgUERGMlRYVF9LRUVQX0NPTFVNTjsKLSAgICB0ZXh0cy5tX2JCcmVha1NwYWNlID0gVFJVRTsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBwYWdlLkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIENQREZfUGFnZU9iamVjdCogcE9iamVjdCA9IHBhZ2UuR2V0TmV4dE9iamVjdChwb3MpOwotICAgICAgICBpZiAoIShmbGFncyAmIFBERjJUWFRfSU5DTFVERV9JTlZJU0lCTEUpKSB7Ci0gICAgICAgICAgICBDRlhfRmxvYXRSZWN0IHJlY3QocE9iamVjdC0+bV9MZWZ0LCBwT2JqZWN0LT5tX0JvdHRvbSwgcE9iamVjdC0+bV9SaWdodCwgcE9iamVjdC0+bV9Ub3ApOwotICAgICAgICAgICAgaWYgKCFwYWdlX2Jib3guQ29udGFpbnMocmVjdCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0ZXh0cy5Qcm9jZXNzT2JqZWN0KHBPYmplY3QpOwotICAgIH0KLSAgICB0ZXh0cy5Xcml0ZU91dHB1dChsaW5lcywgaU1pbldpZHRoKTsKKyAgICB0ZXh0cy5Qcm9jZXNzT2JqZWN0KHBPYmplY3QpOworICB9CisgIHRleHRzLldyaXRlT3V0cHV0KGxpbmVzLCBpTWluV2lkdGgpOwogfQotdm9pZCBQREZfR2V0UGFnZVRleHQoQ0ZYX0J5dGVTdHJpbmdBcnJheSYgbGluZXMsIENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcFBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgaU1pbldpZHRoLCBGWF9EV09SRCBmbGFncykKLXsKLSAgICBsaW5lcy5SZW1vdmVBbGwoKTsKLSAgICBDRlhfV2lkZVN0cmluZ0FycmF5IHdsaW5lczsKLSAgICBQREZfR2V0UGFnZVRleHRfVW5pY29kZSh3bGluZXMsIHBEb2MsIHBQYWdlLCBpTWluV2lkdGgsIGZsYWdzKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHdsaW5lcy5HZXRTaXplKCk7IGkgKyspIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3N0ciA9IHdsaW5lc1tpXTsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyOwotICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IHdzdHIuR2V0TGVuZ3RoKCk7IGMgKyspIHsKLSAgICAgICAgICAgIHN0ciArPSBDaGFyRnJvbVVuaWNvZGVBbHQod3N0cltjXSwgRlhTWVNfR2V0QUNQKCksICI/Iik7Ci0gICAgICAgIH0KLSAgICAgICAgbGluZXMuQWRkKHN0cik7Cit2b2lkIFBERl9HZXRQYWdlVGV4dChDRlhfQnl0ZVN0cmluZ0FycmF5JiBsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgICAgaW50IGlNaW5XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzKSB7CisgIGxpbmVzLlJlbW92ZUFsbCgpOworICBDRlhfV2lkZVN0cmluZ0FycmF5IHdsaW5lczsKKyAgUERGX0dldFBhZ2VUZXh0X1VuaWNvZGUod2xpbmVzLCBwRG9jLCBwUGFnZSwgaU1pbldpZHRoLCBmbGFncyk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgd2xpbmVzLkdldFNpemUoKTsgaSsrKSB7CisgICAgQ0ZYX1dpZGVTdHJpbmcgd3N0ciA9IHdsaW5lc1tpXTsKKyAgICBDRlhfQnl0ZVN0cmluZyBzdHI7CisgICAgZm9yIChpbnQgYyA9IDA7IGMgPCB3c3RyLkdldExlbmd0aCgpOyBjKyspIHsKKyAgICAgIHN0ciArPSBDaGFyRnJvbVVuaWNvZGVBbHQod3N0cltjXSwgRlhTWVNfR2V0QUNQKCksICI/Iik7CiAgICAgfQorICAgIGxpbmVzLkFkZChzdHIpOworICB9CiB9Ci1leHRlcm4gdm9pZCBfUERGX0dldFRleHRTdHJlYW1fVW5pY29kZShDRlhfV2lkZVRleHRCdWYmIGJ1ZmZlciwgQ1BERl9QYWdlT2JqZWN0cyogcFBhZ2UsIEZYX0JPT0wgYlVzZUxGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckFycmF5KiBwT2JqQXJyYXkpOwotdm9pZCBQREZfR2V0VGV4dFN0cmVhbV9Vbmljb2RlKENGWF9XaWRlVGV4dEJ1ZiYgYnVmZmVyLCBDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlLCBGWF9EV09SRCBmbGFncykKLXsKLSAgICBidWZmZXIuRXN0aW1hdGVTaXplKDAsIDEwMjQwKTsKLSAgICBDUERGX1BhZ2UgcGFnZTsKLSAgICBwYWdlLkxvYWQocERvYywgcFBhZ2UpOwotICAgIENQREZfUGFyc2VPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5tX2JUZXh0T25seSA9IFRSVUU7Ci0gICAgb3B0aW9ucy5tX2JTZXBhcmF0ZUZvcm0gPSBGQUxTRTsKLSAgICBwYWdlLlBhcnNlQ29udGVudCgmb3B0aW9ucyk7Ci0gICAgX1BERl9HZXRUZXh0U3RyZWFtX1VuaWNvZGUoYnVmZmVyLCAmcGFnZSwgVFJVRSwgTlVMTCk7Cit2b2lkIFBERl9HZXRUZXh0U3RyZWFtX1VuaWNvZGUoQ0ZYX1dpZGVUZXh0QnVmJiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzKSB7CisgIGJ1ZmZlci5Fc3RpbWF0ZVNpemUoMCwgMTAyNDApOworICBDUERGX1BhZ2UgcGFnZTsKKyAgcGFnZS5Mb2FkKHBEb2MsIHBQYWdlKTsKKyAgQ1BERl9QYXJzZU9wdGlvbnMgb3B0aW9uczsKKyAgb3B0aW9ucy5tX2JUZXh0T25seSA9IFRSVUU7CisgIG9wdGlvbnMubV9iU2VwYXJhdGVGb3JtID0gRkFMU0U7CisgIHBhZ2UuUGFyc2VDb250ZW50KCZvcHRpb25zKTsKKyAgR2V0VGV4dFN0cmVhbV9Vbmljb2RlKGJ1ZmZlciwgJnBhZ2UsIFRSVUUsIE5VTEwpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZnRleHQvZnBkZl90ZXh0X2ludC5jcHAgYi9jb3JlL3NyYy9mcGRmdGV4dC9mcGRmX3RleHRfaW50LmNwcAppbmRleCA2OWQwYmM1Li4zYjYzM2E2IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmdGV4dC9mcGRmX3RleHRfaW50LmNwcAorKysgYi9jb3JlL3NyYy9mcGRmdGV4dC9mcGRmX3RleHRfaW50LmNwcApAQCAtMSwyMjMwICsxLDIxMTUgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3Jlc291cmNlLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZW9iai5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZnRleHQvZnBkZl90ZXh0LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZS5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oIgotI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNjdHlwZT4KKyNpbmNsdWRlIDxjd2N0eXBlPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlb2JqLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZXNvdXJjZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmdGV4dC9mcGRmX3RleHQuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmlkaS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9leHQuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfdWNkLmgiCiAjaW5jbHVkZSAidGV4dF9pbnQuaCIKIAogbmFtZXNwYWNlIHsKIAotRlhfQk9PTCBfSXNJZ25vcmVTcGFjZUNoYXJhY3RlcihGWF9XQ0hBUiBjdXJDaGFyKQotewotICAgIGlmKGN1ckNoYXIgPCAyNTUgKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKCAoY3VyQ2hhciA+PSAweDA2MDAgJiYgY3VyQ2hhciA8PSAweDA2RkYpCi0gICAgICAgICAgICB8fCAoY3VyQ2hhciA+PSAweEZFNzAgJiYgY3VyQ2hhciA8PSAweEZFRkYpCi0gICAgICAgICAgICB8fCAoY3VyQ2hhciA+PSAweEZCNTAgJiYgY3VyQ2hhciA8PSAweEZERkYpCi0gICAgICAgICAgICB8fCAoY3VyQ2hhciA+PSAweDA0MDAgJiYgY3VyQ2hhciA8PSAweDA0RkYpCi0gICAgICAgICAgICB8fCAoY3VyQ2hhciA+PSAweDA1MDAgJiYgY3VyQ2hhciA8PSAweDA1MkYpCi0gICAgICAgICAgICB8fCAoY3VyQ2hhciA+PSAweEE2NDAgJiYgY3VyQ2hhciA8PSAweEE2OUYpCi0gICAgICAgICAgICB8fCAoY3VyQ2hhciA+PSAweDJERTAgJiYgY3VyQ2hhciA8PSAweDJERkYpCi0gICAgICAgICAgICB8fCBjdXJDaGFyID09IDg0NjcKLSAgICAgICAgICAgIHx8IChjdXJDaGFyID49IDB4MjAwMCAmJiBjdXJDaGFyIDw9IDB4MjA2RikpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKK0ZYX0JPT0wgX0lzSWdub3JlU3BhY2VDaGFyYWN0ZXIoRlhfV0NIQVIgY3VyQ2hhcikgeworICBpZiAoY3VyQ2hhciA8IDI1NSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoKGN1ckNoYXIgPj0gMHgwNjAwICYmIGN1ckNoYXIgPD0gMHgwNkZGKSB8fAorICAgICAgKGN1ckNoYXIgPj0gMHhGRTcwICYmIGN1ckNoYXIgPD0gMHhGRUZGKSB8fAorICAgICAgKGN1ckNoYXIgPj0gMHhGQjUwICYmIGN1ckNoYXIgPD0gMHhGREZGKSB8fAorICAgICAgKGN1ckNoYXIgPj0gMHgwNDAwICYmIGN1ckNoYXIgPD0gMHgwNEZGKSB8fAorICAgICAgKGN1ckNoYXIgPj0gMHgwNTAwICYmIGN1ckNoYXIgPD0gMHgwNTJGKSB8fAorICAgICAgKGN1ckNoYXIgPj0gMHhBNjQwICYmIGN1ckNoYXIgPD0gMHhBNjlGKSB8fAorICAgICAgKGN1ckNoYXIgPj0gMHgyREUwICYmIGN1ckNoYXIgPD0gMHgyREZGKSB8fCBjdXJDaGFyID09IDg0NjcgfHwKKyAgICAgIChjdXJDaGFyID49IDB4MjAwMCAmJiBjdXJDaGFyIDw9IDB4MjA2RikpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0ZMT0FUIF9Ob3JtYWxpemVUaHJlc2hvbGQoRlhfRkxPQVQgdGhyZXNob2xkKQotewotICAgIGlmICh0aHJlc2hvbGQgPCAzMDApIHsKLSAgICAgICAgcmV0dXJuIHRocmVzaG9sZCAvIDIuMGY7Ci0gICAgfSBlbHNlIGlmICh0aHJlc2hvbGQgPCA1MDApIHsKLSAgICAgICAgcmV0dXJuIHRocmVzaG9sZCAvIDQuMGY7Ci0gICAgfSBlbHNlIGlmICh0aHJlc2hvbGQgPCA3MDApIHsKLSAgICAgICAgcmV0dXJuIHRocmVzaG9sZCAvIDUuMGY7Ci0gICAgfQotICAgIHJldHVybiB0aHJlc2hvbGQgLyA2LjBmOworRlhfRkxPQVQgX05vcm1hbGl6ZVRocmVzaG9sZChGWF9GTE9BVCB0aHJlc2hvbGQpIHsKKyAgaWYgKHRocmVzaG9sZCA8IDMwMCkgeworICAgIHJldHVybiB0aHJlc2hvbGQgLyAyLjBmOworICB9CisgIGlmICh0aHJlc2hvbGQgPCA1MDApIHsKKyAgICByZXR1cm4gdGhyZXNob2xkIC8gNC4wZjsKKyAgfQorICBpZiAodGhyZXNob2xkIDwgNzAwKSB7CisgICAgcmV0dXJuIHRocmVzaG9sZCAvIDUuMGY7CisgIH0KKyAgcmV0dXJuIHRocmVzaG9sZCAvIDYuMGY7CiB9CiAKIEZYX0ZMT0FUIF9DYWxjdWxhdGVCYXNlU3BhY2UoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgbWF0cml4KQotewotICAgIEZYX0ZMT0FUIGJhc2VTcGFjZSA9IDAuMDsKLSAgICBjb25zdCBpbnQgbkl0ZW1zID0gcFRleHRPYmotPkNvdW50SXRlbXMoKTsKLSAgICBpZiAocFRleHRPYmotPm1fVGV4dFN0YXRlLkdldE9iamVjdCgpLT5tX0NoYXJTcGFjZSAmJiBuSXRlbXMgPj0gMykgewotICAgICAgICBGWF9CT09MIGJBbGxDaGFyID0gVFJVRTsKLSAgICAgICAgRlhfRkxPQVQgc3BhY2luZyA9IG1hdHJpeC5UcmFuc2Zvcm1EaXN0YW5jZSgKLSAgICAgICAgICAgIHBUZXh0T2JqLT5tX1RleHRTdGF0ZS5HZXRPYmplY3QoKS0+bV9DaGFyU3BhY2UpOwotICAgICAgICBiYXNlU3BhY2UgPSBzcGFjaW5nOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5JdGVtczsgaSsrKSB7Ci0gICAgICAgICAgICBDUERGX1RleHRPYmplY3RJdGVtIGl0ZW07Ci0gICAgICAgICAgICBwVGV4dE9iai0+R2V0SXRlbUluZm8oaSwgJml0ZW0pOwotICAgICAgICAgICAgaWYgKGl0ZW0ubV9DaGFyQ29kZSA9PSAoRlhfRFdPUkQpIC0gMSkgewotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRzaXplX2ggPSBwVGV4dE9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemVIKCk7Ci0gICAgICAgICAgICAgICAgRlhfRkxPQVQga2VybmluZyA9IC1mb250c2l6ZV9oICogaXRlbS5tX09yaWdpblggLyAxMDAwOwotICAgICAgICAgICAgICAgIGJhc2VTcGFjZSA9IHN0ZDo6bWluKGJhc2VTcGFjZSwga2VybmluZyArIHNwYWNpbmcpOwotICAgICAgICAgICAgICAgIGJBbGxDaGFyID0gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJhc2VTcGFjZSA8IDAuMCB8fCAobkl0ZW1zID09IDMgJiYgIWJBbGxDaGFyKSkgewotICAgICAgICAgICAgYmFzZVNwYWNlID0gMC4wOwotICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgeworICBGWF9GTE9BVCBiYXNlU3BhY2UgPSAwLjA7CisgIGNvbnN0IGludCBuSXRlbXMgPSBwVGV4dE9iai0+Q291bnRJdGVtcygpOworICBpZiAocFRleHRPYmotPm1fVGV4dFN0YXRlLkdldE9iamVjdCgpLT5tX0NoYXJTcGFjZSAmJiBuSXRlbXMgPj0gMykgeworICAgIEZYX0JPT0wgYkFsbENoYXIgPSBUUlVFOworICAgIEZYX0ZMT0FUIHNwYWNpbmcgPSBtYXRyaXguVHJhbnNmb3JtRGlzdGFuY2UoCisgICAgICAgIHBUZXh0T2JqLT5tX1RleHRTdGF0ZS5HZXRPYmplY3QoKS0+bV9DaGFyU3BhY2UpOworICAgIGJhc2VTcGFjZSA9IHNwYWNpbmc7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuSXRlbXM7IGkrKykgeworICAgICAgQ1BERl9UZXh0T2JqZWN0SXRlbSBpdGVtOworICAgICAgcFRleHRPYmotPkdldEl0ZW1JbmZvKGksICZpdGVtKTsKKyAgICAgIGlmIChpdGVtLm1fQ2hhckNvZGUgPT0gKEZYX0RXT1JEKS0xKSB7CisgICAgICAgIEZYX0ZMT0FUIGZvbnRzaXplX2ggPSBwVGV4dE9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemVIKCk7CisgICAgICAgIEZYX0ZMT0FUIGtlcm5pbmcgPSAtZm9udHNpemVfaCAqIGl0ZW0ubV9PcmlnaW5YIC8gMTAwMDsKKyAgICAgICAgYmFzZVNwYWNlID0gc3RkOjptaW4oYmFzZVNwYWNlLCBrZXJuaW5nICsgc3BhY2luZyk7CisgICAgICAgIGJBbGxDaGFyID0gRkFMU0U7CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiBiYXNlU3BhY2U7CisgICAgaWYgKGJhc2VTcGFjZSA8IDAuMCB8fCAobkl0ZW1zID09IDMgJiYgIWJBbGxDaGFyKSkgeworICAgICAgYmFzZVNwYWNlID0gMC4wOworICAgIH0KKyAgfQorICByZXR1cm4gYmFzZVNwYWNlOwogfQogCitjb25zdCBGWF9GTE9BVCBrRGVmYXVsdEZvbnRTaXplID0gMS4wZjsKKwogfSAgLy8gbmFtZXNwYWNlCiAKIENQREZUZXh0X1BhcnNlT3B0aW9uczo6Q1BERlRleHRfUGFyc2VPcHRpb25zKCkKLSAgICA6IG1fYkdldENoYXJDb2RlT25seShGQUxTRSksIG1fYk5vcm1hbGl6ZU9ianMoVFJVRSksIG1fYk91dHB1dEh5cGhlbihGQUxTRSkKLXsKKyAgICA6IG1fYkdldENoYXJDb2RlT25seShGQUxTRSksCisgICAgICBtX2JOb3JtYWxpemVPYmpzKFRSVUUpLAorICAgICAgbV9iT3V0cHV0SHlwaGVuKEZBTFNFKSB7fQorCitJUERGX1RleHRQYWdlKiBJUERGX1RleHRQYWdlOjpDcmVhdGVUZXh0UGFnZShjb25zdCBDUERGX1BhZ2UqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKSB7CisgIHJldHVybiBuZXcgQ1BERl9UZXh0UGFnZShwUGFnZSwgZmxhZ3MpOwogfQotSVBERl9UZXh0UGFnZSogSVBERl9UZXh0UGFnZTo6Q3JlYXRlVGV4dFBhZ2UoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ1BERlRleHRfUGFyc2VPcHRpb25zIFBhcnNlck9wdGlvbnMpCi17Ci0gICAgcmV0dXJuIG5ldyBDUERGX1RleHRQYWdlKHBQYWdlLCBQYXJzZXJPcHRpb25zKTsKKworSVBERl9UZXh0UGFnZUZpbmQqIElQREZfVGV4dFBhZ2VGaW5kOjpDcmVhdGVQYWdlRmluZCgKKyAgICBjb25zdCBJUERGX1RleHRQYWdlKiBwVGV4dFBhZ2UpIHsKKyAgcmV0dXJuIHBUZXh0UGFnZSA/IG5ldyBDUERGX1RleHRQYWdlRmluZChwVGV4dFBhZ2UpIDogbnVsbHB0cjsKIH0KLUlQREZfVGV4dFBhZ2UqIElQREZfVGV4dFBhZ2U6OkNyZWF0ZVRleHRQYWdlKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsIGludCBmbGFncykKLXsKLSAgICByZXR1cm4gbmV3IENQREZfVGV4dFBhZ2UocFBhZ2UsIGZsYWdzKTsKKworSVBERl9MaW5rRXh0cmFjdCogSVBERl9MaW5rRXh0cmFjdDo6Q3JlYXRlTGlua0V4dHJhY3QoKSB7CisgIHJldHVybiBuZXcgQ1BERl9MaW5rRXh0cmFjdCgpOwogfQotSVBERl9UZXh0UGFnZSoJSVBERl9UZXh0UGFnZTo6Q3JlYXRlVGV4dFBhZ2UoY29uc3QgQ1BERl9QYWdlT2JqZWN0cyogcE9ianMsIGludCBmbGFncykKLXsKLSAgICByZXR1cm4gbmV3IENQREZfVGV4dFBhZ2UocE9ianMsIGZsYWdzKTsKLX0KLUlQREZfVGV4dFBhZ2VGaW5kKglJUERGX1RleHRQYWdlRmluZDo6Q3JlYXRlUGFnZUZpbmQoY29uc3QgSVBERl9UZXh0UGFnZSogcFRleHRQYWdlKQotewotICAgIGlmICghcFRleHRQYWdlKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbmV3IENQREZfVGV4dFBhZ2VGaW5kKHBUZXh0UGFnZSk7Ci19Ci1JUERGX0xpbmtFeHRyYWN0KiBJUERGX0xpbmtFeHRyYWN0OjpDcmVhdGVMaW5rRXh0cmFjdCgpCi17Ci0gICAgcmV0dXJuIG5ldyBDUERGX0xpbmtFeHRyYWN0KCk7Ci19Ci0jZGVmaW5lICBURVhUX0JMQU5LX0NIQVIJCUwnICcKLSNkZWZpbmUgIFRFWFRfTElORUZFRURfQ0hBUgkJTCdcbicKLSNkZWZpbmUJIFRFWFRfUkVUVVJOX0NIQVIJCUwnXHInCi0jZGVmaW5lICBURVhUX0VNUFRZCQkJCUwiIgotI2RlZmluZSAgVEVYVF9CTEFOSwkJCQlMIiAiCi0jZGVmaW5lICBURVhUX1JFVFVSTl9MSU5FRkVFRAlMIlxyXG4iCi0jZGVmaW5lICBURVhUX0xJTkVGRUVECQkJTCJcbiIKLSNkZWZpbmUJIFRFWFRfQ0hBUlJBVElPX0dBUERFTFRBCTAuMDcwCisKKyNkZWZpbmUgVEVYVF9CTEFOS19DSEFSIEwnICcKKyNkZWZpbmUgVEVYVF9MSU5FRkVFRF9DSEFSIEwnXG4nCisjZGVmaW5lIFRFWFRfUkVUVVJOX0NIQVIgTCdccicKKyNkZWZpbmUgVEVYVF9FTVBUWSBMIiIKKyNkZWZpbmUgVEVYVF9CTEFOSyBMIiAiCisjZGVmaW5lIFRFWFRfUkVUVVJOX0xJTkVGRUVEIEwiXHJcbiIKKyNkZWZpbmUgVEVYVF9MSU5FRkVFRCBMIlxuIgorI2RlZmluZSBURVhUX0NIQVJSQVRJT19HQVBERUxUQSAwLjA3MAorCiBDUERGX1RleHRQYWdlOjpDUERGX1RleHRQYWdlKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsIGludCBmbGFncykKLSAgICA6IG1fY2hhckxpc3QoNTEyKSwKKyAgICA6IG1fcFBhZ2UocFBhZ2UpLAorICAgICAgbV9jaGFyTGlzdCg1MTIpLAogICAgICAgbV9UZW1wQ2hhckxpc3QoNTApLAotICAgICAgbV9wUHJlVGV4dE9iaihOVUxMKSwKLSAgICAgIG1fSXNQYXJzZXJlZChGQUxTRSksCisgICAgICBtX3BhcnNlcmZsYWcoZmxhZ3MpLAorICAgICAgbV9wUHJlVGV4dE9iaihudWxscHRyKSwKKyAgICAgIG1fYklzUGFyc2VkKGZhbHNlKSwKICAgICAgIG1fVGV4dGxpbmVEaXIoLTEpLAotICAgICAgbV9DdXJsaW5lUmVjdCgwLCAwLCAwLCAwKQotewotICAgIG1fcFBhZ2UgPSBwUGFnZTsKLSAgICBtX3BhcnNlcmZsYWcgPSBmbGFnczsKLSAgICBtX1RleHRCdWYuRXN0aW1hdGVTaXplKDAsIDEwMjQwKTsKLSAgICBwUGFnZS0+R2V0RGlzcGxheU1hdHJpeChtX0Rpc3BsYXlNYXRyaXgsIDAsIDAsIChpbnQpIHBQYWdlLT5HZXRQYWdlV2lkdGgoKSwgKGludClwUGFnZS0+R2V0UGFnZUhlaWdodCgpLCAwKTsKKyAgICAgIG1fQ3VybGluZVJlY3QoMCwgMCwgMCwgMCkgeworICBtX1RleHRCdWYuRXN0aW1hdGVTaXplKDAsIDEwMjQwKTsKKyAgcFBhZ2UtPkdldERpc3BsYXlNYXRyaXgobV9EaXNwbGF5TWF0cml4LCAwLCAwLCAoaW50KXBQYWdlLT5HZXRQYWdlV2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClwUGFnZS0+R2V0UGFnZUhlaWdodCgpLCAwKTsKIH0KLUNQREZfVGV4dFBhZ2U6OkNQREZfVGV4dFBhZ2UoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgQ1BERlRleHRfUGFyc2VPcHRpb25zIFBhcnNlck9wdGlvbnMpCi0gICAgOiBtX1BhcnNlT3B0aW9ucyhQYXJzZXJPcHRpb25zKQotICAgICwgbV9jaGFyTGlzdCg1MTIpCi0gICAgLCBtX1RlbXBDaGFyTGlzdCg1MCkKLSAgICAsIG1fcFByZVRleHRPYmooTlVMTCkKLSAgICAsIG1fSXNQYXJzZXJlZChGQUxTRSkKLSAgICAsIG1fVGV4dGxpbmVEaXIoLTEpCi0gICAgLCBtX0N1cmxpbmVSZWN0KDAsIDAsIDAsIDApCi17Ci0gICAgbV9wUGFnZSA9IHBQYWdlOwotICAgIG1fcGFyc2VyZmxhZyA9IDA7Ci0gICAgbV9UZXh0QnVmLkVzdGltYXRlU2l6ZSgwLCAxMDI0MCk7Ci0gICAgcFBhZ2UtPkdldERpc3BsYXlNYXRyaXgobV9EaXNwbGF5TWF0cml4LCAwLCAwLCAoaW50KSBwUGFnZS0+R2V0UGFnZVdpZHRoKCksIChpbnQpcFBhZ2UtPkdldFBhZ2VIZWlnaHQoKSwgMCk7CisKK3ZvaWQgQ1BERl9UZXh0UGFnZTo6Tm9ybWFsaXplT2JqZWN0cyhGWF9CT09MIGJOb3JtYWxpemUpIHsKKyAgbV9QYXJzZU9wdGlvbnMubV9iTm9ybWFsaXplT2JqcyA9IGJOb3JtYWxpemU7CiB9Ci1DUERGX1RleHRQYWdlOjpDUERGX1RleHRQYWdlKGNvbnN0IENQREZfUGFnZU9iamVjdHMqIHBQYWdlLCBpbnQgZmxhZ3MpCi0gICAgOiBtX2NoYXJMaXN0KDUxMiksCi0gICAgICBtX1RlbXBDaGFyTGlzdCg1MCksCi0gICAgICBtX3BQcmVUZXh0T2JqKE5VTEwpLAotICAgICAgbV9Jc1BhcnNlcmVkKEZBTFNFKSwKLSAgICAgIG1fVGV4dGxpbmVEaXIoLTEpLAotICAgICAgbV9DdXJsaW5lUmVjdCgwLCAwLCAwLCAwKQotewotICAgIG1fcFBhZ2UgPSBwUGFnZTsKLSAgICBtX3BhcnNlcmZsYWcgPSBmbGFnczsKLSAgICBtX1RleHRCdWYuRXN0aW1hdGVTaXplKDAsIDEwMjQwKTsKLSAgICBDRlhfRmxvYXRSZWN0IHBhZ2VSZWN0ID0gcFBhZ2UtPkNhbGNCb3VuZGluZ0JveCgpOwotICAgIG1fRGlzcGxheU1hdHJpeCA9IENGWF9BZmZpbmVNYXRyaXgoMSwgMCwgMCwgLTEsIHBhZ2VSZWN0LnJpZ2h0LCBwYWdlUmVjdC50b3ApOworYm9vbCBDUERGX1RleHRQYWdlOjpJc0NvbnRyb2xDaGFyKGNvbnN0IFBBR0VDSEFSX0lORk8mIGNoYXJJbmZvKSB7CisgIHN3aXRjaCAoY2hhckluZm8ubV9Vbmljb2RlKSB7CisgICAgY2FzZSAweDI6CisgICAgY2FzZSAweDM6CisgICAgY2FzZSAweDkzOgorICAgIGNhc2UgMHg5NDoKKyAgICBjYXNlIDB4OTY6CisgICAgY2FzZSAweDk3OgorICAgIGNhc2UgMHg5ODoKKyAgICBjYXNlIDB4ZmZmZToKKyAgICAgIHJldHVybiBjaGFySW5mby5tX0ZsYWcgIT0gRlBERlRFWFRfQ0hBUl9IWVBIRU47CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQogfQotdm9pZCBDUERGX1RleHRQYWdlOjpOb3JtYWxpemVPYmplY3RzKEZYX0JPT0wgYk5vcm1hbGl6ZSkKLXsKLSAgICBtX1BhcnNlT3B0aW9ucy5tX2JOb3JtYWxpemVPYmpzID0gYk5vcm1hbGl6ZTsKLX0KLUZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6SXNDb250cm9sQ2hhcihQQUdFQ0hBUl9JTkZPKiBwQ2hhckluZm8pCi17Ci0gICAgaWYoIXBDaGFySW5mbykgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHN3aXRjaChwQ2hhckluZm8tPm1fVW5pY29kZSkgewotICAgICAgICBjYXNlIDB4MjoKLSAgICAgICAgY2FzZSAweDM6Ci0gICAgICAgIGNhc2UgMHg5MzoKLSAgICAgICAgY2FzZSAweDk0OgotICAgICAgICBjYXNlIDB4OTY6Ci0gICAgICAgIGNhc2UgMHg5NzoKLSAgICAgICAgY2FzZSAweDk4OgotICAgICAgICBjYXNlIDB4ZmZmZToKLSAgICAgICAgICAgIGlmKHBDaGFySW5mby0+bV9GbGFnID09IEZQREZURVhUX0NIQVJfSFlQSEVOKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci19Ci1GWF9CT09MIENQREZfVGV4dFBhZ2U6OlBhcnNlVGV4dFBhZ2UoKQotewotICAgIGlmICghbV9wUGFnZSkgewotICAgICAgICBtX0lzUGFyc2VyZWQgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX0lzUGFyc2VyZWQgPSBGQUxTRTsKLSAgICBtX1RleHRCdWYuQ2xlYXIoKTsKLSAgICBtX2NoYXJMaXN0LlJlbW92ZUFsbCgpOwotICAgIG1fcFByZVRleHRPYmogPSBOVUxMOwotICAgIFByb2Nlc3NPYmplY3QoKTsKLSAgICBtX0lzUGFyc2VyZWQgPSBUUlVFOwotICAgIGlmKCFtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKLSAgICAgICAgbV9DaGFySW5kZXguUmVtb3ZlQWxsKCk7Ci0gICAgICAgIGludCBuQ291bnQgPSBtX2NoYXJMaXN0LkdldFNpemUoKTsKLSAgICAgICAgaWYobkNvdW50KSB7Ci0gICAgICAgICAgICBtX0NoYXJJbmRleC5BZGQoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXhTaXplID0gbV9DaGFySW5kZXguR2V0U2l6ZSgpOwotICAgICAgICAgICAgRlhfQk9PTCBiTm9ybWFsID0gRkFMU0U7Ci0gICAgICAgICAgICBQQUdFQ0hBUl9JTkZPIGNoYXJpbmZvID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KGkpOwotICAgICAgICAgICAgaWYoY2hhcmluZm8ubV9GbGFnID09IEZQREZURVhUX0NIQVJfR0VORVJBVEVEKSB7Ci0gICAgICAgICAgICAgICAgYk5vcm1hbCA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKGNoYXJpbmZvLm1fVW5pY29kZSA9PSAwIHx8IElzQ29udHJvbENoYXIoJmNoYXJpbmZvKSkKLSAgICAgICAgICAgICAgICBiTm9ybWFsID0gRkFMU0U7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBiTm9ybWFsID0gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGJOb3JtYWwpIHsKLSAgICAgICAgICAgICAgICBpZihpbmRleFNpemUgJSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fQ2hhckluZGV4LkFkZCgxKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZihpbmRleFNpemUgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbV9DaGFySW5kZXguU2V0QXQoaW5kZXhTaXplIC0gMSwgbV9DaGFySW5kZXguR2V0QXQoaW5kZXhTaXplIC0gMSkgKyAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmKGluZGV4U2l6ZSAlIDIpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoaW5kZXhTaXplIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1fQ2hhckluZGV4LlNldEF0KGluZGV4U2l6ZSAtIDEsIGkgKyAxKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtX0NoYXJJbmRleC5BZGQoaSArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnQgaW5kZXhTaXplID0gbV9DaGFySW5kZXguR2V0U2l6ZSgpOwotICAgICAgICBpZihpbmRleFNpemUgJSAyKSB7Ci0gICAgICAgICAgICBtX0NoYXJJbmRleC5SZW1vdmVBdChpbmRleFNpemUgLSAxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLWludAlDUERGX1RleHRQYWdlOjpDb3VudENoYXJzKCkgY29uc3QKLXsKLSAgICBpZihtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIG1fVGV4dEJ1Zi5HZXRTaXplKCk7Ci0gICAgfQotICAgIHJldHVybiBtX2NoYXJMaXN0LkdldFNpemUoKTsKLX0KLWludCBDUERGX1RleHRQYWdlOjpDaGFySW5kZXhGcm9tVGV4dEluZGV4KGludCBUZXh0SW5kZXgpIGNvbnN0Ci17Ci0gICAgaW50IGluZGV4U2l6ZSA9IG1fQ2hhckluZGV4LkdldFNpemUoKTsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBpbmRleFNpemU7IGkgKz0gMikgewotICAgICAgICBjb3VudCArPSBtX0NoYXJJbmRleC5HZXRBdChpICsgMSk7Ci0gICAgICAgIGlmKGNvdW50ID4gVGV4dEluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gCVRleHRJbmRleCAtIGNvdW50ICsgbV9DaGFySW5kZXguR2V0QXQoaSArIDEpICsgbV9DaGFySW5kZXguR2V0QXQoaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotaW50IENQREZfVGV4dFBhZ2U6OlRleHRJbmRleEZyb21DaGFySW5kZXgoaW50IENoYXJJbmRleCkgY29uc3QKLXsKLSAgICBpbnQgaW5kZXhTaXplID0gbV9DaGFySW5kZXguR2V0U2l6ZSgpOwotICAgIGludCBjb3VudCA9IDA7Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IGluZGV4U2l6ZTsgaSArPSAyKSB7Ci0gICAgICAgIGNvdW50ICs9IG1fQ2hhckluZGV4LkdldEF0KGkgKyAxKTsKLSAgICAgICAgaWYobV9DaGFySW5kZXguR2V0QXQoaSArIDEpICsgbV9DaGFySW5kZXguR2V0QXQoaSkgPiBDaGFySW5kZXgpIHsKLSAgICAgICAgICAgIGlmKENoYXJJbmRleCAtIG1fQ2hhckluZGV4LkdldEF0KGkpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAJQ2hhckluZGV4IC0gbV9DaGFySW5kZXguR2V0QXQoaSkgKyBjb3VudCAtIG1fQ2hhckluZGV4LkdldEF0KGkgKyAxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci12b2lkIENQREZfVGV4dFBhZ2U6OkdldFJlY3RBcnJheShpbnQgc3RhcnQsIGludCBuQ291bnQsIENGWF9SZWN0QXJyYXkmIHJlY3RBcnJheSkgY29uc3QKLXsKLSAgICBpZihtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZihzdGFydCA8IDAgfHwgbkNvdW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoIW1fSXNQYXJzZXJlZCkJewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIFBBR0VDSEFSX0lORk8JCWluZm9fY3VyY2hhcjsKLSAgICBDUERGX1RleHRPYmplY3QqCXBDdXJPYmogPSBOVUxMOwotICAgIENGWF9GbG9hdFJlY3QJCXJlY3Q7Ci0gICAgaW50CQkJCQljdXJQb3MgPSBzdGFydDsKLSAgICBGWF9CT09MCQkJCWZsYWdOZXdSZWN0ID0gVFJVRTsKLSAgICBpZiAobkNvdW50ICsgc3RhcnQgPiBtX2NoYXJMaXN0LkdldFNpemUoKSB8fCBuQ291bnQgPT0gLTEpIHsKLSAgICAgICAgbkNvdW50ID0gbV9jaGFyTGlzdC5HZXRTaXplKCkgLSBzdGFydDsKLSAgICB9Ci0gICAgd2hpbGUgKG5Db3VudC0tKSB7Ci0gICAgICAgIGluZm9fY3VyY2hhciA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChjdXJQb3MrKyk7Ci0gICAgICAgIGlmIChpbmZvX2N1cmNoYXIubV9GbGFnID09IEZQREZURVhUX0NIQVJfR0VORVJBVEVEKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZihpbmZvX2N1cmNoYXIubV9DaGFyQm94LldpZHRoKCkgPCAwLjAxIHx8IGluZm9fY3VyY2hhci5tX0NoYXJCb3guSGVpZ2h0KCkgPCAwLjAxKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZighcEN1ck9iaikgewotICAgICAgICAgICAgcEN1ck9iaiA9IGluZm9fY3VyY2hhci5tX3BUZXh0T2JqOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwQ3VyT2JqICE9IGluZm9fY3VyY2hhci5tX3BUZXh0T2JqKSB7Ci0gICAgICAgICAgICByZWN0QXJyYXkuQWRkKHJlY3QpOwotICAgICAgICAgICAgcEN1ck9iaiA9IGluZm9fY3VyY2hhci5tX3BUZXh0T2JqOwotICAgICAgICAgICAgZmxhZ05ld1JlY3QgPSBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmbGFnTmV3UmVjdCkgewotICAgICAgICAgICAgRlhfRkxPQVQgb3JnWCA9IGluZm9fY3VyY2hhci5tX09yaWdpblgsIG9yZ1kgPSBpbmZvX2N1cmNoYXIubV9PcmlnaW5ZOwotICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXgsIG1hdHJpeF9yZXZlcnNlOwotICAgICAgICAgICAgaW5mb19jdXJjaGFyLm1fcFRleHRPYmotPkdldFRleHRNYXRyaXgoJm1hdHJpeCk7Ci0gICAgICAgICAgICBtYXRyaXguQ29uY2F0KGluZm9fY3VyY2hhci5tX01hdHJpeCk7Ci0gICAgICAgICAgICBtYXRyaXhfcmV2ZXJzZS5TZXRSZXZlcnNlKG1hdHJpeCk7Ci0gICAgICAgICAgICBtYXRyaXhfcmV2ZXJzZS5UcmFuc2Zvcm0ob3JnWCwgb3JnWSk7Ci0gICAgICAgICAgICByZWN0LmxlZnQgPSBpbmZvX2N1cmNoYXIubV9DaGFyQm94LmxlZnQ7Ci0gICAgICAgICAgICByZWN0LnJpZ2h0ID0gaW5mb19jdXJjaGFyLm1fQ2hhckJveC5yaWdodDsKLSAgICAgICAgICAgIGlmIChwQ3VyT2JqLT5HZXRGb250KCktPkdldFR5cGVEZXNjZW50KCkpIHsKLSAgICAgICAgICAgICAgICByZWN0LmJvdHRvbSA9IG9yZ1kgKyBwQ3VyT2JqLT5HZXRGb250KCktPkdldFR5cGVEZXNjZW50KCkgKiBwQ3VyT2JqLT5HZXRGb250U2l6ZSgpIC8gMTAwMDsKLSAgICAgICAgICAgICAgICBGWF9GTE9BVCB4UG9zVGVtcCA9IG9yZ1g7Ci0gICAgICAgICAgICAgICAgbWF0cml4LlRyYW5zZm9ybSh4UG9zVGVtcCwgcmVjdC5ib3R0b20pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZWN0LmJvdHRvbSA9IGluZm9fY3VyY2hhci5tX0NoYXJCb3guYm90dG9tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBDdXJPYmotPkdldEZvbnQoKS0+R2V0VHlwZUFzY2VudCgpKSB7Ci0gICAgICAgICAgICAgICAgcmVjdC50b3AgPSBvcmdZICsgcEN1ck9iai0+R2V0Rm9udCgpLT5HZXRUeXBlQXNjZW50KCkgKiBwQ3VyT2JqLT5HZXRGb250U2l6ZSgpIC8gMTAwMDsKLSAgICAgICAgICAgICAgICBGWF9GTE9BVCB4UG9zVGVtcCA9IG9yZ1ggKyBHZXRDaGFyV2lkdGgoaW5mb19jdXJjaGFyLm1fQ2hhckNvZGUsIHBDdXJPYmotPkdldEZvbnQoKSkgKiBwQ3VyT2JqLT5HZXRGb250U2l6ZSgpIC8gMTAwMDsKLSAgICAgICAgICAgICAgICBtYXRyaXguVHJhbnNmb3JtKHhQb3NUZW1wLCByZWN0LnRvcCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlY3QudG9wID0gaW5mb19jdXJjaGFyLm1fQ2hhckJveC50b3A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmbGFnTmV3UmVjdCA9IEZBTFNFOwotICAgICAgICAgICAgcmVjdCA9IGluZm9fY3VyY2hhci5tX0NoYXJCb3g7Ci0gICAgICAgICAgICByZWN0Lk5vcm1hbGl6ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5mb19jdXJjaGFyLm1fQ2hhckJveC5Ob3JtYWxpemUoKTsKLSAgICAgICAgICAgIGlmIChyZWN0LmxlZnQgPiBpbmZvX2N1cmNoYXIubV9DaGFyQm94LmxlZnQpIHsKLSAgICAgICAgICAgICAgICByZWN0LmxlZnQgPSBpbmZvX2N1cmNoYXIubV9DaGFyQm94LmxlZnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVjdC5yaWdodCA8IGluZm9fY3VyY2hhci5tX0NoYXJCb3gucmlnaHQpIHsKLSAgICAgICAgICAgICAgICByZWN0LnJpZ2h0ID0gaW5mb19jdXJjaGFyLm1fQ2hhckJveC5yaWdodDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICggcmVjdC50b3AgPCBpbmZvX2N1cmNoYXIubV9DaGFyQm94LnRvcCkgewotICAgICAgICAgICAgICAgIHJlY3QudG9wID0gaW5mb19jdXJjaGFyLm1fQ2hhckJveC50b3A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVjdC5ib3R0b20gPiBpbmZvX2N1cmNoYXIubV9DaGFyQm94LmJvdHRvbSkgewotICAgICAgICAgICAgICAgIHJlY3QuYm90dG9tID0gaW5mb19jdXJjaGFyLm1fQ2hhckJveC5ib3R0b207Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmVjdEFycmF5LkFkZChyZWN0KTsKLSAgICByZXR1cm47Ci19Ci1pbnQgQ1BERl9UZXh0UGFnZTo6R2V0SW5kZXhBdFBvcyhDUERGX1BvaW50IHBvaW50ICwgRlhfRkxPQVQgeFRvcmVsYW5jZSwgRlhfRkxPQVQgeVRvcmVsYW5jZSkgY29uc3QKLXsKLSAgICBpZihtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIC0zOwotICAgIH0KLSAgICBpZiAoIW1fSXNQYXJzZXJlZCkJewotICAgICAgICByZXR1cm4JLTM7Ci0gICAgfQotICAgIGludCBwb3MgPSAwOwotICAgIGludCBOZWFyUG9zID0gLTE7Ci0gICAgZG91YmxlIHhkaWYgPSA1MDAwLCB5ZGlmID0gNTAwMDsKLSAgICB3aGlsZShwb3MgPCBtX2NoYXJMaXN0LkdldFNpemUoKSkgewotICAgICAgICBQQUdFQ0hBUl9JTkZPIGNoYXJpbmZvID0gKihQQUdFQ0hBUl9JTkZPKikobV9jaGFyTGlzdC5HZXRBdChwb3MpKTsKLSAgICAgICAgQ0ZYX0Zsb2F0UmVjdCBjaGFycmVjdCA9IGNoYXJpbmZvLm1fQ2hhckJveDsKLSAgICAgICAgaWYgKGNoYXJyZWN0LkNvbnRhaW5zKHBvaW50LngsIHBvaW50LnkpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoeFRvcmVsYW5jZSA+IDAgfHwgeVRvcmVsYW5jZSA+IDApIHsKLSAgICAgICAgICAgIENGWF9GbG9hdFJlY3QgY2hhclJlY3RFeHQ7Ci0gICAgICAgICAgICBjaGFycmVjdC5Ob3JtYWxpemUoKTsKLSAgICAgICAgICAgIGNoYXJSZWN0RXh0LmxlZnQgPSBjaGFycmVjdC5sZWZ0IC0geFRvcmVsYW5jZSAvIDI7Ci0gICAgICAgICAgICBjaGFyUmVjdEV4dC5yaWdodCA9IGNoYXJyZWN0LnJpZ2h0ICsgeFRvcmVsYW5jZSAvIDI7Ci0gICAgICAgICAgICBjaGFyUmVjdEV4dC50b3AgPSBjaGFycmVjdC50b3AgKyB5VG9yZWxhbmNlIC8gMjsKLSAgICAgICAgICAgIGNoYXJSZWN0RXh0LmJvdHRvbSA9IGNoYXJyZWN0LmJvdHRvbSAtIHlUb3JlbGFuY2UgLyAyOwotICAgICAgICAgICAgaWYgKGNoYXJSZWN0RXh0LkNvbnRhaW5zKHBvaW50LngsIHBvaW50LnkpKSB7Ci0gICAgICAgICAgICAgICAgZG91YmxlIGN1clhkaWYsIGN1cllkaWY7Ci0gICAgICAgICAgICAgICAgY3VyWGRpZiA9IEZYU1lTX2ZhYnMocG9pbnQueCAtIGNoYXJyZWN0LmxlZnQpIDwgRlhTWVNfZmFicyhwb2ludC54IC0gY2hhcnJlY3QucmlnaHQpID8gRlhTWVNfZmFicyhwb2ludC54IC0gY2hhcnJlY3QubGVmdCkgOiBGWFNZU19mYWJzKHBvaW50LnggLSBjaGFycmVjdC5yaWdodCk7Ci0gICAgICAgICAgICAgICAgY3VyWWRpZiA9IEZYU1lTX2ZhYnMocG9pbnQueSAtIGNoYXJyZWN0LmJvdHRvbSkgPCBGWFNZU19mYWJzKHBvaW50LnkgLSBjaGFycmVjdC50b3AJKSA/IEZYU1lTX2ZhYnMocG9pbnQueSAtIGNoYXJyZWN0LmJvdHRvbSkgOiBGWFNZU19mYWJzKHBvaW50LnkgLSBjaGFycmVjdC50b3ApOwotICAgICAgICAgICAgICAgIGlmIChjdXJZZGlmICsgY3VyWGRpZiA8IHhkaWYgKyB5ZGlmKSB7Ci0gICAgICAgICAgICAgICAgICAgIHlkaWYgPSBjdXJZZGlmOwotICAgICAgICAgICAgICAgICAgICB4ZGlmID0gY3VyWGRpZjsKLSAgICAgICAgICAgICAgICAgICAgTmVhclBvcyA9IHBvczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgKytwb3M7Ci0gICAgfQotICAgIGlmIChwb3MgPj0gbV9jaGFyTGlzdC5HZXRTaXplKCkpIHsKLSAgICAgICAgcG9zID0gTmVhclBvczsKLSAgICB9Ci0gICAgcmV0dXJuIHBvczsKLX0KLUNGWF9XaWRlU3RyaW5nIENQREZfVGV4dFBhZ2U6OkdldFRleHRCeVJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgY29uc3QKLXsKLSAgICBDRlhfV2lkZVN0cmluZyBzdHJUZXh0OwotICAgIGlmKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSB8fCAhbV9Jc1BhcnNlcmVkKSB7Ci0gICAgICAgIHJldHVybiBzdHJUZXh0OwotICAgIH0KK0ZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6UGFyc2VUZXh0UGFnZSgpIHsKKyAgbV9iSXNQYXJzZWQgPSBmYWxzZTsKKyAgaWYgKCFtX3BQYWdlKQorICAgIHJldHVybiBGQUxTRTsKKworICBtX1RleHRCdWYuQ2xlYXIoKTsKKyAgbV9jaGFyTGlzdC5SZW1vdmVBbGwoKTsKKyAgbV9wUHJlVGV4dE9iaiA9IE5VTEw7CisgIFByb2Nlc3NPYmplY3QoKTsKKyAgbV9iSXNQYXJzZWQgPSB0cnVlOworICBpZiAoIW1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgeworICAgIG1fQ2hhckluZGV4LlJlbW92ZUFsbCgpOwogICAgIGludCBuQ291bnQgPSBtX2NoYXJMaXN0LkdldFNpemUoKTsKLSAgICBpbnQgcG9zID0gMDsKLSAgICBGWF9GTE9BVCBwb3N5ID0gMDsKLSAgICBGWF9CT09MIElzQ29udGFpblByZUNoYXIgPSBGQUxTRTsKLSAgICBGWF9CT09MCUlTQWRkTGluZUZlZWQgPSBGQUxTRTsKLSAgICB3aGlsZSAocG9zIDwgbkNvdW50KSB7Ci0gICAgICAgIFBBR0VDSEFSX0lORk8gY2hhcmluZm8gPSAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQocG9zKyspOwotICAgICAgICBpZiAoSXNSZWN0SW50ZXJzZWN0KHJlY3QsIGNoYXJpbmZvLm1fQ2hhckJveCkpIHsKLSAgICAgICAgICAgIGlmIChGWFNZU19mYWJzKHBvc3kgLSBjaGFyaW5mby5tX09yaWdpblkpID4gMCAmJiAhSXNDb250YWluUHJlQ2hhciAmJiBJU0FkZExpbmVGZWVkKSB7Ci0gICAgICAgICAgICAgICAgcG9zeSA9IGNoYXJpbmZvLm1fT3JpZ2luWTsKLSAgICAgICAgICAgICAgICBpZiAoc3RyVGV4dC5HZXRMZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyVGV4dCArPSBMIlxyXG4iOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIElzQ29udGFpblByZUNoYXIgPSBUUlVFOwotICAgICAgICAgICAgSVNBZGRMaW5lRmVlZCA9IEZBTFNFOwotICAgICAgICAgICAgaWYgKGNoYXJpbmZvLm1fVW5pY29kZSkgewotICAgICAgICAgICAgICAgIHN0clRleHQgKz0gY2hhcmluZm8ubV9Vbmljb2RlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGNoYXJpbmZvLm1fVW5pY29kZSA9PSAzMikgewotICAgICAgICAgICAgaWYgKElzQ29udGFpblByZUNoYXIgJiYgY2hhcmluZm8ubV9Vbmljb2RlKSB7Ci0gICAgICAgICAgICAgICAgc3RyVGV4dCArPSBjaGFyaW5mby5tX1VuaWNvZGU7Ci0gICAgICAgICAgICAgICAgSXNDb250YWluUHJlQ2hhciA9IEZBTFNFOwotICAgICAgICAgICAgICAgIElTQWRkTGluZUZlZWQgPSBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIElzQ29udGFpblByZUNoYXIgPSBGQUxTRTsKLSAgICAgICAgICAgIElTQWRkTGluZUZlZWQgPSBUUlVFOwotICAgICAgICB9CisgICAgaWYgKG5Db3VudCkgeworICAgICAgbV9DaGFySW5kZXguQWRkKDApOwogICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7CisgICAgICBpbnQgaW5kZXhTaXplID0gbV9DaGFySW5kZXguR2V0U2l6ZSgpOworICAgICAgRlhfQk9PTCBiTm9ybWFsID0gRkFMU0U7CisgICAgICBQQUdFQ0hBUl9JTkZPIGNoYXJpbmZvID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KGkpOworICAgICAgaWYgKGNoYXJpbmZvLm1fRmxhZyA9PSBGUERGVEVYVF9DSEFSX0dFTkVSQVRFRCkgeworICAgICAgICBiTm9ybWFsID0gVFJVRTsKKyAgICAgIH0gZWxzZSBpZiAoY2hhcmluZm8ubV9Vbmljb2RlID09IDAgfHwgSXNDb250cm9sQ2hhcihjaGFyaW5mbykpIHsKKyAgICAgICAgYk5vcm1hbCA9IEZBTFNFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYk5vcm1hbCA9IFRSVUU7CisgICAgICB9CisgICAgICBpZiAoYk5vcm1hbCkgeworICAgICAgICBpZiAoaW5kZXhTaXplICUgMikgeworICAgICAgICAgIG1fQ2hhckluZGV4LkFkZCgxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoaW5kZXhTaXplIDw9IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBtX0NoYXJJbmRleC5TZXRBdChpbmRleFNpemUgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQ2hhckluZGV4LkdldEF0KGluZGV4U2l6ZSAtIDEpICsgMSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpbmRleFNpemUgJSAyKSB7CisgICAgICAgICAgaWYgKGluZGV4U2l6ZSA8PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgbV9DaGFySW5kZXguU2V0QXQoaW5kZXhTaXplIC0gMSwgaSArIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1fQ2hhckluZGV4LkFkZChpICsgMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaW50IGluZGV4U2l6ZSA9IG1fQ2hhckluZGV4LkdldFNpemUoKTsKKyAgICBpZiAoaW5kZXhTaXplICUgMikgeworICAgICAgbV9DaGFySW5kZXguUmVtb3ZlQXQoaW5kZXhTaXplIC0gMSk7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQoraW50IENQREZfVGV4dFBhZ2U6OkNvdW50Q2hhcnMoKSBjb25zdCB7CisgIGlmIChtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKKyAgICByZXR1cm4gbV9UZXh0QnVmLkdldFNpemUoKTsKKyAgfQorICByZXR1cm4gbV9jaGFyTGlzdC5HZXRTaXplKCk7Cit9CitpbnQgQ1BERl9UZXh0UGFnZTo6Q2hhckluZGV4RnJvbVRleHRJbmRleChpbnQgVGV4dEluZGV4KSBjb25zdCB7CisgIGludCBpbmRleFNpemUgPSBtX0NoYXJJbmRleC5HZXRTaXplKCk7CisgIGludCBjb3VudCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXhTaXplOyBpICs9IDIpIHsKKyAgICBjb3VudCArPSBtX0NoYXJJbmRleC5HZXRBdChpICsgMSk7CisgICAgaWYgKGNvdW50ID4gVGV4dEluZGV4KSB7CisgICAgICByZXR1cm4gVGV4dEluZGV4IC0gY291bnQgKyBtX0NoYXJJbmRleC5HZXRBdChpICsgMSkgKworICAgICAgICAgICAgIG1fQ2hhckluZGV4LkdldEF0KGkpOworICAgIH0KKyAgfQorICByZXR1cm4gLTE7Cit9CitpbnQgQ1BERl9UZXh0UGFnZTo6VGV4dEluZGV4RnJvbUNoYXJJbmRleChpbnQgQ2hhckluZGV4KSBjb25zdCB7CisgIGludCBpbmRleFNpemUgPSBtX0NoYXJJbmRleC5HZXRTaXplKCk7CisgIGludCBjb3VudCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXhTaXplOyBpICs9IDIpIHsKKyAgICBjb3VudCArPSBtX0NoYXJJbmRleC5HZXRBdChpICsgMSk7CisgICAgaWYgKG1fQ2hhckluZGV4LkdldEF0KGkgKyAxKSArIG1fQ2hhckluZGV4LkdldEF0KGkpID4gQ2hhckluZGV4KSB7CisgICAgICBpZiAoQ2hhckluZGV4IC0gbV9DaGFySW5kZXguR2V0QXQoaSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBDaGFySW5kZXggLSBtX0NoYXJJbmRleC5HZXRBdChpKSArIGNvdW50IC0KKyAgICAgICAgICAgICBtX0NoYXJJbmRleC5HZXRBdChpICsgMSk7CisgICAgfQorICB9CisgIHJldHVybiAtMTsKK30KK3ZvaWQgQ1BERl9UZXh0UGFnZTo6R2V0UmVjdEFycmF5KGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEFycmF5JiByZWN0QXJyYXkpIGNvbnN0IHsKKyAgaWYgKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoc3RhcnQgPCAwIHx8IG5Db3VudCA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmICghbV9iSXNQYXJzZWQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgUEFHRUNIQVJfSU5GTyBpbmZvX2N1cmNoYXI7CisgIENQREZfVGV4dE9iamVjdCogcEN1ck9iaiA9IE5VTEw7CisgIENGWF9GbG9hdFJlY3QgcmVjdDsKKyAgaW50IGN1clBvcyA9IHN0YXJ0OworICBGWF9CT09MIGZsYWdOZXdSZWN0ID0gVFJVRTsKKyAgaWYgKG5Db3VudCArIHN0YXJ0ID4gbV9jaGFyTGlzdC5HZXRTaXplKCkgfHwgbkNvdW50ID09IC0xKSB7CisgICAgbkNvdW50ID0gbV9jaGFyTGlzdC5HZXRTaXplKCkgLSBzdGFydDsKKyAgfQorICB3aGlsZSAobkNvdW50LS0pIHsKKyAgICBpbmZvX2N1cmNoYXIgPSAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQoY3VyUG9zKyspOworICAgIGlmIChpbmZvX2N1cmNoYXIubV9GbGFnID09IEZQREZURVhUX0NIQVJfR0VORVJBVEVEKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGluZm9fY3VyY2hhci5tX0NoYXJCb3guV2lkdGgoKSA8IDAuMDEgfHwKKyAgICAgICAgaW5mb19jdXJjaGFyLm1fQ2hhckJveC5IZWlnaHQoKSA8IDAuMDEpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoIXBDdXJPYmopIHsKKyAgICAgIHBDdXJPYmogPSBpbmZvX2N1cmNoYXIubV9wVGV4dE9iajsKKyAgICB9CisgICAgaWYgKHBDdXJPYmogIT0gaW5mb19jdXJjaGFyLm1fcFRleHRPYmopIHsKKyAgICAgIHJlY3RBcnJheS5BZGQocmVjdCk7CisgICAgICBwQ3VyT2JqID0gaW5mb19jdXJjaGFyLm1fcFRleHRPYmo7CisgICAgICBmbGFnTmV3UmVjdCA9IFRSVUU7CisgICAgfQorICAgIGlmIChmbGFnTmV3UmVjdCkgeworICAgICAgRlhfRkxPQVQgb3JnWCA9IGluZm9fY3VyY2hhci5tX09yaWdpblgsIG9yZ1kgPSBpbmZvX2N1cmNoYXIubV9PcmlnaW5ZOworICAgICAgQ0ZYX01hdHJpeCBtYXRyaXgsIG1hdHJpeF9yZXZlcnNlOworICAgICAgaW5mb19jdXJjaGFyLm1fcFRleHRPYmotPkdldFRleHRNYXRyaXgoJm1hdHJpeCk7CisgICAgICBtYXRyaXguQ29uY2F0KGluZm9fY3VyY2hhci5tX01hdHJpeCk7CisgICAgICBtYXRyaXhfcmV2ZXJzZS5TZXRSZXZlcnNlKG1hdHJpeCk7CisgICAgICBtYXRyaXhfcmV2ZXJzZS5UcmFuc2Zvcm0ob3JnWCwgb3JnWSk7CisgICAgICByZWN0LmxlZnQgPSBpbmZvX2N1cmNoYXIubV9DaGFyQm94LmxlZnQ7CisgICAgICByZWN0LnJpZ2h0ID0gaW5mb19jdXJjaGFyLm1fQ2hhckJveC5yaWdodDsKKyAgICAgIGlmIChwQ3VyT2JqLT5HZXRGb250KCktPkdldFR5cGVEZXNjZW50KCkpIHsKKyAgICAgICAgcmVjdC5ib3R0b20gPSBvcmdZICsKKyAgICAgICAgICAgICAgICAgICAgICBwQ3VyT2JqLT5HZXRGb250KCktPkdldFR5cGVEZXNjZW50KCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VyT2JqLT5HZXRGb250U2l6ZSgpIC8gMTAwMDsKKyAgICAgICAgRlhfRkxPQVQgeFBvc1RlbXAgPSBvcmdYOworICAgICAgICBtYXRyaXguVHJhbnNmb3JtKHhQb3NUZW1wLCByZWN0LmJvdHRvbSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZWN0LmJvdHRvbSA9IGluZm9fY3VyY2hhci5tX0NoYXJCb3guYm90dG9tOworICAgICAgfQorICAgICAgaWYgKHBDdXJPYmotPkdldEZvbnQoKS0+R2V0VHlwZUFzY2VudCgpKSB7CisgICAgICAgIHJlY3QudG9wID0KKyAgICAgICAgICAgIG9yZ1kgKworICAgICAgICAgICAgcEN1ck9iai0+R2V0Rm9udCgpLT5HZXRUeXBlQXNjZW50KCkgKiBwQ3VyT2JqLT5HZXRGb250U2l6ZSgpIC8gMTAwMDsKKyAgICAgICAgRlhfRkxPQVQgeFBvc1RlbXAgPQorICAgICAgICAgICAgb3JnWCArCisgICAgICAgICAgICBHZXRDaGFyV2lkdGgoaW5mb19jdXJjaGFyLm1fQ2hhckNvZGUsIHBDdXJPYmotPkdldEZvbnQoKSkgKgorICAgICAgICAgICAgICAgIHBDdXJPYmotPkdldEZvbnRTaXplKCkgLyAxMDAwOworICAgICAgICBtYXRyaXguVHJhbnNmb3JtKHhQb3NUZW1wLCByZWN0LnRvcCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZWN0LnRvcCA9IGluZm9fY3VyY2hhci5tX0NoYXJCb3gudG9wOworICAgICAgfQorICAgICAgZmxhZ05ld1JlY3QgPSBGQUxTRTsKKyAgICAgIHJlY3QgPSBpbmZvX2N1cmNoYXIubV9DaGFyQm94OworICAgICAgcmVjdC5Ob3JtYWxpemUoKTsKKyAgICB9IGVsc2UgeworICAgICAgaW5mb19jdXJjaGFyLm1fQ2hhckJveC5Ob3JtYWxpemUoKTsKKyAgICAgIGlmIChyZWN0LmxlZnQgPiBpbmZvX2N1cmNoYXIubV9DaGFyQm94LmxlZnQpIHsKKyAgICAgICAgcmVjdC5sZWZ0ID0gaW5mb19jdXJjaGFyLm1fQ2hhckJveC5sZWZ0OworICAgICAgfQorICAgICAgaWYgKHJlY3QucmlnaHQgPCBpbmZvX2N1cmNoYXIubV9DaGFyQm94LnJpZ2h0KSB7CisgICAgICAgIHJlY3QucmlnaHQgPSBpbmZvX2N1cmNoYXIubV9DaGFyQm94LnJpZ2h0OworICAgICAgfQorICAgICAgaWYgKHJlY3QudG9wIDwgaW5mb19jdXJjaGFyLm1fQ2hhckJveC50b3ApIHsKKyAgICAgICAgcmVjdC50b3AgPSBpbmZvX2N1cmNoYXIubV9DaGFyQm94LnRvcDsKKyAgICAgIH0KKyAgICAgIGlmIChyZWN0LmJvdHRvbSA+IGluZm9fY3VyY2hhci5tX0NoYXJCb3guYm90dG9tKSB7CisgICAgICAgIHJlY3QuYm90dG9tID0gaW5mb19jdXJjaGFyLm1fQ2hhckJveC5ib3R0b207CisgICAgICB9CisgICAgfQorICB9CisgIHJlY3RBcnJheS5BZGQocmVjdCk7CisgIHJldHVybjsKK30KK2ludCBDUERGX1RleHRQYWdlOjpHZXRJbmRleEF0UG9zKENQREZfUG9pbnQgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4VG9sZXJhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeVRvbGVyYW5jZSkgY29uc3QgeworICBpZiAobV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5IHx8ICFtX2JJc1BhcnNlZCkKKyAgICByZXR1cm4gLTM7CisKKyAgaW50IHBvcyA9IDA7CisgIGludCBOZWFyUG9zID0gLTE7CisgIGRvdWJsZSB4ZGlmID0gNTAwMCwgeWRpZiA9IDUwMDA7CisgIHdoaWxlIChwb3MgPCBtX2NoYXJMaXN0LkdldFNpemUoKSkgeworICAgIFBBR0VDSEFSX0lORk8gY2hhcmluZm8gPSAqKFBBR0VDSEFSX0lORk8qKShtX2NoYXJMaXN0LkdldEF0KHBvcykpOworICAgIENGWF9GbG9hdFJlY3QgY2hhcnJlY3QgPSBjaGFyaW5mby5tX0NoYXJCb3g7CisgICAgaWYgKGNoYXJyZWN0LkNvbnRhaW5zKHBvaW50LngsIHBvaW50LnkpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHhUb2xlcmFuY2UgPiAwIHx8IHlUb2xlcmFuY2UgPiAwKSB7CisgICAgICBDRlhfRmxvYXRSZWN0IGNoYXJSZWN0RXh0OworICAgICAgY2hhcnJlY3QuTm9ybWFsaXplKCk7CisgICAgICBjaGFyUmVjdEV4dC5sZWZ0ID0gY2hhcnJlY3QubGVmdCAtIHhUb2xlcmFuY2UgLyAyOworICAgICAgY2hhclJlY3RFeHQucmlnaHQgPSBjaGFycmVjdC5yaWdodCArIHhUb2xlcmFuY2UgLyAyOworICAgICAgY2hhclJlY3RFeHQudG9wID0gY2hhcnJlY3QudG9wICsgeVRvbGVyYW5jZSAvIDI7CisgICAgICBjaGFyUmVjdEV4dC5ib3R0b20gPSBjaGFycmVjdC5ib3R0b20gLSB5VG9sZXJhbmNlIC8gMjsKKyAgICAgIGlmIChjaGFyUmVjdEV4dC5Db250YWlucyhwb2ludC54LCBwb2ludC55KSkgeworICAgICAgICBkb3VibGUgY3VyWGRpZiwgY3VyWWRpZjsKKyAgICAgICAgY3VyWGRpZiA9IEZYU1lTX2ZhYnMocG9pbnQueCAtIGNoYXJyZWN0LmxlZnQpIDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfZmFicyhwb2ludC54IC0gY2hhcnJlY3QucmlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgPyBGWFNZU19mYWJzKHBvaW50LnggLSBjaGFycmVjdC5sZWZ0KQorICAgICAgICAgICAgICAgICAgICAgIDogRlhTWVNfZmFicyhwb2ludC54IC0gY2hhcnJlY3QucmlnaHQpOworICAgICAgICBjdXJZZGlmID0gRlhTWVNfZmFicyhwb2ludC55IC0gY2hhcnJlY3QuYm90dG9tKSA8CisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX2ZhYnMocG9pbnQueSAtIGNoYXJyZWN0LnRvcCkKKyAgICAgICAgICAgICAgICAgICAgICA/IEZYU1lTX2ZhYnMocG9pbnQueSAtIGNoYXJyZWN0LmJvdHRvbSkKKyAgICAgICAgICAgICAgICAgICAgICA6IEZYU1lTX2ZhYnMocG9pbnQueSAtIGNoYXJyZWN0LnRvcCk7CisgICAgICAgIGlmIChjdXJZZGlmICsgY3VyWGRpZiA8IHhkaWYgKyB5ZGlmKSB7CisgICAgICAgICAgeWRpZiA9IGN1cllkaWY7CisgICAgICAgICAgeGRpZiA9IGN1clhkaWY7CisgICAgICAgICAgTmVhclBvcyA9IHBvczsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICArK3BvczsKKyAgfQorICBpZiAocG9zID49IG1fY2hhckxpc3QuR2V0U2l6ZSgpKSB7CisgICAgcG9zID0gTmVhclBvczsKKyAgfQorICByZXR1cm4gcG9zOworfQorQ0ZYX1dpZGVTdHJpbmcgQ1BERl9UZXh0UGFnZTo6R2V0VGV4dEJ5UmVjdChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KSBjb25zdCB7CisgIENGWF9XaWRlU3RyaW5nIHN0clRleHQ7CisgIGlmIChtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkgfHwgIW1fYklzUGFyc2VkKQogICAgIHJldHVybiBzdHJUZXh0OwotfQotdm9pZCBDUERGX1RleHRQYWdlOjpHZXRSZWN0c0FycmF5QnlSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QsIENGWF9SZWN0QXJyYXkmIHJlc1JlY3RBcnJheSkgY29uc3QKLXsKLSAgICBpZihtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoIW1fSXNQYXJzZXJlZCkJewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENGWF9GbG9hdFJlY3QJCWN1clJlY3Q7Ci0gICAgRlhfQk9PTAkJCQlmbGFnTmV3UmVjdCA9IFRSVUU7Ci0gICAgQ1BERl9UZXh0T2JqZWN0KglwQ3VyT2JqID0gTlVMTDsKLSAgICBpbnQgbkNvdW50ID0gbV9jaGFyTGlzdC5HZXRTaXplKCk7Ci0gICAgaW50IHBvcyA9IDA7Ci0gICAgd2hpbGUgKHBvcyA8IG5Db3VudCkgewotICAgICAgICBQQUdFQ0hBUl9JTkZPIGluZm9fY3VyY2hhciA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChwb3MrKyk7Ci0gICAgICAgIGlmIChpbmZvX2N1cmNoYXIubV9GbGFnID09IEZQREZURVhUX0NIQVJfR0VORVJBVEVEKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKKworICBpbnQgbkNvdW50ID0gbV9jaGFyTGlzdC5HZXRTaXplKCk7CisgIGludCBwb3MgPSAwOworICBGWF9GTE9BVCBwb3N5ID0gMDsKKyAgRlhfQk9PTCBJc0NvbnRhaW5QcmVDaGFyID0gRkFMU0U7CisgIEZYX0JPT0wgSVNBZGRMaW5lRmVlZCA9IEZBTFNFOworICB3aGlsZSAocG9zIDwgbkNvdW50KSB7CisgICAgUEFHRUNIQVJfSU5GTyBjaGFyaW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChwb3MrKyk7CisgICAgaWYgKElzUmVjdEludGVyc2VjdChyZWN0LCBjaGFyaW5mby5tX0NoYXJCb3gpKSB7CisgICAgICBpZiAoRlhTWVNfZmFicyhwb3N5IC0gY2hhcmluZm8ubV9PcmlnaW5ZKSA+IDAgJiYgIUlzQ29udGFpblByZUNoYXIgJiYKKyAgICAgICAgICBJU0FkZExpbmVGZWVkKSB7CisgICAgICAgIHBvc3kgPSBjaGFyaW5mby5tX09yaWdpblk7CisgICAgICAgIGlmIChzdHJUZXh0LkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgIHN0clRleHQgKz0gTCJcclxuIjsKICAgICAgICAgfQotICAgICAgICBpZiAoSXNSZWN0SW50ZXJzZWN0KHJlY3QsIGluZm9fY3VyY2hhci5tX0NoYXJCb3gpKSB7Ci0gICAgICAgICAgICBpZighcEN1ck9iaikgewotICAgICAgICAgICAgICAgIHBDdXJPYmogPSBpbmZvX2N1cmNoYXIubV9wVGV4dE9iajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwQ3VyT2JqICE9IGluZm9fY3VyY2hhci5tX3BUZXh0T2JqKSB7Ci0gICAgICAgICAgICAgICAgcmVzUmVjdEFycmF5LkFkZChjdXJSZWN0KTsKLSAgICAgICAgICAgICAgICBwQ3VyT2JqID0gaW5mb19jdXJjaGFyLm1fcFRleHRPYmo7Ci0gICAgICAgICAgICAgICAgZmxhZ05ld1JlY3QgPSBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZsYWdOZXdSZWN0KSB7Ci0gICAgICAgICAgICAgICAgY3VyUmVjdCA9IGluZm9fY3VyY2hhci5tX0NoYXJCb3g7Ci0gICAgICAgICAgICAgICAgZmxhZ05ld1JlY3QgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICBjdXJSZWN0Lk5vcm1hbGl6ZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbmZvX2N1cmNoYXIubV9DaGFyQm94Lk5vcm1hbGl6ZSgpOwotICAgICAgICAgICAgICAgIGlmIChjdXJSZWN0LmxlZnQgPiBpbmZvX2N1cmNoYXIubV9DaGFyQm94LmxlZnQpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VyUmVjdC5sZWZ0ID0gaW5mb19jdXJjaGFyLm1fQ2hhckJveC5sZWZ0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY3VyUmVjdC5yaWdodCA8IGluZm9fY3VyY2hhci5tX0NoYXJCb3gucmlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VyUmVjdC5yaWdodCA9IGluZm9fY3VyY2hhci5tX0NoYXJCb3gucmlnaHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICggY3VyUmVjdC50b3AgPCBpbmZvX2N1cmNoYXIubV9DaGFyQm94LnRvcCkgewotICAgICAgICAgICAgICAgICAgICBjdXJSZWN0LnRvcCA9IGluZm9fY3VyY2hhci5tX0NoYXJCb3gudG9wOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY3VyUmVjdC5ib3R0b20gPiBpbmZvX2N1cmNoYXIubV9DaGFyQm94LmJvdHRvbSkgewotICAgICAgICAgICAgICAgICAgICBjdXJSZWN0LmJvdHRvbSA9IGluZm9fY3VyY2hhci5tX0NoYXJCb3guYm90dG9tOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXNSZWN0QXJyYXkuQWRkKGN1clJlY3QpOwotICAgIHJldHVybjsKLX0KLWludAlDUERGX1RleHRQYWdlOjpHZXRJbmRleEF0UG9zKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIHhUb3JlbGFuY2UsIEZYX0ZMT0FUIHlUb3JlbGFuY2UpIGNvbnN0Ci17Ci0gICAgaWYobV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7Ci0gICAgICAgIHJldHVybiAtMzsKLSAgICB9Ci0gICAgQ1BERl9Qb2ludCBwb2ludCh4LCB5KTsKLSAgICByZXR1cm4gR2V0SW5kZXhBdFBvcyhwb2ludCwgeFRvcmVsYW5jZSwgeVRvcmVsYW5jZSk7Ci19Ci1pbnQgQ1BERl9UZXh0UGFnZTo6R2V0T3JkZXJCeURpcmVjdGlvbihpbnQgb3JkZXIsIGludCBkaXJlY3Rpb24pIGNvbnN0Ci17Ci0gICAgaWYobV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7Ci0gICAgICAgIHJldHVybiAtMzsKLSAgICB9Ci0gICAgaWYgKCFtX0lzUGFyc2VyZWQpIHsKLSAgICAgICAgcmV0dXJuIC0zOwotICAgIH0KLSAgICBpZiAoZGlyZWN0aW9uID09IEZQREZURVhUX1JJR0hUIHx8IGRpcmVjdGlvbiA9PSBGUERGVEVYVF9MRUZUKSB7Ci0gICAgICAgIG9yZGVyICs9IGRpcmVjdGlvbjsKLSAgICAgICAgd2hpbGUob3JkZXIgPj0gMCAmJiBvcmRlciA8IG1fY2hhckxpc3QuR2V0U2l6ZSgpKSB7Ci0gICAgICAgICAgICBQQUdFQ0hBUl9JTkZPIGNpbmZvID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KG9yZGVyKTsKLSAgICAgICAgICAgIGlmIChjaW5mby5tX0ZsYWcgIT0gRlBERlRFWFRfQ0hBUl9HRU5FUkFURUQpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNpbmZvLm1fVW5pY29kZSA9PSBURVhUX0xJTkVGRUVEX0NIQVIgfHwgY2luZm8ubV9Vbmljb2RlID09IFRFWFRfUkVUVVJOX0NIQVIpIHsKLSAgICAgICAgICAgICAgICAgICAgb3JkZXIgKz0gZGlyZWN0aW9uOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAob3JkZXIgPj0gbV9jaGFyTGlzdC5HZXRTaXplKCkpIHsKLSAgICAgICAgICAgIG9yZGVyID0gLTI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9yZGVyOwotICAgIH0KLSAgICBQQUdFQ0hBUl9JTkZPIGNoYXJpbmZvOwotICAgIGNoYXJpbmZvID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KG9yZGVyKTsKLSAgICBDUERGX1BvaW50IGN1clBvcyhjaGFyaW5mby5tX09yaWdpblgsIGNoYXJpbmZvLm1fT3JpZ2luWSk7Ci0gICAgRlhfRkxPQVQgZGlmUG9zWSA9IDAuMCwgbWluWGRpZiA9IDEwMDA7Ci0gICAgaW50CW1pbkluZGV4ID0gLTI7Ci0gICAgaW50IGluZGV4ID0gb3JkZXI7Ci0gICAgRlhfRkxPQVQgaGVpZ2h0ID0gY2hhcmluZm8ubV9DaGFyQm94LkhlaWdodCgpOwotICAgIGlmIChkaXJlY3Rpb24gPT0gRlBERlRFWFRfVVApIHsKLSAgICAgICAgbWluSW5kZXggPSAtMTsKLSAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgIGlmICgtLWluZGV4IDwgMCkJewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoYXJpbmZvID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KGluZGV4KTsKLSAgICAgICAgICAgIGlmIChGWFNZU19mYWJzKGNoYXJpbmZvLm1fT3JpZ2luWSAtIGN1clBvcy55KSA+IEZYX01BWChoZWlnaHQsIGNoYXJpbmZvLm1fQ2hhckJveC5IZWlnaHQoKSkgLyAyKSB7Ci0gICAgICAgICAgICAgICAgZGlmUG9zWSA9IGNoYXJpbmZvLm1fT3JpZ2luWTsKLSAgICAgICAgICAgICAgICBtaW5JbmRleCA9IGluZGV4OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEZYX0ZMT0FUIFByZVhkaWYgPSBjaGFyaW5mby5tX09yaWdpblggLSBjdXJQb3MueDsKLSAgICAgICAgbWluWGRpZiA9IFByZVhkaWY7Ci0gICAgICAgIGlmIChQcmVYZGlmID09IDApCXsKLSAgICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAgfQotICAgICAgICBGWF9GTE9BVCBjdXJYZGlmID0gMDsKLSAgICAgICAgd2hpbGUgKC0taW5kZXggPj0gMCkgewotICAgICAgICAgICAgY2hhcmluZm8gPSAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQoaW5kZXgpOwotICAgICAgICAgICAgaWYgKGRpZlBvc1kgIT0gY2hhcmluZm8ubV9PcmlnaW5ZKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjdXJYZGlmID0gY2hhcmluZm8ubV9PcmlnaW5YIC0gY3VyUG9zLng7Ci0gICAgICAgICAgICBpZiAoY3VyWGRpZiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHNpZ25mbGFnID0gMDsKLSAgICAgICAgICAgIGlmIChjdXJYZGlmID4gMCkgewotICAgICAgICAgICAgICAgIHNpZ25mbGFnID0gMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2lnbmZsYWcgPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzaWduZmxhZyAqIFByZVhkaWYgPCAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKEZYU1lTX2ZhYnMoUHJlWGRpZikgPCBGWFNZU19mYWJzKGN1clhkaWYpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleCArIDE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChGWFNZU19mYWJzKGN1clhkaWYpIDwgRlhTWVNfZmFicyhtaW5YZGlmKSkgewotICAgICAgICAgICAgICAgIG1pbkluZGV4ID0gaW5kZXg7Ci0gICAgICAgICAgICAgICAgbWluWGRpZiA9IGN1clhkaWY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQcmVYZGlmID0gY3VyWGRpZjsKLSAgICAgICAgICAgIGlmIChkaWZQb3NZICE9IGNoYXJpbmZvLm1fT3JpZ2luWSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtaW5JbmRleDsKLSAgICB9IGVsc2UgaWYoRlBERlRFWFRfRE9XTikgewotICAgICAgICBtaW5JbmRleCA9IC0yOwotICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgaWYgKCsraW5kZXggPiBtX2NoYXJMaXN0LkdldFNpemUoKSAtIDEpCXsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWluSW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGFyaW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChpbmRleCk7Ci0gICAgICAgICAgICBpZiAoRlhTWVNfZmFicyhjaGFyaW5mby5tX09yaWdpblkgLSBjdXJQb3MueSkgPiBGWF9NQVgoaGVpZ2h0LCBjaGFyaW5mby5tX0NoYXJCb3guSGVpZ2h0KCkpIC8gMikgewotICAgICAgICAgICAgICAgIGRpZlBvc1kgPSBjaGFyaW5mby5tX09yaWdpblk7Ci0gICAgICAgICAgICAgICAgbWluSW5kZXggPSBpbmRleDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBGWF9GTE9BVCBQcmVYZGlmID0gY2hhcmluZm8ubV9PcmlnaW5YIC0gY3VyUG9zLng7Ci0gICAgICAgIG1pblhkaWYgPSBQcmVYZGlmOwotICAgICAgICBpZiAoUHJlWGRpZiA9PSAwKQl7Ci0gICAgICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRkxPQVQgY3VyWGRpZiA9IDA7Ci0gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbV9jaGFyTGlzdC5HZXRTaXplKCkpIHsKLSAgICAgICAgICAgIGNoYXJpbmZvID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KGluZGV4KTsKLSAgICAgICAgICAgIGlmIChkaWZQb3NZICE9IGNoYXJpbmZvLm1fT3JpZ2luWSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY3VyWGRpZiA9IGNoYXJpbmZvLm1fT3JpZ2luWCAtIGN1clBvcy54OwotICAgICAgICAgICAgaWYgKGN1clhkaWYgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBzaWduZmxhZyA9IDA7Ci0gICAgICAgICAgICBpZiAoY3VyWGRpZiA+IDApIHsKLSAgICAgICAgICAgICAgICBzaWduZmxhZyA9IDE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNpZ25mbGFnID0gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2lnbmZsYWcgKiBQcmVYZGlmIDwgMCkgewotICAgICAgICAgICAgICAgIGlmIChGWFNZU19mYWJzKFByZVhkaWYpIDwgRlhTWVNfZmFicyhjdXJYZGlmKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggLSAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoRlhTWVNfZmFicyhjdXJYZGlmKSA8IEZYU1lTX2ZhYnMobWluWGRpZikpIHsKLSAgICAgICAgICAgICAgICBtaW5YZGlmID0gY3VyWGRpZjsKLSAgICAgICAgICAgICAgICBtaW5JbmRleCA9IGluZGV4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUHJlWGRpZiA9IGN1clhkaWY7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1pbkluZGV4OwotICAgIH0KLX0KLXZvaWQgQ1BERl9UZXh0UGFnZTo6R2V0Q2hhckluZm8oaW50IGluZGV4LCBGUERGX0NIQVJfSU5GTyAmIGluZm8pIGNvbnN0Ci17Ci0gICAgaWYobV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCFtX0lzUGFyc2VyZWQpCXsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG1fY2hhckxpc3QuR2V0U2l6ZSgpKQl7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgUEFHRUNIQVJfSU5GTyBjaGFyaW5mbzsKLSAgICBjaGFyaW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChpbmRleCk7Ci0gICAgaW5mby5tX0NoYXJjb2RlID0gY2hhcmluZm8ubV9DaGFyQ29kZTsKLSAgICBpbmZvLm1fT3JpZ2luWCA9IGNoYXJpbmZvLm1fT3JpZ2luWDsKLSAgICBpbmZvLm1fT3JpZ2luWSA9IGNoYXJpbmZvLm1fT3JpZ2luWTsKLSAgICBpbmZvLm1fVW5pY29kZSA9IGNoYXJpbmZvLm1fVW5pY29kZTsKLSAgICBpbmZvLm1fRmxhZyA9IGNoYXJpbmZvLm1fRmxhZzsKLSAgICBpbmZvLm1fQ2hhckJveCA9IGNoYXJpbmZvLm1fQ2hhckJveDsKLSAgICBpbmZvLm1fcFRleHRPYmogPSBjaGFyaW5mby5tX3BUZXh0T2JqOwotICAgIGlmIChjaGFyaW5mby5tX3BUZXh0T2JqICYmIGNoYXJpbmZvLm1fcFRleHRPYmotPkdldEZvbnQoKSkgewotICAgICAgICBpbmZvLm1fRm9udFNpemUgPSBjaGFyaW5mby5tX3BUZXh0T2JqLT5HZXRGb250U2l6ZSgpOwotICAgIH0KLSAgICBpbmZvLm1fTWF0cml4LkNvcHkoY2hhcmluZm8ubV9NYXRyaXgpOwotICAgIHJldHVybjsKLX0KLXZvaWQgQ1BERl9UZXh0UGFnZTo6Q2hlY2tNYXJrZWRDb250ZW50T2JqZWN0KEZYX0lOVDMyJiBzdGFydCwgRlhfSU5UMzImIG5Db3VudCkgY29uc3QKLXsKLSAgICBQQUdFQ0hBUl9JTkZPIGNoYXJpbmZvID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KHN0YXJ0KTsKLSAgICBQQUdFQ0hBUl9JTkZPIGNoYXJpbmZvMiA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChzdGFydCArIG5Db3VudCAtIDEpOwotICAgIGlmIChGUERGVEVYVF9DSEFSX1BJRUNFICE9IGNoYXJpbmZvLm1fRmxhZyAmJiBGUERGVEVYVF9DSEFSX1BJRUNFICE9IGNoYXJpbmZvMi5tX0ZsYWcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoRlBERlRFWFRfQ0hBUl9QSUVDRSA9PSBjaGFyaW5mby5tX0ZsYWcpIHsKLSAgICAgICAgUEFHRUNIQVJfSU5GTyBjaGFyaW5mbzEgPSBjaGFyaW5mbzsKLSAgICAgICAgaW50IHN0YXJ0SW5kZXggPSBzdGFydDsKLSAgICAgICAgd2hpbGUoRlBERlRFWFRfQ0hBUl9QSUVDRSA9PSBjaGFyaW5mbzEubV9GbGFnICYmIGNoYXJpbmZvMS5tX0luZGV4ID09IGNoYXJpbmZvLm1fSW5kZXgpIHsKLSAgICAgICAgICAgIHN0YXJ0SW5kZXgtLTsKLSAgICAgICAgICAgIGlmIChzdGFydEluZGV4IDwgMCkJewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hhcmluZm8xID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KHN0YXJ0SW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIHN0YXJ0SW5kZXgrKzsKLSAgICAgICAgc3RhcnQgPSBzdGFydEluZGV4OwotICAgIH0KLSAgICBpZiAoRlBERlRFWFRfQ0hBUl9QSUVDRSA9PSBjaGFyaW5mbzIubV9GbGFnKSB7Ci0gICAgICAgIFBBR0VDSEFSX0lORk8gY2hhcmluZm8zID0gY2hhcmluZm8yOwotICAgICAgICBpbnQgZW5kSW5kZXggPSBzdGFydCArIG5Db3VudCAtIDE7Ci0gICAgICAgIHdoaWxlKEZQREZURVhUX0NIQVJfUElFQ0UgPT0gY2hhcmluZm8zLm1fRmxhZyAmJiBjaGFyaW5mbzMubV9JbmRleCA9PSBjaGFyaW5mbzIubV9JbmRleCkgewotICAgICAgICAgICAgZW5kSW5kZXgrKzsKLSAgICAgICAgICAgIGlmIChlbmRJbmRleCA+PSBtX2NoYXJMaXN0LkdldFNpemUoKSkJewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hhcmluZm8zID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KGVuZEluZGV4KTsKLSAgICAgICAgfQotICAgICAgICBlbmRJbmRleC0tOwotICAgICAgICBuQ291bnQgPSBlbmRJbmRleCAtIHN0YXJ0ICsgMTsKLSAgICB9Ci19Ci1DRlhfV2lkZVN0cmluZyBDUERGX1RleHRQYWdlOjpHZXRQYWdlVGV4dChpbnQgc3RhcnQgLCBpbnQgbkNvdW50KSBjb25zdAotewotICAgIGlmICghbV9Jc1BhcnNlcmVkIHx8IG5Db3VudCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBMIiI7Ci0gICAgfQotICAgIGlmIChzdGFydCA8IDApIHsKLSAgICAgICAgc3RhcnQgPSAwOwotICAgIH0KLSAgICBpZgkobkNvdW50ID09IC0xKSB7Ci0gICAgICAgIG5Db3VudCA9IG1fY2hhckxpc3QuR2V0U2l6ZSgpIC0gc3RhcnQ7Ci0gICAgICAgIHJldHVybiBtX1RleHRCdWYuR2V0V2lkZVN0cmluZygpLk1pZChzdGFydCwgbV9UZXh0QnVmLkdldFdpZGVTdHJpbmcoKS5HZXRMZW5ndGgoKSk7Ci0gICAgfQotICAgIGlmKG5Db3VudCA8PSAwIHx8IG1fY2hhckxpc3QuR2V0U2l6ZSgpIDw9IDApIHsKLSAgICAgICAgcmV0dXJuIEwiIjsKLSAgICB9Ci0gICAgaWYobkNvdW50ICsgc3RhcnQgPiBtX2NoYXJMaXN0LkdldFNpemUoKSAtIDEpIHsKLSAgICAgICAgbkNvdW50ID0gbV9jaGFyTGlzdC5HZXRTaXplKCkgLSBzdGFydDsKLSAgICB9Ci0gICAgaWYgKG5Db3VudCA8PSAwKSB7Ci0gICAgICAgIHJldHVybiBMIiI7Ci0gICAgfQotICAgIENoZWNrTWFya2VkQ29udGVudE9iamVjdChzdGFydCwgbkNvdW50KTsKLSAgICBpbnQgc3RhcnRpbmRleCA9IDA7Ci0gICAgUEFHRUNIQVJfSU5GTyBjaGFyaW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChzdGFydCk7Ci0gICAgaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLSAgICB3aGlsZShjaGFyaW5mby5tX0luZGV4ID09IC0xKSB7Ci0gICAgICAgIHN0YXJ0T2Zmc2V0Kys7Ci0gICAgICAgIGlmIChzdGFydE9mZnNldCA+IG5Db3VudCB8fCBzdGFydCArIHN0YXJ0T2Zmc2V0ID49IG1fY2hhckxpc3QuR2V0U2l6ZSgpKQl7Ci0gICAgICAgICAgICByZXR1cm4gTCIiOwotICAgICAgICB9Ci0gICAgICAgIGNoYXJpbmZvID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KHN0YXJ0ICsgc3RhcnRPZmZzZXQpOwotICAgIH0KLSAgICBzdGFydGluZGV4ID0gY2hhcmluZm8ubV9JbmRleDsKLSAgICBjaGFyaW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChzdGFydCArIG5Db3VudCAtIDEpOwotICAgIGludCBuQ291bnRPZmZzZXQgPSAwOwotICAgIHdoaWxlIChjaGFyaW5mby5tX0luZGV4ID09IC0xKSB7Ci0gICAgICAgIG5Db3VudE9mZnNldCsrOwotICAgICAgICBpZiAobkNvdW50T2Zmc2V0ID49IG5Db3VudCkgewotICAgICAgICAgICAgcmV0dXJuIEwiIjsKLSAgICAgICAgfQotICAgICAgICBjaGFyaW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChzdGFydCArIG5Db3VudCAtIG5Db3VudE9mZnNldCAtIDEpOwotICAgIH0KLSAgICBuQ291bnQgPSBzdGFydCArIG5Db3VudCAtIG5Db3VudE9mZnNldCAtIHN0YXJ0aW5kZXg7Ci0gICAgaWYobkNvdW50IDw9IDApIHsKLSAgICAgICAgcmV0dXJuIEwiIjsKLSAgICB9Ci0gICAgcmV0dXJuIG1fVGV4dEJ1Zi5HZXRXaWRlU3RyaW5nKCkuTWlkKHN0YXJ0aW5kZXgsIG5Db3VudCk7Ci19Ci1pbnQgQ1BERl9UZXh0UGFnZTo6Q291bnRSZWN0cyhpbnQgc3RhcnQsIGludCBuQ291bnQpCi17Ci0gICAgaWYobV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKCFtX0lzUGFyc2VyZWQpCXsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAoc3RhcnQgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKG5Db3VudCA9PSAtMSB8fCBuQ291bnQgKyBzdGFydCA+IG1fY2hhckxpc3QuR2V0U2l6ZSgpICkgewotICAgICAgICBuQ291bnQgPSBtX2NoYXJMaXN0LkdldFNpemUoKSAtIHN0YXJ0OwotICAgIH0KLSAgICBtX1NlbFJlY3RzLlJlbW92ZUFsbCgpOwotICAgIEdldFJlY3RBcnJheShzdGFydCwgbkNvdW50LCBtX1NlbFJlY3RzKTsKLSAgICByZXR1cm4gbV9TZWxSZWN0cy5HZXRTaXplKCk7Ci19Ci12b2lkIENQREZfVGV4dFBhZ2U6OkdldFJlY3QoaW50IHJlY3RJbmRleCwgRlhfRkxPQVQmIGxlZnQsIEZYX0ZMT0FUJiB0b3AsIEZYX0ZMT0FUJiByaWdodCwgRlhfRkxPQVQgJmJvdHRvbSkgY29uc3QKLXsKLSAgICBpZihtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIDsKLSAgICB9Ci0gICAgaWYgKCFtX0lzUGFyc2VyZWQgfHwgcmVjdEluZGV4IDwgMCB8fCByZWN0SW5kZXggPj0gbV9TZWxSZWN0cy5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsZWZ0ID0gbV9TZWxSZWN0cy5HZXRBdChyZWN0SW5kZXgpLmxlZnQ7Ci0gICAgdG9wID0gbV9TZWxSZWN0cy5HZXRBdChyZWN0SW5kZXgpLnRvcDsKLSAgICByaWdodCA9IG1fU2VsUmVjdHMuR2V0QXQocmVjdEluZGV4KS5yaWdodDsKLSAgICBib3R0b20gPSBtX1NlbFJlY3RzLkdldEF0KHJlY3RJbmRleCkuYm90dG9tOwotfQotRlhfQk9PTCBDUERGX1RleHRQYWdlOjpHZXRCYXNlbGluZVJvdGF0ZShpbnQgc3RhcnQsIGludCBlbmQsIGludCYgUm90YXRlKQotewotICAgIGlmKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmKGVuZCA9PSBzdGFydCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX0ZMT0FUIGR4LCBkeTsKLSAgICBGUERGX0NIQVJfSU5GTyBpbmZvMSwgaW5mbzI7Ci0gICAgR2V0Q2hhckluZm8oc3RhcnQsIGluZm8xKTsKLSAgICBHZXRDaGFySW5mbyhlbmQsIGluZm8yKTsKLSAgICB3aGlsZShpbmZvMi5tX0NoYXJCb3guV2lkdGgoKSA9PSAwIHx8IGluZm8yLm1fQ2hhckJveC5IZWlnaHQoKSA9PSAwKSB7Ci0gICAgICAgIGVuZC0tOwotICAgICAgICBpZihlbmQgPD0gc3RhcnQpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBHZXRDaGFySW5mbyhlbmQsIGluZm8yKTsKLSAgICB9Ci0gICAgZHggPSAoaW5mbzIubV9PcmlnaW5YIC0gaW5mbzEubV9PcmlnaW5YKTsKLSAgICBkeSA9IChpbmZvMi5tX09yaWdpblkgLSBpbmZvMS5tX09yaWdpblkpOwotICAgIGlmKGR4ID09IDApIHsKLSAgICAgICAgaWYoZHkgPiAwKSB7Ci0gICAgICAgICAgICBSb3RhdGUgPSA5MDsKLSAgICAgICAgfSBlbHNlIGlmIChkeSA8IDApIHsKLSAgICAgICAgICAgIFJvdGF0ZSA9IDI3MDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFJvdGF0ZSA9IDA7Ci0gICAgICAgIH0KKyAgICAgIH0KKyAgICAgIElzQ29udGFpblByZUNoYXIgPSBUUlVFOworICAgICAgSVNBZGRMaW5lRmVlZCA9IEZBTFNFOworICAgICAgaWYgKGNoYXJpbmZvLm1fVW5pY29kZSkgeworICAgICAgICBzdHJUZXh0ICs9IGNoYXJpbmZvLm1fVW5pY29kZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNoYXJpbmZvLm1fVW5pY29kZSA9PSAzMikgeworICAgICAgaWYgKElzQ29udGFpblByZUNoYXIgJiYgY2hhcmluZm8ubV9Vbmljb2RlKSB7CisgICAgICAgIHN0clRleHQgKz0gY2hhcmluZm8ubV9Vbmljb2RlOworICAgICAgICBJc0NvbnRhaW5QcmVDaGFyID0gRkFMU0U7CisgICAgICAgIElTQWRkTGluZUZlZWQgPSBGQUxTRTsKKyAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBmbG9hdCBhID0gRlhTWVNfYXRhbjIoZHksIGR4KTsKLSAgICAgICAgUm90YXRlID0gKGludCkoYSAqIDE4MCAvIEZYX1BJICsgMC41KTsKKyAgICAgIElzQ29udGFpblByZUNoYXIgPSBGQUxTRTsKKyAgICAgIElTQWRkTGluZUZlZWQgPSBUUlVFOwogICAgIH0KLSAgICBpZihSb3RhdGUgPCAwKSB7Ci0gICAgICAgIFJvdGF0ZSA9IC1Sb3RhdGU7Ci0gICAgfSBlbHNlIGlmKFJvdGF0ZSA+IDApIHsKLSAgICAgICAgUm90YXRlID0gMzYwIC0gUm90YXRlOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gc3RyVGV4dDsKIH0KLUZYX0JPT0wJQ1BERl9UZXh0UGFnZTo6R2V0QmFzZWxpbmVSb3RhdGUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCAsIGludCYgUm90YXRlKQotewotICAgIGlmKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Cit2b2lkIENQREZfVGV4dFBhZ2U6OkdldFJlY3RzQXJyYXlCeVJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEFycmF5JiByZXNSZWN0QXJyYXkpIGNvbnN0IHsKKyAgaWYgKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSB8fCAhbV9iSXNQYXJzZWQpCisgICAgcmV0dXJuOworCisgIENGWF9GbG9hdFJlY3QgY3VyUmVjdDsKKyAgRlhfQk9PTCBmbGFnTmV3UmVjdCA9IFRSVUU7CisgIENQREZfVGV4dE9iamVjdCogcEN1ck9iaiA9IE5VTEw7CisgIGludCBuQ291bnQgPSBtX2NoYXJMaXN0LkdldFNpemUoKTsKKyAgaW50IHBvcyA9IDA7CisgIHdoaWxlIChwb3MgPCBuQ291bnQpIHsKKyAgICBQQUdFQ0hBUl9JTkZPIGluZm9fY3VyY2hhciA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChwb3MrKyk7CisgICAgaWYgKGluZm9fY3VyY2hhci5tX0ZsYWcgPT0gRlBERlRFWFRfQ0hBUl9HRU5FUkFURUQpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpbnQgc3RhcnQsIGVuZCwgY291bnQsIG4gPSBDb3VudEJvdW5kZWRTZWdtZW50cyhyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSwgVFJVRSk7Ci0gICAgaWYobiA8IDEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZihuID4gMSkgewotICAgICAgICBHZXRCb3VuZGVkU2VnbWVudChuIC0gMSwgc3RhcnQsIGNvdW50KTsKLSAgICAgICAgZW5kID0gc3RhcnQgKyBjb3VudCAtIDE7Ci0gICAgICAgIEdldEJvdW5kZWRTZWdtZW50KDAsIHN0YXJ0LCBjb3VudCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgR2V0Qm91bmRlZFNlZ21lbnQoMCwgc3RhcnQsIGNvdW50KTsKLSAgICAgICAgZW5kID0gc3RhcnQgKyBjb3VudCAtIDE7Ci0gICAgfQotICAgIHJldHVybiBHZXRCYXNlbGluZVJvdGF0ZShzdGFydCwgZW5kLCBSb3RhdGUpOwotfQotRlhfQk9PTAlDUERGX1RleHRQYWdlOjpHZXRCYXNlbGluZVJvdGF0ZShpbnQgcmVjdEluZGV4LCBpbnQmIFJvdGF0ZSkKLXsKLSAgICBpZihtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoIW1fSXNQYXJzZXJlZCB8fCByZWN0SW5kZXggPCAwIHx8IHJlY3RJbmRleCA+IG1fU2VsUmVjdHMuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByZWN0ID0gbV9TZWxSZWN0cy5HZXRBdChyZWN0SW5kZXgpOwotICAgIHJldHVybiBHZXRCYXNlbGluZVJvdGF0ZShyZWN0ICwgUm90YXRlKTsKLX0KLWludAlDUERGX1RleHRQYWdlOjpDb3VudEJvdW5kZWRTZWdtZW50cyhGWF9GTE9BVCBsZWZ0LCBGWF9GTE9BVCB0b3AsIEZYX0ZMT0FUIHJpZ2h0LCBGWF9GTE9BVCBib3R0b20sIEZYX0JPT0wgYkNvbnRhaW5zICkKLXsKLSAgICBpZihtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBtX1NlZ21lbnQuUmVtb3ZlQWxsKCk7Ci0gICAgaWYgKCFtX0lzUGFyc2VyZWQpCXsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBDRlhfRmxvYXRSZWN0IHJlY3QobGVmdCwgYm90dG9tLCByaWdodCwgdG9wKTsKLSAgICByZWN0Lk5vcm1hbGl6ZSgpOwotICAgIGludCBuQ291bnQgPSBtX2NoYXJMaXN0LkdldFNpemUoKTsKLSAgICBpbnQgcG9zID0gMDsKLSAgICBGUERGX1NFR01FTlQJc2VnbWVudDsKLSAgICBzZWdtZW50Lm1fU3RhcnQgPSAwOwotICAgIHNlZ21lbnQubV9uQ291bnQgPSAwOwotICAgIEZYX0JPT0wJCXNlZ21lbnRTdGF0dXMgPSAwOwotICAgIEZYX0JPT0wJCUlzQ29udGFpblByZUNoYXIgPSBGQUxTRTsKLSAgICB3aGlsZSAocG9zIDwgbkNvdW50KSB7Ci0gICAgICAgIFBBR0VDSEFSX0lORk8gY2hhcmluZm8gPSAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQocG9zKTsKLSAgICAgICAgaWYoYkNvbnRhaW5zICYmIHJlY3QuQ29udGFpbnMoY2hhcmluZm8ubV9DaGFyQm94KSkgewotICAgICAgICAgICAgaWYgKHNlZ21lbnRTdGF0dXMgPT0gMCB8fCBzZWdtZW50U3RhdHVzID09IDIpIHsKLSAgICAgICAgICAgICAgICBzZWdtZW50Lm1fU3RhcnQgPSBwb3M7Ci0gICAgICAgICAgICAgICAgc2VnbWVudC5tX25Db3VudCA9IDE7Ci0gICAgICAgICAgICAgICAgc2VnbWVudFN0YXR1cyA9IDE7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNlZ21lbnRTdGF0dXMgPT0gMSkgewotICAgICAgICAgICAgICAgIHNlZ21lbnQubV9uQ291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIElzQ29udGFpblByZUNoYXIgPSBUUlVFOwotICAgICAgICB9IGVsc2UgaWYgKCFiQ29udGFpbnMgJiYgKElzUmVjdEludGVyc2VjdChyZWN0LCBjaGFyaW5mby5tX0NoYXJCb3gpIHx8IHJlY3QuQ29udGFpbnMoY2hhcmluZm8ubV9PcmlnaW5YLCBjaGFyaW5mby5tX09yaWdpblkpKSkgewotICAgICAgICAgICAgaWYgKHNlZ21lbnRTdGF0dXMgPT0gMCB8fCBzZWdtZW50U3RhdHVzID09IDIpIHsKLSAgICAgICAgICAgICAgICBzZWdtZW50Lm1fU3RhcnQgPSBwb3M7Ci0gICAgICAgICAgICAgICAgc2VnbWVudC5tX25Db3VudCA9IDE7Ci0gICAgICAgICAgICAgICAgc2VnbWVudFN0YXR1cyA9IDE7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNlZ21lbnRTdGF0dXMgPT0gMSkgewotICAgICAgICAgICAgICAgIHNlZ21lbnQubV9uQ291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIElzQ29udGFpblByZUNoYXIgPSBUUlVFOwotICAgICAgICB9IGVsc2UgaWYgKGNoYXJpbmZvLm1fVW5pY29kZSA9PSAzMikgewotICAgICAgICAgICAgaWYgKElzQ29udGFpblByZUNoYXIgPT0gVFJVRSkgewotICAgICAgICAgICAgICAgIGlmIChzZWdtZW50U3RhdHVzID09IDAgfHwgc2VnbWVudFN0YXR1cyA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlZ21lbnQubV9TdGFydCA9IHBvczsKLSAgICAgICAgICAgICAgICAgICAgc2VnbWVudC5tX25Db3VudCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIHNlZ21lbnRTdGF0dXMgPSAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VnbWVudFN0YXR1cyA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlZ21lbnQubV9uQ291bnQrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSXNDb250YWluUHJlQ2hhciA9IEZBTFNFOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VnbWVudFN0YXR1cyA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlZ21lbnRTdGF0dXMgPSAyOwotICAgICAgICAgICAgICAgICAgICBtX1NlZ21lbnQuQWRkKHNlZ21lbnQpOwotICAgICAgICAgICAgICAgICAgICBzZWdtZW50Lm1fU3RhcnQgPSAwOwotICAgICAgICAgICAgICAgICAgICBzZWdtZW50Lm1fbkNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoc2VnbWVudFN0YXR1cyA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgc2VnbWVudFN0YXR1cyA9IDI7Ci0gICAgICAgICAgICAgICAgbV9TZWdtZW50LkFkZChzZWdtZW50KTsKLSAgICAgICAgICAgICAgICBzZWdtZW50Lm1fU3RhcnQgPSAwOwotICAgICAgICAgICAgICAgIHNlZ21lbnQubV9uQ291bnQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSXNDb250YWluUHJlQ2hhciA9IEZBTFNFOworICAgIGlmIChJc1JlY3RJbnRlcnNlY3QocmVjdCwgaW5mb19jdXJjaGFyLm1fQ2hhckJveCkpIHsKKyAgICAgIGlmICghcEN1ck9iaikgeworICAgICAgICBwQ3VyT2JqID0gaW5mb19jdXJjaGFyLm1fcFRleHRPYmo7CisgICAgICB9CisgICAgICBpZiAocEN1ck9iaiAhPSBpbmZvX2N1cmNoYXIubV9wVGV4dE9iaikgeworICAgICAgICByZXNSZWN0QXJyYXkuQWRkKGN1clJlY3QpOworICAgICAgICBwQ3VyT2JqID0gaW5mb19jdXJjaGFyLm1fcFRleHRPYmo7CisgICAgICAgIGZsYWdOZXdSZWN0ID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGlmIChmbGFnTmV3UmVjdCkgeworICAgICAgICBjdXJSZWN0ID0gaW5mb19jdXJjaGFyLm1fQ2hhckJveDsKKyAgICAgICAgZmxhZ05ld1JlY3QgPSBGQUxTRTsKKyAgICAgICAgY3VyUmVjdC5Ob3JtYWxpemUoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZm9fY3VyY2hhci5tX0NoYXJCb3guTm9ybWFsaXplKCk7CisgICAgICAgIGlmIChjdXJSZWN0LmxlZnQgPiBpbmZvX2N1cmNoYXIubV9DaGFyQm94LmxlZnQpIHsKKyAgICAgICAgICBjdXJSZWN0LmxlZnQgPSBpbmZvX2N1cmNoYXIubV9DaGFyQm94LmxlZnQ7CiAgICAgICAgIH0KLSAgICAgICAgcG9zKys7CisgICAgICAgIGlmIChjdXJSZWN0LnJpZ2h0IDwgaW5mb19jdXJjaGFyLm1fQ2hhckJveC5yaWdodCkgeworICAgICAgICAgIGN1clJlY3QucmlnaHQgPSBpbmZvX2N1cmNoYXIubV9DaGFyQm94LnJpZ2h0OworICAgICAgICB9CisgICAgICAgIGlmIChjdXJSZWN0LnRvcCA8IGluZm9fY3VyY2hhci5tX0NoYXJCb3gudG9wKSB7CisgICAgICAgICAgY3VyUmVjdC50b3AgPSBpbmZvX2N1cmNoYXIubV9DaGFyQm94LnRvcDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3VyUmVjdC5ib3R0b20gPiBpbmZvX2N1cmNoYXIubV9DaGFyQm94LmJvdHRvbSkgeworICAgICAgICAgIGN1clJlY3QuYm90dG9tID0gaW5mb19jdXJjaGFyLm1fQ2hhckJveC5ib3R0b207CisgICAgICAgIH0KKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKHNlZ21lbnRTdGF0dXMgPT0gMSkgeworICB9CisgIHJlc1JlY3RBcnJheS5BZGQoY3VyUmVjdCk7CisgIHJldHVybjsKK30KK2ludCBDUERGX1RleHRQYWdlOjpHZXRJbmRleEF0UG9zKEZYX0ZMT0FUIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeFRvbGVyYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHlUb2xlcmFuY2UpIGNvbnN0IHsKKyAgaWYgKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgeworICAgIHJldHVybiAtMzsKKyAgfQorICBDUERGX1BvaW50IHBvaW50KHgsIHkpOworICByZXR1cm4gR2V0SW5kZXhBdFBvcyhwb2ludCwgeFRvbGVyYW5jZSwgeVRvbGVyYW5jZSk7Cit9CisKK3ZvaWQgQ1BERl9UZXh0UGFnZTo6R2V0Q2hhckluZm8oaW50IGluZGV4LCBGUERGX0NIQVJfSU5GTyogaW5mbykgY29uc3QgeworICBpZiAobV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5IHx8ICFtX2JJc1BhcnNlZCkKKyAgICByZXR1cm47CisKKyAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBtX2NoYXJMaXN0LkdldFNpemUoKSkKKyAgICByZXR1cm47CisKKyAgY29uc3QgUEFHRUNIQVJfSU5GTyogY2hhcmluZm8gPQorICAgICAgc3RhdGljX2Nhc3Q8UEFHRUNIQVJfSU5GTyo+KG1fY2hhckxpc3QuR2V0QXQoaW5kZXgpKTsKKyAgaW5mby0+bV9DaGFyY29kZSA9IGNoYXJpbmZvLT5tX0NoYXJDb2RlOworICBpbmZvLT5tX09yaWdpblggPSBjaGFyaW5mby0+bV9PcmlnaW5YOworICBpbmZvLT5tX09yaWdpblkgPSBjaGFyaW5mby0+bV9PcmlnaW5ZOworICBpbmZvLT5tX1VuaWNvZGUgPSBjaGFyaW5mby0+bV9Vbmljb2RlOworICBpbmZvLT5tX0ZsYWcgPSBjaGFyaW5mby0+bV9GbGFnOworICBpbmZvLT5tX0NoYXJCb3ggPSBjaGFyaW5mby0+bV9DaGFyQm94OworICBpbmZvLT5tX3BUZXh0T2JqID0gY2hhcmluZm8tPm1fcFRleHRPYmo7CisgIGlmIChjaGFyaW5mby0+bV9wVGV4dE9iaiAmJiBjaGFyaW5mby0+bV9wVGV4dE9iai0+R2V0Rm9udCgpKSB7CisgICAgaW5mby0+bV9Gb250U2l6ZSA9IGNoYXJpbmZvLT5tX3BUZXh0T2JqLT5HZXRGb250U2l6ZSgpOworICB9IGVsc2UgeworICAgIGluZm8tPm1fRm9udFNpemUgPSBrRGVmYXVsdEZvbnRTaXplOworICB9CisgIGluZm8tPm1fTWF0cml4LkNvcHkoY2hhcmluZm8tPm1fTWF0cml4KTsKK30KKwordm9pZCBDUERGX1RleHRQYWdlOjpDaGVja01hcmtlZENvbnRlbnRPYmplY3QoaW50MzJfdCYgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuQ291bnQpIGNvbnN0IHsKKyAgUEFHRUNIQVJfSU5GTyBjaGFyaW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChzdGFydCk7CisgIFBBR0VDSEFSX0lORk8gY2hhcmluZm8yID0KKyAgICAgICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChzdGFydCArIG5Db3VudCAtIDEpOworICBpZiAoRlBERlRFWFRfQ0hBUl9QSUVDRSAhPSBjaGFyaW5mby5tX0ZsYWcgJiYKKyAgICAgIEZQREZURVhUX0NIQVJfUElFQ0UgIT0gY2hhcmluZm8yLm1fRmxhZykgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoRlBERlRFWFRfQ0hBUl9QSUVDRSA9PSBjaGFyaW5mby5tX0ZsYWcpIHsKKyAgICBQQUdFQ0hBUl9JTkZPIGNoYXJpbmZvMSA9IGNoYXJpbmZvOworICAgIGludCBzdGFydEluZGV4ID0gc3RhcnQ7CisgICAgd2hpbGUgKEZQREZURVhUX0NIQVJfUElFQ0UgPT0gY2hhcmluZm8xLm1fRmxhZyAmJgorICAgICAgICAgICBjaGFyaW5mbzEubV9JbmRleCA9PSBjaGFyaW5mby5tX0luZGV4KSB7CisgICAgICBzdGFydEluZGV4LS07CisgICAgICBpZiAoc3RhcnRJbmRleCA8IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjaGFyaW5mbzEgPSAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQoc3RhcnRJbmRleCk7CisgICAgfQorICAgIHN0YXJ0SW5kZXgrKzsKKyAgICBzdGFydCA9IHN0YXJ0SW5kZXg7CisgIH0KKyAgaWYgKEZQREZURVhUX0NIQVJfUElFQ0UgPT0gY2hhcmluZm8yLm1fRmxhZykgeworICAgIFBBR0VDSEFSX0lORk8gY2hhcmluZm8zID0gY2hhcmluZm8yOworICAgIGludCBlbmRJbmRleCA9IHN0YXJ0ICsgbkNvdW50IC0gMTsKKyAgICB3aGlsZSAoRlBERlRFWFRfQ0hBUl9QSUVDRSA9PSBjaGFyaW5mbzMubV9GbGFnICYmCisgICAgICAgICAgIGNoYXJpbmZvMy5tX0luZGV4ID09IGNoYXJpbmZvMi5tX0luZGV4KSB7CisgICAgICBlbmRJbmRleCsrOworICAgICAgaWYgKGVuZEluZGV4ID49IG1fY2hhckxpc3QuR2V0U2l6ZSgpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2hhcmluZm8zID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KGVuZEluZGV4KTsKKyAgICB9CisgICAgZW5kSW5kZXgtLTsKKyAgICBuQ291bnQgPSBlbmRJbmRleCAtIHN0YXJ0ICsgMTsKKyAgfQorfQorQ0ZYX1dpZGVTdHJpbmcgQ1BERl9UZXh0UGFnZTo6R2V0UGFnZVRleHQoaW50IHN0YXJ0LCBpbnQgbkNvdW50KSBjb25zdCB7CisgIGlmICghbV9iSXNQYXJzZWQgfHwgbkNvdW50ID09IDApCisgICAgcmV0dXJuIEwiIjsKKworICBpZiAoc3RhcnQgPCAwKQorICAgIHN0YXJ0ID0gMDsKKworICBpZiAobkNvdW50ID09IC0xKSB7CisgICAgbkNvdW50ID0gbV9jaGFyTGlzdC5HZXRTaXplKCkgLSBzdGFydDsKKyAgICByZXR1cm4gbV9UZXh0QnVmLkdldFdpZGVTdHJpbmcoKS5NaWQoc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fVGV4dEJ1Zi5HZXRXaWRlU3RyaW5nKCkuR2V0TGVuZ3RoKCkpOworICB9CisgIGlmIChuQ291bnQgPD0gMCB8fCBtX2NoYXJMaXN0LkdldFNpemUoKSA8PSAwKSB7CisgICAgcmV0dXJuIEwiIjsKKyAgfQorICBpZiAobkNvdW50ICsgc3RhcnQgPiBtX2NoYXJMaXN0LkdldFNpemUoKSAtIDEpIHsKKyAgICBuQ291bnQgPSBtX2NoYXJMaXN0LkdldFNpemUoKSAtIHN0YXJ0OworICB9CisgIGlmIChuQ291bnQgPD0gMCkgeworICAgIHJldHVybiBMIiI7CisgIH0KKyAgQ2hlY2tNYXJrZWRDb250ZW50T2JqZWN0KHN0YXJ0LCBuQ291bnQpOworICBpbnQgc3RhcnRpbmRleCA9IDA7CisgIFBBR0VDSEFSX0lORk8gY2hhcmluZm8gPSAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQoc3RhcnQpOworICBpbnQgc3RhcnRPZmZzZXQgPSAwOworICB3aGlsZSAoY2hhcmluZm8ubV9JbmRleCA9PSAtMSkgeworICAgIHN0YXJ0T2Zmc2V0Kys7CisgICAgaWYgKHN0YXJ0T2Zmc2V0ID4gbkNvdW50IHx8IHN0YXJ0ICsgc3RhcnRPZmZzZXQgPj0gbV9jaGFyTGlzdC5HZXRTaXplKCkpIHsKKyAgICAgIHJldHVybiBMIiI7CisgICAgfQorICAgIGNoYXJpbmZvID0gKihQQUdFQ0hBUl9JTkZPKiltX2NoYXJMaXN0LkdldEF0KHN0YXJ0ICsgc3RhcnRPZmZzZXQpOworICB9CisgIHN0YXJ0aW5kZXggPSBjaGFyaW5mby5tX0luZGV4OworICBjaGFyaW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChzdGFydCArIG5Db3VudCAtIDEpOworICBpbnQgbkNvdW50T2Zmc2V0ID0gMDsKKyAgd2hpbGUgKGNoYXJpbmZvLm1fSW5kZXggPT0gLTEpIHsKKyAgICBuQ291bnRPZmZzZXQrKzsKKyAgICBpZiAobkNvdW50T2Zmc2V0ID49IG5Db3VudCkgeworICAgICAgcmV0dXJuIEwiIjsKKyAgICB9CisgICAgY2hhcmluZm8gPQorICAgICAgICAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQoc3RhcnQgKyBuQ291bnQgLSBuQ291bnRPZmZzZXQgLSAxKTsKKyAgfQorICBuQ291bnQgPSBzdGFydCArIG5Db3VudCAtIG5Db3VudE9mZnNldCAtIHN0YXJ0aW5kZXg7CisgIGlmIChuQ291bnQgPD0gMCkgeworICAgIHJldHVybiBMIiI7CisgIH0KKyAgcmV0dXJuIG1fVGV4dEJ1Zi5HZXRXaWRlU3RyaW5nKCkuTWlkKHN0YXJ0aW5kZXgsIG5Db3VudCk7Cit9CitpbnQgQ1BERl9UZXh0UGFnZTo6Q291bnRSZWN0cyhpbnQgc3RhcnQsIGludCBuQ291bnQpIHsKKyAgaWYgKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSB8fCAhbV9iSXNQYXJzZWQgfHwgc3RhcnQgPCAwKQorICAgIHJldHVybiAtMTsKKworICBpZiAobkNvdW50ID09IC0xIHx8IG5Db3VudCArIHN0YXJ0ID4gbV9jaGFyTGlzdC5HZXRTaXplKCkpIHsKKyAgICBuQ291bnQgPSBtX2NoYXJMaXN0LkdldFNpemUoKSAtIHN0YXJ0OworICB9CisgIG1fU2VsUmVjdHMuUmVtb3ZlQWxsKCk7CisgIEdldFJlY3RBcnJheShzdGFydCwgbkNvdW50LCBtX1NlbFJlY3RzKTsKKyAgcmV0dXJuIG1fU2VsUmVjdHMuR2V0U2l6ZSgpOworfQordm9pZCBDUERGX1RleHRQYWdlOjpHZXRSZWN0KGludCByZWN0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGJvdHRvbSkgY29uc3QgeworICBpZiAobV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5IHx8ICFtX2JJc1BhcnNlZCkKKyAgICByZXR1cm47CisKKyAgaWYgKHJlY3RJbmRleCA8IDAgfHwgcmVjdEluZGV4ID49IG1fU2VsUmVjdHMuR2V0U2l6ZSgpKQorICAgIHJldHVybjsKKworICBsZWZ0ID0gbV9TZWxSZWN0cy5HZXRBdChyZWN0SW5kZXgpLmxlZnQ7CisgIHRvcCA9IG1fU2VsUmVjdHMuR2V0QXQocmVjdEluZGV4KS50b3A7CisgIHJpZ2h0ID0gbV9TZWxSZWN0cy5HZXRBdChyZWN0SW5kZXgpLnJpZ2h0OworICBib3R0b20gPSBtX1NlbFJlY3RzLkdldEF0KHJlY3RJbmRleCkuYm90dG9tOworfQorCitGWF9CT09MIENQREZfVGV4dFBhZ2U6OkdldEJhc2VsaW5lUm90YXRlKGludCBzdGFydCwgaW50IGVuZCwgaW50JiBSb3RhdGUpIHsKKyAgaWYgKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoZW5kID09IHN0YXJ0KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZQREZfQ0hBUl9JTkZPIGluZm9fc3RhcnQ7CisgIEZQREZfQ0hBUl9JTkZPIGluZm9fZW5kOworICBHZXRDaGFySW5mbyhzdGFydCwgJmluZm9fc3RhcnQpOworICBHZXRDaGFySW5mbyhlbmQsICZpbmZvX2VuZCk7CisgIHdoaWxlIChpbmZvX2VuZC5tX0NoYXJCb3guV2lkdGgoKSA9PSAwIHx8IGluZm9fZW5kLm1fQ2hhckJveC5IZWlnaHQoKSA9PSAwKSB7CisgICAgaWYgKC0tZW5kIDw9IHN0YXJ0KQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgR2V0Q2hhckluZm8oZW5kLCAmaW5mb19lbmQpOworICB9CisgIEZYX0ZMT0FUIGR4ID0gKGluZm9fZW5kLm1fT3JpZ2luWCAtIGluZm9fc3RhcnQubV9PcmlnaW5YKTsKKyAgRlhfRkxPQVQgZHkgPSAoaW5mb19lbmQubV9PcmlnaW5ZIC0gaW5mb19zdGFydC5tX09yaWdpblkpOworICBpZiAoZHggPT0gMCkgeworICAgIGlmIChkeSA+IDApIHsKKyAgICAgIFJvdGF0ZSA9IDkwOworICAgIH0gZWxzZSBpZiAoZHkgPCAwKSB7CisgICAgICBSb3RhdGUgPSAyNzA7CisgICAgfSBlbHNlIHsKKyAgICAgIFJvdGF0ZSA9IDA7CisgICAgfQorICB9IGVsc2UgeworICAgIGZsb2F0IGEgPSBGWFNZU19hdGFuMihkeSwgZHgpOworICAgIFJvdGF0ZSA9IChpbnQpKGEgKiAxODAgLyBGWF9QSSArIDAuNSk7CisgIH0KKyAgaWYgKFJvdGF0ZSA8IDApIHsKKyAgICBSb3RhdGUgPSAtUm90YXRlOworICB9IGVsc2UgaWYgKFJvdGF0ZSA+IDApIHsKKyAgICBSb3RhdGUgPSAzNjAgLSBSb3RhdGU7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6R2V0QmFzZWxpbmVSb3RhdGUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBSb3RhdGUpIHsKKyAgaWYgKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpbnQgc3RhcnQsIGVuZCwgY291bnQsCisgICAgICBuID0gQ291bnRCb3VuZGVkU2VnbWVudHMocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSk7CisgIGlmIChuIDwgMSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAobiA+IDEpIHsKKyAgICBHZXRCb3VuZGVkU2VnbWVudChuIC0gMSwgc3RhcnQsIGNvdW50KTsKKyAgICBlbmQgPSBzdGFydCArIGNvdW50IC0gMTsKKyAgICBHZXRCb3VuZGVkU2VnbWVudCgwLCBzdGFydCwgY291bnQpOworICB9IGVsc2UgeworICAgIEdldEJvdW5kZWRTZWdtZW50KDAsIHN0YXJ0LCBjb3VudCk7CisgICAgZW5kID0gc3RhcnQgKyBjb3VudCAtIDE7CisgIH0KKyAgcmV0dXJuIEdldEJhc2VsaW5lUm90YXRlKHN0YXJ0LCBlbmQsIFJvdGF0ZSk7Cit9CitGWF9CT09MIENQREZfVGV4dFBhZ2U6OkdldEJhc2VsaW5lUm90YXRlKGludCByZWN0SW5kZXgsIGludCYgUm90YXRlKSB7CisgIGlmIChtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkgfHwgIW1fYklzUGFyc2VkKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAocmVjdEluZGV4IDwgMCB8fCByZWN0SW5kZXggPiBtX1NlbFJlY3RzLkdldFNpemUoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0ID0gbV9TZWxSZWN0cy5HZXRBdChyZWN0SW5kZXgpOworICByZXR1cm4gR2V0QmFzZWxpbmVSb3RhdGUocmVjdCwgUm90YXRlKTsKK30KK2ludCBDUERGX1RleHRQYWdlOjpDb3VudEJvdW5kZWRTZWdtZW50cyhGWF9GTE9BVCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ29udGFpbnMpIHsKKyAgaWYgKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkKKyAgICByZXR1cm4gLTE7CisKKyAgbV9TZWdtZW50LlJlbW92ZUFsbCgpOworICBpZiAoIW1fYklzUGFyc2VkKQorICAgIHJldHVybiAtMTsKKworICBDRlhfRmxvYXRSZWN0IHJlY3QobGVmdCwgYm90dG9tLCByaWdodCwgdG9wKTsKKyAgcmVjdC5Ob3JtYWxpemUoKTsKKyAgaW50IG5Db3VudCA9IG1fY2hhckxpc3QuR2V0U2l6ZSgpOworICBpbnQgcG9zID0gMDsKKyAgRlBERl9TRUdNRU5UIHNlZ21lbnQ7CisgIHNlZ21lbnQubV9TdGFydCA9IDA7CisgIHNlZ21lbnQubV9uQ291bnQgPSAwOworICBpbnQgc2VnbWVudFN0YXR1cyA9IDA7CisgIEZYX0JPT0wgSXNDb250YWluUHJlQ2hhciA9IEZBTFNFOworICB3aGlsZSAocG9zIDwgbkNvdW50KSB7CisgICAgUEFHRUNIQVJfSU5GTyBjaGFyaW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChwb3MpOworICAgIGlmIChiQ29udGFpbnMgJiYgcmVjdC5Db250YWlucyhjaGFyaW5mby5tX0NoYXJCb3gpKSB7CisgICAgICBpZiAoc2VnbWVudFN0YXR1cyA9PSAwIHx8IHNlZ21lbnRTdGF0dXMgPT0gMikgeworICAgICAgICBzZWdtZW50Lm1fU3RhcnQgPSBwb3M7CisgICAgICAgIHNlZ21lbnQubV9uQ291bnQgPSAxOworICAgICAgICBzZWdtZW50U3RhdHVzID0gMTsKKyAgICAgIH0gZWxzZSBpZiAoc2VnbWVudFN0YXR1cyA9PSAxKSB7CisgICAgICAgIHNlZ21lbnQubV9uQ291bnQrKzsKKyAgICAgIH0KKyAgICAgIElzQ29udGFpblByZUNoYXIgPSBUUlVFOworICAgIH0gZWxzZSBpZiAoIWJDb250YWlucyAmJgorICAgICAgICAgICAgICAgKElzUmVjdEludGVyc2VjdChyZWN0LCBjaGFyaW5mby5tX0NoYXJCb3gpIHx8CisgICAgICAgICAgICAgICAgcmVjdC5Db250YWlucyhjaGFyaW5mby5tX09yaWdpblgsIGNoYXJpbmZvLm1fT3JpZ2luWSkpKSB7CisgICAgICBpZiAoc2VnbWVudFN0YXR1cyA9PSAwIHx8IHNlZ21lbnRTdGF0dXMgPT0gMikgeworICAgICAgICBzZWdtZW50Lm1fU3RhcnQgPSBwb3M7CisgICAgICAgIHNlZ21lbnQubV9uQ291bnQgPSAxOworICAgICAgICBzZWdtZW50U3RhdHVzID0gMTsKKyAgICAgIH0gZWxzZSBpZiAoc2VnbWVudFN0YXR1cyA9PSAxKSB7CisgICAgICAgIHNlZ21lbnQubV9uQ291bnQrKzsKKyAgICAgIH0KKyAgICAgIElzQ29udGFpblByZUNoYXIgPSBUUlVFOworICAgIH0gZWxzZSBpZiAoY2hhcmluZm8ubV9Vbmljb2RlID09IDMyKSB7CisgICAgICBpZiAoSXNDb250YWluUHJlQ2hhciA9PSBUUlVFKSB7CisgICAgICAgIGlmIChzZWdtZW50U3RhdHVzID09IDAgfHwgc2VnbWVudFN0YXR1cyA9PSAyKSB7CisgICAgICAgICAgc2VnbWVudC5tX1N0YXJ0ID0gcG9zOworICAgICAgICAgIHNlZ21lbnQubV9uQ291bnQgPSAxOworICAgICAgICAgIHNlZ21lbnRTdGF0dXMgPSAxOworICAgICAgICB9IGVsc2UgaWYgKHNlZ21lbnRTdGF0dXMgPT0gMSkgeworICAgICAgICAgIHNlZ21lbnQubV9uQ291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBJc0NvbnRhaW5QcmVDaGFyID0gRkFMU0U7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoc2VnbWVudFN0YXR1cyA9PSAxKSB7CisgICAgICAgICAgc2VnbWVudFN0YXR1cyA9IDI7CisgICAgICAgICAgbV9TZWdtZW50LkFkZChzZWdtZW50KTsKKyAgICAgICAgICBzZWdtZW50Lm1fU3RhcnQgPSAwOworICAgICAgICAgIHNlZ21lbnQubV9uQ291bnQgPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChzZWdtZW50U3RhdHVzID09IDEpIHsKICAgICAgICAgc2VnbWVudFN0YXR1cyA9IDI7CiAgICAgICAgIG1fU2VnbWVudC5BZGQoc2VnbWVudCk7CiAgICAgICAgIHNlZ21lbnQubV9TdGFydCA9IDA7CiAgICAgICAgIHNlZ21lbnQubV9uQ291bnQgPSAwOworICAgICAgfQorICAgICAgSXNDb250YWluUHJlQ2hhciA9IEZBTFNFOwogICAgIH0KLSAgICByZXR1cm4gbV9TZWdtZW50LkdldFNpemUoKTsKKyAgICBwb3MrKzsKKyAgfQorICBpZiAoc2VnbWVudFN0YXR1cyA9PSAxKSB7CisgICAgc2VnbWVudFN0YXR1cyA9IDI7CisgICAgbV9TZWdtZW50LkFkZChzZWdtZW50KTsKKyAgICBzZWdtZW50Lm1fU3RhcnQgPSAwOworICAgIHNlZ21lbnQubV9uQ291bnQgPSAwOworICB9CisgIHJldHVybiBtX1NlZ21lbnQuR2V0U2l6ZSgpOwogfQotdm9pZCBDUERGX1RleHRQYWdlOjpHZXRCb3VuZGVkU2VnbWVudChpbnQgaW5kZXgsIGludCYgc3RhcnQsIGludCYgY291bnQpIGNvbnN0Ci17Ci0gICAgaWYobV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7Ci0gICAgICAgIHJldHVybiA7Ci0gICAgfQotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbV9TZWdtZW50LkdldFNpemUoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN0YXJ0ID0gbV9TZWdtZW50LkdldEF0KGluZGV4KS5tX1N0YXJ0OwotICAgIGNvdW50ID0gbV9TZWdtZW50LkdldEF0KGluZGV4KS5tX25Db3VudDsKK3ZvaWQgQ1BERl9UZXh0UGFnZTo6R2V0Qm91bmRlZFNlZ21lbnQoaW50IGluZGV4LCBpbnQmIHN0YXJ0LCBpbnQmIGNvdW50KSBjb25zdCB7CisgIGlmIChtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBtX1NlZ21lbnQuR2V0U2l6ZSgpKSB7CisgICAgcmV0dXJuOworICB9CisgIHN0YXJ0ID0gbV9TZWdtZW50LkdldEF0KGluZGV4KS5tX1N0YXJ0OworICBjb3VudCA9IG1fU2VnbWVudC5HZXRBdChpbmRleCkubV9uQ291bnQ7CiB9Ci1pbnQgQ1BERl9UZXh0UGFnZTo6R2V0V29yZEJyZWFrKGludCBpbmRleCwgaW50IGRpcmVjdGlvbikgY29uc3QKLXsKLSAgICBpZihtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAoIW1fSXNQYXJzZXJlZCkJewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChkaXJlY3Rpb24gIT0gRlBERlRFWFRfTEVGVCAmJiBkaXJlY3Rpb24gIT0gRlBERlRFWFRfUklHSFQpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG1fY2hhckxpc3QuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgUEFHRUNIQVJfSU5GTyBjaGFyaW5mbzsKLSAgICBjaGFyaW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChpbmRleCk7Ci0gICAgaWYgKGNoYXJpbmZvLm1fSW5kZXggPT0gLTEgfHwgY2hhcmluZm8ubV9GbGFnID09IEZQREZURVhUX0NIQVJfR0VORVJBVEVEKQl7Ci0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0gICAgaWYgKCFJc0xldHRlcihjaGFyaW5mby5tX1VuaWNvZGUpKSB7Ci0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0gICAgaW50IGJyZWFrUG9zID0gaW5kZXg7Ci0gICAgaWYgKGRpcmVjdGlvbiA9PSBGUERGVEVYVF9MRUZUKSB7Ci0gICAgICAgIHdoaWxlICgtLWJyZWFrUG9zID4gMCkgewotICAgICAgICAgICAgY2hhcmluZm8gPSAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQoYnJlYWtQb3MpOwotICAgICAgICAgICAgaWYgKCFJc0xldHRlcihjaGFyaW5mby5tX1VuaWNvZGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJyZWFrUG9zOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBicmVha1BvczsKLSAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBGUERGVEVYVF9SSUdIVCkgewotICAgICAgICB3aGlsZSAoKyticmVha1BvcyA8IG1fY2hhckxpc3QuR2V0U2l6ZSgpKSB7Ci0gICAgICAgICAgICBjaGFyaW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChicmVha1Bvcyk7Ci0gICAgICAgICAgICBpZiAoIUlzTGV0dGVyKGNoYXJpbmZvLm1fVW5pY29kZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYnJlYWtQb3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJyZWFrUG9zOwotICAgIH0KLSAgICByZXR1cm4gYnJlYWtQb3M7Ci19Ci1GWF9JTlQzMiBDUERGX1RleHRQYWdlOjpGaW5kVGV4dGxpbmVGbG93RGlyZWN0aW9uKCkKLXsKLSAgICBpZiAoIW1fcFBhZ2UpCXsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBjb25zdCBGWF9JTlQzMiBuUGFnZVdpZHRoID0gKEZYX0lOVDMyKSgoQ1BERl9QYWdlKiltX3BQYWdlKS0+R2V0UGFnZVdpZHRoKCk7Ci0gICAgY29uc3QgRlhfSU5UMzIgblBhZ2VIZWlnaHQgPSAoRlhfSU5UMzIpKChDUERGX1BhZ2UqKW1fcFBhZ2UpLT5HZXRQYWdlSGVpZ2h0KCk7Ci0gICAgQ0ZYX0J5dGVBcnJheSBuSG9yaXpvbnRhbE1hc2s7Ci0gICAgaWYgKCFuSG9yaXpvbnRhbE1hc2suU2V0U2l6ZShuUGFnZVdpZHRoKSkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIEZYX0JZVEUqIHBEYXRhSCA9IG5Ib3Jpem9udGFsTWFzay5HZXREYXRhKCk7Ci0gICAgQ0ZYX0J5dGVBcnJheSBuVmVydGljYWxNYXNrOwotICAgIGlmICghblZlcnRpY2FsTWFzay5TZXRTaXplKG5QYWdlSGVpZ2h0KSkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIEZYX0JZVEUqIHBEYXRhViA9IG5WZXJ0aWNhbE1hc2suR2V0RGF0YSgpOwotICAgIEZYX0lOVDMyIGluZGV4ID0gMDsKLSAgICBGWF9GTE9BVCBmTGluZUhlaWdodCA9IDAuMGY7Ci0gICAgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiA9IE5VTEw7Ci0gICAgRlhfUE9TSVRJT04JcG9zID0gTlVMTDsKLSAgICBwb3MgPSBtX3BQYWdlLT5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCk7Ci0gICAgaWYoIXBvcykgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHdoaWxlKHBvcykgewotICAgICAgICBwUGFnZU9iaiA9IG1fcFBhZ2UtPkdldE5leHRPYmplY3QocG9zKTsKLSAgICAgICAgaWYoTlVMTCA9PSBwUGFnZU9iaikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoUERGUEFHRV9URVhUICE9IHBQYWdlT2JqLT5tX1R5cGUpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEZYX0lOVDMyIG1pbkggPSAoRlhfSU5UMzIpcFBhZ2VPYmotPm1fTGVmdCA8IDAgPyAwIDogKEZYX0lOVDMyKXBQYWdlT2JqLT5tX0xlZnQ7Ci0gICAgICAgIEZYX0lOVDMyIG1heEggPSAoRlhfSU5UMzIpcFBhZ2VPYmotPm1fUmlnaHQgPiBuUGFnZVdpZHRoID8gblBhZ2VXaWR0aCA6IChGWF9JTlQzMilwUGFnZU9iai0+bV9SaWdodDsKLSAgICAgICAgRlhfSU5UMzIgbWluViA9IChGWF9JTlQzMilwUGFnZU9iai0+bV9Cb3R0b20gPCAwID8gMCA6IChGWF9JTlQzMilwUGFnZU9iai0+bV9Cb3R0b207Ci0gICAgICAgIEZYX0lOVDMyIG1heFYgPSAoRlhfSU5UMzIpcFBhZ2VPYmotPm1fVG9wID4gblBhZ2VIZWlnaHQgPyBuUGFnZUhlaWdodCA6IChGWF9JTlQzMilwUGFnZU9iai0+bV9Ub3A7Ci0gICAgICAgIGlmIChtaW5IID49IG1heEggfHwgbWluViA+PSBtYXhWKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBGWFNZU19tZW1zZXQ4KHBEYXRhSCArIG1pbkgsIDEsIG1heEggLSBtaW5IKTsKLSAgICAgICAgRlhTWVNfbWVtc2V0OChwRGF0YVYgKyBtaW5WLCAxLCBtYXhWIC0gbWluVik7Ci0gICAgICAgIGlmIChmTGluZUhlaWdodCA8PSAwLjBmKSB7Ci0gICAgICAgICAgICBmTGluZUhlaWdodCA9IHBQYWdlT2JqLT5tX1RvcCAtIHBQYWdlT2JqLT5tX0JvdHRvbTsKLSAgICAgICAgfQotICAgICAgICBwUGFnZU9iaiA9IE5VTEw7Ci0gICAgfQotICAgIEZYX0lOVDMyIG5TdGFydEggPSAwOwotICAgIEZYX0lOVDMyIG5FbmRIID0gMDsKLSAgICBGWF9GTE9BVCBuU3VtSCA9IDAuMGY7Ci0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgblBhZ2VXaWR0aDsgaW5kZXgrKykKLSAgICAgICAgaWYoMSA9PSBuSG9yaXpvbnRhbE1hc2tbaW5kZXhdKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIG5TdGFydEggPSBpbmRleDsKLSAgICBmb3IgKGluZGV4ID0gblBhZ2VXaWR0aDsgaW5kZXggPiAwOyBpbmRleC0tKQotICAgICAgICBpZigxID09IG5Ib3Jpem9udGFsTWFza1tpbmRleCAtIDFdKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIG5FbmRIID0gaW5kZXg7Ci0gICAgZm9yIChpbmRleCA9IG5TdGFydEg7IGluZGV4IDwgbkVuZEg7IGluZGV4KyspIHsKLSAgICAgICAgblN1bUggKz0gbkhvcml6b250YWxNYXNrW2luZGV4XTsKLSAgICB9Ci0gICAgblN1bUggLz0gbkVuZEggLSBuU3RhcnRIOwotICAgIEZYX0lOVDMyIG5TdGFydFYgPSAwOwotICAgIEZYX0lOVDMyIG5FbmRWID0gMDsKLSAgICBGWF9GTE9BVCBuU3VtViA9IDAuMGY7Ci0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgblBhZ2VIZWlnaHQ7IGluZGV4KyspCi0gICAgICAgIGlmKDEgPT0gblZlcnRpY2FsTWFza1tpbmRleF0pIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgblN0YXJ0ViA9IGluZGV4OwotICAgIGZvciAoaW5kZXggPSBuUGFnZUhlaWdodDsgaW5kZXggPiAwOyBpbmRleC0tKQotICAgICAgICBpZigxID09IG5WZXJ0aWNhbE1hc2tbaW5kZXggLSAxXSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICBuRW5kViA9IGluZGV4OwotICAgIGZvciAoaW5kZXggPSBuU3RhcnRWOyBpbmRleCA8IG5FbmRWOyBpbmRleCsrKSB7Ci0gICAgICAgIG5TdW1WICs9IG5WZXJ0aWNhbE1hc2tbaW5kZXhdOwotICAgIH0KLSAgICBuU3VtViAvPSBuRW5kViAtIG5TdGFydFY7Ci0gICAgaWYgKChuRW5kViAtIG5TdGFydFYpIDwgKEZYX0lOVDMyKSgyICogZkxpbmVIZWlnaHQpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoKG5FbmRIIC0gblN0YXJ0SCkgPCAoRlhfSU5UMzIpKDIgKiBmTGluZUhlaWdodCkpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmIChuU3VtSCA+IDAuOGYpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChuU3VtSCAtIG5TdW1WID4gMC4wZikgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKG5TdW1WIC0gblN1bUggPiAwLjBmKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KK2ludCBDUERGX1RleHRQYWdlOjpHZXRXb3JkQnJlYWsoaW50IGluZGV4LCBpbnQgZGlyZWN0aW9uKSBjb25zdCB7CisgIGlmIChtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkgfHwgIW1fYklzUGFyc2VkKQogICAgIHJldHVybiAtMTsKKworICBpZiAoZGlyZWN0aW9uICE9IEZQREZURVhUX0xFRlQgJiYgZGlyZWN0aW9uICE9IEZQREZURVhUX1JJR0hUKQorICAgIHJldHVybiAtMTsKKworICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG1fY2hhckxpc3QuR2V0U2l6ZSgpKQorICAgIHJldHVybiAtMTsKKworICBQQUdFQ0hBUl9JTkZPIGNoYXJpbmZvOworICBjaGFyaW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9jaGFyTGlzdC5HZXRBdChpbmRleCk7CisgIGlmIChjaGFyaW5mby5tX0luZGV4ID09IC0xIHx8IGNoYXJpbmZvLm1fRmxhZyA9PSBGUERGVEVYVF9DSEFSX0dFTkVSQVRFRCkgeworICAgIHJldHVybiBpbmRleDsKKyAgfQorICBpZiAoIUlzTGV0dGVyKGNoYXJpbmZvLm1fVW5pY29kZSkpIHsKKyAgICByZXR1cm4gaW5kZXg7CisgIH0KKyAgaW50IGJyZWFrUG9zID0gaW5kZXg7CisgIGlmIChkaXJlY3Rpb24gPT0gRlBERlRFWFRfTEVGVCkgeworICAgIHdoaWxlICgtLWJyZWFrUG9zID4gMCkgeworICAgICAgY2hhcmluZm8gPSAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQoYnJlYWtQb3MpOworICAgICAgaWYgKCFJc0xldHRlcihjaGFyaW5mby5tX1VuaWNvZGUpKSB7CisgICAgICAgIHJldHVybiBicmVha1BvczsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09IEZQREZURVhUX1JJR0hUKSB7CisgICAgd2hpbGUgKCsrYnJlYWtQb3MgPCBtX2NoYXJMaXN0LkdldFNpemUoKSkgeworICAgICAgY2hhcmluZm8gPSAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQoYnJlYWtQb3MpOworICAgICAgaWYgKCFJc0xldHRlcihjaGFyaW5mby5tX1VuaWNvZGUpKSB7CisgICAgICAgIHJldHVybiBicmVha1BvczsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGJyZWFrUG9zOwogfQotdm9pZCBDUERGX1RleHRQYWdlOjpQcm9jZXNzT2JqZWN0KCkKLXsKLSAgICBDUERGX1BhZ2VPYmplY3QqCXBQYWdlT2JqID0gTlVMTDsKLSAgICBpZiAoIW1fcFBhZ2UpCXsKLSAgICAgICAgcmV0dXJuOworaW50MzJfdCBDUERGX1RleHRQYWdlOjpGaW5kVGV4dGxpbmVGbG93RGlyZWN0aW9uKCkgeworICBpZiAoIW1fcFBhZ2UpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgY29uc3QgaW50MzJfdCBuUGFnZVdpZHRoID0gKGludDMyX3QpKChDUERGX1BhZ2UqKW1fcFBhZ2UpLT5HZXRQYWdlV2lkdGgoKTsKKyAgY29uc3QgaW50MzJfdCBuUGFnZUhlaWdodCA9IChpbnQzMl90KSgoQ1BERl9QYWdlKiltX3BQYWdlKS0+R2V0UGFnZUhlaWdodCgpOworICBDRlhfQnl0ZUFycmF5IG5Ib3Jpem9udGFsTWFzazsKKyAgaWYgKCFuSG9yaXpvbnRhbE1hc2suU2V0U2l6ZShuUGFnZVdpZHRoKSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB1aW50OF90KiBwRGF0YUggPSBuSG9yaXpvbnRhbE1hc2suR2V0RGF0YSgpOworICBDRlhfQnl0ZUFycmF5IG5WZXJ0aWNhbE1hc2s7CisgIGlmICghblZlcnRpY2FsTWFzay5TZXRTaXplKG5QYWdlSGVpZ2h0KSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB1aW50OF90KiBwRGF0YVYgPSBuVmVydGljYWxNYXNrLkdldERhdGEoKTsKKyAgaW50MzJfdCBpbmRleCA9IDA7CisgIEZYX0ZMT0FUIGZMaW5lSGVpZ2h0ID0gMC4wZjsKKyAgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiA9IE5VTEw7CisgIEZYX1BPU0lUSU9OIHBvcyA9IE5VTEw7CisgIHBvcyA9IG1fcFBhZ2UtPkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKTsKKyAgaWYgKCFwb3MpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgd2hpbGUgKHBvcykgeworICAgIHBQYWdlT2JqID0gbV9wUGFnZS0+R2V0TmV4dE9iamVjdChwb3MpOworICAgIGlmIChOVUxMID09IHBQYWdlT2JqKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgRlhfUE9TSVRJT04JcG9zOwotICAgIHBvcyA9IG1fcFBhZ2UtPkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKTsKLSAgICBpZiAoIXBvcykJewotICAgICAgICByZXR1cm47CisgICAgaWYgKFBERlBBR0VfVEVYVCAhPSBwUGFnZU9iai0+bV9UeXBlKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgbV9UZXh0bGluZURpciA9IEZpbmRUZXh0bGluZUZsb3dEaXJlY3Rpb24oKTsKLSAgICBpbnQgbkNvdW50ID0gMDsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIHBQYWdlT2JqID0gbV9wUGFnZS0+R2V0TmV4dE9iamVjdChwb3MpOwotICAgICAgICBpZihwUGFnZU9iaikgewotICAgICAgICAgICAgaWYocFBhZ2VPYmotPm1fVHlwZSA9PSBQREZQQUdFX1RFWFQpIHsKLSAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKLSAgICAgICAgICAgICAgICBQcm9jZXNzVGV4dE9iamVjdCgoQ1BERl9UZXh0T2JqZWN0KilwUGFnZU9iaiwgbWF0cml4LCBwb3MpOwotICAgICAgICAgICAgICAgIG5Db3VudCsrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfRk9STSkgewotICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXggZm9ybU1hdHJpeCgxLCAwLCAwLCAxLCAwLCAwKTsKLSAgICAgICAgICAgICAgICBQcm9jZXNzRm9ybU9iamVjdCgoQ1BERl9Gb3JtT2JqZWN0KilwUGFnZU9iaiwgZm9ybU1hdHJpeCk7Ci0gICAgICAgICAgICB9CisgICAgaW50MzJfdCBtaW5IID0KKyAgICAgICAgKGludDMyX3QpcFBhZ2VPYmotPm1fTGVmdCA8IDAgPyAwIDogKGludDMyX3QpcFBhZ2VPYmotPm1fTGVmdDsKKyAgICBpbnQzMl90IG1heEggPSAoaW50MzJfdClwUGFnZU9iai0+bV9SaWdodCA+IG5QYWdlV2lkdGgKKyAgICAgICAgICAgICAgICAgICAgICAgPyBuUGFnZVdpZHRoCisgICAgICAgICAgICAgICAgICAgICAgIDogKGludDMyX3QpcFBhZ2VPYmotPm1fUmlnaHQ7CisgICAgaW50MzJfdCBtaW5WID0KKyAgICAgICAgKGludDMyX3QpcFBhZ2VPYmotPm1fQm90dG9tIDwgMCA/IDAgOiAoaW50MzJfdClwUGFnZU9iai0+bV9Cb3R0b207CisgICAgaW50MzJfdCBtYXhWID0gKGludDMyX3QpcFBhZ2VPYmotPm1fVG9wID4gblBhZ2VIZWlnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgPyBuUGFnZUhlaWdodAorICAgICAgICAgICAgICAgICAgICAgICA6IChpbnQzMl90KXBQYWdlT2JqLT5tX1RvcDsKKyAgICBpZiAobWluSCA+PSBtYXhIIHx8IG1pblYgPj0gbWF4VikgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIEZYU1lTX21lbXNldChwRGF0YUggKyBtaW5ILCAxLCBtYXhIIC0gbWluSCk7CisgICAgRlhTWVNfbWVtc2V0KHBEYXRhViArIG1pblYsIDEsIG1heFYgLSBtaW5WKTsKKyAgICBpZiAoZkxpbmVIZWlnaHQgPD0gMC4wZikgeworICAgICAgZkxpbmVIZWlnaHQgPSBwUGFnZU9iai0+bV9Ub3AgLSBwUGFnZU9iai0+bV9Cb3R0b207CisgICAgfQorICAgIHBQYWdlT2JqID0gTlVMTDsKKyAgfQorICBpbnQzMl90IG5TdGFydEggPSAwOworICBpbnQzMl90IG5FbmRIID0gMDsKKyAgRlhfRkxPQVQgblN1bUggPSAwLjBmOworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBuUGFnZVdpZHRoOyBpbmRleCsrKQorICAgIGlmICgxID09IG5Ib3Jpem9udGFsTWFza1tpbmRleF0pIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgblN0YXJ0SCA9IGluZGV4OworICBmb3IgKGluZGV4ID0gblBhZ2VXaWR0aDsgaW5kZXggPiAwOyBpbmRleC0tKQorICAgIGlmICgxID09IG5Ib3Jpem9udGFsTWFza1tpbmRleCAtIDFdKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIG5FbmRIID0gaW5kZXg7CisgIGZvciAoaW5kZXggPSBuU3RhcnRIOyBpbmRleCA8IG5FbmRIOyBpbmRleCsrKSB7CisgICAgblN1bUggKz0gbkhvcml6b250YWxNYXNrW2luZGV4XTsKKyAgfQorICBuU3VtSCAvPSBuRW5kSCAtIG5TdGFydEg7CisgIGludDMyX3QgblN0YXJ0ViA9IDA7CisgIGludDMyX3QgbkVuZFYgPSAwOworICBGWF9GTE9BVCBuU3VtViA9IDAuMGY7CisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG5QYWdlSGVpZ2h0OyBpbmRleCsrKQorICAgIGlmICgxID09IG5WZXJ0aWNhbE1hc2tbaW5kZXhdKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIG5TdGFydFYgPSBpbmRleDsKKyAgZm9yIChpbmRleCA9IG5QYWdlSGVpZ2h0OyBpbmRleCA+IDA7IGluZGV4LS0pCisgICAgaWYgKDEgPT0gblZlcnRpY2FsTWFza1tpbmRleCAtIDFdKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIG5FbmRWID0gaW5kZXg7CisgIGZvciAoaW5kZXggPSBuU3RhcnRWOyBpbmRleCA8IG5FbmRWOyBpbmRleCsrKSB7CisgICAgblN1bVYgKz0gblZlcnRpY2FsTWFza1tpbmRleF07CisgIH0KKyAgblN1bVYgLz0gbkVuZFYgLSBuU3RhcnRWOworICBpZiAoKG5FbmRWIC0gblN0YXJ0VikgPCAoaW50MzJfdCkoMiAqIGZMaW5lSGVpZ2h0KSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmICgobkVuZEggLSBuU3RhcnRIKSA8IChpbnQzMl90KSgyICogZkxpbmVIZWlnaHQpKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKG5TdW1IID4gMC44ZikgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChuU3VtSCAtIG5TdW1WID4gMC4wZikgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChuU3VtViAtIG5TdW1IID4gMC4wZikgeworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAtMTsKK30KK3ZvaWQgQ1BERl9UZXh0UGFnZTo6UHJvY2Vzc09iamVjdCgpIHsKKyAgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiA9IE5VTEw7CisgIGlmICghbV9wUGFnZSkgeworICAgIHJldHVybjsKKyAgfQorICBGWF9QT1NJVElPTiBwb3M7CisgIHBvcyA9IG1fcFBhZ2UtPkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKTsKKyAgaWYgKCFwb3MpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9UZXh0bGluZURpciA9IEZpbmRUZXh0bGluZUZsb3dEaXJlY3Rpb24oKTsKKyAgaW50IG5Db3VudCA9IDA7CisgIHdoaWxlIChwb3MpIHsKKyAgICBwUGFnZU9iaiA9IG1fcFBhZ2UtPkdldE5leHRPYmplY3QocG9zKTsKKyAgICBpZiAocFBhZ2VPYmopIHsKKyAgICAgIGlmIChwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfVEVYVCkgeworICAgICAgICBDRlhfTWF0cml4IG1hdHJpeDsKKyAgICAgICAgUHJvY2Vzc1RleHRPYmplY3QoKENQREZfVGV4dE9iamVjdCopcFBhZ2VPYmosIG1hdHJpeCwgcG9zKTsKKyAgICAgICAgbkNvdW50Kys7CisgICAgICB9IGVsc2UgaWYgKHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9GT1JNKSB7CisgICAgICAgIENGWF9NYXRyaXggZm9ybU1hdHJpeCgxLCAwLCAwLCAxLCAwLCAwKTsKKyAgICAgICAgUHJvY2Vzc0Zvcm1PYmplY3QoKENQREZfRm9ybU9iamVjdCopcFBhZ2VPYmosIGZvcm1NYXRyaXgpOworICAgICAgfQorICAgIH0KKyAgICBwUGFnZU9iaiA9IE5VTEw7CisgIH0KKyAgaW50IGNvdW50ID0gbV9MaW5lT2JqLkdldFNpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgUHJvY2Vzc1RleHRPYmplY3QobV9MaW5lT2JqLkdldEF0KGkpKTsKKyAgfQorICBtX0xpbmVPYmouUmVtb3ZlQWxsKCk7CisgIENsb3NlVGVtcExpbmUoKTsKK30KK3ZvaWQgQ1BERl9UZXh0UGFnZTo6UHJvY2Vzc0Zvcm1PYmplY3QoQ1BERl9Gb3JtT2JqZWN0KiBwRm9ybU9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgZm9ybU1hdHJpeCkgeworICBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqID0gTlVMTDsKKyAgRlhfUE9TSVRJT04gcG9zOworICBpZiAoIXBGb3JtT2JqKSB7CisgICAgcmV0dXJuOworICB9CisgIHBvcyA9IHBGb3JtT2JqLT5tX3BGb3JtLT5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCk7CisgIGlmICghcG9zKSB7CisgICAgcmV0dXJuOworICB9CisgIENGWF9NYXRyaXggY3VyRm9ybU1hdHJpeDsKKyAgY3VyRm9ybU1hdHJpeC5Db3B5KHBGb3JtT2JqLT5tX0Zvcm1NYXRyaXgpOworICBjdXJGb3JtTWF0cml4LkNvbmNhdChmb3JtTWF0cml4KTsKKyAgd2hpbGUgKHBvcykgeworICAgIHBQYWdlT2JqID0gcEZvcm1PYmotPm1fcEZvcm0tPkdldE5leHRPYmplY3QocG9zKTsKKyAgICBpZiAocFBhZ2VPYmopIHsKKyAgICAgIGlmIChwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfVEVYVCkgeworICAgICAgICBQcm9jZXNzVGV4dE9iamVjdCgoQ1BERl9UZXh0T2JqZWN0KilwUGFnZU9iaiwgY3VyRm9ybU1hdHJpeCwgcG9zKTsKKyAgICAgIH0gZWxzZSBpZiAocFBhZ2VPYmotPm1fVHlwZSA9PSBQREZQQUdFX0ZPUk0pIHsKKyAgICAgICAgUHJvY2Vzc0Zvcm1PYmplY3QoKENQREZfRm9ybU9iamVjdCopcFBhZ2VPYmosIGN1ckZvcm1NYXRyaXgpOworICAgICAgfQorICAgIH0KKyAgICBwUGFnZU9iaiA9IE5VTEw7CisgIH0KK30KK2ludCBDUERGX1RleHRQYWdlOjpHZXRDaGFyV2lkdGgoRlhfRFdPUkQgY2hhckNvZGUsIENQREZfRm9udCogcEZvbnQpIGNvbnN0IHsKKyAgaWYgKGNoYXJDb2RlID09IC0xKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaW50IHcgPSBwRm9udC0+R2V0Q2hhcldpZHRoRihjaGFyQ29kZSk7CisgIGlmICh3ID09IDApIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBzdHI7CisgICAgcEZvbnQtPkFwcGVuZENoYXIoc3RyLCBjaGFyQ29kZSk7CisgICAgdyA9IHBGb250LT5HZXRTdHJpbmdXaWR0aChzdHIsIDEpOworICAgIGlmICh3ID09IDApIHsKKyAgICAgIEZYX1JFQ1QgQkJveDsKKyAgICAgIHBGb250LT5HZXRDaGFyQkJveChjaGFyQ29kZSwgQkJveCk7CisgICAgICB3ID0gQkJveC5yaWdodCAtIEJCb3gubGVmdDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHc7Cit9Cit2b2lkIENQREZfVGV4dFBhZ2U6Ok9uUGllY2UoQ0ZYX0JpZGlDaGFyKiBwQmlkaSwgQ0ZYX1dpZGVTdHJpbmcmIHN0cikgeworICBpbnQzMl90IHN0YXJ0LCBjb3VudDsKKyAgQ0ZYX0JpZGlDaGFyOjpEaXJlY3Rpb24gcmV0ID0gcEJpZGktPkdldEJpZGlJbmZvKCZzdGFydCwgJmNvdW50KTsKKyAgaWYgKHJldCA9PSBDRlhfQmlkaUNoYXI6OlJJR0hUKSB7CisgICAgZm9yIChpbnQgaSA9IHN0YXJ0ICsgY291bnQgLSAxOyBpID49IHN0YXJ0OyBpLS0pIHsKKyAgICAgIG1fVGV4dEJ1Zi5BcHBlbmRDaGFyKHN0ci5HZXRBdChpKSk7CisgICAgICBtX2NoYXJMaXN0LkFkZCgqKFBBR0VDSEFSX0lORk8qKW1fVGVtcENoYXJMaXN0LkdldEF0KGkpKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW50IGVuZCA9IHN0YXJ0ICsgY291bnQ7CisgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKKyAgICAgIG1fVGV4dEJ1Zi5BcHBlbmRDaGFyKHN0ci5HZXRBdChpKSk7CisgICAgICBtX2NoYXJMaXN0LkFkZCgqKFBBR0VDSEFSX0lORk8qKW1fVGVtcENoYXJMaXN0LkdldEF0KGkpKTsKKyAgICB9CisgIH0KK30KK3ZvaWQgQ1BERl9UZXh0UGFnZTo6QWRkQ2hhckluZm9CeUxSRGlyZWN0aW9uKENGWF9XaWRlU3RyaW5nJiBzdHIsIGludCBpKSB7CisgIFBBR0VDSEFSX0lORk8gSW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9UZW1wQ2hhckxpc3QuR2V0QXQoaSk7CisgIEZYX1dDSEFSIHdDaGFyID0gc3RyLkdldEF0KGkpOworICBpZiAoIUlzQ29udHJvbENoYXIoSW5mbykpIHsKKyAgICBJbmZvLm1fSW5kZXggPSBtX1RleHRCdWYuR2V0TGVuZ3RoKCk7CisgICAgaWYgKHdDaGFyID49IDB4RkIwMCAmJiB3Q2hhciA8PSAweEZCMDYpIHsKKyAgICAgIEZYX1dDSEFSKiBwRHN0ID0gTlVMTDsKKyAgICAgIEZYX1NUUlNJWkUgbkNvdW50ID0gRlhfVW5pY29kZV9HZXROb3JtYWxpemF0aW9uKHdDaGFyLCBwRHN0KTsKKyAgICAgIGlmIChuQ291bnQgPj0gMSkgeworICAgICAgICBwRHN0ID0gRlhfQWxsb2MoRlhfV0NIQVIsIG5Db3VudCk7CisgICAgICAgIEZYX1VuaWNvZGVfR2V0Tm9ybWFsaXphdGlvbih3Q2hhciwgcERzdCk7CisgICAgICAgIGZvciAoaW50IG5JbmRleCA9IDA7IG5JbmRleCA8IG5Db3VudDsgbkluZGV4KyspIHsKKyAgICAgICAgICBQQUdFQ0hBUl9JTkZPIEluZm8yID0gSW5mbzsKKyAgICAgICAgICBJbmZvMi5tX1VuaWNvZGUgPSBwRHN0W25JbmRleF07CisgICAgICAgICAgSW5mbzIubV9GbGFnID0gRlBERlRFWFRfQ0hBUl9QSUVDRTsKKyAgICAgICAgICBtX1RleHRCdWYuQXBwZW5kQ2hhcihJbmZvMi5tX1VuaWNvZGUpOworICAgICAgICAgIGlmICghbV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7CisgICAgICAgICAgICBtX2NoYXJMaXN0LkFkZChJbmZvMik7CisgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHBQYWdlT2JqID0gTlVMTDsKKyAgICAgICAgRlhfRnJlZShwRHN0KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQogICAgIH0KLSAgICBpbnQgY291bnQgPSBtX0xpbmVPYmouR2V0U2l6ZSgpOwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIFByb2Nlc3NUZXh0T2JqZWN0KG1fTGluZU9iai5HZXRBdChpKSk7CisgICAgbV9UZXh0QnVmLkFwcGVuZENoYXIod0NoYXIpOworICB9IGVsc2UgeworICAgIEluZm8ubV9JbmRleCA9IC0xOworICB9CisgIGlmICghbV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7CisgICAgbV9jaGFyTGlzdC5BZGQoSW5mbyk7CisgIH0KK30KK3ZvaWQgQ1BERl9UZXh0UGFnZTo6QWRkQ2hhckluZm9CeVJMRGlyZWN0aW9uKENGWF9XaWRlU3RyaW5nJiBzdHIsIGludCBpKSB7CisgIFBBR0VDSEFSX0lORk8gSW5mbyA9ICooUEFHRUNIQVJfSU5GTyopbV9UZW1wQ2hhckxpc3QuR2V0QXQoaSk7CisgIGlmICghSXNDb250cm9sQ2hhcihJbmZvKSkgeworICAgIEluZm8ubV9JbmRleCA9IG1fVGV4dEJ1Zi5HZXRMZW5ndGgoKTsKKyAgICBGWF9XQ0hBUiB3Q2hhciA9IEZYX0dldE1pcnJvckNoYXIoc3RyLkdldEF0KGkpLCBUUlVFLCBGQUxTRSk7CisgICAgRlhfV0NIQVIqIHBEc3QgPSBOVUxMOworICAgIEZYX1NUUlNJWkUgbkNvdW50ID0gRlhfVW5pY29kZV9HZXROb3JtYWxpemF0aW9uKHdDaGFyLCBwRHN0KTsKKyAgICBpZiAobkNvdW50ID49IDEpIHsKKyAgICAgIHBEc3QgPSBGWF9BbGxvYyhGWF9XQ0hBUiwgbkNvdW50KTsKKyAgICAgIEZYX1VuaWNvZGVfR2V0Tm9ybWFsaXphdGlvbih3Q2hhciwgcERzdCk7CisgICAgICBmb3IgKGludCBuSW5kZXggPSAwOyBuSW5kZXggPCBuQ291bnQ7IG5JbmRleCsrKSB7CisgICAgICAgIFBBR0VDSEFSX0lORk8gSW5mbzIgPSBJbmZvOworICAgICAgICBJbmZvMi5tX1VuaWNvZGUgPSBwRHN0W25JbmRleF07CisgICAgICAgIEluZm8yLm1fRmxhZyA9IEZQREZURVhUX0NIQVJfUElFQ0U7CisgICAgICAgIG1fVGV4dEJ1Zi5BcHBlbmRDaGFyKEluZm8yLm1fVW5pY29kZSk7CisgICAgICAgIGlmICghbV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7CisgICAgICAgICAgbV9jaGFyTGlzdC5BZGQoSW5mbzIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBGWF9GcmVlKHBEc3QpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBJbmZvLm1fVW5pY29kZSA9IHdDaGFyOworICAgIG1fVGV4dEJ1Zi5BcHBlbmRDaGFyKEluZm8ubV9Vbmljb2RlKTsKKyAgfSBlbHNlIHsKKyAgICBJbmZvLm1fSW5kZXggPSAtMTsKKyAgfQorICBpZiAoIW1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgeworICAgIG1fY2hhckxpc3QuQWRkKEluZm8pOworICB9Cit9Cit2b2lkIENQREZfVGV4dFBhZ2U6OkNsb3NlVGVtcExpbmUoKSB7CisgIGludCBjb3VudDEgPSBtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCk7CisgIGlmIChjb3VudDEgPD0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0JpZGlDaGFyPiBwQmlkaUNoYXIobmV3IENGWF9CaWRpQ2hhcik7CisgIENGWF9XaWRlU3RyaW5nIHN0ciA9IG1fVGVtcFRleHRCdWYuR2V0V2lkZVN0cmluZygpOworICBDRlhfV29yZEFycmF5IG9yZGVyOworICBGWF9CT09MIGJSMkwgPSBGQUxTRTsKKyAgaW50MzJfdCBzdGFydCA9IDAsIGNvdW50ID0gMDsKKyAgaW50IG5SMkwgPSAwLCBuTDJSID0gMDsKKyAgRlhfQk9PTCBiUHJldlNwYWNlID0gRkFMU0U7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLkdldExlbmd0aCgpOyBpKyspIHsKKyAgICBpZiAoc3RyLkdldEF0KGkpID09IDMyKSB7CisgICAgICBpZiAoYlByZXZTcGFjZSkgeworICAgICAgICBtX1RlbXBUZXh0QnVmLkRlbGV0ZShpLCAxKTsKKyAgICAgICAgbV9UZW1wQ2hhckxpc3QuRGVsZXRlKGkpOworICAgICAgICBzdHIuRGVsZXRlKGkpOworICAgICAgICBjb3VudDEtLTsKKyAgICAgICAgaS0tOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGJQcmV2U3BhY2UgPSBUUlVFOworICAgIH0gZWxzZSB7CisgICAgICBiUHJldlNwYWNlID0gRkFMU0U7CisgICAgfQorICAgIGlmIChwQmlkaUNoYXItPkFwcGVuZENoYXIoc3RyLkdldEF0KGkpKSkgeworICAgICAgQ0ZYX0JpZGlDaGFyOjpEaXJlY3Rpb24gcmV0ID0gcEJpZGlDaGFyLT5HZXRCaWRpSW5mbygmc3RhcnQsICZjb3VudCk7CisgICAgICBvcmRlci5BZGQoc3RhcnQpOworICAgICAgb3JkZXIuQWRkKGNvdW50KTsKKyAgICAgIG9yZGVyLkFkZChyZXQpOworICAgICAgaWYgKCFiUjJMKSB7CisgICAgICAgIGlmIChyZXQgPT0gQ0ZYX0JpZGlDaGFyOjpSSUdIVCkgeworICAgICAgICAgIG5SMkwrKzsKKyAgICAgICAgfSBlbHNlIGlmIChyZXQgPT0gQ0ZYX0JpZGlDaGFyOjpMRUZUKSB7CisgICAgICAgICAgbkwyUisrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChwQmlkaUNoYXItPkVuZENoYXIoKSkgeworICAgIENGWF9CaWRpQ2hhcjo6RGlyZWN0aW9uIHJldCA9IHBCaWRpQ2hhci0+R2V0QmlkaUluZm8oJnN0YXJ0LCAmY291bnQpOworICAgIG9yZGVyLkFkZChzdGFydCk7CisgICAgb3JkZXIuQWRkKGNvdW50KTsKKyAgICBvcmRlci5BZGQocmV0KTsKKyAgICBpZiAoIWJSMkwpIHsKKyAgICAgIGlmIChyZXQgPT0gQ0ZYX0JpZGlDaGFyOjpSSUdIVCkgeworICAgICAgICBuUjJMKys7CisgICAgICB9IGVsc2UgaWYgKHJldCA9PSBDRlhfQmlkaUNoYXI6OkxFRlQpIHsKKyAgICAgICAgbkwyUisrOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoblIyTCA+IDAgJiYgblIyTCA+PSBuTDJSKSB7CisgICAgYlIyTCA9IFRSVUU7CisgIH0KKyAgaWYgKG1fcGFyc2VyZmxhZyA9PSBGUERGVEVYVF9STFRCIHx8IGJSMkwpIHsKKyAgICBpbnQgY291bnQgPSBvcmRlci5HZXRTaXplKCk7CisgICAgZm9yIChpbnQgaSA9IGNvdW50IC0gMTsgaSA+IDA7IGkgLT0gMykgeworICAgICAgaW50IHJldCA9IG9yZGVyLkdldEF0KGkpOworICAgICAgaW50IHN0YXJ0ID0gb3JkZXIuR2V0QXQoaSAtIDIpOworICAgICAgaW50IGNvdW50MSA9IG9yZGVyLkdldEF0KGkgLSAxKTsKKyAgICAgIGlmIChyZXQgPT0gMiB8fCByZXQgPT0gMCkgeworICAgICAgICBmb3IgKGludCBqID0gc3RhcnQgKyBjb3VudDEgLSAxOyBqID49IHN0YXJ0OyBqLS0pIHsKKyAgICAgICAgICBBZGRDaGFySW5mb0J5UkxEaXJlY3Rpb24oc3RyLCBqKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGogPSBpOworICAgICAgICBGWF9CT09MIGJTeW1ib2wgPSBGQUxTRTsKKyAgICAgICAgd2hpbGUgKGogPiAwICYmIG9yZGVyLkdldEF0KGopICE9IDIpIHsKKyAgICAgICAgICBiU3ltYm9sID0gIW9yZGVyLkdldEF0KGopOworICAgICAgICAgIGogLT0gMzsKKyAgICAgICAgfQorICAgICAgICBpbnQgZW5kID0gc3RhcnQgKyBjb3VudDE7CisgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgaWYgKGJTeW1ib2wpIHsKKyAgICAgICAgICBuID0gaiArIDY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbiA9IGogKyAzOworICAgICAgICB9CisgICAgICAgIGlmIChuID49IGkpIHsKKyAgICAgICAgICBmb3IgKGludCBtID0gc3RhcnQ7IG0gPCBlbmQ7IG0rKykgeworICAgICAgICAgICAgQWRkQ2hhckluZm9CeUxSRGlyZWN0aW9uKHN0ciwgbSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGogPSBpOworICAgICAgICAgIGkgPSBuOworICAgICAgICAgIGZvciAoOyBuIDw9IGo7IG4gKz0gMykgeworICAgICAgICAgICAgaW50IHN0YXJ0ID0gb3JkZXIuR2V0QXQobiAtIDIpOworICAgICAgICAgICAgaW50IGNvdW50MSA9IG9yZGVyLkdldEF0KG4gLSAxKTsKKyAgICAgICAgICAgIGludCBlbmQgPSBzdGFydCArIGNvdW50MTsKKyAgICAgICAgICAgIGZvciAoaW50IG0gPSBzdGFydDsgbSA8IGVuZDsgbSsrKSB7CisgICAgICAgICAgICAgIEFkZENoYXJJbmZvQnlMUkRpcmVjdGlvbihzdHIsIG0pOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbnQgY291bnQgPSBvcmRlci5HZXRTaXplKCk7CisgICAgRlhfQk9PTCBiTDJSID0gRkFMU0U7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArPSAzKSB7CisgICAgICBpbnQgcmV0ID0gb3JkZXIuR2V0QXQoaSArIDIpOworICAgICAgaW50IHN0YXJ0ID0gb3JkZXIuR2V0QXQoaSk7CisgICAgICBpbnQgY291bnQxID0gb3JkZXIuR2V0QXQoaSArIDEpOworICAgICAgaWYgKHJldCA9PSAyIHx8IChpID09IDAgJiYgcmV0ID09IDAgJiYgIWJMMlIpKSB7CisgICAgICAgIGludCBqID0gaSArIDM7CisgICAgICAgIHdoaWxlIChiUjJMICYmIGogPCBjb3VudCkgeworICAgICAgICAgIGlmIChvcmRlci5HZXRBdChqICsgMikgPT0gMSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGogKz0gMzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGogPT0gMykgeworICAgICAgICAgIGkgPSAtMzsKKyAgICAgICAgICBiTDJSID0gVFJVRTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbnQgZW5kID0gbV9UZW1wQ2hhckxpc3QuR2V0U2l6ZSgpIC0gMTsKKyAgICAgICAgaWYgKGogPCBjb3VudCkgeworICAgICAgICAgIGVuZCA9IG9yZGVyLkdldEF0KGopIC0gMTsKKyAgICAgICAgfQorICAgICAgICBpID0gaiAtIDM7CisgICAgICAgIGZvciAoaW50IG4gPSBlbmQ7IG4gPj0gc3RhcnQ7IG4tLSkgeworICAgICAgICAgIEFkZENoYXJJbmZvQnlSTERpcmVjdGlvbihzdHIsIG4pOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgZW5kID0gc3RhcnQgKyBjb3VudDE7CisgICAgICAgIGZvciAoaW50IG4gPSBzdGFydDsgbiA8IGVuZDsgbisrKSB7CisgICAgICAgICAgQWRkQ2hhckluZm9CeUxSRGlyZWN0aW9uKHN0ciwgbik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgb3JkZXIuUmVtb3ZlQWxsKCk7CisgIG1fVGVtcENoYXJMaXN0LlJlbW92ZUFsbCgpOworICBtX1RlbXBUZXh0QnVmLkRlbGV0ZSgwLCBtX1RlbXBUZXh0QnVmLkdldExlbmd0aCgpKTsKK30KK3ZvaWQgQ1BERl9UZXh0UGFnZTo6UHJvY2Vzc1RleHRPYmplY3QoQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgZm9ybU1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfUE9TSVRJT04gT2JqUG9zKSB7CisgIENGWF9GbG9hdFJlY3QgcmUocFRleHRPYmotPm1fTGVmdCwgcFRleHRPYmotPm1fQm90dG9tLCBwVGV4dE9iai0+bV9SaWdodCwKKyAgICAgICAgICAgICAgICAgICBwVGV4dE9iai0+bV9Ub3ApOworICBpZiAoRlhTWVNfZmFicyhwVGV4dE9iai0+bV9SaWdodCAtIHBUZXh0T2JqLT5tX0xlZnQpIDwgMC4wMWYpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IGNvdW50ID0gbV9MaW5lT2JqLkdldFNpemUoKTsKKyAgUERGVEVYVF9PYmogT2JqOworICBPYmoubV9wVGV4dE9iaiA9IHBUZXh0T2JqOworICBPYmoubV9mb3JtTWF0cml4ID0gZm9ybU1hdHJpeDsKKyAgaWYgKGNvdW50ID09IDApIHsKKyAgICBtX0xpbmVPYmouQWRkKE9iaik7CisgICAgcmV0dXJuOworICB9CisgIGlmIChJc1NhbWVBc1ByZVRleHRPYmplY3QocFRleHRPYmosIE9ialBvcykpIHsKKyAgICByZXR1cm47CisgIH0KKyAgUERGVEVYVF9PYmogcHJldl9PYmogPSBtX0xpbmVPYmouR2V0QXQoY291bnQgLSAxKTsKKyAgQ1BERl9UZXh0T2JqZWN0SXRlbSBpdGVtOworICBpbnQgbkl0ZW0gPSBwcmV2X09iai5tX3BUZXh0T2JqLT5Db3VudEl0ZW1zKCk7CisgIHByZXZfT2JqLm1fcFRleHRPYmotPkdldEl0ZW1JbmZvKG5JdGVtIC0gMSwgJml0ZW0pOworICBGWF9GTE9BVCBwcmV2X3dpZHRoID0KKyAgICAgIEdldENoYXJXaWR0aChpdGVtLm1fQ2hhckNvZGUsIHByZXZfT2JqLm1fcFRleHRPYmotPkdldEZvbnQoKSkgKgorICAgICAgcHJldl9PYmoubV9wVGV4dE9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDA7CisgIENGWF9NYXRyaXggcHJldl9tYXRyaXg7CisgIHByZXZfT2JqLm1fcFRleHRPYmotPkdldFRleHRNYXRyaXgoJnByZXZfbWF0cml4KTsKKyAgcHJldl93aWR0aCA9IEZYU1lTX2ZhYnMocHJldl93aWR0aCk7CisgIHByZXZfbWF0cml4LkNvbmNhdChwcmV2X09iai5tX2Zvcm1NYXRyaXgpOworICBwcmV2X3dpZHRoID0gcHJldl9tYXRyaXguVHJhbnNmb3JtRGlzdGFuY2UocHJldl93aWR0aCk7CisgIHBUZXh0T2JqLT5HZXRJdGVtSW5mbygwLCAmaXRlbSk7CisgIEZYX0ZMT0FUIHRoaXNfd2lkdGggPSBHZXRDaGFyV2lkdGgoaXRlbS5tX0NoYXJDb2RlLCBwVGV4dE9iai0+R2V0Rm9udCgpKSAqCisgICAgICAgICAgICAgICAgICAgICAgICBwVGV4dE9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDA7CisgIHRoaXNfd2lkdGggPSBGWFNZU19mYWJzKHRoaXNfd2lkdGgpOworICBDRlhfTWF0cml4IHRoaXNfbWF0cml4OworICBwVGV4dE9iai0+R2V0VGV4dE1hdHJpeCgmdGhpc19tYXRyaXgpOworICB0aGlzX3dpZHRoID0gRlhTWVNfZmFicyh0aGlzX3dpZHRoKTsKKyAgdGhpc19tYXRyaXguQ29uY2F0KGZvcm1NYXRyaXgpOworICB0aGlzX3dpZHRoID0gdGhpc19tYXRyaXguVHJhbnNmb3JtRGlzdGFuY2UodGhpc193aWR0aCk7CisgIEZYX0ZMT0FUIHRocmVzaG9sZCA9CisgICAgICBwcmV2X3dpZHRoID4gdGhpc193aWR0aCA/IHByZXZfd2lkdGggLyA0IDogdGhpc193aWR0aCAvIDQ7CisgIEZYX0ZMT0FUIHByZXZfeCA9IHByZXZfT2JqLm1fcFRleHRPYmotPkdldFBvc1goKSwKKyAgICAgICAgICAgcHJldl95ID0gcHJldl9PYmoubV9wVGV4dE9iai0+R2V0UG9zWSgpOworICBwcmV2X09iai5tX2Zvcm1NYXRyaXguVHJhbnNmb3JtKHByZXZfeCwgcHJldl95KTsKKyAgbV9EaXNwbGF5TWF0cml4LlRyYW5zZm9ybShwcmV2X3gsIHByZXZfeSk7CisgIEZYX0ZMT0FUIHRoaXNfeCA9IHBUZXh0T2JqLT5HZXRQb3NYKCksIHRoaXNfeSA9IHBUZXh0T2JqLT5HZXRQb3NZKCk7CisgIGZvcm1NYXRyaXguVHJhbnNmb3JtKHRoaXNfeCwgdGhpc195KTsKKyAgbV9EaXNwbGF5TWF0cml4LlRyYW5zZm9ybSh0aGlzX3gsIHRoaXNfeSk7CisgIGlmIChGWFNZU19mYWJzKHRoaXNfeSAtIHByZXZfeSkgPiB0aHJlc2hvbGQgKiAyKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICBQcm9jZXNzVGV4dE9iamVjdChtX0xpbmVPYmouR2V0QXQoaSkpOwogICAgIH0KICAgICBtX0xpbmVPYmouUmVtb3ZlQWxsKCk7Ci0gICAgQ2xvc2VUZW1wTGluZSgpOwotfQotdm9pZCBDUERGX1RleHRQYWdlOjpQcm9jZXNzRm9ybU9iamVjdChDUERGX0Zvcm1PYmplY3QqIHBGb3JtT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBmb3JtTWF0cml4KQotewotICAgIENQREZfUGFnZU9iamVjdCoJcFBhZ2VPYmogPSBOVUxMOwotICAgIEZYX1BPU0lUSU9OCXBvczsKLSAgICBpZiAoIXBGb3JtT2JqKQl7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcG9zID0gcEZvcm1PYmotPm1fcEZvcm0tPkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKTsKLSAgICBpZiAoIXBvcykJewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENGWF9BZmZpbmVNYXRyaXggY3VyRm9ybU1hdHJpeDsKLSAgICBjdXJGb3JtTWF0cml4LkNvcHkocEZvcm1PYmotPm1fRm9ybU1hdHJpeCk7Ci0gICAgY3VyRm9ybU1hdHJpeC5Db25jYXQoZm9ybU1hdHJpeCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBwUGFnZU9iaiA9IHBGb3JtT2JqLT5tX3BGb3JtLT5HZXROZXh0T2JqZWN0KHBvcyk7Ci0gICAgICAgIGlmKHBQYWdlT2JqKSB7Ci0gICAgICAgICAgICBpZihwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfVEVYVCkgewotICAgICAgICAgICAgICAgIFByb2Nlc3NUZXh0T2JqZWN0KChDUERGX1RleHRPYmplY3QqKXBQYWdlT2JqLCBjdXJGb3JtTWF0cml4LCBwb3MpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfRk9STSkgewotICAgICAgICAgICAgICAgIFByb2Nlc3NGb3JtT2JqZWN0KChDUERGX0Zvcm1PYmplY3QqKXBQYWdlT2JqLCBjdXJGb3JtTWF0cml4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwUGFnZU9iaiA9IE5VTEw7Ci0gICAgfQotfQotaW50IENQREZfVGV4dFBhZ2U6OkdldENoYXJXaWR0aChGWF9EV09SRCBjaGFyQ29kZSwgQ1BERl9Gb250KiBwRm9udCkgY29uc3QKLXsKLSAgICBpZihjaGFyQ29kZSA9PSAtMSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW50IHcgPSBwRm9udC0+R2V0Q2hhcldpZHRoRihjaGFyQ29kZSk7Ci0gICAgaWYodyA9PSAwKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKLSAgICAgICAgcEZvbnQtPkFwcGVuZENoYXIoc3RyLCBjaGFyQ29kZSk7Ci0gICAgICAgIHcgPSBwRm9udC0+R2V0U3RyaW5nV2lkdGgoc3RyLCAxKTsKLSAgICAgICAgaWYodyA9PSAwKSB7Ci0gICAgICAgICAgICBGWF9SRUNUIEJCb3g7Ci0gICAgICAgICAgICBwRm9udC0+R2V0Q2hhckJCb3goY2hhckNvZGUsIEJCb3gpOwotICAgICAgICAgICAgdyA9IEJCb3gucmlnaHQgLSBCQm94LmxlZnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHc7Ci19Ci12b2lkIENQREZfVGV4dFBhZ2U6Ok9uUGllY2UoSUZYX0JpZGlDaGFyKiBwQmlkaSwgQ0ZYX1dpZGVTdHJpbmcmIHN0cikKLXsKLSAgICBGWF9JTlQzMiBzdGFydCwgY291bnQ7Ci0gICAgRlhfSU5UMzIgcmV0ID0gcEJpZGktPkdldEJpZGlJbmZvKHN0YXJ0LCBjb3VudCk7Ci0gICAgaWYocmV0ID09IDIpIHsKLSAgICAgICAgZm9yKGludCBpID0gc3RhcnQgKyBjb3VudCAtIDE7IGkgPj0gc3RhcnQ7IGktLSkgewotICAgICAgICAgICAgbV9UZXh0QnVmLkFwcGVuZENoYXIoc3RyLkdldEF0KGkpKTsKLSAgICAgICAgICAgIG1fY2hhckxpc3QuQWRkKCooUEFHRUNIQVJfSU5GTyopbV9UZW1wQ2hhckxpc3QuR2V0QXQoaSkpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IGVuZCA9IHN0YXJ0ICsgY291bnQgOwotICAgICAgICBmb3IoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7Ci0gICAgICAgICAgICBtX1RleHRCdWYuQXBwZW5kQ2hhcihzdHIuR2V0QXQoaSkpOwotICAgICAgICAgICAgbV9jaGFyTGlzdC5BZGQoKihQQUdFQ0hBUl9JTkZPKiltX1RlbXBDaGFyTGlzdC5HZXRBdChpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci12b2lkIENQREZfVGV4dFBhZ2U6OkFkZENoYXJJbmZvQnlMUkRpcmVjdGlvbihDRlhfV2lkZVN0cmluZyYgc3RyLCBpbnQgaSkKLXsKLSAgICBQQUdFQ0hBUl9JTkZPIEluZm8gPSAqKFBBR0VDSEFSX0lORk8qKW1fVGVtcENoYXJMaXN0LkdldEF0KGkpOwotICAgIEZYX1dDSEFSIHdDaGFyID0gc3RyLkdldEF0KGkpOwotICAgIGlmKCFJc0NvbnRyb2xDaGFyKCZJbmZvKSkgewotICAgICAgICBJbmZvLm1fSW5kZXggPSBtX1RleHRCdWYuR2V0TGVuZ3RoKCk7Ci0gICAgICAgIGlmICh3Q2hhciA+PSAweEZCMDAgJiYgd0NoYXIgPD0gMHhGQjA2KSB7Ci0gICAgICAgICAgICBGWF9MUFdTVFIgcERzdCA9IE5VTEw7Ci0gICAgICAgICAgICBGWF9TVFJTSVpFIG5Db3VudCA9IEZYX1VuaWNvZGVfR2V0Tm9ybWFsaXphdGlvbih3Q2hhciwgcERzdCk7Ci0gICAgICAgICAgICBpZiAobkNvdW50ID49IDEpIHsKLSAgICAgICAgICAgICAgICBwRHN0ID0gRlhfQWxsb2MoRlhfV0NIQVIsIG5Db3VudCk7Ci0gICAgICAgICAgICAgICAgRlhfVW5pY29kZV9HZXROb3JtYWxpemF0aW9uKHdDaGFyLCBwRHN0KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBuSW5kZXggPSAwOyBuSW5kZXggPCBuQ291bnQ7IG5JbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBBR0VDSEFSX0lORk8gSW5mbzIgPSBJbmZvOwotICAgICAgICAgICAgICAgICAgICBJbmZvMi5tX1VuaWNvZGUgPSBwRHN0W25JbmRleF07Ci0gICAgICAgICAgICAgICAgICAgIEluZm8yLm1fRmxhZyA9IEZQREZURVhUX0NIQVJfUElFQ0U7Ci0gICAgICAgICAgICAgICAgICAgIG1fVGV4dEJ1Zi5BcHBlbmRDaGFyKEluZm8yLm1fVW5pY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCAhbV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2NoYXJMaXN0LkFkZChJbmZvMik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhfRnJlZShwRHN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9UZXh0QnVmLkFwcGVuZENoYXIod0NoYXIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEluZm8ubV9JbmRleCA9IC0xOwotICAgIH0KLSAgICBpZiggIW1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgewotICAgICAgICBtX2NoYXJMaXN0LkFkZChJbmZvKTsKLSAgICB9Ci19Ci12b2lkIENQREZfVGV4dFBhZ2U6OkFkZENoYXJJbmZvQnlSTERpcmVjdGlvbihDRlhfV2lkZVN0cmluZyYgc3RyLCBpbnQgaSkKLXsKLSAgICBQQUdFQ0hBUl9JTkZPIEluZm8gPSAqKFBBR0VDSEFSX0lORk8qKW1fVGVtcENoYXJMaXN0LkdldEF0KGkpOwotICAgIGlmKCFJc0NvbnRyb2xDaGFyKCZJbmZvKSkgewotICAgICAgICBJbmZvLm1fSW5kZXggPSBtX1RleHRCdWYuR2V0TGVuZ3RoKCk7Ci0gICAgICAgIEZYX1dDSEFSIHdDaGFyID0gRlhfR2V0TWlycm9yQ2hhcihzdHIuR2V0QXQoaSksIFRSVUUsIEZBTFNFKTsKLSAgICAgICAgRlhfTFBXU1RSIHBEc3QgPSBOVUxMOwotICAgICAgICBGWF9TVFJTSVpFIG5Db3VudCA9IEZYX1VuaWNvZGVfR2V0Tm9ybWFsaXphdGlvbih3Q2hhciwgcERzdCk7Ci0gICAgICAgIGlmIChuQ291bnQgPj0gMSkgewotICAgICAgICAgICAgcERzdCA9IEZYX0FsbG9jKEZYX1dDSEFSLCBuQ291bnQpOwotICAgICAgICAgICAgRlhfVW5pY29kZV9HZXROb3JtYWxpemF0aW9uKHdDaGFyLCBwRHN0KTsKLSAgICAgICAgICAgIGZvciAoaW50IG5JbmRleCA9IDA7IG5JbmRleCA8IG5Db3VudDsgbkluZGV4KyspIHsKLSAgICAgICAgICAgICAgICBQQUdFQ0hBUl9JTkZPIEluZm8yID0gSW5mbzsKLSAgICAgICAgICAgICAgICBJbmZvMi5tX1VuaWNvZGUgPSBwRHN0W25JbmRleF07Ci0gICAgICAgICAgICAgICAgSW5mbzIubV9GbGFnID0gRlBERlRFWFRfQ0hBUl9QSUVDRTsKLSAgICAgICAgICAgICAgICBtX1RleHRCdWYuQXBwZW5kQ2hhcihJbmZvMi5tX1VuaWNvZGUpOwotICAgICAgICAgICAgICAgIGlmKCAhbV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fY2hhckxpc3QuQWRkKEluZm8yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9GcmVlKHBEc3QpOwotICAgICAgICAgICAgcmV0dXJuOworICAgIG1fTGluZU9iai5BZGQoT2JqKTsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IGkgPSAwOworICBpZiAobV9QYXJzZU9wdGlvbnMubV9iTm9ybWFsaXplT2JqcykgeworICAgIGZvciAoaSA9IGNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgIFBERlRFWFRfT2JqIHByZXZfT2JqID0gbV9MaW5lT2JqLkdldEF0KGkpOworICAgICAgQ0ZYX01hdHJpeCBwcmV2X21hdHJpeDsKKyAgICAgIHByZXZfT2JqLm1fcFRleHRPYmotPkdldFRleHRNYXRyaXgoJnByZXZfbWF0cml4KTsKKyAgICAgIEZYX0ZMT0FUIFByZXZfeCA9IHByZXZfT2JqLm1fcFRleHRPYmotPkdldFBvc1goKSwKKyAgICAgICAgICAgICAgIFByZXZfeSA9IHByZXZfT2JqLm1fcFRleHRPYmotPkdldFBvc1koKTsKKyAgICAgIHByZXZfT2JqLm1fZm9ybU1hdHJpeC5UcmFuc2Zvcm0oUHJldl94LCBQcmV2X3kpOworICAgICAgbV9EaXNwbGF5TWF0cml4LlRyYW5zZm9ybShQcmV2X3gsIFByZXZfeSk7CisgICAgICBpZiAodGhpc194ID49IFByZXZfeCkgeworICAgICAgICBpZiAoaSA9PSBjb3VudCAtIDEpIHsKKyAgICAgICAgICBtX0xpbmVPYmouQWRkKE9iaik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBJbmZvLm1fVW5pY29kZSA9IHdDaGFyOworICAgICAgICAgIG1fTGluZU9iai5JbnNlcnRBdChpICsgMSwgT2JqKTsKICAgICAgICAgfQotICAgICAgICBtX1RleHRCdWYuQXBwZW5kQ2hhcihJbmZvLm1fVW5pY29kZSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaSA8IDApIHsKKyAgICAgIG1fTGluZU9iai5JbnNlcnRBdCgwLCBPYmopOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtX0xpbmVPYmouQWRkKE9iaik7CisgIH0KK30KK2ludDMyX3QgQ1BERl9UZXh0UGFnZTo6UHJlTWFya2VkQ29udGVudChQREZURVhUX09iaiBPYmopIHsKKyAgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiA9IE9iai5tX3BUZXh0T2JqOworICBDUERGX0NvbnRlbnRNYXJrRGF0YSogcE1hcmtEYXRhID0KKyAgICAgIChDUERGX0NvbnRlbnRNYXJrRGF0YSopcFRleHRPYmotPm1fQ29udGVudE1hcmsuR2V0T2JqZWN0KCk7CisgIGlmICghcE1hcmtEYXRhKSB7CisgICAgcmV0dXJuIEZQREZURVhUX01DX1BBU1M7CisgIH0KKyAgaW50IG5Db250ZW50TWFyayA9IHBNYXJrRGF0YS0+Q291bnRJdGVtcygpOworICBpZiAobkNvbnRlbnRNYXJrIDwgMSkgeworICAgIHJldHVybiBGUERGVEVYVF9NQ19QQVNTOworICB9CisgIENGWF9XaWRlU3RyaW5nIGFjdFRleHQ7CisgIEZYX0JPT0wgYkV4aXN0ID0gRkFMU0U7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBOVUxMOworICBpbnQgbiA9IDA7CisgIGZvciAobiA9IDA7IG4gPCBuQ29udGVudE1hcms7IG4rKykgeworICAgIENQREZfQ29udGVudE1hcmtJdGVtJiBpdGVtID0gcE1hcmtEYXRhLT5HZXRJdGVtKG4pOworICAgIENGWF9CeXRlU3RyaW5nIHRhZ1N0ciA9IChDRlhfQnl0ZVN0cmluZylpdGVtLkdldE5hbWUoKTsKKyAgICBwRGljdCA9IFRvRGljdGlvbmFyeShzdGF0aWNfY2FzdDxDUERGX09iamVjdCo+KGl0ZW0uR2V0UGFyYW0oKSkpOworICAgIENQREZfU3RyaW5nKiB0ZW1wID0KKyAgICAgICAgVG9TdHJpbmcocERpY3QgPyBwRGljdC0+R2V0RWxlbWVudCgiQWN0dWFsVGV4dCIpIDogbnVsbHB0cik7CisgICAgaWYgKHRlbXApIHsKKyAgICAgIGJFeGlzdCA9IFRSVUU7CisgICAgICBhY3RUZXh0ID0gdGVtcC0+R2V0VW5pY29kZVRleHQoKTsKKyAgICB9CisgIH0KKyAgaWYgKCFiRXhpc3QpIHsKKyAgICByZXR1cm4gRlBERlRFWFRfTUNfUEFTUzsKKyAgfQorICBpZiAobV9wUHJlVGV4dE9iaikgeworICAgIGlmIChDUERGX0NvbnRlbnRNYXJrRGF0YSogcFByZU1hcmtEYXRhID0KKyAgICAgICAgICAgIChDUERGX0NvbnRlbnRNYXJrRGF0YSopbV9wUHJlVGV4dE9iai0+bV9Db250ZW50TWFyay5HZXRPYmplY3QoKSkgeworICAgICAgaWYgKHBQcmVNYXJrRGF0YS0+Q291bnRJdGVtcygpID09IG4pIHsKKyAgICAgICAgQ1BERl9Db250ZW50TWFya0l0ZW0mIGl0ZW0gPSBwUHJlTWFya0RhdGEtPkdldEl0ZW0obiAtIDEpOworICAgICAgICBpZiAocERpY3QgPT0gaXRlbS5HZXRQYXJhbSgpKSB7CisgICAgICAgICAgcmV0dXJuIEZQREZURVhUX01DX0RPTkU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgQ1BERl9Gb250KiBwRm9udCA9IHBUZXh0T2JqLT5HZXRGb250KCk7CisgIEZYX1NUUlNJWkUgbkl0ZW1zID0gYWN0VGV4dC5HZXRMZW5ndGgoKTsKKyAgaWYgKG5JdGVtcyA8IDEpIHsKKyAgICByZXR1cm4gRlBERlRFWFRfTUNfUEFTUzsKKyAgfQorICBiRXhpc3QgPSBGQUxTRTsKKyAgZm9yIChGWF9TVFJTSVpFIGkgPSAwOyBpIDwgbkl0ZW1zOyBpKyspIHsKKyAgICBGWF9XQ0hBUiB3Q2hhciA9IGFjdFRleHQuR2V0QXQoaSk7CisgICAgaWYgKC0xID09IHBGb250LT5DaGFyQ29kZUZyb21Vbmljb2RlKHdDaGFyKSkgeworICAgICAgY29udGludWU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgSW5mby5tX0luZGV4ID0gLTE7CisgICAgICBiRXhpc3QgPSBUUlVFOworICAgICAgYnJlYWs7CiAgICAgfQotICAgIGlmKCAhbV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7Ci0gICAgICAgIG1fY2hhckxpc3QuQWRkKEluZm8pOworICB9CisgIGlmICghYkV4aXN0KSB7CisgICAgcmV0dXJuIEZQREZURVhUX01DX1BBU1M7CisgIH0KKyAgYkV4aXN0ID0gRkFMU0U7CisgIGZvciAoRlhfU1RSU0laRSBpID0gMDsgaSA8IG5JdGVtczsgaSsrKSB7CisgICAgRlhfV0NIQVIgd0NoYXIgPSBhY3RUZXh0LkdldEF0KGkpOworICAgIGlmICgod0NoYXIgPiAweDgwICYmIHdDaGFyIDwgMHhGRkZEKSB8fCAod0NoYXIgPD0gMHg4MCAmJiBpc3ByaW50KHdDaGFyKSkpIHsKKyAgICAgIGJFeGlzdCA9IFRSVUU7CisgICAgICBicmVhazsKICAgICB9CisgIH0KKyAgaWYgKCFiRXhpc3QpIHsKKyAgICByZXR1cm4gRlBERlRFWFRfTUNfRE9ORTsKKyAgfQorICByZXR1cm4gRlBERlRFWFRfTUNfREVMQVk7CiB9Ci12b2lkIENQREZfVGV4dFBhZ2U6OkNsb3NlVGVtcExpbmUoKQotewotICAgIGludCBjb3VudDEgPSBtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCk7Ci0gICAgaWYgKGNvdW50MSA8PSAwKSB7Ci0gICAgICAgIHJldHVybjsKK3ZvaWQgQ1BERl9UZXh0UGFnZTo6UHJvY2Vzc01hcmtlZENvbnRlbnQoUERGVEVYVF9PYmogT2JqKSB7CisgIENQREZfVGV4dE9iamVjdCogcFRleHRPYmogPSBPYmoubV9wVGV4dE9iajsKKyAgQ1BERl9Db250ZW50TWFya0RhdGEqIHBNYXJrRGF0YSA9CisgICAgICAoQ1BERl9Db250ZW50TWFya0RhdGEqKXBUZXh0T2JqLT5tX0NvbnRlbnRNYXJrLkdldE9iamVjdCgpOworICBpZiAoIXBNYXJrRGF0YSkgeworICAgIHJldHVybjsKKyAgfQorICBpbnQgbkNvbnRlbnRNYXJrID0gcE1hcmtEYXRhLT5Db3VudEl0ZW1zKCk7CisgIGlmIChuQ29udGVudE1hcmsgPCAxKSB7CisgICAgcmV0dXJuOworICB9CisgIENGWF9XaWRlU3RyaW5nIGFjdFRleHQ7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBOVUxMOworICBpbnQgbiA9IDA7CisgIGZvciAobiA9IDA7IG4gPCBuQ29udGVudE1hcms7IG4rKykgeworICAgIENQREZfQ29udGVudE1hcmtJdGVtJiBpdGVtID0gcE1hcmtEYXRhLT5HZXRJdGVtKG4pOworICAgIENGWF9CeXRlU3RyaW5nIHRhZ1N0ciA9IChDRlhfQnl0ZVN0cmluZylpdGVtLkdldE5hbWUoKTsKKyAgICBwRGljdCA9IFRvRGljdGlvbmFyeShzdGF0aWNfY2FzdDxDUERGX09iamVjdCo+KGl0ZW0uR2V0UGFyYW0oKSkpOworICAgIENQREZfU3RyaW5nKiB0ZW1wID0KKyAgICAgICAgVG9TdHJpbmcocERpY3QgPyBwRGljdC0+R2V0RWxlbWVudCgiQWN0dWFsVGV4dCIpIDogbnVsbHB0cik7CisgICAgaWYgKHRlbXApIHsKKyAgICAgIGFjdFRleHQgPSB0ZW1wLT5HZXRVbmljb2RlVGV4dCgpOwogICAgIH0KLSAgICBJRlhfQmlkaUNoYXIqIEJpZGlDaGFyID0gSUZYX0JpZGlDaGFyOjpDcmVhdGUoKTsKLSAgICBDRlhfV2lkZVN0cmluZyBzdHIgPSBtX1RlbXBUZXh0QnVmLkdldFdpZGVTdHJpbmcoKTsKLSAgICBDRlhfV29yZEFycmF5IG9yZGVyOwotICAgIEZYX0JPT0wgYlIyTCA9IEZBTFNFOwotICAgIEZYX0lOVDMyIHN0YXJ0ID0gMCwgY291bnQgPSAwOwotICAgIGludCBuUjJMID0gMCwgbkwyUiA9IDA7Ci0gICAgRlhfQk9PTCBiUHJldlNwYWNlID0gRkFMU0U7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIuR2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICBpZihzdHIuR2V0QXQoaSkgPT0gMzIpIHsKLSAgICAgICAgICAgIGlmKGJQcmV2U3BhY2UpIHsKLSAgICAgICAgICAgICAgICBtX1RlbXBUZXh0QnVmLkRlbGV0ZShpLCAxKTsKLSAgICAgICAgICAgICAgICBtX1RlbXBDaGFyTGlzdC5EZWxldGUoaSk7Ci0gICAgICAgICAgICAgICAgc3RyLkRlbGV0ZShpKTsKLSAgICAgICAgICAgICAgICBjb3VudDEtLTsKLSAgICAgICAgICAgICAgICBpLS07Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiUHJldlNwYWNlID0gVFJVRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJQcmV2U3BhY2UgPSBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZihCaWRpQ2hhciAmJiBCaWRpQ2hhci0+QXBwZW5kQ2hhcihzdHIuR2V0QXQoaSkpKSB7Ci0gICAgICAgICAgICBGWF9JTlQzMiByZXQgPSBCaWRpQ2hhci0+R2V0QmlkaUluZm8oc3RhcnQsIGNvdW50KTsKLSAgICAgICAgICAgIG9yZGVyLkFkZChzdGFydCk7Ci0gICAgICAgICAgICBvcmRlci5BZGQoY291bnQpOwotICAgICAgICAgICAgb3JkZXIuQWRkKHJldCk7Ci0gICAgICAgICAgICBpZighYlIyTCkgewotICAgICAgICAgICAgICAgIGlmKHJldCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5SMkwrKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5MMlIrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgfQorICBGWF9TVFJTSVpFIG5JdGVtcyA9IGFjdFRleHQuR2V0TGVuZ3RoKCk7CisgIGlmIChuSXRlbXMgPCAxKSB7CisgICAgcmV0dXJuOworICB9CisgIENQREZfRm9udCogcEZvbnQgPSBwVGV4dE9iai0+R2V0Rm9udCgpOworICBDRlhfTWF0cml4IGZvcm1NYXRyaXggPSBPYmoubV9mb3JtTWF0cml4OworICBDRlhfTWF0cml4IG1hdHJpeDsKKyAgcFRleHRPYmotPkdldFRleHRNYXRyaXgoJm1hdHJpeCk7CisgIG1hdHJpeC5Db25jYXQoZm9ybU1hdHJpeCk7CisgIEZYX0ZMT0FUIGZQb3NYID0gcFRleHRPYmotPkdldFBvc1goKTsKKyAgRlhfRkxPQVQgZlBvc1kgPSBwVGV4dE9iai0+R2V0UG9zWSgpOworICBpbnQgbkNoYXJJbmZvSW5kZXggPSBtX1RleHRCdWYuR2V0TGVuZ3RoKCk7CisgIENGWF9GbG9hdFJlY3QgY2hhckJveDsKKyAgY2hhckJveC50b3AgPSBwVGV4dE9iai0+bV9Ub3A7CisgIGNoYXJCb3gubGVmdCA9IHBUZXh0T2JqLT5tX0xlZnQ7CisgIGNoYXJCb3gucmlnaHQgPSBwVGV4dE9iai0+bV9SaWdodDsKKyAgY2hhckJveC5ib3R0b20gPSBwVGV4dE9iai0+bV9Cb3R0b207CisgIGZvciAoRlhfU1RSU0laRSBrID0gMDsgayA8IG5JdGVtczsgaysrKSB7CisgICAgRlhfV0NIQVIgd0NoYXIgPSBhY3RUZXh0LkdldEF0KGspOworICAgIGlmICh3Q2hhciA8PSAweDgwICYmICFpc3ByaW50KHdDaGFyKSkgeworICAgICAgd0NoYXIgPSAweDIwOwogICAgIH0KLSAgICBpZihCaWRpQ2hhciAmJiBCaWRpQ2hhci0+RW5kQ2hhcigpKSB7Ci0gICAgICAgIEZYX0lOVDMyIHJldCA9IEJpZGlDaGFyLT5HZXRCaWRpSW5mbyhzdGFydCwgY291bnQpOwotICAgICAgICBvcmRlci5BZGQoc3RhcnQpOwotICAgICAgICBvcmRlci5BZGQoY291bnQpOwotICAgICAgICBvcmRlci5BZGQocmV0KTsKLSAgICAgICAgaWYoIWJSMkwpIHsKLSAgICAgICAgICAgIGlmKHJldCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgblIyTCsrOwotICAgICAgICAgICAgfSBlbHNlIGlmKHJldCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgbkwyUisrOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgaWYgKHdDaGFyID49IDB4RkZGRCkgeworICAgICAgY29udGludWU7CiAgICAgfQotICAgIGlmKG5SMkwgPiAwICYmIG5SMkwgPj0gbkwyUikgewotICAgICAgICBiUjJMID0gVFJVRTsKLSAgICB9Ci0gICAgaWYodGhpcy0+bV9wYXJzZXJmbGFnID09IEZQREZURVhUX1JMVEIgfHwgYlIyTCkgewotICAgICAgICBpbnQgY291bnQgPSBvcmRlci5HZXRTaXplKCk7Ci0gICAgICAgIGZvcihpbnQgaSA9IGNvdW50IC0gMTsgaSA+IDA7IGkgLT0gMykgewotICAgICAgICAgICAgaW50IHJldCA9IG9yZGVyLkdldEF0KGkpOwotICAgICAgICAgICAgaW50IHN0YXJ0ID0gb3JkZXIuR2V0QXQoaSAtIDIpOwotICAgICAgICAgICAgaW50IGNvdW50MSA9IG9yZGVyLkdldEF0KGkgLSAxKTsKLSAgICAgICAgICAgIGlmKHJldCA9PSAyIHx8IHJldCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yKGludCBqID0gc3RhcnQgKyBjb3VudDEgLSAxOyBqID49IHN0YXJ0OyBqLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgQWRkQ2hhckluZm9CeVJMRGlyZWN0aW9uKHN0ciwgaik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgaiA9IGk7Ci0gICAgICAgICAgICAgICAgRlhfQk9PTCBiU3ltYm9sID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgd2hpbGUoaiA+IDAgJiYgb3JkZXIuR2V0QXQoaikgIT0gMikgewotICAgICAgICAgICAgICAgICAgICBiU3ltYm9sID0gIW9yZGVyLkdldEF0KGopOwotICAgICAgICAgICAgICAgICAgICBqIC09IDM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludCBlbmQgPSBzdGFydCArIGNvdW50MSA7Ci0gICAgICAgICAgICAgICAgaW50IG4gPSAwOwotICAgICAgICAgICAgICAgIGlmKGJTeW1ib2wpIHsKLSAgICAgICAgICAgICAgICAgICAgbiA9IGogKyA2OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG4gPSBqICsgMzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYobiA+PSBpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihpbnQgbSA9IHN0YXJ0OyBtIDwgZW5kOyBtKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFkZENoYXJJbmZvQnlMUkRpcmVjdGlvbihzdHIsIG0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaiA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIGkgPSBuOwotICAgICAgICAgICAgICAgICAgICBmb3IoOyBuIDw9IGo7IG4gKz0gMykgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gb3JkZXIuR2V0QXQobiAtIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50MSA9IG9yZGVyLkdldEF0KG4gLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmQgPSBzdGFydCArIGNvdW50MSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoaW50IG0gPSBzdGFydDsgbSA8IGVuZDsgbSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkQ2hhckluZm9CeUxSRGlyZWN0aW9uKHN0ciwgbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgY291bnQgPSBvcmRlci5HZXRTaXplKCk7Ci0gICAgICAgIEZYX0JPT0wgYkwyUiA9IEZBTFNFOwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkgKz0gMykgewotICAgICAgICAgICAgaW50IHJldCA9IG9yZGVyLkdldEF0KGkgKyAyKTsKLSAgICAgICAgICAgIGludCBzdGFydCA9IG9yZGVyLkdldEF0KGkpOwotICAgICAgICAgICAgaW50IGNvdW50MSA9IG9yZGVyLkdldEF0KGkgKyAxKTsKLSAgICAgICAgICAgIGlmKHJldCA9PSAyIHx8IChpID09IDAgJiYgcmV0ID09IDAgJiYgIWJMMlIpKSB7Ci0gICAgICAgICAgICAgICAgaW50IGogPSBpICsgMzsKLSAgICAgICAgICAgICAgICB3aGlsZShiUjJMICYmIGogPCBjb3VudCkgewotICAgICAgICAgICAgICAgICAgICBpZihvcmRlci5HZXRBdChqICsgMikgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoaiA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGkgPSAtMzsKLSAgICAgICAgICAgICAgICAgICAgYkwyUiA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgZW5kID0gbV9UZW1wQ2hhckxpc3QuR2V0U2l6ZSgpIC0gMTsKLSAgICAgICAgICAgICAgICBpZihqIDwgY291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kID0gb3JkZXIuR2V0QXQoaikgLSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpID0gaiAtIDM7Ci0gICAgICAgICAgICAgICAgZm9yKGludCBuID0gZW5kOyBuID49IHN0YXJ0OyBuLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgQWRkQ2hhckluZm9CeVJMRGlyZWN0aW9uKHN0ciwgbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgZW5kID0gc3RhcnQgKyBjb3VudDEgOwotICAgICAgICAgICAgICAgIGZvcihpbnQgbiA9IHN0YXJ0OyBuIDwgZW5kOyBuKyspIHsKLSAgICAgICAgICAgICAgICAgICAgQWRkQ2hhckluZm9CeUxSRGlyZWN0aW9uKHN0ciwgbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIG9yZGVyLlJlbW92ZUFsbCgpOwotICAgIG1fVGVtcENoYXJMaXN0LlJlbW92ZUFsbCgpOwotICAgIG1fVGVtcFRleHRCdWYuRGVsZXRlKDAsIG1fVGVtcFRleHRCdWYuR2V0TGVuZ3RoKCkpOwotICAgIEJpZGlDaGFyLT5SZWxlYXNlKCk7CisgICAgUEFHRUNIQVJfSU5GTyBjaGFyaW5mbzsKKyAgICBjaGFyaW5mby5tX09yaWdpblggPSBmUG9zWDsKKyAgICBjaGFyaW5mby5tX09yaWdpblkgPSBmUG9zWTsKKyAgICBjaGFyaW5mby5tX0luZGV4ID0gbkNoYXJJbmZvSW5kZXg7CisgICAgY2hhcmluZm8ubV9Vbmljb2RlID0gd0NoYXI7CisgICAgY2hhcmluZm8ubV9DaGFyQ29kZSA9IHBGb250LT5DaGFyQ29kZUZyb21Vbmljb2RlKHdDaGFyKTsKKyAgICBjaGFyaW5mby5tX0ZsYWcgPSBGUERGVEVYVF9DSEFSX1BJRUNFOworICAgIGNoYXJpbmZvLm1fcFRleHRPYmogPSBwVGV4dE9iajsKKyAgICBjaGFyaW5mby5tX0NoYXJCb3gudG9wID0gY2hhckJveC50b3A7CisgICAgY2hhcmluZm8ubV9DaGFyQm94LmxlZnQgPSBjaGFyQm94LmxlZnQ7CisgICAgY2hhcmluZm8ubV9DaGFyQm94LnJpZ2h0ID0gY2hhckJveC5yaWdodDsKKyAgICBjaGFyaW5mby5tX0NoYXJCb3guYm90dG9tID0gY2hhckJveC5ib3R0b207CisgICAgY2hhcmluZm8ubV9NYXRyaXguQ29weShtYXRyaXgpOworICAgIG1fVGVtcFRleHRCdWYuQXBwZW5kQ2hhcih3Q2hhcik7CisgICAgbV9UZW1wQ2hhckxpc3QuQWRkKGNoYXJpbmZvKTsKKyAgfQogfQotdm9pZCBDUERGX1RleHRQYWdlOjpQcm9jZXNzVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqCXBUZXh0T2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBmb3JtTWF0cml4LCBGWF9QT1NJVElPTiBPYmpQb3MpCi17Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByZShwVGV4dE9iai0+bV9MZWZ0LCBwVGV4dE9iai0+bV9Cb3R0b20sIHBUZXh0T2JqLT5tX1JpZ2h0LCBwVGV4dE9iai0+bV9Ub3ApOwotICAgIGlmKEZYU1lTX2ZhYnMocFRleHRPYmotPm1fUmlnaHQgLSBwVGV4dE9iai0+bV9MZWZ0KSA8IDAuMDFmICkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludCBjb3VudCA9IG1fTGluZU9iai5HZXRTaXplKCk7Ci0gICAgUERGVEVYVF9PYmogT2JqOwotICAgIE9iai5tX3BUZXh0T2JqID0gcFRleHRPYmo7Ci0gICAgT2JqLm1fZm9ybU1hdHJpeCA9IGZvcm1NYXRyaXg7Ci0gICAgaWYoY291bnQgPT0gMCkgewotICAgICAgICBtX0xpbmVPYmouQWRkKE9iaik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKElzU2FtZUFzUHJlVGV4dE9iamVjdChwVGV4dE9iaiwgT2JqUG9zKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIFBERlRFWFRfT2JqIHByZXZfT2JqID0gbV9MaW5lT2JqLkdldEF0KGNvdW50IC0gMSk7Ci0gICAgQ1BERl9UZXh0T2JqZWN0SXRlbSBpdGVtOwotICAgIGludCBuSXRlbSA9IHByZXZfT2JqLm1fcFRleHRPYmotPkNvdW50SXRlbXMoKTsKLSAgICBwcmV2X09iai5tX3BUZXh0T2JqLT5HZXRJdGVtSW5mbyhuSXRlbSAtIDEsICZpdGVtKTsKLSAgICBGWF9GTE9BVCBwcmV2X3dpZHRoID0gR2V0Q2hhcldpZHRoKGl0ZW0ubV9DaGFyQ29kZSwgcHJldl9PYmoubV9wVGV4dE9iai0+R2V0Rm9udCgpKSAqIHByZXZfT2JqLm1fcFRleHRPYmotPkdldEZvbnRTaXplKCkgLyAxMDAwOwotICAgIENGWF9BZmZpbmVNYXRyaXggcHJldl9tYXRyaXg7Ci0gICAgcHJldl9PYmoubV9wVGV4dE9iai0+R2V0VGV4dE1hdHJpeCgmcHJldl9tYXRyaXgpOwotICAgIHByZXZfd2lkdGggPSBGWFNZU19mYWJzKHByZXZfd2lkdGgpOwotICAgIHByZXZfbWF0cml4LkNvbmNhdChwcmV2X09iai5tX2Zvcm1NYXRyaXgpOwotICAgIHByZXZfd2lkdGggPSBwcmV2X21hdHJpeC5UcmFuc2Zvcm1EaXN0YW5jZShwcmV2X3dpZHRoKTsKLSAgICBwVGV4dE9iai0+R2V0SXRlbUluZm8oMCwgJml0ZW0pOwotICAgIEZYX0ZMT0FUIHRoaXNfd2lkdGggPSBHZXRDaGFyV2lkdGgoaXRlbS5tX0NoYXJDb2RlLCBwVGV4dE9iai0+R2V0Rm9udCgpKSAqIHBUZXh0T2JqLT5HZXRGb250U2l6ZSgpIC8gMTAwMDsKLSAgICB0aGlzX3dpZHRoID0gRlhTWVNfZmFicyh0aGlzX3dpZHRoKTsKLSAgICBDRlhfQWZmaW5lTWF0cml4IHRoaXNfbWF0cml4OwotICAgIHBUZXh0T2JqLT5HZXRUZXh0TWF0cml4KCZ0aGlzX21hdHJpeCk7Ci0gICAgdGhpc193aWR0aCA9IEZYU1lTX2ZhYnModGhpc193aWR0aCk7Ci0gICAgdGhpc19tYXRyaXguQ29uY2F0KGZvcm1NYXRyaXgpOwotICAgIHRoaXNfd2lkdGggPSB0aGlzX21hdHJpeC5UcmFuc2Zvcm1EaXN0YW5jZSh0aGlzX3dpZHRoKTsKLSAgICBGWF9GTE9BVCB0aHJlc2hvbGQgPSBwcmV2X3dpZHRoID4gdGhpc193aWR0aCA/IHByZXZfd2lkdGggLyA0IDogdGhpc193aWR0aCAvIDQ7Ci0gICAgRlhfRkxPQVQgcHJldl94ID0gcHJldl9PYmoubV9wVGV4dE9iai0+R2V0UG9zWCgpLCBwcmV2X3kgPSBwcmV2X09iai5tX3BUZXh0T2JqLT5HZXRQb3NZKCk7Ci0gICAgcHJldl9PYmoubV9mb3JtTWF0cml4LlRyYW5zZm9ybShwcmV2X3gsIHByZXZfeSk7Ci0gICAgbV9EaXNwbGF5TWF0cml4LlRyYW5zZm9ybShwcmV2X3gsIHByZXZfeSk7Ci0gICAgRlhfRkxPQVQgdGhpc194ID0gcFRleHRPYmotPkdldFBvc1goKSwgdGhpc195ID0gcFRleHRPYmotPkdldFBvc1koKTsKLSAgICBmb3JtTWF0cml4LlRyYW5zZm9ybSh0aGlzX3gsIHRoaXNfeSk7Ci0gICAgbV9EaXNwbGF5TWF0cml4LlRyYW5zZm9ybSh0aGlzX3gsIHRoaXNfeSk7Ci0gICAgaWYgKEZYU1lTX2ZhYnModGhpc195IC0gcHJldl95KSA+IHRocmVzaG9sZCAqIDIpIHsKLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIFByb2Nlc3NUZXh0T2JqZWN0KG1fTGluZU9iai5HZXRBdChpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9MaW5lT2JqLlJlbW92ZUFsbCgpOwotICAgICAgICBtX0xpbmVPYmouQWRkKE9iaik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IGkgPSAwOwotICAgIGlmKG1fUGFyc2VPcHRpb25zLm1fYk5vcm1hbGl6ZU9ianMpIHsKLSAgICAgICAgZm9yKGkgPSBjb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICBQREZURVhUX09iaiBwcmV2X09iaiA9IG1fTGluZU9iai5HZXRBdChpKTsKLSAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXggcHJldl9tYXRyaXg7Ci0gICAgICAgICAgICBwcmV2X09iai5tX3BUZXh0T2JqLT5HZXRUZXh0TWF0cml4KCZwcmV2X21hdHJpeCk7Ci0gICAgICAgICAgICBGWF9GTE9BVCBQcmV2X3ggPSBwcmV2X09iai5tX3BUZXh0T2JqLT5HZXRQb3NYKCksIFByZXZfeSA9IHByZXZfT2JqLm1fcFRleHRPYmotPkdldFBvc1koKTsKLSAgICAgICAgICAgIHByZXZfT2JqLm1fZm9ybU1hdHJpeC5UcmFuc2Zvcm0oUHJldl94LCBQcmV2X3kpOwotICAgICAgICAgICAgbV9EaXNwbGF5TWF0cml4LlRyYW5zZm9ybShQcmV2X3gsIFByZXZfeSk7Ci0gICAgICAgICAgICBpZih0aGlzX3ggPj0gUHJldl94KSB7Ci0gICAgICAgICAgICAgICAgaWYoaSA9PSBjb3VudCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9MaW5lT2JqLkFkZChPYmopOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fTGluZU9iai5JbnNlcnRBdChpICsgMSwgT2JqKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYoaSA8IDApIHsKLSAgICAgICAgICAgIG1fTGluZU9iai5JbnNlcnRBdCgwLCBPYmopOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9MaW5lT2JqLkFkZChPYmopOwotICAgIH0KK3ZvaWQgQ1BERl9UZXh0UGFnZTo6RmluZFByZXZpb3VzVGV4dE9iamVjdCh2b2lkKSB7CisgIGlmIChtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCkgPCAxICYmIG1fY2hhckxpc3QuR2V0U2l6ZSgpIDwgMSkgeworICAgIHJldHVybjsKKyAgfQorICBQQUdFQ0hBUl9JTkZPIHByZUNoYXI7CisgIGlmIChtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCkgPj0gMSkgeworICAgIHByZUNoYXIgPQorICAgICAgICAqKFBBR0VDSEFSX0lORk8qKW1fVGVtcENoYXJMaXN0LkdldEF0KG1fVGVtcENoYXJMaXN0LkdldFNpemUoKSAtIDEpOworICB9IGVsc2UgeworICAgIHByZUNoYXIgPSAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQobV9jaGFyTGlzdC5HZXRTaXplKCkgLSAxKTsKKyAgfQorICBpZiAocHJlQ2hhci5tX3BUZXh0T2JqKSB7CisgICAgbV9wUHJlVGV4dE9iaiA9IHByZUNoYXIubV9wVGV4dE9iajsKKyAgfQogfQotRlhfSU5UMzIgQ1BERl9UZXh0UGFnZTo6UHJlTWFya2VkQ29udGVudChQREZURVhUX09iaiBPYmopCi17Ci0gICAgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiA9IE9iai5tX3BUZXh0T2JqOwotICAgIENQREZfQ29udGVudE1hcmtEYXRhKiBwTWFya0RhdGEgPSAoQ1BERl9Db250ZW50TWFya0RhdGEqKXBUZXh0T2JqLT5tX0NvbnRlbnRNYXJrLkdldE9iamVjdCgpOwotICAgIGlmKCFwTWFya0RhdGEpIHsKLSAgICAgICAgcmV0dXJuIEZQREZURVhUX01DX1BBU1M7Ci0gICAgfQotICAgIGludCBuQ29udGVudE1hcmsgPSBwTWFya0RhdGEtPkNvdW50SXRlbXMoKTsKLSAgICBpZiAobkNvbnRlbnRNYXJrIDwgMSkgewotICAgICAgICByZXR1cm4gRlBERlRFWFRfTUNfUEFTUzsKLSAgICB9Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgYWN0VGV4dDsKLSAgICBGWF9CT09MIGJFeGlzdCA9IEZBTFNFOwotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBOVUxMOwotICAgIGludCBuID0gMDsKLSAgICBmb3IgKG4gPSAwOyBuIDwgbkNvbnRlbnRNYXJrOyBuKyspIHsKLSAgICAgICAgQ1BERl9Db250ZW50TWFya0l0ZW0mIGl0ZW0gPSBwTWFya0RhdGEtPkdldEl0ZW0obik7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHRhZ1N0ciA9IChDRlhfQnl0ZVN0cmluZylpdGVtLkdldE5hbWUoKTsKLSAgICAgICAgcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilpdGVtLkdldFBhcmFtKCk7Ci0gICAgICAgIENQREZfU3RyaW5nKiB0ZW1wID0gKENQREZfU3RyaW5nKikocERpY3QgPyBwRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiQWN0dWFsVGV4dCIpKSA6IE5VTEwpOwotICAgICAgICBpZiAodGVtcCkgewotICAgICAgICAgICAgYkV4aXN0ID0gVFJVRTsKLSAgICAgICAgICAgIGFjdFRleHQgPSB0ZW1wLT5HZXRVbmljb2RlVGV4dCgpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghYkV4aXN0KSB7Ci0gICAgICAgIHJldHVybiBGUERGVEVYVF9NQ19QQVNTOwotICAgIH0KLSAgICBpZiAobV9wUHJlVGV4dE9iaikgewotICAgICAgICBpZiAoQ1BERl9Db250ZW50TWFya0RhdGEqIHBQcmVNYXJrRGF0YSA9IChDUERGX0NvbnRlbnRNYXJrRGF0YSopbV9wUHJlVGV4dE9iai0+bV9Db250ZW50TWFyay5HZXRPYmplY3QoKSkgewotICAgICAgICAgICAgaWYgKHBQcmVNYXJrRGF0YS0+Q291bnRJdGVtcygpID09IG4pIHsKLSAgICAgICAgICAgICAgICBDUERGX0NvbnRlbnRNYXJrSXRlbSYgaXRlbSA9IHBQcmVNYXJrRGF0YS0+R2V0SXRlbShuIC0gMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBEaWN0ID09IGl0ZW0uR2V0UGFyYW0oKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRlBERlRFWFRfTUNfRE9ORTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQ1BERl9Gb250KglwRm9udCA9IHBUZXh0T2JqLT5HZXRGb250KCk7Ci0gICAgRlhfU1RSU0laRSBuSXRlbXMgPSBhY3RUZXh0LkdldExlbmd0aCgpOwotICAgIGlmIChuSXRlbXMgPCAxKSB7Ci0gICAgICAgIHJldHVybiBGUERGVEVYVF9NQ19QQVNTOwotICAgIH0KLSAgICBiRXhpc3QgPSBGQUxTRTsKLSAgICBmb3IgKEZYX1NUUlNJWkUgaSA9IDA7IGkgPCBuSXRlbXM7IGkrKykgewotICAgICAgICBGWF9XQ0hBUiB3Q2hhciA9IGFjdFRleHQuR2V0QXQoaSk7Ci0gICAgICAgIGlmICgtMSA9PSBwRm9udC0+Q2hhckNvZGVGcm9tVW5pY29kZSh3Q2hhcikpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYkV4aXN0ID0gVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghYkV4aXN0KSB7Ci0gICAgICAgIHJldHVybiBGUERGVEVYVF9NQ19QQVNTOwotICAgIH0KLSAgICBiRXhpc3QgPSBGQUxTRTsKLSAgICBmb3IgKEZYX1NUUlNJWkUgaSA9IDA7IGkgPCBuSXRlbXM7IGkrKykgewotICAgICAgICBGWF9XQ0hBUiB3Q2hhciA9IGFjdFRleHQuR2V0QXQoaSk7Ci0gICAgICAgIGlmICgod0NoYXIgPiAweDgwICYmIHdDaGFyIDwgMHhGRkZEKSB8fCAod0NoYXIgPD0gMHg4MCAmJiBpc3ByaW50KHdDaGFyKSkpIHsKLSAgICAgICAgICAgIGJFeGlzdCA9IFRSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIWJFeGlzdCkgewotICAgICAgICByZXR1cm4gRlBERlRFWFRfTUNfRE9ORTsKLSAgICB9Ci0gICAgcmV0dXJuIEZQREZURVhUX01DX0RFTEFZOwotfQotdm9pZCBDUERGX1RleHRQYWdlOjpQcm9jZXNzTWFya2VkQ29udGVudChQREZURVhUX09iaiBPYmopCi17Ci0gICAgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiA9IE9iai5tX3BUZXh0T2JqOwotICAgIENQREZfQ29udGVudE1hcmtEYXRhKiBwTWFya0RhdGEgPSAoQ1BERl9Db250ZW50TWFya0RhdGEqKXBUZXh0T2JqLT5tX0NvbnRlbnRNYXJrLkdldE9iamVjdCgpOwotICAgIGlmKCFwTWFya0RhdGEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgbkNvbnRlbnRNYXJrID0gcE1hcmtEYXRhLT5Db3VudEl0ZW1zKCk7Ci0gICAgaWYgKG5Db250ZW50TWFyayA8IDEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDRlhfV2lkZVN0cmluZyBhY3RUZXh0OwotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBOVUxMOwotICAgIGludCBuID0gMDsKLSAgICBmb3IgKG4gPSAwOyBuIDwgbkNvbnRlbnRNYXJrOyBuKyspIHsKLSAgICAgICAgQ1BERl9Db250ZW50TWFya0l0ZW0mIGl0ZW0gPSBwTWFya0RhdGEtPkdldEl0ZW0obik7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHRhZ1N0ciA9IChDRlhfQnl0ZVN0cmluZylpdGVtLkdldE5hbWUoKTsKLSAgICAgICAgcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilpdGVtLkdldFBhcmFtKCk7Ci0gICAgICAgIENQREZfU3RyaW5nKiB0ZW1wID0gKENQREZfU3RyaW5nKikocERpY3QgPyBwRGljdC0+R2V0RWxlbWVudChGWF9CU1RSQygiQWN0dWFsVGV4dCIpKSA6IE5VTEwpOwotICAgICAgICBpZiAodGVtcCkgewotICAgICAgICAgICAgYWN0VGV4dCA9IHRlbXAtPkdldFVuaWNvZGVUZXh0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlhfU1RSU0laRSBuSXRlbXMgPSBhY3RUZXh0LkdldExlbmd0aCgpOwotICAgIGlmIChuSXRlbXMgPCAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9Gb250KglwRm9udCA9IHBUZXh0T2JqLT5HZXRGb250KCk7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBmb3JtTWF0cml4ID0gT2JqLm1fZm9ybU1hdHJpeDsKLSAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKLSAgICBwVGV4dE9iai0+R2V0VGV4dE1hdHJpeCgmbWF0cml4KTsKLSAgICBtYXRyaXguQ29uY2F0KGZvcm1NYXRyaXgpOwotICAgIEZYX0ZMT0FUIGZQb3NYID0gcFRleHRPYmotPkdldFBvc1goKTsKLSAgICBGWF9GTE9BVCBmUG9zWSA9IHBUZXh0T2JqLT5HZXRQb3NZKCk7Ci0gICAgaW50IG5DaGFySW5mb0luZGV4ID0gbV9UZXh0QnVmLkdldExlbmd0aCgpOwotICAgIENGWF9GbG9hdFJlY3QgY2hhckJveDsKLSAgICBjaGFyQm94LnRvcCA9IHBUZXh0T2JqLT5tX1RvcDsKLSAgICBjaGFyQm94LmxlZnQgPSBwVGV4dE9iai0+bV9MZWZ0OwotICAgIGNoYXJCb3gucmlnaHQgPSBwVGV4dE9iai0+bV9SaWdodDsKLSAgICBjaGFyQm94LmJvdHRvbSA9IHBUZXh0T2JqLT5tX0JvdHRvbTsKLSAgICBmb3IgKEZYX1NUUlNJWkUgayA9IDA7IGsgPCBuSXRlbXM7IGsrKykgewotICAgICAgICBGWF9XQ0hBUiB3Q2hhciA9IGFjdFRleHQuR2V0QXQoayk7Ci0gICAgICAgIGlmICh3Q2hhciA8PSAweDgwICYmICFpc3ByaW50KHdDaGFyKSkgewotICAgICAgICAgICAgd0NoYXIgPSAweDIwOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3Q2hhciA+PSAweEZGRkQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIFBBR0VDSEFSX0lORk8gY2hhcmluZm87Ci0gICAgICAgIGNoYXJpbmZvLm1fT3JpZ2luWCA9IGZQb3NYOwotICAgICAgICBjaGFyaW5mby5tX09yaWdpblkgPSBmUG9zWTsKLSAgICAgICAgY2hhcmluZm8ubV9JbmRleCA9IG5DaGFySW5mb0luZGV4OwotICAgICAgICBjaGFyaW5mby5tX1VuaWNvZGUgPSB3Q2hhcjsKLSAgICAgICAgY2hhcmluZm8ubV9DaGFyQ29kZSA9IHBGb250LT5DaGFyQ29kZUZyb21Vbmljb2RlKHdDaGFyKTsKLSAgICAgICAgY2hhcmluZm8ubV9GbGFnID0gRlBERlRFWFRfQ0hBUl9QSUVDRTsKLSAgICAgICAgY2hhcmluZm8ubV9wVGV4dE9iaiA9IHBUZXh0T2JqOwotICAgICAgICBjaGFyaW5mby5tX0NoYXJCb3gudG9wID0gY2hhckJveC50b3A7Ci0gICAgICAgIGNoYXJpbmZvLm1fQ2hhckJveC5sZWZ0ID0gY2hhckJveC5sZWZ0OwotICAgICAgICBjaGFyaW5mby5tX0NoYXJCb3gucmlnaHQgPSBjaGFyQm94LnJpZ2h0OwotICAgICAgICBjaGFyaW5mby5tX0NoYXJCb3guYm90dG9tID0gY2hhckJveC5ib3R0b207Ci0gICAgICAgIGNoYXJpbmZvLm1fTWF0cml4LkNvcHkobWF0cml4KTsKLSAgICAgICAgbV9UZW1wVGV4dEJ1Zi5BcHBlbmRDaGFyKHdDaGFyKTsKLSAgICAgICAgbV9UZW1wQ2hhckxpc3QuQWRkKGNoYXJpbmZvKTsKLSAgICB9Ci19Ci12b2lkIENQREZfVGV4dFBhZ2U6OkZpbmRQcmV2aW91c1RleHRPYmplY3Qodm9pZCkKLXsKLSAgICBpZiAobV9UZW1wQ2hhckxpc3QuR2V0U2l6ZSgpIDwgMSAmJiBtX2NoYXJMaXN0LkdldFNpemUoKSA8IDEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBQQUdFQ0hBUl9JTkZPIHByZUNoYXI7Ci0gICAgaWYgKG1fVGVtcENoYXJMaXN0LkdldFNpemUoKSA+PSAxKSB7Ci0gICAgICAgIHByZUNoYXIgPSAqKFBBR0VDSEFSX0lORk8qKW1fVGVtcENoYXJMaXN0LkdldEF0KG1fVGVtcENoYXJMaXN0LkdldFNpemUoKSAtIDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHByZUNoYXIgPSAqKFBBR0VDSEFSX0lORk8qKW1fY2hhckxpc3QuR2V0QXQobV9jaGFyTGlzdC5HZXRTaXplKCkgLSAxKTsKLSAgICB9Ci0gICAgaWYgKHByZUNoYXIubV9wVGV4dE9iaikgewotICAgICAgICBtX3BQcmVUZXh0T2JqID0gcHJlQ2hhci5tX3BUZXh0T2JqOwotICAgIH0KLX0KLXZvaWQgQ1BERl9UZXh0UGFnZTo6UHJvY2Vzc1RleHRPYmplY3QoUERGVEVYVF9PYmogT2JqKQotewotICAgIENQREZfVGV4dE9iamVjdCogcFRleHRPYmogPSBPYmoubV9wVGV4dE9iajsKLSAgICBpZihGWFNZU19mYWJzKHBUZXh0T2JqLT5tX1JpZ2h0IC0gcFRleHRPYmotPm1fTGVmdCkgPCAwLjAxZiApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDRlhfQWZmaW5lTWF0cml4IGZvcm1NYXRyaXggPSBPYmoubV9mb3JtTWF0cml4OwotICAgIENQREZfRm9udCoJcEZvbnQgPSBwVGV4dE9iai0+R2V0Rm9udCgpOwotICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwotICAgIHBUZXh0T2JqLT5HZXRUZXh0TWF0cml4KCZtYXRyaXgpOwotICAgIG1hdHJpeC5Db25jYXQoZm9ybU1hdHJpeCk7Ci0gICAgRlhfSU5UMzIgYlByZU1LQyA9IFByZU1hcmtlZENvbnRlbnQoT2JqKTsKLSAgICBpZiAoRlBERlRFWFRfTUNfRE9ORSA9PSBiUHJlTUtDKSB7Ci0gICAgICAgIG1fcFByZVRleHRPYmogPSBwVGV4dE9iajsKLSAgICAgICAgbV9wZXJNYXRyaXguQ29weShmb3JtTWF0cml4KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICBpZiAobV9wUHJlVGV4dE9iaikgewotICAgICAgICByZXN1bHQgPSBQcm9jZXNzSW5zZXJ0T2JqZWN0KHBUZXh0T2JqLCBmb3JtTWF0cml4KTsKLSAgICAgICAgaWYgKDIgPT0gcmVzdWx0KSB7Ci0gICAgICAgICAgICBtX0N1cmxpbmVSZWN0ID0gQ0ZYX0Zsb2F0UmVjdChPYmoubV9wVGV4dE9iai0+bV9MZWZ0LCBPYmoubV9wVGV4dE9iai0+bV9Cb3R0b20sIE9iai5tX3BUZXh0T2JqLT5tX1JpZ2h0LCBPYmoubV9wVGV4dE9iai0+bV9Ub3ApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9DdXJsaW5lUmVjdC5VbmlvbihDRlhfRmxvYXRSZWN0KE9iai5tX3BUZXh0T2JqLT5tX0xlZnQsIE9iai5tX3BUZXh0T2JqLT5tX0JvdHRvbSwgT2JqLm1fcFRleHRPYmotPm1fUmlnaHQsIE9iai5tX3BUZXh0T2JqLT5tX1RvcCkpOwotICAgICAgICB9Ci0gICAgICAgIFBBR0VDSEFSX0lORk8gZ2VuZXJhdGVDaGFyOwotICAgICAgICBpZiAocmVzdWx0ID09IDEpIHsKLSAgICAgICAgICAgIGlmIChHZW5lcmF0ZUNoYXJJbmZvKFRFWFRfQkxBTktfQ0hBUiwgZ2VuZXJhdGVDaGFyKSkgewotICAgICAgICAgICAgICAgIGlmICghZm9ybU1hdHJpeC5Jc0lkZW50aXR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVDaGFyLm1fTWF0cml4LkNvcHkoZm9ybU1hdHJpeCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fVGVtcFRleHRCdWYuQXBwZW5kQ2hhcihURVhUX0JMQU5LX0NIQVIpOwotICAgICAgICAgICAgICAgIG1fVGVtcENoYXJMaXN0LkFkZChnZW5lcmF0ZUNoYXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYocmVzdWx0ID09IDIpIHsKLSAgICAgICAgICAgIENsb3NlVGVtcExpbmUoKTsKLSAgICAgICAgICAgIGlmKG1fVGV4dEJ1Zi5HZXRTaXplKCkpIHsKLSAgICAgICAgICAgICAgICBpZihtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9UZXh0QnVmLkFwcGVuZENoYXIoVEVYVF9SRVRVUk5fQ0hBUik7Ci0gICAgICAgICAgICAgICAgICAgIG1fVGV4dEJ1Zi5BcHBlbmRDaGFyKFRFWFRfTElORUZFRURfQ0hBUik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoR2VuZXJhdGVDaGFySW5mbyhURVhUX1JFVFVSTl9DSEFSLCBnZW5lcmF0ZUNoYXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX1RleHRCdWYuQXBwZW5kQ2hhcihURVhUX1JFVFVSTl9DSEFSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm9ybU1hdHJpeC5Jc0lkZW50aXR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUNoYXIubV9NYXRyaXguQ29weShmb3JtTWF0cml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1fY2hhckxpc3QuQWRkKGdlbmVyYXRlQ2hhcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoR2VuZXJhdGVDaGFySW5mbyhURVhUX0xJTkVGRUVEX0NIQVIsIGdlbmVyYXRlQ2hhcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fVGV4dEJ1Zi5BcHBlbmRDaGFyKFRFWFRfTElORUZFRURfQ0hBUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvcm1NYXRyaXguSXNJZGVudGl0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVDaGFyLm1fTWF0cml4LkNvcHkoZm9ybU1hdHJpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2NoYXJMaXN0LkFkZChnZW5lcmF0ZUNoYXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PSAzICYmICFtX1BhcnNlT3B0aW9ucy5tX2JPdXRwdXRIeXBoZW4pIHsKLSAgICAgICAgICAgIEZYX0lOVDMyIG5DaGFycyA9IHBUZXh0T2JqLT5Db3VudENoYXJzKCk7Ci0gICAgICAgICAgICBpZiAobkNoYXJzID09IDEpIHsKLSAgICAgICAgICAgICAgICBDUERGX1RleHRPYmplY3RJdGVtIGl0ZW07Ci0gICAgICAgICAgICAgICAgcFRleHRPYmotPkdldENoYXJJbmZvKDAsICZpdGVtKTsKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c3RySXRlbSA9IHBUZXh0T2JqLT5HZXRGb250KCktPlVuaWNvZGVGcm9tQ2hhckNvZGUoaXRlbS5tX0NoYXJDb2RlKTsKLSAgICAgICAgICAgICAgICBpZih3c3RySXRlbS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgd3N0ckl0ZW0gKz0gKEZYX1dDSEFSKWl0ZW0ubV9DaGFyQ29kZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhfV0NIQVIgY3VyQ2hhciA9IHdzdHJJdGVtLkdldEF0KDApOwotICAgICAgICAgICAgICAgIGlmICgweDJEID09IGN1ckNoYXIgfHwgMHhBRCA9PSBjdXJDaGFyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAobV9UZW1wVGV4dEJ1Zi5HZXRTaXplKCkgPiAwICYmIG1fVGVtcFRleHRCdWYuR2V0V2lkZVN0cmluZygpLkdldEF0KG1fVGVtcFRleHRCdWYuR2V0TGVuZ3RoKCkgLSAxKSA9PSAweDIwKSB7Ci0gICAgICAgICAgICAgICAgbV9UZW1wVGV4dEJ1Zi5EZWxldGUobV9UZW1wVGV4dEJ1Zi5HZXRMZW5ndGgoKSAtIDEsIDEpOwotICAgICAgICAgICAgICAgIG1fVGVtcENoYXJMaXN0LkRlbGV0ZShtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCkgLSAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFBBR0VDSEFSX0lORk8qIGNoYSA9IChQQUdFQ0hBUl9JTkZPKiltX1RlbXBDaGFyTGlzdC5HZXRBdChtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCkgLSAxKTsKLSAgICAgICAgICAgIG1fVGVtcFRleHRCdWYuRGVsZXRlKG1fVGVtcFRleHRCdWYuR2V0TGVuZ3RoKCkgLSAxLCAxKTsKLSAgICAgICAgICAgIGNoYS0+bV9Vbmljb2RlID0gMHgyOwotICAgICAgICAgICAgY2hhLT5tX0ZsYWcgPSBGUERGVEVYVF9DSEFSX0hZUEhFTjsKLSAgICAgICAgICAgIG1fVGVtcFRleHRCdWYuQXBwZW5kQ2hhcigweGZmZmUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9DdXJsaW5lUmVjdCA9IENGWF9GbG9hdFJlY3QoT2JqLm1fcFRleHRPYmotPm1fTGVmdCwgT2JqLm1fcFRleHRPYmotPm1fQm90dG9tLCBPYmoubV9wVGV4dE9iai0+bV9SaWdodCwgT2JqLm1fcFRleHRPYmotPm1fVG9wKTsKLSAgICB9Ci0gICAgaWYgKEZQREZURVhUX01DX0RFTEFZID09IGJQcmVNS0MpIHsKLSAgICAgICAgUHJvY2Vzc01hcmtlZENvbnRlbnQoT2JqKTsKLSAgICAgICAgbV9wUHJlVGV4dE9iaiA9IHBUZXh0T2JqOwotICAgICAgICBtX3Blck1hdHJpeC5Db3B5KGZvcm1NYXRyaXgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fcFByZVRleHRPYmogPSBwVGV4dE9iajsKLSAgICBtX3Blck1hdHJpeC5Db3B5KGZvcm1NYXRyaXgpOwotICAgIGludCBuSXRlbXMgPSBwVGV4dE9iai0+Q291bnRJdGVtcygpOwotICAgIEZYX0ZMT0FUIGJhc2VTcGFjZSA9IF9DYWxjdWxhdGVCYXNlU3BhY2UocFRleHRPYmosIG1hdHJpeCk7Ci0KLSAgICBjb25zdCBGWF9CT09MIGJSMkwgPSBJc1JpZ2h0VG9MZWZ0KHBUZXh0T2JqLCBwRm9udCwgbkl0ZW1zKTsKLSAgICBjb25zdCBGWF9CT09MIGJJc0JpZGlBbmRNaXJyb3JJbnZlcnNlID0KLSAgICAgICAgYlIyTCAmJiAobWF0cml4LmEgKiBtYXRyaXguZCAtIG1hdHJpeC5iICogbWF0cml4LmMpIDwgMDsKLSAgICBGWF9JTlQzMiBpQnVmU3RhcnRBcHBlbmQgPSBtX1RlbXBUZXh0QnVmLkdldExlbmd0aCgpOwotICAgIEZYX0lOVDMyIGlDaGFyTGlzdFN0YXJ0QXBwZW5kID0gbV9UZW1wQ2hhckxpc3QuR2V0U2l6ZSgpOwotCi0gICAgRlhfRkxPQVQgc3BhY2luZyA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuSXRlbXM7IGkrKykgewotICAgICAgICBDUERGX1RleHRPYmplY3RJdGVtIGl0ZW07Ci0gICAgICAgIFBBR0VDSEFSX0lORk8gY2hhcmluZm87Ci0gICAgICAgIGNoYXJpbmZvLm1fT3JpZ2luWCA9IDA7Ci0gICAgICAgIGNoYXJpbmZvLm1fT3JpZ2luWSA9IDA7Ci0gICAgICAgIHBUZXh0T2JqLT5HZXRJdGVtSW5mbyhpLCAmaXRlbSk7Ci0gICAgICAgIGlmIChpdGVtLm1fQ2hhckNvZGUgPT0gKEZYX0RXT1JEKSAtIDEpIHsKLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHN0ciA9IG1fVGVtcFRleHRCdWYuR2V0V2lkZVN0cmluZygpOwotICAgICAgICAgICAgaWYoc3RyLklzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHN0ciA9IG1fVGV4dEJ1Zi5HZXRXaWRlU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RyLklzRW1wdHkoKSB8fCBzdHIuR2V0QXQoc3RyLkdldExlbmd0aCgpIC0gMSkgPT0gVEVYVF9CTEFOS19DSEFSKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9GTE9BVCBmb250c2l6ZV9oID0gcFRleHRPYmotPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplSCgpOwotICAgICAgICAgICAgc3BhY2luZyA9IC1mb250c2l6ZV9oICogaXRlbS5tX09yaWdpblggLyAxMDAwOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRkxPQVQgY2hhclNwYWNlID0gcFRleHRPYmotPm1fVGV4dFN0YXRlLkdldE9iamVjdCgpLT5tX0NoYXJTcGFjZTsKLSAgICAgICAgaWYgKGNoYXJTcGFjZSA+IDAuMDAxKSB7Ci0gICAgICAgICAgICBzcGFjaW5nICs9IG1hdHJpeC5UcmFuc2Zvcm1EaXN0YW5jZShjaGFyU3BhY2UpOwotICAgICAgICB9IGVsc2UgaWYoY2hhclNwYWNlIDwgLTAuMDAxKSB7Ci0gICAgICAgICAgICBzcGFjaW5nIC09IG1hdHJpeC5UcmFuc2Zvcm1EaXN0YW5jZShGWFNZU19mYWJzKGNoYXJTcGFjZSkpOwotICAgICAgICB9Ci0gICAgICAgIHNwYWNpbmcgLT0gYmFzZVNwYWNlOwotICAgICAgICBpZiAoc3BhY2luZyAmJiBpID4gMCkgewotICAgICAgICAgICAgaW50IGxhc3Rfd2lkdGggPSAwOwotICAgICAgICAgICAgRlhfRkxPQVQgZm9udHNpemVfaCA9IHBUZXh0T2JqLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZUgoKTsKLSAgICAgICAgICAgIEZYX0RXT1JEIHNwYWNlX2NoYXJjb2RlID0gcEZvbnQtPkNoYXJDb2RlRnJvbVVuaWNvZGUoJyAnKTsKLSAgICAgICAgICAgIEZYX0ZMT0FUIHRocmVzaG9sZCA9IDA7Ci0gICAgICAgICAgICBpZiAoc3BhY2VfY2hhcmNvZGUgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICB0aHJlc2hvbGQgPSBmb250c2l6ZV9oICogcEZvbnQtPkdldENoYXJXaWR0aEYoc3BhY2VfY2hhcmNvZGUpIC8gMTAwMCA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGhyZXNob2xkID4gZm9udHNpemVfaCAvIDMpIHsKLSAgICAgICAgICAgICAgICB0aHJlc2hvbGQgPSAwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJlc2hvbGQgLz0gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0aHJlc2hvbGQgPT0gMCkgewotICAgICAgICAgICAgICAgIHRocmVzaG9sZCA9IGZvbnRzaXplX2g7Ci0gICAgICAgICAgICAgICAgaW50IHRoaXNfd2lkdGggPSBGWFNZU19hYnMoR2V0Q2hhcldpZHRoKGl0ZW0ubV9DaGFyQ29kZSwgcEZvbnQpKTsKLSAgICAgICAgICAgICAgICB0aHJlc2hvbGQgPSB0aGlzX3dpZHRoID4gbGFzdF93aWR0aCA/IChGWF9GTE9BVCl0aGlzX3dpZHRoIDogKEZYX0ZMT0FUKWxhc3Rfd2lkdGg7Ci0gICAgICAgICAgICAgICAgdGhyZXNob2xkID0gX05vcm1hbGl6ZVRocmVzaG9sZCh0aHJlc2hvbGQpOwotICAgICAgICAgICAgICAgIHRocmVzaG9sZCA9IGZvbnRzaXplX2ggKiB0aHJlc2hvbGQgLyAxMDAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRocmVzaG9sZCAmJiAoc3BhY2luZyAmJiBzcGFjaW5nID49IHRocmVzaG9sZCkgKSB7Ci0gICAgICAgICAgICAgICAgY2hhcmluZm8ubV9Vbmljb2RlID0gVEVYVF9CTEFOS19DSEFSOwotICAgICAgICAgICAgICAgIGNoYXJpbmZvLm1fRmxhZyA9IEZQREZURVhUX0NIQVJfR0VORVJBVEVEOwotICAgICAgICAgICAgICAgIGNoYXJpbmZvLm1fcFRleHRPYmogPSBwVGV4dE9iajsKLSAgICAgICAgICAgICAgICBjaGFyaW5mby5tX0luZGV4ID0gbV9UZXh0QnVmLkdldExlbmd0aCgpOwotICAgICAgICAgICAgICAgIG1fVGVtcFRleHRCdWYuQXBwZW5kQ2hhcihURVhUX0JMQU5LX0NIQVIpOwotICAgICAgICAgICAgICAgIGNoYXJpbmZvLm1fQ2hhckNvZGUgPSAtMTsKLSAgICAgICAgICAgICAgICBjaGFyaW5mby5tX01hdHJpeC5Db3B5KGZvcm1NYXRyaXgpOwotICAgICAgICAgICAgICAgIG1hdHJpeC5UcmFuc2Zvcm0oaXRlbS5tX09yaWdpblgsIGl0ZW0ubV9PcmlnaW5ZLCBjaGFyaW5mby5tX09yaWdpblgsIGNoYXJpbmZvLm1fT3JpZ2luWSk7Ci0gICAgICAgICAgICAgICAgY2hhcmluZm8ubV9DaGFyQm94ID0gQ0ZYX0Zsb2F0UmVjdChjaGFyaW5mby5tX09yaWdpblgsIGNoYXJpbmZvLm1fT3JpZ2luWSwgY2hhcmluZm8ubV9PcmlnaW5YLCBjaGFyaW5mby5tX09yaWdpblkpOwotICAgICAgICAgICAgICAgIG1fVGVtcENoYXJMaXN0LkFkZChjaGFyaW5mbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaXRlbS5tX0NoYXJDb2RlID09IChGWF9EV09SRCkgLSAxKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3BhY2luZyA9IDA7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzdHJJdGVtID0gcEZvbnQtPlVuaWNvZGVGcm9tQ2hhckNvZGUoaXRlbS5tX0NoYXJDb2RlKTsKLSAgICAgICAgRlhfQk9PTCBiTm9Vbmljb2RlID0gRkFMU0U7Ci0gICAgICAgIEZYX1dDSEFSIHdDaGFyID0gd3N0ckl0ZW0uR2V0QXQoMCk7Ci0gICAgICAgIGlmICgod3N0ckl0ZW0uSXNFbXB0eSgpIHx8IHdDaGFyID09IDApICYmIGl0ZW0ubV9DaGFyQ29kZSkgewotICAgICAgICAgICAgaWYod3N0ckl0ZW0uSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgd3N0ckl0ZW0gKz0gKEZYX1dDSEFSKWl0ZW0ubV9DaGFyQ29kZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgd3N0ckl0ZW0uU2V0QXQoMCwgKEZYX1dDSEFSKWl0ZW0ubV9DaGFyQ29kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiTm9Vbmljb2RlID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBjaGFyaW5mby5tX0luZGV4ID0gLTE7Ci0gICAgICAgIGNoYXJpbmZvLm1fQ2hhckNvZGUgPSBpdGVtLm1fQ2hhckNvZGU7Ci0gICAgICAgIGlmKGJOb1VuaWNvZGUpIHsKLSAgICAgICAgICAgIGNoYXJpbmZvLm1fRmxhZyA9IEZQREZURVhUX0NIQVJfVU5VTklDT0RFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hhcmluZm8ubV9GbGFnID0gRlBERlRFWFRfQ0hBUl9OT1JNQUw7Ci0gICAgICAgIH0KLSAgICAgICAgY2hhcmluZm8ubV9wVGV4dE9iaiA9IHBUZXh0T2JqOwotICAgICAgICBjaGFyaW5mby5tX09yaWdpblggPSAwLCBjaGFyaW5mby5tX09yaWdpblkgPSAwOwotICAgICAgICBtYXRyaXguVHJhbnNmb3JtKGl0ZW0ubV9PcmlnaW5YLCBpdGVtLm1fT3JpZ2luWSwgY2hhcmluZm8ubV9PcmlnaW5YLCBjaGFyaW5mby5tX09yaWdpblkpOwotICAgICAgICBGWF9SRUNUIHJlY3QoMCwgMCwgMCwgMCk7Ci0gICAgICAgIHJlY3QuSW50ZXJzZWN0KDAsIDAsIDAsIDApOwotICAgICAgICBjaGFyaW5mby5tX3BUZXh0T2JqLT5HZXRGb250KCktPkdldENoYXJCQm94KGNoYXJpbmZvLm1fQ2hhckNvZGUsIHJlY3QpOwotICAgICAgICBjaGFyaW5mby5tX0NoYXJCb3gudG9wID0gcmVjdC50b3AgKiBwVGV4dE9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDAgKyBpdGVtLm1fT3JpZ2luWTsKLSAgICAgICAgY2hhcmluZm8ubV9DaGFyQm94LmxlZnQgPSByZWN0LmxlZnQgKiBwVGV4dE9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDAgKyBpdGVtLm1fT3JpZ2luWDsKLSAgICAgICAgY2hhcmluZm8ubV9DaGFyQm94LnJpZ2h0ID0gcmVjdC5yaWdodCAqIHBUZXh0T2JqLT5HZXRGb250U2l6ZSgpIC8gMTAwMCArIGl0ZW0ubV9PcmlnaW5YOwotICAgICAgICBjaGFyaW5mby5tX0NoYXJCb3guYm90dG9tID0gcmVjdC5ib3R0b20gKiBwVGV4dE9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDAgKyBpdGVtLm1fT3JpZ2luWTsKLSAgICAgICAgaWYgKGZhYnNmKGNoYXJpbmZvLm1fQ2hhckJveC50b3AgLSBjaGFyaW5mby5tX0NoYXJCb3guYm90dG9tKSA8IDAuMDFmKSB7Ci0gICAgICAgICAgICBjaGFyaW5mby5tX0NoYXJCb3gudG9wID0gY2hhcmluZm8ubV9DaGFyQm94LmJvdHRvbSArIHBUZXh0T2JqLT5HZXRGb250U2l6ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmYWJzZihjaGFyaW5mby5tX0NoYXJCb3gucmlnaHQgLSBjaGFyaW5mby5tX0NoYXJCb3gubGVmdCkgPCAwLjAxZikgewotICAgICAgICAgICAgY2hhcmluZm8ubV9DaGFyQm94LnJpZ2h0ID0gY2hhcmluZm8ubV9DaGFyQm94LmxlZnQgKyBwVGV4dE9iai0+R2V0Q2hhcldpZHRoKGNoYXJpbmZvLm1fQ2hhckNvZGUpOwotICAgICAgICB9Ci0gICAgICAgIG1hdHJpeC5UcmFuc2Zvcm1SZWN0KGNoYXJpbmZvLm1fQ2hhckJveCk7Ci0gICAgICAgIGNoYXJpbmZvLm1fTWF0cml4LkNvcHkobWF0cml4KTsKLSAgICAgICAgaWYgKHdzdHJJdGVtLklzRW1wdHkoKSkgewotICAgICAgICAgICAgY2hhcmluZm8ubV9Vbmljb2RlID0gMDsKLSAgICAgICAgICAgIG1fVGVtcENoYXJMaXN0LkFkZChjaGFyaW5mbyk7Ci0gICAgICAgICAgICBtX1RlbXBUZXh0QnVmLkFwcGVuZENoYXIoMHhmZmZlKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IG5Ub3RhbCA9IHdzdHJJdGVtLkdldExlbmd0aCgpOwotICAgICAgICAgICAgRlhfQk9PTCBiRGVsID0gRkFMU0U7Ci0gICAgICAgICAgICBjb25zdCBpbnQgY291bnQgPSBzdGQ6Om1pbihtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCksIDcpOwotICAgICAgICAgICAgRlhfRkxPQVQgdGhyZXNob2xkID0gY2hhcmluZm8ubV9NYXRyaXguVHJhbnNmb3JtWERpc3RhbmNlKChGWF9GTE9BVClURVhUX0NIQVJSQVRJT19HQVBERUxUQSAqIHBUZXh0T2JqLT5HZXRGb250U2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoaW50IG4gPSBtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCk7Ci0gICAgICAgICAgICAgICAgIG4gPiBtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCkgLSBjb3VudDsKLSAgICAgICAgICAgICAgICAgbi0tKSB7Ci0gICAgICAgICAgICAgICAgUEFHRUNIQVJfSU5GTyogY2hhcmluZm8xID0gKFBBR0VDSEFSX0lORk8qKW1fVGVtcENoYXJMaXN0LkdldEF0KG4gLSAxKTsKLSAgICAgICAgICAgICAgICBpZihjaGFyaW5mbzEtPm1fQ2hhckNvZGUgPT0gY2hhcmluZm8ubV9DaGFyQ29kZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmluZm8xLT5tX3BUZXh0T2JqLT5HZXRGb250KCkgPT0gY2hhcmluZm8ubV9wVGV4dE9iai0+R2V0Rm9udCgpICAmJgotICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfZmFicyhjaGFyaW5mbzEtPm1fT3JpZ2luWCAtIGNoYXJpbmZvLm1fT3JpZ2luWCkgPCB0aHJlc2hvbGQgICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19mYWJzKGNoYXJpbmZvMS0+bV9PcmlnaW5ZIC0gY2hhcmluZm8ubV9PcmlnaW5ZKSA8IHRocmVzaG9sZCkgewotICAgICAgICAgICAgICAgICAgICBiRGVsID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIWJEZWwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBuSW5kZXggPSAwOyBuSW5kZXggPCBuVG90YWw7IG5JbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXJpbmZvLm1fVW5pY29kZSA9IHdzdHJJdGVtLkdldEF0KG5JbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGFyaW5mby5tX1VuaWNvZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJpbmZvLm1fSW5kZXggPSBtX1RleHRCdWYuR2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX1RlbXBUZXh0QnVmLkFwcGVuZENoYXIoY2hhcmluZm8ubV9Vbmljb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fVGVtcFRleHRCdWYuQXBwZW5kQ2hhcigweGZmZmUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1fVGVtcENoYXJMaXN0LkFkZChjaGFyaW5mbyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmKGkgPT0gMCkgewotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHN0ciA9IG1fVGVtcFRleHRCdWYuR2V0V2lkZVN0cmluZygpOwotICAgICAgICAgICAgICAgIGlmICghc3RyLklzRW1wdHkoKSAmJiBzdHIuR2V0QXQoc3RyLkdldExlbmd0aCgpIC0gMSkgPT0gVEVYVF9CTEFOS19DSEFSKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fVGVtcFRleHRCdWYuRGVsZXRlKG1fVGVtcFRleHRCdWYuR2V0TGVuZ3RoKCkgLSAxLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgbV9UZW1wQ2hhckxpc3QuRGVsZXRlKG1fVGVtcENoYXJMaXN0LkdldFNpemUoKSAtIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoYklzQmlkaUFuZE1pcnJvckludmVyc2UpIHsKLSAgICAgICAgU3dhcFRlbXBUZXh0QnVmKGlDaGFyTGlzdFN0YXJ0QXBwZW5kLCBpQnVmU3RhcnRBcHBlbmQpOwotICAgIH0KLX0KLXZvaWQgQ1BERl9UZXh0UGFnZTo6U3dhcFRlbXBUZXh0QnVmKEZYX0lOVDMyIGlDaGFyTGlzdFN0YXJ0QXBwZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgaUJ1ZlN0YXJ0QXBwZW5kKQotewotICAgIEZYX0lOVDMyIGksIGo7Ci0gICAgaSA9IGlDaGFyTGlzdFN0YXJ0QXBwZW5kOwotICAgIGogPSBtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCkgLSAxOwotICAgIGZvciAoOyBpIDwgajsgaSsrLCBqLS0pIHsKLSAgICAgICAgc3RkOjpzd2FwKG1fVGVtcENoYXJMaXN0W2ldLCBtX1RlbXBDaGFyTGlzdFtqXSk7Ci0gICAgICAgIHN0ZDo6c3dhcChtX1RlbXBDaGFyTGlzdFtpXS5tX0luZGV4LCBtX1RlbXBDaGFyTGlzdFtqXS5tX0luZGV4KTsKLSAgICB9Ci0gICAgRlhfV0NIQVIgKiBwVGVtcEJ1ZmZlciA9IG1fVGVtcFRleHRCdWYuR2V0QnVmZmVyKCk7Ci0gICAgaSA9IGlCdWZTdGFydEFwcGVuZDsKLSAgICBqID0gbV9UZW1wVGV4dEJ1Zi5HZXRMZW5ndGgoKSAtIDE7Ci0gICAgZm9yICg7IGkgPCBqOyBpKyssIGotLSkgewotICAgICAgICBzdGQ6OnN3YXAocFRlbXBCdWZmZXJbaV0sIHBUZW1wQnVmZmVyW2pdKTsKLSAgICB9Cit2b2lkIENQREZfVGV4dFBhZ2U6OlN3YXBUZW1wVGV4dEJ1ZihpbnQzMl90IGlDaGFyTGlzdFN0YXJ0QXBwZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQnVmU3RhcnRBcHBlbmQpIHsKKyAgaW50MzJfdCBpLCBqOworICBpID0gaUNoYXJMaXN0U3RhcnRBcHBlbmQ7CisgIGogPSBtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCkgLSAxOworICBmb3IgKDsgaSA8IGo7IGkrKywgai0tKSB7CisgICAgc3RkOjpzd2FwKG1fVGVtcENoYXJMaXN0W2ldLCBtX1RlbXBDaGFyTGlzdFtqXSk7CisgICAgc3RkOjpzd2FwKG1fVGVtcENoYXJMaXN0W2ldLm1fSW5kZXgsIG1fVGVtcENoYXJMaXN0W2pdLm1fSW5kZXgpOworICB9CisgIEZYX1dDSEFSKiBwVGVtcEJ1ZmZlciA9IG1fVGVtcFRleHRCdWYuR2V0QnVmZmVyKCk7CisgIGkgPSBpQnVmU3RhcnRBcHBlbmQ7CisgIGogPSBtX1RlbXBUZXh0QnVmLkdldExlbmd0aCgpIC0gMTsKKyAgZm9yICg7IGkgPCBqOyBpKyssIGotLSkgeworICAgIHN0ZDo6c3dhcChwVGVtcEJ1ZmZlcltpXSwgcFRlbXBCdWZmZXJbal0pOworICB9CiB9CiBGWF9CT09MIENQREZfVGV4dFBhZ2U6OklzUmlnaHRUb0xlZnQoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0ZvbnQqIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuSXRlbXMpIGNvbnN0Ci17Ci0gICAgSUZYX0JpZGlDaGFyKiBCaWRpQ2hhciA9IElGWF9CaWRpQ2hhcjo6Q3JlYXRlKCk7Ci0gICAgRlhfSU5UMzIgblIyTCA9IDA7Ci0gICAgRlhfSU5UMzIgbkwyUiA9IDA7Ci0gICAgRlhfSU5UMzIgc3RhcnQgPSAwLCBjb3VudCA9IDA7Ci0gICAgQ1BERl9UZXh0T2JqZWN0SXRlbSBpdGVtOwotICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBuSXRlbXM7IGkrKykgewotICAgICAgICBwVGV4dE9iai0+R2V0SXRlbUluZm8oaSwgJml0ZW0pOwotICAgICAgICBpZiAoaXRlbS5tX0NoYXJDb2RlID09IChGWF9EV09SRCktMSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3N0ckl0ZW0gPSBwRm9udC0+VW5pY29kZUZyb21DaGFyQ29kZShpdGVtLm1fQ2hhckNvZGUpOwotICAgICAgICBGWF9XQ0hBUiB3Q2hhciA9IHdzdHJJdGVtLkdldEF0KDApOwotICAgICAgICBpZiAoKHdzdHJJdGVtLklzRW1wdHkoKSB8fCB3Q2hhciA9PSAwKSAmJiBpdGVtLm1fQ2hhckNvZGUpIHsKLSAgICAgICAgICAgIHdDaGFyID0gKEZYX1dDSEFSKWl0ZW0ubV9DaGFyQ29kZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXdDaGFyKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQmlkaUNoYXIgJiYgQmlkaUNoYXItPkFwcGVuZENoYXIod0NoYXIpKSB7Ci0gICAgICAgICAgICBGWF9JTlQzMiByZXQgPSBCaWRpQ2hhci0+R2V0QmlkaUluZm8oc3RhcnQsIGNvdW50KTsKLSAgICAgICAgICAgIGlmIChyZXQgPT0gMikgewotICAgICAgICAgICAgICAgIG5SMkwrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHJldCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgbkwyUisrOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5JdGVtcykgY29uc3QgeworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0JpZGlDaGFyPiBwQmlkaUNoYXIobmV3IENGWF9CaWRpQ2hhcik7CisgIGludDMyX3QgblIyTCA9IDA7CisgIGludDMyX3QgbkwyUiA9IDA7CisgIGludDMyX3Qgc3RhcnQgPSAwLCBjb3VudCA9IDA7CisgIENQREZfVGV4dE9iamVjdEl0ZW0gaXRlbTsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkl0ZW1zOyBpKyspIHsKKyAgICBwVGV4dE9iai0+R2V0SXRlbUluZm8oaSwgJml0ZW0pOworICAgIGlmIChpdGVtLm1fQ2hhckNvZGUgPT0gKEZYX0RXT1JEKS0xKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgaWYgKEJpZGlDaGFyICYmIEJpZGlDaGFyLT5FbmRDaGFyKCkpIHsKLSAgICAgICAgRlhfSU5UMzIgcmV0ID0gQmlkaUNoYXItPkdldEJpZGlJbmZvKHN0YXJ0LCBjb3VudCk7Ci0gICAgICAgIGlmIChyZXQgPT0gMikgewotICAgICAgICAgICAgblIyTCsrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHJldCA9PSAxKSB7Ci0gICAgICAgICAgICBuTDJSKys7Ci0gICAgICAgIH0KKyAgICBDRlhfV2lkZVN0cmluZyB3c3RySXRlbSA9IHBGb250LT5Vbmljb2RlRnJvbUNoYXJDb2RlKGl0ZW0ubV9DaGFyQ29kZSk7CisgICAgRlhfV0NIQVIgd0NoYXIgPSB3c3RySXRlbS5HZXRBdCgwKTsKKyAgICBpZiAoKHdzdHJJdGVtLklzRW1wdHkoKSB8fCB3Q2hhciA9PSAwKSAmJiBpdGVtLm1fQ2hhckNvZGUpIHsKKyAgICAgIHdDaGFyID0gKEZYX1dDSEFSKWl0ZW0ubV9DaGFyQ29kZTsKICAgICB9Ci0gICAgaWYgKEJpZGlDaGFyKQotICAgICAgQmlkaUNoYXItPlJlbGVhc2UoKTsKLSAgICByZXR1cm4gKG5SMkwgPiAwICYmIG5SMkwgPj0gbkwyUik7CisgICAgaWYgKCF3Q2hhcikgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChwQmlkaUNoYXItPkFwcGVuZENoYXIod0NoYXIpKSB7CisgICAgICBDRlhfQmlkaUNoYXI6OkRpcmVjdGlvbiByZXQgPSBwQmlkaUNoYXItPkdldEJpZGlJbmZvKCZzdGFydCwgJmNvdW50KTsKKyAgICAgIGlmIChyZXQgPT0gQ0ZYX0JpZGlDaGFyOjpSSUdIVCkgeworICAgICAgICBuUjJMKys7CisgICAgICB9IGVsc2UgaWYgKHJldCA9PSBDRlhfQmlkaUNoYXI6OkxFRlQpIHsKKyAgICAgICAgbkwyUisrOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAocEJpZGlDaGFyLT5FbmRDaGFyKCkpIHsKKyAgICBDRlhfQmlkaUNoYXI6OkRpcmVjdGlvbiByZXQgPSBwQmlkaUNoYXItPkdldEJpZGlJbmZvKCZzdGFydCwgJmNvdW50KTsKKyAgICBpZiAocmV0ID09IENGWF9CaWRpQ2hhcjo6UklHSFQpIHsKKyAgICAgIG5SMkwrKzsKKyAgICB9IGVsc2UgaWYgKHJldCA9PSBDRlhfQmlkaUNoYXI6OkxFRlQpIHsKKyAgICAgIG5MMlIrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChuUjJMID4gMCAmJiBuUjJMID49IG5MMlIpOwogfQotRlhfSU5UMzIgQ1BERl9UZXh0UGFnZTo6R2V0VGV4dE9iamVjdFdyaXRpbmdNb2RlKGNvbnN0IENQREZfVGV4dE9iamVjdCogcFRleHRPYmopCi17Ci0gICAgRlhfSU5UMzIgbkNoYXJzID0gcFRleHRPYmotPkNvdW50Q2hhcnMoKTsKLSAgICBpZiAobkNoYXJzID09IDEpIHsKLSAgICAgICAgcmV0dXJuIG1fVGV4dGxpbmVEaXI7Ci0gICAgfQotICAgIENQREZfVGV4dE9iamVjdEl0ZW0gZmlyc3QsIGxhc3Q7Ci0gICAgcFRleHRPYmotPkdldENoYXJJbmZvKDAsICZmaXJzdCk7Ci0gICAgcFRleHRPYmotPkdldENoYXJJbmZvKG5DaGFycyAtIDEsICZsYXN0KTsKLSAgICBDRlhfTWF0cml4IHRleHRNYXRyaXg7Ci0gICAgcFRleHRPYmotPkdldFRleHRNYXRyaXgoJnRleHRNYXRyaXgpOwotICAgIHRleHRNYXRyaXguVHJhbnNmb3JtUG9pbnQoZmlyc3QubV9PcmlnaW5YLCBmaXJzdC5tX09yaWdpblkpOwotICAgIHRleHRNYXRyaXguVHJhbnNmb3JtUG9pbnQobGFzdC5tX09yaWdpblgsIGxhc3QubV9PcmlnaW5ZKTsKLSAgICBGWF9GTE9BVCBkWCA9IEZYU1lTX2ZhYnMobGFzdC5tX09yaWdpblggLSBmaXJzdC5tX09yaWdpblgpOwotICAgIEZYX0ZMT0FUIGRZID0gRlhTWVNfZmFicyhsYXN0Lm1fT3JpZ2luWSAtIGZpcnN0Lm1fT3JpZ2luWSk7Ci0gICAgaWYgKGRYIDw9IDAuMDAwMWYgJiYgZFkgPD0gMC4wMDAxZikgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIENGWF9WZWN0b3JGIHY7Ci0gICAgdi5TZXQoZFgsIGRZKTsKLSAgICB2Lk5vcm1hbGl6ZSgpOwotICAgIGlmICh2LnkgPD0gMC4wODcyZikgewotICAgICAgICBpZiAodi54IDw9IDAuMDg3MmYpIHsKLSAgICAgICAgICAgIHJldHVybiBtX1RleHRsaW5lRGlyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0gZWxzZSBpZiAodi54IDw9IDAuMDg3MmYpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiBtX1RleHRsaW5lRGlyOwotfQotRlhfQk9PTCBDUERGX1RleHRQYWdlOjpJc0h5cGhlbihGWF9XQ0hBUiBjdXJDaGFyKQotewotICAgIENGWF9XaWRlU3RyaW5nIHN0ckN1clRleHQgPSBtX1RlbXBUZXh0QnVmLkdldFdpZGVTdHJpbmcoKTsKLSAgICBpZihzdHJDdXJUZXh0LkdldExlbmd0aCgpID09IDApIHsKLSAgICAgICAgc3RyQ3VyVGV4dCA9IG1fVGV4dEJ1Zi5HZXRXaWRlU3RyaW5nKCk7Ci0gICAgfQotICAgIEZYX1NUUlNJWkUgbkNvdW50ID0gc3RyQ3VyVGV4dC5HZXRMZW5ndGgoKTsKLSAgICBpbnQgbkluZGV4ID0gbkNvdW50IC0gMTsKLSAgICBGWF9XQ0hBUiB3Y1RtcCA9IHN0ckN1clRleHQuR2V0QXQobkluZGV4KTsKLSAgICB3aGlsZSh3Y1RtcCA9PSAweDIwICYmIG5JbmRleCA8PSBuQ291bnQgLSAxICYmIG5JbmRleCA+PSAwKSB7Ci0gICAgICAgIHdjVG1wID0gc3RyQ3VyVGV4dC5HZXRBdCgtLW5JbmRleCk7Ci0gICAgfQotICAgIGlmICgweDJEID09IHdjVG1wIHx8IDB4QUQgPT0gd2NUbXApIHsKLSAgICAgICAgaWYgKC0tbkluZGV4ID4gMCkgewotICAgICAgICAgICAgRlhfV0NIQVIgcHJlQ2hhciA9IHN0ckN1clRleHQuR2V0QXQoKG5JbmRleCkpOwotICAgICAgICAgICAgaWYgKCgocHJlQ2hhciA+PSBMJ0EnICYmIHByZUNoYXIgPD0gTCdaJykgfHwgKHByZUNoYXIgPj0gTCdhJyAmJiBwcmVDaGFyIDw9IEwneicpKQotICAgICAgICAgICAgICAgICAgICAmJiAoKGN1ckNoYXIgPj0gTCdBJyAmJiBjdXJDaGFyIDw9IEwnWicpIHx8IChjdXJDaGFyID49IEwnYScgJiYgY3VyQ2hhciA8PSBMJ3onKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnQgc2l6ZSA9IG1fVGVtcENoYXJMaXN0LkdldFNpemUoKTsKLSAgICAgICAgUEFHRUNIQVJfSU5GTyBwcmVDaGFyOwotICAgICAgICBpZiAoc2l6ZSkgewotICAgICAgICAgICAgcHJlQ2hhciA9IChQQUdFQ0hBUl9JTkZPKW1fVGVtcENoYXJMaXN0W3NpemUgLSAxXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNpemUgPSBtX2NoYXJMaXN0LkdldFNpemUoKTsKLSAgICAgICAgICAgIGlmKHNpemUgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByZUNoYXIgPSAoUEFHRUNIQVJfSU5GTyltX2NoYXJMaXN0W3NpemUgLSAxXTsKLSAgICAgICAgfQotICAgICAgICBpZiAoRlBERlRFWFRfQ0hBUl9QSUVDRSA9PSBwcmVDaGFyLm1fRmxhZykKLSAgICAgICAgICAgIGlmICgweEFEID09IHByZUNoYXIubV9Vbmljb2RlIHx8IDB4MkQgPT0gcHJlQ2hhci5tX1VuaWNvZGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotaW50IENQREZfVGV4dFBhZ2U6OlByb2Nlc3NJbnNlcnRPYmplY3QoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwT2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBmb3JtTWF0cml4KQotewotICAgIEZpbmRQcmV2aW91c1RleHRPYmplY3QoKTsKLSAgICBGWF9CT09MIGJOZXdsaW5lID0gRkFMU0U7Ci0gICAgaW50IFdyaXRpbmdNb2RlID0gR2V0VGV4dE9iamVjdFdyaXRpbmdNb2RlKHBPYmopOwotICAgIGlmKFdyaXRpbmdNb2RlID09IC0xKSB7Ci0gICAgICAgIFdyaXRpbmdNb2RlID0gR2V0VGV4dE9iamVjdFdyaXRpbmdNb2RlKG1fcFByZVRleHRPYmopOwotICAgIH0KLSAgICBDRlhfRmxvYXRSZWN0IHRoaXNfcmVjdChwT2JqLT5tX0xlZnQsIHBPYmotPm1fQm90dG9tLCBwT2JqLT5tX1JpZ2h0LCBwT2JqLT5tX1RvcCk7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCBwcmV2X3JlY3QobV9wUHJlVGV4dE9iai0+bV9MZWZ0LCBtX3BQcmVUZXh0T2JqLT5tX0JvdHRvbSwgbV9wUHJlVGV4dE9iai0+bV9SaWdodCwgbV9wUHJlVGV4dE9iai0+bV9Ub3ApOwotICAgIENQREZfVGV4dE9iamVjdEl0ZW0gUHJldkl0ZW0sIGl0ZW07Ci0gICAgaW50IG5JdGVtID0gbV9wUHJlVGV4dE9iai0+Q291bnRJdGVtcygpOwotICAgIG1fcFByZVRleHRPYmotPkdldEl0ZW1JbmZvKG5JdGVtIC0gMSwgJlByZXZJdGVtKTsKLSAgICBwT2JqLT5HZXRJdGVtSW5mbygwLCAmaXRlbSk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3N0ckl0ZW0gPSBwT2JqLT5HZXRGb250KCktPlVuaWNvZGVGcm9tQ2hhckNvZGUoaXRlbS5tX0NoYXJDb2RlKTsKLSAgICBpZih3c3RySXRlbS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgd3N0ckl0ZW0gKz0gKEZYX1dDSEFSKWl0ZW0ubV9DaGFyQ29kZTsKLSAgICB9Ci0gICAgRlhfV0NIQVIgY3VyQ2hhciA9IHdzdHJJdGVtLkdldEF0KDApOwotICAgIGlmKFdyaXRpbmdNb2RlID09IDApIHsKLSAgICAgICAgaWYodGhpc19yZWN0LkhlaWdodCgpID4gNC41ICYmIHByZXZfcmVjdC5IZWlnaHQoKSA+IDQuNSkgewotICAgICAgICAgICAgRlhfRkxPQVQgdG9wID0gdGhpc19yZWN0LnRvcCA8IHByZXZfcmVjdC50b3AgPyB0aGlzX3JlY3QudG9wIDogcHJldl9yZWN0LnRvcDsKLSAgICAgICAgICAgIEZYX0ZMT0FUIGJvdHRvbSA9IHRoaXNfcmVjdC5ib3R0b20gPiBwcmV2X3JlY3QuYm90dG9tID8gdGhpc19yZWN0LmJvdHRvbSA6IHByZXZfcmVjdC5ib3R0b207Ci0gICAgICAgICAgICBpZihib3R0b20gPj0gdG9wKSB7Ci0gICAgICAgICAgICAgICAgaWYoSXNIeXBoZW4oY3VyQ2hhcikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChXcml0aW5nTW9kZSA9PSAxKSB7Ci0gICAgICAgIGlmKHRoaXNfcmVjdC5XaWR0aCgpID4gcE9iai0+R2V0Rm9udFNpemUoKSAqIDAuMWYgJiYgcHJldl9yZWN0LldpZHRoKCkgPiBtX3BQcmVUZXh0T2JqLT5HZXRGb250U2l6ZSgpICogMC4xZikgewotICAgICAgICAgICAgRlhfRkxPQVQgbGVmdCA9IHRoaXNfcmVjdC5sZWZ0ID4gbV9DdXJsaW5lUmVjdC5sZWZ0ID8gdGhpc19yZWN0LmxlZnQgOiBtX0N1cmxpbmVSZWN0LmxlZnQ7Ci0gICAgICAgICAgICBGWF9GTE9BVCByaWdodCA9IHRoaXNfcmVjdC5yaWdodCA8IG1fQ3VybGluZVJlY3QucmlnaHQgPyB0aGlzX3JlY3QucmlnaHQgOiBtX0N1cmxpbmVSZWN0LnJpZ2h0OwotICAgICAgICAgICAgaWYocmlnaHQgPD0gbGVmdCkgewotICAgICAgICAgICAgICAgIGlmKElzSHlwaGVuKGN1ckNoYXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBGWF9GTE9BVCBsYXN0X3BvcyA9IFByZXZJdGVtLm1fT3JpZ2luWDsKLSAgICBpbnQgbkxhc3RXaWR0aCA9IEdldENoYXJXaWR0aChQcmV2SXRlbS5tX0NoYXJDb2RlLCBtX3BQcmVUZXh0T2JqLT5HZXRGb250KCkpOwotICAgIEZYX0ZMT0FUIGxhc3Rfd2lkdGggPSBuTGFzdFdpZHRoICogbV9wUHJlVGV4dE9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDA7Ci0gICAgbGFzdF93aWR0aCA9IEZYU1lTX2ZhYnMobGFzdF93aWR0aCk7Ci0gICAgaW50IG5UaGlzV2lkdGggPSBHZXRDaGFyV2lkdGgoaXRlbS5tX0NoYXJDb2RlLCBwT2JqLT5HZXRGb250KCkpOwotICAgIEZYX0ZMT0FUIHRoaXNfd2lkdGggPSBuVGhpc1dpZHRoICogcE9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDA7Ci0gICAgdGhpc193aWR0aCA9IEZYU1lTX2ZhYnModGhpc193aWR0aCk7Ci0gICAgRlhfRkxPQVQgdGhyZXNob2xkID0gbGFzdF93aWR0aCA+IHRoaXNfd2lkdGggPyBsYXN0X3dpZHRoIC8gNCA6IHRoaXNfd2lkdGggLyA0OwotICAgIENGWF9BZmZpbmVNYXRyaXggcHJldl9tYXRyaXgsIHByZXZfcmV2ZXJzZTsKLSAgICBtX3BQcmVUZXh0T2JqLT5HZXRUZXh0TWF0cml4KCZwcmV2X21hdHJpeCk7Ci0gICAgcHJldl9tYXRyaXguQ29uY2F0KG1fcGVyTWF0cml4KTsKLSAgICBwcmV2X3JldmVyc2UuU2V0UmV2ZXJzZShwcmV2X21hdHJpeCk7Ci0gICAgRlhfRkxPQVQgeCA9IHBPYmotPkdldFBvc1goKTsKLSAgICBGWF9GTE9BVCB5ID0gcE9iai0+R2V0UG9zWSgpOwotICAgIGZvcm1NYXRyaXguVHJhbnNmb3JtKHgsIHkpOwotICAgIHByZXZfcmV2ZXJzZS5UcmFuc2Zvcm0oeCwgeSk7Ci0gICAgaWYobGFzdF93aWR0aCA8IHRoaXNfd2lkdGgpIHsKLSAgICAgICAgdGhyZXNob2xkID0gcHJldl9yZXZlcnNlLlRyYW5zZm9ybURpc3RhbmNlKHRocmVzaG9sZCk7Ci0gICAgfQotICAgIENGWF9GbG9hdFJlY3QgcmVjdDEobV9wUHJlVGV4dE9iai0+bV9MZWZ0LCBwT2JqLT5tX0JvdHRvbSwgbV9wUHJlVGV4dE9iai0+bV9SaWdodCwgcE9iai0+bV9Ub3ApOwotICAgIENGWF9GbG9hdFJlY3QgcmVjdDIobV9wUHJlVGV4dE9iai0+bV9MZWZ0LCBtX3BQcmVUZXh0T2JqLT5tX0JvdHRvbSwgbV9wUHJlVGV4dE9iai0+bV9SaWdodCwgbV9wUHJlVGV4dE9iai0+bV9Ub3ApOwotICAgIENGWF9GbG9hdFJlY3QgcmVjdDMgPSByZWN0MTsKLSAgICByZWN0MS5JbnRlcnNlY3QocmVjdDIpOwotICAgIGlmIChXcml0aW5nTW9kZSA9PSAwKSB7Ci0gICAgICAgIGlmICgocmVjdDEuSXNFbXB0eSgpICYmIHJlY3QyLkhlaWdodCgpID4gNSAmJiByZWN0My5IZWlnaHQoKSA+IDUpCi0gICAgICAgICAgICAgICAgfHwgKCh5ID4gdGhyZXNob2xkICogMiB8fCB5IDwgdGhyZXNob2xkICogLTMpICYmIChGWFNZU19mYWJzKHkpIDwgMSA/IEZYU1lTX2ZhYnMoeCkgPCBGWFNZU19mYWJzKHkpIDogVFJVRSkpKSB7Ci0gICAgICAgICAgICBiTmV3bGluZSA9IFRSVUU7Ci0gICAgICAgICAgICBpZihuSXRlbSA+IDEgKSB7Ci0gICAgICAgICAgICAgICAgQ1BERl9UZXh0T2JqZWN0SXRlbSB0ZW1wSXRlbTsKLSAgICAgICAgICAgICAgICBtX3BQcmVUZXh0T2JqLT5HZXRJdGVtSW5mbygwLCAmdGVtcEl0ZW0pOwotICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXggbTsKLSAgICAgICAgICAgICAgICBtX3BQcmVUZXh0T2JqLT5HZXRUZXh0TWF0cml4KCZtKTsKLSAgICAgICAgICAgICAgICBpZihQcmV2SXRlbS5tX09yaWdpblggPiB0ZW1wSXRlbS5tX09yaWdpblggJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fRGlzcGxheU1hdHJpeC5hID4gMC45ICYmIG1fRGlzcGxheU1hdHJpeC5iIDwgMC4xICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBtX0Rpc3BsYXlNYXRyaXguYyA8IDAuMSAmJiBtX0Rpc3BsYXlNYXRyaXguZCA8IC0wLjkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIG0uYiA8IDAuMSAmJiBtLmMgPCAwLjEgKSB7Ci0gICAgICAgICAgICAgICAgICAgIENGWF9GbG9hdFJlY3QgcmUoMCwgbV9wUHJlVGV4dE9iai0+bV9Cb3R0b20sIDEwMDAsIG1fcFByZVRleHRPYmotPm1fVG9wKTsKLSAgICAgICAgICAgICAgICAgICAgaWYocmUuQ29udGFpbnMocE9iai0+R2V0UG9zWCgpLCBwT2JqLT5HZXRQb3NZKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiTmV3bGluZSA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByZSgwLCBwT2JqLT5tX0JvdHRvbSwgMTAwMCwgcE9iai0+bV9Ub3ApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYocmUuQ29udGFpbnMobV9wUHJlVGV4dE9iai0+R2V0UG9zWCgpLCBtX3BQcmVUZXh0T2JqLT5HZXRQb3NZKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5ld2xpbmUgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZihiTmV3bGluZSkgewotICAgICAgICBpZihJc0h5cGhlbihjdXJDaGFyKSkgewotICAgICAgICAgICAgcmV0dXJuIDM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotICAgIEZYX0lOVDMyIG5DaGFycyA9IHBPYmotPkNvdW50Q2hhcnMoKTsKLSAgICBpZiAobkNoYXJzID09IDEgJiYgKCAweDJEID09IGN1ckNoYXIgfHwgMHhBRCA9PSBjdXJDaGFyKSkKLSAgICAgICAgaWYgKElzSHlwaGVuKGN1ckNoYXIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMzsKLSAgICAgICAgfQotICAgIENGWF9XaWRlU3RyaW5nIFByZXZTdHIgPSBtX3BQcmVUZXh0T2JqLT5HZXRGb250KCktPlVuaWNvZGVGcm9tQ2hhckNvZGUoUHJldkl0ZW0ubV9DaGFyQ29kZSk7Ci0gICAgRlhfV0NIQVIgcHJlQ2hhciA9IFByZXZTdHIuR2V0QXQoUHJldlN0ci5HZXRMZW5ndGgoKSAtIDEpOwotICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwotICAgIHBPYmotPkdldFRleHRNYXRyaXgoJm1hdHJpeCk7Ci0gICAgbWF0cml4LkNvbmNhdChmb3JtTWF0cml4KTsKLSAgICB0aHJlc2hvbGQgPSAoRlhfRkxPQVQpKG5MYXN0V2lkdGggPiBuVGhpc1dpZHRoID8gbkxhc3RXaWR0aCA6IG5UaGlzV2lkdGgpOwotICAgIHRocmVzaG9sZCA9IHRocmVzaG9sZCA+IDQwMCA/ICh0aHJlc2hvbGQgPCA3MDAgPyB0aHJlc2hvbGQgLyA0IDogICh0aHJlc2hvbGQgPiA4MDAgPyB0aHJlc2hvbGQgLyA2IDogdGhyZXNob2xkIC8gNSkpIDogKHRocmVzaG9sZCAvIDIpOwotICAgIGlmKG5MYXN0V2lkdGggPj0gblRoaXNXaWR0aCkgewotICAgICAgICB0aHJlc2hvbGQgKj0gRlhTWVNfZmFicyhtX3BQcmVUZXh0T2JqLT5HZXRGb250U2l6ZSgpKTsKK3ZvaWQgQ1BERl9UZXh0UGFnZTo6UHJvY2Vzc1RleHRPYmplY3QoUERGVEVYVF9PYmogT2JqKSB7CisgIENQREZfVGV4dE9iamVjdCogcFRleHRPYmogPSBPYmoubV9wVGV4dE9iajsKKyAgaWYgKEZYU1lTX2ZhYnMocFRleHRPYmotPm1fUmlnaHQgLSBwVGV4dE9iai0+bV9MZWZ0KSA8IDAuMDFmKSB7CisgICAgcmV0dXJuOworICB9CisgIENGWF9NYXRyaXggZm9ybU1hdHJpeCA9IE9iai5tX2Zvcm1NYXRyaXg7CisgIENQREZfRm9udCogcEZvbnQgPSBwVGV4dE9iai0+R2V0Rm9udCgpOworICBDRlhfTWF0cml4IG1hdHJpeDsKKyAgcFRleHRPYmotPkdldFRleHRNYXRyaXgoJm1hdHJpeCk7CisgIG1hdHJpeC5Db25jYXQoZm9ybU1hdHJpeCk7CisgIGludDMyX3QgYlByZU1LQyA9IFByZU1hcmtlZENvbnRlbnQoT2JqKTsKKyAgaWYgKEZQREZURVhUX01DX0RPTkUgPT0gYlByZU1LQykgeworICAgIG1fcFByZVRleHRPYmogPSBwVGV4dE9iajsKKyAgICBtX3Blck1hdHJpeC5Db3B5KGZvcm1NYXRyaXgpOworICAgIHJldHVybjsKKyAgfQorICBpbnQgcmVzdWx0ID0gMDsKKyAgaWYgKG1fcFByZVRleHRPYmopIHsKKyAgICByZXN1bHQgPSBQcm9jZXNzSW5zZXJ0T2JqZWN0KHBUZXh0T2JqLCBmb3JtTWF0cml4KTsKKyAgICBpZiAoMiA9PSByZXN1bHQpIHsKKyAgICAgIG1fQ3VybGluZVJlY3QgPQorICAgICAgICAgIENGWF9GbG9hdFJlY3QoT2JqLm1fcFRleHRPYmotPm1fTGVmdCwgT2JqLm1fcFRleHRPYmotPm1fQm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgT2JqLm1fcFRleHRPYmotPm1fUmlnaHQsIE9iai5tX3BUZXh0T2JqLT5tX1RvcCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhyZXNob2xkICo9IEZYU1lTX2ZhYnMocE9iai0+R2V0Rm9udFNpemUoKSk7Ci0gICAgICAgIHRocmVzaG9sZCA9IG1hdHJpeC5UcmFuc2Zvcm1EaXN0YW5jZSh0aHJlc2hvbGQpOwotICAgICAgICB0aHJlc2hvbGQgPSBwcmV2X3JldmVyc2UuVHJhbnNmb3JtRGlzdGFuY2UodGhyZXNob2xkKTsKKyAgICAgIG1fQ3VybGluZVJlY3QuVW5pb24oCisgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdChPYmoubV9wVGV4dE9iai0+bV9MZWZ0LCBPYmoubV9wVGV4dE9iai0+bV9Cb3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICBPYmoubV9wVGV4dE9iai0+bV9SaWdodCwgT2JqLm1fcFRleHRPYmotPm1fVG9wKSk7CiAgICAgfQotICAgIHRocmVzaG9sZCAvPSAxMDAwOwotICAgIGlmKCh0aHJlc2hvbGQgPCAxLjQ4ODEgJiYgdGhyZXNob2xkID4gMS40ODc5KQotICAgICAgICAgICAgfHwgKHRocmVzaG9sZCA8IDEuMzkwMDEgJiYgdGhyZXNob2xkID4gMS4zODk5OSkpIHsKLSAgICAgICAgdGhyZXNob2xkICo9IDEuNTsKLSAgICB9Ci0gICAgaWYgKEZYU1lTX2ZhYnMobGFzdF9wb3MgKyBsYXN0X3dpZHRoIC0geCkgPiB0aHJlc2hvbGQgJiYgY3VyQ2hhciAhPSBMJyAnICYmIHByZUNoYXIgIT0gTCcgJykKLSAgICAgICAgaWYgKGN1ckNoYXIgIT0gTCcgJyAmJiBwcmVDaGFyICE9IEwnICcpIHsKLSAgICAgICAgICAgIGlmKCh4IC0gbGFzdF9wb3MgLSBsYXN0X3dpZHRoKSA+IHRocmVzaG9sZCB8fCAobGFzdF9wb3MgLSB4IC0gbGFzdF93aWR0aCkgPiB0aHJlc2hvbGQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHggPCAwICYmIChsYXN0X3BvcyAtIHggLSBsYXN0X3dpZHRoKSA+IHRocmVzaG9sZCkgewotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoKHggLSBsYXN0X3BvcyAtIGxhc3Rfd2lkdGgpID4gdGhpc193aWR0aCB8fCAoeCAtIGxhc3RfcG9zIC0gdGhpc193aWR0aCkgPiBsYXN0X3dpZHRoICkgewotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQorICAgIFBBR0VDSEFSX0lORk8gZ2VuZXJhdGVDaGFyOworICAgIGlmIChyZXN1bHQgPT0gMSkgeworICAgICAgaWYgKEdlbmVyYXRlQ2hhckluZm8oVEVYVF9CTEFOS19DSEFSLCBnZW5lcmF0ZUNoYXIpKSB7CisgICAgICAgIGlmICghZm9ybU1hdHJpeC5Jc0lkZW50aXR5KCkpIHsKKyAgICAgICAgICBnZW5lcmF0ZUNoYXIubV9NYXRyaXguQ29weShmb3JtTWF0cml4KTsKICAgICAgICAgfQotICAgIHJldHVybiAwOworICAgICAgICBtX1RlbXBUZXh0QnVmLkFwcGVuZENoYXIoVEVYVF9CTEFOS19DSEFSKTsKKyAgICAgICAgbV9UZW1wQ2hhckxpc3QuQWRkKGdlbmVyYXRlQ2hhcik7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gMikgeworICAgICAgQ2xvc2VUZW1wTGluZSgpOworICAgICAgaWYgKG1fVGV4dEJ1Zi5HZXRTaXplKCkpIHsKKyAgICAgICAgaWYgKG1fUGFyc2VPcHRpb25zLm1fYkdldENoYXJDb2RlT25seSkgeworICAgICAgICAgIG1fVGV4dEJ1Zi5BcHBlbmRDaGFyKFRFWFRfUkVUVVJOX0NIQVIpOworICAgICAgICAgIG1fVGV4dEJ1Zi5BcHBlbmRDaGFyKFRFWFRfTElORUZFRURfQ0hBUik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKEdlbmVyYXRlQ2hhckluZm8oVEVYVF9SRVRVUk5fQ0hBUiwgZ2VuZXJhdGVDaGFyKSkgeworICAgICAgICAgICAgbV9UZXh0QnVmLkFwcGVuZENoYXIoVEVYVF9SRVRVUk5fQ0hBUik7CisgICAgICAgICAgICBpZiAoIWZvcm1NYXRyaXguSXNJZGVudGl0eSgpKSB7CisgICAgICAgICAgICAgIGdlbmVyYXRlQ2hhci5tX01hdHJpeC5Db3B5KGZvcm1NYXRyaXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9jaGFyTGlzdC5BZGQoZ2VuZXJhdGVDaGFyKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKEdlbmVyYXRlQ2hhckluZm8oVEVYVF9MSU5FRkVFRF9DSEFSLCBnZW5lcmF0ZUNoYXIpKSB7CisgICAgICAgICAgICBtX1RleHRCdWYuQXBwZW5kQ2hhcihURVhUX0xJTkVGRUVEX0NIQVIpOworICAgICAgICAgICAgaWYgKCFmb3JtTWF0cml4LklzSWRlbnRpdHkoKSkgeworICAgICAgICAgICAgICBnZW5lcmF0ZUNoYXIubV9NYXRyaXguQ29weShmb3JtTWF0cml4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fY2hhckxpc3QuQWRkKGdlbmVyYXRlQ2hhcik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gMyAmJiAhbV9QYXJzZU9wdGlvbnMubV9iT3V0cHV0SHlwaGVuKSB7CisgICAgICBpbnQzMl90IG5DaGFycyA9IHBUZXh0T2JqLT5Db3VudENoYXJzKCk7CisgICAgICBpZiAobkNoYXJzID09IDEpIHsKKyAgICAgICAgQ1BERl9UZXh0T2JqZWN0SXRlbSBpdGVtOworICAgICAgICBwVGV4dE9iai0+R2V0Q2hhckluZm8oMCwgJml0ZW0pOworICAgICAgICBDRlhfV2lkZVN0cmluZyB3c3RySXRlbSA9CisgICAgICAgICAgICBwVGV4dE9iai0+R2V0Rm9udCgpLT5Vbmljb2RlRnJvbUNoYXJDb2RlKGl0ZW0ubV9DaGFyQ29kZSk7CisgICAgICAgIGlmICh3c3RySXRlbS5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICB3c3RySXRlbSArPSAoRlhfV0NIQVIpaXRlbS5tX0NoYXJDb2RlOworICAgICAgICB9CisgICAgICAgIEZYX1dDSEFSIGN1ckNoYXIgPSB3c3RySXRlbS5HZXRBdCgwKTsKKyAgICAgICAgaWYgKDB4MkQgPT0gY3VyQ2hhciB8fCAweEFEID09IGN1ckNoYXIpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHdoaWxlIChtX1RlbXBUZXh0QnVmLkdldFNpemUoKSA+IDAgJiYKKyAgICAgICAgICAgICBtX1RlbXBUZXh0QnVmLkdldFdpZGVTdHJpbmcoKS5HZXRBdChtX1RlbXBUZXh0QnVmLkdldExlbmd0aCgpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKSA9PSAweDIwKSB7CisgICAgICAgIG1fVGVtcFRleHRCdWYuRGVsZXRlKG1fVGVtcFRleHRCdWYuR2V0TGVuZ3RoKCkgLSAxLCAxKTsKKyAgICAgICAgbV9UZW1wQ2hhckxpc3QuRGVsZXRlKG1fVGVtcENoYXJMaXN0LkdldFNpemUoKSAtIDEpOworICAgICAgfQorICAgICAgUEFHRUNIQVJfSU5GTyogY2hhID0KKyAgICAgICAgICAoUEFHRUNIQVJfSU5GTyopbV9UZW1wQ2hhckxpc3QuR2V0QXQobV9UZW1wQ2hhckxpc3QuR2V0U2l6ZSgpIC0gMSk7CisgICAgICBtX1RlbXBUZXh0QnVmLkRlbGV0ZShtX1RlbXBUZXh0QnVmLkdldExlbmd0aCgpIC0gMSwgMSk7CisgICAgICBjaGEtPm1fVW5pY29kZSA9IDB4MjsKKyAgICAgIGNoYS0+bV9GbGFnID0gRlBERlRFWFRfQ0hBUl9IWVBIRU47CisgICAgICBtX1RlbXBUZXh0QnVmLkFwcGVuZENoYXIoMHhmZmZlKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbV9DdXJsaW5lUmVjdCA9CisgICAgICAgIENGWF9GbG9hdFJlY3QoT2JqLm1fcFRleHRPYmotPm1fTGVmdCwgT2JqLm1fcFRleHRPYmotPm1fQm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgIE9iai5tX3BUZXh0T2JqLT5tX1JpZ2h0LCBPYmoubV9wVGV4dE9iai0+bV9Ub3ApOworICB9CisgIGlmIChGUERGVEVYVF9NQ19ERUxBWSA9PSBiUHJlTUtDKSB7CisgICAgUHJvY2Vzc01hcmtlZENvbnRlbnQoT2JqKTsKKyAgICBtX3BQcmVUZXh0T2JqID0gcFRleHRPYmo7CisgICAgbV9wZXJNYXRyaXguQ29weShmb3JtTWF0cml4KTsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wUHJlVGV4dE9iaiA9IHBUZXh0T2JqOworICBtX3Blck1hdHJpeC5Db3B5KGZvcm1NYXRyaXgpOworICBpbnQgbkl0ZW1zID0gcFRleHRPYmotPkNvdW50SXRlbXMoKTsKKyAgRlhfRkxPQVQgYmFzZVNwYWNlID0gX0NhbGN1bGF0ZUJhc2VTcGFjZShwVGV4dE9iaiwgbWF0cml4KTsKKworICBjb25zdCBGWF9CT09MIGJSMkwgPSBJc1JpZ2h0VG9MZWZ0KHBUZXh0T2JqLCBwRm9udCwgbkl0ZW1zKTsKKyAgY29uc3QgRlhfQk9PTCBiSXNCaWRpQW5kTWlycm9ySW52ZXJzZSA9CisgICAgICBiUjJMICYmIChtYXRyaXguYSAqIG1hdHJpeC5kIC0gbWF0cml4LmIgKiBtYXRyaXguYykgPCAwOworICBpbnQzMl90IGlCdWZTdGFydEFwcGVuZCA9IG1fVGVtcFRleHRCdWYuR2V0TGVuZ3RoKCk7CisgIGludDMyX3QgaUNoYXJMaXN0U3RhcnRBcHBlbmQgPSBtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCk7CisKKyAgRlhfRkxPQVQgc3BhY2luZyA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbkl0ZW1zOyBpKyspIHsKKyAgICBDUERGX1RleHRPYmplY3RJdGVtIGl0ZW07CisgICAgUEFHRUNIQVJfSU5GTyBjaGFyaW5mbzsKKyAgICBjaGFyaW5mby5tX09yaWdpblggPSAwOworICAgIGNoYXJpbmZvLm1fT3JpZ2luWSA9IDA7CisgICAgcFRleHRPYmotPkdldEl0ZW1JbmZvKGksICZpdGVtKTsKKyAgICBpZiAoaXRlbS5tX0NoYXJDb2RlID09IChGWF9EV09SRCktMSkgeworICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyID0gbV9UZW1wVGV4dEJ1Zi5HZXRXaWRlU3RyaW5nKCk7CisgICAgICBpZiAoc3RyLklzRW1wdHkoKSkgeworICAgICAgICBzdHIgPSBtX1RleHRCdWYuR2V0V2lkZVN0cmluZygpOworICAgICAgfQorICAgICAgaWYgKHN0ci5Jc0VtcHR5KCkgfHwgc3RyLkdldEF0KHN0ci5HZXRMZW5ndGgoKSAtIDEpID09IFRFWFRfQkxBTktfQ0hBUikgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIEZYX0ZMT0FUIGZvbnRzaXplX2ggPSBwVGV4dE9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemVIKCk7CisgICAgICBzcGFjaW5nID0gLWZvbnRzaXplX2ggKiBpdGVtLm1fT3JpZ2luWCAvIDEwMDA7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgRlhfRkxPQVQgY2hhclNwYWNlID0gcFRleHRPYmotPm1fVGV4dFN0YXRlLkdldE9iamVjdCgpLT5tX0NoYXJTcGFjZTsKKyAgICBpZiAoY2hhclNwYWNlID4gMC4wMDEpIHsKKyAgICAgIHNwYWNpbmcgKz0gbWF0cml4LlRyYW5zZm9ybURpc3RhbmNlKGNoYXJTcGFjZSk7CisgICAgfSBlbHNlIGlmIChjaGFyU3BhY2UgPCAtMC4wMDEpIHsKKyAgICAgIHNwYWNpbmcgLT0gbWF0cml4LlRyYW5zZm9ybURpc3RhbmNlKEZYU1lTX2ZhYnMoY2hhclNwYWNlKSk7CisgICAgfQorICAgIHNwYWNpbmcgLT0gYmFzZVNwYWNlOworICAgIGlmIChzcGFjaW5nICYmIGkgPiAwKSB7CisgICAgICBpbnQgbGFzdF93aWR0aCA9IDA7CisgICAgICBGWF9GTE9BVCBmb250c2l6ZV9oID0gcFRleHRPYmotPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplSCgpOworICAgICAgRlhfRFdPUkQgc3BhY2VfY2hhcmNvZGUgPSBwRm9udC0+Q2hhckNvZGVGcm9tVW5pY29kZSgnICcpOworICAgICAgRlhfRkxPQVQgdGhyZXNob2xkID0gMDsKKyAgICAgIGlmIChzcGFjZV9jaGFyY29kZSAhPSAtMSkgeworICAgICAgICB0aHJlc2hvbGQgPSBmb250c2l6ZV9oICogcEZvbnQtPkdldENoYXJXaWR0aEYoc3BhY2VfY2hhcmNvZGUpIC8gMTAwMDsKKyAgICAgIH0KKyAgICAgIGlmICh0aHJlc2hvbGQgPiBmb250c2l6ZV9oIC8gMykgeworICAgICAgICB0aHJlc2hvbGQgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyZXNob2xkIC89IDI7CisgICAgICB9CisgICAgICBpZiAodGhyZXNob2xkID09IDApIHsKKyAgICAgICAgdGhyZXNob2xkID0gZm9udHNpemVfaDsKKyAgICAgICAgaW50IHRoaXNfd2lkdGggPSBGWFNZU19hYnMoR2V0Q2hhcldpZHRoKGl0ZW0ubV9DaGFyQ29kZSwgcEZvbnQpKTsKKyAgICAgICAgdGhyZXNob2xkID0gdGhpc193aWR0aCA+IGxhc3Rfd2lkdGggPyAoRlhfRkxPQVQpdGhpc193aWR0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChGWF9GTE9BVClsYXN0X3dpZHRoOworICAgICAgICB0aHJlc2hvbGQgPSBfTm9ybWFsaXplVGhyZXNob2xkKHRocmVzaG9sZCk7CisgICAgICAgIHRocmVzaG9sZCA9IGZvbnRzaXplX2ggKiB0aHJlc2hvbGQgLyAxMDAwOworICAgICAgfQorICAgICAgaWYgKHRocmVzaG9sZCAmJiAoc3BhY2luZyAmJiBzcGFjaW5nID49IHRocmVzaG9sZCkpIHsKKyAgICAgICAgY2hhcmluZm8ubV9Vbmljb2RlID0gVEVYVF9CTEFOS19DSEFSOworICAgICAgICBjaGFyaW5mby5tX0ZsYWcgPSBGUERGVEVYVF9DSEFSX0dFTkVSQVRFRDsKKyAgICAgICAgY2hhcmluZm8ubV9wVGV4dE9iaiA9IHBUZXh0T2JqOworICAgICAgICBjaGFyaW5mby5tX0luZGV4ID0gbV9UZXh0QnVmLkdldExlbmd0aCgpOworICAgICAgICBtX1RlbXBUZXh0QnVmLkFwcGVuZENoYXIoVEVYVF9CTEFOS19DSEFSKTsKKyAgICAgICAgY2hhcmluZm8ubV9DaGFyQ29kZSA9IC0xOworICAgICAgICBjaGFyaW5mby5tX01hdHJpeC5Db3B5KGZvcm1NYXRyaXgpOworICAgICAgICBtYXRyaXguVHJhbnNmb3JtKGl0ZW0ubV9PcmlnaW5YLCBpdGVtLm1fT3JpZ2luWSwgY2hhcmluZm8ubV9PcmlnaW5YLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJpbmZvLm1fT3JpZ2luWSk7CisgICAgICAgIGNoYXJpbmZvLm1fQ2hhckJveCA9CisgICAgICAgICAgICBDRlhfRmxvYXRSZWN0KGNoYXJpbmZvLm1fT3JpZ2luWCwgY2hhcmluZm8ubV9PcmlnaW5ZLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyaW5mby5tX09yaWdpblgsIGNoYXJpbmZvLm1fT3JpZ2luWSk7CisgICAgICAgIG1fVGVtcENoYXJMaXN0LkFkZChjaGFyaW5mbyk7CisgICAgICB9CisgICAgICBpZiAoaXRlbS5tX0NoYXJDb2RlID09IChGWF9EV09SRCktMSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisgICAgc3BhY2luZyA9IDA7CisgICAgQ0ZYX1dpZGVTdHJpbmcgd3N0ckl0ZW0gPSBwRm9udC0+VW5pY29kZUZyb21DaGFyQ29kZShpdGVtLm1fQ2hhckNvZGUpOworICAgIEZYX0JPT0wgYk5vVW5pY29kZSA9IEZBTFNFOworICAgIEZYX1dDSEFSIHdDaGFyID0gd3N0ckl0ZW0uR2V0QXQoMCk7CisgICAgaWYgKCh3c3RySXRlbS5Jc0VtcHR5KCkgfHwgd0NoYXIgPT0gMCkgJiYgaXRlbS5tX0NoYXJDb2RlKSB7CisgICAgICBpZiAod3N0ckl0ZW0uSXNFbXB0eSgpKSB7CisgICAgICAgIHdzdHJJdGVtICs9IChGWF9XQ0hBUilpdGVtLm1fQ2hhckNvZGU7CisgICAgICB9IGVsc2UgeworICAgICAgICB3c3RySXRlbS5TZXRBdCgwLCAoRlhfV0NIQVIpaXRlbS5tX0NoYXJDb2RlKTsKKyAgICAgIH0KKyAgICAgIGJOb1VuaWNvZGUgPSBUUlVFOworICAgIH0KKyAgICBjaGFyaW5mby5tX0luZGV4ID0gLTE7CisgICAgY2hhcmluZm8ubV9DaGFyQ29kZSA9IGl0ZW0ubV9DaGFyQ29kZTsKKyAgICBpZiAoYk5vVW5pY29kZSkgeworICAgICAgY2hhcmluZm8ubV9GbGFnID0gRlBERlRFWFRfQ0hBUl9VTlVOSUNPREU7CisgICAgfSBlbHNlIHsKKyAgICAgIGNoYXJpbmZvLm1fRmxhZyA9IEZQREZURVhUX0NIQVJfTk9STUFMOworICAgIH0KKyAgICBjaGFyaW5mby5tX3BUZXh0T2JqID0gcFRleHRPYmo7CisgICAgY2hhcmluZm8ubV9PcmlnaW5YID0gMCwgY2hhcmluZm8ubV9PcmlnaW5ZID0gMDsKKyAgICBtYXRyaXguVHJhbnNmb3JtKGl0ZW0ubV9PcmlnaW5YLCBpdGVtLm1fT3JpZ2luWSwgY2hhcmluZm8ubV9PcmlnaW5YLAorICAgICAgICAgICAgICAgICAgICAgY2hhcmluZm8ubV9PcmlnaW5ZKTsKKyAgICBGWF9SRUNUIHJlY3QoMCwgMCwgMCwgMCk7CisgICAgcmVjdC5JbnRlcnNlY3QoMCwgMCwgMCwgMCk7CisgICAgY2hhcmluZm8ubV9wVGV4dE9iai0+R2V0Rm9udCgpLT5HZXRDaGFyQkJveChjaGFyaW5mby5tX0NoYXJDb2RlLCByZWN0KTsKKyAgICBjaGFyaW5mby5tX0NoYXJCb3gudG9wID0KKyAgICAgICAgcmVjdC50b3AgKiBwVGV4dE9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDAgKyBpdGVtLm1fT3JpZ2luWTsKKyAgICBjaGFyaW5mby5tX0NoYXJCb3gubGVmdCA9CisgICAgICAgIHJlY3QubGVmdCAqIHBUZXh0T2JqLT5HZXRGb250U2l6ZSgpIC8gMTAwMCArIGl0ZW0ubV9PcmlnaW5YOworICAgIGNoYXJpbmZvLm1fQ2hhckJveC5yaWdodCA9CisgICAgICAgIHJlY3QucmlnaHQgKiBwVGV4dE9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDAgKyBpdGVtLm1fT3JpZ2luWDsKKyAgICBjaGFyaW5mby5tX0NoYXJCb3guYm90dG9tID0KKyAgICAgICAgcmVjdC5ib3R0b20gKiBwVGV4dE9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDAgKyBpdGVtLm1fT3JpZ2luWTsKKyAgICBpZiAoZmFic2YoY2hhcmluZm8ubV9DaGFyQm94LnRvcCAtIGNoYXJpbmZvLm1fQ2hhckJveC5ib3R0b20pIDwgMC4wMWYpIHsKKyAgICAgIGNoYXJpbmZvLm1fQ2hhckJveC50b3AgPQorICAgICAgICAgIGNoYXJpbmZvLm1fQ2hhckJveC5ib3R0b20gKyBwVGV4dE9iai0+R2V0Rm9udFNpemUoKTsKKyAgICB9CisgICAgaWYgKGZhYnNmKGNoYXJpbmZvLm1fQ2hhckJveC5yaWdodCAtIGNoYXJpbmZvLm1fQ2hhckJveC5sZWZ0KSA8IDAuMDFmKSB7CisgICAgICBjaGFyaW5mby5tX0NoYXJCb3gucmlnaHQgPQorICAgICAgICAgIGNoYXJpbmZvLm1fQ2hhckJveC5sZWZ0ICsgcFRleHRPYmotPkdldENoYXJXaWR0aChjaGFyaW5mby5tX0NoYXJDb2RlKTsKKyAgICB9CisgICAgbWF0cml4LlRyYW5zZm9ybVJlY3QoY2hhcmluZm8ubV9DaGFyQm94KTsKKyAgICBjaGFyaW5mby5tX01hdHJpeC5Db3B5KG1hdHJpeCk7CisgICAgaWYgKHdzdHJJdGVtLklzRW1wdHkoKSkgeworICAgICAgY2hhcmluZm8ubV9Vbmljb2RlID0gMDsKKyAgICAgIG1fVGVtcENoYXJMaXN0LkFkZChjaGFyaW5mbyk7CisgICAgICBtX1RlbXBUZXh0QnVmLkFwcGVuZENoYXIoMHhmZmZlKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0gZWxzZSB7CisgICAgICBpbnQgblRvdGFsID0gd3N0ckl0ZW0uR2V0TGVuZ3RoKCk7CisgICAgICBGWF9CT09MIGJEZWwgPSBGQUxTRTsKKyAgICAgIGNvbnN0IGludCBjb3VudCA9IHN0ZDo6bWluKG1fVGVtcENoYXJMaXN0LkdldFNpemUoKSwgNyk7CisgICAgICBGWF9GTE9BVCB0aHJlc2hvbGQgPSBjaGFyaW5mby5tX01hdHJpeC5UcmFuc2Zvcm1YRGlzdGFuY2UoCisgICAgICAgICAgKEZYX0ZMT0FUKVRFWFRfQ0hBUlJBVElPX0dBUERFTFRBICogcFRleHRPYmotPkdldEZvbnRTaXplKCkpOworICAgICAgZm9yIChpbnQgbiA9IG1fVGVtcENoYXJMaXN0LkdldFNpemUoKTsKKyAgICAgICAgICAgbiA+IG1fVGVtcENoYXJMaXN0LkdldFNpemUoKSAtIGNvdW50OyBuLS0pIHsKKyAgICAgICAgUEFHRUNIQVJfSU5GTyogY2hhcmluZm8xID0gKFBBR0VDSEFSX0lORk8qKW1fVGVtcENoYXJMaXN0LkdldEF0KG4gLSAxKTsKKyAgICAgICAgaWYgKGNoYXJpbmZvMS0+bV9DaGFyQ29kZSA9PSBjaGFyaW5mby5tX0NoYXJDb2RlICYmCisgICAgICAgICAgICBjaGFyaW5mbzEtPm1fcFRleHRPYmotPkdldEZvbnQoKSA9PQorICAgICAgICAgICAgICAgIGNoYXJpbmZvLm1fcFRleHRPYmotPkdldEZvbnQoKSAmJgorICAgICAgICAgICAgRlhTWVNfZmFicyhjaGFyaW5mbzEtPm1fT3JpZ2luWCAtIGNoYXJpbmZvLm1fT3JpZ2luWCkgPCB0aHJlc2hvbGQgJiYKKyAgICAgICAgICAgIEZYU1lTX2ZhYnMoY2hhcmluZm8xLT5tX09yaWdpblkgLSBjaGFyaW5mby5tX09yaWdpblkpIDwgdGhyZXNob2xkKSB7CisgICAgICAgICAgYkRlbCA9IFRSVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICghYkRlbCkgeworICAgICAgICBmb3IgKGludCBuSW5kZXggPSAwOyBuSW5kZXggPCBuVG90YWw7IG5JbmRleCsrKSB7CisgICAgICAgICAgY2hhcmluZm8ubV9Vbmljb2RlID0gd3N0ckl0ZW0uR2V0QXQobkluZGV4KTsKKyAgICAgICAgICBpZiAoY2hhcmluZm8ubV9Vbmljb2RlKSB7CisgICAgICAgICAgICBjaGFyaW5mby5tX0luZGV4ID0gbV9UZXh0QnVmLkdldExlbmd0aCgpOworICAgICAgICAgICAgbV9UZW1wVGV4dEJ1Zi5BcHBlbmRDaGFyKGNoYXJpbmZvLm1fVW5pY29kZSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1fVGVtcFRleHRCdWYuQXBwZW5kQ2hhcigweGZmZmUpOworICAgICAgICAgIH0KKyAgICAgICAgICBtX1RlbXBDaGFyTGlzdC5BZGQoY2hhcmluZm8pOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGkgPT0gMCkgeworICAgICAgICBDRlhfV2lkZVN0cmluZyBzdHIgPSBtX1RlbXBUZXh0QnVmLkdldFdpZGVTdHJpbmcoKTsKKyAgICAgICAgaWYgKCFzdHIuSXNFbXB0eSgpICYmCisgICAgICAgICAgICBzdHIuR2V0QXQoc3RyLkdldExlbmd0aCgpIC0gMSkgPT0gVEVYVF9CTEFOS19DSEFSKSB7CisgICAgICAgICAgbV9UZW1wVGV4dEJ1Zi5EZWxldGUobV9UZW1wVGV4dEJ1Zi5HZXRMZW5ndGgoKSAtIDEsIDEpOworICAgICAgICAgIG1fVGVtcENoYXJMaXN0LkRlbGV0ZShtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCkgLSAxKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoYklzQmlkaUFuZE1pcnJvckludmVyc2UpIHsKKyAgICBTd2FwVGVtcFRleHRCdWYoaUNoYXJMaXN0U3RhcnRBcHBlbmQsIGlCdWZTdGFydEFwcGVuZCk7CisgIH0KIH0KLUZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6SXNTYW1lVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMSwgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iajIpCi17Ci0gICAgaWYgKCFwVGV4dE9iajEgfHwgIXBUZXh0T2JqMikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENGWF9GbG9hdFJlY3QgcmNQcmVPYmoocFRleHRPYmoyLT5tX0xlZnQsIHBUZXh0T2JqMi0+bV9Cb3R0b20sIHBUZXh0T2JqMi0+bV9SaWdodCwgcFRleHRPYmoyLT5tX1RvcCk7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByY0N1ck9iaihwVGV4dE9iajEtPm1fTGVmdCwgcFRleHRPYmoxLT5tX0JvdHRvbSwgcFRleHRPYmoxLT5tX1JpZ2h0LCBwVGV4dE9iajEtPm1fVG9wKTsKLSAgICBpZiAocmNQcmVPYmouSXNFbXB0eSgpICYmIHJjQ3VyT2JqLklzRW1wdHkoKSAmJiAhbV9QYXJzZU9wdGlvbnMubV9iR2V0Q2hhckNvZGVPbmx5KSB7Ci0gICAgICAgIEZYX0ZMT0FUIGRiWGRpZiA9IEZYU1lTX2ZhYnMocmNQcmVPYmoubGVmdCAtIHJjQ3VyT2JqLmxlZnQpOwotICAgICAgICBpbnQgbkNvdW50ID0gbV9jaGFyTGlzdC5HZXRTaXplKCk7Ci0gICAgICAgIGlmIChuQ291bnQgPj0gMikgewotICAgICAgICAgICAgUEFHRUNIQVJfSU5GTyBwZXJDaGFyVGVtcCA9IChQQUdFQ0hBUl9JTkZPKW1fY2hhckxpc3RbbkNvdW50IC0gMl07Ci0gICAgICAgICAgICBGWF9GTE9BVCBkYlNwYWNlID0gcGVyQ2hhclRlbXAubV9DaGFyQm94LldpZHRoKCk7Ci0gICAgICAgICAgICBpZiAoZGJYZGlmID4gZGJTcGFjZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIXJjUHJlT2JqLklzRW1wdHkoKSB8fCAhcmNDdXJPYmouSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJjUHJlT2JqLkludGVyc2VjdChyY0N1ck9iaik7Ci0gICAgICAgIGlmIChyY1ByZU9iai5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoRlhTWVNfZmFicyhyY1ByZU9iai5XaWR0aCgpIC0gcmNDdXJPYmouV2lkdGgoKSkgPiByY0N1ck9iai5XaWR0aCgpIC8gMikgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwVGV4dE9iajItPkdldEZvbnRTaXplKCkgIT0gcFRleHRPYmoxLT5HZXRGb250U2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaW50IG5QcmVDb3VudCA9IHBUZXh0T2JqMi0+Q291bnRJdGVtcygpOwotICAgIGludCBuQ3VyQ291bnQgPSBwVGV4dE9iajEtPkNvdW50SXRlbXMoKTsKLSAgICBpZiAoblByZUNvdW50ICE9IG5DdXJDb3VudCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENQREZfVGV4dE9iamVjdEl0ZW0gaXRlbVBlciwgaXRlbUN1cjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5QcmVDb3VudDsgaSsrKSB7Ci0gICAgICAgIHBUZXh0T2JqMi0+R2V0SXRlbUluZm8oaSwgJml0ZW1QZXIpOwotICAgICAgICBwVGV4dE9iajEtPkdldEl0ZW1JbmZvKGksICZpdGVtQ3VyKTsKLSAgICAgICAgaWYgKGl0ZW1DdXIubV9DaGFyQ29kZSAhPSBpdGVtUGVyLm1fQ2hhckNvZGUpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZihGWFNZU19mYWJzKHBUZXh0T2JqMS0+R2V0UG9zWCgpIC0gcFRleHRPYmoyLT5HZXRQb3NYKCkpID4gR2V0Q2hhcldpZHRoKGl0ZW1QZXIubV9DaGFyQ29kZSwgcFRleHRPYmoyLT5HZXRGb250KCkpKnBUZXh0T2JqMi0+R2V0Rm9udFNpemUoKSAvIDEwMDAgKiAwLjkgfHwKLSAgICAgICAgICAgIEZYU1lTX2ZhYnMocFRleHRPYmoxLT5HZXRQb3NZKCkgLSBwVGV4dE9iajItPkdldFBvc1koKSkgPgotICAgICAgICAgICAgRlhfTUFYKEZYX01BWChyY1ByZU9iai5IZWlnaHQoKSAsIHJjUHJlT2JqLldpZHRoKCkpLCBwVGV4dE9iajItPkdldEZvbnRTaXplKCkpIC8gOCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOworaW50MzJfdCBDUERGX1RleHRQYWdlOjpHZXRUZXh0T2JqZWN0V3JpdGluZ01vZGUoCisgICAgY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaikgeworICBpbnQzMl90IG5DaGFycyA9IHBUZXh0T2JqLT5Db3VudENoYXJzKCk7CisgIGlmIChuQ2hhcnMgPT0gMSkgeworICAgIHJldHVybiBtX1RleHRsaW5lRGlyOworICB9CisgIENQREZfVGV4dE9iamVjdEl0ZW0gZmlyc3QsIGxhc3Q7CisgIHBUZXh0T2JqLT5HZXRDaGFySW5mbygwLCAmZmlyc3QpOworICBwVGV4dE9iai0+R2V0Q2hhckluZm8obkNoYXJzIC0gMSwgJmxhc3QpOworICBDRlhfTWF0cml4IHRleHRNYXRyaXg7CisgIHBUZXh0T2JqLT5HZXRUZXh0TWF0cml4KCZ0ZXh0TWF0cml4KTsKKyAgdGV4dE1hdHJpeC5UcmFuc2Zvcm1Qb2ludChmaXJzdC5tX09yaWdpblgsIGZpcnN0Lm1fT3JpZ2luWSk7CisgIHRleHRNYXRyaXguVHJhbnNmb3JtUG9pbnQobGFzdC5tX09yaWdpblgsIGxhc3QubV9PcmlnaW5ZKTsKKyAgRlhfRkxPQVQgZFggPSBGWFNZU19mYWJzKGxhc3QubV9PcmlnaW5YIC0gZmlyc3QubV9PcmlnaW5YKTsKKyAgRlhfRkxPQVQgZFkgPSBGWFNZU19mYWJzKGxhc3QubV9PcmlnaW5ZIC0gZmlyc3QubV9PcmlnaW5ZKTsKKyAgaWYgKGRYIDw9IDAuMDAwMWYgJiYgZFkgPD0gMC4wMDAxZikgeworICAgIHJldHVybiAtMTsKKyAgfQorICBDRlhfVmVjdG9yRiB2OworICB2LlNldChkWCwgZFkpOworICB2Lk5vcm1hbGl6ZSgpOworICBpZiAodi55IDw9IDAuMDg3MmYpIHsKKyAgICByZXR1cm4gdi54IDw9IDAuMDg3MmYgPyBtX1RleHRsaW5lRGlyIDogMDsKKyAgfQorICBpZiAodi54IDw9IDAuMDg3MmYpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gbV9UZXh0bGluZURpcjsKIH0KLUZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6SXNTYW1lQXNQcmVUZXh0T2JqZWN0KENQREZfVGV4dE9iamVjdCogcFRleHRPYmosIEZYX1BPU0lUSU9OIE9ialBvcykKLXsKLSAgICBpZiAoIXBUZXh0T2JqKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6SXNIeXBoZW4oRlhfV0NIQVIgY3VyQ2hhcikgeworICBDRlhfV2lkZVN0cmluZyBzdHJDdXJUZXh0ID0gbV9UZW1wVGV4dEJ1Zi5HZXRXaWRlU3RyaW5nKCk7CisgIGlmIChzdHJDdXJUZXh0LkdldExlbmd0aCgpID09IDApIHsKKyAgICBzdHJDdXJUZXh0ID0gbV9UZXh0QnVmLkdldFdpZGVTdHJpbmcoKTsKKyAgfQorICBGWF9TVFJTSVpFIG5Db3VudCA9IHN0ckN1clRleHQuR2V0TGVuZ3RoKCk7CisgIGludCBuSW5kZXggPSBuQ291bnQgLSAxOworICBGWF9XQ0hBUiB3Y1RtcCA9IHN0ckN1clRleHQuR2V0QXQobkluZGV4KTsKKyAgd2hpbGUgKHdjVG1wID09IDB4MjAgJiYgbkluZGV4IDw9IG5Db3VudCAtIDEgJiYgbkluZGV4ID49IDApIHsKKyAgICB3Y1RtcCA9IHN0ckN1clRleHQuR2V0QXQoLS1uSW5kZXgpOworICB9CisgIGlmICgweDJEID09IHdjVG1wIHx8IDB4QUQgPT0gd2NUbXApIHsKKyAgICBpZiAoLS1uSW5kZXggPiAwKSB7CisgICAgICBGWF9XQ0hBUiBwcmVDaGFyID0gc3RyQ3VyVGV4dC5HZXRBdCgobkluZGV4KSk7CisgICAgICBpZiAoKChwcmVDaGFyID49IEwnQScgJiYgcHJlQ2hhciA8PSBMJ1onKSB8fAorICAgICAgICAgICAocHJlQ2hhciA+PSBMJ2EnICYmIHByZUNoYXIgPD0gTCd6JykpICYmCisgICAgICAgICAgKChjdXJDaGFyID49IEwnQScgJiYgY3VyQ2hhciA8PSBMJ1onKSB8fAorICAgICAgICAgICAoY3VyQ2hhciA+PSBMJ2EnICYmIGN1ckNoYXIgPD0gTCd6JykpKSB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQogICAgIH0KLSAgICBpbnQgaSA9IDA7Ci0gICAgaWYgKCFPYmpQb3MpIHsKLSAgICAgICAgT2JqUG9zID0gbV9wUGFnZS0+R2V0TGFzdE9iamVjdFBvc2l0aW9uKCk7Ci0gICAgfQotICAgIENQREZfUGFnZU9iamVjdCogcE9iaiA9IG1fcFBhZ2UtPkdldFByZXZPYmplY3QoT2JqUG9zKTsKLSAgICB3aGlsZSAoaSA8IDUgJiYgT2JqUG9zKSB7Ci0gICAgICAgIHBPYmogPSBtX3BQYWdlLT5HZXRQcmV2T2JqZWN0KE9ialBvcyk7Ci0gICAgICAgIGlmKHBPYmogPT0gcFRleHRPYmopIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmKHBPYmotPm1fVHlwZSAhPSBQREZQQUdFX1RFWFQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmKElzU2FtZVRleHRPYmplY3QoKENQREZfVGV4dE9iamVjdCopcE9iaiwgcFRleHRPYmopKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBpKys7Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6R2VuZXJhdGVDaGFySW5mbyhGWF9XQ0hBUiB1bmljb2RlLCBQQUdFQ0hBUl9JTkZPJiBpbmZvKQotewogICAgIGludCBzaXplID0gbV9UZW1wQ2hhckxpc3QuR2V0U2l6ZSgpOwogICAgIFBBR0VDSEFSX0lORk8gcHJlQ2hhcjsKICAgICBpZiAoc2l6ZSkgewotICAgICAgICBwcmVDaGFyID0gKFBBR0VDSEFSX0lORk8pbV9UZW1wQ2hhckxpc3Rbc2l6ZSAtIDFdOworICAgICAgcHJlQ2hhciA9IChQQUdFQ0hBUl9JTkZPKW1fVGVtcENoYXJMaXN0W3NpemUgLSAxXTsKICAgICB9IGVsc2UgewotICAgICAgICBzaXplID0gbV9jaGFyTGlzdC5HZXRTaXplKCk7Ci0gICAgICAgIGlmKHNpemUgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgc2l6ZSA9IG1fY2hhckxpc3QuR2V0U2l6ZSgpOworICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBwcmVDaGFyID0gKFBBR0VDSEFSX0lORk8pbV9jaGFyTGlzdFtzaXplIC0gMV07CisgICAgfQorICAgIGlmIChGUERGVEVYVF9DSEFSX1BJRUNFID09IHByZUNoYXIubV9GbGFnICYmCisgICAgICAgICgweEFEID09IHByZUNoYXIubV9Vbmljb2RlIHx8IDB4MkQgPT0gcHJlQ2hhci5tX1VuaWNvZGUpKSB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQoraW50IENQREZfVGV4dFBhZ2U6OlByb2Nlc3NJbnNlcnRPYmplY3QoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgZm9ybU1hdHJpeCkgeworICBGaW5kUHJldmlvdXNUZXh0T2JqZWN0KCk7CisgIEZYX0JPT0wgYk5ld2xpbmUgPSBGQUxTRTsKKyAgaW50IFdyaXRpbmdNb2RlID0gR2V0VGV4dE9iamVjdFdyaXRpbmdNb2RlKHBPYmopOworICBpZiAoV3JpdGluZ01vZGUgPT0gLTEpIHsKKyAgICBXcml0aW5nTW9kZSA9IEdldFRleHRPYmplY3RXcml0aW5nTW9kZShtX3BQcmVUZXh0T2JqKTsKKyAgfQorICBDRlhfRmxvYXRSZWN0IHRoaXNfcmVjdChwT2JqLT5tX0xlZnQsIHBPYmotPm1fQm90dG9tLCBwT2JqLT5tX1JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqLT5tX1RvcCk7CisgIENGWF9GbG9hdFJlY3QgcHJldl9yZWN0KG1fcFByZVRleHRPYmotPm1fTGVmdCwgbV9wUHJlVGV4dE9iai0+bV9Cb3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFByZVRleHRPYmotPm1fUmlnaHQsIG1fcFByZVRleHRPYmotPm1fVG9wKTsKKyAgQ1BERl9UZXh0T2JqZWN0SXRlbSBQcmV2SXRlbSwgaXRlbTsKKyAgaW50IG5JdGVtID0gbV9wUHJlVGV4dE9iai0+Q291bnRJdGVtcygpOworICBtX3BQcmVUZXh0T2JqLT5HZXRJdGVtSW5mbyhuSXRlbSAtIDEsICZQcmV2SXRlbSk7CisgIHBPYmotPkdldEl0ZW1JbmZvKDAsICZpdGVtKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgd3N0ckl0ZW0gPQorICAgICAgcE9iai0+R2V0Rm9udCgpLT5Vbmljb2RlRnJvbUNoYXJDb2RlKGl0ZW0ubV9DaGFyQ29kZSk7CisgIGlmICh3c3RySXRlbS5Jc0VtcHR5KCkpIHsKKyAgICB3c3RySXRlbSArPSAoRlhfV0NIQVIpaXRlbS5tX0NoYXJDb2RlOworICB9CisgIEZYX1dDSEFSIGN1ckNoYXIgPSB3c3RySXRlbS5HZXRBdCgwKTsKKyAgaWYgKFdyaXRpbmdNb2RlID09IDApIHsKKyAgICBpZiAodGhpc19yZWN0LkhlaWdodCgpID4gNC41ICYmIHByZXZfcmVjdC5IZWlnaHQoKSA+IDQuNSkgeworICAgICAgRlhfRkxPQVQgdG9wID0KKyAgICAgICAgICB0aGlzX3JlY3QudG9wIDwgcHJldl9yZWN0LnRvcCA/IHRoaXNfcmVjdC50b3AgOiBwcmV2X3JlY3QudG9wOworICAgICAgRlhfRkxPQVQgYm90dG9tID0gdGhpc19yZWN0LmJvdHRvbSA+IHByZXZfcmVjdC5ib3R0b20gPyB0aGlzX3JlY3QuYm90dG9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHByZXZfcmVjdC5ib3R0b207CisgICAgICBpZiAoYm90dG9tID49IHRvcCkgeworICAgICAgICBpZiAoSXNIeXBoZW4oY3VyQ2hhcikpIHsKKyAgICAgICAgICByZXR1cm4gMzsKICAgICAgICAgfQotICAgICAgICBwcmVDaGFyID0gKFBBR0VDSEFSX0lORk8pbV9jaGFyTGlzdFtzaXplIC0gMV07CisgICAgICAgIHJldHVybiAyOworICAgICAgfQogICAgIH0KLSAgICBpbmZvLm1fSW5kZXggPSBtX1RleHRCdWYuR2V0TGVuZ3RoKCk7Ci0gICAgaW5mby5tX1VuaWNvZGUgPSB1bmljb2RlOwotICAgIGluZm8ubV9wVGV4dE9iaiA9IE5VTEw7Ci0gICAgaW5mby5tX0NoYXJDb2RlID0gLTE7Ci0gICAgaW5mby5tX0ZsYWcgPSBGUERGVEVYVF9DSEFSX0dFTkVSQVRFRDsKLSAgICBpbnQgcHJlV2lkdGggPSAwOwotICAgIGlmIChwcmVDaGFyLm1fcFRleHRPYmogJiYgcHJlQ2hhci5tX0NoYXJDb2RlICE9IChGWF9EV09SRCkgLSAxKSB7Ci0gICAgICAgIHByZVdpZHRoID0gR2V0Q2hhcldpZHRoKHByZUNoYXIubV9DaGFyQ29kZSwgcHJlQ2hhci5tX3BUZXh0T2JqLT5HZXRGb250KCkpOworICB9IGVsc2UgaWYgKFdyaXRpbmdNb2RlID09IDEpIHsKKyAgICBpZiAodGhpc19yZWN0LldpZHRoKCkgPiBwT2JqLT5HZXRGb250U2l6ZSgpICogMC4xZiAmJgorICAgICAgICBwcmV2X3JlY3QuV2lkdGgoKSA+IG1fcFByZVRleHRPYmotPkdldEZvbnRTaXplKCkgKiAwLjFmKSB7CisgICAgICBGWF9GTE9BVCBsZWZ0ID0gdGhpc19yZWN0LmxlZnQgPiBtX0N1cmxpbmVSZWN0LmxlZnQgPyB0aGlzX3JlY3QubGVmdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbV9DdXJsaW5lUmVjdC5sZWZ0OworICAgICAgRlhfRkxPQVQgcmlnaHQgPSB0aGlzX3JlY3QucmlnaHQgPCBtX0N1cmxpbmVSZWN0LnJpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXNfcmVjdC5yaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX0N1cmxpbmVSZWN0LnJpZ2h0OworICAgICAgaWYgKHJpZ2h0IDw9IGxlZnQpIHsKKyAgICAgICAgaWYgKElzSHlwaGVuKGN1ckNoYXIpKSB7CisgICAgICAgICAgcmV0dXJuIDM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDI7CisgICAgICB9CiAgICAgfQotICAgIEZYX0ZMT0FUIGZzID0gMDsKLSAgICBpZihwcmVDaGFyLm1fcFRleHRPYmopIHsKLSAgICAgICAgZnMgPSBwcmVDaGFyLm1fcFRleHRPYmotPkdldEZvbnRTaXplKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnMgPSBwcmVDaGFyLm1fQ2hhckJveC5IZWlnaHQoKTsKKyAgfQorICBGWF9GTE9BVCBsYXN0X3BvcyA9IFByZXZJdGVtLm1fT3JpZ2luWDsKKyAgaW50IG5MYXN0V2lkdGggPSBHZXRDaGFyV2lkdGgoUHJldkl0ZW0ubV9DaGFyQ29kZSwgbV9wUHJlVGV4dE9iai0+R2V0Rm9udCgpKTsKKyAgRlhfRkxPQVQgbGFzdF93aWR0aCA9IG5MYXN0V2lkdGggKiBtX3BQcmVUZXh0T2JqLT5HZXRGb250U2l6ZSgpIC8gMTAwMDsKKyAgbGFzdF93aWR0aCA9IEZYU1lTX2ZhYnMobGFzdF93aWR0aCk7CisgIGludCBuVGhpc1dpZHRoID0gR2V0Q2hhcldpZHRoKGl0ZW0ubV9DaGFyQ29kZSwgcE9iai0+R2V0Rm9udCgpKTsKKyAgRlhfRkxPQVQgdGhpc193aWR0aCA9IG5UaGlzV2lkdGggKiBwT2JqLT5HZXRGb250U2l6ZSgpIC8gMTAwMDsKKyAgdGhpc193aWR0aCA9IEZYU1lTX2ZhYnModGhpc193aWR0aCk7CisgIEZYX0ZMT0FUIHRocmVzaG9sZCA9CisgICAgICBsYXN0X3dpZHRoID4gdGhpc193aWR0aCA/IGxhc3Rfd2lkdGggLyA0IDogdGhpc193aWR0aCAvIDQ7CisgIENGWF9NYXRyaXggcHJldl9tYXRyaXgsIHByZXZfcmV2ZXJzZTsKKyAgbV9wUHJlVGV4dE9iai0+R2V0VGV4dE1hdHJpeCgmcHJldl9tYXRyaXgpOworICBwcmV2X21hdHJpeC5Db25jYXQobV9wZXJNYXRyaXgpOworICBwcmV2X3JldmVyc2UuU2V0UmV2ZXJzZShwcmV2X21hdHJpeCk7CisgIEZYX0ZMT0FUIHggPSBwT2JqLT5HZXRQb3NYKCk7CisgIEZYX0ZMT0FUIHkgPSBwT2JqLT5HZXRQb3NZKCk7CisgIGZvcm1NYXRyaXguVHJhbnNmb3JtKHgsIHkpOworICBwcmV2X3JldmVyc2UuVHJhbnNmb3JtKHgsIHkpOworICBpZiAobGFzdF93aWR0aCA8IHRoaXNfd2lkdGgpIHsKKyAgICB0aHJlc2hvbGQgPSBwcmV2X3JldmVyc2UuVHJhbnNmb3JtRGlzdGFuY2UodGhyZXNob2xkKTsKKyAgfQorICBDRlhfRmxvYXRSZWN0IHJlY3QxKG1fcFByZVRleHRPYmotPm1fTGVmdCwgcE9iai0+bV9Cb3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgbV9wUHJlVGV4dE9iai0+bV9SaWdodCwgcE9iai0+bV9Ub3ApOworICBDRlhfRmxvYXRSZWN0IHJlY3QyKG1fcFByZVRleHRPYmotPm1fTGVmdCwgbV9wUHJlVGV4dE9iai0+bV9Cb3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgbV9wUHJlVGV4dE9iai0+bV9SaWdodCwgbV9wUHJlVGV4dE9iai0+bV9Ub3ApOworICBDRlhfRmxvYXRSZWN0IHJlY3QzID0gcmVjdDE7CisgIHJlY3QxLkludGVyc2VjdChyZWN0Mik7CisgIGlmIChXcml0aW5nTW9kZSA9PSAwKSB7CisgICAgaWYgKChyZWN0MS5Jc0VtcHR5KCkgJiYgcmVjdDIuSGVpZ2h0KCkgPiA1ICYmIHJlY3QzLkhlaWdodCgpID4gNSkgfHwKKyAgICAgICAgKCh5ID4gdGhyZXNob2xkICogMiB8fCB5IDwgdGhyZXNob2xkICogLTMpICYmCisgICAgICAgICAoRlhTWVNfZmFicyh5KSA8IDEgPyBGWFNZU19mYWJzKHgpIDwgRlhTWVNfZmFicyh5KSA6IFRSVUUpKSkgeworICAgICAgYk5ld2xpbmUgPSBUUlVFOworICAgICAgaWYgKG5JdGVtID4gMSkgeworICAgICAgICBDUERGX1RleHRPYmplY3RJdGVtIHRlbXBJdGVtOworICAgICAgICBtX3BQcmVUZXh0T2JqLT5HZXRJdGVtSW5mbygwLCAmdGVtcEl0ZW0pOworICAgICAgICBDRlhfTWF0cml4IG07CisgICAgICAgIG1fcFByZVRleHRPYmotPkdldFRleHRNYXRyaXgoJm0pOworICAgICAgICBpZiAoUHJldkl0ZW0ubV9PcmlnaW5YID4gdGVtcEl0ZW0ubV9PcmlnaW5YICYmCisgICAgICAgICAgICBtX0Rpc3BsYXlNYXRyaXguYSA+IDAuOSAmJiBtX0Rpc3BsYXlNYXRyaXguYiA8IDAuMSAmJgorICAgICAgICAgICAgbV9EaXNwbGF5TWF0cml4LmMgPCAwLjEgJiYgbV9EaXNwbGF5TWF0cml4LmQgPCAtMC45ICYmIG0uYiA8IDAuMSAmJgorICAgICAgICAgICAgbS5jIDwgMC4xKSB7CisgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByZSgwLCBtX3BQcmVUZXh0T2JqLT5tX0JvdHRvbSwgMTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFByZVRleHRPYmotPm1fVG9wKTsKKyAgICAgICAgICBpZiAocmUuQ29udGFpbnMocE9iai0+R2V0UG9zWCgpLCBwT2JqLT5HZXRQb3NZKCkpKSB7CisgICAgICAgICAgICBiTmV3bGluZSA9IEZBTFNFOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDRlhfRmxvYXRSZWN0IHJlKDAsIHBPYmotPm1fQm90dG9tLCAxMDAwLCBwT2JqLT5tX1RvcCk7CisgICAgICAgICAgICBpZiAocmUuQ29udGFpbnMobV9wUHJlVGV4dE9iai0+R2V0UG9zWCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFByZVRleHRPYmotPkdldFBvc1koKSkpIHsKKyAgICAgICAgICAgICAgYk5ld2xpbmUgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KICAgICB9Ci0gICAgaWYoIWZzKSB7Ci0gICAgICAgIGZzID0gMTsKKyAgfQorICBpZiAoYk5ld2xpbmUpCisgICAgcmV0dXJuIElzSHlwaGVuKGN1ckNoYXIpID8gMyA6IDI7CisKKyAgaW50MzJfdCBuQ2hhcnMgPSBwT2JqLT5Db3VudENoYXJzKCk7CisgIGlmIChuQ2hhcnMgPT0gMSAmJiAoMHgyRCA9PSBjdXJDaGFyIHx8IDB4QUQgPT0gY3VyQ2hhcikgJiYKKyAgICAgIElzSHlwaGVuKGN1ckNoYXIpKSB7CisgICAgcmV0dXJuIDM7CisgIH0KKyAgQ0ZYX1dpZGVTdHJpbmcgUHJldlN0ciA9CisgICAgICBtX3BQcmVUZXh0T2JqLT5HZXRGb250KCktPlVuaWNvZGVGcm9tQ2hhckNvZGUoUHJldkl0ZW0ubV9DaGFyQ29kZSk7CisgIEZYX1dDSEFSIHByZUNoYXIgPSBQcmV2U3RyLkdldEF0KFByZXZTdHIuR2V0TGVuZ3RoKCkgLSAxKTsKKyAgQ0ZYX01hdHJpeCBtYXRyaXg7CisgIHBPYmotPkdldFRleHRNYXRyaXgoJm1hdHJpeCk7CisgIG1hdHJpeC5Db25jYXQoZm9ybU1hdHJpeCk7CisgIHRocmVzaG9sZCA9IChGWF9GTE9BVCkobkxhc3RXaWR0aCA+IG5UaGlzV2lkdGggPyBuTGFzdFdpZHRoIDogblRoaXNXaWR0aCk7CisgIHRocmVzaG9sZCA9IHRocmVzaG9sZCA+IDQwMAorICAgICAgICAgICAgICAgICAgPyAodGhyZXNob2xkIDwgNzAwCisgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aHJlc2hvbGQgLyA0CisgICAgICAgICAgICAgICAgICAgICAgICAgOiAodGhyZXNob2xkID4gODAwID8gdGhyZXNob2xkIC8gNiA6IHRocmVzaG9sZCAvIDUpKQorICAgICAgICAgICAgICAgICAgOiAodGhyZXNob2xkIC8gMik7CisgIGlmIChuTGFzdFdpZHRoID49IG5UaGlzV2lkdGgpIHsKKyAgICB0aHJlc2hvbGQgKj0gRlhTWVNfZmFicyhtX3BQcmVUZXh0T2JqLT5HZXRGb250U2l6ZSgpKTsKKyAgfSBlbHNlIHsKKyAgICB0aHJlc2hvbGQgKj0gRlhTWVNfZmFicyhwT2JqLT5HZXRGb250U2l6ZSgpKTsKKyAgICB0aHJlc2hvbGQgPSBtYXRyaXguVHJhbnNmb3JtRGlzdGFuY2UodGhyZXNob2xkKTsKKyAgICB0aHJlc2hvbGQgPSBwcmV2X3JldmVyc2UuVHJhbnNmb3JtRGlzdGFuY2UodGhyZXNob2xkKTsKKyAgfQorICB0aHJlc2hvbGQgLz0gMTAwMDsKKyAgaWYgKCh0aHJlc2hvbGQgPCAxLjQ4ODEgJiYgdGhyZXNob2xkID4gMS40ODc5KSB8fAorICAgICAgKHRocmVzaG9sZCA8IDEuMzkwMDEgJiYgdGhyZXNob2xkID4gMS4zODk5OSkpIHsKKyAgICB0aHJlc2hvbGQgKj0gMS41OworICB9CisgIGlmIChGWFNZU19mYWJzKGxhc3RfcG9zICsgbGFzdF93aWR0aCAtIHgpID4gdGhyZXNob2xkICYmIGN1ckNoYXIgIT0gTCcgJyAmJgorICAgICAgcHJlQ2hhciAhPSBMJyAnKSB7CisgICAgaWYgKGN1ckNoYXIgIT0gTCcgJyAmJiBwcmVDaGFyICE9IEwnICcpIHsKKyAgICAgIGlmICgoeCAtIGxhc3RfcG9zIC0gbGFzdF93aWR0aCkgPiB0aHJlc2hvbGQgfHwKKyAgICAgICAgICAobGFzdF9wb3MgLSB4IC0gbGFzdF93aWR0aCkgPiB0aHJlc2hvbGQpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBpZiAoeCA8IDAgJiYgKGxhc3RfcG9zIC0geCAtIGxhc3Rfd2lkdGgpID4gdGhyZXNob2xkKSB7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgaWYgKCh4IC0gbGFzdF9wb3MgLSBsYXN0X3dpZHRoKSA+IHRoaXNfd2lkdGggfHwKKyAgICAgICAgICAoeCAtIGxhc3RfcG9zIC0gdGhpc193aWR0aCkgPiBsYXN0X3dpZHRoKSB7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQogICAgIH0KLSAgICBpbmZvLm1fT3JpZ2luWCA9IHByZUNoYXIubV9PcmlnaW5YICsgcHJlV2lkdGggKiAoZnMpIC8gMTAwMDsKLSAgICBpbmZvLm1fT3JpZ2luWSA9IHByZUNoYXIubV9PcmlnaW5ZOwotICAgIGluZm8ubV9DaGFyQm94ID0gQ0ZYX0Zsb2F0UmVjdChpbmZvLm1fT3JpZ2luWCwgaW5mby5tX09yaWdpblksIGluZm8ubV9PcmlnaW5YLCBpbmZvLm1fT3JpZ2luWSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIDA7CiB9Ci1GWF9CT09MIENQREZfVGV4dFBhZ2U6OklzUmVjdEludGVyc2VjdChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0MSwgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdDIpCi17Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByZWN0ID0gcmVjdDE7Ci0gICAgcmVjdC5JbnRlcnNlY3QocmVjdDIpOwotICAgIHJldHVybiAhcmVjdC5Jc0VtcHR5KCk7CitGWF9CT09MIENQREZfVGV4dFBhZ2U6OklzU2FtZVRleHRPYmplY3QoQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iajEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iajIpIHsKKyAgaWYgKCFwVGV4dE9iajEgfHwgIXBUZXh0T2JqMikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDRlhfRmxvYXRSZWN0IHJjUHJlT2JqKHBUZXh0T2JqMi0+bV9MZWZ0LCBwVGV4dE9iajItPm1fQm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBUZXh0T2JqMi0+bV9SaWdodCwgcFRleHRPYmoyLT5tX1RvcCk7CisgIENGWF9GbG9hdFJlY3QgcmNDdXJPYmoocFRleHRPYmoxLT5tX0xlZnQsIHBUZXh0T2JqMS0+bV9Cb3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgcFRleHRPYmoxLT5tX1JpZ2h0LCBwVGV4dE9iajEtPm1fVG9wKTsKKyAgaWYgKHJjUHJlT2JqLklzRW1wdHkoKSAmJiByY0N1ck9iai5Jc0VtcHR5KCkgJiYKKyAgICAgICFtX1BhcnNlT3B0aW9ucy5tX2JHZXRDaGFyQ29kZU9ubHkpIHsKKyAgICBGWF9GTE9BVCBkYlhkaWYgPSBGWFNZU19mYWJzKHJjUHJlT2JqLmxlZnQgLSByY0N1ck9iai5sZWZ0KTsKKyAgICBpbnQgbkNvdW50ID0gbV9jaGFyTGlzdC5HZXRTaXplKCk7CisgICAgaWYgKG5Db3VudCA+PSAyKSB7CisgICAgICBQQUdFQ0hBUl9JTkZPIHBlckNoYXJUZW1wID0gKFBBR0VDSEFSX0lORk8pbV9jaGFyTGlzdFtuQ291bnQgLSAyXTsKKyAgICAgIEZYX0ZMT0FUIGRiU3BhY2UgPSBwZXJDaGFyVGVtcC5tX0NoYXJCb3guV2lkdGgoKTsKKyAgICAgIGlmIChkYlhkaWYgPiBkYlNwYWNlKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKCFyY1ByZU9iai5Jc0VtcHR5KCkgfHwgIXJjQ3VyT2JqLklzRW1wdHkoKSkgeworICAgIHJjUHJlT2JqLkludGVyc2VjdChyY0N1ck9iaik7CisgICAgaWYgKHJjUHJlT2JqLklzRW1wdHkoKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZiAoRlhTWVNfZmFicyhyY1ByZU9iai5XaWR0aCgpIC0gcmNDdXJPYmouV2lkdGgoKSkgPgorICAgICAgICByY0N1ck9iai5XaWR0aCgpIC8gMikgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZiAocFRleHRPYmoyLT5HZXRGb250U2l6ZSgpICE9IHBUZXh0T2JqMS0+R2V0Rm9udFNpemUoKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorICBpbnQgblByZUNvdW50ID0gcFRleHRPYmoyLT5Db3VudEl0ZW1zKCk7CisgIGludCBuQ3VyQ291bnQgPSBwVGV4dE9iajEtPkNvdW50SXRlbXMoKTsKKyAgaWYgKG5QcmVDb3VudCAhPSBuQ3VyQ291bnQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ1BERl9UZXh0T2JqZWN0SXRlbSBpdGVtUGVyLCBpdGVtQ3VyOworICBmb3IgKGludCBpID0gMDsgaSA8IG5QcmVDb3VudDsgaSsrKSB7CisgICAgcFRleHRPYmoyLT5HZXRJdGVtSW5mbyhpLCAmaXRlbVBlcik7CisgICAgcFRleHRPYmoxLT5HZXRJdGVtSW5mbyhpLCAmaXRlbUN1cik7CisgICAgaWYgKGl0ZW1DdXIubV9DaGFyQ29kZSAhPSBpdGVtUGVyLm1fQ2hhckNvZGUpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKyAgaWYgKEZYU1lTX2ZhYnMocFRleHRPYmoxLT5HZXRQb3NYKCkgLSBwVGV4dE9iajItPkdldFBvc1goKSkgPgorICAgICAgICAgIEdldENoYXJXaWR0aChpdGVtUGVyLm1fQ2hhckNvZGUsIHBUZXh0T2JqMi0+R2V0Rm9udCgpKSAqCisgICAgICAgICAgICAgIHBUZXh0T2JqMi0+R2V0Rm9udFNpemUoKSAvIDEwMDAgKiAwLjkgfHwKKyAgICAgIEZYU1lTX2ZhYnMocFRleHRPYmoxLT5HZXRQb3NZKCkgLSBwVGV4dE9iajItPkdldFBvc1koKSkgPgorICAgICAgICAgIHN0ZDo6bWF4KHN0ZDo6bWF4KHJjUHJlT2JqLkhlaWdodCgpLCByY1ByZU9iai5XaWR0aCgpKSwKKyAgICAgICAgICAgICAgICAgICBwVGV4dE9iajItPkdldEZvbnRTaXplKCkpIC8KKyAgICAgICAgICAgICAgOCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wJQ1BERl9UZXh0UGFnZTo6SXNMZXR0ZXIoRlhfV0NIQVIgdW5pY29kZSkKLXsKLSAgICBpZiAodW5pY29kZSA8IEwnQScpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDUERGX1RleHRQYWdlOjpJc1NhbWVBc1ByZVRleHRPYmplY3QoQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1BPU0lUSU9OIE9ialBvcykgeworICBpZiAoIXBUZXh0T2JqKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGludCBpID0gMDsKKyAgaWYgKCFPYmpQb3MpIHsKKyAgICBPYmpQb3MgPSBtX3BQYWdlLT5HZXRMYXN0T2JqZWN0UG9zaXRpb24oKTsKKyAgfQorICBDUERGX1BhZ2VPYmplY3QqIHBPYmogPSBtX3BQYWdlLT5HZXRQcmV2T2JqZWN0KE9ialBvcyk7CisgIHdoaWxlIChpIDwgNSAmJiBPYmpQb3MpIHsKKyAgICBwT2JqID0gbV9wUGFnZS0+R2V0UHJldk9iamVjdChPYmpQb3MpOworICAgIGlmIChwT2JqID09IHBUZXh0T2JqKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgaWYgKHVuaWNvZGUgPiBMJ1onICYmIHVuaWNvZGUgPCBMJ2EnKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAocE9iai0+bV9UeXBlICE9IFBERlBBR0VfVEVYVCkgeworICAgICAgY29udGludWU7CiAgICAgfQotICAgIGlmICh1bmljb2RlID4gTCd6JykgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKElzU2FtZVRleHRPYmplY3QoKENQREZfVGV4dE9iamVjdCopcE9iaiwgcFRleHRPYmopKSB7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgaSsrOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworRlhfQk9PTCBDUERGX1RleHRQYWdlOjpHZW5lcmF0ZUNoYXJJbmZvKEZYX1dDSEFSIHVuaWNvZGUsIFBBR0VDSEFSX0lORk8mIGluZm8pIHsKKyAgaW50IHNpemUgPSBtX1RlbXBDaGFyTGlzdC5HZXRTaXplKCk7CisgIFBBR0VDSEFSX0lORk8gcHJlQ2hhcjsKKyAgaWYgKHNpemUpIHsKKyAgICBwcmVDaGFyID0gKFBBR0VDSEFSX0lORk8pbV9UZW1wQ2hhckxpc3Rbc2l6ZSAtIDFdOworICB9IGVsc2UgeworICAgIHNpemUgPSBtX2NoYXJMaXN0LkdldFNpemUoKTsKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHByZUNoYXIgPSAoUEFHRUNIQVJfSU5GTyltX2NoYXJMaXN0W3NpemUgLSAxXTsKKyAgfQorICBpbmZvLm1fSW5kZXggPSBtX1RleHRCdWYuR2V0TGVuZ3RoKCk7CisgIGluZm8ubV9Vbmljb2RlID0gdW5pY29kZTsKKyAgaW5mby5tX3BUZXh0T2JqID0gTlVMTDsKKyAgaW5mby5tX0NoYXJDb2RlID0gLTE7CisgIGluZm8ubV9GbGFnID0gRlBERlRFWFRfQ0hBUl9HRU5FUkFURUQ7CisgIGludCBwcmVXaWR0aCA9IDA7CisgIGlmIChwcmVDaGFyLm1fcFRleHRPYmogJiYgcHJlQ2hhci5tX0NoYXJDb2RlICE9IChGWF9EV09SRCktMSkKKyAgICBwcmVXaWR0aCA9IEdldENoYXJXaWR0aChwcmVDaGFyLm1fQ2hhckNvZGUsIHByZUNoYXIubV9wVGV4dE9iai0+R2V0Rm9udCgpKTsKKworICBGWF9GTE9BVCBmRm9udFNpemUgPSBwcmVDaGFyLm1fcFRleHRPYmogPyBwcmVDaGFyLm1fcFRleHRPYmotPkdldEZvbnRTaXplKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcHJlQ2hhci5tX0NoYXJCb3guSGVpZ2h0KCk7CisgIGlmICghZkZvbnRTaXplKQorICAgIGZGb250U2l6ZSA9IGtEZWZhdWx0Rm9udFNpemU7CisKKyAgaW5mby5tX09yaWdpblggPSBwcmVDaGFyLm1fT3JpZ2luWCArIHByZVdpZHRoICogKGZGb250U2l6ZSkgLyAxMDAwOworICBpbmZvLm1fT3JpZ2luWSA9IHByZUNoYXIubV9PcmlnaW5ZOworICBpbmZvLm1fQ2hhckJveCA9IENGWF9GbG9hdFJlY3QoaW5mby5tX09yaWdpblgsIGluZm8ubV9PcmlnaW5ZLCBpbmZvLm1fT3JpZ2luWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubV9PcmlnaW5ZKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6SXNSZWN0SW50ZXJzZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdDIpIHsKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0ID0gcmVjdDE7CisgIHJlY3QuSW50ZXJzZWN0KHJlY3QyKTsKKyAgcmV0dXJuICFyZWN0LklzRW1wdHkoKTsKK30KK0ZYX0JPT0wgQ1BERl9UZXh0UGFnZTo6SXNMZXR0ZXIoRlhfV0NIQVIgdW5pY29kZSkgeworICBpZiAodW5pY29kZSA8IEwnQScpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKHVuaWNvZGUgPiBMJ1onICYmIHVuaWNvZGUgPCBMJ2EnKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICh1bmljb2RlID4gTCd6JykgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIENQREZfVGV4dFBhZ2VGaW5kOjpDUERGX1RleHRQYWdlRmluZChjb25zdCBJUERGX1RleHRQYWdlKiBwVGV4dFBhZ2UpCiAgICAgOiBtX3BUZXh0UGFnZShwVGV4dFBhZ2UpLApAQCAtMjIzNSw2MDYgKzIxMjAsNjA4IEBACiAgICAgICBtX2JNYXRjaFdob2xlV29yZChGQUxTRSksCiAgICAgICBtX3Jlc1N0YXJ0KDApLAogICAgICAgbV9yZXNFbmQoLTEpLAotICAgICAgbV9Jc0ZpbmQoRkFMU0UpCi17CisgICAgICBtX0lzRmluZChGQUxTRSkgeworICBtX3N0clRleHQgPSBtX3BUZXh0UGFnZS0+R2V0UGFnZVRleHQoKTsKKyAgaW50IG5Db3VudCA9IHBUZXh0UGFnZS0+Q291bnRDaGFycygpOworICBpZiAobkNvdW50KSB7CisgICAgbV9DaGFySW5kZXguQWRkKDApOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKKyAgICBGUERGX0NIQVJfSU5GTyBpbmZvOworICAgIHBUZXh0UGFnZS0+R2V0Q2hhckluZm8oaSwgJmluZm8pOworICAgIGludCBpbmRleFNpemUgPSBtX0NoYXJJbmRleC5HZXRTaXplKCk7CisgICAgaWYgKGluZm8ubV9GbGFnID09IENIQVJfTk9STUFMIHx8IGluZm8ubV9GbGFnID09IENIQVJfR0VORVJBVEVEKSB7CisgICAgICBpZiAoaW5kZXhTaXplICUgMikgeworICAgICAgICBtX0NoYXJJbmRleC5BZGQoMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoaW5kZXhTaXplIDw9IDApIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBtX0NoYXJJbmRleC5TZXRBdChpbmRleFNpemUgLSAxLCBtX0NoYXJJbmRleC5HZXRBdChpbmRleFNpemUgLSAxKSArIDEpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoaW5kZXhTaXplICUgMikgeworICAgICAgICBpZiAoaW5kZXhTaXplIDw9IDApIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBtX0NoYXJJbmRleC5TZXRBdChpbmRleFNpemUgLSAxLCBpICsgMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBtX0NoYXJJbmRleC5BZGQoaSArIDEpOworICAgICAgfQorICAgIH0KKyAgfQorICBpbnQgaW5kZXhTaXplID0gbV9DaGFySW5kZXguR2V0U2l6ZSgpOworICBpZiAoaW5kZXhTaXplICUgMikgeworICAgIG1fQ2hhckluZGV4LlJlbW92ZUF0KGluZGV4U2l6ZSAtIDEpOworICB9Cit9CitpbnQgQ1BERl9UZXh0UGFnZUZpbmQ6OkdldENoYXJJbmRleChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcFRleHRQYWdlLT5DaGFySW5kZXhGcm9tVGV4dEluZGV4KGluZGV4KTsKKyAgaW50IGluZGV4U2l6ZSA9IG1fQ2hhckluZGV4LkdldFNpemUoKTsKKyAgaW50IGNvdW50ID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleFNpemU7IGkgKz0gMikgeworICAgIGNvdW50ICs9IG1fQ2hhckluZGV4LkdldEF0KGkgKyAxKTsKKyAgICBpZiAoY291bnQgPiBpbmRleCkgeworICAgICAgcmV0dXJuIGluZGV4IC0gY291bnQgKyBtX0NoYXJJbmRleC5HZXRBdChpICsgMSkgKyBtX0NoYXJJbmRleC5HZXRBdChpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIC0xOworfQorRlhfQk9PTCBDUERGX1RleHRQYWdlRmluZDo6RmluZEZpcnN0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmaW5kd2hhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0UG9zKSB7CisgIGlmICghbV9wVGV4dFBhZ2UpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fc3RyVGV4dC5Jc0VtcHR5KCkgfHwgbV9iTWF0Y2hDYXNlICE9IChmbGFncyAmIEZQREZURVhUX01BVENIQ0FTRSkpIHsKICAgICBtX3N0clRleHQgPSBtX3BUZXh0UGFnZS0+R2V0UGFnZVRleHQoKTsKLSAgICBpbnQgbkNvdW50ID0gcFRleHRQYWdlLT5Db3VudENoYXJzKCk7Ci0gICAgaWYobkNvdW50KSB7Ci0gICAgICAgIG1fQ2hhckluZGV4LkFkZCgwKTsKLSAgICB9Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7Ci0gICAgICAgIEZQREZfQ0hBUl9JTkZPIGluZm87Ci0gICAgICAgIHBUZXh0UGFnZS0+R2V0Q2hhckluZm8oaSwgaW5mbyk7Ci0gICAgICAgIGludCBpbmRleFNpemUgPSBtX0NoYXJJbmRleC5HZXRTaXplKCk7Ci0gICAgICAgIGlmKGluZm8ubV9GbGFnID09IENIQVJfTk9STUFMIHx8IGluZm8ubV9GbGFnID09IENIQVJfR0VORVJBVEVEKSB7Ci0gICAgICAgICAgICBpZihpbmRleFNpemUgJSAyKSB7Ci0gICAgICAgICAgICAgICAgbV9DaGFySW5kZXguQWRkKDEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZihpbmRleFNpemUgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9DaGFySW5kZXguU2V0QXQoaW5kZXhTaXplIC0gMSwgbV9DaGFySW5kZXguR2V0QXQoaW5kZXhTaXplIC0gMSkgKyAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmKGluZGV4U2l6ZSAlIDIpIHsKLSAgICAgICAgICAgICAgICBpZihpbmRleFNpemUgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9DaGFySW5kZXguU2V0QXQoaW5kZXhTaXplIC0gMSwgaSArIDEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX0NoYXJJbmRleC5BZGQoaSArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGludCBpbmRleFNpemUgPSBtX0NoYXJJbmRleC5HZXRTaXplKCk7Ci0gICAgaWYoaW5kZXhTaXplICUgMikgewotICAgICAgICBtX0NoYXJJbmRleC5SZW1vdmVBdChpbmRleFNpemUgLSAxKTsKLSAgICB9Ci19Ci1pbnQgQ1BERl9UZXh0UGFnZUZpbmQ6OkdldENoYXJJbmRleChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcFRleHRQYWdlLT5DaGFySW5kZXhGcm9tVGV4dEluZGV4KGluZGV4KTsKLSAgICBpbnQgaW5kZXhTaXplID0gbV9DaGFySW5kZXguR2V0U2l6ZSgpOwotICAgIGludCBjb3VudCA9IDA7Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IGluZGV4U2l6ZTsgaSArPSAyKSB7Ci0gICAgICAgIGNvdW50ICs9IG1fQ2hhckluZGV4LkdldEF0KGkgKyAxKTsKLSAgICAgICAgaWYoY291bnQgPiBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIAlpbmRleCAtIGNvdW50ICsgbV9DaGFySW5kZXguR2V0QXQoaSArIDEpICsgbV9DaGFySW5kZXguR2V0QXQoaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotRlhfQk9PTAlDUERGX1RleHRQYWdlRmluZDo6RmluZEZpcnN0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmaW5kd2hhdCwgaW50IGZsYWdzLCBpbnQgc3RhcnRQb3MpCi17Ci0gICAgaWYgKCFtX3BUZXh0UGFnZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX3N0clRleHQuSXNFbXB0eSgpIHx8IG1fYk1hdGNoQ2FzZSAhPSAoZmxhZ3MgJiBGUERGVEVYVF9NQVRDSENBU0UpKSB7Ci0gICAgICAgIG1fc3RyVGV4dCA9IG1fcFRleHRQYWdlLT5HZXRQYWdlVGV4dCgpOwotICAgIH0KLSAgICBDRlhfV2lkZVN0cmluZyBmaW5kd2hhdFN0ciA9IGZpbmR3aGF0OwotICAgIG1fZmluZFdoYXQgPSBmaW5kd2hhdFN0cjsKLSAgICBtX2ZsYWdzID0gZmxhZ3M7Ci0gICAgbV9iTWF0Y2hDYXNlID0gZmxhZ3MgJiBGUERGVEVYVF9NQVRDSENBU0U7Ci0gICAgaWYgKG1fc3RyVGV4dC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgbV9Jc0ZpbmQgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIEZYX1NUUlNJWkUgbGVuID0gZmluZHdoYXRTdHIuR2V0TGVuZ3RoKCk7Ci0gICAgaWYgKCFtX2JNYXRjaENhc2UpIHsKLSAgICAgICAgZmluZHdoYXRTdHIuTWFrZUxvd2VyKCk7Ci0gICAgICAgIG1fc3RyVGV4dC5NYWtlTG93ZXIoKTsKLSAgICB9Ci0gICAgbV9iTWF0Y2hXaG9sZVdvcmQgPSBmbGFncyAmIEZQREZURVhUX01BVENIV0hPTEVXT1JEOwotICAgIG1fZmluZE5leHRTdGFydCA9IHN0YXJ0UG9zOwotICAgIGlmIChzdGFydFBvcyA9PSAtMSkgewotICAgICAgICBtX2ZpbmRQcmVTdGFydCA9IG1fc3RyVGV4dC5HZXRMZW5ndGgoKSAtIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9maW5kUHJlU3RhcnQgPSBzdGFydFBvczsKLSAgICB9Ci0gICAgbV9jc0ZpbmRXaGF0QXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgaW50IGkgPSAwOwotICAgIHdoaWxlKGkgPCBsZW4pIHsKLSAgICAgICAgaWYoZmluZHdoYXRTdHIuR2V0QXQoaSkgIT0gJyAnKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpKys7Ci0gICAgfQotICAgIGlmKGkgPCBsZW4pIHsKLSAgICAgICAgRXh0cmFjdEZpbmRXaGF0KGZpbmR3aGF0U3RyKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX2NzRmluZFdoYXRBcnJheS5BZGQoZmluZHdoYXRTdHIpOwotICAgIH0KLSAgICBpZihtX2NzRmluZFdoYXRBcnJheS5HZXRTaXplKCkgPD0gMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fSXNGaW5kID0gVFJVRTsKLSAgICBtX3Jlc1N0YXJ0ID0gMDsKLSAgICBtX3Jlc0VuZCA9IC0xOworICB9CisgIENGWF9XaWRlU3RyaW5nIGZpbmR3aGF0U3RyID0gZmluZHdoYXQ7CisgIG1fZmluZFdoYXQgPSBmaW5kd2hhdFN0cjsKKyAgbV9mbGFncyA9IGZsYWdzOworICBtX2JNYXRjaENhc2UgPSBmbGFncyAmIEZQREZURVhUX01BVENIQ0FTRTsKKyAgaWYgKG1fc3RyVGV4dC5Jc0VtcHR5KCkpIHsKKyAgICBtX0lzRmluZCA9IEZBTFNFOwogICAgIHJldHVybiBUUlVFOworICB9CisgIEZYX1NUUlNJWkUgbGVuID0gZmluZHdoYXRTdHIuR2V0TGVuZ3RoKCk7CisgIGlmICghbV9iTWF0Y2hDYXNlKSB7CisgICAgZmluZHdoYXRTdHIuTWFrZUxvd2VyKCk7CisgICAgbV9zdHJUZXh0Lk1ha2VMb3dlcigpOworICB9CisgIG1fYk1hdGNoV2hvbGVXb3JkID0gZmxhZ3MgJiBGUERGVEVYVF9NQVRDSFdIT0xFV09SRDsKKyAgbV9maW5kTmV4dFN0YXJ0ID0gc3RhcnRQb3M7CisgIGlmIChzdGFydFBvcyA9PSAtMSkgeworICAgIG1fZmluZFByZVN0YXJ0ID0gbV9zdHJUZXh0LkdldExlbmd0aCgpIC0gMTsKKyAgfSBlbHNlIHsKKyAgICBtX2ZpbmRQcmVTdGFydCA9IHN0YXJ0UG9zOworICB9CisgIG1fY3NGaW5kV2hhdEFycmF5LlJlbW92ZUFsbCgpOworICBpbnQgaSA9IDA7CisgIHdoaWxlIChpIDwgbGVuKSB7CisgICAgaWYgKGZpbmR3aGF0U3RyLkdldEF0KGkpICE9ICcgJykgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGkrKzsKKyAgfQorICBpZiAoaSA8IGxlbikgeworICAgIEV4dHJhY3RGaW5kV2hhdChmaW5kd2hhdFN0cik7CisgIH0gZWxzZSB7CisgICAgbV9jc0ZpbmRXaGF0QXJyYXkuQWRkKGZpbmR3aGF0U3RyKTsKKyAgfQorICBpZiAobV9jc0ZpbmRXaGF0QXJyYXkuR2V0U2l6ZSgpIDw9IDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9Jc0ZpbmQgPSBUUlVFOworICBtX3Jlc1N0YXJ0ID0gMDsKKyAgbV9yZXNFbmQgPSAtMTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENQREZfVGV4dFBhZ2VGaW5kOjpGaW5kTmV4dCgpCi17Ci0gICAgaWYgKCFtX3BUZXh0UGFnZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fcmVzQXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgaWYobV9maW5kTmV4dFN0YXJ0ID09IC0xKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYobV9zdHJUZXh0LklzRW1wdHkoKSkgewotICAgICAgICBtX0lzRmluZCA9IEZBTFNFOwotICAgICAgICByZXR1cm4gbV9Jc0ZpbmQ7Ci0gICAgfQotICAgIGludCBzdHJMZW4gPSBtX3N0clRleHQuR2V0TGVuZ3RoKCk7Ci0gICAgaWYgKG1fZmluZE5leHRTdGFydCA+IHN0ckxlbiAtIDEpIHsKLSAgICAgICAgbV9Jc0ZpbmQgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuIG1fSXNGaW5kOwotICAgIH0KLSAgICBpbnQgbkNvdW50ID0gbV9jc0ZpbmRXaGF0QXJyYXkuR2V0U2l6ZSgpOwotICAgIGludCBuUmVzdWx0UG9zID0gMDsKLSAgICBpbnQJblN0YXJ0UG9zID0gMDsKLSAgICBuU3RhcnRQb3MgPSBtX2ZpbmROZXh0U3RhcnQ7Ci0gICAgRlhfQk9PTCBiU3BhY2VTdGFydCA9IEZBTFNFOwotICAgIGZvcihpbnQgaVdvcmQgPSAwOyBpV29yZCA8IG5Db3VudDsgaVdvcmQrKykgewotICAgICAgICBDRlhfV2lkZVN0cmluZyBjc1dvcmQgPSBtX2NzRmluZFdoYXRBcnJheVtpV29yZF07Ci0gICAgICAgIGlmKGNzV29yZC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGlmKGlXb3JkID09IG5Db3VudCAtIDEpIHsKLSAgICAgICAgICAgICAgICBGWF9XQ0hBUiBzdHJJbnNlcnQgPSBtX3N0clRleHQuR2V0QXQoblN0YXJ0UG9zKTsKLSAgICAgICAgICAgICAgICBpZihzdHJJbnNlcnQgPT0gVEVYVF9MSU5FRkVFRF9DSEFSIHx8IHN0ckluc2VydCA9PSBURVhUX0JMQU5LX0NIQVIgfHwgc3RySW5zZXJ0ID09IFRFWFRfUkVUVVJOX0NIQVIgfHwgc3RySW5zZXJ0ID09IDE2MCkgewotICAgICAgICAgICAgICAgICAgICBuUmVzdWx0UG9zID0gblN0YXJ0UG9zICsgMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlXb3JkID0gLTE7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoaVdvcmQgPT0gMCkgewotICAgICAgICAgICAgICAgIGJTcGFjZVN0YXJ0ID0gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludCBlbmRJbmRleDsKLSAgICAgICAgblJlc3VsdFBvcyA9IG1fc3RyVGV4dC5GaW5kKGNzV29yZC5jX3N0cigpLCBuU3RhcnRQb3MpOwotICAgICAgICBpZiAoblJlc3VsdFBvcyA9PSAtMSkgewotICAgICAgICAgICAgbV9Jc0ZpbmQgPSBGQUxTRTsKLSAgICAgICAgICAgIHJldHVybiBtX0lzRmluZDsKLSAgICAgICAgfQotICAgICAgICBlbmRJbmRleCA9IG5SZXN1bHRQb3MgKyBjc1dvcmQuR2V0TGVuZ3RoKCkgLSAxOwotICAgICAgICBpZihpV29yZCA9PSAwKSB7Ci0gICAgICAgICAgICBtX3Jlc1N0YXJ0ID0gblJlc3VsdFBvczsKLSAgICAgICAgfQotICAgICAgICBGWF9CT09MIGJNYXRjaCA9IFRSVUU7Ci0gICAgICAgIGlmKGlXb3JkICE9IDAgJiYgIWJTcGFjZVN0YXJ0KSB7Ci0gICAgICAgICAgICBpbnQgUHJlUmVzRW5kUG9zID0gblN0YXJ0UG9zOwotICAgICAgICAgICAgaW50IGN1ckNoYXIgPSBjc1dvcmQuR2V0QXQoMCk7Ci0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBsYXN0V29yZCA9IG1fY3NGaW5kV2hhdEFycmF5W2lXb3JkIC0gMV07Ci0gICAgICAgICAgICBpbnQgbGFzdENoYXIgPSBsYXN0V29yZC5HZXRBdChsYXN0V29yZC5HZXRMZW5ndGgoKSAtIDEpOwotICAgICAgICAgICAgaWYoblN0YXJ0UG9zID09IG5SZXN1bHRQb3MgJiYgIShfSXNJZ25vcmVTcGFjZUNoYXJhY3RlcihsYXN0Q2hhcikgfHwgX0lzSWdub3JlU3BhY2VDaGFyYWN0ZXIoY3VyQ2hhcikpKSB7Ci0gICAgICAgICAgICAgICAgYk1hdGNoID0gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IoaW50IGQgPSBQcmVSZXNFbmRQb3M7IGQgPCBuUmVzdWx0UG9zOyBkKyspIHsKLSAgICAgICAgICAgICAgICBGWF9XQ0hBUiBzdHJJbnNlcnQgPSBtX3N0clRleHQuR2V0QXQoZCk7Ci0gICAgICAgICAgICAgICAgaWYoc3RySW5zZXJ0ICE9IFRFWFRfTElORUZFRURfQ0hBUiAmJiBzdHJJbnNlcnQgIT0gVEVYVF9CTEFOS19DSEFSICYmIHN0ckluc2VydCAhPSBURVhUX1JFVFVSTl9DSEFSICYmIHN0ckluc2VydCAhPSAxNjApIHsKLSAgICAgICAgICAgICAgICAgICAgYk1hdGNoID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmKGJTcGFjZVN0YXJ0KSB7Ci0gICAgICAgICAgICBpZihuUmVzdWx0UG9zID4gMCkgewotICAgICAgICAgICAgICAgIEZYX1dDSEFSIHN0ckluc2VydCA9IG1fc3RyVGV4dC5HZXRBdChuUmVzdWx0UG9zIC0gMSk7Ci0gICAgICAgICAgICAgICAgaWYoc3RySW5zZXJ0ICE9IFRFWFRfTElORUZFRURfQ0hBUiAmJiBzdHJJbnNlcnQgIT0gVEVYVF9CTEFOS19DSEFSICYmIHN0ckluc2VydCAhPSBURVhUX1JFVFVSTl9DSEFSICYmIHN0ckluc2VydCAhPSAxNjApIHsKLSAgICAgICAgICAgICAgICAgICAgYk1hdGNoID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIG1fcmVzU3RhcnQgPSBuUmVzdWx0UG9zOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcmVzU3RhcnQgPSBuUmVzdWx0UG9zIC0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYobV9iTWF0Y2hXaG9sZVdvcmQgJiYgYk1hdGNoKSB7Ci0gICAgICAgICAgICBiTWF0Y2ggPSBJc01hdGNoV2hvbGVXb3JkKG1fc3RyVGV4dCwgblJlc3VsdFBvcywgZW5kSW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIG5TdGFydFBvcyA9IGVuZEluZGV4ICsgMTsKLSAgICAgICAgaWYoIWJNYXRjaCkgewotICAgICAgICAgICAgaVdvcmQgPSAtMTsKLSAgICAgICAgICAgIGlmKGJTcGFjZVN0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgblN0YXJ0UG9zID0gbV9yZXNTdGFydCArIG1fY3NGaW5kV2hhdEFycmF5WzFdLkdldExlbmd0aCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuU3RhcnRQb3MgPSBtX3Jlc1N0YXJ0ICsgbV9jc0ZpbmRXaGF0QXJyYXlbMF0uR2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9yZXNFbmQgPSBuUmVzdWx0UG9zICsgbV9jc0ZpbmRXaGF0QXJyYXlbbV9jc0ZpbmRXaGF0QXJyYXkuR2V0U2l6ZSgpIC0gMV0uR2V0TGVuZ3RoKCkgLSAxOwotICAgIG1fSXNGaW5kID0gVFJVRTsKLSAgICBpbnQgcmVzU3RhcnQgPSBHZXRDaGFySW5kZXgobV9yZXNTdGFydCk7Ci0gICAgaW50IHJlc0VuZCA9IEdldENoYXJJbmRleChtX3Jlc0VuZCk7Ci0gICAgbV9wVGV4dFBhZ2UtPkdldFJlY3RBcnJheShyZXNTdGFydCwgcmVzRW5kIC0gcmVzU3RhcnQgKyAxLCBtX3Jlc0FycmF5KTsKLSAgICBpZihtX2ZsYWdzICYgRlBERlRFWFRfQ09OU0VDVVRJVkUpIHsKLSAgICAgICAgbV9maW5kTmV4dFN0YXJ0ID0gbV9yZXNTdGFydCArIDE7Ci0gICAgICAgIG1fZmluZFByZVN0YXJ0ID0gbV9yZXNFbmQgLSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fZmluZE5leHRTdGFydCA9IG1fcmVzRW5kICsgMTsKLSAgICAgICAgbV9maW5kUHJlU3RhcnQgPSBtX3Jlc1N0YXJ0IC0gMTsKLSAgICB9CitGWF9CT09MIENQREZfVGV4dFBhZ2VGaW5kOjpGaW5kTmV4dCgpIHsKKyAgaWYgKCFtX3BUZXh0UGFnZSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX3Jlc0FycmF5LlJlbW92ZUFsbCgpOworICBpZiAobV9maW5kTmV4dFN0YXJ0ID09IC0xKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX3N0clRleHQuSXNFbXB0eSgpKSB7CisgICAgbV9Jc0ZpbmQgPSBGQUxTRTsKICAgICByZXR1cm4gbV9Jc0ZpbmQ7Ci19Ci1GWF9CT09MIENQREZfVGV4dFBhZ2VGaW5kOjpGaW5kUHJldigpCi17Ci0gICAgaWYgKCFtX3BUZXh0UGFnZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fcmVzQXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgaWYobV9zdHJUZXh0LklzRW1wdHkoKSB8fCBtX2ZpbmRQcmVTdGFydCA8IDApIHsKLSAgICAgICAgbV9Jc0ZpbmQgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuIG1fSXNGaW5kOwotICAgIH0KLSAgICBDUERGX1RleHRQYWdlRmluZCBmaW5kRW5naW5lKG1fcFRleHRQYWdlKTsKLSAgICBGWF9CT09MIHJldCA9IGZpbmRFbmdpbmUuRmluZEZpcnN0KG1fZmluZFdoYXQsIG1fZmxhZ3MpOwotICAgIGlmKCFyZXQpIHsKLSAgICAgICAgbV9Jc0ZpbmQgPSBGQUxTRTsKLSAgICAgICAgcmV0dXJuIG1fSXNGaW5kOwotICAgIH0KLSAgICBpbnQJb3JkZXIgPSAtMSwgTWF0Y2hlZENvdW50ID0gMDsKLSAgICB3aGlsZShyZXQpIHsKLSAgICAgICAgcmV0ID0gZmluZEVuZ2luZS5GaW5kTmV4dCgpOwotICAgICAgICBpZihyZXQpIHsKLSAgICAgICAgICAgIGludCBvcmRlcjEgPSBmaW5kRW5naW5lLkdldEN1ck9yZGVyKCkgOwotICAgICAgICAgICAgaW50CU1hdGNoZWRDb3VudDEgPSBmaW5kRW5naW5lLkdldE1hdGNoZWRDb3VudCgpOwotICAgICAgICAgICAgaWYoKChvcmRlcjEgKyBNYXRjaGVkQ291bnQxKSAtIDEpID4gbV9maW5kUHJlU3RhcnQpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9yZGVyID0gb3JkZXIxOwotICAgICAgICAgICAgTWF0Y2hlZENvdW50ID0gTWF0Y2hlZENvdW50MTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZihvcmRlciA9PSAtMSkgewotICAgICAgICBtX0lzRmluZCA9IEZBTFNFOwotICAgICAgICByZXR1cm4gbV9Jc0ZpbmQ7Ci0gICAgfQotICAgIG1fcmVzU3RhcnQgPSBtX3BUZXh0UGFnZS0+VGV4dEluZGV4RnJvbUNoYXJJbmRleChvcmRlcik7Ci0gICAgbV9yZXNFbmQgPSBtX3BUZXh0UGFnZS0+VGV4dEluZGV4RnJvbUNoYXJJbmRleChvcmRlciArIE1hdGNoZWRDb3VudCAtIDEpOwotICAgIG1fSXNGaW5kID0gVFJVRTsKLSAgICBtX3BUZXh0UGFnZS0+R2V0UmVjdEFycmF5KG9yZGVyLCBNYXRjaGVkQ291bnQsIG1fcmVzQXJyYXkpOwotICAgIGlmKG1fZmxhZ3MgJiBGUERGVEVYVF9DT05TRUNVVElWRSkgewotICAgICAgICBtX2ZpbmROZXh0U3RhcnQgPSBtX3Jlc1N0YXJ0ICsgMTsKLSAgICAgICAgbV9maW5kUHJlU3RhcnQgPSBtX3Jlc0VuZCAtIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9maW5kTmV4dFN0YXJ0ID0gbV9yZXNFbmQgKyAxOwotICAgICAgICBtX2ZpbmRQcmVTdGFydCA9IG1fcmVzU3RhcnQgLSAxOwotICAgIH0KKyAgfQorICBpbnQgc3RyTGVuID0gbV9zdHJUZXh0LkdldExlbmd0aCgpOworICBpZiAobV9maW5kTmV4dFN0YXJ0ID4gc3RyTGVuIC0gMSkgeworICAgIG1fSXNGaW5kID0gRkFMU0U7CiAgICAgcmV0dXJuIG1fSXNGaW5kOwotfQotdm9pZCBDUERGX1RleHRQYWdlRmluZDo6RXh0cmFjdEZpbmRXaGF0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmaW5kd2hhdCkKLXsKLSAgICBpZihmaW5kd2hhdC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIDsKKyAgfQorICBpbnQgbkNvdW50ID0gbV9jc0ZpbmRXaGF0QXJyYXkuR2V0U2l6ZSgpOworICBpbnQgblJlc3VsdFBvcyA9IDA7CisgIGludCBuU3RhcnRQb3MgPSAwOworICBuU3RhcnRQb3MgPSBtX2ZpbmROZXh0U3RhcnQ7CisgIEZYX0JPT0wgYlNwYWNlU3RhcnQgPSBGQUxTRTsKKyAgZm9yIChpbnQgaVdvcmQgPSAwOyBpV29yZCA8IG5Db3VudDsgaVdvcmQrKykgeworICAgIENGWF9XaWRlU3RyaW5nIGNzV29yZCA9IG1fY3NGaW5kV2hhdEFycmF5W2lXb3JkXTsKKyAgICBpZiAoY3NXb3JkLklzRW1wdHkoKSkgeworICAgICAgaWYgKGlXb3JkID09IG5Db3VudCAtIDEpIHsKKyAgICAgICAgRlhfV0NIQVIgc3RySW5zZXJ0ID0gbV9zdHJUZXh0LkdldEF0KG5TdGFydFBvcyk7CisgICAgICAgIGlmIChzdHJJbnNlcnQgPT0gVEVYVF9MSU5FRkVFRF9DSEFSIHx8IHN0ckluc2VydCA9PSBURVhUX0JMQU5LX0NIQVIgfHwKKyAgICAgICAgICAgIHN0ckluc2VydCA9PSBURVhUX1JFVFVSTl9DSEFSIHx8IHN0ckluc2VydCA9PSAxNjApIHsKKyAgICAgICAgICBuUmVzdWx0UG9zID0gblN0YXJ0UG9zICsgMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpV29yZCA9IC0xOworICAgICAgfSBlbHNlIGlmIChpV29yZCA9PSAwKSB7CisgICAgICAgIGJTcGFjZVN0YXJ0ID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpbnQgaW5kZXggPSAwOwotICAgIHdoaWxlKDEpIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NXb3JkID0gVEVYVF9FTVBUWTsKLSAgICAgICAgaW50IHJldCA9IEV4dHJhY3RTdWJTdHJpbmcoY3NXb3JkLCBmaW5kd2hhdC5jX3N0cigpLCBpbmRleCwgVEVYVF9CTEFOS19DSEFSKTsKLSAgICAgICAgaWYoY3NXb3JkLklzRW1wdHkoKSkgewotICAgICAgICAgICAgaWYocmV0KSB7Ci0gICAgICAgICAgICAgICAgbV9jc0ZpbmRXaGF0QXJyYXkuQWRkKENGWF9XaWRlU3RyaW5nKEwiIikpOwotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQorICAgIGludCBlbmRJbmRleDsKKyAgICBuUmVzdWx0UG9zID0gbV9zdHJUZXh0LkZpbmQoY3NXb3JkLmNfc3RyKCksIG5TdGFydFBvcyk7CisgICAgaWYgKG5SZXN1bHRQb3MgPT0gLTEpIHsKKyAgICAgIG1fSXNGaW5kID0gRkFMU0U7CisgICAgICByZXR1cm4gbV9Jc0ZpbmQ7CisgICAgfQorICAgIGVuZEluZGV4ID0gblJlc3VsdFBvcyArIGNzV29yZC5HZXRMZW5ndGgoKSAtIDE7CisgICAgaWYgKGlXb3JkID09IDApIHsKKyAgICAgIG1fcmVzU3RhcnQgPSBuUmVzdWx0UG9zOworICAgIH0KKyAgICBGWF9CT09MIGJNYXRjaCA9IFRSVUU7CisgICAgaWYgKGlXb3JkICE9IDAgJiYgIWJTcGFjZVN0YXJ0KSB7CisgICAgICBpbnQgUHJlUmVzRW5kUG9zID0gblN0YXJ0UG9zOworICAgICAgaW50IGN1ckNoYXIgPSBjc1dvcmQuR2V0QXQoMCk7CisgICAgICBDRlhfV2lkZVN0cmluZyBsYXN0V29yZCA9IG1fY3NGaW5kV2hhdEFycmF5W2lXb3JkIC0gMV07CisgICAgICBpbnQgbGFzdENoYXIgPSBsYXN0V29yZC5HZXRBdChsYXN0V29yZC5HZXRMZW5ndGgoKSAtIDEpOworICAgICAgaWYgKG5TdGFydFBvcyA9PSBuUmVzdWx0UG9zICYmCisgICAgICAgICAgIShfSXNJZ25vcmVTcGFjZUNoYXJhY3RlcihsYXN0Q2hhcikgfHwKKyAgICAgICAgICAgIF9Jc0lnbm9yZVNwYWNlQ2hhcmFjdGVyKGN1ckNoYXIpKSkgeworICAgICAgICBiTWF0Y2ggPSBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGQgPSBQcmVSZXNFbmRQb3M7IGQgPCBuUmVzdWx0UG9zOyBkKyspIHsKKyAgICAgICAgRlhfV0NIQVIgc3RySW5zZXJ0ID0gbV9zdHJUZXh0LkdldEF0KGQpOworICAgICAgICBpZiAoc3RySW5zZXJ0ICE9IFRFWFRfTElORUZFRURfQ0hBUiAmJiBzdHJJbnNlcnQgIT0gVEVYVF9CTEFOS19DSEFSICYmCisgICAgICAgICAgICBzdHJJbnNlcnQgIT0gVEVYVF9SRVRVUk5fQ0hBUiAmJiBzdHJJbnNlcnQgIT0gMTYwKSB7CisgICAgICAgICAgYk1hdGNoID0gRkFMU0U7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgaW50IHBvcyA9IDA7Ci0gICAgICAgIHdoaWxlKHBvcyA8IGNzV29yZC5HZXRMZW5ndGgoKSkgewotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3VyU3RyID0gY3NXb3JkLk1pZChwb3MsIDEpOwotICAgICAgICAgICAgRlhfV0NIQVIgY3VyQ2hhciA9IGNzV29yZC5HZXRBdChwb3MpOwotICAgICAgICAgICAgaWYgKF9Jc0lnbm9yZVNwYWNlQ2hhcmFjdGVyKGN1ckNoYXIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBvcyA+IDAgJiYgY3VyQ2hhciA9PSAweDIwMTkpIHsKLSAgICAgICAgICAgICAgICAgICAgcG9zKys7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocG9zID4gMCApIHsKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgcHJlU3RyID0gY3NXb3JkLk1pZCgwLCBwb3MpOwotICAgICAgICAgICAgICAgICAgICBtX2NzRmluZFdoYXRBcnJheS5BZGQocHJlU3RyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9jc0ZpbmRXaGF0QXJyYXkuQWRkKGN1clN0cik7Ci0gICAgICAgICAgICAgICAgaWYgKHBvcyA9PSBjc1dvcmQuR2V0TGVuZ3RoKCkgLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNzV29yZC5FbXB0eSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3NXb3JkID0gY3NXb3JkLlJpZ2h0KGNzV29yZC5HZXRMZW5ndGgoKSAtIHBvcyAtIDEpOwotICAgICAgICAgICAgICAgIHBvcyA9IDA7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwb3MrKzsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGJTcGFjZVN0YXJ0KSB7CisgICAgICBpZiAoblJlc3VsdFBvcyA+IDApIHsKKyAgICAgICAgRlhfV0NIQVIgc3RySW5zZXJ0ID0gbV9zdHJUZXh0LkdldEF0KG5SZXN1bHRQb3MgLSAxKTsKKyAgICAgICAgaWYgKHN0ckluc2VydCAhPSBURVhUX0xJTkVGRUVEX0NIQVIgJiYgc3RySW5zZXJ0ICE9IFRFWFRfQkxBTktfQ0hBUiAmJgorICAgICAgICAgICAgc3RySW5zZXJ0ICE9IFRFWFRfUkVUVVJOX0NIQVIgJiYgc3RySW5zZXJ0ICE9IDE2MCkgeworICAgICAgICAgIGJNYXRjaCA9IEZBTFNFOworICAgICAgICAgIG1fcmVzU3RhcnQgPSBuUmVzdWx0UG9zOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1fcmVzU3RhcnQgPSBuUmVzdWx0UG9zIC0gMTsKICAgICAgICAgfQotICAgICAgICBpZiAoIWNzV29yZC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1fY3NGaW5kV2hhdEFycmF5LkFkZChjc1dvcmQpOwotICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmIChtX2JNYXRjaFdob2xlV29yZCAmJiBiTWF0Y2gpIHsKKyAgICAgIGJNYXRjaCA9IElzTWF0Y2hXaG9sZVdvcmQobV9zdHJUZXh0LCBuUmVzdWx0UG9zLCBlbmRJbmRleCk7CisgICAgfQorICAgIG5TdGFydFBvcyA9IGVuZEluZGV4ICsgMTsKKyAgICBpZiAoIWJNYXRjaCkgeworICAgICAgaVdvcmQgPSAtMTsKKyAgICAgIGlmIChiU3BhY2VTdGFydCkgeworICAgICAgICBuU3RhcnRQb3MgPSBtX3Jlc1N0YXJ0ICsgbV9jc0ZpbmRXaGF0QXJyYXlbMV0uR2V0TGVuZ3RoKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBuU3RhcnRQb3MgPSBtX3Jlc1N0YXJ0ICsgbV9jc0ZpbmRXaGF0QXJyYXlbMF0uR2V0TGVuZ3RoKCk7CisgICAgICB9CisgICAgfQorICB9CisgIG1fcmVzRW5kID0gblJlc3VsdFBvcyArCisgICAgICAgICAgICAgbV9jc0ZpbmRXaGF0QXJyYXlbbV9jc0ZpbmRXaGF0QXJyYXkuR2V0U2l6ZSgpIC0gMV0uR2V0TGVuZ3RoKCkgLSAxOworICBtX0lzRmluZCA9IFRSVUU7CisgIGludCByZXNTdGFydCA9IEdldENoYXJJbmRleChtX3Jlc1N0YXJ0KTsKKyAgaW50IHJlc0VuZCA9IEdldENoYXJJbmRleChtX3Jlc0VuZCk7CisgIG1fcFRleHRQYWdlLT5HZXRSZWN0QXJyYXkocmVzU3RhcnQsIHJlc0VuZCAtIHJlc1N0YXJ0ICsgMSwgbV9yZXNBcnJheSk7CisgIGlmIChtX2ZsYWdzICYgRlBERlRFWFRfQ09OU0VDVVRJVkUpIHsKKyAgICBtX2ZpbmROZXh0U3RhcnQgPSBtX3Jlc1N0YXJ0ICsgMTsKKyAgICBtX2ZpbmRQcmVTdGFydCA9IG1fcmVzRW5kIC0gMTsKKyAgfSBlbHNlIHsKKyAgICBtX2ZpbmROZXh0U3RhcnQgPSBtX3Jlc0VuZCArIDE7CisgICAgbV9maW5kUHJlU3RhcnQgPSBtX3Jlc1N0YXJ0IC0gMTsKKyAgfQorICByZXR1cm4gbV9Jc0ZpbmQ7Cit9CitGWF9CT09MIENQREZfVGV4dFBhZ2VGaW5kOjpGaW5kUHJldigpIHsKKyAgaWYgKCFtX3BUZXh0UGFnZSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX3Jlc0FycmF5LlJlbW92ZUFsbCgpOworICBpZiAobV9zdHJUZXh0LklzRW1wdHkoKSB8fCBtX2ZpbmRQcmVTdGFydCA8IDApIHsKKyAgICBtX0lzRmluZCA9IEZBTFNFOworICAgIHJldHVybiBtX0lzRmluZDsKKyAgfQorICBDUERGX1RleHRQYWdlRmluZCBmaW5kRW5naW5lKG1fcFRleHRQYWdlKTsKKyAgRlhfQk9PTCByZXQgPSBmaW5kRW5naW5lLkZpbmRGaXJzdChtX2ZpbmRXaGF0LCBtX2ZsYWdzKTsKKyAgaWYgKCFyZXQpIHsKKyAgICBtX0lzRmluZCA9IEZBTFNFOworICAgIHJldHVybiBtX0lzRmluZDsKKyAgfQorICBpbnQgb3JkZXIgPSAtMSwgTWF0Y2hlZENvdW50ID0gMDsKKyAgd2hpbGUgKHJldCkgeworICAgIHJldCA9IGZpbmRFbmdpbmUuRmluZE5leHQoKTsKKyAgICBpZiAocmV0KSB7CisgICAgICBpbnQgb3JkZXIxID0gZmluZEVuZ2luZS5HZXRDdXJPcmRlcigpOworICAgICAgaW50IE1hdGNoZWRDb3VudDEgPSBmaW5kRW5naW5lLkdldE1hdGNoZWRDb3VudCgpOworICAgICAgaWYgKCgob3JkZXIxICsgTWF0Y2hlZENvdW50MSkgLSAxKSA+IG1fZmluZFByZVN0YXJ0KSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgb3JkZXIgPSBvcmRlcjE7CisgICAgICBNYXRjaGVkQ291bnQgPSBNYXRjaGVkQ291bnQxOworICAgIH0KKyAgfQorICBpZiAob3JkZXIgPT0gLTEpIHsKKyAgICBtX0lzRmluZCA9IEZBTFNFOworICAgIHJldHVybiBtX0lzRmluZDsKKyAgfQorICBtX3Jlc1N0YXJ0ID0gbV9wVGV4dFBhZ2UtPlRleHRJbmRleEZyb21DaGFySW5kZXgob3JkZXIpOworICBtX3Jlc0VuZCA9IG1fcFRleHRQYWdlLT5UZXh0SW5kZXhGcm9tQ2hhckluZGV4KG9yZGVyICsgTWF0Y2hlZENvdW50IC0gMSk7CisgIG1fSXNGaW5kID0gVFJVRTsKKyAgbV9wVGV4dFBhZ2UtPkdldFJlY3RBcnJheShvcmRlciwgTWF0Y2hlZENvdW50LCBtX3Jlc0FycmF5KTsKKyAgaWYgKG1fZmxhZ3MgJiBGUERGVEVYVF9DT05TRUNVVElWRSkgeworICAgIG1fZmluZE5leHRTdGFydCA9IG1fcmVzU3RhcnQgKyAxOworICAgIG1fZmluZFByZVN0YXJ0ID0gbV9yZXNFbmQgLSAxOworICB9IGVsc2UgeworICAgIG1fZmluZE5leHRTdGFydCA9IG1fcmVzRW5kICsgMTsKKyAgICBtX2ZpbmRQcmVTdGFydCA9IG1fcmVzU3RhcnQgLSAxOworICB9CisgIHJldHVybiBtX0lzRmluZDsKK30KK3ZvaWQgQ1BERl9UZXh0UGFnZUZpbmQ6OkV4dHJhY3RGaW5kV2hhdChjb25zdCBDRlhfV2lkZVN0cmluZyYgZmluZHdoYXQpIHsKKyAgaWYgKGZpbmR3aGF0LklzRW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorICBpbnQgaW5kZXggPSAwOworICB3aGlsZSAoMSkgeworICAgIENGWF9XaWRlU3RyaW5nIGNzV29yZCA9IFRFWFRfRU1QVFk7CisgICAgaW50IHJldCA9CisgICAgICAgIEV4dHJhY3RTdWJTdHJpbmcoY3NXb3JkLCBmaW5kd2hhdC5jX3N0cigpLCBpbmRleCwgVEVYVF9CTEFOS19DSEFSKTsKKyAgICBpZiAoY3NXb3JkLklzRW1wdHkoKSkgeworICAgICAgaWYgKHJldCkgeworICAgICAgICBtX2NzRmluZFdoYXRBcnJheS5BZGQoQ0ZYX1dpZGVTdHJpbmcoTCIiKSk7CiAgICAgICAgIGluZGV4Kys7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CiAgICAgfQorICAgIGludCBwb3MgPSAwOworICAgIHdoaWxlIChwb3MgPCBjc1dvcmQuR2V0TGVuZ3RoKCkpIHsKKyAgICAgIENGWF9XaWRlU3RyaW5nIGN1clN0ciA9IGNzV29yZC5NaWQocG9zLCAxKTsKKyAgICAgIEZYX1dDSEFSIGN1ckNoYXIgPSBjc1dvcmQuR2V0QXQocG9zKTsKKyAgICAgIGlmIChfSXNJZ25vcmVTcGFjZUNoYXJhY3RlcihjdXJDaGFyKSkgeworICAgICAgICBpZiAocG9zID4gMCAmJiBjdXJDaGFyID09IDB4MjAxOSkgeworICAgICAgICAgIHBvcysrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChwb3MgPiAwKSB7CisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgcHJlU3RyID0gY3NXb3JkLk1pZCgwLCBwb3MpOworICAgICAgICAgIG1fY3NGaW5kV2hhdEFycmF5LkFkZChwcmVTdHIpOworICAgICAgICB9CisgICAgICAgIG1fY3NGaW5kV2hhdEFycmF5LkFkZChjdXJTdHIpOworICAgICAgICBpZiAocG9zID09IGNzV29yZC5HZXRMZW5ndGgoKSAtIDEpIHsKKyAgICAgICAgICBjc1dvcmQuRW1wdHkoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjc1dvcmQgPSBjc1dvcmQuUmlnaHQoY3NXb3JkLkdldExlbmd0aCgpIC0gcG9zIC0gMSk7CisgICAgICAgIHBvcyA9IDA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgcG9zKys7CisgICAgfQorICAgIGlmICghY3NXb3JkLklzRW1wdHkoKSkgeworICAgICAgbV9jc0ZpbmRXaGF0QXJyYXkuQWRkKGNzV29yZCk7CisgICAgfQorICAgIGluZGV4Kys7CisgIH0KIH0KLUZYX0JPT0wgQ1BERl9UZXh0UGFnZUZpbmQ6OklzTWF0Y2hXaG9sZVdvcmQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzUGFnZVRleHQsIGludCBzdGFydFBvcywgaW50IGVuZFBvcykKLXsKLSAgICBpbnQgY2hhcl9sZWZ0ID0gMDsKLSAgICBpbnQgY2hhcl9yaWdodCA9IDA7Ci0gICAgaW50IGNoYXJfY291bnQgPSBlbmRQb3MgLSBzdGFydFBvcyArIDE7Ci0gICAgaWYoY2hhcl9jb3VudCA8IDEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoY2hhcl9jb3VudCA9PSAxICYmIGNzUGFnZVRleHQuR2V0QXQoc3RhcnRQb3MpID4gMjU1KSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZihzdGFydFBvcyAtIDEgPj0gMCApIHsKLSAgICAgICAgY2hhcl9sZWZ0ID0gY3NQYWdlVGV4dC5HZXRBdChzdGFydFBvcyAtIDEpOwotICAgIH0KLSAgICBpZihzdGFydFBvcyArIGNoYXJfY291bnQgPCBjc1BhZ2VUZXh0LkdldExlbmd0aCgpKSB7Ci0gICAgICAgIGNoYXJfcmlnaHQgPSBjc1BhZ2VUZXh0LkdldEF0KHN0YXJ0UG9zICsgY2hhcl9jb3VudCk7Ci0gICAgfQotICAgIGlmICgoY2hhcl9sZWZ0ID4gJ0EnICYmIGNoYXJfbGVmdCA8ICdhJykgfHwgKGNoYXJfbGVmdCA+ICdhJyAmJiBjaGFyX2xlZnQgPCAneicpIHx8IChjaGFyX2xlZnQgPiAweGZiMDAgJiYgY2hhcl9sZWZ0IDwgMHhmYjA2KSB8fCAoY2hhcl9sZWZ0ID49ICcwJyAmJiBjaGFyX2xlZnQgPD0gJzknKSB8fAotICAgICAgICAgICAgKGNoYXJfcmlnaHQgPiAnQScgJiYgY2hhcl9yaWdodCA8ICdhJykgfHwgKGNoYXJfcmlnaHQgPiAnYScgJiYgY2hhcl9yaWdodCA8ICd6JykgfHwgKGNoYXJfcmlnaHQgPiAweGZiMDAgJiYgY2hhcl9yaWdodCA8IDB4ZmIwNikgfHwgKGNoYXJfcmlnaHQgPj0gJzAnICYmIGNoYXJfcmlnaHQgPD0gJzknKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmKCEoKCdBJyA+IGNoYXJfbGVmdCB8fCBjaGFyX2xlZnQgPiAnWicpICAmJiAoJ2EnID4gY2hhcl9sZWZ0IHx8IGNoYXJfbGVmdCA+ICd6JykKLSAgICAgICAgICAgICYmICgnQScgPiBjaGFyX3JpZ2h0IHx8IGNoYXJfcmlnaHQgPiAnWicpICAmJiAoJ2EnID4gY2hhcl9yaWdodCB8fCBjaGFyX3JpZ2h0ID4gJ3onKSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoY2hhcl9jb3VudCA+IDApIHsKLSAgICAgICAgaWYgKGNzUGFnZVRleHQuR2V0QXQoc3RhcnRQb3MpID49IEwnMCcgJiYgY3NQYWdlVGV4dC5HZXRBdChzdGFydFBvcykgPD0gTCc5JyAmJiBjaGFyX2xlZnQgPj0gTCcwJyAmJiBjaGFyX2xlZnQgPD0gTCc5JykgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjc1BhZ2VUZXh0LkdldEF0KGVuZFBvcykgPj0gTCcwJyAmJiBjc1BhZ2VUZXh0LkdldEF0KGVuZFBvcykgPD0gTCc5JyAmJiBjaGFyX3JpZ2h0ID49IEwnMCcgJiYgY2hhcl9yaWdodCA8PSBMJzknKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9CitGWF9CT09MIENQREZfVGV4dFBhZ2VGaW5kOjpJc01hdGNoV2hvbGVXb3JkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc1BhZ2VUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmRQb3MpIHsKKyAgRlhfV0NIQVIgY2hhcl9sZWZ0ID0gMDsKKyAgRlhfV0NIQVIgY2hhcl9yaWdodCA9IDA7CisgIGludCBjaGFyX2NvdW50ID0gZW5kUG9zIC0gc3RhcnRQb3MgKyAxOworICBpZiAoY2hhcl9jb3VudCA8IDEpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKGNoYXJfY291bnQgPT0gMSAmJiBjc1BhZ2VUZXh0LkdldEF0KHN0YXJ0UG9zKSA+IDI1NSkgewogICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDUERGX1RleHRQYWdlRmluZDo6RXh0cmFjdFN1YlN0cmluZyhDRlhfV2lkZVN0cmluZyYgclN0cmluZywgRlhfTFBDV1NUUiBscHN6RnVsbFN0cmluZywKLSAgICAgICAgaW50IGlTdWJTdHJpbmcsIEZYX1dDSEFSIGNoU2VwKQotewotICAgIGlmIChscHN6RnVsbFN0cmluZyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoc3RhcnRQb3MgLSAxID49IDApIHsKKyAgICBjaGFyX2xlZnQgPSBjc1BhZ2VUZXh0LkdldEF0KHN0YXJ0UG9zIC0gMSk7CisgIH0KKyAgaWYgKHN0YXJ0UG9zICsgY2hhcl9jb3VudCA8IGNzUGFnZVRleHQuR2V0TGVuZ3RoKCkpIHsKKyAgICBjaGFyX3JpZ2h0ID0gY3NQYWdlVGV4dC5HZXRBdChzdGFydFBvcyArIGNoYXJfY291bnQpOworICB9CisgIGlmICgoY2hhcl9sZWZ0ID4gJ0EnICYmIGNoYXJfbGVmdCA8ICdhJykgfHwKKyAgICAgIChjaGFyX2xlZnQgPiAnYScgJiYgY2hhcl9sZWZ0IDwgJ3onKSB8fAorICAgICAgKGNoYXJfbGVmdCA+IDB4ZmIwMCAmJiBjaGFyX2xlZnQgPCAweGZiMDYpIHx8IHN0ZDo6aXN3ZGlnaXQoY2hhcl9sZWZ0KSB8fAorICAgICAgKGNoYXJfcmlnaHQgPiAnQScgJiYgY2hhcl9yaWdodCA8ICdhJykgfHwKKyAgICAgIChjaGFyX3JpZ2h0ID4gJ2EnICYmIGNoYXJfcmlnaHQgPCAneicpIHx8CisgICAgICAoY2hhcl9yaWdodCA+IDB4ZmIwMCAmJiBjaGFyX3JpZ2h0IDwgMHhmYjA2KSB8fAorICAgICAgc3RkOjppc3dkaWdpdChjaGFyX3JpZ2h0KSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoISgoJ0EnID4gY2hhcl9sZWZ0IHx8IGNoYXJfbGVmdCA+ICdaJykgJiYKKyAgICAgICAgKCdhJyA+IGNoYXJfbGVmdCB8fCBjaGFyX2xlZnQgPiAneicpICYmCisgICAgICAgICgnQScgPiBjaGFyX3JpZ2h0IHx8IGNoYXJfcmlnaHQgPiAnWicpICYmCisgICAgICAgICgnYScgPiBjaGFyX3JpZ2h0IHx8IGNoYXJfcmlnaHQgPiAneicpKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoY2hhcl9jb3VudCA+IDApIHsKKyAgICBpZiAoY3NQYWdlVGV4dC5HZXRBdChzdGFydFBvcykgPj0gTCcwJyAmJgorICAgICAgICBjc1BhZ2VUZXh0LkdldEF0KHN0YXJ0UG9zKSA8PSBMJzknICYmIGNoYXJfbGVmdCA+PSBMJzAnICYmCisgICAgICAgIGNoYXJfbGVmdCA8PSBMJzknKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIHdoaWxlIChpU3ViU3RyaW5nLS0pIHsKLSAgICAgICAgbHBzekZ1bGxTdHJpbmcgPSBGWFNZU193Y3NjaHIobHBzekZ1bGxTdHJpbmcsIGNoU2VwKTsKLSAgICAgICAgaWYgKGxwc3pGdWxsU3RyaW5nID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJTdHJpbmcuRW1wdHkoKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBscHN6RnVsbFN0cmluZysrOwotICAgICAgICB3aGlsZSgqbHBzekZ1bGxTdHJpbmcgPT0gY2hTZXApIHsKLSAgICAgICAgICAgIGxwc3pGdWxsU3RyaW5nKys7Ci0gICAgICAgIH0KKyAgICBpZiAoY3NQYWdlVGV4dC5HZXRBdChlbmRQb3MpID49IEwnMCcgJiYgY3NQYWdlVGV4dC5HZXRBdChlbmRQb3MpIDw9IEwnOScgJiYKKyAgICAgICAgY2hhcl9yaWdodCA+PSBMJzAnICYmIGNoYXJfcmlnaHQgPD0gTCc5JykgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBGWF9MUENXU1RSIGxwY2hFbmQgPSBGWFNZU193Y3NjaHIobHBzekZ1bGxTdHJpbmcsIGNoU2VwKTsKLSAgICBpbnQgbkxlbiA9IChscGNoRW5kID09IE5VTEwpID8KLSAgICAgICAgICAgICAgIChpbnQpRlhTWVNfd2NzbGVuKGxwc3pGdWxsU3RyaW5nKSA6IChpbnQpKGxwY2hFbmQgLSBscHN6RnVsbFN0cmluZyk7Ci0gICAgQVNTRVJUKG5MZW4gPj0gMCk7Ci0gICAgRlhTWVNfbWVtY3B5MzIoclN0cmluZy5HZXRCdWZmZXIobkxlbiksIGxwc3pGdWxsU3RyaW5nLCBuTGVuICogc2l6ZW9mKEZYX1dDSEFSKSk7Ci0gICAgclN0cmluZy5SZWxlYXNlQnVmZmVyKCk7Ci0gICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1DRlhfV2lkZVN0cmluZyBDUERGX1RleHRQYWdlRmluZDo6TWFrZVJldmVyc2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikKLXsKLSAgICBDRlhfV2lkZVN0cmluZyBzdHIyOwotICAgIHN0cjIuRW1wdHkoKTsKLSAgICBpbnQgbmxlbiA9IHN0ci5HZXRMZW5ndGgoKTsKLSAgICBmb3IoaW50IGkgPSBubGVuIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgc3RyMiArPSBzdHIuR2V0QXQoaSk7CitGWF9CT09MIENQREZfVGV4dFBhZ2VGaW5kOjpFeHRyYWN0U3ViU3RyaW5nKENGWF9XaWRlU3RyaW5nJiByU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBzekZ1bGxTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpU3ViU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiBjaFNlcCkgeworICBpZiAoIWxwc3pGdWxsU3RyaW5nKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHdoaWxlIChpU3ViU3RyaW5nLS0pIHsKKyAgICBscHN6RnVsbFN0cmluZyA9IEZYU1lTX3djc2NocihscHN6RnVsbFN0cmluZywgY2hTZXApOworICAgIGlmICghbHBzekZ1bGxTdHJpbmcpIHsKKyAgICAgIHJTdHJpbmcuRW1wdHkoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgcmV0dXJuIHN0cjI7CisgICAgbHBzekZ1bGxTdHJpbmcrKzsKKyAgICB3aGlsZSAoKmxwc3pGdWxsU3RyaW5nID09IGNoU2VwKSB7CisgICAgICBscHN6RnVsbFN0cmluZysrOworICAgIH0KKyAgfQorICBjb25zdCBGWF9XQ0hBUiogbHBjaEVuZCA9IEZYU1lTX3djc2NocihscHN6RnVsbFN0cmluZywgY2hTZXApOworICBpbnQgbkxlbiA9IGxwY2hFbmQgPyAoaW50KShscGNoRW5kIC0gbHBzekZ1bGxTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICA6IChpbnQpRlhTWVNfd2NzbGVuKGxwc3pGdWxsU3RyaW5nKTsKKyAgQVNTRVJUKG5MZW4gPj0gMCk7CisgIEZYU1lTX21lbWNweShyU3RyaW5nLkdldEJ1ZmZlcihuTGVuKSwgbHBzekZ1bGxTdHJpbmcsCisgICAgICAgICAgICAgICBuTGVuICogc2l6ZW9mKEZYX1dDSEFSKSk7CisgIHJTdHJpbmcuUmVsZWFzZUJ1ZmZlcigpOworICByZXR1cm4gVFJVRTsKIH0KLXZvaWQgQ1BERl9UZXh0UGFnZUZpbmQ6OkdldFJlY3RBcnJheShDRlhfUmVjdEFycmF5JiByZWN0cykgY29uc3QKLXsKLSAgICByZWN0cy5Db3B5KG1fcmVzQXJyYXkpOworQ0ZYX1dpZGVTdHJpbmcgQ1BERl9UZXh0UGFnZUZpbmQ6Ok1ha2VSZXZlcnNlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIHsKKyAgQ0ZYX1dpZGVTdHJpbmcgc3RyMjsKKyAgc3RyMi5FbXB0eSgpOworICBpbnQgbmxlbiA9IHN0ci5HZXRMZW5ndGgoKTsKKyAgZm9yIChpbnQgaSA9IG5sZW4gLSAxOyBpID49IDA7IGktLSkgeworICAgIHN0cjIgKz0gc3RyLkdldEF0KGkpOworICB9CisgIHJldHVybiBzdHIyOwogfQotaW50CUNQREZfVGV4dFBhZ2VGaW5kOjpHZXRDdXJPcmRlcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIEdldENoYXJJbmRleChtX3Jlc1N0YXJ0KTsKK3ZvaWQgQ1BERl9UZXh0UGFnZUZpbmQ6OkdldFJlY3RBcnJheShDRlhfUmVjdEFycmF5JiByZWN0cykgY29uc3QgeworICByZWN0cy5Db3B5KG1fcmVzQXJyYXkpOwogfQotaW50CUNQREZfVGV4dFBhZ2VGaW5kOjpHZXRNYXRjaGVkQ291bnQoKWNvbnN0Ci17Ci0gICAgaW50IHJlc1N0YXJ0ID0gR2V0Q2hhckluZGV4KG1fcmVzU3RhcnQpOwotICAgIGludCByZXNFbmQgPSBHZXRDaGFySW5kZXgobV9yZXNFbmQpOwotICAgIHJldHVybiByZXNFbmQgLSByZXNTdGFydCArIDE7CitpbnQgQ1BERl9UZXh0UGFnZUZpbmQ6OkdldEN1ck9yZGVyKCkgY29uc3QgeworICByZXR1cm4gR2V0Q2hhckluZGV4KG1fcmVzU3RhcnQpOwogfQoraW50IENQREZfVGV4dFBhZ2VGaW5kOjpHZXRNYXRjaGVkQ291bnQoKSBjb25zdCB7CisgIGludCByZXNTdGFydCA9IEdldENoYXJJbmRleChtX3Jlc1N0YXJ0KTsKKyAgaW50IHJlc0VuZCA9IEdldENoYXJJbmRleChtX3Jlc0VuZCk7CisgIHJldHVybiByZXNFbmQgLSByZXNTdGFydCArIDE7Cit9CisKIENQREZfTGlua0V4dHJhY3Q6OkNQREZfTGlua0V4dHJhY3QoKQotICAgIDogbV9wVGV4dFBhZ2UoTlVMTCksCi0gICAgICBtX0lzUGFyc2VyZChGQUxTRSkKLXsKKyAgICA6IG1fcFRleHRQYWdlKG51bGxwdHIpLCBtX2JJc1BhcnNlZChmYWxzZSkgewogfQotQ1BERl9MaW5rRXh0cmFjdDo6fkNQREZfTGlua0V4dHJhY3QoKQotewotICAgIERlbGV0ZUxpbmtMaXN0KCk7CisKK0NQREZfTGlua0V4dHJhY3Q6On5DUERGX0xpbmtFeHRyYWN0KCkgeworICBEZWxldGVMaW5rTGlzdCgpOwogfQotRlhfQk9PTCBDUERGX0xpbmtFeHRyYWN0OjpFeHRyYWN0TGlua3MoY29uc3QgSVBERl9UZXh0UGFnZSogcFRleHRQYWdlKQotewotICAgIGlmICghcFRleHRQYWdlIHx8ICFwVGV4dFBhZ2UtPklzUGFyc2VyZWQoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fcFRleHRQYWdlID0gKGNvbnN0IENQREZfVGV4dFBhZ2UqKXBUZXh0UGFnZTsKLSAgICBtX3N0clBhZ2VUZXh0ID0gbV9wVGV4dFBhZ2UtPkdldFBhZ2VUZXh0KDAsIC0xKTsKLSAgICBEZWxldGVMaW5rTGlzdCgpOwotICAgIGlmIChtX3N0clBhZ2VUZXh0LklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHBhcnNlckxpbmsoKTsKLSAgICBtX0lzUGFyc2VyZCA9IFRSVUU7Ci0gICAgcmV0dXJuIFRSVUU7CisKK0ZYX0JPT0wgQ1BERl9MaW5rRXh0cmFjdDo6RXh0cmFjdExpbmtzKGNvbnN0IElQREZfVGV4dFBhZ2UqIHBUZXh0UGFnZSkgeworICBpZiAoIXBUZXh0UGFnZSB8fCAhcFRleHRQYWdlLT5Jc1BhcnNlZCgpKQorICAgIHJldHVybiBGQUxTRTsKKworICBtX3BUZXh0UGFnZSA9IChjb25zdCBDUERGX1RleHRQYWdlKilwVGV4dFBhZ2U7CisgIG1fc3RyUGFnZVRleHQgPSBtX3BUZXh0UGFnZS0+R2V0UGFnZVRleHQoMCwgLTEpOworICBEZWxldGVMaW5rTGlzdCgpOworICBpZiAobV9zdHJQYWdlVGV4dC5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgUGFyc2VMaW5rKCk7CisgIG1fYklzUGFyc2VkID0gdHJ1ZTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci12b2lkIENQREZfTGlua0V4dHJhY3Q6OkRlbGV0ZUxpbmtMaXN0KCkKLXsKLSAgICB3aGlsZSAobV9MaW5rTGlzdC5HZXRTaXplKCkpIHsKLSAgICAgICAgQ1BERl9MaW5rRXh0KiBsaW5raW5mbyA9IE5VTEw7Ci0gICAgICAgIGxpbmtpbmZvID0gbV9MaW5rTGlzdC5HZXRBdCgwKTsKLSAgICAgICAgbV9MaW5rTGlzdC5SZW1vdmVBdCgwKTsKLSAgICAgICAgZGVsZXRlIGxpbmtpbmZvOwotICAgIH0KLSAgICBtX0xpbmtMaXN0LlJlbW92ZUFsbCgpOworCit2b2lkIENQREZfTGlua0V4dHJhY3Q6OkRlbGV0ZUxpbmtMaXN0KCkgeworICB3aGlsZSAobV9MaW5rTGlzdC5HZXRTaXplKCkpIHsKKyAgICBDUERGX0xpbmtFeHQqIGxpbmtpbmZvID0gTlVMTDsKKyAgICBsaW5raW5mbyA9IG1fTGlua0xpc3QuR2V0QXQoMCk7CisgICAgbV9MaW5rTGlzdC5SZW1vdmVBdCgwKTsKKyAgICBkZWxldGUgbGlua2luZm87CisgIH0KKyAgbV9MaW5rTGlzdC5SZW1vdmVBbGwoKTsKIH0KLWludCBDUERGX0xpbmtFeHRyYWN0OjpDb3VudExpbmtzKCkgY29uc3QKLXsKLSAgICBpZiAoIW1fSXNQYXJzZXJkKQl7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIG1fTGlua0xpc3QuR2V0U2l6ZSgpOworaW50IENQREZfTGlua0V4dHJhY3Q6OkNvdW50TGlua3MoKSBjb25zdCB7CisgIGlmICghbV9iSXNQYXJzZWQpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIG1fTGlua0xpc3QuR2V0U2l6ZSgpOwogfQotdm9pZCBDUERGX0xpbmtFeHRyYWN0OjpwYXJzZXJMaW5rKCkKLXsKLSAgICBpbnQgc3RhcnQgPSAwLCBwb3MgPSAwOwotICAgIGludCBUb3RhbENoYXIgPSBtX3BUZXh0UGFnZS0+Q291bnRDaGFycygpOwotICAgIHdoaWxlIChwb3MgPCBUb3RhbENoYXIpIHsKLSAgICAgICAgRlBERl9DSEFSX0lORk8gcGFnZUNoYXI7Ci0gICAgICAgIG1fcFRleHRQYWdlLT5HZXRDaGFySW5mbyhwb3MsIHBhZ2VDaGFyKTsKLSAgICAgICAgaWYgKHBhZ2VDaGFyLm1fRmxhZyA9PSBDSEFSX0dFTkVSQVRFRCB8fCBwYWdlQ2hhci5tX1VuaWNvZGUgPT0gMHgyMCB8fCBwb3MgPT0gVG90YWxDaGFyIC0gMSkgewotICAgICAgICAgICAgaW50IG5Db3VudCA9IHBvcyAtIHN0YXJ0OwotICAgICAgICAgICAgaWYocG9zID09IFRvdGFsQ2hhciAtIDEpIHsKLSAgICAgICAgICAgICAgICBuQ291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHN0ckJlQ2hlY2s7Ci0gICAgICAgICAgICBzdHJCZUNoZWNrID0gbV9wVGV4dFBhZ2UtPkdldFBhZ2VUZXh0KHN0YXJ0LCBuQ291bnQpOwotICAgICAgICAgICAgaWYgKHN0ckJlQ2hlY2suR2V0TGVuZ3RoKCkgPiA1KSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUoc3RyQmVDaGVjay5HZXRMZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgY2ggPSBzdHJCZUNoZWNrLkdldEF0KHN0ckJlQ2hlY2suR2V0TGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09IEwnKScgfHwgY2ggPT0gTCcsJyB8fCBjaCA9PSBMJz4nIHx8IGNoID09IEwnLicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ckJlQ2hlY2sgPSBzdHJCZUNoZWNrLk1pZCgwLCBzdHJCZUNoZWNrLkdldExlbmd0aCgpIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuQ291bnQtLTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChuQ291bnQgPiA1ICYmIChDaGVja1dlYkxpbmsoc3RyQmVDaGVjaykgfHwgQ2hlY2tNYWlsTGluayhzdHJCZUNoZWNrKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFBcHBlbmRUb0xpbmtMaXN0KHN0YXJ0LCBuQ291bnQsIHN0ckJlQ2hlY2spKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXJ0ID0gKytwb3M7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwb3MrKzsKK3ZvaWQgQ1BERl9MaW5rRXh0cmFjdDo6UGFyc2VMaW5rKCkgeworICBpbnQgc3RhcnQgPSAwLCBwb3MgPSAwOworICBpbnQgVG90YWxDaGFyID0gbV9wVGV4dFBhZ2UtPkNvdW50Q2hhcnMoKTsKKyAgd2hpbGUgKHBvcyA8IFRvdGFsQ2hhcikgeworICAgIEZQREZfQ0hBUl9JTkZPIHBhZ2VDaGFyOworICAgIG1fcFRleHRQYWdlLT5HZXRDaGFySW5mbyhwb3MsICZwYWdlQ2hhcik7CisgICAgaWYgKHBhZ2VDaGFyLm1fRmxhZyA9PSBDSEFSX0dFTkVSQVRFRCB8fCBwYWdlQ2hhci5tX1VuaWNvZGUgPT0gMHgyMCB8fAorICAgICAgICBwb3MgPT0gVG90YWxDaGFyIC0gMSkgeworICAgICAgaW50IG5Db3VudCA9IHBvcyAtIHN0YXJ0OworICAgICAgaWYgKHBvcyA9PSBUb3RhbENoYXIgLSAxKSB7CisgICAgICAgIG5Db3VudCsrOworICAgICAgfQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyQmVDaGVjazsKKyAgICAgIHN0ckJlQ2hlY2sgPSBtX3BUZXh0UGFnZS0+R2V0UGFnZVRleHQoc3RhcnQsIG5Db3VudCk7CisgICAgICBpZiAoc3RyQmVDaGVjay5HZXRMZW5ndGgoKSA+IDUpIHsKKyAgICAgICAgd2hpbGUgKHN0ckJlQ2hlY2suR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgRlhfV0NIQVIgY2ggPSBzdHJCZUNoZWNrLkdldEF0KHN0ckJlQ2hlY2suR2V0TGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICBpZiAoY2ggPT0gTCcpJyB8fCBjaCA9PSBMJywnIHx8IGNoID09IEwnPicgfHwgY2ggPT0gTCcuJykgeworICAgICAgICAgICAgc3RyQmVDaGVjayA9IHN0ckJlQ2hlY2suTWlkKDAsIHN0ckJlQ2hlY2suR2V0TGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgIG5Db3VudC0tOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9Ci19Ci1GWF9CT09MIENQREZfTGlua0V4dHJhY3Q6OkNoZWNrV2ViTGluayhDRlhfV2lkZVN0cmluZyYgc3RyQmVDaGVjaykKLXsKLSAgICBDRlhfV2lkZVN0cmluZyBzdHIgPSBzdHJCZUNoZWNrOwotICAgIHN0ci5NYWtlTG93ZXIoKTsKLSAgICBpZiAoc3RyLkZpbmQoTCJodHRwOi8vd3d3LiIpICE9IC0xKSB7Ci0gICAgICAgIHN0ckJlQ2hlY2sgPSBzdHJCZUNoZWNrLlJpZ2h0KHN0ci5HZXRMZW5ndGgoKSAtIHN0ci5GaW5kKEwiaHR0cDovL3d3dy4iKSk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0gZWxzZSBpZiAoc3RyLkZpbmQoTCJodHRwOi8vIikgIT0gLTEpIHsKLSAgICAgICAgc3RyQmVDaGVjayA9IHN0ckJlQ2hlY2suUmlnaHQoc3RyLkdldExlbmd0aCgpIC0gc3RyLkZpbmQoTCJodHRwOi8vIikpOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9IGVsc2UgaWYgKHN0ci5GaW5kKEwiaHR0cHM6Ly93d3cuIikgIT0gLTEpIHsKLSAgICAgICAgc3RyQmVDaGVjayA9IHN0ckJlQ2hlY2suUmlnaHQoc3RyLkdldExlbmd0aCgpIC0gc3RyLkZpbmQoTCJodHRwczovL3d3dy4iKSk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0gZWxzZSBpZiAoc3RyLkZpbmQoTCJodHRwczovLyIpICE9IC0xKSB7Ci0gICAgICAgIHN0ckJlQ2hlY2sgPSBzdHJCZUNoZWNrLlJpZ2h0KHN0ci5HZXRMZW5ndGgoKSAtIHN0ci5GaW5kKEwiaHR0cHM6Ly8iKSk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0gZWxzZSBpZiAoc3RyLkZpbmQoTCJ3d3cuIikgIT0gLTEpIHsKLSAgICAgICAgc3RyQmVDaGVjayA9IHN0ckJlQ2hlY2suUmlnaHQoc3RyLkdldExlbmd0aCgpIC0gc3RyLkZpbmQoTCJ3d3cuIikpOwotICAgICAgICBzdHJCZUNoZWNrID0gTCJodHRwOi8vIiArIHN0ckJlQ2hlY2s7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICBpZiAobkNvdW50ID4gNSAmJgorICAgICAgICAgICAgKENoZWNrV2ViTGluayhzdHJCZUNoZWNrKSB8fCBDaGVja01haWxMaW5rKHN0ckJlQ2hlY2spKSkgeworICAgICAgICAgIEFwcGVuZFRvTGlua0xpc3Qoc3RhcnQsIG5Db3VudCwgc3RyQmVDaGVjayk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHN0YXJ0ID0gKytwb3M7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgcG9zKys7CiAgICAgfQorICB9CiB9Ci1GWF9CT09MIENQREZfTGlua0V4dHJhY3Q6OkNoZWNrTWFpbExpbmsoQ0ZYX1dpZGVTdHJpbmcmIHN0cikKLXsKLSAgICBzdHIuTWFrZUxvd2VyKCk7Ci0gICAgaW50IGFQb3MgPSBzdHIuRmluZChMJ0AnKTsKLSAgICBpZiAoYVBvcyA8IDEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoc3RyLkdldEF0KGFQb3MgLSAxKSA9PSBMJy4nIHx8IHN0ci5HZXRBdChhUG9zIC0gMSkgPT0gTCdfJykgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGludCBpOwotICAgIGZvciAoaSA9IGFQb3MgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICBGWF9XQ0hBUiBjaCA9IHN0ci5HZXRBdChpKTsKLSAgICAgICAgaWYgKGNoID09IEwnXycgfHwgY2ggPT0gTCcuJyB8fCAoY2ggPj0gTCdhJyAmJiBjaCA8PSBMJ3onKSB8fCAoY2ggPj0gTCcwJyAmJiBjaCA8PSBMJzknKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoaSA9PSBhUG9zIC0gMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0ciA9IHN0ci5SaWdodChzdHIuR2V0TGVuZ3RoKCkgLSBpIC0gMSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBhUG9zID0gc3RyLkZpbmQoTCdAJyk7Ci0gICAgaWYgKGFQb3MgPCAxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc3RydGVtcCA9IEwiIjsKLSAgICBmb3IgKGkgPSAwOyBpIDwgYVBvczsgaSsrKSB7Ci0gICAgICAgIEZYX1dDSEFSIHdjaCA9IHN0ci5HZXRBdChpKTsKLSAgICAgICAgaWYgKHdjaCA+PSBMJ2EnICYmIHdjaCA8PSBMJ3onKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0cnRlbXAgPSBzdHIuUmlnaHQoc3RyLkdldExlbmd0aCgpIC0gaSArIDEpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChzdHJ0ZW1wICE9IEwiIikgewotICAgICAgICBzdHIgPSBzdHJ0ZW1wOwotICAgIH0KLSAgICBhUG9zID0gc3RyLkZpbmQoTCdAJyk7Ci0gICAgaWYgKGFQb3MgPCAxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgc3RyLlRyaW1SaWdodChMJy4nKTsKLSAgICBzdHJ0ZW1wID0gc3RyOwotICAgIGludCBlUG9zID0gc3RyLkZpbmQoTCcuJyk7Ci0gICAgaWYgKGVQb3MgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICB3aGlsZSAoZVBvcyAhPSAtMSkgewotICAgICAgICBzdHJ0ZW1wID0gc3RydGVtcC5SaWdodChzdHJ0ZW1wLkdldExlbmd0aCgpIC0gZVBvcyAtIDEpOwotICAgICAgICBlUG9zID0gc3RydGVtcC5GaW5kKCcuJyk7Ci0gICAgfQotICAgIGVQb3MgPSBzdHJ0ZW1wLkdldExlbmd0aCgpOwotICAgIGZvciAoaSA9IDA7IGkgPCBlUG9zOyBpKyspIHsKLSAgICAgICAgRlhfV0NIQVIgd2NoID0gc3RyLkdldEF0KGkpOwotICAgICAgICBpZiAoKHdjaCA+PSBMJ2EnICYmIHdjaCA8PSBMJ3onKSB8fCAod2NoID49IEwnMCcgJiYgd2NoIDw9IEwnOScpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0ciA9IHN0ci5MZWZ0KHN0ci5HZXRMZW5ndGgoKSAtIGVQb3MgKyBpICsgMSk7Ci0gICAgICAgICAgICBlUG9zID0gZVBvcyAtIGkgLSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaW50IG5MZW4gPSBzdHIuR2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpID0gYVBvcyArIDE7IGkgPCBuTGVuIC0gZVBvczsgaSsrKSB7Ci0gICAgICAgIEZYX1dDSEFSIHdjaCA9IHN0ci5HZXRBdChpKTsKLSAgICAgICAgaWYgKHdjaCA9PSBMJy0nIHx8IHdjaCA9PSBMJy4nIHx8ICh3Y2ggPj0gTCdhJyAmJiB3Y2ggPD0gTCd6JykgfHwgKHdjaCA+PSBMJzAnICYmIHdjaCA8PSBMJzknKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHN0ci5GaW5kKEwibWFpbHRvOiIpID09IC0xKSB7Ci0gICAgICAgIHN0ciA9IEwibWFpbHRvOiIgKyBzdHI7Ci0gICAgfQorRlhfQk9PTCBDUERGX0xpbmtFeHRyYWN0OjpDaGVja1dlYkxpbmsoQ0ZYX1dpZGVTdHJpbmcmIHN0ckJlQ2hlY2spIHsKKyAgQ0ZYX1dpZGVTdHJpbmcgc3RyID0gc3RyQmVDaGVjazsKKyAgc3RyLk1ha2VMb3dlcigpOworICBpZiAoc3RyLkZpbmQoTCJodHRwOi8vd3d3LiIpICE9IC0xKSB7CisgICAgc3RyQmVDaGVjayA9IHN0ckJlQ2hlY2suUmlnaHQoc3RyLkdldExlbmd0aCgpIC0gc3RyLkZpbmQoTCJodHRwOi8vd3d3LiIpKTsKICAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ1BERl9MaW5rRXh0cmFjdDo6QXBwZW5kVG9MaW5rTGlzdChpbnQgc3RhcnQsIGludCBjb3VudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0clVybCkKLXsKLSAgICBDUERGX0xpbmtFeHQqIGxpbmtJbmZvID0gbmV3IENQREZfTGlua0V4dDsKLSAgICBsaW5rSW5mby0+bV9zdHJVcmwgPSBzdHJVcmw7Ci0gICAgbGlua0luZm8tPm1fU3RhcnQgPSBzdGFydDsKLSAgICBsaW5rSW5mby0+bV9Db3VudCA9IGNvdW50OwotICAgIG1fTGlua0xpc3QuQWRkKGxpbmtJbmZvKTsKKyAgfQorICBpZiAoc3RyLkZpbmQoTCJodHRwOi8vIikgIT0gLTEpIHsKKyAgICBzdHJCZUNoZWNrID0gc3RyQmVDaGVjay5SaWdodChzdHIuR2V0TGVuZ3RoKCkgLSBzdHIuRmluZChMImh0dHA6Ly8iKSk7CiAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKHN0ci5GaW5kKEwiaHR0cHM6Ly93d3cuIikgIT0gLTEpIHsKKyAgICBzdHJCZUNoZWNrID0gc3RyQmVDaGVjay5SaWdodChzdHIuR2V0TGVuZ3RoKCkgLSBzdHIuRmluZChMImh0dHBzOi8vd3d3LiIpKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoc3RyLkZpbmQoTCJodHRwczovLyIpICE9IC0xKSB7CisgICAgc3RyQmVDaGVjayA9IHN0ckJlQ2hlY2suUmlnaHQoc3RyLkdldExlbmd0aCgpIC0gc3RyLkZpbmQoTCJodHRwczovLyIpKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoc3RyLkZpbmQoTCJ3d3cuIikgIT0gLTEpIHsKKyAgICBzdHJCZUNoZWNrID0gc3RyQmVDaGVjay5SaWdodChzdHIuR2V0TGVuZ3RoKCkgLSBzdHIuRmluZChMInd3dy4iKSk7CisgICAgc3RyQmVDaGVjayA9IEwiaHR0cDovLyIgKyBzdHJCZUNoZWNrOworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KLUNGWF9XaWRlU3RyaW5nIENQREZfTGlua0V4dHJhY3Q6OkdldFVSTChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX0lzUGFyc2VyZCB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gbV9MaW5rTGlzdC5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIEwiIjsKK2Jvb2wgQ1BERl9MaW5rRXh0cmFjdDo6Q2hlY2tNYWlsTGluayhDRlhfV2lkZVN0cmluZyYgc3RyKSB7CisgIGludCBhUG9zID0gc3RyLkZpbmQoTCdAJyk7CisgIC8vIEludmFsaWQgd2hlbiBubyAnQCcuCisgIGlmIChhUG9zIDwgMSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8vIENoZWNrIHRoZSBsb2NhbCBwYXJ0LgorICBpbnQgcFBvcyA9IGFQb3M7ICAvLyBVc2VkIHRvIHRyYWNrIHRoZSBwb3NpdGlvbiBvZiAnQCcgb3IgJy4nLgorICBmb3IgKGludCBpID0gYVBvcyAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgRlhfV0NIQVIgY2ggPSBzdHIuR2V0QXQoaSk7CisgICAgaWYgKGNoID09IEwnXycgfHwgY2ggPT0gTCctJyB8fCBGWFNZU19pc3dhbG51bShjaCkpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBDUERGX0xpbmtFeHQqIGxpbmsgPSBOVUxMOwotICAgIGxpbmsgPSBtX0xpbmtMaXN0LkdldEF0KGluZGV4KTsKLSAgICBpZiAoIWxpbmspIHsKLSAgICAgICAgcmV0dXJuIEwiIjsKKyAgICBpZiAoY2ggIT0gTCcuJyB8fCBpID09IHBQb3MgLSAxIHx8IGkgPT0gMCkgeworICAgICAgaWYgKGkgPT0gYVBvcyAtIDEpIHsKKyAgICAgICAgLy8gVGhlcmUgaXMgJy4nIG9yIGludmFsaWQgY2hhciBiZWZvcmUgJ0AnLgorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICAvLyBFbmQgZXh0cmFjdGluZyBmb3Igb3RoZXIgaW52YWxpZCBjaGFycywgJy4nIGF0IHRoZSBiZWdpbm5pbmcsIG9yCisgICAgICAvLyBjb25zZWN1dGl2ZSAnLicuCisgICAgICBpbnQgcmVtb3ZlZF9sZW4gPSBpID09IHBQb3MgLSAxID8gaSArIDIgOiBpICsgMTsKKyAgICAgIHN0ciA9IHN0ci5SaWdodChzdHIuR2V0TGVuZ3RoKCkgLSByZW1vdmVkX2xlbik7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgcmV0dXJuIGxpbmstPm1fc3RyVXJsOworICAgIC8vIEZvdW5kIGEgdmFsaWQgJy4nLgorICAgIHBQb3MgPSBpOworICB9CisKKyAgLy8gQ2hlY2sgdGhlIGRvbWFpbiBuYW1lIHBhcnQuCisgIGFQb3MgPSBzdHIuRmluZChMJ0AnKTsKKyAgaWYgKGFQb3MgPCAxKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHN0ci5UcmltUmlnaHQoTCcuJyk7CisgIC8vIEF0IGxlYXN0IG9uZSAnLicgaW4gZG9tYWluIG5hbWUsIGJ1dCBub3QgYXQgdGhlIGJlZ2lubmluZy4KKyAgLy8gVE9ETyh3ZWlsaSk6IFJGQzUzMjIgYWxsb3dzIGRvbWFpbiBuYW1lcyB0byBiZSBhIGxvY2FsIG5hbWUgd2l0aG91dCAnLicuCisgIC8vIENoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIHJlbW92ZSB0aGlzIGNoZWNrLgorICBpbnQgZVBvcyA9IHN0ci5GaW5kKEwnLicsIGFQb3MgKyAxKTsKKyAgaWYgKGVQb3MgPT0gLTEgfHwgZVBvcyA9PSBhUG9zICsgMSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICAvLyBWYWxpZGF0ZSBhbGwgb3RoZXIgY2hhcnMgaW4gZG9tYWluIG5hbWUuCisgIGludCBuTGVuID0gc3RyLkdldExlbmd0aCgpOworICBwUG9zID0gMDsgIC8vIFVzZWQgdG8gdHJhY2sgdGhlIHBvc2l0aW9uIG9mICcuJy4KKyAgZm9yIChpbnQgaSA9IGFQb3MgKyAxOyBpIDwgbkxlbjsgaSsrKSB7CisgICAgRlhfV0NIQVIgd2NoID0gc3RyLkdldEF0KGkpOworICAgIGlmICh3Y2ggPT0gTCctJyB8fCBGWFNZU19pc3dhbG51bSh3Y2gpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHdjaCAhPSBMJy4nIHx8IGkgPT0gcFBvcyArIDEpIHsKKyAgICAgIC8vIERvbWFpbiBuYW1lIHNob3VsZCBlbmQgYmVmb3JlIGludmFsaWQgY2hhci4KKyAgICAgIGludCBob3N0X2VuZCA9IGkgPT0gcFBvcyArIDEgPyBpIC0gMiA6IGkgLSAxOworICAgICAgaWYgKHBQb3MgPiAwICYmIGhvc3RfZW5kIC0gYVBvcyA+PSAzKSB7CisgICAgICAgIC8vIFRyaW0gdGhlIGVuZGluZyBpbnZhbGlkIGNoYXJzIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSAnLicgYW5kIG5hbWUuCisgICAgICAgIHN0ciA9IHN0ci5MZWZ0KGhvc3RfZW5kICsgMSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBwUG9zID0gaTsKKyAgfQorCisgIGlmIChzdHIuRmluZChMIm1haWx0bzoiKSA9PSAtMSkgeworICAgIHN0ciA9IEwibWFpbHRvOiIgKyBzdHI7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci12b2lkIENQREZfTGlua0V4dHJhY3Q6OkdldEJvdW5kZWRTZWdtZW50KGludCBpbmRleCwgaW50JiBzdGFydCwgaW50JiBjb3VudCkgY29uc3QKLXsKLSAgICBpZiAoIW1fSXNQYXJzZXJkIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+PSBtX0xpbmtMaXN0LkdldFNpemUoKSkgewotICAgICAgICByZXR1cm4gOwotICAgIH0KLSAgICBDUERGX0xpbmtFeHQqIGxpbmsgPSBOVUxMOwotICAgIGxpbmsgPSBtX0xpbmtMaXN0LkdldEF0KGluZGV4KTsKLSAgICBpZiAoIWxpbmspIHsKLSAgICAgICAgcmV0dXJuIDsKLSAgICB9Ci0gICAgc3RhcnQgPSBsaW5rLT5tX1N0YXJ0OwotICAgIGNvdW50ID0gbGluay0+bV9Db3VudDsKKwordm9pZCBDUERGX0xpbmtFeHRyYWN0OjpBcHBlbmRUb0xpbmtMaXN0KGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0clVybCkgeworICBDUERGX0xpbmtFeHQqIGxpbmtJbmZvID0gbmV3IENQREZfTGlua0V4dDsKKyAgbGlua0luZm8tPm1fc3RyVXJsID0gc3RyVXJsOworICBsaW5rSW5mby0+bV9TdGFydCA9IHN0YXJ0OworICBsaW5rSW5mby0+bV9Db3VudCA9IGNvdW50OworICBtX0xpbmtMaXN0LkFkZChsaW5rSW5mbyk7CiB9Ci12b2lkIENQREZfTGlua0V4dHJhY3Q6OkdldFJlY3RzKGludCBpbmRleCwgQ0ZYX1JlY3RBcnJheSYgcmVjdHMpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX0lzUGFyc2VyZCB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gbV9MaW5rTGlzdC5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX0xpbmtFeHQqIGxpbmsgPSBOVUxMOwotICAgIGxpbmsgPSBtX0xpbmtMaXN0LkdldEF0KGluZGV4KTsKLSAgICBpZiAoIWxpbmspIHsKLSAgICAgICAgcmV0dXJuIDsKLSAgICB9Ci0gICAgbV9wVGV4dFBhZ2UtPkdldFJlY3RBcnJheShsaW5rLT5tX1N0YXJ0LCBsaW5rLT5tX0NvdW50LCByZWN0cyk7CisKK0NGWF9XaWRlU3RyaW5nIENQREZfTGlua0V4dHJhY3Q6OkdldFVSTChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgaWYgKCFtX2JJc1BhcnNlZCB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gbV9MaW5rTGlzdC5HZXRTaXplKCkpIHsKKyAgICByZXR1cm4gTCIiOworICB9CisgIENQREZfTGlua0V4dCogbGluayA9IE5VTEw7CisgIGxpbmsgPSBtX0xpbmtMaXN0LkdldEF0KGluZGV4KTsKKyAgaWYgKCFsaW5rKSB7CisgICAgcmV0dXJuIEwiIjsKKyAgfQorICByZXR1cm4gbGluay0+bV9zdHJVcmw7Cit9Cit2b2lkIENQREZfTGlua0V4dHJhY3Q6OkdldEJvdW5kZWRTZWdtZW50KGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBjb3VudCkgY29uc3QgeworICBpZiAoIW1fYklzUGFyc2VkIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+PSBtX0xpbmtMaXN0LkdldFNpemUoKSkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX0xpbmtFeHQqIGxpbmsgPSBOVUxMOworICBsaW5rID0gbV9MaW5rTGlzdC5HZXRBdChpbmRleCk7CisgIGlmICghbGluaykgeworICAgIHJldHVybjsKKyAgfQorICBzdGFydCA9IGxpbmstPm1fU3RhcnQ7CisgIGNvdW50ID0gbGluay0+bV9Db3VudDsKK30KK3ZvaWQgQ1BERl9MaW5rRXh0cmFjdDo6R2V0UmVjdHMoaW50IGluZGV4LCBDRlhfUmVjdEFycmF5JiByZWN0cykgY29uc3QgeworICBpZiAoIW1fYklzUGFyc2VkIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+PSBtX0xpbmtMaXN0LkdldFNpemUoKSkgeworICAgIHJldHVybjsKKyAgfQorICBDUERGX0xpbmtFeHQqIGxpbmsgPSBOVUxMOworICBsaW5rID0gbV9MaW5rTGlzdC5HZXRBdChpbmRleCk7CisgIGlmICghbGluaykgeworICAgIHJldHVybjsKKyAgfQorICBtX3BUZXh0UGFnZS0+R2V0UmVjdEFycmF5KGxpbmstPm1fU3RhcnQsIGxpbmstPm1fQ291bnQsIHJlY3RzKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dF9pbnRfdW5pdHRlc3QuY3BwIGIvY29yZS9zcmMvZnBkZnRleHQvZnBkZl90ZXh0X2ludF91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ4MmYwMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dF9pbnRfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNTYgQEAKKy8vIENvcHlyaWdodCAyMDE1IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCisjaW5jbHVkZSAiY29yZS9zcmMvZnBkZnRleHQvdGV4dF9pbnQuaCIKKworLy8gQ2xhc3MgdG8gaGVscCB0ZXN0IGZ1bmN0aW9ucyBpbiBDUERGX0xpbmtFeHRyYWN0IGNsYXNzLgorY2xhc3MgQ1BERl9UZXN0TGlua0V4dHJhY3QgOiBwdWJsaWMgQ1BERl9MaW5rRXh0cmFjdCB7CisgcHJpdmF0ZToKKyAgLy8gQWRkIHRlc3QgY2FzZXMgYXMgZnJpZW5kcyB0byBhY2Nlc3MgcHJvdGVjdGVkIG1lbWJlciBmdW5jdGlvbnMuCisgIC8vIEFjY2VzcyBDaGVja01haWxMaW5rLgorICBGUklFTkRfVEVTVChmcGRmX3RleHRfaW50LCBDaGVja01haWxMaW5rKTsKK307CisKK1RFU1QoZnBkZl90ZXh0X2ludCwgQ2hlY2tNYWlsTGluaykgeworICBDUERGX1Rlc3RMaW5rRXh0cmFjdCBleHRyYWN0b3I7CisgIC8vIENoZWNrIGNhc2VzIHRoYXQgZmFpbCB0byBleHRyYWN0IHZhbGlkIG1haWwgbGluay4KKyAgY29uc3Qgd2NoYXJfdCogaW52YWxpZF9zdHJzW10gPSB7CisgICAgICBMIiIsCisgICAgICBMInBldGVyLnBhbiIgICAgICAgIC8vICdAJyBpcyByZXF1aXJlZC4KKyAgICAgIEwiYWJjQHNlcnZlciIsICAgICAgLy8gRG9tYWluIG5hbWUgbmVlZHMgYXQgbGVhc3Qgb25lICcuJy4KKyAgICAgIEwiYWJjLkBnbWFpbC5jb20iLCAgLy8gJy4nIGNhbiBub3QgaW1tZWRpYXRlbHkgcHJlY2VkZSAnQCcuCisgICAgICBMImFiY0B4eXomcS5vcmciLCAgIC8vIERvbWFpbiBuYW1lIHNob3VsZCBub3QgY29udGFpbiAnJicuCisgICAgICBMImFiY0AueHl6Lm9yZyIsICAgIC8vIERvbWFpbiBuYW1lIHNob3VsZCBub3Qgc3RhcnQgd2l0aCAnLicuCisgICAgICBMImZhbkBnLi5jb20iICAgICAgIC8vIERvbWFpbiBuYW1lIHNob3VsZCBub3QgaGF2ZSBjb25zZWN1dGl2ZSAnLicKKyAgfTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoaW52YWxpZF9zdHJzKTsgKytpKSB7CisgICAgQ0ZYX1dpZGVTdHJpbmcgdGV4dF9zdHIoaW52YWxpZF9zdHJzW2ldKTsKKyAgICBFWFBFQ1RfRkFMU0UoZXh0cmFjdG9yLkNoZWNrTWFpbExpbmsodGV4dF9zdHIpKTsKKyAgfQorCisgIC8vIENoZWNrIGNhc2VzIHRoYXQgY2FuIGV4dHJhY3QgdmFsaWQgbWFpbCBsaW5rLgorICAvLyBBbiBhcnJheSBvZiB7aW5wdXRfc3RyaW5nLCBleHBlY3RlZF9leHRyYWN0ZWRfZW1haWxfYWRkcmVzc30uCisgIGNvbnN0IHdjaGFyX3QqIHZhbGlkX3N0cnNbXVsyXSA9IHsKKyAgICAgIHtMInBldGVyQGFiYy5kIiwgTCJwZXRlckBhYmMuZCJ9LAorICAgICAge0wicmVkLnRlZGR5LmJAYWJjLmNvbSIsIEwicmVkLnRlZGR5LmJAYWJjLmNvbSJ9LAorICAgICAge0wiYWJjX0BnbWFpbC5jb20iLCBMImFiY19AZ21haWwuY29tIn0sICAvLyAnXycgaXMgb2sgYmVmb3JlICdAJy4KKyAgICAgIHtMImR1bW15LWhpQGdtYWlsLmNvbSIsCisgICAgICAgTCJkdW1teS1oaUBnbWFpbC5jb20ifSwgICAgICAgICAgICAgICAgICAvLyAnLScgaXMgb2sgaW4gdXNlciBuYW1lLgorICAgICAge0wiYS4uZGZAZ21haWwuY29tIiwgTCJkZkBnbWFpbC5jb20ifSwgICAgLy8gU3RvcCBhdCBjb25zZWN1dGl2ZSAnLicuCisgICAgICB7TCIuam9obkB5YWhvby5jb20iLCBMImpvaG5AeWFob28uY29tIn0sICAvLyBSZW1vdmUgaGVhZGluZyAnLicuCisgICAgICB7TCJhYmNAeHl6Lm9yZz8vIiwgTCJhYmNAeHl6Lm9yZyJ9LCAgICAgICAvLyBUcmltIGVuZGluZyBpbnZhbGlkIGNoYXJzLgorICAgICAge0wiZmFue2FiY0B4eXoub3JnIiwgTCJhYmNAeHl6Lm9yZyJ9LCAgICAgLy8gVHJpbSBiZWdpbm5pbmcgaW52YWxpZCBjaGFycy4KKyAgICAgIHtMImZhbkBnLmNvbS4uIiwgTCJmYW5AZy5jb20ifSwgICAgICAgICAgIC8vIFRyaW0gdGhlIGVuZGluZyBwZXJpb2RzLgorICAgICAge0wiQ0FQLmNhcEBHbWFpbC5Db20iLCBMIkNBUC5jYXBAR21haWwuQ29tIn0sICAvLyBLZWVwIHRoZSBvcmlnaW5hbCBjYXNlLgorICB9OworICBmb3IgKGludCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh2YWxpZF9zdHJzKTsgKytpKSB7CisgICAgQ0ZYX1dpZGVTdHJpbmcgdGV4dF9zdHIodmFsaWRfc3Ryc1tpXVswXSk7CisgICAgQ0ZYX1dpZGVTdHJpbmcgZXhwZWN0ZWRfc3RyKEwibWFpbHRvOiIpOworICAgIGV4cGVjdGVkX3N0ciArPSB2YWxpZF9zdHJzW2ldWzFdOworICAgIEVYUEVDVF9UUlVFKGV4dHJhY3Rvci5DaGVja01haWxMaW5rKHRleHRfc3RyKSk7CisgICAgRVhQRUNUX1NUUkVRKHRleHRfc3RyLmNfc3RyKCksIGV4cGVjdGVkX3N0ci5jX3N0cigpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZnRleHQvZnBkZl90ZXh0X3NlYXJjaC5jcHAgYi9jb3JlL3NyYy9mcGRmdGV4dC9mcGRmX3RleHRfc2VhcmNoLmNwcAppbmRleCBiZmQ3NDJmLi44MGJmNWVjIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmdGV4dC9mcGRmX3RleHRfc2VhcmNoLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmdGV4dC9mcGRmX3RleHRfc2VhcmNoLmNwcApAQCAtMSwzMjEgKzEsMzMyIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlb2JqLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mcGRmdGV4dC9mcGRmX3RleHQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlLmgiCi1jbGFzcyBDUERGX1RleHRTdHJlYW0gCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9UZXh0U3RyZWFtKENGWF9XaWRlVGV4dEJ1ZiYgYnVmZmVyLCBGWF9CT09MIGJVc2VMRiwgQ0ZYX1B0ckFycmF5KiBwT2JqQXJyYXkpOwotICAgIH5DUERGX1RleHRTdHJlYW0oKSB7fQotICAgIEZYX0JPT0wgUHJvY2Vzc09iamVjdChjb25zdCBDUERGX1RleHRPYmplY3QqIHBPYmosIEZYX0JPT0wgYkZpcnN0TGluZSk7Ci0gICAgQ0ZYX1dpZGVUZXh0QnVmJgltX0J1ZmZlcjsKLSAgICBGWF9CT09MCQkJCW1fYlVzZUxGOwotICAgIENGWF9QdHJBcnJheSoJCW1fcE9iakFycmF5OwotICAgIGNvbnN0IENQREZfVGV4dE9iamVjdCoJbV9wTGFzdE9iajsKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2UuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2VvYmouaCIKKyNpbmNsdWRlICJ0ZXh0X2ludC5oIgorCitjbGFzcyBDUERGX1RleHRTdHJlYW0geworIHB1YmxpYzoKKyAgQ1BERl9UZXh0U3RyZWFtKENGWF9XaWRlVGV4dEJ1ZiYgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXNlTEYsCisgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkqIHBPYmpBcnJheSk7CisgIH5DUERGX1RleHRTdHJlYW0oKSB7fQorICBGWF9CT09MIFByb2Nlc3NPYmplY3QoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwT2JqLCBGWF9CT09MIGJGaXJzdExpbmUpOworICBDRlhfV2lkZVRleHRCdWYmIG1fQnVmZmVyOworICBGWF9CT09MIG1fYlVzZUxGOworICBDRlhfUHRyQXJyYXkqIG1fcE9iakFycmF5OworICBjb25zdCBDUERGX1RleHRPYmplY3QqIG1fcExhc3RPYmo7CiB9OwotQ1BERl9UZXh0U3RyZWFtOjpDUERGX1RleHRTdHJlYW0oQ0ZYX1dpZGVUZXh0QnVmJiBidWZmZXIsIEZYX0JPT0wgYlVzZUxGLCBDRlhfUHRyQXJyYXkqIHBPYmpBcnJheSkgOiBtX0J1ZmZlcihidWZmZXIpCi17Ci0gICAgbV9wTGFzdE9iaiA9IE5VTEw7Ci0gICAgbV9iVXNlTEYgPSBiVXNlTEY7Ci0gICAgbV9wT2JqQXJyYXkgPSBwT2JqQXJyYXk7CitDUERGX1RleHRTdHJlYW06OkNQREZfVGV4dFN0cmVhbShDRlhfV2lkZVRleHRCdWYmIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZUxGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckFycmF5KiBwT2JqQXJyYXkpCisgICAgOiBtX0J1ZmZlcihidWZmZXIpIHsKKyAgbV9wTGFzdE9iaiA9IE5VTEw7CisgIG1fYlVzZUxGID0gYlVzZUxGOworICBtX3BPYmpBcnJheSA9IHBPYmpBcnJheTsKIH0KLUZYX0JPT0wgRlBERlRleHRfSXNTYW1lVGV4dE9iamVjdChjb25zdCBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMSwgY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iajIpCi17Ci0gICAgaWYgKCFwVGV4dE9iajEgfHwgIXBUZXh0T2JqMikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENGWF9GbG9hdFJlY3QgcmNQcmVPYmoocFRleHRPYmoyLT5tX0xlZnQsIHBUZXh0T2JqMi0+bV9Cb3R0b20sIHBUZXh0T2JqMi0+bV9SaWdodCwgcFRleHRPYmoyLT5tX1RvcCk7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByY0N1ck9iaihwVGV4dE9iajEtPm1fTGVmdCwgcFRleHRPYmoxLT5tX0JvdHRvbSwgcFRleHRPYmoxLT5tX1JpZ2h0LCBwVGV4dE9iajEtPm1fVG9wKTsKLSAgICBpZiAocmNQcmVPYmouSXNFbXB0eSgpICYmIHJjQ3VyT2JqLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKCFyY1ByZU9iai5Jc0VtcHR5KCkgfHwgIXJjQ3VyT2JqLklzRW1wdHkoKSkgewotICAgICAgICByY1ByZU9iai5JbnRlcnNlY3QocmNDdXJPYmopOwotICAgICAgICBpZiAocmNQcmVPYmouSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEZYU1lTX2ZhYnMocmNQcmVPYmouV2lkdGgoKSAtIHJjQ3VyT2JqLldpZHRoKCkpID4gcmNDdXJPYmouV2lkdGgoKSAvIDIpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAocFRleHRPYmoyLT5HZXRGb250U2l6ZSgpICE9IHBUZXh0T2JqMS0+R2V0Rm9udFNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIGludCBuUHJlQ291bnQgPSBwVGV4dE9iajItPkNvdW50SXRlbXMoKTsKLSAgICBpbnQgbkN1ckNvdW50ID0gcFRleHRPYmoxLT5Db3VudEl0ZW1zKCk7Ci0gICAgaWYgKG5QcmVDb3VudCAhPSBuQ3VyQ291bnQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5QcmVDb3VudDsgaSsrKSB7Ci0gICAgICAgIENQREZfVGV4dE9iamVjdEl0ZW0gaXRlbVBlciwgaXRlbUN1cjsKLSAgICAgICAgcFRleHRPYmoyLT5HZXRJdGVtSW5mbyhpLCAmaXRlbVBlcik7Ci0gICAgICAgIHBUZXh0T2JqMS0+R2V0SXRlbUluZm8oaSwgJml0ZW1DdXIpOwotICAgICAgICBpZiAoaXRlbUN1ci5tX0NoYXJDb2RlICE9IGl0ZW1QZXIubV9DaGFyQ29kZSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotaW50IEdldENoYXJXaWR0aChGWF9EV09SRCBjaGFyQ29kZSwgQ1BERl9Gb250KiBwRm9udCkKLXsKLSAgICBpZihjaGFyQ29kZSA9PSAtMSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW50IHcgPSBwRm9udC0+R2V0Q2hhcldpZHRoRihjaGFyQ29kZSk7Ci0gICAgaWYodyA9PSAwKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKLSAgICAgICAgcEZvbnQtPkFwcGVuZENoYXIoc3RyLCBjaGFyQ29kZSk7Ci0gICAgICAgIHcgPSBwRm9udC0+R2V0U3RyaW5nV2lkdGgoc3RyLCAxKTsKLSAgICAgICAgaWYodyA9PSAwKSB7Ci0gICAgICAgICAgICBGWF9SRUNUIEJCb3g7Ci0gICAgICAgICAgICBwRm9udC0+R2V0Q2hhckJCb3goY2hhckNvZGUsIEJCb3gpOwotICAgICAgICAgICAgdyA9IEJCb3gucmlnaHQgLSBCQm94LmxlZnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHc7Ci19Ci1pbnQgRlBERlRleHRfUHJvY2Vzc0ludGVyT2JqKGNvbnN0IENQREZfVGV4dE9iamVjdCogcFByZXZPYmosIGNvbnN0IENQREZfVGV4dE9iamVjdCogcE9iaikKLXsKLSAgICBpZihGUERGVGV4dF9Jc1NhbWVUZXh0T2JqZWN0KHBQcmV2T2JqLCBwT2JqKSkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIENQREZfVGV4dE9iamVjdEl0ZW0gaXRlbTsKLSAgICBpbnQgbkl0ZW0gPSBwUHJldk9iai0+Q291bnRJdGVtcygpOwotICAgIHBQcmV2T2JqLT5HZXRJdGVtSW5mbyhuSXRlbSAtIDEsICZpdGVtKTsKLSAgICBGWF9XQ0hBUiBwcmVDaGFyID0gMCwgY3VyQ2hhciA9IDA7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3N0ciA9IHBQcmV2T2JqLT5HZXRGb250KCktPlVuaWNvZGVGcm9tQ2hhckNvZGUoaXRlbS5tX0NoYXJDb2RlKTsKLSAgICBpZih3c3RyLkdldExlbmd0aCgpKSB7Ci0gICAgICAgIHByZUNoYXIgPSB3c3RyLkdldEF0KDApOwotICAgIH0KLSAgICBGWF9GTE9BVCBsYXN0X3BvcyA9IGl0ZW0ubV9PcmlnaW5YOwotICAgIGludCBuTGFzdFdpZHRoID0gR2V0Q2hhcldpZHRoKGl0ZW0ubV9DaGFyQ29kZSwgcFByZXZPYmotPkdldEZvbnQoKSk7Ci0gICAgRlhfRkxPQVQgbGFzdF93aWR0aCA9IG5MYXN0V2lkdGggKiBwUHJldk9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDA7Ci0gICAgbGFzdF93aWR0aCA9IEZYU1lTX2ZhYnMobGFzdF93aWR0aCk7Ci0gICAgcE9iai0+R2V0SXRlbUluZm8oMCwgJml0ZW0pOwotICAgIHdzdHIgPSBwT2JqLT5HZXRGb250KCktPlVuaWNvZGVGcm9tQ2hhckNvZGUoaXRlbS5tX0NoYXJDb2RlKTsKLSAgICBpZih3c3RyLkdldExlbmd0aCgpKSB7Ci0gICAgICAgIGN1ckNoYXIgPSB3c3RyLkdldEF0KDApOwotICAgIH0KLSAgICBpbnQgblRoaXNXaWR0aCA9IEdldENoYXJXaWR0aChpdGVtLm1fQ2hhckNvZGUsIHBPYmotPkdldEZvbnQoKSk7Ci0gICAgRlhfRkxPQVQgdGhpc193aWR0aCA9IG5UaGlzV2lkdGggKiBwT2JqLT5HZXRGb250U2l6ZSgpIC8gMTAwMDsKLSAgICB0aGlzX3dpZHRoID0gRlhTWVNfZmFicyh0aGlzX3dpZHRoKTsKLSAgICBGWF9GTE9BVCB0aHJlc2hvbGQgPSBsYXN0X3dpZHRoID4gdGhpc193aWR0aCA/IGxhc3Rfd2lkdGggLyA0IDogdGhpc193aWR0aCAvIDQ7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBwcmV2X21hdHJpeCwgcHJldl9yZXZlcnNlOwotICAgIHBQcmV2T2JqLT5HZXRUZXh0TWF0cml4KCZwcmV2X21hdHJpeCk7Ci0gICAgcHJldl9yZXZlcnNlLlNldFJldmVyc2UocHJldl9tYXRyaXgpOwotICAgIEZYX0ZMT0FUIHggPSBwT2JqLT5HZXRQb3NYKCksIHkgPSBwT2JqLT5HZXRQb3NZKCk7Ci0gICAgcHJldl9yZXZlcnNlLlRyYW5zZm9ybSh4LCB5KTsKLSAgICBpZiAoRlhTWVNfZmFicyh5KSA+IHRocmVzaG9sZCAqIDIpIHsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfQotICAgIHRocmVzaG9sZCA9IChGWF9GTE9BVCkobkxhc3RXaWR0aCA+IG5UaGlzV2lkdGggPyBuTGFzdFdpZHRoIDogblRoaXNXaWR0aCk7Ci0gICAgdGhyZXNob2xkID0gdGhyZXNob2xkID4gNDAwID8gKHRocmVzaG9sZCA8IDcwMCA/IHRocmVzaG9sZCAvIDQgOiAgdGhyZXNob2xkIC8gNSkgOiAodGhyZXNob2xkIC8gMik7Ci0gICAgdGhyZXNob2xkICo9IG5MYXN0V2lkdGggPiBuVGhpc1dpZHRoID8gRlhTWVNfZmFicyhwUHJldk9iai0+R2V0Rm9udFNpemUoKSkgOiBGWFNZU19mYWJzKHBPYmotPkdldEZvbnRTaXplKCkpOwotICAgIHRocmVzaG9sZCAvPSAxMDAwOwotICAgIGlmIChGWFNZU19mYWJzKGxhc3RfcG9zICsgbGFzdF93aWR0aCAtIHgpID4gdGhyZXNob2xkICYmIGN1ckNoYXIgIT0gTCcgJyAmJiBwcmVDaGFyICE9IEwnICcpCi0gICAgICAgIGlmKGN1ckNoYXIgIT0gTCcgJyAmJiBwcmVDaGFyICE9IEwnICcpIHsKLSAgICAgICAgICAgIGlmKCh4IC0gbGFzdF9wb3MgLSBsYXN0X3dpZHRoKSA+IHRocmVzaG9sZCB8fCAobGFzdF9wb3MgLSB4IC0gbGFzdF93aWR0aCkgPiB0aHJlc2hvbGQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHggPCAwICYmIChsYXN0X3BvcyAtIHggLSBsYXN0X3dpZHRoKSA+IHRocmVzaG9sZCkgewotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoKHggLSBsYXN0X3BvcyAtIGxhc3Rfd2lkdGgpID4gdGhpc193aWR0aCB8fCAoeCAtIGxhc3RfcG9zIC0gdGhpc193aWR0aCkgPiBsYXN0X3dpZHRoICkgewotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgaWYobGFzdF9wb3MgKyBsYXN0X3dpZHRoID4geCArIHRoaXNfd2lkdGggJiYgY3VyQ2hhciA9PSBMJyAnKSB7Ci0gICAgICAgIHJldHVybiAzOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLUZYX0JPT0wgQ1BERl9UZXh0U3RyZWFtOjpQcm9jZXNzT2JqZWN0KGNvbnN0IENQREZfVGV4dE9iamVjdCogcE9iaiwgRlhfQk9PTCBiRmlyc3RMaW5lKQotewotICAgIENQREZfRm9udCogcEZvbnQgPSBwT2JqLT5HZXRGb250KCk7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXg7Ci0gICAgcE9iai0+R2V0VGV4dE1hdHJpeCgmbWF0cml4KTsKLSAgICBpbnQgaXRlbV9pbmRleCA9IDA7Ci0gICAgaWYgKG1fcExhc3RPYmopIHsKLSAgICAgICAgaW50IHJlc3VsdCA9IEZQREZUZXh0X1Byb2Nlc3NJbnRlck9iaihtX3BMYXN0T2JqLCBwT2JqKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSAyKSB7Ci0gICAgICAgICAgICBpbnQgbGVuID0gbV9CdWZmZXIuR2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVuICYmIG1fYlVzZUxGICYmIG1fQnVmZmVyLkdldEJ1ZmZlcigpW2xlbiAtIDFdID09IEwnLScpIHsKLSAgICAgICAgICAgICAgICBtX0J1ZmZlci5EZWxldGUobGVuIC0gMSwgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1fcE9iakFycmF5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE9iakFycmF5LT5SZW1vdmVBdCgobGVuIC0gMSkgKiAyLCAyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChiRmlyc3RMaW5lKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobV9iVXNlTEYpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9CdWZmZXIuQXBwZW5kQ2hhcihMJ1xyJyk7Ci0gICAgICAgICAgICAgICAgICAgIG1fQnVmZmVyLkFwcGVuZENoYXIoTCdcbicpOwotICAgICAgICAgICAgICAgICAgICBpZiAobV9wT2JqQXJyYXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE9iakFycmF5LT5BZGQoTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtX0J1ZmZlci5BcHBlbmRDaGFyKCcgJyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX3BPYmpBcnJheSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9wT2JqQXJyYXktPkFkZChOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcE9iakFycmF5LT5BZGQoTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09IDEpIHsKLSAgICAgICAgICAgIG1fQnVmZmVyLkFwcGVuZENoYXIoTCcgJyk7Ci0gICAgICAgICAgICBpZiAobV9wT2JqQXJyYXkpIHsKLSAgICAgICAgICAgICAgICBtX3BPYmpBcnJheS0+QWRkKE5VTEwpOwotICAgICAgICAgICAgICAgIG1fcE9iakFycmF5LT5BZGQoTlVMTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09IC0xKSB7Ci0gICAgICAgICAgICBtX3BMYXN0T2JqID0gcE9iajsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gMykgewotICAgICAgICAgICAgaXRlbV9pbmRleCA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9wTGFzdE9iaiA9IHBPYmo7Ci0gICAgaW50IG5JdGVtcyA9IHBPYmotPkNvdW50SXRlbXMoKTsKLSAgICBGWF9GTE9BVCBJZ25vcmVrZXJuaW5nID0gMDsKLSAgICBmb3IoaW50IGkgPSAxOyBpIDwgbkl0ZW1zIC0gMTsgaSArPSAyKSB7Ci0gICAgICAgIENQREZfVGV4dE9iamVjdEl0ZW0gaXRlbTsKLSAgICAgICAgcE9iai0+R2V0SXRlbUluZm8oaSwgJml0ZW0pOwotICAgICAgICBpZiAoaXRlbS5tX0NoYXJDb2RlID09IChGWF9EV09SRCkgLSAxKSB7Ci0gICAgICAgICAgICBpZihpID09IDEpIHsKLSAgICAgICAgICAgICAgICBJZ25vcmVrZXJuaW5nID0gaXRlbS5tX09yaWdpblg7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoSWdub3Jla2VybmluZyA+IGl0ZW0ubV9PcmlnaW5YKSB7Ci0gICAgICAgICAgICAgICAgSWdub3Jla2VybmluZyA9IGl0ZW0ubV9PcmlnaW5YOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSWdub3Jla2VybmluZyA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBGWF9GTE9BVCBzcGFjaW5nID0gMDsKLSAgICBmb3IgKDsgaXRlbV9pbmRleCA8IG5JdGVtczsgaXRlbV9pbmRleCArKykgewotICAgICAgICBDUERGX1RleHRPYmplY3RJdGVtIGl0ZW07Ci0gICAgICAgIHBPYmotPkdldEl0ZW1JbmZvKGl0ZW1faW5kZXgsICZpdGVtKTsKLSAgICAgICAgaWYgKGl0ZW0ubV9DaGFyQ29kZSA9PSAoRlhfRFdPUkQpIC0gMSkgewotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3N0ciA9IG1fQnVmZmVyLkdldFdpZGVTdHJpbmcoKTsKLSAgICAgICAgICAgIGlmICh3c3RyLklzRW1wdHkoKSB8fCB3c3RyLkdldEF0KHdzdHIuR2V0TGVuZ3RoKCkgLSAxKSA9PSBMJyAnKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9GTE9BVCBmb250c2l6ZV9oID0gcE9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemVIKCk7Ci0gICAgICAgICAgICBzcGFjaW5nID0gLWZvbnRzaXplX2ggKiAoaXRlbS5tX09yaWdpblggLSBJZ25vcmVrZXJuaW5nKSAvIDEwMDA7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBGWF9GTE9BVCBjaGFyU3BhY2UgPSBwT2JqLT5tX1RleHRTdGF0ZS5HZXRPYmplY3QoKS0+bV9DaGFyU3BhY2U7Ci0gICAgICAgIGlmKG5JdGVtcyA+IDMgJiYgIXNwYWNpbmcpIHsKLSAgICAgICAgICAgIGNoYXJTcGFjZSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoKHNwYWNpbmcgfHwgY2hhclNwYWNlKSAmJiBpdGVtX2luZGV4ID4gMCkgewotICAgICAgICAgICAgaW50IGxhc3Rfd2lkdGggPSAwOwotICAgICAgICAgICAgRlhfRkxPQVQgZm9udHNpemVfaCA9IHBPYmotPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplSCgpOwotICAgICAgICAgICAgRlhfRFdPUkQgc3BhY2VfY2hhcmNvZGUgPSBwRm9udC0+Q2hhckNvZGVGcm9tVW5pY29kZSgnICcpOwotICAgICAgICAgICAgRlhfRkxPQVQgdGhyZXNob2xkID0gMDsKLSAgICAgICAgICAgIGlmIChzcGFjZV9jaGFyY29kZSAhPSAtMSkgewotICAgICAgICAgICAgICAgIHRocmVzaG9sZCA9IGZvbnRzaXplX2ggKiBwRm9udC0+R2V0Q2hhcldpZHRoRihzcGFjZV9jaGFyY29kZSkgLyAxMDAwIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHRocmVzaG9sZCA+IGZvbnRzaXplX2ggLyAzKSB7Ci0gICAgICAgICAgICAgICAgdGhyZXNob2xkID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyZXNob2xkIC89IDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGhyZXNob2xkID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJlc2hvbGQgPSBmb250c2l6ZV9oOwotICAgICAgICAgICAgICAgIGludCB0aGlzX3dpZHRoID0gRlhTWVNfYWJzKEdldENoYXJXaWR0aChpdGVtLm1fQ2hhckNvZGUsIHBGb250KSk7Ci0gICAgICAgICAgICAgICAgdGhyZXNob2xkID0gdGhpc193aWR0aCA+IGxhc3Rfd2lkdGggPyAoRlhfRkxPQVQpdGhpc193aWR0aCA6IChGWF9GTE9BVClsYXN0X3dpZHRoOwotICAgICAgICAgICAgICAgIGludCBuRGl2aWRlID0gNjsKLSAgICAgICAgICAgICAgICBpZiAodGhyZXNob2xkIDwgMzAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5EaXZpZGUgPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhyZXNob2xkIDwgNTAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5EaXZpZGUgPSA0OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhyZXNob2xkIDwgNzAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5EaXZpZGUgPSA1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aHJlc2hvbGQgPSB0aHJlc2hvbGQgLyBuRGl2aWRlOwotICAgICAgICAgICAgICAgIHRocmVzaG9sZCA9IGZvbnRzaXplX2ggKiB0aHJlc2hvbGQgLyAxMDAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoY2hhclNwYWNlID4gMC4wMDEpIHsKLSAgICAgICAgICAgICAgICBzcGFjaW5nICs9IG1hdHJpeC5UcmFuc2Zvcm1EaXN0YW5jZShjaGFyU3BhY2UpOwotICAgICAgICAgICAgfSBlbHNlIGlmKGNoYXJTcGFjZSA8IC0wLjAwMSkgewotICAgICAgICAgICAgICAgIHNwYWNpbmcgLT0gbWF0cml4LlRyYW5zZm9ybURpc3RhbmNlKEZYU1lTX2ZhYnMoY2hhclNwYWNlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGhyZXNob2xkICYmIChzcGFjaW5nICYmIHNwYWNpbmcgPj0gdGhyZXNob2xkKSApIHsKLSAgICAgICAgICAgICAgICBtX0J1ZmZlci5BcHBlbmRDaGFyKEwnICcpOwotICAgICAgICAgICAgICAgIGlmIChtX3BPYmpBcnJheSkgewotICAgICAgICAgICAgICAgICAgICBtX3BPYmpBcnJheS0+QWRkKE5VTEwpOwotICAgICAgICAgICAgICAgICAgICBtX3BPYmpBcnJheS0+QWRkKE5VTEwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpdGVtLm1fQ2hhckNvZGUgPT0gKEZYX0RXT1JEKSAtIDEpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwYWNpbmcgPSAwOwotICAgICAgICB9Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHVuaWNvZGVfc3RyID0gcEZvbnQtPlVuaWNvZGVGcm9tQ2hhckNvZGUoaXRlbS5tX0NoYXJDb2RlKTsKLSAgICAgICAgaWYgKHVuaWNvZGVfc3RyLklzRW1wdHkoKSkgewotICAgICAgICAgICAgbV9CdWZmZXIuQXBwZW5kQ2hhcigoRlhfV0NIQVIpaXRlbS5tX0NoYXJDb2RlKTsKLSAgICAgICAgICAgIGlmIChtX3BPYmpBcnJheSkgewotICAgICAgICAgICAgICAgIG1fcE9iakFycmF5LT5BZGQoKHZvaWQqKXBPYmopOwotICAgICAgICAgICAgICAgIG1fcE9iakFycmF5LT5BZGQoKHZvaWQqKShGWF9JTlRQVFIpaXRlbV9pbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX0J1ZmZlciA8PCB1bmljb2RlX3N0cjsKLSAgICAgICAgICAgIGlmIChtX3BPYmpBcnJheSkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pY29kZV9zdHIuR2V0TGVuZ3RoKCk7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbV9wT2JqQXJyYXktPkFkZCgodm9pZCopcE9iaik7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE9iakFycmF5LT5BZGQoKHZvaWQqKShGWF9JTlRQVFIpaXRlbV9pbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQorRlhfQk9PTCBGUERGVGV4dF9Jc1NhbWVUZXh0T2JqZWN0KGNvbnN0IENQREZfVGV4dE9iamVjdCogcFRleHRPYmoxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfVGV4dE9iamVjdCogcFRleHRPYmoyKSB7CisgIGlmICghcFRleHRPYmoxIHx8ICFwVGV4dE9iajIpIHsKICAgICByZXR1cm4gRkFMU0U7Ci19Ci12b2lkIF9QREZfR2V0VGV4dFN0cmVhbV9Vbmljb2RlKENGWF9XaWRlVGV4dEJ1ZiYgYnVmZmVyLCBDUERGX1BhZ2VPYmplY3RzKiBwUGFnZSwgRlhfQk9PTCBiVXNlTEYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJBcnJheSogcE9iakFycmF5KQotewotICAgIENQREZfVGV4dFN0cmVhbSB0ZXh0c3RyZWFtKGJ1ZmZlciwgYlVzZUxGLCBwT2JqQXJyYXkpOwotICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBQYWdlLT5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBPYmplY3QgPSBwUGFnZS0+R2V0TmV4dE9iamVjdChwb3MpOwotICAgICAgICBpZiAocE9iamVjdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocE9iamVjdC0+bV9UeXBlICE9IFBERlBBR0VfVEVYVCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgdGV4dHN0cmVhbS5Qcm9jZXNzT2JqZWN0KChDUERGX1RleHRPYmplY3QqKXBPYmplY3QsIEZBTFNFKTsKKyAgfQorICBDRlhfRmxvYXRSZWN0IHJjUHJlT2JqKHBUZXh0T2JqMi0+bV9MZWZ0LCBwVGV4dE9iajItPm1fQm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBUZXh0T2JqMi0+bV9SaWdodCwgcFRleHRPYmoyLT5tX1RvcCk7CisgIENGWF9GbG9hdFJlY3QgcmNDdXJPYmoocFRleHRPYmoxLT5tX0xlZnQsIHBUZXh0T2JqMS0+bV9Cb3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgcFRleHRPYmoxLT5tX1JpZ2h0LCBwVGV4dE9iajEtPm1fVG9wKTsKKyAgaWYgKHJjUHJlT2JqLklzRW1wdHkoKSAmJiByY0N1ck9iai5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoIXJjUHJlT2JqLklzRW1wdHkoKSB8fCAhcmNDdXJPYmouSXNFbXB0eSgpKSB7CisgICAgcmNQcmVPYmouSW50ZXJzZWN0KHJjQ3VyT2JqKTsKKyAgICBpZiAocmNQcmVPYmouSXNFbXB0eSgpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotfQotQ0ZYX1dpZGVTdHJpbmcgUERGX0dldEZpcnN0VGV4dExpbmVfVW5pY29kZShDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlKQotewotICAgIENGWF9XaWRlVGV4dEJ1ZiBidWZmZXI7Ci0gICAgYnVmZmVyLkVzdGltYXRlU2l6ZSgwLCAxMDI0KTsKLSAgICBDUERGX1BhZ2UgcGFnZTsKLSAgICBwYWdlLkxvYWQocERvYywgcFBhZ2UpOwotICAgIENQREZfUGFyc2VPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5tX2JUZXh0T25seSA9IFRSVUU7Ci0gICAgb3B0aW9ucy5tX2JTZXBhcmF0ZUZvcm0gPSBGQUxTRTsKLSAgICBwYWdlLlBhcnNlQ29udGVudCgmb3B0aW9ucyk7Ci0gICAgQ1BERl9UZXh0U3RyZWFtIHRleHRzdHJlYW0oYnVmZmVyLCBGQUxTRSwgTlVMTCk7Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gcGFnZS5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBPYmplY3QgPSBwYWdlLkdldE5leHRPYmplY3QocG9zKTsKLSAgICAgICAgaWYgKHBPYmplY3QtPm1fVHlwZSAhPSBQREZQQUdFX1RFWFQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0ZXh0c3RyZWFtLlByb2Nlc3NPYmplY3QoKENQREZfVGV4dE9iamVjdCopcE9iamVjdCwgVFJVRSkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisgICAgaWYgKEZYU1lTX2ZhYnMocmNQcmVPYmouV2lkdGgoKSAtIHJjQ3VyT2JqLldpZHRoKCkpID4KKyAgICAgICAgcmNDdXJPYmouV2lkdGgoKSAvIDIpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgcmV0dXJuIGJ1ZmZlci5HZXRXaWRlU3RyaW5nKCk7CisgICAgaWYgKHBUZXh0T2JqMi0+R2V0Rm9udFNpemUoKSAhPSBwVGV4dE9iajEtPkdldEZvbnRTaXplKCkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKyAgaW50IG5QcmVDb3VudCA9IHBUZXh0T2JqMi0+Q291bnRJdGVtcygpOworICBpbnQgbkN1ckNvdW50ID0gcFRleHRPYmoxLT5Db3VudEl0ZW1zKCk7CisgIGlmIChuUHJlQ291bnQgIT0gbkN1ckNvdW50KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgblByZUNvdW50OyBpKyspIHsKKyAgICBDUERGX1RleHRPYmplY3RJdGVtIGl0ZW1QZXIsIGl0ZW1DdXI7CisgICAgcFRleHRPYmoyLT5HZXRJdGVtSW5mbyhpLCAmaXRlbVBlcik7CisgICAgcFRleHRPYmoxLT5HZXRJdGVtSW5mbyhpLCAmaXRlbUN1cik7CisgICAgaWYgKGl0ZW1DdXIubV9DaGFyQ29kZSAhPSBpdGVtUGVyLm1fQ2hhckNvZGUpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitpbnQgR2V0Q2hhcldpZHRoKEZYX0RXT1JEIGNoYXJDb2RlLCBDUERGX0ZvbnQqIHBGb250KSB7CisgIGlmIChjaGFyQ29kZSA9PSAtMSkgeworICAgIHJldHVybiAwOworICB9CisgIGludCB3ID0gcEZvbnQtPkdldENoYXJXaWR0aEYoY2hhckNvZGUpOworICBpZiAodyA9PSAwKSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyOworICAgIHBGb250LT5BcHBlbmRDaGFyKHN0ciwgY2hhckNvZGUpOworICAgIHcgPSBwRm9udC0+R2V0U3RyaW5nV2lkdGgoc3RyLCAxKTsKKyAgICBpZiAodyA9PSAwKSB7CisgICAgICBGWF9SRUNUIEJCb3g7CisgICAgICBwRm9udC0+R2V0Q2hhckJCb3goY2hhckNvZGUsIEJCb3gpOworICAgICAgdyA9IEJCb3gucmlnaHQgLSBCQm94LmxlZnQ7CisgICAgfQorICB9CisgIHJldHVybiB3OworfQoraW50IEZQREZUZXh0X1Byb2Nlc3NJbnRlck9iaihjb25zdCBDUERGX1RleHRPYmplY3QqIHBQcmV2T2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1RleHRPYmplY3QqIHBPYmopIHsKKyAgaWYgKEZQREZUZXh0X0lzU2FtZVRleHRPYmplY3QocFByZXZPYmosIHBPYmopKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIENQREZfVGV4dE9iamVjdEl0ZW0gaXRlbTsKKyAgaW50IG5JdGVtID0gcFByZXZPYmotPkNvdW50SXRlbXMoKTsKKyAgcFByZXZPYmotPkdldEl0ZW1JbmZvKG5JdGVtIC0gMSwgJml0ZW0pOworICBGWF9XQ0hBUiBwcmVDaGFyID0gMCwgY3VyQ2hhciA9IDA7CisgIENGWF9XaWRlU3RyaW5nIHdzdHIgPQorICAgICAgcFByZXZPYmotPkdldEZvbnQoKS0+VW5pY29kZUZyb21DaGFyQ29kZShpdGVtLm1fQ2hhckNvZGUpOworICBpZiAod3N0ci5HZXRMZW5ndGgoKSkgeworICAgIHByZUNoYXIgPSB3c3RyLkdldEF0KDApOworICB9CisgIEZYX0ZMT0FUIGxhc3RfcG9zID0gaXRlbS5tX09yaWdpblg7CisgIGludCBuTGFzdFdpZHRoID0gR2V0Q2hhcldpZHRoKGl0ZW0ubV9DaGFyQ29kZSwgcFByZXZPYmotPkdldEZvbnQoKSk7CisgIEZYX0ZMT0FUIGxhc3Rfd2lkdGggPSBuTGFzdFdpZHRoICogcFByZXZPYmotPkdldEZvbnRTaXplKCkgLyAxMDAwOworICBsYXN0X3dpZHRoID0gRlhTWVNfZmFicyhsYXN0X3dpZHRoKTsKKyAgcE9iai0+R2V0SXRlbUluZm8oMCwgJml0ZW0pOworICB3c3RyID0gcE9iai0+R2V0Rm9udCgpLT5Vbmljb2RlRnJvbUNoYXJDb2RlKGl0ZW0ubV9DaGFyQ29kZSk7CisgIGlmICh3c3RyLkdldExlbmd0aCgpKSB7CisgICAgY3VyQ2hhciA9IHdzdHIuR2V0QXQoMCk7CisgIH0KKyAgaW50IG5UaGlzV2lkdGggPSBHZXRDaGFyV2lkdGgoaXRlbS5tX0NoYXJDb2RlLCBwT2JqLT5HZXRGb250KCkpOworICBGWF9GTE9BVCB0aGlzX3dpZHRoID0gblRoaXNXaWR0aCAqIHBPYmotPkdldEZvbnRTaXplKCkgLyAxMDAwOworICB0aGlzX3dpZHRoID0gRlhTWVNfZmFicyh0aGlzX3dpZHRoKTsKKyAgRlhfRkxPQVQgdGhyZXNob2xkID0KKyAgICAgIGxhc3Rfd2lkdGggPiB0aGlzX3dpZHRoID8gbGFzdF93aWR0aCAvIDQgOiB0aGlzX3dpZHRoIC8gNDsKKyAgQ0ZYX01hdHJpeCBwcmV2X21hdHJpeCwgcHJldl9yZXZlcnNlOworICBwUHJldk9iai0+R2V0VGV4dE1hdHJpeCgmcHJldl9tYXRyaXgpOworICBwcmV2X3JldmVyc2UuU2V0UmV2ZXJzZShwcmV2X21hdHJpeCk7CisgIEZYX0ZMT0FUIHggPSBwT2JqLT5HZXRQb3NYKCksIHkgPSBwT2JqLT5HZXRQb3NZKCk7CisgIHByZXZfcmV2ZXJzZS5UcmFuc2Zvcm0oeCwgeSk7CisgIGlmIChGWFNZU19mYWJzKHkpID4gdGhyZXNob2xkICogMikgeworICAgIHJldHVybiAyOworICB9CisgIHRocmVzaG9sZCA9IChGWF9GTE9BVCkobkxhc3RXaWR0aCA+IG5UaGlzV2lkdGggPyBuTGFzdFdpZHRoIDogblRoaXNXaWR0aCk7CisgIHRocmVzaG9sZCA9IHRocmVzaG9sZCA+IDQwMAorICAgICAgICAgICAgICAgICAgPyAodGhyZXNob2xkIDwgNzAwID8gdGhyZXNob2xkIC8gNCA6IHRocmVzaG9sZCAvIDUpCisgICAgICAgICAgICAgICAgICA6ICh0aHJlc2hvbGQgLyAyKTsKKyAgdGhyZXNob2xkICo9IG5MYXN0V2lkdGggPiBuVGhpc1dpZHRoID8gRlhTWVNfZmFicyhwUHJldk9iai0+R2V0Rm9udFNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhTWVNfZmFicyhwT2JqLT5HZXRGb250U2l6ZSgpKTsKKyAgdGhyZXNob2xkIC89IDEwMDA7CisgIGlmIChGWFNZU19mYWJzKGxhc3RfcG9zICsgbGFzdF93aWR0aCAtIHgpID4gdGhyZXNob2xkICYmIGN1ckNoYXIgIT0gTCcgJyAmJgorICAgICAgcHJlQ2hhciAhPSBMJyAnKQorICAgIGlmIChjdXJDaGFyICE9IEwnICcgJiYgcHJlQ2hhciAhPSBMJyAnKSB7CisgICAgICBpZiAoKHggLSBsYXN0X3BvcyAtIGxhc3Rfd2lkdGgpID4gdGhyZXNob2xkIHx8CisgICAgICAgICAgKGxhc3RfcG9zIC0geCAtIGxhc3Rfd2lkdGgpID4gdGhyZXNob2xkKSB7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgaWYgKHggPCAwICYmIChsYXN0X3BvcyAtIHggLSBsYXN0X3dpZHRoKSA+IHRocmVzaG9sZCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIGlmICgoeCAtIGxhc3RfcG9zIC0gbGFzdF93aWR0aCkgPiB0aGlzX3dpZHRoIHx8CisgICAgICAgICAgKHggLSBsYXN0X3BvcyAtIHRoaXNfd2lkdGgpID4gbGFzdF93aWR0aCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9CisgIGlmIChsYXN0X3BvcyArIGxhc3Rfd2lkdGggPiB4ICsgdGhpc193aWR0aCAmJiBjdXJDaGFyID09IEwnICcpIHsKKyAgICByZXR1cm4gMzsKKyAgfQorICByZXR1cm4gMDsKK30KK0ZYX0JPT0wgQ1BERl9UZXh0U3RyZWFtOjpQcm9jZXNzT2JqZWN0KGNvbnN0IENQREZfVGV4dE9iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpcnN0TGluZSkgeworICBDUERGX0ZvbnQqIHBGb250ID0gcE9iai0+R2V0Rm9udCgpOworICBDRlhfTWF0cml4IG1hdHJpeDsKKyAgcE9iai0+R2V0VGV4dE1hdHJpeCgmbWF0cml4KTsKKyAgaW50IGl0ZW1faW5kZXggPSAwOworICBpZiAobV9wTGFzdE9iaikgeworICAgIGludCByZXN1bHQgPSBGUERGVGV4dF9Qcm9jZXNzSW50ZXJPYmoobV9wTGFzdE9iaiwgcE9iaik7CisgICAgaWYgKHJlc3VsdCA9PSAyKSB7CisgICAgICBpbnQgbGVuID0gbV9CdWZmZXIuR2V0TGVuZ3RoKCk7CisgICAgICBpZiAobGVuICYmIG1fYlVzZUxGICYmIG1fQnVmZmVyLkdldEJ1ZmZlcigpW2xlbiAtIDFdID09IEwnLScpIHsKKyAgICAgICAgbV9CdWZmZXIuRGVsZXRlKGxlbiAtIDEsIDEpOworICAgICAgICBpZiAobV9wT2JqQXJyYXkpIHsKKyAgICAgICAgICBtX3BPYmpBcnJheS0+UmVtb3ZlQXQoKGxlbiAtIDEpICogMiwgMik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChiRmlyc3RMaW5lKSB7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fYlVzZUxGKSB7CisgICAgICAgICAgbV9CdWZmZXIuQXBwZW5kQ2hhcihMJ1xyJyk7CisgICAgICAgICAgbV9CdWZmZXIuQXBwZW5kQ2hhcihMJ1xuJyk7CisgICAgICAgICAgaWYgKG1fcE9iakFycmF5KSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgICBtX3BPYmpBcnJheS0+QWRkKE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtX0J1ZmZlci5BcHBlbmRDaGFyKCcgJyk7CisgICAgICAgICAgaWYgKG1fcE9iakFycmF5KSB7CisgICAgICAgICAgICBtX3BPYmpBcnJheS0+QWRkKE5VTEwpOworICAgICAgICAgICAgbV9wT2JqQXJyYXktPkFkZChOVUxMKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PSAxKSB7CisgICAgICBtX0J1ZmZlci5BcHBlbmRDaGFyKEwnICcpOworICAgICAgaWYgKG1fcE9iakFycmF5KSB7CisgICAgICAgIG1fcE9iakFycmF5LT5BZGQoTlVMTCk7CisgICAgICAgIG1fcE9iakFycmF5LT5BZGQoTlVMTCk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gLTEpIHsKKyAgICAgIG1fcExhc3RPYmogPSBwT2JqOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0gZWxzZSBpZiAocmVzdWx0ID09IDMpIHsKKyAgICAgIGl0ZW1faW5kZXggPSAxOworICAgIH0KKyAgfQorICBtX3BMYXN0T2JqID0gcE9iajsKKyAgaW50IG5JdGVtcyA9IHBPYmotPkNvdW50SXRlbXMoKTsKKyAgRlhfRkxPQVQgSWdub3Jla2VybmluZyA9IDA7CisgIGZvciAoaW50IGkgPSAxOyBpIDwgbkl0ZW1zIC0gMTsgaSArPSAyKSB7CisgICAgQ1BERl9UZXh0T2JqZWN0SXRlbSBpdGVtOworICAgIHBPYmotPkdldEl0ZW1JbmZvKGksICZpdGVtKTsKKyAgICBpZiAoaXRlbS5tX0NoYXJDb2RlID09IChGWF9EV09SRCktMSkgeworICAgICAgaWYgKGkgPT0gMSkgeworICAgICAgICBJZ25vcmVrZXJuaW5nID0gaXRlbS5tX09yaWdpblg7CisgICAgICB9IGVsc2UgaWYgKElnbm9yZWtlcm5pbmcgPiBpdGVtLm1fT3JpZ2luWCkgeworICAgICAgICBJZ25vcmVrZXJuaW5nID0gaXRlbS5tX09yaWdpblg7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIElnbm9yZWtlcm5pbmcgPSAwOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIEZYX0ZMT0FUIHNwYWNpbmcgPSAwOworICBmb3IgKDsgaXRlbV9pbmRleCA8IG5JdGVtczsgaXRlbV9pbmRleCsrKSB7CisgICAgQ1BERl9UZXh0T2JqZWN0SXRlbSBpdGVtOworICAgIHBPYmotPkdldEl0ZW1JbmZvKGl0ZW1faW5kZXgsICZpdGVtKTsKKyAgICBpZiAoaXRlbS5tX0NoYXJDb2RlID09IChGWF9EV09SRCktMSkgeworICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3N0ciA9IG1fQnVmZmVyLkdldFdpZGVTdHJpbmcoKTsKKyAgICAgIGlmICh3c3RyLklzRW1wdHkoKSB8fCB3c3RyLkdldEF0KHdzdHIuR2V0TGVuZ3RoKCkgLSAxKSA9PSBMJyAnKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgRlhfRkxPQVQgZm9udHNpemVfaCA9IHBPYmotPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplSCgpOworICAgICAgc3BhY2luZyA9IC1mb250c2l6ZV9oICogKGl0ZW0ubV9PcmlnaW5YIC0gSWdub3Jla2VybmluZykgLyAxMDAwOworICAgICAgY29udGludWU7CisgICAgfQorICAgIEZYX0ZMT0FUIGNoYXJTcGFjZSA9IHBPYmotPm1fVGV4dFN0YXRlLkdldE9iamVjdCgpLT5tX0NoYXJTcGFjZTsKKyAgICBpZiAobkl0ZW1zID4gMyAmJiAhc3BhY2luZykgeworICAgICAgY2hhclNwYWNlID0gMDsKKyAgICB9CisgICAgaWYgKChzcGFjaW5nIHx8IGNoYXJTcGFjZSkgJiYgaXRlbV9pbmRleCA+IDApIHsKKyAgICAgIGludCBsYXN0X3dpZHRoID0gMDsKKyAgICAgIEZYX0ZMT0FUIGZvbnRzaXplX2ggPSBwT2JqLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZUgoKTsKKyAgICAgIEZYX0RXT1JEIHNwYWNlX2NoYXJjb2RlID0gcEZvbnQtPkNoYXJDb2RlRnJvbVVuaWNvZGUoJyAnKTsKKyAgICAgIEZYX0ZMT0FUIHRocmVzaG9sZCA9IDA7CisgICAgICBpZiAoc3BhY2VfY2hhcmNvZGUgIT0gLTEpIHsKKyAgICAgICAgdGhyZXNob2xkID0gZm9udHNpemVfaCAqIHBGb250LT5HZXRDaGFyV2lkdGhGKHNwYWNlX2NoYXJjb2RlKSAvIDEwMDA7CisgICAgICB9CisgICAgICBpZiAodGhyZXNob2xkID4gZm9udHNpemVfaCAvIDMpIHsKKyAgICAgICAgdGhyZXNob2xkID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocmVzaG9sZCAvPSAyOworICAgICAgfQorICAgICAgaWYgKHRocmVzaG9sZCA9PSAwKSB7CisgICAgICAgIHRocmVzaG9sZCA9IGZvbnRzaXplX2g7CisgICAgICAgIGludCB0aGlzX3dpZHRoID0gRlhTWVNfYWJzKEdldENoYXJXaWR0aChpdGVtLm1fQ2hhckNvZGUsIHBGb250KSk7CisgICAgICAgIHRocmVzaG9sZCA9IHRoaXNfd2lkdGggPiBsYXN0X3dpZHRoID8gKEZYX0ZMT0FUKXRoaXNfd2lkdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoRlhfRkxPQVQpbGFzdF93aWR0aDsKKyAgICAgICAgaW50IG5EaXZpZGUgPSA2OworICAgICAgICBpZiAodGhyZXNob2xkIDwgMzAwKSB7CisgICAgICAgICAgbkRpdmlkZSA9IDI7CisgICAgICAgIH0gZWxzZSBpZiAodGhyZXNob2xkIDwgNTAwKSB7CisgICAgICAgICAgbkRpdmlkZSA9IDQ7CisgICAgICAgIH0gZWxzZSBpZiAodGhyZXNob2xkIDwgNzAwKSB7CisgICAgICAgICAgbkRpdmlkZSA9IDU7CisgICAgICAgIH0KKyAgICAgICAgdGhyZXNob2xkID0gdGhyZXNob2xkIC8gbkRpdmlkZTsKKyAgICAgICAgdGhyZXNob2xkID0gZm9udHNpemVfaCAqIHRocmVzaG9sZCAvIDEwMDA7CisgICAgICB9CisgICAgICBpZiAoY2hhclNwYWNlID4gMC4wMDEpIHsKKyAgICAgICAgc3BhY2luZyArPSBtYXRyaXguVHJhbnNmb3JtRGlzdGFuY2UoY2hhclNwYWNlKTsKKyAgICAgIH0gZWxzZSBpZiAoY2hhclNwYWNlIDwgLTAuMDAxKSB7CisgICAgICAgIHNwYWNpbmcgLT0gbWF0cml4LlRyYW5zZm9ybURpc3RhbmNlKEZYU1lTX2ZhYnMoY2hhclNwYWNlKSk7CisgICAgICB9CisgICAgICBpZiAodGhyZXNob2xkICYmIChzcGFjaW5nICYmIHNwYWNpbmcgPj0gdGhyZXNob2xkKSkgeworICAgICAgICBtX0J1ZmZlci5BcHBlbmRDaGFyKEwnICcpOworICAgICAgICBpZiAobV9wT2JqQXJyYXkpIHsKKyAgICAgICAgICBtX3BPYmpBcnJheS0+QWRkKE5VTEwpOworICAgICAgICAgIG1fcE9iakFycmF5LT5BZGQoTlVMTCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChpdGVtLm1fQ2hhckNvZGUgPT0gKEZYX0RXT1JEKS0xKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgc3BhY2luZyA9IDA7CisgICAgfQorICAgIENGWF9XaWRlU3RyaW5nIHVuaWNvZGVfc3RyID0gcEZvbnQtPlVuaWNvZGVGcm9tQ2hhckNvZGUoaXRlbS5tX0NoYXJDb2RlKTsKKyAgICBpZiAodW5pY29kZV9zdHIuSXNFbXB0eSgpKSB7CisgICAgICBtX0J1ZmZlci5BcHBlbmRDaGFyKChGWF9XQ0hBUilpdGVtLm1fQ2hhckNvZGUpOworICAgICAgaWYgKG1fcE9iakFycmF5KSB7CisgICAgICAgIG1fcE9iakFycmF5LT5BZGQoKHZvaWQqKXBPYmopOworICAgICAgICBtX3BPYmpBcnJheS0+QWRkKCh2b2lkKikoaW50cHRyX3QpaXRlbV9pbmRleCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG1fQnVmZmVyIDw8IHVuaWNvZGVfc3RyOworICAgICAgaWYgKG1fcE9iakFycmF5KSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pY29kZV9zdHIuR2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgIG1fcE9iakFycmF5LT5BZGQoKHZvaWQqKXBPYmopOworICAgICAgICAgIG1fcE9iakFycmF5LT5BZGQoKHZvaWQqKShpbnRwdHJfdClpdGVtX2luZGV4KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gRkFMU0U7Cit9Cit2b2lkIEdldFRleHRTdHJlYW1fVW5pY29kZShDRlhfV2lkZVRleHRCdWYmIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUGFnZU9iamVjdHMqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXNlTEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkqIHBPYmpBcnJheSkgeworICBDUERGX1RleHRTdHJlYW0gdGV4dHN0cmVhbShidWZmZXIsIGJVc2VMRiwgcE9iakFycmF5KTsKKyAgRlhfUE9TSVRJT04gcG9zID0gcFBhZ2UtPkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKTsKKyAgd2hpbGUgKHBvcykgeworICAgIENQREZfUGFnZU9iamVjdCogcE9iamVjdCA9IHBQYWdlLT5HZXROZXh0T2JqZWN0KHBvcyk7CisgICAgaWYgKHBPYmplY3QgJiYgcE9iamVjdC0+bV9UeXBlID09IFBERlBBR0VfVEVYVCkKKyAgICAgIHRleHRzdHJlYW0uUHJvY2Vzc09iamVjdCgoQ1BERl9UZXh0T2JqZWN0KilwT2JqZWN0LCBGQUxTRSk7CisgIH0KK30KK0NGWF9XaWRlU3RyaW5nIFBERl9HZXRGaXJzdFRleHRMaW5lX1VuaWNvZGUoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZSkgeworICBDRlhfV2lkZVRleHRCdWYgYnVmZmVyOworICBidWZmZXIuRXN0aW1hdGVTaXplKDAsIDEwMjQpOworICBDUERGX1BhZ2UgcGFnZTsKKyAgcGFnZS5Mb2FkKHBEb2MsIHBQYWdlKTsKKyAgQ1BERl9QYXJzZU9wdGlvbnMgb3B0aW9uczsKKyAgb3B0aW9ucy5tX2JUZXh0T25seSA9IFRSVUU7CisgIG9wdGlvbnMubV9iU2VwYXJhdGVGb3JtID0gRkFMU0U7CisgIHBhZ2UuUGFyc2VDb250ZW50KCZvcHRpb25zKTsKKyAgQ1BERl9UZXh0U3RyZWFtIHRleHRzdHJlYW0oYnVmZmVyLCBGQUxTRSwgTlVMTCk7CisgIEZYX1BPU0lUSU9OIHBvcyA9IHBhZ2UuR2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpOworICB3aGlsZSAocG9zKSB7CisgICAgQ1BERl9QYWdlT2JqZWN0KiBwT2JqZWN0ID0gcGFnZS5HZXROZXh0T2JqZWN0KHBvcyk7CisgICAgaWYgKHBPYmplY3QtPm1fVHlwZSAhPSBQREZQQUdFX1RFWFQpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAodGV4dHN0cmVhbS5Qcm9jZXNzT2JqZWN0KChDUERGX1RleHRPYmplY3QqKXBPYmplY3QsIFRSVUUpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGJ1ZmZlci5HZXRXaWRlU3RyaW5nKCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9mcGRmdGV4dC90ZXh0X2ludC5oIGIvY29yZS9zcmMvZnBkZnRleHQvdGV4dF9pbnQuaAppbmRleCAwMWQxMDIzLi5iYzNjYzViIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmdGV4dC90ZXh0X2ludC5oCisrKyBiL2NvcmUvc3JjL2ZwZGZ0ZXh0L3RleHRfaW50LmgKQEAgLTEsMjIyICsxLDI0OCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIENPUkVfU1JDX0ZQREZURVhUX1RFWFRfSU5UX0hfCiAjZGVmaW5lIENPUkVfU1JDX0ZQREZURVhUX1RFWFRfSU5UX0hfCiAKLWNsYXNzIENQREZfVGV4dFBhcnNlT3B0aW9ucyAKLXsKLXB1YmxpYzoKLSAgICBDUERGX1RleHRQYXJzZU9wdGlvbnMoKTsKLSAgICBGWF9CT09MCQkJbV9iQ2hlY2tPYmplY3RPcmRlcjsKLSAgICBGWF9CT09MCQkJbV9iQ2hlY2tEaXJlY3Rpb247Ci0gICAgaW50CQkJCW1fbkNoZWNrU2FtZU9iamVjdDsKLX07Ci1jbGFzcyBDUERGX1RleHRQYWdlOworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmdGV4dC9mcGRmX3RleHQuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKKworY2xhc3MgQ0ZYX0JpZGlDaGFyOworY2xhc3MgQ1BERl9Eb2NQcm9ncmVzc2l2ZVNlYXJjaDsKK2NsYXNzIENQREZfRm9ybU9iamVjdDsKIGNsYXNzIENQREZfTGlua0V4dHJhY3Q7CiBjbGFzcyBDUERGX1RleHRQYWdlRmluZDsKLWNsYXNzIENQREZfRG9jUHJvZ3Jlc3NpdmVTZWFyY2g7Ci0jZGVmaW5lIEZQREZURVhUX0NIQVJfRVJST1IJCQktMQotI2RlZmluZSBGUERGVEVYVF9DSEFSX05PUk1BTAkJMAotI2RlZmluZSBGUERGVEVYVF9DSEFSX0dFTkVSQVRFRAkJMQotI2RlZmluZSBGUERGVEVYVF9DSEFSX1VOVU5JQ09ERQkJMgotI2RlZmluZSBGUERGVEVYVF9DSEFSX0hZUEhFTgkJMwotI2RlZmluZSBGUERGVEVYVF9DSEFSX1BJRUNFCQkJNAotI2RlZmluZSBGUERGVEVYVF9NQ19QQVNTCQkJMAotI2RlZmluZSBGUERGVEVYVF9NQ19ET05FCQkJMQotI2RlZmluZSBGUERGVEVYVF9NQ19ERUxBWQkJCTIKKworI2RlZmluZSBGUERGVEVYVF9DSEFSX0VSUk9SIC0xCisjZGVmaW5lIEZQREZURVhUX0NIQVJfTk9STUFMIDAKKyNkZWZpbmUgRlBERlRFWFRfQ0hBUl9HRU5FUkFURUQgMQorI2RlZmluZSBGUERGVEVYVF9DSEFSX1VOVU5JQ09ERSAyCisjZGVmaW5lIEZQREZURVhUX0NIQVJfSFlQSEVOIDMKKyNkZWZpbmUgRlBERlRFWFRfQ0hBUl9QSUVDRSA0CisjZGVmaW5lIEZQREZURVhUX01DX1BBU1MgMAorI2RlZmluZSBGUERGVEVYVF9NQ19ET05FIDEKKyNkZWZpbmUgRlBERlRFWFRfTUNfREVMQVkgMgorCiB0eXBlZGVmIHN0cnVjdCBfUEFHRUNIQVJfSU5GTyB7Ci0gICAgaW50CQkJCQltX0NoYXJDb2RlOwotICAgIEZYX1dDSEFSCQkJbV9Vbmljb2RlOwotICAgIEZYX0ZMT0FUCQkJbV9PcmlnaW5YOwotICAgIEZYX0ZMT0FUCQkJbV9PcmlnaW5ZOwotICAgIEZYX0lOVDMyCQkJbV9GbGFnOwotICAgIENGWF9GbG9hdFJlY3QJCW1fQ2hhckJveDsKLSAgICBDUERGX1RleHRPYmplY3QqCW1fcFRleHRPYmo7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeAltX01hdHJpeDsKLSAgICBpbnQJCQkJCW1fSW5kZXg7CisgIGludCBtX0NoYXJDb2RlOworICBGWF9XQ0hBUiBtX1VuaWNvZGU7CisgIEZYX0ZMT0FUIG1fT3JpZ2luWDsKKyAgRlhfRkxPQVQgbV9PcmlnaW5ZOworICBpbnQzMl90IG1fRmxhZzsKKyAgQ0ZYX0Zsb2F0UmVjdCBtX0NoYXJCb3g7CisgIENQREZfVGV4dE9iamVjdCogbV9wVGV4dE9iajsKKyAgQ0ZYX01hdHJpeCBtX01hdHJpeDsKKyAgaW50IG1fSW5kZXg7CiB9IFBBR0VDSEFSX0lORk87Ci10eXBlZGVmCUNGWF9TZWdtZW50ZWRBcnJheTxQQUdFQ0hBUl9JTkZPPiBQQUdFQ0hBUl9JbmZvQXJyYXk7Cit0eXBlZGVmIENGWF9TZWdtZW50ZWRBcnJheTxQQUdFQ0hBUl9JTkZPPiBQQUdFQ0hBUl9JbmZvQXJyYXk7CiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50CW1fU3RhcnQ7Ci0gICAgaW50IG1fbkNvdW50OworICBpbnQgbV9TdGFydDsKKyAgaW50IG1fbkNvdW50OwogfSBGUERGX1NFR01FTlQ7CiB0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPEZQREZfU0VHTUVOVD4gU0VHTUVOVF9BcnJheTsKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBDUERGX1RleHRPYmplY3QqCW1fcFRleHRPYmo7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeAltX2Zvcm1NYXRyaXg7CisgIENQREZfVGV4dE9iamVjdCogbV9wVGV4dE9iajsKKyAgQ0ZYX01hdHJpeCBtX2Zvcm1NYXRyaXg7CiB9IFBERlRFWFRfT2JqOwogdHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxQREZURVhUX09iaj4gTElORU9CSjsKLWNsYXNzIENQREZfVGV4dFBhZ2U6IHB1YmxpYyBJUERGX1RleHRQYWdlCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9UZXh0UGFnZShjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBpbnQgZmxhZ3MgPSAwKTsKLSAgICBDUERGX1RleHRQYWdlKGNvbnN0IENQREZfUGFnZU9iamVjdHMqIHBQYWdlLCBpbnQgZmxhZ3MgPSAwKTsKLSAgICBDUERGX1RleHRQYWdlKGNvbnN0IENQREZfUGFnZSogcFBhZ2UsIENQREZUZXh0X1BhcnNlT3B0aW9ucyBQYXJzZXJPcHRpb25zKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJCVBhcnNlVGV4dFBhZ2UoKTsKLSAgICB2aXJ0dWFsIHZvaWQJCQkJCU5vcm1hbGl6ZU9iamVjdHMoRlhfQk9PTCBiTm9ybWFsaXplKTsKLSAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJCUlzUGFyc2VyZWQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fSXNQYXJzZXJlZDsKLSAgICB9Ci0gICAgdmlydHVhbCB+Q1BERl9UZXh0UGFnZSgpIHt9OwotcHVibGljOgotICAgIHZpcnR1YWwgaW50IENoYXJJbmRleEZyb21UZXh0SW5kZXgoaW50IFRleHRJbmRleCljb25zdCA7Ci0gICAgdmlydHVhbCBpbnQgVGV4dEluZGV4RnJvbUNoYXJJbmRleChpbnQgQ2hhckluZGV4KWNvbnN0OwotICAgIHZpcnR1YWwgaW50CQkJCQkJQ291bnRDaGFycygpIGNvbnN0OwotICAgIHZpcnR1YWwJdm9pZAkJCQkJR2V0Q2hhckluZm8oaW50IGluZGV4LCBGUERGX0NIQVJfSU5GTyAmIGluZm8pIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZAkJCQkJR2V0UmVjdEFycmF5KGludCBzdGFydCwgaW50IG5Db3VudCwgQ0ZYX1JlY3RBcnJheSYgcmVjdEFycmF5KSBjb25zdDsKLSAgICB2aXJ0dWFsIGludAkJCQkJCUdldEluZGV4QXRQb3MoQ1BERl9Qb2ludCBwb2ludCwgRlhfRkxPQVQgeFRvcmVsYW5jZSwgRlhfRkxPQVQgeVRvcmVsYW5jZSkgY29uc3Q7Ci0gICAgdmlydHVhbCBpbnQJCQkJCQlHZXRJbmRleEF0UG9zKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIHhUb3JlbGFuY2UsCi0gICAgICAgICAgICBGWF9GTE9BVCB5VG9yZWxhbmNlKSBjb25zdDsKLSAgICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCQkJR2V0VGV4dEJ5UmVjdChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQJCQkJCUdldFJlY3RzQXJyYXlCeVJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwgQ0ZYX1JlY3RBcnJheSYgcmVzUmVjdEFycmF5KSBjb25zdDsKLSAgICB2aXJ0dWFsCWludAkJCQkJCUdldE9yZGVyQnlEaXJlY3Rpb24oaW50IG9yZGVyLCBpbnQgZGlyZWN0aW9uKSBjb25zdDsKLSAgICB2aXJ0dWFsCUNGWF9XaWRlU3RyaW5nCQkJR2V0UGFnZVRleHQoaW50IHN0YXJ0ID0gMCwgaW50IG5Db3VudCA9IC0xKSBjb25zdDsKIAotICAgIHZpcnR1YWwgaW50CQkJCQkJQ291bnRSZWN0cyhpbnQgc3RhcnQsIGludCBuQ291bnQpOwotICAgIHZpcnR1YWwJdm9pZAkJCQkJR2V0UmVjdChpbnQgcmVjdEluZGV4LCBGWF9GTE9BVCYgbGVmdCwgRlhfRkxPQVQmIHRvcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIEZYX0ZMT0FUJiByaWdodCwgRlhfRkxPQVQgJmJvdHRvbSkgY29uc3Q7Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJCQlHZXRCYXNlbGluZVJvdGF0ZShpbnQgcmVjdEluZGV4LCBpbnQmIFJvdGF0ZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJCQlHZXRCYXNlbGluZVJvdGF0ZShjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0LCBpbnQmIFJvdGF0ZSk7Ci0gICAgdmlydHVhbAlpbnQJCQkJCQlDb3VudEJvdW5kZWRTZWdtZW50cyhGWF9GTE9BVCBsZWZ0LCBGWF9GTE9BVCB0b3AsCi0gICAgICAgICAgICBGWF9GTE9BVCByaWdodCwgRlhfRkxPQVQgYm90dG9tLCBGWF9CT09MIGJDb250YWlucyA9IEZBTFNFKTsKLSAgICB2aXJ0dWFsCXZvaWQJCQkJCUdldEJvdW5kZWRTZWdtZW50KGludCBpbmRleCwgaW50JiBzdGFydCwgaW50JiBjb3VudCkgY29uc3Q7Ci0gICAgdmlydHVhbCBpbnQJCQkJCQlHZXRXb3JkQnJlYWsoaW50IGluZGV4LCBpbnQgZGlyZWN0aW9uKSBjb25zdDsKLXB1YmxpYzoKLSAgICBjb25zdAlQQUdFQ0hBUl9JbmZvQXJyYXkqCQlHZXRDaGFyTGlzdCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gJm1fY2hhckxpc3Q7Ci0gICAgfQotICAgIHN0YXRpYwlGWF9CT09MCQkJCQlJc1JlY3RJbnRlcnNlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdDEsIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QyKTsKLSAgICBzdGF0aWMJRlhfQk9PTAkJCQkJSXNMZXR0ZXIoRlhfV0NIQVIgdW5pY29kZSk7Ci1wcml2YXRlOgotICAgIEZYX0JPT0wJCQkJCQkJSXNIeXBoZW4oRlhfV0NIQVIgY3VyQ2hhcik7Ci0gICAgRlhfQk9PTAkJCQkJCQlJc0NvbnRyb2xDaGFyKFBBR0VDSEFSX0lORk8qIHBDaGFySW5mbyk7Ci0gICAgRlhfQk9PTAkJCQkJCQlHZXRCYXNlbGluZVJvdGF0ZShpbnQgc3RhcnQsIGludCBlbmQsIGludCYgUm90YXRlKTsKLSAgICB2b2lkCQkJCQkJCVByb2Nlc3NPYmplY3QoKTsKLSAgICB2b2lkCQkJCQkJCVByb2Nlc3NGb3JtT2JqZWN0KENQREZfRm9ybU9iamVjdCoJcEZvcm1PYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIGZvcm1NYXRyaXgpOwotICAgIHZvaWQJCQkJCQkJUHJvY2Vzc1RleHRPYmplY3QoUERGVEVYVF9PYmogcE9iaik7Ci0gICAgdm9pZAkJCQkJCQlQcm9jZXNzVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqCXBUZXh0T2JqLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBmb3JtTWF0cml4LCBGWF9QT1NJVElPTiBPYmpQb3MpOwotICAgIGludAkJCQkJCQkJUHJvY2Vzc0luc2VydE9iamVjdChjb25zdCBDUERGX1RleHRPYmplY3QqIHBPYmosIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgmIGZvcm1NYXRyaXgpOwotICAgIEZYX0JPT0wJCQkJCQkJR2VuZXJhdGVDaGFySW5mbyhGWF9XQ0hBUiB1bmljb2RlLCBQQUdFQ0hBUl9JTkZPJiBpbmZvKTsKLSAgICBGWF9CT09MCQkJCQkJCUlzU2FtZUFzUHJlVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqLCBGWF9QT1NJVElPTiBPYmpQb3MpOwotICAgIEZYX0JPT0wJCQkJCQkJSXNTYW1lVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMSwgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iajIpOwotICAgIGludAkJCQkJCQkJR2V0Q2hhcldpZHRoKEZYX0RXT1JEIGNoYXJDb2RlLCBDUERGX0ZvbnQqIHBGb250KSBjb25zdDsKLSAgICB2b2lkCQkJCQkJCUNsb3NlVGVtcExpbmUoKTsKLSAgICB2b2lkCQkJCQkJCU9uUGllY2UoSUZYX0JpZGlDaGFyKiBwQmlkaSwgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7Ci0gICAgRlhfSU5UMzIJUHJlTWFya2VkQ29udGVudChQREZURVhUX09iaiBwT2JqKTsKLSAgICB2b2lkCQlQcm9jZXNzTWFya2VkQ29udGVudChQREZURVhUX09iaiBwT2JqKTsKLSAgICB2b2lkCQlDaGVja01hcmtlZENvbnRlbnRPYmplY3QoRlhfSU5UMzImIHN0YXJ0LCBGWF9JTlQzMiYgbkNvdW50KSBjb25zdDsKLSAgICB2b2lkCQlGaW5kUHJldmlvdXNUZXh0T2JqZWN0KHZvaWQpOwotICAgIHZvaWQJCUFkZENoYXJJbmZvQnlMUkRpcmVjdGlvbihDRlhfV2lkZVN0cmluZyYgc3RyLCBpbnQgaSk7Ci0gICAgdm9pZAkJQWRkQ2hhckluZm9CeVJMRGlyZWN0aW9uKENGWF9XaWRlU3RyaW5nJiBzdHIsIGludCBpKTsKLSAgICBGWF9JTlQzMglHZXRUZXh0T2JqZWN0V3JpdGluZ01vZGUoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaik7Ci0gICAgRlhfSU5UMzIJRmluZFRleHRsaW5lRmxvd0RpcmVjdGlvbigpOwotICAgIHZvaWQgU3dhcFRlbXBUZXh0QnVmKEZYX0lOVDMyIGlDaGFyTGlzdFN0YXJ0QXBwZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0lOVDMyIGlCdWZTdGFydEFwcGVuZCk7Ci0gICAgRlhfQk9PTCBJc1JpZ2h0VG9MZWZ0KGNvbnN0IENQREZfVGV4dE9iamVjdCogcFRleHRPYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfRm9udCogcEZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuSXRlbXMpIGNvbnN0OwotcHJvdGVjdGVkOgotICAgIENQREZUZXh0X1BhcnNlT3B0aW9ucwkJCW1fUGFyc2VPcHRpb25zOwotICAgIENGWF9Xb3JkQXJyYXkJCQkJCW1fQ2hhckluZGV4OwotICAgIGNvbnN0IENQREZfUGFnZU9iamVjdHMqCQkJbV9wUGFnZTsKLSAgICBQQUdFQ0hBUl9JbmZvQXJyYXkJCQkJbV9jaGFyTGlzdDsKLSAgICBDRlhfV2lkZVRleHRCdWYJCQkJCW1fVGV4dEJ1ZjsKLSAgICBQQUdFQ0hBUl9JbmZvQXJyYXkJCQkJbV9UZW1wQ2hhckxpc3Q7Ci0gICAgQ0ZYX1dpZGVUZXh0QnVmCQkJCQltX1RlbXBUZXh0QnVmOwotICAgIGludAkJCQkJCQkJbV9wYXJzZXJmbGFnOwotICAgIENQREZfVGV4dE9iamVjdCoJCQkJbV9wUHJlVGV4dE9iajsKLSAgICBDRlhfQWZmaW5lTWF0cml4CQkJCW1fcGVyTWF0cml4OwotICAgIEZYX0JPT0wJCQkJCQkJbV9Jc1BhcnNlcmVkOwotICAgIENGWF9BZmZpbmVNYXRyaXgJCQkJbV9EaXNwbGF5TWF0cml4OworY2xhc3MgQ1BERl9UZXh0UGFnZSA6IHB1YmxpYyBJUERGX1RleHRQYWdlIHsKKyBwdWJsaWM6CisgIENQREZfVGV4dFBhZ2UoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSwgaW50IGZsYWdzKTsKKyAgfkNQREZfVGV4dFBhZ2UoKSBvdmVycmlkZSB7fQogCi0gICAgU0VHTUVOVF9BcnJheQkJCQkJbV9TZWdtZW50OwotICAgIENGWF9SZWN0QXJyYXkJCQkJCW1fU2VsUmVjdHM7Ci0gICAgTElORU9CSgkJCQkJCQltX0xpbmVPYmo7Ci0gICAgRlhfQk9PTAkJCQkJCQltX1RleHRsaW5lRGlyOwotICAgIENGWF9GbG9hdFJlY3QJCQkJCW1fQ3VybGluZVJlY3Q7Ci19OwotY2xhc3MgQ1BERl9UZXh0UGFnZUZpbmQ6IHB1YmxpYyBJUERGX1RleHRQYWdlRmluZAotewotcHVibGljOgotICAgIENQREZfVGV4dFBhZ2VGaW5kKGNvbnN0IElQREZfVGV4dFBhZ2UqIHBUZXh0UGFnZSk7Ci0gICAgdmlydHVhbAkJCQkJCQl+Q1BERl9UZXh0UGFnZUZpbmQoKSB7fTsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJCUZpbmRGaXJzdChjb25zdCBDRlhfV2lkZVN0cmluZyYgZmluZHdoYXQsIGludCBmbGFncywgaW50IHN0YXJ0UG9zID0gMCk7Ci0gICAgdmlydHVhbAlGWF9CT09MCQkJCQlGaW5kTmV4dCgpOwotICAgIHZpcnR1YWwJRlhfQk9PTAkJCQkJRmluZFByZXYoKTsKKyAgLy8gSVBERl9UZXh0UGFnZQorICBGWF9CT09MIFBhcnNlVGV4dFBhZ2UoKSBvdmVycmlkZTsKKyAgdm9pZCBOb3JtYWxpemVPYmplY3RzKEZYX0JPT0wgYk5vcm1hbGl6ZSkgb3ZlcnJpZGU7CisgIGJvb2wgSXNQYXJzZWQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtX2JJc1BhcnNlZDsgfQorICBpbnQgQ2hhckluZGV4RnJvbVRleHRJbmRleChpbnQgVGV4dEluZGV4KSBjb25zdCBvdmVycmlkZTsKKyAgaW50IFRleHRJbmRleEZyb21DaGFySW5kZXgoaW50IENoYXJJbmRleCkgY29uc3Qgb3ZlcnJpZGU7CisgIGludCBDb3VudENoYXJzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2V0Q2hhckluZm8oaW50IGluZGV4LCBGUERGX0NIQVJfSU5GTyogaW5mbykgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2V0UmVjdEFycmF5KGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgaW50IG5Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RBcnJheSYgcmVjdEFycmF5KSBjb25zdCBvdmVycmlkZTsKKyAgaW50IEdldEluZGV4QXRQb3MoQ1BERl9Qb2ludCBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeFRvbGVyYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeVRvbGVyYW5jZSkgY29uc3Qgb3ZlcnJpZGU7CisgIGludCBHZXRJbmRleEF0UG9zKEZYX0ZMT0FUIHgsCisgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHksCisgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHhUb2xlcmFuY2UsCisgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHlUb2xlcmFuY2UpIGNvbnN0IG92ZXJyaWRlOworICBDRlhfV2lkZVN0cmluZyBHZXRUZXh0QnlSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdldFJlY3RzQXJyYXlCeVJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0QXJyYXkmIHJlc1JlY3RBcnJheSkgY29uc3Qgb3ZlcnJpZGU7CisgIENGWF9XaWRlU3RyaW5nIEdldFBhZ2VUZXh0KGludCBzdGFydCA9IDAsIGludCBuQ291bnQgPSAtMSkgY29uc3Qgb3ZlcnJpZGU7CisgIGludCBDb3VudFJlY3RzKGludCBzdGFydCwgaW50IG5Db3VudCkgb3ZlcnJpZGU7CisgIHZvaWQgR2V0UmVjdChpbnQgcmVjdEluZGV4LAorICAgICAgICAgICAgICAgRlhfRkxPQVQmIGxlZnQsCisgICAgICAgICAgICAgICBGWF9GTE9BVCYgdG9wLAorICAgICAgICAgICAgICAgRlhfRkxPQVQmIHJpZ2h0LAorICAgICAgICAgICAgICAgRlhfRkxPQVQmIGJvdHRvbSkgY29uc3Qgb3ZlcnJpZGU7CisgIEZYX0JPT0wgR2V0QmFzZWxpbmVSb3RhdGUoaW50IHJlY3RJbmRleCwgaW50JiBSb3RhdGUpIG92ZXJyaWRlOworICBGWF9CT09MIEdldEJhc2VsaW5lUm90YXRlKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QsIGludCYgUm90YXRlKSBvdmVycmlkZTsKKyAgaW50IENvdW50Qm91bmRlZFNlZ21lbnRzKEZYX0ZMT0FUIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNvbnRhaW5zID0gRkFMU0UpIG92ZXJyaWRlOworICB2b2lkIEdldEJvdW5kZWRTZWdtZW50KGludCBpbmRleCwgaW50JiBzdGFydCwgaW50JiBjb3VudCkgY29uc3Qgb3ZlcnJpZGU7CisgIGludCBHZXRXb3JkQnJlYWsoaW50IGluZGV4LCBpbnQgZGlyZWN0aW9uKSBjb25zdCBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgdm9pZAkJCQkJR2V0UmVjdEFycmF5KENGWF9SZWN0QXJyYXkmIHJlY3RzKSBjb25zdDsKLSAgICB2aXJ0dWFsIGludAkJCQkJCUdldEN1ck9yZGVyKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBpbnQJCQkJCQlHZXRNYXRjaGVkQ291bnQoKWNvbnN0OwotcHJvdGVjdGVkOgotICAgIHZvaWQJCQkJCQkJRXh0cmFjdEZpbmRXaGF0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmaW5kd2hhdCk7Ci0gICAgRlhfQk9PTAkJCQkJCQlJc01hdGNoV2hvbGVXb3JkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc1BhZ2VUZXh0LCBpbnQgc3RhcnRQb3MsIGludCBlbmRQb3MpOwotICAgIEZYX0JPT0wJCQkJCQkJRXh0cmFjdFN1YlN0cmluZyhDRlhfV2lkZVN0cmluZyYgclN0cmluZywgRlhfTFBDV1NUUiBscHN6RnVsbFN0cmluZywKLSAgICAgICAgICAgIGludCBpU3ViU3RyaW5nLCBGWF9XQ0hBUiBjaFNlcCk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcJCQkJCU1ha2VSZXZlcnNlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpOwotICAgIGludAkJCQkJCQkJUmV2ZXJzZUZpbmQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzUGFnZVRleHQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc1dvcmQsIGludCBuU3RhcnRQb3MsIGludCYgV29yZExlbmd0aCk7Ci0gICAgaW50CQkJCQkJCQlHZXRDaGFySW5kZXgoaW50IGluZGV4KSBjb25zdDsKLXByaXZhdGU6Ci0gICAgQ0ZYX1dvcmRBcnJheQkJCQkJbV9DaGFySW5kZXg7Ci0gICAgY29uc3QgSVBERl9UZXh0UGFnZSoJCQltX3BUZXh0UGFnZTsKLSAgICBDRlhfV2lkZVN0cmluZwkJCQkJbV9zdHJUZXh0OwotICAgIENGWF9XaWRlU3RyaW5nCQkJCQltX2ZpbmRXaGF0OwotICAgIGludAkJCQkJCQkJbV9mbGFnczsKLSAgICBDRlhfV2lkZVN0cmluZ0FycmF5CQkJCW1fY3NGaW5kV2hhdEFycmF5OwotICAgIGludAkJCQkJCQkJbV9maW5kTmV4dFN0YXJ0OwotICAgIGludAkJCQkJCQkJbV9maW5kUHJlU3RhcnQ7Ci0gICAgRlhfQk9PTAkJCQkJCQltX2JNYXRjaENhc2U7Ci0gICAgRlhfQk9PTAkJCQkJCQltX2JNYXRjaFdob2xlV29yZDsKLSAgICBpbnQJCQkJCQkJCW1fcmVzU3RhcnQ7Ci0gICAgaW50CQkJCQkJCQltX3Jlc0VuZDsKLSAgICBDRlhfUmVjdEFycmF5CQkJCQltX3Jlc0FycmF5OwotICAgIEZYX0JPT0wJCQkJCQkJbV9Jc0ZpbmQ7CisgIGNvbnN0IFBBR0VDSEFSX0luZm9BcnJheSogR2V0Q2hhckxpc3QoKSBjb25zdCB7IHJldHVybiAmbV9jaGFyTGlzdDsgfQorICBzdGF0aWMgRlhfQk9PTCBJc1JlY3RJbnRlcnNlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0Mik7CisgIHN0YXRpYyBGWF9CT09MIElzTGV0dGVyKEZYX1dDSEFSIHVuaWNvZGUpOworCisgcHJpdmF0ZToKKyAgRlhfQk9PTCBJc0h5cGhlbihGWF9XQ0hBUiBjdXJDaGFyKTsKKyAgYm9vbCBJc0NvbnRyb2xDaGFyKGNvbnN0IFBBR0VDSEFSX0lORk8mIGNoYXJJbmZvKTsKKyAgRlhfQk9PTCBHZXRCYXNlbGluZVJvdGF0ZShpbnQgc3RhcnQsIGludCBlbmQsIGludCYgUm90YXRlKTsKKyAgdm9pZCBQcm9jZXNzT2JqZWN0KCk7CisgIHZvaWQgUHJvY2Vzc0Zvcm1PYmplY3QoQ1BERl9Gb3JtT2JqZWN0KiBwRm9ybU9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBmb3JtTWF0cml4KTsKKyAgdm9pZCBQcm9jZXNzVGV4dE9iamVjdChQREZURVhUX09iaiBwT2JqKTsKKyAgdm9pZCBQcm9jZXNzVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIGZvcm1NYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfUE9TSVRJT04gT2JqUG9zKTsKKyAgaW50IFByb2Nlc3NJbnNlcnRPYmplY3QoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBmb3JtTWF0cml4KTsKKyAgRlhfQk9PTCBHZW5lcmF0ZUNoYXJJbmZvKEZYX1dDSEFSIHVuaWNvZGUsIFBBR0VDSEFSX0lORk8mIGluZm8pOworICBGWF9CT09MIElzU2FtZUFzUHJlVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqLCBGWF9QT1NJVElPTiBPYmpQb3MpOworICBGWF9CT09MIElzU2FtZVRleHRPYmplY3QoQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iajEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMik7CisgIGludCBHZXRDaGFyV2lkdGgoRlhfRFdPUkQgY2hhckNvZGUsIENQREZfRm9udCogcEZvbnQpIGNvbnN0OworICB2b2lkIENsb3NlVGVtcExpbmUoKTsKKyAgdm9pZCBPblBpZWNlKENGWF9CaWRpQ2hhciogcEJpZGksIENGWF9XaWRlU3RyaW5nJiBzdHIpOworICBpbnQzMl90IFByZU1hcmtlZENvbnRlbnQoUERGVEVYVF9PYmogcE9iaik7CisgIHZvaWQgUHJvY2Vzc01hcmtlZENvbnRlbnQoUERGVEVYVF9PYmogcE9iaik7CisgIHZvaWQgQ2hlY2tNYXJrZWRDb250ZW50T2JqZWN0KGludDMyX3QmIHN0YXJ0LCBpbnQzMl90JiBuQ291bnQpIGNvbnN0OworICB2b2lkIEZpbmRQcmV2aW91c1RleHRPYmplY3Qodm9pZCk7CisgIHZvaWQgQWRkQ2hhckluZm9CeUxSRGlyZWN0aW9uKENGWF9XaWRlU3RyaW5nJiBzdHIsIGludCBpKTsKKyAgdm9pZCBBZGRDaGFySW5mb0J5UkxEaXJlY3Rpb24oQ0ZYX1dpZGVTdHJpbmcmIHN0ciwgaW50IGkpOworICBpbnQzMl90IEdldFRleHRPYmplY3RXcml0aW5nTW9kZShjb25zdCBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqKTsKKyAgaW50MzJfdCBGaW5kVGV4dGxpbmVGbG93RGlyZWN0aW9uKCk7CisKKyAgdm9pZCBTd2FwVGVtcFRleHRCdWYoaW50MzJfdCBpQ2hhckxpc3RTdGFydEFwcGVuZCwgaW50MzJfdCBpQnVmU3RhcnRBcHBlbmQpOworICBGWF9CT09MIElzUmlnaHRUb0xlZnQoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkl0ZW1zKSBjb25zdDsKKworICBDUERGVGV4dF9QYXJzZU9wdGlvbnMgbV9QYXJzZU9wdGlvbnM7CisgIENGWF9Xb3JkQXJyYXkgbV9DaGFySW5kZXg7CisgIGNvbnN0IENQREZfUGFnZU9iamVjdHMqIGNvbnN0IG1fcFBhZ2U7CisgIFBBR0VDSEFSX0luZm9BcnJheSBtX2NoYXJMaXN0OworICBDRlhfV2lkZVRleHRCdWYgbV9UZXh0QnVmOworICBQQUdFQ0hBUl9JbmZvQXJyYXkgbV9UZW1wQ2hhckxpc3Q7CisgIENGWF9XaWRlVGV4dEJ1ZiBtX1RlbXBUZXh0QnVmOworICBjb25zdCBpbnQgbV9wYXJzZXJmbGFnOworICBDUERGX1RleHRPYmplY3QqIG1fcFByZVRleHRPYmo7CisgIENGWF9NYXRyaXggbV9wZXJNYXRyaXg7CisgIGJvb2wgbV9iSXNQYXJzZWQ7CisgIENGWF9NYXRyaXggbV9EaXNwbGF5TWF0cml4OworICBTRUdNRU5UX0FycmF5IG1fU2VnbWVudDsKKyAgQ0ZYX1JlY3RBcnJheSBtX1NlbFJlY3RzOworICBMSU5FT0JKIG1fTGluZU9iajsKKyAgaW50MzJfdCBtX1RleHRsaW5lRGlyOworICBDRlhfRmxvYXRSZWN0IG1fQ3VybGluZVJlY3Q7CiB9OwotY2xhc3MgQ1BERl9MaW5rRXh0Ci17Ci1wdWJsaWM6Ci0gICAgQ1BERl9MaW5rRXh0KCkge307Ci0gICAgaW50CQkJCQkJCQltX1N0YXJ0OwotICAgIGludAkJCQkJCQkJbV9Db3VudDsKLSAgICBDRlhfV2lkZVN0cmluZwkJCQkJbV9zdHJVcmw7Ci0gICAgdmlydHVhbAkJCQkJCQl+Q1BERl9MaW5rRXh0KCkge307CisKK2NsYXNzIENQREZfVGV4dFBhZ2VGaW5kIDogcHVibGljIElQREZfVGV4dFBhZ2VGaW5kIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENQREZfVGV4dFBhZ2VGaW5kKGNvbnN0IElQREZfVGV4dFBhZ2UqIHBUZXh0UGFnZSk7CisgIH5DUERGX1RleHRQYWdlRmluZCgpIG92ZXJyaWRlIHt9CisKKyAgLy8gSVBERl9UZXh0UGFnZUZpbmQKKyAgRlhfQk9PTCBGaW5kRmlyc3QoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZpbmR3aGF0LAorICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIGludCBzdGFydFBvcyA9IDApIG92ZXJyaWRlOworICBGWF9CT09MIEZpbmROZXh0KCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgRmluZFByZXYoKSBvdmVycmlkZTsKKyAgdm9pZCBHZXRSZWN0QXJyYXkoQ0ZYX1JlY3RBcnJheSYgcmVjdHMpIGNvbnN0IG92ZXJyaWRlOworICBpbnQgR2V0Q3VyT3JkZXIoKSBjb25zdCBvdmVycmlkZTsKKyAgaW50IEdldE1hdGNoZWRDb3VudCgpIGNvbnN0IG92ZXJyaWRlOworCisgcHJvdGVjdGVkOgorICB2b2lkIEV4dHJhY3RGaW5kV2hhdChjb25zdCBDRlhfV2lkZVN0cmluZyYgZmluZHdoYXQpOworICBGWF9CT09MIElzTWF0Y2hXaG9sZVdvcmQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzUGFnZVRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5kUG9zKTsKKyAgRlhfQk9PTCBFeHRyYWN0U3ViU3RyaW5nKENGWF9XaWRlU3RyaW5nJiByU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIGxwc3pGdWxsU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlTdWJTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiBjaFNlcCk7CisgIENGWF9XaWRlU3RyaW5nIE1ha2VSZXZlcnNlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpOworICBpbnQgUmV2ZXJzZUZpbmQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzUGFnZVRleHQsCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NXb3JkLAorICAgICAgICAgICAgICAgICAgaW50IG5TdGFydFBvcywKKyAgICAgICAgICAgICAgICAgIGludCYgV29yZExlbmd0aCk7CisgIGludCBHZXRDaGFySW5kZXgoaW50IGluZGV4KSBjb25zdDsKKworIHByaXZhdGU6CisgIENGWF9Xb3JkQXJyYXkgbV9DaGFySW5kZXg7CisgIGNvbnN0IElQREZfVGV4dFBhZ2UqIG1fcFRleHRQYWdlOworICBDRlhfV2lkZVN0cmluZyBtX3N0clRleHQ7CisgIENGWF9XaWRlU3RyaW5nIG1fZmluZFdoYXQ7CisgIGludCBtX2ZsYWdzOworICBDRlhfV2lkZVN0cmluZ0FycmF5IG1fY3NGaW5kV2hhdEFycmF5OworICBpbnQgbV9maW5kTmV4dFN0YXJ0OworICBpbnQgbV9maW5kUHJlU3RhcnQ7CisgIEZYX0JPT0wgbV9iTWF0Y2hDYXNlOworICBGWF9CT09MIG1fYk1hdGNoV2hvbGVXb3JkOworICBpbnQgbV9yZXNTdGFydDsKKyAgaW50IG1fcmVzRW5kOworICBDRlhfUmVjdEFycmF5IG1fcmVzQXJyYXk7CisgIEZYX0JPT0wgbV9Jc0ZpbmQ7CiB9OworCitjbGFzcyBDUERGX0xpbmtFeHQgeworIHB1YmxpYzoKKyAgQ1BERl9MaW5rRXh0KCkge30KKyAgaW50IG1fU3RhcnQ7CisgIGludCBtX0NvdW50OworICBDRlhfV2lkZVN0cmluZyBtX3N0clVybDsKKyAgdmlydHVhbCB+Q1BERl9MaW5rRXh0KCkge30KK307CisKIHR5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9MaW5rRXh0Kj4gTElOS19JbmZvQXJyYXk7Ci1jbGFzcyBDUERGX0xpbmtFeHRyYWN0OiBwdWJsaWMgSVBERl9MaW5rRXh0cmFjdAotewotcHVibGljOgotICAgIENQREZfTGlua0V4dHJhY3QoKTsKLSAgICB2aXJ0dWFsCQkJCQkJCX5DUERGX0xpbmtFeHRyYWN0KCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJCQlFeHRyYWN0TGlua3MoY29uc3QgSVBERl9UZXh0UGFnZSogcFRleHRQYWdlKTsKLSAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJCUlzRXh0cmFjdCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9Jc1BhcnNlcmQ7Ci0gICAgfQotcHVibGljOgotICAgIHZpcnR1YWwgaW50CQkJCQkJQ291bnRMaW5rcygpIGNvbnN0OwotICAgIHZpcnR1YWwJQ0ZYX1dpZGVTdHJpbmcJCQlHZXRVUkwoaW50IGluZGV4KSBjb25zdDsKLSAgICB2aXJ0dWFsCXZvaWQJCQkJCUdldEJvdW5kZWRTZWdtZW50KGludCBpbmRleCwgaW50JiBzdGFydCwgaW50JiBjb3VudCkgY29uc3Q7Ci0gICAgdmlydHVhbAl2b2lkCQkJCQlHZXRSZWN0cyhpbnQgaW5kZXgsIENGWF9SZWN0QXJyYXkmIHJlY3RzKWNvbnN0OwotcHJvdGVjdGVkOgotICAgIHZvaWQJCQkJCQkJcGFyc2VyTGluaygpOwotICAgIHZvaWQJCQkJCQkJRGVsZXRlTGlua0xpc3QoKTsKLSAgICBGWF9CT09MCQkJCQkJCUNoZWNrV2ViTGluayhDRlhfV2lkZVN0cmluZyYgc3RyQmVDaGVjayk7Ci0gICAgRlhfQk9PTAkJCQkJCQlDaGVja01haWxMaW5rKENGWF9XaWRlU3RyaW5nJiBzdHIpOwotICAgIEZYX0JPT0wJCQkJCQkJQXBwZW5kVG9MaW5rTGlzdChpbnQgc3RhcnQsIGludCBjb3VudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0clVybCk7Ci1wcml2YXRlOgotICAgIExJTktfSW5mb0FycmF5CQkJCQltX0xpbmtMaXN0OwotICAgIGNvbnN0IENQREZfVGV4dFBhZ2UqCQkJbV9wVGV4dFBhZ2U7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcJCQkJCW1fc3RyUGFnZVRleHQ7Ci0gICAgRlhfQk9PTAkJCQkJCQltX0lzUGFyc2VyZDsKKworY2xhc3MgQ1BERl9MaW5rRXh0cmFjdCA6IHB1YmxpYyBJUERGX0xpbmtFeHRyYWN0IHsKKyBwdWJsaWM6CisgIENQREZfTGlua0V4dHJhY3QoKTsKKyAgfkNQREZfTGlua0V4dHJhY3QoKSBvdmVycmlkZTsKKworICAvLyBJUERGX0xpbmtFeHRyYWN0CisgIEZYX0JPT0wgRXh0cmFjdExpbmtzKGNvbnN0IElQREZfVGV4dFBhZ2UqIHBUZXh0UGFnZSkgb3ZlcnJpZGU7CisgIGludCBDb3VudExpbmtzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIENGWF9XaWRlU3RyaW5nIEdldFVSTChpbnQgaW5kZXgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdldEJvdW5kZWRTZWdtZW50KGludCBpbmRleCwgaW50JiBzdGFydCwgaW50JiBjb3VudCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgR2V0UmVjdHMoaW50IGluZGV4LCBDRlhfUmVjdEFycmF5JiByZWN0cykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgRlhfQk9PTCBJc0V4dHJhY3QoKSBjb25zdCB7IHJldHVybiBtX2JJc1BhcnNlZDsgfQorCisgcHJvdGVjdGVkOgorICB2b2lkIFBhcnNlTGluaygpOworICB2b2lkIERlbGV0ZUxpbmtMaXN0KCk7CisgIEZYX0JPT0wgQ2hlY2tXZWJMaW5rKENGWF9XaWRlU3RyaW5nJiBzdHJCZUNoZWNrKTsKKyAgYm9vbCBDaGVja01haWxMaW5rKENGWF9XaWRlU3RyaW5nJiBzdHIpOworICB2b2lkIEFwcGVuZFRvTGlua0xpc3QoaW50IHN0YXJ0LCBpbnQgY291bnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJVcmwpOworCisgcHJpdmF0ZToKKyAgTElOS19JbmZvQXJyYXkgbV9MaW5rTGlzdDsKKyAgY29uc3QgQ1BERl9UZXh0UGFnZSogbV9wVGV4dFBhZ2U7CisgIENGWF9XaWRlU3RyaW5nIG1fc3RyUGFnZVRleHQ7CisgIGJvb2wgbV9iSXNQYXJzZWQ7CiB9OwotRlhfU1RSU0laRSBGWF9Vbmljb2RlX0dldE5vcm1hbGl6YXRpb24oRlhfV0NIQVIgd2NoLCBGWF9MUFdTVFIgcERzdCk7CisKK0ZYX1NUUlNJWkUgRlhfVW5pY29kZV9HZXROb3JtYWxpemF0aW9uKEZYX1dDSEFSIHdjaCwgRlhfV0NIQVIqIHBEc3QpOwogdm9pZCBOb3JtYWxpemVTdHJpbmcoQ0ZYX1dpZGVTdHJpbmcmIHN0cik7CiB2b2lkIE5vcm1hbGl6ZUNvbXBvc2l0ZUNoYXIoRlhfV0NIQVIgd0NoYXIsIENGWF9XaWRlU3RyaW5nJiBzRGVzdCk7Cit2b2lkIEdldFRleHRTdHJlYW1fVW5pY29kZShDRlhfV2lkZVRleHRCdWYmIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUGFnZU9iamVjdHMqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXNlTEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkqIHBPYmpBcnJheSk7CiAKICNlbmRpZiAgLy8gQ09SRV9TUkNfRlBERlRFWFRfVEVYVF9JTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L3R4dHByb2MuaCBiL2NvcmUvc3JjL2ZwZGZ0ZXh0L3R4dHByb2MuaAppbmRleCBlMWU2YmY3Li4yN2NlYzVkIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9mcGRmdGV4dC90eHRwcm9jLmgKKysrIGIvY29yZS9zcmMvZnBkZnRleHQvdHh0cHJvYy5oCkBAIC0xLDcyICsxLDg0IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgQ09SRV9TUkNfRlBERlRFWFRfVFhUUFJPQ19IXwogI2RlZmluZSBDT1JFX1NSQ19GUERGVEVYVF9UWFRQUk9DX0hfCiAKLWNsYXNzIENUZXh0Q29sdW1uIAotewotcHVibGljOgotICAgIEZYX0ZMT0FUCW1fQXZnUG9zOwotICAgIGludAkJbV9Db3VudDsKLSAgICBpbnQJCW1fVGV4dFBvczsKK2NsYXNzIENUZXh0Q29sdW1uIHsKKyBwdWJsaWM6CisgIEZYX0ZMT0FUIG1fQXZnUG9zOworICBpbnQgbV9Db3VudDsKKyAgaW50IG1fVGV4dFBvczsKIH07Ci1jbGFzcyBDVGV4dEJveCAKLXsKLXB1YmxpYzoKLSAgICBDRlhfV2lkZVN0cmluZwltX1RleHQ7Ci0gICAgRlhfRkxPQVQJbV9MZWZ0OwotICAgIEZYX0ZMT0FUCW1fUmlnaHQ7Ci0gICAgRlhfRkxPQVQJbV9TcGFjZVdpZHRoOwotICAgIEZYX0ZMT0FUCW1fVG9wOwotICAgIEZYX0ZMT0FUCW1fQm90dG9tOwotICAgIEZYX0ZMT0FUCW1fRm9udFNpemVWOwotICAgIENUZXh0Q29sdW1uKiBtX3BDb2x1bW47CitjbGFzcyBDVGV4dEJveCB7CisgcHVibGljOgorICBDRlhfV2lkZVN0cmluZyBtX1RleHQ7CisgIEZYX0ZMT0FUIG1fTGVmdDsKKyAgRlhfRkxPQVQgbV9SaWdodDsKKyAgRlhfRkxPQVQgbV9TcGFjZVdpZHRoOworICBGWF9GTE9BVCBtX1RvcDsKKyAgRlhfRkxPQVQgbV9Cb3R0b207CisgIEZYX0ZMT0FUIG1fRm9udFNpemVWOworICBDVGV4dENvbHVtbiogbV9wQ29sdW1uOwogfTsKLWNsYXNzIENUZXh0QmFzZUxpbmUgCi17Ci1wdWJsaWM6Ci0gICAgQ1RleHRCYXNlTGluZSgpOwotICAgIH5DVGV4dEJhc2VMaW5lKCk7Ci0gICAgdm9pZAlJbnNlcnRUZXh0Qm94KEZYX0ZMT0FUIGxlZnR4LCBGWF9GTE9BVCByaWdodHgsIEZYX0ZMT0FUIHRvcHksIEZYX0ZMT0FUIGJvdHRvbXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHNwYWNldywgRlhfRkxPQVQgZm9udHNpemVfdiwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7Ci0gICAgRlhfQk9PTAlHZXRXaWR0aChGWF9GTE9BVCYgbGVmdHgsIEZYX0ZMT0FUJiByaWdodHgpOwotICAgIEZYX0JPT0wJQ2FuTWVyZ2UoQ1RleHRCYXNlTGluZSogcE90aGVyKTsKLSAgICB2b2lkCU1lcmdlKENUZXh0QmFzZUxpbmUqIHBPdGhlcik7Ci0gICAgdm9pZAlNZXJnZUJveGVzKCk7Ci0gICAgdm9pZAlDb3VudENoYXJzKGludCYgY291bnQsIEZYX0ZMT0FUJiB3aWR0aCwgaW50JiBtaW5jaGFycyk7Ci0gICAgdm9pZAlXcml0ZU91dHB1dChDRlhfV2lkZVN0cmluZyYgc3RyLCBGWF9GTE9BVCBsZWZ0eCwgRlhfRkxPQVQgd2lkdGgsIGludCBpV2lkdGgpOwotICAgIEZYX0ZMT0FUCW1fQmFzZUxpbmU7Ci0gICAgRlhfRkxPQVQJbV9Ub3A7Ci0gICAgRlhfRkxPQVQJbV9Cb3R0b207Ci0gICAgRlhfRkxPQVQJbV9NYXhGb250U2l6ZVY7Ci0gICAgQ0ZYX1B0ckFycmF5CQltX1RleHRMaXN0OworY2xhc3MgQ1RleHRCYXNlTGluZSB7CisgcHVibGljOgorICBDVGV4dEJhc2VMaW5lKCk7CisgIH5DVGV4dEJhc2VMaW5lKCk7CisgIHZvaWQgSW5zZXJ0VGV4dEJveChGWF9GTE9BVCBsZWZ0eCwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHJpZ2h0eCwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRvcHksCisgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBib3R0b215LAorICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3BhY2V3LAorICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udHNpemVfdiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpOworICBGWF9CT09MIEdldFdpZHRoKEZYX0ZMT0FUJiBsZWZ0eCwgRlhfRkxPQVQmIHJpZ2h0eCk7CisgIEZYX0JPT0wgQ2FuTWVyZ2UoQ1RleHRCYXNlTGluZSogcE90aGVyKTsKKyAgdm9pZCBNZXJnZShDVGV4dEJhc2VMaW5lKiBwT3RoZXIpOworICB2b2lkIE1lcmdlQm94ZXMoKTsKKyAgdm9pZCBDb3VudENoYXJzKGludCYgY291bnQsIEZYX0ZMT0FUJiB3aWR0aCwgaW50JiBtaW5jaGFycyk7CisgIHZvaWQgV3JpdGVPdXRwdXQoQ0ZYX1dpZGVTdHJpbmcmIHN0ciwKKyAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBsZWZ0eCwKKyAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICBpbnQgaVdpZHRoKTsKKyAgRlhfRkxPQVQgbV9CYXNlTGluZTsKKyAgRlhfRkxPQVQgbV9Ub3A7CisgIEZYX0ZMT0FUIG1fQm90dG9tOworICBGWF9GTE9BVCBtX01heEZvbnRTaXplVjsKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1RleHRCb3gqPiBtX1RleHRMaXN0OwogfTsKIGNsYXNzIENQREZfUGFnZU9iamVjdDsKIGNsYXNzIENQREZfVGV4dE9iamVjdDsKLWNsYXNzIENUZXh0UGFnZSAKLXsKLXB1YmxpYzoKLSAgICBDVGV4dFBhZ2UoKTsKLSAgICB+Q1RleHRQYWdlKCk7Ci0gICAgdm9pZAlQcm9jZXNzT2JqZWN0KENQREZfUGFnZU9iamVjdCogcE9iaik7Ci0gICAgQ1RleHRCYXNlTGluZSogSW5zZXJ0VGV4dEJveChDVGV4dEJhc2VMaW5lKiBwQmFzZUxpbmUsIEZYX0ZMT0FUIGJhc2V5LCBGWF9GTE9BVCBsZWZ0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHJpZ2h0eCwgRlhfRkxPQVQgdG9weSwgRlhfRkxPQVQgYm90dG9teSwgRlhfRkxPQVQgc3BhY2V3LCBGWF9GTE9BVCBmb250c2l6ZV92LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0ciwgQ1BERl9Gb250KiBwRm9udCk7Ci0gICAgdm9pZAlXcml0ZU91dHB1dChDRlhfV2lkZVN0cmluZ0FycmF5JiBsaW5lcywgaW50IGlNaW5XaWR0aCk7Ci0gICAgRlhfQk9PTAltX2JBdXRvV2lkdGg7Ci0gICAgRlhfQk9PTAltX2JLZWVwQ29sdW1uOwotICAgIEZYX0JPT0wJbV9iQnJlYWtTcGFjZTsKLSAgICBGWF9CT09MCW1fYk9DUjsKLXByaXZhdGU6Ci0gICAgQ0ZYX1B0ckFycmF5CW1fQmFzZUxpbmVzOwotICAgIENGWF9QdHJBcnJheQltX1RleHRDb2x1bW5zOwotICAgIHZvaWQJRmluZENvbHVtbnMoKTsKLSAgICBDVGV4dENvbHVtbioJRmluZENvbHVtbihGWF9GTE9BVCB4cG9zKTsKLSAgICB2b2lkCUJyZWFrU3BhY2UoQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaik7CitjbGFzcyBDVGV4dFBhZ2UgeworIHB1YmxpYzoKKyAgQ1RleHRQYWdlKCk7CisgIH5DVGV4dFBhZ2UoKTsKKyAgdm9pZCBQcm9jZXNzT2JqZWN0KENQREZfUGFnZU9iamVjdCogcE9iaik7CisgIENUZXh0QmFzZUxpbmUqIEluc2VydFRleHRCb3goQ1RleHRCYXNlTGluZSogcEJhc2VMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJhc2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGxlZnR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHJpZ2h0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB0b3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJvdHRvbXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3BhY2V3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRzaXplX3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqIHBGb250KTsKKyAgdm9pZCBXcml0ZU91dHB1dChDRlhfV2lkZVN0cmluZ0FycmF5JiBsaW5lcywgaW50IGlNaW5XaWR0aCk7CisgIEZYX0JPT0wgbV9iQXV0b1dpZHRoOworICBGWF9CT09MIG1fYktlZXBDb2x1bW47CisgIEZYX0JPT0wgbV9iQnJlYWtTcGFjZTsKKworIHByaXZhdGU6CisgIHZvaWQgRmluZENvbHVtbnMoKTsKKyAgQ1RleHRDb2x1bW4qIEZpbmRDb2x1bW4oRlhfRkxPQVQgeHBvcyk7CisgIHZvaWQgQnJlYWtTcGFjZShDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqKTsKKworICBDRlhfQXJyYXlUZW1wbGF0ZTxDVGV4dEJhc2VMaW5lKj4gbV9CYXNlTGluZXM7CisgIENGWF9BcnJheVRlbXBsYXRlPENUZXh0Q29sdW1uKj4gbV9UZXh0Q29sdW1uczsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9TUkNfRlBERlRFWFRfVFhUUFJPQ19IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnBkZnRleHQvdW5pY29kZW5vcm1hbGl6YXRpb24uY3BwIGIvY29yZS9zcmMvZnBkZnRleHQvdW5pY29kZW5vcm1hbGl6YXRpb24uY3BwCmluZGV4IGFkMmYzZjYuLmI1NmZlMDAgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L3VuaWNvZGVub3JtYWxpemF0aW9uLmNwcAorKysgYi9jb3JlL3NyYy9mcGRmdGV4dC91bmljb2Rlbm9ybWFsaXphdGlvbi5jcHAKQEAgLTQsNzIgKzQsNjggQEAKIAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnBkZnRleHQvZnBkZl90ZXh0LmgiCi1leHRlcm4gY29uc3QgRlhfV0NIQVIgZ19Vbmljb2RlRGF0YV9Ob3JtYWxpemF0aW9uW107Ci1leHRlcm4gY29uc3QgRlhfV0NIQVIgZ19Vbmljb2RlRGF0YV9Ob3JtYWxpemF0aW9uX01hcDFbXTsKLWV4dGVybiBjb25zdCBGWF9XQ0hBUiBnX1VuaWNvZGVEYXRhX05vcm1hbGl6YXRpb25fTWFwMltdOwotZXh0ZXJuIGNvbnN0IEZYX1dDSEFSIGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvbl9NYXAzW107Ci1leHRlcm4gY29uc3QgRlhfV0NIQVIgZ19Vbmljb2RlRGF0YV9Ob3JtYWxpemF0aW9uX01hcDRbXTsKLUZYX0xQQ1dTVFIgZ19Vbmljb2RlRGF0YV9Ob3JtYWxpemF0aW9uX01hcHNbNV0gPSB7Ci0gICAgTlVMTCwKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAidW5pY29kZW5vcm1hbGl6YXRpb25kYXRhLmgiCisKK2NvbnN0IEZYX1dDSEFSKiBjb25zdCBnX1VuaWNvZGVEYXRhX05vcm1hbGl6YXRpb25fTWFwc1s1XSA9IHsKKyAgICBudWxscHRyLAogICAgIGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvbl9NYXAxLAogICAgIGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvbl9NYXAyLAogICAgIGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvbl9NYXAzLAotICAgIGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvbl9NYXA0Ci19OwotRlhfU1RSU0laRSBGWF9Vbmljb2RlX0dldE5vcm1hbGl6YXRpb24oRlhfV0NIQVIgd2NoLCBGWF9MUFdTVFIgcERzdCkKLXsKLSAgICB3Y2ggPSB3Y2ggJiAweEZGRkY7Ci0gICAgRlhfV0NIQVIgd0ZpbmQgPSBnX1VuaWNvZGVEYXRhX05vcm1hbGl6YXRpb25bd2NoXTsKLSAgICBpZiAoIXdGaW5kKSB7Ci0gICAgICAgIGlmIChwRHN0KSB7Ci0gICAgICAgICAgICAqcERzdCA9IHdjaDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaWYod0ZpbmQgPj0gMHg4MDAwKSB7Ci0gICAgICAgIHdjaCA9IHdGaW5kIC0gMHg4MDAwOwotICAgICAgICB3RmluZCA9IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgd2NoID0gd0ZpbmQgJiAweDBGRkY7Ci0gICAgICAgIHdGaW5kID4+PSAxMjsKLSAgICB9Ci0gICAgRlhfTFBDV1NUUiBwTWFwID0gZ19Vbmljb2RlRGF0YV9Ob3JtYWxpemF0aW9uX01hcHNbd0ZpbmRdOwotICAgIGlmIChwTWFwID09IGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvbl9NYXA0KSB7Ci0gICAgICAgIHBNYXAgPSBnX1VuaWNvZGVEYXRhX05vcm1hbGl6YXRpb25fTWFwNCArIHdjaDsKLSAgICAgICAgd0ZpbmQgPSAoRlhfV0NIQVIpKCpwTWFwICsrKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwTWFwICs9IHdjaDsKLSAgICB9CisgICAgZ19Vbmljb2RlRGF0YV9Ob3JtYWxpemF0aW9uX01hcDR9OworCitGWF9TVFJTSVpFIEZYX1VuaWNvZGVfR2V0Tm9ybWFsaXphdGlvbihGWF9XQ0hBUiB3Y2gsIEZYX1dDSEFSKiBwRHN0KSB7CisgIHdjaCA9IHdjaCAmIDB4RkZGRjsKKyAgRlhfV0NIQVIgd0ZpbmQgPSBnX1VuaWNvZGVEYXRhX05vcm1hbGl6YXRpb25bd2NoXTsKKyAgaWYgKCF3RmluZCkgewogICAgIGlmIChwRHN0KSB7Ci0gICAgICAgIEZYX1dDSEFSIG4gPSB3RmluZDsKLSAgICAgICAgd2hpbGUgKG4gLS0pIHsKLSAgICAgICAgICAgICpwRHN0ICsrID0gKnBNYXAgKys7Ci0gICAgICAgIH0KKyAgICAgICpwRHN0ID0gd2NoOwogICAgIH0KLSAgICByZXR1cm4gKEZYX1NUUlNJWkUpd0ZpbmQ7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKHdGaW5kID49IDB4ODAwMCkgeworICAgIHdjaCA9IHdGaW5kIC0gMHg4MDAwOworICAgIHdGaW5kID0gMTsKKyAgfSBlbHNlIHsKKyAgICB3Y2ggPSB3RmluZCAmIDB4MEZGRjsKKyAgICB3RmluZCA+Pj0gMTI7CisgIH0KKyAgY29uc3QgRlhfV0NIQVIqIHBNYXAgPSBnX1VuaWNvZGVEYXRhX05vcm1hbGl6YXRpb25fTWFwc1t3RmluZF07CisgIGlmIChwTWFwID09IGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvbl9NYXA0KSB7CisgICAgcE1hcCA9IGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvbl9NYXA0ICsgd2NoOworICAgIHdGaW5kID0gKEZYX1dDSEFSKSgqcE1hcCsrKTsKKyAgfSBlbHNlIHsKKyAgICBwTWFwICs9IHdjaDsKKyAgfQorICBpZiAocERzdCkgeworICAgIEZYX1dDSEFSIG4gPSB3RmluZDsKKyAgICB3aGlsZSAobi0tKSB7CisgICAgICAqcERzdCsrID0gKnBNYXArKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChGWF9TVFJTSVpFKXdGaW5kOwogfQotRlhfU1RSU0laRSBGWF9XaWRlU3RyaW5nX0dldE5vcm1hbGl6YXRpb24oRlhfV1NUUiB3c1NyYywgRlhfTFBXU1RSIHBEc3QpCi17Ci0gICAgRlhfU1RSU0laRSBuQ291bnQgPSAwOwotICAgIGZvciAoRlhfU1RSU0laRSBsZW4gPSAwOyBsZW4gPCB3c1NyYy5HZXRMZW5ndGgoKTsgbGVuICsrKSB7Ci0gICAgICAgIEZYX1dDSEFSIHdjaCA9IHdzU3JjLkdldEF0KGxlbik7Ci0gICAgICAgIGlmKHBEc3QpIHsKLSAgICAgICAgICAgIG5Db3VudCArPSBGWF9Vbmljb2RlX0dldE5vcm1hbGl6YXRpb24od2NoLCBwRHN0ICsgbkNvdW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5Db3VudCArPSBGWF9Vbmljb2RlX0dldE5vcm1hbGl6YXRpb24od2NoLCBwRHN0KTsKLSAgICAgICAgfQorRlhfU1RSU0laRSBGWF9XaWRlU3RyaW5nX0dldE5vcm1hbGl6YXRpb24oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSKiBwRHN0KSB7CisgIEZYX1NUUlNJWkUgbkNvdW50ID0gMDsKKyAgZm9yIChGWF9TVFJTSVpFIGxlbiA9IDA7IGxlbiA8IHdzU3JjLkdldExlbmd0aCgpOyBsZW4rKykgeworICAgIEZYX1dDSEFSIHdjaCA9IHdzU3JjLkdldEF0KGxlbik7CisgICAgaWYgKHBEc3QpIHsKKyAgICAgIG5Db3VudCArPSBGWF9Vbmljb2RlX0dldE5vcm1hbGl6YXRpb24od2NoLCBwRHN0ICsgbkNvdW50KTsKKyAgICB9IGVsc2UgeworICAgICAgbkNvdW50ICs9IEZYX1VuaWNvZGVfR2V0Tm9ybWFsaXphdGlvbih3Y2gsIHBEc3QpOwogICAgIH0KLSAgICByZXR1cm4gbkNvdW50OworICB9CisgIHJldHVybiBuQ291bnQ7CiB9Ci1GWF9TVFJTSVpFIEZYX1dpZGVTdHJpbmdfR2V0Tm9ybWFsaXphdGlvbihGWF9XU1RSIHdzU3JjLCBDRlhfV2lkZVN0cmluZyAmd3NEc3QpCi17Ci0gICAgRlhfU1RSU0laRSBuTGVuID0gRlhfV2lkZVN0cmluZ19HZXROb3JtYWxpemF0aW9uKHdzU3JjLCAoRlhfTFBXU1RSKU5VTEwpOwotICAgIGlmICghbkxlbikgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgRlhfTFBXU1RSIHBCdWYgPSB3c0RzdC5HZXRCdWZmZXIobkxlbik7Ci0gICAgRlhfV2lkZVN0cmluZ19HZXROb3JtYWxpemF0aW9uKHdzU3JjLCBwQnVmKTsKLSAgICB3c0RzdC5SZWxlYXNlQnVmZmVyKG5MZW4pOwotICAgIHJldHVybiBuTGVuOworRlhfU1RSU0laRSBGWF9XaWRlU3RyaW5nX0dldE5vcm1hbGl6YXRpb24oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0RzdCkgeworICBGWF9TVFJTSVpFIG5MZW4gPSBGWF9XaWRlU3RyaW5nX0dldE5vcm1hbGl6YXRpb24od3NTcmMsIChGWF9XQ0hBUiopTlVMTCk7CisgIGlmICghbkxlbikgeworICAgIHJldHVybiAwOworICB9CisgIEZYX1dDSEFSKiBwQnVmID0gd3NEc3QuR2V0QnVmZmVyKG5MZW4pOworICBGWF9XaWRlU3RyaW5nX0dldE5vcm1hbGl6YXRpb24od3NTcmMsIHBCdWYpOworICB3c0RzdC5SZWxlYXNlQnVmZmVyKG5MZW4pOworICByZXR1cm4gbkxlbjsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L3VuaWNvZGVub3JtYWxpemF0aW9uZGF0YS5jcHAgYi9jb3JlL3NyYy9mcGRmdGV4dC91bmljb2Rlbm9ybWFsaXphdGlvbmRhdGEuY3BwCmluZGV4IDM3Y2NkYzkuLjY4NmZlOTEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L3VuaWNvZGVub3JtYWxpemF0aW9uZGF0YS5jcHAKKysrIGIvY29yZS9zcmMvZnBkZnRleHQvdW5pY29kZW5vcm1hbGl6YXRpb25kYXRhLmNwcApAQCAtMSw0NjYxICsxLDgyNzUgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmgiCi1leHRlcm4gY29uc3QgRlhfV0NIQVIgZ19Vbmljb2RlRGF0YV9Ob3JtYWxpemF0aW9uWzY1NTM2XSA9IHsKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MDAxLCAweDAwMDAsIDB4MjAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwMDIsIDB4ODAwMiwgMHgwMDAwLCAweDIwMDQsIDB4MDAwMCwgMHgwMDAwLCAweDgwMDMsCi0gICAgMHg4MDA0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODAwNSwgMHgwMDAwLCAweDgwMDYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODAwNywgMHg4MDA4LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDgwMDksIDB4ODAwQSwgMHg4MDBCLCAweDgwMEMsIDB4MDAwMCwgMHgwMDAwLCAweDgwMEQsIDB4ODAwRSwgMHg4MDBGLCAweDAwMDAsIDB4MzAwMCwgMHgzMDAzLCAweDMwMDYsIDB4MDAwMCwKLSAgICAweDgwMTAsIDB4ODAxMSwgMHg4MDEyLCAweDgwMTMsIDB4ODAxNCwgMHg4MDE1LCAweDAwMDAsIDB4ODAxNiwgMHg4MDE3LCAweDgwMTgsIDB4ODAxOSwgMHg4MDFBLCAweDgwMUIsIDB4ODAxQywgMHg4MDFELCAweDgwMUUsCi0gICAgMHg4MDFGLCAweDgwMjAsIDB4ODAyMSwgMHg4MDIyLCAweDgwMjMsIDB4ODAyNCwgMHg4MDI1LCAweDAwMDAsIDB4ODAyNiwgMHg4MDI3LCAweDgwMjgsIDB4ODAyOSwgMHg4MDJBLCAweDgwMkIsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODAyQywgMHg4MDJELCAweDgwMkUsIDB4ODAyRiwgMHg4MDMwLCAweDgwMzEsIDB4MDAwMCwgMHg4MDMyLCAweDgwMzMsIDB4ODAzNCwgMHg4MDM1LCAweDgwMzYsIDB4ODAzNywgMHg4MDM4LCAweDgwMzksIDB4ODAzQSwKLSAgICAweDAwMDAsIDB4ODAzQiwgMHg4MDNDLCAweDgwM0QsIDB4ODAzRSwgMHg4MDNGLCAweDgwNDAsIDB4MDAwMCwgMHg4MDQxLCAweDgwNDIsIDB4ODA0MywgMHg4MDQ0LCAweDgwNDUsIDB4ODA0NiwgMHgwMDAwLCAweDgwNDcsCi0gICAgMHg4MDQ4LCAweDgwNDksIDB4ODA0QSwgMHg4MDRCLCAweDgwNEMsIDB4ODA0RCwgMHg4MDRFLCAweDgwNEYsIDB4ODA1MCwgMHg4MDUxLCAweDgwNTIsIDB4ODA1MywgMHg4MDU0LCAweDgwNTUsIDB4ODA1NiwgMHg4MDU3LAotICAgIDB4ODA1OCwgMHg4MDU5LCAweDgwNUEsIDB4ODA1QiwgMHg4MDVDLCAweDgwNUQsIDB4ODA1RSwgMHg4MDVGLCAweDgwNjAsIDB4ODA2MSwgMHg4MDYyLCAweDgwNjMsIDB4ODA2NCwgMHg4MDY1LCAweDgwNjYsIDB4ODA2NywKLSAgICAweDgwNjgsIDB4ODA2OSwgMHg4MDZBLCAweDgwNkIsIDB4ODA2QywgMHg4MDZELCAweDgwNkUsIDB4ODA2RiwgMHg4MDcwLCAweDgwNzEsIDB4ODA3MiwgMHg4MDczLCAweDgwNzQsIDB4ODA3NSwgMHg4MDc2LCAweDgwNzcsCi0gICAgMHg4MDc4LCAweDAwMDAsIDB4MjAwNiwgMHgyMDA4LCAweDgwNzksIDB4ODA3QSwgMHg4MDdCLCAweDgwN0MsIDB4ODA3RCwgMHg4MDdFLCAweDgwN0YsIDB4ODA4MCwgMHg4MDgxLCAweDgwODIsIDB4ODA4MywgMHg4MDg0LAotICAgIDB4ODA4NSwgMHg4MDg2LCAweDgwODcsIDB4ODA4OCwgMHg4MDg5LCAweDgwOEEsIDB4ODA4QiwgMHg4MDhDLCAweDgwOEQsIDB4ODA4RSwgMHgwMDAwLCAweDAwMDAsIDB4ODA4RiwgMHg4MDkwLCAweDgwOTEsIDB4ODA5MiwKLSAgICAweDgwOTMsIDB4ODA5NCwgMHgyMDBBLCAweDIwMEMsIDB4ODA5NSwgMHg4MDk2LCAweDgwOTcsIDB4ODA5OCwgMHg4MDk5LCAweDgwOUEsIDB4ODA5QiwgMHg4MDlDLCAweDgwOUQsIDB4ODA5RSwgMHg4MDlGLCAweDgwQTAsCi0gICAgMHg4MEExLCAweDgwQTIsIDB4ODBBMywgMHg4MEE0LCAweDgwQTUsIDB4ODBBNiwgMHg4MEE3LCAweDgwQTgsIDB4ODBBOSwgMHg4MEFBLCAweDgwQUIsIDB4ODBBQywgMHg4MEFELCAweDgwQUUsIDB4ODBBRiwgMHg4MEIwLAotICAgIDB4ODBCMSwgMHg4MEIyLCAweDgwQjMsIDB4ODBCNCwgMHg4MEI1LCAweDgwQjYsIDB4ODBCNywgMHg4MEI4LCAweDgwQjksIDB4ODBCQSwgMHg4MEJCLCAweDgwQkMsIDB4ODBCRCwgMHg4MEJFLCAweDgwQkYsIDB4ODBDMCwKLSAgICAweDgwQzEsIDB4ODBDMiwgMHg4MEMzLCAweDgwQzQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODBDNSwgMHg4MEM2LCAweDgwQzcsIDB4ODBDOCwgMHg4MEM5LCAweDgwQ0EsIDB4MDAwMCwgMHg4MENCLCAweDAwMDAsCi0gICAgMHg4MENDLCAweDgwQ0QsIDB4ODBDRSwgMHg4MENGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgwRDAsIDB4ODBEMSwgMHg4MEQyLCAweDgwRDMsIDB4MDAwMCwgMHg4MEQ0LCAweDgwRDUsIDB4ODBENiwgMHg4MEQ3LAotICAgIDB4ODBEOCwgMHg4MEQ5LCAweDAwMDAsIDB4MDAwMCwgMHg4MERBLCAweDgwREIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MERDLCAweDgwREQsIDB4ODBERSwgMHg4MERGLCAweDgwRTAsIDB4ODBFMSwKLSAgICAweDgwRTIsIDB4MDAwMCwgMHg4MEUzLCAweDgwRTQsIDB4ODBFNSwgMHg4MEU2LCAweDgwRTcsIDB4MDAwMCwgMHg4MEU4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwMEUsIDB4MjAxMCwgMHgyMDEyLCAweDIwMTQsIDB4MjAxNiwgMHgyMDE4LCAweDIwMUEsIDB4MjAxQywgMHgyMDFFLCAweDgwRTksIDB4ODBFQSwgMHg4MEVCLAotICAgIDB4ODBFQywgMHg4MEVELCAweDgwRUUsIDB4ODBFRiwgMHg4MEYwLCAweDgwRjEsIDB4ODBGMiwgMHg4MEYzLCAweDgwRjQsIDB4ODBGNSwgMHg4MEY2LCAweDgwRjcsIDB4ODBGOCwgMHg4MEY5LCAweDgwRkEsIDB4ODBGQiwKLSAgICAweDgwRkMsIDB4ODBGRCwgMHg4MEZFLCAweDgwRkYsIDB4ODEwMCwgMHg4MTAxLCAweDgxMDIsIDB4ODEwMywgMHg4MTA0LCAweDgxMDUsIDB4ODEwNiwgMHg4MTA3LCAweDgxMDgsIDB4ODEwOSwgMHg4MTBBLCAweDgxMEIsCi0gICAgMHg4MTBDLCAweDIwMjAsIDB4MjAyMiwgMHgyMDI0LCAweDgxMEQsIDB4ODEwRSwgMHgwMDAwLCAweDAwMDAsIDB4ODEwRiwgMHg4MTEwLCAweDgxMTEsIDB4ODExMiwgMHg4MTEzLCAweDgxMTQsIDB4ODExNSwgMHg4MTE2LAotICAgIDB4ODExNywgMHg4MTE4LCAweDgxMTksIDB4ODExQSwgMHg4MTFCLCAweDgxMUMsIDB4ODExRCwgMHg4MTFFLCAweDgxMUYsIDB4ODEyMCwgMHg4MTIxLCAweDgxMjIsIDB4ODEyMywgMHg4MTI0LCAweDgxMjUsIDB4ODEyNiwKLSAgICAweDgxMjcsIDB4ODEyOCwgMHg4MTI5LCAweDgxMkEsIDB4ODEyQiwgMHg4MTJDLCAweDgxMkQsIDB4ODEyRSwgMHg4MTJGLCAweDgxMzAsIDB4ODEzMSwgMHg4MTMyLCAweDAwMDAsIDB4MDAwMCwgMHg4MTMzLCAweDgxMzQsCi0gICAgMHg4MTM1LCAweDgxMzYsIDB4MDAwMCwgMHgwMDAwLCAweDgxMzcsIDB4ODEzOCwgMHg4MTM5LCAweDgxM0EsIDB4ODEzQiwgMHg4MTNDLCAweDgxM0QsIDB4ODEzRSwgMHg4MTNGLCAweDgxNDAsIDB4ODE0MSwgMHg4MTQyLAotICAgIDB4ODE0MywgMHg4MTQ0LCAweDgxNDUsIDB4ODE0NiwgMHg4MTQ3LCAweDgxNDgsIDB4ODE0OSwgMHg4MTRBLCAweDIwMjYsIDB4MjAyOCwgMHg4MTRCLCAweDgxNEMsIDB4ODE0RCwgMHg4MTRFLCAweDgxNEYsIDB4ODE1MCwKLSAgICAweDgxNTEsIDB4MDAwMCwgMHgwMDAwLCAweDgxNTIsIDB4ODE1MywgMHg4MTU0LCAweDgxNTUsIDB4ODE1NiwgMHg4MTU3LCAweDgxNTgsIDB4ODE1OSwgMHg4MTVBLCAweDgxNUIsIDB4ODE1QywgMHg4MTVELCAweDgxNUUsCi0gICAgMHg4MTVGLCAweDAwMDAsIDB4ODE2MCwgMHg4MTYxLCAweDgxNjIsIDB4ODE2MywgMHg4MTY0LCAweDgxNjUsIDB4ODE2NiwgMHgwMDAwLCAweDgxNjcsIDB4ODE2OCwgMHg4MTY5LCAweDgxNkEsIDB4ODE2QiwgMHg4MTZDLAotICAgIDB4ODE2RCwgMHg4MTZFLCAweDgxNkYsIDB4MDAwMCwgMHgwMDAwLCAweDgxNzAsIDB4ODE3MSwgMHgwMDAwLCAweDgxNzIsIDB4MDAwMCwgMHg4MTczLCAweDgxNzQsIDB4ODE3NSwgMHg4MTc2LCAweDAwMDAsIDB4ODE3NywKLSAgICAweDgxNzgsIDB4ODE3OSwgMHg4MTdBLCAweDgxN0IsIDB4ODE3QywgMHg4MTdELCAweDIwMkEsIDB4MDAwMCwgMHgwMDAwLCAweDgxN0UsIDB4ODE3RiwgMHg4MTgwLCAweDgxODEsIDB4ODE4MiwgMHg4MTgzLCAweDgxODQsCi0gICAgMHg4MTg1LCAweDgxODYsIDB4ODE4NywgMHgwMDAwLCAweDgxODgsIDB4ODE4OSwgMHg4MThBLCAweDgxOEIsIDB4ODE4QywgMHg4MThELCAweDAwMDAsIDB4ODE4RSwgMHg4MThGLCAweDgxOTAsIDB4ODE5MSwgMHg4MTkyLAotICAgIDB4ODE5MywgMHg4MTk0LCAweDAwMDAsIDB4ODE5NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MTk2LCAweDAwMDAsIDB4ODE5NywgMHg4MTk4LCAweDgxOTksIDB4ODE5QSwgMHg4MTlCLCAweDgxOUMsIDB4ODE5RCwKLSAgICAweDgxOUUsIDB4MDAwMCwgMHgwMDAwLCAweDIwMkMsIDB4MjAyRSwgMHgyMDMwLCAweDIwMzIsIDB4MjAzNCwgMHgyMDM2LCAweDIwMzgsIDB4MjAzQSwgMHgyMDNDLCAweDAwMDAsIDB4MDAwMCwgMHg4MTlGLCAweDgxQTAsCi0gICAgMHg4MUExLCAweDgxQTIsIDB4ODFBMywgMHg4MUE0LCAweDgxQTUsIDB4ODFBNiwgMHg4MUE3LCAweDgxQTgsIDB4ODFBOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4MUFBLCAweDgxQUIsIDB4ODFBQywgMHg4MUFELCAweDgxQUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4MUFGLCAweDgxQjAsIDB4MDAwMCwgMHg4MUIxLCAweDgxQjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgxQjMsIDB4ODFCNCwgMHg4MUI1LCAweDgxQjYsIDB4ODFCNywgMHg4MUI4LCAweDgxQjksIDB4ODFCQSwgMHg4MUJCLCAweDgxQkMsIDB4ODFCRCwgMHg4MUJFLCAweDgxQkYsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgxQzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODFDMSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MUMyLCAweDgxQzMsIDB4ODFDNCwgMHg4MUM1LCAweDgxQzYsIDB4ODFDNywgMHg4MUM4LCAweDAwMDAsIDB4ODFDOSwgMHgwMDAwLCAweDgxQ0EsIDB4ODFDQiwKLSAgICAweDgxQ0MsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgxQ0QsIDB4ODFDRSwgMHg4MUNGLCAweDgxRDAsIDB4ODFEMSwgMHg4MUQyLAotICAgIDB4ODFEMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODFENCwgMHg4MUQ1LCAweDgxRDYsIDB4ODFENywgMHg4MUQ4LCAweDAwMDAsCi0gICAgMHg4MUQ5LCAweDgxREEsIDB4ODFEQiwgMHg4MURDLCAweDgxREQsIDB4ODFERSwgMHg4MURGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDgxRTAsIDB4ODFFMSwgMHg4MUUyLCAweDAwMDAsIDB4ODFFMywgMHg4MUU0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgxRTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4MUU2LCAweDgxRTcsIDB4MDAwMCwgMHg4MUU4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgxRTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MUVBLCAweDgxRUIsIDB4ODFFQywgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODFFRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MUVFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDgxRUYsIDB4ODFGMCwgMHgwMDAwLCAweDgxRjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODFGMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgxRjMsIDB4ODFGNCwgMHg4MUY1LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODFGNiwgMHg4MUY3LCAweDAwMDAsIDB4MDAwMCwgMHg4MUY4LCAweDgxRjksIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODFGQSwgMHg4MUZCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODFGQywgMHg4MUZELCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODFGRSwgMHg4MUZGLCAweDAwMDAsIDB4MDAwMCwgMHg4MjAwLCAweDgyMDEsCi0gICAgMHg4MjAyLCAweDgyMDMsIDB4ODIwNCwgMHg4MjA1LCAweDgyMDYsIDB4ODIwNywgMHg4MjA4LCAweDgyMDksIDB4ODIwQSwgMHg4MjBCLCAweDgyMEMsIDB4ODIwRCwgMHg4MjBFLCAweDgyMEYsIDB4ODIxMCwgMHg4MjExLAotICAgIDB4ODIxMiwgMHg4MjEzLCAweDgyMTQsIDB4ODIxNSwgMHgyMDNFLCAweDIwNDAsIDB4ODIxNiwgMHg4MjE3LCAweDAwMDAsIDB4MDAwMCwgMHg4MjE4LCAweDgyMTksIDB4ODIxQSwgMHg4MjFCLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDgyMUMsIDB4ODIxRCwgMHg4MjFFLCAweDgyMUYsIDB4MjA0MiwgMHgyMDQ0LCAweDgyMjAsIDB4ODIyMSwgMHg4MjIyLCAweDgyMjMsIDB4MDAwMCwgMHgwMDAwLCAweDgyMjQsIDB4ODIyNSwgMHg4MjI2LCAweDgyMjcsCi0gICAgMHgwMDAwLCAweDgyMjgsIDB4ODIyOSwgMHg4MjJBLCAweDgyMkIsIDB4ODIyQywgMHg4MjJELCAweDgyMkUsIDB4ODIyRiwgMHg4MjMwLCAweDgyMzEsIDB4MDAwMCwgMHgwMDAwLCAweDgyMzIsIDB4ODIzMywgMHgwMDAwLAotICAgIDB4ODIzNCwgMHg4MjM1LCAweDgyMzYsIDB4ODIzNywgMHgyMDQ2LCAweDIwNDgsIDB4ODIzOCwgMHg4MjM5LCAweDAwMDAsIDB4MDAwMCwgMHg4MjNBLCAweDgyM0IsIDB4ODIzQywgMHg4MjNELCAweDgyM0UsIDB4ODIzRiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4MjQwLCAweDgyNDEsIDB4ODI0MiwgMHg4MjQzLCAweDgyNDQsIDB4ODI0NSwgMHgwMDAwLCAweDAwMDAsIDB4ODI0NiwgMHg4MjQ3LCAweDgyNDgsIDB4ODI0OSwgMHg4MjRBLCAweDgyNEIsCi0gICAgMHg4MjRDLCAweDgyNEQsIDB4ODI0RSwgMHg4MjRGLCAweDgyNTAsIDB4ODI1MSwgMHg4MjUyLCAweDgyNTMsIDB4ODI1NCwgMHg4MjU1LCAweDgyNTYsIDB4ODI1NywgMHg4MjU4LCAweDgyNTksIDB4ODI1QSwgMHg4MjVCLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDgyNUMsIDB4ODI1RCwgMHg4MjVFLCAweDgyNUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwNEEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjA0QywgMHgyMDRFLCAweDIwNTAsIDB4MjA1MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDIwNTQsIDB4MDAwMCwgMHgyMDU2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMDU4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjA1QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MjA1QywgMHgwMDAwLCAweDAwMDAsIDB4MjA1RSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwNjAsIDB4MjA2MiwgMHgyMDY0LCAweDIwNjYsIDB4MjA2OCwgMHgyMDZBLCAweDIwNkMsIDB4MjA2RSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMDcwLCAweDIwNzIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMDc0LCAweDIwNzYsIDB4MDAwMCwgMHgyMDc4LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMDdBLCAweDAwMDAsIDB4MDAwMCwgMHgyMDdDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwN0UsIDB4MjA4MCwgMHgyMDgyLCAweDAwMDAsIDB4MDAwMCwgMHgyMDg0LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMDg2LCAweDAwMDAsIDB4MDAwMCwgMHgyMDg4LCAweDIwOEEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMDhDLCAweDIwOEUsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMDkwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMDkyLCAweDIwOTQsIDB4MjA5NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjA5OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDIwOUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjA5QywgMHgyMDlFLCAweDAwMDAsIDB4MjBBMCwgMHgyMEEyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMEE0LCAweDIwQTYsIDB4MjBBOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMEFBLCAweDAwMDAsIDB4MjBBQywgMHgyMEFFLCAweDIwQjAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjBCMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMEI0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwQjYsIDB4MjBCOCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgyNjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMEJBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwQkMsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDIwQkUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMEMwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjBDMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwQzQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMEM2LCAweDAwMDAsIDB4MjBDOCwgMHgyMENBLCAweDIwQ0MsIDB4MjBDRSwgMHgyMEQwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgyMEQyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwRDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjBENiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MjBEOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwREEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMERDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjBERSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwRTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MjYxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwRTIsIDB4MDAwMCwgMHgyMEU0LCAweDAwMDAsIDB4MjBFNiwgMHgwMDAwLCAweDIwRTgsIDB4MDAwMCwgMHgyMEVBLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MjBFQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMEVFLCAweDAwMDAsIDB4MjBGMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgyMEYyLCAweDIwRjQsIDB4MDAwMCwgMHgyMEY2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MjYyLCAweDgyNjMsIDB4ODI2NCwgMHg4MjY1LAotICAgIDB4ODI2NiwgMHg4MjY3LCAweDgyNjgsIDB4ODI2OSwgMHg4MjZBLCAweDgyNkIsIDB4ODI2QywgMHg4MjZELCAweDgyNkUsIDB4ODI2RiwgMHg4MjcwLCAweDAwMDAsIDB4ODI3MSwgMHg4MjcyLCAweDgyNzMsIDB4ODI3NCwKLSAgICAweDgyNzUsIDB4ODI3NiwgMHg4Mjc3LCAweDgyNzgsIDB4ODI3OSwgMHg4MjdBLCAweDgyN0IsIDB4ODI3QywgMHg4MjdELCAweDgyN0UsIDB4ODI3RiwgMHg4MjgwLCAweDgyODEsIDB4ODI4MiwgMHgwMDAwLCAweDgyODMsCi0gICAgMHg4Mjg0LCAweDgyODUsIDB4ODI4NiwgMHg4Mjg3LCAweDgyODgsIDB4ODI4OSwgMHg4MjhBLCAweDgyOEIsIDB4ODI4QywgMHg4MjhELCAweDgyOEUsIDB4ODI4RiwgMHg4MjkwLCAweDgyOTEsIDB4ODI5MiwgMHg4MjkzLAotICAgIDB4ODI5NCwgMHg4Mjk1LCAweDgyOTYsIDB4ODI5NywgMHg4Mjk4LCAweDgyOTksIDB4ODI5QSwgMHg4MjlCLCAweDgyOUMsIDB4ODI5RCwgMHg4MjlFLCAweDAwMDAsIDB4ODI5RiwgMHg4MkEwLCAweDgyQTEsIDB4ODJBMiwKLSAgICAweDgyQTMsIDB4ODJBNCwgMHg4MkE1LCAweDgyQTYsIDB4ODJBNywgMHg4MkE4LCAweDgyQTksIDB4ODJBQSwgMHg4MkFCLCAweDAwMDAsIDB4MjBGOCwgMHg4MkFDLCAweDAwMDAsIDB4ODJBRCwgMHg4MkFFLCAweDgyQUYsCi0gICAgMHg4MkIwLCAweDgyQjEsIDB4ODJCMiwgMHg4MkIzLCAweDgyQjQsIDB4ODJCNSwgMHg4MkI2LCAweDgyQjcsIDB4ODJCOCwgMHg4MkI5LCAweDgyQkEsIDB4ODJCQiwgMHg4MkJDLCAweDgyQkQsIDB4ODJCRSwgMHg4MkJGLAotICAgIDB4ODJDMCwgMHg4MkMxLCAweDgyQzIsIDB4ODJDMywgMHg4MkM0LCAweDgyQzUsIDB4ODJDNiwgMHgwMDAwLCAweDgyQzcsIDB4MDAwMCwgMHgwMDAwLCAweDgyQzgsIDB4ODJDOSwgMHg4MkNBLCAweDgyQ0IsIDB4ODJDQywKLSAgICAweDgyQ0QsIDB4ODJDRSwgMHg4MkNGLCAweDgyRDAsIDB4ODJEMSwgMHg4MkQyLCAweDgyRDMsIDB4ODJENCwgMHg4MkQ1LCAweDgyRDYsIDB4ODJENywgMHg4MkQ4LCAweDgyRDksIDB4ODJEQSwgMHg4MkRCLCAweDgyREMsCi0gICAgMHg4MkRELCAweDgyREUsIDB4ODJERiwgMHg4MkUwLCAweDgyRTEsIDB4ODJFMiwgMHg4MkUzLCAweDgyRTQsIDB4ODJFNSwgMHg4MkU2LCAweDgyRTcsIDB4ODJFOCwgMHg4MkU5LCAweDgyRUEsIDB4ODJFQiwgMHg4MkVDLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDgyRUQsIDB4ODJFRSwgMHg4MkVGLCAweDgyRjAsIDB4ODJGMSwgMHg4MkYyLCAweDgyRjMsIDB4ODJGNCwgMHg4MkY1LCAweDgyRjYsIDB4ODJGNywgMHg4MkY4LCAweDgyRjksIDB4ODJGQSwgMHg4MkZCLCAweDgyRkMsCi0gICAgMHg4MkZELCAweDgyRkUsIDB4ODJGRiwgMHg4MzAwLCAweDgzMDEsIDB4ODMwMiwgMHg4MzAzLCAweDgzMDQsIDB4ODMwNSwgMHg4MzA2LCAweDgzMDcsIDB4ODMwOCwgMHg4MzA5LCAweDgzMEEsIDB4ODMwQiwgMHg4MzBDLAotICAgIDB4ODMwRCwgMHg4MzBFLCAweDgzMEYsIDB4ODMxMCwgMHg4MzExLCAweDgzMTIsIDB4ODMxMywgMHg4MzE0LCAweDgzMTUsIDB4ODMxNiwgMHg4MzE3LCAweDgzMTgsIDB4ODMxOSwgMHg4MzFBLCAweDgzMUIsIDB4ODMxQywKLSAgICAweDgzMUQsIDB4ODMxRSwgMHg4MzFGLCAweDgzMjAsIDB4ODMyMSwgMHg4MzIyLCAweDgzMjMsIDB4ODMyNCwgMHg4MzI1LCAweDgzMjYsIDB4ODMyNywgMHg4MzI4LCAweDgzMjksIDB4ODMyQSwgMHg4MzJCLCAweDgzMkMsCi0gICAgMHg4MzJELCAweDgzMkUsIDB4ODMyRiwgMHg4MzMwLCAweDgzMzEsIDB4ODMzMiwgMHg4MzMzLCAweDgzMzQsIDB4ODMzNSwgMHg4MzM2LCAweDgzMzcsIDB4ODMzOCwgMHg4MzM5LCAweDgzM0EsIDB4ODMzQiwgMHg4MzNDLAotICAgIDB4ODMzRCwgMHg4MzNFLCAweDgzM0YsIDB4ODM0MCwgMHg4MzQxLCAweDgzNDIsIDB4ODM0MywgMHg4MzQ0LCAweDgzNDUsIDB4ODM0NiwgMHg4MzQ3LCAweDgzNDgsIDB4ODM0OSwgMHg4MzRBLCAweDgzNEIsIDB4ODM0QywKLSAgICAweDgzNEQsIDB4ODM0RSwgMHg4MzRGLCAweDgzNTAsIDB4ODM1MSwgMHg4MzUyLCAweDgzNTMsIDB4ODM1NCwgMHg4MzU1LCAweDgzNTYsIDB4ODM1NywgMHg4MzU4LCAweDgzNTksIDB4ODM1QSwgMHg4MzVCLCAweDgzNUMsCi0gICAgMHg4MzVELCAweDgzNUUsIDB4ODM1RiwgMHg4MzYwLCAweDgzNjEsIDB4ODM2MiwgMHg4MzYzLCAweDgzNjQsIDB4ODM2NSwgMHg4MzY2LCAweDgzNjcsIDB4ODM2OCwgMHg4MzY5LCAweDgzNkEsIDB4ODM2QiwgMHg4MzZDLAotICAgIDB4ODM2RCwgMHg4MzZFLCAweDgzNkYsIDB4ODM3MCwgMHg4MzcxLCAweDgzNzIsIDB4ODM3MywgMHg4Mzc0LCAweDgzNzUsIDB4ODM3NiwgMHg4Mzc3LCAweDgzNzgsIDB4ODM3OSwgMHg4MzdBLCAweDgzN0IsIDB4ODM3QywKLSAgICAweDgzN0QsIDB4ODM3RSwgMHg4MzdGLCAweDgzODAsIDB4ODM4MSwgMHg4MzgyLCAweDgzODMsIDB4ODM4NCwgMHg4Mzg1LCAweDgzODYsIDB4ODM4NywgMHg4Mzg4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4Mzg5LCAweDgzOEEsIDB4ODM4QiwgMHg4MzhDLCAweDgzOEQsIDB4ODM4RSwgMHg4MzhGLCAweDgzOTAsIDB4ODM5MSwgMHg4MzkyLCAweDgzOTMsIDB4ODM5NCwgMHg4Mzk1LCAweDgzOTYsIDB4ODM5NywgMHg4Mzk4LAotICAgIDB4ODM5OSwgMHg4MzlBLCAweDgzOUIsIDB4ODM5QywgMHg4MzlELCAweDgzOUUsIDB4ODM5RiwgMHg4M0EwLCAweDgzQTEsIDB4ODNBMiwgMHg4M0EzLCAweDgzQTQsIDB4ODNBNSwgMHg4M0E2LCAweDgzQTcsIDB4ODNBOCwKLSAgICAweDgzQTksIDB4ODNBQSwgMHg4M0FCLCAweDgzQUMsIDB4ODNBRCwgMHg4M0FFLCAweDgzQUYsIDB4ODNCMCwgMHg4M0IxLCAweDgzQjIsIDB4ODNCMywgMHg4M0I0LCAweDgzQjUsIDB4ODNCNiwgMHg4M0I3LCAweDgzQjgsCi0gICAgMHg4M0I5LCAweDgzQkEsIDB4ODNCQiwgMHg4M0JDLCAweDgzQkQsIDB4ODNCRSwgMHg4M0JGLCAweDgzQzAsIDB4ODNDMSwgMHg4M0MyLCAweDgzQzMsIDB4ODNDNCwgMHg4M0M1LCAweDgzQzYsIDB4ODNDNywgMHg4M0M4LAotICAgIDB4ODNDOSwgMHg4M0NBLCAweDgzQ0IsIDB4ODNDQywgMHg4M0NELCAweDgzQ0UsIDB4ODNDRiwgMHg4M0QwLCAweDgzRDEsIDB4ODNEMiwgMHg4M0QzLCAweDgzRDQsIDB4ODNENSwgMHg4M0Q2LCAweDgzRDcsIDB4ODNEOCwKLSAgICAweDgzRDksIDB4ODNEQSwgMHg4M0RCLCAweDgzREMsIDB4ODNERCwgMHg4M0RFLCAweDgzREYsIDB4ODNFMCwgMHg4M0UxLCAweDgzRTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4M0UzLCAweDgzRTQsIDB4ODNFNSwgMHg4M0U2LCAweDgzRTcsIDB4ODNFOCwgMHg4M0U5LCAweDgzRUEsIDB4ODNFQiwgMHg4M0VDLCAweDgzRUQsIDB4ODNFRSwgMHg4M0VGLCAweDgzRjAsIDB4ODNGMSwgMHg4M0YyLAotICAgIDB4ODNGMywgMHg4M0Y0LCAweDgzRjUsIDB4ODNGNiwgMHg4M0Y3LCAweDgzRjgsIDB4MDAwMCwgMHgwMDAwLCAweDgzRjksIDB4ODNGQSwgMHg4M0ZCLCAweDgzRkMsIDB4ODNGRCwgMHg4M0ZFLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDgzRkYsIDB4ODQwMCwgMHg4NDAxLCAweDg0MDIsIDB4ODQwMywgMHg4NDA0LCAweDg0MDUsIDB4ODQwNiwgMHg4NDA3LCAweDg0MDgsIDB4ODQwOSwgMHg4NDBBLCAweDg0MEIsIDB4ODQwQywgMHg4NDBELCAweDg0MEUsCi0gICAgMHg4NDBGLCAweDg0MTAsIDB4ODQxMSwgMHg4NDEyLCAweDg0MTMsIDB4ODQxNCwgMHg4NDE1LCAweDg0MTYsIDB4ODQxNywgMHg4NDE4LCAweDg0MTksIDB4ODQxQSwgMHg4NDFCLCAweDg0MUMsIDB4ODQxRCwgMHg4NDFFLAotICAgIDB4ODQxRiwgMHg4NDIwLCAweDg0MjEsIDB4ODQyMiwgMHg4NDIzLCAweDg0MjQsIDB4MDAwMCwgMHgwMDAwLCAweDg0MjUsIDB4ODQyNiwgMHg4NDI3LCAweDg0MjgsIDB4ODQyOSwgMHg4NDJBLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDg0MkIsIDB4ODQyQywgMHg4NDJELCAweDg0MkUsIDB4ODQyRiwgMHg4NDMwLCAweDg0MzEsIDB4ODQzMiwgMHgwMDAwLCAweDg0MzMsIDB4MDAwMCwgMHg4NDM0LCAweDAwMDAsIDB4ODQzNSwgMHgwMDAwLCAweDg0MzYsCi0gICAgMHg4NDM3LCAweDg0MzgsIDB4ODQzOSwgMHg4NDNBLCAweDg0M0IsIDB4ODQzQywgMHg4NDNELCAweDg0M0UsIDB4ODQzRiwgMHg4NDQwLCAweDg0NDEsIDB4ODQ0MiwgMHg4NDQzLCAweDg0NDQsIDB4ODQ0NSwgMHg4NDQ2LAotICAgIDB4ODQ0NywgMHg4NDQ4LCAweDg0NDksIDB4ODQ0QSwgMHg4NDRCLCAweDg0NEMsIDB4ODQ0RCwgMHg4NDRFLCAweDg0NEYsIDB4ODQ1MCwgMHg4NDUxLCAweDg0NTIsIDB4ODQ1MywgMHg4NDU0LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDg0NTUsIDB4ODQ1NiwgMHg4NDU3LCAweDg0NTgsIDB4ODQ1OSwgMHg4NDVBLCAweDg0NUIsIDB4ODQ1QywgMHg4NDVELCAweDg0NUUsIDB4ODQ1RiwgMHg4NDYwLCAweDg0NjEsIDB4ODQ2MiwgMHg4NDYzLCAweDg0NjQsCi0gICAgMHg4NDY1LCAweDg0NjYsIDB4ODQ2NywgMHg4NDY4LCAweDg0NjksIDB4ODQ2QSwgMHg4NDZCLCAweDg0NkMsIDB4ODQ2RCwgMHg4NDZFLCAweDg0NkYsIDB4ODQ3MCwgMHg4NDcxLCAweDg0NzIsIDB4ODQ3MywgMHg4NDc0LAotICAgIDB4ODQ3NSwgMHg4NDc2LCAweDg0NzcsIDB4ODQ3OCwgMHg4NDc5LCAweDg0N0EsIDB4ODQ3QiwgMHg4NDdDLCAweDg0N0QsIDB4ODQ3RSwgMHg4NDdGLCAweDg0ODAsIDB4ODQ4MSwgMHg4NDgyLCAweDg0ODMsIDB4ODQ4NCwKLSAgICAweDg0ODUsIDB4ODQ4NiwgMHg4NDg3LCAweDg0ODgsIDB4ODQ4OSwgMHgwMDAwLCAweDg0OEEsIDB4ODQ4QiwgMHg4NDhDLCAweDg0OEQsIDB4ODQ4RSwgMHg4NDhGLCAweDg0OTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODQ5MSwgMHg4NDkyLCAweDg0OTMsIDB4MDAwMCwgMHg4NDk0LCAweDg0OTUsIDB4ODQ5NiwgMHg4NDk3LCAweDg0OTgsIDB4ODQ5OSwgMHg4NDlBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODQ5QiwgMHg4NDlDLCAweDg0OUQsIDB4ODQ5RSwgMHgwMDAwLCAweDAwMDAsIDB4ODQ5RiwgMHg4NEEwLCAweDg0QTEsIDB4ODRBMiwgMHg4NEEzLCAweDg0QTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDg0QTUsIDB4ODRBNiwgMHg4NEE3LCAweDg0QTgsIDB4ODRBOSwgMHg4NEFBLCAweDg0QUIsIDB4ODRBQywgMHg4NEFELCAweDg0QUUsIDB4ODRBRiwgMHg4NEIwLCAweDg0QjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODRCMiwgMHg4NEIzLCAweDg0QjQsIDB4MDAwMCwgMHg4NEI1LCAweDg0QjYsIDB4ODRCNywgMHg4NEI4LCAweDg0QjksIDB4ODRCQSwgMHg4NEJCLCAweDg0QkMsIDB4ODRCRCwgMHgwMDAwLAotICAgIDB4ODRCRSwgMHg4NEJGLCAweDg0QzAsIDB4ODRDMSwgMHg4NEMyLCAweDg0QzMsIDB4ODRDNCwgMHg4NEM1LCAweDg0QzYsIDB4ODRDNywgMHg4NEM4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ODRDOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODRDQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg0Q0IsIDB4MjBGQSwgMHgzMDA5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NENDLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjBGQywgMHgzMDBDLCAweDAwMDAsIDB4MjBGRSwgMHgzMDBGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjEwMCwgMHgwMDAwLCAweDIxMDIsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjEwNCwgMHgyMTA2LCAweDIxMDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDQwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NENELAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDg0Q0UsIDB4ODRDRiwgMHgwMDAwLCAweDAwMDAsIDB4ODREMCwgMHg4NEQxLCAweDg0RDIsIDB4ODREMywgMHg4NEQ0LCAweDg0RDUsIDB4ODRENiwgMHg4NEQ3LCAweDg0RDgsIDB4ODREOSwgMHg4NERBLCAweDg0REIsCi0gICAgMHg4NERDLCAweDg0REQsIDB4ODRERSwgMHg4NERGLCAweDg0RTAsIDB4ODRFMSwgMHg4NEUyLCAweDg0RTMsIDB4ODRFNCwgMHg4NEU1LCAweDg0RTYsIDB4ODRFNywgMHg4NEU4LCAweDg0RTksIDB4ODRFQSwgMHgwMDAwLAotICAgIDB4ODRFQiwgMHg4NEVDLCAweDg0RUQsIDB4ODRFRSwgMHg4NEVGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTBBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDMwMTIsIDB4MzAxNSwgMHg4NEYwLCAweDIxMEMsIDB4MDAwMCwgMHgzMDE4LCAweDMwMUIsIDB4ODRGMSwgMHgwMDAwLCAweDIxMEUsIDB4ODRGMiwgMHg4NEYzLCAweDg0RjQsIDB4ODRGNSwgMHg4NEY2LCAweDg0RjcsCi0gICAgMHg4NEY4LCAweDg0RjksIDB4ODRGQSwgMHg4NEZCLCAweDAwMDAsIDB4ODRGQywgMHgyMTEwLCAweDAwMDAsIDB4MDAwMCwgMHg4NEZELCAweDg0RkUsIDB4ODRGRiwgMHg4NTAwLCAweDg1MDEsIDB4ODUwMiwgMHg4NTAzLAotICAgIDB4MjExMiwgMHgzMDFFLCAweDIxMTQsIDB4ODUwNCwgMHg4NTA1LCAweDAwMDAsIDB4ODUwNiwgMHg4NTA3LCAweDg1MDgsIDB4MDAwMCwgMHg4NTA5LCAweDg1MEEsIDB4ODUwQiwgMHg4NTBDLCAweDg1MEQsIDB4ODUwRSwKLSAgICAweDg1MEYsIDB4ODUxMCwgMHgwMDAwLCAweDg1MTEsIDB4ODUxMiwgMHg4NTEzLCAweDg1MTQsIDB4ODUxNSwgMHg4NTE2LCAweDg1MTcsIDB4MDAwMCwgMHgzMDIxLCAweDg1MTgsIDB4ODUxOSwgMHg4NTFBLCAweDg1MUIsCi0gICAgMHg4NTFDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODUxRCwgMHg4NTFFLCAweDg1MUYsIDB4ODUyMCwgMHg4NTIxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MzAyNCwgMHgzMDI3LCAweDQwMDUsIDB4MzAyQSwgMHgzMDJELCAweDMwMzAsIDB4MzAzMywgMHgzMDM2LCAweDMwMzksIDB4MzAzQywgMHgzMDNGLCAweDMwNDIsIDB4MzA0NSwgMHgzMDQ4LCAweDMwNEIsIDB4MjExNiwKLSAgICAweDg1MjIsIDB4MjExOCwgMHgzMDRFLCAweDIxMUEsIDB4ODUyMywgMHgyMTFDLCAweDMwNTEsIDB4NDAwQSwgMHgyMTFFLCAweDg1MjQsIDB4MjEyMCwgMHgzMDU0LCAweDg1MjUsIDB4ODUyNiwgMHg4NTI3LCAweDg1MjgsCi0gICAgMHg4NTI5LCAweDIxMjIsIDB4MzA1NywgMHgyMTI0LCAweDg1MkEsIDB4MjEyNiwgMHgzMDVBLCAweDQwMEYsIDB4MjEyOCwgMHg4NTJCLCAweDIxMkEsIDB4MzA1RCwgMHg4NTJDLCAweDg1MkQsIDB4ODUyRSwgMHg4NTJGLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MzA2MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjEyQywgMHgyMTJFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjEzMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjEzMiwgMHgyMTM0LCAweDIxMzYsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg1MzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NTMxLCAweDAwMDAsIDB4MDAwMCwgMHg4NTMyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjEzOCwgMHgwMDAwLCAweDIxM0EsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIxM0MsIDB4MzA2MywgMHgwMDAwLCAweDIxM0UsCi0gICAgMHgzMDY2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgyMTQwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTQyLCAweDAwMDAsIDB4MDAwMCwgMHgyMTQ0LCAweDAwMDAsIDB4MjE0NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgyMTQ4LCAweDAwMDAsIDB4MjE0QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIxNEMsIDB4MjE0RSwgMHgyMTUwLAotICAgIDB4MjE1MiwgMHgyMTU0LCAweDAwMDAsIDB4MDAwMCwgMHgyMTU2LCAweDIxNTgsIDB4MDAwMCwgMHgwMDAwLCAweDIxNUEsIDB4MjE1QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDIxNUUsIDB4MjE2MCwgMHgwMDAwLCAweDAwMDAsIDB4MjE2MiwgMHgyMTY0LCAweDAwMDAsIDB4MDAwMCwgMHgyMTY2LCAweDIxNjgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjE2QSwgMHgyMTZDLCAweDIxNkUsIDB4MjE3MCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDIxNzIsIDB4MjE3NCwgMHgyMTc2LCAweDIxNzgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjE3QSwgMHgyMTdDLCAweDIxN0UsIDB4MjE4MCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NTMzLCAweDg1MzQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDMwNjksIDB4MzA2QywgMHgzMDZGLCAweDMwNzIsIDB4MzA3NSwgMHgzMDc4LCAweDMwN0IsIDB4MzA3RSwgMHgyMTgyLCAweDIxODQsIDB4MjE4NiwgMHgyMTg4LCAweDIxOEEsIDB4MjE4QywgMHgyMThFLCAweDIxOTAsCi0gICAgMHgzMDgxLCAweDMwODQsIDB4MzA4NywgMHgzMDhBLCAweDMwOEQsIDB4MzA5MCwgMHgzMDkzLCAweDMwOTYsIDB4MzA5OSwgMHgyMTkyLCAweDMwOUMsIDB4MzA5RiwgMHgyMTk0LCAweDIxOTYsIDB4MjE5OCwgMHgyMTlBLAotICAgIDB4MjE5QywgMHgzMEEyLCAweDg1MzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDg1MzYsIDB4ODUzNywgMHg4NTM4LCAweDg1MzksIDB4ODUzQSwgMHg4NTNCLCAweDg1M0MsIDB4ODUzRCwgMHg4NTNFLCAweDIxOUUsIDB4MjFBMCwgMHgyMUEyLCAweDIxQTQsIDB4MjFBNiwgMHgyMUE4LCAweDIxQUEsCi0gICAgMHgyMUFDLCAweDIxQUUsIDB4MjFCMCwgMHgyMUIyLCAweDMwQTUsIDB4MzBBOCwgMHgzMEFCLCAweDMwQUUsIDB4MzBCMSwgMHgzMEI0LCAweDMwQjcsIDB4MzBCQSwgMHgzMEJELCAweDQwMTQsIDB4NDAxOSwgMHg0MDFFLAotICAgIDB4NDAyMywgMHg0MDI4LCAweDQwMkQsIDB4NDAzMiwgMHg0MDM3LCAweDQwM0MsIDB4NDA0MSwgMHg0MDQ2LCAweDIxQjQsIDB4MjFCNiwgMHgyMUI4LCAweDIxQkEsIDB4MjFCQywgMHgyMUJFLCAweDIxQzAsIDB4MjFDMiwKLSAgICAweDIxQzQsIDB4MzBDMCwgMHgzMEMzLCAweDMwQzYsIDB4MzBDOSwgMHgzMENDLCAweDMwQ0YsIDB4MzBEMiwgMHgzMEQ1LCAweDMwRDgsIDB4MzBEQiwgMHgzMERFLCAweDMwRTEsIDB4MzBFNCwgMHgzMEU3LCAweDMwRUEsCi0gICAgMHgzMEVELCAweDMwRjAsIDB4MzBGMywgMHgzMEY2LCAweDMwRjksIDB4MzBGQywgMHgzMEZGLCAweDMxMDIsIDB4MzEwNSwgMHgzMTA4LCAweDMxMEIsIDB4MzEwRSwgMHgzMTExLCAweDMxMTQsIDB4MzExNywgMHgzMTFBLAotICAgIDB4MzExRCwgMHgzMTIwLCAweDMxMjMsIDB4MzEyNiwgMHgzMTI5LCAweDMxMkMsIDB4ODUzRiwgMHg4NTQwLCAweDg1NDEsIDB4ODU0MiwgMHg4NTQzLCAweDg1NDQsIDB4ODU0NSwgMHg4NTQ2LCAweDg1NDcsIDB4ODU0OCwKLSAgICAweDg1NDksIDB4ODU0QSwgMHg4NTRCLCAweDg1NEMsIDB4ODU0RCwgMHg4NTRFLCAweDg1NEYsIDB4ODU1MCwgMHg4NTUxLCAweDg1NTIsIDB4ODU1MywgMHg4NTU0LCAweDg1NTUsIDB4ODU1NiwgMHg4NTU3LCAweDg1NTgsCi0gICAgMHg4NTU5LCAweDg1NUEsIDB4ODU1QiwgMHg4NTVDLCAweDg1NUQsIDB4ODU1RSwgMHg4NTVGLCAweDg1NjAsIDB4ODU2MSwgMHg4NTYyLCAweDg1NjMsIDB4ODU2NCwgMHg4NTY1LCAweDg1NjYsIDB4ODU2NywgMHg4NTY4LAotICAgIDB4ODU2OSwgMHg4NTZBLCAweDg1NkIsIDB4ODU2QywgMHg4NTZELCAweDg1NkUsIDB4ODU2RiwgMHg4NTcwLCAweDg1NzEsIDB4ODU3MiwgMHg4NTczLCAweDIxQzYsIDB4MjFDOCwgMHgyMUNBLCAweDIxQ0MsIDB4MjFDRSwKLSAgICAweDIxRDAsIDB4MjFEMiwgMHgyMUQ0LCAweDIxRDYsIDB4MjFEOCwgMHg4NTc0LCAweDg1NzUsIDB4ODU3NiwgMHg4NTc3LCAweDg1NzgsIDB4ODU3OSwgMHg4NTdBLCAweDg1N0IsIDB4ODU3QywgMHgyMURBLCAweDg1N0QsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NTdFLCAweDg1N0YsIDB4ODU4MCwgMHg4NTgxLCAweDg1ODIsIDB4ODU4MywgMHg4NTg0LCAweDg1ODUsIDB4ODU4NiwgMHgyMURDLAotICAgIDB4ODU4NywgMHg4NTg4LCAweDg1ODksIDB4ODU4QSwgMHg4NThCLCAweDg1OEMsIDB4ODU4RCwgMHg4NThFLCAweDg1OEYsIDB4MjFERSwgMHg4NTkwLCAweDg1OTEsIDB4ODU5MiwgMHg4NTkzLCAweDg1OTQsIDB4ODU5NSwKLSAgICAweDg1OTYsIDB4ODU5NywgMHg4NTk4LCAweDIxRTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDQwNEIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDMxMkYsIDB4MjFFMiwgMHgzMTMyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMUU0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODU5OSwgMHg4NTlBLCAweDg1OUIsIDB4ODU5QywgMHg4NTlELCAweDg1OUUsIDB4ODU5RiwgMHg4NUEwLCAweDg1QTEsIDB4ODVBMiwgMHg4NUEzLCAweDg1QTQsIDB4ODVBNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ODVBNiwgMHg4NUE3LCAweDg1QTgsIDB4ODVBOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg1QUEsIDB4ODVBQiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg1QUMsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NUFELAotICAgIDB4ODVBRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDg1QUYsIDB4MDAwMCwgMHgwMDAwLCAweDg1QjAsIDB4MDAwMCwgMHg4NUIxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4NUIyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg1QjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NUI0LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg1QjUsIDB4ODVCNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NUI3LCAweDg1QjgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NUI5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODVCQSwgMHg4NUJCLCAweDg1QkMsIDB4ODVCRCwgMHg4NUJFLCAweDg1QkYsIDB4ODVDMCwgMHg4NUMxLCAweDg1QzIsIDB4ODVDMywgMHg4NUM0LCAweDg1QzUsIDB4ODVDNiwgMHg4NUM3LCAweDg1QzgsIDB4ODVDOSwKLSAgICAweDg1Q0EsIDB4ODVDQiwgMHg4NUNDLCAweDg1Q0QsIDB4ODVDRSwgMHg4NUNGLCAweDg1RDAsIDB4ODVEMSwgMHg4NUQyLCAweDg1RDMsIDB4ODVENCwgMHg4NUQ1LCAweDg1RDYsIDB4ODVENywgMHg4NUQ4LCAweDg1RDksCi0gICAgMHg4NURBLCAweDg1REIsIDB4ODVEQywgMHg4NURELCAweDg1REUsIDB4ODVERiwgMHg4NUUwLCAweDg1RTEsIDB4ODVFMiwgMHg4NUUzLCAweDg1RTQsIDB4ODVFNSwgMHg4NUU2LCAweDg1RTcsIDB4ODVFOCwgMHg4NUU5LAotICAgIDB4ODVFQSwgMHg4NUVCLCAweDg1RUMsIDB4ODVFRCwgMHg4NUVFLCAweDg1RUYsIDB4ODVGMCwgMHg4NUYxLCAweDg1RjIsIDB4ODVGMywgMHg4NUY0LCAweDg1RjUsIDB4ODVGNiwgMHg4NUY3LCAweDg1RjgsIDB4ODVGOSwKLSAgICAweDg1RkEsIDB4ODVGQiwgMHg4NUZDLCAweDg1RkQsIDB4ODVGRSwgMHg4NUZGLCAweDg2MDAsIDB4ODYwMSwgMHg4NjAyLCAweDg2MDMsIDB4ODYwNCwgMHg4NjA1LCAweDg2MDYsIDB4ODYwNywgMHg4NjA4LCAweDg2MDksCi0gICAgMHg4NjBBLCAweDg2MEIsIDB4ODYwQywgMHg4NjBELCAweDg2MEUsIDB4ODYwRiwgMHg4NjEwLCAweDg2MTEsIDB4ODYxMiwgMHg4NjEzLCAweDg2MTQsIDB4ODYxNSwgMHg4NjE2LCAweDg2MTcsIDB4ODYxOCwgMHg4NjE5LAotICAgIDB4ODYxQSwgMHg4NjFCLCAweDg2MUMsIDB4ODYxRCwgMHg4NjFFLCAweDg2MUYsIDB4ODYyMCwgMHg4NjIxLCAweDg2MjIsIDB4ODYyMywgMHg4NjI0LCAweDg2MjUsIDB4ODYyNiwgMHg4NjI3LCAweDg2MjgsIDB4ODYyOSwKLSAgICAweDg2MkEsIDB4ODYyQiwgMHg4NjJDLCAweDg2MkQsIDB4ODYyRSwgMHg4NjJGLCAweDg2MzAsIDB4ODYzMSwgMHg4NjMyLCAweDg2MzMsIDB4ODYzNCwgMHg4NjM1LCAweDg2MzYsIDB4ODYzNywgMHg4NjM4LCAweDg2MzksCi0gICAgMHg4NjNBLCAweDg2M0IsIDB4ODYzQywgMHg4NjNELCAweDg2M0UsIDB4ODYzRiwgMHg4NjQwLCAweDg2NDEsIDB4ODY0MiwgMHg4NjQzLCAweDg2NDQsIDB4ODY0NSwgMHg4NjQ2LCAweDg2NDcsIDB4ODY0OCwgMHg4NjQ5LAotICAgIDB4ODY0QSwgMHg4NjRCLCAweDg2NEMsIDB4ODY0RCwgMHg4NjRFLCAweDg2NEYsIDB4ODY1MCwgMHg4NjUxLCAweDg2NTIsIDB4ODY1MywgMHg4NjU0LCAweDg2NTUsIDB4ODY1NiwgMHg4NjU3LCAweDg2NTgsIDB4ODY1OSwKLSAgICAweDg2NUEsIDB4ODY1QiwgMHg4NjVDLCAweDg2NUQsIDB4ODY1RSwgMHg4NjVGLCAweDg2NjAsIDB4ODY2MSwgMHg4NjYyLCAweDg2NjMsIDB4ODY2NCwgMHg4NjY1LCAweDg2NjYsIDB4ODY2NywgMHg4NjY4LCAweDg2NjksCi0gICAgMHg4NjZBLCAweDg2NkIsIDB4ODY2QywgMHg4NjZELCAweDg2NkUsIDB4ODY2RiwgMHg4NjcwLCAweDg2NzEsIDB4ODY3MiwgMHg4NjczLCAweDg2NzQsIDB4ODY3NSwgMHg4Njc2LCAweDg2NzcsIDB4ODY3OCwgMHg4Njc5LAotICAgIDB4ODY3QSwgMHg4NjdCLCAweDg2N0MsIDB4ODY3RCwgMHg4NjdFLCAweDg2N0YsIDB4ODY4MCwgMHg4NjgxLCAweDg2ODIsIDB4ODY4MywgMHg4Njg0LCAweDg2ODUsIDB4ODY4NiwgMHg4Njg3LCAweDg2ODgsIDB4ODY4OSwKLSAgICAweDg2OEEsIDB4ODY4QiwgMHg4NjhDLCAweDg2OEQsIDB4ODY4RSwgMHg4NjhGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDg2OTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg2OTEsIDB4MDAwMCwgMHg4NjkyLCAweDg2OTMsIDB4ODY5NCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMUU2LCAweDAwMDAsIDB4MjFFOCwgMHgwMDAwLAotICAgIDB4MjFFQSwgMHgwMDAwLCAweDIxRUMsIDB4MDAwMCwgMHgyMUVFLCAweDAwMDAsIDB4MjFGMCwgMHgwMDAwLCAweDIxRjIsIDB4MDAwMCwgMHgyMUY0LCAweDAwMDAsIDB4MjFGNiwgMHgwMDAwLCAweDIxRjgsIDB4MDAwMCwKLSAgICAweDIxRkEsIDB4MDAwMCwgMHgyMUZDLCAweDAwMDAsIDB4MDAwMCwgMHgyMUZFLCAweDAwMDAsIDB4MjIwMCwgMHgwMDAwLCAweDIyMDIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgyMjA0LCAweDIyMDYsIDB4MDAwMCwgMHgyMjA4LCAweDIyMEEsIDB4MDAwMCwgMHgyMjBDLCAweDIyMEUsIDB4MDAwMCwgMHgyMjEwLCAweDIyMTIsIDB4MDAwMCwgMHgyMjE0LCAweDIyMTYsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjIxOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMjFBLCAweDIyMUMsIDB4MDAwMCwgMHgyMjFFLCAweDIyMjAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMjIyLCAweDAwMDAsIDB4MjIyNCwgMHgwMDAwLAotICAgIDB4MjIyNiwgMHgwMDAwLCAweDIyMjgsIDB4MDAwMCwgMHgyMjJBLCAweDAwMDAsIDB4MjIyQywgMHgwMDAwLCAweDIyMkUsIDB4MDAwMCwgMHgyMjMwLCAweDAwMDAsIDB4MjIzMiwgMHgwMDAwLCAweDIyMzQsIDB4MDAwMCwKLSAgICAweDIyMzYsIDB4MDAwMCwgMHgyMjM4LCAweDAwMDAsIDB4MDAwMCwgMHgyMjNBLCAweDAwMDAsIDB4MjIzQywgMHgwMDAwLCAweDIyM0UsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgyMjQwLCAweDIyNDIsIDB4MDAwMCwgMHgyMjQ0LCAweDIyNDYsIDB4MDAwMCwgMHgyMjQ4LCAweDIyNEEsIDB4MDAwMCwgMHgyMjRDLCAweDIyNEUsIDB4MDAwMCwgMHgyMjUwLCAweDIyNTIsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjI1NCwgMHgwMDAwLCAweDAwMDAsIDB4MjI1NiwgMHgyMjU4LCAweDIyNUEsIDB4MjI1QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMjVFLCAweDIyNjAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDg2OTUsIDB4ODY5NiwgMHg4Njk3LCAweDg2OTgsIDB4ODY5OSwgMHg4NjlBLCAweDg2OUIsIDB4ODY5QywgMHg4NjlELCAweDg2OUUsIDB4ODY5RiwgMHg4NkEwLCAweDg2QTEsIDB4ODZBMiwgMHg4NkEzLAotICAgIDB4ODZBNCwgMHg4NkE1LCAweDg2QTYsIDB4ODZBNywgMHg4NkE4LCAweDg2QTksIDB4ODZBQSwgMHg4NkFCLCAweDg2QUMsIDB4ODZBRCwgMHg4NkFFLCAweDg2QUYsIDB4ODZCMCwgMHg4NkIxLCAweDg2QjIsIDB4ODZCMywKLSAgICAweDg2QjQsIDB4ODZCNSwgMHg4NkI2LCAweDg2QjcsIDB4ODZCOCwgMHg4NkI5LCAweDg2QkEsIDB4ODZCQiwgMHg4NkJDLCAweDg2QkQsIDB4ODZCRSwgMHg4NkJGLCAweDg2QzAsIDB4ODZDMSwgMHg4NkMyLCAweDg2QzMsCi0gICAgMHg4NkM0LCAweDg2QzUsIDB4ODZDNiwgMHg4NkM3LCAweDg2QzgsIDB4ODZDOSwgMHg4NkNBLCAweDg2Q0IsIDB4ODZDQywgMHg4NkNELCAweDg2Q0UsIDB4ODZDRiwgMHg4NkQwLCAweDg2RDEsIDB4ODZEMiwgMHg4NkQzLAotICAgIDB4ODZENCwgMHg4NkQ1LCAweDg2RDYsIDB4ODZENywgMHg4NkQ4LCAweDg2RDksIDB4ODZEQSwgMHg4NkRCLCAweDg2REMsIDB4ODZERCwgMHg4NkRFLCAweDg2REYsIDB4ODZFMCwgMHg4NkUxLCAweDg2RTIsIDB4ODZFMywKLSAgICAweDg2RTQsIDB4ODZFNSwgMHg4NkU2LCAweDg2RTcsIDB4ODZFOCwgMHg4NkU5LCAweDg2RUEsIDB4ODZFQiwgMHg4NkVDLCAweDg2RUQsIDB4ODZFRSwgMHg4NkVGLCAweDg2RjAsIDB4ODZGMSwgMHg4NkYyLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODZGMywgMHg4NkY0LCAweDg2RjUsIDB4ODZGNiwgMHg4NkY3LCAweDg2RjgsIDB4ODZGOSwgMHg4NkZBLCAweDg2RkIsIDB4ODZGQywgMHg4NkZELCAweDg2RkUsIDB4ODZGRiwgMHg4NzAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MzEzNSwgMHgzMTM4LCAweDMxM0IsIDB4MzEzRSwgMHgzMTQxLCAweDMxNDQsIDB4MzE0NywgMHgzMTRBLCAweDMxNEQsIDB4MzE1MCwgMHgzMTUzLCAweDMxNTYsIDB4MzE1OSwgMHgzMTVDLCAweDQwNTAsIDB4NDA1NSwKLSAgICAweDQwNUEsIDB4NDA1RiwgMHg0MDY0LCAweDQwNjksIDB4NDA2RSwgMHg0MDczLCAweDQwNzgsIDB4NDA3RCwgMHg0MDgyLCAweDQwODcsIDB4NDA4QywgMHg0MDkxLCAweDQwOTYsIDB4NDA5QiwgMHg0MEEzLCAweDAwMDAsCi0gICAgMHgzMTVGLCAweDMxNjIsIDB4MzE2NSwgMHgzMTY4LCAweDMxNkIsIDB4MzE2RSwgMHgzMTcxLCAweDMxNzQsIDB4MzE3NywgMHgzMTdBLCAweDMxN0QsIDB4MzE4MCwgMHgzMTgzLCAweDMxODYsIDB4MzE4OSwgMHgzMThDLAotICAgIDB4MzE4RiwgMHgzMTkyLCAweDMxOTUsIDB4MzE5OCwgMHgzMTlCLCAweDMxOUUsIDB4MzFBMSwgMHgzMUE0LCAweDMxQTcsIDB4MzFBQSwgMHgzMUFELCAweDMxQjAsIDB4MzFCMywgMHgzMUI2LCAweDMxQjksIDB4MzFCQywKLSAgICAweDMxQkYsIDB4MzFDMiwgMHgzMUM1LCAweDMxQzgsIDB4ODcwMSwgMHg4NzAyLCAweDg3MDMsIDB4ODcwNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgzMUNCLCAweDIyNjIsIDB4MjI2NCwgMHgyMjY2LCAweDIyNjgsIDB4MjI2QSwgMHgyMjZDLCAweDIyNkUsIDB4MjI3MCwgMHgyMjcyLCAweDIyNzQsIDB4MjI3NiwgMHgyMjc4LCAweDIyN0EsIDB4MjI3QywgMHgyMjdFLAotICAgIDB4ODcwNSwgMHg4NzA2LCAweDg3MDcsIDB4ODcwOCwgMHg4NzA5LCAweDg3MEEsIDB4ODcwQiwgMHg4NzBDLCAweDg3MEQsIDB4ODcwRSwgMHg4NzBGLCAweDg3MTAsIDB4ODcxMSwgMHg4NzEyLCAweDIyODAsIDB4MjI4MiwKLSAgICAweDIyODQsIDB4MjI4NiwgMHgyMjg4LCAweDIyOEEsIDB4MjI4QywgMHgyMjhFLCAweDIyOTAsIDB4MjI5MiwgMHgyMjk0LCAweDIyOTYsIDB4MjI5OCwgMHgyMjlBLCAweDQwQUEsIDB4NDBCMCwgMHgyMjlDLCAweDAwMDAsCi0gICAgMHg4NzEzLCAweDg3MTQsIDB4ODcxNSwgMHg4NzE2LCAweDg3MTcsIDB4ODcxOCwgMHg4NzE5LCAweDg3MUEsIDB4ODcxQiwgMHg4NzFDLCAweDg3MUQsIDB4ODcxRSwgMHg4NzFGLCAweDg3MjAsIDB4ODcyMSwgMHg4NzIyLAotICAgIDB4ODcyMywgMHg4NzI0LCAweDg3MjUsIDB4ODcyNiwgMHg4NzI3LCAweDg3MjgsIDB4ODcyOSwgMHg4NzJBLCAweDg3MkIsIDB4ODcyQywgMHg4NzJELCAweDg3MkUsIDB4ODcyRiwgMHg4NzMwLCAweDg3MzEsIDB4ODczMiwKLSAgICAweDg3MzMsIDB4ODczNCwgMHg4NzM1LCAweDg3MzYsIDB4ODczNywgMHg4NzM4LCAweDg3MzksIDB4ODczQSwgMHg4NzNCLCAweDg3M0MsIDB4ODczRCwgMHg4NzNFLCAweDg3M0YsIDB4ODc0MCwgMHg4NzQxLCAweDg3NDIsCi0gICAgMHg4NzQzLCAweDIyOUUsIDB4MjJBMCwgMHgyMkEyLCAweDIyQTQsIDB4MjJBNiwgMHgyMkE4LCAweDIyQUEsIDB4MjJBQywgMHgyMkFFLCAweDIyQjAsIDB4MjJCMiwgMHgyMkI0LCAweDIyQjYsIDB4MjJCOCwgMHgyMkJBLAotICAgIDB4MjJCQywgMHgyMkJFLCAweDIyQzAsIDB4MjJDMiwgMHgyMkM0LCAweDIyQzYsIDB4MjJDOCwgMHgyMkNBLCAweDIyQ0MsIDB4MzFDRSwgMHgzMUQxLCAweDMxRDQsIDB4MjJDRSwgMHgzMUQ3LCAweDIyRDAsIDB4MzFEQSwKLSAgICAweDg3NDQsIDB4ODc0NSwgMHg4NzQ2LCAweDg3NDcsIDB4ODc0OCwgMHg4NzQ5LCAweDg3NEEsIDB4ODc0QiwgMHg4NzRDLCAweDg3NEQsIDB4ODc0RSwgMHg4NzRGLCAweDg3NTAsIDB4ODc1MSwgMHg4NzUyLCAweDg3NTMsCi0gICAgMHg4NzU0LCAweDg3NTUsIDB4ODc1NiwgMHg4NzU3LCAweDg3NTgsIDB4ODc1OSwgMHg4NzVBLCAweDg3NUIsIDB4ODc1QywgMHg4NzVELCAweDg3NUUsIDB4ODc1RiwgMHg4NzYwLCAweDg3NjEsIDB4ODc2MiwgMHg4NzYzLAotICAgIDB4ODc2NCwgMHg4NzY1LCAweDg3NjYsIDB4ODc2NywgMHg4NzY4LCAweDg3NjksIDB4ODc2QSwgMHg4NzZCLCAweDg3NkMsIDB4ODc2RCwgMHg4NzZFLCAweDg3NkYsIDB4ODc3MCwgMHg4NzcxLCAweDg3NzIsIDB4MDAwMCwKLSAgICAweDQwQjUsIDB4NDBCQSwgMHg0MEJGLCAweDMxREQsIDB4NDBDNCwgMHgzMUUwLCAweDMxRTMsIDB4NDBDOSwgMHg0MENGLCAweDMxRTYsIDB4MzFFOSwgMHgzMUVDLCAweDQwRDQsIDB4NDBEOSwgMHgzMUVGLCAweDMxRjIsCi0gICAgMHgyMkQyLCAweDMxRjUsIDB4NDBERSwgMHg0MEUzLCAweDIyRDQsIDB4NDBFOCwgMHg0MEVFLCAweDQwRjUsIDB4MzFGOCwgMHg0MEZCLCAweDQxMDEsIDB4NDEwNywgMHgzMUZCLCAweDMxRkUsIDB4MzIwMSwgMHg0MTBDLAotICAgIDB4NDExMSwgMHg0MTE3LCAweDMyMDQsIDB4MzIwNywgMHgzMjBBLCAweDIyRDYsIDB4MjJEOCwgMHgyMkRBLCAweDIyREMsIDB4MzIwRCwgMHgzMjEwLCAweDQxMUMsIDB4MzIxMywgMHg0MTIyLCAweDQxMjcsIDB4MzIxNiwKLSAgICAweDIyREUsIDB4MjJFMCwgMHg0MTJELCAweDQxMzMsIDB4NDEzOCwgMHgzMjE5LCAweDQxM0UsIDB4MjJFMiwgMHgzMjFDLCAweDMyMUYsIDB4MzIyMiwgMHgzMjI1LCAweDMyMjgsIDB4NDE0NCwgMHgzMjJCLCAweDIyRTQsCi0gICAgMHgzMjJFLCAweDMyMzEsIDB4MzIzNCwgMHg0MTQ5LCAweDMyMzcsIDB4MzIzQSwgMHgzMjNELCAweDQxNEUsIDB4NDE1NCwgMHgyMkU2LCAweDQxNTksIDB4MjJFOCwgMHg0MTVGLCAweDQxNjQsIDB4MzI0MCwgMHgzMjQzLAotICAgIDB4MzI0NiwgMHg0MTY5LCAweDIyRUEsIDB4MzI0OSwgMHg0MTZFLCAweDIyRUMsIDB4NDE3MywgMHgzMjRDLCAweDIyRUUsIDB4MjJGMCwgMHgyMkYyLCAweDIyRjQsIDB4MjJGNiwgMHgyMkY4LCAweDIyRkEsIDB4MjJGQywKLSAgICAweDIyRkUsIDB4MjMwMCwgMHgzMjRGLCAweDMyNTIsIDB4MzI1NSwgMHgzMjU4LCAweDMyNUIsIDB4MzI1RSwgMHgzMjYxLCAweDMyNjQsIDB4MzI2NywgMHgzMjZBLCAweDMyNkQsIDB4MzI3MCwgMHgzMjczLCAweDMyNzYsCi0gICAgMHgzMjc5LCAweDMyN0MsIDB4MjMwMiwgMHgyMzA0LCAweDMyN0YsIDB4MjMwNiwgMHgyMzA4LCAweDIzMEEsIDB4MzI4MiwgMHgzMjg1LCAweDIzMEMsIDB4MjMwRSwgMHgyMzEwLCAweDIzMTIsIDB4MjMxNCwgMHg0MTc5LAotICAgIDB4MjMxNiwgMHgyMzE4LCAweDIzMUEsIDB4MjMxQywgMHgyMzFFLCAweDIzMjAsIDB4MjMyMiwgMHgyMzI0LCAweDMyODgsIDB4NDE3RSwgMHgyMzI2LCAweDIzMjgsIDB4MjMyQSwgMHgyMzJDLCAweDIzMkUsIDB4MjMzMCwKLSAgICAweDIzMzIsIDB4MzI4QiwgMHgzMjhFLCAweDMyOTEsIDB4MzI5NCwgMHgyMzM0LCAweDIzMzYsIDB4MjMzOCwgMHgyMzNBLCAweDIzM0MsIDB4MjMzRSwgMHgyMzQwLCAweDIzNDIsIDB4MjM0NCwgMHgyMzQ2LCAweDMyOTcsCi0gICAgMHgzMjlBLCAweDIzNDgsIDB4MzI5RCwgMHgzMkEwLCAweDMyQTMsIDB4MjM0QSwgMHgzMkE2LCAweDMyQTksIDB4NDE4MywgMHgyMzRDLCAweDMyQUMsIDB4MzJBRiwgMHgzMkIyLCAweDMyQjUsIDB4NDE4OCwgMHg0MThFLAotICAgIDB4MjM0RSwgMHgyMzUwLCAweDIzNTIsIDB4MjM1NCwgMHgyMzU2LCAweDIzNTgsIDB4MjM1QSwgMHgyMzVDLCAweDIzNUUsIDB4MjM2MCwgMHgyMzYyLCAweDIzNjQsIDB4MjM2NiwgMHgyMzY4LCAweDIzNkEsIDB4MjM2QywKLSAgICAweDIzNkUsIDB4MjM3MCwgMHg0MTk1LCAweDIzNzIsIDB4MjM3NCwgMHgyMzc2LCAweDQxOUEsIDB4MzJCOCwgMHgyMzc4LCAweDIzN0EsIDB4MjM3QywgMHgyMzdFLCAweDIzODAsIDB4MjM4MiwgMHgyMzg0LCAweDIzODYsCi0gICAgMHgyMzg4LCAweDIzOEEsIDB4MzJCQiwgMHgyMzhDLCAweDIzOEUsIDB4MzJCRSwgMHgzMkMxLCAweDIzOTAsIDB4NDE5RiwgMHgzMkM0LCAweDIzOTIsIDB4MjM5NCwgMHgyMzk2LCAweDIzOTgsIDB4MzJDNywgMHgzMkNBLAotICAgIDB4MjM5QSwgMHgyMzlDLCAweDIzOUUsIDB4MjNBMCwgMHgyM0EyLCAweDIzQTQsIDB4MjNBNiwgMHgyM0E4LCAweDIzQUEsIDB4MzJDRCwgMHgzMkQwLCAweDMyRDMsIDB4MzJENiwgMHgzMkQ5LCAweDMyREMsIDB4MzJERiwKLSAgICAweDMyRTIsIDB4MzJFNSwgMHgzMkU4LCAweDMyRUIsIDB4MzJFRSwgMHgzMkYxLCAweDMyRjQsIDB4MzJGNywgMHgzMkZBLCAweDMyRkQsIDB4MzMwMCwgMHgzMzAzLCAweDMzMDYsIDB4MzMwOSwgMHgzMzBDLCAweDMzMEYsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NzczLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc3NCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc3NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc3NiwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDg3NzcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3NzgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Nzc5LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NzdBLCAweDg3N0IsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc3QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3N0QsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3N0UsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDg3N0YsIDB4ODc4MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDg3ODEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODc4MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc4MywgMHgwMDAwLCAweDAwMDAsIDB4ODc4NCwgMHgwMDAwLCAweDg3ODUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ODc4NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc4NywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3ODgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc4OSwgMHg4NzhBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc4QiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4NzhDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc4RCwgMHgwMDAwLCAweDg3OEUsIDB4ODc4RiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4NzkwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc5MSwgMHgwMDAwLCAweDg3OTIsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NzkzLCAweDg3OTQsIDB4ODc5NSwgMHgwMDAwLCAweDg3OTYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc5NywgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDg3OTgsIDB4MDAwMCwgMHgwMDAwLCAweDg3OTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc5QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ODc5QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NzlDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc5RCwgMHgwMDAwLCAweDAwMDAsIDB4ODc5RSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4NzlGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdBMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDg3QTEsIDB4MDAwMCwgMHg4N0EyLCAweDAwMDAsIDB4ODdBMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4N0E1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QTYsIDB4ODdBNywgMHgwMDAwLCAweDAwMDAsIDB4ODdBOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0E5LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0FBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4N0FCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdBQywgMHgwMDAwLCAweDAwMDAsIDB4ODdBRCwgMHg4N0FFLCAweDg3QUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0IxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDg3QjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0IzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdCNCwgMHgwMDAwLCAweDg3QjUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0I2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ODdCNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0I4LCAweDg3QjksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdCQSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0JCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ODdCQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0JELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdCRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0JGLCAweDAwMDAsIDB4MDAwMCwgMHg4N0MwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QzEsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0MyLCAweDAwMDAsIDB4ODdDMywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdDNCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0M1LCAweDg3QzYsIDB4MDAwMCwgMHg4N0M3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QzgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdDOSwgMHgwMDAwLCAweDg3Q0EsIDB4ODdDQiwgMHgwMDAwLCAweDg3Q0MsIDB4ODdDRCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDg3Q0UsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDg3Q0YsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3RDAsIDB4MDAwMCwgMHg4N0QxLCAweDAwMDAsIDB4ODdEMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0QzLCAweDg3RDQsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4N0Q1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDg3RDYsIDB4MDAwMCwgMHg4N0Q3LCAweDAwMDAsIDB4ODdEOCwgMHgwMDAwLCAweDAwMDAsIDB4ODdEOSwgMHgwMDAwLCAweDAwMDAsIDB4ODdEQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3REIsIDB4MDAwMCwgMHg4N0RDLAotICAgIDB4MDAwMCwgMHg4N0RELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDg3REUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3REYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3RTAsIDB4MDAwMCwgMHg4N0UxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdFMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdFMywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODdFNCwgMHgwMDAwLCAweDg3RTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdFNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODdFNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODdFOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3RTksIDB4MDAwMCwgMHgwMDAwLCAweDg3RUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODdFQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4N0VDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdFRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3RUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdFRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdGMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0YxLCAweDg3RjIsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3RjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0Y0LCAweDAwMDAsIDB4ODdGNSwgMHgwMDAwLCAweDg3RjYsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4N0Y3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0Y4LCAweDg3RjksIDB4MDAwMCwgMHgwMDAwLCAweDg3RkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdGQiwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0ZDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3RkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0ZFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgwMSwgMHgwMDAwLCAweDg4MDIsIDB4ODgwMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODA1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgwNiwgMHg4ODA3LAotICAgIDB4ODgwOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MDksIDB4MDAwMCwgMHgwMDAwLCAweDg4MEEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODBCLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ODgwQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODBELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MEUsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODgwRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MTAsIDB4ODgxMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgxMiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4ODEzLCAweDAwMDAsIDB4ODgxNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODE1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4ODE2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MTcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODE4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODgxOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgxQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MUMsIDB4MDAwMCwgMHg4ODFELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODgxRSwgMHg4ODFGLCAweDg4MjAsIDB4MDAwMCwgMHg4ODIxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODgyMiwgMHg4ODIzLCAweDg4MjQsIDB4MDAwMCwgMHgwMDAwLCAweDg4MjUsIDB4MDAwMCwgMHgwMDAwLCAweDg4MjYsIDB4ODgyNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ODgyOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MjksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgyQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODJCLCAweDAwMDAsIDB4ODgyQywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODgyRCwgMHg4ODJFLCAweDAwMDAsIDB4MDAwMCwgMHg4ODJGLCAweDAwMDAsIDB4ODgzMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4ODMxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgzMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgzMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MzQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODM1LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MzYsCi0gICAgMHgwMDAwLCAweDg4MzcsIDB4MDAwMCwgMHgwMDAwLCAweDg4MzgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODM5LCAweDg4M0EsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgzQiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4ODNDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgzRCwgMHgwMDAwLCAweDAwMDAsIDB4ODgzRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODgzRiwgMHgwMDAwLCAweDg4NDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg0MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg0MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODQ0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NDUsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NDYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODQ3LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg0OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NEEsIDB4ODg0QiwgMHg4ODRDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NEQsIDB4ODg0RSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4ODRGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NTEsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NTIsIDB4MDAwMCwgMHg4ODUzLCAweDg4NTQsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4ODU1LCAweDAwMDAsIDB4ODg1NiwgMHgwMDAwLCAweDAwMDAsIDB4ODg1NywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NTgsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4ODU5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODVBLCAweDAwMDAsIDB4ODg1QiwgMHg4ODVDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NUQsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODVGLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODYwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODYxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg2MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDg4NjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NjQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg2NSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NjYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODY3LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg2OCwgMHg4ODY5LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODZCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODZDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NkQsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg2RSwgMHgwMDAwLCAweDAwMDAsIDB4ODg2RiwgMHg4ODcwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg3MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ODg3MiwgMHgwMDAwLCAweDAwMDAsIDB4ODg3MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg3NCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4ODc1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg3NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg3NywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg3OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NzksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg3QSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4N0IsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4ODdDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4N0QsIDB4ODg3RSwgMHgwMDAwLCAweDg4N0YsIDB4MDAwMCwgMHg4ODgwLCAweDg4ODEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg4MiwgMHg4ODgzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODg0LCAweDg4ODUsIDB4MDAwMCwgMHgwMDAwLCAweDg4ODYsIDB4MDAwMCwgMHg4ODg3LCAweDg4ODgsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODg5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4OEEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg4QiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODhDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4OEQsIDB4MDAwMCwgMHg4ODhFLCAweDAwMDAsIDB4MDAwMCwgMHg4ODhGLCAweDg4OTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg5MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ODg5MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODkzLCAweDAwMDAsIDB4ODg5NCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODk1LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg5NiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4OTcsIDB4MDAwMCwgMHg4ODk4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4OTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODg5QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4ODlCLCAweDAwMDAsIDB4MDAwMCwgMHg4ODlDLCAweDAwMDAsIDB4MDAwMCwgMHg4ODlELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg5RSwgMHgwMDAwLCAweDAwMDAsIDB4ODg5RiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4OEEwLCAweDAwMDAsIDB4ODhBMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhBMywgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEE0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QTUsIDB4MDAwMCwgMHg4OEE2LCAweDAwMDAsIDB4ODhBNywgMHg4OEE4LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEE5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODhBQSwgMHgwMDAwLCAweDg4QUIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDg4QUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEFELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEFFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEFGLCAweDAwMDAsIDB4MDAwMCwgMHg4OEIwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODhCMSwgMHgwMDAwLCAweDAwMDAsIDB4ODhCMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhCMywgMHg4OEI0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QjUsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEI2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhCNywgMHg4OEI4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhCOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QkEsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QkIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDg4QkMsIDB4ODhCRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhCRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEJGLCAweDAwMDAsIDB4MDAwMCwgMHg4OEMwLCAweDAwMDAsIDB4ODhDMSwKLSAgICAweDg4QzIsIDB4ODhDMywgMHg4OEM0LCAweDg4QzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QzYsIDB4MDAwMCwgMHgwMDAwLCAweDg4QzcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEM4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4OEM5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhDQSwgMHgwMDAwLCAweDg4Q0IsIDB4MDAwMCwgMHg4OENDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OENELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4Q0UsIDB4MDAwMCwgMHg4OENGLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEQxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4OEQyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RDMsIDB4MDAwMCwKLSAgICAweDg4RDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RDUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhENiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEQ3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEQ4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEQ5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4REEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4REIsIDB4ODhEQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4OERELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ODhERSwgMHg4OERGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEUwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RTEsIDB4ODhFMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEUzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RTQsIDB4MDAwMCwgMHgwMDAwLCAweDg4RTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhFNiwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RTcsIDB4MDAwMCwgMHg4OEU4LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEU5LCAweDAwMDAsIDB4ODhFQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RUIsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEVDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RUQsIDB4ODhFRSwgMHgwMDAwLCAweDAwMDAsIDB4ODhFRiwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhGMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhGMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4OEYyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhGMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4OEY0LCAweDg4RjUsIDB4ODhGNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEY3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RjgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEY5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RkEsIDB4MDAwMCwgMHgwMDAwLCAweDg4RkIsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4OEZDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RkUsIDB4MDAwMCwgMHg4OEZGLCAweDAwMDAsIDB4MDAwMCwgMHg4OTAwLCAweDg5MDEsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkwMiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MDMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTA0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODkwNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTA2LCAweDg5MDcsIDB4ODkwOCwgMHgwMDAwLCAweDg5MDksIDB4MDAwMCwgMHg4OTBBLCAweDAwMDAsIDB4ODkwQiwgMHgwMDAwLAotICAgIDB4ODkwQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTBELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkwRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MEYsIDB4MDAwMCwgMHg4OTEwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODkxMSwgMHgwMDAwLCAweDg5MTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkxMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTE1LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTE2LCAweDAwMDAsIDB4MDAwMCwgMHg4OTE3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODkxOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkxOSwgMHg4OTFBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MUIsIDB4MDAwMCwgMHg4OTFDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDg5MUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDg5MUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MUYsIDB4ODkyMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MjEsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MjIsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkyMywgMHg4OTI0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTI1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ODkyNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MjcsIDB4MDAwMCwgMHgwMDAwLCAweDg5MjgsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTI5LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkyQSwgMHgwMDAwLCAweDAwMDAsIDB4ODkyQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MkMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTJELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4OTJFLCAweDAwMDAsIDB4MDAwMCwgMHg4OTJGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTMwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkzMSwgMHgwMDAwLCAweDg5MzIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4OTM0LCAweDg5MzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTM2LCAweDAwMDAsIDB4MDAwMCwgMHg4OTM3LCAweDg5MzgsCi0gICAgMHgwMDAwLCAweDg5MzksIDB4MDAwMCwgMHgwMDAwLCAweDg5M0EsIDB4MDAwMCwgMHgwMDAwLCAweDg5M0IsIDB4MDAwMCwgMHgwMDAwLCAweDg5M0MsIDB4ODkzRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTNFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTNGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDg5NDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NDEsIDB4MDAwMCwgMHgwMDAwLCAweDg5NDIsCi0gICAgMHg4OTQzLCAweDg5NDQsIDB4ODk0NSwgMHgwMDAwLCAweDg5NDYsIDB4MDAwMCwgMHgwMDAwLCAweDg5NDcsIDB4MDAwMCwgMHgwMDAwLCAweDg5NDgsIDB4ODk0OSwgMHg4OTRBLCAweDAwMDAsIDB4ODk0QiwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTRDLCAweDAwMDAsIDB4ODk0RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk0RSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk0RiwgMHgwMDAwLCAweDg5NTAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NTEsIDB4MDAwMCwgMHg4OTUyLCAweDg5NTMsIDB4ODk1NCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODk1NSwgMHg4OTU2LCAweDg5NTcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NTgsIDB4MDAwMCwgMHg4OTU5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NUIsIDB4ODk1QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTVELCAweDAwMDAsIDB4MDAwMCwgMHg4OTVFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODk1RiwgMHg4OTYwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTY0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk2NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODk2NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTY3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTY4LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NjksIDB4ODk2QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTZCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODk2QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk2RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4OTZFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk2RiwgMHgwMDAwLCAweDg5NzAsIDB4ODk3MSwgMHgwMDAwLCAweDg5NzIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTczLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODk3NCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk3NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTc3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTc4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk3OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4OTdBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk3QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5N0MsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTdELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5N0UsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTdGLCAweDAwMDAsIDB4ODk4MCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTgxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5ODIsIDB4ODk4MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5ODQsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5ODUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDg5ODYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5ODcsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5ODgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk4OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OThBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk4QiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk4QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5OEQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk4RSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk4RiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTkwLCAweDAwMDAsIDB4ODk5MSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTkyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTkzLCAweDAwMDAsIDB4MDAwMCwgMHg4OTk0LCAweDg5OTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5OTYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDg5OTcsIDB4ODk5OCwgMHgwMDAwLCAweDAwMDAsIDB4ODk5OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk5QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk5QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5OUMsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5OUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk5RSwgMHg4OTlGLCAweDg5QTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5QTEsIDB4MDAwMCwgMHgwMDAwLCAweDg5QTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5QTMsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODlBNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlBNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ODlBNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlBNywgMHgwMDAwLCAweDg5QTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5QTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUFBLCAweDAwMDAsIDB4MDAwMCwgMHg4OUFCLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDg5QUMsIDB4ODlBRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5QUUsIDB4ODlBRiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5QjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUIxLCAweDAwMDAsIDB4MDAwMCwgMHg4OUIyLCAweDAwMDAsIDB4MDAwMCwgMHg4OUIzLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUI0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlCNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUI2LCAweDg5QjcsIDB4MDAwMCwgMHg4OUI4LCAweDg5QjksIDB4ODlCQSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUJCLCAweDAwMDAsIDB4ODlCQywgMHg4OUJELCAweDAwMDAsIDB4ODlCRSwgMHg4OUJGLCAweDg5QzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUMxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlDMiwgMHgwMDAwLCAweDg5QzMsIDB4ODlDNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUM1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUM2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlDNywKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4OUM4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5QzksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUNBLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4OUNCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUNDLAotICAgIDB4MDAwMCwgMHg4OUNELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4OUNFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlDRiwgMHg4OUQwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RDEsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RDIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RDMsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlENCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUQ1LCAweDAwMDAsIDB4MDAwMCwgMHg4OUQ2LCAweDg5RDcsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODlEOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RDksIDB4MDAwMCwgMHg4OURBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4ODlEQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlEQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlERCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OURFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5REYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlFMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RTEsIDB4ODlFMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RTMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUU2LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4OUU3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4ODlFOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUVBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlFQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlFQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDg5RUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUVGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUYwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUYxLCAweDAwMDAsIDB4ODlGMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlGMywgMHg4OUY0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RjUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RjYsIDB4MDAwMCwgMHg4OUY3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4ODlGOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUY5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUZBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RkIsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlGQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlGRCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUZFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RkYsIDB4OEEwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEwMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEwMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTAzLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTA0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTA1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTA2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTA3LCAweDhBMDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEwOSwgMHgwMDAwLCAweDhBMEEsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTBCLCAweDAwMDAsIDB4MDAwMCwgMHg4QTBDLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhBMEQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMEUsIDB4MDAwMCwgMHgwMDAwLCAweDhBMEYsIDB4MDAwMCwgMHgwMDAwLCAweDhBMTAsIDB4OEExMSwKLSAgICAweDAwMDAsIDB4OEExMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEExMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhBMTUsIDB4OEExNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEExNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4QTE4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTE5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMUEsCi0gICAgMHgwMDAwLCAweDhBMUIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4QTFDLCAweDAwMDAsIDB4MDAwMCwgMHg4QTFELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEExRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMjAsCi0gICAgMHg4QTIxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTIyLAotICAgIDB4OEEyMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEyNCwgMHg4QTI1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhBMjYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEyNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4QTI4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMjksIDB4MDAwMCwgMHg4QTJBLCAweDAwMDAsIDB4MDAwMCwgMHg4QTJCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEyQywgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEEyRCwgMHgwMDAwLCAweDhBMkUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEyRiwgMHgwMDAwLCAweDAwMDAsIDB4OEEzMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTMxLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTMyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhBMzQsIDB4OEEzNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEzNiwgMHgwMDAwLCAweDhBMzcsIDB4MDAwMCwgMHg4QTM4LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEzOSwgMHg4QTNBLCAweDAwMDAsIDB4MDAwMCwgMHg4QTNCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTNDLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBM0QsIDB4MDAwMCwgMHgwMDAwLCAweDhBM0UsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTNGLCAweDAwMDAsIDB4OEE0MCwKLSAgICAweDhBNDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNDIsIDB4OEE0MywgMHg4QTQ0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEE0NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE0NiwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE0NywgMHg4QTQ4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEE0OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTRBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE0QiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTRDLCAweDhBNEQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTRFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTRGLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE1MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTUxLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhBNTMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEE1NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTU2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhBNTcsIDB4MDAwMCwgMHgwMDAwLCAweDhBNTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE1OSwgMHgwMDAwLCAweDAwMDAsIDB4OEE1QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhBNUIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTVDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhBNUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE1RSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4QTVGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNjAsIDB4OEE2MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4QTYyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNjMsIDB4MDAwMCwgMHgwMDAwLCAweDhBNjQsIDB4MDAwMCwgMHgwMDAwLCAweDhBNjUsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTY2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNjcsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTY4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE2OSwgMHgwMDAwLCAweDhBNkEsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE2QiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4QTZDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE2RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTZFLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4QTZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE3MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTcxLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTcyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNzQsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTc2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEE3NywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNzgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhBNzksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBN0EsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE3QiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE3QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTdELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE3RSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4QTdGLCAweDAwMDAsIDB4MDAwMCwgMHg4QTgwLCAweDhBODEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBODIsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE4MywgMHgwMDAwLCAweDhBODQsIDB4OEE4NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEE4NiwgMHgwMDAwLCAweDhBODcsIDB4MDAwMCwgMHgwMDAwLCAweDhBODgsIDB4MDAwMCwgMHg4QTg5LCAweDhBOEEsIDB4MDAwMCwgMHg4QThCLCAweDhBOEMsIDB4OEE4RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhBOEUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE4RiwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTkwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE5MSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTkyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEE5MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE5NCwgMHg4QTk1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE5NiwgMHg4QTk3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE5OCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4QTk5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTlBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEE5QiwgMHgwMDAwLCAweDhBOUMsIDB4MDAwMCwgMHgwMDAwLCAweDhBOUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTlFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4QTlGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFBMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQTEsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUEyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFBMywKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFBNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFBNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQTYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFBNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhBQTgsIDB4OEFBOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUFBLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4QUFCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUFDLCAweDhBQUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4QUFFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUFGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUIwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUIxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUIyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEFCMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFCNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEFCNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFCNiwgMHgwMDAwLCAweDhBQjcsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFCOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQjksIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEFCQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFCQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEFCQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhBQkUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFCRiwgMHg4QUMwLCAweDAwMDAsIDB4OEFDMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUMyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQzMsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEFDNCwgMHgwMDAwLCAweDhBQzUsIDB4MDAwMCwgMHgwMDAwLCAweDhBQzYsIDB4MDAwMCwgMHg4QUM3LCAweDAwMDAsIDB4MDAwMCwgMHg4QUM4LCAweDhBQzksIDB4OEFDQSwgMHgwMDAwLAotICAgIDB4OEFDQiwgMHg4QUNDLCAweDhBQ0QsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFDRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQ0YsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhBRDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUQxLCAweDAwMDAsIDB4OEFEMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUQzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFENCwgMHgwMDAwLCAweDhBRDUsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEFENiwgMHgwMDAwLCAweDhBRDcsIDB4OEFEOCwgMHgwMDAwLCAweDAwMDAsIDB4OEFEOSwgMHgwMDAwLCAweDAwMDAsIDB4OEFEQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFEQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBREMsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBREQsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QURFLCAweDAwMDAsIDB4OEFERiwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRTEsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFFMiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUUzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUU0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFFNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUU3LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUU4LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4QUU5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFFQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFFQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUVDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRUQsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUVFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRUYsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUYwLCAweDAwMDAsIDB4OEFGMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhBRjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFGNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUY1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFGNiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFGNywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRjgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFGOSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFGQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRkIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFGQywgMHg4QUZELCAweDhBRkUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhBRkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIwMSwgMHg4QjAyLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIwMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIwNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjA1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMDYsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEIwNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMDgsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIwOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMEEsIDB4MDAwMCwgMHgwMDAwLCAweDhCMEIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMEMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIwRCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4QjBFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMEYsIDB4OEIxMCwgMHg4QjExLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEIxMiwgMHg4QjEzLCAweDhCMTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIxNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMTYsIDB4OEIxNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjE4LCAweDhCMTksCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIxQSwgMHg4QjFCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjFELCAweDhCMUUsIDB4MDAwMCwgMHg4QjFGLCAweDAwMDAsIDB4MDAwMCwgMHg4QjIwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIyMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjIyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMjMsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIyNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMjUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIyNiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhCMjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIyOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMjksIDB4MDAwMCwgMHg4QjJBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMkIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjJDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIyRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMkUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4QjJGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMzAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMzEsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEIzMiwgMHgwMDAwLCAweDhCMzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjM0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMzUsIDB4MDAwMCwgMHg4QjM2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMzcsIDB4OEIzOCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIzOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIzQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCM0IsIDB4MDAwMCwgMHg4QjNDLCAweDhCM0QsIDB4MDAwMCwgMHgwMDAwLCAweDhCM0UsCi0gICAgMHg4QjNGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCNDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjQxLCAweDAwMDAsIDB4MDAwMCwgMHg4QjQyLCAweDAwMDAsIDB4OEI0MywgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhCNDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjQ1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjQ2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjQ3LCAweDhCNDgsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI0OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhCNEEsIDB4OEI0QiwgMHgwMDAwLCAweDhCNEMsIDB4MDAwMCwgMHg4QjRELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI0RSwgMHgwMDAwLAotICAgIDB4OEI0RiwgMHgwMDAwLCAweDhCNTAsIDB4MDAwMCwgMHg4QjUxLCAweDhCNTIsIDB4OEI1MywgMHg4QjU0LCAweDhCNTUsIDB4OEI1NiwgMHgwMDAwLCAweDhCNTcsIDB4MDAwMCwgMHg4QjU4LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhCNTksIDB4MDAwMCwgMHgwMDAwLCAweDhCNUEsIDB4OEI1QiwgMHg4QjVDLCAweDAwMDAsIDB4OEI1RCwgMHgwMDAwLCAweDhCNUUsIDB4OEI1RiwgMHg4QjYwLCAweDhCNjEsIDB4OEI2MiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhCNjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI2NCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI2NSwgMHgwMDAwLAotICAgIDB4OEI2NiwgMHg4QjY3LCAweDhCNjgsIDB4OEI2OSwgMHgwMDAwLCAweDhCNkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI2QiwgMHg4QjZDLCAweDAwMDAsIDB4OEI2RCwgMHgwMDAwLCAweDAwMDAsIDB4OEI2RSwKLSAgICAweDhCNkYsIDB4MDAwMCwgMHg4QjcwLCAweDhCNzEsIDB4OEI3MiwgMHgwMDAwLCAweDhCNzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Qjc0LCAweDAwMDAsCi0gICAgMHg4Qjc1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI3NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI3NywgMHgwMDAwLCAweDhCNzgsIDB4OEI3OSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4QjdBLCAweDhCN0IsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI3QywgMHgwMDAwLCAweDhCN0QsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhCN0UsIDB4OEI3RiwgMHg4QjgwLCAweDhCODEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCODIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhCODMsIDB4MDAwMCwgMHg4Qjg0LCAweDAwMDAsIDB4MDAwMCwgMHg4Qjg1LCAweDAwMDAsIDB4OEI4NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Qjg3LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI4OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI4OSwgMHgwMDAwLCAweDhCOEEsIDB4MDAwMCwKLSAgICAweDhCOEIsIDB4MDAwMCwgMHg4QjhDLCAweDhCOEQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCOEUsIDB4OEI4RiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4QjkwLCAweDhCOTEsIDB4OEI5MiwgMHgwMDAwLCAweDhCOTMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI5NCwgMHg4Qjk1LCAweDhCOTYsIDB4OEI5NywgMHgwMDAwLCAweDhCOTgsIDB4OEI5OSwgMHg4QjlBLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjlCLCAweDAwMDAsIDB4MDAwMCwgMHg4QjlDLCAweDAwMDAsIDB4MDAwMCwgMHg4QjlELCAweDhCOUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4QjlGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJBMCwgMHg4QkExLCAweDhCQTIsIDB4OEJBMywgMHgwMDAwLCAweDAwMDAsIDB4OEJBNCwgMHg4QkE1LCAweDAwMDAsCi0gICAgMHg4QkE2LCAweDhCQTcsIDB4MDAwMCwgMHg4QkE4LCAweDAwMDAsIDB4MDAwMCwgMHg4QkE5LCAweDAwMDAsIDB4OEJBQSwgMHg4QkFCLCAweDAwMDAsIDB4MDAwMCwgMHg4QkFDLCAweDAwMDAsIDB4MDAwMCwgMHg4QkFELAotICAgIDB4MDAwMCwgMHg4QkFFLCAweDhCQUYsIDB4MDAwMCwgMHg4QkIwLCAweDAwMDAsIDB4OEJCMSwgMHgwMDAwLCAweDAwMDAsIDB4OEJCMiwgMHgwMDAwLCAweDhCQjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkI0LCAweDhCQjUsIDB4OEJCNiwgMHg4QkI3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4QkI4LCAweDhCQjksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCQkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJCQiwgMHgwMDAwLCAweDhCQkMsIDB4OEJCRCwgMHg4QkJFLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJCRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCQzAsIDB4MDAwMCwgMHgwMDAwLCAweDhCQzEsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEJDMiwgMHg4QkMzLCAweDAwMDAsIDB4MDAwMCwgMHg4QkM0LCAweDhCQzUsIDB4OEJDNiwgMHgwMDAwLCAweDhCQzcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJDOCwgMHg4QkM5LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkNBLCAweDAwMDAsIDB4OEJDQiwgMHg4QkNDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhCQ0QsIDB4MDAwMCwgMHg4QkNFLCAweDhCQ0YsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkQwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRDEsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEJEMiwgMHg4QkQzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRDQsIDB4OEJENSwgMHg4QkQ2LCAweDAwMDAsIDB4OEJENywgMHgwMDAwLCAweDhCRDgsCi0gICAgMHg4QkQ5LCAweDAwMDAsIDB4MDAwMCwgMHg4QkRBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkRCLCAweDAwMDAsIDB4MDAwMCwgMHg4QkRDLCAweDhCREQsIDB4OEJERSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCREYsIDB4MDAwMCwgMHg4QkUwLCAweDAwMDAsIDB4OEJFMSwgMHgwMDAwLCAweDAwMDAsIDB4OEJFMiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRTMsIDB4MDAwMCwgMHgwMDAwLCAweDhCRTQsIDB4MDAwMCwgMHg4QkU1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRTYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRTcsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJFOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEJFOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRUEsIDB4MDAwMCwgMHg4QkVCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkVDLCAweDhCRUQsIDB4MDAwMCwgMHg4QkVFLCAweDAwMDAsIDB4MDAwMCwgMHg4QkVGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRjAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRjEsIDB4OEJGMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhCRjQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhCRjUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRjYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkY3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRjgsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkY5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkZBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJGQiwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJGQywKLSAgICAweDhCRkQsIDB4MDAwMCwgMHg4QkZFLCAweDhCRkYsIDB4MDAwMCwgMHg4QzAwLCAweDhDMDEsIDB4OEMwMiwgMHgwMDAwLCAweDhDMDMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMwNCwgMHg4QzA1LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMwNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzA3LCAweDAwMDAsIDB4MDAwMCwgMHg4QzA4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMwOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMEEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMEIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMwQywgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMwRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEMwRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMEYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzEwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzExLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMxMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMxMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzE0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMxNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4QzE2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzE3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzE4LCAweDhDMTksIDB4OEMxQSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMUIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMxQywgMHgwMDAwLCAweDhDMUQsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMxRSwgMHgwMDAwLCAweDhDMUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzIwLAotICAgIDB4OEMyMSwgMHgwMDAwLCAweDhDMjIsIDB4MDAwMCwgMHgwMDAwLCAweDhDMjMsIDB4MDAwMCwgMHgwMDAwLCAweDhDMjQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMyNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMjYsIDB4OEMyNywgMHg4QzI4LCAweDhDMjksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMkIsIDB4MDAwMCwgMHg4QzJDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMyRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4QzJFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzJGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4QzMwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzMxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMzMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhDMzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMzNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMzYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMzNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4QzM4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMzOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzNBLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDM0IsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMzQywgMHgwMDAwLCAweDAwMDAsIDB4OEMzRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMzRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzNGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzQwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhDNDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzQyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNDMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhDNDUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM0NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzQ3LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM0OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhDNDksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzRBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNEIsIDB4OEM0QywKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM0RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM0RSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNEYsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNTAsIDB4MDAwMCwgMHg4QzUxLCAweDhDNTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM1MywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4QzU0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM1NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNTYsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4QzU3LCAweDAwMDAsIDB4MDAwMCwgMHg4QzU4LCAweDAwMDAsIDB4MDAwMCwgMHg4QzU5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEM1QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNUIsIDB4MDAwMCwgMHgwMDAwLCAweDhDNUMsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzVELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzVFLCAweDAwMDAsIDB4OEM1RiwgMHgwMDAwLCAweDhDNjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhDNjEsIDB4MDAwMCwgMHgwMDAwLCAweDhDNjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzYzLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM2NCwgMHgwMDAwLCAweDAwMDAsIDB4OEM2NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM2NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzY3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNjgsIDB4OEM2OSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzZBLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzZCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM2QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzZELCAweDAwMDAsIDB4MDAwMCwgMHg4QzZFLCAweDhDNkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEM3MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzcxLCAweDAwMDAsIDB4OEM3MiwgMHg4QzczLCAweDAwMDAsIDB4MDAwMCwgMHg4Qzc0LCAweDhDNzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM3NiwgMHgwMDAwLCAweDAwMDAsIDB4OEM3NywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Qzc4LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEM3OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDN0EsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzdCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM3QywKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM3RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM3RSwgMHg4QzdGLCAweDAwMDAsIDB4MDAwMCwgMHg4QzgwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzgxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM4MiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzgzLCAweDhDODQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDODUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDODYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM4NywKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDODgsIDB4MDAwMCwgMHg4Qzg5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM4QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzhCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzhDLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEM4RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDOEUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM4RiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM5MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzkxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzkyLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM5MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM5NCwgMHgwMDAwLCAweDAwMDAsIDB4OEM5NSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4Qzk2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDOTcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Qzk4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhDOTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM5QSwgMHg4QzlCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDOUMsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEM5RCwgMHg4QzlFLCAweDAwMDAsIDB4MDAwMCwgMHg4QzlGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENBMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0EyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhDQTMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0E0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENBNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENBNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQTcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0E4LCAweDAwMDAsIDB4OENBOSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENBQSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQUIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENBQywgMHg4Q0FELCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OENBRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQUYsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0IwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENCMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0IyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhDQjMsIDB4OENCNCwgMHgwMDAwLCAweDhDQjUsIDB4MDAwMCwgMHgwMDAwLCAweDhDQjYsIDB4MDAwMCwgMHgwMDAwLCAweDhDQjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQjgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0I5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQkEsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OENCQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0JDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0JELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENCRSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4Q0JGLCAweDAwMDAsIDB4OENDMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENDMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0MyLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENDMywgMHgwMDAwLCAweDAwMDAsIDB4OENDNCwgMHgwMDAwLCAweDhDQzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OENDNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0M3LCAweDhDQzgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENDOSwgMHgwMDAwLCAweDhDQ0EsIDB4MDAwMCwgMHgwMDAwLCAweDhDQ0IsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OENDQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQ0QsIDB4MDAwMCwgMHgwMDAwLCAweDhDQ0UsIDB4MDAwMCwgMHgwMDAwLCAweDhDQ0YsIDB4MDAwMCwgMHg4Q0QwLAotICAgIDB4OENEMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0QyLCAweDAwMDAsIDB4OENEMywgMHgwMDAwLCAweDhDRDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4Q0Q1LCAweDhDRDYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0Q3LCAweDAwMDAsIDB4OENEOCwgMHgwMDAwLCAweDhDRDksIDB4MDAwMCwgMHg4Q0RBLCAweDAwMDAsCi0gICAgMHg4Q0RCLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0RDLCAweDAwMDAsIDB4OENERCwgMHg4Q0RFLCAweDhDREYsIDB4OENFMCwgMHgwMDAwLCAweDAwMDAsIDB4OENFMSwgMHgwMDAwLCAweDhDRTIsIDB4MDAwMCwgMHg4Q0UzLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENFNCwgMHgwMDAwLCAweDhDRTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0U2LCAweDAwMDAsIDB4MDAwMCwgMHg4Q0U3LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OENFOCwgMHgwMDAwLCAweDAwMDAsIDB4OENFOSwgMHgwMDAwLCAweDhDRUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENFQiwgMHgwMDAwLCAweDhDRUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhDRUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0VFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENFRiwgMHgwMDAwLAotICAgIDB4OENGMCwgMHgwMDAwLCAweDhDRjEsIDB4MDAwMCwgMHg4Q0YyLCAweDhDRjMsIDB4MDAwMCwgMHgwMDAwLCAweDhDRjQsIDB4MDAwMCwgMHgwMDAwLCAweDhDRjUsIDB4MDAwMCwgMHgwMDAwLCAweDhDRjYsIDB4MDAwMCwKLSAgICAweDhDRjcsIDB4OENGOCwgMHg4Q0Y5LCAweDhDRkEsIDB4MDAwMCwgMHgwMDAwLCAweDhDRkIsIDB4MDAwMCwgMHgwMDAwLCAweDhDRkMsIDB4MDAwMCwgMHg4Q0ZELCAweDhDRkUsIDB4OENGRiwgMHg4RDAwLCAweDAwMDAsCi0gICAgMHg4RDAxLCAweDhEMDIsIDB4OEQwMywgMHg4RDA0LCAweDAwMDAsIDB4OEQwNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDA2LCAweDAwMDAsIDB4MDAwMCwgMHg4RDA3LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDA4LCAweDhEMDksIDB4OEQwQSwgMHg4RDBCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQwQywgMHg4RDBELCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEQwRSwgMHg4RDBGLCAweDAwMDAsIDB4MDAwMCwgMHg4RDEwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDExLCAweDAwMDAsIDB4OEQxMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDEzLCAweDAwMDAsCi0gICAgMHg4RDE0LCAweDhEMTUsIDB4MDAwMCwgMHg4RDE2LCAweDhEMTcsIDB4OEQxOCwgMHg4RDE5LCAweDAwMDAsIDB4OEQxQSwgMHgwMDAwLCAweDhEMUIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEQxQywgMHgwMDAwLCAweDhEMUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQxRSwgMHgwMDAwLCAweDAwMDAsIDB4OEQxRiwgMHgwMDAwLCAweDAwMDAsIDB4OEQyMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQyMSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4RDIyLCAweDAwMDAsIDB4OEQyMywgMHgwMDAwLCAweDAwMDAsIDB4OEQyNCwgMHgwMDAwLCAweDhEMjUsIDB4MDAwMCwgMHg4RDI2LCAweDAwMDAsIDB4OEQyNywgMHgwMDAwLCAweDhEMjgsCi0gICAgMHgwMDAwLCAweDhEMjksIDB4OEQyQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDJCLCAweDhEMkMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQyRCwgMHg4RDJFLCAweDhEMkYsIDB4OEQzMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4RDMxLCAweDhEMzIsIDB4MDAwMCwgMHg4RDMzLCAweDAwMDAsIDB4OEQzNCwgMHg4RDM1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEMzYsIDB4MDAwMCwgMHg4RDM3LCAweDhEMzgsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEQzOSwgMHgwMDAwLCAweDhEM0EsIDB4MDAwMCwgMHgwMDAwLCAweDhEM0IsIDB4OEQzQywgMHg4RDNELCAweDAwMDAsIDB4OEQzRSwgMHgwMDAwLCAweDhEM0YsIDB4MDAwMCwgMHg4RDQwLCAweDAwMDAsCi0gICAgMHg4RDQxLCAweDhENDIsIDB4OEQ0MywgMHgwMDAwLCAweDhENDQsIDB4OEQ0NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENDYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ0NywgMHgwMDAwLAotICAgIDB4OEQ0OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDQ5LCAweDAwMDAsIDB4OEQ0QSwgMHg4RDRCLCAweDAwMDAsIDB4OEQ0QywgMHgwMDAwLCAweDhENEQsIDB4MDAwMCwgMHg4RDRFLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhENEYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDUwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDUxLCAweDhENTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDUzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDU0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ1NSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ1NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENTcsIDB4OEQ1OCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENTksIDB4MDAwMCwgMHg4RDVBLCAweDhENUIsIDB4OEQ1QywgMHgwMDAwLCAweDhENUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ1RSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDVGLAotICAgIDB4OEQ2MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDYxLCAweDAwMDAsIDB4MDAwMCwgMHg4RDYyLCAweDhENjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDY0LCAweDhENjUsIDB4MDAwMCwKLSAgICAweDhENjYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ2NywgMHg4RDY4LCAweDAwMDAsIDB4MDAwMCwgMHg4RDY5LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEQ2QSwgMHg4RDZCLCAweDAwMDAsIDB4OEQ2QywgMHg4RDZELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENkUsIDB4MDAwMCwgMHg4RDZGLCAweDAwMDAsIDB4OEQ3MCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDcxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDcyLCAweDAwMDAsCi0gICAgMHg4RDczLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ3NCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ3NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDc3LCAweDhENzgsIDB4MDAwMCwKLSAgICAweDhENzksIDB4OEQ3QSwgMHg4RDdCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ3QywgMHg4RDdELCAweDhEN0UsIDB4OEQ3RiwgMHg4RDgwLCAweDhEODEsIDB4MDAwMCwgMHgwMDAwLCAweDhEODIsCi0gICAgMHg4RDgzLCAweDAwMDAsIDB4OEQ4NCwgMHg4RDg1LCAweDhEODYsIDB4MDAwMCwgMHg4RDg3LCAweDhEODgsIDB4OEQ4OSwgMHgwMDAwLCAweDhEOEEsIDB4OEQ4QiwgMHg4RDhDLCAweDhEOEQsIDB4MDAwMCwgMHg4RDhFLAotICAgIDB4OEQ4RiwgMHg4RDkwLCAweDhEOTEsIDB4OEQ5MiwgMHg4RDkzLCAweDhEOTQsIDB4MDAwMCwgMHg4RDk1LCAweDhEOTYsIDB4MDAwMCwgMHg4RDk3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEQ5OCwgMHg4RDk5LCAweDhEOUEsIDB4MDAwMCwgMHg4RDlCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEOUMsIDB4OEQ5RCwgMHgwMDAwLCAweDhEOUUsIDB4MDAwMCwgMHg4RDlGLCAweDAwMDAsCi0gICAgMHg4REEwLCAweDhEQTEsIDB4OERBMiwgMHg4REEzLCAweDhEQTQsIDB4MDAwMCwgMHg4REE1LCAweDhEQTYsIDB4MDAwMCwgMHgwMDAwLCAweDhEQTcsIDB4MDAwMCwgMHg4REE4LCAweDhEQTksIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REFBLCAweDhEQUIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REFDLCAweDhEQUQsIDB4OERBRSwgMHg4REFGLCAweDhEQjAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERCMSwgMHg4REIyLCAweDAwMDAsIDB4OERCMywgMHg4REI0LCAweDAwMDAsIDB4OERCNSwgMHgwMDAwLCAweDAwMDAsIDB4OERCNiwgMHgwMDAwLCAweDhEQjcsCi0gICAgMHg4REI4LCAweDAwMDAsIDB4MDAwMCwgMHg4REI5LCAweDhEQkEsIDB4MDAwMCwgMHg4REJCLCAweDhEQkMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERCRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEQkUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REJGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEQzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERDMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhEQzIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4REMzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OERDNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEQzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERDNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REM3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4REM4LCAweDAwMDAsIDB4MDAwMCwgMHg4REM5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RENBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4RENCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEQ0MsIDB4OERDRCwgMHg4RENFLCAweDAwMDAsIDB4OERDRiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhERDAsIDB4OEREMSwgMHg4REQyLCAweDAwMDAsIDB4OEREMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhERDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4REQ1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhERDYsIDB4OERENywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REQ4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4REQ5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEREEsIDB4OEREQiwgMHg4RERDLCAweDhEREQsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhEREUsIDB4MDAwMCwgMHg4RERGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhERTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERFMSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REUyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OERFMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERFNCwgMHg4REU1LCAweDhERTYsIDB4OERFNywgMHg4REU4LCAweDAwMDAsIDB4OERFOSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERFQSwgMHgwMDAwLCAweDhERUIsIDB4MDAwMCwgMHg4REVDLCAweDhERUQsIDB4OERFRSwgMHg4REVGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4REYwLCAweDAwMDAsIDB4OERGMSwgMHg4REYyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REYzLCAweDhERjQsIDB4OERGNSwgMHg4REY2LCAweDhERjcsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERGOCwgMHg4REY5LCAweDAwMDAsIDB4MDAwMCwgMHg4REZBLCAweDhERkIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REZDLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERGRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhERkUsIDB4MDAwMCwgMHgwMDAwLCAweDhERkYsIDB4MDAwMCwgMHgwMDAwLCAweDhFMDAsIDB4OEUwMSwKLSAgICAweDhFMDIsIDB4MDAwMCwgMHg4RTAzLCAweDAwMDAsIDB4OEUwNCwgMHg4RTA1LCAweDhFMDYsIDB4MDAwMCwgMHgwMDAwLCAweDhFMDcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUwOCwgMHg4RTA5LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFMEEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTBCLAotICAgIDB4MDAwMCwgMHg4RTBDLCAweDhFMEQsIDB4MDAwMCwgMHg4RTBFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFMEYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUxMCwgMHg4RTExLCAweDhFMTIsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEUxMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTE0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUxNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEUxNiwgMHg4RTE3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFMTgsIDB4OEUxOSwgMHgwMDAwLCAweDAwMDAsIDB4OEUxQSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTFCLCAweDhFMUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUxRCwgMHgwMDAwLCAweDAwMDAsIDB4OEUxRSwgMHgwMDAwLCAweDhFMUYsIDB4MDAwMCwKLSAgICAweDhFMjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFMjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEUyMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFMjMsIDB4OEUyNCwgMHgwMDAwLCAweDhFMjUsIDB4MDAwMCwgMHg4RTI2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4RTI3LCAweDAwMDAsIDB4MDAwMCwgMHg4RTI4LCAweDAwMDAsIDB4MDAwMCwgMHg4RTI5LCAweDAwMDAsIDB4MDAwMCwgMHg4RTJBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUyQiwKLSAgICAweDhFMkMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTJELAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTJFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTJGLCAweDAwMDAsIDB4MDAwMCwgMHg4RTMwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhFMzEsIDB4MDAwMCwgMHg4RTMyLCAweDAwMDAsIDB4OEUzMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUzNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUzNSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4RTM2LCAweDAwMDAsIDB4OEUzNywgMHgwMDAwLCAweDhFMzgsIDB4MDAwMCwgMHg4RTM5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFM0EsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTNCLCAweDhFM0MsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFM0QsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTNFLCAweDAwMDAsIDB4OEUzRiwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFNDAsIDB4OEU0MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEU0MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4RTQzLCAweDhFNDQsIDB4MDAwMCwgMHg4RTQ1LCAweDAwMDAsIDB4OEU0NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEU0NywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTQ4LCAweDhFNDksIDB4MDAwMCwgMHg4RTRBLCAweDhFNEIsIDB4OEU0QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTRELCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFNEUsIDB4OEU0RiwgMHgwMDAwLCAweDAwMDAsIDB4OEU1MCwgMHgwMDAwLCAweDhFNTEsIDB4MDAwMCwgMHgwMDAwLCAweDhFNTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEU1MywgMHgwMDAwLCAweDhFNTQsIDB4MDAwMCwgMHg4RTU1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEU1NiwgMHg4RTU3LCAweDAwMDAsIDB4OEU1OCwgMHg4RTU5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEU1QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTVCLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhFNUMsIDB4OEU1RCwgMHgwMDAwLCAweDAwMDAsIDB4OEU1RSwgMHg4RTVGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTYwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTYxLCAweDAwMDAsIDB4MDAwMCwgMHg4RTYyLCAweDhFNjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEU2NCwgMHgwMDAwLAotICAgIDB4OEU2NSwgMHgwMDAwLCAweDAwMDAsIDB4OEU2NiwgMHg4RTY3LCAweDAwMDAsIDB4MDAwMCwgMHg4RTY4LCAweDhFNjksIDB4OEU2QSwgMHg4RTZCLCAweDAwMDAsIDB4MDAwMCwgMHg4RTZDLCAweDhFNkQsIDB4OEU2RSwKLSAgICAweDhFNkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTcwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTcxLCAweDhFNzIsIDB4MDAwMCwgMHg4RTczLCAweDAwMDAsIDB4OEU3NCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhFNzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFNzYsIDB4MDAwMCwgMHgwMDAwLCAweDhFNzcsIDB4OEU3OCwgMHgwMDAwLCAweDAwMDAsIDB4OEU3OSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTdBLCAweDAwMDAsIDB4OEU3QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEU3QywgMHg4RTdELCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFN0UsIDB4MDAwMCwgMHg4RTdGLCAweDAwMDAsIDB4OEU4MCwgMHg4RTgxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFODIsCi0gICAgMHg4RTgzLCAweDAwMDAsIDB4MDAwMCwgMHg4RTg0LCAweDAwMDAsIDB4OEU4NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFODYsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4RTg3LCAweDAwMDAsIDB4OEU4OCwgMHgwMDAwLCAweDAwMDAsIDB4OEU4OSwgMHgwMDAwLCAweDhFOEEsIDB4MDAwMCwgMHg4RThCLCAweDhFOEMsIDB4OEU4RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhFOEUsIDB4MDAwMCwgMHgwMDAwLCAweDhFOEYsIDB4MDAwMCwgMHg4RTkwLCAweDhFOTEsIDB4MDAwMCwgMHg4RTkyLCAweDAwMDAsIDB4OEU5MywgMHg4RTk0LCAweDhFOTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTk2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFOTcsIDB4MDAwMCwgMHg4RTk4LCAweDAwMDAsIDB4OEU5OSwgMHg4RTlBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4RTlCLCAweDAwMDAsIDB4OEU5QywgMHgwMDAwLCAweDhFOUQsIDB4MDAwMCwgMHg4RTlFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEU5RiwgMHgwMDAwLCAweDAwMDAsIDB4OEVBMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4RUExLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVBMiwgMHgwMDAwLCAweDhFQTMsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFQTQsIDB4OEVBNSwgMHg4RUE2LCAweDAwMDAsIDB4OEVBNywgMHg4RUE4LCAweDhFQTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVBQSwgMHg4RUFCLAotICAgIDB4OEVBQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFQUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVBRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEVBRiwgMHgwMDAwLCAweDAwMDAsIDB4OEVCMCwgMHgwMDAwLCAweDhFQjEsIDB4MDAwMCwgMHg4RUIyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFQjMsCi0gICAgMHg4RUI0LCAweDAwMDAsIDB4OEVCNSwgMHgwMDAwLCAweDAwMDAsIDB4OEVCNiwgMHgwMDAwLCAweDAwMDAsIDB4OEVCNywgMHg4RUI4LCAweDhFQjksIDB4OEVCQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUJCLAotICAgIDB4OEVCQywgMHg4RUJELCAweDhFQkUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVCRiwgMHgwMDAwLCAweDhFQzAsIDB4OEVDMSwgMHgwMDAwLCAweDhFQzIsIDB4MDAwMCwgMHgwMDAwLCAweDhFQzMsIDB4OEVDNCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFQzUsIDB4MDAwMCwgMHgwMDAwLCAweDhFQzYsIDB4MDAwMCwgMHg4RUM3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhFQzgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUM5LCAweDhFQ0EsIDB4MDAwMCwgMHgwMDAwLCAweDhFQ0IsIDB4OEVDQywgMHgwMDAwLCAweDhFQ0QsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUNFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFQ0YsIDB4MDAwMCwgMHg4RUQwLCAweDhFRDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhFRDIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVEMywgMHg4RUQ0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFRDUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4RUQ2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVENywgMHg4RUQ4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFRDksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVEQSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhFREIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RURDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVERCwgMHgwMDAwLCAweDhFREUsIDB4MDAwMCwgMHg4RURGLCAweDAwMDAsIDB4MDAwMCwgMHg4RUUwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhFRTEsIDB4OEVFMiwgMHg4RUUzLCAweDAwMDAsIDB4MDAwMCwgMHg4RUU0LCAweDhFRTUsIDB4MDAwMCwgMHg4RUU2LCAweDhFRTcsIDB4MDAwMCwgMHg4RUU4LCAweDAwMDAsIDB4OEVFOSwgMHgwMDAwLAotICAgIDB4OEVFQSwgMHgwMDAwLCAweDAwMDAsIDB4OEVFQiwgMHgwMDAwLCAweDhFRUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFRUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVFRSwgMHg4RUVGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFRjAsIDB4OEVGMSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4RUYyLCAweDhFRjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFRjQsIDB4OEVGNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUY2LCAweDhFRjcsIDB4OEVGOCwgMHg4RUY5LAotICAgIDB4MDAwMCwgMHg4RUZBLCAweDhFRkIsIDB4MDAwMCwgMHg4RUZDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFRkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhFRkUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEYwMSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjAyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEYwMywgMHgwMDAwLCAweDAwMDAsIDB4OEYwNCwgMHg4RjA1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGMDYsIDB4OEYwNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEYwOCwgMHg4RjA5LCAweDAwMDAsIDB4MDAwMCwgMHg4RjBBLCAweDAwMDAsIDB4MDAwMCwgMHg4RjBCLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEYwQywgMHg4RjBELCAweDAwMDAsIDB4OEYwRSwgMHg4RjBGLCAweDAwMDAsIDB4OEYxMCwgMHgwMDAwLCAweDhGMTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjEyLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjEzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjE0LCAweDAwMDAsIDB4OEYxNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEYxNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjE3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjE4LCAweDAwMDAsCi0gICAgMHg4RjE5LCAweDAwMDAsIDB4MDAwMCwgMHg4RjFBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGMUIsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEYxQywgMHg4RjFELCAweDhGMUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjFGLCAweDAwMDAsIDB4OEYyMCwgMHgwMDAwLCAweDAwMDAsIDB4OEYyMSwgMHg4RjIyLCAweDhGMjMsIDB4OEYyNCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEYyNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4RjI2LCAweDAwMDAsIDB4OEYyNywgMHg4RjI4LCAweDAwMDAsIDB4MDAwMCwgMHg4RjI5LCAweDAwMDAsIDB4OEYyQSwgMHg4RjJCLCAweDAwMDAsIDB4OEYyQywgMHg4RjJELCAweDAwMDAsIDB4OEYyRSwgMHg4RjJGLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhGMzAsIDB4OEYzMSwgMHg4RjMyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGMzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEYzNCwgMHgwMDAwLCAweDhGMzUsIDB4MDAwMCwgMHg4RjM2LCAweDAwMDAsIDB4MDAwMCwgMHg4RjM3LCAweDhGMzgsIDB4MDAwMCwgMHg4RjM5LCAweDhGM0EsIDB4OEYzQiwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhGM0MsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjNELCAweDAwMDAsIDB4MDAwMCwgMHg4RjNFLCAweDAwMDAsIDB4OEYzRiwgMHg4RjQwLCAweDhGNDEsIDB4OEY0MiwgMHg4RjQzLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY0NCwgMHgwMDAwLCAweDAwMDAsIDB4OEY0NSwgMHg4RjQ2LCAweDhGNDcsIDB4MDAwMCwgMHg4RjQ4LCAweDhGNDksIDB4OEY0QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhGNEIsIDB4MDAwMCwgMHg4RjRDLCAweDhGNEQsIDB4OEY0RSwgMHg4RjRGLCAweDhGNTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGNTEsIDB4MDAwMCwgMHg4RjUyLCAweDAwMDAsCi0gICAgMHg4RjUzLCAweDhGNTQsIDB4OEY1NSwgMHgwMDAwLCAweDhGNTYsIDB4OEY1NywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGNTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjU5LCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGNUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg4RjVCLCAweDAwMDAsIDB4MDAwMCwgMHg4RjVDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY1RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGNUUsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY1RiwgMHg4RjYwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGNjEsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjYyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjYzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY2NCwgMHgwMDAwLCAweDhGNjUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4RjY2LCAweDAwMDAsIDB4MDAwMCwgMHg4RjY3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGNjgsIDB4MDAwMCwgMHgwMDAwLCAweDhGNjksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjZBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjZCLCAweDAwMDAsIDB4MDAwMCwgMHg4RjZDLCAweDAwMDAsIDB4OEY2RCwgMHg4RjZFLCAweDAwMDAsIDB4OEY2RiwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhGNzAsIDB4OEY3MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4RjcyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjczLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg4Rjc0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY3NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGNzYsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhGNzcsIDB4MDAwMCwgMHg4Rjc4LCAweDAwMDAsIDB4OEY3OSwgMHgwMDAwLCAweDhGN0EsIDB4OEY3QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY3QywgMHgwMDAwLCAweDhGN0QsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjdFLCAweDAwMDAsIDB4OEY3RiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDhGODAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGODEsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGODIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhGODMsIDB4MDAwMCwgMHg4Rjg0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Rjg1LCAweDAwMDAsIDB4OEY4NiwgMHg4Rjg3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY4OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY4OSwgMHgwMDAwLCAweDAwMDAsIDB4OEY4QSwgMHgwMDAwLCAweDhGOEIsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY4QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjhELAotICAgIDB4MDAwMCwgMHg4RjhFLCAweDhGOEYsIDB4OEY5MCwgMHgwMDAwLCAweDhGOTEsIDB4OEY5MiwgMHg4RjkzLCAweDhGOTQsIDB4MDAwMCwgMHg4Rjk1LCAweDAwMDAsIDB4OEY5NiwgMHgwMDAwLCAweDhGOTcsIDB4OEY5OCwKLSAgICAweDhGOTksIDB4OEY5QSwgMHg4RjlCLCAweDhGOUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY5RCwgMHg4RjlFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGOUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhGQTAsIDB4MDAwMCwgMHgwMDAwLCAweDhGQTEsIDB4MDAwMCwgMHg4RkEyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGQTMsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEZBNCwgMHgwMDAwLCAweDhGQTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkE2LCAweDhGQTcsIDB4OEZBOCwgMHgwMDAwLCAweDhGQTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGQUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGQUIsIDB4OEZBQywgMHg4RkFELCAweDhGQUUsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEZBRiwgMHg4RkIwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZCMSwgMHg4RkIyLCAweDAwMDAsIDB4OEZCMywgMHgwMDAwLCAweDAwMDAsIDB4OEZCNCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhGQjUsIDB4MDAwMCwgMHgwMDAwLCAweDhGQjYsIDB4MDAwMCwgMHg4RkI3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGQjgsIDB4OEZCOSwgMHgwMDAwLCAweDAwMDAsIDB4OEZCQSwKLSAgICAweDhGQkIsIDB4OEZCQywgMHgwMDAwLCAweDhGQkQsIDB4OEZCRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkJGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZDMCwgMHg4RkMxLCAweDhGQzIsCi0gICAgMHgwMDAwLCAweDhGQzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkM0LCAweDAwMDAsIDB4OEZDNSwgMHgwMDAwLCAweDhGQzYsIDB4OEZDNywgMHg4RkM4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OEZDOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkNBLCAweDAwMDAsIDB4OEZDQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkNDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OEZDRCwgMHg4RkNFLCAweDAwMDAsIDB4OEZDRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkQwLCAweDhGRDEsIDB4OEZEMiwgMHgwMDAwLCAweDhGRDMsIDB4MDAwMCwgMHg4RkQ0LAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhGRDUsIDB4MDAwMCwgMHg4RkQ2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZENywgMHg4RkQ4LCAweDhGRDksIDB4OEZEQSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGREIsIDB4OEZEQywgMHg4RkRELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGREUsIDB4OEZERiwgMHgwMDAwLCAweDhGRTAsIDB4MDAwMCwgMHg4RkUxLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDhGRTIsIDB4OEZFMywgMHg4RkU0LCAweDAwMDAsIDB4MDAwMCwgMHg4RkU1LCAweDAwMDAsIDB4OEZFNiwgMHgwMDAwLCAweDhGRTcsIDB4OEZFOCwgMHg4RkU5LCAweDAwMDAsIDB4OEZFQSwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg4RkVCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGRUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OEZFRCwgMHgwMDAwLCAweDhGRUUsIDB4MDAwMCwgMHg4RkVGLCAweDhGRjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZGMSwgMHgwMDAwLCAweDhGRjIsIDB4MDAwMCwgMHg4RkYzLCAweDhGRjQsCi0gICAgMHgwMDAwLCAweDhGRjUsIDB4MDAwMCwgMHg4RkY2LCAweDAwMDAsIDB4OEZGNywgMHgwMDAwLCAweDAwMDAsIDB4OEZGOCwgMHg4RkY5LCAweDAwMDAsIDB4OEZGQSwgMHg4RkZCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDhGRkMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkZELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZGRSwgMHgwMDAwLCAweDhGRkYsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDAwLCAweDkwMDEsIDB4OTAwMiwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg5MDAzLCAweDAwMDAsIDB4OTAwNCwgMHg5MDA1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OTAwNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg5MDA3LCAweDkwMDgsIDB4OTAwOSwgMHgwMDAwLCAweDkwMEEsIDB4OTAwQiwgMHgwMDAwLCAweDAwMDAsIDB4OTAwQywgMHg5MDBELCAweDAwMDAsIDB4OTAwRSwgMHgwMDAwLCAweDkwMEYsIDB4MDAwMCwgMHg5MDEwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDkwMTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDEyLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDkwMTMsIDB4OTAxNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDE1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwMTYsCi0gICAgMHgwMDAwLCAweDkwMTcsIDB4OTAxOCwgMHgwMDAwLCAweDAwMDAsIDB4OTAxOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwMUEsIDB4OTAxQiwgMHg5MDFDLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTAxRCwgMHgwMDAwLCAweDAwMDAsIDB4OTAxRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTAxRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDIwLCAweDAwMDAsIDB4OTAyMSwgMHg5MDIyLCAweDAwMDAsCi0gICAgMHg5MDIzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDI0LCAweDkwMjUsIDB4OTAyNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTAyNywgMHgwMDAwLAotICAgIDB4OTAyOCwgMHg5MDI5LCAweDkwMkEsIDB4OTAyQiwgMHg5MDJDLCAweDkwMkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDJFLCAweDAwMDAsIDB4OTAyRiwgMHg5MDMwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDMxLCAweDAwMDAsIDB4OTAzMiwgMHgwMDAwLCAweDAwMDAsIDB4OTAzMywgMHg5MDM0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwMzUsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OTAzNiwgMHgwMDAwLCAweDkwMzcsIDB4OTAzOCwgMHg5MDM5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwM0EsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTAzQiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDNDLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDkwM0QsIDB4MDAwMCwgMHg5MDNFLCAweDkwM0YsIDB4OTA0MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDQxLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA0MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDQzLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OTA0NCwgMHgwMDAwLCAweDAwMDAsIDB4OTA0NSwgMHgwMDAwLCAweDkwNDYsIDB4MDAwMCwgMHg5MDQ3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA0OCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg5MDQ5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDRBLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA0QiwgMHgwMDAwLCAweDkwNEMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwNEQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA0RSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA0RiwgMHgwMDAwLCAweDAwMDAsIDB4OTA1MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDkwNTEsIDB4MDAwMCwgMHg5MDUyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwNTMsIDB4OTA1NCwgMHgwMDAwLAotICAgIDB4OTA1NSwgMHg5MDU2LCAweDkwNTcsIDB4OTA1OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDU5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwNUEsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwNUIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA1QywgMHg5MDVELCAweDAwMDAsIDB4OTA1RSwgMHg5MDVGLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OTA2MCwgMHg5MDYxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDYyLCAweDAwMDAsIDB4OTA2MywgMHg5MDY0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA2NSwgMHg5MDY2LCAweDkwNjcsIDB4OTA2OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDY5LCAweDAwMDAsIDB4OTA2QSwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDkwNkIsIDB4OTA2QywgMHgwMDAwLCAweDkwNkQsIDB4MDAwMCwgMHgwMDAwLCAweDkwNkUsIDB4OTA2RiwgMHgwMDAwLCAweDkwNzAsIDB4OTA3MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OTA3MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDczLCAweDAwMDAsIDB4OTA3NCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg5MDc1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDc2LCAweDkwNzcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA3OCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OTA3OSwgMHg5MDdBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDdCLCAweDAwMDAsIDB4MDAwMCwgMHg5MDdDLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA3RCwgMHgwMDAwLCAweDkwN0UsIDB4MDAwMCwgMHgwMDAwLCAweDkwN0YsIDB4OTA4MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDgxLCAweDkwODIsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OTA4MywgMHg5MDg0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA4NSwgMHgwMDAwLCAweDkwODYsIDB4OTA4NywgMHg5MDg4LCAweDAwMDAsIDB4MDAwMCwgMHg5MDg5LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OTA4QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA4QiwgMHg5MDhDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDkwOEQsIDB4MDAwMCwgMHg5MDhFLCAweDAwMDAsIDB4OTA4RiwgMHg5MDkwLCAweDkwOTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDkyLCAweDAwMDAsIDB4OTA5MywKLSAgICAweDkwOTQsIDB4MDAwMCwgMHgwMDAwLCAweDkwOTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA5NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA5NywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwOTgsIDB4OTA5OSwgMHgwMDAwLCAweDkwOUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwOUIsIDB4MDAwMCwgMHg5MDlDLCAweDAwMDAsIDB4OTA5RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg5MDlFLCAweDkwOUYsIDB4OTBBMCwgMHgwMDAwLCAweDkwQTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEEyLCAweDkwQTMsIDB4MDAwMCwgMHg5MEE0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDkwQTUsIDB4MDAwMCwgMHgwMDAwLCAweDkwQTYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwQTcsIDB4MDAwMCwgMHg5MEE4LCAweDkwQTksIDB4OTBBQSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwQUIsIDB4MDAwMCwgMHgwMDAwLCAweDkwQUMsIDB4MDAwMCwgMHg5MEFELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwQUUsCi0gICAgMHg5MEFGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwQjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBCMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEIyLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDkwQjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OTBCNCwgMHg5MEI1LCAweDkwQjYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwQjcsIDB4OTBCOCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg5MEI5LCAweDkwQkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwQkIsIDB4MDAwMCwgMHg5MEJDLCAweDAwMDAsIDB4MDAwMCwgMHg5MEJELAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDkwQkUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEJGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBDMCwgMHgwMDAwLCAweDkwQzEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEMyLCAweDAwMDAsIDB4MDAwMCwgMHg5MEMzLCAweDAwMDAsIDB4OTBDNCwgMHgwMDAwLCAweDkwQzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHg5MEM2LCAweDAwMDAsIDB4MDAwMCwgMHg5MEM3LCAweDkwQzgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBDOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBDQSwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg5MENCLCAweDAwMDAsIDB4OTBDQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwQ0QsIDB4OTBDRSwgMHg5MENGLCAweDkwRDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwRDEsCi0gICAgMHgwMDAwLCAweDkwRDIsIDB4OTBEMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBENCwgMHgwMDAwLCAweDAwMDAsIDB4OTBENSwgMHg5MEQ2LCAweDAwMDAsIDB4OTBENywgMHg5MEQ4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEQ5LCAweDkwREEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MERCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwREMsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OTBERCwgMHgwMDAwLCAweDkwREUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBERiwgMHg5MEUwLCAweDkwRTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEUyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEUzLCAweDAwMDAsIDB4MDAwMCwgMHg5MEU0LCAweDAwMDAsIDB4OTBFNSwgMHg5MEU2LCAweDAwMDAsIDB4OTBFNywgMHg5MEU4LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEU5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBFQSwgMHgwMDAwLCAweDkwRUIsIDB4OTBFQywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEVELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEVFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwRUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwRjAsIDB4OTBGMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEYyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBGMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBGNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEY1LCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBGNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEY3LCAweDAwMDAsIDB4OTBGOCwgMHg5MEY5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEZBLCAweDAwMDAsIDB4OTBGQiwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwRkMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBGRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwRkUsIDB4OTBGRiwgMHgwMDAwLCAweDAwMDAsIDB4OTEwMCwgMHg5MTAxLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDkxMDIsIDB4MDAwMCwgMHg5MTAzLCAweDkxMDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTEwNSwgMHgwMDAwLCAweDAwMDAsIDB4OTEwNiwgMHgwMDAwLCAweDAwMDAsIDB4OTEwNywKLSAgICAweDkxMDgsIDB4OTEwOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkxMEEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTEwQiwgMHgwMDAwLCAweDkxMEMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OTEwRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkxMEUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MTBGLCAweDkxMTAsIDB4MDAwMCwKLSAgICAweDkxMTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTExMiwgMHg5MTEzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkxMTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDkxMTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDkxMTYsIDB4OTExNywgMHg5MTE4LCAweDkxMTksIDB4OTExQSwgMHg5MTFCLCAweDkxMUMsIDB4OTExRCwgMHg5MTFFLCAweDkxMUYsIDB4OTEyMCwgMHg5MTIxLCAweDkxMjIsIDB4OTEyMywgMHg5MTI0LCAweDkxMjUsCi0gICAgMHg5MTI2LCAweDkxMjcsIDB4OTEyOCwgMHg5MTI5LCAweDkxMkEsIDB4OTEyQiwgMHg5MTJDLCAweDkxMkQsIDB4OTEyRSwgMHg5MTJGLCAweDkxMzAsIDB4OTEzMSwgMHg5MTMyLCAweDkxMzMsIDB4OTEzNCwgMHg5MTM1LAotICAgIDB4OTEzNiwgMHg5MTM3LCAweDkxMzgsIDB4OTEzOSwgMHg5MTNBLCAweDkxM0IsIDB4OTEzQywgMHg5MTNELCAweDkxM0UsIDB4OTEzRiwgMHg5MTQwLCAweDkxNDEsIDB4OTE0MiwgMHg5MTQzLCAweDkxNDQsIDB4OTE0NSwKLSAgICAweDkxNDYsIDB4OTE0NywgMHg5MTQ4LCAweDkxNDksIDB4OTE0QSwgMHg5MTRCLCAweDkxNEMsIDB4OTE0RCwgMHg5MTRFLCAweDkxNEYsIDB4OTE1MCwgMHg5MTUxLCAweDkxNTIsIDB4OTE1MywgMHg5MTU0LCAweDkxNTUsCi0gICAgMHg5MTU2LCAweDkxNTcsIDB4OTE1OCwgMHg5MTU5LCAweDkxNUEsIDB4OTE1QiwgMHg5MTVDLCAweDkxNUQsIDB4OTE1RSwgMHg5MTVGLCAweDkxNjAsIDB4OTE2MSwgMHg5MTYyLCAweDkxNjMsIDB4OTE2NCwgMHg5MTY1LAotICAgIDB4OTE2NiwgMHg5MTY3LCAweDkxNjgsIDB4OTE2OSwgMHg5MTZBLCAweDkxNkIsIDB4OTE2QywgMHg5MTZELCAweDkxNkUsIDB4OTE2RiwgMHg5MTcwLCAweDkxNzEsIDB4OTE3MiwgMHg5MTczLCAweDkxNzQsIDB4OTE3NSwKLSAgICAweDkxNzYsIDB4OTE3NywgMHg5MTc4LCAweDkxNzksIDB4OTE3QSwgMHg5MTdCLCAweDkxN0MsIDB4OTE3RCwgMHg5MTdFLCAweDkxN0YsIDB4OTE4MCwgMHg5MTgxLCAweDkxODIsIDB4OTE4MywgMHg5MTg0LCAweDkxODUsCi0gICAgMHg5MTg2LCAweDkxODcsIDB4OTE4OCwgMHg5MTg5LCAweDkxOEEsIDB4OTE4QiwgMHg5MThDLCAweDkxOEQsIDB4OTE4RSwgMHg5MThGLCAweDkxOTAsIDB4OTE5MSwgMHg5MTkyLCAweDkxOTMsIDB4OTE5NCwgMHg5MTk1LAotICAgIDB4OTE5NiwgMHg5MTk3LCAweDkxOTgsIDB4OTE5OSwgMHg5MTlBLCAweDkxOUIsIDB4OTE5QywgMHg5MTlELCAweDkxOUUsIDB4OTE5RiwgMHg5MUEwLCAweDkxQTEsIDB4OTFBMiwgMHg5MUEzLCAweDkxQTQsIDB4OTFBNSwKLSAgICAweDkxQTYsIDB4OTFBNywgMHg5MUE4LCAweDkxQTksIDB4OTFBQSwgMHg5MUFCLCAweDkxQUMsIDB4OTFBRCwgMHg5MUFFLCAweDkxQUYsIDB4OTFCMCwgMHg5MUIxLCAweDkxQjIsIDB4OTFCMywgMHg5MUI0LCAweDkxQjUsCi0gICAgMHg5MUI2LCAweDkxQjcsIDB4OTFCOCwgMHg5MUI5LCAweDkxQkEsIDB4OTFCQiwgMHg5MUJDLCAweDkxQkQsIDB4OTFCRSwgMHg5MUJGLCAweDkxQzAsIDB4OTFDMSwgMHg5MUMyLCAweDkxQzMsIDB4OTFDNCwgMHg5MUM1LAotICAgIDB4OTFDNiwgMHg5MUM3LCAweDkxQzgsIDB4OTFDOSwgMHg5MUNBLCAweDkxQ0IsIDB4OTFDQywgMHg5MUNELCAweDkxQ0UsIDB4OTFDRiwgMHg5MUQwLCAweDkxRDEsIDB4OTFEMiwgMHg5MUQzLCAweDkxRDQsIDB4OTFENSwKLSAgICAweDkxRDYsIDB4OTFENywgMHg5MUQ4LCAweDkxRDksIDB4OTFEQSwgMHg5MURCLCAweDkxREMsIDB4OTFERCwgMHg5MURFLCAweDkxREYsIDB4OTFFMCwgMHg5MUUxLCAweDkxRTIsIDB4OTFFMywgMHg5MUU0LCAweDkxRTUsCi0gICAgMHg5MUU2LCAweDkxRTcsIDB4OTFFOCwgMHg5MUU5LCAweDkxRUEsIDB4OTFFQiwgMHg5MUVDLCAweDkxRUQsIDB4OTFFRSwgMHg5MUVGLCAweDkxRjAsIDB4OTFGMSwgMHg5MUYyLCAweDkxRjMsIDB4OTFGNCwgMHg5MUY1LAotICAgIDB4OTFGNiwgMHg5MUY3LCAweDkxRjgsIDB4OTFGOSwgMHg5MUZBLCAweDkxRkIsIDB4OTFGQywgMHg5MUZELCAweDkxRkUsIDB4OTFGRiwgMHg5MjAwLCAweDkyMDEsIDB4OTIwMiwgMHg5MjAzLCAweDkyMDQsIDB4OTIwNSwKLSAgICAweDkyMDYsIDB4OTIwNywgMHg5MjA4LCAweDkyMDksIDB4OTIwQSwgMHg5MjBCLCAweDkyMEMsIDB4OTIwRCwgMHg5MjBFLCAweDkyMEYsIDB4OTIxMCwgMHg5MjExLCAweDkyMTIsIDB4OTIxMywgMHg5MjE0LCAweDkyMTUsCi0gICAgMHg5MjE2LCAweDkyMTcsIDB4OTIxOCwgMHg5MjE5LCAweDkyMUEsIDB4OTIxQiwgMHg5MjFDLCAweDkyMUQsIDB4OTIxRSwgMHg5MjFGLCAweDkyMjAsIDB4OTIyMSwgMHg5MjIyLCAweDkyMjMsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OTIyNCwgMHgwMDAwLCAweDkyMjUsIDB4MDAwMCwgMHgwMDAwLCAweDkyMjYsIDB4OTIyNywgMHg5MjI4LCAweDkyMjksIDB4OTIyQSwgMHg5MjJCLCAweDkyMkMsIDB4OTIyRCwgMHg5MjJFLCAweDkyMkYsIDB4MDAwMCwKLSAgICAweDkyMzAsIDB4MDAwMCwgMHg5MjMxLCAweDAwMDAsIDB4MDAwMCwgMHg5MjMyLCAweDkyMzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTIzNCwgMHg5MjM1LCAweDkyMzYsIDB4OTIzNywgMHgwMDAwLCAweDAwMDAsCi0gICAgMHg5MjM4LCAweDkyMzksIDB4OTIzQSwgMHg5MjNCLCAweDkyM0MsIDB4OTIzRCwgMHg5MjNFLCAweDkyM0YsIDB4OTI0MCwgMHg5MjQxLCAweDkyNDIsIDB4OTI0MywgMHg5MjQ0LCAweDkyNDUsIDB4OTI0NiwgMHg5MjQ3LAotICAgIDB4OTI0OCwgMHg5MjQ5LCAweDkyNEEsIDB4OTI0QiwgMHg5MjRDLCAweDkyNEQsIDB4OTI0RSwgMHg5MjRGLCAweDkyNTAsIDB4OTI1MSwgMHg5MjUyLCAweDkyNTMsIDB4OTI1NCwgMHg5MjU1LCAweDkyNTYsIDB4OTI1NywKLSAgICAweDkyNTgsIDB4OTI1OSwgMHg5MjVBLCAweDkyNUIsIDB4OTI1QywgMHg5MjVELCAweDkyNUUsIDB4OTI1RiwgMHg5MjYwLCAweDkyNjEsIDB4OTI2MiwgMHg5MjYzLCAweDkyNjQsIDB4OTI2NSwgMHg5MjY2LCAweDkyNjcsCi0gICAgMHg5MjY4LCAweDkyNjksIDB4OTI2QSwgMHg5MjZCLCAweDkyNkMsIDB4OTI2RCwgMHg5MjZFLCAweDkyNkYsIDB4OTI3MCwgMHg5MjcxLCAweDkyNzIsIDB4OTI3MywgMHgwMDAwLCAweDkyNzQsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OTI3NSwgMHg5Mjc2LCAweDkyNzcsIDB4OTI3OCwgMHg5Mjc5LCAweDkyN0EsIDB4OTI3QiwgMHg5MjdDLCAweDkyN0QsIDB4OTI3RSwgMHg5MjdGLCAweDkyODAsIDB4OTI4MSwgMHg5MjgyLCAweDkyODMsIDB4OTI4NCwKLSAgICAweDkyODUsIDB4OTI4NiwgMHg5Mjg3LCAweDkyODgsIDB4OTI4OSwgMHg5MjhBLCAweDkyOEIsIDB4OTI4QywgMHg5MjhELCAweDkyOEUsIDB4OTI4RiwgMHg5MjkwLCAweDkyOTEsIDB4OTI5MiwgMHg5MjkzLCAweDkyOTQsCi0gICAgMHg5Mjk1LCAweDkyOTYsIDB4OTI5NywgMHg5Mjk4LCAweDkyOTksIDB4OTI5QSwgMHg5MjlCLCAweDkyOUMsIDB4OTI5RCwgMHg5MjlFLCAweDkyOUYsIDB4OTJBMCwgMHg5MkExLCAweDkyQTIsIDB4OTJBMywgMHg5MkE0LAotICAgIDB4OTJBNSwgMHg5MkE2LCAweDkyQTcsIDB4OTJBOCwgMHg5MkE5LCAweDkyQUEsIDB4OTJBQiwgMHg5MkFDLCAweDkyQUQsIDB4OTJBRSwgMHg5MkFGLCAweDkyQjAsIDB4OTJCMSwgMHg5MkIyLCAweDkyQjMsIDB4OTJCNCwKLSAgICAweDkyQjUsIDB4OTJCNiwgMHg5MkI3LCAweDkyQjgsIDB4OTJCOSwgMHg5MkJBLCAweDkyQkIsIDB4OTJCQywgMHg5MkJELCAweDkyQkUsIDB4OTJCRiwgMHg5MkMwLCAweDkyQzEsIDB4OTJDMiwgMHg5MkMzLCAweDkyQzQsCi0gICAgMHg5MkM1LCAweDkyQzYsIDB4OTJDNywgMHg5MkM4LCAweDkyQzksIDB4OTJDQSwgMHg5MkNCLCAweDkyQ0MsIDB4OTJDRCwgMHg5MkNFLCAweDkyQ0YsIDB4OTJEMCwgMHg5MkQxLCAweDkyRDIsIDB4OTJEMywgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDkyRDQsIDB4OTJENSwgMHg5MkQ2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkyRDcsIDB4OTJEOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MjNBQywgMHgyM0FFLCAweDIzQjAsIDB4MzMxMiwgMHgzMzE1LCAweDIzQjIsIDB4MjNCNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIzQjYsIDB4MjNCOCwgMHgyM0JBLCAweDIzQkMsIDB4MjNCRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjNDMCwgMHgwMDAwLCAweDIzQzIsCi0gICAgMHg5MkQ5LCAweDkyREEsIDB4OTJEQiwgMHg5MkRDLCAweDkyREQsIDB4OTJERSwgMHg5MkRGLCAweDkyRTAsIDB4OTJFMSwgMHg5MkUyLCAweDIzQzQsIDB4MjNDNiwgMHgyM0M4LCAweDIzQ0EsIDB4MjNDQywgMHgyM0NFLAotICAgIDB4MjNEMCwgMHgyM0QyLCAweDIzRDQsIDB4MjNENiwgMHgyM0Q4LCAweDIzREEsIDB4MjNEQywgMHgwMDAwLCAweDIzREUsIDB4MjNFMCwgMHgyM0UyLCAweDIzRTQsIDB4MjNFNiwgMHgwMDAwLCAweDIzRTgsIDB4MDAwMCwKLSAgICAweDIzRUEsIDB4MjNFQywgMHgwMDAwLCAweDIzRUUsIDB4MjNGMCwgMHgwMDAwLCAweDIzRjIsIDB4MjNGNCwgMHgyM0Y2LCAweDIzRjgsIDB4MjNGQSwgMHgyM0ZDLCAweDIzRkUsIDB4MjQwMCwgMHgyNDAyLCAweDI0MDQsCi0gICAgMHg5MkUzLCAweDkyRTQsIDB4OTJFNSwgMHg5MkU2LCAweDkyRTcsIDB4OTJFOCwgMHg5MkU5LCAweDkyRUEsIDB4OTJFQiwgMHg5MkVDLCAweDkyRUQsIDB4OTJFRSwgMHg5MkVGLCAweDkyRjAsIDB4OTJGMSwgMHg5MkYyLAotICAgIDB4OTJGMywgMHg5MkY0LCAweDkyRjUsIDB4OTJGNiwgMHg5MkY3LCAweDkyRjgsIDB4OTJGOSwgMHg5MkZBLCAweDkyRkIsIDB4OTJGQywgMHg5MkZELCAweDkyRkUsIDB4OTJGRiwgMHg5MzAwLCAweDkzMDEsIDB4OTMwMiwKLSAgICAweDkzMDMsIDB4OTMwNCwgMHg5MzA1LCAweDkzMDYsIDB4OTMwNywgMHg5MzA4LCAweDkzMDksIDB4OTMwQSwgMHg5MzBCLCAweDkzMEMsIDB4OTMwRCwgMHg5MzBFLCAweDkzMEYsIDB4OTMxMCwgMHg5MzExLCAweDkzMTIsCi0gICAgMHg5MzEzLCAweDkzMTQsIDB4OTMxNSwgMHg5MzE2LCAweDkzMTcsIDB4OTMxOCwgMHg5MzE5LCAweDkzMUEsIDB4OTMxQiwgMHg5MzFDLCAweDkzMUQsIDB4OTMxRSwgMHg5MzFGLCAweDkzMjAsIDB4OTMyMSwgMHg5MzIyLAotICAgIDB4OTMyMywgMHg5MzI0LCAweDkzMjUsIDB4OTMyNiwgMHg5MzI3LCAweDkzMjgsIDB4OTMyOSwgMHg5MzJBLCAweDkzMkIsIDB4OTMyQywgMHg5MzJELCAweDkzMkUsIDB4OTMyRiwgMHg5MzMwLCAweDkzMzEsIDB4OTMzMiwKLSAgICAweDkzMzMsIDB4OTMzNCwgMHg5MzM1LCAweDkzMzYsIDB4OTMzNywgMHg5MzM4LCAweDkzMzksIDB4OTMzQSwgMHg5MzNCLCAweDkzM0MsIDB4OTMzRCwgMHg5MzNFLCAweDkzM0YsIDB4OTM0MCwgMHg5MzQxLCAweDkzNDIsCi0gICAgMHg5MzQzLCAweDkzNDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkzNDUsIDB4OTM0NiwgMHg5MzQ3LCAweDkzNDgsIDB4OTM0OSwgMHg5MzRBLCAweDkzNEIsIDB4OTM0QywgMHg5MzRELCAweDkzNEUsIDB4OTM0RiwgMHg5MzUwLCAweDkzNTEsCi0gICAgMHg5MzUyLCAweDkzNTMsIDB4OTM1NCwgMHg5MzU1LCAweDkzNTYsIDB4OTM1NywgMHg5MzU4LCAweDkzNTksIDB4OTM1QSwgMHg5MzVCLCAweDI0MDYsIDB4MjQwOCwgMHgyNDBBLCAweDI0MEMsIDB4MjQwRSwgMHgyNDEwLAotICAgIDB4MjQxMiwgMHgyNDE0LCAweDI0MTYsIDB4MjQxOCwgMHgyNDFBLCAweDI0MUMsIDB4MjQxRSwgMHgyNDIwLCAweDI0MjIsIDB4MjQyNCwgMHgyNDI2LCAweDI0MjgsIDB4OTM1QywgMHg5MzVELCAweDkzNUUsIDB4OTM1RiwKLSAgICAweDI0MkEsIDB4MjQyQywgMHgyNDJFLCAweDI0MzAsIDB4MjQzMiwgMHgyNDM0LCAweDI0MzYsIDB4MjQzOCwgMHgyNDNBLCAweDI0M0MsIDB4MjQzRSwgMHgyNDQwLCAweDI0NDIsIDB4MjQ0NCwgMHgyNDQ2LCAweDI0NDgsCi0gICAgMHgyNDRBLCAweDI0NEMsIDB4MjQ0RSwgMHgyNDUwLCAweDI0NTIsIDB4MjQ1NCwgMHgyNDU2LCAweDI0NTgsIDB4MjQ1QSwgMHgyNDVDLCAweDI0NUUsIDB4MjQ2MCwgMHgyNDYyLCAweDI0NjQsIDB4MjQ2NiwgMHgyNDY4LAotICAgIDB4MjQ2QSwgMHgyNDZDLCAweDI0NkUsIDB4MjQ3MCwgMHgyNDcyLCAweDI0NzQsIDB4MjQ3NiwgMHgyNDc4LCAweDI0N0EsIDB4MjQ3QywgMHgyNDdFLCAweDI0ODAsIDB4MjQ4MiwgMHgyNDg0LCAweDI0ODYsIDB4MjQ4OCwKLSAgICAweDI0OEEsIDB4MjQ4QywgMHgyNDhFLCAweDI0OTAsIDB4MjQ5MiwgMHgyNDk0LCAweDI0OTYsIDB4MjQ5OCwgMHgyNDlBLCAweDI0OUMsIDB4MjQ5RSwgMHgyNEEwLCAweDI0QTIsIDB4MjRBNCwgMHgyNEE2LCAweDI0QTgsCi0gICAgMHgyNEFBLCAweDI0QUMsIDB4MjRBRSwgMHgyNEIwLCAweDI0QjIsIDB4MjRCNCwgMHgyNEI2LCAweDI0QjgsIDB4MjRCQSwgMHgyNEJDLCAweDI0QkUsIDB4MjRDMCwgMHgyNEMyLCAweDI0QzQsIDB4MjRDNiwgMHgyNEM4LAotICAgIDB4MjRDQSwgMHgyNENDLCAweDI0Q0UsIDB4MjREMCwgMHgyNEQyLCAweDI0RDQsIDB4MjRENiwgMHgyNEQ4LCAweDI0REEsIDB4MjREQywgMHgyNERFLCAweDI0RTAsIDB4MjRFMiwgMHgyNEU0LCAweDI0RTYsIDB4MjRFOCwKLSAgICAweDI0RUEsIDB4MjRFQywgMHgyNEVFLCAweDI0RjAsIDB4MjRGMiwgMHgyNEY0LCAweDI0RjYsIDB4MjRGOCwgMHgyNEZBLCAweDI0RkMsIDB4MjRGRSwgMHgyNTAwLCAweDI1MDIsIDB4MjUwNCwgMHgyNTA2LCAweDI1MDgsCi0gICAgMHgyNTBBLCAweDI1MEMsIDB4MjUwRSwgMHgyNTEwLCAweDI1MTIsIDB4MjUxNCwgMHgyNTE2LCAweDI1MTgsIDB4MjUxQSwgMHgyNTFDLCAweDI1MUUsIDB4MjUyMCwgMHgyNTIyLCAweDI1MjQsIDB4MjUyNiwgMHgyNTI4LAotICAgIDB4MjUyQSwgMHgyNTJDLCAweDI1MkUsIDB4MjUzMCwgMHgyNTMyLCAweDI1MzQsIDB4MjUzNiwgMHgyNTM4LCAweDI1M0EsIDB4MjUzQywgMHgyNTNFLCAweDI1NDAsIDB4MjU0MiwgMHgyNTQ0LCAweDI1NDYsIDB4MjU0OCwKLSAgICAweDI1NEEsIDB4MjU0QywgMHgyNTRFLCAweDI1NTAsIDB4MjU1MiwgMHgyNTU0LCAweDI1NTYsIDB4MjU1OCwgMHgyNTVBLCAweDI1NUMsIDB4MjU1RSwgMHgyNTYwLCAweDI1NjIsIDB4MjU2NCwgMHgyNTY2LCAweDI1NjgsCi0gICAgMHgyNTZBLCAweDI1NkMsIDB4MjU2RSwgMHgyNTcwLCAweDI1NzIsIDB4MjU3NCwgMHgyNTc2LCAweDI1NzgsIDB4MjU3QSwgMHgyNTdDLCAweDI1N0UsIDB4MjU4MCwgMHgyNTgyLCAweDI1ODQsIDB4MjU4NiwgMHgyNTg4LAotICAgIDB4MjU4QSwgMHgyNThDLCAweDI1OEUsIDB4MjU5MCwgMHgyNTkyLCAweDI1OTQsIDB4MjU5NiwgMHgyNTk4LCAweDI1OUEsIDB4MjU5QywgMHgyNTlFLCAweDI1QTAsIDB4MjVBMiwgMHgyNUE0LCAweDI1QTYsIDB4MjVBOCwKLSAgICAweDI1QUEsIDB4MjVBQywgMHgyNUFFLCAweDI1QjAsIDB4MjVCMiwgMHgyNUI0LCAweDI1QjYsIDB4MjVCOCwgMHgyNUJBLCAweDI1QkMsIDB4MjVCRSwgMHgyNUMwLCAweDI1QzIsIDB4MjVDNCwgMHgyNUM2LCAweDI1QzgsCi0gICAgMHgyNUNBLCAweDI1Q0MsIDB4MjVDRSwgMHgyNUQwLCAweDI1RDIsIDB4MjVENCwgMHgyNUQ2LCAweDI1RDgsIDB4MjVEQSwgMHgyNURDLCAweDI1REUsIDB4MjVFMCwgMHgyNUUyLCAweDI1RTQsIDB4MjVFNiwgMHgyNUU4LAotICAgIDB4MjVFQSwgMHgyNUVDLCAweDI1RUUsIDB4MjVGMCwgMHgyNUYyLCAweDI1RjQsIDB4MjVGNiwgMHgyNUY4LCAweDI1RkEsIDB4MjVGQywgMHgyNUZFLCAweDI2MDAsIDB4MjYwMiwgMHgyNjA0LCAweDI2MDYsIDB4MjYwOCwKLSAgICAweDI2MEEsIDB4MjYwQywgMHgzMzE4LCAweDMzMUIsIDB4MzMxRSwgMHgyNjBFLCAweDI2MTAsIDB4MjYxMiwgMHgyNjE0LCAweDI2MTYsIDB4MjYxOCwgMHgyNjFBLCAweDI2MUMsIDB4MjYxRSwgMHgyNjIwLCAweDI2MjIsCi0gICAgMHgyNjI0LCAweDI2MjYsIDB4MjYyOCwgMHgyNjJBLCAweDI2MkMsIDB4MjYyRSwgMHgyNjMwLCAweDI2MzIsIDB4MjYzNCwgMHgyNjM2LCAweDI2MzgsIDB4MjYzQSwgMHgyNjNDLCAweDI2M0UsIDB4MjY0MCwgMHgyNjQyLAotICAgIDB4MjY0NCwgMHgyNjQ2LCAweDI2NDgsIDB4MjY0QSwgMHgyNjRDLCAweDI2NEUsIDB4MjY1MCwgMHgyNjUyLCAweDI2NTQsIDB4MjY1NiwgMHgyNjU4LCAweDI2NUEsIDB4MjY1QywgMHgyNjVFLCAweDI2NjAsIDB4MjY2MiwKLSAgICAweDI2NjQsIDB4MjY2NiwgMHgyNjY4LCAweDI2NkEsIDB4MjY2QywgMHgyNjZFLCAweDI2NzAsIDB4MjY3MiwgMHgyNjc0LCAweDI2NzYsIDB4MjY3OCwgMHgyNjdBLCAweDI2N0MsIDB4MjY3RSwgMHgyNjgwLCAweDI2ODIsCi0gICAgMHgyNjg0LCAweDI2ODYsIDB4MjY4OCwgMHgyNjhBLCAweDI2OEMsIDB4MjY4RSwgMHgyNjkwLCAweDI2OTIsIDB4MjY5NCwgMHgyNjk2LCAweDI2OTgsIDB4MjY5QSwgMHgyNjlDLCAweDI2OUUsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDMzMjEsIDB4MzMyNCwgMHgzMzI3LCAweDMzMkEsIDB4MzMyRCwgMHgzMzMwLCAweDMzMzMsIDB4MzMzNiwgMHgzMzM5LCAweDMzM0MsIDB4MzMzRiwgMHgzMzQyLCAweDMzNDUsIDB4MzM0OCwgMHgzMzRCLCAweDMzNEUsCi0gICAgMHgzMzUxLCAweDMzNTQsIDB4MzM1NywgMHgzMzVBLCAweDMzNUQsIDB4MzM2MCwgMHgzMzYzLCAweDMzNjYsIDB4MzM2OSwgMHgzMzZDLCAweDMzNkYsIDB4MzM3MiwgMHgzMzc1LCAweDMzNzgsIDB4MzM3QiwgMHgzMzdFLAotICAgIDB4MzM4MSwgMHgzMzg0LCAweDMzODcsIDB4MzM4QSwgMHgzMzhELCAweDMzOTAsIDB4MzM5MywgMHgzMzk2LCAweDMzOTksIDB4MzM5QywgMHgzMzlGLCAweDMzQTIsIDB4MzNBNSwgMHgzM0E4LCAweDMzQUIsIDB4MzNBRSwKLSAgICAweDMzQjEsIDB4MzNCNCwgMHgzM0I3LCAweDMzQkEsIDB4MzNCRCwgMHgzM0MwLCAweDMzQzMsIDB4MzNDNiwgMHgzM0M5LCAweDMzQ0MsIDB4MzNDRiwgMHgzM0QyLCAweDMzRDUsIDB4MzNEOCwgMHgzM0RCLCAweDMzREUsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MzNFMSwgMHgzM0U0LCAweDMzRTcsIDB4MzNFQSwgMHgzM0VELCAweDMzRjAsIDB4MzNGMywgMHgzM0Y2LCAweDMzRjksIDB4MzNGQywgMHgzM0ZGLCAweDM0MDIsIDB4MzQwNSwgMHgzNDA4LAotICAgIDB4MzQwQiwgMHgzNDBFLCAweDM0MTEsIDB4MzQxNCwgMHgzNDE3LCAweDM0MUEsIDB4MzQxRCwgMHgzNDIwLCAweDM0MjMsIDB4MzQyNiwgMHgzNDI5LCAweDM0MkMsIDB4MzQyRiwgMHgzNDMyLCAweDM0MzUsIDB4MzQzOCwKLSAgICAweDM0M0IsIDB4MzQzRSwgMHgzNDQxLCAweDM0NDQsIDB4MzQ0NywgMHgzNDRBLCAweDM0NEQsIDB4MzQ1MCwgMHgzNDUzLCAweDM0NTYsIDB4MzQ1OSwgMHgzNDVDLCAweDM0NUYsIDB4MzQ2MiwgMHgzNDY1LCAweDM0NjgsCi0gICAgMHgzNDZCLCAweDM0NkUsIDB4MzQ3MSwgMHgzNDc0LCAweDM0NzcsIDB4MzQ3QSwgMHgzNDdELCAweDM0ODAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgzNDgzLCAweDM0ODYsIDB4NDFBNCwgMHg0MUE5LCAweDQxQUUsIDB4NDFCMywgMHg0MUI4LCAweDQxQkQsIDB4NDFDMiwgMHgzNDg5LCAweDQxQzcsIDB4NDFEQSwgMHg0MUUzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDkzNjAsIDB4OTM2MSwgMHg5MzYyLCAweDkzNjMsIDB4OTM2NCwgMHg5MzY1LCAweDkzNjYsIDB4OTM2NywgMHg5MzY4LCAweDkzNjksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OTM2QSwgMHg5MzZCLCAweDkzNkMsIDB4OTM2RCwgMHg5MzZFLCAweDkzNkYsIDB4OTM3MCwgMHg5MzcxLCAweDkzNzIsIDB4OTM3MywgMHg5Mzc0LCAweDkzNzUsIDB4OTM3NiwgMHg5Mzc3LCAweDkzNzgsIDB4OTM3OSwKLSAgICAweDkzN0EsIDB4OTM3QiwgMHg5MzdDLCAweDkzN0QsIDB4OTM3RSwgMHgwMDAwLCAweDAwMDAsIDB4OTM3RiwgMHg5MzgwLCAweDkzODEsIDB4OTM4MiwgMHg5MzgzLCAweDkzODQsIDB4OTM4NSwgMHg5Mzg2LCAweDkzODcsCi0gICAgMHg5Mzg4LCAweDkzODksIDB4OTM4QSwgMHgwMDAwLCAweDkzOEIsIDB4OTM4QywgMHg5MzhELCAweDkzOEUsIDB4OTM4RiwgMHg5MzkwLCAweDkzOTEsIDB4OTM5MiwgMHg5MzkzLCAweDkzOTQsIDB4OTM5NSwgMHg5Mzk2LAotICAgIDB4OTM5NywgMHg5Mzk4LCAweDkzOTksIDB4OTM5QSwgMHg5MzlCLCAweDkzOUMsIDB4OTM5RCwgMHgwMDAwLCAweDkzOUUsIDB4OTM5RiwgMHg5M0EwLCAweDkzQTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDkzQTIsIDB4MjZBMCwgMHg5M0EzLCAweDAwMDAsIDB4OTNBNCwgMHgwMDAwLCAweDkzQTUsIDB4MjZBMiwgMHg5M0E2LCAweDI2QTQsIDB4OTNBNywgMHgyNkE2LCAweDkzQTgsIDB4MjZBOCwgMHg5M0E5LCAweDI2QUEsCi0gICAgMHg5M0FBLCAweDkzQUIsIDB4OTNBQywgMHg5M0FELCAweDkzQUUsIDB4OTNBRiwgMHg5M0IwLCAweDkzQjEsIDB4OTNCMiwgMHg5M0IzLCAweDkzQjQsIDB4OTNCNSwgMHg5M0I2LCAweDkzQjcsIDB4OTNCOCwgMHg5M0I5LAotICAgIDB4OTNCQSwgMHg5M0JCLCAweDkzQkMsIDB4OTNCRCwgMHg5M0JFLCAweDkzQkYsIDB4OTNDMCwgMHg5M0MxLCAweDkzQzIsIDB4OTNDMywgMHg5M0M0LCAweDkzQzUsIDB4OTNDNiwgMHg5M0M3LCAweDkzQzgsIDB4OTNDOSwKLSAgICAweDkzQ0EsIDB4OTNDQiwgMHg5M0NDLCAweDkzQ0QsIDB4OTNDRSwgMHg5M0NGLCAweDkzRDAsIDB4OTNEMSwgMHg5M0QyLCAweDkzRDMsIDB4OTNENCwgMHg5M0Q1LCAweDkzRDYsIDB4OTNENywgMHg5M0Q4LCAweDkzRDksCi0gICAgMHg5M0RBLCAweDkzREIsIDB4OTNEQywgMHg5M0RELCAweDkzREUsIDB4OTNERiwgMHg5M0UwLCAweDkzRTEsIDB4OTNFMiwgMHg5M0UzLCAweDkzRTQsIDB4OTNFNSwgMHg5M0U2LCAweDkzRTcsIDB4OTNFOCwgMHg5M0U5LAotICAgIDB4OTNFQSwgMHg5M0VCLCAweDkzRUMsIDB4OTNFRCwgMHg5M0VFLCAweDkzRUYsIDB4OTNGMCwgMHg5M0YxLCAweDkzRjIsIDB4OTNGMywgMHg5M0Y0LCAweDkzRjUsIDB4OTNGNiwgMHg5M0Y3LCAweDkzRjgsIDB4OTNGOSwKLSAgICAweDkzRkEsIDB4OTNGQiwgMHg5M0ZDLCAweDkzRkQsIDB4OTNGRSwgMHg5M0ZGLCAweDk0MDAsIDB4OTQwMSwgMHg5NDAyLCAweDk0MDMsIDB4OTQwNCwgMHg5NDA1LCAweDk0MDYsIDB4OTQwNywgMHg5NDA4LCAweDk0MDksCi0gICAgMHg5NDBBLCAweDk0MEIsIDB4OTQwQywgMHg5NDBELCAweDk0MEUsIDB4OTQwRiwgMHg5NDEwLCAweDk0MTEsIDB4OTQxMiwgMHg5NDEzLCAweDk0MTQsIDB4OTQxNSwgMHg5NDE2LCAweDk0MTcsIDB4OTQxOCwgMHg5NDE5LAotICAgIDB4OTQxQSwgMHg5NDFCLCAweDk0MUMsIDB4OTQxRCwgMHg5NDFFLCAweDI2QUMsIDB4MjZBRSwgMHgyNkIwLCAweDI2QjIsIDB4MjZCNCwgMHgyNkI2LCAweDI2QjgsIDB4MjZCQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4OTQxRiwgMHg5NDIwLCAweDk0MjEsIDB4OTQyMiwgMHg5NDIzLCAweDk0MjQsIDB4OTQyNSwgMHg5NDI2LCAweDk0MjcsIDB4OTQyOCwgMHg5NDI5LCAweDk0MkEsIDB4OTQyQiwgMHg5NDJDLCAweDk0MkQsCi0gICAgMHg5NDJFLCAweDk0MkYsIDB4OTQzMCwgMHg5NDMxLCAweDk0MzIsIDB4OTQzMywgMHg5NDM0LCAweDk0MzUsIDB4OTQzNiwgMHg5NDM3LCAweDk0MzgsIDB4OTQzOSwgMHg5NDNBLCAweDk0M0IsIDB4OTQzQywgMHg5NDNELAotICAgIDB4OTQzRSwgMHg5NDNGLCAweDk0NDAsIDB4OTQ0MSwgMHg5NDQyLCAweDk0NDMsIDB4OTQ0NCwgMHg5NDQ1LCAweDk0NDYsIDB4OTQ0NywgMHg5NDQ4LCAweDk0NDksIDB4OTQ0QSwgMHg5NDRCLCAweDk0NEMsIDB4OTQ0RCwKLSAgICAweDk0NEUsIDB4OTQ0RiwgMHg5NDUwLCAweDk0NTEsIDB4OTQ1MiwgMHg5NDUzLCAweDk0NTQsIDB4OTQ1NSwgMHg5NDU2LCAweDk0NTcsIDB4OTQ1OCwgMHg5NDU5LCAweDk0NUEsIDB4OTQ1QiwgMHg5NDVDLCAweDk0NUQsCi0gICAgMHg5NDVFLCAweDk0NUYsIDB4OTQ2MCwgMHg5NDYxLCAweDk0NjIsIDB4OTQ2MywgMHg5NDY0LCAweDk0NjUsIDB4OTQ2NiwgMHg5NDY3LCAweDk0NjgsIDB4OTQ2OSwgMHg5NDZBLCAweDk0NkIsIDB4OTQ2QywgMHg5NDZELAotICAgIDB4OTQ2RSwgMHg5NDZGLCAweDk0NzAsIDB4OTQ3MSwgMHg5NDcyLCAweDk0NzMsIDB4OTQ3NCwgMHg5NDc1LCAweDk0NzYsIDB4OTQ3NywgMHg5NDc4LCAweDk0NzksIDB4OTQ3QSwgMHg5NDdCLCAweDk0N0MsIDB4OTQ3RCwKLSAgICAweDk0N0UsIDB4OTQ3RiwgMHg5NDgwLCAweDk0ODEsIDB4OTQ4MiwgMHg5NDgzLCAweDk0ODQsIDB4OTQ4NSwgMHg5NDg2LCAweDk0ODcsIDB4OTQ4OCwgMHg5NDg5LCAweDk0OEEsIDB4OTQ4QiwgMHg5NDhDLCAweDk0OEQsCi0gICAgMHg5NDhFLCAweDk0OEYsIDB4OTQ5MCwgMHg5NDkxLCAweDk0OTIsIDB4OTQ5MywgMHg5NDk0LCAweDk0OTUsIDB4OTQ5NiwgMHg5NDk3LCAweDk0OTgsIDB4OTQ5OSwgMHg5NDlBLCAweDk0OUIsIDB4OTQ5QywgMHg5NDlELAotICAgIDB4OTQ5RSwgMHg5NDlGLCAweDk0QTAsIDB4OTRBMSwgMHg5NEEyLCAweDk0QTMsIDB4OTRBNCwgMHg5NEE1LCAweDk0QTYsIDB4OTRBNywgMHg5NEE4LCAweDk0QTksIDB4OTRBQSwgMHg5NEFCLCAweDk0QUMsIDB4OTRBRCwKLSAgICAweDk0QUUsIDB4OTRBRiwgMHg5NEIwLCAweDk0QjEsIDB4OTRCMiwgMHg5NEIzLCAweDk0QjQsIDB4OTRCNSwgMHg5NEI2LCAweDk0QjcsIDB4OTRCOCwgMHg5NEI5LCAweDk0QkEsIDB4OTRCQiwgMHg5NEJDLCAweDk0QkQsCi0gICAgMHg5NEJFLCAweDk0QkYsIDB4OTRDMCwgMHg5NEMxLCAweDk0QzIsIDB4OTRDMywgMHg5NEM0LCAweDk0QzUsIDB4OTRDNiwgMHg5NEM3LCAweDk0QzgsIDB4OTRDOSwgMHg5NENBLCAweDk0Q0IsIDB4OTRDQywgMHg5NENELAotICAgIDB4OTRDRSwgMHg5NENGLCAweDk0RDAsIDB4OTREMSwgMHg5NEQyLCAweDk0RDMsIDB4OTRENCwgMHg5NEQ1LCAweDk0RDYsIDB4OTRENywgMHg5NEQ4LCAweDk0RDksIDB4OTREQSwgMHg5NERCLCAweDk0REMsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHg5NERELCAweDk0REUsIDB4OTRERiwgMHg5NEUwLCAweDk0RTEsIDB4OTRFMiwgMHgwMDAwLCAweDAwMDAsIDB4OTRFMywgMHg5NEU0LCAweDk0RTUsIDB4OTRFNiwgMHg5NEU3LCAweDk0RTgsCi0gICAgMHgwMDAwLCAweDAwMDAsIDB4OTRFOSwgMHg5NEVBLCAweDk0RUIsIDB4OTRFQywgMHg5NEVELCAweDk0RUUsIDB4MDAwMCwgMHgwMDAwLCAweDk0RUYsIDB4OTRGMCwgMHg5NEYxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotICAgIDB4OTRGMiwgMHg5NEYzLCAweDk0RjQsIDB4OTRGNSwgMHg5NEY2LCAweDk0RjcsIDB4OTRGOCwgMHgwMDAwLCAweDk0RjksIDB4OTRGQSwgMHg5NEZCLCAweDk0RkMsIDB4OTRGRCwgMHg5NEZFLCAweDk0RkYsIDB4MDAwMCwKLSAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAKLX07Ci1leHRlcm4gY29uc3QgRlhfV0NIQVIgZ19Vbmljb2RlRGF0YV9Ob3JtYWxpemF0aW9uX01hcDFbNTM3Nl0gPSB7Ci0gICAgMHgwMDY2LCAweDAwNTMsIDB4MDA1MywgMHgwMDU5LCAweDAwMjAsIDB4MDMwOCwgMHgwMDYxLCAweDAwNTIsIDB4MDMwNCwgMHgwMDMyLCAweDAwMzMsIDB4MDMwMSwgMHgwM0JDLCAweDAzMjcsIDB4MDAzMSwgMHgwMDZGLAotICAgIDB4MDA0MSwgMHgwMDQxLCAweDAwNDEsIDB4MDA0MSwgMHgwMDQxLCAweDAwNDEsIDB4MDA0MywgMHgwMDQ1LCAweDAwNDUsIDB4MDA0NSwgMHgwMDQ1LCAweDAwNDksIDB4MDA0OSwgMHgwMDQ5LCAweDAwNDksIDB4MDA0NCwKLSAgICAweDAwNEUsIDB4MDA0RiwgMHgwMDRGLCAweDAwNEYsIDB4MDA0RiwgMHgwMDRGLCAweDAwNEYsIDB4MDA1NSwgMHgwMDU1LCAweDAwNTUsIDB4MDA1NSwgMHgwMDU5LCAweDAwNjEsIDB4MDA2MSwgMHgwMDYxLCAweDAwNjEsCi0gICAgMHgwMDYxLCAweDAwNjEsIDB4MDA2MywgMHgwMDY1LCAweDAwNjUsIDB4MDA2NSwgMHgwMDY1LCAweDAwNjksIDB4MDA2OSwgMHgwMDY5LCAweDAwNjksIDB4MDA2RSwgMHgwMDZGLCAweDAwNkYsIDB4MDA2RiwgMHgwMDZGLAotICAgIDB4MDA2RiwgMHgwMDZGLCAweDAwNzUsIDB4MDA3NSwgMHgwMDc1LCAweDAwNzUsIDB4MDA3OSwgMHgwMDc5LCAweDAwNDEsIDB4MDA2MSwgMHgwMDQxLCAweDAwNjEsIDB4MDA0MSwgMHgwMDYxLCAweDAwNDMsIDB4MDA2MywKLSAgICAweDAwNDMsIDB4MDA2MywgMHgwMDQzLCAweDAwNjMsIDB4MDA0MywgMHgwMDYzLCAweDAwNDQsIDB4MDA2NCwgMHgwMDQ0LCAweDAwNjQsIDB4MDA0NSwgMHgwMDY1LCAweDAwNDUsIDB4MDA2NSwgMHgwMDQ1LCAweDAwNjUsCi0gICAgMHgwMDQ1LCAweDAwNjUsIDB4MDA0NSwgMHgwMDY1LCAweDAwNDcsIDB4MDA2NywgMHgwMDQ3LCAweDAwNjcsIDB4MDA0NywgMHgwMDY3LCAweDAwNDcsIDB4MDA2NywgMHgwMDQ4LCAweDAwNjgsIDB4MDA0OCwgMHgwMDY4LAotICAgIDB4MDA0OSwgMHgwMDY5LCAweDAwNDksIDB4MDA2OSwgMHgwMDQ5LCAweDAwNjksIDB4MDA0OSwgMHgwMDY5LCAweDAwNDksIDB4MDA0QSwgMHgwMDZBLCAweDAwNEIsIDB4MDA2QiwgMHgwMDRCLCAweDAwNEMsIDB4MDA2QywKLSAgICAweDAwNEMsIDB4MDA2QywgMHgwMDRDLCAweDAwNkMsIDB4MDA0QywgMHgwMDZDLCAweDAwNEMsIDB4MDA2QywgMHgwMDRFLCAweDAwNkUsIDB4MDA0RSwgMHgwMDZFLCAweDAwNEUsIDB4MDA2RSwgMHgwMDZFLCAweDAwNEYsCi0gICAgMHgwMDZGLCAweDAwNEYsIDB4MDA2RiwgMHgwMDRGLCAweDAwNkYsIDB4MDA1MiwgMHgwMDcyLCAweDAwNTIsIDB4MDA3MiwgMHgwMDUyLCAweDAwNzIsIDB4MDA1MywgMHgwMDczLCAweDAwNTMsIDB4MDA3MywgMHgwMDUzLAotICAgIDB4MDA3MywgMHgwMDUzLCAweDAwNzMsIDB4MDA1NCwgMHgwMDc0LCAweDAwNTQsIDB4MDA3NCwgMHgwMDU0LCAweDAwNzQsIDB4MDA1NSwgMHgwMDc1LCAweDAwNTUsIDB4MDA3NSwgMHgwMDU1LCAweDAwNzUsIDB4MDA1NSwKLSAgICAweDAwNzUsIDB4MDA1NSwgMHgwMDc1LCAweDAwNTUsIDB4MDA3NSwgMHgwMDU3LCAweDAwNzcsIDB4MDA1OSwgMHgwMDc5LCAweDAwNTksIDB4MDA1QSwgMHgwMDdBLCAweDAwNUEsIDB4MDA3QSwgMHgwMDVBLCAweDAwN0EsCi0gICAgMHgwMDczLCAweDAwNjIsIDB4MDA0MiwgMHgwMDQyLCAweDAwNjIsIDB4MDA0MywgMHgwMDYzLCAweDAwNDQsIDB4MDA0NCwgMHgwMDQ0LCAweDAwNjQsIDB4MDA0NSwgMHgwMDQ1LCAweDAwNDYsIDB4MDA2NiwgMHgwMDQ3LAotICAgIDB4MDA0OSwgMHgwMDRCLCAweDAwNkIsIDB4MDA2QywgMHgwMDRELCAweDAwNEUsIDB4MDA2RSwgMHgwMDRGLCAweDAwNEYsIDB4MDA2RiwgMHgwMDUwLCAweDAwNzAsIDB4MDI4MywgMHgwMDc0LCAweDAwNTQsIDB4MDA3NCwKLSAgICAweDAwNTQsIDB4MDA1NSwgMHgwMDc1LCAweDAwNTYsIDB4MDA1OSwgMHgwMDc5LCAweDAwNUEsIDB4MDA3QSwgMHgwMUI3LCAweDAwNDEsIDB4MDA2MSwgMHgwMDQ5LCAweDAwNjksIDB4MDA0RiwgMHgwMDZGLCAweDAwNTUsCi0gICAgMHgwMDc1LCAweDAwREMsIDB4MDBGQywgMHgwMERDLCAweDAwRkMsIDB4MDBEQywgMHgwMEZDLCAweDAwREMsIDB4MDBGQywgMHgwMDY1LCAweDAwNDEsIDB4MDA2MSwgMHgwMDQxLCAweDAwNjEsIDB4MDBDNiwgMHgwMEU2LAotICAgIDB4MDA0NywgMHgwMDY3LCAweDAwNDcsIDB4MDA2NywgMHgwMDRCLCAweDAwNkIsIDB4MDA0RiwgMHgwMDZGLCAweDAxRUEsIDB4MDFFQiwgMHgwMUI3LCAweDAyOTIsIDB4MDA2QSwgMHgwMDQ3LCAweDAwNjcsIDB4MDA0RSwKLSAgICAweDAwNkUsIDB4MDA0MSwgMHgwMDYxLCAweDAwQzYsIDB4MDBFNiwgMHgwMEQ4LCAweDAwRjgsIDB4MDA0MSwgMHgwMDYxLCAweDAwNDEsIDB4MDA2MSwgMHgwMDQ1LCAweDAwNjUsIDB4MDA0NSwgMHgwMDY1LCAweDAwNDksCi0gICAgMHgwMDY5LCAweDAwNDksIDB4MDA2OSwgMHgwMDRGLCAweDAwNkYsIDB4MDA0RiwgMHgwMDZGLCAweDAwNTIsIDB4MDA3MiwgMHgwMDUyLCAweDAwNzIsIDB4MDA1NSwgMHgwMDc1LCAweDAwNTUsIDB4MDA3NSwgMHgwMDUzLAotICAgIDB4MDA3MywgMHgwMDU0LCAweDAwNzQsIDB4MDA0OCwgMHgwMDY4LCAweDAwNEUsIDB4MDA2NCwgMHgwMDVBLCAweDAwN0EsIDB4MDA0MSwgMHgwMDYxLCAweDAwNDUsIDB4MDA2NSwgMHgwMEQ2LCAweDAwRjYsIDB4MDBENSwKLSAgICAweDAwRjUsIDB4MDA0RiwgMHgwMDZGLCAweDAyMkUsIDB4MDIyRiwgMHgwMDU5LCAweDAwNzksIDB4MDA2QywgMHgwMDZFLCAweDAwNzQsIDB4MDA2QSwgMHgwMDQxLCAweDAwNDMsIDB4MDA2MywgMHgwMDRDLCAweDAwNTQsCi0gICAgMHgwMDUzLCAweDAwNUEsIDB4MDA0MiwgMHgwMDU1LCAweDAwNTYsIDB4MDA0NSwgMHgwMDY1LCAweDAwNEEsIDB4MDA2QSwgMHgwMDUxLCAweDAwNzEsIDB4MDA1MiwgMHgwMDcyLCAweDAwNTksIDB4MDA3OSwgMHgwMDYxLAotICAgIDB4MDI1MSwgMHgwMDYyLCAweDAwNkYsIDB4MDA2MywgMHgwMDY0LCAweDAwNjQsIDB4MDA2NSwgMHgwMjU5LCAweDAwNjUsIDB4MDA2NSwgMHgwMDY1LCAweDAwNjUsIDB4MDA2QSwgMHgwMDY3LCAweDAwNjcsIDB4MDA0NywKLSAgICAweDAwNjgsIDB4MDA2OCwgMHgwMDY5LCAweDAwNDksIDB4MDA2QywgMHgwMDZDLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZELCAweDAwNkQsIDB4MDA2RSwgMHgwMDZFLCAweDAwNkUsIDB4MDA2RiwgMHgwMDcyLCAweDAwNzIsCi0gICAgMHgwMDcyLCAweDAwNzIsIDB4MDA3MiwgMHgwMDcyLCAweDAwNzIsIDB4MDA1MiwgMHgwMDUyLCAweDAwNzMsIDB4MDA2QSwgMHgwMjgzLCAweDAyODMsIDB4MDA3NCwgMHgwMDc0LCAweDAwNTUsIDB4MDA3NiwgMHgwMDc2LAotICAgIDB4MDA3NywgMHgwMDc5LCAweDAwNTksIDB4MDA3QSwgMHgwMDdBLCAweDAyOTIsIDB4MDA0MywgMHgwMDQyLCAweDAwNjUsIDB4MDA0NywgMHgwMDQ4LCAweDAwNkEsIDB4MDA2QiwgMHgwMDRDLCAweDAwNzEsIDB4MDA2OCwKLSAgICAweDAwNjgsIDB4MDA2OCwgMHgwMDY4LCAweDAwNkEsIDB4MDA3MiwgMHgwMjc5LCAweDAyN0IsIDB4MDI4MSwgMHgwMDc3LCAweDAwNzksIDB4MDI2MywgMHgwMDZDLCAweDAwNzMsIDB4MDA3OCwgMHgwMjk1LCAweDAzMDAsCi0gICAgMHgwMzAxLCAweDAzMTMsIDB4MDMwOCwgMHgwMDYxLCAweDAwNjUsIDB4MDA2OSwgMHgwMDZGLCAweDAwNzUsIDB4MDA2MywgMHgwMDY0LCAweDAwNjgsIDB4MDA2RCwgMHgwMDcyLCAweDAwNzQsIDB4MDA3NiwgMHgwMDc4LAotICAgIDB4MDJCOSwgMHgwMDNCLCAweDAwMjAsIDB4MDBBOCwgMHgwMzkxLCAweDAwQjcsIDB4MDM5NSwgMHgwMzk3LCAweDAzOTksIDB4MDM5RiwgMHgwM0E1LCAweDAzQTksIDB4MDNDQSwgMHgwMzk5LCAweDAzQTUsIDB4MDNCMSwKLSAgICAweDAzQjUsIDB4MDNCNywgMHgwM0I5LCAweDAzQ0IsIDB4MDNCOSwgMHgwM0M1LCAweDAzQkYsIDB4MDNDNSwgMHgwM0M5LCAweDAzQjIsIDB4MDNCOCwgMHgwM0E1LCAweDAzRDIsIDB4MDNEMiwgMHgwM0M2LCAweDAzQzAsCi0gICAgMHgwM0JBLCAweDAzQzEsIDB4MDNDMiwgMHgwMzk4LCAweDAzQjUsIDB4MDNBMywgMHgwNDE1LCAweDA0MTUsIDB4MDQxMywgMHgwNDA2LCAweDA0MUEsIDB4MDQxOCwgMHgwNDIzLCAweDA0MTgsIDB4MDQzOCwgMHgwNDM1LAotICAgIDB4MDQzNSwgMHgwNDMzLCAweDA0NTYsIDB4MDQzQSwgMHgwNDM4LCAweDA0NDMsIDB4MDQ2NiwgMHgwNDY3LCAweDA0NkEsIDB4MDQ2QiwgMHgwNDc0LCAweDA0NzUsIDB4MDQ2MCwgMHgwNDYxLCAweDA0MTksIDB4MDQzOSwKLSAgICAweDA0MjAsIDB4MDQ0MCwgMHgwNDEzLCAweDA0MzMsIDB4MDQxMywgMHgwNDMzLCAweDA0MTMsIDB4MDQzMywgMHgwNDE2LCAweDA0MzYsIDB4MDQxNywgMHgwNDM3LCAweDA0MUEsIDB4MDQzQSwgMHgwNDFBLCAweDA0M0EsCi0gICAgMHgwNDFBLCAweDA0M0EsIDB4MDQxQSwgMHgwNDNBLCAweDA0MUQsIDB4MDQzRCwgMHgwNDFGLCAweDA0M0YsIDB4MDQyMSwgMHgwNDQxLCAweDA0MjIsIDB4MDQ0MiwgMHgwNEFFLCAweDA0QUYsIDB4MDQyNSwgMHgwNDQ1LAotICAgIDB4MDQyNywgMHgwNDQ3LCAweDA0MjcsIDB4MDQ0NywgMHgwNDE2LCAweDA0MzYsIDB4MDRCQywgMHgwNEJELCAweDA0MTYsIDB4MDQzNiwgMHgwNDFBLCAweDA0M0EsIDB4MDQxQiwgMHgwNDNCLCAweDA0MUQsIDB4MDQzRCwKLSAgICAweDA0MUQsIDB4MDQzRCwgMHgwNDFDLCAweDA0M0MsIDB4MDQxMCwgMHgwNDMwLCAweDA0MTAsIDB4MDQzMCwgMHgwNDE1LCAweDA0MzUsIDB4MDREOCwgMHgwNEQ5LCAweDA0MTYsIDB4MDQzNiwgMHgwNDE3LCAweDA0MzcsCi0gICAgMHgwNDE4LCAweDA0MzgsIDB4MDQxOCwgMHgwNDM4LCAweDA0MUUsIDB4MDQzRSwgMHgwNEU4LCAweDA0RTksIDB4MDQyRCwgMHgwNDRELCAweDA0MjMsIDB4MDQ0MywgMHgwNDIzLCAweDA0NDMsIDB4MDQyMywgMHgwNDQzLAotICAgIDB4MDQyNywgMHgwNDQ3LCAweDA0MTMsIDB4MDQzMywgMHgwNDJCLCAweDA0NEIsIDB4MDQxMywgMHgwNDMzLCAweDA0MjUsIDB4MDQ0NSwgMHgwNDI1LCAweDA0NDUsIDB4MDQxNywgMHgwNDM3LCAweDA0MUIsIDB4MDQzQiwKLSAgICAweDBGMEIsIDB4MTBEQywgMHgwMDQxLCAweDAwQzYsIDB4MDA0MiwgMHgwMDQyLCAweDAwNDQsIDB4MDA0NSwgMHgwMThFLCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsCi0gICAgMHgwMDRFLCAweDAwNEYsIDB4MDIyMiwgMHgwMDUwLCAweDAwNTIsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTcsIDB4MDA2MSwgMHgwMjUwLCAweDAyNTEsIDB4MUQwMiwgMHgwMDYyLCAweDAwNjQsIDB4MDA2NSwgMHgwMjU5LAotICAgIDB4MDI1QiwgMHgwMjVDLCAweDAwNjcsIDB4MDA2QiwgMHgwMDZELCAweDAxNEIsIDB4MDA2RiwgMHgwMjU0LCAweDFEMTYsIDB4MUQxNywgMHgwMDcwLCAweDAwNzQsIDB4MDA3NSwgMHgxRDFELCAweDAyNkYsIDB4MDA3NiwKLSAgICAweDFEMjUsIDB4MDNCMiwgMHgwM0IzLCAweDAzQjQsIDB4MDNDNiwgMHgwM0M3LCAweDAwNjksIDB4MDA3MiwgMHgwMDc1LCAweDAwNzYsIDB4MDNCMiwgMHgwM0IzLCAweDAzQzEsIDB4MDNDNiwgMHgwM0M3LCAweDAwNjIsCi0gICAgMHgwMDY0LCAweDAwNjYsIDB4MDA2RCwgMHgwMDZFLCAweDAwNzAsIDB4MDA3MiwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDdBLCAweDAwNjcsIDB4MDQzRCwgMHgwMDRDLCAweDAwNzAsIDB4MDA1NSwgMHgwMjhBLAotICAgIDB4MDA2MiwgMHgwMDY0LCAweDAwNjYsIDB4MDA2NywgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLCAweDAwNzAsIDB4MDA3MiwgMHgwMDczLCAweDAyODMsIDB4MDA3NiwgMHgwMDc4LCAweDAwN0EsIDB4MDA2MSwKLSAgICAweDAyNTEsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjUsIDB4MDA2NSwgMHgwMDY1LCAweDAwNjksIDB4MDI4MywgMHgwMjUyLCAweDAwNjMsIDB4MDI1NSwgMHgwMEYwLCAweDAyNUMsIDB4MDA2NiwgMHgwMjVGLCAweDAyNjEsCi0gICAgMHgwMjY1LCAweDAyNjgsIDB4MDI2OSwgMHgwMjZBLCAweDFEN0IsIDB4MDI5RCwgMHgwMjZELCAweDFEODUsIDB4MDI5RiwgMHgwMjcxLCAweDAyNzAsIDB4MDI3MiwgMHgwMjczLCAweDAyNzQsIDB4MDI3NSwgMHgwMjc4LAotICAgIDB4MDI4MiwgMHgwMjgzLCAweDAxQUIsIDB4MDI4OSwgMHgwMjhBLCAweDFEMUMsIDB4MDI4QiwgMHgwMjhDLCAweDAwN0EsIDB4MDI5MCwgMHgwMjkxLCAweDAyOTIsIDB4MDNCOCwgMHgwMDQxLCAweDAwNjEsIDB4MDA0MiwKLSAgICAweDAwNjIsIDB4MDA0MiwgMHgwMDYyLCAweDAwNDIsIDB4MDA2MiwgMHgwMDQzLCAweDAwNjMsIDB4MDA0NCwgMHgwMDY0LCAweDAwNDQsIDB4MDA2NCwgMHgwMDQ0LCAweDAwNjQsIDB4MDA0NCwgMHgwMDY0LCAweDAwNDQsCi0gICAgMHgwMDY0LCAweDAwNDUsIDB4MDA2NSwgMHgwMDQ1LCAweDAwNjUsIDB4MDA0NSwgMHgwMDY1LCAweDAwNDUsIDB4MDA2NSwgMHgwMjI4LCAweDAyMjksIDB4MDA0NiwgMHgwMDY2LCAweDAwNDcsIDB4MDA2NywgMHgwMDQ4LAotICAgIDB4MDA2OCwgMHgwMDQ4LCAweDAwNjgsIDB4MDA0OCwgMHgwMDY4LCAweDAwNDgsIDB4MDA2OCwgMHgwMDQ4LCAweDAwNjgsIDB4MDA0OSwgMHgwMDY5LCAweDAwQ0YsIDB4MDBFRiwgMHgwMDRCLCAweDAwNkIsIDB4MDA0QiwKLSAgICAweDAwNkIsIDB4MDA0QiwgMHgwMDZCLCAweDAwNEMsIDB4MDA2QywgMHgwMDRDLCAweDAwNkMsIDB4MDA0QywgMHgwMDZDLCAweDAwNEMsIDB4MDA2QywgMHgwMDRELCAweDAwNkQsIDB4MDA0RCwgMHgwMDZELCAweDAwNEQsCi0gICAgMHgwMDZELCAweDAwNEUsIDB4MDA2RSwgMHgwMDRFLCAweDAwNkUsIDB4MDA0RSwgMHgwMDZFLCAweDAwNEUsIDB4MDA2RSwgMHgwMEQ1LCAweDAwRjUsIDB4MDBENSwgMHgwMEY1LCAweDAxNEMsIDB4MDE0RCwgMHgwMTRDLAotICAgIDB4MDE0RCwgMHgwMDUwLCAweDAwNzAsIDB4MDA1MCwgMHgwMDcwLCAweDAwNTIsIDB4MDA3MiwgMHgwMDUyLCAweDAwNzIsIDB4MDA1MiwgMHgwMDcyLCAweDAwNTIsIDB4MDA3MiwgMHgwMDUzLCAweDAwNzMsIDB4MDA1MywKLSAgICAweDAwNzMsIDB4MDA1MywgMHgwMDczLCAweDAwNTMsIDB4MDA3MywgMHgwMDUzLCAweDAwNzMsIDB4MDA1NCwgMHgwMDc0LCAweDAwNTQsIDB4MDA3NCwgMHgwMDU0LCAweDAwNzQsIDB4MDA1NCwgMHgwMDc0LCAweDAwNTUsCi0gICAgMHgwMDc1LCAweDAwNTUsIDB4MDA3NSwgMHgwMDU1LCAweDAwNzUsIDB4MDE2OCwgMHgwMTY5LCAweDAxNkEsIDB4MDE2QiwgMHgwMDU2LCAweDAwNzYsIDB4MDA1NiwgMHgwMDc2LCAweDAwNTcsIDB4MDA3NywgMHgwMDU3LAotICAgIDB4MDA3NywgMHgwMDU3LCAweDAwNzcsIDB4MDA1NywgMHgwMDc3LCAweDAwNTcsIDB4MDA3NywgMHgwMDU4LCAweDAwNzgsIDB4MDA1OCwgMHgwMDc4LCAweDAwNTksIDB4MDA3OSwgMHgwMDVBLCAweDAwN0EsIDB4MDA1QSwKLSAgICAweDAwN0EsIDB4MDA1QSwgMHgwMDdBLCAweDAwNjgsIDB4MDA3NCwgMHgwMDc3LCAweDAwNzksIDB4MDA2MSwgMHgwMTdGLCAweDAwNDEsIDB4MDA2MSwgMHgwMDQxLCAweDAwNjEsIDB4MDA0MSwgMHgwMDYxLCAweDAwNDEsCi0gICAgMHgwMDYxLCAweDAwNDEsIDB4MDA2MSwgMHgwMDQxLCAweDAwNjEsIDB4MDA0MSwgMHgwMDYxLCAweDAwNDEsIDB4MDA2MSwgMHgwMDQxLCAweDAwNjEsIDB4MDA0MSwgMHgwMDYxLCAweDAwNDEsIDB4MDA2MSwgMHgwMDQxLAotICAgIDB4MDA2MSwgMHgwMDQ1LCAweDAwNjUsIDB4MDA0NSwgMHgwMDY1LCAweDAwNDUsIDB4MDA2NSwgMHgwMDQ1LCAweDAwNjUsIDB4MDA0NSwgMHgwMDY1LCAweDAwNDUsIDB4MDA2NSwgMHgwMDQ1LCAweDAwNjUsIDB4MDA0NSwKLSAgICAweDAwNjUsIDB4MDA0OSwgMHgwMDY5LCAweDAwNDksIDB4MDA2OSwgMHgwMDRGLCAweDAwNkYsIDB4MDA0RiwgMHgwMDZGLCAweDAwNEYsIDB4MDA2RiwgMHgwMDRGLCAweDAwNkYsIDB4MDA0RiwgMHgwMDZGLCAweDAwNEYsCi0gICAgMHgwMDZGLCAweDAwNEYsIDB4MDA2RiwgMHgwMDRGLCAweDAwNkYsIDB4MDA0RiwgMHgwMDZGLCAweDAwNEYsIDB4MDA2RiwgMHgwMDRGLCAweDAwNkYsIDB4MDA0RiwgMHgwMDZGLCAweDAwNTUsIDB4MDA3NSwgMHgwMDU1LAotICAgIDB4MDA3NSwgMHgwMDU1LCAweDAwNzUsIDB4MDA1NSwgMHgwMDc1LCAweDAwNTUsIDB4MDA3NSwgMHgwMDU1LCAweDAwNzUsIDB4MDA1NSwgMHgwMDc1LCAweDAwNTksIDB4MDA3OSwgMHgwMDU5LCAweDAwNzksIDB4MDA1OSwKLSAgICAweDAwNzksIDB4MDA1OSwgMHgwMDc5LCAweDAzQjEsIDB4MDNCMSwgMHgwM0IxLCAweDAzQjEsIDB4MDNCMSwgMHgwM0IxLCAweDAzQjEsIDB4MDNCMSwgMHgwMzkxLCAweDAzOTEsIDB4MDM5MSwgMHgwMzkxLCAweDAzOTEsCi0gICAgMHgwMzkxLCAweDAzOTEsIDB4MDM5MSwgMHgwM0I1LCAweDAzQjUsIDB4MDNCNSwgMHgwM0I1LCAweDAzQjUsIDB4MDNCNSwgMHgwMzk1LCAweDAzOTUsIDB4MDM5NSwgMHgwMzk1LCAweDAzOTUsIDB4MDM5NSwgMHgwM0I3LAotICAgIDB4MDNCNywgMHgwM0I3LCAweDAzQjcsIDB4MDNCNywgMHgwM0I3LCAweDAzQjcsIDB4MDNCNywgMHgwMzk3LCAweDAzOTcsIDB4MDM5NywgMHgwMzk3LCAweDAzOTcsIDB4MDM5NywgMHgwMzk3LCAweDAzOTcsIDB4MDNCOSwKLSAgICAweDAzQjksIDB4MDNCOSwgMHgwM0I5LCAweDAzQjksIDB4MDNCOSwgMHgwM0I5LCAweDAzQjksIDB4MDM5OSwgMHgwMzk5LCAweDAzOTksIDB4MDM5OSwgMHgwMzk5LCAweDAzOTksIDB4MDM5OSwgMHgwMzk5LCAweDAzQkYsCi0gICAgMHgwM0JGLCAweDAzQkYsIDB4MDNCRiwgMHgwM0JGLCAweDAzQkYsIDB4MDM5RiwgMHgwMzlGLCAweDAzOUYsIDB4MDM5RiwgMHgwMzlGLCAweDAzOUYsIDB4MDNDNSwgMHgwM0M1LCAweDAzQzUsIDB4MDNDNSwgMHgwM0M1LAotICAgIDB4MDNDNSwgMHgwM0M1LCAweDAzQzUsIDB4MDNBNSwgMHgwM0E1LCAweDAzQTUsIDB4MDNBNSwgMHgwM0M5LCAweDAzQzksIDB4MDNDOSwgMHgwM0M5LCAweDAzQzksIDB4MDNDOSwgMHgwM0M5LCAweDAzQzksIDB4MDNBOSwKLSAgICAweDAzQTksIDB4MDNBOSwgMHgwM0E5LCAweDAzQTksIDB4MDNBOSwgMHgwM0E5LCAweDAzQTksIDB4MDNCMSwgMHgwM0IxLCAweDAzQjUsIDB4MDNCNSwgMHgwM0I3LCAweDAzQjcsIDB4MDNCOSwgMHgwM0I5LCAweDAzQkYsCi0gICAgMHgwM0JGLCAweDAzQzUsIDB4MDNDNSwgMHgwM0M5LCAweDAzQzksIDB4MDNCMSwgMHgwM0IxLCAweDAzQjEsIDB4MDNCMSwgMHgwM0IxLCAweDAzQjEsIDB4MDNCMSwgMHgwM0IxLCAweDAzOTEsIDB4MDM5MSwgMHgwMzkxLAotICAgIDB4MDM5MSwgMHgwMzkxLCAweDAzOTEsIDB4MDM5MSwgMHgwMzkxLCAweDAzQjcsIDB4MDNCNywgMHgwM0I3LCAweDAzQjcsIDB4MDNCNywgMHgwM0I3LCAweDAzQjcsIDB4MDNCNywgMHgwMzk3LCAweDAzOTcsIDB4MDM5NywKLSAgICAweDAzOTcsIDB4MDM5NywgMHgwMzk3LCAweDAzOTcsIDB4MDM5NywgMHgwM0M5LCAweDAzQzksIDB4MDNDOSwgMHgwM0M5LCAweDAzQzksIDB4MDNDOSwgMHgwM0M5LCAweDAzQzksIDB4MDNBOSwgMHgwM0E5LCAweDAzQTksCi0gICAgMHgwM0E5LCAweDAzQTksIDB4MDNBOSwgMHgwM0E5LCAweDAzQTksIDB4MDNCMSwgMHgwM0IxLCAweDAzQjEsIDB4MDNCMSwgMHgwM0IxLCAweDAzQjEsIDB4MDNCMSwgMHgwMzkxLCAweDAzOTEsIDB4MDM5MSwgMHgwMzkxLAotICAgIDB4MDM5MSwgMHgwM0I3LCAweDAzQjcsIDB4MDNCNywgMHgwM0I3LCAweDAzQjcsIDB4MDM5NSwgMHgwMzk1LCAweDAzOTcsIDB4MDM5NywgMHgwMzk3LCAweDAzQjksIDB4MDNCOSwgMHgwM0I5LCAweDAzQjksIDB4MDNCOSwKLSAgICAweDAzQjksIDB4MDM5OSwgMHgwMzk5LCAweDAzOTksIDB4MDM5OSwgMHgwM0M1LCAweDAzQzUsIDB4MDNDNSwgMHgwM0M1LCAweDAzQzEsIDB4MDNDMSwgMHgwM0M1LCAweDAzQzUsIDB4MDNBNSwgMHgwM0E1LCAweDAzQTUsCi0gICAgMHgwM0E1LCAweDAzQTEsIDB4MDNDOSwgMHgwM0M5LCAweDAzQzksIDB4MDNDOSwgMHgwM0M5LCAweDAzOUYsIDB4MDM5RiwgMHgwM0E5LCAweDAzQTksIDB4MDNBOSwgMHgwMEI0LCAweDAzMTQsIDB4MDAyMCwgMHgwMDIwLAotICAgIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MjAxMCwgMHgwMzMzLCAweDAwMkUsIDB4MDAyMCwgMHgwMDIwLCAweDAwMzAsIDB4MDA2OSwKLSAgICAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwMkIsIDB4MjIxMiwgMHgwMDNELCAweDAwMjgsIDB4MDAyOSwgMHgwMDZFLCAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsCi0gICAgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgwMDJCLCAweDIyMTIsIDB4MDAzRCwgMHgwMDI4LCAweDAwMjksIDB4MDA2MSwgMHgwMDY1LCAweDAwNkYsIDB4MDA3OCwgMHgwMjU5LAotICAgIDB4MDA0MywgMHgwMTkwLCAweDAwNjcsIDB4MDA0OCwgMHgwMDQ4LCAweDAwNDgsIDB4MDA2OCwgMHgwMDY4LCAweDAwNDksIDB4MDA0OSwgMHgwMDRDLCAweDAwNkMsIDB4MDA0RSwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwKLSAgICAweDAwNTIsIDB4MDA1MiwgMHgwMDUyLCAweDAwNTIsIDB4MDA1NiwgMHgwMDVBLCAweDAzQTksIDB4MDFCMSwgMHgwMDVBLCAweDAwNEIsIDB4MDBDNSwgMHgwMDQyLCAweDAwNDMsIDB4MDA2NSwgMHgwMDY1LCAweDAwNDUsCi0gICAgMHgwMDQ2LCAweDAwNEQsIDB4MDA2RiwgMHgwNUQwLCAweDA1RDEsIDB4MDVEMiwgMHgwNUQzLCAweDAwNjksIDB4MDNDMCwgMHgwM0IzLCAweDAzOTMsIDB4MDNBMCwgMHgyMjExLCAweDAwNDQsIDB4MDA2NCwgMHgwMDY1LAotICAgIDB4MDA2OSwgMHgwMDZBLCAweDAwNDksIDB4MDA1NiwgMHgwMDU4LCAweDAwNEMsIDB4MDA0MywgMHgwMDQ0LCAweDAwNEQsIDB4MDA2OSwgMHgwMDc2LCAweDAwNzgsIDB4MDA2QywgMHgwMDYzLCAweDAwNjQsIDB4MDA2RCwKLSAgICAweDIyMDMsIDB4MjIwOCwgMHgyMjBCLCAweDMwMDgsIDB4MzAwOSwgMHgwMDYyLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwNDEsCi0gICAgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLAotICAgIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKLSAgICAweDAwNjgsIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywgMHgwMDZELCAweDAwNkUsIDB4MDA2RiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCi0gICAgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLAotICAgIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwKLSAgICAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwNEMsIDB4MDA2QywgMHgwMDRDLCAweDAwNTAsIDB4MDA1MiwgMHgwMDYxLCAweDAwNzQsCi0gICAgMHgwMDQ4LCAweDAwNjgsIDB4MDA0QiwgMHgwMDZCLCAweDAwNUEsIDB4MDA3QSwgMHgwMDc2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDc2LCAweDAwNkEsIDB4MDA1NiwgMHgyRDYxLCAweDZCQ0QsIDB4NkMxMSwgMHg4NjRFLAotICAgIDB4ODk3RiwgMHg4OUQyLCAweDk1N0YsIDB4OTc1MiwgMHg5OERGLCAweDlBQTgsIDB4OUIzQywgMHg5RUE2LCAweDlFQzQsIDB4OUY5RiwgMHg0RTAwLCAweDRFMjgsIDB4NEUzNiwgMHg0RTNGLCAweDRFNTksIDB4NEU4NSwKLSAgICAweDRFOEMsIDB4NEVBMCwgMHg0RUJBLCAweDUxM0YsIDB4NTE2NSwgMHg1MTZCLCAweDUxODIsIDB4NTE5NiwgMHg1MUFCLCAweDUxRTAsIDB4NTFGNSwgMHg1MjAwLCAweDUyOUIsIDB4NTJGOSwgMHg1MzE1LCAweDUzMUEsCi0gICAgMHg1MzM4LCAweDUzNDEsIDB4NTM1QywgMHg1MzY5LCAweDUzODIsIDB4NTNCNiwgMHg1M0M4LCAweDUzRTMsIDB4NTZENywgMHg1NzFGLCAweDU4RUIsIDB4NTkwMiwgMHg1OTBBLCAweDU5MTUsIDB4NTkyNywgMHg1OTczLAotICAgIDB4NUI1MCwgMHg1QjgwLCAweDVCRjgsIDB4NUMwRiwgMHg1QzIyLCAweDVDMzgsIDB4NUM2RSwgMHg1QzcxLCAweDVEREIsIDB4NURFNSwgMHg1REYxLCAweDVERkUsIDB4NUU3MiwgMHg1RTdBLCAweDVFN0YsIDB4NUVGNCwKLSAgICAweDVFRkUsIDB4NUYwQiwgMHg1RjEzLCAweDVGNTAsIDB4NUY2MSwgMHg1RjczLCAweDVGQzMsIDB4NjIwOCwgMHg2MjM2LCAweDYyNEIsIDB4NjUyRiwgMHg2NTM0LCAweDY1ODcsIDB4NjU5NywgMHg2NUE0LCAweDY1QjksCi0gICAgMHg2NUUwLCAweDY1RTUsIDB4NjZGMCwgMHg2NzA4LCAweDY3MjgsIDB4NkIyMCwgMHg2QjYyLCAweDZCNzksIDB4NkJCMywgMHg2QkNCLCAweDZCRDQsIDB4NkJEQiwgMHg2QzBGLCAweDZDMTQsIDB4NkMzNCwgMHg3MDZCLAotICAgIDB4NzIyQSwgMHg3MjM2LCAweDcyM0IsIDB4NzIzRiwgMHg3MjQ3LCAweDcyNTksIDB4NzI1QiwgMHg3MkFDLCAweDczODQsIDB4NzM4OSwgMHg3NERDLCAweDc0RTYsIDB4NzUxOCwgMHg3NTFGLCAweDc1MjgsIDB4NzUzMCwKLSAgICAweDc1OEIsIDB4NzU5MiwgMHg3Njc2LCAweDc2N0QsIDB4NzZBRSwgMHg3NkJGLCAweDc2RUUsIDB4NzdEQiwgMHg3N0UyLCAweDc3RjMsIDB4NzkzQSwgMHg3OUI4LCAweDc5QkUsIDB4N0E3NCwgMHg3QUNCLCAweDdBRjksCi0gICAgMHg3QzczLCAweDdDRjgsIDB4N0YzNiwgMHg3RjUxLCAweDdGOEEsIDB4N0ZCRCwgMHg4MDAxLCAweDgwMEMsIDB4ODAxMiwgMHg4MDMzLCAweDgwN0YsIDB4ODA4OSwgMHg4MUUzLCAweDgxRUEsIDB4ODFGMywgMHg4MUZDLAotICAgIDB4ODIwQywgMHg4MjFCLCAweDgyMUYsIDB4ODI2RSwgMHg4MjcyLCAweDgyNzgsIDB4ODY0RCwgMHg4NjZCLCAweDg4NDAsIDB4ODg0QywgMHg4ODYzLCAweDg5N0UsIDB4ODk4QiwgMHg4OUQyLCAweDhBMDAsIDB4OEMzNywKLSAgICAweDhDNDYsIDB4OEM1NSwgMHg4Qzc4LCAweDhDOUQsIDB4OEQ2NCwgMHg4RDcwLCAweDhEQjMsIDB4OEVBQiwgMHg4RUNBLCAweDhGOUIsIDB4OEZCMCwgMHg4RkI1LCAweDkwOTEsIDB4OTE0OSwgMHg5MUM2LCAweDkxQ0MsCi0gICAgMHg5MUQxLCAweDk1NzcsIDB4OTU4MCwgMHg5NjFDLCAweDk2QjYsIDB4OTZCOSwgMHg5NkU4LCAweDk3NTEsIDB4OTc1RSwgMHg5NzYyLCAweDk3NjksIDB4OTdDQiwgMHg5N0VELCAweDk3RjMsIDB4OTgwMSwgMHg5OEE4LAotICAgIDB4OThEQiwgMHg5OERGLCAweDk5OTYsIDB4OTk5OSwgMHg5OUFDLCAweDlBQTgsIDB4OUFEOCwgMHg5QURGLCAweDlCMjUsIDB4OUIyRiwgMHg5QjMyLCAweDlCM0MsIDB4OUI1QSwgMHg5Q0U1LCAweDlFNzUsIDB4OUU3RiwKLSAgICAweDlFQTUsIDB4OUVCQiwgMHg5RUMzLCAweDlFQ0QsIDB4OUVEMSwgMHg5RUY5LCAweDlFRkQsIDB4OUYwRSwgMHg5RjEzLCAweDlGMjAsIDB4OUYzQiwgMHg5RjRBLCAweDlGNTIsIDB4OUY4RCwgMHg5RjlDLCAweDlGQTAsCi0gICAgMHgwMDIwLCAweDMwMTIsIDB4NTM0MSwgMHg1MzQ0LCAweDUzNDUsIDB4MTEwMCwgMHgxMTAxLCAweDExQUEsIDB4MTEwMiwgMHgxMUFDLCAweDExQUQsIDB4MTEwMywgMHgxMTA0LCAweDExMDUsIDB4MTFCMCwgMHgxMUIxLAotICAgIDB4MTFCMiwgMHgxMUIzLCAweDExQjQsIDB4MTFCNSwgMHgxMTFBLCAweDExMDYsIDB4MTEwNywgMHgxMTA4LCAweDExMjEsIDB4MTEwOSwgMHgxMTBBLCAweDExMEIsIDB4MTEwQywgMHgxMTBELCAweDExMEUsIDB4MTEwRiwKLSAgICAweDExMTAsIDB4MTExMSwgMHgxMTEyLCAweDExNjEsIDB4MTE2MiwgMHgxMTYzLCAweDExNjQsIDB4MTE2NSwgMHgxMTY2LCAweDExNjcsIDB4MTE2OCwgMHgxMTY5LCAweDExNkEsIDB4MTE2QiwgMHgxMTZDLCAweDExNkQsCi0gICAgMHgxMTZFLCAweDExNkYsIDB4MTE3MCwgMHgxMTcxLCAweDExNzIsIDB4MTE3MywgMHgxMTc0LCAweDExNzUsIDB4MTE2MCwgMHgxMTE0LCAweDExMTUsIDB4MTFDNywgMHgxMUM4LCAweDExQ0MsIDB4MTFDRSwgMHgxMUQzLAotICAgIDB4MTFENywgMHgxMUQ5LCAweDExMUMsIDB4MTFERCwgMHgxMURGLCAweDExMUQsIDB4MTExRSwgMHgxMTIwLCAweDExMjIsIDB4MTEyMywgMHgxMTI3LCAweDExMjksIDB4MTEyQiwgMHgxMTJDLCAweDExMkQsIDB4MTEyRSwKLSAgICAweDExMkYsIDB4MTEzMiwgMHgxMTM2LCAweDExNDAsIDB4MTE0NywgMHgxMTRDLCAweDExRjEsIDB4MTFGMiwgMHgxMTU3LCAweDExNTgsIDB4MTE1OSwgMHgxMTg0LCAweDExODUsIDB4MTE4OCwgMHgxMTkxLCAweDExOTIsCi0gICAgMHgxMTk0LCAweDExOUUsIDB4MTFBMSwgMHg0RTAwLCAweDRFOEMsIDB4NEUwOSwgMHg1NkRCLCAweDRFMEEsIDB4NEUyRCwgMHg0RTBCLCAweDc1MzIsIDB4NEU1OSwgMHg0RTE5LCAweDRFMDEsIDB4NTkyOSwgMHg1NzMwLAotICAgIDB4NEVCQSwgMHg1NTRGLCAweDVFN0MsIDB4NjU4NywgMHg3QjhGLCAweDExMDAsIDB4MTEwMiwgMHgxMTAzLCAweDExMDUsIDB4MTEwNiwgMHgxMTA3LCAweDExMDksIDB4MTEwQiwgMHgxMTBDLCAweDExMEUsIDB4MTEwRiwKLSAgICAweDExMTAsIDB4MTExMSwgMHgxMTEyLCAweDRFMDAsIDB4NEU4QywgMHg0RTA5LCAweDU2REIsIDB4NEU5NCwgMHg1MTZELCAweDRFMDMsIDB4NTE2QiwgMHg0RTVELCAweDUzNDEsIDB4NjcwOCwgMHg3MDZCLCAweDZDMzQsCi0gICAgMHg2NzI4LCAweDkxRDEsIDB4NTcxRiwgMHg2NUU1LCAweDY4MkEsIDB4NjcwOSwgMHg3OTNFLCAweDU0MEQsIDB4NzI3OSwgMHg4Q0ExLCAweDc5NUQsIDB4NTJCNCwgMHg3OUQ4LCAweDc1MzcsIDB4NTk3MywgMHg5MDY5LAotICAgIDB4NTEyQSwgMHg1MzcwLCAweDZDRTgsIDB4OTgwNSwgMHg0RjExLCAweDUxOTksIDB4NkI2MywgMHg0RTBBLCAweDRFMkQsIDB4NEUwQiwgMHg1REU2LCAweDUzRjMsIDB4NTMzQiwgMHg1Qjk3LCAweDVCNjYsIDB4NzZFMywKLSAgICAweDRGMDEsIDB4OENDNywgMHg1MzU0LCAweDU5MUMsIDB4MzBBMiwgMHgzMEE0LCAweDMwQTYsIDB4MzBBOCwgMHgzMEFBLCAweDMwQUIsIDB4MzBBRCwgMHgzMEFGLCAweDMwQjEsIDB4MzBCMywgMHgzMEI1LCAweDMwQjcsCi0gICAgMHgzMEI5LCAweDMwQkIsIDB4MzBCRCwgMHgzMEJGLCAweDMwQzEsIDB4MzBDNCwgMHgzMEM2LCAweDMwQzgsIDB4MzBDQSwgMHgzMENCLCAweDMwQ0MsIDB4MzBDRCwgMHgzMENFLCAweDMwQ0YsIDB4MzBEMiwgMHgzMEQ1LAotICAgIDB4MzBEOCwgMHgzMERCLCAweDMwREUsIDB4MzBERiwgMHgzMEUwLCAweDMwRTEsIDB4MzBFMiwgMHgzMEU0LCAweDMwRTYsIDB4MzBFOCwgMHgzMEU5LCAweDMwRUEsIDB4MzBFQiwgMHgzMEVDLCAweDMwRUQsIDB4MzBFRiwKLSAgICAweDMwRjAsIDB4MzBGMSwgMHgzMEYyLCAweDRFMjIsIDB4NUU3NiwgMHg1RTdBLCAweDVFNzIsIDB4NEU3MSwgMHg0RTk4LCAweDRFOUEsIDB4NEYyQiwgMHg1RTAzLCAweDUzNjAsIDB4Njc2NSwgMHg0RkEzLCAweDRGRTMsCi0gICAgMHg3Q0ZCLCAweDRGQTAsIDB4NEYyNSwgMHg0RkU5LCAweDRFRDMsIDB4NEUyQSwgMHg0RUVDLCAweDRGMjYsIDB4NEYxRiwgMHg0RkE3LCAweDRGQTYsIDB4NEYyQSwgMHg2NzcwLCAweDRGMjcsIDB4NEYxRSwgMHg1OTA3LAotICAgIDB4NUJCNiwgMHg0RjYzLCAweDUwNkMsIDB4NEYyMCwgMHg0RjFCLCAweDUwM0EsIDB4NEYyNCwgMHg1MDNFLCAweDUwN0IsIDB4NEVDNSwgMHg0RjY1LCAweDRGQTgsIDB4NEVDNiwgMHg0RkE1LCAweDUwN0UsIDB4OTZDNywKLSAgICAweDRFRjcsIDB4NEVFQSwgMHg0RkFDLCAweDRFQkYsIDB4NEZFRCwgMHg1MEE3LCAweDRGRTYsIDB4NEZBQSwgMHg1QzNELCAweDUwN0YsIDB4NEYxOCwgMHg1MEE4LCAweDRGRUEsIDB4NTBBOSwgMHg1MEE1LCAweDRGRTgsCi0gICAgMHg1MUY2LCAweDUxNTEsIDB4NTEzRiwgMHg1MTU2LCAweDUxODUsIDB4NEUyNCwgMHg1MThDLCAweDgwQzQsIDB4NTE5OSwgMHg1RTQyLCAweDUxQkIsIDB4NTFEQiwgMHg1MUVGLCAweDUyMkIsIDB4NTIyMCwgMHg1MjJELAotICAgIDB4NTIxOSwgMHg1MjM5LCAweDUyMUEsIDB4NTI2NSwgMHg1MjUwLCAweDUyNDAsIDB4NTIxQiwgMHg1MjJDLCAweDUyMTIsIDB4NTI2NywgMHg1MjE4LCAweDUyM0QsIDB4NTIzRiwgMHg1MjUxLCAweDUyNDIsIDB4NTJCMiwKLSAgICAweDUyQTgsIDB4NTJENiwgMHg1MkExLCAweDgwREMsIDB4NTJCMywgMHg1MkJGLCAweDUyQTIsIDB4NTJDQiwgMHg1MkIxLCAweDUyOUQsIDB4NTMwMCwgMHg1MzI2LCAweDZDNDcsIDB4NTMyRSwgMHg1MzNBLCAweDUzNEYsCi0gICAgMHg2MDY0LCAweDUzNzQsIDB4NTM4RCwgMHg1MzhDLCAweDUzODksIDB4NTNBMywgMHg1M0MyLCAweDRFMUIsIDB4NTRBNCwgMHg1NDM0LCAweDU0NTAsIDB4NTQxNSwgMHg1NDU4LCAweDU1QjEsIDB4NTQ1NywgMHg1RkY1LAotICAgIDB4OTVFRSwgMHg1NEQxLCAweDU0MkYsIDB4NTUyNCwgMHg0RTI3LCAweDRFNTQsIDB4NTM1NSwgMHg1NERGLCAweDU0NUIsIDB4NTU2QywgMHg1NTFELCAweDU0MTcsIDB4NTQ1QywgMHg1NTIyLCAweDU0RDQsIDB4NTNGOSwKLSAgICAweDU1QkQsIDB4NTQ1NSwgMHg1NTY3LCAweDVDMUQsIDB4NTUxQiwgMHg1NEQ3LCAweDU1MjAsIDB4NTU3OCwgMHg1M0ZELCAweDU0RDMsIDB4NTQ1MiwgMHg1NTc0LCAweDYwNzYsIDB4NTYxOCwgMHg1NDlELCAweDU0RDIsCi0gICAgMHg1NERELCAweDU0RDUsIDB4NTVGMywgMHg1NEQ5LCAweDU1QjcsIDB4NTQyOCwgMHg1NDlCLCAweDU0MTMsIDB4NTREQywgMHg1QzFELCAweDU2NUMsIDB4NTU2RSwgMHg1NDU2LCAweDU0OTksIDB4NEVCOCwgMHg1NUJFLAotICAgIDB4NEUyNSwgMHg1NjI0LCAweDU1NkQsIDB4NTVFQiwgMHg1NkEzLCAweDUxODEsIDB4NTQ1MywgMHg1NTcwLCAweDU2MzEsIDB4NTZGMSwgMHg1NkY1LCAweDU2RkQsIDB4NTZGNCwgMHg1NkVELCAweDU3MDYsIDB4NTZGRSwKLSAgICAweDU2RTIsIDB4NTdBRCwgMHg2MjY3LCAweDU3NUEsIDB4NTdBOSwgMHg1N0RBLCAweDVDMjcsIDB4NjJBNSwgMHg1NzNBLCAweDU3NTcsIDB4ODMxNCwgMHg1N0IyLCAweDU3RDgsIDB4NkQ4MiwgMHg1MUEyLCAweDU3NUUsCi0gICAgMHg1N0Q5LCAweDVDMTgsIDB4NTgxMSwgMHg1N0FCLCAweDU3NjAsIDB4NTgxNSwgMHg1NzVGLCAweDU3QTYsIDB4NTc1QiwgMHg1MzhCLCAweDU3OTIsIDB4NTczOSwgMHg1Nzg2LCAweDU3NEYsIDB4NTc4NSwgMHg1NzVDLAotICAgIDB4NTc1RCwgMHg1OEVFLCAweDU4RjYsIDB4NThGOCwgMHg1QkZGLCAweDU5MUYsIDB4NjhBNiwgMHg0RjE5LCAweDU5MzksIDB4NTk0MiwgMHg1OTY1LCAweDU5NDEsIDB4NTkzQSwgMHg1OTRCLCAweDU5RjksIDB4NTk4NiwKLSAgICAweDU5RDcsIDB4NTk3OCwgMHg1QTMxLCAweDVBMDQsIDB4NTk4NywgMHg1QTA1LCAweDVBMzIsIDB4NTlBQiwgMHg1QUFBLCAweDU5ODgsIDB4NTlBQSwgMHg1OUE5LCAweDVBMzQsIDB4NUE3MywgMHg1QTA2LCAweDVBNzUsCi0gICAgMHg1QTA3LCAweDVBRjEsIDB4NUFEMiwgMHg1QjM3LCAweDVBRDQsIDB4NUE3NCwgMHg1QTc2LCAweDVBMDgsIDB4NUI1OSwgMHg1QjY2LCAweDVCNkEsIDB4NUJBQiwgMHg1QkRELCAweDVCOUUsIDB4NUI4MSwgMHg1QkExLAotICAgIDB4NTE5OSwgMHg1QkJELCAweDVCQTAsIDB4NUI5RCwgMHg1QzA2LCAweDRFMTMsIDB4NUJGQiwgMHg1QkY5LCAweDVCRkMsIDB4NUMzNCwgMHg1QzRBLCAweDVDMzgsIDB4NUM0OSwgMHg1QzYxLCAweDVDNDIsIDB4NUM1RiwKLSAgICAweDVDNjYsIDB4NUM1RSwgMHg1MTg4LCAweDVDOTgsIDB4NUM5QiwgMHg1Q0UxLCAweDVEMDMsIDB4NUM5NywgMHg0RUQxLCAweDVDRTUsIDB4NUM5QSwgMHg1RDVELCAweDVEMkQsIDB4NUM5NiwgMHg1RDVBLCAweDVEMDIsCi0gICAgMHg1Q0U0LCAweDVDRTMsIDB4NUNDNCwgMHg1RDA0LCAweDVDOTksIDB4NUQ1OCwgMHg1Q0FELCAweDVDN0YsIDB4NUNCMywgMHg1Q0JGLCAweDVDRTYsIDB4NURDNSwgMHg1REVGLCAweDVFMDUsIDB4NUUwOCwgMHg1RTEwLAotICAgIDB4NUUyNiwgMHg1RTI3LCAweDVFMEYsIDB4NUUzQywgMHg1RTNCLCAweDVFMUMsIDB4NUUwMSwgMHg1RTJFLCAweDVFMzEsIDB4NUU3MiwgMHg1MUUwLCAweDVFOTMsIDB4NTM5NSwgMHg1M0EyLCAweDUzQTYsIDB4NTNBOCwKLSAgICAweDUzQUUsIDB4NUU5OSwgMHg1MzgyLCAweDVFOTEsIDB4NUU5RiwgMHg1RTdGLCAweDVFRUEsIDB4NUU5MCwgMHg1Mzg1LCAweDVGMTEsIDB4NUYyQSwgMHg1RjIwLCAweDVGM0EsIDB4NUYzOSwgMHg1RjI1LCAweDVGMkYsCi0gICAgMHg1RjY2LCAweDU0MEUsIDB4NUY4NCwgMHg0RUNFLCAweDVGOTUsIDB4NTkwRCwgMHg1RjgxLCAweDVGN0IsIDB4NjA1MiwgMHg4MDNCLCAweDYwQTYsIDB4NjAwNSwgMHg5NUY3LCAweDYwNzYsIDB4NjA3QywgMHg2MDdELAotICAgIDB4NjA3QiwgMHg3MjMxLCAweDYwRUMsIDB4NjBBQiwgMHg2MDA2LCAweDYwN0EsIDB4NUZGRSwgMHg2MDAxLCAweDYxMjAsIDB4NjBFOCwgMHg2MEVELCAweDYwNzgsIDB4NjBFRiwgMHg2MDA0LCAweDYwMDIsIDB4ODY1MSwKLSAgICAweDYwQUQsIDB4NUU4NiwgMHg1RkU3LCAweDYwRUIsIDB4NjAxQywgMHg1MUVELCAweDYxMjYsIDB4NjE2RCwgMHg2MEVFLCAweDYxMjQsIDB4NjBBRiwgMHg2MDAzLCAweDVCQUEsIDB4NUZDNiwgMHg2MDczLCAweDVFOTQsCi0gICAgMHg2MDNGLCAweDYxRDQsIDB4NjAzQywgMHg2MUQxLCAweDYwNzksIDB4NjBFOSwgMHg2MUQyLCAweDYwMDAsIDB4NjBBQywgMHg1RkNGLCAweDYwRTcsIDB4NjE1MSwgMHg2MDRCLCAweDYyMDYsIDB4NjIwQiwgMHg2MjE3LAotICAgIDB4NjIyQywgMHg2MjE4LCAweDYyMEYsIDB4NjIzNywgMHg2MjlCLCAweDYzMUYsIDB4ODIwRCwgMHg2MjZBLCAweDUzNzcsIDB4NjI2QiwgMHg2MkExLCAweDYzMjMsIDB4NjMwMiwgMHg5MUM3LCAweDYyRTMsIDB4NjI2QywKLSAgICAweDYzNjIsIDB4NjMyNSwgMHg2MzVGLCAweDY0NDcsIDB4NjM2MywgMHg2MkEyLCAweDYzQjQsIDB4NjNCQywgMHg2NDAyLCAweDYzMUEsIDB4NjJBMCwgMHg2MjlGLCAweDYzQkEsIDB4NjM1RSwgMHg2NDkxLCAweDYzMjAsCi0gICAgMHg2MzIyLCAweDYzQjgsIDB4NjJFOCwgMHg2MjlBLCAweDYyNTEsIDB4NjNGRiwgMHg2MzFFLCAweDYzMUQsIDB4NjM2MSwgMHg2MkU1LCAweDYzQjMsIDB4NjJFOSwgMHg1MUZCLCAweDYzMjEsIDB4NjJDNSwgMHg2MzZFLAotICAgIDB4NjMyNCwgMHg2MkRGLCAweDY0NDgsIDB4NjJFNywgMHg2NDAxLCAweDYzQjcsIDB4NjI2OSwgMHg2NEI3LCAweDY0NDYsIDB4NjRERSwgMHg2NEI4LCAweDYyNzAsIDB4NjQ0NSwgMHg2NEI1LCAweDYyRTIsIDB4NjJFNiwKLSAgICAweDY0ODQsIDB4NjQwMCwgMHg2NEJBLCAweDY0M0EsIDB4NjQ0NCwgMHg2NTEyLCAweDYzMUIsIDB4NjQ0QSwgMHg2NDA1LCAweDYzRkQsIDB4NjY4QiwgMHg4RDI1LCAweDUzRDksIDB4NjU0QywgMHg2NTcwLCAweDY1NUIsCi0gICAgMHg2QkQ5LCAweDY1OTMsIDB4NjVBOSwgMHg2NUFELCAweDRFOEUsIDB4NTM0NywgMHg2NUY2LCAweDY2NEIsIDB4NjYzQywgMHg2NjU1LCAweDY2NTYsIDB4NjVGOCwgMHg3NTQ1LCAweDY2ODIsIDB4NjYzNSwgMHg2NjU0LAotICAgIDB4NTM4NiwgMHg2NjE5LCAweDY2NTMsIDB4NjZBNywgMHg2NUY3LCAweDY2M0QsIDB4NjY1MiwgMHg0RTY2LCAweDRGMUEsIDB4ODBFNywgMHg0RTFDLCAweDY4MDUsIDB4Njc0NiwgMHg2ODAwLCAweDY3QTcsIDB4Njc2MSwKLSAgICAweDY3QUQsIDB4NUYwMywgMHg2N0E4LCAweDY3QTMsIDB4NjgwQiwgMHg2ODA4LCAweDY4MTYsIDB4Njg2MCwgMHg2NzY4LCAweDY3QUIsIDB4Njg2MiwgMHg0RTFBLCAweDY3ODEsIDB4Njc2OSwgMHg4MzYzLCAweDY4NjQsCi0gICAgMHg2Nzg0LCAweDY3QUEsIDB4Njc2MCwgMHg2OEJGLCAweDY5MjAsIDB4NjkwMSwgMHg2ODY4LCAweDY4NjksIDB4NEU1MCwgMHg2NzlFLCAweDY5N0MsIDB4NjgwNywgMHg2N0EyLCAweDY4MzcsIDB4NjczNCwgMHg2ODExLAotICAgIDB4Njg2NiwgMHg2ODYxLCAweDY4NjUsIDB4NjczQSwgMHg2OTJELCAweDZBMkEsIDB4NkFBOSwgMHg2OURDLCAweDY3RkQsIDB4Njg2MywgMHg2ODY3LCAweDY5REEsIDB4NjhDMCwgMHg2QTJGLCAweDY4QkMsIDB4NTNGMCwKLSAgICAweDY5REYsIDB4NjdFMCwgMHg2OURCLCAweDgyRDgsIDB4NjdEQywgMHg2QTc5LCAweDY5ODgsIDB4NjgwOSwgMHg2OTFGLCAweDZBN0MsIDB4NjgwRSwgMHg2QTcxLCAweDY5RTAsIDB4NjgwQywgMHg2N0E1LCAweDZBNjUsCi0gICAgMHg2OTg3LCAweDY4MEEsIDB4Njk4OSwgMHg2OEMyLCAweDZBMzEsIDB4NjgwRiwgMHg2NzQzLCAweDY5MjQsIDB4NjgzRSwgMHg2OTg0LCAweDk0QTYsIDB4NkIyNywgMHg2QjI0LCAweDZCMjIsIDB4NUM4MSwgMHg1Mzg2LAotICAgIDB4NUY1MiwgMHg2QjgxLCAweDZCOEIsIDB4NkI5MiwgMHg2Qjg3LCAweDZCOUEsIDB4NkI5MywgMHg2QkExLCAweDZCN0MsIDB4Njc0MCwgMHg1OEYzLCAweDZCQzEsIDB4NkJCNCwgMHg2QkY1LCAweDZCRTEsIDB4NkMwNywKLSAgICAweDZDMTQsIDB4NkMyMiwgMHg2QzI5LCAweDZDMzIsIDB4NTFGQywgMHg1MUIzLCAweDUxQjEsIDB4NkNBMSwgMHg1MUI1LCAweDZDQzQsIDB4NkM3OSwgMHg2RDQzLCAweDZDRkUsIDB4NTFDOSwgMHg1MUM0LCAweDZDRUEsCi0gICAgMHg2RTBDLCAweDUxQzAsIDB4NkNBNiwgMHg2RTBBLCAweDZEOUUsIDB4NkQ0NSwgMHg2REEzLCAweDUxQ0YsIDB4NkNBOCwgMHg2REExLCAweDZENEIsIDB4NkQ1MSwgMHg1MUQxLCAweDZENDgsIDB4NkQ4QywgMHg2RDA3LAotICAgIDB4NkM2NCwgMHg2Q0E5LCAweDUxQzYsIDB4NkM5RiwgMHg2RTI5LCAweDZEQTIsIDB4NkU3RiwgMHg2Q0E3LCAweDcwNkQsIDB4NkRBNCwgMHg4MzY1LCAweDZDQUEsIDB4NkVERSwgMHg2RTE3LCAweDZENTIsIDB4NkQ1MCwKLSAgICAweDZFREEsIDB4NkVFMSwgMHg2RTE0LCAweDZFODcsIDB4NkNBNCwgMHg2QzQ5LCAweDZEOUYsIDB4NkUwRCwgMHg2REE4LCAweDZFMTAsIDB4NkQ0NiwgMHg5ODhELCAweDZDRkMsIDB4NkQwMSwgMHg2RjVDLCAweDZEQTYsCi0gICAgMHg2RDU0LCAweDZFODMsIDB4NkRBMCwgMHg2REE5LCAweDZENDcsIDB4NkQ5RCwgMHg2Qzg0LCAweDZEQTcsIDB4NkUxMSwgMHg2Q0ZELCAweDZFRUEsIDB4NkNGNiwgMHg2RDRELCAweDZENEEsIDB4NkQ1MywgMHg2RTdGLAotICAgIDB4NkNERSwgMHg2RDRFLCAweDZEOUIsIDB4NkVFNSwgMHg2RjRELCAweDZFRTgsIDB4NkU4NSwgMHg2Q0ZBLCAweDZFRTQsIDB4NkVFMiwgMHg2RTBFLCAweDZDRkIsIDB4NkQ0RiwgMHg2RkQyLCAweDZDRjgsIDB4NkNBNSwKLSAgICAweDZGNDcsIDB4NkY0NiwgMHg2Rjc0LCAweDZDRjcsIDB4NkZEMSwgMHg2RjRCLCAweDZGOUMsIDB4NkNBMywgMHg2RUUwLCAweDZEMTIsIDB4NkVFOSwgMHg3MDRGLCAweDZFN0UsIDB4NkVFNiwgMHg2RURGLCAweDcwN0UsCi0gICAgMHg0RTNBLCAweDRFNEMsIDB4NzBDMywgMHg2NUUwLCAweDcwQkMsIDB4NzA5QywgMHg3MERGLCAweDgzMTUsIDB4NzExNSwgMHg3MEU2LCAweDcwODAsIDB4ODM2NywgMHg3MDlELCAweDcwRUQsIDB4NzBCRCwgMHg3MEU4LAotICAgIDB4NzA2RiwgMHg3MDk2LCAweDcwRTcsIDB4NzBFQiwgMHg3MTE2LCAweDg0MjUsIDB4NzA3RiwgMHg3MERCLCAweDcwRTksIDB4NzBFQywgMHg3MTE4LCAweDcwQzEsIDB4NzA4OSwgMHg3MEMyLCAweDRFODksIDB4NEUzQSwKLSAgICAweDcyMzcsIDB4NUMxNCwgMHg1ODk5LCAweDcyNEQsIDB4NzI3NSwgMHg4MzY2LCAweDcyNjYsIDB4NzI4QSwgMHg3MjdBLCAweDcyQjYsIDB4NzJFRCwgMHg3MkM4LCAweDcyRjAsIDB4NzJCOSwgMHg3MkYyLCAweDcyQjgsCi0gICAgMHg3MkYxLCAweDcyRUUsIDB4NTk1NiwgMHg3MkVDLCAweDcyRUYsIDB4NzMwMywgMHg3MkRFLCAweDgzQjcsIDB4NzMwRSwgMHg3MkI3LCAweDUxN0QsIDB4NzM2RCwgMHg3MzJFLCAweDczMTUsIDB4NzMyMSwgMHg3M0IwLAotICAgIDB4NzNEMCwgMHg3M0YyLCAweDczQUUsIDB4NzM5QSwgMHg3NDEwLCAweDc0NzYsIDB4ODNCOSwgMHg3MzlCLCAweDc0MDUsIDB4NzNCMSwgMHg3NDBGLCAweDc0MEUsIDB4NzM5MSwgMHg3NDc3LCAweDczRjAsIDB4NzNBRiwKLSAgICAweDczOTksIDB4NzNCQSwgMHg3NDNDLCAweDczRDEsIDB4NzQ4RSwgMHg3NEQyLCAweDc0RUYsIDB4NzRFRSwgMHg0RUE3LCAweDRFQTcsIDB4NEVBOSwgMHg2QkQ1LCAweDc1M0IsIDB4NzU3MiwgMHg1RjAyLCAweDVGNTMsCi0gICAgMHg3NTc0LCAweDUzRTAsIDB4NzVDOSwgMHg5MTc4LCAweDc1RjksIDB4NzVENiwgMHg3NUFGLCAweDc1QTEsIDB4NzVFQSwgMHg3NjE3LCAweDc1QUUsIDB4NzU5RiwgMHg3NUFELCAweDc2MTgsIDB4NzU5NywgMHg3NUU4LAotICAgIDB4NzVFQiwgMHg3NjA1LCAweDc1QTAsIDB4NzYyQSwgMHg3NUQyLCAweDc1OTYsIDB4NzVBQywgMHg3NjVFLCAweDc2NjMsIDB4NzYzRiwgMHg3NjNFLCAweDc1QzgsIDB4NzYyQiwgMHg3NjZCLCAweDUzRDEsIDB4NzY5MSwKLSAgICAweDc1QjEsIDB4NzZCMiwgMHg3NkIxLCAweDY3NkYsIDB4NzZENywgMHg3NkNGLCAweDVDM0QsIDB4NzZEMSwgMHg3NkQ4LCAweDUzNjIsIDB4ODM2MSwgMHg3NzI2LCAweDRGMTcsIDB4NTZGMCwgMHg3NzQxLCAweDc3NTAsCi0gICAgMHg3NzJGLCAweDc3OTIsIDB4NEU4NiwgMHg3Nzg2LCAweDc3NTEsIDB4NzcyQywgMHg3N0E5LCAweDc3RUIsIDB4Nzg0NSwgMHg3MEFFLCAweDc4NDEsIDB4Nzg1NiwgMHg3ODE3LCAweDc4MUEsIDB4Nzg1NSwgMHg3ODAwLAotICAgIDB4Nzg2RSwgMHg3ODAxLCAweDc4NTksIDB4NzgxNiwgMHg3ODlDLCAweDc4OUIsIDB4NzdGNiwgMHg3ODU3LCAweDc4NUEsIDB4Nzg0MCwgMHg3ODhELCAweDc3RkYsIDB4NzgzQSwgMHg3ODNFLCAweDc3RkUsIDB4NzgzQiwKLSAgICAweDc5ODQsIDB4Nzk3OCwgMHg3OTZGLCAweDc5NEUsIDB4NUZBMSwgMHg3OTg1LCAweDc5M0MsIDB4Nzk3NywgMHg3OUMzLCAweDdDN0MsIDB4N0EwRSwgMHg3OUM2LCAweDY4RjEsIDB4NzlDRCwgMHg3OUYwLCAweDdBMjMsCi0gICAgMHg3OUVGLCAweDk4OTYsIDB4NzlGRSwgMHg3QTUxLCAweDc5RkQsIDB4N0EzMywgMHg3QTlELCAweDZEM0MsIDB4N0E3NywgMHg3QTkxLCAweDdBOEUsIDB4N0FBRCwgMHg3QUE1LCAweDdBOUMsIDB4N0E4RCwgMHg3QUE2LAotICAgIDB4N0E4MywgMHg3QURFLCAweDdCMTQsIDB4N0IwQiwgMHg3QjE1LCAweDdCM0EsIDB4N0I1RCwgMHg4MjgyLCAweDgzMDMsIDB4N0I1MSwgMHg3QkE3LCAweDdCN0MsIDB4N0IwMywgMHg3QjVCLCAweDdCNUEsIDB4N0JBNiwKLSAgICAweDdCRDMsIDB4N0JBQSwgMHg3QjgwLCAweDdCRDEsIDB4N0JBQiwgMHg2QTkwLCAweDdCNUMsIDB4N0I3RSwgMHg1RTE4LCAweDdCRUUsIDB4N0I3OSwgMHg3QjkzLCAweDdCRUYsIDB4N0JBOCwgMHg3QzQxLCAweDdCM0MsCi0gICAgMHg3QjdFLCAweDdCM0UsIDB4N0JGMSwgMHg3QkE5LCAweDU0MDEsIDB4NTk4NiwgMHg3Q0E0LCAweDdDQzEsIDB4N0NBQSwgMHg3Q0FFLCAweDdDRjUsIDB4N0M5RCwgMHg3Qzc0LCAweDdDOUMsIDB4N0VBMCwgMHg3RUFBLAotICAgIDB4N0VBMywgMHg3RUE2LCAweDdFQTIsIDB4N0VBMSwgMHg3RUE1LCAweDdFQTgsIDB4N0VBQiwgMHg3RUI5LCAweDdFQjMsIDB4N0VCRCwgMHg3RUJFLCAweDdFQUYsIDB4N0VCMCwgMHg3RUIxLCAweDdFQjgsIDB4N0VBNywKLSAgICAweDdFQjcsIDB4N0VBRCwgMHg3RUI0LCAweDdFQkEsIDB4NjI0RSwgMHg2MjRFLCAweDdFQzYsIDB4N0VDMiwgMHg3RUMxLCAweDdFQzUsIDB4N0VCQiwgMHg3RUNELCAweDdFQzAsIDB4N0VDQiwgMHg3RUQwLCAweDdFQ0MsCi0gICAgMHg3RUM4LCAweDVGMjYsIDB4N0VDNCwgMHg3RUNBLCAweDdFRDcsIDB4N0VEMywgMHg3RURELCAweDdFRTYsIDB4N0VENCwgMHg3RURFLCAweDdFREMsIDB4N0VEQSwgMHg3RUQ5LCAweDdFRDIsIDB4N0VENiwgMHg3RURGLAotICAgIDB4NEUxRCwgMHg3RURCLCAweDdFRTIsIDB4N0VEMSwgMHg3RUUxLCAweDdFRTAsIDB4N0VFOCwgMHg3RUU1LCAweDdFQ0YsIDB4N0VGQywgMHg3RjBELCAweDdFRkYsIDB4N0VGOCwgMHg3RUZCLCAweDdFRjYsIDB4N0VGNCwKLSAgICAweDdFRkUsIDB4N0VCMiwgMHg3RjUxLCAweDdGMDAsIDB4N0VCNiwgMHg3RUZBLCAweDdFRUUsIDB4N0VGRCwgMHg3RUYwLCAweDdFRUIsIDB4N0VGNSwgMHg3RUYyLCAweDdGMDEsIDB4N0QyNywgMHg3RUVGLCAweDdFRUEsCi0gICAgMHg3RjAzLCAweDdGMDQsIDB4N0YwMiwgMHg3RUJGLCAweDdGMDksIDB4N0YwRSwgMHg3RjE0LCAweDdGMTcsIDB4N0YxOCwgMHg3RjBDLCAweDdGMTYsIDB4N0YxMywgMHg3RjA1LCAweDdFQUMsIDB4N0YxMSwgMHg3RjA4LAotICAgIDB4N0VDMywgMHg3RjBGLCAweDdGMDcsIDB4ODFGNCwgMHg4NDI2LCAweDdGMTksIDB4N0YyMiwgMHg3RjEyLCAweDdFQzksIDB4N0YyMywgMHg3RjFFLCAweDdGMUEsIDB4N0YxQywgMHg3RjFGLCAweDdGMUIsIDB4NTNCRiwKLSAgICAweDdGMUQsIDB4N0YyOSwgMHg3RUI1LCAweDdGMjcsIDB4N0YyNiwgMHg3RDc3LCAweDdGMTUsIDB4N0YyNSwgMHg2MDNCLCAweDdFRTksIDB4N0VGNywgMHg3RjJCLCAweDdGMkEsIDB4N0YyRiwgMHg3RUM3LCAweDdGMkUsCi0gICAgMHg3RjJELCAweDdFRDUsIDB4N0VFMywgMHg3RjBCLCAweDdFRjMsIDB4N0VEOCwgMHg3Q0ZCLCAweDgzMjcsIDB4N0YzMywgMHg3RjMyLCAweDdGMzQsIDB4N0VDRSwgMHg3RUU3LCAweDdGMjQsIDB4N0YzMSwgMHg3RjJDLAotICAgIDB4N0VBOSwgMHg3RUVELCAweDdGMjAsIDB4N0YyOCwgMHg3RUE0LCAweDdGMzUsIDB4N0YwNiwgMHg5NEI1LCAweDdGNDIsIDB4N0Y1QSwgMHg5QTgyLCAweDdGNjIsIDB4N0Y1NywgMHg3Rjc0LCAweDdGODEsIDB4ODI4OCwKLSAgICAweDdGOUYsIDB4N0ZBMSwgMHg0RTQ5LCAweDgxQkIsIDB4NEU2MCwgMHg3RkM2LCAweDdGREEsIDB4N0ZEOCwgMHg3RkQ5LCAweDgwMjcsIDB4NTcyMywgMHg5NUZCLCAweDgwNTQsIDB4ODA2QSwgMHg1OEYwLCAweDgwMzgsCi0gICAgMHg4MDY5LCAweDgwNDIsIDB4ODA0QywgMHg4MDRELCAweDU0MkMsIDB4ODA0QiwgMHg4MDgzLCAweDgwQzEsIDB4ODEwOSwgMHg4MEVCLCAweDgxMzEsIDB4ODBDMCwgMHg4MEJFLCAweDgwRTgsIDB4ODEzNiwgMHg4MTExLAotICAgIDB4ODBCRiwgMHg4MTFBLCAweDgwQTAsIDB4ODE3RCwgMHg4MTU4LCAweDgwQTQsIDB4ODBGNiwgMHg4MTdCLCAweDgwQzYsIDB4ODEwRCwgMHg4MTEzLCAweDgxMzgsIDB4ODExMCwgMHg4MTkxLCAweDgxNEEsIDB4ODBFQSwKLSAgICAweDgxMEYsIDB4ODExNCwgMHg4MURDLCAweDUzNjcsIDB4NEUzNCwgMHg1M0YwLCAweDRFMEUsIDB4NTE3NCwgMHg0RTNFLCAweDY1RTcsIDB4ODIzMSwgMHg4MjIzLCAweDgyMzAsIDB4ODIzQiwgMHg4MjcwLCAweDgyNzMsCi0gICAgMHg4MkM0LCAweDUyMEQsIDB4ODJDRSwgMHg1MTc5LCAweDgzNDYsIDB4OEM0NiwgMHg1RTg0LCAweDgzMEUsIDB4ODM1QSwgMHg4MkNCLCAweDUzNEUsIDB4NzBERiwgMHg4MkNDLCAweDgzQjEsIDB4NEUwNywgMHg4M0I0LAotICAgIDB4NTNGNiwgMHg4MzZELCAweDc3NDAsIDB4ODJDNywgMHg4MzY0LCAweDY0MUMsIDB4ODNCMywgMHg4Mzg1LCAweDgyQ0QsIDB4ODM2QSwgMHg3NkQ2LCAweDgzQjIsIDB4ODJDMSwgMHg4M0JDLCAweDgzNUMsIDB4ODQ4QywKLSAgICAweDg0OEIsIDB4ODQ3MSwgMHg4MzExLCAweDgzNkIsIDB4ODM2OCwgMHg4NDg3LCAweDgzNUUsIDB4ODM2QywgMHg4M0I4LCAweDgzNUIsIDB4ODQ4OSwgMHg4MjlDLCAweDg0MjcsIDB4ODRFMywgMHg4MzVGLCAweDg0REYsCi0gICAgMHg4Mjk3LCAweDU5REMsIDB4ODUzNywgMHg4M0I2LCAweDgzNTAsIDB4ODQyOCwgMHg4MzYwLCAweDUwMUYsIDB4ODRERCwgMHg4MzY5LCAweDgyN0EsIDB4ODM2RiwgMHg4NUFFLCAweDgyQzgsIDB4ODUzQywgMHg4NTNBLAotICAgIDB4ODQxQSwgMHg4NTcyLCAweDgyQTYsIDB4ODJDRiwgMHg4NTc0LCAweDgyRjksIDB4ODYxNiwgMHg4NUQzLCAweDg1MzksIDB4ODMwRiwgMHg1MTcwLCAweDg0RTAsIDB4ODQxRCwgMHg1OTA0LCAweDg2NUEsIDB4ODY0RiwKLSAgICAweDUzRjcsIDB4NEU4RiwgMHg4NjZDLCAweDg2RjEsIDB4ODcxNSwgMHg4NkFDLCAweDg2ODAsIDB4NzMyQywgMHg4NjdFLCAweDg2NzEsIDB4ODcxNywgMHg4NkYzLCAweDg2ODIsIDB4ODQyNCwgMHg4NzdDLCAweDg3ODAsCi0gICAgMHg4NkYwLCAweDg3NDgsIDB4ODdBOCwgMHg4NjZFLCAweDg3NDksIDB4ODZGMiwgMHg4NjZCLCAweDg2Q0YsIDB4ODY4MSwgMHg4NjgzLCAweDg3NDcsIDB4ODY3RiwgMHg4NzRFLCAweDg2RjQsIDB4ODc3RSwgMHg4NjlELAotICAgIDB4ODcyMSwgMHg4NkNFLCAweDg3Q0YsIDB4ODZDQSwgMHg4Njk1LCAweDg2RUUsIDB4NEYxNywgMHg2NzJGLCAweDUzNkIsIDB4NTFCMiwgMHg4ODZFLCAweDg4ODUsIDB4ODg2NSwgMHg4OEM1LCAweDkxQ0MsIDB4NTIzNiwKLSAgICAweDU5MEQsIDB4ODhDOCwgMHg4ODg2LCAweDg4RTQsIDB4ODhFMiwgMHg3RjIxLCAweDg5MUIsIDB4NEVCNSwgMHg4OEU1LCAweDg4ODQsIDB4ODhFMywgMHg4OEM2LCAweDg5MzQsIDB4ODg5QywgMHg4ODZDLCAweDg4QUQsCi0gICAgMHg4OTU1LCAweDg5QzEsIDB4ODlDNCwgMHg4OUM1LCAweDg5QzYsIDB4ODlDNywgMHg4OUNCLCAweDg5Q0QsIDB4ODlDRSwgMHg0RUIyLCAweDg5Q0EsIDB4ODlDRiwgMHg4OUQwLCAweDg5RDEsIDB4ODlDOSwgMHg4OUM4LAotICAgIDB4ODlDQywgMHg4OUMyLCAweDg5REUsIDB4ODlFRiwgMHg4OUU2LCAweDhCQTIsIDB4OEJBMywgMHg4QkExLCAweDhCQUYsIDB4OEJBNywgMHg4QkE4LCAweDhCQTYsIDB4OEJBRCwgMHg4QkFBLCAweDhCQUIsIDB4OEJBQywKLSAgICAweDhCQjAsIDB4OEJCOSwgMHg4QkI2LCAweDhCQkMsIDB4OEJDMCwgMHg4QkI3LCAweDhCQkYsIDB4OEJCRSwgMHg4QkI4LCAweDhCQzksIDB4OEJDMywgMHg4QkNBLCAweDhCQzEsIDB4OEJDMiwgMHg4QkNCLCAweDhCQjUsCi0gICAgMHg4QkM4LCAweDhCRDIsIDB4OEJDRiwgMHg4QkM0LCAweDhCQ0UsIDB4OEJDNSwgMHg4QkNELCAweDU0OEYsIDB4OEJFOSwgMHg4QkUyLCAweDhCRTMsIDB4OEJENSwgMHg4QkQ3LCAweDhCRTcsIDB4OEJERiwgMHg4QkUxLAotICAgIDB4OEJFMCwgMHg4QkQ4LCAweDhCREQsIDB4OEJFNSwgMHg4QkU2LCAweDhCREMsIDB4OEJEOSwgMHg4QkQ2LCAweDhCRDQsIDB4OEJEQiwgMHg4QkQzLCAweDU5MzgsIDB4NUZENywgMHg4QkE0LCAweDhCRjMsIDB4OEJGNiwKLSAgICAweDhCREUsIDB4OEJGMSwgMHg4QkVFLCAweDhCRUQsIDB4OEJEQSwgMHg4QkVCLCAweDhCRUMsIDB4OEJFRiwgMHg4QkYwLCAweDhCRjUsIDB4OEJGMiwgMHg4QkY0LCAweDhDMDEsIDB4OEJGRSwgMHg4QzA3LCAweDhCRkQsCi0gICAgMHg4QzBBLCAweDhDMDMsIDB4OEMwNCwgMHg4QzA2LCAweDhDMDgsIDB4OEJGRiwgMHg4QkY3LCAweDhCRTQsIDB4OEJGOSwgMHg4QkZDLCAweDhDMDUsIDB4OEJCQSwgMHg4QzAyLCAweDhDMDAsIDB4OEMwRCwgMHg4QzFFLAotICAgIDB4OEMxRCwgMHg4QzI1LCAweDhCRTgsIDB4OEMxNCwgMHg4QzFCLCAweDhDMTAsIDB4OEMwRiwgMHg4QzE1LCAweDhDMTgsIDB4OEJCMywgMHg4QzE5LCAweDhDMEMsIDB4OEJCRCwgMHg4QkY4LCAweDhDMUEsIDB4OEMxNiwKLSAgICAweDhCRkEsIDB4OEMwQiwgMHg4QzEyLCAweDhDMTMsIDB4OEE4QSwgMHg4QkNDLCAweDhDMEUsIDB4OEMxQywgMHg4QzI3LCAweDhDMTEsIDB4OEMyMSwgMHg4QzI0LCAweDhDMjYsIDB4OEJCMiwgMHg4QzIyLCAweDhDMjMsCi0gICAgMHg4QzFGLCAweDhDMkEsIDB4OEMyQywgMHg4QkI0LCAweDhDMjgsIDB4OEMyOSwgMHg4QkMxLCAweDhDMzIsIDB4OEJBNSwgMHg4QzJFLCAweDhCQzYsIDB4OEMyRiwgMHg4QzJELCAweDhDMzEsIDB4OEMzNSwgMHg4QkQxLAotICAgIDB4OEJBRSwgMHg4QzM0LCAweDYyQTQsIDB4OEJFQSwgMHg4QTg5LCAweDhDMkIsIDB4OEJGQiwgMHg1M0Q4LCAweDhBNUYsIDB4OTZFMCwgMHg4QzE3LCAweDhCQTksIDB4OEMzMCwgMHg4QzM2LCAweDhENUUsIDB4OEMyMCwKLSAgICAweDhDMzMsIDB4NUM4MiwgMHg3QUQ2LCAweDRFMzAsIDB4NzMyQSwgMHg4QzZFLCAweDczMkIsIDB4OEQxRCwgMHg4RDFFLCAweDhEMUYsIDB4OEQyMiwgMHg4RDIxLCAweDhEMkIsIDB4OEQyNywgMHg4RDI5LCAweDhEMkEsCi0gICAgMHg4RDJGLCAweDhEMjMsIDB4OEQyRSwgMHg4RDMzLCAweDhENDAsIDB4OEQzMCwgMHg4RDM1LCAweDhEMkMsIDB4NEU3MCwgMHg4RDM3LCAweDhEMzYsIDB4OEQzOSwgMHg4RDM0LCAweDhEM0IsIDB4OEQzOCwgMHg4RDNBLAotICAgIDB4OEQzMiwgMHg4RDQyLCAweDhENDEsIDB4OEQzRiwgMHg4RDQ1LCAweDhENDQsIDB4OEQzRSwgMHg4RDNDLCAweDhENDgsIDB4OEQ0QSwgMHg1QkJFLCAweDhENDcsIDB4OEQ1MiwgMHg4RDQ5LCAweDhENTAsIDB4OEQ0RiwKLSAgICAweDhENTQsIDB4OEQ1MywgMHg4RDI0LCAweDUzNTYsIDB4OEQzMSwgMHg4RDRCLCAweDhENTUsIDB4OEQyOCwgMHg4RDI2LCAweDhENEMsIDB4OEQ1NiwgMHg4RDU3LCAweDhENUEsIDB4OEQ1OSwgMHg4RDJELCAweDhENUIsCi0gICAgMHg4RDVDLCAweDhEM0QsIDB4OEQ1OCwgMHg4RDVGLCAweDhENjAsIDB4OEQ1RSwgMHg4RDYxLCAweDhENjIsIDB4OEQ0NiwgMHg4RDQzLCAweDhENTEsIDB4OEQ0RSwgMHg4RDVELCAweDhENjMsIDB4OEQ2QSwgMHg4RDc2LAotICAgIDB4OEQ3NSwgMHg4RDhCLCAweDhEQjEsIDB4OEZGOSwgMHg4REY1LCAweDhFMEEsIDB4OERDNCwgMHg4REY4LCAweDhERDYsIDB4OEU1MiwgMHg4REY3LCAweDhERjYsIDB4OERCOCwgMHg4RTBDLCAweDhERkIsIDB4OERDMywKLSAgICAweDhFMkYsIDB4OERERSwgMHg4RTJDLCAweDhFNzAsIDB4OERGOSwgMHg4RTUxLCAweDhFN0YsIDB4OEU5QywgMHg4RThGLCAweDhFQUYsIDB4OEY2NiwgMHg4RjY3LCAweDhGNjgsIDB4NTE5QiwgMHg4RjY5LCAweDhGNkIsCi0gICAgMHg4RjZELCAweDhGNkYsIDB4OEY3OCwgMHg4RjcxLCAweDhGNzQsIDB4OEY3NSwgMHg4RjdBLCAweDhGNzIsIDB4OEY3NiwgMHg4RjdDLCAweDhGODMsIDB4OEY4MiwgMHg4RjgxLCAweDhGODAsIDB4OEY3RCwgMHg4RjdFLAotICAgIDB4OEY4NCwgMHg4Rjg1LCAweDhGN0IsIDB4OEY4NiwgMHg4RjhFLCAweDhGODksIDB4OEY4QiwgMHg4RjhELCAweDhGOEEsIDB4OEY4NywgMHg4Rjg4LCAweDhGNkUsIDB4OEY5MSwgMHg4RjhGLCAweDhGOTMsIDB4OEY5MCwKLSAgICAweDhGOTcsIDB4ODIwNiwgMHg4RjkyLCAweDZCQzIsIDB4OEY5NiwgMHg4Rjk1LCAweDhGOTgsIDB4OEY2QywgMHg4Rjk5LCAweDhGN0YsIDB4OEY5QSwgMHg4RjcwLCAweDhGOTQsIDB4OEY3OSwgMHg4RjczLCAweDUyOUUsCi0gICAgMHg4RjlFLCAweDhGQUIsIDB4OEZBOSwgMHg1MTlDLCAweDhGRDksIDB4OEZERSwgMHg1NDY4LCAweDhGREIsIDB4NkUzOCwgMHg4RkQwLCAweDhGQzcsIDB4OEZCRSwgMHg4RkRELCAweDkwNjUsIDB4OTAwQSwgMHg5MDEyLAotICAgIDB4OEZEQywgMHg5MDAyLCAweDhGREYsIDB4OEZDMSwgMHg5MDA5LCAweDkwNTcsIDB4OEZCRCwgMHg4RkM4LCAweDhGRDgsIDB4OEZFOSwgMHg4RkI5LCAweDkwM0IsIDB4OTAyNiwgMHg5MENGLCAweDkwQUUsIDB4OTBEMywKLSAgICAweDRFNjEsIDB4OTBCOSwgMHg5MEFDLCAweDkwRTcsIDB4OTA5MywgMHg5MEQxLCAweDkwQkIsIDB4OTBGOCwgMHg5MEJBLCAweDkwRDAsIDB4OTA5RCwgMHg5MTQyLCAweDkwRTYsIDB4ODE0QywgMHg0RTExLCAweDkxNUQsCi0gICAgMHg1MzNCLCAweDkxNzEsIDB4OTE2NiwgMHg5MTdGLCAweDg4NDUsIDB4OTE3RSwgMHg5MTdELCAweDkxQ0EsIDB4OTQ4NywgMHg5NDhDLCAweDk0OEEsIDB4OTQ4OSwgMHg5NDhCLCAweDk0ODgsIDB4OTQ5MywgMHg5NDkwLAotICAgIDB4OTQ4RiwgMHg5NDkyLCAweDk0OEUsIDB4OTQ5NywgMHg5NDhELCAweDk0OTUsIDB4OTRBRiwgMHg5NEFCLCAweDk0OTgsIDB4OTRBRCwgMHg5NEEwLCAweDk0OUQsIDB4OTRBNCwgMHg5NEEzLCAweDk0OUUsIDB4OTRBRSwKLSAgICAweDk0QTcsIDB4OTQ5OSwgMHg5NDlCLCAweDk0QUEsIDB4OTRDQywgMHg5NEM4LCAweDk0QjYsIDB4OTRDMywgMHg5NEI0LCAweDk0QjksIDB4OTRDRCwgMHg5NEIwLCAweDk0QjgsIDB4OTRDMCwgMHg5NEJGLCAweDk0QkUsCi0gICAgMHg5NDlDLCAweDk0Q0EsIDB4OTRDOSwgMHg5NEM3LCAweDk0Q0IsIDB4OTRDMiwgMHg5NEIzLCAweDk0QzYsIDB4OTRDNSwgMHg5NEJBLCAweDk0QTksIDB4OTRCMiwgMHg5NEJDLCAweDk0QkQsIDB4OTRDRiwgMHg5NEYwLAotICAgIDB4OTREMiwgMHg5NEVDLCAweDk0RUEsIDB4OTRGNiwgMHg5NEYzLCAweDk0REMsIDB4OTREQSwgMHg5NEUzLCAweDk0RTgsIDB4OTRFMiwgMHg5NEVELCAweDk0RUIsIDB4OTRFNiwgMHg4ODU0LCAweDk0RDEsIDB4OTRGNywKLSAgICAweDk0RjEsIDB4OTRERiwgMHg5NEY1LCAweDk0RDUsIDB4OTRFRiwgMHg5NEQwLCAweDk1MTAsIDB4OTUwMCwgMHg5NTA4LCAweDk1MTEsIDB4OTUwOSwgMHg5NERELCAweDk1MTIsIDB4OTUwQywgMHg5NEExLCAweDk0RTQsCi0gICAgMHg5NEQ3LCAweDk1MEIsIDB4OTUwQSwgMHg5NTEzLCAweDk1MDQsIDB4OTUwMywgMHg5NTE0LCAweDk1MDcsIDB4OTREMywgMHg5NEZBLCAweDk0RDYsIDB4OTUwNiwgMHg5NTAyLCAweDk1MkYsIDB4OTRBMiwgMHg5NTFFLAotICAgIDB4NUY1NSwgMHg5NTE2LCAweDk1MjksIDB4OTRENCwgMHg5NTI1LCAweDk1MTUsIDB4OTUxRiwgMHg5NTI0LCAweDk1MzEsIDB4OTRFRSwgMHg5NTFCLCAweDk1MkMsIDB4OTUyRCwgMHg5NTFDLCAweDk0QjEsIDB4OTUyNiwKLSAgICAweDk1MUEsIDB4OTUyMCwgMHg5NTIxLCAweDk1MjIsIDB4OTUxOSwgMHg5NTMwLCAweDg4NjgsIDB4OTRGQywgMHg5NTI4LCAweDk0OTQsIDB4OTUzNCwgMHg5NEZFLCAweDk1MDUsIDB4OTU0MCwgMHg5NTM3LCAweDk0RTEsCi0gICAgMHg5NDk2LCAweDk1M0IsIDB4OTUzRCwgMHg5NTM4LCAweDk1MzIsIDB4OTUzOSwgMHg5NTNFLCAweDk1MkUsIDB4OTUzNiwgMHg5NTE3LCAweDk1M0EsIDB4OTU0MSwgMHg5NTUxLCAweDk1NTUsIDB4OTUwMSwgMHg5NTQ5LAotICAgIDB4OTU0OCwgMHg5NTQzLCAweDk0QTgsIDB4ODRFNSwgMHg5NTRGLCAweDk0RTAsIDB4OTRFOSwgMHg5NTNDLCAweDk1NTAsIDB4OTU0NywgMHg5NTUyLCAweDk1NEQsIDB4OTU1MywgMHg5NTVFLCAweDk1NUYsIDB4OTRGRSwKLSAgICAweDk1NDYsIDB4OTU1OSwgMHg5NTYwLCAweDk1NUQsIDB4OTRGRiwgMHg5NTM1LCAweDk1NTcsIDB4OTU1OCwgMHg5NTVCLCAweDk0RjIsIDB4OTU1QywgMHg5NTU2LCAweDk1NDIsIDB4OTMzRSwgMHg5NTVBLCAweDk0RTcsCi0gICAgMHg5NTZBLCAweDk1MDgsIDB4OTREOSwgMHg5NTYzLCAweDk1NjYsIDB4OTU2MSwgMHg5NDlGLCAweDk1NkIsIDB4OTUwRiwgMHg5NTQ0LCAweDk1NEMsIDB4OTU3MCwgMHg5NTZGLCAweDk1NkQsIDB4OTRDMSwgMHg5NTZFLAotICAgIDB4OTRDRSwgMHg5NERCLCAweDk1NzEsIDB4OTRGOCwgMHg5NTZDLCAweDk1NTQsIDB4OTI3NCwgMHg5NTI3LCAweDk1NzQsIDB4OTRDNCwgMHg5NTczLCAweDk1NjcsIDB4OTRBNSwgMHg5NTc1LCAweDk1NzYsIDB4OTU0QSwKLSAgICAweDk1NjksIDB4OTUyMywgMHg5NEJCLCAweDkyQUUsIDB4NTFGRiwgMHg5NTdGLCAweDk1RTgsIDB4OTVFOSwgMHg5NUVBLCAweDk1RUIsIDB4OTVFQywgMHg5NUVELCAweDVGMDAsIDB4OTVGNiwgMHg5NUYzLCAweDk1RjAsCi0gICAgMHg5NUYyLCAweDk1RjQsIDB4OTVGNSwgMHg5NUY4LCAweDk2MDIsIDB4OTYwMSwgMHg5NjAwLCAweDk1RkEsIDB4OTVGRCwgMHg5NjAzLCAweDk2MDYsIDB4OTVGRSwgMHg5NjA1LCAweDk2MEEsIDB4OTYwOSwgMHg5NjBFLAotICAgIDB4OTYwRiwgMHg5NjBELCAweDk2MDgsIDB4OTYwQywgMHg5NjEyLCAweDY3N0YsIDB4NjY5NywgMHg5NUYxLCAweDk2MTQsIDB4OTYxNSwgMHg5NjExLCAweDk2MTcsIDB4OTYxOCwgMHg5NUZGLCAweDk2MTYsIDB4OTYxOSwKLSAgICAweDk1RUYsIDB4NTE3MywgMHg5NjFBLCAweDk2MTMsIDB4OTYxMCwgMHg4RjlGLCAweDk2MUIsIDB4OTVGQywgMHg5NjQ5LCAweDk2NTUsIDB4OTYzNSwgMHg5NjM0LCAweDk2NDgsIDB4OTY0NiwgMHg5NjMzLCAweDk2NjcsCi0gICAgMHg5NjFGLCAweDk2MzYsIDB4OTY2OCwgMHg5NjQ1LCAweDk2OEYsIDB4OTY2OSwgMHg5NjkwLCAweDk2NDcsIDB4OTZCNiwgMHg1M0VBLCAweDk2QkQsIDB4ODY3RCwgMHg1M0NDLCAweDk2Q0YsIDB4Njc0MiwgMHg5RTIxLAotICAgIDB4NzlCQiwgMHg5NkJFLCAweDRFOTEsIDB4NzUzNSwgMHg5NzIxLCAweDk2RkUsIDB4OTcwMSwgMHg5NkYzLCAweDk3MkQsIDB4NTNDNywgMHg3MDc1LCAweDUzQzYsIDB4OTc1MywgMHg5NzU5LCAweDgxN0MsIDB4OTc2NSwKLSAgICAweDlGMTcsIDB4NURFOSwgMHg5NzlGLCAweDdGMzAsIDB4OTc5MSwgMHg5N0FGLCAweDk3RTYsIDB4OTdFNywgMHg5N0U5LCAweDk3RUEsIDB4OTdFQywgMHg5N0VCLCAweDk3RjUsIDB4NTRDRCwgMHg5ODc1LCAweDk4NzYsCi0gICAgMHg5ODc3LCAweDk4NzksIDB4OTg3QSwgMHg5ODc4LCAweDk4N0IsIDB4OTg3QywgMHg5ODgyLCAweDk4ODAsIDB4OTg4MywgMHg5ODg0LCAweDk4N0QsIDB4OTg4MSwgMHg5ODdGLCAweDk4ODcsIDB4OTg4NiwgMHg5ODhDLAotICAgIDB4OTg4OSwgMHg5ODkwLCAweDk4OEYsIDB4NTkzNCwgMHg5ODhBLCAweDk4OEIsIDB4OTg5NCwgMHg5ODg4LCAweDk4OTMsIDB4OTg5MSwgMHg5ODk3LCAweDk4OTgsIDB4OTg5RCwgMHg5ODlBLCAweDk4OUMsIDB4OTg5OSwKLSAgICAweDk4OUIsIDB4NjEzRiwgMHg5OEExLCAweDk4QTAsIDB4N0M3QiwgMHg5ODlGLCAweDk4QTIsIDB4OTg3RSwgMHg5OEE0LCAweDk4QTUsIDB4NjYzRSwgMHg5OEE2LCAweDk4ODUsIDB4OTg5RSwgMHg5OEE3LCAweDk4Q0UsCi0gICAgMHg5OEQwLCAweDk4RDEsIDB4OThEMiwgMHg1M0YwLCAweDk4RDMsIDB4OThENCwgMHg5OENGLCAweDk4RDYsIDB4OThENSwgMHg5OEQ3LCAweDk4RDgsIDB4OThEOSwgMHg5OERFLCAweDk5NjUsIDB4OTk2NCwgMHg5OTY2LAotICAgIDB4OTk2OCwgMHg5OTZBLCAweDk5NkIsIDB4OTk2QywgMHg5OTZELCAweDk5NkUsIDB4OTk3NCwgMHg5OTcyLCAweDk5NzEsIDB4OTk3MCwgMHg5OTczLCAweDk5N0EsIDB4OTk3OCwgMHg5OTdDLCAweDk5NzcsIDB4NTE3QiwKLSAgICAweDk5NzUsIDB4OTk3OSwgMHg5OTdELCAweDk5ODEsIDB4OTk3RiwgMHg5OTdFLCAweDRGNTksIDB4ODBCNCwgMHg5OTg0LCAweDk5ODMsIDB4OTk2RiwgMHg5OTg1LCAweDk5ODYsIDB4N0NDNywgMHg5OTY3LCAweDU1ODIsCi0gICAgMHg5OTg5LCAweDk5OEUsIDB4OTk2OSwgMHg5OThGLCAweDk5OEEsIDB4OTk4QywgMHg5OThELCAweDk5OTIsIDB4OTk5MCwgMHg5OTkxLCAweDk5ODgsIDB4OTk5NCwgMHg5OTc2LCAweDk4RTgsIDB4OTkwRCwgMHg5OThCLAotICAgIDB4OUE2QywgMHg5QTZELCAweDUxQUYsIDB4OUE2RSwgMHg5QTcwLCAweDlBNkYsIDB4OUE3MywgMHg5QTdCLCAweDlBN0QsIDB4OUE3OSwgMHg5QTc1LCAweDlBN0UsIDB4OUE4MCwgMHg5QTc4LCAweDlBNzYsIDB4OUE3QywKLSAgICAweDlBNzcsIDB4OUE4OCwgMHg5QTg3LCAweDlBODMsIDB4OUE4NiwgMHg5QThFLCAweDlBOEYsIDB4OUE4QiwgMHg5QThELCAweDlBOTMsIDB4OUE5MiwgMHg5QTkxLCAweDlBOTAsIDB4OUE5QiwgMHg5QTk3LCAweDlBOTksCi0gICAgMHg5QTlFLCAweDlBOTgsIDB4OUE5RCwgMHg4MTdFLCAweDlBN0EsIDB4OUE5QSwgMHg5QTlGLCAweDlBQTEsIDB4ODRFNiwgMHg5QTlDLCAweDlBOTYsIDB4OUFBMCwgMHg5QUEyLCAweDlBNzEsIDB4OUE4NSwgMHg5QTk1LAotICAgIDB4OUE4MSwgMHg5QTg0LCAweDlBOEMsIDB4NjBDQSwgMHg5QTdGLCAweDlBQTQsIDB4OUE3NCwgMHg5QUE3LCAweDlBQTUsIDB4OUFBNiwgMHg5QThBLCAweDgwQUUsIDB4OUFDNSwgMHg4MTBGLCAweDRGNTMsIDB4OUFDQywKLSAgICAweDlBQ0IsIDB4NTNEMSwgMHg2NzdFLCAweDgwRTEsIDB4OUIxMywgMHg2NTk3LCAweDk1RjksIDB4OTYwQiwgMHg5NjA0LCAweDkwQzEsIDB4OUI0OSwgMHg5QjQ3LCAweDlDN0MsIDB4OUM4MCwgMHg5QzgxLCAweDlDODIsCi0gICAgMHg5QzdGLCAweDlDODUsIDB4OUM4NiwgMHg5QzhGLCAweDlDODcsIDB4OUM5MCwgMHg5QzhELCAweDlDOEIsIDB4OUM4QSwgMHg5QzkyLCAweDlDOTUsIDB4OUM5NiwgMHg5Qzk0LCAweDlDOUIsIDB4OUM5MSwgMHg5QzlDLAotICAgIDB4OUNBNywgMHg5Q0EwLCAweDlDQTksIDB4OUNBNCwgMHg5Q0E4LCAweDlDQkIsIDB4OUNBRiwgMHg5Q0FELCAweDlDOUUsIDB4OUNCNywgMHg5Q0I0LCAweDlDQjEsIDB4OUNCNSwgMHg5Q0IyLCAweDlDQjMsIDB4OUNCOCwKLSAgICAweDlDQUUsIDB4OUNCMCwgMHg5Q0I2LCAweDlDQUIsIDB4OUNDQSwgMHg5Qzk3LCAweDlDQkQsIDB4OUNDNywgMHg5Q0M1LCAweDlDQzYsIDB4OUNDMywgMHg5Q0QyLCAweDlDRDEsIDB4OUNBNSwgMHg5Q0NGLCAweDlDQ0UsCi0gICAgMHg5Q0QwLCAweDlDQ0QsIDB4OUNDMSwgMHg5Q0EyLCAweDlDQ0MsIDB4OUNBNiwgMHg5Q0EzLCAweDlDQjksIDB4OUNENywgMHg5Q0Q0LCAweDlDQzksIDB4OUNENSwgMHg5Q0Q2LCAweDlDREYsIDB4OUNERCwgMHg5Q0RDLAotICAgIDB4OUNERSwgMHg5QzlGLCAweDlDQkMsIDB4OUM4RSwgMHg5Qzk5LCAweDlDRTMsIDB4OUNFMiwgMHg5QzlBLCAweDlDQzQsIDB4OUM4OCwgMHg5Q0ExLCAweDlFMUYsIDB4NTFFQiwgMHg5RTIwLCAweDlFMjQsIDB4NTFFNCwKLSAgICAweDlFMjMsIDB4OUUyMiwgMHg5RTI5LCAweDlFMjgsIDB4OUUyNiwgMHg5RTMwLCAweDlFMzUsIDB4OUUzMywgMHg5RTMyLCAweDlFMkUsIDB4OUUzMSwgMHg5RTJBLCAweDlFMkYsIDB4OUUyRCwgMHg5RTM4LCAweDlFMzksCi0gICAgMHg5RTNCLCAweDlFM0YsIDB4OUUzRCwgMHg5RTNBLCAweDlFNDMsIDB4OUU0NiwgMHg5RTQxLCAweDlFNDgsIDB4OUU0NSwgMHg5RTQ0LCAweDlFNDksIDB4OUU0QywgMHg5RTRGLCAweDlFNEUsIDB4OUU0QSwgMHg5RTUzLAotICAgIDB4OUUyQiwgMHg5RTUxLCAweDlFNEIsIDB4OUU1OSwgMHg5RTU1LCAweDlFNTcsIDB4OUU1NiwgMHg5RTRELCAweDlFNUIsIDB4OUU1QywgMHg4M0JBLCAweDlFNUYsIDB4OUU2NCwgMHg5RTYwLCAweDlFNjEsIDB4OUU1OCwKLSAgICAweDlFNjMsIDB4OUU1QSwgMHg5RTYyLCAweDlFNUUsIDB4OUU2NywgMHg5RTY1LCAweDlFMjUsIDB4OUUzNywgMHg5RTY4LCAweDlFMzYsIDB4OUU2QSwgMHg5RTU0LCAweDlFNjksIDB4OUU2QiwgMHg5RTQ3LCAweDlFNkMsCi0gICAgMHg5RTcwLCAweDlFNkQsIDB4OUU2RiwgMHg5RTJDLCAweDlFNzQsIDB4OUU2NiwgMHg5RTczLCAweDlFNDIsIDB4OUUzRSwgMHg1MzY0LCAweDlFN0UsIDB4Nzg3NywgMHg3NkQwLCAweDRFM0QsIDB4OUVBNiwgMHg5RUI4LAotICAgIDB4OUVCOSwgMHg5NzYyLCAweDRFNDgsIDB4OUVDNCwgMHg5RUM5LCAweDcwQjksIDB4NTE1QSwgMHg5NzA5LCAweDlFRTEsIDB4OUVFOSwgMHg5RUZFLCAweDlGMEIsIDB4OUYwRCwgMHg5RjM5LCAweDlGNTAsIDB4NjU4QiwKLSAgICAweDhENEQsIDB4OUY1MSwgMHg5RjdGLCAweDlGODAsIDB4OUY4MSwgMHg5Rjg1LCAweDlGODcsIDB4OUY4MywgMHg5Rjg2LCAweDlGODQsIDB4OUY4OCwgMHg5RjhBLCAweDlGODksIDB4OUY4QiwgMHg5RjhDLCAweDlGOTksCi0gICAgMHg1MzkwLCAweDVFOUUsIDB4OUY5QSwgMHg5RjlCLCAweDlGOUYsIDB4QTc2RiwgMHg4QzQ4LCAweDY2RjQsIDB4OEVDQSwgMHg4Q0M4LCAweDZFRDEsIDB4NEUzMiwgMHg1M0U1LCAweDlGOUMsIDB4OUY5QywgMHg1OTUxLAotICAgIDB4OTFEMSwgMHg1NTg3LCAweDU5NDgsIDB4NjFGNiwgMHg3NjY5LCAweDdGODUsIDB4ODYzRiwgMHg4N0JBLCAweDg4RjgsIDB4OTA4RiwgMHg2QTAyLCAweDZEMUIsIDB4NzBEOSwgMHg3M0RFLCAweDg0M0QsIDB4OTE2QSwKLSAgICAweDk5RjEsIDB4NEU4MiwgMHg1Mzc1LCAweDZCMDQsIDB4NzIxQiwgMHg4NjJELCAweDlFMUUsIDB4NUQ1MCwgMHg2RkVCLCAweDg1Q0QsIDB4ODk2NCwgMHg2MkM5LCAweDgxRDgsIDB4ODgxRiwgMHg1RUNBLCAweDY3MTcsCi0gICAgMHg2RDZBLCAweDcyRkMsIDB4OTBDRSwgMHg0Rjg2LCAweDUxQjcsIDB4NTJERSwgMHg2NEM0LCAweDZBRDMsIDB4NzIxMCwgMHg3NkU3LCAweDgwMDEsIDB4ODYwNiwgMHg4NjVDLCAweDhERUYsIDB4OTczMiwgMHg5QjZGLAotICAgIDB4OURGQSwgMHg3ODhDLCAweDc5N0YsIDB4N0RBMCwgMHg4M0M5LCAweDkzMDQsIDB4OUU3RiwgMHg4QUQ2LCAweDU4REYsIDB4NUYwNCwgMHg3QzYwLCAweDgwN0UsIDB4NzI2MiwgMHg3OENBLCAweDhDQzIsIDB4OTZGNywKLSAgICAweDU4RDgsIDB4NUM2MiwgMHg2QTEzLCAweDZEREEsIDB4NkYwRiwgMHg3RDJGLCAweDdFMzcsIDB4OTY0QiwgMHg1MkQyLCAweDgwOEIsIDB4NTFEQywgMHg1MUNDLCAweDdBMUMsIDB4N0RCRSwgMHg4M0YxLCAweDk2NzUsCi0gICAgMHg4QjgwLCAweDYyQ0YsIDB4NkEwMiwgMHg4QUZFLCAweDRFMzksIDB4NUJFNywgMHg2MDEyLCAweDczODcsIDB4NzU3MCwgMHg1MzE3LCAweDc4RkIsIDB4NEZCRiwgMHg1RkE5LCAweDRFMEQsIDB4NkNDQywgMHg2NTc4LAotICAgIDB4N0QyMiwgMHg1M0MzLCAweDU4NUUsIDB4NzcwMSwgMHg4NDQ5LCAweDhBQUEsIDB4NkJCQSwgMHg4RkIwLCAweDZDODgsIDB4NjJGRSwgMHg4MkU1LCAweDYzQTAsIDB4NzU2NSwgMHg0RUFFLCAweDUxNjksIDB4NTFDOSwKLSAgICAweDY4ODEsIDB4N0NFNywgMHg4MjZGLCAweDhBRDIsIDB4OTFDRiwgMHg1MkY1LCAweDU0NDIsIDB4NTk3MywgMHg1RUVDLCAweDY1QzUsIDB4NkZGRSwgMHg3OTJBLCAweDk1QUQsIDB4OUE2QSwgMHg5RTk3LCAweDlFQ0UsCi0gICAgMHg1MjlCLCAweDY2QzYsIDB4NkI3NywgMHg4RjYyLCAweDVFNzQsIDB4NjE5MCwgMHg2MjAwLCAweDY0OUEsIDB4NkYyMywgMHg3MTQ5LCAweDc0ODksIDB4NzlDQSwgMHg3REY0LCAweDgwNkYsIDB4OEYyNiwgMHg4NEVFLAotICAgIDB4OTAyMywgMHg5MzRBLCAweDUyMTcsIDB4NTJBMywgMHg1NEJELCAweDcwQzgsIDB4ODhDMiwgMHg4QUFBLCAweDVFQzksIDB4NUZGNSwgMHg2MzdCLCAweDZCQUUsIDB4N0MzRSwgMHg3Mzc1LCAweDRFRTQsIDB4NTZGOSwKLSAgICAweDVCRTcsIDB4NURCQSwgMHg2MDFDLCAweDczQjIsIDB4NzQ2OSwgMHg3RjlBLCAweDgwNDYsIDB4OTIzNCwgMHg5NkY2LCAweDk3NDgsIDB4OTgxOCwgMHg0RjhCLCAweDc5QUUsIDB4OTFCNCwgMHg5NkI4LCAweDYwRTEsCi0gICAgMHg0RTg2LCAweDUwREEsIDB4NUJFRSwgMHg1QzNGLCAweDY1OTksIDB4NkEwMiwgMHg3MUNFLCAweDc2NDIsIDB4ODRGQywgMHg5MDdDLCAweDlGOEQsIDB4NjY4OCwgMHg5NjJFLCAweDUyODksIDB4Njc3QiwgMHg2N0YzLAotICAgIDB4NkQ0MSwgMHg2RTlDLCAweDc0MDksIDB4NzU1OSwgMHg3ODZCLCAweDdEMTAsIDB4OTg1RSwgMHg1MTZELCAweDYyMkUsIDB4OTY3OCwgMHg1MDJCLCAweDVEMTksIDB4NkRFQSwgMHg4RjJBLCAweDVGOEIsIDB4NjE0NCwKLSAgICAweDY4MTcsIDB4NzM4NywgMHg5Njg2LCAweDUyMjksIDB4NTQwRiwgMHg1QzY1LCAweDY2MTMsIDB4Njc0RSwgMHg2OEE4LCAweDZDRTUsIDB4NzQwNiwgMHg3NUUyLCAweDdGNzksIDB4ODhDRiwgMHg4OEUxLCAweDkxQ0MsCi0gICAgMHg5NkUyLCAweDUzM0YsIDB4NkVCQSwgMHg1NDFELCAweDcxRDAsIDB4NzQ5OCwgMHg4NUZBLCAweDk2QTMsIDB4OUM1NywgMHg5RTlGLCAweDY3OTcsIDB4NkRDQiwgMHg4MUU4LCAweDdBQ0IsIDB4N0IyMCwgMHg3QzkyLAotICAgIDB4NzJDMCwgMHg3MDk5LCAweDhCNTgsIDB4NEVDMCwgMHg4MzM2LCAweDUyM0EsIDB4NTIwNywgMHg1RUE2LCAweDYyRDMsIDB4N0NENiwgMHg1Qjg1LCAweDZEMUUsIDB4NjZCNCwgMHg4RjNCLCAweDg4NEMsIDB4OTY0RCwKLSAgICAweDg5OEIsIDB4NUVEMywgMHg1MTQwLCAweDU1QzAsIDB4NTg1QSwgMHg2Njc0LCAweDUxREUsIDB4NzMyQSwgMHg3NkNBLCAweDc5M0MsIDB4Nzk1RSwgMHg3OTY1LCAweDc5OEYsIDB4OTc1NiwgMHg3Q0JFLCAweDdGQkQsCi0gICAgMHg4NjEyLCAweDhBRjgsIDB4OTAzOCwgMHg5MEZELCAweDk4RUYsIDB4OThGQywgMHg5OTI4LCAweDlEQjQsIDB4NEZBRSwgMHg1MEU3LCAweDUxNEQsIDB4NTJDOSwgMHg1MkU0LCAweDUzNTEsIDB4NTU5RCwgMHg1NjA2LAotICAgIDB4NTY2OCwgMHg1ODQwLCAweDU4QTgsIDB4NUM2NCwgMHg1QzZFLCAweDYwOTQsIDB4NjE2OCwgMHg2MThFLCAweDYxRjIsIDB4NjU0RiwgMHg2NUUyLCAweDY2OTEsIDB4Njg4NSwgMHg2RDc3LCAweDZFMUEsIDB4NkYyMiwKLSAgICAweDcxNkUsIDB4NzIyQiwgMHg3NDIyLCAweDc4OTEsIDB4NzkzRSwgMHg3OTQ5LCAweDc5NDgsIDB4Nzk1MCwgMHg3OTU2LCAweDc5NUQsIDB4Nzk4RCwgMHg3OThFLCAweDdBNDAsIDB4N0E4MSwgMHg3QkMwLCAweDdERjQsCi0gICAgMHg3RTA5LCAweDdFNDEsIDB4N0Y3MiwgMHg4MDA1LCAweDgxRUQsIDB4ODI3OSwgMHg4Mjc5LCAweDg0NTcsIDB4ODkxMCwgMHg4OTk2LCAweDhCMDEsIDB4OEIzOSwgMHg4Q0QzLCAweDhEMDgsIDB4OEZCNiwgMHg5MDM4LAotICAgIDB4OTZFMywgMHg5N0ZGLCAweDk4M0IsIDB4NjA3NSwgMHg4MjE4LCAweDRFMjYsIDB4NTFCNSwgMHg1MTY4LCAweDRGODAsIDB4NTE0NSwgMHg1MTgwLCAweDUyQzcsIDB4NTJGQSwgMHg1NTlELCAweDU1NTUsIDB4NTU5OSwKLSAgICAweDU1RTIsIDB4NTg1QSwgMHg1OEIzLCAweDU5NDQsIDB4NTk1NCwgMHg1QTYyLCAweDVCMjgsIDB4NUVEMiwgMHg1RUQ5LCAweDVGNjksIDB4NUZBRCwgMHg2MEQ4LCAweDYxNEUsIDB4NjEwOCwgMHg2MThFLCAweDYxNjAsCi0gICAgMHg2MUYyLCAweDYyMzQsIDB4NjNDNCwgMHg2NDFDLCAweDY0NTIsIDB4NjU1NiwgMHg2Njc0LCAweDY3MTcsIDB4NjcxQiwgMHg2NzU2LCAweDZCNzksIDB4NkJCQSwgMHg2RDQxLCAweDZFREIsIDB4NkVDQiwgMHg2RjIyLAotICAgIDB4NzAxRSwgMHg3MTZFLCAweDc3QTcsIDB4NzIzNSwgMHg3MkFGLCAweDczMkEsIDB4NzQ3MSwgMHg3NTA2LCAweDc1M0IsIDB4NzYxRCwgMHg3NjFGLCAweDc2Q0EsIDB4NzZEQiwgMHg3NkY0LCAweDc3NEEsIDB4Nzc0MCwKLSAgICAweDc4Q0MsIDB4N0FCMSwgMHg3QkMwLCAweDdDN0IsIDB4N0Q1QiwgMHg3REY0LCAweDdGM0UsIDB4ODAwNSwgMHg4MzUyLCAweDgzRUYsIDB4ODc3OSwgMHg4OTQxLCAweDg5ODYsIDB4ODk5NiwgMHg4QUJGLCAweDhBRjgsCi0gICAgMHg4QUNCLCAweDhCMDEsIDB4OEFGRSwgMHg4QUVELCAweDhCMzksIDB4OEI4QSwgMHg4RDA4LCAweDhGMzgsIDB4OTA3MiwgMHg5MTk5LCAweDkyNzYsIDB4OTY3QywgMHg5NkUzLCAweDk3NTYsIDB4OTdEQiwgMHg5N0ZGLAotICAgIDB4OTgwQiwgMHg5ODNCLCAweDlCMTIsIDB4OUY5QywgMHgzQjlELCAweDQwMTgsIDB4NDAzOSwgMHg5RjQzLCAweDlGOEUsIDB4MDVFMiwgMHgwNUQwLCAweDA1RDMsIDB4MDVENCwgMHgwNURCLCAweDA1REMsIDB4MDVERCwKLSAgICAweDA1RTgsIDB4MDVFQSwgMHgwMDJCLCAweDA2NzEsIDB4MDY3MSwgMHgwNjdCLCAweDA2N0IsIDB4MDY3QiwgMHgwNjdCLCAweDA2N0UsIDB4MDY3RSwgMHgwNjdFLCAweDA2N0UsIDB4MDY4MCwgMHgwNjgwLCAweDA2ODAsCi0gICAgMHgwNjgwLCAweDA2N0EsIDB4MDY3QSwgMHgwNjdBLCAweDA2N0EsIDB4MDY3RiwgMHgwNjdGLCAweDA2N0YsIDB4MDY3RiwgMHgwNjc5LCAweDA2NzksIDB4MDY3OSwgMHgwNjc5LCAweDA2QTQsIDB4MDZBNCwgMHgwNkE0LAotICAgIDB4MDZBNCwgMHgwNkE2LCAweDA2QTYsIDB4MDZBNiwgMHgwNkE2LCAweDA2ODQsIDB4MDY4NCwgMHgwNjg0LCAweDA2ODQsIDB4MDY4MywgMHgwNjgzLCAweDA2ODMsIDB4MDY4MywgMHgwNjg2LCAweDA2ODYsIDB4MDY4NiwKLSAgICAweDA2ODYsIDB4MDY4NywgMHgwNjg3LCAweDA2ODcsIDB4MDY4NywgMHgwNjhELCAweDA2OEQsIDB4MDY4QywgMHgwNjhDLCAweDA2OEUsIDB4MDY4RSwgMHgwNjg4LCAweDA2ODgsIDB4MDY5OCwgMHgwNjk4LCAweDA2OTEsCi0gICAgMHgwNjkxLCAweDA2QTksIDB4MDZBOSwgMHgwNkE5LCAweDA2QTksIDB4MDZBRiwgMHgwNkFGLCAweDA2QUYsIDB4MDZBRiwgMHgwNkIzLCAweDA2QjMsIDB4MDZCMywgMHgwNkIzLCAweDA2QjEsIDB4MDZCMSwgMHgwNkIxLAotICAgIDB4MDZCMSwgMHgwNkJBLCAweDA2QkEsIDB4MDZCQiwgMHgwNkJCLCAweDA2QkIsIDB4MDZCQiwgMHgwNkMwLCAweDA2QzAsIDB4MDZDMSwgMHgwNkMxLCAweDA2QzEsIDB4MDZDMSwgMHgwNkJFLCAweDA2QkUsIDB4MDZCRSwKLSAgICAweDA2QkUsIDB4MDZEMiwgMHgwNkQyLCAweDA2RDMsIDB4MDZEMywgMHgwNkFELCAweDA2QUQsIDB4MDZBRCwgMHgwNkFELCAweDA2QzcsIDB4MDZDNywgMHgwNkM2LCAweDA2QzYsIDB4MDZDOCwgMHgwNkM4LCAweDA2NzcsCi0gICAgMHgwNkNCLCAweDA2Q0IsIDB4MDZDNSwgMHgwNkM1LCAweDA2QzksIDB4MDZDOSwgMHgwNkQwLCAweDA2RDAsIDB4MDZEMCwgMHgwNkQwLCAweDA2NDksIDB4MDY0OSwgMHgwNkNDLCAweDA2Q0MsIDB4MDZDQywgMHgwNkNDLAotICAgIDB4MDAyQywgMHgzMDAxLCAweDMwMDIsIDB4MDAzQSwgMHgwMDNCLCAweDAwMjEsIDB4MDAzRiwgMHgzMDE2LCAweDMwMTcsIDB4MjAyNiwgMHgyMDI1LCAweDIwMTQsIDB4MjAxMywgMHgwMDVGLCAweDAwNUYsIDB4MDAyOCwKLSAgICAweDAwMjksIDB4MDA3QiwgMHgwMDdELCAweDMwMTQsIDB4MzAxNSwgMHgzMDEwLCAweDMwMTEsIDB4MzAwQSwgMHgzMDBCLCAweDMwMDgsIDB4MzAwOSwgMHgzMDBDLCAweDMwMEQsIDB4MzAwRSwgMHgzMDBGLCAweDAwNUIsCi0gICAgMHgwMDVELCAweDIwM0UsIDB4MjAzRSwgMHgyMDNFLCAweDIwM0UsIDB4MDA1RiwgMHgwMDVGLCAweDAwNUYsIDB4MDAyQywgMHgzMDAxLCAweDAwMkUsIDB4MDAzQiwgMHgwMDNBLCAweDAwM0YsIDB4MDAyMSwgMHgyMDE0LAotICAgIDB4MDAyOCwgMHgwMDI5LCAweDAwN0IsIDB4MDA3RCwgMHgzMDE0LCAweDMwMTUsIDB4MDAyMywgMHgwMDI2LCAweDAwMkEsIDB4MDAyQiwgMHgwMDJELCAweDAwM0MsIDB4MDAzRSwgMHgwMDNELCAweDAwNUMsIDB4MDAyNCwKLSAgICAweDAwMjUsIDB4MDA0MCwgMHgwNjRCLCAweDA2NEMsIDB4MDY0RCwgMHgwNjRFLCAweDA2NEYsIDB4MDY1MCwgMHgwNjUxLCAweDA2NTIsIDB4MDYyMSwgMHgwNjIyLCAweDA2MjIsIDB4MDYyMywgMHgwNjIzLCAweDA2MjQsCi0gICAgMHgwNjI0LCAweDA2MjUsIDB4MDYyNSwgMHgwNjI2LCAweDA2MjYsIDB4MDYyNiwgMHgwNjI2LCAweDA2MjcsIDB4MDYyNywgMHgwNjI4LCAweDA2MjgsIDB4MDYyOCwgMHgwNjI4LCAweDA2MjksIDB4MDYyOSwgMHgwNjJBLAotICAgIDB4MDYyQSwgMHgwNjJBLCAweDA2MkEsIDB4MDYyQiwgMHgwNjJCLCAweDA2MkIsIDB4MDYyQiwgMHgwNjJDLCAweDA2MkMsIDB4MDYyQywgMHgwNjJDLCAweDA2MkQsIDB4MDYyRCwgMHgwNjJELCAweDA2MkQsIDB4MDYyRSwKLSAgICAweDA2MkUsIDB4MDYyRSwgMHgwNjJFLCAweDA2MkYsIDB4MDYyRiwgMHgwNjMwLCAweDA2MzAsIDB4MDYzMSwgMHgwNjMxLCAweDA2MzIsIDB4MDYzMiwgMHgwNjMzLCAweDA2MzMsIDB4MDYzMywgMHgwNjMzLCAweDA2MzQsCi0gICAgMHgwNjM0LCAweDA2MzQsIDB4MDYzNCwgMHgwNjM1LCAweDA2MzUsIDB4MDYzNSwgMHgwNjM1LCAweDA2MzYsIDB4MDYzNiwgMHgwNjM2LCAweDA2MzYsIDB4MDYzNywgMHgwNjM3LCAweDA2MzcsIDB4MDYzNywgMHgwNjM4LAotICAgIDB4MDYzOCwgMHgwNjM4LCAweDA2MzgsIDB4MDYzOSwgMHgwNjM5LCAweDA2MzksIDB4MDYzOSwgMHgwNjNBLCAweDA2M0EsIDB4MDYzQSwgMHgwNjNBLCAweDA2NDEsIDB4MDY0MSwgMHgwNjQxLCAweDA2NDEsIDB4MDY0MiwKLSAgICAweDA2NDIsIDB4MDY0MiwgMHgwNjQyLCAweDA2NDMsIDB4MDY0MywgMHgwNjQzLCAweDA2NDMsIDB4MDY0NCwgMHgwNjQ0LCAweDA2NDQsIDB4MDY0NCwgMHgwNjQ1LCAweDA2NDUsIDB4MDY0NSwgMHgwNjQ1LCAweDA2NDYsCi0gICAgMHgwNjQ2LCAweDA2NDYsIDB4MDY0NiwgMHgwNjQ3LCAweDA2NDcsIDB4MDY0NywgMHgwNjQ3LCAweDA2NDgsIDB4MDY0OCwgMHgwNjQ5LCAweDA2NDksIDB4MDY0QSwgMHgwNjRBLCAweDA2NEEsIDB4MDY0QSwgMHgwMDIxLAotICAgIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsIDB4MDAyOCwgMHgwMDI5LCAweDAwMkEsIDB4MDAyQiwgMHgwMDJDLCAweDAwMkQsIDB4MDAyRSwgMHgwMDJGLCAweDAwMzAsIDB4MDAzMSwKLSAgICAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsIDB4MDAzOSwgMHgwMDNBLCAweDAwM0IsIDB4MDAzQywgMHgwMDNELCAweDAwM0UsIDB4MDAzRiwgMHgwMDQwLCAweDAwNDEsCi0gICAgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwgMHgwMDUxLAotICAgIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MDA1QiwgMHgwMDVDLCAweDAwNUQsIDB4MDA1RSwgMHgwMDVGLCAweDAwNjAsIDB4MDA2MSwKLSAgICAweDAwNjIsIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LCAweDAwNjgsIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywgMHgwMDZELCAweDAwNkUsIDB4MDA2RiwgMHgwMDcwLCAweDAwNzEsCi0gICAgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDdCLCAweDAwN0MsIDB4MDA3RCwgMHgwMDdFLCAweDI5ODUsIDB4Mjk4NiwgMHgzMDAyLAotICAgIDB4MzAwQywgMHgzMDBELCAweDMwMDEsIDB4MzBGQiwgMHgzMEYyLCAweDMwQTEsIDB4MzBBMywgMHgzMEE1LCAweDMwQTcsIDB4MzBBOSwgMHgzMEUzLCAweDMwRTUsIDB4MzBFNywgMHgzMEMzLCAweDMwRkMsIDB4MzBBMiwKLSAgICAweDMwQTQsIDB4MzBBNiwgMHgzMEE4LCAweDMwQUEsIDB4MzBBQiwgMHgzMEFELCAweDMwQUYsIDB4MzBCMSwgMHgzMEIzLCAweDMwQjUsIDB4MzBCNywgMHgzMEI5LCAweDMwQkIsIDB4MzBCRCwgMHgzMEJGLCAweDMwQzEsCi0gICAgMHgzMEM0LCAweDMwQzYsIDB4MzBDOCwgMHgzMENBLCAweDMwQ0IsIDB4MzBDQywgMHgzMENELCAweDMwQ0UsIDB4MzBDRiwgMHgzMEQyLCAweDMwRDUsIDB4MzBEOCwgMHgzMERCLCAweDMwREUsIDB4MzBERiwgMHgzMEUwLAotICAgIDB4MzBFMSwgMHgzMEUyLCAweDMwRTQsIDB4MzBFNiwgMHgzMEU4LCAweDMwRTksIDB4MzBFQSwgMHgzMEVCLCAweDMwRUMsIDB4MzBFRCwgMHgzMEVGLCAweDMwRjMsIDB4MzA5OSwgMHgzMDlBLCAweDMxNjQsIDB4MzEzMSwKLSAgICAweDMxMzIsIDB4MzEzMywgMHgzMTM0LCAweDMxMzUsIDB4MzEzNiwgMHgzMTM3LCAweDMxMzgsIDB4MzEzOSwgMHgzMTNBLCAweDMxM0IsIDB4MzEzQywgMHgzMTNELCAweDMxM0UsIDB4MzEzRiwgMHgzMTQwLCAweDMxNDEsCi0gICAgMHgzMTQyLCAweDMxNDMsIDB4MzE0NCwgMHgzMTQ1LCAweDMxNDYsIDB4MzE0NywgMHgzMTQ4LCAweDMxNDksIDB4MzE0QSwgMHgzMTRCLCAweDMxNEMsIDB4MzE0RCwgMHgzMTRFLCAweDMxNEYsIDB4MzE1MCwgMHgzMTUxLAotICAgIDB4MzE1MiwgMHgzMTUzLCAweDMxNTQsIDB4MzE1NSwgMHgzMTU2LCAweDMxNTcsIDB4MzE1OCwgMHgzMTU5LCAweDMxNUEsIDB4MzE1QiwgMHgzMTVDLCAweDMxNUQsIDB4MzE1RSwgMHgzMTVGLCAweDMxNjAsIDB4MzE2MSwKLSAgICAweDMxNjIsIDB4MzE2MywgMHgwMEEyLCAweDAwQTMsIDB4MDBBQywgMHgwMEFGLCAweDAwQTYsIDB4MDBBNSwgMHgyMEE5LCAweDI1MDIsIDB4MjE5MCwgMHgyMTkxLCAweDIxOTIsIDB4MjE5MywgMHgyNUEwLCAweDI1Q0IKLX07Ci1leHRlcm4gY29uc3QgRlhfV0NIQVIgZ19Vbmljb2RlRGF0YV9Ob3JtYWxpemF0aW9uX01hcDJbMTcyNF0gPSB7Ci0gICAgMHgwMDRGLCAweDAwNDUsIDB4MDA1NCwgMHgwMDRELCAweDAwNkYsIDB4MDA2NSwgMHgwMDQ5LCAweDAwNEEsIDB4MDA2OSwgMHgwMDZBLCAweDAwNEYsIDB4MDA0NSwgMHgwMDZGLCAweDAwNjUsIDB4MDA0NCwgMHgwMTdELAotICAgIDB4MDA0NCwgMHgwMTdFLCAweDAwNjQsIDB4MDE3RSwgMHgwMDRDLCAweDAwNEEsIDB4MDA0QywgMHgwMDZBLCAweDAwNkMsIDB4MDA2QSwgMHgwMDRFLCAweDAwNEEsIDB4MDA0RSwgMHgwMDZBLCAweDAwNkUsIDB4MDA2QSwKLSAgICAweDAwNDQsIDB4MDA1QSwgMHgwMDQ0LCAweDAwN0EsIDB4MDA2NCwgMHgwMDdBLCAweDAwNjQsIDB4MDA2MiwgMHgwMDcxLCAweDAwNzAsIDB4MDA0RiwgMHgwMDQ1LCAweDAwNjQsIDB4MDA3QSwgMHgwMDY0LCAweDAyOTIsCi0gICAgMHgwMDY0LCAweDAwN0EsIDB4MDA3NCwgMHgwMDczLCAweDAwNzQsIDB4MDI4MywgMHgwMDc0LCAweDAwNjMsIDB4MDA2NiwgMHgwMTRCLCAweDAwNkMsIDB4MDA3MywgMHgwMDZDLCAweDAwN0EsIDB4MDQxRCwgMHgwNDEzLAotICAgIDB4MDQzRCwgMHgwNDMzLCAweDA0MjIsIDB4MDQyNiwgMHgwNDQyLCAweDA0NDYsIDB4MDQxMCwgMHgwNDE1LCAweDA0MzAsIDB4MDQzNSwgMHgwNTY1LCAweDA1ODIsIDB4MDYyNywgMHgwNjc0LCAweDA2NDgsIDB4MDY3NCwKLSAgICAweDA2QzcsIDB4MDY3NCwgMHgwNjRBLCAweDA2NzQsIDB4MDZENSwgMHgwNjU0LCAweDA2QzEsIDB4MDY1NCwgMHgwNkQyLCAweDA2NTQsIDB4MDkyOCwgMHgwOTNDLCAweDA5MzAsIDB4MDkzQywgMHgwOTMzLCAweDA5M0MsCi0gICAgMHgwOTE1LCAweDA5M0MsIDB4MDkxNiwgMHgwOTNDLCAweDA5MTcsIDB4MDkzQywgMHgwOTFDLCAweDA5M0MsIDB4MDkyMSwgMHgwOTNDLCAweDA5MjIsIDB4MDkzQywgMHgwOTJCLCAweDA5M0MsIDB4MDkyRiwgMHgwOTNDLAotICAgIDB4MDlDNywgMHgwOUJFLCAweDA5QzcsIDB4MDlENywgMHgwOUExLCAweDA5QkMsIDB4MDlBMiwgMHgwOUJDLCAweDA5QUYsIDB4MDlCQywgMHgwQTMyLCAweDBBM0MsIDB4MEEzOCwgMHgwQTNDLCAweDBBMTYsIDB4MEEzQywKLSAgICAweDBBMTcsIDB4MEEzQywgMHgwQTFDLCAweDBBM0MsIDB4MEEyQiwgMHgwQTNDLCAweDBCNDcsIDB4MEI1NiwgMHgwQjQ3LCAweDBCM0UsIDB4MEI0NywgMHgwQjU3LCAweDBCMjEsIDB4MEIzQywgMHgwQjIyLCAweDBCM0MsCi0gICAgMHgwQjkyLCAweDBCRDcsIDB4MEJDNiwgMHgwQkJFLCAweDBCQzcsIDB4MEJCRSwgMHgwQkM2LCAweDBCRDcsIDB4MEM0NiwgMHgwQzU2LCAweDBDQkYsIDB4MENENSwgMHgwQ0M2LCAweDBDRDUsIDB4MENDNiwgMHgwQ0Q2LAotICAgIDB4MENDNiwgMHgwQ0MyLCAweDBDQ0EsIDB4MENENSwgMHgwRDQ2LCAweDBEM0UsIDB4MEQ0NywgMHgwRDNFLCAweDBENDYsIDB4MEQ1NywgMHgwREQ5LCAweDBEQ0EsIDB4MEREOSwgMHgwRENGLCAweDBEREMsIDB4MERDQSwKLSAgICAweDBERDksIDB4MERERiwgMHgwRTRELCAweDBFMzIsIDB4MEVDRCwgMHgwRUIyLCAweDBFQUIsIDB4MEU5OSwgMHgwRUFCLCAweDBFQTEsIDB4MEY0MiwgMHgwRkI3LCAweDBGNEMsIDB4MEZCNywgMHgwRjUxLCAweDBGQjcsCi0gICAgMHgwRjU2LCAweDBGQjcsIDB4MEY1QiwgMHgwRkI3LCAweDBGNDAsIDB4MEZCNSwgMHgwRjcxLCAweDBGNzIsIDB4MEY3MSwgMHgwRjc0LCAweDBGQjIsIDB4MEY4MCwgMHgwRkIyLCAweDBGODEsIDB4MEZCMywgMHgwRjgwLAotICAgIDB4MEZCMywgMHgwRjgxLCAweDBGNzEsIDB4MEY4MCwgMHgwRjkyLCAweDBGQjcsIDB4MEY5QywgMHgwRkI3LCAweDBGQTEsIDB4MEZCNywgMHgwRkE2LCAweDBGQjcsIDB4MEZBQiwgMHgwRkI3LCAweDBGOTAsIDB4MEZCNSwKLSAgICAweDEwMjUsIDB4MTAyRSwgMHgxQjA1LCAweDFCMzUsIDB4MUIwNywgMHgxQjM1LCAweDFCMDksIDB4MUIzNSwgMHgxQjBCLCAweDFCMzUsIDB4MUIwRCwgMHgxQjM1LCAweDFCMTEsIDB4MUIzNSwgMHgxQjNBLCAweDFCMzUsCi0gICAgMHgxQjNDLCAweDFCMzUsIDB4MUIzRSwgMHgxQjM1LCAweDFCM0YsIDB4MUIzNSwgMHgxQjQyLCAweDFCMzUsIDB4MDA3NCwgMHgwMDY4LCAweDAwMkUsIDB4MDAyRSwgMHgyMDMyLCAweDIwMzIsIDB4MjAzNSwgMHgyMDM1LAotICAgIDB4MDAyMSwgMHgwMDIxLCAweDAwMjAsIDB4MDMwNSwgMHgwMDNGLCAweDAwM0YsIDB4MDAzRiwgMHgwMDIxLCAweDAwMjEsIDB4MDAzRiwgMHgwMDUyLCAweDAwNzMsIDB4MDBCMCwgMHgwMDQzLCAweDAwQjAsIDB4MDA0NiwKLSAgICAweDAwNEUsIDB4MDA2RiwgMHgwMDUzLCAweDAwNEQsIDB4MDA1NCwgMHgwMDRELCAweDAwMzEsIDB4MDAyRiwgMHgwMDQ5LCAweDAwNDksIDB4MDA0OSwgMHgwMDU2LCAweDAwNTYsIDB4MDA0OSwgMHgwMDQ5LCAweDAwNTgsCi0gICAgMHgwMDU4LCAweDAwNDksIDB4MDA2OSwgMHgwMDY5LCAweDAwNjksIDB4MDA3NiwgMHgwMDc2LCAweDAwNjksIDB4MDA2OSwgMHgwMDc4LCAweDAwNzgsIDB4MDA2OSwgMHgyMTkwLCAweDAzMzgsIDB4MjE5MiwgMHgwMzM4LAotICAgIDB4MjE5NCwgMHgwMzM4LCAweDIxRDAsIDB4MDMzOCwgMHgyMUQ0LCAweDAzMzgsIDB4MjFEMiwgMHgwMzM4LCAweDIyMjMsIDB4MDMzOCwgMHgyMjI1LCAweDAzMzgsIDB4MjIyQiwgMHgyMjJCLCAweDIyMkUsIDB4MjIyRSwKLSAgICAweDIyM0MsIDB4MDMzOCwgMHgyMjQzLCAweDAzMzgsIDB4MjI0NSwgMHgwMzM4LCAweDIyNDgsIDB4MDMzOCwgMHgwMDNELCAweDAwMkYsIDB4MjI2MSwgMHgwMDJGLCAweDIyNEQsIDB4MDAyRiwgMHgwMDNDLCAweDAwMkYsCi0gICAgMHgwMDNFLCAweDAwMkYsIDB4MjI2NCwgMHgwMDJGLCAweDIyNjUsIDB4MDAyRiwgMHgyMjcyLCAweDAwMkYsIDB4MjI3MywgMHgwMDJGLCAweDIyNzYsIDB4MDAyRiwgMHgyMjc3LCAweDAwMkYsIDB4MjI3QSwgMHgwMDJGLAotICAgIDB4MjI3QiwgMHgwMDJGLCAweDIyODIsIDB4MDAyRiwgMHgyMjgzLCAweDAwMkYsIDB4MjI4NiwgMHgwMDJGLCAweDIyODcsIDB4MDAyRiwgMHgyMkEyLCAweDAwMkYsIDB4MjJBOCwgMHgwMDJGLCAweDIyQTksIDB4MDAyRiwKLSAgICAweDIyQUIsIDB4MDAyRiwgMHgyMjdDLCAweDAwMkYsIDB4MjI3RCwgMHgwMDJGLCAweDIyOTEsIDB4MDAyRiwgMHgyMjkyLCAweDAwMkYsIDB4MjJCMiwgMHgwMDJGLCAweDIyQjMsIDB4MDAyRiwgMHgyMkI0LCAweDAwMkYsCi0gICAgMHgyMkI1LCAweDAwMkYsIDB4MDA0MiwgMHgwMDUzLCAweDAwNDgsIDB4MDA1NCwgMHgwMDRDLCAweDAwNDYsIDB4MDA1NiwgMHgwMDU0LCAweDAwNDYsIDB4MDA0NiwgMHgwMDQzLCAweDAwNTIsIDB4MDA1MywgMHgwMDUzLAotICAgIDB4MDA1MywgMHgwMDQ5LCAweDAwNDUsIDB4MDA0RCwgMHgwMDQ2LCAweDAwNTMsIDB4MDA0NywgMHgwMDUzLCAweDAwNTIsIDB4MDA1MywgMHgwMDU1LCAweDAwNTMsIDB4MDA1MywgMHgwMDUwLCAweDAwMzEsIDB4MDAzMCwKLSAgICAweDAwMzEsIDB4MDAzMSwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMSwgMHgwMDMzLCAweDAwMzEsIDB4MDAzNCwgMHgwMDMxLCAweDAwMzUsIDB4MDAzMSwgMHgwMDM2LCAweDAwMzEsIDB4MDAzNywgMHgwMDMxLCAweDAwMzgsCi0gICAgMHgwMDMxLCAweDAwMzksIDB4MDAzMiwgMHgwMDMwLCAweDAwMzEsIDB4MDAyRSwgMHgwMDMyLCAweDAwMkUsIDB4MDAzMywgMHgwMDJFLCAweDAwMzQsIDB4MDAyRSwgMHgwMDM1LCAweDAwMkUsIDB4MDAzNiwgMHgwMDJFLAotICAgIDB4MDAzNywgMHgwMDJFLCAweDAwMzgsIDB4MDAyRSwgMHgwMDM5LCAweDAwMkUsIDB4MDAzMSwgMHgwMDMxLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMxLCAweDAwMzMsIDB4MDAzMSwgMHgwMDM0LCAweDAwMzEsIDB4MDAzNSwKLSAgICAweDAwMzEsIDB4MDAzNiwgMHgwMDMxLCAweDAwMzcsIDB4MDAzMSwgMHgwMDM4LCAweDAwMzEsIDB4MDAzOSwgMHgwMDMyLCAweDAwMzAsIDB4MDAzMSwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzAsCi0gICAgMHgwMDMxLCAweDAwMzAsIDB4MDAzRCwgMHgwMDNELCAweDJBREQsIDB4MDAyRiwgMHgzMDRCLCAweDMwOTksIDB4MzA0RCwgMHgzMDk5LCAweDMwNEYsIDB4MzA5OSwgMHgzMDUxLCAweDMwOTksIDB4MzA1MywgMHgzMDk5LAotICAgIDB4MzA1NSwgMHgzMDk5LCAweDMwNTcsIDB4MzA5OSwgMHgzMDU5LCAweDMwOTksIDB4MzA1QiwgMHgzMDk5LCAweDMwNUQsIDB4MzA5OSwgMHgzMDVGLCAweDMwOTksIDB4MzA2MSwgMHgzMDk5LCAweDMwNjQsIDB4MzA5OSwKLSAgICAweDMwNjYsIDB4MzA5OSwgMHgzMDY4LCAweDMwOTksIDB4MzA2RiwgMHgzMDk5LCAweDMwNkYsIDB4MzA5QSwgMHgzMDcyLCAweDMwOTksIDB4MzA3MiwgMHgzMDlBLCAweDMwNzUsIDB4MzA5OSwgMHgzMDc1LCAweDMwOUEsCi0gICAgMHgzMDc4LCAweDMwOTksIDB4MzA3OCwgMHgzMDlBLCAweDMwN0IsIDB4MzA5OSwgMHgzMDdCLCAweDMwOUEsIDB4MzA0NiwgMHgzMDk5LCAweDAwMjAsIDB4MzA5OSwgMHgwMDIwLCAweDMwOUEsIDB4MzA5RCwgMHgzMDk5LAotICAgIDB4MzA4OCwgMHgzMDhBLCAweDMwQUIsIDB4MzA5OSwgMHgzMEFELCAweDMwOTksIDB4MzBBRiwgMHgzMDk5LCAweDMwQjEsIDB4MzA5OSwgMHgzMEIzLCAweDMwOTksIDB4MzBCNSwgMHgzMDk5LCAweDMwQjcsIDB4MzA5OSwKLSAgICAweDMwQjksIDB4MzA5OSwgMHgzMEJCLCAweDMwOTksIDB4MzBCRCwgMHgzMDk5LCAweDMwQkYsIDB4MzA5OSwgMHgzMEMxLCAweDMwOTksIDB4MzBDNCwgMHgzMDk5LCAweDMwQzYsIDB4MzA5OSwgMHgzMEM4LCAweDMwOTksCi0gICAgMHgzMENGLCAweDMwOTksIDB4MzBDRiwgMHgzMDlBLCAweDMwRDIsIDB4MzA5OSwgMHgzMEQyLCAweDMwOUEsIDB4MzBENSwgMHgzMDk5LCAweDMwRDUsIDB4MzA5QSwgMHgzMEQ4LCAweDMwOTksIDB4MzBEOCwgMHgzMDlBLAotICAgIDB4MzBEQiwgMHgzMDk5LCAweDMwREIsIDB4MzA5QSwgMHgzMEE2LCAweDMwOTksIDB4MzBFRiwgMHgzMDk5LCAweDMwRjAsIDB4MzA5OSwgMHgzMEYxLCAweDMwOTksIDB4MzBGMiwgMHgzMDk5LCAweDMwRkQsIDB4MzA5OSwKLSAgICAweDMwQjMsIDB4MzBDOCwgMHgwMDMyLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMyLCAweDAwMzIsIDB4MDAzMywgMHgwMDMyLCAweDAwMzQsIDB4MDAzMiwgMHgwMDM1LCAweDAwMzIsIDB4MDAzNiwgMHgwMDMyLCAweDAwMzcsCi0gICAgMHgwMDMyLCAweDAwMzgsIDB4MDAzMiwgMHgwMDM5LCAweDAwMzMsIDB4MDAzMCwgMHgwMDMzLCAweDAwMzEsIDB4MDAzMywgMHgwMDMyLCAweDAwMzMsIDB4MDAzMywgMHgwMDMzLCAweDAwMzQsIDB4MDAzMywgMHgwMDM1LAotICAgIDB4MTEwMCwgMHgxMTYxLCAweDExMDIsIDB4MTE2MSwgMHgxMTAzLCAweDExNjEsIDB4MTEwNSwgMHgxMTYxLCAweDExMDYsIDB4MTE2MSwgMHgxMTA3LCAweDExNjEsIDB4MTEwOSwgMHgxMTYxLCAweDExMEIsIDB4MTE2MSwKLSAgICAweDExMEMsIDB4MTE2MSwgMHgxMTBFLCAweDExNjEsIDB4MTEwRiwgMHgxMTYxLCAweDExMTAsIDB4MTE2MSwgMHgxMTExLCAweDExNjEsIDB4MTExMiwgMHgxMTYxLCAweDExMEIsIDB4MTE2RSwgMHgwMDMzLCAweDAwMzYsCi0gICAgMHgwMDMzLCAweDAwMzcsIDB4MDAzMywgMHgwMDM4LCAweDAwMzMsIDB4MDAzOSwgMHgwMDM0LCAweDAwMzAsIDB4MDAzNCwgMHgwMDMxLCAweDAwMzQsIDB4MDAzMiwgMHgwMDM0LCAweDAwMzMsIDB4MDAzNCwgMHgwMDM0LAotICAgIDB4MDAzNCwgMHgwMDM1LCAweDAwMzQsIDB4MDAzNiwgMHgwMDM0LCAweDAwMzcsIDB4MDAzNCwgMHgwMDM4LCAweDAwMzQsIDB4MDAzOSwgMHgwMDM1LCAweDAwMzAsIDB4MDAzMSwgMHg2NzA4LCAweDAwMzIsIDB4NjcwOCwKLSAgICAweDAwMzMsIDB4NjcwOCwgMHgwMDM0LCAweDY3MDgsIDB4MDAzNSwgMHg2NzA4LCAweDAwMzYsIDB4NjcwOCwgMHgwMDM3LCAweDY3MDgsIDB4MDAzOCwgMHg2NzA4LCAweDAwMzksIDB4NjcwOCwgMHgwMDQ4LCAweDAwNjcsCi0gICAgMHgwMDY1LCAweDAwNTYsIDB4MzBBRSwgMHgzMEFDLCAweDMwQUQsIDB4MzBFRCwgMHgzMEM3LCAweDMwQjcsIDB4MzBDOSwgMHgzMEVCLCAweDMwQzgsIDB4MzBGMywgMHgzMENBLCAweDMwQ0UsIDB4MzBENCwgMHgzMEIzLAotICAgIDB4MzBEMywgMHgzMEVCLCAweDMwREEsIDB4MzBCRCwgMHgzMERCLCAweDMwRjMsIDB4MzBERiwgMHgzMEVBLCAweDMwRTEsIDB4MzBBQywgMHgzMEVBLCAweDMwRTksIDB4MzBFQywgMHgzMEUwLCAweDAwMzAsIDB4NzBCOSwKLSAgICAweDAwMzEsIDB4NzBCOSwgMHgwMDMyLCAweDcwQjksIDB4MDAzMywgMHg3MEI5LCAweDAwMzQsIDB4NzBCOSwgMHgwMDM1LCAweDcwQjksIDB4MDAzNiwgMHg3MEI5LCAweDAwMzcsIDB4NzBCOSwgMHgwMDM4LCAweDcwQjksCi0gICAgMHgwMDM5LCAweDcwQjksIDB4MDA2NCwgMHgwMDYxLCAweDAwNDEsIDB4MDA1NSwgMHgwMDZGLCAweDAwNTYsIDB4MDA3MCwgMHgwMDYzLCAweDAwNjQsIDB4MDA2RCwgMHgwMDQ5LCAweDAwNTUsIDB4NUU3MywgMHg2MjEwLAotICAgIDB4NjYyRCwgMHg1NDhDLCAweDU5MjcsIDB4NkI2MywgMHg2NjBFLCAweDZDQkIsIDB4MDA3MCwgMHgwMDQxLCAweDAwNkUsIDB4MDA0MSwgMHgwM0JDLCAweDAwNDEsIDB4MDA2RCwgMHgwMDQxLCAweDAwNkIsIDB4MDA0MSwKLSAgICAweDAwNEIsIDB4MDA0MiwgMHgwMDRELCAweDAwNDIsIDB4MDA0NywgMHgwMDQyLCAweDAwNzAsIDB4MDA0NiwgMHgwMDZFLCAweDAwNDYsIDB4MDNCQywgMHgwMDQ2LCAweDAzQkMsIDB4MDA2NywgMHgwMDZELCAweDAwNjcsCi0gICAgMHgwMDZCLCAweDAwNjcsIDB4MDA0OCwgMHgwMDdBLCAweDAzQkMsIDB4MjExMywgMHgwMDZELCAweDIxMTMsIDB4MDA2NCwgMHgyMTEzLCAweDAwNkIsIDB4MjExMywgMHgwMDY2LCAweDAwNkQsIDB4MDA2RSwgMHgwMDZELAotICAgIDB4MDNCQywgMHgwMDZELCAweDAwNkQsIDB4MDA2RCwgMHgwMDYzLCAweDAwNkQsIDB4MDA2QiwgMHgwMDZELCAweDAwNkQsIDB4MDBCMiwgMHgwMDZELCAweDAwQjMsIDB4MDA1MCwgMHgwMDYxLCAweDAwNzAsIDB4MDA3MywKLSAgICAweDAwNkUsIDB4MDA3MywgMHgwM0JDLCAweDAwNzMsIDB4MDA2RCwgMHgwMDczLCAweDAwNzAsIDB4MDA1NiwgMHgwMDZFLCAweDAwNTYsIDB4MDNCQywgMHgwMDU2LCAweDAwNkQsIDB4MDA1NiwgMHgwMDZCLCAweDAwNTYsCi0gICAgMHgwMDRELCAweDAwNTYsIDB4MDA3MCwgMHgwMDU3LCAweDAwNkUsIDB4MDA1NywgMHgwM0JDLCAweDAwNTcsIDB4MDA2RCwgMHgwMDU3LCAweDAwNkIsIDB4MDA1NywgMHgwMDRELCAweDAwNTcsIDB4MDA2QiwgMHgwM0E5LAotICAgIDB4MDA0RCwgMHgwM0E5LCAweDAwNDIsIDB4MDA3MSwgMHgwMDYzLCAweDAwNjMsIDB4MDA2MywgMHgwMDY0LCAweDAwNjQsIDB4MDA0MiwgMHgwMDQ3LCAweDAwNzksIDB4MDA2OCwgMHgwMDYxLCAweDAwNDgsIDB4MDA1MCwKLSAgICAweDAwNjksIDB4MDA2RSwgMHgwMDRCLCAweDAwNEIsIDB4MDA0QiwgMHgwMDRELCAweDAwNkIsIDB4MDA3NCwgMHgwMDZDLCAweDAwNkQsIDB4MDA2QywgMHgwMDZFLCAweDAwNkMsIDB4MDA3OCwgMHgwMDZELCAweDAwNjIsCi0gICAgMHgwMDUwLCAweDAwNDgsIDB4MDA1MCwgMHgwMDUyLCAweDAwNzMsIDB4MDA3MiwgMHgwMDUzLCAweDAwNzYsIDB4MDA1NywgMHgwMDYyLCAweDAwMzEsIDB4NjVFNSwgMHgwMDMyLCAweDY1RTUsIDB4MDAzMywgMHg2NUU1LAotICAgIDB4MDAzNCwgMHg2NUU1LCAweDAwMzUsIDB4NjVFNSwgMHgwMDM2LCAweDY1RTUsIDB4MDAzNywgMHg2NUU1LCAweDAwMzgsIDB4NjVFNSwgMHgwMDM5LCAweDY1RTUsIDB4MDA2NiwgMHgwMDY2LCAweDAwNjYsIDB4MDA2OSwKLSAgICAweDAwNjYsIDB4MDA2QywgMHgwMTdGLCAweDAwNzQsIDB4MDA3MywgMHgwMDc0LCAweDA1NzQsIDB4MDU3NiwgMHgwNTc0LCAweDA1NjUsIDB4MDU3NCwgMHgwNTZCLCAweDA1N0UsIDB4MDU3NiwgMHgwNTc0LCAweDA1NkQsCi0gICAgMHgwNUQ5LCAweDA1QjQsIDB4MDVGMiwgMHgwNUI3LCAweDA1RTksIDB4MDVDMSwgMHgwNUU5LCAweDA1QzIsIDB4RkI0OSwgMHgwNUMxLCAweEZCNDksIDB4MDVDMiwgMHgwNUQwLCAweDA1QjcsIDB4MDVEMCwgMHgwNUI4LAotICAgIDB4MDVEMCwgMHgwNUJDLCAweDA1RDEsIDB4MDVCQywgMHgwNUQyLCAweDA1QkMsIDB4MDVEMywgMHgwNUJDLCAweDA1RDQsIDB4MDVCQywgMHgwNUQ1LCAweDA1QkMsIDB4MDVENiwgMHgwNUJDLCAweDA1RDgsIDB4MDVCQywKLSAgICAweDA1RDksIDB4MDVCQywgMHgwNURBLCAweDA1QkMsIDB4MDVEQiwgMHgwNUJDLCAweDA1REMsIDB4MDVCQywgMHgwNURFLCAweDA1QkMsIDB4MDVFMCwgMHgwNUJDLCAweDA1RTEsIDB4MDVCQywgMHgwNUUzLCAweDA1QkMsCi0gICAgMHgwNUU0LCAweDA1QkMsIDB4MDVFNiwgMHgwNUJDLCAweDA1RTcsIDB4MDVCQywgMHgwNUU4LCAweDA1QkMsIDB4MDVFOSwgMHgwNUJDLCAweDA1RUEsIDB4MDVCQywgMHgwNUQ1LCAweDA1QjksIDB4MDVEMSwgMHgwNUJGLAotICAgIDB4MDVEQiwgMHgwNUJGLCAweDA1RTQsIDB4MDVCRiwgMHgwNUQwLCAweDA1REMsIDB4MDYyNiwgMHgwNjI3LCAweDA2MjYsIDB4MDYyNywgMHgwNjI2LCAweDA2RDUsIDB4MDYyNiwgMHgwNkQ1LCAweDA2MjYsIDB4MDY0OCwKLSAgICAweDA2MjYsIDB4MDY0OCwgMHgwNjI2LCAweDA2QzcsIDB4MDYyNiwgMHgwNkM3LCAweDA2MjYsIDB4MDZDNiwgMHgwNjI2LCAweDA2QzYsIDB4MDYyNiwgMHgwNkM4LCAweDA2MjYsIDB4MDZDOCwgMHgwNjI2LCAweDA2RDAsCi0gICAgMHgwNjI2LCAweDA2RDAsIDB4MDYyNiwgMHgwNkQwLCAweDA2MjYsIDB4MDY0OSwgMHgwNjI2LCAweDA2NDksIDB4MDYyNiwgMHgwNjQ5LCAweDA2MjYsIDB4MDYyQywgMHgwNjI2LCAweDA2MkQsIDB4MDYyNiwgMHgwNjQ1LAotICAgIDB4MDYyNiwgMHgwNjQ5LCAweDA2MjYsIDB4MDY0QSwgMHgwNjI4LCAweDA2MkMsIDB4MDYyOCwgMHgwNjJELCAweDA2MjgsIDB4MDYyRSwgMHgwNjI4LCAweDA2NDUsIDB4MDYyOCwgMHgwNjQ5LCAweDA2MjgsIDB4MDY0QSwKLSAgICAweDA2MkEsIDB4MDYyQywgMHgwNjJBLCAweDA2MkQsIDB4MDYyQSwgMHgwNjJFLCAweDA2MkEsIDB4MDY0NSwgMHgwNjJBLCAweDA2NDksIDB4MDYyQSwgMHgwNjRBLCAweDA2MkIsIDB4MDYyQywgMHgwNjJCLCAweDA2NDUsCi0gICAgMHgwNjJCLCAweDA2NDksIDB4MDYyQiwgMHgwNjRBLCAweDA2MkMsIDB4MDYyRCwgMHgwNjJDLCAweDA2NDUsIDB4MDYyRCwgMHgwNjJDLCAweDA2MkQsIDB4MDY0NSwgMHgwNjJFLCAweDA2MkMsIDB4MDYyRSwgMHgwNjJELAotICAgIDB4MDYyRSwgMHgwNjQ1LCAweDA2MzMsIDB4MDYyQywgMHgwNjMzLCAweDA2MkQsIDB4MDYzMywgMHgwNjJFLCAweDA2MzMsIDB4MDY0NSwgMHgwNjM1LCAweDA2MkQsIDB4MDYzNSwgMHgwNjQ1LCAweDA2MzYsIDB4MDYyQywKLSAgICAweDA2MzYsIDB4MDYyRCwgMHgwNjM2LCAweDA2MkUsIDB4MDYzNiwgMHgwNjQ1LCAweDA2MzcsIDB4MDYyRCwgMHgwNjM3LCAweDA2NDUsIDB4MDYzOCwgMHgwNjQ1LCAweDA2MzksIDB4MDYyQywgMHgwNjM5LCAweDA2NDUsCi0gICAgMHgwNjNBLCAweDA2MkMsIDB4MDYzQSwgMHgwNjQ1LCAweDA2NDEsIDB4MDYyQywgMHgwNjQxLCAweDA2MkQsIDB4MDY0MSwgMHgwNjJFLCAweDA2NDEsIDB4MDY0NSwgMHgwNjQxLCAweDA2NDksIDB4MDY0MSwgMHgwNjRBLAotICAgIDB4MDY0MiwgMHgwNjJELCAweDA2NDIsIDB4MDY0NSwgMHgwNjQyLCAweDA2NDksIDB4MDY0MiwgMHgwNjRBLCAweDA2NDMsIDB4MDYyNywgMHgwNjQzLCAweDA2MkMsIDB4MDY0MywgMHgwNjJELCAweDA2NDMsIDB4MDYyRSwKLSAgICAweDA2NDMsIDB4MDY0NCwgMHgwNjQzLCAweDA2NDUsIDB4MDY0MywgMHgwNjQ5LCAweDA2NDMsIDB4MDY0QSwgMHgwNjQ0LCAweDA2MkMsIDB4MDY0NCwgMHgwNjJELCAweDA2NDQsIDB4MDYyRSwgMHgwNjQ0LCAweDA2NDUsCi0gICAgMHgwNjQ0LCAweDA2NDksIDB4MDY0NCwgMHgwNjRBLCAweDA2NDUsIDB4MDYyQywgMHgwNjQ1LCAweDA2MkQsIDB4MDY0NSwgMHgwNjJFLCAweDA2NDUsIDB4MDY0NSwgMHgwNjQ1LCAweDA2NDksIDB4MDY0NSwgMHgwNjRBLAotICAgIDB4MDY0NiwgMHgwNjJDLCAweDA2NDYsIDB4MDYyRCwgMHgwNjQ2LCAweDA2MkUsIDB4MDY0NiwgMHgwNjQ1LCAweDA2NDYsIDB4MDY0OSwgMHgwNjQ2LCAweDA2NEEsIDB4MDY0NywgMHgwNjJDLCAweDA2NDcsIDB4MDY0NSwKLSAgICAweDA2NDcsIDB4MDY0OSwgMHgwNjQ3LCAweDA2NEEsIDB4MDY0QSwgMHgwNjJDLCAweDA2NEEsIDB4MDYyRCwgMHgwNjRBLCAweDA2MkUsIDB4MDY0QSwgMHgwNjQ1LCAweDA2NEEsIDB4MDY0OSwgMHgwNjRBLCAweDA2NEEsCi0gICAgMHgwNjMwLCAweDA2NzAsIDB4MDYzMSwgMHgwNjcwLCAweDA2NDksIDB4MDY3MCwgMHgwNjRDLCAweDA2NTEsIDB4MDY0RCwgMHgwNjUxLCAweDA2NEUsIDB4MDY1MSwgMHgwNjRGLCAweDA2NTEsIDB4MDY1MCwgMHgwNjUxLAotICAgIDB4MDY1MSwgMHgwNjcwLCAweDA2MjYsIDB4MDYzMSwgMHgwNjI2LCAweDA2MzIsIDB4MDYyNiwgMHgwNjQ1LCAweDA2MjYsIDB4MDY0NiwgMHgwNjI2LCAweDA2NDksIDB4MDYyNiwgMHgwNjRBLCAweDA2MjgsIDB4MDYzMSwKLSAgICAweDA2MjgsIDB4MDYzMiwgMHgwNjI4LCAweDA2NDUsIDB4MDYyOCwgMHgwNjQ2LCAweDA2MjgsIDB4MDY0OSwgMHgwNjI4LCAweDA2NEEsIDB4MDYyQSwgMHgwNjMxLCAweDA2MkEsIDB4MDYzMiwgMHgwNjJBLCAweDA2NDUsCi0gICAgMHgwNjJBLCAweDA2NDYsIDB4MDYyQSwgMHgwNjQ5LCAweDA2MkEsIDB4MDY0QSwgMHgwNjJCLCAweDA2MzEsIDB4MDYyQiwgMHgwNjMyLCAweDA2MkIsIDB4MDY0NSwgMHgwNjJCLCAweDA2NDYsIDB4MDYyQiwgMHgwNjQ5LAotICAgIDB4MDYyQiwgMHgwNjRBLCAweDA2NDEsIDB4MDY0OSwgMHgwNjQxLCAweDA2NEEsIDB4MDY0MiwgMHgwNjQ5LCAweDA2NDIsIDB4MDY0QSwgMHgwNjQzLCAweDA2MjcsIDB4MDY0MywgMHgwNjQ0LCAweDA2NDMsIDB4MDY0NSwKLSAgICAweDA2NDMsIDB4MDY0OSwgMHgwNjQzLCAweDA2NEEsIDB4MDY0NCwgMHgwNjQ1LCAweDA2NDQsIDB4MDY0OSwgMHgwNjQ0LCAweDA2NEEsIDB4MDY0NSwgMHgwNjI3LCAweDA2NDUsIDB4MDY0NSwgMHgwNjQ2LCAweDA2MzEsCi0gICAgMHgwNjQ2LCAweDA2MzIsIDB4MDY0NiwgMHgwNjQ1LCAweDA2NDYsIDB4MDY0NiwgMHgwNjQ2LCAweDA2NDksIDB4MDY0NiwgMHgwNjRBLCAweDA2NDksIDB4MDY3MCwgMHgwNjRBLCAweDA2MzEsIDB4MDY0QSwgMHgwNjMyLAotICAgIDB4MDY0QSwgMHgwNjQ1LCAweDA2NEEsIDB4MDY0NiwgMHgwNjRBLCAweDA2NDksIDB4MDY0QSwgMHgwNjRBLCAweDA2MjYsIDB4MDYyQywgMHgwNjI2LCAweDA2MkQsIDB4MDYyNiwgMHgwNjJFLCAweDA2MjYsIDB4MDY0NSwKLSAgICAweDA2MjYsIDB4MDY0NywgMHgwNjI4LCAweDA2MkMsIDB4MDYyOCwgMHgwNjJELCAweDA2MjgsIDB4MDYyRSwgMHgwNjI4LCAweDA2NDUsIDB4MDYyOCwgMHgwNjQ3LCAweDA2MkEsIDB4MDYyQywgMHgwNjJBLCAweDA2MkQsCi0gICAgMHgwNjJBLCAweDA2MkUsIDB4MDYyQSwgMHgwNjQ1LCAweDA2MkEsIDB4MDY0NywgMHgwNjJCLCAweDA2NDUsIDB4MDYyQywgMHgwNjJELCAweDA2MkMsIDB4MDY0NSwgMHgwNjJELCAweDA2MkMsIDB4MDYyRCwgMHgwNjQ1LAotICAgIDB4MDYyRSwgMHgwNjJDLCAweDA2MkUsIDB4MDY0NSwgMHgwNjMzLCAweDA2MkMsIDB4MDYzMywgMHgwNjJELCAweDA2MzMsIDB4MDYyRSwgMHgwNjMzLCAweDA2NDUsIDB4MDYzNSwgMHgwNjJELCAweDA2MzUsIDB4MDYyRSwKLSAgICAweDA2MzUsIDB4MDY0NSwgMHgwNjM2LCAweDA2MkMsIDB4MDYzNiwgMHgwNjJELCAweDA2MzYsIDB4MDYyRSwgMHgwNjM2LCAweDA2NDUsIDB4MDYzNywgMHgwNjJELCAweDA2MzgsIDB4MDY0NSwgMHgwNjM5LCAweDA2MkMsCi0gICAgMHgwNjM5LCAweDA2NDUsIDB4MDYzQSwgMHgwNjJDLCAweDA2M0EsIDB4MDY0NSwgMHgwNjQxLCAweDA2MkMsIDB4MDY0MSwgMHgwNjJELCAweDA2NDEsIDB4MDYyRSwgMHgwNjQxLCAweDA2NDUsIDB4MDY0MiwgMHgwNjJELAotICAgIDB4MDY0MiwgMHgwNjQ1LCAweDA2NDMsIDB4MDYyQywgMHgwNjQzLCAweDA2MkQsIDB4MDY0MywgMHgwNjJFLCAweDA2NDMsIDB4MDY0NCwgMHgwNjQzLCAweDA2NDUsIDB4MDY0NCwgMHgwNjJDLCAweDA2NDQsIDB4MDYyRCwKLSAgICAweDA2NDQsIDB4MDYyRSwgMHgwNjQ0LCAweDA2NDUsIDB4MDY0NCwgMHgwNjQ3LCAweDA2NDUsIDB4MDYyQywgMHgwNjQ1LCAweDA2MkQsIDB4MDY0NSwgMHgwNjJFLCAweDA2NDUsIDB4MDY0NSwgMHgwNjQ2LCAweDA2MkMsCi0gICAgMHgwNjQ2LCAweDA2MkQsIDB4MDY0NiwgMHgwNjJFLCAweDA2NDYsIDB4MDY0NSwgMHgwNjQ2LCAweDA2NDcsIDB4MDY0NywgMHgwNjJDLCAweDA2NDcsIDB4MDY0NSwgMHgwNjQ3LCAweDA2NzAsIDB4MDY0QSwgMHgwNjJDLAotICAgIDB4MDY0QSwgMHgwNjJELCAweDA2NEEsIDB4MDYyRSwgMHgwNjRBLCAweDA2NDUsIDB4MDY0QSwgMHgwNjQ3LCAweDA2MjYsIDB4MDY0NSwgMHgwNjI2LCAweDA2NDcsIDB4MDYyOCwgMHgwNjQ1LCAweDA2MjgsIDB4MDY0NywKLSAgICAweDA2MkEsIDB4MDY0NSwgMHgwNjJBLCAweDA2NDcsIDB4MDYyQiwgMHgwNjQ1LCAweDA2MkIsIDB4MDY0NywgMHgwNjMzLCAweDA2NDUsIDB4MDYzMywgMHgwNjQ3LCAweDA2MzQsIDB4MDY0NSwgMHgwNjM0LCAweDA2NDcsCi0gICAgMHgwNjQzLCAweDA2NDQsIDB4MDY0MywgMHgwNjQ1LCAweDA2NDQsIDB4MDY0NSwgMHgwNjQ2LCAweDA2NDUsIDB4MDY0NiwgMHgwNjQ3LCAweDA2NEEsIDB4MDY0NSwgMHgwNjRBLCAweDA2NDcsIDB4MDYzNywgMHgwNjQ5LAotICAgIDB4MDYzNywgMHgwNjRBLCAweDA2MzksIDB4MDY0OSwgMHgwNjM5LCAweDA2NEEsIDB4MDYzQSwgMHgwNjQ5LCAweDA2M0EsIDB4MDY0QSwgMHgwNjMzLCAweDA2NDksIDB4MDYzMywgMHgwNjRBLCAweDA2MzQsIDB4MDY0OSwKLSAgICAweDA2MzQsIDB4MDY0QSwgMHgwNjJELCAweDA2NDksIDB4MDYyRCwgMHgwNjRBLCAweDA2MkMsIDB4MDY0OSwgMHgwNjJDLCAweDA2NEEsIDB4MDYyRSwgMHgwNjQ5LCAweDA2MkUsIDB4MDY0QSwgMHgwNjM1LCAweDA2NDksCi0gICAgMHgwNjM1LCAweDA2NEEsIDB4MDYzNiwgMHgwNjQ5LCAweDA2MzYsIDB4MDY0QSwgMHgwNjM0LCAweDA2MkMsIDB4MDYzNCwgMHgwNjJELCAweDA2MzQsIDB4MDYyRSwgMHgwNjM0LCAweDA2NDUsIDB4MDYzNCwgMHgwNjMxLAotICAgIDB4MDYzMywgMHgwNjMxLCAweDA2MzUsIDB4MDYzMSwgMHgwNjM2LCAweDA2MzEsIDB4MDYzNywgMHgwNjQ5LCAweDA2MzcsIDB4MDY0QSwgMHgwNjM5LCAweDA2NDksIDB4MDYzOSwgMHgwNjRBLCAweDA2M0EsIDB4MDY0OSwKLSAgICAweDA2M0EsIDB4MDY0QSwgMHgwNjMzLCAweDA2NDksIDB4MDYzMywgMHgwNjRBLCAweDA2MzQsIDB4MDY0OSwgMHgwNjM0LCAweDA2NEEsIDB4MDYyRCwgMHgwNjQ5LCAweDA2MkQsIDB4MDY0QSwgMHgwNjJDLCAweDA2NDksCi0gICAgMHgwNjJDLCAweDA2NEEsIDB4MDYyRSwgMHgwNjQ5LCAweDA2MkUsIDB4MDY0QSwgMHgwNjM1LCAweDA2NDksIDB4MDYzNSwgMHgwNjRBLCAweDA2MzYsIDB4MDY0OSwgMHgwNjM2LCAweDA2NEEsIDB4MDYzNCwgMHgwNjJDLAotICAgIDB4MDYzNCwgMHgwNjJELCAweDA2MzQsIDB4MDYyRSwgMHgwNjM0LCAweDA2NDUsIDB4MDYzNCwgMHgwNjMxLCAweDA2MzMsIDB4MDYzMSwgMHgwNjM1LCAweDA2MzEsIDB4MDYzNiwgMHgwNjMxLCAweDA2MzQsIDB4MDYyQywKLSAgICAweDA2MzQsIDB4MDYyRCwgMHgwNjM0LCAweDA2MkUsIDB4MDYzNCwgMHgwNjQ1LCAweDA2MzMsIDB4MDY0NywgMHgwNjM0LCAweDA2NDcsIDB4MDYzNywgMHgwNjQ1LCAweDA2MzMsIDB4MDYyQywgMHgwNjMzLCAweDA2MkQsCi0gICAgMHgwNjMzLCAweDA2MkUsIDB4MDYzNCwgMHgwNjJDLCAweDA2MzQsIDB4MDYyRCwgMHgwNjM0LCAweDA2MkUsIDB4MDYzNywgMHgwNjQ1LCAweDA2MzgsIDB4MDY0NSwgMHgwNjI3LCAweDA2NEIsIDB4MDYyNywgMHgwNjRCLAotICAgIDB4MDY0MCwgMHgwNjRCLCAweDA2NDAsIDB4MDY0RSwgMHgwNjQwLCAweDA2NEYsIDB4MDY0MCwgMHgwNjUwLCAweDA2NDAsIDB4MDY1MSwgMHgwNjQwLCAweDA2NTIsIDB4MDY0NCwgMHgwNjIyLCAweDA2NDQsIDB4MDYyMiwKLSAgICAweDA2NDQsIDB4MDYyMywgMHgwNjQ0LCAweDA2MjMsIDB4MDY0NCwgMHgwNjI1LCAweDA2NDQsIDB4MDYyNSwgMHgwNjQ0LCAweDA2MjcsIDB4MDY0NCwgMHgwNjI3Ci19OwotZXh0ZXJuIGNvbnN0IEZYX1dDSEFSIGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvbl9NYXAzWzExNjRdID0gewotICAgIDB4MDAzMSwgMHgwMDJGLCAweDAwMzQsIDB4MDAzMSwgMHgwMDJGLCAweDAwMzIsIDB4MDAzMywgMHgwMDJGLCAweDAwMzQsIDB4MDAyRSwgMHgwMDJFLCAweDAwMkUsIDB4MjAzMiwgMHgyMDMyLCAweDIwMzIsIDB4MjAzNSwKLSAgICAweDIwMzUsIDB4MjAzNSwgMHgwMDYxLCAweDAwMkYsIDB4MDA2MywgMHgwMDYxLCAweDAwMkYsIDB4MDA3MywgMHgwMDYzLCAweDAwMkYsIDB4MDA2RiwgMHgwMDYzLCAweDAwMkYsIDB4MDA3NSwgMHgwMDU0LCAweDAwNDUsCi0gICAgMHgwMDRDLCAweDAwNDYsIDB4MDA0MSwgMHgwMDU4LCAweDAwMzEsIDB4MDAyRiwgMHgwMDM3LCAweDAwMzEsIDB4MDAyRiwgMHgwMDM5LCAweDAwMzEsIDB4MDAyRiwgMHgwMDMzLCAweDAwMzIsIDB4MDAyRiwgMHgwMDMzLAotICAgIDB4MDAzMSwgMHgwMDJGLCAweDAwMzUsIDB4MDAzMiwgMHgwMDJGLCAweDAwMzUsIDB4MDAzMywgMHgwMDJGLCAweDAwMzUsIDB4MDAzNCwgMHgwMDJGLCAweDAwMzUsIDB4MDAzMSwgMHgwMDJGLCAweDAwMzYsIDB4MDAzNSwKLSAgICAweDAwMkYsIDB4MDAzNiwgMHgwMDMxLCAweDAwMkYsIDB4MDAzOCwgMHgwMDMzLCAweDAwMkYsIDB4MDAzOCwgMHgwMDM1LCAweDAwMkYsIDB4MDAzOCwgMHgwMDM3LCAweDAwMkYsIDB4MDAzOCwgMHgwMDQ5LCAweDAwNDksCi0gICAgMHgwMDQ5LCAweDAwNTYsIDB4MDA0OSwgMHgwMDQ5LCAweDAwNTgsIDB4MDA0OSwgMHgwMDQ5LCAweDAwNjksIDB4MDA2OSwgMHgwMDY5LCAweDAwNzYsIDB4MDA2OSwgMHgwMDY5LCAweDAwNzgsIDB4MDA2OSwgMHgwMDY5LAotICAgIDB4MDAzMCwgMHgyMDQ0LCAweDAwMzMsIDB4MjIyQiwgMHgyMjJCLCAweDIyMkIsIDB4MjIyRSwgMHgyMjJFLCAweDIyMkUsIDB4MDA0RSwgMHgwMDU1LCAweDAwNEMsIDB4MDA1MywgMHgwMDRGLCAweDAwNDgsIDB4MDA1MywKLSAgICAweDAwNTQsIDB4MDA1OCwgMHgwMDQ1LCAweDAwNTQsIDB4MDA1OCwgMHgwMDQ1LCAweDAwNEYsIDB4MDA1NCwgMHgwMDQ1LCAweDAwNEUsIDB4MDA1MSwgMHgwMDQxLCAweDAwNDMsIDB4MDA0QiwgMHgwMDQyLCAweDAwNDUsCi0gICAgMHgwMDRDLCAweDAwNDQsIDB4MDA0QywgMHgwMDQ1LCAweDAwNDQsIDB4MDA0MywgMHgwMDMxLCAweDAwNDQsIDB4MDA0MywgMHgwMDMyLCAweDAwNDQsIDB4MDA0MywgMHgwMDMzLCAweDAwNDQsIDB4MDA0MywgMHgwMDM0LAotICAgIDB4MDA0RSwgMHgwMDQxLCAweDAwNEIsIDB4MDA1MywgMHgwMDU5LCAweDAwNEUsIDB4MDA0NSwgMHgwMDU0LCAweDAwNDIsIDB4MDA0MywgMHgwMDQxLCAweDAwNEUsIDB4MDA1MywgMHgwMDU1LCAweDAwNDIsIDB4MDA0NSwKLSAgICAweDAwNTMsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0QywgMHgwMDI4LCAweDAwMzEsIDB4MDAyOSwgMHgwMDI4LCAweDAwMzIsIDB4MDAyOSwgMHgwMDI4LCAweDAwMzMsIDB4MDAyOSwgMHgwMDI4LCAweDAwMzQsCi0gICAgMHgwMDI5LCAweDAwMjgsIDB4MDAzNSwgMHgwMDI5LCAweDAwMjgsIDB4MDAzNiwgMHgwMDI5LCAweDAwMjgsIDB4MDAzNywgMHgwMDI5LCAweDAwMjgsIDB4MDAzOCwgMHgwMDI5LCAweDAwMjgsIDB4MDAzOSwgMHgwMDI5LAotICAgIDB4MDAzMSwgMHgwMDMwLCAweDAwMkUsIDB4MDAzMSwgMHgwMDMxLCAweDAwMkUsIDB4MDAzMSwgMHgwMDMyLCAweDAwMkUsIDB4MDAzMSwgMHgwMDMzLCAweDAwMkUsIDB4MDAzMSwgMHgwMDM0LCAweDAwMkUsIDB4MDAzMSwKLSAgICAweDAwMzUsIDB4MDAyRSwgMHgwMDMxLCAweDAwMzYsIDB4MDAyRSwgMHgwMDMxLCAweDAwMzcsIDB4MDAyRSwgMHgwMDMxLCAweDAwMzgsIDB4MDAyRSwgMHgwMDMxLCAweDAwMzksIDB4MDAyRSwgMHgwMDMyLCAweDAwMzAsCi0gICAgMHgwMDJFLCAweDAwMjgsIDB4MDA2MSwgMHgwMDI5LCAweDAwMjgsIDB4MDA2MiwgMHgwMDI5LCAweDAwMjgsIDB4MDA2MywgMHgwMDI5LCAweDAwMjgsIDB4MDA2NCwgMHgwMDI5LCAweDAwMjgsIDB4MDA2NSwgMHgwMDI5LAotICAgIDB4MDAyOCwgMHgwMDY2LCAweDAwMjksIDB4MDAyOCwgMHgwMDY3LCAweDAwMjksIDB4MDAyOCwgMHgwMDY4LCAweDAwMjksIDB4MDAyOCwgMHgwMDY5LCAweDAwMjksIDB4MDAyOCwgMHgwMDZBLCAweDAwMjksIDB4MDAyOCwKLSAgICAweDAwNkIsIDB4MDAyOSwgMHgwMDI4LCAweDAwNkMsIDB4MDAyOSwgMHgwMDI4LCAweDAwNkQsIDB4MDAyOSwgMHgwMDI4LCAweDAwNkUsIDB4MDAyOSwgMHgwMDI4LCAweDAwNkYsIDB4MDAyOSwgMHgwMDI4LCAweDAwNzAsCi0gICAgMHgwMDI5LCAweDAwMjgsIDB4MDA3MSwgMHgwMDI5LCAweDAwMjgsIDB4MDA3MiwgMHgwMDI5LCAweDAwMjgsIDB4MDA3MywgMHgwMDI5LCAweDAwMjgsIDB4MDA3NCwgMHgwMDI5LCAweDAwMjgsIDB4MDA3NSwgMHgwMDI5LAotICAgIDB4MDAyOCwgMHgwMDc2LCAweDAwMjksIDB4MDAyOCwgMHgwMDc3LCAweDAwMjksIDB4MDAyOCwgMHgwMDc4LCAweDAwMjksIDB4MDAyOCwgMHgwMDc5LCAweDAwMjksIDB4MDAyOCwgMHgwMDdBLCAweDAwMjksIDB4MDAzQSwKLSAgICAweDAwM0EsIDB4MDAzRCwgMHgwMDNELCAweDAwM0QsIDB4MDAzRCwgMHgwMDI4LCAweDExMDAsIDB4MDAyOSwgMHgwMDI4LCAweDExMDIsIDB4MDAyOSwgMHgwMDI4LCAweDExMDMsIDB4MDAyOSwgMHgwMDI4LCAweDExMDUsCi0gICAgMHgwMDI5LCAweDAwMjgsIDB4MTEwNiwgMHgwMDI5LCAweDAwMjgsIDB4MTEwNywgMHgwMDI5LCAweDAwMjgsIDB4MTEwOSwgMHgwMDI5LCAweDAwMjgsIDB4MTEwQiwgMHgwMDI5LCAweDAwMjgsIDB4MTEwQywgMHgwMDI5LAotICAgIDB4MDAyOCwgMHgxMTBFLCAweDAwMjksIDB4MDAyOCwgMHgxMTBGLCAweDAwMjksIDB4MDAyOCwgMHgxMTEwLCAweDAwMjksIDB4MDAyOCwgMHgxMTExLCAweDAwMjksIDB4MDAyOCwgMHgxMTEyLCAweDAwMjksIDB4MDAyOCwKLSAgICAweDRFMDAsIDB4MDAyOSwgMHgwMDI4LCAweDRFOEMsIDB4MDAyOSwgMHgwMDI4LCAweDRFMDksIDB4MDAyOSwgMHgwMDI4LCAweDU2REIsIDB4MDAyOSwgMHgwMDI4LCAweDRFOTQsIDB4MDAyOSwgMHgwMDI4LCAweDUxNkQsCi0gICAgMHgwMDI5LCAweDAwMjgsIDB4NEUwMywgMHgwMDI5LCAweDAwMjgsIDB4NTE2QiwgMHgwMDI5LCAweDAwMjgsIDB4NEU1RCwgMHgwMDI5LCAweDAwMjgsIDB4NTM0MSwgMHgwMDI5LCAweDAwMjgsIDB4NjcwOCwgMHgwMDI5LAotICAgIDB4MDAyOCwgMHg3MDZCLCAweDAwMjksIDB4MDAyOCwgMHg2QzM0LCAweDAwMjksIDB4MDAyOCwgMHg2NzI4LCAweDAwMjksIDB4MDAyOCwgMHg5MUQxLCAweDAwMjksIDB4MDAyOCwgMHg1NzFGLCAweDAwMjksIDB4MDAyOCwKLSAgICAweDY1RTUsIDB4MDAyOSwgMHgwMDI4LCAweDY4MkEsIDB4MDAyOSwgMHgwMDI4LCAweDY3MDksIDB4MDAyOSwgMHgwMDI4LCAweDc5M0UsIDB4MDAyOSwgMHgwMDI4LCAweDU0MEQsIDB4MDAyOSwgMHgwMDI4LCAweDcyNzksCi0gICAgMHgwMDI5LCAweDAwMjgsIDB4OENBMSwgMHgwMDI5LCAweDAwMjgsIDB4Nzk1RCwgMHgwMDI5LCAweDAwMjgsIDB4NTJCNCwgMHgwMDI5LCAweDAwMjgsIDB4NEVFMywgMHgwMDI5LCAweDAwMjgsIDB4NTQ3QywgMHgwMDI5LAotICAgIDB4MDAyOCwgMHg1QjY2LCAweDAwMjksIDB4MDAyOCwgMHg3NkUzLCAweDAwMjksIDB4MDAyOCwgMHg0RjAxLCAweDAwMjksIDB4MDAyOCwgMHg4Q0M3LCAweDAwMjksIDB4MDAyOCwgMHg1MzU0LCAweDAwMjksIDB4MDAyOCwKLSAgICAweDc5NkQsIDB4MDAyOSwgMHgwMDI4LCAweDRGMTEsIDB4MDAyOSwgMHgwMDI4LCAweDgxRUEsIDB4MDAyOSwgMHgwMDI4LCAweDgxRjMsIDB4MDAyOSwgMHgwMDUwLCAweDAwNTQsIDB4MDA0NSwgMHgwMDMxLCAweDAwMzAsCi0gICAgMHg2NzA4LCAweDAwMzEsIDB4MDAzMSwgMHg2NzA4LCAweDAwMzEsIDB4MDAzMiwgMHg2NzA4LCAweDAwNjUsIDB4MDA3MiwgMHgwMDY3LCAweDAwNEMsIDB4MDA1NCwgMHgwMDQ0LCAweDMwQTIsIDB4MzBGQywgMHgzMEVCLAotICAgIDB4MzBBNCwgMHgzMEYzLCAweDMwQzEsIDB4MzBBNiwgMHgzMEE5LCAweDMwRjMsIDB4MzBBQSwgMHgzMEYzLCAweDMwQjksIDB4MzBBQSwgMHgzMEZDLCAweDMwRTAsIDB4MzBBQiwgMHgzMEE0LCAweDMwRUEsIDB4MzBBQywKLSAgICAweDMwRUQsIDB4MzBGMywgMHgzMEFDLCAweDMwRjMsIDB4MzBERSwgMHgzMEFFLCAweDMwQ0IsIDB4MzBGQywgMHgzMEIwLCAweDMwRTksIDB4MzBFMCwgMHgzMEIxLCAweDMwRkMsIDB4MzBCOSwgMHgzMEIzLCAweDMwRUIsCi0gICAgMHgzMENBLCAweDMwQjMsIDB4MzBGQywgMHgzMERELCAweDMwQkIsIDB4MzBGMywgMHgzMEMxLCAweDMwQkIsIDB4MzBGMywgMHgzMEM4LCAweDMwQzAsIDB4MzBGQywgMHgzMEI5LCAweDMwQ0UsIDB4MzBDMywgMHgzMEM4LAotICAgIDB4MzBDRiwgMHgzMEE0LCAweDMwQzQsIDB4MzBEMSwgMHgzMEZDLCAweDMwQzQsIDB4MzBENCwgMHgzMEFGLCAweDMwRUIsIDB4MzBENSwgMHgzMEU5LCAweDMwRjMsIDB4MzBEQSwgMHgzMENCLCAweDMwRDIsIDB4MzBEOCwKLSAgICAweDMwRUIsIDB4MzBDNCwgMHgzMERBLCAweDMwRjMsIDB4MzBCOSwgMHgzMERBLCAweDMwRkMsIDB4MzBCOCwgMHgzMEQ5LCAweDMwRkMsIDB4MzBCRiwgMHgzMERDLCAweDMwRUIsIDB4MzBDOCwgMHgzMERELCAweDMwRjMsCi0gICAgMHgzMEM5LCAweDMwREIsIDB4MzBGQywgMHgzMEVCLCAweDMwREIsIDB4MzBGQywgMHgzMEYzLCAweDMwREUsIDB4MzBBNCwgMHgzMEVCLCAweDMwREUsIDB4MzBDMywgMHgzMENGLCAweDMwREUsIDB4MzBFQiwgMHgzMEFGLAotICAgIDB4MzBFNCwgMHgzMEZDLCAweDMwQzksIDB4MzBFNCwgMHgzMEZDLCAweDMwRUIsIDB4MzBFNiwgMHgzMEEyLCAweDMwRjMsIDB4MzBFQiwgMHgzMEQ0LCAweDMwRkMsIDB4MzBFRiwgMHgzMEMzLCAweDMwQzgsIDB4MDAzMSwKLSAgICAweDAwMzAsIDB4NzBCOSwgMHgwMDMxLCAweDAwMzEsIDB4NzBCOSwgMHgwMDMxLCAweDAwMzIsIDB4NzBCOSwgMHgwMDMxLCAweDAwMzMsIDB4NzBCOSwgMHgwMDMxLCAweDAwMzQsIDB4NzBCOSwgMHgwMDMxLCAweDAwMzUsCi0gICAgMHg3MEI5LCAweDAwMzEsIDB4MDAzNiwgMHg3MEI5LCAweDAwMzEsIDB4MDAzNywgMHg3MEI5LCAweDAwMzEsIDB4MDAzOCwgMHg3MEI5LCAweDAwMzEsIDB4MDAzOSwgMHg3MEI5LCAweDAwMzIsIDB4MDAzMCwgMHg3MEI5LAotICAgIDB4MDAzMiwgMHgwMDMxLCAweDcwQjksIDB4MDAzMiwgMHgwMDMyLCAweDcwQjksIDB4MDAzMiwgMHgwMDMzLCAweDcwQjksIDB4MDAzMiwgMHgwMDM0LCAweDcwQjksIDB4MDA2OCwgMHgwMDUwLCAweDAwNjEsIDB4MDA2MiwKLSAgICAweDAwNjEsIDB4MDA3MiwgMHgwMDY0LCAweDAwNkQsIDB4MDBCMiwgMHgwMDY0LCAweDAwNkQsIDB4MDBCMywgMHgwMDYzLCAweDAwNjEsIDB4MDA2QywgMHgwMDZCLCAweDAwNDgsIDB4MDA3QSwgMHgwMDRELCAweDAwNDgsCi0gICAgMHgwMDdBLCAweDAwNDcsIDB4MDA0OCwgMHgwMDdBLCAweDAwNTQsIDB4MDA0OCwgMHgwMDdBLCAweDAwNkQsIDB4MDA2RCwgMHgwMEIyLCAweDAwNjMsIDB4MDA2RCwgMHgwMEIyLCAweDAwNkIsIDB4MDA2RCwgMHgwMEIyLAotICAgIDB4MDA2RCwgMHgwMDZELCAweDAwQjMsIDB4MDA2MywgMHgwMDZELCAweDAwQjMsIDB4MDA2QiwgMHgwMDZELCAweDAwQjMsIDB4MDA2RCwgMHgyMjE1LCAweDAwNzMsIDB4MDA2QiwgMHgwMDUwLCAweDAwNjEsIDB4MDA0RCwKLSAgICAweDAwNTAsIDB4MDA2MSwgMHgwMDQ3LCAweDAwNTAsIDB4MDA2MSwgMHgwMDcyLCAweDAwNjEsIDB4MDA2NCwgMHgwMDQzLCAweDAwNkYsIDB4MDAyRSwgMHgwMDZDLCAweDAwNkYsIDB4MDA2NywgMHgwMDZELCAweDAwNjksCi0gICAgMHgwMDZDLCAweDAwNkQsIDB4MDA2RiwgMHgwMDZDLCAweDAwNTAsIDB4MDA1MCwgMHgwMDRELCAweDAwNTYsIDB4MjIxNSwgMHgwMDZELCAweDAwNDEsIDB4MjIxNSwgMHgwMDZELCAweDAwMzEsIDB4MDAzMCwgMHg2NUU1LAotICAgIDB4MDAzMSwgMHgwMDMxLCAweDY1RTUsIDB4MDAzMSwgMHgwMDMyLCAweDY1RTUsIDB4MDAzMSwgMHgwMDMzLCAweDY1RTUsIDB4MDAzMSwgMHgwMDM0LCAweDY1RTUsIDB4MDAzMSwgMHgwMDM1LCAweDY1RTUsIDB4MDAzMSwKLSAgICAweDAwMzYsIDB4NjVFNSwgMHgwMDMxLCAweDAwMzcsIDB4NjVFNSwgMHgwMDMxLCAweDAwMzgsIDB4NjVFNSwgMHgwMDMxLCAweDAwMzksIDB4NjVFNSwgMHgwMDMyLCAweDAwMzAsIDB4NjVFNSwgMHgwMDMyLCAweDAwMzEsCi0gICAgMHg2NUU1LCAweDAwMzIsIDB4MDAzMiwgMHg2NUU1LCAweDAwMzIsIDB4MDAzMywgMHg2NUU1LCAweDAwMzIsIDB4MDAzNCwgMHg2NUU1LCAweDAwMzIsIDB4MDAzNSwgMHg2NUU1LCAweDAwMzIsIDB4MDAzNiwgMHg2NUU1LAotICAgIDB4MDAzMiwgMHgwMDM3LCAweDY1RTUsIDB4MDAzMiwgMHgwMDM4LCAweDY1RTUsIDB4MDAzMiwgMHgwMDM5LCAweDY1RTUsIDB4MDAzMywgMHgwMDMwLCAweDY1RTUsIDB4MDAzMywgMHgwMDMxLCAweDY1RTUsIDB4MDA2NywKLSAgICAweDAwNjEsIDB4MDA2QywgMHgwMDY2LCAweDAwNjYsIDB4MDA2OSwgMHgwMDY2LCAweDAwNjYsIDB4MDA2QywgMHgwNjQwLCAweDA2NEUsIDB4MDY1MSwgMHgwNjQwLCAweDA2NEYsIDB4MDY1MSwgMHgwNjQwLCAweDA2NTAsCi0gICAgMHgwNjUxLCAweDA2MkEsIDB4MDYyQywgMHgwNjQ1LCAweDA2MkEsIDB4MDYyRCwgMHgwNjJDLCAweDA2MkEsIDB4MDYyRCwgMHgwNjJDLCAweDA2MkEsIDB4MDYyRCwgMHgwNjQ1LCAweDA2MkEsIDB4MDYyRSwgMHgwNjQ1LAotICAgIDB4MDYyQSwgMHgwNjQ1LCAweDA2MkMsIDB4MDYyQSwgMHgwNjQ1LCAweDA2MkQsIDB4MDYyQSwgMHgwNjQ1LCAweDA2MkUsIDB4MDYyQywgMHgwNjQ1LCAweDA2MkQsIDB4MDYyQywgMHgwNjQ1LCAweDA2MkQsIDB4MDYyRCwKLSAgICAweDA2NDUsIDB4MDY0QSwgMHgwNjJELCAweDA2NDUsIDB4MDY0OSwgMHgwNjMzLCAweDA2MkQsIDB4MDYyQywgMHgwNjMzLCAweDA2MkMsIDB4MDYyRCwgMHgwNjMzLCAweDA2MkMsIDB4MDY0OSwgMHgwNjMzLCAweDA2NDUsCi0gICAgMHgwNjJELCAweDA2MzMsIDB4MDY0NSwgMHgwNjJELCAweDA2MzMsIDB4MDY0NSwgMHgwNjJDLCAweDA2MzMsIDB4MDY0NSwgMHgwNjQ1LCAweDA2MzMsIDB4MDY0NSwgMHgwNjQ1LCAweDA2MzUsIDB4MDYyRCwgMHgwNjJELAotICAgIDB4MDYzNSwgMHgwNjJELCAweDA2MkQsIDB4MDYzNSwgMHgwNjQ1LCAweDA2NDUsIDB4MDYzNCwgMHgwNjJELCAweDA2NDUsIDB4MDYzNCwgMHgwNjJELCAweDA2NDUsIDB4MDYzNCwgMHgwNjJDLCAweDA2NEEsIDB4MDYzNCwKLSAgICAweDA2NDUsIDB4MDYyRSwgMHgwNjM0LCAweDA2NDUsIDB4MDYyRSwgMHgwNjM0LCAweDA2NDUsIDB4MDY0NSwgMHgwNjM0LCAweDA2NDUsIDB4MDY0NSwgMHgwNjM2LCAweDA2MkQsIDB4MDY0OSwgMHgwNjM2LCAweDA2MkUsCi0gICAgMHgwNjQ1LCAweDA2MzYsIDB4MDYyRSwgMHgwNjQ1LCAweDA2MzcsIDB4MDY0NSwgMHgwNjJELCAweDA2MzcsIDB4MDY0NSwgMHgwNjJELCAweDA2MzcsIDB4MDY0NSwgMHgwNjQ1LCAweDA2MzcsIDB4MDY0NSwgMHgwNjRBLAotICAgIDB4MDYzOSwgMHgwNjJDLCAweDA2NDUsIDB4MDYzOSwgMHgwNjQ1LCAweDA2NDUsIDB4MDYzOSwgMHgwNjQ1LCAweDA2NDUsIDB4MDYzOSwgMHgwNjQ1LCAweDA2NDksIDB4MDYzQSwgMHgwNjQ1LCAweDA2NDUsIDB4MDYzQSwKLSAgICAweDA2NDUsIDB4MDY0QSwgMHgwNjNBLCAweDA2NDUsIDB4MDY0OSwgMHgwNjQxLCAweDA2MkUsIDB4MDY0NSwgMHgwNjQxLCAweDA2MkUsIDB4MDY0NSwgMHgwNjQyLCAweDA2NDUsIDB4MDYyRCwgMHgwNjQyLCAweDA2NDUsCi0gICAgMHgwNjQ1LCAweDA2NDQsIDB4MDYyRCwgMHgwNjQ1LCAweDA2NDQsIDB4MDYyRCwgMHgwNjRBLCAweDA2NDQsIDB4MDYyRCwgMHgwNjQ5LCAweDA2NDQsIDB4MDYyQywgMHgwNjJDLCAweDA2NDQsIDB4MDYyQywgMHgwNjJDLAotICAgIDB4MDY0NCwgMHgwNjJFLCAweDA2NDUsIDB4MDY0NCwgMHgwNjJFLCAweDA2NDUsIDB4MDY0NCwgMHgwNjQ1LCAweDA2MkQsIDB4MDY0NCwgMHgwNjQ1LCAweDA2MkQsIDB4MDY0NSwgMHgwNjJELCAweDA2MkMsIDB4MDY0NSwKLSAgICAweDA2MkQsIDB4MDY0NSwgMHgwNjQ1LCAweDA2MkQsIDB4MDY0QSwgMHgwNjQ1LCAweDA2MkMsIDB4MDYyRCwgMHgwNjQ1LCAweDA2MkMsIDB4MDY0NSwgMHgwNjQ1LCAweDA2MkUsIDB4MDYyQywgMHgwNjQ1LCAweDA2MkUsCi0gICAgMHgwNjQ1LCAweDA2NDUsIDB4MDYyQywgMHgwNjJFLCAweDA2NDcsIDB4MDY0NSwgMHgwNjJDLCAweDA2NDcsIDB4MDY0NSwgMHgwNjQ1LCAweDA2NDYsIDB4MDYyRCwgMHgwNjQ1LCAweDA2NDYsIDB4MDYyRCwgMHgwNjQ5LAotICAgIDB4MDY0NiwgMHgwNjJDLCAweDA2NDUsIDB4MDY0NiwgMHgwNjJDLCAweDA2NDUsIDB4MDY0NiwgMHgwNjJDLCAweDA2NDksIDB4MDY0NiwgMHgwNjQ1LCAweDA2NEEsIDB4MDY0NiwgMHgwNjQ1LCAweDA2NDksIDB4MDY0QSwKLSAgICAweDA2NDUsIDB4MDY0NSwgMHgwNjRBLCAweDA2NDUsIDB4MDY0NSwgMHgwNjI4LCAweDA2MkUsIDB4MDY0QSwgMHgwNjJBLCAweDA2MkMsIDB4MDY0QSwgMHgwNjJBLCAweDA2MkMsIDB4MDY0OSwgMHgwNjJBLCAweDA2MkUsCi0gICAgMHgwNjRBLCAweDA2MkEsIDB4MDYyRSwgMHgwNjQ5LCAweDA2MkEsIDB4MDY0NSwgMHgwNjRBLCAweDA2MkEsIDB4MDY0NSwgMHgwNjQ5LCAweDA2MkMsIDB4MDY0NSwgMHgwNjRBLCAweDA2MkMsIDB4MDYyRCwgMHgwNjQ5LAotICAgIDB4MDYyQywgMHgwNjQ1LCAweDA2NDksIDB4MDYzMywgMHgwNjJFLCAweDA2NDksIDB4MDYzNSwgMHgwNjJELCAweDA2NEEsIDB4MDYzNCwgMHgwNjJELCAweDA2NEEsIDB4MDYzNiwgMHgwNjJELCAweDA2NEEsIDB4MDY0NCwKLSAgICAweDA2MkMsIDB4MDY0QSwgMHgwNjQ0LCAweDA2NDUsIDB4MDY0QSwgMHgwNjRBLCAweDA2MkQsIDB4MDY0QSwgMHgwNjRBLCAweDA2MkMsIDB4MDY0QSwgMHgwNjRBLCAweDA2NDUsIDB4MDY0QSwgMHgwNjQ1LCAweDA2NDUsCi0gICAgMHgwNjRBLCAweDA2NDIsIDB4MDY0NSwgMHgwNjRBLCAweDA2NDYsIDB4MDYyRCwgMHgwNjRBLCAweDA2NDIsIDB4MDY0NSwgMHgwNjJELCAweDA2NDQsIDB4MDYyRCwgMHgwNjQ1LCAweDA2MzksIDB4MDY0NSwgMHgwNjRBLAotICAgIDB4MDY0MywgMHgwNjQ1LCAweDA2NEEsIDB4MDY0NiwgMHgwNjJDLCAweDA2MkQsIDB4MDY0NSwgMHgwNjJFLCAweDA2NEEsIDB4MDY0NCwgMHgwNjJDLCAweDA2NDUsIDB4MDY0MywgMHgwNjQ1LCAweDA2NDUsIDB4MDY0NCwKLSAgICAweDA2MkMsIDB4MDY0NSwgMHgwNjQ2LCAweDA2MkMsIDB4MDYyRCwgMHgwNjJDLCAweDA2MkQsIDB4MDY0QSwgMHgwNjJELCAweDA2MkMsIDB4MDY0QSwgMHgwNjQ1LCAweDA2MkMsIDB4MDY0QSwgMHgwNjQxLCAweDA2NDUsCi0gICAgMHgwNjRBLCAweDA2MjgsIDB4MDYyRCwgMHgwNjRBLCAweDA2NDMsIDB4MDY0NSwgMHgwNjQ1LCAweDA2MzksIDB4MDYyQywgMHgwNjQ1LCAweDA2MzUsIDB4MDY0NSwgMHgwNjQ1LCAweDA2MzMsIDB4MDYyRSwgMHgwNjRBLAotICAgIDB4MDY0NiwgMHgwNjJDLCAweDA2NEEsIDB4MDYzNSwgMHgwNjQ0LCAweDA2RDIsIDB4MDY0MiwgMHgwNjQ0LCAweDA2RDIsIDB4MDYzNSwgMHgwNjQ0LCAweDA2NDkKLX07Ci1leHRlcm4gY29uc3QgRlhfV0NIQVIgZ19Vbmljb2RlRGF0YV9Ob3JtYWxpemF0aW9uX01hcDRbNDg4XSA9IHsKLSAgICAweDAwMDQsIDB4MjAzMiwgMHgyMDMyLCAweDIwMzIsIDB4MjAzMiwgMHgwMDA0LCAweDAwMzEsIDB4MDAyRiwgMHgwMDMxLCAweDAwMzAsIDB4MDAwNCwgMHgwMDU2LCAweDAwNDksIDB4MDA0OSwgMHgwMDQ5LCAweDAwMDQsCi0gICAgMHgwMDc2LCAweDAwNjksIDB4MDA2OSwgMHgwMDY5LCAweDAwMDQsIDB4MDAyOCwgMHgwMDMxLCAweDAwMzAsIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsIDB4MDAzMSwgMHgwMDMxLCAweDAwMjksIDB4MDAwNCwgMHgwMDI4LAotICAgIDB4MDAzMSwgMHgwMDMyLCAweDAwMjksIDB4MDAwNCwgMHgwMDI4LCAweDAwMzEsIDB4MDAzMywgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgwMDMxLCAweDAwMzQsIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsIDB4MDAzMSwKLSAgICAweDAwMzUsIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsIDB4MDAzMSwgMHgwMDM2LCAweDAwMjksIDB4MDAwNCwgMHgwMDI4LCAweDAwMzEsIDB4MDAzNywgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgwMDMxLCAweDAwMzgsCi0gICAgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgwMDMxLCAweDAwMzksIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsIDB4MDAzMiwgMHgwMDMwLCAweDAwMjksIDB4MDAwNCwgMHgyMjJCLCAweDIyMkIsIDB4MjIyQiwgMHgyMjJCLAotICAgIDB4MDAwNCwgMHgwMDI4LCAweDExMDAsIDB4MTE2MSwgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgxMTAyLCAweDExNjEsIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsIDB4MTEwMywgMHgxMTYxLCAweDAwMjksIDB4MDAwNCwKLSAgICAweDAwMjgsIDB4MTEwNSwgMHgxMTYxLCAweDAwMjksIDB4MDAwNCwgMHgwMDI4LCAweDExMDYsIDB4MTE2MSwgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgxMTA3LCAweDExNjEsIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsCi0gICAgMHgxMTA5LCAweDExNjEsIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsIDB4MTEwQiwgMHgxMTYxLCAweDAwMjksIDB4MDAwNCwgMHgwMDI4LCAweDExMEMsIDB4MTE2MSwgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgxMTBFLAotICAgIDB4MTE2MSwgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgxMTBGLCAweDExNjEsIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsIDB4MTExMCwgMHgxMTYxLCAweDAwMjksIDB4MDAwNCwgMHgwMDI4LCAweDExMTEsIDB4MTE2MSwKLSAgICAweDAwMjksIDB4MDAwNCwgMHgwMDI4LCAweDExMTIsIDB4MTE2MSwgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgxMTBDLCAweDExNkUsIDB4MDAyOSwgMHgwMDA3LCAweDAwMjgsIDB4MTEwQiwgMHgxMTY5LCAweDExMEMsCi0gICAgMHgxMTY1LCAweDExQUIsIDB4MDAyOSwgMHgwMDA2LCAweDAwMjgsIDB4MTEwQiwgMHgxMTY5LCAweDExMTIsIDB4MTE2RSwgMHgwMDI5LCAweDAwMDUsIDB4MTEwRSwgMHgxMTYxLCAweDExQjcsIDB4MTEwMCwgMHgxMTY5LAotICAgIDB4MDAwNCwgMHgxMTBDLCAweDExNkUsIDB4MTEwQiwgMHgxMTc0LCAweDAwMDQsIDB4MzBBMiwgMHgzMEQxLCAweDMwRkMsIDB4MzBDOCwgMHgwMDA0LCAweDMwQTIsIDB4MzBFQiwgMHgzMEQ1LCAweDMwQTEsIDB4MDAwNCwKLSAgICAweDMwQTIsIDB4MzBGMywgMHgzMERBLCAweDMwQTIsIDB4MDAwNCwgMHgzMEE0LCAweDMwQ0IsIDB4MzBGMywgMHgzMEIwLCAweDAwMDUsIDB4MzBBOCwgMHgzMEI5LCAweDMwQUYsIDB4MzBGQywgMHgzMEM5LCAweDAwMDQsCi0gICAgMHgzMEE4LCAweDMwRkMsIDB4MzBBQiwgMHgzMEZDLCAweDAwMDQsIDB4MzBBQiwgMHgzMEU5LCAweDMwQzMsIDB4MzBDOCwgMHgwMDA0LCAweDMwQUIsIDB4MzBFRCwgMHgzMEVBLCAweDMwRkMsIDB4MDAwNCwgMHgzMEFELAotICAgIDB4MzBFNSwgMHgzMEVBLCAweDMwRkMsIDB4MDAwNCwgMHgzMEFFLCAweDMwRUIsIDB4MzBDMCwgMHgzMEZDLCAweDAwMDUsIDB4MzBBRCwgMHgzMEVELCAweDMwQjAsIDB4MzBFOSwgMHgzMEUwLCAweDAwMDYsIDB4MzBBRCwKLSAgICAweDMwRUQsIDB4MzBFMSwgMHgzMEZDLCAweDMwQzgsIDB4MzBFQiwgMHgwMDA1LCAweDMwQUQsIDB4MzBFRCwgMHgzMEVGLCAweDMwQzMsIDB4MzBDOCwgMHgwMDA1LCAweDMwQjAsIDB4MzBFOSwgMHgzMEUwLCAweDMwQzgsCi0gICAgMHgzMEYzLCAweDAwMDUsIDB4MzBBRiwgMHgzMEVCLCAweDMwQkMsIDB4MzBBNCwgMHgzMEVELCAweDAwMDQsIDB4MzBBRiwgMHgzMEVELCAweDMwRkMsIDB4MzBDRCwgMHgwMDA0LCAweDMwQjUsIDB4MzBBNCwgMHgzMEFGLAotICAgIDB4MzBFQiwgMHgwMDA1LCAweDMwQjUsIDB4MzBGMywgMHgzMEMxLCAweDMwRkMsIDB4MzBFMCwgMHgwMDA0LCAweDMwQjcsIDB4MzBFQSwgMHgzMEYzLCAweDMwQjAsIDB4MDAwNSwgMHgzMEQxLCAweDMwRkMsIDB4MzBCQiwKLSAgICAweDMwRjMsIDB4MzBDOCwgMHgwMDA0LCAweDMwRDAsIDB4MzBGQywgMHgzMEVDLCAweDMwRUIsIDB4MDAwNSwgMHgzMEQ0LCAweDMwQTIsIDB4MzBCOSwgMHgzMEM4LCAweDMwRUIsIDB4MDAwNSwgMHgzMEQ1LCAweDMwQTEsCi0gICAgMHgzMEU5LCAweDMwQzMsIDB4MzBDOSwgMHgwMDA0LCAweDMwRDUsIDB4MzBBMywgMHgzMEZDLCAweDMwQzgsIDB4MDAwNSwgMHgzMEQ2LCAweDMwQzMsIDB4MzBCNywgMHgzMEE3LCAweDMwRUIsIDB4MDAwNSwgMHgzMEQ4LAotICAgIDB4MzBBRiwgMHgzMEJGLCAweDMwRkMsIDB4MzBFQiwgMHgwMDA0LCAweDMwREQsIDB4MzBBNCwgMHgzMEYzLCAweDMwQzgsIDB4MDAwNCwgMHgzMERFLCAweDMwQTQsIDB4MzBBRiwgMHgzMEVELCAweDAwMDUsIDB4MzBERSwKLSAgICAweDMwRjMsIDB4MzBCNywgMHgzMEU3LCAweDMwRjMsIDB4MDAwNCwgMHgzMERGLCAweDMwQUYsIDB4MzBFRCwgMHgzMEYzLCAweDAwMDUsIDB4MzBERiwgMHgzMEVBLCAweDMwRDAsIDB4MzBGQywgMHgzMEVCLCAweDAwMDQsCi0gICAgMHgzMEUxLCAweDMwQUMsIDB4MzBDOCwgMHgzMEYzLCAweDAwMDQsIDB4MzBFMSwgMHgzMEZDLCAweDMwQzgsIDB4MzBFQiwgMHgwMDA0LCAweDMwRUEsIDB4MzBDMywgMHgzMEM4LCAweDMwRUIsIDB4MDAwNCwgMHgzMEVCLAotICAgIDB4MzBGQywgMHgzMEQ2LCAweDMwRUIsIDB4MDAwNSwgMHgzMEVDLCAweDMwRjMsIDB4MzBDOCwgMHgzMEIyLCAweDMwRjMsIDB4MDAwNCwgMHg2ODJBLCAweDVGMEYsIDB4NEYxQSwgMHg3OTNFLCAweDAwMDQsIDB4MDA2QiwKLSAgICAweDAwNjMsIDB4MDA2MSwgMHgwMDZDLCAweDAwMDQsIDB4MDA2RCwgMHgyMjE1LCAweDAwNzMsIDB4MDBCMiwgMHgwMDA1LCAweDAwNzIsIDB4MDA2MSwgMHgwMDY0LCAweDIyMTUsIDB4MDA3MywgMHgwMDA2LCAweDAwNzIsCi0gICAgMHgwMDYxLCAweDAwNjQsIDB4MjIxNSwgMHgwMDczLCAweDAwQjIsIDB4MDAwNCwgMHgwMDYxLCAweDAwMkUsIDB4MDA2RCwgMHgwMDJFLCAweDAwMDQsIDB4MDA0MywgMHgyMjE1LCAweDAwNkIsIDB4MDA2NywgMHgwMDA0LAotICAgIDB4MDA3MCwgMHgwMDJFLCAweDAwNkQsIDB4MDAyRSwgMHgwMDA0LCAweDA2MjcsIDB4MDY0NCwgMHgwNjQ0LCAweDA2NDcsIDB4MDAwNCwgMHgwNjI3LCAweDA2NDMsIDB4MDYyOCwgMHgwNjMxLCAweDAwMDQsIDB4MDY0NSwKLSAgICAweDA2MkQsIDB4MDY0NSwgMHgwNjJGLCAweDAwMDQsIDB4MDYzNSwgMHgwNjQ0LCAweDA2MzksIDB4MDY0NSwgMHgwMDA0LCAweDA2MzEsIDB4MDYzMywgMHgwNjQ4LCAweDA2NDQsIDB4MDAwNCwgMHgwNjM5LCAweDA2NDQsCi0gICAgMHgwNjRBLCAweDA2NDcsIDB4MDAwNCwgMHgwNjQ4LCAweDA2MzMsIDB4MDY0NCwgMHgwNjQ1LCAweDAwMTIsIDB4MDYzNSwgMHgwNjQ0LCAweDA2NDksIDB4MDAyMCwgMHgwNjI3LCAweDA2NDQsIDB4MDY0NCwgMHgwNjQ3LAotICAgIDB4MDAyMCwgMHgwNjM5LCAweDA2NDQsIDB4MDY0QSwgMHgwNjQ3LCAweDAwMjAsIDB4MDY0OCwgMHgwNjMzLCAweDA2NDQsIDB4MDY0NSwgMHgwMDA4LCAweDA2MkMsIDB4MDY0NCwgMHgwMDIwLCAweDA2MkMsIDB4MDY0NCwKLSAgICAweDA2MjcsIDB4MDY0NCwgMHgwNjQ3LCAweDAwMDQsIDB4MDYzMSwgMHgwNkNDLCAweDA2MjcsIDB4MDY0NAotfTsKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAidW5pY29kZW5vcm1hbGl6YXRpb25kYXRhLmgiCisKK2NvbnN0IEZYX1dDSEFSIGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvbls2NTUzNl0gPSB7CisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MDAxLCAweDAwMDAsIDB4MjAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MjAwMiwgMHg4MDAyLCAweDAwMDAsIDB4MjAwNCwgMHgwMDAwLCAweDAwMDAsIDB4ODAwMywgMHg4MDA0LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MDA1LCAweDAwMDAsIDB4ODAwNiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgwMDcsIDB4ODAwOCwgMHgwMDAwLCAweDAwMDAsIDB4ODAwOSwgMHg4MDBBLAorICAgIDB4ODAwQiwgMHg4MDBDLCAweDAwMDAsIDB4MDAwMCwgMHg4MDBELCAweDgwMEUsIDB4ODAwRiwgMHgwMDAwLCAweDMwMDAsCisgICAgMHgzMDAzLCAweDMwMDYsIDB4MDAwMCwgMHg4MDEwLCAweDgwMTEsIDB4ODAxMiwgMHg4MDEzLCAweDgwMTQsIDB4ODAxNSwKKyAgICAweDAwMDAsIDB4ODAxNiwgMHg4MDE3LCAweDgwMTgsIDB4ODAxOSwgMHg4MDFBLCAweDgwMUIsIDB4ODAxQywgMHg4MDFELAorICAgIDB4ODAxRSwgMHg4MDFGLCAweDgwMjAsIDB4ODAyMSwgMHg4MDIyLCAweDgwMjMsIDB4ODAyNCwgMHg4MDI1LCAweDAwMDAsCisgICAgMHg4MDI2LCAweDgwMjcsIDB4ODAyOCwgMHg4MDI5LCAweDgwMkEsIDB4ODAyQiwgMHgwMDAwLCAweDAwMDAsIDB4ODAyQywKKyAgICAweDgwMkQsIDB4ODAyRSwgMHg4MDJGLCAweDgwMzAsIDB4ODAzMSwgMHgwMDAwLCAweDgwMzIsIDB4ODAzMywgMHg4MDM0LAorICAgIDB4ODAzNSwgMHg4MDM2LCAweDgwMzcsIDB4ODAzOCwgMHg4MDM5LCAweDgwM0EsIDB4MDAwMCwgMHg4MDNCLCAweDgwM0MsCisgICAgMHg4MDNELCAweDgwM0UsIDB4ODAzRiwgMHg4MDQwLCAweDAwMDAsIDB4ODA0MSwgMHg4MDQyLCAweDgwNDMsIDB4ODA0NCwKKyAgICAweDgwNDUsIDB4ODA0NiwgMHgwMDAwLCAweDgwNDcsIDB4ODA0OCwgMHg4MDQ5LCAweDgwNEEsIDB4ODA0QiwgMHg4MDRDLAorICAgIDB4ODA0RCwgMHg4MDRFLCAweDgwNEYsIDB4ODA1MCwgMHg4MDUxLCAweDgwNTIsIDB4ODA1MywgMHg4MDU0LCAweDgwNTUsCisgICAgMHg4MDU2LCAweDgwNTcsIDB4ODA1OCwgMHg4MDU5LCAweDgwNUEsIDB4ODA1QiwgMHg4MDVDLCAweDgwNUQsIDB4ODA1RSwKKyAgICAweDgwNUYsIDB4ODA2MCwgMHg4MDYxLCAweDgwNjIsIDB4ODA2MywgMHg4MDY0LCAweDgwNjUsIDB4ODA2NiwgMHg4MDY3LAorICAgIDB4ODA2OCwgMHg4MDY5LCAweDgwNkEsIDB4ODA2QiwgMHg4MDZDLCAweDgwNkQsIDB4ODA2RSwgMHg4MDZGLCAweDgwNzAsCisgICAgMHg4MDcxLCAweDgwNzIsIDB4ODA3MywgMHg4MDc0LCAweDgwNzUsIDB4ODA3NiwgMHg4MDc3LCAweDgwNzgsIDB4MDAwMCwKKyAgICAweDIwMDYsIDB4MjAwOCwgMHg4MDc5LCAweDgwN0EsIDB4ODA3QiwgMHg4MDdDLCAweDgwN0QsIDB4ODA3RSwgMHg4MDdGLAorICAgIDB4ODA4MCwgMHg4MDgxLCAweDgwODIsIDB4ODA4MywgMHg4MDg0LCAweDgwODUsIDB4ODA4NiwgMHg4MDg3LCAweDgwODgsCisgICAgMHg4MDg5LCAweDgwOEEsIDB4ODA4QiwgMHg4MDhDLCAweDgwOEQsIDB4ODA4RSwgMHgwMDAwLCAweDAwMDAsIDB4ODA4RiwKKyAgICAweDgwOTAsIDB4ODA5MSwgMHg4MDkyLCAweDgwOTMsIDB4ODA5NCwgMHgyMDBBLCAweDIwMEMsIDB4ODA5NSwgMHg4MDk2LAorICAgIDB4ODA5NywgMHg4MDk4LCAweDgwOTksIDB4ODA5QSwgMHg4MDlCLCAweDgwOUMsIDB4ODA5RCwgMHg4MDlFLCAweDgwOUYsCisgICAgMHg4MEEwLCAweDgwQTEsIDB4ODBBMiwgMHg4MEEzLCAweDgwQTQsIDB4ODBBNSwgMHg4MEE2LCAweDgwQTcsIDB4ODBBOCwKKyAgICAweDgwQTksIDB4ODBBQSwgMHg4MEFCLCAweDgwQUMsIDB4ODBBRCwgMHg4MEFFLCAweDgwQUYsIDB4ODBCMCwgMHg4MEIxLAorICAgIDB4ODBCMiwgMHg4MEIzLCAweDgwQjQsIDB4ODBCNSwgMHg4MEI2LCAweDgwQjcsIDB4ODBCOCwgMHg4MEI5LCAweDgwQkEsCisgICAgMHg4MEJCLCAweDgwQkMsIDB4ODBCRCwgMHg4MEJFLCAweDgwQkYsIDB4ODBDMCwgMHg4MEMxLCAweDgwQzIsIDB4ODBDMywKKyAgICAweDgwQzQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODBDNSwgMHg4MEM2LCAweDgwQzcsIDB4ODBDOCwgMHg4MEM5LAorICAgIDB4ODBDQSwgMHgwMDAwLCAweDgwQ0IsIDB4MDAwMCwgMHg4MENDLCAweDgwQ0QsIDB4ODBDRSwgMHg4MENGLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODBEMCwgMHg4MEQxLCAweDgwRDIsIDB4ODBEMywgMHgwMDAwLCAweDgwRDQsIDB4ODBENSwKKyAgICAweDgwRDYsIDB4ODBENywgMHg4MEQ4LCAweDgwRDksIDB4MDAwMCwgMHgwMDAwLCAweDgwREEsIDB4ODBEQiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODBEQywgMHg4MERELCAweDgwREUsIDB4ODBERiwgMHg4MEUwLCAweDgwRTEsCisgICAgMHg4MEUyLCAweDAwMDAsIDB4ODBFMywgMHg4MEU0LCAweDgwRTUsIDB4ODBFNiwgMHg4MEU3LCAweDAwMDAsIDB4ODBFOCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDIwMEUsIDB4MjAxMCwgMHgyMDEyLCAweDIwMTQsIDB4MjAxNiwgMHgyMDE4LCAweDIwMUEsCisgICAgMHgyMDFDLCAweDIwMUUsIDB4ODBFOSwgMHg4MEVBLCAweDgwRUIsIDB4ODBFQywgMHg4MEVELCAweDgwRUUsIDB4ODBFRiwKKyAgICAweDgwRjAsIDB4ODBGMSwgMHg4MEYyLCAweDgwRjMsIDB4ODBGNCwgMHg4MEY1LCAweDgwRjYsIDB4ODBGNywgMHg4MEY4LAorICAgIDB4ODBGOSwgMHg4MEZBLCAweDgwRkIsIDB4ODBGQywgMHg4MEZELCAweDgwRkUsIDB4ODBGRiwgMHg4MTAwLCAweDgxMDEsCisgICAgMHg4MTAyLCAweDgxMDMsIDB4ODEwNCwgMHg4MTA1LCAweDgxMDYsIDB4ODEwNywgMHg4MTA4LCAweDgxMDksIDB4ODEwQSwKKyAgICAweDgxMEIsIDB4ODEwQywgMHgyMDIwLCAweDIwMjIsIDB4MjAyNCwgMHg4MTBELCAweDgxMEUsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODEwRiwgMHg4MTEwLCAweDgxMTEsIDB4ODExMiwgMHg4MTEzLCAweDgxMTQsIDB4ODExNSwgMHg4MTE2LCAweDgxMTcsCisgICAgMHg4MTE4LCAweDgxMTksIDB4ODExQSwgMHg4MTFCLCAweDgxMUMsIDB4ODExRCwgMHg4MTFFLCAweDgxMUYsIDB4ODEyMCwKKyAgICAweDgxMjEsIDB4ODEyMiwgMHg4MTIzLCAweDgxMjQsIDB4ODEyNSwgMHg4MTI2LCAweDgxMjcsIDB4ODEyOCwgMHg4MTI5LAorICAgIDB4ODEyQSwgMHg4MTJCLCAweDgxMkMsIDB4ODEyRCwgMHg4MTJFLCAweDgxMkYsIDB4ODEzMCwgMHg4MTMxLCAweDgxMzIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODEzMywgMHg4MTM0LCAweDgxMzUsIDB4ODEzNiwgMHgwMDAwLCAweDAwMDAsIDB4ODEzNywKKyAgICAweDgxMzgsIDB4ODEzOSwgMHg4MTNBLCAweDgxM0IsIDB4ODEzQywgMHg4MTNELCAweDgxM0UsIDB4ODEzRiwgMHg4MTQwLAorICAgIDB4ODE0MSwgMHg4MTQyLCAweDgxNDMsIDB4ODE0NCwgMHg4MTQ1LCAweDgxNDYsIDB4ODE0NywgMHg4MTQ4LCAweDgxNDksCisgICAgMHg4MTRBLCAweDIwMjYsIDB4MjAyOCwgMHg4MTRCLCAweDgxNEMsIDB4ODE0RCwgMHg4MTRFLCAweDgxNEYsIDB4ODE1MCwKKyAgICAweDgxNTEsIDB4MDAwMCwgMHgwMDAwLCAweDgxNTIsIDB4ODE1MywgMHg4MTU0LCAweDgxNTUsIDB4ODE1NiwgMHg4MTU3LAorICAgIDB4ODE1OCwgMHg4MTU5LCAweDgxNUEsIDB4ODE1QiwgMHg4MTVDLCAweDgxNUQsIDB4ODE1RSwgMHg4MTVGLCAweDAwMDAsCisgICAgMHg4MTYwLCAweDgxNjEsIDB4ODE2MiwgMHg4MTYzLCAweDgxNjQsIDB4ODE2NSwgMHg4MTY2LCAweDAwMDAsIDB4ODE2NywKKyAgICAweDgxNjgsIDB4ODE2OSwgMHg4MTZBLCAweDgxNkIsIDB4ODE2QywgMHg4MTZELCAweDgxNkUsIDB4ODE2RiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4MTcwLCAweDgxNzEsIDB4MDAwMCwgMHg4MTcyLCAweDAwMDAsIDB4ODE3MywgMHg4MTc0LCAweDgxNzUsCisgICAgMHg4MTc2LCAweDAwMDAsIDB4ODE3NywgMHg4MTc4LCAweDgxNzksIDB4ODE3QSwgMHg4MTdCLCAweDgxN0MsIDB4ODE3RCwKKyAgICAweDIwMkEsIDB4MDAwMCwgMHgwMDAwLCAweDgxN0UsIDB4ODE3RiwgMHg4MTgwLCAweDgxODEsIDB4ODE4MiwgMHg4MTgzLAorICAgIDB4ODE4NCwgMHg4MTg1LCAweDgxODYsIDB4ODE4NywgMHgwMDAwLCAweDgxODgsIDB4ODE4OSwgMHg4MThBLCAweDgxOEIsCisgICAgMHg4MThDLCAweDgxOEQsIDB4MDAwMCwgMHg4MThFLCAweDgxOEYsIDB4ODE5MCwgMHg4MTkxLCAweDgxOTIsIDB4ODE5MywKKyAgICAweDgxOTQsIDB4MDAwMCwgMHg4MTk1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgxOTYsIDB4MDAwMCwgMHg4MTk3LAorICAgIDB4ODE5OCwgMHg4MTk5LCAweDgxOUEsIDB4ODE5QiwgMHg4MTlDLCAweDgxOUQsIDB4ODE5RSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgyMDJDLCAweDIwMkUsIDB4MjAzMCwgMHgyMDMyLCAweDIwMzQsIDB4MjAzNiwgMHgyMDM4LCAweDIwM0EsIDB4MjAzQywKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4MTlGLCAweDgxQTAsIDB4ODFBMSwgMHg4MUEyLCAweDgxQTMsIDB4ODFBNCwgMHg4MUE1LAorICAgIDB4ODFBNiwgMHg4MUE3LCAweDgxQTgsIDB4ODFBOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgxQUEsIDB4ODFBQiwKKyAgICAweDgxQUMsIDB4ODFBRCwgMHg4MUFFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MUFGLCAweDgxQjAsIDB4MDAwMCwgMHg4MUIxLCAweDgxQjIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MUIzLCAweDgxQjQsIDB4ODFCNSwgMHg4MUI2LCAweDgxQjcsIDB4ODFCOCwKKyAgICAweDgxQjksIDB4ODFCQSwgMHg4MUJCLCAweDgxQkMsIDB4ODFCRCwgMHg4MUJFLCAweDgxQkYsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDgxQzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MUMxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDgxQzIsIDB4ODFDMywgMHg4MUM0LCAweDgxQzUsIDB4ODFDNiwgMHg4MUM3LCAweDgxQzgsIDB4MDAwMCwgMHg4MUM5LAorICAgIDB4MDAwMCwgMHg4MUNBLCAweDgxQ0IsIDB4ODFDQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDgxQ0QsIDB4ODFDRSwgMHg4MUNGLCAweDgxRDAsIDB4ODFEMSwgMHg4MUQyLCAweDgxRDMsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MUQ0LCAweDgxRDUsCisgICAgMHg4MUQ2LCAweDgxRDcsIDB4ODFEOCwgMHgwMDAwLCAweDgxRDksIDB4ODFEQSwgMHg4MURCLCAweDgxREMsIDB4ODFERCwKKyAgICAweDgxREUsIDB4ODFERiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDgxRTAsIDB4ODFFMSwgMHg4MUUyLCAweDAwMDAsIDB4ODFFMywgMHg4MUU0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODFFNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MUU2LCAweDgxRTcsCisgICAgMHgwMDAwLCAweDgxRTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODFFOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODFFQSwgMHg4MUVCLCAweDgxRUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgxRUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDgxRUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODFFRiwgMHg4MUYwLCAweDAwMDAsCisgICAgMHg4MUYxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgxRjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDgxRjMsIDB4ODFGNCwgMHg4MUY1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODFGNiwgMHg4MUY3LCAweDAwMDAsIDB4MDAwMCwgMHg4MUY4LCAweDgxRjksCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODFGQSwKKyAgICAweDgxRkIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4MUZDLCAweDgxRkQsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDgxRkUsIDB4ODFGRiwgMHgwMDAwLCAweDAwMDAsIDB4ODIwMCwgMHg4MjAxLCAweDgyMDIsIDB4ODIwMywKKyAgICAweDgyMDQsIDB4ODIwNSwgMHg4MjA2LCAweDgyMDcsIDB4ODIwOCwgMHg4MjA5LCAweDgyMEEsIDB4ODIwQiwgMHg4MjBDLAorICAgIDB4ODIwRCwgMHg4MjBFLCAweDgyMEYsIDB4ODIxMCwgMHg4MjExLCAweDgyMTIsIDB4ODIxMywgMHg4MjE0LCAweDgyMTUsCisgICAgMHgyMDNFLCAweDIwNDAsIDB4ODIxNiwgMHg4MjE3LCAweDAwMDAsIDB4MDAwMCwgMHg4MjE4LCAweDgyMTksIDB4ODIxQSwKKyAgICAweDgyMUIsIDB4MDAwMCwgMHgwMDAwLCAweDgyMUMsIDB4ODIxRCwgMHg4MjFFLCAweDgyMUYsIDB4MjA0MiwgMHgyMDQ0LAorICAgIDB4ODIyMCwgMHg4MjIxLCAweDgyMjIsIDB4ODIyMywgMHgwMDAwLCAweDAwMDAsIDB4ODIyNCwgMHg4MjI1LCAweDgyMjYsCisgICAgMHg4MjI3LCAweDAwMDAsIDB4ODIyOCwgMHg4MjI5LCAweDgyMkEsIDB4ODIyQiwgMHg4MjJDLCAweDgyMkQsIDB4ODIyRSwKKyAgICAweDgyMkYsIDB4ODIzMCwgMHg4MjMxLCAweDAwMDAsIDB4MDAwMCwgMHg4MjMyLCAweDgyMzMsIDB4MDAwMCwgMHg4MjM0LAorICAgIDB4ODIzNSwgMHg4MjM2LCAweDgyMzcsIDB4MjA0NiwgMHgyMDQ4LCAweDgyMzgsIDB4ODIzOSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4MjNBLCAweDgyM0IsIDB4ODIzQywgMHg4MjNELCAweDgyM0UsIDB4ODIzRiwgMHgwMDAwLCAweDAwMDAsIDB4ODI0MCwKKyAgICAweDgyNDEsIDB4ODI0MiwgMHg4MjQzLCAweDgyNDQsIDB4ODI0NSwgMHgwMDAwLCAweDAwMDAsIDB4ODI0NiwgMHg4MjQ3LAorICAgIDB4ODI0OCwgMHg4MjQ5LCAweDgyNEEsIDB4ODI0QiwgMHg4MjRDLCAweDgyNEQsIDB4ODI0RSwgMHg4MjRGLCAweDgyNTAsCisgICAgMHg4MjUxLCAweDgyNTIsIDB4ODI1MywgMHg4MjU0LCAweDgyNTUsIDB4ODI1NiwgMHg4MjU3LCAweDgyNTgsIDB4ODI1OSwKKyAgICAweDgyNUEsIDB4ODI1QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4MjVDLCAweDgyNUQsIDB4ODI1RSwgMHg4MjVGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgyMDRBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMDRDLCAweDIwNEUsIDB4MjA1MCwKKyAgICAweDIwNTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgyMDU0LCAweDAwMDAsIDB4MjA1NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgyMDU4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwNUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwNUMsIDB4MDAwMCwgMHgwMDAwLCAweDIwNUUsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjA2MCwgMHgyMDYyLAorICAgIDB4MjA2NCwgMHgyMDY2LCAweDIwNjgsIDB4MjA2QSwgMHgyMDZDLCAweDIwNkUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwNzAsIDB4MjA3MiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjA3NCwgMHgyMDc2LCAweDAwMDAsIDB4MjA3OCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgyMDdBLCAweDAwMDAsIDB4MDAwMCwgMHgyMDdDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMDdFLCAweDIwODAsIDB4MjA4MiwgMHgwMDAwLCAweDAwMDAsIDB4MjA4NCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwODYsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MjA4OCwgMHgyMDhBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgyMDhDLCAweDIwOEUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjA5MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjA5MiwgMHgyMDk0LCAweDIwOTYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwOTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjA5QSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwOUMsIDB4MjA5RSwgMHgwMDAwLCAweDIwQTAsIDB4MjBBMiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgyMEE0LCAweDIwQTYsIDB4MjBBOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDIwQUEsIDB4MDAwMCwgMHgyMEFDLCAweDIwQUUsIDB4MjBCMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMEIyLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MjBCNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjBCNiwgMHgyMEI4LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODI2MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgyMEJBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MjBCQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwQkUsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwQzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMEMyLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMEM0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjBDNiwgMHgwMDAwLCAweDIwQzgsIDB4MjBDQSwgMHgyMENDLAorICAgIDB4MjBDRSwgMHgyMEQwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgyMEQyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MjBENCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDIwRDYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMEQ4LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgyMERBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjBEQywgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MjBERSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMEUwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDgyNjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMEUyLCAweDAwMDAsIDB4MjBFNCwKKyAgICAweDAwMDAsIDB4MjBFNiwgMHgwMDAwLCAweDIwRTgsIDB4MDAwMCwgMHgyMEVBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MjBFQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjBFRSwgMHgwMDAwLCAweDIwRjAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MjBGMiwgMHgyMEY0LCAweDAwMDAsIDB4MjBGNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODI2MiwgMHg4MjYzLAorICAgIDB4ODI2NCwgMHg4MjY1LCAweDgyNjYsIDB4ODI2NywgMHg4MjY4LCAweDgyNjksIDB4ODI2QSwgMHg4MjZCLCAweDgyNkMsCisgICAgMHg4MjZELCAweDgyNkUsIDB4ODI2RiwgMHg4MjcwLCAweDAwMDAsIDB4ODI3MSwgMHg4MjcyLCAweDgyNzMsIDB4ODI3NCwKKyAgICAweDgyNzUsIDB4ODI3NiwgMHg4Mjc3LCAweDgyNzgsIDB4ODI3OSwgMHg4MjdBLCAweDgyN0IsIDB4ODI3QywgMHg4MjdELAorICAgIDB4ODI3RSwgMHg4MjdGLCAweDgyODAsIDB4ODI4MSwgMHg4MjgyLCAweDAwMDAsIDB4ODI4MywgMHg4Mjg0LCAweDgyODUsCisgICAgMHg4Mjg2LCAweDgyODcsIDB4ODI4OCwgMHg4Mjg5LCAweDgyOEEsIDB4ODI4QiwgMHg4MjhDLCAweDgyOEQsIDB4ODI4RSwKKyAgICAweDgyOEYsIDB4ODI5MCwgMHg4MjkxLCAweDgyOTIsIDB4ODI5MywgMHg4Mjk0LCAweDgyOTUsIDB4ODI5NiwgMHg4Mjk3LAorICAgIDB4ODI5OCwgMHg4Mjk5LCAweDgyOUEsIDB4ODI5QiwgMHg4MjlDLCAweDgyOUQsIDB4ODI5RSwgMHgwMDAwLCAweDgyOUYsCisgICAgMHg4MkEwLCAweDgyQTEsIDB4ODJBMiwgMHg4MkEzLCAweDgyQTQsIDB4ODJBNSwgMHg4MkE2LCAweDgyQTcsIDB4ODJBOCwKKyAgICAweDgyQTksIDB4ODJBQSwgMHg4MkFCLCAweDAwMDAsIDB4MjBGOCwgMHg4MkFDLCAweDAwMDAsIDB4ODJBRCwgMHg4MkFFLAorICAgIDB4ODJBRiwgMHg4MkIwLCAweDgyQjEsIDB4ODJCMiwgMHg4MkIzLCAweDgyQjQsIDB4ODJCNSwgMHg4MkI2LCAweDgyQjcsCisgICAgMHg4MkI4LCAweDgyQjksIDB4ODJCQSwgMHg4MkJCLCAweDgyQkMsIDB4ODJCRCwgMHg4MkJFLCAweDgyQkYsIDB4ODJDMCwKKyAgICAweDgyQzEsIDB4ODJDMiwgMHg4MkMzLCAweDgyQzQsIDB4ODJDNSwgMHg4MkM2LCAweDAwMDAsIDB4ODJDNywgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4MkM4LCAweDgyQzksIDB4ODJDQSwgMHg4MkNCLCAweDgyQ0MsIDB4ODJDRCwgMHg4MkNFLCAweDgyQ0YsCisgICAgMHg4MkQwLCAweDgyRDEsIDB4ODJEMiwgMHg4MkQzLCAweDgyRDQsIDB4ODJENSwgMHg4MkQ2LCAweDgyRDcsIDB4ODJEOCwKKyAgICAweDgyRDksIDB4ODJEQSwgMHg4MkRCLCAweDgyREMsIDB4ODJERCwgMHg4MkRFLCAweDgyREYsIDB4ODJFMCwgMHg4MkUxLAorICAgIDB4ODJFMiwgMHg4MkUzLCAweDgyRTQsIDB4ODJFNSwgMHg4MkU2LCAweDgyRTcsIDB4ODJFOCwgMHg4MkU5LCAweDgyRUEsCisgICAgMHg4MkVCLCAweDgyRUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDgyRUQsIDB4ODJFRSwgMHg4MkVGLCAweDgyRjAsIDB4ODJGMSwgMHg4MkYyLAorICAgIDB4ODJGMywgMHg4MkY0LCAweDgyRjUsIDB4ODJGNiwgMHg4MkY3LCAweDgyRjgsIDB4ODJGOSwgMHg4MkZBLCAweDgyRkIsCisgICAgMHg4MkZDLCAweDgyRkQsIDB4ODJGRSwgMHg4MkZGLCAweDgzMDAsIDB4ODMwMSwgMHg4MzAyLCAweDgzMDMsIDB4ODMwNCwKKyAgICAweDgzMDUsIDB4ODMwNiwgMHg4MzA3LCAweDgzMDgsIDB4ODMwOSwgMHg4MzBBLCAweDgzMEIsIDB4ODMwQywgMHg4MzBELAorICAgIDB4ODMwRSwgMHg4MzBGLCAweDgzMTAsIDB4ODMxMSwgMHg4MzEyLCAweDgzMTMsIDB4ODMxNCwgMHg4MzE1LCAweDgzMTYsCisgICAgMHg4MzE3LCAweDgzMTgsIDB4ODMxOSwgMHg4MzFBLCAweDgzMUIsIDB4ODMxQywgMHg4MzFELCAweDgzMUUsIDB4ODMxRiwKKyAgICAweDgzMjAsIDB4ODMyMSwgMHg4MzIyLCAweDgzMjMsIDB4ODMyNCwgMHg4MzI1LCAweDgzMjYsIDB4ODMyNywgMHg4MzI4LAorICAgIDB4ODMyOSwgMHg4MzJBLCAweDgzMkIsIDB4ODMyQywgMHg4MzJELCAweDgzMkUsIDB4ODMyRiwgMHg4MzMwLCAweDgzMzEsCisgICAgMHg4MzMyLCAweDgzMzMsIDB4ODMzNCwgMHg4MzM1LCAweDgzMzYsIDB4ODMzNywgMHg4MzM4LCAweDgzMzksIDB4ODMzQSwKKyAgICAweDgzM0IsIDB4ODMzQywgMHg4MzNELCAweDgzM0UsIDB4ODMzRiwgMHg4MzQwLCAweDgzNDEsIDB4ODM0MiwgMHg4MzQzLAorICAgIDB4ODM0NCwgMHg4MzQ1LCAweDgzNDYsIDB4ODM0NywgMHg4MzQ4LCAweDgzNDksIDB4ODM0QSwgMHg4MzRCLCAweDgzNEMsCisgICAgMHg4MzRELCAweDgzNEUsIDB4ODM0RiwgMHg4MzUwLCAweDgzNTEsIDB4ODM1MiwgMHg4MzUzLCAweDgzNTQsIDB4ODM1NSwKKyAgICAweDgzNTYsIDB4ODM1NywgMHg4MzU4LCAweDgzNTksIDB4ODM1QSwgMHg4MzVCLCAweDgzNUMsIDB4ODM1RCwgMHg4MzVFLAorICAgIDB4ODM1RiwgMHg4MzYwLCAweDgzNjEsIDB4ODM2MiwgMHg4MzYzLCAweDgzNjQsIDB4ODM2NSwgMHg4MzY2LCAweDgzNjcsCisgICAgMHg4MzY4LCAweDgzNjksIDB4ODM2QSwgMHg4MzZCLCAweDgzNkMsIDB4ODM2RCwgMHg4MzZFLCAweDgzNkYsIDB4ODM3MCwKKyAgICAweDgzNzEsIDB4ODM3MiwgMHg4MzczLCAweDgzNzQsIDB4ODM3NSwgMHg4Mzc2LCAweDgzNzcsIDB4ODM3OCwgMHg4Mzc5LAorICAgIDB4ODM3QSwgMHg4MzdCLCAweDgzN0MsIDB4ODM3RCwgMHg4MzdFLCAweDgzN0YsIDB4ODM4MCwgMHg4MzgxLCAweDgzODIsCisgICAgMHg4MzgzLCAweDgzODQsIDB4ODM4NSwgMHg4Mzg2LCAweDgzODcsIDB4ODM4OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODM4OSwgMHg4MzhBLCAweDgzOEIsIDB4ODM4QywgMHg4MzhELCAweDgzOEUsIDB4ODM4RiwgMHg4MzkwLAorICAgIDB4ODM5MSwgMHg4MzkyLCAweDgzOTMsIDB4ODM5NCwgMHg4Mzk1LCAweDgzOTYsIDB4ODM5NywgMHg4Mzk4LCAweDgzOTksCisgICAgMHg4MzlBLCAweDgzOUIsIDB4ODM5QywgMHg4MzlELCAweDgzOUUsIDB4ODM5RiwgMHg4M0EwLCAweDgzQTEsIDB4ODNBMiwKKyAgICAweDgzQTMsIDB4ODNBNCwgMHg4M0E1LCAweDgzQTYsIDB4ODNBNywgMHg4M0E4LCAweDgzQTksIDB4ODNBQSwgMHg4M0FCLAorICAgIDB4ODNBQywgMHg4M0FELCAweDgzQUUsIDB4ODNBRiwgMHg4M0IwLCAweDgzQjEsIDB4ODNCMiwgMHg4M0IzLCAweDgzQjQsCisgICAgMHg4M0I1LCAweDgzQjYsIDB4ODNCNywgMHg4M0I4LCAweDgzQjksIDB4ODNCQSwgMHg4M0JCLCAweDgzQkMsIDB4ODNCRCwKKyAgICAweDgzQkUsIDB4ODNCRiwgMHg4M0MwLCAweDgzQzEsIDB4ODNDMiwgMHg4M0MzLCAweDgzQzQsIDB4ODNDNSwgMHg4M0M2LAorICAgIDB4ODNDNywgMHg4M0M4LCAweDgzQzksIDB4ODNDQSwgMHg4M0NCLCAweDgzQ0MsIDB4ODNDRCwgMHg4M0NFLCAweDgzQ0YsCisgICAgMHg4M0QwLCAweDgzRDEsIDB4ODNEMiwgMHg4M0QzLCAweDgzRDQsIDB4ODNENSwgMHg4M0Q2LCAweDgzRDcsIDB4ODNEOCwKKyAgICAweDgzRDksIDB4ODNEQSwgMHg4M0RCLCAweDgzREMsIDB4ODNERCwgMHg4M0RFLCAweDgzREYsIDB4ODNFMCwgMHg4M0UxLAorICAgIDB4ODNFMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4M0UzLCAweDgzRTQsCisgICAgMHg4M0U1LCAweDgzRTYsIDB4ODNFNywgMHg4M0U4LCAweDgzRTksIDB4ODNFQSwgMHg4M0VCLCAweDgzRUMsIDB4ODNFRCwKKyAgICAweDgzRUUsIDB4ODNFRiwgMHg4M0YwLCAweDgzRjEsIDB4ODNGMiwgMHg4M0YzLCAweDgzRjQsIDB4ODNGNSwgMHg4M0Y2LAorICAgIDB4ODNGNywgMHg4M0Y4LCAweDAwMDAsIDB4MDAwMCwgMHg4M0Y5LCAweDgzRkEsIDB4ODNGQiwgMHg4M0ZDLCAweDgzRkQsCisgICAgMHg4M0ZFLCAweDAwMDAsIDB4MDAwMCwgMHg4M0ZGLCAweDg0MDAsIDB4ODQwMSwgMHg4NDAyLCAweDg0MDMsIDB4ODQwNCwKKyAgICAweDg0MDUsIDB4ODQwNiwgMHg4NDA3LCAweDg0MDgsIDB4ODQwOSwgMHg4NDBBLCAweDg0MEIsIDB4ODQwQywgMHg4NDBELAorICAgIDB4ODQwRSwgMHg4NDBGLCAweDg0MTAsIDB4ODQxMSwgMHg4NDEyLCAweDg0MTMsIDB4ODQxNCwgMHg4NDE1LCAweDg0MTYsCisgICAgMHg4NDE3LCAweDg0MTgsIDB4ODQxOSwgMHg4NDFBLCAweDg0MUIsIDB4ODQxQywgMHg4NDFELCAweDg0MUUsIDB4ODQxRiwKKyAgICAweDg0MjAsIDB4ODQyMSwgMHg4NDIyLCAweDg0MjMsIDB4ODQyNCwgMHgwMDAwLCAweDAwMDAsIDB4ODQyNSwgMHg4NDI2LAorICAgIDB4ODQyNywgMHg4NDI4LCAweDg0MjksIDB4ODQyQSwgMHgwMDAwLCAweDAwMDAsIDB4ODQyQiwgMHg4NDJDLCAweDg0MkQsCisgICAgMHg4NDJFLCAweDg0MkYsIDB4ODQzMCwgMHg4NDMxLCAweDg0MzIsIDB4MDAwMCwgMHg4NDMzLCAweDAwMDAsIDB4ODQzNCwKKyAgICAweDAwMDAsIDB4ODQzNSwgMHgwMDAwLCAweDg0MzYsIDB4ODQzNywgMHg4NDM4LCAweDg0MzksIDB4ODQzQSwgMHg4NDNCLAorICAgIDB4ODQzQywgMHg4NDNELCAweDg0M0UsIDB4ODQzRiwgMHg4NDQwLCAweDg0NDEsIDB4ODQ0MiwgMHg4NDQzLCAweDg0NDQsCisgICAgMHg4NDQ1LCAweDg0NDYsIDB4ODQ0NywgMHg4NDQ4LCAweDg0NDksIDB4ODQ0QSwgMHg4NDRCLCAweDg0NEMsIDB4ODQ0RCwKKyAgICAweDg0NEUsIDB4ODQ0RiwgMHg4NDUwLCAweDg0NTEsIDB4ODQ1MiwgMHg4NDUzLCAweDg0NTQsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODQ1NSwgMHg4NDU2LCAweDg0NTcsIDB4ODQ1OCwgMHg4NDU5LCAweDg0NUEsIDB4ODQ1QiwgMHg4NDVDLCAweDg0NUQsCisgICAgMHg4NDVFLCAweDg0NUYsIDB4ODQ2MCwgMHg4NDYxLCAweDg0NjIsIDB4ODQ2MywgMHg4NDY0LCAweDg0NjUsIDB4ODQ2NiwKKyAgICAweDg0NjcsIDB4ODQ2OCwgMHg4NDY5LCAweDg0NkEsIDB4ODQ2QiwgMHg4NDZDLCAweDg0NkQsIDB4ODQ2RSwgMHg4NDZGLAorICAgIDB4ODQ3MCwgMHg4NDcxLCAweDg0NzIsIDB4ODQ3MywgMHg4NDc0LCAweDg0NzUsIDB4ODQ3NiwgMHg4NDc3LCAweDg0NzgsCisgICAgMHg4NDc5LCAweDg0N0EsIDB4ODQ3QiwgMHg4NDdDLCAweDg0N0QsIDB4ODQ3RSwgMHg4NDdGLCAweDg0ODAsIDB4ODQ4MSwKKyAgICAweDg0ODIsIDB4ODQ4MywgMHg4NDg0LCAweDg0ODUsIDB4ODQ4NiwgMHg4NDg3LCAweDg0ODgsIDB4ODQ4OSwgMHgwMDAwLAorICAgIDB4ODQ4QSwgMHg4NDhCLCAweDg0OEMsIDB4ODQ4RCwgMHg4NDhFLCAweDg0OEYsIDB4ODQ5MCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NDkxLCAweDg0OTIsIDB4ODQ5MywgMHgwMDAwLCAweDg0OTQsIDB4ODQ5NSwKKyAgICAweDg0OTYsIDB4ODQ5NywgMHg4NDk4LCAweDg0OTksIDB4ODQ5QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NDlCLAorICAgIDB4ODQ5QywgMHg4NDlELCAweDg0OUUsIDB4MDAwMCwgMHgwMDAwLCAweDg0OUYsIDB4ODRBMCwgMHg4NEExLCAweDg0QTIsCisgICAgMHg4NEEzLCAweDg0QTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NEE1LCAweDg0QTYsIDB4ODRBNywKKyAgICAweDg0QTgsIDB4ODRBOSwgMHg4NEFBLCAweDg0QUIsIDB4ODRBQywgMHg4NEFELCAweDg0QUUsIDB4ODRBRiwgMHg4NEIwLAorICAgIDB4ODRCMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODRCMiwgMHg4NEIzLCAweDg0QjQsCisgICAgMHgwMDAwLCAweDg0QjUsIDB4ODRCNiwgMHg4NEI3LCAweDg0QjgsIDB4ODRCOSwgMHg4NEJBLCAweDg0QkIsIDB4ODRCQywKKyAgICAweDg0QkQsIDB4MDAwMCwgMHg4NEJFLCAweDg0QkYsIDB4ODRDMCwgMHg4NEMxLCAweDg0QzIsIDB4ODRDMywgMHg4NEM0LAorICAgIDB4ODRDNSwgMHg4NEM2LCAweDg0QzcsIDB4ODRDOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg0QzksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg0Q0EsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg0Q0IsIDB4MjBGQSwgMHgzMDA5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg0Q0MsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjBGQywKKyAgICAweDMwMEMsIDB4MDAwMCwgMHgyMEZFLCAweDMwMEYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTAwLAorICAgIDB4MDAwMCwgMHgyMTAyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDIxMDQsIDB4MjEwNiwgMHgyMTA4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg0MDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NENELCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg0Q0UsIDB4ODRDRiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4NEQwLCAweDg0RDEsIDB4ODREMiwgMHg4NEQzLCAweDg0RDQsIDB4ODRENSwgMHg4NEQ2LCAweDg0RDcsCisgICAgMHg4NEQ4LCAweDg0RDksIDB4ODREQSwgMHg4NERCLCAweDg0REMsIDB4ODRERCwgMHg4NERFLCAweDg0REYsIDB4ODRFMCwKKyAgICAweDg0RTEsIDB4ODRFMiwgMHg4NEUzLCAweDg0RTQsIDB4ODRFNSwgMHg4NEU2LCAweDg0RTcsIDB4ODRFOCwgMHg4NEU5LAorICAgIDB4ODRFQSwgMHgwMDAwLCAweDg0RUIsIDB4ODRFQywgMHg4NEVELCAweDg0RUUsIDB4ODRFRiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTBBLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MzAxMiwgMHgzMDE1LCAweDg0RjAsCisgICAgMHgyMTBDLCAweDAwMDAsIDB4MzAxOCwgMHgzMDFCLCAweDg0RjEsIDB4MDAwMCwgMHgyMTBFLCAweDg0RjIsIDB4ODRGMywKKyAgICAweDg0RjQsIDB4ODRGNSwgMHg4NEY2LCAweDg0RjcsIDB4ODRGOCwgMHg4NEY5LCAweDg0RkEsIDB4ODRGQiwgMHgwMDAwLAorICAgIDB4ODRGQywgMHgyMTEwLCAweDAwMDAsIDB4MDAwMCwgMHg4NEZELCAweDg0RkUsIDB4ODRGRiwgMHg4NTAwLCAweDg1MDEsCisgICAgMHg4NTAyLCAweDg1MDMsIDB4MjExMiwgMHgzMDFFLCAweDIxMTQsIDB4ODUwNCwgMHg4NTA1LCAweDAwMDAsIDB4ODUwNiwKKyAgICAweDg1MDcsIDB4ODUwOCwgMHgwMDAwLCAweDg1MDksIDB4ODUwQSwgMHg4NTBCLCAweDg1MEMsIDB4ODUwRCwgMHg4NTBFLAorICAgIDB4ODUwRiwgMHg4NTEwLCAweDAwMDAsIDB4ODUxMSwgMHg4NTEyLCAweDg1MTMsIDB4ODUxNCwgMHg4NTE1LCAweDg1MTYsCisgICAgMHg4NTE3LCAweDAwMDAsIDB4MzAyMSwgMHg4NTE4LCAweDg1MTksIDB4ODUxQSwgMHg4NTFCLCAweDg1MUMsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg1MUQsIDB4ODUxRSwgMHg4NTFGLCAweDg1MjAsIDB4ODUyMSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDMwMjQsIDB4MzAyNywgMHg0MDA1LCAweDMwMkEsCisgICAgMHgzMDJELCAweDMwMzAsIDB4MzAzMywgMHgzMDM2LCAweDMwMzksIDB4MzAzQywgMHgzMDNGLCAweDMwNDIsIDB4MzA0NSwKKyAgICAweDMwNDgsIDB4MzA0QiwgMHgyMTE2LCAweDg1MjIsIDB4MjExOCwgMHgzMDRFLCAweDIxMUEsIDB4ODUyMywgMHgyMTFDLAorICAgIDB4MzA1MSwgMHg0MDBBLCAweDIxMUUsIDB4ODUyNCwgMHgyMTIwLCAweDMwNTQsIDB4ODUyNSwgMHg4NTI2LCAweDg1MjcsCisgICAgMHg4NTI4LCAweDg1MjksIDB4MjEyMiwgMHgzMDU3LCAweDIxMjQsIDB4ODUyQSwgMHgyMTI2LCAweDMwNUEsIDB4NDAwRiwKKyAgICAweDIxMjgsIDB4ODUyQiwgMHgyMTJBLCAweDMwNUQsIDB4ODUyQywgMHg4NTJELCAweDg1MkUsIDB4ODUyRiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDMwNjAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjEyQywgMHgyMTJFLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDIxMzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjEzMiwgMHgyMTM0LCAweDIxMzYsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NTMwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4NTMxLCAweDAwMDAsIDB4MDAwMCwgMHg4NTMyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgyMTM4LCAweDAwMDAsIDB4MjEzQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgyMTNDLCAweDMwNjMsIDB4MDAwMCwgMHgyMTNFLCAweDMwNjYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjE0MCwgMHgwMDAwLCAweDAwMDAsIDB4MjE0MiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgyMTQ0LCAweDAwMDAsIDB4MjE0NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTQ4LCAweDAwMDAsCisgICAgMHgyMTRBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgyMTRDLCAweDIxNEUsIDB4MjE1MCwgMHgyMTUyLCAweDIxNTQsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MjE1NiwgMHgyMTU4LCAweDAwMDAsIDB4MDAwMCwgMHgyMTVBLCAweDIxNUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMTVFLCAweDIxNjAsIDB4MDAwMCwgMHgwMDAwLCAweDIxNjIsIDB4MjE2NCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgyMTY2LCAweDIxNjgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDIxNkEsIDB4MjE2QywgMHgyMTZFLCAweDIxNzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MjE3MiwgMHgyMTc0LCAweDIxNzYsIDB4MjE3OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDIxN0EsIDB4MjE3QywgMHgyMTdFLCAweDIxODAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODUzMywgMHg4NTM0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDMwNjksIDB4MzA2QywgMHgzMDZGLCAweDMwNzIsIDB4MzA3NSwgMHgzMDc4LCAweDMwN0IsIDB4MzA3RSwgMHgyMTgyLAorICAgIDB4MjE4NCwgMHgyMTg2LCAweDIxODgsIDB4MjE4QSwgMHgyMThDLCAweDIxOEUsIDB4MjE5MCwgMHgzMDgxLCAweDMwODQsCisgICAgMHgzMDg3LCAweDMwOEEsIDB4MzA4RCwgMHgzMDkwLCAweDMwOTMsIDB4MzA5NiwgMHgzMDk5LCAweDIxOTIsIDB4MzA5QywKKyAgICAweDMwOUYsIDB4MjE5NCwgMHgyMTk2LCAweDIxOTgsIDB4MjE5QSwgMHgyMTlDLCAweDMwQTIsIDB4ODUzNSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODUzNiwgMHg4NTM3LCAweDg1MzgsCisgICAgMHg4NTM5LCAweDg1M0EsIDB4ODUzQiwgMHg4NTNDLCAweDg1M0QsIDB4ODUzRSwgMHgyMTlFLCAweDIxQTAsIDB4MjFBMiwKKyAgICAweDIxQTQsIDB4MjFBNiwgMHgyMUE4LCAweDIxQUEsIDB4MjFBQywgMHgyMUFFLCAweDIxQjAsIDB4MjFCMiwgMHgzMEE1LAorICAgIDB4MzBBOCwgMHgzMEFCLCAweDMwQUUsIDB4MzBCMSwgMHgzMEI0LCAweDMwQjcsIDB4MzBCQSwgMHgzMEJELCAweDQwMTQsCisgICAgMHg0MDE5LCAweDQwMUUsIDB4NDAyMywgMHg0MDI4LCAweDQwMkQsIDB4NDAzMiwgMHg0MDM3LCAweDQwM0MsIDB4NDA0MSwKKyAgICAweDQwNDYsIDB4MjFCNCwgMHgyMUI2LCAweDIxQjgsIDB4MjFCQSwgMHgyMUJDLCAweDIxQkUsIDB4MjFDMCwgMHgyMUMyLAorICAgIDB4MjFDNCwgMHgzMEMwLCAweDMwQzMsIDB4MzBDNiwgMHgzMEM5LCAweDMwQ0MsIDB4MzBDRiwgMHgzMEQyLCAweDMwRDUsCisgICAgMHgzMEQ4LCAweDMwREIsIDB4MzBERSwgMHgzMEUxLCAweDMwRTQsIDB4MzBFNywgMHgzMEVBLCAweDMwRUQsIDB4MzBGMCwKKyAgICAweDMwRjMsIDB4MzBGNiwgMHgzMEY5LCAweDMwRkMsIDB4MzBGRiwgMHgzMTAyLCAweDMxMDUsIDB4MzEwOCwgMHgzMTBCLAorICAgIDB4MzEwRSwgMHgzMTExLCAweDMxMTQsIDB4MzExNywgMHgzMTFBLCAweDMxMUQsIDB4MzEyMCwgMHgzMTIzLCAweDMxMjYsCisgICAgMHgzMTI5LCAweDMxMkMsIDB4ODUzRiwgMHg4NTQwLCAweDg1NDEsIDB4ODU0MiwgMHg4NTQzLCAweDg1NDQsIDB4ODU0NSwKKyAgICAweDg1NDYsIDB4ODU0NywgMHg4NTQ4LCAweDg1NDksIDB4ODU0QSwgMHg4NTRCLCAweDg1NEMsIDB4ODU0RCwgMHg4NTRFLAorICAgIDB4ODU0RiwgMHg4NTUwLCAweDg1NTEsIDB4ODU1MiwgMHg4NTUzLCAweDg1NTQsIDB4ODU1NSwgMHg4NTU2LCAweDg1NTcsCisgICAgMHg4NTU4LCAweDg1NTksIDB4ODU1QSwgMHg4NTVCLCAweDg1NUMsIDB4ODU1RCwgMHg4NTVFLCAweDg1NUYsIDB4ODU2MCwKKyAgICAweDg1NjEsIDB4ODU2MiwgMHg4NTYzLCAweDg1NjQsIDB4ODU2NSwgMHg4NTY2LCAweDg1NjcsIDB4ODU2OCwgMHg4NTY5LAorICAgIDB4ODU2QSwgMHg4NTZCLCAweDg1NkMsIDB4ODU2RCwgMHg4NTZFLCAweDg1NkYsIDB4ODU3MCwgMHg4NTcxLCAweDg1NzIsCisgICAgMHg4NTczLCAweDIxQzYsIDB4MjFDOCwgMHgyMUNBLCAweDIxQ0MsIDB4MjFDRSwgMHgyMUQwLCAweDIxRDIsIDB4MjFENCwKKyAgICAweDIxRDYsIDB4MjFEOCwgMHg4NTc0LCAweDg1NzUsIDB4ODU3NiwgMHg4NTc3LCAweDg1NzgsIDB4ODU3OSwgMHg4NTdBLAorICAgIDB4ODU3QiwgMHg4NTdDLCAweDIxREEsIDB4ODU3RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg1N0UsIDB4ODU3RiwgMHg4NTgwLCAweDg1ODEsIDB4ODU4MiwKKyAgICAweDg1ODMsIDB4ODU4NCwgMHg4NTg1LCAweDg1ODYsIDB4MjFEQywgMHg4NTg3LCAweDg1ODgsIDB4ODU4OSwgMHg4NThBLAorICAgIDB4ODU4QiwgMHg4NThDLCAweDg1OEQsIDB4ODU4RSwgMHg4NThGLCAweDIxREUsIDB4ODU5MCwgMHg4NTkxLCAweDg1OTIsCisgICAgMHg4NTkzLCAweDg1OTQsIDB4ODU5NSwgMHg4NTk2LCAweDg1OTcsIDB4ODU5OCwgMHgyMUUwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4NDA0QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgzMTJGLCAweDIxRTIsIDB4MzEzMiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MjFFNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg1OTksIDB4ODU5QSwgMHg4NTlCLCAweDg1OUMsIDB4ODU5RCwgMHg4NTlFLCAweDg1OUYsCisgICAgMHg4NUEwLCAweDg1QTEsIDB4ODVBMiwgMHg4NUEzLCAweDg1QTQsIDB4ODVBNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODVBNiwgMHg4NUE3LCAweDg1QTgsIDB4ODVBOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODVBQSwgMHg4NUFCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODVBQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg1QUQsIDB4ODVBRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODVBRiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4NUIwLCAweDAwMDAsIDB4ODVCMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODVCMiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg1QjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg1QjQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg1QjUsIDB4ODVCNiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg1QjcsIDB4ODVCOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg1QjksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NUJBLAorICAgIDB4ODVCQiwgMHg4NUJDLCAweDg1QkQsIDB4ODVCRSwgMHg4NUJGLCAweDg1QzAsIDB4ODVDMSwgMHg4NUMyLCAweDg1QzMsCisgICAgMHg4NUM0LCAweDg1QzUsIDB4ODVDNiwgMHg4NUM3LCAweDg1QzgsIDB4ODVDOSwgMHg4NUNBLCAweDg1Q0IsIDB4ODVDQywKKyAgICAweDg1Q0QsIDB4ODVDRSwgMHg4NUNGLCAweDg1RDAsIDB4ODVEMSwgMHg4NUQyLCAweDg1RDMsIDB4ODVENCwgMHg4NUQ1LAorICAgIDB4ODVENiwgMHg4NUQ3LCAweDg1RDgsIDB4ODVEOSwgMHg4NURBLCAweDg1REIsIDB4ODVEQywgMHg4NURELCAweDg1REUsCisgICAgMHg4NURGLCAweDg1RTAsIDB4ODVFMSwgMHg4NUUyLCAweDg1RTMsIDB4ODVFNCwgMHg4NUU1LCAweDg1RTYsIDB4ODVFNywKKyAgICAweDg1RTgsIDB4ODVFOSwgMHg4NUVBLCAweDg1RUIsIDB4ODVFQywgMHg4NUVELCAweDg1RUUsIDB4ODVFRiwgMHg4NUYwLAorICAgIDB4ODVGMSwgMHg4NUYyLCAweDg1RjMsIDB4ODVGNCwgMHg4NUY1LCAweDg1RjYsIDB4ODVGNywgMHg4NUY4LCAweDg1RjksCisgICAgMHg4NUZBLCAweDg1RkIsIDB4ODVGQywgMHg4NUZELCAweDg1RkUsIDB4ODVGRiwgMHg4NjAwLCAweDg2MDEsIDB4ODYwMiwKKyAgICAweDg2MDMsIDB4ODYwNCwgMHg4NjA1LCAweDg2MDYsIDB4ODYwNywgMHg4NjA4LCAweDg2MDksIDB4ODYwQSwgMHg4NjBCLAorICAgIDB4ODYwQywgMHg4NjBELCAweDg2MEUsIDB4ODYwRiwgMHg4NjEwLCAweDg2MTEsIDB4ODYxMiwgMHg4NjEzLCAweDg2MTQsCisgICAgMHg4NjE1LCAweDg2MTYsIDB4ODYxNywgMHg4NjE4LCAweDg2MTksIDB4ODYxQSwgMHg4NjFCLCAweDg2MUMsIDB4ODYxRCwKKyAgICAweDg2MUUsIDB4ODYxRiwgMHg4NjIwLCAweDg2MjEsIDB4ODYyMiwgMHg4NjIzLCAweDg2MjQsIDB4ODYyNSwgMHg4NjI2LAorICAgIDB4ODYyNywgMHg4NjI4LCAweDg2MjksIDB4ODYyQSwgMHg4NjJCLCAweDg2MkMsIDB4ODYyRCwgMHg4NjJFLCAweDg2MkYsCisgICAgMHg4NjMwLCAweDg2MzEsIDB4ODYzMiwgMHg4NjMzLCAweDg2MzQsIDB4ODYzNSwgMHg4NjM2LCAweDg2MzcsIDB4ODYzOCwKKyAgICAweDg2MzksIDB4ODYzQSwgMHg4NjNCLCAweDg2M0MsIDB4ODYzRCwgMHg4NjNFLCAweDg2M0YsIDB4ODY0MCwgMHg4NjQxLAorICAgIDB4ODY0MiwgMHg4NjQzLCAweDg2NDQsIDB4ODY0NSwgMHg4NjQ2LCAweDg2NDcsIDB4ODY0OCwgMHg4NjQ5LCAweDg2NEEsCisgICAgMHg4NjRCLCAweDg2NEMsIDB4ODY0RCwgMHg4NjRFLCAweDg2NEYsIDB4ODY1MCwgMHg4NjUxLCAweDg2NTIsIDB4ODY1MywKKyAgICAweDg2NTQsIDB4ODY1NSwgMHg4NjU2LCAweDg2NTcsIDB4ODY1OCwgMHg4NjU5LCAweDg2NUEsIDB4ODY1QiwgMHg4NjVDLAorICAgIDB4ODY1RCwgMHg4NjVFLCAweDg2NUYsIDB4ODY2MCwgMHg4NjYxLCAweDg2NjIsIDB4ODY2MywgMHg4NjY0LCAweDg2NjUsCisgICAgMHg4NjY2LCAweDg2NjcsIDB4ODY2OCwgMHg4NjY5LCAweDg2NkEsIDB4ODY2QiwgMHg4NjZDLCAweDg2NkQsIDB4ODY2RSwKKyAgICAweDg2NkYsIDB4ODY3MCwgMHg4NjcxLCAweDg2NzIsIDB4ODY3MywgMHg4Njc0LCAweDg2NzUsIDB4ODY3NiwgMHg4Njc3LAorICAgIDB4ODY3OCwgMHg4Njc5LCAweDg2N0EsIDB4ODY3QiwgMHg4NjdDLCAweDg2N0QsIDB4ODY3RSwgMHg4NjdGLCAweDg2ODAsCisgICAgMHg4NjgxLCAweDg2ODIsIDB4ODY4MywgMHg4Njg0LCAweDg2ODUsIDB4ODY4NiwgMHg4Njg3LCAweDg2ODgsIDB4ODY4OSwKKyAgICAweDg2OEEsIDB4ODY4QiwgMHg4NjhDLCAweDg2OEQsIDB4ODY4RSwgMHg4NjhGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NjkwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NjkxLCAweDAwMDAsIDB4ODY5MiwgMHg4NjkzLCAweDg2OTQsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMUU2LCAweDAwMDAsCisgICAgMHgyMUU4LCAweDAwMDAsIDB4MjFFQSwgMHgwMDAwLCAweDIxRUMsIDB4MDAwMCwgMHgyMUVFLCAweDAwMDAsIDB4MjFGMCwKKyAgICAweDAwMDAsIDB4MjFGMiwgMHgwMDAwLCAweDIxRjQsIDB4MDAwMCwgMHgyMUY2LCAweDAwMDAsIDB4MjFGOCwgMHgwMDAwLAorICAgIDB4MjFGQSwgMHgwMDAwLCAweDIxRkMsIDB4MDAwMCwgMHgwMDAwLCAweDIxRkUsIDB4MDAwMCwgMHgyMjAwLCAweDAwMDAsCisgICAgMHgyMjAyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIyMDQsIDB4MjIwNiwKKyAgICAweDAwMDAsIDB4MjIwOCwgMHgyMjBBLCAweDAwMDAsIDB4MjIwQywgMHgyMjBFLCAweDAwMDAsIDB4MjIxMCwgMHgyMjEyLAorICAgIDB4MDAwMCwgMHgyMjE0LCAweDIyMTYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjIxOCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIyMUEsIDB4MjIxQywgMHgwMDAwLCAweDIyMUUsCisgICAgMHgyMjIwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjIyMiwgMHgwMDAwLCAweDIyMjQsIDB4MDAwMCwgMHgyMjI2LAorICAgIDB4MDAwMCwgMHgyMjI4LCAweDAwMDAsIDB4MjIyQSwgMHgwMDAwLCAweDIyMkMsIDB4MDAwMCwgMHgyMjJFLCAweDAwMDAsCisgICAgMHgyMjMwLCAweDAwMDAsIDB4MjIzMiwgMHgwMDAwLCAweDIyMzQsIDB4MDAwMCwgMHgyMjM2LCAweDAwMDAsIDB4MjIzOCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgyMjNBLCAweDAwMDAsIDB4MjIzQywgMHgwMDAwLCAweDIyM0UsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMjQwLCAweDIyNDIsIDB4MDAwMCwgMHgyMjQ0LCAweDIyNDYsCisgICAgMHgwMDAwLCAweDIyNDgsIDB4MjI0QSwgMHgwMDAwLCAweDIyNEMsIDB4MjI0RSwgMHgwMDAwLCAweDIyNTAsIDB4MjI1MiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIyNTQsIDB4MDAwMCwgMHgwMDAwLCAweDIyNTYsIDB4MjI1OCwKKyAgICAweDIyNUEsIDB4MjI1QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMjVFLCAweDIyNjAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4Njk1LCAweDg2OTYsIDB4ODY5NywgMHg4Njk4LCAweDg2OTksIDB4ODY5QSwgMHg4NjlCLAorICAgIDB4ODY5QywgMHg4NjlELCAweDg2OUUsIDB4ODY5RiwgMHg4NkEwLCAweDg2QTEsIDB4ODZBMiwgMHg4NkEzLCAweDg2QTQsCisgICAgMHg4NkE1LCAweDg2QTYsIDB4ODZBNywgMHg4NkE4LCAweDg2QTksIDB4ODZBQSwgMHg4NkFCLCAweDg2QUMsIDB4ODZBRCwKKyAgICAweDg2QUUsIDB4ODZBRiwgMHg4NkIwLCAweDg2QjEsIDB4ODZCMiwgMHg4NkIzLCAweDg2QjQsIDB4ODZCNSwgMHg4NkI2LAorICAgIDB4ODZCNywgMHg4NkI4LCAweDg2QjksIDB4ODZCQSwgMHg4NkJCLCAweDg2QkMsIDB4ODZCRCwgMHg4NkJFLCAweDg2QkYsCisgICAgMHg4NkMwLCAweDg2QzEsIDB4ODZDMiwgMHg4NkMzLCAweDg2QzQsIDB4ODZDNSwgMHg4NkM2LCAweDg2QzcsIDB4ODZDOCwKKyAgICAweDg2QzksIDB4ODZDQSwgMHg4NkNCLCAweDg2Q0MsIDB4ODZDRCwgMHg4NkNFLCAweDg2Q0YsIDB4ODZEMCwgMHg4NkQxLAorICAgIDB4ODZEMiwgMHg4NkQzLCAweDg2RDQsIDB4ODZENSwgMHg4NkQ2LCAweDg2RDcsIDB4ODZEOCwgMHg4NkQ5LCAweDg2REEsCisgICAgMHg4NkRCLCAweDg2REMsIDB4ODZERCwgMHg4NkRFLCAweDg2REYsIDB4ODZFMCwgMHg4NkUxLCAweDg2RTIsIDB4ODZFMywKKyAgICAweDg2RTQsIDB4ODZFNSwgMHg4NkU2LCAweDg2RTcsIDB4ODZFOCwgMHg4NkU5LCAweDg2RUEsIDB4ODZFQiwgMHg4NkVDLAorICAgIDB4ODZFRCwgMHg4NkVFLCAweDg2RUYsIDB4ODZGMCwgMHg4NkYxLCAweDg2RjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4NkYzLCAweDg2RjQsIDB4ODZGNSwgMHg4NkY2LCAweDg2RjcsIDB4ODZGOCwgMHg4NkY5LCAweDg2RkEsIDB4ODZGQiwKKyAgICAweDg2RkMsIDB4ODZGRCwgMHg4NkZFLCAweDg2RkYsIDB4ODcwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MzEzNSwgMHgzMTM4LCAweDMxM0IsIDB4MzEzRSwgMHgzMTQxLCAweDMxNDQsIDB4MzE0NywKKyAgICAweDMxNEEsIDB4MzE0RCwgMHgzMTUwLCAweDMxNTMsIDB4MzE1NiwgMHgzMTU5LCAweDMxNUMsIDB4NDA1MCwgMHg0MDU1LAorICAgIDB4NDA1QSwgMHg0MDVGLCAweDQwNjQsIDB4NDA2OSwgMHg0MDZFLCAweDQwNzMsIDB4NDA3OCwgMHg0MDdELCAweDQwODIsCisgICAgMHg0MDg3LCAweDQwOEMsIDB4NDA5MSwgMHg0MDk2LCAweDQwOUIsIDB4NDBBMywgMHgwMDAwLCAweDMxNUYsIDB4MzE2MiwKKyAgICAweDMxNjUsIDB4MzE2OCwgMHgzMTZCLCAweDMxNkUsIDB4MzE3MSwgMHgzMTc0LCAweDMxNzcsIDB4MzE3QSwgMHgzMTdELAorICAgIDB4MzE4MCwgMHgzMTgzLCAweDMxODYsIDB4MzE4OSwgMHgzMThDLCAweDMxOEYsIDB4MzE5MiwgMHgzMTk1LCAweDMxOTgsCisgICAgMHgzMTlCLCAweDMxOUUsIDB4MzFBMSwgMHgzMUE0LCAweDMxQTcsIDB4MzFBQSwgMHgzMUFELCAweDMxQjAsIDB4MzFCMywKKyAgICAweDMxQjYsIDB4MzFCOSwgMHgzMUJDLCAweDMxQkYsIDB4MzFDMiwgMHgzMUM1LCAweDMxQzgsIDB4ODcwMSwgMHg4NzAyLAorICAgIDB4ODcwMywgMHg4NzA0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDMxQ0IsIDB4MjI2MiwgMHgyMjY0LCAweDIyNjYsIDB4MjI2OCwgMHgyMjZBLCAweDIyNkMsIDB4MjI2RSwKKyAgICAweDIyNzAsIDB4MjI3MiwgMHgyMjc0LCAweDIyNzYsIDB4MjI3OCwgMHgyMjdBLCAweDIyN0MsIDB4MjI3RSwgMHg4NzA1LAorICAgIDB4ODcwNiwgMHg4NzA3LCAweDg3MDgsIDB4ODcwOSwgMHg4NzBBLCAweDg3MEIsIDB4ODcwQywgMHg4NzBELCAweDg3MEUsCisgICAgMHg4NzBGLCAweDg3MTAsIDB4ODcxMSwgMHg4NzEyLCAweDIyODAsIDB4MjI4MiwgMHgyMjg0LCAweDIyODYsIDB4MjI4OCwKKyAgICAweDIyOEEsIDB4MjI4QywgMHgyMjhFLCAweDIyOTAsIDB4MjI5MiwgMHgyMjk0LCAweDIyOTYsIDB4MjI5OCwgMHgyMjlBLAorICAgIDB4NDBBQSwgMHg0MEIwLCAweDIyOUMsIDB4MDAwMCwgMHg4NzEzLCAweDg3MTQsIDB4ODcxNSwgMHg4NzE2LCAweDg3MTcsCisgICAgMHg4NzE4LCAweDg3MTksIDB4ODcxQSwgMHg4NzFCLCAweDg3MUMsIDB4ODcxRCwgMHg4NzFFLCAweDg3MUYsIDB4ODcyMCwKKyAgICAweDg3MjEsIDB4ODcyMiwgMHg4NzIzLCAweDg3MjQsIDB4ODcyNSwgMHg4NzI2LCAweDg3MjcsIDB4ODcyOCwgMHg4NzI5LAorICAgIDB4ODcyQSwgMHg4NzJCLCAweDg3MkMsIDB4ODcyRCwgMHg4NzJFLCAweDg3MkYsIDB4ODczMCwgMHg4NzMxLCAweDg3MzIsCisgICAgMHg4NzMzLCAweDg3MzQsIDB4ODczNSwgMHg4NzM2LCAweDg3MzcsIDB4ODczOCwgMHg4NzM5LCAweDg3M0EsIDB4ODczQiwKKyAgICAweDg3M0MsIDB4ODczRCwgMHg4NzNFLCAweDg3M0YsIDB4ODc0MCwgMHg4NzQxLCAweDg3NDIsIDB4ODc0MywgMHgyMjlFLAorICAgIDB4MjJBMCwgMHgyMkEyLCAweDIyQTQsIDB4MjJBNiwgMHgyMkE4LCAweDIyQUEsIDB4MjJBQywgMHgyMkFFLCAweDIyQjAsCisgICAgMHgyMkIyLCAweDIyQjQsIDB4MjJCNiwgMHgyMkI4LCAweDIyQkEsIDB4MjJCQywgMHgyMkJFLCAweDIyQzAsIDB4MjJDMiwKKyAgICAweDIyQzQsIDB4MjJDNiwgMHgyMkM4LCAweDIyQ0EsIDB4MjJDQywgMHgzMUNFLCAweDMxRDEsIDB4MzFENCwgMHgyMkNFLAorICAgIDB4MzFENywgMHgyMkQwLCAweDMxREEsIDB4ODc0NCwgMHg4NzQ1LCAweDg3NDYsIDB4ODc0NywgMHg4NzQ4LCAweDg3NDksCisgICAgMHg4NzRBLCAweDg3NEIsIDB4ODc0QywgMHg4NzRELCAweDg3NEUsIDB4ODc0RiwgMHg4NzUwLCAweDg3NTEsIDB4ODc1MiwKKyAgICAweDg3NTMsIDB4ODc1NCwgMHg4NzU1LCAweDg3NTYsIDB4ODc1NywgMHg4NzU4LCAweDg3NTksIDB4ODc1QSwgMHg4NzVCLAorICAgIDB4ODc1QywgMHg4NzVELCAweDg3NUUsIDB4ODc1RiwgMHg4NzYwLCAweDg3NjEsIDB4ODc2MiwgMHg4NzYzLCAweDg3NjQsCisgICAgMHg4NzY1LCAweDg3NjYsIDB4ODc2NywgMHg4NzY4LCAweDg3NjksIDB4ODc2QSwgMHg4NzZCLCAweDg3NkMsIDB4ODc2RCwKKyAgICAweDg3NkUsIDB4ODc2RiwgMHg4NzcwLCAweDg3NzEsIDB4ODc3MiwgMHgwMDAwLCAweDQwQjUsIDB4NDBCQSwgMHg0MEJGLAorICAgIDB4MzFERCwgMHg0MEM0LCAweDMxRTAsIDB4MzFFMywgMHg0MEM5LCAweDQwQ0YsIDB4MzFFNiwgMHgzMUU5LCAweDMxRUMsCisgICAgMHg0MEQ0LCAweDQwRDksIDB4MzFFRiwgMHgzMUYyLCAweDIyRDIsIDB4MzFGNSwgMHg0MERFLCAweDQwRTMsIDB4MjJENCwKKyAgICAweDQwRTgsIDB4NDBFRSwgMHg0MEY1LCAweDMxRjgsIDB4NDBGQiwgMHg0MTAxLCAweDQxMDcsIDB4MzFGQiwgMHgzMUZFLAorICAgIDB4MzIwMSwgMHg0MTBDLCAweDQxMTEsIDB4NDExNywgMHgzMjA0LCAweDMyMDcsIDB4MzIwQSwgMHgyMkQ2LCAweDIyRDgsCisgICAgMHgyMkRBLCAweDIyREMsIDB4MzIwRCwgMHgzMjEwLCAweDQxMUMsIDB4MzIxMywgMHg0MTIyLCAweDQxMjcsIDB4MzIxNiwKKyAgICAweDIyREUsIDB4MjJFMCwgMHg0MTJELCAweDQxMzMsIDB4NDEzOCwgMHgzMjE5LCAweDQxM0UsIDB4MjJFMiwgMHgzMjFDLAorICAgIDB4MzIxRiwgMHgzMjIyLCAweDMyMjUsIDB4MzIyOCwgMHg0MTQ0LCAweDMyMkIsIDB4MjJFNCwgMHgzMjJFLCAweDMyMzEsCisgICAgMHgzMjM0LCAweDQxNDksIDB4MzIzNywgMHgzMjNBLCAweDMyM0QsIDB4NDE0RSwgMHg0MTU0LCAweDIyRTYsIDB4NDE1OSwKKyAgICAweDIyRTgsIDB4NDE1RiwgMHg0MTY0LCAweDMyNDAsIDB4MzI0MywgMHgzMjQ2LCAweDQxNjksIDB4MjJFQSwgMHgzMjQ5LAorICAgIDB4NDE2RSwgMHgyMkVDLCAweDQxNzMsIDB4MzI0QywgMHgyMkVFLCAweDIyRjAsIDB4MjJGMiwgMHgyMkY0LCAweDIyRjYsCisgICAgMHgyMkY4LCAweDIyRkEsIDB4MjJGQywgMHgyMkZFLCAweDIzMDAsIDB4MzI0RiwgMHgzMjUyLCAweDMyNTUsIDB4MzI1OCwKKyAgICAweDMyNUIsIDB4MzI1RSwgMHgzMjYxLCAweDMyNjQsIDB4MzI2NywgMHgzMjZBLCAweDMyNkQsIDB4MzI3MCwgMHgzMjczLAorICAgIDB4MzI3NiwgMHgzMjc5LCAweDMyN0MsIDB4MjMwMiwgMHgyMzA0LCAweDMyN0YsIDB4MjMwNiwgMHgyMzA4LCAweDIzMEEsCisgICAgMHgzMjgyLCAweDMyODUsIDB4MjMwQywgMHgyMzBFLCAweDIzMTAsIDB4MjMxMiwgMHgyMzE0LCAweDQxNzksIDB4MjMxNiwKKyAgICAweDIzMTgsIDB4MjMxQSwgMHgyMzFDLCAweDIzMUUsIDB4MjMyMCwgMHgyMzIyLCAweDIzMjQsIDB4MzI4OCwgMHg0MTdFLAorICAgIDB4MjMyNiwgMHgyMzI4LCAweDIzMkEsIDB4MjMyQywgMHgyMzJFLCAweDIzMzAsIDB4MjMzMiwgMHgzMjhCLCAweDMyOEUsCisgICAgMHgzMjkxLCAweDMyOTQsIDB4MjMzNCwgMHgyMzM2LCAweDIzMzgsIDB4MjMzQSwgMHgyMzNDLCAweDIzM0UsIDB4MjM0MCwKKyAgICAweDIzNDIsIDB4MjM0NCwgMHgyMzQ2LCAweDMyOTcsIDB4MzI5QSwgMHgyMzQ4LCAweDMyOUQsIDB4MzJBMCwgMHgzMkEzLAorICAgIDB4MjM0QSwgMHgzMkE2LCAweDMyQTksIDB4NDE4MywgMHgyMzRDLCAweDMyQUMsIDB4MzJBRiwgMHgzMkIyLCAweDMyQjUsCisgICAgMHg0MTg4LCAweDQxOEUsIDB4MjM0RSwgMHgyMzUwLCAweDIzNTIsIDB4MjM1NCwgMHgyMzU2LCAweDIzNTgsIDB4MjM1QSwKKyAgICAweDIzNUMsIDB4MjM1RSwgMHgyMzYwLCAweDIzNjIsIDB4MjM2NCwgMHgyMzY2LCAweDIzNjgsIDB4MjM2QSwgMHgyMzZDLAorICAgIDB4MjM2RSwgMHgyMzcwLCAweDQxOTUsIDB4MjM3MiwgMHgyMzc0LCAweDIzNzYsIDB4NDE5QSwgMHgzMkI4LCAweDIzNzgsCisgICAgMHgyMzdBLCAweDIzN0MsIDB4MjM3RSwgMHgyMzgwLCAweDIzODIsIDB4MjM4NCwgMHgyMzg2LCAweDIzODgsIDB4MjM4QSwKKyAgICAweDMyQkIsIDB4MjM4QywgMHgyMzhFLCAweDMyQkUsIDB4MzJDMSwgMHgyMzkwLCAweDQxOUYsIDB4MzJDNCwgMHgyMzkyLAorICAgIDB4MjM5NCwgMHgyMzk2LCAweDIzOTgsIDB4MzJDNywgMHgzMkNBLCAweDIzOUEsIDB4MjM5QywgMHgyMzlFLCAweDIzQTAsCisgICAgMHgyM0EyLCAweDIzQTQsIDB4MjNBNiwgMHgyM0E4LCAweDIzQUEsIDB4MzJDRCwgMHgzMkQwLCAweDMyRDMsIDB4MzJENiwKKyAgICAweDMyRDksIDB4MzJEQywgMHgzMkRGLCAweDMyRTIsIDB4MzJFNSwgMHgzMkU4LCAweDMyRUIsIDB4MzJFRSwgMHgzMkYxLAorICAgIDB4MzJGNCwgMHgzMkY3LCAweDMyRkEsIDB4MzJGRCwgMHgzMzAwLCAweDMzMDMsIDB4MzMwNiwgMHgzMzA5LCAweDMzMEMsCisgICAgMHgzMzBGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4NzczLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3NzQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Nzc1LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Nzc2LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODc3NywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Nzc4LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4Nzc5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODc3QSwgMHg4NzdCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3N0MsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4NzdELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc3RSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc3RiwgMHg4NzgwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg3ODEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NzgyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg3ODMsIDB4MDAwMCwgMHgwMDAwLCAweDg3ODQsIDB4MDAwMCwgMHg4Nzg1LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3ODYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Nzg3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Nzg4LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Nzg5LCAweDg3OEEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3OEIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODc4QywgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODc4RCwgMHgwMDAwLCAweDg3OEUsIDB4ODc4RiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NzkwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4NzkxLCAweDAwMDAsCisgICAgMHg4NzkyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3OTMsIDB4ODc5NCwgMHg4Nzk1LCAweDAwMDAsIDB4ODc5NiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3OTcsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4Nzk4LCAweDAwMDAsIDB4MDAwMCwgMHg4Nzk5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3OUEsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3OUIsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4NzlDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4NzlELCAweDAwMDAsIDB4MDAwMCwgMHg4NzlFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3OUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg3QTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4N0ExLCAweDAwMDAsIDB4ODdBMiwgMHgwMDAwLCAweDg3QTMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg3QTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdBNSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg3QTYsIDB4ODdBNywgMHgwMDAwLCAweDAwMDAsIDB4ODdBOCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QUEsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QUIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg3QUMsIDB4MDAwMCwgMHgwMDAwLCAweDg3QUQsIDB4ODdBRSwgMHg4N0FGLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0IwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0IxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg3QjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0IzLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0I0LCAweDAwMDAsIDB4ODdCNSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0I2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODdCNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QjgsIDB4ODdCOSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdCQSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QkIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0JDLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg3QkUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4N0JGLCAweDAwMDAsIDB4MDAwMCwgMHg4N0MwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODdDMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QzIsIDB4MDAwMCwgMHg4N0MzLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3QzQsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdDNSwgMHg4N0M2LCAweDAwMDAsIDB4ODdDNywgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg3QzgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdDOSwgMHgwMDAwLCAweDg3Q0EsIDB4ODdDQiwgMHgwMDAwLAorICAgIDB4ODdDQywgMHg4N0NELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3Q0UsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0NGLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODdEMCwgMHgwMDAwLCAweDg3RDEsIDB4MDAwMCwgMHg4N0QyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODdEMywgMHg4N0Q0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3RDUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4N0Q2LCAweDAwMDAsIDB4ODdENywgMHgwMDAwLCAweDg3RDgsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODdEOSwgMHgwMDAwLCAweDAwMDAsIDB4ODdEQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0RCLAorICAgIDB4MDAwMCwgMHg4N0RDLCAweDAwMDAsIDB4ODdERCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg3REUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODdERiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3RTAsIDB4MDAwMCwgMHg4N0UxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0UyLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODdFMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3RTQsIDB4MDAwMCwgMHg4N0U1LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdFNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg3RTcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0U4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg3RTksIDB4MDAwMCwgMHgwMDAwLCAweDg3RUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdFQiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODdFQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODdFRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODdFRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4N0VGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3RjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4N0YxLCAweDg3RjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0YzLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0Y0LCAweDAwMDAsIDB4ODdGNSwKKyAgICAweDAwMDAsIDB4ODdGNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0Y3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3RjgsIDB4ODdGOSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4N0ZBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3RkIsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4N0ZDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg3RkQsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg3RkUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4N0ZGLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MDEsIDB4MDAwMCwgMHg4ODAyLCAweDg4MDMsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODA1LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODA2LCAweDg4MDcsIDB4ODgwOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODgwOSwgMHgwMDAwLCAweDAwMDAsIDB4ODgwQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODgwQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODBDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgwRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MEUsIDB4MDAwMCwgMHgwMDAwLCAweDg4MEYsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MTAsIDB4ODgxMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODEyLCAweDAwMDAsIDB4MDAwMCwgMHg4ODEzLAorICAgIDB4MDAwMCwgMHg4ODE0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MTYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4ODE3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgxOCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4MTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODFBLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODgxQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MUMsIDB4MDAwMCwgMHg4ODFELAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4ODFFLCAweDg4MUYsIDB4ODgyMCwgMHgwMDAwLCAweDg4MjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODIyLCAweDg4MjMsIDB4ODgyNCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4ODI1LCAweDAwMDAsIDB4MDAwMCwgMHg4ODI2LCAweDg4MjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MjgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODgyOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgyQiwKKyAgICAweDAwMDAsIDB4ODgyQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MkQsIDB4ODgyRSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4ODJGLCAweDAwMDAsIDB4ODgzMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODMxLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg4MzIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MzMsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4MzQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4MzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODM2LCAweDAwMDAsIDB4ODgzNywgMHgwMDAwLCAweDAwMDAsIDB4ODgzOCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODM5LCAweDg4M0EsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgzQiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4ODNDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODgzRCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4ODNFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4ODNGLCAweDAwMDAsIDB4ODg0MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4ODQxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NDIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg0MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODQ1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4ODQ2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4ODQ3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4NDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg0OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODg0QSwgMHg4ODRCLCAweDg4NEMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg0RCwgMHg4ODRFLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4NEYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4ODUwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODUxLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODUyLAorICAgIDB4MDAwMCwgMHg4ODUzLCAweDg4NTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg4NTUsIDB4MDAwMCwgMHg4ODU2LCAweDAwMDAsIDB4MDAwMCwgMHg4ODU3LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODU5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODg1QSwgMHgwMDAwLCAweDg4NUIsIDB4ODg1QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODVELCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODg1RiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODg2MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg4NjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4NjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODY0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODg2NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODY2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODY3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg2OCwKKyAgICAweDg4NjksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg2QSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4ODZCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODZDLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg2RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODZFLCAweDAwMDAsIDB4MDAwMCwgMHg4ODZGLCAweDg4NzAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4NzEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg4NzIsIDB4MDAwMCwgMHgwMDAwLCAweDg4NzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODg3NCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg3NSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg3NiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODc3LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg3OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4NzksIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODdBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4N0IsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg3QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg4N0QsIDB4ODg3RSwgMHgwMDAwLCAweDg4N0YsIDB4MDAwMCwgMHg4ODgwLCAweDg4ODEsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg4MiwgMHg4ODgzLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4ODQsIDB4ODg4NSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4ODg2LCAweDAwMDAsIDB4ODg4NywgMHg4ODg4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg4ODksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg4QSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4OEIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4ODhDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODhELCAweDAwMDAsCisgICAgMHg4ODhFLCAweDAwMDAsIDB4MDAwMCwgMHg4ODhGLCAweDg4OTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODg5MSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4OTIsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg4OTMsIDB4MDAwMCwgMHg4ODk0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODg5NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4OTYsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4ODk3LAorICAgIDB4MDAwMCwgMHg4ODk4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg4OTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4OUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4OUIsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODg5QywgMHgwMDAwLCAweDAwMDAsIDB4ODg5RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4OUUsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODg5RiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4OEEwLCAweDAwMDAsIDB4ODhBMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QTIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEEzLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhBNSwgMHgwMDAwLAorICAgIDB4ODhBNiwgMHgwMDAwLCAweDg4QTcsIDB4ODhBOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhBOSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QUEsIDB4MDAwMCwgMHg4OEFCLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODhBQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEFELAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QUYsIDB4MDAwMCwgMHgwMDAwLCAweDg4QjAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEIxLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4QjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhCMywgMHg4OEI0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhCNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEI2LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEI3LCAweDg4QjgsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4QjksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEJBLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhCQiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4OEJDLCAweDg4QkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODhCRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg4QkYsIDB4MDAwMCwgMHgwMDAwLCAweDg4QzAsIDB4MDAwMCwgMHg4OEMxLCAweDg4QzIsIDB4ODhDMywgMHg4OEM0LAorICAgIDB4ODhDNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhDNiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4OEM3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4QzgsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4OEM5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OENBLAorICAgIDB4MDAwMCwgMHg4OENCLCAweDAwMDAsIDB4ODhDQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4OENELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4Q0UsIDB4MDAwMCwgMHg4OENGLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhEMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEQxLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEQyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhEMywgMHgwMDAwLAorICAgIDB4ODhENCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4OEQ1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RDYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhENywgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEQ4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RDksCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4REEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OERCLCAweDg4REMsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4REQsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4REUsIDB4ODhERiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEUwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4OEUxLCAweDg4RTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhFMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEU0LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg4RTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4OEU2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhFNywgMHgwMDAwLCAweDg4RTgsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RTksCisgICAgMHgwMDAwLCAweDg4RUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEVCLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODhFQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEVELAorICAgIDB4ODhFRSwgMHgwMDAwLCAweDAwMDAsIDB4ODhFRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RjAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODhGMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEYyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OEYzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg4RjQsIDB4ODhGNSwgMHg4OEY2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RjcsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4OEY4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhGOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg4RkEsIDB4MDAwMCwgMHgwMDAwLCAweDg4RkIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODhGQywKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg4RkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODhGRSwgMHgwMDAwLCAweDg4RkYsIDB4MDAwMCwgMHgwMDAwLCAweDg5MDAsIDB4ODkwMSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MDIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTAzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkwNCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODkwNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTA2LCAweDg5MDcsIDB4ODkwOCwgMHgwMDAwLCAweDg5MDksCisgICAgMHgwMDAwLCAweDg5MEEsIDB4MDAwMCwgMHg4OTBCLCAweDAwMDAsIDB4ODkwQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MEQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTBFLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTBGLAorICAgIDB4MDAwMCwgMHg4OTEwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MTEsCisgICAgMHgwMDAwLCAweDg5MTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkxMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4OTE0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MTUsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTE2LCAweDAwMDAsIDB4MDAwMCwgMHg4OTE3LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkxOCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTE5LCAweDg5MUEsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg5MUIsIDB4MDAwMCwgMHg4OTFDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTFELAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkxRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg5MUYsIDB4ODkyMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkyMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTIyLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MjMsCisgICAgMHg4OTI0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MjUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MjYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MjcsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODkyOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5MjksIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4OTJBLCAweDAwMDAsIDB4MDAwMCwgMHg4OTJCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4OTJDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkyRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkyRSwgMHgwMDAwLCAweDAwMDAsIDB4ODkyRiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg5MzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkzMSwgMHgwMDAwLCAweDg5MzIsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODkzMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg5MzQsIDB4ODkzNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODkzNiwgMHgwMDAwLCAweDAwMDAsIDB4ODkzNywgMHg4OTM4LCAweDAwMDAsIDB4ODkzOSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4OTNBLCAweDAwMDAsIDB4MDAwMCwgMHg4OTNCLCAweDAwMDAsIDB4MDAwMCwgMHg4OTNDLAorICAgIDB4ODkzRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4OTNFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTNGLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk0MSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4OTQyLCAweDg5NDMsIDB4ODk0NCwgMHg4OTQ1LCAweDAwMDAsIDB4ODk0NiwgMHgwMDAwLCAweDAwMDAsIDB4ODk0NywKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4OTQ4LCAweDg5NDksIDB4ODk0QSwgMHgwMDAwLCAweDg5NEIsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk0QywgMHgwMDAwLCAweDg5NEQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk0RSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODk0RiwgMHgwMDAwLCAweDg5NTAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NTEsIDB4MDAwMCwgMHg4OTUyLAorICAgIDB4ODk1MywgMHg4OTU0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk1NSwgMHg4OTU2LCAweDg5NTcsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk1OCwgMHgwMDAwLCAweDg5NTksIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTVBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NUIsIDB4ODk1QywgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NUQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODk1RSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NUYsIDB4ODk2MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4OTYyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4OTYzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk2NCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODk2NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NjYsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTY3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NjgsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NjksIDB4ODk2QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg5NkIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTZDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODk2RSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODk2RiwgMHgwMDAwLCAweDg5NzAsIDB4ODk3MSwgMHgwMDAwLCAweDg5NzIsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg5NzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4OTc0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4OTc1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5NzYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk3NywKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4OTc4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg5NzksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk3QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODk3QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk3QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5N0QsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4OTdFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk3RiwgMHgwMDAwLCAweDg5ODAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg5ODEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4OTgyLCAweDg5ODMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg5ODQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTg1LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg5ODYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTg3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk4OCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTg5LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4OThBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk4QiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODk4QywgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5OEQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4OThFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OThGLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODk5MCwgMHgwMDAwLCAweDg5OTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODk5MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4OTkzLCAweDAwMDAsIDB4MDAwMCwgMHg4OTk0LCAweDg5OTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5OTYsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODk5NywgMHg4OTk4LCAweDAwMDAsIDB4MDAwMCwgMHg4OTk5LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg5OUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5OUIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5OUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg5OUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OTlFLCAweDg5OUYsIDB4ODlBMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4OUExLCAweDAwMDAsIDB4MDAwMCwgMHg4OUEyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5QTMsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODlBNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4OUE1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUE2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg5QTcsIDB4MDAwMCwgMHg4OUE4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUE5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUFBLCAweDAwMDAsIDB4MDAwMCwgMHg4OUFCLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg5QUMsIDB4ODlBRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlBRSwgMHg4OUFGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODlCMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5QjEsIDB4MDAwMCwgMHgwMDAwLCAweDg5QjIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODlCMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5QjQsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5QjUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUI2LCAweDg5QjcsIDB4MDAwMCwgMHg4OUI4LCAweDg5QjksIDB4ODlCQSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUJCLCAweDAwMDAsIDB4ODlCQywgMHg4OUJELAorICAgIDB4MDAwMCwgMHg4OUJFLCAweDg5QkYsIDB4ODlDMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg5QzEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUMyLCAweDAwMDAsIDB4ODlDMywKKyAgICAweDg5QzQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4ODlDNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlDNiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODlDNywgMHgwMDAwLCAweDAwMDAsIDB4ODlDOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDg5QzksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlDQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlDQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg5Q0MsIDB4MDAwMCwgMHg4OUNELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg5Q0UsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUNGLCAweDg5RDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUQxLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RDIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODlEMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlENCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RDUsIDB4MDAwMCwgMHgwMDAwLCAweDg5RDYsCisgICAgMHg4OUQ3LCAweDAwMDAsIDB4MDAwMCwgMHg4OUQ4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4OUQ5LCAweDAwMDAsIDB4ODlEQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OURCLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5REMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5REQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlERSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5REYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlFMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlFMSwgMHg4OUUyLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlFMywgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUU0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUU1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUU2LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4OUU3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4OUU5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlFQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RUIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlFQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RUUsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RUYsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RjAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4ODlGMSwgMHgwMDAwLCAweDg5RjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RjMsIDB4ODlGNCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDg5RjUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlGNiwgMHgwMDAwLCAweDg5RjcsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4OUY4LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4ODlGOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlGQSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RkIsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4OUZDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDg5RkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4ODlGRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDg5RkYsIDB4OEEwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QTAxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTAyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEwMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEwNCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEwNSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTA2LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTA3LCAweDhBMDgsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTA5LCAweDAwMDAsIDB4OEEwQSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QTBCLCAweDAwMDAsIDB4MDAwMCwgMHg4QTBDLCAweDAwMDAsIDB4MDAwMCwgMHg4QTBELCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMEUsIDB4MDAwMCwgMHgwMDAwLCAweDhBMEYsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEExMCwgMHg4QTExLCAweDAwMDAsIDB4OEExMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTEzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QTE0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QTE1LCAweDhBMTYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEExNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEExOCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTE5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEExQSwgMHgwMDAwLCAweDhBMUIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMUMsIDB4MDAwMCwgMHgwMDAwLCAweDhBMUQsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTFFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMjAsIDB4OEEyMSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMjIsIDB4OEEyMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QTI0LCAweDhBMjUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEyNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhBMjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEEyOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTI5LCAweDAwMDAsIDB4OEEyQSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QTJCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEyQywgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEyRCwgMHgwMDAwLAorICAgIDB4OEEyRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhBMkYsIDB4MDAwMCwgMHgwMDAwLCAweDhBMzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QTMxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEzMiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBMzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhBMzQsIDB4OEEzNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QTM2LCAweDAwMDAsIDB4OEEzNywgMHgwMDAwLCAweDhBMzgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTM5LCAweDhBM0EsIDB4MDAwMCwgMHgwMDAwLCAweDhBM0IsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEEzQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QTNELCAweDAwMDAsIDB4MDAwMCwgMHg4QTNFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QTNGLCAweDAwMDAsIDB4OEE0MCwgMHg4QTQxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhBNDIsIDB4OEE0MywgMHg4QTQ0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE0NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTQ2LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QTQ3LCAweDhBNDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTQ5LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE0QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEE0QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE0QywgMHg4QTRELAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTRFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNEYsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTUwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE1MSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNTIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTUzLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTU0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QTU2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhBNTcsIDB4MDAwMCwgMHgwMDAwLCAweDhBNTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE1OSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QTVBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTVCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QTVDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNUQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNUUsIDB4MDAwMCwgMHgwMDAwLCAweDhBNUYsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTYwLCAweDhBNjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE2MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNjMsIDB4MDAwMCwgMHgwMDAwLCAweDhBNjQsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEE2NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTY2LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE2NywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNjgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhBNjksIDB4MDAwMCwgMHg4QTZBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEE2QiwgMHgwMDAwLCAweDAwMDAsIDB4OEE2QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE2RCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNkUsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhBNkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhBNzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE3MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE3MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTc0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBNzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTc2LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE3NywgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEE3OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QTc5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTdBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBN0IsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE3QywKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEE3RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBN0UsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE3RiwgMHgwMDAwLCAweDAwMDAsIDB4OEE4MCwgMHg4QTgxLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBODIsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTgzLCAweDAwMDAsIDB4OEE4NCwKKyAgICAweDhBODUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTg2LCAweDAwMDAsIDB4OEE4NywgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QTg4LCAweDAwMDAsIDB4OEE4OSwgMHg4QThBLCAweDAwMDAsIDB4OEE4QiwgMHg4QThDLCAweDhBOEQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QThFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE4RiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QTkwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE5MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTkyLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE5MywgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTk0LCAweDhBOTUsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhBOTYsIDB4OEE5NywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBOTgsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEE5OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTlBLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QTlCLCAweDAwMDAsIDB4OEE5QywgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QTlELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEE5RSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEE5RiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQTAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhBQTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUEzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QUE0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUE1LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFBNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUE3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFBOCwgMHg4QUE5LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFBQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQUIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFBQywKKyAgICAweDhBQUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFBRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QUFGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhBQjAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEFCMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUIzLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFCNCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFCNSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUI2LCAweDAwMDAsIDB4OEFCNywKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUI4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUI5LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhBQkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQkIsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEFCQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQkQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBQkUsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QUJGLCAweDhBQzAsIDB4MDAwMCwgMHg4QUMxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEFDMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhBQzMsIDB4MDAwMCwgMHgwMDAwLCAweDhBQzQsIDB4MDAwMCwgMHg4QUM1LCAweDAwMDAsIDB4MDAwMCwgMHg4QUM2LAorICAgIDB4MDAwMCwgMHg4QUM3LCAweDAwMDAsIDB4MDAwMCwgMHg4QUM4LCAweDhBQzksIDB4OEFDQSwgMHgwMDAwLCAweDhBQ0IsCisgICAgMHg4QUNDLCAweDhBQ0QsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QUNFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUNGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhBRDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUQxLAorICAgIDB4MDAwMCwgMHg4QUQyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhBRDMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRDQsCisgICAgMHgwMDAwLCAweDhBRDUsIDB4MDAwMCwgMHgwMDAwLCAweDhBRDYsIDB4MDAwMCwgMHg4QUQ3LCAweDhBRDgsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEFEOSwgMHgwMDAwLCAweDAwMDAsIDB4OEFEQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEFEQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFEQywgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QURELCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QURFLCAweDAwMDAsIDB4OEFERiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFFMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QUUyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhBRTMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRTQsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUU1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEFFNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRTcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEFFOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUU5LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFFQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFFQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUVDLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFFRCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhBRUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFFRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEFGMCwgMHgwMDAwLCAweDhBRjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUYyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFGNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhBRjUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUY2LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhBRjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QUY4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFGOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEFGQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEFGQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QUZDLCAweDhBRkQsIDB4OEFGRSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEFGRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIwMSwgMHg4QjAyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIwMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QjA0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMDUsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QjA2LCAweDAwMDAsIDB4MDAwMCwgMHg4QjA3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhCMDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEIwOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjBBLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhCMEIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIwQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMEQsIDB4MDAwMCwgMHgwMDAwLCAweDhCMEUsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMEYsIDB4OEIxMCwgMHg4QjExLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIxMiwKKyAgICAweDhCMTMsIDB4OEIxNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjE1LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QjE2LCAweDhCMTcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIxOCwgMHg4QjE5LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMUEsIDB4OEIxQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjFDLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QjFELCAweDhCMUUsIDB4MDAwMCwgMHg4QjFGLCAweDAwMDAsIDB4MDAwMCwgMHg4QjIwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMjEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjIyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEIyMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhCMjQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEIyNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjI2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhCMjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIyOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEIyOSwgMHgwMDAwLCAweDhCMkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEIyQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEIyQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjJFLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QjJGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIzMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjMxLCAweDAwMDAsIDB4MDAwMCwgMHg4QjMyLCAweDAwMDAsCisgICAgMHg4QjMzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIzNCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhCMzUsIDB4MDAwMCwgMHg4QjM2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCMzcsCisgICAgMHg4QjM4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEIzOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjNBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QjNCLCAweDAwMDAsIDB4OEIzQywgMHg4QjNELCAweDAwMDAsIDB4MDAwMCwgMHg4QjNFLCAweDhCM0YsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QjQwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI0MSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QjQyLCAweDAwMDAsIDB4OEI0MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjQ0LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI0NSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QjQ2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI0NywgMHg4QjQ4LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCNDksIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjRBLAorICAgIDB4OEI0QiwgMHgwMDAwLCAweDhCNEMsIDB4MDAwMCwgMHg4QjRELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QjRFLCAweDAwMDAsIDB4OEI0RiwgMHgwMDAwLCAweDhCNTAsIDB4MDAwMCwKKyAgICAweDhCNTEsIDB4OEI1MiwgMHg4QjUzLCAweDhCNTQsIDB4OEI1NSwgMHg4QjU2LCAweDAwMDAsIDB4OEI1NywgMHgwMDAwLAorICAgIDB4OEI1OCwgMHgwMDAwLCAweDAwMDAsIDB4OEI1OSwgMHgwMDAwLCAweDAwMDAsIDB4OEI1QSwgMHg4QjVCLCAweDhCNUMsCisgICAgMHgwMDAwLCAweDhCNUQsIDB4MDAwMCwgMHg4QjVFLCAweDhCNUYsIDB4OEI2MCwgMHg4QjYxLCAweDhCNjIsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QjYzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCNjQsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI2NSwgMHgwMDAwLCAweDhCNjYsCisgICAgMHg4QjY3LCAweDhCNjgsIDB4OEI2OSwgMHgwMDAwLCAweDhCNkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI2QiwKKyAgICAweDhCNkMsIDB4MDAwMCwgMHg4QjZELCAweDAwMDAsIDB4MDAwMCwgMHg4QjZFLCAweDhCNkYsIDB4MDAwMCwgMHg4QjcwLAorICAgIDB4OEI3MSwgMHg4QjcyLCAweDAwMDAsIDB4OEI3MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEI3NCwgMHgwMDAwLCAweDhCNzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhCNzYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCNzcsIDB4MDAwMCwgMHg4Qjc4LAorICAgIDB4OEI3OSwgMHgwMDAwLCAweDAwMDAsIDB4OEI3QSwgMHg4QjdCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCN0MsCisgICAgMHgwMDAwLCAweDhCN0QsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhCN0UsIDB4OEI3RiwgMHg4QjgwLCAweDhCODEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEI4MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCODMsCisgICAgMHgwMDAwLCAweDhCODQsIDB4MDAwMCwgMHgwMDAwLCAweDhCODUsIDB4MDAwMCwgMHg4Qjg2LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEI4NywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Qjg4LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCODksCisgICAgMHgwMDAwLCAweDhCOEEsIDB4MDAwMCwgMHg4QjhCLCAweDAwMDAsIDB4OEI4QywgMHg4QjhELCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCOEUsIDB4OEI4RiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QjkwLCAweDhCOTEsIDB4OEI5MiwgMHgwMDAwLCAweDhCOTMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4Qjk0LCAweDhCOTUsIDB4OEI5NiwgMHg4Qjk3LCAweDAwMDAsIDB4OEI5OCwgMHg4Qjk5LCAweDhCOUEsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCOUIsIDB4MDAwMCwgMHgwMDAwLCAweDhCOUMsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEI5RCwgMHg4QjlFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCOUYsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCQTAsIDB4OEJBMSwgMHg4QkEyLCAweDhCQTMsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEJBNCwgMHg4QkE1LCAweDAwMDAsIDB4OEJBNiwgMHg4QkE3LCAweDAwMDAsIDB4OEJBOCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QkE5LCAweDAwMDAsIDB4OEJBQSwgMHg4QkFCLCAweDAwMDAsIDB4MDAwMCwgMHg4QkFDLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhCQUQsIDB4MDAwMCwgMHg4QkFFLCAweDhCQUYsIDB4MDAwMCwgMHg4QkIwLCAweDAwMDAsIDB4OEJCMSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QkIyLCAweDAwMDAsIDB4OEJCMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCQjQsCisgICAgMHg4QkI1LCAweDhCQjYsIDB4OEJCNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCQjgsIDB4OEJCOSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkJBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEJCQiwgMHgwMDAwLCAweDhCQkMsIDB4OEJCRCwgMHg4QkJFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCQkYsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCQzAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEJDMSwgMHgwMDAwLCAweDAwMDAsIDB4OEJDMiwgMHg4QkMzLCAweDAwMDAsIDB4MDAwMCwgMHg4QkM0LAorICAgIDB4OEJDNSwgMHg4QkM2LCAweDAwMDAsIDB4OEJDNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkM4LCAweDhCQzksCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCQ0EsIDB4MDAwMCwgMHg4QkNCLCAweDhCQ0MsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QkNELCAweDAwMDAsIDB4OEJDRSwgMHg4QkNGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QkQwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRDEsIDB4MDAwMCwgMHgwMDAwLCAweDhCRDIsIDB4OEJEMywKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRDQsIDB4OEJENSwgMHg4QkQ2LAorICAgIDB4MDAwMCwgMHg4QkQ3LCAweDAwMDAsIDB4OEJEOCwgMHg4QkQ5LCAweDAwMDAsIDB4MDAwMCwgMHg4QkRBLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCREIsIDB4MDAwMCwgMHgwMDAwLCAweDhCREMsIDB4OEJERCwKKyAgICAweDhCREUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QkRGLCAweDAwMDAsIDB4OEJFMCwgMHgwMDAwLCAweDhCRTEsIDB4MDAwMCwgMHgwMDAwLCAweDhCRTIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkUzLCAweDAwMDAsIDB4MDAwMCwgMHg4QkU0LCAweDAwMDAsIDB4OEJFNSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRTYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QkU3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRTgsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJFOSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJFQSwgMHgwMDAwLCAweDhCRUIsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEJFQywgMHg4QkVELCAweDAwMDAsIDB4OEJFRSwgMHgwMDAwLCAweDAwMDAsIDB4OEJFRiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRjAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEJGMSwgMHg4QkYyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJGMywgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkY0LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRjUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEJGNiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEJGNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkY4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhCRjksIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkZBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QkZCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhCRkMsIDB4OEJGRCwgMHgwMDAwLCAweDhCRkUsIDB4OEJGRiwgMHgwMDAwLCAweDhDMDAsCisgICAgMHg4QzAxLCAweDhDMDIsIDB4MDAwMCwgMHg4QzAzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMDQsIDB4OEMwNSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMDYsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMwNywKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QzA4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzA5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QzBBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzBCLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QzBDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMwRCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QzBFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMwRiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEMxMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEMxMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMTIsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMTMsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzE0LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzE1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhDMTYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEMxNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzE4LCAweDhDMTksIDB4OEMxQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMUIsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QzFDLCAweDAwMDAsIDB4OEMxRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzFFLCAweDAwMDAsIDB4OEMxRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEMyMCwgMHg4QzIxLCAweDAwMDAsIDB4OEMyMiwgMHgwMDAwLCAweDAwMDAsIDB4OEMyMywgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QzI0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEMyNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMjYsIDB4OEMyNywgMHg4QzI4LCAweDhDMjksCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMyQSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMyQiwKKyAgICAweDAwMDAsIDB4OEMyQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMkQsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMyRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QzJGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzMwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzMxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMzIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzMzLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzM0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhDMzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMzNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzM3LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEMzOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDMzksIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzNBLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDM0IsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzNDLCAweDAwMDAsIDB4MDAwMCwgMHg4QzNELCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEMzRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzNGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM0MSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM0MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhDNDMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNDQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM0NSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhDNDYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QzQ3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzQ4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEM0OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEM0QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEM0QiwgMHg4QzRDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM0RCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzRFLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNEYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhDNTAsIDB4MDAwMCwgMHg4QzUxLCAweDhDNTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QzUzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzU1LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzU2LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEM1NywgMHgwMDAwLCAweDAwMDAsIDB4OEM1OCwgMHgwMDAwLCAweDAwMDAsIDB4OEM1OSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEM1QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNUIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEM1QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEM1RSwgMHgwMDAwLCAweDhDNUYsIDB4MDAwMCwgMHg4QzYwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QzYxLCAweDAwMDAsIDB4MDAwMCwgMHg4QzYyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzYzLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM2NCwgMHgwMDAwLCAweDAwMDAsIDB4OEM2NSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzY2LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM2NywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzY4LAorICAgIDB4OEM2OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzZBLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzZCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4QzZDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDNkQsIDB4MDAwMCwgMHgwMDAwLCAweDhDNkUsIDB4OEM2RiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzcwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEM3MSwgMHgwMDAwLCAweDhDNzIsIDB4OEM3MywgMHgwMDAwLCAweDAwMDAsIDB4OEM3NCwgMHg4Qzc1LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEM3NiwgMHgwMDAwLCAweDAwMDAsIDB4OEM3NywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Qzc4LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM3OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM3QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEM3QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDN0MsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEM3RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM3RSwgMHg4QzdGLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhDODAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhDODEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzgyLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM4MywgMHg4Qzg0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Qzg1LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDODYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Qzg3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM4OCwgMHgwMDAwLCAweDhDODksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDOEEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM4QiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDOEMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4QzhELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzhFLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEM4RiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDOTAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QzkxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4QzkyLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4QzkzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhDOTQsIDB4MDAwMCwgMHgwMDAwLCAweDhDOTUsIDB4MDAwMCwgMHgwMDAwLCAweDhDOTYsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Qzk3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEM5OCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Qzk5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEM5QSwgMHg4QzlCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDOUMsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEM5RCwgMHg4QzlFLCAweDAwMDAsIDB4MDAwMCwgMHg4QzlGLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0EwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENBMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQTIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENBMywKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENBNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OENBNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OENBNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQTcsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQTgsIDB4MDAwMCwgMHg4Q0E5LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhDQUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQUIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0FDLAorICAgIDB4OENBRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0FFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0IwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4Q0IxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0IzLCAweDhDQjQsIDB4MDAwMCwgMHg4Q0I1LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhDQjYsIDB4MDAwMCwgMHgwMDAwLCAweDhDQjcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OENCOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQjksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4Q0JBLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0JCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OENCQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENCRCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OENCRSwgMHgwMDAwLCAweDAwMDAsIDB4OENCRiwgMHgwMDAwLCAweDhDQzAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0MxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQzIsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4Q0MzLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0M0LCAweDAwMDAsIDB4OENDNSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0M2LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OENDNywgMHg4Q0M4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDQzksIDB4MDAwMCwKKyAgICAweDhDQ0EsIDB4MDAwMCwgMHgwMDAwLCAweDhDQ0IsIDB4MDAwMCwgMHgwMDAwLCAweDhDQ0MsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhDQ0QsIDB4MDAwMCwgMHgwMDAwLCAweDhDQ0UsIDB4MDAwMCwgMHgwMDAwLCAweDhDQ0YsCisgICAgMHgwMDAwLCAweDhDRDAsIDB4OENEMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4Q0QyLCAweDAwMDAsIDB4OENEMywgMHgwMDAwLCAweDhDRDQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0Q1LCAweDhDRDYsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhDRDcsIDB4MDAwMCwgMHg4Q0Q4LCAweDAwMDAsIDB4OENEOSwgMHgwMDAwLCAweDhDREEsCisgICAgMHgwMDAwLCAweDhDREIsIDB4MDAwMCwgMHgwMDAwLCAweDhDREMsIDB4MDAwMCwgMHg4Q0RELCAweDhDREUsIDB4OENERiwKKyAgICAweDhDRTAsIDB4MDAwMCwgMHgwMDAwLCAweDhDRTEsIDB4MDAwMCwgMHg4Q0UyLCAweDAwMDAsIDB4OENFMywgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhDRTQsIDB4MDAwMCwgMHg4Q0U1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4Q0U2LCAweDAwMDAsIDB4MDAwMCwgMHg4Q0U3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDRTgsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OENFOSwgMHgwMDAwLCAweDhDRUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OENFQiwgMHgwMDAwLAorICAgIDB4OENFQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhDRUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhDRUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhDRUYsIDB4MDAwMCwgMHg4Q0YwLCAweDAwMDAsIDB4OENGMSwgMHgwMDAwLCAweDhDRjIsIDB4OENGMywgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4Q0Y0LCAweDAwMDAsIDB4MDAwMCwgMHg4Q0Y1LCAweDAwMDAsIDB4MDAwMCwgMHg4Q0Y2LCAweDAwMDAsCisgICAgMHg4Q0Y3LCAweDhDRjgsIDB4OENGOSwgMHg4Q0ZBLCAweDAwMDAsIDB4MDAwMCwgMHg4Q0ZCLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhDRkMsIDB4MDAwMCwgMHg4Q0ZELCAweDhDRkUsIDB4OENGRiwgMHg4RDAwLCAweDAwMDAsIDB4OEQwMSwgMHg4RDAyLAorICAgIDB4OEQwMywgMHg4RDA0LCAweDAwMDAsIDB4OEQwNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhEMDYsIDB4MDAwMCwgMHgwMDAwLCAweDhEMDcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhEMDgsIDB4OEQwOSwgMHg4RDBBLCAweDhEMEIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDBDLAorICAgIDB4OEQwRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDBFLCAweDhEMEYsIDB4MDAwMCwgMHgwMDAwLCAweDhEMTAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEQxMSwgMHgwMDAwLCAweDhEMTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQxMywKKyAgICAweDAwMDAsIDB4OEQxNCwgMHg4RDE1LCAweDAwMDAsIDB4OEQxNiwgMHg4RDE3LCAweDhEMTgsIDB4OEQxOSwgMHgwMDAwLAorICAgIDB4OEQxQSwgMHgwMDAwLCAweDhEMUIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEMUMsCisgICAgMHgwMDAwLCAweDhEMUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQxRSwgMHgwMDAwLCAweDAwMDAsIDB4OEQxRiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4RDIwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDIxLCAweDAwMDAsIDB4MDAwMCwgMHg4RDIyLAorICAgIDB4MDAwMCwgMHg4RDIzLCAweDAwMDAsIDB4MDAwMCwgMHg4RDI0LCAweDAwMDAsIDB4OEQyNSwgMHgwMDAwLCAweDhEMjYsCisgICAgMHgwMDAwLCAweDhEMjcsIDB4MDAwMCwgMHg4RDI4LCAweDAwMDAsIDB4OEQyOSwgMHg4RDJBLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEQyQiwgMHg4RDJDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEMkQsIDB4OEQyRSwgMHg4RDJGLAorICAgIDB4OEQzMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQzMSwgMHg4RDMyLCAweDAwMDAsIDB4OEQzMywgMHgwMDAwLCAweDhEMzQsCisgICAgMHg4RDM1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEMzYsIDB4MDAwMCwgMHg4RDM3LCAweDhEMzgsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEQzOSwgMHgwMDAwLCAweDhEM0EsIDB4MDAwMCwgMHgwMDAwLCAweDhEM0IsIDB4OEQzQywgMHg4RDNELAorICAgIDB4MDAwMCwgMHg4RDNFLCAweDAwMDAsIDB4OEQzRiwgMHgwMDAwLCAweDhENDAsIDB4MDAwMCwgMHg4RDQxLCAweDhENDIsCisgICAgMHg4RDQzLCAweDAwMDAsIDB4OEQ0NCwgMHg4RDQ1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ0NiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENDcsIDB4MDAwMCwgMHg4RDQ4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEQ0OSwgMHgwMDAwLCAweDhENEEsIDB4OEQ0QiwgMHgwMDAwLCAweDhENEMsIDB4MDAwMCwgMHg4RDRELCAweDAwMDAsCisgICAgMHg4RDRFLCAweDAwMDAsIDB4MDAwMCwgMHg4RDRGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4RDUwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDUxLCAweDhENTIsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDUzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhENTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDU1LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDU2LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDU3LCAweDhENTgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDU5LCAweDAwMDAsIDB4OEQ1QSwgMHg4RDVCLCAweDhENUMsIDB4MDAwMCwKKyAgICAweDhENUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ1RSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhENUYsIDB4OEQ2MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDYxLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhENjIsIDB4OEQ2MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENjQsIDB4OEQ2NSwgMHgwMDAwLAorICAgIDB4OEQ2NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhENjcsIDB4OEQ2OCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ2OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhENkEsIDB4OEQ2QiwgMHgwMDAwLCAweDhENkMsIDB4OEQ2RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDZFLAorICAgIDB4MDAwMCwgMHg4RDZGLCAweDAwMDAsIDB4OEQ3MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEQ3MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ3MiwKKyAgICAweDAwMDAsIDB4OEQ3MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4RDc0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ3NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhENzYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RDc3LCAweDhENzgsIDB4MDAwMCwKKyAgICAweDhENzksIDB4OEQ3QSwgMHg4RDdCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEQ3QywgMHg4RDdELAorICAgIDB4OEQ3RSwgMHg4RDdGLCAweDhEODAsIDB4OEQ4MSwgMHgwMDAwLCAweDAwMDAsIDB4OEQ4MiwgMHg4RDgzLCAweDAwMDAsCisgICAgMHg4RDg0LCAweDhEODUsIDB4OEQ4NiwgMHgwMDAwLCAweDhEODcsIDB4OEQ4OCwgMHg4RDg5LCAweDAwMDAsIDB4OEQ4QSwKKyAgICAweDhEOEIsIDB4OEQ4QywgMHg4RDhELCAweDAwMDAsIDB4OEQ4RSwgMHg4RDhGLCAweDhEOTAsIDB4OEQ5MSwgMHg4RDkyLAorICAgIDB4OEQ5MywgMHg4RDk0LCAweDAwMDAsIDB4OEQ5NSwgMHg4RDk2LCAweDAwMDAsIDB4OEQ5NywgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEOTgsIDB4OEQ5OSwgMHg4RDlBLCAweDAwMDAsIDB4OEQ5QiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEOUMsIDB4OEQ5RCwgMHgwMDAwLCAweDhEOUUsIDB4MDAwMCwgMHg4RDlGLAorICAgIDB4MDAwMCwgMHg4REEwLCAweDhEQTEsIDB4OERBMiwgMHg4REEzLCAweDhEQTQsIDB4MDAwMCwgMHg4REE1LCAweDhEQTYsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OERBNywgMHgwMDAwLCAweDhEQTgsIDB4OERBOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEQUEsIDB4OERBQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OERBQywgMHg4REFELCAweDhEQUUsIDB4OERBRiwgMHg4REIwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhEQjEsIDB4OERCMiwgMHgwMDAwLCAweDhEQjMsIDB4OERCNCwgMHgwMDAwLCAweDhEQjUsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OERCNiwgMHgwMDAwLCAweDhEQjcsIDB4OERCOCwgMHgwMDAwLCAweDAwMDAsIDB4OERCOSwgMHg4REJBLAorICAgIDB4MDAwMCwgMHg4REJCLCAweDhEQkMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERCRCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERCRSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4REJGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEQzAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REMxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERDMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REMzLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEQzQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERDNSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERDNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REM3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REM4LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhEQzksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERDQSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERDQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEQ0MsIDB4OERDRCwgMHg4RENFLCAweDAwMDAsIDB4OERDRiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhERDAsIDB4OEREMSwgMHg4REQyLCAweDAwMDAsIDB4OEREMywgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OERENCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhERDUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERENiwgMHg4REQ3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEREOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEREOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEREEsIDB4OEREQiwgMHg4RERDLCAweDhEREQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhEREUsIDB4MDAwMCwgMHg4RERGLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERFMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REUxLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OERFMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhERTMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhERTQsIDB4OERFNSwgMHg4REU2LAorICAgIDB4OERFNywgMHg4REU4LCAweDAwMDAsIDB4OERFOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhERUEsCisgICAgMHgwMDAwLCAweDhERUIsIDB4MDAwMCwgMHg4REVDLCAweDhERUQsIDB4OERFRSwgMHg4REVGLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REYwLCAweDAwMDAsIDB4OERGMSwgMHg4REYyLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhERjMsIDB4OERGNCwgMHg4REY1LCAweDhERjYsCisgICAgMHg4REY3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REY4LCAweDhERjksIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OERGQSwgMHg4REZCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OERGQywgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhERkQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4REZFLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhERkYsIDB4MDAwMCwgMHgwMDAwLCAweDhFMDAsIDB4OEUwMSwgMHg4RTAyLCAweDAwMDAsIDB4OEUwMywKKyAgICAweDAwMDAsIDB4OEUwNCwgMHg4RTA1LCAweDhFMDYsIDB4MDAwMCwgMHgwMDAwLCAweDhFMDcsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4RTA4LCAweDhFMDksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFMEEsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEUwQiwgMHgwMDAwLCAweDhFMEMsIDB4OEUwRCwgMHgwMDAwLCAweDhFMEUsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4RTBGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFMTAsIDB4OEUxMSwKKyAgICAweDhFMTIsIDB4MDAwMCwgMHgwMDAwLCAweDhFMTMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFMTQsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTE1LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFMTYsIDB4OEUxNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEUxOCwgMHg4RTE5LCAweDAwMDAsIDB4MDAwMCwgMHg4RTFBLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFMUIsIDB4OEUxQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTFELAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhFMUUsIDB4MDAwMCwgMHg4RTFGLCAweDAwMDAsIDB4OEUyMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTIxLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFMjIsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhFMjMsIDB4OEUyNCwgMHgwMDAwLCAweDhFMjUsIDB4MDAwMCwgMHg4RTI2LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTI3LCAweDAwMDAsIDB4MDAwMCwgMHg4RTI4LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhFMjksIDB4MDAwMCwgMHgwMDAwLCAweDhFMkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTJCLAorICAgIDB4OEUyQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUyRCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4RTJFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhFMkYsIDB4MDAwMCwgMHgwMDAwLCAweDhFMzAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUzMSwgMHgwMDAwLCAweDhFMzIsIDB4MDAwMCwgMHg4RTMzLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFMzQsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUzNSwgMHgwMDAwLCAweDAwMDAsIDB4OEUzNiwgMHgwMDAwLAorICAgIDB4OEUzNywgMHgwMDAwLCAweDhFMzgsIDB4MDAwMCwgMHg4RTM5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFM0EsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFM0IsIDB4OEUzQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEUzRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEUzRSwgMHgwMDAwLAorICAgIDB4OEUzRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFNDAsIDB4OEU0MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEU0MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTQzLCAweDhFNDQsCisgICAgMHgwMDAwLCAweDhFNDUsIDB4MDAwMCwgMHg4RTQ2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhFNDcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEU0OCwgMHg4RTQ5LCAweDAwMDAsIDB4OEU0QSwgMHg4RTRCLCAweDhFNEMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4RTRELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTRFLCAweDhFNEYsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEU1MCwgMHgwMDAwLCAweDhFNTEsIDB4MDAwMCwgMHgwMDAwLCAweDhFNTIsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEU1MywgMHgwMDAwLCAweDhFNTQsCisgICAgMHgwMDAwLCAweDhFNTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEU1NiwKKyAgICAweDhFNTcsIDB4MDAwMCwgMHg4RTU4LCAweDhFNTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTVBLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEU1QiwgMHgwMDAwLCAweDAwMDAsIDB4OEU1QywgMHg4RTVELCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhFNUUsIDB4OEU1RiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4RTYwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEU2MSwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4RTYyLCAweDhFNjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4RTY0LCAweDAwMDAsIDB4OEU2NSwgMHgwMDAwLCAweDAwMDAsIDB4OEU2NiwgMHg4RTY3LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhFNjgsIDB4OEU2OSwgMHg4RTZBLCAweDhFNkIsIDB4MDAwMCwgMHgwMDAwLCAweDhFNkMsIDB4OEU2RCwgMHg4RTZFLAorICAgIDB4OEU2RiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFNzAsIDB4MDAwMCwgMHgwMDAwLCAweDhFNzEsCisgICAgMHg4RTcyLCAweDAwMDAsIDB4OEU3MywgMHgwMDAwLCAweDhFNzQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEU3NSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTc2LCAweDAwMDAsIDB4MDAwMCwgMHg4RTc3LAorICAgIDB4OEU3OCwgMHgwMDAwLCAweDAwMDAsIDB4OEU3OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4RTdBLCAweDAwMDAsIDB4OEU3QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEU3QywKKyAgICAweDhFN0QsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEU3RSwgMHgwMDAwLCAweDhFN0YsIDB4MDAwMCwgMHg4RTgwLCAweDhFODEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4RTgyLCAweDhFODMsIDB4MDAwMCwgMHgwMDAwLCAweDhFODQsIDB4MDAwMCwgMHg4RTg1LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTg2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEU4NywgMHgwMDAwLCAweDhFODgsIDB4MDAwMCwgMHgwMDAwLCAweDhFODksIDB4MDAwMCwgMHg4RThBLCAweDAwMDAsCisgICAgMHg4RThCLCAweDhFOEMsIDB4OEU4RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RThFLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhFOEYsIDB4MDAwMCwgMHg4RTkwLCAweDhFOTEsIDB4MDAwMCwgMHg4RTkyLCAweDAwMDAsIDB4OEU5MywgMHg4RTk0LAorICAgIDB4OEU5NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RTk2LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEU5NywgMHgwMDAwLCAweDhFOTgsIDB4MDAwMCwgMHg4RTk5LCAweDhFOUEsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFOUIsIDB4MDAwMCwgMHg4RTlDLCAweDAwMDAsIDB4OEU5RCwgMHgwMDAwLAorICAgIDB4OEU5RSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFOUYsIDB4MDAwMCwgMHgwMDAwLCAweDhFQTAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEVBMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVBMiwgMHgwMDAwLCAweDhFQTMsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhFQTQsIDB4OEVBNSwgMHg4RUE2LCAweDAwMDAsIDB4OEVBNywgMHg4RUE4LCAweDhFQTksCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUFBLCAweDhFQUIsIDB4OEVBQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVBRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUFFLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUFGLCAweDAwMDAsIDB4MDAwMCwgMHg4RUIwLCAweDAwMDAsCisgICAgMHg4RUIxLCAweDAwMDAsIDB4OEVCMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhFQjMsIDB4OEVCNCwgMHgwMDAwLCAweDhFQjUsIDB4MDAwMCwgMHgwMDAwLCAweDhFQjYsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEVCNywgMHg4RUI4LCAweDhFQjksIDB4OEVCQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUJCLCAweDhFQkMsCisgICAgMHg4RUJELCAweDhFQkUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVCRiwgMHgwMDAwLCAweDhFQzAsIDB4OEVDMSwKKyAgICAweDAwMDAsIDB4OEVDMiwgMHgwMDAwLCAweDAwMDAsIDB4OEVDMywgMHg4RUM0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEVDNSwgMHgwMDAwLCAweDAwMDAsIDB4OEVDNiwgMHgwMDAwLCAweDhFQzcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVDOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEVDOSwgMHg4RUNBLCAweDAwMDAsIDB4MDAwMCwgMHg4RUNCLCAweDhFQ0MsIDB4MDAwMCwgMHg4RUNELAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVDRSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhFQ0YsIDB4MDAwMCwgMHg4RUQwLCAweDhFRDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhFRDIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVEMywgMHg4RUQ0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVENSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUQ2LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUQ3LCAweDhFRDgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVEOSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFREEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVEQiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEVEQywgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFREQsIDB4MDAwMCwKKyAgICAweDhFREUsIDB4MDAwMCwgMHg4RURGLCAweDAwMDAsIDB4MDAwMCwgMHg4RUUwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhFRTEsIDB4OEVFMiwgMHg4RUUzLCAweDAwMDAsIDB4MDAwMCwgMHg4RUU0LCAweDhFRTUsCisgICAgMHgwMDAwLCAweDhFRTYsIDB4OEVFNywgMHgwMDAwLCAweDhFRTgsIDB4MDAwMCwgMHg4RUU5LCAweDAwMDAsIDB4OEVFQSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4RUVCLCAweDAwMDAsIDB4OEVFQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4RUVELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFRUUsIDB4OEVFRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhFRjAsIDB4OEVGMSwgMHgwMDAwLCAweDAwMDAsIDB4OEVGMiwgMHg4RUYzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhFRjQsIDB4OEVGNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RUY2LCAweDhFRjcsCisgICAgMHg4RUY4LCAweDhFRjksIDB4MDAwMCwgMHg4RUZBLCAweDhFRkIsIDB4MDAwMCwgMHg4RUZDLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEVGRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEVGRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhFRkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4RjAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGMDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEYwMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGMDMsIDB4MDAwMCwgMHgwMDAwLCAweDhGMDQsCisgICAgMHg4RjA1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGMDYsIDB4OEYwNywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4RjA4LCAweDhGMDksIDB4MDAwMCwgMHgwMDAwLCAweDhGMEEsIDB4MDAwMCwgMHgwMDAwLCAweDhGMEIsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjBDLCAweDhGMEQsIDB4MDAwMCwgMHg4RjBFLCAweDhGMEYsIDB4MDAwMCwKKyAgICAweDhGMTAsIDB4MDAwMCwgMHg4RjExLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEYxMiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEYxMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4RjE0LCAweDAwMDAsIDB4OEYxNSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGMTYsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4RjE3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhGMTgsIDB4MDAwMCwgMHg4RjE5LCAweDAwMDAsIDB4MDAwMCwgMHg4RjFBLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEYxQiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4RjFDLCAweDhGMUQsIDB4OEYxRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEYxRiwgMHgwMDAwLCAweDhGMjAsIDB4MDAwMCwgMHgwMDAwLCAweDhGMjEsIDB4OEYyMiwgMHg4RjIzLCAweDhGMjQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGMjUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEYyNiwgMHgwMDAwLCAweDhGMjcsIDB4OEYyOCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4RjI5LCAweDAwMDAsIDB4OEYyQSwgMHg4RjJCLCAweDAwMDAsIDB4OEYyQywgMHg4RjJELCAweDAwMDAsCisgICAgMHg4RjJFLCAweDhGMkYsIDB4MDAwMCwgMHgwMDAwLCAweDhGMzAsIDB4OEYzMSwgMHg4RjMyLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEYzMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4RjM0LCAweDAwMDAsIDB4OEYzNSwgMHgwMDAwLCAweDhGMzYsIDB4MDAwMCwgMHgwMDAwLCAweDhGMzcsCisgICAgMHg4RjM4LCAweDAwMDAsIDB4OEYzOSwgMHg4RjNBLCAweDhGM0IsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEYzQywKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEYzRCwgMHgwMDAwLCAweDAwMDAsIDB4OEYzRSwgMHgwMDAwLAorICAgIDB4OEYzRiwgMHg4RjQwLCAweDhGNDEsIDB4OEY0MiwgMHg4RjQzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGNDQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEY0NSwgMHg4RjQ2LCAweDhGNDcsIDB4MDAwMCwgMHg4RjQ4LCAweDhGNDksIDB4OEY0QSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGNEIsIDB4MDAwMCwgMHg4RjRDLCAweDhGNEQsIDB4OEY0RSwgMHg4RjRGLAorICAgIDB4OEY1MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY1MSwgMHgwMDAwLCAweDhGNTIsCisgICAgMHgwMDAwLCAweDhGNTMsIDB4OEY1NCwgMHg4RjU1LCAweDAwMDAsIDB4OEY1NiwgMHg4RjU3LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY1OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEY1OSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY1QSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OEY1QiwgMHgwMDAwLCAweDAwMDAsIDB4OEY1QywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEY1RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGNUUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY1RiwKKyAgICAweDhGNjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY2MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhGNjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGNjMsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGNjQsIDB4MDAwMCwgMHg4RjY1LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY2NiwgMHgwMDAwLCAweDAwMDAsIDB4OEY2NywgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhGNjgsIDB4MDAwMCwgMHgwMDAwLCAweDhGNjksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhGNkEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGNkIsIDB4MDAwMCwgMHgwMDAwLCAweDhGNkMsIDB4MDAwMCwKKyAgICAweDhGNkQsIDB4OEY2RSwgMHgwMDAwLCAweDhGNkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY3MCwgMHg4RjcxLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY3MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjczLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGNzQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGNzUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGNzYsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGNzcsIDB4MDAwMCwgMHg4Rjc4LCAweDAwMDAsIDB4OEY3OSwKKyAgICAweDAwMDAsIDB4OEY3QSwgMHg4RjdCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhGN0MsIDB4MDAwMCwgMHg4RjdELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEY3RSwgMHgwMDAwLCAweDhGN0YsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGODAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4RjgxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGODIsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGODMsIDB4MDAwMCwgMHg4Rjg0LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGODUsIDB4MDAwMCwgMHg4Rjg2LCAweDhGODcsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4Rjg4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDhGODksIDB4MDAwMCwgMHgwMDAwLCAweDhGOEEsIDB4MDAwMCwgMHg4RjhCLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4RjhDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGOEQsIDB4MDAwMCwgMHg4RjhFLCAweDhGOEYsIDB4OEY5MCwKKyAgICAweDAwMDAsIDB4OEY5MSwgMHg4RjkyLCAweDhGOTMsIDB4OEY5NCwgMHgwMDAwLCAweDhGOTUsIDB4MDAwMCwgMHg4Rjk2LAorICAgIDB4MDAwMCwgMHg4Rjk3LCAweDhGOTgsIDB4OEY5OSwgMHg4RjlBLCAweDhGOUIsIDB4OEY5QywgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDhGOUQsIDB4OEY5RSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RjlGLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4RkEwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkExLCAweDAwMDAsIDB4OEZBMiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGQTMsIDB4MDAwMCwgMHgwMDAwLCAweDhGQTQsCisgICAgMHgwMDAwLCAweDhGQTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkE2LCAweDhGQTcsIDB4OEZBOCwKKyAgICAweDAwMDAsIDB4OEZBOSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZBQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4RkFCLCAweDhGQUMsIDB4OEZBRCwgMHg4RkFFLCAweDAwMDAsIDB4MDAwMCwgMHg4RkFGLCAweDhGQjAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGQjEsIDB4OEZCMiwgMHgwMDAwLCAweDhGQjMsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OEZCNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkI1LCAweDAwMDAsIDB4MDAwMCwgMHg4RkI2LCAweDAwMDAsCisgICAgMHg4RkI3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGQjgsIDB4OEZCOSwgMHgwMDAwLCAweDAwMDAsIDB4OEZCQSwKKyAgICAweDhGQkIsIDB4OEZCQywgMHgwMDAwLCAweDhGQkQsIDB4OEZCRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg4RkJGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZDMCwgMHg4RkMxLAorICAgIDB4OEZDMiwgMHgwMDAwLCAweDhGQzMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkM0LCAweDAwMDAsCisgICAgMHg4RkM1LCAweDAwMDAsIDB4OEZDNiwgMHg4RkM3LCAweDhGQzgsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZDOSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGQ0EsIDB4MDAwMCwgMHg4RkNCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZDQywKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGQ0QsIDB4OEZDRSwgMHgwMDAwLAorICAgIDB4OEZDRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkQwLCAweDhGRDEsIDB4OEZEMiwgMHgwMDAwLCAweDhGRDMsCisgICAgMHgwMDAwLCAweDhGRDQsIDB4MDAwMCwgMHgwMDAwLCAweDhGRDUsIDB4MDAwMCwgMHg4RkQ2LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkQ3LCAweDhGRDgsIDB4OEZEOSwgMHg4RkRBLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZEQiwgMHg4RkRDLCAweDhGREQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg4RkRFLCAweDhGREYsIDB4MDAwMCwgMHg4RkUwLCAweDAwMDAsIDB4OEZFMSwgMHgwMDAwLCAweDAwMDAsIDB4OEZFMiwKKyAgICAweDhGRTMsIDB4OEZFNCwgMHgwMDAwLCAweDAwMDAsIDB4OEZFNSwgMHgwMDAwLCAweDhGRTYsIDB4MDAwMCwgMHg4RkU3LAorICAgIDB4OEZFOCwgMHg4RkU5LCAweDAwMDAsIDB4OEZFQSwgMHgwMDAwLCAweDAwMDAsIDB4OEZFQiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDhGRUMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZFRCwgMHgwMDAwLCAweDhGRUUsIDB4MDAwMCwgMHg4RkVGLAorICAgIDB4OEZGMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg4RkYxLCAweDAwMDAsIDB4OEZGMiwgMHgwMDAwLCAweDhGRjMsCisgICAgMHg4RkY0LCAweDAwMDAsIDB4OEZGNSwgMHgwMDAwLCAweDhGRjYsIDB4MDAwMCwgMHg4RkY3LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDhGRjgsIDB4OEZGOSwgMHgwMDAwLCAweDhGRkEsIDB4OEZGQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg4RkZDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OEZGRCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OEZGRSwgMHgwMDAwLCAweDhGRkYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDkwMDAsIDB4OTAwMSwgMHg5MDAyLCAweDAwMDAsIDB4MDAwMCwgMHg5MDAzLCAweDAwMDAsIDB4OTAwNCwKKyAgICAweDkwMDUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDA2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OTAwNywgMHg5MDA4LCAweDkwMDksIDB4MDAwMCwgMHg5MDBBLCAweDkwMEIsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OTAwQywgMHg5MDBELCAweDAwMDAsIDB4OTAwRSwgMHgwMDAwLCAweDkwMEYsIDB4MDAwMCwgMHg5MDEwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDkwMTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwMTIsIDB4MDAwMCwgMHgwMDAwLCAweDkwMTMsIDB4OTAxNCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwMTUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDE2LCAweDAwMDAsIDB4OTAxNywgMHg5MDE4LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDkwMTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDFBLAorICAgIDB4OTAxQiwgMHg5MDFDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwMUQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OTAxRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTAxRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDkwMjAsIDB4MDAwMCwgMHg5MDIxLCAweDkwMjIsIDB4MDAwMCwgMHg5MDIzLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwMjQsIDB4OTAyNSwgMHg5MDI2LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwMjcsIDB4MDAwMCwgMHg5MDI4LCAweDkwMjksIDB4OTAyQSwgMHg5MDJCLAorICAgIDB4OTAyQywgMHg5MDJELCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTAyRSwgMHgwMDAwLCAweDkwMkYsCisgICAgMHg5MDMwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTAzMSwKKyAgICAweDAwMDAsIDB4OTAzMiwgMHgwMDAwLCAweDAwMDAsIDB4OTAzMywgMHg5MDM0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OTAzNSwgMHgwMDAwLCAweDAwMDAsIDB4OTAzNiwgMHgwMDAwLCAweDkwMzcsIDB4OTAzOCwgMHg5MDM5LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OTAzQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDNCLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDNDLCAweDAwMDAsIDB4MDAwMCwgMHg5MDNELCAweDAwMDAsCisgICAgMHg5MDNFLCAweDkwM0YsIDB4OTA0MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwNDEsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwNDIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDQzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA0NCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg5MDQ1LCAweDAwMDAsIDB4OTA0NiwgMHgwMDAwLCAweDkwNDcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDkwNDgsIDB4MDAwMCwgMHgwMDAwLCAweDkwNDksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDRBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA0QiwgMHgwMDAwLCAweDkwNEMsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA0RCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDkwNEUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDRGLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDkwNTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg5MDUxLCAweDAwMDAsIDB4OTA1MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwNTMsIDB4OTA1NCwgMHgwMDAwLCAweDkwNTUsCisgICAgMHg5MDU2LCAweDkwNTcsIDB4OTA1OCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDkwNTksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA1QSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA1QiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDVDLCAweDkwNUQsCisgICAgMHgwMDAwLCAweDkwNUUsIDB4OTA1RiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDkwNjAsIDB4OTA2MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg5MDYyLCAweDAwMDAsIDB4OTA2MywgMHg5MDY0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA2NSwgMHg5MDY2LCAweDkwNjcsIDB4OTA2OCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDkwNjksIDB4MDAwMCwgMHg5MDZBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwNkIsCisgICAgMHg5MDZDLCAweDAwMDAsIDB4OTA2RCwgMHgwMDAwLCAweDAwMDAsIDB4OTA2RSwgMHg5MDZGLCAweDAwMDAsIDB4OTA3MCwKKyAgICAweDkwNzEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDcyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg5MDczLCAweDAwMDAsIDB4OTA3NCwgMHgwMDAwLCAweDAwMDAsIDB4OTA3NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg5MDc2LCAweDkwNzcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA3OCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA3OSwgMHg5MDdBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwN0IsIDB4MDAwMCwgMHgwMDAwLCAweDkwN0MsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg5MDdELCAweDAwMDAsIDB4OTA3RSwgMHgwMDAwLCAweDAwMDAsIDB4OTA3RiwgMHg5MDgwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA4MSwgMHg5MDgyLCAweDAwMDAsIDB4MDAwMCwgMHg5MDgzLCAweDkwODQsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwODUsIDB4MDAwMCwgMHg5MDg2LCAweDkwODcsIDB4OTA4OCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg5MDg5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwOEEsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA4QiwgMHg5MDhDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwOEQsIDB4MDAwMCwgMHg5MDhFLCAweDAwMDAsIDB4OTA4RiwKKyAgICAweDkwOTAsIDB4OTA5MSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwOTIsIDB4MDAwMCwgMHg5MDkzLAorICAgIDB4OTA5NCwgMHgwMDAwLCAweDAwMDAsIDB4OTA5NSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDk2LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwOTcsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MDk4LCAweDkwOTksIDB4MDAwMCwgMHg5MDlBLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTA5QiwgMHgwMDAwLAorICAgIDB4OTA5QywgMHgwMDAwLCAweDkwOUQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OTA5RSwgMHg5MDlGLCAweDkwQTAsIDB4MDAwMCwgMHg5MEExLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEEyLCAweDkwQTMsIDB4MDAwMCwgMHg5MEE0LCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwQTUsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OTBBNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBBNywgMHgwMDAwLAorICAgIDB4OTBBOCwgMHg5MEE5LCAweDkwQUEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBBQiwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg5MEFDLCAweDAwMDAsIDB4OTBBRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDkwQUUsIDB4OTBBRiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEIwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBCMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEIyLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDkwQjMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBCNCwgMHg5MEI1LAorICAgIDB4OTBCNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg5MEI3LCAweDkwQjgsIDB4MDAwMCwgMHgwMDAwLCAweDkwQjksIDB4OTBCQSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEJCLCAweDAwMDAsIDB4OTBCQywgMHgwMDAwLAorICAgIDB4MDAwMCwgMHg5MEJELCAweDAwMDAsIDB4MDAwMCwgMHg5MEJFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHg5MEJGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBDMCwgMHgwMDAwLAorICAgIDB4OTBDMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDkwQzIsIDB4MDAwMCwgMHgwMDAwLCAweDkwQzMsIDB4MDAwMCwgMHg5MEM0LCAweDAwMDAsIDB4OTBDNSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwQzYsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OTBDNywgMHg5MEM4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwQzksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OTBDQSwgMHgwMDAwLCAweDAwMDAsIDB4OTBDQiwgMHgwMDAwLCAweDkwQ0MsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwQ0QsIDB4OTBDRSwgMHg5MENGLCAweDkwRDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OTBEMSwgMHgwMDAwLCAweDkwRDIsIDB4OTBEMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg5MEQ0LCAweDAwMDAsIDB4MDAwMCwgMHg5MEQ1LCAweDkwRDYsIDB4MDAwMCwgMHg5MEQ3LAorICAgIDB4OTBEOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OTBEOSwgMHg5MERBLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBEQiwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwREMsIDB4MDAwMCwgMHgwMDAwLCAweDkwREQsIDB4MDAwMCwgMHg5MERFLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBERiwgMHg5MEUwLCAweDkwRTEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDkwRTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwRTMsIDB4MDAwMCwgMHgwMDAwLCAweDkwRTQsCisgICAgMHgwMDAwLCAweDkwRTUsIDB4OTBFNiwgMHgwMDAwLCAweDkwRTcsIDB4OTBFOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHg5MEU5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBFQSwgMHgwMDAwLAorICAgIDB4OTBFQiwgMHg5MEVDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OTBFRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBFRSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDkwRUYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDkwRjAsIDB4OTBGMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDkwRjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBGMywKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEY0LAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBGNSwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OTBGNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MEY3LCAweDAwMDAsIDB4OTBGOCwgMHg5MEY5LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkwRkEsIDB4MDAwMCwgMHg5MEZCLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBGQywgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBGRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTBGRSwKKyAgICAweDkwRkYsIDB4MDAwMCwgMHgwMDAwLCAweDkxMDAsIDB4OTEwMSwgMHgwMDAwLCAweDAwMDAsIDB4OTEwMiwgMHgwMDAwLAorICAgIDB4OTEwMywgMHg5MTA0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkxMDUsIDB4MDAwMCwgMHgwMDAwLCAweDkxMDYsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OTEwNywgMHg5MTA4LCAweDkxMDksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDkxMEEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTEwQiwgMHgwMDAwLCAweDkxMEMsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTEwRCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkxMEUsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTEwRiwgMHg5MTEwLCAweDAwMDAsIDB4OTExMSwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDkxMTIsIDB4OTExMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDkxMTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkxMTUsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTExNiwgMHg5MTE3LCAweDkxMTgsCisgICAgMHg5MTE5LCAweDkxMUEsIDB4OTExQiwgMHg5MTFDLCAweDkxMUQsIDB4OTExRSwgMHg5MTFGLCAweDkxMjAsIDB4OTEyMSwKKyAgICAweDkxMjIsIDB4OTEyMywgMHg5MTI0LCAweDkxMjUsIDB4OTEyNiwgMHg5MTI3LCAweDkxMjgsIDB4OTEyOSwgMHg5MTJBLAorICAgIDB4OTEyQiwgMHg5MTJDLCAweDkxMkQsIDB4OTEyRSwgMHg5MTJGLCAweDkxMzAsIDB4OTEzMSwgMHg5MTMyLCAweDkxMzMsCisgICAgMHg5MTM0LCAweDkxMzUsIDB4OTEzNiwgMHg5MTM3LCAweDkxMzgsIDB4OTEzOSwgMHg5MTNBLCAweDkxM0IsIDB4OTEzQywKKyAgICAweDkxM0QsIDB4OTEzRSwgMHg5MTNGLCAweDkxNDAsIDB4OTE0MSwgMHg5MTQyLCAweDkxNDMsIDB4OTE0NCwgMHg5MTQ1LAorICAgIDB4OTE0NiwgMHg5MTQ3LCAweDkxNDgsIDB4OTE0OSwgMHg5MTRBLCAweDkxNEIsIDB4OTE0QywgMHg5MTRELCAweDkxNEUsCisgICAgMHg5MTRGLCAweDkxNTAsIDB4OTE1MSwgMHg5MTUyLCAweDkxNTMsIDB4OTE1NCwgMHg5MTU1LCAweDkxNTYsIDB4OTE1NywKKyAgICAweDkxNTgsIDB4OTE1OSwgMHg5MTVBLCAweDkxNUIsIDB4OTE1QywgMHg5MTVELCAweDkxNUUsIDB4OTE1RiwgMHg5MTYwLAorICAgIDB4OTE2MSwgMHg5MTYyLCAweDkxNjMsIDB4OTE2NCwgMHg5MTY1LCAweDkxNjYsIDB4OTE2NywgMHg5MTY4LCAweDkxNjksCisgICAgMHg5MTZBLCAweDkxNkIsIDB4OTE2QywgMHg5MTZELCAweDkxNkUsIDB4OTE2RiwgMHg5MTcwLCAweDkxNzEsIDB4OTE3MiwKKyAgICAweDkxNzMsIDB4OTE3NCwgMHg5MTc1LCAweDkxNzYsIDB4OTE3NywgMHg5MTc4LCAweDkxNzksIDB4OTE3QSwgMHg5MTdCLAorICAgIDB4OTE3QywgMHg5MTdELCAweDkxN0UsIDB4OTE3RiwgMHg5MTgwLCAweDkxODEsIDB4OTE4MiwgMHg5MTgzLCAweDkxODQsCisgICAgMHg5MTg1LCAweDkxODYsIDB4OTE4NywgMHg5MTg4LCAweDkxODksIDB4OTE4QSwgMHg5MThCLCAweDkxOEMsIDB4OTE4RCwKKyAgICAweDkxOEUsIDB4OTE4RiwgMHg5MTkwLCAweDkxOTEsIDB4OTE5MiwgMHg5MTkzLCAweDkxOTQsIDB4OTE5NSwgMHg5MTk2LAorICAgIDB4OTE5NywgMHg5MTk4LCAweDkxOTksIDB4OTE5QSwgMHg5MTlCLCAweDkxOUMsIDB4OTE5RCwgMHg5MTlFLCAweDkxOUYsCisgICAgMHg5MUEwLCAweDkxQTEsIDB4OTFBMiwgMHg5MUEzLCAweDkxQTQsIDB4OTFBNSwgMHg5MUE2LCAweDkxQTcsIDB4OTFBOCwKKyAgICAweDkxQTksIDB4OTFBQSwgMHg5MUFCLCAweDkxQUMsIDB4OTFBRCwgMHg5MUFFLCAweDkxQUYsIDB4OTFCMCwgMHg5MUIxLAorICAgIDB4OTFCMiwgMHg5MUIzLCAweDkxQjQsIDB4OTFCNSwgMHg5MUI2LCAweDkxQjcsIDB4OTFCOCwgMHg5MUI5LCAweDkxQkEsCisgICAgMHg5MUJCLCAweDkxQkMsIDB4OTFCRCwgMHg5MUJFLCAweDkxQkYsIDB4OTFDMCwgMHg5MUMxLCAweDkxQzIsIDB4OTFDMywKKyAgICAweDkxQzQsIDB4OTFDNSwgMHg5MUM2LCAweDkxQzcsIDB4OTFDOCwgMHg5MUM5LCAweDkxQ0EsIDB4OTFDQiwgMHg5MUNDLAorICAgIDB4OTFDRCwgMHg5MUNFLCAweDkxQ0YsIDB4OTFEMCwgMHg5MUQxLCAweDkxRDIsIDB4OTFEMywgMHg5MUQ0LCAweDkxRDUsCisgICAgMHg5MUQ2LCAweDkxRDcsIDB4OTFEOCwgMHg5MUQ5LCAweDkxREEsIDB4OTFEQiwgMHg5MURDLCAweDkxREQsIDB4OTFERSwKKyAgICAweDkxREYsIDB4OTFFMCwgMHg5MUUxLCAweDkxRTIsIDB4OTFFMywgMHg5MUU0LCAweDkxRTUsIDB4OTFFNiwgMHg5MUU3LAorICAgIDB4OTFFOCwgMHg5MUU5LCAweDkxRUEsIDB4OTFFQiwgMHg5MUVDLCAweDkxRUQsIDB4OTFFRSwgMHg5MUVGLCAweDkxRjAsCisgICAgMHg5MUYxLCAweDkxRjIsIDB4OTFGMywgMHg5MUY0LCAweDkxRjUsIDB4OTFGNiwgMHg5MUY3LCAweDkxRjgsIDB4OTFGOSwKKyAgICAweDkxRkEsIDB4OTFGQiwgMHg5MUZDLCAweDkxRkQsIDB4OTFGRSwgMHg5MUZGLCAweDkyMDAsIDB4OTIwMSwgMHg5MjAyLAorICAgIDB4OTIwMywgMHg5MjA0LCAweDkyMDUsIDB4OTIwNiwgMHg5MjA3LCAweDkyMDgsIDB4OTIwOSwgMHg5MjBBLCAweDkyMEIsCisgICAgMHg5MjBDLCAweDkyMEQsIDB4OTIwRSwgMHg5MjBGLCAweDkyMTAsIDB4OTIxMSwgMHg5MjEyLCAweDkyMTMsIDB4OTIxNCwKKyAgICAweDkyMTUsIDB4OTIxNiwgMHg5MjE3LCAweDkyMTgsIDB4OTIxOSwgMHg5MjFBLCAweDkyMUIsIDB4OTIxQywgMHg5MjFELAorICAgIDB4OTIxRSwgMHg5MjFGLCAweDkyMjAsIDB4OTIyMSwgMHg5MjIyLCAweDkyMjMsIDB4MDAwMCwgMHgwMDAwLCAweDkyMjQsCisgICAgMHgwMDAwLCAweDkyMjUsIDB4MDAwMCwgMHgwMDAwLCAweDkyMjYsIDB4OTIyNywgMHg5MjI4LCAweDkyMjksIDB4OTIyQSwKKyAgICAweDkyMkIsIDB4OTIyQywgMHg5MjJELCAweDkyMkUsIDB4OTIyRiwgMHgwMDAwLCAweDkyMzAsIDB4MDAwMCwgMHg5MjMxLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDkyMzIsIDB4OTIzMywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5MjM0LCAweDkyMzUsCisgICAgMHg5MjM2LCAweDkyMzcsIDB4MDAwMCwgMHgwMDAwLCAweDkyMzgsIDB4OTIzOSwgMHg5MjNBLCAweDkyM0IsIDB4OTIzQywKKyAgICAweDkyM0QsIDB4OTIzRSwgMHg5MjNGLCAweDkyNDAsIDB4OTI0MSwgMHg5MjQyLCAweDkyNDMsIDB4OTI0NCwgMHg5MjQ1LAorICAgIDB4OTI0NiwgMHg5MjQ3LCAweDkyNDgsIDB4OTI0OSwgMHg5MjRBLCAweDkyNEIsIDB4OTI0QywgMHg5MjRELCAweDkyNEUsCisgICAgMHg5MjRGLCAweDkyNTAsIDB4OTI1MSwgMHg5MjUyLCAweDkyNTMsIDB4OTI1NCwgMHg5MjU1LCAweDkyNTYsIDB4OTI1NywKKyAgICAweDkyNTgsIDB4OTI1OSwgMHg5MjVBLCAweDkyNUIsIDB4OTI1QywgMHg5MjVELCAweDkyNUUsIDB4OTI1RiwgMHg5MjYwLAorICAgIDB4OTI2MSwgMHg5MjYyLCAweDkyNjMsIDB4OTI2NCwgMHg5MjY1LCAweDkyNjYsIDB4OTI2NywgMHg5MjY4LCAweDkyNjksCisgICAgMHg5MjZBLCAweDkyNkIsIDB4OTI2QywgMHg5MjZELCAweDkyNkUsIDB4OTI2RiwgMHg5MjcwLCAweDkyNzEsIDB4OTI3MiwKKyAgICAweDkyNzMsIDB4MDAwMCwgMHg5Mjc0LCAweDAwMDAsIDB4MDAwMCwgMHg5Mjc1LCAweDkyNzYsIDB4OTI3NywgMHg5Mjc4LAorICAgIDB4OTI3OSwgMHg5MjdBLCAweDkyN0IsIDB4OTI3QywgMHg5MjdELCAweDkyN0UsIDB4OTI3RiwgMHg5MjgwLCAweDkyODEsCisgICAgMHg5MjgyLCAweDkyODMsIDB4OTI4NCwgMHg5Mjg1LCAweDkyODYsIDB4OTI4NywgMHg5Mjg4LCAweDkyODksIDB4OTI4QSwKKyAgICAweDkyOEIsIDB4OTI4QywgMHg5MjhELCAweDkyOEUsIDB4OTI4RiwgMHg5MjkwLCAweDkyOTEsIDB4OTI5MiwgMHg5MjkzLAorICAgIDB4OTI5NCwgMHg5Mjk1LCAweDkyOTYsIDB4OTI5NywgMHg5Mjk4LCAweDkyOTksIDB4OTI5QSwgMHg5MjlCLCAweDkyOUMsCisgICAgMHg5MjlELCAweDkyOUUsIDB4OTI5RiwgMHg5MkEwLCAweDkyQTEsIDB4OTJBMiwgMHg5MkEzLCAweDkyQTQsIDB4OTJBNSwKKyAgICAweDkyQTYsIDB4OTJBNywgMHg5MkE4LCAweDkyQTksIDB4OTJBQSwgMHg5MkFCLCAweDkyQUMsIDB4OTJBRCwgMHg5MkFFLAorICAgIDB4OTJBRiwgMHg5MkIwLCAweDkyQjEsIDB4OTJCMiwgMHg5MkIzLCAweDkyQjQsIDB4OTJCNSwgMHg5MkI2LCAweDkyQjcsCisgICAgMHg5MkI4LCAweDkyQjksIDB4OTJCQSwgMHg5MkJCLCAweDkyQkMsIDB4OTJCRCwgMHg5MkJFLCAweDkyQkYsIDB4OTJDMCwKKyAgICAweDkyQzEsIDB4OTJDMiwgMHg5MkMzLCAweDkyQzQsIDB4OTJDNSwgMHg5MkM2LCAweDkyQzcsIDB4OTJDOCwgMHg5MkM5LAorICAgIDB4OTJDQSwgMHg5MkNCLCAweDkyQ0MsIDB4OTJDRCwgMHg5MkNFLCAweDkyQ0YsIDB4OTJEMCwgMHg5MkQxLCAweDkyRDIsCisgICAgMHg5MkQzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkyRDQsIDB4OTJENSwgMHg5MkQ2LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4OTJENywgMHg5MkQ4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIzQUMsIDB4MjNBRSwgMHgyM0IwLCAweDMzMTIsCisgICAgMHgzMzE1LCAweDIzQjIsIDB4MjNCNCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIzQjYsIDB4MjNCOCwgMHgyM0JBLAorICAgIDB4MjNCQywgMHgyM0JFLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyM0MwLCAweDAwMDAsCisgICAgMHgyM0MyLCAweDkyRDksIDB4OTJEQSwgMHg5MkRCLCAweDkyREMsIDB4OTJERCwgMHg5MkRFLCAweDkyREYsIDB4OTJFMCwKKyAgICAweDkyRTEsIDB4OTJFMiwgMHgyM0M0LCAweDIzQzYsIDB4MjNDOCwgMHgyM0NBLCAweDIzQ0MsIDB4MjNDRSwgMHgyM0QwLAorICAgIDB4MjNEMiwgMHgyM0Q0LCAweDIzRDYsIDB4MjNEOCwgMHgyM0RBLCAweDIzREMsIDB4MDAwMCwgMHgyM0RFLCAweDIzRTAsCisgICAgMHgyM0UyLCAweDIzRTQsIDB4MjNFNiwgMHgwMDAwLCAweDIzRTgsIDB4MDAwMCwgMHgyM0VBLCAweDIzRUMsIDB4MDAwMCwKKyAgICAweDIzRUUsIDB4MjNGMCwgMHgwMDAwLCAweDIzRjIsIDB4MjNGNCwgMHgyM0Y2LCAweDIzRjgsIDB4MjNGQSwgMHgyM0ZDLAorICAgIDB4MjNGRSwgMHgyNDAwLCAweDI0MDIsIDB4MjQwNCwgMHg5MkUzLCAweDkyRTQsIDB4OTJFNSwgMHg5MkU2LCAweDkyRTcsCisgICAgMHg5MkU4LCAweDkyRTksIDB4OTJFQSwgMHg5MkVCLCAweDkyRUMsIDB4OTJFRCwgMHg5MkVFLCAweDkyRUYsIDB4OTJGMCwKKyAgICAweDkyRjEsIDB4OTJGMiwgMHg5MkYzLCAweDkyRjQsIDB4OTJGNSwgMHg5MkY2LCAweDkyRjcsIDB4OTJGOCwgMHg5MkY5LAorICAgIDB4OTJGQSwgMHg5MkZCLCAweDkyRkMsIDB4OTJGRCwgMHg5MkZFLCAweDkyRkYsIDB4OTMwMCwgMHg5MzAxLCAweDkzMDIsCisgICAgMHg5MzAzLCAweDkzMDQsIDB4OTMwNSwgMHg5MzA2LCAweDkzMDcsIDB4OTMwOCwgMHg5MzA5LCAweDkzMEEsIDB4OTMwQiwKKyAgICAweDkzMEMsIDB4OTMwRCwgMHg5MzBFLCAweDkzMEYsIDB4OTMxMCwgMHg5MzExLCAweDkzMTIsIDB4OTMxMywgMHg5MzE0LAorICAgIDB4OTMxNSwgMHg5MzE2LCAweDkzMTcsIDB4OTMxOCwgMHg5MzE5LCAweDkzMUEsIDB4OTMxQiwgMHg5MzFDLCAweDkzMUQsCisgICAgMHg5MzFFLCAweDkzMUYsIDB4OTMyMCwgMHg5MzIxLCAweDkzMjIsIDB4OTMyMywgMHg5MzI0LCAweDkzMjUsIDB4OTMyNiwKKyAgICAweDkzMjcsIDB4OTMyOCwgMHg5MzI5LCAweDkzMkEsIDB4OTMyQiwgMHg5MzJDLCAweDkzMkQsIDB4OTMyRSwgMHg5MzJGLAorICAgIDB4OTMzMCwgMHg5MzMxLCAweDkzMzIsIDB4OTMzMywgMHg5MzM0LCAweDkzMzUsIDB4OTMzNiwgMHg5MzM3LCAweDkzMzgsCisgICAgMHg5MzM5LCAweDkzM0EsIDB4OTMzQiwgMHg5MzNDLCAweDkzM0QsIDB4OTMzRSwgMHg5MzNGLCAweDkzNDAsIDB4OTM0MSwKKyAgICAweDkzNDIsIDB4OTM0MywgMHg5MzQ0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4OTM0NSwgMHg5MzQ2LCAweDkzNDcsIDB4OTM0OCwgMHg5MzQ5LCAweDkzNEEsIDB4OTM0QiwgMHg5MzRDLCAweDkzNEQsCisgICAgMHg5MzRFLCAweDkzNEYsIDB4OTM1MCwgMHg5MzUxLCAweDkzNTIsIDB4OTM1MywgMHg5MzU0LCAweDkzNTUsIDB4OTM1NiwKKyAgICAweDkzNTcsIDB4OTM1OCwgMHg5MzU5LCAweDkzNUEsIDB4OTM1QiwgMHgyNDA2LCAweDI0MDgsIDB4MjQwQSwgMHgyNDBDLAorICAgIDB4MjQwRSwgMHgyNDEwLCAweDI0MTIsIDB4MjQxNCwgMHgyNDE2LCAweDI0MTgsIDB4MjQxQSwgMHgyNDFDLCAweDI0MUUsCisgICAgMHgyNDIwLCAweDI0MjIsIDB4MjQyNCwgMHgyNDI2LCAweDI0MjgsIDB4OTM1QywgMHg5MzVELCAweDkzNUUsIDB4OTM1RiwKKyAgICAweDI0MkEsIDB4MjQyQywgMHgyNDJFLCAweDI0MzAsIDB4MjQzMiwgMHgyNDM0LCAweDI0MzYsIDB4MjQzOCwgMHgyNDNBLAorICAgIDB4MjQzQywgMHgyNDNFLCAweDI0NDAsIDB4MjQ0MiwgMHgyNDQ0LCAweDI0NDYsIDB4MjQ0OCwgMHgyNDRBLCAweDI0NEMsCisgICAgMHgyNDRFLCAweDI0NTAsIDB4MjQ1MiwgMHgyNDU0LCAweDI0NTYsIDB4MjQ1OCwgMHgyNDVBLCAweDI0NUMsIDB4MjQ1RSwKKyAgICAweDI0NjAsIDB4MjQ2MiwgMHgyNDY0LCAweDI0NjYsIDB4MjQ2OCwgMHgyNDZBLCAweDI0NkMsIDB4MjQ2RSwgMHgyNDcwLAorICAgIDB4MjQ3MiwgMHgyNDc0LCAweDI0NzYsIDB4MjQ3OCwgMHgyNDdBLCAweDI0N0MsIDB4MjQ3RSwgMHgyNDgwLCAweDI0ODIsCisgICAgMHgyNDg0LCAweDI0ODYsIDB4MjQ4OCwgMHgyNDhBLCAweDI0OEMsIDB4MjQ4RSwgMHgyNDkwLCAweDI0OTIsIDB4MjQ5NCwKKyAgICAweDI0OTYsIDB4MjQ5OCwgMHgyNDlBLCAweDI0OUMsIDB4MjQ5RSwgMHgyNEEwLCAweDI0QTIsIDB4MjRBNCwgMHgyNEE2LAorICAgIDB4MjRBOCwgMHgyNEFBLCAweDI0QUMsIDB4MjRBRSwgMHgyNEIwLCAweDI0QjIsIDB4MjRCNCwgMHgyNEI2LCAweDI0QjgsCisgICAgMHgyNEJBLCAweDI0QkMsIDB4MjRCRSwgMHgyNEMwLCAweDI0QzIsIDB4MjRDNCwgMHgyNEM2LCAweDI0QzgsIDB4MjRDQSwKKyAgICAweDI0Q0MsIDB4MjRDRSwgMHgyNEQwLCAweDI0RDIsIDB4MjRENCwgMHgyNEQ2LCAweDI0RDgsIDB4MjREQSwgMHgyNERDLAorICAgIDB4MjRERSwgMHgyNEUwLCAweDI0RTIsIDB4MjRFNCwgMHgyNEU2LCAweDI0RTgsIDB4MjRFQSwgMHgyNEVDLCAweDI0RUUsCisgICAgMHgyNEYwLCAweDI0RjIsIDB4MjRGNCwgMHgyNEY2LCAweDI0RjgsIDB4MjRGQSwgMHgyNEZDLCAweDI0RkUsIDB4MjUwMCwKKyAgICAweDI1MDIsIDB4MjUwNCwgMHgyNTA2LCAweDI1MDgsIDB4MjUwQSwgMHgyNTBDLCAweDI1MEUsIDB4MjUxMCwgMHgyNTEyLAorICAgIDB4MjUxNCwgMHgyNTE2LCAweDI1MTgsIDB4MjUxQSwgMHgyNTFDLCAweDI1MUUsIDB4MjUyMCwgMHgyNTIyLCAweDI1MjQsCisgICAgMHgyNTI2LCAweDI1MjgsIDB4MjUyQSwgMHgyNTJDLCAweDI1MkUsIDB4MjUzMCwgMHgyNTMyLCAweDI1MzQsIDB4MjUzNiwKKyAgICAweDI1MzgsIDB4MjUzQSwgMHgyNTNDLCAweDI1M0UsIDB4MjU0MCwgMHgyNTQyLCAweDI1NDQsIDB4MjU0NiwgMHgyNTQ4LAorICAgIDB4MjU0QSwgMHgyNTRDLCAweDI1NEUsIDB4MjU1MCwgMHgyNTUyLCAweDI1NTQsIDB4MjU1NiwgMHgyNTU4LCAweDI1NUEsCisgICAgMHgyNTVDLCAweDI1NUUsIDB4MjU2MCwgMHgyNTYyLCAweDI1NjQsIDB4MjU2NiwgMHgyNTY4LCAweDI1NkEsIDB4MjU2QywKKyAgICAweDI1NkUsIDB4MjU3MCwgMHgyNTcyLCAweDI1NzQsIDB4MjU3NiwgMHgyNTc4LCAweDI1N0EsIDB4MjU3QywgMHgyNTdFLAorICAgIDB4MjU4MCwgMHgyNTgyLCAweDI1ODQsIDB4MjU4NiwgMHgyNTg4LCAweDI1OEEsIDB4MjU4QywgMHgyNThFLCAweDI1OTAsCisgICAgMHgyNTkyLCAweDI1OTQsIDB4MjU5NiwgMHgyNTk4LCAweDI1OUEsIDB4MjU5QywgMHgyNTlFLCAweDI1QTAsIDB4MjVBMiwKKyAgICAweDI1QTQsIDB4MjVBNiwgMHgyNUE4LCAweDI1QUEsIDB4MjVBQywgMHgyNUFFLCAweDI1QjAsIDB4MjVCMiwgMHgyNUI0LAorICAgIDB4MjVCNiwgMHgyNUI4LCAweDI1QkEsIDB4MjVCQywgMHgyNUJFLCAweDI1QzAsIDB4MjVDMiwgMHgyNUM0LCAweDI1QzYsCisgICAgMHgyNUM4LCAweDI1Q0EsIDB4MjVDQywgMHgyNUNFLCAweDI1RDAsIDB4MjVEMiwgMHgyNUQ0LCAweDI1RDYsIDB4MjVEOCwKKyAgICAweDI1REEsIDB4MjVEQywgMHgyNURFLCAweDI1RTAsIDB4MjVFMiwgMHgyNUU0LCAweDI1RTYsIDB4MjVFOCwgMHgyNUVBLAorICAgIDB4MjVFQywgMHgyNUVFLCAweDI1RjAsIDB4MjVGMiwgMHgyNUY0LCAweDI1RjYsIDB4MjVGOCwgMHgyNUZBLCAweDI1RkMsCisgICAgMHgyNUZFLCAweDI2MDAsIDB4MjYwMiwgMHgyNjA0LCAweDI2MDYsIDB4MjYwOCwgMHgyNjBBLCAweDI2MEMsIDB4MzMxOCwKKyAgICAweDMzMUIsIDB4MzMxRSwgMHgyNjBFLCAweDI2MTAsIDB4MjYxMiwgMHgyNjE0LCAweDI2MTYsIDB4MjYxOCwgMHgyNjFBLAorICAgIDB4MjYxQywgMHgyNjFFLCAweDI2MjAsIDB4MjYyMiwgMHgyNjI0LCAweDI2MjYsIDB4MjYyOCwgMHgyNjJBLCAweDI2MkMsCisgICAgMHgyNjJFLCAweDI2MzAsIDB4MjYzMiwgMHgyNjM0LCAweDI2MzYsIDB4MjYzOCwgMHgyNjNBLCAweDI2M0MsIDB4MjYzRSwKKyAgICAweDI2NDAsIDB4MjY0MiwgMHgyNjQ0LCAweDI2NDYsIDB4MjY0OCwgMHgyNjRBLCAweDI2NEMsIDB4MjY0RSwgMHgyNjUwLAorICAgIDB4MjY1MiwgMHgyNjU0LCAweDI2NTYsIDB4MjY1OCwgMHgyNjVBLCAweDI2NUMsIDB4MjY1RSwgMHgyNjYwLCAweDI2NjIsCisgICAgMHgyNjY0LCAweDI2NjYsIDB4MjY2OCwgMHgyNjZBLCAweDI2NkMsIDB4MjY2RSwgMHgyNjcwLCAweDI2NzIsIDB4MjY3NCwKKyAgICAweDI2NzYsIDB4MjY3OCwgMHgyNjdBLCAweDI2N0MsIDB4MjY3RSwgMHgyNjgwLCAweDI2ODIsIDB4MjY4NCwgMHgyNjg2LAorICAgIDB4MjY4OCwgMHgyNjhBLCAweDI2OEMsIDB4MjY4RSwgMHgyNjkwLCAweDI2OTIsIDB4MjY5NCwgMHgyNjk2LCAweDI2OTgsCisgICAgMHgyNjlBLCAweDI2OUMsIDB4MjY5RSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MzMyMSwgMHgzMzI0LCAweDMzMjcsIDB4MzMyQSwgMHgzMzJELCAweDMzMzAsCisgICAgMHgzMzMzLCAweDMzMzYsIDB4MzMzOSwgMHgzMzNDLCAweDMzM0YsIDB4MzM0MiwgMHgzMzQ1LCAweDMzNDgsIDB4MzM0QiwKKyAgICAweDMzNEUsIDB4MzM1MSwgMHgzMzU0LCAweDMzNTcsIDB4MzM1QSwgMHgzMzVELCAweDMzNjAsIDB4MzM2MywgMHgzMzY2LAorICAgIDB4MzM2OSwgMHgzMzZDLCAweDMzNkYsIDB4MzM3MiwgMHgzMzc1LCAweDMzNzgsIDB4MzM3QiwgMHgzMzdFLCAweDMzODEsCisgICAgMHgzMzg0LCAweDMzODcsIDB4MzM4QSwgMHgzMzhELCAweDMzOTAsIDB4MzM5MywgMHgzMzk2LCAweDMzOTksIDB4MzM5QywKKyAgICAweDMzOUYsIDB4MzNBMiwgMHgzM0E1LCAweDMzQTgsIDB4MzNBQiwgMHgzM0FFLCAweDMzQjEsIDB4MzNCNCwgMHgzM0I3LAorICAgIDB4MzNCQSwgMHgzM0JELCAweDMzQzAsIDB4MzNDMywgMHgzM0M2LCAweDMzQzksIDB4MzNDQywgMHgzM0NGLCAweDMzRDIsCisgICAgMHgzM0Q1LCAweDMzRDgsIDB4MzNEQiwgMHgzM0RFLCAweDAwMDAsIDB4MDAwMCwgMHgzM0UxLCAweDMzRTQsIDB4MzNFNywKKyAgICAweDMzRUEsIDB4MzNFRCwgMHgzM0YwLCAweDMzRjMsIDB4MzNGNiwgMHgzM0Y5LCAweDMzRkMsIDB4MzNGRiwgMHgzNDAyLAorICAgIDB4MzQwNSwgMHgzNDA4LCAweDM0MEIsIDB4MzQwRSwgMHgzNDExLCAweDM0MTQsIDB4MzQxNywgMHgzNDFBLCAweDM0MUQsCisgICAgMHgzNDIwLCAweDM0MjMsIDB4MzQyNiwgMHgzNDI5LCAweDM0MkMsIDB4MzQyRiwgMHgzNDMyLCAweDM0MzUsIDB4MzQzOCwKKyAgICAweDM0M0IsIDB4MzQzRSwgMHgzNDQxLCAweDM0NDQsIDB4MzQ0NywgMHgzNDRBLCAweDM0NEQsIDB4MzQ1MCwgMHgzNDUzLAorICAgIDB4MzQ1NiwgMHgzNDU5LCAweDM0NUMsIDB4MzQ1RiwgMHgzNDYyLCAweDM0NjUsIDB4MzQ2OCwgMHgzNDZCLCAweDM0NkUsCisgICAgMHgzNDcxLCAweDM0NzQsIDB4MzQ3NywgMHgzNDdBLCAweDM0N0QsIDB4MzQ4MCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgzNDgzLCAweDM0ODYsIDB4NDFBNCwgMHg0MUE5LCAweDQxQUUsIDB4NDFCMywgMHg0MUI4LCAweDQxQkQsCisgICAgMHg0MUMyLCAweDM0ODksIDB4NDFDNywgMHg0MURBLCAweDQxRTMsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4OTM2MCwgMHg5MzYxLCAweDkzNjIsCisgICAgMHg5MzYzLCAweDkzNjQsIDB4OTM2NSwgMHg5MzY2LCAweDkzNjcsIDB4OTM2OCwgMHg5MzY5LCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OTM2QSwgMHg5MzZCLCAweDkzNkMsIDB4OTM2RCwgMHg5MzZFLCAweDkzNkYsIDB4OTM3MCwKKyAgICAweDkzNzEsIDB4OTM3MiwgMHg5MzczLCAweDkzNzQsIDB4OTM3NSwgMHg5Mzc2LCAweDkzNzcsIDB4OTM3OCwgMHg5Mzc5LAorICAgIDB4OTM3QSwgMHg5MzdCLCAweDkzN0MsIDB4OTM3RCwgMHg5MzdFLCAweDAwMDAsIDB4MDAwMCwgMHg5MzdGLCAweDkzODAsCisgICAgMHg5MzgxLCAweDkzODIsIDB4OTM4MywgMHg5Mzg0LCAweDkzODUsIDB4OTM4NiwgMHg5Mzg3LCAweDkzODgsIDB4OTM4OSwKKyAgICAweDkzOEEsIDB4MDAwMCwgMHg5MzhCLCAweDkzOEMsIDB4OTM4RCwgMHg5MzhFLCAweDkzOEYsIDB4OTM5MCwgMHg5MzkxLAorICAgIDB4OTM5MiwgMHg5MzkzLCAweDkzOTQsIDB4OTM5NSwgMHg5Mzk2LCAweDkzOTcsIDB4OTM5OCwgMHg5Mzk5LCAweDkzOUEsCisgICAgMHg5MzlCLCAweDkzOUMsIDB4OTM5RCwgMHgwMDAwLCAweDkzOUUsIDB4OTM5RiwgMHg5M0EwLCAweDkzQTEsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDkzQTIsIDB4MjZBMCwgMHg5M0EzLCAweDAwMDAsIDB4OTNBNCwgMHgwMDAwLAorICAgIDB4OTNBNSwgMHgyNkEyLCAweDkzQTYsIDB4MjZBNCwgMHg5M0E3LCAweDI2QTYsIDB4OTNBOCwgMHgyNkE4LCAweDkzQTksCisgICAgMHgyNkFBLCAweDkzQUEsIDB4OTNBQiwgMHg5M0FDLCAweDkzQUQsIDB4OTNBRSwgMHg5M0FGLCAweDkzQjAsIDB4OTNCMSwKKyAgICAweDkzQjIsIDB4OTNCMywgMHg5M0I0LCAweDkzQjUsIDB4OTNCNiwgMHg5M0I3LCAweDkzQjgsIDB4OTNCOSwgMHg5M0JBLAorICAgIDB4OTNCQiwgMHg5M0JDLCAweDkzQkQsIDB4OTNCRSwgMHg5M0JGLCAweDkzQzAsIDB4OTNDMSwgMHg5M0MyLCAweDkzQzMsCisgICAgMHg5M0M0LCAweDkzQzUsIDB4OTNDNiwgMHg5M0M3LCAweDkzQzgsIDB4OTNDOSwgMHg5M0NBLCAweDkzQ0IsIDB4OTNDQywKKyAgICAweDkzQ0QsIDB4OTNDRSwgMHg5M0NGLCAweDkzRDAsIDB4OTNEMSwgMHg5M0QyLCAweDkzRDMsIDB4OTNENCwgMHg5M0Q1LAorICAgIDB4OTNENiwgMHg5M0Q3LCAweDkzRDgsIDB4OTNEOSwgMHg5M0RBLCAweDkzREIsIDB4OTNEQywgMHg5M0RELCAweDkzREUsCisgICAgMHg5M0RGLCAweDkzRTAsIDB4OTNFMSwgMHg5M0UyLCAweDkzRTMsIDB4OTNFNCwgMHg5M0U1LCAweDkzRTYsIDB4OTNFNywKKyAgICAweDkzRTgsIDB4OTNFOSwgMHg5M0VBLCAweDkzRUIsIDB4OTNFQywgMHg5M0VELCAweDkzRUUsIDB4OTNFRiwgMHg5M0YwLAorICAgIDB4OTNGMSwgMHg5M0YyLCAweDkzRjMsIDB4OTNGNCwgMHg5M0Y1LCAweDkzRjYsIDB4OTNGNywgMHg5M0Y4LCAweDkzRjksCisgICAgMHg5M0ZBLCAweDkzRkIsIDB4OTNGQywgMHg5M0ZELCAweDkzRkUsIDB4OTNGRiwgMHg5NDAwLCAweDk0MDEsIDB4OTQwMiwKKyAgICAweDk0MDMsIDB4OTQwNCwgMHg5NDA1LCAweDk0MDYsIDB4OTQwNywgMHg5NDA4LCAweDk0MDksIDB4OTQwQSwgMHg5NDBCLAorICAgIDB4OTQwQywgMHg5NDBELCAweDk0MEUsIDB4OTQwRiwgMHg5NDEwLCAweDk0MTEsIDB4OTQxMiwgMHg5NDEzLCAweDk0MTQsCisgICAgMHg5NDE1LCAweDk0MTYsIDB4OTQxNywgMHg5NDE4LCAweDk0MTksIDB4OTQxQSwgMHg5NDFCLCAweDk0MUMsIDB4OTQxRCwKKyAgICAweDk0MUUsIDB4MjZBQywgMHgyNkFFLCAweDI2QjAsIDB4MjZCMiwgMHgyNkI0LCAweDI2QjYsIDB4MjZCOCwgMHgyNkJBLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHg5NDFGLCAweDk0MjAsIDB4OTQyMSwgMHg5NDIyLCAweDk0MjMsCisgICAgMHg5NDI0LCAweDk0MjUsIDB4OTQyNiwgMHg5NDI3LCAweDk0MjgsIDB4OTQyOSwgMHg5NDJBLCAweDk0MkIsIDB4OTQyQywKKyAgICAweDk0MkQsIDB4OTQyRSwgMHg5NDJGLCAweDk0MzAsIDB4OTQzMSwgMHg5NDMyLCAweDk0MzMsIDB4OTQzNCwgMHg5NDM1LAorICAgIDB4OTQzNiwgMHg5NDM3LCAweDk0MzgsIDB4OTQzOSwgMHg5NDNBLCAweDk0M0IsIDB4OTQzQywgMHg5NDNELCAweDk0M0UsCisgICAgMHg5NDNGLCAweDk0NDAsIDB4OTQ0MSwgMHg5NDQyLCAweDk0NDMsIDB4OTQ0NCwgMHg5NDQ1LCAweDk0NDYsIDB4OTQ0NywKKyAgICAweDk0NDgsIDB4OTQ0OSwgMHg5NDRBLCAweDk0NEIsIDB4OTQ0QywgMHg5NDRELCAweDk0NEUsIDB4OTQ0RiwgMHg5NDUwLAorICAgIDB4OTQ1MSwgMHg5NDUyLCAweDk0NTMsIDB4OTQ1NCwgMHg5NDU1LCAweDk0NTYsIDB4OTQ1NywgMHg5NDU4LCAweDk0NTksCisgICAgMHg5NDVBLCAweDk0NUIsIDB4OTQ1QywgMHg5NDVELCAweDk0NUUsIDB4OTQ1RiwgMHg5NDYwLCAweDk0NjEsIDB4OTQ2MiwKKyAgICAweDk0NjMsIDB4OTQ2NCwgMHg5NDY1LCAweDk0NjYsIDB4OTQ2NywgMHg5NDY4LCAweDk0NjksIDB4OTQ2QSwgMHg5NDZCLAorICAgIDB4OTQ2QywgMHg5NDZELCAweDk0NkUsIDB4OTQ2RiwgMHg5NDcwLCAweDk0NzEsIDB4OTQ3MiwgMHg5NDczLCAweDk0NzQsCisgICAgMHg5NDc1LCAweDk0NzYsIDB4OTQ3NywgMHg5NDc4LCAweDk0NzksIDB4OTQ3QSwgMHg5NDdCLCAweDk0N0MsIDB4OTQ3RCwKKyAgICAweDk0N0UsIDB4OTQ3RiwgMHg5NDgwLCAweDk0ODEsIDB4OTQ4MiwgMHg5NDgzLCAweDk0ODQsIDB4OTQ4NSwgMHg5NDg2LAorICAgIDB4OTQ4NywgMHg5NDg4LCAweDk0ODksIDB4OTQ4QSwgMHg5NDhCLCAweDk0OEMsIDB4OTQ4RCwgMHg5NDhFLCAweDk0OEYsCisgICAgMHg5NDkwLCAweDk0OTEsIDB4OTQ5MiwgMHg5NDkzLCAweDk0OTQsIDB4OTQ5NSwgMHg5NDk2LCAweDk0OTcsIDB4OTQ5OCwKKyAgICAweDk0OTksIDB4OTQ5QSwgMHg5NDlCLCAweDk0OUMsIDB4OTQ5RCwgMHg5NDlFLCAweDk0OUYsIDB4OTRBMCwgMHg5NEExLAorICAgIDB4OTRBMiwgMHg5NEEzLCAweDk0QTQsIDB4OTRBNSwgMHg5NEE2LCAweDk0QTcsIDB4OTRBOCwgMHg5NEE5LCAweDk0QUEsCisgICAgMHg5NEFCLCAweDk0QUMsIDB4OTRBRCwgMHg5NEFFLCAweDk0QUYsIDB4OTRCMCwgMHg5NEIxLCAweDk0QjIsIDB4OTRCMywKKyAgICAweDk0QjQsIDB4OTRCNSwgMHg5NEI2LCAweDk0QjcsIDB4OTRCOCwgMHg5NEI5LCAweDk0QkEsIDB4OTRCQiwgMHg5NEJDLAorICAgIDB4OTRCRCwgMHg5NEJFLCAweDk0QkYsIDB4OTRDMCwgMHg5NEMxLCAweDk0QzIsIDB4OTRDMywgMHg5NEM0LCAweDk0QzUsCisgICAgMHg5NEM2LCAweDk0QzcsIDB4OTRDOCwgMHg5NEM5LCAweDk0Q0EsIDB4OTRDQiwgMHg5NENDLCAweDk0Q0QsIDB4OTRDRSwKKyAgICAweDk0Q0YsIDB4OTREMCwgMHg5NEQxLCAweDk0RDIsIDB4OTREMywgMHg5NEQ0LCAweDk0RDUsIDB4OTRENiwgMHg5NEQ3LAorICAgIDB4OTREOCwgMHg5NEQ5LCAweDk0REEsIDB4OTREQiwgMHg5NERDLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDk0REQsCisgICAgMHg5NERFLCAweDk0REYsIDB4OTRFMCwgMHg5NEUxLCAweDk0RTIsIDB4MDAwMCwgMHgwMDAwLCAweDk0RTMsIDB4OTRFNCwKKyAgICAweDk0RTUsIDB4OTRFNiwgMHg5NEU3LCAweDk0RTgsIDB4MDAwMCwgMHgwMDAwLCAweDk0RTksIDB4OTRFQSwgMHg5NEVCLAorICAgIDB4OTRFQywgMHg5NEVELCAweDk0RUUsIDB4MDAwMCwgMHgwMDAwLCAweDk0RUYsIDB4OTRGMCwgMHg5NEYxLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4OTRGMiwgMHg5NEYzLCAweDk0RjQsIDB4OTRGNSwgMHg5NEY2LCAweDk0RjcsIDB4OTRGOCwKKyAgICAweDAwMDAsIDB4OTRGOSwgMHg5NEZBLCAweDk0RkIsIDB4OTRGQywgMHg5NEZELCAweDk0RkUsIDB4OTRGRiwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwfTsKKworY29uc3QgRlhfV0NIQVIgZ19Vbmljb2RlRGF0YV9Ob3JtYWxpemF0aW9uX01hcDFbNTM3Nl0gPSB7CisgICAgMHgwMDY2LCAweDAwNTMsIDB4MDA1MywgMHgwMDU5LCAweDAwMjAsIDB4MDMwOCwgMHgwMDYxLCAweDAwNTIsIDB4MDMwNCwKKyAgICAweDAwMzIsIDB4MDAzMywgMHgwMzAxLCAweDAzQkMsIDB4MDMyNywgMHgwMDMxLCAweDAwNkYsIDB4MDA0MSwgMHgwMDQxLAorICAgIDB4MDA0MSwgMHgwMDQxLCAweDAwNDEsIDB4MDA0MSwgMHgwMDQzLCAweDAwNDUsIDB4MDA0NSwgMHgwMDQ1LCAweDAwNDUsCisgICAgMHgwMDQ5LCAweDAwNDksIDB4MDA0OSwgMHgwMDQ5LCAweDAwNDQsIDB4MDA0RSwgMHgwMDRGLCAweDAwNEYsIDB4MDA0RiwKKyAgICAweDAwNEYsIDB4MDA0RiwgMHgwMDRGLCAweDAwNTUsIDB4MDA1NSwgMHgwMDU1LCAweDAwNTUsIDB4MDA1OSwgMHgwMDYxLAorICAgIDB4MDA2MSwgMHgwMDYxLCAweDAwNjEsIDB4MDA2MSwgMHgwMDYxLCAweDAwNjMsIDB4MDA2NSwgMHgwMDY1LCAweDAwNjUsCisgICAgMHgwMDY1LCAweDAwNjksIDB4MDA2OSwgMHgwMDY5LCAweDAwNjksIDB4MDA2RSwgMHgwMDZGLCAweDAwNkYsIDB4MDA2RiwKKyAgICAweDAwNkYsIDB4MDA2RiwgMHgwMDZGLCAweDAwNzUsIDB4MDA3NSwgMHgwMDc1LCAweDAwNzUsIDB4MDA3OSwgMHgwMDc5LAorICAgIDB4MDA0MSwgMHgwMDYxLCAweDAwNDEsIDB4MDA2MSwgMHgwMDQxLCAweDAwNjEsIDB4MDA0MywgMHgwMDYzLCAweDAwNDMsCisgICAgMHgwMDYzLCAweDAwNDMsIDB4MDA2MywgMHgwMDQzLCAweDAwNjMsIDB4MDA0NCwgMHgwMDY0LCAweDAwNDQsIDB4MDA2NCwKKyAgICAweDAwNDUsIDB4MDA2NSwgMHgwMDQ1LCAweDAwNjUsIDB4MDA0NSwgMHgwMDY1LCAweDAwNDUsIDB4MDA2NSwgMHgwMDQ1LAorICAgIDB4MDA2NSwgMHgwMDQ3LCAweDAwNjcsIDB4MDA0NywgMHgwMDY3LCAweDAwNDcsIDB4MDA2NywgMHgwMDQ3LCAweDAwNjcsCisgICAgMHgwMDQ4LCAweDAwNjgsIDB4MDA0OCwgMHgwMDY4LCAweDAwNDksIDB4MDA2OSwgMHgwMDQ5LCAweDAwNjksIDB4MDA0OSwKKyAgICAweDAwNjksIDB4MDA0OSwgMHgwMDY5LCAweDAwNDksIDB4MDA0QSwgMHgwMDZBLCAweDAwNEIsIDB4MDA2QiwgMHgwMDRCLAorICAgIDB4MDA0QywgMHgwMDZDLCAweDAwNEMsIDB4MDA2QywgMHgwMDRDLCAweDAwNkMsIDB4MDA0QywgMHgwMDZDLCAweDAwNEMsCisgICAgMHgwMDZDLCAweDAwNEUsIDB4MDA2RSwgMHgwMDRFLCAweDAwNkUsIDB4MDA0RSwgMHgwMDZFLCAweDAwNkUsIDB4MDA0RiwKKyAgICAweDAwNkYsIDB4MDA0RiwgMHgwMDZGLCAweDAwNEYsIDB4MDA2RiwgMHgwMDUyLCAweDAwNzIsIDB4MDA1MiwgMHgwMDcyLAorICAgIDB4MDA1MiwgMHgwMDcyLCAweDAwNTMsIDB4MDA3MywgMHgwMDUzLCAweDAwNzMsIDB4MDA1MywgMHgwMDczLCAweDAwNTMsCisgICAgMHgwMDczLCAweDAwNTQsIDB4MDA3NCwgMHgwMDU0LCAweDAwNzQsIDB4MDA1NCwgMHgwMDc0LCAweDAwNTUsIDB4MDA3NSwKKyAgICAweDAwNTUsIDB4MDA3NSwgMHgwMDU1LCAweDAwNzUsIDB4MDA1NSwgMHgwMDc1LCAweDAwNTUsIDB4MDA3NSwgMHgwMDU1LAorICAgIDB4MDA3NSwgMHgwMDU3LCAweDAwNzcsIDB4MDA1OSwgMHgwMDc5LCAweDAwNTksIDB4MDA1QSwgMHgwMDdBLCAweDAwNUEsCisgICAgMHgwMDdBLCAweDAwNUEsIDB4MDA3QSwgMHgwMDczLCAweDAwNjIsIDB4MDA0MiwgMHgwMDQyLCAweDAwNjIsIDB4MDA0MywKKyAgICAweDAwNjMsIDB4MDA0NCwgMHgwMDQ0LCAweDAwNDQsIDB4MDA2NCwgMHgwMDQ1LCAweDAwNDUsIDB4MDA0NiwgMHgwMDY2LAorICAgIDB4MDA0NywgMHgwMDQ5LCAweDAwNEIsIDB4MDA2QiwgMHgwMDZDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDZFLCAweDAwNEYsCisgICAgMHgwMDRGLCAweDAwNkYsIDB4MDA1MCwgMHgwMDcwLCAweDAyODMsIDB4MDA3NCwgMHgwMDU0LCAweDAwNzQsIDB4MDA1NCwKKyAgICAweDAwNTUsIDB4MDA3NSwgMHgwMDU2LCAweDAwNTksIDB4MDA3OSwgMHgwMDVBLCAweDAwN0EsIDB4MDFCNywgMHgwMDQxLAorICAgIDB4MDA2MSwgMHgwMDQ5LCAweDAwNjksIDB4MDA0RiwgMHgwMDZGLCAweDAwNTUsIDB4MDA3NSwgMHgwMERDLCAweDAwRkMsCisgICAgMHgwMERDLCAweDAwRkMsIDB4MDBEQywgMHgwMEZDLCAweDAwREMsIDB4MDBGQywgMHgwMDY1LCAweDAwNDEsIDB4MDA2MSwKKyAgICAweDAwNDEsIDB4MDA2MSwgMHgwMEM2LCAweDAwRTYsIDB4MDA0NywgMHgwMDY3LCAweDAwNDcsIDB4MDA2NywgMHgwMDRCLAorICAgIDB4MDA2QiwgMHgwMDRGLCAweDAwNkYsIDB4MDFFQSwgMHgwMUVCLCAweDAxQjcsIDB4MDI5MiwgMHgwMDZBLCAweDAwNDcsCisgICAgMHgwMDY3LCAweDAwNEUsIDB4MDA2RSwgMHgwMDQxLCAweDAwNjEsIDB4MDBDNiwgMHgwMEU2LCAweDAwRDgsIDB4MDBGOCwKKyAgICAweDAwNDEsIDB4MDA2MSwgMHgwMDQxLCAweDAwNjEsIDB4MDA0NSwgMHgwMDY1LCAweDAwNDUsIDB4MDA2NSwgMHgwMDQ5LAorICAgIDB4MDA2OSwgMHgwMDQ5LCAweDAwNjksIDB4MDA0RiwgMHgwMDZGLCAweDAwNEYsIDB4MDA2RiwgMHgwMDUyLCAweDAwNzIsCisgICAgMHgwMDUyLCAweDAwNzIsIDB4MDA1NSwgMHgwMDc1LCAweDAwNTUsIDB4MDA3NSwgMHgwMDUzLCAweDAwNzMsIDB4MDA1NCwKKyAgICAweDAwNzQsIDB4MDA0OCwgMHgwMDY4LCAweDAwNEUsIDB4MDA2NCwgMHgwMDVBLCAweDAwN0EsIDB4MDA0MSwgMHgwMDYxLAorICAgIDB4MDA0NSwgMHgwMDY1LCAweDAwRDYsIDB4MDBGNiwgMHgwMEQ1LCAweDAwRjUsIDB4MDA0RiwgMHgwMDZGLCAweDAyMkUsCisgICAgMHgwMjJGLCAweDAwNTksIDB4MDA3OSwgMHgwMDZDLCAweDAwNkUsIDB4MDA3NCwgMHgwMDZBLCAweDAwNDEsIDB4MDA0MywKKyAgICAweDAwNjMsIDB4MDA0QywgMHgwMDU0LCAweDAwNTMsIDB4MDA1QSwgMHgwMDQyLCAweDAwNTUsIDB4MDA1NiwgMHgwMDQ1LAorICAgIDB4MDA2NSwgMHgwMDRBLCAweDAwNkEsIDB4MDA1MSwgMHgwMDcxLCAweDAwNTIsIDB4MDA3MiwgMHgwMDU5LCAweDAwNzksCisgICAgMHgwMDYxLCAweDAyNTEsIDB4MDA2MiwgMHgwMDZGLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY0LCAweDAwNjUsIDB4MDI1OSwKKyAgICAweDAwNjUsIDB4MDA2NSwgMHgwMDY1LCAweDAwNjUsIDB4MDA2QSwgMHgwMDY3LCAweDAwNjcsIDB4MDA0NywgMHgwMDY4LAorICAgIDB4MDA2OCwgMHgwMDY5LCAweDAwNDksIDB4MDA2QywgMHgwMDZDLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZELCAweDAwNkQsCisgICAgMHgwMDZFLCAweDAwNkUsIDB4MDA2RSwgMHgwMDZGLCAweDAwNzIsIDB4MDA3MiwgMHgwMDcyLCAweDAwNzIsIDB4MDA3MiwKKyAgICAweDAwNzIsIDB4MDA3MiwgMHgwMDUyLCAweDAwNTIsIDB4MDA3MywgMHgwMDZBLCAweDAyODMsIDB4MDI4MywgMHgwMDc0LAorICAgIDB4MDA3NCwgMHgwMDU1LCAweDAwNzYsIDB4MDA3NiwgMHgwMDc3LCAweDAwNzksIDB4MDA1OSwgMHgwMDdBLCAweDAwN0EsCisgICAgMHgwMjkyLCAweDAwNDMsIDB4MDA0MiwgMHgwMDY1LCAweDAwNDcsIDB4MDA0OCwgMHgwMDZBLCAweDAwNkIsIDB4MDA0QywKKyAgICAweDAwNzEsIDB4MDA2OCwgMHgwMDY4LCAweDAwNjgsIDB4MDA2OCwgMHgwMDZBLCAweDAwNzIsIDB4MDI3OSwgMHgwMjdCLAorICAgIDB4MDI4MSwgMHgwMDc3LCAweDAwNzksIDB4MDI2MywgMHgwMDZDLCAweDAwNzMsIDB4MDA3OCwgMHgwMjk1LCAweDAzMDAsCisgICAgMHgwMzAxLCAweDAzMTMsIDB4MDMwOCwgMHgwMDYxLCAweDAwNjUsIDB4MDA2OSwgMHgwMDZGLCAweDAwNzUsIDB4MDA2MywKKyAgICAweDAwNjQsIDB4MDA2OCwgMHgwMDZELCAweDAwNzIsIDB4MDA3NCwgMHgwMDc2LCAweDAwNzgsIDB4MDJCOSwgMHgwMDNCLAorICAgIDB4MDAyMCwgMHgwMEE4LCAweDAzOTEsIDB4MDBCNywgMHgwMzk1LCAweDAzOTcsIDB4MDM5OSwgMHgwMzlGLCAweDAzQTUsCisgICAgMHgwM0E5LCAweDAzQ0EsIDB4MDM5OSwgMHgwM0E1LCAweDAzQjEsIDB4MDNCNSwgMHgwM0I3LCAweDAzQjksIDB4MDNDQiwKKyAgICAweDAzQjksIDB4MDNDNSwgMHgwM0JGLCAweDAzQzUsIDB4MDNDOSwgMHgwM0IyLCAweDAzQjgsIDB4MDNBNSwgMHgwM0QyLAorICAgIDB4MDNEMiwgMHgwM0M2LCAweDAzQzAsIDB4MDNCQSwgMHgwM0MxLCAweDAzQzIsIDB4MDM5OCwgMHgwM0I1LCAweDAzQTMsCisgICAgMHgwNDE1LCAweDA0MTUsIDB4MDQxMywgMHgwNDA2LCAweDA0MUEsIDB4MDQxOCwgMHgwNDIzLCAweDA0MTgsIDB4MDQzOCwKKyAgICAweDA0MzUsIDB4MDQzNSwgMHgwNDMzLCAweDA0NTYsIDB4MDQzQSwgMHgwNDM4LCAweDA0NDMsIDB4MDQ2NiwgMHgwNDY3LAorICAgIDB4MDQ2QSwgMHgwNDZCLCAweDA0NzQsIDB4MDQ3NSwgMHgwNDYwLCAweDA0NjEsIDB4MDQxOSwgMHgwNDM5LCAweDA0MjAsCisgICAgMHgwNDQwLCAweDA0MTMsIDB4MDQzMywgMHgwNDEzLCAweDA0MzMsIDB4MDQxMywgMHgwNDMzLCAweDA0MTYsIDB4MDQzNiwKKyAgICAweDA0MTcsIDB4MDQzNywgMHgwNDFBLCAweDA0M0EsIDB4MDQxQSwgMHgwNDNBLCAweDA0MUEsIDB4MDQzQSwgMHgwNDFBLAorICAgIDB4MDQzQSwgMHgwNDFELCAweDA0M0QsIDB4MDQxRiwgMHgwNDNGLCAweDA0MjEsIDB4MDQ0MSwgMHgwNDIyLCAweDA0NDIsCisgICAgMHgwNEFFLCAweDA0QUYsIDB4MDQyNSwgMHgwNDQ1LCAweDA0MjcsIDB4MDQ0NywgMHgwNDI3LCAweDA0NDcsIDB4MDQxNiwKKyAgICAweDA0MzYsIDB4MDRCQywgMHgwNEJELCAweDA0MTYsIDB4MDQzNiwgMHgwNDFBLCAweDA0M0EsIDB4MDQxQiwgMHgwNDNCLAorICAgIDB4MDQxRCwgMHgwNDNELCAweDA0MUQsIDB4MDQzRCwgMHgwNDFDLCAweDA0M0MsIDB4MDQxMCwgMHgwNDMwLCAweDA0MTAsCisgICAgMHgwNDMwLCAweDA0MTUsIDB4MDQzNSwgMHgwNEQ4LCAweDA0RDksIDB4MDQxNiwgMHgwNDM2LCAweDA0MTcsIDB4MDQzNywKKyAgICAweDA0MTgsIDB4MDQzOCwgMHgwNDE4LCAweDA0MzgsIDB4MDQxRSwgMHgwNDNFLCAweDA0RTgsIDB4MDRFOSwgMHgwNDJELAorICAgIDB4MDQ0RCwgMHgwNDIzLCAweDA0NDMsIDB4MDQyMywgMHgwNDQzLCAweDA0MjMsIDB4MDQ0MywgMHgwNDI3LCAweDA0NDcsCisgICAgMHgwNDEzLCAweDA0MzMsIDB4MDQyQiwgMHgwNDRCLCAweDA0MTMsIDB4MDQzMywgMHgwNDI1LCAweDA0NDUsIDB4MDQyNSwKKyAgICAweDA0NDUsIDB4MDQxNywgMHgwNDM3LCAweDA0MUIsIDB4MDQzQiwgMHgwRjBCLCAweDEwREMsIDB4MDA0MSwgMHgwMEM2LAorICAgIDB4MDA0MiwgMHgwMDQyLCAweDAwNDQsIDB4MDA0NSwgMHgwMThFLCAweDAwNDcsIDB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsCisgICAgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDIyMiwgMHgwMDUwLCAweDAwNTIsIDB4MDA1NCwKKyAgICAweDAwNTUsIDB4MDA1NywgMHgwMDYxLCAweDAyNTAsIDB4MDI1MSwgMHgxRDAyLCAweDAwNjIsIDB4MDA2NCwgMHgwMDY1LAorICAgIDB4MDI1OSwgMHgwMjVCLCAweDAyNUMsIDB4MDA2NywgMHgwMDZCLCAweDAwNkQsIDB4MDE0QiwgMHgwMDZGLCAweDAyNTQsCisgICAgMHgxRDE2LCAweDFEMTcsIDB4MDA3MCwgMHgwMDc0LCAweDAwNzUsIDB4MUQxRCwgMHgwMjZGLCAweDAwNzYsIDB4MUQyNSwKKyAgICAweDAzQjIsIDB4MDNCMywgMHgwM0I0LCAweDAzQzYsIDB4MDNDNywgMHgwMDY5LCAweDAwNzIsIDB4MDA3NSwgMHgwMDc2LAorICAgIDB4MDNCMiwgMHgwM0IzLCAweDAzQzEsIDB4MDNDNiwgMHgwM0M3LCAweDAwNjIsIDB4MDA2NCwgMHgwMDY2LCAweDAwNkQsCisgICAgMHgwMDZFLCAweDAwNzAsIDB4MDA3MiwgMHgwMDcyLCAweDAwNzMsIDB4MDA3NCwgMHgwMDdBLCAweDAwNjcsIDB4MDQzRCwKKyAgICAweDAwNEMsIDB4MDA3MCwgMHgwMDU1LCAweDAyOEEsIDB4MDA2MiwgMHgwMDY0LCAweDAwNjYsIDB4MDA2NywgMHgwMDZCLAorICAgIDB4MDA2QywgMHgwMDZELCAweDAwNkUsIDB4MDA3MCwgMHgwMDcyLCAweDAwNzMsIDB4MDI4MywgMHgwMDc2LCAweDAwNzgsCisgICAgMHgwMDdBLCAweDAwNjEsIDB4MDI1MSwgMHgwMDY0LCAweDAwNjUsIDB4MDA2NSwgMHgwMDY1LCAweDAwNjUsIDB4MDA2OSwKKyAgICAweDAyODMsIDB4MDI1MiwgMHgwMDYzLCAweDAyNTUsIDB4MDBGMCwgMHgwMjVDLCAweDAwNjYsIDB4MDI1RiwgMHgwMjYxLAorICAgIDB4MDI2NSwgMHgwMjY4LCAweDAyNjksIDB4MDI2QSwgMHgxRDdCLCAweDAyOUQsIDB4MDI2RCwgMHgxRDg1LCAweDAyOUYsCisgICAgMHgwMjcxLCAweDAyNzAsIDB4MDI3MiwgMHgwMjczLCAweDAyNzQsIDB4MDI3NSwgMHgwMjc4LCAweDAyODIsIDB4MDI4MywKKyAgICAweDAxQUIsIDB4MDI4OSwgMHgwMjhBLCAweDFEMUMsIDB4MDI4QiwgMHgwMjhDLCAweDAwN0EsIDB4MDI5MCwgMHgwMjkxLAorICAgIDB4MDI5MiwgMHgwM0I4LCAweDAwNDEsIDB4MDA2MSwgMHgwMDQyLCAweDAwNjIsIDB4MDA0MiwgMHgwMDYyLCAweDAwNDIsCisgICAgMHgwMDYyLCAweDAwNDMsIDB4MDA2MywgMHgwMDQ0LCAweDAwNjQsIDB4MDA0NCwgMHgwMDY0LCAweDAwNDQsIDB4MDA2NCwKKyAgICAweDAwNDQsIDB4MDA2NCwgMHgwMDQ0LCAweDAwNjQsIDB4MDA0NSwgMHgwMDY1LCAweDAwNDUsIDB4MDA2NSwgMHgwMDQ1LAorICAgIDB4MDA2NSwgMHgwMDQ1LCAweDAwNjUsIDB4MDIyOCwgMHgwMjI5LCAweDAwNDYsIDB4MDA2NiwgMHgwMDQ3LCAweDAwNjcsCisgICAgMHgwMDQ4LCAweDAwNjgsIDB4MDA0OCwgMHgwMDY4LCAweDAwNDgsIDB4MDA2OCwgMHgwMDQ4LCAweDAwNjgsIDB4MDA0OCwKKyAgICAweDAwNjgsIDB4MDA0OSwgMHgwMDY5LCAweDAwQ0YsIDB4MDBFRiwgMHgwMDRCLCAweDAwNkIsIDB4MDA0QiwgMHgwMDZCLAorICAgIDB4MDA0QiwgMHgwMDZCLCAweDAwNEMsIDB4MDA2QywgMHgwMDRDLCAweDAwNkMsIDB4MDA0QywgMHgwMDZDLCAweDAwNEMsCisgICAgMHgwMDZDLCAweDAwNEQsIDB4MDA2RCwgMHgwMDRELCAweDAwNkQsIDB4MDA0RCwgMHgwMDZELCAweDAwNEUsIDB4MDA2RSwKKyAgICAweDAwNEUsIDB4MDA2RSwgMHgwMDRFLCAweDAwNkUsIDB4MDA0RSwgMHgwMDZFLCAweDAwRDUsIDB4MDBGNSwgMHgwMEQ1LAorICAgIDB4MDBGNSwgMHgwMTRDLCAweDAxNEQsIDB4MDE0QywgMHgwMTRELCAweDAwNTAsIDB4MDA3MCwgMHgwMDUwLCAweDAwNzAsCisgICAgMHgwMDUyLCAweDAwNzIsIDB4MDA1MiwgMHgwMDcyLCAweDAwNTIsIDB4MDA3MiwgMHgwMDUyLCAweDAwNzIsIDB4MDA1MywKKyAgICAweDAwNzMsIDB4MDA1MywgMHgwMDczLCAweDAwNTMsIDB4MDA3MywgMHgwMDUzLCAweDAwNzMsIDB4MDA1MywgMHgwMDczLAorICAgIDB4MDA1NCwgMHgwMDc0LCAweDAwNTQsIDB4MDA3NCwgMHgwMDU0LCAweDAwNzQsIDB4MDA1NCwgMHgwMDc0LCAweDAwNTUsCisgICAgMHgwMDc1LCAweDAwNTUsIDB4MDA3NSwgMHgwMDU1LCAweDAwNzUsIDB4MDE2OCwgMHgwMTY5LCAweDAxNkEsIDB4MDE2QiwKKyAgICAweDAwNTYsIDB4MDA3NiwgMHgwMDU2LCAweDAwNzYsIDB4MDA1NywgMHgwMDc3LCAweDAwNTcsIDB4MDA3NywgMHgwMDU3LAorICAgIDB4MDA3NywgMHgwMDU3LCAweDAwNzcsIDB4MDA1NywgMHgwMDc3LCAweDAwNTgsIDB4MDA3OCwgMHgwMDU4LCAweDAwNzgsCisgICAgMHgwMDU5LCAweDAwNzksIDB4MDA1QSwgMHgwMDdBLCAweDAwNUEsIDB4MDA3QSwgMHgwMDVBLCAweDAwN0EsIDB4MDA2OCwKKyAgICAweDAwNzQsIDB4MDA3NywgMHgwMDc5LCAweDAwNjEsIDB4MDE3RiwgMHgwMDQxLCAweDAwNjEsIDB4MDA0MSwgMHgwMDYxLAorICAgIDB4MDA0MSwgMHgwMDYxLCAweDAwNDEsIDB4MDA2MSwgMHgwMDQxLCAweDAwNjEsIDB4MDA0MSwgMHgwMDYxLCAweDAwNDEsCisgICAgMHgwMDYxLCAweDAwNDEsIDB4MDA2MSwgMHgwMDQxLCAweDAwNjEsIDB4MDA0MSwgMHgwMDYxLCAweDAwNDEsIDB4MDA2MSwKKyAgICAweDAwNDEsIDB4MDA2MSwgMHgwMDQ1LCAweDAwNjUsIDB4MDA0NSwgMHgwMDY1LCAweDAwNDUsIDB4MDA2NSwgMHgwMDQ1LAorICAgIDB4MDA2NSwgMHgwMDQ1LCAweDAwNjUsIDB4MDA0NSwgMHgwMDY1LCAweDAwNDUsIDB4MDA2NSwgMHgwMDQ1LCAweDAwNjUsCisgICAgMHgwMDQ5LCAweDAwNjksIDB4MDA0OSwgMHgwMDY5LCAweDAwNEYsIDB4MDA2RiwgMHgwMDRGLCAweDAwNkYsIDB4MDA0RiwKKyAgICAweDAwNkYsIDB4MDA0RiwgMHgwMDZGLCAweDAwNEYsIDB4MDA2RiwgMHgwMDRGLCAweDAwNkYsIDB4MDA0RiwgMHgwMDZGLAorICAgIDB4MDA0RiwgMHgwMDZGLCAweDAwNEYsIDB4MDA2RiwgMHgwMDRGLCAweDAwNkYsIDB4MDA0RiwgMHgwMDZGLCAweDAwNEYsCisgICAgMHgwMDZGLCAweDAwNTUsIDB4MDA3NSwgMHgwMDU1LCAweDAwNzUsIDB4MDA1NSwgMHgwMDc1LCAweDAwNTUsIDB4MDA3NSwKKyAgICAweDAwNTUsIDB4MDA3NSwgMHgwMDU1LCAweDAwNzUsIDB4MDA1NSwgMHgwMDc1LCAweDAwNTksIDB4MDA3OSwgMHgwMDU5LAorICAgIDB4MDA3OSwgMHgwMDU5LCAweDAwNzksIDB4MDA1OSwgMHgwMDc5LCAweDAzQjEsIDB4MDNCMSwgMHgwM0IxLCAweDAzQjEsCisgICAgMHgwM0IxLCAweDAzQjEsIDB4MDNCMSwgMHgwM0IxLCAweDAzOTEsIDB4MDM5MSwgMHgwMzkxLCAweDAzOTEsIDB4MDM5MSwKKyAgICAweDAzOTEsIDB4MDM5MSwgMHgwMzkxLCAweDAzQjUsIDB4MDNCNSwgMHgwM0I1LCAweDAzQjUsIDB4MDNCNSwgMHgwM0I1LAorICAgIDB4MDM5NSwgMHgwMzk1LCAweDAzOTUsIDB4MDM5NSwgMHgwMzk1LCAweDAzOTUsIDB4MDNCNywgMHgwM0I3LCAweDAzQjcsCisgICAgMHgwM0I3LCAweDAzQjcsIDB4MDNCNywgMHgwM0I3LCAweDAzQjcsIDB4MDM5NywgMHgwMzk3LCAweDAzOTcsIDB4MDM5NywKKyAgICAweDAzOTcsIDB4MDM5NywgMHgwMzk3LCAweDAzOTcsIDB4MDNCOSwgMHgwM0I5LCAweDAzQjksIDB4MDNCOSwgMHgwM0I5LAorICAgIDB4MDNCOSwgMHgwM0I5LCAweDAzQjksIDB4MDM5OSwgMHgwMzk5LCAweDAzOTksIDB4MDM5OSwgMHgwMzk5LCAweDAzOTksCisgICAgMHgwMzk5LCAweDAzOTksIDB4MDNCRiwgMHgwM0JGLCAweDAzQkYsIDB4MDNCRiwgMHgwM0JGLCAweDAzQkYsIDB4MDM5RiwKKyAgICAweDAzOUYsIDB4MDM5RiwgMHgwMzlGLCAweDAzOUYsIDB4MDM5RiwgMHgwM0M1LCAweDAzQzUsIDB4MDNDNSwgMHgwM0M1LAorICAgIDB4MDNDNSwgMHgwM0M1LCAweDAzQzUsIDB4MDNDNSwgMHgwM0E1LCAweDAzQTUsIDB4MDNBNSwgMHgwM0E1LCAweDAzQzksCisgICAgMHgwM0M5LCAweDAzQzksIDB4MDNDOSwgMHgwM0M5LCAweDAzQzksIDB4MDNDOSwgMHgwM0M5LCAweDAzQTksIDB4MDNBOSwKKyAgICAweDAzQTksIDB4MDNBOSwgMHgwM0E5LCAweDAzQTksIDB4MDNBOSwgMHgwM0E5LCAweDAzQjEsIDB4MDNCMSwgMHgwM0I1LAorICAgIDB4MDNCNSwgMHgwM0I3LCAweDAzQjcsIDB4MDNCOSwgMHgwM0I5LCAweDAzQkYsIDB4MDNCRiwgMHgwM0M1LCAweDAzQzUsCisgICAgMHgwM0M5LCAweDAzQzksIDB4MDNCMSwgMHgwM0IxLCAweDAzQjEsIDB4MDNCMSwgMHgwM0IxLCAweDAzQjEsIDB4MDNCMSwKKyAgICAweDAzQjEsIDB4MDM5MSwgMHgwMzkxLCAweDAzOTEsIDB4MDM5MSwgMHgwMzkxLCAweDAzOTEsIDB4MDM5MSwgMHgwMzkxLAorICAgIDB4MDNCNywgMHgwM0I3LCAweDAzQjcsIDB4MDNCNywgMHgwM0I3LCAweDAzQjcsIDB4MDNCNywgMHgwM0I3LCAweDAzOTcsCisgICAgMHgwMzk3LCAweDAzOTcsIDB4MDM5NywgMHgwMzk3LCAweDAzOTcsIDB4MDM5NywgMHgwMzk3LCAweDAzQzksIDB4MDNDOSwKKyAgICAweDAzQzksIDB4MDNDOSwgMHgwM0M5LCAweDAzQzksIDB4MDNDOSwgMHgwM0M5LCAweDAzQTksIDB4MDNBOSwgMHgwM0E5LAorICAgIDB4MDNBOSwgMHgwM0E5LCAweDAzQTksIDB4MDNBOSwgMHgwM0E5LCAweDAzQjEsIDB4MDNCMSwgMHgwM0IxLCAweDAzQjEsCisgICAgMHgwM0IxLCAweDAzQjEsIDB4MDNCMSwgMHgwMzkxLCAweDAzOTEsIDB4MDM5MSwgMHgwMzkxLCAweDAzOTEsIDB4MDNCNywKKyAgICAweDAzQjcsIDB4MDNCNywgMHgwM0I3LCAweDAzQjcsIDB4MDM5NSwgMHgwMzk1LCAweDAzOTcsIDB4MDM5NywgMHgwMzk3LAorICAgIDB4MDNCOSwgMHgwM0I5LCAweDAzQjksIDB4MDNCOSwgMHgwM0I5LCAweDAzQjksIDB4MDM5OSwgMHgwMzk5LCAweDAzOTksCisgICAgMHgwMzk5LCAweDAzQzUsIDB4MDNDNSwgMHgwM0M1LCAweDAzQzUsIDB4MDNDMSwgMHgwM0MxLCAweDAzQzUsIDB4MDNDNSwKKyAgICAweDAzQTUsIDB4MDNBNSwgMHgwM0E1LCAweDAzQTUsIDB4MDNBMSwgMHgwM0M5LCAweDAzQzksIDB4MDNDOSwgMHgwM0M5LAorICAgIDB4MDNDOSwgMHgwMzlGLCAweDAzOUYsIDB4MDNBOSwgMHgwM0E5LCAweDAzQTksIDB4MDBCNCwgMHgwMzE0LCAweDAwMjAsCisgICAgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwgMHgwMDIwLCAweDAwMjAsIDB4MDAyMCwKKyAgICAweDAwMjAsIDB4MjAxMCwgMHgwMzMzLCAweDAwMkUsIDB4MDAyMCwgMHgwMDIwLCAweDAwMzAsIDB4MDA2OSwgMHgwMDM0LAorICAgIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwMkIsIDB4MjIxMiwgMHgwMDNELCAweDAwMjgsCisgICAgMHgwMDI5LCAweDAwNkUsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwKKyAgICAweDAwMzcsIDB4MDAzOCwgMHgwMDM5LCAweDAwMkIsIDB4MjIxMiwgMHgwMDNELCAweDAwMjgsIDB4MDAyOSwgMHgwMDYxLAorICAgIDB4MDA2NSwgMHgwMDZGLCAweDAwNzgsIDB4MDI1OSwgMHgwMDQzLCAweDAxOTAsIDB4MDA2NywgMHgwMDQ4LCAweDAwNDgsCisgICAgMHgwMDQ4LCAweDAwNjgsIDB4MDA2OCwgMHgwMDQ5LCAweDAwNDksIDB4MDA0QywgMHgwMDZDLCAweDAwNEUsIDB4MDA1MCwKKyAgICAweDAwNTEsIDB4MDA1MiwgMHgwMDUyLCAweDAwNTIsIDB4MDA1MiwgMHgwMDUyLCAweDAwNTYsIDB4MDA1QSwgMHgwM0E5LAorICAgIDB4MDFCMSwgMHgwMDVBLCAweDAwNEIsIDB4MDBDNSwgMHgwMDQyLCAweDAwNDMsIDB4MDA2NSwgMHgwMDY1LCAweDAwNDUsCisgICAgMHgwMDQ2LCAweDAwNEQsIDB4MDA2RiwgMHgwNUQwLCAweDA1RDEsIDB4MDVEMiwgMHgwNUQzLCAweDAwNjksIDB4MDNDMCwKKyAgICAweDAzQjMsIDB4MDM5MywgMHgwM0EwLCAweDIyMTEsIDB4MDA0NCwgMHgwMDY0LCAweDAwNjUsIDB4MDA2OSwgMHgwMDZBLAorICAgIDB4MDA0OSwgMHgwMDU2LCAweDAwNTgsIDB4MDA0QywgMHgwMDQzLCAweDAwNDQsIDB4MDA0RCwgMHgwMDY5LCAweDAwNzYsCisgICAgMHgwMDc4LCAweDAwNkMsIDB4MDA2MywgMHgwMDY0LCAweDAwNkQsIDB4MjIwMywgMHgyMjA4LCAweDIyMEIsIDB4MzAwOCwKKyAgICAweDMwMDksIDB4MDA2MiwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorICAgIDB4MDAzOCwgMHgwMDM5LCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisgICAgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwgMHgwMDRCLCAweDAwNEMsIDB4MDA0RCwgMHgwMDRFLCAweDAwNEYsIDB4MDA1MCwKKyAgICAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIDB4MDA1OCwgMHgwMDU5LAorICAgIDB4MDA1QSwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LCAweDAwNjgsCisgICAgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsIDB4MDA2RSwgMHgwMDZGLCAweDAwNzAsIDB4MDA3MSwKKyAgICAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LCAweDAwNzgsIDB4MDA3OSwgMHgwMDdBLAorICAgIDB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwMzgsCisgICAgMHgwMDM5LCAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKyAgICAweDAwMzgsIDB4MDAzOSwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorICAgIDB4MDAzOCwgMHgwMDM5LCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisgICAgMHgwMDM4LCAweDAwMzksIDB4MDA0QywgMHgwMDZDLCAweDAwNEMsIDB4MDA1MCwgMHgwMDUyLCAweDAwNjEsIDB4MDA3NCwKKyAgICAweDAwNDgsIDB4MDA2OCwgMHgwMDRCLCAweDAwNkIsIDB4MDA1QSwgMHgwMDdBLCAweDAwNzYsIDB4MDA1NywgMHgwMDU4LAorICAgIDB4MDA3NiwgMHgwMDZBLCAweDAwNTYsIDB4MkQ2MSwgMHg2QkNELCAweDZDMTEsIDB4ODY0RSwgMHg4OTdGLCAweDg5RDIsCisgICAgMHg5NTdGLCAweDk3NTIsIDB4OThERiwgMHg5QUE4LCAweDlCM0MsIDB4OUVBNiwgMHg5RUM0LCAweDlGOUYsIDB4NEUwMCwKKyAgICAweDRFMjgsIDB4NEUzNiwgMHg0RTNGLCAweDRFNTksIDB4NEU4NSwgMHg0RThDLCAweDRFQTAsIDB4NEVCQSwgMHg1MTNGLAorICAgIDB4NTE2NSwgMHg1MTZCLCAweDUxODIsIDB4NTE5NiwgMHg1MUFCLCAweDUxRTAsIDB4NTFGNSwgMHg1MjAwLCAweDUyOUIsCisgICAgMHg1MkY5LCAweDUzMTUsIDB4NTMxQSwgMHg1MzM4LCAweDUzNDEsIDB4NTM1QywgMHg1MzY5LCAweDUzODIsIDB4NTNCNiwKKyAgICAweDUzQzgsIDB4NTNFMywgMHg1NkQ3LCAweDU3MUYsIDB4NThFQiwgMHg1OTAyLCAweDU5MEEsIDB4NTkxNSwgMHg1OTI3LAorICAgIDB4NTk3MywgMHg1QjUwLCAweDVCODAsIDB4NUJGOCwgMHg1QzBGLCAweDVDMjIsIDB4NUMzOCwgMHg1QzZFLCAweDVDNzEsCisgICAgMHg1RERCLCAweDVERTUsIDB4NURGMSwgMHg1REZFLCAweDVFNzIsIDB4NUU3QSwgMHg1RTdGLCAweDVFRjQsIDB4NUVGRSwKKyAgICAweDVGMEIsIDB4NUYxMywgMHg1RjUwLCAweDVGNjEsIDB4NUY3MywgMHg1RkMzLCAweDYyMDgsIDB4NjIzNiwgMHg2MjRCLAorICAgIDB4NjUyRiwgMHg2NTM0LCAweDY1ODcsIDB4NjU5NywgMHg2NUE0LCAweDY1QjksIDB4NjVFMCwgMHg2NUU1LCAweDY2RjAsCisgICAgMHg2NzA4LCAweDY3MjgsIDB4NkIyMCwgMHg2QjYyLCAweDZCNzksIDB4NkJCMywgMHg2QkNCLCAweDZCRDQsIDB4NkJEQiwKKyAgICAweDZDMEYsIDB4NkMxNCwgMHg2QzM0LCAweDcwNkIsIDB4NzIyQSwgMHg3MjM2LCAweDcyM0IsIDB4NzIzRiwgMHg3MjQ3LAorICAgIDB4NzI1OSwgMHg3MjVCLCAweDcyQUMsIDB4NzM4NCwgMHg3Mzg5LCAweDc0REMsIDB4NzRFNiwgMHg3NTE4LCAweDc1MUYsCisgICAgMHg3NTI4LCAweDc1MzAsIDB4NzU4QiwgMHg3NTkyLCAweDc2NzYsIDB4NzY3RCwgMHg3NkFFLCAweDc2QkYsIDB4NzZFRSwKKyAgICAweDc3REIsIDB4NzdFMiwgMHg3N0YzLCAweDc5M0EsIDB4NzlCOCwgMHg3OUJFLCAweDdBNzQsIDB4N0FDQiwgMHg3QUY5LAorICAgIDB4N0M3MywgMHg3Q0Y4LCAweDdGMzYsIDB4N0Y1MSwgMHg3RjhBLCAweDdGQkQsIDB4ODAwMSwgMHg4MDBDLCAweDgwMTIsCisgICAgMHg4MDMzLCAweDgwN0YsIDB4ODA4OSwgMHg4MUUzLCAweDgxRUEsIDB4ODFGMywgMHg4MUZDLCAweDgyMEMsIDB4ODIxQiwKKyAgICAweDgyMUYsIDB4ODI2RSwgMHg4MjcyLCAweDgyNzgsIDB4ODY0RCwgMHg4NjZCLCAweDg4NDAsIDB4ODg0QywgMHg4ODYzLAorICAgIDB4ODk3RSwgMHg4OThCLCAweDg5RDIsIDB4OEEwMCwgMHg4QzM3LCAweDhDNDYsIDB4OEM1NSwgMHg4Qzc4LCAweDhDOUQsCisgICAgMHg4RDY0LCAweDhENzAsIDB4OERCMywgMHg4RUFCLCAweDhFQ0EsIDB4OEY5QiwgMHg4RkIwLCAweDhGQjUsIDB4OTA5MSwKKyAgICAweDkxNDksIDB4OTFDNiwgMHg5MUNDLCAweDkxRDEsIDB4OTU3NywgMHg5NTgwLCAweDk2MUMsIDB4OTZCNiwgMHg5NkI5LAorICAgIDB4OTZFOCwgMHg5NzUxLCAweDk3NUUsIDB4OTc2MiwgMHg5NzY5LCAweDk3Q0IsIDB4OTdFRCwgMHg5N0YzLCAweDk4MDEsCisgICAgMHg5OEE4LCAweDk4REIsIDB4OThERiwgMHg5OTk2LCAweDk5OTksIDB4OTlBQywgMHg5QUE4LCAweDlBRDgsIDB4OUFERiwKKyAgICAweDlCMjUsIDB4OUIyRiwgMHg5QjMyLCAweDlCM0MsIDB4OUI1QSwgMHg5Q0U1LCAweDlFNzUsIDB4OUU3RiwgMHg5RUE1LAorICAgIDB4OUVCQiwgMHg5RUMzLCAweDlFQ0QsIDB4OUVEMSwgMHg5RUY5LCAweDlFRkQsIDB4OUYwRSwgMHg5RjEzLCAweDlGMjAsCisgICAgMHg5RjNCLCAweDlGNEEsIDB4OUY1MiwgMHg5RjhELCAweDlGOUMsIDB4OUZBMCwgMHgwMDIwLCAweDMwMTIsIDB4NTM0MSwKKyAgICAweDUzNDQsIDB4NTM0NSwgMHgxMTAwLCAweDExMDEsIDB4MTFBQSwgMHgxMTAyLCAweDExQUMsIDB4MTFBRCwgMHgxMTAzLAorICAgIDB4MTEwNCwgMHgxMTA1LCAweDExQjAsIDB4MTFCMSwgMHgxMUIyLCAweDExQjMsIDB4MTFCNCwgMHgxMUI1LCAweDExMUEsCisgICAgMHgxMTA2LCAweDExMDcsIDB4MTEwOCwgMHgxMTIxLCAweDExMDksIDB4MTEwQSwgMHgxMTBCLCAweDExMEMsIDB4MTEwRCwKKyAgICAweDExMEUsIDB4MTEwRiwgMHgxMTEwLCAweDExMTEsIDB4MTExMiwgMHgxMTYxLCAweDExNjIsIDB4MTE2MywgMHgxMTY0LAorICAgIDB4MTE2NSwgMHgxMTY2LCAweDExNjcsIDB4MTE2OCwgMHgxMTY5LCAweDExNkEsIDB4MTE2QiwgMHgxMTZDLCAweDExNkQsCisgICAgMHgxMTZFLCAweDExNkYsIDB4MTE3MCwgMHgxMTcxLCAweDExNzIsIDB4MTE3MywgMHgxMTc0LCAweDExNzUsIDB4MTE2MCwKKyAgICAweDExMTQsIDB4MTExNSwgMHgxMUM3LCAweDExQzgsIDB4MTFDQywgMHgxMUNFLCAweDExRDMsIDB4MTFENywgMHgxMUQ5LAorICAgIDB4MTExQywgMHgxMURELCAweDExREYsIDB4MTExRCwgMHgxMTFFLCAweDExMjAsIDB4MTEyMiwgMHgxMTIzLCAweDExMjcsCisgICAgMHgxMTI5LCAweDExMkIsIDB4MTEyQywgMHgxMTJELCAweDExMkUsIDB4MTEyRiwgMHgxMTMyLCAweDExMzYsIDB4MTE0MCwKKyAgICAweDExNDcsIDB4MTE0QywgMHgxMUYxLCAweDExRjIsIDB4MTE1NywgMHgxMTU4LCAweDExNTksIDB4MTE4NCwgMHgxMTg1LAorICAgIDB4MTE4OCwgMHgxMTkxLCAweDExOTIsIDB4MTE5NCwgMHgxMTlFLCAweDExQTEsIDB4NEUwMCwgMHg0RThDLCAweDRFMDksCisgICAgMHg1NkRCLCAweDRFMEEsIDB4NEUyRCwgMHg0RTBCLCAweDc1MzIsIDB4NEU1OSwgMHg0RTE5LCAweDRFMDEsIDB4NTkyOSwKKyAgICAweDU3MzAsIDB4NEVCQSwgMHg1NTRGLCAweDVFN0MsIDB4NjU4NywgMHg3QjhGLCAweDExMDAsIDB4MTEwMiwgMHgxMTAzLAorICAgIDB4MTEwNSwgMHgxMTA2LCAweDExMDcsIDB4MTEwOSwgMHgxMTBCLCAweDExMEMsIDB4MTEwRSwgMHgxMTBGLCAweDExMTAsCisgICAgMHgxMTExLCAweDExMTIsIDB4NEUwMCwgMHg0RThDLCAweDRFMDksIDB4NTZEQiwgMHg0RTk0LCAweDUxNkQsIDB4NEUwMywKKyAgICAweDUxNkIsIDB4NEU1RCwgMHg1MzQxLCAweDY3MDgsIDB4NzA2QiwgMHg2QzM0LCAweDY3MjgsIDB4OTFEMSwgMHg1NzFGLAorICAgIDB4NjVFNSwgMHg2ODJBLCAweDY3MDksIDB4NzkzRSwgMHg1NDBELCAweDcyNzksIDB4OENBMSwgMHg3OTVELCAweDUyQjQsCisgICAgMHg3OUQ4LCAweDc1MzcsIDB4NTk3MywgMHg5MDY5LCAweDUxMkEsIDB4NTM3MCwgMHg2Q0U4LCAweDk4MDUsIDB4NEYxMSwKKyAgICAweDUxOTksIDB4NkI2MywgMHg0RTBBLCAweDRFMkQsIDB4NEUwQiwgMHg1REU2LCAweDUzRjMsIDB4NTMzQiwgMHg1Qjk3LAorICAgIDB4NUI2NiwgMHg3NkUzLCAweDRGMDEsIDB4OENDNywgMHg1MzU0LCAweDU5MUMsIDB4MzBBMiwgMHgzMEE0LCAweDMwQTYsCisgICAgMHgzMEE4LCAweDMwQUEsIDB4MzBBQiwgMHgzMEFELCAweDMwQUYsIDB4MzBCMSwgMHgzMEIzLCAweDMwQjUsIDB4MzBCNywKKyAgICAweDMwQjksIDB4MzBCQiwgMHgzMEJELCAweDMwQkYsIDB4MzBDMSwgMHgzMEM0LCAweDMwQzYsIDB4MzBDOCwgMHgzMENBLAorICAgIDB4MzBDQiwgMHgzMENDLCAweDMwQ0QsIDB4MzBDRSwgMHgzMENGLCAweDMwRDIsIDB4MzBENSwgMHgzMEQ4LCAweDMwREIsCisgICAgMHgzMERFLCAweDMwREYsIDB4MzBFMCwgMHgzMEUxLCAweDMwRTIsIDB4MzBFNCwgMHgzMEU2LCAweDMwRTgsIDB4MzBFOSwKKyAgICAweDMwRUEsIDB4MzBFQiwgMHgzMEVDLCAweDMwRUQsIDB4MzBFRiwgMHgzMEYwLCAweDMwRjEsIDB4MzBGMiwgMHg0RTIyLAorICAgIDB4NUU3NiwgMHg1RTdBLCAweDVFNzIsIDB4NEU3MSwgMHg0RTk4LCAweDRFOUEsIDB4NEYyQiwgMHg1RTAzLCAweDUzNjAsCisgICAgMHg2NzY1LCAweDRGQTMsIDB4NEZFMywgMHg3Q0ZCLCAweDRGQTAsIDB4NEYyNSwgMHg0RkU5LCAweDRFRDMsIDB4NEUyQSwKKyAgICAweDRFRUMsIDB4NEYyNiwgMHg0RjFGLCAweDRGQTcsIDB4NEZBNiwgMHg0RjJBLCAweDY3NzAsIDB4NEYyNywgMHg0RjFFLAorICAgIDB4NTkwNywgMHg1QkI2LCAweDRGNjMsIDB4NTA2QywgMHg0RjIwLCAweDRGMUIsIDB4NTAzQSwgMHg0RjI0LCAweDUwM0UsCisgICAgMHg1MDdCLCAweDRFQzUsIDB4NEY2NSwgMHg0RkE4LCAweDRFQzYsIDB4NEZBNSwgMHg1MDdFLCAweDk2QzcsIDB4NEVGNywKKyAgICAweDRFRUEsIDB4NEZBQywgMHg0RUJGLCAweDRGRUQsIDB4NTBBNywgMHg0RkU2LCAweDRGQUEsIDB4NUMzRCwgMHg1MDdGLAorICAgIDB4NEYxOCwgMHg1MEE4LCAweDRGRUEsIDB4NTBBOSwgMHg1MEE1LCAweDRGRTgsIDB4NTFGNiwgMHg1MTUxLCAweDUxM0YsCisgICAgMHg1MTU2LCAweDUxODUsIDB4NEUyNCwgMHg1MThDLCAweDgwQzQsIDB4NTE5OSwgMHg1RTQyLCAweDUxQkIsIDB4NTFEQiwKKyAgICAweDUxRUYsIDB4NTIyQiwgMHg1MjIwLCAweDUyMkQsIDB4NTIxOSwgMHg1MjM5LCAweDUyMUEsIDB4NTI2NSwgMHg1MjUwLAorICAgIDB4NTI0MCwgMHg1MjFCLCAweDUyMkMsIDB4NTIxMiwgMHg1MjY3LCAweDUyMTgsIDB4NTIzRCwgMHg1MjNGLCAweDUyNTEsCisgICAgMHg1MjQyLCAweDUyQjIsIDB4NTJBOCwgMHg1MkQ2LCAweDUyQTEsIDB4ODBEQywgMHg1MkIzLCAweDUyQkYsIDB4NTJBMiwKKyAgICAweDUyQ0IsIDB4NTJCMSwgMHg1MjlELCAweDUzMDAsIDB4NTMyNiwgMHg2QzQ3LCAweDUzMkUsIDB4NTMzQSwgMHg1MzRGLAorICAgIDB4NjA2NCwgMHg1Mzc0LCAweDUzOEQsIDB4NTM4QywgMHg1Mzg5LCAweDUzQTMsIDB4NTNDMiwgMHg0RTFCLCAweDU0QTQsCisgICAgMHg1NDM0LCAweDU0NTAsIDB4NTQxNSwgMHg1NDU4LCAweDU1QjEsIDB4NTQ1NywgMHg1RkY1LCAweDk1RUUsIDB4NTREMSwKKyAgICAweDU0MkYsIDB4NTUyNCwgMHg0RTI3LCAweDRFNTQsIDB4NTM1NSwgMHg1NERGLCAweDU0NUIsIDB4NTU2QywgMHg1NTFELAorICAgIDB4NTQxNywgMHg1NDVDLCAweDU1MjIsIDB4NTRENCwgMHg1M0Y5LCAweDU1QkQsIDB4NTQ1NSwgMHg1NTY3LCAweDVDMUQsCisgICAgMHg1NTFCLCAweDU0RDcsIDB4NTUyMCwgMHg1NTc4LCAweDUzRkQsIDB4NTREMywgMHg1NDUyLCAweDU1NzQsIDB4NjA3NiwKKyAgICAweDU2MTgsIDB4NTQ5RCwgMHg1NEQyLCAweDU0REQsIDB4NTRENSwgMHg1NUYzLCAweDU0RDksIDB4NTVCNywgMHg1NDI4LAorICAgIDB4NTQ5QiwgMHg1NDEzLCAweDU0REMsIDB4NUMxRCwgMHg1NjVDLCAweDU1NkUsIDB4NTQ1NiwgMHg1NDk5LCAweDRFQjgsCisgICAgMHg1NUJFLCAweDRFMjUsIDB4NTYyNCwgMHg1NTZELCAweDU1RUIsIDB4NTZBMywgMHg1MTgxLCAweDU0NTMsIDB4NTU3MCwKKyAgICAweDU2MzEsIDB4NTZGMSwgMHg1NkY1LCAweDU2RkQsIDB4NTZGNCwgMHg1NkVELCAweDU3MDYsIDB4NTZGRSwgMHg1NkUyLAorICAgIDB4NTdBRCwgMHg2MjY3LCAweDU3NUEsIDB4NTdBOSwgMHg1N0RBLCAweDVDMjcsIDB4NjJBNSwgMHg1NzNBLCAweDU3NTcsCisgICAgMHg4MzE0LCAweDU3QjIsIDB4NTdEOCwgMHg2RDgyLCAweDUxQTIsIDB4NTc1RSwgMHg1N0Q5LCAweDVDMTgsIDB4NTgxMSwKKyAgICAweDU3QUIsIDB4NTc2MCwgMHg1ODE1LCAweDU3NUYsIDB4NTdBNiwgMHg1NzVCLCAweDUzOEIsIDB4NTc5MiwgMHg1NzM5LAorICAgIDB4NTc4NiwgMHg1NzRGLCAweDU3ODUsIDB4NTc1QywgMHg1NzVELCAweDU4RUUsIDB4NThGNiwgMHg1OEY4LCAweDVCRkYsCisgICAgMHg1OTFGLCAweDY4QTYsIDB4NEYxOSwgMHg1OTM5LCAweDU5NDIsIDB4NTk2NSwgMHg1OTQxLCAweDU5M0EsIDB4NTk0QiwKKyAgICAweDU5RjksIDB4NTk4NiwgMHg1OUQ3LCAweDU5NzgsIDB4NUEzMSwgMHg1QTA0LCAweDU5ODcsIDB4NUEwNSwgMHg1QTMyLAorICAgIDB4NTlBQiwgMHg1QUFBLCAweDU5ODgsIDB4NTlBQSwgMHg1OUE5LCAweDVBMzQsIDB4NUE3MywgMHg1QTA2LCAweDVBNzUsCisgICAgMHg1QTA3LCAweDVBRjEsIDB4NUFEMiwgMHg1QjM3LCAweDVBRDQsIDB4NUE3NCwgMHg1QTc2LCAweDVBMDgsIDB4NUI1OSwKKyAgICAweDVCNjYsIDB4NUI2QSwgMHg1QkFCLCAweDVCREQsIDB4NUI5RSwgMHg1QjgxLCAweDVCQTEsIDB4NTE5OSwgMHg1QkJELAorICAgIDB4NUJBMCwgMHg1QjlELCAweDVDMDYsIDB4NEUxMywgMHg1QkZCLCAweDVCRjksIDB4NUJGQywgMHg1QzM0LCAweDVDNEEsCisgICAgMHg1QzM4LCAweDVDNDksIDB4NUM2MSwgMHg1QzQyLCAweDVDNUYsIDB4NUM2NiwgMHg1QzVFLCAweDUxODgsIDB4NUM5OCwKKyAgICAweDVDOUIsIDB4NUNFMSwgMHg1RDAzLCAweDVDOTcsIDB4NEVEMSwgMHg1Q0U1LCAweDVDOUEsIDB4NUQ1RCwgMHg1RDJELAorICAgIDB4NUM5NiwgMHg1RDVBLCAweDVEMDIsIDB4NUNFNCwgMHg1Q0UzLCAweDVDQzQsIDB4NUQwNCwgMHg1Qzk5LCAweDVENTgsCisgICAgMHg1Q0FELCAweDVDN0YsIDB4NUNCMywgMHg1Q0JGLCAweDVDRTYsIDB4NURDNSwgMHg1REVGLCAweDVFMDUsIDB4NUUwOCwKKyAgICAweDVFMTAsIDB4NUUyNiwgMHg1RTI3LCAweDVFMEYsIDB4NUUzQywgMHg1RTNCLCAweDVFMUMsIDB4NUUwMSwgMHg1RTJFLAorICAgIDB4NUUzMSwgMHg1RTcyLCAweDUxRTAsIDB4NUU5MywgMHg1Mzk1LCAweDUzQTIsIDB4NTNBNiwgMHg1M0E4LCAweDUzQUUsCisgICAgMHg1RTk5LCAweDUzODIsIDB4NUU5MSwgMHg1RTlGLCAweDVFN0YsIDB4NUVFQSwgMHg1RTkwLCAweDUzODUsIDB4NUYxMSwKKyAgICAweDVGMkEsIDB4NUYyMCwgMHg1RjNBLCAweDVGMzksIDB4NUYyNSwgMHg1RjJGLCAweDVGNjYsIDB4NTQwRSwgMHg1Rjg0LAorICAgIDB4NEVDRSwgMHg1Rjk1LCAweDU5MEQsIDB4NUY4MSwgMHg1RjdCLCAweDYwNTIsIDB4ODAzQiwgMHg2MEE2LCAweDYwMDUsCisgICAgMHg5NUY3LCAweDYwNzYsIDB4NjA3QywgMHg2MDdELCAweDYwN0IsIDB4NzIzMSwgMHg2MEVDLCAweDYwQUIsIDB4NjAwNiwKKyAgICAweDYwN0EsIDB4NUZGRSwgMHg2MDAxLCAweDYxMjAsIDB4NjBFOCwgMHg2MEVELCAweDYwNzgsIDB4NjBFRiwgMHg2MDA0LAorICAgIDB4NjAwMiwgMHg4NjUxLCAweDYwQUQsIDB4NUU4NiwgMHg1RkU3LCAweDYwRUIsIDB4NjAxQywgMHg1MUVELCAweDYxMjYsCisgICAgMHg2MTZELCAweDYwRUUsIDB4NjEyNCwgMHg2MEFGLCAweDYwMDMsIDB4NUJBQSwgMHg1RkM2LCAweDYwNzMsIDB4NUU5NCwKKyAgICAweDYwM0YsIDB4NjFENCwgMHg2MDNDLCAweDYxRDEsIDB4NjA3OSwgMHg2MEU5LCAweDYxRDIsIDB4NjAwMCwgMHg2MEFDLAorICAgIDB4NUZDRiwgMHg2MEU3LCAweDYxNTEsIDB4NjA0QiwgMHg2MjA2LCAweDYyMEIsIDB4NjIxNywgMHg2MjJDLCAweDYyMTgsCisgICAgMHg2MjBGLCAweDYyMzcsIDB4NjI5QiwgMHg2MzFGLCAweDgyMEQsIDB4NjI2QSwgMHg1Mzc3LCAweDYyNkIsIDB4NjJBMSwKKyAgICAweDYzMjMsIDB4NjMwMiwgMHg5MUM3LCAweDYyRTMsIDB4NjI2QywgMHg2MzYyLCAweDYzMjUsIDB4NjM1RiwgMHg2NDQ3LAorICAgIDB4NjM2MywgMHg2MkEyLCAweDYzQjQsIDB4NjNCQywgMHg2NDAyLCAweDYzMUEsIDB4NjJBMCwgMHg2MjlGLCAweDYzQkEsCisgICAgMHg2MzVFLCAweDY0OTEsIDB4NjMyMCwgMHg2MzIyLCAweDYzQjgsIDB4NjJFOCwgMHg2MjlBLCAweDYyNTEsIDB4NjNGRiwKKyAgICAweDYzMUUsIDB4NjMxRCwgMHg2MzYxLCAweDYyRTUsIDB4NjNCMywgMHg2MkU5LCAweDUxRkIsIDB4NjMyMSwgMHg2MkM1LAorICAgIDB4NjM2RSwgMHg2MzI0LCAweDYyREYsIDB4NjQ0OCwgMHg2MkU3LCAweDY0MDEsIDB4NjNCNywgMHg2MjY5LCAweDY0QjcsCisgICAgMHg2NDQ2LCAweDY0REUsIDB4NjRCOCwgMHg2MjcwLCAweDY0NDUsIDB4NjRCNSwgMHg2MkUyLCAweDYyRTYsIDB4NjQ4NCwKKyAgICAweDY0MDAsIDB4NjRCQSwgMHg2NDNBLCAweDY0NDQsIDB4NjUxMiwgMHg2MzFCLCAweDY0NEEsIDB4NjQwNSwgMHg2M0ZELAorICAgIDB4NjY4QiwgMHg4RDI1LCAweDUzRDksIDB4NjU0QywgMHg2NTcwLCAweDY1NUIsIDB4NkJEOSwgMHg2NTkzLCAweDY1QTksCisgICAgMHg2NUFELCAweDRFOEUsIDB4NTM0NywgMHg2NUY2LCAweDY2NEIsIDB4NjYzQywgMHg2NjU1LCAweDY2NTYsIDB4NjVGOCwKKyAgICAweDc1NDUsIDB4NjY4MiwgMHg2NjM1LCAweDY2NTQsIDB4NTM4NiwgMHg2NjE5LCAweDY2NTMsIDB4NjZBNywgMHg2NUY3LAorICAgIDB4NjYzRCwgMHg2NjUyLCAweDRFNjYsIDB4NEYxQSwgMHg4MEU3LCAweDRFMUMsIDB4NjgwNSwgMHg2NzQ2LCAweDY4MDAsCisgICAgMHg2N0E3LCAweDY3NjEsIDB4NjdBRCwgMHg1RjAzLCAweDY3QTgsIDB4NjdBMywgMHg2ODBCLCAweDY4MDgsIDB4NjgxNiwKKyAgICAweDY4NjAsIDB4Njc2OCwgMHg2N0FCLCAweDY4NjIsIDB4NEUxQSwgMHg2NzgxLCAweDY3NjksIDB4ODM2MywgMHg2ODY0LAorICAgIDB4Njc4NCwgMHg2N0FBLCAweDY3NjAsIDB4NjhCRiwgMHg2OTIwLCAweDY5MDEsIDB4Njg2OCwgMHg2ODY5LCAweDRFNTAsCisgICAgMHg2NzlFLCAweDY5N0MsIDB4NjgwNywgMHg2N0EyLCAweDY4MzcsIDB4NjczNCwgMHg2ODExLCAweDY4NjYsIDB4Njg2MSwKKyAgICAweDY4NjUsIDB4NjczQSwgMHg2OTJELCAweDZBMkEsIDB4NkFBOSwgMHg2OURDLCAweDY3RkQsIDB4Njg2MywgMHg2ODY3LAorICAgIDB4NjlEQSwgMHg2OEMwLCAweDZBMkYsIDB4NjhCQywgMHg1M0YwLCAweDY5REYsIDB4NjdFMCwgMHg2OURCLCAweDgyRDgsCisgICAgMHg2N0RDLCAweDZBNzksIDB4Njk4OCwgMHg2ODA5LCAweDY5MUYsIDB4NkE3QywgMHg2ODBFLCAweDZBNzEsIDB4NjlFMCwKKyAgICAweDY4MEMsIDB4NjdBNSwgMHg2QTY1LCAweDY5ODcsIDB4NjgwQSwgMHg2OTg5LCAweDY4QzIsIDB4NkEzMSwgMHg2ODBGLAorICAgIDB4Njc0MywgMHg2OTI0LCAweDY4M0UsIDB4Njk4NCwgMHg5NEE2LCAweDZCMjcsIDB4NkIyNCwgMHg2QjIyLCAweDVDODEsCisgICAgMHg1Mzg2LCAweDVGNTIsIDB4NkI4MSwgMHg2QjhCLCAweDZCOTIsIDB4NkI4NywgMHg2QjlBLCAweDZCOTMsIDB4NkJBMSwKKyAgICAweDZCN0MsIDB4Njc0MCwgMHg1OEYzLCAweDZCQzEsIDB4NkJCNCwgMHg2QkY1LCAweDZCRTEsIDB4NkMwNywgMHg2QzE0LAorICAgIDB4NkMyMiwgMHg2QzI5LCAweDZDMzIsIDB4NTFGQywgMHg1MUIzLCAweDUxQjEsIDB4NkNBMSwgMHg1MUI1LCAweDZDQzQsCisgICAgMHg2Qzc5LCAweDZENDMsIDB4NkNGRSwgMHg1MUM5LCAweDUxQzQsIDB4NkNFQSwgMHg2RTBDLCAweDUxQzAsIDB4NkNBNiwKKyAgICAweDZFMEEsIDB4NkQ5RSwgMHg2RDQ1LCAweDZEQTMsIDB4NTFDRiwgMHg2Q0E4LCAweDZEQTEsIDB4NkQ0QiwgMHg2RDUxLAorICAgIDB4NTFEMSwgMHg2RDQ4LCAweDZEOEMsIDB4NkQwNywgMHg2QzY0LCAweDZDQTksIDB4NTFDNiwgMHg2QzlGLCAweDZFMjksCisgICAgMHg2REEyLCAweDZFN0YsIDB4NkNBNywgMHg3MDZELCAweDZEQTQsIDB4ODM2NSwgMHg2Q0FBLCAweDZFREUsIDB4NkUxNywKKyAgICAweDZENTIsIDB4NkQ1MCwgMHg2RURBLCAweDZFRTEsIDB4NkUxNCwgMHg2RTg3LCAweDZDQTQsIDB4NkM0OSwgMHg2RDlGLAorICAgIDB4NkUwRCwgMHg2REE4LCAweDZFMTAsIDB4NkQ0NiwgMHg5ODhELCAweDZDRkMsIDB4NkQwMSwgMHg2RjVDLCAweDZEQTYsCisgICAgMHg2RDU0LCAweDZFODMsIDB4NkRBMCwgMHg2REE5LCAweDZENDcsIDB4NkQ5RCwgMHg2Qzg0LCAweDZEQTcsIDB4NkUxMSwKKyAgICAweDZDRkQsIDB4NkVFQSwgMHg2Q0Y2LCAweDZENEQsIDB4NkQ0QSwgMHg2RDUzLCAweDZFN0YsIDB4NkNERSwgMHg2RDRFLAorICAgIDB4NkQ5QiwgMHg2RUU1LCAweDZGNEQsIDB4NkVFOCwgMHg2RTg1LCAweDZDRkEsIDB4NkVFNCwgMHg2RUUyLCAweDZFMEUsCisgICAgMHg2Q0ZCLCAweDZENEYsIDB4NkZEMiwgMHg2Q0Y4LCAweDZDQTUsIDB4NkY0NywgMHg2RjQ2LCAweDZGNzQsIDB4NkNGNywKKyAgICAweDZGRDEsIDB4NkY0QiwgMHg2RjlDLCAweDZDQTMsIDB4NkVFMCwgMHg2RDEyLCAweDZFRTksIDB4NzA0RiwgMHg2RTdFLAorICAgIDB4NkVFNiwgMHg2RURGLCAweDcwN0UsIDB4NEUzQSwgMHg0RTRDLCAweDcwQzMsIDB4NjVFMCwgMHg3MEJDLCAweDcwOUMsCisgICAgMHg3MERGLCAweDgzMTUsIDB4NzExNSwgMHg3MEU2LCAweDcwODAsIDB4ODM2NywgMHg3MDlELCAweDcwRUQsIDB4NzBCRCwKKyAgICAweDcwRTgsIDB4NzA2RiwgMHg3MDk2LCAweDcwRTcsIDB4NzBFQiwgMHg3MTE2LCAweDg0MjUsIDB4NzA3RiwgMHg3MERCLAorICAgIDB4NzBFOSwgMHg3MEVDLCAweDcxMTgsIDB4NzBDMSwgMHg3MDg5LCAweDcwQzIsIDB4NEU4OSwgMHg0RTNBLCAweDcyMzcsCisgICAgMHg1QzE0LCAweDU4OTksIDB4NzI0RCwgMHg3Mjc1LCAweDgzNjYsIDB4NzI2NiwgMHg3MjhBLCAweDcyN0EsIDB4NzJCNiwKKyAgICAweDcyRUQsIDB4NzJDOCwgMHg3MkYwLCAweDcyQjksIDB4NzJGMiwgMHg3MkI4LCAweDcyRjEsIDB4NzJFRSwgMHg1OTU2LAorICAgIDB4NzJFQywgMHg3MkVGLCAweDczMDMsIDB4NzJERSwgMHg4M0I3LCAweDczMEUsIDB4NzJCNywgMHg1MTdELCAweDczNkQsCisgICAgMHg3MzJFLCAweDczMTUsIDB4NzMyMSwgMHg3M0IwLCAweDczRDAsIDB4NzNGMiwgMHg3M0FFLCAweDczOUEsIDB4NzQxMCwKKyAgICAweDc0NzYsIDB4ODNCOSwgMHg3MzlCLCAweDc0MDUsIDB4NzNCMSwgMHg3NDBGLCAweDc0MEUsIDB4NzM5MSwgMHg3NDc3LAorICAgIDB4NzNGMCwgMHg3M0FGLCAweDczOTksIDB4NzNCQSwgMHg3NDNDLCAweDczRDEsIDB4NzQ4RSwgMHg3NEQyLCAweDc0RUYsCisgICAgMHg3NEVFLCAweDRFQTcsIDB4NEVBNywgMHg0RUE5LCAweDZCRDUsIDB4NzUzQiwgMHg3NTcyLCAweDVGMDIsIDB4NUY1MywKKyAgICAweDc1NzQsIDB4NTNFMCwgMHg3NUM5LCAweDkxNzgsIDB4NzVGOSwgMHg3NUQ2LCAweDc1QUYsIDB4NzVBMSwgMHg3NUVBLAorICAgIDB4NzYxNywgMHg3NUFFLCAweDc1OUYsIDB4NzVBRCwgMHg3NjE4LCAweDc1OTcsIDB4NzVFOCwgMHg3NUVCLCAweDc2MDUsCisgICAgMHg3NUEwLCAweDc2MkEsIDB4NzVEMiwgMHg3NTk2LCAweDc1QUMsIDB4NzY1RSwgMHg3NjYzLCAweDc2M0YsIDB4NzYzRSwKKyAgICAweDc1QzgsIDB4NzYyQiwgMHg3NjZCLCAweDUzRDEsIDB4NzY5MSwgMHg3NUIxLCAweDc2QjIsIDB4NzZCMSwgMHg2NzZGLAorICAgIDB4NzZENywgMHg3NkNGLCAweDVDM0QsIDB4NzZEMSwgMHg3NkQ4LCAweDUzNjIsIDB4ODM2MSwgMHg3NzI2LCAweDRGMTcsCisgICAgMHg1NkYwLCAweDc3NDEsIDB4Nzc1MCwgMHg3NzJGLCAweDc3OTIsIDB4NEU4NiwgMHg3Nzg2LCAweDc3NTEsIDB4NzcyQywKKyAgICAweDc3QTksIDB4NzdFQiwgMHg3ODQ1LCAweDcwQUUsIDB4Nzg0MSwgMHg3ODU2LCAweDc4MTcsIDB4NzgxQSwgMHg3ODU1LAorICAgIDB4NzgwMCwgMHg3ODZFLCAweDc4MDEsIDB4Nzg1OSwgMHg3ODE2LCAweDc4OUMsIDB4Nzg5QiwgMHg3N0Y2LCAweDc4NTcsCisgICAgMHg3ODVBLCAweDc4NDAsIDB4Nzg4RCwgMHg3N0ZGLCAweDc4M0EsIDB4NzgzRSwgMHg3N0ZFLCAweDc4M0IsIDB4Nzk4NCwKKyAgICAweDc5NzgsIDB4Nzk2RiwgMHg3OTRFLCAweDVGQTEsIDB4Nzk4NSwgMHg3OTNDLCAweDc5NzcsIDB4NzlDMywgMHg3QzdDLAorICAgIDB4N0EwRSwgMHg3OUM2LCAweDY4RjEsIDB4NzlDRCwgMHg3OUYwLCAweDdBMjMsIDB4NzlFRiwgMHg5ODk2LCAweDc5RkUsCisgICAgMHg3QTUxLCAweDc5RkQsIDB4N0EzMywgMHg3QTlELCAweDZEM0MsIDB4N0E3NywgMHg3QTkxLCAweDdBOEUsIDB4N0FBRCwKKyAgICAweDdBQTUsIDB4N0E5QywgMHg3QThELCAweDdBQTYsIDB4N0E4MywgMHg3QURFLCAweDdCMTQsIDB4N0IwQiwgMHg3QjE1LAorICAgIDB4N0IzQSwgMHg3QjVELCAweDgyODIsIDB4ODMwMywgMHg3QjUxLCAweDdCQTcsIDB4N0I3QywgMHg3QjAzLCAweDdCNUIsCisgICAgMHg3QjVBLCAweDdCQTYsIDB4N0JEMywgMHg3QkFBLCAweDdCODAsIDB4N0JEMSwgMHg3QkFCLCAweDZBOTAsIDB4N0I1QywKKyAgICAweDdCN0UsIDB4NUUxOCwgMHg3QkVFLCAweDdCNzksIDB4N0I5MywgMHg3QkVGLCAweDdCQTgsIDB4N0M0MSwgMHg3QjNDLAorICAgIDB4N0I3RSwgMHg3QjNFLCAweDdCRjEsIDB4N0JBOSwgMHg1NDAxLCAweDU5ODYsIDB4N0NBNCwgMHg3Q0MxLCAweDdDQUEsCisgICAgMHg3Q0FFLCAweDdDRjUsIDB4N0M5RCwgMHg3Qzc0LCAweDdDOUMsIDB4N0VBMCwgMHg3RUFBLCAweDdFQTMsIDB4N0VBNiwKKyAgICAweDdFQTIsIDB4N0VBMSwgMHg3RUE1LCAweDdFQTgsIDB4N0VBQiwgMHg3RUI5LCAweDdFQjMsIDB4N0VCRCwgMHg3RUJFLAorICAgIDB4N0VBRiwgMHg3RUIwLCAweDdFQjEsIDB4N0VCOCwgMHg3RUE3LCAweDdFQjcsIDB4N0VBRCwgMHg3RUI0LCAweDdFQkEsCisgICAgMHg2MjRFLCAweDYyNEUsIDB4N0VDNiwgMHg3RUMyLCAweDdFQzEsIDB4N0VDNSwgMHg3RUJCLCAweDdFQ0QsIDB4N0VDMCwKKyAgICAweDdFQ0IsIDB4N0VEMCwgMHg3RUNDLCAweDdFQzgsIDB4NUYyNiwgMHg3RUM0LCAweDdFQ0EsIDB4N0VENywgMHg3RUQzLAorICAgIDB4N0VERCwgMHg3RUU2LCAweDdFRDQsIDB4N0VERSwgMHg3RURDLCAweDdFREEsIDB4N0VEOSwgMHg3RUQyLCAweDdFRDYsCisgICAgMHg3RURGLCAweDRFMUQsIDB4N0VEQiwgMHg3RUUyLCAweDdFRDEsIDB4N0VFMSwgMHg3RUUwLCAweDdFRTgsIDB4N0VFNSwKKyAgICAweDdFQ0YsIDB4N0VGQywgMHg3RjBELCAweDdFRkYsIDB4N0VGOCwgMHg3RUZCLCAweDdFRjYsIDB4N0VGNCwgMHg3RUZFLAorICAgIDB4N0VCMiwgMHg3RjUxLCAweDdGMDAsIDB4N0VCNiwgMHg3RUZBLCAweDdFRUUsIDB4N0VGRCwgMHg3RUYwLCAweDdFRUIsCisgICAgMHg3RUY1LCAweDdFRjIsIDB4N0YwMSwgMHg3RDI3LCAweDdFRUYsIDB4N0VFQSwgMHg3RjAzLCAweDdGMDQsIDB4N0YwMiwKKyAgICAweDdFQkYsIDB4N0YwOSwgMHg3RjBFLCAweDdGMTQsIDB4N0YxNywgMHg3RjE4LCAweDdGMEMsIDB4N0YxNiwgMHg3RjEzLAorICAgIDB4N0YwNSwgMHg3RUFDLCAweDdGMTEsIDB4N0YwOCwgMHg3RUMzLCAweDdGMEYsIDB4N0YwNywgMHg4MUY0LCAweDg0MjYsCisgICAgMHg3RjE5LCAweDdGMjIsIDB4N0YxMiwgMHg3RUM5LCAweDdGMjMsIDB4N0YxRSwgMHg3RjFBLCAweDdGMUMsIDB4N0YxRiwKKyAgICAweDdGMUIsIDB4NTNCRiwgMHg3RjFELCAweDdGMjksIDB4N0VCNSwgMHg3RjI3LCAweDdGMjYsIDB4N0Q3NywgMHg3RjE1LAorICAgIDB4N0YyNSwgMHg2MDNCLCAweDdFRTksIDB4N0VGNywgMHg3RjJCLCAweDdGMkEsIDB4N0YyRiwgMHg3RUM3LCAweDdGMkUsCisgICAgMHg3RjJELCAweDdFRDUsIDB4N0VFMywgMHg3RjBCLCAweDdFRjMsIDB4N0VEOCwgMHg3Q0ZCLCAweDgzMjcsIDB4N0YzMywKKyAgICAweDdGMzIsIDB4N0YzNCwgMHg3RUNFLCAweDdFRTcsIDB4N0YyNCwgMHg3RjMxLCAweDdGMkMsIDB4N0VBOSwgMHg3RUVELAorICAgIDB4N0YyMCwgMHg3RjI4LCAweDdFQTQsIDB4N0YzNSwgMHg3RjA2LCAweDk0QjUsIDB4N0Y0MiwgMHg3RjVBLCAweDlBODIsCisgICAgMHg3RjYyLCAweDdGNTcsIDB4N0Y3NCwgMHg3RjgxLCAweDgyODgsIDB4N0Y5RiwgMHg3RkExLCAweDRFNDksIDB4ODFCQiwKKyAgICAweDRFNjAsIDB4N0ZDNiwgMHg3RkRBLCAweDdGRDgsIDB4N0ZEOSwgMHg4MDI3LCAweDU3MjMsIDB4OTVGQiwgMHg4MDU0LAorICAgIDB4ODA2QSwgMHg1OEYwLCAweDgwMzgsIDB4ODA2OSwgMHg4MDQyLCAweDgwNEMsIDB4ODA0RCwgMHg1NDJDLCAweDgwNEIsCisgICAgMHg4MDgzLCAweDgwQzEsIDB4ODEwOSwgMHg4MEVCLCAweDgxMzEsIDB4ODBDMCwgMHg4MEJFLCAweDgwRTgsIDB4ODEzNiwKKyAgICAweDgxMTEsIDB4ODBCRiwgMHg4MTFBLCAweDgwQTAsIDB4ODE3RCwgMHg4MTU4LCAweDgwQTQsIDB4ODBGNiwgMHg4MTdCLAorICAgIDB4ODBDNiwgMHg4MTBELCAweDgxMTMsIDB4ODEzOCwgMHg4MTEwLCAweDgxOTEsIDB4ODE0QSwgMHg4MEVBLCAweDgxMEYsCisgICAgMHg4MTE0LCAweDgxREMsIDB4NTM2NywgMHg0RTM0LCAweDUzRjAsIDB4NEUwRSwgMHg1MTc0LCAweDRFM0UsIDB4NjVFNywKKyAgICAweDgyMzEsIDB4ODIyMywgMHg4MjMwLCAweDgyM0IsIDB4ODI3MCwgMHg4MjczLCAweDgyQzQsIDB4NTIwRCwgMHg4MkNFLAorICAgIDB4NTE3OSwgMHg4MzQ2LCAweDhDNDYsIDB4NUU4NCwgMHg4MzBFLCAweDgzNUEsIDB4ODJDQiwgMHg1MzRFLCAweDcwREYsCisgICAgMHg4MkNDLCAweDgzQjEsIDB4NEUwNywgMHg4M0I0LCAweDUzRjYsIDB4ODM2RCwgMHg3NzQwLCAweDgyQzcsIDB4ODM2NCwKKyAgICAweDY0MUMsIDB4ODNCMywgMHg4Mzg1LCAweDgyQ0QsIDB4ODM2QSwgMHg3NkQ2LCAweDgzQjIsIDB4ODJDMSwgMHg4M0JDLAorICAgIDB4ODM1QywgMHg4NDhDLCAweDg0OEIsIDB4ODQ3MSwgMHg4MzExLCAweDgzNkIsIDB4ODM2OCwgMHg4NDg3LCAweDgzNUUsCisgICAgMHg4MzZDLCAweDgzQjgsIDB4ODM1QiwgMHg4NDg5LCAweDgyOUMsIDB4ODQyNywgMHg4NEUzLCAweDgzNUYsIDB4ODRERiwKKyAgICAweDgyOTcsIDB4NTlEQywgMHg4NTM3LCAweDgzQjYsIDB4ODM1MCwgMHg4NDI4LCAweDgzNjAsIDB4NTAxRiwgMHg4NERELAorICAgIDB4ODM2OSwgMHg4MjdBLCAweDgzNkYsIDB4ODVBRSwgMHg4MkM4LCAweDg1M0MsIDB4ODUzQSwgMHg4NDFBLCAweDg1NzIsCisgICAgMHg4MkE2LCAweDgyQ0YsIDB4ODU3NCwgMHg4MkY5LCAweDg2MTYsIDB4ODVEMywgMHg4NTM5LCAweDgzMEYsIDB4NTE3MCwKKyAgICAweDg0RTAsIDB4ODQxRCwgMHg1OTA0LCAweDg2NUEsIDB4ODY0RiwgMHg1M0Y3LCAweDRFOEYsIDB4ODY2QywgMHg4NkYxLAorICAgIDB4ODcxNSwgMHg4NkFDLCAweDg2ODAsIDB4NzMyQywgMHg4NjdFLCAweDg2NzEsIDB4ODcxNywgMHg4NkYzLCAweDg2ODIsCisgICAgMHg4NDI0LCAweDg3N0MsIDB4ODc4MCwgMHg4NkYwLCAweDg3NDgsIDB4ODdBOCwgMHg4NjZFLCAweDg3NDksIDB4ODZGMiwKKyAgICAweDg2NkIsIDB4ODZDRiwgMHg4NjgxLCAweDg2ODMsIDB4ODc0NywgMHg4NjdGLCAweDg3NEUsIDB4ODZGNCwgMHg4NzdFLAorICAgIDB4ODY5RCwgMHg4NzIxLCAweDg2Q0UsIDB4ODdDRiwgMHg4NkNBLCAweDg2OTUsIDB4ODZFRSwgMHg0RjE3LCAweDY3MkYsCisgICAgMHg1MzZCLCAweDUxQjIsIDB4ODg2RSwgMHg4ODg1LCAweDg4NjUsIDB4ODhDNSwgMHg5MUNDLCAweDUyMzYsIDB4NTkwRCwKKyAgICAweDg4QzgsIDB4ODg4NiwgMHg4OEU0LCAweDg4RTIsIDB4N0YyMSwgMHg4OTFCLCAweDRFQjUsIDB4ODhFNSwgMHg4ODg0LAorICAgIDB4ODhFMywgMHg4OEM2LCAweDg5MzQsIDB4ODg5QywgMHg4ODZDLCAweDg4QUQsIDB4ODk1NSwgMHg4OUMxLCAweDg5QzQsCisgICAgMHg4OUM1LCAweDg5QzYsIDB4ODlDNywgMHg4OUNCLCAweDg5Q0QsIDB4ODlDRSwgMHg0RUIyLCAweDg5Q0EsIDB4ODlDRiwKKyAgICAweDg5RDAsIDB4ODlEMSwgMHg4OUM5LCAweDg5QzgsIDB4ODlDQywgMHg4OUMyLCAweDg5REUsIDB4ODlFRiwgMHg4OUU2LAorICAgIDB4OEJBMiwgMHg4QkEzLCAweDhCQTEsIDB4OEJBRiwgMHg4QkE3LCAweDhCQTgsIDB4OEJBNiwgMHg4QkFELCAweDhCQUEsCisgICAgMHg4QkFCLCAweDhCQUMsIDB4OEJCMCwgMHg4QkI5LCAweDhCQjYsIDB4OEJCQywgMHg4QkMwLCAweDhCQjcsIDB4OEJCRiwKKyAgICAweDhCQkUsIDB4OEJCOCwgMHg4QkM5LCAweDhCQzMsIDB4OEJDQSwgMHg4QkMxLCAweDhCQzIsIDB4OEJDQiwgMHg4QkI1LAorICAgIDB4OEJDOCwgMHg4QkQyLCAweDhCQ0YsIDB4OEJDNCwgMHg4QkNFLCAweDhCQzUsIDB4OEJDRCwgMHg1NDhGLCAweDhCRTksCisgICAgMHg4QkUyLCAweDhCRTMsIDB4OEJENSwgMHg4QkQ3LCAweDhCRTcsIDB4OEJERiwgMHg4QkUxLCAweDhCRTAsIDB4OEJEOCwKKyAgICAweDhCREQsIDB4OEJFNSwgMHg4QkU2LCAweDhCREMsIDB4OEJEOSwgMHg4QkQ2LCAweDhCRDQsIDB4OEJEQiwgMHg4QkQzLAorICAgIDB4NTkzOCwgMHg1RkQ3LCAweDhCQTQsIDB4OEJGMywgMHg4QkY2LCAweDhCREUsIDB4OEJGMSwgMHg4QkVFLCAweDhCRUQsCisgICAgMHg4QkRBLCAweDhCRUIsIDB4OEJFQywgMHg4QkVGLCAweDhCRjAsIDB4OEJGNSwgMHg4QkYyLCAweDhCRjQsIDB4OEMwMSwKKyAgICAweDhCRkUsIDB4OEMwNywgMHg4QkZELCAweDhDMEEsIDB4OEMwMywgMHg4QzA0LCAweDhDMDYsIDB4OEMwOCwgMHg4QkZGLAorICAgIDB4OEJGNywgMHg4QkU0LCAweDhCRjksIDB4OEJGQywgMHg4QzA1LCAweDhCQkEsIDB4OEMwMiwgMHg4QzAwLCAweDhDMEQsCisgICAgMHg4QzFFLCAweDhDMUQsIDB4OEMyNSwgMHg4QkU4LCAweDhDMTQsIDB4OEMxQiwgMHg4QzEwLCAweDhDMEYsIDB4OEMxNSwKKyAgICAweDhDMTgsIDB4OEJCMywgMHg4QzE5LCAweDhDMEMsIDB4OEJCRCwgMHg4QkY4LCAweDhDMUEsIDB4OEMxNiwgMHg4QkZBLAorICAgIDB4OEMwQiwgMHg4QzEyLCAweDhDMTMsIDB4OEE4QSwgMHg4QkNDLCAweDhDMEUsIDB4OEMxQywgMHg4QzI3LCAweDhDMTEsCisgICAgMHg4QzIxLCAweDhDMjQsIDB4OEMyNiwgMHg4QkIyLCAweDhDMjIsIDB4OEMyMywgMHg4QzFGLCAweDhDMkEsIDB4OEMyQywKKyAgICAweDhCQjQsIDB4OEMyOCwgMHg4QzI5LCAweDhCQzEsIDB4OEMzMiwgMHg4QkE1LCAweDhDMkUsIDB4OEJDNiwgMHg4QzJGLAorICAgIDB4OEMyRCwgMHg4QzMxLCAweDhDMzUsIDB4OEJEMSwgMHg4QkFFLCAweDhDMzQsIDB4NjJBNCwgMHg4QkVBLCAweDhBODksCisgICAgMHg4QzJCLCAweDhCRkIsIDB4NTNEOCwgMHg4QTVGLCAweDk2RTAsIDB4OEMxNywgMHg4QkE5LCAweDhDMzAsIDB4OEMzNiwKKyAgICAweDhENUUsIDB4OEMyMCwgMHg4QzMzLCAweDVDODIsIDB4N0FENiwgMHg0RTMwLCAweDczMkEsIDB4OEM2RSwgMHg3MzJCLAorICAgIDB4OEQxRCwgMHg4RDFFLCAweDhEMUYsIDB4OEQyMiwgMHg4RDIxLCAweDhEMkIsIDB4OEQyNywgMHg4RDI5LCAweDhEMkEsCisgICAgMHg4RDJGLCAweDhEMjMsIDB4OEQyRSwgMHg4RDMzLCAweDhENDAsIDB4OEQzMCwgMHg4RDM1LCAweDhEMkMsIDB4NEU3MCwKKyAgICAweDhEMzcsIDB4OEQzNiwgMHg4RDM5LCAweDhEMzQsIDB4OEQzQiwgMHg4RDM4LCAweDhEM0EsIDB4OEQzMiwgMHg4RDQyLAorICAgIDB4OEQ0MSwgMHg4RDNGLCAweDhENDUsIDB4OEQ0NCwgMHg4RDNFLCAweDhEM0MsIDB4OEQ0OCwgMHg4RDRBLCAweDVCQkUsCisgICAgMHg4RDQ3LCAweDhENTIsIDB4OEQ0OSwgMHg4RDUwLCAweDhENEYsIDB4OEQ1NCwgMHg4RDUzLCAweDhEMjQsIDB4NTM1NiwKKyAgICAweDhEMzEsIDB4OEQ0QiwgMHg4RDU1LCAweDhEMjgsIDB4OEQyNiwgMHg4RDRDLCAweDhENTYsIDB4OEQ1NywgMHg4RDVBLAorICAgIDB4OEQ1OSwgMHg4RDJELCAweDhENUIsIDB4OEQ1QywgMHg4RDNELCAweDhENTgsIDB4OEQ1RiwgMHg4RDYwLCAweDhENUUsCisgICAgMHg4RDYxLCAweDhENjIsIDB4OEQ0NiwgMHg4RDQzLCAweDhENTEsIDB4OEQ0RSwgMHg4RDVELCAweDhENjMsIDB4OEQ2QSwKKyAgICAweDhENzYsIDB4OEQ3NSwgMHg4RDhCLCAweDhEQjEsIDB4OEZGOSwgMHg4REY1LCAweDhFMEEsIDB4OERDNCwgMHg4REY4LAorICAgIDB4OERENiwgMHg4RTUyLCAweDhERjcsIDB4OERGNiwgMHg4REI4LCAweDhFMEMsIDB4OERGQiwgMHg4REMzLCAweDhFMkYsCisgICAgMHg4RERFLCAweDhFMkMsIDB4OEU3MCwgMHg4REY5LCAweDhFNTEsIDB4OEU3RiwgMHg4RTlDLCAweDhFOEYsIDB4OEVBRiwKKyAgICAweDhGNjYsIDB4OEY2NywgMHg4RjY4LCAweDUxOUIsIDB4OEY2OSwgMHg4RjZCLCAweDhGNkQsIDB4OEY2RiwgMHg4Rjc4LAorICAgIDB4OEY3MSwgMHg4Rjc0LCAweDhGNzUsIDB4OEY3QSwgMHg4RjcyLCAweDhGNzYsIDB4OEY3QywgMHg4RjgzLCAweDhGODIsCisgICAgMHg4RjgxLCAweDhGODAsIDB4OEY3RCwgMHg4RjdFLCAweDhGODQsIDB4OEY4NSwgMHg4RjdCLCAweDhGODYsIDB4OEY4RSwKKyAgICAweDhGODksIDB4OEY4QiwgMHg4RjhELCAweDhGOEEsIDB4OEY4NywgMHg4Rjg4LCAweDhGNkUsIDB4OEY5MSwgMHg4RjhGLAorICAgIDB4OEY5MywgMHg4RjkwLCAweDhGOTcsIDB4ODIwNiwgMHg4RjkyLCAweDZCQzIsIDB4OEY5NiwgMHg4Rjk1LCAweDhGOTgsCisgICAgMHg4RjZDLCAweDhGOTksIDB4OEY3RiwgMHg4RjlBLCAweDhGNzAsIDB4OEY5NCwgMHg4Rjc5LCAweDhGNzMsIDB4NTI5RSwKKyAgICAweDhGOUUsIDB4OEZBQiwgMHg4RkE5LCAweDUxOUMsIDB4OEZEOSwgMHg4RkRFLCAweDU0NjgsIDB4OEZEQiwgMHg2RTM4LAorICAgIDB4OEZEMCwgMHg4RkM3LCAweDhGQkUsIDB4OEZERCwgMHg5MDY1LCAweDkwMEEsIDB4OTAxMiwgMHg4RkRDLCAweDkwMDIsCisgICAgMHg4RkRGLCAweDhGQzEsIDB4OTAwOSwgMHg5MDU3LCAweDhGQkQsIDB4OEZDOCwgMHg4RkQ4LCAweDhGRTksIDB4OEZCOSwKKyAgICAweDkwM0IsIDB4OTAyNiwgMHg5MENGLCAweDkwQUUsIDB4OTBEMywgMHg0RTYxLCAweDkwQjksIDB4OTBBQywgMHg5MEU3LAorICAgIDB4OTA5MywgMHg5MEQxLCAweDkwQkIsIDB4OTBGOCwgMHg5MEJBLCAweDkwRDAsIDB4OTA5RCwgMHg5MTQyLCAweDkwRTYsCisgICAgMHg4MTRDLCAweDRFMTEsIDB4OTE1RCwgMHg1MzNCLCAweDkxNzEsIDB4OTE2NiwgMHg5MTdGLCAweDg4NDUsIDB4OTE3RSwKKyAgICAweDkxN0QsIDB4OTFDQSwgMHg5NDg3LCAweDk0OEMsIDB4OTQ4QSwgMHg5NDg5LCAweDk0OEIsIDB4OTQ4OCwgMHg5NDkzLAorICAgIDB4OTQ5MCwgMHg5NDhGLCAweDk0OTIsIDB4OTQ4RSwgMHg5NDk3LCAweDk0OEQsIDB4OTQ5NSwgMHg5NEFGLCAweDk0QUIsCisgICAgMHg5NDk4LCAweDk0QUQsIDB4OTRBMCwgMHg5NDlELCAweDk0QTQsIDB4OTRBMywgMHg5NDlFLCAweDk0QUUsIDB4OTRBNywKKyAgICAweDk0OTksIDB4OTQ5QiwgMHg5NEFBLCAweDk0Q0MsIDB4OTRDOCwgMHg5NEI2LCAweDk0QzMsIDB4OTRCNCwgMHg5NEI5LAorICAgIDB4OTRDRCwgMHg5NEIwLCAweDk0QjgsIDB4OTRDMCwgMHg5NEJGLCAweDk0QkUsIDB4OTQ5QywgMHg5NENBLCAweDk0QzksCisgICAgMHg5NEM3LCAweDk0Q0IsIDB4OTRDMiwgMHg5NEIzLCAweDk0QzYsIDB4OTRDNSwgMHg5NEJBLCAweDk0QTksIDB4OTRCMiwKKyAgICAweDk0QkMsIDB4OTRCRCwgMHg5NENGLCAweDk0RjAsIDB4OTREMiwgMHg5NEVDLCAweDk0RUEsIDB4OTRGNiwgMHg5NEYzLAorICAgIDB4OTREQywgMHg5NERBLCAweDk0RTMsIDB4OTRFOCwgMHg5NEUyLCAweDk0RUQsIDB4OTRFQiwgMHg5NEU2LCAweDg4NTQsCisgICAgMHg5NEQxLCAweDk0RjcsIDB4OTRGMSwgMHg5NERGLCAweDk0RjUsIDB4OTRENSwgMHg5NEVGLCAweDk0RDAsIDB4OTUxMCwKKyAgICAweDk1MDAsIDB4OTUwOCwgMHg5NTExLCAweDk1MDksIDB4OTRERCwgMHg5NTEyLCAweDk1MEMsIDB4OTRBMSwgMHg5NEU0LAorICAgIDB4OTRENywgMHg5NTBCLCAweDk1MEEsIDB4OTUxMywgMHg5NTA0LCAweDk1MDMsIDB4OTUxNCwgMHg5NTA3LCAweDk0RDMsCisgICAgMHg5NEZBLCAweDk0RDYsIDB4OTUwNiwgMHg5NTAyLCAweDk1MkYsIDB4OTRBMiwgMHg5NTFFLCAweDVGNTUsIDB4OTUxNiwKKyAgICAweDk1MjksIDB4OTRENCwgMHg5NTI1LCAweDk1MTUsIDB4OTUxRiwgMHg5NTI0LCAweDk1MzEsIDB4OTRFRSwgMHg5NTFCLAorICAgIDB4OTUyQywgMHg5NTJELCAweDk1MUMsIDB4OTRCMSwgMHg5NTI2LCAweDk1MUEsIDB4OTUyMCwgMHg5NTIxLCAweDk1MjIsCisgICAgMHg5NTE5LCAweDk1MzAsIDB4ODg2OCwgMHg5NEZDLCAweDk1MjgsIDB4OTQ5NCwgMHg5NTM0LCAweDk0RkUsIDB4OTUwNSwKKyAgICAweDk1NDAsIDB4OTUzNywgMHg5NEUxLCAweDk0OTYsIDB4OTUzQiwgMHg5NTNELCAweDk1MzgsIDB4OTUzMiwgMHg5NTM5LAorICAgIDB4OTUzRSwgMHg5NTJFLCAweDk1MzYsIDB4OTUxNywgMHg5NTNBLCAweDk1NDEsIDB4OTU1MSwgMHg5NTU1LCAweDk1MDEsCisgICAgMHg5NTQ5LCAweDk1NDgsIDB4OTU0MywgMHg5NEE4LCAweDg0RTUsIDB4OTU0RiwgMHg5NEUwLCAweDk0RTksIDB4OTUzQywKKyAgICAweDk1NTAsIDB4OTU0NywgMHg5NTUyLCAweDk1NEQsIDB4OTU1MywgMHg5NTVFLCAweDk1NUYsIDB4OTRGRSwgMHg5NTQ2LAorICAgIDB4OTU1OSwgMHg5NTYwLCAweDk1NUQsIDB4OTRGRiwgMHg5NTM1LCAweDk1NTcsIDB4OTU1OCwgMHg5NTVCLCAweDk0RjIsCisgICAgMHg5NTVDLCAweDk1NTYsIDB4OTU0MiwgMHg5MzNFLCAweDk1NUEsIDB4OTRFNywgMHg5NTZBLCAweDk1MDgsIDB4OTREOSwKKyAgICAweDk1NjMsIDB4OTU2NiwgMHg5NTYxLCAweDk0OUYsIDB4OTU2QiwgMHg5NTBGLCAweDk1NDQsIDB4OTU0QywgMHg5NTcwLAorICAgIDB4OTU2RiwgMHg5NTZELCAweDk0QzEsIDB4OTU2RSwgMHg5NENFLCAweDk0REIsIDB4OTU3MSwgMHg5NEY4LCAweDk1NkMsCisgICAgMHg5NTU0LCAweDkyNzQsIDB4OTUyNywgMHg5NTc0LCAweDk0QzQsIDB4OTU3MywgMHg5NTY3LCAweDk0QTUsIDB4OTU3NSwKKyAgICAweDk1NzYsIDB4OTU0QSwgMHg5NTY5LCAweDk1MjMsIDB4OTRCQiwgMHg5MkFFLCAweDUxRkYsIDB4OTU3RiwgMHg5NUU4LAorICAgIDB4OTVFOSwgMHg5NUVBLCAweDk1RUIsIDB4OTVFQywgMHg5NUVELCAweDVGMDAsIDB4OTVGNiwgMHg5NUYzLCAweDk1RjAsCisgICAgMHg5NUYyLCAweDk1RjQsIDB4OTVGNSwgMHg5NUY4LCAweDk2MDIsIDB4OTYwMSwgMHg5NjAwLCAweDk1RkEsIDB4OTVGRCwKKyAgICAweDk2MDMsIDB4OTYwNiwgMHg5NUZFLCAweDk2MDUsIDB4OTYwQSwgMHg5NjA5LCAweDk2MEUsIDB4OTYwRiwgMHg5NjBELAorICAgIDB4OTYwOCwgMHg5NjBDLCAweDk2MTIsIDB4Njc3RiwgMHg2Njk3LCAweDk1RjEsIDB4OTYxNCwgMHg5NjE1LCAweDk2MTEsCisgICAgMHg5NjE3LCAweDk2MTgsIDB4OTVGRiwgMHg5NjE2LCAweDk2MTksIDB4OTVFRiwgMHg1MTczLCAweDk2MUEsIDB4OTYxMywKKyAgICAweDk2MTAsIDB4OEY5RiwgMHg5NjFCLCAweDk1RkMsIDB4OTY0OSwgMHg5NjU1LCAweDk2MzUsIDB4OTYzNCwgMHg5NjQ4LAorICAgIDB4OTY0NiwgMHg5NjMzLCAweDk2NjcsIDB4OTYxRiwgMHg5NjM2LCAweDk2NjgsIDB4OTY0NSwgMHg5NjhGLCAweDk2NjksCisgICAgMHg5NjkwLCAweDk2NDcsIDB4OTZCNiwgMHg1M0VBLCAweDk2QkQsIDB4ODY3RCwgMHg1M0NDLCAweDk2Q0YsIDB4Njc0MiwKKyAgICAweDlFMjEsIDB4NzlCQiwgMHg5NkJFLCAweDRFOTEsIDB4NzUzNSwgMHg5NzIxLCAweDk2RkUsIDB4OTcwMSwgMHg5NkYzLAorICAgIDB4OTcyRCwgMHg1M0M3LCAweDcwNzUsIDB4NTNDNiwgMHg5NzUzLCAweDk3NTksIDB4ODE3QywgMHg5NzY1LCAweDlGMTcsCisgICAgMHg1REU5LCAweDk3OUYsIDB4N0YzMCwgMHg5NzkxLCAweDk3QUYsIDB4OTdFNiwgMHg5N0U3LCAweDk3RTksIDB4OTdFQSwKKyAgICAweDk3RUMsIDB4OTdFQiwgMHg5N0Y1LCAweDU0Q0QsIDB4OTg3NSwgMHg5ODc2LCAweDk4NzcsIDB4OTg3OSwgMHg5ODdBLAorICAgIDB4OTg3OCwgMHg5ODdCLCAweDk4N0MsIDB4OTg4MiwgMHg5ODgwLCAweDk4ODMsIDB4OTg4NCwgMHg5ODdELCAweDk4ODEsCisgICAgMHg5ODdGLCAweDk4ODcsIDB4OTg4NiwgMHg5ODhDLCAweDk4ODksIDB4OTg5MCwgMHg5ODhGLCAweDU5MzQsIDB4OTg4QSwKKyAgICAweDk4OEIsIDB4OTg5NCwgMHg5ODg4LCAweDk4OTMsIDB4OTg5MSwgMHg5ODk3LCAweDk4OTgsIDB4OTg5RCwgMHg5ODlBLAorICAgIDB4OTg5QywgMHg5ODk5LCAweDk4OUIsIDB4NjEzRiwgMHg5OEExLCAweDk4QTAsIDB4N0M3QiwgMHg5ODlGLCAweDk4QTIsCisgICAgMHg5ODdFLCAweDk4QTQsIDB4OThBNSwgMHg2NjNFLCAweDk4QTYsIDB4OTg4NSwgMHg5ODlFLCAweDk4QTcsIDB4OThDRSwKKyAgICAweDk4RDAsIDB4OThEMSwgMHg5OEQyLCAweDUzRjAsIDB4OThEMywgMHg5OEQ0LCAweDk4Q0YsIDB4OThENiwgMHg5OEQ1LAorICAgIDB4OThENywgMHg5OEQ4LCAweDk4RDksIDB4OThERSwgMHg5OTY1LCAweDk5NjQsIDB4OTk2NiwgMHg5OTY4LCAweDk5NkEsCisgICAgMHg5OTZCLCAweDk5NkMsIDB4OTk2RCwgMHg5OTZFLCAweDk5NzQsIDB4OTk3MiwgMHg5OTcxLCAweDk5NzAsIDB4OTk3MywKKyAgICAweDk5N0EsIDB4OTk3OCwgMHg5OTdDLCAweDk5NzcsIDB4NTE3QiwgMHg5OTc1LCAweDk5NzksIDB4OTk3RCwgMHg5OTgxLAorICAgIDB4OTk3RiwgMHg5OTdFLCAweDRGNTksIDB4ODBCNCwgMHg5OTg0LCAweDk5ODMsIDB4OTk2RiwgMHg5OTg1LCAweDk5ODYsCisgICAgMHg3Q0M3LCAweDk5NjcsIDB4NTU4MiwgMHg5OTg5LCAweDk5OEUsIDB4OTk2OSwgMHg5OThGLCAweDk5OEEsIDB4OTk4QywKKyAgICAweDk5OEQsIDB4OTk5MiwgMHg5OTkwLCAweDk5OTEsIDB4OTk4OCwgMHg5OTk0LCAweDk5NzYsIDB4OThFOCwgMHg5OTBELAorICAgIDB4OTk4QiwgMHg5QTZDLCAweDlBNkQsIDB4NTFBRiwgMHg5QTZFLCAweDlBNzAsIDB4OUE2RiwgMHg5QTczLCAweDlBN0IsCisgICAgMHg5QTdELCAweDlBNzksIDB4OUE3NSwgMHg5QTdFLCAweDlBODAsIDB4OUE3OCwgMHg5QTc2LCAweDlBN0MsIDB4OUE3NywKKyAgICAweDlBODgsIDB4OUE4NywgMHg5QTgzLCAweDlBODYsIDB4OUE4RSwgMHg5QThGLCAweDlBOEIsIDB4OUE4RCwgMHg5QTkzLAorICAgIDB4OUE5MiwgMHg5QTkxLCAweDlBOTAsIDB4OUE5QiwgMHg5QTk3LCAweDlBOTksIDB4OUE5RSwgMHg5QTk4LCAweDlBOUQsCisgICAgMHg4MTdFLCAweDlBN0EsIDB4OUE5QSwgMHg5QTlGLCAweDlBQTEsIDB4ODRFNiwgMHg5QTlDLCAweDlBOTYsIDB4OUFBMCwKKyAgICAweDlBQTIsIDB4OUE3MSwgMHg5QTg1LCAweDlBOTUsIDB4OUE4MSwgMHg5QTg0LCAweDlBOEMsIDB4NjBDQSwgMHg5QTdGLAorICAgIDB4OUFBNCwgMHg5QTc0LCAweDlBQTcsIDB4OUFBNSwgMHg5QUE2LCAweDlBOEEsIDB4ODBBRSwgMHg5QUM1LCAweDgxMEYsCisgICAgMHg0RjUzLCAweDlBQ0MsIDB4OUFDQiwgMHg1M0QxLCAweDY3N0UsIDB4ODBFMSwgMHg5QjEzLCAweDY1OTcsIDB4OTVGOSwKKyAgICAweDk2MEIsIDB4OTYwNCwgMHg5MEMxLCAweDlCNDksIDB4OUI0NywgMHg5QzdDLCAweDlDODAsIDB4OUM4MSwgMHg5QzgyLAorICAgIDB4OUM3RiwgMHg5Qzg1LCAweDlDODYsIDB4OUM4RiwgMHg5Qzg3LCAweDlDOTAsIDB4OUM4RCwgMHg5QzhCLCAweDlDOEEsCisgICAgMHg5QzkyLCAweDlDOTUsIDB4OUM5NiwgMHg5Qzk0LCAweDlDOUIsIDB4OUM5MSwgMHg5QzlDLCAweDlDQTcsIDB4OUNBMCwKKyAgICAweDlDQTksIDB4OUNBNCwgMHg5Q0E4LCAweDlDQkIsIDB4OUNBRiwgMHg5Q0FELCAweDlDOUUsIDB4OUNCNywgMHg5Q0I0LAorICAgIDB4OUNCMSwgMHg5Q0I1LCAweDlDQjIsIDB4OUNCMywgMHg5Q0I4LCAweDlDQUUsIDB4OUNCMCwgMHg5Q0I2LCAweDlDQUIsCisgICAgMHg5Q0NBLCAweDlDOTcsIDB4OUNCRCwgMHg5Q0M3LCAweDlDQzUsIDB4OUNDNiwgMHg5Q0MzLCAweDlDRDIsIDB4OUNEMSwKKyAgICAweDlDQTUsIDB4OUNDRiwgMHg5Q0NFLCAweDlDRDAsIDB4OUNDRCwgMHg5Q0MxLCAweDlDQTIsIDB4OUNDQywgMHg5Q0E2LAorICAgIDB4OUNBMywgMHg5Q0I5LCAweDlDRDcsIDB4OUNENCwgMHg5Q0M5LCAweDlDRDUsIDB4OUNENiwgMHg5Q0RGLCAweDlDREQsCisgICAgMHg5Q0RDLCAweDlDREUsIDB4OUM5RiwgMHg5Q0JDLCAweDlDOEUsIDB4OUM5OSwgMHg5Q0UzLCAweDlDRTIsIDB4OUM5QSwKKyAgICAweDlDQzQsIDB4OUM4OCwgMHg5Q0ExLCAweDlFMUYsIDB4NTFFQiwgMHg5RTIwLCAweDlFMjQsIDB4NTFFNCwgMHg5RTIzLAorICAgIDB4OUUyMiwgMHg5RTI5LCAweDlFMjgsIDB4OUUyNiwgMHg5RTMwLCAweDlFMzUsIDB4OUUzMywgMHg5RTMyLCAweDlFMkUsCisgICAgMHg5RTMxLCAweDlFMkEsIDB4OUUyRiwgMHg5RTJELCAweDlFMzgsIDB4OUUzOSwgMHg5RTNCLCAweDlFM0YsIDB4OUUzRCwKKyAgICAweDlFM0EsIDB4OUU0MywgMHg5RTQ2LCAweDlFNDEsIDB4OUU0OCwgMHg5RTQ1LCAweDlFNDQsIDB4OUU0OSwgMHg5RTRDLAorICAgIDB4OUU0RiwgMHg5RTRFLCAweDlFNEEsIDB4OUU1MywgMHg5RTJCLCAweDlFNTEsIDB4OUU0QiwgMHg5RTU5LCAweDlFNTUsCisgICAgMHg5RTU3LCAweDlFNTYsIDB4OUU0RCwgMHg5RTVCLCAweDlFNUMsIDB4ODNCQSwgMHg5RTVGLCAweDlFNjQsIDB4OUU2MCwKKyAgICAweDlFNjEsIDB4OUU1OCwgMHg5RTYzLCAweDlFNUEsIDB4OUU2MiwgMHg5RTVFLCAweDlFNjcsIDB4OUU2NSwgMHg5RTI1LAorICAgIDB4OUUzNywgMHg5RTY4LCAweDlFMzYsIDB4OUU2QSwgMHg5RTU0LCAweDlFNjksIDB4OUU2QiwgMHg5RTQ3LCAweDlFNkMsCisgICAgMHg5RTcwLCAweDlFNkQsIDB4OUU2RiwgMHg5RTJDLCAweDlFNzQsIDB4OUU2NiwgMHg5RTczLCAweDlFNDIsIDB4OUUzRSwKKyAgICAweDUzNjQsIDB4OUU3RSwgMHg3ODc3LCAweDc2RDAsIDB4NEUzRCwgMHg5RUE2LCAweDlFQjgsIDB4OUVCOSwgMHg5NzYyLAorICAgIDB4NEU0OCwgMHg5RUM0LCAweDlFQzksIDB4NzBCOSwgMHg1MTVBLCAweDk3MDksIDB4OUVFMSwgMHg5RUU5LCAweDlFRkUsCisgICAgMHg5RjBCLCAweDlGMEQsIDB4OUYzOSwgMHg5RjUwLCAweDY1OEIsIDB4OEQ0RCwgMHg5RjUxLCAweDlGN0YsIDB4OUY4MCwKKyAgICAweDlGODEsIDB4OUY4NSwgMHg5Rjg3LCAweDlGODMsIDB4OUY4NiwgMHg5Rjg0LCAweDlGODgsIDB4OUY4QSwgMHg5Rjg5LAorICAgIDB4OUY4QiwgMHg5RjhDLCAweDlGOTksIDB4NTM5MCwgMHg1RTlFLCAweDlGOUEsIDB4OUY5QiwgMHg5RjlGLCAweEE3NkYsCisgICAgMHg4QzQ4LCAweDY2RjQsIDB4OEVDQSwgMHg4Q0M4LCAweDZFRDEsIDB4NEUzMiwgMHg1M0U1LCAweDlGOUMsIDB4OUY5QywKKyAgICAweDU5NTEsIDB4OTFEMSwgMHg1NTg3LCAweDU5NDgsIDB4NjFGNiwgMHg3NjY5LCAweDdGODUsIDB4ODYzRiwgMHg4N0JBLAorICAgIDB4ODhGOCwgMHg5MDhGLCAweDZBMDIsIDB4NkQxQiwgMHg3MEQ5LCAweDczREUsIDB4ODQzRCwgMHg5MTZBLCAweDk5RjEsCisgICAgMHg0RTgyLCAweDUzNzUsIDB4NkIwNCwgMHg3MjFCLCAweDg2MkQsIDB4OUUxRSwgMHg1RDUwLCAweDZGRUIsIDB4ODVDRCwKKyAgICAweDg5NjQsIDB4NjJDOSwgMHg4MUQ4LCAweDg4MUYsIDB4NUVDQSwgMHg2NzE3LCAweDZENkEsIDB4NzJGQywgMHg5MENFLAorICAgIDB4NEY4NiwgMHg1MUI3LCAweDUyREUsIDB4NjRDNCwgMHg2QUQzLCAweDcyMTAsIDB4NzZFNywgMHg4MDAxLCAweDg2MDYsCisgICAgMHg4NjVDLCAweDhERUYsIDB4OTczMiwgMHg5QjZGLCAweDlERkEsIDB4Nzg4QywgMHg3OTdGLCAweDdEQTAsIDB4ODNDOSwKKyAgICAweDkzMDQsIDB4OUU3RiwgMHg4QUQ2LCAweDU4REYsIDB4NUYwNCwgMHg3QzYwLCAweDgwN0UsIDB4NzI2MiwgMHg3OENBLAorICAgIDB4OENDMiwgMHg5NkY3LCAweDU4RDgsIDB4NUM2MiwgMHg2QTEzLCAweDZEREEsIDB4NkYwRiwgMHg3RDJGLCAweDdFMzcsCisgICAgMHg5NjRCLCAweDUyRDIsIDB4ODA4QiwgMHg1MURDLCAweDUxQ0MsIDB4N0ExQywgMHg3REJFLCAweDgzRjEsIDB4OTY3NSwKKyAgICAweDhCODAsIDB4NjJDRiwgMHg2QTAyLCAweDhBRkUsIDB4NEUzOSwgMHg1QkU3LCAweDYwMTIsIDB4NzM4NywgMHg3NTcwLAorICAgIDB4NTMxNywgMHg3OEZCLCAweDRGQkYsIDB4NUZBOSwgMHg0RTBELCAweDZDQ0MsIDB4NjU3OCwgMHg3RDIyLCAweDUzQzMsCisgICAgMHg1ODVFLCAweDc3MDEsIDB4ODQ0OSwgMHg4QUFBLCAweDZCQkEsIDB4OEZCMCwgMHg2Qzg4LCAweDYyRkUsIDB4ODJFNSwKKyAgICAweDYzQTAsIDB4NzU2NSwgMHg0RUFFLCAweDUxNjksIDB4NTFDOSwgMHg2ODgxLCAweDdDRTcsIDB4ODI2RiwgMHg4QUQyLAorICAgIDB4OTFDRiwgMHg1MkY1LCAweDU0NDIsIDB4NTk3MywgMHg1RUVDLCAweDY1QzUsIDB4NkZGRSwgMHg3OTJBLCAweDk1QUQsCisgICAgMHg5QTZBLCAweDlFOTcsIDB4OUVDRSwgMHg1MjlCLCAweDY2QzYsIDB4NkI3NywgMHg4RjYyLCAweDVFNzQsIDB4NjE5MCwKKyAgICAweDYyMDAsIDB4NjQ5QSwgMHg2RjIzLCAweDcxNDksIDB4NzQ4OSwgMHg3OUNBLCAweDdERjQsIDB4ODA2RiwgMHg4RjI2LAorICAgIDB4ODRFRSwgMHg5MDIzLCAweDkzNEEsIDB4NTIxNywgMHg1MkEzLCAweDU0QkQsIDB4NzBDOCwgMHg4OEMyLCAweDhBQUEsCisgICAgMHg1RUM5LCAweDVGRjUsIDB4NjM3QiwgMHg2QkFFLCAweDdDM0UsIDB4NzM3NSwgMHg0RUU0LCAweDU2RjksIDB4NUJFNywKKyAgICAweDVEQkEsIDB4NjAxQywgMHg3M0IyLCAweDc0NjksIDB4N0Y5QSwgMHg4MDQ2LCAweDkyMzQsIDB4OTZGNiwgMHg5NzQ4LAorICAgIDB4OTgxOCwgMHg0RjhCLCAweDc5QUUsIDB4OTFCNCwgMHg5NkI4LCAweDYwRTEsIDB4NEU4NiwgMHg1MERBLCAweDVCRUUsCisgICAgMHg1QzNGLCAweDY1OTksIDB4NkEwMiwgMHg3MUNFLCAweDc2NDIsIDB4ODRGQywgMHg5MDdDLCAweDlGOEQsIDB4NjY4OCwKKyAgICAweDk2MkUsIDB4NTI4OSwgMHg2NzdCLCAweDY3RjMsIDB4NkQ0MSwgMHg2RTlDLCAweDc0MDksIDB4NzU1OSwgMHg3ODZCLAorICAgIDB4N0QxMCwgMHg5ODVFLCAweDUxNkQsIDB4NjIyRSwgMHg5Njc4LCAweDUwMkIsIDB4NUQxOSwgMHg2REVBLCAweDhGMkEsCisgICAgMHg1RjhCLCAweDYxNDQsIDB4NjgxNywgMHg3Mzg3LCAweDk2ODYsIDB4NTIyOSwgMHg1NDBGLCAweDVDNjUsIDB4NjYxMywKKyAgICAweDY3NEUsIDB4NjhBOCwgMHg2Q0U1LCAweDc0MDYsIDB4NzVFMiwgMHg3Rjc5LCAweDg4Q0YsIDB4ODhFMSwgMHg5MUNDLAorICAgIDB4OTZFMiwgMHg1MzNGLCAweDZFQkEsIDB4NTQxRCwgMHg3MUQwLCAweDc0OTgsIDB4ODVGQSwgMHg5NkEzLCAweDlDNTcsCisgICAgMHg5RTlGLCAweDY3OTcsIDB4NkRDQiwgMHg4MUU4LCAweDdBQ0IsIDB4N0IyMCwgMHg3QzkyLCAweDcyQzAsIDB4NzA5OSwKKyAgICAweDhCNTgsIDB4NEVDMCwgMHg4MzM2LCAweDUyM0EsIDB4NTIwNywgMHg1RUE2LCAweDYyRDMsIDB4N0NENiwgMHg1Qjg1LAorICAgIDB4NkQxRSwgMHg2NkI0LCAweDhGM0IsIDB4ODg0QywgMHg5NjRELCAweDg5OEIsIDB4NUVEMywgMHg1MTQwLCAweDU1QzAsCisgICAgMHg1ODVBLCAweDY2NzQsIDB4NTFERSwgMHg3MzJBLCAweDc2Q0EsIDB4NzkzQywgMHg3OTVFLCAweDc5NjUsIDB4Nzk4RiwKKyAgICAweDk3NTYsIDB4N0NCRSwgMHg3RkJELCAweDg2MTIsIDB4OEFGOCwgMHg5MDM4LCAweDkwRkQsIDB4OThFRiwgMHg5OEZDLAorICAgIDB4OTkyOCwgMHg5REI0LCAweDRGQUUsIDB4NTBFNywgMHg1MTRELCAweDUyQzksIDB4NTJFNCwgMHg1MzUxLCAweDU1OUQsCisgICAgMHg1NjA2LCAweDU2NjgsIDB4NTg0MCwgMHg1OEE4LCAweDVDNjQsIDB4NUM2RSwgMHg2MDk0LCAweDYxNjgsIDB4NjE4RSwKKyAgICAweDYxRjIsIDB4NjU0RiwgMHg2NUUyLCAweDY2OTEsIDB4Njg4NSwgMHg2RDc3LCAweDZFMUEsIDB4NkYyMiwgMHg3MTZFLAorICAgIDB4NzIyQiwgMHg3NDIyLCAweDc4OTEsIDB4NzkzRSwgMHg3OTQ5LCAweDc5NDgsIDB4Nzk1MCwgMHg3OTU2LCAweDc5NUQsCisgICAgMHg3OThELCAweDc5OEUsIDB4N0E0MCwgMHg3QTgxLCAweDdCQzAsIDB4N0RGNCwgMHg3RTA5LCAweDdFNDEsIDB4N0Y3MiwKKyAgICAweDgwMDUsIDB4ODFFRCwgMHg4Mjc5LCAweDgyNzksIDB4ODQ1NywgMHg4OTEwLCAweDg5OTYsIDB4OEIwMSwgMHg4QjM5LAorICAgIDB4OENEMywgMHg4RDA4LCAweDhGQjYsIDB4OTAzOCwgMHg5NkUzLCAweDk3RkYsIDB4OTgzQiwgMHg2MDc1LCAweDgyMTgsCisgICAgMHg0RTI2LCAweDUxQjUsIDB4NTE2OCwgMHg0RjgwLCAweDUxNDUsIDB4NTE4MCwgMHg1MkM3LCAweDUyRkEsIDB4NTU5RCwKKyAgICAweDU1NTUsIDB4NTU5OSwgMHg1NUUyLCAweDU4NUEsIDB4NThCMywgMHg1OTQ0LCAweDU5NTQsIDB4NUE2MiwgMHg1QjI4LAorICAgIDB4NUVEMiwgMHg1RUQ5LCAweDVGNjksIDB4NUZBRCwgMHg2MEQ4LCAweDYxNEUsIDB4NjEwOCwgMHg2MThFLCAweDYxNjAsCisgICAgMHg2MUYyLCAweDYyMzQsIDB4NjNDNCwgMHg2NDFDLCAweDY0NTIsIDB4NjU1NiwgMHg2Njc0LCAweDY3MTcsIDB4NjcxQiwKKyAgICAweDY3NTYsIDB4NkI3OSwgMHg2QkJBLCAweDZENDEsIDB4NkVEQiwgMHg2RUNCLCAweDZGMjIsIDB4NzAxRSwgMHg3MTZFLAorICAgIDB4NzdBNywgMHg3MjM1LCAweDcyQUYsIDB4NzMyQSwgMHg3NDcxLCAweDc1MDYsIDB4NzUzQiwgMHg3NjFELCAweDc2MUYsCisgICAgMHg3NkNBLCAweDc2REIsIDB4NzZGNCwgMHg3NzRBLCAweDc3NDAsIDB4NzhDQywgMHg3QUIxLCAweDdCQzAsIDB4N0M3QiwKKyAgICAweDdENUIsIDB4N0RGNCwgMHg3RjNFLCAweDgwMDUsIDB4ODM1MiwgMHg4M0VGLCAweDg3NzksIDB4ODk0MSwgMHg4OTg2LAorICAgIDB4ODk5NiwgMHg4QUJGLCAweDhBRjgsIDB4OEFDQiwgMHg4QjAxLCAweDhBRkUsIDB4OEFFRCwgMHg4QjM5LCAweDhCOEEsCisgICAgMHg4RDA4LCAweDhGMzgsIDB4OTA3MiwgMHg5MTk5LCAweDkyNzYsIDB4OTY3QywgMHg5NkUzLCAweDk3NTYsIDB4OTdEQiwKKyAgICAweDk3RkYsIDB4OTgwQiwgMHg5ODNCLCAweDlCMTIsIDB4OUY5QywgMHgzQjlELCAweDQwMTgsIDB4NDAzOSwgMHg5RjQzLAorICAgIDB4OUY4RSwgMHgwNUUyLCAweDA1RDAsIDB4MDVEMywgMHgwNUQ0LCAweDA1REIsIDB4MDVEQywgMHgwNURELCAweDA1RTgsCisgICAgMHgwNUVBLCAweDAwMkIsIDB4MDY3MSwgMHgwNjcxLCAweDA2N0IsIDB4MDY3QiwgMHgwNjdCLCAweDA2N0IsIDB4MDY3RSwKKyAgICAweDA2N0UsIDB4MDY3RSwgMHgwNjdFLCAweDA2ODAsIDB4MDY4MCwgMHgwNjgwLCAweDA2ODAsIDB4MDY3QSwgMHgwNjdBLAorICAgIDB4MDY3QSwgMHgwNjdBLCAweDA2N0YsIDB4MDY3RiwgMHgwNjdGLCAweDA2N0YsIDB4MDY3OSwgMHgwNjc5LCAweDA2NzksCisgICAgMHgwNjc5LCAweDA2QTQsIDB4MDZBNCwgMHgwNkE0LCAweDA2QTQsIDB4MDZBNiwgMHgwNkE2LCAweDA2QTYsIDB4MDZBNiwKKyAgICAweDA2ODQsIDB4MDY4NCwgMHgwNjg0LCAweDA2ODQsIDB4MDY4MywgMHgwNjgzLCAweDA2ODMsIDB4MDY4MywgMHgwNjg2LAorICAgIDB4MDY4NiwgMHgwNjg2LCAweDA2ODYsIDB4MDY4NywgMHgwNjg3LCAweDA2ODcsIDB4MDY4NywgMHgwNjhELCAweDA2OEQsCisgICAgMHgwNjhDLCAweDA2OEMsIDB4MDY4RSwgMHgwNjhFLCAweDA2ODgsIDB4MDY4OCwgMHgwNjk4LCAweDA2OTgsIDB4MDY5MSwKKyAgICAweDA2OTEsIDB4MDZBOSwgMHgwNkE5LCAweDA2QTksIDB4MDZBOSwgMHgwNkFGLCAweDA2QUYsIDB4MDZBRiwgMHgwNkFGLAorICAgIDB4MDZCMywgMHgwNkIzLCAweDA2QjMsIDB4MDZCMywgMHgwNkIxLCAweDA2QjEsIDB4MDZCMSwgMHgwNkIxLCAweDA2QkEsCisgICAgMHgwNkJBLCAweDA2QkIsIDB4MDZCQiwgMHgwNkJCLCAweDA2QkIsIDB4MDZDMCwgMHgwNkMwLCAweDA2QzEsIDB4MDZDMSwKKyAgICAweDA2QzEsIDB4MDZDMSwgMHgwNkJFLCAweDA2QkUsIDB4MDZCRSwgMHgwNkJFLCAweDA2RDIsIDB4MDZEMiwgMHgwNkQzLAorICAgIDB4MDZEMywgMHgwNkFELCAweDA2QUQsIDB4MDZBRCwgMHgwNkFELCAweDA2QzcsIDB4MDZDNywgMHgwNkM2LCAweDA2QzYsCisgICAgMHgwNkM4LCAweDA2QzgsIDB4MDY3NywgMHgwNkNCLCAweDA2Q0IsIDB4MDZDNSwgMHgwNkM1LCAweDA2QzksIDB4MDZDOSwKKyAgICAweDA2RDAsIDB4MDZEMCwgMHgwNkQwLCAweDA2RDAsIDB4MDY0OSwgMHgwNjQ5LCAweDA2Q0MsIDB4MDZDQywgMHgwNkNDLAorICAgIDB4MDZDQywgMHgwMDJDLCAweDMwMDEsIDB4MzAwMiwgMHgwMDNBLCAweDAwM0IsIDB4MDAyMSwgMHgwMDNGLCAweDMwMTYsCisgICAgMHgzMDE3LCAweDIwMjYsIDB4MjAyNSwgMHgyMDE0LCAweDIwMTMsIDB4MDA1RiwgMHgwMDVGLCAweDAwMjgsIDB4MDAyOSwKKyAgICAweDAwN0IsIDB4MDA3RCwgMHgzMDE0LCAweDMwMTUsIDB4MzAxMCwgMHgzMDExLCAweDMwMEEsIDB4MzAwQiwgMHgzMDA4LAorICAgIDB4MzAwOSwgMHgzMDBDLCAweDMwMEQsIDB4MzAwRSwgMHgzMDBGLCAweDAwNUIsIDB4MDA1RCwgMHgyMDNFLCAweDIwM0UsCisgICAgMHgyMDNFLCAweDIwM0UsIDB4MDA1RiwgMHgwMDVGLCAweDAwNUYsIDB4MDAyQywgMHgzMDAxLCAweDAwMkUsIDB4MDAzQiwKKyAgICAweDAwM0EsIDB4MDAzRiwgMHgwMDIxLCAweDIwMTQsIDB4MDAyOCwgMHgwMDI5LCAweDAwN0IsIDB4MDA3RCwgMHgzMDE0LAorICAgIDB4MzAxNSwgMHgwMDIzLCAweDAwMjYsIDB4MDAyQSwgMHgwMDJCLCAweDAwMkQsIDB4MDAzQywgMHgwMDNFLCAweDAwM0QsCisgICAgMHgwMDVDLCAweDAwMjQsIDB4MDAyNSwgMHgwMDQwLCAweDA2NEIsIDB4MDY0QywgMHgwNjRELCAweDA2NEUsIDB4MDY0RiwKKyAgICAweDA2NTAsIDB4MDY1MSwgMHgwNjUyLCAweDA2MjEsIDB4MDYyMiwgMHgwNjIyLCAweDA2MjMsIDB4MDYyMywgMHgwNjI0LAorICAgIDB4MDYyNCwgMHgwNjI1LCAweDA2MjUsIDB4MDYyNiwgMHgwNjI2LCAweDA2MjYsIDB4MDYyNiwgMHgwNjI3LCAweDA2MjcsCisgICAgMHgwNjI4LCAweDA2MjgsIDB4MDYyOCwgMHgwNjI4LCAweDA2MjksIDB4MDYyOSwgMHgwNjJBLCAweDA2MkEsIDB4MDYyQSwKKyAgICAweDA2MkEsIDB4MDYyQiwgMHgwNjJCLCAweDA2MkIsIDB4MDYyQiwgMHgwNjJDLCAweDA2MkMsIDB4MDYyQywgMHgwNjJDLAorICAgIDB4MDYyRCwgMHgwNjJELCAweDA2MkQsIDB4MDYyRCwgMHgwNjJFLCAweDA2MkUsIDB4MDYyRSwgMHgwNjJFLCAweDA2MkYsCisgICAgMHgwNjJGLCAweDA2MzAsIDB4MDYzMCwgMHgwNjMxLCAweDA2MzEsIDB4MDYzMiwgMHgwNjMyLCAweDA2MzMsIDB4MDYzMywKKyAgICAweDA2MzMsIDB4MDYzMywgMHgwNjM0LCAweDA2MzQsIDB4MDYzNCwgMHgwNjM0LCAweDA2MzUsIDB4MDYzNSwgMHgwNjM1LAorICAgIDB4MDYzNSwgMHgwNjM2LCAweDA2MzYsIDB4MDYzNiwgMHgwNjM2LCAweDA2MzcsIDB4MDYzNywgMHgwNjM3LCAweDA2MzcsCisgICAgMHgwNjM4LCAweDA2MzgsIDB4MDYzOCwgMHgwNjM4LCAweDA2MzksIDB4MDYzOSwgMHgwNjM5LCAweDA2MzksIDB4MDYzQSwKKyAgICAweDA2M0EsIDB4MDYzQSwgMHgwNjNBLCAweDA2NDEsIDB4MDY0MSwgMHgwNjQxLCAweDA2NDEsIDB4MDY0MiwgMHgwNjQyLAorICAgIDB4MDY0MiwgMHgwNjQyLCAweDA2NDMsIDB4MDY0MywgMHgwNjQzLCAweDA2NDMsIDB4MDY0NCwgMHgwNjQ0LCAweDA2NDQsCisgICAgMHgwNjQ0LCAweDA2NDUsIDB4MDY0NSwgMHgwNjQ1LCAweDA2NDUsIDB4MDY0NiwgMHgwNjQ2LCAweDA2NDYsIDB4MDY0NiwKKyAgICAweDA2NDcsIDB4MDY0NywgMHgwNjQ3LCAweDA2NDcsIDB4MDY0OCwgMHgwNjQ4LCAweDA2NDksIDB4MDY0OSwgMHgwNjRBLAorICAgIDB4MDY0QSwgMHgwNjRBLCAweDA2NEEsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIDB4MDAyNCwgMHgwMDI1LCAweDAwMjYsCisgICAgMHgwMDI3LCAweDAwMjgsIDB4MDAyOSwgMHgwMDJBLCAweDAwMkIsIDB4MDAyQywgMHgwMDJELCAweDAwMkUsIDB4MDAyRiwKKyAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgMHgwMDM4LAorICAgIDB4MDAzOSwgMHgwMDNBLCAweDAwM0IsIDB4MDAzQywgMHgwMDNELCAweDAwM0UsIDB4MDAzRiwgMHgwMDQwLCAweDAwNDEsCisgICAgMHgwMDQyLCAweDAwNDMsIDB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgMHgwMDQ4LCAweDAwNDksIDB4MDA0QSwKKyAgICAweDAwNEIsIDB4MDA0QywgMHgwMDRELCAweDAwNEUsIDB4MDA0RiwgMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAorICAgIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgMHgwMDU4LCAweDAwNTksIDB4MDA1QSwgMHgwMDVCLCAweDAwNUMsCisgICAgMHgwMDVELCAweDAwNUUsIDB4MDA1RiwgMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwKKyAgICAweDAwNjYsIDB4MDA2NywgMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLAorICAgIDB4MDA2RiwgMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisgICAgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDdCLCAweDAwN0MsIDB4MDA3RCwgMHgwMDdFLCAweDI5ODUsIDB4Mjk4NiwKKyAgICAweDMwMDIsIDB4MzAwQywgMHgzMDBELCAweDMwMDEsIDB4MzBGQiwgMHgzMEYyLCAweDMwQTEsIDB4MzBBMywgMHgzMEE1LAorICAgIDB4MzBBNywgMHgzMEE5LCAweDMwRTMsIDB4MzBFNSwgMHgzMEU3LCAweDMwQzMsIDB4MzBGQywgMHgzMEEyLCAweDMwQTQsCisgICAgMHgzMEE2LCAweDMwQTgsIDB4MzBBQSwgMHgzMEFCLCAweDMwQUQsIDB4MzBBRiwgMHgzMEIxLCAweDMwQjMsIDB4MzBCNSwKKyAgICAweDMwQjcsIDB4MzBCOSwgMHgzMEJCLCAweDMwQkQsIDB4MzBCRiwgMHgzMEMxLCAweDMwQzQsIDB4MzBDNiwgMHgzMEM4LAorICAgIDB4MzBDQSwgMHgzMENCLCAweDMwQ0MsIDB4MzBDRCwgMHgzMENFLCAweDMwQ0YsIDB4MzBEMiwgMHgzMEQ1LCAweDMwRDgsCisgICAgMHgzMERCLCAweDMwREUsIDB4MzBERiwgMHgzMEUwLCAweDMwRTEsIDB4MzBFMiwgMHgzMEU0LCAweDMwRTYsIDB4MzBFOCwKKyAgICAweDMwRTksIDB4MzBFQSwgMHgzMEVCLCAweDMwRUMsIDB4MzBFRCwgMHgzMEVGLCAweDMwRjMsIDB4MzA5OSwgMHgzMDlBLAorICAgIDB4MzE2NCwgMHgzMTMxLCAweDMxMzIsIDB4MzEzMywgMHgzMTM0LCAweDMxMzUsIDB4MzEzNiwgMHgzMTM3LCAweDMxMzgsCisgICAgMHgzMTM5LCAweDMxM0EsIDB4MzEzQiwgMHgzMTNDLCAweDMxM0QsIDB4MzEzRSwgMHgzMTNGLCAweDMxNDAsIDB4MzE0MSwKKyAgICAweDMxNDIsIDB4MzE0MywgMHgzMTQ0LCAweDMxNDUsIDB4MzE0NiwgMHgzMTQ3LCAweDMxNDgsIDB4MzE0OSwgMHgzMTRBLAorICAgIDB4MzE0QiwgMHgzMTRDLCAweDMxNEQsIDB4MzE0RSwgMHgzMTRGLCAweDMxNTAsIDB4MzE1MSwgMHgzMTUyLCAweDMxNTMsCisgICAgMHgzMTU0LCAweDMxNTUsIDB4MzE1NiwgMHgzMTU3LCAweDMxNTgsIDB4MzE1OSwgMHgzMTVBLCAweDMxNUIsIDB4MzE1QywKKyAgICAweDMxNUQsIDB4MzE1RSwgMHgzMTVGLCAweDMxNjAsIDB4MzE2MSwgMHgzMTYyLCAweDMxNjMsIDB4MDBBMiwgMHgwMEEzLAorICAgIDB4MDBBQywgMHgwMEFGLCAweDAwQTYsIDB4MDBBNSwgMHgyMEE5LCAweDI1MDIsIDB4MjE5MCwgMHgyMTkxLCAweDIxOTIsCisgICAgMHgyMTkzLCAweDI1QTAsIDB4MjVDQn07CisKK2NvbnN0IEZYX1dDSEFSIGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvbl9NYXAyWzE3MjRdID0geworICAgIDB4MDA0RiwgMHgwMDQ1LCAweDAwNTQsIDB4MDA0RCwgMHgwMDZGLCAweDAwNjUsIDB4MDA0OSwgMHgwMDRBLCAweDAwNjksCisgICAgMHgwMDZBLCAweDAwNEYsIDB4MDA0NSwgMHgwMDZGLCAweDAwNjUsIDB4MDA0NCwgMHgwMTdELCAweDAwNDQsIDB4MDE3RSwKKyAgICAweDAwNjQsIDB4MDE3RSwgMHgwMDRDLCAweDAwNEEsIDB4MDA0QywgMHgwMDZBLCAweDAwNkMsIDB4MDA2QSwgMHgwMDRFLAorICAgIDB4MDA0QSwgMHgwMDRFLCAweDAwNkEsIDB4MDA2RSwgMHgwMDZBLCAweDAwNDQsIDB4MDA1QSwgMHgwMDQ0LCAweDAwN0EsCisgICAgMHgwMDY0LCAweDAwN0EsIDB4MDA2NCwgMHgwMDYyLCAweDAwNzEsIDB4MDA3MCwgMHgwMDRGLCAweDAwNDUsIDB4MDA2NCwKKyAgICAweDAwN0EsIDB4MDA2NCwgMHgwMjkyLCAweDAwNjQsIDB4MDA3QSwgMHgwMDc0LCAweDAwNzMsIDB4MDA3NCwgMHgwMjgzLAorICAgIDB4MDA3NCwgMHgwMDYzLCAweDAwNjYsIDB4MDE0QiwgMHgwMDZDLCAweDAwNzMsIDB4MDA2QywgMHgwMDdBLCAweDA0MUQsCisgICAgMHgwNDEzLCAweDA0M0QsIDB4MDQzMywgMHgwNDIyLCAweDA0MjYsIDB4MDQ0MiwgMHgwNDQ2LCAweDA0MTAsIDB4MDQxNSwKKyAgICAweDA0MzAsIDB4MDQzNSwgMHgwNTY1LCAweDA1ODIsIDB4MDYyNywgMHgwNjc0LCAweDA2NDgsIDB4MDY3NCwgMHgwNkM3LAorICAgIDB4MDY3NCwgMHgwNjRBLCAweDA2NzQsIDB4MDZENSwgMHgwNjU0LCAweDA2QzEsIDB4MDY1NCwgMHgwNkQyLCAweDA2NTQsCisgICAgMHgwOTI4LCAweDA5M0MsIDB4MDkzMCwgMHgwOTNDLCAweDA5MzMsIDB4MDkzQywgMHgwOTE1LCAweDA5M0MsIDB4MDkxNiwKKyAgICAweDA5M0MsIDB4MDkxNywgMHgwOTNDLCAweDA5MUMsIDB4MDkzQywgMHgwOTIxLCAweDA5M0MsIDB4MDkyMiwgMHgwOTNDLAorICAgIDB4MDkyQiwgMHgwOTNDLCAweDA5MkYsIDB4MDkzQywgMHgwOUM3LCAweDA5QkUsIDB4MDlDNywgMHgwOUQ3LCAweDA5QTEsCisgICAgMHgwOUJDLCAweDA5QTIsIDB4MDlCQywgMHgwOUFGLCAweDA5QkMsIDB4MEEzMiwgMHgwQTNDLCAweDBBMzgsIDB4MEEzQywKKyAgICAweDBBMTYsIDB4MEEzQywgMHgwQTE3LCAweDBBM0MsIDB4MEExQywgMHgwQTNDLCAweDBBMkIsIDB4MEEzQywgMHgwQjQ3LAorICAgIDB4MEI1NiwgMHgwQjQ3LCAweDBCM0UsIDB4MEI0NywgMHgwQjU3LCAweDBCMjEsIDB4MEIzQywgMHgwQjIyLCAweDBCM0MsCisgICAgMHgwQjkyLCAweDBCRDcsIDB4MEJDNiwgMHgwQkJFLCAweDBCQzcsIDB4MEJCRSwgMHgwQkM2LCAweDBCRDcsIDB4MEM0NiwKKyAgICAweDBDNTYsIDB4MENCRiwgMHgwQ0Q1LCAweDBDQzYsIDB4MENENSwgMHgwQ0M2LCAweDBDRDYsIDB4MENDNiwgMHgwQ0MyLAorICAgIDB4MENDQSwgMHgwQ0Q1LCAweDBENDYsIDB4MEQzRSwgMHgwRDQ3LCAweDBEM0UsIDB4MEQ0NiwgMHgwRDU3LCAweDBERDksCisgICAgMHgwRENBLCAweDBERDksIDB4MERDRiwgMHgwRERDLCAweDBEQ0EsIDB4MEREOSwgMHgwRERGLCAweDBFNEQsIDB4MEUzMiwKKyAgICAweDBFQ0QsIDB4MEVCMiwgMHgwRUFCLCAweDBFOTksIDB4MEVBQiwgMHgwRUExLCAweDBGNDIsIDB4MEZCNywgMHgwRjRDLAorICAgIDB4MEZCNywgMHgwRjUxLCAweDBGQjcsIDB4MEY1NiwgMHgwRkI3LCAweDBGNUIsIDB4MEZCNywgMHgwRjQwLCAweDBGQjUsCisgICAgMHgwRjcxLCAweDBGNzIsIDB4MEY3MSwgMHgwRjc0LCAweDBGQjIsIDB4MEY4MCwgMHgwRkIyLCAweDBGODEsIDB4MEZCMywKKyAgICAweDBGODAsIDB4MEZCMywgMHgwRjgxLCAweDBGNzEsIDB4MEY4MCwgMHgwRjkyLCAweDBGQjcsIDB4MEY5QywgMHgwRkI3LAorICAgIDB4MEZBMSwgMHgwRkI3LCAweDBGQTYsIDB4MEZCNywgMHgwRkFCLCAweDBGQjcsIDB4MEY5MCwgMHgwRkI1LCAweDEwMjUsCisgICAgMHgxMDJFLCAweDFCMDUsIDB4MUIzNSwgMHgxQjA3LCAweDFCMzUsIDB4MUIwOSwgMHgxQjM1LCAweDFCMEIsIDB4MUIzNSwKKyAgICAweDFCMEQsIDB4MUIzNSwgMHgxQjExLCAweDFCMzUsIDB4MUIzQSwgMHgxQjM1LCAweDFCM0MsIDB4MUIzNSwgMHgxQjNFLAorICAgIDB4MUIzNSwgMHgxQjNGLCAweDFCMzUsIDB4MUI0MiwgMHgxQjM1LCAweDAwNzQsIDB4MDA2OCwgMHgwMDJFLCAweDAwMkUsCisgICAgMHgyMDMyLCAweDIwMzIsIDB4MjAzNSwgMHgyMDM1LCAweDAwMjEsIDB4MDAyMSwgMHgwMDIwLCAweDAzMDUsIDB4MDAzRiwKKyAgICAweDAwM0YsIDB4MDAzRiwgMHgwMDIxLCAweDAwMjEsIDB4MDAzRiwgMHgwMDUyLCAweDAwNzMsIDB4MDBCMCwgMHgwMDQzLAorICAgIDB4MDBCMCwgMHgwMDQ2LCAweDAwNEUsIDB4MDA2RiwgMHgwMDUzLCAweDAwNEQsIDB4MDA1NCwgMHgwMDRELCAweDAwMzEsCisgICAgMHgwMDJGLCAweDAwNDksIDB4MDA0OSwgMHgwMDQ5LCAweDAwNTYsIDB4MDA1NiwgMHgwMDQ5LCAweDAwNDksIDB4MDA1OCwKKyAgICAweDAwNTgsIDB4MDA0OSwgMHgwMDY5LCAweDAwNjksIDB4MDA2OSwgMHgwMDc2LCAweDAwNzYsIDB4MDA2OSwgMHgwMDY5LAorICAgIDB4MDA3OCwgMHgwMDc4LCAweDAwNjksIDB4MjE5MCwgMHgwMzM4LCAweDIxOTIsIDB4MDMzOCwgMHgyMTk0LCAweDAzMzgsCisgICAgMHgyMUQwLCAweDAzMzgsIDB4MjFENCwgMHgwMzM4LCAweDIxRDIsIDB4MDMzOCwgMHgyMjIzLCAweDAzMzgsIDB4MjIyNSwKKyAgICAweDAzMzgsIDB4MjIyQiwgMHgyMjJCLCAweDIyMkUsIDB4MjIyRSwgMHgyMjNDLCAweDAzMzgsIDB4MjI0MywgMHgwMzM4LAorICAgIDB4MjI0NSwgMHgwMzM4LCAweDIyNDgsIDB4MDMzOCwgMHgwMDNELCAweDAwMkYsIDB4MjI2MSwgMHgwMDJGLCAweDIyNEQsCisgICAgMHgwMDJGLCAweDAwM0MsIDB4MDAyRiwgMHgwMDNFLCAweDAwMkYsIDB4MjI2NCwgMHgwMDJGLCAweDIyNjUsIDB4MDAyRiwKKyAgICAweDIyNzIsIDB4MDAyRiwgMHgyMjczLCAweDAwMkYsIDB4MjI3NiwgMHgwMDJGLCAweDIyNzcsIDB4MDAyRiwgMHgyMjdBLAorICAgIDB4MDAyRiwgMHgyMjdCLCAweDAwMkYsIDB4MjI4MiwgMHgwMDJGLCAweDIyODMsIDB4MDAyRiwgMHgyMjg2LCAweDAwMkYsCisgICAgMHgyMjg3LCAweDAwMkYsIDB4MjJBMiwgMHgwMDJGLCAweDIyQTgsIDB4MDAyRiwgMHgyMkE5LCAweDAwMkYsIDB4MjJBQiwKKyAgICAweDAwMkYsIDB4MjI3QywgMHgwMDJGLCAweDIyN0QsIDB4MDAyRiwgMHgyMjkxLCAweDAwMkYsIDB4MjI5MiwgMHgwMDJGLAorICAgIDB4MjJCMiwgMHgwMDJGLCAweDIyQjMsIDB4MDAyRiwgMHgyMkI0LCAweDAwMkYsIDB4MjJCNSwgMHgwMDJGLCAweDAwNDIsCisgICAgMHgwMDUzLCAweDAwNDgsIDB4MDA1NCwgMHgwMDRDLCAweDAwNDYsIDB4MDA1NiwgMHgwMDU0LCAweDAwNDYsIDB4MDA0NiwKKyAgICAweDAwNDMsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTMsIDB4MDA1MywgMHgwMDQ5LCAweDAwNDUsIDB4MDA0RCwgMHgwMDQ2LAorICAgIDB4MDA1MywgMHgwMDQ3LCAweDAwNTMsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTUsIDB4MDA1MywgMHgwMDUzLCAweDAwNTAsCisgICAgMHgwMDMxLCAweDAwMzAsIDB4MDAzMSwgMHgwMDMxLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMxLCAweDAwMzMsIDB4MDAzMSwKKyAgICAweDAwMzQsIDB4MDAzMSwgMHgwMDM1LCAweDAwMzEsIDB4MDAzNiwgMHgwMDMxLCAweDAwMzcsIDB4MDAzMSwgMHgwMDM4LAorICAgIDB4MDAzMSwgMHgwMDM5LCAweDAwMzIsIDB4MDAzMCwgMHgwMDMxLCAweDAwMkUsIDB4MDAzMiwgMHgwMDJFLCAweDAwMzMsCisgICAgMHgwMDJFLCAweDAwMzQsIDB4MDAyRSwgMHgwMDM1LCAweDAwMkUsIDB4MDAzNiwgMHgwMDJFLCAweDAwMzcsIDB4MDAyRSwKKyAgICAweDAwMzgsIDB4MDAyRSwgMHgwMDM5LCAweDAwMkUsIDB4MDAzMSwgMHgwMDMxLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMxLAorICAgIDB4MDAzMywgMHgwMDMxLCAweDAwMzQsIDB4MDAzMSwgMHgwMDM1LCAweDAwMzEsIDB4MDAzNiwgMHgwMDMxLCAweDAwMzcsCisgICAgMHgwMDMxLCAweDAwMzgsIDB4MDAzMSwgMHgwMDM5LCAweDAwMzIsIDB4MDAzMCwgMHgwMDMxLCAweDAwMzAsIDB4MDAzMSwKKyAgICAweDAwMzAsIDB4MDAzMSwgMHgwMDMwLCAweDAwMzEsIDB4MDAzMCwgMHgwMDNELCAweDAwM0QsIDB4MkFERCwgMHgwMDJGLAorICAgIDB4MzA0QiwgMHgzMDk5LCAweDMwNEQsIDB4MzA5OSwgMHgzMDRGLCAweDMwOTksIDB4MzA1MSwgMHgzMDk5LCAweDMwNTMsCisgICAgMHgzMDk5LCAweDMwNTUsIDB4MzA5OSwgMHgzMDU3LCAweDMwOTksIDB4MzA1OSwgMHgzMDk5LCAweDMwNUIsIDB4MzA5OSwKKyAgICAweDMwNUQsIDB4MzA5OSwgMHgzMDVGLCAweDMwOTksIDB4MzA2MSwgMHgzMDk5LCAweDMwNjQsIDB4MzA5OSwgMHgzMDY2LAorICAgIDB4MzA5OSwgMHgzMDY4LCAweDMwOTksIDB4MzA2RiwgMHgzMDk5LCAweDMwNkYsIDB4MzA5QSwgMHgzMDcyLCAweDMwOTksCisgICAgMHgzMDcyLCAweDMwOUEsIDB4MzA3NSwgMHgzMDk5LCAweDMwNzUsIDB4MzA5QSwgMHgzMDc4LCAweDMwOTksIDB4MzA3OCwKKyAgICAweDMwOUEsIDB4MzA3QiwgMHgzMDk5LCAweDMwN0IsIDB4MzA5QSwgMHgzMDQ2LCAweDMwOTksIDB4MDAyMCwgMHgzMDk5LAorICAgIDB4MDAyMCwgMHgzMDlBLCAweDMwOUQsIDB4MzA5OSwgMHgzMDg4LCAweDMwOEEsIDB4MzBBQiwgMHgzMDk5LCAweDMwQUQsCisgICAgMHgzMDk5LCAweDMwQUYsIDB4MzA5OSwgMHgzMEIxLCAweDMwOTksIDB4MzBCMywgMHgzMDk5LCAweDMwQjUsIDB4MzA5OSwKKyAgICAweDMwQjcsIDB4MzA5OSwgMHgzMEI5LCAweDMwOTksIDB4MzBCQiwgMHgzMDk5LCAweDMwQkQsIDB4MzA5OSwgMHgzMEJGLAorICAgIDB4MzA5OSwgMHgzMEMxLCAweDMwOTksIDB4MzBDNCwgMHgzMDk5LCAweDMwQzYsIDB4MzA5OSwgMHgzMEM4LCAweDMwOTksCisgICAgMHgzMENGLCAweDMwOTksIDB4MzBDRiwgMHgzMDlBLCAweDMwRDIsIDB4MzA5OSwgMHgzMEQyLCAweDMwOUEsIDB4MzBENSwKKyAgICAweDMwOTksIDB4MzBENSwgMHgzMDlBLCAweDMwRDgsIDB4MzA5OSwgMHgzMEQ4LCAweDMwOUEsIDB4MzBEQiwgMHgzMDk5LAorICAgIDB4MzBEQiwgMHgzMDlBLCAweDMwQTYsIDB4MzA5OSwgMHgzMEVGLCAweDMwOTksIDB4MzBGMCwgMHgzMDk5LCAweDMwRjEsCisgICAgMHgzMDk5LCAweDMwRjIsIDB4MzA5OSwgMHgzMEZELCAweDMwOTksIDB4MzBCMywgMHgzMEM4LCAweDAwMzIsIDB4MDAzMSwKKyAgICAweDAwMzIsIDB4MDAzMiwgMHgwMDMyLCAweDAwMzMsIDB4MDAzMiwgMHgwMDM0LCAweDAwMzIsIDB4MDAzNSwgMHgwMDMyLAorICAgIDB4MDAzNiwgMHgwMDMyLCAweDAwMzcsIDB4MDAzMiwgMHgwMDM4LCAweDAwMzIsIDB4MDAzOSwgMHgwMDMzLCAweDAwMzAsCisgICAgMHgwMDMzLCAweDAwMzEsIDB4MDAzMywgMHgwMDMyLCAweDAwMzMsIDB4MDAzMywgMHgwMDMzLCAweDAwMzQsIDB4MDAzMywKKyAgICAweDAwMzUsIDB4MTEwMCwgMHgxMTYxLCAweDExMDIsIDB4MTE2MSwgMHgxMTAzLCAweDExNjEsIDB4MTEwNSwgMHgxMTYxLAorICAgIDB4MTEwNiwgMHgxMTYxLCAweDExMDcsIDB4MTE2MSwgMHgxMTA5LCAweDExNjEsIDB4MTEwQiwgMHgxMTYxLCAweDExMEMsCisgICAgMHgxMTYxLCAweDExMEUsIDB4MTE2MSwgMHgxMTBGLCAweDExNjEsIDB4MTExMCwgMHgxMTYxLCAweDExMTEsIDB4MTE2MSwKKyAgICAweDExMTIsIDB4MTE2MSwgMHgxMTBCLCAweDExNkUsIDB4MDAzMywgMHgwMDM2LCAweDAwMzMsIDB4MDAzNywgMHgwMDMzLAorICAgIDB4MDAzOCwgMHgwMDMzLCAweDAwMzksIDB4MDAzNCwgMHgwMDMwLCAweDAwMzQsIDB4MDAzMSwgMHgwMDM0LCAweDAwMzIsCisgICAgMHgwMDM0LCAweDAwMzMsIDB4MDAzNCwgMHgwMDM0LCAweDAwMzQsIDB4MDAzNSwgMHgwMDM0LCAweDAwMzYsIDB4MDAzNCwKKyAgICAweDAwMzcsIDB4MDAzNCwgMHgwMDM4LCAweDAwMzQsIDB4MDAzOSwgMHgwMDM1LCAweDAwMzAsIDB4MDAzMSwgMHg2NzA4LAorICAgIDB4MDAzMiwgMHg2NzA4LCAweDAwMzMsIDB4NjcwOCwgMHgwMDM0LCAweDY3MDgsIDB4MDAzNSwgMHg2NzA4LCAweDAwMzYsCisgICAgMHg2NzA4LCAweDAwMzcsIDB4NjcwOCwgMHgwMDM4LCAweDY3MDgsIDB4MDAzOSwgMHg2NzA4LCAweDAwNDgsIDB4MDA2NywKKyAgICAweDAwNjUsIDB4MDA1NiwgMHgzMEFFLCAweDMwQUMsIDB4MzBBRCwgMHgzMEVELCAweDMwQzcsIDB4MzBCNywgMHgzMEM5LAorICAgIDB4MzBFQiwgMHgzMEM4LCAweDMwRjMsIDB4MzBDQSwgMHgzMENFLCAweDMwRDQsIDB4MzBCMywgMHgzMEQzLCAweDMwRUIsCisgICAgMHgzMERBLCAweDMwQkQsIDB4MzBEQiwgMHgzMEYzLCAweDMwREYsIDB4MzBFQSwgMHgzMEUxLCAweDMwQUMsIDB4MzBFQSwKKyAgICAweDMwRTksIDB4MzBFQywgMHgzMEUwLCAweDAwMzAsIDB4NzBCOSwgMHgwMDMxLCAweDcwQjksIDB4MDAzMiwgMHg3MEI5LAorICAgIDB4MDAzMywgMHg3MEI5LCAweDAwMzQsIDB4NzBCOSwgMHgwMDM1LCAweDcwQjksIDB4MDAzNiwgMHg3MEI5LCAweDAwMzcsCisgICAgMHg3MEI5LCAweDAwMzgsIDB4NzBCOSwgMHgwMDM5LCAweDcwQjksIDB4MDA2NCwgMHgwMDYxLCAweDAwNDEsIDB4MDA1NSwKKyAgICAweDAwNkYsIDB4MDA1NiwgMHgwMDcwLCAweDAwNjMsIDB4MDA2NCwgMHgwMDZELCAweDAwNDksIDB4MDA1NSwgMHg1RTczLAorICAgIDB4NjIxMCwgMHg2NjJELCAweDU0OEMsIDB4NTkyNywgMHg2QjYzLCAweDY2MEUsIDB4NkNCQiwgMHgwMDcwLCAweDAwNDEsCisgICAgMHgwMDZFLCAweDAwNDEsIDB4MDNCQywgMHgwMDQxLCAweDAwNkQsIDB4MDA0MSwgMHgwMDZCLCAweDAwNDEsIDB4MDA0QiwKKyAgICAweDAwNDIsIDB4MDA0RCwgMHgwMDQyLCAweDAwNDcsIDB4MDA0MiwgMHgwMDcwLCAweDAwNDYsIDB4MDA2RSwgMHgwMDQ2LAorICAgIDB4MDNCQywgMHgwMDQ2LCAweDAzQkMsIDB4MDA2NywgMHgwMDZELCAweDAwNjcsIDB4MDA2QiwgMHgwMDY3LCAweDAwNDgsCisgICAgMHgwMDdBLCAweDAzQkMsIDB4MjExMywgMHgwMDZELCAweDIxMTMsIDB4MDA2NCwgMHgyMTEzLCAweDAwNkIsIDB4MjExMywKKyAgICAweDAwNjYsIDB4MDA2RCwgMHgwMDZFLCAweDAwNkQsIDB4MDNCQywgMHgwMDZELCAweDAwNkQsIDB4MDA2RCwgMHgwMDYzLAorICAgIDB4MDA2RCwgMHgwMDZCLCAweDAwNkQsIDB4MDA2RCwgMHgwMEIyLCAweDAwNkQsIDB4MDBCMywgMHgwMDUwLCAweDAwNjEsCisgICAgMHgwMDcwLCAweDAwNzMsIDB4MDA2RSwgMHgwMDczLCAweDAzQkMsIDB4MDA3MywgMHgwMDZELCAweDAwNzMsIDB4MDA3MCwKKyAgICAweDAwNTYsIDB4MDA2RSwgMHgwMDU2LCAweDAzQkMsIDB4MDA1NiwgMHgwMDZELCAweDAwNTYsIDB4MDA2QiwgMHgwMDU2LAorICAgIDB4MDA0RCwgMHgwMDU2LCAweDAwNzAsIDB4MDA1NywgMHgwMDZFLCAweDAwNTcsIDB4MDNCQywgMHgwMDU3LCAweDAwNkQsCisgICAgMHgwMDU3LCAweDAwNkIsIDB4MDA1NywgMHgwMDRELCAweDAwNTcsIDB4MDA2QiwgMHgwM0E5LCAweDAwNEQsIDB4MDNBOSwKKyAgICAweDAwNDIsIDB4MDA3MSwgMHgwMDYzLCAweDAwNjMsIDB4MDA2MywgMHgwMDY0LCAweDAwNjQsIDB4MDA0MiwgMHgwMDQ3LAorICAgIDB4MDA3OSwgMHgwMDY4LCAweDAwNjEsIDB4MDA0OCwgMHgwMDUwLCAweDAwNjksIDB4MDA2RSwgMHgwMDRCLCAweDAwNEIsCisgICAgMHgwMDRCLCAweDAwNEQsIDB4MDA2QiwgMHgwMDc0LCAweDAwNkMsIDB4MDA2RCwgMHgwMDZDLCAweDAwNkUsIDB4MDA2QywKKyAgICAweDAwNzgsIDB4MDA2RCwgMHgwMDYyLCAweDAwNTAsIDB4MDA0OCwgMHgwMDUwLCAweDAwNTIsIDB4MDA3MywgMHgwMDcyLAorICAgIDB4MDA1MywgMHgwMDc2LCAweDAwNTcsIDB4MDA2MiwgMHgwMDMxLCAweDY1RTUsIDB4MDAzMiwgMHg2NUU1LCAweDAwMzMsCisgICAgMHg2NUU1LCAweDAwMzQsIDB4NjVFNSwgMHgwMDM1LCAweDY1RTUsIDB4MDAzNiwgMHg2NUU1LCAweDAwMzcsIDB4NjVFNSwKKyAgICAweDAwMzgsIDB4NjVFNSwgMHgwMDM5LCAweDY1RTUsIDB4MDA2NiwgMHgwMDY2LCAweDAwNjYsIDB4MDA2OSwgMHgwMDY2LAorICAgIDB4MDA2QywgMHgwMTdGLCAweDAwNzQsIDB4MDA3MywgMHgwMDc0LCAweDA1NzQsIDB4MDU3NiwgMHgwNTc0LCAweDA1NjUsCisgICAgMHgwNTc0LCAweDA1NkIsIDB4MDU3RSwgMHgwNTc2LCAweDA1NzQsIDB4MDU2RCwgMHgwNUQ5LCAweDA1QjQsIDB4MDVGMiwKKyAgICAweDA1QjcsIDB4MDVFOSwgMHgwNUMxLCAweDA1RTksIDB4MDVDMiwgMHhGQjQ5LCAweDA1QzEsIDB4RkI0OSwgMHgwNUMyLAorICAgIDB4MDVEMCwgMHgwNUI3LCAweDA1RDAsIDB4MDVCOCwgMHgwNUQwLCAweDA1QkMsIDB4MDVEMSwgMHgwNUJDLCAweDA1RDIsCisgICAgMHgwNUJDLCAweDA1RDMsIDB4MDVCQywgMHgwNUQ0LCAweDA1QkMsIDB4MDVENSwgMHgwNUJDLCAweDA1RDYsIDB4MDVCQywKKyAgICAweDA1RDgsIDB4MDVCQywgMHgwNUQ5LCAweDA1QkMsIDB4MDVEQSwgMHgwNUJDLCAweDA1REIsIDB4MDVCQywgMHgwNURDLAorICAgIDB4MDVCQywgMHgwNURFLCAweDA1QkMsIDB4MDVFMCwgMHgwNUJDLCAweDA1RTEsIDB4MDVCQywgMHgwNUUzLCAweDA1QkMsCisgICAgMHgwNUU0LCAweDA1QkMsIDB4MDVFNiwgMHgwNUJDLCAweDA1RTcsIDB4MDVCQywgMHgwNUU4LCAweDA1QkMsIDB4MDVFOSwKKyAgICAweDA1QkMsIDB4MDVFQSwgMHgwNUJDLCAweDA1RDUsIDB4MDVCOSwgMHgwNUQxLCAweDA1QkYsIDB4MDVEQiwgMHgwNUJGLAorICAgIDB4MDVFNCwgMHgwNUJGLCAweDA1RDAsIDB4MDVEQywgMHgwNjI2LCAweDA2MjcsIDB4MDYyNiwgMHgwNjI3LCAweDA2MjYsCisgICAgMHgwNkQ1LCAweDA2MjYsIDB4MDZENSwgMHgwNjI2LCAweDA2NDgsIDB4MDYyNiwgMHgwNjQ4LCAweDA2MjYsIDB4MDZDNywKKyAgICAweDA2MjYsIDB4MDZDNywgMHgwNjI2LCAweDA2QzYsIDB4MDYyNiwgMHgwNkM2LCAweDA2MjYsIDB4MDZDOCwgMHgwNjI2LAorICAgIDB4MDZDOCwgMHgwNjI2LCAweDA2RDAsIDB4MDYyNiwgMHgwNkQwLCAweDA2MjYsIDB4MDZEMCwgMHgwNjI2LCAweDA2NDksCisgICAgMHgwNjI2LCAweDA2NDksIDB4MDYyNiwgMHgwNjQ5LCAweDA2MjYsIDB4MDYyQywgMHgwNjI2LCAweDA2MkQsIDB4MDYyNiwKKyAgICAweDA2NDUsIDB4MDYyNiwgMHgwNjQ5LCAweDA2MjYsIDB4MDY0QSwgMHgwNjI4LCAweDA2MkMsIDB4MDYyOCwgMHgwNjJELAorICAgIDB4MDYyOCwgMHgwNjJFLCAweDA2MjgsIDB4MDY0NSwgMHgwNjI4LCAweDA2NDksIDB4MDYyOCwgMHgwNjRBLCAweDA2MkEsCisgICAgMHgwNjJDLCAweDA2MkEsIDB4MDYyRCwgMHgwNjJBLCAweDA2MkUsIDB4MDYyQSwgMHgwNjQ1LCAweDA2MkEsIDB4MDY0OSwKKyAgICAweDA2MkEsIDB4MDY0QSwgMHgwNjJCLCAweDA2MkMsIDB4MDYyQiwgMHgwNjQ1LCAweDA2MkIsIDB4MDY0OSwgMHgwNjJCLAorICAgIDB4MDY0QSwgMHgwNjJDLCAweDA2MkQsIDB4MDYyQywgMHgwNjQ1LCAweDA2MkQsIDB4MDYyQywgMHgwNjJELCAweDA2NDUsCisgICAgMHgwNjJFLCAweDA2MkMsIDB4MDYyRSwgMHgwNjJELCAweDA2MkUsIDB4MDY0NSwgMHgwNjMzLCAweDA2MkMsIDB4MDYzMywKKyAgICAweDA2MkQsIDB4MDYzMywgMHgwNjJFLCAweDA2MzMsIDB4MDY0NSwgMHgwNjM1LCAweDA2MkQsIDB4MDYzNSwgMHgwNjQ1LAorICAgIDB4MDYzNiwgMHgwNjJDLCAweDA2MzYsIDB4MDYyRCwgMHgwNjM2LCAweDA2MkUsIDB4MDYzNiwgMHgwNjQ1LCAweDA2MzcsCisgICAgMHgwNjJELCAweDA2MzcsIDB4MDY0NSwgMHgwNjM4LCAweDA2NDUsIDB4MDYzOSwgMHgwNjJDLCAweDA2MzksIDB4MDY0NSwKKyAgICAweDA2M0EsIDB4MDYyQywgMHgwNjNBLCAweDA2NDUsIDB4MDY0MSwgMHgwNjJDLCAweDA2NDEsIDB4MDYyRCwgMHgwNjQxLAorICAgIDB4MDYyRSwgMHgwNjQxLCAweDA2NDUsIDB4MDY0MSwgMHgwNjQ5LCAweDA2NDEsIDB4MDY0QSwgMHgwNjQyLCAweDA2MkQsCisgICAgMHgwNjQyLCAweDA2NDUsIDB4MDY0MiwgMHgwNjQ5LCAweDA2NDIsIDB4MDY0QSwgMHgwNjQzLCAweDA2MjcsIDB4MDY0MywKKyAgICAweDA2MkMsIDB4MDY0MywgMHgwNjJELCAweDA2NDMsIDB4MDYyRSwgMHgwNjQzLCAweDA2NDQsIDB4MDY0MywgMHgwNjQ1LAorICAgIDB4MDY0MywgMHgwNjQ5LCAweDA2NDMsIDB4MDY0QSwgMHgwNjQ0LCAweDA2MkMsIDB4MDY0NCwgMHgwNjJELCAweDA2NDQsCisgICAgMHgwNjJFLCAweDA2NDQsIDB4MDY0NSwgMHgwNjQ0LCAweDA2NDksIDB4MDY0NCwgMHgwNjRBLCAweDA2NDUsIDB4MDYyQywKKyAgICAweDA2NDUsIDB4MDYyRCwgMHgwNjQ1LCAweDA2MkUsIDB4MDY0NSwgMHgwNjQ1LCAweDA2NDUsIDB4MDY0OSwgMHgwNjQ1LAorICAgIDB4MDY0QSwgMHgwNjQ2LCAweDA2MkMsIDB4MDY0NiwgMHgwNjJELCAweDA2NDYsIDB4MDYyRSwgMHgwNjQ2LCAweDA2NDUsCisgICAgMHgwNjQ2LCAweDA2NDksIDB4MDY0NiwgMHgwNjRBLCAweDA2NDcsIDB4MDYyQywgMHgwNjQ3LCAweDA2NDUsIDB4MDY0NywKKyAgICAweDA2NDksIDB4MDY0NywgMHgwNjRBLCAweDA2NEEsIDB4MDYyQywgMHgwNjRBLCAweDA2MkQsIDB4MDY0QSwgMHgwNjJFLAorICAgIDB4MDY0QSwgMHgwNjQ1LCAweDA2NEEsIDB4MDY0OSwgMHgwNjRBLCAweDA2NEEsIDB4MDYzMCwgMHgwNjcwLCAweDA2MzEsCisgICAgMHgwNjcwLCAweDA2NDksIDB4MDY3MCwgMHgwNjRDLCAweDA2NTEsIDB4MDY0RCwgMHgwNjUxLCAweDA2NEUsIDB4MDY1MSwKKyAgICAweDA2NEYsIDB4MDY1MSwgMHgwNjUwLCAweDA2NTEsIDB4MDY1MSwgMHgwNjcwLCAweDA2MjYsIDB4MDYzMSwgMHgwNjI2LAorICAgIDB4MDYzMiwgMHgwNjI2LCAweDA2NDUsIDB4MDYyNiwgMHgwNjQ2LCAweDA2MjYsIDB4MDY0OSwgMHgwNjI2LCAweDA2NEEsCisgICAgMHgwNjI4LCAweDA2MzEsIDB4MDYyOCwgMHgwNjMyLCAweDA2MjgsIDB4MDY0NSwgMHgwNjI4LCAweDA2NDYsIDB4MDYyOCwKKyAgICAweDA2NDksIDB4MDYyOCwgMHgwNjRBLCAweDA2MkEsIDB4MDYzMSwgMHgwNjJBLCAweDA2MzIsIDB4MDYyQSwgMHgwNjQ1LAorICAgIDB4MDYyQSwgMHgwNjQ2LCAweDA2MkEsIDB4MDY0OSwgMHgwNjJBLCAweDA2NEEsIDB4MDYyQiwgMHgwNjMxLCAweDA2MkIsCisgICAgMHgwNjMyLCAweDA2MkIsIDB4MDY0NSwgMHgwNjJCLCAweDA2NDYsIDB4MDYyQiwgMHgwNjQ5LCAweDA2MkIsIDB4MDY0QSwKKyAgICAweDA2NDEsIDB4MDY0OSwgMHgwNjQxLCAweDA2NEEsIDB4MDY0MiwgMHgwNjQ5LCAweDA2NDIsIDB4MDY0QSwgMHgwNjQzLAorICAgIDB4MDYyNywgMHgwNjQzLCAweDA2NDQsIDB4MDY0MywgMHgwNjQ1LCAweDA2NDMsIDB4MDY0OSwgMHgwNjQzLCAweDA2NEEsCisgICAgMHgwNjQ0LCAweDA2NDUsIDB4MDY0NCwgMHgwNjQ5LCAweDA2NDQsIDB4MDY0QSwgMHgwNjQ1LCAweDA2MjcsIDB4MDY0NSwKKyAgICAweDA2NDUsIDB4MDY0NiwgMHgwNjMxLCAweDA2NDYsIDB4MDYzMiwgMHgwNjQ2LCAweDA2NDUsIDB4MDY0NiwgMHgwNjQ2LAorICAgIDB4MDY0NiwgMHgwNjQ5LCAweDA2NDYsIDB4MDY0QSwgMHgwNjQ5LCAweDA2NzAsIDB4MDY0QSwgMHgwNjMxLCAweDA2NEEsCisgICAgMHgwNjMyLCAweDA2NEEsIDB4MDY0NSwgMHgwNjRBLCAweDA2NDYsIDB4MDY0QSwgMHgwNjQ5LCAweDA2NEEsIDB4MDY0QSwKKyAgICAweDA2MjYsIDB4MDYyQywgMHgwNjI2LCAweDA2MkQsIDB4MDYyNiwgMHgwNjJFLCAweDA2MjYsIDB4MDY0NSwgMHgwNjI2LAorICAgIDB4MDY0NywgMHgwNjI4LCAweDA2MkMsIDB4MDYyOCwgMHgwNjJELCAweDA2MjgsIDB4MDYyRSwgMHgwNjI4LCAweDA2NDUsCisgICAgMHgwNjI4LCAweDA2NDcsIDB4MDYyQSwgMHgwNjJDLCAweDA2MkEsIDB4MDYyRCwgMHgwNjJBLCAweDA2MkUsIDB4MDYyQSwKKyAgICAweDA2NDUsIDB4MDYyQSwgMHgwNjQ3LCAweDA2MkIsIDB4MDY0NSwgMHgwNjJDLCAweDA2MkQsIDB4MDYyQywgMHgwNjQ1LAorICAgIDB4MDYyRCwgMHgwNjJDLCAweDA2MkQsIDB4MDY0NSwgMHgwNjJFLCAweDA2MkMsIDB4MDYyRSwgMHgwNjQ1LCAweDA2MzMsCisgICAgMHgwNjJDLCAweDA2MzMsIDB4MDYyRCwgMHgwNjMzLCAweDA2MkUsIDB4MDYzMywgMHgwNjQ1LCAweDA2MzUsIDB4MDYyRCwKKyAgICAweDA2MzUsIDB4MDYyRSwgMHgwNjM1LCAweDA2NDUsIDB4MDYzNiwgMHgwNjJDLCAweDA2MzYsIDB4MDYyRCwgMHgwNjM2LAorICAgIDB4MDYyRSwgMHgwNjM2LCAweDA2NDUsIDB4MDYzNywgMHgwNjJELCAweDA2MzgsIDB4MDY0NSwgMHgwNjM5LCAweDA2MkMsCisgICAgMHgwNjM5LCAweDA2NDUsIDB4MDYzQSwgMHgwNjJDLCAweDA2M0EsIDB4MDY0NSwgMHgwNjQxLCAweDA2MkMsIDB4MDY0MSwKKyAgICAweDA2MkQsIDB4MDY0MSwgMHgwNjJFLCAweDA2NDEsIDB4MDY0NSwgMHgwNjQyLCAweDA2MkQsIDB4MDY0MiwgMHgwNjQ1LAorICAgIDB4MDY0MywgMHgwNjJDLCAweDA2NDMsIDB4MDYyRCwgMHgwNjQzLCAweDA2MkUsIDB4MDY0MywgMHgwNjQ0LCAweDA2NDMsCisgICAgMHgwNjQ1LCAweDA2NDQsIDB4MDYyQywgMHgwNjQ0LCAweDA2MkQsIDB4MDY0NCwgMHgwNjJFLCAweDA2NDQsIDB4MDY0NSwKKyAgICAweDA2NDQsIDB4MDY0NywgMHgwNjQ1LCAweDA2MkMsIDB4MDY0NSwgMHgwNjJELCAweDA2NDUsIDB4MDYyRSwgMHgwNjQ1LAorICAgIDB4MDY0NSwgMHgwNjQ2LCAweDA2MkMsIDB4MDY0NiwgMHgwNjJELCAweDA2NDYsIDB4MDYyRSwgMHgwNjQ2LCAweDA2NDUsCisgICAgMHgwNjQ2LCAweDA2NDcsIDB4MDY0NywgMHgwNjJDLCAweDA2NDcsIDB4MDY0NSwgMHgwNjQ3LCAweDA2NzAsIDB4MDY0QSwKKyAgICAweDA2MkMsIDB4MDY0QSwgMHgwNjJELCAweDA2NEEsIDB4MDYyRSwgMHgwNjRBLCAweDA2NDUsIDB4MDY0QSwgMHgwNjQ3LAorICAgIDB4MDYyNiwgMHgwNjQ1LCAweDA2MjYsIDB4MDY0NywgMHgwNjI4LCAweDA2NDUsIDB4MDYyOCwgMHgwNjQ3LCAweDA2MkEsCisgICAgMHgwNjQ1LCAweDA2MkEsIDB4MDY0NywgMHgwNjJCLCAweDA2NDUsIDB4MDYyQiwgMHgwNjQ3LCAweDA2MzMsIDB4MDY0NSwKKyAgICAweDA2MzMsIDB4MDY0NywgMHgwNjM0LCAweDA2NDUsIDB4MDYzNCwgMHgwNjQ3LCAweDA2NDMsIDB4MDY0NCwgMHgwNjQzLAorICAgIDB4MDY0NSwgMHgwNjQ0LCAweDA2NDUsIDB4MDY0NiwgMHgwNjQ1LCAweDA2NDYsIDB4MDY0NywgMHgwNjRBLCAweDA2NDUsCisgICAgMHgwNjRBLCAweDA2NDcsIDB4MDYzNywgMHgwNjQ5LCAweDA2MzcsIDB4MDY0QSwgMHgwNjM5LCAweDA2NDksIDB4MDYzOSwKKyAgICAweDA2NEEsIDB4MDYzQSwgMHgwNjQ5LCAweDA2M0EsIDB4MDY0QSwgMHgwNjMzLCAweDA2NDksIDB4MDYzMywgMHgwNjRBLAorICAgIDB4MDYzNCwgMHgwNjQ5LCAweDA2MzQsIDB4MDY0QSwgMHgwNjJELCAweDA2NDksIDB4MDYyRCwgMHgwNjRBLCAweDA2MkMsCisgICAgMHgwNjQ5LCAweDA2MkMsIDB4MDY0QSwgMHgwNjJFLCAweDA2NDksIDB4MDYyRSwgMHgwNjRBLCAweDA2MzUsIDB4MDY0OSwKKyAgICAweDA2MzUsIDB4MDY0QSwgMHgwNjM2LCAweDA2NDksIDB4MDYzNiwgMHgwNjRBLCAweDA2MzQsIDB4MDYyQywgMHgwNjM0LAorICAgIDB4MDYyRCwgMHgwNjM0LCAweDA2MkUsIDB4MDYzNCwgMHgwNjQ1LCAweDA2MzQsIDB4MDYzMSwgMHgwNjMzLCAweDA2MzEsCisgICAgMHgwNjM1LCAweDA2MzEsIDB4MDYzNiwgMHgwNjMxLCAweDA2MzcsIDB4MDY0OSwgMHgwNjM3LCAweDA2NEEsIDB4MDYzOSwKKyAgICAweDA2NDksIDB4MDYzOSwgMHgwNjRBLCAweDA2M0EsIDB4MDY0OSwgMHgwNjNBLCAweDA2NEEsIDB4MDYzMywgMHgwNjQ5LAorICAgIDB4MDYzMywgMHgwNjRBLCAweDA2MzQsIDB4MDY0OSwgMHgwNjM0LCAweDA2NEEsIDB4MDYyRCwgMHgwNjQ5LCAweDA2MkQsCisgICAgMHgwNjRBLCAweDA2MkMsIDB4MDY0OSwgMHgwNjJDLCAweDA2NEEsIDB4MDYyRSwgMHgwNjQ5LCAweDA2MkUsIDB4MDY0QSwKKyAgICAweDA2MzUsIDB4MDY0OSwgMHgwNjM1LCAweDA2NEEsIDB4MDYzNiwgMHgwNjQ5LCAweDA2MzYsIDB4MDY0QSwgMHgwNjM0LAorICAgIDB4MDYyQywgMHgwNjM0LCAweDA2MkQsIDB4MDYzNCwgMHgwNjJFLCAweDA2MzQsIDB4MDY0NSwgMHgwNjM0LCAweDA2MzEsCisgICAgMHgwNjMzLCAweDA2MzEsIDB4MDYzNSwgMHgwNjMxLCAweDA2MzYsIDB4MDYzMSwgMHgwNjM0LCAweDA2MkMsIDB4MDYzNCwKKyAgICAweDA2MkQsIDB4MDYzNCwgMHgwNjJFLCAweDA2MzQsIDB4MDY0NSwgMHgwNjMzLCAweDA2NDcsIDB4MDYzNCwgMHgwNjQ3LAorICAgIDB4MDYzNywgMHgwNjQ1LCAweDA2MzMsIDB4MDYyQywgMHgwNjMzLCAweDA2MkQsIDB4MDYzMywgMHgwNjJFLCAweDA2MzQsCisgICAgMHgwNjJDLCAweDA2MzQsIDB4MDYyRCwgMHgwNjM0LCAweDA2MkUsIDB4MDYzNywgMHgwNjQ1LCAweDA2MzgsIDB4MDY0NSwKKyAgICAweDA2MjcsIDB4MDY0QiwgMHgwNjI3LCAweDA2NEIsIDB4MDY0MCwgMHgwNjRCLCAweDA2NDAsIDB4MDY0RSwgMHgwNjQwLAorICAgIDB4MDY0RiwgMHgwNjQwLCAweDA2NTAsIDB4MDY0MCwgMHgwNjUxLCAweDA2NDAsIDB4MDY1MiwgMHgwNjQ0LCAweDA2MjIsCisgICAgMHgwNjQ0LCAweDA2MjIsIDB4MDY0NCwgMHgwNjIzLCAweDA2NDQsIDB4MDYyMywgMHgwNjQ0LCAweDA2MjUsIDB4MDY0NCwKKyAgICAweDA2MjUsIDB4MDY0NCwgMHgwNjI3LCAweDA2NDQsIDB4MDYyN307CisKK2NvbnN0IEZYX1dDSEFSIGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvbl9NYXAzWzExNjRdID0geworICAgIDB4MDAzMSwgMHgwMDJGLCAweDAwMzQsIDB4MDAzMSwgMHgwMDJGLCAweDAwMzIsIDB4MDAzMywgMHgwMDJGLCAweDAwMzQsCisgICAgMHgwMDJFLCAweDAwMkUsIDB4MDAyRSwgMHgyMDMyLCAweDIwMzIsIDB4MjAzMiwgMHgyMDM1LCAweDIwMzUsIDB4MjAzNSwKKyAgICAweDAwNjEsIDB4MDAyRiwgMHgwMDYzLCAweDAwNjEsIDB4MDAyRiwgMHgwMDczLCAweDAwNjMsIDB4MDAyRiwgMHgwMDZGLAorICAgIDB4MDA2MywgMHgwMDJGLCAweDAwNzUsIDB4MDA1NCwgMHgwMDQ1LCAweDAwNEMsIDB4MDA0NiwgMHgwMDQxLCAweDAwNTgsCisgICAgMHgwMDMxLCAweDAwMkYsIDB4MDAzNywgMHgwMDMxLCAweDAwMkYsIDB4MDAzOSwgMHgwMDMxLCAweDAwMkYsIDB4MDAzMywKKyAgICAweDAwMzIsIDB4MDAyRiwgMHgwMDMzLCAweDAwMzEsIDB4MDAyRiwgMHgwMDM1LCAweDAwMzIsIDB4MDAyRiwgMHgwMDM1LAorICAgIDB4MDAzMywgMHgwMDJGLCAweDAwMzUsIDB4MDAzNCwgMHgwMDJGLCAweDAwMzUsIDB4MDAzMSwgMHgwMDJGLCAweDAwMzYsCisgICAgMHgwMDM1LCAweDAwMkYsIDB4MDAzNiwgMHgwMDMxLCAweDAwMkYsIDB4MDAzOCwgMHgwMDMzLCAweDAwMkYsIDB4MDAzOCwKKyAgICAweDAwMzUsIDB4MDAyRiwgMHgwMDM4LCAweDAwMzcsIDB4MDAyRiwgMHgwMDM4LCAweDAwNDksIDB4MDA0OSwgMHgwMDQ5LAorICAgIDB4MDA1NiwgMHgwMDQ5LCAweDAwNDksIDB4MDA1OCwgMHgwMDQ5LCAweDAwNDksIDB4MDA2OSwgMHgwMDY5LCAweDAwNjksCisgICAgMHgwMDc2LCAweDAwNjksIDB4MDA2OSwgMHgwMDc4LCAweDAwNjksIDB4MDA2OSwgMHgwMDMwLCAweDIwNDQsIDB4MDAzMywKKyAgICAweDIyMkIsIDB4MjIyQiwgMHgyMjJCLCAweDIyMkUsIDB4MjIyRSwgMHgyMjJFLCAweDAwNEUsIDB4MDA1NSwgMHgwMDRDLAorICAgIDB4MDA1MywgMHgwMDRGLCAweDAwNDgsIDB4MDA1MywgMHgwMDU0LCAweDAwNTgsIDB4MDA0NSwgMHgwMDU0LCAweDAwNTgsCisgICAgMHgwMDQ1LCAweDAwNEYsIDB4MDA1NCwgMHgwMDQ1LCAweDAwNEUsIDB4MDA1MSwgMHgwMDQxLCAweDAwNDMsIDB4MDA0QiwKKyAgICAweDAwNDIsIDB4MDA0NSwgMHgwMDRDLCAweDAwNDQsIDB4MDA0QywgMHgwMDQ1LCAweDAwNDQsIDB4MDA0MywgMHgwMDMxLAorICAgIDB4MDA0NCwgMHgwMDQzLCAweDAwMzIsIDB4MDA0NCwgMHgwMDQzLCAweDAwMzMsIDB4MDA0NCwgMHgwMDQzLCAweDAwMzQsCisgICAgMHgwMDRFLCAweDAwNDEsIDB4MDA0QiwgMHgwMDUzLCAweDAwNTksIDB4MDA0RSwgMHgwMDQ1LCAweDAwNTQsIDB4MDA0MiwKKyAgICAweDAwNDMsIDB4MDA0MSwgMHgwMDRFLCAweDAwNTMsIDB4MDA1NSwgMHgwMDQyLCAweDAwNDUsIDB4MDA1MywgMHgwMDQzLAorICAgIDB4MDA0NCwgMHgwMDQ1LCAweDAwNEMsIDB4MDAyOCwgMHgwMDMxLCAweDAwMjksIDB4MDAyOCwgMHgwMDMyLCAweDAwMjksCisgICAgMHgwMDI4LCAweDAwMzMsIDB4MDAyOSwgMHgwMDI4LCAweDAwMzQsIDB4MDAyOSwgMHgwMDI4LCAweDAwMzUsIDB4MDAyOSwKKyAgICAweDAwMjgsIDB4MDAzNiwgMHgwMDI5LCAweDAwMjgsIDB4MDAzNywgMHgwMDI5LCAweDAwMjgsIDB4MDAzOCwgMHgwMDI5LAorICAgIDB4MDAyOCwgMHgwMDM5LCAweDAwMjksIDB4MDAzMSwgMHgwMDMwLCAweDAwMkUsIDB4MDAzMSwgMHgwMDMxLCAweDAwMkUsCisgICAgMHgwMDMxLCAweDAwMzIsIDB4MDAyRSwgMHgwMDMxLCAweDAwMzMsIDB4MDAyRSwgMHgwMDMxLCAweDAwMzQsIDB4MDAyRSwKKyAgICAweDAwMzEsIDB4MDAzNSwgMHgwMDJFLCAweDAwMzEsIDB4MDAzNiwgMHgwMDJFLCAweDAwMzEsIDB4MDAzNywgMHgwMDJFLAorICAgIDB4MDAzMSwgMHgwMDM4LCAweDAwMkUsIDB4MDAzMSwgMHgwMDM5LCAweDAwMkUsIDB4MDAzMiwgMHgwMDMwLCAweDAwMkUsCisgICAgMHgwMDI4LCAweDAwNjEsIDB4MDAyOSwgMHgwMDI4LCAweDAwNjIsIDB4MDAyOSwgMHgwMDI4LCAweDAwNjMsIDB4MDAyOSwKKyAgICAweDAwMjgsIDB4MDA2NCwgMHgwMDI5LCAweDAwMjgsIDB4MDA2NSwgMHgwMDI5LCAweDAwMjgsIDB4MDA2NiwgMHgwMDI5LAorICAgIDB4MDAyOCwgMHgwMDY3LCAweDAwMjksIDB4MDAyOCwgMHgwMDY4LCAweDAwMjksIDB4MDAyOCwgMHgwMDY5LCAweDAwMjksCisgICAgMHgwMDI4LCAweDAwNkEsIDB4MDAyOSwgMHgwMDI4LCAweDAwNkIsIDB4MDAyOSwgMHgwMDI4LCAweDAwNkMsIDB4MDAyOSwKKyAgICAweDAwMjgsIDB4MDA2RCwgMHgwMDI5LCAweDAwMjgsIDB4MDA2RSwgMHgwMDI5LCAweDAwMjgsIDB4MDA2RiwgMHgwMDI5LAorICAgIDB4MDAyOCwgMHgwMDcwLCAweDAwMjksIDB4MDAyOCwgMHgwMDcxLCAweDAwMjksIDB4MDAyOCwgMHgwMDcyLCAweDAwMjksCisgICAgMHgwMDI4LCAweDAwNzMsIDB4MDAyOSwgMHgwMDI4LCAweDAwNzQsIDB4MDAyOSwgMHgwMDI4LCAweDAwNzUsIDB4MDAyOSwKKyAgICAweDAwMjgsIDB4MDA3NiwgMHgwMDI5LCAweDAwMjgsIDB4MDA3NywgMHgwMDI5LCAweDAwMjgsIDB4MDA3OCwgMHgwMDI5LAorICAgIDB4MDAyOCwgMHgwMDc5LCAweDAwMjksIDB4MDAyOCwgMHgwMDdBLCAweDAwMjksIDB4MDAzQSwgMHgwMDNBLCAweDAwM0QsCisgICAgMHgwMDNELCAweDAwM0QsIDB4MDAzRCwgMHgwMDI4LCAweDExMDAsIDB4MDAyOSwgMHgwMDI4LCAweDExMDIsIDB4MDAyOSwKKyAgICAweDAwMjgsIDB4MTEwMywgMHgwMDI5LCAweDAwMjgsIDB4MTEwNSwgMHgwMDI5LCAweDAwMjgsIDB4MTEwNiwgMHgwMDI5LAorICAgIDB4MDAyOCwgMHgxMTA3LCAweDAwMjksIDB4MDAyOCwgMHgxMTA5LCAweDAwMjksIDB4MDAyOCwgMHgxMTBCLCAweDAwMjksCisgICAgMHgwMDI4LCAweDExMEMsIDB4MDAyOSwgMHgwMDI4LCAweDExMEUsIDB4MDAyOSwgMHgwMDI4LCAweDExMEYsIDB4MDAyOSwKKyAgICAweDAwMjgsIDB4MTExMCwgMHgwMDI5LCAweDAwMjgsIDB4MTExMSwgMHgwMDI5LCAweDAwMjgsIDB4MTExMiwgMHgwMDI5LAorICAgIDB4MDAyOCwgMHg0RTAwLCAweDAwMjksIDB4MDAyOCwgMHg0RThDLCAweDAwMjksIDB4MDAyOCwgMHg0RTA5LCAweDAwMjksCisgICAgMHgwMDI4LCAweDU2REIsIDB4MDAyOSwgMHgwMDI4LCAweDRFOTQsIDB4MDAyOSwgMHgwMDI4LCAweDUxNkQsIDB4MDAyOSwKKyAgICAweDAwMjgsIDB4NEUwMywgMHgwMDI5LCAweDAwMjgsIDB4NTE2QiwgMHgwMDI5LCAweDAwMjgsIDB4NEU1RCwgMHgwMDI5LAorICAgIDB4MDAyOCwgMHg1MzQxLCAweDAwMjksIDB4MDAyOCwgMHg2NzA4LCAweDAwMjksIDB4MDAyOCwgMHg3MDZCLCAweDAwMjksCisgICAgMHgwMDI4LCAweDZDMzQsIDB4MDAyOSwgMHgwMDI4LCAweDY3MjgsIDB4MDAyOSwgMHgwMDI4LCAweDkxRDEsIDB4MDAyOSwKKyAgICAweDAwMjgsIDB4NTcxRiwgMHgwMDI5LCAweDAwMjgsIDB4NjVFNSwgMHgwMDI5LCAweDAwMjgsIDB4NjgyQSwgMHgwMDI5LAorICAgIDB4MDAyOCwgMHg2NzA5LCAweDAwMjksIDB4MDAyOCwgMHg3OTNFLCAweDAwMjksIDB4MDAyOCwgMHg1NDBELCAweDAwMjksCisgICAgMHgwMDI4LCAweDcyNzksIDB4MDAyOSwgMHgwMDI4LCAweDhDQTEsIDB4MDAyOSwgMHgwMDI4LCAweDc5NUQsIDB4MDAyOSwKKyAgICAweDAwMjgsIDB4NTJCNCwgMHgwMDI5LCAweDAwMjgsIDB4NEVFMywgMHgwMDI5LCAweDAwMjgsIDB4NTQ3QywgMHgwMDI5LAorICAgIDB4MDAyOCwgMHg1QjY2LCAweDAwMjksIDB4MDAyOCwgMHg3NkUzLCAweDAwMjksIDB4MDAyOCwgMHg0RjAxLCAweDAwMjksCisgICAgMHgwMDI4LCAweDhDQzcsIDB4MDAyOSwgMHgwMDI4LCAweDUzNTQsIDB4MDAyOSwgMHgwMDI4LCAweDc5NkQsIDB4MDAyOSwKKyAgICAweDAwMjgsIDB4NEYxMSwgMHgwMDI5LCAweDAwMjgsIDB4ODFFQSwgMHgwMDI5LCAweDAwMjgsIDB4ODFGMywgMHgwMDI5LAorICAgIDB4MDA1MCwgMHgwMDU0LCAweDAwNDUsIDB4MDAzMSwgMHgwMDMwLCAweDY3MDgsIDB4MDAzMSwgMHgwMDMxLCAweDY3MDgsCisgICAgMHgwMDMxLCAweDAwMzIsIDB4NjcwOCwgMHgwMDY1LCAweDAwNzIsIDB4MDA2NywgMHgwMDRDLCAweDAwNTQsIDB4MDA0NCwKKyAgICAweDMwQTIsIDB4MzBGQywgMHgzMEVCLCAweDMwQTQsIDB4MzBGMywgMHgzMEMxLCAweDMwQTYsIDB4MzBBOSwgMHgzMEYzLAorICAgIDB4MzBBQSwgMHgzMEYzLCAweDMwQjksIDB4MzBBQSwgMHgzMEZDLCAweDMwRTAsIDB4MzBBQiwgMHgzMEE0LCAweDMwRUEsCisgICAgMHgzMEFDLCAweDMwRUQsIDB4MzBGMywgMHgzMEFDLCAweDMwRjMsIDB4MzBERSwgMHgzMEFFLCAweDMwQ0IsIDB4MzBGQywKKyAgICAweDMwQjAsIDB4MzBFOSwgMHgzMEUwLCAweDMwQjEsIDB4MzBGQywgMHgzMEI5LCAweDMwQjMsIDB4MzBFQiwgMHgzMENBLAorICAgIDB4MzBCMywgMHgzMEZDLCAweDMwREQsIDB4MzBCQiwgMHgzMEYzLCAweDMwQzEsIDB4MzBCQiwgMHgzMEYzLCAweDMwQzgsCisgICAgMHgzMEMwLCAweDMwRkMsIDB4MzBCOSwgMHgzMENFLCAweDMwQzMsIDB4MzBDOCwgMHgzMENGLCAweDMwQTQsIDB4MzBDNCwKKyAgICAweDMwRDEsIDB4MzBGQywgMHgzMEM0LCAweDMwRDQsIDB4MzBBRiwgMHgzMEVCLCAweDMwRDUsIDB4MzBFOSwgMHgzMEYzLAorICAgIDB4MzBEQSwgMHgzMENCLCAweDMwRDIsIDB4MzBEOCwgMHgzMEVCLCAweDMwQzQsIDB4MzBEQSwgMHgzMEYzLCAweDMwQjksCisgICAgMHgzMERBLCAweDMwRkMsIDB4MzBCOCwgMHgzMEQ5LCAweDMwRkMsIDB4MzBCRiwgMHgzMERDLCAweDMwRUIsIDB4MzBDOCwKKyAgICAweDMwREQsIDB4MzBGMywgMHgzMEM5LCAweDMwREIsIDB4MzBGQywgMHgzMEVCLCAweDMwREIsIDB4MzBGQywgMHgzMEYzLAorICAgIDB4MzBERSwgMHgzMEE0LCAweDMwRUIsIDB4MzBERSwgMHgzMEMzLCAweDMwQ0YsIDB4MzBERSwgMHgzMEVCLCAweDMwQUYsCisgICAgMHgzMEU0LCAweDMwRkMsIDB4MzBDOSwgMHgzMEU0LCAweDMwRkMsIDB4MzBFQiwgMHgzMEU2LCAweDMwQTIsIDB4MzBGMywKKyAgICAweDMwRUIsIDB4MzBENCwgMHgzMEZDLCAweDMwRUYsIDB4MzBDMywgMHgzMEM4LCAweDAwMzEsIDB4MDAzMCwgMHg3MEI5LAorICAgIDB4MDAzMSwgMHgwMDMxLCAweDcwQjksIDB4MDAzMSwgMHgwMDMyLCAweDcwQjksIDB4MDAzMSwgMHgwMDMzLCAweDcwQjksCisgICAgMHgwMDMxLCAweDAwMzQsIDB4NzBCOSwgMHgwMDMxLCAweDAwMzUsIDB4NzBCOSwgMHgwMDMxLCAweDAwMzYsIDB4NzBCOSwKKyAgICAweDAwMzEsIDB4MDAzNywgMHg3MEI5LCAweDAwMzEsIDB4MDAzOCwgMHg3MEI5LCAweDAwMzEsIDB4MDAzOSwgMHg3MEI5LAorICAgIDB4MDAzMiwgMHgwMDMwLCAweDcwQjksIDB4MDAzMiwgMHgwMDMxLCAweDcwQjksIDB4MDAzMiwgMHgwMDMyLCAweDcwQjksCisgICAgMHgwMDMyLCAweDAwMzMsIDB4NzBCOSwgMHgwMDMyLCAweDAwMzQsIDB4NzBCOSwgMHgwMDY4LCAweDAwNTAsIDB4MDA2MSwKKyAgICAweDAwNjIsIDB4MDA2MSwgMHgwMDcyLCAweDAwNjQsIDB4MDA2RCwgMHgwMEIyLCAweDAwNjQsIDB4MDA2RCwgMHgwMEIzLAorICAgIDB4MDA2MywgMHgwMDYxLCAweDAwNkMsIDB4MDA2QiwgMHgwMDQ4LCAweDAwN0EsIDB4MDA0RCwgMHgwMDQ4LCAweDAwN0EsCisgICAgMHgwMDQ3LCAweDAwNDgsIDB4MDA3QSwgMHgwMDU0LCAweDAwNDgsIDB4MDA3QSwgMHgwMDZELCAweDAwNkQsIDB4MDBCMiwKKyAgICAweDAwNjMsIDB4MDA2RCwgMHgwMEIyLCAweDAwNkIsIDB4MDA2RCwgMHgwMEIyLCAweDAwNkQsIDB4MDA2RCwgMHgwMEIzLAorICAgIDB4MDA2MywgMHgwMDZELCAweDAwQjMsIDB4MDA2QiwgMHgwMDZELCAweDAwQjMsIDB4MDA2RCwgMHgyMjE1LCAweDAwNzMsCisgICAgMHgwMDZCLCAweDAwNTAsIDB4MDA2MSwgMHgwMDRELCAweDAwNTAsIDB4MDA2MSwgMHgwMDQ3LCAweDAwNTAsIDB4MDA2MSwKKyAgICAweDAwNzIsIDB4MDA2MSwgMHgwMDY0LCAweDAwNDMsIDB4MDA2RiwgMHgwMDJFLCAweDAwNkMsIDB4MDA2RiwgMHgwMDY3LAorICAgIDB4MDA2RCwgMHgwMDY5LCAweDAwNkMsIDB4MDA2RCwgMHgwMDZGLCAweDAwNkMsIDB4MDA1MCwgMHgwMDUwLCAweDAwNEQsCisgICAgMHgwMDU2LCAweDIyMTUsIDB4MDA2RCwgMHgwMDQxLCAweDIyMTUsIDB4MDA2RCwgMHgwMDMxLCAweDAwMzAsIDB4NjVFNSwKKyAgICAweDAwMzEsIDB4MDAzMSwgMHg2NUU1LCAweDAwMzEsIDB4MDAzMiwgMHg2NUU1LCAweDAwMzEsIDB4MDAzMywgMHg2NUU1LAorICAgIDB4MDAzMSwgMHgwMDM0LCAweDY1RTUsIDB4MDAzMSwgMHgwMDM1LCAweDY1RTUsIDB4MDAzMSwgMHgwMDM2LCAweDY1RTUsCisgICAgMHgwMDMxLCAweDAwMzcsIDB4NjVFNSwgMHgwMDMxLCAweDAwMzgsIDB4NjVFNSwgMHgwMDMxLCAweDAwMzksIDB4NjVFNSwKKyAgICAweDAwMzIsIDB4MDAzMCwgMHg2NUU1LCAweDAwMzIsIDB4MDAzMSwgMHg2NUU1LCAweDAwMzIsIDB4MDAzMiwgMHg2NUU1LAorICAgIDB4MDAzMiwgMHgwMDMzLCAweDY1RTUsIDB4MDAzMiwgMHgwMDM0LCAweDY1RTUsIDB4MDAzMiwgMHgwMDM1LCAweDY1RTUsCisgICAgMHgwMDMyLCAweDAwMzYsIDB4NjVFNSwgMHgwMDMyLCAweDAwMzcsIDB4NjVFNSwgMHgwMDMyLCAweDAwMzgsIDB4NjVFNSwKKyAgICAweDAwMzIsIDB4MDAzOSwgMHg2NUU1LCAweDAwMzMsIDB4MDAzMCwgMHg2NUU1LCAweDAwMzMsIDB4MDAzMSwgMHg2NUU1LAorICAgIDB4MDA2NywgMHgwMDYxLCAweDAwNkMsIDB4MDA2NiwgMHgwMDY2LCAweDAwNjksIDB4MDA2NiwgMHgwMDY2LCAweDAwNkMsCisgICAgMHgwNjQwLCAweDA2NEUsIDB4MDY1MSwgMHgwNjQwLCAweDA2NEYsIDB4MDY1MSwgMHgwNjQwLCAweDA2NTAsIDB4MDY1MSwKKyAgICAweDA2MkEsIDB4MDYyQywgMHgwNjQ1LCAweDA2MkEsIDB4MDYyRCwgMHgwNjJDLCAweDA2MkEsIDB4MDYyRCwgMHgwNjJDLAorICAgIDB4MDYyQSwgMHgwNjJELCAweDA2NDUsIDB4MDYyQSwgMHgwNjJFLCAweDA2NDUsIDB4MDYyQSwgMHgwNjQ1LCAweDA2MkMsCisgICAgMHgwNjJBLCAweDA2NDUsIDB4MDYyRCwgMHgwNjJBLCAweDA2NDUsIDB4MDYyRSwgMHgwNjJDLCAweDA2NDUsIDB4MDYyRCwKKyAgICAweDA2MkMsIDB4MDY0NSwgMHgwNjJELCAweDA2MkQsIDB4MDY0NSwgMHgwNjRBLCAweDA2MkQsIDB4MDY0NSwgMHgwNjQ5LAorICAgIDB4MDYzMywgMHgwNjJELCAweDA2MkMsIDB4MDYzMywgMHgwNjJDLCAweDA2MkQsIDB4MDYzMywgMHgwNjJDLCAweDA2NDksCisgICAgMHgwNjMzLCAweDA2NDUsIDB4MDYyRCwgMHgwNjMzLCAweDA2NDUsIDB4MDYyRCwgMHgwNjMzLCAweDA2NDUsIDB4MDYyQywKKyAgICAweDA2MzMsIDB4MDY0NSwgMHgwNjQ1LCAweDA2MzMsIDB4MDY0NSwgMHgwNjQ1LCAweDA2MzUsIDB4MDYyRCwgMHgwNjJELAorICAgIDB4MDYzNSwgMHgwNjJELCAweDA2MkQsIDB4MDYzNSwgMHgwNjQ1LCAweDA2NDUsIDB4MDYzNCwgMHgwNjJELCAweDA2NDUsCisgICAgMHgwNjM0LCAweDA2MkQsIDB4MDY0NSwgMHgwNjM0LCAweDA2MkMsIDB4MDY0QSwgMHgwNjM0LCAweDA2NDUsIDB4MDYyRSwKKyAgICAweDA2MzQsIDB4MDY0NSwgMHgwNjJFLCAweDA2MzQsIDB4MDY0NSwgMHgwNjQ1LCAweDA2MzQsIDB4MDY0NSwgMHgwNjQ1LAorICAgIDB4MDYzNiwgMHgwNjJELCAweDA2NDksIDB4MDYzNiwgMHgwNjJFLCAweDA2NDUsIDB4MDYzNiwgMHgwNjJFLCAweDA2NDUsCisgICAgMHgwNjM3LCAweDA2NDUsIDB4MDYyRCwgMHgwNjM3LCAweDA2NDUsIDB4MDYyRCwgMHgwNjM3LCAweDA2NDUsIDB4MDY0NSwKKyAgICAweDA2MzcsIDB4MDY0NSwgMHgwNjRBLCAweDA2MzksIDB4MDYyQywgMHgwNjQ1LCAweDA2MzksIDB4MDY0NSwgMHgwNjQ1LAorICAgIDB4MDYzOSwgMHgwNjQ1LCAweDA2NDUsIDB4MDYzOSwgMHgwNjQ1LCAweDA2NDksIDB4MDYzQSwgMHgwNjQ1LCAweDA2NDUsCisgICAgMHgwNjNBLCAweDA2NDUsIDB4MDY0QSwgMHgwNjNBLCAweDA2NDUsIDB4MDY0OSwgMHgwNjQxLCAweDA2MkUsIDB4MDY0NSwKKyAgICAweDA2NDEsIDB4MDYyRSwgMHgwNjQ1LCAweDA2NDIsIDB4MDY0NSwgMHgwNjJELCAweDA2NDIsIDB4MDY0NSwgMHgwNjQ1LAorICAgIDB4MDY0NCwgMHgwNjJELCAweDA2NDUsIDB4MDY0NCwgMHgwNjJELCAweDA2NEEsIDB4MDY0NCwgMHgwNjJELCAweDA2NDksCisgICAgMHgwNjQ0LCAweDA2MkMsIDB4MDYyQywgMHgwNjQ0LCAweDA2MkMsIDB4MDYyQywgMHgwNjQ0LCAweDA2MkUsIDB4MDY0NSwKKyAgICAweDA2NDQsIDB4MDYyRSwgMHgwNjQ1LCAweDA2NDQsIDB4MDY0NSwgMHgwNjJELCAweDA2NDQsIDB4MDY0NSwgMHgwNjJELAorICAgIDB4MDY0NSwgMHgwNjJELCAweDA2MkMsIDB4MDY0NSwgMHgwNjJELCAweDA2NDUsIDB4MDY0NSwgMHgwNjJELCAweDA2NEEsCisgICAgMHgwNjQ1LCAweDA2MkMsIDB4MDYyRCwgMHgwNjQ1LCAweDA2MkMsIDB4MDY0NSwgMHgwNjQ1LCAweDA2MkUsIDB4MDYyQywKKyAgICAweDA2NDUsIDB4MDYyRSwgMHgwNjQ1LCAweDA2NDUsIDB4MDYyQywgMHgwNjJFLCAweDA2NDcsIDB4MDY0NSwgMHgwNjJDLAorICAgIDB4MDY0NywgMHgwNjQ1LCAweDA2NDUsIDB4MDY0NiwgMHgwNjJELCAweDA2NDUsIDB4MDY0NiwgMHgwNjJELCAweDA2NDksCisgICAgMHgwNjQ2LCAweDA2MkMsIDB4MDY0NSwgMHgwNjQ2LCAweDA2MkMsIDB4MDY0NSwgMHgwNjQ2LCAweDA2MkMsIDB4MDY0OSwKKyAgICAweDA2NDYsIDB4MDY0NSwgMHgwNjRBLCAweDA2NDYsIDB4MDY0NSwgMHgwNjQ5LCAweDA2NEEsIDB4MDY0NSwgMHgwNjQ1LAorICAgIDB4MDY0QSwgMHgwNjQ1LCAweDA2NDUsIDB4MDYyOCwgMHgwNjJFLCAweDA2NEEsIDB4MDYyQSwgMHgwNjJDLCAweDA2NEEsCisgICAgMHgwNjJBLCAweDA2MkMsIDB4MDY0OSwgMHgwNjJBLCAweDA2MkUsIDB4MDY0QSwgMHgwNjJBLCAweDA2MkUsIDB4MDY0OSwKKyAgICAweDA2MkEsIDB4MDY0NSwgMHgwNjRBLCAweDA2MkEsIDB4MDY0NSwgMHgwNjQ5LCAweDA2MkMsIDB4MDY0NSwgMHgwNjRBLAorICAgIDB4MDYyQywgMHgwNjJELCAweDA2NDksIDB4MDYyQywgMHgwNjQ1LCAweDA2NDksIDB4MDYzMywgMHgwNjJFLCAweDA2NDksCisgICAgMHgwNjM1LCAweDA2MkQsIDB4MDY0QSwgMHgwNjM0LCAweDA2MkQsIDB4MDY0QSwgMHgwNjM2LCAweDA2MkQsIDB4MDY0QSwKKyAgICAweDA2NDQsIDB4MDYyQywgMHgwNjRBLCAweDA2NDQsIDB4MDY0NSwgMHgwNjRBLCAweDA2NEEsIDB4MDYyRCwgMHgwNjRBLAorICAgIDB4MDY0QSwgMHgwNjJDLCAweDA2NEEsIDB4MDY0QSwgMHgwNjQ1LCAweDA2NEEsIDB4MDY0NSwgMHgwNjQ1LCAweDA2NEEsCisgICAgMHgwNjQyLCAweDA2NDUsIDB4MDY0QSwgMHgwNjQ2LCAweDA2MkQsIDB4MDY0QSwgMHgwNjQyLCAweDA2NDUsIDB4MDYyRCwKKyAgICAweDA2NDQsIDB4MDYyRCwgMHgwNjQ1LCAweDA2MzksIDB4MDY0NSwgMHgwNjRBLCAweDA2NDMsIDB4MDY0NSwgMHgwNjRBLAorICAgIDB4MDY0NiwgMHgwNjJDLCAweDA2MkQsIDB4MDY0NSwgMHgwNjJFLCAweDA2NEEsIDB4MDY0NCwgMHgwNjJDLCAweDA2NDUsCisgICAgMHgwNjQzLCAweDA2NDUsIDB4MDY0NSwgMHgwNjQ0LCAweDA2MkMsIDB4MDY0NSwgMHgwNjQ2LCAweDA2MkMsIDB4MDYyRCwKKyAgICAweDA2MkMsIDB4MDYyRCwgMHgwNjRBLCAweDA2MkQsIDB4MDYyQywgMHgwNjRBLCAweDA2NDUsIDB4MDYyQywgMHgwNjRBLAorICAgIDB4MDY0MSwgMHgwNjQ1LCAweDA2NEEsIDB4MDYyOCwgMHgwNjJELCAweDA2NEEsIDB4MDY0MywgMHgwNjQ1LCAweDA2NDUsCisgICAgMHgwNjM5LCAweDA2MkMsIDB4MDY0NSwgMHgwNjM1LCAweDA2NDUsIDB4MDY0NSwgMHgwNjMzLCAweDA2MkUsIDB4MDY0QSwKKyAgICAweDA2NDYsIDB4MDYyQywgMHgwNjRBLCAweDA2MzUsIDB4MDY0NCwgMHgwNkQyLCAweDA2NDIsIDB4MDY0NCwgMHgwNkQyLAorICAgIDB4MDYzNSwgMHgwNjQ0LCAweDA2NDl9OworCitjb25zdCBGWF9XQ0hBUiBnX1VuaWNvZGVEYXRhX05vcm1hbGl6YXRpb25fTWFwNFs0ODhdID0geworICAgIDB4MDAwNCwgMHgyMDMyLCAweDIwMzIsIDB4MjAzMiwgMHgyMDMyLCAweDAwMDQsIDB4MDAzMSwgMHgwMDJGLCAweDAwMzEsCisgICAgMHgwMDMwLCAweDAwMDQsIDB4MDA1NiwgMHgwMDQ5LCAweDAwNDksIDB4MDA0OSwgMHgwMDA0LCAweDAwNzYsIDB4MDA2OSwKKyAgICAweDAwNjksIDB4MDA2OSwgMHgwMDA0LCAweDAwMjgsIDB4MDAzMSwgMHgwMDMwLCAweDAwMjksIDB4MDAwNCwgMHgwMDI4LAorICAgIDB4MDAzMSwgMHgwMDMxLCAweDAwMjksIDB4MDAwNCwgMHgwMDI4LCAweDAwMzEsIDB4MDAzMiwgMHgwMDI5LCAweDAwMDQsCisgICAgMHgwMDI4LCAweDAwMzEsIDB4MDAzMywgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgwMDMxLCAweDAwMzQsIDB4MDAyOSwKKyAgICAweDAwMDQsIDB4MDAyOCwgMHgwMDMxLCAweDAwMzUsIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsIDB4MDAzMSwgMHgwMDM2LAorICAgIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsIDB4MDAzMSwgMHgwMDM3LCAweDAwMjksIDB4MDAwNCwgMHgwMDI4LCAweDAwMzEsCisgICAgMHgwMDM4LCAweDAwMjksIDB4MDAwNCwgMHgwMDI4LCAweDAwMzEsIDB4MDAzOSwgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwKKyAgICAweDAwMzIsIDB4MDAzMCwgMHgwMDI5LCAweDAwMDQsIDB4MjIyQiwgMHgyMjJCLCAweDIyMkIsIDB4MjIyQiwgMHgwMDA0LAorICAgIDB4MDAyOCwgMHgxMTAwLCAweDExNjEsIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsIDB4MTEwMiwgMHgxMTYxLCAweDAwMjksCisgICAgMHgwMDA0LCAweDAwMjgsIDB4MTEwMywgMHgxMTYxLCAweDAwMjksIDB4MDAwNCwgMHgwMDI4LCAweDExMDUsIDB4MTE2MSwKKyAgICAweDAwMjksIDB4MDAwNCwgMHgwMDI4LCAweDExMDYsIDB4MTE2MSwgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgxMTA3LAorICAgIDB4MTE2MSwgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgxMTA5LCAweDExNjEsIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsCisgICAgMHgxMTBCLCAweDExNjEsIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsIDB4MTEwQywgMHgxMTYxLCAweDAwMjksIDB4MDAwNCwKKyAgICAweDAwMjgsIDB4MTEwRSwgMHgxMTYxLCAweDAwMjksIDB4MDAwNCwgMHgwMDI4LCAweDExMEYsIDB4MTE2MSwgMHgwMDI5LAorICAgIDB4MDAwNCwgMHgwMDI4LCAweDExMTAsIDB4MTE2MSwgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgxMTExLCAweDExNjEsCisgICAgMHgwMDI5LCAweDAwMDQsIDB4MDAyOCwgMHgxMTEyLCAweDExNjEsIDB4MDAyOSwgMHgwMDA0LCAweDAwMjgsIDB4MTEwQywKKyAgICAweDExNkUsIDB4MDAyOSwgMHgwMDA3LCAweDAwMjgsIDB4MTEwQiwgMHgxMTY5LCAweDExMEMsIDB4MTE2NSwgMHgxMUFCLAorICAgIDB4MDAyOSwgMHgwMDA2LCAweDAwMjgsIDB4MTEwQiwgMHgxMTY5LCAweDExMTIsIDB4MTE2RSwgMHgwMDI5LCAweDAwMDUsCisgICAgMHgxMTBFLCAweDExNjEsIDB4MTFCNywgMHgxMTAwLCAweDExNjksIDB4MDAwNCwgMHgxMTBDLCAweDExNkUsIDB4MTEwQiwKKyAgICAweDExNzQsIDB4MDAwNCwgMHgzMEEyLCAweDMwRDEsIDB4MzBGQywgMHgzMEM4LCAweDAwMDQsIDB4MzBBMiwgMHgzMEVCLAorICAgIDB4MzBENSwgMHgzMEExLCAweDAwMDQsIDB4MzBBMiwgMHgzMEYzLCAweDMwREEsIDB4MzBBMiwgMHgwMDA0LCAweDMwQTQsCisgICAgMHgzMENCLCAweDMwRjMsIDB4MzBCMCwgMHgwMDA1LCAweDMwQTgsIDB4MzBCOSwgMHgzMEFGLCAweDMwRkMsIDB4MzBDOSwKKyAgICAweDAwMDQsIDB4MzBBOCwgMHgzMEZDLCAweDMwQUIsIDB4MzBGQywgMHgwMDA0LCAweDMwQUIsIDB4MzBFOSwgMHgzMEMzLAorICAgIDB4MzBDOCwgMHgwMDA0LCAweDMwQUIsIDB4MzBFRCwgMHgzMEVBLCAweDMwRkMsIDB4MDAwNCwgMHgzMEFELCAweDMwRTUsCisgICAgMHgzMEVBLCAweDMwRkMsIDB4MDAwNCwgMHgzMEFFLCAweDMwRUIsIDB4MzBDMCwgMHgzMEZDLCAweDAwMDUsIDB4MzBBRCwKKyAgICAweDMwRUQsIDB4MzBCMCwgMHgzMEU5LCAweDMwRTAsIDB4MDAwNiwgMHgzMEFELCAweDMwRUQsIDB4MzBFMSwgMHgzMEZDLAorICAgIDB4MzBDOCwgMHgzMEVCLCAweDAwMDUsIDB4MzBBRCwgMHgzMEVELCAweDMwRUYsIDB4MzBDMywgMHgzMEM4LCAweDAwMDUsCisgICAgMHgzMEIwLCAweDMwRTksIDB4MzBFMCwgMHgzMEM4LCAweDMwRjMsIDB4MDAwNSwgMHgzMEFGLCAweDMwRUIsIDB4MzBCQywKKyAgICAweDMwQTQsIDB4MzBFRCwgMHgwMDA0LCAweDMwQUYsIDB4MzBFRCwgMHgzMEZDLCAweDMwQ0QsIDB4MDAwNCwgMHgzMEI1LAorICAgIDB4MzBBNCwgMHgzMEFGLCAweDMwRUIsIDB4MDAwNSwgMHgzMEI1LCAweDMwRjMsIDB4MzBDMSwgMHgzMEZDLCAweDMwRTAsCisgICAgMHgwMDA0LCAweDMwQjcsIDB4MzBFQSwgMHgzMEYzLCAweDMwQjAsIDB4MDAwNSwgMHgzMEQxLCAweDMwRkMsIDB4MzBCQiwKKyAgICAweDMwRjMsIDB4MzBDOCwgMHgwMDA0LCAweDMwRDAsIDB4MzBGQywgMHgzMEVDLCAweDMwRUIsIDB4MDAwNSwgMHgzMEQ0LAorICAgIDB4MzBBMiwgMHgzMEI5LCAweDMwQzgsIDB4MzBFQiwgMHgwMDA1LCAweDMwRDUsIDB4MzBBMSwgMHgzMEU5LCAweDMwQzMsCisgICAgMHgzMEM5LCAweDAwMDQsIDB4MzBENSwgMHgzMEEzLCAweDMwRkMsIDB4MzBDOCwgMHgwMDA1LCAweDMwRDYsIDB4MzBDMywKKyAgICAweDMwQjcsIDB4MzBBNywgMHgzMEVCLCAweDAwMDUsIDB4MzBEOCwgMHgzMEFGLCAweDMwQkYsIDB4MzBGQywgMHgzMEVCLAorICAgIDB4MDAwNCwgMHgzMERELCAweDMwQTQsIDB4MzBGMywgMHgzMEM4LCAweDAwMDQsIDB4MzBERSwgMHgzMEE0LCAweDMwQUYsCisgICAgMHgzMEVELCAweDAwMDUsIDB4MzBERSwgMHgzMEYzLCAweDMwQjcsIDB4MzBFNywgMHgzMEYzLCAweDAwMDQsIDB4MzBERiwKKyAgICAweDMwQUYsIDB4MzBFRCwgMHgzMEYzLCAweDAwMDUsIDB4MzBERiwgMHgzMEVBLCAweDMwRDAsIDB4MzBGQywgMHgzMEVCLAorICAgIDB4MDAwNCwgMHgzMEUxLCAweDMwQUMsIDB4MzBDOCwgMHgzMEYzLCAweDAwMDQsIDB4MzBFMSwgMHgzMEZDLCAweDMwQzgsCisgICAgMHgzMEVCLCAweDAwMDQsIDB4MzBFQSwgMHgzMEMzLCAweDMwQzgsIDB4MzBFQiwgMHgwMDA0LCAweDMwRUIsIDB4MzBGQywKKyAgICAweDMwRDYsIDB4MzBFQiwgMHgwMDA1LCAweDMwRUMsIDB4MzBGMywgMHgzMEM4LCAweDMwQjIsIDB4MzBGMywgMHgwMDA0LAorICAgIDB4NjgyQSwgMHg1RjBGLCAweDRGMUEsIDB4NzkzRSwgMHgwMDA0LCAweDAwNkIsIDB4MDA2MywgMHgwMDYxLCAweDAwNkMsCisgICAgMHgwMDA0LCAweDAwNkQsIDB4MjIxNSwgMHgwMDczLCAweDAwQjIsIDB4MDAwNSwgMHgwMDcyLCAweDAwNjEsIDB4MDA2NCwKKyAgICAweDIyMTUsIDB4MDA3MywgMHgwMDA2LCAweDAwNzIsIDB4MDA2MSwgMHgwMDY0LCAweDIyMTUsIDB4MDA3MywgMHgwMEIyLAorICAgIDB4MDAwNCwgMHgwMDYxLCAweDAwMkUsIDB4MDA2RCwgMHgwMDJFLCAweDAwMDQsIDB4MDA0MywgMHgyMjE1LCAweDAwNkIsCisgICAgMHgwMDY3LCAweDAwMDQsIDB4MDA3MCwgMHgwMDJFLCAweDAwNkQsIDB4MDAyRSwgMHgwMDA0LCAweDA2MjcsIDB4MDY0NCwKKyAgICAweDA2NDQsIDB4MDY0NywgMHgwMDA0LCAweDA2MjcsIDB4MDY0MywgMHgwNjI4LCAweDA2MzEsIDB4MDAwNCwgMHgwNjQ1LAorICAgIDB4MDYyRCwgMHgwNjQ1LCAweDA2MkYsIDB4MDAwNCwgMHgwNjM1LCAweDA2NDQsIDB4MDYzOSwgMHgwNjQ1LCAweDAwMDQsCisgICAgMHgwNjMxLCAweDA2MzMsIDB4MDY0OCwgMHgwNjQ0LCAweDAwMDQsIDB4MDYzOSwgMHgwNjQ0LCAweDA2NEEsIDB4MDY0NywKKyAgICAweDAwMDQsIDB4MDY0OCwgMHgwNjMzLCAweDA2NDQsIDB4MDY0NSwgMHgwMDEyLCAweDA2MzUsIDB4MDY0NCwgMHgwNjQ5LAorICAgIDB4MDAyMCwgMHgwNjI3LCAweDA2NDQsIDB4MDY0NCwgMHgwNjQ3LCAweDAwMjAsIDB4MDYzOSwgMHgwNjQ0LCAweDA2NEEsCisgICAgMHgwNjQ3LCAweDAwMjAsIDB4MDY0OCwgMHgwNjMzLCAweDA2NDQsIDB4MDY0NSwgMHgwMDA4LCAweDA2MkMsIDB4MDY0NCwKKyAgICAweDAwMjAsIDB4MDYyQywgMHgwNjQ0LCAweDA2MjcsIDB4MDY0NCwgMHgwNjQ3LCAweDAwMDQsIDB4MDYzMSwgMHgwNkNDLAorICAgIDB4MDYyNywgMHgwNjQ0fTsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2ZwZGZ0ZXh0L3VuaWNvZGVub3JtYWxpemF0aW9uZGF0YS5oIGIvY29yZS9zcmMvZnBkZnRleHQvdW5pY29kZW5vcm1hbGl6YXRpb25kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmMDdiMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2ZwZGZ0ZXh0L3VuaWNvZGVub3JtYWxpemF0aW9uZGF0YS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE1IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX1NSQ19GUERGVEVYVF9VTklDT0RFTk9STUFMSVpBVElPTkRBVEFfSF8KKyNkZWZpbmUgQ09SRV9TUkNfRlBERlRFWFRfVU5JQ09ERU5PUk1BTElaQVRJT05EQVRBX0hfCisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmgiCisKK2V4dGVybiBjb25zdCBGWF9XQ0hBUiBnX1VuaWNvZGVEYXRhX05vcm1hbGl6YXRpb25bXTsKK2V4dGVybiBjb25zdCBGWF9XQ0hBUiBnX1VuaWNvZGVEYXRhX05vcm1hbGl6YXRpb25fTWFwMVtdOworZXh0ZXJuIGNvbnN0IEZYX1dDSEFSIGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvbl9NYXAyW107CitleHRlcm4gY29uc3QgRlhfV0NIQVIgZ19Vbmljb2RlRGF0YV9Ob3JtYWxpemF0aW9uX01hcDNbXTsKK2V4dGVybiBjb25zdCBGWF9XQ0hBUiBnX1VuaWNvZGVEYXRhX05vcm1hbGl6YXRpb25fTWFwNFtdOworCisjZW5kaWYgIC8vIENPUkVfU1JDX0ZQREZURVhUX1VOSUNPREVOT1JNQUxJWkFUSU9OREFUQV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhfanBlZ2xpYi5oIGIvY29yZS9zcmMvZnhfanBlZ2xpYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDk4MDA4Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4X2pwZWdsaWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgQ09SRV9TUkNfRlhfSlBFR0xJQl9IXwotI2RlZmluZSBDT1JFX1NSQ19GWF9KUEVHTElCX0hfCi0KLSNpbmNsdWRlICJmeGNvZGVjL2xpYmpwZWcvanBlZ2xpYi5oIgotCi0jZW5kaWYgIC8vIENPUkVfU1JDX0ZYX0pQRUdMSUJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4X3psaWIuaCBiL2NvcmUvc3JjL2Z4X3psaWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlMjc3NC4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meF96bGliLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfU1JDX0ZYX1pMSUJfSF8KLSNkZWZpbmUgQ09SRV9TUkNfRlhfWkxJQl9IXwotCi0jaW5jbHVkZSAiZnhjb2RlYy9meF96bGliL3psaWJfdjEyOC96bGliLmgiCi0KLSNlbmRpZiAgLy8gQ09SRV9TUkNfRlhfWkxJQl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9ERVBTIGIvY29yZS9zcmMvZnhjb2RlYy9ERVBTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4OGIzMjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL0RFUFMKQEAgLTAsMCArMSw4IEBACitpbmNsdWRlX3J1bGVzID0gWworICAnK3RoaXJkX3BhcnR5L2xjbXMyLTIuNicsCisgICcrdGhpcmRfcGFydHkvbGlianBlZy9qcGVnbGliLmgnLAorICAjIEZvciBub24tc3RhbmRhbG9uZSBidWlsZHMgdGhhdCBtYXkgdXNlIGxpYmpwZWdfdHVyYm8uCisgICcrdGhpcmRfcGFydHkvbGlianBlZ190dXJiby9qcGVnbGliLmgnLAorICAnK3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAnLAorICAnK3RoaXJkX3BhcnR5L3psaWJfdjEyOCcsCitdCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2NvZGVjX2ludC5oIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9jb2RlY19pbnQuaAppbmRleCAyYjY5M2U4Li43MDcwODhlIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2NvZGVjX2ludC5oCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvY29kZWNfaW50LmgKQEAgLTEsMjk5ICsxLDQyNyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIENPUkVfU1JDX0ZYQ09ERUNfQ09ERUNfQ09ERUNfSU5UX0hfCiAjZGVmaW5lIENPUkVfU1JDX0ZYQ09ERUNfQ09ERUNfQ09ERUNfSU5UX0hfCiAKICNpbmNsdWRlIDxsaW1pdHMuaD4KKwogI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIgotI2luY2x1ZGUgIi4uL2piaWcyL0pCaWcyX0NvbnRleHQuaCIKLSNpbmNsdWRlICIuLi9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL29wZW5qcGVnLmgiICAvLyBGb3IgT1BKX1NJWkVfVC4KKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIgorI2luY2x1ZGUgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQ29udGV4dC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BlbmpwZWcuaCIgIC8vIEZvciBPUEpfU0laRV9ULgogCi1jbGFzcyBDQ29kZWNfQmFzaWNNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX0Jhc2ljTW9kdWxlCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBGWF9CT09MCVJ1bkxlbmd0aEVuY29kZShjb25zdCBGWF9CWVRFKiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgRlhfTFBCWVRFJiBkZXN0X2J1ZiwKK2NsYXNzIENGWF9JY2NQcm9maWxlQ2FjaGU7CitjbGFzcyBDRlhfSWNjVHJhbnNmb3JtQ2FjaGU7CitjbGFzcyBDUERGX0NvbG9yU3BhY2U7CisKK2NsYXNzIENDb2RlY19CYXNpY01vZHVsZSA6IHB1YmxpYyBJQ29kZWNfQmFzaWNNb2R1bGUgeworIHB1YmxpYzoKKyAgLy8gSUNvZGVjX0Jhc2ljTW9kdWxlOgorICBGWF9CT09MIFJ1bkxlbmd0aEVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBBODVFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgb3ZlcnJpZGU7CisgIElDb2RlY19TY2FubGluZURlY29kZXIqIENyZWF0ZVJ1bkxlbmd0aERlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBicGMpIG92ZXJyaWRlOworfTsKKworY2xhc3MgQ0NvZGVjX1NjYW5saW5lRGVjb2RlciA6IHB1YmxpYyBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyIHsKKyBwdWJsaWM6CisgIENDb2RlY19TY2FubGluZURlY29kZXIoKTsKKyAgfkNDb2RlY19TY2FubGluZURlY29kZXIoKSBvdmVycmlkZTsKKworICAvLyBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyCisgIEZYX0RXT1JEIEdldFNyY09mZnNldCgpIG92ZXJyaWRlIHsgcmV0dXJuIC0xOyB9CisgIHZvaWQgRG93blNjYWxlKGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQpIG92ZXJyaWRlOworICBjb25zdCB1aW50OF90KiBHZXRTY2FubGluZShpbnQgbGluZSkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgU2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsIElGWF9QYXVzZSogcFBhdXNlKSBvdmVycmlkZTsKKyAgaW50IEdldFdpZHRoKCkgb3ZlcnJpZGUgeyByZXR1cm4gbV9PdXRwdXRXaWR0aDsgfQorICBpbnQgR2V0SGVpZ2h0KCkgb3ZlcnJpZGUgeyByZXR1cm4gbV9PdXRwdXRIZWlnaHQ7IH0KKyAgaW50IENvdW50Q29tcHMoKSBvdmVycmlkZSB7IHJldHVybiBtX25Db21wczsgfQorICBpbnQgR2V0QlBDKCkgb3ZlcnJpZGUgeyByZXR1cm4gbV9icGM7IH0KKyAgRlhfQk9PTCBJc0NvbG9yVHJhbnNmb3JtZWQoKSBvdmVycmlkZSB7IHJldHVybiBtX2JDb2xvclRyYW5zZm9ybWVkOyB9CisgIHZvaWQgQ2xlYXJJbWFnZURhdGEoKSBvdmVycmlkZSB7IG1fcERhdGFDYWNoZS5yZXNldCgpOyB9CisKKyBwcm90ZWN0ZWQ6CisgIGNsYXNzIEltYWdlRGF0YUNhY2hlIHsKKyAgIHB1YmxpYzoKKyAgICBJbWFnZURhdGFDYWNoZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYX0RXT1JEIHBpdGNoKTsKKyAgICB+SW1hZ2VEYXRhQ2FjaGUoKTsKKworICAgIGJvb2wgQWxsb2NhdGVDYWNoZSgpOworICAgIHZvaWQgQXBwZW5kTGluZShjb25zdCB1aW50OF90KiBsaW5lKTsKKworICAgIGludCBOdW1MaW5lcygpIGNvbnN0IHsgcmV0dXJuIG1fbkNhY2hlZExpbmVzOyB9CisgICAgY29uc3QgdWludDhfdCogR2V0TGluZShpbnQgbGluZSkgY29uc3Q7CisgICAgYm9vbCBJc1NhbWVEaW1lbnNpb25zKGludCB3aWR0aCwgaW50IGhlaWdodCkgY29uc3QgeworICAgICAgcmV0dXJuIHdpZHRoID09IG1fV2lkdGggJiYgaGVpZ2h0ID09IG1fSGVpZ2h0OworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBib29sIElzVmFsaWQoKSBjb25zdCB7IHJldHVybiBtX0RhdGEuZ2V0KCkgIT0gbnVsbHB0cjsgfQorCisgICAgY29uc3QgaW50IG1fV2lkdGg7CisgICAgY29uc3QgaW50IG1fSGVpZ2h0OworICAgIGNvbnN0IEZYX0RXT1JEIG1fUGl0Y2g7CisgICAgaW50IG1fbkNhY2hlZExpbmVzOworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90LCBGeEZyZWVEZWxldGVyPiBtX0RhdGE7CisgIH07CisKKyAgdmlydHVhbCBGWF9CT09MIHZfUmV3aW5kKCkgPSAwOworICB2aXJ0dWFsIHVpbnQ4X3QqIHZfR2V0TmV4dExpbmUoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCB2X0Rvd25TY2FsZShpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0KSA9IDA7CisKKyAgdWludDhfdCogUmVhZE5leHRMaW5lKCk7CisKKyAgaW50IG1fT3JpZ1dpZHRoOworICBpbnQgbV9PcmlnSGVpZ2h0OworICBpbnQgbV9Eb3duU2NhbGU7CisgIGludCBtX091dHB1dFdpZHRoOworICBpbnQgbV9PdXRwdXRIZWlnaHQ7CisgIGludCBtX25Db21wczsKKyAgaW50IG1fYnBjOworICBGWF9EV09SRCBtX1BpdGNoOworICBGWF9CT09MIG1fYkNvbG9yVHJhbnNmb3JtZWQ7CisgIGludCBtX05leHRMaW5lOworICB1aW50OF90KiBtX3BMYXN0U2NhbmxpbmU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJbWFnZURhdGFDYWNoZT4gbV9wRGF0YUNhY2hlOworfTsKKworY2xhc3MgQ0NvZGVjX0ZheE1vZHVsZSA6IHB1YmxpYyBJQ29kZWNfRmF4TW9kdWxlIHsKKyBwdWJsaWM6CisgIC8vIElDb2RlY19GYXhNb2R1bGU6CisgIElDb2RlY19TY2FubGluZURlY29kZXIqIENyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIEVuZE9mTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIEVuY29kZWRCeXRlQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBCbGFja0lzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgUm93cykgb3ZlcnJpZGU7CisgIEZYX0JPT0wgRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgaW50IHBpdGNoLAorICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpIG92ZXJyaWRlOworfTsKKworY2xhc3MgQ0NvZGVjX0ZsYXRlTW9kdWxlIDogcHVibGljIElDb2RlY19GbGF0ZU1vZHVsZSB7CisgcHVibGljOgorICB2aXJ0dWFsIElDb2RlY19TY2FubGluZURlY29kZXIqIENyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWRpY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2xvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQml0c1BlckNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2x1bW5zKTsKKyAgdmlydHVhbCBGWF9EV09SRCBGbGF0ZU9yTFpXRGVjb2RlKEZYX0JPT0wgYkxaVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkVhcmx5Q2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWRpY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2xvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQml0c1BlckNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZXN0aW1hdGVkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJQTg1RW5jb2RlKGNvbnN0IEZYX0JZVEUqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBGWF9MUEJZVEUmIGRlc3RfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7Ci0gICAgdmlydHVhbCBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKglDcmVhdGVSdW5MZW5ndGhEZWNvZGVyKEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgIGludCBuQ29tcHMsIGludCBicGMpOworICB2aXJ0dWFsIEZYX0JPT0wgRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWRpY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCaXRzUGVyQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKTsKKyAgdmlydHVhbCBGWF9CT09MIEVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKTsKIH07Ci1zdHJ1Y3QgQ0NvZGVjX0ltYWdlRGF0YUNhY2hlIHsKLSAgICBpbnQJCQltX1dpZHRoLCBtX0hlaWdodDsKLSAgICBpbnQJCQltX25DYWNoZWRMaW5lczsKLSAgICBGWF9CWVRFCQltX0RhdGE7CisKK2NsYXNzIENDb2RlY19KcGVnTW9kdWxlIDogcHVibGljIElDb2RlY19KcGVnTW9kdWxlIHsKKyBwdWJsaWM6CisgIENDb2RlY19KcGVnTW9kdWxlKCkge30KKyAgSUNvZGVjX1NjYW5saW5lRGVjb2RlciogQ3JlYXRlRGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBDb2xvclRyYW5zZm9ybSkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgTG9hZEluZm8oY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBpbnQmIHdpZHRoLAorICAgICAgICAgICAgICAgICAgIGludCYgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgIGludCYgbnVtX2NvbXBvbmVudHMsCisgICAgICAgICAgICAgICAgICAgaW50JiBiaXRzX3Blcl9jb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGNvbG9yX3RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICB1aW50OF90KiogaWNjX2J1Zl9wdHIsCisgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIGljY19sZW5ndGgpIG92ZXJyaWRlOworICBGWF9CT09MIEVuY29kZShjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLAorICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgIEZYX1NUUlNJWkUmIGRlc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgaW50IHF1YWxpdHksCisgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGljY19idWYsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGljY19sZW5ndGgpIG92ZXJyaWRlOworICB2b2lkKiBTdGFydCgpIG92ZXJyaWRlOworICB2b2lkIEZpbmlzaCh2b2lkKiBwQ29udGV4dCkgb3ZlcnJpZGU7CisgIHZvaWQgSW5wdXQodm9pZCogcENvbnRleHQsCisgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSkgb3ZlcnJpZGU7CisjaWZuZGVmIFBERl9FTkFCTEVfWEZBCisgIGludCBSZWFkSGVhZGVyKHZvaWQqIHBDb250ZXh0LCBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCwgaW50KiBuQ29tcHMpIG92ZXJyaWRlOworI2Vsc2UgICAvLyBQREZfRU5BQkxFX1hGQQorICBpbnQgUmVhZEhlYWRlcih2b2lkKiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwKKyAgICAgICAgICAgICAgICAgaW50KiBoZWlnaHQsCisgICAgICAgICAgICAgICAgIGludCogbkNvbXBzLAorICAgICAgICAgICAgICAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKSBvdmVycmlkZTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgaW50IFN0YXJ0U2NhbmxpbmUodm9pZCogcENvbnRleHQsIGludCBkb3duX3NjYWxlKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBSZWFkU2NhbmxpbmUodm9pZCogcENvbnRleHQsIHVpbnQ4X3QqIGRlc3RfYnVmKSBvdmVycmlkZTsKKyAgRlhfRFdPUkQgR2V0QXZhaWxJbnB1dCh2b2lkKiBwQ29udGV4dCwgdWludDhfdCoqIGF2YWlsX2J1Zl9wdHIpIG92ZXJyaWRlOwogfTsKLWNsYXNzIENDb2RlY19TY2FubGluZURlY29kZXIgOiBwdWJsaWMgSUNvZGVjX1NjYW5saW5lRGVjb2RlcgotewotcHVibGljOgogCi0gICAgQ0NvZGVjX1NjYW5saW5lRGVjb2RlcigpOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisjZGVmaW5lIFBOR19FUlJPUl9TSVpFIDI1NgorY2xhc3MgQ0NvZGVjX1BuZ01vZHVsZSA6IHB1YmxpYyBJQ29kZWNfUG5nTW9kdWxlIHsKKyBwdWJsaWM6CisgIENDb2RlY19QbmdNb2R1bGUoKSB7IEZYU1lTX21lbXNldChtX3N6TGFzdEVycm9yLCAnXDAnLCBQTkdfRVJST1JfU0laRSk7IH0KIAotICAgIHZpcnR1YWwgfkNDb2RlY19TY2FubGluZURlY29kZXIoKTsKKyAgdmlydHVhbCB2b2lkKiBTdGFydCh2b2lkKiBwTW9kdWxlKTsKKyAgdmlydHVhbCB2b2lkIEZpbmlzaCh2b2lkKiBwQ29udGV4dCk7CisgIHZpcnR1YWwgRlhfQk9PTCBJbnB1dCh2b2lkKiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpOwogCi0gICAgdmlydHVhbCBGWF9EV09SRAlHZXRTcmNPZmZzZXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZAkJRG93blNjYWxlKGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQpOwotCi0gICAgRlhfTFBCWVRFCQkJR2V0U2NhbmxpbmUoaW50IGxpbmUpOwotCi0gICAgRlhfQk9PTAkJCQlTa2lwVG9TY2FubGluZShpbnQgbGluZSwgSUZYX1BhdXNlKiBwUGF1c2UpOwotCi0gICAgaW50CQkJCQlHZXRXaWR0aCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9PdXRwdXRXaWR0aDsKLSAgICB9Ci0KLSAgICBpbnQJCQkJCUdldEhlaWdodCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9PdXRwdXRIZWlnaHQ7Ci0gICAgfQotCi0gICAgaW50CQkJCQlDb3VudENvbXBzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX25Db21wczsKLSAgICB9Ci0KLSAgICBpbnQJCQkJCUdldEJQQygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9icGM7Ci0gICAgfQotCi0gICAgRlhfQk9PTAkJCQlJc0NvbG9yVHJhbnNmb3JtZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYkNvbG9yVHJhbnNmb3JtZWQ7Ci0gICAgfQotCi0gICAgdm9pZAkJCQlDbGVhckltYWdlRGF0YSgpCi0gICAgewotICAgICAgICBpZiAobV9wRGF0YUNhY2hlKSB7Ci0gICAgICAgICAgICBGWF9GcmVlKG1fcERhdGFDYWNoZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wRGF0YUNhY2hlID0gTlVMTDsKLSAgICB9Ci1wcm90ZWN0ZWQ6Ci0KLSAgICBpbnQJCQkJCW1fT3JpZ1dpZHRoOwotCi0gICAgaW50CQkJCQltX09yaWdIZWlnaHQ7Ci0KLSAgICBpbnQJCQkJCW1fRG93blNjYWxlOwotCi0gICAgaW50CQkJCQltX091dHB1dFdpZHRoOwotCi0gICAgaW50CQkJCQltX091dHB1dEhlaWdodDsKLQotICAgIGludAkJCQkJbV9uQ29tcHM7Ci0KLSAgICBpbnQJCQkJCW1fYnBjOwotCi0gICAgaW50CQkJCQltX1BpdGNoOwotCi0gICAgRlhfQk9PTAkJCQltX2JDb2xvclRyYW5zZm9ybWVkOwotCi0gICAgRlhfTFBCWVRFCQkJUmVhZE5leHRMaW5lKCk7Ci0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCXZfUmV3aW5kKCkgPSAwOwotCi0gICAgdmlydHVhbCBGWF9MUEJZVEUJdl9HZXROZXh0TGluZSgpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZAkJdl9Eb3duU2NhbGUoaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCkgPSAwOwotCi0gICAgaW50CQkJCQltX05leHRMaW5lOwotCi0gICAgRlhfTFBCWVRFCQkJbV9wTGFzdFNjYW5saW5lOwotCi0gICAgQ0NvZGVjX0ltYWdlRGF0YUNhY2hlKgltX3BEYXRhQ2FjaGU7CisgcHJvdGVjdGVkOgorICBGWF9DSEFSIG1fc3pMYXN0RXJyb3JbUE5HX0VSUk9SX1NJWkVdOwogfTsKLWNsYXNzIENDb2RlY19GYXhNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX0ZheE1vZHVsZQotewotcHVibGljOgotICAgIHZpcnR1YWwgSUNvZGVjX1NjYW5saW5lRGVjb2RlcioJQ3JlYXRlRGVjb2RlcihGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICBpbnQgSywgRlhfQk9PTCBFbmRPZkxpbmUsIEZYX0JPT0wgRW5jb2RlZEJ5dGVBbGlnbiwgRlhfQk9PTCBCbGFja0lzMSwgaW50IENvbHVtbnMsIGludCBSb3dzKTsKLSAgICBGWF9CT09MCQlFbmNvZGUoRlhfTFBDQllURSBzcmNfYnVmLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwaXRjaCwgRlhfTFBCWVRFJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7Ci19OwotY2xhc3MgQ0NvZGVjX0ZsYXRlTW9kdWxlIDogcHVibGljIElDb2RlY19GbGF0ZU1vZHVsZQotewotcHVibGljOgotICAgIHZpcnR1YWwgSUNvZGVjX1NjYW5saW5lRGVjb2RlcioJQ3JlYXRlRGVjb2RlcihGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICBpbnQgbkNvbXBzLCBpbnQgYnBjLCBpbnQgcHJlZGljdG9yLCBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMpOwotICAgIHZpcnR1YWwgRlhfRFdPUkQgRmxhdGVPckxaV0RlY29kZShGWF9CT09MIGJMWlcsIGNvbnN0IEZYX0JZVEUqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBGWF9CT09MIGJFYXJseUNoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWRpY3RvciwgaW50IENvbG9ycywgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBlc3RpbWF0ZWRfc2l6ZSwgRlhfTFBCWVRFJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MIEVuY29kZShjb25zdCBGWF9CWVRFKiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVkaWN0b3IsIGludCBDb2xvcnMsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJRW5jb2RlKEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIEZYX0xQQllURSYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpOwotfTsKLWNsYXNzIENDb2RlY19KcGVnTW9kdWxlIDogcHVibGljIElDb2RlY19KcGVnTW9kdWxlCi17Ci1wdWJsaWM6Ci0gICAgQ0NvZGVjX0pwZWdNb2R1bGUoKSA6IG1fcEV4dFByb3ZpZGVyKE5VTEwpIHt9Ci0gICAgdm9pZCBTZXRQb3ZpZGVyKElGWF9KcGVnUHJvdmlkZXIqIHBKUCkKLSAgICB7Ci0gICAgICAgIG1fcEV4dFByb3ZpZGVyID0gcEpQOwotICAgIH0KLSAgICBJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKglDcmVhdGVEZWNvZGVyKEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBuQ29tcHMsIEZYX0JPT0wgQ29sb3JUcmFuc2Zvcm0pOwotICAgIEZYX0JPT0wJCUxvYWRJbmZvKEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCYgd2lkdGgsIGludCYgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbnVtX2NvbXBvbmVudHMsIGludCYgYml0c19wZXJfY29tcG9uZW50cywgRlhfQk9PTCYgY29sb3JfdHJhbnNmb3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSogaWNjX2J1Zl9wdHIsIEZYX0RXT1JEKiBpY2NfbGVuZ3RoKTsKLSAgICBGWF9CT09MCQlFbmNvZGUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfTFBCWVRFJiBkZXN0X2J1ZiwgRlhfU1RSU0laRSYgZGVzdF9zaXplLCBpbnQgcXVhbGl0eSwgRlhfTFBDQllURSBpY2NfYnVmLCBGWF9EV09SRCBpY2NfbGVuZ3RoKTsKLSAgICB2aXJ0dWFsIHZvaWQqCQlTdGFydCgpOwotICAgIHZpcnR1YWwgdm9pZAkJRmluaXNoKHZvaWQqIHBDb250ZXh0KTsKLSAgICB2aXJ0dWFsIHZvaWQJCUlucHV0KHZvaWQqIHBDb250ZXh0LCBGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplKTsKLSAgICB2aXJ0dWFsIGludAkJCVJlYWRIZWFkZXIodm9pZCogcENvbnRleHQsIGludCogd2lkdGgsIGludCogaGVpZ2h0LCBpbnQqIG5Db21wcyk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlTdGFydFNjYW5saW5lKHZvaWQqIHBDb250ZXh0LCBpbnQgZG93bl9zY2FsZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlSZWFkU2NhbmxpbmUodm9pZCogcENvbnRleHQsIEZYX0xQQllURSBkZXN0X2J1Zik7Ci0gICAgdmlydHVhbCBGWF9EV09SRAlHZXRBdmFpbElucHV0KHZvaWQqIHBDb250ZXh0LCBGWF9MUEJZVEUqIGF2YWlsX2J1Zl9wdHIpOwotcHJvdGVjdGVkOgotICAgIElGWF9KcGVnUHJvdmlkZXIqIG1fcEV4dFByb3ZpZGVyOwotfTsKLWNsYXNzIENDb2RlY19JY2NNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX0ljY01vZHVsZQotewotcHVibGljOgotICAgIHZpcnR1YWwgSWNjQ1MJCQlHZXRQcm9maWxlQ1MoRlhfTFBDQllURSBwUHJvZmlsZURhdGEsIHVuc2lnbmVkIGludCBkd1Byb2ZpbGVTaXplKTsKLSAgICB2aXJ0dWFsIEljY0NTCQkJR2V0UHJvZmlsZUNTKElGWF9GaWxlUmVhZCogcEZpbGUpOwotICAgIHZpcnR1YWwgRlhfTFBWT0lECQlDcmVhdGVUcmFuc2Zvcm0oSUNvZGVjX0ljY01vZHVsZTo6SWNjUGFyYW0qIHBJbnB1dFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ29kZWNfSWNjTW9kdWxlOjpJY2NQYXJhbSogcE91dHB1dFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ29kZWNfSWNjTW9kdWxlOjpJY2NQYXJhbSogcFByb29mUGFyYW0gPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ludGVudCA9IEljY19JTlRFTlRfUEVSQ0VQVFVBTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFnID0gSWNjX0ZMQUdTX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3UHJmSW50ZW50ID0gSWNjX0lOVEVOVF9BQlNPTFVURV9DT0xPUklNRVRSSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3UHJmRmxhZyA9IEljY19GTEFHU19TT0ZUUFJPT0ZJTkcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICB2aXJ0dWFsIEZYX0xQVk9JRAkJQ3JlYXRlVHJhbnNmb3JtX3NSR0IoRlhfTFBDQllURSBwUHJvZmlsZURhdGEsIEZYX0RXT1JEIGR3UHJvZmlsZVNpemUsIEZYX0lOVDMyJiBuQ29tcG9uZW50cywgRlhfSU5UMzIgaW50ZW50ID0gMCwKLSAgICAgICAgICAgIEZYX0RXT1JEIGR3U3JjRm9ybWF0ID0gSWNjX0ZPUk1BVF9ERUZBVUxUKTsKLSAgICB2aXJ0dWFsIEZYX0xQVk9JRAkJQ3JlYXRlVHJhbnNmb3JtX0NNWUsoRlhfTFBDQllURSBwU3JjUHJvZmlsZURhdGEsIEZYX0RXT1JEIGR3U3JjUHJvZmlsZVNpemUsIEZYX0lOVDMyJiBuU3JjQ29tcG9uZW50cywKLSAgICAgICAgICAgIEZYX0xQQ0JZVEUgcERzdFByb2ZpbGVEYXRhLCBGWF9EV09SRCBkd0RzdFByb2ZpbGVTaXplLCBGWF9JTlQzMiBpbnRlbnQgPSAwLAotICAgICAgICAgICAgRlhfRFdPUkQgZHdTcmNGb3JtYXQgPSBJY2NfRk9STUFUX0RFRkFVTFQsCi0gICAgICAgICAgICBGWF9EV09SRCBkd0RzdEZvcm1hdCA9IEljY19GT1JNQVRfREVGQVVMVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgdmlydHVhbCB2b2lkCQkJRGVzdHJveVRyYW5zZm9ybShGWF9MUFZPSUQgcFRyYW5zZm9ybSk7Ci0gICAgdmlydHVhbCB2b2lkCQkJVHJhbnNsYXRlKEZYX0xQVk9JRCBwVHJhbnNmb3JtLCBGWF9GTE9BVCogcFNyY1ZhbHVlcywgRlhfRkxPQVQqIHBEZXN0VmFsdWVzKTsKLSAgICB2aXJ0dWFsIHZvaWQJCQlUcmFuc2xhdGVTY2FubGluZShGWF9MUFZPSUQgcFRyYW5zZm9ybSwgRlhfTFBCWVRFIHBEZXN0LCBGWF9MUENCWVRFIHBTcmMsIGludCBwaXhlbHMpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIFNldENvbXBvbmVudHMoRlhfRFdPUkQgbkNvbXBvbmVudHMpIHttX25Db21wb25lbnRzID0gbkNvbXBvbmVudHM7fQotICAgIHZpcnR1YWwgfkNDb2RlY19JY2NNb2R1bGUoKTsKLXByb3RlY3RlZDoKLSAgICBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyCQltX01hcFRyYW5mb3JtOwotICAgIENGWF9NYXBCeXRlU3RyaW5nVG9QdHIJCW1fTWFwUHJvZmlsZTsKLSAgICBGWF9EV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25Db21wb25lbnRzOwotICAgIHR5cGVkZWYgZW51bSB7Ci0gICAgICAgIEljY19DTEFTU19JTlBVVCA9IDAsCi0gICAgICAgIEljY19DTEFTU19PVVRQVVQsCi0gICAgICAgIEljY19DTEFTU19QUk9PRiwKLSAgICAgICAgSWNjX0NMQVNTX01BWAotICAgIH0gSWNjX0NMQVNTOwotICAgIEZYX0xQVk9JRAkJQ3JlYXRlUHJvZmlsZShJQ29kZWNfSWNjTW9kdWxlOjpJY2NQYXJhbSogcEljY1BhcmFtLCBJY2NfQ0xBU1MgaWMsIENGWF9CaW5hcnlCdWYqIHBUcmFuc2Zvcm1LZXkpOwotfTsKLWNsYXNzIENDb2RlY19KcHhNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX0pweE1vZHVsZQotewotcHVibGljOgotICAgIENDb2RlY19KcHhNb2R1bGUoKTsKLSAgICB2b2lkKgkJQ3JlYXRlRGVjb2RlcihGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBGWF9CT09MIHVzZUNvbG9yU3BhY2UgPSBGQUxTRSk7Ci0gICAgdm9pZAkJR2V0SW1hZ2VJbmZvKEZYX0xQVk9JRCBjdHgsIEZYX0RXT1JEJiB3aWR0aCwgRlhfRFdPUkQmIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGNvZGVzdHJlYW1fbkNvbXBzLCBGWF9EV09SRCYgb3V0cHV0X25Db21wcyk7Ci0gICAgRlhfQk9PTAkJRGVjb2RlKHZvaWQqIGN0eCwgRlhfTFBCWVRFIGRlc3RfZGF0YSwgaW50IHBpdGNoLCBGWF9CT09MIGJUcmFuc2xhdGVDb2xvciwgRlhfTFBCWVRFIG9mZnNldHMpOwotICAgIHZvaWQJCURlc3Ryb3lEZWNvZGVyKHZvaWQqIGN0eCk7Ci19OwotY2xhc3MgQ1BERl9KYmlnMkludGVyZmFjZSA6IHB1YmxpYyBDSkJpZzJfTW9kdWxlCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB2b2lkICpKQmlnMl9NYWxsb2MoRlhfRFdPUkQgZHdTaXplKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZYX0FsbG9jKEZYX0JZVEUsIGR3U2l6ZSk7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCAqSkJpZzJfTWFsbG9jMihGWF9EV09SRCBudW0sIEZYX0RXT1JEIGR3U2l6ZSkKLSAgICB7Ci0gICAgICAgIGlmIChkd1NpemUgJiYgbnVtID49IFVJTlRfTUFYIC8gZHdTaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRlhfQWxsb2MoRlhfQllURSwgbnVtICogZHdTaXplKTsKLSAgICB9Ci0gICAgdmlydHVhbCB2b2lkICpKQmlnMl9NYWxsb2MzKEZYX0RXT1JEIG51bSwgRlhfRFdPUkQgZHdTaXplLCBGWF9EV09SRCBkd1NpemUyKQotICAgIHsKLSAgICAgICAgaWYgKGR3U2l6ZTIgJiYgZHdTaXplID49IFVJTlRfTUFYIC8gZHdTaXplMikgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRFdPUkQgc2l6ZSA9IGR3U2l6ZTIgKiBkd1NpemU7Ci0gICAgICAgIGlmIChzaXplICYmIG51bSA+PSBVSU5UX01BWCAvIHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGWF9BbGxvYyhGWF9CWVRFLCBudW0gKiBzaXplKTsKLSAgICB9Ci0gICAgdmlydHVhbCB2b2lkICpKQmlnMl9SZWFsbG9jKEZYX0xQVk9JRCBwTWVtLCBGWF9EV09SRCBkd1NpemUpCi0gICAgewotICAgICAgICByZXR1cm4gRlhfUmVhbGxvYyhGWF9CWVRFLCBwTWVtLCBkd1NpemUpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgSkJpZzJfRnJlZShGWF9MUFZPSUQgcE1lbSkKLSAgICB7Ci0gICAgICAgIEZYX0ZyZWUocE1lbSk7Ci0gICAgfQotfTsKLWNsYXNzIENDb2RlY19KYmlnMkNvbnRleHQgCi17Ci1wdWJsaWM6Ci0gICAgQ0NvZGVjX0piaWcyQ29udGV4dCgpOwotICAgIH5DQ29kZWNfSmJpZzJDb250ZXh0KCkge307Ci0gICAgSUZYX0ZpbGVSZWFkKiBtX2ZpbGVfcHRyOwotICAgIEZYX0RXT1JEIG1fd2lkdGg7Ci0gICAgRlhfRFdPUkQgbV9oZWlnaHQ7Ci0gICAgRlhfTFBCWVRFIG1fc3JjX2J1ZjsKLSAgICBGWF9EV09SRCBtX3NyY19zaXplOwotICAgIEZYX0xQQ0JZVEUgbV9nbG9iYWxfZGF0YTsKLSAgICBGWF9EV09SRCBtX2dsb2JhbF9zaXplOwotICAgIEZYX0xQQllURSBtX2Rlc3RfYnVmOwotICAgIEZYX0RXT1JEIG1fZGVzdF9waXRjaDsKLSAgICBGWF9CT09MCW1fYkZpbGVSZWFkZXI7Ci0gICAgSUZYX1BhdXNlKiBtX3BQYXVzZTsKLSAgICBDSkJpZzJfQ29udGV4dCogbV9wQ29udGV4dDsKLSAgICBDSkJpZzJfSW1hZ2UqIG1fZGVzdF9pbWFnZTsKLX07Ci1jbGFzcyBDQ29kZWNfSmJpZzJNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX0piaWcyTW9kdWxlCi17Ci1wdWJsaWM6Ci0gICAgQ0NvZGVjX0piaWcyTW9kdWxlKCkge307Ci0gICAgfkNDb2RlY19KYmlnMk1vZHVsZSgpOwotICAgIEZYX0JPT0wJCURlY29kZShGWF9EV09SRCB3aWR0aCwgRlhfRFdPUkQgaGVpZ2h0LCBGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICBGWF9MUENCWVRFIGdsb2JhbF9kYXRhLCBGWF9EV09SRCBnbG9iYWxfc2l6ZSwgRlhfTFBCWVRFIGRlc3RfYnVmLCBGWF9EV09SRCBkZXN0X3BpdGNoKTsKLSAgICBGWF9CT09MCQlEZWNvZGUoSUZYX0ZpbGVSZWFkKiBmaWxlX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHdpZHRoLCBGWF9EV09SRCYgaGVpZ2h0LCBGWF9EV09SRCYgcGl0Y2gsIEZYX0xQQllURSYgZGVzdF9idWYpOwotICAgIHZvaWQqCQkJCUNyZWF0ZUpiaWcyQ29udGV4dCgpOwotICAgIEZYQ09ERUNfU1RBVFVTCQlTdGFydERlY29kZSh2b2lkKiBwSmJpZzJDb250ZXh0LCBGWF9EV09SRCB3aWR0aCwgRlhfRFdPUkQgaGVpZ2h0LCBGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBDQllURSBnbG9iYWxfZGF0YSwgRlhfRFdPUkQgZ2xvYmFsX3NpemUsIEZYX0xQQllURSBkZXN0X2J1ZiwgRlhfRFdPUkQgZGVzdF9waXRjaCwgSUZYX1BhdXNlKiBwUGF1c2UpOworY2xhc3MgQ0NvZGVjX0dpZk1vZHVsZSA6IHB1YmxpYyBJQ29kZWNfR2lmTW9kdWxlIHsKKyBwdWJsaWM6CisgIENDb2RlY19HaWZNb2R1bGUoKSB7IEZYU1lTX21lbXNldChtX3N6TGFzdEVycm9yLCAnXDAnLCAyNTYpOyB9CisgIHZpcnR1YWwgdm9pZCogU3RhcnQodm9pZCogcE1vZHVsZSk7CisgIHZpcnR1YWwgdm9pZCBGaW5pc2godm9pZCogcENvbnRleHQpOworICB2aXJ0dWFsIEZYX0RXT1JEIEdldEF2YWlsSW5wdXQodm9pZCogcENvbnRleHQsIHVpbnQ4X3QqKiBhdmFpbF9idWZfcHRyKTsKKyAgdmlydHVhbCB2b2lkIElucHV0KHZvaWQqIHBDb250ZXh0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSk7CiAKLSAgICBGWENPREVDX1NUQVRVUwkJU3RhcnREZWNvZGUodm9pZCogcEpiaWcyQ29udGV4dCwgSUZYX0ZpbGVSZWFkKiBmaWxlX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiB3aWR0aCwgRlhfRFdPUkQmIGhlaWdodCwgRlhfRFdPUkQmIHBpdGNoLCBGWF9MUEJZVEUmIGRlc3RfYnVmLCBJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gICAgRlhDT0RFQ19TVEFUVVMJCUNvbnRpbnVlRGVjb2RlKHZvaWQqIHBKYmlnMkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKTsKLSAgICB2b2lkCQkJCURlc3Ryb3lKYmlnMkNvbnRleHQodm9pZCogcEpiaWcyQ29udGV4dCk7Ci0gICAgQ1BERl9KYmlnMkludGVyZmFjZQltX01vZHVsZTsKLSAgICBzdGQ6Omxpc3Q8Q0pCaWcyX0NhY2hlUGFpcj4gbV9TeW1ib2xEaWN0Q2FjaGU7Ci1wcml2YXRlOgorICB2aXJ0dWFsIGludDMyX3QgUmVhZEhlYWRlcih2b2lkKiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcGFsX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIHBhbF9wcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBiZ19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSk7CisKKyAgdmlydHVhbCBpbnQzMl90IExvYWRGcmFtZUluZm8odm9pZCogcENvbnRleHQsIGludCogZnJhbWVfbnVtKTsKKworICB2aXJ0dWFsIGludDMyX3QgTG9hZEZyYW1lKHZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZV9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSk7CisKKyBwcm90ZWN0ZWQ6CisgIEZYX0NIQVIgbV9zekxhc3RFcnJvclsyNTZdOworfTsKK2NsYXNzIENDb2RlY19CbXBNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX0JtcE1vZHVsZSB7CisgcHVibGljOgorICBDQ29kZWNfQm1wTW9kdWxlKCkgeyBGWFNZU19tZW1zZXQobV9zekxhc3RFcnJvciwgMCwgc2l6ZW9mKG1fc3pMYXN0RXJyb3IpKTsgfQorICB2b2lkKiBTdGFydCh2b2lkKiBwTW9kdWxlKSBvdmVycmlkZTsKKyAgdm9pZCBGaW5pc2godm9pZCogcENvbnRleHQpIG92ZXJyaWRlOworICBGWF9EV09SRCBHZXRBdmFpbElucHV0KHZvaWQqIHBDb250ZXh0LCB1aW50OF90KiogYXZhaWxfYnVmX3B0cikgb3ZlcnJpZGU7CisgIHZvaWQgSW5wdXQodm9pZCogcENvbnRleHQsCisgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSkgb3ZlcnJpZGU7CisgIGludDMyX3QgUmVhZEhlYWRlcih2b2lkKiBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCogdGJfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGNvbXBvbmVudHMsCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBwYWxfbnVtLAorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqKiBwYWxfcHAsCisgICAgICAgICAgICAgICAgICAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKSBvdmVycmlkZTsKKyAgaW50MzJfdCBMb2FkSW1hZ2Uodm9pZCogcENvbnRleHQpIG92ZXJyaWRlOworCisgcHJvdGVjdGVkOgorICBGWF9DSEFSIG1fc3pMYXN0RXJyb3JbMjU2XTsKK307CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKK2NsYXNzIENDb2RlY19JY2NNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX0ljY01vZHVsZSB7CisgcHVibGljOgorICB+Q0NvZGVjX0ljY01vZHVsZSgpIG92ZXJyaWRlOworCisgIC8vIElDb2RlY19JY2NNb2R1bGU6CisgIEljY0NTIEdldFByb2ZpbGVDUyhjb25zdCB1aW50OF90KiBwUHJvZmlsZURhdGEsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZHdQcm9maWxlU2l6ZSkgb3ZlcnJpZGU7CisgIEljY0NTIEdldFByb2ZpbGVDUyhJRlhfRmlsZVJlYWQqIHBGaWxlKSBvdmVycmlkZTsKKyAgdm9pZCogQ3JlYXRlVHJhbnNmb3JtKElDb2RlY19JY2NNb2R1bGU6OkljY1BhcmFtKiBwSW5wdXRQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIElDb2RlY19JY2NNb2R1bGU6OkljY1BhcmFtKiBwT3V0cHV0UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBJQ29kZWNfSWNjTW9kdWxlOjpJY2NQYXJhbSogcFByb29mUGFyYW0gPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdJbnRlbnQgPSBJY2NfSU5URU5UX1BFUkNFUFRVQUwsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWcgPSBJY2NfRkxBR1NfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3UHJmSW50ZW50ID0gSWNjX0lOVEVOVF9BQlNPTFVURV9DT0xPUklNRVRSSUMsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1ByZkZsYWcgPSBJY2NfRkxBR1NfU09GVFBST09GSU5HKSBvdmVycmlkZTsKKyAgdm9pZCogQ3JlYXRlVHJhbnNmb3JtX3NSR0IoCisgICAgICBjb25zdCB1aW50OF90KiBwUHJvZmlsZURhdGEsCisgICAgICBGWF9EV09SRCBkd1Byb2ZpbGVTaXplLAorICAgICAgaW50MzJfdCYgbkNvbXBvbmVudHMsCisgICAgICBpbnQzMl90IGludGVudCA9IDAsCisgICAgICBGWF9EV09SRCBkd1NyY0Zvcm1hdCA9IEljY19GT1JNQVRfREVGQVVMVCkgb3ZlcnJpZGU7CisgIHZvaWQqIENyZWF0ZVRyYW5zZm9ybV9DTVlLKAorICAgICAgY29uc3QgdWludDhfdCogcFNyY1Byb2ZpbGVEYXRhLAorICAgICAgRlhfRFdPUkQgZHdTcmNQcm9maWxlU2l6ZSwKKyAgICAgIGludDMyX3QmIG5TcmNDb21wb25lbnRzLAorICAgICAgY29uc3QgdWludDhfdCogcERzdFByb2ZpbGVEYXRhLAorICAgICAgRlhfRFdPUkQgZHdEc3RQcm9maWxlU2l6ZSwKKyAgICAgIGludDMyX3QgaW50ZW50ID0gMCwKKyAgICAgIEZYX0RXT1JEIGR3U3JjRm9ybWF0ID0gSWNjX0ZPUk1BVF9ERUZBVUxULAorICAgICAgRlhfRFdPUkQgZHdEc3RGb3JtYXQgPSBJY2NfRk9STUFUX0RFRkFVTFQpIG92ZXJyaWRlOworICB2b2lkIERlc3Ryb3lUcmFuc2Zvcm0odm9pZCogcFRyYW5zZm9ybSkgb3ZlcnJpZGU7CisgIHZvaWQgVHJhbnNsYXRlKHZvaWQqIHBUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBwU3JjVmFsdWVzLAorICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcERlc3RWYWx1ZXMpIG92ZXJyaWRlOworICB2b2lkIFRyYW5zbGF0ZVNjYW5saW5lKHZvaWQqIHBUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcERlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxzKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRDb21wb25lbnRzKEZYX0RXT1JEIG5Db21wb25lbnRzKSBvdmVycmlkZSB7CisgICAgbV9uQ29tcG9uZW50cyA9IG5Db21wb25lbnRzOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIGVudW0gSWNjX0NMQVNTIHsKKyAgICBJY2NfQ0xBU1NfSU5QVVQgPSAwLAorICAgIEljY19DTEFTU19PVVRQVVQsCisgICAgSWNjX0NMQVNTX1BST09GLAorICAgIEljY19DTEFTU19NQVgKKyAgfTsKKyAgdm9pZCogQ3JlYXRlUHJvZmlsZShJQ29kZWNfSWNjTW9kdWxlOjpJY2NQYXJhbSogcEljY1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgIEljY19DTEFTUyBpYywKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfQmluYXJ5QnVmKiBwVHJhbnNmb3JtS2V5KTsKKworICBGWF9EV09SRCBtX25Db21wb25lbnRzOworICBzdGQ6Om1hcDxDRlhfQnl0ZVN0cmluZywgQ0ZYX0ljY1RyYW5zZm9ybUNhY2hlKj4gbV9NYXBUcmFuZm9ybTsKKyAgc3RkOjptYXA8Q0ZYX0J5dGVTdHJpbmcsIENGWF9JY2NQcm9maWxlQ2FjaGUqPiBtX01hcFByb2ZpbGU7Cit9OworCitjbGFzcyBDQ29kZWNfSnB4TW9kdWxlIDogcHVibGljIElDb2RlY19KcHhNb2R1bGUgeworIHB1YmxpYzoKKyAgQ0NvZGVjX0pweE1vZHVsZSgpOworICB+Q0NvZGVjX0pweE1vZHVsZSgpIG92ZXJyaWRlOworCisgIC8vIElDb2RlY19KcHhNb2R1bGU6CisgIENKUFhfRGVjb2RlciogQ3JlYXRlRGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0NvbG9yU3BhY2UqIGNzKSBvdmVycmlkZTsKKyAgdm9pZCBHZXRJbWFnZUluZm8oQ0pQWF9EZWNvZGVyKiBwRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogY29tcG9uZW50cykgb3ZlcnJpZGU7CisgIGJvb2wgRGVjb2RlKENKUFhfRGVjb2RlciogcERlY29kZXIsCisgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZGF0YSwKKyAgICAgICAgICAgICAgaW50IHBpdGNoLAorICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgb2Zmc2V0cykgb3ZlcnJpZGU7CisgIHZvaWQgRGVzdHJveURlY29kZXIoQ0pQWF9EZWNvZGVyKiBwRGVjb2Rlcikgb3ZlcnJpZGU7Cit9OworCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK2NsYXNzIENDb2RlY19UaWZmTW9kdWxlIDogcHVibGljIElDb2RlY19UaWZmTW9kdWxlIHsKKyBwdWJsaWM6CisgIC8vIElDb2RlY19UaWZmTW9kdWxlCisgIHZvaWQqIENyZWF0ZURlY29kZXIoSUZYX0ZpbGVSZWFkKiBmaWxlX3B0cikgb3ZlcnJpZGU7CisgIHZvaWQgR2V0RnJhbWVzKHZvaWQqIGN0eCwgaW50MzJfdCYgZnJhbWVzKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBMb2FkRnJhbWVJbmZvKHZvaWQqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGNvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGJwYywKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpIG92ZXJyaWRlOworICBGWF9CT09MIERlY29kZSh2b2lkKiBjdHgsIGNsYXNzIENGWF9ESUJpdG1hcCogcERJQml0bWFwKSBvdmVycmlkZTsKKyAgdm9pZCBEZXN0cm95RGVjb2Rlcih2b2lkKiBjdHgpIG92ZXJyaWRlOworCisgcHJvdGVjdGVkOgorICB+Q0NvZGVjX1RpZmZNb2R1bGUoKSBvdmVycmlkZSB7fQorfTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworY2xhc3MgQ0NvZGVjX0piaWcyQ29udGV4dCB7CisgcHVibGljOgorICBDQ29kZWNfSmJpZzJDb250ZXh0KCk7CisgIH5DQ29kZWNfSmJpZzJDb250ZXh0KCkge30KKworICBGWF9EV09SRCBtX3dpZHRoOworICBGWF9EV09SRCBtX2hlaWdodDsKKyAgQ1BERl9TdHJlYW1BY2MqIG1fcEdsb2JhbFN0cmVhbTsKKyAgQ1BERl9TdHJlYW1BY2MqIG1fcFNyY1N0cmVhbTsKKyAgdWludDhfdCogbV9kZXN0X2J1ZjsKKyAgRlhfRFdPUkQgbV9kZXN0X3BpdGNoOworICBJRlhfUGF1c2UqIG1fcFBhdXNlOworICBDSkJpZzJfQ29udGV4dCogbV9wQ29udGV4dDsKKyAgQ0pCaWcyX0ltYWdlKiBtX2Rlc3RfaW1hZ2U7Cit9OworY2xhc3MgQ0NvZGVjX0piaWcyTW9kdWxlIDogcHVibGljIElDb2RlY19KYmlnMk1vZHVsZSB7CisgcHVibGljOgorICBDQ29kZWNfSmJpZzJNb2R1bGUoKSB7fQorICB+Q0NvZGVjX0piaWcyTW9kdWxlKCkgb3ZlcnJpZGU7CisKKyAgLy8gSUNvZGVjX0piaWcyTW9kdWxlCisgIHZvaWQqIENyZWF0ZUpiaWcyQ29udGV4dCgpIG92ZXJyaWRlOworICBGWENPREVDX1NUQVRVUyBTdGFydERlY29kZSh2b2lkKiBwSmJpZzJDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHJpdmF0ZURhdGEqIHBQcml2YXRlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9TdHJlYW1BY2MqIHNyY19zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtQWNjKiBnbG9iYWxfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpIG92ZXJyaWRlOworICBGWENPREVDX1NUQVRVUyBDb250aW51ZURlY29kZSh2b2lkKiBwSmJpZzJDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgb3ZlcnJpZGU7CisgIHZvaWQgRGVzdHJveUpiaWcyQ29udGV4dCh2b2lkKiBwSmJpZzJDb250ZXh0KSBvdmVycmlkZTsKIH07CiAKIHN0cnVjdCBEZWNvZGVEYXRhIHsKLXB1YmxpYzoKLSAgICBEZWNvZGVEYXRhKHVuc2lnbmVkIGNoYXIqIHNyY19kYXRhLCBPUEpfU0laRV9UIHNyY19zaXplKSA6Ci0gICAgICAgIHNyY19kYXRhKHNyY19kYXRhKSwgc3JjX3NpemUoc3JjX3NpemUpLCBvZmZzZXQoMCkgewotICAgIH0KLSAgICB1bnNpZ25lZCBjaGFyKiBzcmNfZGF0YTsKLSAgICBPUEpfU0laRV9UICAgICBzcmNfc2l6ZTsKLSAgICBPUEpfU0laRV9UICAgICBvZmZzZXQ7CisgcHVibGljOgorICBEZWNvZGVEYXRhKHVuc2lnbmVkIGNoYXIqIHNyY19kYXRhLCBPUEpfU0laRV9UIHNyY19zaXplKQorICAgICAgOiBzcmNfZGF0YShzcmNfZGF0YSksIHNyY19zaXplKHNyY19zaXplKSwgb2Zmc2V0KDApIHt9CisgIHVuc2lnbmVkIGNoYXIqIHNyY19kYXRhOworICBPUEpfU0laRV9UIHNyY19zaXplOworICBPUEpfU0laRV9UIG9mZnNldDsKIH07CiAKK3ZvaWQgc3ljYzQyMF90b19yZ2Iob3BqX2ltYWdlX3QqIGltZyk7CisKIC8qIFdyYXBwZXJzIGZvciBDLXN0eWxlIGNhbGxiYWNrcy4gKi8KLU9QSl9TSVpFX1Qgb3BqX3JlYWRfZnJvbV9tZW1vcnkgKHZvaWQqIHBfYnVmZmVyLCBPUEpfU0laRV9UIG5iX2J5dGVzLCAgdm9pZCogcF91c2VyX2RhdGEpOwotT1BKX1NJWkVfVCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkgKHZvaWQqIHBfYnVmZmVyLCBPUEpfU0laRV9UIG5iX2J5dGVzLCB2b2lkKiBwX3VzZXJfZGF0YSk7Ci1PUEpfT0ZGX1Qgb3BqX3NraXBfZnJvbV9tZW1vcnkgKE9QSl9PRkZfVCBuYl9ieXRlcywgdm9pZCogcF91c2VyX2RhdGEpOwotT1BKX0JPT0wgb3BqX3NlZWtfZnJvbV9tZW1vcnkgKE9QSl9PRkZfVCBuYl9ieXRlcywgdm9pZCogcF91c2VyX2RhdGEpOworT1BKX1NJWkVfVCBvcGpfcmVhZF9mcm9tX21lbW9yeSh2b2lkKiBwX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1NJWkVfVCBuYl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF91c2VyX2RhdGEpOworT1BKX1NJWkVfVCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkodm9pZCogcF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfU0laRV9UIG5iX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF91c2VyX2RhdGEpOworT1BKX09GRl9UIG9wal9za2lwX2Zyb21fbWVtb3J5KE9QSl9PRkZfVCBuYl9ieXRlcywgdm9pZCogcF91c2VyX2RhdGEpOworT1BKX0JPT0wgb3BqX3NlZWtfZnJvbV9tZW1vcnkoT1BKX09GRl9UIG5iX2J5dGVzLCB2b2lkKiBwX3VzZXJfZGF0YSk7CiAKICNlbmRpZiAgLy8gQ09SRV9TUkNfRlhDT0RFQ19DT0RFQ19DT0RFQ19JTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWMuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlYy5jcHAKaW5kZXggYzMyNWNjYy4uODJhNmFlNiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlYy5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlYy5jcHAKQEAgLTQsNDM2ICs0LDQ4NyBAQAogCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCIKKworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKICNpbmNsdWRlICJjb2RlY19pbnQuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfZXh0LmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2xvZ2dpbmcuaCIKKwogQ0NvZGVjX01vZHVsZU1ncjo6Q0NvZGVjX01vZHVsZU1ncigpCi17Ci0gICAgbV9wQmFzaWNNb2R1bGUgPSBuZXcgQ0NvZGVjX0Jhc2ljTW9kdWxlOwotICAgIG1fcEZheE1vZHVsZSA9IG5ldyBDQ29kZWNfRmF4TW9kdWxlOwotICAgIG1fcEpwZWdNb2R1bGUgPSBuZXcgQ0NvZGVjX0pwZWdNb2R1bGU7Ci0gICAgbV9wSnB4TW9kdWxlID0gbmV3IENDb2RlY19KcHhNb2R1bGU7Ci0gICAgbV9wSmJpZzJNb2R1bGUgPSBuZXcgQ0NvZGVjX0piaWcyTW9kdWxlOwotICAgIG1fcEljY01vZHVsZSA9IG5ldyBDQ29kZWNfSWNjTW9kdWxlOwotICAgIG1fcEZsYXRlTW9kdWxlID0gbmV3IENDb2RlY19GbGF0ZU1vZHVsZTsKKyAgICA6IG1fcEJhc2ljTW9kdWxlKG5ldyBDQ29kZWNfQmFzaWNNb2R1bGUpLAorICAgICAgbV9wRmF4TW9kdWxlKG5ldyBDQ29kZWNfRmF4TW9kdWxlKSwKKyAgICAgIG1fcEpwZWdNb2R1bGUobmV3IENDb2RlY19KcGVnTW9kdWxlKSwKKyAgICAgIG1fcEpweE1vZHVsZShuZXcgQ0NvZGVjX0pweE1vZHVsZSksCisgICAgICBtX3BKYmlnMk1vZHVsZShuZXcgQ0NvZGVjX0piaWcyTW9kdWxlKSwKKyAgICAgIG1fcEljY01vZHVsZShuZXcgQ0NvZGVjX0ljY01vZHVsZSksCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgICAgIG1fcFBuZ01vZHVsZShuZXcgQ0NvZGVjX1BuZ01vZHVsZSksCisgICAgICBtX3BHaWZNb2R1bGUobmV3IENDb2RlY19HaWZNb2R1bGUpLAorICAgICAgbV9wQm1wTW9kdWxlKG5ldyBDQ29kZWNfQm1wTW9kdWxlKSwKKyAgICAgIG1fcFRpZmZNb2R1bGUobmV3IENDb2RlY19UaWZmTW9kdWxlKSwKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgICAgIG1fcEZsYXRlTW9kdWxlKG5ldyBDQ29kZWNfRmxhdGVNb2R1bGUpIHsKIH0KLUNDb2RlY19Nb2R1bGVNZ3I6On5DQ29kZWNfTW9kdWxlTWdyKCkKLXsKLSAgICBkZWxldGUgbV9wQmFzaWNNb2R1bGU7Ci0gICAgZGVsZXRlIG1fcEZheE1vZHVsZTsKLSAgICBkZWxldGUgbV9wSnBlZ01vZHVsZTsKLSAgICBkZWxldGUgbV9wRmxhdGVNb2R1bGU7Ci0gICAgZGVsZXRlIG1fcEpweE1vZHVsZTsKLSAgICBkZWxldGUgbV9wSmJpZzJNb2R1bGU7Ci0gICAgZGVsZXRlIG1fcEljY01vZHVsZTsKKworQ0NvZGVjX1NjYW5saW5lRGVjb2Rlcjo6SW1hZ2VEYXRhQ2FjaGU6OkltYWdlRGF0YUNhY2hlKGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHBpdGNoKQorICAgIDogbV9XaWR0aCh3aWR0aCksIG1fSGVpZ2h0KGhlaWdodCksIG1fUGl0Y2gocGl0Y2gpLCBtX25DYWNoZWRMaW5lcygwKSB7fQorCitDQ29kZWNfU2NhbmxpbmVEZWNvZGVyOjpJbWFnZURhdGFDYWNoZTo6fkltYWdlRGF0YUNhY2hlKCkgewogfQotdm9pZCBDQ29kZWNfTW9kdWxlTWdyOjpJbml0SmJpZzJEZWNvZGVyKCkKLXsKKworYm9vbCBDQ29kZWNfU2NhbmxpbmVEZWNvZGVyOjpJbWFnZURhdGFDYWNoZTo6QWxsb2NhdGVDYWNoZSgpIHsKKyAgaWYgKG1fUGl0Y2ggPT0gMCB8fCBtX0hlaWdodCA8IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIEZYX1NBRkVfU0laRV9UIHNpemUgPSBtX1BpdGNoOworICBzaXplICo9IG1fSGVpZ2h0OworICBpZiAoIXNpemUuSXNWYWxpZCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBtX0RhdGEucmVzZXQoRlhfVHJ5QWxsb2ModWludDhfdCwgc2l6ZS5WYWx1ZU9yRGllKCkpKTsKKyAgcmV0dXJuIElzVmFsaWQoKTsKIH0KLXZvaWQgQ0NvZGVjX01vZHVsZU1ncjo6SW5pdEpweERlY29kZXIoKQoteworCit2b2lkIENDb2RlY19TY2FubGluZURlY29kZXI6OkltYWdlRGF0YUNhY2hlOjpBcHBlbmRMaW5lKGNvbnN0IHVpbnQ4X3QqIGxpbmUpIHsKKyAgLy8gSWYgdGhlIGNhbGxlcnMgYWRkcyBtb3JlIGxpbmVzIHRoYW4gdGhlcmUgaXMgcm9vbSwgZmFpbC4KKyAgaWYgKG1fUGl0Y2ggPT0gMCB8fCBtX25DYWNoZWRMaW5lcyA+PSBtX0hlaWdodCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm47CisgIH0KKworICBzaXplX3Qgb2Zmc2V0ID0gbV9QaXRjaDsKKyAgRlhTWVNfbWVtY3B5KG1fRGF0YS5nZXQoKSArIG9mZnNldCAqIG1fbkNhY2hlZExpbmVzLCBsaW5lLCBtX1BpdGNoKTsKKyAgKyttX25DYWNoZWRMaW5lczsKIH0KLXZvaWQgQ0NvZGVjX01vZHVsZU1ncjo6SW5pdEljY0RlY29kZXIoKQoteworCitjb25zdCB1aW50OF90KiBDQ29kZWNfU2NhbmxpbmVEZWNvZGVyOjpJbWFnZURhdGFDYWNoZTo6R2V0TGluZShpbnQgbGluZSkgY29uc3QgeworICBpZiAobV9QaXRjaCA9PSAwIHx8IGxpbmUgPCAwIHx8IGxpbmUgPj0gbV9uQ2FjaGVkTGluZXMpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgc2l6ZV90IG9mZnNldCA9IG1fUGl0Y2g7CisgIHJldHVybiBtX0RhdGEuZ2V0KCkgKyBvZmZzZXQgKiBsaW5lOwogfQorCiBDQ29kZWNfU2NhbmxpbmVEZWNvZGVyOjpDQ29kZWNfU2NhbmxpbmVEZWNvZGVyKCkKLXsKLSAgICBtX05leHRMaW5lID0gLTE7Ci0gICAgbV9wRGF0YUNhY2hlID0gTlVMTDsKLSAgICBtX3BMYXN0U2NhbmxpbmUgPSBOVUxMOworICAgIDogbV9OZXh0TGluZSgtMSksIG1fcExhc3RTY2FubGluZShudWxscHRyKSB7CiB9Ci1DQ29kZWNfU2NhbmxpbmVEZWNvZGVyOjp+Q0NvZGVjX1NjYW5saW5lRGVjb2RlcigpCi17Ci0gICAgaWYgKG1fcERhdGFDYWNoZSkgewotICAgICAgICBGWF9GcmVlKG1fcERhdGFDYWNoZSk7Ci0gICAgfQorCitDQ29kZWNfU2NhbmxpbmVEZWNvZGVyOjp+Q0NvZGVjX1NjYW5saW5lRGVjb2RlcigpIHsKIH0KLUZYX0xQQllURSBDQ29kZWNfU2NhbmxpbmVEZWNvZGVyOjpHZXRTY2FubGluZShpbnQgbGluZSkKLXsKLSAgICBpZiAobV9wRGF0YUNhY2hlICYmIGxpbmUgPCBtX3BEYXRhQ2FjaGUtPm1fbkNhY2hlZExpbmVzKSB7Ci0gICAgICAgIHJldHVybiAmbV9wRGF0YUNhY2hlLT5tX0RhdGEgKyBsaW5lICogbV9QaXRjaDsKLSAgICB9Ci0gICAgaWYgKG1fTmV4dExpbmUgPT0gbGluZSArIDEpIHsKLSAgICAgICAgcmV0dXJuIG1fcExhc3RTY2FubGluZTsKLSAgICB9Ci0gICAgaWYgKG1fTmV4dExpbmUgPCAwIHx8IG1fTmV4dExpbmUgPiBsaW5lKSB7Ci0gICAgICAgIGlmICghdl9SZXdpbmQoKSkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgbV9OZXh0TGluZSA9IDA7Ci0gICAgfQotICAgIHdoaWxlIChtX05leHRMaW5lIDwgbGluZSkgewotICAgICAgICBSZWFkTmV4dExpbmUoKTsKLSAgICAgICAgbV9OZXh0TGluZSArKzsKLSAgICB9Ci0gICAgbV9wTGFzdFNjYW5saW5lID0gUmVhZE5leHRMaW5lKCk7Ci0gICAgbV9OZXh0TGluZSArKzsKKworY29uc3QgdWludDhfdCogQ0NvZGVjX1NjYW5saW5lRGVjb2Rlcjo6R2V0U2NhbmxpbmUoaW50IGxpbmUpIHsKKyAgaWYgKG1fcERhdGFDYWNoZSAmJiBsaW5lIDwgbV9wRGF0YUNhY2hlLT5OdW1MaW5lcygpKQorICAgIHJldHVybiBtX3BEYXRhQ2FjaGUtPkdldExpbmUobGluZSk7CisKKyAgaWYgKG1fTmV4dExpbmUgPT0gbGluZSArIDEpCiAgICAgcmV0dXJuIG1fcExhc3RTY2FubGluZTsKKworICBpZiAobV9OZXh0TGluZSA8IDAgfHwgbV9OZXh0TGluZSA+IGxpbmUpIHsKKyAgICBpZiAoIXZfUmV3aW5kKCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICBtX05leHRMaW5lID0gMDsKKyAgfQorICB3aGlsZSAobV9OZXh0TGluZSA8IGxpbmUpIHsKKyAgICBSZWFkTmV4dExpbmUoKTsKKyAgICBtX05leHRMaW5lKys7CisgIH0KKyAgbV9wTGFzdFNjYW5saW5lID0gUmVhZE5leHRMaW5lKCk7CisgIG1fTmV4dExpbmUrKzsKKyAgcmV0dXJuIG1fcExhc3RTY2FubGluZTsKIH0KLUZYX0JPT0wgQ0NvZGVjX1NjYW5saW5lRGVjb2Rlcjo6U2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsIElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIGlmIChtX3BEYXRhQ2FjaGUgJiYgbGluZSA8IG1fcERhdGFDYWNoZS0+bV9uQ2FjaGVkTGluZXMpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9OZXh0TGluZSA9PSBsaW5lIHx8IG1fTmV4dExpbmUgPT0gbGluZSArIDEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9OZXh0TGluZSA8IDAgfHwgbV9OZXh0TGluZSA+IGxpbmUpIHsKLSAgICAgICAgdl9SZXdpbmQoKTsKLSAgICAgICAgbV9OZXh0TGluZSA9IDA7Ci0gICAgfQotICAgIG1fcExhc3RTY2FubGluZSA9IE5VTEw7Ci0gICAgd2hpbGUgKG1fTmV4dExpbmUgPCBsaW5lKSB7Ci0gICAgICAgIG1fcExhc3RTY2FubGluZSA9IFJlYWROZXh0TGluZSgpOwotICAgICAgICBtX05leHRMaW5lICsrOwotICAgICAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICB9CisKK0ZYX0JPT0wgQ0NvZGVjX1NjYW5saW5lRGVjb2Rlcjo6U2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIGlmIChtX3BEYXRhQ2FjaGUgJiYgbGluZSA8IG1fcERhdGFDYWNoZS0+TnVtTGluZXMoKSkKICAgICByZXR1cm4gRkFMU0U7Ci19Ci1GWF9MUEJZVEUgQ0NvZGVjX1NjYW5saW5lRGVjb2Rlcjo6UmVhZE5leHRMaW5lKCkKLXsKLSAgICBGWF9MUEJZVEUgcExpbmUgPSB2X0dldE5leHRMaW5lKCk7Ci0gICAgaWYgKHBMaW5lID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChtX3BEYXRhQ2FjaGUgJiYgbV9OZXh0TGluZSA9PSBtX3BEYXRhQ2FjaGUtPm1fbkNhY2hlZExpbmVzKSB7Ci0gICAgICAgIEZYU1lTX21lbWNweTMyKCZtX3BEYXRhQ2FjaGUtPm1fRGF0YSArIG1fTmV4dExpbmUgKiBtX1BpdGNoLCBwTGluZSwgbV9QaXRjaCk7Ci0gICAgICAgIG1fcERhdGFDYWNoZS0+bV9uQ2FjaGVkTGluZXMgKys7Ci0gICAgfQotICAgIHJldHVybiBwTGluZTsKLX0KLXZvaWQgQ0NvZGVjX1NjYW5saW5lRGVjb2Rlcjo6RG93blNjYWxlKGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQpCi17Ci0gICAgaWYgKGRlc3Rfd2lkdGggPCAwKSB7Ci0gICAgICAgIGRlc3Rfd2lkdGggPSAtZGVzdF93aWR0aDsKLSAgICB9Ci0gICAgaWYgKGRlc3RfaGVpZ2h0IDwgMCkgewotICAgICAgICBkZXN0X2hlaWdodCA9IC1kZXN0X2hlaWdodDsKLSAgICB9Ci0gICAgdl9Eb3duU2NhbGUoZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQpOwotICAgIGlmIChtX3BEYXRhQ2FjaGUpIHsKLSAgICAgICAgaWYgKG1fcERhdGFDYWNoZS0+bV9IZWlnaHQgPT0gbV9PdXRwdXRIZWlnaHQgJiYgbV9wRGF0YUNhY2hlLT5tX1dpZHRoID09IG1fT3V0cHV0V2lkdGgpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBGWF9GcmVlKG1fcERhdGFDYWNoZSk7Ci0gICAgICAgIG1fcERhdGFDYWNoZSA9IE5VTEw7Ci0gICAgfQotICAgIG1fcERhdGFDYWNoZSA9IChDQ29kZWNfSW1hZ2VEYXRhQ2FjaGUqKUZYX1RyeUFsbG9jKEZYX0JZVEUsIHNpemVvZihDQ29kZWNfSW1hZ2VEYXRhQ2FjaGUpICsgbV9QaXRjaCAqIG1fT3V0cHV0SGVpZ2h0KTsKLSAgICBpZiAobV9wRGF0YUNhY2hlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX3BEYXRhQ2FjaGUtPm1fSGVpZ2h0ID0gbV9PdXRwdXRIZWlnaHQ7Ci0gICAgbV9wRGF0YUNhY2hlLT5tX1dpZHRoID0gbV9PdXRwdXRXaWR0aDsKLSAgICBtX3BEYXRhQ2FjaGUtPm1fbkNhY2hlZExpbmVzID0gMDsKLX0KLUZYX0JPT0wgQ0NvZGVjX0Jhc2ljTW9kdWxlOjpSdW5MZW5ndGhFbmNvZGUoY29uc3QgRlhfQllURSogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIEZYX0xQQllURSYgZGVzdF9idWYsCi0gICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpCi17CisKKyAgaWYgKG1fTmV4dExpbmUgPT0gbGluZSB8fCBtX05leHRMaW5lID09IGxpbmUgKyAxKQogICAgIHJldHVybiBGQUxTRTsKKworICBpZiAobV9OZXh0TGluZSA8IDAgfHwgbV9OZXh0TGluZSA+IGxpbmUpIHsKKyAgICB2X1Jld2luZCgpOworICAgIG1fTmV4dExpbmUgPSAwOworICB9CisgIG1fcExhc3RTY2FubGluZSA9IG51bGxwdHI7CisgIHdoaWxlIChtX05leHRMaW5lIDwgbGluZSkgeworICAgIG1fcExhc3RTY2FubGluZSA9IFJlYWROZXh0TGluZSgpOworICAgIG1fTmV4dExpbmUrKzsKKyAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIHJldHVybiBGQUxTRTsKIH0KLWV4dGVybiAiQyIgZG91YmxlIEZYc3RydG9kKGNvbnN0IGNoYXIqIG5wdHIsIGNoYXIqKiBlbmRwdHIpCi17Ci0gICAgZG91YmxlIHJldCA9IDAuMDsKLSAgICBjb25zdCBjaGFyKiBwdHIgPSBucHRyOwotICAgIGNvbnN0IGNoYXIqIGV4cF9wdHIgPSBOVUxMOwotICAgIGludAllX251bWJlciA9IDAsCi0gICAgICAgIGVfc2lnbmFsID0gMCwKLSAgICAgICAgZV9wb2ludCA9IDAsCi0gICAgICAgIGlzX25lZ2F0aXZlID0gMDsKLSAgICBpbnQgZXhwX3JldCA9IDAsIGV4cF9zaWcgPSAxLAotICAgICAgICBmcmFfcmV0ID0gMCwgZnJhX2NvdW50ID0gMCwgZnJhX2Jhc2UgPSAxOwotICAgIGlmKG5wdHIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMC4wOworCit1aW50OF90KiBDQ29kZWNfU2NhbmxpbmVEZWNvZGVyOjpSZWFkTmV4dExpbmUoKSB7CisgIHVpbnQ4X3QqIHBMaW5lID0gdl9HZXROZXh0TGluZSgpOworICBpZiAoIXBMaW5lKQorICAgIHJldHVybiBudWxscHRyOworCisgIGlmIChtX3BEYXRhQ2FjaGUgJiYgbV9OZXh0TGluZSA9PSBtX3BEYXRhQ2FjaGUtPk51bUxpbmVzKCkpCisgICAgbV9wRGF0YUNhY2hlLT5BcHBlbmRMaW5lKHBMaW5lKTsKKyAgcmV0dXJuIHBMaW5lOworfQorCit2b2lkIENDb2RlY19TY2FubGluZURlY29kZXI6OkRvd25TY2FsZShpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0KSB7CisgIGRlc3Rfd2lkdGggPSBzdGQ6OmFicyhkZXN0X3dpZHRoKTsKKyAgZGVzdF9oZWlnaHQgPSBzdGQ6OmFicyhkZXN0X2hlaWdodCk7CisgIHZfRG93blNjYWxlKGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0KTsKKworICBpZiAobV9wRGF0YUNhY2hlICYmCisgICAgICBtX3BEYXRhQ2FjaGUtPklzU2FtZURpbWVuc2lvbnMobV9PdXRwdXRXaWR0aCwgbV9PdXRwdXRIZWlnaHQpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPEltYWdlRGF0YUNhY2hlPiBjYWNoZSgKKyAgICAgIG5ldyBJbWFnZURhdGFDYWNoZShtX091dHB1dFdpZHRoLCBtX091dHB1dEhlaWdodCwgbV9QaXRjaCkpOworICBpZiAoIWNhY2hlLT5BbGxvY2F0ZUNhY2hlKCkpCisgICAgcmV0dXJuOworCisgIG1fcERhdGFDYWNoZSA9IHN0ZDo6bW92ZShjYWNoZSk7Cit9CisKK0ZYX0JPT0wgQ0NvZGVjX0Jhc2ljTW9kdWxlOjpSdW5MZW5ndGhFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgeworICByZXR1cm4gRkFMU0U7Cit9CisKKyNkZWZpbmUgRVhQT05FTlRfREVURUNUKHB0cikgICAgICAgICAgICAgICAgIFwKKyAgZm9yICg7OyBwdHIrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIXN0ZDo6aXNkaWdpdCgqcHRyKSkgeyAgICAgICAgICAgICAgIFwKKyAgICAgIGlmIChlbmRwdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKmVuZHB0ciA9IChjaGFyKilwdHI7ICAgICAgICAgICAgICAgIFwKKyAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGV4cF9yZXQgKj0gMTA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGV4cF9yZXQgKz0gRlhTWVNfdG9EZWNpbWFsRGlnaXQoKnB0cik7IFwKKyAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitleHRlcm4gIkMiIGRvdWJsZSBGWHN0cnRvZChjb25zdCBjaGFyKiBucHRyLCBjaGFyKiogZW5kcHRyKSB7CisgIGRvdWJsZSByZXQgPSAwLjA7CisgIGNvbnN0IGNoYXIqIHB0ciA9IG5wdHI7CisgIGNvbnN0IGNoYXIqIGV4cF9wdHIgPSBOVUxMOworICBpbnQgZV9udW1iZXIgPSAwLCBlX3NpZ25hbCA9IDAsIGVfcG9pbnQgPSAwLCBpc19uZWdhdGl2ZSA9IDA7CisgIGludCBleHBfcmV0ID0gMCwgZXhwX3NpZyA9IDEsIGZyYV9yZXQgPSAwLCBmcmFfY291bnQgPSAwLCBmcmFfYmFzZSA9IDE7CisgIGlmICghbnB0cikgeworICAgIHJldHVybiAwLjA7CisgIH0KKyAgZm9yICg7OyBwdHIrKykgeworICAgIGlmICghZV9udW1iZXIgJiYgIWVfcG9pbnQgJiYgKCpwdHIgPT0gJ1x0JyB8fCAqcHRyID09ICcgJykpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChzdGQ6OmlzZGlnaXQoKnB0cikpIHsKKyAgICAgIGlmICghZV9udW1iZXIpCisgICAgICAgIGVfbnVtYmVyID0gMTsKKworICAgICAgaWYgKCFlX3BvaW50KSB7CisgICAgICAgIHJldCAqPSAxMDsKKyAgICAgICAgcmV0ICs9IEZYU1lTX3RvRGVjaW1hbERpZ2l0KCpwdHIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZnJhX2NvdW50Kys7CisgICAgICAgIGZyYV9yZXQgKj0gMTA7CisgICAgICAgIGZyYV9yZXQgKz0gRlhTWVNfdG9EZWNpbWFsRGlnaXQoKnB0cik7CisgICAgICB9CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgZm9yICg7OyBwdHIrKykgewotICAgICAgICBpZighZV9udW1iZXIgJiYgIWVfcG9pbnQgJiYgKCpwdHIgPT0gJ1x0JyB8fCAqcHRyID09ICcgJykpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmKCpwdHIgPj0gJzAnICYmICpwdHIgPD0gJzknKSB7Ci0gICAgICAgICAgICBpZighZV9udW1iZXIpIHsKLSAgICAgICAgICAgICAgICBlX251bWJlciA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZighZV9wb2ludCkgewotICAgICAgICAgICAgICAgIHJldCAqPSAxMDsKLSAgICAgICAgICAgICAgICByZXQgKz0gKCpwdHIgLSAnMCcpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmcmFfY291bnQrKzsKLSAgICAgICAgICAgICAgICBmcmFfcmV0ICo9IDEwOwotICAgICAgICAgICAgICAgIGZyYV9yZXQgKz0gKCpwdHIgLSAnMCcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoIWVfcG9pbnQgJiYgKnB0ciA9PSAnLicpIHsKLSAgICAgICAgICAgIGVfcG9pbnQgPSAxOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoIWVfbnVtYmVyICYmICFlX3BvaW50ICYmICFlX3NpZ25hbCkgewotICAgICAgICAgICAgc3dpdGNoKCpwdHIpIHsKLSAgICAgICAgICAgICAgICBjYXNlICctJzoKLSAgICAgICAgICAgICAgICAgICAgaXNfbmVnYXRpdmUgPSAxOwotICAgICAgICAgICAgICAgIGNhc2UgJysnOgotICAgICAgICAgICAgICAgICAgICBlX3NpZ25hbCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKGVfbnVtYmVyICYmICgqcHRyID09ICdlJyB8fCAqcHRyID09ICdFJykpIHsKLSNkZWZpbmUgRVhQT05FTlRfREVURUNUKHB0cikJXAotICAgIGZvcig7O3B0cisrKXsJCVwKLSAgICAgICAgaWYoKnB0ciA8ICcwJyB8fCAqcHRyID4gJzknKXsJXAotICAgICAgICAgICAgaWYoZW5kcHRyKQkqZW5kcHRyID0gKGNoYXIqKXB0cjsJXAotICAgICAgICAgICAgYnJlYWs7CVwKLSAgICAgICAgfWVsc2V7CQlcCi0gICAgICAgICAgICBleHBfcmV0ICo9IDEwOwlcCi0gICAgICAgICAgICBleHBfcmV0ICs9ICgqcHRyIC0gJzAnKTsJXAotICAgICAgICAgICAgY29udGludWU7CQlcCi0gICAgICAgIH0JXAorICAgIGlmICghZV9wb2ludCAmJiAqcHRyID09ICcuJykgeworICAgICAgZV9wb2ludCA9IDE7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgICAgICAgICBleHBfcHRyID0gcHRyKys7Ci0gICAgICAgICAgICBpZigqcHRyID09ICcrJyB8fCAqcHRyID09ICctJykgewotICAgICAgICAgICAgICAgIGV4cF9zaWcgPSAoKnB0cisrID09ICcrJykgPyAxIDogLTE7Ci0gICAgICAgICAgICAgICAgaWYoKnB0ciA8ICcwJyB8fCAqcHRyID4gJzknKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGVuZHB0cikJewotICAgICAgICAgICAgICAgICAgICAgICAgKmVuZHB0ciA9IChjaGFyKilleHBfcHRyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBFWFBPTkVOVF9ERVRFQ1QocHRyKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZigqcHRyID49ICcwJyAmJiAqcHRyIDw9ICc5JykgewotICAgICAgICAgICAgICAgIEVYUE9ORU5UX0RFVEVDVChwdHIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZihlbmRwdHIpCXsKLSAgICAgICAgICAgICAgICAgICAgKmVuZHB0ciA9IChjaGFyKilleHBfcHRyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSN1bmRlZiBFWFBPTkVOVF9ERVRFQ1QKLSAgICAgICAgICAgIGJyZWFrOworICAgIGlmICghZV9udW1iZXIgJiYgIWVfcG9pbnQgJiYgIWVfc2lnbmFsKSB7CisgICAgICBzd2l0Y2ggKCpwdHIpIHsKKyAgICAgICAgY2FzZSAnLSc6CisgICAgICAgICAgaXNfbmVnYXRpdmUgPSAxOworICAgICAgICBjYXNlICcrJzoKKyAgICAgICAgICBlX3NpZ25hbCA9IDE7CisgICAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfQorICAgIGlmIChlX251bWJlciAmJiAoKnB0ciA9PSAnZScgfHwgKnB0ciA9PSAnRScpKSB7CisgICAgICBleHBfcHRyID0gcHRyKys7CisgICAgICBpZiAoKnB0ciA9PSAnKycgfHwgKnB0ciA9PSAnLScpIHsKKyAgICAgICAgZXhwX3NpZyA9ICgqcHRyKysgPT0gJysnKSA/IDEgOiAtMTsKKyAgICAgICAgaWYgKCFzdGQ6OmlzZGlnaXQoKnB0cikpIHsKKyAgICAgICAgICBpZiAoZW5kcHRyKSB7CisgICAgICAgICAgICAqZW5kcHRyID0gKGNoYXIqKWV4cF9wdHI7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmKHB0ciAhPSBucHRyICYmICFlX251bWJlcikgewotICAgICAgICAgICAgaWYoZW5kcHRyKQl7Ci0gICAgICAgICAgICAgICAgKmVuZHB0ciA9IChjaGFyKilucHRyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoZW5kcHRyKQl7Ci0gICAgICAgICAgICAqZW5kcHRyID0gKGNoYXIqKXB0cjsKKyAgICAgICAgRVhQT05FTlRfREVURUNUKHB0cik7CisgICAgICB9IGVsc2UgaWYgKHN0ZDo6aXNkaWdpdCgqcHRyKSkgeworICAgICAgICBFWFBPTkVOVF9ERVRFQ1QocHRyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChlbmRwdHIpIHsKKyAgICAgICAgICAqZW5kcHRyID0gKGNoYXIqKWV4cF9wdHI7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKICAgICB9Ci0gICAgd2hpbGUoZnJhX2NvdW50LS0pIHsKLSAgICAgICAgZnJhX2Jhc2UgKj0gMTA7CisgICAgaWYgKHB0ciAhPSBucHRyICYmICFlX251bWJlcikgeworICAgICAgaWYgKGVuZHB0cikgeworICAgICAgICAqZW5kcHRyID0gKGNoYXIqKW5wdHI7CisgICAgICB9CisgICAgICBicmVhazsKICAgICB9Ci0gICAgcmV0ICs9IChkb3VibGUpZnJhX3JldCAvIChkb3VibGUpZnJhX2Jhc2U7Ci0gICAgaWYoZXhwX3NpZyA9PSAxKSB7Ci0gICAgICAgIHdoaWxlKGV4cF9yZXQtLSkgewotICAgICAgICAgICAgcmV0ICo9IDEwLjA7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICB3aGlsZShleHBfcmV0LS0pIHsKLSAgICAgICAgICAgIHJldCAvPSAxMC4wOwotICAgICAgICB9CisgICAgaWYgKGVuZHB0cikgeworICAgICAgKmVuZHB0ciA9IChjaGFyKilwdHI7CiAgICAgfQotICAgIHJldHVybiBpc19uZWdhdGl2ZSA/IC1yZXQgOiByZXQ7Ci19Ci1GWF9CT09MIENDb2RlY19CYXNpY01vZHVsZTo6QTg1RW5jb2RlKGNvbnN0IEZYX0JZVEUqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBGWF9MUEJZVEUmIGRlc3RfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKQotewotICAgIHJldHVybiBGQUxTRTsKLX0KLUNDb2RlY19Nb2R1bGVNZ3IqIENDb2RlY19Nb2R1bGVNZ3I6OkNyZWF0ZSgpCi17Ci0gICAgcmV0dXJuIG5ldyBDQ29kZWNfTW9kdWxlTWdyOwotfQotdm9pZCBDQ29kZWNfTW9kdWxlTWdyOjpEZXN0cm95KCkKLXsKLSAgICBkZWxldGUgdGhpczsKLX0KLWNsYXNzIENDb2RlY19STFNjYW5saW5lRGVjb2RlciA6IHB1YmxpYyBDQ29kZWNfU2NhbmxpbmVEZWNvZGVyCi17Ci1wdWJsaWM6Ci0gICAgQ0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyKCk7Ci0gICAgdmlydHVhbCB+Q0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyKCk7Ci0gICAgRlhfQk9PTAkJCQlDcmVhdGUoRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbkNvbXBzLCBpbnQgYnBjKTsKLSAgICB2aXJ0dWFsIHZvaWQJCXZfRG93blNjYWxlKGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQpIHt9Ci0gICAgdmlydHVhbCBGWF9CT09MCQl2X1Jld2luZCgpOwotICAgIHZpcnR1YWwgRlhfTFBCWVRFCXZfR2V0TmV4dExpbmUoKTsKLSAgICB2aXJ0dWFsIEZYX0RXT1JECUdldFNyY09mZnNldCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9TcmNPZmZzZXQ7CisgICAgYnJlYWs7CisgIH0KKyAgd2hpbGUgKGZyYV9jb3VudC0tKSB7CisgICAgZnJhX2Jhc2UgKj0gMTA7CisgIH0KKyAgcmV0ICs9IChkb3VibGUpZnJhX3JldCAvIChkb3VibGUpZnJhX2Jhc2U7CisgIGlmIChleHBfc2lnID09IDEpIHsKKyAgICB3aGlsZSAoZXhwX3JldC0tKSB7CisgICAgICByZXQgKj0gMTAuMDsKICAgICB9Ci1wcm90ZWN0ZWQ6Ci0gICAgRlhfQk9PTAkJCQlDaGVja0Rlc3RTaXplKCk7Ci0gICAgdm9pZAkJCQlHZXROZXh0T3BlcmF0b3IoKTsKLSAgICB2b2lkCQkJCVVwZGF0ZU9wZXJhdG9yKEZYX0JZVEUgdXNlZF9ieXRlcyk7CisgIH0gZWxzZSB7CisgICAgd2hpbGUgKGV4cF9yZXQtLSkgeworICAgICAgcmV0IC89IDEwLjA7CisgICAgfQorICB9CisgIHJldHVybiBpc19uZWdhdGl2ZSA/IC1yZXQgOiByZXQ7Cit9CisjdW5kZWYgRVhQT05FTlRfREVURUNUCiAKLSAgICBGWF9MUEJZVEUJCQltX3BTY2FubGluZTsKLSAgICBGWF9MUENCWVRFCQkJbV9wU3JjQnVmOwotICAgIEZYX0RXT1JECQkJbV9TcmNTaXplOwotICAgIEZYX0RXT1JECQkJbV9kd0xpbmVCeXRlczsKLSAgICBGWF9EV09SRAkJCW1fU3JjT2Zmc2V0OwotICAgIEZYX0JPT0wJCQkJbV9iRU9EOwotICAgIEZYX0JZVEUJCQkJbV9PcGVyYXRvcjsKK0ZYX0JPT0wgQ0NvZGVjX0Jhc2ljTW9kdWxlOjpBODVFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgeworICByZXR1cm4gRkFMU0U7Cit9CisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorQ0ZYX0RJQkF0dHJpYnV0ZTo6Q0ZYX0RJQkF0dHJpYnV0ZSgpCisgICAgOiBtX25YRFBJKC0xKSwKKyAgICAgIG1fbllEUEkoLTEpLAorICAgICAgbV9mQXNwZWN0UmF0aW8oLTEuMGYpLAorICAgICAgbV93RFBJVW5pdCgwKSwKKyAgICAgIG1fbkdpZkxlZnQoMCksCisgICAgICBtX25HaWZUb3AoMCksCisgICAgICBtX3BHaWZMb2NhbFBhbGV0dGUobnVsbHB0ciksCisgICAgICBtX25HaWZMb2NhbFBhbE51bSgwKSwKKyAgICAgIG1fbkJtcENvbXByZXNzVHlwZSgwKSB7CisgIEZYU1lTX21lbXNldChtX3N0clRpbWUsIDAsIHNpemVvZihtX3N0clRpbWUpKTsKK30KK0NGWF9ESUJBdHRyaWJ1dGU6On5DRlhfRElCQXR0cmlidXRlKCkgeworICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBtX0V4aWYpCisgICAgRlhfRnJlZShwYWlyLnNlY29uZCk7Cit9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKK2NsYXNzIENDb2RlY19STFNjYW5saW5lRGVjb2RlciA6IHB1YmxpYyBDQ29kZWNfU2NhbmxpbmVEZWNvZGVyIHsKKyBwdWJsaWM6CisgIENDb2RlY19STFNjYW5saW5lRGVjb2RlcigpOworICB+Q0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyKCkgb3ZlcnJpZGU7CisKKyAgRlhfQk9PTCBDcmVhdGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgaW50IG5Db21wcywKKyAgICAgICAgICAgICAgICAgaW50IGJwYyk7CisKKyAgLy8gQ0NvZGVjX1NjYW5saW5lRGVjb2RlcgorICB2b2lkIHZfRG93blNjYWxlKGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQpIG92ZXJyaWRlIHt9CisgIEZYX0JPT0wgdl9SZXdpbmQoKSBvdmVycmlkZTsKKyAgdWludDhfdCogdl9HZXROZXh0TGluZSgpIG92ZXJyaWRlOworICBGWF9EV09SRCBHZXRTcmNPZmZzZXQoKSBvdmVycmlkZSB7IHJldHVybiBtX1NyY09mZnNldDsgfQorCisgcHJvdGVjdGVkOgorICBGWF9CT09MIENoZWNrRGVzdFNpemUoKTsKKyAgdm9pZCBHZXROZXh0T3BlcmF0b3IoKTsKKyAgdm9pZCBVcGRhdGVPcGVyYXRvcih1aW50OF90IHVzZWRfYnl0ZXMpOworCisgIHVpbnQ4X3QqIG1fcFNjYW5saW5lOworICBjb25zdCB1aW50OF90KiBtX3BTcmNCdWY7CisgIEZYX0RXT1JEIG1fU3JjU2l6ZTsKKyAgRlhfRFdPUkQgbV9kd0xpbmVCeXRlczsKKyAgRlhfRFdPUkQgbV9TcmNPZmZzZXQ7CisgIEZYX0JPT0wgbV9iRU9EOworICB1aW50OF90IG1fT3BlcmF0b3I7CiB9OwogQ0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyOjpDQ29kZWNfUkxTY2FubGluZURlY29kZXIoKQotICAgIDogbV9wU2NhbmxpbmUoTlVMTCkKLSAgICAsIG1fcFNyY0J1ZihOVUxMKQotICAgICwgbV9TcmNTaXplKDApCi0gICAgLCBtX2R3TGluZUJ5dGVzKDApCi0gICAgLCBtX1NyY09mZnNldCgwKQotICAgICwgbV9iRU9EKEZBTFNFKQotICAgICwgbV9PcGVyYXRvcigwKQoteworICAgIDogbV9wU2NhbmxpbmUoTlVMTCksCisgICAgICBtX3BTcmNCdWYoTlVMTCksCisgICAgICBtX1NyY1NpemUoMCksCisgICAgICBtX2R3TGluZUJ5dGVzKDApLAorICAgICAgbV9TcmNPZmZzZXQoMCksCisgICAgICBtX2JFT0QoRkFMU0UpLAorICAgICAgbV9PcGVyYXRvcigwKSB7fQorQ0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyOjp+Q0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyKCkgeworICBGWF9GcmVlKG1fcFNjYW5saW5lKTsKIH0KLUNDb2RlY19STFNjYW5saW5lRGVjb2Rlcjo6fkNDb2RlY19STFNjYW5saW5lRGVjb2RlcigpCi17Ci0gICAgaWYgKG1fcFNjYW5saW5lKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wU2NhbmxpbmUpOwotICAgIH0KLX0KLUZYX0JPT0wgQ0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyOjpDaGVja0Rlc3RTaXplKCkKLXsKLSAgICBGWF9EV09SRCBpID0gMDsKLSAgICBGWF9EV09SRCBvbGRfc2l6ZSA9IDA7Ci0gICAgRlhfRFdPUkQgZGVzdF9zaXplID0gMDsKLSAgICB3aGlsZSAoaSA8IG1fU3JjU2l6ZSkgewotICAgICAgICBpZiAobV9wU3JjQnVmW2ldIDwgMTI4KSB7Ci0gICAgICAgICAgICBvbGRfc2l6ZSA9IGRlc3Rfc2l6ZTsKLSAgICAgICAgICAgIGRlc3Rfc2l6ZSArPSBtX3BTcmNCdWZbaV0gKyAxOwotICAgICAgICAgICAgaWYgKGRlc3Rfc2l6ZSA8IG9sZF9zaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaSArPSBtX3BTcmNCdWZbaV0gKyAyOwotICAgICAgICB9IGVsc2UgaWYgKG1fcFNyY0J1ZltpXSA+IDEyOCkgewotICAgICAgICAgICAgb2xkX3NpemUgPSBkZXN0X3NpemU7Ci0gICAgICAgICAgICBkZXN0X3NpemUgKz0gMjU3IC0gbV9wU3JjQnVmW2ldOwotICAgICAgICAgICAgaWYgKGRlc3Rfc2l6ZSA8IG9sZF9zaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaSArPSAyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCgoRlhfRFdPUkQpbV9PcmlnV2lkdGggKiBtX25Db21wcyAqIG1fYnBjICogbV9PcmlnSGVpZ2h0ICsgNykgLyA4ID4gZGVzdF9zaXplKSB7CitGWF9CT09MIENDb2RlY19STFNjYW5saW5lRGVjb2Rlcjo6Q2hlY2tEZXN0U2l6ZSgpIHsKKyAgRlhfRFdPUkQgaSA9IDA7CisgIEZYX0RXT1JEIG9sZF9zaXplID0gMDsKKyAgRlhfRFdPUkQgZGVzdF9zaXplID0gMDsKKyAgd2hpbGUgKGkgPCBtX1NyY1NpemUpIHsKKyAgICBpZiAobV9wU3JjQnVmW2ldIDwgMTI4KSB7CisgICAgICBvbGRfc2l6ZSA9IGRlc3Rfc2l6ZTsKKyAgICAgIGRlc3Rfc2l6ZSArPSBtX3BTcmNCdWZbaV0gKyAxOworICAgICAgaWYgKGRlc3Rfc2l6ZSA8IG9sZF9zaXplKSB7CiAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENDb2RlY19STFNjYW5saW5lRGVjb2Rlcjo6Q3JlYXRlKEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5Db21wcywgaW50IGJwYykKLXsKLSAgICBtX3BTcmNCdWYgPSBzcmNfYnVmOwotICAgIG1fU3JjU2l6ZSA9IHNyY19zaXplOwotICAgIG1fT3V0cHV0V2lkdGggPSBtX09yaWdXaWR0aCA9IHdpZHRoOwotICAgIG1fT3V0cHV0SGVpZ2h0ID0gbV9PcmlnSGVpZ2h0ID0gaGVpZ2h0OwotICAgIG1fbkNvbXBzID0gbkNvbXBzOwotICAgIG1fYnBjID0gYnBjOwotICAgIG1fYkNvbG9yVHJhbnNmb3JtZWQgPSBGQUxTRTsKLSAgICBtX0Rvd25TY2FsZSA9IDE7Ci0gICAgbV9QaXRjaCA9ICh3aWR0aCAqIG5Db21wcyAqIGJwYyArIDMxKSAvIDMyICogNDsKLSAgICBtX2R3TGluZUJ5dGVzID0gKHdpZHRoICogbkNvbXBzICogYnBjICsgNykgLyA4OwotICAgIG1fcFNjYW5saW5lID0gRlhfQWxsb2MoRlhfQllURSwgbV9QaXRjaCk7Ci0gICAgcmV0dXJuIENoZWNrRGVzdFNpemUoKTsKLX0KLUZYX0JPT0wgQ0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyOjp2X1Jld2luZCgpCi17Ci0gICAgRlhTWVNfbWVtc2V0MzIobV9wU2NhbmxpbmUsIDAsIG1fUGl0Y2gpOwotICAgIG1fU3JjT2Zmc2V0ID0gMDsKLSAgICBtX2JFT0QgPSBGQUxTRTsKLSAgICBtX09wZXJhdG9yID0gMDsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0xQQllURSBDQ29kZWNfUkxTY2FubGluZURlY29kZXI6OnZfR2V0TmV4dExpbmUoKQotewotICAgIGlmIChtX1NyY09mZnNldCA9PSAwKSB7Ci0gICAgICAgIEdldE5leHRPcGVyYXRvcigpOworICAgICAgfQorICAgICAgaSArPSBtX3BTcmNCdWZbaV0gKyAyOworICAgIH0gZWxzZSBpZiAobV9wU3JjQnVmW2ldID4gMTI4KSB7CisgICAgICBvbGRfc2l6ZSA9IGRlc3Rfc2l6ZTsKKyAgICAgIGRlc3Rfc2l6ZSArPSAyNTcgLSBtX3BTcmNCdWZbaV07CisgICAgICBpZiAoZGVzdF9zaXplIDwgb2xkX3NpemUpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgaSArPSAyOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtX2JFT0QpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9CisgICAgICBicmVhazsKICAgICB9Ci0gICAgRlhTWVNfbWVtc2V0MzIobV9wU2NhbmxpbmUsIDAsIG1fUGl0Y2gpOwotICAgIEZYX0RXT1JEIGNvbF9wb3MgPSAwOwotICAgIEZYX0JPT0wJZW9sID0gRkFMU0U7Ci0gICAgd2hpbGUgKG1fU3JjT2Zmc2V0IDwgbV9TcmNTaXplICYmICFlb2wpIHsKLSAgICAgICAgaWYgKG1fT3BlcmF0b3IgPCAxMjgpIHsKLSAgICAgICAgICAgIEZYX0RXT1JEIGNvcHlfbGVuID0gbV9PcGVyYXRvciArIDE7Ci0gICAgICAgICAgICBpZiAoY29sX3BvcyArIGNvcHlfbGVuID49IG1fZHdMaW5lQnl0ZXMpIHsKLSAgICAgICAgICAgICAgICBjb3B5X2xlbiA9IG1fZHdMaW5lQnl0ZXMgLSBjb2xfcG9zOwotICAgICAgICAgICAgICAgIGVvbCA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY29weV9sZW4gPj0gbV9TcmNTaXplIC0gbV9TcmNPZmZzZXQpIHsKLSAgICAgICAgICAgICAgICBjb3B5X2xlbiA9IG1fU3JjU2l6ZSAtIG1fU3JjT2Zmc2V0OwotICAgICAgICAgICAgICAgIG1fYkVPRCA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkzMihtX3BTY2FubGluZSArIGNvbF9wb3MsIG1fcFNyY0J1ZiArIG1fU3JjT2Zmc2V0LCBjb3B5X2xlbik7Ci0gICAgICAgICAgICBjb2xfcG9zICs9IGNvcHlfbGVuOwotICAgICAgICAgICAgVXBkYXRlT3BlcmF0b3IoKEZYX0JZVEUpY29weV9sZW4pOwotICAgICAgICB9IGVsc2UgaWYgKG1fT3BlcmF0b3IgPiAxMjgpIHsKLSAgICAgICAgICAgIGludCBmaWxsID0gMDsKLSAgICAgICAgICAgIGlmIChtX1NyY09mZnNldCAtIDEgPCBtX1NyY1NpemUgLSAxKSB7Ci0gICAgICAgICAgICAgICAgZmlsbCA9IG1fcFNyY0J1ZlttX1NyY09mZnNldF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9EV09SRCBkdXBsaWNhdGVfbGVuID0gMjU3IC0gbV9PcGVyYXRvcjsKLSAgICAgICAgICAgIGlmIChjb2xfcG9zICsgZHVwbGljYXRlX2xlbiA+PSBtX2R3TGluZUJ5dGVzKSB7Ci0gICAgICAgICAgICAgICAgZHVwbGljYXRlX2xlbiA9IG1fZHdMaW5lQnl0ZXMgLSBjb2xfcG9zOwotICAgICAgICAgICAgICAgIGVvbCA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWFNZU19tZW1zZXQ4KG1fcFNjYW5saW5lICsgY29sX3BvcywgZmlsbCwgZHVwbGljYXRlX2xlbik7Ci0gICAgICAgICAgICBjb2xfcG9zICs9IGR1cGxpY2F0ZV9sZW47Ci0gICAgICAgICAgICBVcGRhdGVPcGVyYXRvcigoRlhfQllURSlkdXBsaWNhdGVfbGVuKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fYkVPRCA9IFRSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbV9wU2NhbmxpbmU7CisgIH0KKyAgaWYgKCgoRlhfRFdPUkQpbV9PcmlnV2lkdGggKiBtX25Db21wcyAqIG1fYnBjICogbV9PcmlnSGVpZ2h0ICsgNykgLyA4ID4KKyAgICAgIGRlc3Rfc2l6ZSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLXZvaWQgQ0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyOjpHZXROZXh0T3BlcmF0b3IoKQotewotICAgIGlmIChtX1NyY09mZnNldCA+PSBtX1NyY1NpemUpIHsKLSAgICAgICAgbV9PcGVyYXRvciA9IDEyODsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX09wZXJhdG9yID0gbV9wU3JjQnVmW21fU3JjT2Zmc2V0XTsKLSAgICBtX1NyY09mZnNldCArKzsKK0ZYX0JPT0wgQ0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyOjpDcmVhdGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJwYykgeworICBtX3BTcmNCdWYgPSBzcmNfYnVmOworICBtX1NyY1NpemUgPSBzcmNfc2l6ZTsKKyAgbV9PdXRwdXRXaWR0aCA9IG1fT3JpZ1dpZHRoID0gd2lkdGg7CisgIG1fT3V0cHV0SGVpZ2h0ID0gbV9PcmlnSGVpZ2h0ID0gaGVpZ2h0OworICBtX25Db21wcyA9IG5Db21wczsKKyAgbV9icGMgPSBicGM7CisgIG1fYkNvbG9yVHJhbnNmb3JtZWQgPSBGQUxTRTsKKyAgbV9Eb3duU2NhbGUgPSAxOworICAvLyBBbGlnbmluZyB0aGUgcGl0Y2ggdG8gNCBieXRlcyByZXF1aXJlcyBhbiBpbnRlZ2VyIG92ZXJmbG93IGNoZWNrLgorICBGWF9TQUZFX0RXT1JEIHBpdGNoID0gd2lkdGg7CisgIHBpdGNoICo9IG5Db21wczsKKyAgcGl0Y2ggKj0gYnBjOworICBwaXRjaCArPSAzMTsKKyAgcGl0Y2ggLz0gMzI7CisgIHBpdGNoICo9IDQ7CisgIGlmICghcGl0Y2guSXNWYWxpZCgpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fUGl0Y2ggPSBwaXRjaC5WYWx1ZU9yRGllKCk7CisgIC8vIE92ZXJmbG93IHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbiBjaGVja2VkIGJlZm9yZSB0aGlzIGlzIGNhbGxlZC4KKyAgbV9kd0xpbmVCeXRlcyA9IChzdGF0aWNfY2FzdDxGWF9EV09SRD4od2lkdGgpICogbkNvbXBzICogYnBjICsgNykgLyA4OworICBtX3BTY2FubGluZSA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fUGl0Y2gpOworICByZXR1cm4gQ2hlY2tEZXN0U2l6ZSgpOwogfQotdm9pZCBDQ29kZWNfUkxTY2FubGluZURlY29kZXI6OlVwZGF0ZU9wZXJhdG9yKEZYX0JZVEUgdXNlZF9ieXRlcykKLXsKLSAgICBpZiAodXNlZF9ieXRlcyA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKK0ZYX0JPT0wgQ0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyOjp2X1Jld2luZCgpIHsKKyAgRlhTWVNfbWVtc2V0KG1fcFNjYW5saW5lLCAwLCBtX1BpdGNoKTsKKyAgbV9TcmNPZmZzZXQgPSAwOworICBtX2JFT0QgPSBGQUxTRTsKKyAgbV9PcGVyYXRvciA9IDA7CisgIHJldHVybiBUUlVFOworfQordWludDhfdCogQ0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyOjp2X0dldE5leHRMaW5lKCkgeworICBpZiAobV9TcmNPZmZzZXQgPT0gMCkgeworICAgIEdldE5leHRPcGVyYXRvcigpOworICB9IGVsc2UgeworICAgIGlmIChtX2JFT0QpIHsKKyAgICAgIHJldHVybiBOVUxMOwogICAgIH0KKyAgfQorICBGWFNZU19tZW1zZXQobV9wU2NhbmxpbmUsIDAsIG1fUGl0Y2gpOworICBGWF9EV09SRCBjb2xfcG9zID0gMDsKKyAgRlhfQk9PTCBlb2wgPSBGQUxTRTsKKyAgd2hpbGUgKG1fU3JjT2Zmc2V0IDwgbV9TcmNTaXplICYmICFlb2wpIHsKICAgICBpZiAobV9PcGVyYXRvciA8IDEyOCkgewotICAgICAgICBGWFNZU19hc3NlcnQoKEZYX0RXT1JEKW1fT3BlcmF0b3IgKyAxID49IHVzZWRfYnl0ZXMpOwotICAgICAgICBpZiAodXNlZF9ieXRlcyA9PSBtX09wZXJhdG9yICsgMSkgewotICAgICAgICAgICAgbV9TcmNPZmZzZXQgKz0gdXNlZF9ieXRlczsKLSAgICAgICAgICAgIEdldE5leHRPcGVyYXRvcigpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1fT3BlcmF0b3IgLT0gdXNlZF9ieXRlczsKLSAgICAgICAgbV9TcmNPZmZzZXQgKz0gdXNlZF9ieXRlczsKLSAgICAgICAgaWYgKG1fU3JjT2Zmc2V0ID49IG1fU3JjU2l6ZSkgewotICAgICAgICAgICAgbV9PcGVyYXRvciA9IDEyODsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47CisgICAgICBGWF9EV09SRCBjb3B5X2xlbiA9IG1fT3BlcmF0b3IgKyAxOworICAgICAgaWYgKGNvbF9wb3MgKyBjb3B5X2xlbiA+PSBtX2R3TGluZUJ5dGVzKSB7CisgICAgICAgIGNvcHlfbGVuID0gbV9kd0xpbmVCeXRlcyAtIGNvbF9wb3M7CisgICAgICAgIGVvbCA9IFRSVUU7CisgICAgICB9CisgICAgICBpZiAoY29weV9sZW4gPj0gbV9TcmNTaXplIC0gbV9TcmNPZmZzZXQpIHsKKyAgICAgICAgY29weV9sZW4gPSBtX1NyY1NpemUgLSBtX1NyY09mZnNldDsKKyAgICAgICAgbV9iRU9EID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIEZYU1lTX21lbWNweShtX3BTY2FubGluZSArIGNvbF9wb3MsIG1fcFNyY0J1ZiArIG1fU3JjT2Zmc2V0LCBjb3B5X2xlbik7CisgICAgICBjb2xfcG9zICs9IGNvcHlfbGVuOworICAgICAgVXBkYXRlT3BlcmF0b3IoKHVpbnQ4X3QpY29weV9sZW4pOworICAgIH0gZWxzZSBpZiAobV9PcGVyYXRvciA+IDEyOCkgeworICAgICAgaW50IGZpbGwgPSAwOworICAgICAgaWYgKG1fU3JjT2Zmc2V0IC0gMSA8IG1fU3JjU2l6ZSAtIDEpIHsKKyAgICAgICAgZmlsbCA9IG1fcFNyY0J1ZlttX1NyY09mZnNldF07CisgICAgICB9CisgICAgICBGWF9EV09SRCBkdXBsaWNhdGVfbGVuID0gMjU3IC0gbV9PcGVyYXRvcjsKKyAgICAgIGlmIChjb2xfcG9zICsgZHVwbGljYXRlX2xlbiA+PSBtX2R3TGluZUJ5dGVzKSB7CisgICAgICAgIGR1cGxpY2F0ZV9sZW4gPSBtX2R3TGluZUJ5dGVzIC0gY29sX3BvczsKKyAgICAgICAgZW9sID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIEZYU1lTX21lbXNldChtX3BTY2FubGluZSArIGNvbF9wb3MsIGZpbGwsIGR1cGxpY2F0ZV9sZW4pOworICAgICAgY29sX3BvcyArPSBkdXBsaWNhdGVfbGVuOworICAgICAgVXBkYXRlT3BlcmF0b3IoKHVpbnQ4X3QpZHVwbGljYXRlX2xlbik7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fYkVPRCA9IFRSVUU7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgRlhfQllURSBjb3VudCA9IDI1NyAtIG1fT3BlcmF0b3I7Ci0gICAgRlhTWVNfYXNzZXJ0KChGWF9EV09SRCljb3VudCA+PSB1c2VkX2J5dGVzKTsKLSAgICBpZiAodXNlZF9ieXRlcyA9PSBjb3VudCkgewotICAgICAgICBtX1NyY09mZnNldCArKzsKLSAgICAgICAgR2V0TmV4dE9wZXJhdG9yKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY291bnQgLT0gdXNlZF9ieXRlczsKLSAgICBtX09wZXJhdG9yID0gMjU3IC0gY291bnQ7CisgIH0KKyAgcmV0dXJuIG1fcFNjYW5saW5lOwogfQotSUNvZGVjX1NjYW5saW5lRGVjb2RlciogQ0NvZGVjX0Jhc2ljTW9kdWxlOjpDcmVhdGVSdW5MZW5ndGhEZWNvZGVyKEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgaW50IG5Db21wcywgaW50IGJwYykKLXsKLSAgICBDQ29kZWNfUkxTY2FubGluZURlY29kZXIqIHBSTFNjYW5saW5lRGVjb2RlciA9IG5ldyBDQ29kZWNfUkxTY2FubGluZURlY29kZXI7Ci0gICAgaWYgKCFwUkxTY2FubGluZURlY29kZXItPkNyZWF0ZShzcmNfYnVmLCBzcmNfc2l6ZSwgd2lkdGgsIGhlaWdodCwgbkNvbXBzLCBicGMpKSB7Ci0gICAgICAgIGRlbGV0ZSBwUkxTY2FubGluZURlY29kZXI7Ci0gICAgICAgIHJldHVybiBOVUxMOwordm9pZCBDQ29kZWNfUkxTY2FubGluZURlY29kZXI6OkdldE5leHRPcGVyYXRvcigpIHsKKyAgaWYgKG1fU3JjT2Zmc2V0ID49IG1fU3JjU2l6ZSkgeworICAgIG1fT3BlcmF0b3IgPSAxMjg7CisgICAgcmV0dXJuOworICB9CisgIG1fT3BlcmF0b3IgPSBtX3BTcmNCdWZbbV9TcmNPZmZzZXRdOworICBtX1NyY09mZnNldCsrOworfQordm9pZCBDQ29kZWNfUkxTY2FubGluZURlY29kZXI6OlVwZGF0ZU9wZXJhdG9yKHVpbnQ4X3QgdXNlZF9ieXRlcykgeworICBpZiAodXNlZF9ieXRlcyA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX09wZXJhdG9yIDwgMTI4KSB7CisgICAgRlhTWVNfYXNzZXJ0KChGWF9EV09SRCltX09wZXJhdG9yICsgMSA+PSB1c2VkX2J5dGVzKTsKKyAgICBpZiAodXNlZF9ieXRlcyA9PSBtX09wZXJhdG9yICsgMSkgeworICAgICAgbV9TcmNPZmZzZXQgKz0gdXNlZF9ieXRlczsKKyAgICAgIEdldE5leHRPcGVyYXRvcigpOworICAgICAgcmV0dXJuOwogICAgIH0KLSAgICByZXR1cm4gcFJMU2NhbmxpbmVEZWNvZGVyOworICAgIG1fT3BlcmF0b3IgLT0gdXNlZF9ieXRlczsKKyAgICBtX1NyY09mZnNldCArPSB1c2VkX2J5dGVzOworICAgIGlmIChtX1NyY09mZnNldCA+PSBtX1NyY1NpemUpIHsKKyAgICAgIG1fT3BlcmF0b3IgPSAxMjg7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICB1aW50OF90IGNvdW50ID0gMjU3IC0gbV9PcGVyYXRvcjsKKyAgRlhTWVNfYXNzZXJ0KChGWF9EV09SRCljb3VudCA+PSB1c2VkX2J5dGVzKTsKKyAgaWYgKHVzZWRfYnl0ZXMgPT0gY291bnQpIHsKKyAgICBtX1NyY09mZnNldCsrOworICAgIEdldE5leHRPcGVyYXRvcigpOworICAgIHJldHVybjsKKyAgfQorICBjb3VudCAtPSB1c2VkX2J5dGVzOworICBtX09wZXJhdG9yID0gMjU3IC0gY291bnQ7Cit9CitJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKiBDQ29kZWNfQmFzaWNNb2R1bGU6OkNyZWF0ZVJ1bkxlbmd0aERlY29kZXIoCisgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IGhlaWdodCwKKyAgICBpbnQgbkNvbXBzLAorICAgIGludCBicGMpIHsKKyAgQ0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyKiBwUkxTY2FubGluZURlY29kZXIgPSBuZXcgQ0NvZGVjX1JMU2NhbmxpbmVEZWNvZGVyOworICBpZiAoIXBSTFNjYW5saW5lRGVjb2Rlci0+Q3JlYXRlKHNyY19idWYsIHNyY19zaXplLCB3aWR0aCwgaGVpZ2h0LCBuQ29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnBjKSkgeworICAgIGRlbGV0ZSBwUkxTY2FubGluZURlY29kZXI7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIHBSTFNjYW5saW5lRGVjb2RlcjsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfYm1wLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfYm1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGIyZjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19ibXAuY3BwCkBAIC0wLDAgKzEsMTI3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIg0KKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9kaWIuaCINCisjaW5jbHVkZSAiY29kZWNfaW50LmgiDQorI2luY2x1ZGUgImNvcmUvc3JjL2Z4Y29kZWMvbGJtcC9meF9ibXAuaCINCitzdHJ1Y3QgRlhCTVBfQ29udGV4dCB7DQorICBibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyOw0KKyAgdm9pZCogcGFyZW50X3B0cjsNCisgIHZvaWQqIGNoaWxkX3B0cjsNCisNCisgIHZvaWQqICgqbV9BbGxvY0Z1bmMpKHVuc2lnbmVkIGludCk7DQorICB2b2lkICgqbV9GcmVlRnVuYykodm9pZCopOw0KK307DQorZXh0ZXJuICJDIiB7DQorc3RhdGljIHZvaWQqIF9ibXBfYWxsb2NfZnVuYyh1bnNpZ25lZCBpbnQgc2l6ZSkgew0KKyAgcmV0dXJuIEZYX0FsbG9jKGNoYXIsIHNpemUpOw0KK30NCitzdGF0aWMgdm9pZCBfYm1wX2ZyZWVfZnVuYyh2b2lkKiBwKSB7DQorICBpZiAocCAhPSBOVUxMKSB7DQorICAgIEZYX0ZyZWUocCk7DQorICB9DQorfQ0KK307DQorc3RhdGljIHZvaWQgX2JtcF9lcnJvcl9kYXRhKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGVycl9tc2cpIHsNCisgIEZYU1lTX3N0cm5jcHkoKGNoYXIqKWJtcF9wdHItPmVycl9wdHIsIGVycl9tc2csIEJNUF9NQVhfRVJST1JfU0laRSAtIDEpOw0KKyAgbG9uZ2ptcChibXBfcHRyLT5qbXBidWYsIDEpOw0KK30NCitzdGF0aWMgdm9pZCBfYm1wX3JlYWRfc2NhbmxpbmUoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByb3dfbnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByb3dfYnVmKSB7DQorICBGWEJNUF9Db250ZXh0KiBwID0gKEZYQk1QX0NvbnRleHQqKWJtcF9wdHItPmNvbnRleHRfcHRyOw0KKyAgQ0NvZGVjX0JtcE1vZHVsZSogcE1vZHVsZSA9IChDQ29kZWNfQm1wTW9kdWxlKilwLT5wYXJlbnRfcHRyOw0KKyAgcE1vZHVsZS0+UmVhZFNjYW5saW5lQ2FsbGJhY2socC0+Y2hpbGRfcHRyLCByb3dfbnVtLCByb3dfYnVmKTsNCit9DQorc3RhdGljIEZYX0JPT0wgX2JtcF9nZXRfZGF0YV9wb3NpdGlvbihibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgcmNkX3Bvcykgew0KKyAgRlhCTVBfQ29udGV4dCogcCA9IChGWEJNUF9Db250ZXh0KilibXBfcHRyLT5jb250ZXh0X3B0cjsNCisgIENDb2RlY19CbXBNb2R1bGUqIHBNb2R1bGUgPSAoQ0NvZGVjX0JtcE1vZHVsZSopcC0+cGFyZW50X3B0cjsNCisgIHJldHVybiBwTW9kdWxlLT5JbnB1dEltYWdlUG9zaXRpb25CdWZDYWxsYmFjayhwLT5jaGlsZF9wdHIsIHJjZF9wb3MpOw0KK30NCit2b2lkKiBDQ29kZWNfQm1wTW9kdWxlOjpTdGFydCh2b2lkKiBwTW9kdWxlKSB7DQorICBGWEJNUF9Db250ZXh0KiBwID0gKEZYQk1QX0NvbnRleHQqKUZYX0FsbG9jKHVpbnQ4X3QsIHNpemVvZihGWEJNUF9Db250ZXh0KSk7DQorICBpZiAocCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgRlhTWVNfbWVtc2V0KHAsIDAsIHNpemVvZihGWEJNUF9Db250ZXh0KSk7DQorICBpZiAocCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcC0+bV9BbGxvY0Z1bmMgPSBfYm1wX2FsbG9jX2Z1bmM7DQorICBwLT5tX0ZyZWVGdW5jID0gX2JtcF9mcmVlX2Z1bmM7DQorICBwLT5ibXBfcHRyID0gTlVMTDsNCisgIHAtPnBhcmVudF9wdHIgPSAodm9pZCopdGhpczsNCisgIHAtPmNoaWxkX3B0ciA9IHBNb2R1bGU7DQorICBwLT5ibXBfcHRyID0gX2JtcF9jcmVhdGVfZGVjb21wcmVzcygpOw0KKyAgaWYgKHAtPmJtcF9wdHIgPT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKHApOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHAtPmJtcF9wdHItPmNvbnRleHRfcHRyID0gKHZvaWQqKXA7DQorICBwLT5ibXBfcHRyLT5lcnJfcHRyID0gbV9zekxhc3RFcnJvcjsNCisgIHAtPmJtcF9wdHItPl9ibXBfZXJyb3JfZm4gPSBfYm1wX2Vycm9yX2RhdGE7DQorICBwLT5ibXBfcHRyLT5fYm1wX2dldF9yb3dfZm4gPSBfYm1wX3JlYWRfc2NhbmxpbmU7DQorICBwLT5ibXBfcHRyLT5fYm1wX2dldF9kYXRhX3Bvc2l0aW9uX2ZuID0gX2JtcF9nZXRfZGF0YV9wb3NpdGlvbjsNCisgIHJldHVybiBwOw0KK30NCit2b2lkIENDb2RlY19CbXBNb2R1bGU6OkZpbmlzaCh2b2lkKiBwQ29udGV4dCkgew0KKyAgRlhCTVBfQ29udGV4dCogcCA9IChGWEJNUF9Db250ZXh0KilwQ29udGV4dDsNCisgIGlmIChwICE9IE5VTEwpIHsNCisgICAgX2JtcF9kZXN0cm95X2RlY29tcHJlc3MoJnAtPmJtcF9wdHIpOw0KKyAgICBwLT5tX0ZyZWVGdW5jKHApOw0KKyAgfQ0KK30NCitpbnQzMl90IENDb2RlY19CbXBNb2R1bGU6OlJlYWRIZWFkZXIodm9pZCogcENvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wqIHRiX2ZsYWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGNvbXBvbmVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBhbF9udW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiogcGFsX3BwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKSB7DQorICBGWEJNUF9Db250ZXh0KiBwID0gKEZYQk1QX0NvbnRleHQqKXBDb250ZXh0Ow0KKyAgaWYgKHNldGptcChwLT5ibXBfcHRyLT5qbXBidWYpKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaW50MzJfdCByZXQgPSBfYm1wX3JlYWRfaGVhZGVyKHAtPmJtcF9wdHIpOw0KKyAgaWYgKHJldCAhPSAxKSB7DQorICAgIHJldHVybiByZXQ7DQorICB9DQorICAqd2lkdGggPSBwLT5ibXBfcHRyLT53aWR0aDsNCisgICpoZWlnaHQgPSBwLT5ibXBfcHRyLT5oZWlnaHQ7DQorICAqdGJfZmxhZyA9IHAtPmJtcF9wdHItPmltZ1RCX2ZsYWc7DQorICAqY29tcG9uZW50cyA9IHAtPmJtcF9wdHItPmNvbXBvbmVudHM7DQorICAqcGFsX251bSA9IHAtPmJtcF9wdHItPnBhbF9udW07DQorICAqcGFsX3BwID0gcC0+Ym1wX3B0ci0+cGFsX3B0cjsNCisgIGlmIChwQXR0cmlidXRlKSB7DQorICAgIHBBdHRyaWJ1dGUtPm1fd0RQSVVuaXQgPSBGWENPREVDX1JFU1VOSVRfTUVURVI7DQorICAgIHBBdHRyaWJ1dGUtPm1fblhEUEkgPSBwLT5ibXBfcHRyLT5kcGlfeDsNCisgICAgcEF0dHJpYnV0ZS0+bV9uWURQSSA9IHAtPmJtcF9wdHItPmRwaV95Ow0KKyAgICBwQXR0cmlidXRlLT5tX25CbXBDb21wcmVzc1R5cGUgPSBwLT5ibXBfcHRyLT5jb21wcmVzc19mbGFnOw0KKyAgfQ0KKyAgcmV0dXJuIDE7DQorfQ0KK2ludDMyX3QgQ0NvZGVjX0JtcE1vZHVsZTo6TG9hZEltYWdlKHZvaWQqIHBDb250ZXh0KSB7DQorICBGWEJNUF9Db250ZXh0KiBwID0gKEZYQk1QX0NvbnRleHQqKXBDb250ZXh0Ow0KKyAgaWYgKHNldGptcChwLT5ibXBfcHRyLT5qbXBidWYpKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgcmV0dXJuIF9ibXBfZGVjb2RlX2ltYWdlKHAtPmJtcF9wdHIpOw0KK30NCitGWF9EV09SRCBDQ29kZWNfQm1wTW9kdWxlOjpHZXRBdmFpbElucHV0KHZvaWQqIHBDb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGF2aWFsX2J1Zl9wdHIpIHsNCisgIEZYQk1QX0NvbnRleHQqIHAgPSAoRlhCTVBfQ29udGV4dCopcENvbnRleHQ7DQorICByZXR1cm4gX2JtcF9nZXRfYXZhaWxfaW5wdXQocC0+Ym1wX3B0ciwgYXZpYWxfYnVmX3B0cik7DQorfQ0KK3ZvaWQgQ0NvZGVjX0JtcE1vZHVsZTo6SW5wdXQodm9pZCogcENvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUpIHsNCisgIEZYQk1QX0NvbnRleHQqIHAgPSAoRlhCTVBfQ29udGV4dCopcENvbnRleHQ7DQorICBfYm1wX2lucHV0X2J1ZmZlcihwLT5ibXBfcHRyLCAodWludDhfdCopc3JjX2J1Ziwgc3JjX3NpemUpOw0KK30NCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZheC5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZheC5jcHAKaW5kZXggZGMyZWUyYS4uYjE5OGU3NCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19mYXguY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZmF4LmNwcApAQCAtMSw5ODUgKzEsODMxIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCIKICNpbmNsdWRlICJjb2RlY19pbnQuaCIKLWNvbnN0IEZYX0JZVEUgT25lTGVhZFBvc1syNTZdID0gewotICAgIDgsIDcsIDYsIDYsIDUsIDUsIDUsIDUsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCi0gICAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKLSAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAotICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCi0gICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAotICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0gICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IHVpbnQ4X3QgT25lTGVhZFBvc1syNTZdID0geworICAgIDgsIDcsIDYsIDYsIDUsIDUsIDUsIDUsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgICAgMywgMywgMywgMywgMywgMywgMywgMywgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCiAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKIH07Ci1jb25zdCBGWF9CWVRFIFplcm9MZWFkUG9zWzI1Nl0gPSB7Ci0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0gICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAotICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0gICAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKLSAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAotICAgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCitjb25zdCB1aW50OF90IFplcm9MZWFkUG9zWzI1Nl0gPSB7CisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgICAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKICAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCA2LCA2LCA3LCA4LAogfTsKIAotaW50IF9GaW5kQml0KGNvbnN0IEZYX0JZVEUqIGRhdGFfYnVmLCBpbnQgbWF4X3BvcywgaW50IHN0YXJ0X3BvcywgaW50IGJpdCkKLXsKLSAgICBpZiAoc3RhcnRfcG9zID49IG1heF9wb3MpIHsKLSAgICAgICAgcmV0dXJuIG1heF9wb3M7CitpbnQgRmluZEJpdChjb25zdCB1aW50OF90KiBkYXRhX2J1ZiwgaW50IG1heF9wb3MsIGludCBzdGFydF9wb3MsIGludCBiaXQpIHsKKyAgaWYgKHN0YXJ0X3BvcyA+PSBtYXhfcG9zKSB7CisgICAgcmV0dXJuIG1heF9wb3M7CisgIH0KKyAgY29uc3QgdWludDhfdCogbGVhZGluZ19wb3MgPSBiaXQgPyBPbmVMZWFkUG9zIDogWmVyb0xlYWRQb3M7CisgIGlmIChzdGFydF9wb3MgJSA4KSB7CisgICAgdWludDhfdCBkYXRhID0gZGF0YV9idWZbc3RhcnRfcG9zIC8gOF07CisgICAgaWYgKGJpdCkgeworICAgICAgZGF0YSAmPSAweGZmID4+IChzdGFydF9wb3MgJSA4KTsKKyAgICB9IGVsc2UgeworICAgICAgZGF0YSB8PSAweGZmIDw8ICg4IC0gc3RhcnRfcG9zICUgOCk7CiAgICAgfQotICAgIEZYX0xQQ0JZVEUgbGVhZGluZ19wb3MgPSBiaXQgPyBPbmVMZWFkUG9zIDogWmVyb0xlYWRQb3M7Ci0gICAgaWYgKHN0YXJ0X3BvcyAlIDgpIHsKLSAgICAgICAgRlhfQllURSBkYXRhID0gZGF0YV9idWZbc3RhcnRfcG9zIC8gOF07Ci0gICAgICAgIGlmIChiaXQpIHsKLSAgICAgICAgICAgIGRhdGEgJj0gMHhmZiA+PiAoc3RhcnRfcG9zICUgOCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkYXRhIHw9IDB4ZmYgPDwgKDggLSBzdGFydF9wb3MgJSA4KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobGVhZGluZ19wb3NbZGF0YV0gPCA4KSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhcnRfcG9zIC8gOCAqIDggKyBsZWFkaW5nX3Bvc1tkYXRhXTsKLSAgICAgICAgfQotICAgICAgICBzdGFydF9wb3MgKz0gNzsKKyAgICBpZiAobGVhZGluZ19wb3NbZGF0YV0gPCA4KSB7CisgICAgICByZXR1cm4gc3RhcnRfcG9zIC8gOCAqIDggKyBsZWFkaW5nX3Bvc1tkYXRhXTsKICAgICB9Ci0gICAgRlhfQllURSBza2lwID0gYml0ID8gMHgwMCA6IDB4ZmY7Ci0gICAgaW50IGJ5dGVfcG9zID0gc3RhcnRfcG9zIC8gODsKLSAgICBpbnQgbWF4X2J5dGUgPSAobWF4X3BvcyArIDcpIC8gODsKLSAgICB3aGlsZSAoYnl0ZV9wb3MgPCBtYXhfYnl0ZSkgewotICAgICAgICBpZiAoZGF0YV9idWZbYnl0ZV9wb3NdICE9IHNraXApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGJ5dGVfcG9zICsrOworICAgIHN0YXJ0X3BvcyArPSA3OworICB9CisgIHVpbnQ4X3Qgc2tpcCA9IGJpdCA/IDB4MDAgOiAweGZmOworICBpbnQgYnl0ZV9wb3MgPSBzdGFydF9wb3MgLyA4OworICBpbnQgbWF4X2J5dGUgPSAobWF4X3BvcyArIDcpIC8gODsKKyAgd2hpbGUgKGJ5dGVfcG9zIDwgbWF4X2J5dGUpIHsKKyAgICBpZiAoZGF0YV9idWZbYnl0ZV9wb3NdICE9IHNraXApIHsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICBpZiAoYnl0ZV9wb3MgPT0gbWF4X2J5dGUpIHsKLSAgICAgICAgcmV0dXJuIG1heF9wb3M7Ci0gICAgfQotICAgIGludCBwb3MgPSBsZWFkaW5nX3Bvc1tkYXRhX2J1ZltieXRlX3Bvc11dICsgYnl0ZV9wb3MgKiA4OwotICAgIGlmIChwb3MgPiBtYXhfcG9zKSB7Ci0gICAgICAgIHBvcyA9IG1heF9wb3M7Ci0gICAgfQotICAgIHJldHVybiBwb3M7CisgICAgYnl0ZV9wb3MrKzsKKyAgfQorICBpZiAoYnl0ZV9wb3MgPT0gbWF4X2J5dGUpIHsKKyAgICByZXR1cm4gbWF4X3BvczsKKyAgfQorICBpbnQgcG9zID0gbGVhZGluZ19wb3NbZGF0YV9idWZbYnl0ZV9wb3NdXSArIGJ5dGVfcG9zICogODsKKyAgaWYgKHBvcyA+IG1heF9wb3MpIHsKKyAgICBwb3MgPSBtYXhfcG9zOworICB9CisgIHJldHVybiBwb3M7CiB9Ci12b2lkIF9GYXhHNEZpbmRCMUIyKGNvbnN0IEZYX0JZVEUqIHJlZl9idWYsIGludCBjb2x1bW5zLCBpbnQgYTAsIEZYX0JPT0wgYTBjb2xvciwgaW50JiBiMSwgaW50JiBiMikKLXsKLSAgICBpZiAoYTBjb2xvcikgewotICAgICAgICBhMGNvbG9yID0gMTsKLSAgICB9Ci0gICAgRlhfQllURSBmaXJzdF9iaXQgPSAoYTAgPCAwKSA/IDEgOiAoKHJlZl9idWZbYTAgLyA4XSAmICgxIDw8ICg3IC0gYTAgJSA4KSkpICE9IDApOwotICAgIGIxID0gX0ZpbmRCaXQocmVmX2J1ZiwgY29sdW1ucywgYTAgKyAxLCAhZmlyc3RfYml0KTsKLSAgICBpZiAoYjEgPj0gY29sdW1ucykgewotICAgICAgICBiMSA9IGIyID0gY29sdW1uczsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoZmlyc3RfYml0ID09ICFhMGNvbG9yKSB7Ci0gICAgICAgIGIxID0gX0ZpbmRCaXQocmVmX2J1ZiwgY29sdW1ucywgYjEgKyAxLCBmaXJzdF9iaXQpOwotICAgICAgICBmaXJzdF9iaXQgPSAhZmlyc3RfYml0OwotICAgIH0KLSAgICBpZiAoYjEgPj0gY29sdW1ucykgewotICAgICAgICBiMSA9IGIyID0gY29sdW1uczsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBiMiA9IF9GaW5kQml0KHJlZl9idWYsIGNvbHVtbnMsIGIxICsgMSwgZmlyc3RfYml0KTsKKwordm9pZCBGYXhHNEZpbmRCMUIyKGNvbnN0IHVpbnQ4X3QqIHJlZl9idWYsCisgICAgICAgICAgICAgICAgICAgaW50IGNvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgaW50IGEwLAorICAgICAgICAgICAgICAgICAgIGJvb2wgYTBjb2xvciwKKyAgICAgICAgICAgICAgICAgICBpbnQmIGIxLAorICAgICAgICAgICAgICAgICAgIGludCYgYjIpIHsKKyAgdWludDhfdCBmaXJzdF9iaXQgPQorICAgICAgKGEwIDwgMCkgPyAxIDogKChyZWZfYnVmW2EwIC8gOF0gJiAoMSA8PCAoNyAtIGEwICUgOCkpKSAhPSAwKTsKKyAgYjEgPSBGaW5kQml0KHJlZl9idWYsIGNvbHVtbnMsIGEwICsgMSwgIWZpcnN0X2JpdCk7CisgIGlmIChiMSA+PSBjb2x1bW5zKSB7CisgICAgYjEgPSBiMiA9IGNvbHVtbnM7CisgICAgcmV0dXJuOworICB9CisgIGlmIChmaXJzdF9iaXQgPT0gIWEwY29sb3IpIHsKKyAgICBiMSA9IEZpbmRCaXQocmVmX2J1ZiwgY29sdW1ucywgYjEgKyAxLCBmaXJzdF9iaXQpOworICAgIGZpcnN0X2JpdCA9ICFmaXJzdF9iaXQ7CisgIH0KKyAgaWYgKGIxID49IGNvbHVtbnMpIHsKKyAgICBiMSA9IGIyID0gY29sdW1uczsKKyAgICByZXR1cm47CisgIH0KKyAgYjIgPSBGaW5kQml0KHJlZl9idWYsIGNvbHVtbnMsIGIxICsgMSwgZmlyc3RfYml0KTsKIH0KLXZvaWQgX0ZheEZpbGxCaXRzKEZYX0xQQllURSBkZXN0X2J1ZiwgaW50IGNvbHVtbnMsIGludCBzdGFydHBvcywgaW50IGVuZHBvcykKLXsKLSAgICBpZiAoc3RhcnRwb3MgPCAwKSB7Ci0gICAgICAgIHN0YXJ0cG9zID0gMDsKKwordm9pZCBGYXhGaWxsQml0cyh1aW50OF90KiBkZXN0X2J1ZiwgaW50IGNvbHVtbnMsIGludCBzdGFydHBvcywgaW50IGVuZHBvcykgeworICBpZiAoc3RhcnRwb3MgPCAwKSB7CisgICAgc3RhcnRwb3MgPSAwOworICB9CisgIGlmIChlbmRwb3MgPCAwKSB7CisgICAgZW5kcG9zID0gMDsKKyAgfQorICBpZiAoZW5kcG9zID49IGNvbHVtbnMpIHsKKyAgICBlbmRwb3MgPSBjb2x1bW5zOworICB9CisgIGlmIChzdGFydHBvcyA+PSBlbmRwb3MpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IGZpcnN0X2J5dGUgPSBzdGFydHBvcyAvIDg7CisgIGludCBsYXN0X2J5dGUgPSAoZW5kcG9zIC0gMSkgLyA4OworICBpZiAoZmlyc3RfYnl0ZSA9PSBsYXN0X2J5dGUpIHsKKyAgICBmb3IgKGludCBpID0gc3RhcnRwb3MgJSA4OyBpIDw9IChlbmRwb3MgLSAxKSAlIDg7IGkrKykgeworICAgICAgZGVzdF9idWZbZmlyc3RfYnl0ZV0gLT0gMSA8PCAoNyAtIGkpOwogICAgIH0KLSAgICBpZiAoZW5kcG9zIDwgMCkgewotICAgICAgICBlbmRwb3MgPSAwOwotICAgIH0KLSAgICBpZiAoZW5kcG9zID49IGNvbHVtbnMpIHsKLSAgICAgICAgZW5kcG9zID0gY29sdW1uczsKLSAgICB9Ci0gICAgaWYgKHN0YXJ0cG9zID49IGVuZHBvcykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludCBmaXJzdF9ieXRlID0gc3RhcnRwb3MgLyA4OwotICAgIGludCBsYXN0X2J5dGUgPSAoZW5kcG9zIC0gMSkgLyA4OwotICAgIGlmIChmaXJzdF9ieXRlID09IGxhc3RfYnl0ZSkgewotICAgICAgICBmb3IgKGludCBpID0gc3RhcnRwb3MgJSA4OyBpIDw9IChlbmRwb3MgLSAxKSAlIDg7IGkgKyspIHsKLSAgICAgICAgICAgIGRlc3RfYnVmW2ZpcnN0X2J5dGVdIC09IDEgPDwgKDcgLSBpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludCBpOwotICAgIGZvciAoaSA9IHN0YXJ0cG9zICUgODsgaSA8IDg7IGkgKyspIHsKLSAgICAgICAgZGVzdF9idWZbZmlyc3RfYnl0ZV0gLT0gMSA8PCAoNyAtIGkpOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDw9IChlbmRwb3MgLSAxKSAlIDg7IGkgKyspIHsKLSAgICAgICAgZGVzdF9idWZbbGFzdF9ieXRlXSAtPSAxIDw8ICg3IC0gaSk7Ci0gICAgfQotICAgIGlmIChsYXN0X2J5dGUgPiBmaXJzdF9ieXRlICsgMSkgewotICAgICAgICBGWFNZU19tZW1zZXQzMihkZXN0X2J1ZiArIGZpcnN0X2J5dGUgKyAxLCAwLCBsYXN0X2J5dGUgLSBmaXJzdF9ieXRlIC0gMSk7Ci0gICAgfQorICAgIHJldHVybjsKKyAgfQorICBpbnQgaTsKKyAgZm9yIChpID0gc3RhcnRwb3MgJSA4OyBpIDwgODsgaSsrKSB7CisgICAgZGVzdF9idWZbZmlyc3RfYnl0ZV0gLT0gMSA8PCAoNyAtIGkpOworICB9CisgIGZvciAoaSA9IDA7IGkgPD0gKGVuZHBvcyAtIDEpICUgODsgaSsrKSB7CisgICAgZGVzdF9idWZbbGFzdF9ieXRlXSAtPSAxIDw8ICg3IC0gaSk7CisgIH0KKyAgaWYgKGxhc3RfYnl0ZSA+IGZpcnN0X2J5dGUgKyAxKSB7CisgICAgRlhTWVNfbWVtc2V0KGRlc3RfYnVmICsgZmlyc3RfYnl0ZSArIDEsIDAsIGxhc3RfYnl0ZSAtIGZpcnN0X2J5dGUgLSAxKTsKKyAgfQogfQotI2RlZmluZSBORVhUQklUIHNyY19idWZbYml0cG9zLzhdICYgKDEgPDwgKDctYml0cG9zJTgpKTsgYml0cG9zICsrOwotI2RlZmluZSBBRERCSVQoY29kZSwgYml0KSBjb2RlID0gY29kZSA8PCAxOyBpZiAoYml0KSBjb2RlICsrOwotI2RlZmluZSBHRVRCSVQoYml0cG9zKSBzcmNfYnVmW2JpdHBvcy84XSAmICgxIDw8ICg3LWJpdHBvcyU4KSkKLXN0YXRpYyBjb25zdCBGWF9CWVRFIEZheEJsYWNrUnVuSW5zW10gPSB7Ci0gICAgMCwKLSAgICAyLAotICAgIDB4MDIsIDMsIDAsCi0gICAgMHgwMywgMiwgMCwKLSAgICAyLAotICAgIDB4MDIsIDEsIDAsCi0gICAgMHgwMywgNCwgMCwKLSAgICAyLAotICAgIDB4MDIsIDYsIDAsCi0gICAgMHgwMywgNSwgMCwKLSAgICAxLAotICAgIDB4MDMsIDcsIDAsCi0gICAgMiwKLSAgICAweDA0LCA5LCAwLAotICAgIDB4MDUsIDgsIDAsCi0gICAgMywKLSAgICAweDA0LCAxMCwgMCwKLSAgICAweDA1LCAxMSwgMCwKLSAgICAweDA3LCAxMiwgMCwKLSAgICAyLAotICAgIDB4MDQsIDEzLCAwLAotICAgIDB4MDcsIDE0LCAwLAotICAgIDEsCi0gICAgMHgxOCwgMTUsIDAsCi0gICAgNSwKLSAgICAweDA4LCAxOCwgMCwKLSAgICAweDBmLCA2NCwgMCwKLSAgICAweDE3LCAxNiwgMCwKLSAgICAweDE4LCAxNywgMCwKLSAgICAweDM3LCAwLCAwLAotICAgIDEwLAotICAgIDB4MDgsIDB4MDAsIDB4MDcsCi0gICAgMHgwYywgMHg0MCwgMHgwNywKLSAgICAweDBkLCAweDgwLCAweDA3LAotICAgIDB4MTcsIDI0LCAwLAotICAgIDB4MTgsIDI1LCAwLAotICAgIDB4MjgsIDIzLCAwLAotICAgIDB4MzcsIDIyLCAwLAotICAgIDB4NjcsIDE5LCAwLAotICAgIDB4NjgsIDIwLCAwLAotICAgIDB4NmMsIDIxLCAwLAotICAgIDU0LAotICAgIDB4MTIsIDE5ODQgJSAyNTYsIDE5ODQgLyAyNTYsCi0gICAgMHgxMywgMjA0OCAlIDI1NiwgMjA0OCAvIDI1NiwKLSAgICAweDE0LCAyMTEyICUgMjU2LCAyMTEyIC8gMjU2LAotICAgIDB4MTUsIDIxNzYgJSAyNTYsIDIxNzYgLyAyNTYsCi0gICAgMHgxNiwgMjI0MCAlIDI1NiwgMjI0MCAvIDI1NiwKLSAgICAweDE3LCAyMzA0ICUgMjU2LCAyMzA0IC8gMjU2LAotICAgIDB4MWMsIDIzNjggJSAyNTYsIDIzNjggLyAyNTYsCi0gICAgMHgxZCwgMjQzMiAlIDI1NiwgMjQzMiAvIDI1NiwKLSAgICAweDFlLCAyNDk2ICUgMjU2LCAyNDk2IC8gMjU2LAotICAgIDB4MWYsIDI1NjAgJSAyNTYsIDI1NjAgLyAyNTYsCi0gICAgMHgyNCwgNTIsIDAsCi0gICAgMHgyNywgNTUsIDAsCi0gICAgMHgyOCwgNTYsIDAsCi0gICAgMHgyYiwgNTksIDAsCi0gICAgMHgyYywgNjAsIDAsCi0gICAgMHgzMywgMzIwICUgMjU2LCAzMjAgLyAyNTYsCi0gICAgMHgzNCwgMzg0ICUgMjU2LCAzODQgLyAyNTYsCi0gICAgMHgzNSwgNDQ4ICUgMjU2LCA0NDggLyAyNTYsCi0gICAgMHgzNywgNTMsIDAsCi0gICAgMHgzOCwgNTQsIDAsCi0gICAgMHg1MiwgNTAsIDAsCi0gICAgMHg1MywgNTEsIDAsCi0gICAgMHg1NCwgNDQsIDAsCi0gICAgMHg1NSwgNDUsIDAsCi0gICAgMHg1NiwgNDYsIDAsCi0gICAgMHg1NywgNDcsIDAsCi0gICAgMHg1OCwgNTcsIDAsCi0gICAgMHg1OSwgNTgsIDAsCi0gICAgMHg1YSwgNjEsIDAsCi0gICAgMHg1YiwgMjU2ICUgMjU2LCAyNTYgLyAyNTYsCi0gICAgMHg2NCwgNDgsIDAsCi0gICAgMHg2NSwgNDksIDAsCi0gICAgMHg2NiwgNjIsIDAsCi0gICAgMHg2NywgNjMsIDAsCi0gICAgMHg2OCwgMzAsIDAsCi0gICAgMHg2OSwgMzEsIDAsCi0gICAgMHg2YSwgMzIsIDAsCi0gICAgMHg2YiwgMzMsIDAsCi0gICAgMHg2YywgNDAsIDAsCi0gICAgMHg2ZCwgNDEsIDAsCi0gICAgMHhjOCwgMTI4LCAwLAotICAgIDB4YzksIDE5MiwgMCwKLSAgICAweGNhLCAyNiwgMCwKLSAgICAweGNiLCAyNywgMCwKLSAgICAweGNjLCAyOCwgMCwKLSAgICAweGNkLCAyOSwgMCwKLSAgICAweGQyLCAzNCwgMCwKLSAgICAweGQzLCAzNSwgMCwKLSAgICAweGQ0LCAzNiwgMCwKLSAgICAweGQ1LCAzNywgMCwKLSAgICAweGQ2LCAzOCwgMCwKLSAgICAweGQ3LCAzOSwgMCwKLSAgICAweGRhLCA0MiwgMCwKLSAgICAweGRiLCA0MywgMCwKLSAgICAyMCwKLSAgICAweDRhLCA2NDAgJSAyNTYsIDY0MCAvIDI1NiwKLSAgICAweDRiLCA3MDQgJSAyNTYsIDcwNCAvIDI1NiwKLSAgICAweDRjLCA3NjggJSAyNTYsIDc2OCAvIDI1NiwKLSAgICAweDRkLCA4MzIgJSAyNTYsIDgzMiAvIDI1NiwKLSAgICAweDUyLCAxMjgwICUgMjU2LCAxMjgwIC8gMjU2LAotICAgIDB4NTMsIDEzNDQgJSAyNTYsIDEzNDQgLyAyNTYsCi0gICAgMHg1NCwgMTQwOCAlIDI1NiwgMTQwOCAvIDI1NiwKLSAgICAweDU1LCAxNDcyICUgMjU2LCAxNDcyIC8gMjU2LAotICAgIDB4NWEsIDE1MzYgJSAyNTYsIDE1MzYgLyAyNTYsCi0gICAgMHg1YiwgMTYwMCAlIDI1NiwgMTYwMCAvIDI1NiwKLSAgICAweDY0LCAxNjY0ICUgMjU2LCAxNjY0IC8gMjU2LAotICAgIDB4NjUsIDE3MjggJSAyNTYsIDE3MjggLyAyNTYsCi0gICAgMHg2YywgNTEyICUgMjU2LCA1MTIgLyAyNTYsCi0gICAgMHg2ZCwgNTc2ICUgMjU2LCA1NzYgLyAyNTYsCi0gICAgMHg3MiwgODk2ICUgMjU2LCA4OTYgLyAyNTYsCi0gICAgMHg3MywgOTYwICUgMjU2LCA5NjAgLyAyNTYsCi0gICAgMHg3NCwgMTAyNCAlIDI1NiwgMTAyNCAvIDI1NiwKLSAgICAweDc1LCAxMDg4ICUgMjU2LCAxMDg4IC8gMjU2LAotICAgIDB4NzYsIDExNTIgJSAyNTYsIDExNTIgLyAyNTYsCi0gICAgMHg3NywgMTIxNiAlIDI1NiwgMTIxNiAvIDI1NiwKLSAgICAweGZmCi19Owotc3RhdGljIGNvbnN0IEZYX0JZVEUgRmF4V2hpdGVSdW5JbnNbXSA9IHsKLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICA2LAotICAgIDB4MDcsIDIsIDAsCi0gICAgMHgwOCwgMywgMCwKLSAgICAweDBCLCA0LCAwLAotICAgIDB4MEMsIDUsIDAsCi0gICAgMHgwRSwgNiwgMCwKLSAgICAweDBGLCA3LCAwLAotICAgIDYsCi0gICAgMHgwNywgMTAsIDAsCi0gICAgMHgwOCwgMTEsIDAsCi0gICAgMHgxMiwgMTI4LCAwLAotICAgIDB4MTMsIDgsIDAsCi0gICAgMHgxNCwgOSwgMCwKLSAgICAweDFiLCA2NCwgMCwKLSAgICA5LAotICAgIDB4MDMsIDEzLCAwLAotICAgIDB4MDcsIDEsIDAsCi0gICAgMHgwOCwgMTIsIDAsCi0gICAgMHgxNywgMTkyLCAwLAotICAgIDB4MTgsIDE2NjQgJSAyNTYsIDE2NjQgLyAyNTYsCi0gICAgMHgyYSwgMTYsIDAsCi0gICAgMHgyQiwgMTcsIDAsCi0gICAgMHgzNCwgMTQsIDAsCi0gICAgMHgzNSwgMTUsIDAsCi0gICAgMTIsCi0gICAgMHgwMywgMjIsIDAsCi0gICAgMHgwNCwgMjMsIDAsCi0gICAgMHgwOCwgMjAsIDAsCi0gICAgMHgwYywgMTksIDAsCi0gICAgMHgxMywgMjYsIDAsCi0gICAgMHgxNywgMjEsIDAsCi0gICAgMHgxOCwgMjgsIDAsCi0gICAgMHgyNCwgMjcsIDAsCi0gICAgMHgyNywgMTgsIDAsCi0gICAgMHgyOCwgMjQsIDAsCi0gICAgMHgyQiwgMjUsIDAsCi0gICAgMHgzNywgMjU2ICUgMjU2LCAyNTYgLyAyNTYsCi0gICAgNDIsCi0gICAgMHgwMiwgMjksIDAsCi0gICAgMHgwMywgMzAsIDAsCi0gICAgMHgwNCwgNDUsIDAsCi0gICAgMHgwNSwgNDYsIDAsCi0gICAgMHgwYSwgNDcsIDAsCi0gICAgMHgwYiwgNDgsIDAsCi0gICAgMHgxMiwgMzMsIDAsCi0gICAgMHgxMywgMzQsIDAsCi0gICAgMHgxNCwgMzUsIDAsCi0gICAgMHgxNSwgMzYsIDAsCi0gICAgMHgxNiwgMzcsIDAsCi0gICAgMHgxNywgMzgsIDAsCi0gICAgMHgxYSwgMzEsIDAsCi0gICAgMHgxYiwgMzIsIDAsCi0gICAgMHgyNCwgNTMsIDAsCi0gICAgMHgyNSwgNTQsIDAsCi0gICAgMHgyOCwgMzksIDAsCi0gICAgMHgyOSwgNDAsIDAsCi0gICAgMHgyYSwgNDEsIDAsCi0gICAgMHgyYiwgNDIsIDAsCi0gICAgMHgyYywgNDMsIDAsCi0gICAgMHgyZCwgNDQsIDAsCi0gICAgMHgzMiwgNjEsIDAsCi0gICAgMHgzMywgNjIsIDAsCi0gICAgMHgzNCwgNjMsIDAsCi0gICAgMHgzNSwgMCwgMCwKLSAgICAweDM2LCAzMjAgJSAyNTYsIDMyMCAvIDI1NiwKLSAgICAweDM3LCAzODQgJSAyNTYsIDM4NCAvIDI1NiwKLSAgICAweDRhLCA1OSwgMCwKLSAgICAweDRiLCA2MCwgMCwKLSAgICAweDUyLCA0OSwgMCwKLSAgICAweDUzLCA1MCwgMCwKLSAgICAweDU0LCA1MSwgMCwKLSAgICAweDU1LCA1MiwgMCwKLSAgICAweDU4LCA1NSwgMCwKLSAgICAweDU5LCA1NiwgMCwKLSAgICAweDVhLCA1NywgMCwKLSAgICAweDViLCA1OCwgMCwKLSAgICAweDY0LCA0NDggJSAyNTYsIDQ0OCAvIDI1NiwKLSAgICAweDY1LCA1MTIgJSAyNTYsIDUxMiAvIDI1NiwKLSAgICAweDY3LCA2NDAgJSAyNTYsIDY0MCAvIDI1NiwKLSAgICAweDY4LCA1NzYgJSAyNTYsIDU3NiAvIDI1NiwKLSAgICAxNiwKLSAgICAweDk4LCAxNDcyICUgMjU2LCAxNDcyIC8gMjU2LAotICAgIDB4OTksIDE1MzYgJSAyNTYsIDE1MzYgLyAyNTYsCi0gICAgMHg5YSwgMTYwMCAlIDI1NiwgMTYwMCAvIDI1NiwKLSAgICAweDliLCAxNzI4ICUgMjU2LCAxNzI4IC8gMjU2LAotICAgIDB4Y2MsIDcwNCAlIDI1NiwgNzA0IC8gMjU2LAotICAgIDB4Y2QsIDc2OCAlIDI1NiwgNzY4IC8gMjU2LAotICAgIDB4ZDIsIDgzMiAlIDI1NiwgODMyIC8gMjU2LAotICAgIDB4ZDMsIDg5NiAlIDI1NiwgODk2IC8gMjU2LAotICAgIDB4ZDQsIDk2MCAlIDI1NiwgOTYwIC8gMjU2LAotICAgIDB4ZDUsIDEwMjQgJSAyNTYsIDEwMjQgLyAyNTYsCi0gICAgMHhkNiwgMTA4OCAlIDI1NiwgMTA4OCAvIDI1NiwKLSAgICAweGQ3LCAxMTUyICUgMjU2LCAxMTUyIC8gMjU2LAotICAgIDB4ZDgsIDEyMTYgJSAyNTYsIDEyMTYgLyAyNTYsCi0gICAgMHhkOSwgMTI4MCAlIDI1NiwgMTI4MCAvIDI1NiwKLSAgICAweGRhLCAxMzQ0ICUgMjU2LCAxMzQ0IC8gMjU2LAotICAgIDB4ZGIsIDE0MDggJSAyNTYsIDE0MDggLyAyNTYsCi0gICAgMCwKLSAgICAzLAotICAgIDB4MDgsIDE3OTIgJSAyNTYsIDE3OTIgLyAyNTYsCi0gICAgMHgwYywgMTg1NiAlIDI1NiwgMTg1NiAvIDI1NiwKLSAgICAweDBkLCAxOTIwICUgMjU2LCAxOTIwIC8gMjU2LAotICAgIDEwLAotICAgIDB4MTIsIDE5ODQgJSAyNTYsIDE5ODQgLyAyNTYsCi0gICAgMHgxMywgMjA0OCAlIDI1NiwgMjA0OCAvIDI1NiwKLSAgICAweDE0LCAyMTEyICUgMjU2LCAyMTEyIC8gMjU2LAotICAgIDB4MTUsIDIxNzYgJSAyNTYsIDIxNzYgLyAyNTYsCi0gICAgMHgxNiwgMjI0MCAlIDI1NiwgMjI0MCAvIDI1NiwKLSAgICAweDE3LCAyMzA0ICUgMjU2LCAyMzA0IC8gMjU2LAotICAgIDB4MWMsIDIzNjggJSAyNTYsIDIzNjggLyAyNTYsCi0gICAgMHgxZCwgMjQzMiAlIDI1NiwgMjQzMiAvIDI1NiwKLSAgICAweDFlLCAyNDk2ICUgMjU2LCAyNDk2IC8gMjU2LAotICAgIDB4MWYsIDI1NjAgJSAyNTYsIDI1NjAgLyAyNTYsCisKKyNkZWZpbmUgTkVYVEJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNyY19idWZbYml0cG9zIC8gOF0gJiAoMSA8PCAoNyAtIGJpdHBvcyAlIDgpKTsgXAorICBiaXRwb3MrKzsKKyNkZWZpbmUgQUREQklUKGNvZGUsIGJpdCkgXAorICBjb2RlID0gY29kZSA8PCAxOyAgICAgICBcCisgIGlmIChiaXQpICAgICAgICAgICAgICAgIFwKKyAgICBjb2RlKys7CisjZGVmaW5lIEdFVEJJVChiaXRwb3MpIHNyY19idWZbYml0cG9zIC8gOF0gJiAoMSA8PCAoNyAtIGJpdHBvcyAlIDgpKQorCitjb25zdCB1aW50OF90IEZheEJsYWNrUnVuSW5zW10gPSB7CisgICAgMCwgICAgICAgICAgMiwgICAgICAgICAgMHgwMiwgICAgICAgMywgICAgICAgICAgMCwgICAgICAgICAgMHgwMywKKyAgICAyLCAgICAgICAgICAwLCAgICAgICAgICAyLCAgICAgICAgICAweDAyLCAgICAgICAxLCAgICAgICAgICAwLAorICAgIDB4MDMsICAgICAgIDQsICAgICAgICAgIDAsICAgICAgICAgIDIsICAgICAgICAgIDB4MDIsICAgICAgIDYsCisgICAgMCwgICAgICAgICAgMHgwMywgICAgICAgNSwgICAgICAgICAgMCwgICAgICAgICAgMSwgICAgICAgICAgMHgwMywKKyAgICA3LCAgICAgICAgICAwLCAgICAgICAgICAyLCAgICAgICAgICAweDA0LCAgICAgICA5LCAgICAgICAgICAwLAorICAgIDB4MDUsICAgICAgIDgsICAgICAgICAgIDAsICAgICAgICAgIDMsICAgICAgICAgIDB4MDQsICAgICAgIDEwLAorICAgIDAsICAgICAgICAgIDB4MDUsICAgICAgIDExLCAgICAgICAgIDAsICAgICAgICAgIDB4MDcsICAgICAgIDEyLAorICAgIDAsICAgICAgICAgIDIsICAgICAgICAgIDB4MDQsICAgICAgIDEzLCAgICAgICAgIDAsICAgICAgICAgIDB4MDcsCisgICAgMTQsICAgICAgICAgMCwgICAgICAgICAgMSwgICAgICAgICAgMHgxOCwgICAgICAgMTUsICAgICAgICAgMCwKKyAgICA1LCAgICAgICAgICAweDA4LCAgICAgICAxOCwgICAgICAgICAwLCAgICAgICAgICAweDBmLCAgICAgICA2NCwKKyAgICAwLCAgICAgICAgICAweDE3LCAgICAgICAxNiwgICAgICAgICAwLCAgICAgICAgICAweDE4LCAgICAgICAxNywKKyAgICAwLCAgICAgICAgICAweDM3LCAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgICAxMCwgICAgICAgICAweDA4LAorICAgIDB4MDAsICAgICAgIDB4MDcsICAgICAgIDB4MGMsICAgICAgIDB4NDAsICAgICAgIDB4MDcsICAgICAgIDB4MGQsCisgICAgMHg4MCwgICAgICAgMHgwNywgICAgICAgMHgxNywgICAgICAgMjQsICAgICAgICAgMCwgICAgICAgICAgMHgxOCwKKyAgICAyNSwgICAgICAgICAwLCAgICAgICAgICAweDI4LCAgICAgICAyMywgICAgICAgICAwLCAgICAgICAgICAweDM3LAorICAgIDIyLCAgICAgICAgIDAsICAgICAgICAgIDB4NjcsICAgICAgIDE5LCAgICAgICAgIDAsICAgICAgICAgIDB4NjgsCisgICAgMjAsICAgICAgICAgMCwgICAgICAgICAgMHg2YywgICAgICAgMjEsICAgICAgICAgMCwgICAgICAgICAgNTQsCisgICAgMHgxMiwgICAgICAgMTk4NCAlIDI1NiwgMTk4NCAvIDI1NiwgMHgxMywgICAgICAgMjA0OCAlIDI1NiwgMjA0OCAvIDI1NiwKKyAgICAweDE0LCAgICAgICAyMTEyICUgMjU2LCAyMTEyIC8gMjU2LCAweDE1LCAgICAgICAyMTc2ICUgMjU2LCAyMTc2IC8gMjU2LAorICAgIDB4MTYsICAgICAgIDIyNDAgJSAyNTYsIDIyNDAgLyAyNTYsIDB4MTcsICAgICAgIDIzMDQgJSAyNTYsIDIzMDQgLyAyNTYsCisgICAgMHgxYywgICAgICAgMjM2OCAlIDI1NiwgMjM2OCAvIDI1NiwgMHgxZCwgICAgICAgMjQzMiAlIDI1NiwgMjQzMiAvIDI1NiwKKyAgICAweDFlLCAgICAgICAyNDk2ICUgMjU2LCAyNDk2IC8gMjU2LCAweDFmLCAgICAgICAyNTYwICUgMjU2LCAyNTYwIC8gMjU2LAorICAgIDB4MjQsICAgICAgIDUyLCAgICAgICAgIDAsICAgICAgICAgIDB4MjcsICAgICAgIDU1LCAgICAgICAgIDAsCisgICAgMHgyOCwgICAgICAgNTYsICAgICAgICAgMCwgICAgICAgICAgMHgyYiwgICAgICAgNTksICAgICAgICAgMCwKKyAgICAweDJjLCAgICAgICA2MCwgICAgICAgICAwLCAgICAgICAgICAweDMzLCAgICAgICAzMjAgJSAyNTYsICAzMjAgLyAyNTYsCisgICAgMHgzNCwgICAgICAgMzg0ICUgMjU2LCAgMzg0IC8gMjU2LCAgMHgzNSwgICAgICAgNDQ4ICUgMjU2LCAgNDQ4IC8gMjU2LAorICAgIDB4MzcsICAgICAgIDUzLCAgICAgICAgIDAsICAgICAgICAgIDB4MzgsICAgICAgIDU0LCAgICAgICAgIDAsCisgICAgMHg1MiwgICAgICAgNTAsICAgICAgICAgMCwgICAgICAgICAgMHg1MywgICAgICAgNTEsICAgICAgICAgMCwKKyAgICAweDU0LCAgICAgICA0NCwgICAgICAgICAwLCAgICAgICAgICAweDU1LCAgICAgICA0NSwgICAgICAgICAwLAorICAgIDB4NTYsICAgICAgIDQ2LCAgICAgICAgIDAsICAgICAgICAgIDB4NTcsICAgICAgIDQ3LCAgICAgICAgIDAsCisgICAgMHg1OCwgICAgICAgNTcsICAgICAgICAgMCwgICAgICAgICAgMHg1OSwgICAgICAgNTgsICAgICAgICAgMCwKKyAgICAweDVhLCAgICAgICA2MSwgICAgICAgICAwLCAgICAgICAgICAweDViLCAgICAgICAyNTYgJSAyNTYsICAyNTYgLyAyNTYsCisgICAgMHg2NCwgICAgICAgNDgsICAgICAgICAgMCwgICAgICAgICAgMHg2NSwgICAgICAgNDksICAgICAgICAgMCwKKyAgICAweDY2LCAgICAgICA2MiwgICAgICAgICAwLCAgICAgICAgICAweDY3LCAgICAgICA2MywgICAgICAgICAwLAorICAgIDB4NjgsICAgICAgIDMwLCAgICAgICAgIDAsICAgICAgICAgIDB4NjksICAgICAgIDMxLCAgICAgICAgIDAsCisgICAgMHg2YSwgICAgICAgMzIsICAgICAgICAgMCwgICAgICAgICAgMHg2YiwgICAgICAgMzMsICAgICAgICAgMCwKKyAgICAweDZjLCAgICAgICA0MCwgICAgICAgICAwLCAgICAgICAgICAweDZkLCAgICAgICA0MSwgICAgICAgICAwLAorICAgIDB4YzgsICAgICAgIDEyOCwgICAgICAgIDAsICAgICAgICAgIDB4YzksICAgICAgIDE5MiwgICAgICAgIDAsCisgICAgMHhjYSwgICAgICAgMjYsICAgICAgICAgMCwgICAgICAgICAgMHhjYiwgICAgICAgMjcsICAgICAgICAgMCwKKyAgICAweGNjLCAgICAgICAyOCwgICAgICAgICAwLCAgICAgICAgICAweGNkLCAgICAgICAyOSwgICAgICAgICAwLAorICAgIDB4ZDIsICAgICAgIDM0LCAgICAgICAgIDAsICAgICAgICAgIDB4ZDMsICAgICAgIDM1LCAgICAgICAgIDAsCisgICAgMHhkNCwgICAgICAgMzYsICAgICAgICAgMCwgICAgICAgICAgMHhkNSwgICAgICAgMzcsICAgICAgICAgMCwKKyAgICAweGQ2LCAgICAgICAzOCwgICAgICAgICAwLCAgICAgICAgICAweGQ3LCAgICAgICAzOSwgICAgICAgICAwLAorICAgIDB4ZGEsICAgICAgIDQyLCAgICAgICAgIDAsICAgICAgICAgIDB4ZGIsICAgICAgIDQzLCAgICAgICAgIDAsCisgICAgMjAsICAgICAgICAgMHg0YSwgICAgICAgNjQwICUgMjU2LCAgNjQwIC8gMjU2LCAgMHg0YiwgICAgICAgNzA0ICUgMjU2LAorICAgIDcwNCAvIDI1NiwgIDB4NGMsICAgICAgIDc2OCAlIDI1NiwgIDc2OCAvIDI1NiwgIDB4NGQsICAgICAgIDgzMiAlIDI1NiwKKyAgICA4MzIgLyAyNTYsICAweDUyLCAgICAgICAxMjgwICUgMjU2LCAxMjgwIC8gMjU2LCAweDUzLCAgICAgICAxMzQ0ICUgMjU2LAorICAgIDEzNDQgLyAyNTYsIDB4NTQsICAgICAgIDE0MDggJSAyNTYsIDE0MDggLyAyNTYsIDB4NTUsICAgICAgIDE0NzIgJSAyNTYsCisgICAgMTQ3MiAvIDI1NiwgMHg1YSwgICAgICAgMTUzNiAlIDI1NiwgMTUzNiAvIDI1NiwgMHg1YiwgICAgICAgMTYwMCAlIDI1NiwKKyAgICAxNjAwIC8gMjU2LCAweDY0LCAgICAgICAxNjY0ICUgMjU2LCAxNjY0IC8gMjU2LCAweDY1LCAgICAgICAxNzI4ICUgMjU2LAorICAgIDE3MjggLyAyNTYsIDB4NmMsICAgICAgIDUxMiAlIDI1NiwgIDUxMiAvIDI1NiwgIDB4NmQsICAgICAgIDU3NiAlIDI1NiwKKyAgICA1NzYgLyAyNTYsICAweDcyLCAgICAgICA4OTYgJSAyNTYsICA4OTYgLyAyNTYsICAweDczLCAgICAgICA5NjAgJSAyNTYsCisgICAgOTYwIC8gMjU2LCAgMHg3NCwgICAgICAgMTAyNCAlIDI1NiwgMTAyNCAvIDI1NiwgMHg3NSwgICAgICAgMTA4OCAlIDI1NiwKKyAgICAxMDg4IC8gMjU2LCAweDc2LCAgICAgICAxMTUyICUgMjU2LCAxMTUyIC8gMjU2LCAweDc3LCAgICAgICAxMjE2ICUgMjU2LAorICAgIDEyMTYgLyAyNTYsIDB4ZmZ9OworCitjb25zdCB1aW50OF90IEZheFdoaXRlUnVuSW5zW10gPSB7CisgICAgMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgICAgNiwgICAgICAgICAgMHgwNywgICAgICAgMiwKKyAgICAwLCAgICAgICAgICAweDA4LCAgICAgICAzLCAgICAgICAgICAwLCAgICAgICAgICAweDBCLCAgICAgICA0LAorICAgIDAsICAgICAgICAgIDB4MEMsICAgICAgIDUsICAgICAgICAgIDAsICAgICAgICAgIDB4MEUsICAgICAgIDYsCisgICAgMCwgICAgICAgICAgMHgwRiwgICAgICAgNywgICAgICAgICAgMCwgICAgICAgICAgNiwgICAgICAgICAgMHgwNywKKyAgICAxMCwgICAgICAgICAwLCAgICAgICAgICAweDA4LCAgICAgICAxMSwgICAgICAgICAwLCAgICAgICAgICAweDEyLAorICAgIDEyOCwgICAgICAgIDAsICAgICAgICAgIDB4MTMsICAgICAgIDgsICAgICAgICAgIDAsICAgICAgICAgIDB4MTQsCisgICAgOSwgICAgICAgICAgMCwgICAgICAgICAgMHgxYiwgICAgICAgNjQsICAgICAgICAgMCwgICAgICAgICAgOSwKKyAgICAweDAzLCAgICAgICAxMywgICAgICAgICAwLCAgICAgICAgICAweDA3LCAgICAgICAxLCAgICAgICAgICAwLAorICAgIDB4MDgsICAgICAgIDEyLCAgICAgICAgIDAsICAgICAgICAgIDB4MTcsICAgICAgIDE5MiwgICAgICAgIDAsCisgICAgMHgxOCwgICAgICAgMTY2NCAlIDI1NiwgMTY2NCAvIDI1NiwgMHgyYSwgICAgICAgMTYsICAgICAgICAgMCwKKyAgICAweDJCLCAgICAgICAxNywgICAgICAgICAwLCAgICAgICAgICAweDM0LCAgICAgICAxNCwgICAgICAgICAwLAorICAgIDB4MzUsICAgICAgIDE1LCAgICAgICAgIDAsICAgICAgICAgIDEyLCAgICAgICAgIDB4MDMsICAgICAgIDIyLAorICAgIDAsICAgICAgICAgIDB4MDQsICAgICAgIDIzLCAgICAgICAgIDAsICAgICAgICAgIDB4MDgsICAgICAgIDIwLAorICAgIDAsICAgICAgICAgIDB4MGMsICAgICAgIDE5LCAgICAgICAgIDAsICAgICAgICAgIDB4MTMsICAgICAgIDI2LAorICAgIDAsICAgICAgICAgIDB4MTcsICAgICAgIDIxLCAgICAgICAgIDAsICAgICAgICAgIDB4MTgsICAgICAgIDI4LAorICAgIDAsICAgICAgICAgIDB4MjQsICAgICAgIDI3LCAgICAgICAgIDAsICAgICAgICAgIDB4MjcsICAgICAgIDE4LAorICAgIDAsICAgICAgICAgIDB4MjgsICAgICAgIDI0LCAgICAgICAgIDAsICAgICAgICAgIDB4MkIsICAgICAgIDI1LAorICAgIDAsICAgICAgICAgIDB4MzcsICAgICAgIDI1NiAlIDI1NiwgIDI1NiAvIDI1NiwgIDQyLCAgICAgICAgIDB4MDIsCisgICAgMjksICAgICAgICAgMCwgICAgICAgICAgMHgwMywgICAgICAgMzAsICAgICAgICAgMCwgICAgICAgICAgMHgwNCwKKyAgICA0NSwgICAgICAgICAwLCAgICAgICAgICAweDA1LCAgICAgICA0NiwgICAgICAgICAwLCAgICAgICAgICAweDBhLAorICAgIDQ3LCAgICAgICAgIDAsICAgICAgICAgIDB4MGIsICAgICAgIDQ4LCAgICAgICAgIDAsICAgICAgICAgIDB4MTIsCisgICAgMzMsICAgICAgICAgMCwgICAgICAgICAgMHgxMywgICAgICAgMzQsICAgICAgICAgMCwgICAgICAgICAgMHgxNCwKKyAgICAzNSwgICAgICAgICAwLCAgICAgICAgICAweDE1LCAgICAgICAzNiwgICAgICAgICAwLCAgICAgICAgICAweDE2LAorICAgIDM3LCAgICAgICAgIDAsICAgICAgICAgIDB4MTcsICAgICAgIDM4LCAgICAgICAgIDAsICAgICAgICAgIDB4MWEsCisgICAgMzEsICAgICAgICAgMCwgICAgICAgICAgMHgxYiwgICAgICAgMzIsICAgICAgICAgMCwgICAgICAgICAgMHgyNCwKKyAgICA1MywgICAgICAgICAwLCAgICAgICAgICAweDI1LCAgICAgICA1NCwgICAgICAgICAwLCAgICAgICAgICAweDI4LAorICAgIDM5LCAgICAgICAgIDAsICAgICAgICAgIDB4MjksICAgICAgIDQwLCAgICAgICAgIDAsICAgICAgICAgIDB4MmEsCisgICAgNDEsICAgICAgICAgMCwgICAgICAgICAgMHgyYiwgICAgICAgNDIsICAgICAgICAgMCwgICAgICAgICAgMHgyYywKKyAgICA0MywgICAgICAgICAwLCAgICAgICAgICAweDJkLCAgICAgICA0NCwgICAgICAgICAwLCAgICAgICAgICAweDMyLAorICAgIDYxLCAgICAgICAgIDAsICAgICAgICAgIDB4MzMsICAgICAgIDYyLCAgICAgICAgIDAsICAgICAgICAgIDB4MzQsCisgICAgNjMsICAgICAgICAgMCwgICAgICAgICAgMHgzNSwgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgICAgMHgzNiwKKyAgICAzMjAgJSAyNTYsICAzMjAgLyAyNTYsICAweDM3LCAgICAgICAzODQgJSAyNTYsICAzODQgLyAyNTYsICAweDRhLAorICAgIDU5LCAgICAgICAgIDAsICAgICAgICAgIDB4NGIsICAgICAgIDYwLCAgICAgICAgIDAsICAgICAgICAgIDB4NTIsCisgICAgNDksICAgICAgICAgMCwgICAgICAgICAgMHg1MywgICAgICAgNTAsICAgICAgICAgMCwgICAgICAgICAgMHg1NCwKKyAgICA1MSwgICAgICAgICAwLCAgICAgICAgICAweDU1LCAgICAgICA1MiwgICAgICAgICAwLCAgICAgICAgICAweDU4LAorICAgIDU1LCAgICAgICAgIDAsICAgICAgICAgIDB4NTksICAgICAgIDU2LCAgICAgICAgIDAsICAgICAgICAgIDB4NWEsCisgICAgNTcsICAgICAgICAgMCwgICAgICAgICAgMHg1YiwgICAgICAgNTgsICAgICAgICAgMCwgICAgICAgICAgMHg2NCwKKyAgICA0NDggJSAyNTYsICA0NDggLyAyNTYsICAweDY1LCAgICAgICA1MTIgJSAyNTYsICA1MTIgLyAyNTYsICAweDY3LAorICAgIDY0MCAlIDI1NiwgIDY0MCAvIDI1NiwgIDB4NjgsICAgICAgIDU3NiAlIDI1NiwgIDU3NiAvIDI1NiwgIDE2LAorICAgIDB4OTgsICAgICAgIDE0NzIgJSAyNTYsIDE0NzIgLyAyNTYsIDB4OTksICAgICAgIDE1MzYgJSAyNTYsIDE1MzYgLyAyNTYsCisgICAgMHg5YSwgICAgICAgMTYwMCAlIDI1NiwgMTYwMCAvIDI1NiwgMHg5YiwgICAgICAgMTcyOCAlIDI1NiwgMTcyOCAvIDI1NiwKKyAgICAweGNjLCAgICAgICA3MDQgJSAyNTYsICA3MDQgLyAyNTYsICAweGNkLCAgICAgICA3NjggJSAyNTYsICA3NjggLyAyNTYsCisgICAgMHhkMiwgICAgICAgODMyICUgMjU2LCAgODMyIC8gMjU2LCAgMHhkMywgICAgICAgODk2ICUgMjU2LCAgODk2IC8gMjU2LAorICAgIDB4ZDQsICAgICAgIDk2MCAlIDI1NiwgIDk2MCAvIDI1NiwgIDB4ZDUsICAgICAgIDEwMjQgJSAyNTYsIDEwMjQgLyAyNTYsCisgICAgMHhkNiwgICAgICAgMTA4OCAlIDI1NiwgMTA4OCAvIDI1NiwgMHhkNywgICAgICAgMTE1MiAlIDI1NiwgMTE1MiAvIDI1NiwKKyAgICAweGQ4LCAgICAgICAxMjE2ICUgMjU2LCAxMjE2IC8gMjU2LCAweGQ5LCAgICAgICAxMjgwICUgMjU2LCAxMjgwIC8gMjU2LAorICAgIDB4ZGEsICAgICAgIDEzNDQgJSAyNTYsIDEzNDQgLyAyNTYsIDB4ZGIsICAgICAgIDE0MDggJSAyNTYsIDE0MDggLyAyNTYsCisgICAgMCwgICAgICAgICAgMywgICAgICAgICAgMHgwOCwgICAgICAgMTc5MiAlIDI1NiwgMTc5MiAvIDI1NiwgMHgwYywKKyAgICAxODU2ICUgMjU2LCAxODU2IC8gMjU2LCAweDBkLCAgICAgICAxOTIwICUgMjU2LCAxOTIwIC8gMjU2LCAxMCwKKyAgICAweDEyLCAgICAgICAxOTg0ICUgMjU2LCAxOTg0IC8gMjU2LCAweDEzLCAgICAgICAyMDQ4ICUgMjU2LCAyMDQ4IC8gMjU2LAorICAgIDB4MTQsICAgICAgIDIxMTIgJSAyNTYsIDIxMTIgLyAyNTYsIDB4MTUsICAgICAgIDIxNzYgJSAyNTYsIDIxNzYgLyAyNTYsCisgICAgMHgxNiwgICAgICAgMjI0MCAlIDI1NiwgMjI0MCAvIDI1NiwgMHgxNywgICAgICAgMjMwNCAlIDI1NiwgMjMwNCAvIDI1NiwKKyAgICAweDFjLCAgICAgICAyMzY4ICUgMjU2LCAyMzY4IC8gMjU2LCAweDFkLCAgICAgICAyNDMyICUgMjU2LCAyNDMyIC8gMjU2LAorICAgIDB4MWUsICAgICAgIDI0OTYgJSAyNTYsIDI0OTYgLyAyNTYsIDB4MWYsICAgICAgIDI1NjAgJSAyNTYsIDI1NjAgLyAyNTYsCiAgICAgMHhmZiwKIH07Ci1pbnQgX0ZheEdldFJ1bihGWF9MUENCWVRFIGluc19hcnJheSwgY29uc3QgRlhfQllURSogc3JjX2J1ZiwgaW50JiBiaXRwb3MsIGludCBiaXRzaXplKQotewotICAgIEZYX0RXT1JEIGNvZGUgPSAwOwotICAgIGludCBpbnNfb2ZmID0gMDsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBGWF9CWVRFIGlucyA9IGluc19hcnJheVtpbnNfb2ZmKytdOwotICAgICAgICBpZiAoaW5zID09IDB4ZmYpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYml0cG9zID49IGJpdHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBjb2RlIDw8PSAxOwotICAgICAgICBpZiAoc3JjX2J1ZltiaXRwb3MgLyA4XSAmICgxIDw8ICg3IC0gYml0cG9zICUgOCkpKSB7Ci0gICAgICAgICAgICBjb2RlICsrOwotICAgICAgICB9Ci0gICAgICAgIGJpdHBvcyArKzsKLSAgICAgICAgaW50IG5leHRfb2ZmID0gaW5zX29mZiArIGlucyAqIDM7Ci0gICAgICAgIGZvciAoOyBpbnNfb2ZmIDwgbmV4dF9vZmY7IGluc19vZmYgKz0gMykgewotICAgICAgICAgICAgaWYgKGluc19hcnJheVtpbnNfb2ZmXSA9PSBjb2RlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGluc19hcnJheVtpbnNfb2ZmICsgMV0gKyBpbnNfYXJyYXlbaW5zX29mZiArIDJdICogMjU2OwotICAgICAgICAgICAgfQotICAgICAgICB9CisKK2ludCBGYXhHZXRSdW4oY29uc3QgdWludDhfdCogaW5zX2FycmF5LAorICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICBpbnQmIGJpdHBvcywKKyAgICAgICAgICAgICAgaW50IGJpdHNpemUpIHsKKyAgRlhfRFdPUkQgY29kZSA9IDA7CisgIGludCBpbnNfb2ZmID0gMDsKKyAgd2hpbGUgKDEpIHsKKyAgICB1aW50OF90IGlucyA9IGluc19hcnJheVtpbnNfb2ZmKytdOworICAgIGlmIChpbnMgPT0gMHhmZikgeworICAgICAgcmV0dXJuIC0xOwogICAgIH0KLX0KLUZYX0JPT0wgX0ZheEc0R2V0Um93KGNvbnN0IEZYX0JZVEUqIHNyY19idWYsIGludCBiaXRzaXplLCBpbnQmIGJpdHBvcywgRlhfTFBCWVRFIGRlc3RfYnVmLCBjb25zdCBGWF9CWVRFKiByZWZfYnVmLCBpbnQgY29sdW1ucykKLXsKLSAgICBpbnQgYTAgPSAtMSwgYTBjb2xvciA9IDE7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGExLCBhMiwgYjEsIGIyOwotICAgICAgICBfRmF4RzRGaW5kQjFCMihyZWZfYnVmLCBjb2x1bW5zLCBhMCwgYTBjb2xvciwgYjEsIGIyKTsKLSAgICAgICAgRlhfQk9PTCBiaXQgPSBORVhUQklUOwotICAgICAgICBpbnQgdl9kZWx0YSA9IDA7Ci0gICAgICAgIGlmIChiaXQpIHsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChiaXRwb3MgPj0gYml0c2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX0JPT0wgYml0MSA9IE5FWFRCSVQ7Ci0gICAgICAgICAgICBpZiAoYml0cG9zID49IGJpdHNpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9CT09MIGJpdDIgPSBORVhUQklUOwotICAgICAgICAgICAgaWYgKGJpdDEgJiYgYml0MikgewotICAgICAgICAgICAgICAgIHZfZGVsdGEgPSAxOwotICAgICAgICAgICAgfSBlbHNlIGlmIChiaXQxKSB7Ci0gICAgICAgICAgICAgICAgdl9kZWx0YSA9IC0xOwotICAgICAgICAgICAgfSBlbHNlIGlmIChiaXQyKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJ1bl9sZW4xID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgcnVuID0gX0ZheEdldFJ1bihhMGNvbG9yID8gRmF4V2hpdGVSdW5JbnMgOiBGYXhCbGFja1J1bklucywgc3JjX2J1ZiwgYml0cG9zLCBiaXRzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgcnVuX2xlbjEgKz0gcnVuOwotICAgICAgICAgICAgICAgICAgICBpZiAocnVuIDwgNjQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhMCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcnVuX2xlbjEgKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGExID0gYTAgKyBydW5fbGVuMTsKLSAgICAgICAgICAgICAgICBpZiAoIWEwY29sb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgX0ZheEZpbGxCaXRzKGRlc3RfYnVmLCBjb2x1bW5zLCBhMCwgYTEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgcnVuX2xlbjIgPSAwOwotICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBydW4gPSBfRmF4R2V0UnVuKGEwY29sb3IgPyBGYXhCbGFja1J1bklucyA6IEZheFdoaXRlUnVuSW5zLCBzcmNfYnVmLCBiaXRwb3MsIGJpdHNpemUpOwotICAgICAgICAgICAgICAgICAgICBydW5fbGVuMiArPSBydW47Ci0gICAgICAgICAgICAgICAgICAgIGlmIChydW4gPCA2NCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYTIgPSBhMSArIHJ1bl9sZW4yOwotICAgICAgICAgICAgICAgIGlmIChhMGNvbG9yKSB7Ci0gICAgICAgICAgICAgICAgICAgIF9GYXhGaWxsQml0cyhkZXN0X2J1ZiwgY29sdW1ucywgYTEsIGEyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYTAgPSBhMjsKLSAgICAgICAgICAgICAgICBpZiAoYTAgPCBjb2x1bW5zKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYml0ID0gTkVYVEJJVDsKLSAgICAgICAgICAgICAgICBpZiAoYml0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYTBjb2xvcikgewotICAgICAgICAgICAgICAgICAgICAgICAgX0ZheEZpbGxCaXRzKGRlc3RfYnVmLCBjb2x1bW5zLCBhMCwgYjIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiMiA+PSBjb2x1bW5zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhMCA9IGIyOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoYml0cG9zID49IGJpdHNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJpdDEgPSBORVhUQklUOwotICAgICAgICAgICAgICAgICAgICBpZiAoYml0cG9zID49IGJpdHNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJpdDIgPSBORVhUQklUOwotICAgICAgICAgICAgICAgICAgICBpZiAoYml0MSAmJiBiaXQyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2X2RlbHRhID0gMjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiaXQxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2X2RlbHRhID0gLTI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYml0MikgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYml0ID0gTkVYVEJJVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X2RlbHRhID0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9kZWx0YSA9IC0zOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYml0ID0gTkVYVEJJVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRwb3MgKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cG9zICs9IDU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYTEgPSBiMSArIHZfZGVsdGE7Ci0gICAgICAgIGlmICghYTBjb2xvcikgewotICAgICAgICAgICAgX0ZheEZpbGxCaXRzKGRlc3RfYnVmLCBjb2x1bW5zLCBhMCwgYTEpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhMSA+PSBjb2x1bW5zKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBhMCA9IGExOwotICAgICAgICBhMGNvbG9yID0gIWEwY29sb3I7Ci0gICAgfQotfQotRlhfQk9PTCBfRmF4U2tpcEVPTChjb25zdCBGWF9CWVRFKiBzcmNfYnVmLCBpbnQgYml0c2l6ZSwgaW50JiBiaXRwb3MpCi17Ci0gICAgaW50IHN0YXJ0Yml0ID0gYml0cG9zOwotICAgIHdoaWxlIChiaXRwb3MgPCBiaXRzaXplKSB7Ci0gICAgICAgIGludCBiaXQgPSBORVhUQklUOwotICAgICAgICBpZiAoYml0KSB7Ci0gICAgICAgICAgICBpZiAoYml0cG9zIC0gc3RhcnRiaXQgPD0gMTEpIHsKLSAgICAgICAgICAgICAgICBiaXRwb3MgPSBzdGFydGJpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wgX0ZheEdldDFETGluZShjb25zdCBGWF9CWVRFKiBzcmNfYnVmLCBpbnQgYml0c2l6ZSwgaW50JiBiaXRwb3MsIEZYX0xQQllURSBkZXN0X2J1ZiwgaW50IGNvbHVtbnMpCi17Ci0gICAgaW50IGNvbG9yID0gVFJVRTsKLSAgICBpbnQgc3RhcnRwb3MgPSAwOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmIChiaXRwb3MgPj0gYml0c2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGludCBydW5fbGVuID0gMDsKLSAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgIGludCBydW4gPSBfRmF4R2V0UnVuKGNvbG9yID8gRmF4V2hpdGVSdW5JbnMgOiBGYXhCbGFja1J1bklucywgc3JjX2J1ZiwgYml0cG9zLCBiaXRzaXplKTsKLSAgICAgICAgICAgIGlmIChydW4gPCAwKSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGJpdHBvcyA8IGJpdHNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGJpdCA9IE5FWFRCSVQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJ1bl9sZW4gKz0gcnVuOwotICAgICAgICAgICAgaWYgKHJ1biA8IDY0KSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFjb2xvcikgewotICAgICAgICAgICAgX0ZheEZpbGxCaXRzKGRlc3RfYnVmLCBjb2x1bW5zLCBzdGFydHBvcywgc3RhcnRwb3MgKyBydW5fbGVuKTsKLSAgICAgICAgfQotICAgICAgICBzdGFydHBvcyArPSBydW5fbGVuOwotICAgICAgICBpZiAoc3RhcnRwb3MgPj0gY29sdW1ucykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY29sb3IgPSAhY29sb3I7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotY2xhc3MgQ0NvZGVjX0ZheERlY29kZXIgOiBwdWJsaWMgQ0NvZGVjX1NjYW5saW5lRGVjb2RlcgotewotcHVibGljOgotICAgIENDb2RlY19GYXhEZWNvZGVyKCk7Ci0gICAgdmlydHVhbCB+Q0NvZGVjX0ZheERlY29kZXIoKTsKLSAgICBGWF9CT09MCQkJCUNyZWF0ZShGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEssIEZYX0JPT0wgRW5kT2ZMaW5lLCBGWF9CT09MIEVuY29kZWRCeXRlQWxpZ24sIEZYX0JPT0wgQmxhY2tJczEsIGludCBDb2x1bW5zLCBpbnQgUm93cyk7Ci0gICAgdmlydHVhbCB2b2lkCQl2X0Rvd25TY2FsZShpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0KSB7fQotICAgIHZpcnR1YWwgRlhfQk9PTAkJdl9SZXdpbmQoKTsKLSAgICB2aXJ0dWFsIEZYX0xQQllURQl2X0dldE5leHRMaW5lKCk7Ci0gICAgdmlydHVhbCBGWF9EV09SRAlHZXRTcmNPZmZzZXQoKTsKLSAgICBpbnQJCQltX0VuY29kaW5nLCBtX2JFbmRPZkxpbmUsIG1fYkJ5dGVBbGlnbiwgbV9iQmxhY2s7Ci0gICAgaW50CQkJYml0cG9zOwotICAgIEZYX0xQQ0JZVEUJbV9wU3JjQnVmOwotICAgIEZYX0RXT1JECW1fU3JjU2l6ZTsKLSAgICBGWF9MUEJZVEUJbV9wU2NhbmxpbmVCdWYsIG1fcFJlZkJ1ZjsKLX07Ci1DQ29kZWNfRmF4RGVjb2Rlcjo6Q0NvZGVjX0ZheERlY29kZXIoKQotewotICAgIG1fcFNjYW5saW5lQnVmID0gTlVMTDsKLSAgICBtX3BSZWZCdWYgPSBOVUxMOwotfQotQ0NvZGVjX0ZheERlY29kZXI6On5DQ29kZWNfRmF4RGVjb2RlcigpCi17Ci0gICAgaWYgKG1fcFNjYW5saW5lQnVmKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wU2NhbmxpbmVCdWYpOwotICAgIH0KLSAgICBpZiAobV9wUmVmQnVmKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wUmVmQnVmKTsKLSAgICB9Ci19Ci1GWF9CT09MIENDb2RlY19GYXhEZWNvZGVyOjpDcmVhdGUoRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBLLCBGWF9CT09MIEVuZE9mTGluZSwgRlhfQk9PTCBFbmNvZGVkQnl0ZUFsaWduLCBGWF9CT09MIEJsYWNrSXMxLCBpbnQgQ29sdW1ucywgaW50IFJvd3MpCi17Ci0gICAgbV9FbmNvZGluZyA9IEs7Ci0gICAgbV9iRW5kT2ZMaW5lID0gRW5kT2ZMaW5lOwotICAgIG1fYkJ5dGVBbGlnbiA9IEVuY29kZWRCeXRlQWxpZ247Ci0gICAgbV9iQmxhY2sgPSBCbGFja0lzMTsKLSAgICBtX09yaWdXaWR0aCA9IENvbHVtbnM7Ci0gICAgbV9PcmlnSGVpZ2h0ID0gUm93czsKLSAgICBpZiAobV9PcmlnV2lkdGggPT0gMCkgewotICAgICAgICBtX09yaWdXaWR0aCA9IHdpZHRoOwotICAgIH0KLSAgICBpZiAobV9PcmlnSGVpZ2h0ID09IDApIHsKLSAgICAgICAgbV9PcmlnSGVpZ2h0ID0gaGVpZ2h0OwotICAgIH0KLSAgICBtX1BpdGNoID0gKG1fT3JpZ1dpZHRoICsgMzEpIC8gMzIgKiA0OwotICAgIG1fT3V0cHV0V2lkdGggPSBtX09yaWdXaWR0aDsKLSAgICBtX091dHB1dEhlaWdodCA9IG1fT3JpZ0hlaWdodDsKLSAgICBtX3BTY2FubGluZUJ1ZiA9IEZYX0FsbG9jKEZYX0JZVEUsIG1fUGl0Y2gpOwotICAgIG1fcFJlZkJ1ZiA9IEZYX0FsbG9jKEZYX0JZVEUsIG1fUGl0Y2gpOwotICAgIG1fcFNyY0J1ZiA9IHNyY19idWY7Ci0gICAgbV9TcmNTaXplID0gc3JjX3NpemU7Ci0gICAgbV9uQ29tcHMgPSAxOwotICAgIG1fYnBjID0gMTsKLSAgICBtX2JDb2xvclRyYW5zZm9ybWVkID0gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENDb2RlY19GYXhEZWNvZGVyOjp2X1Jld2luZCgpCi17Ci0gICAgRlhTWVNfbWVtc2V0OChtX3BSZWZCdWYsIDB4ZmYsIG1fUGl0Y2gpOwotICAgIGJpdHBvcyA9IDA7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9MUEJZVEUgQ0NvZGVjX0ZheERlY29kZXI6OnZfR2V0TmV4dExpbmUoKQotewotICAgIGludCBiaXRzaXplID0gbV9TcmNTaXplICogODsKLSAgICBfRmF4U2tpcEVPTChtX3BTcmNCdWYsIGJpdHNpemUsIGJpdHBvcyk7CiAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBGWFNZU19tZW1zZXQ4KG1fcFNjYW5saW5lQnVmLCAweGZmLCBtX1BpdGNoKTsKLSAgICBpZiAobV9FbmNvZGluZyA8IDApIHsKLSAgICAgICAgX0ZheEc0R2V0Um93KG1fcFNyY0J1ZiwgYml0c2l6ZSwgYml0cG9zLCBtX3BTY2FubGluZUJ1ZiwgbV9wUmVmQnVmLCBtX09yaWdXaWR0aCk7Ci0gICAgICAgIEZYU1lTX21lbWNweTMyKG1fcFJlZkJ1ZiwgbV9wU2NhbmxpbmVCdWYsIG1fUGl0Y2gpOwotICAgIH0gZWxzZSBpZiAobV9FbmNvZGluZyA9PSAwKSB7Ci0gICAgICAgIF9GYXhHZXQxRExpbmUobV9wU3JjQnVmLCBiaXRzaXplLCBiaXRwb3MsIG1fcFNjYW5saW5lQnVmLCBtX09yaWdXaWR0aCk7CisgICAgY29kZSA8PD0gMTsKKyAgICBpZiAoc3JjX2J1ZltiaXRwb3MgLyA4XSAmICgxIDw8ICg3IC0gYml0cG9zICUgOCkpKSB7CisgICAgICBjb2RlKys7CisgICAgfQorICAgIGJpdHBvcysrOworICAgIGludCBuZXh0X29mZiA9IGluc19vZmYgKyBpbnMgKiAzOworICAgIGZvciAoOyBpbnNfb2ZmIDwgbmV4dF9vZmY7IGluc19vZmYgKz0gMykgeworICAgICAgaWYgKGluc19hcnJheVtpbnNfb2ZmXSA9PSBjb2RlKSB7CisgICAgICAgIHJldHVybiBpbnNfYXJyYXlbaW5zX29mZiArIDFdICsgaW5zX2FycmF5W2luc19vZmYgKyAyXSAqIDI1NjsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworRlhfQk9PTCBGYXhHNEdldFJvdyhjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICBpbnQgYml0c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgaW50JiBiaXRwb3MsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZWZfYnVmLAorICAgICAgICAgICAgICAgICAgICBpbnQgY29sdW1ucykgeworICBpbnQgYTAgPSAtMTsKKyAgYm9vbCBhMGNvbG9yID0gdHJ1ZTsKKyAgd2hpbGUgKDEpIHsKKyAgICBpZiAoYml0cG9zID49IGJpdHNpemUpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaW50IGExLCBhMiwgYjEsIGIyOworICAgIEZheEc0RmluZEIxQjIocmVmX2J1ZiwgY29sdW1ucywgYTAsIGEwY29sb3IsIGIxLCBiMik7CisgICAgRlhfQk9PTCBiaXQgPSBORVhUQklUOworICAgIGludCB2X2RlbHRhID0gMDsKKyAgICBpZiAoYml0KSB7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgRlhfQk9PTCBiTmV4dDFEID0gbV9wU3JjQnVmW2JpdHBvcyAvIDhdICYgKDEgPDwgKDcgLSBiaXRwb3MgJSA4KSk7Ci0gICAgICAgIGJpdHBvcyArKzsKLSAgICAgICAgaWYgKGJOZXh0MUQpIHsKLSAgICAgICAgICAgIF9GYXhHZXQxRExpbmUobV9wU3JjQnVmLCBiaXRzaXplLCBiaXRwb3MsIG1fcFNjYW5saW5lQnVmLCBtX09yaWdXaWR0aCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBfRmF4RzRHZXRSb3cobV9wU3JjQnVmLCBiaXRzaXplLCBiaXRwb3MsIG1fcFNjYW5saW5lQnVmLCBtX3BSZWZCdWYsIG1fT3JpZ1dpZHRoKTsKKyAgICAgIGlmIChiaXRwb3MgPj0gYml0c2l6ZSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBGWF9CT09MIGJpdDEgPSBORVhUQklUOworICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIEZYX0JPT0wgYml0MiA9IE5FWFRCSVQ7CisgICAgICBpZiAoYml0MSAmJiBiaXQyKSB7CisgICAgICAgIHZfZGVsdGEgPSAxOworICAgICAgfSBlbHNlIGlmIChiaXQxKSB7CisgICAgICAgIHZfZGVsdGEgPSAtMTsKKyAgICAgIH0gZWxzZSBpZiAoYml0MikgeworICAgICAgICBpbnQgcnVuX2xlbjEgPSAwOworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgIGludCBydW4gPSBGYXhHZXRSdW4oYTBjb2xvciA/IEZheFdoaXRlUnVuSW5zIDogRmF4QmxhY2tSdW5JbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYnVmLCBiaXRwb3MsIGJpdHNpemUpOworICAgICAgICAgIHJ1bl9sZW4xICs9IHJ1bjsKKyAgICAgICAgICBpZiAocnVuIDwgNjQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBGWFNZU19tZW1jcHkzMihtX3BSZWZCdWYsIG1fcFNjYW5saW5lQnVmLCBtX1BpdGNoKTsKLSAgICB9Ci0gICAgaWYgKG1fYkVuZE9mTGluZSkgewotICAgICAgICBfRmF4U2tpcEVPTChtX3BTcmNCdWYsIGJpdHNpemUsIGJpdHBvcyk7Ci0gICAgfQotICAgIGlmIChtX2JCeXRlQWxpZ24gJiYgYml0cG9zIDwgYml0c2l6ZSkgewotICAgICAgICBpbnQgYml0cG9zMCA9IGJpdHBvczsKLSAgICAgICAgaW50IGJpdHBvczEgPSAoYml0cG9zICsgNykgLyA4ICogODsKLSAgICAgICAgd2hpbGUgKG1fYkJ5dGVBbGlnbiAmJiBiaXRwb3MwIDwgYml0cG9zMSkgewotICAgICAgICAgICAgaW50IGJpdCA9IG1fcFNyY0J1ZltiaXRwb3MwIC8gOF0gJiAoMSA8PCAoNyAtIGJpdHBvczAgJSA4KSk7Ci0gICAgICAgICAgICBpZiAoYml0ICE9IDApIHsKLSAgICAgICAgICAgICAgICBtX2JCeXRlQWxpZ24gPSBGQUxTRTsKKyAgICAgICAgaWYgKGEwIDwgMCkgeworICAgICAgICAgIHJ1bl9sZW4xKys7CisgICAgICAgIH0KKyAgICAgICAgYTEgPSBhMCArIHJ1bl9sZW4xOworICAgICAgICBpZiAoIWEwY29sb3IpIHsKKyAgICAgICAgICBGYXhGaWxsQml0cyhkZXN0X2J1ZiwgY29sdW1ucywgYTAsIGExKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgcnVuX2xlbjIgPSAwOworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgIGludCBydW4gPSBGYXhHZXRSdW4oYTBjb2xvciA/IEZheEJsYWNrUnVuSW5zIDogRmF4V2hpdGVSdW5JbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYnVmLCBiaXRwb3MsIGJpdHNpemUpOworICAgICAgICAgIHJ1bl9sZW4yICs9IHJ1bjsKKyAgICAgICAgICBpZiAocnVuIDwgNjQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhMiA9IGExICsgcnVuX2xlbjI7CisgICAgICAgIGlmIChhMGNvbG9yKSB7CisgICAgICAgICAgRmF4RmlsbEJpdHMoZGVzdF9idWYsIGNvbHVtbnMsIGExLCBhMik7CisgICAgICAgIH0KKyAgICAgICAgYTAgPSBhMjsKKyAgICAgICAgaWYgKGEwIDwgY29sdW1ucykgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIGJpdCA9IE5FWFRCSVQ7CisgICAgICAgIGlmIChiaXQpIHsKKyAgICAgICAgICBpZiAoIWEwY29sb3IpIHsKKyAgICAgICAgICAgIEZheEZpbGxCaXRzKGRlc3RfYnVmLCBjb2x1bW5zLCBhMCwgYjIpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoYjIgPj0gY29sdW1ucykgeworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgfQorICAgICAgICAgIGEwID0gYjI7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgfQorICAgICAgICAgIEZYX0JPT0wgYml0MSA9IE5FWFRCSVQ7CisgICAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgfQorICAgICAgICAgIEZYX0JPT0wgYml0MiA9IE5FWFRCSVQ7CisgICAgICAgICAgaWYgKGJpdDEgJiYgYml0MikgeworICAgICAgICAgICAgdl9kZWx0YSA9IDI7CisgICAgICAgICAgfSBlbHNlIGlmIChiaXQxKSB7CisgICAgICAgICAgICB2X2RlbHRhID0gLTI7CisgICAgICAgICAgfSBlbHNlIGlmIChiaXQyKSB7CisgICAgICAgICAgICBpZiAoYml0cG9zID49IGJpdHNpemUpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYml0ID0gTkVYVEJJVDsKKyAgICAgICAgICAgIGlmIChiaXQpIHsKKyAgICAgICAgICAgICAgdl9kZWx0YSA9IDM7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJpdHBvczAgKys7CisgICAgICAgICAgICAgIHZfZGVsdGEgPSAtMzsKICAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7CisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJpdCA9IE5FWFRCSVQ7CisgICAgICAgICAgICBpZiAoYml0KSB7CisgICAgICAgICAgICAgIGJpdHBvcyArPSAzOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGJpdHBvcyArPSA1OworICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1fYkJ5dGVBbGlnbikgewotICAgICAgICAgICAgYml0cG9zID0gYml0cG9zMTsKLSAgICAgICAgfQorICAgICAgfQogICAgIH0KLSAgICBpZiAobV9iQmxhY2spIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1BpdGNoOyBpICsrKSB7Ci0gICAgICAgICAgICBtX3BTY2FubGluZUJ1ZltpXSA9IH5tX3BTY2FubGluZUJ1ZltpXTsKLSAgICAgICAgfQorICAgIGExID0gYjEgKyB2X2RlbHRhOworICAgIGlmICghYTBjb2xvcikgeworICAgICAgRmF4RmlsbEJpdHMoZGVzdF9idWYsIGNvbHVtbnMsIGEwLCBhMSk7CiAgICAgfQotICAgIHJldHVybiBtX3BTY2FubGluZUJ1ZjsKKyAgICBpZiAoYTEgPj0gY29sdW1ucykgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGEwID0gYTE7CisgICAgYTBjb2xvciA9ICFhMGNvbG9yOworICB9CiB9Ci1GWF9EV09SRCBDQ29kZWNfRmF4RGVjb2Rlcjo6R2V0U3JjT2Zmc2V0KCkKLXsKLSAgICBGWF9EV09SRCByZXQgPSAoYml0cG9zICsgNykgLyA4OwotICAgIGlmIChyZXQgPiBtX1NyY1NpemUpIHsKLSAgICAgICAgcmV0ID0gbV9TcmNTaXplOworCitGWF9CT09MIEZheFNraXBFT0woY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IGJpdHNpemUsIGludCYgYml0cG9zKSB7CisgIGludCBzdGFydGJpdCA9IGJpdHBvczsKKyAgd2hpbGUgKGJpdHBvcyA8IGJpdHNpemUpIHsKKyAgICBpbnQgYml0ID0gTkVYVEJJVDsKKyAgICBpZiAoYml0KSB7CisgICAgICBpZiAoYml0cG9zIC0gc3RhcnRiaXQgPD0gMTEpIHsKKyAgICAgICAgYml0cG9zID0gc3RhcnRiaXQ7CisgICAgICB9CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgcmV0dXJuIHJldDsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1leHRlcm4gIkMiIHsKLSAgICB2b2lkIF9GYXhHNERlY29kZSh2b2lkKiwgRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50KiBwYml0cG9zLCBGWF9MUEJZVEUgZGVzdF9idWYsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHBpdGNoKQotICAgIHsKLSAgICAgICAgaWYgKHBpdGNoID09IDApIHsKLSAgICAgICAgICAgIHBpdGNoID0gKHdpZHRoICsgNykgLyA4OwotICAgICAgICB9Ci0gICAgICAgIEZYX0xQQllURSByZWZfYnVmID0gRlhfQWxsb2MoRlhfQllURSwgcGl0Y2gpOwotICAgICAgICBGWFNZU19tZW1zZXQ4KHJlZl9idWYsIDB4ZmYsIHBpdGNoKTsKLSAgICAgICAgaW50IGJpdHBvcyA9ICpwYml0cG9zOwotICAgICAgICBmb3IgKGludCBpUm93ID0gMDsgaVJvdyA8IGhlaWdodDsgaVJvdyArKykgewotICAgICAgICAgICAgRlhfTFBCWVRFIGxpbmVfYnVmID0gZGVzdF9idWYgKyBpUm93ICogcGl0Y2g7Ci0gICAgICAgICAgICBGWFNZU19tZW1zZXQ4KGxpbmVfYnVmLCAweGZmLCBwaXRjaCk7Ci0gICAgICAgICAgICBfRmF4RzRHZXRSb3coc3JjX2J1Ziwgc3JjX3NpemUgPDwgMywgYml0cG9zLCBsaW5lX2J1ZiwgcmVmX2J1Ziwgd2lkdGgpOwotICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIocmVmX2J1ZiwgbGluZV9idWYsIHBpdGNoKTsKLSAgICAgICAgfQotICAgICAgICBGWF9GcmVlKHJlZl9idWYpOwotICAgICAgICAqcGJpdHBvcyA9IGJpdHBvczsKKworRlhfQk9PTCBGYXhHZXQxRExpbmUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzaXplLAorICAgICAgICAgICAgICAgICAgICAgaW50JiBiaXRwb3MsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgIGludCBjb2x1bW5zKSB7CisgIGJvb2wgY29sb3IgPSB0cnVlOworICBpbnQgc3RhcnRwb3MgPSAwOworICB3aGlsZSAoMSkgeworICAgIGlmIChiaXRwb3MgPj0gYml0c2l6ZSkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLX07Ci1zdGF0aWMgY29uc3QgRlhfQllURSBCbGFja1J1blRlcm1pbmF0b3JbMTI4XSA9IHsKLSAgICAweDM3LCAxMCwgMHgwMiwgMywgMHgwMywgMiwgMHgwMiwgMiwgMHgwMywgMywgMHgwMywgNCwgMHgwMiwgNCwgMHgwMywgNSwKLSAgICAweDA1LCA2LCAweDA0LCA2LCAweDA0LCA3LCAweDA1LCA3LCAweDA3LCA3LCAweDA0LCA4LCAweDA3LCA4LCAweDE4LCA5LAotICAgIDB4MTcsIDEwLCAweDE4LCAxMCwgMHgwOCwgMTAsIDB4NjcsIDExLCAweDY4LCAxMSwgMHg2YywgMTEsIDB4MzcsIDExLCAweDI4LCAxMSwKLSAgICAweDE3LCAxMSwgMHgxOCwgMTEsIDB4Y2EsIDEyLCAweGNiLCAxMiwgMHhjYywgMTIsIDB4Y2QsIDEyLCAweDY4LCAxMiwgMHg2OSwgMTIsCi0gICAgMHg2YSwgMTIsIDB4NmIsIDEyLCAweGQyLCAxMiwgMHhkMywgMTIsIDB4ZDQsIDEyLCAweGQ1LCAxMiwgMHhkNiwgMTIsIDB4ZDcsIDEyLAotICAgIDB4NmMsIDEyLCAweDZkLCAxMiwgMHhkYSwgMTIsIDB4ZGIsIDEyLCAweDU0LCAxMiwgMHg1NSwgMTIsIDB4NTYsIDEyLCAweDU3LCAxMiwKLSAgICAweDY0LCAxMiwgMHg2NSwgMTIsIDB4NTIsIDEyLCAweDUzLCAxMiwgMHgyNCwgMTIsIDB4MzcsIDEyLCAweDM4LCAxMiwgMHgyNywgMTIsCi0gICAgMHgyOCwgMTIsIDB4NTgsIDEyLCAweDU5LCAxMiwgMHgyYiwgMTIsIDB4MmMsIDEyLCAweDVhLCAxMiwgMHg2NiwgMTIsIDB4NjcsIDEyLAotfTsKLXN0YXRpYyBjb25zdCBGWF9CWVRFIEJsYWNrUnVuTWFya3VwWzgwXSA9IHsKLSAgICAweDBmLCAxMCwgMHhjOCwgMTIsIDB4YzksIDEyLCAweDViLCAxMiwgMHgzMywgMTIsIDB4MzQsIDEyLCAweDM1LCAxMiwgMHg2YywgMTMsCi0gICAgMHg2ZCwgMTMsIDB4NGEsIDEzLCAweDRiLCAxMywgMHg0YywgMTMsIDB4NGQsIDEzLCAweDcyLCAxMywgMHg3MywgMTMsIDB4NzQsIDEzLAotICAgIDB4NzUsIDEzLCAweDc2LCAxMywgMHg3NywgMTMsIDB4NTIsIDEzLCAweDUzLCAxMywgMHg1NCwgMTMsIDB4NTUsIDEzLCAweDVhLCAxMywKLSAgICAweDViLCAxMywgMHg2NCwgMTMsIDB4NjUsIDEzLCAweDA4LCAxMSwgMHgwYywgMTEsIDB4MGQsIDExLCAweDEyLCAxMiwgMHgxMywgMTIsCi0gICAgMHgxNCwgMTIsIDB4MTUsIDEyLCAweDE2LCAxMiwgMHgxNywgMTIsIDB4MWMsIDEyLCAweDFkLCAxMiwgMHgxZSwgMTIsIDB4MWYsIDEyLAotfTsKLXN0YXRpYyBjb25zdCBGWF9CWVRFIFdoaXRlUnVuVGVybWluYXRvclsxMjhdID0gewotICAgIDB4MzUsIDgsCi0gICAgMHgwNywgNiwKLSAgICAweDA3LCA0LAotICAgIDB4MDgsIDQsCi0gICAgMHgwQiwgNCwKLSAgICAweDBDLCA0LAotICAgIDB4MEUsIDQsCi0gICAgMHgwRiwgNCwKLSAgICAweDEzLCA1LAotICAgIDB4MTQsIDUsCi0gICAgMHgwNywgNSwKLSAgICAweDA4LCA1LAotICAgIDB4MDgsIDYsCi0gICAgMHgwMywgNiwKLSAgICAweDM0LCA2LAotICAgIDB4MzUsIDYsCi0gICAgMHgyYSwgNiwKLSAgICAweDJCLCA2LAotICAgIDB4MjcsIDcsCi0gICAgMHgwYywgNywKLSAgICAweDA4LCA3LAotICAgIDB4MTcsIDcsCi0gICAgMHgwMywgNywKLSAgICAweDA0LCA3LAotICAgIDB4MjgsIDcsCi0gICAgMHgyQiwgNywKLSAgICAweDEzLCA3LAotICAgIDB4MjQsIDcsCi0gICAgMHgxOCwgNywKLSAgICAweDAyLCA4LAotICAgIDB4MDMsIDgsCi0gICAgMHgxYSwgOCwKLSAgICAweDFiLCA4LAotICAgIDB4MTIsIDgsCi0gICAgMHgxMywgOCwKLSAgICAweDE0LCA4LAotICAgIDB4MTUsIDgsCi0gICAgMHgxNiwgOCwKLSAgICAweDE3LCA4LAotICAgIDB4MjgsIDgsCi0gICAgMHgyOSwgOCwKLSAgICAweDJhLCA4LAotICAgIDB4MmIsIDgsCi0gICAgMHgyYywgOCwKLSAgICAweDJkLCA4LAotICAgIDB4MDQsIDgsCi0gICAgMHgwNSwgOCwKLSAgICAweDBhLCA4LAotICAgIDB4MGIsIDgsCi0gICAgMHg1MiwgOCwKLSAgICAweDUzLCA4LAotICAgIDB4NTQsIDgsCi0gICAgMHg1NSwgOCwKLSAgICAweDI0LCA4LAotICAgIDB4MjUsIDgsCi0gICAgMHg1OCwgOCwKLSAgICAweDU5LCA4LAotICAgIDB4NWEsIDgsCi0gICAgMHg1YiwgOCwKLSAgICAweDRhLCA4LAotICAgIDB4NGIsIDgsCi0gICAgMHgzMiwgOCwKLSAgICAweDMzLCA4LAotICAgIDB4MzQsIDgsCi19Owotc3RhdGljIGNvbnN0IEZYX0JZVEUgV2hpdGVSdW5NYXJrdXBbODBdID0gewotICAgIDB4MWIsIDUsCi0gICAgMHgxMiwgNSwKLSAgICAweDE3LCA2LAotICAgIDB4MzcsIDcsCi0gICAgMHgzNiwgOCwKLSAgICAweDM3LCA4LAotICAgIDB4NjQsIDgsCi0gICAgMHg2NSwgOCwKLSAgICAweDY4LCA4LAotICAgIDB4NjcsIDgsCi0gICAgMHhjYywgOSwKLSAgICAweGNkLCA5LAotICAgIDB4ZDIsIDksCi0gICAgMHhkMywgOSwKLSAgICAweGQ0LCA5LAotICAgIDB4ZDUsIDksCi0gICAgMHhkNiwgOSwKLSAgICAweGQ3LCA5LAotICAgIDB4ZDgsIDksCi0gICAgMHhkOSwgOSwKLSAgICAweGRhLCA5LAotICAgIDB4ZGIsIDksCi0gICAgMHg5OCwgOSwKLSAgICAweDk5LCA5LAotICAgIDB4OWEsIDksCi0gICAgMHgxOCwgNiwKLSAgICAweDliLCA5LAotICAgIDB4MDgsIDExLAotICAgIDB4MGMsIDExLAotICAgIDB4MGQsIDExLAotICAgIDB4MTIsIDEyLAotICAgIDB4MTMsIDEyLAotICAgIDB4MTQsIDEyLAotICAgIDB4MTUsIDEyLAotICAgIDB4MTYsIDEyLAotICAgIDB4MTcsIDEyLAotICAgIDB4MWMsIDEyLAotICAgIDB4MWQsIDEyLAotICAgIDB4MWUsIDEyLAotICAgIDB4MWYsIDEyLAotfTsKLXN0YXRpYyB2b2lkIF9BZGRCaXRTdHJlYW0oRlhfTFBCWVRFIGRlc3RfYnVmLCBpbnQmIGRlc3RfYml0cG9zLCBpbnQgZGF0YSwgaW50IGJpdGxlbikKLXsKLSAgICBmb3IgKGludCBpID0gYml0bGVuIC0gMTsgaSA+PSAwOyBpIC0tKSB7Ci0gICAgICAgIGlmIChkYXRhICYgKDEgPDwgaSkpIHsKLSAgICAgICAgICAgIGRlc3RfYnVmW2Rlc3RfYml0cG9zIC8gOF0gfD0gMSA8PCAoNyAtIGRlc3RfYml0cG9zICUgOCk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9iaXRwb3MgKys7Ci0gICAgfQotfQotc3RhdGljIHZvaWQgX0ZheEVuY29kZVJ1bihGWF9MUEJZVEUgZGVzdF9idWYsIGludCYgZGVzdF9iaXRwb3MsIGludCBydW4sIEZYX0JPT0wgYldoaXRlKQotewotICAgIHdoaWxlIChydW4gPj0gMjU2MCkgewotICAgICAgICBfQWRkQml0U3RyZWFtKGRlc3RfYnVmLCBkZXN0X2JpdHBvcywgMHgxZiwgMTIpOwotICAgICAgICBydW4gLT0gMjU2MDsKLSAgICB9Ci0gICAgaWYgKHJ1biA+PSA2NCkgewotICAgICAgICBpbnQgbWFya3VwID0gcnVuIC0gcnVuICUgNjQ7Ci0gICAgICAgIEZYX0xQQ0JZVEUgcCA9IGJXaGl0ZSA/IFdoaXRlUnVuTWFya3VwIDogQmxhY2tSdW5NYXJrdXA7Ci0gICAgICAgIHAgKz0gKG1hcmt1cCAvIDY0IC0gMSkgKiAyOwotICAgICAgICBfQWRkQml0U3RyZWFtKGRlc3RfYnVmLCBkZXN0X2JpdHBvcywgKnAsIHBbMV0pOwotICAgIH0KLSAgICBydW4gJT0gNjQ7Ci0gICAgRlhfTFBDQllURSBwID0gYldoaXRlID8gV2hpdGVSdW5UZXJtaW5hdG9yIDogQmxhY2tSdW5UZXJtaW5hdG9yOwotICAgIHAgKz0gcnVuICogMjsKLSAgICBfQWRkQml0U3RyZWFtKGRlc3RfYnVmLCBkZXN0X2JpdHBvcywgKnAsIHBbMV0pOwotfQotc3RhdGljIHZvaWQgX0ZheEVuY29kZTJETGluZShGWF9MUEJZVEUgZGVzdF9idWYsIGludCYgZGVzdF9iaXRwb3MsIEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfTFBDQllURSByZWZfYnVmLCBpbnQgY29scykKLXsKLSAgICBpbnQgYTAgPSAtMSwgYTBjb2xvciA9IDE7CisgICAgaW50IHJ1bl9sZW4gPSAwOwogICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGludCBhMSA9IF9GaW5kQml0KHNyY19idWYsIGNvbHMsIGEwICsgMSwgMSAtIGEwY29sb3IpOwotICAgICAgICBpbnQgYjEsIGIyOwotICAgICAgICBfRmF4RzRGaW5kQjFCMihyZWZfYnVmLCBjb2xzLCBhMCwgYTBjb2xvciwgYjEsIGIyKTsKLSAgICAgICAgaWYgKGIyIDwgYTEpIHsKLSAgICAgICAgICAgIGRlc3RfYml0cG9zICs9IDM7Ci0gICAgICAgICAgICBkZXN0X2J1ZltkZXN0X2JpdHBvcyAvIDhdIHw9IDEgPDwgKDcgLSBkZXN0X2JpdHBvcyAlIDgpOwotICAgICAgICAgICAgZGVzdF9iaXRwb3MgKys7Ci0gICAgICAgICAgICBhMCA9IGIyOwotICAgICAgICB9IGVsc2UgaWYgKGExIC0gYjEgPD0gMyAmJiBiMSAtIGExIDw9IDMpIHsKLSAgICAgICAgICAgIGludCBkZWx0YSA9IGExIC0gYjE7Ci0gICAgICAgICAgICBzd2l0Y2ggKGRlbHRhKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICBkZXN0X2J1ZltkZXN0X2JpdHBvcyAvIDhdIHw9IDEgPDwgKDcgLSBkZXN0X2JpdHBvcyAlIDgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9iaXRwb3MgKz0gZGVsdGEgPT0gMSA/IDEgOiBkZWx0YSArIDI7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfYnVmW2Rlc3RfYml0cG9zIC8gOF0gfD0gMSA8PCAoNyAtIGRlc3RfYml0cG9zICUgOCk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfYml0cG9zICsrOwotICAgICAgICAgICAgICAgICAgICBkZXN0X2J1ZltkZXN0X2JpdHBvcyAvIDhdIHw9IDEgPDwgKDcgLSBkZXN0X2JpdHBvcyAlIDgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIC0xOgotICAgICAgICAgICAgICAgIGNhc2UgLTI6Ci0gICAgICAgICAgICAgICAgY2FzZSAtMzoKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9iaXRwb3MgKz0gZGVsdGEgPT0gLTEgPyAxIDogLWRlbHRhICsgMjsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9idWZbZGVzdF9iaXRwb3MgLyA4XSB8PSAxIDw8ICg3IC0gZGVzdF9iaXRwb3MgJSA4KTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9iaXRwb3MgKys7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9iaXRwb3MgKys7Ci0gICAgICAgICAgICBhMCA9IGExOwotICAgICAgICAgICAgYTBjb2xvciA9IDEgLSBhMGNvbG9yOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IGEyID0gX0ZpbmRCaXQoc3JjX2J1ZiwgY29scywgYTEgKyAxLCBhMGNvbG9yKTsKLSAgICAgICAgICAgIGRlc3RfYml0cG9zICsrOwotICAgICAgICAgICAgZGVzdF9iaXRwb3MgKys7Ci0gICAgICAgICAgICBkZXN0X2J1ZltkZXN0X2JpdHBvcyAvIDhdIHw9IDEgPDwgKDcgLSBkZXN0X2JpdHBvcyAlIDgpOwotICAgICAgICAgICAgZGVzdF9iaXRwb3MgKys7Ci0gICAgICAgICAgICBpZiAoYTAgPCAwKSB7Ci0gICAgICAgICAgICAgICAgYTAgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX0ZheEVuY29kZVJ1bihkZXN0X2J1ZiwgZGVzdF9iaXRwb3MsIGExIC0gYTAsIGEwY29sb3IpOwotICAgICAgICAgICAgX0ZheEVuY29kZVJ1bihkZXN0X2J1ZiwgZGVzdF9iaXRwb3MsIGEyIC0gYTEsIDEgLSBhMGNvbG9yKTsKLSAgICAgICAgICAgIGEwID0gYTI7CisgICAgICBpbnQgcnVuID0gRmF4R2V0UnVuKGNvbG9yID8gRmF4V2hpdGVSdW5JbnMgOiBGYXhCbGFja1J1bklucywgc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cG9zLCBiaXRzaXplKTsKKyAgICAgIGlmIChydW4gPCAwKSB7CisgICAgICAgIHdoaWxlIChiaXRwb3MgPCBiaXRzaXplKSB7CisgICAgICAgICAgaW50IGJpdCA9IE5FWFRCSVQ7CisgICAgICAgICAgaWYgKGJpdCkgeworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChhMCA+PSBjb2xzKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgcnVuX2xlbiArPSBydW47CisgICAgICBpZiAocnVuIDwgNjQpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CiAgICAgfQorICAgIGlmICghY29sb3IpIHsKKyAgICAgIEZheEZpbGxCaXRzKGRlc3RfYnVmLCBjb2x1bW5zLCBzdGFydHBvcywgc3RhcnRwb3MgKyBydW5fbGVuKTsKKyAgICB9CisgICAgc3RhcnRwb3MgKz0gcnVuX2xlbjsKKyAgICBpZiAoc3RhcnRwb3MgPj0gY29sdW1ucykgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNvbG9yID0gIWNvbG9yOworICB9CisgIHJldHVybiBUUlVFOwogfQotY2xhc3MgQ0NvZGVjX0ZheEVuY29kZXIgCi17Ci1wdWJsaWM6Ci0gICAgQ0NvZGVjX0ZheEVuY29kZXIoRlhfTFBDQllURSBzcmNfYnVmLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwaXRjaCk7Ci0gICAgfkNDb2RlY19GYXhFbmNvZGVyKCk7Ci0gICAgdm9pZAkJCUVuY29kZShGWF9MUEJZVEUmIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKTsKLSAgICB2b2lkCQkJRW5jb2RlMkRMaW5lKEZYX0xQQ0JZVEUgc2Nhbl9saW5lKTsKLSAgICBDRlhfQmluYXJ5QnVmCW1fRGVzdEJ1ZjsKLSAgICBGWF9MUEJZVEUJCW1fcFJlZkxpbmUsIG1fcExpbmVCdWY7Ci0gICAgaW50CQkJCW1fQ29scywgbV9Sb3dzLCBtX1BpdGNoOwotICAgIEZYX0xQQ0JZVEUJCW1fcFNyY0J1ZjsKKworY29uc3QgdWludDhfdCBCbGFja1J1blRlcm1pbmF0b3JbMTI4XSA9IHsKKyAgICAweDM3LCAxMCwgMHgwMiwgMywgIDB4MDMsIDIsICAweDAyLCAyLCAgMHgwMywgMywgIDB4MDMsIDQsICAweDAyLCA0LAorICAgIDB4MDMsIDUsICAweDA1LCA2LCAgMHgwNCwgNiwgIDB4MDQsIDcsICAweDA1LCA3LCAgMHgwNywgNywgIDB4MDQsIDgsCisgICAgMHgwNywgOCwgIDB4MTgsIDksICAweDE3LCAxMCwgMHgxOCwgMTAsIDB4MDgsIDEwLCAweDY3LCAxMSwgMHg2OCwgMTEsCisgICAgMHg2YywgMTEsIDB4MzcsIDExLCAweDI4LCAxMSwgMHgxNywgMTEsIDB4MTgsIDExLCAweGNhLCAxMiwgMHhjYiwgMTIsCisgICAgMHhjYywgMTIsIDB4Y2QsIDEyLCAweDY4LCAxMiwgMHg2OSwgMTIsIDB4NmEsIDEyLCAweDZiLCAxMiwgMHhkMiwgMTIsCisgICAgMHhkMywgMTIsIDB4ZDQsIDEyLCAweGQ1LCAxMiwgMHhkNiwgMTIsIDB4ZDcsIDEyLCAweDZjLCAxMiwgMHg2ZCwgMTIsCisgICAgMHhkYSwgMTIsIDB4ZGIsIDEyLCAweDU0LCAxMiwgMHg1NSwgMTIsIDB4NTYsIDEyLCAweDU3LCAxMiwgMHg2NCwgMTIsCisgICAgMHg2NSwgMTIsIDB4NTIsIDEyLCAweDUzLCAxMiwgMHgyNCwgMTIsIDB4MzcsIDEyLCAweDM4LCAxMiwgMHgyNywgMTIsCisgICAgMHgyOCwgMTIsIDB4NTgsIDEyLCAweDU5LCAxMiwgMHgyYiwgMTIsIDB4MmMsIDEyLCAweDVhLCAxMiwgMHg2NiwgMTIsCisgICAgMHg2NywgMTIsCiB9OwotQ0NvZGVjX0ZheEVuY29kZXI6OkNDb2RlY19GYXhFbmNvZGVyKEZYX0xQQ0JZVEUgc3JjX2J1ZiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcGl0Y2gpCi17Ci0gICAgbV9wU3JjQnVmID0gc3JjX2J1ZjsKLSAgICBtX0NvbHMgPSB3aWR0aDsKLSAgICBtX1Jvd3MgPSBoZWlnaHQ7Ci0gICAgbV9QaXRjaCA9IHBpdGNoOwotICAgIG1fcFJlZkxpbmUgPSBGWF9BbGxvYyhGWF9CWVRFLCBtX1BpdGNoKTsKLSAgICBGWFNZU19tZW1zZXQ4KG1fcFJlZkxpbmUsIDB4ZmYsIG1fUGl0Y2gpOwotICAgIG1fcExpbmVCdWYgPSBGWF9BbGxvYzJEKEZYX0JZVEUsIG1fUGl0Y2gsIDgpOwotICAgIG1fRGVzdEJ1Zi5Fc3RpbWF0ZVNpemUoMCwgMTAyNDApOwotfQotQ0NvZGVjX0ZheEVuY29kZXI6On5DQ29kZWNfRmF4RW5jb2RlcigpCi17Ci0gICAgaWYgKG1fcFJlZkxpbmUpIHsKLSAgICAgICAgRlhfRnJlZShtX3BSZWZMaW5lKTsKKworY29uc3QgdWludDhfdCBCbGFja1J1bk1hcmt1cFs4MF0gPSB7CisgICAgMHgwZiwgMTAsIDB4YzgsIDEyLCAweGM5LCAxMiwgMHg1YiwgMTIsIDB4MzMsIDEyLCAweDM0LCAxMiwgMHgzNSwgMTIsCisgICAgMHg2YywgMTMsIDB4NmQsIDEzLCAweDRhLCAxMywgMHg0YiwgMTMsIDB4NGMsIDEzLCAweDRkLCAxMywgMHg3MiwgMTMsCisgICAgMHg3MywgMTMsIDB4NzQsIDEzLCAweDc1LCAxMywgMHg3NiwgMTMsIDB4NzcsIDEzLCAweDUyLCAxMywgMHg1MywgMTMsCisgICAgMHg1NCwgMTMsIDB4NTUsIDEzLCAweDVhLCAxMywgMHg1YiwgMTMsIDB4NjQsIDEzLCAweDY1LCAxMywgMHgwOCwgMTEsCisgICAgMHgwYywgMTEsIDB4MGQsIDExLCAweDEyLCAxMiwgMHgxMywgMTIsIDB4MTQsIDEyLCAweDE1LCAxMiwgMHgxNiwgMTIsCisgICAgMHgxNywgMTIsIDB4MWMsIDEyLCAweDFkLCAxMiwgMHgxZSwgMTIsIDB4MWYsIDEyLAorfTsKKworY29uc3QgdWludDhfdCBXaGl0ZVJ1blRlcm1pbmF0b3JbMTI4XSA9IHsKKyAgICAweDM1LCA4LCAweDA3LCA2LCAweDA3LCA0LCAweDA4LCA0LCAweDBCLCA0LCAweDBDLCA0LCAweDBFLCA0LCAweDBGLCA0LAorICAgIDB4MTMsIDUsIDB4MTQsIDUsIDB4MDcsIDUsIDB4MDgsIDUsIDB4MDgsIDYsIDB4MDMsIDYsIDB4MzQsIDYsIDB4MzUsIDYsCisgICAgMHgyYSwgNiwgMHgyQiwgNiwgMHgyNywgNywgMHgwYywgNywgMHgwOCwgNywgMHgxNywgNywgMHgwMywgNywgMHgwNCwgNywKKyAgICAweDI4LCA3LCAweDJCLCA3LCAweDEzLCA3LCAweDI0LCA3LCAweDE4LCA3LCAweDAyLCA4LCAweDAzLCA4LCAweDFhLCA4LAorICAgIDB4MWIsIDgsIDB4MTIsIDgsIDB4MTMsIDgsIDB4MTQsIDgsIDB4MTUsIDgsIDB4MTYsIDgsIDB4MTcsIDgsIDB4MjgsIDgsCisgICAgMHgyOSwgOCwgMHgyYSwgOCwgMHgyYiwgOCwgMHgyYywgOCwgMHgyZCwgOCwgMHgwNCwgOCwgMHgwNSwgOCwgMHgwYSwgOCwKKyAgICAweDBiLCA4LCAweDUyLCA4LCAweDUzLCA4LCAweDU0LCA4LCAweDU1LCA4LCAweDI0LCA4LCAweDI1LCA4LCAweDU4LCA4LAorICAgIDB4NTksIDgsIDB4NWEsIDgsIDB4NWIsIDgsIDB4NGEsIDgsIDB4NGIsIDgsIDB4MzIsIDgsIDB4MzMsIDgsIDB4MzQsIDgsCit9OworCitjb25zdCB1aW50OF90IFdoaXRlUnVuTWFya3VwWzgwXSA9IHsKKyAgICAweDFiLCA1LCAgMHgxMiwgNSwgIDB4MTcsIDYsICAweDM3LCA3LCAgMHgzNiwgOCwgIDB4MzcsIDgsICAweDY0LCA4LAorICAgIDB4NjUsIDgsICAweDY4LCA4LCAgMHg2NywgOCwgIDB4Y2MsIDksICAweGNkLCA5LCAgMHhkMiwgOSwgIDB4ZDMsIDksCisgICAgMHhkNCwgOSwgIDB4ZDUsIDksICAweGQ2LCA5LCAgMHhkNywgOSwgIDB4ZDgsIDksICAweGQ5LCA5LCAgMHhkYSwgOSwKKyAgICAweGRiLCA5LCAgMHg5OCwgOSwgIDB4OTksIDksICAweDlhLCA5LCAgMHgxOCwgNiwgIDB4OWIsIDksICAweDA4LCAxMSwKKyAgICAweDBjLCAxMSwgMHgwZCwgMTEsIDB4MTIsIDEyLCAweDEzLCAxMiwgMHgxNCwgMTIsIDB4MTUsIDEyLCAweDE2LCAxMiwKKyAgICAweDE3LCAxMiwgMHgxYywgMTIsIDB4MWQsIDEyLCAweDFlLCAxMiwgMHgxZiwgMTIsCit9OworCit2b2lkIEFkZEJpdFN0cmVhbSh1aW50OF90KiBkZXN0X2J1ZiwgaW50JiBkZXN0X2JpdHBvcywgaW50IGRhdGEsIGludCBiaXRsZW4pIHsKKyAgZm9yIChpbnQgaSA9IGJpdGxlbiAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgaWYgKGRhdGEgJiAoMSA8PCBpKSkgeworICAgICAgZGVzdF9idWZbZGVzdF9iaXRwb3MgLyA4XSB8PSAxIDw8ICg3IC0gZGVzdF9iaXRwb3MgJSA4KTsKICAgICB9Ci0gICAgaWYgKG1fcExpbmVCdWYpIHsKLSAgICAgICAgRlhfRnJlZShtX3BMaW5lQnVmKTsKLSAgICB9CisgICAgZGVzdF9iaXRwb3MrKzsKKyAgfQogfQotdm9pZCBDQ29kZWNfRmF4RW5jb2Rlcjo6RW5jb2RlKEZYX0xQQllURSYgZGVzdF9idWYsIEZYX0RXT1JEJiBkZXN0X3NpemUpCi17Ci0gICAgaW50IGRlc3RfYml0cG9zID0gMDsKLSAgICBGWF9CWVRFIGxhc3RfYnl0ZSA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1Jvd3M7IGkgKyspIHsKLSAgICAgICAgRlhfTFBDQllURSBzY2FuX2xpbmUgPSBtX3BTcmNCdWYgKyBpICogbV9QaXRjaDsKLSAgICAgICAgRlhTWVNfbWVtc2V0MzIobV9wTGluZUJ1ZiwgMCwgbV9QaXRjaCAqIDgpOwotICAgICAgICBtX3BMaW5lQnVmWzBdID0gbGFzdF9ieXRlOwotICAgICAgICBfRmF4RW5jb2RlMkRMaW5lKG1fcExpbmVCdWYsIGRlc3RfYml0cG9zLCBzY2FuX2xpbmUsIG1fcFJlZkxpbmUsIG1fQ29scyk7Ci0gICAgICAgIG1fRGVzdEJ1Zi5BcHBlbmRCbG9jayhtX3BMaW5lQnVmLCBkZXN0X2JpdHBvcyAvIDgpOwotICAgICAgICBsYXN0X2J5dGUgPSBtX3BMaW5lQnVmW2Rlc3RfYml0cG9zIC8gOF07Ci0gICAgICAgIGRlc3RfYml0cG9zICU9IDg7Ci0gICAgICAgIEZYU1lTX21lbWNweTMyKG1fcFJlZkxpbmUsIHNjYW5fbGluZSwgbV9QaXRjaCk7Ci0gICAgfQotICAgIGlmIChkZXN0X2JpdHBvcykgewotICAgICAgICBtX0Rlc3RCdWYuQXBwZW5kQnl0ZShsYXN0X2J5dGUpOwotICAgIH0KLSAgICBkZXN0X2J1ZiA9IG1fRGVzdEJ1Zi5HZXRCdWZmZXIoKTsKLSAgICBkZXN0X3NpemUgPSBtX0Rlc3RCdWYuR2V0U2l6ZSgpOwotICAgIG1fRGVzdEJ1Zi5EZXRhY2hCdWZmZXIoKTsKKwordm9pZCBGYXhFbmNvZGVSdW4odWludDhfdCogZGVzdF9idWYsIGludCYgZGVzdF9iaXRwb3MsIGludCBydW4sIGJvb2wgYldoaXRlKSB7CisgIHdoaWxlIChydW4gPj0gMjU2MCkgeworICAgIEFkZEJpdFN0cmVhbShkZXN0X2J1ZiwgZGVzdF9iaXRwb3MsIDB4MWYsIDEyKTsKKyAgICBydW4gLT0gMjU2MDsKKyAgfQorICBpZiAocnVuID49IDY0KSB7CisgICAgaW50IG1hcmt1cCA9IHJ1biAtIHJ1biAlIDY0OworICAgIGNvbnN0IHVpbnQ4X3QqIHAgPSBiV2hpdGUgPyBXaGl0ZVJ1bk1hcmt1cCA6IEJsYWNrUnVuTWFya3VwOworICAgIHAgKz0gKG1hcmt1cCAvIDY0IC0gMSkgKiAyOworICAgIEFkZEJpdFN0cmVhbShkZXN0X2J1ZiwgZGVzdF9iaXRwb3MsICpwLCBwWzFdKTsKKyAgfQorICBydW4gJT0gNjQ7CisgIGNvbnN0IHVpbnQ4X3QqIHAgPSBiV2hpdGUgPyBXaGl0ZVJ1blRlcm1pbmF0b3IgOiBCbGFja1J1blRlcm1pbmF0b3I7CisgIHAgKz0gcnVuICogMjsKKyAgQWRkQml0U3RyZWFtKGRlc3RfYnVmLCBkZXN0X2JpdHBvcywgKnAsIHBbMV0pOwogfQotRlhfQk9PTAlDQ29kZWNfRmF4TW9kdWxlOjpFbmNvZGUoRlhfTFBDQllURSBzcmNfYnVmLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwaXRjaCwgRlhfTFBCWVRFJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkKLXsKLSAgICBDQ29kZWNfRmF4RW5jb2RlciBlbmNvZGVyKHNyY19idWYsIHdpZHRoLCBoZWlnaHQsIHBpdGNoKTsKLSAgICBlbmNvZGVyLkVuY29kZShkZXN0X2J1ZiwgZGVzdF9zaXplKTsKLSAgICByZXR1cm4gVFJVRTsKKwordm9pZCBGYXhFbmNvZGUyRExpbmUodWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICBpbnQmIGRlc3RfYml0cG9zLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHJlZl9idWYsCisgICAgICAgICAgICAgICAgICAgICBpbnQgY29scykgeworICBpbnQgYTAgPSAtMTsKKyAgYm9vbCBhMGNvbG9yID0gdHJ1ZTsKKyAgd2hpbGUgKDEpIHsKKyAgICBpbnQgYTEgPSBGaW5kQml0KHNyY19idWYsIGNvbHMsIGEwICsgMSwgIWEwY29sb3IpOworICAgIGludCBiMSwgYjI7CisgICAgRmF4RzRGaW5kQjFCMihyZWZfYnVmLCBjb2xzLCBhMCwgYTBjb2xvciwgYjEsIGIyKTsKKyAgICBpZiAoYjIgPCBhMSkgeworICAgICAgZGVzdF9iaXRwb3MgKz0gMzsKKyAgICAgIGRlc3RfYnVmW2Rlc3RfYml0cG9zIC8gOF0gfD0gMSA8PCAoNyAtIGRlc3RfYml0cG9zICUgOCk7CisgICAgICBkZXN0X2JpdHBvcysrOworICAgICAgYTAgPSBiMjsKKyAgICB9IGVsc2UgaWYgKGExIC0gYjEgPD0gMyAmJiBiMSAtIGExIDw9IDMpIHsKKyAgICAgIGludCBkZWx0YSA9IGExIC0gYjE7CisgICAgICBzd2l0Y2ggKGRlbHRhKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBkZXN0X2J1ZltkZXN0X2JpdHBvcyAvIDhdIHw9IDEgPDwgKDcgLSBkZXN0X2JpdHBvcyAlIDgpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgIGRlc3RfYml0cG9zICs9IGRlbHRhID09IDEgPyAxIDogZGVsdGEgKyAyOworICAgICAgICAgIGRlc3RfYnVmW2Rlc3RfYml0cG9zIC8gOF0gfD0gMSA8PCAoNyAtIGRlc3RfYml0cG9zICUgOCk7CisgICAgICAgICAgZGVzdF9iaXRwb3MrKzsKKyAgICAgICAgICBkZXN0X2J1ZltkZXN0X2JpdHBvcyAvIDhdIHw9IDEgPDwgKDcgLSBkZXN0X2JpdHBvcyAlIDgpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIC0xOgorICAgICAgICBjYXNlIC0yOgorICAgICAgICBjYXNlIC0zOgorICAgICAgICAgIGRlc3RfYml0cG9zICs9IGRlbHRhID09IC0xID8gMSA6IC1kZWx0YSArIDI7CisgICAgICAgICAgZGVzdF9idWZbZGVzdF9iaXRwb3MgLyA4XSB8PSAxIDw8ICg3IC0gZGVzdF9iaXRwb3MgJSA4KTsKKyAgICAgICAgICBkZXN0X2JpdHBvcysrOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZGVzdF9iaXRwb3MrKzsKKyAgICAgIGEwID0gYTE7CisgICAgICBhMGNvbG9yID0gIWEwY29sb3I7CisgICAgfSBlbHNlIHsKKyAgICAgIGludCBhMiA9IEZpbmRCaXQoc3JjX2J1ZiwgY29scywgYTEgKyAxLCBhMGNvbG9yKTsKKyAgICAgIGRlc3RfYml0cG9zKys7CisgICAgICBkZXN0X2JpdHBvcysrOworICAgICAgZGVzdF9idWZbZGVzdF9iaXRwb3MgLyA4XSB8PSAxIDw8ICg3IC0gZGVzdF9iaXRwb3MgJSA4KTsKKyAgICAgIGRlc3RfYml0cG9zKys7CisgICAgICBpZiAoYTAgPCAwKSB7CisgICAgICAgIGEwID0gMDsKKyAgICAgIH0KKyAgICAgIEZheEVuY29kZVJ1bihkZXN0X2J1ZiwgZGVzdF9iaXRwb3MsIGExIC0gYTAsIGEwY29sb3IpOworICAgICAgRmF4RW5jb2RlUnVuKGRlc3RfYnVmLCBkZXN0X2JpdHBvcywgYTIgLSBhMSwgIWEwY29sb3IpOworICAgICAgYTAgPSBhMjsKKyAgICB9CisgICAgaWYgKGEwID49IGNvbHMpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KIH0KLUlDb2RlY19TY2FubGluZURlY29kZXIqCUNDb2RlY19GYXhNb2R1bGU6OkNyZWF0ZURlY29kZXIoRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICBpbnQgSywgRlhfQk9PTCBFbmRPZkxpbmUsIEZYX0JPT0wgRW5jb2RlZEJ5dGVBbGlnbiwgRlhfQk9PTCBCbGFja0lzMSwgaW50IENvbHVtbnMsIGludCBSb3dzKQotewotICAgIENDb2RlY19GYXhEZWNvZGVyKiBwRGVjb2RlciA9IG5ldyBDQ29kZWNfRmF4RGVjb2RlcjsKLSAgICBwRGVjb2Rlci0+Q3JlYXRlKHNyY19idWYsIHNyY19zaXplLCB3aWR0aCwgaGVpZ2h0LCBLLCBFbmRPZkxpbmUsIEVuY29kZWRCeXRlQWxpZ24sIEJsYWNrSXMxLCBDb2x1bW5zLCBSb3dzKTsKLSAgICByZXR1cm4gcERlY29kZXI7CisKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBDQ29kZWNfRmF4RGVjb2RlciA6IHB1YmxpYyBDQ29kZWNfU2NhbmxpbmVEZWNvZGVyIHsKKyBwdWJsaWM6CisgIENDb2RlY19GYXhEZWNvZGVyKCk7CisgIH5DQ29kZWNfRmF4RGVjb2RlcigpIG92ZXJyaWRlOworCisgIEZYX0JPT0wgQ3JlYXRlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgIGludCBLLAorICAgICAgICAgICAgICAgICBGWF9CT09MIEVuZE9mTGluZSwKKyAgICAgICAgICAgICAgICAgRlhfQk9PTCBFbmNvZGVkQnl0ZUFsaWduLAorICAgICAgICAgICAgICAgICBGWF9CT09MIEJsYWNrSXMxLAorICAgICAgICAgICAgICAgICBpbnQgQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgaW50IFJvd3MpOworCisgIC8vIENDb2RlY19TY2FubGluZURlY29kZXIKKyAgdm9pZCB2X0Rvd25TY2FsZShpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0KSBvdmVycmlkZSB7fQorICBGWF9CT09MIHZfUmV3aW5kKCkgb3ZlcnJpZGU7CisgIHVpbnQ4X3QqIHZfR2V0TmV4dExpbmUoKSBvdmVycmlkZTsKKyAgRlhfRFdPUkQgR2V0U3JjT2Zmc2V0KCkgb3ZlcnJpZGU7CisKKyAgaW50IG1fRW5jb2RpbmcsIG1fYkVuZE9mTGluZSwgbV9iQnl0ZUFsaWduLCBtX2JCbGFjazsKKyAgaW50IGJpdHBvczsKKyAgY29uc3QgdWludDhfdCogbV9wU3JjQnVmOworICBGWF9EV09SRCBtX1NyY1NpemU7CisgIHVpbnQ4X3QqIG1fcFNjYW5saW5lQnVmOworICB1aW50OF90KiBtX3BSZWZCdWY7Cit9OworCitDQ29kZWNfRmF4RGVjb2Rlcjo6Q0NvZGVjX0ZheERlY29kZXIoKSB7CisgIG1fcFNjYW5saW5lQnVmID0gTlVMTDsKKyAgbV9wUmVmQnVmID0gTlVMTDsKK30KK0NDb2RlY19GYXhEZWNvZGVyOjp+Q0NvZGVjX0ZheERlY29kZXIoKSB7CisgIEZYX0ZyZWUobV9wU2NhbmxpbmVCdWYpOworICBGWF9GcmVlKG1fcFJlZkJ1Zik7Cit9CitGWF9CT09MIENDb2RlY19GYXhEZWNvZGVyOjpDcmVhdGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIEVuZE9mTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIEVuY29kZWRCeXRlQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBCbGFja0lzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgUm93cykgeworICBtX0VuY29kaW5nID0gSzsKKyAgbV9iRW5kT2ZMaW5lID0gRW5kT2ZMaW5lOworICBtX2JCeXRlQWxpZ24gPSBFbmNvZGVkQnl0ZUFsaWduOworICBtX2JCbGFjayA9IEJsYWNrSXMxOworICBtX09yaWdXaWR0aCA9IENvbHVtbnM7CisgIG1fT3JpZ0hlaWdodCA9IFJvd3M7CisgIGlmIChtX09yaWdXaWR0aCA9PSAwKSB7CisgICAgbV9PcmlnV2lkdGggPSB3aWR0aDsKKyAgfQorICBpZiAobV9PcmlnSGVpZ2h0ID09IDApIHsKKyAgICBtX09yaWdIZWlnaHQgPSBoZWlnaHQ7CisgIH0KKyAgLy8gU2hvdWxkIG5vdCBvdmVyZmxvdy4gQ2hlY2tlZCBieSBGUERGQVBJX0NyZWF0ZUZheERlY29kZXIuCisgIG1fUGl0Y2ggPSAoc3RhdGljX2Nhc3Q8RlhfRFdPUkQ+KG1fT3JpZ1dpZHRoKSArIDMxKSAvIDMyICogNDsKKyAgbV9PdXRwdXRXaWR0aCA9IG1fT3JpZ1dpZHRoOworICBtX091dHB1dEhlaWdodCA9IG1fT3JpZ0hlaWdodDsKKyAgbV9wU2NhbmxpbmVCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBtX1BpdGNoKTsKKyAgbV9wUmVmQnVmID0gRlhfQWxsb2ModWludDhfdCwgbV9QaXRjaCk7CisgIG1fcFNyY0J1ZiA9IHNyY19idWY7CisgIG1fU3JjU2l6ZSA9IHNyY19zaXplOworICBtX25Db21wcyA9IDE7CisgIG1fYnBjID0gMTsKKyAgbV9iQ29sb3JUcmFuc2Zvcm1lZCA9IEZBTFNFOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0NvZGVjX0ZheERlY29kZXI6OnZfUmV3aW5kKCkgeworICBGWFNZU19tZW1zZXQobV9wUmVmQnVmLCAweGZmLCBtX1BpdGNoKTsKKyAgYml0cG9zID0gMDsKKyAgcmV0dXJuIFRSVUU7Cit9Cit1aW50OF90KiBDQ29kZWNfRmF4RGVjb2Rlcjo6dl9HZXROZXh0TGluZSgpIHsKKyAgaW50IGJpdHNpemUgPSBtX1NyY1NpemUgKiA4OworICBGYXhTa2lwRU9MKG1fcFNyY0J1ZiwgYml0c2l6ZSwgYml0cG9zKTsKKyAgaWYgKGJpdHBvcyA+PSBiaXRzaXplKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgRlhTWVNfbWVtc2V0KG1fcFNjYW5saW5lQnVmLCAweGZmLCBtX1BpdGNoKTsKKyAgaWYgKG1fRW5jb2RpbmcgPCAwKSB7CisgICAgRmF4RzRHZXRSb3cobV9wU3JjQnVmLCBiaXRzaXplLCBiaXRwb3MsIG1fcFNjYW5saW5lQnVmLCBtX3BSZWZCdWYsCisgICAgICAgICAgICAgICAgbV9PcmlnV2lkdGgpOworICAgIEZYU1lTX21lbWNweShtX3BSZWZCdWYsIG1fcFNjYW5saW5lQnVmLCBtX1BpdGNoKTsKKyAgfSBlbHNlIGlmIChtX0VuY29kaW5nID09IDApIHsKKyAgICBGYXhHZXQxRExpbmUobV9wU3JjQnVmLCBiaXRzaXplLCBiaXRwb3MsIG1fcFNjYW5saW5lQnVmLCBtX09yaWdXaWR0aCk7CisgIH0gZWxzZSB7CisgICAgRlhfQk9PTCBiTmV4dDFEID0gbV9wU3JjQnVmW2JpdHBvcyAvIDhdICYgKDEgPDwgKDcgLSBiaXRwb3MgJSA4KSk7CisgICAgYml0cG9zKys7CisgICAgaWYgKGJOZXh0MUQpIHsKKyAgICAgIEZheEdldDFETGluZShtX3BTcmNCdWYsIGJpdHNpemUsIGJpdHBvcywgbV9wU2NhbmxpbmVCdWYsIG1fT3JpZ1dpZHRoKTsKKyAgICB9IGVsc2UgeworICAgICAgRmF4RzRHZXRSb3cobV9wU3JjQnVmLCBiaXRzaXplLCBiaXRwb3MsIG1fcFNjYW5saW5lQnVmLCBtX3BSZWZCdWYsCisgICAgICAgICAgICAgICAgICBtX09yaWdXaWR0aCk7CisgICAgfQorICAgIEZYU1lTX21lbWNweShtX3BSZWZCdWYsIG1fcFNjYW5saW5lQnVmLCBtX1BpdGNoKTsKKyAgfQorICBpZiAobV9iRW5kT2ZMaW5lKSB7CisgICAgRmF4U2tpcEVPTChtX3BTcmNCdWYsIGJpdHNpemUsIGJpdHBvcyk7CisgIH0KKyAgaWYgKG1fYkJ5dGVBbGlnbiAmJiBiaXRwb3MgPCBiaXRzaXplKSB7CisgICAgaW50IGJpdHBvczAgPSBiaXRwb3M7CisgICAgaW50IGJpdHBvczEgPSAoYml0cG9zICsgNykgLyA4ICogODsKKyAgICB3aGlsZSAobV9iQnl0ZUFsaWduICYmIGJpdHBvczAgPCBiaXRwb3MxKSB7CisgICAgICBpbnQgYml0ID0gbV9wU3JjQnVmW2JpdHBvczAgLyA4XSAmICgxIDw8ICg3IC0gYml0cG9zMCAlIDgpKTsKKyAgICAgIGlmIChiaXQgIT0gMCkgeworICAgICAgICBtX2JCeXRlQWxpZ24gPSBGQUxTRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJpdHBvczArKzsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG1fYkJ5dGVBbGlnbikgeworICAgICAgYml0cG9zID0gYml0cG9zMTsKKyAgICB9CisgIH0KKyAgaWYgKG1fYkJsYWNrKSB7CisgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG1fUGl0Y2g7IGkrKykgeworICAgICAgbV9wU2NhbmxpbmVCdWZbaV0gPSB+bV9wU2NhbmxpbmVCdWZbaV07CisgICAgfQorICB9CisgIHJldHVybiBtX3BTY2FubGluZUJ1ZjsKK30KK0ZYX0RXT1JEIENDb2RlY19GYXhEZWNvZGVyOjpHZXRTcmNPZmZzZXQoKSB7CisgIEZYX0RXT1JEIHJldCA9IChiaXRwb3MgKyA3KSAvIDg7CisgIGlmIChyZXQgPiBtX1NyY1NpemUpIHsKKyAgICByZXQgPSBtX1NyY1NpemU7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKwordm9pZCBGYXhHNERlY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgaW50KiBwYml0cG9zLAorICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICBpbnQgcGl0Y2gpIHsKKyAgaWYgKHBpdGNoID09IDApIHsKKyAgICBwaXRjaCA9ICh3aWR0aCArIDcpIC8gODsKKyAgfQorICB1aW50OF90KiByZWZfYnVmID0gRlhfQWxsb2ModWludDhfdCwgcGl0Y2gpOworICBGWFNZU19tZW1zZXQocmVmX2J1ZiwgMHhmZiwgcGl0Y2gpOworICBpbnQgYml0cG9zID0gKnBiaXRwb3M7CisgIGZvciAoaW50IGlSb3cgPSAwOyBpUm93IDwgaGVpZ2h0OyBpUm93KyspIHsKKyAgICB1aW50OF90KiBsaW5lX2J1ZiA9IGRlc3RfYnVmICsgaVJvdyAqIHBpdGNoOworICAgIEZYU1lTX21lbXNldChsaW5lX2J1ZiwgMHhmZiwgcGl0Y2gpOworICAgIEZheEc0R2V0Um93KHNyY19idWYsIHNyY19zaXplIDw8IDMsIGJpdHBvcywgbGluZV9idWYsIHJlZl9idWYsIHdpZHRoKTsKKyAgICBGWFNZU19tZW1jcHkocmVmX2J1ZiwgbGluZV9idWYsIHBpdGNoKTsKKyAgfQorICBGWF9GcmVlKHJlZl9idWYpOworICAqcGJpdHBvcyA9IGJpdHBvczsKK30KKworY2xhc3MgQ0NvZGVjX0ZheEVuY29kZXIgeworIHB1YmxpYzoKKyAgQ0NvZGVjX0ZheEVuY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcGl0Y2gpOworICB+Q0NvZGVjX0ZheEVuY29kZXIoKTsKKyAgdm9pZCBFbmNvZGUodWludDhfdComIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKTsKKyAgdm9pZCBFbmNvZGUyRExpbmUoY29uc3QgdWludDhfdCogc2Nhbl9saW5lKTsKKyAgQ0ZYX0JpbmFyeUJ1ZiBtX0Rlc3RCdWY7CisgIHVpbnQ4X3QqIG1fcFJlZkxpbmU7CisgIHVpbnQ4X3QqIG1fcExpbmVCdWY7CisgIGludCBtX0NvbHMsIG1fUm93cywgbV9QaXRjaDsKKyAgY29uc3QgdWludDhfdCogbV9wU3JjQnVmOworfTsKK0NDb2RlY19GYXhFbmNvZGVyOjpDQ29kZWNfRmF4RW5jb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCkgeworICBtX3BTcmNCdWYgPSBzcmNfYnVmOworICBtX0NvbHMgPSB3aWR0aDsKKyAgbV9Sb3dzID0gaGVpZ2h0OworICBtX1BpdGNoID0gcGl0Y2g7CisgIG1fcFJlZkxpbmUgPSBGWF9BbGxvYyh1aW50OF90LCBtX1BpdGNoKTsKKyAgRlhTWVNfbWVtc2V0KG1fcFJlZkxpbmUsIDB4ZmYsIG1fUGl0Y2gpOworICBtX3BMaW5lQnVmID0gRlhfQWxsb2MyRCh1aW50OF90LCBtX1BpdGNoLCA4KTsKKyAgbV9EZXN0QnVmLkVzdGltYXRlU2l6ZSgwLCAxMDI0MCk7Cit9CitDQ29kZWNfRmF4RW5jb2Rlcjo6fkNDb2RlY19GYXhFbmNvZGVyKCkgeworICBGWF9GcmVlKG1fcFJlZkxpbmUpOworICBGWF9GcmVlKG1fcExpbmVCdWYpOworfQordm9pZCBDQ29kZWNfRmF4RW5jb2Rlcjo6RW5jb2RlKHVpbnQ4X3QqJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgeworICBpbnQgZGVzdF9iaXRwb3MgPSAwOworICB1aW50OF90IGxhc3RfYnl0ZSA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9Sb3dzOyBpKyspIHsKKyAgICBjb25zdCB1aW50OF90KiBzY2FuX2xpbmUgPSBtX3BTcmNCdWYgKyBpICogbV9QaXRjaDsKKyAgICBGWFNZU19tZW1zZXQobV9wTGluZUJ1ZiwgMCwgbV9QaXRjaCAqIDgpOworICAgIG1fcExpbmVCdWZbMF0gPSBsYXN0X2J5dGU7CisgICAgRmF4RW5jb2RlMkRMaW5lKG1fcExpbmVCdWYsIGRlc3RfYml0cG9zLCBzY2FuX2xpbmUsIG1fcFJlZkxpbmUsIG1fQ29scyk7CisgICAgbV9EZXN0QnVmLkFwcGVuZEJsb2NrKG1fcExpbmVCdWYsIGRlc3RfYml0cG9zIC8gOCk7CisgICAgbGFzdF9ieXRlID0gbV9wTGluZUJ1ZltkZXN0X2JpdHBvcyAvIDhdOworICAgIGRlc3RfYml0cG9zICU9IDg7CisgICAgRlhTWVNfbWVtY3B5KG1fcFJlZkxpbmUsIHNjYW5fbGluZSwgbV9QaXRjaCk7CisgIH0KKyAgaWYgKGRlc3RfYml0cG9zKSB7CisgICAgbV9EZXN0QnVmLkFwcGVuZEJ5dGUobGFzdF9ieXRlKTsKKyAgfQorICBkZXN0X2J1ZiA9IG1fRGVzdEJ1Zi5HZXRCdWZmZXIoKTsKKyAgZGVzdF9zaXplID0gbV9EZXN0QnVmLkdldFNpemUoKTsKKyAgbV9EZXN0QnVmLkRldGFjaEJ1ZmZlcigpOworfQorRlhfQk9PTCBDQ29kZWNfRmF4TW9kdWxlOjpFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKSB7CisgIENDb2RlY19GYXhFbmNvZGVyIGVuY29kZXIoc3JjX2J1Ziwgd2lkdGgsIGhlaWdodCwgcGl0Y2gpOworICBlbmNvZGVyLkVuY29kZShkZXN0X2J1ZiwgZGVzdF9zaXplKTsKKyAgcmV0dXJuIFRSVUU7Cit9CitJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKiBDQ29kZWNfRmF4TW9kdWxlOjpDcmVhdGVEZWNvZGVyKAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgaW50IHdpZHRoLAorICAgIGludCBoZWlnaHQsCisgICAgaW50IEssCisgICAgRlhfQk9PTCBFbmRPZkxpbmUsCisgICAgRlhfQk9PTCBFbmNvZGVkQnl0ZUFsaWduLAorICAgIEZYX0JPT0wgQmxhY2tJczEsCisgICAgaW50IENvbHVtbnMsCisgICAgaW50IFJvd3MpIHsKKyAgQ0NvZGVjX0ZheERlY29kZXIqIHBEZWNvZGVyID0gbmV3IENDb2RlY19GYXhEZWNvZGVyOworICBwRGVjb2Rlci0+Q3JlYXRlKHNyY19idWYsIHNyY19zaXplLCB3aWR0aCwgaGVpZ2h0LCBLLCBFbmRPZkxpbmUsCisgICAgICAgICAgICAgICAgICAgRW5jb2RlZEJ5dGVBbGlnbiwgQmxhY2tJczEsIENvbHVtbnMsIFJvd3MpOworICByZXR1cm4gcERlY29kZXI7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZsYXRlLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZmxhdGUuY3BwCmluZGV4IDdhMTllOGIuLjE3ZjIwZGEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZmxhdGUuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZmxhdGUuY3BwCkBAIC0xLDkxMyArMSwxMDA1IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi8uLi90aGlyZF9wYXJ0eS9iYXNlL25vbnN0ZF91bmlxdWVfcHRyLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCi0jaW5jbHVkZSAiLi4vLi4vZnhfemxpYi5oIgogI2luY2x1ZGUgImNvZGVjX2ludC5oIgogCi1leHRlcm4gIkMiCi17Ci0gICAgc3RhdGljIHZvaWQqIG15X2FsbG9jX2Z1bmMgKHZvaWQqIG9wYXF1ZSwgdW5zaWduZWQgaW50IGl0ZW1zLCB1bnNpZ25lZCBpbnQgc2l6ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBGWF9BbGxvYzJEKEZYX0JZVEUsIGl0ZW1zLCBzaXplKTsKLSAgICB9Ci0gICAgc3RhdGljIHZvaWQgICBteV9mcmVlX2Z1bmMgICh2b2lkKiBvcGFxdWUsIHZvaWQqIGFkZHJlc3MpCi0gICAgewotICAgICAgICBGWF9GcmVlKGFkZHJlc3MpOwotICAgIH0KLSAgICB2b2lkKiBGUERGQVBJX0ZsYXRlSW5pdCh2b2lkKiAoKmFsbG9jX2Z1bmMpKHZvaWQqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmZyZWVfZnVuYykodm9pZCosIHZvaWQqKSkKLSAgICB7Ci0gICAgICAgIHpfc3RyZWFtKiBwID0gKHpfc3RyZWFtKilhbGxvY19mdW5jKDAsIDEsIHNpemVvZih6X3N0cmVhbSkpOwotICAgICAgICBpZiAocCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBGWFNZU19tZW1zZXQzMihwLCAwLCBzaXplb2Yoel9zdHJlYW0pKTsKLSAgICAgICAgcC0+emFsbG9jID0gYWxsb2NfZnVuYzsKLSAgICAgICAgcC0+emZyZWUgPSBmcmVlX2Z1bmM7Ci0gICAgICAgIGluZmxhdGVJbml0KHApOwotICAgICAgICByZXR1cm4gcDsKLSAgICB9Ci0gICAgdm9pZCBGUERGQVBJX0ZsYXRlSW5wdXQodm9pZCogY29udGV4dCwgY29uc3QgdW5zaWduZWQgY2hhciogc3JjX2J1ZiwgdW5zaWduZWQgaW50IHNyY19zaXplKQotICAgIHsKLSAgICAgICAgKCh6X3N0cmVhbSopY29udGV4dCktPm5leHRfaW4gPSAodW5zaWduZWQgY2hhciopc3JjX2J1ZjsKLSAgICAgICAgKCh6X3N0cmVhbSopY29udGV4dCktPmF2YWlsX2luID0gc3JjX3NpemU7Ci0gICAgfQotICAgIGludCBGUERGQVBJX0ZsYXRlR2V0VG90YWxPdXQodm9pZCogY29udGV4dCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKHpfc3RyZWFtKiljb250ZXh0KS0+dG90YWxfb3V0OwotICAgIH0KLSAgICBpbnQgRlBERkFQSV9GbGF0ZU91dHB1dCh2b2lkKiBjb250ZXh0LCB1bnNpZ25lZCBjaGFyKiBkZXN0X2J1ZiwgdW5zaWduZWQgaW50IGRlc3Rfc2l6ZSkKLSAgICB7Ci0gICAgICAgICgoel9zdHJlYW0qKWNvbnRleHQpLT5uZXh0X291dCA9IGRlc3RfYnVmOwotICAgICAgICAoKHpfc3RyZWFtKiljb250ZXh0KS0+YXZhaWxfb3V0ID0gZGVzdF9zaXplOwotICAgICAgICB1bnNpZ25lZCBpbnQgcHJlX3BvcyA9ICh1bnNpZ25lZCBpbnQpRlBERkFQSV9GbGF0ZUdldFRvdGFsT3V0KGNvbnRleHQpOwotICAgICAgICBpbnQgcmV0ID0gaW5mbGF0ZSgoel9zdHJlYW0qKWNvbnRleHQsIFpfU1lOQ19GTFVTSCk7Ci0gICAgICAgIHVuc2lnbmVkIGludCBwb3N0X3BvcyA9ICh1bnNpZ25lZCBpbnQpRlBERkFQSV9GbGF0ZUdldFRvdGFsT3V0KGNvbnRleHQpOwotICAgICAgICB1bnNpZ25lZCBpbnQgd3JpdHRlbiA9IHBvc3RfcG9zIC0gcHJlX3BvczsKLSAgICAgICAgaWYgKHdyaXR0ZW4gPCBkZXN0X3NpemUpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbXNldDgoZGVzdF9idWYgKyB3cml0dGVuLCAnXDAnLCBkZXN0X3NpemUgLSB3cml0dGVuKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBpbnQgRlBERkFQSV9GbGF0ZUdldFRvdGFsSW4odm9pZCogY29udGV4dCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKHpfc3RyZWFtKiljb250ZXh0KS0+dG90YWxfaW47Ci0gICAgfQotICAgIGludCBGUERGQVBJX0ZsYXRlR2V0QXZhaWxPdXQodm9pZCogY29udGV4dCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKHpfc3RyZWFtKiljb250ZXh0KS0+YXZhaWxfb3V0OwotICAgIH0KLSAgICBpbnQgRlBERkFQSV9GbGF0ZUdldEF2YWlsSW4odm9pZCogY29udGV4dCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKHpfc3RyZWFtKiljb250ZXh0KS0+YXZhaWxfaW47Ci0gICAgfQotICAgIHZvaWQgRlBERkFQSV9GbGF0ZUVuZCh2b2lkKiBjb250ZXh0KQotICAgIHsKLSAgICAgICAgaW5mbGF0ZUVuZCgoel9zdHJlYW0qKWNvbnRleHQpOwotICAgICAgICAoKHpfc3RyZWFtKiljb250ZXh0KS0+emZyZWUoMCwgY29udGV4dCk7Ci0gICAgfQotICAgIHZvaWQgRlBERkFQSV9GbGF0ZUNvbXByZXNzKHVuc2lnbmVkIGNoYXIqIGRlc3RfYnVmLCB1bnNpZ25lZCBsb25nKiBkZXN0X3NpemUsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyY19idWYsIHVuc2lnbmVkIGxvbmcgc3JjX3NpemUpCi0gICAgewotICAgICAgICBjb21wcmVzcyhkZXN0X2J1ZiwgZGVzdF9zaXplLCBzcmNfYnVmLCBzcmNfc2l6ZSk7Ci0gICAgfQorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWNfZmxhdGUuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS96bGliX3YxMjgvemxpYi5oIgorCitleHRlcm4gIkMiIHsKK3N0YXRpYyB2b2lkKiBteV9hbGxvY19mdW5jKHZvaWQqIG9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpdGVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaXplKSB7CisgIHJldHVybiBGWF9BbGxvYzJEKHVpbnQ4X3QsIGl0ZW1zLCBzaXplKTsKIH0KLWNsYXNzIENMWldEZWNvZGVyIAotewotcHVibGljOgotICAgIEZYX0JPT0wgRGVjb2RlKEZYX0xQQllURSBvdXRwdXQsIEZYX0RXT1JEJiBvdXRsZW4sIGNvbnN0IEZYX0JZVEUqIGlucHV0LCBGWF9EV09SRCYgc2l6ZSwgRlhfQk9PTCBiRWFybHlDaGFuZ2UpOwotcHJpdmF0ZToKLSAgICBGWF9EV09SRAltX0luUG9zOwotICAgIEZYX0RXT1JECW1fT3V0UG9zOwotICAgIEZYX0xQQllURQltX3BPdXRwdXQ7Ci0gICAgY29uc3QgRlhfQllURSoJbV9wSW5wdXQ7Ci0gICAgRlhfQk9PTAkJbV9FYXJseTsKLSAgICB2b2lkCQlBZGRDb2RlKEZYX0RXT1JEIHByZWZpeF9jb2RlLCBGWF9CWVRFIGFwcGVuZF9jaGFyKTsKLSAgICBGWF9EV09SRAltX0NvZGVBcnJheVs1MDIxXTsKLSAgICBGWF9EV09SRAltX25Db2RlczsKLSAgICBGWF9CWVRFCQltX0RlY29kZVN0YWNrWzQwMDBdOwotICAgIEZYX0RXT1JECW1fU3RhY2tMZW47Ci0gICAgdm9pZAkJRGVjb2RlU3RyaW5nKEZYX0RXT1JEIGNvZGUpOwotICAgIGludAkJCW1fQ29kZUxlbjsKK3N0YXRpYyB2b2lkIG15X2ZyZWVfZnVuYyh2b2lkKiBvcGFxdWUsIHZvaWQqIGFkZHJlc3MpIHsKKyAgRlhfRnJlZShhZGRyZXNzKTsKK30KK3N0YXRpYyBpbnQgRlBERkFQSV9GbGF0ZUdldFRvdGFsT3V0KHZvaWQqIGNvbnRleHQpIHsKKyAgcmV0dXJuICgoel9zdHJlYW0qKWNvbnRleHQpLT50b3RhbF9vdXQ7Cit9CitzdGF0aWMgaW50IEZQREZBUElfRmxhdGVHZXRUb3RhbEluKHZvaWQqIGNvbnRleHQpIHsKKyAgcmV0dXJuICgoel9zdHJlYW0qKWNvbnRleHQpLT50b3RhbF9pbjsKK30KK3N0YXRpYyB2b2lkIEZQREZBUElfRmxhdGVDb21wcmVzcyh1bnNpZ25lZCBjaGFyKiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nKiBkZXN0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNyY19zaXplKSB7CisgIGNvbXByZXNzKGRlc3RfYnVmLCBkZXN0X3NpemUsIHNyY19idWYsIHNyY19zaXplKTsKK30KK3ZvaWQqIEZQREZBUElfRmxhdGVJbml0KHZvaWQqICgqYWxsb2NfZnVuYykodm9pZCosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpmcmVlX2Z1bmMpKHZvaWQqLCB2b2lkKikpIHsKKyAgel9zdHJlYW0qIHAgPSAoel9zdHJlYW0qKWFsbG9jX2Z1bmMoMCwgMSwgc2l6ZW9mKHpfc3RyZWFtKSk7CisgIGlmICghcCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEZYU1lTX21lbXNldChwLCAwLCBzaXplb2Yoel9zdHJlYW0pKTsKKyAgcC0+emFsbG9jID0gYWxsb2NfZnVuYzsKKyAgcC0+emZyZWUgPSBmcmVlX2Z1bmM7CisgIGluZmxhdGVJbml0KHApOworICByZXR1cm4gcDsKK30KK3ZvaWQgRlBERkFQSV9GbGF0ZUlucHV0KHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNyY19zaXplKSB7CisgICgoel9zdHJlYW0qKWNvbnRleHQpLT5uZXh0X2luID0gKHVuc2lnbmVkIGNoYXIqKXNyY19idWY7CisgICgoel9zdHJlYW0qKWNvbnRleHQpLT5hdmFpbF9pbiA9IHNyY19zaXplOworfQoraW50IEZQREZBUElfRmxhdGVPdXRwdXQodm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlc3Rfc2l6ZSkgeworICAoKHpfc3RyZWFtKiljb250ZXh0KS0+bmV4dF9vdXQgPSBkZXN0X2J1ZjsKKyAgKCh6X3N0cmVhbSopY29udGV4dCktPmF2YWlsX291dCA9IGRlc3Rfc2l6ZTsKKyAgdW5zaWduZWQgaW50IHByZV9wb3MgPSAodW5zaWduZWQgaW50KUZQREZBUElfRmxhdGVHZXRUb3RhbE91dChjb250ZXh0KTsKKyAgaW50IHJldCA9IGluZmxhdGUoKHpfc3RyZWFtKiljb250ZXh0LCBaX1NZTkNfRkxVU0gpOworICB1bnNpZ25lZCBpbnQgcG9zdF9wb3MgPSAodW5zaWduZWQgaW50KUZQREZBUElfRmxhdGVHZXRUb3RhbE91dChjb250ZXh0KTsKKyAgdW5zaWduZWQgaW50IHdyaXR0ZW4gPSBwb3N0X3BvcyAtIHByZV9wb3M7CisgIGlmICh3cml0dGVuIDwgZGVzdF9zaXplKSB7CisgICAgRlhTWVNfbWVtc2V0KGRlc3RfYnVmICsgd3JpdHRlbiwgJ1wwJywgZGVzdF9zaXplIC0gd3JpdHRlbik7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KK2ludCBGUERGQVBJX0ZsYXRlR2V0QXZhaWxJbih2b2lkKiBjb250ZXh0KSB7CisgIHJldHVybiAoKHpfc3RyZWFtKiljb250ZXh0KS0+YXZhaWxfaW47Cit9CitpbnQgRlBERkFQSV9GbGF0ZUdldEF2YWlsT3V0KHZvaWQqIGNvbnRleHQpIHsKKyAgcmV0dXJuICgoel9zdHJlYW0qKWNvbnRleHQpLT5hdmFpbF9vdXQ7Cit9Cit2b2lkIEZQREZBUElfRmxhdGVFbmQodm9pZCogY29udGV4dCkgeworICBpbmZsYXRlRW5kKCh6X3N0cmVhbSopY29udGV4dCk7CisgICgoel9zdHJlYW0qKWNvbnRleHQpLT56ZnJlZSgwLCBjb250ZXh0KTsKK30KK30gIC8vIGV4dGVybiAiQyIKKworbmFtZXNwYWNlIHsKKworY2xhc3MgQ0xaV0RlY29kZXIgeworIHB1YmxpYzoKKyAgaW50IERlY29kZSh1aW50OF90KiBvdXRwdXQsCisgICAgICAgICAgICAgRlhfRFdPUkQmIG91dGxlbiwKKyAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBpbnB1dCwKKyAgICAgICAgICAgICBGWF9EV09SRCYgc2l6ZSwKKyAgICAgICAgICAgICBGWF9CT09MIGJFYXJseUNoYW5nZSk7CisKKyBwcml2YXRlOgorICB2b2lkIEFkZENvZGUoRlhfRFdPUkQgcHJlZml4X2NvZGUsIHVpbnQ4X3QgYXBwZW5kX2NoYXIpOworICB2b2lkIERlY29kZVN0cmluZyhGWF9EV09SRCBjb2RlKTsKKworICBGWF9EV09SRCBtX0luUG9zOworICBGWF9EV09SRCBtX091dFBvczsKKyAgdWludDhfdCogbV9wT3V0cHV0OworICBjb25zdCB1aW50OF90KiBtX3BJbnB1dDsKKyAgRlhfQk9PTCBtX0Vhcmx5OworICBGWF9EV09SRCBtX0NvZGVBcnJheVs1MDIxXTsKKyAgRlhfRFdPUkQgbV9uQ29kZXM7CisgIHVpbnQ4X3QgbV9EZWNvZGVTdGFja1s0MDAwXTsKKyAgRlhfRFdPUkQgbV9TdGFja0xlbjsKKyAgaW50IG1fQ29kZUxlbjsKIH07Ci12b2lkIENMWldEZWNvZGVyOjpBZGRDb2RlKEZYX0RXT1JEIHByZWZpeF9jb2RlLCBGWF9CWVRFIGFwcGVuZF9jaGFyKQotewotICAgIGlmIChtX25Db2RlcyArIG1fRWFybHkgPT0gNDA5NCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fQ29kZUFycmF5W21fbkNvZGVzICsrXSA9IChwcmVmaXhfY29kZSA8PCAxNikgfCBhcHBlbmRfY2hhcjsKLSAgICBpZiAobV9uQ29kZXMgKyBtX0Vhcmx5ID09IDUxMiAtIDI1OCkgewotICAgICAgICBtX0NvZGVMZW4gPSAxMDsKLSAgICB9IGVsc2UgaWYgKG1fbkNvZGVzICsgbV9FYXJseSA9PSAxMDI0IC0gMjU4KSB7Ci0gICAgICAgIG1fQ29kZUxlbiA9IDExOwotICAgIH0gZWxzZSBpZiAobV9uQ29kZXMgKyBtX0Vhcmx5ID09IDIwNDggLSAyNTgpIHsKLSAgICAgICAgbV9Db2RlTGVuID0gMTI7Ci0gICAgfQordm9pZCBDTFpXRGVjb2Rlcjo6QWRkQ29kZShGWF9EV09SRCBwcmVmaXhfY29kZSwgdWludDhfdCBhcHBlbmRfY2hhcikgeworICBpZiAobV9uQ29kZXMgKyBtX0Vhcmx5ID09IDQwOTQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9Db2RlQXJyYXlbbV9uQ29kZXMrK10gPSAocHJlZml4X2NvZGUgPDwgMTYpIHwgYXBwZW5kX2NoYXI7CisgIGlmIChtX25Db2RlcyArIG1fRWFybHkgPT0gNTEyIC0gMjU4KSB7CisgICAgbV9Db2RlTGVuID0gMTA7CisgIH0gZWxzZSBpZiAobV9uQ29kZXMgKyBtX0Vhcmx5ID09IDEwMjQgLSAyNTgpIHsKKyAgICBtX0NvZGVMZW4gPSAxMTsKKyAgfSBlbHNlIGlmIChtX25Db2RlcyArIG1fRWFybHkgPT0gMjA0OCAtIDI1OCkgeworICAgIG1fQ29kZUxlbiA9IDEyOworICB9CiB9Ci12b2lkIENMWldEZWNvZGVyOjpEZWNvZGVTdHJpbmcoRlhfRFdPUkQgY29kZSkKLXsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpbnQgaW5kZXggPSBjb2RlIC0gMjU4OwotICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IChpbnQpbV9uQ29kZXMpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIEZYX0RXT1JEIGRhdGEgPSBtX0NvZGVBcnJheVtpbmRleF07Ci0gICAgICAgIGlmIChtX1N0YWNrTGVuID49IHNpemVvZihtX0RlY29kZVN0YWNrKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1fRGVjb2RlU3RhY2tbbV9TdGFja0xlbisrXSA9IChGWF9CWVRFKWRhdGE7Ci0gICAgICAgIGNvZGUgPSBkYXRhID4+IDE2Owordm9pZCBDTFpXRGVjb2Rlcjo6RGVjb2RlU3RyaW5nKEZYX0RXT1JEIGNvZGUpIHsKKyAgd2hpbGUgKDEpIHsKKyAgICBpbnQgaW5kZXggPSBjb2RlIC0gMjU4OworICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gKGludCltX25Db2RlcykgeworICAgICAgYnJlYWs7CiAgICAgfQorICAgIEZYX0RXT1JEIGRhdGEgPSBtX0NvZGVBcnJheVtpbmRleF07CiAgICAgaWYgKG1fU3RhY2tMZW4gPj0gc2l6ZW9mKG1fRGVjb2RlU3RhY2spKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICAgIHJldHVybjsKICAgICB9Ci0gICAgbV9EZWNvZGVTdGFja1ttX1N0YWNrTGVuKytdID0gKEZYX0JZVEUpY29kZTsKKyAgICBtX0RlY29kZVN0YWNrW21fU3RhY2tMZW4rK10gPSAodWludDhfdClkYXRhOworICAgIGNvZGUgPSBkYXRhID4+IDE2OworICB9CisgIGlmIChtX1N0YWNrTGVuID49IHNpemVvZihtX0RlY29kZVN0YWNrKSkgeworICAgIHJldHVybjsKKyAgfQorICBtX0RlY29kZVN0YWNrW21fU3RhY2tMZW4rK10gPSAodWludDhfdCljb2RlOwogfQotaW50IENMWldEZWNvZGVyOjpEZWNvZGUoRlhfTFBCWVRFIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplLCBjb25zdCBGWF9CWVRFKiBzcmNfYnVmLCBGWF9EV09SRCYgc3JjX3NpemUsIEZYX0JPT0wgYkVhcmx5Q2hhbmdlKQotewotICAgIG1fQ29kZUxlbiA9IDk7Ci0gICAgbV9JblBvcyA9IDA7Ci0gICAgbV9PdXRQb3MgPSAwOwotICAgIG1fcElucHV0ID0gc3JjX2J1ZjsKLSAgICBtX3BPdXRwdXQgPSBkZXN0X2J1ZjsKLSAgICBtX0Vhcmx5ID0gYkVhcmx5Q2hhbmdlID8gMSA6IDA7Ci0gICAgbV9uQ29kZXMgPSAwOwotICAgIEZYX0RXT1JEIG9sZF9jb2RlID0gKEZYX0RXT1JEKSAtIDE7Ci0gICAgRlhfQllURSBsYXN0X2NoYXI7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaWYgKG1fSW5Qb3MgKyBtX0NvZGVMZW4gPiBzcmNfc2l6ZSAqIDgpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGludCBieXRlX3BvcyA9IG1fSW5Qb3MgLyA4OwotICAgICAgICBpbnQgYml0X3BvcyA9IG1fSW5Qb3MgJSA4LCBiaXRfbGVmdCA9IG1fQ29kZUxlbjsKLSAgICAgICAgRlhfRFdPUkQgY29kZSA9IDA7Ci0gICAgICAgIGlmIChiaXRfcG9zKSB7Ci0gICAgICAgICAgICBiaXRfbGVmdCAtPSA4IC0gYml0X3BvczsKLSAgICAgICAgICAgIGNvZGUgPSAobV9wSW5wdXRbYnl0ZV9wb3MrK10gJiAoKDEgPDwgKDggLSBiaXRfcG9zKSkgLSAxKSkgPDwgYml0X2xlZnQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpdF9sZWZ0IDwgOCkgewotICAgICAgICAgICAgY29kZSB8PSBtX3BJbnB1dFtieXRlX3Bvc10gPj4gKDggLSBiaXRfbGVmdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBiaXRfbGVmdCAtPSA4OwotICAgICAgICAgICAgY29kZSB8PSBtX3BJbnB1dFtieXRlX3BvcysrXSA8PCBiaXRfbGVmdDsKLSAgICAgICAgICAgIGlmIChiaXRfbGVmdCkgewotICAgICAgICAgICAgICAgIGNvZGUgfD0gbV9wSW5wdXRbYnl0ZV9wb3NdID4+ICg4IC0gYml0X2xlZnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1fSW5Qb3MgKz0gbV9Db2RlTGVuOwotICAgICAgICBpZiAoY29kZSA8IDI1NikgewotICAgICAgICAgICAgaWYgKG1fT3V0UG9zID09IGRlc3Rfc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiAtNTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX3BPdXRwdXQpIHsKLSAgICAgICAgICAgICAgICBtX3BPdXRwdXRbbV9PdXRQb3NdID0gKEZYX0JZVEUpY29kZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fT3V0UG9zICsrOwotICAgICAgICAgICAgbGFzdF9jaGFyID0gKEZYX0JZVEUpY29kZTsKLSAgICAgICAgICAgIGlmIChvbGRfY29kZSAhPSAoRlhfRFdPUkQpIC0gMSkgewotICAgICAgICAgICAgICAgIEFkZENvZGUob2xkX2NvZGUsIGxhc3RfY2hhcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvbGRfY29kZSA9IGNvZGU7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSAyNTYpIHsKLSAgICAgICAgICAgIG1fQ29kZUxlbiA9IDk7Ci0gICAgICAgICAgICBtX25Db2RlcyA9IDA7Ci0gICAgICAgICAgICBvbGRfY29kZSA9IChGWF9EV09SRCkgLSAxOwotICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gMjU3KSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChvbGRfY29kZSA9PSAoRlhfRFdPUkQpIC0gMSkgewotICAgICAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9TdGFja0xlbiA9IDA7Ci0gICAgICAgICAgICBpZiAoY29kZSA+PSBtX25Db2RlcyArIDI1OCkgewotICAgICAgICAgICAgICAgIGlmIChtX1N0YWNrTGVuIDwgc2l6ZW9mKG1fRGVjb2RlU3RhY2spKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fRGVjb2RlU3RhY2tbbV9TdGFja0xlbisrXSA9IGxhc3RfY2hhcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRGVjb2RlU3RyaW5nKG9sZF9jb2RlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgRGVjb2RlU3RyaW5nKGNvZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1fT3V0UG9zICsgbV9TdGFja0xlbiA+IGRlc3Rfc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiAtNTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX3BPdXRwdXQpIHsKLSAgICAgICAgICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgbV9TdGFja0xlbjsgaSArKykgewotICAgICAgICAgICAgICAgICAgICBtX3BPdXRwdXRbbV9PdXRQb3MgKyBpXSA9IG1fRGVjb2RlU3RhY2tbbV9TdGFja0xlbiAtIGkgLSAxXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX091dFBvcyArPSBtX1N0YWNrTGVuOwotICAgICAgICAgICAgbGFzdF9jaGFyID0gbV9EZWNvZGVTdGFja1ttX1N0YWNrTGVuIC0gMV07Ci0gICAgICAgICAgICBpZiAob2xkX2NvZGUgPCAyNTYpIHsKLSAgICAgICAgICAgICAgICBBZGRDb2RlKG9sZF9jb2RlLCBsYXN0X2NoYXIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChvbGRfY29kZSAtIDI1OCA+PSBtX25Db2RlcykgewotICAgICAgICAgICAgICAgIGRlc3Rfc2l6ZSA9IG1fT3V0UG9zOwotICAgICAgICAgICAgICAgIHNyY19zaXplID0gKG1fSW5Qb3MgKyA3KSAvIDg7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFkZENvZGUob2xkX2NvZGUsIGxhc3RfY2hhcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvbGRfY29kZSA9IGNvZGU7Ci0gICAgICAgIH0KK2ludCBDTFpXRGVjb2Rlcjo6RGVjb2RlKHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJFYXJseUNoYW5nZSkgeworICBtX0NvZGVMZW4gPSA5OworICBtX0luUG9zID0gMDsKKyAgbV9PdXRQb3MgPSAwOworICBtX3BJbnB1dCA9IHNyY19idWY7CisgIG1fcE91dHB1dCA9IGRlc3RfYnVmOworICBtX0Vhcmx5ID0gYkVhcmx5Q2hhbmdlID8gMSA6IDA7CisgIG1fbkNvZGVzID0gMDsKKyAgRlhfRFdPUkQgb2xkX2NvZGUgPSAoRlhfRFdPUkQpLTE7CisgIHVpbnQ4X3QgbGFzdF9jaGFyOworICB3aGlsZSAoMSkgeworICAgIGlmIChtX0luUG9zICsgbV9Db2RlTGVuID4gc3JjX3NpemUgKiA4KSB7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgZGVzdF9zaXplID0gbV9PdXRQb3M7Ci0gICAgc3JjX3NpemUgPSAobV9JblBvcyArIDcpIC8gODsKLSAgICByZXR1cm4gMDsKKyAgICBpbnQgYnl0ZV9wb3MgPSBtX0luUG9zIC8gODsKKyAgICBpbnQgYml0X3BvcyA9IG1fSW5Qb3MgJSA4LCBiaXRfbGVmdCA9IG1fQ29kZUxlbjsKKyAgICBGWF9EV09SRCBjb2RlID0gMDsKKyAgICBpZiAoYml0X3BvcykgeworICAgICAgYml0X2xlZnQgLT0gOCAtIGJpdF9wb3M7CisgICAgICBjb2RlID0gKG1fcElucHV0W2J5dGVfcG9zKytdICYgKCgxIDw8ICg4IC0gYml0X3BvcykpIC0gMSkpIDw8IGJpdF9sZWZ0OworICAgIH0KKyAgICBpZiAoYml0X2xlZnQgPCA4KSB7CisgICAgICBjb2RlIHw9IG1fcElucHV0W2J5dGVfcG9zXSA+PiAoOCAtIGJpdF9sZWZ0KTsKKyAgICB9IGVsc2UgeworICAgICAgYml0X2xlZnQgLT0gODsKKyAgICAgIGNvZGUgfD0gbV9wSW5wdXRbYnl0ZV9wb3MrK10gPDwgYml0X2xlZnQ7CisgICAgICBpZiAoYml0X2xlZnQpIHsKKyAgICAgICAgY29kZSB8PSBtX3BJbnB1dFtieXRlX3Bvc10gPj4gKDggLSBiaXRfbGVmdCk7CisgICAgICB9CisgICAgfQorICAgIG1fSW5Qb3MgKz0gbV9Db2RlTGVuOworICAgIGlmIChjb2RlIDwgMjU2KSB7CisgICAgICBpZiAobV9PdXRQb3MgPT0gZGVzdF9zaXplKSB7CisgICAgICAgIHJldHVybiAtNTsKKyAgICAgIH0KKyAgICAgIGlmIChtX3BPdXRwdXQpIHsKKyAgICAgICAgbV9wT3V0cHV0W21fT3V0UG9zXSA9ICh1aW50OF90KWNvZGU7CisgICAgICB9CisgICAgICBtX091dFBvcysrOworICAgICAgbGFzdF9jaGFyID0gKHVpbnQ4X3QpY29kZTsKKyAgICAgIGlmIChvbGRfY29kZSAhPSAoRlhfRFdPUkQpLTEpIHsKKyAgICAgICAgQWRkQ29kZShvbGRfY29kZSwgbGFzdF9jaGFyKTsKKyAgICAgIH0KKyAgICAgIG9sZF9jb2RlID0gY29kZTsKKyAgICB9IGVsc2UgaWYgKGNvZGUgPT0gMjU2KSB7CisgICAgICBtX0NvZGVMZW4gPSA5OworICAgICAgbV9uQ29kZXMgPSAwOworICAgICAgb2xkX2NvZGUgPSAoRlhfRFdPUkQpLTE7CisgICAgfSBlbHNlIGlmIChjb2RlID09IDI1NykgeworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChvbGRfY29kZSA9PSAoRlhfRFdPUkQpLTEpIHsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgICB9CisgICAgICBtX1N0YWNrTGVuID0gMDsKKyAgICAgIGlmIChjb2RlID49IG1fbkNvZGVzICsgMjU4KSB7CisgICAgICAgIGlmIChtX1N0YWNrTGVuIDwgc2l6ZW9mKG1fRGVjb2RlU3RhY2spKSB7CisgICAgICAgICAgbV9EZWNvZGVTdGFja1ttX1N0YWNrTGVuKytdID0gbGFzdF9jaGFyOworICAgICAgICB9CisgICAgICAgIERlY29kZVN0cmluZyhvbGRfY29kZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBEZWNvZGVTdHJpbmcoY29kZSk7CisgICAgICB9CisgICAgICBpZiAobV9PdXRQb3MgKyBtX1N0YWNrTGVuID4gZGVzdF9zaXplKSB7CisgICAgICAgIHJldHVybiAtNTsKKyAgICAgIH0KKyAgICAgIGlmIChtX3BPdXRwdXQpIHsKKyAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG1fU3RhY2tMZW47IGkrKykgeworICAgICAgICAgIG1fcE91dHB1dFttX091dFBvcyArIGldID0gbV9EZWNvZGVTdGFja1ttX1N0YWNrTGVuIC0gaSAtIDFdOworICAgICAgICB9CisgICAgICB9CisgICAgICBtX091dFBvcyArPSBtX1N0YWNrTGVuOworICAgICAgbGFzdF9jaGFyID0gbV9EZWNvZGVTdGFja1ttX1N0YWNrTGVuIC0gMV07CisgICAgICBpZiAob2xkX2NvZGUgPCAyNTYpIHsKKyAgICAgICAgQWRkQ29kZShvbGRfY29kZSwgbGFzdF9jaGFyKTsKKyAgICAgIH0gZWxzZSBpZiAob2xkX2NvZGUgLSAyNTggPj0gbV9uQ29kZXMpIHsKKyAgICAgICAgZGVzdF9zaXplID0gbV9PdXRQb3M7CisgICAgICAgIHNyY19zaXplID0gKG1fSW5Qb3MgKyA3KSAvIDg7CisgICAgICAgIHJldHVybiAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQWRkQ29kZShvbGRfY29kZSwgbGFzdF9jaGFyKTsKKyAgICAgIH0KKyAgICAgIG9sZF9jb2RlID0gY29kZTsKKyAgICB9CisgIH0KKyAgZGVzdF9zaXplID0gbV9PdXRQb3M7CisgIHNyY19zaXplID0gKG1fSW5Qb3MgKyA3KSAvIDg7CisgIHJldHVybiAwOwogfQotc3RhdGljIEZYX0JZVEUgUGFldGhQcmVkaWN0b3IoaW50IGEsIGludCBiLCBpbnQgYykKLXsKLSAgICBpbnQgcCA9IGEgKyBiIC0gYzsKLSAgICBpbnQgcGEgPSBGWFNZU19hYnMocCAtIGEpOwotICAgIGludCBwYiA9IEZYU1lTX2FicyhwIC0gYik7Ci0gICAgaW50IHBjID0gRlhTWVNfYWJzKHAgLSBjKTsKLSAgICBpZiAocGEgPD0gcGIgJiYgcGEgPD0gcGMpIHsKLSAgICAgICAgcmV0dXJuIChGWF9CWVRFKWE7Ci0gICAgfQotICAgIGlmIChwYiA8PSBwYykgewotICAgICAgICByZXR1cm4gKEZYX0JZVEUpYjsKLSAgICB9Ci0gICAgcmV0dXJuIChGWF9CWVRFKWM7CisKK3VpbnQ4X3QgUGFldGhQcmVkaWN0b3IoaW50IGEsIGludCBiLCBpbnQgYykgeworICBpbnQgcCA9IGEgKyBiIC0gYzsKKyAgaW50IHBhID0gRlhTWVNfYWJzKHAgLSBhKTsKKyAgaW50IHBiID0gRlhTWVNfYWJzKHAgLSBiKTsKKyAgaW50IHBjID0gRlhTWVNfYWJzKHAgLSBjKTsKKyAgaWYgKHBhIDw9IHBiICYmIHBhIDw9IHBjKSB7CisgICAgcmV0dXJuICh1aW50OF90KWE7CisgIH0KKyAgaWYgKHBiIDw9IHBjKSB7CisgICAgcmV0dXJuICh1aW50OF90KWI7CisgIH0KKyAgcmV0dXJuICh1aW50OF90KWM7CiB9Ci1zdGF0aWMgRlhfQk9PTCBQTkdfUHJlZGljdG9yRW5jb2RlKEZYX0xQQllURSYgZGF0YV9idWYsIEZYX0RXT1JEJiBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVkaWN0b3IsIGludCBDb2xvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucykKLXsKLSAgICBjb25zdCBpbnQgQnl0ZXNQZXJQaXhlbCA9IChDb2xvcnMgKiBCaXRzUGVyQ29tcG9uZW50ICsgNykgLyA4OwotICAgIGNvbnN0IGludCByb3dfc2l6ZSA9IChDb2xvcnMgKiBCaXRzUGVyQ29tcG9uZW50ICogQ29sdW1ucyArIDcpIC8gODsKLSAgICBpZiAocm93X3NpemUgPD0gMCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIGNvbnN0IGludCByb3dfY291bnQgPSAoZGF0YV9zaXplICsgcm93X3NpemUgLSAxKSAvIHJvd19zaXplOwotICAgIGNvbnN0IGludCBsYXN0X3Jvd19zaXplID0gZGF0YV9zaXplICUgcm93X3NpemU7Ci0gICAgRlhfTFBCWVRFIGRlc3RfYnVmID0gRlhfQWxsb2MyRChGWF9CWVRFLCByb3dfc2l6ZSArIDEsIHJvd19jb3VudCk7Ci0gICAgaW50IGJ5dGVfY250ID0gMDsKLSAgICBGWF9MUEJZVEUgcFNyY0RhdGEgPSBkYXRhX2J1ZjsKLSAgICBGWF9MUEJZVEUgcERlc3REYXRhID0gZGVzdF9idWY7Ci0gICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgcm93X2NvdW50OyByb3crKykgewotICAgICAgICBpZiAocHJlZGljdG9yID09IDEwKSB7Ci0gICAgICAgICAgICBwRGVzdERhdGFbMF0gPSAwOwotICAgICAgICAgICAgaW50IG1vdmVfc2l6ZSA9IHJvd19zaXplOwotICAgICAgICAgICAgaWYgKG1vdmVfc2l6ZSAqIChyb3cgKyAxKSA+IChpbnQpZGF0YV9zaXplKSB7Ci0gICAgICAgICAgICAgICAgbW92ZV9zaXplID0gZGF0YV9zaXplIC0gKG1vdmVfc2l6ZSAqIHJvdyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWFNZU19tZW1tb3ZlMzIocERlc3REYXRhICsgMSwgcFNyY0RhdGEsIG1vdmVfc2l6ZSk7Ci0gICAgICAgICAgICBwRGVzdERhdGEgKz0gKG1vdmVfc2l6ZSArIDEpOwotICAgICAgICAgICAgcFNyY0RhdGEgKz0gbW92ZV9zaXplOwotICAgICAgICAgICAgYnl0ZV9jbnQgKz0gbW92ZV9zaXplOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgYnl0ZSA9IDA7IGJ5dGUgPCByb3dfc2l6ZSAmJiBieXRlX2NudCA8IChpbnQpZGF0YV9zaXplOyBieXRlKyspIHsKLSAgICAgICAgICAgIHN3aXRjaCAocHJlZGljdG9yKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogewotICAgICAgICAgICAgICAgICAgICAgICAgcERlc3REYXRhWzBdID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA+PSBCeXRlc1BlclBpeGVsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHBTcmNEYXRhW2J5dGUgLSBCeXRlc1BlclBpeGVsXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0RGF0YVtieXRlICsgMV0gPSBwU3JjRGF0YVtieXRlXSAtIGxlZnQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogewotICAgICAgICAgICAgICAgICAgICAgICAgcERlc3REYXRhWzBdID0gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgdXAgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwID0gcFNyY0RhdGFbYnl0ZSAtIHJvd19zaXplXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0RGF0YVtieXRlICsgMV0gPSBwU3JjRGF0YVtieXRlXSAtIHVwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0RGF0YVswXSA9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGxlZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPj0gQnl0ZXNQZXJQaXhlbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBwU3JjRGF0YVtieXRlIC0gQnl0ZXNQZXJQaXhlbF07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIHVwID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3cpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cCA9IHBTcmNEYXRhW2J5dGUgLSByb3dfc2l6ZV07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRGVzdERhdGFbYnl0ZSArIDFdID0gcFNyY0RhdGFbYnl0ZV0gLSAobGVmdCArIHVwKSAvIDI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogewotICAgICAgICAgICAgICAgICAgICAgICAgcERlc3REYXRhWzBdID0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA+PSBCeXRlc1BlclBpeGVsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHBTcmNEYXRhW2J5dGUgLSBCeXRlc1BlclBpeGVsXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgdXAgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwID0gcFNyY0RhdGFbYnl0ZSAtIHJvd19zaXplXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgdXBwZXJfbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA+PSBCeXRlc1BlclBpeGVsICYmIHJvdykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyX2xlZnQgPSBwU3JjRGF0YVtieXRlIC0gcm93X3NpemUgLSBCeXRlc1BlclBpeGVsXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0RGF0YVtieXRlICsgMV0gPSBwU3JjRGF0YVtieXRlXSAtIFBhZXRoUHJlZGljdG9yKGxlZnQsIHVwLCB1cHBlcl9sZWZ0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRGVzdERhdGFbYnl0ZSArIDFdID0gcFNyY0RhdGFbYnl0ZV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBieXRlX2NudCsrOwotICAgICAgICB9Ci0gICAgICAgIHBEZXN0RGF0YSArPSAocm93X3NpemUgKyAxKTsKLSAgICAgICAgcFNyY0RhdGEgKz0gcm93X3NpemU7CisKK0ZYX0JPT0wgUE5HX1ByZWRpY3RvckVuY29kZSh1aW50OF90KiYgZGF0YV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZGljdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2xvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJpdHNQZXJDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbHVtbnMpIHsKKyAgY29uc3QgaW50IEJ5dGVzUGVyUGl4ZWwgPSAoQ29sb3JzICogQml0c1BlckNvbXBvbmVudCArIDcpIC8gODsKKyAgY29uc3QgaW50IHJvd19zaXplID0gKENvbG9ycyAqIEJpdHNQZXJDb21wb25lbnQgKiBDb2x1bW5zICsgNykgLyA4OworICBpZiAocm93X3NpemUgPD0gMCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGNvbnN0IGludCByb3dfY291bnQgPSAoZGF0YV9zaXplICsgcm93X3NpemUgLSAxKSAvIHJvd19zaXplOworICBjb25zdCBpbnQgbGFzdF9yb3dfc2l6ZSA9IGRhdGFfc2l6ZSAlIHJvd19zaXplOworICB1aW50OF90KiBkZXN0X2J1ZiA9IEZYX0FsbG9jMkQodWludDhfdCwgcm93X3NpemUgKyAxLCByb3dfY291bnQpOworICBpbnQgYnl0ZV9jbnQgPSAwOworICB1aW50OF90KiBwU3JjRGF0YSA9IGRhdGFfYnVmOworICB1aW50OF90KiBwRGVzdERhdGEgPSBkZXN0X2J1ZjsKKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgcm93X2NvdW50OyByb3crKykgeworICAgIGlmIChwcmVkaWN0b3IgPT0gMTApIHsKKyAgICAgIHBEZXN0RGF0YVswXSA9IDA7CisgICAgICBpbnQgbW92ZV9zaXplID0gcm93X3NpemU7CisgICAgICBpZiAobW92ZV9zaXplICogKHJvdyArIDEpID4gKGludClkYXRhX3NpemUpIHsKKyAgICAgICAgbW92ZV9zaXplID0gZGF0YV9zaXplIC0gKG1vdmVfc2l6ZSAqIHJvdyk7CisgICAgICB9CisgICAgICBGWFNZU19tZW1tb3ZlKHBEZXN0RGF0YSArIDEsIHBTcmNEYXRhLCBtb3ZlX3NpemUpOworICAgICAgcERlc3REYXRhICs9IChtb3ZlX3NpemUgKyAxKTsKKyAgICAgIHBTcmNEYXRhICs9IG1vdmVfc2l6ZTsKKyAgICAgIGJ5dGVfY250ICs9IG1vdmVfc2l6ZTsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBGWF9GcmVlKGRhdGFfYnVmKTsKLSAgICBkYXRhX2J1ZiA9IGRlc3RfYnVmOwotICAgIGRhdGFfc2l6ZSA9IChyb3dfc2l6ZSArIDEpICogcm93X2NvdW50IC0gKGxhc3Rfcm93X3NpemUgPiAwID8gKHJvd19zaXplIC0gbGFzdF9yb3dfc2l6ZSkgOiAwKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICBmb3IgKGludCBieXRlID0gMDsgYnl0ZSA8IHJvd19zaXplICYmIGJ5dGVfY250IDwgKGludClkYXRhX3NpemU7IGJ5dGUrKykgeworICAgICAgc3dpdGNoIChwcmVkaWN0b3IpIHsKKyAgICAgICAgY2FzZSAxMTogeworICAgICAgICAgIHBEZXN0RGF0YVswXSA9IDE7CisgICAgICAgICAgdWludDhfdCBsZWZ0ID0gMDsKKyAgICAgICAgICBpZiAoYnl0ZSA+PSBCeXRlc1BlclBpeGVsKSB7CisgICAgICAgICAgICBsZWZ0ID0gcFNyY0RhdGFbYnl0ZSAtIEJ5dGVzUGVyUGl4ZWxdOworICAgICAgICAgIH0KKyAgICAgICAgICBwRGVzdERhdGFbYnl0ZSArIDFdID0gcFNyY0RhdGFbYnl0ZV0gLSBsZWZ0OworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIDEyOiB7CisgICAgICAgICAgcERlc3REYXRhWzBdID0gMjsKKyAgICAgICAgICB1aW50OF90IHVwID0gMDsKKyAgICAgICAgICBpZiAocm93KSB7CisgICAgICAgICAgICB1cCA9IHBTcmNEYXRhW2J5dGUgLSByb3dfc2l6ZV07CisgICAgICAgICAgfQorICAgICAgICAgIHBEZXN0RGF0YVtieXRlICsgMV0gPSBwU3JjRGF0YVtieXRlXSAtIHVwOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIDEzOiB7CisgICAgICAgICAgcERlc3REYXRhWzBdID0gMzsKKyAgICAgICAgICB1aW50OF90IGxlZnQgPSAwOworICAgICAgICAgIGlmIChieXRlID49IEJ5dGVzUGVyUGl4ZWwpIHsKKyAgICAgICAgICAgIGxlZnQgPSBwU3JjRGF0YVtieXRlIC0gQnl0ZXNQZXJQaXhlbF07CisgICAgICAgICAgfQorICAgICAgICAgIHVpbnQ4X3QgdXAgPSAwOworICAgICAgICAgIGlmIChyb3cpIHsKKyAgICAgICAgICAgIHVwID0gcFNyY0RhdGFbYnl0ZSAtIHJvd19zaXplXTsKKyAgICAgICAgICB9CisgICAgICAgICAgcERlc3REYXRhW2J5dGUgKyAxXSA9IHBTcmNEYXRhW2J5dGVdIC0gKGxlZnQgKyB1cCkgLyAyOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIDE0OiB7CisgICAgICAgICAgcERlc3REYXRhWzBdID0gNDsKKyAgICAgICAgICB1aW50OF90IGxlZnQgPSAwOworICAgICAgICAgIGlmIChieXRlID49IEJ5dGVzUGVyUGl4ZWwpIHsKKyAgICAgICAgICAgIGxlZnQgPSBwU3JjRGF0YVtieXRlIC0gQnl0ZXNQZXJQaXhlbF07CisgICAgICAgICAgfQorICAgICAgICAgIHVpbnQ4X3QgdXAgPSAwOworICAgICAgICAgIGlmIChyb3cpIHsKKyAgICAgICAgICAgIHVwID0gcFNyY0RhdGFbYnl0ZSAtIHJvd19zaXplXTsKKyAgICAgICAgICB9CisgICAgICAgICAgdWludDhfdCB1cHBlcl9sZWZ0ID0gMDsKKyAgICAgICAgICBpZiAoYnl0ZSA+PSBCeXRlc1BlclBpeGVsICYmIHJvdykgeworICAgICAgICAgICAgdXBwZXJfbGVmdCA9IHBTcmNEYXRhW2J5dGUgLSByb3dfc2l6ZSAtIEJ5dGVzUGVyUGl4ZWxdOworICAgICAgICAgIH0KKyAgICAgICAgICBwRGVzdERhdGFbYnl0ZSArIDFdID0KKyAgICAgICAgICAgICAgcFNyY0RhdGFbYnl0ZV0gLSBQYWV0aFByZWRpY3RvcihsZWZ0LCB1cCwgdXBwZXJfbGVmdCk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHsgcERlc3REYXRhW2J5dGUgKyAxXSA9IHBTcmNEYXRhW2J5dGVdOyB9IGJyZWFrOworICAgICAgfQorICAgICAgYnl0ZV9jbnQrKzsKKyAgICB9CisgICAgcERlc3REYXRhICs9IChyb3dfc2l6ZSArIDEpOworICAgIHBTcmNEYXRhICs9IHJvd19zaXplOworICB9CisgIEZYX0ZyZWUoZGF0YV9idWYpOworICBkYXRhX2J1ZiA9IGRlc3RfYnVmOworICBkYXRhX3NpemUgPSAocm93X3NpemUgKyAxKSAqIHJvd19jb3VudCAtCisgICAgICAgICAgICAgIChsYXN0X3Jvd19zaXplID4gMCA/IChyb3dfc2l6ZSAtIGxhc3Rfcm93X3NpemUpIDogMCk7CisgIHJldHVybiBUUlVFOwogfQotc3RhdGljIHZvaWQgUE5HX1ByZWRpY3RMaW5lKEZYX0xQQllURSBwRGVzdERhdGEsIEZYX0xQQ0JZVEUgcFNyY0RhdGEsIEZYX0xQQ0JZVEUgcExhc3RMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBicGMsIGludCBuQ29sb3JzLCBpbnQgblBpeGVscykKLXsKLSAgICBpbnQgcm93X3NpemUgPSAoblBpeGVscyAqIGJwYyAqIG5Db2xvcnMgKyA3KSAvIDg7Ci0gICAgaW50IEJ5dGVzUGVyUGl4ZWwgPSAoYnBjICogbkNvbG9ycyArIDcpIC8gODsKLSAgICBGWF9CWVRFIHRhZyA9IHBTcmNEYXRhWzBdOworCit2b2lkIFBOR19QcmVkaWN0TGluZSh1aW50OF90KiBwRGVzdERhdGEsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwU3JjRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBMYXN0TGluZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBicGMsCisgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbG9ycywKKyAgICAgICAgICAgICAgICAgICAgIGludCBuUGl4ZWxzKSB7CisgIGludCByb3dfc2l6ZSA9IChuUGl4ZWxzICogYnBjICogbkNvbG9ycyArIDcpIC8gODsKKyAgaW50IEJ5dGVzUGVyUGl4ZWwgPSAoYnBjICogbkNvbG9ycyArIDcpIC8gODsKKyAgdWludDhfdCB0YWcgPSBwU3JjRGF0YVswXTsKKyAgaWYgKHRhZyA9PSAwKSB7CisgICAgRlhTWVNfbWVtbW92ZShwRGVzdERhdGEsIHBTcmNEYXRhICsgMSwgcm93X3NpemUpOworICAgIHJldHVybjsKKyAgfQorICBmb3IgKGludCBieXRlID0gMDsgYnl0ZSA8IHJvd19zaXplOyBieXRlKyspIHsKKyAgICB1aW50OF90IHJhd19ieXRlID0gcFNyY0RhdGFbYnl0ZSArIDFdOworICAgIHN3aXRjaCAodGFnKSB7CisgICAgICBjYXNlIDE6IHsKKyAgICAgICAgdWludDhfdCBsZWZ0ID0gMDsKKyAgICAgICAgaWYgKGJ5dGUgPj0gQnl0ZXNQZXJQaXhlbCkgeworICAgICAgICAgIGxlZnQgPSBwRGVzdERhdGFbYnl0ZSAtIEJ5dGVzUGVyUGl4ZWxdOworICAgICAgICB9CisgICAgICAgIHBEZXN0RGF0YVtieXRlXSA9IHJhd19ieXRlICsgbGVmdDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIDI6IHsKKyAgICAgICAgdWludDhfdCB1cCA9IDA7CisgICAgICAgIGlmIChwTGFzdExpbmUpIHsKKyAgICAgICAgICB1cCA9IHBMYXN0TGluZVtieXRlXTsKKyAgICAgICAgfQorICAgICAgICBwRGVzdERhdGFbYnl0ZV0gPSByYXdfYnl0ZSArIHVwOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgMzogeworICAgICAgICB1aW50OF90IGxlZnQgPSAwOworICAgICAgICBpZiAoYnl0ZSA+PSBCeXRlc1BlclBpeGVsKSB7CisgICAgICAgICAgbGVmdCA9IHBEZXN0RGF0YVtieXRlIC0gQnl0ZXNQZXJQaXhlbF07CisgICAgICAgIH0KKyAgICAgICAgdWludDhfdCB1cCA9IDA7CisgICAgICAgIGlmIChwTGFzdExpbmUpIHsKKyAgICAgICAgICB1cCA9IHBMYXN0TGluZVtieXRlXTsKKyAgICAgICAgfQorICAgICAgICBwRGVzdERhdGFbYnl0ZV0gPSByYXdfYnl0ZSArICh1cCArIGxlZnQpIC8gMjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIDQ6IHsKKyAgICAgICAgdWludDhfdCBsZWZ0ID0gMDsKKyAgICAgICAgaWYgKGJ5dGUgPj0gQnl0ZXNQZXJQaXhlbCkgeworICAgICAgICAgIGxlZnQgPSBwRGVzdERhdGFbYnl0ZSAtIEJ5dGVzUGVyUGl4ZWxdOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3QgdXAgPSAwOworICAgICAgICBpZiAocExhc3RMaW5lKSB7CisgICAgICAgICAgdXAgPSBwTGFzdExpbmVbYnl0ZV07CisgICAgICAgIH0KKyAgICAgICAgdWludDhfdCB1cHBlcl9sZWZ0ID0gMDsKKyAgICAgICAgaWYgKGJ5dGUgPj0gQnl0ZXNQZXJQaXhlbCAmJiBwTGFzdExpbmUpIHsKKyAgICAgICAgICB1cHBlcl9sZWZ0ID0gcExhc3RMaW5lW2J5dGUgLSBCeXRlc1BlclBpeGVsXTsKKyAgICAgICAgfQorICAgICAgICBwRGVzdERhdGFbYnl0ZV0gPSByYXdfYnl0ZSArIFBhZXRoUHJlZGljdG9yKGxlZnQsIHVwLCB1cHBlcl9sZWZ0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBwRGVzdERhdGFbYnl0ZV0gPSByYXdfYnl0ZTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK0ZYX0JPT0wgUE5HX1ByZWRpY3Rvcih1aW50OF90KiYgZGF0YV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sb3JzLAorICAgICAgICAgICAgICAgICAgICAgIGludCBCaXRzUGVyQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgIGludCBDb2x1bW5zKSB7CisgIGNvbnN0IGludCBCeXRlc1BlclBpeGVsID0gKENvbG9ycyAqIEJpdHNQZXJDb21wb25lbnQgKyA3KSAvIDg7CisgIGNvbnN0IGludCByb3dfc2l6ZSA9IChDb2xvcnMgKiBCaXRzUGVyQ29tcG9uZW50ICogQ29sdW1ucyArIDcpIC8gODsKKyAgaWYgKHJvd19zaXplIDw9IDApCisgICAgcmV0dXJuIEZBTFNFOworICBjb25zdCBpbnQgcm93X2NvdW50ID0gKGRhdGFfc2l6ZSArIHJvd19zaXplKSAvIChyb3dfc2l6ZSArIDEpOworICBpZiAocm93X2NvdW50IDw9IDApCisgICAgcmV0dXJuIEZBTFNFOworICBjb25zdCBpbnQgbGFzdF9yb3dfc2l6ZSA9IGRhdGFfc2l6ZSAlIChyb3dfc2l6ZSArIDEpOworICB1aW50OF90KiBkZXN0X2J1ZiA9IEZYX0FsbG9jMkQodWludDhfdCwgcm93X3NpemUsIHJvd19jb3VudCk7CisgIGludCBieXRlX2NudCA9IDA7CisgIHVpbnQ4X3QqIHBTcmNEYXRhID0gZGF0YV9idWY7CisgIHVpbnQ4X3QqIHBEZXN0RGF0YSA9IGRlc3RfYnVmOworICBmb3IgKGludCByb3cgPSAwOyByb3cgPCByb3dfY291bnQ7IHJvdysrKSB7CisgICAgdWludDhfdCB0YWcgPSBwU3JjRGF0YVswXTsKKyAgICBieXRlX2NudCsrOwogICAgIGlmICh0YWcgPT0gMCkgewotICAgICAgICBGWFNZU19tZW1tb3ZlMzIocERlc3REYXRhLCBwU3JjRGF0YSArIDEsIHJvd19zaXplKTsKLSAgICAgICAgcmV0dXJuOworICAgICAgaW50IG1vdmVfc2l6ZSA9IHJvd19zaXplOworICAgICAgaWYgKChyb3cgKyAxKSAqIChtb3ZlX3NpemUgKyAxKSA+IChpbnQpZGF0YV9zaXplKSB7CisgICAgICAgIG1vdmVfc2l6ZSA9IGxhc3Rfcm93X3NpemUgLSAxOworICAgICAgfQorICAgICAgRlhTWVNfbWVtbW92ZShwRGVzdERhdGEsIHBTcmNEYXRhICsgMSwgbW92ZV9zaXplKTsKKyAgICAgIHBTcmNEYXRhICs9IG1vdmVfc2l6ZSArIDE7CisgICAgICBwRGVzdERhdGEgKz0gbW92ZV9zaXplOworICAgICAgYnl0ZV9jbnQgKz0gbW92ZV9zaXplOworICAgICAgY29udGludWU7CiAgICAgfQotICAgIGZvciAoaW50IGJ5dGUgPSAwOyBieXRlIDwgcm93X3NpemU7IGJ5dGUgKyspIHsKLSAgICAgICAgRlhfQllURSByYXdfYnl0ZSA9IHBTcmNEYXRhW2J5dGUgKyAxXTsKLSAgICAgICAgc3dpdGNoICh0YWcpIHsKLSAgICAgICAgICAgIGNhc2UgMToJewotICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGxlZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA+PSBCeXRlc1BlclBpeGVsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gcERlc3REYXRhW2J5dGUgLSBCeXRlc1BlclBpeGVsXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwRGVzdERhdGFbYnl0ZV0gPSByYXdfYnl0ZSArIGxlZnQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgMjogewotICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIHVwID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBMYXN0TGluZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXAgPSBwTGFzdExpbmVbYnl0ZV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcERlc3REYXRhW2J5dGVdID0gcmF3X2J5dGUgKyB1cDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAzOiB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChieXRlID49IEJ5dGVzUGVyUGl4ZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBwRGVzdERhdGFbYnl0ZSAtIEJ5dGVzUGVyUGl4ZWxdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgdXAgPSAwOwotICAgICAgICAgICAgICAgICAgICBpZiAocExhc3RMaW5lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCA9IHBMYXN0TGluZVtieXRlXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwRGVzdERhdGFbYnl0ZV0gPSByYXdfYnl0ZSArICh1cCArIGxlZnQpIC8gMjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSA0OiB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChieXRlID49IEJ5dGVzUGVyUGl4ZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBwRGVzdERhdGFbYnl0ZSAtIEJ5dGVzUGVyUGl4ZWxdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgdXAgPSAwOwotICAgICAgICAgICAgICAgICAgICBpZiAocExhc3RMaW5lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cCA9IHBMYXN0TGluZVtieXRlXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIHVwcGVyX2xlZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA+PSBCeXRlc1BlclBpeGVsICYmIHBMYXN0TGluZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJfbGVmdCA9IHBMYXN0TGluZVtieXRlIC0gQnl0ZXNQZXJQaXhlbF07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcERlc3REYXRhW2J5dGVdID0gcmF3X2J5dGUgKyBQYWV0aFByZWRpY3RvcihsZWZ0LCB1cCwgdXBwZXJfbGVmdCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcERlc3REYXRhW2J5dGVdID0gcmF3X2J5dGU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgZm9yIChpbnQgYnl0ZSA9IDA7IGJ5dGUgPCByb3dfc2l6ZSAmJiBieXRlX2NudCA8IChpbnQpZGF0YV9zaXplOyBieXRlKyspIHsKKyAgICAgIHVpbnQ4X3QgcmF3X2J5dGUgPSBwU3JjRGF0YVtieXRlICsgMV07CisgICAgICBzd2l0Y2ggKHRhZykgeworICAgICAgICBjYXNlIDE6IHsKKyAgICAgICAgICB1aW50OF90IGxlZnQgPSAwOworICAgICAgICAgIGlmIChieXRlID49IEJ5dGVzUGVyUGl4ZWwpIHsKKyAgICAgICAgICAgIGxlZnQgPSBwRGVzdERhdGFbYnl0ZSAtIEJ5dGVzUGVyUGl4ZWxdOworICAgICAgICAgIH0KKyAgICAgICAgICBwRGVzdERhdGFbYnl0ZV0gPSByYXdfYnl0ZSArIGxlZnQ7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KKyAgICAgICAgY2FzZSAyOiB7CisgICAgICAgICAgdWludDhfdCB1cCA9IDA7CisgICAgICAgICAgaWYgKHJvdykgeworICAgICAgICAgICAgdXAgPSBwRGVzdERhdGFbYnl0ZSAtIHJvd19zaXplXTsKKyAgICAgICAgICB9CisgICAgICAgICAgcERlc3REYXRhW2J5dGVdID0gcmF3X2J5dGUgKyB1cDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDM6IHsKKyAgICAgICAgICB1aW50OF90IGxlZnQgPSAwOworICAgICAgICAgIGlmIChieXRlID49IEJ5dGVzUGVyUGl4ZWwpIHsKKyAgICAgICAgICAgIGxlZnQgPSBwRGVzdERhdGFbYnl0ZSAtIEJ5dGVzUGVyUGl4ZWxdOworICAgICAgICAgIH0KKyAgICAgICAgICB1aW50OF90IHVwID0gMDsKKyAgICAgICAgICBpZiAocm93KSB7CisgICAgICAgICAgICB1cCA9IHBEZXN0RGF0YVtieXRlIC0gcm93X3NpemVdOworICAgICAgICAgIH0KKyAgICAgICAgICBwRGVzdERhdGFbYnl0ZV0gPSByYXdfYnl0ZSArICh1cCArIGxlZnQpIC8gMjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDQ6IHsKKyAgICAgICAgICB1aW50OF90IGxlZnQgPSAwOworICAgICAgICAgIGlmIChieXRlID49IEJ5dGVzUGVyUGl4ZWwpIHsKKyAgICAgICAgICAgIGxlZnQgPSBwRGVzdERhdGFbYnl0ZSAtIEJ5dGVzUGVyUGl4ZWxdOworICAgICAgICAgIH0KKyAgICAgICAgICB1aW50OF90IHVwID0gMDsKKyAgICAgICAgICBpZiAocm93KSB7CisgICAgICAgICAgICB1cCA9IHBEZXN0RGF0YVtieXRlIC0gcm93X3NpemVdOworICAgICAgICAgIH0KKyAgICAgICAgICB1aW50OF90IHVwcGVyX2xlZnQgPSAwOworICAgICAgICAgIGlmIChieXRlID49IEJ5dGVzUGVyUGl4ZWwgJiYgcm93KSB7CisgICAgICAgICAgICB1cHBlcl9sZWZ0ID0gcERlc3REYXRhW2J5dGUgLSByb3dfc2l6ZSAtIEJ5dGVzUGVyUGl4ZWxdOworICAgICAgICAgIH0KKyAgICAgICAgICBwRGVzdERhdGFbYnl0ZV0gPSByYXdfYnl0ZSArIFBhZXRoUHJlZGljdG9yKGxlZnQsIHVwLCB1cHBlcl9sZWZ0KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHBEZXN0RGF0YVtieXRlXSA9IHJhd19ieXRlOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnl0ZV9jbnQrKzsKICAgICB9CisgICAgcFNyY0RhdGEgKz0gcm93X3NpemUgKyAxOworICAgIHBEZXN0RGF0YSArPSByb3dfc2l6ZTsKKyAgfQorICBGWF9GcmVlKGRhdGFfYnVmKTsKKyAgZGF0YV9idWYgPSBkZXN0X2J1ZjsKKyAgZGF0YV9zaXplID0gcm93X3NpemUgKiByb3dfY291bnQgLQorICAgICAgICAgICAgICAobGFzdF9yb3dfc2l6ZSA+IDAgPyAocm93X3NpemUgKyAxIC0gbGFzdF9yb3dfc2l6ZSkgOiAwKTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1zdGF0aWMgRlhfQk9PTCBQTkdfUHJlZGljdG9yKEZYX0xQQllURSYgZGF0YV9idWYsIEZYX0RXT1JEJiBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2xvcnMsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucykKLXsKLSAgICBjb25zdCBpbnQgQnl0ZXNQZXJQaXhlbCA9IChDb2xvcnMgKiBCaXRzUGVyQ29tcG9uZW50ICsgNykgLyA4OwotICAgIGNvbnN0IGludCByb3dfc2l6ZSA9IChDb2xvcnMgKiBCaXRzUGVyQ29tcG9uZW50ICogQ29sdW1ucyArIDcpIC8gODsKLSAgICBpZiAocm93X3NpemUgPD0gMCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIGNvbnN0IGludCByb3dfY291bnQgPSAoZGF0YV9zaXplICsgcm93X3NpemUpIC8gKHJvd19zaXplICsgMSk7Ci0gICAgY29uc3QgaW50IGxhc3Rfcm93X3NpemUgPSBkYXRhX3NpemUgJSAocm93X3NpemUgKyAxKTsKLSAgICBGWF9MUEJZVEUgZGVzdF9idWYgPSBGWF9BbGxvYzJEKEZYX0JZVEUsIHJvd19zaXplLCByb3dfY291bnQpOwotICAgIGludCBieXRlX2NudCA9IDA7Ci0gICAgRlhfTFBCWVRFIHBTcmNEYXRhID0gZGF0YV9idWY7Ci0gICAgRlhfTFBCWVRFIHBEZXN0RGF0YSA9IGRlc3RfYnVmOwotICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IHJvd19jb3VudDsgcm93ICsrKSB7Ci0gICAgICAgIEZYX0JZVEUgdGFnID0gcFNyY0RhdGFbMF07Ci0gICAgICAgIGJ5dGVfY250Kys7Ci0gICAgICAgIGlmICh0YWcgPT0gMCkgewotICAgICAgICAgICAgaW50IG1vdmVfc2l6ZSA9IHJvd19zaXplOwotICAgICAgICAgICAgaWYgKChyb3cgKyAxKSAqIChtb3ZlX3NpemUgKyAxKSA+IChpbnQpZGF0YV9zaXplKSB7Ci0gICAgICAgICAgICAgICAgbW92ZV9zaXplID0gbGFzdF9yb3dfc2l6ZSAtIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWFNZU19tZW1tb3ZlMzIocERlc3REYXRhLCBwU3JjRGF0YSArIDEsIG1vdmVfc2l6ZSk7Ci0gICAgICAgICAgICBwU3JjRGF0YSArPSBtb3ZlX3NpemUgKyAxOwotICAgICAgICAgICAgcERlc3REYXRhICs9IG1vdmVfc2l6ZTsKLSAgICAgICAgICAgIGJ5dGVfY250ICs9IG1vdmVfc2l6ZTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGJ5dGUgPSAwOyBieXRlIDwgcm93X3NpemUgJiYgYnl0ZV9jbnQgPCAoaW50KWRhdGFfc2l6ZTsgYnl0ZSArKykgewotICAgICAgICAgICAgRlhfQllURSByYXdfYnl0ZSA9IHBTcmNEYXRhW2J5dGUgKyAxXTsKLSAgICAgICAgICAgIHN3aXRjaCAodGFnKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGxlZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPj0gQnl0ZXNQZXJQaXhlbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBwRGVzdERhdGFbYnl0ZSAtIEJ5dGVzUGVyUGl4ZWxdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcERlc3REYXRhW2J5dGVdID0gcmF3X2J5dGUgKyBsZWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIDI6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgdXAgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwID0gcERlc3REYXRhW2J5dGUgLSByb3dfc2l6ZV07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRGVzdERhdGFbYnl0ZV0gPSByYXdfYnl0ZSArIHVwOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIDM6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgbGVmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA+PSBCeXRlc1BlclBpeGVsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHBEZXN0RGF0YVtieXRlIC0gQnl0ZXNQZXJQaXhlbF07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIHVwID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3cpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cCA9IHBEZXN0RGF0YVtieXRlIC0gcm93X3NpemVdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcERlc3REYXRhW2J5dGVdID0gcmF3X2J5dGUgKyAodXAgKyBsZWZ0KSAvIDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgNDogewotICAgICAgICAgICAgICAgICAgICAgICAgRlhfQllURSBsZWZ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlID49IEJ5dGVzUGVyUGl4ZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gcERlc3REYXRhW2J5dGUgLSBCeXRlc1BlclBpeGVsXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgdXAgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwID0gcERlc3REYXRhW2J5dGUgLSByb3dfc2l6ZV07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIHVwcGVyX2xlZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPj0gQnl0ZXNQZXJQaXhlbCAmJiByb3cpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlcl9sZWZ0ID0gcERlc3REYXRhW2J5dGUgLSByb3dfc2l6ZSAtIEJ5dGVzUGVyUGl4ZWxdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcERlc3REYXRhW2J5dGVdID0gcmF3X2J5dGUgKyBQYWV0aFByZWRpY3RvcihsZWZ0LCB1cCwgdXBwZXJfbGVmdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHBEZXN0RGF0YVtieXRlXSA9IHJhd19ieXRlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ5dGVfY250Kys7Ci0gICAgICAgIH0KLSAgICAgICAgcFNyY0RhdGEgKz0gcm93X3NpemUgKyAxOwotICAgICAgICBwRGVzdERhdGEgKz0gcm93X3NpemU7Ci0gICAgfQotICAgIEZYX0ZyZWUoZGF0YV9idWYpOwotICAgIGRhdGFfYnVmID0gZGVzdF9idWY7Ci0gICAgZGF0YV9zaXplID0gcm93X3NpemUgKiByb3dfY291bnQgLSAobGFzdF9yb3dfc2l6ZSA+IDAgPyAocm93X3NpemUgKyAxIC0gbGFzdF9yb3dfc2l6ZSkgOiAwKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLXN0YXRpYyB2b2lkIFRJRkZfUHJlZGljdG9yRW5jb2RlTGluZShGWF9MUEJZVEUgZGVzdF9idWYsIGludCByb3dfc2l6ZSwgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2xvcnMsIGludCBDb2x1bW5zKQotewotICAgIGludCBCeXRlc1BlclBpeGVsID0gQml0c1BlckNvbXBvbmVudCAqIENvbG9ycyAvIDg7Ci0gICAgaWYgKEJpdHNQZXJDb21wb25lbnQgPCA4KSB7Ci0gICAgICAgIEZYX0JZVEUgbWFzayA9IDB4MDE7Ci0gICAgICAgIGlmIChCaXRzUGVyQ29tcG9uZW50ID09IDIpIHsKLSAgICAgICAgICAgIG1hc2sgPSAweDAzOwotICAgICAgICB9IGVsc2UgaWYgKEJpdHNQZXJDb21wb25lbnQgPT0gNCkgewotICAgICAgICAgICAgbWFzayA9IDB4MEY7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHJvd19iaXRzID0gQ29sb3JzICogQml0c1BlckNvbXBvbmVudCAqIENvbHVtbnM7Ci0gICAgICAgIGZvciAoaW50IGkgPSByb3dfYml0cyAtIEJpdHNQZXJDb21wb25lbnQ7IGkgPj0gQml0c1BlckNvbXBvbmVudDsgaSAtPSBCaXRzUGVyQ29tcG9uZW50KSB7Ci0gICAgICAgICAgICBpbnQgY29sID0gaSAlIDg7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBpIC8gODsKLSAgICAgICAgICAgIGludCBjb2xfcHJlID0gKGNvbCA9PSAwKSA/ICg4IC0gQml0c1BlckNvbXBvbmVudCkgOiAoY29sIC0gQml0c1BlckNvbXBvbmVudCk7Ci0gICAgICAgICAgICBpbnQgaW5kZXhfcHJlID0gKGNvbCA9PSAwKSA/IChpbmRleCAtIDEpIDogaW5kZXg7Ci0gICAgICAgICAgICBGWF9CWVRFIGN1ciA9IChkZXN0X2J1ZltpbmRleF0gPj4gKDggLSBjb2wgLSBCaXRzUGVyQ29tcG9uZW50KSkgJiBtYXNrOwotICAgICAgICAgICAgRlhfQllURSBsZWZ0ID0gKGRlc3RfYnVmW2luZGV4X3ByZV0gPj4gKDggLSBjb2xfcHJlIC0gQml0c1BlckNvbXBvbmVudCkpICYgbWFzazsKLSAgICAgICAgICAgIGN1ciAtPSBsZWZ0OwotICAgICAgICAgICAgY3VyICY9IG1hc2s7Ci0gICAgICAgICAgICBjdXIgPDw9ICg4IC0gY29sIC0gQml0c1BlckNvbXBvbmVudCk7Ci0gICAgICAgICAgICBkZXN0X2J1ZltpbmRleF0gJj0gfihtYXNrIDw8ICgoOCAtIGNvbCAtIEJpdHNQZXJDb21wb25lbnQpKSk7Ci0gICAgICAgICAgICBkZXN0X2J1ZltpbmRleF0gfD0gY3VyOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChCaXRzUGVyQ29tcG9uZW50ID09IDgpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IHJvd19zaXplIC0gMTsgaSA+PSBCeXRlc1BlclBpeGVsOyBpLS0pIHsKLSAgICAgICAgICAgIGRlc3RfYnVmW2ldIC09IGRlc3RfYnVmW2kgLSBCeXRlc1BlclBpeGVsXTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSByb3dfc2l6ZSAtIEJ5dGVzUGVyUGl4ZWw7IGkgPj0gQnl0ZXNQZXJQaXhlbDsgaSAtPSBCeXRlc1BlclBpeGVsKSB7Ci0gICAgICAgICAgICBGWF9XT1JEIHBpeGVsID0gKGRlc3RfYnVmW2ldIDw8IDgpIHwgZGVzdF9idWZbaSArIDFdOwotICAgICAgICAgICAgcGl4ZWwgLT0gKGRlc3RfYnVmW2kgLSBCeXRlc1BlclBpeGVsXSA8PCA4KSB8IGRlc3RfYnVmW2kgLSBCeXRlc1BlclBpeGVsICsgMV07Ci0gICAgICAgICAgICBkZXN0X2J1ZltpXSA9IHBpeGVsID4+IDg7Ci0gICAgICAgICAgICBkZXN0X2J1ZltpICsgMV0gPSAoRlhfQllURSlwaXhlbDsKLSAgICAgICAgfQotICAgIH0KLX0KLXN0YXRpYyBGWF9CT09MIFRJRkZfUHJlZGljdG9yRW5jb2RlKEZYX0xQQllURSYgZGF0YV9idWYsIEZYX0RXT1JEJiBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMpCi17Ci0gICAgaW50IHJvd19zaXplID0gKENvbG9ycyAqIEJpdHNQZXJDb21wb25lbnQgKiBDb2x1bW5zICsgNykgLyA4OwotICAgIGlmIChyb3dfc2l6ZSA9PSAwKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgY29uc3QgaW50IHJvd19jb3VudCA9IChkYXRhX3NpemUgKyByb3dfc2l6ZSAtIDEpIC8gcm93X3NpemU7Ci0gICAgY29uc3QgaW50IGxhc3Rfcm93X3NpemUgPSBkYXRhX3NpemUgJSByb3dfc2l6ZTsKLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCByb3dfY291bnQ7IHJvdysrKSB7Ci0gICAgICAgIEZYX0xQQllURSBzY2FuX2xpbmUgPSBkYXRhX2J1ZiArIHJvdyAqIHJvd19zaXplOwotICAgICAgICBpZiAoKHJvdyArIDEpICogcm93X3NpemUgPiAoaW50KWRhdGFfc2l6ZSkgewotICAgICAgICAgICAgcm93X3NpemUgPSBsYXN0X3Jvd19zaXplOwotICAgICAgICB9Ci0gICAgICAgIFRJRkZfUHJlZGljdG9yRW5jb2RlTGluZShzY2FuX2xpbmUsIHJvd19zaXplLCBCaXRzUGVyQ29tcG9uZW50LCBDb2xvcnMsIENvbHVtbnMpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLXN0YXRpYyB2b2lkIFRJRkZfUHJlZGljdExpbmUoRlhfTFBCWVRFIGRlc3RfYnVmLCBpbnQgcm93X3NpemUsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sb3JzLCBpbnQgQ29sdW1ucykKLXsKLSAgICBpZiAoQml0c1BlckNvbXBvbmVudCA9PSAxKSB7Ci0gICAgICAgIGludCByb3dfYml0cyA9IEZYX01JTihCaXRzUGVyQ29tcG9uZW50ICogQ29sb3JzICogQ29sdW1ucywgcm93X3NpemUgKiA4KTsKLSAgICAgICAgaW50IGluZGV4X3ByZSA9IDA7Ci0gICAgICAgIGludCBjb2xfcHJlID0gMDsKLSAgICAgICAgZm9yKGludCBpID0gMTsgaSA8IHJvd19iaXRzOyBpICsrKSB7Ci0gICAgICAgICAgICBpbnQgY29sID0gaSAlIDg7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBpIC8gODsKLSAgICAgICAgICAgIGlmKCAoKGRlc3RfYnVmW2luZGV4XSA+PiAoNyAtIGNvbCkpICYgMSkgXiAoKGRlc3RfYnVmW2luZGV4X3ByZV0gPj4gKDcgLSBjb2xfcHJlKSkgJiAxKSApIHsKLSAgICAgICAgICAgICAgICBkZXN0X2J1ZltpbmRleF0gfD0gMSA8PCAoNyAtIGNvbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRlc3RfYnVmW2luZGV4XSAmPSB+KDEgPDwgKDcgLSBjb2wpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluZGV4X3ByZSA9IGluZGV4OwotICAgICAgICAgICAgY29sX3ByZSA9IGNvbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludCBCeXRlc1BlclBpeGVsID0gQml0c1BlckNvbXBvbmVudCAqIENvbG9ycyAvIDg7Ci0gICAgaWYgKEJpdHNQZXJDb21wb25lbnQgPT0gMTYpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IEJ5dGVzUGVyUGl4ZWw7IGkgPCByb3dfc2l6ZTsgaSArPSAyKSB7Ci0gICAgICAgICAgICBGWF9XT1JEIHBpeGVsID0gKGRlc3RfYnVmW2kgLSBCeXRlc1BlclBpeGVsXSA8PCA4KSB8IGRlc3RfYnVmW2kgLSBCeXRlc1BlclBpeGVsICsgMV07Ci0gICAgICAgICAgICBwaXhlbCArPSAoZGVzdF9idWZbaV0gPDwgOCkgfCBkZXN0X2J1ZltpICsgMV07Ci0gICAgICAgICAgICBkZXN0X2J1ZltpXSA9IHBpeGVsID4+IDg7Ci0gICAgICAgICAgICBkZXN0X2J1ZltpICsgMV0gPSAoRlhfQllURSlwaXhlbDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSBCeXRlc1BlclBpeGVsOyBpIDwgcm93X3NpemU7IGkgKyspIHsKLSAgICAgICAgICAgIGRlc3RfYnVmW2ldICs9IGRlc3RfYnVmW2kgLSBCeXRlc1BlclBpeGVsXTsKLSAgICAgICAgfQotICAgIH0KLX0KLXN0YXRpYyBGWF9CT09MIFRJRkZfUHJlZGljdG9yKEZYX0xQQllURSYgZGF0YV9idWYsIEZYX0RXT1JEJiBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMpCi17Ci0gICAgaW50IHJvd19zaXplID0gKENvbG9ycyAqIEJpdHNQZXJDb21wb25lbnQgKiBDb2x1bW5zICsgNykgLyA4OwotICAgIGlmIChyb3dfc2l6ZSA9PSAwKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgY29uc3QgaW50IHJvd19jb3VudCA9IChkYXRhX3NpemUgKyByb3dfc2l6ZSAtIDEpIC8gcm93X3NpemU7Ci0gICAgY29uc3QgaW50IGxhc3Rfcm93X3NpemUgPSBkYXRhX3NpemUgJSByb3dfc2l6ZTsKLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCByb3dfY291bnQ7IHJvdyArKykgewotICAgICAgICBGWF9MUEJZVEUgc2Nhbl9saW5lID0gZGF0YV9idWYgKyByb3cgKiByb3dfc2l6ZTsKLSAgICAgICAgaWYgKChyb3cgKyAxKSAqIHJvd19zaXplID4gKGludClkYXRhX3NpemUpIHsKLSAgICAgICAgICAgIHJvd19zaXplID0gbGFzdF9yb3dfc2l6ZTsKLSAgICAgICAgfQotICAgICAgICBUSUZGX1ByZWRpY3RMaW5lKHNjYW5fbGluZSwgcm93X3NpemUsIEJpdHNQZXJDb21wb25lbnQsIENvbG9ycywgQ29sdW1ucyk7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotY2xhc3MgQ0NvZGVjX0ZsYXRlU2NhbmxpbmVEZWNvZGVyIDogcHVibGljIENDb2RlY19TY2FubGluZURlY29kZXIKLXsKLXB1YmxpYzoKLSAgICBDQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXIoKTsKLSAgICB+Q0NvZGVjX0ZsYXRlU2NhbmxpbmVEZWNvZGVyKCk7Ci0gICAgdm9pZCBDcmVhdGUoRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbkNvbXBzLCBpbnQgYnBjLAotICAgICAgICAgICAgICAgIGludCBwcmVkaWN0b3IsIGludCBDb2xvcnMsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucyk7Ci0gICAgdmlydHVhbCB2b2lkCQlEZXN0cm95KCkKLSAgICB7Ci0gICAgICAgIGRlbGV0ZSB0aGlzOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQJCXZfRG93blNjYWxlKGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQpIHt9Ci0gICAgdmlydHVhbCBGWF9CT09MCQl2X1Jld2luZCgpOwotICAgIHZpcnR1YWwgRlhfTFBCWVRFCXZfR2V0TmV4dExpbmUoKTsKLSAgICB2aXJ0dWFsIEZYX0RXT1JECUdldFNyY09mZnNldCgpOwotICAgIHZvaWQqCQkJCW1fcEZsYXRlOwotICAgIEZYX0xQQ0JZVEUJCQltX1NyY0J1ZjsKLSAgICBGWF9EV09SRAkJCW1fU3JjU2l6ZTsKLSAgICBGWF9MUEJZVEUJCQltX3BTY2FubGluZTsKLSAgICBGWF9MUEJZVEUJCQltX3BMYXN0TGluZTsKLSAgICBGWF9MUEJZVEUJCQltX3BQcmVkaWN0QnVmZmVyOwotICAgIEZYX0xQQllURQkJCW1fcFByZWRpY3RSYXc7Ci0gICAgaW50CQkJCQltX1ByZWRpY3RvcjsKLSAgICBpbnQJCQkJCW1fQ29sb3JzLCBtX0JpdHNQZXJDb21wb25lbnQsIG1fQ29sdW1ucywgbV9QcmVkaWN0UGl0Y2gsIG1fTGVmdE92ZXI7Ci19OwotQ0NvZGVjX0ZsYXRlU2NhbmxpbmVEZWNvZGVyOjpDQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXIoKQotewotICAgIG1fcEZsYXRlID0gTlVMTDsKLSAgICBtX3BTY2FubGluZSA9IE5VTEw7Ci0gICAgbV9wTGFzdExpbmUgPSBOVUxMOwotICAgIG1fcFByZWRpY3RCdWZmZXIgPSBOVUxMOwotICAgIG1fcFByZWRpY3RSYXcgPSBOVUxMOwotICAgIG1fTGVmdE92ZXIgPSAwOwotfQotQ0NvZGVjX0ZsYXRlU2NhbmxpbmVEZWNvZGVyOjp+Q0NvZGVjX0ZsYXRlU2NhbmxpbmVEZWNvZGVyKCkKLXsKLSAgICBpZiAobV9wU2NhbmxpbmUpIHsKLSAgICAgICAgRlhfRnJlZShtX3BTY2FubGluZSk7Ci0gICAgfQotICAgIGlmIChtX3BMYXN0TGluZSkgewotICAgICAgICBGWF9GcmVlKG1fcExhc3RMaW5lKTsKLSAgICB9Ci0gICAgaWYgKG1fcFByZWRpY3RCdWZmZXIpIHsKLSAgICAgICAgRlhfRnJlZShtX3BQcmVkaWN0QnVmZmVyKTsKLSAgICB9Ci0gICAgaWYgKG1fcFByZWRpY3RSYXcpIHsKLSAgICAgICAgRlhfRnJlZShtX3BQcmVkaWN0UmF3KTsKLSAgICB9Ci0gICAgaWYgKG1fcEZsYXRlKSB7Ci0gICAgICAgIEZQREZBUElfRmxhdGVFbmQobV9wRmxhdGUpOwotICAgIH0KLX0KLXZvaWQgQ0NvZGVjX0ZsYXRlU2NhbmxpbmVEZWNvZGVyOjpDcmVhdGUoRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICBpbnQgbkNvbXBzLCBpbnQgYnBjLCBpbnQgcHJlZGljdG9yLCBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMpCi17Ci0gICAgbV9TcmNCdWYgPSBzcmNfYnVmOwotICAgIG1fU3JjU2l6ZSA9IHNyY19zaXplOwotICAgIG1fT3V0cHV0V2lkdGggPSBtX09yaWdXaWR0aCA9IHdpZHRoOwotICAgIG1fT3V0cHV0SGVpZ2h0ID0gbV9PcmlnSGVpZ2h0ID0gaGVpZ2h0OwotICAgIG1fbkNvbXBzID0gbkNvbXBzOwotICAgIG1fYnBjID0gYnBjOwotICAgIG1fYkNvbG9yVHJhbnNmb3JtZWQgPSBGQUxTRTsKLSAgICBtX1BpdGNoID0gKHdpZHRoICogbkNvbXBzICogYnBjICsgNykgLyA4OwotICAgIG1fcFNjYW5saW5lID0gRlhfQWxsb2MoRlhfQllURSwgbV9QaXRjaCk7Ci0gICAgbV9QcmVkaWN0b3IgPSAwOwotICAgIGlmIChwcmVkaWN0b3IpIHsKLSAgICAgICAgaWYgKHByZWRpY3RvciA+PSAxMCkgewotICAgICAgICAgICAgbV9QcmVkaWN0b3IgPSAyOwotICAgICAgICB9IGVsc2UgaWYgKHByZWRpY3RvciA9PSAyKSB7Ci0gICAgICAgICAgICBtX1ByZWRpY3RvciA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fUHJlZGljdG9yKSB7Ci0gICAgICAgICAgICBpZiAoQml0c1BlckNvbXBvbmVudCAqIENvbG9ycyAqIENvbHVtbnMgPT0gMCkgewotICAgICAgICAgICAgICAgIEJpdHNQZXJDb21wb25lbnQgPSBtX2JwYzsKLSAgICAgICAgICAgICAgICBDb2xvcnMgPSBtX25Db21wczsKLSAgICAgICAgICAgICAgICBDb2x1bW5zID0gbV9PcmlnV2lkdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX0NvbG9ycyA9IENvbG9yczsKLSAgICAgICAgICAgIG1fQml0c1BlckNvbXBvbmVudCA9IEJpdHNQZXJDb21wb25lbnQ7Ci0gICAgICAgICAgICBtX0NvbHVtbnMgPSBDb2x1bW5zOwotICAgICAgICAgICAgbV9QcmVkaWN0UGl0Y2ggPSAobV9CaXRzUGVyQ29tcG9uZW50ICogbV9Db2xvcnMgKiBtX0NvbHVtbnMgKyA3KSAvIDg7Ci0gICAgICAgICAgICBtX3BMYXN0TGluZSA9IEZYX0FsbG9jKEZYX0JZVEUsIG1fUHJlZGljdFBpdGNoKTsKLSAgICAgICAgICAgIG1fcFByZWRpY3RSYXcgPSBGWF9BbGxvYyhGWF9CWVRFLCBtX1ByZWRpY3RQaXRjaCArIDEpOwotICAgICAgICAgICAgbV9wUHJlZGljdEJ1ZmZlciA9IEZYX0FsbG9jKEZYX0JZVEUsIG1fUHJlZGljdFBpdGNoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLUZYX0JPT0wgQ0NvZGVjX0ZsYXRlU2NhbmxpbmVEZWNvZGVyOjp2X1Jld2luZCgpCi17Ci0gICAgaWYgKG1fcEZsYXRlKSB7Ci0gICAgICAgIEZQREZBUElfRmxhdGVFbmQobV9wRmxhdGUpOwotICAgIH0KLSAgICBtX3BGbGF0ZSA9IEZQREZBUElfRmxhdGVJbml0KG15X2FsbG9jX2Z1bmMsIG15X2ZyZWVfZnVuYyk7Ci0gICAgaWYgKG1fcEZsYXRlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGUERGQVBJX0ZsYXRlSW5wdXQobV9wRmxhdGUsIG1fU3JjQnVmLCBtX1NyY1NpemUpOwotICAgIG1fTGVmdE92ZXIgPSAwOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfTFBCWVRFIENDb2RlY19GbGF0ZVNjYW5saW5lRGVjb2Rlcjo6dl9HZXROZXh0TGluZSgpCi17Ci0gICAgaWYgKG1fUHJlZGljdG9yKSB7Ci0gICAgICAgIGlmIChtX1BpdGNoID09IG1fUHJlZGljdFBpdGNoKSB7Ci0gICAgICAgICAgICBpZiAobV9QcmVkaWN0b3IgPT0gMikgewotICAgICAgICAgICAgICAgIEZQREZBUElfRmxhdGVPdXRwdXQobV9wRmxhdGUsIG1fcFByZWRpY3RSYXcsIG1fUHJlZGljdFBpdGNoICsgMSk7Ci0gICAgICAgICAgICAgICAgUE5HX1ByZWRpY3RMaW5lKG1fcFNjYW5saW5lLCBtX3BQcmVkaWN0UmF3LCBtX3BMYXN0TGluZSwgbV9CaXRzUGVyQ29tcG9uZW50LCBtX0NvbG9ycywgbV9Db2x1bW5zKTsKLSAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkzMihtX3BMYXN0TGluZSwgbV9wU2NhbmxpbmUsIG1fUHJlZGljdFBpdGNoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgRlBERkFQSV9GbGF0ZU91dHB1dChtX3BGbGF0ZSwgbV9wU2NhbmxpbmUsIG1fUGl0Y2gpOwotICAgICAgICAgICAgICAgIFRJRkZfUHJlZGljdExpbmUobV9wU2NhbmxpbmUsIG1fUHJlZGljdFBpdGNoLCBtX2JwYywgbV9uQ29tcHMsIG1fT3V0cHV0V2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IGJ5dGVzX3RvX2dvID0gbV9QaXRjaDsKLSAgICAgICAgICAgIGludCByZWFkX2xlZnRvdmVyID0gbV9MZWZ0T3ZlciA+IGJ5dGVzX3RvX2dvID8gYnl0ZXNfdG9fZ28gOiBtX0xlZnRPdmVyOwotICAgICAgICAgICAgaWYgKHJlYWRfbGVmdG92ZXIpIHsKLSAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkzMihtX3BTY2FubGluZSwgbV9wUHJlZGljdEJ1ZmZlciArIG1fUHJlZGljdFBpdGNoIC0gbV9MZWZ0T3ZlciwgcmVhZF9sZWZ0b3Zlcik7Ci0gICAgICAgICAgICAgICAgbV9MZWZ0T3ZlciAtPSByZWFkX2xlZnRvdmVyOwotICAgICAgICAgICAgICAgIGJ5dGVzX3RvX2dvIC09IHJlYWRfbGVmdG92ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAoYnl0ZXNfdG9fZ28pIHsKLSAgICAgICAgICAgICAgICBpZiAobV9QcmVkaWN0b3IgPT0gMikgewotICAgICAgICAgICAgICAgICAgICBGUERGQVBJX0ZsYXRlT3V0cHV0KG1fcEZsYXRlLCBtX3BQcmVkaWN0UmF3LCBtX1ByZWRpY3RQaXRjaCArIDEpOwotICAgICAgICAgICAgICAgICAgICBQTkdfUHJlZGljdExpbmUobV9wUHJlZGljdEJ1ZmZlciwgbV9wUHJlZGljdFJhdywgbV9wTGFzdExpbmUsIG1fQml0c1BlckNvbXBvbmVudCwgbV9Db2xvcnMsIG1fQ29sdW1ucyk7Ci0gICAgICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKG1fcExhc3RMaW5lLCBtX3BQcmVkaWN0QnVmZmVyLCBtX1ByZWRpY3RQaXRjaCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgRlBERkFQSV9GbGF0ZU91dHB1dChtX3BGbGF0ZSwgbV9wUHJlZGljdEJ1ZmZlciwgbV9QcmVkaWN0UGl0Y2gpOwotICAgICAgICAgICAgICAgICAgICBUSUZGX1ByZWRpY3RMaW5lKG1fcFByZWRpY3RCdWZmZXIsIG1fUHJlZGljdFBpdGNoLCBtX0JpdHNQZXJDb21wb25lbnQsIG1fQ29sb3JzLCBtX0NvbHVtbnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgcmVhZF9ieXRlcyA9IG1fUHJlZGljdFBpdGNoID4gYnl0ZXNfdG9fZ28gPyBieXRlc190b19nbyA6IG1fUHJlZGljdFBpdGNoOwotICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKG1fcFNjYW5saW5lICsgbV9QaXRjaCAtIGJ5dGVzX3RvX2dvLCBtX3BQcmVkaWN0QnVmZmVyLCByZWFkX2J5dGVzKTsKLSAgICAgICAgICAgICAgICBtX0xlZnRPdmVyICs9IG1fUHJlZGljdFBpdGNoIC0gcmVhZF9ieXRlczsKLSAgICAgICAgICAgICAgICBieXRlc190b19nbyAtPSByZWFkX2J5dGVzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRlBERkFQSV9GbGF0ZU91dHB1dChtX3BGbGF0ZSwgbV9wU2NhbmxpbmUsIG1fUGl0Y2gpOwotICAgIH0KLSAgICByZXR1cm4gbV9wU2NhbmxpbmU7Ci19Ci1GWF9EV09SRCBDQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXI6OkdldFNyY09mZnNldCgpCi17Ci0gICAgcmV0dXJuIEZQREZBUElfRmxhdGVHZXRUb3RhbEluKG1fcEZsYXRlKTsKLX0KLXN0YXRpYyB2b2lkIEZsYXRlVW5jb21wcmVzcyhGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBGWF9EV09SRCBvcmlnX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBCWVRFJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSwgRlhfRFdPUkQmIG9mZnNldCkKLXsKLSAgICBjb25zdCBGWF9CT09MIHVzZU9sZEltcGwgPSBzcmNfc2l6ZSA8IDEwMjQwOwotICAgIEZYX0RXT1JEIGd1ZXNzX3NpemUgPSBvcmlnX3NpemUgPyBvcmlnX3NpemUgOiBzcmNfc2l6ZSAqIDI7Ci0gICAgRlhfRFdPUkQgYWxsb2Nfc3RlcCA9IG9yaWdfc2l6ZSA/IDEwMjQwIDogKHNyY19zaXplIDwgMTAyNDAgPyAxMDI0MCA6IHNyY19zaXplKTsKLSAgICBzdGF0aWMgY29uc3QgRlhfRFdPUkQga01heEluaXRpYWxBbGxvY1NpemUgPSAxMDAwMDAwMDsKLSAgICBpZiAoZ3Vlc3Nfc2l6ZSA+IGtNYXhJbml0aWFsQWxsb2NTaXplKSB7Ci0gICAgICAgIGd1ZXNzX3NpemUgPSBrTWF4SW5pdGlhbEFsbG9jU2l6ZTsKLSAgICAgICAgYWxsb2Nfc3RlcCA9IGtNYXhJbml0aWFsQWxsb2NTaXplOwotICAgIH0KLSAgICBGWF9EV09SRCBidWZfc2l6ZSA9IGd1ZXNzX3NpemU7Ci0gICAgRlhfRFdPUkQgbGFzdF9idWZfc2l6ZSA9IGJ1Zl9zaXplOwotICAgIHZvaWQqIGNvbnRleHQgPSBudWxscHRyOwogCi0gICAgRlhfTFBCWVRFIGd1ZXNzX2J1ZiA9IEZYX0FsbG9jKEZYX0JZVEUsIGd1ZXNzX3NpemUgKyAxKTsKLSAgICBGWF9MUEJZVEUgY3VyX2J1ZiA9IGd1ZXNzX2J1ZjsKLSAgICBndWVzc19idWZbZ3Vlc3Nfc2l6ZV0gPSAnXDAnOwotICAgIGNvbnRleHQgPSBGUERGQVBJX0ZsYXRlSW5pdChteV9hbGxvY19mdW5jLCBteV9mcmVlX2Z1bmMpOwotICAgIGlmICghY29udGV4dCkKLSAgICAgICAgZ290byBmYWlsOwotICAgIEZQREZBUElfRmxhdGVJbnB1dChjb250ZXh0LCBzcmNfYnVmLCBzcmNfc2l6ZSk7Ci0gICAgaWYgKHVzZU9sZEltcGwpIHsKLSAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgIEZYX0lOVDMyIHJldCA9IEZQREZBUElfRmxhdGVPdXRwdXQoY29udGV4dCwgY3VyX2J1ZiwgYnVmX3NpemUpOwotICAgICAgICAgICAgaWYgKHJldCAhPSBaX09LKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgRlhfSU5UMzIgYXZhaWxfYnVmX3NpemUgPSBGUERGQVBJX0ZsYXRlR2V0QXZhaWxPdXQoY29udGV4dCk7Ci0gICAgICAgICAgICBpZiAoYXZhaWxfYnVmX3NpemUgIT0gMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLy8gfGF2YWlsX2J1Zl9zaXplfCA9PSAwIGNhc2UuCi0gICAgICAgICAgICBGWF9EV09SRCBvbGRfc2l6ZSA9IGd1ZXNzX3NpemU7Ci0gICAgICAgICAgICBndWVzc19zaXplICs9IGFsbG9jX3N0ZXA7Ci0gICAgICAgICAgICBpZiAoZ3Vlc3Nfc2l6ZSA8IG9sZF9zaXplIHx8IGd1ZXNzX3NpemUgKyAxIDwgZ3Vlc3Nfc2l6ZSkKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgICAgICBndWVzc19idWYgPSBGWF9SZWFsbG9jKEZYX0JZVEUsIGd1ZXNzX2J1ZiwgZ3Vlc3Nfc2l6ZSArIDEpOwotICAgICAgICAgICAgaWYgKCFndWVzc19idWYpCi0gICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICAgICAgZ3Vlc3NfYnVmW2d1ZXNzX3NpemVdID0gJ1wwJzsKLSAgICAgICAgICAgIGN1cl9idWYgPSBndWVzc19idWYgKyBvbGRfc2l6ZTsKLSAgICAgICAgICAgIGJ1Zl9zaXplID0gZ3Vlc3Nfc2l6ZSAtIG9sZF9zaXplOwotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2l6ZSA9IEZQREZBUElfRmxhdGVHZXRUb3RhbE91dChjb250ZXh0KTsKLSAgICAgICAgb2Zmc2V0ID0gRlBERkFQSV9GbGF0ZUdldFRvdGFsSW4oY29udGV4dCk7Ci0gICAgICAgIGlmIChndWVzc19zaXplIC8gMiA+IGRlc3Rfc2l6ZSkgewotICAgICAgICAgICAgZ3Vlc3NfYnVmID0gRlhfUmVhbGxvYyhGWF9CWVRFLCBndWVzc19idWYsIGRlc3Rfc2l6ZSArIDEpOwotICAgICAgICAgICAgaWYgKCFndWVzc19idWYpCi0gICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICAgICAgZ3Vlc3Nfc2l6ZSA9IGRlc3Rfc2l6ZTsKLSAgICAgICAgICAgIGd1ZXNzX2J1ZltndWVzc19zaXplXSA9ICdcMCc7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9idWYgPSBndWVzc19idWY7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfTFBCWVRFPiByZXN1bHRfdG1wX2J1ZnM7Ci0gICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICBGWF9JTlQzMiByZXQgPSBGUERGQVBJX0ZsYXRlT3V0cHV0KGNvbnRleHQsIGN1cl9idWYsIGJ1Zl9zaXplKTsKLSAgICAgICAgICAgIEZYX0lOVDMyIGF2YWlsX2J1Zl9zaXplID0gRlBERkFQSV9GbGF0ZUdldEF2YWlsT3V0KGNvbnRleHQpOwotICAgICAgICAgICAgaWYgKHJldCAhPSBaX09LKSB7Ci0gICAgICAgICAgICAgICAgbGFzdF9idWZfc2l6ZSA9IGJ1Zl9zaXplIC0gYXZhaWxfYnVmX3NpemU7Ci0gICAgICAgICAgICAgICAgcmVzdWx0X3RtcF9idWZzLkFkZChjdXJfYnVmKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdmFpbF9idWZfc2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbGFzdF9idWZfc2l6ZSA9IGJ1Zl9zaXplIC0gYXZhaWxfYnVmX3NpemU7Ci0gICAgICAgICAgICAgICAgcmVzdWx0X3RtcF9idWZzLkFkZChjdXJfYnVmKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gfGF2YWlsX2J1Zl9zaXplfCA9PSAwIGNhc2UuCi0gICAgICAgICAgICByZXN1bHRfdG1wX2J1ZnMuQWRkKGN1cl9idWYpOwotICAgICAgICAgICAgY3VyX2J1ZiA9IEZYX0FsbG9jKEZYX0JZVEUsIGJ1Zl9zaXplICsgMSk7Ci0gICAgICAgICAgICBjdXJfYnVmW2J1Zl9zaXplXSA9ICdcMCc7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zaXplID0gRlBERkFQSV9GbGF0ZUdldFRvdGFsT3V0KGNvbnRleHQpOwotICAgICAgICBvZmZzZXQgPSBGUERGQVBJX0ZsYXRlR2V0VG90YWxJbihjb250ZXh0KTsKLSAgICAgICAgaWYgKHJlc3VsdF90bXBfYnVmcy5HZXRTaXplKCkgPT0gMSkgewotICAgICAgICAgICAgZGVzdF9idWYgPSByZXN1bHRfdG1wX2J1ZnNbMF07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGWF9MUEJZVEUgcmVzdWx0X2J1ZiA9IEZYX0FsbG9jKEZYX0JZVEUsIGRlc3Rfc2l6ZSk7Ci0gICAgICAgICAgICBGWF9EV09SRCByZXN1bHRfcG9zID0gMDsKLSAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCByZXN1bHRfdG1wX2J1ZnMuR2V0U2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBGWF9MUEJZVEUgdG1wX2J1ZiA9IHJlc3VsdF90bXBfYnVmc1tpXTsKLSAgICAgICAgICAgICAgICBGWF9EV09SRCB0bXBfYnVmX3NpemUgPSBidWZfc2l6ZTsKLSAgICAgICAgICAgICAgICBpZiAoaSA9PSByZXN1bHRfdG1wX2J1ZnMuR2V0U2l6ZSgpIC0gMSkgewotICAgICAgICAgICAgICAgICAgICB0bXBfYnVmX3NpemUgPSBsYXN0X2J1Zl9zaXplOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkzMihyZXN1bHRfYnVmICsgcmVzdWx0X3BvcywgdG1wX2J1ZiwgdG1wX2J1Zl9zaXplKTsKLSAgICAgICAgICAgICAgICByZXN1bHRfcG9zICs9IHRtcF9idWZfc2l6ZTsKLSAgICAgICAgICAgICAgICBGWF9GcmVlKHJlc3VsdF90bXBfYnVmc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X2J1ZiA9IHJlc3VsdF9idWY7Ci0gICAgICAgIH0KK3ZvaWQgVElGRl9QcmVkaWN0b3JFbmNvZGVMaW5lKHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJpdHNQZXJDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbHVtbnMpIHsKKyAgaW50IEJ5dGVzUGVyUGl4ZWwgPSBCaXRzUGVyQ29tcG9uZW50ICogQ29sb3JzIC8gODsKKyAgaWYgKEJpdHNQZXJDb21wb25lbnQgPCA4KSB7CisgICAgdWludDhfdCBtYXNrID0gMHgwMTsKKyAgICBpZiAoQml0c1BlckNvbXBvbmVudCA9PSAyKSB7CisgICAgICBtYXNrID0gMHgwMzsKKyAgICB9IGVsc2UgaWYgKEJpdHNQZXJDb21wb25lbnQgPT0gNCkgeworICAgICAgbWFzayA9IDB4MEY7CiAgICAgfQotICAgIEZQREZBUElfRmxhdGVFbmQoY29udGV4dCk7Ci0gICAgcmV0dXJuOwotCi1mYWlsOgotICAgIEZYX0ZyZWUoZ3Vlc3NfYnVmKTsKLSAgICBkZXN0X2J1ZiA9IG51bGxwdHI7Ci0gICAgZGVzdF9zaXplID0gMDsKLSAgICByZXR1cm47CisgICAgaW50IHJvd19iaXRzID0gQ29sb3JzICogQml0c1BlckNvbXBvbmVudCAqIENvbHVtbnM7CisgICAgZm9yIChpbnQgaSA9IHJvd19iaXRzIC0gQml0c1BlckNvbXBvbmVudDsgaSA+PSBCaXRzUGVyQ29tcG9uZW50OworICAgICAgICAgaSAtPSBCaXRzUGVyQ29tcG9uZW50KSB7CisgICAgICBpbnQgY29sID0gaSAlIDg7CisgICAgICBpbnQgaW5kZXggPSBpIC8gODsKKyAgICAgIGludCBjb2xfcHJlID0KKyAgICAgICAgICAoY29sID09IDApID8gKDggLSBCaXRzUGVyQ29tcG9uZW50KSA6IChjb2wgLSBCaXRzUGVyQ29tcG9uZW50KTsKKyAgICAgIGludCBpbmRleF9wcmUgPSAoY29sID09IDApID8gKGluZGV4IC0gMSkgOiBpbmRleDsKKyAgICAgIHVpbnQ4X3QgY3VyID0gKGRlc3RfYnVmW2luZGV4XSA+PiAoOCAtIGNvbCAtIEJpdHNQZXJDb21wb25lbnQpKSAmIG1hc2s7CisgICAgICB1aW50OF90IGxlZnQgPQorICAgICAgICAgIChkZXN0X2J1ZltpbmRleF9wcmVdID4+ICg4IC0gY29sX3ByZSAtIEJpdHNQZXJDb21wb25lbnQpKSAmIG1hc2s7CisgICAgICBjdXIgLT0gbGVmdDsKKyAgICAgIGN1ciAmPSBtYXNrOworICAgICAgY3VyIDw8PSAoOCAtIGNvbCAtIEJpdHNQZXJDb21wb25lbnQpOworICAgICAgZGVzdF9idWZbaW5kZXhdICY9IH4obWFzayA8PCAoKDggLSBjb2wgLSBCaXRzUGVyQ29tcG9uZW50KSkpOworICAgICAgZGVzdF9idWZbaW5kZXhdIHw9IGN1cjsKKyAgICB9CisgIH0gZWxzZSBpZiAoQml0c1BlckNvbXBvbmVudCA9PSA4KSB7CisgICAgZm9yIChpbnQgaSA9IHJvd19zaXplIC0gMTsgaSA+PSBCeXRlc1BlclBpeGVsOyBpLS0pIHsKKyAgICAgIGRlc3RfYnVmW2ldIC09IGRlc3RfYnVmW2kgLSBCeXRlc1BlclBpeGVsXTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpbnQgaSA9IHJvd19zaXplIC0gQnl0ZXNQZXJQaXhlbDsgaSA+PSBCeXRlc1BlclBpeGVsOworICAgICAgICAgaSAtPSBCeXRlc1BlclBpeGVsKSB7CisgICAgICBGWF9XT1JEIHBpeGVsID0gKGRlc3RfYnVmW2ldIDw8IDgpIHwgZGVzdF9idWZbaSArIDFdOworICAgICAgcGl4ZWwgLT0KKyAgICAgICAgICAoZGVzdF9idWZbaSAtIEJ5dGVzUGVyUGl4ZWxdIDw8IDgpIHwgZGVzdF9idWZbaSAtIEJ5dGVzUGVyUGl4ZWwgKyAxXTsKKyAgICAgIGRlc3RfYnVmW2ldID0gcGl4ZWwgPj4gODsKKyAgICAgIGRlc3RfYnVmW2kgKyAxXSA9ICh1aW50OF90KXBpeGVsOworICAgIH0KKyAgfQogfQotSUNvZGVjX1NjYW5saW5lRGVjb2RlcioJQ0NvZGVjX0ZsYXRlTW9kdWxlOjpDcmVhdGVEZWNvZGVyKEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgaW50IG5Db21wcywgaW50IGJwYywgaW50IHByZWRpY3RvciwgaW50IENvbG9ycywgaW50IEJpdHNQZXJDb21wb25lbnQsIGludCBDb2x1bW5zKQotewotICAgIENDb2RlY19GbGF0ZVNjYW5saW5lRGVjb2RlciogcERlY29kZXIgPSBuZXcgQ0NvZGVjX0ZsYXRlU2NhbmxpbmVEZWNvZGVyOwotICAgIHBEZWNvZGVyLT5DcmVhdGUoc3JjX2J1Ziwgc3JjX3NpemUsIHdpZHRoLCBoZWlnaHQsIG5Db21wcywgYnBjLCBwcmVkaWN0b3IsIENvbG9ycywgQml0c1BlckNvbXBvbmVudCwgQ29sdW1ucyk7Ci0gICAgcmV0dXJuIHBEZWNvZGVyOwotfQotRlhfRFdPUkQgQ0NvZGVjX0ZsYXRlTW9kdWxlOjpGbGF0ZU9yTFpXRGVjb2RlKEZYX0JPT0wgYkxaVywgY29uc3QgRlhfQllURSogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsIEZYX0JPT0wgYkVhcmx5Q2hhbmdlLAotICAgICAgICBpbnQgcHJlZGljdG9yLCBpbnQgQ29sb3JzLCBpbnQgQml0c1BlckNvbXBvbmVudCwgaW50IENvbHVtbnMsCi0gICAgICAgIEZYX0RXT1JEIGVzdGltYXRlZF9zaXplLCBGWF9MUEJZVEUmIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKQotewotICAgIGRlc3RfYnVmID0gTlVMTDsKLSAgICBGWF9EV09SRCBvZmZzZXQgPSAwOwotICAgIGludCBwcmVkaWN0b3JfdHlwZSA9IDA7Ci0gICAgaWYgKHByZWRpY3RvcikgewotICAgICAgICBpZiAocHJlZGljdG9yID49IDEwKSB7Ci0gICAgICAgICAgICBwcmVkaWN0b3JfdHlwZSA9IDI7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJlZGljdG9yID09IDIpIHsKLSAgICAgICAgICAgIHByZWRpY3Rvcl90eXBlID0gMTsKLSAgICAgICAgfQorCitGWF9CT09MIFRJRkZfUHJlZGljdG9yRW5jb2RlKHVpbnQ4X3QqJiBkYXRhX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJpdHNQZXJDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2x1bW5zKSB7CisgIGludCByb3dfc2l6ZSA9IChDb2xvcnMgKiBCaXRzUGVyQ29tcG9uZW50ICogQ29sdW1ucyArIDcpIC8gODsKKyAgaWYgKHJvd19zaXplID09IDApCisgICAgcmV0dXJuIEZBTFNFOworICBjb25zdCBpbnQgcm93X2NvdW50ID0gKGRhdGFfc2l6ZSArIHJvd19zaXplIC0gMSkgLyByb3dfc2l6ZTsKKyAgY29uc3QgaW50IGxhc3Rfcm93X3NpemUgPSBkYXRhX3NpemUgJSByb3dfc2l6ZTsKKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgcm93X2NvdW50OyByb3crKykgeworICAgIHVpbnQ4X3QqIHNjYW5fbGluZSA9IGRhdGFfYnVmICsgcm93ICogcm93X3NpemU7CisgICAgaWYgKChyb3cgKyAxKSAqIHJvd19zaXplID4gKGludClkYXRhX3NpemUpIHsKKyAgICAgIHJvd19zaXplID0gbGFzdF9yb3dfc2l6ZTsKICAgICB9Ci0gICAgaWYgKGJMWlcpIHsKLSAgICAgICAgewotICAgICAgICAgICAgbm9uc3RkOjp1bmlxdWVfcHRyPENMWldEZWNvZGVyPiBkZWNvZGVyKG5ldyBDTFpXRGVjb2Rlcik7Ci0gICAgICAgICAgICBkZXN0X3NpemUgPSAoRlhfRFdPUkQpIC0gMTsKLSAgICAgICAgICAgIG9mZnNldCA9IHNyY19zaXplOwotICAgICAgICAgICAgaW50IGVyciA9IGRlY29kZXItPkRlY29kZShOVUxMLCBkZXN0X3NpemUsIHNyY19idWYsIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkVhcmx5Q2hhbmdlKTsKLSAgICAgICAgICAgIGlmIChlcnIgfHwgZGVzdF9zaXplID09IDAgfHwgZGVzdF9zaXplICsgMSA8IGRlc3Rfc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB7Ci0gICAgICAgICAgICBub25zdGQ6OnVuaXF1ZV9wdHI8Q0xaV0RlY29kZXI+IGRlY29kZXIobmV3IENMWldEZWNvZGVyKTsKLSAgICAgICAgICAgIGRlc3RfYnVmID0gRlhfQWxsb2MoIEZYX0JZVEUsIGRlc3Rfc2l6ZSArIDEpOwotICAgICAgICAgICAgZGVzdF9idWZbZGVzdF9zaXplXSA9ICdcMCc7Ci0gICAgICAgICAgICBkZWNvZGVyLT5EZWNvZGUoZGVzdF9idWYsIGRlc3Rfc2l6ZSwgc3JjX2J1Ziwgb2Zmc2V0LCBiRWFybHlDaGFuZ2UpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRmxhdGVVbmNvbXByZXNzKHNyY19idWYsIHNyY19zaXplLCBlc3RpbWF0ZWRfc2l6ZSwgZGVzdF9idWYsIGRlc3Rfc2l6ZSwgb2Zmc2V0KTsKLSAgICB9Ci0gICAgaWYgKHByZWRpY3Rvcl90eXBlID09IDApIHsKLSAgICAgICAgcmV0dXJuIG9mZnNldDsKLSAgICB9Ci0gICAgRlhfQk9PTCByZXQgPSBUUlVFOwotICAgIGlmIChwcmVkaWN0b3JfdHlwZSA9PSAyKSB7Ci0gICAgICAgIHJldCA9IFBOR19QcmVkaWN0b3IoZGVzdF9idWYsIGRlc3Rfc2l6ZSwgQ29sb3JzLCBCaXRzUGVyQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbnMpOwotICAgIH0gZWxzZSBpZiAocHJlZGljdG9yX3R5cGUgPT0gMSkgewotICAgICAgICByZXQgPSBUSUZGX1ByZWRpY3RvcihkZXN0X2J1ZiwgZGVzdF9zaXplLCBDb2xvcnMsIEJpdHNQZXJDb21wb25lbnQsCisgICAgVElGRl9QcmVkaWN0b3JFbmNvZGVMaW5lKHNjYW5fbGluZSwgcm93X3NpemUsIEJpdHNQZXJDb21wb25lbnQsIENvbG9ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1ucyk7Ci0gICAgfQotICAgIHJldHVybiByZXQgPyBvZmZzZXQgOiAtMTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ0NvZGVjX0ZsYXRlTW9kdWxlOjpFbmNvZGUoY29uc3QgRlhfQllURSogc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVkaWN0b3IsIGludCBDb2xvcnMsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBCWVRFJiBkZXN0X2J1ZiwgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkKLXsKLSAgICBpZiAocHJlZGljdG9yICE9IDIgJiYgcHJlZGljdG9yIDwgMTApIHsKLSAgICAgICAgcmV0dXJuIEVuY29kZShzcmNfYnVmLCBzcmNfc2l6ZSwgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7CisKK3ZvaWQgVElGRl9QcmVkaWN0TGluZSh1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCByb3dfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgQml0c1BlckNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sb3JzLAorICAgICAgICAgICAgICAgICAgICAgIGludCBDb2x1bW5zKSB7CisgIGlmIChCaXRzUGVyQ29tcG9uZW50ID09IDEpIHsKKyAgICBpbnQgcm93X2JpdHMgPSBGWF9NSU4oQml0c1BlckNvbXBvbmVudCAqIENvbG9ycyAqIENvbHVtbnMsIHJvd19zaXplICogOCk7CisgICAgaW50IGluZGV4X3ByZSA9IDA7CisgICAgaW50IGNvbF9wcmUgPSAwOworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcm93X2JpdHM7IGkrKykgeworICAgICAgaW50IGNvbCA9IGkgJSA4OworICAgICAgaW50IGluZGV4ID0gaSAvIDg7CisgICAgICBpZiAoKChkZXN0X2J1ZltpbmRleF0gPj4gKDcgLSBjb2wpKSAmIDEpIF4KKyAgICAgICAgICAoKGRlc3RfYnVmW2luZGV4X3ByZV0gPj4gKDcgLSBjb2xfcHJlKSkgJiAxKSkgeworICAgICAgICBkZXN0X2J1ZltpbmRleF0gfD0gMSA8PCAoNyAtIGNvbCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkZXN0X2J1ZltpbmRleF0gJj0gfigxIDw8ICg3IC0gY29sKSk7CisgICAgICB9CisgICAgICBpbmRleF9wcmUgPSBpbmRleDsKKyAgICAgIGNvbF9wcmUgPSBjb2w7CiAgICAgfQotICAgIEZYX0xQQllURSBwU3JjQnVmID0gTlVMTDsKLSAgICBwU3JjQnVmID0gRlhfQWxsb2MoRlhfQllURSwgc3JjX3NpemUpOwotICAgIEZYU1lTX21lbWNweTMyKHBTcmNCdWYsIHNyY19idWYsIHNyY19zaXplKTsKLSAgICBGWF9CT09MIHJldCA9IFRSVUU7Ci0gICAgaWYgKHByZWRpY3RvciA9PSAyKSB7Ci0gICAgICAgIHJldCA9IFRJRkZfUHJlZGljdG9yRW5jb2RlKHBTcmNCdWYsIHNyY19zaXplLCBDb2xvcnMsIEJpdHNQZXJDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbnMpOwotICAgIH0gZWxzZSBpZiAocHJlZGljdG9yID49IDEwKSB7Ci0gICAgICAgIHJldCA9IFBOR19QcmVkaWN0b3JFbmNvZGUocFNyY0J1Ziwgc3JjX3NpemUsIHByZWRpY3RvciwgQ29sb3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdHNQZXJDb21wb25lbnQsIENvbHVtbnMpOworICAgIHJldHVybjsKKyAgfQorICBpbnQgQnl0ZXNQZXJQaXhlbCA9IEJpdHNQZXJDb21wb25lbnQgKiBDb2xvcnMgLyA4OworICBpZiAoQml0c1BlckNvbXBvbmVudCA9PSAxNikgeworICAgIGZvciAoRlhfRFdPUkQgaSA9IEJ5dGVzUGVyUGl4ZWw7IGkgPCByb3dfc2l6ZTsgaSArPSAyKSB7CisgICAgICBGWF9XT1JEIHBpeGVsID0KKyAgICAgICAgICAoZGVzdF9idWZbaSAtIEJ5dGVzUGVyUGl4ZWxdIDw8IDgpIHwgZGVzdF9idWZbaSAtIEJ5dGVzUGVyUGl4ZWwgKyAxXTsKKyAgICAgIHBpeGVsICs9IChkZXN0X2J1ZltpXSA8PCA4KSB8IGRlc3RfYnVmW2kgKyAxXTsKKyAgICAgIGRlc3RfYnVmW2ldID0gcGl4ZWwgPj4gODsKKyAgICAgIGRlc3RfYnVmW2kgKyAxXSA9ICh1aW50OF90KXBpeGVsOwogICAgIH0KLSAgICBpZiAocmV0KQotICAgICAgICByZXQgPSBFbmNvZGUocFNyY0J1Ziwgc3JjX3NpemUsIGRlc3RfYnVmLCBkZXN0X3NpemUpOwotICAgIEZYX0ZyZWUocFNyY0J1Zik7Ci0gICAgcmV0dXJuIHJldDsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKEZYX0RXT1JEIGkgPSBCeXRlc1BlclBpeGVsOyBpIDwgcm93X3NpemU7IGkrKykgeworICAgICAgZGVzdF9idWZbaV0gKz0gZGVzdF9idWZbaSAtIEJ5dGVzUGVyUGl4ZWxdOworICAgIH0KKyAgfQogfQotRlhfQk9PTCBDQ29kZWNfRmxhdGVNb2R1bGU6OkVuY29kZShGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBGWF9MUEJZVEUmIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKQotewotICAgIGRlc3Rfc2l6ZSA9IHNyY19zaXplICsgc3JjX3NpemUgLyAxMDAwICsgMTI7Ci0gICAgZGVzdF9idWYgPSBGWF9BbGxvYyggRlhfQllURSwgZGVzdF9zaXplKTsKLSAgICB1bnNpZ25lZCBsb25nIHRlbXBfc2l6ZSA9IGRlc3Rfc2l6ZTsKLSAgICBGUERGQVBJX0ZsYXRlQ29tcHJlc3MoZGVzdF9idWYsICZ0ZW1wX3NpemUsIHNyY19idWYsIHNyY19zaXplKTsKLSAgICBkZXN0X3NpemUgPSAoRlhfRFdPUkQpdGVtcF9zaXplOwotICAgIHJldHVybiBUUlVFOworCitGWF9CT09MIFRJRkZfUHJlZGljdG9yKHVpbnQ4X3QqJiBkYXRhX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IEJpdHNQZXJDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2x1bW5zKSB7CisgIGludCByb3dfc2l6ZSA9IChDb2xvcnMgKiBCaXRzUGVyQ29tcG9uZW50ICogQ29sdW1ucyArIDcpIC8gODsKKyAgaWYgKHJvd19zaXplID09IDApCisgICAgcmV0dXJuIEZBTFNFOworICBjb25zdCBpbnQgcm93X2NvdW50ID0gKGRhdGFfc2l6ZSArIHJvd19zaXplIC0gMSkgLyByb3dfc2l6ZTsKKyAgY29uc3QgaW50IGxhc3Rfcm93X3NpemUgPSBkYXRhX3NpemUgJSByb3dfc2l6ZTsKKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgcm93X2NvdW50OyByb3crKykgeworICAgIHVpbnQ4X3QqIHNjYW5fbGluZSA9IGRhdGFfYnVmICsgcm93ICogcm93X3NpemU7CisgICAgaWYgKChyb3cgKyAxKSAqIHJvd19zaXplID4gKGludClkYXRhX3NpemUpIHsKKyAgICAgIHJvd19zaXplID0gbGFzdF9yb3dfc2l6ZTsKKyAgICB9CisgICAgVElGRl9QcmVkaWN0TGluZShzY2FuX2xpbmUsIHJvd19zaXplLCBCaXRzUGVyQ29tcG9uZW50LCBDb2xvcnMsIENvbHVtbnMpOworICB9CisgIHJldHVybiBUUlVFOworfQorCit2b2lkIEZsYXRlVW5jb21wcmVzcyhjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBvcmlnX3NpemUsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIG9mZnNldCkgeworICBGWF9EV09SRCBndWVzc19zaXplID0gb3JpZ19zaXplID8gb3JpZ19zaXplIDogc3JjX3NpemUgKiAyOworICBjb25zdCBGWF9EV09SRCBrU3RlcFNpemUgPSAxMDI0MDsKKyAgRlhfRFdPUkQgYWxsb2Nfc3RlcCA9IG9yaWdfc2l6ZSA/IGtTdGVwU2l6ZSA6IHN0ZDo6bWluKHNyY19zaXplLCBrU3RlcFNpemUpOworICBzdGF0aWMgY29uc3QgRlhfRFdPUkQga01heEluaXRpYWxBbGxvY1NpemUgPSAxMDAwMDAwMDsKKyAgaWYgKGd1ZXNzX3NpemUgPiBrTWF4SW5pdGlhbEFsbG9jU2l6ZSkgeworICAgIGd1ZXNzX3NpemUgPSBrTWF4SW5pdGlhbEFsbG9jU2l6ZTsKKyAgICBhbGxvY19zdGVwID0ga01heEluaXRpYWxBbGxvY1NpemU7CisgIH0KKyAgRlhfRFdPUkQgYnVmX3NpemUgPSBndWVzc19zaXplOworICBGWF9EV09SRCBsYXN0X2J1Zl9zaXplID0gYnVmX3NpemU7CisKKyAgZGVzdF9idWYgPSBudWxscHRyOworICBkZXN0X3NpemUgPSAwOworICB2b2lkKiBjb250ZXh0ID0gRlBERkFQSV9GbGF0ZUluaXQobXlfYWxsb2NfZnVuYywgbXlfZnJlZV9mdW5jKTsKKyAgaWYgKCFjb250ZXh0KQorICAgIHJldHVybjsKKworICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdCwgRnhGcmVlRGVsZXRlcj4gZ3Vlc3NfYnVmKAorICAgICAgRlhfQWxsb2ModWludDhfdCwgZ3Vlc3Nfc2l6ZSArIDEpKTsKKyAgZ3Vlc3NfYnVmLmdldCgpW2d1ZXNzX3NpemVdID0gJ1wwJzsKKworICBGUERGQVBJX0ZsYXRlSW5wdXQoY29udGV4dCwgc3JjX2J1Ziwgc3JjX3NpemUpOworCisgIGlmIChzcmNfc2l6ZSA8IGtTdGVwU2l6ZSkgeworICAgIC8vIFRoaXMgaXMgdGhlIG9sZCBpbXBsZW1lbnRhdGlvbi4KKyAgICB1aW50OF90KiBjdXJfYnVmID0gZ3Vlc3NfYnVmLmdldCgpOworICAgIHdoaWxlICgxKSB7CisgICAgICBpbnQzMl90IHJldCA9IEZQREZBUElfRmxhdGVPdXRwdXQoY29udGV4dCwgY3VyX2J1ZiwgYnVmX3NpemUpOworICAgICAgaWYgKHJldCAhPSBaX09LKQorICAgICAgICBicmVhazsKKyAgICAgIGludDMyX3QgYXZhaWxfYnVmX3NpemUgPSBGUERGQVBJX0ZsYXRlR2V0QXZhaWxPdXQoY29udGV4dCk7CisgICAgICBpZiAoYXZhaWxfYnVmX3NpemUgIT0gMCkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIEZYX0RXT1JEIG9sZF9zaXplID0gZ3Vlc3Nfc2l6ZTsKKyAgICAgIGd1ZXNzX3NpemUgKz0gYWxsb2Nfc3RlcDsKKyAgICAgIGlmIChndWVzc19zaXplIDwgb2xkX3NpemUgfHwgZ3Vlc3Nfc2l6ZSArIDEgPCBndWVzc19zaXplKSB7CisgICAgICAgIEZQREZBUElfRmxhdGVFbmQoY29udGV4dCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgeworICAgICAgICB1aW50OF90KiBuZXdfYnVmID0KKyAgICAgICAgICAgIEZYX1JlYWxsb2ModWludDhfdCwgZ3Vlc3NfYnVmLnJlbGVhc2UoKSwgZ3Vlc3Nfc2l6ZSArIDEpOworICAgICAgICBndWVzc19idWYucmVzZXQobmV3X2J1Zik7CisgICAgICB9CisgICAgICBndWVzc19idWYuZ2V0KClbZ3Vlc3Nfc2l6ZV0gPSAnXDAnOworICAgICAgY3VyX2J1ZiA9IGd1ZXNzX2J1Zi5nZXQoKSArIG9sZF9zaXplOworICAgICAgYnVmX3NpemUgPSBndWVzc19zaXplIC0gb2xkX3NpemU7CisgICAgfQorICAgIGRlc3Rfc2l6ZSA9IEZQREZBUElfRmxhdGVHZXRUb3RhbE91dChjb250ZXh0KTsKKyAgICBvZmZzZXQgPSBGUERGQVBJX0ZsYXRlR2V0VG90YWxJbihjb250ZXh0KTsKKyAgICBpZiAoZ3Vlc3Nfc2l6ZSAvIDIgPiBkZXN0X3NpemUpIHsKKyAgICAgIHsKKyAgICAgICAgdWludDhfdCogbmV3X2J1ZiA9CisgICAgICAgICAgICBGWF9SZWFsbG9jKHVpbnQ4X3QsIGd1ZXNzX2J1Zi5yZWxlYXNlKCksIGRlc3Rfc2l6ZSArIDEpOworICAgICAgICBndWVzc19idWYucmVzZXQobmV3X2J1Zik7CisgICAgICB9CisgICAgICBndWVzc19zaXplID0gZGVzdF9zaXplOworICAgICAgZ3Vlc3NfYnVmLmdldCgpW2d1ZXNzX3NpemVdID0gJ1wwJzsKKyAgICB9CisgICAgZGVzdF9idWYgPSBndWVzc19idWYucmVsZWFzZSgpOworICB9IGVsc2UgeworICAgIENGWF9BcnJheVRlbXBsYXRlPHVpbnQ4X3QqPiByZXN1bHRfdG1wX2J1ZnM7CisgICAgdWludDhfdCogY3VyX2J1ZiA9IGd1ZXNzX2J1Zi5yZWxlYXNlKCk7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgIGludDMyX3QgcmV0ID0gRlBERkFQSV9GbGF0ZU91dHB1dChjb250ZXh0LCBjdXJfYnVmLCBidWZfc2l6ZSk7CisgICAgICBpbnQzMl90IGF2YWlsX2J1Zl9zaXplID0gRlBERkFQSV9GbGF0ZUdldEF2YWlsT3V0KGNvbnRleHQpOworICAgICAgaWYgKHJldCAhPSBaX09LKSB7CisgICAgICAgIGxhc3RfYnVmX3NpemUgPSBidWZfc2l6ZSAtIGF2YWlsX2J1Zl9zaXplOworICAgICAgICByZXN1bHRfdG1wX2J1ZnMuQWRkKGN1cl9idWYpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChhdmFpbF9idWZfc2l6ZSAhPSAwKSB7CisgICAgICAgIGxhc3RfYnVmX3NpemUgPSBidWZfc2l6ZSAtIGF2YWlsX2J1Zl9zaXplOworICAgICAgICByZXN1bHRfdG1wX2J1ZnMuQWRkKGN1cl9idWYpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgcmVzdWx0X3RtcF9idWZzLkFkZChjdXJfYnVmKTsKKyAgICAgIGN1cl9idWYgPSBGWF9BbGxvYyh1aW50OF90LCBidWZfc2l6ZSArIDEpOworICAgICAgY3VyX2J1ZltidWZfc2l6ZV0gPSAnXDAnOworICAgIH0KKyAgICBkZXN0X3NpemUgPSBGUERGQVBJX0ZsYXRlR2V0VG90YWxPdXQoY29udGV4dCk7CisgICAgb2Zmc2V0ID0gRlBERkFQSV9GbGF0ZUdldFRvdGFsSW4oY29udGV4dCk7CisgICAgaWYgKHJlc3VsdF90bXBfYnVmcy5HZXRTaXplKCkgPT0gMSkgeworICAgICAgZGVzdF9idWYgPSByZXN1bHRfdG1wX2J1ZnNbMF07CisgICAgfSBlbHNlIHsKKyAgICAgIHVpbnQ4X3QqIHJlc3VsdF9idWYgPSBGWF9BbGxvYyh1aW50OF90LCBkZXN0X3NpemUpOworICAgICAgRlhfRFdPUkQgcmVzdWx0X3BvcyA9IDA7CisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCByZXN1bHRfdG1wX2J1ZnMuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICAgICAgdWludDhfdCogdG1wX2J1ZiA9IHJlc3VsdF90bXBfYnVmc1tpXTsKKyAgICAgICAgRlhfRFdPUkQgdG1wX2J1Zl9zaXplID0gYnVmX3NpemU7CisgICAgICAgIGlmIChpID09IHJlc3VsdF90bXBfYnVmcy5HZXRTaXplKCkgLSAxKSB7CisgICAgICAgICAgdG1wX2J1Zl9zaXplID0gbGFzdF9idWZfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBGWFNZU19tZW1jcHkocmVzdWx0X2J1ZiArIHJlc3VsdF9wb3MsIHRtcF9idWYsIHRtcF9idWZfc2l6ZSk7CisgICAgICAgIHJlc3VsdF9wb3MgKz0gdG1wX2J1Zl9zaXplOworICAgICAgICBGWF9GcmVlKHJlc3VsdF90bXBfYnVmc1tpXSk7CisgICAgICB9CisgICAgICBkZXN0X2J1ZiA9IHJlc3VsdF9idWY7CisgICAgfQorICB9CisgIEZQREZBUElfRmxhdGVFbmQoY29udGV4dCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBDQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXIgOiBwdWJsaWMgQ0NvZGVjX1NjYW5saW5lRGVjb2RlciB7CisgcHVibGljOgorICBDQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXIoKTsKKyAgfkNDb2RlY19GbGF0ZVNjYW5saW5lRGVjb2RlcigpIG92ZXJyaWRlOworCisgIHZvaWQgQ3JlYXRlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgIGludCBuQ29tcHMsCisgICAgICAgICAgICAgIGludCBicGMsCisgICAgICAgICAgICAgIGludCBwcmVkaWN0b3IsCisgICAgICAgICAgICAgIGludCBDb2xvcnMsCisgICAgICAgICAgICAgIGludCBCaXRzUGVyQ29tcG9uZW50LAorICAgICAgICAgICAgICBpbnQgQ29sdW1ucyk7CisgIHZvaWQgRGVzdHJveSgpIHsgZGVsZXRlIHRoaXM7IH0KKworICAvLyBDQ29kZWNfU2NhbmxpbmVEZWNvZGVyCisgIHZvaWQgdl9Eb3duU2NhbGUoaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCkgb3ZlcnJpZGUge30KKyAgRlhfQk9PTCB2X1Jld2luZCgpIG92ZXJyaWRlOworICB1aW50OF90KiB2X0dldE5leHRMaW5lKCkgb3ZlcnJpZGU7CisgIEZYX0RXT1JEIEdldFNyY09mZnNldCgpIG92ZXJyaWRlOworCisgIHZvaWQqIG1fcEZsYXRlOworICBjb25zdCB1aW50OF90KiBtX1NyY0J1ZjsKKyAgRlhfRFdPUkQgbV9TcmNTaXplOworICB1aW50OF90KiBtX3BTY2FubGluZTsKKyAgdWludDhfdCogbV9wTGFzdExpbmU7CisgIHVpbnQ4X3QqIG1fcFByZWRpY3RCdWZmZXI7CisgIHVpbnQ4X3QqIG1fcFByZWRpY3RSYXc7CisgIGludCBtX1ByZWRpY3RvcjsKKyAgaW50IG1fQ29sb3JzOworICBpbnQgbV9CaXRzUGVyQ29tcG9uZW50OworICBpbnQgbV9Db2x1bW5zOworICBGWF9EV09SRCBtX1ByZWRpY3RQaXRjaDsKKyAgc2l6ZV90IG1fTGVmdE92ZXI7Cit9OworCitDQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXI6OkNDb2RlY19GbGF0ZVNjYW5saW5lRGVjb2RlcigpIHsKKyAgbV9wRmxhdGUgPSBOVUxMOworICBtX3BTY2FubGluZSA9IE5VTEw7CisgIG1fcExhc3RMaW5lID0gTlVMTDsKKyAgbV9wUHJlZGljdEJ1ZmZlciA9IE5VTEw7CisgIG1fcFByZWRpY3RSYXcgPSBOVUxMOworICBtX0xlZnRPdmVyID0gMDsKK30KK0NDb2RlY19GbGF0ZVNjYW5saW5lRGVjb2Rlcjo6fkNDb2RlY19GbGF0ZVNjYW5saW5lRGVjb2RlcigpIHsKKyAgRlhfRnJlZShtX3BTY2FubGluZSk7CisgIEZYX0ZyZWUobV9wTGFzdExpbmUpOworICBGWF9GcmVlKG1fcFByZWRpY3RCdWZmZXIpOworICBGWF9GcmVlKG1fcFByZWRpY3RSYXcpOworICBpZiAobV9wRmxhdGUpIHsKKyAgICBGUERGQVBJX0ZsYXRlRW5kKG1fcEZsYXRlKTsKKyAgfQorfQordm9pZCBDQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXI6OkNyZWF0ZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZGljdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQml0c1BlckNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbHVtbnMpIHsKKyAgbV9TcmNCdWYgPSBzcmNfYnVmOworICBtX1NyY1NpemUgPSBzcmNfc2l6ZTsKKyAgbV9PdXRwdXRXaWR0aCA9IG1fT3JpZ1dpZHRoID0gd2lkdGg7CisgIG1fT3V0cHV0SGVpZ2h0ID0gbV9PcmlnSGVpZ2h0ID0gaGVpZ2h0OworICBtX25Db21wcyA9IG5Db21wczsKKyAgbV9icGMgPSBicGM7CisgIG1fYkNvbG9yVHJhbnNmb3JtZWQgPSBGQUxTRTsKKyAgbV9QaXRjaCA9IChzdGF0aWNfY2FzdDxGWF9EV09SRD4od2lkdGgpICogbkNvbXBzICogYnBjICsgNykgLyA4OworICBtX3BTY2FubGluZSA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fUGl0Y2gpOworICBtX1ByZWRpY3RvciA9IDA7CisgIGlmIChwcmVkaWN0b3IpIHsKKyAgICBpZiAocHJlZGljdG9yID49IDEwKSB7CisgICAgICBtX1ByZWRpY3RvciA9IDI7CisgICAgfSBlbHNlIGlmIChwcmVkaWN0b3IgPT0gMikgeworICAgICAgbV9QcmVkaWN0b3IgPSAxOworICAgIH0KKyAgICBpZiAobV9QcmVkaWN0b3IpIHsKKyAgICAgIGlmIChCaXRzUGVyQ29tcG9uZW50ICogQ29sb3JzICogQ29sdW1ucyA9PSAwKSB7CisgICAgICAgIEJpdHNQZXJDb21wb25lbnQgPSBtX2JwYzsKKyAgICAgICAgQ29sb3JzID0gbV9uQ29tcHM7CisgICAgICAgIENvbHVtbnMgPSBtX09yaWdXaWR0aDsKKyAgICAgIH0KKyAgICAgIG1fQ29sb3JzID0gQ29sb3JzOworICAgICAgbV9CaXRzUGVyQ29tcG9uZW50ID0gQml0c1BlckNvbXBvbmVudDsKKyAgICAgIG1fQ29sdW1ucyA9IENvbHVtbnM7CisgICAgICBtX1ByZWRpY3RQaXRjaCA9CisgICAgICAgICAgKHN0YXRpY19jYXN0PEZYX0RXT1JEPihtX0JpdHNQZXJDb21wb25lbnQpICogbV9Db2xvcnMgKiBtX0NvbHVtbnMgKworICAgICAgICAgICA3KSAvCisgICAgICAgICAgODsKKyAgICAgIG1fcExhc3RMaW5lID0gRlhfQWxsb2ModWludDhfdCwgbV9QcmVkaWN0UGl0Y2gpOworICAgICAgbV9wUHJlZGljdFJhdyA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fUHJlZGljdFBpdGNoICsgMSk7CisgICAgICBtX3BQcmVkaWN0QnVmZmVyID0gRlhfQWxsb2ModWludDhfdCwgbV9QcmVkaWN0UGl0Y2gpOworICAgIH0KKyAgfQorfQorRlhfQk9PTCBDQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXI6OnZfUmV3aW5kKCkgeworICBpZiAobV9wRmxhdGUpIHsKKyAgICBGUERGQVBJX0ZsYXRlRW5kKG1fcEZsYXRlKTsKKyAgfQorICBtX3BGbGF0ZSA9IEZQREZBUElfRmxhdGVJbml0KG15X2FsbG9jX2Z1bmMsIG15X2ZyZWVfZnVuYyk7CisgIGlmICghbV9wRmxhdGUpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlBERkFQSV9GbGF0ZUlucHV0KG1fcEZsYXRlLCBtX1NyY0J1ZiwgbV9TcmNTaXplKTsKKyAgbV9MZWZ0T3ZlciA9IDA7CisgIHJldHVybiBUUlVFOworfQordWludDhfdCogQ0NvZGVjX0ZsYXRlU2NhbmxpbmVEZWNvZGVyOjp2X0dldE5leHRMaW5lKCkgeworICBpZiAobV9QcmVkaWN0b3IpIHsKKyAgICBpZiAobV9QaXRjaCA9PSBtX1ByZWRpY3RQaXRjaCkgeworICAgICAgaWYgKG1fUHJlZGljdG9yID09IDIpIHsKKyAgICAgICAgRlBERkFQSV9GbGF0ZU91dHB1dChtX3BGbGF0ZSwgbV9wUHJlZGljdFJhdywgbV9QcmVkaWN0UGl0Y2ggKyAxKTsKKyAgICAgICAgUE5HX1ByZWRpY3RMaW5lKG1fcFNjYW5saW5lLCBtX3BQcmVkaWN0UmF3LCBtX3BMYXN0TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fQml0c1BlckNvbXBvbmVudCwgbV9Db2xvcnMsIG1fQ29sdW1ucyk7CisgICAgICAgIEZYU1lTX21lbWNweShtX3BMYXN0TGluZSwgbV9wU2NhbmxpbmUsIG1fUHJlZGljdFBpdGNoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZQREZBUElfRmxhdGVPdXRwdXQobV9wRmxhdGUsIG1fcFNjYW5saW5lLCBtX1BpdGNoKTsKKyAgICAgICAgVElGRl9QcmVkaWN0TGluZShtX3BTY2FubGluZSwgbV9QcmVkaWN0UGl0Y2gsIG1fYnBjLCBtX25Db21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX091dHB1dFdpZHRoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc2l6ZV90IGJ5dGVzX3RvX2dvID0gbV9QaXRjaDsKKyAgICAgIHNpemVfdCByZWFkX2xlZnRvdmVyID0KKyAgICAgICAgICBtX0xlZnRPdmVyID4gYnl0ZXNfdG9fZ28gPyBieXRlc190b19nbyA6IG1fTGVmdE92ZXI7CisgICAgICBpZiAocmVhZF9sZWZ0b3ZlcikgeworICAgICAgICBGWFNZU19tZW1jcHkobV9wU2NhbmxpbmUsCisgICAgICAgICAgICAgICAgICAgICBtX3BQcmVkaWN0QnVmZmVyICsgbV9QcmVkaWN0UGl0Y2ggLSBtX0xlZnRPdmVyLAorICAgICAgICAgICAgICAgICAgICAgcmVhZF9sZWZ0b3Zlcik7CisgICAgICAgIG1fTGVmdE92ZXIgLT0gcmVhZF9sZWZ0b3ZlcjsKKyAgICAgICAgYnl0ZXNfdG9fZ28gLT0gcmVhZF9sZWZ0b3ZlcjsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChieXRlc190b19nbykgeworICAgICAgICBpZiAobV9QcmVkaWN0b3IgPT0gMikgeworICAgICAgICAgIEZQREZBUElfRmxhdGVPdXRwdXQobV9wRmxhdGUsIG1fcFByZWRpY3RSYXcsIG1fUHJlZGljdFBpdGNoICsgMSk7CisgICAgICAgICAgUE5HX1ByZWRpY3RMaW5lKG1fcFByZWRpY3RCdWZmZXIsIG1fcFByZWRpY3RSYXcsIG1fcExhc3RMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtX0JpdHNQZXJDb21wb25lbnQsIG1fQ29sb3JzLCBtX0NvbHVtbnMpOworICAgICAgICAgIEZYU1lTX21lbWNweShtX3BMYXN0TGluZSwgbV9wUHJlZGljdEJ1ZmZlciwgbV9QcmVkaWN0UGl0Y2gpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEZQREZBUElfRmxhdGVPdXRwdXQobV9wRmxhdGUsIG1fcFByZWRpY3RCdWZmZXIsIG1fUHJlZGljdFBpdGNoKTsKKyAgICAgICAgICBUSUZGX1ByZWRpY3RMaW5lKG1fcFByZWRpY3RCdWZmZXIsIG1fUHJlZGljdFBpdGNoLCBtX0JpdHNQZXJDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0NvbG9ycywgbV9Db2x1bW5zKTsKKyAgICAgICAgfQorICAgICAgICBzaXplX3QgcmVhZF9ieXRlcyA9CisgICAgICAgICAgICBtX1ByZWRpY3RQaXRjaCA+IGJ5dGVzX3RvX2dvID8gYnl0ZXNfdG9fZ28gOiBtX1ByZWRpY3RQaXRjaDsKKyAgICAgICAgRlhTWVNfbWVtY3B5KG1fcFNjYW5saW5lICsgbV9QaXRjaCAtIGJ5dGVzX3RvX2dvLCBtX3BQcmVkaWN0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgcmVhZF9ieXRlcyk7CisgICAgICAgIG1fTGVmdE92ZXIgKz0gbV9QcmVkaWN0UGl0Y2ggLSByZWFkX2J5dGVzOworICAgICAgICBieXRlc190b19nbyAtPSByZWFkX2J5dGVzOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBGUERGQVBJX0ZsYXRlT3V0cHV0KG1fcEZsYXRlLCBtX3BTY2FubGluZSwgbV9QaXRjaCk7CisgIH0KKyAgcmV0dXJuIG1fcFNjYW5saW5lOworfQorRlhfRFdPUkQgQ0NvZGVjX0ZsYXRlU2NhbmxpbmVEZWNvZGVyOjpHZXRTcmNPZmZzZXQoKSB7CisgIHJldHVybiBGUERGQVBJX0ZsYXRlR2V0VG90YWxJbihtX3BGbGF0ZSk7Cit9CisKK0lDb2RlY19TY2FubGluZURlY29kZXIqIENDb2RlY19GbGF0ZU1vZHVsZTo6Q3JlYXRlRGVjb2RlcigKKyAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgIGludCB3aWR0aCwKKyAgICBpbnQgaGVpZ2h0LAorICAgIGludCBuQ29tcHMsCisgICAgaW50IGJwYywKKyAgICBpbnQgcHJlZGljdG9yLAorICAgIGludCBDb2xvcnMsCisgICAgaW50IEJpdHNQZXJDb21wb25lbnQsCisgICAgaW50IENvbHVtbnMpIHsKKyAgQ0NvZGVjX0ZsYXRlU2NhbmxpbmVEZWNvZGVyKiBwRGVjb2RlciA9IG5ldyBDQ29kZWNfRmxhdGVTY2FubGluZURlY29kZXI7CisgIHBEZWNvZGVyLT5DcmVhdGUoc3JjX2J1Ziwgc3JjX3NpemUsIHdpZHRoLCBoZWlnaHQsIG5Db21wcywgYnBjLCBwcmVkaWN0b3IsCisgICAgICAgICAgICAgICAgICAgQ29sb3JzLCBCaXRzUGVyQ29tcG9uZW50LCBDb2x1bW5zKTsKKyAgcmV0dXJuIHBEZWNvZGVyOworfQorRlhfRFdPUkQgQ0NvZGVjX0ZsYXRlTW9kdWxlOjpGbGF0ZU9yTFpXRGVjb2RlKEZYX0JPT0wgYkxaVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkVhcmx5Q2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVkaWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQml0c1BlckNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBlc3RpbWF0ZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRlc3Rfc2l6ZSkgeworICBkZXN0X2J1ZiA9IE5VTEw7CisgIEZYX0RXT1JEIG9mZnNldCA9IDA7CisgIGludCBwcmVkaWN0b3JfdHlwZSA9IDA7CisgIGlmIChwcmVkaWN0b3IpIHsKKyAgICBpZiAocHJlZGljdG9yID49IDEwKSB7CisgICAgICBwcmVkaWN0b3JfdHlwZSA9IDI7CisgICAgfSBlbHNlIGlmIChwcmVkaWN0b3IgPT0gMikgeworICAgICAgcHJlZGljdG9yX3R5cGUgPSAxOworICAgIH0KKyAgfQorICBpZiAoYkxaVykgeworICAgIHsKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDTFpXRGVjb2Rlcj4gZGVjb2RlcihuZXcgQ0xaV0RlY29kZXIpOworICAgICAgZGVzdF9zaXplID0gKEZYX0RXT1JEKS0xOworICAgICAgb2Zmc2V0ID0gc3JjX3NpemU7CisgICAgICBpbnQgZXJyID0gZGVjb2Rlci0+RGVjb2RlKE5VTEwsIGRlc3Rfc2l6ZSwgc3JjX2J1Ziwgb2Zmc2V0LCBiRWFybHlDaGFuZ2UpOworICAgICAgaWYgKGVyciB8fCBkZXN0X3NpemUgPT0gMCB8fCBkZXN0X3NpemUgKyAxIDwgZGVzdF9zaXplKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgc3RkOjp1bmlxdWVfcHRyPENMWldEZWNvZGVyPiBkZWNvZGVyKG5ldyBDTFpXRGVjb2Rlcik7CisgICAgICBkZXN0X2J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIGRlc3Rfc2l6ZSArIDEpOworICAgICAgZGVzdF9idWZbZGVzdF9zaXplXSA9ICdcMCc7CisgICAgICBkZWNvZGVyLT5EZWNvZGUoZGVzdF9idWYsIGRlc3Rfc2l6ZSwgc3JjX2J1Ziwgb2Zmc2V0LCBiRWFybHlDaGFuZ2UpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBGbGF0ZVVuY29tcHJlc3Moc3JjX2J1Ziwgc3JjX3NpemUsIGVzdGltYXRlZF9zaXplLCBkZXN0X2J1ZiwgZGVzdF9zaXplLAorICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOworICB9CisgIGlmIChwcmVkaWN0b3JfdHlwZSA9PSAwKSB7CisgICAgcmV0dXJuIG9mZnNldDsKKyAgfQorICBGWF9CT09MIHJldCA9IFRSVUU7CisgIGlmIChwcmVkaWN0b3JfdHlwZSA9PSAyKSB7CisgICAgcmV0ID0gUE5HX1ByZWRpY3RvcihkZXN0X2J1ZiwgZGVzdF9zaXplLCBDb2xvcnMsIEJpdHNQZXJDb21wb25lbnQsIENvbHVtbnMpOworICB9IGVsc2UgaWYgKHByZWRpY3Rvcl90eXBlID09IDEpIHsKKyAgICByZXQgPQorICAgICAgICBUSUZGX1ByZWRpY3RvcihkZXN0X2J1ZiwgZGVzdF9zaXplLCBDb2xvcnMsIEJpdHNQZXJDb21wb25lbnQsIENvbHVtbnMpOworICB9CisgIHJldHVybiByZXQgPyBvZmZzZXQgOiAtMTsKK30KK0ZYX0JPT0wgQ0NvZGVjX0ZsYXRlTW9kdWxlOjpFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVkaWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2xvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCaXRzUGVyQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZGVzdF9zaXplKSB7CisgIGlmIChwcmVkaWN0b3IgIT0gMiAmJiBwcmVkaWN0b3IgPCAxMCkgeworICAgIHJldHVybiBFbmNvZGUoc3JjX2J1Ziwgc3JjX3NpemUsIGRlc3RfYnVmLCBkZXN0X3NpemUpOworICB9CisgIHVpbnQ4X3QqIHBTcmNCdWYgPSBOVUxMOworICBwU3JjQnVmID0gRlhfQWxsb2ModWludDhfdCwgc3JjX3NpemUpOworICBGWFNZU19tZW1jcHkocFNyY0J1Ziwgc3JjX2J1Ziwgc3JjX3NpemUpOworICBGWF9CT09MIHJldCA9IFRSVUU7CisgIGlmIChwcmVkaWN0b3IgPT0gMikgeworICAgIHJldCA9IFRJRkZfUHJlZGljdG9yRW5jb2RlKHBTcmNCdWYsIHNyY19zaXplLCBDb2xvcnMsIEJpdHNQZXJDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1ucyk7CisgIH0gZWxzZSBpZiAocHJlZGljdG9yID49IDEwKSB7CisgICAgcmV0ID0gUE5HX1ByZWRpY3RvckVuY29kZShwU3JjQnVmLCBzcmNfc2l6ZSwgcHJlZGljdG9yLCBDb2xvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzUGVyQ29tcG9uZW50LCBDb2x1bW5zKTsKKyAgfQorICBpZiAocmV0KQorICAgIHJldCA9IEVuY29kZShwU3JjQnVmLCBzcmNfc2l6ZSwgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7CisgIEZYX0ZyZWUocFNyY0J1Zik7CisgIHJldHVybiByZXQ7Cit9CitGWF9CT09MIENDb2RlY19GbGF0ZU1vZHVsZTo6RW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpIHsKKyAgZGVzdF9zaXplID0gc3JjX3NpemUgKyBzcmNfc2l6ZSAvIDEwMDAgKyAxMjsKKyAgZGVzdF9idWYgPSBGWF9BbGxvYyh1aW50OF90LCBkZXN0X3NpemUpOworICB1bnNpZ25lZCBsb25nIHRlbXBfc2l6ZSA9IGRlc3Rfc2l6ZTsKKyAgRlBERkFQSV9GbGF0ZUNvbXByZXNzKGRlc3RfYnVmLCAmdGVtcF9zaXplLCBzcmNfYnVmLCBzcmNfc2l6ZSk7CisgIGRlc3Rfc2l6ZSA9IChGWF9EV09SRCl0ZW1wX3NpemU7CisgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19naWYuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19naWYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YWViMDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2dpZi5jcHAKQEAgLTAsMCArMSwxODkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiDQorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2RpYi5oIg0KKyNpbmNsdWRlICJjb2RlY19pbnQuaCINCisjaW5jbHVkZSAiY29yZS9zcmMvZnhjb2RlYy9sZ2lmL2Z4X2dpZi5oIg0KK3N0cnVjdCBGWEdJRl9Db250ZXh0IHsNCisgIGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHI7DQorICB2b2lkKiBwYXJlbnRfcHRyOw0KKyAgdm9pZCogY2hpbGRfcHRyOw0KKw0KKyAgdm9pZCogKCptX0FsbG9jRnVuYykodW5zaWduZWQgaW50KTsNCisgIHZvaWQgKCptX0ZyZWVGdW5jKSh2b2lkKik7DQorfTsNCitleHRlcm4gIkMiIHsNCitzdGF0aWMgdm9pZCogX2dpZl9hbGxvY19mdW5jKHVuc2lnbmVkIGludCBzaXplKSB7DQorICByZXR1cm4gRlhfQWxsb2MoY2hhciwgc2l6ZSk7DQorfQ0KK3N0YXRpYyB2b2lkIF9naWZfZnJlZV9mdW5jKHZvaWQqIHApIHsNCisgIGlmIChwICE9IE5VTEwpIHsNCisgICAgRlhfRnJlZShwKTsNCisgIH0NCit9DQorfTsNCitzdGF0aWMgdm9pZCBfZ2lmX2Vycm9yX2RhdGEoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogZXJyX21zZykgew0KKyAgRlhTWVNfc3RybmNweSgoY2hhciopZ2lmX3B0ci0+ZXJyX3B0ciwgZXJyX21zZywgR0lGX01BWF9FUlJPUl9TSVpFIC0gMSk7DQorICBsb25nam1wKGdpZl9wdHItPmptcGJ1ZiwgMSk7DQorfQ0KK3N0YXRpYyB1aW50OF90KiBfZ2lmX2Fza19idWZfZm9yX3BhbChnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBhbF9zaXplKSB7DQorICBGWEdJRl9Db250ZXh0KiBwID0gKEZYR0lGX0NvbnRleHQqKWdpZl9wdHItPmNvbnRleHRfcHRyOw0KKyAgQ0NvZGVjX0dpZk1vZHVsZSogcE1vZHVsZSA9IChDQ29kZWNfR2lmTW9kdWxlKilwLT5wYXJlbnRfcHRyOw0KKyAgcmV0dXJuIHBNb2R1bGUtPkFza0xvY2FsUGFsZXR0ZUJ1ZkNhbGxiYWNrKA0KKyAgICAgIHAtPmNoaWxkX3B0ciwgX2dpZl9nZXRfZnJhbWVfbnVtKGdpZl9wdHIpLCBwYWxfc2l6ZSk7DQorfQ0KK3N0YXRpYyB2b2lkIF9naWZfcmVjb3JkX2N1cnJlbnRfcG9zaXRpb24oZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBjdXJfcG9zX3B0cikgew0KKyAgRlhHSUZfQ29udGV4dCogcCA9IChGWEdJRl9Db250ZXh0KilnaWZfcHRyLT5jb250ZXh0X3B0cjsNCisgIENDb2RlY19HaWZNb2R1bGUqIHBNb2R1bGUgPSAoQ0NvZGVjX0dpZk1vZHVsZSopcC0+cGFyZW50X3B0cjsNCisgIHBNb2R1bGUtPlJlY29yZEN1cnJlbnRQb3NpdGlvbkNhbGxiYWNrKHAtPmNoaWxkX3B0ciwgKmN1cl9wb3NfcHRyKTsNCit9DQorc3RhdGljIHZvaWQgX2dpZl9yZWFkX3NjYW5saW5lKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm93X251bSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcm93X2J1Zikgew0KKyAgRlhHSUZfQ29udGV4dCogcCA9IChGWEdJRl9Db250ZXh0KilnaWZfcHRyLT5jb250ZXh0X3B0cjsNCisgIENDb2RlY19HaWZNb2R1bGUqIHBNb2R1bGUgPSAoQ0NvZGVjX0dpZk1vZHVsZSopcC0+cGFyZW50X3B0cjsNCisgIHBNb2R1bGUtPlJlYWRTY2FubGluZUNhbGxiYWNrKHAtPmNoaWxkX3B0ciwgcm93X251bSwgcm93X2J1Zik7DQorfQ0KK3N0YXRpYyBGWF9CT09MIF9naWZfZ2V0X3JlY29yZF9wb3NpdGlvbihnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjdXJfcG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwYWxfbnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYWxfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlbGF5X3RpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgdXNlcl9pbnB1dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0cmFuc19pbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkaXNwb3NhbF9tZXRob2QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaW50ZXJsYWNlKSB7DQorICBGWEdJRl9Db250ZXh0KiBwID0gKEZYR0lGX0NvbnRleHQqKWdpZl9wdHItPmNvbnRleHRfcHRyOw0KKyAgQ0NvZGVjX0dpZk1vZHVsZSogcE1vZHVsZSA9IChDQ29kZWNfR2lmTW9kdWxlKilwLT5wYXJlbnRfcHRyOw0KKyAgcmV0dXJuIHBNb2R1bGUtPklucHV0UmVjb3JkUG9zaXRpb25CdWZDYWxsYmFjaygNCisgICAgICBwLT5jaGlsZF9wdHIsIGN1cl9wb3MsIEZYX1JFQ1QobGVmdCwgdG9wLCBsZWZ0ICsgd2lkdGgsIHRvcCArIGhlaWdodCksDQorICAgICAgcGFsX251bSwgcGFsX3B0ciwgZGVsYXlfdGltZSwgdXNlcl9pbnB1dCwgdHJhbnNfaW5kZXgsIGRpc3Bvc2FsX21ldGhvZCwNCisgICAgICBpbnRlcmxhY2UpOw0KK30NCit2b2lkKiBDQ29kZWNfR2lmTW9kdWxlOjpTdGFydCh2b2lkKiBwTW9kdWxlKSB7DQorICBGWEdJRl9Db250ZXh0KiBwID0gKEZYR0lGX0NvbnRleHQqKUZYX0FsbG9jKHVpbnQ4X3QsIHNpemVvZihGWEdJRl9Db250ZXh0KSk7DQorICBpZiAocCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgRlhTWVNfbWVtc2V0KHAsIDAsIHNpemVvZihGWEdJRl9Db250ZXh0KSk7DQorICBwLT5tX0FsbG9jRnVuYyA9IF9naWZfYWxsb2NfZnVuYzsNCisgIHAtPm1fRnJlZUZ1bmMgPSBfZ2lmX2ZyZWVfZnVuYzsNCisgIHAtPmdpZl9wdHIgPSBOVUxMOw0KKyAgcC0+cGFyZW50X3B0ciA9ICh2b2lkKil0aGlzOw0KKyAgcC0+Y2hpbGRfcHRyID0gcE1vZHVsZTsNCisgIHAtPmdpZl9wdHIgPSBfZ2lmX2NyZWF0ZV9kZWNvbXByZXNzKCk7DQorICBpZiAocC0+Z2lmX3B0ciA9PSBOVUxMKSB7DQorICAgIEZYX0ZyZWUocCk7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcC0+Z2lmX3B0ci0+Y29udGV4dF9wdHIgPSAodm9pZCopcDsNCisgIHAtPmdpZl9wdHItPmVycl9wdHIgPSBtX3N6TGFzdEVycm9yOw0KKyAgcC0+Z2lmX3B0ci0+X2dpZl9lcnJvcl9mbiA9IF9naWZfZXJyb3JfZGF0YTsNCisgIHAtPmdpZl9wdHItPl9naWZfYXNrX2J1Zl9mb3JfcGFsX2ZuID0gX2dpZl9hc2tfYnVmX2Zvcl9wYWw7DQorICBwLT5naWZfcHRyLT5fZ2lmX3JlY29yZF9jdXJyZW50X3Bvc2l0aW9uX2ZuID0gX2dpZl9yZWNvcmRfY3VycmVudF9wb3NpdGlvbjsNCisgIHAtPmdpZl9wdHItPl9naWZfZ2V0X3Jvd19mbiA9IF9naWZfcmVhZF9zY2FubGluZTsNCisgIHAtPmdpZl9wdHItPl9naWZfZ2V0X3JlY29yZF9wb3NpdGlvbl9mbiA9IF9naWZfZ2V0X3JlY29yZF9wb3NpdGlvbjsNCisgIHJldHVybiBwOw0KK30NCit2b2lkIENDb2RlY19HaWZNb2R1bGU6OkZpbmlzaCh2b2lkKiBwQ29udGV4dCkgew0KKyAgRlhHSUZfQ29udGV4dCogcCA9IChGWEdJRl9Db250ZXh0KilwQ29udGV4dDsNCisgIGlmIChwICE9IE5VTEwpIHsNCisgICAgX2dpZl9kZXN0cm95X2RlY29tcHJlc3MoJnAtPmdpZl9wdHIpOw0KKyAgICBwLT5tX0ZyZWVGdW5jKHApOw0KKyAgfQ0KK30NCitpbnQzMl90IENDb2RlY19HaWZNb2R1bGU6OlJlYWRIZWFkZXIodm9pZCogcENvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHBhbF9udW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBwYWxfcHAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogYmdfaW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpIHsNCisgIEZYR0lGX0NvbnRleHQqIHAgPSAoRlhHSUZfQ29udGV4dCopcENvbnRleHQ7DQorICBpZiAoc2V0am1wKHAtPmdpZl9wdHItPmptcGJ1ZikpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpbnQzMl90IHJldCA9IF9naWZfcmVhZF9oZWFkZXIocC0+Z2lmX3B0cik7DQorICBpZiAocmV0ICE9IDEpIHsNCisgICAgcmV0dXJuIHJldDsNCisgIH0NCisgIGlmIChwQXR0cmlidXRlKSB7DQorICB9DQorICAqd2lkdGggPSBwLT5naWZfcHRyLT53aWR0aDsNCisgICpoZWlnaHQgPSBwLT5naWZfcHRyLT5oZWlnaHQ7DQorICAqcGFsX251bSA9IHAtPmdpZl9wdHItPmdsb2JhbF9wYWxfbnVtOw0KKyAgKnBhbF9wcCA9IHAtPmdpZl9wdHItPmdsb2JhbF9wYWxfcHRyOw0KKyAgKmJnX2luZGV4ID0gcC0+Z2lmX3B0ci0+YmNfaW5kZXg7DQorICByZXR1cm4gMTsNCit9DQoraW50MzJfdCBDQ29kZWNfR2lmTW9kdWxlOjpMb2FkRnJhbWVJbmZvKHZvaWQqIHBDb250ZXh0LCBpbnQqIGZyYW1lX251bSkgew0KKyAgRlhHSUZfQ29udGV4dCogcCA9IChGWEdJRl9Db250ZXh0KilwQ29udGV4dDsNCisgIGlmIChzZXRqbXAocC0+Z2lmX3B0ci0+am1wYnVmKSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGludDMyX3QgcmV0ID0gX2dpZl9nZXRfZnJhbWUocC0+Z2lmX3B0cik7DQorICBpZiAocmV0ICE9IDEpIHsNCisgICAgcmV0dXJuIHJldDsNCisgIH0NCisgICpmcmFtZV9udW0gPSBfZ2lmX2dldF9mcmFtZV9udW0ocC0+Z2lmX3B0cik7DQorICByZXR1cm4gMTsNCit9DQoraW50MzJfdCBDQ29kZWNfR2lmTW9kdWxlOjpMb2FkRnJhbWUodm9pZCogcENvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX251bSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKSB7DQorICBGWEdJRl9Db250ZXh0KiBwID0gKEZYR0lGX0NvbnRleHQqKXBDb250ZXh0Ow0KKyAgaWYgKHNldGptcChwLT5naWZfcHRyLT5qbXBidWYpKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaW50MzJfdCByZXQgPSBfZ2lmX2xvYWRfZnJhbWUocC0+Z2lmX3B0ciwgZnJhbWVfbnVtKTsNCisgIGlmIChyZXQgPT0gMSkgew0KKyAgICBpZiAocEF0dHJpYnV0ZSkgew0KKyAgICAgIHBBdHRyaWJ1dGUtPm1fbkdpZkxlZnQgPQ0KKyAgICAgICAgICBwLT5naWZfcHRyLT5pbWdfcHRyX2Fycl9wdHItPkdldEF0KGZyYW1lX251bSktPmltYWdlX2luZm9fcHRyLT5sZWZ0Ow0KKyAgICAgIHBBdHRyaWJ1dGUtPm1fbkdpZlRvcCA9DQorICAgICAgICAgIHAtPmdpZl9wdHItPmltZ19wdHJfYXJyX3B0ci0+R2V0QXQoZnJhbWVfbnVtKS0+aW1hZ2VfaW5mb19wdHItPnRvcDsNCisgICAgICBwQXR0cmlidXRlLT5tX2ZBc3BlY3RSYXRpbyA9IHAtPmdpZl9wdHItPnBpeGVsX2FzcGVjdDsNCisgICAgICBpZiAocC0+Z2lmX3B0ci0+Y210X2RhdGFfcHRyKSB7DQorICAgICAgICBjb25zdCB1aW50OF90KiBidWYgPQ0KKyAgICAgICAgICAgIChjb25zdCB1aW50OF90KilwLT5naWZfcHRyLT5jbXRfZGF0YV9wdHItPkdldEJ1ZmZlcigwKTsNCisgICAgICAgIEZYX0RXT1JEIGxlbiA9IHAtPmdpZl9wdHItPmNtdF9kYXRhX3B0ci0+R2V0TGVuZ3RoKCk7DQorICAgICAgICBpZiAobGVuID4gMjEpIHsNCisgICAgICAgICAgdWludDhfdCBzaXplID0gKmJ1ZisrOw0KKyAgICAgICAgICBpZiAoc2l6ZSkgew0KKyAgICAgICAgICAgIHBBdHRyaWJ1dGUtPm1fc3RyQXV0aG9yID0gQ0ZYX0J5dGVTdHJpbmcoYnVmLCBzaXplKTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBwQXR0cmlidXRlLT5tX3N0ckF1dGhvci5FbXB0eSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJ1ZiArPSBzaXplOw0KKyAgICAgICAgICBzaXplID0gKmJ1ZisrOw0KKyAgICAgICAgICBpZiAoc2l6ZSA9PSAyMCkgew0KKyAgICAgICAgICAgIEZYU1lTX21lbWNweShwQXR0cmlidXRlLT5tX3N0clRpbWUsIGJ1Ziwgc2l6ZSk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiByZXQ7DQorfQ0KK0ZYX0RXT1JEIENDb2RlY19HaWZNb2R1bGU6OkdldEF2YWlsSW5wdXQodm9pZCogcENvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogYXZpYWxfYnVmX3B0cikgew0KKyAgRlhHSUZfQ29udGV4dCogcCA9IChGWEdJRl9Db250ZXh0KilwQ29udGV4dDsNCisgIHJldHVybiBfZ2lmX2dldF9hdmFpbF9pbnB1dChwLT5naWZfcHRyLCBhdmlhbF9idWZfcHRyKTsNCit9DQordm9pZCBDQ29kZWNfR2lmTW9kdWxlOjpJbnB1dCh2b2lkKiBwQ29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSkgew0KKyAgRlhHSUZfQ29udGV4dCogcCA9IChGWEdJRl9Db250ZXh0KilwQ29udGV4dDsNCisgIF9naWZfaW5wdXRfYnVmZmVyKHAtPmdpZl9wdHIsICh1aW50OF90KilzcmNfYnVmLCBzcmNfc2l6ZSk7DQorfQ0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfaWNjLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfaWNjLmNwcAppbmRleCAyNmI0YzFhLi43YWU1OWE2IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ljYy5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19pY2MuY3BwCkBAIC0xLDEzNjkgKzEsMTk4MCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCiAjaW5jbHVkZSAiY29kZWNfaW50LmgiCi0jaW5jbHVkZSAiLi4vbGNtczIvaW5jbHVkZS9meF9sY21zMi5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbGNtczItMi42L2luY2x1ZGUvbGNtczIuaCIKKwogY29uc3QgRlhfRFdPUkQgTl9DT01QT05FTlRfTEFCID0gMzsKIGNvbnN0IEZYX0RXT1JEIE5fQ09NUE9ORU5UX0dSQVkgPSAxOwogY29uc3QgRlhfRFdPUkQgTl9DT01QT05FTlRfUkdCID0gMzsKIGNvbnN0IEZYX0RXT1JEIE5fQ09NUE9ORU5UX0NNWUsgPSA0OwogY29uc3QgRlhfRFdPUkQgTl9DT01QT05FTlRfREVGQVVMVCA9IDM7CiAKLUZYX0JPT0wgTUQ1Q29tcHV0ZUlEKCBGWF9MUENWT0lEIGJ1ZiwgRlhfRFdPUkQgZHdTaXplLCBGWF9CWVRFIElEWzE2XSApCi17Ci0gICAgcmV0dXJuIGNtc01ENWNvbXB1dGVJREV4dChidWYsIGR3U2l6ZSwgSUQpOworRlhfQk9PTCBNRDVDb21wdXRlSUQoY29uc3Qgdm9pZCogYnVmLCBGWF9EV09SRCBkd1NpemUsIHVpbnQ4X3QgSURbMTZdKSB7CisgIHJldHVybiBjbXNNRDVjb21wdXRlSURFeHQoYnVmLCBkd1NpemUsIElEKTsKIH0KLXN0cnVjdCBDTGNtc0NtbSAgewotICAgIGNtc0hUUkFOU0ZPUk0gbV9oVHJhbnNmb3JtOwotICAgIGludAkJCW1fblNyY0NvbXBvbmVudHM7Ci0gICAgaW50CQkJbV9uRHN0Q29tcG9uZW50czsKLSAgICBGWF9CT09MCQltX2JMYWI7CitzdHJ1Y3QgQ0xjbXNDbW0geworICBjbXNIVFJBTlNGT1JNIG1faFRyYW5zZm9ybTsKKyAgaW50IG1fblNyY0NvbXBvbmVudHM7CisgIGludCBtX25Ec3RDb21wb25lbnRzOworICBGWF9CT09MIG1fYkxhYjsKIH07CiBleHRlcm4gIkMiIHsKLSAgICBpbnQgb3VySGFuZGxlcihpbnQgRXJyb3JDb2RlLCBjb25zdCBjaGFyICpFcnJvclRleHQpCi0gICAgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9CitpbnQgb3VySGFuZGxlcihpbnQgRXJyb3JDb2RlLCBjb25zdCBjaGFyKiBFcnJvclRleHQpIHsKKyAgcmV0dXJuIFRSVUU7Cit9CiB9OwotRlhfQk9PTCBDaGVja0NvbXBvbmVudHMoY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBjcywgaW50IG5Db21wb25lbnRzLCBGWF9CT09MIGJEc3QpCi17Ci0gICAgaWYgKG5Db21wb25lbnRzIDw9IDAgfHwgbkNvbXBvbmVudHMgPiAxNSkgeworRlhfQk9PTCBDaGVja0NvbXBvbmVudHMoY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBjcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29tcG9uZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRzdCkgeworICBpZiAobkNvbXBvbmVudHMgPD0gMCB8fCBuQ29tcG9uZW50cyA+IDE1KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHN3aXRjaCAoY3MpIHsKKyAgICBjYXNlIGNtc1NpZ0xhYkRhdGE6CisgICAgICBpZiAobkNvbXBvbmVudHMgPCAzKSB7CiAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgc3dpdGNoKGNzKSB7Ci0gICAgICAgIGNhc2UgY21zU2lnTGFiRGF0YToKLSAgICAgICAgICAgIGlmIChuQ29tcG9uZW50cyA8IDMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBjbXNTaWdHcmF5RGF0YToKLSAgICAgICAgICAgIGlmIChiRHN0ICYmIG5Db21wb25lbnRzICE9IDEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFiRHN0ICYmIG5Db21wb25lbnRzID4gMikgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGNtc1NpZ1JnYkRhdGE6Ci0gICAgICAgICAgICBpZiAoYkRzdCAmJiBuQ29tcG9uZW50cyAhPSAzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgY21zU2lnQ215a0RhdGE6Ci0gICAgICAgICAgICBpZiAoYkRzdCAmJiBuQ29tcG9uZW50cyAhPSA0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAobkNvbXBvbmVudHMgIT0gMykgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgY21zU2lnR3JheURhdGE6CisgICAgICBpZiAoYkRzdCAmJiBuQ29tcG9uZW50cyAhPSAxKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGlmICghYkRzdCAmJiBuQ29tcG9uZW50cyA+IDIpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBjbXNTaWdSZ2JEYXRhOgorICAgICAgaWYgKGJEc3QgJiYgbkNvbXBvbmVudHMgIT0gMykgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIGNtc1NpZ0NteWtEYXRhOgorICAgICAgaWYgKGJEc3QgJiYgbkNvbXBvbmVudHMgIT0gNCkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKG5Db21wb25lbnRzICE9IDMpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9JTlQzMiBHZXRDU0NvbXBvbmVudHMoY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBjcykKLXsKLSAgICBGWF9EV09SRCBjb21wb25lbnRzOwotICAgIHN3aXRjaCAoY3MpIHsKLSAgICAgICAgY2FzZSBjbXNTaWdMYWJEYXRhOgotICAgICAgICAgICAgY29tcG9uZW50cyA9ICBOX0NPTVBPTkVOVF9MQUI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBjbXNTaWdHcmF5RGF0YToKLSAgICAgICAgICAgIGNvbXBvbmVudHMgPSAgTl9DT01QT05FTlRfR1JBWTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGNtc1NpZ1JnYkRhdGE6Ci0gICAgICAgICAgICBjb21wb25lbnRzID0gIE5fQ09NUE9ORU5UX1JHQjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGNtc1NpZ0NteWtEYXRhOgotICAgICAgICAgICAgY29tcG9uZW50cyA9ICBOX0NPTVBPTkVOVF9DTVlLOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBjb21wb25lbnRzID0gTl9DT01QT05FTlRfREVGQVVMVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gY29tcG9uZW50czsKK2ludDMyX3QgR2V0Q1NDb21wb25lbnRzKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgY3MpIHsKKyAgRlhfRFdPUkQgY29tcG9uZW50czsKKyAgc3dpdGNoIChjcykgeworICAgIGNhc2UgY21zU2lnTGFiRGF0YToKKyAgICAgIGNvbXBvbmVudHMgPSBOX0NPTVBPTkVOVF9MQUI7CisgICAgICBicmVhazsKKyAgICBjYXNlIGNtc1NpZ0dyYXlEYXRhOgorICAgICAgY29tcG9uZW50cyA9IE5fQ09NUE9ORU5UX0dSQVk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGNtc1NpZ1JnYkRhdGE6CisgICAgICBjb21wb25lbnRzID0gTl9DT01QT05FTlRfUkdCOworICAgICAgYnJlYWs7CisgICAgY2FzZSBjbXNTaWdDbXlrRGF0YToKKyAgICAgIGNvbXBvbmVudHMgPSBOX0NPTVBPTkVOVF9DTVlLOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGNvbXBvbmVudHMgPSBOX0NPTVBPTkVOVF9ERUZBVUxUOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGNvbXBvbmVudHM7CiB9Ci12b2lkKiBJY2NMaWJfQ3JlYXRlVHJhbnNmb3JtKGNvbnN0IHVuc2lnbmVkIGNoYXIqIHBTcmNQcm9maWxlRGF0YSwgRlhfRFdPUkQgZHdTcmNQcm9maWxlU2l6ZSwgRlhfSU5UMzImIG5TcmNDb21wb25lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBwRHN0UHJvZmlsZURhdGEsIEZYX0RXT1JEIGR3RHN0UHJvZmlsZVNpemUsIEZYX0lOVDMyIG5Ec3RDb21wb25lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW50ZW50LCBGWF9EV09SRCBkd1NyY0Zvcm1hdCA9IEljY19GT1JNQVRfREVGQVVMVCwgRlhfRFdPUkQgZHdEc3RGb3JtYXQgPSBJY2NfRk9STUFUX0RFRkFVTFQpCi17Ci0gICAgY21zSFBST0ZJTEUgc3JjUHJvZmlsZSA9IE5VTEw7Ci0gICAgY21zSFBST0ZJTEUgZHN0UHJvZmlsZSA9IE5VTEw7Ci0gICAgY21zSFRSQU5TRk9STSBoVHJhbnNmb3JtID0gTlVMTDsKLSAgICBDTGNtc0NtbSogcENtbSA9IE5VTEw7Ci0gICAgblNyY0NvbXBvbmVudHMgPSAwOwotICAgIHNyY1Byb2ZpbGUgPSBjbXNPcGVuUHJvZmlsZUZyb21NZW0oKHZvaWQqKXBTcmNQcm9maWxlRGF0YSwgZHdTcmNQcm9maWxlU2l6ZSk7Ci0gICAgaWYgKHNyY1Byb2ZpbGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKK3ZvaWQqIEljY0xpYl9DcmVhdGVUcmFuc2Zvcm0oY29uc3QgdW5zaWduZWQgY2hhciogcFNyY1Byb2ZpbGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1NyY1Byb2ZpbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuU3JjQ29tcG9uZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogcERzdFByb2ZpbGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0RzdFByb2ZpbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Ec3RDb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW50ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1NyY0Zvcm1hdCA9IEljY19GT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdEc3RGb3JtYXQgPSBJY2NfRk9STUFUX0RFRkFVTFQpIHsKKyAgY21zSFBST0ZJTEUgc3JjUHJvZmlsZSA9IE5VTEw7CisgIGNtc0hQUk9GSUxFIGRzdFByb2ZpbGUgPSBOVUxMOworICBjbXNIVFJBTlNGT1JNIGhUcmFuc2Zvcm0gPSBOVUxMOworICBDTGNtc0NtbSogcENtbSA9IE5VTEw7CisgIG5TcmNDb21wb25lbnRzID0gMDsKKyAgc3JjUHJvZmlsZSA9IGNtc09wZW5Qcm9maWxlRnJvbU1lbSgodm9pZCopcFNyY1Byb2ZpbGVEYXRhLCBkd1NyY1Byb2ZpbGVTaXplKTsKKyAgaWYgKCFzcmNQcm9maWxlKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKCFwRHN0UHJvZmlsZURhdGEgJiYgZHdEc3RQcm9maWxlU2l6ZSA9PSAwICYmIG5Ec3RDb21wb25lbnRzID09IDMpIHsKKyAgICBkc3RQcm9maWxlID0gY21zQ3JlYXRlX3NSR0JQcm9maWxlKCk7CisgIH0gZWxzZSB7CisgICAgZHN0UHJvZmlsZSA9CisgICAgICAgIGNtc09wZW5Qcm9maWxlRnJvbU1lbSgodm9pZCopcERzdFByb2ZpbGVEYXRhLCBkd0RzdFByb2ZpbGVTaXplKTsKKyAgfQorICBpZiAoIWRzdFByb2ZpbGUpIHsKKyAgICBjbXNDbG9zZVByb2ZpbGUoc3JjUHJvZmlsZSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaW50IHNyY0Zvcm1hdDsKKyAgRlhfQk9PTCBiTGFiID0gRkFMU0U7CisgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgc3JjQ1MgPSBjbXNHZXRDb2xvclNwYWNlKHNyY1Byb2ZpbGUpOworICBuU3JjQ29tcG9uZW50cyA9IEdldENTQ29tcG9uZW50cyhzcmNDUyk7CisgIGlmIChzcmNDUyA9PSBjbXNTaWdMYWJEYXRhKSB7CisgICAgc3JjRm9ybWF0ID0KKyAgICAgICAgQ09MT1JTUEFDRV9TSChQVF9MYWIpIHwgQ0hBTk5FTFNfU0goblNyY0NvbXBvbmVudHMpIHwgQllURVNfU0goMCk7CisgICAgYkxhYiA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgc3JjRm9ybWF0ID0KKyAgICAgICAgQ09MT1JTUEFDRV9TSChQVF9BTlkpIHwgQ0hBTk5FTFNfU0goblNyY0NvbXBvbmVudHMpIHwgQllURVNfU0goMSk7CisgICAgaWYgKHNyY0NTID09IGNtc1NpZ1JnYkRhdGEgJiYgVF9ET1NXQVAoZHdTcmNGb3JtYXQpKSB7CisgICAgICBzcmNGb3JtYXQgfD0gRE9TV0FQX1NIKDEpOwogICAgIH0KLSAgICBpZihwRHN0UHJvZmlsZURhdGEgPT0gTlVMTCAmJiBkd0RzdFByb2ZpbGVTaXplID09IDAgJiYgbkRzdENvbXBvbmVudHMgPT0gMykgewotICAgICAgICBkc3RQcm9maWxlID0gY21zQ3JlYXRlX3NSR0JQcm9maWxlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHN0UHJvZmlsZSA9IGNtc09wZW5Qcm9maWxlRnJvbU1lbSgodm9pZCopcERzdFByb2ZpbGVEYXRhLCBkd0RzdFByb2ZpbGVTaXplKTsKLSAgICB9Ci0gICAgaWYgKGRzdFByb2ZpbGUgPT0gTlVMTCkgewotICAgICAgICBjbXNDbG9zZVByb2ZpbGUoc3JjUHJvZmlsZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpbnQgc3JjRm9ybWF0OwotICAgIEZYX0JPT0wgYkxhYiA9IEZBTFNFOwotICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgc3JjQ1MgPSBjbXNHZXRDb2xvclNwYWNlKHNyY1Byb2ZpbGUpOwotICAgIG5TcmNDb21wb25lbnRzID0gR2V0Q1NDb21wb25lbnRzKHNyY0NTKTsKLSAgICBpZiAoc3JjQ1MgPT0gY21zU2lnTGFiRGF0YSkgewotICAgICAgICBzcmNGb3JtYXQgPSBDT0xPUlNQQUNFX1NIKFBUX0xhYikgfCBDSEFOTkVMU19TSChuU3JjQ29tcG9uZW50cykgfCBCWVRFU19TSCgwKTsKLSAgICAgICAgYkxhYiA9IFRSVUU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3JjRm9ybWF0ID0gQ09MT1JTUEFDRV9TSChQVF9BTlkpIHwgQ0hBTk5FTFNfU0goblNyY0NvbXBvbmVudHMpIHwgQllURVNfU0goMSk7Ci0gICAgICAgIGlmIChzcmNDUyA9PSBjbXNTaWdSZ2JEYXRhICYmIFRfRE9TV0FQKGR3U3JjRm9ybWF0KSkgewotICAgICAgICAgICAgc3JjRm9ybWF0IHw9IERPU1dBUF9TSCgxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIGRzdENTID0gY21zR2V0Q29sb3JTcGFjZShkc3RQcm9maWxlKTsKLSAgICBpZiAoIUNoZWNrQ29tcG9uZW50cyhkc3RDUywgbkRzdENvbXBvbmVudHMsIFRSVUUpKSB7Ci0gICAgICAgIGNtc0Nsb3NlUHJvZmlsZShzcmNQcm9maWxlKTsKLSAgICAgICAgY21zQ2xvc2VQcm9maWxlKGRzdFByb2ZpbGUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgc3dpdGNoKGRzdENTKSB7Ci0gICAgICAgIGNhc2UgY21zU2lnR3JheURhdGE6Ci0gICAgICAgICAgICBoVHJhbnNmb3JtID0gY21zQ3JlYXRlVHJhbnNmb3JtKHNyY1Byb2ZpbGUsIHNyY0Zvcm1hdCwgZHN0UHJvZmlsZSwgVFlQRV9HUkFZXzgsIGludGVudCwgMCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBjbXNTaWdSZ2JEYXRhOgotICAgICAgICAgICAgaFRyYW5zZm9ybSA9IGNtc0NyZWF0ZVRyYW5zZm9ybShzcmNQcm9maWxlLCBzcmNGb3JtYXQsIGRzdFByb2ZpbGUsIFRZUEVfQkdSXzgsIGludGVudCwgMCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBjbXNTaWdDbXlrRGF0YToKLSAgICAgICAgICAgIGhUcmFuc2Zvcm0gPSBjbXNDcmVhdGVUcmFuc2Zvcm0oc3JjUHJvZmlsZSwgc3JjRm9ybWF0LCBkc3RQcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPU1dBUChkd0RzdEZvcm1hdCkgPyBUWVBFX0tZTUNfOCA6IFRZUEVfQ01ZS184LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQsIDApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGhUcmFuc2Zvcm0gPT0gTlVMTCkgewotICAgICAgICBjbXNDbG9zZVByb2ZpbGUoc3JjUHJvZmlsZSk7Ci0gICAgICAgIGNtc0Nsb3NlUHJvZmlsZShkc3RQcm9maWxlKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHBDbW0gPSBuZXcgQ0xjbXNDbW07Ci0gICAgcENtbS0+bV9uU3JjQ29tcG9uZW50cyA9IG5TcmNDb21wb25lbnRzOwotICAgIHBDbW0tPm1fbkRzdENvbXBvbmVudHMgPSBuRHN0Q29tcG9uZW50czsKLSAgICBwQ21tLT5tX2hUcmFuc2Zvcm0gPSBoVHJhbnNmb3JtOwotICAgIHBDbW0tPm1fYkxhYiA9IGJMYWI7CisgIH0KKyAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBkc3RDUyA9IGNtc0dldENvbG9yU3BhY2UoZHN0UHJvZmlsZSk7CisgIGlmICghQ2hlY2tDb21wb25lbnRzKGRzdENTLCBuRHN0Q29tcG9uZW50cywgVFJVRSkpIHsKICAgICBjbXNDbG9zZVByb2ZpbGUoc3JjUHJvZmlsZSk7CiAgICAgY21zQ2xvc2VQcm9maWxlKGRzdFByb2ZpbGUpOwotICAgIHJldHVybiBwQ21tOworICAgIHJldHVybiBOVUxMOworICB9CisgIHN3aXRjaCAoZHN0Q1MpIHsKKyAgICBjYXNlIGNtc1NpZ0dyYXlEYXRhOgorICAgICAgaFRyYW5zZm9ybSA9IGNtc0NyZWF0ZVRyYW5zZm9ybShzcmNQcm9maWxlLCBzcmNGb3JtYXQsIGRzdFByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfR1JBWV84LCBpbnRlbnQsIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBjbXNTaWdSZ2JEYXRhOgorICAgICAgaFRyYW5zZm9ybSA9IGNtc0NyZWF0ZVRyYW5zZm9ybShzcmNQcm9maWxlLCBzcmNGb3JtYXQsIGRzdFByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfQkdSXzgsIGludGVudCwgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGNtc1NpZ0NteWtEYXRhOgorICAgICAgaFRyYW5zZm9ybSA9IGNtc0NyZWF0ZVRyYW5zZm9ybSgKKyAgICAgICAgICBzcmNQcm9maWxlLCBzcmNGb3JtYXQsIGRzdFByb2ZpbGUsCisgICAgICAgICAgVF9ET1NXQVAoZHdEc3RGb3JtYXQpID8gVFlQRV9LWU1DXzggOiBUWVBFX0NNWUtfOCwgaW50ZW50LCAwKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICBpZiAoIWhUcmFuc2Zvcm0pIHsKKyAgICBjbXNDbG9zZVByb2ZpbGUoc3JjUHJvZmlsZSk7CisgICAgY21zQ2xvc2VQcm9maWxlKGRzdFByb2ZpbGUpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHBDbW0gPSBuZXcgQ0xjbXNDbW07CisgIHBDbW0tPm1fblNyY0NvbXBvbmVudHMgPSBuU3JjQ29tcG9uZW50czsKKyAgcENtbS0+bV9uRHN0Q29tcG9uZW50cyA9IG5Ec3RDb21wb25lbnRzOworICBwQ21tLT5tX2hUcmFuc2Zvcm0gPSBoVHJhbnNmb3JtOworICBwQ21tLT5tX2JMYWIgPSBiTGFiOworICBjbXNDbG9zZVByb2ZpbGUoc3JjUHJvZmlsZSk7CisgIGNtc0Nsb3NlUHJvZmlsZShkc3RQcm9maWxlKTsKKyAgcmV0dXJuIHBDbW07CiB9Ci12b2lkKiBJY2NMaWJfQ3JlYXRlVHJhbnNmb3JtX3NSR0IoY29uc3QgdW5zaWduZWQgY2hhciogcFByb2ZpbGVEYXRhLCBGWF9EV09SRCBkd1Byb2ZpbGVTaXplLCBGWF9JTlQzMiYgbkNvbXBvbmVudHMsIEZYX0lOVDMyIGludGVudCwgRlhfRFdPUkQgZHdTcmNGb3JtYXQpCi17Ci0gICAgcmV0dXJuIEljY0xpYl9DcmVhdGVUcmFuc2Zvcm0ocFByb2ZpbGVEYXRhLCBkd1Byb2ZpbGVTaXplLCBuQ29tcG9uZW50cywgTlVMTCwgMCwgMywgaW50ZW50LCBkd1NyY0Zvcm1hdCk7Cit2b2lkKiBJY2NMaWJfQ3JlYXRlVHJhbnNmb3JtX3NSR0IoY29uc3QgdW5zaWduZWQgY2hhciogcFByb2ZpbGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3UHJvZmlsZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbkNvbXBvbmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTcmNGb3JtYXQpIHsKKyAgcmV0dXJuIEljY0xpYl9DcmVhdGVUcmFuc2Zvcm0ocFByb2ZpbGVEYXRhLCBkd1Byb2ZpbGVTaXplLCBuQ29tcG9uZW50cywgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMywgaW50ZW50LCBkd1NyY0Zvcm1hdCk7CiB9Ci12b2lkIEljY0xpYl9EZXN0cm95VHJhbnNmb3JtKHZvaWQqIHBUcmFuc2Zvcm0pCi17Ci0gICAgaWYgKHBUcmFuc2Zvcm0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNtc0RlbGV0ZVRyYW5zZm9ybSgoKENMY21zQ21tKilwVHJhbnNmb3JtKS0+bV9oVHJhbnNmb3JtKTsKLSAgICBkZWxldGUgKENMY21zQ21tKilwVHJhbnNmb3JtOwordm9pZCBJY2NMaWJfRGVzdHJveVRyYW5zZm9ybSh2b2lkKiBwVHJhbnNmb3JtKSB7CisgIGlmICghcFRyYW5zZm9ybSkgeworICAgIHJldHVybjsKKyAgfQorICBjbXNEZWxldGVUcmFuc2Zvcm0oKChDTGNtc0NtbSopcFRyYW5zZm9ybSktPm1faFRyYW5zZm9ybSk7CisgIGRlbGV0ZSAoQ0xjbXNDbW0qKXBUcmFuc2Zvcm07CiB9Ci12b2lkIEljY0xpYl9UcmFuc2xhdGUodm9pZCogcFRyYW5zZm9ybSwgRlhfRFdPUkQgblNyY0NvbXBvbmVudHMsIEZYX0ZMT0FUKiBwU3JjVmFsdWVzLCBGWF9GTE9BVCogcERlc3RWYWx1ZXMpCi17Ci0gICAgaWYgKHBUcmFuc2Zvcm0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Cit2b2lkIEljY0xpYl9UcmFuc2xhdGUodm9pZCogcFRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuU3JjQ29tcG9uZW50cywKKyAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcFNyY1ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcERlc3RWYWx1ZXMpIHsKKyAgaWYgKCFwVHJhbnNmb3JtKSB7CisgICAgcmV0dXJuOworICB9CisgIENMY21zQ21tKiBwID0gKENMY21zQ21tKilwVHJhbnNmb3JtOworICB1aW50OF90IG91dHB1dFs0XTsKKyAgaWYgKHAtPm1fYkxhYikgeworICAgIENGWF9GaXhlZEJ1Zkdyb3c8ZG91YmxlLCAxNj4gaW5wdXRzKG5TcmNDb21wb25lbnRzKTsKKyAgICBkb3VibGUqIGlucHV0ID0gaW5wdXRzOworICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBuU3JjQ29tcG9uZW50czsgaSsrKSB7CisgICAgICBpbnB1dFtpXSA9IHBTcmNWYWx1ZXNbaV07CiAgICAgfQotICAgIENMY21zQ21tKiBwID0gKENMY21zQ21tKilwVHJhbnNmb3JtOwotICAgIEZYX0JZVEUgb3V0cHV0WzRdOwotICAgIGlmIChwLT5tX2JMYWIpIHsKLSAgICAgICAgQ0ZYX0ZpeGVkQnVmR3Jvdzxkb3VibGUsIDE2PiBpbnB1dHMoblNyY0NvbXBvbmVudHMpOwotICAgICAgICBkb3VibGUqIGlucHV0ID0gaW5wdXRzOwotICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgblNyY0NvbXBvbmVudHM7IGkgKyspIHsKLSAgICAgICAgICAgIGlucHV0W2ldID0gcFNyY1ZhbHVlc1tpXTsKLSAgICAgICAgfQotICAgICAgICBjbXNEb1RyYW5zZm9ybShwLT5tX2hUcmFuc2Zvcm0sIGlucHV0LCBvdXRwdXQsIDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfQllURSwgMTY+IGlucHV0cyhuU3JjQ29tcG9uZW50cyk7Ci0gICAgICAgIEZYX0JZVEUqIGlucHV0ID0gaW5wdXRzOwotICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgblNyY0NvbXBvbmVudHM7IGkgKyspIHsKLSAgICAgICAgICAgIGlmIChwU3JjVmFsdWVzW2ldID4gMS4wZikgewotICAgICAgICAgICAgICAgIGlucHV0W2ldID0gMjU1OwotICAgICAgICAgICAgfSBlbHNlIGlmIChwU3JjVmFsdWVzW2ldIDwgMCkgewotICAgICAgICAgICAgICAgIGlucHV0W2ldID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW5wdXRbaV0gPSAoaW50KShwU3JjVmFsdWVzW2ldICogMjU1LjBmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjbXNEb1RyYW5zZm9ybShwLT5tX2hUcmFuc2Zvcm0sIGlucHV0LCBvdXRwdXQsIDEpOworICAgIGNtc0RvVHJhbnNmb3JtKHAtPm1faFRyYW5zZm9ybSwgaW5wdXQsIG91dHB1dCwgMSk7CisgIH0gZWxzZSB7CisgICAgQ0ZYX0ZpeGVkQnVmR3Jvdzx1aW50OF90LCAxNj4gaW5wdXRzKG5TcmNDb21wb25lbnRzKTsKKyAgICB1aW50OF90KiBpbnB1dCA9IGlucHV0czsKKyAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgblNyY0NvbXBvbmVudHM7IGkrKykgeworICAgICAgaWYgKHBTcmNWYWx1ZXNbaV0gPiAxLjBmKSB7CisgICAgICAgIGlucHV0W2ldID0gMjU1OworICAgICAgfSBlbHNlIGlmIChwU3JjVmFsdWVzW2ldIDwgMCkgeworICAgICAgICBpbnB1dFtpXSA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnB1dFtpXSA9IChpbnQpKHBTcmNWYWx1ZXNbaV0gKiAyNTUuMGYpOworICAgICAgfQogICAgIH0KLSAgICBzd2l0Y2gocC0+bV9uRHN0Q29tcG9uZW50cykgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBwRGVzdFZhbHVlc1swXSA9IG91dHB1dFswXSAvIDI1NS4wZjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBwRGVzdFZhbHVlc1swXSA9IG91dHB1dFsyXSAvIDI1NS4wZjsKLSAgICAgICAgICAgIHBEZXN0VmFsdWVzWzFdID0gb3V0cHV0WzFdIC8gMjU1LjBmOwotICAgICAgICAgICAgcERlc3RWYWx1ZXNbMl0gPSBvdXRwdXRbMF0gLyAyNTUuMGY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgcERlc3RWYWx1ZXNbMF0gPSBvdXRwdXRbMF0gLyAyNTUuMGY7Ci0gICAgICAgICAgICBwRGVzdFZhbHVlc1sxXSA9IG91dHB1dFsxXSAvIDI1NS4wZjsKLSAgICAgICAgICAgIHBEZXN0VmFsdWVzWzJdID0gb3V0cHV0WzJdIC8gMjU1LjBmOwotICAgICAgICAgICAgcERlc3RWYWx1ZXNbM10gPSBvdXRwdXRbM10gLyAyNTUuMGY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9CisgICAgY21zRG9UcmFuc2Zvcm0ocC0+bV9oVHJhbnNmb3JtLCBpbnB1dCwgb3V0cHV0LCAxKTsKKyAgfQorICBzd2l0Y2ggKHAtPm1fbkRzdENvbXBvbmVudHMpIHsKKyAgICBjYXNlIDE6CisgICAgICBwRGVzdFZhbHVlc1swXSA9IG91dHB1dFswXSAvIDI1NS4wZjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIHBEZXN0VmFsdWVzWzBdID0gb3V0cHV0WzJdIC8gMjU1LjBmOworICAgICAgcERlc3RWYWx1ZXNbMV0gPSBvdXRwdXRbMV0gLyAyNTUuMGY7CisgICAgICBwRGVzdFZhbHVlc1syXSA9IG91dHB1dFswXSAvIDI1NS4wZjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIHBEZXN0VmFsdWVzWzBdID0gb3V0cHV0WzBdIC8gMjU1LjBmOworICAgICAgcERlc3RWYWx1ZXNbMV0gPSBvdXRwdXRbMV0gLyAyNTUuMGY7CisgICAgICBwRGVzdFZhbHVlc1syXSA9IG91dHB1dFsyXSAvIDI1NS4wZjsKKyAgICAgIHBEZXN0VmFsdWVzWzNdID0gb3V0cHV0WzNdIC8gMjU1LjBmOworICAgICAgYnJlYWs7CisgIH0KIH0KLXZvaWQgSWNjTGliX1RyYW5zbGF0ZUltYWdlKHZvaWQqIHBUcmFuc2Zvcm0sIHVuc2lnbmVkIGNoYXIqIHBEZXN0LCBjb25zdCB1bnNpZ25lZCBjaGFyKiBwU3JjLCBGWF9JTlQzMiBwaXhlbHMpCi17Ci0gICAgY21zRG9UcmFuc2Zvcm0oKChDTGNtc0NtbSopcFRyYW5zZm9ybSktPm1faFRyYW5zZm9ybSwgKHZvaWQqKXBTcmMsIHBEZXN0LCBwaXhlbHMpOwordm9pZCBJY2NMaWJfVHJhbnNsYXRlSW1hZ2Uodm9pZCogcFRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHBEZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGl4ZWxzKSB7CisgIGNtc0RvVHJhbnNmb3JtKCgoQ0xjbXNDbW0qKXBUcmFuc2Zvcm0pLT5tX2hUcmFuc2Zvcm0sICh2b2lkKilwU3JjLCBwRGVzdCwKKyAgICAgICAgICAgICAgICAgcGl4ZWxzKTsKIH0KLUZYX0xQVk9JRCBDcmVhdGVQcm9maWxlX0dyYXkoZG91YmxlIGdhbW1hKQotewotICAgIGNtc0NJRXh5WSogRDUwID0gKGNtc0NJRXh5WSopY21zRDUwX3h5WSgpOwotICAgIGlmICghY21zV2hpdGVQb2ludEZyb21UZW1wKEQ1MCwgNjUwNCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGNtc1RvbmVDdXJ2ZSogY3VydmUgPSBjbXNCdWlsZEdhbW1hKE5VTEwsIGdhbW1hKTsKLSAgICBpZiAoY3VydmUgPT0gTlVMTCkJewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgRlhfTFBWT0lEIHByb2ZpbGUgPSBjbXNDcmVhdGVHcmF5UHJvZmlsZShENTAsIGN1cnZlKTsKLSAgICBjbXNGcmVlVG9uZUN1cnZlKGN1cnZlKTsKLSAgICByZXR1cm4gcHJvZmlsZTsKK3ZvaWQqIENyZWF0ZVByb2ZpbGVfR3JheShkb3VibGUgZ2FtbWEpIHsKKyAgY21zQ0lFeHlZKiBENTAgPSAoY21zQ0lFeHlZKiljbXNENTBfeHlZKCk7CisgIGlmICghY21zV2hpdGVQb2ludEZyb21UZW1wKEQ1MCwgNjUwNCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBjbXNUb25lQ3VydmUqIGN1cnZlID0gY21zQnVpbGRHYW1tYShOVUxMLCBnYW1tYSk7CisgIGlmICghY3VydmUpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICB2b2lkKiBwcm9maWxlID0gY21zQ3JlYXRlR3JheVByb2ZpbGUoRDUwLCBjdXJ2ZSk7CisgIGNtc0ZyZWVUb25lQ3VydmUoY3VydmUpOworICByZXR1cm4gcHJvZmlsZTsKIH0KLUlDb2RlY19JY2NNb2R1bGU6OkljY0NTIEdldFByb2ZpbGVDU0Zyb21IYW5kbGUoRlhfTFBWT0lEIHBQcm9maWxlKQotewotICAgIGlmIChwUHJvZmlsZSA9PSBOVUxMKQl7Ci0gICAgICAgIHJldHVybiBJQ29kZWNfSWNjTW9kdWxlOjpJY2NDU19Vbmtub3duOwotICAgIH0KLSAgICBzd2l0Y2ggKGNtc0dldENvbG9yU3BhY2UocFByb2ZpbGUpKSB7Ci0gICAgICAgIGNhc2UgY21zU2lnWFlaRGF0YToKLSAgICAgICAgICAgIHJldHVybiBJQ29kZWNfSWNjTW9kdWxlOjpJY2NDU19YWVo7Ci0gICAgICAgIGNhc2UgY21zU2lnTGFiRGF0YToKLSAgICAgICAgICAgIHJldHVybiBJQ29kZWNfSWNjTW9kdWxlOjpJY2NDU19MYWI7Ci0gICAgICAgIGNhc2UgY21zU2lnTHV2RGF0YToKLSAgICAgICAgICAgIHJldHVybiBJQ29kZWNfSWNjTW9kdWxlOjpJY2NDU19MdXY7Ci0gICAgICAgIGNhc2UgY21zU2lnWUNiQ3JEYXRhOgotICAgICAgICAgICAgcmV0dXJuIElDb2RlY19JY2NNb2R1bGU6OkljY0NTX1lDYkNyOwotICAgICAgICBjYXNlIGNtc1NpZ1l4eURhdGE6Ci0gICAgICAgICAgICByZXR1cm4gSUNvZGVjX0ljY01vZHVsZTo6SWNjQ1NfWXh5OwotICAgICAgICBjYXNlIGNtc1NpZ1JnYkRhdGE6Ci0gICAgICAgICAgICByZXR1cm4gSUNvZGVjX0ljY01vZHVsZTo6SWNjQ1NfUmdiOwotICAgICAgICBjYXNlIGNtc1NpZ0dyYXlEYXRhOgotICAgICAgICAgICAgcmV0dXJuIElDb2RlY19JY2NNb2R1bGU6OkljY0NTX0dyYXk7Ci0gICAgICAgIGNhc2UgY21zU2lnSHN2RGF0YToKLSAgICAgICAgICAgIHJldHVybiBJQ29kZWNfSWNjTW9kdWxlOjpJY2NDU19Ic3Y7Ci0gICAgICAgIGNhc2UgY21zU2lnSGxzRGF0YToKLSAgICAgICAgICAgIHJldHVybiBJQ29kZWNfSWNjTW9kdWxlOjpJY2NDU19IbHM7Ci0gICAgICAgIGNhc2UgY21zU2lnQ215a0RhdGE6Ci0gICAgICAgICAgICByZXR1cm4gSUNvZGVjX0ljY01vZHVsZTo6SWNjQ1NfQ215azsKLSAgICAgICAgY2FzZSBjbXNTaWdDbXlEYXRhOgotICAgICAgICAgICAgcmV0dXJuIElDb2RlY19JY2NNb2R1bGU6OkljY0NTX0NteTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBJQ29kZWNfSWNjTW9kdWxlOjpJY2NDU19Vbmtub3duOwotICAgIH0KK0lDb2RlY19JY2NNb2R1bGU6OkljY0NTIEdldFByb2ZpbGVDU0Zyb21IYW5kbGUodm9pZCogcFByb2ZpbGUpIHsKKyAgaWYgKCFwUHJvZmlsZSkgeworICAgIHJldHVybiBJQ29kZWNfSWNjTW9kdWxlOjpJY2NDU19Vbmtub3duOworICB9CisgIHN3aXRjaCAoY21zR2V0Q29sb3JTcGFjZShwUHJvZmlsZSkpIHsKKyAgICBjYXNlIGNtc1NpZ1hZWkRhdGE6CisgICAgICByZXR1cm4gSUNvZGVjX0ljY01vZHVsZTo6SWNjQ1NfWFlaOworICAgIGNhc2UgY21zU2lnTGFiRGF0YToKKyAgICAgIHJldHVybiBJQ29kZWNfSWNjTW9kdWxlOjpJY2NDU19MYWI7CisgICAgY2FzZSBjbXNTaWdMdXZEYXRhOgorICAgICAgcmV0dXJuIElDb2RlY19JY2NNb2R1bGU6OkljY0NTX0x1djsKKyAgICBjYXNlIGNtc1NpZ1lDYkNyRGF0YToKKyAgICAgIHJldHVybiBJQ29kZWNfSWNjTW9kdWxlOjpJY2NDU19ZQ2JDcjsKKyAgICBjYXNlIGNtc1NpZ1l4eURhdGE6CisgICAgICByZXR1cm4gSUNvZGVjX0ljY01vZHVsZTo6SWNjQ1NfWXh5OworICAgIGNhc2UgY21zU2lnUmdiRGF0YToKKyAgICAgIHJldHVybiBJQ29kZWNfSWNjTW9kdWxlOjpJY2NDU19SZ2I7CisgICAgY2FzZSBjbXNTaWdHcmF5RGF0YToKKyAgICAgIHJldHVybiBJQ29kZWNfSWNjTW9kdWxlOjpJY2NDU19HcmF5OworICAgIGNhc2UgY21zU2lnSHN2RGF0YToKKyAgICAgIHJldHVybiBJQ29kZWNfSWNjTW9kdWxlOjpJY2NDU19Ic3Y7CisgICAgY2FzZSBjbXNTaWdIbHNEYXRhOgorICAgICAgcmV0dXJuIElDb2RlY19JY2NNb2R1bGU6OkljY0NTX0hsczsKKyAgICBjYXNlIGNtc1NpZ0NteWtEYXRhOgorICAgICAgcmV0dXJuIElDb2RlY19JY2NNb2R1bGU6OkljY0NTX0NteWs7CisgICAgY2FzZSBjbXNTaWdDbXlEYXRhOgorICAgICAgcmV0dXJuIElDb2RlY19JY2NNb2R1bGU6OkljY0NTX0NteTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIElDb2RlY19JY2NNb2R1bGU6OkljY0NTX1Vua25vd247CisgIH0KIH0KLUlDb2RlY19JY2NNb2R1bGU6OkljY0NTIENDb2RlY19JY2NNb2R1bGU6OkdldFByb2ZpbGVDUyhGWF9MUENCWVRFIHBQcm9maWxlRGF0YSwgRlhfRFdPUkQgZHdQcm9maWxlU2l6ZSkKLXsKLSAgICBJQ29kZWNfSWNjTW9kdWxlOjpJY2NDUyBjczsKLSAgICBjbXNIUFJPRklMRSBoUHJvZmlsZSA9IGNtc09wZW5Qcm9maWxlRnJvbU1lbSgodm9pZCopcFByb2ZpbGVEYXRhLCBkd1Byb2ZpbGVTaXplKTsKLSAgICBpZiAoaFByb2ZpbGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gSWNjQ1NfVW5rbm93bjsKLSAgICB9Ci0gICAgY3MgPSBHZXRQcm9maWxlQ1NGcm9tSGFuZGxlKGhQcm9maWxlKTsKLSAgICBpZiAoaFByb2ZpbGUpCXsKLSAgICAgICAgY21zQ2xvc2VQcm9maWxlKGhQcm9maWxlKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNzOworSUNvZGVjX0ljY01vZHVsZTo6SWNjQ1MgQ0NvZGVjX0ljY01vZHVsZTo6R2V0UHJvZmlsZUNTKAorICAgIGNvbnN0IHVpbnQ4X3QqIHBQcm9maWxlRGF0YSwKKyAgICBGWF9EV09SRCBkd1Byb2ZpbGVTaXplKSB7CisgIElDb2RlY19JY2NNb2R1bGU6OkljY0NTIGNzOworICBjbXNIUFJPRklMRSBoUHJvZmlsZSA9CisgICAgICBjbXNPcGVuUHJvZmlsZUZyb21NZW0oKHZvaWQqKXBQcm9maWxlRGF0YSwgZHdQcm9maWxlU2l6ZSk7CisgIGlmICghaFByb2ZpbGUpIHsKKyAgICByZXR1cm4gSWNjQ1NfVW5rbm93bjsKKyAgfQorICBjcyA9IEdldFByb2ZpbGVDU0Zyb21IYW5kbGUoaFByb2ZpbGUpOworICBpZiAoaFByb2ZpbGUpIHsKKyAgICBjbXNDbG9zZVByb2ZpbGUoaFByb2ZpbGUpOworICB9CisgIHJldHVybiBjczsKIH0KLUlDb2RlY19JY2NNb2R1bGU6OkljY0NTIENDb2RlY19JY2NNb2R1bGU6OkdldFByb2ZpbGVDUyhJRlhfRmlsZVJlYWQqIHBGaWxlKQotewotICAgIGlmIChwRmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBJY2NDU19Vbmtub3duOwotICAgIH0KLSAgICBJQ29kZWNfSWNjTW9kdWxlOjpJY2NDUyBjczsKLSAgICBGWF9EV09SRCBkd1NpemUgPSAoRlhfRFdPUkQpcEZpbGUtPkdldFNpemUoKTsKLSAgICBGWF9MUEJZVEUgcEJ1ZiA9IEZYX0FsbG9jKEZYX0JZVEUsIGR3U2l6ZSk7Ci0gICAgcEZpbGUtPlJlYWRCbG9jayhwQnVmLCAwLCBkd1NpemUpOwotICAgIGNzID0gR2V0UHJvZmlsZUNTKHBCdWYsIGR3U2l6ZSk7Ci0gICAgRlhfRnJlZShwQnVmKTsKLSAgICByZXR1cm4gY3M7CitJQ29kZWNfSWNjTW9kdWxlOjpJY2NDUyBDQ29kZWNfSWNjTW9kdWxlOjpHZXRQcm9maWxlQ1MoSUZYX0ZpbGVSZWFkKiBwRmlsZSkgeworICBpZiAoIXBGaWxlKSB7CisgICAgcmV0dXJuIEljY0NTX1Vua25vd247CisgIH0KKyAgSUNvZGVjX0ljY01vZHVsZTo6SWNjQ1MgY3M7CisgIEZYX0RXT1JEIGR3U2l6ZSA9IChGWF9EV09SRClwRmlsZS0+R2V0U2l6ZSgpOworICB1aW50OF90KiBwQnVmID0gRlhfQWxsb2ModWludDhfdCwgZHdTaXplKTsKKyAgcEZpbGUtPlJlYWRCbG9jayhwQnVmLCAwLCBkd1NpemUpOworICBjcyA9IEdldFByb2ZpbGVDUyhwQnVmLCBkd1NpemUpOworICBGWF9GcmVlKHBCdWYpOworICByZXR1cm4gY3M7CiB9Ci1GWF9EV09SRCBUcmFuc2ZlclByb2ZpbGVUeXBlKEZYX0xQVk9JRCBwUHJvZmlsZSwgRlhfRFdPUkQgZHdGb3JtYXQpCi17Ci0gICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBjcyA9IGNtc0dldENvbG9yU3BhY2UocFByb2ZpbGUpOwotICAgIHN3aXRjaCAoY3MpIHsKLSAgICAgICAgY2FzZSBjbXNTaWdYWVpEYXRhOgotICAgICAgICAgICAgcmV0dXJuIFRZUEVfWFlaXzE2OwotICAgICAgICBjYXNlIGNtc1NpZ0xhYkRhdGE6Ci0gICAgICAgICAgICByZXR1cm4gVFlQRV9MYWJfREJMOwotICAgICAgICBjYXNlIGNtc1NpZ0x1dkRhdGE6Ci0gICAgICAgICAgICByZXR1cm4gVFlQRV9ZVVZfODsKLSAgICAgICAgY2FzZSBjbXNTaWdZQ2JDckRhdGE6Ci0gICAgICAgICAgICByZXR1cm4gVFlQRV9ZQ2JDcl84OwotICAgICAgICBjYXNlIGNtc1NpZ1l4eURhdGE6Ci0gICAgICAgICAgICByZXR1cm4gVFlQRV9ZeHlfMTY7Ci0gICAgICAgIGNhc2UgY21zU2lnUmdiRGF0YToKLSAgICAgICAgICAgIHJldHVybiBUX0RPU1dBUChkd0Zvcm1hdCkgPyBUWVBFX1JHQl84IDogVFlQRV9CR1JfODsKLSAgICAgICAgY2FzZSBjbXNTaWdHcmF5RGF0YToKLSAgICAgICAgICAgIHJldHVybiBUWVBFX0dSQVlfODsKLSAgICAgICAgY2FzZSBjbXNTaWdIc3ZEYXRhOgotICAgICAgICAgICAgcmV0dXJuIFRZUEVfSFNWXzg7Ci0gICAgICAgIGNhc2UgY21zU2lnSGxzRGF0YToKLSAgICAgICAgICAgIHJldHVybiBUWVBFX0hMU184OwotICAgICAgICBjYXNlIGNtc1NpZ0NteWtEYXRhOgotICAgICAgICAgICAgcmV0dXJuIFRfRE9TV0FQKGR3Rm9ybWF0KSA/IFRZUEVfS1lNQ184IDogVFlQRV9DTVlLXzg7Ci0gICAgICAgIGNhc2UgY21zU2lnQ215RGF0YToKLSAgICAgICAgICAgIHJldHVybiBUWVBFX0NNWV84OwotICAgICAgICBjYXNlIGNtc1NpZ01DSDVEYXRhOgotICAgICAgICAgICAgcmV0dXJuIFRfRE9TV0FQKGR3Rm9ybWF0KSA/IFRZUEVfS1lNQzVfOCA6IFRZUEVfQ01ZSzVfODsKLSAgICAgICAgY2FzZSBjbXNTaWdNQ0g2RGF0YToKLSAgICAgICAgICAgIHJldHVybiBUWVBFX0NNWUs2Xzg7Ci0gICAgICAgIGNhc2UgY21zU2lnTUNIN0RhdGE6Ci0gICAgICAgICAgICByZXR1cm4gVF9ET1NXQVAoZHdGb3JtYXQpID8gVFlQRV9LWU1DN184IDogVFlQRV9DTVlLN184OwotICAgICAgICBjYXNlIGNtc1NpZ01DSDhEYXRhOgotICAgICAgICAgICAgcmV0dXJuIFRfRE9TV0FQKGR3Rm9ybWF0KSA/IFRZUEVfS1lNQzhfOCA6IFRZUEVfQ01ZSzhfODsKLSAgICAgICAgY2FzZSBjbXNTaWdNQ0g5RGF0YToKLSAgICAgICAgICAgIHJldHVybiBUX0RPU1dBUChkd0Zvcm1hdCkgPyBUWVBFX0tZTUM5XzggOiBUWVBFX0NNWUs5Xzg7Ci0gICAgICAgIGNhc2UgY21zU2lnTUNIQURhdGE6Ci0gICAgICAgICAgICByZXR1cm4gVF9ET1NXQVAoZHdGb3JtYXQpID8gVFlQRV9LWU1DMTBfOCA6IFRZUEVfQ01ZSzEwXzg7Ci0gICAgICAgIGNhc2UgY21zU2lnTUNIQkRhdGE6Ci0gICAgICAgICAgICByZXR1cm4gVF9ET1NXQVAoZHdGb3JtYXQpID8gVFlQRV9LWU1DMTFfOCA6IFRZUEVfQ01ZSzExXzg7Ci0gICAgICAgIGNhc2UgY21zU2lnTUNIQ0RhdGE6Ci0gICAgICAgICAgICByZXR1cm4gVF9ET1NXQVAoZHdGb3JtYXQpID8gVFlQRV9LWU1DMTJfOCA6IFRZUEVfQ01ZSzEyXzg7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9CitGWF9EV09SRCBUcmFuc2ZlclByb2ZpbGVUeXBlKHZvaWQqIHBQcm9maWxlLCBGWF9EV09SRCBkd0Zvcm1hdCkgeworICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIGNzID0gY21zR2V0Q29sb3JTcGFjZShwUHJvZmlsZSk7CisgIHN3aXRjaCAoY3MpIHsKKyAgICBjYXNlIGNtc1NpZ1hZWkRhdGE6CisgICAgICByZXR1cm4gVFlQRV9YWVpfMTY7CisgICAgY2FzZSBjbXNTaWdMYWJEYXRhOgorICAgICAgcmV0dXJuIFRZUEVfTGFiX0RCTDsKKyAgICBjYXNlIGNtc1NpZ0x1dkRhdGE6CisgICAgICByZXR1cm4gVFlQRV9ZVVZfODsKKyAgICBjYXNlIGNtc1NpZ1lDYkNyRGF0YToKKyAgICAgIHJldHVybiBUWVBFX1lDYkNyXzg7CisgICAgY2FzZSBjbXNTaWdZeHlEYXRhOgorICAgICAgcmV0dXJuIFRZUEVfWXh5XzE2OworICAgIGNhc2UgY21zU2lnUmdiRGF0YToKKyAgICAgIHJldHVybiBUX0RPU1dBUChkd0Zvcm1hdCkgPyBUWVBFX1JHQl84IDogVFlQRV9CR1JfODsKKyAgICBjYXNlIGNtc1NpZ0dyYXlEYXRhOgorICAgICAgcmV0dXJuIFRZUEVfR1JBWV84OworICAgIGNhc2UgY21zU2lnSHN2RGF0YToKKyAgICAgIHJldHVybiBUWVBFX0hTVl84OworICAgIGNhc2UgY21zU2lnSGxzRGF0YToKKyAgICAgIHJldHVybiBUWVBFX0hMU184OworICAgIGNhc2UgY21zU2lnQ215a0RhdGE6CisgICAgICByZXR1cm4gVF9ET1NXQVAoZHdGb3JtYXQpID8gVFlQRV9LWU1DXzggOiBUWVBFX0NNWUtfODsKKyAgICBjYXNlIGNtc1NpZ0NteURhdGE6CisgICAgICByZXR1cm4gVFlQRV9DTVlfODsKKyAgICBjYXNlIGNtc1NpZ01DSDVEYXRhOgorICAgICAgcmV0dXJuIFRfRE9TV0FQKGR3Rm9ybWF0KSA/IFRZUEVfS1lNQzVfOCA6IFRZUEVfQ01ZSzVfODsKKyAgICBjYXNlIGNtc1NpZ01DSDZEYXRhOgorICAgICAgcmV0dXJuIFRZUEVfQ01ZSzZfODsKKyAgICBjYXNlIGNtc1NpZ01DSDdEYXRhOgorICAgICAgcmV0dXJuIFRfRE9TV0FQKGR3Rm9ybWF0KSA/IFRZUEVfS1lNQzdfOCA6IFRZUEVfQ01ZSzdfODsKKyAgICBjYXNlIGNtc1NpZ01DSDhEYXRhOgorICAgICAgcmV0dXJuIFRfRE9TV0FQKGR3Rm9ybWF0KSA/IFRZUEVfS1lNQzhfOCA6IFRZUEVfQ01ZSzhfODsKKyAgICBjYXNlIGNtc1NpZ01DSDlEYXRhOgorICAgICAgcmV0dXJuIFRfRE9TV0FQKGR3Rm9ybWF0KSA/IFRZUEVfS1lNQzlfOCA6IFRZUEVfQ01ZSzlfODsKKyAgICBjYXNlIGNtc1NpZ01DSEFEYXRhOgorICAgICAgcmV0dXJuIFRfRE9TV0FQKGR3Rm9ybWF0KSA/IFRZUEVfS1lNQzEwXzggOiBUWVBFX0NNWUsxMF84OworICAgIGNhc2UgY21zU2lnTUNIQkRhdGE6CisgICAgICByZXR1cm4gVF9ET1NXQVAoZHdGb3JtYXQpID8gVFlQRV9LWU1DMTFfOCA6IFRZUEVfQ01ZSzExXzg7CisgICAgY2FzZSBjbXNTaWdNQ0hDRGF0YToKKyAgICAgIHJldHVybiBUX0RPU1dBUChkd0Zvcm1hdCkgPyBUWVBFX0tZTUMxMl84IDogVFlQRV9DTVlLMTJfODsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgIH0KIH0KLWNsYXNzIENGWF9JY2NQcm9maWxlQ2FjaGUgCi17Ci1wdWJsaWM6Ci0gICAgQ0ZYX0ljY1Byb2ZpbGVDYWNoZSgpOwotICAgIH5DRlhfSWNjUHJvZmlsZUNhY2hlKCk7Ci0gICAgRlhfTFBWT0lEIG1fcFByb2ZpbGU7Ci0gICAgRlhfRFdPUkQJbV9kd1JhdGU7Ci1wcm90ZWN0ZWQ6Ci0gICAgdm9pZAlQdXJnZSgpOworY2xhc3MgQ0ZYX0ljY1Byb2ZpbGVDYWNoZSB7CisgcHVibGljOgorICBDRlhfSWNjUHJvZmlsZUNhY2hlKCk7CisgIH5DRlhfSWNjUHJvZmlsZUNhY2hlKCk7CisgIHZvaWQqIG1fcFByb2ZpbGU7CisgIEZYX0RXT1JEIG1fZHdSYXRlOworCisgcHJvdGVjdGVkOgorICB2b2lkIFB1cmdlKCk7CiB9OwotQ0ZYX0ljY1Byb2ZpbGVDYWNoZTo6Q0ZYX0ljY1Byb2ZpbGVDYWNoZSgpCi17Ci0gICAgbV9wUHJvZmlsZSA9IE5VTEw7Ci0gICAgbV9kd1JhdGUgPSAxOworQ0ZYX0ljY1Byb2ZpbGVDYWNoZTo6Q0ZYX0ljY1Byb2ZpbGVDYWNoZSgpIHsKKyAgbV9wUHJvZmlsZSA9IE5VTEw7CisgIG1fZHdSYXRlID0gMTsKIH0KLUNGWF9JY2NQcm9maWxlQ2FjaGU6On5DRlhfSWNjUHJvZmlsZUNhY2hlKCkKLXsKLSAgICBpZiAobV9wUHJvZmlsZSkgewotICAgICAgICBjbXNDbG9zZVByb2ZpbGUobV9wUHJvZmlsZSk7Ci0gICAgfQorQ0ZYX0ljY1Byb2ZpbGVDYWNoZTo6fkNGWF9JY2NQcm9maWxlQ2FjaGUoKSB7CisgIGlmIChtX3BQcm9maWxlKSB7CisgICAgY21zQ2xvc2VQcm9maWxlKG1fcFByb2ZpbGUpOworICB9CiB9Ci12b2lkIENGWF9JY2NQcm9maWxlQ2FjaGU6OlB1cmdlKCkKLXsKLX0KLWNsYXNzIENGWF9JY2NUcmFuc2Zvcm1DYWNoZSAKLXsKLXB1YmxpYzoKLSAgICBDRlhfSWNjVHJhbnNmb3JtQ2FjaGUoQ0xjbXNDbW0qIHBDbW0gPSBOVUxMKTsKLSAgICB+Q0ZYX0ljY1RyYW5zZm9ybUNhY2hlKCk7Ci0gICAgRlhfTFBWT0lECW1fcEljY1RyYW5zZm9ybTsKLSAgICBGWF9EV09SRAkJbV9kd1JhdGU7Ci0gICAgQ0xjbXNDbW0qCQltX3BDbW07Ci1wcm90ZWN0ZWQ6Ci0gICAgdm9pZAkJCVB1cmdlKCk7Cit2b2lkIENGWF9JY2NQcm9maWxlQ2FjaGU6OlB1cmdlKCkge30KK2NsYXNzIENGWF9JY2NUcmFuc2Zvcm1DYWNoZSB7CisgcHVibGljOgorICBDRlhfSWNjVHJhbnNmb3JtQ2FjaGUoQ0xjbXNDbW0qIHBDbW0gPSBOVUxMKTsKKyAgfkNGWF9JY2NUcmFuc2Zvcm1DYWNoZSgpOworICB2b2lkKiBtX3BJY2NUcmFuc2Zvcm07CisgIEZYX0RXT1JEIG1fZHdSYXRlOworICBDTGNtc0NtbSogbV9wQ21tOworCisgcHJvdGVjdGVkOgorICB2b2lkIFB1cmdlKCk7CiB9OwotQ0ZYX0ljY1RyYW5zZm9ybUNhY2hlOjpDRlhfSWNjVHJhbnNmb3JtQ2FjaGUoQ0xjbXNDbW0qIHBDbW0pCi17Ci0gICAgbV9wSWNjVHJhbnNmb3JtID0gTlVMTDsKLSAgICBtX2R3UmF0ZSA9IDE7Ci0gICAgbV9wQ21tID0gcENtbTsKK0NGWF9JY2NUcmFuc2Zvcm1DYWNoZTo6Q0ZYX0ljY1RyYW5zZm9ybUNhY2hlKENMY21zQ21tKiBwQ21tKSB7CisgIG1fcEljY1RyYW5zZm9ybSA9IE5VTEw7CisgIG1fZHdSYXRlID0gMTsKKyAgbV9wQ21tID0gcENtbTsKIH0KLUNGWF9JY2NUcmFuc2Zvcm1DYWNoZTo6fkNGWF9JY2NUcmFuc2Zvcm1DYWNoZSgpCi17Ci0gICAgaWYgKG1fcEljY1RyYW5zZm9ybSkgewotICAgICAgICBjbXNEZWxldGVUcmFuc2Zvcm0obV9wSWNjVHJhbnNmb3JtKTsKLSAgICB9Ci0gICAgaWYgKG1fcENtbSkgewotICAgICAgICBGWF9GcmVlKG1fcENtbSk7Ci0gICAgfQorQ0ZYX0ljY1RyYW5zZm9ybUNhY2hlOjp+Q0ZYX0ljY1RyYW5zZm9ybUNhY2hlKCkgeworICBpZiAobV9wSWNjVHJhbnNmb3JtKSB7CisgICAgY21zRGVsZXRlVHJhbnNmb3JtKG1fcEljY1RyYW5zZm9ybSk7CisgIH0KKyAgRlhfRnJlZShtX3BDbW0pOwogfQotdm9pZCBDRlhfSWNjVHJhbnNmb3JtQ2FjaGU6OlB1cmdlKCkKLXsKLX0KLWNsYXNzIENGWF9CeXRlU3RyaW5nS2V5IDogcHVibGljIENGWF9CaW5hcnlCdWYKLXsKLXB1YmxpYzoKLSAgICBDRlhfQnl0ZVN0cmluZ0tleSgpIDogQ0ZYX0JpbmFyeUJ1ZigpIHt9Ci0gICAgQ0ZYX0J5dGVTdHJpbmdLZXkmCQlvcGVyYXRvciA8PCAoRlhfRFdPUkQgaSk7Cit2b2lkIENGWF9JY2NUcmFuc2Zvcm1DYWNoZTo6UHVyZ2UoKSB7fQorY2xhc3MgQ0ZYX0J5dGVTdHJpbmdLZXkgOiBwdWJsaWMgQ0ZYX0JpbmFyeUJ1ZiB7CisgcHVibGljOgorICBDRlhfQnl0ZVN0cmluZ0tleSgpIDogQ0ZYX0JpbmFyeUJ1ZigpIHt9CisgIENGWF9CeXRlU3RyaW5nS2V5JiBvcGVyYXRvcjw8KEZYX0RXT1JEIGkpOwogfTsKLUNGWF9CeXRlU3RyaW5nS2V5JiBDRlhfQnl0ZVN0cmluZ0tleTo6b3BlcmF0b3IgPDwgKEZYX0RXT1JEIGkpCi17Ci0gICAgQXBwZW5kQmxvY2soJmksIHNpemVvZihGWF9EV09SRCkpOwotICAgIHJldHVybiAqdGhpczsKK0NGWF9CeXRlU3RyaW5nS2V5JiBDRlhfQnl0ZVN0cmluZ0tleTo6b3BlcmF0b3I8PChGWF9EV09SRCBpKSB7CisgIEFwcGVuZEJsb2NrKCZpLCBzaXplb2YoRlhfRFdPUkQpKTsKKyAgcmV0dXJuICp0aGlzOwogfQotRlhfTFBWT0lEIENDb2RlY19JY2NNb2R1bGU6OkNyZWF0ZVByb2ZpbGUoSUNvZGVjX0ljY01vZHVsZTo6SWNjUGFyYW0qIHBJY2NQYXJhbSwgSWNjX0NMQVNTIGljLCBDRlhfQmluYXJ5QnVmKiBwVHJhbnNmb3JtS2V5KQotewotICAgIENGWF9JY2NQcm9maWxlQ2FjaGUqIHBDYWNoZSA9IE5VTEw7Ci0gICAgQ0ZYX0J5dGVTdHJpbmdLZXkga2V5OwotICAgIENGWF9CeXRlU3RyaW5nIHRleHQ7Ci0gICAga2V5IDw8IHBJY2NQYXJhbS0+Q29sb3JTcGFjZSA8PCAocEljY1BhcmFtLT5kd1Byb2ZpbGVUeXBlIHwgaWMgPDwgOCk7Ci0gICAgRlhfQllURSBJRFsxNl07Cit2b2lkKiBDQ29kZWNfSWNjTW9kdWxlOjpDcmVhdGVQcm9maWxlKElDb2RlY19JY2NNb2R1bGU6OkljY1BhcmFtKiBwSWNjUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEljY19DTEFTUyBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0JpbmFyeUJ1ZiogcFRyYW5zZm9ybUtleSkgeworICBDRlhfSWNjUHJvZmlsZUNhY2hlKiBwQ2FjaGUgPSBOVUxMOworICBDRlhfQnl0ZVN0cmluZ0tleSBrZXk7CisgIENGWF9CeXRlU3RyaW5nIHRleHQ7CisgIGtleSA8PCBwSWNjUGFyYW0tPkNvbG9yU3BhY2UgPDwgKHBJY2NQYXJhbS0+ZHdQcm9maWxlVHlwZSB8IGljIDw8IDgpOworICB1aW50OF90IElEWzE2XTsKKyAgc3dpdGNoIChwSWNjUGFyYW0tPmR3UHJvZmlsZVR5cGUpIHsKKyAgICBjYXNlIEljY19QQVJBTVRZUEVfTk9ORToKKyAgICAgIHJldHVybiBOVUxMOworICAgIGNhc2UgSWNjX1BBUkFNVFlQRV9CVUZGRVI6CisgICAgICBNRDVDb21wdXRlSUQocEljY1BhcmFtLT5wUHJvZmlsZURhdGEsIHBJY2NQYXJhbS0+ZHdQcm9maWxlU2l6ZSwgSUQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJY2NfUEFSQU1UWVBFX1BBUkFNOgorICAgICAgRlhTWVNfbWVtc2V0KElELCAwLCAxNik7CisgICAgICBzd2l0Y2ggKHBJY2NQYXJhbS0+Q29sb3JTcGFjZSkgeworICAgICAgICBjYXNlIEljY0NTX0dyYXk6CisgICAgICAgICAgdGV4dC5Gb3JtYXQoIiVsZiIsIHBJY2NQYXJhbS0+R2FtbWEpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OjsKKyAgICAgIH0KKyAgICAgIE1ENUNvbXB1dGVJRCh0ZXh0LkdldEJ1ZmZlcigwKSwgdGV4dC5HZXRMZW5ndGgoKSwgSUQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDo7CisgIH0KKyAga2V5LkFwcGVuZEJsb2NrKElELCAxNik7CisgIENGWF9CeXRlU3RyaW5nIFByb2ZpbGVLZXkoa2V5LkdldEJ1ZmZlcigpLCBrZXkuR2V0U2l6ZSgpKTsKKyAgQVNTRVJUKHBUcmFuc2Zvcm1LZXkpOworICBwVHJhbnNmb3JtS2V5LT5BcHBlbmRCbG9jayhQcm9maWxlS2V5LkdldEJ1ZmZlcigwKSwgUHJvZmlsZUtleS5HZXRMZW5ndGgoKSk7CisgIGF1dG8gaXQgPSBtX01hcFByb2ZpbGUuZmluZChQcm9maWxlS2V5KTsKKyAgaWYgKGl0ID09IG1fTWFwUHJvZmlsZS5lbmQoKSkgeworICAgIHBDYWNoZSA9IG5ldyBDRlhfSWNjUHJvZmlsZUNhY2hlOwogICAgIHN3aXRjaCAocEljY1BhcmFtLT5kd1Byb2ZpbGVUeXBlKSB7Ci0gICAgICAgIGNhc2UgSWNjX1BBUkFNVFlQRV9OT05FOgotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGNhc2UgSWNjX1BBUkFNVFlQRV9CVUZGRVI6Ci0gICAgICAgICAgICBNRDVDb21wdXRlSUQocEljY1BhcmFtLT5wUHJvZmlsZURhdGEsIHBJY2NQYXJhbS0+ZHdQcm9maWxlU2l6ZSwgSUQpOworICAgICAgY2FzZSBJY2NfUEFSQU1UWVBFX0JVRkZFUjoKKyAgICAgICAgcENhY2hlLT5tX3BQcm9maWxlID0gY21zT3BlblByb2ZpbGVGcm9tTWVtKHBJY2NQYXJhbS0+cFByb2ZpbGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEljY1BhcmFtLT5kd1Byb2ZpbGVTaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEljY19QQVJBTVRZUEVfUEFSQU06CisgICAgICAgIHN3aXRjaCAocEljY1BhcmFtLT5Db2xvclNwYWNlKSB7CisgICAgICAgICAgY2FzZSBJY2NDU19SZ2I6CisgICAgICAgICAgICBwQ2FjaGUtPm1fcFByb2ZpbGUgPSBjbXNDcmVhdGVfc1JHQlByb2ZpbGUoKTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEljY19QQVJBTVRZUEVfUEFSQU06Ci0gICAgICAgICAgICBGWFNZU19tZW1zZXQzMihJRCwgMCwgMTYpOwotICAgICAgICAgICAgc3dpdGNoIChwSWNjUGFyYW0tPkNvbG9yU3BhY2UpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEljY0NTX0dyYXk6Ci0gICAgICAgICAgICAgICAgICAgIHRleHQuRm9ybWF0KCIlbGYiLCBwSWNjUGFyYW0tPkdhbW1hKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTUQ1Q29tcHV0ZUlEKHRleHQuR2V0QnVmZmVyKDApLCB0ZXh0LkdldExlbmd0aCgpLCBJRCk7CisgICAgICAgICAgY2FzZSBJY2NDU19HcmF5OgorICAgICAgICAgICAgcENhY2hlLT5tX3BQcm9maWxlID0gQ3JlYXRlUHJvZmlsZV9HcmF5KHBJY2NQYXJhbS0+R2FtbWEpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICA7Ci0gICAgfQotICAgIGtleS5BcHBlbmRCbG9jayhJRCwgMTYpOwotICAgIENGWF9CeXRlU3RyaW5nIFByb2ZpbGVLZXkoa2V5LkdldEJ1ZmZlcigpLCBrZXkuR2V0U2l6ZSgpKTsKLSAgICBBU1NFUlQocFRyYW5zZm9ybUtleSk7Ci0gICAgcFRyYW5zZm9ybUtleS0+QXBwZW5kQmxvY2soUHJvZmlsZUtleS5HZXRCdWZmZXIoMCksIFByb2ZpbGVLZXkuR2V0TGVuZ3RoKCkpOwotICAgIGlmICghbV9NYXBQcm9maWxlLkxvb2t1cChQcm9maWxlS2V5LCAoRlhfTFBWT0lEJilwQ2FjaGUpKSB7Ci0gICAgICAgIHBDYWNoZSA9IG5ldyBDRlhfSWNjUHJvZmlsZUNhY2hlOwotICAgICAgICBzd2l0Y2ggKHBJY2NQYXJhbS0+ZHdQcm9maWxlVHlwZSkgewotICAgICAgICAgICAgY2FzZSBJY2NfUEFSQU1UWVBFX0JVRkZFUjoKLSAgICAgICAgICAgICAgICBwQ2FjaGUtPm1fcFByb2ZpbGUgPSBjbXNPcGVuUHJvZmlsZUZyb21NZW0ocEljY1BhcmFtLT5wUHJvZmlsZURhdGEsIHBJY2NQYXJhbS0+ZHdQcm9maWxlU2l6ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEljY19QQVJBTVRZUEVfUEFSQU06Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChwSWNjUGFyYW0tPkNvbG9yU3BhY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBJY2NDU19SZ2I6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQ2FjaGUtPm1fcFByb2ZpbGUgPSBjbXNDcmVhdGVfc1JHQlByb2ZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEljY0NTX0dyYXk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQ2FjaGUtPm1fcFByb2ZpbGUgPSBDcmVhdGVQcm9maWxlX0dyYXkocEljY1BhcmFtLT5HYW1tYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIG1fTWFwUHJvZmlsZS5TZXRBdChQcm9maWxlS2V5LCBwQ2FjaGUpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBtX01hcFByb2ZpbGVbUHJvZmlsZUtleV0gPSBwQ2FjaGU7CisgIH0gZWxzZSB7CisgICAgcENhY2hlID0gaXQtPnNlY29uZDsKKyAgICBwQ2FjaGUtPm1fZHdSYXRlKys7CisgIH0KKyAgcmV0dXJuIHBDYWNoZS0+bV9wUHJvZmlsZTsKK30KK3ZvaWQqIENDb2RlY19JY2NNb2R1bGU6OkNyZWF0ZVRyYW5zZm9ybSgKKyAgICBJQ29kZWNfSWNjTW9kdWxlOjpJY2NQYXJhbSogcElucHV0UGFyYW0sCisgICAgSUNvZGVjX0ljY01vZHVsZTo6SWNjUGFyYW0qIHBPdXRwdXRQYXJhbSwKKyAgICBJQ29kZWNfSWNjTW9kdWxlOjpJY2NQYXJhbSogcFByb29mUGFyYW0sCisgICAgRlhfRFdPUkQgZHdJbnRlbnQsCisgICAgRlhfRFdPUkQgZHdGbGFnLAorICAgIEZYX0RXT1JEIGR3UHJmSW50ZW50LAorICAgIEZYX0RXT1JEIGR3UHJmRmxhZykgeworICBDTGNtc0NtbSogcENtbSA9IE5VTEw7CisgIEFTU0VSVChwSW5wdXRQYXJhbSAmJiBwT3V0cHV0UGFyYW0pOworICBDRlhfQnl0ZVN0cmluZ0tleSBrZXk7CisgIHZvaWQqIHBJbnB1dFByb2ZpbGUgPSBDcmVhdGVQcm9maWxlKHBJbnB1dFBhcmFtLCBJY2NfQ0xBU1NfSU5QVVQsICZrZXkpOworICBpZiAoIXBJbnB1dFByb2ZpbGUpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICB2b2lkKiBwT3V0cHV0UHJvZmlsZSA9IENyZWF0ZVByb2ZpbGUocE91dHB1dFBhcmFtLCBJY2NfQ0xBU1NfT1VUUFVULCAma2V5KTsKKyAgaWYgKCFwT3V0cHV0UHJvZmlsZSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEZYX0RXT1JEIGR3SW5wdXRQcm9maWxlVHlwZSA9CisgICAgICBUcmFuc2ZlclByb2ZpbGVUeXBlKHBJbnB1dFByb2ZpbGUsIHBJbnB1dFBhcmFtLT5kd0Zvcm1hdCk7CisgIEZYX0RXT1JEIGR3T3V0cHV0UHJvZmlsZVR5cGUgPQorICAgICAgVHJhbnNmZXJQcm9maWxlVHlwZShwT3V0cHV0UHJvZmlsZSwgcE91dHB1dFBhcmFtLT5kd0Zvcm1hdCk7CisgIGlmIChkd0lucHV0UHJvZmlsZVR5cGUgPT0gMCB8fCBkd091dHB1dFByb2ZpbGVUeXBlID09IDApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICB2b2lkKiBwUHJvb2ZQcm9maWxlID0gTlVMTDsKKyAgaWYgKHBQcm9vZlBhcmFtKSB7CisgICAgcFByb29mUHJvZmlsZSA9IENyZWF0ZVByb2ZpbGUocFByb29mUGFyYW0sIEljY19DTEFTU19QUk9PRiwgJmtleSk7CisgIH0KKyAga2V5IDw8IGR3SW5wdXRQcm9maWxlVHlwZSA8PCBkd091dHB1dFByb2ZpbGVUeXBlIDw8IGR3SW50ZW50IDw8IGR3RmxhZworICAgICAgPDwgKHBQcm9vZlByb2ZpbGUgIT0gTlVMTCkgPDwgZHdQcmZJbnRlbnQgPDwgZHdQcmZGbGFnOworICBDRlhfQnl0ZVN0cmluZ0MgVHJhbnNmb3JtS2V5KGtleS5HZXRCdWZmZXIoKSwga2V5LkdldFNpemUoKSk7CisgIENGWF9JY2NUcmFuc2Zvcm1DYWNoZSogcFRyYW5zZm9ybUNhY2hlOworICBhdXRvIGl0ID0gbV9NYXBUcmFuZm9ybS5maW5kKFRyYW5zZm9ybUtleSk7CisgIGlmIChpdCA9PSBtX01hcFRyYW5mb3JtLmVuZCgpKSB7CisgICAgcENtbSA9IEZYX0FsbG9jKENMY21zQ21tLCAxKTsKKyAgICBwQ21tLT5tX25TcmNDb21wb25lbnRzID0gVF9DSEFOTkVMUyhkd0lucHV0UHJvZmlsZVR5cGUpOworICAgIHBDbW0tPm1fbkRzdENvbXBvbmVudHMgPSBUX0NIQU5ORUxTKGR3T3V0cHV0UHJvZmlsZVR5cGUpOworICAgIHBDbW0tPm1fYkxhYiA9IFRfQ09MT1JTUEFDRShwSW5wdXRQYXJhbS0+ZHdGb3JtYXQpID09IFBUX0xhYjsKKyAgICBwVHJhbnNmb3JtQ2FjaGUgPSBuZXcgQ0ZYX0ljY1RyYW5zZm9ybUNhY2hlKHBDbW0pOworICAgIGlmIChwUHJvb2ZQcm9maWxlKSB7CisgICAgICBwVHJhbnNmb3JtQ2FjaGUtPm1fcEljY1RyYW5zZm9ybSA9IGNtc0NyZWF0ZVByb29maW5nVHJhbnNmb3JtKAorICAgICAgICAgIHBJbnB1dFByb2ZpbGUsIGR3SW5wdXRQcm9maWxlVHlwZSwgcE91dHB1dFByb2ZpbGUsCisgICAgICAgICAgZHdPdXRwdXRQcm9maWxlVHlwZSwgcFByb29mUHJvZmlsZSwgZHdJbnRlbnQsIGR3UHJmSW50ZW50LCBkd1ByZkZsYWcpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHBDYWNoZS0+bV9kd1JhdGUrKzsKKyAgICAgIHBUcmFuc2Zvcm1DYWNoZS0+bV9wSWNjVHJhbnNmb3JtID0KKyAgICAgICAgICBjbXNDcmVhdGVUcmFuc2Zvcm0ocElucHV0UHJvZmlsZSwgZHdJbnB1dFByb2ZpbGVUeXBlLCBwT3V0cHV0UHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdPdXRwdXRQcm9maWxlVHlwZSwgZHdJbnRlbnQsIGR3RmxhZyk7CiAgICAgfQotICAgIHJldHVybiBwQ2FjaGUtPm1fcFByb2ZpbGU7CisgICAgcENtbS0+bV9oVHJhbnNmb3JtID0gcFRyYW5zZm9ybUNhY2hlLT5tX3BJY2NUcmFuc2Zvcm07CisgICAgbV9NYXBUcmFuZm9ybVtUcmFuc2Zvcm1LZXldID0gcFRyYW5zZm9ybUNhY2hlOworICB9IGVsc2UgeworICAgIHBUcmFuc2Zvcm1DYWNoZSA9IGl0LT5zZWNvbmQ7CisgICAgcFRyYW5zZm9ybUNhY2hlLT5tX2R3UmF0ZSsrOworICB9CisgIHJldHVybiBwVHJhbnNmb3JtQ2FjaGUtPm1fcENtbTsKIH0KLUZYX0xQVk9JRCBDQ29kZWNfSWNjTW9kdWxlOjpDcmVhdGVUcmFuc2Zvcm0oSUNvZGVjX0ljY01vZHVsZTo6SWNjUGFyYW0qIHBJbnB1dFBhcmFtLAotICAgICAgICBJQ29kZWNfSWNjTW9kdWxlOjpJY2NQYXJhbSogcE91dHB1dFBhcmFtLAotICAgICAgICBJQ29kZWNfSWNjTW9kdWxlOjpJY2NQYXJhbSogcFByb29mUGFyYW0sCi0gICAgICAgIEZYX0RXT1JEIGR3SW50ZW50LCBGWF9EV09SRCBkd0ZsYWcsIEZYX0RXT1JEIGR3UHJmSW50ZW50LCBGWF9EV09SRCBkd1ByZkZsYWcpCi17Ci0gICAgQ0xjbXNDbW0qIHBDbW0gPSBOVUxMOwotICAgIEFTU0VSVChwSW5wdXRQYXJhbSAmJiBwT3V0cHV0UGFyYW0pOwotICAgIENGWF9CeXRlU3RyaW5nS2V5IGtleTsKLSAgICBGWF9MUFZPSUQgcElucHV0UHJvZmlsZSA9IENyZWF0ZVByb2ZpbGUocElucHV0UGFyYW0sIEljY19DTEFTU19JTlBVVCwgJmtleSk7Ci0gICAgaWYgKHBJbnB1dFByb2ZpbGUgPT0gTlVMTCkJewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgRlhfTFBWT0lEIHBPdXRwdXRQcm9maWxlID0gQ3JlYXRlUHJvZmlsZShwT3V0cHV0UGFyYW0sIEljY19DTEFTU19PVVRQVVQsICZrZXkpOwotICAgIGlmIChwT3V0cHV0UHJvZmlsZSA9PSBOVUxMKQl7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBGWF9EV09SRCBkd0lucHV0UHJvZmlsZVR5cGUgPSBUcmFuc2ZlclByb2ZpbGVUeXBlKHBJbnB1dFByb2ZpbGUsIHBJbnB1dFBhcmFtLT5kd0Zvcm1hdCk7Ci0gICAgRlhfRFdPUkQgZHdPdXRwdXRQcm9maWxlVHlwZSA9IFRyYW5zZmVyUHJvZmlsZVR5cGUocE91dHB1dFByb2ZpbGUsIHBPdXRwdXRQYXJhbS0+ZHdGb3JtYXQpOwotICAgIGlmIChkd0lucHV0UHJvZmlsZVR5cGUgPT0gMCB8fCBkd091dHB1dFByb2ZpbGVUeXBlID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYX0xQVk9JRCBwUHJvb2ZQcm9maWxlID0gTlVMTDsKLSAgICBpZiAocFByb29mUGFyYW0pIHsKLSAgICAgICAgcFByb29mUHJvZmlsZSA9IENyZWF0ZVByb2ZpbGUocFByb29mUGFyYW0sIEljY19DTEFTU19QUk9PRiwgJmtleSk7Ci0gICAgfQotICAgIGtleSA8PCBkd0lucHV0UHJvZmlsZVR5cGUgPDwgZHdPdXRwdXRQcm9maWxlVHlwZSA8PCBkd0ludGVudCA8PCBkd0ZsYWcgPDwgKHBQcm9vZlByb2ZpbGUgIT0gTlVMTCkgPDwgZHdQcmZJbnRlbnQgPDwgZHdQcmZGbGFnOwotICAgIENGWF9CeXRlU3RyaW5nQyBUcmFuc2Zvcm1LZXkoa2V5LkdldEJ1ZmZlcigpLCBrZXkuR2V0U2l6ZSgpKTsKLSAgICBDRlhfSWNjVHJhbnNmb3JtQ2FjaGUqIHBUcmFuc2Zvcm1DYWNoZTsKLSAgICBpZiAoIW1fTWFwVHJhbmZvcm0uTG9va3VwKFRyYW5zZm9ybUtleSwgKEZYX0xQVk9JRCYpcFRyYW5zZm9ybUNhY2hlKSkgewotICAgICAgICBwQ21tID0gRlhfQWxsb2MoQ0xjbXNDbW0sIDEpOwotICAgICAgICBwQ21tLT5tX25TcmNDb21wb25lbnRzID0gVF9DSEFOTkVMUyhkd0lucHV0UHJvZmlsZVR5cGUpOwotICAgICAgICBwQ21tLT5tX25Ec3RDb21wb25lbnRzID0gVF9DSEFOTkVMUyhkd091dHB1dFByb2ZpbGVUeXBlKTsKLSAgICAgICAgcENtbS0+bV9iTGFiID0gVF9DT0xPUlNQQUNFKHBJbnB1dFBhcmFtLT5kd0Zvcm1hdCkgPT0gUFRfTGFiOwotICAgICAgICBwVHJhbnNmb3JtQ2FjaGUgPSBuZXcgQ0ZYX0ljY1RyYW5zZm9ybUNhY2hlKHBDbW0pOwotICAgICAgICBpZiAocFByb29mUHJvZmlsZSkgewotICAgICAgICAgICAgcFRyYW5zZm9ybUNhY2hlLT5tX3BJY2NUcmFuc2Zvcm0gPSBjbXNDcmVhdGVQcm9vZmluZ1RyYW5zZm9ybShwSW5wdXRQcm9maWxlLCBkd0lucHV0UHJvZmlsZVR5cGUsIHBPdXRwdXRQcm9maWxlLCBkd091dHB1dFByb2ZpbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvb2ZQcm9maWxlLCBkd0ludGVudCwgZHdQcmZJbnRlbnQsIGR3UHJmRmxhZyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwVHJhbnNmb3JtQ2FjaGUtPm1fcEljY1RyYW5zZm9ybSA9IGNtc0NyZWF0ZVRyYW5zZm9ybShwSW5wdXRQcm9maWxlLCBkd0lucHV0UHJvZmlsZVR5cGUsIHBPdXRwdXRQcm9maWxlLCBkd091dHB1dFByb2ZpbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0ludGVudCwgZHdGbGFnKTsKLSAgICAgICAgfQotICAgICAgICBwQ21tLT5tX2hUcmFuc2Zvcm0gPSBwVHJhbnNmb3JtQ2FjaGUtPm1fcEljY1RyYW5zZm9ybTsKLSAgICAgICAgbV9NYXBUcmFuZm9ybS5TZXRBdChUcmFuc2Zvcm1LZXksIHBUcmFuc2Zvcm1DYWNoZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcFRyYW5zZm9ybUNhY2hlLT5tX2R3UmF0ZSsrOwotICAgIH0KLSAgICByZXR1cm4gcFRyYW5zZm9ybUNhY2hlLT5tX3BDbW07CitDQ29kZWNfSWNjTW9kdWxlOjp+Q0NvZGVjX0ljY01vZHVsZSgpIHsKKyAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbV9NYXBQcm9maWxlKSB7CisgICAgZGVsZXRlIHBhaXIuc2Vjb25kOworICB9CisgIG1fTWFwUHJvZmlsZS5jbGVhcigpOworICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBtX01hcFRyYW5mb3JtKSB7CisgICAgZGVsZXRlIHBhaXIuc2Vjb25kOworICB9CisgIG1fTWFwVHJhbmZvcm0uY2xlYXIoKTsKIH0KLUNDb2RlY19JY2NNb2R1bGU6On5DQ29kZWNfSWNjTW9kdWxlKCkKLXsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBtX01hcFByb2ZpbGUuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIENGWF9CeXRlU3RyaW5nIGtleTsKLSAgICBDRlhfSWNjUHJvZmlsZUNhY2hlKiBwUHJvZmlsZUNhY2hlOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgbV9NYXBQcm9maWxlLkdldE5leHRBc3NvYyhwb3MsIGtleSwgKEZYX0xQVk9JRCYpcFByb2ZpbGVDYWNoZSk7Ci0gICAgICAgIGlmIChwUHJvZmlsZUNhY2hlKSB7Ci0gICAgICAgICAgICBkZWxldGUgcFByb2ZpbGVDYWNoZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwb3MgPSBtX01hcFRyYW5mb3JtLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICBDRlhfSWNjVHJhbnNmb3JtQ2FjaGUqIHBUcmFuc2Zvcm1DYWNoZTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIG1fTWFwVHJhbmZvcm0uR2V0TmV4dEFzc29jKHBvcywga2V5LCAoRlhfTFBWT0lEJilwVHJhbnNmb3JtQ2FjaGUpOwotICAgICAgICBpZiAocFRyYW5zZm9ybUNhY2hlKSB7Ci0gICAgICAgICAgICBkZWxldGUgcFRyYW5zZm9ybUNhY2hlOwotICAgICAgICB9Ci0gICAgfQordm9pZCogQ0NvZGVjX0ljY01vZHVsZTo6Q3JlYXRlVHJhbnNmb3JtX3NSR0IoY29uc3QgdWludDhfdCogcFByb2ZpbGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQcm9maWxlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5Db21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1NyY0Zvcm1hdCkgeworICByZXR1cm4gSWNjTGliX0NyZWF0ZVRyYW5zZm9ybV9zUkdCKHBQcm9maWxlRGF0YSwgZHdQcm9maWxlU2l6ZSwgbkNvbXBvbmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LCBkd1NyY0Zvcm1hdCk7CiB9Ci12b2lkKiBDQ29kZWNfSWNjTW9kdWxlOjpDcmVhdGVUcmFuc2Zvcm1fc1JHQihGWF9MUENCWVRFIHBQcm9maWxlRGF0YSwgRlhfRFdPUkQgZHdQcm9maWxlU2l6ZSwgRlhfSU5UMzImIG5Db21wb25lbnRzLCBGWF9JTlQzMiBpbnRlbnQsIEZYX0RXT1JEIGR3U3JjRm9ybWF0KQotewotICAgIHJldHVybiBJY2NMaWJfQ3JlYXRlVHJhbnNmb3JtX3NSR0IocFByb2ZpbGVEYXRhLCBkd1Byb2ZpbGVTaXplLCBuQ29tcG9uZW50cywgaW50ZW50LCBkd1NyY0Zvcm1hdCk7Cit2b2lkKiBDQ29kZWNfSWNjTW9kdWxlOjpDcmVhdGVUcmFuc2Zvcm1fQ01ZSyhjb25zdCB1aW50OF90KiBwU3JjUHJvZmlsZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1NyY1Byb2ZpbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgblNyY0NvbXBvbmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwRHN0UHJvZmlsZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0RzdFByb2ZpbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1NyY0Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RHN0Rm9ybWF0KSB7CisgIHJldHVybiBJY2NMaWJfQ3JlYXRlVHJhbnNmb3JtKAorICAgICAgcFNyY1Byb2ZpbGVEYXRhLCBkd1NyY1Byb2ZpbGVTaXplLCBuU3JjQ29tcG9uZW50cywgcERzdFByb2ZpbGVEYXRhLAorICAgICAgZHdEc3RQcm9maWxlU2l6ZSwgNCwgaW50ZW50LCBkd1NyY0Zvcm1hdCwgZHdEc3RGb3JtYXQpOwogfQotdm9pZCogQ0NvZGVjX0ljY01vZHVsZTo6Q3JlYXRlVHJhbnNmb3JtX0NNWUsoRlhfTFBDQllURSBwU3JjUHJvZmlsZURhdGEsIEZYX0RXT1JEIGR3U3JjUHJvZmlsZVNpemUsIEZYX0lOVDMyJiBuU3JjQ29tcG9uZW50cywKLSAgICBGWF9MUENCWVRFIHBEc3RQcm9maWxlRGF0YSwgRlhfRFdPUkQgZHdEc3RQcm9maWxlU2l6ZSwgRlhfSU5UMzIgaW50ZW50LAotICAgICAgICBGWF9EV09SRCBkd1NyY0Zvcm1hdCAsIEZYX0RXT1JEIGR3RHN0Rm9ybWF0KQotewotICAgIHJldHVybiBJY2NMaWJfQ3JlYXRlVHJhbnNmb3JtKHBTcmNQcm9maWxlRGF0YSwgZHdTcmNQcm9maWxlU2l6ZSwgblNyY0NvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERzdFByb2ZpbGVEYXRhLCBkd0RzdFByb2ZpbGVTaXplLCA0LCBpbnRlbnQsIGR3U3JjRm9ybWF0LCBkd0RzdEZvcm1hdCk7Cit2b2lkIENDb2RlY19JY2NNb2R1bGU6OkRlc3Ryb3lUcmFuc2Zvcm0odm9pZCogcFRyYW5zZm9ybSkgeworICBJY2NMaWJfRGVzdHJveVRyYW5zZm9ybShwVHJhbnNmb3JtKTsKIH0KLXZvaWQgQ0NvZGVjX0ljY01vZHVsZTo6RGVzdHJveVRyYW5zZm9ybSh2b2lkKiBwVHJhbnNmb3JtKQotewotICAgIEljY0xpYl9EZXN0cm95VHJhbnNmb3JtKHBUcmFuc2Zvcm0pOwordm9pZCBDQ29kZWNfSWNjTW9kdWxlOjpUcmFuc2xhdGUodm9pZCogcFRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBwU3JjVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIHBEZXN0VmFsdWVzKSB7CisgIEljY0xpYl9UcmFuc2xhdGUocFRyYW5zZm9ybSwgbV9uQ29tcG9uZW50cywgcFNyY1ZhbHVlcywgcERlc3RWYWx1ZXMpOwogfQotdm9pZCBDQ29kZWNfSWNjTW9kdWxlOjpUcmFuc2xhdGUodm9pZCogcFRyYW5zZm9ybSwgRlhfRkxPQVQqIHBTcmNWYWx1ZXMsIEZYX0ZMT0FUKiBwRGVzdFZhbHVlcykKLXsKLSAgICBJY2NMaWJfVHJhbnNsYXRlKHBUcmFuc2Zvcm0sIG1fbkNvbXBvbmVudHMsIHBTcmNWYWx1ZXMsIHBEZXN0VmFsdWVzKTsKK3ZvaWQgQ0NvZGVjX0ljY01vZHVsZTo6VHJhbnNsYXRlU2NhbmxpbmUodm9pZCogcFRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcERlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGl4ZWxzKSB7CisgIEljY0xpYl9UcmFuc2xhdGVJbWFnZShwVHJhbnNmb3JtLCBwRGVzdCwgcFNyYywgcGl4ZWxzKTsKIH0KLXZvaWQgQ0NvZGVjX0ljY01vZHVsZTo6VHJhbnNsYXRlU2NhbmxpbmUodm9pZCogcFRyYW5zZm9ybSwgRlhfTFBCWVRFIHBEZXN0LCBGWF9MUENCWVRFIHBTcmMsIEZYX0lOVDMyIHBpeGVscykKLXsKLSAgICBJY2NMaWJfVHJhbnNsYXRlSW1hZ2UocFRyYW5zZm9ybSwgcERlc3QsIHBTcmMsIHBpeGVscyk7Ci19Ci1jb25zdCBGWF9CWVRFIGdfQ01ZS1NhbXBsZXNbODEgKiA4MSAqIDNdID0gewotICAgIDI1NSwgMjU1LCAyNTUsIDIyNSwgMjI2LCAyMjgsIDE5OSwgMjAwLCAyMDIsIDE3MywgMTc0LCAxNzgsIDE0NywgMTQ5LCAxNTIsIDEyMywgMTI1LCAxMjgsICA5OSwgOTksIDEwMiwgIDY5LCA3MCwgNzEsICAzNCwgMzAsIDMxLAotICAgIDI1NSwgMjUzLCAyMjksIDIyNiwgMjI0LCAyMDMsIDIwMCwgMTk5LCAxODIsIDE3MywgMTczLCAxNTgsIDE0OSwgMTQ4LCAxMzUsIDEyNSwgMTI0LCAxMTMsICA5OSwgOTksIDkwLCAgNzAsIDY5LCA2MywgIDMzLCAyOSwgMjQsCi0gICAgMjU1LCAyNTEsIDIwNCwgMjI4LCAyMjMsIDE4MiwgMjAxLCAxOTgsIDE2MywgMTc0LCAxNzIsIDE0MiwgMTUwLCAxNDcsIDEyMiwgMTI1LCAxMjMsIDEwMSwgIDk5LCA5OCwgODAsICA3MCwgNjgsIDU0LCAgMzIsIDI4LCAxNiwKLSAgICAyNTUsIDI0OSwgMTc5LCAyMzAsIDIyMiwgMTYwLCAyMDMsIDE5NywgMTQ0LCAxNzQsIDE3MCwgMTI0LCAxNTAsIDE0NSwgMTA1LCAxMjUsIDEyMiwgODgsICA5OSwgOTcsIDY5LCAgNzAsIDY4LCA0NiwgIDMxLCAyOCwgIDYsCi0gICAgMjU1LCAyNDcsIDE1NCwgMjI5LCAyMjAsIDEzOCwgMjAzLCAxOTUsIDEyMiwgMTc2LCAxNjksIDEwNywgMTUwLCAxNDUsIDkxLCAxMjUsIDEyMSwgNzQsIDEwMCwgOTYsIDU3LCAgNzAsIDY3LCAzNSwgIDI5LCAyNiwgIDAsCi0gICAgMjU1LCAyNDYsIDEyOCwgMjMxLCAyMTcsIDExNCwgMjA1LCAxOTQsIDEwMSwgMTc2LCAxNjcsIDg4LCAxNTAsIDE0NCwgNzUsIDEyNSwgMTIwLCA2MCwgMTAwLCA5NiwgNDQsICA3MCwgNjYsIDI0LCAgMjgsIDI2LCAgMCwKLSAgICAyNTUsIDI0NCwgOTYsIDIzMSwgMjE3LCA4NywgMjAzLCAxOTIsIDc4LCAxNzUsIDE2NywgNjYsIDE1MCwgMTQzLCA1NiwgMTI1LCAxMTksIDQzLCAxMDAsIDk1LCAyOSwgIDY5LCA2NiwgIDcsICAyNiwgMjYsICAwLAotICAgIDI1NSwgMjQzLCA1MSwgMjMyLCAyMTUsIDUxLCAyMDQsIDE5MSwgNDMsIDE3NiwgMTY1LCAzOCwgMTUwLCAxNDIsIDI4LCAxMjUsIDExOCwgMTcsICA5OSwgOTQsICAwLCAgNjgsIDY1LCAgMCwgIDI0LCAyNSwgIDAsCi0gICAgMjU1LCAyNDEsICAwLCAyMzEsIDIxNSwgIDAsIDIwMywgMTkwLCAgMCwgMTc2LCAxNjQsICAwLCAxNTAsIDE0MSwgIDAsIDEyNiwgMTE3LCAgMCwgIDk5LCA5MywgIDAsICA2OCwgNjUsICAwLCAgMjQsIDI1LCAgMCwKLSAgICAyNTIsIDIyOCwgMjM4LCAyMjIsIDIwMSwgMjExLCAxOTcsIDE4MCwgMTkwLCAxNzEsIDE1NiwgMTY2LCAxNDcsIDEzMywgMTQzLCAxMjMsIDExMSwgMTE5LCAgOTksIDg4LCA5NCwgIDcxLCA2MSwgNjYsICAzNCwgMjIsIDI2LAotICAgIDI1NCwgMjI2LCAyMTMsIDIyNCwgMjAxLCAxOTEsIDE5OSwgMTc5LCAxNzEsIDE3MiwgMTU1LCAxNDgsIDE0NywgMTMzLCAxMjgsIDEyMywgMTEwLCAxMDYsICA5OCwgODcsIDgzLCAgNzAsIDU5LCA1NywgIDMzLCAyMSwgMTgsCi0gICAgMjU0LCAyMjQsIDE5MSwgMjI0LCAxOTksIDE3MiwgMjAwLCAxNzcsIDE1MywgMTczLCAxNTQsIDEzMywgMTQ3LCAxMzIsIDExNSwgMTIzLCAxMDksIDk0LCAgOTgsIDg2LCA3NCwgIDcwLCA1OSwgNDksICAzMiwgMjEsICA5LAotICAgIDI1NSwgMjIyLCAxNjgsIDIyNywgMTk4LCAxNTAsIDIwMCwgMTc1LCAxMzUsIDE3MywgMTUzLCAxMTgsIDE0OCwgMTMwLCA5OSwgMTIzLCAxMDksIDgyLCAgOTgsIDg2LCA2NCwgIDY5LCA1OCwgNDAsICAzMSwgMTksICAwLAotICAgIDI1NSwgMjIxLCAxNDUsIDIyNywgMTk2LCAxMjksIDIwMSwgMTc0LCAxMTUsIDE3MywgMTUxLCA5OSwgMTQ4LCAxMjksIDg1LCAxMjQsIDEwOCwgNjksICA5OCwgODUsIDUyLCAgNjksIDU4LCAzMCwgIDMwLCAxOSwgIDAsCi0gICAgMjU1LCAyMTksIDEyMSwgMjI3LCAxOTUsIDEwOSwgMjAxLCAxNzQsIDk3LCAxNzQsIDE1MCwgODMsIDE0OCwgMTI5LCA3MCwgMTI0LCAxMDcsIDU1LCAgOTgsIDg0LCA0MCwgIDY5LCA1OCwgMTksICAyOCwgMTgsICAwLAotICAgIDI1NSwgMjE4LCA5MiwgMjI5LCAxOTQsIDgyLCAyMDIsIDE3MywgNzUsIDE3NCwgMTUwLCA2MywgMTQ5LCAxMjgsIDUxLCAxMjQsIDEwNiwgMzksICA5OCwgODQsIDI0LCAgNjgsIDU3LCAgMywgIDI2LCAxOCwgIDAsCi0gICAgMjU1LCAyMTcsIDU0LCAyMjgsIDE5MywgNTIsIDIwMSwgMTcyLCA0NiwgMTc0LCAxNDgsIDM2LCAxNDgsIDEyNywgMjcsIDEyMywgMTA1LCAxNCwgIDk4LCA4MywgIDAsICA2OCwgNTYsICAwLCAgMjUsIDE4LCAgMCwKLSAgICAyNTUsIDIxNiwgIDAsIDIyOSwgMTkyLCAgMiwgMjAyLCAxNzEsICA0LCAxNzMsIDE0OCwgIDAsIDE0OCwgMTI2LCAgMCwgMTI0LCAxMDUsICAwLCAgOTgsIDgzLCAgMCwgIDY4LCA1NiwgIDAsICAyNCwgMTcsICAwLAotICAgIDI0OSwgMjA0LCAyMjMsIDIxOSwgMTgxLCAxOTksIDE5NSwgMTYwLCAxNzgsIDE3MCwgMTQwLCAxNTYsIDE0NiwgMTE5LCAxMzQsIDEyMywgOTksIDExMiwgIDk4LCA3NywgODgsICA3MCwgNTIsIDYxLCAgMzQsIDExLCAyMCwKLSAgICAyNTAsIDIwMSwgMjAwLCAyMjEsIDE4MCwgMTc4LCAxOTcsIDE1OSwgMTYxLCAxNzEsIDEzOSwgMTM5LCAxNDcsIDExOSwgMTIwLCAxMjMsIDk4LCA5OSwgIDk4LCA3NywgNzgsICA2OSwgNTEsIDUyLCAgMzQsIDExLCAxMCwKLSAgICAyNTIsIDIwMSwgMTgwLCAyMjMsIDE3OSwgMTYyLCAxOTcsIDE1OSwgMTQ0LCAxNzAsIDEzOCwgMTI1LCAxNDYsIDExNywgMTA3LCAxMjIsIDk3LCA4OSwgIDk4LCA3NiwgNjksICA2OSwgNTAsIDQ0LCAgMzIsIDExLCAgMiwKLSAgICAyNTIsIDE5OSwgMTU4LCAyMjIsIDE3NywgMTQzLCAxOTksIDE1OCwgMTI3LCAxNzEsIDEzNywgMTEwLCAxNDcsIDExNywgOTMsIDEyMiwgOTYsIDc2LCAgOTcsIDc1LCA1OCwgIDY5LCA1MCwgMzYsICAzMiwgMTAsICAwLAotICAgIDI1MywgMTk4LCAxMzcsIDIyMywgMTc3LCAxMjMsIDE5OCwgMTU2LCAxMTAsIDE3MSwgMTM2LCA5NSwgMTQ2LCAxMTYsIDgwLCAxMjIsIDk2LCA2NSwgIDk3LCA3NSwgNDcsICA2OSwgNTAsIDI1LCAgMzAsIDEwLCAgMCwKLSAgICAyNTQsIDE5NywgMTE1LCAyMjUsIDE3NSwgMTA0LCAxOTgsIDE1NiwgOTIsIDE3MiwgMTM1LCA3OSwgMTQ3LCAxMTUsIDY2LCAxMjMsIDk1LCA1MiwgIDk4LCA3NCwgMzcsICA2OSwgNDksIDE1LCAgMjksIDEwLCAgMCwKLSAgICAyNTQsIDE5NiwgODksIDIyNCwgMTc1LCA4MCwgMTk5LCAxNTQsIDcwLCAxNzIsIDEzNCwgNTksIDE0NiwgMTE0LCA0OCwgMTIyLCA5NSwgMzYsICA5NywgNzQsIDIxLCAgNjgsIDQ5LCAgMCwgIDI3LCAgOSwgIDAsCi0gICAgMjU1LCAxOTUsIDU3LCAyMjUsIDE3MywgNTIsIDE5OCwgMTU0LCA0NCwgMTcyLCAxMzMsIDM2LCAxNDcsIDExMywgMjYsIDEyMywgOTQsIDE0LCAgOTgsIDc0LCAgMCwgIDY4LCA0OSwgIDAsICAyNiwgMTAsICAwLAotICAgIDI1NCwgMTk0LCAxNSwgMjI1LCAxNzIsIDEyLCAxOTgsIDE1MywgIDcsIDE3MiwgMTMyLCAgMywgMTQ2LCAxMTMsICAwLCAxMjMsIDkzLCAgMCwgIDk4LCA3MywgIDAsICA2OCwgNDksICAwLCAgMjYsICA5LCAgMCwKLSAgICAyNDYsIDE3OCwgMjA5LCAyMTgsIDE1OSwgMTg2LCAxOTQsIDE0MCwgMTY2LCAxNjgsIDEyMiwgMTQ1LCAxNDQsIDEwNCwgMTI1LCAxMjEsIDg1LCAxMDMsICA5NywgNjUsIDgxLCAgNjksIDQxLCA1NSwgIDM0LCAgMCwgMTIsCi0gICAgMjQ4LCAxNzYsIDE4NiwgMjE5LCAxNTcsIDE2NiwgMTk1LCAxMzksIDE0OSwgMTY4LCAxMjEsIDEzMCwgMTQ0LCAxMDMsIDExMSwgMTIxLCA4NSwgOTEsICA5NywgNjUsIDcxLCAgNjksIDQxLCA0NiwgIDM0LCAgMCwgIDQsCi0gICAgMjQ5LCAxNzUsIDE2OCwgMjIwLCAxNTYsIDE1MCwgMTk2LCAxMzksIDEzNSwgMTY5LCAxMjEsIDExNiwgMTQ0LCAxMDMsIDEwMCwgMTIyLCA4NCwgODMsICA5OCwgNjUsIDYzLCAgNzAsIDQxLCAzOSwgIDMzLCAgMCwgIDAsCi0gICAgMjQ5LCAxNzUsIDE0OCwgMjIwLCAxNTUsIDEzMywgMTk2LCAxMzgsIDExOSwgMTY5LCAxMjAsIDEwMywgMTQ1LCAxMDEsIDg3LCAxMjEsIDgzLCA3MSwgIDk3LCA2NSwgNTQsICA2OSwgNDEsIDMxLCAgMzIsICAwLCAgMCwKLSAgICAyNDksIDE3MywgMTI4LCAyMjIsIDE1NCwgMTE1LCAxOTUsIDEzNywgMTAyLCAxNzAsIDExOSwgODgsIDE0NSwgMTAxLCA3NCwgMTIyLCA4MywgNTksICA5NywgNjQsIDQzLCAgNjgsIDQwLCAyMCwgIDMwLCAgMCwgIDAsCi0gICAgMjUwLCAxNzIsIDEwOCwgMjIxLCAxNTQsIDk4LCAxOTUsIDEzNiwgODYsIDE3MCwgMTE4LCA3MywgMTQ1LCAxMDAsIDYxLCAxMjIsIDgyLCA0OCwgIDk3LCA2MywgMzIsICA2OSwgNDAsIDExLCAgMjgsICAwLCAgMCwKLSAgICAyNTAsIDE3MSwgODUsIDIyMSwgMTUzLCA3NiwgMTk2LCAxMzYsIDY3LCAxNzAsIDExNywgNTYsIDE0NSwgOTksIDQ0LCAxMjEsIDgyLCAzMywgIDk3LCA2MywgMTcsICA2OCwgNDAsICAwLCAgMjgsICAwLCAgMCwKLSAgICAyNTEsIDE3MSwgNTgsIDIyMiwgMTUyLCA1MCwgMTk3LCAxMzUsIDQzLCAxNjksIDExNywgMzQsIDE0NiwgOTksIDI1LCAxMjEsIDgxLCAxMCwgIDk2LCA2MywgIDAsICA2OCwgNDAsICAwLCAgMjcsICAwLCAgMCwKLSAgICAyNTAsIDE3MCwgMjYsIDIyMiwgMTUxLCAxOSwgMTk2LCAxMzQsIDEzLCAxNjksIDExNiwgIDQsIDE0NSwgOTksICAwLCAxMjIsIDgxLCAgMCwgIDk3LCA2MywgIDAsICA2NywgNDAsICAwLCAgMjYsICAwLCAgMCwKLSAgICAyNDQsIDE1MywgMTk0LCAyMTUsIDEzNiwgMTczLCAxOTIsIDEyMSwgMTU1LCAxNjcsIDEwNCwgMTM1LCAxNDMsIDg5LCAxMTUsIDEyMSwgNzIsIDk2LCAgOTcsIDU0LCA3NSwgIDcwLCAzMSwgNDksICAzNCwgIDAsICA2LAotICAgIDI0NSwgMTUzLCAxNzMsIDIxNiwgMTM2LCAxNTUsIDE5MiwgMTIwLCAxMzgsIDE2NywgMTA0LCAxMjEsIDE0NCwgODgsIDEwMywgMTIxLCA3MSwgODUsICA5NywgNTQsIDY2LCAgNjksIDMxLCA0MiwgIDM0LCAgMCwgIDAsCi0gICAgMjQ2LCAxNTIsIDE1NywgMjE3LCAxMzUsIDE0MCwgMTkzLCAxMjAsIDEyNiwgMTY3LCAxMDMsIDEwOSwgMTQzLCA4OCwgOTIsIDEyMSwgNzIsIDc2LCAgOTcsIDU0LCA1OCwgIDY5LCAzMSwgMzUsICAzMywgIDAsICAwLAotICAgIDI0NSwgMTUwLCAxMzksIDIxOCwgMTM0LCAxMjUsIDE5MywgMTE5LCAxMTEsIDE2NywgMTAzLCA5NiwgMTQ0LCA4NywgODAsIDEyMSwgNzEsIDY2LCAgOTYsIDUzLCA0OSwgIDY4LCAzMSwgMjYsICAzMiwgIDAsICAwLAotICAgIDI0NiwgMTUxLCAxMjIsIDIxOCwgMTMzLCAxMDgsIDE5NCwgMTE4LCA5NiwgMTY4LCAxMDIsIDgxLCAxNDQsIDg2LCA2OSwgMTIwLCA3MSwgNTUsICA5NSwgNTMsIDM5LCAgNjgsIDMwLCAxNywgIDMxLCAgMCwgIDAsCi0gICAgMjQ4LCAxNTAsIDEwMywgMjE4LCAxMzMsIDkxLCAxOTMsIDExOCwgODEsIDE2OCwgMTAyLCA2OSwgMTQzLCA4NiwgNTYsIDEyMCwgNzAsIDQzLCAgOTYsIDUzLCAyOCwgIDY4LCAzMSwgIDYsICAyOSwgIDAsICAwLAotICAgIDI0NywgMTQ5LCA4MSwgMjE4LCAxMzIsIDcyLCAxOTQsIDExNywgNjIsIDE2OCwgMTAxLCA1MiwgMTQ0LCA4NiwgNDIsIDEyMSwgNzAsIDI5LCAgOTYsIDUyLCAxMywgIDY4LCAzMCwgIDAsICAyOCwgIDAsICAwLAotICAgIDI0NywgMTQ4LCA1NSwgMjE5LCAxMzEsIDUwLCAxOTQsIDExNywgNDMsIDE2NywgMTAxLCAzMiwgMTQ0LCA4NSwgMjIsIDEyMCwgNjksICA4LCAgOTYsIDUyLCAgMCwgIDY3LCAzMCwgIDAsICAyNywgIDAsICAwLAotICAgIDI0NywgMTQ3LCAyOSwgMjE4LCAxMzEsIDI0LCAxOTQsIDExNiwgMjAsIDE2OCwgMTAwLCAxMSwgMTQ0LCA4NSwgIDAsIDEyMCwgNjksICAwLCAgOTYsIDUyLCAgMCwgIDY3LCAzMCwgIDAsICAyNiwgIDAsICAwLAotICAgIDI0MiwgMTMwLCAxNzksIDIxNCwgMTE0LCAxNjAsIDE5MCwgMTAxLCAxNDMsIDE2NiwgODcsIDEyNSwgMTQzLCA3MiwgMTA3LCAxMjAsIDU4LCA4OCwgIDk2LCA0MiwgNjgsICA2OSwgMTcsIDQ0LCAgMzUsICAwLCAgMCwKLSAgICAyNDMsIDEyOSwgMTYxLCAyMTUsIDExNCwgMTQzLCAxOTEsIDEwMSwgMTI4LCAxNjYsIDg3LCAxMTMsIDE0MywgNzMsIDk2LCAxMjAsIDU4LCA3OSwgIDk2LCA0MSwgNjAsICA2OSwgMTgsIDM3LCAgMzMsICAwLCAgMCwKLSAgICAyNDMsIDEyOSwgMTQ2LCAyMTYsIDExNCwgMTMwLCAxOTIsIDEwMSwgMTE3LCAxNjYsIDg3LCAxMDEsIDE0MywgNzIsIDg2LCAxMjEsIDU4LCA2OSwgIDk2LCA0MiwgNTIsICA2OSwgMTgsIDI5LCAgMzEsICAwLCAgMCwKLSAgICAyNDMsIDEyOCwgMTMwLCAyMTYsIDExNCwgMTE1LCAxOTEsIDEwMSwgMTAyLCAxNjUsIDg2LCA4OCwgMTQyLCA3MiwgNzUsIDEyMCwgNTgsIDYwLCAgOTUsIDQyLCA0MywgIDY4LCAxOSwgMjEsICAzMCwgIDAsICAwLAotICAgIDI0NCwgMTI3LCAxMTIsIDIxNywgMTEzLCAxMDEsIDE5MiwgOTksIDg5LCAxNjYsIDg1LCA3NSwgMTQyLCA3MiwgNjMsIDExOSwgNTcsIDUwLCAgOTYsIDQxLCAzNSwgIDY4LCAxOSwgMTMsICAzMCwgIDAsICAwLAotICAgIDI0NCwgMTI3LCA5NiwgMjE2LCAxMTIsIDg2LCAxOTEsIDk5LCA3NSwgMTY2LCA4NiwgNjQsIDE0MywgNzIsIDUyLCAxMjAsIDU3LCA0MCwgIDk1LCA0MSwgMjQsICA2NywgMjAsICAxLCAgMjksICAwLCAgMCwKLSAgICAyNDUsIDEyNiwgNzcsIDIxNiwgMTEzLCA2OCwgMTkxLCAxMDAsIDU5LCAxNjYsIDg1LCA0OSwgMTQyLCA3MSwgMzgsIDExOSwgNTcsIDI2LCAgOTUsIDQxLCAxMCwgIDY3LCAyMCwgIDAsICAyOCwgIDAsICAwLAotICAgIDI0NCwgMTI2LCA1NSwgMjE2LCAxMTIsIDQ4LCAxOTEsIDk5LCA0MCwgMTY2LCA4NSwgMzEsIDE0MywgNzEsIDIwLCAxMTksIDU3LCAgNiwgIDk1LCA0MiwgIDAsICA2NywgMjAsICAwLCAgMjgsICAwLCAgMCwKLSAgICAyNDUsIDEyNiwgMzMsIDIxNywgMTEyLCAyNiwgMTkyLCA5OSwgMjIsIDE2NiwgODQsIDExLCAxNDIsIDcwLCAgMCwgMTE5LCA1NywgIDAsICA5NSwgNDEsICAwLCAgNjYsIDIwLCAgMCwgIDI3LCAgMCwgIDAsCi0gICAgMjQxLCAxMDIsIDE2NywgMjEzLCA5MCwgMTQ5LCAxODksIDc5LCAxMzMsIDE2NSwgNjYsIDExNSwgMTQxLCA1NCwgOTgsIDExOSwgNDEsIDgxLCAgOTYsIDI1LCA2MywgIDY5LCAgMCwgMzgsICAzMCwgIDAsICAwLAotICAgIDI0MSwgMTAyLCAxNDksIDIxMywgOTAsIDEzMywgMTg5LCA3OSwgMTE5LCAxNjUsIDY2LCAxMDMsIDE0MiwgNTUsIDg4LCAxMTksIDQxLCA3MSwgIDk2LCAyNSwgNTMsICA2OSwgIDAsIDMxLCAgMjgsICAwLCAgMCwKLSAgICAyNDEsIDEwMiwgMTM1LCAyMTQsIDkwLCAxMjEsIDE5MCwgNzksIDEwOCwgMTY1LCA2NiwgOTIsIDE0MSwgNTUsIDc4LCAxMTksIDQyLCA2MywgIDk2LCAyNiwgNDYsICA2OSwgIDAsIDI0LCAgMjgsICAwLCAgMCwKLSAgICAyNDEsIDEwMSwgMTIwLCAyMTQsIDkwLCAxMDcsIDE4OSwgNzksIDk1LCAxNjUsIDY3LCA4MywgMTQxLCA1NCwgNjgsIDExOCwgNDEsIDU0LCAgOTUsIDI3LCAzOSwgIDY4LCAgMCwgMTYsICAyNywgIDAsICAwLAotICAgIDI0MSwgMTAyLCAxMDYsIDIxMywgOTAsIDkzLCAxODksIDc4LCA4MiwgMTY0LCA2NywgNzAsIDE0MSwgNTUsIDU4LCAxMTgsIDQyLCA0NSwgIDk0LCAyNywgMjksICA2NywgIDIsICA2LCAgMjcsICAwLCAgMCwKLSAgICAyNDIsIDEwMSwgOTAsIDIxNCwgODksIDc5LCAxOTAsIDc5LCA2OSwgMTY2LCA2NywgNTksIDE0MSwgNTUsIDQ3LCAxMTgsIDQxLCAzNSwgIDk1LCAyNywgMTksICA2NywgIDMsICAwLCAgMjYsICAwLCAgMCwKLSAgICAyNDIsIDEwMiwgNzIsIDIxMywgODksIDYzLCAxOTEsIDc5LCA1NiwgMTY0LCA2NywgNDUsIDE0MSwgNTUsIDM0LCAxMTgsIDQyLCAyMiwgIDk0LCAyOCwgIDYsICA2NywgIDMsICAwLCAgMjYsICAwLCAgMCwKLSAgICAyNDIsIDEwMCwgNTEsIDIxNCwgODksIDQ1LCAxOTAsIDc4LCAzOCwgMTY0LCA2NywgMzAsIDE0MSwgNTUsIDE4LCAxMTgsIDQyLCAgMywgIDk1LCAyOCwgIDAsICA2NiwgIDQsICAwLCAgMjYsICAwLCAgMCwKLSAgICAyNDMsIDEwMCwgMzMsIDIxNCwgOTAsIDI3LCAxOTAsIDc4LCAyMiwgMTY1LCA2NywgMTMsIDE0MSwgNTUsICAwLCAxMTgsIDQzLCAgMCwgIDk0LCAyOSwgIDAsICA2NiwgIDUsICAwLCAgMjYsICAwLCAgMCwKLSAgICAyMzcsIDY5LCAxNTMsIDIxMSwgNTgsIDEzNSwgMTg3LCA1MSwgMTIxLCAxNjMsIDQxLCAxMDUsIDE0MSwgMjgsIDkwLCAxMTgsIDE1LCA3MywgIDk2LCAgMCwgNTYsICA2OCwgIDAsIDMzLCAgMjUsICAwLCAgMCwKLSAgICAyMzksIDY3LCAxMzcsIDIxMiwgNjAsIDEyMywgMTg5LCA1MCwgMTEwLCAxNjMsIDQxLCA5NCwgMTQxLCAyOSwgNzksIDExOCwgMTcsIDY1LCAgOTUsICAwLCA0OCwgIDY5LCAgMCwgMjYsICAyNSwgIDAsICAwLAotICAgIDI0MCwgNjksIDEyNCwgMjExLCA2MCwgMTExLCAxODgsIDUwLCA5OCwgMTYzLCA0MiwgODUsIDE0MSwgMzEsIDcyLCAxMTgsIDE4LCA1NywgIDk0LCAgMCwgNDEsICA2OCwgIDAsIDE5LCAgMjUsICAwLCAgMCwKLSAgICAyNDAsIDcwLCAxMTIsIDIxMiwgNjEsIDk5LCAxODgsIDUyLCA4NywgMTYzLCA0MSwgNzQsIDE0MCwgMzEsIDYyLCAxMTgsIDIwLCA0OCwgIDk0LCAgMiwgMzIsICA2OCwgIDAsIDExLCAgMjQsICAwLCAgMCwKLSAgICAyMzksIDcwLCA5OCwgMjEyLCA2MiwgODYsIDE4OCwgNTMsIDc3LCAxNjQsIDQyLCA2NCwgMTQwLCAzMiwgNTIsIDExOCwgMjAsIDQwLCAgOTQsICAzLCAyNCwgIDY3LCAgMCwgIDMsICAyMywgIDAsICAwLAotICAgIDIzOSwgNzEsIDg1LCAyMTIsIDYxLCA3NCwgMTg3LCA1MywgNjUsIDE2MywgNDQsIDU0LCAxNDAsIDM0LCA0MywgMTE4LCAyMiwgMzAsICA5NSwgIDMsIDE0LCAgNjcsICAwLCAgMCwgIDIzLCAgMCwgIDAsCi0gICAgMjM5LCA3MCwgNjcsIDIxMiwgNjIsIDU5LCAxODgsIDUzLCA1MSwgMTYzLCA0NSwgNDIsIDE0MSwgMzQsIDMxLCAxMTcsIDIyLCAxNywgIDk0LCAgNSwgIDIsICA2NiwgIDAsICAwLCAgMjMsICAwLCAgMCwKLSAgICAyMzksIDcxLCA1MCwgMjEzLCA2MiwgNDMsIDE4OCwgNTQsIDM3LCAxNjQsIDQ1LCAyOCwgMTM5LCAzNCwgMTYsIDExNywgMjIsICAyLCAgOTQsICA3LCAgMCwgIDY1LCAgMCwgIDAsICAyMywgIDAsICAwLAotICAgIDI0MCwgNzEsIDM0LCAyMTIsIDYzLCAyOSwgMTg5LCA1NCwgMjQsIDE2MywgNDYsIDE1LCAxMzksIDM2LCAgMiwgMTE3LCAyNSwgIDAsICA5NCwgIDgsICAwLCAgNjYsICAwLCAgMCwgIDIzLCAgMCwgIDAsCi0gICAgMjM3LCAgMCwgMTQwLCAyMDksICAwLCAxMjQsIDE4NiwgIDAsIDExMiwgMTYyLCAgMCwgOTcsIDE0MSwgIDAsIDgyLCAxMTgsICAwLCA2NywgIDk1LCAgMCwgNDksICA2OCwgIDAsIDI3LCAgMjAsICAwLCAgMCwKLSAgICAyMzcsICAwLCAxMjYsIDIxMCwgIDAsIDExMywgMTg3LCAgMCwgOTksIDE2MywgIDAsIDg2LCAxMzksICAwLCA3MiwgMTE4LCAgMCwgNTgsICA5NSwgIDAsIDQyLCAgNjcsICAwLCAyMCwgIDIwLCAgMCwgIDAsCi0gICAgMjM3LCAgMSwgMTE0LCAyMDksICAxLCAxMDIsIDE4NywgIDAsIDkwLCAxNjMsICAwLCA3OCwgMTM5LCAgMCwgNjQsIDExOCwgIDAsIDUwLCAgOTUsICAwLCAzNSwgIDY3LCAgMCwgMTMsICAyMCwgIDAsICAwLAotICAgIDIzNiwgMTYsIDEwMiwgMjA5LCAgNywgOTEsIDE4NiwgIDAsIDgwLCAxNjIsICAwLCA2OCwgMTM5LCAgMCwgNTYsIDExNywgIDAsIDQzLCAgOTQsICAwLCAyNywgIDY3LCAgMCwgIDYsICAyMCwgIDAsICAwLAotICAgIDIzOCwgMTUsIDg5LCAyMDksIDEzLCA3OSwgMTg2LCAgNiwgNjksIDE2MiwgIDAsIDU4LCAxMzksICAwLCA0NywgMTE3LCAgMCwgMzQsICA5MywgIDAsIDIwLCAgNjYsICAwLCAgMiwgIDIwLCAgMCwgIDAsCi0gICAgMjM3LCAyMCwgNzgsIDIxMCwgMTIsIDY4LCAxODcsICA0LCA1OSwgMTYzLCAgMCwgNDksIDEzOSwgIDAsIDM4LCAxMTYsICAwLCAyNiwgIDk0LCAgMCwgMTEsICA2NiwgIDAsICAwLCAgMjAsICAwLCAgMCwKLSAgICAyMzcsIDI1LCA2NCwgMjEwLCAxOCwgNTYsIDE4NiwgMTEsIDQ4LCAxNjIsICA0LCAzOSwgMTM4LCAgMCwgMjcsIDExNywgIDAsIDE0LCAgOTMsICAwLCAgMCwgIDY2LCAgMCwgIDAsICAyMCwgIDAsICAwLAotICAgIDIzOCwgMjUsIDQ4LCAyMTAsIDIyLCA0MywgMTg2LCAxNSwgMzUsIDE2MiwgIDgsIDI2LCAxNDAsICAwLCAxNCwgMTE3LCAgMCwgIDAsICA5MywgIDAsICAwLCAgNjUsICAwLCAgMCwgIDIwLCAgMCwgIDAsCi0gICAgMjM4LCAyOCwgMzUsIDIxMCwgMjEsIDMwLCAxODcsIDE1LCAyNCwgMTYyLCAgOCwgMTYsIDEzOSwgIDEsICAyLCAxMTcsICAwLCAgMCwgIDkzLCAgMCwgIDAsICA2NSwgIDAsICAwLCAgMjIsICAwLCAgMCwKLSAgICAyMTksIDI0MiwgMjUyLCAxOTUsIDIxNCwgMjI1LCAxNzIsIDE5MSwgMjAxLCAxNDgsIDE2NSwgMTc1LCAxMjcsIDE0MiwgMTUwLCAxMDYsIDExOSwgMTI2LCAgODQsIDk1LCAxMDEsICA1OCwgNjYsIDcyLCAgMjQsIDI3LCAzMiwKLSAgICAyMjIsIDIzOSwgMjI2LCAxOTYsIDIxMywgMjAyLCAxNzMsIDE4OSwgMTgwLCAxNTAsIDE2NSwgMTU4LCAxMjksIDE0MSwgMTM1LCAxMDcsIDExOCwgMTEzLCAgODUsIDk0LCA5MCwgIDU4LCA2NiwgNjMsICAyMSwgMjYsIDI0LAotICAgIDIyMywgMjM3LCAyMDMsIDE5OCwgMjExLCAxODIsIDE3NSwgMTg4LCAxNjMsIDE1MiwgMTY0LCAxNDEsIDEyOSwgMTQwLCAxMjEsIDEwNywgMTE3LCAxMDEsICA4NSwgOTMsIDgwLCAgNTgsIDY0LCA1NCwgIDIxLCAyNiwgMTgsCi0gICAgMjI2LCAyMzYsIDE3OSwgMjAxLCAyMTAsIDE2MCwgMTc3LCAxODcsIDE0MywgMTUzLCAxNjIsIDEyNSwgMTMwLCAxMzksIDEwNiwgMTA4LCAxMTYsIDg5LCAgODUsIDkyLCA2OSwgIDU4LCA2NCwgNDUsICAyMCwgMjUsICA4LAotICAgIDIyNywgMjM0LCAxNTMsIDIwMSwgMjA4LCAxMzksIDE3OCwgMTg1LCAxMjQsIDE1NCwgMTYxLCAxMDcsIDEzMSwgMTM4LCA5MSwgMTA4LCAxMTUsIDc1LCAgODUsIDkxLCA1OCwgIDU4LCA2MywgMzUsICAxNywgMjUsICAwLAotICAgIDIyOSwgMjMzLCAxMzAsIDIwMywgMjA3LCAxMTYsIDE3OCwgMTg0LCAxMDQsIDE1NCwgMTYwLCA5MCwgMTMxLCAxMzcsIDc2LCAxMDksIDExNCwgNjIsICA4NSwgOTAsIDQ2LCAgNTgsIDYzLCAyNSwgIDE2LCAyNCwgIDAsCi0gICAgMjMwLCAyMzEsIDEwMCwgMjAyLCAyMDUsIDkwLCAxNzksIDE4MywgODAsIDE1NCwgMTU5LCA2OSwgMTMxLCAxMzYsIDU3LCAxMDksIDExMywgNDYsICA4NiwgOTAsIDMyLCAgNTgsIDYzLCAxMCwgIDE0LCAyNCwgIDAsCi0gICAgMjMwLCAyMzAsIDY1LCAyMDQsIDIwNCwgNTgsIDE4MCwgMTgyLCA1MiwgMTU1LCAxNTcsIDQ0LCAxMzIsIDEzNSwgMzUsIDExMCwgMTEzLCAyNCwgIDg2LCA4OSwgIDksICA1NywgNjIsICAwLCAgMTEsIDI0LCAgMCwKLSAgICAyMzIsIDIzMCwgMTksIDIwNCwgMjA0LCAxOSwgMTgwLCAxODEsIDE3LCAxNTUsIDE1NywgMTAsIDEzMSwgMTM0LCAgMiwgMTA5LCAxMTIsICAwLCAgODUsIDg5LCAgMCwgIDU3LCA2MiwgIDAsICAxMCwgMjMsICAwLAotICAgIDIxOCwgMjE2LCAyMzYsIDE5NCwgMTkyLCAyMTEsIDE3MiwgMTcxLCAxODgsIDE0OSwgMTQ5LCAxNjQsIDEyOCwgMTI3LCAxNDEsIDEwNiwgMTA2LCAxMTksICA4NCwgODQsIDk0LCAgNTksIDU3LCA2NiwgIDI1LCAxOCwgMjYsCi0gICAgMjIxLCAyMTQsIDIxMSwgMTk2LCAxOTEsIDE5MCwgMTc0LCAxNzAsIDE3MCwgMTUwLCAxNDgsIDE0OCwgMTI4LCAxMjYsIDEyNywgMTA3LCAxMDUsIDEwNiwgIDg1LCA4MywgODQsICA1OSwgNTYsIDU4LCAgMjMsIDE3LCAxOCwKLSAgICAyMjIsIDIxMywgMTkwLCAxOTcsIDE4OSwgMTcwLCAxNzUsIDE2OSwgMTUzLCAxNTEsIDE0NywgMTMzLCAxMjksIDEyNiwgMTEzLCAxMDgsIDEwNSwgOTQsICA4NSwgODIsIDc0LCAgNTksIDU2LCA0OSwgIDIyLCAxNywgMTEsCi0gICAgMjI0LCAyMTEsIDE2OCwgMTk5LCAxODgsIDE1MSwgMTc1LCAxNjgsIDEzNSwgMTUyLCAxNDYsIDExNywgMTI5LCAxMjQsIDk5LCAxMDcsIDEwMywgODIsICA4NCwgODIsIDY0LCAgNTksIDU1LCA0MSwgIDIxLCAxNywgIDEsCi0gICAgMjI0LCAyMTAsIDE0NSwgMTk5LCAxODcsIDEzMCwgMTc2LCAxNjYsIDExNywgMTUyLCAxNDUsIDEwMSwgMTI5LCAxMjMsIDg2LCAxMDcsIDEwMywgNzAsICA4NSwgODEsIDUzLCAgNTgsIDU1LCAzMSwgIDE5LCAxNywgIDAsCi0gICAgMjI3LCAyMDgsIDEyMywgMjAwLCAxODYsIDExMCwgMTc3LCAxNjUsIDk4LCAxNTMsIDE0MywgODQsIDEzMCwgMTIyLCA3MCwgMTA4LCAxMDIsIDU3LCAgODUsIDgwLCA0MSwgIDU4LCA1NCwgMjAsICAxOCwgMTYsICAwLAotICAgIDIyNywgMjA4LCA5NywgMjAyLCAxODUsIDg2LCAxNzcsIDE2NCwgNzcsIDE1MywgMTQyLCA2NSwgMTMwLCAxMjIsIDU0LCAxMDgsIDEwMSwgNDIsICA4NSwgODAsIDI3LCAgNTgsIDU0LCAgNywgIDE2LCAxNiwgIDAsCi0gICAgMjI4LCAyMDYsIDY2LCAyMDIsIDE4NCwgNTgsIDE3OCwgMTYzLCA1MCwgMTU0LCAxNDEsIDQyLCAxMzEsIDEyMSwgMzMsIDEwOSwgMTAxLCAyMSwgIDg2LCA3OSwgIDUsICA1OCwgNTQsICAwLCAgMTMsIDE2LCAgMCwKLSAgICAyMjgsIDIwNiwgMjksIDIwMiwgMTgzLCAyNSwgMTc4LCAxNjMsIDIwLCAxNTQsIDE0MSwgMTUsIDEzMSwgMTIxLCAgNSwgMTA4LCAxMDAsICAwLCAgODUsIDc5LCAgMCwgIDU4LCA1MywgIDAsICAxMywgMTYsICAwLAotICAgIDIxNywgMTkzLCAyMjEsIDE5MywgMTcyLCAxOTgsIDE3MiwgMTUzLCAxNzgsIDE0OSwgMTMzLCAxNTQsIDEyOCwgMTE0LCAxMzIsIDEwNywgOTQsIDExMSwgIDg1LCA3NCwgODksICA1OSwgNDksIDYxLCAgMjUsICA4LCAyMiwKLSAgICAyMTksIDE5MSwgMTk4LCAxOTUsIDE3MSwgMTc4LCAxNzMsIDE1MywgMTU5LCAxNDksIDEzMiwgMTM5LCAxMjgsIDExMywgMTE5LCAxMDcsIDk0LCAxMDAsICA4NSwgNzMsIDc5LCAgNTksIDQ4LCA1MiwgIDI1LCAgNywgMTQsCi0gICAgMjIxLCAxOTEsIDE4MCwgMTk2LCAxNzAsIDE2MCwgMTc0LCAxNTIsIDE0NCwgMTUwLCAxMzIsIDEyNSwgMTI5LCAxMTMsIDEwNywgMTA3LCA5MywgODksICA4NSwgNzMsIDY5LCAgNTksIDQ4LCA0NSwgIDIzLCAgNywgIDQsCi0gICAgMjIyLCAxODksIDE1OSwgMTk3LCAxNjksIDE0MiwgMTc0LCAxNTEsIDEyNywgMTUxLCAxMzEsIDExMCwgMTI5LCAxMTIsIDk0LCAxMDgsIDkzLCA3OCwgIDg1LCA3MiwgNjAsICA1OCwgNDcsIDM3LCAgMjIsICA3LCAgMCwKLSAgICAyMjMsIDE4OCwgMTM4LCAxOTcsIDE2OCwgMTIzLCAxNzUsIDE1MCwgMTA5LCAxNTEsIDEzMCwgOTUsIDEzMCwgMTExLCA4MSwgMTA4LCA5MiwgNjUsICA4NSwgNzIsIDQ5LCAgNTksIDQ3LCAyNywgIDIxLCAgNywgIDAsCi0gICAgMjI0LCAxODcsIDExOCwgMTk4LCAxNjcsIDEwNSwgMTc2LCAxNDksIDkzLCAxNTIsIDEyOSwgNzksIDEzMCwgMTEwLCA2OCwgMTA4LCA5MSwgNTQsICA4NSwgNzEsIDM4LCAgNTksIDQ3LCAxNywgIDE4LCAgNywgIDAsCi0gICAgMjI0LCAxODcsIDkzLCAxOTksIDE2NiwgODMsIDE3NiwgMTQ4LCA3MywgMTUyLCAxMjgsIDYyLCAxMjksIDEwOSwgNTEsIDEwOCwgOTAsIDM5LCAgODUsIDcxLCAyNSwgIDU4LCA0NiwgIDMsICAxNiwgIDgsICAwLAotICAgIDIyNiwgMTg2LCA2NCwgMjAwLCAxNjUsIDU3LCAxNzcsIDE0NywgNTAsIDE1MywgMTI3LCA0MCwgMTMwLCAxMDgsIDMxLCAxMDgsIDkwLCAxOSwgIDg1LCA3MCwgIDMsICA1OCwgNDYsICAwLCAgMTYsICA4LCAgMCwKLSAgICAyMjcsIDE4NSwgMzUsIDIwMCwgMTY1LCAzMCwgMTc2LCAxNDYsIDI1LCAxNTIsIDEyNywgMTgsIDEzMCwgMTA4LCAgNywgMTA4LCA4OSwgIDAsICA4NSwgNzAsICAwLCAgNTcsIDQ2LCAgMCwgIDE0LCAgOCwgIDAsCi0gICAgMjE2LCAxNjksIDIwNSwgMTkyLCAxNTAsIDE4NCwgMTcxLCAxMzQsIDE2NCwgMTQ5LCAxMTYsIDE0NCwgMTI4LCA5OSwgMTI0LCAxMDcsIDgxLCAxMDMsICA4NSwgNjMsIDgxLCAgNjAsIDM5LCA1NSwgIDI2LCAgMCwgMTUsCi0gICAgMjE3LCAxNjgsIDE4NiwgMTkzLCAxNTAsIDE2NSwgMTcyLCAxMzQsIDE0OSwgMTUwLCAxMTYsIDEzMCwgMTI4LCA5OSwgMTExLCAxMDcsIDgxLCA5MiwgIDg1LCA2MiwgNzIsICA1OSwgMzksIDQ3LCAgMjUsICAwLCAgNiwKLSAgICAyMTksIDE2OCwgMTY4LCAxOTQsIDE0OSwgMTUwLCAxNzMsIDEzMywgMTM1LCAxNTAsIDExNiwgMTE3LCAxMjgsIDk4LCA5OSwgMTA3LCA4MCwgODIsICA4NiwgNjIsIDYzLCAgNTksIDM4LCAzOSwgIDI0LCAgMCwgIDAsCi0gICAgMjE5LCAxNjYsIDE0OCwgMTk1LCAxNDksIDEzMywgMTczLCAxMzMsIDExOSwgMTUwLCAxMTUsIDEwMywgMTI4LCA5OCwgODgsIDEwNywgODAsIDcyLCAgODUsIDYxLCA1NCwgIDU5LCAzOCwgMzIsICAyMywgIDAsICAwLAotICAgIDIyMCwgMTY2LCAxMjksIDE5NiwgMTQ4LCAxMTYsIDE3NCwgMTMyLCAxMDMsIDE1MSwgMTE0LCA4OSwgMTI5LCA5NywgNzUsIDEwNywgNzksIDYwLCAgODUsIDYxLCA0NCwgIDU5LCAzOCwgMjIsICAyMSwgIDAsICAwLAotICAgIDIyMiwgMTY0LCAxMTAsIDE5NywgMTQ3LCA5OSwgMTc1LCAxMzEsIDg3LCAxNTEsIDExMywgNzUsIDEyOSwgOTYsIDYzLCAxMDcsIDc5LCA0OSwgIDg1LCA2MSwgMzMsICA1OCwgMzgsIDEyLCAgMTksICAwLCAgMCwKLSAgICAyMjIsIDE2NCwgODgsIDE5NywgMTQ2LCA3OSwgMTc0LCAxMzAsIDY5LCAxNTEsIDExMywgNTgsIDEyOSwgOTUsIDQ3LCAxMDcsIDc4LCAzNSwgIDg1LCA2MCwgMjAsICA1OCwgMzgsICAwLCAgMTgsICAwLCAgMCwKLSAgICAyMjMsIDE2NCwgNjMsIDE5OCwgMTQ1LCA1NSwgMTc1LCAxMjksIDQ4LCAxNTEsIDExMiwgMzksIDEyOSwgOTUsIDI5LCAxMDcsIDc4LCAxNiwgIDg1LCA2MCwgIDEsICA1OCwgMzgsICAwLCAgMTcsICAwLCAgMCwKLSAgICAyMjMsIDE2MywgMzYsIDE5OCwgMTQ1LCAzMiwgMTc0LCAxMjksIDI2LCAxNTEsIDExMSwgMTcsIDEyOSwgOTUsICA3LCAxMDcsIDc4LCAgMCwgIDg0LCA2MCwgIDAsICA1NywgMzcsICAwLCAgMTUsICAwLCAgMCwKLSAgICAyMTUsIDE0NywgMTkyLCAxOTEsIDEzMCwgMTcyLCAxNzAsIDExNiwgMTUzLCAxNDgsIDEwMCwgMTMzLCAxMjcsIDg1LCAxMTUsIDEwNywgNjksIDk2LCAgODUsIDUxLCA3NSwgIDYwLCAyOCwgNTAsICAyNSwgIDAsICA4LAotICAgIDIxNywgMTQ2LCAxNzMsIDE5MiwgMTMwLCAxNTQsIDE3MSwgMTE1LCAxMzgsIDE0OSwgMTAwLCAxMjEsIDEyOCwgODQsIDEwMywgMTA3LCA2OCwgODUsICA4NSwgNTEsIDY2LCAgNjAsIDI4LCA0MiwgIDI1LCAgMCwgIDAsCi0gICAgMjE3LCAxNDUsIDE1NywgMTkzLCAxMjksIDE0MCwgMTczLCAxMTUsIDEyNSwgMTQ5LCAxMDAsIDEwOSwgMTI4LCA4NCwgOTIsIDEwNywgNjgsIDc2LCAgODUsIDUxLCA1OCwgIDU5LCAyOCwgMzUsICAyMywgIDAsICAwLAotICAgIDIxOCwgMTQ1LCAxNDAsIDE5MywgMTI5LCAxMjUsIDE3MiwgMTE0LCAxMTAsIDE0OSwgOTksIDk2LCAxMjgsIDgzLCA4MSwgMTA3LCA2NywgNjUsICA4NCwgNTEsIDQ5LCAgNTksIDI5LCAyNywgIDIyLCAgMCwgIDAsCi0gICAgMjE5LCAxNDQsIDEyMSwgMTk0LCAxMjgsIDEwOCwgMTcyLCAxMTMsIDk2LCAxNDksIDk4LCA4MywgMTI4LCA4MywgNjksIDEwNywgNjgsIDU1LCAgODUsIDUwLCA0MCwgIDU5LCAyOCwgMTgsICAyMCwgIDAsICAwLAotICAgIDIyMCwgMTQzLCAxMDQsIDE5NSwgMTI4LCA5MywgMTczLCAxMTQsIDgyLCAxNTAsIDk4LCA2OSwgMTI3LCA4MiwgNTgsIDEwNywgNjcsIDQ1LCAgODUsIDUwLCAzMCwgIDU5LCAyOCwgIDcsICAxOSwgIDAsICAwLAotICAgIDIyMCwgMTQzLCA4NCwgMTk1LCAxMjcsIDc0LCAxNzMsIDExMywgNjUsIDE0OSwgOTcsIDU1LCAxMjgsIDgyLCA0NCwgMTA2LCA2NywgMzIsICA4NCwgNTAsIDE2LCAgNTgsIDI4LCAgMCwgIDE4LCAgMCwgIDAsCi0gICAgMjIxLCAxNDIsIDYyLCAxOTYsIDEyNiwgNTMsIDE3MywgMTEyLCA0NiwgMTUwLCA5NywgMzcsIDEyOCwgODIsIDI2LCAxMDcsIDY2LCAxNCwgIDg0LCA1MCwgIDAsICA1OCwgMjgsICAwLCAgMTYsICAwLCAgMCwKLSAgICAyMjIsIDE0MiwgMzgsIDE5NiwgMTI2LCAzNCwgMTc0LCAxMTIsIDI3LCAxNTAsIDk2LCAxNywgMTI4LCA4MiwgIDYsIDEwNiwgNjYsICAwLCAgODQsIDUwLCAgMCwgIDU3LCAyOSwgIDAsICAxNiwgIDAsICAwLAotICAgIDIxNCwgMTIzLCAxNzksIDE5MSwgMTEwLCAxNTksIDE2OSwgOTgsIDE0MywgMTQ3LCA4NCwgMTI0LCAxMjYsIDcwLCAxMDYsIDEwNywgNTUsIDg4LCAgODUsIDM5LCA2OSwgIDYwLCAxNSwgNDUsICAyMywgIDAsICAyLAotICAgIDIxNiwgMTIzLCAxNjEsIDE5MiwgMTEwLCAxNDQsIDE3MCwgOTgsIDEyOSwgMTQ4LCA4NCwgMTEyLCAxMjcsIDcwLCA5NSwgMTA3LCA1NSwgNzksICA4NSwgMzksIDYxLCAgNjAsIDE1LCAzNywgIDIwLCAgMCwgIDAsCi0gICAgMjE3LCAxMjIsIDE0NSwgMTkyLCAxMTAsIDEzMCwgMTcwLCA5NywgMTE2LCAxNDksIDg0LCAxMDEsIDEyNywgNzAsIDg1LCAxMDYsIDU1LCA3MCwgIDg1LCAzOSwgNTMsICA1OSwgMTYsIDMwLCAgMTksICAwLCAgMCwKLSAgICAyMTcsIDEyMywgMTMxLCAxOTIsIDEwOSwgMTE2LCAxNzEsIDk2LCAxMDMsIDE0OSwgODMsIDg5LCAxMjcsIDcwLCA3NSwgMTA2LCA1NSwgNjAsICA4NSwgNDAsIDQ1LCAgNTksIDE2LCAyMywgIDE3LCAgMCwgIDAsCi0gICAgMjE3LCAxMjIsIDExNCwgMTkzLCAxMDksIDEwMSwgMTcyLCA5NiwgOTEsIDE0OSwgODIsIDc3LCAxMjgsIDY5LCA2NCwgMTA2LCA1NSwgNTAsICA4NCwgMzksIDM1LCAgNTksIDE3LCAxNCwgIDE3LCAgMCwgIDAsCi0gICAgMjE4LCAxMjIsIDk4LCAxOTQsIDEwOCwgODcsIDE3MSwgOTYsIDc3LCAxNDksIDgyLCA2NSwgMTI3LCA2OSwgNTIsIDEwNiwgNTUsIDQwLCAgODQsIDQwLCAyNSwgIDU5LCAxOCwgIDMsICAxNSwgIDAsICAwLAotICAgIDIxOSwgMTIyLCA4MCwgMTkzLCAxMDgsIDcwLCAxNzIsIDk1LCA2MSwgMTQ5LCA4MiwgNTEsIDEyNywgNjksIDQwLCAxMDYsIDU1LCAyOCwgIDg0LCAzOSwgMTIsICA1OCwgMTcsICAwLCAgMTMsICAwLCAgMCwKLSAgICAyMTksIDEyMSwgNTksIDE5NCwgMTA4LCA1MiwgMTcyLCA5NiwgNDQsIDE0OSwgODIsIDM1LCAxMjcsIDY4LCAyNCwgMTA2LCA1NSwgMTEsICA4NCwgNDAsICAwLCAgNTcsIDE4LCAgMCwgIDEzLCAgMCwgIDAsCi0gICAgMjE5LCAxMjEsIDQwLCAxOTMsIDEwOCwgMzMsIDE3MiwgOTUsIDI2LCAxNDksIDgxLCAxOSwgMTI4LCA2OCwgIDYsIDEwNiwgNTQsICAwLCAgODQsIDM5LCAgMCwgIDU3LCAxOCwgIDAsICAxMywgIDAsICAwLAotICAgIDIxMywgOTksIDE2NSwgMTg5LCA4NywgMTQ4LCAxNjksIDc2LCAxMzIsIDE0NywgNjQsIDExNSwgMTI2LCA1MiwgOTgsIDEwNiwgMzksIDgxLCAgODUsIDIzLCA2MywgIDYwLCAgMCwgMzksICAxNiwgIDAsICAwLAotICAgIDIxNCwgOTgsIDE0OSwgMTkxLCA4NywgMTMzLCAxNzAsIDc2LCAxMTksIDE0OCwgNjUsIDEwMywgMTI3LCA1MywgODgsIDEwNiwgMzksIDcyLCAgODUsIDI0LCA1NSwgIDYwLCAgMCwgMzIsICAxNSwgIDAsICAwLAotICAgIDIxNSwgOTksIDEzNiwgMTkxLCA4NywgMTIxLCAxNzAsIDc3LCAxMDgsIDE0OCwgNjUsIDkzLCAxMjYsIDUzLCA3OSwgMTA2LCA0MCwgNjQsICA4NSwgMjQsIDQ3LCAgNTksICAwLCAyNSwgIDE0LCAgMCwgIDAsCi0gICAgMjE1LCA5OSwgMTIxLCAxOTIsIDg3LCAxMDgsIDE3MCwgNzcsIDk2LCAxNDgsIDY1LCA4MiwgMTI2LCA1MywgNjksIDEwNiwgNDAsIDU1LCAgODUsIDI1LCAzOSwgIDU5LCAgMCwgMTgsICAxMywgIDAsICAwLAotICAgIDIxNiwgOTksIDEwNiwgMTkxLCA4NywgOTUsIDE3MCwgNzYsIDgzLCAxNDgsIDY1LCA3MSwgMTI2LCA1MywgNTgsIDEwNiwgNDEsIDQ1LCAgODUsIDI2LCAzMCwgIDU5LCAgMCwgIDgsICAxMSwgIDAsICAwLAotICAgIDIxNiwgOTgsIDkxLCAxOTIsIDg4LCA4MiwgMTcwLCA3NywgNzEsIDE0OCwgNjUsIDYwLCAxMjcsIDUzLCA0OCwgMTA1LCA0MSwgMzYsICA4MywgMjYsIDIxLCAgNTgsICAxLCAgMiwgIDExLCAgMCwgIDAsCi0gICAgMjE3LCA5OSwgNzUsIDE5MiwgODcsIDY2LCAxNzAsIDc2LCA1NywgMTQ4LCA2NSwgNDcsIDEyNiwgNTMsIDM2LCAxMDUsIDQxLCAyNCwgIDgzLCAyNiwgIDgsICA1NywgIDIsICAwLCAgIDksICAwLCAgMCwKLSAgICAyMTcsIDk4LCA1NywgMTkyLCA4NywgNDksIDE3MSwgNzcsIDQxLCAxNDcsIDY1LCAzMiwgMTI2LCA1MywgMjEsIDEwNSwgNDEsICA4LCAgODQsIDI3LCAgMCwgIDU3LCAgMywgIDAsICAgOSwgIDAsICAwLAotICAgIDIxNywgOTgsIDQwLCAxOTMsIDg3LCAzNCwgMTcxLCA3NiwgMjcsIDE0OCwgNjUsIDE5LCAxMjYsIDUzLCAgNiwgMTA1LCA0MSwgIDAsICA4MywgMjcsICAwLCAgNTcsICA0LCAgMCwgICA5LCAgMCwgIDAsCi0gICAgMjExLCA2NywgMTUyLCAxODksIDU4LCAxMzYsIDE2OCwgNTAsIDEyMiwgMTQ3LCAzOSwgMTA1LCAxMjcsIDI4LCA4OSwgMTA2LCAxNCwgNzQsICA4NSwgIDAsIDU2LCAgNTksICAwLCAzMywgICA5LCAgMCwgIDAsCi0gICAgMjEzLCA2OCwgMTM4LCAxOTAsIDU5LCAxMjMsIDE2OSwgNTEsIDEwOSwgMTQ4LCA0MCwgOTUsIDEyNiwgMzAsIDgwLCAxMDYsIDE2LCA2NSwgIDg1LCAgMCwgNDgsICA1OSwgIDAsIDI3LCAgIDksICAwLCAgMCwKLSAgICAyMTQsIDY5LCAxMjUsIDE5MCwgNTksIDExMSwgMTY4LCA1MSwgOTksIDE0OCwgNDEsIDg2LCAxMjYsIDMxLCA3MiwgMTA2LCAxOCwgNTgsICA4NSwgIDAsIDQxLCAgNTksICAwLCAyMCwgICA3LCAgMCwgIDAsCi0gICAgMjE1LCA3MCwgMTEyLCAxOTAsIDYxLCAxMDAsIDE2OSwgNTIsIDg4LCAxNDcsIDQyLCA3NiwgMTI2LCAzMiwgNjMsIDEwNiwgMTksIDQ5LCAgODQsICAxLCAzNCwgIDU4LCAgMCwgMTMsICAgNywgIDAsICAwLAotICAgIDIxNCwgNzAsIDk5LCAxOTAsIDYyLCA4OCwgMTY5LCA1MywgNzcsIDE0NywgNDMsIDY1LCAxMjUsIDMyLCA1MywgMTA2LCAyMCwgNDAsICA4NCwgIDMsIDI2LCAgNTgsICAwLCAgNCwgICA3LCAgMCwgIDAsCi0gICAgMjE0LCA3MSwgODYsIDE5MCwgNjEsIDc1LCAxNjksIDUzLCA2NSwgMTQ2LCA0MywgNTQsIDEyNiwgMzMsIDQ0LCAxMDUsIDIxLCAzMSwgIDgzLCAgNCwgMTcsICA1NywgIDAsICAwLCAgIDcsICAwLCAgMCwKLSAgICAyMTUsIDcxLCA3MSwgMTkxLCA2MiwgNjIsIDE2OSwgNTMsIDUzLCAxNDcsIDQ0LCA0NCwgMTI2LCAzNCwgMzMsIDEwNSwgMjIsIDIwLCAgODMsICA1LCAgNCwgIDU3LCAgMCwgIDAsICAgNywgIDAsICAwLAotICAgIDIxNSwgNzEsIDU0LCAxOTEsIDYyLCA0NywgMTY5LCA1NCwgMzksIDE0NywgNDQsIDMwLCAxMjYsIDM1LCAyMCwgMTA1LCAyMywgIDYsICA4MywgIDYsICAwLCAgNTYsICAwLCAgMCwgICA1LCAgMCwgIDAsCi0gICAgMjE1LCA3MSwgNDEsIDE5MSwgNjMsIDM0LCAxNzAsIDU0LCAyNywgMTQ3LCA0NSwgMTcsIDEyNiwgMzUsICA2LCAxMDUsIDIzLCAgMCwgIDgzLCAgOCwgIDAsICA1NiwgIDAsICAwLCAgIDUsICAwLCAgMCwKLSAgICAyMTAsIDEzLCAxNDAsIDE4OSwgIDEsIDEyNSwgMTY3LCAgMCwgMTEwLCAxNDYsICAwLCA5NiwgMTI2LCAgMCwgODEsIDEwNiwgIDAsIDY3LCAgODUsICAwLCA1MSwgIDU5LCAgMCwgMjgsICAgNCwgIDAsICAwLAotICAgIDIxMiwgMTgsIDEyNiwgMTkwLCAgNywgMTEzLCAxNjgsICAwLCAxMDAsIDE0NiwgIDAsIDg2LCAxMjYsICAwLCA3MywgMTA2LCAgMCwgNTksICA4NCwgIDAsIDQzLCAgNTksICAwLCAyMiwgICA0LCAgMCwgIDAsCi0gICAgMjEyLCAyMSwgMTE1LCAxOTAsIDEzLCAxMDMsIDE2OCwgIDMsIDkxLCAxNDYsICAwLCA3OCwgMTI1LCAgMCwgNjUsIDEwNSwgIDAsIDUyLCAgODQsICAwLCAzNiwgIDU4LCAgMCwgMTYsICAgNCwgIDAsICAwLAotICAgIDIxMywgMjQsIDEwMywgMTg5LCAxOSwgOTEsIDE2OCwgIDksIDgyLCAxNDYsICAwLCA2OSwgMTI1LCAgMCwgNTcsIDEwNSwgIDAsIDQ0LCAgODQsICAwLCAyOSwgIDU4LCAgMCwgIDcsICAgNCwgIDAsICAwLAotICAgIDIxMywgMjcsIDkyLCAxODgsIDIxLCA4MSwgMTY4LCAxNCwgNzEsIDE0NiwgIDEsIDU5LCAxMjUsICAwLCA0OCwgMTA1LCAgMCwgMzYsICA4NCwgIDAsIDIxLCAgNTgsICAwLCAgNCwgICA0LCAgMCwgIDAsCi0gICAgMjEzLCAzMCwgODAsIDE4OSwgMjIsIDY5LCAxNjgsIDE3LCA2MSwgMTQ2LCAgNSwgNTAsIDEyNSwgIDAsIDM5LCAxMDQsICAwLCAyNywgIDgzLCAgMCwgMTIsICA1NywgIDAsICAwLCAgIDQsICAwLCAgMCwKLSAgICAyMTQsIDMwLCA2NywgMTg5LCAyNSwgNTcsIDE2OCwgMjAsIDUwLCAxNDYsICA5LCA0MCwgMTI1LCAgMCwgMjksIDEwNCwgIDAsIDE3LCAgODMsICAwLCAgMiwgIDU2LCAgMCwgIDAsICAgNCwgIDAsICAwLAotICAgIDIxNCwgMzIsIDUzLCAxODksIDI3LCA0NCwgMTY5LCAyMCwgMzgsIDE0NiwgMTMsIDI4LCAxMjQsICAyLCAxNywgMTA0LCAgMCwgIDQsICA4MywgIDAsICAwLCAgNTYsICAwLCAgMCwgICA0LCAgMCwgIDAsCi0gICAgMjE0LCAzMywgNDEsIDE5MCwgMjcsIDMzLCAxNjgsIDIzLCAyNywgMTQ2LCAxMywgMTgsIDEyNSwgIDMsICA1LCAxMDUsICAwLCAgMCwgIDgzLCAgMCwgIDAsICA1NiwgIDAsICAwLCAgIDQsICAwLCAgMCwKLSAgICAxODUsIDIyOSwgMjUwLCAxNjQsIDIwNCwgMjIzLCAxNDYsIDE4MiwgMTk5LCAxMjcsIDE1OCwgMTc0LCAxMDgsIDEzNiwgMTQ5LCAgODksIDExMywgMTI1LCAgNzAsIDkwLCAxMDAsICA0NiwgNjIsIDcxLCAgMTAsIDI1LCAzMywKLSAgICAxODksIDIyNywgMjI1LCAxNjgsIDIwMiwgMjAxLCAxNDgsIDE4MSwgMTc5LCAxMjksIDE1NywgMTU2LCAxMDksIDEzNSwgMTM0LCAgOTAsIDExMywgMTEzLCAgNzAsIDg5LCA5MCwgIDQ2LCA2MiwgNjIsICAgOCwgMjQsIDI1LAotICAgIDE5MiwgMjI2LCAyMDIsIDE3MCwgMjAyLCAxODIsIDE1MSwgMTc5LCAxNjIsIDEzMCwgMTU2LCAxNDEsIDExMCwgMTMzLCAxMjEsICA5MSwgMTEyLCAxMDEsICA3MSwgODksIDgwLCAgNDYsIDYxLCA1NCwgICA3LCAyNCwgMTksCi0gICAgMTk0LCAyMjQsIDE3OSwgMTczLCAyMDAsIDE2MCwgMTUzLCAxNzgsIDE0NCwgMTMyLCAxNTUsIDEyNSwgMTEyLCAxMzMsIDEwNywgIDkyLCAxMTEsIDg5LCAgNzEsIDg4LCA2OSwgIDQ2LCA2MSwgNDUsICAgNiwgMjMsIDEwLAotICAgIDE5NiwgMjIzLCAxNTUsIDE3NCwgMTk4LCAxMzksIDE1NCwgMTc2LCAxMjQsIDEzMiwgMTUzLCAxMDcsIDExMywgMTMxLCA5MSwgIDkyLCAxMTAsIDc1LCAgNzIsIDg3LCA1OCwgIDQ3LCA2MCwgMzcsICAgNCwgMjMsICAwLAotICAgIDE5OCwgMjIxLCAxMzEsIDE3NSwgMTk3LCAxMTcsIDE1NSwgMTc1LCAxMDUsIDEzMywgMTUyLCA5MSwgMTEzLCAxMzAsIDc2LCAgOTIsIDEwOSwgNjMsICA3MiwgODYsIDQ3LCAgNDYsIDYwLCAyNiwgICAzLCAyMywgIDAsCi0gICAgMjAwLCAyMjAsIDEwNCwgMTc2LCAxOTYsIDk0LCAxNTYsIDE3NSwgODQsIDEzNCwgMTUxLCA3MiwgMTEzLCAxMjksIDU5LCAgOTMsIDEwOCwgNDcsICA3MiwgODUsIDMzLCAgNDYsIDU5LCAxMywgICAwLCAyMywgIDAsCi0gICAgMjAxLCAyMTksIDczLCAxNzksIDE5NSwgNjUsIDE1NywgMTczLCA1NywgMTM1LCAxNTAsIDQ4LCAxMTQsIDEyOSwgMzksICA5NCwgMTA4LCAyOCwgIDcyLCA4NSwgMTUsICA0NywgNTksICAwLCAgIDAsIDIyLCAgMCwKLSAgICAyMDMsIDIxOSwgNDIsIDE3OCwgMTk1LCAzNywgMTU3LCAxNzMsIDMyLCAxMzUsIDE1MCwgMjYsIDExNCwgMTI4LCAxNiwgIDk0LCAxMDcsICA2LCAgNzMsIDg1LCAgMCwgIDQ2LCA1OCwgIDAsICAgMCwgMjIsICAwLAotICAgIDE4NiwgMjA1LCAyMzMsIDE2NSwgMTgzLCAyMDksIDE0OCwgMTYzLCAxODcsIDEyOCwgMTQyLCAxNjMsIDEwOSwgMTIxLCAxNDAsICA5MSwgMTAxLCAxMTgsICA3MSwgODAsIDk0LCAgNDgsIDU0LCA2NiwgIDEyLCAxNSwgMjcsCi0gICAgMTg5LCAyMDQsIDIxMSwgMTY5LCAxODIsIDE4OSwgMTUxLCAxNjMsIDE2OSwgMTMxLCAxNDEsIDE0NywgMTExLCAxMjEsIDEyNiwgIDkyLCAxMDEsIDEwNSwgIDcyLCA3OSwgODQsICA0OCwgNTQsIDU4LCAgMTEsIDE1LCAxOSwKLSAgICAxOTIsIDIwMiwgMTkwLCAxNzEsIDE4MSwgMTcwLCAxNTIsIDE2MSwgMTUyLCAxMzEsIDE0MSwgMTMzLCAxMTIsIDEyMCwgMTEzLCAgOTMsIDEwMCwgOTQsICA3MiwgNzksIDc0LCAgNDgsIDUzLCA1MCwgIDEwLCAxNSwgMTEsCi0gICAgMTk1LCAyMDEsIDE2OSwgMTcyLCAxNzksIDE1MSwgMTUzLCAxNjAsIDEzNSwgMTMyLCAxMzksIDExNywgMTEzLCAxMTksIDEwMCwgIDkzLCA5OSwgODIsICA3MiwgNzgsIDY0LCAgNDgsIDUzLCA0MSwgICA5LCAxNCwgIDMsCi0gICAgMTk1LCAyMDAsIDE0NiwgMTc0LCAxNzksIDEzMSwgMTU0LCAxNTksIDExNywgMTMzLCAxMzgsIDEwMSwgMTEzLCAxMTgsIDg2LCAgOTMsIDk4LCA3MCwgIDczLCA3NywgNTMsICA0OCwgNTIsIDMyLCAgIDgsIDE1LCAgMCwKLSAgICAxOTgsIDE5OSwgMTI1LCAxNzUsIDE3NywgMTExLCAxNTUsIDE1OCwgMTAwLCAxMzMsIDEzNywgODUsIDExMywgMTE3LCA3MSwgIDkzLCA5NywgNTcsICA3MiwgNzcsIDQyLCAgNDcsIDUyLCAyMiwgICA1LCAxNCwgIDAsCi0gICAgMTk5LCAxOTgsIDEwMSwgMTc2LCAxNzcsIDg5LCAxNTUsIDE1NywgNzksIDEzNCwgMTM2LCA2OCwgMTEzLCAxMTYsIDU2LCAgOTQsIDk3LCA0NCwgIDczLCA3NiwgMzAsICA0NywgNTIsIDEwLCAgIDIsIDE1LCAgMCwKLSAgICAyMDAsIDE5NywgNzIsIDE3OCwgMTc2LCA2MywgMTU3LCAxNTYsIDU2LCAxMzUsIDEzNiwgNDYsIDExNCwgMTE2LCAzNywgIDk0LCA5NiwgMjYsICA3MywgNzYsIDExLCAgNDcsIDUxLCAgMCwgICAwLCAxNCwgIDAsCi0gICAgMjAxLCAxOTcsIDQ1LCAxNzcsIDE3NSwgMzgsIDE1NiwgMTU1LCAzMSwgMTM1LCAxMzUsIDI1LCAxMTQsIDExNSwgMTcsICA5NCwgOTYsICA1LCAgNzMsIDc1LCAgMCwgIDQ2LCA1MSwgIDAsICAgMCwgMTQsICAwLAotICAgIDE4NywgMTgzLCAyMTgsIDE2NywgMTY1LCAxOTcsIDE0OSwgMTQ3LCAxNzYsIDEyOSwgMTI3LCAxNTMsIDExMSwgMTA5LCAxMzIsICA5MiwgOTAsIDExMSwgIDczLCA3MCwgODksICA0OSwgNDYsIDYyLCAgMTUsICA0LCAyMiwKLSAgICAxOTAsIDE4MywgMTk3LCAxNzAsIDE2NCwgMTc3LCAxNTEsIDE0NiwgMTU5LCAxMzAsIDEyNywgMTM5LCAxMTIsIDEwOSwgMTE5LCAgOTMsIDkwLCA5OSwgIDcyLCA3MCwgNzgsICA0OSwgNDUsIDUzLCAgMTQsICA0LCAxNSwKLSAgICAxOTIsIDE4MiwgMTc5LCAxNzEsIDE2MywgMTYxLCAxNTMsIDE0NSwgMTQ0LCAxMzIsIDEyNiwgMTI1LCAxMTMsIDEwOCwgMTA3LCAgOTMsIDg5LCA4OCwgIDczLCA3MCwgNjksICA0OSwgNDUsIDQ1LCAgMTMsICA1LCAgNiwKLSAgICAxOTUsIDE4MSwgMTU5LCAxNzIsIDE2MiwgMTQyLCAxNTIsIDE0NSwgMTI3LCAxMzIsIDEyNSwgMTExLCAxMTMsIDEwNywgOTQsICA5MywgODgsIDc3LCAgNzMsIDY5LCA1OSwgIDQ4LCA0NSwgMzcsICAxMSwgIDUsICAwLAotICAgIDE5NSwgMTgwLCAxMzksIDE3MywgMTYxLCAxMjQsIDE1MywgMTQzLCAxMTAsIDEzMywgMTI1LCA5NiwgMTEzLCAxMDYsIDgxLCAgOTQsIDg4LCA2NiwgIDczLCA2OCwgNDksICA0OSwgNDQsIDI4LCAgIDksICA2LCAgMCwKLSAgICAxOTYsIDE3OSwgMTE4LCAxNzQsIDE2MCwgMTA2LCAxNTQsIDE0MiwgOTQsIDEzMywgMTI0LCA4MSwgMTEzLCAxMDUsIDY4LCAgOTQsIDg3LCA1NCwgIDczLCA2OCwgMzksICA0OCwgNDQsIDE4LCAgIDUsICA1LCAgMCwKLSAgICAxOTcsIDE3OCwgOTYsIDE3NiwgMTU5LCA4NiwgMTU1LCAxNDEsIDc1LCAxMzQsIDEyMywgNjQsIDExNCwgMTA1LCA1MywgIDk0LCA4NywgNDAsICA3MywgNjgsIDI2LCAgNDgsIDQ0LCAgNSwgICAyLCAgNiwgIDAsCi0gICAgMTk5LCAxNzgsIDcwLCAxNzYsIDE1OCwgNjIsIDE1NiwgMTQxLCA1NCwgMTM0LCAxMjIsIDQ0LCAxMTQsIDEwNCwgMzUsICA5NCwgODYsIDIzLCAgNzMsIDY3LCAgOCwgIDQ3LCA0NCwgIDAsICAgMiwgIDYsICAwLAotICAgIDE5OSwgMTc3LCA0NSwgMTc4LCAxNTgsIDQwLCAxNTYsIDE0MCwgMzIsIDEzNSwgMTIyLCAyNiwgMTE0LCAxMDQsIDE2LCAgOTQsIDg2LCAgNCwgIDczLCA2NywgIDAsICA0NywgNDQsICAwLCAgIDAsICA3LCAgMCwKLSAgICAxODgsIDE2MSwgMjA0LCAxNjgsIDE0NCwgMTgzLCAxNDksIDEyOSwgMTY0LCAxMzAsIDExMiwgMTQ0LCAxMTIsIDk1LCAxMjMsICA5MywgNzgsIDEwMywgIDc0LCA2MCwgODEsICA1MCwgMzYsIDU2LCAgMTYsICAwLCAxNiwKLSAgICAxOTAsIDE2MCwgMTg1LCAxNzAsIDE0NCwgMTY1LCAxNTEsIDEyOCwgMTQ4LCAxMzIsIDExMSwgMTMwLCAxMTIsIDk1LCAxMTAsICA5MywgNzgsIDkyLCAgNzQsIDU5LCA3MiwgIDUwLCAzNiwgNDgsICAxNiwgIDAsICA4LAotICAgIDE5MiwgMTYwLCAxNjcsIDE3MSwgMTQzLCAxNTAsIDE1MywgMTI4LCAxMzQsIDEzMiwgMTExLCAxMTcsIDExMiwgOTQsIDEwMCwgIDk0LCA3NywgODIsICA3NCwgNTksIDYzLCAgNTAsIDM2LCA0MCwgIDE0LCAgMCwgIDAsCi0gICAgMTkzLCAxNTksIDE0OSwgMTcyLCAxNDMsIDEzNCwgMTUzLCAxMjcsIDExOSwgMTMzLCAxMTAsIDEwMywgMTEzLCA5NCwgODcsICA5MywgNzcsIDcyLCAgNzMsIDU5LCA1NCwgIDUwLCAzNiwgMzIsICAxMiwgIDAsICAwLAotICAgIDE5NSwgMTU5LCAxMzEsIDE3MywgMTQyLCAxMTcsIDE1MywgMTI3LCAxMDQsIDEzMiwgMTEwLCA5MCwgMTEzLCA5MywgNzYsICA5MywgNzYsIDYxLCAgNzQsIDU5LCA0NSwgIDQ5LCAzNiwgMjMsICAgOSwgIDAsICAwLAotICAgIDE5NiwgMTU4LCAxMTMsIDE3NCwgMTQxLCAxMDEsIDE1NSwgMTI2LCA4OSwgMTMzLCAxMDksIDc2LCAxMTMsIDkzLCA2NCwgIDk0LCA3NiwgNTEsICA3NCwgNTgsIDM1LCAgNDksIDM2LCAxNCwgICA2LCAgMCwgIDAsCi0gICAgMTk3LCAxNTcsIDkyLCAxNzQsIDE0MSwgODAsIDE1NCwgMTI1LCA3MSwgMTM0LCAxMDgsIDYwLCAxMTQsIDkyLCA1MCwgIDk0LCA3NSwgMzcsICA3MywgNTgsIDIyLCAgNDgsIDM2LCAgMSwgICA1LCAgMCwgIDAsCi0gICAgMTk3LCAxNTcsIDY4LCAxNzUsIDE0MCwgNTksIDE1NSwgMTI0LCA1MSwgMTM0LCAxMDgsIDQxLCAxMTMsIDkxLCAzMiwgIDk0LCA3NSwgMjEsICA3MywgNTcsICA1LCAgNDgsIDM1LCAgMCwgICA1LCAgMCwgIDAsCi0gICAgMTk4LCAxNTYsIDQ2LCAxNzYsIDE0MCwgNDAsIDE1NSwgMTI0LCAzMiwgMTM0LCAxMDcsIDI0LCAxMTQsIDkxLCAxNCwgIDk0LCA3NSwgIDIsICA3MywgNTcsICAwLCAgNDgsIDM2LCAgMCwgICAzLCAgMCwgIDAsCi0gICAgMTg5LCAxNDAsIDE5MSwgMTY4LCAxMjYsIDE3MiwgMTUwLCAxMTIsIDE1NCwgMTMxLCA5NywgMTM0LCAxMTIsIDgyLCAxMTUsICA5NCwgNjYsIDk2LCAgNzQsIDQ5LCA3NSwgIDUxLCAyNSwgNTAsICAxMiwgIDAsIDEwLAotICAgIDE5MSwgMTM5LCAxNzMsIDE3MCwgMTI1LCAxNTQsIDE1MiwgMTExLCAxMzgsIDEzMiwgOTYsIDEyMSwgMTEzLCA4MSwgMTAzLCAgOTQsIDY2LCA4NSwgIDc0LCA0OCwgNjYsICA1MCwgMjYsIDQyLCAgMTIsICAwLCAgMSwKLSAgICAxOTIsIDEzOSwgMTU3LCAxNzEsIDEyNSwgMTQwLCAxNTIsIDExMSwgMTI1LCAxMzIsIDk2LCAxMDksIDExMywgODEsIDkyLCAgOTQsIDY1LCA3NiwgIDc0LCA0OCwgNTgsICA1MCwgMjYsIDM1LCAgIDksICAwLCAgMCwKLSAgICAxOTMsIDEzOSwgMTQwLCAxNzIsIDEyNCwgMTI1LCAxNTMsIDExMCwgMTEyLCAxMzMsIDk1LCA5NiwgMTEzLCA4MCwgODIsICA5NCwgNjUsIDY2LCAgNzQsIDQ5LCA1MCwgIDUwLCAyNiwgMjgsICAgNywgIDAsICAwLAotICAgIDE5NCwgMTM4LCAxMjMsIDE3MiwgMTIzLCAxMDksIDE1MywgMTEwLCA5NywgMTMzLCA5NSwgODQsIDExMywgODAsIDcwLCAgOTQsIDY1LCA1NiwgIDc0LCA0OCwgNDAsICA1MCwgMjYsIDIwLCAgIDYsICAwLCAgMCwKLSAgICAxOTQsIDEzOCwgMTA1LCAxNzMsIDEyMywgOTQsIDE1MywgMTA5LCA4MywgMTMzLCA5NCwgNzAsIDExMiwgNzksIDU5LCAgOTQsIDY0LCA0NiwgIDc0LCA0OCwgMzEsICA1MCwgMjYsICA5LCAgIDQsICAwLCAgMCwKLSAgICAxOTYsIDEzOCwgODcsIDE3NCwgMTIyLCA3NywgMTUzLCAxMDksIDY3LCAxMzMsIDkzLCA1NiwgMTEzLCA3OSwgNDYsICA5NCwgNjQsIDM0LCAgNzMsIDQ4LCAxOCwgIDQ5LCAyNywgIDAsICAgNCwgIDAsICAwLAotICAgIDE5NiwgMTM3LCA2NSwgMTc0LCAxMjIsIDU3LCAxNTQsIDEwOCwgNDksIDEzMywgOTMsIDM5LCAxMTMsIDc5LCAyOSwgIDk0LCA2NCwgMTgsICA3NCwgNDgsICAzLCAgNDksIDI3LCAgMCwgICAyLCAgMCwgIDAsCi0gICAgMTk3LCAxMzcsIDQ3LCAxNzUsIDEyMiwgNDAsIDE1NSwgMTA4LCAzMiwgMTMzLCA5MywgMjMsIDExNCwgNzksIDE0LCAgOTQsIDY0LCAgMSwgIDczLCA0OCwgIDAsICA0OCwgMjcsICAwLCAgIDIsICAwLCAgMCwKLSAgICAxODksIDExOSwgMTc3LCAxNjgsIDEwNiwgMTU5LCAxNTAsIDk0LCAxNDIsIDEzMSwgODEsIDEyNCwgMTEzLCA2NywgMTA3LCAgOTQsIDUzLCA4OSwgIDc0LCAzNywgNjksICA1MSwgMTEsIDQ1LCAgIDYsICAwLCAgMywKLSAgICAxOTEsIDExOSwgMTYxLCAxNzAsIDEwNiwgMTQ0LCAxNTIsIDk0LCAxMjksIDEzMiwgODEsIDExMiwgMTEzLCA2NywgOTYsICA5NCwgNTMsIDc5LCAgNzQsIDM3LCA2MSwgIDUxLCAxMywgMzgsICAgNiwgIDAsICAwLAotICAgIDE5MiwgMTE5LCAxNDYsIDE3MCwgMTA2LCAxMzEsIDE1MiwgOTQsIDExNywgMTMyLCA4MCwgMTAxLCAxMTIsIDY3LCA4NSwgIDk0LCA1MywgNzAsICA3NCwgMzcsIDUzLCAgNTAsIDE0LCAzMSwgICA0LCAgMCwgIDAsCi0gICAgMTkyLCAxMTksIDEzMSwgMTcxLCAxMDYsIDExNywgMTUzLCA5NCwgMTA1LCAxMzIsIDgwLCA4OSwgMTEzLCA2NywgNzUsICA5NCwgNTQsIDYxLCAgNzQsIDM4LCA0NSwgIDUxLCAxNCwgMjMsICAgMywgIDAsICAwLAotICAgIDE5MywgMTE4LCAxMTQsIDE3MSwgMTA2LCAxMDIsIDE1MywgOTMsIDkwLCAxMzIsIDgwLCA3OCwgMTEzLCA2NywgNjUsICA5NCwgNTMsIDUyLCAgNzQsIDM3LCAzNiwgIDUwLCAxNSwgMTYsICAgMSwgIDAsICAwLAotICAgIDE5NCwgMTE4LCA5OSwgMTcyLCAxMDUsIDg5LCAxNTMsIDkzLCA3OCwgMTMyLCA4MCwgNjYsIDExMywgNjcsIDU0LCAgOTQsIDUzLCA0MiwgIDc0LCAzOCwgMjcsICA1MCwgMTYsICA1LCAgIDEsICAwLCAgMCwKLSAgICAxOTQsIDExOCwgODIsIDE3MywgMTA1LCA3MiwgMTUzLCA5MywgNjMsIDEzMiwgNzksIDUzLCAxMTMsIDY3LCA0MiwgIDk0LCA1MywgMzAsICA3NCwgMzgsIDE1LCAgNDksIDE2LCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTk1LCAxMTcsIDYzLCAxNzMsIDEwNSwgNTUsIDE1NCwgOTMsIDQ3LCAxMzMsIDc5LCAzNywgMTEzLCA2NiwgMjcsICA5NCwgNTMsIDE1LCAgNzMsIDM4LCAgMCwgIDQ4LCAxNiwgIDAsICAgMCwgIDAsICAwLAotICAgIDE5NSwgMTE3LCA0NiwgMTczLCAxMDQsIDM5LCAxNTQsIDkyLCAzMiwgMTMzLCA3OSwgMjIsIDExMywgNjYsIDEzLCAgOTQsIDUzLCAgMCwgIDczLCAzOCwgIDAsICA0OCwgMTcsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxODksIDk2LCAxNjYsIDE2OCwgODUsIDE0NywgMTUwLCA3NCwgMTMyLCAxMzEsIDYyLCAxMTUsIDExMywgNTEsIDk5LCAgOTQsIDM4LCA4MiwgIDc0LCAyMSwgNjMsICA1MSwgIDAsIDQwLCAgIDEsICAwLCAgMCwKLSAgICAxOTAsIDk2LCAxNTAsIDE3MCwgODUsIDEzMywgMTUyLCA3NSwgMTE5LCAxMzIsIDYzLCAxMDQsIDExMywgNTEsIDg4LCAgOTQsIDM4LCA3MiwgIDc1LCAyMiwgNTUsICA1MSwgIDAsIDMzLCAgIDEsICAwLCAgMCwKLSAgICAxOTIsIDk2LCAxMzcsIDE3MCwgODUsIDEyMSwgMTUyLCA3NCwgMTA4LCAxMzIsIDY0LCA5NCwgMTEzLCA1MiwgNzksICA5NCwgMzksIDY0LCAgNzQsIDIzLCA0OCwgIDUwLCAgMCwgMjYsICAgMCwgIDAsICAwLAotICAgIDE5MiwgOTYsIDEyMiwgMTcxLCA4NiwgMTA5LCAxNTIsIDc1LCA5NiwgMTMyLCA2MywgODMsIDExMywgNTIsIDY5LCAgOTQsIDM5LCA1NiwgIDc0LCAyNCwgNDEsICA1MCwgIDAsIDE5LCAgIDAsICAwLCAgMCwKLSAgICAxOTMsIDk2LCAxMDcsIDE3MSwgODUsIDk2LCAxNTIsIDc1LCA4NCwgMTMyLCA2NCwgNzIsIDExMywgNTIsIDYwLCAgOTQsIDM5LCA0NywgIDc0LCAyNCwgMzIsICA1MCwgIDEsIDEwLCAgIDAsICAwLCAgMCwKLSAgICAxOTMsIDk2LCA5MywgMTcyLCA4NSwgODIsIDE1MiwgNzUsIDcyLCAxMzMsIDYzLCA2MSwgMTEzLCA1MSwgNDksICA5NCwgMzksIDM3LCAgNzMsIDI1LCAyMywgIDQ5LCAgMiwgIDIsICAgMCwgIDAsICAwLAotICAgIDE5NCwgOTYsIDc4LCAxNzIsIDg1LCA2OCwgMTUyLCA3NSwgNTksIDEzMiwgNjMsIDQ5LCAxMTMsIDUyLCAzOSwgIDk0LCA0MCwgMjYsICA3MywgMjUsIDExLCAgNDgsICAzLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTk0LCA5NiwgNjAsIDE3MywgODUsIDUyLCAxNTMsIDc1LCA0NCwgMTMyLCA2NCwgMzUsIDExMiwgNTIsIDI1LCAgOTQsIDQwLCAxMiwgIDczLCAyNiwgIDAsICA0OCwgIDQsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxOTUsIDk2LCA0NiwgMTczLCA4NSwgMzgsIDE1NCwgNzQsIDMxLCAxMzMsIDYzLCAyMiwgMTEzLCA1MiwgMTEsICA5MywgNDAsICAwLCAgNzMsIDI2LCAgMCwgIDQ3LCAgNSwgIDAsICAgMCwgIDAsICAwLAotICAgIDE4OCwgNjcsIDE1MywgMTY4LCA1OCwgMTM3LCAxNTEsIDQ5LCAxMjIsIDEzMSwgMzksIDEwNiwgMTEzLCAyOCwgOTAsICA5NCwgMTMsIDc1LCAgNzUsICAwLCA1NywgIDUxLCAgMCwgMzUsICAgMCwgIDAsICAwLAotICAgIDE5MCwgNjgsIDEzOCwgMTcwLCA1OSwgMTIzLCAxNTIsIDUwLCAxMTAsIDEzMiwgNDEsIDk2LCAxMTMsIDI5LCA4MCwgIDk0LCAxNiwgNjYsICA3NSwgIDAsIDQ5LCAgNTAsICAwLCAyNywgICAwLCAgMCwgIDAsCi0gICAgMTkxLCA2OSwgMTI2LCAxNzAsIDU5LCAxMTIsIDE1MSwgNTIsIDEwMCwgMTMyLCA0MiwgODYsIDExMywgMzAsIDczLCAgOTUsIDE3LCA1OCwgIDc1LCAgMCwgNDIsICA1MCwgIDAsIDIxLCAgIDAsICAwLCAgMCwKLSAgICAxOTIsIDcwLCAxMTMsIDE3MCwgNjEsIDEwMCwgMTUxLCA1MiwgODksIDEzMiwgNDIsIDc3LCAxMTMsIDMxLCA2NCwgIDk0LCAxOSwgNTAsICA3NCwgIDEsIDM1LCAgNTAsICAwLCAxNCwgICAwLCAgMCwgIDAsCi0gICAgMTkyLCA3MCwgMTAwLCAxNzAsIDYyLCA4OSwgMTUxLCA1MywgNzcsIDEzMSwgNDMsIDY2LCAxMTIsIDMyLCA1NCwgIDk0LCAyMCwgNDIsICA3NCwgIDIsIDI3LCAgNDksICAwLCAgNSwgICAwLCAgMCwgIDAsCi0gICAgMTkyLCA3MSwgODcsIDE3MSwgNjEsIDc3LCAxNTIsIDUzLCA2NywgMTMxLCA0NCwgNTcsIDExMiwgMzMsIDQ1LCAgOTQsIDIxLCAzMywgIDc0LCAgNCwgMTksICA0OSwgIDAsICAxLCAgIDAsICAwLCAgMCwKLSAgICAxOTMsIDcxLCA3NCwgMTcxLCA2MiwgNjQsIDE1MiwgNTMsIDU1LCAxMzIsIDQ0LCA0NSwgMTEzLCAzNCwgMzQsICA5NCwgMjIsIDIzLCAgNzMsICA1LCAgNywgIDQ4LCAgMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDE5MywgNzAsIDU4LCAxNzIsIDYyLCA1MCwgMTUyLCA1NCwgNDIsIDEzMiwgNDQsIDMyLCAxMTIsIDM1LCAyMiwgIDkzLCAyMywgMTAsICA3MywgIDYsICAwLCAgNDcsICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTkzLCA3MCwgNDUsIDE3MiwgNjIsIDM4LCAxNTMsIDU0LCAzMSwgMTMyLCA0NCwgMjEsIDExMiwgMzUsICA5LCAgOTQsIDIzLCAgMCwgIDczLCAgNywgIDAsICA0NywgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxODksIDI2LCAxNDEsIDE2OSwgMTUsIDEyNiwgMTUwLCAgMiwgMTEyLCAxMzEsICAwLCA5NywgMTEzLCAgMCwgODIsICA5NCwgIDAsIDY3LCAgNzUsICAwLCA1MSwgIDUwLCAgMCwgMjksICAgMCwgIDAsICAwLAotICAgIDE5MCwgMjgsIDEyOCwgMTcwLCAxOCwgMTE0LCAxNTEsICA4LCAxMDEsIDEzMiwgIDAsIDg4LCAxMTMsICAwLCA3NCwgIDk0LCAgMCwgNjAsICA3NSwgIDAsIDQ0LCAgNTAsICAwLCAyMywgICAwLCAgMCwgIDAsCi0gICAgMTkxLCAzMCwgMTE3LCAxNzAsIDIzLCAxMDQsIDE1MiwgMTEsIDkyLCAxMzIsICAxLCA3OSwgMTEzLCAgMCwgNjcsICA5NSwgIDAsIDUzLCAgNzUsICAwLCAzNywgIDUwLCAgMCwgMTcsICAgMCwgIDAsICAwLAotICAgIDE5MSwgMzMsIDEwNSwgMTcwLCAyNiwgOTMsIDE1MSwgMTgsIDgzLCAxMzIsICA2LCA3MCwgMTEyLCAgMCwgNTgsICA5NCwgIDAsIDQ1LCAgNzUsICAwLCAzMCwgIDQ5LCAgMCwgIDgsICAgMCwgIDAsICAwLAotICAgIDE5MSwgMzQsIDkzLCAxNzAsIDI3LCA4MiwgMTUxLCAyMCwgNzIsIDEzMSwgIDgsIDYxLCAxMTIsICAwLCA0OSwgIDk0LCAgMCwgMzgsICA3NCwgIDAsIDIzLCAgNDksICAwLCAgNCwgICAwLCAgMCwgIDAsCi0gICAgMTkxLCAzNiwgODIsIDE3MCwgMjksIDcxLCAxNTEsIDIyLCA2MywgMTMxLCAxMSwgNTIsIDExMiwgIDAsIDQxLCAgOTMsICAwLCAyOSwgIDc0LCAgMCwgMTQsICA0OCwgIDAsICAxLCAgIDAsICAwLCAgMCwKLSAgICAxOTEsIDM4LCA2OSwgMTcwLCAzMSwgNjAsIDE1MSwgMjQsIDUxLCAxMzEsIDE0LCA0MSwgMTEyLCAgMSwgMzEsICA5MywgIDAsIDE5LCAgNzMsICAwLCAgMywgIDQ4LCAgMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDE5MiwgMzcsIDU2LCAxNzEsIDMxLCA0NywgMTUyLCAyNSwgNDAsIDEzMSwgMTcsIDMwLCAxMTIsICA0LCAxOSwgIDkzLCAgMCwgIDcsICA3MywgIDAsICAwLCAgNDcsICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTkyLCAzOCwgNDUsIDE3MSwgMzMsIDM2LCAxNTIsIDI2LCAzMCwgMTMxLCAxOCwgMjEsIDExMSwgIDcsICA5LCAgOTMsICAwLCAgMCwgIDczLCAgMCwgIDAsICA0NywgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxNDksIDIxOCwgMjQ4LCAxMzMsIDE5NCwgMjIyLCAxMTksIDE3MywgMTk4LCAxMDIsIDE1MSwgMTczLCAgODYsIDEzMCwgMTQ4LCAgNzAsIDEwOCwgMTI1LCAgNTMsIDg1LCAxMDAsICAzMiwgNTksIDcxLCAgIDAsIDIyLCAzMywKLSAgICAxNTQsIDIxNiwgMjIzLCAxMzcsIDE5MywgMjAwLCAxMjIsIDE3MiwgMTc4LCAxMDYsIDE1MCwgMTU2LCAgODksIDEyOCwgMTMzLCAgNzMsIDEwNywgMTEyLCAgNTQsIDg1LCA4OSwgIDMxLCA1OSwgNjMsICAgMCwgMjIsIDI2LAotICAgIDE1OSwgMjE1LCAyMDIsIDE0MSwgMTkyLCAxODEsIDEyNiwgMTcxLCAxNjEsIDEwOCwgMTQ5LCAxNDEsICA5MCwgMTI4LCAxMjEsICA3NCwgMTA3LCAxMDAsICA1NSwgODUsIDgwLCAgMzIsIDU4LCA1NSwgICAwLCAyMiwgMTksCi0gICAgMTYxLCAyMTMsIDE3OSwgMTQ0LCAxOTAsIDE2MCwgMTI2LCAxNzAsIDE0MywgMTA5LCAxNDgsIDEyNSwgIDkyLCAxMjcsIDEwNywgIDc0LCAxMDYsIDg5LCAgNTYsIDg0LCA2OSwgIDMyLCA1OCwgNDYsICAgMCwgMjEsIDExLAotICAgIDE2MywgMjExLCAxNTYsIDE0NCwgMTg5LCAxMzksIDEyOSwgMTY4LCAxMjUsIDExMCwgMTQ3LCAxMDgsICA5MywgMTI2LCA5MiwgIDc1LCAxMDUsIDc2LCAgNTcsIDgzLCA1OCwgIDMzLCA1OCwgMzcsICAgMCwgMjEsICAxLAotICAgIDE2NywgMjExLCAxMzMsIDE0NywgMTg4LCAxMjAsIDEzMCwgMTY3LCAxMDUsIDExMCwgMTQ1LCA5MiwgIDkzLCAxMjUsIDc4LCAgNzYsIDEwNCwgNjQsICA1OCwgODMsIDQ4LCAgMzMsIDU3LCAyNywgICAwLCAyMSwgIDAsCi0gICAgMTY5LCAyMTAsIDEwOCwgMTQ5LCAxODcsIDk2LCAxMzEsIDE2NiwgODYsIDExMiwgMTQ0LCA3NCwgIDk0LCAxMjQsIDYyLCAgNzcsIDEwMywgNDksICA1OCwgODIsIDM1LCAgMzMsIDU3LCAxNSwgICAwLCAyMSwgIDAsCi0gICAgMTcwLCAyMDksIDgwLCAxNTEsIDE4NiwgNzEsIDEzMywgMTY1LCA2MiwgMTE0LCAxNDMsIDUyLCAgOTUsIDEyMywgNDIsICA3NywgMTAzLCAzMiwgIDU4LCA4MSwgMTgsICAzMywgNTYsICAwLCAgIDAsIDIxLCAgMCwKLSAgICAxNzMsIDIwOCwgNTUsIDE1MiwgMTg2LCA0OSwgMTM0LCAxNjUsIDQxLCAxMTQsIDE0MywgMzQsICA5NSwgMTIyLCAyNSwgIDc3LCAxMDIsIDE0LCAgNTgsIDgxLCAgMCwgIDMzLCA1NiwgIDAsICAgMCwgMjEsICAwLAotICAgIDE1NCwgMTk1LCAyMzIsIDEzNywgMTc0LCAyMDcsIDEyMiwgMTU2LCAxODUsIDEwNSwgMTM2LCAxNjMsICA4OSwgMTE2LCAxNDAsICA3MywgOTcsIDExNywgIDU2LCA3NiwgOTQsICAzNSwgNTEsIDY2LCAgIDAsIDEzLCAyOCwKLSAgICAxNTgsIDE5NCwgMjA5LCAxNDEsIDE3NCwgMTg3LCAxMjUsIDE1NSwgMTY3LCAxMDksIDEzNSwgMTQ2LCAgOTEsIDExNiwgMTI1LCAgNzUsIDk2LCAxMDUsICA1NywgNzUsIDgzLCAgMzUsIDUwLCA1NywgICAwLCAxMiwgMjEsCi0gICAgMTYxLCAxOTMsIDE4OSwgMTQ0LCAxNzMsIDE2OSwgMTI4LCAxNTQsIDE1MSwgMTEwLCAxMzQsIDEzMiwgIDkzLCAxMTUsIDExMywgIDc3LCA5NSwgOTQsICA1OCwgNzUsIDc0LCAgMzUsIDUwLCA1MCwgICAwLCAxMiwgMTMsCi0gICAgMTY0LCAxOTIsIDE2OCwgMTQ1LCAxNzEsIDE1MSwgMTI5LCAxNTMsIDEzNCwgMTExLCAxMzMsIDExNywgIDk0LCAxMTQsIDEwMCwgIDc2LCA5NSwgODIsICA1OCwgNzUsIDY0LCAgMzYsIDUwLCA0MiwgICAwLCAxMiwgIDUsCi0gICAgMTY1LCAxOTEsIDE0NywgMTQ3LCAxNzAsIDEzMSwgMTMwLCAxNTIsIDExNywgMTEzLCAxMzIsIDEwMiwgIDk1LCAxMTMsIDg2LCAgNzcsIDk0LCA3MSwgIDU4LCA3NCwgNTQsICAzNSwgNTAsIDMzLCAgIDAsIDEzLCAgMCwKLSAgICAxNjcsIDE4OSwgMTI2LCAxNDgsIDE2OSwgMTEzLCAxMzIsIDE1MSwgMTAwLCAxMTMsIDEzMSwgODYsICA5NiwgMTEyLCA3MywgIDc3LCA5MywgNTksICA1OSwgNzMsIDQzLCAgMzUsIDQ5LCAyMywgICAwLCAxMiwgIDAsCi0gICAgMTcwLCAxODksIDEwNCwgMTUwLCAxNjgsIDkxLCAxMzMsIDE1MCwgODEsIDExNCwgMTMwLCA2OSwgIDk2LCAxMTEsIDU3LCAgNzgsIDkyLCA0NiwgIDU5LCA3MywgMzEsICAzNSwgNDksIDExLCAgIDAsIDEzLCAgMCwKLSAgICAxNzEsIDE4OCwgNzgsIDE1MiwgMTY4LCA2OCwgMTM0LCAxNDksIDYwLCAxMTUsIDEzMCwgNTAsICA5NiwgMTExLCA0MSwgIDc4LCA5MiwgMjksICA2MCwgNzMsIDE1LCAgMzUsIDQ5LCAgMCwgICAwLCAxMiwgIDAsCi0gICAgMTczLCAxODcsIDU1LCAxNTMsIDE2NywgNDcsIDEzNCwgMTQ5LCAzOSwgMTE1LCAxMjksIDMzLCAgOTcsIDExMCwgMjQsICA3OSwgOTIsIDEzLCAgNjAsIDcyLCAgMCwgIDM1LCA0OCwgIDAsICAgMCwgMTIsICAwLAotICAgIDE1NywgMTc1LCAyMTcsIDEzOSwgMTU3LCAxOTYsIDEyNSwgMTQxLCAxNzUsIDEwOSwgMTIyLCAxNTMsICA5MiwgMTA0LCAxMzIsICA3NiwgODYsIDExMCwgIDU5LCA2NywgODgsICAzNywgNDMsIDYxLCAgIDEsICAxLCAyMywKLSAgICAxNjEsIDE3NCwgMTk2LCAxNDQsIDE1NiwgMTc2LCAxMjcsIDE0MCwgMTU4LCAxMTAsIDEyMSwgMTM3LCAgOTQsIDEwNCwgMTE4LCAgNzcsIDg1LCA5OCwgIDU5LCA2NywgNzgsICAzNywgNDMsIDUzLCAgIDAsICAyLCAxNiwKLSAgICAxNjMsIDE3NCwgMTc4LCAxNDYsIDE1NiwgMTYwLCAxMzAsIDEzOSwgMTQzLCAxMTIsIDEyMSwgMTI0LCAgOTUsIDEwMywgMTA2LCAgNzgsIDg1LCA4OCwgIDYwLCA2NiwgNjksICAzNywgNDIsIDQ2LCAgIDAsICAyLCAgNywKLSAgICAxNjYsIDE3MywgMTU5LCAxNDcsIDE1NCwgMTQyLCAxMzAsIDEzOCwgMTI3LCAxMTMsIDEyMCwgMTExLCAgOTYsIDEwMywgOTUsICA3OCwgODQsIDc3LCAgNjAsIDY2LCA1OSwgIDM3LCA0MywgMzcsICAgMCwgIDIsICAwLAotICAgIDE2NiwgMTcyLCAxMzksIDE0OCwgMTU0LCAxMjUsIDEzMSwgMTM3LCAxMTIsIDExMywgMTIwLCA5NiwgIDk2LCAxMDIsIDgxLCAgNzgsIDg0LCA2NiwgIDYwLCA2NSwgNTAsICAzNywgNDIsIDI5LCAgIDAsICAzLCAgMCwKLSAgICAxNjcsIDE3MSwgMTIwLCAxNDksIDE1MywgMTA3LCAxMzMsIDEzNywgOTUsIDExNCwgMTE4LCA4MSwgIDk3LCAxMDEsIDY5LCAgNzksIDg0LCA1NiwgIDYwLCA2NSwgNDAsICAzNywgNDIsIDE5LCAgIDAsICAzLCAgMCwKLSAgICAxNzAsIDE3MCwgOTksIDE1MSwgMTUyLCA4NywgMTM0LCAxMzYsIDc3LCAxMTUsIDExOCwgNjYsICA5NywgMTAxLCA1NSwgIDc5LCA4MywgNDIsICA2MSwgNjUsIDI4LCAgMzcsIDQyLCAgNywgICAwLCAgMywgIDAsCi0gICAgMTcyLCAxNzAsIDc1LCAxNTIsIDE1MSwgNjUsIDEzNCwgMTM1LCA1NywgMTE1LCAxMTcsIDQ4LCAgOTcsIDEwMCwgMzgsICA3OSwgODMsIDI3LCAgNjEsIDY0LCAxMiwgIDM2LCA0MiwgIDAsICAgMCwgIDMsICAwLAotICAgIDE3MiwgMTY5LCA1NSwgMTU0LCAxNTEsIDQ2LCAxMzUsIDEzNCwgNDAsIDExNiwgMTE2LCAzMiwgIDk3LCA5OSwgMjEsICA4MCwgODIsIDEwLCAgNjEsIDY0LCAgMCwgIDM2LCA0MSwgIDAsICAgMCwgIDMsICAwLAotICAgIDE2MCwgMTU0LCAyMDMsIDE0MywgMTM5LCAxODIsIDEyNywgMTI0LCAxNjQsIDExMSwgMTA3LCAxNDMsICA5NSwgOTEsIDEyMiwgIDc4LCA3NSwgMTAzLCAgNjAsIDU3LCA4MSwgIDM5LCAzMywgNTYsICAgMSwgIDAsIDE4LAotICAgIDE2MywgMTU0LCAxODQsIDE0NiwgMTM4LCAxNjUsIDEzMCwgMTIzLCAxNDgsIDExMywgMTA3LCAxMjksICA5NiwgOTAsIDExMCwgIDc5LCA3NCwgOTIsICA2MSwgNTYsIDcyLCAgMzksIDM0LCA0OCwgICAyLCAgMCwgIDksCi0gICAgMTY1LCAxNTQsIDE2NywgMTQ3LCAxMzcsIDE0OSwgMTMxLCAxMjIsIDEzNCwgMTE0LCAxMDYsIDExNywgIDk2LCA5MCwgMTAwLCAgNzksIDc0LCA4MiwgIDYxLCA1NiwgNjQsICAzOSwgMzMsIDQwLCAgIDIsICAwLCAgMSwKLSAgICAxNjYsIDE1MywgMTUwLCAxNDksIDEzNywgMTMzLCAxMzIsIDEyMiwgMTE5LCAxMTQsIDEwNiwgMTA0LCAgOTcsIDkwLCA4OCwgIDc5LCA3NCwgNzIsICA2MSwgNTYsIDU1LCAgMzksIDM0LCAzMywgICAwLCAgMCwgIDAsCi0gICAgMTY4LCAxNTIsIDEzMiwgMTQ5LCAxMzYsIDExNywgMTMyLCAxMjEsIDEwNCwgMTE0LCAxMDUsIDkwLCAgOTcsIDg5LCA3NiwgIDc5LCA3MywgNjIsICA2MSwgNTYsIDQ2LCAgMzgsIDM0LCAyNSwgICAwLCAgMCwgIDAsCi0gICAgMTY5LCAxNTEsIDExNCwgMTUwLCAxMzUsIDEwMSwgMTMzLCAxMjEsIDkwLCAxMTQsIDEwNCwgNzcsICA5NywgODksIDY1LCAgODAsIDczLCA1MSwgIDYxLCA1NiwgMzYsICAzOCwgMzQsIDE2LCAgIDAsICAwLCAgMCwKLSAgICAxNzAsIDE1MCwgOTQsIDE1MSwgMTM1LCA4MywgMTM0LCAxMjAsIDczLCAxMTUsIDEwNCwgNjIsICA5OCwgODgsIDUxLCAgODAsIDcyLCAzOSwgIDYxLCA1NiwgMjQsICAzOCwgMzQsICAzLCAgIDAsICAwLCAgMCwKLSAgICAxNzIsIDE1MCwgNzIsIDE1MywgMTM0LCA2MywgMTM1LCAxMTksIDU1LCAxMTUsIDEwMywgNDUsICA5OCwgODgsIDM2LCAgODAsIDcyLCAyNCwgIDYxLCA1NSwgIDksICAzOCwgMzQsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxNzIsIDE1MCwgNTQsIDE1MywgMTM0LCA0NywgMTM1LCAxMTksIDM4LCAxMTYsIDEwMywgMzAsICA5OCwgODcsIDIxLCAgODAsIDcyLCAgOCwgIDYyLCA1NSwgIDAsICAzNywgMzQsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxNjIsIDEzNCwgMTkwLCAxNDUsIDEyMCwgMTcxLCAxMjksIDEwOCwgMTUzLCAxMTMsIDkzLCAxMzQsICA5NywgNzgsIDExNSwgIDgwLCA2MywgOTYsICA2MiwgNDYsIDc1LCAgNDEsIDIzLCA1MSwgICAwLCAgMCwgMTEsCi0gICAgMTY1LCAxMzQsIDE3MywgMTQ3LCAxMjAsIDE1NCwgMTMxLCAxMDcsIDEzOCwgMTE0LCA5MiwgMTIwLCAgOTcsIDc4LCAxMDMsICA4MCwgNjMsIDg1LCAgNjIsIDQ2LCA2NiwgIDQwLCAyMywgNDMsICAgMCwgIDAsICAyLAotICAgIDE2NiwgMTM0LCAxNTcsIDE0OCwgMTIwLCAxNDAsIDEzMiwgMTA2LCAxMjUsIDExNCwgOTIsIDEwOSwgIDk3LCA3NywgOTMsICA4MSwgNjMsIDc3LCAgNjIsIDQ2LCA1OCwgIDQwLCAyNCwgMzYsICAgMCwgIDAsICAwLAotICAgIDE2OCwgMTMzLCAxNDAsIDE0OSwgMTE5LCAxMjUsIDEzMiwgMTA2LCAxMTIsIDExNSwgOTIsIDk3LCAgOTgsIDc3LCA4MiwgIDgxLCA2MiwgNjcsICA2MiwgNDYsIDUwLCAgNDAsIDI0LCAyOSwgICAwLCAgMCwgIDAsCi0gICAgMTY4LCAxMzMsIDEyMywgMTUwLCAxMTksIDExMCwgMTMzLCAxMDYsIDk3LCAxMTUsIDkxLCA4NCwgIDk4LCA3NywgNzAsICA4MSwgNjIsIDU3LCAgNjIsIDQ2LCA0MSwgIDQwLCAyNCwgMjAsICAgMCwgIDAsICAwLAotICAgIDE2OSwgMTMyLCAxMDcsIDE1MCwgMTE4LCA5NCwgMTMzLCAxMDUsIDg0LCAxMTUsIDkxLCA3MiwgIDk4LCA3NiwgNjAsICA4MCwgNjIsIDQ3LCAgNjIsIDQ2LCAzMiwgIDM5LCAyNSwgMTEsICAgMCwgIDAsICAwLAotICAgIDE3MSwgMTMyLCA4OSwgMTUyLCAxMTgsIDc5LCAxMzUsIDEwNSwgNjksIDExNSwgOTAsIDU4LCAgOTgsIDc2LCA0NywgIDgwLCA2MiwgMzYsICA2MiwgNDYsIDIxLCAgMzksIDI1LCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTcxLCAxMzIsIDY5LCAxNTMsIDExNywgNjAsIDEzNSwgMTA0LCA1MiwgMTE2LCA5MCwgNDIsICA5OCwgNzYsIDMzLCAgODEsIDYxLCAyMSwgIDYyLCA0NiwgIDYsICAzOCwgMjUsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxNzIsIDEzMiwgNTQsIDE1MywgMTE4LCA0NSwgMTM1LCAxMDQsIDM4LCAxMTYsIDkwLCAyOCwgIDk4LCA3NiwgMTgsICA4MSwgNjEsICA2LCAgNjIsIDQ2LCAgMCwgIDM4LCAyNSwgIDAsICAgMCwgIDAsICAwLAotICAgIDE2NCwgMTE1LCAxNzcsIDE0NiwgMTAzLCAxNTksIDEzMCwgOTEsIDE0MywgMTE0LCA3OCwgMTI1LCAgOTcsIDY1LCAxMDcsICA4MSwgNTEsIDg5LCAgNjMsIDM0LCA2OSwgIDQxLCAgOSwgNDYsICAgMCwgIDAsICA0LAotICAgIDE2NiwgMTE1LCAxNjEsIDE0OCwgMTAzLCAxNDQsIDEzMiwgOTEsIDEyOSwgMTE1LCA3OCwgMTEyLCAgOTgsIDY1LCA5NiwgIDgxLCA1MSwgNzksICA2MywgMzUsIDYxLCAgNDEsIDExLCAzOCwgICAwLCAgMCwgIDAsCi0gICAgMTY3LCAxMTUsIDE0NiwgMTUwLCAxMDIsIDEzMSwgMTMyLCA5MSwgMTE3LCAxMTUsIDc4LCAxMDEsICA5OCwgNjUsIDg2LCAgODEsIDUxLCA3MSwgIDYzLCAzNSwgNTQsICA0MSwgMTIsIDMyLCAgIDAsICAwLCAgMCwKLSAgICAxNjgsIDExNCwgMTMyLCAxNTAsIDEwMywgMTE4LCAxMzMsIDkxLCAxMDUsIDExNiwgNzgsIDkxLCAgOTgsIDY0LCA3NiwgIDgyLCA1MSwgNjEsICA2MywgMzYsIDQ2LCAgNDEsIDEzLCAyNCwgICAwLCAgMCwgIDAsCi0gICAgMTY5LCAxMTQsIDExNiwgMTUwLCAxMDIsIDEwMywgMTM0LCA5MCwgOTEsIDExNiwgNzgsIDc5LCAgOTgsIDY1LCA2NiwgIDgxLCA1MSwgNTMsICA2MywgMzYsIDM3LCAgNDAsIDE0LCAxNywgICAwLCAgMCwgIDAsCi0gICAgMTY5LCAxMTQsIDEwMSwgMTUxLCAxMDEsIDg5LCAxMzQsIDkwLCA3OSwgMTE2LCA3NywgNjcsICA5OCwgNjQsIDU2LCAgODEsIDUxLCA0NCwgIDYzLCAzNiwgMjksICA0MCwgMTUsICA3LCAgIDAsICAwLCAgMCwKLSAgICAxNzAsIDExNCwgODUsIDE1MiwgMTAxLCA3NSwgMTM1LCA5MCwgNjUsIDExNiwgNzcsIDU0LCAgOTgsIDY0LCA0NCwgIDgxLCA1MSwgMzIsICA2MywgMzYsIDE3LCAgMzksIDE1LCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTcyLCAxMTMsIDY2LCAxNTIsIDEwMSwgNTgsIDEzNSwgODksIDQ5LCAxMTYsIDc3LCA0MCwgIDk5LCA2NCwgMzAsICA4MSwgNTEsIDE4LCAgNjIsIDM2LCAgMywgIDM4LCAxNiwgIDAsICAgMCwgIDAsICAwLAotICAgIDE3MSwgMTEzLCA1MSwgMTUzLCAxMDEsIDQ0LCAxMzYsIDg5LCAzNiwgMTE2LCA3NywgMjgsICA5OSwgNjQsIDE4LCAgODEsIDUxLCAgNSwgIDYyLCAzNiwgIDAsICAzOCwgMTYsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxNjUsIDk0LCAxNjYsIDE0NywgODIsIDE0NywgMTMyLCA3MiwgMTMyLCAxMTUsIDYxLCAxMTUsICA5OCwgNDksIDk5LCAgODIsIDM2LCA4MiwgIDY0LCAxOSwgNjQsICA0MiwgIDAsIDQxLCAgIDAsICAwLCAgMCwKLSAgICAxNjcsIDkzLCAxNTAsIDE1MCwgODMsIDEzNCwgMTMzLCA3MywgMTIwLCAxMTYsIDYyLCAxMDQsICA5OSwgNDksIDg4LCAgODIsIDM2LCA3MiwgIDY0LCAyMCwgNTUsICA0MSwgIDAsIDMzLCAgIDAsICAwLCAgMCwKLSAgICAxNjksIDkzLCAxMzcsIDE1MCwgODMsIDEyMiwgMTM0LCA3MywgMTA5LCAxMTYsIDYxLCA5NCwgIDk5LCA1MCwgODAsICA4MiwgMzcsIDY1LCAgNjQsIDIxLCA0OSwgIDQxLCAgMCwgMjcsICAgMCwgIDAsICAwLAotICAgIDE2OSwgOTQsIDEyMywgMTUwLCA4MywgMTEwLCAxMzMsIDczLCA5NywgMTE2LCA2MSwgODMsICA5OSwgNTAsIDcwLCAgODIsIDM4LCA1NywgIDYzLCAyMywgNDIsICA0MSwgIDAsIDIwLCAgIDAsICAwLCAgMCwKLSAgICAxNjksIDk0LCAxMDksIDE1MCwgODQsIDk3LCAxMzQsIDczLCA4NSwgMTE2LCA2MiwgNzMsICA5OSwgNTEsIDYxLCAgODEsIDM4LCA0OCwgIDYzLCAyMywgMzMsICA0MSwgIDEsIDExLCAgIDAsICAwLCAgMCwKLSAgICAxNzAsIDk0LCA5NiwgMTUwLCA4MywgODQsIDEzNCwgNzMsIDc0LCAxMTYsIDYxLCA2MiwgIDk5LCA1MCwgNTEsICA4MiwgMzgsIDM5LCAgNjQsIDIzLCAyNCwgIDQwLCAgMywgIDQsICAgMCwgIDAsICAwLAotICAgIDE3MSwgOTMsIDc5LCAxNTIsIDgyLCA3MCwgMTM1LCA3MywgNjEsIDExNiwgNjIsIDUxLCAgOTgsIDUxLCA0MCwgIDgxLCAzOCwgMjgsICA2MywgMjQsIDE0LCAgMzksICA0LCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTcxLCA5NCwgNjQsIDE1MiwgODMsIDU1LCAxMzUsIDczLCA0NywgMTE2LCA2MiwgMzcsICA5OCwgNTAsIDI3LCAgODEsIDM4LCAxNSwgIDYzLCAyNCwgIDEsICAzOSwgIDQsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxNzIsIDkzLCA1MSwgMTUzLCA4MiwgNDIsIDEzNSwgNzMsIDM1LCAxMTcsIDYyLCAyNiwgIDk5LCA1MSwgMTYsICA4MSwgMzksICAzLCAgNjMsIDI1LCAgMCwgIDM4LCAgNSwgIDAsICAgMCwgIDAsICAwLAotICAgIDE2NiwgNjgsIDE1MywgMTQ4LCA1OSwgMTM3LCAxMzMsIDQ5LCAxMjEsIDExNSwgMzksIDEwNiwgIDk5LCAyOCwgOTEsICA4MiwgMTMsIDc1LCAgNjUsICAwLCA1OCwgIDQyLCAgMCwgMzYsICAgMCwgIDAsICAwLAotICAgIDE2OCwgNjgsIDEzOSwgMTUwLCA1OSwgMTI0LCAxMzQsIDUwLCAxMTAsIDExNiwgNDAsIDk2LCAgOTksIDMwLCA4MSwgIDgyLCAxNiwgNjYsICA2NCwgIDAsIDUwLCAgNDEsICAwLCAyOSwgICAwLCAgMCwgIDAsCi0gICAgMTY5LCA2OSwgMTI2LCAxNTAsIDU5LCAxMTMsIDEzNCwgNTEsIDEwMSwgMTE3LCA0MiwgODcsIDEwMCwgMzAsIDczLCAgODIsIDE3LCA1OSwgIDY1LCAgMCwgNDMsICA0MSwgIDAsIDIzLCAgIDAsICAwLCAgMCwKLSAgICAxNjksIDcwLCAxMTUsIDE1MCwgNjEsIDEwMiwgMTM0LCA1MiwgODksIDExNiwgNDIsIDc3LCAgOTksIDMyLCA2NSwgIDgyLCAxOSwgNTIsICA2NCwgIDAsIDM2LCAgNDEsICAwLCAxNSwgICAwLCAgMCwgIDAsCi0gICAgMTY5LCA3MCwgMTAxLCAxNTAsIDYxLCA5MCwgMTM0LCA1MiwgNzksIDExNiwgNDMsIDY4LCAgOTksIDMyLCA1NSwgIDgyLCAyMSwgNDMsICA2NCwgIDIsIDI4LCAgNDEsICAwLCAgNiwgICAwLCAgMCwgIDAsCi0gICAgMTcwLCA3MCwgODksIDE1MSwgNjIsIDc5LCAxMzQsIDUzLCA2OSwgMTE2LCA0NCwgNTgsICA5OSwgMzMsIDQ2LCAgODEsIDIxLCAzNCwgIDY0LCAgMywgMjAsICA0MSwgIDAsICAyLCAgIDAsICAwLCAgMCwKLSAgICAxNzAsIDcxLCA3NiwgMTUyLCA2MiwgNjYsIDEzNCwgNTMsIDU3LCAxMTYsIDQzLCA0NiwgIDk5LCAzMywgMzYsICA4MiwgMjIsIDI0LCAgNjQsICA1LCAxMCwgIDQwLCAgMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDE3MSwgNzAsIDYxLCAxNTIsIDYyLCA1MiwgMTM1LCA1MywgNDQsIDExNiwgNDQsIDM1LCAgOTksIDM0LCAyNCwgIDgyLCAyMiwgMTIsICA2MywgIDYsICAwLCAgMzksICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTcxLCA3MSwgNDksIDE1MywgNjIsIDQxLCAxMzUsIDU0LCAzMywgMTE3LCA0NSwgMjUsICA5OCwgMzQsIDEzLCAgODEsIDIzLCAgMCwgIDYzLCAgNywgIDAsICAzOSwgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxNjcsIDMzLCAxNDIsIDE0OSwgMjQsIDEyNywgMTM0LCAxMCwgMTEzLCAxMTYsICAwLCA5NywgMTAwLCAgMCwgODMsICA4MywgIDAsIDY4LCAgNjUsICAwLCA1MiwgIDQwLCAgMCwgMzAsICAgMCwgIDAsICAwLAotICAgIDE2OSwgMzMsIDEyOSwgMTUwLCAyNiwgMTE1LCAxMzQsIDE3LCAxMDIsIDExNiwgIDMsIDg5LCAxMDAsICAwLCA3NSwgIDgzLCAgMCwgNjAsICA2NSwgIDAsIDQ1LCAgNDAsICAwLCAyNCwgICAwLCAgMCwgIDAsCi0gICAgMTY5LCAzNiwgMTE4LCAxNTEsIDI3LCAxMDQsIDEzNCwgMTksIDkzLCAxMTYsICA3LCA4MCwgMTAwLCAgMCwgNjcsICA4MywgIDAsIDU0LCAgNjUsICAwLCAzOCwgIDQxLCAgMCwgMTcsICAgMCwgIDAsICAwLAotICAgIDE2OSwgMzksIDEwNywgMTUwLCAzMCwgOTQsIDEzNCwgMjIsIDg0LCAxMTYsIDExLCA3MSwgIDk5LCAgMCwgNTksICA4MywgIDAsIDQ2LCAgNjQsICAwLCAzMSwgIDQwLCAgMCwgIDksICAgMCwgIDAsICAwLAotICAgIDE2OSwgMzksIDk1LCAxNTEsIDMxLCA4MywgMTM0LCAyNCwgNzMsIDExNiwgMTUsIDYyLCAxMDAsICAxLCA1MSwgIDgzLCAgMCwgMzgsICA2NCwgIDAsIDI0LCAgNDAsICAwLCAgNSwgICAwLCAgMCwgIDAsCi0gICAgMTY5LCA0MSwgODMsIDE1MSwgMzMsIDczLCAxMzQsIDI2LCA2NCwgMTE3LCAxNywgNTQsICA5OSwgIDQsIDQyLCAgODIsICAwLCAzMCwgIDY0LCAgMCwgMTYsICA0MCwgIDAsICAxLCAgIDAsICAwLCAgMCwKLSAgICAxNzAsIDQyLCA3MSwgMTUyLCAzNCwgNjIsIDEzNCwgMjgsIDUzLCAxMTcsIDE5LCA0NCwgIDk5LCAgNiwgMzMsICA4MiwgIDAsIDIxLCAgNjMsICAwLCAgNCwgIDM5LCAgMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDE3MSwgNDIsIDU5LCAxNTIsIDM1LCA1MCwgMTM0LCAyOSwgNDIsIDExNywgMjEsIDMyLCAgOTksICA5LCAyMiwgIDgyLCAgMCwgIDksICA2MywgIDAsICAwLCAgMzgsICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTcyLCA0MiwgNDgsIDE1MiwgMzYsIDQwLCAxMzUsIDI5LCAzMiwgMTE3LCAyMSwgMjMsICA5OSwgMTAsIDEyLCAgODIsICAwLCAgMCwgIDYzLCAgMCwgIDAsICAzOCwgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxMDcsIDIwNywgMjQ2LCAgOTYsIDE4NSwgMjIwLCAgODYsIDE2NSwgMTk2LCAgNzMsIDE0NCwgMTcxLCAgNjAsIDEyMywgMTQ3LCAgNDYsIDEwMywgMTI1LCAgMzIsIDgyLCAxMDAsICAgOSwgNTYsIDcxLCAgIDAsIDIwLCAzMywKLSAgICAxMTUsIDIwNiwgMjIxLCAxMDQsIDE4NCwgMTk4LCAgOTIsIDE2NCwgMTc4LCAgNzgsIDE0MywgMTU0LCAgNjQsIDEyMywgMTMzLCAgNTEsIDEwMiwgMTExLCAgMzQsIDgxLCA4OSwgIDEwLCA1NiwgNjMsICAgMCwgMjAsIDI3LAotICAgIDEyMiwgMjA0LCAyMDAsIDEwOCwgMTgzLCAxODAsICA5NSwgMTYzLCAxNjEsICA4MiwgMTQyLCAxNDAsICA2OCwgMTIyLCAxMjAsICA1NCwgMTAyLCAxMDEsICAzNiwgODEsIDc5LCAgMTEsIDU2LCA1NSwgICAwLCAyMCwgMjAsCi0gICAgMTI1LCAyMDMsIDE3OSwgMTExLCAxODEsIDE2MCwgIDk3LCAxNjIsIDE0MywgIDg1LCAxNDEsIDEyNCwgIDcwLCAxMjEsIDEwNywgIDU1LCAxMDEsIDg5LCAgMzgsIDgwLCA2OSwgIDE0LCA1NSwgNDYsICAgMCwgMTksIDEwLAotICAgIDEyOCwgMjAyLCAxNTYsIDExMywgMTgwLCAxNDAsIDEwMiwgMTYxLCAxMjUsICA4NywgMTQwLCAxMDgsICA3MSwgMTIwLCA5MiwgIDU2LCAxMDAsIDc2LCAgMzksIDc5LCA1OSwgIDE0LCA1NSwgMzgsICAgMCwgMjAsICAzLAotICAgIDEzMiwgMjAwLCAxMzUsIDExNywgMTc5LCAxMjEsIDEwMywgMTU5LCAxMDYsICA4OCwgMTM5LCA5MywgIDczLCAxMTksIDc5LCAgNTcsIDEwMCwgNjUsICA0MSwgNzksIDQ5LCAgMTUsIDU0LCAyOCwgICAwLCAxOSwgIDAsCi0gICAgMTM0LCAyMDAsIDExMSwgMTE5LCAxNzgsIDk4LCAxMDUsIDE1OCwgODcsICA4OSwgMTM4LCA3NiwgIDc0LCAxMTgsIDY0LCAgNTgsIDk5LCA1MSwgIDQxLCA3OCwgMzcsICAxNiwgNTQsIDE3LCAgIDAsIDE5LCAgMCwKLSAgICAxMzcsIDE5OSwgODUsIDEyMiwgMTc3LCA3NSwgMTA4LCAxNTgsIDY2LCAgOTEsIDEzNywgNTYsICA3NSwgMTE4LCA0NiwgIDU5LCA5OCwgMzUsICA0MiwgNzgsIDIyLCAgMTYsIDU0LCAgMywgICAwLCAxOSwgIDAsCi0gICAgMTQwLCAxOTgsIDYyLCAxMjUsIDE3NywgNTUsIDEwOSwgMTU4LCA0NywgIDkyLCAxMzcsIDQwLCAgNzYsIDExNywgMzIsICA1OSwgOTgsIDIxLCAgNDIsIDc4LCAgNiwgIDE2LCA1NCwgIDAsICAgMCwgMTgsICAwLAotICAgIDExOCwgMTg2LCAyMzEsIDEwNiwgMTY3LCAyMDYsICA5MywgMTQ5LCAxODQsICA4MSwgMTMwLCAxNjEsICA2NywgMTExLCAxMzksICA1NCwgOTIsIDExNywgIDM5LCA3MiwgOTMsICAxNywgNDgsIDY2LCAgIDAsIDEwLCAyOSwKLSAgICAxMjMsIDE4NSwgMjA3LCAxMTAsIDE2NiwgMTg2LCAgOTgsIDE0OCwgMTY3LCAgODUsIDEyOSwgMTQ1LCAgNzEsIDExMSwgMTI1LCAgNTYsIDkyLCAxMDQsICA0MCwgNzIsIDgzLCAgMTgsIDQ4LCA1NywgICAwLCAxMCwgMjIsCi0gICAgMTI4LCAxODQsIDE4OCwgMTEzLCAxNjUsIDE2OCwgMTAyLCAxNDcsIDE1MSwgIDg4LCAxMjgsIDEzMSwgIDczLCAxMTAsIDExMywgIDU4LCA5MSwgOTQsICA0MiwgNzEsIDc0LCAgMTksIDQ4LCA1MCwgICAwLCAgOSwgMTUsCi0gICAgMTMxLCAxODMsIDE2OCwgMTE2LCAxNjQsIDE1MSwgMTA0LCAxNDYsIDEzNCwgIDg5LCAxMjcsIDExNywgIDczLCAxMDksIDEwMCwgIDU4LCA5MCwgODMsICA0MiwgNzEsIDY1LCAgMjAsIDQ4LCA0MiwgICAwLCAgOSwgIDUsCi0gICAgMTM0LCAxODIsIDE0OCwgMTIwLCAxNjMsIDEzMSwgMTA1LCAxNDUsIDExOCwgIDkwLCAxMjYsIDEwMiwgIDc1LCAxMDgsIDg2LCAgNTksIDkwLCA3MiwgIDQzLCA3MSwgNTUsICAxOSwgNDcsIDM0LCAgIDAsICA5LCAgMCwKLSAgICAxMzYsIDE4MSwgMTI4LCAxMjIsIDE2MiwgMTE1LCAxMDcsIDE0NCwgMTAyLCAgOTIsIDEyNSwgODcsICA3NiwgMTA3LCA3NCwgIDYxLCA4OSwgNjAsICA0NCwgNzAsIDQ1LCAgMjAsIDQ3LCAyNCwgICAwLCAgOCwgIDAsCi0gICAgMTM5LCAxODAsIDEwNiwgMTI0LCAxNjEsIDk1LCAxMDksIDE0NCwgODMsICA5MywgMTI0LCA3MSwgIDc3LCAxMDcsIDYwLCAgNjEsIDg5LCA0NywgIDQ0LCA3MCwgMzMsICAyMCwgNDcsIDEzLCAgIDAsICA4LCAgMCwKLSAgICAxNDIsIDE3OSwgODIsIDEyNSwgMTYwLCA3MiwgMTExLCAxNDMsIDYzLCAgOTQsIDEyNCwgNTQsICA3NywgMTA2LCA0NCwgIDYxLCA4OCwgMzIsICA0NCwgNjksIDE4LCAgMjAsIDQ2LCAgMCwgICAwLCAgOCwgIDAsCi0gICAgMTQzLCAxNzksIDYyLCAxMjcsIDE2MCwgNTQsIDExMSwgMTQyLCA0NywgIDk0LCAxMjQsIDM5LCAgNzgsIDEwNiwgMjksICA2MiwgODgsIDE4LCAgNDUsIDY5LCAgMywgIDIwLCA0NiwgIDAsICAgMCwgIDgsICAwLAotICAgIDEyNCwgMTY3LCAyMTYsIDExMiwgMTUwLCAxOTQsICA5OSwgMTM0LCAxNzQsICA4NywgMTE3LCAxNTMsICA3MywgMTAwLCAxMzEsICA1OCwgODIsIDExMCwgIDQzLCA2NCwgODgsICAyMywgNDAsIDYxLCAgIDAsICAwLCAyNCwKLSAgICAxMjksIDE2NiwgMTk1LCAxMTYsIDE1MCwgMTc1LCAxMDMsIDEzNCwgMTU4LCAgODksIDExNiwgMTM3LCAgNzUsIDk5LCAxMTgsICA2MCwgODIsIDk4LCAgNDQsIDYzLCA3OCwgIDIzLCA0MCwgNTMsICAgMCwgIDAsIDE3LAotICAgIDEzMiwgMTY2LCAxNzcsIDExOSwgMTQ5LCAxNjAsIDEwNiwgMTMzLCAxNDMsICA5MCwgMTE1LCAxMjQsICA3NiwgOTksIDEwNywgIDYxLCA4MSwgODgsICA0NSwgNjMsIDY5LCAgMjQsIDQwLCA0NiwgICAwLCAgMCwgIDksCi0gICAgMTM2LCAxNjYsIDE1OSwgMTIxLCAxNDgsIDE0MywgMTA3LCAxMzIsIDEyNiwgIDkyLCAxMTUsIDExMSwgIDc3LCA5OCwgOTQsICA2MiwgODEsIDc4LCAgNDYsIDYzLCA2MCwgIDIzLCA0MCwgMzgsICAgMCwgIDAsICAwLAotICAgIDEzOCwgMTY0LCAxNDAsIDEyMiwgMTQ3LCAxMjUsIDEwOCwgMTMxLCAxMTEsICA5MywgMTE0LCA5NywgIDc5LCA5OCwgODIsICA2MywgODAsIDY3LCAgNDYsIDYyLCA1MCwgIDI0LCA0MCwgMjksICAgMCwgIDAsICAwLAotICAgIDEzOSwgMTYzLCAxMjIsIDEyNCwgMTQ2LCAxMDksIDExMCwgMTMxLCA5NiwgIDk0LCAxMTQsIDgzLCAgNzksIDk3LCA3MCwgIDYzLCA4MSwgNTcsICA0NiwgNjIsIDQxLCAgMjQsIDQwLCAyMSwgICAwLCAgMCwgIDAsCi0gICAgMTQxLCAxNjMsIDEwMSwgMTI2LCAxNDUsIDkwLCAxMTEsIDEzMCwgNzksICA5NSwgMTEzLCA2OCwgIDc5LCA5NiwgNTYsICA2MywgODAsIDQ0LCAgNDcsIDYyLCAzMCwgIDIzLCA0MCwgMTAsICAgMCwgIDAsICAwLAotICAgIDE0NCwgMTYyLCA3OSwgMTI3LCAxNDUsIDcwLCAxMTIsIDEyOSwgNjAsICA5NSwgMTEyLCA1MSwgIDc5LCA5NiwgNDEsICA2NCwgNzksIDMwLCAgNDcsIDYxLCAxNSwgIDIzLCA0MCwgIDAsICAgMCwgIDAsICAwLAotICAgIDE0NSwgMTYyLCA2MCwgMTI5LCAxNDUsIDUyLCAxMTMsIDEyOSwgNDYsICA5NiwgMTEyLCAzNywgIDc5LCA5NSwgMjcsICA2NCwgNzksIDE2LCAgNDcsIDYxLCAgMSwgIDIzLCAzOSwgIDAsICAgMCwgIDAsICAwLAotICAgIDEzMSwgMTQ3LCAyMDIsIDExNywgMTMzLCAxODEsIDEwNSwgMTE5LCAxNjIsICA5MSwgMTAzLCAxNDIsICA3NywgODcsIDEyMiwgIDYyLCA3MSwgMTAyLCAgNDcsIDU0LCA4MSwgIDI2LCAzMSwgNTYsICAgMCwgIDAsIDE4LAotICAgIDEzNSwgMTQ3LCAxODMsIDEyMCwgMTMyLCAxNjQsIDEwNywgMTE4LCAxNDcsICA5MywgMTAyLCAxMjgsICA3OCwgODcsIDExMCwgIDYzLCA3MSwgOTIsICA0NywgNTQsIDcyLCAgMjYsIDMxLCA0OCwgICAwLCAgMCwgMTAsCi0gICAgMTM4LCAxNDcsIDE2NiwgMTIzLCAxMzEsIDE0OSwgMTA4LCAxMTgsIDEzMywgIDk0LCAxMDIsIDExNiwgIDc5LCA4NiwgMTAwLCAgNjQsIDcxLCA4MiwgIDQ4LCA1NCwgNjQsICAyNywgMzEsIDQxLCAgIDAsICAwLCAgMiwKLSAgICAxMzksIDE0NiwgMTQ5LCAxMjQsIDEzMSwgMTM0LCAxMTEsIDExNywgMTE5LCAgOTQsIDEwMSwgMTAzLCAgNzksIDg2LCA4OCwgIDY0LCA3MCwgNzIsICA0OCwgNTMsIDU1LCAgMjcsIDMxLCAzMywgICAwLCAgMCwgIDAsCi0gICAgMTQxLCAxNDYsIDEzMiwgMTI1LCAxMzEsIDExNywgMTExLCAxMTcsIDEwNCwgIDk1LCAxMDEsIDkxLCAgODAsIDg2LCA3NywgIDY1LCA3MCwgNjIsICA0OCwgNTMsIDQ2LCAgMjYsIDMxLCAyNSwgICAwLCAgMCwgIDAsCi0gICAgMTQzLCAxNDUsIDExNSwgMTI2LCAxMzAsIDEwMSwgMTEyLCAxMTYsIDkwLCAgOTYsIDEwMCwgNzgsICA4MCwgODUsIDY1LCAgNjUsIDcwLCA1MiwgIDQ5LCA1MywgMzcsICAyNywgMzIsIDE3LCAgIDAsICAwLCAgMCwKLSAgICAxNDQsIDE0NCwgOTYsIDEyOCwgMTI5LCA4NSwgMTEyLCAxMTUsIDc1LCAgOTcsIDEwMCwgNjQsICA4MSwgODUsIDUyLCAgNjUsIDY5LCA0MCwgIDQ5LCA1MywgMjYsICAyNiwgMzEsICA1LCAgIDAsICAwLCAgMCwKLSAgICAxNDYsIDE0NCwgNzYsIDEyOSwgMTI5LCA2NywgMTE0LCAxMTUsIDU4LCAgOTcsIDk5LCA0OCwgIDgyLCA4NCwgMzgsICA2NiwgNjksIDI3LCAgNDksIDUzLCAxMiwgIDI2LCAzMiwgIDAsICAgMCwgIDAsICAwLAotICAgIDE0NiwgMTQ0LCA1OSwgMTMwLCAxMjgsIDUxLCAxMTQsIDExNCwgNDMsICA5OCwgOTksIDM1LCAgODIsIDg0LCAyNSwgIDY2LCA2OSwgMTMsICA0OSwgNTMsICAwLCAgMjYsIDMyLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTM1LCAxMjksIDE4OSwgMTIyLCAxMTUsIDE3MCwgMTA3LCAxMDMsIDE1MiwgIDk0LCA4OSwgMTMzLCAgNzksIDc0LCAxMTQsICA2NCwgNjAsIDk1LCAgNDksIDQzLCA3NSwgIDI5LCAyMCwgNTEsICAgMCwgIDAsIDEyLAotICAgIDEzOCwgMTI5LCAxNzEsIDEyNCwgMTE1LCAxNTMsIDExMCwgMTAzLCAxMzgsICA5NSwgODksIDEyMCwgIDgxLCA3NCwgMTAzLCAgNjYsIDYwLCA4NiwgIDUwLCA0NCwgNjcsICAyOCwgMjEsIDQzLCAgIDAsICAwLCAgMywKLSAgICAxNDAsIDEyOSwgMTU2LCAxMjUsIDExNSwgMTQwLCAxMTEsIDEwMywgMTI1LCAgOTYsIDg5LCAxMDksICA4MSwgNzQsIDkzLCAgNjcsIDYwLCA3NiwgIDUwLCA0NCwgNTksICAyOSwgMjIsIDM2LCAgIDAsICAwLCAgMCwKLSAgICAxNDIsIDEyOCwgMTQwLCAxMjcsIDExNSwgMTI1LCAxMTIsIDEwMiwgMTEyLCAgOTcsIDg4LCA5NywgIDgyLCA3NCwgODMsICA2NywgNjAsIDY3LCAgNTAsIDQ0LCA1MSwgIDI5LCAyMiwgMjksICAgMCwgIDAsICAwLAotICAgIDE0MiwgMTI4LCAxMjQsIDEyNywgMTE0LCAxMTEsIDExMywgMTAyLCA5OCwgIDk4LCA4OCwgODUsICA4MiwgNzQsIDcxLCAgNjYsIDYwLCA1OCwgIDUwLCA0NCwgNDIsICAyOSwgMjIsIDIxLCAgIDAsICAwLCAgMCwKLSAgICAxNDQsIDEyNywgMTA4LCAxMjgsIDExNCwgOTYsIDExMywgMTAxLCA4NSwgIDk4LCA4NywgNzMsICA4MiwgNzQsIDYxLCAgNjcsIDYwLCA0OCwgIDUwLCA0NCwgMzMsICAyOCwgMjMsIDEyLCAgIDAsICAwLCAgMCwKLSAgICAxNDUsIDEyNywgOTEsIDEyOSwgMTE0LCA4MSwgMTE1LCAxMDEsIDcxLCAgOTgsIDg3LCA2MCwgIDgyLCA3MywgNDgsICA2NywgNTksIDM3LCAgNTAsIDQ0LCAyMiwgIDI5LCAyMywgIDEsICAgMCwgIDAsICAwLAotICAgIDE0NywgMTI3LCA3MywgMTMwLCAxMTMsIDYzLCAxMTUsIDEwMSwgNTUsICA5OCwgODcsIDQ1LCAgODMsIDczLCAzNSwgIDY3LCA1OSwgMjQsICA1MCwgNDQsIDEwLCAgMjgsIDI0LCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTQ3LCAxMjcsIDU4LCAxMzEsIDExMywgNDksIDExNSwgMTAwLCA0MiwgIDk5LCA4NiwgMzMsICA4MywgNzMsIDIzLCAgNjcsIDU5LCAxMCwgIDUwLCA0NCwgIDAsICAyNywgMjQsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxMzgsIDExMCwgMTc3LCAxMjQsIDk5LCAxNTksIDExMCwgODgsIDE0MiwgIDk2LCA3NSwgMTI1LCAgODIsIDYyLCAxMDcsICA2NiwgNDgsIDg5LCAgNTEsIDMzLCA3MCwgIDMwLCAgOCwgNDYsICAgMCwgIDAsICA1LAotICAgIDE0MiwgMTExLCAxNjAsIDEyNywgOTksIDE0NCwgMTEzLCA4OCwgMTMwLCAgOTgsIDc1LCAxMTIsICA4MiwgNjIsIDk2LCAgNjgsIDQ5LCA4MCwgIDUxLCAzMywgNjEsICAzMCwgMTAsIDM5LCAgIDAsICAwLCAgMCwKLSAgICAxNDMsIDExMSwgMTQ2LCAxMjgsIDk5LCAxMzEsIDExNCwgODgsIDExOCwgIDk4LCA3NSwgMTAxLCAgODMsIDYyLCA4NiwgIDY4LCA0OSwgNzEsICA1MiwgMzMsIDU0LCAgMzAsIDExLCAzMiwgICAwLCAgMCwgIDAsCi0gICAgMTQ0LCAxMTEsIDEzMiwgMTI4LCA5OSwgMTE4LCAxMTMsIDg4LCAxMDYsICA5OSwgNzUsIDkxLCAgODMsIDYyLCA3NywgIDY4LCA0OSwgNjIsICA1MiwgMzQsIDQ2LCAgMzAsIDEyLCAyNSwgICAwLCAgMCwgIDAsCi0gICAgMTQ0LCAxMTEsIDExNywgMTI5LCA5OCwgMTA0LCAxMTQsIDg3LCA5MiwgIDk5LCA3NSwgODAsICA4MywgNjIsIDY3LCAgNjgsIDQ5LCA1MywgIDUxLCAzNCwgMzgsICAzMCwgMTMsIDE4LCAgIDAsICAwLCAgMCwKLSAgICAxNDUsIDExMSwgMTAzLCAxMzAsIDk4LCA5MSwgMTE0LCA4NywgODAsICA5OSwgNzUsIDY4LCAgODMsIDYzLCA1NywgIDY4LCA1MCwgNDUsICA1MSwgMzQsIDMwLCAgMzAsIDE0LCAgOCwgICAwLCAgMCwgIDAsCi0gICAgMTQ2LCAxMTAsIDg3LCAxMzEsIDk4LCA3NiwgMTE1LCA4NywgNjcsICA5OSwgNzUsIDU2LCAgODMsIDYyLCA0NSwgIDY4LCA0OSwgMzMsICA1MiwgMzUsIDE5LCAgMzAsIDE1LCAgMiwgICAwLCAgMCwgIDAsCi0gICAgMTQ4LCAxMTAsIDcwLCAxMzEsIDk4LCA2MCwgMTE2LCA4NiwgNTIsICA5OSwgNzQsIDQzLCAgODQsIDYyLCAzMywgIDY5LCA0OSwgMjEsICA1MiwgMzUsICA2LCAgMjksIDE1LCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTQ4LCAxMTAsIDU2LCAxMzIsIDk3LCA0OCwgMTE3LCA4NywgNDAsIDEwMCwgNzUsIDMxLCAgODQsIDYyLCAyMiwgIDY4LCA0OSwgIDksICA1MSwgMzUsICAwLCAgMjgsIDE1LCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTQyLCA5MSwgMTY2LCAxMjYsIDgwLCAxNDgsIDExMywgNzEsIDEzMiwgIDk4LCA1OSwgMTE1LCAgODMsIDQ3LCA5OSwgIDY5LCAzNCwgODIsICA1MywgMTcsIDY0LCAgMzIsICAwLCA0MSwgICAwLCAgMCwgIDAsCi0gICAgMTQzLCA5MSwgMTUwLCAxMjgsIDgxLCAxMzUsIDExNCwgNzEsIDEyMCwgIDk5LCA2MCwgMTA0LCAgODUsIDQ4LCA4OSwgIDY5LCAzNSwgNzMsICA1MywgMTksIDU2LCAgMzIsICAwLCAzNCwgICAwLCAgMCwgIDAsCi0gICAgMTQ1LCA5MSwgMTM3LCAxMjksIDgxLCAxMjIsIDExNSwgNzEsIDEwOSwgMTAwLCA2MCwgOTQsICA4NSwgNDgsIDgxLCAgNjksIDM1LCA2NSwgIDUzLCAxOSwgNDksICAzMiwgIDAsIDI4LCAgIDAsICAwLCAgMCwKLSAgICAxNDYsIDkyLCAxMjQsIDEzMCwgODEsIDExMCwgMTE1LCA3MSwgOTgsIDEwMCwgNjAsIDg0LCAgODUsIDQ5LCA3MSwgIDY5LCAzNiwgNTcsICA1MywgMjEsIDQyLCAgMzIsICAwLCAyMSwgICAwLCAgMCwgIDAsCi0gICAgMTQ3LCA5MSwgMTEwLCAxMzAsIDgxLCA5NywgMTE1LCA3MSwgODYsIDEwMCwgNjAsIDc0LCAgODQsIDQ5LCA2MiwgIDY5LCAzNiwgNDgsICA1MywgMjIsIDM0LCAgMzIsICAwLCAxMywgICAwLCAgMCwgIDAsCi0gICAgMTQ3LCA5MiwgOTcsIDEzMCwgODEsIDg1LCAxMTYsIDcyLCA3NiwgMTAwLCA2MCwgNjMsICA4NSwgNDksIDUyLCAgNjksIDM3LCA0MCwgIDUzLCAyMiwgMjYsICAzMSwgIDEsICA1LCAgIDAsICAwLCAgMCwKLSAgICAxNDgsIDkyLCA4MiwgMTMxLCA4MSwgNzEsIDExNiwgNzEsIDYyLCAxMDAsIDYwLCA1MywgIDg0LCA0OSwgNDIsICA2OSwgMzcsIDMwLCAgNTIsIDIzLCAxNiwgIDMxLCAgMiwgIDAsICAgMCwgIDAsICAwLAotICAgIDE0OCwgOTEsIDY3LCAxMzIsIDgxLCA1NywgMTE3LCA3MSwgNDksIDEwMCwgNjAsIDM5LCAgODQsIDQ5LCAzMCwgIDY5LCAzNywgMTgsICA1MiwgMjMsICAyLCAgMzAsICAyLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTQ5LCA5MSwgNTQsIDEzMiwgODEsIDQ2LCAxMTgsIDcxLCAzOSwgMTAxLCA2MCwgMjksICA4NSwgNDksIDE5LCAgNjksIDM3LCAgNiwgIDUyLCAyMywgIDAsICAyOSwgIDMsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxNDMsIDY4LCAxNTMsIDEyOCwgNTksIDEzNywgMTE1LCA0OSwgMTIyLCAgOTksIDM5LCAxMDcsICA4NSwgMjgsIDkxLCAgNzAsIDEzLCA3NSwgIDU0LCAgMCwgNTgsICAzMiwgIDAsIDM2LCAgIDAsICAwLCAgMCwKLSAgICAxNDYsIDY4LCAxNDAsIDEzMSwgNTksIDEyNSwgMTE2LCA1MSwgMTExLCAxMDAsIDQwLCA5NywgIDg1LCAyOSwgODIsICA3MCwgMTUsIDY3LCAgNTQsICAwLCA1MCwgIDMyLCAgMCwgMjksICAgMCwgIDAsICAwLAotICAgIDE0NywgNjgsIDEyNywgMTMxLCA1OSwgMTE0LCAxMTcsIDUxLCAxMDIsIDEwMSwgNDEsIDg4LCAgODYsIDMwLCA3NCwgIDcwLCAxNywgNjAsICA1NCwgIDAsIDQ0LCAgMzIsICAwLCAyMywgICAwLCAgMCwgIDAsCi0gICAgMTQ3LCA3MCwgMTE1LCAxMzEsIDYwLCAxMDMsIDExNiwgNTIsIDkxLCAxMDAsIDQyLCA3OCwgIDg1LCAzMiwgNjUsICA3MCwgMTksIDUzLCAgNTQsICAxLCAzOCwgIDMyLCAgMCwgMTcsICAgMCwgIDAsICAwLAotICAgIDE0NywgNzAsIDEwMywgMTMxLCA2MSwgOTEsIDExNywgNTMsIDgxLCAxMDEsIDQzLCA2OSwgIDg2LCAzMiwgNTcsICA3MCwgMjAsIDQ0LCAgNTQsICAyLCAzMCwgIDMyLCAgMCwgIDcsICAgMCwgIDAsICAwLAotICAgIDE0OCwgNzAsIDkxLCAxMzIsIDYxLCA4MCwgMTE3LCA1MiwgNzAsIDEwMSwgNDMsIDU5LCAgODUsIDMzLCA0OCwgIDcwLCAyMSwgMzYsICA1MywgIDQsIDIyLCAgMzIsICAwLCAgMywgICAwLCAgMCwgIDAsCi0gICAgMTQ4LCA3MCwgNzgsIDEzMiwgNjIsIDY4LCAxMTcsIDUzLCA1OCwgMTAxLCA0MywgNDgsICA4NSwgMzQsIDM4LCAgNzAsIDIyLCAyNiwgIDUzLCAgNiwgMTIsICAzMSwgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxNDksIDcxLCA2NCwgMTMyLCA2MiwgNTQsIDExOCwgNTQsIDQ2LCAxMDEsIDQ0LCAzNywgIDg1LCAzNCwgMjcsICA2OSwgMjMsIDE1LCAgNTMsICA3LCAgMSwgIDMwLCAgMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDE1MCwgNzAsIDUzLCAxMzQsIDYxLCA0NCwgMTE4LCA1NCwgMzYsIDEwMSwgNDQsIDI4LCAgODUsIDM1LCAxNywgIDY5LCAyMywgIDQsICA1MiwgIDgsICAwLCAgMzAsICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTQ1LCAzOCwgMTQzLCAxMzAsIDI5LCAxMjgsIDExNywgMTgsIDExNCwgMTAxLCAgMywgOTgsICA4NywgIDAsIDg0LCAgNzIsICAwLCA2OSwgIDU0LCAgMCwgNTMsICAzMCwgIDAsIDMxLCAgIDAsICAwLCAgMCwKLSAgICAxNDcsIDM4LCAxMzAsIDEzMiwgMzAsIDExNiwgMTE3LCAyMiwgMTAzLCAxMDEsICA4LCA4OSwgIDg3LCAgMCwgNzYsICA3MiwgIDAsIDYyLCAgNTQsICAwLCA0NiwgIDMwLCAgMCwgMjQsICAgMCwgIDAsICAwLAotICAgIDE0OCwgNDAsIDExOSwgMTMyLCAzMSwgMTA1LCAxMTcsIDIzLCA5NCwgMTAxLCAxMywgODEsICA4NywgIDAsIDY4LCAgNzEsICAwLCA1NSwgIDU0LCAgMCwgMzksICAzMCwgIDAsIDE4LCAgIDAsICAwLCAgMCwKLSAgICAxNDgsIDQyLCAxMDgsIDEzMiwgMzQsIDk2LCAxMTcsIDI1LCA4NSwgMTAyLCAxNSwgNzMsICA4NiwgIDIsIDYwLCAgNzEsICAwLCA0NywgIDU0LCAgMCwgMzMsICAzMCwgIDAsIDExLCAgIDAsICAwLCAgMCwKLSAgICAxNDgsIDQzLCA5NiwgMTMzLCAzNSwgODUsIDExNywgMjgsIDc1LCAxMDIsIDE4LCA2NCwgIDg3LCAgNSwgNTIsICA3MSwgIDAsIDQwLCAgNTQsICAwLCAyNSwgIDMwLCAgMCwgIDUsICAgMCwgIDAsICAwLAotICAgIDE0OSwgNDQsIDg1LCAxMzIsIDM2LCA3NSwgMTE4LCAyOSwgNjYsIDEwMSwgMjAsIDU1LCAgODYsICA4LCA0NCwgIDcwLCAgMCwgMzIsICA1MywgIDAsIDE4LCAgMjksICAwLCAgMiwgICAwLCAgMCwgIDAsCi0gICAgMTQ5LCA0NSwgNzQsIDEzMywgMzcsIDY0LCAxMTgsIDMxLCA1NSwgMTAyLCAyMSwgNDUsICA4NSwgMTAsIDM0LCAgNzAsICAwLCAyMiwgIDUzLCAgMCwgIDYsICAyOCwgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxNTAsIDQ2LCA2MSwgMTMzLCAzOSwgNTIsIDExOCwgMzEsIDQ0LCAxMDIsIDIzLCAzNCwgIDg1LCAxMiwgMjQsICA3MCwgIDAsIDEyLCAgNTIsICAwLCAgMCwgIDI4LCAgMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDE1MCwgNDYsIDUxLCAxMzMsIDQwLCA0MiwgMTE5LCAzMiwgMzUsIDEwMiwgMjQsIDI1LCAgODUsIDEzLCAxNCwgIDcwLCAgMCwgIDEsICA1MiwgIDAsICAwLCAgMjcsICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgNTMsIDE5OCwgMjQ0LCAgNDksIDE3NywgMjE4LCAgNDEsIDE1OCwgMTk1LCAgMzIsIDEzOCwgMTcxLCAgMjIsIDExOCwgMTQ3LCAgMTEsIDk4LCAxMjQsICAgMCwgNzgsIDEwMCwgICAwLCA1NCwgNzEsICAgMCwgMTgsIDM0LAotICAgIDY5LCAxOTYsIDIyMCwgIDY0LCAxNzUsIDE5NiwgIDU0LCAxNTcsIDE3NiwgIDQ1LCAxMzcsIDE1NCwgIDMyLCAxMTcsIDEzMywgIDE5LCA5OCwgMTExLCAgIDAsIDc4LCA4OSwgICAwLCA1MywgNjMsICAgMCwgMTcsIDI3LAotICAgIDgwLCAxOTUsIDE5OCwgIDY5LCAxNzUsIDE3OSwgIDYwLCAxNTYsIDE1OSwgIDUwLCAxMzYsIDEzOSwgIDM4LCAxMTYsIDEyMCwgIDI1LCA5OCwgMTAxLCAgIDQsIDc3LCA4MCwgICAwLCA1MywgNTUsICAgMCwgMTcsIDIxLAotICAgIDg0LCAxOTMsIDE3NywgIDc1LCAxNzMsIDE1OSwgIDY0LCAxNTUsIDE0MiwgIDU1LCAxMzUsIDEyNCwgIDQxLCAxMTYsIDEwNywgIDI3LCA5NywgODksICAgOSwgNzYsIDcwLCAgIDAsIDUzLCA0NywgICAwLCAxNywgMTEsCi0gICAgODksIDE5MywgMTU3LCAgNzksIDE3MiwgMTQwLCAgNzAsIDE1NCwgMTI1LCAgNTcsIDEzNCwgMTA5LCAgNDQsIDExNSwgOTIsICAzMiwgOTYsIDc2LCAgMTMsIDc2LCA1OSwgICAwLCA1MiwgMzksICAgMCwgMTYsICA0LAotICAgIDk0LCAxOTEsIDEzNSwgIDg1LCAxNzEsIDEyMSwgIDcyLCAxNTIsIDEwOCwgIDYwLCAxMzMsIDk0LCAgNDcsIDExNCwgODAsICAzMiwgOTUsIDY1LCAgMTUsIDc2LCA0OSwgICAwLCA1MiwgMjksICAgMCwgMTYsICAwLAotICAgIDk4LCAxOTAsIDExMywgIDg3LCAxNzAsIDEwMCwgIDc2LCAxNTIsIDg5LCAgNjIsIDEzMiwgNzcsICA0OSwgMTEzLCA2NSwgIDM1LCA5NSwgNTIsICAxOCwgNzUsIDM3LCAgIDAsIDUyLCAxOCwgICAwLCAxNSwgIDAsCi0gICAgMTAzLCAxOTAsIDg5LCAgOTAsIDE2OSwgODAsICA3OCwgMTUxLCA3MCwgIDY0LCAxMzIsIDYwLCAgNTEsIDExMywgNDksICAzNywgOTQsIDM4LCAgMjAsIDc1LCAyNSwgICAwLCA1MiwgIDUsICAgMCwgMTUsICAwLAotICAgIDEwNiwgMTg5LCA2OSwgIDkzLCAxNjksIDYxLCAgODAsIDE1MSwgNTMsICA2NiwgMTMxLCA0NSwgIDUyLCAxMTMsIDM2LCAgMzcsIDk0LCAyNSwgIDE5LCA3NCwgMTEsICAgMCwgNTEsICAwLCAgIDAsIDE1LCAgMCwKLSAgICA3NiwgMTc4LCAyMjksICA2OCwgMTU5LCAyMDUsICA2MSwgMTQyLCAxODMsICA1MCwgMTI0LCAxNjAsICA0MCwgMTA2LCAxMzgsICAyOCwgODgsIDExNiwgIDEyLCA2OSwgOTMsICAgMCwgNDUsIDY2LCAgIDAsICA1LCAyOSwKLSAgICA4NiwgMTc3LCAyMDcsICA3OCwgMTU4LCAxODQsICA2NywgMTQyLCAxNjYsICA1NiwgMTIzLCAxNDUsICA0NSwgMTA2LCAxMjUsICAzMSwgODgsIDEwNSwgIDE2LCA2OSwgODMsICAgMCwgNDUsIDU4LCAgIDAsICA2LCAyMiwKLSAgICA5MywgMTc2LCAxODcsICA4MSwgMTU4LCAxNjgsICA3MSwgMTQxLCAxNTAsICA2MSwgMTIzLCAxMzEsICA0NywgMTA1LCAxMTMsICAzNSwgODcsIDk0LCAgMjAsIDY4LCA3NCwgICAwLCA0NSwgNTEsICAgMCwgIDUsIDE2LAotICAgIDk4LCAxNzUsIDE2OCwgIDg0LCAxNTcsIDE1MCwgIDc1LCAxNDAsIDEzNCwgIDYzLCAxMjIsIDExNywgIDUwLCAxMDQsIDEwMCwgIDM3LCA4NywgODMsICAyMSwgNjgsIDY1LCAgIDAsIDQ1LCA0MiwgICAwLCAgNCwgIDcsCi0gICAgMTAwLCAxNzQsIDE0OSwgIDg5LCAxNTUsIDEzMiwgIDc2LCAxMzksIDExNywgIDY1LCAxMjEsIDEwMiwgIDUzLCAxMDQsIDg3LCAgMzksIDg2LCA3MiwgIDIzLCA2NywgNTUsICAgMCwgNDUsIDM0LCAgIDAsICAzLCAgMCwKLSAgICAxMDMsIDE3MywgMTMwLCAgOTIsIDE1NSwgMTE1LCAgODAsIDEzOCwgMTAyLCAgNjgsIDEyMCwgODgsICA1MywgMTAzLCA3NSwgIDQwLCA4NiwgNjEsICAyNCwgNjcsIDQ1LCAgIDAsIDQ1LCAyNSwgICAwLCAgMywgIDAsCi0gICAgMTA3LCAxNzIsIDEwOCwgIDk1LCAxNTQsIDk2LCAgODIsIDEzNywgODUsICA3MCwgMTE5LCA3MywgIDU1LCAxMDIsIDYxLCAgNDIsIDg1LCA0OSwgIDI1LCA2NywgMzQsICAgMCwgNDUsIDE0LCAgIDAsICAzLCAgMCwKLSAgICAxMTAsIDE3MiwgODYsICA5NywgMTUzLCA3NiwgIDg1LCAxMzcsIDY3LCAgNzAsIDExOSwgNTcsICA1NiwgMTAyLCA0NiwgIDQyLCA4NCwgMzUsICAyNiwgNjYsIDIxLCAgIDAsIDQ0LCAgMSwgICAwLCAgMywgIDAsCi0gICAgMTEyLCAxNzEsIDY3LCAgOTgsIDE1MywgNTksICA4NiwgMTM3LCA1MiwgIDcxLCAxMTksIDQ0LCAgNTgsIDEwMiwgMzQsICA0NCwgODUsIDIyLCAgMjcsIDY2LCAgNywgICAwLCA0NCwgIDAsICAgMCwgIDMsICAwLAotICAgIDkwLCAxNjAsIDIxNSwgIDgxLCAxNDQsIDE5MywgIDcwLCAxMjksIDE3MywgIDYxLCAxMTIsIDE1MSwgIDQ5LCA5NSwgMTMxLCAgMzcsIDc5LCAxMDksICAyMiwgNjEsIDg3LCAgIDAsIDM4LCA2MSwgICAwLCAgMCwgMjUsCi0gICAgOTYsIDE2MCwgMTk0LCAgODYsIDE0MywgMTc0LCAgNzUsIDEyOCwgMTU3LCAgNjUsIDExMiwgMTM3LCAgNTMsIDk1LCAxMTcsICA0MCwgNzgsIDk4LCAgMjUsIDYwLCA3OCwgICAwLCAzOCwgNTMsICAgMCwgIDAsIDE3LAotICAgIDEwMCwgMTU5LCAxNzcsICA4OSwgMTQzLCAxNTksICA3OSwgMTI4LCAxNDMsICA2NywgMTExLCAxMjQsICA1NSwgOTUsIDEwNywgIDQyLCA3OCwgODksICAyNywgNjAsIDcwLCAgIDIsIDM4LCA0NiwgICAwLCAgMCwgIDksCi0gICAgMTA0LCAxNTgsIDE1OSwgIDkyLCAxNDIsIDE0MywgIDgxLCAxMjcsIDEyNywgIDY5LCAxMTAsIDExMCwgIDU2LCA5NCwgOTQsICA0MywgNzgsIDc4LCAgMjgsIDYwLCA2MCwgICAyLCAzOCwgMzgsICAgMCwgIDAsICAxLAotICAgIDEwNywgMTU3LCAxNDAsICA5NCwgMTQxLCAxMjUsICA4MiwgMTI2LCAxMTIsICA3MSwgMTEwLCA5NywgIDU5LCA5NCwgODIsICA0NSwgNzcsIDY3LCAgMjksIDU5LCA1MSwgICA0LCAzNywgMzAsICAgMCwgIDAsICAwLAotICAgIDExMCwgMTU2LCAxMjIsICA5NywgMTQwLCAxMDksICA4NSwgMTI1LCA5NywgIDcyLCAxMDksIDgzLCAgNTgsIDkzLCA3MSwgIDQ1LCA3NywgNTcsICAyOSwgNjAsIDQyLCAgIDUsIDM4LCAyMiwgICAwLCAgMCwgIDAsCi0gICAgMTExLCAxNTYsIDEwMywgIDk5LCAxMzksIDkxLCAgODcsIDEyNSwgODEsICA3MywgMTA4LCA2OSwgIDYwLCA5MiwgNTgsICA0NiwgNzcsIDQ1LCAgMzAsIDU5LCAzMSwgICA1LCAzOCwgMTIsICAgMCwgIDAsICAwLAotICAgIDExNSwgMTU2LCA4MiwgMTAxLCAxNDAsIDczLCAgODgsIDEyNCwgNjMsICA3NCwgMTA4LCA1MywgIDYwLCA5MiwgNDQsICA0NiwgNzYsIDMyLCAgMzEsIDU5LCAxOCwgICA2LCAzNywgIDAsICAgMCwgIDAsICAwLAotICAgIDExNiwgMTU1LCA2NSwgMTAyLCAxMzksIDU4LCAgODksIDEyNCwgNDksICA3NSwgMTA4LCA0MSwgIDYxLCA5MiwgMzIsICA0OCwgNzYsIDIxLCAgMzEsIDU5LCAgNiwgICA1LCAzNywgIDAsICAgMCwgIDAsICAwLAotICAgIDEwMCwgMTQxLCAyMDEsICA4OCwgMTI3LCAxODEsICA3OSwgMTE0LCAxNjIsICA2OSwgOTksIDE0MiwgIDU3LCA4MywgMTIyLCAgNDQsIDY4LCAxMDIsICAzMCwgNTEsIDgxLCAgIDcsIDI4LCA1NiwgICAwLCAgMCwgMTksCi0gICAgMTA1LCAxNDEsIDE4MiwgIDk0LCAxMjcsIDE2MywgIDgzLCAxMTQsIDE0NiwgIDcxLCA5OCwgMTI4LCAgNTksIDgzLCAxMTAsICA0NiwgNjgsIDkxLCAgMzEsIDUxLCA3MiwgIDEwLCAyOCwgNDgsICAgMCwgIDAsIDExLAotICAgIDEwOCwgMTQxLCAxNjYsICA5NiwgMTI3LCAxNDksICA4NSwgMTEzLCAxMzMsICA3MywgOTgsIDExNiwgIDYwLCA4MywgOTksICA0NiwgNjgsIDgyLCAgMzIsIDUxLCA2NCwgIDExLCAyOSwgNDEsICAgMCwgIDAsICAyLAotICAgIDExMSwgMTQxLCAxNDksICA5OCwgMTI2LCAxMzQsICA4OCwgMTEyLCAxMTksICA3NCwgOTcsIDEwMywgIDYxLCA4MywgODgsICA0OCwgNjcsIDcyLCAgMzMsIDUxLCA1NiwgIDExLCAyOSwgMzQsICAgMCwgIDAsICAwLAotICAgIDExMiwgMTQwLCAxMzIsIDEwMCwgMTI1LCAxMTgsICA4OSwgMTEyLCAxMDUsICA3NSwgOTcsIDkxLCAgNjIsIDgyLCA3NywgIDQ5LCA2OCwgNjIsICAzMywgNTEsIDQ3LCAgMTIsIDI5LCAyNiwgICAwLCAgMCwgIDAsCi0gICAgMTE1LCAxNDAsIDExNiwgMTAyLCAxMjUsIDEwMywgIDkwLCAxMTEsIDkxLCAgNzYsIDk2LCA3OCwgIDYyLCA4MiwgNjUsICA0OSwgNjcsIDUyLCAgMzQsIDUxLCAzOCwgIDEzLCAyOSwgMTgsICAgMCwgIDAsICAwLAotICAgIDExNywgMTM5LCA5NywgMTAzLCAxMjQsIDg3LCAgOTEsIDExMSwgNzcsICA3OCwgOTYsIDY1LCAgNjMsIDgxLCA1NCwgIDQ5LCA2NywgNDEsICAzNCwgNTEsIDI3LCAgMTIsIDI5LCAgNywgICAwLCAgMCwgIDAsCi0gICAgMTE5LCAxMzgsIDc4LCAxMDUsIDEyNCwgNjksICA5MiwgMTEwLCA2MCwgIDc4LCA5NSwgNTAsICA2NSwgODEsIDQwLCAgNTAsIDY3LCAyOSwgIDM0LCA1MSwgMTUsICAxMywgMzAsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxMjAsIDEzOCwgNjQsIDEwNiwgMTI0LCA1NCwgIDkzLCAxMTAsIDQ3LCAgNzgsIDk1LCAzOCwgIDY1LCA4MSwgMjksICA1MCwgNjYsIDE3LCAgMzQsIDUwLCAgMiwgIDEzLCAyOSwgIDAsICAgMCwgIDAsICAwLAotICAgIDEwNywgMTI0LCAxODksICA5NiwgMTExLCAxNjksICA4NSwgOTksIDE1MiwgIDczLCA4NSwgMTMyLCAgNjEsIDcxLCAxMTQsICA0OCwgNTcsIDk1LCAgMzQsIDQxLCA3NSwgIDE0LCAxOCwgNTEsICAgMCwgIDAsIDEzLAotICAgIDExMSwgMTI0LCAxNzEsIDEwMCwgMTExLCAxNTMsICA4OCwgOTksIDEzNywgIDc1LCA4NSwgMTIwLCAgNjMsIDcyLCAxMDMsICA1MCwgNTgsIDg1LCAgMzYsIDQxLCA2NiwgIDE1LCAxOSwgNDMsICAgMCwgIDAsICA0LAotICAgIDExMywgMTI0LCAxNTYsIDEwMSwgMTExLCAxMzksICA5MCwgOTksIDEyNSwgIDc3LCA4NSwgMTA5LCAgNjQsIDcxLCA5MywgIDUxLCA1NywgNzcsICAzNiwgNDIsIDU5LCAgMTcsIDIwLCAzNywgICAwLCAgMCwgIDAsCi0gICAgMTE1LCAxMjQsIDE0MCwgMTAzLCAxMTEsIDEyNSwgIDkwLCA5OSwgMTEyLCAgNzgsIDg1LCA5NywgIDY0LCA3MSwgODIsICA1MiwgNTcsIDY3LCAgMzYsIDQyLCA1MCwgIDE2LCAyMCwgMzAsICAgMCwgIDAsICAwLAotICAgIDExNywgMTIzLCAxMjUsIDEwNCwgMTEwLCAxMTEsICA5MiwgOTgsIDk5LCAgNzksIDg1LCA4NiwgIDY1LCA3MSwgNzIsICA1MSwgNTgsIDU5LCAgMzcsIDQyLCA0MywgIDE3LCAyMSwgMjIsICAgMCwgIDAsICAwLAotICAgIDExOCwgMTIzLCAxMTAsIDEwNSwgMTEwLCA5NywgIDkzLCA5OCwgODYsICA3OCwgODQsIDc0LCAgNjYsIDcxLCA2MiwgIDUyLCA1NywgNDksICAzNywgNDIsIDM0LCAgMTcsIDIyLCAxNCwgICAwLCAgMCwgIDAsCi0gICAgMTIwLCAxMjMsIDkzLCAxMDYsIDEwOSwgODIsICA5NCwgOTcsIDcyLCAgODAsIDg0LCA2MSwgIDY2LCA3MSwgNTAsICA1MiwgNTcsIDM4LCAgMzcsIDQyLCAyNCwgIDE3LCAyMiwgIDIsICAgMCwgIDAsICAwLAotICAgIDEyMSwgMTIyLCA3NSwgMTA4LCAxMDksIDY2LCAgOTUsIDk3LCA1OCwgIDgwLCA4NCwgNDgsICA2NiwgNzEsIDM3LCAgNTIsIDU3LCAyNiwgIDM3LCA0MiwgMTIsICAxNiwgMjIsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxMjIsIDEyMywgNjIsIDEwOCwgMTA5LCA1MiwgIDk1LCA5NywgNDUsICA4MSwgODQsIDM2LCAgNjcsIDcwLCAyNiwgIDUyLCA1NywgMTQsICAzNywgNDIsICAwLCAgMTUsIDIyLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTEzLCAxMDcsIDE3NywgMTAyLCA5NiwgMTU5LCAgODksIDg1LCAxNDEsICA3OCwgNzIsIDEyNCwgIDY1LCA2MCwgMTA3LCAgNTIsIDQ2LCA4OSwgIDM3LCAzMCwgNzAsICAxOCwgIDUsIDQ2LCAgIDAsICAwLCAgNiwKLSAgICAxMTYsIDEwNywgMTYwLCAxMDQsIDk2LCAxNDQsICA5MiwgODUsIDEyOSwgIDgwLCA3MiwgMTEyLCAgNjcsIDYwLCA5NiwgIDUzLCA0NywgODAsICAzOCwgMzEsIDYyLCAgMTksICA3LCAzOSwgICAwLCAgMCwgIDAsCi0gICAgMTE4LCAxMDcsIDE0NywgMTA1LCA5NiwgMTMxLCAgOTMsIDg1LCAxMTgsICA4MCwgNzIsIDEwMSwgIDY3LCA2MCwgODcsICA1NCwgNDcsIDcxLCAgMzksIDMxLCA1NCwgIDE5LCAgOCwgMzIsICAgMCwgIDAsICAwLAotICAgIDExOSwgMTA3LCAxMzIsIDEwNiwgOTYsIDExOCwgIDk0LCA4NSwgMTA2LCAgODEsIDczLCA5MSwgIDY3LCA2MCwgNzcsICA1NCwgNDcsIDYzLCAgMzksIDMyLCA0NywgIDIwLCAgOSwgMjUsICAgMCwgIDAsICAwLAotICAgIDExOSwgMTA3LCAxMTgsIDEwNiwgOTUsIDEwNSwgIDk0LCA4NSwgOTMsICA4MSwgNzIsIDgwLCAgNjgsIDYwLCA2OCwgIDU0LCA0NywgNTQsICAzOSwgMzIsIDM5LCAgMjAsIDExLCAxOCwgICAwLCAgMCwgIDAsCi0gICAgMTIxLCAxMDcsIDEwNCwgMTA3LCA5NiwgOTIsICA5NSwgODQsIDgwLCAgODEsIDcyLCA2OSwgIDY4LCA2MSwgNTgsICA1NCwgNDgsIDQ2LCAgMzksIDMzLCAzMSwgIDIwLCAxMiwgIDksICAgMCwgIDAsICAwLAotICAgIDEyMywgMTA3LCA4OCwgMTA4LCA5NSwgNzcsICA5NiwgODQsIDY4LCAgODIsIDcyLCA1NywgIDY4LCA2MCwgNDYsICA1NCwgNDcsIDM1LCAgMzksIDMzLCAyMCwgIDE5LCAxMywgIDIsICAgMCwgIDAsICAwLAotICAgIDEyMywgMTA2LCA3MiwgMTEwLCA5NSwgNjMsICA5NiwgODQsIDU0LCAgODIsIDcyLCA0NSwgIDY5LCA2MCwgMzUsICA1NSwgNDgsIDIzLCAgMzksIDMzLCAgOSwgIDE4LCAxNCwgIDAsICAgMCwgIDAsICAwLAotICAgIDEyNSwgMTA2LCA2MCwgMTEwLCA5NCwgNTAsICA5OCwgODQsIDQyLCAgODMsIDcyLCAzNCwgIDY5LCA2MCwgMjUsICA1NSwgNDgsIDEyLCAgMzksIDMzLCAgMCwgIDE3LCAxMywgIDAsICAgMCwgIDAsICAwLAotICAgIDExOCwgODksIDE2NSwgMTA1LCA3OSwgMTQ4LCAgOTMsIDY5LCAxMzIsICA4MSwgNTcsIDExNSwgIDY4LCA0NSwgOTksICA1NSwgMzIsIDgyLCAgNDEsIDE1LCA2NCwgIDIxLCAgMCwgNDEsICAgMCwgIDAsICAwLAotICAgIDEyMCwgODksIDE1MCwgMTA3LCA3OSwgMTM1LCAgOTYsIDY5LCAxMjEsICA4MiwgNTgsIDEwNSwgIDcwLCA0NiwgODksICA1NiwgMzQsIDczLCAgNDEsIDE3LCA1NiwgIDIxLCAgMCwgMzQsICAgMCwgIDAsICAwLAotICAgIDEyMSwgODksIDEzNywgMTA4LCA3OSwgMTIzLCAgOTYsIDY5LCAxMDksICA4MiwgNTgsIDk1LCAgNzAsIDQ3LCA4MSwgIDU2LCAzNCwgNjYsICA0MSwgMTgsIDQ5LCAgMjEsICAwLCAyOCwgICAwLCAgMCwgIDAsCi0gICAgMTIyLCA5MCwgMTI0LCAxMDksIDc5LCAxMTAsICA5NiwgNjksIDk5LCAgODMsIDU4LCA4NSwgIDcwLCA0NywgNzIsICA1NiwgMzUsIDU4LCAgNDEsIDE5LCA0MiwgIDIxLCAgMCwgMjIsICAgMCwgIDAsICAwLAotICAgIDEyMywgOTAsIDExMSwgMTEwLCA3OSwgOTgsICA5NywgNjksIDg3LCAgODMsIDU5LCA3NSwgIDcwLCA0NywgNjMsICA1NiwgMzUsIDUwLCAgNDEsIDIwLCAzNSwgIDIxLCAgMCwgMTQsICAgMCwgIDAsICAwLAotICAgIDEyMywgOTAsIDk4LCAxMTAsIDc5LCA4NywgIDk3LCA3MCwgNzYsICA4NCwgNTgsIDY0LCAgNzAsIDQ4LCA1MywgIDU2LCAzNiwgNDEsICA0MCwgMjEsIDI2LCAgMjEsICAwLCAgNSwgICAwLCAgMCwgIDAsCi0gICAgMTI1LCA4OSwgODQsIDExMSwgNzksIDczLCAgOTcsIDY5LCA2NCwgIDg0LCA1OSwgNTQsICA3MCwgNDgsIDQzLCAgNTYsIDM2LCAzMSwgIDQwLCAyMiwgMTcsICAyMCwgIDEsICAxLCAgIDAsICAwLCAgMCwKLSAgICAxMjUsIDg5LCA2OSwgMTEyLCA3OSwgNjAsICA5OCwgNzAsIDUxLCAgODQsIDU5LCA0MiwgIDcwLCA0OCwgMzIsICA1NiwgMzYsIDIwLCAgNDEsIDIyLCAgNSwgIDE5LCAgMiwgIDAsICAgMCwgIDAsICAwLAotICAgIDEyNiwgODksIDU3LCAxMTIsIDc5LCA0OSwgIDk5LCA3MCwgNDEsICA4NCwgNTksIDMyLCAgNzAsIDQ4LCAyMiwgIDU2LCAzNiwgMTAsICA0MCwgMjIsICAwLCAgMTgsICAyLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTIxLCA2NywgMTU0LCAxMDgsIDU4LCAxMzgsICA5NywgNTAsIDEyNCwgIDg0LCAzOSwgMTA3LCAgNzEsIDI4LCA5MiwgIDU4LCAxMiwgNzYsICA0MywgIDAsIDU5LCAgMjAsICAwLCAzNywgICAwLCAgMCwgIDAsCi0gICAgMTI0LCA2OCwgMTQwLCAxMTEsIDU5LCAxMjYsICA5OCwgNTAsIDExMiwgIDg0LCA0MCwgOTgsICA3MSwgMjksIDgzLCAgNTgsIDE1LCA2NywgIDQyLCAgMCwgNTEsICAyMCwgIDAsIDMwLCAgIDAsICAwLCAgMCwKLSAgICAxMjQsIDY4LCAxMjksIDExMSwgNTksIDExNCwgIDk5LCA1MSwgMTAyLCAgODYsIDQxLCA4OCwgIDcxLCAzMCwgNzUsICA1OCwgMTcsIDYwLCAgNDIsICAwLCA0NSwgIDIwLCAgMCwgMjQsICAgMCwgIDAsICAwLAotICAgIDEyNSwgNzAsIDExNiwgMTExLCA2MCwgMTAzLCAgOTksIDUxLCA5MiwgIDg1LCA0MSwgNzksICA3MSwgMzEsIDY2LCAgNTgsIDE5LCA1MywgIDQyLCAgMywgMzgsICAyMCwgIDAsIDE3LCAgIDAsICAwLCAgMCwKLSAgICAxMjUsIDcwLCAxMDQsIDExMSwgNjEsIDkzLCAgOTksIDUyLCA4MSwgIDg1LCA0MywgNjksICA3MiwgMzIsIDU4LCAgNTgsIDIwLCA0NSwgIDQyLCAgNCwgMzEsICAyMCwgIDAsICA4LCAgIDAsICAwLCAgMCwKLSAgICAxMjYsIDcwLCA5MiwgMTExLCA2MSwgODEsICA5OSwgNTIsIDcxLCAgODUsIDQyLCA2MCwgIDcxLCAzMywgNDksICA1NywgMjEsIDM3LCAgNDIsICA2LCAyMywgIDIwLCAgMCwgIDMsICAgMCwgIDAsICAwLAotICAgIDEyNiwgNzAsIDc5LCAxMTIsIDYxLCA3MCwgIDk5LCA1MywgNjAsICA4NSwgNDMsIDUwLCAgNzEsIDMzLCAzOSwgIDU3LCAyMiwgMjgsICA0MSwgIDcsIDEzLCAgMTksICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTI3LCA3MSwgNjYsIDExMywgNjIsIDU2LCAxMDAsIDUzLCA0OCwgIDg2LCA0NCwgMzksICA3MSwgMzQsIDI5LCAgNTcsIDIzLCAxOCwgIDQxLCAgOCwgIDIsICAxOCwgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxMjgsIDcwLCA1NSwgMTE0LCA2MiwgNDYsIDEwMCwgNTQsIDM5LCAgODYsIDQ0LCAzMCwgIDcxLCAzNCwgMjAsICA1NywgMjMsICA3LCAgNDEsICA5LCAgMCwgIDE4LCAgMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDEyNCwgNDEsIDE0NSwgMTExLCAzMiwgMTI4LCAgOTksIDIzLCAxMTQsICA4NiwgMTAsIDEwMCwgIDczLCAgMCwgODUsICA2MCwgIDAsIDcxLCAgNDMsICAwLCA1NCwgIDE3LCAgMCwgMzIsICAgMCwgIDAsICAwLAotICAgIDEyNiwgNDIsIDEzMSwgMTEzLCAzMywgMTE3LCAxMDAsIDI1LCAxMDQsICA4NiwgMTQsIDkwLCAgNzMsICAwLCA3NywgIDYwLCAgMCwgNjMsICA0NCwgIDAsIDQ3LCAgMTgsICAwLCAyNSwgICAwLCAgMCwgIDAsCi0gICAgMTI3LCA0MywgMTIwLCAxMTMsIDM0LCAxMDYsIDEwMSwgMjYsIDk1LCAgODYsIDE3LCA4MiwgIDczLCAgMiwgNjksICA1OSwgIDAsIDU2LCAgNDMsICAwLCA0MSwgIDE4LCAgMCwgMTksICAgMCwgIDAsICAwLAotICAgIDEyNywgNDUsIDEwOSwgMTEzLCAzNywgOTcsIDEwMSwgMjgsIDg1LCAgODYsIDE5LCA3NCwgIDczLCAgNSwgNjEsICA1OSwgIDAsIDQ4LCAgNDMsICAwLCAzNCwgIDE5LCAgMCwgMTEsICAgMCwgIDAsICAwLAotICAgIDEyNywgNDYsIDk4LCAxMTQsIDM4LCA4NiwgMTAwLCAzMCwgNzYsICA4NywgMjEsIDY1LCAgNzMsICA5LCA1NCwgIDU5LCAgMCwgNDEsICA0MywgIDAsIDI2LCAgMTgsICAwLCAgNSwgICAwLCAgMCwgIDAsCi0gICAgMTI3LCA0NywgODcsIDExMywgMzksIDc2LCAxMDEsIDMxLCA2NywgIDg2LCAyMiwgNTYsICA3MiwgMTEsIDQ1LCAgNTksICAwLCAzMywgIDQzLCAgMCwgMTksICAxOCwgIDAsICAyLCAgIDAsICAwLCAgMCwKLSAgICAxMjgsIDQ4LCA3NSwgMTE0LCAzOSwgNjUsIDEwMSwgMzMsIDU2LCAgODYsIDIzLCA0NiwgIDcyLCAxMiwgMzYsICA1OCwgIDAsIDI0LCAgNDIsICAwLCAgOSwgIDE3LCAgMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDEyOSwgNDgsIDYzLCAxMTQsIDQxLCA1NCwgMTAyLCAzMywgNDYsICA4NywgMjQsIDM2LCAgNzIsIDE0LCAyNiwgIDU4LCAgMSwgMTQsICA0MiwgIDAsICAyLCAgMTYsICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTI4LCA0OCwgNTMsIDExNCwgNDEsIDQ0LCAxMDIsIDM0LCAzNywgIDg3LCAyNSwgMjcsICA3MiwgMTUsIDE3LCAgNTgsICAxLCAgMywgIDQxLCAgMCwgIDAsICAxNSwgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICAwLCAxODksIDI0MiwgICAwLCAxNjksIDIxNywgICAwLCAxNTEsIDE5NCwgICAwLCAxMzIsIDE3MCwgICAwLCAxMTMsIDE0NywgICAwLCA5NCwgMTIzLCAgIDAsIDc0LCA5OSwgICAwLCA1MSwgNzEsICAgMCwgMTUsIDM0LAotICAgIDEsIDE4NywgMjE5LCAgIDEsIDE2NywgMTk1LCAgIDAsIDE1MCwgMTc1LCAgIDAsIDEzMSwgMTUzLCAgIDAsIDExMywgMTMyLCAgIDAsIDk0LCAxMTEsICAgMCwgNzQsIDg5LCAgIDAsIDUwLCA2MywgICAwLCAxMywgMjgsCi0gICAgMSwgMTg2LCAxOTgsICAgMSwgMTY3LCAxNzgsICAgMCwgMTQ5LCAxNTgsICAgMCwgMTMwLCAxMzksICAgMCwgMTExLCAxMTksICAgMCwgOTMsIDEwMCwgICAwLCA3NCwgODAsICAgMCwgNTAsIDU1LCAgIDAsIDEzLCAyMiwKLSAgICAxLCAxODUsIDE3NiwgICAxLCAxNjUsIDE1OSwgICAxLCAxNDgsIDE0MiwgICAwLCAxMjksIDEyMywgICAwLCAxMTEsIDEwNiwgICAwLCA5MywgODksICAgMCwgNzMsIDcwLCAgIDAsIDUwLCA0NywgICAwLCAxMywgMTMsCi0gICAgMSwgMTg0LCAxNTcsICAgMSwgMTY0LCAxNDEsICAgMSwgMTQ3LCAxMjUsICAgMCwgMTI4LCAxMTAsICAgMCwgMTEwLCA5MywgICAwLCA5MiwgNzcsICAgMCwgNzMsIDYwLCAgIDAsIDUwLCAzOSwgICAwLCAxMiwgIDUsCi0gICAgMjUsIDE4MiwgMTM3LCAgMjUsIDE2MywgMTIyLCAgMTcsIDE0NiwgMTA5LCAgIDAsIDEyOCwgOTYsICAgMCwgMTEwLCA4MSwgICAwLCA5MiwgNjYsICAgMCwgNzMsIDUxLCAgIDAsIDUwLCAzMCwgICAwLCAxMCwgIDAsCi0gICAgNDIsIDE4MSwgMTE0LCAgMzUsIDE2MywgMTAyLCAgMzAsIDE0NSwgOTEsICAxNCwgMTI3LCA4MCwgICAwLCAxMDksIDY3LCAgIDAsIDkxLCA1MywgICAwLCA3MiwgMzksICAgMCwgNTAsIDE5LCAgIDAsIDEwLCAgMCwKLSAgICA1MiwgMTgxLCA5MiwgIDQzLCAxNjIsIDgzLCAgMzIsIDE0NSwgNzMsICAxOSwgMTI2LCA2MywgICAwLCAxMDgsIDUyLCAgIDAsIDkwLCA0MCwgICAwLCA3MiwgMjcsICAgMCwgNTAsICA3LCAgIDAsIDEwLCAgMCwKLSAgICA1NywgMTgxLCA3NCwgIDQ4LCAxNjIsIDY2LCAgMzcsIDE0NCwgNTcsICAyNCwgMTI2LCA0OSwgICA3LCAxMDgsIDQwLCAgIDAsIDkwLCAyOSwgICAwLCA3MiwgMTUsICAgMCwgNDksICAwLCAgIDAsIDEwLCAgMCwKLSAgICAxLCAxNzAsIDIyNywgICAxLCAxNTIsIDIwMywgICAwLCAxMzYsIDE4MiwgICAwLCAxMTksIDE1OSwgICAwLCAxMDEsIDEzNywgICAwLCA4NCwgMTE1LCAgIDAsIDY1LCA5MiwgICAwLCA0MywgNjYsICAgMCwgIDEsIDI5LAotICAgIDEsIDE2OSwgMjA2LCAgIDEsIDE1MSwgMTg0LCAgIDEsIDEzNiwgMTY1LCAgIDAsIDExOCwgMTQ0LCAgIDAsIDEwMiwgMTI1LCAgIDAsIDg0LCAxMDUsICAgMCwgNjUsIDgzLCAgIDAsIDQzLCA1OCwgICAwLCAgMCwgMjIsCi0gICAgMjksIDE2OCwgMTg2LCAgMjEsIDE1MSwgMTY3LCAgMTQsIDEzNSwgMTUwLCAgIDQsIDExOCwgMTMxLCAgIDAsIDEwMSwgMTEyLCAgIDAsIDgzLCA5NCwgICAwLCA2NSwgNzUsICAgMCwgNDMsIDUxLCAgIDAsICAwLCAxNiwKLSAgICA0MSwgMTY3LCAxNjcsICAzMywgMTUwLCAxNTAsICAzMSwgMTM0LCAxMzQsICAxOSwgMTE3LCAxMTcsICAgNCwgMTAwLCAxMDAsICAgMCwgODMsIDgzLCAgIDAsIDY1LCA2NSwgICAwLCA0MiwgNDMsICAgMCwgIDAsICA4LAotICAgIDQ4LCAxNjcsIDE0OSwgIDQxLCAxNDksIDEzMywgIDMzLCAxMzMsIDExOCwgIDI1LCAxMTYsIDEwMywgIDEzLCA5OSwgODgsICAgMCwgODMsIDczLCAgIDAsIDY1LCA1NiwgICAwLCA0MiwgMzUsICAgMCwgIDAsICAwLAotICAgIDU4LCAxNjUsIDEzMCwgIDQ5LCAxNDgsIDExNSwgIDQyLCAxMzIsIDEwMywgIDMxLCAxMTUsIDg5LCAgMTgsIDk5LCA3NSwgICAwLCA4MiwgNjEsICAgMCwgNjQsIDQ2LCAgIDAsIDQyLCAyNiwgICAwLCAgMCwgIDAsCi0gICAgNjIsIDE2NCwgMTEwLCAgNTUsIDE0NywgOTcsICA0NSwgMTMyLCA4NywgIDM1LCAxMTUsIDc1LCAgMjIsIDk4LCA2MywgICA1LCA4MiwgNTAsICAgMCwgNjQsIDM2LCAgIDAsIDQyLCAxNiwgICAwLCAgMCwgIDAsCi0gICAgNjksIDE2NCwgODksICA2MCwgMTQ3LCA3OCwgIDUwLCAxMzEsIDcwLCAgMzcsIDExNCwgNTksICAyNiwgOTgsIDQ5LCAgMTAsIDgxLCAzNywgICAwLCA2NCwgMjQsICAgMCwgNDIsICA0LCAgIDAsICAwLCAgMCwKLSAgICA3MSwgMTY0LCA3MSwgIDYzLCAxNDcsIDYzLCAgNTMsIDEzMSwgNTUsICA0MCwgMTE0LCA0NywgIDI4LCA5OCwgMzgsICAxMywgODEsIDI2LCAgIDAsIDY0LCAxMiwgICAwLCA0MiwgIDAsICAgMCwgIDAsICAwLAotICAgIDI4LCAxNTMsIDIxNCwgIDI0LCAxMzgsIDE5MywgIDIzLCAxMjMsIDE3MSwgIDE2LCAxMDcsIDE1MCwgICAwLCA5MSwgMTMwLCAgIDAsIDc1LCAxMDksICAgMCwgNTgsIDg3LCAgIDAsIDM1LCA2MSwgICAwLCAgMCwgMjUsCi0gICAgNDgsIDE1MywgMTk0LCAgNDEsIDEzOCwgMTc0LCAgMzQsIDEyMywgMTU2LCAgMjcsIDEwNywgMTM2LCAgMTYsIDkxLCAxMTcsICAgMSwgNzUsIDk4LCAgIDAsIDU3LCA3OCwgICAwLCAzNSwgNTMsICAgMCwgIDAsIDE3LAotICAgIDU1LCAxNTMsIDE3NywgIDQ3LCAxMzcsIDE1OCwgIDQyLCAxMjIsIDE0MiwgIDMzLCAxMDcsIDEyNCwgIDIyLCA5MSwgMTA2LCAgIDYsIDc1LCA4OCwgICAwLCA1NywgNzAsICAgMCwgMzUsIDQ2LCAgIDAsICAwLCAgOSwKLSAgICA2MSwgMTUyLCAxNTgsICA1MywgMTM2LCAxNDMsICA0NSwgMTIyLCAxMjcsICAzNiwgMTA2LCAxMTEsICAyNCwgOTAsIDk0LCAgMTAsIDc0LCA3OCwgICAwLCA1NywgNjEsICAgMCwgMzUsIDM5LCAgIDAsICAwLCAgMiwKLSAgICA2NywgMTUxLCAxNDEsICA1OSwgMTM1LCAxMjYsICA0OSwgMTIxLCAxMTIsICAzOSwgMTA1LCA5OCwgIDI5LCA5MCwgODMsICAxNCwgNzQsIDY4LCAgIDAsIDU3LCA1MiwgICAwLCAzNSwgMzEsICAgMCwgIDAsICAwLAotICAgIDcxLCAxNTAsIDEyMywgIDYyLCAxMzUsIDExMCwgIDU0LCAxMjAsIDk4LCAgNDIsIDEwNSwgODQsICAzMSwgODksIDcxLCAgMTYsIDc0LCA1OCwgICAwLCA1NywgNDMsICAgMCwgMzUsIDIyLCAgIDAsICAwLCAgMCwKLSAgICA3NCwgMTUwLCAxMDUsICA2NCwgMTM0LCA5MiwgIDU1LCAxMjAsIDgzLCAgNDUsIDEwNCwgNzEsICAzNCwgODksIDU5LCAgMjAsIDczLCA0NywgICAwLCA1NywgMzIsICAgMCwgMzUsIDEzLCAgIDAsICAwLCAgMCwKLSAgICA3OCwgMTQ5LCA4NCwgIDY5LCAxMzQsIDc1LCAgNTksIDEyMCwgNjYsICA0NywgMTAzLCA1NiwgIDM0LCA4OCwgNDYsICAyMiwgNzMsIDM0LCAgIDEsIDU3LCAyMCwgICAwLCAzNSwgIDEsICAgMCwgIDAsICAwLAotICAgIDgwLCAxNDksIDY5LCAgNzAsIDEzMywgNjEsICA2MCwgMTE5LCA1MywgIDQ5LCAxMDMsIDQ0LCAgMzYsIDg4LCAzNSwgIDIzLCA3MywgMjQsICAgMiwgNTYsIDEwLCAgIDAsIDM1LCAgMCwgICAwLCAgMCwgIDAsCi0gICAgNTgsIDEzNiwgMjAwLCAgNTAsIDEyMiwgMTgwLCAgNDUsIDEwOSwgMTYyLCAgMzgsIDk0LCAxNDEsICAyNywgODAsIDEyMSwgIDE1LCA2NSwgMTAyLCAgIDAsIDQ4LCA4MSwgICAwLCAyNiwgNTYsICAgMCwgIDAsIDE5LAotICAgIDY2LCAxMzYsIDE4MiwgIDU5LCAxMjIsIDE2MywgIDUyLCAxMDksIDE0NiwgIDQyLCA5NCwgMTI4LCAgMzIsIDgwLCAxMDksICAyMCwgNjUsIDkxLCAgIDIsIDQ4LCA3MiwgICAwLCAyNiwgNDksICAgMCwgIDAsIDExLAotICAgIDcwLCAxMzYsIDE2NSwgIDYyLCAxMjIsIDE0OSwgIDU1LCAxMDgsIDEzMywgIDQ2LCA5NCwgMTE2LCAgMzUsIDgwLCA5OSwgIDIxLCA2NSwgODIsICAgNCwgNDksIDY0LCAgIDAsIDI2LCA0MSwgICAwLCAgMCwgIDMsCi0gICAgNzYsIDEzNSwgMTQ5LCAgNjYsIDEyMSwgMTMzLCAgNTgsIDEwOCwgMTE5LCAgNDgsIDk0LCAxMDMsICAzNiwgNzksIDg4LCAgMjMsIDY1LCA3MywgICA3LCA0OSwgNTYsICAgMCwgMjcsIDM0LCAgIDAsICAwLCAgMCwKLSAgICA3OCwgMTM1LCAxMzMsICA2OSwgMTIwLCAxMTgsICA2MCwgMTA3LCAxMDYsICA1MCwgOTMsIDkyLCAgMzksIDc5LCA3NywgIDI2LCA2NSwgNjMsICAgOCwgNDksIDQ3LCAgIDAsIDI3LCAyNiwgICAwLCAgMCwgIDAsCi0gICAgODIsIDEzNCwgMTE3LCAgNzEsIDEyMCwgMTA0LCAgNjIsIDEwNywgOTIsICA1MSwgOTMsIDc5LCAgMzksIDc4LCA2NiwgIDI3LCA2NCwgNTMsICAxMCwgNDgsIDM5LCAgIDAsIDI3LCAxOCwgICAwLCAgMCwgIDAsCi0gICAgODQsIDEzNCwgOTksICA3MywgMTE5LCA4NywgIDY0LCAxMDYsIDc3LCAgNTMsIDkyLCA2NiwgIDQyLCA3OCwgNTUsICAyOCwgNjQsIDQyLCAgMTEsIDQ4LCAyOSwgICAwLCAyOCwgIDksICAgMCwgIDAsICAwLAotICAgIDg3LCAxMzMsIDgxLCAgNzYsIDExOSwgNzIsICA2NiwgMTA2LCA2MiwgIDU1LCA5MiwgNTIsICA0MywgNzgsIDQyLCAgMjksIDY0LCAzMSwgIDEyLCA0OCwgMTcsICAgMCwgMjgsICAwLCAgIDAsICAwLCAgMCwKLSAgICA4OCwgMTM0LCA2NywgIDc3LCAxMTksIDU4LCAgNjgsIDEwNiwgNTEsICA1NiwgOTIsIDQyLCAgNDQsIDc4LCAzMiwgIDMwLCA2NCwgMjAsICAxMiwgNDgsICA2LCAgIDAsIDI4LCAgMCwgICAwLCAgMCwgIDAsCi0gICAgNzMsIDEyMCwgMTg5LCAgNjQsIDEwNywgMTY4LCAgNTcsIDk2LCAxNTEsICA0NywgODIsIDEzMywgIDM4LCA2OSwgMTE0LCAgMjYsIDU1LCA5NSwgIDExLCAzOSwgNzUsICAgMCwgMTYsIDUxLCAgIDAsICAwLCAxNCwKLSAgICA3OCwgMTIwLCAxNzEsICA2OSwgMTA3LCAxNTMsICA2MiwgOTUsIDEzNywgIDUxLCA4MiwgMTE5LCAgNDAsIDY5LCAxMDIsICAyOSwgNTUsIDg1LCAgMTUsIDM5LCA2NiwgICAwLCAxNywgNDQsICAgMCwgIDAsICA0LAotICAgIDgxLCAxMjAsIDE1NiwgIDcxLCAxMDcsIDE0MCwgIDY0LCA5NSwgMTI1LCAgNTMsIDgyLCAxMDksICA0MiwgNjksIDkzLCAgMzEsIDU1LCA3NywgIDE2LCAzOSwgNTksICAgMCwgMTgsIDM3LCAgIDAsICAwLCAgMCwKLSAgICA4NSwgMTIwLCAxNDEsICA3NCwgMTA3LCAxMjYsICA2NSwgOTUsIDExMiwgIDU0LCA4MiwgOTcsICA0MywgNjksIDgyLCAgMzIsIDU1LCA2NywgIDE3LCAzOSwgNTEsICAgMCwgMTksIDMwLCAgIDAsICAwLCAgMCwKLSAgICA4NiwgMTE5LCAxMjYsICA3NiwgMTA2LCAxMTIsICA2NiwgOTUsIDEwMCwgIDU2LCA4MSwgODUsICA0NSwgNjksIDcyLCAgMzMsIDU1LCA1OSwgIDE4LCA0MCwgNDMsICAgMCwgMTksIDIyLCAgIDAsICAwLCAgMCwKLSAgICA4OSwgMTE5LCAxMTAsICA3OCwgMTA2LCA5OCwgIDY5LCA5NCwgODcsICA1NiwgODEsIDc1LCAgNDYsIDY4LCA2MiwgIDMzLCA1NSwgNDksICAxOCwgNDAsIDM1LCAgIDAsIDIwLCAxNSwgICAwLCAgMCwgIDAsCi0gICAgODksIDExOSwgOTUsICA4MCwgMTA2LCA4MywgIDcwLCA5NCwgNzMsICA1OCwgODEsIDYzLCAgNDYsIDY4LCA1MSwgIDM0LCA1NSwgMzksICAxOSwgNDAsIDI1LCAgIDAsIDIwLCAgNCwgICAwLCAgMCwgIDAsCi0gICAgOTIsIDExOCwgNzgsICA4MiwgMTA2LCA2OCwgIDcwLCA5MywgNTksICA1OSwgODEsIDQ5LCAgNDcsIDY4LCAzOSwgIDM0LCA1NSwgMjgsICAxOSwgNDAsIDE0LCAgIDAsIDIwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgOTMsIDExOCwgNjUsICA4MiwgMTA1LCA1NSwgIDcyLCA5MywgNDgsICA2MCwgODEsIDM5LCAgNDcsIDY4LCAyOSwgIDM0LCA1NSwgMTgsICAyMCwgNDAsICAyLCAgIDAsIDIwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgODMsIDEwNCwgMTc3LCAgNzQsIDkzLCAxNTksICA2NSwgODIsIDE0MiwgIDU2LCA3MCwgMTI0LCAgNDUsIDU3LCAxMDYsICAzMywgNDQsIDg5LCAgMjAsIDI4LCA3MCwgICAxLCAgNCwgNDYsICAgMCwgIDAsICA4LAotICAgIDg2LCAxMDQsIDE2MSwgIDc4LCA5MywgMTQ1LCAgNjgsIDgyLCAxMjgsICA1OCwgNzAsIDExMiwgIDQ4LCA1OCwgOTYsICAzNSwgNDUsIDgwLCAgMjEsIDI5LCA2MiwgICAxLCAgNiwgNDAsICAgMCwgIDAsICAwLAotICAgIDg5LCAxMDQsIDE0NywgIDc5LCA5MywgMTMxLCAgNjksIDgyLCAxMTgsICA1OSwgNzAsIDEwMiwgIDQ3LCA1OCwgODcsICAzNiwgNDUsIDcyLCAgMjMsIDI5LCA1NSwgICAzLCAgNywgMzMsICAgMCwgIDAsICAwLAotICAgIDkwLCAxMDQsIDEzMiwgIDgwLCA5MywgMTE5LCAgNzEsIDgyLCAxMDYsICA2MCwgNzAsIDkxLCAgNDgsIDU4LCA3NywgIDM3LCA0NSwgNjIsICAyMywgMzAsIDQ3LCAgIDQsICA3LCAyNiwgICAwLCAgMCwgIDAsCi0gICAgOTIsIDEwNCwgMTE4LCAgODIsIDkzLCAxMDUsICA3MiwgODIsIDkzLCAgNjEsIDY5LCA4MCwgIDUwLCA1OCwgNjgsICAzNywgNDUsIDU1LCAgMjMsIDMwLCAzOSwgICA0LCAgOCwgMTgsICAgMCwgIDAsICAwLAotICAgIDk0LCAxMDQsIDEwNSwgIDgyLCA5MiwgOTMsICA3MiwgODIsIDgyLCAgNjEsIDcwLCA3MCwgIDUwLCA1OCwgNTgsICAzOCwgNDYsIDQ2LCAgMjMsIDMxLCAzMSwgICA2LCAxMCwgMTEsICAgMCwgIDAsICAwLAotICAgIDk1LCAxMDQsIDkwLCAgODQsIDkyLCA3OSwgIDc0LCA4MiwgNzAsICA2MiwgNzAsIDU4LCAgNTAsIDU4LCA0OCwgIDM3LCA0NiwgMzYsICAyMywgMzEsIDIyLCAgIDQsIDExLCAgMywgICAwLCAgMCwgIDAsCi0gICAgOTYsIDEwMywgNzQsICA4NSwgOTIsIDY1LCAgNzUsIDgxLCA1NiwgIDYzLCA3MCwgNDcsICA1MCwgNTgsIDM3LCAgMzgsIDQ2LCAyNSwgIDI0LCAzMSwgMTEsICAgMywgMTEsICAwLCAgIDAsICAwLCAgMCwKLSAgICA5NywgMTAzLCA2MiwgIDg2LCA5MiwgNTMsICA3NiwgODEsIDQ1LCAgNjMsIDY5LCAzNiwgIDUxLCA1OCwgMjcsICAzOCwgNDYsIDE1LCAgMjMsIDMxLCAgMCwgICAzLCAxMSwgIDAsICAgMCwgIDAsICAwLAotICAgIDkwLCA4NywgMTY1LCAgODEsIDc3LCAxNDgsICA3MiwgNjcsIDEzMiwgIDYyLCA1NSwgMTE2LCAgNTAsIDQ0LCA5OSwgIDM5LCAzMSwgODIsICAyNSwgMTQsIDY0LCAgIDEsICAwLCA0MiwgICAwLCAgMCwgIDEsCi0gICAgOTMsIDg3LCAxNTAsICA4MywgNzcsIDEzNSwgIDc0LCA2NywgMTIxLCAgNjMsIDU2LCAxMDUsICA1MiwgNDUsIDkwLCAgNDAsIDMyLCA3NCwgIDI1LCAxNiwgNTcsICAgMywgIDAsIDM1LCAgIDAsICAwLCAgMCwKLSAgICA5NSwgODcsIDEzOCwgIDg1LCA3NywgMTIzLCAgNzUsIDY3LCAxMDksICA2MywgNTcsIDk1LCAgNTMsIDQ1LCA4MSwgIDQxLCAzMywgNjYsICAyNiwgMTcsIDUwLCAgIDQsICAwLCAyOCwgICAwLCAgMCwgIDAsCi0gICAgOTUsIDg4LCAxMjQsICA4NSwgNzcsIDExMSwgIDc1LCA2NywgOTksICA2MywgNTcsIDg2LCAgNTMsIDQ1LCA3MiwgIDQxLCAzMywgNTgsICAyNiwgMTgsIDQzLCAgIDUsICAxLCAyMiwgICAwLCAgMCwgIDAsCi0gICAgOTcsIDg4LCAxMTIsICA4NywgNzcsIDEwMCwgIDc2LCA2OCwgODgsICA2NCwgNTcsIDc2LCAgNTMsIDQ2LCA2MywgIDQxLCAzNCwgNTAsICAyNiwgMTksIDM1LCAgIDUsICAyLCAxNCwgICAwLCAgMCwgIDAsCi0gICAgOTksIDg3LCA5OSwgIDg3LCA3OCwgODgsICA3NiwgNjgsIDc3LCAgNjUsIDU3LCA2NSwgIDUzLCA0NiwgNTQsICA0MSwgMzUsIDQyLCAgMjcsIDIwLCAyNywgICA2LCAgMiwgIDUsICAgMCwgIDAsICAwLAotICAgIDEwMCwgODcsIDg1LCAgODgsIDc3LCA3NSwgIDc3LCA2OCwgNjUsICA2NSwgNTcsIDU0LCAgNTMsIDQ2LCA0NCwgIDQxLCAzNSwgMzIsICAyNywgMjEsIDE5LCAgIDUsICAzLCAgMiwgICAwLCAgMCwgIDAsCi0gICAgMTAwLCA4OCwgNzEsICA4OSwgNzcsIDYxLCAgNzgsIDY4LCA1MywgIDY2LCA1NywgNDQsICA1MywgNDcsIDMzLCAgNDEsIDM1LCAyMiwgIDI3LCAyMSwgIDcsICAgNSwgIDMsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxMDEsIDg3LCA2MCwgIDkwLCA3NywgNTIsICA3OSwgNjgsIDQ0LCAgNjYsIDU4LCAzNCwgIDUzLCA0NywgMjUsICA0MSwgMzUsIDEzLCAgMjYsIDIyLCAgMCwgICA1LCAgMywgIDAsICAgMCwgIDAsICAwLAotICAgIDk3LCA2NywgMTU1LCAgODYsIDU4LCAxMzgsICA3NywgNTAsIDEyNSwgIDY2LCAzOSwgMTA4LCAgNTUsIDI4LCA5MiwgIDQzLCAxMiwgNzYsICAyOSwgIDAsIDU5LCAgIDIsICAwLCAzNywgICAwLCAgMCwgIDAsCi0gICAgOTksIDY3LCAxNDEsICA4OCwgNTksIDEyNywgIDc4LCA1MCwgMTEzLCAgNjgsIDQwLCA5OCwgIDU2LCAyOSwgODMsICA0NCwgMTUsIDY4LCAgMjksICAwLCA1MiwgICAzLCAgMCwgMzAsICAgMCwgIDAsICAwLAotICAgIDEwMCwgNjgsIDEyOSwgIDg5LCA1OSwgMTE1LCAgODAsIDUxLCAxMDMsICA2OCwgNDEsIDg5LCAgNTYsIDMwLCA3NSwgIDQ0LCAxNiwgNjEsICAzMCwgIDAsIDQ1LCAgIDQsICAwLCAyNCwgICAwLCAgMCwgIDAsCi0gICAgMTAwLCA2OSwgMTE4LCAgOTAsIDYwLCAxMDQsICA4MCwgNTEsIDkyLCAgNjcsIDQxLCA3OSwgIDU2LCAzMSwgNjYsICA0NCwgMTgsIDUzLCAgMjksICAyLCAzOCwgICA0LCAgMCwgMTgsICAgMCwgIDAsICAwLAotICAgIDEwMSwgNjksIDEwNCwgIDkwLCA2MSwgOTMsICA3OSwgNTEsIDgyLCAgNjcsIDQyLCA3MCwgIDU2LCAzMiwgNTksICA0NCwgMjAsIDQ2LCAgMjksICA0LCAzMSwgICA2LCAgMCwgIDksICAgMCwgIDAsICAwLAotICAgIDEwMiwgNjksIDkzLCAgOTAsIDYxLCA4MywgIDgwLCA1MiwgNzIsICA2OCwgNDIsIDYxLCAgNTYsIDMzLCA1MCwgIDQzLCAyMCwgMzgsICAyOSwgIDUsIDIzLCAgIDcsICAwLCAgNCwgICAwLCAgMCwgIDAsCi0gICAgMTAyLCA3MCwgODAsICA5MSwgNjEsIDcxLCAgODAsIDUyLCA2MSwgIDY4LCA0MywgNTEsICA1NiwgMzIsIDQwLCAgNDQsIDIxLCAyOSwgIDMwLCAgNiwgMTQsICAgNywgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxMDMsIDcwLCA2OCwgIDkyLCA2MSwgNTgsICA4MSwgNTMsIDUwLCAgNjksIDQzLCA0MSwgIDU2LCAzNCwgMzEsICA0MywgMjIsIDE5LCAgMjksICA3LCAgMywgICA3LCAgMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDEwNCwgNzAsIDU3LCAgOTIsIDYxLCA0OCwgIDgyLCA1MywgNDAsICA2OSwgNDMsIDMyLCAgNTYsIDM0LCAyMiwgIDQzLCAyMywgMTAsICAyOSwgIDgsICAwLCAgIDYsICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTAxLCA0NSwgMTQ1LCAgOTEsIDM1LCAxMjksICA4MCwgMjYsIDExNiwgIDY5LCAxNSwgMTAxLCAgNTksICAwLCA4NiwgIDQ2LCAgMCwgNzEsICAzMSwgIDAsIDU1LCAgIDAsICAwLCAzMywgICAwLCAgMCwgIDAsCi0gICAgMTA0LCA0NCwgMTMyLCAgOTIsIDM2LCAxMTgsICA4MiwgMjgsIDEwNSwgIDcxLCAxNywgOTEsICA1OCwgIDMsIDc3LCAgNDYsICAwLCA2MywgIDMxLCAgMCwgNDgsICAgMiwgIDAsIDI2LCAgIDAsICAwLCAgMCwKLSAgICAxMDQsIDQ2LCAxMjEsICA5MywgMzcsIDEwNywgIDgyLCAzMCwgOTYsICA3MCwgMjAsIDgzLCAgNTgsICA2LCA3MCwgIDQ2LCAgMCwgNTcsICAzMiwgIDAsIDQxLCAgIDQsICAwLCAyMCwgICAwLCAgMCwgIDAsCi0gICAgMTA0LCA0OCwgMTEwLCAgOTMsIDQwLCA5OCwgIDgyLCAzMSwgODcsICA3MCwgMjIsIDc0LCAgNTksICA5LCA2MiwgIDQ1LCAgMCwgNDksICAzMSwgIDAsIDM1LCAgIDYsICAwLCAxMywgICAwLCAgMCwgIDAsCi0gICAgMTA0LCA0OCwgOTksICA5MiwgNDEsIDg4LCAgODIsIDMyLCA3NywgIDcwLCAyMywgNjUsICA1OCwgMTEsIDU0LCAgNDYsICAwLCA0MiwgIDMyLCAgMCwgMjcsICAgNywgIDAsICA1LCAgIDAsICAwLCAgMCwKLSAgICAxMDUsIDUwLCA4OCwgIDkzLCA0MSwgNzcsICA4MiwgMzQsIDY4LCAgNzEsIDI0LCA1NywgIDU4LCAxMywgNDYsICA0NSwgIDEsIDM1LCAgMzEsICAwLCAyMSwgICA3LCAgMCwgIDIsICAgMCwgIDAsICAwLAotICAgIDEwNSwgNTAsIDc2LCAgOTQsIDQxLCA2NiwgIDgzLCAzNCwgNTcsICA3MSwgMjUsIDQ3LCAgNTgsIDE1LCAzNywgIDQ1LCAgMiwgMjUsICAzMiwgIDAsIDExLCAgIDcsICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMTA2LCA1MCwgNjQsICA5NCwgNDIsIDU1LCAgODMsIDM1LCA0NywgIDcxLCAyNiwgMzgsICA1OCwgMTYsIDI3LCAgNDUsICA0LCAxNywgIDMxLCAgMCwgIDQsICAgNywgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxMDYsIDUxLCA1NCwgIDk1LCA0MiwgNDUsICA4MywgMzUsIDM4LCAgNzEsIDI3LCAzMCwgIDU4LCAxNiwgMTksICA0NSwgIDUsICA3LCAgMzAsICAwLCAgMCwgICA2LCAgMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDAsIDE4MSwgMjQwLCAgIDAsIDE2MiwgMjE2LCAgIDAsIDE0NCwgMTkzLCAgIDAsIDEyNiwgMTY4LCAgIDAsIDEwOSwgMTQ2LCAgIDAsIDkxLCAxMjMsICAgMCwgNzEsIDk4LCAgIDAsIDQ4LCA3MSwgICAwLCAgOSwgMzQsCi0gICAgMCwgMTc5LCAyMTgsICAgMCwgMTYxLCAxOTUsICAgMCwgMTQ0LCAxNzQsICAgMCwgMTI2LCAxNTMsICAgMCwgMTA4LCAxMzIsICAgMCwgOTAsIDExMCwgICAwLCA3MSwgODgsICAgMCwgNDgsIDYzLCAgIDAsICA4LCAyOSwKLSAgICAwLCAxNzgsIDE5NywgICAwLCAxNTksIDE3NywgICAwLCAxNDMsIDE1OSwgICAwLCAxMjUsIDEzOSwgICAwLCAxMDcsIDExOSwgICAwLCA5MCwgOTksICAgMCwgNzEsIDc5LCAgIDAsIDQ4LCA1NSwgICAwLCAgOCwgMjIsCi0gICAgMCwgMTc3LCAxNzcsICAgMCwgMTU4LCAxNTgsICAgMCwgMTQyLCAxNDEsICAgMCwgMTI0LCAxMjMsICAgMCwgMTA3LCAxMDYsICAgMCwgODksIDg4LCAgIDAsIDcxLCA3MCwgICAwLCA0OCwgNDcsICAgMCwgIDgsIDE0LAotICAgIDAsIDE3NiwgMTU3LCAgIDAsIDE1OCwgMTQxLCAgIDAsIDE0MSwgMTI2LCAgIDAsIDEyMywgMTA5LCAgIDAsIDEwNiwgOTMsICAgMCwgODksIDc4LCAgIDAsIDcwLCA2MCwgICAwLCA0NywgMzksICAgMCwgIDcsICA1LAotICAgIDAsIDE3NSwgMTM4LCAgIDAsIDE1NywgMTIzLCAgIDAsIDE0MSwgMTEwLCAgIDAsIDEyMywgOTYsICAgMCwgMTA1LCA4MSwgICAwLCA4OCwgNjcsICAgMCwgNzAsIDUxLCAgIDAsIDQ4LCAzMCwgICAwLCAgNiwgIDAsCi0gICAgMCwgMTczLCAxMTUsICAgMCwgMTU1LCAxMDQsICAgMCwgMTQwLCA5MiwgICAwLCAxMjIsIDgwLCAgIDAsIDEwNSwgNjcsICAgMCwgODgsIDU1LCAgIDAsIDY5LCA0MCwgICAwLCA0NywgMjAsICAgMCwgIDYsICAwLAotICAgIDAsIDE3MywgOTQsICAgMCwgMTU1LCA4NSwgICAwLCAxMzksIDc1LCAgIDAsIDEyMSwgNjQsICAgMCwgMTA0LCA1MywgICAwLCA4OCwgNDIsICAgMCwgNzAsIDI4LCAgIDAsIDQ3LCAgOSwgICAwLCAgNiwgIDAsCi0gICAgMCwgMTczLCA3NiwgICAwLCAxNTUsIDcwLCAgIDAsIDEzOCwgNjEsICAgMCwgMTIyLCA1MywgICAwLCAxMDQsIDQ0LCAgIDAsIDg3LCAzMiwgICAwLCA2OSwgMTgsICAgMCwgNDcsICAwLCAgIDAsICA2LCAgMCwKLSAgICAwLCAxNjQsIDIyNiwgICAwLCAxNDcsIDIwMywgICAwLCAxMzEsIDE4MSwgICAwLCAxMTQsIDE1OCwgICAwLCA5NywgMTM2LCAgIDAsIDgwLCAxMTUsICAgMCwgNjMsIDkyLCAgIDAsIDQwLCA2NSwgICAwLCAgMCwgMzAsCi0gICAgMCwgMTYyLCAyMDUsICAgMCwgMTQ1LCAxODQsICAgMCwgMTMwLCAxNjQsICAgMCwgMTE0LCAxNDMsICAgMCwgOTcsIDEyNCwgICAwLCA4MSwgMTA0LCAgIDAsIDYzLCA4MywgICAwLCA0MCwgNTgsICAgMCwgIDAsIDIzLAotICAgIDAsIDE2MiwgMTg3LCAgIDAsIDE0NSwgMTY3LCAgIDAsIDEzMCwgMTUwLCAgIDAsIDExMywgMTMxLCAgIDAsIDk2LCAxMTIsICAgMCwgODAsIDkzLCAgIDAsIDYyLCA3NCwgICAwLCA0MCwgNTAsICAgMCwgIDAsIDE2LAotICAgIDAsIDE2MCwgMTY3LCAgIDAsIDE0NCwgMTUwLCAgIDAsIDEyOSwgMTM0LCAgIDAsIDExMiwgMTE2LCAgIDAsIDk2LCAxMDAsICAgMCwgODAsIDgyLCAgIDAsIDYyLCA2NSwgICAwLCA0MCwgNDMsICAgMCwgIDAsICA3LAotICAgIDAsIDE2MCwgMTQ4LCAgIDAsIDE0MywgMTMzLCAgIDAsIDEyOCwgMTE4LCAgIDAsIDExMSwgMTAzLCAgIDAsIDk2LCA4OCwgICAwLCA4MCwgNzMsICAgMCwgNjIsIDU2LCAgIDAsIDQwLCAzNSwgICAwLCAgMCwgIDAsCi0gICAgMCwgMTU4LCAxMzAsICAgMCwgMTQyLCAxMTcsICAgMCwgMTI3LCAxMDQsICAgMCwgMTExLCA4OSwgICAwLCA5NSwgNzYsICAgMCwgNzksIDYyLCAgIDAsIDYyLCA0NiwgICAwLCA0MCwgMjYsICAgMCwgIDAsICAwLAotICAgIDAsIDE1OCwgMTExLCAgIDAsIDE0MSwgOTksICAgMCwgMTI3LCA4OCwgICAwLCAxMTEsIDc2LCAgIDAsIDk1LCA2MywgICAwLCA3OSwgNTEsICAgMCwgNjIsIDM3LCAgIDAsIDQwLCAxOCwgICAwLCAgMCwgIDAsCi0gICAgMCwgMTU4LCA5MSwgICAwLCAxNDEsIDgxLCAgIDAsIDEyNiwgNzIsICAgMCwgMTEwLCA2MiwgICAwLCA5NCwgNTAsICAgMCwgNzksIDM5LCAgIDAsIDYyLCAyNSwgICAwLCA0MCwgIDUsICAgMCwgIDAsICAwLAotICAgIDAsIDE1NywgNzQsICAgMCwgMTQxLCA2NiwgICAwLCAxMjYsIDU5LCAgIDAsIDExMCwgNDksICAgMCwgOTQsIDQwLCAgIDAsIDc4LCAyOSwgICAwLCA2MSwgMTUsICAgMCwgNDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICAwLCAxNDgsIDIxNCwgICAwLCAxMzMsIDE5MiwgICAwLCAxMTksIDE3MSwgICAwLCAxMDMsIDE1MCwgICAwLCA4NywgMTI5LCAgIDAsIDcyLCAxMDgsICAgMCwgNTUsIDg2LCAgIDAsIDMyLCA2MSwgICAwLCAgMCwgMjUsCi0gICAgMCwgMTQ3LCAxOTMsICAgMCwgMTMyLCAxNzMsICAgMCwgMTE4LCAxNTUsICAgMCwgMTAzLCAxMzYsICAgMCwgODcsIDExNiwgICAwLCA3MiwgOTgsICAgMCwgNTUsIDc4LCAgIDAsIDMyLCA1MywgICAwLCAgMCwgMTcsCi0gICAgMCwgMTQ3LCAxNzYsICAgMCwgMTMyLCAxNTgsICAgMCwgMTE4LCAxNDIsICAgMCwgMTAyLCAxMjQsICAgMCwgODcsIDEwNiwgICAwLCA3MiwgODgsICAgMCwgNTUsIDY5LCAgIDAsIDMzLCA0NiwgICAwLCAgMCwgIDksCi0gICAgMCwgMTQ2LCAxNTksICAgMCwgMTMxLCAxNDIsICAgMCwgMTE3LCAxMjcsICAgMCwgMTAyLCAxMTEsICAgMCwgODcsIDk1LCAgIDAsIDcxLCA3OSwgICAwLCA1NSwgNjEsICAgMCwgMzMsIDM5LCAgIDAsICAwLCAgMiwKLSAgICAwLCAxNDUsIDE0MCwgICAwLCAxMzAsIDEyNiwgICAwLCAxMTcsIDExMiwgICAwLCAxMDEsIDk4LCAgIDAsIDg2LCA4MywgICAwLCA3MSwgNjgsICAgMCwgNTUsIDUyLCAgIDAsIDMzLCAzMSwgICAwLCAgMCwgIDAsCi0gICAgMCwgMTQ0LCAxMjQsICAgMCwgMTMwLCAxMTEsICAgMCwgMTE2LCA5OSwgICAwLCAxMDEsIDg0LCAgIDAsIDg2LCA3MiwgICAwLCA3MSwgNTksICAgMCwgNTUsIDQzLCAgIDAsIDMzLCAyMywgICAwLCAgMCwgIDAsCi0gICAgMCwgMTQ0LCAxMDYsICAgMCwgMTI5LCA5NCwgICAwLCAxMTUsIDgzLCAgIDAsIDEwMSwgNzIsICAgMCwgODUsIDYwLCAgIDAsIDcxLCA0OCwgICAwLCA1NSwgMzQsICAgMCwgMzMsIDE0LCAgIDAsICAwLCAgMCwKLSAgICAzLCAxNDMsIDg2LCAgIDAsIDEyOSwgNzcsICAgMCwgMTE1LCA2OCwgICAwLCAxMDAsIDU4LCAgIDAsIDg1LCA0OCwgICAwLCA3MCwgMzYsICAgMCwgNTQsIDIyLCAgIDAsIDMzLCAgMywgICAwLCAgMCwgIDAsCi0gICAgMTgsIDE0MywgNzIsICAxMywgMTI4LCA2MywgICAwLCAxMTUsIDU3LCAgIDAsIDEwMCwgNDcsICAgMCwgODUsIDM3LCAgIDAsIDcwLCAyNiwgICAwLCA1NCwgMTMsICAgMCwgMzMsICAwLCAgIDAsICAwLCAgMCwKLSAgICAwLCAxMzIsIDIwMCwgICAwLCAxMTgsIDE3OSwgICAwLCAxMDUsIDE2MSwgICAwLCA5MSwgMTQwLCAgIDAsIDc2LCAxMjEsICAgMCwgNjIsIDEwMSwgICAwLCA0NiwgODEsICAgMCwgMjQsIDU2LCAgIDAsICAwLCAxOSwKLSAgICAwLCAxMzEsIDE4MiwgICAwLCAxMTgsIDE2MywgICAwLCAxMDUsIDE0NiwgICAwLCA5MSwgMTI4LCAgIDAsIDc3LCAxMTAsICAgMCwgNjIsIDkxLCAgIDAsIDQ2LCA3MiwgICAwLCAyNSwgNDgsICAgMCwgIDAsIDExLAotICAgIDAsIDEzMSwgMTY1LCAgIDAsIDExNywgMTQ5LCAgIDAsIDEwNCwgMTMzLCAgIDAsIDkxLCAxMTYsICAgMCwgNzcsIDk5LCAgIDAsIDYyLCA4MiwgICAwLCA0NiwgNjQsICAgMCwgMjUsIDQxLCAgIDAsICAwLCAgNCwKLSAgICAwLCAxMzEsIDE0OSwgICAwLCAxMTYsIDEzNCwgICAwLCAxMDQsIDExOSwgICAwLCA5MSwgMTA0LCAgIDAsIDc3LCA4OSwgICAwLCA2MiwgNzMsICAgMCwgNDYsIDU2LCAgIDAsIDI1LCAzNCwgICAwLCAgMCwgIDAsCi0gICAgMTAsIDEzMCwgMTMzLCAgIDIsIDExNiwgMTE5LCAgIDAsIDEwNCwgMTA2LCAgIDAsIDkwLCA5MSwgICAwLCA3NiwgNzgsICAgMCwgNjIsIDY0LCAgIDAsIDQ2LCA0OCwgICAwLCAyNiwgMjcsICAgMCwgIDAsICAwLAotICAgIDIzLCAxMzAsIDExOCwgIDIwLCAxMTYsIDEwNCwgIDEzLCAxMDMsIDkzLCAgIDMsIDg5LCA3OSwgICAwLCA3NiwgNjcsICAgMCwgNjIsIDU0LCAgIDAsIDQ2LCAzOSwgICAwLCAyNiwgMTksICAgMCwgIDAsICAwLAotICAgIDMzLCAxMjksIDEwMSwgIDI3LCAxMTUsIDg5LCAgMTksIDEwMywgNzksICAgOSwgODksIDY3LCAgIDAsIDc1LCA1NiwgICAwLCA2MSwgNDMsICAgMCwgNDYsIDI5LCAgIDAsIDI2LCAxMCwgICAwLCAgMCwgIDAsCi0gICAgNDEsIDEyOCwgODMsICAzNSwgMTE1LCA3MywgIDI3LCAxMDIsIDY0LCAgMTUsIDg5LCA1NSwgICAwLCA3NiwgNDUsICAgMCwgNjIsIDMzLCAgIDAsIDQ2LCAxOCwgICAwLCAyNiwgIDAsICAgMCwgIDAsICAwLAotICAgIDQzLCAxMjksIDY5LCAgMzgsIDExNSwgNjEsICAzMCwgMTAyLCA1NCwgIDE3LCA4OSwgNDUsICAgMiwgNzUsIDM0LCAgIDAsIDYxLCAyMywgICAwLCA0NiwgIDksICAgMCwgMjYsICAwLCAgIDAsICAwLCAgMCwKLSAgICAxLCAxMTYsIDE4OCwgICAxLCAxMDQsIDE2OCwgICAwLCA5MiwgMTUxLCAgIDAsIDc5LCAxMzIsICAgMCwgNjYsIDExMywgICAwLCA1MiwgOTQsICAgMCwgMzYsIDc1LCAgIDAsIDE0LCA1MiwgICAwLCAgMCwgMTQsCi0gICAgMTcsIDExNiwgMTcxLCAgMTYsIDEwNCwgMTUzLCAgMTQsIDkyLCAxMzcsICAgOCwgNzksIDExOSwgICAwLCA2NywgMTAyLCAgIDAsIDUzLCA4NSwgICAwLCAzNywgNjcsICAgMCwgMTYsIDQ0LCAgIDAsICAwLCAgNCwKLSAgICAzMSwgMTE2LCAxNTUsICAyNywgMTA0LCAxNDAsICAyMSwgOTIsIDEyNSwgIDEzLCA3OSwgMTA5LCAgIDMsIDY2LCA5MywgICAwLCA1MywgNzcsICAgMCwgMzcsIDU5LCAgIDAsIDE2LCAzOCwgICAwLCAgMCwgIDAsCi0gICAgMzcsIDExNSwgMTQxLCAgMzAsIDEwMywgMTI2LCAgMjYsIDkyLCAxMTIsICAxNiwgNzksIDk4LCAgIDUsIDY2LCA4MywgICAwLCA1MywgNjcsICAgMCwgMzgsIDUxLCAgIDAsIDE3LCAzMSwgICAwLCAgMCwgIDAsCi0gICAgNDEsIDExNSwgMTI2LCAgMzcsIDEwMywgMTEyLCAgMzEsIDkyLCAxMDAsICAyMiwgNzksIDg2LCAgMTAsIDY2LCA3MiwgICAwLCA1MywgNTksICAgMCwgMzgsIDQ0LCAgIDAsIDE3LCAyMywgICAwLCAgMCwgIDAsCi0gICAgNDgsIDExNSwgMTExLCAgNDEsIDEwMiwgOTksICAzNCwgOTEsIDg4LCAgMjQsIDc4LCA3NiwgIDE0LCA2NiwgNjMsICAgMCwgNTMsIDUwLCAgIDAsIDM4LCAzNiwgICAwLCAxOCwgMTUsICAgMCwgIDAsICAwLAotICAgIDUxLCAxMTUsIDk1LCAgNDYsIDEwMiwgODUsICAzNywgOTEsIDc0LCAgMjYsIDc4LCA2MywgIDE2LCA2NiwgNTIsICAgMCwgNTMsIDQwLCAgIDAsIDM4LCAyNiwgICAwLCAxOCwgIDUsICAgMCwgIDAsICAwLAotICAgIDU1LCAxMTQsIDgwLCAgNDcsIDEwMiwgNjksICA0MCwgOTAsIDYwLCAgMzAsIDc4LCA1MSwgIDE5LCA2NiwgNDEsICAgMywgNTMsIDI5LCAgIDAsIDM4LCAxNSwgICAwLCAxNywgIDAsICAgMCwgIDAsICAwLAotICAgIDU2LCAxMTQsIDY2LCAgNTAsIDEwMiwgNTgsICA0MCwgOTEsIDUwLCAgMzIsIDc4LCA0MSwgIDE4LCA2NiwgMzIsICAgNCwgNTMsIDIxLCAgIDAsIDM4LCAgNSwgICAwLCAxNywgIDAsICAgMCwgIDAsICAwLAotICAgIDM5LCAxMDIsIDE3OCwgIDM3LCA5MCwgMTU5LCAgMzAsIDc5LCAxNDIsICAyMSwgNjgsIDEyNCwgIDE0LCA1NSwgMTA2LCAgIDAsIDQyLCA4OSwgICAwLCAyNiwgNzAsICAgMCwgIDQsIDQ2LCAgIDAsICAwLCAgOCwKLSAgICA0OCwgMTAyLCAxNjEsICA0MiwgOTAsIDE0NSwgIDM1LCA3OSwgMTI4LCAgMjYsIDY4LCAxMTIsICAxOSwgNTUsIDk2LCAgIDMsIDQzLCA3OSwgICAwLCAyNywgNjIsICAgMCwgIDYsIDQwLCAgIDAsICAwLCAgMCwKLSAgICA1MCwgMTAyLCAxNDcsICA0NCwgOTAsIDEzMiwgIDM3LCA3OSwgMTE4LCAgMzAsIDY4LCAxMDIsICAyMCwgNTYsIDg3LCAgIDcsIDQzLCA3MiwgICAwLCAyOCwgNTUsICAgMCwgIDYsIDM0LCAgIDAsICAwLCAgMCwKLSAgICA1MywgMTAxLCAxMzMsICA0NywgOTAsIDExOCwgIDQxLCA3OSwgMTA2LCAgMzIsIDY4LCA5MSwgIDIxLCA1NiwgNzgsICAgOSwgNDMsIDYzLCAgIDAsIDI4LCA0NywgICAwLCAgNiwgMjYsICAgMCwgIDAsICAwLAotICAgIDU3LCAxMDEsIDExOSwgIDUwLCA4OSwgMTA2LCAgNDIsIDc5LCA5NCwgIDM0LCA2NywgODEsICAyNCwgNTYsIDY4LCAgIDksIDQ0LCA1NSwgICAwLCAyOSwgNDAsICAgMCwgIDYsIDE5LCAgIDAsICAwLCAgMCwKLSAgICA2MCwgMTAwLCAxMDUsICA1MCwgOTAsIDk0LCAgNDUsIDgwLCA4MywgIDM2LCA2OCwgNzEsICAyNCwgNTYsIDU5LCAgMTEsIDQ0LCA0NiwgICAwLCAyOSwgMzIsICAgMCwgIDcsIDEyLCAgIDAsICAwLCAgMCwKLSAgICA2MywgMTAxLCA5MSwgIDU1LCA5MCwgODAsICA0NiwgNzksIDcwLCAgMzcsIDY4LCA1OSwgIDI2LCA1NiwgNDksICAxMiwgNDQsIDM3LCAgIDEsIDI5LCAyMywgICAwLCAgNywgIDMsICAgMCwgIDAsICAwLAotICAgIDY0LCAxMDEsIDc1LCAgNTYsIDg5LCA2NywgIDQ4LCA3OSwgNTcsICAzNywgNjgsIDQ4LCAgMjcsIDU2LCAzNywgIDE1LCA0NCwgMjYsICAgMCwgMjksIDEyLCAgIDAsICA3LCAgMCwgICAwLCAgMCwgIDAsCi0gICAgNjYsIDEwMSwgNjQsICA1OCwgODksIDU1LCAgNDksIDc5LCA0NywgIDM5LCA2OCwgMzgsICAyNywgNTYsIDI5LCAgMTQsIDQ0LCAxOCwgICAxLCAzMCwgIDIsICAgMCwgIDcsICAwLCAgIDAsICAwLCAgMCwKLSAgICA1NywgODYsIDE2NSwgIDUxLCA3NSwgMTQ4LCAgNDUsIDY1LCAxMzMsICAzOCwgNTQsIDExNiwgIDI4LCA0MywgMTAwLCAgMTYsIDI5LCA4MywgICAwLCAxMywgNjQsICAgMCwgIDAsIDQyLCAgIDAsICAwLCAgMywKLSAgICA2MCwgODYsIDE1MSwgIDU1LCA3NSwgMTM1LCAgNDcsIDY2LCAxMjEsICAzOSwgNTUsIDEwNSwgIDMwLCA0NCwgOTAsICAxOCwgMzEsIDc0LCAgIDMsIDE2LCA1NywgICAwLCAgMSwgMzUsICAgMCwgIDAsICAwLAotICAgIDYyLCA4NiwgMTM5LCAgNTYsIDc1LCAxMjMsICA0OSwgNjYsIDExMCwgIDQwLCA1NSwgOTUsICAzMCwgNDQsIDgxLCAgMTksIDMxLCA2NiwgICA0LCAxNywgNTEsICAgMCwgIDEsIDI5LCAgIDAsICAwLCAgMCwKLSAgICA2NSwgODYsIDEyNSwgIDU2LCA3NiwgMTEyLCAgNDksIDY2LCA5OSwgIDM5LCA1NSwgODYsICAzMSwgNDQsIDcyLCAgMTksIDMyLCA1OSwgICA1LCAxOCwgNDQsICAgMCwgIDEsIDIzLCAgIDAsICAwLCAgMCwKLSAgICA2NywgODYsIDExMywgIDU4LCA3NSwgMTAwLCAgNTEsIDY2LCA4OCwgIDQxLCA1NiwgNzcsICAzMSwgNDUsIDY0LCAgMjAsIDMyLCA1MSwgICA2LCAxOCwgMzUsICAgMCwgIDEsIDE0LCAgIDAsICAwLCAgMCwKLSAgICA2OSwgODYsIDk5LCAgNjEsIDc2LCA4OCwgIDUyLCA2NiwgNzgsICA0MywgNTYsIDY2LCAgMzIsIDQ1LCA1NSwgIDIwLCAzMywgNDIsICAgNywgMTksIDI3LCAgIDAsICAxLCAgNiwgICAwLCAgMCwgIDAsCi0gICAgNjksIDg2LCA4NiwgIDYxLCA3NiwgNzUsICA1MywgNjcsIDY2LCAgNDMsIDU2LCA1NSwgIDMzLCA0NSwgNDUsICAyMSwgMzQsIDM0LCAgIDgsIDIwLCAyMCwgICAwLCAgMiwgIDIsICAgMCwgIDAsICAwLAotICAgIDcxLCA4NiwgNzIsICA2MywgNzUsIDYyLCAgNTQsIDY2LCA1NSwgIDQ1LCA1NiwgNDUsICAzMywgNDUsIDM1LCAgMjIsIDM0LCAyMywgICA3LCAyMCwgIDgsICAgMCwgIDIsICAwLCAgIDAsICAwLCAgMCwKLSAgICA3MSwgODYsIDYyLCAgNjQsIDc1LCA1MywgIDU1LCA2NiwgNDYsICA0NSwgNTYsIDM2LCAgMzMsIDQ2LCAyNywgIDIyLCAzNCwgMTUsICAgOCwgMjAsICAwLCAgIDAsICAyLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgNjksIDY3LCAxNTYsICA2MSwgNTgsIDE0MCwgIDUzLCA1MCwgMTI1LCAgNDUsIDM5LCAxMDgsICAzNSwgMjgsIDkzLCAgMjUsIDEyLCA3NywgIDEyLCAgMCwgNTksICAgMCwgIDAsIDM3LCAgIDAsICAwLCAgMCwKLSAgICA3MSwgNjgsIDE0MiwgIDYzLCA1OSwgMTI2LCAgNTYsIDUwLCAxMTQsICA0NywgNDAsIDk4LCAgMzcsIDI4LCA4NCwgIDI2LCAxNSwgNjgsICAxMiwgIDAsIDUzLCAgIDAsICAwLCAzMCwgICAwLCAgMCwgIDAsCi0gICAgNzIsIDY4LCAxMzAsICA2MywgNTksIDExNiwgIDU2LCA1MCwgMTA0LCAgNDcsIDQwLCA5MCwgIDM4LCAzMCwgNzUsICAyNywgMTYsIDYxLCAgMTMsICAwLCA0NiwgICAwLCAgMCwgMjQsICAgMCwgIDAsICAwLAotICAgIDczLCA2OSwgMTE4LCAgNjUsIDU5LCAxMDUsICA1NywgNTEsIDkyLCAgNDcsIDQxLCA4MCwgIDM3LCAzMCwgNjcsICAyNiwgMTgsIDUzLCAgMTQsICAxLCAzOSwgICAwLCAgMCwgMTgsICAgMCwgIDAsICAwLAotICAgIDc0LCA2OSwgMTA2LCAgNjUsIDYwLCA5MywgIDU3LCA1MSwgODIsICA0OCwgNDEsIDcwLCAgMzgsIDMxLCA1OSwgIDI2LCAxOSwgNDYsICAxMywgIDIsIDMyLCAgIDAsICAwLCAxMCwgICAwLCAgMCwgIDAsCi0gICAgNzYsIDY5LCA5NSwgIDY2LCA2MSwgODQsICA1OCwgNTIsIDczLCAgNDgsIDQyLCA2MSwgIDM3LCAzMiwgNTAsICAyNiwgMjAsIDM4LCAgMTQsICA0LCAyNCwgICAwLCAgMCwgIDQsICAgMCwgIDAsICAwLAotICAgIDc2LCA2OSwgODEsICA2OCwgNjAsIDcyLCAgNTgsIDUyLCA2MiwgIDQ4LCA0MiwgNTEsICAzOCwgMzIsIDQxLCAgMjcsIDIxLCAzMCwgIDE0LCAgNCwgMTYsICAgMCwgIDAsICAxLCAgIDAsICAwLCAgMCwKLSAgICA3NiwgNjksIDY4LCAgNjgsIDYxLCA2MCwgIDYwLCA1MiwgNTEsICA0OSwgNDMsIDQxLCAgMzgsIDMzLCAzMiwgIDI3LCAyMSwgMjAsICAxNCwgIDUsICA1LCAgIDAsICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgNzgsIDcwLCA1OSwgIDY5LCA2MSwgNTAsICA2MCwgNTIsIDQyLCAgNDksIDQzLCAzNCwgIDM5LCAzMywgMjQsICAyNywgMjIsIDEzLCAgMTQsICA3LCAgMSwgICAwLCAgMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDc1LCA0NiwgMTQ2LCAgNjgsIDM4LCAxMzEsICA2MCwgMzAsIDExNywgIDUwLCAxOSwgMTAyLCAgNDEsICA0LCA4NywgIDI5LCAgMCwgNzIsICAxMywgIDAsIDU1LCAgIDAsICAwLCAzMywgICAwLCAgMCwgIDAsCi0gICAgNzgsIDQ3LCAxMzIsICA3MCwgMzksIDExOSwgIDYxLCAzMCwgMTA1LCAgNTMsIDIwLCA5MiwgIDQyLCAgNSwgNzgsICAzMCwgIDAsIDY0LCAgMTMsICAwLCA0OSwgICAwLCAgMCwgMjcsICAgMCwgIDAsICAwLAotICAgIDc5LCA0OCwgMTIyLCAgNzAsIDQwLCAxMDgsICA2MiwgMzIsIDk2LCAgNTIsIDIyLCA4NCwgIDQyLCAgOSwgNzEsICAzMCwgIDAsIDU4LCAgMTQsICAwLCA0MiwgICAwLCAgMCwgMjAsICAgMCwgIDAsICAwLAotICAgIDc5LCA1MCwgMTExLCAgNzAsIDQyLCA5OSwgIDYyLCAzMywgODgsICA1MiwgMjMsIDc0LCAgNDEsIDExLCA2MywgIDI5LCAgMCwgNTAsICAxNCwgIDAsIDM2LCAgIDAsICAwLCAxNCwgICAwLCAgMCwgIDAsCi0gICAgODAsIDUwLCA5OSwgIDcwLCA0MiwgODksICA2MSwgMzQsIDc4LCAgNTIsIDI1LCA2NywgIDQxLCAxNCwgNTUsICAzMCwgIDAsIDQyLCAgMTUsICAwLCAyOCwgICAwLCAgMCwgIDYsICAgMCwgIDAsICAwLAotICAgIDgxLCA1MSwgODksICA3MSwgNDMsIDc4LCAgNjIsIDM1LCA2OSwgIDUyLCAyNSwgNTgsICA0MiwgMTUsIDQ3LCAgMzAsICAzLCAzNiwgIDE1LCAgMCwgMjIsICAgMCwgIDAsICAzLCAgIDAsICAwLCAgMCwKLSAgICA4MSwgNTEsIDc3LCAgNzEsIDQ0LCA2OCwgIDYzLCAzNiwgNTksICA1MywgMjYsIDQ5LCAgNDEsIDE2LCAzOCwgIDMxLCAgNCwgMjcsICAxNiwgIDAsIDEyLCAgIDAsICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgODEsIDUyLCA2NSwgIDcyLCA0MywgNTYsICA2MywgMzYsIDQ4LCAgNTMsIDI3LCAzOSwgIDQxLCAxNywgMjksICAzMCwgIDQsIDE4LCAgMTQsICAwLCAgMywgICAwLCAgMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDgxLCA1MiwgNTUsICA3MywgNDQsIDQ3LCAgNjQsIDM2LCAzOSwgIDUzLCAyOCwgMzIsICA0MiwgMTgsIDIxLCAgMzEsICA2LCAgOSwgIDE0LCAgMCwgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICAwLCAxNzQsIDIzOSwgICAwLCAxNTYsIDIxNCwgICAwLCAxMzksIDE5MiwgICAwLCAxMjEsIDE2OCwgICAwLCAxMDUsIDE0NSwgICAwLCA4NywgMTIzLCAgIDAsIDY4LCA5OCwgICAwLCA0NiwgNzAsICAgMCwgIDMsIDM1LAotICAgIDAsIDE3MiwgMjE3LCAgIDAsIDE1NSwgMTk0LCAgIDAsIDEzOSwgMTczLCAgIDAsIDEyMSwgMTUyLCAgIDAsIDEwNCwgMTMwLCAgIDAsIDg3LCAxMTAsICAgMCwgNjksIDg4LCAgIDAsIDQ2LCA2MywgICAwLCAgNCwgMjgsCi0gICAgMCwgMTcxLCAxOTcsICAgMCwgMTUzLCAxNzUsICAgMCwgMTM4LCAxNTgsICAgMCwgMTIxLCAxMzksICAgMCwgMTAzLCAxMTgsICAgMCwgODYsIDEwMCwgICAwLCA2OCwgNzksICAgMCwgNDYsIDU1LCAgIDAsICA0LCAyMiwKLSAgICAwLCAxNzAsIDE3NywgICAwLCAxNTIsIDE1OCwgICAwLCAxMzYsIDE0MSwgICAwLCAxMTksIDEyNCwgICAwLCAxMDMsIDEwNiwgICAwLCA4NiwgODgsICAgMCwgNjgsIDcwLCAgIDAsIDQ1LCA0NywgICAwLCAgMywgMTQsCi0gICAgMCwgMTY5LCAxNTcsICAgMCwgMTUyLCAxNDEsICAgMCwgMTM2LCAxMjYsICAgMCwgMTE5LCAxMDksICAgMCwgMTAyLCA5NCwgICAwLCA4NiwgNzgsICAgMCwgNjgsIDYwLCAgIDAsIDQ2LCAzOSwgICAwLCAgMywgIDUsCi0gICAgMCwgMTY3LCAxMzgsICAgMCwgMTUwLCAxMjQsICAgMCwgMTM1LCAxMTEsICAgMCwgMTE4LCA5NywgICAwLCAxMDIsIDgyLCAgIDAsIDg1LCA2OCwgICAwLCA2OCwgNTIsICAgMCwgNDYsIDMxLCAgIDAsICAzLCAgMCwKLSAgICAwLCAxNjcsIDExOCwgICAwLCAxNTAsIDEwNCwgICAwLCAxMzUsIDk0LCAgIDAsIDExOCwgODEsICAgMCwgMTAxLCA2OSwgICAwLCA4NCwgNTYsICAgMCwgNjcsIDQxLCAgIDAsIDQ1LCAyMSwgICAwLCAgMywgIDAsCi0gICAgMCwgMTY2LCA5NywgICAwLCAxNDksIDg3LCAgIDAsIDEzNCwgNzcsICAgMCwgMTE3LCA2NywgICAwLCAxMDEsIDU2LCAgIDAsIDg1LCA0NCwgICAwLCA2NywgMzAsICAgMCwgNDUsIDEwLCAgIDAsICAzLCAgMCwKLSAgICAwLCAxNjUsIDc5LCAgIDAsIDE0OSwgNzMsICAgMCwgMTMzLCA2NCwgICAwLCAxMTcsIDU2LCAgIDAsIDEwMSwgNDYsICAgMCwgODUsIDM0LCAgIDAsIDY4LCAyMSwgICAwLCA0NiwgIDEsICAgMCwgIDMsICAwLAotICAgIDAsIDE1OCwgMjI1LCAgIDAsIDE0MSwgMjAxLCAgIDAsIDEyNiwgMTgwLCAgIDAsIDEwOSwgMTU4LCAgIDAsIDk0LCAxMzYsICAgMCwgNzgsIDExNCwgICAwLCA2MCwgOTEsICAgMCwgMzgsIDY2LCAgIDAsICAwLCAzMCwKLSAgICAwLCAxNTYsIDIwMywgICAwLCAxNDAsIDE4MywgICAwLCAxMjUsIDE2NCwgICAwLCAxMDksIDE0MywgICAwLCA5NCwgMTI0LCAgIDAsIDc4LCAxMDQsICAgMCwgNjEsIDgzLCAgIDAsIDM4LCA1NywgICAwLCAgMCwgMjMsCi0gICAgMCwgMTU2LCAxODYsICAgMCwgMTQwLCAxNjYsICAgMCwgMTI1LCAxNTAsICAgMCwgMTA5LCAxMzAsICAgMCwgOTMsIDExMSwgICAwLCA3NywgOTMsICAgMCwgNjAsIDc0LCAgIDAsIDM4LCA1MCwgICAwLCAgMCwgMTcsCi0gICAgMCwgMTU1LCAxNjcsICAgMCwgMTM4LCAxNDksICAgMCwgMTI0LCAxMzQsICAgMCwgMTA5LCAxMTcsICAgMCwgOTMsIDEwMCwgICAwLCA3NiwgODMsICAgMCwgNjAsIDY1LCAgIDAsIDM4LCA0MywgICAwLCAgMCwgIDksCi0gICAgMCwgMTUzLCAxNDcsICAgMCwgMTM4LCAxMzQsICAgMCwgMTI0LCAxMjAsICAgMCwgMTA3LCAxMDMsICAgMCwgOTIsIDg4LCAgIDAsIDc3LCA3MywgICAwLCA2MCwgNTYsICAgMCwgMzgsIDM1LCAgIDAsICAwLCAgMCwKLSAgICAwLCAxNTMsIDEzMSwgICAwLCAxMzcsIDExOCwgICAwLCAxMjIsIDEwNSwgICAwLCAxMDcsIDkwLCAgIDAsIDkxLCA3NiwgICAwLCA3NiwgNjMsICAgMCwgNjAsIDQ3LCAgIDAsIDM5LCAyOCwgICAwLCAgMCwgIDAsCi0gICAgMCwgMTUzLCAxMTEsICAgMCwgMTM2LCAxMDAsICAgMCwgMTIzLCA5MCwgICAwLCAxMDcsIDc3LCAgIDAsIDkyLCA2NSwgICAwLCA3NiwgNTIsICAgMCwgNjAsIDM3LCAgIDAsIDM4LCAxOCwgICAwLCAgMCwgIDAsCi0gICAgMCwgMTUyLCA5MywgICAwLCAxMzYsIDgyLCAgIDAsIDEyMiwgNzQsICAgMCwgMTA2LCA2MywgICAwLCA5MSwgNTIsICAgMCwgNzYsIDQwLCAgIDAsIDU5LCAyNiwgICAwLCAzOCwgIDYsICAgMCwgIDAsICAwLAotICAgIDAsIDE1MSwgNzgsICAgMCwgMTM2LCA2OSwgICAwLCAxMjEsIDYxLCAgIDAsIDEwNiwgNTIsICAgMCwgOTEsIDQzLCAgIDAsIDc2LCAzMiwgICAwLCA1OSwgMTcsICAgMCwgMzgsICAwLCAgIDAsICAwLCAgMCwKLSAgICAwLCAxNDMsIDIxMywgICAwLCAxMjgsIDE5MSwgICAwLCAxMTUsIDE3MSwgICAwLCAxMDAsIDE0OSwgICAwLCA4NCwgMTI4LCAgIDAsIDY5LCAxMDgsICAgMCwgNTIsIDg2LCAgIDAsIDMwLCA2MSwgICAwLCAgMCwgMjUsCi0gICAgMCwgMTQyLCAxOTMsICAgMCwgMTI3LCAxNzMsICAgMCwgMTE0LCAxNTQsICAgMCwgOTksIDEzNCwgICAwLCA4NCwgMTE2LCAgIDAsIDY5LCA5OCwgICAwLCA1MiwgNzcsICAgMCwgMzEsIDUzLCAgIDAsICAwLCAxOCwKLSAgICAwLCAxNDEsIDE3NiwgICAwLCAxMjcsIDE1OCwgICAwLCAxMTQsIDE0MSwgICAwLCA5OCwgMTIyLCAgIDAsIDg0LCAxMDUsICAgMCwgNjksIDg4LCAgIDAsIDUzLCA2OSwgICAwLCAzMSwgNDYsICAgMCwgIDAsICA5LAotICAgIDAsIDE0MSwgMTU5LCAgIDAsIDEyNiwgMTQyLCAgIDAsIDExMywgMTI3LCAgIDAsIDk4LCAxMTAsICAgMCwgODMsIDk1LCAgIDAsIDY5LCA3OCwgICAwLCA1MywgNjAsICAgMCwgMzIsIDM5LCAgIDAsICAwLCAgMiwKLSAgICAwLCAxNDAsIDE0MCwgICAwLCAxMjYsIDEyNiwgICAwLCAxMTIsIDExMiwgICAwLCA5OCwgOTgsICAgMCwgODMsIDgzLCAgIDAsIDY4LCA2OSwgICAwLCA1MiwgNTIsICAgMCwgMzEsIDMxLCAgIDAsICAwLCAgMCwKLSAgICAwLCAxNDAsIDEyNCwgICAwLCAxMjUsIDExMiwgICAwLCAxMTIsIDEwMCwgICAwLCA5NywgODYsICAgMCwgODMsIDcyLCAgIDAsIDY4LCA1OSwgICAwLCA1MiwgNDQsICAgMCwgMzEsIDIzLCAgIDAsICAwLCAgMCwKLSAgICAwLCAxMzksIDEwNiwgICAwLCAxMjUsIDk2LCAgIDAsIDExMSwgODUsICAgMCwgOTcsIDcyLCAgIDAsIDgzLCA2MiwgICAwLCA2OCwgNDksICAgMCwgNTIsIDM1LCAgIDAsIDMxLCAxNSwgICAwLCAgMCwgIDAsCi0gICAgMCwgMTM4LCA4OCwgICAwLCAxMjQsIDc5LCAgIDAsIDExMSwgNzAsICAgMCwgOTYsIDU5LCAgIDAsIDgyLCA0OCwgICAwLCA2OCwgMzgsICAgMCwgNTIsIDI0LCAgIDAsIDMxLCAgNCwgICAwLCAgMCwgIDAsCi0gICAgMCwgMTM5LCA3NiwgICAwLCAxMjQsIDY2LCAgIDAsIDExMSwgNTgsICAgMCwgOTYsIDUwLCAgIDAsIDgyLCA0MCwgICAwLCA2OCwgMjksICAgMCwgNTIsIDE1LCAgIDAsIDMxLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMCwgMTI5LCAyMDAsICAgMCwgMTE0LCAxNzksICAgMCwgMTAyLCAxNjAsICAgMCwgODcsIDEzOSwgICAwLCA3NCwgMTIwLCAgIDAsIDYwLCAxMDEsICAgMCwgNDQsIDgxLCAgIDAsIDIyLCA1NiwgICAwLCAgMCwgMTksCi0gICAgMCwgMTI3LCAxODEsICAgMCwgMTE0LCAxNjMsICAgMCwgMTAyLCAxNDYsICAgMCwgODgsIDEyNywgICAwLCA3NCwgMTA5LCAgIDAsIDYwLCA5MSwgICAwLCA0NCwgNzIsICAgMCwgMjMsIDQ4LCAgIDAsICAwLCAxMSwKLSAgICAwLCAxMjcsIDE2NiwgICAwLCAxMTMsIDE0OCwgICAwLCAxMDEsIDEzMywgICAwLCA4NywgMTE1LCAgIDAsIDc0LCA5OSwgICAwLCA2MCwgODIsICAgMCwgNDQsIDY0LCAgIDAsIDIzLCA0MiwgICAwLCAgMCwgIDQsCi0gICAgMCwgMTI3LCAxNTAsICAgMCwgMTEzLCAxMzQsICAgMCwgMTAxLCAxMTksICAgMCwgODcsIDEwNCwgICAwLCA3NCwgODksICAgMCwgNjAsIDczLCAgIDAsIDQ0LCA1NiwgICAwLCAyMywgMzUsICAgMCwgIDAsICAwLAotICAgIDAsIDEyNSwgMTM0LCAgIDAsIDExMiwgMTE4LCAgIDAsIDEwMCwgMTA2LCAgIDAsIDg3LCA5MiwgICAwLCA3MywgNzgsICAgMCwgNjAsIDY0LCAgIDAsIDQ0LCA0OCwgICAwLCAyMywgMjcsICAgMCwgIDAsICAwLAotICAgIDAsIDEyNSwgMTE4LCAgIDAsIDExMiwgMTA1LCAgIDAsIDEwMCwgOTQsICAgMCwgODYsIDgwLCAgIDAsIDczLCA2OCwgICAwLCA2MCwgNTQsICAgMCwgNDQsIDM5LCAgIDAsIDIzLCAyMCwgICAwLCAgMCwgIDAsCi0gICAgMCwgMTI1LCAxMDEsICAgMCwgMTExLCA5MCwgICAwLCA5OSwgODAsICAgMCwgODYsIDY5LCAgIDAsIDczLCA1OCwgICAwLCA1OSwgNDUsICAgMCwgNDQsIDMwLCAgIDAsIDIzLCAxMSwgICAwLCAgMCwgIDAsCi0gICAgMCwgMTI0LCA4NSwgICAwLCAxMTEsIDc1LCAgIDAsIDk5LCA2NiwgICAwLCA4NiwgNTYsICAgMCwgNzMsIDQ1LCAgIDAsIDU5LCAzNCwgICAwLCA0NCwgMjAsICAgMCwgMjMsICAxLCAgIDAsICAwLCAgMCwKLSAgICAwLCAxMjUsIDcyLCAgIDAsIDExMSwgNjIsICAgMCwgOTksIDU2LCAgIDAsIDg2LCA0NiwgICAwLCA3MywgMzYsICAgMCwgNjAsIDI2LCAgIDAsIDQ0LCAxMiwgICAwLCAyMywgIDAsICAgMCwgIDAsICAwLAotICAgIDAsIDExNCwgMTg4LCAgIDAsIDEwMSwgMTY3LCAgIDAsIDg5LCAxNTAsICAgMCwgNzcsIDEzMSwgICAwLCA2NCwgMTEzLCAgIDAsIDUwLCA5NSwgICAwLCAzNCwgNzUsICAgMCwgMTIsIDUyLCAgIDAsICAwLCAxNCwKLSAgICAwLCAxMTMsIDE3MCwgICAwLCAxMDEsIDE1MywgICAwLCA4OSwgMTM3LCAgIDAsIDc3LCAxMjAsICAgMCwgNjQsIDEwMiwgICAwLCA1MCwgODUsICAgMCwgMzUsIDY3LCAgIDAsIDEyLCA0NCwgICAwLCAgMCwgIDQsCi0gICAgMCwgMTEzLCAxNTYsICAgMCwgMTAwLCAxMzksICAgMCwgODksIDEyNSwgICAwLCA3NywgMTA5LCAgIDAsIDY0LCA5MiwgICAwLCA1MSwgNzcsICAgMCwgMzUsIDYwLCAgIDAsIDEyLCAzOCwgICAwLCAgMCwgIDAsCi0gICAgMCwgMTEyLCAxNDEsICAgMCwgMTAwLCAxMjYsICAgMCwgODksIDExMywgICAwLCA3NywgOTgsICAgMCwgNjQsIDgzLCAgIDAsIDUxLCA2OCwgICAwLCAzNSwgNTEsICAgMCwgMTIsIDMwLCAgIDAsICAwLCAgMCwKLSAgICAwLCAxMTIsIDEyNywgICAwLCAxMDAsIDExMiwgICAwLCA4OSwgMTAwLCAgIDAsIDc2LCA4NywgICAwLCA2NCwgNzQsICAgMCwgNTEsIDU5LCAgIDAsIDM1LCA0NCwgICAwLCAxMywgMjQsICAgMCwgIDAsICAwLAotICAgIDAsIDExMiwgMTExLCAgIDAsIDEwMCwgMTAwLCAgIDAsIDg4LCA4OCwgICAwLCA3NiwgNzYsICAgMCwgNjQsIDY0LCAgIDAsIDUxLCA1MiwgICAwLCAzNiwgMzcsICAgMCwgMTMsIDE3LCAgIDAsICAwLCAgMCwKLSAgICAwLCAxMTEsIDk2LCAgIDAsIDk5LCA4NSwgICAwLCA4OCwgNzYsICAgMCwgNzYsIDY0LCAgIDAsIDY0LCA1MywgICAwLCA1MSwgNDEsICAgMCwgMzYsIDI3LCAgIDAsIDEzLCAgNiwgICAwLCAgMCwgIDAsCi0gICAgMCwgMTExLCA4MSwgICAwLCA5OSwgNzEsICAgMCwgODgsIDYyLCAgIDAsIDc2LCA1MiwgICAwLCA2NCwgNDMsICAgMCwgNTEsIDMxLCAgIDAsIDM2LCAxNywgICAwLCAxMywgIDAsICAgMCwgIDAsICAwLAotICAgIDAsIDExMSwgNjksICAgMCwgOTksIDYwLCAgIDAsIDg4LCA1MiwgICAwLCA3NSwgNDMsICAgMCwgNjMsIDM0LCAgIDAsIDUxLCAyMSwgICAwLCAzNiwgIDcsICAgMCwgMTMsICAwLCAgIDAsICAwLCAgMCwKLSAgICAwLCA5OSwgMTc3LCAgIDAsIDg4LCAxNTgsICAgMCwgNzcsIDE0MSwgICAwLCA2NiwgMTIzLCAgIDAsIDUzLCAxMDYsICAgMCwgNDAsIDg5LCAgIDAsIDI1LCA3MSwgICAwLCAgNSwgNDcsICAgMCwgIDAsICA4LAotICAgIDAsIDk5LCAxNjAsICAgMCwgODgsIDE0NCwgICAwLCA3NywgMTI5LCAgIDAsIDY2LCAxMTIsICAgMCwgNTQsIDk3LCAgIDAsIDQxLCA4MCwgICAwLCAyNiwgNjIsICAgMCwgIDUsIDQwLCAgIDAsICAwLCAgMCwKLSAgICAwLCA5OSwgMTQ3LCAgIDAsIDg3LCAxMzIsICAgMCwgNzgsIDExNywgICAwLCA2NiwgMTAyLCAgIDAsIDU0LCA4NywgICAwLCA0MiwgNzIsICAgMCwgMjYsIDU1LCAgIDAsICA1LCAzNCwgICAwLCAgMCwgIDAsCi0gICAgMCwgOTksIDEzNCwgICAwLCA4OCwgMTE5LCAgIDAsIDc3LCAxMDcsICAgMCwgNjYsIDkyLCAgIDAsIDU0LCA3OCwgICAwLCA0MiwgNjQsICAgMCwgMjcsIDQ4LCAgIDAsICA1LCAyNywgICAwLCAgMCwgIDAsCi0gICAgMCwgOTksIDEyMCwgICAwLCA4NywgMTA3LCAgIDAsIDc4LCA5NCwgICAwLCA2NiwgODEsICAgMCwgNTQsIDY4LCAgIDAsIDQyLCA1NSwgICAwLCAyNywgNDAsICAgMCwgIDYsIDIwLCAgIDAsICAwLCAgMCwKLSAgICAwLCA5OCwgMTA1LCAgIDAsIDg3LCA5NCwgICAwLCA3NywgODQsICAgMCwgNjUsIDcxLCAgIDAsIDU1LCA1OSwgICAwLCA0MiwgNDcsICAgMCwgMjgsIDMzLCAgIDAsICA2LCAxMiwgICAwLCAgMCwgIDAsCi0gICAgMCwgOTgsIDkzLCAgIDAsIDg3LCA4MSwgICAwLCA3NywgNzIsICAgMCwgNjYsIDYxLCAgIDAsIDU0LCA0OSwgICAwLCA0MiwgMzcsICAgMCwgMjgsIDI0LCAgIDAsICA2LCAgNCwgICAwLCAgMCwgIDAsCi0gICAgMCwgOTgsIDc3LCAgIDAsIDg3LCA2OCwgICAwLCA3NywgNTksICAgMCwgNjUsIDQ5LCAgIDAsIDU0LCAzOSwgICAwLCA0MiwgMjcsICAgMCwgMjksIDE0LCAgIDAsICA2LCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMSwgOTgsIDY1LCAgIDcsIDg3LCA1NiwgICAwLCA3NywgNDksICAgMCwgNjYsIDQxLCAgIDAsIDU0LCAzMCwgICAwLCA0MiwgMTksICAgMCwgMjksICAzLCAgIDAsICA2LCAgMCwgICAwLCAgMCwgIDAsCi0gICAgMCwgODQsIDE2NiwgICAwLCA3NCwgMTQ5LCAgIDAsIDY0LCAxMzQsICAgMCwgNTMsIDExNywgICAwLCA0MSwgMTAwLCAgIDAsIDI4LCA4MywgICAwLCAxMSwgNjQsICAgMCwgIDAsIDQyLCAgIDAsICAwLCAgMywKLSAgICAwLCA4NCwgMTUxLCAgIDAsIDc0LCAxMzUsICAgMCwgNjQsIDEyMSwgICAwLCA1MywgMTA1LCAgIDAsIDQyLCA5MCwgICAwLCAzMCwgNzUsICAgMCwgMTQsIDU4LCAgIDAsICAwLCAzNiwgICAwLCAgMCwgIDAsCi0gICAgMCwgODQsIDEzOCwgICAwLCA3NCwgMTI0LCAgIDEsIDY0LCAxMTAsICAgMCwgNTQsIDk1LCAgIDAsIDQzLCA4MSwgICAwLCAzMCwgNjcsICAgMCwgMTUsIDUxLCAgIDAsICAxLCAyOSwgICAwLCAgMCwgIDAsCi0gICAgMTQsIDg0LCAxMjYsICAxMiwgNzQsIDExMiwgICAyLCA2NSwgOTksICAgMCwgNTQsIDg1LCAgIDAsIDQ0LCA3MywgICAwLCAzMSwgNTksICAgMCwgMTYsIDQ0LCAgIDAsICAxLCAyMywgICAwLCAgMCwgIDAsCi0gICAgMTYsIDg0LCAxMTMsICAxMywgNzQsIDEwMCwgICA2LCA2NSwgODksICAgMCwgNTQsIDc3LCAgIDAsIDQ0LCA2NSwgICAwLCAzMSwgNTEsICAgMCwgMTcsIDM2LCAgIDAsICAxLCAxNiwgICAwLCAgMCwgIDAsCi0gICAgMjQsIDg0LCAxMDAsICAxOCwgNzQsIDg4LCAgMTMsIDY1LCA3OCwgICAyLCA1NSwgNjgsICAgMCwgNDQsIDU1LCAgIDAsIDMyLCA0MywgICAwLCAxOCwgMjgsICAgMCwgIDEsICA2LCAgIDAsICAwLCAgMCwKLSAgICAyNiwgODQsIDg3LCAgMjQsIDc0LCA3NiwgIDE3LCA2NSwgNjcsICAgNywgNTQsIDU3LCAgIDAsIDQ0LCA0NiwgICAwLCAzMiwgMzUsICAgMCwgMTksIDIxLCAgIDAsICAyLCAgMywgICAwLCAgMCwgIDAsCi0gICAgMzAsIDg0LCA3NCwgIDI4LCA3NCwgNjQsICAyMCwgNjUsIDU1LCAgMTIsIDU1LCA0NiwgICAwLCA0NCwgMzUsICAgMCwgMzIsIDI0LCAgIDAsIDE4LCAgOSwgICAwLCAgMSwgIDAsICAgMCwgIDAsICAwLAotICAgIDMyLCA4NCwgNjMsICAyOCwgNzQsIDU0LCAgMjEsIDY1LCA0NywgIDEzLCA1NCwgMzgsICAgMCwgNDQsIDI4LCAgIDAsIDMyLCAxNiwgICAwLCAxOCwgIDEsICAgMCwgIDEsICAwLCAgIDAsICAwLCAgMCwKLSAgICAzMCwgNjcsIDE1NSwgIDIwLCA1OCwgMTM5LCAgMjAsIDQ5LCAxMjYsICAxMiwgMzksIDExMCwgICAwLCAyNywgOTQsICAgMCwgMTMsIDc3LCAgIDAsICAwLCA2MCwgICAwLCAgMCwgMzcsICAgMCwgIDAsICAwLAotICAgIDM1LCA2NywgMTQyLCAgMzAsIDU4LCAxMjYsICAyMywgNTAsIDExNCwgIDE2LCA0MCwgOTksICAgNywgMjksIDg1LCAgIDAsIDE1LCA2OSwgICAwLCAgMCwgNTIsICAgMCwgIDAsIDMwLCAgIDAsICAwLCAgMCwKLSAgICAzNSwgNjgsIDEzMSwgIDMwLCA1OSwgMTE2LCAgMjcsIDUwLCAxMDQsICAxOCwgNDAsIDkwLCAgIDksIDI5LCA3NiwgICAwLCAxNywgNjIsICAgMCwgIDIsIDQ2LCAgIDAsICAwLCAyNCwgICAwLCAgMCwgIDAsCi0gICAgMzcsIDY5LCAxMTksICAzMywgNTksIDEwNiwgIDI3LCA1MSwgOTQsICAyMSwgNDEsIDgwLCAgIDksIDMwLCA2NywgICAwLCAxOCwgNTQsICAgMCwgIDMsIDM5LCAgIDAsICAwLCAxOCwgICAwLCAgMCwgIDAsCi0gICAgNDAsIDY5LCAxMDcsICAzNiwgNTksIDk0LCAgMjgsIDUxLCA4NCwgIDE4LCA0MSwgNzIsICAxMCwgMzEsIDYwLCAgIDAsIDE5LCA0NywgICAwLCAgNCwgMzIsICAgMCwgIDAsIDEwLCAgIDAsICAwLCAgMCwKLSAgICA0MiwgNjksIDk1LCAgMzYsIDU5LCA4NCwgIDI5LCA1MSwgNzQsICAxOSwgNDEsIDYzLCAgMTAsIDMxLCA1MiwgICAwLCAyMCwgMzksICAgMCwgIDQsIDI1LCAgIDAsICAwLCAgNCwgICAwLCAgMCwgIDAsCi0gICAgNDMsIDY5LCA4MywgIDM4LCA2MCwgNzMsICAzMiwgNTEsIDYyLCAgMjMsIDQyLCA1MywgIDExLCAzMSwgNDIsICAgMCwgMjAsIDMxLCAgIDAsICA1LCAxNywgICAwLCAgMCwgIDEsICAgMCwgIDAsICAwLAotICAgIDQ1LCA2OSwgNzAsICAzOSwgNjAsIDYwLCAgMzMsIDUxLCA1MiwgIDI0LCA0MiwgNDMsICAxMywgMzIsIDMzLCAgIDAsIDIxLCAyMSwgICAwLCAgNSwgIDYsICAgMCwgIDAsICAwLCAgIDAsICAwLCAgMCwKLSAgICA0NywgNjksIDU5LCAgNDEsIDYwLCA1MSwgIDM0LCA1MSwgNDMsICAyNCwgNDIsIDM1LCAgMTIsIDMzLCAyNiwgICAxLCAyMiwgMTQsICAgMCwgIDUsICAxLCAgIDAsICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgNDYsIDQ4LCAxNDYsICA0MiwgNDAsIDEzMSwgIDM2LCAzMiwgMTE4LCAgMjcsIDIyLCAxMDMsICAxNywgIDYsIDg4LCAgIDUsICAwLCA3MywgICAwLCAgMCwgNTUsICAgMCwgIDAsIDMzLCAgIDAsICAwLCAgMCwKLSAgICA0OCwgNDgsIDEzMywgIDQ0LCA0MCwgMTE5LCAgMzcsIDMyLCAxMDcsICAyOCwgMjIsIDkzLCAgMjAsICA4LCA3OSwgICA3LCAgMCwgNjUsICAgMCwgIDAsIDQ5LCAgIDAsICAwLCAyNywgICAwLCAgMCwgIDAsCi0gICAgNDgsIDUwLCAxMjMsICA0NCwgNDEsIDEwOSwgIDM3LCAzMywgOTcsICAzMCwgMjMsIDgzLCAgMjEsIDExLCA3MSwgICA4LCAgMCwgNTgsICAgMCwgIDAsIDQyLCAgIDAsICAwLCAyMSwgICAwLCAgMCwgIDAsCi0gICAgNDksIDUxLCAxMTEsICA0NSwgNDIsIDk5LCAgMzgsIDM0LCA4NywgIDI5LCAyNSwgNzUsICAyMCwgMTMsIDYzLCAgIDgsICAwLCA1MSwgICAwLCAgMCwgMzYsICAgMCwgIDAsIDE0LCAgIDAsICAwLCAgMCwKLSAgICA1MiwgNTIsIDEwMCwgIDQ0LCA0MywgODksICAzOCwgMzUsIDc5LCAgMjksIDI2LCA2OCwgIDE5LCAxNSwgNTYsICAxMCwgIDEsIDQzLCAgIDAsICAwLCAyOCwgICAwLCAgMCwgIDYsICAgMCwgIDAsICAwLAotICAgIDUyLCA1MiwgOTAsICA0NywgNDQsIDc5LCAgMzksIDM2LCA3MCwgIDMwLCAyNywgNTksICAyMCwgMTYsIDQ3LCAgIDksICAyLCAzNiwgICAwLCAgMCwgMjIsICAgMCwgIDAsICAyLCAgIDAsICAwLCAgMCwKLSAgICA1MiwgNTMsIDc4LCAgNDYsIDQ0LCA2OCwgIDM5LCAzNywgNjAsICAzMiwgMjcsIDQ5LCAgMjIsIDE3LCAzOSwgIDEwLCAgMywgMjgsICAgMCwgIDAsIDEyLCAgIDAsICAwLCAgMCwgICAwLCAgMCwgIDAsCi0gICAgNTMsIDUzLCA2NiwgIDQ3LCA0NCwgNTcsICA0MCwgMzYsIDQ4LCAgMzIsIDI3LCAzOSwgIDIyLCAxOCwgMzAsICAgOSwgIDQsIDE4LCAgIDAsICAwLCAgMywgICAwLCAgMCwgIDAsICAgMCwgIDAsICAwLAotICAgIDU0LCA1MywgNTcsICA0OCwgNDUsIDQ5LCAgNDEsIDM3LCA0MSwgIDMzLCAyOCwgMzIsICAyMiwgMTksIDIzLCAgMTEsICA2LCAxMCwgICAxLCAgMCwgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLCAgMCwKK2NvbnN0IHVpbnQ4X3QgZ19DTVlLU2FtcGxlc1s4MSAqIDgxICogM10gPSB7CisgICAgMjU1LCAyNTUsIDI1NSwgMjI1LCAyMjYsIDIyOCwgMTk5LCAyMDAsIDIwMiwgMTczLCAxNzQsIDE3OCwgMTQ3LCAxNDksIDE1MiwKKyAgICAxMjMsIDEyNSwgMTI4LCA5OSwgIDk5LCAgMTAyLCA2OSwgIDcwLCAgNzEsICAzNCwgIDMwLCAgMzEsICAyNTUsIDI1MywgMjI5LAorICAgIDIyNiwgMjI0LCAyMDMsIDIwMCwgMTk5LCAxODIsIDE3MywgMTczLCAxNTgsIDE0OSwgMTQ4LCAxMzUsIDEyNSwgMTI0LCAxMTMsCisgICAgOTksICA5OSwgIDkwLCAgNzAsICA2OSwgIDYzLCAgMzMsICAyOSwgIDI0LCAgMjU1LCAyNTEsIDIwNCwgMjI4LCAyMjMsIDE4MiwKKyAgICAyMDEsIDE5OCwgMTYzLCAxNzQsIDE3MiwgMTQyLCAxNTAsIDE0NywgMTIyLCAxMjUsIDEyMywgMTAxLCA5OSwgIDk4LCAgODAsCisgICAgNzAsICA2OCwgIDU0LCAgMzIsICAyOCwgIDE2LCAgMjU1LCAyNDksIDE3OSwgMjMwLCAyMjIsIDE2MCwgMjAzLCAxOTcsIDE0NCwKKyAgICAxNzQsIDE3MCwgMTI0LCAxNTAsIDE0NSwgMTA1LCAxMjUsIDEyMiwgODgsICA5OSwgIDk3LCAgNjksICA3MCwgIDY4LCAgNDYsCisgICAgMzEsICAyOCwgIDYsICAgMjU1LCAyNDcsIDE1NCwgMjI5LCAyMjAsIDEzOCwgMjAzLCAxOTUsIDEyMiwgMTc2LCAxNjksIDEwNywKKyAgICAxNTAsIDE0NSwgOTEsICAxMjUsIDEyMSwgNzQsICAxMDAsIDk2LCAgNTcsICA3MCwgIDY3LCAgMzUsICAyOSwgIDI2LCAgMCwKKyAgICAyNTUsIDI0NiwgMTI4LCAyMzEsIDIxNywgMTE0LCAyMDUsIDE5NCwgMTAxLCAxNzYsIDE2NywgODgsICAxNTAsIDE0NCwgNzUsCisgICAgMTI1LCAxMjAsIDYwLCAgMTAwLCA5NiwgIDQ0LCAgNzAsICA2NiwgIDI0LCAgMjgsICAyNiwgIDAsICAgMjU1LCAyNDQsIDk2LAorICAgIDIzMSwgMjE3LCA4NywgIDIwMywgMTkyLCA3OCwgIDE3NSwgMTY3LCA2NiwgIDE1MCwgMTQzLCA1NiwgIDEyNSwgMTE5LCA0MywKKyAgICAxMDAsIDk1LCAgMjksICA2OSwgIDY2LCAgNywgICAyNiwgIDI2LCAgMCwgICAyNTUsIDI0MywgNTEsICAyMzIsIDIxNSwgNTEsCisgICAgMjA0LCAxOTEsIDQzLCAgMTc2LCAxNjUsIDM4LCAgMTUwLCAxNDIsIDI4LCAgMTI1LCAxMTgsIDE3LCAgOTksICA5NCwgIDAsCisgICAgNjgsICA2NSwgIDAsICAgMjQsICAyNSwgIDAsICAgMjU1LCAyNDEsIDAsICAgMjMxLCAyMTUsIDAsICAgMjAzLCAxOTAsIDAsCisgICAgMTc2LCAxNjQsIDAsICAgMTUwLCAxNDEsIDAsICAgMTI2LCAxMTcsIDAsICAgOTksICA5MywgIDAsICAgNjgsICA2NSwgIDAsCisgICAgMjQsICAyNSwgIDAsICAgMjUyLCAyMjgsIDIzOCwgMjIyLCAyMDEsIDIxMSwgMTk3LCAxODAsIDE5MCwgMTcxLCAxNTYsIDE2NiwKKyAgICAxNDcsIDEzMywgMTQzLCAxMjMsIDExMSwgMTE5LCA5OSwgIDg4LCAgOTQsICA3MSwgIDYxLCAgNjYsICAzNCwgIDIyLCAgMjYsCisgICAgMjU0LCAyMjYsIDIxMywgMjI0LCAyMDEsIDE5MSwgMTk5LCAxNzksIDE3MSwgMTcyLCAxNTUsIDE0OCwgMTQ3LCAxMzMsIDEyOCwKKyAgICAxMjMsIDExMCwgMTA2LCA5OCwgIDg3LCAgODMsICA3MCwgIDU5LCAgNTcsICAzMywgIDIxLCAgMTgsICAyNTQsIDIyNCwgMTkxLAorICAgIDIyNCwgMTk5LCAxNzIsIDIwMCwgMTc3LCAxNTMsIDE3MywgMTU0LCAxMzMsIDE0NywgMTMyLCAxMTUsIDEyMywgMTA5LCA5NCwKKyAgICA5OCwgIDg2LCAgNzQsICA3MCwgIDU5LCAgNDksICAzMiwgIDIxLCAgOSwgICAyNTUsIDIyMiwgMTY4LCAyMjcsIDE5OCwgMTUwLAorICAgIDIwMCwgMTc1LCAxMzUsIDE3MywgMTUzLCAxMTgsIDE0OCwgMTMwLCA5OSwgIDEyMywgMTA5LCA4MiwgIDk4LCAgODYsICA2NCwKKyAgICA2OSwgIDU4LCAgNDAsICAzMSwgIDE5LCAgMCwgICAyNTUsIDIyMSwgMTQ1LCAyMjcsIDE5NiwgMTI5LCAyMDEsIDE3NCwgMTE1LAorICAgIDE3MywgMTUxLCA5OSwgIDE0OCwgMTI5LCA4NSwgIDEyNCwgMTA4LCA2OSwgIDk4LCAgODUsICA1MiwgIDY5LCAgNTgsICAzMCwKKyAgICAzMCwgIDE5LCAgMCwgICAyNTUsIDIxOSwgMTIxLCAyMjcsIDE5NSwgMTA5LCAyMDEsIDE3NCwgOTcsICAxNzQsIDE1MCwgODMsCisgICAgMTQ4LCAxMjksIDcwLCAgMTI0LCAxMDcsIDU1LCAgOTgsICA4NCwgIDQwLCAgNjksICA1OCwgIDE5LCAgMjgsICAxOCwgIDAsCisgICAgMjU1LCAyMTgsIDkyLCAgMjI5LCAxOTQsIDgyLCAgMjAyLCAxNzMsIDc1LCAgMTc0LCAxNTAsIDYzLCAgMTQ5LCAxMjgsIDUxLAorICAgIDEyNCwgMTA2LCAzOSwgIDk4LCAgODQsICAyNCwgIDY4LCAgNTcsICAzLCAgIDI2LCAgMTgsICAwLCAgIDI1NSwgMjE3LCA1NCwKKyAgICAyMjgsIDE5MywgNTIsICAyMDEsIDE3MiwgNDYsICAxNzQsIDE0OCwgMzYsICAxNDgsIDEyNywgMjcsICAxMjMsIDEwNSwgMTQsCisgICAgOTgsICA4MywgIDAsICAgNjgsICA1NiwgIDAsICAgMjUsICAxOCwgIDAsICAgMjU1LCAyMTYsIDAsICAgMjI5LCAxOTIsIDIsCisgICAgMjAyLCAxNzEsIDQsICAgMTczLCAxNDgsIDAsICAgMTQ4LCAxMjYsIDAsICAgMTI0LCAxMDUsIDAsICAgOTgsICA4MywgIDAsCisgICAgNjgsICA1NiwgIDAsICAgMjQsICAxNywgIDAsICAgMjQ5LCAyMDQsIDIyMywgMjE5LCAxODEsIDE5OSwgMTk1LCAxNjAsIDE3OCwKKyAgICAxNzAsIDE0MCwgMTU2LCAxNDYsIDExOSwgMTM0LCAxMjMsIDk5LCAgMTEyLCA5OCwgIDc3LCAgODgsICA3MCwgIDUyLCAgNjEsCisgICAgMzQsICAxMSwgIDIwLCAgMjUwLCAyMDEsIDIwMCwgMjIxLCAxODAsIDE3OCwgMTk3LCAxNTksIDE2MSwgMTcxLCAxMzksIDEzOSwKKyAgICAxNDcsIDExOSwgMTIwLCAxMjMsIDk4LCAgOTksICA5OCwgIDc3LCAgNzgsICA2OSwgIDUxLCAgNTIsICAzNCwgIDExLCAgMTAsCisgICAgMjUyLCAyMDEsIDE4MCwgMjIzLCAxNzksIDE2MiwgMTk3LCAxNTksIDE0NCwgMTcwLCAxMzgsIDEyNSwgMTQ2LCAxMTcsIDEwNywKKyAgICAxMjIsIDk3LCAgODksICA5OCwgIDc2LCAgNjksICA2OSwgIDUwLCAgNDQsICAzMiwgIDExLCAgMiwgICAyNTIsIDE5OSwgMTU4LAorICAgIDIyMiwgMTc3LCAxNDMsIDE5OSwgMTU4LCAxMjcsIDE3MSwgMTM3LCAxMTAsIDE0NywgMTE3LCA5MywgIDEyMiwgOTYsICA3NiwKKyAgICA5NywgIDc1LCAgNTgsICA2OSwgIDUwLCAgMzYsICAzMiwgIDEwLCAgMCwgICAyNTMsIDE5OCwgMTM3LCAyMjMsIDE3NywgMTIzLAorICAgIDE5OCwgMTU2LCAxMTAsIDE3MSwgMTM2LCA5NSwgIDE0NiwgMTE2LCA4MCwgIDEyMiwgOTYsICA2NSwgIDk3LCAgNzUsICA0NywKKyAgICA2OSwgIDUwLCAgMjUsICAzMCwgIDEwLCAgMCwgICAyNTQsIDE5NywgMTE1LCAyMjUsIDE3NSwgMTA0LCAxOTgsIDE1NiwgOTIsCisgICAgMTcyLCAxMzUsIDc5LCAgMTQ3LCAxMTUsIDY2LCAgMTIzLCA5NSwgIDUyLCAgOTgsICA3NCwgIDM3LCAgNjksICA0OSwgIDE1LAorICAgIDI5LCAgMTAsICAwLCAgIDI1NCwgMTk2LCA4OSwgIDIyNCwgMTc1LCA4MCwgIDE5OSwgMTU0LCA3MCwgIDE3MiwgMTM0LCA1OSwKKyAgICAxNDYsIDExNCwgNDgsICAxMjIsIDk1LCAgMzYsICA5NywgIDc0LCAgMjEsICA2OCwgIDQ5LCAgMCwgICAyNywgIDksICAgMCwKKyAgICAyNTUsIDE5NSwgNTcsICAyMjUsIDE3MywgNTIsICAxOTgsIDE1NCwgNDQsICAxNzIsIDEzMywgMzYsICAxNDcsIDExMywgMjYsCisgICAgMTIzLCA5NCwgIDE0LCAgOTgsICA3NCwgIDAsICAgNjgsICA0OSwgIDAsICAgMjYsICAxMCwgIDAsICAgMjU0LCAxOTQsIDE1LAorICAgIDIyNSwgMTcyLCAxMiwgIDE5OCwgMTUzLCA3LCAgIDE3MiwgMTMyLCAzLCAgIDE0NiwgMTEzLCAwLCAgIDEyMywgOTMsICAwLAorICAgIDk4LCAgNzMsICAwLCAgIDY4LCAgNDksICAwLCAgIDI2LCAgOSwgICAwLCAgIDI0NiwgMTc4LCAyMDksIDIxOCwgMTU5LCAxODYsCisgICAgMTk0LCAxNDAsIDE2NiwgMTY4LCAxMjIsIDE0NSwgMTQ0LCAxMDQsIDEyNSwgMTIxLCA4NSwgIDEwMywgOTcsICA2NSwgIDgxLAorICAgIDY5LCAgNDEsICA1NSwgIDM0LCAgMCwgICAxMiwgIDI0OCwgMTc2LCAxODYsIDIxOSwgMTU3LCAxNjYsIDE5NSwgMTM5LCAxNDksCisgICAgMTY4LCAxMjEsIDEzMCwgMTQ0LCAxMDMsIDExMSwgMTIxLCA4NSwgIDkxLCAgOTcsICA2NSwgIDcxLCAgNjksICA0MSwgIDQ2LAorICAgIDM0LCAgMCwgICA0LCAgIDI0OSwgMTc1LCAxNjgsIDIyMCwgMTU2LCAxNTAsIDE5NiwgMTM5LCAxMzUsIDE2OSwgMTIxLCAxMTYsCisgICAgMTQ0LCAxMDMsIDEwMCwgMTIyLCA4NCwgIDgzLCAgOTgsICA2NSwgIDYzLCAgNzAsICA0MSwgIDM5LCAgMzMsICAwLCAgIDAsCisgICAgMjQ5LCAxNzUsIDE0OCwgMjIwLCAxNTUsIDEzMywgMTk2LCAxMzgsIDExOSwgMTY5LCAxMjAsIDEwMywgMTQ1LCAxMDEsIDg3LAorICAgIDEyMSwgODMsICA3MSwgIDk3LCAgNjUsICA1NCwgIDY5LCAgNDEsICAzMSwgIDMyLCAgMCwgICAwLCAgIDI0OSwgMTczLCAxMjgsCisgICAgMjIyLCAxNTQsIDExNSwgMTk1LCAxMzcsIDEwMiwgMTcwLCAxMTksIDg4LCAgMTQ1LCAxMDEsIDc0LCAgMTIyLCA4MywgIDU5LAorICAgIDk3LCAgNjQsICA0MywgIDY4LCAgNDAsICAyMCwgIDMwLCAgMCwgICAwLCAgIDI1MCwgMTcyLCAxMDgsIDIyMSwgMTU0LCA5OCwKKyAgICAxOTUsIDEzNiwgODYsICAxNzAsIDExOCwgNzMsICAxNDUsIDEwMCwgNjEsICAxMjIsIDgyLCAgNDgsICA5NywgIDYzLCAgMzIsCisgICAgNjksICA0MCwgIDExLCAgMjgsICAwLCAgIDAsICAgMjUwLCAxNzEsIDg1LCAgMjIxLCAxNTMsIDc2LCAgMTk2LCAxMzYsIDY3LAorICAgIDE3MCwgMTE3LCA1NiwgIDE0NSwgOTksICA0NCwgIDEyMSwgODIsICAzMywgIDk3LCAgNjMsICAxNywgIDY4LCAgNDAsICAwLAorICAgIDI4LCAgMCwgICAwLCAgIDI1MSwgMTcxLCA1OCwgIDIyMiwgMTUyLCA1MCwgIDE5NywgMTM1LCA0MywgIDE2OSwgMTE3LCAzNCwKKyAgICAxNDYsIDk5LCAgMjUsICAxMjEsIDgxLCAgMTAsICA5NiwgIDYzLCAgMCwgICA2OCwgIDQwLCAgMCwgICAyNywgIDAsICAgMCwKKyAgICAyNTAsIDE3MCwgMjYsICAyMjIsIDE1MSwgMTksICAxOTYsIDEzNCwgMTMsICAxNjksIDExNiwgNCwgICAxNDUsIDk5LCAgMCwKKyAgICAxMjIsIDgxLCAgMCwgICA5NywgIDYzLCAgMCwgICA2NywgIDQwLCAgMCwgICAyNiwgIDAsICAgMCwgICAyNDQsIDE1MywgMTk0LAorICAgIDIxNSwgMTM2LCAxNzMsIDE5MiwgMTIxLCAxNTUsIDE2NywgMTA0LCAxMzUsIDE0MywgODksICAxMTUsIDEyMSwgNzIsICA5NiwKKyAgICA5NywgIDU0LCAgNzUsICA3MCwgIDMxLCAgNDksICAzNCwgIDAsICAgNiwgICAyNDUsIDE1MywgMTczLCAyMTYsIDEzNiwgMTU1LAorICAgIDE5MiwgMTIwLCAxMzgsIDE2NywgMTA0LCAxMjEsIDE0NCwgODgsICAxMDMsIDEyMSwgNzEsICA4NSwgIDk3LCAgNTQsICA2NiwKKyAgICA2OSwgIDMxLCAgNDIsICAzNCwgIDAsICAgMCwgICAyNDYsIDE1MiwgMTU3LCAyMTcsIDEzNSwgMTQwLCAxOTMsIDEyMCwgMTI2LAorICAgIDE2NywgMTAzLCAxMDksIDE0MywgODgsICA5MiwgIDEyMSwgNzIsICA3NiwgIDk3LCAgNTQsICA1OCwgIDY5LCAgMzEsICAzNSwKKyAgICAzMywgIDAsICAgMCwgICAyNDUsIDE1MCwgMTM5LCAyMTgsIDEzNCwgMTI1LCAxOTMsIDExOSwgMTExLCAxNjcsIDEwMywgOTYsCisgICAgMTQ0LCA4NywgIDgwLCAgMTIxLCA3MSwgIDY2LCAgOTYsICA1MywgIDQ5LCAgNjgsICAzMSwgIDI2LCAgMzIsICAwLCAgIDAsCisgICAgMjQ2LCAxNTEsIDEyMiwgMjE4LCAxMzMsIDEwOCwgMTk0LCAxMTgsIDk2LCAgMTY4LCAxMDIsIDgxLCAgMTQ0LCA4NiwgIDY5LAorICAgIDEyMCwgNzEsICA1NSwgIDk1LCAgNTMsICAzOSwgIDY4LCAgMzAsICAxNywgIDMxLCAgMCwgICAwLCAgIDI0OCwgMTUwLCAxMDMsCisgICAgMjE4LCAxMzMsIDkxLCAgMTkzLCAxMTgsIDgxLCAgMTY4LCAxMDIsIDY5LCAgMTQzLCA4NiwgIDU2LCAgMTIwLCA3MCwgIDQzLAorICAgIDk2LCAgNTMsICAyOCwgIDY4LCAgMzEsICA2LCAgIDI5LCAgMCwgICAwLCAgIDI0NywgMTQ5LCA4MSwgIDIxOCwgMTMyLCA3MiwKKyAgICAxOTQsIDExNywgNjIsICAxNjgsIDEwMSwgNTIsICAxNDQsIDg2LCAgNDIsICAxMjEsIDcwLCAgMjksICA5NiwgIDUyLCAgMTMsCisgICAgNjgsICAzMCwgIDAsICAgMjgsICAwLCAgIDAsICAgMjQ3LCAxNDgsIDU1LCAgMjE5LCAxMzEsIDUwLCAgMTk0LCAxMTcsIDQzLAorICAgIDE2NywgMTAxLCAzMiwgIDE0NCwgODUsICAyMiwgIDEyMCwgNjksICA4LCAgIDk2LCAgNTIsICAwLCAgIDY3LCAgMzAsICAwLAorICAgIDI3LCAgMCwgICAwLCAgIDI0NywgMTQ3LCAyOSwgIDIxOCwgMTMxLCAyNCwgIDE5NCwgMTE2LCAyMCwgIDE2OCwgMTAwLCAxMSwKKyAgICAxNDQsIDg1LCAgMCwgICAxMjAsIDY5LCAgMCwgICA5NiwgIDUyLCAgMCwgICA2NywgIDMwLCAgMCwgICAyNiwgIDAsICAgMCwKKyAgICAyNDIsIDEzMCwgMTc5LCAyMTQsIDExNCwgMTYwLCAxOTAsIDEwMSwgMTQzLCAxNjYsIDg3LCAgMTI1LCAxNDMsIDcyLCAgMTA3LAorICAgIDEyMCwgNTgsICA4OCwgIDk2LCAgNDIsICA2OCwgIDY5LCAgMTcsICA0NCwgIDM1LCAgMCwgICAwLCAgIDI0MywgMTI5LCAxNjEsCisgICAgMjE1LCAxMTQsIDE0MywgMTkxLCAxMDEsIDEyOCwgMTY2LCA4NywgIDExMywgMTQzLCA3MywgIDk2LCAgMTIwLCA1OCwgIDc5LAorICAgIDk2LCAgNDEsICA2MCwgIDY5LCAgMTgsICAzNywgIDMzLCAgMCwgICAwLCAgIDI0MywgMTI5LCAxNDYsIDIxNiwgMTE0LCAxMzAsCisgICAgMTkyLCAxMDEsIDExNywgMTY2LCA4NywgIDEwMSwgMTQzLCA3MiwgIDg2LCAgMTIxLCA1OCwgIDY5LCAgOTYsICA0MiwgIDUyLAorICAgIDY5LCAgMTgsICAyOSwgIDMxLCAgMCwgICAwLCAgIDI0MywgMTI4LCAxMzAsIDIxNiwgMTE0LCAxMTUsIDE5MSwgMTAxLCAxMDIsCisgICAgMTY1LCA4NiwgIDg4LCAgMTQyLCA3MiwgIDc1LCAgMTIwLCA1OCwgIDYwLCAgOTUsICA0MiwgIDQzLCAgNjgsICAxOSwgIDIxLAorICAgIDMwLCAgMCwgICAwLCAgIDI0NCwgMTI3LCAxMTIsIDIxNywgMTEzLCAxMDEsIDE5MiwgOTksICA4OSwgIDE2NiwgODUsICA3NSwKKyAgICAxNDIsIDcyLCAgNjMsICAxMTksIDU3LCAgNTAsICA5NiwgIDQxLCAgMzUsICA2OCwgIDE5LCAgMTMsICAzMCwgIDAsICAgMCwKKyAgICAyNDQsIDEyNywgOTYsICAyMTYsIDExMiwgODYsICAxOTEsIDk5LCAgNzUsICAxNjYsIDg2LCAgNjQsICAxNDMsIDcyLCAgNTIsCisgICAgMTIwLCA1NywgIDQwLCAgOTUsICA0MSwgIDI0LCAgNjcsICAyMCwgIDEsICAgMjksICAwLCAgIDAsICAgMjQ1LCAxMjYsIDc3LAorICAgIDIxNiwgMTEzLCA2OCwgIDE5MSwgMTAwLCA1OSwgIDE2NiwgODUsICA0OSwgIDE0MiwgNzEsICAzOCwgIDExOSwgNTcsICAyNiwKKyAgICA5NSwgIDQxLCAgMTAsICA2NywgIDIwLCAgMCwgICAyOCwgIDAsICAgMCwgICAyNDQsIDEyNiwgNTUsICAyMTYsIDExMiwgNDgsCisgICAgMTkxLCA5OSwgIDQwLCAgMTY2LCA4NSwgIDMxLCAgMTQzLCA3MSwgIDIwLCAgMTE5LCA1NywgIDYsICAgOTUsICA0MiwgIDAsCisgICAgNjcsICAyMCwgIDAsICAgMjgsICAwLCAgIDAsICAgMjQ1LCAxMjYsIDMzLCAgMjE3LCAxMTIsIDI2LCAgMTkyLCA5OSwgIDIyLAorICAgIDE2NiwgODQsICAxMSwgIDE0MiwgNzAsICAwLCAgIDExOSwgNTcsICAwLCAgIDk1LCAgNDEsICAwLCAgIDY2LCAgMjAsICAwLAorICAgIDI3LCAgMCwgICAwLCAgIDI0MSwgMTAyLCAxNjcsIDIxMywgOTAsICAxNDksIDE4OSwgNzksICAxMzMsIDE2NSwgNjYsICAxMTUsCisgICAgMTQxLCA1NCwgIDk4LCAgMTE5LCA0MSwgIDgxLCAgOTYsICAyNSwgIDYzLCAgNjksICAwLCAgIDM4LCAgMzAsICAwLCAgIDAsCisgICAgMjQxLCAxMDIsIDE0OSwgMjEzLCA5MCwgIDEzMywgMTg5LCA3OSwgIDExOSwgMTY1LCA2NiwgIDEwMywgMTQyLCA1NSwgIDg4LAorICAgIDExOSwgNDEsICA3MSwgIDk2LCAgMjUsICA1MywgIDY5LCAgMCwgICAzMSwgIDI4LCAgMCwgICAwLCAgIDI0MSwgMTAyLCAxMzUsCisgICAgMjE0LCA5MCwgIDEyMSwgMTkwLCA3OSwgIDEwOCwgMTY1LCA2NiwgIDkyLCAgMTQxLCA1NSwgIDc4LCAgMTE5LCA0MiwgIDYzLAorICAgIDk2LCAgMjYsICA0NiwgIDY5LCAgMCwgICAyNCwgIDI4LCAgMCwgICAwLCAgIDI0MSwgMTAxLCAxMjAsIDIxNCwgOTAsICAxMDcsCisgICAgMTg5LCA3OSwgIDk1LCAgMTY1LCA2NywgIDgzLCAgMTQxLCA1NCwgIDY4LCAgMTE4LCA0MSwgIDU0LCAgOTUsICAyNywgIDM5LAorICAgIDY4LCAgMCwgICAxNiwgIDI3LCAgMCwgICAwLCAgIDI0MSwgMTAyLCAxMDYsIDIxMywgOTAsICA5MywgIDE4OSwgNzgsICA4MiwKKyAgICAxNjQsIDY3LCAgNzAsICAxNDEsIDU1LCAgNTgsICAxMTgsIDQyLCAgNDUsICA5NCwgIDI3LCAgMjksICA2NywgIDIsICAgNiwKKyAgICAyNywgIDAsICAgMCwgICAyNDIsIDEwMSwgOTAsICAyMTQsIDg5LCAgNzksICAxOTAsIDc5LCAgNjksICAxNjYsIDY3LCAgNTksCisgICAgMTQxLCA1NSwgIDQ3LCAgMTE4LCA0MSwgIDM1LCAgOTUsICAyNywgIDE5LCAgNjcsICAzLCAgIDAsICAgMjYsICAwLCAgIDAsCisgICAgMjQyLCAxMDIsIDcyLCAgMjEzLCA4OSwgIDYzLCAgMTkxLCA3OSwgIDU2LCAgMTY0LCA2NywgIDQ1LCAgMTQxLCA1NSwgIDM0LAorICAgIDExOCwgNDIsICAyMiwgIDk0LCAgMjgsICA2LCAgIDY3LCAgMywgICAwLCAgIDI2LCAgMCwgICAwLCAgIDI0MiwgMTAwLCA1MSwKKyAgICAyMTQsIDg5LCAgNDUsICAxOTAsIDc4LCAgMzgsICAxNjQsIDY3LCAgMzAsICAxNDEsIDU1LCAgMTgsICAxMTgsIDQyLCAgMywKKyAgICA5NSwgIDI4LCAgMCwgICA2NiwgIDQsICAgMCwgICAyNiwgIDAsICAgMCwgICAyNDMsIDEwMCwgMzMsICAyMTQsIDkwLCAgMjcsCisgICAgMTkwLCA3OCwgIDIyLCAgMTY1LCA2NywgIDEzLCAgMTQxLCA1NSwgIDAsICAgMTE4LCA0MywgIDAsICAgOTQsICAyOSwgIDAsCisgICAgNjYsICA1LCAgIDAsICAgMjYsICAwLCAgIDAsICAgMjM3LCA2OSwgIDE1MywgMjExLCA1OCwgIDEzNSwgMTg3LCA1MSwgIDEyMSwKKyAgICAxNjMsIDQxLCAgMTA1LCAxNDEsIDI4LCAgOTAsICAxMTgsIDE1LCAgNzMsICA5NiwgIDAsICAgNTYsICA2OCwgIDAsICAgMzMsCisgICAgMjUsICAwLCAgIDAsICAgMjM5LCA2NywgIDEzNywgMjEyLCA2MCwgIDEyMywgMTg5LCA1MCwgIDExMCwgMTYzLCA0MSwgIDk0LAorICAgIDE0MSwgMjksICA3OSwgIDExOCwgMTcsICA2NSwgIDk1LCAgMCwgICA0OCwgIDY5LCAgMCwgICAyNiwgIDI1LCAgMCwgICAwLAorICAgIDI0MCwgNjksICAxMjQsIDIxMSwgNjAsICAxMTEsIDE4OCwgNTAsICA5OCwgIDE2MywgNDIsICA4NSwgIDE0MSwgMzEsICA3MiwKKyAgICAxMTgsIDE4LCAgNTcsICA5NCwgIDAsICAgNDEsICA2OCwgIDAsICAgMTksICAyNSwgIDAsICAgMCwgICAyNDAsIDcwLCAgMTEyLAorICAgIDIxMiwgNjEsICA5OSwgIDE4OCwgNTIsICA4NywgIDE2MywgNDEsICA3NCwgIDE0MCwgMzEsICA2MiwgIDExOCwgMjAsICA0OCwKKyAgICA5NCwgIDIsICAgMzIsICA2OCwgIDAsICAgMTEsICAyNCwgIDAsICAgMCwgICAyMzksIDcwLCAgOTgsICAyMTIsIDYyLCAgODYsCisgICAgMTg4LCA1MywgIDc3LCAgMTY0LCA0MiwgIDY0LCAgMTQwLCAzMiwgIDUyLCAgMTE4LCAyMCwgIDQwLCAgOTQsICAzLCAgIDI0LAorICAgIDY3LCAgMCwgICAzLCAgIDIzLCAgMCwgICAwLCAgIDIzOSwgNzEsICA4NSwgIDIxMiwgNjEsICA3NCwgIDE4NywgNTMsICA2NSwKKyAgICAxNjMsIDQ0LCAgNTQsICAxNDAsIDM0LCAgNDMsICAxMTgsIDIyLCAgMzAsICA5NSwgIDMsICAgMTQsICA2NywgIDAsICAgMCwKKyAgICAyMywgIDAsICAgMCwgICAyMzksIDcwLCAgNjcsICAyMTIsIDYyLCAgNTksICAxODgsIDUzLCAgNTEsICAxNjMsIDQ1LCAgNDIsCisgICAgMTQxLCAzNCwgIDMxLCAgMTE3LCAyMiwgIDE3LCAgOTQsICA1LCAgIDIsICAgNjYsICAwLCAgIDAsICAgMjMsICAwLCAgIDAsCisgICAgMjM5LCA3MSwgIDUwLCAgMjEzLCA2MiwgIDQzLCAgMTg4LCA1NCwgIDM3LCAgMTY0LCA0NSwgIDI4LCAgMTM5LCAzNCwgIDE2LAorICAgIDExNywgMjIsICAyLCAgIDk0LCAgNywgICAwLCAgIDY1LCAgMCwgICAwLCAgIDIzLCAgMCwgICAwLCAgIDI0MCwgNzEsICAzNCwKKyAgICAyMTIsIDYzLCAgMjksICAxODksIDU0LCAgMjQsICAxNjMsIDQ2LCAgMTUsICAxMzksIDM2LCAgMiwgICAxMTcsIDI1LCAgMCwKKyAgICA5NCwgIDgsICAgMCwgICA2NiwgIDAsICAgMCwgICAyMywgIDAsICAgMCwgICAyMzcsIDAsICAgMTQwLCAyMDksIDAsICAgMTI0LAorICAgIDE4NiwgMCwgICAxMTIsIDE2MiwgMCwgICA5NywgIDE0MSwgMCwgICA4MiwgIDExOCwgMCwgICA2NywgIDk1LCAgMCwgICA0OSwKKyAgICA2OCwgIDAsICAgMjcsICAyMCwgIDAsICAgMCwgICAyMzcsIDAsICAgMTI2LCAyMTAsIDAsICAgMTEzLCAxODcsIDAsICAgOTksCisgICAgMTYzLCAwLCAgIDg2LCAgMTM5LCAwLCAgIDcyLCAgMTE4LCAwLCAgIDU4LCAgOTUsICAwLCAgIDQyLCAgNjcsICAwLCAgIDIwLAorICAgIDIwLCAgMCwgICAwLCAgIDIzNywgMSwgICAxMTQsIDIwOSwgMSwgICAxMDIsIDE4NywgMCwgICA5MCwgIDE2MywgMCwgICA3OCwKKyAgICAxMzksIDAsICAgNjQsICAxMTgsIDAsICAgNTAsICA5NSwgIDAsICAgMzUsICA2NywgIDAsICAgMTMsICAyMCwgIDAsICAgMCwKKyAgICAyMzYsIDE2LCAgMTAyLCAyMDksIDcsICAgOTEsICAxODYsIDAsICAgODAsICAxNjIsIDAsICAgNjgsICAxMzksIDAsICAgNTYsCisgICAgMTE3LCAwLCAgIDQzLCAgOTQsICAwLCAgIDI3LCAgNjcsICAwLCAgIDYsICAgMjAsICAwLCAgIDAsICAgMjM4LCAxNSwgIDg5LAorICAgIDIwOSwgMTMsICA3OSwgIDE4NiwgNiwgICA2OSwgIDE2MiwgMCwgICA1OCwgIDEzOSwgMCwgICA0NywgIDExNywgMCwgICAzNCwKKyAgICA5MywgIDAsICAgMjAsICA2NiwgIDAsICAgMiwgICAyMCwgIDAsICAgMCwgICAyMzcsIDIwLCAgNzgsICAyMTAsIDEyLCAgNjgsCisgICAgMTg3LCA0LCAgIDU5LCAgMTYzLCAwLCAgIDQ5LCAgMTM5LCAwLCAgIDM4LCAgMTE2LCAwLCAgIDI2LCAgOTQsICAwLCAgIDExLAorICAgIDY2LCAgMCwgICAwLCAgIDIwLCAgMCwgICAwLCAgIDIzNywgMjUsICA2NCwgIDIxMCwgMTgsICA1NiwgIDE4NiwgMTEsICA0OCwKKyAgICAxNjIsIDQsICAgMzksICAxMzgsIDAsICAgMjcsICAxMTcsIDAsICAgMTQsICA5MywgIDAsICAgMCwgICA2NiwgIDAsICAgMCwKKyAgICAyMCwgIDAsICAgMCwgICAyMzgsIDI1LCAgNDgsICAyMTAsIDIyLCAgNDMsICAxODYsIDE1LCAgMzUsICAxNjIsIDgsICAgMjYsCisgICAgMTQwLCAwLCAgIDE0LCAgMTE3LCAwLCAgIDAsICAgOTMsICAwLCAgIDAsICAgNjUsICAwLCAgIDAsICAgMjAsICAwLCAgIDAsCisgICAgMjM4LCAyOCwgIDM1LCAgMjEwLCAyMSwgIDMwLCAgMTg3LCAxNSwgIDI0LCAgMTYyLCA4LCAgIDE2LCAgMTM5LCAxLCAgIDIsCisgICAgMTE3LCAwLCAgIDAsICAgOTMsICAwLCAgIDAsICAgNjUsICAwLCAgIDAsICAgMjIsICAwLCAgIDAsICAgMjE5LCAyNDIsIDI1MiwKKyAgICAxOTUsIDIxNCwgMjI1LCAxNzIsIDE5MSwgMjAxLCAxNDgsIDE2NSwgMTc1LCAxMjcsIDE0MiwgMTUwLCAxMDYsIDExOSwgMTI2LAorICAgIDg0LCAgOTUsICAxMDEsIDU4LCAgNjYsICA3MiwgIDI0LCAgMjcsICAzMiwgIDIyMiwgMjM5LCAyMjYsIDE5NiwgMjEzLCAyMDIsCisgICAgMTczLCAxODksIDE4MCwgMTUwLCAxNjUsIDE1OCwgMTI5LCAxNDEsIDEzNSwgMTA3LCAxMTgsIDExMywgODUsICA5NCwgIDkwLAorICAgIDU4LCAgNjYsICA2MywgIDIxLCAgMjYsICAyNCwgIDIyMywgMjM3LCAyMDMsIDE5OCwgMjExLCAxODIsIDE3NSwgMTg4LCAxNjMsCisgICAgMTUyLCAxNjQsIDE0MSwgMTI5LCAxNDAsIDEyMSwgMTA3LCAxMTcsIDEwMSwgODUsICA5MywgIDgwLCAgNTgsICA2NCwgIDU0LAorICAgIDIxLCAgMjYsICAxOCwgIDIyNiwgMjM2LCAxNzksIDIwMSwgMjEwLCAxNjAsIDE3NywgMTg3LCAxNDMsIDE1MywgMTYyLCAxMjUsCisgICAgMTMwLCAxMzksIDEwNiwgMTA4LCAxMTYsIDg5LCAgODUsICA5MiwgIDY5LCAgNTgsICA2NCwgIDQ1LCAgMjAsICAyNSwgIDgsCisgICAgMjI3LCAyMzQsIDE1MywgMjAxLCAyMDgsIDEzOSwgMTc4LCAxODUsIDEyNCwgMTU0LCAxNjEsIDEwNywgMTMxLCAxMzgsIDkxLAorICAgIDEwOCwgMTE1LCA3NSwgIDg1LCAgOTEsICA1OCwgIDU4LCAgNjMsICAzNSwgIDE3LCAgMjUsICAwLCAgIDIyOSwgMjMzLCAxMzAsCisgICAgMjAzLCAyMDcsIDExNiwgMTc4LCAxODQsIDEwNCwgMTU0LCAxNjAsIDkwLCAgMTMxLCAxMzcsIDc2LCAgMTA5LCAxMTQsIDYyLAorICAgIDg1LCAgOTAsICA0NiwgIDU4LCAgNjMsICAyNSwgIDE2LCAgMjQsICAwLCAgIDIzMCwgMjMxLCAxMDAsIDIwMiwgMjA1LCA5MCwKKyAgICAxNzksIDE4MywgODAsICAxNTQsIDE1OSwgNjksICAxMzEsIDEzNiwgNTcsICAxMDksIDExMywgNDYsICA4NiwgIDkwLCAgMzIsCisgICAgNTgsICA2MywgIDEwLCAgMTQsICAyNCwgIDAsICAgMjMwLCAyMzAsIDY1LCAgMjA0LCAyMDQsIDU4LCAgMTgwLCAxODIsIDUyLAorICAgIDE1NSwgMTU3LCA0NCwgIDEzMiwgMTM1LCAzNSwgIDExMCwgMTEzLCAyNCwgIDg2LCAgODksICA5LCAgIDU3LCAgNjIsICAwLAorICAgIDExLCAgMjQsICAwLCAgIDIzMiwgMjMwLCAxOSwgIDIwNCwgMjA0LCAxOSwgIDE4MCwgMTgxLCAxNywgIDE1NSwgMTU3LCAxMCwKKyAgICAxMzEsIDEzNCwgMiwgICAxMDksIDExMiwgMCwgICA4NSwgIDg5LCAgMCwgICA1NywgIDYyLCAgMCwgICAxMCwgIDIzLCAgMCwKKyAgICAyMTgsIDIxNiwgMjM2LCAxOTQsIDE5MiwgMjExLCAxNzIsIDE3MSwgMTg4LCAxNDksIDE0OSwgMTY0LCAxMjgsIDEyNywgMTQxLAorICAgIDEwNiwgMTA2LCAxMTksIDg0LCAgODQsICA5NCwgIDU5LCAgNTcsICA2NiwgIDI1LCAgMTgsICAyNiwgIDIyMSwgMjE0LCAyMTEsCisgICAgMTk2LCAxOTEsIDE5MCwgMTc0LCAxNzAsIDE3MCwgMTUwLCAxNDgsIDE0OCwgMTI4LCAxMjYsIDEyNywgMTA3LCAxMDUsIDEwNiwKKyAgICA4NSwgIDgzLCAgODQsICA1OSwgIDU2LCAgNTgsICAyMywgIDE3LCAgMTgsICAyMjIsIDIxMywgMTkwLCAxOTcsIDE4OSwgMTcwLAorICAgIDE3NSwgMTY5LCAxNTMsIDE1MSwgMTQ3LCAxMzMsIDEyOSwgMTI2LCAxMTMsIDEwOCwgMTA1LCA5NCwgIDg1LCAgODIsICA3NCwKKyAgICA1OSwgIDU2LCAgNDksICAyMiwgIDE3LCAgMTEsICAyMjQsIDIxMSwgMTY4LCAxOTksIDE4OCwgMTUxLCAxNzUsIDE2OCwgMTM1LAorICAgIDE1MiwgMTQ2LCAxMTcsIDEyOSwgMTI0LCA5OSwgIDEwNywgMTAzLCA4MiwgIDg0LCAgODIsICA2NCwgIDU5LCAgNTUsICA0MSwKKyAgICAyMSwgIDE3LCAgMSwgICAyMjQsIDIxMCwgMTQ1LCAxOTksIDE4NywgMTMwLCAxNzYsIDE2NiwgMTE3LCAxNTIsIDE0NSwgMTAxLAorICAgIDEyOSwgMTIzLCA4NiwgIDEwNywgMTAzLCA3MCwgIDg1LCAgODEsICA1MywgIDU4LCAgNTUsICAzMSwgIDE5LCAgMTcsICAwLAorICAgIDIyNywgMjA4LCAxMjMsIDIwMCwgMTg2LCAxMTAsIDE3NywgMTY1LCA5OCwgIDE1MywgMTQzLCA4NCwgIDEzMCwgMTIyLCA3MCwKKyAgICAxMDgsIDEwMiwgNTcsICA4NSwgIDgwLCAgNDEsICA1OCwgIDU0LCAgMjAsICAxOCwgIDE2LCAgMCwgICAyMjcsIDIwOCwgOTcsCisgICAgMjAyLCAxODUsIDg2LCAgMTc3LCAxNjQsIDc3LCAgMTUzLCAxNDIsIDY1LCAgMTMwLCAxMjIsIDU0LCAgMTA4LCAxMDEsIDQyLAorICAgIDg1LCAgODAsICAyNywgIDU4LCAgNTQsICA3LCAgIDE2LCAgMTYsICAwLCAgIDIyOCwgMjA2LCA2NiwgIDIwMiwgMTg0LCA1OCwKKyAgICAxNzgsIDE2MywgNTAsICAxNTQsIDE0MSwgNDIsICAxMzEsIDEyMSwgMzMsICAxMDksIDEwMSwgMjEsICA4NiwgIDc5LCAgNSwKKyAgICA1OCwgIDU0LCAgMCwgICAxMywgIDE2LCAgMCwgICAyMjgsIDIwNiwgMjksICAyMDIsIDE4MywgMjUsICAxNzgsIDE2MywgMjAsCisgICAgMTU0LCAxNDEsIDE1LCAgMTMxLCAxMjEsIDUsICAgMTA4LCAxMDAsIDAsICAgODUsICA3OSwgIDAsICAgNTgsICA1MywgIDAsCisgICAgMTMsICAxNiwgIDAsICAgMjE3LCAxOTMsIDIyMSwgMTkzLCAxNzIsIDE5OCwgMTcyLCAxNTMsIDE3OCwgMTQ5LCAxMzMsIDE1NCwKKyAgICAxMjgsIDExNCwgMTMyLCAxMDcsIDk0LCAgMTExLCA4NSwgIDc0LCAgODksICA1OSwgIDQ5LCAgNjEsICAyNSwgIDgsICAgMjIsCisgICAgMjE5LCAxOTEsIDE5OCwgMTk1LCAxNzEsIDE3OCwgMTczLCAxNTMsIDE1OSwgMTQ5LCAxMzIsIDEzOSwgMTI4LCAxMTMsIDExOSwKKyAgICAxMDcsIDk0LCAgMTAwLCA4NSwgIDczLCAgNzksICA1OSwgIDQ4LCAgNTIsICAyNSwgIDcsICAgMTQsICAyMjEsIDE5MSwgMTgwLAorICAgIDE5NiwgMTcwLCAxNjAsIDE3NCwgMTUyLCAxNDQsIDE1MCwgMTMyLCAxMjUsIDEyOSwgMTEzLCAxMDcsIDEwNywgOTMsICA4OSwKKyAgICA4NSwgIDczLCAgNjksICA1OSwgIDQ4LCAgNDUsICAyMywgIDcsICAgNCwgICAyMjIsIDE4OSwgMTU5LCAxOTcsIDE2OSwgMTQyLAorICAgIDE3NCwgMTUxLCAxMjcsIDE1MSwgMTMxLCAxMTAsIDEyOSwgMTEyLCA5NCwgIDEwOCwgOTMsICA3OCwgIDg1LCAgNzIsICA2MCwKKyAgICA1OCwgIDQ3LCAgMzcsICAyMiwgIDcsICAgMCwgICAyMjMsIDE4OCwgMTM4LCAxOTcsIDE2OCwgMTIzLCAxNzUsIDE1MCwgMTA5LAorICAgIDE1MSwgMTMwLCA5NSwgIDEzMCwgMTExLCA4MSwgIDEwOCwgOTIsICA2NSwgIDg1LCAgNzIsICA0OSwgIDU5LCAgNDcsICAyNywKKyAgICAyMSwgIDcsICAgMCwgICAyMjQsIDE4NywgMTE4LCAxOTgsIDE2NywgMTA1LCAxNzYsIDE0OSwgOTMsICAxNTIsIDEyOSwgNzksCisgICAgMTMwLCAxMTAsIDY4LCAgMTA4LCA5MSwgIDU0LCAgODUsICA3MSwgIDM4LCAgNTksICA0NywgIDE3LCAgMTgsICA3LCAgIDAsCisgICAgMjI0LCAxODcsIDkzLCAgMTk5LCAxNjYsIDgzLCAgMTc2LCAxNDgsIDczLCAgMTUyLCAxMjgsIDYyLCAgMTI5LCAxMDksIDUxLAorICAgIDEwOCwgOTAsICAzOSwgIDg1LCAgNzEsICAyNSwgIDU4LCAgNDYsICAzLCAgIDE2LCAgOCwgICAwLCAgIDIyNiwgMTg2LCA2NCwKKyAgICAyMDAsIDE2NSwgNTcsICAxNzcsIDE0NywgNTAsICAxNTMsIDEyNywgNDAsICAxMzAsIDEwOCwgMzEsICAxMDgsIDkwLCAgMTksCisgICAgODUsICA3MCwgIDMsICAgNTgsICA0NiwgIDAsICAgMTYsICA4LCAgIDAsICAgMjI3LCAxODUsIDM1LCAgMjAwLCAxNjUsIDMwLAorICAgIDE3NiwgMTQ2LCAyNSwgIDE1MiwgMTI3LCAxOCwgIDEzMCwgMTA4LCA3LCAgIDEwOCwgODksICAwLCAgIDg1LCAgNzAsICAwLAorICAgIDU3LCAgNDYsICAwLCAgIDE0LCAgOCwgICAwLCAgIDIxNiwgMTY5LCAyMDUsIDE5MiwgMTUwLCAxODQsIDE3MSwgMTM0LCAxNjQsCisgICAgMTQ5LCAxMTYsIDE0NCwgMTI4LCA5OSwgIDEyNCwgMTA3LCA4MSwgIDEwMywgODUsICA2MywgIDgxLCAgNjAsICAzOSwgIDU1LAorICAgIDI2LCAgMCwgICAxNSwgIDIxNywgMTY4LCAxODYsIDE5MywgMTUwLCAxNjUsIDE3MiwgMTM0LCAxNDksIDE1MCwgMTE2LCAxMzAsCisgICAgMTI4LCA5OSwgIDExMSwgMTA3LCA4MSwgIDkyLCAgODUsICA2MiwgIDcyLCAgNTksICAzOSwgIDQ3LCAgMjUsICAwLCAgIDYsCisgICAgMjE5LCAxNjgsIDE2OCwgMTk0LCAxNDksIDE1MCwgMTczLCAxMzMsIDEzNSwgMTUwLCAxMTYsIDExNywgMTI4LCA5OCwgIDk5LAorICAgIDEwNywgODAsICA4MiwgIDg2LCAgNjIsICA2MywgIDU5LCAgMzgsICAzOSwgIDI0LCAgMCwgICAwLCAgIDIxOSwgMTY2LCAxNDgsCisgICAgMTk1LCAxNDksIDEzMywgMTczLCAxMzMsIDExOSwgMTUwLCAxMTUsIDEwMywgMTI4LCA5OCwgIDg4LCAgMTA3LCA4MCwgIDcyLAorICAgIDg1LCAgNjEsICA1NCwgIDU5LCAgMzgsICAzMiwgIDIzLCAgMCwgICAwLCAgIDIyMCwgMTY2LCAxMjksIDE5NiwgMTQ4LCAxMTYsCisgICAgMTc0LCAxMzIsIDEwMywgMTUxLCAxMTQsIDg5LCAgMTI5LCA5NywgIDc1LCAgMTA3LCA3OSwgIDYwLCAgODUsICA2MSwgIDQ0LAorICAgIDU5LCAgMzgsICAyMiwgIDIxLCAgMCwgICAwLCAgIDIyMiwgMTY0LCAxMTAsIDE5NywgMTQ3LCA5OSwgIDE3NSwgMTMxLCA4NywKKyAgICAxNTEsIDExMywgNzUsICAxMjksIDk2LCAgNjMsICAxMDcsIDc5LCAgNDksICA4NSwgIDYxLCAgMzMsICA1OCwgIDM4LCAgMTIsCisgICAgMTksICAwLCAgIDAsICAgMjIyLCAxNjQsIDg4LCAgMTk3LCAxNDYsIDc5LCAgMTc0LCAxMzAsIDY5LCAgMTUxLCAxMTMsIDU4LAorICAgIDEyOSwgOTUsICA0NywgIDEwNywgNzgsICAzNSwgIDg1LCAgNjAsICAyMCwgIDU4LCAgMzgsICAwLCAgIDE4LCAgMCwgICAwLAorICAgIDIyMywgMTY0LCA2MywgIDE5OCwgMTQ1LCA1NSwgIDE3NSwgMTI5LCA0OCwgIDE1MSwgMTEyLCAzOSwgIDEyOSwgOTUsICAyOSwKKyAgICAxMDcsIDc4LCAgMTYsICA4NSwgIDYwLCAgMSwgICA1OCwgIDM4LCAgMCwgICAxNywgIDAsICAgMCwgICAyMjMsIDE2MywgMzYsCisgICAgMTk4LCAxNDUsIDMyLCAgMTc0LCAxMjksIDI2LCAgMTUxLCAxMTEsIDE3LCAgMTI5LCA5NSwgIDcsICAgMTA3LCA3OCwgIDAsCisgICAgODQsICA2MCwgIDAsICAgNTcsICAzNywgIDAsICAgMTUsICAwLCAgIDAsICAgMjE1LCAxNDcsIDE5MiwgMTkxLCAxMzAsIDE3MiwKKyAgICAxNzAsIDExNiwgMTUzLCAxNDgsIDEwMCwgMTMzLCAxMjcsIDg1LCAgMTE1LCAxMDcsIDY5LCAgOTYsICA4NSwgIDUxLCAgNzUsCisgICAgNjAsICAyOCwgIDUwLCAgMjUsICAwLCAgIDgsICAgMjE3LCAxNDYsIDE3MywgMTkyLCAxMzAsIDE1NCwgMTcxLCAxMTUsIDEzOCwKKyAgICAxNDksIDEwMCwgMTIxLCAxMjgsIDg0LCAgMTAzLCAxMDcsIDY4LCAgODUsICA4NSwgIDUxLCAgNjYsICA2MCwgIDI4LCAgNDIsCisgICAgMjUsICAwLCAgIDAsICAgMjE3LCAxNDUsIDE1NywgMTkzLCAxMjksIDE0MCwgMTczLCAxMTUsIDEyNSwgMTQ5LCAxMDAsIDEwOSwKKyAgICAxMjgsIDg0LCAgOTIsICAxMDcsIDY4LCAgNzYsICA4NSwgIDUxLCAgNTgsICA1OSwgIDI4LCAgMzUsICAyMywgIDAsICAgMCwKKyAgICAyMTgsIDE0NSwgMTQwLCAxOTMsIDEyOSwgMTI1LCAxNzIsIDExNCwgMTEwLCAxNDksIDk5LCAgOTYsICAxMjgsIDgzLCAgODEsCisgICAgMTA3LCA2NywgIDY1LCAgODQsICA1MSwgIDQ5LCAgNTksICAyOSwgIDI3LCAgMjIsICAwLCAgIDAsICAgMjE5LCAxNDQsIDEyMSwKKyAgICAxOTQsIDEyOCwgMTA4LCAxNzIsIDExMywgOTYsICAxNDksIDk4LCAgODMsICAxMjgsIDgzLCAgNjksICAxMDcsIDY4LCAgNTUsCisgICAgODUsICA1MCwgIDQwLCAgNTksICAyOCwgIDE4LCAgMjAsICAwLCAgIDAsICAgMjIwLCAxNDMsIDEwNCwgMTk1LCAxMjgsIDkzLAorICAgIDE3MywgMTE0LCA4MiwgIDE1MCwgOTgsICA2OSwgIDEyNywgODIsICA1OCwgIDEwNywgNjcsICA0NSwgIDg1LCAgNTAsICAzMCwKKyAgICA1OSwgIDI4LCAgNywgICAxOSwgIDAsICAgMCwgICAyMjAsIDE0MywgODQsICAxOTUsIDEyNywgNzQsICAxNzMsIDExMywgNjUsCisgICAgMTQ5LCA5NywgIDU1LCAgMTI4LCA4MiwgIDQ0LCAgMTA2LCA2NywgIDMyLCAgODQsICA1MCwgIDE2LCAgNTgsICAyOCwgIDAsCisgICAgMTgsICAwLCAgIDAsICAgMjIxLCAxNDIsIDYyLCAgMTk2LCAxMjYsIDUzLCAgMTczLCAxMTIsIDQ2LCAgMTUwLCA5NywgIDM3LAorICAgIDEyOCwgODIsICAyNiwgIDEwNywgNjYsICAxNCwgIDg0LCAgNTAsICAwLCAgIDU4LCAgMjgsICAwLCAgIDE2LCAgMCwgICAwLAorICAgIDIyMiwgMTQyLCAzOCwgIDE5NiwgMTI2LCAzNCwgIDE3NCwgMTEyLCAyNywgIDE1MCwgOTYsICAxNywgIDEyOCwgODIsICA2LAorICAgIDEwNiwgNjYsICAwLCAgIDg0LCAgNTAsICAwLCAgIDU3LCAgMjksICAwLCAgIDE2LCAgMCwgICAwLCAgIDIxNCwgMTIzLCAxNzksCisgICAgMTkxLCAxMTAsIDE1OSwgMTY5LCA5OCwgIDE0MywgMTQ3LCA4NCwgIDEyNCwgMTI2LCA3MCwgIDEwNiwgMTA3LCA1NSwgIDg4LAorICAgIDg1LCAgMzksICA2OSwgIDYwLCAgMTUsICA0NSwgIDIzLCAgMCwgICAyLCAgIDIxNiwgMTIzLCAxNjEsIDE5MiwgMTEwLCAxNDQsCisgICAgMTcwLCA5OCwgIDEyOSwgMTQ4LCA4NCwgIDExMiwgMTI3LCA3MCwgIDk1LCAgMTA3LCA1NSwgIDc5LCAgODUsICAzOSwgIDYxLAorICAgIDYwLCAgMTUsICAzNywgIDIwLCAgMCwgICAwLCAgIDIxNywgMTIyLCAxNDUsIDE5MiwgMTEwLCAxMzAsIDE3MCwgOTcsICAxMTYsCisgICAgMTQ5LCA4NCwgIDEwMSwgMTI3LCA3MCwgIDg1LCAgMTA2LCA1NSwgIDcwLCAgODUsICAzOSwgIDUzLCAgNTksICAxNiwgIDMwLAorICAgIDE5LCAgMCwgICAwLCAgIDIxNywgMTIzLCAxMzEsIDE5MiwgMTA5LCAxMTYsIDE3MSwgOTYsICAxMDMsIDE0OSwgODMsICA4OSwKKyAgICAxMjcsIDcwLCAgNzUsICAxMDYsIDU1LCAgNjAsICA4NSwgIDQwLCAgNDUsICA1OSwgIDE2LCAgMjMsICAxNywgIDAsICAgMCwKKyAgICAyMTcsIDEyMiwgMTE0LCAxOTMsIDEwOSwgMTAxLCAxNzIsIDk2LCAgOTEsICAxNDksIDgyLCAgNzcsICAxMjgsIDY5LCAgNjQsCisgICAgMTA2LCA1NSwgIDUwLCAgODQsICAzOSwgIDM1LCAgNTksICAxNywgIDE0LCAgMTcsICAwLCAgIDAsICAgMjE4LCAxMjIsIDk4LAorICAgIDE5NCwgMTA4LCA4NywgIDE3MSwgOTYsICA3NywgIDE0OSwgODIsICA2NSwgIDEyNywgNjksICA1MiwgIDEwNiwgNTUsICA0MCwKKyAgICA4NCwgIDQwLCAgMjUsICA1OSwgIDE4LCAgMywgICAxNSwgIDAsICAgMCwgICAyMTksIDEyMiwgODAsICAxOTMsIDEwOCwgNzAsCisgICAgMTcyLCA5NSwgIDYxLCAgMTQ5LCA4MiwgIDUxLCAgMTI3LCA2OSwgIDQwLCAgMTA2LCA1NSwgIDI4LCAgODQsICAzOSwgIDEyLAorICAgIDU4LCAgMTcsICAwLCAgIDEzLCAgMCwgICAwLCAgIDIxOSwgMTIxLCA1OSwgIDE5NCwgMTA4LCA1MiwgIDE3MiwgOTYsICA0NCwKKyAgICAxNDksIDgyLCAgMzUsICAxMjcsIDY4LCAgMjQsICAxMDYsIDU1LCAgMTEsICA4NCwgIDQwLCAgMCwgICA1NywgIDE4LCAgMCwKKyAgICAxMywgIDAsICAgMCwgICAyMTksIDEyMSwgNDAsICAxOTMsIDEwOCwgMzMsICAxNzIsIDk1LCAgMjYsICAxNDksIDgxLCAgMTksCisgICAgMTI4LCA2OCwgIDYsICAgMTA2LCA1NCwgIDAsICAgODQsICAzOSwgIDAsICAgNTcsICAxOCwgIDAsICAgMTMsICAwLCAgIDAsCisgICAgMjEzLCA5OSwgIDE2NSwgMTg5LCA4NywgIDE0OCwgMTY5LCA3NiwgIDEzMiwgMTQ3LCA2NCwgIDExNSwgMTI2LCA1MiwgIDk4LAorICAgIDEwNiwgMzksICA4MSwgIDg1LCAgMjMsICA2MywgIDYwLCAgMCwgICAzOSwgIDE2LCAgMCwgICAwLCAgIDIxNCwgOTgsICAxNDksCisgICAgMTkxLCA4NywgIDEzMywgMTcwLCA3NiwgIDExOSwgMTQ4LCA2NSwgIDEwMywgMTI3LCA1MywgIDg4LCAgMTA2LCAzOSwgIDcyLAorICAgIDg1LCAgMjQsICA1NSwgIDYwLCAgMCwgICAzMiwgIDE1LCAgMCwgICAwLCAgIDIxNSwgOTksICAxMzYsIDE5MSwgODcsICAxMjEsCisgICAgMTcwLCA3NywgIDEwOCwgMTQ4LCA2NSwgIDkzLCAgMTI2LCA1MywgIDc5LCAgMTA2LCA0MCwgIDY0LCAgODUsICAyNCwgIDQ3LAorICAgIDU5LCAgMCwgICAyNSwgIDE0LCAgMCwgICAwLCAgIDIxNSwgOTksICAxMjEsIDE5MiwgODcsICAxMDgsIDE3MCwgNzcsICA5NiwKKyAgICAxNDgsIDY1LCAgODIsICAxMjYsIDUzLCAgNjksICAxMDYsIDQwLCAgNTUsICA4NSwgIDI1LCAgMzksICA1OSwgIDAsICAgMTgsCisgICAgMTMsICAwLCAgIDAsICAgMjE2LCA5OSwgIDEwNiwgMTkxLCA4NywgIDk1LCAgMTcwLCA3NiwgIDgzLCAgMTQ4LCA2NSwgIDcxLAorICAgIDEyNiwgNTMsICA1OCwgIDEwNiwgNDEsICA0NSwgIDg1LCAgMjYsICAzMCwgIDU5LCAgMCwgICA4LCAgIDExLCAgMCwgICAwLAorICAgIDIxNiwgOTgsICA5MSwgIDE5MiwgODgsICA4MiwgIDE3MCwgNzcsICA3MSwgIDE0OCwgNjUsICA2MCwgIDEyNywgNTMsICA0OCwKKyAgICAxMDUsIDQxLCAgMzYsICA4MywgIDI2LCAgMjEsICA1OCwgIDEsICAgMiwgICAxMSwgIDAsICAgMCwgICAyMTcsIDk5LCAgNzUsCisgICAgMTkyLCA4NywgIDY2LCAgMTcwLCA3NiwgIDU3LCAgMTQ4LCA2NSwgIDQ3LCAgMTI2LCA1MywgIDM2LCAgMTA1LCA0MSwgIDI0LAorICAgIDgzLCAgMjYsICA4LCAgIDU3LCAgMiwgICAwLCAgIDksICAgMCwgICAwLCAgIDIxNywgOTgsICA1NywgIDE5MiwgODcsICA0OSwKKyAgICAxNzEsIDc3LCAgNDEsICAxNDcsIDY1LCAgMzIsICAxMjYsIDUzLCAgMjEsICAxMDUsIDQxLCAgOCwgICA4NCwgIDI3LCAgMCwKKyAgICA1NywgIDMsICAgMCwgICA5LCAgIDAsICAgMCwgICAyMTcsIDk4LCAgNDAsICAxOTMsIDg3LCAgMzQsICAxNzEsIDc2LCAgMjcsCisgICAgMTQ4LCA2NSwgIDE5LCAgMTI2LCA1MywgIDYsICAgMTA1LCA0MSwgIDAsICAgODMsICAyNywgIDAsICAgNTcsICA0LCAgIDAsCisgICAgOSwgICAwLCAgIDAsICAgMjExLCA2NywgIDE1MiwgMTg5LCA1OCwgIDEzNiwgMTY4LCA1MCwgIDEyMiwgMTQ3LCAzOSwgIDEwNSwKKyAgICAxMjcsIDI4LCAgODksICAxMDYsIDE0LCAgNzQsICA4NSwgIDAsICAgNTYsICA1OSwgIDAsICAgMzMsICA5LCAgIDAsICAgMCwKKyAgICAyMTMsIDY4LCAgMTM4LCAxOTAsIDU5LCAgMTIzLCAxNjksIDUxLCAgMTA5LCAxNDgsIDQwLCAgOTUsICAxMjYsIDMwLCAgODAsCisgICAgMTA2LCAxNiwgIDY1LCAgODUsICAwLCAgIDQ4LCAgNTksICAwLCAgIDI3LCAgOSwgICAwLCAgIDAsICAgMjE0LCA2OSwgIDEyNSwKKyAgICAxOTAsIDU5LCAgMTExLCAxNjgsIDUxLCAgOTksICAxNDgsIDQxLCAgODYsICAxMjYsIDMxLCAgNzIsICAxMDYsIDE4LCAgNTgsCisgICAgODUsICAwLCAgIDQxLCAgNTksICAwLCAgIDIwLCAgNywgICAwLCAgIDAsICAgMjE1LCA3MCwgIDExMiwgMTkwLCA2MSwgIDEwMCwKKyAgICAxNjksIDUyLCAgODgsICAxNDcsIDQyLCAgNzYsICAxMjYsIDMyLCAgNjMsICAxMDYsIDE5LCAgNDksICA4NCwgIDEsICAgMzQsCisgICAgNTgsICAwLCAgIDEzLCAgNywgICAwLCAgIDAsICAgMjE0LCA3MCwgIDk5LCAgMTkwLCA2MiwgIDg4LCAgMTY5LCA1MywgIDc3LAorICAgIDE0NywgNDMsICA2NSwgIDEyNSwgMzIsICA1MywgIDEwNiwgMjAsICA0MCwgIDg0LCAgMywgICAyNiwgIDU4LCAgMCwgICA0LAorICAgIDcsICAgMCwgICAwLCAgIDIxNCwgNzEsICA4NiwgIDE5MCwgNjEsICA3NSwgIDE2OSwgNTMsICA2NSwgIDE0NiwgNDMsICA1NCwKKyAgICAxMjYsIDMzLCAgNDQsICAxMDUsIDIxLCAgMzEsICA4MywgIDQsICAgMTcsICA1NywgIDAsICAgMCwgICA3LCAgIDAsICAgMCwKKyAgICAyMTUsIDcxLCAgNzEsICAxOTEsIDYyLCAgNjIsICAxNjksIDUzLCAgNTMsICAxNDcsIDQ0LCAgNDQsICAxMjYsIDM0LCAgMzMsCisgICAgMTA1LCAyMiwgIDIwLCAgODMsICA1LCAgIDQsICAgNTcsICAwLCAgIDAsICAgNywgICAwLCAgIDAsICAgMjE1LCA3MSwgIDU0LAorICAgIDE5MSwgNjIsICA0NywgIDE2OSwgNTQsICAzOSwgIDE0NywgNDQsICAzMCwgIDEyNiwgMzUsICAyMCwgIDEwNSwgMjMsICA2LAorICAgIDgzLCAgNiwgICAwLCAgIDU2LCAgMCwgICAwLCAgIDUsICAgMCwgICAwLCAgIDIxNSwgNzEsICA0MSwgIDE5MSwgNjMsICAzNCwKKyAgICAxNzAsIDU0LCAgMjcsICAxNDcsIDQ1LCAgMTcsICAxMjYsIDM1LCAgNiwgICAxMDUsIDIzLCAgMCwgICA4MywgIDgsICAgMCwKKyAgICA1NiwgIDAsICAgMCwgICA1LCAgIDAsICAgMCwgICAyMTAsIDEzLCAgMTQwLCAxODksIDEsICAgMTI1LCAxNjcsIDAsICAgMTEwLAorICAgIDE0NiwgMCwgICA5NiwgIDEyNiwgMCwgICA4MSwgIDEwNiwgMCwgICA2NywgIDg1LCAgMCwgICA1MSwgIDU5LCAgMCwgICAyOCwKKyAgICA0LCAgIDAsICAgMCwgICAyMTIsIDE4LCAgMTI2LCAxOTAsIDcsICAgMTEzLCAxNjgsIDAsICAgMTAwLCAxNDYsIDAsICAgODYsCisgICAgMTI2LCAwLCAgIDczLCAgMTA2LCAwLCAgIDU5LCAgODQsICAwLCAgIDQzLCAgNTksICAwLCAgIDIyLCAgNCwgICAwLCAgIDAsCisgICAgMjEyLCAyMSwgIDExNSwgMTkwLCAxMywgIDEwMywgMTY4LCAzLCAgIDkxLCAgMTQ2LCAwLCAgIDc4LCAgMTI1LCAwLCAgIDY1LAorICAgIDEwNSwgMCwgICA1MiwgIDg0LCAgMCwgICAzNiwgIDU4LCAgMCwgICAxNiwgIDQsICAgMCwgICAwLCAgIDIxMywgMjQsICAxMDMsCisgICAgMTg5LCAxOSwgIDkxLCAgMTY4LCA5LCAgIDgyLCAgMTQ2LCAwLCAgIDY5LCAgMTI1LCAwLCAgIDU3LCAgMTA1LCAwLCAgIDQ0LAorICAgIDg0LCAgMCwgICAyOSwgIDU4LCAgMCwgICA3LCAgIDQsICAgMCwgICAwLCAgIDIxMywgMjcsICA5MiwgIDE4OCwgMjEsICA4MSwKKyAgICAxNjgsIDE0LCAgNzEsICAxNDYsIDEsICAgNTksICAxMjUsIDAsICAgNDgsICAxMDUsIDAsICAgMzYsICA4NCwgIDAsICAgMjEsCisgICAgNTgsICAwLCAgIDQsICAgNCwgICAwLCAgIDAsICAgMjEzLCAzMCwgIDgwLCAgMTg5LCAyMiwgIDY5LCAgMTY4LCAxNywgIDYxLAorICAgIDE0NiwgNSwgICA1MCwgIDEyNSwgMCwgICAzOSwgIDEwNCwgMCwgICAyNywgIDgzLCAgMCwgICAxMiwgIDU3LCAgMCwgICAwLAorICAgIDQsICAgMCwgICAwLCAgIDIxNCwgMzAsICA2NywgIDE4OSwgMjUsICA1NywgIDE2OCwgMjAsICA1MCwgIDE0NiwgOSwgICA0MCwKKyAgICAxMjUsIDAsICAgMjksICAxMDQsIDAsICAgMTcsICA4MywgIDAsICAgMiwgICA1NiwgIDAsICAgMCwgICA0LCAgIDAsICAgMCwKKyAgICAyMTQsIDMyLCAgNTMsICAxODksIDI3LCAgNDQsICAxNjksIDIwLCAgMzgsICAxNDYsIDEzLCAgMjgsICAxMjQsIDIsICAgMTcsCisgICAgMTA0LCAwLCAgIDQsICAgODMsICAwLCAgIDAsICAgNTYsICAwLCAgIDAsICAgNCwgICAwLCAgIDAsICAgMjE0LCAzMywgIDQxLAorICAgIDE5MCwgMjcsICAzMywgIDE2OCwgMjMsICAyNywgIDE0NiwgMTMsICAxOCwgIDEyNSwgMywgICA1LCAgIDEwNSwgMCwgICAwLAorICAgIDgzLCAgMCwgICAwLCAgIDU2LCAgMCwgICAwLCAgIDQsICAgMCwgICAwLCAgIDE4NSwgMjI5LCAyNTAsIDE2NCwgMjA0LCAyMjMsCisgICAgMTQ2LCAxODIsIDE5OSwgMTI3LCAxNTgsIDE3NCwgMTA4LCAxMzYsIDE0OSwgODksICAxMTMsIDEyNSwgNzAsICA5MCwgIDEwMCwKKyAgICA0NiwgIDYyLCAgNzEsICAxMCwgIDI1LCAgMzMsICAxODksIDIyNywgMjI1LCAxNjgsIDIwMiwgMjAxLCAxNDgsIDE4MSwgMTc5LAorICAgIDEyOSwgMTU3LCAxNTYsIDEwOSwgMTM1LCAxMzQsIDkwLCAgMTEzLCAxMTMsIDcwLCAgODksICA5MCwgIDQ2LCAgNjIsICA2MiwKKyAgICA4LCAgIDI0LCAgMjUsICAxOTIsIDIyNiwgMjAyLCAxNzAsIDIwMiwgMTgyLCAxNTEsIDE3OSwgMTYyLCAxMzAsIDE1NiwgMTQxLAorICAgIDExMCwgMTMzLCAxMjEsIDkxLCAgMTEyLCAxMDEsIDcxLCAgODksICA4MCwgIDQ2LCAgNjEsICA1NCwgIDcsICAgMjQsICAxOSwKKyAgICAxOTQsIDIyNCwgMTc5LCAxNzMsIDIwMCwgMTYwLCAxNTMsIDE3OCwgMTQ0LCAxMzIsIDE1NSwgMTI1LCAxMTIsIDEzMywgMTA3LAorICAgIDkyLCAgMTExLCA4OSwgIDcxLCAgODgsICA2OSwgIDQ2LCAgNjEsICA0NSwgIDYsICAgMjMsICAxMCwgIDE5NiwgMjIzLCAxNTUsCisgICAgMTc0LCAxOTgsIDEzOSwgMTU0LCAxNzYsIDEyNCwgMTMyLCAxNTMsIDEwNywgMTEzLCAxMzEsIDkxLCAgOTIsICAxMTAsIDc1LAorICAgIDcyLCAgODcsICA1OCwgIDQ3LCAgNjAsICAzNywgIDQsICAgMjMsICAwLCAgIDE5OCwgMjIxLCAxMzEsIDE3NSwgMTk3LCAxMTcsCisgICAgMTU1LCAxNzUsIDEwNSwgMTMzLCAxNTIsIDkxLCAgMTEzLCAxMzAsIDc2LCAgOTIsICAxMDksIDYzLCAgNzIsICA4NiwgIDQ3LAorICAgIDQ2LCAgNjAsICAyNiwgIDMsICAgMjMsICAwLCAgIDIwMCwgMjIwLCAxMDQsIDE3NiwgMTk2LCA5NCwgIDE1NiwgMTc1LCA4NCwKKyAgICAxMzQsIDE1MSwgNzIsICAxMTMsIDEyOSwgNTksICA5MywgIDEwOCwgNDcsICA3MiwgIDg1LCAgMzMsICA0NiwgIDU5LCAgMTMsCisgICAgMCwgICAyMywgIDAsICAgMjAxLCAyMTksIDczLCAgMTc5LCAxOTUsIDY1LCAgMTU3LCAxNzMsIDU3LCAgMTM1LCAxNTAsIDQ4LAorICAgIDExNCwgMTI5LCAzOSwgIDk0LCAgMTA4LCAyOCwgIDcyLCAgODUsICAxNSwgIDQ3LCAgNTksICAwLCAgIDAsICAgMjIsICAwLAorICAgIDIwMywgMjE5LCA0MiwgIDE3OCwgMTk1LCAzNywgIDE1NywgMTczLCAzMiwgIDEzNSwgMTUwLCAyNiwgIDExNCwgMTI4LCAxNiwKKyAgICA5NCwgIDEwNywgNiwgICA3MywgIDg1LCAgMCwgICA0NiwgIDU4LCAgMCwgICAwLCAgIDIyLCAgMCwgICAxODYsIDIwNSwgMjMzLAorICAgIDE2NSwgMTgzLCAyMDksIDE0OCwgMTYzLCAxODcsIDEyOCwgMTQyLCAxNjMsIDEwOSwgMTIxLCAxNDAsIDkxLCAgMTAxLCAxMTgsCisgICAgNzEsICA4MCwgIDk0LCAgNDgsICA1NCwgIDY2LCAgMTIsICAxNSwgIDI3LCAgMTg5LCAyMDQsIDIxMSwgMTY5LCAxODIsIDE4OSwKKyAgICAxNTEsIDE2MywgMTY5LCAxMzEsIDE0MSwgMTQ3LCAxMTEsIDEyMSwgMTI2LCA5MiwgIDEwMSwgMTA1LCA3MiwgIDc5LCAgODQsCisgICAgNDgsICA1NCwgIDU4LCAgMTEsICAxNSwgIDE5LCAgMTkyLCAyMDIsIDE5MCwgMTcxLCAxODEsIDE3MCwgMTUyLCAxNjEsIDE1MiwKKyAgICAxMzEsIDE0MSwgMTMzLCAxMTIsIDEyMCwgMTEzLCA5MywgIDEwMCwgOTQsICA3MiwgIDc5LCAgNzQsICA0OCwgIDUzLCAgNTAsCisgICAgMTAsICAxNSwgIDExLCAgMTk1LCAyMDEsIDE2OSwgMTcyLCAxNzksIDE1MSwgMTUzLCAxNjAsIDEzNSwgMTMyLCAxMzksIDExNywKKyAgICAxMTMsIDExOSwgMTAwLCA5MywgIDk5LCAgODIsICA3MiwgIDc4LCAgNjQsICA0OCwgIDUzLCAgNDEsICA5LCAgIDE0LCAgMywKKyAgICAxOTUsIDIwMCwgMTQ2LCAxNzQsIDE3OSwgMTMxLCAxNTQsIDE1OSwgMTE3LCAxMzMsIDEzOCwgMTAxLCAxMTMsIDExOCwgODYsCisgICAgOTMsICA5OCwgIDcwLCAgNzMsICA3NywgIDUzLCAgNDgsICA1MiwgIDMyLCAgOCwgICAxNSwgIDAsICAgMTk4LCAxOTksIDEyNSwKKyAgICAxNzUsIDE3NywgMTExLCAxNTUsIDE1OCwgMTAwLCAxMzMsIDEzNywgODUsICAxMTMsIDExNywgNzEsICA5MywgIDk3LCAgNTcsCisgICAgNzIsICA3NywgIDQyLCAgNDcsICA1MiwgIDIyLCAgNSwgICAxNCwgIDAsICAgMTk5LCAxOTgsIDEwMSwgMTc2LCAxNzcsIDg5LAorICAgIDE1NSwgMTU3LCA3OSwgIDEzNCwgMTM2LCA2OCwgIDExMywgMTE2LCA1NiwgIDk0LCAgOTcsICA0NCwgIDczLCAgNzYsICAzMCwKKyAgICA0NywgIDUyLCAgMTAsICAyLCAgIDE1LCAgMCwgICAyMDAsIDE5NywgNzIsICAxNzgsIDE3NiwgNjMsICAxNTcsIDE1NiwgNTYsCisgICAgMTM1LCAxMzYsIDQ2LCAgMTE0LCAxMTYsIDM3LCAgOTQsICA5NiwgIDI2LCAgNzMsICA3NiwgIDExLCAgNDcsICA1MSwgIDAsCisgICAgMCwgICAxNCwgIDAsICAgMjAxLCAxOTcsIDQ1LCAgMTc3LCAxNzUsIDM4LCAgMTU2LCAxNTUsIDMxLCAgMTM1LCAxMzUsIDI1LAorICAgIDExNCwgMTE1LCAxNywgIDk0LCAgOTYsICA1LCAgIDczLCAgNzUsICAwLCAgIDQ2LCAgNTEsICAwLCAgIDAsICAgMTQsICAwLAorICAgIDE4NywgMTgzLCAyMTgsIDE2NywgMTY1LCAxOTcsIDE0OSwgMTQ3LCAxNzYsIDEyOSwgMTI3LCAxNTMsIDExMSwgMTA5LCAxMzIsCisgICAgOTIsICA5MCwgIDExMSwgNzMsICA3MCwgIDg5LCAgNDksICA0NiwgIDYyLCAgMTUsICA0LCAgIDIyLCAgMTkwLCAxODMsIDE5NywKKyAgICAxNzAsIDE2NCwgMTc3LCAxNTEsIDE0NiwgMTU5LCAxMzAsIDEyNywgMTM5LCAxMTIsIDEwOSwgMTE5LCA5MywgIDkwLCAgOTksCisgICAgNzIsICA3MCwgIDc4LCAgNDksICA0NSwgIDUzLCAgMTQsICA0LCAgIDE1LCAgMTkyLCAxODIsIDE3OSwgMTcxLCAxNjMsIDE2MSwKKyAgICAxNTMsIDE0NSwgMTQ0LCAxMzIsIDEyNiwgMTI1LCAxMTMsIDEwOCwgMTA3LCA5MywgIDg5LCAgODgsICA3MywgIDcwLCAgNjksCisgICAgNDksICA0NSwgIDQ1LCAgMTMsICA1LCAgIDYsICAgMTk1LCAxODEsIDE1OSwgMTcyLCAxNjIsIDE0MiwgMTUyLCAxNDUsIDEyNywKKyAgICAxMzIsIDEyNSwgMTExLCAxMTMsIDEwNywgOTQsICA5MywgIDg4LCAgNzcsICA3MywgIDY5LCAgNTksICA0OCwgIDQ1LCAgMzcsCisgICAgMTEsICA1LCAgIDAsICAgMTk1LCAxODAsIDEzOSwgMTczLCAxNjEsIDEyNCwgMTUzLCAxNDMsIDExMCwgMTMzLCAxMjUsIDk2LAorICAgIDExMywgMTA2LCA4MSwgIDk0LCAgODgsICA2NiwgIDczLCAgNjgsICA0OSwgIDQ5LCAgNDQsICAyOCwgIDksICAgNiwgICAwLAorICAgIDE5NiwgMTc5LCAxMTgsIDE3NCwgMTYwLCAxMDYsIDE1NCwgMTQyLCA5NCwgIDEzMywgMTI0LCA4MSwgIDExMywgMTA1LCA2OCwKKyAgICA5NCwgIDg3LCAgNTQsICA3MywgIDY4LCAgMzksICA0OCwgIDQ0LCAgMTgsICA1LCAgIDUsICAgMCwgICAxOTcsIDE3OCwgOTYsCisgICAgMTc2LCAxNTksIDg2LCAgMTU1LCAxNDEsIDc1LCAgMTM0LCAxMjMsIDY0LCAgMTE0LCAxMDUsIDUzLCAgOTQsICA4NywgIDQwLAorICAgIDczLCAgNjgsICAyNiwgIDQ4LCAgNDQsICA1LCAgIDIsICAgNiwgICAwLCAgIDE5OSwgMTc4LCA3MCwgIDE3NiwgMTU4LCA2MiwKKyAgICAxNTYsIDE0MSwgNTQsICAxMzQsIDEyMiwgNDQsICAxMTQsIDEwNCwgMzUsICA5NCwgIDg2LCAgMjMsICA3MywgIDY3LCAgOCwKKyAgICA0NywgIDQ0LCAgMCwgICAyLCAgIDYsICAgMCwgICAxOTksIDE3NywgNDUsICAxNzgsIDE1OCwgNDAsICAxNTYsIDE0MCwgMzIsCisgICAgMTM1LCAxMjIsIDI2LCAgMTE0LCAxMDQsIDE2LCAgOTQsICA4NiwgIDQsICAgNzMsICA2NywgIDAsICAgNDcsICA0NCwgIDAsCisgICAgMCwgICA3LCAgIDAsICAgMTg4LCAxNjEsIDIwNCwgMTY4LCAxNDQsIDE4MywgMTQ5LCAxMjksIDE2NCwgMTMwLCAxMTIsIDE0NCwKKyAgICAxMTIsIDk1LCAgMTIzLCA5MywgIDc4LCAgMTAzLCA3NCwgIDYwLCAgODEsICA1MCwgIDM2LCAgNTYsICAxNiwgIDAsICAgMTYsCisgICAgMTkwLCAxNjAsIDE4NSwgMTcwLCAxNDQsIDE2NSwgMTUxLCAxMjgsIDE0OCwgMTMyLCAxMTEsIDEzMCwgMTEyLCA5NSwgIDExMCwKKyAgICA5MywgIDc4LCAgOTIsICA3NCwgIDU5LCAgNzIsICA1MCwgIDM2LCAgNDgsICAxNiwgIDAsICAgOCwgICAxOTIsIDE2MCwgMTY3LAorICAgIDE3MSwgMTQzLCAxNTAsIDE1MywgMTI4LCAxMzQsIDEzMiwgMTExLCAxMTcsIDExMiwgOTQsICAxMDAsIDk0LCAgNzcsICA4MiwKKyAgICA3NCwgIDU5LCAgNjMsICA1MCwgIDM2LCAgNDAsICAxNCwgIDAsICAgMCwgICAxOTMsIDE1OSwgMTQ5LCAxNzIsIDE0MywgMTM0LAorICAgIDE1MywgMTI3LCAxMTksIDEzMywgMTEwLCAxMDMsIDExMywgOTQsICA4NywgIDkzLCAgNzcsICA3MiwgIDczLCAgNTksICA1NCwKKyAgICA1MCwgIDM2LCAgMzIsICAxMiwgIDAsICAgMCwgICAxOTUsIDE1OSwgMTMxLCAxNzMsIDE0MiwgMTE3LCAxNTMsIDEyNywgMTA0LAorICAgIDEzMiwgMTEwLCA5MCwgIDExMywgOTMsICA3NiwgIDkzLCAgNzYsICA2MSwgIDc0LCAgNTksICA0NSwgIDQ5LCAgMzYsICAyMywKKyAgICA5LCAgIDAsICAgMCwgICAxOTYsIDE1OCwgMTEzLCAxNzQsIDE0MSwgMTAxLCAxNTUsIDEyNiwgODksICAxMzMsIDEwOSwgNzYsCisgICAgMTEzLCA5MywgIDY0LCAgOTQsICA3NiwgIDUxLCAgNzQsICA1OCwgIDM1LCAgNDksICAzNiwgIDE0LCAgNiwgICAwLCAgIDAsCisgICAgMTk3LCAxNTcsIDkyLCAgMTc0LCAxNDEsIDgwLCAgMTU0LCAxMjUsIDcxLCAgMTM0LCAxMDgsIDYwLCAgMTE0LCA5MiwgIDUwLAorICAgIDk0LCAgNzUsICAzNywgIDczLCAgNTgsICAyMiwgIDQ4LCAgMzYsICAxLCAgIDUsICAgMCwgICAwLCAgIDE5NywgMTU3LCA2OCwKKyAgICAxNzUsIDE0MCwgNTksICAxNTUsIDEyNCwgNTEsICAxMzQsIDEwOCwgNDEsICAxMTMsIDkxLCAgMzIsICA5NCwgIDc1LCAgMjEsCisgICAgNzMsICA1NywgIDUsICAgNDgsICAzNSwgIDAsICAgNSwgICAwLCAgIDAsICAgMTk4LCAxNTYsIDQ2LCAgMTc2LCAxNDAsIDQwLAorICAgIDE1NSwgMTI0LCAzMiwgIDEzNCwgMTA3LCAyNCwgIDExNCwgOTEsICAxNCwgIDk0LCAgNzUsICAyLCAgIDczLCAgNTcsICAwLAorICAgIDQ4LCAgMzYsICAwLCAgIDMsICAgMCwgICAwLCAgIDE4OSwgMTQwLCAxOTEsIDE2OCwgMTI2LCAxNzIsIDE1MCwgMTEyLCAxNTQsCisgICAgMTMxLCA5NywgIDEzNCwgMTEyLCA4MiwgIDExNSwgOTQsICA2NiwgIDk2LCAgNzQsICA0OSwgIDc1LCAgNTEsICAyNSwgIDUwLAorICAgIDEyLCAgMCwgICAxMCwgIDE5MSwgMTM5LCAxNzMsIDE3MCwgMTI1LCAxNTQsIDE1MiwgMTExLCAxMzgsIDEzMiwgOTYsICAxMjEsCisgICAgMTEzLCA4MSwgIDEwMywgOTQsICA2NiwgIDg1LCAgNzQsICA0OCwgIDY2LCAgNTAsICAyNiwgIDQyLCAgMTIsICAwLCAgIDEsCisgICAgMTkyLCAxMzksIDE1NywgMTcxLCAxMjUsIDE0MCwgMTUyLCAxMTEsIDEyNSwgMTMyLCA5NiwgIDEwOSwgMTEzLCA4MSwgIDkyLAorICAgIDk0LCAgNjUsICA3NiwgIDc0LCAgNDgsICA1OCwgIDUwLCAgMjYsICAzNSwgIDksICAgMCwgICAwLCAgIDE5MywgMTM5LCAxNDAsCisgICAgMTcyLCAxMjQsIDEyNSwgMTUzLCAxMTAsIDExMiwgMTMzLCA5NSwgIDk2LCAgMTEzLCA4MCwgIDgyLCAgOTQsICA2NSwgIDY2LAorICAgIDc0LCAgNDksICA1MCwgIDUwLCAgMjYsICAyOCwgIDcsICAgMCwgICAwLCAgIDE5NCwgMTM4LCAxMjMsIDE3MiwgMTIzLCAxMDksCisgICAgMTUzLCAxMTAsIDk3LCAgMTMzLCA5NSwgIDg0LCAgMTEzLCA4MCwgIDcwLCAgOTQsICA2NSwgIDU2LCAgNzQsICA0OCwgIDQwLAorICAgIDUwLCAgMjYsICAyMCwgIDYsICAgMCwgICAwLCAgIDE5NCwgMTM4LCAxMDUsIDE3MywgMTIzLCA5NCwgIDE1MywgMTA5LCA4MywKKyAgICAxMzMsIDk0LCAgNzAsICAxMTIsIDc5LCAgNTksICA5NCwgIDY0LCAgNDYsICA3NCwgIDQ4LCAgMzEsICA1MCwgIDI2LCAgOSwKKyAgICA0LCAgIDAsICAgMCwgICAxOTYsIDEzOCwgODcsICAxNzQsIDEyMiwgNzcsICAxNTMsIDEwOSwgNjcsICAxMzMsIDkzLCAgNTYsCisgICAgMTEzLCA3OSwgIDQ2LCAgOTQsICA2NCwgIDM0LCAgNzMsICA0OCwgIDE4LCAgNDksICAyNywgIDAsICAgNCwgICAwLCAgIDAsCisgICAgMTk2LCAxMzcsIDY1LCAgMTc0LCAxMjIsIDU3LCAgMTU0LCAxMDgsIDQ5LCAgMTMzLCA5MywgIDM5LCAgMTEzLCA3OSwgIDI5LAorICAgIDk0LCAgNjQsICAxOCwgIDc0LCAgNDgsICAzLCAgIDQ5LCAgMjcsICAwLCAgIDIsICAgMCwgICAwLCAgIDE5NywgMTM3LCA0NywKKyAgICAxNzUsIDEyMiwgNDAsICAxNTUsIDEwOCwgMzIsICAxMzMsIDkzLCAgMjMsICAxMTQsIDc5LCAgMTQsICA5NCwgIDY0LCAgMSwKKyAgICA3MywgIDQ4LCAgMCwgICA0OCwgIDI3LCAgMCwgICAyLCAgIDAsICAgMCwgICAxODksIDExOSwgMTc3LCAxNjgsIDEwNiwgMTU5LAorICAgIDE1MCwgOTQsICAxNDIsIDEzMSwgODEsICAxMjQsIDExMywgNjcsICAxMDcsIDk0LCAgNTMsICA4OSwgIDc0LCAgMzcsICA2OSwKKyAgICA1MSwgIDExLCAgNDUsICA2LCAgIDAsICAgMywgICAxOTEsIDExOSwgMTYxLCAxNzAsIDEwNiwgMTQ0LCAxNTIsIDk0LCAgMTI5LAorICAgIDEzMiwgODEsICAxMTIsIDExMywgNjcsICA5NiwgIDk0LCAgNTMsICA3OSwgIDc0LCAgMzcsICA2MSwgIDUxLCAgMTMsICAzOCwKKyAgICA2LCAgIDAsICAgMCwgICAxOTIsIDExOSwgMTQ2LCAxNzAsIDEwNiwgMTMxLCAxNTIsIDk0LCAgMTE3LCAxMzIsIDgwLCAgMTAxLAorICAgIDExMiwgNjcsICA4NSwgIDk0LCAgNTMsICA3MCwgIDc0LCAgMzcsICA1MywgIDUwLCAgMTQsICAzMSwgIDQsICAgMCwgICAwLAorICAgIDE5MiwgMTE5LCAxMzEsIDE3MSwgMTA2LCAxMTcsIDE1MywgOTQsICAxMDUsIDEzMiwgODAsICA4OSwgIDExMywgNjcsICA3NSwKKyAgICA5NCwgIDU0LCAgNjEsICA3NCwgIDM4LCAgNDUsICA1MSwgIDE0LCAgMjMsICAzLCAgIDAsICAgMCwgICAxOTMsIDExOCwgMTE0LAorICAgIDE3MSwgMTA2LCAxMDIsIDE1MywgOTMsICA5MCwgIDEzMiwgODAsICA3OCwgIDExMywgNjcsICA2NSwgIDk0LCAgNTMsICA1MiwKKyAgICA3NCwgIDM3LCAgMzYsICA1MCwgIDE1LCAgMTYsICAxLCAgIDAsICAgMCwgICAxOTQsIDExOCwgOTksICAxNzIsIDEwNSwgODksCisgICAgMTUzLCA5MywgIDc4LCAgMTMyLCA4MCwgIDY2LCAgMTEzLCA2NywgIDU0LCAgOTQsICA1MywgIDQyLCAgNzQsICAzOCwgIDI3LAorICAgIDUwLCAgMTYsICA1LCAgIDEsICAgMCwgICAwLCAgIDE5NCwgMTE4LCA4MiwgIDE3MywgMTA1LCA3MiwgIDE1MywgOTMsICA2MywKKyAgICAxMzIsIDc5LCAgNTMsICAxMTMsIDY3LCAgNDIsICA5NCwgIDUzLCAgMzAsICA3NCwgIDM4LCAgMTUsICA0OSwgIDE2LCAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAxOTUsIDExNywgNjMsICAxNzMsIDEwNSwgNTUsICAxNTQsIDkzLCAgNDcsICAxMzMsIDc5LCAgMzcsCisgICAgMTEzLCA2NiwgIDI3LCAgOTQsICA1MywgIDE1LCAgNzMsICAzOCwgIDAsICAgNDgsICAxNiwgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMTk1LCAxMTcsIDQ2LCAgMTczLCAxMDQsIDM5LCAgMTU0LCA5MiwgIDMyLCAgMTMzLCA3OSwgIDIyLCAgMTEzLCA2NiwgIDEzLAorICAgIDk0LCAgNTMsICAwLCAgIDczLCAgMzgsICAwLCAgIDQ4LCAgMTcsICAwLCAgIDAsICAgMCwgICAwLCAgIDE4OSwgOTYsICAxNjYsCisgICAgMTY4LCA4NSwgIDE0NywgMTUwLCA3NCwgIDEzMiwgMTMxLCA2MiwgIDExNSwgMTEzLCA1MSwgIDk5LCAgOTQsICAzOCwgIDgyLAorICAgIDc0LCAgMjEsICA2MywgIDUxLCAgMCwgICA0MCwgIDEsICAgMCwgICAwLCAgIDE5MCwgOTYsICAxNTAsIDE3MCwgODUsICAxMzMsCisgICAgMTUyLCA3NSwgIDExOSwgMTMyLCA2MywgIDEwNCwgMTEzLCA1MSwgIDg4LCAgOTQsICAzOCwgIDcyLCAgNzUsICAyMiwgIDU1LAorICAgIDUxLCAgMCwgICAzMywgIDEsICAgMCwgICAwLCAgIDE5MiwgOTYsICAxMzcsIDE3MCwgODUsICAxMjEsIDE1MiwgNzQsICAxMDgsCisgICAgMTMyLCA2NCwgIDk0LCAgMTEzLCA1MiwgIDc5LCAgOTQsICAzOSwgIDY0LCAgNzQsICAyMywgIDQ4LCAgNTAsICAwLCAgIDI2LAorICAgIDAsICAgMCwgICAwLCAgIDE5MiwgOTYsICAxMjIsIDE3MSwgODYsICAxMDksIDE1MiwgNzUsICA5NiwgIDEzMiwgNjMsICA4MywKKyAgICAxMTMsIDUyLCAgNjksICA5NCwgIDM5LCAgNTYsICA3NCwgIDI0LCAgNDEsICA1MCwgIDAsICAgMTksICAwLCAgIDAsICAgMCwKKyAgICAxOTMsIDk2LCAgMTA3LCAxNzEsIDg1LCAgOTYsICAxNTIsIDc1LCAgODQsICAxMzIsIDY0LCAgNzIsICAxMTMsIDUyLCAgNjAsCisgICAgOTQsICAzOSwgIDQ3LCAgNzQsICAyNCwgIDMyLCAgNTAsICAxLCAgIDEwLCAgMCwgICAwLCAgIDAsICAgMTkzLCA5NiwgIDkzLAorICAgIDE3MiwgODUsICA4MiwgIDE1MiwgNzUsICA3MiwgIDEzMywgNjMsICA2MSwgIDExMywgNTEsICA0OSwgIDk0LCAgMzksICAzNywKKyAgICA3MywgIDI1LCAgMjMsICA0OSwgIDIsICAgMiwgICAwLCAgIDAsICAgMCwgICAxOTQsIDk2LCAgNzgsICAxNzIsIDg1LCAgNjgsCisgICAgMTUyLCA3NSwgIDU5LCAgMTMyLCA2MywgIDQ5LCAgMTEzLCA1MiwgIDM5LCAgOTQsICA0MCwgIDI2LCAgNzMsICAyNSwgIDExLAorICAgIDQ4LCAgMywgICAwLCAgIDAsICAgMCwgICAwLCAgIDE5NCwgOTYsICA2MCwgIDE3MywgODUsICA1MiwgIDE1MywgNzUsICA0NCwKKyAgICAxMzIsIDY0LCAgMzUsICAxMTIsIDUyLCAgMjUsICA5NCwgIDQwLCAgMTIsICA3MywgIDI2LCAgMCwgICA0OCwgIDQsICAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAxOTUsIDk2LCAgNDYsICAxNzMsIDg1LCAgMzgsICAxNTQsIDc0LCAgMzEsICAxMzMsIDYzLCAgMjIsCisgICAgMTEzLCA1MiwgIDExLCAgOTMsICA0MCwgIDAsICAgNzMsICAyNiwgIDAsICAgNDcsICA1LCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMTg4LCA2NywgIDE1MywgMTY4LCA1OCwgIDEzNywgMTUxLCA0OSwgIDEyMiwgMTMxLCAzOSwgIDEwNiwgMTEzLCAyOCwgIDkwLAorICAgIDk0LCAgMTMsICA3NSwgIDc1LCAgMCwgICA1NywgIDUxLCAgMCwgICAzNSwgIDAsICAgMCwgICAwLCAgIDE5MCwgNjgsICAxMzgsCisgICAgMTcwLCA1OSwgIDEyMywgMTUyLCA1MCwgIDExMCwgMTMyLCA0MSwgIDk2LCAgMTEzLCAyOSwgIDgwLCAgOTQsICAxNiwgIDY2LAorICAgIDc1LCAgMCwgICA0OSwgIDUwLCAgMCwgICAyNywgIDAsICAgMCwgICAwLCAgIDE5MSwgNjksICAxMjYsIDE3MCwgNTksICAxMTIsCisgICAgMTUxLCA1MiwgIDEwMCwgMTMyLCA0MiwgIDg2LCAgMTEzLCAzMCwgIDczLCAgOTUsICAxNywgIDU4LCAgNzUsICAwLCAgIDQyLAorICAgIDUwLCAgMCwgICAyMSwgIDAsICAgMCwgICAwLCAgIDE5MiwgNzAsICAxMTMsIDE3MCwgNjEsICAxMDAsIDE1MSwgNTIsICA4OSwKKyAgICAxMzIsIDQyLCAgNzcsICAxMTMsIDMxLCAgNjQsICA5NCwgIDE5LCAgNTAsICA3NCwgIDEsICAgMzUsICA1MCwgIDAsICAgMTQsCisgICAgMCwgICAwLCAgIDAsICAgMTkyLCA3MCwgIDEwMCwgMTcwLCA2MiwgIDg5LCAgMTUxLCA1MywgIDc3LCAgMTMxLCA0MywgIDY2LAorICAgIDExMiwgMzIsICA1NCwgIDk0LCAgMjAsICA0MiwgIDc0LCAgMiwgICAyNywgIDQ5LCAgMCwgICA1LCAgIDAsICAgMCwgICAwLAorICAgIDE5MiwgNzEsICA4NywgIDE3MSwgNjEsICA3NywgIDE1MiwgNTMsICA2NywgIDEzMSwgNDQsICA1NywgIDExMiwgMzMsICA0NSwKKyAgICA5NCwgIDIxLCAgMzMsICA3NCwgIDQsICAgMTksICA0OSwgIDAsICAgMSwgICAwLCAgIDAsICAgMCwgICAxOTMsIDcxLCAgNzQsCisgICAgMTcxLCA2MiwgIDY0LCAgMTUyLCA1MywgIDU1LCAgMTMyLCA0NCwgIDQ1LCAgMTEzLCAzNCwgIDM0LCAgOTQsICAyMiwgIDIzLAorICAgIDczLCAgNSwgICA3LCAgIDQ4LCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDE5MywgNzAsICA1OCwgIDE3MiwgNjIsICA1MCwKKyAgICAxNTIsIDU0LCAgNDIsICAxMzIsIDQ0LCAgMzIsICAxMTIsIDM1LCAgMjIsICA5MywgIDIzLCAgMTAsICA3MywgIDYsICAgMCwKKyAgICA0NywgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxOTMsIDcwLCAgNDUsICAxNzIsIDYyLCAgMzgsICAxNTMsIDU0LCAgMzEsCisgICAgMTMyLCA0NCwgIDIxLCAgMTEyLCAzNSwgIDksICAgOTQsICAyMywgIDAsICAgNzMsICA3LCAgIDAsICAgNDcsICAwLCAgIDAsCisgICAgMCwgICAwLCAgIDAsICAgMTg5LCAyNiwgIDE0MSwgMTY5LCAxNSwgIDEyNiwgMTUwLCAyLCAgIDExMiwgMTMxLCAwLCAgIDk3LAorICAgIDExMywgMCwgICA4MiwgIDk0LCAgMCwgICA2NywgIDc1LCAgMCwgICA1MSwgIDUwLCAgMCwgICAyOSwgIDAsICAgMCwgICAwLAorICAgIDE5MCwgMjgsICAxMjgsIDE3MCwgMTgsICAxMTQsIDE1MSwgOCwgICAxMDEsIDEzMiwgMCwgICA4OCwgIDExMywgMCwgICA3NCwKKyAgICA5NCwgIDAsICAgNjAsICA3NSwgIDAsICAgNDQsICA1MCwgIDAsICAgMjMsICAwLCAgIDAsICAgMCwgICAxOTEsIDMwLCAgMTE3LAorICAgIDE3MCwgMjMsICAxMDQsIDE1MiwgMTEsICA5MiwgIDEzMiwgMSwgICA3OSwgIDExMywgMCwgICA2NywgIDk1LCAgMCwgICA1MywKKyAgICA3NSwgIDAsICAgMzcsICA1MCwgIDAsICAgMTcsICAwLCAgIDAsICAgMCwgICAxOTEsIDMzLCAgMTA1LCAxNzAsIDI2LCAgOTMsCisgICAgMTUxLCAxOCwgIDgzLCAgMTMyLCA2LCAgIDcwLCAgMTEyLCAwLCAgIDU4LCAgOTQsICAwLCAgIDQ1LCAgNzUsICAwLCAgIDMwLAorICAgIDQ5LCAgMCwgICA4LCAgIDAsICAgMCwgICAwLCAgIDE5MSwgMzQsICA5MywgIDE3MCwgMjcsICA4MiwgIDE1MSwgMjAsICA3MiwKKyAgICAxMzEsIDgsICAgNjEsICAxMTIsIDAsICAgNDksICA5NCwgIDAsICAgMzgsICA3NCwgIDAsICAgMjMsICA0OSwgIDAsICAgNCwKKyAgICAwLCAgIDAsICAgMCwgICAxOTEsIDM2LCAgODIsICAxNzAsIDI5LCAgNzEsICAxNTEsIDIyLCAgNjMsICAxMzEsIDExLCAgNTIsCisgICAgMTEyLCAwLCAgIDQxLCAgOTMsICAwLCAgIDI5LCAgNzQsICAwLCAgIDE0LCAgNDgsICAwLCAgIDEsICAgMCwgICAwLCAgIDAsCisgICAgMTkxLCAzOCwgIDY5LCAgMTcwLCAzMSwgIDYwLCAgMTUxLCAyNCwgIDUxLCAgMTMxLCAxNCwgIDQxLCAgMTEyLCAxLCAgIDMxLAorICAgIDkzLCAgMCwgICAxOSwgIDczLCAgMCwgICAzLCAgIDQ4LCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDE5MiwgMzcsICA1NiwKKyAgICAxNzEsIDMxLCAgNDcsICAxNTIsIDI1LCAgNDAsICAxMzEsIDE3LCAgMzAsICAxMTIsIDQsICAgMTksICA5MywgIDAsICAgNywKKyAgICA3MywgIDAsICAgMCwgICA0NywgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxOTIsIDM4LCAgNDUsICAxNzEsIDMzLCAgMzYsCisgICAgMTUyLCAyNiwgIDMwLCAgMTMxLCAxOCwgIDIxLCAgMTExLCA3LCAgIDksICAgOTMsICAwLCAgIDAsICAgNzMsICAwLCAgIDAsCisgICAgNDcsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTQ5LCAyMTgsIDI0OCwgMTMzLCAxOTQsIDIyMiwgMTE5LCAxNzMsIDE5OCwKKyAgICAxMDIsIDE1MSwgMTczLCA4NiwgIDEzMCwgMTQ4LCA3MCwgIDEwOCwgMTI1LCA1MywgIDg1LCAgMTAwLCAzMiwgIDU5LCAgNzEsCisgICAgMCwgICAyMiwgIDMzLCAgMTU0LCAyMTYsIDIyMywgMTM3LCAxOTMsIDIwMCwgMTIyLCAxNzIsIDE3OCwgMTA2LCAxNTAsIDE1NiwKKyAgICA4OSwgIDEyOCwgMTMzLCA3MywgIDEwNywgMTEyLCA1NCwgIDg1LCAgODksICAzMSwgIDU5LCAgNjMsICAwLCAgIDIyLCAgMjYsCisgICAgMTU5LCAyMTUsIDIwMiwgMTQxLCAxOTIsIDE4MSwgMTI2LCAxNzEsIDE2MSwgMTA4LCAxNDksIDE0MSwgOTAsICAxMjgsIDEyMSwKKyAgICA3NCwgIDEwNywgMTAwLCA1NSwgIDg1LCAgODAsICAzMiwgIDU4LCAgNTUsICAwLCAgIDIyLCAgMTksICAxNjEsIDIxMywgMTc5LAorICAgIDE0NCwgMTkwLCAxNjAsIDEyNiwgMTcwLCAxNDMsIDEwOSwgMTQ4LCAxMjUsIDkyLCAgMTI3LCAxMDcsIDc0LCAgMTA2LCA4OSwKKyAgICA1NiwgIDg0LCAgNjksICAzMiwgIDU4LCAgNDYsICAwLCAgIDIxLCAgMTEsICAxNjMsIDIxMSwgMTU2LCAxNDQsIDE4OSwgMTM5LAorICAgIDEyOSwgMTY4LCAxMjUsIDExMCwgMTQ3LCAxMDgsIDkzLCAgMTI2LCA5MiwgIDc1LCAgMTA1LCA3NiwgIDU3LCAgODMsICA1OCwKKyAgICAzMywgIDU4LCAgMzcsICAwLCAgIDIxLCAgMSwgICAxNjcsIDIxMSwgMTMzLCAxNDcsIDE4OCwgMTIwLCAxMzAsIDE2NywgMTA1LAorICAgIDExMCwgMTQ1LCA5MiwgIDkzLCAgMTI1LCA3OCwgIDc2LCAgMTA0LCA2NCwgIDU4LCAgODMsICA0OCwgIDMzLCAgNTcsICAyNywKKyAgICAwLCAgIDIxLCAgMCwgICAxNjksIDIxMCwgMTA4LCAxNDksIDE4NywgOTYsICAxMzEsIDE2NiwgODYsICAxMTIsIDE0NCwgNzQsCisgICAgOTQsICAxMjQsIDYyLCAgNzcsICAxMDMsIDQ5LCAgNTgsICA4MiwgIDM1LCAgMzMsICA1NywgIDE1LCAgMCwgICAyMSwgIDAsCisgICAgMTcwLCAyMDksIDgwLCAgMTUxLCAxODYsIDcxLCAgMTMzLCAxNjUsIDYyLCAgMTE0LCAxNDMsIDUyLCAgOTUsICAxMjMsIDQyLAorICAgIDc3LCAgMTAzLCAzMiwgIDU4LCAgODEsICAxOCwgIDMzLCAgNTYsICAwLCAgIDAsICAgMjEsICAwLCAgIDE3MywgMjA4LCA1NSwKKyAgICAxNTIsIDE4NiwgNDksICAxMzQsIDE2NSwgNDEsICAxMTQsIDE0MywgMzQsICA5NSwgIDEyMiwgMjUsICA3NywgIDEwMiwgMTQsCisgICAgNTgsICA4MSwgIDAsICAgMzMsICA1NiwgIDAsICAgMCwgICAyMSwgIDAsICAgMTU0LCAxOTUsIDIzMiwgMTM3LCAxNzQsIDIwNywKKyAgICAxMjIsIDE1NiwgMTg1LCAxMDUsIDEzNiwgMTYzLCA4OSwgIDExNiwgMTQwLCA3MywgIDk3LCAgMTE3LCA1NiwgIDc2LCAgOTQsCisgICAgMzUsICA1MSwgIDY2LCAgMCwgICAxMywgIDI4LCAgMTU4LCAxOTQsIDIwOSwgMTQxLCAxNzQsIDE4NywgMTI1LCAxNTUsIDE2NywKKyAgICAxMDksIDEzNSwgMTQ2LCA5MSwgIDExNiwgMTI1LCA3NSwgIDk2LCAgMTA1LCA1NywgIDc1LCAgODMsICAzNSwgIDUwLCAgNTcsCisgICAgMCwgICAxMiwgIDIxLCAgMTYxLCAxOTMsIDE4OSwgMTQ0LCAxNzMsIDE2OSwgMTI4LCAxNTQsIDE1MSwgMTEwLCAxMzQsIDEzMiwKKyAgICA5MywgIDExNSwgMTEzLCA3NywgIDk1LCAgOTQsICA1OCwgIDc1LCAgNzQsICAzNSwgIDUwLCAgNTAsICAwLCAgIDEyLCAgMTMsCisgICAgMTY0LCAxOTIsIDE2OCwgMTQ1LCAxNzEsIDE1MSwgMTI5LCAxNTMsIDEzNCwgMTExLCAxMzMsIDExNywgOTQsICAxMTQsIDEwMCwKKyAgICA3NiwgIDk1LCAgODIsICA1OCwgIDc1LCAgNjQsICAzNiwgIDUwLCAgNDIsICAwLCAgIDEyLCAgNSwgICAxNjUsIDE5MSwgMTQ3LAorICAgIDE0NywgMTcwLCAxMzEsIDEzMCwgMTUyLCAxMTcsIDExMywgMTMyLCAxMDIsIDk1LCAgMTEzLCA4NiwgIDc3LCAgOTQsICA3MSwKKyAgICA1OCwgIDc0LCAgNTQsICAzNSwgIDUwLCAgMzMsICAwLCAgIDEzLCAgMCwgICAxNjcsIDE4OSwgMTI2LCAxNDgsIDE2OSwgMTEzLAorICAgIDEzMiwgMTUxLCAxMDAsIDExMywgMTMxLCA4NiwgIDk2LCAgMTEyLCA3MywgIDc3LCAgOTMsICA1OSwgIDU5LCAgNzMsICA0MywKKyAgICAzNSwgIDQ5LCAgMjMsICAwLCAgIDEyLCAgMCwgICAxNzAsIDE4OSwgMTA0LCAxNTAsIDE2OCwgOTEsICAxMzMsIDE1MCwgODEsCisgICAgMTE0LCAxMzAsIDY5LCAgOTYsICAxMTEsIDU3LCAgNzgsICA5MiwgIDQ2LCAgNTksICA3MywgIDMxLCAgMzUsICA0OSwgIDExLAorICAgIDAsICAgMTMsICAwLCAgIDE3MSwgMTg4LCA3OCwgIDE1MiwgMTY4LCA2OCwgIDEzNCwgMTQ5LCA2MCwgIDExNSwgMTMwLCA1MCwKKyAgICA5NiwgIDExMSwgNDEsICA3OCwgIDkyLCAgMjksICA2MCwgIDczLCAgMTUsICAzNSwgIDQ5LCAgMCwgICAwLCAgIDEyLCAgMCwKKyAgICAxNzMsIDE4NywgNTUsICAxNTMsIDE2NywgNDcsICAxMzQsIDE0OSwgMzksICAxMTUsIDEyOSwgMzMsICA5NywgIDExMCwgMjQsCisgICAgNzksICA5MiwgIDEzLCAgNjAsICA3MiwgIDAsICAgMzUsICA0OCwgIDAsICAgMCwgICAxMiwgIDAsICAgMTU3LCAxNzUsIDIxNywKKyAgICAxMzksIDE1NywgMTk2LCAxMjUsIDE0MSwgMTc1LCAxMDksIDEyMiwgMTUzLCA5MiwgIDEwNCwgMTMyLCA3NiwgIDg2LCAgMTEwLAorICAgIDU5LCAgNjcsICA4OCwgIDM3LCAgNDMsICA2MSwgIDEsICAgMSwgICAyMywgIDE2MSwgMTc0LCAxOTYsIDE0NCwgMTU2LCAxNzYsCisgICAgMTI3LCAxNDAsIDE1OCwgMTEwLCAxMjEsIDEzNywgOTQsICAxMDQsIDExOCwgNzcsICA4NSwgIDk4LCAgNTksICA2NywgIDc4LAorICAgIDM3LCAgNDMsICA1MywgIDAsICAgMiwgICAxNiwgIDE2MywgMTc0LCAxNzgsIDE0NiwgMTU2LCAxNjAsIDEzMCwgMTM5LCAxNDMsCisgICAgMTEyLCAxMjEsIDEyNCwgOTUsICAxMDMsIDEwNiwgNzgsICA4NSwgIDg4LCAgNjAsICA2NiwgIDY5LCAgMzcsICA0MiwgIDQ2LAorICAgIDAsICAgMiwgICA3LCAgIDE2NiwgMTczLCAxNTksIDE0NywgMTU0LCAxNDIsIDEzMCwgMTM4LCAxMjcsIDExMywgMTIwLCAxMTEsCisgICAgOTYsICAxMDMsIDk1LCAgNzgsICA4NCwgIDc3LCAgNjAsICA2NiwgIDU5LCAgMzcsICA0MywgIDM3LCAgMCwgICAyLCAgIDAsCisgICAgMTY2LCAxNzIsIDEzOSwgMTQ4LCAxNTQsIDEyNSwgMTMxLCAxMzcsIDExMiwgMTEzLCAxMjAsIDk2LCAgOTYsICAxMDIsIDgxLAorICAgIDc4LCAgODQsICA2NiwgIDYwLCAgNjUsICA1MCwgIDM3LCAgNDIsICAyOSwgIDAsICAgMywgICAwLCAgIDE2NywgMTcxLCAxMjAsCisgICAgMTQ5LCAxNTMsIDEwNywgMTMzLCAxMzcsIDk1LCAgMTE0LCAxMTgsIDgxLCAgOTcsICAxMDEsIDY5LCAgNzksICA4NCwgIDU2LAorICAgIDYwLCAgNjUsICA0MCwgIDM3LCAgNDIsICAxOSwgIDAsICAgMywgICAwLCAgIDE3MCwgMTcwLCA5OSwgIDE1MSwgMTUyLCA4NywKKyAgICAxMzQsIDEzNiwgNzcsICAxMTUsIDExOCwgNjYsICA5NywgIDEwMSwgNTUsICA3OSwgIDgzLCAgNDIsICA2MSwgIDY1LCAgMjgsCisgICAgMzcsICA0MiwgIDcsICAgMCwgICAzLCAgIDAsICAgMTcyLCAxNzAsIDc1LCAgMTUyLCAxNTEsIDY1LCAgMTM0LCAxMzUsIDU3LAorICAgIDExNSwgMTE3LCA0OCwgIDk3LCAgMTAwLCAzOCwgIDc5LCAgODMsICAyNywgIDYxLCAgNjQsICAxMiwgIDM2LCAgNDIsICAwLAorICAgIDAsICAgMywgICAwLCAgIDE3MiwgMTY5LCA1NSwgIDE1NCwgMTUxLCA0NiwgIDEzNSwgMTM0LCA0MCwgIDExNiwgMTE2LCAzMiwKKyAgICA5NywgIDk5LCAgMjEsICA4MCwgIDgyLCAgMTAsICA2MSwgIDY0LCAgMCwgICAzNiwgIDQxLCAgMCwgICAwLCAgIDMsICAgMCwKKyAgICAxNjAsIDE1NCwgMjAzLCAxNDMsIDEzOSwgMTgyLCAxMjcsIDEyNCwgMTY0LCAxMTEsIDEwNywgMTQzLCA5NSwgIDkxLCAgMTIyLAorICAgIDc4LCAgNzUsICAxMDMsIDYwLCAgNTcsICA4MSwgIDM5LCAgMzMsICA1NiwgIDEsICAgMCwgICAxOCwgIDE2MywgMTU0LCAxODQsCisgICAgMTQ2LCAxMzgsIDE2NSwgMTMwLCAxMjMsIDE0OCwgMTEzLCAxMDcsIDEyOSwgOTYsICA5MCwgIDExMCwgNzksICA3NCwgIDkyLAorICAgIDYxLCAgNTYsICA3MiwgIDM5LCAgMzQsICA0OCwgIDIsICAgMCwgICA5LCAgIDE2NSwgMTU0LCAxNjcsIDE0NywgMTM3LCAxNDksCisgICAgMTMxLCAxMjIsIDEzNCwgMTE0LCAxMDYsIDExNywgOTYsICA5MCwgIDEwMCwgNzksICA3NCwgIDgyLCAgNjEsICA1NiwgIDY0LAorICAgIDM5LCAgMzMsICA0MCwgIDIsICAgMCwgICAxLCAgIDE2NiwgMTUzLCAxNTAsIDE0OSwgMTM3LCAxMzMsIDEzMiwgMTIyLCAxMTksCisgICAgMTE0LCAxMDYsIDEwNCwgOTcsICA5MCwgIDg4LCAgNzksICA3NCwgIDcyLCAgNjEsICA1NiwgIDU1LCAgMzksICAzNCwgIDMzLAorICAgIDAsICAgMCwgICAwLCAgIDE2OCwgMTUyLCAxMzIsIDE0OSwgMTM2LCAxMTcsIDEzMiwgMTIxLCAxMDQsIDExNCwgMTA1LCA5MCwKKyAgICA5NywgIDg5LCAgNzYsICA3OSwgIDczLCAgNjIsICA2MSwgIDU2LCAgNDYsICAzOCwgIDM0LCAgMjUsICAwLCAgIDAsICAgMCwKKyAgICAxNjksIDE1MSwgMTE0LCAxNTAsIDEzNSwgMTAxLCAxMzMsIDEyMSwgOTAsICAxMTQsIDEwNCwgNzcsICA5NywgIDg5LCAgNjUsCisgICAgODAsICA3MywgIDUxLCAgNjEsICA1NiwgIDM2LCAgMzgsICAzNCwgIDE2LCAgMCwgICAwLCAgIDAsICAgMTcwLCAxNTAsIDk0LAorICAgIDE1MSwgMTM1LCA4MywgIDEzNCwgMTIwLCA3MywgIDExNSwgMTA0LCA2MiwgIDk4LCAgODgsICA1MSwgIDgwLCAgNzIsICAzOSwKKyAgICA2MSwgIDU2LCAgMjQsICAzOCwgIDM0LCAgMywgICAwLCAgIDAsICAgMCwgICAxNzIsIDE1MCwgNzIsICAxNTMsIDEzNCwgNjMsCisgICAgMTM1LCAxMTksIDU1LCAgMTE1LCAxMDMsIDQ1LCAgOTgsICA4OCwgIDM2LCAgODAsICA3MiwgIDI0LCAgNjEsICA1NSwgIDksCisgICAgMzgsICAzNCwgIDAsICAgMCwgICAwLCAgIDAsICAgMTcyLCAxNTAsIDU0LCAgMTUzLCAxMzQsIDQ3LCAgMTM1LCAxMTksIDM4LAorICAgIDExNiwgMTAzLCAzMCwgIDk4LCAgODcsICAyMSwgIDgwLCAgNzIsICA4LCAgIDYyLCAgNTUsICAwLCAgIDM3LCAgMzQsICAwLAorICAgIDAsICAgMCwgICAwLCAgIDE2MiwgMTM0LCAxOTAsIDE0NSwgMTIwLCAxNzEsIDEyOSwgMTA4LCAxNTMsIDExMywgOTMsICAxMzQsCisgICAgOTcsICA3OCwgIDExNSwgODAsICA2MywgIDk2LCAgNjIsICA0NiwgIDc1LCAgNDEsICAyMywgIDUxLCAgMCwgICAwLCAgIDExLAorICAgIDE2NSwgMTM0LCAxNzMsIDE0NywgMTIwLCAxNTQsIDEzMSwgMTA3LCAxMzgsIDExNCwgOTIsICAxMjAsIDk3LCAgNzgsICAxMDMsCisgICAgODAsICA2MywgIDg1LCAgNjIsICA0NiwgIDY2LCAgNDAsICAyMywgIDQzLCAgMCwgICAwLCAgIDIsICAgMTY2LCAxMzQsIDE1NywKKyAgICAxNDgsIDEyMCwgMTQwLCAxMzIsIDEwNiwgMTI1LCAxMTQsIDkyLCAgMTA5LCA5NywgIDc3LCAgOTMsICA4MSwgIDYzLCAgNzcsCisgICAgNjIsICA0NiwgIDU4LCAgNDAsICAyNCwgIDM2LCAgMCwgICAwLCAgIDAsICAgMTY4LCAxMzMsIDE0MCwgMTQ5LCAxMTksIDEyNSwKKyAgICAxMzIsIDEwNiwgMTEyLCAxMTUsIDkyLCAgOTcsICA5OCwgIDc3LCAgODIsICA4MSwgIDYyLCAgNjcsICA2MiwgIDQ2LCAgNTAsCisgICAgNDAsICAyNCwgIDI5LCAgMCwgICAwLCAgIDAsICAgMTY4LCAxMzMsIDEyMywgMTUwLCAxMTksIDExMCwgMTMzLCAxMDYsIDk3LAorICAgIDExNSwgOTEsICA4NCwgIDk4LCAgNzcsICA3MCwgIDgxLCAgNjIsICA1NywgIDYyLCAgNDYsICA0MSwgIDQwLCAgMjQsICAyMCwKKyAgICAwLCAgIDAsICAgMCwgICAxNjksIDEzMiwgMTA3LCAxNTAsIDExOCwgOTQsICAxMzMsIDEwNSwgODQsICAxMTUsIDkxLCAgNzIsCisgICAgOTgsICA3NiwgIDYwLCAgODAsICA2MiwgIDQ3LCAgNjIsICA0NiwgIDMyLCAgMzksICAyNSwgIDExLCAgMCwgICAwLCAgIDAsCisgICAgMTcxLCAxMzIsIDg5LCAgMTUyLCAxMTgsIDc5LCAgMTM1LCAxMDUsIDY5LCAgMTE1LCA5MCwgIDU4LCAgOTgsICA3NiwgIDQ3LAorICAgIDgwLCAgNjIsICAzNiwgIDYyLCAgNDYsICAyMSwgIDM5LCAgMjUsICAwLCAgIDAsICAgMCwgICAwLCAgIDE3MSwgMTMyLCA2OSwKKyAgICAxNTMsIDExNywgNjAsICAxMzUsIDEwNCwgNTIsICAxMTYsIDkwLCAgNDIsICA5OCwgIDc2LCAgMzMsICA4MSwgIDYxLCAgMjEsCisgICAgNjIsICA0NiwgIDYsICAgMzgsICAyNSwgIDAsICAgMCwgICAwLCAgIDAsICAgMTcyLCAxMzIsIDU0LCAgMTUzLCAxMTgsIDQ1LAorICAgIDEzNSwgMTA0LCAzOCwgIDExNiwgOTAsICAyOCwgIDk4LCAgNzYsICAxOCwgIDgxLCAgNjEsICA2LCAgIDYyLCAgNDYsICAwLAorICAgIDM4LCAgMjUsICAwLCAgIDAsICAgMCwgICAwLCAgIDE2NCwgMTE1LCAxNzcsIDE0NiwgMTAzLCAxNTksIDEzMCwgOTEsICAxNDMsCisgICAgMTE0LCA3OCwgIDEyNSwgOTcsICA2NSwgIDEwNywgODEsICA1MSwgIDg5LCAgNjMsICAzNCwgIDY5LCAgNDEsICA5LCAgIDQ2LAorICAgIDAsICAgMCwgICA0LCAgIDE2NiwgMTE1LCAxNjEsIDE0OCwgMTAzLCAxNDQsIDEzMiwgOTEsICAxMjksIDExNSwgNzgsICAxMTIsCisgICAgOTgsICA2NSwgIDk2LCAgODEsICA1MSwgIDc5LCAgNjMsICAzNSwgIDYxLCAgNDEsICAxMSwgIDM4LCAgMCwgICAwLCAgIDAsCisgICAgMTY3LCAxMTUsIDE0NiwgMTUwLCAxMDIsIDEzMSwgMTMyLCA5MSwgIDExNywgMTE1LCA3OCwgIDEwMSwgOTgsICA2NSwgIDg2LAorICAgIDgxLCAgNTEsICA3MSwgIDYzLCAgMzUsICA1NCwgIDQxLCAgMTIsICAzMiwgIDAsICAgMCwgICAwLCAgIDE2OCwgMTE0LCAxMzIsCisgICAgMTUwLCAxMDMsIDExOCwgMTMzLCA5MSwgIDEwNSwgMTE2LCA3OCwgIDkxLCAgOTgsICA2NCwgIDc2LCAgODIsICA1MSwgIDYxLAorICAgIDYzLCAgMzYsICA0NiwgIDQxLCAgMTMsICAyNCwgIDAsICAgMCwgICAwLCAgIDE2OSwgMTE0LCAxMTYsIDE1MCwgMTAyLCAxMDMsCisgICAgMTM0LCA5MCwgIDkxLCAgMTE2LCA3OCwgIDc5LCAgOTgsICA2NSwgIDY2LCAgODEsICA1MSwgIDUzLCAgNjMsICAzNiwgIDM3LAorICAgIDQwLCAgMTQsICAxNywgIDAsICAgMCwgICAwLCAgIDE2OSwgMTE0LCAxMDEsIDE1MSwgMTAxLCA4OSwgIDEzNCwgOTAsICA3OSwKKyAgICAxMTYsIDc3LCAgNjcsICA5OCwgIDY0LCAgNTYsICA4MSwgIDUxLCAgNDQsICA2MywgIDM2LCAgMjksICA0MCwgIDE1LCAgNywKKyAgICAwLCAgIDAsICAgMCwgICAxNzAsIDExNCwgODUsICAxNTIsIDEwMSwgNzUsICAxMzUsIDkwLCAgNjUsICAxMTYsIDc3LCAgNTQsCisgICAgOTgsICA2NCwgIDQ0LCAgODEsICA1MSwgIDMyLCAgNjMsICAzNiwgIDE3LCAgMzksICAxNSwgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMTcyLCAxMTMsIDY2LCAgMTUyLCAxMDEsIDU4LCAgMTM1LCA4OSwgIDQ5LCAgMTE2LCA3NywgIDQwLCAgOTksICA2NCwgIDMwLAorICAgIDgxLCAgNTEsICAxOCwgIDYyLCAgMzYsICAzLCAgIDM4LCAgMTYsICAwLCAgIDAsICAgMCwgICAwLCAgIDE3MSwgMTEzLCA1MSwKKyAgICAxNTMsIDEwMSwgNDQsICAxMzYsIDg5LCAgMzYsICAxMTYsIDc3LCAgMjgsICA5OSwgIDY0LCAgMTgsICA4MSwgIDUxLCAgNSwKKyAgICA2MiwgIDM2LCAgMCwgICAzOCwgIDE2LCAgMCwgICAwLCAgIDAsICAgMCwgICAxNjUsIDk0LCAgMTY2LCAxNDcsIDgyLCAgMTQ3LAorICAgIDEzMiwgNzIsICAxMzIsIDExNSwgNjEsICAxMTUsIDk4LCAgNDksICA5OSwgIDgyLCAgMzYsICA4MiwgIDY0LCAgMTksICA2NCwKKyAgICA0MiwgIDAsICAgNDEsICAwLCAgIDAsICAgMCwgICAxNjcsIDkzLCAgMTUwLCAxNTAsIDgzLCAgMTM0LCAxMzMsIDczLCAgMTIwLAorICAgIDExNiwgNjIsICAxMDQsIDk5LCAgNDksICA4OCwgIDgyLCAgMzYsICA3MiwgIDY0LCAgMjAsICA1NSwgIDQxLCAgMCwgICAzMywKKyAgICAwLCAgIDAsICAgMCwgICAxNjksIDkzLCAgMTM3LCAxNTAsIDgzLCAgMTIyLCAxMzQsIDczLCAgMTA5LCAxMTYsIDYxLCAgOTQsCisgICAgOTksICA1MCwgIDgwLCAgODIsICAzNywgIDY1LCAgNjQsICAyMSwgIDQ5LCAgNDEsICAwLCAgIDI3LCAgMCwgICAwLCAgIDAsCisgICAgMTY5LCA5NCwgIDEyMywgMTUwLCA4MywgIDExMCwgMTMzLCA3MywgIDk3LCAgMTE2LCA2MSwgIDgzLCAgOTksICA1MCwgIDcwLAorICAgIDgyLCAgMzgsICA1NywgIDYzLCAgMjMsICA0MiwgIDQxLCAgMCwgICAyMCwgIDAsICAgMCwgICAwLCAgIDE2OSwgOTQsICAxMDksCisgICAgMTUwLCA4NCwgIDk3LCAgMTM0LCA3MywgIDg1LCAgMTE2LCA2MiwgIDczLCAgOTksICA1MSwgIDYxLCAgODEsICAzOCwgIDQ4LAorICAgIDYzLCAgMjMsICAzMywgIDQxLCAgMSwgICAxMSwgIDAsICAgMCwgICAwLCAgIDE3MCwgOTQsICA5NiwgIDE1MCwgODMsICA4NCwKKyAgICAxMzQsIDczLCAgNzQsICAxMTYsIDYxLCAgNjIsICA5OSwgIDUwLCAgNTEsICA4MiwgIDM4LCAgMzksICA2NCwgIDIzLCAgMjQsCisgICAgNDAsICAzLCAgIDQsICAgMCwgICAwLCAgIDAsICAgMTcxLCA5MywgIDc5LCAgMTUyLCA4MiwgIDcwLCAgMTM1LCA3MywgIDYxLAorICAgIDExNiwgNjIsICA1MSwgIDk4LCAgNTEsICA0MCwgIDgxLCAgMzgsICAyOCwgIDYzLCAgMjQsICAxNCwgIDM5LCAgNCwgICAwLAorICAgIDAsICAgMCwgICAwLCAgIDE3MSwgOTQsICA2NCwgIDE1MiwgODMsICA1NSwgIDEzNSwgNzMsICA0NywgIDExNiwgNjIsICAzNywKKyAgICA5OCwgIDUwLCAgMjcsICA4MSwgIDM4LCAgMTUsICA2MywgIDI0LCAgMSwgICAzOSwgIDQsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAxNzIsIDkzLCAgNTEsICAxNTMsIDgyLCAgNDIsICAxMzUsIDczLCAgMzUsICAxMTcsIDYyLCAgMjYsICA5OSwgIDUxLCAgMTYsCisgICAgODEsICAzOSwgIDMsICAgNjMsICAyNSwgIDAsICAgMzgsICA1LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTY2LCA2OCwgIDE1MywKKyAgICAxNDgsIDU5LCAgMTM3LCAxMzMsIDQ5LCAgMTIxLCAxMTUsIDM5LCAgMTA2LCA5OSwgIDI4LCAgOTEsICA4MiwgIDEzLCAgNzUsCisgICAgNjUsICAwLCAgIDU4LCAgNDIsICAwLCAgIDM2LCAgMCwgICAwLCAgIDAsICAgMTY4LCA2OCwgIDEzOSwgMTUwLCA1OSwgIDEyNCwKKyAgICAxMzQsIDUwLCAgMTEwLCAxMTYsIDQwLCAgOTYsICA5OSwgIDMwLCAgODEsICA4MiwgIDE2LCAgNjYsICA2NCwgIDAsICAgNTAsCisgICAgNDEsICAwLCAgIDI5LCAgMCwgICAwLCAgIDAsICAgMTY5LCA2OSwgIDEyNiwgMTUwLCA1OSwgIDExMywgMTM0LCA1MSwgIDEwMSwKKyAgICAxMTcsIDQyLCAgODcsICAxMDAsIDMwLCAgNzMsICA4MiwgIDE3LCAgNTksICA2NSwgIDAsICAgNDMsICA0MSwgIDAsICAgMjMsCisgICAgMCwgICAwLCAgIDAsICAgMTY5LCA3MCwgIDExNSwgMTUwLCA2MSwgIDEwMiwgMTM0LCA1MiwgIDg5LCAgMTE2LCA0MiwgIDc3LAorICAgIDk5LCAgMzIsICA2NSwgIDgyLCAgMTksICA1MiwgIDY0LCAgMCwgICAzNiwgIDQxLCAgMCwgICAxNSwgIDAsICAgMCwgICAwLAorICAgIDE2OSwgNzAsICAxMDEsIDE1MCwgNjEsICA5MCwgIDEzNCwgNTIsICA3OSwgIDExNiwgNDMsICA2OCwgIDk5LCAgMzIsICA1NSwKKyAgICA4MiwgIDIxLCAgNDMsICA2NCwgIDIsICAgMjgsICA0MSwgIDAsICAgNiwgICAwLCAgIDAsICAgMCwgICAxNzAsIDcwLCAgODksCisgICAgMTUxLCA2MiwgIDc5LCAgMTM0LCA1MywgIDY5LCAgMTE2LCA0NCwgIDU4LCAgOTksICAzMywgIDQ2LCAgODEsICAyMSwgIDM0LAorICAgIDY0LCAgMywgICAyMCwgIDQxLCAgMCwgICAyLCAgIDAsICAgMCwgICAwLCAgIDE3MCwgNzEsICA3NiwgIDE1MiwgNjIsICA2NiwKKyAgICAxMzQsIDUzLCAgNTcsICAxMTYsIDQzLCAgNDYsICA5OSwgIDMzLCAgMzYsICA4MiwgIDIyLCAgMjQsICA2NCwgIDUsICAgMTAsCisgICAgNDAsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTcxLCA3MCwgIDYxLCAgMTUyLCA2MiwgIDUyLCAgMTM1LCA1MywgIDQ0LAorICAgIDExNiwgNDQsICAzNSwgIDk5LCAgMzQsICAyNCwgIDgyLCAgMjIsICAxMiwgIDYzLCAgNiwgICAwLCAgIDM5LCAgMCwgICAwLAorICAgIDAsICAgMCwgICAwLCAgIDE3MSwgNzEsICA0OSwgIDE1MywgNjIsICA0MSwgIDEzNSwgNTQsICAzMywgIDExNywgNDUsICAyNSwKKyAgICA5OCwgIDM0LCAgMTMsICA4MSwgIDIzLCAgMCwgICA2MywgIDcsICAgMCwgICAzOSwgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAxNjcsIDMzLCAgMTQyLCAxNDksIDI0LCAgMTI3LCAxMzQsIDEwLCAgMTEzLCAxMTYsIDAsICAgOTcsICAxMDAsIDAsICAgODMsCisgICAgODMsICAwLCAgIDY4LCAgNjUsICAwLCAgIDUyLCAgNDAsICAwLCAgIDMwLCAgMCwgICAwLCAgIDAsICAgMTY5LCAzMywgIDEyOSwKKyAgICAxNTAsIDI2LCAgMTE1LCAxMzQsIDE3LCAgMTAyLCAxMTYsIDMsICAgODksICAxMDAsIDAsICAgNzUsICA4MywgIDAsICAgNjAsCisgICAgNjUsICAwLCAgIDQ1LCAgNDAsICAwLCAgIDI0LCAgMCwgICAwLCAgIDAsICAgMTY5LCAzNiwgIDExOCwgMTUxLCAyNywgIDEwNCwKKyAgICAxMzQsIDE5LCAgOTMsICAxMTYsIDcsICAgODAsICAxMDAsIDAsICAgNjcsICA4MywgIDAsICAgNTQsICA2NSwgIDAsICAgMzgsCisgICAgNDEsICAwLCAgIDE3LCAgMCwgICAwLCAgIDAsICAgMTY5LCAzOSwgIDEwNywgMTUwLCAzMCwgIDk0LCAgMTM0LCAyMiwgIDg0LAorICAgIDExNiwgMTEsICA3MSwgIDk5LCAgMCwgICA1OSwgIDgzLCAgMCwgICA0NiwgIDY0LCAgMCwgICAzMSwgIDQwLCAgMCwgICA5LAorICAgIDAsICAgMCwgICAwLCAgIDE2OSwgMzksICA5NSwgIDE1MSwgMzEsICA4MywgIDEzNCwgMjQsICA3MywgIDExNiwgMTUsICA2MiwKKyAgICAxMDAsIDEsICAgNTEsICA4MywgIDAsICAgMzgsICA2NCwgIDAsICAgMjQsICA0MCwgIDAsICAgNSwgICAwLCAgIDAsICAgMCwKKyAgICAxNjksIDQxLCAgODMsICAxNTEsIDMzLCAgNzMsICAxMzQsIDI2LCAgNjQsICAxMTcsIDE3LCAgNTQsICA5OSwgIDQsICAgNDIsCisgICAgODIsICAwLCAgIDMwLCAgNjQsICAwLCAgIDE2LCAgNDAsICAwLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMTcwLCA0MiwgIDcxLAorICAgIDE1MiwgMzQsICA2MiwgIDEzNCwgMjgsICA1MywgIDExNywgMTksICA0NCwgIDk5LCAgNiwgICAzMywgIDgyLCAgMCwgICAyMSwKKyAgICA2MywgIDAsICAgNCwgICAzOSwgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxNzEsIDQyLCAgNTksICAxNTIsIDM1LCAgNTAsCisgICAgMTM0LCAyOSwgIDQyLCAgMTE3LCAyMSwgIDMyLCAgOTksICA5LCAgIDIyLCAgODIsICAwLCAgIDksICAgNjMsICAwLCAgIDAsCisgICAgMzgsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTcyLCA0MiwgIDQ4LCAgMTUyLCAzNiwgIDQwLCAgMTM1LCAyOSwgIDMyLAorICAgIDExNywgMjEsICAyMywgIDk5LCAgMTAsICAxMiwgIDgyLCAgMCwgICAwLCAgIDYzLCAgMCwgICAwLCAgIDM4LCAgMCwgICAwLAorICAgIDAsICAgMCwgICAwLCAgIDEwNywgMjA3LCAyNDYsIDk2LCAgMTg1LCAyMjAsIDg2LCAgMTY1LCAxOTYsIDczLCAgMTQ0LCAxNzEsCisgICAgNjAsICAxMjMsIDE0NywgNDYsICAxMDMsIDEyNSwgMzIsICA4MiwgIDEwMCwgOSwgICA1NiwgIDcxLCAgMCwgICAyMCwgIDMzLAorICAgIDExNSwgMjA2LCAyMjEsIDEwNCwgMTg0LCAxOTgsIDkyLCAgMTY0LCAxNzgsIDc4LCAgMTQzLCAxNTQsIDY0LCAgMTIzLCAxMzMsCisgICAgNTEsICAxMDIsIDExMSwgMzQsICA4MSwgIDg5LCAgMTAsICA1NiwgIDYzLCAgMCwgICAyMCwgIDI3LCAgMTIyLCAyMDQsIDIwMCwKKyAgICAxMDgsIDE4MywgMTgwLCA5NSwgIDE2MywgMTYxLCA4MiwgIDE0MiwgMTQwLCA2OCwgIDEyMiwgMTIwLCA1NCwgIDEwMiwgMTAxLAorICAgIDM2LCAgODEsICA3OSwgIDExLCAgNTYsICA1NSwgIDAsICAgMjAsICAyMCwgIDEyNSwgMjAzLCAxNzksIDExMSwgMTgxLCAxNjAsCisgICAgOTcsICAxNjIsIDE0MywgODUsICAxNDEsIDEyNCwgNzAsICAxMjEsIDEwNywgNTUsICAxMDEsIDg5LCAgMzgsICA4MCwgIDY5LAorICAgIDE0LCAgNTUsICA0NiwgIDAsICAgMTksICAxMCwgIDEyOCwgMjAyLCAxNTYsIDExMywgMTgwLCAxNDAsIDEwMiwgMTYxLCAxMjUsCisgICAgODcsICAxNDAsIDEwOCwgNzEsICAxMjAsIDkyLCAgNTYsICAxMDAsIDc2LCAgMzksICA3OSwgIDU5LCAgMTQsICA1NSwgIDM4LAorICAgIDAsICAgMjAsICAzLCAgIDEzMiwgMjAwLCAxMzUsIDExNywgMTc5LCAxMjEsIDEwMywgMTU5LCAxMDYsIDg4LCAgMTM5LCA5MywKKyAgICA3MywgIDExOSwgNzksICA1NywgIDEwMCwgNjUsICA0MSwgIDc5LCAgNDksICAxNSwgIDU0LCAgMjgsICAwLCAgIDE5LCAgMCwKKyAgICAxMzQsIDIwMCwgMTExLCAxMTksIDE3OCwgOTgsICAxMDUsIDE1OCwgODcsICA4OSwgIDEzOCwgNzYsICA3NCwgIDExOCwgNjQsCisgICAgNTgsICA5OSwgIDUxLCAgNDEsICA3OCwgIDM3LCAgMTYsICA1NCwgIDE3LCAgMCwgICAxOSwgIDAsICAgMTM3LCAxOTksIDg1LAorICAgIDEyMiwgMTc3LCA3NSwgIDEwOCwgMTU4LCA2NiwgIDkxLCAgMTM3LCA1NiwgIDc1LCAgMTE4LCA0NiwgIDU5LCAgOTgsICAzNSwKKyAgICA0MiwgIDc4LCAgMjIsICAxNiwgIDU0LCAgMywgICAwLCAgIDE5LCAgMCwgICAxNDAsIDE5OCwgNjIsICAxMjUsIDE3NywgNTUsCisgICAgMTA5LCAxNTgsIDQ3LCAgOTIsICAxMzcsIDQwLCAgNzYsICAxMTcsIDMyLCAgNTksICA5OCwgIDIxLCAgNDIsICA3OCwgIDYsCisgICAgMTYsICA1NCwgIDAsICAgMCwgICAxOCwgIDAsICAgMTE4LCAxODYsIDIzMSwgMTA2LCAxNjcsIDIwNiwgOTMsICAxNDksIDE4NCwKKyAgICA4MSwgIDEzMCwgMTYxLCA2NywgIDExMSwgMTM5LCA1NCwgIDkyLCAgMTE3LCAzOSwgIDcyLCAgOTMsICAxNywgIDQ4LCAgNjYsCisgICAgMCwgICAxMCwgIDI5LCAgMTIzLCAxODUsIDIwNywgMTEwLCAxNjYsIDE4NiwgOTgsICAxNDgsIDE2NywgODUsICAxMjksIDE0NSwKKyAgICA3MSwgIDExMSwgMTI1LCA1NiwgIDkyLCAgMTA0LCA0MCwgIDcyLCAgODMsICAxOCwgIDQ4LCAgNTcsICAwLCAgIDEwLCAgMjIsCisgICAgMTI4LCAxODQsIDE4OCwgMTEzLCAxNjUsIDE2OCwgMTAyLCAxNDcsIDE1MSwgODgsICAxMjgsIDEzMSwgNzMsICAxMTAsIDExMywKKyAgICA1OCwgIDkxLCAgOTQsICA0MiwgIDcxLCAgNzQsICAxOSwgIDQ4LCAgNTAsICAwLCAgIDksICAgMTUsICAxMzEsIDE4MywgMTY4LAorICAgIDExNiwgMTY0LCAxNTEsIDEwNCwgMTQ2LCAxMzQsIDg5LCAgMTI3LCAxMTcsIDczLCAgMTA5LCAxMDAsIDU4LCAgOTAsICA4MywKKyAgICA0MiwgIDcxLCAgNjUsICAyMCwgIDQ4LCAgNDIsICAwLCAgIDksICAgNSwgICAxMzQsIDE4MiwgMTQ4LCAxMjAsIDE2MywgMTMxLAorICAgIDEwNSwgMTQ1LCAxMTgsIDkwLCAgMTI2LCAxMDIsIDc1LCAgMTA4LCA4NiwgIDU5LCAgOTAsICA3MiwgIDQzLCAgNzEsICA1NSwKKyAgICAxOSwgIDQ3LCAgMzQsICAwLCAgIDksICAgMCwgICAxMzYsIDE4MSwgMTI4LCAxMjIsIDE2MiwgMTE1LCAxMDcsIDE0NCwgMTAyLAorICAgIDkyLCAgMTI1LCA4NywgIDc2LCAgMTA3LCA3NCwgIDYxLCAgODksICA2MCwgIDQ0LCAgNzAsICA0NSwgIDIwLCAgNDcsICAyNCwKKyAgICAwLCAgIDgsICAgMCwgICAxMzksIDE4MCwgMTA2LCAxMjQsIDE2MSwgOTUsICAxMDksIDE0NCwgODMsICA5MywgIDEyNCwgNzEsCisgICAgNzcsICAxMDcsIDYwLCAgNjEsICA4OSwgIDQ3LCAgNDQsICA3MCwgIDMzLCAgMjAsICA0NywgIDEzLCAgMCwgICA4LCAgIDAsCisgICAgMTQyLCAxNzksIDgyLCAgMTI1LCAxNjAsIDcyLCAgMTExLCAxNDMsIDYzLCAgOTQsICAxMjQsIDU0LCAgNzcsICAxMDYsIDQ0LAorICAgIDYxLCAgODgsICAzMiwgIDQ0LCAgNjksICAxOCwgIDIwLCAgNDYsICAwLCAgIDAsICAgOCwgICAwLCAgIDE0MywgMTc5LCA2MiwKKyAgICAxMjcsIDE2MCwgNTQsICAxMTEsIDE0MiwgNDcsICA5NCwgIDEyNCwgMzksICA3OCwgIDEwNiwgMjksICA2MiwgIDg4LCAgMTgsCisgICAgNDUsICA2OSwgIDMsICAgMjAsICA0NiwgIDAsICAgMCwgICA4LCAgIDAsICAgMTI0LCAxNjcsIDIxNiwgMTEyLCAxNTAsIDE5NCwKKyAgICA5OSwgIDEzNCwgMTc0LCA4NywgIDExNywgMTUzLCA3MywgIDEwMCwgMTMxLCA1OCwgIDgyLCAgMTEwLCA0MywgIDY0LCAgODgsCisgICAgMjMsICA0MCwgIDYxLCAgMCwgICAwLCAgIDI0LCAgMTI5LCAxNjYsIDE5NSwgMTE2LCAxNTAsIDE3NSwgMTAzLCAxMzQsIDE1OCwKKyAgICA4OSwgIDExNiwgMTM3LCA3NSwgIDk5LCAgMTE4LCA2MCwgIDgyLCAgOTgsICA0NCwgIDYzLCAgNzgsICAyMywgIDQwLCAgNTMsCisgICAgMCwgICAwLCAgIDE3LCAgMTMyLCAxNjYsIDE3NywgMTE5LCAxNDksIDE2MCwgMTA2LCAxMzMsIDE0MywgOTAsICAxMTUsIDEyNCwKKyAgICA3NiwgIDk5LCAgMTA3LCA2MSwgIDgxLCAgODgsICA0NSwgIDYzLCAgNjksICAyNCwgIDQwLCAgNDYsICAwLCAgIDAsICAgOSwKKyAgICAxMzYsIDE2NiwgMTU5LCAxMjEsIDE0OCwgMTQzLCAxMDcsIDEzMiwgMTI2LCA5MiwgIDExNSwgMTExLCA3NywgIDk4LCAgOTQsCisgICAgNjIsICA4MSwgIDc4LCAgNDYsICA2MywgIDYwLCAgMjMsICA0MCwgIDM4LCAgMCwgICAwLCAgIDAsICAgMTM4LCAxNjQsIDE0MCwKKyAgICAxMjIsIDE0NywgMTI1LCAxMDgsIDEzMSwgMTExLCA5MywgIDExNCwgOTcsICA3OSwgIDk4LCAgODIsICA2MywgIDgwLCAgNjcsCisgICAgNDYsICA2MiwgIDUwLCAgMjQsICA0MCwgIDI5LCAgMCwgICAwLCAgIDAsICAgMTM5LCAxNjMsIDEyMiwgMTI0LCAxNDYsIDEwOSwKKyAgICAxMTAsIDEzMSwgOTYsICA5NCwgIDExNCwgODMsICA3OSwgIDk3LCAgNzAsICA2MywgIDgxLCAgNTcsICA0NiwgIDYyLCAgNDEsCisgICAgMjQsICA0MCwgIDIxLCAgMCwgICAwLCAgIDAsICAgMTQxLCAxNjMsIDEwMSwgMTI2LCAxNDUsIDkwLCAgMTExLCAxMzAsIDc5LAorICAgIDk1LCAgMTEzLCA2OCwgIDc5LCAgOTYsICA1NiwgIDYzLCAgODAsICA0NCwgIDQ3LCAgNjIsICAzMCwgIDIzLCAgNDAsICAxMCwKKyAgICAwLCAgIDAsICAgMCwgICAxNDQsIDE2MiwgNzksICAxMjcsIDE0NSwgNzAsICAxMTIsIDEyOSwgNjAsICA5NSwgIDExMiwgNTEsCisgICAgNzksICA5NiwgIDQxLCAgNjQsICA3OSwgIDMwLCAgNDcsICA2MSwgIDE1LCAgMjMsICA0MCwgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMTQ1LCAxNjIsIDYwLCAgMTI5LCAxNDUsIDUyLCAgMTEzLCAxMjksIDQ2LCAgOTYsICAxMTIsIDM3LCAgNzksICA5NSwgIDI3LAorICAgIDY0LCAgNzksICAxNiwgIDQ3LCAgNjEsICAxLCAgIDIzLCAgMzksICAwLCAgIDAsICAgMCwgICAwLCAgIDEzMSwgMTQ3LCAyMDIsCisgICAgMTE3LCAxMzMsIDE4MSwgMTA1LCAxMTksIDE2MiwgOTEsICAxMDMsIDE0MiwgNzcsICA4NywgIDEyMiwgNjIsICA3MSwgIDEwMiwKKyAgICA0NywgIDU0LCAgODEsICAyNiwgIDMxLCAgNTYsICAwLCAgIDAsICAgMTgsICAxMzUsIDE0NywgMTgzLCAxMjAsIDEzMiwgMTY0LAorICAgIDEwNywgMTE4LCAxNDcsIDkzLCAgMTAyLCAxMjgsIDc4LCAgODcsICAxMTAsIDYzLCAgNzEsICA5MiwgIDQ3LCAgNTQsICA3MiwKKyAgICAyNiwgIDMxLCAgNDgsICAwLCAgIDAsICAgMTAsICAxMzgsIDE0NywgMTY2LCAxMjMsIDEzMSwgMTQ5LCAxMDgsIDExOCwgMTMzLAorICAgIDk0LCAgMTAyLCAxMTYsIDc5LCAgODYsICAxMDAsIDY0LCAgNzEsICA4MiwgIDQ4LCAgNTQsICA2NCwgIDI3LCAgMzEsICA0MSwKKyAgICAwLCAgIDAsICAgMiwgICAxMzksIDE0NiwgMTQ5LCAxMjQsIDEzMSwgMTM0LCAxMTEsIDExNywgMTE5LCA5NCwgIDEwMSwgMTAzLAorICAgIDc5LCAgODYsICA4OCwgIDY0LCAgNzAsICA3MiwgIDQ4LCAgNTMsICA1NSwgIDI3LCAgMzEsICAzMywgIDAsICAgMCwgICAwLAorICAgIDE0MSwgMTQ2LCAxMzIsIDEyNSwgMTMxLCAxMTcsIDExMSwgMTE3LCAxMDQsIDk1LCAgMTAxLCA5MSwgIDgwLCAgODYsICA3NywKKyAgICA2NSwgIDcwLCAgNjIsICA0OCwgIDUzLCAgNDYsICAyNiwgIDMxLCAgMjUsICAwLCAgIDAsICAgMCwgICAxNDMsIDE0NSwgMTE1LAorICAgIDEyNiwgMTMwLCAxMDEsIDExMiwgMTE2LCA5MCwgIDk2LCAgMTAwLCA3OCwgIDgwLCAgODUsICA2NSwgIDY1LCAgNzAsICA1MiwKKyAgICA0OSwgIDUzLCAgMzcsICAyNywgIDMyLCAgMTcsICAwLCAgIDAsICAgMCwgICAxNDQsIDE0NCwgOTYsICAxMjgsIDEyOSwgODUsCisgICAgMTEyLCAxMTUsIDc1LCAgOTcsICAxMDAsIDY0LCAgODEsICA4NSwgIDUyLCAgNjUsICA2OSwgIDQwLCAgNDksICA1MywgIDI2LAorICAgIDI2LCAgMzEsICA1LCAgIDAsICAgMCwgICAwLCAgIDE0NiwgMTQ0LCA3NiwgIDEyOSwgMTI5LCA2NywgIDExNCwgMTE1LCA1OCwKKyAgICA5NywgIDk5LCAgNDgsICA4MiwgIDg0LCAgMzgsICA2NiwgIDY5LCAgMjcsICA0OSwgIDUzLCAgMTIsICAyNiwgIDMyLCAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAxNDYsIDE0NCwgNTksICAxMzAsIDEyOCwgNTEsICAxMTQsIDExNCwgNDMsICA5OCwgIDk5LCAgMzUsCisgICAgODIsICA4NCwgIDI1LCAgNjYsICA2OSwgIDEzLCAgNDksICA1MywgIDAsICAgMjYsICAzMiwgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMTM1LCAxMjksIDE4OSwgMTIyLCAxMTUsIDE3MCwgMTA3LCAxMDMsIDE1MiwgOTQsICA4OSwgIDEzMywgNzksICA3NCwgIDExNCwKKyAgICA2NCwgIDYwLCAgOTUsICA0OSwgIDQzLCAgNzUsICAyOSwgIDIwLCAgNTEsICAwLCAgIDAsICAgMTIsICAxMzgsIDEyOSwgMTcxLAorICAgIDEyNCwgMTE1LCAxNTMsIDExMCwgMTAzLCAxMzgsIDk1LCAgODksICAxMjAsIDgxLCAgNzQsICAxMDMsIDY2LCAgNjAsICA4NiwKKyAgICA1MCwgIDQ0LCAgNjcsICAyOCwgIDIxLCAgNDMsICAwLCAgIDAsICAgMywgICAxNDAsIDEyOSwgMTU2LCAxMjUsIDExNSwgMTQwLAorICAgIDExMSwgMTAzLCAxMjUsIDk2LCAgODksICAxMDksIDgxLCAgNzQsICA5MywgIDY3LCAgNjAsICA3NiwgIDUwLCAgNDQsICA1OSwKKyAgICAyOSwgIDIyLCAgMzYsICAwLCAgIDAsICAgMCwgICAxNDIsIDEyOCwgMTQwLCAxMjcsIDExNSwgMTI1LCAxMTIsIDEwMiwgMTEyLAorICAgIDk3LCAgODgsICA5NywgIDgyLCAgNzQsICA4MywgIDY3LCAgNjAsICA2NywgIDUwLCAgNDQsICA1MSwgIDI5LCAgMjIsICAyOSwKKyAgICAwLCAgIDAsICAgMCwgICAxNDIsIDEyOCwgMTI0LCAxMjcsIDExNCwgMTExLCAxMTMsIDEwMiwgOTgsICA5OCwgIDg4LCAgODUsCisgICAgODIsICA3NCwgIDcxLCAgNjYsICA2MCwgIDU4LCAgNTAsICA0NCwgIDQyLCAgMjksICAyMiwgIDIxLCAgMCwgICAwLCAgIDAsCisgICAgMTQ0LCAxMjcsIDEwOCwgMTI4LCAxMTQsIDk2LCAgMTEzLCAxMDEsIDg1LCAgOTgsICA4NywgIDczLCAgODIsICA3NCwgIDYxLAorICAgIDY3LCAgNjAsICA0OCwgIDUwLCAgNDQsICAzMywgIDI4LCAgMjMsICAxMiwgIDAsICAgMCwgICAwLCAgIDE0NSwgMTI3LCA5MSwKKyAgICAxMjksIDExNCwgODEsICAxMTUsIDEwMSwgNzEsICA5OCwgIDg3LCAgNjAsICA4MiwgIDczLCAgNDgsICA2NywgIDU5LCAgMzcsCisgICAgNTAsICA0NCwgIDIyLCAgMjksICAyMywgIDEsICAgMCwgICAwLCAgIDAsICAgMTQ3LCAxMjcsIDczLCAgMTMwLCAxMTMsIDYzLAorICAgIDExNSwgMTAxLCA1NSwgIDk4LCAgODcsICA0NSwgIDgzLCAgNzMsICAzNSwgIDY3LCAgNTksICAyNCwgIDUwLCAgNDQsICAxMCwKKyAgICAyOCwgIDI0LCAgMCwgICAwLCAgIDAsICAgMCwgICAxNDcsIDEyNywgNTgsICAxMzEsIDExMywgNDksICAxMTUsIDEwMCwgNDIsCisgICAgOTksICA4NiwgIDMzLCAgODMsICA3MywgIDIzLCAgNjcsICA1OSwgIDEwLCAgNTAsICA0NCwgIDAsICAgMjcsICAyNCwgIDAsCisgICAgMCwgICAwLCAgIDAsICAgMTM4LCAxMTAsIDE3NywgMTI0LCA5OSwgIDE1OSwgMTEwLCA4OCwgIDE0MiwgOTYsICA3NSwgIDEyNSwKKyAgICA4MiwgIDYyLCAgMTA3LCA2NiwgIDQ4LCAgODksICA1MSwgIDMzLCAgNzAsICAzMCwgIDgsICAgNDYsICAwLCAgIDAsICAgNSwKKyAgICAxNDIsIDExMSwgMTYwLCAxMjcsIDk5LCAgMTQ0LCAxMTMsIDg4LCAgMTMwLCA5OCwgIDc1LCAgMTEyLCA4MiwgIDYyLCAgOTYsCisgICAgNjgsICA0OSwgIDgwLCAgNTEsICAzMywgIDYxLCAgMzAsICAxMCwgIDM5LCAgMCwgICAwLCAgIDAsICAgMTQzLCAxMTEsIDE0NiwKKyAgICAxMjgsIDk5LCAgMTMxLCAxMTQsIDg4LCAgMTE4LCA5OCwgIDc1LCAgMTAxLCA4MywgIDYyLCAgODYsICA2OCwgIDQ5LCAgNzEsCisgICAgNTIsICAzMywgIDU0LCAgMzAsICAxMSwgIDMyLCAgMCwgICAwLCAgIDAsICAgMTQ0LCAxMTEsIDEzMiwgMTI4LCA5OSwgIDExOCwKKyAgICAxMTMsIDg4LCAgMTA2LCA5OSwgIDc1LCAgOTEsICA4MywgIDYyLCAgNzcsICA2OCwgIDQ5LCAgNjIsICA1MiwgIDM0LCAgNDYsCisgICAgMzAsICAxMiwgIDI1LCAgMCwgICAwLCAgIDAsICAgMTQ0LCAxMTEsIDExNywgMTI5LCA5OCwgIDEwNCwgMTE0LCA4NywgIDkyLAorICAgIDk5LCAgNzUsICA4MCwgIDgzLCAgNjIsICA2NywgIDY4LCAgNDksICA1MywgIDUxLCAgMzQsICAzOCwgIDMwLCAgMTMsICAxOCwKKyAgICAwLCAgIDAsICAgMCwgICAxNDUsIDExMSwgMTAzLCAxMzAsIDk4LCAgOTEsICAxMTQsIDg3LCAgODAsICA5OSwgIDc1LCAgNjgsCisgICAgODMsICA2MywgIDU3LCAgNjgsICA1MCwgIDQ1LCAgNTEsICAzNCwgIDMwLCAgMzAsICAxNCwgIDgsICAgMCwgICAwLCAgIDAsCisgICAgMTQ2LCAxMTAsIDg3LCAgMTMxLCA5OCwgIDc2LCAgMTE1LCA4NywgIDY3LCAgOTksICA3NSwgIDU2LCAgODMsICA2MiwgIDQ1LAorICAgIDY4LCAgNDksICAzMywgIDUyLCAgMzUsICAxOSwgIDMwLCAgMTUsICAyLCAgIDAsICAgMCwgICAwLCAgIDE0OCwgMTEwLCA3MCwKKyAgICAxMzEsIDk4LCAgNjAsICAxMTYsIDg2LCAgNTIsICA5OSwgIDc0LCAgNDMsICA4NCwgIDYyLCAgMzMsICA2OSwgIDQ5LCAgMjEsCisgICAgNTIsICAzNSwgIDYsICAgMjksICAxNSwgIDAsICAgMCwgICAwLCAgIDAsICAgMTQ4LCAxMTAsIDU2LCAgMTMyLCA5NywgIDQ4LAorICAgIDExNywgODcsICA0MCwgIDEwMCwgNzUsICAzMSwgIDg0LCAgNjIsICAyMiwgIDY4LCAgNDksICA5LCAgIDUxLCAgMzUsICAwLAorICAgIDI4LCAgMTUsICAwLCAgIDAsICAgMCwgICAwLCAgIDE0MiwgOTEsICAxNjYsIDEyNiwgODAsICAxNDgsIDExMywgNzEsICAxMzIsCisgICAgOTgsICA1OSwgIDExNSwgODMsICA0NywgIDk5LCAgNjksICAzNCwgIDgyLCAgNTMsICAxNywgIDY0LCAgMzIsICAwLCAgIDQxLAorICAgIDAsICAgMCwgICAwLCAgIDE0MywgOTEsICAxNTAsIDEyOCwgODEsICAxMzUsIDExNCwgNzEsICAxMjAsIDk5LCAgNjAsICAxMDQsCisgICAgODUsICA0OCwgIDg5LCAgNjksICAzNSwgIDczLCAgNTMsICAxOSwgIDU2LCAgMzIsICAwLCAgIDM0LCAgMCwgICAwLCAgIDAsCisgICAgMTQ1LCA5MSwgIDEzNywgMTI5LCA4MSwgIDEyMiwgMTE1LCA3MSwgIDEwOSwgMTAwLCA2MCwgIDk0LCAgODUsICA0OCwgIDgxLAorICAgIDY5LCAgMzUsICA2NSwgIDUzLCAgMTksICA0OSwgIDMyLCAgMCwgICAyOCwgIDAsICAgMCwgICAwLCAgIDE0NiwgOTIsICAxMjQsCisgICAgMTMwLCA4MSwgIDExMCwgMTE1LCA3MSwgIDk4LCAgMTAwLCA2MCwgIDg0LCAgODUsICA0OSwgIDcxLCAgNjksICAzNiwgIDU3LAorICAgIDUzLCAgMjEsICA0MiwgIDMyLCAgMCwgICAyMSwgIDAsICAgMCwgICAwLCAgIDE0NywgOTEsICAxMTAsIDEzMCwgODEsICA5NywKKyAgICAxMTUsIDcxLCAgODYsICAxMDAsIDYwLCAgNzQsICA4NCwgIDQ5LCAgNjIsICA2OSwgIDM2LCAgNDgsICA1MywgIDIyLCAgMzQsCisgICAgMzIsICAwLCAgIDEzLCAgMCwgICAwLCAgIDAsICAgMTQ3LCA5MiwgIDk3LCAgMTMwLCA4MSwgIDg1LCAgMTE2LCA3MiwgIDc2LAorICAgIDEwMCwgNjAsICA2MywgIDg1LCAgNDksICA1MiwgIDY5LCAgMzcsICA0MCwgIDUzLCAgMjIsICAyNiwgIDMxLCAgMSwgICA1LAorICAgIDAsICAgMCwgICAwLCAgIDE0OCwgOTIsICA4MiwgIDEzMSwgODEsICA3MSwgIDExNiwgNzEsICA2MiwgIDEwMCwgNjAsICA1MywKKyAgICA4NCwgIDQ5LCAgNDIsICA2OSwgIDM3LCAgMzAsICA1MiwgIDIzLCAgMTYsICAzMSwgIDIsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAxNDgsIDkxLCAgNjcsICAxMzIsIDgxLCAgNTcsICAxMTcsIDcxLCAgNDksICAxMDAsIDYwLCAgMzksICA4NCwgIDQ5LCAgMzAsCisgICAgNjksICAzNywgIDE4LCAgNTIsICAyMywgIDIsICAgMzAsICAyLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTQ5LCA5MSwgIDU0LAorICAgIDEzMiwgODEsICA0NiwgIDExOCwgNzEsICAzOSwgIDEwMSwgNjAsICAyOSwgIDg1LCAgNDksICAxOSwgIDY5LCAgMzcsICA2LAorICAgIDUyLCAgMjMsICAwLCAgIDI5LCAgMywgICAwLCAgIDAsICAgMCwgICAwLCAgIDE0MywgNjgsICAxNTMsIDEyOCwgNTksICAxMzcsCisgICAgMTE1LCA0OSwgIDEyMiwgOTksICAzOSwgIDEwNywgODUsICAyOCwgIDkxLCAgNzAsICAxMywgIDc1LCAgNTQsICAwLCAgIDU4LAorICAgIDMyLCAgMCwgICAzNiwgIDAsICAgMCwgICAwLCAgIDE0NiwgNjgsICAxNDAsIDEzMSwgNTksICAxMjUsIDExNiwgNTEsICAxMTEsCisgICAgMTAwLCA0MCwgIDk3LCAgODUsICAyOSwgIDgyLCAgNzAsICAxNSwgIDY3LCAgNTQsICAwLCAgIDUwLCAgMzIsICAwLCAgIDI5LAorICAgIDAsICAgMCwgICAwLCAgIDE0NywgNjgsICAxMjcsIDEzMSwgNTksICAxMTQsIDExNywgNTEsICAxMDIsIDEwMSwgNDEsICA4OCwKKyAgICA4NiwgIDMwLCAgNzQsICA3MCwgIDE3LCAgNjAsICA1NCwgIDAsICAgNDQsICAzMiwgIDAsICAgMjMsICAwLCAgIDAsICAgMCwKKyAgICAxNDcsIDcwLCAgMTE1LCAxMzEsIDYwLCAgMTAzLCAxMTYsIDUyLCAgOTEsICAxMDAsIDQyLCAgNzgsICA4NSwgIDMyLCAgNjUsCisgICAgNzAsICAxOSwgIDUzLCAgNTQsICAxLCAgIDM4LCAgMzIsICAwLCAgIDE3LCAgMCwgICAwLCAgIDAsICAgMTQ3LCA3MCwgIDEwMywKKyAgICAxMzEsIDYxLCAgOTEsICAxMTcsIDUzLCAgODEsICAxMDEsIDQzLCAgNjksICA4NiwgIDMyLCAgNTcsICA3MCwgIDIwLCAgNDQsCisgICAgNTQsICAyLCAgIDMwLCAgMzIsICAwLCAgIDcsICAgMCwgICAwLCAgIDAsICAgMTQ4LCA3MCwgIDkxLCAgMTMyLCA2MSwgIDgwLAorICAgIDExNywgNTIsICA3MCwgIDEwMSwgNDMsICA1OSwgIDg1LCAgMzMsICA0OCwgIDcwLCAgMjEsICAzNiwgIDUzLCAgNCwgICAyMiwKKyAgICAzMiwgIDAsICAgMywgICAwLCAgIDAsICAgMCwgICAxNDgsIDcwLCAgNzgsICAxMzIsIDYyLCAgNjgsICAxMTcsIDUzLCAgNTgsCisgICAgMTAxLCA0MywgIDQ4LCAgODUsICAzNCwgIDM4LCAgNzAsICAyMiwgIDI2LCAgNTMsICA2LCAgIDEyLCAgMzEsICAwLCAgIDAsCisgICAgMCwgICAwLCAgIDAsICAgMTQ5LCA3MSwgIDY0LCAgMTMyLCA2MiwgIDU0LCAgMTE4LCA1NCwgIDQ2LCAgMTAxLCA0NCwgIDM3LAorICAgIDg1LCAgMzQsICAyNywgIDY5LCAgMjMsICAxNSwgIDUzLCAgNywgICAxLCAgIDMwLCAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgIDE1MCwgNzAsICA1MywgIDEzNCwgNjEsICA0NCwgIDExOCwgNTQsICAzNiwgIDEwMSwgNDQsICAyOCwgIDg1LCAgMzUsICAxNywKKyAgICA2OSwgIDIzLCAgNCwgICA1MiwgIDgsICAgMCwgICAzMCwgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxNDUsIDM4LCAgMTQzLAorICAgIDEzMCwgMjksICAxMjgsIDExNywgMTgsICAxMTQsIDEwMSwgMywgICA5OCwgIDg3LCAgMCwgICA4NCwgIDcyLCAgMCwgICA2OSwKKyAgICA1NCwgIDAsICAgNTMsICAzMCwgIDAsICAgMzEsICAwLCAgIDAsICAgMCwgICAxNDcsIDM4LCAgMTMwLCAxMzIsIDMwLCAgMTE2LAorICAgIDExNywgMjIsICAxMDMsIDEwMSwgOCwgICA4OSwgIDg3LCAgMCwgICA3NiwgIDcyLCAgMCwgICA2MiwgIDU0LCAgMCwgICA0NiwKKyAgICAzMCwgIDAsICAgMjQsICAwLCAgIDAsICAgMCwgICAxNDgsIDQwLCAgMTE5LCAxMzIsIDMxLCAgMTA1LCAxMTcsIDIzLCAgOTQsCisgICAgMTAxLCAxMywgIDgxLCAgODcsICAwLCAgIDY4LCAgNzEsICAwLCAgIDU1LCAgNTQsICAwLCAgIDM5LCAgMzAsICAwLCAgIDE4LAorICAgIDAsICAgMCwgICAwLCAgIDE0OCwgNDIsICAxMDgsIDEzMiwgMzQsICA5NiwgIDExNywgMjUsICA4NSwgIDEwMiwgMTUsICA3MywKKyAgICA4NiwgIDIsICAgNjAsICA3MSwgIDAsICAgNDcsICA1NCwgIDAsICAgMzMsICAzMCwgIDAsICAgMTEsICAwLCAgIDAsICAgMCwKKyAgICAxNDgsIDQzLCAgOTYsICAxMzMsIDM1LCAgODUsICAxMTcsIDI4LCAgNzUsICAxMDIsIDE4LCAgNjQsICA4NywgIDUsICAgNTIsCisgICAgNzEsICAwLCAgIDQwLCAgNTQsICAwLCAgIDI1LCAgMzAsICAwLCAgIDUsICAgMCwgICAwLCAgIDAsICAgMTQ5LCA0NCwgIDg1LAorICAgIDEzMiwgMzYsICA3NSwgIDExOCwgMjksICA2NiwgIDEwMSwgMjAsICA1NSwgIDg2LCAgOCwgICA0NCwgIDcwLCAgMCwgICAzMiwKKyAgICA1MywgIDAsICAgMTgsICAyOSwgIDAsICAgMiwgICAwLCAgIDAsICAgMCwgICAxNDksIDQ1LCAgNzQsICAxMzMsIDM3LCAgNjQsCisgICAgMTE4LCAzMSwgIDU1LCAgMTAyLCAyMSwgIDQ1LCAgODUsICAxMCwgIDM0LCAgNzAsICAwLCAgIDIyLCAgNTMsICAwLCAgIDYsCisgICAgMjgsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTUwLCA0NiwgIDYxLCAgMTMzLCAzOSwgIDUyLCAgMTE4LCAzMSwgIDQ0LAorICAgIDEwMiwgMjMsICAzNCwgIDg1LCAgMTIsICAyNCwgIDcwLCAgMCwgICAxMiwgIDUyLCAgMCwgICAwLCAgIDI4LCAgMCwgICAwLAorICAgIDAsICAgMCwgICAwLCAgIDE1MCwgNDYsICA1MSwgIDEzMywgNDAsICA0MiwgIDExOSwgMzIsICAzNSwgIDEwMiwgMjQsICAyNSwKKyAgICA4NSwgIDEzLCAgMTQsICA3MCwgIDAsICAgMSwgICA1MiwgIDAsICAgMCwgICAyNywgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICA1MywgIDE5OCwgMjQ0LCA0OSwgIDE3NywgMjE4LCA0MSwgIDE1OCwgMTk1LCAzMiwgIDEzOCwgMTcxLCAyMiwgIDExOCwgMTQ3LAorICAgIDExLCAgOTgsICAxMjQsIDAsICAgNzgsICAxMDAsIDAsICAgNTQsICA3MSwgIDAsICAgMTgsICAzNCwgIDY5LCAgMTk2LCAyMjAsCisgICAgNjQsICAxNzUsIDE5NiwgNTQsICAxNTcsIDE3NiwgNDUsICAxMzcsIDE1NCwgMzIsICAxMTcsIDEzMywgMTksICA5OCwgIDExMSwKKyAgICAwLCAgIDc4LCAgODksICAwLCAgIDUzLCAgNjMsICAwLCAgIDE3LCAgMjcsICA4MCwgIDE5NSwgMTk4LCA2OSwgIDE3NSwgMTc5LAorICAgIDYwLCAgMTU2LCAxNTksIDUwLCAgMTM2LCAxMzksIDM4LCAgMTE2LCAxMjAsIDI1LCAgOTgsICAxMDEsIDQsICAgNzcsICA4MCwKKyAgICAwLCAgIDUzLCAgNTUsICAwLCAgIDE3LCAgMjEsICA4NCwgIDE5MywgMTc3LCA3NSwgIDE3MywgMTU5LCA2NCwgIDE1NSwgMTQyLAorICAgIDU1LCAgMTM1LCAxMjQsIDQxLCAgMTE2LCAxMDcsIDI3LCAgOTcsICA4OSwgIDksICAgNzYsICA3MCwgIDAsICAgNTMsICA0NywKKyAgICAwLCAgIDE3LCAgMTEsICA4OSwgIDE5MywgMTU3LCA3OSwgIDE3MiwgMTQwLCA3MCwgIDE1NCwgMTI1LCA1NywgIDEzNCwgMTA5LAorICAgIDQ0LCAgMTE1LCA5MiwgIDMyLCAgOTYsICA3NiwgIDEzLCAgNzYsICA1OSwgIDAsICAgNTIsICAzOSwgIDAsICAgMTYsICA0LAorICAgIDk0LCAgMTkxLCAxMzUsIDg1LCAgMTcxLCAxMjEsIDcyLCAgMTUyLCAxMDgsIDYwLCAgMTMzLCA5NCwgIDQ3LCAgMTE0LCA4MCwKKyAgICAzMiwgIDk1LCAgNjUsICAxNSwgIDc2LCAgNDksICAwLCAgIDUyLCAgMjksICAwLCAgIDE2LCAgMCwgICA5OCwgIDE5MCwgMTEzLAorICAgIDg3LCAgMTcwLCAxMDAsIDc2LCAgMTUyLCA4OSwgIDYyLCAgMTMyLCA3NywgIDQ5LCAgMTEzLCA2NSwgIDM1LCAgOTUsICA1MiwKKyAgICAxOCwgIDc1LCAgMzcsICAwLCAgIDUyLCAgMTgsICAwLCAgIDE1LCAgMCwgICAxMDMsIDE5MCwgODksICA5MCwgIDE2OSwgODAsCisgICAgNzgsICAxNTEsIDcwLCAgNjQsICAxMzIsIDYwLCAgNTEsICAxMTMsIDQ5LCAgMzcsICA5NCwgIDM4LCAgMjAsICA3NSwgIDI1LAorICAgIDAsICAgNTIsICA1LCAgIDAsICAgMTUsICAwLCAgIDEwNiwgMTg5LCA2OSwgIDkzLCAgMTY5LCA2MSwgIDgwLCAgMTUxLCA1MywKKyAgICA2NiwgIDEzMSwgNDUsICA1MiwgIDExMywgMzYsICAzNywgIDk0LCAgMjUsICAxOSwgIDc0LCAgMTEsICAwLCAgIDUxLCAgMCwKKyAgICAwLCAgIDE1LCAgMCwgICA3NiwgIDE3OCwgMjI5LCA2OCwgIDE1OSwgMjA1LCA2MSwgIDE0MiwgMTgzLCA1MCwgIDEyNCwgMTYwLAorICAgIDQwLCAgMTA2LCAxMzgsIDI4LCAgODgsICAxMTYsIDEyLCAgNjksICA5MywgIDAsICAgNDUsICA2NiwgIDAsICAgNSwgICAyOSwKKyAgICA4NiwgIDE3NywgMjA3LCA3OCwgIDE1OCwgMTg0LCA2NywgIDE0MiwgMTY2LCA1NiwgIDEyMywgMTQ1LCA0NSwgIDEwNiwgMTI1LAorICAgIDMxLCAgODgsICAxMDUsIDE2LCAgNjksICA4MywgIDAsICAgNDUsICA1OCwgIDAsICAgNiwgICAyMiwgIDkzLCAgMTc2LCAxODcsCisgICAgODEsICAxNTgsIDE2OCwgNzEsICAxNDEsIDE1MCwgNjEsICAxMjMsIDEzMSwgNDcsICAxMDUsIDExMywgMzUsICA4NywgIDk0LAorICAgIDIwLCAgNjgsICA3NCwgIDAsICAgNDUsICA1MSwgIDAsICAgNSwgICAxNiwgIDk4LCAgMTc1LCAxNjgsIDg0LCAgMTU3LCAxNTAsCisgICAgNzUsICAxNDAsIDEzNCwgNjMsICAxMjIsIDExNywgNTAsICAxMDQsIDEwMCwgMzcsICA4NywgIDgzLCAgMjEsICA2OCwgIDY1LAorICAgIDAsICAgNDUsICA0MiwgIDAsICAgNCwgICA3LCAgIDEwMCwgMTc0LCAxNDksIDg5LCAgMTU1LCAxMzIsIDc2LCAgMTM5LCAxMTcsCisgICAgNjUsICAxMjEsIDEwMiwgNTMsICAxMDQsIDg3LCAgMzksICA4NiwgIDcyLCAgMjMsICA2NywgIDU1LCAgMCwgICA0NSwgIDM0LAorICAgIDAsICAgMywgICAwLCAgIDEwMywgMTczLCAxMzAsIDkyLCAgMTU1LCAxMTUsIDgwLCAgMTM4LCAxMDIsIDY4LCAgMTIwLCA4OCwKKyAgICA1MywgIDEwMywgNzUsICA0MCwgIDg2LCAgNjEsICAyNCwgIDY3LCAgNDUsICAwLCAgIDQ1LCAgMjUsICAwLCAgIDMsICAgMCwKKyAgICAxMDcsIDE3MiwgMTA4LCA5NSwgIDE1NCwgOTYsICA4MiwgIDEzNywgODUsICA3MCwgIDExOSwgNzMsICA1NSwgIDEwMiwgNjEsCisgICAgNDIsICA4NSwgIDQ5LCAgMjUsICA2NywgIDM0LCAgMCwgICA0NSwgIDE0LCAgMCwgICAzLCAgIDAsICAgMTEwLCAxNzIsIDg2LAorICAgIDk3LCAgMTUzLCA3NiwgIDg1LCAgMTM3LCA2NywgIDcwLCAgMTE5LCA1NywgIDU2LCAgMTAyLCA0NiwgIDQyLCAgODQsICAzNSwKKyAgICAyNiwgIDY2LCAgMjEsICAwLCAgIDQ0LCAgMSwgICAwLCAgIDMsICAgMCwgICAxMTIsIDE3MSwgNjcsICA5OCwgIDE1MywgNTksCisgICAgODYsICAxMzcsIDUyLCAgNzEsICAxMTksIDQ0LCAgNTgsICAxMDIsIDM0LCAgNDQsICA4NSwgIDIyLCAgMjcsICA2NiwgIDcsCisgICAgMCwgICA0NCwgIDAsICAgMCwgICAzLCAgIDAsICAgOTAsICAxNjAsIDIxNSwgODEsICAxNDQsIDE5MywgNzAsICAxMjksIDE3MywKKyAgICA2MSwgIDExMiwgMTUxLCA0OSwgIDk1LCAgMTMxLCAzNywgIDc5LCAgMTA5LCAyMiwgIDYxLCAgODcsICAwLCAgIDM4LCAgNjEsCisgICAgMCwgICAwLCAgIDI1LCAgOTYsICAxNjAsIDE5NCwgODYsICAxNDMsIDE3NCwgNzUsICAxMjgsIDE1NywgNjUsICAxMTIsIDEzNywKKyAgICA1MywgIDk1LCAgMTE3LCA0MCwgIDc4LCAgOTgsICAyNSwgIDYwLCAgNzgsICAwLCAgIDM4LCAgNTMsICAwLCAgIDAsICAgMTcsCisgICAgMTAwLCAxNTksIDE3NywgODksICAxNDMsIDE1OSwgNzksICAxMjgsIDE0MywgNjcsICAxMTEsIDEyNCwgNTUsICA5NSwgIDEwNywKKyAgICA0MiwgIDc4LCAgODksICAyNywgIDYwLCAgNzAsICAyLCAgIDM4LCAgNDYsICAwLCAgIDAsICAgOSwgICAxMDQsIDE1OCwgMTU5LAorICAgIDkyLCAgMTQyLCAxNDMsIDgxLCAgMTI3LCAxMjcsIDY5LCAgMTEwLCAxMTAsIDU2LCAgOTQsICA5NCwgIDQzLCAgNzgsICA3OCwKKyAgICAyOCwgIDYwLCAgNjAsICAyLCAgIDM4LCAgMzgsICAwLCAgIDAsICAgMSwgICAxMDcsIDE1NywgMTQwLCA5NCwgIDE0MSwgMTI1LAorICAgIDgyLCAgMTI2LCAxMTIsIDcxLCAgMTEwLCA5NywgIDU5LCAgOTQsICA4MiwgIDQ1LCAgNzcsICA2NywgIDI5LCAgNTksICA1MSwKKyAgICA0LCAgIDM3LCAgMzAsICAwLCAgIDAsICAgMCwgICAxMTAsIDE1NiwgMTIyLCA5NywgIDE0MCwgMTA5LCA4NSwgIDEyNSwgOTcsCisgICAgNzIsICAxMDksIDgzLCAgNTgsICA5MywgIDcxLCAgNDUsICA3NywgIDU3LCAgMjksICA2MCwgIDQyLCAgNSwgICAzOCwgIDIyLAorICAgIDAsICAgMCwgICAwLCAgIDExMSwgMTU2LCAxMDMsIDk5LCAgMTM5LCA5MSwgIDg3LCAgMTI1LCA4MSwgIDczLCAgMTA4LCA2OSwKKyAgICA2MCwgIDkyLCAgNTgsICA0NiwgIDc3LCAgNDUsICAzMCwgIDU5LCAgMzEsICA1LCAgIDM4LCAgMTIsICAwLCAgIDAsICAgMCwKKyAgICAxMTUsIDE1NiwgODIsICAxMDEsIDE0MCwgNzMsICA4OCwgIDEyNCwgNjMsICA3NCwgIDEwOCwgNTMsICA2MCwgIDkyLCAgNDQsCisgICAgNDYsICA3NiwgIDMyLCAgMzEsICA1OSwgIDE4LCAgNiwgICAzNywgIDAsICAgMCwgICAwLCAgIDAsICAgMTE2LCAxNTUsIDY1LAorICAgIDEwMiwgMTM5LCA1OCwgIDg5LCAgMTI0LCA0OSwgIDc1LCAgMTA4LCA0MSwgIDYxLCAgOTIsICAzMiwgIDQ4LCAgNzYsICAyMSwKKyAgICAzMSwgIDU5LCAgNiwgICA1LCAgIDM3LCAgMCwgICAwLCAgIDAsICAgMCwgICAxMDAsIDE0MSwgMjAxLCA4OCwgIDEyNywgMTgxLAorICAgIDc5LCAgMTE0LCAxNjIsIDY5LCAgOTksICAxNDIsIDU3LCAgODMsICAxMjIsIDQ0LCAgNjgsICAxMDIsIDMwLCAgNTEsICA4MSwKKyAgICA3LCAgIDI4LCAgNTYsICAwLCAgIDAsICAgMTksICAxMDUsIDE0MSwgMTgyLCA5NCwgIDEyNywgMTYzLCA4MywgIDExNCwgMTQ2LAorICAgIDcxLCAgOTgsICAxMjgsIDU5LCAgODMsICAxMTAsIDQ2LCAgNjgsICA5MSwgIDMxLCAgNTEsICA3MiwgIDEwLCAgMjgsICA0OCwKKyAgICAwLCAgIDAsICAgMTEsICAxMDgsIDE0MSwgMTY2LCA5NiwgIDEyNywgMTQ5LCA4NSwgIDExMywgMTMzLCA3MywgIDk4LCAgMTE2LAorICAgIDYwLCAgODMsICA5OSwgIDQ2LCAgNjgsICA4MiwgIDMyLCAgNTEsICA2NCwgIDExLCAgMjksICA0MSwgIDAsICAgMCwgICAyLAorICAgIDExMSwgMTQxLCAxNDksIDk4LCAgMTI2LCAxMzQsIDg4LCAgMTEyLCAxMTksIDc0LCAgOTcsICAxMDMsIDYxLCAgODMsICA4OCwKKyAgICA0OCwgIDY3LCAgNzIsICAzMywgIDUxLCAgNTYsICAxMSwgIDI5LCAgMzQsICAwLCAgIDAsICAgMCwgICAxMTIsIDE0MCwgMTMyLAorICAgIDEwMCwgMTI1LCAxMTgsIDg5LCAgMTEyLCAxMDUsIDc1LCAgOTcsICA5MSwgIDYyLCAgODIsICA3NywgIDQ5LCAgNjgsICA2MiwKKyAgICAzMywgIDUxLCAgNDcsICAxMiwgIDI5LCAgMjYsICAwLCAgIDAsICAgMCwgICAxMTUsIDE0MCwgMTE2LCAxMDIsIDEyNSwgMTAzLAorICAgIDkwLCAgMTExLCA5MSwgIDc2LCAgOTYsICA3OCwgIDYyLCAgODIsICA2NSwgIDQ5LCAgNjcsICA1MiwgIDM0LCAgNTEsICAzOCwKKyAgICAxMywgIDI5LCAgMTgsICAwLCAgIDAsICAgMCwgICAxMTcsIDEzOSwgOTcsICAxMDMsIDEyNCwgODcsICA5MSwgIDExMSwgNzcsCisgICAgNzgsICA5NiwgIDY1LCAgNjMsICA4MSwgIDU0LCAgNDksICA2NywgIDQxLCAgMzQsICA1MSwgIDI3LCAgMTIsICAyOSwgIDcsCisgICAgMCwgICAwLCAgIDAsICAgMTE5LCAxMzgsIDc4LCAgMTA1LCAxMjQsIDY5LCAgOTIsICAxMTAsIDYwLCAgNzgsICA5NSwgIDUwLAorICAgIDY1LCAgODEsICA0MCwgIDUwLCAgNjcsICAyOSwgIDM0LCAgNTEsICAxNSwgIDEzLCAgMzAsICAwLCAgIDAsICAgMCwgICAwLAorICAgIDEyMCwgMTM4LCA2NCwgIDEwNiwgMTI0LCA1NCwgIDkzLCAgMTEwLCA0NywgIDc4LCAgOTUsICAzOCwgIDY1LCAgODEsICAyOSwKKyAgICA1MCwgIDY2LCAgMTcsICAzNCwgIDUwLCAgMiwgICAxMywgIDI5LCAgMCwgICAwLCAgIDAsICAgMCwgICAxMDcsIDEyNCwgMTg5LAorICAgIDk2LCAgMTExLCAxNjksIDg1LCAgOTksICAxNTIsIDczLCAgODUsICAxMzIsIDYxLCAgNzEsICAxMTQsIDQ4LCAgNTcsICA5NSwKKyAgICAzNCwgIDQxLCAgNzUsICAxNCwgIDE4LCAgNTEsICAwLCAgIDAsICAgMTMsICAxMTEsIDEyNCwgMTcxLCAxMDAsIDExMSwgMTUzLAorICAgIDg4LCAgOTksICAxMzcsIDc1LCAgODUsICAxMjAsIDYzLCAgNzIsICAxMDMsIDUwLCAgNTgsICA4NSwgIDM2LCAgNDEsICA2NiwKKyAgICAxNSwgIDE5LCAgNDMsICAwLCAgIDAsICAgNCwgICAxMTMsIDEyNCwgMTU2LCAxMDEsIDExMSwgMTM5LCA5MCwgIDk5LCAgMTI1LAorICAgIDc3LCAgODUsICAxMDksIDY0LCAgNzEsICA5MywgIDUxLCAgNTcsICA3NywgIDM2LCAgNDIsICA1OSwgIDE3LCAgMjAsICAzNywKKyAgICAwLCAgIDAsICAgMCwgICAxMTUsIDEyNCwgMTQwLCAxMDMsIDExMSwgMTI1LCA5MCwgIDk5LCAgMTEyLCA3OCwgIDg1LCAgOTcsCisgICAgNjQsICA3MSwgIDgyLCAgNTIsICA1NywgIDY3LCAgMzYsICA0MiwgIDUwLCAgMTYsICAyMCwgIDMwLCAgMCwgICAwLCAgIDAsCisgICAgMTE3LCAxMjMsIDEyNSwgMTA0LCAxMTAsIDExMSwgOTIsICA5OCwgIDk5LCAgNzksICA4NSwgIDg2LCAgNjUsICA3MSwgIDcyLAorICAgIDUxLCAgNTgsICA1OSwgIDM3LCAgNDIsICA0MywgIDE3LCAgMjEsICAyMiwgIDAsICAgMCwgICAwLCAgIDExOCwgMTIzLCAxMTAsCisgICAgMTA1LCAxMTAsIDk3LCAgOTMsICA5OCwgIDg2LCAgNzgsICA4NCwgIDc0LCAgNjYsICA3MSwgIDYyLCAgNTIsICA1NywgIDQ5LAorICAgIDM3LCAgNDIsICAzNCwgIDE3LCAgMjIsICAxNCwgIDAsICAgMCwgICAwLCAgIDEyMCwgMTIzLCA5MywgIDEwNiwgMTA5LCA4MiwKKyAgICA5NCwgIDk3LCAgNzIsICA4MCwgIDg0LCAgNjEsICA2NiwgIDcxLCAgNTAsICA1MiwgIDU3LCAgMzgsICAzNywgIDQyLCAgMjQsCisgICAgMTcsICAyMiwgIDIsICAgMCwgICAwLCAgIDAsICAgMTIxLCAxMjIsIDc1LCAgMTA4LCAxMDksIDY2LCAgOTUsICA5NywgIDU4LAorICAgIDgwLCAgODQsICA0OCwgIDY2LCAgNzEsICAzNywgIDUyLCAgNTcsICAyNiwgIDM3LCAgNDIsICAxMiwgIDE2LCAgMjIsICAwLAorICAgIDAsICAgMCwgICAwLCAgIDEyMiwgMTIzLCA2MiwgIDEwOCwgMTA5LCA1MiwgIDk1LCAgOTcsICA0NSwgIDgxLCAgODQsICAzNiwKKyAgICA2NywgIDcwLCAgMjYsICA1MiwgIDU3LCAgMTQsICAzNywgIDQyLCAgMCwgICAxNSwgIDIyLCAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAxMTMsIDEwNywgMTc3LCAxMDIsIDk2LCAgMTU5LCA4OSwgIDg1LCAgMTQxLCA3OCwgIDcyLCAgMTI0LCA2NSwgIDYwLCAgMTA3LAorICAgIDUyLCAgNDYsICA4OSwgIDM3LCAgMzAsICA3MCwgIDE4LCAgNSwgICA0NiwgIDAsICAgMCwgICA2LCAgIDExNiwgMTA3LCAxNjAsCisgICAgMTA0LCA5NiwgIDE0NCwgOTIsICA4NSwgIDEyOSwgODAsICA3MiwgIDExMiwgNjcsICA2MCwgIDk2LCAgNTMsICA0NywgIDgwLAorICAgIDM4LCAgMzEsICA2MiwgIDE5LCAgNywgICAzOSwgIDAsICAgMCwgICAwLCAgIDExOCwgMTA3LCAxNDcsIDEwNSwgOTYsICAxMzEsCisgICAgOTMsICA4NSwgIDExOCwgODAsICA3MiwgIDEwMSwgNjcsICA2MCwgIDg3LCAgNTQsICA0NywgIDcxLCAgMzksICAzMSwgIDU0LAorICAgIDE5LCAgOCwgICAzMiwgIDAsICAgMCwgICAwLCAgIDExOSwgMTA3LCAxMzIsIDEwNiwgOTYsICAxMTgsIDk0LCAgODUsICAxMDYsCisgICAgODEsICA3MywgIDkxLCAgNjcsICA2MCwgIDc3LCAgNTQsICA0NywgIDYzLCAgMzksICAzMiwgIDQ3LCAgMjAsICA5LCAgIDI1LAorICAgIDAsICAgMCwgICAwLCAgIDExOSwgMTA3LCAxMTgsIDEwNiwgOTUsICAxMDUsIDk0LCAgODUsICA5MywgIDgxLCAgNzIsICA4MCwKKyAgICA2OCwgIDYwLCAgNjgsICA1NCwgIDQ3LCAgNTQsICAzOSwgIDMyLCAgMzksICAyMCwgIDExLCAgMTgsICAwLCAgIDAsICAgMCwKKyAgICAxMjEsIDEwNywgMTA0LCAxMDcsIDk2LCAgOTIsICA5NSwgIDg0LCAgODAsICA4MSwgIDcyLCAgNjksICA2OCwgIDYxLCAgNTgsCisgICAgNTQsICA0OCwgIDQ2LCAgMzksICAzMywgIDMxLCAgMjAsICAxMiwgIDksICAgMCwgICAwLCAgIDAsICAgMTIzLCAxMDcsIDg4LAorICAgIDEwOCwgOTUsICA3NywgIDk2LCAgODQsICA2OCwgIDgyLCAgNzIsICA1NywgIDY4LCAgNjAsICA0NiwgIDU0LCAgNDcsICAzNSwKKyAgICAzOSwgIDMzLCAgMjAsICAxOSwgIDEzLCAgMiwgICAwLCAgIDAsICAgMCwgICAxMjMsIDEwNiwgNzIsICAxMTAsIDk1LCAgNjMsCisgICAgOTYsICA4NCwgIDU0LCAgODIsICA3MiwgIDQ1LCAgNjksICA2MCwgIDM1LCAgNTUsICA0OCwgIDIzLCAgMzksICAzMywgIDksCisgICAgMTgsICAxNCwgIDAsICAgMCwgICAwLCAgIDAsICAgMTI1LCAxMDYsIDYwLCAgMTEwLCA5NCwgIDUwLCAgOTgsICA4NCwgIDQyLAorICAgIDgzLCAgNzIsICAzNCwgIDY5LCAgNjAsICAyNSwgIDU1LCAgNDgsICAxMiwgIDM5LCAgMzMsICAwLCAgIDE3LCAgMTMsICAwLAorICAgIDAsICAgMCwgICAwLCAgIDExOCwgODksICAxNjUsIDEwNSwgNzksICAxNDgsIDkzLCAgNjksICAxMzIsIDgxLCAgNTcsICAxMTUsCisgICAgNjgsICA0NSwgIDk5LCAgNTUsICAzMiwgIDgyLCAgNDEsICAxNSwgIDY0LCAgMjEsICAwLCAgIDQxLCAgMCwgICAwLCAgIDAsCisgICAgMTIwLCA4OSwgIDE1MCwgMTA3LCA3OSwgIDEzNSwgOTYsICA2OSwgIDEyMSwgODIsICA1OCwgIDEwNSwgNzAsICA0NiwgIDg5LAorICAgIDU2LCAgMzQsICA3MywgIDQxLCAgMTcsICA1NiwgIDIxLCAgMCwgICAzNCwgIDAsICAgMCwgICAwLCAgIDEyMSwgODksICAxMzcsCisgICAgMTA4LCA3OSwgIDEyMywgOTYsICA2OSwgIDEwOSwgODIsICA1OCwgIDk1LCAgNzAsICA0NywgIDgxLCAgNTYsICAzNCwgIDY2LAorICAgIDQxLCAgMTgsICA0OSwgIDIxLCAgMCwgICAyOCwgIDAsICAgMCwgICAwLCAgIDEyMiwgOTAsICAxMjQsIDEwOSwgNzksICAxMTAsCisgICAgOTYsICA2OSwgIDk5LCAgODMsICA1OCwgIDg1LCAgNzAsICA0NywgIDcyLCAgNTYsICAzNSwgIDU4LCAgNDEsICAxOSwgIDQyLAorICAgIDIxLCAgMCwgICAyMiwgIDAsICAgMCwgICAwLCAgIDEyMywgOTAsICAxMTEsIDExMCwgNzksICA5OCwgIDk3LCAgNjksICA4NywKKyAgICA4MywgIDU5LCAgNzUsICA3MCwgIDQ3LCAgNjMsICA1NiwgIDM1LCAgNTAsICA0MSwgIDIwLCAgMzUsICAyMSwgIDAsICAgMTQsCisgICAgMCwgICAwLCAgIDAsICAgMTIzLCA5MCwgIDk4LCAgMTEwLCA3OSwgIDg3LCAgOTcsICA3MCwgIDc2LCAgODQsICA1OCwgIDY0LAorICAgIDcwLCAgNDgsICA1MywgIDU2LCAgMzYsICA0MSwgIDQwLCAgMjEsICAyNiwgIDIxLCAgMCwgICA1LCAgIDAsICAgMCwgICAwLAorICAgIDEyNSwgODksICA4NCwgIDExMSwgNzksICA3MywgIDk3LCAgNjksICA2NCwgIDg0LCAgNTksICA1NCwgIDcwLCAgNDgsICA0MywKKyAgICA1NiwgIDM2LCAgMzEsICA0MCwgIDIyLCAgMTcsICAyMCwgIDEsICAgMSwgICAwLCAgIDAsICAgMCwgICAxMjUsIDg5LCAgNjksCisgICAgMTEyLCA3OSwgIDYwLCAgOTgsICA3MCwgIDUxLCAgODQsICA1OSwgIDQyLCAgNzAsICA0OCwgIDMyLCAgNTYsICAzNiwgIDIwLAorICAgIDQxLCAgMjIsICA1LCAgIDE5LCAgMiwgICAwLCAgIDAsICAgMCwgICAwLCAgIDEyNiwgODksICA1NywgIDExMiwgNzksICA0OSwKKyAgICA5OSwgIDcwLCAgNDEsICA4NCwgIDU5LCAgMzIsICA3MCwgIDQ4LCAgMjIsICA1NiwgIDM2LCAgMTAsICA0MCwgIDIyLCAgMCwKKyAgICAxOCwgIDIsICAgMCwgICAwLCAgIDAsICAgMCwgICAxMjEsIDY3LCAgMTU0LCAxMDgsIDU4LCAgMTM4LCA5NywgIDUwLCAgMTI0LAorICAgIDg0LCAgMzksICAxMDcsIDcxLCAgMjgsICA5MiwgIDU4LCAgMTIsICA3NiwgIDQzLCAgMCwgICA1OSwgIDIwLCAgMCwgICAzNywKKyAgICAwLCAgIDAsICAgMCwgICAxMjQsIDY4LCAgMTQwLCAxMTEsIDU5LCAgMTI2LCA5OCwgIDUwLCAgMTEyLCA4NCwgIDQwLCAgOTgsCisgICAgNzEsICAyOSwgIDgzLCAgNTgsICAxNSwgIDY3LCAgNDIsICAwLCAgIDUxLCAgMjAsICAwLCAgIDMwLCAgMCwgICAwLCAgIDAsCisgICAgMTI0LCA2OCwgIDEyOSwgMTExLCA1OSwgIDExNCwgOTksICA1MSwgIDEwMiwgODYsICA0MSwgIDg4LCAgNzEsICAzMCwgIDc1LAorICAgIDU4LCAgMTcsICA2MCwgIDQyLCAgMCwgICA0NSwgIDIwLCAgMCwgICAyNCwgIDAsICAgMCwgICAwLCAgIDEyNSwgNzAsICAxMTYsCisgICAgMTExLCA2MCwgIDEwMywgOTksICA1MSwgIDkyLCAgODUsICA0MSwgIDc5LCAgNzEsICAzMSwgIDY2LCAgNTgsICAxOSwgIDUzLAorICAgIDQyLCAgMywgICAzOCwgIDIwLCAgMCwgICAxNywgIDAsICAgMCwgICAwLCAgIDEyNSwgNzAsICAxMDQsIDExMSwgNjEsICA5MywKKyAgICA5OSwgIDUyLCAgODEsICA4NSwgIDQzLCAgNjksICA3MiwgIDMyLCAgNTgsICA1OCwgIDIwLCAgNDUsICA0MiwgIDQsICAgMzEsCisgICAgMjAsICAwLCAgIDgsICAgMCwgICAwLCAgIDAsICAgMTI2LCA3MCwgIDkyLCAgMTExLCA2MSwgIDgxLCAgOTksICA1MiwgIDcxLAorICAgIDg1LCAgNDIsICA2MCwgIDcxLCAgMzMsICA0OSwgIDU3LCAgMjEsICAzNywgIDQyLCAgNiwgICAyMywgIDIwLCAgMCwgICAzLAorICAgIDAsICAgMCwgICAwLCAgIDEyNiwgNzAsICA3OSwgIDExMiwgNjEsICA3MCwgIDk5LCAgNTMsICA2MCwgIDg1LCAgNDMsICA1MCwKKyAgICA3MSwgIDMzLCAgMzksICA1NywgIDIyLCAgMjgsICA0MSwgIDcsICAgMTMsICAxOSwgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAxMjcsIDcxLCAgNjYsICAxMTMsIDYyLCAgNTYsICAxMDAsIDUzLCAgNDgsICA4NiwgIDQ0LCAgMzksICA3MSwgIDM0LCAgMjksCisgICAgNTcsICAyMywgIDE4LCAgNDEsICA4LCAgIDIsICAgMTgsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTI4LCA3MCwgIDU1LAorICAgIDExNCwgNjIsICA0NiwgIDEwMCwgNTQsICAzOSwgIDg2LCAgNDQsICAzMCwgIDcxLCAgMzQsICAyMCwgIDU3LCAgMjMsICA3LAorICAgIDQxLCAgOSwgICAwLCAgIDE4LCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDEyNCwgNDEsICAxNDUsIDExMSwgMzIsICAxMjgsCisgICAgOTksICAyMywgIDExNCwgODYsICAxMCwgIDEwMCwgNzMsICAwLCAgIDg1LCAgNjAsICAwLCAgIDcxLCAgNDMsICAwLCAgIDU0LAorICAgIDE3LCAgMCwgICAzMiwgIDAsICAgMCwgICAwLCAgIDEyNiwgNDIsICAxMzEsIDExMywgMzMsICAxMTcsIDEwMCwgMjUsICAxMDQsCisgICAgODYsICAxNCwgIDkwLCAgNzMsICAwLCAgIDc3LCAgNjAsICAwLCAgIDYzLCAgNDQsICAwLCAgIDQ3LCAgMTgsICAwLCAgIDI1LAorICAgIDAsICAgMCwgICAwLCAgIDEyNywgNDMsICAxMjAsIDExMywgMzQsICAxMDYsIDEwMSwgMjYsICA5NSwgIDg2LCAgMTcsICA4MiwKKyAgICA3MywgIDIsICAgNjksICA1OSwgIDAsICAgNTYsICA0MywgIDAsICAgNDEsICAxOCwgIDAsICAgMTksICAwLCAgIDAsICAgMCwKKyAgICAxMjcsIDQ1LCAgMTA5LCAxMTMsIDM3LCAgOTcsICAxMDEsIDI4LCAgODUsICA4NiwgIDE5LCAgNzQsICA3MywgIDUsICAgNjEsCisgICAgNTksICAwLCAgIDQ4LCAgNDMsICAwLCAgIDM0LCAgMTksICAwLCAgIDExLCAgMCwgICAwLCAgIDAsICAgMTI3LCA0NiwgIDk4LAorICAgIDExNCwgMzgsICA4NiwgIDEwMCwgMzAsICA3NiwgIDg3LCAgMjEsICA2NSwgIDczLCAgOSwgICA1NCwgIDU5LCAgMCwgICA0MSwKKyAgICA0MywgIDAsICAgMjYsICAxOCwgIDAsICAgNSwgICAwLCAgIDAsICAgMCwgICAxMjcsIDQ3LCAgODcsICAxMTMsIDM5LCAgNzYsCisgICAgMTAxLCAzMSwgIDY3LCAgODYsICAyMiwgIDU2LCAgNzIsICAxMSwgIDQ1LCAgNTksICAwLCAgIDMzLCAgNDMsICAwLCAgIDE5LAorICAgIDE4LCAgMCwgICAyLCAgIDAsICAgMCwgICAwLCAgIDEyOCwgNDgsICA3NSwgIDExNCwgMzksICA2NSwgIDEwMSwgMzMsICA1NiwKKyAgICA4NiwgIDIzLCAgNDYsICA3MiwgIDEyLCAgMzYsICA1OCwgIDAsICAgMjQsICA0MiwgIDAsICAgOSwgICAxNywgIDAsICAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAxMjksIDQ4LCAgNjMsICAxMTQsIDQxLCAgNTQsICAxMDIsIDMzLCAgNDYsICA4NywgIDI0LCAgMzYsCisgICAgNzIsICAxNCwgIDI2LCAgNTgsICAxLCAgIDE0LCAgNDIsICAwLCAgIDIsICAgMTYsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMTI4LCA0OCwgIDUzLCAgMTE0LCA0MSwgIDQ0LCAgMTAyLCAzNCwgIDM3LCAgODcsICAyNSwgIDI3LCAgNzIsICAxNSwgIDE3LAorICAgIDU4LCAgMSwgICAzLCAgIDQxLCAgMCwgICAwLCAgIDE1LCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTg5LCAyNDIsCisgICAgMCwgICAxNjksIDIxNywgMCwgICAxNTEsIDE5NCwgMCwgICAxMzIsIDE3MCwgMCwgICAxMTMsIDE0NywgMCwgICA5NCwgIDEyMywKKyAgICAwLCAgIDc0LCAgOTksICAwLCAgIDUxLCAgNzEsICAwLCAgIDE1LCAgMzQsICAxLCAgIDE4NywgMjE5LCAxLCAgIDE2NywgMTk1LAorICAgIDAsICAgMTUwLCAxNzUsIDAsICAgMTMxLCAxNTMsIDAsICAgMTEzLCAxMzIsIDAsICAgOTQsICAxMTEsIDAsICAgNzQsICA4OSwKKyAgICAwLCAgIDUwLCAgNjMsICAwLCAgIDEzLCAgMjgsICAxLCAgIDE4NiwgMTk4LCAxLCAgIDE2NywgMTc4LCAwLCAgIDE0OSwgMTU4LAorICAgIDAsICAgMTMwLCAxMzksIDAsICAgMTExLCAxMTksIDAsICAgOTMsICAxMDAsIDAsICAgNzQsICA4MCwgIDAsICAgNTAsICA1NSwKKyAgICAwLCAgIDEzLCAgMjIsICAxLCAgIDE4NSwgMTc2LCAxLCAgIDE2NSwgMTU5LCAxLCAgIDE0OCwgMTQyLCAwLCAgIDEyOSwgMTIzLAorICAgIDAsICAgMTExLCAxMDYsIDAsICAgOTMsICA4OSwgIDAsICAgNzMsICA3MCwgIDAsICAgNTAsICA0NywgIDAsICAgMTMsICAxMywKKyAgICAxLCAgIDE4NCwgMTU3LCAxLCAgIDE2NCwgMTQxLCAxLCAgIDE0NywgMTI1LCAwLCAgIDEyOCwgMTEwLCAwLCAgIDExMCwgOTMsCisgICAgMCwgICA5MiwgIDc3LCAgMCwgICA3MywgIDYwLCAgMCwgICA1MCwgIDM5LCAgMCwgICAxMiwgIDUsICAgMjUsICAxODIsIDEzNywKKyAgICAyNSwgIDE2MywgMTIyLCAxNywgIDE0NiwgMTA5LCAwLCAgIDEyOCwgOTYsICAwLCAgIDExMCwgODEsICAwLCAgIDkyLCAgNjYsCisgICAgMCwgICA3MywgIDUxLCAgMCwgICA1MCwgIDMwLCAgMCwgICAxMCwgIDAsICAgNDIsICAxODEsIDExNCwgMzUsICAxNjMsIDEwMiwKKyAgICAzMCwgIDE0NSwgOTEsICAxNCwgIDEyNywgODAsICAwLCAgIDEwOSwgNjcsICAwLCAgIDkxLCAgNTMsICAwLCAgIDcyLCAgMzksCisgICAgMCwgICA1MCwgIDE5LCAgMCwgICAxMCwgIDAsICAgNTIsICAxODEsIDkyLCAgNDMsICAxNjIsIDgzLCAgMzIsICAxNDUsIDczLAorICAgIDE5LCAgMTI2LCA2MywgIDAsICAgMTA4LCA1MiwgIDAsICAgOTAsICA0MCwgIDAsICAgNzIsICAyNywgIDAsICAgNTAsICA3LAorICAgIDAsICAgMTAsICAwLCAgIDU3LCAgMTgxLCA3NCwgIDQ4LCAgMTYyLCA2NiwgIDM3LCAgMTQ0LCA1NywgIDI0LCAgMTI2LCA0OSwKKyAgICA3LCAgIDEwOCwgNDAsICAwLCAgIDkwLCAgMjksICAwLCAgIDcyLCAgMTUsICAwLCAgIDQ5LCAgMCwgICAwLCAgIDEwLCAgMCwKKyAgICAxLCAgIDE3MCwgMjI3LCAxLCAgIDE1MiwgMjAzLCAwLCAgIDEzNiwgMTgyLCAwLCAgIDExOSwgMTU5LCAwLCAgIDEwMSwgMTM3LAorICAgIDAsICAgODQsICAxMTUsIDAsICAgNjUsICA5MiwgIDAsICAgNDMsICA2NiwgIDAsICAgMSwgICAyOSwgIDEsICAgMTY5LCAyMDYsCisgICAgMSwgICAxNTEsIDE4NCwgMSwgICAxMzYsIDE2NSwgMCwgICAxMTgsIDE0NCwgMCwgICAxMDIsIDEyNSwgMCwgICA4NCwgIDEwNSwKKyAgICAwLCAgIDY1LCAgODMsICAwLCAgIDQzLCAgNTgsICAwLCAgIDAsICAgMjIsICAyOSwgIDE2OCwgMTg2LCAyMSwgIDE1MSwgMTY3LAorICAgIDE0LCAgMTM1LCAxNTAsIDQsICAgMTE4LCAxMzEsIDAsICAgMTAxLCAxMTIsIDAsICAgODMsICA5NCwgIDAsICAgNjUsICA3NSwKKyAgICAwLCAgIDQzLCAgNTEsICAwLCAgIDAsICAgMTYsICA0MSwgIDE2NywgMTY3LCAzMywgIDE1MCwgMTUwLCAzMSwgIDEzNCwgMTM0LAorICAgIDE5LCAgMTE3LCAxMTcsIDQsICAgMTAwLCAxMDAsIDAsICAgODMsICA4MywgIDAsICAgNjUsICA2NSwgIDAsICAgNDIsICA0MywKKyAgICAwLCAgIDAsICAgOCwgICA0OCwgIDE2NywgMTQ5LCA0MSwgIDE0OSwgMTMzLCAzMywgIDEzMywgMTE4LCAyNSwgIDExNiwgMTAzLAorICAgIDEzLCAgOTksICA4OCwgIDAsICAgODMsICA3MywgIDAsICAgNjUsICA1NiwgIDAsICAgNDIsICAzNSwgIDAsICAgMCwgICAwLAorICAgIDU4LCAgMTY1LCAxMzAsIDQ5LCAgMTQ4LCAxMTUsIDQyLCAgMTMyLCAxMDMsIDMxLCAgMTE1LCA4OSwgIDE4LCAgOTksICA3NSwKKyAgICAwLCAgIDgyLCAgNjEsICAwLCAgIDY0LCAgNDYsICAwLCAgIDQyLCAgMjYsICAwLCAgIDAsICAgMCwgICA2MiwgIDE2NCwgMTEwLAorICAgIDU1LCAgMTQ3LCA5NywgIDQ1LCAgMTMyLCA4NywgIDM1LCAgMTE1LCA3NSwgIDIyLCAgOTgsICA2MywgIDUsICAgODIsICA1MCwKKyAgICAwLCAgIDY0LCAgMzYsICAwLCAgIDQyLCAgMTYsICAwLCAgIDAsICAgMCwgICA2OSwgIDE2NCwgODksICA2MCwgIDE0NywgNzgsCisgICAgNTAsICAxMzEsIDcwLCAgMzcsICAxMTQsIDU5LCAgMjYsICA5OCwgIDQ5LCAgMTAsICA4MSwgIDM3LCAgMCwgICA2NCwgIDI0LAorICAgIDAsICAgNDIsICA0LCAgIDAsICAgMCwgICAwLCAgIDcxLCAgMTY0LCA3MSwgIDYzLCAgMTQ3LCA2MywgIDUzLCAgMTMxLCA1NSwKKyAgICA0MCwgIDExNCwgNDcsICAyOCwgIDk4LCAgMzgsICAxMywgIDgxLCAgMjYsICAwLCAgIDY0LCAgMTIsICAwLCAgIDQyLCAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAyOCwgIDE1MywgMjE0LCAyNCwgIDEzOCwgMTkzLCAyMywgIDEyMywgMTcxLCAxNiwgIDEwNywgMTUwLAorICAgIDAsICAgOTEsICAxMzAsIDAsICAgNzUsICAxMDksIDAsICAgNTgsICA4NywgIDAsICAgMzUsICA2MSwgIDAsICAgMCwgICAyNSwKKyAgICA0OCwgIDE1MywgMTk0LCA0MSwgIDEzOCwgMTc0LCAzNCwgIDEyMywgMTU2LCAyNywgIDEwNywgMTM2LCAxNiwgIDkxLCAgMTE3LAorICAgIDEsICAgNzUsICA5OCwgIDAsICAgNTcsICA3OCwgIDAsICAgMzUsICA1MywgIDAsICAgMCwgICAxNywgIDU1LCAgMTUzLCAxNzcsCisgICAgNDcsICAxMzcsIDE1OCwgNDIsICAxMjIsIDE0MiwgMzMsICAxMDcsIDEyNCwgMjIsICA5MSwgIDEwNiwgNiwgICA3NSwgIDg4LAorICAgIDAsICAgNTcsICA3MCwgIDAsICAgMzUsICA0NiwgIDAsICAgMCwgICA5LCAgIDYxLCAgMTUyLCAxNTgsIDUzLCAgMTM2LCAxNDMsCisgICAgNDUsICAxMjIsIDEyNywgMzYsICAxMDYsIDExMSwgMjQsICA5MCwgIDk0LCAgMTAsICA3NCwgIDc4LCAgMCwgICA1NywgIDYxLAorICAgIDAsICAgMzUsICAzOSwgIDAsICAgMCwgICAyLCAgIDY3LCAgMTUxLCAxNDEsIDU5LCAgMTM1LCAxMjYsIDQ5LCAgMTIxLCAxMTIsCisgICAgMzksICAxMDUsIDk4LCAgMjksICA5MCwgIDgzLCAgMTQsICA3NCwgIDY4LCAgMCwgICA1NywgIDUyLCAgMCwgICAzNSwgIDMxLAorICAgIDAsICAgMCwgICAwLCAgIDcxLCAgMTUwLCAxMjMsIDYyLCAgMTM1LCAxMTAsIDU0LCAgMTIwLCA5OCwgIDQyLCAgMTA1LCA4NCwKKyAgICAzMSwgIDg5LCAgNzEsICAxNiwgIDc0LCAgNTgsICAwLCAgIDU3LCAgNDMsICAwLCAgIDM1LCAgMjIsICAwLCAgIDAsICAgMCwKKyAgICA3NCwgIDE1MCwgMTA1LCA2NCwgIDEzNCwgOTIsICA1NSwgIDEyMCwgODMsICA0NSwgIDEwNCwgNzEsICAzNCwgIDg5LCAgNTksCisgICAgMjAsICA3MywgIDQ3LCAgMCwgICA1NywgIDMyLCAgMCwgICAzNSwgIDEzLCAgMCwgICAwLCAgIDAsICAgNzgsICAxNDksIDg0LAorICAgIDY5LCAgMTM0LCA3NSwgIDU5LCAgMTIwLCA2NiwgIDQ3LCAgMTAzLCA1NiwgIDM0LCAgODgsICA0NiwgIDIyLCAgNzMsICAzNCwKKyAgICAxLCAgIDU3LCAgMjAsICAwLCAgIDM1LCAgMSwgICAwLCAgIDAsICAgMCwgICA4MCwgIDE0OSwgNjksICA3MCwgIDEzMywgNjEsCisgICAgNjAsICAxMTksIDUzLCAgNDksICAxMDMsIDQ0LCAgMzYsICA4OCwgIDM1LCAgMjMsICA3MywgIDI0LCAgMiwgICA1NiwgIDEwLAorICAgIDAsICAgMzUsICAwLCAgIDAsICAgMCwgICAwLCAgIDU4LCAgMTM2LCAyMDAsIDUwLCAgMTIyLCAxODAsIDQ1LCAgMTA5LCAxNjIsCisgICAgMzgsICA5NCwgIDE0MSwgMjcsICA4MCwgIDEyMSwgMTUsICA2NSwgIDEwMiwgMCwgICA0OCwgIDgxLCAgMCwgICAyNiwgIDU2LAorICAgIDAsICAgMCwgICAxOSwgIDY2LCAgMTM2LCAxODIsIDU5LCAgMTIyLCAxNjMsIDUyLCAgMTA5LCAxNDYsIDQyLCAgOTQsICAxMjgsCisgICAgMzIsICA4MCwgIDEwOSwgMjAsICA2NSwgIDkxLCAgMiwgICA0OCwgIDcyLCAgMCwgICAyNiwgIDQ5LCAgMCwgICAwLCAgIDExLAorICAgIDcwLCAgMTM2LCAxNjUsIDYyLCAgMTIyLCAxNDksIDU1LCAgMTA4LCAxMzMsIDQ2LCAgOTQsICAxMTYsIDM1LCAgODAsICA5OSwKKyAgICAyMSwgIDY1LCAgODIsICA0LCAgIDQ5LCAgNjQsICAwLCAgIDI2LCAgNDEsICAwLCAgIDAsICAgMywgICA3NiwgIDEzNSwgMTQ5LAorICAgIDY2LCAgMTIxLCAxMzMsIDU4LCAgMTA4LCAxMTksIDQ4LCAgOTQsICAxMDMsIDM2LCAgNzksICA4OCwgIDIzLCAgNjUsICA3MywKKyAgICA3LCAgIDQ5LCAgNTYsICAwLCAgIDI3LCAgMzQsICAwLCAgIDAsICAgMCwgICA3OCwgIDEzNSwgMTMzLCA2OSwgIDEyMCwgMTE4LAorICAgIDYwLCAgMTA3LCAxMDYsIDUwLCAgOTMsICA5MiwgIDM5LCAgNzksICA3NywgIDI2LCAgNjUsICA2MywgIDgsICAgNDksICA0NywKKyAgICAwLCAgIDI3LCAgMjYsICAwLCAgIDAsICAgMCwgICA4MiwgIDEzNCwgMTE3LCA3MSwgIDEyMCwgMTA0LCA2MiwgIDEwNywgOTIsCisgICAgNTEsICA5MywgIDc5LCAgMzksICA3OCwgIDY2LCAgMjcsICA2NCwgIDUzLCAgMTAsICA0OCwgIDM5LCAgMCwgICAyNywgIDE4LAorICAgIDAsICAgMCwgICAwLCAgIDg0LCAgMTM0LCA5OSwgIDczLCAgMTE5LCA4NywgIDY0LCAgMTA2LCA3NywgIDUzLCAgOTIsICA2NiwKKyAgICA0MiwgIDc4LCAgNTUsICAyOCwgIDY0LCAgNDIsICAxMSwgIDQ4LCAgMjksICAwLCAgIDI4LCAgOSwgICAwLCAgIDAsICAgMCwKKyAgICA4NywgIDEzMywgODEsICA3NiwgIDExOSwgNzIsICA2NiwgIDEwNiwgNjIsICA1NSwgIDkyLCAgNTIsICA0MywgIDc4LCAgNDIsCisgICAgMjksICA2NCwgIDMxLCAgMTIsICA0OCwgIDE3LCAgMCwgICAyOCwgIDAsICAgMCwgICAwLCAgIDAsICAgODgsICAxMzQsIDY3LAorICAgIDc3LCAgMTE5LCA1OCwgIDY4LCAgMTA2LCA1MSwgIDU2LCAgOTIsICA0MiwgIDQ0LCAgNzgsICAzMiwgIDMwLCAgNjQsICAyMCwKKyAgICAxMiwgIDQ4LCAgNiwgICAwLCAgIDI4LCAgMCwgICAwLCAgIDAsICAgMCwgICA3MywgIDEyMCwgMTg5LCA2NCwgIDEwNywgMTY4LAorICAgIDU3LCAgOTYsICAxNTEsIDQ3LCAgODIsICAxMzMsIDM4LCAgNjksICAxMTQsIDI2LCAgNTUsICA5NSwgIDExLCAgMzksICA3NSwKKyAgICAwLCAgIDE2LCAgNTEsICAwLCAgIDAsICAgMTQsICA3OCwgIDEyMCwgMTcxLCA2OSwgIDEwNywgMTUzLCA2MiwgIDk1LCAgMTM3LAorICAgIDUxLCAgODIsICAxMTksIDQwLCAgNjksICAxMDIsIDI5LCAgNTUsICA4NSwgIDE1LCAgMzksICA2NiwgIDAsICAgMTcsICA0NCwKKyAgICAwLCAgIDAsICAgNCwgICA4MSwgIDEyMCwgMTU2LCA3MSwgIDEwNywgMTQwLCA2NCwgIDk1LCAgMTI1LCA1MywgIDgyLCAgMTA5LAorICAgIDQyLCAgNjksICA5MywgIDMxLCAgNTUsICA3NywgIDE2LCAgMzksICA1OSwgIDAsICAgMTgsICAzNywgIDAsICAgMCwgICAwLAorICAgIDg1LCAgMTIwLCAxNDEsIDc0LCAgMTA3LCAxMjYsIDY1LCAgOTUsICAxMTIsIDU0LCAgODIsICA5NywgIDQzLCAgNjksICA4MiwKKyAgICAzMiwgIDU1LCAgNjcsICAxNywgIDM5LCAgNTEsICAwLCAgIDE5LCAgMzAsICAwLCAgIDAsICAgMCwgICA4NiwgIDExOSwgMTI2LAorICAgIDc2LCAgMTA2LCAxMTIsIDY2LCAgOTUsICAxMDAsIDU2LCAgODEsICA4NSwgIDQ1LCAgNjksICA3MiwgIDMzLCAgNTUsICA1OSwKKyAgICAxOCwgIDQwLCAgNDMsICAwLCAgIDE5LCAgMjIsICAwLCAgIDAsICAgMCwgICA4OSwgIDExOSwgMTEwLCA3OCwgIDEwNiwgOTgsCisgICAgNjksICA5NCwgIDg3LCAgNTYsICA4MSwgIDc1LCAgNDYsICA2OCwgIDYyLCAgMzMsICA1NSwgIDQ5LCAgMTgsICA0MCwgIDM1LAorICAgIDAsICAgMjAsICAxNSwgIDAsICAgMCwgICAwLCAgIDg5LCAgMTE5LCA5NSwgIDgwLCAgMTA2LCA4MywgIDcwLCAgOTQsICA3MywKKyAgICA1OCwgIDgxLCAgNjMsICA0NiwgIDY4LCAgNTEsICAzNCwgIDU1LCAgMzksICAxOSwgIDQwLCAgMjUsICAwLCAgIDIwLCAgNCwKKyAgICAwLCAgIDAsICAgMCwgICA5MiwgIDExOCwgNzgsICA4MiwgIDEwNiwgNjgsICA3MCwgIDkzLCAgNTksICA1OSwgIDgxLCAgNDksCisgICAgNDcsICA2OCwgIDM5LCAgMzQsICA1NSwgIDI4LCAgMTksICA0MCwgIDE0LCAgMCwgICAyMCwgIDAsICAgMCwgICAwLCAgIDAsCisgICAgOTMsICAxMTgsIDY1LCAgODIsICAxMDUsIDU1LCAgNzIsICA5MywgIDQ4LCAgNjAsICA4MSwgIDM5LCAgNDcsICA2OCwgIDI5LAorICAgIDM0LCAgNTUsICAxOCwgIDIwLCAgNDAsICAyLCAgIDAsICAgMjAsICAwLCAgIDAsICAgMCwgICAwLCAgIDgzLCAgMTA0LCAxNzcsCisgICAgNzQsICA5MywgIDE1OSwgNjUsICA4MiwgIDE0MiwgNTYsICA3MCwgIDEyNCwgNDUsICA1NywgIDEwNiwgMzMsICA0NCwgIDg5LAorICAgIDIwLCAgMjgsICA3MCwgIDEsICAgNCwgICA0NiwgIDAsICAgMCwgICA4LCAgIDg2LCAgMTA0LCAxNjEsIDc4LCAgOTMsICAxNDUsCisgICAgNjgsICA4MiwgIDEyOCwgNTgsICA3MCwgIDExMiwgNDgsICA1OCwgIDk2LCAgMzUsICA0NSwgIDgwLCAgMjEsICAyOSwgIDYyLAorICAgIDEsICAgNiwgICA0MCwgIDAsICAgMCwgICAwLCAgIDg5LCAgMTA0LCAxNDcsIDc5LCAgOTMsICAxMzEsIDY5LCAgODIsICAxMTgsCisgICAgNTksICA3MCwgIDEwMiwgNDcsICA1OCwgIDg3LCAgMzYsICA0NSwgIDcyLCAgMjMsICAyOSwgIDU1LCAgMywgICA3LCAgIDMzLAorICAgIDAsICAgMCwgICAwLCAgIDkwLCAgMTA0LCAxMzIsIDgwLCAgOTMsICAxMTksIDcxLCAgODIsICAxMDYsIDYwLCAgNzAsICA5MSwKKyAgICA0OCwgIDU4LCAgNzcsICAzNywgIDQ1LCAgNjIsICAyMywgIDMwLCAgNDcsICA0LCAgIDcsICAgMjYsICAwLCAgIDAsICAgMCwKKyAgICA5MiwgIDEwNCwgMTE4LCA4MiwgIDkzLCAgMTA1LCA3MiwgIDgyLCAgOTMsICA2MSwgIDY5LCAgODAsICA1MCwgIDU4LCAgNjgsCisgICAgMzcsICA0NSwgIDU1LCAgMjMsICAzMCwgIDM5LCAgNCwgICA4LCAgIDE4LCAgMCwgICAwLCAgIDAsICAgOTQsICAxMDQsIDEwNSwKKyAgICA4MiwgIDkyLCAgOTMsICA3MiwgIDgyLCAgODIsICA2MSwgIDcwLCAgNzAsICA1MCwgIDU4LCAgNTgsICAzOCwgIDQ2LCAgNDYsCisgICAgMjMsICAzMSwgIDMxLCAgNiwgICAxMCwgIDExLCAgMCwgICAwLCAgIDAsICAgOTUsICAxMDQsIDkwLCAgODQsICA5MiwgIDc5LAorICAgIDc0LCAgODIsICA3MCwgIDYyLCAgNzAsICA1OCwgIDUwLCAgNTgsICA0OCwgIDM3LCAgNDYsICAzNiwgIDIzLCAgMzEsICAyMiwKKyAgICA0LCAgIDExLCAgMywgICAwLCAgIDAsICAgMCwgICA5NiwgIDEwMywgNzQsICA4NSwgIDkyLCAgNjUsICA3NSwgIDgxLCAgNTYsCisgICAgNjMsICA3MCwgIDQ3LCAgNTAsICA1OCwgIDM3LCAgMzgsICA0NiwgIDI1LCAgMjQsICAzMSwgIDExLCAgMywgICAxMSwgIDAsCisgICAgMCwgICAwLCAgIDAsICAgOTcsICAxMDMsIDYyLCAgODYsICA5MiwgIDUzLCAgNzYsICA4MSwgIDQ1LCAgNjMsICA2OSwgIDM2LAorICAgIDUxLCAgNTgsICAyNywgIDM4LCAgNDYsICAxNSwgIDIzLCAgMzEsICAwLCAgIDMsICAgMTEsICAwLCAgIDAsICAgMCwgICAwLAorICAgIDkwLCAgODcsICAxNjUsIDgxLCAgNzcsICAxNDgsIDcyLCAgNjcsICAxMzIsIDYyLCAgNTUsICAxMTYsIDUwLCAgNDQsICA5OSwKKyAgICAzOSwgIDMxLCAgODIsICAyNSwgIDE0LCAgNjQsICAxLCAgIDAsICAgNDIsICAwLCAgIDAsICAgMSwgICA5MywgIDg3LCAgMTUwLAorICAgIDgzLCAgNzcsICAxMzUsIDc0LCAgNjcsICAxMjEsIDYzLCAgNTYsICAxMDUsIDUyLCAgNDUsICA5MCwgIDQwLCAgMzIsICA3NCwKKyAgICAyNSwgIDE2LCAgNTcsICAzLCAgIDAsICAgMzUsICAwLCAgIDAsICAgMCwgICA5NSwgIDg3LCAgMTM4LCA4NSwgIDc3LCAgMTIzLAorICAgIDc1LCAgNjcsICAxMDksIDYzLCAgNTcsICA5NSwgIDUzLCAgNDUsICA4MSwgIDQxLCAgMzMsICA2NiwgIDI2LCAgMTcsICA1MCwKKyAgICA0LCAgIDAsICAgMjgsICAwLCAgIDAsICAgMCwgICA5NSwgIDg4LCAgMTI0LCA4NSwgIDc3LCAgMTExLCA3NSwgIDY3LCAgOTksCisgICAgNjMsICA1NywgIDg2LCAgNTMsICA0NSwgIDcyLCAgNDEsICAzMywgIDU4LCAgMjYsICAxOCwgIDQzLCAgNSwgICAxLCAgIDIyLAorICAgIDAsICAgMCwgICAwLCAgIDk3LCAgODgsICAxMTIsIDg3LCAgNzcsICAxMDAsIDc2LCAgNjgsICA4OCwgIDY0LCAgNTcsICA3NiwKKyAgICA1MywgIDQ2LCAgNjMsICA0MSwgIDM0LCAgNTAsICAyNiwgIDE5LCAgMzUsICA1LCAgIDIsICAgMTQsICAwLCAgIDAsICAgMCwKKyAgICA5OSwgIDg3LCAgOTksICA4NywgIDc4LCAgODgsICA3NiwgIDY4LCAgNzcsICA2NSwgIDU3LCAgNjUsICA1MywgIDQ2LCAgNTQsCisgICAgNDEsICAzNSwgIDQyLCAgMjcsICAyMCwgIDI3LCAgNiwgICAyLCAgIDUsICAgMCwgICAwLCAgIDAsICAgMTAwLCA4NywgIDg1LAorICAgIDg4LCAgNzcsICA3NSwgIDc3LCAgNjgsICA2NSwgIDY1LCAgNTcsICA1NCwgIDUzLCAgNDYsICA0NCwgIDQxLCAgMzUsICAzMiwKKyAgICAyNywgIDIxLCAgMTksICA1LCAgIDMsICAgMiwgICAwLCAgIDAsICAgMCwgICAxMDAsIDg4LCAgNzEsICA4OSwgIDc3LCAgNjEsCisgICAgNzgsICA2OCwgIDUzLCAgNjYsICA1NywgIDQ0LCAgNTMsICA0NywgIDMzLCAgNDEsICAzNSwgIDIyLCAgMjcsICAyMSwgIDcsCisgICAgNSwgICAzLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTAxLCA4NywgIDYwLCAgOTAsICA3NywgIDUyLCAgNzksICA2OCwgIDQ0LAorICAgIDY2LCAgNTgsICAzNCwgIDUzLCAgNDcsICAyNSwgIDQxLCAgMzUsICAxMywgIDI2LCAgMjIsICAwLCAgIDUsICAgMywgICAwLAorICAgIDAsICAgMCwgICAwLCAgIDk3LCAgNjcsICAxNTUsIDg2LCAgNTgsICAxMzgsIDc3LCAgNTAsICAxMjUsIDY2LCAgMzksICAxMDgsCisgICAgNTUsICAyOCwgIDkyLCAgNDMsICAxMiwgIDc2LCAgMjksICAwLCAgIDU5LCAgMiwgICAwLCAgIDM3LCAgMCwgICAwLCAgIDAsCisgICAgOTksICA2NywgIDE0MSwgODgsICA1OSwgIDEyNywgNzgsICA1MCwgIDExMywgNjgsICA0MCwgIDk4LCAgNTYsICAyOSwgIDgzLAorICAgIDQ0LCAgMTUsICA2OCwgIDI5LCAgMCwgICA1MiwgIDMsICAgMCwgICAzMCwgIDAsICAgMCwgICAwLCAgIDEwMCwgNjgsICAxMjksCisgICAgODksICA1OSwgIDExNSwgODAsICA1MSwgIDEwMywgNjgsICA0MSwgIDg5LCAgNTYsICAzMCwgIDc1LCAgNDQsICAxNiwgIDYxLAorICAgIDMwLCAgMCwgICA0NSwgIDQsICAgMCwgICAyNCwgIDAsICAgMCwgICAwLCAgIDEwMCwgNjksICAxMTgsIDkwLCAgNjAsICAxMDQsCisgICAgODAsICA1MSwgIDkyLCAgNjcsICA0MSwgIDc5LCAgNTYsICAzMSwgIDY2LCAgNDQsICAxOCwgIDUzLCAgMjksICAyLCAgIDM4LAorICAgIDQsICAgMCwgICAxOCwgIDAsICAgMCwgICAwLCAgIDEwMSwgNjksICAxMDQsIDkwLCAgNjEsICA5MywgIDc5LCAgNTEsICA4MiwKKyAgICA2NywgIDQyLCAgNzAsICA1NiwgIDMyLCAgNTksICA0NCwgIDIwLCAgNDYsICAyOSwgIDQsICAgMzEsICA2LCAgIDAsICAgOSwKKyAgICAwLCAgIDAsICAgMCwgICAxMDIsIDY5LCAgOTMsICA5MCwgIDYxLCAgODMsICA4MCwgIDUyLCAgNzIsICA2OCwgIDQyLCAgNjEsCisgICAgNTYsICAzMywgIDUwLCAgNDMsICAyMCwgIDM4LCAgMjksICA1LCAgIDIzLCAgNywgICAwLCAgIDQsICAgMCwgICAwLCAgIDAsCisgICAgMTAyLCA3MCwgIDgwLCAgOTEsICA2MSwgIDcxLCAgODAsICA1MiwgIDYxLCAgNjgsICA0MywgIDUxLCAgNTYsICAzMiwgIDQwLAorICAgIDQ0LCAgMjEsICAyOSwgIDMwLCAgNiwgICAxNCwgIDcsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDEwMywgNzAsICA2OCwKKyAgICA5MiwgIDYxLCAgNTgsICA4MSwgIDUzLCAgNTAsICA2OSwgIDQzLCAgNDEsICA1NiwgIDM0LCAgMzEsICA0MywgIDIyLCAgMTksCisgICAgMjksICA3LCAgIDMsICAgNywgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTA0LCA3MCwgIDU3LCAgOTIsICA2MSwgIDQ4LAorICAgIDgyLCAgNTMsICA0MCwgIDY5LCAgNDMsICAzMiwgIDU2LCAgMzQsICAyMiwgIDQzLCAgMjMsICAxMCwgIDI5LCAgOCwgICAwLAorICAgIDYsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDEwMSwgNDUsICAxNDUsIDkxLCAgMzUsICAxMjksIDgwLCAgMjYsICAxMTYsCisgICAgNjksICAxNSwgIDEwMSwgNTksICAwLCAgIDg2LCAgNDYsICAwLCAgIDcxLCAgMzEsICAwLCAgIDU1LCAgMCwgICAwLCAgIDMzLAorICAgIDAsICAgMCwgICAwLCAgIDEwNCwgNDQsICAxMzIsIDkyLCAgMzYsICAxMTgsIDgyLCAgMjgsICAxMDUsIDcxLCAgMTcsICA5MSwKKyAgICA1OCwgIDMsICAgNzcsICA0NiwgIDAsICAgNjMsICAzMSwgIDAsICAgNDgsICAyLCAgIDAsICAgMjYsICAwLCAgIDAsICAgMCwKKyAgICAxMDQsIDQ2LCAgMTIxLCA5MywgIDM3LCAgMTA3LCA4MiwgIDMwLCAgOTYsICA3MCwgIDIwLCAgODMsICA1OCwgIDYsICAgNzAsCisgICAgNDYsICAwLCAgIDU3LCAgMzIsICAwLCAgIDQxLCAgNCwgICAwLCAgIDIwLCAgMCwgICAwLCAgIDAsICAgMTA0LCA0OCwgIDExMCwKKyAgICA5MywgIDQwLCAgOTgsICA4MiwgIDMxLCAgODcsICA3MCwgIDIyLCAgNzQsICA1OSwgIDksICAgNjIsICA0NSwgIDAsICAgNDksCisgICAgMzEsICAwLCAgIDM1LCAgNiwgICAwLCAgIDEzLCAgMCwgICAwLCAgIDAsICAgMTA0LCA0OCwgIDk5LCAgOTIsICA0MSwgIDg4LAorICAgIDgyLCAgMzIsICA3NywgIDcwLCAgMjMsICA2NSwgIDU4LCAgMTEsICA1NCwgIDQ2LCAgMCwgICA0MiwgIDMyLCAgMCwgICAyNywKKyAgICA3LCAgIDAsICAgNSwgICAwLCAgIDAsICAgMCwgICAxMDUsIDUwLCAgODgsICA5MywgIDQxLCAgNzcsICA4MiwgIDM0LCAgNjgsCisgICAgNzEsICAyNCwgIDU3LCAgNTgsICAxMywgIDQ2LCAgNDUsICAxLCAgIDM1LCAgMzEsICAwLCAgIDIxLCAgNywgICAwLCAgIDIsCisgICAgMCwgICAwLCAgIDAsICAgMTA1LCA1MCwgIDc2LCAgOTQsICA0MSwgIDY2LCAgODMsICAzNCwgIDU3LCAgNzEsICAyNSwgIDQ3LAorICAgIDU4LCAgMTUsICAzNywgIDQ1LCAgMiwgICAyNSwgIDMyLCAgMCwgICAxMSwgIDcsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgIDEwNiwgNTAsICA2NCwgIDk0LCAgNDIsICA1NSwgIDgzLCAgMzUsICA0NywgIDcxLCAgMjYsICAzOCwgIDU4LCAgMTYsICAyNywKKyAgICA0NSwgIDQsICAgMTcsICAzMSwgIDAsICAgNCwgICA3LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxMDYsIDUxLCAgNTQsCisgICAgOTUsICA0MiwgIDQ1LCAgODMsICAzNSwgIDM4LCAgNzEsICAyNywgIDMwLCAgNTgsICAxNiwgIDE5LCAgNDUsICA1LCAgIDcsCisgICAgMzAsICAwLCAgIDAsICAgNiwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxODEsIDI0MCwgMCwgICAxNjIsIDIxNiwKKyAgICAwLCAgIDE0NCwgMTkzLCAwLCAgIDEyNiwgMTY4LCAwLCAgIDEwOSwgMTQ2LCAwLCAgIDkxLCAgMTIzLCAwLCAgIDcxLCAgOTgsCisgICAgMCwgICA0OCwgIDcxLCAgMCwgICA5LCAgIDM0LCAgMCwgICAxNzksIDIxOCwgMCwgICAxNjEsIDE5NSwgMCwgICAxNDQsIDE3NCwKKyAgICAwLCAgIDEyNiwgMTUzLCAwLCAgIDEwOCwgMTMyLCAwLCAgIDkwLCAgMTEwLCAwLCAgIDcxLCAgODgsICAwLCAgIDQ4LCAgNjMsCisgICAgMCwgICA4LCAgIDI5LCAgMCwgICAxNzgsIDE5NywgMCwgICAxNTksIDE3NywgMCwgICAxNDMsIDE1OSwgMCwgICAxMjUsIDEzOSwKKyAgICAwLCAgIDEwNywgMTE5LCAwLCAgIDkwLCAgOTksICAwLCAgIDcxLCAgNzksICAwLCAgIDQ4LCAgNTUsICAwLCAgIDgsICAgMjIsCisgICAgMCwgICAxNzcsIDE3NywgMCwgICAxNTgsIDE1OCwgMCwgICAxNDIsIDE0MSwgMCwgICAxMjQsIDEyMywgMCwgICAxMDcsIDEwNiwKKyAgICAwLCAgIDg5LCAgODgsICAwLCAgIDcxLCAgNzAsICAwLCAgIDQ4LCAgNDcsICAwLCAgIDgsICAgMTQsICAwLCAgIDE3NiwgMTU3LAorICAgIDAsICAgMTU4LCAxNDEsIDAsICAgMTQxLCAxMjYsIDAsICAgMTIzLCAxMDksIDAsICAgMTA2LCA5MywgIDAsICAgODksICA3OCwKKyAgICAwLCAgIDcwLCAgNjAsICAwLCAgIDQ3LCAgMzksICAwLCAgIDcsICAgNSwgICAwLCAgIDE3NSwgMTM4LCAwLCAgIDE1NywgMTIzLAorICAgIDAsICAgMTQxLCAxMTAsIDAsICAgMTIzLCA5NiwgIDAsICAgMTA1LCA4MSwgIDAsICAgODgsICA2NywgIDAsICAgNzAsICA1MSwKKyAgICAwLCAgIDQ4LCAgMzAsICAwLCAgIDYsICAgMCwgICAwLCAgIDE3MywgMTE1LCAwLCAgIDE1NSwgMTA0LCAwLCAgIDE0MCwgOTIsCisgICAgMCwgICAxMjIsIDgwLCAgMCwgICAxMDUsIDY3LCAgMCwgICA4OCwgIDU1LCAgMCwgICA2OSwgIDQwLCAgMCwgICA0NywgIDIwLAorICAgIDAsICAgNiwgICAwLCAgIDAsICAgMTczLCA5NCwgIDAsICAgMTU1LCA4NSwgIDAsICAgMTM5LCA3NSwgIDAsICAgMTIxLCA2NCwKKyAgICAwLCAgIDEwNCwgNTMsICAwLCAgIDg4LCAgNDIsICAwLCAgIDcwLCAgMjgsICAwLCAgIDQ3LCAgOSwgICAwLCAgIDYsICAgMCwKKyAgICAwLCAgIDE3MywgNzYsICAwLCAgIDE1NSwgNzAsICAwLCAgIDEzOCwgNjEsICAwLCAgIDEyMiwgNTMsICAwLCAgIDEwNCwgNDQsCisgICAgMCwgICA4NywgIDMyLCAgMCwgICA2OSwgIDE4LCAgMCwgICA0NywgIDAsICAgMCwgICA2LCAgIDAsICAgMCwgICAxNjQsIDIyNiwKKyAgICAwLCAgIDE0NywgMjAzLCAwLCAgIDEzMSwgMTgxLCAwLCAgIDExNCwgMTU4LCAwLCAgIDk3LCAgMTM2LCAwLCAgIDgwLCAgMTE1LAorICAgIDAsICAgNjMsICA5MiwgIDAsICAgNDAsICA2NSwgIDAsICAgMCwgICAzMCwgIDAsICAgMTYyLCAyMDUsIDAsICAgMTQ1LCAxODQsCisgICAgMCwgICAxMzAsIDE2NCwgMCwgICAxMTQsIDE0MywgMCwgICA5NywgIDEyNCwgMCwgICA4MSwgIDEwNCwgMCwgICA2MywgIDgzLAorICAgIDAsICAgNDAsICA1OCwgIDAsICAgMCwgICAyMywgIDAsICAgMTYyLCAxODcsIDAsICAgMTQ1LCAxNjcsIDAsICAgMTMwLCAxNTAsCisgICAgMCwgICAxMTMsIDEzMSwgMCwgICA5NiwgIDExMiwgMCwgICA4MCwgIDkzLCAgMCwgICA2MiwgIDc0LCAgMCwgICA0MCwgIDUwLAorICAgIDAsICAgMCwgICAxNiwgIDAsICAgMTYwLCAxNjcsIDAsICAgMTQ0LCAxNTAsIDAsICAgMTI5LCAxMzQsIDAsICAgMTEyLCAxMTYsCisgICAgMCwgICA5NiwgIDEwMCwgMCwgICA4MCwgIDgyLCAgMCwgICA2MiwgIDY1LCAgMCwgICA0MCwgIDQzLCAgMCwgICAwLCAgIDcsCisgICAgMCwgICAxNjAsIDE0OCwgMCwgICAxNDMsIDEzMywgMCwgICAxMjgsIDExOCwgMCwgICAxMTEsIDEwMywgMCwgICA5NiwgIDg4LAorICAgIDAsICAgODAsICA3MywgIDAsICAgNjIsICA1NiwgIDAsICAgNDAsICAzNSwgIDAsICAgMCwgICAwLCAgIDAsICAgMTU4LCAxMzAsCisgICAgMCwgICAxNDIsIDExNywgMCwgICAxMjcsIDEwNCwgMCwgICAxMTEsIDg5LCAgMCwgICA5NSwgIDc2LCAgMCwgICA3OSwgIDYyLAorICAgIDAsICAgNjIsICA0NiwgIDAsICAgNDAsICAyNiwgIDAsICAgMCwgICAwLCAgIDAsICAgMTU4LCAxMTEsIDAsICAgMTQxLCA5OSwKKyAgICAwLCAgIDEyNywgODgsICAwLCAgIDExMSwgNzYsICAwLCAgIDk1LCAgNjMsICAwLCAgIDc5LCAgNTEsICAwLCAgIDYyLCAgMzcsCisgICAgMCwgICA0MCwgIDE4LCAgMCwgICAwLCAgIDAsICAgMCwgICAxNTgsIDkxLCAgMCwgICAxNDEsIDgxLCAgMCwgICAxMjYsIDcyLAorICAgIDAsICAgMTEwLCA2MiwgIDAsICAgOTQsICA1MCwgIDAsICAgNzksICAzOSwgIDAsICAgNjIsICAyNSwgIDAsICAgNDAsICA1LAorICAgIDAsICAgMCwgICAwLCAgIDAsICAgMTU3LCA3NCwgIDAsICAgMTQxLCA2NiwgIDAsICAgMTI2LCA1OSwgIDAsICAgMTEwLCA0OSwKKyAgICAwLCAgIDk0LCAgNDAsICAwLCAgIDc4LCAgMjksICAwLCAgIDYxLCAgMTUsICAwLCAgIDQwLCAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAwLCAgIDE0OCwgMjE0LCAwLCAgIDEzMywgMTkyLCAwLCAgIDExOSwgMTcxLCAwLCAgIDEwMywgMTUwLCAwLCAgIDg3LCAgMTI5LAorICAgIDAsICAgNzIsICAxMDgsIDAsICAgNTUsICA4NiwgIDAsICAgMzIsICA2MSwgIDAsICAgMCwgICAyNSwgIDAsICAgMTQ3LCAxOTMsCisgICAgMCwgICAxMzIsIDE3MywgMCwgICAxMTgsIDE1NSwgMCwgICAxMDMsIDEzNiwgMCwgICA4NywgIDExNiwgMCwgICA3MiwgIDk4LAorICAgIDAsICAgNTUsICA3OCwgIDAsICAgMzIsICA1MywgIDAsICAgMCwgICAxNywgIDAsICAgMTQ3LCAxNzYsIDAsICAgMTMyLCAxNTgsCisgICAgMCwgICAxMTgsIDE0MiwgMCwgICAxMDIsIDEyNCwgMCwgICA4NywgIDEwNiwgMCwgICA3MiwgIDg4LCAgMCwgICA1NSwgIDY5LAorICAgIDAsICAgMzMsICA0NiwgIDAsICAgMCwgICA5LCAgIDAsICAgMTQ2LCAxNTksIDAsICAgMTMxLCAxNDIsIDAsICAgMTE3LCAxMjcsCisgICAgMCwgICAxMDIsIDExMSwgMCwgICA4NywgIDk1LCAgMCwgICA3MSwgIDc5LCAgMCwgICA1NSwgIDYxLCAgMCwgICAzMywgIDM5LAorICAgIDAsICAgMCwgICAyLCAgIDAsICAgMTQ1LCAxNDAsIDAsICAgMTMwLCAxMjYsIDAsICAgMTE3LCAxMTIsIDAsICAgMTAxLCA5OCwKKyAgICAwLCAgIDg2LCAgODMsICAwLCAgIDcxLCAgNjgsICAwLCAgIDU1LCAgNTIsICAwLCAgIDMzLCAgMzEsICAwLCAgIDAsICAgMCwKKyAgICAwLCAgIDE0NCwgMTI0LCAwLCAgIDEzMCwgMTExLCAwLCAgIDExNiwgOTksICAwLCAgIDEwMSwgODQsICAwLCAgIDg2LCAgNzIsCisgICAgMCwgICA3MSwgIDU5LCAgMCwgICA1NSwgIDQzLCAgMCwgICAzMywgIDIzLCAgMCwgICAwLCAgIDAsICAgMCwgICAxNDQsIDEwNiwKKyAgICAwLCAgIDEyOSwgOTQsICAwLCAgIDExNSwgODMsICAwLCAgIDEwMSwgNzIsICAwLCAgIDg1LCAgNjAsICAwLCAgIDcxLCAgNDgsCisgICAgMCwgICA1NSwgIDM0LCAgMCwgICAzMywgIDE0LCAgMCwgICAwLCAgIDAsICAgMywgICAxNDMsIDg2LCAgMCwgICAxMjksIDc3LAorICAgIDAsICAgMTE1LCA2OCwgIDAsICAgMTAwLCA1OCwgIDAsICAgODUsICA0OCwgIDAsICAgNzAsICAzNiwgIDAsICAgNTQsICAyMiwKKyAgICAwLCAgIDMzLCAgMywgICAwLCAgIDAsICAgMCwgICAxOCwgIDE0MywgNzIsICAxMywgIDEyOCwgNjMsICAwLCAgIDExNSwgNTcsCisgICAgMCwgICAxMDAsIDQ3LCAgMCwgICA4NSwgIDM3LCAgMCwgICA3MCwgIDI2LCAgMCwgICA1NCwgIDEzLCAgMCwgICAzMywgIDAsCisgICAgMCwgICAwLCAgIDAsICAgMCwgICAxMzIsIDIwMCwgMCwgICAxMTgsIDE3OSwgMCwgICAxMDUsIDE2MSwgMCwgICA5MSwgIDE0MCwKKyAgICAwLCAgIDc2LCAgMTIxLCAwLCAgIDYyLCAgMTAxLCAwLCAgIDQ2LCAgODEsICAwLCAgIDI0LCAgNTYsICAwLCAgIDAsICAgMTksCisgICAgMCwgICAxMzEsIDE4MiwgMCwgICAxMTgsIDE2MywgMCwgICAxMDUsIDE0NiwgMCwgICA5MSwgIDEyOCwgMCwgICA3NywgIDExMCwKKyAgICAwLCAgIDYyLCAgOTEsICAwLCAgIDQ2LCAgNzIsICAwLCAgIDI1LCAgNDgsICAwLCAgIDAsICAgMTEsICAwLCAgIDEzMSwgMTY1LAorICAgIDAsICAgMTE3LCAxNDksIDAsICAgMTA0LCAxMzMsIDAsICAgOTEsICAxMTYsIDAsICAgNzcsICA5OSwgIDAsICAgNjIsICA4MiwKKyAgICAwLCAgIDQ2LCAgNjQsICAwLCAgIDI1LCAgNDEsICAwLCAgIDAsICAgNCwgICAwLCAgIDEzMSwgMTQ5LCAwLCAgIDExNiwgMTM0LAorICAgIDAsICAgMTA0LCAxMTksIDAsICAgOTEsICAxMDQsIDAsICAgNzcsICA4OSwgIDAsICAgNjIsICA3MywgIDAsICAgNDYsICA1NiwKKyAgICAwLCAgIDI1LCAgMzQsICAwLCAgIDAsICAgMCwgICAxMCwgIDEzMCwgMTMzLCAyLCAgIDExNiwgMTE5LCAwLCAgIDEwNCwgMTA2LAorICAgIDAsICAgOTAsICA5MSwgIDAsICAgNzYsICA3OCwgIDAsICAgNjIsICA2NCwgIDAsICAgNDYsICA0OCwgIDAsICAgMjYsICAyNywKKyAgICAwLCAgIDAsICAgMCwgICAyMywgIDEzMCwgMTE4LCAyMCwgIDExNiwgMTA0LCAxMywgIDEwMywgOTMsICAzLCAgIDg5LCAgNzksCisgICAgMCwgICA3NiwgIDY3LCAgMCwgICA2MiwgIDU0LCAgMCwgICA0NiwgIDM5LCAgMCwgICAyNiwgIDE5LCAgMCwgICAwLCAgIDAsCisgICAgMzMsICAxMjksIDEwMSwgMjcsICAxMTUsIDg5LCAgMTksICAxMDMsIDc5LCAgOSwgICA4OSwgIDY3LCAgMCwgICA3NSwgIDU2LAorICAgIDAsICAgNjEsICA0MywgIDAsICAgNDYsICAyOSwgIDAsICAgMjYsICAxMCwgIDAsICAgMCwgICAwLCAgIDQxLCAgMTI4LCA4MywKKyAgICAzNSwgIDExNSwgNzMsICAyNywgIDEwMiwgNjQsICAxNSwgIDg5LCAgNTUsICAwLCAgIDc2LCAgNDUsICAwLCAgIDYyLCAgMzMsCisgICAgMCwgICA0NiwgIDE4LCAgMCwgICAyNiwgIDAsICAgMCwgICAwLCAgIDAsICAgNDMsICAxMjksIDY5LCAgMzgsICAxMTUsIDYxLAorICAgIDMwLCAgMTAyLCA1NCwgIDE3LCAgODksICA0NSwgIDIsICAgNzUsICAzNCwgIDAsICAgNjEsICAyMywgIDAsICAgNDYsICA5LAorICAgIDAsICAgMjYsICAwLCAgIDAsICAgMCwgICAwLCAgIDEsICAgMTE2LCAxODgsIDEsICAgMTA0LCAxNjgsIDAsICAgOTIsICAxNTEsCisgICAgMCwgICA3OSwgIDEzMiwgMCwgICA2NiwgIDExMywgMCwgICA1MiwgIDk0LCAgMCwgICAzNiwgIDc1LCAgMCwgICAxNCwgIDUyLAorICAgIDAsICAgMCwgICAxNCwgIDE3LCAgMTE2LCAxNzEsIDE2LCAgMTA0LCAxNTMsIDE0LCAgOTIsICAxMzcsIDgsICAgNzksICAxMTksCisgICAgMCwgICA2NywgIDEwMiwgMCwgICA1MywgIDg1LCAgMCwgICAzNywgIDY3LCAgMCwgICAxNiwgIDQ0LCAgMCwgICAwLCAgIDQsCisgICAgMzEsICAxMTYsIDE1NSwgMjcsICAxMDQsIDE0MCwgMjEsICA5MiwgIDEyNSwgMTMsICA3OSwgIDEwOSwgMywgICA2NiwgIDkzLAorICAgIDAsICAgNTMsICA3NywgIDAsICAgMzcsICA1OSwgIDAsICAgMTYsICAzOCwgIDAsICAgMCwgICAwLCAgIDM3LCAgMTE1LCAxNDEsCisgICAgMzAsICAxMDMsIDEyNiwgMjYsICA5MiwgIDExMiwgMTYsICA3OSwgIDk4LCAgNSwgICA2NiwgIDgzLCAgMCwgICA1MywgIDY3LAorICAgIDAsICAgMzgsICA1MSwgIDAsICAgMTcsICAzMSwgIDAsICAgMCwgICAwLCAgIDQxLCAgMTE1LCAxMjYsIDM3LCAgMTAzLCAxMTIsCisgICAgMzEsICA5MiwgIDEwMCwgMjIsICA3OSwgIDg2LCAgMTAsICA2NiwgIDcyLCAgMCwgICA1MywgIDU5LCAgMCwgICAzOCwgIDQ0LAorICAgIDAsICAgMTcsICAyMywgIDAsICAgMCwgICAwLCAgIDQ4LCAgMTE1LCAxMTEsIDQxLCAgMTAyLCA5OSwgIDM0LCAgOTEsICA4OCwKKyAgICAyNCwgIDc4LCAgNzYsICAxNCwgIDY2LCAgNjMsICAwLCAgIDUzLCAgNTAsICAwLCAgIDM4LCAgMzYsICAwLCAgIDE4LCAgMTUsCisgICAgMCwgICAwLCAgIDAsICAgNTEsICAxMTUsIDk1LCAgNDYsICAxMDIsIDg1LCAgMzcsICA5MSwgIDc0LCAgMjYsICA3OCwgIDYzLAorICAgIDE2LCAgNjYsICA1MiwgIDAsICAgNTMsICA0MCwgIDAsICAgMzgsICAyNiwgIDAsICAgMTgsICA1LCAgIDAsICAgMCwgICAwLAorICAgIDU1LCAgMTE0LCA4MCwgIDQ3LCAgMTAyLCA2OSwgIDQwLCAgOTAsICA2MCwgIDMwLCAgNzgsICA1MSwgIDE5LCAgNjYsICA0MSwKKyAgICAzLCAgIDUzLCAgMjksICAwLCAgIDM4LCAgMTUsICAwLCAgIDE3LCAgMCwgICAwLCAgIDAsICAgMCwgICA1NiwgIDExNCwgNjYsCisgICAgNTAsICAxMDIsIDU4LCAgNDAsICA5MSwgIDUwLCAgMzIsICA3OCwgIDQxLCAgMTgsICA2NiwgIDMyLCAgNCwgICA1MywgIDIxLAorICAgIDAsICAgMzgsICA1LCAgIDAsICAgMTcsICAwLCAgIDAsICAgMCwgICAwLCAgIDM5LCAgMTAyLCAxNzgsIDM3LCAgOTAsICAxNTksCisgICAgMzAsICA3OSwgIDE0MiwgMjEsICA2OCwgIDEyNCwgMTQsICA1NSwgIDEwNiwgMCwgICA0MiwgIDg5LCAgMCwgICAyNiwgIDcwLAorICAgIDAsICAgNCwgICA0NiwgIDAsICAgMCwgICA4LCAgIDQ4LCAgMTAyLCAxNjEsIDQyLCAgOTAsICAxNDUsIDM1LCAgNzksICAxMjgsCisgICAgMjYsICA2OCwgIDExMiwgMTksICA1NSwgIDk2LCAgMywgICA0MywgIDc5LCAgMCwgICAyNywgIDYyLCAgMCwgICA2LCAgIDQwLAorICAgIDAsICAgMCwgICAwLCAgIDUwLCAgMTAyLCAxNDcsIDQ0LCAgOTAsICAxMzIsIDM3LCAgNzksICAxMTgsIDMwLCAgNjgsICAxMDIsCisgICAgMjAsICA1NiwgIDg3LCAgNywgICA0MywgIDcyLCAgMCwgICAyOCwgIDU1LCAgMCwgICA2LCAgIDM0LCAgMCwgICAwLCAgIDAsCisgICAgNTMsICAxMDEsIDEzMywgNDcsICA5MCwgIDExOCwgNDEsICA3OSwgIDEwNiwgMzIsICA2OCwgIDkxLCAgMjEsICA1NiwgIDc4LAorICAgIDksICAgNDMsICA2MywgIDAsICAgMjgsICA0NywgIDAsICAgNiwgICAyNiwgIDAsICAgMCwgICAwLCAgIDU3LCAgMTAxLCAxMTksCisgICAgNTAsICA4OSwgIDEwNiwgNDIsICA3OSwgIDk0LCAgMzQsICA2NywgIDgxLCAgMjQsICA1NiwgIDY4LCAgOSwgICA0NCwgIDU1LAorICAgIDAsICAgMjksICA0MCwgIDAsICAgNiwgICAxOSwgIDAsICAgMCwgICAwLCAgIDYwLCAgMTAwLCAxMDUsIDUwLCAgOTAsICA5NCwKKyAgICA0NSwgIDgwLCAgODMsICAzNiwgIDY4LCAgNzEsICAyNCwgIDU2LCAgNTksICAxMSwgIDQ0LCAgNDYsICAwLCAgIDI5LCAgMzIsCisgICAgMCwgICA3LCAgIDEyLCAgMCwgICAwLCAgIDAsICAgNjMsICAxMDEsIDkxLCAgNTUsICA5MCwgIDgwLCAgNDYsICA3OSwgIDcwLAorICAgIDM3LCAgNjgsICA1OSwgIDI2LCAgNTYsICA0OSwgIDEyLCAgNDQsICAzNywgIDEsICAgMjksICAyMywgIDAsICAgNywgICAzLAorICAgIDAsICAgMCwgICAwLCAgIDY0LCAgMTAxLCA3NSwgIDU2LCAgODksICA2NywgIDQ4LCAgNzksICA1NywgIDM3LCAgNjgsICA0OCwKKyAgICAyNywgIDU2LCAgMzcsICAxNSwgIDQ0LCAgMjYsICAwLCAgIDI5LCAgMTIsICAwLCAgIDcsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICA2NiwgIDEwMSwgNjQsICA1OCwgIDg5LCAgNTUsICA0OSwgIDc5LCAgNDcsICAzOSwgIDY4LCAgMzgsICAyNywgIDU2LCAgMjksCisgICAgMTQsICA0NCwgIDE4LCAgMSwgICAzMCwgIDIsICAgMCwgICA3LCAgIDAsICAgMCwgICAwLCAgIDAsICAgNTcsICA4NiwgIDE2NSwKKyAgICA1MSwgIDc1LCAgMTQ4LCA0NSwgIDY1LCAgMTMzLCAzOCwgIDU0LCAgMTE2LCAyOCwgIDQzLCAgMTAwLCAxNiwgIDI5LCAgODMsCisgICAgMCwgICAxMywgIDY0LCAgMCwgICAwLCAgIDQyLCAgMCwgICAwLCAgIDMsICAgNjAsICA4NiwgIDE1MSwgNTUsICA3NSwgIDEzNSwKKyAgICA0NywgIDY2LCAgMTIxLCAzOSwgIDU1LCAgMTA1LCAzMCwgIDQ0LCAgOTAsICAxOCwgIDMxLCAgNzQsICAzLCAgIDE2LCAgNTcsCisgICAgMCwgICAxLCAgIDM1LCAgMCwgICAwLCAgIDAsICAgNjIsICA4NiwgIDEzOSwgNTYsICA3NSwgIDEyMywgNDksICA2NiwgIDExMCwKKyAgICA0MCwgIDU1LCAgOTUsICAzMCwgIDQ0LCAgODEsICAxOSwgIDMxLCAgNjYsICA0LCAgIDE3LCAgNTEsICAwLCAgIDEsICAgMjksCisgICAgMCwgICAwLCAgIDAsICAgNjUsICA4NiwgIDEyNSwgNTYsICA3NiwgIDExMiwgNDksICA2NiwgIDk5LCAgMzksICA1NSwgIDg2LAorICAgIDMxLCAgNDQsICA3MiwgIDE5LCAgMzIsICA1OSwgIDUsICAgMTgsICA0NCwgIDAsICAgMSwgICAyMywgIDAsICAgMCwgICAwLAorICAgIDY3LCAgODYsICAxMTMsIDU4LCAgNzUsICAxMDAsIDUxLCAgNjYsICA4OCwgIDQxLCAgNTYsICA3NywgIDMxLCAgNDUsICA2NCwKKyAgICAyMCwgIDMyLCAgNTEsICA2LCAgIDE4LCAgMzUsICAwLCAgIDEsICAgMTQsICAwLCAgIDAsICAgMCwgICA2OSwgIDg2LCAgOTksCisgICAgNjEsICA3NiwgIDg4LCAgNTIsICA2NiwgIDc4LCAgNDMsICA1NiwgIDY2LCAgMzIsICA0NSwgIDU1LCAgMjAsICAzMywgIDQyLAorICAgIDcsICAgMTksICAyNywgIDAsICAgMSwgICA2LCAgIDAsICAgMCwgICAwLCAgIDY5LCAgODYsICA4NiwgIDYxLCAgNzYsICA3NSwKKyAgICA1MywgIDY3LCAgNjYsICA0MywgIDU2LCAgNTUsICAzMywgIDQ1LCAgNDUsICAyMSwgIDM0LCAgMzQsICA4LCAgIDIwLCAgMjAsCisgICAgMCwgICAyLCAgIDIsICAgMCwgICAwLCAgIDAsICAgNzEsICA4NiwgIDcyLCAgNjMsICA3NSwgIDYyLCAgNTQsICA2NiwgIDU1LAorICAgIDQ1LCAgNTYsICA0NSwgIDMzLCAgNDUsICAzNSwgIDIyLCAgMzQsICAyMywgIDcsICAgMjAsICA4LCAgIDAsICAgMiwgICAwLAorICAgIDAsICAgMCwgICAwLCAgIDcxLCAgODYsICA2MiwgIDY0LCAgNzUsICA1MywgIDU1LCAgNjYsICA0NiwgIDQ1LCAgNTYsICAzNiwKKyAgICAzMywgIDQ2LCAgMjcsICAyMiwgIDM0LCAgMTUsICA4LCAgIDIwLCAgMCwgICAwLCAgIDIsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICA2OSwgIDY3LCAgMTU2LCA2MSwgIDU4LCAgMTQwLCA1MywgIDUwLCAgMTI1LCA0NSwgIDM5LCAgMTA4LCAzNSwgIDI4LCAgOTMsCisgICAgMjUsICAxMiwgIDc3LCAgMTIsICAwLCAgIDU5LCAgMCwgICAwLCAgIDM3LCAgMCwgICAwLCAgIDAsICAgNzEsICA2OCwgIDE0MiwKKyAgICA2MywgIDU5LCAgMTI2LCA1NiwgIDUwLCAgMTE0LCA0NywgIDQwLCAgOTgsICAzNywgIDI4LCAgODQsICAyNiwgIDE1LCAgNjgsCisgICAgMTIsICAwLCAgIDUzLCAgMCwgICAwLCAgIDMwLCAgMCwgICAwLCAgIDAsICAgNzIsICA2OCwgIDEzMCwgNjMsICA1OSwgIDExNiwKKyAgICA1NiwgIDUwLCAgMTA0LCA0NywgIDQwLCAgOTAsICAzOCwgIDMwLCAgNzUsICAyNywgIDE2LCAgNjEsICAxMywgIDAsICAgNDYsCisgICAgMCwgICAwLCAgIDI0LCAgMCwgICAwLCAgIDAsICAgNzMsICA2OSwgIDExOCwgNjUsICA1OSwgIDEwNSwgNTcsICA1MSwgIDkyLAorICAgIDQ3LCAgNDEsICA4MCwgIDM3LCAgMzAsICA2NywgIDI2LCAgMTgsICA1MywgIDE0LCAgMSwgICAzOSwgIDAsICAgMCwgICAxOCwKKyAgICAwLCAgIDAsICAgMCwgICA3NCwgIDY5LCAgMTA2LCA2NSwgIDYwLCAgOTMsICA1NywgIDUxLCAgODIsICA0OCwgIDQxLCAgNzAsCisgICAgMzgsICAzMSwgIDU5LCAgMjYsICAxOSwgIDQ2LCAgMTMsICAyLCAgIDMyLCAgMCwgICAwLCAgIDEwLCAgMCwgICAwLCAgIDAsCisgICAgNzYsICA2OSwgIDk1LCAgNjYsICA2MSwgIDg0LCAgNTgsICA1MiwgIDczLCAgNDgsICA0MiwgIDYxLCAgMzcsICAzMiwgIDUwLAorICAgIDI2LCAgMjAsICAzOCwgIDE0LCAgNCwgICAyNCwgIDAsICAgMCwgICA0LCAgIDAsICAgMCwgICAwLCAgIDc2LCAgNjksICA4MSwKKyAgICA2OCwgIDYwLCAgNzIsICA1OCwgIDUyLCAgNjIsICA0OCwgIDQyLCAgNTEsICAzOCwgIDMyLCAgNDEsICAyNywgIDIxLCAgMzAsCisgICAgMTQsICA0LCAgIDE2LCAgMCwgICAwLCAgIDEsICAgMCwgICAwLCAgIDAsICAgNzYsICA2OSwgIDY4LCAgNjgsICA2MSwgIDYwLAorICAgIDYwLCAgNTIsICA1MSwgIDQ5LCAgNDMsICA0MSwgIDM4LCAgMzMsICAzMiwgIDI3LCAgMjEsICAyMCwgIDE0LCAgNSwgICA1LAorICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDc4LCAgNzAsICA1OSwgIDY5LCAgNjEsICA1MCwgIDYwLCAgNTIsICA0MiwKKyAgICA0OSwgIDQzLCAgMzQsICAzOSwgIDMzLCAgMjQsICAyNywgIDIyLCAgMTMsICAxNCwgIDcsICAgMSwgICAwLCAgIDAsICAgMCwKKyAgICAwLCAgIDAsICAgMCwgICA3NSwgIDQ2LCAgMTQ2LCA2OCwgIDM4LCAgMTMxLCA2MCwgIDMwLCAgMTE3LCA1MCwgIDE5LCAgMTAyLAorICAgIDQxLCAgNCwgICA4NywgIDI5LCAgMCwgICA3MiwgIDEzLCAgMCwgICA1NSwgIDAsICAgMCwgICAzMywgIDAsICAgMCwgICAwLAorICAgIDc4LCAgNDcsICAxMzIsIDcwLCAgMzksICAxMTksIDYxLCAgMzAsICAxMDUsIDUzLCAgMjAsICA5MiwgIDQyLCAgNSwgICA3OCwKKyAgICAzMCwgIDAsICAgNjQsICAxMywgIDAsICAgNDksICAwLCAgIDAsICAgMjcsICAwLCAgIDAsICAgMCwgICA3OSwgIDQ4LCAgMTIyLAorICAgIDcwLCAgNDAsICAxMDgsIDYyLCAgMzIsICA5NiwgIDUyLCAgMjIsICA4NCwgIDQyLCAgOSwgICA3MSwgIDMwLCAgMCwgICA1OCwKKyAgICAxNCwgIDAsICAgNDIsICAwLCAgIDAsICAgMjAsICAwLCAgIDAsICAgMCwgICA3OSwgIDUwLCAgMTExLCA3MCwgIDQyLCAgOTksCisgICAgNjIsICAzMywgIDg4LCAgNTIsICAyMywgIDc0LCAgNDEsICAxMSwgIDYzLCAgMjksICAwLCAgIDUwLCAgMTQsICAwLCAgIDM2LAorICAgIDAsICAgMCwgICAxNCwgIDAsICAgMCwgICAwLCAgIDgwLCAgNTAsICA5OSwgIDcwLCAgNDIsICA4OSwgIDYxLCAgMzQsICA3OCwKKyAgICA1MiwgIDI1LCAgNjcsICA0MSwgIDE0LCAgNTUsICAzMCwgIDAsICAgNDIsICAxNSwgIDAsICAgMjgsICAwLCAgIDAsICAgNiwKKyAgICAwLCAgIDAsICAgMCwgICA4MSwgIDUxLCAgODksICA3MSwgIDQzLCAgNzgsICA2MiwgIDM1LCAgNjksICA1MiwgIDI1LCAgNTgsCisgICAgNDIsICAxNSwgIDQ3LCAgMzAsICAzLCAgIDM2LCAgMTUsICAwLCAgIDIyLCAgMCwgICAwLCAgIDMsICAgMCwgICAwLCAgIDAsCisgICAgODEsICA1MSwgIDc3LCAgNzEsICA0NCwgIDY4LCAgNjMsICAzNiwgIDU5LCAgNTMsICAyNiwgIDQ5LCAgNDEsICAxNiwgIDM4LAorICAgIDMxLCAgNCwgICAyNywgIDE2LCAgMCwgICAxMiwgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDgxLCAgNTIsICA2NSwKKyAgICA3MiwgIDQzLCAgNTYsICA2MywgIDM2LCAgNDgsICA1MywgIDI3LCAgMzksICA0MSwgIDE3LCAgMjksICAzMCwgIDQsICAgMTgsCisgICAgMTQsICAwLCAgIDMsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgODEsICA1MiwgIDU1LCAgNzMsICA0NCwgIDQ3LAorICAgIDY0LCAgMzYsICAzOSwgIDUzLCAgMjgsICAzMiwgIDQyLCAgMTgsICAyMSwgIDMxLCAgNiwgICA5LCAgIDE0LCAgMCwgICAwLAorICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTc0LCAyMzksIDAsICAgMTU2LCAyMTQsIDAsICAgMTM5LCAxOTIsCisgICAgMCwgICAxMjEsIDE2OCwgMCwgICAxMDUsIDE0NSwgMCwgICA4NywgIDEyMywgMCwgICA2OCwgIDk4LCAgMCwgICA0NiwgIDcwLAorICAgIDAsICAgMywgICAzNSwgIDAsICAgMTcyLCAyMTcsIDAsICAgMTU1LCAxOTQsIDAsICAgMTM5LCAxNzMsIDAsICAgMTIxLCAxNTIsCisgICAgMCwgICAxMDQsIDEzMCwgMCwgICA4NywgIDExMCwgMCwgICA2OSwgIDg4LCAgMCwgICA0NiwgIDYzLCAgMCwgICA0LCAgIDI4LAorICAgIDAsICAgMTcxLCAxOTcsIDAsICAgMTUzLCAxNzUsIDAsICAgMTM4LCAxNTgsIDAsICAgMTIxLCAxMzksIDAsICAgMTAzLCAxMTgsCisgICAgMCwgICA4NiwgIDEwMCwgMCwgICA2OCwgIDc5LCAgMCwgICA0NiwgIDU1LCAgMCwgICA0LCAgIDIyLCAgMCwgICAxNzAsIDE3NywKKyAgICAwLCAgIDE1MiwgMTU4LCAwLCAgIDEzNiwgMTQxLCAwLCAgIDExOSwgMTI0LCAwLCAgIDEwMywgMTA2LCAwLCAgIDg2LCAgODgsCisgICAgMCwgICA2OCwgIDcwLCAgMCwgICA0NSwgIDQ3LCAgMCwgICAzLCAgIDE0LCAgMCwgICAxNjksIDE1NywgMCwgICAxNTIsIDE0MSwKKyAgICAwLCAgIDEzNiwgMTI2LCAwLCAgIDExOSwgMTA5LCAwLCAgIDEwMiwgOTQsICAwLCAgIDg2LCAgNzgsICAwLCAgIDY4LCAgNjAsCisgICAgMCwgICA0NiwgIDM5LCAgMCwgICAzLCAgIDUsICAgMCwgICAxNjcsIDEzOCwgMCwgICAxNTAsIDEyNCwgMCwgICAxMzUsIDExMSwKKyAgICAwLCAgIDExOCwgOTcsICAwLCAgIDEwMiwgODIsICAwLCAgIDg1LCAgNjgsICAwLCAgIDY4LCAgNTIsICAwLCAgIDQ2LCAgMzEsCisgICAgMCwgICAzLCAgIDAsICAgMCwgICAxNjcsIDExOCwgMCwgICAxNTAsIDEwNCwgMCwgICAxMzUsIDk0LCAgMCwgICAxMTgsIDgxLAorICAgIDAsICAgMTAxLCA2OSwgIDAsICAgODQsICA1NiwgIDAsICAgNjcsICA0MSwgIDAsICAgNDUsICAyMSwgIDAsICAgMywgICAwLAorICAgIDAsICAgMTY2LCA5NywgIDAsICAgMTQ5LCA4NywgIDAsICAgMTM0LCA3NywgIDAsICAgMTE3LCA2NywgIDAsICAgMTAxLCA1NiwKKyAgICAwLCAgIDg1LCAgNDQsICAwLCAgIDY3LCAgMzAsICAwLCAgIDQ1LCAgMTAsICAwLCAgIDMsICAgMCwgICAwLCAgIDE2NSwgNzksCisgICAgMCwgICAxNDksIDczLCAgMCwgICAxMzMsIDY0LCAgMCwgICAxMTcsIDU2LCAgMCwgICAxMDEsIDQ2LCAgMCwgICA4NSwgIDM0LAorICAgIDAsICAgNjgsICAyMSwgIDAsICAgNDYsICAxLCAgIDAsICAgMywgICAwLCAgIDAsICAgMTU4LCAyMjUsIDAsICAgMTQxLCAyMDEsCisgICAgMCwgICAxMjYsIDE4MCwgMCwgICAxMDksIDE1OCwgMCwgICA5NCwgIDEzNiwgMCwgICA3OCwgIDExNCwgMCwgICA2MCwgIDkxLAorICAgIDAsICAgMzgsICA2NiwgIDAsICAgMCwgICAzMCwgIDAsICAgMTU2LCAyMDMsIDAsICAgMTQwLCAxODMsIDAsICAgMTI1LCAxNjQsCisgICAgMCwgICAxMDksIDE0MywgMCwgICA5NCwgIDEyNCwgMCwgICA3OCwgIDEwNCwgMCwgICA2MSwgIDgzLCAgMCwgICAzOCwgIDU3LAorICAgIDAsICAgMCwgICAyMywgIDAsICAgMTU2LCAxODYsIDAsICAgMTQwLCAxNjYsIDAsICAgMTI1LCAxNTAsIDAsICAgMTA5LCAxMzAsCisgICAgMCwgICA5MywgIDExMSwgMCwgICA3NywgIDkzLCAgMCwgICA2MCwgIDc0LCAgMCwgICAzOCwgIDUwLCAgMCwgICAwLCAgIDE3LAorICAgIDAsICAgMTU1LCAxNjcsIDAsICAgMTM4LCAxNDksIDAsICAgMTI0LCAxMzQsIDAsICAgMTA5LCAxMTcsIDAsICAgOTMsICAxMDAsCisgICAgMCwgICA3NiwgIDgzLCAgMCwgICA2MCwgIDY1LCAgMCwgICAzOCwgIDQzLCAgMCwgICAwLCAgIDksICAgMCwgICAxNTMsIDE0NywKKyAgICAwLCAgIDEzOCwgMTM0LCAwLCAgIDEyNCwgMTIwLCAwLCAgIDEwNywgMTAzLCAwLCAgIDkyLCAgODgsICAwLCAgIDc3LCAgNzMsCisgICAgMCwgICA2MCwgIDU2LCAgMCwgICAzOCwgIDM1LCAgMCwgICAwLCAgIDAsICAgMCwgICAxNTMsIDEzMSwgMCwgICAxMzcsIDExOCwKKyAgICAwLCAgIDEyMiwgMTA1LCAwLCAgIDEwNywgOTAsICAwLCAgIDkxLCAgNzYsICAwLCAgIDc2LCAgNjMsICAwLCAgIDYwLCAgNDcsCisgICAgMCwgICAzOSwgIDI4LCAgMCwgICAwLCAgIDAsICAgMCwgICAxNTMsIDExMSwgMCwgICAxMzYsIDEwMCwgMCwgICAxMjMsIDkwLAorICAgIDAsICAgMTA3LCA3NywgIDAsICAgOTIsICA2NSwgIDAsICAgNzYsICA1MiwgIDAsICAgNjAsICAzNywgIDAsICAgMzgsICAxOCwKKyAgICAwLCAgIDAsICAgMCwgICAwLCAgIDE1MiwgOTMsICAwLCAgIDEzNiwgODIsICAwLCAgIDEyMiwgNzQsICAwLCAgIDEwNiwgNjMsCisgICAgMCwgICA5MSwgIDUyLCAgMCwgICA3NiwgIDQwLCAgMCwgICA1OSwgIDI2LCAgMCwgICAzOCwgIDYsICAgMCwgICAwLCAgIDAsCisgICAgMCwgICAxNTEsIDc4LCAgMCwgICAxMzYsIDY5LCAgMCwgICAxMjEsIDYxLCAgMCwgICAxMDYsIDUyLCAgMCwgICA5MSwgIDQzLAorICAgIDAsICAgNzYsICAzMiwgIDAsICAgNTksICAxNywgIDAsICAgMzgsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTQzLCAyMTMsCisgICAgMCwgICAxMjgsIDE5MSwgMCwgICAxMTUsIDE3MSwgMCwgICAxMDAsIDE0OSwgMCwgICA4NCwgIDEyOCwgMCwgICA2OSwgIDEwOCwKKyAgICAwLCAgIDUyLCAgODYsICAwLCAgIDMwLCAgNjEsICAwLCAgIDAsICAgMjUsICAwLCAgIDE0MiwgMTkzLCAwLCAgIDEyNywgMTczLAorICAgIDAsICAgMTE0LCAxNTQsIDAsICAgOTksICAxMzQsIDAsICAgODQsICAxMTYsIDAsICAgNjksICA5OCwgIDAsICAgNTIsICA3NywKKyAgICAwLCAgIDMxLCAgNTMsICAwLCAgIDAsICAgMTgsICAwLCAgIDE0MSwgMTc2LCAwLCAgIDEyNywgMTU4LCAwLCAgIDExNCwgMTQxLAorICAgIDAsICAgOTgsICAxMjIsIDAsICAgODQsICAxMDUsIDAsICAgNjksICA4OCwgIDAsICAgNTMsICA2OSwgIDAsICAgMzEsICA0NiwKKyAgICAwLCAgIDAsICAgOSwgICAwLCAgIDE0MSwgMTU5LCAwLCAgIDEyNiwgMTQyLCAwLCAgIDExMywgMTI3LCAwLCAgIDk4LCAgMTEwLAorICAgIDAsICAgODMsICA5NSwgIDAsICAgNjksICA3OCwgIDAsICAgNTMsICA2MCwgIDAsICAgMzIsICAzOSwgIDAsICAgMCwgICAyLAorICAgIDAsICAgMTQwLCAxNDAsIDAsICAgMTI2LCAxMjYsIDAsICAgMTEyLCAxMTIsIDAsICAgOTgsICA5OCwgIDAsICAgODMsICA4MywKKyAgICAwLCAgIDY4LCAgNjksICAwLCAgIDUyLCAgNTIsICAwLCAgIDMxLCAgMzEsICAwLCAgIDAsICAgMCwgICAwLCAgIDE0MCwgMTI0LAorICAgIDAsICAgMTI1LCAxMTIsIDAsICAgMTEyLCAxMDAsIDAsICAgOTcsICA4NiwgIDAsICAgODMsICA3MiwgIDAsICAgNjgsICA1OSwKKyAgICAwLCAgIDUyLCAgNDQsICAwLCAgIDMxLCAgMjMsICAwLCAgIDAsICAgMCwgICAwLCAgIDEzOSwgMTA2LCAwLCAgIDEyNSwgOTYsCisgICAgMCwgICAxMTEsIDg1LCAgMCwgICA5NywgIDcyLCAgMCwgICA4MywgIDYyLCAgMCwgICA2OCwgIDQ5LCAgMCwgICA1MiwgIDM1LAorICAgIDAsICAgMzEsICAxNSwgIDAsICAgMCwgICAwLCAgIDAsICAgMTM4LCA4OCwgIDAsICAgMTI0LCA3OSwgIDAsICAgMTExLCA3MCwKKyAgICAwLCAgIDk2LCAgNTksICAwLCAgIDgyLCAgNDgsICAwLCAgIDY4LCAgMzgsICAwLCAgIDUyLCAgMjQsICAwLCAgIDMxLCAgNCwKKyAgICAwLCAgIDAsICAgMCwgICAwLCAgIDEzOSwgNzYsICAwLCAgIDEyNCwgNjYsICAwLCAgIDExMSwgNTgsICAwLCAgIDk2LCAgNTAsCisgICAgMCwgICA4MiwgIDQwLCAgMCwgICA2OCwgIDI5LCAgMCwgICA1MiwgIDE1LCAgMCwgICAzMSwgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMCwgICAxMjksIDIwMCwgMCwgICAxMTQsIDE3OSwgMCwgICAxMDIsIDE2MCwgMCwgICA4NywgIDEzOSwgMCwgICA3NCwgIDEyMCwKKyAgICAwLCAgIDYwLCAgMTAxLCAwLCAgIDQ0LCAgODEsICAwLCAgIDIyLCAgNTYsICAwLCAgIDAsICAgMTksICAwLCAgIDEyNywgMTgxLAorICAgIDAsICAgMTE0LCAxNjMsIDAsICAgMTAyLCAxNDYsIDAsICAgODgsICAxMjcsIDAsICAgNzQsICAxMDksIDAsICAgNjAsICA5MSwKKyAgICAwLCAgIDQ0LCAgNzIsICAwLCAgIDIzLCAgNDgsICAwLCAgIDAsICAgMTEsICAwLCAgIDEyNywgMTY2LCAwLCAgIDExMywgMTQ4LAorICAgIDAsICAgMTAxLCAxMzMsIDAsICAgODcsICAxMTUsIDAsICAgNzQsICA5OSwgIDAsICAgNjAsICA4MiwgIDAsICAgNDQsICA2NCwKKyAgICAwLCAgIDIzLCAgNDIsICAwLCAgIDAsICAgNCwgICAwLCAgIDEyNywgMTUwLCAwLCAgIDExMywgMTM0LCAwLCAgIDEwMSwgMTE5LAorICAgIDAsICAgODcsICAxMDQsIDAsICAgNzQsICA4OSwgIDAsICAgNjAsICA3MywgIDAsICAgNDQsICA1NiwgIDAsICAgMjMsICAzNSwKKyAgICAwLCAgIDAsICAgMCwgICAwLCAgIDEyNSwgMTM0LCAwLCAgIDExMiwgMTE4LCAwLCAgIDEwMCwgMTA2LCAwLCAgIDg3LCAgOTIsCisgICAgMCwgICA3MywgIDc4LCAgMCwgICA2MCwgIDY0LCAgMCwgICA0NCwgIDQ4LCAgMCwgICAyMywgIDI3LCAgMCwgICAwLCAgIDAsCisgICAgMCwgICAxMjUsIDExOCwgMCwgICAxMTIsIDEwNSwgMCwgICAxMDAsIDk0LCAgMCwgICA4NiwgIDgwLCAgMCwgICA3MywgIDY4LAorICAgIDAsICAgNjAsICA1NCwgIDAsICAgNDQsICAzOSwgIDAsICAgMjMsICAyMCwgIDAsICAgMCwgICAwLCAgIDAsICAgMTI1LCAxMDEsCisgICAgMCwgICAxMTEsIDkwLCAgMCwgICA5OSwgIDgwLCAgMCwgICA4NiwgIDY5LCAgMCwgICA3MywgIDU4LCAgMCwgICA1OSwgIDQ1LAorICAgIDAsICAgNDQsICAzMCwgIDAsICAgMjMsICAxMSwgIDAsICAgMCwgICAwLCAgIDAsICAgMTI0LCA4NSwgIDAsICAgMTExLCA3NSwKKyAgICAwLCAgIDk5LCAgNjYsICAwLCAgIDg2LCAgNTYsICAwLCAgIDczLCAgNDUsICAwLCAgIDU5LCAgMzQsICAwLCAgIDQ0LCAgMjAsCisgICAgMCwgICAyMywgIDEsICAgMCwgICAwLCAgIDAsICAgMCwgICAxMjUsIDcyLCAgMCwgICAxMTEsIDYyLCAgMCwgICA5OSwgIDU2LAorICAgIDAsICAgODYsICA0NiwgIDAsICAgNzMsICAzNiwgIDAsICAgNjAsICAyNiwgIDAsICAgNDQsICAxMiwgIDAsICAgMjMsICAwLAorICAgIDAsICAgMCwgICAwLCAgIDAsICAgMTE0LCAxODgsIDAsICAgMTAxLCAxNjcsIDAsICAgODksICAxNTAsIDAsICAgNzcsICAxMzEsCisgICAgMCwgICA2NCwgIDExMywgMCwgICA1MCwgIDk1LCAgMCwgICAzNCwgIDc1LCAgMCwgICAxMiwgIDUyLCAgMCwgICAwLCAgIDE0LAorICAgIDAsICAgMTEzLCAxNzAsIDAsICAgMTAxLCAxNTMsIDAsICAgODksICAxMzcsIDAsICAgNzcsICAxMjAsIDAsICAgNjQsICAxMDIsCisgICAgMCwgICA1MCwgIDg1LCAgMCwgICAzNSwgIDY3LCAgMCwgICAxMiwgIDQ0LCAgMCwgICAwLCAgIDQsICAgMCwgICAxMTMsIDE1NiwKKyAgICAwLCAgIDEwMCwgMTM5LCAwLCAgIDg5LCAgMTI1LCAwLCAgIDc3LCAgMTA5LCAwLCAgIDY0LCAgOTIsICAwLCAgIDUxLCAgNzcsCisgICAgMCwgICAzNSwgIDYwLCAgMCwgICAxMiwgIDM4LCAgMCwgICAwLCAgIDAsICAgMCwgICAxMTIsIDE0MSwgMCwgICAxMDAsIDEyNiwKKyAgICAwLCAgIDg5LCAgMTEzLCAwLCAgIDc3LCAgOTgsICAwLCAgIDY0LCAgODMsICAwLCAgIDUxLCAgNjgsICAwLCAgIDM1LCAgNTEsCisgICAgMCwgICAxMiwgIDMwLCAgMCwgICAwLCAgIDAsICAgMCwgICAxMTIsIDEyNywgMCwgICAxMDAsIDExMiwgMCwgICA4OSwgIDEwMCwKKyAgICAwLCAgIDc2LCAgODcsICAwLCAgIDY0LCAgNzQsICAwLCAgIDUxLCAgNTksICAwLCAgIDM1LCAgNDQsICAwLCAgIDEzLCAgMjQsCisgICAgMCwgICAwLCAgIDAsICAgMCwgICAxMTIsIDExMSwgMCwgICAxMDAsIDEwMCwgMCwgICA4OCwgIDg4LCAgMCwgICA3NiwgIDc2LAorICAgIDAsICAgNjQsICA2NCwgIDAsICAgNTEsICA1MiwgIDAsICAgMzYsICAzNywgIDAsICAgMTMsICAxNywgIDAsICAgMCwgICAwLAorICAgIDAsICAgMTExLCA5NiwgIDAsICAgOTksICA4NSwgIDAsICAgODgsICA3NiwgIDAsICAgNzYsICA2NCwgIDAsICAgNjQsICA1MywKKyAgICAwLCAgIDUxLCAgNDEsICAwLCAgIDM2LCAgMjcsICAwLCAgIDEzLCAgNiwgICAwLCAgIDAsICAgMCwgICAwLCAgIDExMSwgODEsCisgICAgMCwgICA5OSwgIDcxLCAgMCwgICA4OCwgIDYyLCAgMCwgICA3NiwgIDUyLCAgMCwgICA2NCwgIDQzLCAgMCwgICA1MSwgIDMxLAorICAgIDAsICAgMzYsICAxNywgIDAsICAgMTMsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTExLCA2OSwgIDAsICAgOTksICA2MCwKKyAgICAwLCAgIDg4LCAgNTIsICAwLCAgIDc1LCAgNDMsICAwLCAgIDYzLCAgMzQsICAwLCAgIDUxLCAgMjEsICAwLCAgIDM2LCAgNywKKyAgICAwLCAgIDEzLCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDk5LCAgMTc3LCAwLCAgIDg4LCAgMTU4LCAwLCAgIDc3LCAgMTQxLAorICAgIDAsICAgNjYsICAxMjMsIDAsICAgNTMsICAxMDYsIDAsICAgNDAsICA4OSwgIDAsICAgMjUsICA3MSwgIDAsICAgNSwgICA0NywKKyAgICAwLCAgIDAsICAgOCwgICAwLCAgIDk5LCAgMTYwLCAwLCAgIDg4LCAgMTQ0LCAwLCAgIDc3LCAgMTI5LCAwLCAgIDY2LCAgMTEyLAorICAgIDAsICAgNTQsICA5NywgIDAsICAgNDEsICA4MCwgIDAsICAgMjYsICA2MiwgIDAsICAgNSwgICA0MCwgIDAsICAgMCwgICAwLAorICAgIDAsICAgOTksICAxNDcsIDAsICAgODcsICAxMzIsIDAsICAgNzgsICAxMTcsIDAsICAgNjYsICAxMDIsIDAsICAgNTQsICA4NywKKyAgICAwLCAgIDQyLCAgNzIsICAwLCAgIDI2LCAgNTUsICAwLCAgIDUsICAgMzQsICAwLCAgIDAsICAgMCwgICAwLCAgIDk5LCAgMTM0LAorICAgIDAsICAgODgsICAxMTksIDAsICAgNzcsICAxMDcsIDAsICAgNjYsICA5MiwgIDAsICAgNTQsICA3OCwgIDAsICAgNDIsICA2NCwKKyAgICAwLCAgIDI3LCAgNDgsICAwLCAgIDUsICAgMjcsICAwLCAgIDAsICAgMCwgICAwLCAgIDk5LCAgMTIwLCAwLCAgIDg3LCAgMTA3LAorICAgIDAsICAgNzgsICA5NCwgIDAsICAgNjYsICA4MSwgIDAsICAgNTQsICA2OCwgIDAsICAgNDIsICA1NSwgIDAsICAgMjcsICA0MCwKKyAgICAwLCAgIDYsICAgMjAsICAwLCAgIDAsICAgMCwgICAwLCAgIDk4LCAgMTA1LCAwLCAgIDg3LCAgOTQsICAwLCAgIDc3LCAgODQsCisgICAgMCwgICA2NSwgIDcxLCAgMCwgICA1NSwgIDU5LCAgMCwgICA0MiwgIDQ3LCAgMCwgICAyOCwgIDMzLCAgMCwgICA2LCAgIDEyLAorICAgIDAsICAgMCwgICAwLCAgIDAsICAgOTgsICA5MywgIDAsICAgODcsICA4MSwgIDAsICAgNzcsICA3MiwgIDAsICAgNjYsICA2MSwKKyAgICAwLCAgIDU0LCAgNDksICAwLCAgIDQyLCAgMzcsICAwLCAgIDI4LCAgMjQsICAwLCAgIDYsICAgNCwgICAwLCAgIDAsICAgMCwKKyAgICAwLCAgIDk4LCAgNzcsICAwLCAgIDg3LCAgNjgsICAwLCAgIDc3LCAgNTksICAwLCAgIDY1LCAgNDksICAwLCAgIDU0LCAgMzksCisgICAgMCwgICA0MiwgIDI3LCAgMCwgICAyOSwgIDE0LCAgMCwgICA2LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMSwgICA5OCwgIDY1LAorICAgIDcsICAgODcsICA1NiwgIDAsICAgNzcsICA0OSwgIDAsICAgNjYsICA0MSwgIDAsICAgNTQsICAzMCwgIDAsICAgNDIsICAxOSwKKyAgICAwLCAgIDI5LCAgMywgICAwLCAgIDYsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDg0LCAgMTY2LCAwLCAgIDc0LCAgMTQ5LAorICAgIDAsICAgNjQsICAxMzQsIDAsICAgNTMsICAxMTcsIDAsICAgNDEsICAxMDAsIDAsICAgMjgsICA4MywgIDAsICAgMTEsICA2NCwKKyAgICAwLCAgIDAsICAgNDIsICAwLCAgIDAsICAgMywgICAwLCAgIDg0LCAgMTUxLCAwLCAgIDc0LCAgMTM1LCAwLCAgIDY0LCAgMTIxLAorICAgIDAsICAgNTMsICAxMDUsIDAsICAgNDIsICA5MCwgIDAsICAgMzAsICA3NSwgIDAsICAgMTQsICA1OCwgIDAsICAgMCwgICAzNiwKKyAgICAwLCAgIDAsICAgMCwgICAwLCAgIDg0LCAgMTM4LCAwLCAgIDc0LCAgMTI0LCAxLCAgIDY0LCAgMTEwLCAwLCAgIDU0LCAgOTUsCisgICAgMCwgICA0MywgIDgxLCAgMCwgICAzMCwgIDY3LCAgMCwgICAxNSwgIDUxLCAgMCwgICAxLCAgIDI5LCAgMCwgICAwLCAgIDAsCisgICAgMTQsICA4NCwgIDEyNiwgMTIsICA3NCwgIDExMiwgMiwgICA2NSwgIDk5LCAgMCwgICA1NCwgIDg1LCAgMCwgICA0NCwgIDczLAorICAgIDAsICAgMzEsICA1OSwgIDAsICAgMTYsICA0NCwgIDAsICAgMSwgICAyMywgIDAsICAgMCwgICAwLCAgIDE2LCAgODQsICAxMTMsCisgICAgMTMsICA3NCwgIDEwMCwgNiwgICA2NSwgIDg5LCAgMCwgICA1NCwgIDc3LCAgMCwgICA0NCwgIDY1LCAgMCwgICAzMSwgIDUxLAorICAgIDAsICAgMTcsICAzNiwgIDAsICAgMSwgICAxNiwgIDAsICAgMCwgICAwLCAgIDI0LCAgODQsICAxMDAsIDE4LCAgNzQsICA4OCwKKyAgICAxMywgIDY1LCAgNzgsICAyLCAgIDU1LCAgNjgsICAwLCAgIDQ0LCAgNTUsICAwLCAgIDMyLCAgNDMsICAwLCAgIDE4LCAgMjgsCisgICAgMCwgICAxLCAgIDYsICAgMCwgICAwLCAgIDAsICAgMjYsICA4NCwgIDg3LCAgMjQsICA3NCwgIDc2LCAgMTcsICA2NSwgIDY3LAorICAgIDcsICAgNTQsICA1NywgIDAsICAgNDQsICA0NiwgIDAsICAgMzIsICAzNSwgIDAsICAgMTksICAyMSwgIDAsICAgMiwgICAzLAorICAgIDAsICAgMCwgICAwLCAgIDMwLCAgODQsICA3NCwgIDI4LCAgNzQsICA2NCwgIDIwLCAgNjUsICA1NSwgIDEyLCAgNTUsICA0NiwKKyAgICAwLCAgIDQ0LCAgMzUsICAwLCAgIDMyLCAgMjQsICAwLCAgIDE4LCAgOSwgICAwLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAzMiwgIDg0LCAgNjMsICAyOCwgIDc0LCAgNTQsICAyMSwgIDY1LCAgNDcsICAxMywgIDU0LCAgMzgsICAwLCAgIDQ0LCAgMjgsCisgICAgMCwgICAzMiwgIDE2LCAgMCwgICAxOCwgIDEsICAgMCwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMzAsICA2NywgIDE1NSwKKyAgICAyMCwgIDU4LCAgMTM5LCAyMCwgIDQ5LCAgMTI2LCAxMiwgIDM5LCAgMTEwLCAwLCAgIDI3LCAgOTQsICAwLCAgIDEzLCAgNzcsCisgICAgMCwgICAwLCAgIDYwLCAgMCwgICAwLCAgIDM3LCAgMCwgICAwLCAgIDAsICAgMzUsICA2NywgIDE0MiwgMzAsICA1OCwgIDEyNiwKKyAgICAyMywgIDUwLCAgMTE0LCAxNiwgIDQwLCAgOTksICA3LCAgIDI5LCAgODUsICAwLCAgIDE1LCAgNjksICAwLCAgIDAsICAgNTIsCisgICAgMCwgICAwLCAgIDMwLCAgMCwgICAwLCAgIDAsICAgMzUsICA2OCwgIDEzMSwgMzAsICA1OSwgIDExNiwgMjcsICA1MCwgIDEwNCwKKyAgICAxOCwgIDQwLCAgOTAsICA5LCAgIDI5LCAgNzYsICAwLCAgIDE3LCAgNjIsICAwLCAgIDIsICAgNDYsICAwLCAgIDAsICAgMjQsCisgICAgMCwgICAwLCAgIDAsICAgMzcsICA2OSwgIDExOSwgMzMsICA1OSwgIDEwNiwgMjcsICA1MSwgIDk0LCAgMjEsICA0MSwgIDgwLAorICAgIDksICAgMzAsICA2NywgIDAsICAgMTgsICA1NCwgIDAsICAgMywgICAzOSwgIDAsICAgMCwgICAxOCwgIDAsICAgMCwgICAwLAorICAgIDQwLCAgNjksICAxMDcsIDM2LCAgNTksICA5NCwgIDI4LCAgNTEsICA4NCwgIDE4LCAgNDEsICA3MiwgIDEwLCAgMzEsICA2MCwKKyAgICAwLCAgIDE5LCAgNDcsICAwLCAgIDQsICAgMzIsICAwLCAgIDAsICAgMTAsICAwLCAgIDAsICAgMCwgICA0MiwgIDY5LCAgOTUsCisgICAgMzYsICA1OSwgIDg0LCAgMjksICA1MSwgIDc0LCAgMTksICA0MSwgIDYzLCAgMTAsICAzMSwgIDUyLCAgMCwgICAyMCwgIDM5LAorICAgIDAsICAgNCwgICAyNSwgIDAsICAgMCwgICA0LCAgIDAsICAgMCwgICAwLCAgIDQzLCAgNjksICA4MywgIDM4LCAgNjAsICA3MywKKyAgICAzMiwgIDUxLCAgNjIsICAyMywgIDQyLCAgNTMsICAxMSwgIDMxLCAgNDIsICAwLCAgIDIwLCAgMzEsICAwLCAgIDUsICAgMTcsCisgICAgMCwgICAwLCAgIDEsICAgMCwgICAwLCAgIDAsICAgNDUsICA2OSwgIDcwLCAgMzksICA2MCwgIDYwLCAgMzMsICA1MSwgIDUyLAorICAgIDI0LCAgNDIsICA0MywgIDEzLCAgMzIsICAzMywgIDAsICAgMjEsICAyMSwgIDAsICAgNSwgICA2LCAgIDAsICAgMCwgICAwLAorICAgIDAsICAgMCwgICAwLCAgIDQ3LCAgNjksICA1OSwgIDQxLCAgNjAsICA1MSwgIDM0LCAgNTEsICA0MywgIDI0LCAgNDIsICAzNSwKKyAgICAxMiwgIDMzLCAgMjYsICAxLCAgIDIyLCAgMTQsICAwLCAgIDUsICAgMSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICA0NiwgIDQ4LCAgMTQ2LCA0MiwgIDQwLCAgMTMxLCAzNiwgIDMyLCAgMTE4LCAyNywgIDIyLCAgMTAzLCAxNywgIDYsICAgODgsCisgICAgNSwgICAwLCAgIDczLCAgMCwgICAwLCAgIDU1LCAgMCwgICAwLCAgIDMzLCAgMCwgICAwLCAgIDAsICAgNDgsICA0OCwgIDEzMywKKyAgICA0NCwgIDQwLCAgMTE5LCAzNywgIDMyLCAgMTA3LCAyOCwgIDIyLCAgOTMsICAyMCwgIDgsICAgNzksICA3LCAgIDAsICAgNjUsCisgICAgMCwgICAwLCAgIDQ5LCAgMCwgICAwLCAgIDI3LCAgMCwgICAwLCAgIDAsICAgNDgsICA1MCwgIDEyMywgNDQsICA0MSwgIDEwOSwKKyAgICAzNywgIDMzLCAgOTcsICAzMCwgIDIzLCAgODMsICAyMSwgIDExLCAgNzEsICA4LCAgIDAsICAgNTgsICAwLCAgIDAsICAgNDIsCisgICAgMCwgICAwLCAgIDIxLCAgMCwgICAwLCAgIDAsICAgNDksICA1MSwgIDExMSwgNDUsICA0MiwgIDk5LCAgMzgsICAzNCwgIDg3LAorICAgIDI5LCAgMjUsICA3NSwgIDIwLCAgMTMsICA2MywgIDgsICAgMCwgICA1MSwgIDAsICAgMCwgICAzNiwgIDAsICAgMCwgICAxNCwKKyAgICAwLCAgIDAsICAgMCwgICA1MiwgIDUyLCAgMTAwLCA0NCwgIDQzLCAgODksICAzOCwgIDM1LCAgNzksICAyOSwgIDI2LCAgNjgsCisgICAgMTksICAxNSwgIDU2LCAgMTAsICAxLCAgIDQzLCAgMCwgICAwLCAgIDI4LCAgMCwgICAwLCAgIDYsICAgMCwgICAwLCAgIDAsCisgICAgNTIsICA1MiwgIDkwLCAgNDcsICA0NCwgIDc5LCAgMzksICAzNiwgIDcwLCAgMzAsICAyNywgIDU5LCAgMjAsICAxNiwgIDQ3LAorICAgIDksICAgMiwgICAzNiwgIDAsICAgMCwgICAyMiwgIDAsICAgMCwgICAyLCAgIDAsICAgMCwgICAwLCAgIDUyLCAgNTMsICA3OCwKKyAgICA0NiwgIDQ0LCAgNjgsICAzOSwgIDM3LCAgNjAsICAzMiwgIDI3LCAgNDksICAyMiwgIDE3LCAgMzksICAxMCwgIDMsICAgMjgsCisgICAgMCwgICAwLCAgIDEyLCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgNTMsICA1MywgIDY2LCAgNDcsICA0NCwgIDU3LAorICAgIDQwLCAgMzYsICA0OCwgIDMyLCAgMjcsICAzOSwgIDIyLCAgMTgsICAzMCwgIDksICAgNCwgICAxOCwgIDAsICAgMCwgICAzLAorICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDU0LCAgNTMsICA1NywgIDQ4LCAgNDUsICA0OSwgIDQxLCAgMzcsICA0MSwKKyAgICAzMywgIDI4LCAgMzIsICAyMiwgIDE5LCAgMjMsICAxMSwgIDYsICAgMTAsICAxLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAwLCAgIDAsICAgMCwKIH07Ci12b2lkIEFkb2JlQ01ZS190b19zUkdCMShGWF9CWVRFIGMsIEZYX0JZVEUgbSwgRlhfQllURSB5LCBGWF9CWVRFIGssIEZYX0JZVEUmIFIsIEZYX0JZVEUmIEcsIEZYX0JZVEUmIEIpCi17Ci0gICAgaW50IGZpeF9jID0gYyA8PCA4OwotICAgIGludCBmaXhfbSA9IG0gPDwgODsKLSAgICBpbnQgZml4X3kgPSB5IDw8IDg7Ci0gICAgaW50IGZpeF9rID0gayA8PCA4OwotICAgIGludCBjX2luZGV4ID0gKGZpeF9jICsgNDA5NikgPj4gMTM7Ci0gICAgaW50IG1faW5kZXggPSAoZml4X20gKyA0MDk2KSA+PiAxMzsKLSAgICBpbnQgeV9pbmRleCA9IChmaXhfeSArIDQwOTYpID4+IDEzOwotICAgIGludCBrX2luZGV4ID0gKGZpeF9rICsgNDA5NikgPj4gMTM7Ci0gICAgaW50IHBvcyA9IChjX2luZGV4ICogOSAqIDkgKiA5ICsgbV9pbmRleCAqIDkgKiA5ICsgeV9pbmRleCAqIDkgKyBrX2luZGV4KSAqIDM7Ci0gICAgaW50IGZpeF9yID0gZ19DTVlLU2FtcGxlc1twb3NdIDw8IDg7Ci0gICAgaW50IGZpeF9nID0gZ19DTVlLU2FtcGxlc1twb3MgKyAxXSA8PCA4OwotICAgIGludCBmaXhfYiA9IGdfQ01ZS1NhbXBsZXNbcG9zICsgMl0gPDwgODsKLSAgICBpbnQgYzFfaW5kZXggPSBmaXhfYyA+PiAxMzsKLSAgICBpZiAoYzFfaW5kZXggPT0gY19pbmRleCkgewotICAgICAgICBjMV9pbmRleCA9IGMxX2luZGV4ID09IDggPyBjMV9pbmRleCAtIDEgOiBjMV9pbmRleCArIDE7Ci0gICAgfQotICAgIGludCBtMV9pbmRleCA9IGZpeF9tID4+IDEzOwotICAgIGlmIChtMV9pbmRleCA9PSBtX2luZGV4KSB7Ci0gICAgICAgIG0xX2luZGV4ID0gbTFfaW5kZXggPT0gOCA/IG0xX2luZGV4IC0gMSA6IG0xX2luZGV4ICsgMTsKLSAgICB9Ci0gICAgaW50IHkxX2luZGV4ID0gZml4X3kgPj4gMTM7Ci0gICAgaWYgKHkxX2luZGV4ID09IHlfaW5kZXgpIHsKLSAgICAgICAgeTFfaW5kZXggPSB5MV9pbmRleCA9PSA4ID8geTFfaW5kZXggLSAxIDogeTFfaW5kZXggKyAxOwotICAgIH0KLSAgICBpbnQgazFfaW5kZXggPSBmaXhfayA+PiAxMzsKLSAgICBpZiAoazFfaW5kZXggPT0ga19pbmRleCkgewotICAgICAgICBrMV9pbmRleCA9IGsxX2luZGV4ID09IDggPyBrMV9pbmRleCAtIDEgOiBrMV9pbmRleCArIDE7Ci0gICAgfQotICAgIGludCBjMV9wb3MgPSBwb3MgKyAoYzFfaW5kZXggLSBjX2luZGV4KSAqIDkgKiA5ICogOSAqIDM7Ci0gICAgaW50IG0xX3BvcyA9IHBvcyArIChtMV9pbmRleCAtIG1faW5kZXgpICogOSAqIDkgKiAzOwotICAgIGludCB5MV9wb3MgPSBwb3MgKyAoeTFfaW5kZXggLSB5X2luZGV4KSAqIDkgKiAzOwotICAgIGludCBrMV9wb3MgPSBwb3MgKyAoazFfaW5kZXggLSBrX2luZGV4KSAqIDM7Ci0gICAgaW50IGNfcl9kZWx0YSA9IGdfQ01ZS1NhbXBsZXNbcG9zXSAtIGdfQ01ZS1NhbXBsZXNbYzFfcG9zXTsKLSAgICBpbnQgY19nX2RlbHRhID0gZ19DTVlLU2FtcGxlc1twb3MgKyAxXSAtIGdfQ01ZS1NhbXBsZXNbYzFfcG9zICsgMV07Ci0gICAgaW50IGNfYl9kZWx0YSA9IGdfQ01ZS1NhbXBsZXNbcG9zICsgMl0gLSBnX0NNWUtTYW1wbGVzW2MxX3BvcyArIDJdOwotICAgIGludCBtX3JfZGVsdGEgPSBnX0NNWUtTYW1wbGVzW3Bvc10gLSBnX0NNWUtTYW1wbGVzW20xX3Bvc107Ci0gICAgaW50IG1fZ19kZWx0YSA9IGdfQ01ZS1NhbXBsZXNbcG9zICsgMV0gLSBnX0NNWUtTYW1wbGVzW20xX3BvcyArIDFdOwotICAgIGludCBtX2JfZGVsdGEgPSBnX0NNWUtTYW1wbGVzW3BvcyArIDJdIC0gZ19DTVlLU2FtcGxlc1ttMV9wb3MgKyAyXTsKLSAgICBpbnQgeV9yX2RlbHRhID0gZ19DTVlLU2FtcGxlc1twb3NdIC0gZ19DTVlLU2FtcGxlc1t5MV9wb3NdOwotICAgIGludCB5X2dfZGVsdGEgPSBnX0NNWUtTYW1wbGVzW3BvcyArIDFdIC0gZ19DTVlLU2FtcGxlc1t5MV9wb3MgKyAxXTsKLSAgICBpbnQgeV9iX2RlbHRhID0gZ19DTVlLU2FtcGxlc1twb3MgKyAyXSAtIGdfQ01ZS1NhbXBsZXNbeTFfcG9zICsgMl07Ci0gICAgaW50IGtfcl9kZWx0YSA9IGdfQ01ZS1NhbXBsZXNbcG9zXSAtIGdfQ01ZS1NhbXBsZXNbazFfcG9zXTsKLSAgICBpbnQga19nX2RlbHRhID0gZ19DTVlLU2FtcGxlc1twb3MgKyAxXSAtIGdfQ01ZS1NhbXBsZXNbazFfcG9zICsgMV07Ci0gICAgaW50IGtfYl9kZWx0YSA9IGdfQ01ZS1NhbXBsZXNbcG9zICsgMl0gLSBnX0NNWUtTYW1wbGVzW2sxX3BvcyArIDJdOwotICAgIGludCBjX3JhdGUgPSAoZml4X2MgLSAoY19pbmRleCA8PCAxMykpICogKGNfaW5kZXggLSBjMV9pbmRleCk7Ci0gICAgZml4X3IgKz0gY19yX2RlbHRhICogY19yYXRlIC8gMzI7Ci0gICAgZml4X2cgKz0gY19nX2RlbHRhICogY19yYXRlIC8gMzI7Ci0gICAgZml4X2IgKz0gY19iX2RlbHRhICogY19yYXRlIC8gMzI7Ci0gICAgaW50IG1fcmF0ZSA9IChmaXhfbSAtIChtX2luZGV4IDw8IDEzKSkgKiAobV9pbmRleCAtIG0xX2luZGV4KTsKLSAgICBmaXhfciArPSBtX3JfZGVsdGEgKiBtX3JhdGUgLyAzMjsKLSAgICBmaXhfZyArPSBtX2dfZGVsdGEgKiBtX3JhdGUgLyAzMjsKLSAgICBmaXhfYiArPSBtX2JfZGVsdGEgKiBtX3JhdGUgLyAzMjsKLSAgICBpbnQgeV9yYXRlID0gKGZpeF95IC0gKHlfaW5kZXggPDwgMTMpKSAqICh5X2luZGV4IC0geTFfaW5kZXgpOwotICAgIGZpeF9yICs9IHlfcl9kZWx0YSAqIHlfcmF0ZSAvIDMyOwotICAgIGZpeF9nICs9IHlfZ19kZWx0YSAqIHlfcmF0ZSAvIDMyOwotICAgIGZpeF9iICs9IHlfYl9kZWx0YSAqIHlfcmF0ZSAvIDMyOwotICAgIGludCBrX3JhdGUgPSAoZml4X2sgLSAoa19pbmRleCA8PCAxMykpICogKGtfaW5kZXggLSBrMV9pbmRleCk7Ci0gICAgZml4X3IgKz0ga19yX2RlbHRhICoga19yYXRlIC8gMzI7Ci0gICAgZml4X2cgKz0ga19nX2RlbHRhICoga19yYXRlIC8gMzI7Ci0gICAgZml4X2IgKz0ga19iX2RlbHRhICoga19yYXRlIC8gMzI7Ci0gICAgaWYgKGZpeF9yIDwgMCkgewotICAgICAgICBmaXhfciA9IDA7Ci0gICAgfQotICAgIGlmIChmaXhfZyA8IDApIHsKLSAgICAgICAgZml4X2cgPSAwOwotICAgIH0KLSAgICBpZiAoZml4X2IgPCAwKSB7Ci0gICAgICAgIGZpeF9iID0gMDsKLSAgICB9Ci0gICAgUiA9IGZpeF9yID4+IDg7Ci0gICAgRyA9IGZpeF9nID4+IDg7Ci0gICAgQiA9IGZpeF9iID4+IDg7Cit2b2lkIEFkb2JlQ01ZS190b19zUkdCMSh1aW50OF90IGMsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG0sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHksCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGssCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90JiBSLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCYgRywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QmIEIpIHsKKyAgaW50IGZpeF9jID0gYyA8PCA4OworICBpbnQgZml4X20gPSBtIDw8IDg7CisgIGludCBmaXhfeSA9IHkgPDwgODsKKyAgaW50IGZpeF9rID0gayA8PCA4OworICBpbnQgY19pbmRleCA9IChmaXhfYyArIDQwOTYpID4+IDEzOworICBpbnQgbV9pbmRleCA9IChmaXhfbSArIDQwOTYpID4+IDEzOworICBpbnQgeV9pbmRleCA9IChmaXhfeSArIDQwOTYpID4+IDEzOworICBpbnQga19pbmRleCA9IChmaXhfayArIDQwOTYpID4+IDEzOworICBpbnQgcG9zID0gKGNfaW5kZXggKiA5ICogOSAqIDkgKyBtX2luZGV4ICogOSAqIDkgKyB5X2luZGV4ICogOSArIGtfaW5kZXgpICogMzsKKyAgaW50IGZpeF9yID0gZ19DTVlLU2FtcGxlc1twb3NdIDw8IDg7CisgIGludCBmaXhfZyA9IGdfQ01ZS1NhbXBsZXNbcG9zICsgMV0gPDwgODsKKyAgaW50IGZpeF9iID0gZ19DTVlLU2FtcGxlc1twb3MgKyAyXSA8PCA4OworICBpbnQgYzFfaW5kZXggPSBmaXhfYyA+PiAxMzsKKyAgaWYgKGMxX2luZGV4ID09IGNfaW5kZXgpIHsKKyAgICBjMV9pbmRleCA9IGMxX2luZGV4ID09IDggPyBjMV9pbmRleCAtIDEgOiBjMV9pbmRleCArIDE7CisgIH0KKyAgaW50IG0xX2luZGV4ID0gZml4X20gPj4gMTM7CisgIGlmIChtMV9pbmRleCA9PSBtX2luZGV4KSB7CisgICAgbTFfaW5kZXggPSBtMV9pbmRleCA9PSA4ID8gbTFfaW5kZXggLSAxIDogbTFfaW5kZXggKyAxOworICB9CisgIGludCB5MV9pbmRleCA9IGZpeF95ID4+IDEzOworICBpZiAoeTFfaW5kZXggPT0geV9pbmRleCkgeworICAgIHkxX2luZGV4ID0geTFfaW5kZXggPT0gOCA/IHkxX2luZGV4IC0gMSA6IHkxX2luZGV4ICsgMTsKKyAgfQorICBpbnQgazFfaW5kZXggPSBmaXhfayA+PiAxMzsKKyAgaWYgKGsxX2luZGV4ID09IGtfaW5kZXgpIHsKKyAgICBrMV9pbmRleCA9IGsxX2luZGV4ID09IDggPyBrMV9pbmRleCAtIDEgOiBrMV9pbmRleCArIDE7CisgIH0KKyAgaW50IGMxX3BvcyA9IHBvcyArIChjMV9pbmRleCAtIGNfaW5kZXgpICogOSAqIDkgKiA5ICogMzsKKyAgaW50IG0xX3BvcyA9IHBvcyArIChtMV9pbmRleCAtIG1faW5kZXgpICogOSAqIDkgKiAzOworICBpbnQgeTFfcG9zID0gcG9zICsgKHkxX2luZGV4IC0geV9pbmRleCkgKiA5ICogMzsKKyAgaW50IGsxX3BvcyA9IHBvcyArIChrMV9pbmRleCAtIGtfaW5kZXgpICogMzsKKyAgaW50IGNfcl9kZWx0YSA9IGdfQ01ZS1NhbXBsZXNbcG9zXSAtIGdfQ01ZS1NhbXBsZXNbYzFfcG9zXTsKKyAgaW50IGNfZ19kZWx0YSA9IGdfQ01ZS1NhbXBsZXNbcG9zICsgMV0gLSBnX0NNWUtTYW1wbGVzW2MxX3BvcyArIDFdOworICBpbnQgY19iX2RlbHRhID0gZ19DTVlLU2FtcGxlc1twb3MgKyAyXSAtIGdfQ01ZS1NhbXBsZXNbYzFfcG9zICsgMl07CisgIGludCBtX3JfZGVsdGEgPSBnX0NNWUtTYW1wbGVzW3Bvc10gLSBnX0NNWUtTYW1wbGVzW20xX3Bvc107CisgIGludCBtX2dfZGVsdGEgPSBnX0NNWUtTYW1wbGVzW3BvcyArIDFdIC0gZ19DTVlLU2FtcGxlc1ttMV9wb3MgKyAxXTsKKyAgaW50IG1fYl9kZWx0YSA9IGdfQ01ZS1NhbXBsZXNbcG9zICsgMl0gLSBnX0NNWUtTYW1wbGVzW20xX3BvcyArIDJdOworICBpbnQgeV9yX2RlbHRhID0gZ19DTVlLU2FtcGxlc1twb3NdIC0gZ19DTVlLU2FtcGxlc1t5MV9wb3NdOworICBpbnQgeV9nX2RlbHRhID0gZ19DTVlLU2FtcGxlc1twb3MgKyAxXSAtIGdfQ01ZS1NhbXBsZXNbeTFfcG9zICsgMV07CisgIGludCB5X2JfZGVsdGEgPSBnX0NNWUtTYW1wbGVzW3BvcyArIDJdIC0gZ19DTVlLU2FtcGxlc1t5MV9wb3MgKyAyXTsKKyAgaW50IGtfcl9kZWx0YSA9IGdfQ01ZS1NhbXBsZXNbcG9zXSAtIGdfQ01ZS1NhbXBsZXNbazFfcG9zXTsKKyAgaW50IGtfZ19kZWx0YSA9IGdfQ01ZS1NhbXBsZXNbcG9zICsgMV0gLSBnX0NNWUtTYW1wbGVzW2sxX3BvcyArIDFdOworICBpbnQga19iX2RlbHRhID0gZ19DTVlLU2FtcGxlc1twb3MgKyAyXSAtIGdfQ01ZS1NhbXBsZXNbazFfcG9zICsgMl07CisgIGludCBjX3JhdGUgPSAoZml4X2MgLSAoY19pbmRleCA8PCAxMykpICogKGNfaW5kZXggLSBjMV9pbmRleCk7CisgIGZpeF9yICs9IGNfcl9kZWx0YSAqIGNfcmF0ZSAvIDMyOworICBmaXhfZyArPSBjX2dfZGVsdGEgKiBjX3JhdGUgLyAzMjsKKyAgZml4X2IgKz0gY19iX2RlbHRhICogY19yYXRlIC8gMzI7CisgIGludCBtX3JhdGUgPSAoZml4X20gLSAobV9pbmRleCA8PCAxMykpICogKG1faW5kZXggLSBtMV9pbmRleCk7CisgIGZpeF9yICs9IG1fcl9kZWx0YSAqIG1fcmF0ZSAvIDMyOworICBmaXhfZyArPSBtX2dfZGVsdGEgKiBtX3JhdGUgLyAzMjsKKyAgZml4X2IgKz0gbV9iX2RlbHRhICogbV9yYXRlIC8gMzI7CisgIGludCB5X3JhdGUgPSAoZml4X3kgLSAoeV9pbmRleCA8PCAxMykpICogKHlfaW5kZXggLSB5MV9pbmRleCk7CisgIGZpeF9yICs9IHlfcl9kZWx0YSAqIHlfcmF0ZSAvIDMyOworICBmaXhfZyArPSB5X2dfZGVsdGEgKiB5X3JhdGUgLyAzMjsKKyAgZml4X2IgKz0geV9iX2RlbHRhICogeV9yYXRlIC8gMzI7CisgIGludCBrX3JhdGUgPSAoZml4X2sgLSAoa19pbmRleCA8PCAxMykpICogKGtfaW5kZXggLSBrMV9pbmRleCk7CisgIGZpeF9yICs9IGtfcl9kZWx0YSAqIGtfcmF0ZSAvIDMyOworICBmaXhfZyArPSBrX2dfZGVsdGEgKiBrX3JhdGUgLyAzMjsKKyAgZml4X2IgKz0ga19iX2RlbHRhICoga19yYXRlIC8gMzI7CisgIGlmIChmaXhfciA8IDApIHsKKyAgICBmaXhfciA9IDA7CisgIH0KKyAgaWYgKGZpeF9nIDwgMCkgeworICAgIGZpeF9nID0gMDsKKyAgfQorICBpZiAoZml4X2IgPCAwKSB7CisgICAgZml4X2IgPSAwOworICB9CisgIFIgPSBmaXhfciA+PiA4OworICBHID0gZml4X2cgPj4gODsKKyAgQiA9IGZpeF9iID4+IDg7CiB9Ci12b2lkIEFkb2JlQ01ZS190b19zUkdCKEZYX0ZMT0FUIGMsIEZYX0ZMT0FUIG0sIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIGssIEZYX0ZMT0FUJiBSLCBGWF9GTE9BVCYgRywgRlhfRkxPQVQmIEIpCi17Ci0gICAgRlhfQllURSBjMSA9IEZYU1lTX3JvdW5kKGMgKiAyNTUpOwotICAgIEZYX0JZVEUgbTEgPSBGWFNZU19yb3VuZChtICogMjU1KTsKLSAgICBGWF9CWVRFIHkxID0gRlhTWVNfcm91bmQoeSAqIDI1NSk7Ci0gICAgRlhfQllURSBrMSA9IEZYU1lTX3JvdW5kKGsgKiAyNTUpOwotICAgIEZYX0JZVEUgciwgZywgYjsKLSAgICBBZG9iZUNNWUtfdG9fc1JHQjEoYzEsIG0xLCB5MSwgazEsIHIsIGcsIGIpOwotICAgIFIgPSAxLjBmICogciAvIDI1NTsKLSAgICBHID0gMS4wZiAqIGcgLyAyNTU7Ci0gICAgQiA9IDEuMGYgKiBiIC8gMjU1Owordm9pZCBBZG9iZUNNWUtfdG9fc1JHQihGWF9GTE9BVCBjLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBtLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5LAorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBrLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBCKSB7CisgIHVpbnQ4X3QgYzEgPSBGWFNZU19yb3VuZChjICogMjU1KTsKKyAgdWludDhfdCBtMSA9IEZYU1lTX3JvdW5kKG0gKiAyNTUpOworICB1aW50OF90IHkxID0gRlhTWVNfcm91bmQoeSAqIDI1NSk7CisgIHVpbnQ4X3QgazEgPSBGWFNZU19yb3VuZChrICogMjU1KTsKKyAgdWludDhfdCByLCBnLCBiOworICBBZG9iZUNNWUtfdG9fc1JHQjEoYzEsIG0xLCB5MSwgazEsIHIsIGcsIGIpOworICBSID0gMS4wZiAqIHIgLyAyNTU7CisgIEcgPSAxLjBmICogZyAvIDI1NTsKKyAgQiA9IDEuMGYgKiBiIC8gMjU1OwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qYmlnLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfamJpZy5jcHAKaW5kZXggOGZjZDlmNC4uOGM3ZjFiYyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qYmlnLmNwcAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2piaWcuY3BwCkBAIC0xLDIwNiArMSwxMjUgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIgogI2luY2x1ZGUgImNvZGVjX2ludC5oIgotQ0NvZGVjX0piaWcyQ29udGV4dDo6Q0NvZGVjX0piaWcyQ29udGV4dCgpCi17Ci0gICAgRlhTWVNfbWVtc2V0MzIodGhpcywgMCwgc2l6ZW9mKENDb2RlY19KYmlnMkNvbnRleHQpKTsKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIgorCisvLyBIb2xkcyBwZXItZG9jdW1lbnQgSkJpZzIgcmVsYXRlZCBkYXRhLgorY2xhc3MgSkJpZzJEb2N1bWVudENvbnRleHQgOiBwdWJsaWMgQ0ZYX0Rlc3RydWN0T2JqZWN0IHsKKyBwdWJsaWM6CisgIHN0ZDo6bGlzdDxDSkJpZzJfQ2FjaGVQYWlyPiogR2V0U3ltYm9sRGljdENhY2hlKCkgeworICAgIHJldHVybiAmbV9TeW1ib2xEaWN0Q2FjaGU7CisgIH0KKworICB+SkJpZzJEb2N1bWVudENvbnRleHQoKSBvdmVycmlkZSB7CisgICAgZm9yIChhdXRvIGl0IDogbV9TeW1ib2xEaWN0Q2FjaGUpIHsKKyAgICAgIGRlbGV0ZSBpdC5zZWNvbmQ7CisgICAgfQorICB9CisKKyBwcml2YXRlOgorICBzdGQ6Omxpc3Q8Q0pCaWcyX0NhY2hlUGFpcj4gbV9TeW1ib2xEaWN0Q2FjaGU7Cit9OworCitKQmlnMkRvY3VtZW50Q29udGV4dCogR2V0SkJpZzJEb2N1bWVudENvbnRleHQoQ0NvZGVjX0piaWcyTW9kdWxlKiBwTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Qcml2YXRlRGF0YSogcFByaXZhdGVEYXRhKSB7CisgIHZvaWQqIHBNb2R1bGVQcml2YXRlRGF0YSA9IHBQcml2YXRlRGF0YS0+R2V0UHJpdmF0ZURhdGEocE1vZHVsZSk7CisgIGlmIChwTW9kdWxlUHJpdmF0ZURhdGEpIHsKKyAgICBDRlhfRGVzdHJ1Y3RPYmplY3QqIHBEZXN0cnVjdE9iamVjdCA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYX0Rlc3RydWN0T2JqZWN0Kj4ocE1vZHVsZVByaXZhdGVEYXRhKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SkJpZzJEb2N1bWVudENvbnRleHQqPihwRGVzdHJ1Y3RPYmplY3QpOworICB9CisgIEpCaWcyRG9jdW1lbnRDb250ZXh0KiBwSkJpZzJEb2N1bWVudENvbnRleHQgPSBuZXcgSkJpZzJEb2N1bWVudENvbnRleHQoKTsKKyAgcFByaXZhdGVEYXRhLT5TZXRQcml2YXRlT2JqKHBNb2R1bGUsIHBKQmlnMkRvY3VtZW50Q29udGV4dCk7CisgIHJldHVybiBwSkJpZzJEb2N1bWVudENvbnRleHQ7CiB9Ci1DQ29kZWNfSmJpZzJNb2R1bGU6On5DQ29kZWNfSmJpZzJNb2R1bGUoKQoteworCitDQ29kZWNfSmJpZzJDb250ZXh0OjpDQ29kZWNfSmJpZzJDb250ZXh0KCkgeworICBGWFNZU19tZW1zZXQodGhpcywgMCwgc2l6ZW9mKENDb2RlY19KYmlnMkNvbnRleHQpKTsKIH0KLXZvaWQqIENDb2RlY19KYmlnMk1vZHVsZTo6Q3JlYXRlSmJpZzJDb250ZXh0KCkKLXsKLSAgICByZXR1cm4gbmV3IENDb2RlY19KYmlnMkNvbnRleHQoKTsKKworQ0NvZGVjX0piaWcyTW9kdWxlOjp+Q0NvZGVjX0piaWcyTW9kdWxlKCkgewogfQotdm9pZCBDQ29kZWNfSmJpZzJNb2R1bGU6OkRlc3Ryb3lKYmlnMkNvbnRleHQodm9pZCogcEpiaWcyQ29udGVudCkKLXsKLSAgICBpZihwSmJpZzJDb250ZW50KSB7Ci0gICAgICAgIENKQmlnMl9Db250ZXh0OjpEZXN0cm95Q29udGV4dCgoKENDb2RlY19KYmlnMkNvbnRleHQqKXBKYmlnMkNvbnRlbnQpLT5tX3BDb250ZXh0KTsKLSAgICAgICAgZGVsZXRlIChDQ29kZWNfSmJpZzJDb250ZXh0KilwSmJpZzJDb250ZW50OwotICAgIH0KLSAgICBwSmJpZzJDb250ZW50ID0gTlVMTDsKKwordm9pZCogQ0NvZGVjX0piaWcyTW9kdWxlOjpDcmVhdGVKYmlnMkNvbnRleHQoKSB7CisgIHJldHVybiBuZXcgQ0NvZGVjX0piaWcyQ29udGV4dCgpOwogfQotRlhfQk9PTCBDQ29kZWNfSmJpZzJNb2R1bGU6OkRlY29kZShGWF9EV09SRCB3aWR0aCwgRlhfRFdPUkQgaGVpZ2h0LCBGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUENCWVRFIGdsb2JhbF9kYXRhLCBGWF9EV09SRCBnbG9iYWxfc2l6ZSwgRlhfTFBCWVRFIGRlc3RfYnVmLCBGWF9EV09SRCBkZXN0X3BpdGNoKQotewotICAgIEZYU1lTX21lbXNldDMyKGRlc3RfYnVmLCAwLCBoZWlnaHQgKiBkZXN0X3BpdGNoKTsKLSAgICBDSkJpZzJfQ29udGV4dCogcENvbnRleHQgPSBDSkJpZzJfQ29udGV4dDo6Q3JlYXRlQ29udGV4dCgmbV9Nb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0xQQllURSlnbG9iYWxfZGF0YSwgZ2xvYmFsX3NpemUsIChGWF9MUEJZVEUpc3JjX2J1Ziwgc3JjX3NpemUsIEpCSUcyX0VNQkVEX1NUUkVBTSwgJm1fU3ltYm9sRGljdENhY2hlKTsKLSAgICBpZiAocENvbnRleHQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGludCByZXQgPSBwQ29udGV4dC0+Z2V0Rmlyc3RQYWdlKGRlc3RfYnVmLCB3aWR0aCwgaGVpZ2h0LCBkZXN0X3BpdGNoLCBOVUxMKTsKLSAgICBDSkJpZzJfQ29udGV4dDo6RGVzdHJveUNvbnRleHQocENvbnRleHQpOwotICAgIGlmIChyZXQgIT0gSkJJRzJfU1VDQ0VTUykgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGludCBkd29yZF9zaXplID0gaGVpZ2h0ICogZGVzdF9waXRjaCAvIDQ7Ci0gICAgRlhfRFdPUkQqIGR3b3JkX2J1ZiA9IChGWF9EV09SRCopZGVzdF9idWY7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkd29yZF9zaXplOyBpICsrKSB7Ci0gICAgICAgIGR3b3JkX2J1ZltpXSA9IH5kd29yZF9idWZbaV07Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwordm9pZCBDQ29kZWNfSmJpZzJNb2R1bGU6OkRlc3Ryb3lKYmlnMkNvbnRleHQodm9pZCogcEpiaWcyQ29udGVudCkgeworICBpZiAocEpiaWcyQ29udGVudCkgeworICAgIENKQmlnMl9Db250ZXh0OjpEZXN0cm95Q29udGV4dCgKKyAgICAgICAgKChDQ29kZWNfSmJpZzJDb250ZXh0KilwSmJpZzJDb250ZW50KS0+bV9wQ29udGV4dCk7CisgICAgZGVsZXRlIChDQ29kZWNfSmJpZzJDb250ZXh0KilwSmJpZzJDb250ZW50OworICB9CisgIHBKYmlnMkNvbnRlbnQgPSBOVUxMOwogfQotRlhfQk9PTCBDQ29kZWNfSmJpZzJNb2R1bGU6OkRlY29kZShJRlhfRmlsZVJlYWQqIGZpbGVfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgd2lkdGgsIEZYX0RXT1JEJiBoZWlnaHQsIEZYX0RXT1JEJiBwaXRjaCwgRlhfTFBCWVRFJiBkZXN0X2J1ZikKLXsKLSAgICBDSkJpZzJfQ29udGV4dCogcENvbnRleHQgPSBOVUxMOwotICAgIENKQmlnMl9JbWFnZSogZGVzdF9pbWFnZSA9IE5VTEw7Ci0gICAgRlhfRFdPUkQgc3JjX3NpemUgPSAoRlhfRFdPUkQpZmlsZV9wdHItPkdldFNpemUoKTsKLSAgICBGWF9MUEJZVEUgc3JjX2J1ZiA9IEZYX0FsbG9jKEZYX0JZVEUsIHNyY19zaXplKTsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBpZighZmlsZV9wdHItPlJlYWRCbG9jayhzcmNfYnVmLCAwLCBzcmNfc2l6ZSkpIHsKLSAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgIHBDb250ZXh0ID0gQ0pCaWcyX0NvbnRleHQ6OkNyZWF0ZUNvbnRleHQoJm1fTW9kdWxlLCBOVUxMLCAwLCBzcmNfYnVmLCBzcmNfc2l6ZSwgSkJJRzJfRklMRV9TVFJFQU0sICZtX1N5bWJvbERpY3RDYWNoZSk7Ci0gICAgaWYocENvbnRleHQgPT0gTlVMTCkgewotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgcmV0ID0gcENvbnRleHQtPmdldEZpcnN0UGFnZSgmZGVzdF9pbWFnZSwgTlVMTCk7Ci0gICAgQ0pCaWcyX0NvbnRleHQ6OkRlc3Ryb3lDb250ZXh0KHBDb250ZXh0KTsKLSAgICBpZiAocmV0ICE9IEpCSUcyX1NVQ0NFU1MpIHsKLSAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgIHdpZHRoID0gKEZYX0RXT1JEKWRlc3RfaW1hZ2UtPm1fbldpZHRoOwotICAgIGhlaWdodCA9IChGWF9EV09SRClkZXN0X2ltYWdlLT5tX25IZWlnaHQ7Ci0gICAgcGl0Y2ggPSAoRlhfRFdPUkQpZGVzdF9pbWFnZS0+bV9uU3RyaWRlOwotICAgIGRlc3RfYnVmID0gZGVzdF9pbWFnZS0+bV9wRGF0YTsKLSAgICBkZXN0X2ltYWdlLT5tX2JOZWVkRnJlZSA9IEZBTFNFOwotICAgIGRlbGV0ZSBkZXN0X2ltYWdlOwotICAgIEZYX0ZyZWUoc3JjX2J1Zik7Ci0gICAgcmV0dXJuIFRSVUU7Ci1mYWlsZWQ6Ci0gICAgaWYoc3JjX2J1ZikgewotICAgICAgICBGWF9GcmVlKHNyY19idWYpOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci1GWENPREVDX1NUQVRVUyBDQ29kZWNfSmJpZzJNb2R1bGU6OlN0YXJ0RGVjb2RlKHZvaWQqIHBKYmlnMkNvbnRleHQsIEZYX0RXT1JEIHdpZHRoLCBGWF9EV09SRCBoZWlnaHQsIEZYX0xQQ0JZVEUgc3JjX2J1ZiwgRlhfRFdPUkQgc3JjX3NpemUsCi0gICAgICAgIEZYX0xQQ0JZVEUgZ2xvYmFsX2RhdGEsIEZYX0RXT1JEIGdsb2JhbF9zaXplLCBGWF9MUEJZVEUgZGVzdF9idWYsIEZYX0RXT1JEIGRlc3RfcGl0Y2gsIElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIGlmKCFwSmJpZzJDb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJfUEFSQU1TOwotICAgIH0KLSAgICBDQ29kZWNfSmJpZzJDb250ZXh0KiBtX3BKYmlnMkNvbnRleHQgPSAoQ0NvZGVjX0piaWcyQ29udGV4dCopcEpiaWcyQ29udGV4dDsKLSAgICBtX3BKYmlnMkNvbnRleHQtPm1fd2lkdGggPSB3aWR0aDsKLSAgICBtX3BKYmlnMkNvbnRleHQtPm1faGVpZ2h0ID0gaGVpZ2h0OwotICAgIG1fcEpiaWcyQ29udGV4dC0+bV9zcmNfYnVmID0gKHVuc2lnbmVkIGNoYXIgKilzcmNfYnVmOwotICAgIG1fcEpiaWcyQ29udGV4dC0+bV9zcmNfc2l6ZSA9IHNyY19zaXplOwotICAgIG1fcEpiaWcyQ29udGV4dC0+bV9nbG9iYWxfZGF0YSA9IGdsb2JhbF9kYXRhOwotICAgIG1fcEpiaWcyQ29udGV4dC0+bV9nbG9iYWxfc2l6ZSA9IGdsb2JhbF9zaXplOwotICAgIG1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2J1ZiA9IGRlc3RfYnVmOwotICAgIG1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X3BpdGNoID0gZGVzdF9waXRjaDsKLSAgICBtX3BKYmlnMkNvbnRleHQtPm1fcFBhdXNlID0gcFBhdXNlOwotICAgIG1fcEpiaWcyQ29udGV4dC0+bV9iRmlsZVJlYWRlciA9IEZBTFNFOwotICAgIEZYU1lTX21lbXNldDMyKGRlc3RfYnVmLCAwLCBoZWlnaHQgKiBkZXN0X3BpdGNoKTsKLSAgICBtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQgPSBDSkJpZzJfQ29udGV4dDo6Q3JlYXRlQ29udGV4dCgmbV9Nb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0xQQllURSlnbG9iYWxfZGF0YSwgZ2xvYmFsX3NpemUsIChGWF9MUEJZVEUpc3JjX2J1Ziwgc3JjX3NpemUsIEpCSUcyX0VNQkVEX1NUUkVBTSwgJm1fU3ltYm9sRGljdENhY2hlLCBwUGF1c2UpOwotICAgIGlmKCFtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOwotICAgIH0KLSAgICBpbnQgcmV0ID0gbV9wSmJpZzJDb250ZXh0LT5tX3BDb250ZXh0LT5nZXRGaXJzdFBhZ2UoZGVzdF9idWYsIHdpZHRoLCBoZWlnaHQsIGRlc3RfcGl0Y2gsIHBQYXVzZSk7Ci0gICAgaWYobV9wSmJpZzJDb250ZXh0LT5tX3BDb250ZXh0LT5HZXRQcm9jZXNzaXZlU3RhdHVzKCkgPT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSCkgewotICAgICAgICBDSkJpZzJfQ29udGV4dDo6RGVzdHJveUNvbnRleHQobV9wSmJpZzJDb250ZXh0LT5tX3BDb250ZXh0KTsKLSAgICAgICAgbV9wSmJpZzJDb250ZXh0LT5tX3BDb250ZXh0ID0gTlVMTDsKLSAgICAgICAgaWYgKHJldCAhPSBKQklHMl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGR3b3JkX3NpemUgPSBoZWlnaHQgKiBkZXN0X3BpdGNoIC8gNDsKLSAgICAgICAgRlhfRFdPUkQqIGR3b3JkX2J1ZiA9IChGWF9EV09SRCopZGVzdF9idWY7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZHdvcmRfc2l6ZTsgaSArKykgewotICAgICAgICAgICAgZHdvcmRfYnVmW2ldID0gfmR3b3JkX2J1ZltpXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKLSAgICB9Ci0gICAgcmV0dXJuIG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dC0+R2V0UHJvY2Vzc2l2ZVN0YXR1cygpOwotfQotRlhDT0RFQ19TVEFUVVMgQ0NvZGVjX0piaWcyTW9kdWxlOjpTdGFydERlY29kZSh2b2lkKiBwSmJpZzJDb250ZXh0LCBJRlhfRmlsZVJlYWQqIGZpbGVfcHRyLAotICAgICAgICBGWF9EV09SRCYgd2lkdGgsIEZYX0RXT1JEJiBoZWlnaHQsIEZYX0RXT1JEJiBwaXRjaCwgRlhfTFBCWVRFJiBkZXN0X2J1ZiwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgaWYoIXBKYmlnMkNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUl9QQVJBTVM7Ci0gICAgfQotICAgIENDb2RlY19KYmlnMkNvbnRleHQqIG1fcEpiaWcyQ29udGV4dCA9IChDQ29kZWNfSmJpZzJDb250ZXh0KilwSmJpZzJDb250ZXh0OwotICAgIG1fcEpiaWcyQ29udGV4dC0+bV9iRmlsZVJlYWRlciA9IFRSVUU7Ci0gICAgbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UgPSBOVUxMOwotICAgIG1fcEpiaWcyQ29udGV4dC0+bV9zcmNfc2l6ZSA9IChGWF9EV09SRClmaWxlX3B0ci0+R2V0U2l6ZSgpOwotICAgIG1fcEpiaWcyQ29udGV4dC0+bV9zcmNfYnVmID0gRlhfQWxsb2MoRlhfQllURSwgbV9wSmJpZzJDb250ZXh0LT5tX3NyY19zaXplKTsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBpZighZmlsZV9wdHItPlJlYWRCbG9jaygodm9pZCopbV9wSmJpZzJDb250ZXh0LT5tX3NyY19idWYsIDAsIG1fcEpiaWcyQ29udGV4dC0+bV9zcmNfc2l6ZSkpIHsKLSAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgIG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dCA9IENKQmlnMl9Db250ZXh0OjpDcmVhdGVDb250ZXh0KCZtX01vZHVsZSwgTlVMTCwgMCwgbV9wSmJpZzJDb250ZXh0LT5tX3NyY19idWYsIG1fcEpiaWcyQ29udGV4dC0+bV9zcmNfc2l6ZSwgSkJJRzJfRklMRV9TVFJFQU0sICZtX1N5bWJvbERpY3RDYWNoZSwgcFBhdXNlKTsKLSAgICBpZihtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQgPT0gTlVMTCkgewotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgcmV0ID0gbV9wSmJpZzJDb250ZXh0LT5tX3BDb250ZXh0LT5nZXRGaXJzdFBhZ2UoJm1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlLCBwUGF1c2UpOwotICAgIGlmKG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dC0+R2V0UHJvY2Vzc2l2ZVN0YXR1cygpID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsKLSAgICAgICAgd2lkdGggPSAoRlhfRFdPUkQpbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UtPm1fbldpZHRoOwotICAgICAgICBoZWlnaHQgPSAoRlhfRFdPUkQpbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UtPm1fbkhlaWdodDsKLSAgICAgICAgcGl0Y2ggPSAoRlhfRFdPUkQpbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UtPm1fblN0cmlkZTsKLSAgICAgICAgZGVzdF9idWYgPSBtX3BKYmlnMkNvbnRleHQtPm1fZGVzdF9pbWFnZS0+bV9wRGF0YTsKLSAgICAgICAgbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UtPm1fYk5lZWRGcmVlID0gRkFMU0U7Ci0gICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwotICAgIH0KK0ZYQ09ERUNfU1RBVFVTIENDb2RlY19KYmlnMk1vZHVsZTo6U3RhcnREZWNvZGUodm9pZCogcEpiaWcyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1ByaXZhdGVEYXRhKiBwUHJpdmF0ZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtQWNjKiBzcmNfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1N0cmVhbUFjYyogZ2xvYmFsX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIGlmICghcEpiaWcyQ29udGV4dCkgeworICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJfUEFSQU1TOworICB9CisgIEpCaWcyRG9jdW1lbnRDb250ZXh0KiBwSkJpZzJEb2N1bWVudENvbnRleHQgPQorICAgICAgR2V0SkJpZzJEb2N1bWVudENvbnRleHQodGhpcywgcFByaXZhdGVEYXRhKTsKKyAgQ0NvZGVjX0piaWcyQ29udGV4dCogbV9wSmJpZzJDb250ZXh0ID0gKENDb2RlY19KYmlnMkNvbnRleHQqKXBKYmlnMkNvbnRleHQ7CisgIG1fcEpiaWcyQ29udGV4dC0+bV93aWR0aCA9IHdpZHRoOworICBtX3BKYmlnMkNvbnRleHQtPm1faGVpZ2h0ID0gaGVpZ2h0OworICBtX3BKYmlnMkNvbnRleHQtPm1fcFNyY1N0cmVhbSA9IHNyY19zdHJlYW07CisgIG1fcEpiaWcyQ29udGV4dC0+bV9wR2xvYmFsU3RyZWFtID0gZ2xvYmFsX3N0cmVhbTsKKyAgbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfYnVmID0gZGVzdF9idWY7CisgIG1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X3BpdGNoID0gZGVzdF9waXRjaDsKKyAgbV9wSmJpZzJDb250ZXh0LT5tX3BQYXVzZSA9IHBQYXVzZTsKKyAgRlhTWVNfbWVtc2V0KGRlc3RfYnVmLCAwLCBoZWlnaHQgKiBkZXN0X3BpdGNoKTsKKyAgbV9wSmJpZzJDb250ZXh0LT5tX3BDb250ZXh0ID0gQ0pCaWcyX0NvbnRleHQ6OkNyZWF0ZUNvbnRleHQoCisgICAgICBnbG9iYWxfc3RyZWFtLCBzcmNfc3RyZWFtLCBwSkJpZzJEb2N1bWVudENvbnRleHQtPkdldFN5bWJvbERpY3RDYWNoZSgpLAorICAgICAgcFBhdXNlKTsKKyAgaWYgKCFtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQpIHsKKyAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisgIH0KKyAgaW50IHJldCA9IG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dC0+Z2V0Rmlyc3RQYWdlKGRlc3RfYnVmLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9waXRjaCwgcFBhdXNlKTsKKyAgaWYgKG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dC0+R2V0UHJvY2Vzc2luZ1N0YXR1cygpID09CisgICAgICBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIKSB7CiAgICAgQ0pCaWcyX0NvbnRleHQ6OkRlc3Ryb3lDb250ZXh0KG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dCk7CiAgICAgbV9wSmJpZzJDb250ZXh0LT5tX3BDb250ZXh0ID0gTlVMTDsKICAgICBpZiAocmV0ICE9IEpCSUcyX1NVQ0NFU1MpIHsKLSAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7CiAgICAgfQotICAgIHdpZHRoID0gKEZYX0RXT1JEKW1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlLT5tX25XaWR0aDsKLSAgICBoZWlnaHQgPSAoRlhfRFdPUkQpbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UtPm1fbkhlaWdodDsKLSAgICBwaXRjaCA9IChGWF9EV09SRCltX3BKYmlnMkNvbnRleHQtPm1fZGVzdF9pbWFnZS0+bV9uU3RyaWRlOwotICAgIGRlc3RfYnVmID0gbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UtPm1fcERhdGE7Ci0gICAgbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfaW1hZ2UtPm1fYk5lZWRGcmVlID0gRkFMU0U7Ci0gICAgZGVsZXRlIG1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlOwotICAgIEZYX0ZyZWUobV9wSmJpZzJDb250ZXh0LT5tX3NyY19idWYpOworICAgIGludCBkd29yZF9zaXplID0gaGVpZ2h0ICogZGVzdF9waXRjaCAvIDQ7CisgICAgRlhfRFdPUkQqIGR3b3JkX2J1ZiA9IChGWF9EV09SRCopZGVzdF9idWY7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkd29yZF9zaXplOyBpKyspIHsKKyAgICAgIGR3b3JkX2J1ZltpXSA9IH5kd29yZF9idWZbaV07CisgICAgfQogICAgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwotZmFpbGVkOgotICAgIGlmKG1fcEpiaWcyQ29udGV4dC0+bV9zcmNfYnVmKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wSmJpZzJDb250ZXh0LT5tX3NyY19idWYpOwotICAgIH0KLSAgICBtX3BKYmlnMkNvbnRleHQtPm1fc3JjX2J1ZiA9IE5VTEw7CisgIH0KKyAgcmV0dXJuIG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dC0+R2V0UHJvY2Vzc2luZ1N0YXR1cygpOworfQorRlhDT0RFQ19TVEFUVVMgQ0NvZGVjX0piaWcyTW9kdWxlOjpDb250aW51ZURlY29kZSh2b2lkKiBwSmJpZzJDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICBDQ29kZWNfSmJpZzJDb250ZXh0KiBtX3BKYmlnMkNvbnRleHQgPSAoQ0NvZGVjX0piaWcyQ29udGV4dCopcEpiaWcyQ29udGV4dDsKKyAgaW50IHJldCA9IG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dC0+Q29udGludWUocFBhdXNlKTsKKyAgaWYgKG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dC0+R2V0UHJvY2Vzc2luZ1N0YXR1cygpICE9CisgICAgICBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIKSB7CisgICAgcmV0dXJuIG1fcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dC0+R2V0UHJvY2Vzc2luZ1N0YXR1cygpOworICB9CisgIENKQmlnMl9Db250ZXh0OjpEZXN0cm95Q29udGV4dChtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQpOworICBtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQgPSBOVUxMOworICBpZiAocmV0ICE9IEpCSUcyX1NVQ0NFU1MpIHsKICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisgIH0KKyAgaW50IGR3b3JkX3NpemUgPQorICAgICAgbV9wSmJpZzJDb250ZXh0LT5tX2hlaWdodCAqIG1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X3BpdGNoIC8gNDsKKyAgRlhfRFdPUkQqIGR3b3JkX2J1ZiA9IChGWF9EV09SRCopbV9wSmJpZzJDb250ZXh0LT5tX2Rlc3RfYnVmOworICBmb3IgKGludCBpID0gMDsgaSA8IGR3b3JkX3NpemU7IGkrKykgeworICAgIGR3b3JkX2J1ZltpXSA9IH5kd29yZF9idWZbaV07CisgIH0KKyAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7CiB9Ci1GWENPREVDX1NUQVRVUyBDQ29kZWNfSmJpZzJNb2R1bGU6OkNvbnRpbnVlRGVjb2RlKHZvaWQqIHBKYmlnMkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIENDb2RlY19KYmlnMkNvbnRleHQqIG1fcEpiaWcyQ29udGV4dCA9IChDQ29kZWNfSmJpZzJDb250ZXh0KilwSmJpZzJDb250ZXh0OwotICAgIGludCByZXQgPSBtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQtPkNvbnRpbnVlKHBQYXVzZSk7Ci0gICAgaWYobV9wSmJpZzJDb250ZXh0LT5tX3BDb250ZXh0LT5HZXRQcm9jZXNzaXZlU3RhdHVzKCkgPT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSCkgewotICAgICAgICBpZihtX3BKYmlnMkNvbnRleHQtPm1fYkZpbGVSZWFkZXIpIHsKLSAgICAgICAgICAgIENKQmlnMl9Db250ZXh0OjpEZXN0cm95Q29udGV4dChtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQpOwotICAgICAgICAgICAgbV9wSmJpZzJDb250ZXh0LT5tX3BDb250ZXh0ID0gTlVMTDsKLSAgICAgICAgICAgIGlmIChyZXQgIT0gSkJJRzJfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgIGlmKG1fcEpiaWcyQ29udGV4dC0+bV9zcmNfYnVmKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0ZyZWUobV9wSmJpZzJDb250ZXh0LT5tX3NyY19idWYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX3BKYmlnMkNvbnRleHQtPm1fc3JjX2J1ZiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVsZXRlIG1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2ltYWdlOwotICAgICAgICAgICAgRlhfRnJlZShtX3BKYmlnMkNvbnRleHQtPm1fc3JjX2J1Zik7Ci0gICAgICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENKQmlnMl9Db250ZXh0OjpEZXN0cm95Q29udGV4dChtX3BKYmlnMkNvbnRleHQtPm1fcENvbnRleHQpOwotICAgICAgICAgICAgbV9wSmJpZzJDb250ZXh0LT5tX3BDb250ZXh0ID0gTlVMTDsKLSAgICAgICAgICAgIGlmIChyZXQgIT0gSkJJRzJfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBkd29yZF9zaXplID0gbV9wSmJpZzJDb250ZXh0LT5tX2hlaWdodCAqIG1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X3BpdGNoIC8gNDsKLSAgICAgICAgICAgIEZYX0RXT1JEKiBkd29yZF9idWYgPSAoRlhfRFdPUkQqKW1fcEpiaWcyQ29udGV4dC0+bV9kZXN0X2J1ZjsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZHdvcmRfc2l6ZTsgaSArKykgewotICAgICAgICAgICAgICAgIGR3b3JkX2J1ZltpXSA9IH5kd29yZF9idWZbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbV9wSmJpZzJDb250ZXh0LT5tX3BDb250ZXh0LT5HZXRQcm9jZXNzaXZlU3RhdHVzKCk7Ci19Ci0KLQotCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2piaWdfZW5jLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfamJpZ19lbmMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTk4MmU2Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfamJpZ19lbmMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIgotSUNvZGVjX0piaWcyRW5jb2RlciogQ0NvZGVjX01vZHVsZU1ncjo6Q3JlYXRlSmJpZzJFbmNvZGVyKCkKLXsKLSAgICByZXR1cm4gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanBlZy5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pwZWcuY3BwCmluZGV4IDNlZjE4N2UuLjRmMDQ5NDYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanBlZy5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qcGVnLmNwcApAQCAtMSw2NzQgKzEsNjkyIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZGliLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vc3JjL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCIKKyNpbmNsdWRlIDxzZXRqbXAuaD4KKwogI2luY2x1ZGUgImNvZGVjX2ludC5oIgotZXh0ZXJuICJDIiB7Ci0gICAgc3RhdGljIHZvaWQgX0pwZWdTY2FuU09JKGNvbnN0IEZYX0JZVEUqJiBzcmNfYnVmLCBGWF9EV09SRCYgc3JjX3NpemUpCi0gICAgewotICAgICAgICBpZiAoc3JjX3NpemUgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIEZYX0RXT1JEIG9mZnNldCA9IDA7Ci0gICAgICAgIHdoaWxlIChvZmZzZXQgPCBzcmNfc2l6ZSAtIDEpIHsKLSAgICAgICAgICAgIGlmIChzcmNfYnVmW29mZnNldF0gPT0gMHhmZiAmJiBzcmNfYnVmW29mZnNldCArIDFdID09IDB4ZDgpIHsKLSAgICAgICAgICAgICAgICBzcmNfYnVmICs9IG9mZnNldDsKLSAgICAgICAgICAgICAgICBzcmNfc2l6ZSAtPSBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2Zmc2V0ICsrOwotICAgICAgICB9Ci0gICAgfQotfTsKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zYWZlX3R5cGVzLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZGliLmgiCisKIGV4dGVybiAiQyIgewogI3VuZGVmIEZBUgotI2luY2x1ZGUgIi4uLy4uL2Z4X2pwZWdsaWIuaCIKKyNpZiBkZWZpbmVkKFVTRV9TWVNURU1fTElCSlBFRykKKyNpbmNsdWRlIDxqcGVnbGliLmg+CisjZWxpZiBkZWZpbmVkKFVTRV9MSUJKUEVHX1RVUkJPKQorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xpYmpwZWdfdHVyYm8vanBlZ2xpYi5oIgorI2Vsc2UKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9saWJqcGVnL2pwZWdsaWIuaCIKKyNlbmRpZgogfQotZXh0ZXJuICJDIiB7Ci0gICAgc3RhdGljIHZvaWQgX3NyY19kb19ub3RoaW5nKHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBjaW5mbykge30KLX07Ci1leHRlcm4gIkMiIHsKLSAgICBzdGF0aWMgdm9pZCBfZXJyb3JfZmF0YWwoal9jb21tb25fcHRyIGNpbmZvKQotICAgIHsKLSAgICAgICAgbG9uZ2ptcCgqKGptcF9idWYqKWNpbmZvLT5jbGllbnRfZGF0YSwgLTEpOwotICAgIH0KLX07Ci1leHRlcm4gIkMiIHsKLSAgICBzdGF0aWMgdm9pZCBfc3JjX3NraXBfZGF0YShzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCogY2luZm8sIGxvbmcgbnVtKQotICAgIHsKLSAgICAgICAgaWYgKG51bSA+IChsb25nKWNpbmZvLT5zcmMtPmJ5dGVzX2luX2J1ZmZlcikgewotICAgICAgICAgICAgX2Vycm9yX2ZhdGFsKChqX2NvbW1vbl9wdHIpY2luZm8pOwotICAgICAgICB9Ci0gICAgICAgIGNpbmZvLT5zcmMtPm5leHRfaW5wdXRfYnl0ZSArPSBudW07Ci0gICAgICAgIGNpbmZvLT5zcmMtPmJ5dGVzX2luX2J1ZmZlciAtPSBudW07Ci0gICAgfQotfTsKLWV4dGVybiAiQyIgewotICAgIHN0YXRpYyBib29sZWFuIF9zcmNfZmlsbF9idWZmZXIoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX07Ci1leHRlcm4gIkMiIHsKLSAgICBzdGF0aWMgYm9vbGVhbiBfc3JjX3Jlc3luYyhqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgZGVzaXJlZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX07Ci1leHRlcm4gIkMiIHsKLSAgICBzdGF0aWMgdm9pZCBfZXJyb3JfZG9fbm90aGluZyhqX2NvbW1vbl9wdHIgY2luZm8pIHt9Ci19OwotZXh0ZXJuICJDIiB7Ci0gICAgc3RhdGljIHZvaWQgX2Vycm9yX2RvX25vdGhpbmcxKGpfY29tbW9uX3B0ciBjaW5mbywgaW50KSB7fQotfTsKLWV4dGVybiAiQyIgewotICAgIHN0YXRpYyB2b2lkIF9lcnJvcl9kb19ub3RoaW5nMihqX2NvbW1vbl9wdHIgY2luZm8sIGNoYXIqKSB7fQotfTsKLSNkZWZpbmUgSlBFR19NQVJLRVJfRVhJRgkJKEpQRUdfQVBQMCArIDEpCi0jZGVmaW5lCUpQRUdfTUFSS0VSX0lDQwkJCShKUEVHX0FQUDAgKyAyKQotI2RlZmluZQlKUEVHX01BUktFUl9BVVRIT1JUSU1FCShKUEVHX0FQUDAgKyAzKQotI2RlZmluZQlKUEVHX01BUktFUl9NQVhTSVpFCTB4RkZGRgotI2RlZmluZQlKUEVHX09WRVJIRUFEX0xFTgkxNAotc3RhdGljCUZYX0JPT0wgX0pwZWdFbWJlZEljY1Byb2ZpbGUoal9jb21wcmVzc19wdHIgY2luZm8sIEZYX0xQQ0JZVEUgaWNjX2J1Zl9wdHIsIEZYX0RXT1JEIGljY19sZW5ndGgpCi17Ci0gICAgaWYoaWNjX2J1Zl9wdHIgPT0gTlVMTCB8fCBpY2NfbGVuZ3RoID09IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9EV09SRCBpY2Nfc2VnbWVudF9zaXplID0gKEpQRUdfTUFSS0VSX01BWFNJWkUgLSAyIC0gSlBFR19PVkVSSEVBRF9MRU4pOwotICAgIEZYX0RXT1JEIGljY19zZWdtZW50X251bSA9IChpY2NfbGVuZ3RoIC8gaWNjX3NlZ21lbnRfc2l6ZSkgKyAxOwotICAgIGlmIChpY2Nfc2VnbWVudF9udW0gPiAyNTUpCXsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9EV09SRCBpY2NfZGF0YV9sZW5ndGggPSBKUEVHX09WRVJIRUFEX0xFTiArIChpY2Nfc2VnbWVudF9udW0gPiAxID8gaWNjX3NlZ21lbnRfc2l6ZSA6IGljY19sZW5ndGgpOwotICAgIEZYX0xQQllURSBpY2NfZGF0YSA9IEZYX0FsbG9jKEZYX0JZVEUsIGljY19kYXRhX2xlbmd0aCk7Ci0gICAgRlhTWVNfbWVtY3B5MzIoaWNjX2RhdGEsICJceDQ5XHg0M1x4NDNceDVmXHg1MFx4NTJceDRmXHg0Nlx4NDlceDRjXHg0NVx4MDAiLCAxMik7Ci0gICAgaWNjX2RhdGFbMTNdID0gKEZYX0JZVEUpaWNjX3NlZ21lbnRfbnVtOwotICAgIGZvciAoRlhfQllURSBpID0gMDsgaSA8IChpY2Nfc2VnbWVudF9udW0gLSAxKTsgaSsrKSB7Ci0gICAgICAgIGljY19kYXRhWzEyXSA9IGkgKyAxOwotICAgICAgICBGWFNZU19tZW1jcHkzMihpY2NfZGF0YSArIEpQRUdfT1ZFUkhFQURfTEVOLCBpY2NfYnVmX3B0ciArIGkgKiBpY2Nfc2VnbWVudF9zaXplLCBpY2Nfc2VnbWVudF9zaXplKTsKLSAgICAgICAganBlZ193cml0ZV9tYXJrZXIoY2luZm8sIEpQRUdfTUFSS0VSX0lDQywgaWNjX2RhdGEsIGljY19kYXRhX2xlbmd0aCk7Ci0gICAgfQotICAgIGljY19kYXRhWzEyXSA9IChGWF9CWVRFKWljY19zZWdtZW50X251bTsKLSAgICBGWF9EV09SRCBpY2Nfc2l6ZSA9IChpY2Nfc2VnbWVudF9udW0gLSAxKSAqIGljY19zZWdtZW50X3NpemU7Ci0gICAgRlhTWVNfbWVtY3B5MzIoaWNjX2RhdGEgKyBKUEVHX09WRVJIRUFEX0xFTiwgaWNjX2J1Zl9wdHIgKyBpY2Nfc2l6ZSwgaWNjX2xlbmd0aCAtIGljY19zaXplKTsKLSAgICBqcGVnX3dyaXRlX21hcmtlcihjaW5mbywgSlBFR19NQVJLRVJfSUNDLCBpY2NfZGF0YSwgSlBFR19PVkVSSEVBRF9MRU4gKyBpY2NfbGVuZ3RoIC0gaWNjX3NpemUpOwotICAgIEZYX0ZyZWUoaWNjX2RhdGEpOwotICAgIHJldHVybiBUUlVFOwotfQotZXh0ZXJuICJDIiB7Ci0gICAgc3RhdGljIHZvaWQgX2Rlc3RfZG9fbm90aGluZyhqX2NvbXByZXNzX3B0ciBjaW5mbykge30KLX07Ci1leHRlcm4gIkMiIHsKLSAgICBzdGF0aWMgYm9vbGVhbiBfZGVzdF9lbXB0eShqX2NvbXByZXNzX3B0ciBjaW5mbykKLSAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci19OwotI2RlZmluZQlKUEVHX0JMT0NLX1NJWkUJMTA0ODU3Ngotc3RhdGljIHZvaWQgX0pwZWdFbmNvZGUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfTFBCWVRFJiBkZXN0X2J1ZiwgRlhfU1RSU0laRSYgZGVzdF9zaXplLCBpbnQgcXVhbGl0eSwgRlhfTFBDQllURSBpY2NfYnVmLCBGWF9EV09SRCBpY2NfbGVuZ3RoKQotewotICAgIHN0cnVjdCBqcGVnX2Vycm9yX21nciBqZXJyOwotICAgIGplcnIuZXJyb3JfZXhpdCA9IF9lcnJvcl9kb19ub3RoaW5nOwotICAgIGplcnIuZW1pdF9tZXNzYWdlID0gX2Vycm9yX2RvX25vdGhpbmcxOwotICAgIGplcnIub3V0cHV0X21lc3NhZ2UgPSBfZXJyb3JfZG9fbm90aGluZzsKLSAgICBqZXJyLmZvcm1hdF9tZXNzYWdlID0gX2Vycm9yX2RvX25vdGhpbmcyOwotICAgIGplcnIucmVzZXRfZXJyb3JfbWdyID0gX2Vycm9yX2RvX25vdGhpbmc7CiAKLSAgICBzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgY2luZm87Ci0gICAgbWVtc2V0KCZjaW5mbywgMCwgc2l6ZW9mKGNpbmZvKSk7Ci0gICAgY2luZm8uZXJyID0gJmplcnI7Ci0gICAganBlZ19jcmVhdGVfY29tcHJlc3MoJmNpbmZvKTsKLSAgICBpbnQgQnBwID0gcFNvdXJjZS0+R2V0QlBQKCkgLyA4OwotICAgIEZYX0RXT1JEIG5Db21wb25lbnRzID0gQnBwID49IDMgPyAocFNvdXJjZS0+SXNDbXlrSW1hZ2UoKSA/IDQgOiAzKSA6IDE7Ci0gICAgRlhfRFdPUkQgcGl0Y2ggPSBwU291cmNlLT5HZXRQaXRjaCgpOwotICAgIEZYX0RXT1JEIHdpZHRoID0gcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlhfRFdPUkQ+KHBTb3VyY2UtPkdldFdpZHRoKCkpOwotICAgIEZYX0RXT1JEIGhlaWdodCA9IHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PEZYX0RXT1JEPihwU291cmNlLT5HZXRIZWlnaHQoKSk7Ci0gICAgRlhfU0FGRV9EV09SRCBzYWZlX2J1Zl9sZW4gPSB3aWR0aDsKLSAgICBzYWZlX2J1Zl9sZW4gKj0gaGVpZ2h0OwotICAgIHNhZmVfYnVmX2xlbiAqPSBuQ29tcG9uZW50czsKLSAgICBzYWZlX2J1Zl9sZW4gKz0gMTAyNDsKLSAgICBpZiAoaWNjX2xlbmd0aCkgewotICAgICAgICBzYWZlX2J1Zl9sZW4gKz0gMjU1ICogMTg7Ci0gICAgICAgIHNhZmVfYnVmX2xlbiArPSBpY2NfbGVuZ3RoOworZXh0ZXJuICJDIiB7CitzdGF0aWMgdm9pZCBfSnBlZ1NjYW5TT0koY29uc3QgdWludDhfdComIHNyY19idWYsIEZYX0RXT1JEJiBzcmNfc2l6ZSkgeworICBpZiAoc3JjX3NpemUgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBGWF9EV09SRCBvZmZzZXQgPSAwOworICB3aGlsZSAob2Zmc2V0IDwgc3JjX3NpemUgLSAxKSB7CisgICAgaWYgKHNyY19idWZbb2Zmc2V0XSA9PSAweGZmICYmIHNyY19idWZbb2Zmc2V0ICsgMV0gPT0gMHhkOCkgeworICAgICAgc3JjX2J1ZiArPSBvZmZzZXQ7CisgICAgICBzcmNfc2l6ZSAtPSBvZmZzZXQ7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIEZYX0RXT1JEIGRlc3RfYnVmX2xlbmd0aCA9IDA7Ci0gICAgaWYgKCFzYWZlX2J1Zl9sZW4uSXNWYWxpZCgpKSB7Ci0gICAgICAgIGRlc3RfYnVmID0gbnVsbHB0cjsKLSAgICB9IGVsc2UgewotICAgICAgICBkZXN0X2J1Zl9sZW5ndGggPSBzYWZlX2J1Zl9sZW4uVmFsdWVPckRpZSgpOwotICAgICAgICBkZXN0X2J1ZiA9IEZYX1RyeUFsbG9jKEZYX0JZVEUsIGRlc3RfYnVmX2xlbmd0aCk7Ci0gICAgICAgIGNvbnN0IGludCBNSU5fVFJZX0JVRl9MRU4gPSAxMDI0OwotICAgICAgICB3aGlsZSAoIWRlc3RfYnVmICYmIGRlc3RfYnVmX2xlbmd0aCA+IE1JTl9UUllfQlVGX0xFTikgewotICAgICAgICAgICAgZGVzdF9idWZfbGVuZ3RoID4+PSAxOwotICAgICAgICAgICAgZGVzdF9idWYgPSBGWF9UcnlBbGxvYyhGWF9CWVRFLCBkZXN0X2J1Zl9sZW5ndGgpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghZGVzdF9idWYpIHsKLSAgICAgICAgRlhfT3V0T2ZNZW1vcnlUZXJtaW5hdGUoKTsgCi0gICAgfQotICAgIHN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21nciBkZXN0OwotICAgIGRlc3QuaW5pdF9kZXN0aW5hdGlvbiA9IF9kZXN0X2RvX25vdGhpbmc7Ci0gICAgZGVzdC50ZXJtX2Rlc3RpbmF0aW9uID0gX2Rlc3RfZG9fbm90aGluZzsKLSAgICBkZXN0LmVtcHR5X291dHB1dF9idWZmZXIgPSBfZGVzdF9lbXB0eTsKLSAgICBkZXN0Lm5leHRfb3V0cHV0X2J5dGUgPSBkZXN0X2J1ZjsKLSAgICBkZXN0LmZyZWVfaW5fYnVmZmVyID0gZGVzdF9idWZfbGVuZ3RoOwotICAgIGNpbmZvLmRlc3QgPSAmZGVzdDsKLSAgICBjaW5mby5pbWFnZV93aWR0aCA9IHdpZHRoOwotICAgIGNpbmZvLmltYWdlX2hlaWdodCA9IGhlaWdodDsKLSAgICBjaW5mby5pbnB1dF9jb21wb25lbnRzID0gbkNvbXBvbmVudHM7Ci0gICAgaWYgKG5Db21wb25lbnRzID09IDEpIHsKLSAgICAgICAgY2luZm8uaW5fY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOwotICAgIH0gZWxzZSBpZiAobkNvbXBvbmVudHMgPT0gMykgewotICAgICAgICBjaW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19SR0I7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY2luZm8uaW5fY29sb3Jfc3BhY2UgPSBKQ1NfQ01ZSzsKLSAgICB9Ci0gICAgRlhfTFBCWVRFIGxpbmVfYnVmID0gTlVMTDsKLSAgICBpZiAobkNvbXBvbmVudHMgPiAxKSB7Ci0gICAgICAgIGxpbmVfYnVmID0gRlhfQWxsb2MyRChGWF9CWVRFLCB3aWR0aCwgbkNvbXBvbmVudHMpOwotICAgIH0KLSAgICBqcGVnX3NldF9kZWZhdWx0cygmY2luZm8pOwotICAgIGlmKHF1YWxpdHkgIT0gNzUpIHsKLSAgICAgICAganBlZ19zZXRfcXVhbGl0eSgmY2luZm8sIHF1YWxpdHksIFRSVUUpOwotICAgIH0KLSAgICBqcGVnX3N0YXJ0X2NvbXByZXNzKCZjaW5mbywgVFJVRSk7Ci0gICAgX0pwZWdFbWJlZEljY1Byb2ZpbGUoJmNpbmZvLCBpY2NfYnVmLCBpY2NfbGVuZ3RoKTsKLSAgICBKU0FNUFJPVyByb3dfcG9pbnRlclsxXTsKLSAgICBKRElNRU5TSU9OIHJvdzsKLSAgICB3aGlsZSAoY2luZm8ubmV4dF9zY2FubGluZSA8IGNpbmZvLmltYWdlX2hlaWdodCkgewotICAgICAgICBGWF9MUENCWVRFIHNyY19zY2FuID0gcFNvdXJjZS0+R2V0U2NhbmxpbmUoY2luZm8ubmV4dF9zY2FubGluZSk7Ci0gICAgICAgIGlmIChuQ29tcG9uZW50cyA+IDEpIHsKLSAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X3NjYW4gPSBsaW5lX2J1ZjsKLSAgICAgICAgICAgIGlmIChuQ29tcG9uZW50cyA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aWR0aDsgaSArKykgewotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBzcmNfc2NhblsyXTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gc3JjX3NjYW5bMV07Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19zY2FuWzBdOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gQnBwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXRjaDsgaSArKykgewotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSB+KnNyY19zY2FuKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcm93X3BvaW50ZXJbMF0gPSBsaW5lX2J1ZjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJvd19wb2ludGVyWzBdID0gKEZYX0xQQllURSlzcmNfc2NhbjsKLSAgICAgICAgfQotICAgICAgICByb3cgPSBjaW5mby5uZXh0X3NjYW5saW5lOwotICAgICAgICBqcGVnX3dyaXRlX3NjYW5saW5lcygmY2luZm8sIHJvd19wb2ludGVyLCAxKTsKLSAgICAgICAgaWYgKGNpbmZvLm5leHRfc2NhbmxpbmUgPT0gcm93KSB7Ci0gICAgICAgICAgICBkZXN0X2J1ZiA9IEZYX1JlYWxsb2MoRlhfQllURSwgZGVzdF9idWYsIGRlc3RfYnVmX2xlbmd0aCArIEpQRUdfQkxPQ0tfU0laRSk7Ci0gICAgICAgICAgICBkZXN0Lm5leHRfb3V0cHV0X2J5dGUgPSBkZXN0X2J1ZiArIGRlc3RfYnVmX2xlbmd0aCAtIGRlc3QuZnJlZV9pbl9idWZmZXI7Ci0gICAgICAgICAgICBkZXN0X2J1Zl9sZW5ndGggKz0gSlBFR19CTE9DS19TSVpFOwotICAgICAgICAgICAgZGVzdC5mcmVlX2luX2J1ZmZlciArPSBKUEVHX0JMT0NLX1NJWkU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAganBlZ19maW5pc2hfY29tcHJlc3MoJmNpbmZvKTsKLSAgICBqcGVnX2Rlc3Ryb3lfY29tcHJlc3MoJmNpbmZvKTsKLSAgICBpZiAobGluZV9idWYpIHsKLSAgICAgICAgRlhfRnJlZShsaW5lX2J1Zik7Ci0gICAgfQotICAgIGRlc3Rfc2l6ZSA9IGRlc3RfYnVmX2xlbmd0aCAtIChGWF9TVFJTSVpFKWRlc3QuZnJlZV9pbl9idWZmZXI7CisgICAgb2Zmc2V0Kys7CisgIH0KIH0KLXN0YXRpYyBGWF9CT09MIF9KcGVnTG9hZEluZm8oRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50JiB3aWR0aCwgaW50JiBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbnVtX2NvbXBvbmVudHMsIGludCYgYml0c19wZXJfY29tcG9uZW50cywgRlhfQk9PTCYgY29sb3JfdHJhbnNmb3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUEJZVEUqIGljY19idWZfcHRyLCBGWF9EV09SRCogaWNjX2xlbmd0aCkKLXsKLSAgICBfSnBlZ1NjYW5TT0koc3JjX2J1Ziwgc3JjX3NpemUpOwotICAgIHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0IGNpbmZvOwotICAgIHN0cnVjdCBqcGVnX2Vycm9yX21nciBqZXJyOwotICAgIGplcnIuZXJyb3JfZXhpdCA9IF9lcnJvcl9mYXRhbDsKLSAgICBqZXJyLmVtaXRfbWVzc2FnZSA9IF9lcnJvcl9kb19ub3RoaW5nMTsKLSAgICBqZXJyLm91dHB1dF9tZXNzYWdlID0gX2Vycm9yX2RvX25vdGhpbmc7Ci0gICAgamVyci5mb3JtYXRfbWVzc2FnZSA9IF9lcnJvcl9kb19ub3RoaW5nMjsKLSAgICBqZXJyLnJlc2V0X2Vycm9yX21nciA9IF9lcnJvcl9kb19ub3RoaW5nOwotICAgIGplcnIudHJhY2VfbGV2ZWwgPSAwOwotICAgIGNpbmZvLmVyciA9ICZqZXJyOwotICAgIGptcF9idWYgbWFyazsKLSAgICBjaW5mby5jbGllbnRfZGF0YSA9ICZtYXJrOwotICAgIGlmIChzZXRqbXAobWFyaykgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKCZjaW5mbyk7Ci0gICAgc3RydWN0IGpwZWdfc291cmNlX21nciBzcmM7Ci0gICAgc3JjLmluaXRfc291cmNlID0gX3NyY19kb19ub3RoaW5nOwotICAgIHNyYy50ZXJtX3NvdXJjZSA9IF9zcmNfZG9fbm90aGluZzsKLSAgICBzcmMuc2tpcF9pbnB1dF9kYXRhID0gX3NyY19za2lwX2RhdGE7Ci0gICAgc3JjLmZpbGxfaW5wdXRfYnVmZmVyID0gX3NyY19maWxsX2J1ZmZlcjsKLSAgICBzcmMucmVzeW5jX3RvX3Jlc3RhcnQgPSBfc3JjX3Jlc3luYzsKLSAgICBzcmMuYnl0ZXNfaW5fYnVmZmVyID0gc3JjX3NpemU7Ci0gICAgc3JjLm5leHRfaW5wdXRfYnl0ZSA9IHNyY19idWY7Ci0gICAgY2luZm8uc3JjID0gJnNyYzsKLSAgICBpZiAoc2V0am1wKG1hcmspID09IC0xKSB7Ci0gICAgICAgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZjaW5mbyk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYoaWNjX2J1Zl9wdHIgJiYgaWNjX2xlbmd0aCkgewotICAgICAgICBqcGVnX3NhdmVfbWFya2VycygmY2luZm8sIEpQRUdfTUFSS0VSX0lDQywgSlBFR19NQVJLRVJfTUFYU0laRSk7Ci0gICAgfQotICAgIGludCByZXQgPSBqcGVnX3JlYWRfaGVhZGVyKCZjaW5mbywgVFJVRSk7Ci0gICAgaWYgKHJldCAhPSBKUEVHX0hFQURFUl9PSykgewotICAgICAgICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHdpZHRoID0gY2luZm8uaW1hZ2Vfd2lkdGg7Ci0gICAgaGVpZ2h0ID0gY2luZm8uaW1hZ2VfaGVpZ2h0OwotICAgIG51bV9jb21wb25lbnRzID0gY2luZm8ubnVtX2NvbXBvbmVudHM7Ci0gICAgY29sb3JfdHJhbnNmb3JtID0gY2luZm8uanBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IgfHwgY2luZm8uanBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNDSzsKLSAgICBiaXRzX3Blcl9jb21wb25lbnRzID0gY2luZm8uZGF0YV9wcmVjaXNpb247Ci0gICAgaWYoaWNjX2J1Zl9wdHIgIT0gTlVMTCkgewotICAgICAgICAqaWNjX2J1Zl9wdHIgPSBOVUxMOwotICAgIH0KLSAgICBpZihpY2NfbGVuZ3RoICE9IE5VTEwpIHsKLSAgICAgICAgKmljY19sZW5ndGggPSAwOwotICAgIH0KLSAgICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOwotICAgIHJldHVybiBUUlVFOwotfQotY2xhc3MgQ0NvZGVjX0pwZWdEZWNvZGVyIDogcHVibGljIENDb2RlY19TY2FubGluZURlY29kZXIKLXsKLXB1YmxpYzoKLSAgICBDQ29kZWNfSnBlZ0RlY29kZXIoKTsKLSAgICB+Q0NvZGVjX0pwZWdEZWNvZGVyKCk7Ci0gICAgRlhfQk9PTAkJCQlDcmVhdGUoRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbkNvbXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgQ29sb3JUcmFuc2Zvcm0sIElGWF9KcGVnUHJvdmlkZXIqIHBKUCk7Ci0gICAgdmlydHVhbCB2b2lkCQlEZXN0cm95KCkKLSAgICB7Ci0gICAgICAgIGRlbGV0ZSB0aGlzOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQJCXZfRG93blNjYWxlKGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJdl9SZXdpbmQoKTsKLSAgICB2aXJ0dWFsIEZYX0xQQllURQl2X0dldE5leHRMaW5lKCk7Ci0gICAgdmlydHVhbCBGWF9EV09SRAlHZXRTcmNPZmZzZXQoKTsKLSAgICBqbXBfYnVmCQltX0ptcEJ1ZjsKLSAgICBzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCBjaW5mbzsKLSAgICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgamVycjsKLSAgICBzdHJ1Y3QganBlZ19zb3VyY2VfbWdyIHNyYzsKLSAgICBGWF9MUENCWVRFCW1fU3JjQnVmOwotICAgIEZYX0RXT1JECW1fU3JjU2l6ZTsKLSAgICBGWF9MUEJZVEUJbV9wU2NhbmxpbmVCdWY7Ci0gICAgRlhfQk9PTAkJSW5pdERlY29kZSgpOwotICAgIEZYX0JPT0wJCW1fYkluaXRlZCwgbV9iU3RhcnRlZCwgbV9iSnBlZ1RyYW5zZm9ybTsKLXByb3RlY3RlZDoKLSAgICBJRlhfSnBlZ1Byb3ZpZGVyKgltX3BFeHRQcm92aWRlcjsKLSAgICB2b2lkKgkJCQltX3BFeHRDb250ZXh0OwotICAgIEZYX0RXT1JECQkJbV9uRGVmYXVsdFNjYWxlRGVub207CiB9OwotQ0NvZGVjX0pwZWdEZWNvZGVyOjpDQ29kZWNfSnBlZ0RlY29kZXIoKQotewotICAgIG1fcFNjYW5saW5lQnVmID0gTlVMTDsKLSAgICBtX0Rvd25TY2FsZSA9IDE7Ci0gICAgbV9iU3RhcnRlZCA9IEZBTFNFOwotICAgIG1fYkluaXRlZCA9IEZBTFNFOwotICAgIG1fcEV4dFByb3ZpZGVyID0gTlVMTDsKLSAgICBtX3BFeHRDb250ZXh0ID0gTlVMTDsKLSAgICBGWFNZU19tZW1zZXQzMigmY2luZm8sIDAsIHNpemVvZihjaW5mbykpOwotICAgIEZYU1lTX21lbXNldDMyKCZqZXJyLCAwLCBzaXplb2YoamVycikpOwotICAgIEZYU1lTX21lbXNldDMyKCZzcmMsIDAsIHNpemVvZihzcmMpKTsKLSAgICBtX25EZWZhdWx0U2NhbGVEZW5vbSA9IDE7CitleHRlcm4gIkMiIHsKK3N0YXRpYyB2b2lkIF9zcmNfZG9fbm90aGluZyhzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCogY2luZm8pIHt9Cit9OworZXh0ZXJuICJDIiB7CitzdGF0aWMgdm9pZCBfZXJyb3JfZmF0YWwoal9jb21tb25fcHRyIGNpbmZvKSB7CisgIGxvbmdqbXAoKihqbXBfYnVmKiljaW5mby0+Y2xpZW50X2RhdGEsIC0xKTsKIH0KLUNDb2RlY19KcGVnRGVjb2Rlcjo6fkNDb2RlY19KcGVnRGVjb2RlcigpCi17Ci0gICAgaWYgKG1fcEV4dFByb3ZpZGVyKSB7Ci0gICAgICAgIG1fcEV4dFByb3ZpZGVyLT5EZXN0cm95RGVjb2RlcihtX3BFeHRDb250ZXh0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobV9wU2NhbmxpbmVCdWYpIHsKLSAgICAgICAgRlhfRnJlZShtX3BTY2FubGluZUJ1Zik7Ci0gICAgfQotICAgIGlmIChtX2JJbml0ZWQpIHsKLSAgICAgICAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKLSAgICB9Cit9OworZXh0ZXJuICJDIiB7CitzdGF0aWMgdm9pZCBfc3JjX3NraXBfZGF0YShzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCogY2luZm8sIGxvbmcgbnVtKSB7CisgIGlmIChudW0gPiAobG9uZyljaW5mby0+c3JjLT5ieXRlc19pbl9idWZmZXIpIHsKKyAgICBfZXJyb3JfZmF0YWwoKGpfY29tbW9uX3B0ciljaW5mbyk7CisgIH0KKyAgY2luZm8tPnNyYy0+bmV4dF9pbnB1dF9ieXRlICs9IG51bTsKKyAgY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyIC09IG51bTsKIH0KLUZYX0JPT0wgQ0NvZGVjX0pwZWdEZWNvZGVyOjpJbml0RGVjb2RlKCkKLXsKLSAgICBjaW5mby5lcnIgPSAmamVycjsKLSAgICBjaW5mby5jbGllbnRfZGF0YSA9ICZtX0ptcEJ1ZjsKLSAgICBpZiAoc2V0am1wKG1fSm1wQnVmKSA9PSAtMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoJmNpbmZvKTsKLSAgICBtX2JJbml0ZWQgPSBUUlVFOwotICAgIGNpbmZvLnNyYyA9ICZzcmM7Ci0gICAgc3JjLmJ5dGVzX2luX2J1ZmZlciA9IG1fU3JjU2l6ZTsKLSAgICBzcmMubmV4dF9pbnB1dF9ieXRlID0gbV9TcmNCdWY7Ci0gICAgaWYgKHNldGptcChtX0ptcEJ1ZikgPT0gLTEpIHsKLSAgICAgICAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKLSAgICAgICAgbV9iSW5pdGVkID0gRkFMU0U7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgY2luZm8uaW1hZ2Vfd2lkdGggPSBtX09yaWdXaWR0aDsKLSAgICBjaW5mby5pbWFnZV9oZWlnaHQgPSBtX09yaWdIZWlnaHQ7Ci0gICAgaW50IHJldCA9IGpwZWdfcmVhZF9oZWFkZXIoJmNpbmZvLCBUUlVFKTsKLSAgICBpZiAocmV0ICE9IEpQRUdfSEVBREVSX09LKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKGNpbmZvLnNhd19BZG9iZV9tYXJrZXIpIHsKLSAgICAgICAgbV9iSnBlZ1RyYW5zZm9ybSA9IFRSVUU7Ci0gICAgfQotICAgIGlmIChjaW5mby5udW1fY29tcG9uZW50cyA9PSAzICYmICFtX2JKcGVnVHJhbnNmb3JtKSB7Ci0gICAgICAgIGNpbmZvLm91dF9jb2xvcl9zcGFjZSA9IGNpbmZvLmpwZWdfY29sb3Jfc3BhY2U7Ci0gICAgfQotICAgIG1fT3JpZ1dpZHRoID0gY2luZm8uaW1hZ2Vfd2lkdGg7Ci0gICAgbV9PcmlnSGVpZ2h0ID0gY2luZm8uaW1hZ2VfaGVpZ2h0OwotICAgIG1fT3V0cHV0V2lkdGggPSBtX09yaWdXaWR0aDsKLSAgICBtX091dHB1dEhlaWdodCA9IG1fT3JpZ0hlaWdodDsKLSAgICBtX25EZWZhdWx0U2NhbGVEZW5vbSA9IGNpbmZvLnNjYWxlX2Rlbm9tOwotICAgIHJldHVybiBUUlVFOworfTsKK2V4dGVybiAiQyIgeworc3RhdGljIGJvb2xlYW4gX3NyY19maWxsX2J1ZmZlcihqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSB7CisgIHJldHVybiAwOwogfQotRlhfQk9PTCBDQ29kZWNfSnBlZ0RlY29kZXI6OkNyZWF0ZShGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29tcHMsIEZYX0JPT0wgQ29sb3JUcmFuc2Zvcm0sIElGWF9KcGVnUHJvdmlkZXIqIHBKUCkKLXsKLSAgICBpZiAocEpQKSB7Ci0gICAgICAgIG1fcEV4dFByb3ZpZGVyID0gcEpQOwotICAgICAgICBtX3BFeHRDb250ZXh0ID0gbV9wRXh0UHJvdmlkZXItPkNyZWF0ZURlY29kZXIoc3JjX2J1Ziwgc3JjX3NpemUsIHdpZHRoLCBoZWlnaHQsIG5Db21wcywgQ29sb3JUcmFuc2Zvcm0pOwotICAgICAgICByZXR1cm4gbV9wRXh0Q29udGV4dCAhPSBOVUxMOwotICAgIH0KLSAgICBfSnBlZ1NjYW5TT0koc3JjX2J1Ziwgc3JjX3NpemUpOwotICAgIG1fU3JjQnVmID0gc3JjX2J1ZjsKLSAgICBtX1NyY1NpemUgPSBzcmNfc2l6ZTsKLSAgICBqZXJyLmVycm9yX2V4aXQgPSBfZXJyb3JfZmF0YWw7Ci0gICAgamVyci5lbWl0X21lc3NhZ2UgPSBfZXJyb3JfZG9fbm90aGluZzE7Ci0gICAgamVyci5vdXRwdXRfbWVzc2FnZSA9IF9lcnJvcl9kb19ub3RoaW5nOwotICAgIGplcnIuZm9ybWF0X21lc3NhZ2UgPSBfZXJyb3JfZG9fbm90aGluZzI7Ci0gICAgamVyci5yZXNldF9lcnJvcl9tZ3IgPSBfZXJyb3JfZG9fbm90aGluZzsKLSAgICBzcmMuaW5pdF9zb3VyY2UgPSBfc3JjX2RvX25vdGhpbmc7Ci0gICAgc3JjLnRlcm1fc291cmNlID0gX3NyY19kb19ub3RoaW5nOwotICAgIHNyYy5za2lwX2lucHV0X2RhdGEgPSBfc3JjX3NraXBfZGF0YTsKLSAgICBzcmMuZmlsbF9pbnB1dF9idWZmZXIgPSBfc3JjX2ZpbGxfYnVmZmVyOwotICAgIHNyYy5yZXN5bmNfdG9fcmVzdGFydCA9IF9zcmNfcmVzeW5jOwotICAgIG1fYkpwZWdUcmFuc2Zvcm0gPSBDb2xvclRyYW5zZm9ybTsKLSAgICBpZihzcmNfc2l6ZSA+IDEgJiYgRlhTWVNfbWVtY21wMzIoc3JjX2J1ZiArIHNyY19zaXplIC0gMiwgIlx4RkZceEQ5IiwgMikgIT0gMCkgewotICAgICAgICAoKEZYX0xQQllURSlzcmNfYnVmKVtzcmNfc2l6ZSAtIDJdID0gMHhGRjsKLSAgICAgICAgKChGWF9MUEJZVEUpc3JjX2J1Zilbc3JjX3NpemUgLSAxXSA9IDB4RDk7Ci0gICAgfQotICAgIG1fT3V0cHV0V2lkdGggPSBtX09yaWdXaWR0aCA9IHdpZHRoOwotICAgIG1fT3V0cHV0SGVpZ2h0ID0gbV9PcmlnSGVpZ2h0ID0gaGVpZ2h0OwotICAgIGlmICghSW5pdERlY29kZSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKGNpbmZvLm51bV9jb21wb25lbnRzIDwgbkNvbXBzKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKChpbnQpY2luZm8uaW1hZ2Vfd2lkdGggPCB3aWR0aCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fUGl0Y2ggPSAoY2luZm8uaW1hZ2Vfd2lkdGggKiBjaW5mby5udW1fY29tcG9uZW50cyArIDMpIC8gNCAqIDQ7Ci0gICAgbV9wU2NhbmxpbmVCdWYgPSBGWF9BbGxvYyhGWF9CWVRFLCBtX1BpdGNoKTsKLSAgICBtX25Db21wcyA9IGNpbmZvLm51bV9jb21wb25lbnRzOwotICAgIG1fYnBjID0gODsKLSAgICBtX2JDb2xvclRyYW5zZm9ybWVkID0gRkFMU0U7Ci0gICAgbV9iU3RhcnRlZCA9IEZBTFNFOwotICAgIHJldHVybiBUUlVFOworfTsKK2V4dGVybiAiQyIgeworc3RhdGljIGJvb2xlYW4gX3NyY19yZXN5bmMoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGRlc2lyZWQpIHsKKyAgcmV0dXJuIDA7Cit9Cit9OworZXh0ZXJuICJDIiB7CitzdGF0aWMgdm9pZCBfZXJyb3JfZG9fbm90aGluZyhqX2NvbW1vbl9wdHIgY2luZm8pIHt9Cit9OworZXh0ZXJuICJDIiB7CitzdGF0aWMgdm9pZCBfZXJyb3JfZG9fbm90aGluZzEoal9jb21tb25fcHRyIGNpbmZvLCBpbnQpIHt9Cit9OworZXh0ZXJuICJDIiB7CitzdGF0aWMgdm9pZCBfZXJyb3JfZG9fbm90aGluZzIoal9jb21tb25fcHRyIGNpbmZvLCBjaGFyKikge30KK307CisjZGVmaW5lIEpQRUdfTUFSS0VSX0VYSUYgKEpQRUdfQVBQMCArIDEpCisjZGVmaW5lIEpQRUdfTUFSS0VSX0lDQyAoSlBFR19BUFAwICsgMikKKyNkZWZpbmUgSlBFR19NQVJLRVJfQVVUSE9SVElNRSAoSlBFR19BUFAwICsgMykKKyNkZWZpbmUgSlBFR19NQVJLRVJfTUFYU0laRSAweEZGRkYKKyNkZWZpbmUgSlBFR19PVkVSSEVBRF9MRU4gMTQKK3N0YXRpYyBGWF9CT09MIF9KcGVnRW1iZWRJY2NQcm9maWxlKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogaWNjX2J1Zl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBpY2NfbGVuZ3RoKSB7CisgIGlmICghaWNjX2J1Zl9wdHIgfHwgaWNjX2xlbmd0aCA9PSAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX0RXT1JEIGljY19zZWdtZW50X3NpemUgPSAoSlBFR19NQVJLRVJfTUFYU0laRSAtIDIgLSBKUEVHX09WRVJIRUFEX0xFTik7CisgIEZYX0RXT1JEIGljY19zZWdtZW50X251bSA9IChpY2NfbGVuZ3RoIC8gaWNjX3NlZ21lbnRfc2l6ZSkgKyAxOworICBpZiAoaWNjX3NlZ21lbnRfbnVtID4gMjU1KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX0RXT1JEIGljY19kYXRhX2xlbmd0aCA9CisgICAgICBKUEVHX09WRVJIRUFEX0xFTiArIChpY2Nfc2VnbWVudF9udW0gPiAxID8gaWNjX3NlZ21lbnRfc2l6ZSA6IGljY19sZW5ndGgpOworICB1aW50OF90KiBpY2NfZGF0YSA9IEZYX0FsbG9jKHVpbnQ4X3QsIGljY19kYXRhX2xlbmd0aCk7CisgIEZYU1lTX21lbWNweShpY2NfZGF0YSwgIlx4NDlceDQzXHg0M1x4NWZceDUwXHg1Mlx4NGZceDQ2XHg0OVx4NGNceDQ1XHgwMCIsCisgICAgICAgICAgICAgICAxMik7CisgIGljY19kYXRhWzEzXSA9ICh1aW50OF90KWljY19zZWdtZW50X251bTsKKyAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgKGljY19zZWdtZW50X251bSAtIDEpOyBpKyspIHsKKyAgICBpY2NfZGF0YVsxMl0gPSBpICsgMTsKKyAgICBGWFNZU19tZW1jcHkoaWNjX2RhdGEgKyBKUEVHX09WRVJIRUFEX0xFTiwKKyAgICAgICAgICAgICAgICAgaWNjX2J1Zl9wdHIgKyBpICogaWNjX3NlZ21lbnRfc2l6ZSwgaWNjX3NlZ21lbnRfc2l6ZSk7CisgICAganBlZ193cml0ZV9tYXJrZXIoY2luZm8sIEpQRUdfTUFSS0VSX0lDQywgaWNjX2RhdGEsIGljY19kYXRhX2xlbmd0aCk7CisgIH0KKyAgaWNjX2RhdGFbMTJdID0gKHVpbnQ4X3QpaWNjX3NlZ21lbnRfbnVtOworICBGWF9EV09SRCBpY2Nfc2l6ZSA9IChpY2Nfc2VnbWVudF9udW0gLSAxKSAqIGljY19zZWdtZW50X3NpemU7CisgIEZYU1lTX21lbWNweShpY2NfZGF0YSArIEpQRUdfT1ZFUkhFQURfTEVOLCBpY2NfYnVmX3B0ciArIGljY19zaXplLAorICAgICAgICAgICAgICAgaWNjX2xlbmd0aCAtIGljY19zaXplKTsKKyAganBlZ193cml0ZV9tYXJrZXIoY2luZm8sIEpQRUdfTUFSS0VSX0lDQywgaWNjX2RhdGEsCisgICAgICAgICAgICAgICAgICAgIEpQRUdfT1ZFUkhFQURfTEVOICsgaWNjX2xlbmd0aCAtIGljY19zaXplKTsKKyAgRlhfRnJlZShpY2NfZGF0YSk7CisgIHJldHVybiBUUlVFOwogfQogZXh0ZXJuICJDIiB7Ci0gICAgRlhfSU5UMzIgRlhfR2V0RG93bnNhbXBsZVJhdGlvKEZYX0lOVDMyIG9yaWdpbldpZHRoLCBGWF9JTlQzMiBvcmlnaW5IZWlnaHQsIEZYX0lOVDMyIGRvd25zYW1wbGVXaWR0aCwgRlhfSU5UMzIgZG93bnNhbXBsZUhlaWdodCkKLSAgICB7Ci0gICAgICAgIGludCBpcmF0aW9fdyA9IG9yaWdpbldpZHRoIC8gZG93bnNhbXBsZVdpZHRoOwotICAgICAgICBpbnQgaXJhdGlvX2ggPSBvcmlnaW5IZWlnaHQgLyBkb3duc2FtcGxlSGVpZ2h0OwotICAgICAgICBpbnQgcmF0aW8gPSAoaXJhdGlvX3cgPiBpcmF0aW9faCkgPyBpcmF0aW9faCA6IGlyYXRpb193OwotICAgICAgICBpZiAocmF0aW8gPj0gOCkgewotICAgICAgICAgICAgcmV0dXJuIDg7Ci0gICAgICAgIH0gZWxzZSBpZiAocmF0aW8gPj0gNCkgewotICAgICAgICAgICAgcmV0dXJuIDQ7Ci0gICAgICAgIH0gZWxzZSBpZiAocmF0aW8gPj0gMikgewotICAgICAgICAgICAgcmV0dXJuIDI7CitzdGF0aWMgdm9pZCBfZGVzdF9kb19ub3RoaW5nKGpfY29tcHJlc3NfcHRyIGNpbmZvKSB7fQorfTsKK2V4dGVybiAiQyIgeworc3RhdGljIGJvb2xlYW4gX2Rlc3RfZW1wdHkoal9jb21wcmVzc19wdHIgY2luZm8pIHsKKyAgcmV0dXJuIEZBTFNFOworfQorfTsKKyNkZWZpbmUgSlBFR19CTE9DS19TSVpFIDEwNDg1NzYKK3N0YXRpYyB2b2lkIF9KcGVnRW5jb2RlKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFJiBkZXN0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGljY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBpY2NfbGVuZ3RoKSB7CisgIHN0cnVjdCBqcGVnX2Vycm9yX21nciBqZXJyOworICBqZXJyLmVycm9yX2V4aXQgPSBfZXJyb3JfZG9fbm90aGluZzsKKyAgamVyci5lbWl0X21lc3NhZ2UgPSBfZXJyb3JfZG9fbm90aGluZzE7CisgIGplcnIub3V0cHV0X21lc3NhZ2UgPSBfZXJyb3JfZG9fbm90aGluZzsKKyAgamVyci5mb3JtYXRfbWVzc2FnZSA9IF9lcnJvcl9kb19ub3RoaW5nMjsKKyAgamVyci5yZXNldF9lcnJvcl9tZ3IgPSBfZXJyb3JfZG9fbm90aGluZzsKKworICBzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgY2luZm87CisgIG1lbXNldCgmY2luZm8sIDAsIHNpemVvZihjaW5mbykpOworICBjaW5mby5lcnIgPSAmamVycjsKKyAganBlZ19jcmVhdGVfY29tcHJlc3MoJmNpbmZvKTsKKyAgaW50IEJwcCA9IHBTb3VyY2UtPkdldEJQUCgpIC8gODsKKyAgRlhfRFdPUkQgbkNvbXBvbmVudHMgPSBCcHAgPj0gMyA/IChwU291cmNlLT5Jc0NteWtJbWFnZSgpID8gNCA6IDMpIDogMTsKKyAgRlhfRFdPUkQgcGl0Y2ggPSBwU291cmNlLT5HZXRQaXRjaCgpOworICBGWF9EV09SRCB3aWR0aCA9IHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PEZYX0RXT1JEPihwU291cmNlLT5HZXRXaWR0aCgpKTsKKyAgRlhfRFdPUkQgaGVpZ2h0ID0gcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlhfRFdPUkQ+KHBTb3VyY2UtPkdldEhlaWdodCgpKTsKKyAgRlhfU0FGRV9EV09SRCBzYWZlX2J1Zl9sZW4gPSB3aWR0aDsKKyAgc2FmZV9idWZfbGVuICo9IGhlaWdodDsKKyAgc2FmZV9idWZfbGVuICo9IG5Db21wb25lbnRzOworICBzYWZlX2J1Zl9sZW4gKz0gMTAyNDsKKyAgaWYgKGljY19sZW5ndGgpIHsKKyAgICBzYWZlX2J1Zl9sZW4gKz0gMjU1ICogMTg7CisgICAgc2FmZV9idWZfbGVuICs9IGljY19sZW5ndGg7CisgIH0KKyAgRlhfRFdPUkQgZGVzdF9idWZfbGVuZ3RoID0gMDsKKyAgaWYgKCFzYWZlX2J1Zl9sZW4uSXNWYWxpZCgpKSB7CisgICAgZGVzdF9idWYgPSBudWxscHRyOworICB9IGVsc2UgeworICAgIGRlc3RfYnVmX2xlbmd0aCA9IHNhZmVfYnVmX2xlbi5WYWx1ZU9yRGllKCk7CisgICAgZGVzdF9idWYgPSBGWF9UcnlBbGxvYyh1aW50OF90LCBkZXN0X2J1Zl9sZW5ndGgpOworICAgIGNvbnN0IGludCBNSU5fVFJZX0JVRl9MRU4gPSAxMDI0OworICAgIHdoaWxlICghZGVzdF9idWYgJiYgZGVzdF9idWZfbGVuZ3RoID4gTUlOX1RSWV9CVUZfTEVOKSB7CisgICAgICBkZXN0X2J1Zl9sZW5ndGggPj49IDE7CisgICAgICBkZXN0X2J1ZiA9IEZYX1RyeUFsbG9jKHVpbnQ4X3QsIGRlc3RfYnVmX2xlbmd0aCk7CisgICAgfQorICB9CisgIGlmICghZGVzdF9idWYpIHsKKyAgICBGWF9PdXRPZk1lbW9yeVRlcm1pbmF0ZSgpOworICB9CisgIHN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21nciBkZXN0OworICBkZXN0LmluaXRfZGVzdGluYXRpb24gPSBfZGVzdF9kb19ub3RoaW5nOworICBkZXN0LnRlcm1fZGVzdGluYXRpb24gPSBfZGVzdF9kb19ub3RoaW5nOworICBkZXN0LmVtcHR5X291dHB1dF9idWZmZXIgPSBfZGVzdF9lbXB0eTsKKyAgZGVzdC5uZXh0X291dHB1dF9ieXRlID0gZGVzdF9idWY7CisgIGRlc3QuZnJlZV9pbl9idWZmZXIgPSBkZXN0X2J1Zl9sZW5ndGg7CisgIGNpbmZvLmRlc3QgPSAmZGVzdDsKKyAgY2luZm8uaW1hZ2Vfd2lkdGggPSB3aWR0aDsKKyAgY2luZm8uaW1hZ2VfaGVpZ2h0ID0gaGVpZ2h0OworICBjaW5mby5pbnB1dF9jb21wb25lbnRzID0gbkNvbXBvbmVudHM7CisgIGlmIChuQ29tcG9uZW50cyA9PSAxKSB7CisgICAgY2luZm8uaW5fY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOworICB9IGVsc2UgaWYgKG5Db21wb25lbnRzID09IDMpIHsKKyAgICBjaW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19SR0I7CisgIH0gZWxzZSB7CisgICAgY2luZm8uaW5fY29sb3Jfc3BhY2UgPSBKQ1NfQ01ZSzsKKyAgfQorICB1aW50OF90KiBsaW5lX2J1ZiA9IE5VTEw7CisgIGlmIChuQ29tcG9uZW50cyA+IDEpIHsKKyAgICBsaW5lX2J1ZiA9IEZYX0FsbG9jMkQodWludDhfdCwgd2lkdGgsIG5Db21wb25lbnRzKTsKKyAgfQorICBqcGVnX3NldF9kZWZhdWx0cygmY2luZm8pOworICBpZiAocXVhbGl0eSAhPSA3NSkgeworICAgIGpwZWdfc2V0X3F1YWxpdHkoJmNpbmZvLCBxdWFsaXR5LCBUUlVFKTsKKyAgfQorICBqcGVnX3N0YXJ0X2NvbXByZXNzKCZjaW5mbywgVFJVRSk7CisgIF9KcGVnRW1iZWRJY2NQcm9maWxlKCZjaW5mbywgaWNjX2J1ZiwgaWNjX2xlbmd0aCk7CisgIEpTQU1QUk9XIHJvd19wb2ludGVyWzFdOworICBKRElNRU5TSU9OIHJvdzsKKyAgd2hpbGUgKGNpbmZvLm5leHRfc2NhbmxpbmUgPCBjaW5mby5pbWFnZV9oZWlnaHQpIHsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTb3VyY2UtPkdldFNjYW5saW5lKGNpbmZvLm5leHRfc2NhbmxpbmUpOworICAgIGlmIChuQ29tcG9uZW50cyA+IDEpIHsKKyAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGxpbmVfYnVmOworICAgICAgaWYgKG5Db21wb25lbnRzID09IDMpIHsKKyAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBzcmNfc2NhblsyXTsKKyAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBzcmNfc2NhblsxXTsKKyAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBzcmNfc2NhblswXTsKKyAgICAgICAgICBkZXN0X3NjYW4gKz0gMzsKKyAgICAgICAgICBzcmNfc2NhbiArPSBCcHA7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotfQotdm9pZCBDQ29kZWNfSnBlZ0RlY29kZXI6OnZfRG93blNjYWxlKGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQpCi17Ci0gICAgaWYgKG1fcEV4dFByb3ZpZGVyKSB7Ci0gICAgICAgIG1fcEV4dFByb3ZpZGVyLT5Eb3duU2NhbGUobV9wRXh0Q29udGV4dCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludCBvbGRfc2NhbGUgPSBtX0Rvd25TY2FsZTsKLSAgICBtX0Rvd25TY2FsZSA9IEZYX0dldERvd25zYW1wbGVSYXRpbyhtX09yaWdXaWR0aCwgbV9PcmlnSGVpZ2h0LCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCk7Ci0gICAgbV9PdXRwdXRXaWR0aCA9IChtX09yaWdXaWR0aCArIG1fRG93blNjYWxlIC0gMSkgLyBtX0Rvd25TY2FsZTsKLSAgICBtX091dHB1dEhlaWdodCA9IChtX09yaWdIZWlnaHQgKyBtX0Rvd25TY2FsZSAtIDEpIC8gbV9Eb3duU2NhbGU7Ci0gICAgbV9QaXRjaCA9IChtX091dHB1dFdpZHRoICogbV9uQ29tcHMgKyAzKSAvIDQgKiA0OwotICAgIGlmIChvbGRfc2NhbGUgIT0gbV9Eb3duU2NhbGUpIHsKLSAgICAgICAgbV9OZXh0TGluZSA9IC0xOwotICAgIH0KLX0KLUZYX0JPT0wgQ0NvZGVjX0pwZWdEZWNvZGVyOjp2X1Jld2luZCgpCi17Ci0gICAgaWYgKG1fcEV4dFByb3ZpZGVyKSB7Ci0gICAgICAgIHJldHVybiBtX3BFeHRQcm92aWRlci0+UmV3aW5kKG1fcEV4dENvbnRleHQpOwotICAgIH0KLSAgICBpZiAobV9iU3RhcnRlZCkgewotICAgICAgICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOwotICAgICAgICBpZiAoIUluaXREZWNvZGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IHBpdGNoOyBpKyspIHsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSB+KnNyY19zY2FuKys7CiAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJvd19wb2ludGVyWzBdID0gbGluZV9idWY7CisgICAgfSBlbHNlIHsKKyAgICAgIHJvd19wb2ludGVyWzBdID0gKHVpbnQ4X3QqKXNyY19zY2FuOwogICAgIH0KLSAgICBpZiAoc2V0am1wKG1fSm1wQnVmKSA9PSAtMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgcm93ID0gY2luZm8ubmV4dF9zY2FubGluZTsKKyAgICBqcGVnX3dyaXRlX3NjYW5saW5lcygmY2luZm8sIHJvd19wb2ludGVyLCAxKTsKKyAgICBpZiAoY2luZm8ubmV4dF9zY2FubGluZSA9PSByb3cpIHsKKyAgICAgIGRlc3RfYnVmID0KKyAgICAgICAgICBGWF9SZWFsbG9jKHVpbnQ4X3QsIGRlc3RfYnVmLCBkZXN0X2J1Zl9sZW5ndGggKyBKUEVHX0JMT0NLX1NJWkUpOworICAgICAgZGVzdC5uZXh0X291dHB1dF9ieXRlID0gZGVzdF9idWYgKyBkZXN0X2J1Zl9sZW5ndGggLSBkZXN0LmZyZWVfaW5fYnVmZmVyOworICAgICAgZGVzdF9idWZfbGVuZ3RoICs9IEpQRUdfQkxPQ0tfU0laRTsKKyAgICAgIGRlc3QuZnJlZV9pbl9idWZmZXIgKz0gSlBFR19CTE9DS19TSVpFOwogICAgIH0KLSAgICBjaW5mby5zY2FsZV9kZW5vbSA9IG1fbkRlZmF1bHRTY2FsZURlbm9tICogbV9Eb3duU2NhbGU7Ci0gICAgbV9PdXRwdXRXaWR0aCA9IChtX09yaWdXaWR0aCArIG1fRG93blNjYWxlIC0gMSkgLyBtX0Rvd25TY2FsZTsKLSAgICBtX091dHB1dEhlaWdodCA9IChtX09yaWdIZWlnaHQgKyBtX0Rvd25TY2FsZSAtIDEpIC8gbV9Eb3duU2NhbGU7Ci0gICAgaWYgKCFqcGVnX3N0YXJ0X2RlY29tcHJlc3MoJmNpbmZvKSkgewotICAgICAgICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmICgoaW50KWNpbmZvLm91dHB1dF93aWR0aCA+IG1fT3JpZ1dpZHRoKSB7Ci0gICAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9iU3RhcnRlZCA9IFRSVUU7Ci0gICAgcmV0dXJuIFRSVUU7CisgIH0KKyAganBlZ19maW5pc2hfY29tcHJlc3MoJmNpbmZvKTsKKyAganBlZ19kZXN0cm95X2NvbXByZXNzKCZjaW5mbyk7CisgIEZYX0ZyZWUobGluZV9idWYpOworICBkZXN0X3NpemUgPSBkZXN0X2J1Zl9sZW5ndGggLSAoRlhfU1RSU0laRSlkZXN0LmZyZWVfaW5fYnVmZmVyOwogfQotRlhfTFBCWVRFIENDb2RlY19KcGVnRGVjb2Rlcjo6dl9HZXROZXh0TGluZSgpCi17Ci0gICAgaWYgKG1fcEV4dFByb3ZpZGVyKSB7Ci0gICAgICAgIHJldHVybiBtX3BFeHRQcm92aWRlci0+R2V0TmV4dExpbmUobV9wRXh0Q29udGV4dCk7Ci0gICAgfQotICAgIGludCBubGluZXMgPSBqcGVnX3JlYWRfc2NhbmxpbmVzKCZjaW5mbywgJm1fcFNjYW5saW5lQnVmLCAxKTsKLSAgICBpZiAobmxpbmVzIDwgMSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIG1fcFNjYW5saW5lQnVmOworCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK3N0YXRpYyB2b2lkIF9KcGVnTG9hZEF0dHJpYnV0ZShzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCogcEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkgeworICBpZiAocEluZm8gPT0gTlVMTCB8fCBwQXR0cmlidXRlID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHBBdHRyaWJ1dGUpIHsKKyAgICBwQXR0cmlidXRlLT5tX25YRFBJID0gcEluZm8tPlhfZGVuc2l0eTsKKyAgICBwQXR0cmlidXRlLT5tX25ZRFBJID0gcEluZm8tPllfZGVuc2l0eTsKKyAgICBwQXR0cmlidXRlLT5tX3dEUElVbml0ID0gcEluZm8tPmRlbnNpdHlfdW5pdDsKKyAgfQogfQotRlhfRFdPUkQgQ0NvZGVjX0pwZWdEZWNvZGVyOjpHZXRTcmNPZmZzZXQoKQotewotICAgIGlmIChtX3BFeHRQcm92aWRlcikgewotICAgICAgICByZXR1cm4gbV9wRXh0UHJvdmlkZXItPkdldFNyY09mZnNldChtX3BFeHRDb250ZXh0KTsKLSAgICB9Ci0gICAgcmV0dXJuIChGWF9EV09SRCkobV9TcmNTaXplIC0gc3JjLmJ5dGVzX2luX2J1ZmZlcik7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKK3N0YXRpYyBGWF9CT09MIF9KcGVnTG9hZEluZm8oY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG51bV9jb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGJpdHNfcGVyX2NvbXBvbmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGNvbG9yX3RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGljY19idWZfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogaWNjX2xlbmd0aCkgeworICBfSnBlZ1NjYW5TT0koc3JjX2J1Ziwgc3JjX3NpemUpOworICBzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCBjaW5mbzsKKyAgc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7CisgIGplcnIuZXJyb3JfZXhpdCA9IF9lcnJvcl9mYXRhbDsKKyAgamVyci5lbWl0X21lc3NhZ2UgPSBfZXJyb3JfZG9fbm90aGluZzE7CisgIGplcnIub3V0cHV0X21lc3NhZ2UgPSBfZXJyb3JfZG9fbm90aGluZzsKKyAgamVyci5mb3JtYXRfbWVzc2FnZSA9IF9lcnJvcl9kb19ub3RoaW5nMjsKKyAgamVyci5yZXNldF9lcnJvcl9tZ3IgPSBfZXJyb3JfZG9fbm90aGluZzsKKyAgamVyci50cmFjZV9sZXZlbCA9IDA7CisgIGNpbmZvLmVyciA9ICZqZXJyOworICBqbXBfYnVmIG1hcms7CisgIGNpbmZvLmNsaWVudF9kYXRhID0gJm1hcms7CisgIGlmIChzZXRqbXAobWFyaykgPT0gLTEpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAganBlZ19jcmVhdGVfZGVjb21wcmVzcygmY2luZm8pOworICBzdHJ1Y3QganBlZ19zb3VyY2VfbWdyIHNyYzsKKyAgc3JjLmluaXRfc291cmNlID0gX3NyY19kb19ub3RoaW5nOworICBzcmMudGVybV9zb3VyY2UgPSBfc3JjX2RvX25vdGhpbmc7CisgIHNyYy5za2lwX2lucHV0X2RhdGEgPSBfc3JjX3NraXBfZGF0YTsKKyAgc3JjLmZpbGxfaW5wdXRfYnVmZmVyID0gX3NyY19maWxsX2J1ZmZlcjsKKyAgc3JjLnJlc3luY190b19yZXN0YXJ0ID0gX3NyY19yZXN5bmM7CisgIHNyYy5ieXRlc19pbl9idWZmZXIgPSBzcmNfc2l6ZTsKKyAgc3JjLm5leHRfaW5wdXRfYnl0ZSA9IHNyY19idWY7CisgIGNpbmZvLnNyYyA9ICZzcmM7CisgIGlmIChzZXRqbXAobWFyaykgPT0gLTEpIHsKKyAgICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoaWNjX2J1Zl9wdHIgJiYgaWNjX2xlbmd0aCkgeworICAgIGpwZWdfc2F2ZV9tYXJrZXJzKCZjaW5mbywgSlBFR19NQVJLRVJfSUNDLCBKUEVHX01BUktFUl9NQVhTSVpFKTsKKyAgfQorICBpbnQgcmV0ID0ganBlZ19yZWFkX2hlYWRlcigmY2luZm8sIFRSVUUpOworICBpZiAocmV0ICE9IEpQRUdfSEVBREVSX09LKSB7CisgICAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgd2lkdGggPSBjaW5mby5pbWFnZV93aWR0aDsKKyAgaGVpZ2h0ID0gY2luZm8uaW1hZ2VfaGVpZ2h0OworICBudW1fY29tcG9uZW50cyA9IGNpbmZvLm51bV9jb21wb25lbnRzOworICBjb2xvcl90cmFuc2Zvcm0gPQorICAgICAgY2luZm8uanBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IgfHwgY2luZm8uanBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNDSzsKKyAgYml0c19wZXJfY29tcG9uZW50cyA9IGNpbmZvLmRhdGFfcHJlY2lzaW9uOworICBpZiAoaWNjX2J1Zl9wdHIpIHsKKyAgICAqaWNjX2J1Zl9wdHIgPSBOVUxMOworICB9CisgIGlmIChpY2NfbGVuZ3RoKSB7CisgICAgKmljY19sZW5ndGggPSAwOworICB9CisgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZjaW5mbyk7CisgIHJldHVybiBUUlVFOwogfQotSUNvZGVjX1NjYW5saW5lRGVjb2RlcioJQ0NvZGVjX0pwZWdNb2R1bGU6OkNyZWF0ZURlY29kZXIoRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwKLSAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbkNvbXBzLCBGWF9CT09MIENvbG9yVHJhbnNmb3JtKQotewotICAgIGlmIChzcmNfYnVmID09IE5VTEwgfHwgc3JjX3NpemUgPT0gMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ0NvZGVjX0pwZWdEZWNvZGVyKiBwRGVjb2RlciA9IG5ldyBDQ29kZWNfSnBlZ0RlY29kZXI7Ci0gICAgaWYgKCFwRGVjb2Rlci0+Q3JlYXRlKHNyY19idWYsIHNyY19zaXplLCB3aWR0aCwgaGVpZ2h0LCBuQ29tcHMsIENvbG9yVHJhbnNmb3JtLCBtX3BFeHRQcm92aWRlcikpIHsKLSAgICAgICAgZGVsZXRlIHBEZWNvZGVyOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIHBEZWNvZGVyOworCitjbGFzcyBDQ29kZWNfSnBlZ0RlY29kZXIgOiBwdWJsaWMgQ0NvZGVjX1NjYW5saW5lRGVjb2RlciB7CisgcHVibGljOgorICBDQ29kZWNfSnBlZ0RlY29kZXIoKTsKKyAgfkNDb2RlY19KcGVnRGVjb2RlcigpIG92ZXJyaWRlOworCisgIEZYX0JPT0wgQ3JlYXRlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgIGludCBuQ29tcHMsCisgICAgICAgICAgICAgICAgIEZYX0JPT0wgQ29sb3JUcmFuc2Zvcm0pOworICB2b2lkIERlc3Ryb3koKSB7IGRlbGV0ZSB0aGlzOyB9CisKKyAgLy8gQ0NvZGVjX1NjYW5saW5lRGVjb2RlcgorICB2b2lkIHZfRG93blNjYWxlKGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQpIG92ZXJyaWRlOworICBGWF9CT09MIHZfUmV3aW5kKCkgb3ZlcnJpZGU7CisgIHVpbnQ4X3QqIHZfR2V0TmV4dExpbmUoKSBvdmVycmlkZTsKKyAgRlhfRFdPUkQgR2V0U3JjT2Zmc2V0KCkgb3ZlcnJpZGU7CisKKyAgRlhfQk9PTCBJbml0RGVjb2RlKCk7CisKKyAgam1wX2J1ZiBtX0ptcEJ1ZjsKKyAgc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QgY2luZm87CisgIHN0cnVjdCBqcGVnX2Vycm9yX21nciBqZXJyOworICBzdHJ1Y3QganBlZ19zb3VyY2VfbWdyIHNyYzsKKyAgY29uc3QgdWludDhfdCogbV9TcmNCdWY7CisgIEZYX0RXT1JEIG1fU3JjU2l6ZTsKKyAgdWludDhfdCogbV9wU2NhbmxpbmVCdWY7CisKKyAgRlhfQk9PTCBtX2JJbml0ZWQ7CisgIEZYX0JPT0wgbV9iU3RhcnRlZDsKKyAgRlhfQk9PTCBtX2JKcGVnVHJhbnNmb3JtOworCisgcHJvdGVjdGVkOgorICBGWF9EV09SRCBtX25EZWZhdWx0U2NhbGVEZW5vbTsKK307CisKK0NDb2RlY19KcGVnRGVjb2Rlcjo6Q0NvZGVjX0pwZWdEZWNvZGVyKCkgeworICBtX3BTY2FubGluZUJ1ZiA9IE5VTEw7CisgIG1fRG93blNjYWxlID0gMTsKKyAgbV9iU3RhcnRlZCA9IEZBTFNFOworICBtX2JJbml0ZWQgPSBGQUxTRTsKKyAgRlhTWVNfbWVtc2V0KCZjaW5mbywgMCwgc2l6ZW9mKGNpbmZvKSk7CisgIEZYU1lTX21lbXNldCgmamVyciwgMCwgc2l6ZW9mKGplcnIpKTsKKyAgRlhTWVNfbWVtc2V0KCZzcmMsIDAsIHNpemVvZihzcmMpKTsKKyAgbV9uRGVmYXVsdFNjYWxlRGVub20gPSAxOwogfQotRlhfQk9PTCBDQ29kZWNfSnBlZ01vZHVsZTo6TG9hZEluZm8oRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSwgaW50JiB3aWR0aCwgaW50JiBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG51bV9jb21wb25lbnRzLCBpbnQmIGJpdHNfcGVyX2NvbXBvbmVudHMsIEZYX0JPT0wmIGNvbG9yX3RyYW5zZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSogaWNjX2J1Zl9wdHIsIEZYX0RXT1JEKiBpY2NfbGVuZ3RoKQotewotICAgIGlmIChtX3BFeHRQcm92aWRlcikgewotICAgICAgICByZXR1cm4gbV9wRXh0UHJvdmlkZXItPkxvYWRJbmZvKHNyY19idWYsIHNyY19zaXplLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jb21wb25lbnRzLCBiaXRzX3Blcl9jb21wb25lbnRzLCBjb2xvcl90cmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNjX2J1Zl9wdHIsIGljY19sZW5ndGgpOwotICAgIH0KLSAgICByZXR1cm4gX0pwZWdMb2FkSW5mbyhzcmNfYnVmLCBzcmNfc2l6ZSwgd2lkdGgsIGhlaWdodCwgbnVtX2NvbXBvbmVudHMsIGJpdHNfcGVyX2NvbXBvbmVudHMsIGNvbG9yX3RyYW5zZm9ybSwgaWNjX2J1Zl9wdHIsIGljY19sZW5ndGgpOworQ0NvZGVjX0pwZWdEZWNvZGVyOjp+Q0NvZGVjX0pwZWdEZWNvZGVyKCkgeworICBGWF9GcmVlKG1fcFNjYW5saW5lQnVmKTsKKyAgaWYgKG1fYkluaXRlZCkgeworICAgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZjaW5mbyk7CisgIH0KIH0KLUZYX0JPT0wgQ0NvZGVjX0pwZWdNb2R1bGU6OkVuY29kZShjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9MUEJZVEUmIGRlc3RfYnVmLCBGWF9TVFJTSVpFJiBkZXN0X3NpemUsIGludCBxdWFsaXR5LCBGWF9MUENCWVRFIGljY19idWYsIEZYX0RXT1JEIGljY19sZW5ndGgpCi17Ci0gICAgaWYgKG1fcEV4dFByb3ZpZGVyKSB7Ci0gICAgICAgIHJldHVybiBtX3BFeHRQcm92aWRlci0+RW5jb2RlKHBTb3VyY2UsIGRlc3RfYnVmLCBkZXN0X3NpemUsIHF1YWxpdHksIGljY19idWYsIGljY19sZW5ndGgpOworRlhfQk9PTCBDQ29kZWNfSnBlZ0RlY29kZXI6OkluaXREZWNvZGUoKSB7CisgIGNpbmZvLmVyciA9ICZqZXJyOworICBjaW5mby5jbGllbnRfZGF0YSA9ICZtX0ptcEJ1ZjsKKyAgaWYgKHNldGptcChtX0ptcEJ1ZikgPT0gLTEpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAganBlZ19jcmVhdGVfZGVjb21wcmVzcygmY2luZm8pOworICBtX2JJbml0ZWQgPSBUUlVFOworICBjaW5mby5zcmMgPSAmc3JjOworICBzcmMuYnl0ZXNfaW5fYnVmZmVyID0gbV9TcmNTaXplOworICBzcmMubmV4dF9pbnB1dF9ieXRlID0gbV9TcmNCdWY7CisgIGlmIChzZXRqbXAobV9KbXBCdWYpID09IC0xKSB7CisgICAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKKyAgICBtX2JJbml0ZWQgPSBGQUxTRTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgY2luZm8uaW1hZ2Vfd2lkdGggPSBtX09yaWdXaWR0aDsKKyAgY2luZm8uaW1hZ2VfaGVpZ2h0ID0gbV9PcmlnSGVpZ2h0OworICBpbnQgcmV0ID0ganBlZ19yZWFkX2hlYWRlcigmY2luZm8sIFRSVUUpOworICBpZiAocmV0ICE9IEpQRUdfSEVBREVSX09LKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChjaW5mby5zYXdfQWRvYmVfbWFya2VyKSB7CisgICAgbV9iSnBlZ1RyYW5zZm9ybSA9IFRSVUU7CisgIH0KKyAgaWYgKGNpbmZvLm51bV9jb21wb25lbnRzID09IDMgJiYgIW1fYkpwZWdUcmFuc2Zvcm0pIHsKKyAgICBjaW5mby5vdXRfY29sb3Jfc3BhY2UgPSBjaW5mby5qcGVnX2NvbG9yX3NwYWNlOworICB9CisgIG1fT3JpZ1dpZHRoID0gY2luZm8uaW1hZ2Vfd2lkdGg7CisgIG1fT3JpZ0hlaWdodCA9IGNpbmZvLmltYWdlX2hlaWdodDsKKyAgbV9PdXRwdXRXaWR0aCA9IG1fT3JpZ1dpZHRoOworICBtX091dHB1dEhlaWdodCA9IG1fT3JpZ0hlaWdodDsKKyAgbV9uRGVmYXVsdFNjYWxlRGVub20gPSBjaW5mby5zY2FsZV9kZW5vbTsKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENDb2RlY19KcGVnRGVjb2Rlcjo6Q3JlYXRlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgQ29sb3JUcmFuc2Zvcm0pIHsKKyAgX0pwZWdTY2FuU09JKHNyY19idWYsIHNyY19zaXplKTsKKyAgbV9TcmNCdWYgPSBzcmNfYnVmOworICBtX1NyY1NpemUgPSBzcmNfc2l6ZTsKKyAgamVyci5lcnJvcl9leGl0ID0gX2Vycm9yX2ZhdGFsOworICBqZXJyLmVtaXRfbWVzc2FnZSA9IF9lcnJvcl9kb19ub3RoaW5nMTsKKyAgamVyci5vdXRwdXRfbWVzc2FnZSA9IF9lcnJvcl9kb19ub3RoaW5nOworICBqZXJyLmZvcm1hdF9tZXNzYWdlID0gX2Vycm9yX2RvX25vdGhpbmcyOworICBqZXJyLnJlc2V0X2Vycm9yX21nciA9IF9lcnJvcl9kb19ub3RoaW5nOworICBzcmMuaW5pdF9zb3VyY2UgPSBfc3JjX2RvX25vdGhpbmc7CisgIHNyYy50ZXJtX3NvdXJjZSA9IF9zcmNfZG9fbm90aGluZzsKKyAgc3JjLnNraXBfaW5wdXRfZGF0YSA9IF9zcmNfc2tpcF9kYXRhOworICBzcmMuZmlsbF9pbnB1dF9idWZmZXIgPSBfc3JjX2ZpbGxfYnVmZmVyOworICBzcmMucmVzeW5jX3RvX3Jlc3RhcnQgPSBfc3JjX3Jlc3luYzsKKyAgbV9iSnBlZ1RyYW5zZm9ybSA9IENvbG9yVHJhbnNmb3JtOworICBpZiAoc3JjX3NpemUgPiAxICYmCisgICAgICBGWFNZU19tZW1jbXAoc3JjX2J1ZiArIHNyY19zaXplIC0gMiwgIlx4RkZceEQ5IiwgMikgIT0gMCkgeworICAgICgodWludDhfdCopc3JjX2J1Zilbc3JjX3NpemUgLSAyXSA9IDB4RkY7CisgICAgKCh1aW50OF90KilzcmNfYnVmKVtzcmNfc2l6ZSAtIDFdID0gMHhEOTsKKyAgfQorICBtX091dHB1dFdpZHRoID0gbV9PcmlnV2lkdGggPSB3aWR0aDsKKyAgbV9PdXRwdXRIZWlnaHQgPSBtX09yaWdIZWlnaHQgPSBoZWlnaHQ7CisgIGlmICghSW5pdERlY29kZSgpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChjaW5mby5udW1fY29tcG9uZW50cyA8IG5Db21wcykgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoKGludCljaW5mby5pbWFnZV93aWR0aCA8IHdpZHRoKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fUGl0Y2ggPQorICAgICAgKHN0YXRpY19jYXN0PEZYX0RXT1JEPihjaW5mby5pbWFnZV93aWR0aCkgKiBjaW5mby5udW1fY29tcG9uZW50cyArIDMpIC8KKyAgICAgIDQgKiA0OworICBtX3BTY2FubGluZUJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fUGl0Y2gpOworICBtX25Db21wcyA9IGNpbmZvLm51bV9jb21wb25lbnRzOworICBtX2JwYyA9IDg7CisgIG1fYkNvbG9yVHJhbnNmb3JtZWQgPSBGQUxTRTsKKyAgbV9iU3RhcnRlZCA9IEZBTFNFOworICByZXR1cm4gVFJVRTsKK30KK2V4dGVybiAiQyIgeworaW50MzJfdCBGWF9HZXREb3duc2FtcGxlUmF0aW8oaW50MzJfdCBvcmlnaW5XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb3JpZ2luSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkb3duc2FtcGxlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRvd25zYW1wbGVIZWlnaHQpIHsKKyAgaW50IGlyYXRpb193ID0gb3JpZ2luV2lkdGggLyBkb3duc2FtcGxlV2lkdGg7CisgIGludCBpcmF0aW9faCA9IG9yaWdpbkhlaWdodCAvIGRvd25zYW1wbGVIZWlnaHQ7CisgIGludCByYXRpbyA9IChpcmF0aW9fdyA+IGlyYXRpb19oKSA/IGlyYXRpb19oIDogaXJhdGlvX3c7CisgIGlmIChyYXRpbyA+PSA4KSB7CisgICAgcmV0dXJuIDg7CisgIH0KKyAgaWYgKHJhdGlvID49IDQpIHsKKyAgICByZXR1cm4gNDsKKyAgfQorICBpZiAocmF0aW8gPj0gMikgeworICAgIHJldHVybiAyOworICB9CisgIHJldHVybiAxOworfQorfQordm9pZCBDQ29kZWNfSnBlZ0RlY29kZXI6OnZfRG93blNjYWxlKGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQpIHsKKyAgaW50IG9sZF9zY2FsZSA9IG1fRG93blNjYWxlOworICBtX0Rvd25TY2FsZSA9CisgICAgICBGWF9HZXREb3duc2FtcGxlUmF0aW8obV9PcmlnV2lkdGgsIG1fT3JpZ0hlaWdodCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQpOworICBtX091dHB1dFdpZHRoID0gKG1fT3JpZ1dpZHRoICsgbV9Eb3duU2NhbGUgLSAxKSAvIG1fRG93blNjYWxlOworICBtX091dHB1dEhlaWdodCA9IChtX09yaWdIZWlnaHQgKyBtX0Rvd25TY2FsZSAtIDEpIC8gbV9Eb3duU2NhbGU7CisgIG1fUGl0Y2ggPSAoc3RhdGljX2Nhc3Q8RlhfRFdPUkQ+KG1fT3V0cHV0V2lkdGgpICogbV9uQ29tcHMgKyAzKSAvIDQgKiA0OworICBpZiAob2xkX3NjYWxlICE9IG1fRG93blNjYWxlKSB7CisgICAgbV9OZXh0TGluZSA9IC0xOworICB9Cit9CitGWF9CT09MIENDb2RlY19KcGVnRGVjb2Rlcjo6dl9SZXdpbmQoKSB7CisgIGlmIChtX2JTdGFydGVkKSB7CisgICAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKKyAgICBpZiAoIUluaXREZWNvZGUoKSkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBpZihwU291cmNlLT5HZXRCUFAoKSA8IDggfHwgcFNvdXJjZS0+R2V0UGFsZXR0ZSgpICE9IE5VTEwpIHsKLSAgICAgICAgQVNTRVJUKHBTb3VyY2UtPkdldEJQUCgpID49IDggJiYgcFNvdXJjZS0+R2V0UGFsZXR0ZSgpID09IE5VTEwpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIF9KcGVnRW5jb2RlKHBTb3VyY2UsIGRlc3RfYnVmLCBkZXN0X3NpemUsIHF1YWxpdHksIGljY19idWYsIGljY19sZW5ndGgpOwotICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChzZXRqbXAobV9KbXBCdWYpID09IC0xKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGNpbmZvLnNjYWxlX2Rlbm9tID0gbV9uRGVmYXVsdFNjYWxlRGVub20gKiBtX0Rvd25TY2FsZTsKKyAgbV9PdXRwdXRXaWR0aCA9IChtX09yaWdXaWR0aCArIG1fRG93blNjYWxlIC0gMSkgLyBtX0Rvd25TY2FsZTsKKyAgbV9PdXRwdXRIZWlnaHQgPSAobV9PcmlnSGVpZ2h0ICsgbV9Eb3duU2NhbGUgLSAxKSAvIG1fRG93blNjYWxlOworICBpZiAoIWpwZWdfc3RhcnRfZGVjb21wcmVzcygmY2luZm8pKSB7CisgICAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKChpbnQpY2luZm8ub3V0cHV0X3dpZHRoID4gbV9PcmlnV2lkdGgpIHsKKyAgICBGWFNZU19hc3NlcnQoRkFMU0UpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX2JTdGFydGVkID0gVFJVRTsKKyAgcmV0dXJuIFRSVUU7Cit9Cit1aW50OF90KiBDQ29kZWNfSnBlZ0RlY29kZXI6OnZfR2V0TmV4dExpbmUoKSB7CisgIGlmIChzZXRqbXAobV9KbXBCdWYpID09IC0xKQorICAgIHJldHVybiBudWxscHRyOworCisgIGludCBubGluZXMgPSBqcGVnX3JlYWRfc2NhbmxpbmVzKCZjaW5mbywgJm1fcFNjYW5saW5lQnVmLCAxKTsKKyAgaWYgKG5saW5lcyA8IDEpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gbV9wU2NhbmxpbmVCdWY7Cit9CitGWF9EV09SRCBDQ29kZWNfSnBlZ0RlY29kZXI6OkdldFNyY09mZnNldCgpIHsKKyAgcmV0dXJuIChGWF9EV09SRCkobV9TcmNTaXplIC0gc3JjLmJ5dGVzX2luX2J1ZmZlcik7Cit9CitJQ29kZWNfU2NhbmxpbmVEZWNvZGVyKiBDQ29kZWNfSnBlZ01vZHVsZTo6Q3JlYXRlRGVjb2RlcigKKyAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgIEZYX0RXT1JEIHNyY19zaXplLAorICAgIGludCB3aWR0aCwKKyAgICBpbnQgaGVpZ2h0LAorICAgIGludCBuQ29tcHMsCisgICAgRlhfQk9PTCBDb2xvclRyYW5zZm9ybSkgeworICBpZiAoIXNyY19idWYgfHwgc3JjX3NpemUgPT0gMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENDb2RlY19KcGVnRGVjb2RlciogcERlY29kZXIgPSBuZXcgQ0NvZGVjX0pwZWdEZWNvZGVyOworICBpZiAoIXBEZWNvZGVyLT5DcmVhdGUoc3JjX2J1Ziwgc3JjX3NpemUsIHdpZHRoLCBoZWlnaHQsIG5Db21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yVHJhbnNmb3JtKSkgeworICAgIGRlbGV0ZSBwRGVjb2RlcjsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gcERlY29kZXI7Cit9CitGWF9CT09MIENDb2RlY19KcGVnTW9kdWxlOjpMb2FkSW5mbyhjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG51bV9jb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBiaXRzX3Blcl9jb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgY29sb3JfdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGljY19idWZfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIGljY19sZW5ndGgpIHsKKyAgcmV0dXJuIF9KcGVnTG9hZEluZm8oc3JjX2J1Ziwgc3JjX3NpemUsIHdpZHRoLCBoZWlnaHQsIG51bV9jb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICBiaXRzX3Blcl9jb21wb25lbnRzLCBjb2xvcl90cmFuc2Zvcm0sIGljY19idWZfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICBpY2NfbGVuZ3RoKTsKK30KK0ZYX0JPT0wgQ0NvZGVjX0pwZWdNb2R1bGU6OkVuY29kZShjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFJiBkZXN0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogaWNjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBpY2NfbGVuZ3RoKSB7CisgIGlmIChwU291cmNlLT5HZXRCUFAoKSA8IDggfHwgcFNvdXJjZS0+R2V0UGFsZXR0ZSgpKQorICAgIHJldHVybiBGQUxTRTsKKworICBfSnBlZ0VuY29kZShwU291cmNlLCBkZXN0X2J1ZiwgZGVzdF9zaXplLCBxdWFsaXR5LCBpY2NfYnVmLCBpY2NfbGVuZ3RoKTsKKyAgcmV0dXJuIFRSVUU7CiB9CiBzdHJ1Y3QgRlhKUEVHX0NvbnRleHQgewotICAgIGptcF9idWYJCQltX0p1bXBNYXJrOwotICAgIGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QgbV9JbmZvOwotICAgIGpwZWdfZXJyb3JfbWdyCW1fRXJyTWdyOwotICAgIGpwZWdfc291cmNlX21ncgltX1NyY01ncjsKLSAgICB1bnNpZ25lZCBpbnQJbV9Ta2lwU2l6ZTsKLSAgICB2b2lkKgkJKCptX0FsbG9jRnVuYykodW5zaWduZWQgaW50KTsKLSAgICB2b2lkCQkoKm1fRnJlZUZ1bmMpKHZvaWQqKTsKKyAgam1wX2J1ZiBtX0p1bXBNYXJrOworICBqcGVnX2RlY29tcHJlc3Nfc3RydWN0IG1fSW5mbzsKKyAganBlZ19lcnJvcl9tZ3IgbV9FcnJNZ3I7CisgIGpwZWdfc291cmNlX21nciBtX1NyY01ncjsKKyAgdW5zaWduZWQgaW50IG1fU2tpcFNpemU7CisgIHZvaWQqICgqbV9BbGxvY0Z1bmMpKHVuc2lnbmVkIGludCk7CisgIHZvaWQgKCptX0ZyZWVGdW5jKSh2b2lkKik7CiB9OwogZXh0ZXJuICJDIiB7Ci0gICAgc3RhdGljIHZvaWQgX2Vycm9yX2ZhdGFsMShqX2NvbW1vbl9wdHIgY2luZm8pCi0gICAgewotICAgICAgICBsb25nam1wKCgoRlhKUEVHX0NvbnRleHQqKWNpbmZvLT5jbGllbnRfZGF0YSktPm1fSnVtcE1hcmssIC0xKTsKLSAgICB9CitzdGF0aWMgdm9pZCBfZXJyb3JfZmF0YWwxKGpfY29tbW9uX3B0ciBjaW5mbykgeworICBsb25nam1wKCgoRlhKUEVHX0NvbnRleHQqKWNpbmZvLT5jbGllbnRfZGF0YSktPm1fSnVtcE1hcmssIC0xKTsKK30KIH07CiBleHRlcm4gIkMiIHsKLSAgICBzdGF0aWMgdm9pZCBfc3JjX3NraXBfZGF0YTEoc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNpbmZvLCBsb25nIG51bSkKLSAgICB7Ci0gICAgICAgIGlmIChjaW5mby0+c3JjLT5ieXRlc19pbl9idWZmZXIgPCAoc2l6ZV90KW51bSkgewotICAgICAgICAgICAgKChGWEpQRUdfQ29udGV4dCopY2luZm8tPmNsaWVudF9kYXRhKS0+bV9Ta2lwU2l6ZSA9ICh1bnNpZ25lZCBpbnQpKG51bSAtIGNpbmZvLT5zcmMtPmJ5dGVzX2luX2J1ZmZlcik7Ci0gICAgICAgICAgICBjaW5mby0+c3JjLT5ieXRlc19pbl9idWZmZXIgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2luZm8tPnNyYy0+bmV4dF9pbnB1dF9ieXRlICs9IG51bTsKLSAgICAgICAgICAgIGNpbmZvLT5zcmMtPmJ5dGVzX2luX2J1ZmZlciAtPSBudW07Ci0gICAgICAgIH0KLSAgICB9CitzdGF0aWMgdm9pZCBfc3JjX3NraXBfZGF0YTEoc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNpbmZvLCBsb25nIG51bSkgeworICBpZiAoY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyIDwgKHNpemVfdCludW0pIHsKKyAgICAoKEZYSlBFR19Db250ZXh0KiljaW5mby0+Y2xpZW50X2RhdGEpLT5tX1NraXBTaXplID0KKyAgICAgICAgKHVuc2lnbmVkIGludCkobnVtIC0gY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyKTsKKyAgICBjaW5mby0+c3JjLT5ieXRlc19pbl9idWZmZXIgPSAwOworICB9IGVsc2UgeworICAgIGNpbmZvLT5zcmMtPm5leHRfaW5wdXRfYnl0ZSArPSBudW07CisgICAgY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyIC09IG51bTsKKyAgfQorfQogfTsKLXN0YXRpYyB2b2lkKiBqcGVnX2FsbG9jX2Z1bmModW5zaWduZWQgaW50IHNpemUpCi17Ci0gICAgcmV0dXJuIEZYX0FsbG9jKGNoYXIsIHNpemUpOworc3RhdGljIHZvaWQqIGpwZWdfYWxsb2NfZnVuYyh1bnNpZ25lZCBpbnQgc2l6ZSkgeworICByZXR1cm4gRlhfQWxsb2MoY2hhciwgc2l6ZSk7CiB9Ci1zdGF0aWMgdm9pZCBqcGVnX2ZyZWVfZnVuYyh2b2lkKiBwKQotewotICAgIEZYX0ZyZWUocCk7CitzdGF0aWMgdm9pZCBqcGVnX2ZyZWVfZnVuYyh2b2lkKiBwKSB7CisgIEZYX0ZyZWUocCk7CiB9Ci12b2lkKiBDQ29kZWNfSnBlZ01vZHVsZTo6U3RhcnQoKQotewotICAgIGlmIChtX3BFeHRQcm92aWRlcikgewotICAgICAgICByZXR1cm4gbV9wRXh0UHJvdmlkZXItPlN0YXJ0KCk7Ci0gICAgfQotICAgIEZYSlBFR19Db250ZXh0KiBwID0gKEZYSlBFR19Db250ZXh0KilGWF9BbGxvYyhGWF9CWVRFLCBzaXplb2YoRlhKUEVHX0NvbnRleHQpKTsKLSAgICBwLT5tX0FsbG9jRnVuYyA9IGpwZWdfYWxsb2NfZnVuYzsKLSAgICBwLT5tX0ZyZWVGdW5jID0ganBlZ19mcmVlX2Z1bmM7Ci0gICAgcC0+bV9FcnJNZ3IuZXJyb3JfZXhpdCA9IF9lcnJvcl9mYXRhbDE7Ci0gICAgcC0+bV9FcnJNZ3IuZW1pdF9tZXNzYWdlID0gX2Vycm9yX2RvX25vdGhpbmcxOwotICAgIHAtPm1fRXJyTWdyLm91dHB1dF9tZXNzYWdlID0gX2Vycm9yX2RvX25vdGhpbmc7Ci0gICAgcC0+bV9FcnJNZ3IuZm9ybWF0X21lc3NhZ2UgPSBfZXJyb3JfZG9fbm90aGluZzI7Ci0gICAgcC0+bV9FcnJNZ3IucmVzZXRfZXJyb3JfbWdyID0gX2Vycm9yX2RvX25vdGhpbmc7Ci0gICAgcC0+bV9TcmNNZ3IuaW5pdF9zb3VyY2UgPSBfc3JjX2RvX25vdGhpbmc7Ci0gICAgcC0+bV9TcmNNZ3IudGVybV9zb3VyY2UgPSBfc3JjX2RvX25vdGhpbmc7Ci0gICAgcC0+bV9TcmNNZ3Iuc2tpcF9pbnB1dF9kYXRhID0gX3NyY19za2lwX2RhdGExOwotICAgIHAtPm1fU3JjTWdyLmZpbGxfaW5wdXRfYnVmZmVyID0gX3NyY19maWxsX2J1ZmZlcjsKLSAgICBwLT5tX1NyY01nci5yZXN5bmNfdG9fcmVzdGFydCA9IF9zcmNfcmVzeW5jOwotICAgIHAtPm1fSW5mby5jbGllbnRfZGF0YSA9IHA7Ci0gICAgcC0+bV9JbmZvLmVyciA9ICZwLT5tX0Vyck1ncjsKLSAgICBpZiAoc2V0am1wKHAtPm1fSnVtcE1hcmspID09IC0xKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKCZwLT5tX0luZm8pOwotICAgIHAtPm1fSW5mby5zcmMgPSAmcC0+bV9TcmNNZ3I7Ci0gICAgcC0+bV9Ta2lwU2l6ZSA9IDA7Ci0gICAgcmV0dXJuIHA7Ci19Ci12b2lkIENDb2RlY19KcGVnTW9kdWxlOjpGaW5pc2godm9pZCogcENvbnRleHQpCi17Ci0gICAgaWYgKG1fcEV4dFByb3ZpZGVyKSB7Ci0gICAgICAgIG1fcEV4dFByb3ZpZGVyLT5GaW5pc2gocENvbnRleHQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYSlBFR19Db250ZXh0KiBwID0gKEZYSlBFR19Db250ZXh0KilwQ29udGV4dDsKLSAgICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmcC0+bV9JbmZvKTsKLSAgICBwLT5tX0ZyZWVGdW5jKHApOwotfQotdm9pZCBDQ29kZWNfSnBlZ01vZHVsZTo6SW5wdXQodm9pZCogcENvbnRleHQsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplKQotewotICAgIGlmIChtX3BFeHRQcm92aWRlcikgewotICAgICAgICBtX3BFeHRQcm92aWRlci0+SW5wdXQocENvbnRleHQsIHNyY19idWYsIHNyY19zaXplKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWEpQRUdfQ29udGV4dCogcCA9IChGWEpQRUdfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgaWYgKHAtPm1fU2tpcFNpemUpIHsKLSAgICAgICAgaWYgKHAtPm1fU2tpcFNpemUgPiBzcmNfc2l6ZSkgewotICAgICAgICAgICAgcC0+bV9TcmNNZ3IuYnl0ZXNfaW5fYnVmZmVyID0gMDsKLSAgICAgICAgICAgIHAtPm1fU2tpcFNpemUgLT0gc3JjX3NpemU7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3JjX3NpemUgLT0gcC0+bV9Ta2lwU2l6ZTsKLSAgICAgICAgc3JjX2J1ZiArPSBwLT5tX1NraXBTaXplOwotICAgICAgICBwLT5tX1NraXBTaXplID0gMDsKLSAgICB9Ci0gICAgcC0+bV9TcmNNZ3IubmV4dF9pbnB1dF9ieXRlID0gc3JjX2J1ZjsKLSAgICBwLT5tX1NyY01nci5ieXRlc19pbl9idWZmZXIgPSBzcmNfc2l6ZTsKLX0KLWludCBDQ29kZWNfSnBlZ01vZHVsZTo6UmVhZEhlYWRlcih2b2lkKiBwQ29udGV4dCwgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsIGludCogbkNvbXBzKQotewotICAgIGlmIChtX3BFeHRQcm92aWRlcikgewotICAgICAgICByZXR1cm4gbV9wRXh0UHJvdmlkZXItPlJlYWRIZWFkZXIocENvbnRleHQsIHdpZHRoLCBoZWlnaHQsIG5Db21wcyk7Ci0gICAgfQotICAgIEZYSlBFR19Db250ZXh0KiBwID0gKEZYSlBFR19Db250ZXh0KilwQ29udGV4dDsKLSAgICBpZiAoc2V0am1wKHAtPm1fSnVtcE1hcmspID09IC0xKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpbnQgcmV0ID0ganBlZ19yZWFkX2hlYWRlcigmcC0+bV9JbmZvLCB0cnVlKTsKLSAgICBpZiAocmV0ID09IEpQRUdfU1VTUEVOREVEKSB7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLSAgICBpZiAocmV0ICE9IEpQRUdfSEVBREVSX09LKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICAqd2lkdGggPSBwLT5tX0luZm8uaW1hZ2Vfd2lkdGg7Ci0gICAgKmhlaWdodCA9IHAtPm1fSW5mby5pbWFnZV9oZWlnaHQ7Ci0gICAgKm5Db21wcyA9IHAtPm1fSW5mby5udW1fY29tcG9uZW50czsKK3ZvaWQqIENDb2RlY19KcGVnTW9kdWxlOjpTdGFydCgpIHsKKyAgRlhKUEVHX0NvbnRleHQqIHAgPSBGWF9BbGxvYyhGWEpQRUdfQ29udGV4dCwgMSk7CisgIHAtPm1fQWxsb2NGdW5jID0ganBlZ19hbGxvY19mdW5jOworICBwLT5tX0ZyZWVGdW5jID0ganBlZ19mcmVlX2Z1bmM7CisgIHAtPm1fRXJyTWdyLmVycm9yX2V4aXQgPSBfZXJyb3JfZmF0YWwxOworICBwLT5tX0Vyck1nci5lbWl0X21lc3NhZ2UgPSBfZXJyb3JfZG9fbm90aGluZzE7CisgIHAtPm1fRXJyTWdyLm91dHB1dF9tZXNzYWdlID0gX2Vycm9yX2RvX25vdGhpbmc7CisgIHAtPm1fRXJyTWdyLmZvcm1hdF9tZXNzYWdlID0gX2Vycm9yX2RvX25vdGhpbmcyOworICBwLT5tX0Vyck1nci5yZXNldF9lcnJvcl9tZ3IgPSBfZXJyb3JfZG9fbm90aGluZzsKKyAgcC0+bV9TcmNNZ3IuaW5pdF9zb3VyY2UgPSBfc3JjX2RvX25vdGhpbmc7CisgIHAtPm1fU3JjTWdyLnRlcm1fc291cmNlID0gX3NyY19kb19ub3RoaW5nOworICBwLT5tX1NyY01nci5za2lwX2lucHV0X2RhdGEgPSBfc3JjX3NraXBfZGF0YTE7CisgIHAtPm1fU3JjTWdyLmZpbGxfaW5wdXRfYnVmZmVyID0gX3NyY19maWxsX2J1ZmZlcjsKKyAgcC0+bV9TcmNNZ3IucmVzeW5jX3RvX3Jlc3RhcnQgPSBfc3JjX3Jlc3luYzsKKyAgcC0+bV9JbmZvLmNsaWVudF9kYXRhID0gcDsKKyAgcC0+bV9JbmZvLmVyciA9ICZwLT5tX0Vyck1ncjsKKyAgaWYgKHNldGptcChwLT5tX0p1bXBNYXJrKSA9PSAtMSkgewogICAgIHJldHVybiAwOworICB9CisgIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoJnAtPm1fSW5mbyk7CisgIHAtPm1fSW5mby5zcmMgPSAmcC0+bV9TcmNNZ3I7CisgIHAtPm1fU2tpcFNpemUgPSAwOworICByZXR1cm4gcDsKIH0KLUZYX0JPT0wgQ0NvZGVjX0pwZWdNb2R1bGU6OlN0YXJ0U2NhbmxpbmUodm9pZCogcENvbnRleHQsIGludCBkb3duX3NjYWxlKQotewotICAgIGlmIChtX3BFeHRQcm92aWRlcikgewotICAgICAgICByZXR1cm4gbV9wRXh0UHJvdmlkZXItPlN0YXJ0U2NhbmxpbmUocENvbnRleHQsIGRvd25fc2NhbGUpOwotICAgIH0KLSAgICBGWEpQRUdfQ29udGV4dCogcCA9IChGWEpQRUdfQ29udGV4dCopcENvbnRleHQ7Ci0gICAgaWYgKHNldGptcChwLT5tX0p1bXBNYXJrKSA9PSAtMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHAtPm1fSW5mby5zY2FsZV9kZW5vbSA9IGRvd25fc2NhbGU7Ci0gICAgcmV0dXJuIGpwZWdfc3RhcnRfZGVjb21wcmVzcygmcC0+bV9JbmZvKTsKK3ZvaWQgQ0NvZGVjX0pwZWdNb2R1bGU6OkZpbmlzaCh2b2lkKiBwQ29udGV4dCkgeworICBGWEpQRUdfQ29udGV4dCogcCA9IChGWEpQRUdfQ29udGV4dCopcENvbnRleHQ7CisgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZwLT5tX0luZm8pOworICBwLT5tX0ZyZWVGdW5jKHApOwogfQotRlhfQk9PTCBDQ29kZWNfSnBlZ01vZHVsZTo6UmVhZFNjYW5saW5lKHZvaWQqIHBDb250ZXh0LCB1bnNpZ25lZCBjaGFyKiBkZXN0X2J1ZikKLXsKLSAgICBpZiAobV9wRXh0UHJvdmlkZXIpIHsKLSAgICAgICAgcmV0dXJuIG1fcEV4dFByb3ZpZGVyLT5SZWFkU2NhbmxpbmUocENvbnRleHQsIGRlc3RfYnVmKTsKK3ZvaWQgQ0NvZGVjX0pwZWdNb2R1bGU6OklucHV0KHZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplKSB7CisgIEZYSlBFR19Db250ZXh0KiBwID0gKEZYSlBFR19Db250ZXh0KilwQ29udGV4dDsKKyAgaWYgKHAtPm1fU2tpcFNpemUpIHsKKyAgICBpZiAocC0+bV9Ta2lwU2l6ZSA+IHNyY19zaXplKSB7CisgICAgICBwLT5tX1NyY01nci5ieXRlc19pbl9idWZmZXIgPSAwOworICAgICAgcC0+bV9Ta2lwU2l6ZSAtPSBzcmNfc2l6ZTsKKyAgICAgIHJldHVybjsKICAgICB9Ci0gICAgRlhKUEVHX0NvbnRleHQqIHAgPSAoRlhKUEVHX0NvbnRleHQqKXBDb250ZXh0OwotICAgIGlmIChzZXRqbXAocC0+bV9KdW1wTWFyaykgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpbnQgbmxpbmVzID0ganBlZ19yZWFkX3NjYW5saW5lcygmcC0+bV9JbmZvLCAmZGVzdF9idWYsIDEpOwotICAgIHJldHVybiBubGluZXMgPT0gMTsKKyAgICBzcmNfc2l6ZSAtPSBwLT5tX1NraXBTaXplOworICAgIHNyY19idWYgKz0gcC0+bV9Ta2lwU2l6ZTsKKyAgICBwLT5tX1NraXBTaXplID0gMDsKKyAgfQorICBwLT5tX1NyY01nci5uZXh0X2lucHV0X2J5dGUgPSBzcmNfYnVmOworICBwLT5tX1NyY01nci5ieXRlc19pbl9idWZmZXIgPSBzcmNfc2l6ZTsKIH0KLUZYX0RXT1JEIENDb2RlY19KcGVnTW9kdWxlOjpHZXRBdmFpbElucHV0KHZvaWQqIHBDb250ZXh0LCBGWF9MUEJZVEUqIGF2YWlsX2J1Zl9wdHIpCi17Ci0gICAgaWYgKG1fcEV4dFByb3ZpZGVyKSB7Ci0gICAgICAgIHJldHVybiBtX3BFeHRQcm92aWRlci0+R2V0QXZhaWxJbnB1dChwQ29udGV4dCwgYXZhaWxfYnVmX3B0cik7CisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQoraW50IENDb2RlY19KcGVnTW9kdWxlOjpSZWFkSGVhZGVyKHZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBuQ29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkgeworI2Vsc2UgICAvLyBQREZfRU5BQkxFX1hGQQoraW50IENDb2RlY19KcGVnTW9kdWxlOjpSZWFkSGVhZGVyKHZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBuQ29tcHMpIHsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgRlhKUEVHX0NvbnRleHQqIHAgPSAoRlhKUEVHX0NvbnRleHQqKXBDb250ZXh0OworICBpZiAoc2V0am1wKHAtPm1fSnVtcE1hcmspID09IC0xKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaW50IHJldCA9IGpwZWdfcmVhZF9oZWFkZXIoJnAtPm1fSW5mbywgdHJ1ZSk7CisgIGlmIChyZXQgPT0gSlBFR19TVVNQRU5ERUQpIHsKKyAgICByZXR1cm4gMjsKKyAgfQorICBpZiAocmV0ICE9IEpQRUdfSEVBREVSX09LKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgKndpZHRoID0gcC0+bV9JbmZvLmltYWdlX3dpZHRoOworICAqaGVpZ2h0ID0gcC0+bV9JbmZvLmltYWdlX2hlaWdodDsKKyAgKm5Db21wcyA9IHAtPm1fSW5mby5udW1fY29tcG9uZW50czsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBfSnBlZ0xvYWRBdHRyaWJ1dGUoJnAtPm1fSW5mbywgcEF0dHJpYnV0ZSk7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CitpbnQgQ0NvZGVjX0pwZWdNb2R1bGU6OlN0YXJ0U2NhbmxpbmUodm9pZCogcENvbnRleHQsIGludCBkb3duX3NjYWxlKSB7CisgIEZYSlBFR19Db250ZXh0KiBwID0gKEZYSlBFR19Db250ZXh0KilwQ29udGV4dDsKKyAgaWYgKHNldGptcChwLT5tX0p1bXBNYXJrKSA9PSAtMSkgeworICAgIHJldHVybiAwOworICB9CisgIHAtPm1fSW5mby5zY2FsZV9kZW5vbSA9IGRvd25fc2NhbGU7CisgIHJldHVybiBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoJnAtPm1fSW5mbyk7Cit9CitGWF9CT09MIENDb2RlY19KcGVnTW9kdWxlOjpSZWFkU2NhbmxpbmUodm9pZCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogZGVzdF9idWYpIHsKKyAgRlhKUEVHX0NvbnRleHQqIHAgPSAoRlhKUEVHX0NvbnRleHQqKXBDb250ZXh0OworICBpZiAoc2V0am1wKHAtPm1fSnVtcE1hcmspID09IC0xKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGludCBubGluZXMgPSBqcGVnX3JlYWRfc2NhbmxpbmVzKCZwLT5tX0luZm8sICZkZXN0X2J1ZiwgMSk7CisgIHJldHVybiBubGluZXMgPT0gMTsKK30KK0ZYX0RXT1JEIENDb2RlY19KcGVnTW9kdWxlOjpHZXRBdmFpbElucHV0KHZvaWQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGF2YWlsX2J1Zl9wdHIpIHsKKyAgaWYgKGF2YWlsX2J1Zl9wdHIpIHsKKyAgICAqYXZhaWxfYnVmX3B0ciA9IE5VTEw7CisgICAgaWYgKCgoRlhKUEVHX0NvbnRleHQqKXBDb250ZXh0KS0+bV9TcmNNZ3IuYnl0ZXNfaW5fYnVmZmVyID4gMCkgeworICAgICAgKmF2YWlsX2J1Zl9wdHIgPQorICAgICAgICAgICh1aW50OF90KikoKEZYSlBFR19Db250ZXh0KilwQ29udGV4dCktPm1fU3JjTWdyLm5leHRfaW5wdXRfYnl0ZTsKICAgICB9Ci0gICAgaWYoYXZhaWxfYnVmX3B0ciAhPSBOVUxMKSB7Ci0gICAgICAgICphdmFpbF9idWZfcHRyID0gTlVMTDsKLSAgICAgICAgaWYoKChGWEpQRUdfQ29udGV4dCopcENvbnRleHQpLT5tX1NyY01nci5ieXRlc19pbl9idWZmZXIgPiAwKSB7Ci0gICAgICAgICAgICAqYXZhaWxfYnVmX3B0ciA9IChGWF9MUEJZVEUpKChGWEpQRUdfQ29udGV4dCopcENvbnRleHQpLT5tX1NyY01nci5uZXh0X2lucHV0X2J5dGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChGWF9EV09SRCkoKEZYSlBFR19Db250ZXh0KilwQ29udGV4dCktPm1fU3JjTWdyLmJ5dGVzX2luX2J1ZmZlcjsKKyAgfQorICByZXR1cm4gKEZYX0RXT1JEKSgoRlhKUEVHX0NvbnRleHQqKXBDb250ZXh0KS0+bV9TcmNNZ3IuYnl0ZXNfaW5fYnVmZmVyOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qcHhfb3BqLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanB4X29wai5jcHAKaW5kZXggMWExNjE2Yy4uYzE4NWQyMiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qcHhfb3BqLmNwcAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pweF9vcGouY3BwCkBAIC0xLDgxMiArMSw4ODggQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCiAjaW5jbHVkZSAiY29kZWNfaW50LmgiCi0jaW5jbHVkZSAiLi4vZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9vcGVuanBlZy5oIgotI2luY2x1ZGUgIi4uL2xjbXMyL2luY2x1ZGUvZnhfbGNtczIuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3Jlc291cmNlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc2FmZV90eXBlcy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xjbXMyLTIuNi9pbmNsdWRlL2xjbXMyLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGVuanBlZy5oIgogCi1zdGF0aWMgdm9pZCBmeF9lcnJvcl9jYWxsYmFjayhjb25zdCBjaGFyICptc2csIHZvaWQgKmNsaWVudF9kYXRhKQotewotICAgICh2b2lkKWNsaWVudF9kYXRhOworc3RhdGljIHZvaWQgZnhfZXJyb3JfY2FsbGJhY2soY29uc3QgY2hhciogbXNnLCB2b2lkKiBjbGllbnRfZGF0YSkgeworICAodm9pZCljbGllbnRfZGF0YTsKIH0KLXN0YXRpYyB2b2lkIGZ4X3dhcm5pbmdfY2FsbGJhY2soY29uc3QgY2hhciAqbXNnLCB2b2lkICpjbGllbnRfZGF0YSkKLXsKLSAgICAodm9pZCljbGllbnRfZGF0YTsKK3N0YXRpYyB2b2lkIGZ4X3dhcm5pbmdfY2FsbGJhY2soY29uc3QgY2hhciogbXNnLCB2b2lkKiBjbGllbnRfZGF0YSkgeworICAodm9pZCljbGllbnRfZGF0YTsKIH0KLXN0YXRpYyB2b2lkIGZ4X2luZm9fY2FsbGJhY2soY29uc3QgY2hhciAqbXNnLCB2b2lkICpjbGllbnRfZGF0YSkKLXsKLSAgICAodm9pZCljbGllbnRfZGF0YTsKK3N0YXRpYyB2b2lkIGZ4X2luZm9fY2FsbGJhY2soY29uc3QgY2hhciogbXNnLCB2b2lkKiBjbGllbnRfZGF0YSkgeworICAodm9pZCljbGllbnRfZGF0YTsKIH0KLU9QSl9TSVpFX1Qgb3BqX3JlYWRfZnJvbV9tZW1vcnkodm9pZCogcF9idWZmZXIsIE9QSl9TSVpFX1QgbmJfYnl0ZXMsIHZvaWQqIHBfdXNlcl9kYXRhKQotewotICAgIERlY29kZURhdGEqIHNyY0RhdGEgPSBzdGF0aWNfY2FzdDxEZWNvZGVEYXRhKj4ocF91c2VyX2RhdGEpOwotICAgIGlmICghc3JjRGF0YSB8fCAhc3JjRGF0YS0+c3JjX2RhdGEgfHwgc3JjRGF0YS0+c3JjX3NpemUgPT0gMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIC8vIFJlYWRzIGF0IEVPRiByZXR1cm4gYW4gZXJyb3IgY29kZS4KLSAgICBpZiAoc3JjRGF0YS0+b2Zmc2V0ID49IHNyY0RhdGEtPnNyY19zaXplKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgT1BKX1NJWkVfVCBidWZmZXJMZW5ndGggPSBzcmNEYXRhLT5zcmNfc2l6ZSAtIHNyY0RhdGEtPm9mZnNldDsKLSAgICBPUEpfU0laRV9UIHJlYWRsZW5ndGggPSBuYl9ieXRlcyA8IGJ1ZmZlckxlbmd0aCA/IG5iX2J5dGVzIDogYnVmZmVyTGVuZ3RoOwotICAgIG1lbWNweShwX2J1ZmZlciwgJnNyY0RhdGEtPnNyY19kYXRhW3NyY0RhdGEtPm9mZnNldF0sIHJlYWRsZW5ndGgpOwotICAgIHNyY0RhdGEtPm9mZnNldCArPSByZWFkbGVuZ3RoOwotICAgIHJldHVybiByZWFkbGVuZ3RoOworT1BKX1NJWkVfVCBvcGpfcmVhZF9mcm9tX21lbW9yeSh2b2lkKiBwX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1NJWkVfVCBuYl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF91c2VyX2RhdGEpIHsKKyAgRGVjb2RlRGF0YSogc3JjRGF0YSA9IHN0YXRpY19jYXN0PERlY29kZURhdGEqPihwX3VzZXJfZGF0YSk7CisgIGlmICghc3JjRGF0YSB8fCAhc3JjRGF0YS0+c3JjX2RhdGEgfHwgc3JjRGF0YS0+c3JjX3NpemUgPT0gMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICAvLyBSZWFkcyBhdCBFT0YgcmV0dXJuIGFuIGVycm9yIGNvZGUuCisgIGlmIChzcmNEYXRhLT5vZmZzZXQgPj0gc3JjRGF0YS0+c3JjX3NpemUpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgT1BKX1NJWkVfVCBidWZmZXJMZW5ndGggPSBzcmNEYXRhLT5zcmNfc2l6ZSAtIHNyY0RhdGEtPm9mZnNldDsKKyAgT1BKX1NJWkVfVCByZWFkbGVuZ3RoID0gbmJfYnl0ZXMgPCBidWZmZXJMZW5ndGggPyBuYl9ieXRlcyA6IGJ1ZmZlckxlbmd0aDsKKyAgbWVtY3B5KHBfYnVmZmVyLCAmc3JjRGF0YS0+c3JjX2RhdGFbc3JjRGF0YS0+b2Zmc2V0XSwgcmVhZGxlbmd0aCk7CisgIHNyY0RhdGEtPm9mZnNldCArPSByZWFkbGVuZ3RoOworICByZXR1cm4gcmVhZGxlbmd0aDsKIH0KLU9QSl9TSVpFX1Qgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KHZvaWQqIHBfYnVmZmVyLCBPUEpfU0laRV9UIG5iX2J5dGVzLCB2b2lkKiBwX3VzZXJfZGF0YSkKLXsKLSAgICBEZWNvZGVEYXRhKiBzcmNEYXRhID0gc3RhdGljX2Nhc3Q8RGVjb2RlRGF0YSo+KHBfdXNlcl9kYXRhKTsKLSAgICBpZiAoIXNyY0RhdGEgfHwgIXNyY0RhdGEtPnNyY19kYXRhIHx8IHNyY0RhdGEtPnNyY19zaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAvLyBXcml0ZXMgYXQgRU9GIHJldHVybiBhbiBlcnJvciBjb2RlLgotICAgIGlmIChzcmNEYXRhLT5vZmZzZXQgPj0gc3JjRGF0YS0+c3JjX3NpemUpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBPUEpfU0laRV9UIGJ1ZmZlckxlbmd0aCA9IHNyY0RhdGEtPnNyY19zaXplIC0gc3JjRGF0YS0+b2Zmc2V0OwotICAgIE9QSl9TSVpFX1Qgd3JpdGVMZW5ndGggPSBuYl9ieXRlcyA8IGJ1ZmZlckxlbmd0aCA/IG5iX2J5dGVzIDogYnVmZmVyTGVuZ3RoOwotICAgIG1lbWNweSgmc3JjRGF0YS0+c3JjX2RhdGFbc3JjRGF0YS0+b2Zmc2V0XSwgcF9idWZmZXIsIHdyaXRlTGVuZ3RoKTsKLSAgICBzcmNEYXRhLT5vZmZzZXQgKz0gd3JpdGVMZW5ndGg7Ci0gICAgcmV0dXJuIHdyaXRlTGVuZ3RoOworT1BKX1NJWkVfVCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkodm9pZCogcF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfU0laRV9UIG5iX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF91c2VyX2RhdGEpIHsKKyAgRGVjb2RlRGF0YSogc3JjRGF0YSA9IHN0YXRpY19jYXN0PERlY29kZURhdGEqPihwX3VzZXJfZGF0YSk7CisgIGlmICghc3JjRGF0YSB8fCAhc3JjRGF0YS0+c3JjX2RhdGEgfHwgc3JjRGF0YS0+c3JjX3NpemUgPT0gMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICAvLyBXcml0ZXMgYXQgRU9GIHJldHVybiBhbiBlcnJvciBjb2RlLgorICBpZiAoc3JjRGF0YS0+b2Zmc2V0ID49IHNyY0RhdGEtPnNyY19zaXplKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIE9QSl9TSVpFX1QgYnVmZmVyTGVuZ3RoID0gc3JjRGF0YS0+c3JjX3NpemUgLSBzcmNEYXRhLT5vZmZzZXQ7CisgIE9QSl9TSVpFX1Qgd3JpdGVMZW5ndGggPSBuYl9ieXRlcyA8IGJ1ZmZlckxlbmd0aCA/IG5iX2J5dGVzIDogYnVmZmVyTGVuZ3RoOworICBtZW1jcHkoJnNyY0RhdGEtPnNyY19kYXRhW3NyY0RhdGEtPm9mZnNldF0sIHBfYnVmZmVyLCB3cml0ZUxlbmd0aCk7CisgIHNyY0RhdGEtPm9mZnNldCArPSB3cml0ZUxlbmd0aDsKKyAgcmV0dXJuIHdyaXRlTGVuZ3RoOwogfQotT1BKX09GRl9UIG9wal9za2lwX2Zyb21fbWVtb3J5KE9QSl9PRkZfVCBuYl9ieXRlcywgdm9pZCogcF91c2VyX2RhdGEpCi17Ci0gICAgRGVjb2RlRGF0YSogc3JjRGF0YSA9IHN0YXRpY19jYXN0PERlY29kZURhdGEqPihwX3VzZXJfZGF0YSk7Ci0gICAgaWYgKCFzcmNEYXRhIHx8ICFzcmNEYXRhLT5zcmNfZGF0YSB8fCBzcmNEYXRhLT5zcmNfc2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgLy8gT2Zmc2V0cyBhcmUgc2lnbmVkIGFuZCBtYXkgaW5kaWNhdGUgYSBuZWdhdGl2ZSBza2lwLiBEbyBub3Qgc3VwcG9ydCB0aGlzCi0gICAgLy8gYmVjYXVzZSBvZiB0aGUgc3RyYW5nZSByZXR1cm4gY29udmVudGlvbiB3aGVyZSBlaXRoZXIgYnl0ZXMgc2tpcHBlZCBvcgotICAgIC8vIC0xIGlzIHJldHVybmVkLiBGb2xsb3dpbmcgdGhhdCBjb252ZW50aW9uLCBhIHN1Y2Nlc3NmdWwgcmVsYXRpdmUgc2VlayBvZgotICAgIC8vIC0xIGJ5dGVzIHdvdWxkIGJlIHJlcXVpcmVkIHRvIHRvIGdpdmUgdGhlIHNhbWUgcmVzdWx0IGFzIHRoZSBlcnJvciBjYXNlLgotICAgIGlmIChuYl9ieXRlcyA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAvLyBGSVhNRTogdXNlIHN0ZDo6bWFrZV91bnNpZ25lZDxPUEpfT0ZGX1Q+Ojp0eXBlIG9uY2UgYysrMTEgbGliIGlzIE9LJ2QuCi0gICAgdWludDY0X3QgdW5zaWduZWROYkJ5dGVzID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG5iX2J5dGVzKTsKLSAgICAvLyBBZGRpdGlvbmFsbHksIHRoZSBvZmZzZXQgbWF5IHRha2UgdXMgYmV5b25kIHRoZSByYW5nZSBvZiBhIHNpemVfdCAoZS5nLgotICAgIC8vIDMyLWJpdCBwbGF0Zm9ybXMpLiBJZiBzbywganVzdCBjbGFtcCBhdCBFT0YuCi0gICAgaWYgKHVuc2lnbmVkTmJCeXRlcyA+IHN0ZDo6bnVtZXJpY19saW1pdHM8T1BKX1NJWkVfVD46Om1heCgpIC0gc3JjRGF0YS0+b2Zmc2V0KSB7Ci0gICAgICAgIHNyY0RhdGEtPm9mZnNldCA9IHNyY0RhdGEtPnNyY19zaXplOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIE9QSl9TSVpFX1QgY2hlY2tlZE5iQnl0ZXMgPSBzdGF0aWNfY2FzdDxPUEpfU0laRV9UPih1bnNpZ25lZE5iQnl0ZXMpOwotICAgICAgICAvLyBPdGhlcndpc2UsIG1pbWljIGZzZWVrKCkgc2VtYW50aWNzIHRvIGFsd2F5cyBzdWNjZWVkLCBldmVuIHBhc3QgRU9GLAotICAgICAgICAvLyBjbGFtcGluZyBhdCBFT0YuICBXZSBjYW4gZ2V0IGF3YXkgd2l0aCB0aGlzIHNpbmNlIHdlIGRvbid0IGFjdHVhbGx5Ci0gICAgICAgIC8vIHByb3ZpZGUgbmVnYXRpdmUgcmVsYXRpdmUgc2tpcHMgZnJvbSBiZXlvbmQgRU9GIGJhY2sgdG8gaW5zaWRlIHRoZQotICAgICAgICAvLyBkYXRhLCB3aGljaCB3b3VsZCBiZSB0aGUgb25seSByZWFzb24gdG8gbmVlZCB0byBrbm93IGV4YWN0bHkgaG93IGZhcgotICAgICAgICAvLyBiZXlvbmQgRU9GIHdlIGFyZS4KLSAgICAgICAgc3JjRGF0YS0+b2Zmc2V0ID0gc3RkOjptaW4oc3JjRGF0YS0+b2Zmc2V0ICsgY2hlY2tlZE5iQnl0ZXMsIHNyY0RhdGEtPnNyY19zaXplKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5iX2J5dGVzOworT1BKX09GRl9UIG9wal9za2lwX2Zyb21fbWVtb3J5KE9QSl9PRkZfVCBuYl9ieXRlcywgdm9pZCogcF91c2VyX2RhdGEpIHsKKyAgRGVjb2RlRGF0YSogc3JjRGF0YSA9IHN0YXRpY19jYXN0PERlY29kZURhdGEqPihwX3VzZXJfZGF0YSk7CisgIGlmICghc3JjRGF0YSB8fCAhc3JjRGF0YS0+c3JjX2RhdGEgfHwgc3JjRGF0YS0+c3JjX3NpemUgPT0gMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICAvLyBPZmZzZXRzIGFyZSBzaWduZWQgYW5kIG1heSBpbmRpY2F0ZSBhIG5lZ2F0aXZlIHNraXAuIERvIG5vdCBzdXBwb3J0IHRoaXMKKyAgLy8gYmVjYXVzZSBvZiB0aGUgc3RyYW5nZSByZXR1cm4gY29udmVudGlvbiB3aGVyZSBlaXRoZXIgYnl0ZXMgc2tpcHBlZCBvcgorICAvLyAtMSBpcyByZXR1cm5lZC4gRm9sbG93aW5nIHRoYXQgY29udmVudGlvbiwgYSBzdWNjZXNzZnVsIHJlbGF0aXZlIHNlZWsgb2YKKyAgLy8gLTEgYnl0ZXMgd291bGQgYmUgcmVxdWlyZWQgdG8gdG8gZ2l2ZSB0aGUgc2FtZSByZXN1bHQgYXMgdGhlIGVycm9yIGNhc2UuCisgIGlmIChuYl9ieXRlcyA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgLy8gRklYTUU6IHVzZSBzdGQ6Om1ha2VfdW5zaWduZWQ8T1BKX09GRl9UPjo6dHlwZSBvbmNlIGMrKzExIGxpYiBpcyBPSydkLgorICB1aW50NjRfdCB1bnNpZ25lZE5iQnl0ZXMgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4obmJfYnl0ZXMpOworICAvLyBBZGRpdGlvbmFsbHksIHRoZSBvZmZzZXQgbWF5IHRha2UgdXMgYmV5b25kIHRoZSByYW5nZSBvZiBhIHNpemVfdCAoZS5nLgorICAvLyAzMi1iaXQgcGxhdGZvcm1zKS4gSWYgc28sIGp1c3QgY2xhbXAgYXQgRU9GLgorICBpZiAodW5zaWduZWROYkJ5dGVzID4KKyAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8T1BKX1NJWkVfVD46Om1heCgpIC0gc3JjRGF0YS0+b2Zmc2V0KSB7CisgICAgc3JjRGF0YS0+b2Zmc2V0ID0gc3JjRGF0YS0+c3JjX3NpemU7CisgIH0gZWxzZSB7CisgICAgT1BKX1NJWkVfVCBjaGVja2VkTmJCeXRlcyA9IHN0YXRpY19jYXN0PE9QSl9TSVpFX1Q+KHVuc2lnbmVkTmJCeXRlcyk7CisgICAgLy8gT3RoZXJ3aXNlLCBtaW1pYyBmc2VlaygpIHNlbWFudGljcyB0byBhbHdheXMgc3VjY2VlZCwgZXZlbiBwYXN0IEVPRiwKKyAgICAvLyBjbGFtcGluZyBhdCBFT0YuICBXZSBjYW4gZ2V0IGF3YXkgd2l0aCB0aGlzIHNpbmNlIHdlIGRvbid0IGFjdHVhbGx5CisgICAgLy8gcHJvdmlkZSBuZWdhdGl2ZSByZWxhdGl2ZSBza2lwcyBmcm9tIGJleW9uZCBFT0YgYmFjayB0byBpbnNpZGUgdGhlCisgICAgLy8gZGF0YSwgd2hpY2ggd291bGQgYmUgdGhlIG9ubHkgcmVhc29uIHRvIG5lZWQgdG8ga25vdyBleGFjdGx5IGhvdyBmYXIKKyAgICAvLyBiZXlvbmQgRU9GIHdlIGFyZS4KKyAgICBzcmNEYXRhLT5vZmZzZXQgPQorICAgICAgICBzdGQ6Om1pbihzcmNEYXRhLT5vZmZzZXQgKyBjaGVja2VkTmJCeXRlcywgc3JjRGF0YS0+c3JjX3NpemUpOworICB9CisgIHJldHVybiBuYl9ieXRlczsKIH0KLU9QSl9CT09MIG9wal9zZWVrX2Zyb21fbWVtb3J5KE9QSl9PRkZfVCBuYl9ieXRlcywgdm9pZCogcF91c2VyX2RhdGEpCi17Ci0gICAgRGVjb2RlRGF0YSogc3JjRGF0YSA9IHN0YXRpY19jYXN0PERlY29kZURhdGEqPihwX3VzZXJfZGF0YSk7Ci0gICAgaWYgKCFzcmNEYXRhIHx8ICFzcmNEYXRhLT5zcmNfZGF0YSB8fCBzcmNEYXRhLT5zcmNfc2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgfQotICAgIC8vIE9mZnNldHMgYXJlIHNpZ25lZCBhbmQgbWF5IGluZGljYXRlIGEgbmVnYXRpdmUgcG9zaXRpb24sIHdoaWNoIHdvdWxkCi0gICAgLy8gYmUgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gRG8gbm90IHN1cHBvcnQgdGhpcy4KLSAgICBpZiAobmJfYnl0ZXMgPCAwKSB7Ci0gICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgfQotICAgIC8vIEZJWE1FOiB1c2Ugc3RkOjptYWtlX3Vuc2lnbmVkPE9QSl9PRkZfVD46OnR5cGUgb25jZSBjKysxMSBsaWIgaXMgT0snZC4KLSAgICB1aW50NjRfdCB1bnNpZ25lZE5iQnl0ZXMgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4obmJfYnl0ZXMpOwotICAgIC8vIEFkZGl0aW9uYWxseSwgdGhlIG9mZnNldCBtYXkgdGFrZSB1cyBiZXlvbmQgdGhlIHJhbmdlIG9mIGEgc2l6ZV90IChlLmcuCi0gICAgLy8gMzItYml0IHBsYXRmb3JtcykuIElmIHNvLCBqdXN0IGNsYW1wIGF0IEVPRi4KLSAgICBpZiAodW5zaWduZWROYkJ5dGVzID4gc3RkOjpudW1lcmljX2xpbWl0czxPUEpfU0laRV9UPjo6bWF4KCkpIHsKLSAgICAgICAgc3JjRGF0YS0+b2Zmc2V0ID0gc3JjRGF0YS0+c3JjX3NpemU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgT1BKX1NJWkVfVCBjaGVja2VkTmJCeXRlcyA9IHN0YXRpY19jYXN0PE9QSl9TSVpFX1Q+KG5iX2J5dGVzKTsKLSAgICAgICAgLy8gT3RoZXJ3aXNlLCBtaW1pYyBmc2VlaygpIHNlbWFudGljcyB0byBhbHdheXMgc3VjY2VlZCwgZXZlbiBwYXN0IEVPRiwKLSAgICAgICAgLy8gYWdhaW4gY2xhbXBpbmcgYXQgRU9GLgotICAgICAgICBzcmNEYXRhLT5vZmZzZXQgPSBzdGQ6Om1pbihjaGVja2VkTmJCeXRlcywgc3JjRGF0YS0+c3JjX3NpemUpOwotICAgIH0KLSAgICByZXR1cm4gT1BKX1RSVUU7CitPUEpfQk9PTCBvcGpfc2Vla19mcm9tX21lbW9yeShPUEpfT0ZGX1QgbmJfYnl0ZXMsIHZvaWQqIHBfdXNlcl9kYXRhKSB7CisgIERlY29kZURhdGEqIHNyY0RhdGEgPSBzdGF0aWNfY2FzdDxEZWNvZGVEYXRhKj4ocF91c2VyX2RhdGEpOworICBpZiAoIXNyY0RhdGEgfHwgIXNyY0RhdGEtPnNyY19kYXRhIHx8IHNyY0RhdGEtPnNyY19zaXplID09IDApIHsKKyAgICByZXR1cm4gT1BKX0ZBTFNFOworICB9CisgIC8vIE9mZnNldHMgYXJlIHNpZ25lZCBhbmQgbWF5IGluZGljYXRlIGEgbmVnYXRpdmUgcG9zaXRpb24sIHdoaWNoIHdvdWxkCisgIC8vIGJlIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuIERvIG5vdCBzdXBwb3J0IHRoaXMuCisgIGlmIChuYl9ieXRlcyA8IDApIHsKKyAgICByZXR1cm4gT1BKX0ZBTFNFOworICB9CisgIC8vIEZJWE1FOiB1c2Ugc3RkOjptYWtlX3Vuc2lnbmVkPE9QSl9PRkZfVD46OnR5cGUgb25jZSBjKysxMSBsaWIgaXMgT0snZC4KKyAgdWludDY0X3QgdW5zaWduZWROYkJ5dGVzID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG5iX2J5dGVzKTsKKyAgLy8gQWRkaXRpb25hbGx5LCB0aGUgb2Zmc2V0IG1heSB0YWtlIHVzIGJleW9uZCB0aGUgcmFuZ2Ugb2YgYSBzaXplX3QgKGUuZy4KKyAgLy8gMzItYml0IHBsYXRmb3JtcykuIElmIHNvLCBqdXN0IGNsYW1wIGF0IEVPRi4KKyAgaWYgKHVuc2lnbmVkTmJCeXRlcyA+IHN0ZDo6bnVtZXJpY19saW1pdHM8T1BKX1NJWkVfVD46Om1heCgpKSB7CisgICAgc3JjRGF0YS0+b2Zmc2V0ID0gc3JjRGF0YS0+c3JjX3NpemU7CisgIH0gZWxzZSB7CisgICAgT1BKX1NJWkVfVCBjaGVja2VkTmJCeXRlcyA9IHN0YXRpY19jYXN0PE9QSl9TSVpFX1Q+KG5iX2J5dGVzKTsKKyAgICAvLyBPdGhlcndpc2UsIG1pbWljIGZzZWVrKCkgc2VtYW50aWNzIHRvIGFsd2F5cyBzdWNjZWVkLCBldmVuIHBhc3QgRU9GLAorICAgIC8vIGFnYWluIGNsYW1waW5nIGF0IEVPRi4KKyAgICBzcmNEYXRhLT5vZmZzZXQgPSBzdGQ6Om1pbihjaGVja2VkTmJCeXRlcywgc3JjRGF0YS0+c3JjX3NpemUpOworICB9CisgIHJldHVybiBPUEpfVFJVRTsKIH0KLW9wal9zdHJlYW1fdCogZnhfb3BqX3N0cmVhbV9jcmVhdGVfbWVtb3J5X3N0cmVhbSAoRGVjb2RlRGF0YSogZGF0YSwJT1BKX1NJWkVfVCBwX3NpemUsIAlPUEpfQk9PTCBwX2lzX3JlYWRfc3RyZWFtKQotewotICAgIG9wal9zdHJlYW1fdCogbF9zdHJlYW0gPSAwMDsKLSAgICBpZiAoIWRhdGEgfHwgISBkYXRhLT5zcmNfZGF0YSB8fCBkYXRhLT5zcmNfc2l6ZSA8PSAwICkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgbF9zdHJlYW0gPSBvcGpfc3RyZWFtX2NyZWF0ZShwX3NpemUsIHBfaXNfcmVhZF9zdHJlYW0pOwotICAgIGlmICghIGxfc3RyZWFtKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBvcGpfc3RyZWFtX3NldF91c2VyX2RhdGEobF9zdHJlYW0sIGRhdGEsIE5VTEwpOwotICAgIG9wal9zdHJlYW1fc2V0X3VzZXJfZGF0YV9sZW5ndGgobF9zdHJlYW0sIGRhdGEtPnNyY19zaXplKTsKLSAgICBvcGpfc3RyZWFtX3NldF9yZWFkX2Z1bmN0aW9uKGxfc3RyZWFtLCBvcGpfcmVhZF9mcm9tX21lbW9yeSk7Ci0gICAgb3BqX3N0cmVhbV9zZXRfd3JpdGVfZnVuY3Rpb24obF9zdHJlYW0sIG9wal93cml0ZV9mcm9tX21lbW9yeSk7Ci0gICAgb3BqX3N0cmVhbV9zZXRfc2tpcF9mdW5jdGlvbihsX3N0cmVhbSwgb3BqX3NraXBfZnJvbV9tZW1vcnkpOwotICAgIG9wal9zdHJlYW1fc2V0X3NlZWtfZnVuY3Rpb24obF9zdHJlYW0sIG9wal9zZWVrX2Zyb21fbWVtb3J5KTsKLSAgICByZXR1cm4gbF9zdHJlYW07CitvcGpfc3RyZWFtX3QqIGZ4X29wal9zdHJlYW1fY3JlYXRlX21lbW9yeV9zdHJlYW0oRGVjb2RlRGF0YSogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfU0laRV9UIHBfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQk9PTCBwX2lzX3JlYWRfc3RyZWFtKSB7CisgIG9wal9zdHJlYW1fdCogbF9zdHJlYW0gPSAwMDsKKyAgaWYgKCFkYXRhIHx8ICFkYXRhLT5zcmNfZGF0YSB8fCBkYXRhLT5zcmNfc2l6ZSA8PSAwKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgbF9zdHJlYW0gPSBvcGpfc3RyZWFtX2NyZWF0ZShwX3NpemUsIHBfaXNfcmVhZF9zdHJlYW0pOworICBpZiAoIWxfc3RyZWFtKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgb3BqX3N0cmVhbV9zZXRfdXNlcl9kYXRhKGxfc3RyZWFtLCBkYXRhLCBOVUxMKTsKKyAgb3BqX3N0cmVhbV9zZXRfdXNlcl9kYXRhX2xlbmd0aChsX3N0cmVhbSwgZGF0YS0+c3JjX3NpemUpOworICBvcGpfc3RyZWFtX3NldF9yZWFkX2Z1bmN0aW9uKGxfc3RyZWFtLCBvcGpfcmVhZF9mcm9tX21lbW9yeSk7CisgIG9wal9zdHJlYW1fc2V0X3dyaXRlX2Z1bmN0aW9uKGxfc3RyZWFtLCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkpOworICBvcGpfc3RyZWFtX3NldF9za2lwX2Z1bmN0aW9uKGxfc3RyZWFtLCBvcGpfc2tpcF9mcm9tX21lbW9yeSk7CisgIG9wal9zdHJlYW1fc2V0X3NlZWtfZnVuY3Rpb24obF9zdHJlYW0sIG9wal9zZWVrX2Zyb21fbWVtb3J5KTsKKyAgcmV0dXJuIGxfc3RyZWFtOwogfQotc3RhdGljIHZvaWQgc3ljY190b19yZ2IoaW50IG9mZnNldCwgaW50IHVwYiwgaW50IHksIGludCBjYiwgaW50IGNyLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpvdXRfciwgaW50ICpvdXRfZywgaW50ICpvdXRfYikKLXsKLSAgICBpbnQgciwgZywgYjsKLSAgICBjYiAtPSBvZmZzZXQ7Ci0gICAgY3IgLT0gb2Zmc2V0OwotICAgIHIgPSB5ICsgKGludCkoMS40MDIgKiAoZmxvYXQpY3IpOwotICAgIGlmKHIgPCAwKSB7Ci0gICAgICAgIHIgPSAwOwotICAgIH0gZWxzZSBpZihyID4gdXBiKSB7Ci0gICAgICAgIHIgPSB1cGI7Ci0gICAgfSAqb3V0X3IgPSByOwotICAgIGcgPSB5IC0gKGludCkoMC4zNDQgKiAoZmxvYXQpY2IgKyAwLjcxNCAqIChmbG9hdCljcik7Ci0gICAgaWYoZyA8IDApIHsKLSAgICAgICAgZyA9IDA7Ci0gICAgfSBlbHNlIGlmKGcgPiB1cGIpIHsKLSAgICAgICAgZyA9IHVwYjsKLSAgICB9ICpvdXRfZyA9IGc7Ci0gICAgYiA9IHkgKyAoaW50KSgxLjc3MiAqIChmbG9hdCljYik7Ci0gICAgaWYoYiA8IDApIHsKLSAgICAgICAgYiA9IDA7Ci0gICAgfSBlbHNlIGlmKGIgPiB1cGIpIHsKLSAgICAgICAgYiA9IHVwYjsKLSAgICB9ICpvdXRfYiA9IGI7CitzdGF0aWMgdm9pZCBzeWNjX3RvX3JnYihpbnQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNiLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBvdXRfciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCogb3V0X2csCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG91dF9iKSB7CisgIGludCByLCBnLCBiOworICBjYiAtPSBvZmZzZXQ7CisgIGNyIC09IG9mZnNldDsKKyAgciA9IHkgKyAoaW50KSgxLjQwMiAqIChmbG9hdCljcik7CisgIGlmIChyIDwgMCkgeworICAgIHIgPSAwOworICB9IGVsc2UgaWYgKHIgPiB1cGIpIHsKKyAgICByID0gdXBiOworICB9CisgICpvdXRfciA9IHI7CisgIGcgPSB5IC0gKGludCkoMC4zNDQgKiAoZmxvYXQpY2IgKyAwLjcxNCAqIChmbG9hdCljcik7CisgIGlmIChnIDwgMCkgeworICAgIGcgPSAwOworICB9IGVsc2UgaWYgKGcgPiB1cGIpIHsKKyAgICBnID0gdXBiOworICB9CisgICpvdXRfZyA9IGc7CisgIGIgPSB5ICsgKGludCkoMS43NzIgKiAoZmxvYXQpY2IpOworICBpZiAoYiA8IDApIHsKKyAgICBiID0gMDsKKyAgfSBlbHNlIGlmIChiID4gdXBiKSB7CisgICAgYiA9IHVwYjsKKyAgfQorICAqb3V0X2IgPSBiOwogfQotc3RhdGljIHZvaWQgc3ljYzQ0NF90b19yZ2Iob3BqX2ltYWdlX3QgKmltZykKLXsKLSAgICBpbnQgKmQwLCAqZDEsICpkMiwgKnIsICpnLCAqYjsKLSAgICBjb25zdCBpbnQgKnksICpjYiwgKmNyOwotICAgIGludCBtYXh3LCBtYXhoLCBtYXgsIGksIG9mZnNldCwgdXBiOwotICAgIGkgPSAoaW50KWltZy0+Y29tcHNbMF0ucHJlYzsKLSAgICBvZmZzZXQgPSAxIDw8IChpIC0gMSk7Ci0gICAgdXBiID0gKDEgPDwgaSkgLSAxOwotICAgIG1heHcgPSAoaW50KWltZy0+Y29tcHNbMF0udzsKLSAgICBtYXhoID0gKGludClpbWctPmNvbXBzWzBdLmg7Ci0gICAgbWF4ID0gbWF4dyAqIG1heGg7Ci0gICAgeSA9IGltZy0+Y29tcHNbMF0uZGF0YTsKLSAgICBjYiA9IGltZy0+Y29tcHNbMV0uZGF0YTsKLSAgICBjciA9IGltZy0+Y29tcHNbMl0uZGF0YTsKLSAgICBkMCA9IHIgPSBGWF9BbGxvYyhpbnQsIChzaXplX3QpbWF4KTsKLSAgICBkMSA9IGcgPSBGWF9BbGxvYyhpbnQsIChzaXplX3QpbWF4KTsKLSAgICBkMiA9IGIgPSBGWF9BbGxvYyhpbnQsIChzaXplX3QpbWF4KTsKLSAgICBmb3IoaSA9IDA7IGkgPCBtYXg7ICsraSkgewotICAgICAgICBzeWNjX3RvX3JnYihvZmZzZXQsIHVwYiwgKnksICpjYiwgKmNyLCByLCBnLCBiKTsKLSAgICAgICAgKyt5OwotICAgICAgICArK2NiOwotICAgICAgICArK2NyOwotICAgICAgICArK3I7Ci0gICAgICAgICsrZzsKLSAgICAgICAgKytiOwotICAgIH0KLSAgICBGWF9GcmVlKGltZy0+Y29tcHNbMF0uZGF0YSk7Ci0gICAgaW1nLT5jb21wc1swXS5kYXRhID0gZDA7Ci0gICAgRlhfRnJlZShpbWctPmNvbXBzWzFdLmRhdGEpOwotICAgIGltZy0+Y29tcHNbMV0uZGF0YSA9IGQxOwotICAgIEZYX0ZyZWUoaW1nLT5jb21wc1syXS5kYXRhKTsKLSAgICBpbWctPmNvbXBzWzJdLmRhdGEgPSBkMjsKLX0KLXN0YXRpYyB2b2lkIHN5Y2M0MjJfdG9fcmdiKG9wal9pbWFnZV90ICppbWcpCi17Ci0gICAgaW50ICpkMCwgKmQxLCAqZDIsICpyLCAqZywgKmI7Ci0gICAgY29uc3QgaW50ICp5LCAqY2IsICpjcjsKLSAgICBpbnQgbWF4dywgbWF4aCwgbWF4LCBvZmZzZXQsIHVwYjsKLSAgICBpbnQgaSwgajsKLSAgICBpID0gKGludClpbWctPmNvbXBzWzBdLnByZWM7Ci0gICAgb2Zmc2V0ID0gMSA8PCAoaSAtIDEpOwotICAgIHVwYiA9ICgxIDw8IGkpIC0gMTsKLSAgICBtYXh3ID0gKGludClpbWctPmNvbXBzWzBdLnc7Ci0gICAgbWF4aCA9IChpbnQpaW1nLT5jb21wc1swXS5oOwotICAgIG1heCA9IG1heHcgKiBtYXhoOwotICAgIHkgPSBpbWctPmNvbXBzWzBdLmRhdGE7Ci0gICAgY2IgPSBpbWctPmNvbXBzWzFdLmRhdGE7Ci0gICAgY3IgPSBpbWctPmNvbXBzWzJdLmRhdGE7Ci0gICAgZDAgPSByID0gRlhfQWxsb2MoaW50LCAoc2l6ZV90KW1heCk7Ci0gICAgZDEgPSBnID0gRlhfQWxsb2MoaW50LCAoc2l6ZV90KW1heCk7Ci0gICAgZDIgPSBiID0gRlhfQWxsb2MoaW50LCAoc2l6ZV90KW1heCk7Ci0gICAgZm9yKGkgPSAwOyBpIDwgbWF4aDsgKytpKQotICAgIHsKLSAgICAgICAgZm9yIChqID0gMDsgKE9QSl9VSU5UMzIpaiA8IChtYXh3ICYgfihPUEpfVUlOVDMyKTEpOyBqICs9IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN5Y2NfdG9fcmdiKG9mZnNldCwgdXBiLCAqeSwgKmNiLCAqY3IsIHIsIGcsIGIpOwotICAgICAgICAgICAgKyt5OyArK3I7ICsrZzsgKytiOwotICAgICAgICAgICAgc3ljY190b19yZ2Iob2Zmc2V0LCB1cGIsICp5LCAqY2IsICpjciwgciwgZywgYik7Ci0gICAgICAgICAgICArK3k7ICsrcjsgKytnOyArK2I7ICsrY2I7ICsrY3I7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGogPCBtYXh3KQotICAgICAgICB7Ci0gICAgICAgICAgICBzeWNjX3RvX3JnYihvZmZzZXQsIHVwYiwgKnksICpjYiwgKmNyLCByLCBnLCBiKTsKLSAgICAgICAgICAgICsreTsgKytyOyArK2c7ICsrYjsgKytjYjsgKytjcjsKLSAgICAgICAgfQotICAgIH0KLSAgICBGWF9GcmVlKGltZy0+Y29tcHNbMF0uZGF0YSk7Ci0gICAgaW1nLT5jb21wc1swXS5kYXRhID0gZDA7Ci0gICAgRlhfRnJlZShpbWctPmNvbXBzWzFdLmRhdGEpOwotICAgIGltZy0+Y29tcHNbMV0uZGF0YSA9IGQxOwotICAgIEZYX0ZyZWUoaW1nLT5jb21wc1syXS5kYXRhKTsKLSAgICBpbWctPmNvbXBzWzJdLmRhdGEgPSBkMjsKLSAgICBpbWctPmNvbXBzWzFdLncgPSBtYXh3OwotICAgIGltZy0+Y29tcHNbMV0uaCA9IG1heGg7Ci0gICAgaW1nLT5jb21wc1syXS53ID0gbWF4dzsKLSAgICBpbWctPmNvbXBzWzJdLmggPSBtYXhoOwotICAgIGltZy0+Y29tcHNbMV0udyA9IChPUEpfVUlOVDMyKW1heHc7Ci0gICAgaW1nLT5jb21wc1sxXS5oID0gKE9QSl9VSU5UMzIpbWF4aDsKLSAgICBpbWctPmNvbXBzWzJdLncgPSAoT1BKX1VJTlQzMiltYXh3OwotICAgIGltZy0+Y29tcHNbMl0uaCA9IChPUEpfVUlOVDMyKW1heGg7Ci0gICAgaW1nLT5jb21wc1sxXS5keCA9IGltZy0+Y29tcHNbMF0uZHg7Ci0gICAgaW1nLT5jb21wc1syXS5keCA9IGltZy0+Y29tcHNbMF0uZHg7Ci0gICAgaW1nLT5jb21wc1sxXS5keSA9IGltZy0+Y29tcHNbMF0uZHk7Ci0gICAgaW1nLT5jb21wc1syXS5keSA9IGltZy0+Y29tcHNbMF0uZHk7Ci19Ci1zdGF0aWMgdm9pZCBzeWNjNDIwX3RvX3JnYihvcGpfaW1hZ2VfdCAqaW1nKQotewotICAgIGludCAqZDAsICpkMSwgKmQyLCAqciwgKmcsICpiLCAqbnIsICpuZywgKm5iOwotICAgIGNvbnN0IGludCAqeSwgKmNiLCAqY3IsICpueTsKLSAgICBpbnQgbWF4dywgbWF4aCwgbWF4LCBvZmZzZXQsIHVwYjsKLSAgICBpbnQgaSwgajsKLSAgICBpID0gKGludClpbWctPmNvbXBzWzBdLnByZWM7Ci0gICAgb2Zmc2V0ID0gMSA8PCAoaSAtIDEpOwotICAgIHVwYiA9ICgxIDw8IGkpIC0gMTsKLSAgICBtYXh3ID0gKGludClpbWctPmNvbXBzWzBdLnc7Ci0gICAgbWF4aCA9IChpbnQpaW1nLT5jb21wc1swXS5oOwotICAgIG1heCA9IG1heHcgKiBtYXhoOwotICAgIHkgPSBpbWctPmNvbXBzWzBdLmRhdGE7Ci0gICAgY2IgPSBpbWctPmNvbXBzWzFdLmRhdGE7Ci0gICAgY3IgPSBpbWctPmNvbXBzWzJdLmRhdGE7Ci0gICAgZDAgPSByID0gRlhfQWxsb2MoaW50LCAoc2l6ZV90KW1heCk7Ci0gICAgZDEgPSBnID0gRlhfQWxsb2MoaW50LCAoc2l6ZV90KW1heCk7Ci0gICAgZDIgPSBiID0gRlhfQWxsb2MoaW50LCAoc2l6ZV90KW1heCk7Ci0gICAgZm9yIChpID0gMDsgKE9QSl9VSU5UMzIpaSA8IChtYXhoICYgfihPUEpfVUlOVDMyKTEpOyBpICs9IDIpCi0gICAgewotICAgICAgICBueSA9IHkgKyBtYXh3OwotICAgICAgICBuciA9IHIgKyBtYXh3OwotICAgICAgICBuZyA9IGcgKyBtYXh3OwotICAgICAgICBuYiA9IGIgKyBtYXh3OwotICAgICAgICBmb3IgKGogPSAwOyAoT1BKX1VJTlQzMilqIDwgKG1heHcgJiB+KE9QSl9VSU5UMzIpMSk7IGogKz0gMikKLSAgICAgICAgewotICAgICAgICAgICAgc3ljY190b19yZ2Iob2Zmc2V0LCB1cGIsICp5LCAqY2IsICpjciwgciwgZywgYik7Ci0gICAgICAgICAgICArK3k7ICsrcjsgKytnOyArK2I7Ci0gICAgICAgICAgICBzeWNjX3RvX3JnYihvZmZzZXQsIHVwYiwgKnksICpjYiwgKmNyLCByLCBnLCBiKTsKLSAgICAgICAgICAgICsreTsgKytyOyArK2c7ICsrYjsKLSAgICAgICAgICAgIHN5Y2NfdG9fcmdiKG9mZnNldCwgdXBiLCAqbnksICpjYiwgKmNyLCBuciwgbmcsIG5iKTsKLSAgICAgICAgICAgICsrbnk7ICsrbnI7ICsrbmc7ICsrbmI7Ci0gICAgICAgICAgICBzeWNjX3RvX3JnYihvZmZzZXQsIHVwYiwgKm55LCAqY2IsICpjciwgbnIsIG5nLCBuYik7Ci0gICAgICAgICAgICArK255OyArK25yOyArK25nOyArK25iOyArK2NiOyArK2NyOwotICAgICAgICB9Ci0gICAgICAgIGlmIChqIDwgbWF4dykKLSAgICAgICAgewotICAgICAgICAgICAgc3ljY190b19yZ2Iob2Zmc2V0LCB1cGIsICp5LCAqY2IsICpjciwgciwgZywgYik7Ci0gICAgICAgICAgICArK3k7ICsrcjsgKytnOyArK2I7Ci0gICAgICAgICAgICBzeWNjX3RvX3JnYihvZmZzZXQsIHVwYiwgKm55LCAqY2IsICpjciwgbnIsIG5nLCBuYik7Ci0gICAgICAgICAgICArK255OyArK25yOyArK25nOyArK25iOyArK2NiOyArK2NyOwotICAgICAgICB9Ci0gICAgICAgIHkgKz0gbWF4dzsgciArPSBtYXh3OyBnICs9IG1heHc7IGIgKz0gbWF4dzsKLSAgICB9Ci0gICAgaWYgKGkgPCBtYXhoKQotICAgIHsKLSAgICAgICAgZm9yIChqID0gMDsgKE9QSl9VSU5UMzIpaiA8IChtYXh3ICYgfihPUEpfVUlOVDMyKTEpOyBqICs9IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN5Y2NfdG9fcmdiKG9mZnNldCwgdXBiLCAqeSwgKmNiLCAqY3IsIHIsIGcsIGIpOwotICAgICAgICAgICAgKyt5OyArK3I7ICsrZzsgKytiOwotICAgICAgICAgICAgc3ljY190b19yZ2Iob2Zmc2V0LCB1cGIsICp5LCAqY2IsICpjciwgciwgZywgYik7Ci0gICAgICAgICAgICArK3k7ICsrcjsgKytnOyArK2I7ICsrY2I7ICsrY3I7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGogPCBtYXh3KQotICAgICAgICB7Ci0gICAgICAgICAgICBzeWNjX3RvX3JnYihvZmZzZXQsIHVwYiwgKnksICpjYiwgKmNyLCByLCBnLCBiKTsKLSAgICAgICAgfQotICAgIH0KK3N0YXRpYyB2b2lkIHN5Y2M0NDRfdG9fcmdiKG9wal9pbWFnZV90KiBpbWcpIHsKKyAgaW50IHByZWMgPSBpbWctPmNvbXBzWzBdLnByZWM7CisgIGludCBvZmZzZXQgPSAxIDw8IChwcmVjIC0gMSk7CisgIGludCB1cGIgPSAoMSA8PCBwcmVjKSAtIDE7CisgIE9QSl9VSU5UMzIgbWF4dyA9CisgICAgICBzdGQ6Om1pbihzdGQ6Om1pbihpbWctPmNvbXBzWzBdLncsIGltZy0+Y29tcHNbMV0udyksIGltZy0+Y29tcHNbMl0udyk7CisgIE9QSl9VSU5UMzIgbWF4aCA9CisgICAgICBzdGQ6Om1pbihzdGQ6Om1pbihpbWctPmNvbXBzWzBdLmgsIGltZy0+Y29tcHNbMV0uaCksIGltZy0+Y29tcHNbMl0uaCk7CisgIEZYX1NBRkVfU0laRV9UIG1heF9zaXplID0gbWF4dzsKKyAgbWF4X3NpemUgKj0gbWF4aDsKKyAgaWYgKCFtYXhfc2l6ZS5Jc1ZhbGlkKCkpCisgICAgcmV0dXJuOwogCi0gICAgRlhfRnJlZShpbWctPmNvbXBzWzBdLmRhdGEpOwotICAgIGltZy0+Y29tcHNbMF0uZGF0YSA9IGQwOwotICAgIEZYX0ZyZWUoaW1nLT5jb21wc1sxXS5kYXRhKTsKLSAgICBpbWctPmNvbXBzWzFdLmRhdGEgPSBkMTsKLSAgICBGWF9GcmVlKGltZy0+Y29tcHNbMl0uZGF0YSk7Ci0gICAgaW1nLT5jb21wc1syXS5kYXRhID0gZDI7Ci0gICAgaW1nLT5jb21wc1sxXS53ID0gbWF4dzsKLSAgICBpbWctPmNvbXBzWzFdLmggPSBtYXhoOwotICAgIGltZy0+Y29tcHNbMl0udyA9IG1heHc7Ci0gICAgaW1nLT5jb21wc1syXS5oID0gbWF4aDsKLSAgICBpbWctPmNvbXBzWzFdLncgPSAoT1BKX1VJTlQzMiltYXh3OwotICAgIGltZy0+Y29tcHNbMV0uaCA9IChPUEpfVUlOVDMyKW1heGg7Ci0gICAgaW1nLT5jb21wc1syXS53ID0gKE9QSl9VSU5UMzIpbWF4dzsKLSAgICBpbWctPmNvbXBzWzJdLmggPSAoT1BKX1VJTlQzMiltYXhoOwotICAgIGltZy0+Y29tcHNbMV0uZHggPSBpbWctPmNvbXBzWzBdLmR4OwotICAgIGltZy0+Y29tcHNbMl0uZHggPSBpbWctPmNvbXBzWzBdLmR4OwotICAgIGltZy0+Y29tcHNbMV0uZHkgPSBpbWctPmNvbXBzWzBdLmR5OwotICAgIGltZy0+Y29tcHNbMl0uZHkgPSBpbWctPmNvbXBzWzBdLmR5OworICBjb25zdCBpbnQqIHkgPSBpbWctPmNvbXBzWzBdLmRhdGE7CisgIGNvbnN0IGludCogY2IgPSBpbWctPmNvbXBzWzFdLmRhdGE7CisgIGNvbnN0IGludCogY3IgPSBpbWctPmNvbXBzWzJdLmRhdGE7CisgIGludCAqZDAsICpkMSwgKmQyLCAqciwgKmcsICpiOworICBkMCA9IHIgPSBGWF9BbGxvYyhpbnQsIG1heF9zaXplLlZhbHVlT3JEaWUoKSk7CisgIGQxID0gZyA9IEZYX0FsbG9jKGludCwgbWF4X3NpemUuVmFsdWVPckRpZSgpKTsKKyAgZDIgPSBiID0gRlhfQWxsb2MoaW50LCBtYXhfc2l6ZS5WYWx1ZU9yRGllKCkpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1heF9zaXplLlZhbHVlT3JEaWUoKTsgKytpKSB7CisgICAgc3ljY190b19yZ2Iob2Zmc2V0LCB1cGIsICp5LCAqY2IsICpjciwgciwgZywgYik7CisgICAgKyt5OworICAgICsrY2I7CisgICAgKytjcjsKKyAgICArK3I7CisgICAgKytnOworICAgICsrYjsKKyAgfQorICBGWF9GcmVlKGltZy0+Y29tcHNbMF0uZGF0YSk7CisgIGltZy0+Y29tcHNbMF0uZGF0YSA9IGQwOworICBGWF9GcmVlKGltZy0+Y29tcHNbMV0uZGF0YSk7CisgIGltZy0+Y29tcHNbMV0uZGF0YSA9IGQxOworICBGWF9GcmVlKGltZy0+Y29tcHNbMl0uZGF0YSk7CisgIGltZy0+Y29tcHNbMl0uZGF0YSA9IGQyOwogfQotdm9pZCBjb2xvcl9zeWNjX3RvX3JnYihvcGpfaW1hZ2VfdCAqaW1nKQotewotICAgIGlmKGltZy0+bnVtY29tcHMgPCAzKSB7Ci0gICAgICAgIGltZy0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX0dSQVk7Ci0gICAgICAgIHJldHVybjsKK3N0YXRpYyB2b2lkIHN5Y2M0MjJfdG9fcmdiKG9wal9pbWFnZV90KiBpbWcpIHsKKyAgaW50IHByZWMgPSBpbWctPmNvbXBzWzBdLnByZWM7CisgIGludCBvZmZzZXQgPSAxIDw8IChwcmVjIC0gMSk7CisgIGludCB1cGIgPSAoMSA8PCBwcmVjKSAtIDE7CisgIE9QSl9VSU5UMzIgbWF4dyA9CisgICAgICBzdGQ6Om1pbihzdGQ6Om1pbihpbWctPmNvbXBzWzBdLncsIGltZy0+Y29tcHNbMV0udyksIGltZy0+Y29tcHNbMl0udyk7CisgIE9QSl9VSU5UMzIgbWF4aCA9CisgICAgICBzdGQ6Om1pbihzdGQ6Om1pbihpbWctPmNvbXBzWzBdLmgsIGltZy0+Y29tcHNbMV0uaCksIGltZy0+Y29tcHNbMl0uaCk7CisgIEZYX1NBRkVfU0laRV9UIG1heF9zaXplID0gbWF4dzsKKyAgbWF4X3NpemUgKj0gbWF4aDsKKyAgaWYgKCFtYXhfc2l6ZS5Jc1ZhbGlkKCkpCisgICAgcmV0dXJuOworCisgIGNvbnN0IGludCogeSA9IGltZy0+Y29tcHNbMF0uZGF0YTsKKyAgY29uc3QgaW50KiBjYiA9IGltZy0+Y29tcHNbMV0uZGF0YTsKKyAgY29uc3QgaW50KiBjciA9IGltZy0+Y29tcHNbMl0uZGF0YTsKKyAgaW50ICpkMCwgKmQxLCAqZDIsICpyLCAqZywgKmI7CisgIGQwID0gciA9IEZYX0FsbG9jKGludCwgbWF4X3NpemUuVmFsdWVPckRpZSgpKTsKKyAgZDEgPSBnID0gRlhfQWxsb2MoaW50LCBtYXhfc2l6ZS5WYWx1ZU9yRGllKCkpOworICBkMiA9IGIgPSBGWF9BbGxvYyhpbnQsIG1heF9zaXplLlZhbHVlT3JEaWUoKSk7CisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtYXhoOyArK2kpIHsKKyAgICBPUEpfVUlOVDMyIGo7CisgICAgZm9yIChqID0gMDsgaiA8IChtYXh3ICYgfnN0YXRpY19jYXN0PE9QSl9VSU5UMzI+KDEpKTsgaiArPSAyKSB7CisgICAgICBzeWNjX3RvX3JnYihvZmZzZXQsIHVwYiwgKnksICpjYiwgKmNyLCByLCBnLCBiKTsKKyAgICAgICsreTsKKyAgICAgICsrcjsKKyAgICAgICsrZzsKKyAgICAgICsrYjsKKyAgICAgIHN5Y2NfdG9fcmdiKG9mZnNldCwgdXBiLCAqeSwgKmNiLCAqY3IsIHIsIGcsIGIpOworICAgICAgKyt5OworICAgICAgKytyOworICAgICAgKytnOworICAgICAgKytiOworICAgICAgKytjYjsKKyAgICAgICsrY3I7CiAgICAgfQotICAgIGlmKChpbWctPmNvbXBzWzBdLmR4ID09IDEpCi0gICAgICAgICAgICAmJiAoaW1nLT5jb21wc1sxXS5keCA9PSAyKQotICAgICAgICAgICAgJiYgKGltZy0+Y29tcHNbMl0uZHggPT0gMikKLSAgICAgICAgICAgICYmIChpbWctPmNvbXBzWzBdLmR5ID09IDEpCi0gICAgICAgICAgICAmJiAoaW1nLT5jb21wc1sxXS5keSA9PSAyKQotICAgICAgICAgICAgJiYgKGltZy0+Y29tcHNbMl0uZHkgPT0gMikpIHsKLSAgICAgICAgc3ljYzQyMF90b19yZ2IoaW1nKTsKLSAgICB9IGVsc2UgaWYoKGltZy0+Y29tcHNbMF0uZHggPT0gMSkKLSAgICAgICAgICAgICAgJiYgKGltZy0+Y29tcHNbMV0uZHggPT0gMikKLSAgICAgICAgICAgICAgJiYgKGltZy0+Y29tcHNbMl0uZHggPT0gMikKLSAgICAgICAgICAgICAgJiYgKGltZy0+Y29tcHNbMF0uZHkgPT0gMSkKLSAgICAgICAgICAgICAgJiYgKGltZy0+Y29tcHNbMV0uZHkgPT0gMSkKLSAgICAgICAgICAgICAgJiYgKGltZy0+Y29tcHNbMl0uZHkgPT0gMSkpIHsKLSAgICAgICAgc3ljYzQyMl90b19yZ2IoaW1nKTsKLSAgICB9IGVsc2UgaWYoKGltZy0+Y29tcHNbMF0uZHggPT0gMSkKLSAgICAgICAgICAgICAgJiYgKGltZy0+Y29tcHNbMV0uZHggPT0gMSkKLSAgICAgICAgICAgICAgJiYgKGltZy0+Y29tcHNbMl0uZHggPT0gMSkKLSAgICAgICAgICAgICAgJiYgKGltZy0+Y29tcHNbMF0uZHkgPT0gMSkKLSAgICAgICAgICAgICAgJiYgKGltZy0+Y29tcHNbMV0uZHkgPT0gMSkKLSAgICAgICAgICAgICAgJiYgKGltZy0+Y29tcHNbMl0uZHkgPT0gMSkpIHsKLSAgICAgICAgc3ljYzQ0NF90b19yZ2IoaW1nKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm47CisgICAgaWYgKGogPCBtYXh3KSB7CisgICAgICBzeWNjX3RvX3JnYihvZmZzZXQsIHVwYiwgKnksICpjYiwgKmNyLCByLCBnLCBiKTsKKyAgICAgICsreTsKKyAgICAgICsrcjsKKyAgICAgICsrZzsKKyAgICAgICsrYjsKKyAgICAgICsrY2I7CisgICAgICArK2NyOwogICAgIH0KLSAgICBpbWctPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19TUkdCOworICB9CisgIEZYX0ZyZWUoaW1nLT5jb21wc1swXS5kYXRhKTsKKyAgaW1nLT5jb21wc1swXS5kYXRhID0gZDA7CisgIEZYX0ZyZWUoaW1nLT5jb21wc1sxXS5kYXRhKTsKKyAgaW1nLT5jb21wc1sxXS5kYXRhID0gZDE7CisgIEZYX0ZyZWUoaW1nLT5jb21wc1syXS5kYXRhKTsKKyAgaW1nLT5jb21wc1syXS5kYXRhID0gZDI7CisgIGltZy0+Y29tcHNbMV0udyA9IG1heHc7CisgIGltZy0+Y29tcHNbMV0uaCA9IG1heGg7CisgIGltZy0+Y29tcHNbMl0udyA9IG1heHc7CisgIGltZy0+Y29tcHNbMl0uaCA9IG1heGg7CisgIGltZy0+Y29tcHNbMV0uZHggPSBpbWctPmNvbXBzWzBdLmR4OworICBpbWctPmNvbXBzWzJdLmR4ID0gaW1nLT5jb21wc1swXS5keDsKKyAgaW1nLT5jb21wc1sxXS5keSA9IGltZy0+Y29tcHNbMF0uZHk7CisgIGltZy0+Y29tcHNbMl0uZHkgPSBpbWctPmNvbXBzWzBdLmR5OwogfQotdm9pZCBjb2xvcl9hcHBseV9pY2NfcHJvZmlsZShvcGpfaW1hZ2VfdCAqaW1hZ2UpCi17Ci0gICAgY21zSFBST0ZJTEUgb3V0X3Byb2Y7Ci0gICAgY21zVUludDMyTnVtYmVyIGluX3R5cGU7Ci0gICAgY21zVUludDMyTnVtYmVyIG91dF90eXBlOwotICAgIGludCAqcjsKLSAgICBpbnQgKmc7Ci0gICAgaW50ICpiOwotICAgIGludCBtYXg7Ci0gICAgY21zSFBST0ZJTEUgaW5fcHJvZiA9Ci0gICAgICAgIGNtc09wZW5Qcm9maWxlRnJvbU1lbShpbWFnZS0+aWNjX3Byb2ZpbGVfYnVmLCBpbWFnZS0+aWNjX3Byb2ZpbGVfbGVuKTsKLSAgICBpZihpbl9wcm9mID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOworc3RhdGljIGJvb2wgc3ljYzQyMF9zaXplX2lzX3ZhbGlkKE9QSl9VSU5UMzIgeSwgT1BKX1VJTlQzMiBjYmNyKSB7CisgIGlmICgheSB8fCAhY2JjcikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIChjYmNyID09IHkgLyAyKSB8fCAoKHkgJiAxKSAmJiAoY2JjciA9PSB5IC8gMiArIDEpKTsKK30KK3N0YXRpYyBib29sIHN5Y2M0MjBfbXVzdF9leHRlbmRfY2JjcihPUEpfVUlOVDMyIHksIE9QSl9VSU5UMzIgY2JjcikgeworICByZXR1cm4gKHkgJiAxKSAmJiAoY2JjciA9PSB5IC8gMik7Cit9Cit2b2lkIHN5Y2M0MjBfdG9fcmdiKG9wal9pbWFnZV90KiBpbWcpIHsKKyAgT1BKX1VJTlQzMiBwcmVjID0gaW1nLT5jb21wc1swXS5wcmVjOworICBpZiAoIXByZWMpCisgICAgcmV0dXJuOworICBPUEpfVUlOVDMyIG9mZnNldCA9IDEgPDwgKHByZWMgLSAxKTsKKyAgT1BKX1VJTlQzMiB1cGIgPSAoMSA8PCBwcmVjKSAtIDE7CisgIE9QSl9VSU5UMzIgeXcgPSBpbWctPmNvbXBzWzBdLnc7CisgIE9QSl9VSU5UMzIgeWggPSBpbWctPmNvbXBzWzBdLmg7CisgIE9QSl9VSU5UMzIgY2J3ID0gaW1nLT5jb21wc1sxXS53OworICBPUEpfVUlOVDMyIGNiaCA9IGltZy0+Y29tcHNbMV0uaDsKKyAgT1BKX1VJTlQzMiBjcncgPSBpbWctPmNvbXBzWzJdLnc7CisgIE9QSl9VSU5UMzIgY3JoID0gaW1nLT5jb21wc1syXS5oOworICBpZiAoY2J3ICE9IGNydyB8fCBjYmggIT0gY3JoKQorICAgIHJldHVybjsKKyAgaWYgKCFzeWNjNDIwX3NpemVfaXNfdmFsaWQoeXcsIGNidykgfHwgIXN5Y2M0MjBfc2l6ZV9pc192YWxpZCh5aCwgY2JoKSkKKyAgICByZXR1cm47CisgIGJvb2wgZXh0dyA9IHN5Y2M0MjBfbXVzdF9leHRlbmRfY2Jjcih5dywgY2J3KTsKKyAgYm9vbCBleHRoID0gc3ljYzQyMF9tdXN0X2V4dGVuZF9jYmNyKHloLCBjYmgpOworICBGWF9TQUZFX0RXT1JEIHNhZmVTaXplID0geXc7CisgIHNhZmVTaXplICo9IHloOworICBpZiAoIXNhZmVTaXplLklzVmFsaWQoKSkKKyAgICByZXR1cm47CisgIGludCogciA9IEZYX0FsbG9jKGludCwgc2FmZVNpemUuVmFsdWVPckRpZSgpKTsKKyAgaW50KiBnID0gRlhfQWxsb2MoaW50LCBzYWZlU2l6ZS5WYWx1ZU9yRGllKCkpOworICBpbnQqIGIgPSBGWF9BbGxvYyhpbnQsIHNhZmVTaXplLlZhbHVlT3JEaWUoKSk7CisgIGludCogZDAgPSByOworICBpbnQqIGQxID0gZzsKKyAgaW50KiBkMiA9IGI7CisgIGNvbnN0IGludCogeSA9IGltZy0+Y29tcHNbMF0uZGF0YTsKKyAgY29uc3QgaW50KiBjYiA9IGltZy0+Y29tcHNbMV0uZGF0YTsKKyAgY29uc3QgaW50KiBjciA9IGltZy0+Y29tcHNbMl0uZGF0YTsKKyAgY29uc3QgaW50KiBueSA9IG51bGxwdHI7CisgIGludCogbnIgPSBudWxscHRyOworICBpbnQqIG5nID0gbnVsbHB0cjsKKyAgaW50KiBuYiA9IG51bGxwdHI7CisgIE9QSl9VSU5UMzIgaSA9IDA7CisgIE9QSl9VSU5UMzIgaiA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCAoeWggJiB+KE9QSl9VSU5UMzIpMSk7IGkgKz0gMikgeworICAgIG55ID0geSArIHl3OworICAgIG5yID0gciArIHl3OworICAgIG5nID0gZyArIHl3OworICAgIG5iID0gYiArIHl3OworICAgIGZvciAoaiA9IDA7IGogPCAoeXcgJiB+KE9QSl9VSU5UMzIpMSk7IGogKz0gMikgeworICAgICAgc3ljY190b19yZ2Iob2Zmc2V0LCB1cGIsICp5LCAqY2IsICpjciwgciwgZywgYik7CisgICAgICArK3k7CisgICAgICArK3I7CisgICAgICArK2c7CisgICAgICArK2I7CisgICAgICBzeWNjX3RvX3JnYihvZmZzZXQsIHVwYiwgKnksICpjYiwgKmNyLCByLCBnLCBiKTsKKyAgICAgICsreTsKKyAgICAgICsrcjsKKyAgICAgICsrZzsKKyAgICAgICsrYjsKKyAgICAgIHN5Y2NfdG9fcmdiKG9mZnNldCwgdXBiLCAqbnksICpjYiwgKmNyLCBuciwgbmcsIG5iKTsKKyAgICAgICsrbnk7CisgICAgICArK25yOworICAgICAgKytuZzsKKyAgICAgICsrbmI7CisgICAgICBzeWNjX3RvX3JnYihvZmZzZXQsIHVwYiwgKm55LCAqY2IsICpjciwgbnIsIG5nLCBuYik7CisgICAgICArK255OworICAgICAgKytucjsKKyAgICAgICsrbmc7CisgICAgICArK25iOworICAgICAgKytjYjsKKyAgICAgICsrY3I7CiAgICAgfQotICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgb3V0X3NwYWNlID0gY21zR2V0Q29sb3JTcGFjZShpbl9wcm9mKTsKLSAgICBjbXNVSW50MzJOdW1iZXIgaW50ZW50ID0gY21zR2V0SGVhZGVyUmVuZGVyaW5nSW50ZW50KGluX3Byb2YpOwotICAgIGludCBtYXhfdyA9IChpbnQpaW1hZ2UtPmNvbXBzWzBdLnc7Ci0gICAgaW50IG1heF9oID0gKGludClpbWFnZS0+Y29tcHNbMF0uaDsKLSAgICBpbnQgcHJlYyA9IChpbnQpaW1hZ2UtPmNvbXBzWzBdLnByZWM7Ci0gICAgT1BKX0NPTE9SX1NQQUNFIG9sZHNwYWNlID0gaW1hZ2UtPmNvbG9yX3NwYWNlOwotICAgIGlmKG91dF9zcGFjZSA9PSBjbXNTaWdSZ2JEYXRhKSB7Ci0gICAgICAgIGlmKCBwcmVjIDw9IDggKSB7Ci0gICAgICAgICAgICBpbl90eXBlID0gVFlQRV9SR0JfODsKLSAgICAgICAgICAgIG91dF90eXBlID0gVFlQRV9SR0JfODsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGluX3R5cGUgPSBUWVBFX1JHQl8xNjsKLSAgICAgICAgICAgIG91dF90eXBlID0gVFlQRV9SR0JfMTY7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0X3Byb2YgPSBjbXNDcmVhdGVfc1JHQlByb2ZpbGUoKTsKLSAgICAgICAgaW1hZ2UtPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19TUkdCOwotICAgIH0gZWxzZSBpZihvdXRfc3BhY2UgPT0gY21zU2lnR3JheURhdGEpIHsKLSAgICAgICAgaWYoIHByZWMgPD0gOCApIHsKLSAgICAgICAgICAgIGluX3R5cGUgPSBUWVBFX0dSQVlfODsKLSAgICAgICAgICAgIG91dF90eXBlID0gVFlQRV9SR0JfODsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGluX3R5cGUgPSBUWVBFX0dSQVlfMTY7Ci0gICAgICAgICAgICBvdXRfdHlwZSA9IFRZUEVfUkdCXzE2OwotICAgICAgICB9Ci0gICAgICAgIG91dF9wcm9mID0gY21zQ3JlYXRlX3NSR0JQcm9maWxlKCk7Ci0gICAgICAgIGltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfU1JHQjsKLSAgICB9IGVsc2UgaWYob3V0X3NwYWNlID09IGNtc1NpZ1lDYkNyRGF0YSkgewotICAgICAgICBpbl90eXBlID0gVFlQRV9ZQ2JDcl8xNjsKLSAgICAgICAgb3V0X3R5cGUgPSBUWVBFX1JHQl8xNjsKLSAgICAgICAgb3V0X3Byb2YgPSBjbXNDcmVhdGVfc1JHQlByb2ZpbGUoKTsKLSAgICAgICAgaW1hZ2UtPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19TUkdCOworICAgIGlmIChqIDwgeXcpIHsKKyAgICAgIGlmIChleHR3KSB7CisgICAgICAgIC0tY2I7CisgICAgICAgIC0tY3I7CisgICAgICB9CisgICAgICBzeWNjX3RvX3JnYihvZmZzZXQsIHVwYiwgKnksICpjYiwgKmNyLCByLCBnLCBiKTsKKyAgICAgICsreTsKKyAgICAgICsrcjsKKyAgICAgICsrZzsKKyAgICAgICsrYjsKKyAgICAgIHN5Y2NfdG9fcmdiKG9mZnNldCwgdXBiLCAqbnksICpjYiwgKmNyLCBuciwgbmcsIG5iKTsKKyAgICAgICsrbnk7CisgICAgICArK25yOworICAgICAgKytuZzsKKyAgICAgICsrbmI7CisgICAgICArK2NiOworICAgICAgKytjcjsKKyAgICB9CisgICAgeSArPSB5dzsKKyAgICByICs9IHl3OworICAgIGcgKz0geXc7CisgICAgYiArPSB5dzsKKyAgfQorICBpZiAoaSA8IHloKSB7CisgICAgaWYgKGV4dGgpIHsKKyAgICAgIGNiIC09IGNidzsKKyAgICAgIGNyIC09IGNydzsKKyAgICB9CisgICAgZm9yIChqID0gMDsgaiA8ICh5dyAmIH4oT1BKX1VJTlQzMikxKTsgaiArPSAyKSB7CisgICAgICBzeWNjX3RvX3JnYihvZmZzZXQsIHVwYiwgKnksICpjYiwgKmNyLCByLCBnLCBiKTsKKyAgICAgICsreTsKKyAgICAgICsrcjsKKyAgICAgICsrZzsKKyAgICAgICsrYjsKKyAgICAgIHN5Y2NfdG9fcmdiKG9mZnNldCwgdXBiLCAqeSwgKmNiLCAqY3IsIHIsIGcsIGIpOworICAgICAgKyt5OworICAgICAgKytyOworICAgICAgKytnOworICAgICAgKytiOworICAgICAgKytjYjsKKyAgICAgICsrY3I7CisgICAgfQorICAgIGlmIChqIDwgeXcpIHsKKyAgICAgIGlmIChleHR3KSB7CisgICAgICAgIC0tY2I7CisgICAgICAgIC0tY3I7CisgICAgICB9CisgICAgICBzeWNjX3RvX3JnYihvZmZzZXQsIHVwYiwgKnksICpjYiwgKmNyLCByLCBnLCBiKTsKKyAgICB9CisgIH0KKworICBGWF9GcmVlKGltZy0+Y29tcHNbMF0uZGF0YSk7CisgIGltZy0+Y29tcHNbMF0uZGF0YSA9IGQwOworICBGWF9GcmVlKGltZy0+Y29tcHNbMV0uZGF0YSk7CisgIGltZy0+Y29tcHNbMV0uZGF0YSA9IGQxOworICBGWF9GcmVlKGltZy0+Y29tcHNbMl0uZGF0YSk7CisgIGltZy0+Y29tcHNbMl0uZGF0YSA9IGQyOworICBpbWctPmNvbXBzWzFdLncgPSB5dzsKKyAgaW1nLT5jb21wc1sxXS5oID0geWg7CisgIGltZy0+Y29tcHNbMl0udyA9IHl3OworICBpbWctPmNvbXBzWzJdLmggPSB5aDsKKyAgaW1nLT5jb21wc1sxXS53ID0geXc7CisgIGltZy0+Y29tcHNbMV0uaCA9IHloOworICBpbWctPmNvbXBzWzJdLncgPSB5dzsKKyAgaW1nLT5jb21wc1syXS5oID0geWg7CisgIGltZy0+Y29tcHNbMV0uZHggPSBpbWctPmNvbXBzWzBdLmR4OworICBpbWctPmNvbXBzWzJdLmR4ID0gaW1nLT5jb21wc1swXS5keDsKKyAgaW1nLT5jb21wc1sxXS5keSA9IGltZy0+Y29tcHNbMF0uZHk7CisgIGltZy0+Y29tcHNbMl0uZHkgPSBpbWctPmNvbXBzWzBdLmR5OworfQordm9pZCBjb2xvcl9zeWNjX3RvX3JnYihvcGpfaW1hZ2VfdCogaW1nKSB7CisgIGlmIChpbWctPm51bWNvbXBzIDwgMykgeworICAgIGltZy0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX0dSQVk7CisgICAgcmV0dXJuOworICB9CisgIGlmICgoaW1nLT5jb21wc1swXS5keCA9PSAxKSAmJiAoaW1nLT5jb21wc1sxXS5keCA9PSAyKSAmJgorICAgICAgKGltZy0+Y29tcHNbMl0uZHggPT0gMikgJiYgKGltZy0+Y29tcHNbMF0uZHkgPT0gMSkgJiYKKyAgICAgIChpbWctPmNvbXBzWzFdLmR5ID09IDIpICYmIChpbWctPmNvbXBzWzJdLmR5ID09IDIpKSB7CisgICAgc3ljYzQyMF90b19yZ2IoaW1nKTsKKyAgfSBlbHNlIGlmICgoaW1nLT5jb21wc1swXS5keCA9PSAxKSAmJiAoaW1nLT5jb21wc1sxXS5keCA9PSAyKSAmJgorICAgICAgICAgICAgIChpbWctPmNvbXBzWzJdLmR4ID09IDIpICYmIChpbWctPmNvbXBzWzBdLmR5ID09IDEpICYmCisgICAgICAgICAgICAgKGltZy0+Y29tcHNbMV0uZHkgPT0gMSkgJiYgKGltZy0+Y29tcHNbMl0uZHkgPT0gMSkpIHsKKyAgICBzeWNjNDIyX3RvX3JnYihpbWcpOworICB9IGVsc2UgaWYgKChpbWctPmNvbXBzWzBdLmR4ID09IDEpICYmIChpbWctPmNvbXBzWzFdLmR4ID09IDEpICYmCisgICAgICAgICAgICAgKGltZy0+Y29tcHNbMl0uZHggPT0gMSkgJiYgKGltZy0+Y29tcHNbMF0uZHkgPT0gMSkgJiYKKyAgICAgICAgICAgICAoaW1nLT5jb21wc1sxXS5keSA9PSAxKSAmJiAoaW1nLT5jb21wc1syXS5keSA9PSAxKSkgeworICAgIHN5Y2M0NDRfdG9fcmdiKGltZyk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuOworICB9CisgIGltZy0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX1NSR0I7Cit9Cit2b2lkIGNvbG9yX2FwcGx5X2ljY19wcm9maWxlKG9wal9pbWFnZV90KiBpbWFnZSkgeworICBjbXNIUFJPRklMRSBvdXRfcHJvZjsKKyAgY21zVUludDMyTnVtYmVyIGluX3R5cGU7CisgIGNtc1VJbnQzMk51bWJlciBvdXRfdHlwZTsKKyAgaW50KiByOworICBpbnQqIGc7CisgIGludCogYjsKKyAgaW50IG1heDsKKyAgY21zSFBST0ZJTEUgaW5fcHJvZiA9CisgICAgICBjbXNPcGVuUHJvZmlsZUZyb21NZW0oaW1hZ2UtPmljY19wcm9maWxlX2J1ZiwgaW1hZ2UtPmljY19wcm9maWxlX2xlbik7CisgIGlmICghaW5fcHJvZikgeworICAgIHJldHVybjsKKyAgfQorICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIG91dF9zcGFjZSA9IGNtc0dldENvbG9yU3BhY2UoaW5fcHJvZik7CisgIGNtc1VJbnQzMk51bWJlciBpbnRlbnQgPSBjbXNHZXRIZWFkZXJSZW5kZXJpbmdJbnRlbnQoaW5fcHJvZik7CisgIGludCBtYXhfdyA9IChpbnQpaW1hZ2UtPmNvbXBzWzBdLnc7CisgIGludCBtYXhfaCA9IChpbnQpaW1hZ2UtPmNvbXBzWzBdLmg7CisgIGludCBwcmVjID0gKGludClpbWFnZS0+Y29tcHNbMF0ucHJlYzsKKyAgT1BKX0NPTE9SX1NQQUNFIG9sZHNwYWNlID0gaW1hZ2UtPmNvbG9yX3NwYWNlOworICBpZiAob3V0X3NwYWNlID09IGNtc1NpZ1JnYkRhdGEpIHsKKyAgICBpZiAocHJlYyA8PSA4KSB7CisgICAgICBpbl90eXBlID0gVFlQRV9SR0JfODsKKyAgICAgIG91dF90eXBlID0gVFlQRV9SR0JfODsKICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm47CisgICAgICBpbl90eXBlID0gVFlQRV9SR0JfMTY7CisgICAgICBvdXRfdHlwZSA9IFRZUEVfUkdCXzE2OwogICAgIH0KLSAgICBjbXNIVFJBTlNGT1JNIHRyYW5zZm9ybSA9Ci0gICAgICAgIGNtc0NyZWF0ZVRyYW5zZm9ybShpbl9wcm9mLCBpbl90eXBlLCBvdXRfcHJvZiwgb3V0X3R5cGUsIGludGVudCwgMCk7Ci0gICAgY21zQ2xvc2VQcm9maWxlKGluX3Byb2YpOwotICAgIGNtc0Nsb3NlUHJvZmlsZShvdXRfcHJvZik7Ci0gICAgaWYodHJhbnNmb3JtID09IE5VTEwpIHsKLSAgICAgICAgaW1hZ2UtPmNvbG9yX3NwYWNlID0gb2xkc3BhY2U7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYoaW1hZ2UtPm51bWNvbXBzID4gMikgewotICAgICAgICBpZiggcHJlYyA8PSA4ICkgewotICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqaW5idWYsICpvdXRidWYsICppbiwgKm91dDsKLSAgICAgICAgICAgIG1heCA9IG1heF93ICogbWF4X2g7Ci0gICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgbnJfc2FtcGxlcyA9IG1heCAqIDMgKiBzaXplb2YodW5zaWduZWQgY2hhcik7Ci0gICAgICAgICAgICBpbiA9IGluYnVmID0gRlhfQWxsb2ModW5zaWduZWQgY2hhciwgbnJfc2FtcGxlcyk7Ci0gICAgICAgICAgICBvdXQgPSBvdXRidWYgPSBGWF9BbGxvYyh1bnNpZ25lZCBjaGFyLCBucl9zYW1wbGVzKTsKLSAgICAgICAgICAgIHIgPSBpbWFnZS0+Y29tcHNbMF0uZGF0YTsKLSAgICAgICAgICAgIGcgPSBpbWFnZS0+Y29tcHNbMV0uZGF0YTsKLSAgICAgICAgICAgIGIgPSBpbWFnZS0+Y29tcHNbMl0uZGF0YTsKLSAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBtYXg7ICsraSkgewotICAgICAgICAgICAgICAgICppbisrID0gKHVuc2lnbmVkIGNoYXIpICogcisrOwotICAgICAgICAgICAgICAgICppbisrID0gKHVuc2lnbmVkIGNoYXIpICogZysrOwotICAgICAgICAgICAgICAgICppbisrID0gKHVuc2lnbmVkIGNoYXIpICogYisrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY21zRG9UcmFuc2Zvcm0odHJhbnNmb3JtLCBpbmJ1Ziwgb3V0YnVmLCAoY21zVUludDMyTnVtYmVyKW1heCk7Ci0gICAgICAgICAgICByID0gaW1hZ2UtPmNvbXBzWzBdLmRhdGE7Ci0gICAgICAgICAgICBnID0gaW1hZ2UtPmNvbXBzWzFdLmRhdGE7Ci0gICAgICAgICAgICBiID0gaW1hZ2UtPmNvbXBzWzJdLmRhdGE7Ci0gICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbWF4OyArK2kpIHsKLSAgICAgICAgICAgICAgICAqcisrID0gKGludCkgKiBvdXQrKzsKLSAgICAgICAgICAgICAgICAqZysrID0gKGludCkgKiBvdXQrKzsKLSAgICAgICAgICAgICAgICAqYisrID0gKGludCkgKiBvdXQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX0ZyZWUoaW5idWYpOwotICAgICAgICAgICAgRlhfRnJlZShvdXRidWYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKmluYnVmLCAqb3V0YnVmLCAqaW4sICpvdXQ7Ci0gICAgICAgICAgICBtYXggPSBtYXhfdyAqIG1heF9oOwotICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIG5yX3NhbXBsZXMgPSBtYXggKiAzICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsKLSAgICAgICAgICAgIGluID0gaW5idWYgPSBGWF9BbGxvYyh1bnNpZ25lZCBzaG9ydCwgbnJfc2FtcGxlcyk7Ci0gICAgICAgICAgICBvdXQgPSBvdXRidWYgPSBGWF9BbGxvYyh1bnNpZ25lZCBzaG9ydCwgbnJfc2FtcGxlcyk7Ci0gICAgICAgICAgICByID0gaW1hZ2UtPmNvbXBzWzBdLmRhdGE7Ci0gICAgICAgICAgICBnID0gaW1hZ2UtPmNvbXBzWzFdLmRhdGE7Ci0gICAgICAgICAgICBiID0gaW1hZ2UtPmNvbXBzWzJdLmRhdGE7Ci0gICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbWF4OyArK2kpIHsKLSAgICAgICAgICAgICAgICAqaW4rKyA9ICh1bnNpZ25lZCBzaG9ydCkgKiByKys7Ci0gICAgICAgICAgICAgICAgKmluKysgPSAodW5zaWduZWQgc2hvcnQpICogZysrOwotICAgICAgICAgICAgICAgICppbisrID0gKHVuc2lnbmVkIHNob3J0KSAqIGIrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNtc0RvVHJhbnNmb3JtKHRyYW5zZm9ybSwgaW5idWYsIG91dGJ1ZiwgKGNtc1VJbnQzMk51bWJlciltYXgpOwotICAgICAgICAgICAgciA9IGltYWdlLT5jb21wc1swXS5kYXRhOwotICAgICAgICAgICAgZyA9IGltYWdlLT5jb21wc1sxXS5kYXRhOwotICAgICAgICAgICAgYiA9IGltYWdlLT5jb21wc1syXS5kYXRhOwotICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG1heDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgKnIrKyA9IChpbnQpICogb3V0Kys7Ci0gICAgICAgICAgICAgICAgKmcrKyA9IChpbnQpICogb3V0Kys7Ci0gICAgICAgICAgICAgICAgKmIrKyA9IChpbnQpICogb3V0Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9GcmVlKGluYnVmKTsKLSAgICAgICAgICAgIEZYX0ZyZWUob3V0YnVmKTsKLSAgICAgICAgfQorICAgIG91dF9wcm9mID0gY21zQ3JlYXRlX3NSR0JQcm9maWxlKCk7CisgICAgaW1hZ2UtPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19TUkdCOworICB9IGVsc2UgaWYgKG91dF9zcGFjZSA9PSBjbXNTaWdHcmF5RGF0YSkgeworICAgIGlmIChwcmVjIDw9IDgpIHsKKyAgICAgIGluX3R5cGUgPSBUWVBFX0dSQVlfODsKKyAgICAgIG91dF90eXBlID0gVFlQRV9SR0JfODsKICAgICB9IGVsc2UgewotICAgICAgICB1bnNpZ25lZCBjaGFyICppbiwgKmluYnVmLCAqb3V0LCAqb3V0YnVmOwotICAgICAgICBtYXggPSBtYXhfdyAqIG1heF9oOwotICAgICAgICBjbXNVSW50MzJOdW1iZXIgbnJfc2FtcGxlcyA9Ci0gICAgICAgICAgICAoY21zVUludDMyTnVtYmVyKW1heCAqIDMgKiBzaXplb2YodW5zaWduZWQgY2hhcik7Ci0gICAgICAgIGluID0gaW5idWYgPSBGWF9BbGxvYyh1bnNpZ25lZCBjaGFyLCBucl9zYW1wbGVzKTsKLSAgICAgICAgb3V0ID0gb3V0YnVmID0gRlhfQWxsb2ModW5zaWduZWQgY2hhciwgbnJfc2FtcGxlcyk7Ci0gICAgICAgIGltYWdlLT5jb21wcyA9IChvcGpfaW1hZ2VfY29tcF90KikKLSAgICAgICAgICAgICAgICAgICAgICAgcmVhbGxvYyhpbWFnZS0+Y29tcHMsIChpbWFnZS0+bnVtY29tcHMgKyAyKSAqIHNpemVvZihvcGpfaW1hZ2VfY29tcF90KSk7Ci0gICAgICAgIGlmKGltYWdlLT5udW1jb21wcyA9PSAyKSB7Ci0gICAgICAgICAgICBpbWFnZS0+Y29tcHNbM10gPSBpbWFnZS0+Y29tcHNbMV07Ci0gICAgICAgIH0KLSAgICAgICAgaW1hZ2UtPmNvbXBzWzFdID0gaW1hZ2UtPmNvbXBzWzBdOwotICAgICAgICBpbWFnZS0+Y29tcHNbMl0gPSBpbWFnZS0+Y29tcHNbMF07Ci0gICAgICAgIGltYWdlLT5jb21wc1sxXS5kYXRhID0gRlhfQWxsb2MoaW50LCAoc2l6ZV90KW1heCk7Ci0gICAgICAgIEZYU1lTX21lbXNldDgoaW1hZ2UtPmNvbXBzWzFdLmRhdGEsIDAsIHNpemVvZihpbnQpICogKHNpemVfdCltYXgpOwotICAgICAgICBpbWFnZS0+Y29tcHNbMl0uZGF0YSA9IEZYX0FsbG9jKGludCwgKHNpemVfdCltYXgpOwotICAgICAgICBGWFNZU19tZW1zZXQ4KGltYWdlLT5jb21wc1syXS5kYXRhLCAwLCBzaXplb2YoaW50KSAqIChzaXplX3QpbWF4KTsKLSAgICAgICAgaW1hZ2UtPm51bWNvbXBzICs9IDI7Ci0gICAgICAgIHIgPSBpbWFnZS0+Y29tcHNbMF0uZGF0YTsKLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG1heDsgKytpKSB7Ci0gICAgICAgICAgICAqaW4rKyA9ICh1bnNpZ25lZCBjaGFyKSAqIHIrKzsKLSAgICAgICAgfQotICAgICAgICBjbXNEb1RyYW5zZm9ybSh0cmFuc2Zvcm0sIGluYnVmLCBvdXRidWYsIChjbXNVSW50MzJOdW1iZXIpbWF4KTsKLSAgICAgICAgciA9IGltYWdlLT5jb21wc1swXS5kYXRhOwotICAgICAgICBnID0gaW1hZ2UtPmNvbXBzWzFdLmRhdGE7Ci0gICAgICAgIGIgPSBpbWFnZS0+Y29tcHNbMl0uZGF0YTsKLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG1heDsgKytpKSB7Ci0gICAgICAgICAgICAqcisrID0gKGludCkgKiBvdXQrKzsKLSAgICAgICAgICAgICpnKysgPSAoaW50KSAqIG91dCsrOwotICAgICAgICAgICAgKmIrKyA9IChpbnQpICogb3V0Kys7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRnJlZShpbmJ1Zik7Ci0gICAgICAgIEZYX0ZyZWUob3V0YnVmKTsKKyAgICAgIGluX3R5cGUgPSBUWVBFX0dSQVlfMTY7CisgICAgICBvdXRfdHlwZSA9IFRZUEVfUkdCXzE2OworICAgIH0KKyAgICBvdXRfcHJvZiA9IGNtc0NyZWF0ZV9zUkdCUHJvZmlsZSgpOworICAgIGltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfU1JHQjsKKyAgfSBlbHNlIGlmIChvdXRfc3BhY2UgPT0gY21zU2lnWUNiQ3JEYXRhKSB7CisgICAgaW5fdHlwZSA9IFRZUEVfWUNiQ3JfMTY7CisgICAgb3V0X3R5cGUgPSBUWVBFX1JHQl8xNjsKKyAgICBvdXRfcHJvZiA9IGNtc0NyZWF0ZV9zUkdCUHJvZmlsZSgpOworICAgIGltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfU1JHQjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm47CisgIH0KKyAgY21zSFRSQU5TRk9STSB0cmFuc2Zvcm0gPQorICAgICAgY21zQ3JlYXRlVHJhbnNmb3JtKGluX3Byb2YsIGluX3R5cGUsIG91dF9wcm9mLCBvdXRfdHlwZSwgaW50ZW50LCAwKTsKKyAgY21zQ2xvc2VQcm9maWxlKGluX3Byb2YpOworICBjbXNDbG9zZVByb2ZpbGUob3V0X3Byb2YpOworICBpZiAoIXRyYW5zZm9ybSkgeworICAgIGltYWdlLT5jb2xvcl9zcGFjZSA9IG9sZHNwYWNlOworICAgIHJldHVybjsKKyAgfQorICBpZiAoaW1hZ2UtPm51bWNvbXBzID4gMikgeworICAgIGlmIChwcmVjIDw9IDgpIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKmluYnVmLCAqb3V0YnVmLCAqaW4sICpvdXQ7CisgICAgICBtYXggPSBtYXhfdyAqIG1heF9oOworICAgICAgY21zVUludDMyTnVtYmVyIG5yX3NhbXBsZXMgPSBtYXggKiAzICogc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOworICAgICAgaW4gPSBpbmJ1ZiA9IEZYX0FsbG9jKHVuc2lnbmVkIGNoYXIsIG5yX3NhbXBsZXMpOworICAgICAgb3V0ID0gb3V0YnVmID0gRlhfQWxsb2ModW5zaWduZWQgY2hhciwgbnJfc2FtcGxlcyk7CisgICAgICByID0gaW1hZ2UtPmNvbXBzWzBdLmRhdGE7CisgICAgICBnID0gaW1hZ2UtPmNvbXBzWzFdLmRhdGE7CisgICAgICBiID0gaW1hZ2UtPmNvbXBzWzJdLmRhdGE7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heDsgKytpKSB7CisgICAgICAgICppbisrID0gKHVuc2lnbmVkIGNoYXIpKnIrKzsKKyAgICAgICAgKmluKysgPSAodW5zaWduZWQgY2hhcikqZysrOworICAgICAgICAqaW4rKyA9ICh1bnNpZ25lZCBjaGFyKSpiKys7CisgICAgICB9CisgICAgICBjbXNEb1RyYW5zZm9ybSh0cmFuc2Zvcm0sIGluYnVmLCBvdXRidWYsIChjbXNVSW50MzJOdW1iZXIpbWF4KTsKKyAgICAgIHIgPSBpbWFnZS0+Y29tcHNbMF0uZGF0YTsKKyAgICAgIGcgPSBpbWFnZS0+Y29tcHNbMV0uZGF0YTsKKyAgICAgIGIgPSBpbWFnZS0+Y29tcHNbMl0uZGF0YTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyArK2kpIHsKKyAgICAgICAgKnIrKyA9IChpbnQpKm91dCsrOworICAgICAgICAqZysrID0gKGludCkqb3V0Kys7CisgICAgICAgICpiKysgPSAoaW50KSpvdXQrKzsKKyAgICAgIH0KKyAgICAgIEZYX0ZyZWUoaW5idWYpOworICAgICAgRlhfRnJlZShvdXRidWYpOworICAgIH0gZWxzZSB7CisgICAgICB1bnNpZ25lZCBzaG9ydCAqaW5idWYsICpvdXRidWYsICppbiwgKm91dDsKKyAgICAgIG1heCA9IG1heF93ICogbWF4X2g7CisgICAgICBjbXNVSW50MzJOdW1iZXIgbnJfc2FtcGxlcyA9IG1heCAqIDMgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpOworICAgICAgaW4gPSBpbmJ1ZiA9IEZYX0FsbG9jKHVuc2lnbmVkIHNob3J0LCBucl9zYW1wbGVzKTsKKyAgICAgIG91dCA9IG91dGJ1ZiA9IEZYX0FsbG9jKHVuc2lnbmVkIHNob3J0LCBucl9zYW1wbGVzKTsKKyAgICAgIHIgPSBpbWFnZS0+Y29tcHNbMF0uZGF0YTsKKyAgICAgIGcgPSBpbWFnZS0+Y29tcHNbMV0uZGF0YTsKKyAgICAgIGIgPSBpbWFnZS0+Y29tcHNbMl0uZGF0YTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyArK2kpIHsKKyAgICAgICAgKmluKysgPSAodW5zaWduZWQgc2hvcnQpKnIrKzsKKyAgICAgICAgKmluKysgPSAodW5zaWduZWQgc2hvcnQpKmcrKzsKKyAgICAgICAgKmluKysgPSAodW5zaWduZWQgc2hvcnQpKmIrKzsKKyAgICAgIH0KKyAgICAgIGNtc0RvVHJhbnNmb3JtKHRyYW5zZm9ybSwgaW5idWYsIG91dGJ1ZiwgKGNtc1VJbnQzMk51bWJlciltYXgpOworICAgICAgciA9IGltYWdlLT5jb21wc1swXS5kYXRhOworICAgICAgZyA9IGltYWdlLT5jb21wc1sxXS5kYXRhOworICAgICAgYiA9IGltYWdlLT5jb21wc1syXS5kYXRhOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7ICsraSkgeworICAgICAgICAqcisrID0gKGludCkqb3V0Kys7CisgICAgICAgICpnKysgPSAoaW50KSpvdXQrKzsKKyAgICAgICAgKmIrKyA9IChpbnQpKm91dCsrOworICAgICAgfQorICAgICAgRlhfRnJlZShpbmJ1Zik7CisgICAgICBGWF9GcmVlKG91dGJ1Zik7CisgICAgfQorICB9IGVsc2UgeworICAgIHVuc2lnbmVkIGNoYXIgKmluLCAqaW5idWYsICpvdXQsICpvdXRidWY7CisgICAgbWF4ID0gbWF4X3cgKiBtYXhfaDsKKyAgICBjbXNVSW50MzJOdW1iZXIgbnJfc2FtcGxlcyA9CisgICAgICAgIChjbXNVSW50MzJOdW1iZXIpbWF4ICogMyAqIHNpemVvZih1bnNpZ25lZCBjaGFyKTsKKyAgICBpbiA9IGluYnVmID0gRlhfQWxsb2ModW5zaWduZWQgY2hhciwgbnJfc2FtcGxlcyk7CisgICAgb3V0ID0gb3V0YnVmID0gRlhfQWxsb2ModW5zaWduZWQgY2hhciwgbnJfc2FtcGxlcyk7CisgICAgaW1hZ2UtPmNvbXBzID0gKG9wal9pbWFnZV9jb21wX3QqKXJlYWxsb2MoCisgICAgICAgIGltYWdlLT5jb21wcywgKGltYWdlLT5udW1jb21wcyArIDIpICogc2l6ZW9mKG9wal9pbWFnZV9jb21wX3QpKTsKKyAgICBpZiAoaW1hZ2UtPm51bWNvbXBzID09IDIpIHsKKyAgICAgIGltYWdlLT5jb21wc1szXSA9IGltYWdlLT5jb21wc1sxXTsKKyAgICB9CisgICAgaW1hZ2UtPmNvbXBzWzFdID0gaW1hZ2UtPmNvbXBzWzBdOworICAgIGltYWdlLT5jb21wc1syXSA9IGltYWdlLT5jb21wc1swXTsKKyAgICBpbWFnZS0+Y29tcHNbMV0uZGF0YSA9IEZYX0FsbG9jKGludCwgKHNpemVfdCltYXgpOworICAgIEZYU1lTX21lbXNldChpbWFnZS0+Y29tcHNbMV0uZGF0YSwgMCwgc2l6ZW9mKGludCkgKiAoc2l6ZV90KW1heCk7CisgICAgaW1hZ2UtPmNvbXBzWzJdLmRhdGEgPSBGWF9BbGxvYyhpbnQsIChzaXplX3QpbWF4KTsKKyAgICBGWFNZU19tZW1zZXQoaW1hZ2UtPmNvbXBzWzJdLmRhdGEsIDAsIHNpemVvZihpbnQpICogKHNpemVfdCltYXgpOworICAgIGltYWdlLT5udW1jb21wcyArPSAyOworICAgIHIgPSBpbWFnZS0+Y29tcHNbMF0uZGF0YTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heDsgKytpKSB7CisgICAgICAqaW4rKyA9ICh1bnNpZ25lZCBjaGFyKSpyKys7CisgICAgfQorICAgIGNtc0RvVHJhbnNmb3JtKHRyYW5zZm9ybSwgaW5idWYsIG91dGJ1ZiwgKGNtc1VJbnQzMk51bWJlciltYXgpOworICAgIHIgPSBpbWFnZS0+Y29tcHNbMF0uZGF0YTsKKyAgICBnID0gaW1hZ2UtPmNvbXBzWzFdLmRhdGE7CisgICAgYiA9IGltYWdlLT5jb21wc1syXS5kYXRhOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyArK2kpIHsKKyAgICAgICpyKysgPSAoaW50KSpvdXQrKzsKKyAgICAgICpnKysgPSAoaW50KSpvdXQrKzsKKyAgICAgICpiKysgPSAoaW50KSpvdXQrKzsKKyAgICB9CisgICAgRlhfRnJlZShpbmJ1Zik7CisgICAgRlhfRnJlZShvdXRidWYpOworICB9CisgIGNtc0RlbGV0ZVRyYW5zZm9ybSh0cmFuc2Zvcm0pOworfQordm9pZCBjb2xvcl9hcHBseV9jb252ZXJzaW9uKG9wal9pbWFnZV90KiBpbWFnZSkgeworICBpbnQqIHJvdzsKKyAgaW50IGVudW1jcywgbnVtY29tcHM7CisgIG51bWNvbXBzID0gaW1hZ2UtPm51bWNvbXBzOworICBpZiAobnVtY29tcHMgPCAzKSB7CisgICAgcmV0dXJuOworICB9CisgIHJvdyA9IChpbnQqKWltYWdlLT5pY2NfcHJvZmlsZV9idWY7CisgIGVudW1jcyA9IHJvd1swXTsKKyAgaWYgKGVudW1jcyA9PSAxNCkgeworICAgIGludCAqTCwgKmEsICpiLCAqcmVkLCAqZ3JlZW4sICpibHVlLCAqc3JjMCwgKnNyYzEsICpzcmMyOworICAgIGRvdWJsZSBybCwgb2wsIHJhLCBvYSwgcmIsIG9iLCBwcmVjMCwgcHJlYzEsIHByZWMyOworICAgIGRvdWJsZSBtaW5MLCBtYXhMLCBtaW5hLCBtYXhhLCBtaW5iLCBtYXhiOworICAgIHVuc2lnbmVkIGludCBkZWZhdWx0X3R5cGU7CisgICAgdW5zaWduZWQgaW50IGksIG1heDsKKyAgICBjbXNIUFJPRklMRSBpbiwgb3V0OworICAgIGNtc0hUUkFOU0ZPUk0gdHJhbnNmb3JtOworICAgIGNtc1VJbnQxNk51bWJlciBSR0JbM107CisgICAgY21zQ0lFTGFiIExhYjsKKyAgICBpbiA9IGNtc0NyZWF0ZUxhYjRQcm9maWxlKE5VTEwpOworICAgIG91dCA9IGNtc0NyZWF0ZV9zUkdCUHJvZmlsZSgpOworICAgIHRyYW5zZm9ybSA9IGNtc0NyZWF0ZVRyYW5zZm9ybShpbiwgVFlQRV9MYWJfREJMLCBvdXQsIFRZUEVfUkdCXzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRFTlRfUEVSQ0VQVFVBTCwgMCk7CisgICAgY21zQ2xvc2VQcm9maWxlKGluKTsKKyAgICBjbXNDbG9zZVByb2ZpbGUob3V0KTsKKyAgICBpZiAoIXRyYW5zZm9ybSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwcmVjMCA9IChkb3VibGUpaW1hZ2UtPmNvbXBzWzBdLnByZWM7CisgICAgcHJlYzEgPSAoZG91YmxlKWltYWdlLT5jb21wc1sxXS5wcmVjOworICAgIHByZWMyID0gKGRvdWJsZSlpbWFnZS0+Y29tcHNbMl0ucHJlYzsKKyAgICBkZWZhdWx0X3R5cGUgPSByb3dbMV07CisgICAgaWYgKGRlZmF1bHRfdHlwZSA9PSAweDQ0NDU0NjAwKSB7CisgICAgICBybCA9IDEwMDsKKyAgICAgIHJhID0gMTcwOworICAgICAgcmIgPSAyMDA7CisgICAgICBvbCA9IDA7CisgICAgICBvYSA9IHBvdygyLCBwcmVjMSAtIDEpOworICAgICAgb2IgPSBwb3coMiwgcHJlYzIgLSAyKSArIHBvdygyLCBwcmVjMiAtIDMpOworICAgIH0gZWxzZSB7CisgICAgICBybCA9IHJvd1syXTsKKyAgICAgIHJhID0gcm93WzRdOworICAgICAgcmIgPSByb3dbNl07CisgICAgICBvbCA9IHJvd1szXTsKKyAgICAgIG9hID0gcm93WzVdOworICAgICAgb2IgPSByb3dbN107CisgICAgfQorICAgIEwgPSBzcmMwID0gaW1hZ2UtPmNvbXBzWzBdLmRhdGE7CisgICAgYSA9IHNyYzEgPSBpbWFnZS0+Y29tcHNbMV0uZGF0YTsKKyAgICBiID0gc3JjMiA9IGltYWdlLT5jb21wc1syXS5kYXRhOworICAgIG1heCA9IGltYWdlLT5jb21wc1swXS53ICogaW1hZ2UtPmNvbXBzWzBdLmg7CisgICAgcmVkID0gRlhfQWxsb2MoaW50LCBtYXgpOworICAgIGltYWdlLT5jb21wc1swXS5kYXRhID0gcmVkOworICAgIGdyZWVuID0gRlhfQWxsb2MoaW50LCBtYXgpOworICAgIGltYWdlLT5jb21wc1sxXS5kYXRhID0gZ3JlZW47CisgICAgYmx1ZSA9IEZYX0FsbG9jKGludCwgbWF4KTsKKyAgICBpbWFnZS0+Y29tcHNbMl0uZGF0YSA9IGJsdWU7CisgICAgbWluTCA9IC0ocmwgKiBvbCkgLyAocG93KDIsIHByZWMwKSAtIDEpOworICAgIG1heEwgPSBtaW5MICsgcmw7CisgICAgbWluYSA9IC0ocmEgKiBvYSkgLyAocG93KDIsIHByZWMxKSAtIDEpOworICAgIG1heGEgPSBtaW5hICsgcmE7CisgICAgbWluYiA9IC0ocmIgKiBvYikgLyAocG93KDIsIHByZWMyKSAtIDEpOworICAgIG1heGIgPSBtaW5iICsgcmI7CisgICAgZm9yIChpID0gMDsgaSA8IG1heDsgKytpKSB7CisgICAgICBMYWIuTCA9IG1pbkwgKyAoZG91YmxlKSgqTCkgKiAobWF4TCAtIG1pbkwpIC8gKHBvdygyLCBwcmVjMCkgLSAxKTsKKyAgICAgICsrTDsKKyAgICAgIExhYi5hID0gbWluYSArIChkb3VibGUpKCphKSAqIChtYXhhIC0gbWluYSkgLyAocG93KDIsIHByZWMxKSAtIDEpOworICAgICAgKythOworICAgICAgTGFiLmIgPSBtaW5iICsgKGRvdWJsZSkoKmIpICogKG1heGIgLSBtaW5iKSAvIChwb3coMiwgcHJlYzIpIC0gMSk7CisgICAgICArK2I7CisgICAgICBjbXNEb1RyYW5zZm9ybSh0cmFuc2Zvcm0sICZMYWIsIFJHQiwgMSk7CisgICAgICAqcmVkKysgPSBSR0JbMF07CisgICAgICAqZ3JlZW4rKyA9IFJHQlsxXTsKKyAgICAgICpibHVlKysgPSBSR0JbMl07CiAgICAgfQogICAgIGNtc0RlbGV0ZVRyYW5zZm9ybSh0cmFuc2Zvcm0pOworICAgIEZYX0ZyZWUoc3JjMCk7CisgICAgRlhfRnJlZShzcmMxKTsKKyAgICBGWF9GcmVlKHNyYzIpOworICAgIGltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfU1JHQjsKKyAgICBpbWFnZS0+Y29tcHNbMF0ucHJlYyA9IDE2OworICAgIGltYWdlLT5jb21wc1sxXS5wcmVjID0gMTY7CisgICAgaW1hZ2UtPmNvbXBzWzJdLnByZWMgPSAxNjsKKyAgICByZXR1cm47CisgIH0KIH0KLXZvaWQgY29sb3JfYXBwbHlfY29udmVyc2lvbihvcGpfaW1hZ2VfdCAqaW1hZ2UpCi17Ci0gICAgaW50ICpyb3c7Ci0gICAgaW50IGVudW1jcywgbnVtY29tcHM7Ci0gICAgbnVtY29tcHMgPSBpbWFnZS0+bnVtY29tcHM7Ci0gICAgaWYobnVtY29tcHMgPCAzKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcm93ID0gKGludCopaW1hZ2UtPmljY19wcm9maWxlX2J1ZjsKLSAgICBlbnVtY3MgPSByb3dbMF07Ci0gICAgaWYoZW51bWNzID09IDE0KSB7Ci0gICAgICAgIGludCAqTCwgKmEsICpiLCAqcmVkLCAqZ3JlZW4sICpibHVlLCAqc3JjMCwgKnNyYzEsICpzcmMyOwotICAgICAgICBkb3VibGUgcmwsIG9sLCByYSwgb2EsIHJiLCBvYiwgcHJlYzAsIHByZWMxLCBwcmVjMjsKLSAgICAgICAgZG91YmxlIG1pbkwsIG1heEwsIG1pbmEsIG1heGEsIG1pbmIsIG1heGI7Ci0gICAgICAgIHVuc2lnbmVkIGludCBkZWZhdWx0X3R5cGU7Ci0gICAgICAgIHVuc2lnbmVkIGludCBpLCBtYXg7Ci0gICAgICAgIGNtc0hQUk9GSUxFIGluLCBvdXQ7Ci0gICAgICAgIGNtc0hUUkFOU0ZPUk0gdHJhbnNmb3JtOwotICAgICAgICBjbXNVSW50MTZOdW1iZXIgUkdCWzNdOwotICAgICAgICBjbXNDSUVMYWIgTGFiOwotICAgICAgICBpbiA9IGNtc0NyZWF0ZUxhYjRQcm9maWxlKE5VTEwpOwotICAgICAgICBvdXQgPSBjbXNDcmVhdGVfc1JHQlByb2ZpbGUoKTsKLSAgICAgICAgdHJhbnNmb3JtID0KLSAgICAgICAgICAgIGNtc0NyZWF0ZVRyYW5zZm9ybShpbiwgVFlQRV9MYWJfREJMLCBvdXQsIFRZUEVfUkdCXzE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVEVOVF9QRVJDRVBUVUFMLCAwKTsKLSAgICAgICAgY21zQ2xvc2VQcm9maWxlKGluKTsKLSAgICAgICAgY21zQ2xvc2VQcm9maWxlKG91dCk7Ci0gICAgICAgIGlmKHRyYW5zZm9ybSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgcHJlYzAgPSAoZG91YmxlKWltYWdlLT5jb21wc1swXS5wcmVjOwotICAgICAgICBwcmVjMSA9IChkb3VibGUpaW1hZ2UtPmNvbXBzWzFdLnByZWM7Ci0gICAgICAgIHByZWMyID0gKGRvdWJsZSlpbWFnZS0+Y29tcHNbMl0ucHJlYzsKLSAgICAgICAgZGVmYXVsdF90eXBlID0gcm93WzFdOwotICAgICAgICBpZihkZWZhdWx0X3R5cGUgPT0gMHg0NDQ1NDYwMCkgewotICAgICAgICAgICAgcmwgPSAxMDA7Ci0gICAgICAgICAgICByYSA9IDE3MDsKLSAgICAgICAgICAgIHJiID0gMjAwOwotICAgICAgICAgICAgb2wgPSAwOwotICAgICAgICAgICAgb2EgPSBwb3coMiwgcHJlYzEgLSAxKTsKLSAgICAgICAgICAgIG9iID0gcG93KDIsIHByZWMyIC0gMikgICsgcG93KDIsIHByZWMyIC0gMyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBybCA9IHJvd1syXTsKLSAgICAgICAgICAgIHJhID0gcm93WzRdOwotICAgICAgICAgICAgcmIgPSByb3dbNl07Ci0gICAgICAgICAgICBvbCA9IHJvd1szXTsKLSAgICAgICAgICAgIG9hID0gcm93WzVdOwotICAgICAgICAgICAgb2IgPSByb3dbN107Ci0gICAgICAgIH0KLSAgICAgICAgTCA9IHNyYzAgPSBpbWFnZS0+Y29tcHNbMF0uZGF0YTsKLSAgICAgICAgYSA9IHNyYzEgPSBpbWFnZS0+Y29tcHNbMV0uZGF0YTsKLSAgICAgICAgYiA9IHNyYzIgPSBpbWFnZS0+Y29tcHNbMl0uZGF0YTsKLSAgICAgICAgbWF4ID0gaW1hZ2UtPmNvbXBzWzBdLncgKiBpbWFnZS0+Y29tcHNbMF0uaDsKLSAgICAgICAgcmVkID0gRlhfQWxsb2MoaW50LCBtYXgpOwotICAgICAgICBpbWFnZS0+Y29tcHNbMF0uZGF0YSA9IHJlZDsKLSAgICAgICAgZ3JlZW4gPSBGWF9BbGxvYyhpbnQsIG1heCk7Ci0gICAgICAgIGltYWdlLT5jb21wc1sxXS5kYXRhID0gZ3JlZW47Ci0gICAgICAgIGJsdWUgPSBGWF9BbGxvYyhpbnQsIG1heCk7Ci0gICAgICAgIGltYWdlLT5jb21wc1syXS5kYXRhID0gYmx1ZTsKLSAgICAgICAgbWluTCA9IC0ocmwgKiBvbCkgLyAocG93KDIsIHByZWMwKSAtIDEpOwotICAgICAgICBtYXhMID0gbWluTCArIHJsOwotICAgICAgICBtaW5hID0gLShyYSAqIG9hKSAvIChwb3coMiwgcHJlYzEpIC0gMSk7Ci0gICAgICAgIG1heGEgPSBtaW5hICsgcmE7Ci0gICAgICAgIG1pbmIgPSAtKHJiICogb2IpIC8gKHBvdygyLCBwcmVjMikgLSAxKTsKLSAgICAgICAgbWF4YiA9IG1pbmIgKyByYjsKLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgbWF4OyArK2kpIHsKLSAgICAgICAgICAgIExhYi5MID0gbWluTCArIChkb3VibGUpKCpMKSAqIChtYXhMIC0gbWluTCkgLyAocG93KDIsIHByZWMwKSAtIDEpOwotICAgICAgICAgICAgKytMOwotICAgICAgICAgICAgTGFiLmEgPSBtaW5hICsgKGRvdWJsZSkoKmEpICogKG1heGEgLSBtaW5hKSAvIChwb3coMiwgcHJlYzEpIC0gMSk7Ci0gICAgICAgICAgICArK2E7Ci0gICAgICAgICAgICBMYWIuYiA9IG1pbmIgKyAoZG91YmxlKSgqYikgKiAobWF4YiAtIG1pbmIpIC8gKHBvdygyLCBwcmVjMikgLSAxKTsKLSAgICAgICAgICAgICsrYjsKLSAgICAgICAgICAgIGNtc0RvVHJhbnNmb3JtKHRyYW5zZm9ybSwgJkxhYiwgUkdCLCAxKTsKLSAgICAgICAgICAgICpyZWQrKyA9IFJHQlswXTsKLSAgICAgICAgICAgICpncmVlbisrID0gUkdCWzFdOwotICAgICAgICAgICAgKmJsdWUrKyA9IFJHQlsyXTsKLSAgICAgICAgfQotICAgICAgICBjbXNEZWxldGVUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLSAgICAgICAgRlhfRnJlZShzcmMwKTsKLSAgICAgICAgRlhfRnJlZShzcmMxKTsKLSAgICAgICAgRlhfRnJlZShzcmMyKTsKLSAgICAgICAgaW1hZ2UtPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19TUkdCOwotICAgICAgICBpbWFnZS0+Y29tcHNbMF0ucHJlYyA9IDE2OwotICAgICAgICBpbWFnZS0+Y29tcHNbMV0ucHJlYyA9IDE2OwotICAgICAgICBpbWFnZS0+Y29tcHNbMl0ucHJlYyA9IDE2OwotICAgICAgICByZXR1cm47Ci0gICAgfQotfQotY2xhc3MgQ0pQWF9EZWNvZGVyIAotewotcHVibGljOgotICAgIENKUFhfRGVjb2RlcigpOwotICAgIH5DSlBYX0RlY29kZXIoKTsKLSAgICBGWF9CT09MCUluaXQoY29uc3QgdW5zaWduZWQgY2hhciogc3JjX2RhdGEsIGludCBzcmNfc2l6ZSk7Ci0gICAgdm9pZAlHZXRJbmZvKEZYX0RXT1JEJiB3aWR0aCwgRlhfRFdPUkQmIGhlaWdodCwgRlhfRFdPUkQmIGNvZGVzdHJlYW1fbkNvbXBzLCBGWF9EV09SRCYgb3V0cHV0X25Db21wcyk7Ci0gICAgRlhfQk9PTAlEZWNvZGUoRlhfTFBCWVRFIGRlc3RfYnVmLCBpbnQgcGl0Y2gsIEZYX0JPT0wgYlRyYW5zbGF0ZUNvbG9yLCBGWF9MUEJZVEUgb2Zmc2V0cyk7Ci0gICAgRlhfTFBDQllURSBtX1NyY0RhdGE7Ci0gICAgaW50IG1fU3JjU2l6ZTsKLSAgICBvcGpfaW1hZ2VfdCAqaW1hZ2U7Ci0gICAgb3BqX2NvZGVjX3QqIGxfY29kZWM7Ci0gICAgb3BqX3N0cmVhbV90ICpsX3N0cmVhbTsKLSAgICBGWF9CT09MIG1fdXNlQ29sb3JTcGFjZTsKK2NsYXNzIENKUFhfRGVjb2RlciB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlBYX0RlY29kZXIoQ1BERl9Db2xvclNwYWNlKiBjcyk7CisgIH5DSlBYX0RlY29kZXIoKTsKKyAgRlhfQk9PTCBJbml0KGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyY19kYXRhLCBGWF9EV09SRCBzcmNfc2l6ZSk7CisgIHZvaWQgR2V0SW5mbyhGWF9EV09SRCogd2lkdGgsIEZYX0RXT1JEKiBoZWlnaHQsIEZYX0RXT1JEKiBjb21wb25lbnRzKTsKKyAgYm9vbCBEZWNvZGUodWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgIGludCBwaXRjaCwKKyAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIG9mZnNldHMpOworCisgcHJpdmF0ZToKKyAgY29uc3QgdWludDhfdCogbV9TcmNEYXRhOworICBGWF9EV09SRCBtX1NyY1NpemU7CisgIG9wal9pbWFnZV90KiBpbWFnZTsKKyAgb3BqX2NvZGVjX3QqIGxfY29kZWM7CisgIG9wal9zdHJlYW1fdCogbF9zdHJlYW07CisgIGNvbnN0IENQREZfQ29sb3JTcGFjZSogY29uc3QgbV9Db2xvclNwYWNlOwogfTsKLUNKUFhfRGVjb2Rlcjo6Q0pQWF9EZWNvZGVyKCk6IGltYWdlKE5VTEwpLCBsX2NvZGVjKE5VTEwpLCBsX3N0cmVhbShOVUxMKSwgbV91c2VDb2xvclNwYWNlKEZBTFNFKQotewotfQotQ0pQWF9EZWNvZGVyOjp+Q0pQWF9EZWNvZGVyKCkKLXsKLSAgICBpZihsX2NvZGVjKSB7Ci0gICAgICAgIG9wal9kZXN0cm95X2NvZGVjKGxfY29kZWMpOwotICAgIH0KLSAgICBpZihsX3N0cmVhbSkgewotICAgICAgICBvcGpfc3RyZWFtX2Rlc3Ryb3kobF9zdHJlYW0pOwotICAgIH0KLSAgICBpZihpbWFnZSkgewotICAgICAgICBvcGpfaW1hZ2VfZGVzdHJveShpbWFnZSk7Ci0gICAgfQotfQotRlhfQk9PTCBDSlBYX0RlY29kZXI6OkluaXQoY29uc3QgdW5zaWduZWQgY2hhciogc3JjX2RhdGEsIGludCBzcmNfc2l6ZSkKLXsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBzekpQMkhlYWRlcltdID0geyAweDAwLCAweDAwLCAweDAwLCAweDBjLCAweDZhLCAweDUwLCAweDIwLCAweDIwLCAweDBkLCAweDBhLCAweDg3LCAweDBhIH07Ci0gICAgaWYgKCFzcmNfZGF0YSB8fCBzcmNfc2l6ZSA8IHNpemVvZihzekpQMkhlYWRlcikpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpbWFnZSA9IE5VTEw7Ci0gICAgbV9TcmNEYXRhID0gc3JjX2RhdGE7Ci0gICAgbV9TcmNTaXplID0gc3JjX3NpemU7Ci0gICAgRGVjb2RlRGF0YSBzcmNEYXRhKGNvbnN0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KHNyY19kYXRhKSwgc3JjX3NpemUpOwotICAgIGxfc3RyZWFtID0gZnhfb3BqX3N0cmVhbV9jcmVhdGVfbWVtb3J5X3N0cmVhbSgmc3JjRGF0YSwgT1BKX0oyS19TVFJFQU1fQ0hVTktfU0laRSwgMSk7Ci0gICAgaWYgKGxfc3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBvcGpfZHBhcmFtZXRlcnNfdCBwYXJhbWV0ZXJzOwotICAgIG9wal9zZXRfZGVmYXVsdF9kZWNvZGVyX3BhcmFtZXRlcnMoJnBhcmFtZXRlcnMpOwotICAgIHBhcmFtZXRlcnMuZGVjb2RfZm9ybWF0ID0gMDsKLSAgICBwYXJhbWV0ZXJzLmNvZF9mb3JtYXQgPSAzOwotICAgIGlmKEZYU1lTX21lbWNtcDMyKG1fU3JjRGF0YSwgc3pKUDJIZWFkZXIsIHNpemVvZihzekpQMkhlYWRlcikpID09IDApIHsKLSAgICAgICAgbF9jb2RlYyA9IG9wal9jcmVhdGVfZGVjb21wcmVzcyhPUEpfQ09ERUNfSlAyKTsKLSAgICAgICAgcGFyYW1ldGVycy5kZWNvZF9mb3JtYXQgPSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGxfY29kZWMgPSBvcGpfY3JlYXRlX2RlY29tcHJlc3MoT1BKX0NPREVDX0oySyk7Ci0gICAgfQotICAgIGlmKCFsX2NvZGVjKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgb3BqX3NldF9pbmZvX2hhbmRsZXIobF9jb2RlYywgZnhfaW5mb19jYWxsYmFjaywgMDApOwotICAgIG9wal9zZXRfd2FybmluZ19oYW5kbGVyKGxfY29kZWMsIGZ4X3dhcm5pbmdfY2FsbGJhY2ssIDAwKTsKLSAgICBvcGpfc2V0X2Vycm9yX2hhbmRsZXIobF9jb2RlYywgZnhfZXJyb3JfY2FsbGJhY2ssIDAwKTsKLSAgICBpZiAoICFvcGpfc2V0dXBfZGVjb2RlcihsX2NvZGVjLCAmcGFyYW1ldGVycykgKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYoISBvcGpfcmVhZF9oZWFkZXIobF9zdHJlYW0sIGxfY29kZWMsICZpbWFnZSkpIHsKLSAgICAgICAgaW1hZ2UgPSBOVUxMOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotLyoKLSAgICBpZih0aGlzLT5tX3VzZUNvbG9yU3BhY2UpIHsKLSAgICAgICAgaW1hZ2UtPnVzZUNvbG9yU3BhY2UgPSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGltYWdlLT51c2VDb2xvclNwYWNlID0gMDsKLSAgICB9Ci0qLwotICAgIGlmICghcGFyYW1ldGVycy5uYl90aWxlX3RvX2RlY29kZSkgewotICAgICAgICBpZiAoIW9wal9zZXRfZGVjb2RlX2FyZWEobF9jb2RlYywgaW1hZ2UsIHBhcmFtZXRlcnMuREFfeDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLkRBX3kwLCBwYXJhbWV0ZXJzLkRBX3gxLCBwYXJhbWV0ZXJzLkRBX3kxKSkgewotICAgICAgICAgICAgb3BqX2ltYWdlX2Rlc3Ryb3koaW1hZ2UpOwotICAgICAgICAgICAgaW1hZ2UgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmICghKG9wal9kZWNvZGUobF9jb2RlYywgbF9zdHJlYW0sIGltYWdlKSAmJiBvcGpfZW5kX2RlY29tcHJlc3MobF9jb2RlYywgbF9zdHJlYW0pKSkgewotICAgICAgICAgICAgb3BqX2ltYWdlX2Rlc3Ryb3koaW1hZ2UpOwotICAgICAgICAgICAgaW1hZ2UgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFvcGpfZ2V0X2RlY29kZWRfdGlsZShsX2NvZGVjLCBsX3N0cmVhbSwgaW1hZ2UsIHBhcmFtZXRlcnMudGlsZV9pbmRleCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KKworQ0pQWF9EZWNvZGVyOjpDSlBYX0RlY29kZXIoQ1BERl9Db2xvclNwYWNlKiBjcykKKyAgICA6IGltYWdlKG51bGxwdHIpLCBsX2NvZGVjKG51bGxwdHIpLCBsX3N0cmVhbShudWxscHRyKSwgbV9Db2xvclNwYWNlKGNzKSB7fQorCitDSlBYX0RlY29kZXI6On5DSlBYX0RlY29kZXIoKSB7CisgIGlmIChsX2NvZGVjKSB7CisgICAgb3BqX2Rlc3Ryb3lfY29kZWMobF9jb2RlYyk7CisgIH0KKyAgaWYgKGxfc3RyZWFtKSB7CiAgICAgb3BqX3N0cmVhbV9kZXN0cm95KGxfc3RyZWFtKTsKLSAgICBsX3N0cmVhbSA9IE5VTEw7Ci0gICAgaWYoIGltYWdlLT5jb2xvcl9zcGFjZSAhPSBPUEpfQ0xSU1BDX1NZQ0MKLSAgICAgICAgICAgICYmIGltYWdlLT5udW1jb21wcyA9PSAzICYmIGltYWdlLT5jb21wc1swXS5keCA9PSBpbWFnZS0+Y29tcHNbMF0uZHkKLSAgICAgICAgICAgICYmIGltYWdlLT5jb21wc1sxXS5keCAhPSAxICkgewotICAgICAgICBpbWFnZS0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX1NZQ0M7Ci0gICAgfSBlbHNlIGlmIChpbWFnZS0+bnVtY29tcHMgPD0gMikgewotICAgICAgICBpbWFnZS0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX0dSQVk7Ci0gICAgfQotICAgIGlmKGltYWdlLT5jb2xvcl9zcGFjZSA9PSBPUEpfQ0xSU1BDX1NZQ0MpIHsKLSAgICAgICAgY29sb3Jfc3ljY190b19yZ2IoaW1hZ2UpOwotICAgIH0KLSAgICAvL2lmKGltYWdlLT5pY2NfcHJvZmlsZV9idWYgJiYgIWltYWdlLT51c2VDb2xvclNwYWNlKSB7Ci0gICAgaWYoaW1hZ2UtPmljY19wcm9maWxlX2J1ZikgewotICAgICAgICBGWF9GcmVlKGltYWdlLT5pY2NfcHJvZmlsZV9idWYpOwotICAgICAgICBpbWFnZS0+aWNjX3Byb2ZpbGVfYnVmID0gTlVMTDsKLSAgICAgICAgaW1hZ2UtPmljY19wcm9maWxlX2xlbiA9IDA7Ci0gICAgfQotICAgIGlmKCFpbWFnZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChpbWFnZSkgeworICAgIG9wal9pbWFnZV9kZXN0cm95KGltYWdlKTsKKyAgfQogfQotdm9pZCBDSlBYX0RlY29kZXI6OkdldEluZm8oRlhfRFdPUkQmIHdpZHRoLCBGWF9EV09SRCYgaGVpZ2h0LCBGWF9EV09SRCYgY29kZXN0cmVhbV9uQ29tcHMsIEZYX0RXT1JEJiBvdXRwdXRfbkNvbXBzKQotewotICAgIHdpZHRoID0gKEZYX0RXT1JEKWltYWdlLT54MTsKLSAgICBoZWlnaHQgPSAoRlhfRFdPUkQpaW1hZ2UtPnkxOwotICAgIG91dHB1dF9uQ29tcHMgPSBjb2Rlc3RyZWFtX25Db21wcyA9IChGWF9EV09SRClpbWFnZS0+bnVtY29tcHM7Ci19Ci1GWF9CT09MIENKUFhfRGVjb2Rlcjo6RGVjb2RlKEZYX0xQQllURSBkZXN0X2J1ZiwgaW50IHBpdGNoLCBGWF9CT09MIGJUcmFuc2xhdGVDb2xvciwgRlhfTFBCWVRFIG9mZnNldHMpCi17Ci0gICAgaW50IGksIHdpZCwgaGVpLCByb3csIGNvbCwgY2hhbm5lbCwgc3JjOwotICAgIEZYX0xQQllURSBwQ2hhbm5lbCwgcFNjYW5saW5lLCBwUGl4ZWw7CiAKLSAgICBpZihpbWFnZS0+Y29tcHNbMF0udyAhPSBpbWFnZS0+eDEgfHwgaW1hZ2UtPmNvbXBzWzBdLmggIT0gaW1hZ2UtPnkxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYocGl0Y2ggPCAoaW50KShpbWFnZS0+Y29tcHNbMF0udyAqIDggKiBpbWFnZS0+bnVtY29tcHMgKyAzMSkgPj4gNSA8PCAyKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhTWVNfbWVtc2V0OChkZXN0X2J1ZiwgMHhmZiwgaW1hZ2UtPnkxICogcGl0Y2gpOwotICAgIEZYX0JZVEUqKiBjaGFubmVsX2J1ZnMgPSBGWF9BbGxvYyhGWF9CWVRFKiwgaW1hZ2UtPm51bWNvbXBzKTsKLSAgICBGWF9CT09MIHJlc3VsdCA9IEZBTFNFOwotICAgIGludCogYWRqdXN0X2NvbXBzID0gRlhfQWxsb2MoaW50LCBpbWFnZS0+bnVtY29tcHMpOwotICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KWltYWdlLT5udW1jb21wczsgaSArKykgewotICAgICAgICBjaGFubmVsX2J1ZnNbaV0gPSBkZXN0X2J1ZiArIG9mZnNldHNbaV07Ci0gICAgICAgIGFkanVzdF9jb21wc1tpXSA9IGltYWdlLT5jb21wc1tpXS5wcmVjIC0gODsKLSAgICAgICAgaWYoaSA+IDApIHsKLSAgICAgICAgICAgIGlmKGltYWdlLT5jb21wc1tpXS5keCAhPSBpbWFnZS0+Y29tcHNbaSAtIDFdLmR4Ci0gICAgICAgICAgICAgICAgICAgIHx8IGltYWdlLT5jb21wc1tpXS5keSAhPSBpbWFnZS0+Y29tcHNbaSAtIDFdLmR5Ci0gICAgICAgICAgICAgICAgICAgIHx8IGltYWdlLT5jb21wc1tpXS5wcmVjICE9IGltYWdlLT5jb21wc1tpIC0gMV0ucHJlYykgewotICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICB3aWQgPSBpbWFnZS0+Y29tcHNbMF0udzsKLSAgICBoZWkgPSBpbWFnZS0+Y29tcHNbMF0uaDsKLSAgICBmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgKGludClpbWFnZS0+bnVtY29tcHM7IGNoYW5uZWwrKykgewotICAgICAgICBwQ2hhbm5lbCA9IGNoYW5uZWxfYnVmc1tjaGFubmVsXTsKLSAgICAgICAgaWYoYWRqdXN0X2NvbXBzW2NoYW5uZWxdIDwgMCkgewotICAgICAgICAgICAgZm9yKHJvdyA9IDA7IHJvdyA8IGhlaTsgcm93KyspIHsKLSAgICAgICAgICAgICAgICBwU2NhbmxpbmUgPSBwQ2hhbm5lbCArIHJvdyAqIHBpdGNoOwotICAgICAgICAgICAgICAgIGZvciAoY29sID0gMDsgY29sIDwgd2lkOyBjb2wrKykgewotICAgICAgICAgICAgICAgICAgICBwUGl4ZWwgPSBwU2NhbmxpbmUgKyBjb2wgKiBpbWFnZS0+bnVtY29tcHM7Ci0gICAgICAgICAgICAgICAgICAgIHNyYyA9IGltYWdlLT5jb21wc1tjaGFubmVsXS5kYXRhW3JvdyAqIHdpZCArIGNvbF07Ci0gICAgICAgICAgICAgICAgICAgIHNyYyArPSBpbWFnZS0+Y29tcHNbY2hhbm5lbF0uc2duZCA/IDEgPDwgKGltYWdlLT5jb21wc1tjaGFubmVsXS5wcmVjIC0gMSkgOiAwOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWRqdXN0X2NvbXBzW2NoYW5uZWxdID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgKnBQaXhlbCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcFBpeGVsID0gKEZYX0JZVEUpKHNyYyA8PCAtYWRqdXN0X2NvbXBzW2NoYW5uZWxdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvcihyb3cgPSAwOyByb3cgPCBoZWk7IHJvdysrKSB7Ci0gICAgICAgICAgICAgICAgcFNjYW5saW5lID0gcENoYW5uZWwgKyByb3cgKiBwaXRjaDsKLSAgICAgICAgICAgICAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IHdpZDsgY29sKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcFBpeGVsID0gcFNjYW5saW5lICsgY29sICogaW1hZ2UtPm51bWNvbXBzOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWltYWdlLT5jb21wc1tjaGFubmVsXS5kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzcmMgPSBpbWFnZS0+Y29tcHNbY2hhbm5lbF0uZGF0YVtyb3cgKiB3aWQgKyBjb2xdOwotICAgICAgICAgICAgICAgICAgICBzcmMgKz0gaW1hZ2UtPmNvbXBzW2NoYW5uZWxdLnNnbmQgPyAxIDw8IChpbWFnZS0+Y29tcHNbY2hhbm5lbF0ucHJlYyAtIDEpIDogMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFkanVzdF9jb21wc1tjaGFubmVsXSAtIDEgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcFBpeGVsID0gKEZYX0JZVEUpKChzcmMgPj4gYWRqdXN0X2NvbXBzW2NoYW5uZWxdKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG1wUGl4ZWwgPSAoc3JjID4+IGFkanVzdF9jb21wc1tjaGFubmVsXSkgKyAoKHNyYyA+PiAoYWRqdXN0X2NvbXBzW2NoYW5uZWxdIC0gMSkpICUgMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wUGl4ZWwgPiAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBQaXhlbCA9IDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG1wUGl4ZWwgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wUGl4ZWwgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKnBQaXhlbCA9IChGWF9CWVRFKXRtcFBpeGVsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJlc3VsdCA9IFRSVUU7CitGWF9CT09MIENKUFhfRGVjb2Rlcjo6SW5pdChjb25zdCB1bnNpZ25lZCBjaGFyKiBzcmNfZGF0YSwgRlhfRFdPUkQgc3JjX3NpemUpIHsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc3pKUDJIZWFkZXJbXSA9IHsKKyAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGMsIDB4NmEsIDB4NTAsIDB4MjAsIDB4MjAsIDB4MGQsIDB4MGEsIDB4ODcsIDB4MGF9OworICBpZiAoIXNyY19kYXRhIHx8IHNyY19zaXplIDwgc2l6ZW9mKHN6SlAySGVhZGVyKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLWRvbmU6Ci0gICAgRlhfRnJlZShjaGFubmVsX2J1ZnMpOwotICAgIEZYX0ZyZWUoYWRqdXN0X2NvbXBzKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotdm9pZCBpbml0aWFsaXplX3RyYW5zaXRpb25fdGFibGUoKTsKLXZvaWQgaW5pdGlhbGl6ZV9zaWduaWZpY2FuY2VfbHV0cygpOwotdm9pZCBpbml0aWFsaXplX3NpZ25fbHV0KCk7Ci1DQ29kZWNfSnB4TW9kdWxlOjpDQ29kZWNfSnB4TW9kdWxlKCkKLXsKLX0KLXZvaWQqIENDb2RlY19KcHhNb2R1bGU6OkNyZWF0ZURlY29kZXIoRlhfTFBDQllURSBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSAsIEZYX0JPT0wgdXNlQ29sb3JTcGFjZSkKLXsKLSAgICBDSlBYX0RlY29kZXIqIHBEZWNvZGVyID0gbmV3IENKUFhfRGVjb2RlcjsKLSAgICBwRGVjb2Rlci0+bV91c2VDb2xvclNwYWNlID0gdXNlQ29sb3JTcGFjZTsKLSAgICBpZiAoIXBEZWNvZGVyLT5Jbml0KHNyY19idWYsIHNyY19zaXplKSkgewotICAgICAgICBkZWxldGUgcERlY29kZXI7Ci0gICAgICAgIHJldHVybiBOVUxMOworICBpbWFnZSA9IE5VTEw7CisgIG1fU3JjRGF0YSA9IHNyY19kYXRhOworICBtX1NyY1NpemUgPSBzcmNfc2l6ZTsKKyAgRGVjb2RlRGF0YSBzcmNEYXRhKGNvbnN0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KHNyY19kYXRhKSwgc3JjX3NpemUpOworICBsX3N0cmVhbSA9IGZ4X29wal9zdHJlYW1fY3JlYXRlX21lbW9yeV9zdHJlYW0oJnNyY0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSjJLX1NUUkVBTV9DSFVOS19TSVpFLCAxKTsKKyAgaWYgKCFsX3N0cmVhbSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBvcGpfZHBhcmFtZXRlcnNfdCBwYXJhbWV0ZXJzOworICBvcGpfc2V0X2RlZmF1bHRfZGVjb2Rlcl9wYXJhbWV0ZXJzKCZwYXJhbWV0ZXJzKTsKKyAgcGFyYW1ldGVycy5kZWNvZF9mb3JtYXQgPSAwOworICBwYXJhbWV0ZXJzLmNvZF9mb3JtYXQgPSAzOworICBpZiAoRlhTWVNfbWVtY21wKG1fU3JjRGF0YSwgc3pKUDJIZWFkZXIsIHNpemVvZihzekpQMkhlYWRlcikpID09IDApIHsKKyAgICBsX2NvZGVjID0gb3BqX2NyZWF0ZV9kZWNvbXByZXNzKE9QSl9DT0RFQ19KUDIpOworICAgIHBhcmFtZXRlcnMuZGVjb2RfZm9ybWF0ID0gMTsKKyAgfSBlbHNlIHsKKyAgICBsX2NvZGVjID0gb3BqX2NyZWF0ZV9kZWNvbXByZXNzKE9QSl9DT0RFQ19KMkspOworICB9CisgIGlmICghbF9jb2RlYykgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAobV9Db2xvclNwYWNlICYmIG1fQ29sb3JTcGFjZS0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfSU5ERVhFRCkKKyAgICBwYXJhbWV0ZXJzLmZsYWdzIHw9IE9QSl9EUEFSQU1FVEVSU19JR05PUkVfUENMUl9DTUFQX0NERUZfRkxBRzsKKyAgb3BqX3NldF9pbmZvX2hhbmRsZXIobF9jb2RlYywgZnhfaW5mb19jYWxsYmFjaywgMDApOworICBvcGpfc2V0X3dhcm5pbmdfaGFuZGxlcihsX2NvZGVjLCBmeF93YXJuaW5nX2NhbGxiYWNrLCAwMCk7CisgIG9wal9zZXRfZXJyb3JfaGFuZGxlcihsX2NvZGVjLCBmeF9lcnJvcl9jYWxsYmFjaywgMDApOworICBpZiAoIW9wal9zZXR1cF9kZWNvZGVyKGxfY29kZWMsICZwYXJhbWV0ZXJzKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoIW9wal9yZWFkX2hlYWRlcihsX3N0cmVhbSwgbF9jb2RlYywgJmltYWdlKSkgeworICAgIGltYWdlID0gTlVMTDsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW1hZ2UtPnBkZml1bV91c2VfY29sb3JzcGFjZSA9ICEhbV9Db2xvclNwYWNlOworCisgIGlmICghcGFyYW1ldGVycy5uYl90aWxlX3RvX2RlY29kZSkgeworICAgIGlmICghb3BqX3NldF9kZWNvZGVfYXJlYShsX2NvZGVjLCBpbWFnZSwgcGFyYW1ldGVycy5EQV94MCwgcGFyYW1ldGVycy5EQV95MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5EQV94MSwgcGFyYW1ldGVycy5EQV95MSkpIHsKKyAgICAgIG9wal9pbWFnZV9kZXN0cm95KGltYWdlKTsKKyAgICAgIGltYWdlID0gTlVMTDsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgcmV0dXJuIHBEZWNvZGVyOworICAgIGlmICghKG9wal9kZWNvZGUobF9jb2RlYywgbF9zdHJlYW0sIGltYWdlKSAmJgorICAgICAgICAgIG9wal9lbmRfZGVjb21wcmVzcyhsX2NvZGVjLCBsX3N0cmVhbSkpKSB7CisgICAgICBvcGpfaW1hZ2VfZGVzdHJveShpbWFnZSk7CisgICAgICBpbWFnZSA9IE5VTEw7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICghb3BqX2dldF9kZWNvZGVkX3RpbGUobF9jb2RlYywgbF9zdHJlYW0sIGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy50aWxlX2luZGV4KSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorICBvcGpfc3RyZWFtX2Rlc3Ryb3kobF9zdHJlYW0pOworICBsX3N0cmVhbSA9IE5VTEw7CisgIGlmIChpbWFnZS0+Y29sb3Jfc3BhY2UgIT0gT1BKX0NMUlNQQ19TWUNDICYmIGltYWdlLT5udW1jb21wcyA9PSAzICYmCisgICAgICBpbWFnZS0+Y29tcHNbMF0uZHggPT0gaW1hZ2UtPmNvbXBzWzBdLmR5ICYmIGltYWdlLT5jb21wc1sxXS5keCAhPSAxKSB7CisgICAgaW1hZ2UtPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19TWUNDOworICB9IGVsc2UgaWYgKGltYWdlLT5udW1jb21wcyA8PSAyKSB7CisgICAgaW1hZ2UtPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19HUkFZOworICB9CisgIGlmIChpbWFnZS0+Y29sb3Jfc3BhY2UgPT0gT1BKX0NMUlNQQ19TWUNDKSB7CisgICAgY29sb3Jfc3ljY190b19yZ2IoaW1hZ2UpOworICB9CisgIGlmIChpbWFnZS0+aWNjX3Byb2ZpbGVfYnVmKSB7CisgICAgRlhfRnJlZShpbWFnZS0+aWNjX3Byb2ZpbGVfYnVmKTsKKyAgICBpbWFnZS0+aWNjX3Byb2ZpbGVfYnVmID0gTlVMTDsKKyAgICBpbWFnZS0+aWNjX3Byb2ZpbGVfbGVuID0gMDsKKyAgfQorICBpZiAoIWltYWdlKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOwogfQotdm9pZCBDQ29kZWNfSnB4TW9kdWxlOjpHZXRJbWFnZUluZm8oRlhfTFBWT0lEIGN0eCwgRlhfRFdPUkQmIHdpZHRoLCBGWF9EV09SRCYgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGNvZGVzdHJlYW1fbkNvbXBzLCBGWF9EV09SRCYgb3V0cHV0X25Db21wcykKLXsKLSAgICBDSlBYX0RlY29kZXIqIHBEZWNvZGVyID0gKENKUFhfRGVjb2RlciopY3R4OwotICAgIHBEZWNvZGVyLT5HZXRJbmZvKHdpZHRoLCBoZWlnaHQsIGNvZGVzdHJlYW1fbkNvbXBzLCBvdXRwdXRfbkNvbXBzKTsKKwordm9pZCBDSlBYX0RlY29kZXI6OkdldEluZm8oRlhfRFdPUkQqIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBjb21wb25lbnRzKSB7CisgICp3aWR0aCA9IChGWF9EV09SRClpbWFnZS0+eDE7CisgICpoZWlnaHQgPSAoRlhfRFdPUkQpaW1hZ2UtPnkxOworICAqY29tcG9uZW50cyA9IChGWF9EV09SRClpbWFnZS0+bnVtY29tcHM7CiB9Ci1GWF9CT09MIENDb2RlY19KcHhNb2R1bGU6OkRlY29kZSh2b2lkKiBjdHgsIEZYX0xQQllURSBkZXN0X2RhdGEsIGludCBwaXRjaCwgRlhfQk9PTCBiVHJhbnNsYXRlQ29sb3IsIEZYX0xQQllURSBvZmZzZXRzKQotewotICAgIENKUFhfRGVjb2RlciogcERlY29kZXIgPSAoQ0pQWF9EZWNvZGVyKiljdHg7Ci0gICAgcmV0dXJuIHBEZWNvZGVyLT5EZWNvZGUoZGVzdF9kYXRhLCBwaXRjaCwgYlRyYW5zbGF0ZUNvbG9yLCBvZmZzZXRzKTsKKworYm9vbCBDSlBYX0RlY29kZXI6OkRlY29kZSh1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgb2Zmc2V0cykgeworICBpZiAoaW1hZ2UtPmNvbXBzWzBdLncgIT0gaW1hZ2UtPngxIHx8IGltYWdlLT5jb21wc1swXS5oICE9IGltYWdlLT55MSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKHBpdGNoPChpbnQpKGltYWdlLT5jb21wc1swXS53ICogOCAqIGltYWdlLT5udW1jb21wcyArIDMxKT4+IDUgPDwgMikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgRlhTWVNfbWVtc2V0KGRlc3RfYnVmLCAweGZmLCBpbWFnZS0+eTEgKiBwaXRjaCk7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3QqPiBjaGFubmVsX2J1ZnMoaW1hZ2UtPm51bWNvbXBzKTsKKyAgc3RkOjp2ZWN0b3I8aW50PiBhZGp1c3RfY29tcHMoaW1hZ2UtPm51bWNvbXBzKTsKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGltYWdlLT5udW1jb21wczsgaSsrKSB7CisgICAgY2hhbm5lbF9idWZzW2ldID0gZGVzdF9idWYgKyBvZmZzZXRzW2ldOworICAgIGFkanVzdF9jb21wc1tpXSA9IGltYWdlLT5jb21wc1tpXS5wcmVjIC0gODsKKyAgICBpZiAoaSA+IDApIHsKKyAgICAgIGlmIChpbWFnZS0+Y29tcHNbaV0uZHggIT0gaW1hZ2UtPmNvbXBzW2kgLSAxXS5keCB8fAorICAgICAgICAgIGltYWdlLT5jb21wc1tpXS5keSAhPSBpbWFnZS0+Y29tcHNbaSAtIDFdLmR5IHx8CisgICAgICAgICAgaW1hZ2UtPmNvbXBzW2ldLnByZWMgIT0gaW1hZ2UtPmNvbXBzW2kgLSAxXS5wcmVjKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaW50IHdpZHRoID0gaW1hZ2UtPmNvbXBzWzBdLnc7CisgIGludCBoZWlnaHQgPSBpbWFnZS0+Y29tcHNbMF0uaDsKKyAgZm9yICh1aW50MzJfdCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGltYWdlLT5udW1jb21wczsgKytjaGFubmVsKSB7CisgICAgdWludDhfdCogcENoYW5uZWwgPSBjaGFubmVsX2J1ZnNbY2hhbm5lbF07CisgICAgaWYgKGFkanVzdF9jb21wc1tjaGFubmVsXSA8IDApIHsKKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgKytyb3cpIHsKKyAgICAgICAgdWludDhfdCogcFNjYW5saW5lID0gcENoYW5uZWwgKyByb3cgKiBwaXRjaDsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7ICsrY29sKSB7CisgICAgICAgICAgdWludDhfdCogcFBpeGVsID0gcFNjYW5saW5lICsgY29sICogaW1hZ2UtPm51bWNvbXBzOworICAgICAgICAgIGludCBzcmMgPSBpbWFnZS0+Y29tcHNbY2hhbm5lbF0uZGF0YVtyb3cgKiB3aWR0aCArIGNvbF07CisgICAgICAgICAgc3JjICs9IGltYWdlLT5jb21wc1tjaGFubmVsXS5zZ25kCisgICAgICAgICAgICAgICAgICAgICA/IDEgPDwgKGltYWdlLT5jb21wc1tjaGFubmVsXS5wcmVjIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgICAgICAgICBpZiAoYWRqdXN0X2NvbXBzW2NoYW5uZWxdID4gMCkgeworICAgICAgICAgICAgKnBQaXhlbCA9IDA7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpwUGl4ZWwgPSAodWludDhfdCkoc3JjIDw8IC1hZGp1c3RfY29tcHNbY2hhbm5lbF0pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7ICsrcm93KSB7CisgICAgICAgIHVpbnQ4X3QqIHBTY2FubGluZSA9IHBDaGFubmVsICsgcm93ICogcGl0Y2g7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyArK2NvbCkgeworICAgICAgICAgIHVpbnQ4X3QqIHBQaXhlbCA9IHBTY2FubGluZSArIGNvbCAqIGltYWdlLT5udW1jb21wczsKKyAgICAgICAgICBpZiAoIWltYWdlLT5jb21wc1tjaGFubmVsXS5kYXRhKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaW50IHNyYyA9IGltYWdlLT5jb21wc1tjaGFubmVsXS5kYXRhW3JvdyAqIHdpZHRoICsgY29sXTsKKyAgICAgICAgICBzcmMgKz0gaW1hZ2UtPmNvbXBzW2NoYW5uZWxdLnNnbmQKKyAgICAgICAgICAgICAgICAgICAgID8gMSA8PCAoaW1hZ2UtPmNvbXBzW2NoYW5uZWxdLnByZWMgLSAxKQorICAgICAgICAgICAgICAgICAgICAgOiAwOworICAgICAgICAgIGlmIChhZGp1c3RfY29tcHNbY2hhbm5lbF0gLSAxIDwgMCkgeworICAgICAgICAgICAgKnBQaXhlbCA9ICh1aW50OF90KSgoc3JjID4+IGFkanVzdF9jb21wc1tjaGFubmVsXSkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgdG1wUGl4ZWwgPSAoc3JjID4+IGFkanVzdF9jb21wc1tjaGFubmVsXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzcmMgPj4gKGFkanVzdF9jb21wc1tjaGFubmVsXSAtIDEpKSAlIDIpOworICAgICAgICAgICAgaWYgKHRtcFBpeGVsID4gMjU1KSB7CisgICAgICAgICAgICAgIHRtcFBpeGVsID0gMjU1OworICAgICAgICAgICAgfSBlbHNlIGlmICh0bXBQaXhlbCA8IDApIHsKKyAgICAgICAgICAgICAgdG1wUGl4ZWwgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBQaXhlbCA9ICh1aW50OF90KXRtcFBpeGVsOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKIH0KLXZvaWQgQ0NvZGVjX0pweE1vZHVsZTo6RGVzdHJveURlY29kZXIodm9pZCogY3R4KQotewotICAgIENKUFhfRGVjb2RlciogcERlY29kZXIgPSAoQ0pQWF9EZWNvZGVyKiljdHg7Ci0gICAgZGVsZXRlIHBEZWNvZGVyOworCitDQ29kZWNfSnB4TW9kdWxlOjpDQ29kZWNfSnB4TW9kdWxlKCkge30KK0NDb2RlY19KcHhNb2R1bGU6On5DQ29kZWNfSnB4TW9kdWxlKCkgeworfQorCitDSlBYX0RlY29kZXIqIENDb2RlY19KcHhNb2R1bGU6OkNyZWF0ZURlY29kZXIoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0NvbG9yU3BhY2UqIGNzKSB7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSlBYX0RlY29kZXI+IGRlY29kZXIobmV3IENKUFhfRGVjb2RlcihjcykpOworICByZXR1cm4gZGVjb2Rlci0+SW5pdChzcmNfYnVmLCBzcmNfc2l6ZSkgPyBkZWNvZGVyLnJlbGVhc2UoKSA6IG51bGxwdHI7Cit9CisKK3ZvaWQgQ0NvZGVjX0pweE1vZHVsZTo6R2V0SW1hZ2VJbmZvKENKUFhfRGVjb2RlciogcERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIGNvbXBvbmVudHMpIHsKKyAgcERlY29kZXItPkdldEluZm8od2lkdGgsIGhlaWdodCwgY29tcG9uZW50cyk7Cit9CisKK2Jvb2wgQ0NvZGVjX0pweE1vZHVsZTo6RGVjb2RlKENKUFhfRGVjb2RlciogcERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgb2Zmc2V0cykgeworICByZXR1cm4gcERlY29kZXItPkRlY29kZShkZXN0X2RhdGEsIHBpdGNoLCBvZmZzZXRzKTsKK30KKwordm9pZCBDQ29kZWNfSnB4TW9kdWxlOjpEZXN0cm95RGVjb2RlcihDSlBYX0RlY29kZXIqIHBEZWNvZGVyKSB7CisgIGRlbGV0ZSBwRGVjb2RlcjsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanB4X3VuaXR0ZXN0LmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanB4X3VuaXR0ZXN0LmNwcAppbmRleCAzZTE2YmQwLi40MTM5ZmJkIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pweF91bml0dGVzdC5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qcHhfdW5pdHRlc3QuY3BwCkBAIC03LDggKzcsOCBAQAogI2luY2x1ZGUgPGxpbWl0cz4KIAogI2luY2x1ZGUgImNvZGVjX2ludC5oIgorI2luY2x1ZGUgInRlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vdGVzdGluZy9meF9zdHJpbmdfdGVzdGhlbHBlcnMuaCIKIAogc3RhdGljIGNvbnN0IE9QSl9PRkZfVCBrU2tpcEVycm9yID0gc3RhdGljX2Nhc3Q8T1BKX09GRl9UPigtMSk7CiBzdGF0aWMgY29uc3QgT1BKX1NJWkVfVCBrUmVhZEVycm9yID0gc3RhdGljX2Nhc3Q8T1BKX1NJWkVfVD4oLTEpOwpAQCAtMjAsNDUxICsyMCw1MTkgQEAKIH07CiAKIFRFU1QoZnhjb2RlYywgRGVjb2RlRGF0YU51bGxEZWNvZGVEYXRhKSB7Ci0gICAgdW5zaWduZWQgY2hhciBidWZmZXJbMTZdOwotICAgIERlY29kZURhdGEqIHB0ciA9IG51bGxwdHI7CisgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzE2XTsKKyAgRGVjb2RlRGF0YSogcHRyID0gbnVsbHB0cjsKIAotICAgIC8vIEVycm9yIGNvZGVzLCBub3Qgc2VndnMsIHNob3VsZCBjYWxsZXJzIHBhc3MgdXMgYSBOVUxMIHBvaW50ZXIuCi0gICAgRVhQRUNUX0VRKGtSZWFkRXJyb3IsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIHB0cikpOwotICAgIEVYUEVDVF9FUShrV3JpdGVFcnJvciwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIHB0cikpOwotICAgIEVYUEVDVF9FUShrU2tpcEVycm9yLCBvcGpfc2tpcF9mcm9tX21lbW9yeSgxLCBwdHIpKTsKLSAgICBFWFBFQ1RfRkFMU0Uob3BqX3NlZWtfZnJvbV9tZW1vcnkoMSwgcHRyKSk7CisgIC8vIEVycm9yIGNvZGVzLCBub3Qgc2VndnMsIHNob3VsZCBjYWxsZXJzIHBhc3MgdXMgYSBOVUxMIHBvaW50ZXIuCisgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIHNpemVvZihidWZmZXIpLCBwdHIpKTsKKyAgRVhQRUNUX0VRKGtXcml0ZUVycm9yLCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgcHRyKSk7CisgIEVYUEVDVF9FUShrU2tpcEVycm9yLCBvcGpfc2tpcF9mcm9tX21lbW9yeSgxLCBwdHIpKTsKKyAgRVhQRUNUX0ZBTFNFKG9wal9zZWVrX2Zyb21fbWVtb3J5KDEsIHB0cikpOwogfQogCiBURVNUKGZ4Y29kZWMsIERlY29kZURhdGFOdWxsU3RyZWFtKSB7Ci0gICAgRGVjb2RlRGF0YSBkZChudWxscHRyLCAwKTsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclsxNl07CisgIERlY29kZURhdGEgZGQobnVsbHB0ciwgMCk7CisgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzE2XTsKIAotICAgIC8vIFJlYWRzIG9mIHNpemUgMCBkbyBub3RoaW5nIGJ1dCByZXR1cm4gYW4gZXJyb3IgY29kZS4KLSAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgRVhQRUNUX0VRKGtSZWFkRXJyb3IsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMCwgJmRkKSk7Ci0gICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclswXSk7CisgIC8vIFJlYWRzIG9mIHNpemUgMCBkbyBub3RoaW5nIGJ1dCByZXR1cm4gYW4gZXJyb3IgY29kZS4KKyAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOworICBFWFBFQ1RfRVEoa1JlYWRFcnJvciwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAwLCAmZGQpKTsKKyAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclswXSk7CiAKLSAgICAvLyBSZWFkcyBvZiBub256ZXJvIHNpemUgZG8gbm90aGluZyBidXQgcmV0dXJuIGFuIGVycm9yIGNvZGUuCi0gICAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIHNpemVvZihidWZmZXIpLCAmZGQpKTsKLSAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzBdKTsKKyAgLy8gUmVhZHMgb2Ygbm9uemVybyBzaXplIGRvIG5vdGhpbmcgYnV0IHJldHVybiBhbiBlcnJvciBjb2RlLgorICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7CisgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIHNpemVvZihidWZmZXIpLCAmZGQpKTsKKyAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclswXSk7CiAKLSAgICAvLyB3cml0ZXMgb2Ygc2l6ZSAwIGRvIG5vdGhpbmcgYnV0IHJldHVybiBhbiBlcnJvciBjb2RlLgotICAgIEVYUEVDVF9FUShrV3JpdGVFcnJvciwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMCwgJmRkKSk7CisgIC8vIHdyaXRlcyBvZiBzaXplIDAgZG8gbm90aGluZyBidXQgcmV0dXJuIGFuIGVycm9yIGNvZGUuCisgIEVYUEVDVF9FUShrV3JpdGVFcnJvciwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMCwgJmRkKSk7CiAKLSAgICAvLyB3cml0ZXMgb2Ygbm9uemVybyBzaXplIGRvIG5vdGhpbmcgYnV0IHJldHVybiBhbiBlcnJvciBjb2RlLgotICAgIEVYUEVDVF9FUShrV3JpdGVFcnJvciwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICZkZCkpOworICAvLyB3cml0ZXMgb2Ygbm9uemVybyBzaXplIGRvIG5vdGhpbmcgYnV0IHJldHVybiBhbiBlcnJvciBjb2RlLgorICBFWFBFQ1RfRVEoa1dyaXRlRXJyb3IsIG9wal93cml0ZV9mcm9tX21lbW9yeShidWZmZXIsIHNpemVvZihidWZmZXIpLCAmZGQpKTsKIAotICAgIC8vIFNraXBzIG9mIHNpemUgMCBhbHdheXMgcmV0dXJuIGFuIGVycm9yIGNvZGUuCi0gICAgRVhQRUNUX0VRKGtTa2lwRXJyb3IsIG9wal9za2lwX2Zyb21fbWVtb3J5KDAsICZkZCkpOworICAvLyBTa2lwcyBvZiBzaXplIDAgYWx3YXlzIHJldHVybiBhbiBlcnJvciBjb2RlLgorICBFWFBFQ1RfRVEoa1NraXBFcnJvciwgb3BqX3NraXBfZnJvbV9tZW1vcnkoMCwgJmRkKSk7CiAKLSAgICAvLyBTa2lwcyBvZiBub256ZXJvIHNpemUgYWx3YXlzIHJldHVybiBhbiBlcnJvciBjb2RlLgotICAgIEVYUEVDVF9FUShrU2tpcEVycm9yLCBvcGpfc2tpcF9mcm9tX21lbW9yeSgxLCAmZGQpKTsKKyAgLy8gU2tpcHMgb2Ygbm9uemVybyBzaXplIGFsd2F5cyByZXR1cm4gYW4gZXJyb3IgY29kZS4KKyAgRVhQRUNUX0VRKGtTa2lwRXJyb3IsIG9wal9za2lwX2Zyb21fbWVtb3J5KDEsICZkZCkpOwogCi0gICAgLy8gU2Vla3MgdG8gMCBvZmZzZXQgcmV0dXJuIGluIGVycm9yLgotICAgIEVYUEVDVF9GQUxTRShvcGpfc2Vla19mcm9tX21lbW9yeSgwLCAmZGQpKTsKKyAgLy8gU2Vla3MgdG8gMCBvZmZzZXQgcmV0dXJuIGluIGVycm9yLgorICBFWFBFQ1RfRkFMU0Uob3BqX3NlZWtfZnJvbV9tZW1vcnkoMCwgJmRkKSk7CiAKLSAgICAvLyBTZWVrcyB0byBub24temVybyBvZmZzZXRzIHJldHVybiBpbiBlcnJvci4KLSAgICBFWFBFQ1RfRkFMU0Uob3BqX3NlZWtfZnJvbV9tZW1vcnkoMSwgJmRkKSk7CisgIC8vIFNlZWtzIHRvIG5vbi16ZXJvIG9mZnNldHMgcmV0dXJuIGluIGVycm9yLgorICBFWFBFQ1RfRkFMU0Uob3BqX3NlZWtfZnJvbV9tZW1vcnkoMSwgJmRkKSk7CiB9CiAKIFRFU1QoZnhjb2RlYywgRGVjb2RlRGF0YVplcm9TaXplKSB7Ci0gICAgRGVjb2RlRGF0YSBkZChzdHJlYW1fZGF0YSwgMCk7Ci0gICAgdW5zaWduZWQgY2hhciBidWZmZXJbMTZdOworICBEZWNvZGVEYXRhIGRkKHN0cmVhbV9kYXRhLCAwKTsKKyAgdW5zaWduZWQgY2hhciBidWZmZXJbMTZdOwogCi0gICAgLy8gUmVhZHMgb2Ygc2l6ZSAwIGRvIG5vdGhpbmcgYnV0IHJldHVybiBhbiBlcnJvciBjb2RlLgotICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKLSAgICBFWFBFQ1RfRVEoa1JlYWRFcnJvciwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAwLCAmZGQpKTsKLSAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzBdKTsKKyAgLy8gUmVhZHMgb2Ygc2l6ZSAwIGRvIG5vdGhpbmcgYnV0IHJldHVybiBhbiBlcnJvciBjb2RlLgorICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7CisgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDAsICZkZCkpOworICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzBdKTsKIAotICAgIC8vIFJlYWRzIG9mIG5vbnplcm8gc2l6ZSBkbyBub3RoaW5nIGJ1dCByZXR1cm4gYW4gZXJyb3IgY29kZS4KLSAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgRVhQRUNUX0VRKGtSZWFkRXJyb3IsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICZkZCkpOwotICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMF0pOworICAvLyBSZWFkcyBvZiBub256ZXJvIHNpemUgZG8gbm90aGluZyBidXQgcmV0dXJuIGFuIGVycm9yIGNvZGUuCisgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKKyAgRVhQRUNUX0VRKGtSZWFkRXJyb3IsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICZkZCkpOworICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzBdKTsKIAotICAgIC8vIHdyaXRlcyBvZiBzaXplIDAgZG8gbm90aGluZyBidXQgcmV0dXJuIGFuIGVycm9yIGNvZGUuCi0gICAgRVhQRUNUX0VRKGtXcml0ZUVycm9yLCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkoYnVmZmVyLCAwLCAmZGQpKTsKKyAgLy8gd3JpdGVzIG9mIHNpemUgMCBkbyBub3RoaW5nIGJ1dCByZXR1cm4gYW4gZXJyb3IgY29kZS4KKyAgRVhQRUNUX0VRKGtXcml0ZUVycm9yLCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkoYnVmZmVyLCAwLCAmZGQpKTsKIAotICAgIC8vIHdyaXRlcyBvZiBub256ZXJvIHNpemUgZG8gbm90aGluZyBidXQgcmV0dXJuIGFuIGVycm9yIGNvZGUuCi0gICAgRVhQRUNUX0VRKGtXcml0ZUVycm9yLCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgJmRkKSk7CisgIC8vIHdyaXRlcyBvZiBub256ZXJvIHNpemUgZG8gbm90aGluZyBidXQgcmV0dXJuIGFuIGVycm9yIGNvZGUuCisgIEVYUEVDVF9FUShrV3JpdGVFcnJvciwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICZkZCkpOwogCi0gICAgLy8gU2tpcHMgb2Ygc2l6ZSAwIGFsd2F5cyByZXR1cm4gYW4gZXJyb3IgY29kZS4KLSAgICBFWFBFQ1RfRVEoa1NraXBFcnJvciwgb3BqX3NraXBfZnJvbV9tZW1vcnkoMCwgJmRkKSk7CisgIC8vIFNraXBzIG9mIHNpemUgMCBhbHdheXMgcmV0dXJuIGFuIGVycm9yIGNvZGUuCisgIEVYUEVDVF9FUShrU2tpcEVycm9yLCBvcGpfc2tpcF9mcm9tX21lbW9yeSgwLCAmZGQpKTsKIAotICAgIC8vIFNraXBzIG9mIG5vbnplcm8gc2l6ZSBhbHdheXMgcmV0dXJuIGFuIGVycm9yIGNvZGUuCi0gICAgRVhQRUNUX0VRKGtTa2lwRXJyb3IsIG9wal9za2lwX2Zyb21fbWVtb3J5KDEsICZkZCkpOworICAvLyBTa2lwcyBvZiBub256ZXJvIHNpemUgYWx3YXlzIHJldHVybiBhbiBlcnJvciBjb2RlLgorICBFWFBFQ1RfRVEoa1NraXBFcnJvciwgb3BqX3NraXBfZnJvbV9tZW1vcnkoMSwgJmRkKSk7CiAKLSAgICAvLyBTZWVrcyB0byAwIG9mZnNldCByZXR1cm4gaW4gZXJyb3IuCi0gICAgRVhQRUNUX0ZBTFNFKG9wal9zZWVrX2Zyb21fbWVtb3J5KDAsICZkZCkpOworICAvLyBTZWVrcyB0byAwIG9mZnNldCByZXR1cm4gaW4gZXJyb3IuCisgIEVYUEVDVF9GQUxTRShvcGpfc2Vla19mcm9tX21lbW9yeSgwLCAmZGQpKTsKIAotICAgIC8vIFNlZWtzIHRvIG5vbi16ZXJvIG9mZnNldHMgcmV0dXJuIGluIGVycm9yLgotICAgIEVYUEVDVF9GQUxTRShvcGpfc2Vla19mcm9tX21lbW9yeSgxLCAmZGQpKTsKKyAgLy8gU2Vla3MgdG8gbm9uLXplcm8gb2Zmc2V0cyByZXR1cm4gaW4gZXJyb3IuCisgIEVYUEVDVF9GQUxTRShvcGpfc2Vla19mcm9tX21lbW9yeSgxLCAmZGQpKTsKIH0KIAogVEVTVChmeGNvZGVjLCBEZWNvZGVEYXRhUmVhZEluQm91bmRzKSB7Ci0gICAgdW5zaWduZWQgY2hhciBidWZmZXJbMTZdOwotICAgIHsKLSAgICAgICAgRGVjb2RlRGF0YSBkZChzdHJlYW1fZGF0YSwgc2l6ZW9mKHN0cmVhbV9kYXRhKSk7CisgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzE2XTsKKyAgeworICAgIERlY29kZURhdGEgZGQoc3RyZWFtX2RhdGEsIHNpemVvZihzdHJlYW1fZGF0YSkpOwogCi0gICAgICAgIC8vIEV4YWN0IHNpemVkIHJlYWQgaW4gYSBzaW5nbGUgY2FsbC4KLSAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgICAgICBFWFBFQ1RfRVEoOHUsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICZkZCkpOwotICAgICAgICBFWFBFQ1RfRVEoMHgwMCwgYnVmZmVyWzBdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MDEsIGJ1ZmZlclsxXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDAyLCBidWZmZXJbMl0pOwotICAgICAgICBFWFBFQ1RfRVEoMHgwMywgYnVmZmVyWzNdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4ODQsIGJ1ZmZlcls0XSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDg1LCBidWZmZXJbNV0pOwotICAgICAgICBFWFBFQ1RfRVEoMHg4NiwgYnVmZmVyWzZdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4ODcsIGJ1ZmZlcls3XSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbOF0pOwotICAgIH0KLSAgICB7Ci0gICAgICAgIERlY29kZURhdGEgZGQoc3RyZWFtX2RhdGEsIHNpemVvZihzdHJlYW1fZGF0YSkpOworICAgIC8vIEV4YWN0IHNpemVkIHJlYWQgaW4gYSBzaW5nbGUgY2FsbC4KKyAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7CisgICAgRVhQRUNUX0VRKDh1LCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIHNpemVvZihidWZmZXIpLCAmZGQpKTsKKyAgICBFWFBFQ1RfRVEoMHgwMCwgYnVmZmVyWzBdKTsKKyAgICBFWFBFQ1RfRVEoMHgwMSwgYnVmZmVyWzFdKTsKKyAgICBFWFBFQ1RfRVEoMHgwMiwgYnVmZmVyWzJdKTsKKyAgICBFWFBFQ1RfRVEoMHgwMywgYnVmZmVyWzNdKTsKKyAgICBFWFBFQ1RfRVEoMHg4NCwgYnVmZmVyWzRdKTsKKyAgICBFWFBFQ1RfRVEoMHg4NSwgYnVmZmVyWzVdKTsKKyAgICBFWFBFQ1RfRVEoMHg4NiwgYnVmZmVyWzZdKTsKKyAgICBFWFBFQ1RfRVEoMHg4NywgYnVmZmVyWzddKTsKKyAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzhdKTsKKyAgfQorICB7CisgICAgRGVjb2RlRGF0YSBkZChzdHJlYW1fZGF0YSwgc2l6ZW9mKHN0cmVhbV9kYXRhKSk7CiAKLSAgICAgICAgLy8gU2ltcGxlIHJlYWQuCi0gICAgICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKLSAgICAgICAgRVhQRUNUX0VRKDJ1LCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDIsICZkZCkpOwotICAgICAgICBFWFBFQ1RfRVEoMHgwMCwgYnVmZmVyWzBdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MDEsIGJ1ZmZlclsxXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMl0pOworICAgIC8vIFNpbXBsZSByZWFkLgorICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKKyAgICBFWFBFQ1RfRVEoMnUsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMiwgJmRkKSk7CisgICAgRVhQRUNUX0VRKDB4MDAsIGJ1ZmZlclswXSk7CisgICAgRVhQRUNUX0VRKDB4MDEsIGJ1ZmZlclsxXSk7CisgICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclsyXSk7CiAKLSAgICAgICAgLy8gUmVhZCBvZiBzaXplIDAgZG9lc24ndCBhZmZlY3QgdGhpbmdzLgotICAgICAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgwdSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAwLCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclswXSk7CisgICAgLy8gUmVhZCBvZiBzaXplIDAgZG9lc24ndCBhZmZlY3QgdGhpbmdzLgorICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKKyAgICBFWFBFQ1RfRVEoMHUsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMCwgJmRkKSk7CisgICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclswXSk7CiAKLSAgICAgICAgLy8gUmVhZCBleGFjdGx5IHVwIHRvIGVuZCBvZiBkYXRhLgotICAgICAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgICAgIEVYUEVDVF9FUSg2dSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCA2LCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MDIsIGJ1ZmZlclswXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDAzLCBidWZmZXJbMV0pOwotICAgICAgICBFWFBFQ1RfRVEoMHg4NCwgYnVmZmVyWzJdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4ODUsIGJ1ZmZlclszXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDg2LCBidWZmZXJbNF0pOwotICAgICAgICBFWFBFQ1RfRVEoMHg4NywgYnVmZmVyWzVdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlcls2XSk7CisgICAgLy8gUmVhZCBleGFjdGx5IHVwIHRvIGVuZCBvZiBkYXRhLgorICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKKyAgICBFWFBFQ1RfRVEoNnUsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgNiwgJmRkKSk7CisgICAgRVhQRUNUX0VRKDB4MDIsIGJ1ZmZlclswXSk7CisgICAgRVhQRUNUX0VRKDB4MDMsIGJ1ZmZlclsxXSk7CisgICAgRVhQRUNUX0VRKDB4ODQsIGJ1ZmZlclsyXSk7CisgICAgRVhQRUNUX0VRKDB4ODUsIGJ1ZmZlclszXSk7CisgICAgRVhQRUNUX0VRKDB4ODYsIGJ1ZmZlcls0XSk7CisgICAgRVhQRUNUX0VRKDB4ODcsIGJ1ZmZlcls1XSk7CisgICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlcls2XSk7CiAKLSAgICAgICAgLy8gUmVhZCBvZiBzaXplIDAgYXQgRU9GIGlzIHN0aWxsIGFuIGVycm9yLgotICAgICAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgICAgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDAsICZkZCkpOwotICAgICAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzBdKTsKLSAgICB9CisgICAgLy8gUmVhZCBvZiBzaXplIDAgYXQgRU9GIGlzIHN0aWxsIGFuIGVycm9yLgorICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKKyAgICBFWFBFQ1RfRVEoa1JlYWRFcnJvciwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAwLCAmZGQpKTsKKyAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzBdKTsKKyAgfQogfQogCiBURVNUKGZ4Y29kZWMsIERlY29kZURhdGFSZWFkQmV5b25kQm91bmRzKSB7Ci0gICAgdW5zaWduZWQgY2hhciBidWZmZXJbMTZdOwotICAgIHsKLSAgICAgICAgRGVjb2RlRGF0YSBkZChzdHJlYW1fZGF0YSwgc2l6ZW9mKHN0cmVhbV9kYXRhKSk7CisgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzE2XTsKKyAgeworICAgIERlY29kZURhdGEgZGQoc3RyZWFtX2RhdGEsIHNpemVvZihzdHJlYW1fZGF0YSkpOwogCi0gICAgICAgIC8vIFJlYWQgYmV5b25kIGJvdW5kcyBpbiBhIHNpbmdsZSBzdGVwLgotICAgICAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgICAgIEVYUEVDVF9FUSg4dSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSArIDEsICZkZCkpOwotICAgICAgICBFWFBFQ1RfRVEoMHgwMCwgYnVmZmVyWzBdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MDEsIGJ1ZmZlclsxXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDAyLCBidWZmZXJbMl0pOwotICAgICAgICBFWFBFQ1RfRVEoMHgwMywgYnVmZmVyWzNdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4ODQsIGJ1ZmZlcls0XSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDg1LCBidWZmZXJbNV0pOwotICAgICAgICBFWFBFQ1RfRVEoMHg4NiwgYnVmZmVyWzZdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4ODcsIGJ1ZmZlcls3XSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbOF0pOwotICAgIH0KLSAgICB7Ci0gICAgICAgIERlY29kZURhdGEgZGQoc3RyZWFtX2RhdGEsIHNpemVvZihzdHJlYW1fZGF0YSkpOworICAgIC8vIFJlYWQgYmV5b25kIGJvdW5kcyBpbiBhIHNpbmdsZSBzdGVwLgorICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKKyAgICBFWFBFQ1RfRVEoOHUsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgKyAxLCAmZGQpKTsKKyAgICBFWFBFQ1RfRVEoMHgwMCwgYnVmZmVyWzBdKTsKKyAgICBFWFBFQ1RfRVEoMHgwMSwgYnVmZmVyWzFdKTsKKyAgICBFWFBFQ1RfRVEoMHgwMiwgYnVmZmVyWzJdKTsKKyAgICBFWFBFQ1RfRVEoMHgwMywgYnVmZmVyWzNdKTsKKyAgICBFWFBFQ1RfRVEoMHg4NCwgYnVmZmVyWzRdKTsKKyAgICBFWFBFQ1RfRVEoMHg4NSwgYnVmZmVyWzVdKTsKKyAgICBFWFBFQ1RfRVEoMHg4NiwgYnVmZmVyWzZdKTsKKyAgICBFWFBFQ1RfRVEoMHg4NywgYnVmZmVyWzddKTsKKyAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzhdKTsKKyAgfQorICB7CisgICAgRGVjb2RlRGF0YSBkZChzdHJlYW1fZGF0YSwgc2l6ZW9mKHN0cmVhbV9kYXRhKSk7CiAKLSAgICAgICAgLy8gUmVhZCB3ZWxsIGJleW9uZCBib3VuZHMgaW4gYSBzaW5nbGUgc3RlcC4KLSAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgICAgICBFWFBFQ1RfRVEoOHUsIG9wal9yZWFkX2Zyb21fbWVtb3J5KAotICAgICAgICAgICAgYnVmZmVyLCBzdGQ6Om51bWVyaWNfbGltaXRzPE9QSl9TSVpFX1Q+OjptYXgoKSwgJmRkKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDAwLCBidWZmZXJbMF0pOwotICAgICAgICBFWFBFQ1RfRVEoMHgwMSwgYnVmZmVyWzFdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MDIsIGJ1ZmZlclsyXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDAzLCBidWZmZXJbM10pOwotICAgICAgICBFWFBFQ1RfRVEoMHg4NCwgYnVmZmVyWzRdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4ODUsIGJ1ZmZlcls1XSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDg2LCBidWZmZXJbNl0pOwotICAgICAgICBFWFBFQ1RfRVEoMHg4NywgYnVmZmVyWzddKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlcls4XSk7Ci0gICAgfQotICAgIHsKLSAgICAgICAgRGVjb2RlRGF0YSBkZChzdHJlYW1fZGF0YSwgc2l6ZW9mKHN0cmVhbV9kYXRhKSk7CisgICAgLy8gUmVhZCB3ZWxsIGJleW9uZCBib3VuZHMgaW4gYSBzaW5nbGUgc3RlcC4KKyAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7CisgICAgRVhQRUNUX0VRKDh1LCBvcGpfcmVhZF9mcm9tX21lbW9yeSgKKyAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIHN0ZDo6bnVtZXJpY19saW1pdHM8T1BKX1NJWkVfVD46Om1heCgpLCAmZGQpKTsKKyAgICBFWFBFQ1RfRVEoMHgwMCwgYnVmZmVyWzBdKTsKKyAgICBFWFBFQ1RfRVEoMHgwMSwgYnVmZmVyWzFdKTsKKyAgICBFWFBFQ1RfRVEoMHgwMiwgYnVmZmVyWzJdKTsKKyAgICBFWFBFQ1RfRVEoMHgwMywgYnVmZmVyWzNdKTsKKyAgICBFWFBFQ1RfRVEoMHg4NCwgYnVmZmVyWzRdKTsKKyAgICBFWFBFQ1RfRVEoMHg4NSwgYnVmZmVyWzVdKTsKKyAgICBFWFBFQ1RfRVEoMHg4NiwgYnVmZmVyWzZdKTsKKyAgICBFWFBFQ1RfRVEoMHg4NywgYnVmZmVyWzddKTsKKyAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzhdKTsKKyAgfQorICB7CisgICAgRGVjb2RlRGF0YSBkZChzdHJlYW1fZGF0YSwgc2l6ZW9mKHN0cmVhbV9kYXRhKSk7CiAKLSAgICAgICAgLy8gUmVhZCBvZiBzaXplIDYgZ2V0cyBmaXJzdCA2IGJ5dGVzLgotICAgICAgICAvLyByZXN0IG9mIGJ1ZmZlciBpbnRhY3QuCi0gICAgICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKLSAgICAgICAgRVhQRUNUX0VRKDZ1LCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDYsICZkZCkpOwotICAgICAgICBFWFBFQ1RfRVEoMHgwMCwgYnVmZmVyWzBdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MDEsIGJ1ZmZlclsxXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDAyLCBidWZmZXJbMl0pOwotICAgICAgICBFWFBFQ1RfRVEoMHgwMywgYnVmZmVyWzNdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4ODQsIGJ1ZmZlcls0XSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDg1LCBidWZmZXJbNV0pOwotICAgICAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzZdKTsKKyAgICAvLyBSZWFkIG9mIHNpemUgNiBnZXRzIGZpcnN0IDYgYnl0ZXMuCisgICAgLy8gcmVzdCBvZiBidWZmZXIgaW50YWN0LgorICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKKyAgICBFWFBFQ1RfRVEoNnUsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgNiwgJmRkKSk7CisgICAgRVhQRUNUX0VRKDB4MDAsIGJ1ZmZlclswXSk7CisgICAgRVhQRUNUX0VRKDB4MDEsIGJ1ZmZlclsxXSk7CisgICAgRVhQRUNUX0VRKDB4MDIsIGJ1ZmZlclsyXSk7CisgICAgRVhQRUNUX0VRKDB4MDMsIGJ1ZmZlclszXSk7CisgICAgRVhQRUNUX0VRKDB4ODQsIGJ1ZmZlcls0XSk7CisgICAgRVhQRUNUX0VRKDB4ODUsIGJ1ZmZlcls1XSk7CisgICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlcls2XSk7CiAKLSAgICAgICAgLy8gUmVhZCBvZiBzaXplIDYgZ2V0cyByZW1haW5pbmcgdHdvIGJ5dGVzLgotICAgICAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgydSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCA2LCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4ODYsIGJ1ZmZlclswXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDg3LCBidWZmZXJbMV0pOwotICAgICAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzJdKTsKKyAgICAvLyBSZWFkIG9mIHNpemUgNiBnZXRzIHJlbWFpbmluZyB0d28gYnl0ZXMuCisgICAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIEVYUEVDVF9FUSgydSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCA2LCAmZGQpKTsKKyAgICBFWFBFQ1RfRVEoMHg4NiwgYnVmZmVyWzBdKTsKKyAgICBFWFBFQ1RfRVEoMHg4NywgYnVmZmVyWzFdKTsKKyAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzJdKTsKIAotICAgICAgICAvLyBSZWFkIG9mIDYgbW9yZSBnZXRzIG5vdGhpbmcgYW5kIGxlYXZlcyByZXN0IG9mIGJ1ZmZlciBpbnRhY3QuCi0gICAgICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKLSAgICAgICAgRVhQRUNUX0VRKGtSZWFkRXJyb3IsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgNiwgJmRkKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMF0pOwotICAgIH0KKyAgICAvLyBSZWFkIG9mIDYgbW9yZSBnZXRzIG5vdGhpbmcgYW5kIGxlYXZlcyByZXN0IG9mIGJ1ZmZlciBpbnRhY3QuCisgICAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDYsICZkZCkpOworICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMF0pOworICB9CiB9CiAKIFRFU1QoZnhjb2RlYywgRGVjb2RlRGF0YVdyaXRlSW5Cb3VuZHMpIHsKLSAgICB1bnNpZ25lZCBjaGFyIHN0cmVhbVsxNl07Ci0gICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgYnVmZmVyX2RhdGFbXSA9IHsKLSAgICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHg4MCwKLSAgICAgICAgMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwKLSAgICB9OwotICAgIHsKLSAgICAgICAgLy8gUHJldGVuZCB0aGUgc3RyZWFtIGNhbiBvbmx5IGhvbGQgNCBieXRlcy4KLSAgICAgICAgRGVjb2RlRGF0YSBkZChzdHJlYW0sIDQpOworICB1bnNpZ25lZCBjaGFyIHN0cmVhbVsxNl07CisgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZmZlcl9kYXRhW10gPSB7CisgICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDgwLCAweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LAorICB9OworICB7CisgICAgLy8gUHJldGVuZCB0aGUgc3RyZWFtIGNhbiBvbmx5IGhvbGQgNCBieXRlcy4KKyAgICBEZWNvZGVEYXRhIGRkKHN0cmVhbSwgNCk7CiAKLSAgICAgICAgbWVtc2V0KHN0cmVhbSwgMHhiZCwgc2l6ZW9mKHN0cmVhbSkpOwotICAgICAgICBFWFBFQ1RfRVEoNHUsIG9wal93cml0ZV9mcm9tX21lbW9yeShidWZmZXJfZGF0YSwgNCwgJmRkKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDAwLCBzdHJlYW1bMF0pOwotICAgICAgICBFWFBFQ1RfRVEoMHgwMSwgc3RyZWFtWzFdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MDIsIHN0cmVhbVsyXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDAzLCBzdHJlYW1bM10pOwotICAgICAgICBFWFBFQ1RfRVEoMHhiZCwgc3RyZWFtWzRdKTsKLSAgICB9Ci0gICAgewotICAgICAgICAvLyBQcmV0ZW5kIHRoZSBzdHJlYW0gY2FuIG9ubHkgaG9sZCA0IGJ5dGVzLgotICAgICAgICBEZWNvZGVEYXRhIGRkKHN0cmVhbSwgNCk7CisgICAgbWVtc2V0KHN0cmVhbSwgMHhiZCwgc2l6ZW9mKHN0cmVhbSkpOworICAgIEVYUEVDVF9FUSg0dSwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlcl9kYXRhLCA0LCAmZGQpKTsKKyAgICBFWFBFQ1RfRVEoMHgwMCwgc3RyZWFtWzBdKTsKKyAgICBFWFBFQ1RfRVEoMHgwMSwgc3RyZWFtWzFdKTsKKyAgICBFWFBFQ1RfRVEoMHgwMiwgc3RyZWFtWzJdKTsKKyAgICBFWFBFQ1RfRVEoMHgwMywgc3RyZWFtWzNdKTsKKyAgICBFWFBFQ1RfRVEoMHhiZCwgc3RyZWFtWzRdKTsKKyAgfQorICB7CisgICAgLy8gUHJldGVuZCB0aGUgc3RyZWFtIGNhbiBvbmx5IGhvbGQgNCBieXRlcy4KKyAgICBEZWNvZGVEYXRhIGRkKHN0cmVhbSwgNCk7CiAKLSAgICAgICAgbWVtc2V0KHN0cmVhbSwgMHhiZCwgc2l6ZW9mKHN0cmVhbSkpOwotICAgICAgICBFWFBFQ1RfRVEoMnUsIG9wal93cml0ZV9mcm9tX21lbW9yeShidWZmZXJfZGF0YSwgMiwgJmRkKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgydSwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlcl9kYXRhLCAyLCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MDAsIHN0cmVhbVswXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDAxLCBzdHJlYW1bMV0pOwotICAgICAgICBFWFBFQ1RfRVEoMHgwMCwgc3RyZWFtWzJdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MDEsIHN0cmVhbVszXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweGJkLCBzdHJlYW1bNF0pOwotICAgIH0KKyAgICBtZW1zZXQoc3RyZWFtLCAweGJkLCBzaXplb2Yoc3RyZWFtKSk7CisgICAgRVhQRUNUX0VRKDJ1LCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkoYnVmZmVyX2RhdGEsIDIsICZkZCkpOworICAgIEVYUEVDVF9FUSgydSwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlcl9kYXRhLCAyLCAmZGQpKTsKKyAgICBFWFBFQ1RfRVEoMHgwMCwgc3RyZWFtWzBdKTsKKyAgICBFWFBFQ1RfRVEoMHgwMSwgc3RyZWFtWzFdKTsKKyAgICBFWFBFQ1RfRVEoMHgwMCwgc3RyZWFtWzJdKTsKKyAgICBFWFBFQ1RfRVEoMHgwMSwgc3RyZWFtWzNdKTsKKyAgICBFWFBFQ1RfRVEoMHhiZCwgc3RyZWFtWzRdKTsKKyAgfQogfQogCiBURVNUKGZ4Y29kZWMsIERlY29kZURhdGFXcml0ZUJleW9uZEJvdW5kcykgewotICAgIHVuc2lnbmVkIGNoYXIgc3RyZWFtWzE2XTsKLSAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBidWZmZXJfZGF0YVtdID0gewotICAgICAgICAweDEwLCAweDExLCAweDEyLCAweDEzLAotICAgICAgICAweDk0LCAweDk1LCAweDk2LCAweDk3LAotICAgIH07Ci0gICAgewotICAgICAgICAvLyBQcmV0ZW5kIHRoZSBzdHJlYW0gY2FuIG9ubHkgaG9sZCA0IGJ5dGVzLgotICAgICAgICBEZWNvZGVEYXRhIGRkKHN0cmVhbSwgNCk7CisgIHVuc2lnbmVkIGNoYXIgc3RyZWFtWzE2XTsKKyAgc3RhdGljIHVuc2lnbmVkIGNoYXIgYnVmZmVyX2RhdGFbXSA9IHsKKyAgICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsCisgIH07CisgIHsKKyAgICAvLyBQcmV0ZW5kIHRoZSBzdHJlYW0gY2FuIG9ubHkgaG9sZCA0IGJ5dGVzLgorICAgIERlY29kZURhdGEgZGQoc3RyZWFtLCA0KTsKIAotICAgICAgICAvLyBXcml0ZSBlbmRpbmcgcGFzdCBFT0YgdHJhbnNmZXJzIHVwIHRpbCBFT0YuCi0gICAgICAgIG1lbXNldChzdHJlYW0sIDB4YmQsIHNpemVvZihzdHJlYW0pKTsKLSAgICAgICAgRVhQRUNUX0VRKDR1LCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkoYnVmZmVyX2RhdGEsIDUsICZkZCkpOwotICAgICAgICBFWFBFQ1RfRVEoMHgxMCwgc3RyZWFtWzBdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MTEsIHN0cmVhbVsxXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDEyLCBzdHJlYW1bMl0pOwotICAgICAgICBFWFBFQ1RfRVEoMHgxMywgc3RyZWFtWzNdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4YmQsIHN0cmVhbVs0XSk7CisgICAgLy8gV3JpdGUgZW5kaW5nIHBhc3QgRU9GIHRyYW5zZmVycyB1cCB0aWwgRU9GLgorICAgIG1lbXNldChzdHJlYW0sIDB4YmQsIHNpemVvZihzdHJlYW0pKTsKKyAgICBFWFBFQ1RfRVEoNHUsIG9wal93cml0ZV9mcm9tX21lbW9yeShidWZmZXJfZGF0YSwgNSwgJmRkKSk7CisgICAgRVhQRUNUX0VRKDB4MTAsIHN0cmVhbVswXSk7CisgICAgRVhQRUNUX0VRKDB4MTEsIHN0cmVhbVsxXSk7CisgICAgRVhQRUNUX0VRKDB4MTIsIHN0cmVhbVsyXSk7CisgICAgRVhQRUNUX0VRKDB4MTMsIHN0cmVhbVszXSk7CisgICAgRVhQRUNUX0VRKDB4YmQsIHN0cmVhbVs0XSk7CiAKLSAgICAgICAgLy8gU3Vic2VxdWVudCB3cml0ZXMgZmFpbC4KLSAgICAgICAgbWVtc2V0KHN0cmVhbSwgMHhiZCwgc2l6ZW9mKHN0cmVhbSkpOwotICAgICAgICBFWFBFQ1RfRVEoa1dyaXRlRXJyb3IsIG9wal93cml0ZV9mcm9tX21lbW9yeShidWZmZXJfZGF0YSwgNSwgJmRkKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweGJkLCBzdHJlYW1bMF0pOwotICAgIH0KLSAgICB7Ci0gICAgICAgIC8vIFByZXRlbmQgdGhlIHN0cmVhbSBjYW4gb25seSBob2xkIDQgYnl0ZXMuCi0gICAgICAgIERlY29kZURhdGEgZGQoc3RyZWFtLCA0KTsKKyAgICAvLyBTdWJzZXF1ZW50IHdyaXRlcyBmYWlsLgorICAgIG1lbXNldChzdHJlYW0sIDB4YmQsIHNpemVvZihzdHJlYW0pKTsKKyAgICBFWFBFQ1RfRVEoa1dyaXRlRXJyb3IsIG9wal93cml0ZV9mcm9tX21lbW9yeShidWZmZXJfZGF0YSwgNSwgJmRkKSk7CisgICAgRVhQRUNUX0VRKDB4YmQsIHN0cmVhbVswXSk7CisgIH0KKyAgeworICAgIC8vIFByZXRlbmQgdGhlIHN0cmVhbSBjYW4gb25seSBob2xkIDQgYnl0ZXMuCisgICAgRGVjb2RlRGF0YSBkZChzdHJlYW0sIDQpOwogCi0gICAgICAgIC8vIFdyaXRlIGVuZGluZyBwYXN0IEVPRiAodHdvIHN0ZXBzKSB0cmFuc2ZlcnMgdXAgdGlsIEVPRi4KLSAgICAgICAgbWVtc2V0KHN0cmVhbSwgMHhiZCwgc2l6ZW9mKHN0cmVhbSkpOwotICAgICAgICBFWFBFQ1RfRVEoMnUsIG9wal93cml0ZV9mcm9tX21lbW9yeShidWZmZXJfZGF0YSwgMiwgJmRkKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgydSwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlcl9kYXRhLCA0LCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MTAsIHN0cmVhbVswXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDExLCBzdHJlYW1bMV0pOwotICAgICAgICBFWFBFQ1RfRVEoMHgxMCwgc3RyZWFtWzJdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MTEsIHN0cmVhbVszXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweGJkLCBzdHJlYW1bNF0pOworICAgIC8vIFdyaXRlIGVuZGluZyBwYXN0IEVPRiAodHdvIHN0ZXBzKSB0cmFuc2ZlcnMgdXAgdGlsIEVPRi4KKyAgICBtZW1zZXQoc3RyZWFtLCAweGJkLCBzaXplb2Yoc3RyZWFtKSk7CisgICAgRVhQRUNUX0VRKDJ1LCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkoYnVmZmVyX2RhdGEsIDIsICZkZCkpOworICAgIEVYUEVDVF9FUSgydSwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlcl9kYXRhLCA0LCAmZGQpKTsKKyAgICBFWFBFQ1RfRVEoMHgxMCwgc3RyZWFtWzBdKTsKKyAgICBFWFBFQ1RfRVEoMHgxMSwgc3RyZWFtWzFdKTsKKyAgICBFWFBFQ1RfRVEoMHgxMCwgc3RyZWFtWzJdKTsKKyAgICBFWFBFQ1RfRVEoMHgxMSwgc3RyZWFtWzNdKTsKKyAgICBFWFBFQ1RfRVEoMHhiZCwgc3RyZWFtWzRdKTsKIAotICAgICAgICAvLyBTdWJzZXF1ZW50IHdyaXRlcyBmYWlsLgotICAgICAgICBtZW1zZXQoc3RyZWFtLCAweGJkLCBzaXplb2Yoc3RyZWFtKSk7Ci0gICAgICAgIEVYUEVDVF9FUShrV3JpdGVFcnJvciwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlcl9kYXRhLCA1LCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4YmQsIHN0cmVhbVswXSk7Ci0gICAgfQorICAgIC8vIFN1YnNlcXVlbnQgd3JpdGVzIGZhaWwuCisgICAgbWVtc2V0KHN0cmVhbSwgMHhiZCwgc2l6ZW9mKHN0cmVhbSkpOworICAgIEVYUEVDVF9FUShrV3JpdGVFcnJvciwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlcl9kYXRhLCA1LCAmZGQpKTsKKyAgICBFWFBFQ1RfRVEoMHhiZCwgc3RyZWFtWzBdKTsKKyAgfQogfQogCiAvLyBOb3RlOiBTb21lIGNhcmUgbmVlZHMgdG8gYmUgdGFrZW4gaGVyZSBiZWNhdXNlIHRoZSBza2lwL3NlZWsgZnVuY3Rpb25zCiAvLyB0YWtlIE9QSl9PRkZfVCdzIGFzIGFyZ3VtZW50cywgd2hpY2ggYXJlIHR5cGljYWxseSBhIHNpZ25lZCB0eXBlLgogVEVTVChmeGNvZGVjLCBEZWNvZGVEYXRhU2tpcCkgewotICAgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzE2XTsKLSAgICB7Ci0gICAgICAgIERlY29kZURhdGEgZGQoc3RyZWFtX2RhdGEsIHNpemVvZihzdHJlYW1fZGF0YSkpOwotCi0gICAgICAgIC8vIFNraXBpbmcgd2l0aGluIGJ1ZmZlciBpcyBhbGxvd2VkLgotICAgICAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgxLCBvcGpfc2tpcF9mcm9tX21lbW9yeSgxLCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKDF1LCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDEsICZkZCkpOwotICAgICAgICBFWFBFQ1RfRVEoMHgwMSwgYnVmZmVyWzBdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclsxXSk7Ci0KLSAgICAgICAgLy8gU2tpcGluZyAwIGJ5dGVzIGNoYW5nZXMgbm90aGluZy4KLSAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgICAgICBFWFBFQ1RfRVEoMCwgb3BqX3NraXBfZnJvbV9tZW1vcnkoMCwgJmRkKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgxdSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAxLCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4MDIsIGJ1ZmZlclswXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMV0pOwotCi0gICAgICAgIC8vIFNraXBpbmcgdG8gRU9TLTEgaXMgcG9zc2libGUuCi0gICAgICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKLSAgICAgICAgRVhQRUNUX0VRKDQsIG9wal9za2lwX2Zyb21fbWVtb3J5KDQsICZkZCkpOwotICAgICAgICBFWFBFQ1RfRVEoMXUsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMSwgJmRkKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweDg3LCBidWZmZXJbMF0pOwotICAgICAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzFdKTsKLQotICAgICAgICAvLyBOZXh0IHJlYWQgZmFpbHMuCi0gICAgICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKLSAgICAgICAgRVhQRUNUX0VRKGtSZWFkRXJyb3IsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMSwgJmRkKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMF0pOwotICAgIH0KLSAgICB7Ci0gICAgICAgIERlY29kZURhdGEgZGQoc3RyZWFtX2RhdGEsIHNpemVvZihzdHJlYW1fZGF0YSkpOwotCi0gICAgICAgIC8vIFNraXBpbmcgZGlyZWN0bHkgdG8gRU9TIGlzIGFsbG93ZWQuCi0gICAgICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKLSAgICAgICAgRVhQRUNUX0VRKDgsIG9wal9za2lwX2Zyb21fbWVtb3J5KDgsICZkZCkpOwotCi0gICAgICAgIC8vIE5leHQgcmVhZCBmYWlscy4KLSAgICAgICAgRVhQRUNUX0VRKGtSZWFkRXJyb3IsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMSwgJmRkKSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMF0pOwotICAgIH0KLSAgICB7Ci0gICAgICAgIERlY29kZURhdGEgZGQoc3RyZWFtX2RhdGEsIHNpemVvZihzdHJlYW1fZGF0YSkpOwotCi0gICAgICAgIC8vIFNraXBwaW5nIGJleW9uZCBlbmQgb2Ygc3RyZWFtIGlzIGFsbG93ZWQgYW5kIHJldHVybnMgZnVsbCBkaXN0YW5jZS4KLSAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgICAgICBFWFBFQ1RfRVEoOSwgb3BqX3NraXBfZnJvbV9tZW1vcnkoOSwgJmRkKSk7Ci0KLSAgICAgICAgLy8gTmV4dCByZWFkIGZhaWxzLgotICAgICAgICBFWFBFQ1RfRVEoa1JlYWRFcnJvciwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAxLCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclswXSk7Ci0gICAgfQotICAgIHsKLSAgICAgICAgRGVjb2RlRGF0YSBkZChzdHJlYW1fZGF0YSwgc2l6ZW9mKHN0cmVhbV9kYXRhKSk7Ci0KLSAgICAgICAgLy8gU2tpcHBpbmcgd2F5IGJleW9uZCBFT1MgaXMgYWxsb3dkLCBkb2Vzbid0IHdyYXAsIGFuZCByZXR1cm5zCi0gICAgICAgIC8vIGZ1bGwgZGlzdGFuY2UuCi0gICAgICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKLSAgICAgICAgRVhQRUNUX0VRKDQsIG9wal9za2lwX2Zyb21fbWVtb3J5KDQsICZkZCkpOwotICAgICAgICBFWFBFQ1RfRVEoc3RkOjpudW1lcmljX2xpbWl0czxPUEpfT0ZGX1Q+OjptYXgoKSwgb3BqX3NraXBfZnJvbV9tZW1vcnkoCi0gICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPE9QSl9PRkZfVD46Om1heCgpLCAmZGQpKTsKLQotICAgICAgICAvLyBOZXh0IHJlYWQgZmFpbHMuIElmIGl0IHN1Y2NlZWRzLCBpdCBtYXkgbWVhbiB3ZSB3cmFwcGVkLgotICAgICAgICBFWFBFQ1RfRVEoa1JlYWRFcnJvciwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAxLCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclswXSk7Ci0gICAgfQotICAgIHsKLSAgICAgICAgRGVjb2RlRGF0YSBkZChzdHJlYW1fZGF0YSwgc2l6ZW9mKHN0cmVhbV9kYXRhKSk7Ci0KLSAgICAgICAgLy8gTmVnYXRpdmUgc2tpcCB3aXRoaW4gYnVmZmVyIG5vdCBpcyBhbGxvd2VkLCBwb3NpdGlvbiB1bmNoYW5nZWQuCi0gICAgICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKLSAgICAgICAgRVhQRUNUX0VRKDQsIG9wal9za2lwX2Zyb21fbWVtb3J5KDQsICZkZCkpOwotICAgICAgICBFWFBFQ1RfRVEoa1NraXBFcnJvciwgb3BqX3NraXBfZnJvbV9tZW1vcnkoLTIsICZkZCkpOwotCi0gICAgICAgIC8vIE5leHQgcmVhZCBzdWNjZWVkcyBhcyBpZiBub3RoaW5nIGhhcyBoYXBwZW5uZWQuCi0gICAgICAgIEVYUEVDVF9FUSgxdSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAxLCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4ODQsIGJ1ZmZlclswXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMV0pOwotCi0gICAgICAgIC8vIE5lZ2F0aXZlIHNraXAgYmVmb3JlIGJ1ZmZlciBpcyBub3QgYWxsb3dlZCwgcG9zaXRpb24gdW5jaGFuZ2VkLgotICAgICAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgICAgIEVYUEVDVF9FUShrU2tpcEVycm9yLCBvcGpfc2tpcF9mcm9tX21lbW9yeSgtNCwgJmRkKSk7Ci0KLSAgICAgICAgLy8gTmV4dCByZWFkIHN1Y2NlZWRzIGFzIGlmIG5vdGhpbmcgaGFzIGhhcHBlbm5lZC4KLSAgICAgICAgRVhQRUNUX0VRKDF1LCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDEsICZkZCkpOwotICAgICAgICBFWFBFQ1RfRVEoMHg4NSwgYnVmZmVyWzBdKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclsxXSk7Ci0gICAgfQotICAgIHsKLSAgICAgICAgRGVjb2RlRGF0YSBkZChzdHJlYW1fZGF0YSwgc2l6ZW9mKHN0cmVhbV9kYXRhKSk7Ci0KLSAgICAgICAgLy8gTmVnYXRpdmUgc2tpcCB3YXkgYmVmb3JlIGJ1ZmZlciBpcyBub3QgYWxsb3dlZCwgZG9lc24ndCB3cmFwCi0gICAgICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKLSAgICAgICAgRVhQRUNUX0VRKDQsIG9wal9za2lwX2Zyb21fbWVtb3J5KDQsICZkZCkpOwotICAgICAgICBFWFBFQ1RfRVEoa1NraXBFcnJvciwgb3BqX3NraXBfZnJvbV9tZW1vcnkoCi0gICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPE9QSl9PRkZfVD46Om1pbigpLCAmZGQpKTsKLQotICAgICAgICAvLyBOZXh0IHJlYWQgc3VjY2VlZHMuIElmIGl0IGZhaWxzLCBpdCBtYXkgbWVhbiB3ZSB3cmFwcGVkLgotICAgICAgICBFWFBFQ1RfRVEoMSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAxLCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKDB4ODQsIGJ1ZmZlclswXSk7Ci0gICAgICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMV0pOwotICAgIH0KLSAgICB7Ci0gICAgICAgIERlY29kZURhdGEgZGQoc3RyZWFtX2RhdGEsIHNpemVvZihzdHJlYW1fZGF0YSkpOwotCi0gICAgICAgIC8vIE5lZ2F0aXZlIHNraXAgYWZ0ZXIgRU9TIGlzbid0IGFsb3dlZCwgc3RpbGwgRU9TLgotICAgICAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgICAgIEVYUEVDVF9FUSg4LCBvcGpfc2tpcF9mcm9tX21lbW9yeSg4LCAmZGQpKTsKLSAgICAgICAgRVhQRUNUX0VRKGtTa2lwRXJyb3IsIG9wal9za2lwX2Zyb21fbWVtb3J5KC00LCAmZGQpKTsKLQotICAgICAgICAvLyBOZXh0IHJlYWQgZmFpbHMuCi0gICAgICAgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDEsICZkZCkpOwotICAgICAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzBdKTsKLSAgICB9Ci0KLX0KLQotVEVTVChmeGNvZGVjLCBEZWNvZGVEYXRhU2VlaykgewotICAgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzE2XTsKKyAgdW5zaWduZWQgY2hhciBidWZmZXJbMTZdOworICB7CiAgICAgRGVjb2RlRGF0YSBkZChzdHJlYW1fZGF0YSwgc2l6ZW9mKHN0cmVhbV9kYXRhKSk7CiAKLSAgICAvLyBTZWVraW5nIHdpdGhpbiBidWZmZXIgaXMgYWxsb3dlZCBhbmQgcmVhZCBzdWNjZWVkcworICAgIC8vIFNraXBpbmcgd2l0aGluIGJ1ZmZlciBpcyBhbGxvd2VkLgogICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKLSAgICBFWFBFQ1RfVFJVRShvcGpfc2Vla19mcm9tX21lbW9yeSgxLCAmZGQpKTsKKyAgICBFWFBFQ1RfRVEoMSwgb3BqX3NraXBfZnJvbV9tZW1vcnkoMSwgJmRkKSk7CiAgICAgRVhQRUNUX0VRKDF1LCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDEsICZkZCkpOwogICAgIEVYUEVDVF9FUSgweDAxLCBidWZmZXJbMF0pOwogICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMV0pOwogCi0gICAgLy8gU2Vla2luZyBiZWZvcmUgc3RhcnQgcmV0dXJucyBlcnJvciBsZWF2aW5nIHBvc2l0aW9uIHVuY2hhbmdlZC4KKyAgICAvLyBTa2lwaW5nIDAgYnl0ZXMgY2hhbmdlcyBub3RoaW5nLgogICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKLSAgICBFWFBFQ1RfRkFMU0Uob3BqX3NlZWtfZnJvbV9tZW1vcnkoLTEsICZkZCkpOwotICAgIEVYUEVDVF9FUSgxLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDEsICZkZCkpOworICAgIEVYUEVDVF9FUSgwLCBvcGpfc2tpcF9mcm9tX21lbW9yeSgwLCAmZGQpKTsKKyAgICBFWFBFQ1RfRVEoMXUsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMSwgJmRkKSk7CiAgICAgRVhQRUNUX0VRKDB4MDIsIGJ1ZmZlclswXSk7CiAgICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclsxXSk7CiAKLSAgICAvLyBTZWVraW5nIHdheSBiZWZvcmUgc3RhcnQgcmV0dXJucyBlcnJvciBsZWF2aW5nIHBvc2l0aW9uIHVuY2hhbmdlZC4KKyAgICAvLyBTa2lwaW5nIHRvIEVPUy0xIGlzIHBvc3NpYmxlLgogICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKLSAgICBFWFBFQ1RfRkFMU0Uob3BqX3NlZWtfZnJvbV9tZW1vcnkoCi0gICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8T1BKX09GRl9UPjo6bWluKCksICZkZCkpOwotICAgIEVYUEVDVF9FUSgxLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDEsICZkZCkpOwotICAgIEVYUEVDVF9FUSgweDAzLCBidWZmZXJbMF0pOwotICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMV0pOwotCi0gICAgLy8gU2Vla2luZyBleGFjdGx5IHRvIEVPUyBpcyBhbGxvd2VkIGJ1dCByZWFkIGZhaWxzLgotICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKLSAgICBFWFBFQ1RfVFJVRShvcGpfc2Vla19mcm9tX21lbW9yeSg4LCAmZGQpKTsKLSAgICBFWFBFQ1RfRVEoa1JlYWRFcnJvciwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAxLCAmZGQpKTsKLSAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzBdKTsKLQotICAgIC8vIFNlZWtpbmcgYmFjayB0byB6ZXJvIG9mZnNldCBpcyBhbGxvd2VkIGFuZCByZWFkIHN1Y2NlZWRzLgotICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKLSAgICBFWFBFQ1RfVFJVRShvcGpfc2Vla19mcm9tX21lbW9yeSgwLCAmZGQpKTsKKyAgICBFWFBFQ1RfRVEoNCwgb3BqX3NraXBfZnJvbV9tZW1vcnkoNCwgJmRkKSk7CiAgICAgRVhQRUNUX0VRKDF1LCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDEsICZkZCkpOwotICAgIEVYUEVDVF9FUSgweDAwLCBidWZmZXJbMF0pOworICAgIEVYUEVDVF9FUSgweDg3LCBidWZmZXJbMF0pOwogICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMV0pOwogCi0gICAgLy8gU2Vla2luZyBiZXlvbmQgZW5kIG9mIHN0cmVhbSBpcyBhbGxvd2VkIGJ1dCByZWFkIGZhaWxzLgorICAgIC8vIE5leHQgcmVhZCBmYWlscy4KICAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgRVhQRUNUX1RSVUUob3BqX3NlZWtfZnJvbV9tZW1vcnkoMTYsICZkZCkpOwogICAgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDEsICZkZCkpOwogICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMF0pOworICB9CisgIHsKKyAgICBEZWNvZGVEYXRhIGRkKHN0cmVhbV9kYXRhLCBzaXplb2Yoc3RyZWFtX2RhdGEpKTsKIAotICAgIC8vIFNlZWtpbmcgd2l0aGluIGJ1ZmZlciBhZnRlciBzZWVrIHBhc3QgRU9GIHJlc3RvcmVzIGdvb2Qgc3RhdGUuCisgICAgLy8gU2tpcGluZyBkaXJlY3RseSB0byBFT1MgaXMgYWxsb3dlZC4KICAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgRVhQRUNUX1RSVUUob3BqX3NlZWtfZnJvbV9tZW1vcnkoNCwgJmRkKSk7CisgICAgRVhQRUNUX0VRKDgsIG9wal9za2lwX2Zyb21fbWVtb3J5KDgsICZkZCkpOworCisgICAgLy8gTmV4dCByZWFkIGZhaWxzLgorICAgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDEsICZkZCkpOworICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMF0pOworICB9CisgIHsKKyAgICBEZWNvZGVEYXRhIGRkKHN0cmVhbV9kYXRhLCBzaXplb2Yoc3RyZWFtX2RhdGEpKTsKKworICAgIC8vIFNraXBwaW5nIGJleW9uZCBlbmQgb2Ygc3RyZWFtIGlzIGFsbG93ZWQgYW5kIHJldHVybnMgZnVsbCBkaXN0YW5jZS4KKyAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7CisgICAgRVhQRUNUX0VRKDksIG9wal9za2lwX2Zyb21fbWVtb3J5KDksICZkZCkpOworCisgICAgLy8gTmV4dCByZWFkIGZhaWxzLgorICAgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDEsICZkZCkpOworICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMF0pOworICB9CisgIHsKKyAgICBEZWNvZGVEYXRhIGRkKHN0cmVhbV9kYXRhLCBzaXplb2Yoc3RyZWFtX2RhdGEpKTsKKworICAgIC8vIFNraXBwaW5nIHdheSBiZXlvbmQgRU9TIGlzIGFsbG93ZCwgZG9lc24ndCB3cmFwLCBhbmQgcmV0dXJucworICAgIC8vIGZ1bGwgZGlzdGFuY2UuCisgICAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIEVYUEVDVF9FUSg0LCBvcGpfc2tpcF9mcm9tX21lbW9yeSg0LCAmZGQpKTsKKyAgICBFWFBFQ1RfRVEoc3RkOjpudW1lcmljX2xpbWl0czxPUEpfT0ZGX1Q+OjptYXgoKSwKKyAgICAgICAgICAgICAgb3BqX3NraXBfZnJvbV9tZW1vcnkoc3RkOjpudW1lcmljX2xpbWl0czxPUEpfT0ZGX1Q+OjptYXgoKSwgJmRkKSk7CisKKyAgICAvLyBOZXh0IHJlYWQgZmFpbHMuIElmIGl0IHN1Y2NlZWRzLCBpdCBtYXkgbWVhbiB3ZSB3cmFwcGVkLgorICAgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDEsICZkZCkpOworICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMF0pOworICB9CisgIHsKKyAgICBEZWNvZGVEYXRhIGRkKHN0cmVhbV9kYXRhLCBzaXplb2Yoc3RyZWFtX2RhdGEpKTsKKworICAgIC8vIE5lZ2F0aXZlIHNraXAgd2l0aGluIGJ1ZmZlciBub3QgaXMgYWxsb3dlZCwgcG9zaXRpb24gdW5jaGFuZ2VkLgorICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKKyAgICBFWFBFQ1RfRVEoNCwgb3BqX3NraXBfZnJvbV9tZW1vcnkoNCwgJmRkKSk7CisgICAgRVhQRUNUX0VRKGtTa2lwRXJyb3IsIG9wal9za2lwX2Zyb21fbWVtb3J5KC0yLCAmZGQpKTsKKworICAgIC8vIE5leHQgcmVhZCBzdWNjZWVkcyBhcyBpZiBub3RoaW5nIGhhcyBoYXBwZW5uZWQuCiAgICAgRVhQRUNUX0VRKDF1LCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDEsICZkZCkpOwogICAgIEVYUEVDVF9FUSgweDg0LCBidWZmZXJbMF0pOwogICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMV0pOwogCi0gICAgLy8gU2Vla2luZyB3YXkgYmV5b25kIEVPUyBpcyBhbGxvd2VkLCBkb2Vzbid0IHdyYXAsIGFuZCByZWFkIGZhaWxzLgorICAgIC8vIE5lZ2F0aXZlIHNraXAgYmVmb3JlIGJ1ZmZlciBpcyBub3QgYWxsb3dlZCwgcG9zaXRpb24gdW5jaGFuZ2VkLgogICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKLSAgICBFWFBFQ1RfVFJVRShvcGpfc2Vla19mcm9tX21lbW9yeSgKLSAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxPUEpfT0ZGX1Q+OjptYXgoKSwgJmRkKSk7CisgICAgRVhQRUNUX0VRKGtTa2lwRXJyb3IsIG9wal9za2lwX2Zyb21fbWVtb3J5KC00LCAmZGQpKTsKKworICAgIC8vIE5leHQgcmVhZCBzdWNjZWVkcyBhcyBpZiBub3RoaW5nIGhhcyBoYXBwZW5uZWQuCisgICAgRVhQRUNUX0VRKDF1LCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDEsICZkZCkpOworICAgIEVYUEVDVF9FUSgweDg1LCBidWZmZXJbMF0pOworICAgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMV0pOworICB9CisgIHsKKyAgICBEZWNvZGVEYXRhIGRkKHN0cmVhbV9kYXRhLCBzaXplb2Yoc3RyZWFtX2RhdGEpKTsKKworICAgIC8vIE5lZ2F0aXZlIHNraXAgd2F5IGJlZm9yZSBidWZmZXIgaXMgbm90IGFsbG93ZWQsIGRvZXNuJ3Qgd3JhcAorICAgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKKyAgICBFWFBFQ1RfRVEoNCwgb3BqX3NraXBfZnJvbV9tZW1vcnkoNCwgJmRkKSk7CisgICAgRVhQRUNUX0VRKGtTa2lwRXJyb3IsCisgICAgICAgICAgICAgIG9wal9za2lwX2Zyb21fbWVtb3J5KHN0ZDo6bnVtZXJpY19saW1pdHM8T1BKX09GRl9UPjo6bWluKCksICZkZCkpOworCisgICAgLy8gTmV4dCByZWFkIHN1Y2NlZWRzLiBJZiBpdCBmYWlscywgaXQgbWF5IG1lYW4gd2Ugd3JhcHBlZC4KKyAgICBFWFBFQ1RfRVEoMSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAxLCAmZGQpKTsKKyAgICBFWFBFQ1RfRVEoMHg4NCwgYnVmZmVyWzBdKTsKKyAgICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzFdKTsKKyAgfQorICB7CisgICAgRGVjb2RlRGF0YSBkZChzdHJlYW1fZGF0YSwgc2l6ZW9mKHN0cmVhbV9kYXRhKSk7CisKKyAgICAvLyBOZWdhdGl2ZSBza2lwIGFmdGVyIEVPUyBpc24ndCBhbG93ZWQsIHN0aWxsIEVPUy4KKyAgICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7CisgICAgRVhQRUNUX0VRKDgsIG9wal9za2lwX2Zyb21fbWVtb3J5KDgsICZkZCkpOworICAgIEVYUEVDVF9FUShrU2tpcEVycm9yLCBvcGpfc2tpcF9mcm9tX21lbW9yeSgtNCwgJmRkKSk7CisKKyAgICAvLyBOZXh0IHJlYWQgZmFpbHMuCiAgICAgRVhQRUNUX0VRKGtSZWFkRXJyb3IsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMSwgJmRkKSk7CiAgICAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclswXSk7CisgIH0KK30KKworVEVTVChmeGNvZGVjLCBEZWNvZGVEYXRhU2VlaykgeworICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclsxNl07CisgIERlY29kZURhdGEgZGQoc3RyZWFtX2RhdGEsIHNpemVvZihzdHJlYW1fZGF0YSkpOworCisgIC8vIFNlZWtpbmcgd2l0aGluIGJ1ZmZlciBpcyBhbGxvd2VkIGFuZCByZWFkIHN1Y2NlZWRzCisgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKKyAgRVhQRUNUX1RSVUUob3BqX3NlZWtfZnJvbV9tZW1vcnkoMSwgJmRkKSk7CisgIEVYUEVDVF9FUSgxdSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAxLCAmZGQpKTsKKyAgRVhQRUNUX0VRKDB4MDEsIGJ1ZmZlclswXSk7CisgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMV0pOworCisgIC8vIFNlZWtpbmcgYmVmb3JlIHN0YXJ0IHJldHVybnMgZXJyb3IgbGVhdmluZyBwb3NpdGlvbiB1bmNoYW5nZWQuCisgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKKyAgRVhQRUNUX0ZBTFNFKG9wal9zZWVrX2Zyb21fbWVtb3J5KC0xLCAmZGQpKTsKKyAgRVhQRUNUX0VRKDEsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMSwgJmRkKSk7CisgIEVYUEVDVF9FUSgweDAyLCBidWZmZXJbMF0pOworICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzFdKTsKKworICAvLyBTZWVraW5nIHdheSBiZWZvcmUgc3RhcnQgcmV0dXJucyBlcnJvciBsZWF2aW5nIHBvc2l0aW9uIHVuY2hhbmdlZC4KKyAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOworICBFWFBFQ1RfRkFMU0UoCisgICAgICBvcGpfc2Vla19mcm9tX21lbW9yeShzdGQ6Om51bWVyaWNfbGltaXRzPE9QSl9PRkZfVD46Om1pbigpLCAmZGQpKTsKKyAgRVhQRUNUX0VRKDEsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMSwgJmRkKSk7CisgIEVYUEVDVF9FUSgweDAzLCBidWZmZXJbMF0pOworICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzFdKTsKKworICAvLyBTZWVraW5nIGV4YWN0bHkgdG8gRU9TIGlzIGFsbG93ZWQgYnV0IHJlYWQgZmFpbHMuCisgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKKyAgRVhQRUNUX1RSVUUob3BqX3NlZWtfZnJvbV9tZW1vcnkoOCwgJmRkKSk7CisgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDEsICZkZCkpOworICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzBdKTsKKworICAvLyBTZWVraW5nIGJhY2sgdG8gemVybyBvZmZzZXQgaXMgYWxsb3dlZCBhbmQgcmVhZCBzdWNjZWVkcy4KKyAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOworICBFWFBFQ1RfVFJVRShvcGpfc2Vla19mcm9tX21lbW9yeSgwLCAmZGQpKTsKKyAgRVhQRUNUX0VRKDF1LCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIDEsICZkZCkpOworICBFWFBFQ1RfRVEoMHgwMCwgYnVmZmVyWzBdKTsKKyAgRVhQRUNUX0VRKDB4YmQsIGJ1ZmZlclsxXSk7CisKKyAgLy8gU2Vla2luZyBiZXlvbmQgZW5kIG9mIHN0cmVhbSBpcyBhbGxvd2VkIGJ1dCByZWFkIGZhaWxzLgorICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7CisgIEVYUEVDVF9UUlVFKG9wal9zZWVrX2Zyb21fbWVtb3J5KDE2LCAmZGQpKTsKKyAgRVhQRUNUX0VRKGtSZWFkRXJyb3IsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMSwgJmRkKSk7CisgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMF0pOworCisgIC8vIFNlZWtpbmcgd2l0aGluIGJ1ZmZlciBhZnRlciBzZWVrIHBhc3QgRU9GIHJlc3RvcmVzIGdvb2Qgc3RhdGUuCisgIG1lbXNldChidWZmZXIsIDB4YmQsIHNpemVvZihidWZmZXIpKTsKKyAgRVhQRUNUX1RSVUUob3BqX3NlZWtfZnJvbV9tZW1vcnkoNCwgJmRkKSk7CisgIEVYUEVDVF9FUSgxdSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkoYnVmZmVyLCAxLCAmZGQpKTsKKyAgRVhQRUNUX0VRKDB4ODQsIGJ1ZmZlclswXSk7CisgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMV0pOworCisgIC8vIFNlZWtpbmcgd2F5IGJleW9uZCBFT1MgaXMgYWxsb3dlZCwgZG9lc24ndCB3cmFwLCBhbmQgcmVhZCBmYWlscy4KKyAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOworICBFWFBFQ1RfVFJVRShvcGpfc2Vla19mcm9tX21lbW9yeShzdGQ6Om51bWVyaWNfbGltaXRzPE9QSl9PRkZfVD46Om1heCgpLCAmZGQpKTsKKyAgRVhQRUNUX0VRKGtSZWFkRXJyb3IsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgMSwgJmRkKSk7CisgIEVYUEVDVF9FUSgweGJkLCBidWZmZXJbMF0pOworfQorCitURVNUKGZ4Y29kZWMsIFlVVjQyMFRvUkdCKSB7CisgIG9wal9pbWFnZV9jb21wX3QgdTsKKyAgbWVtc2V0KCZ1LCAwLCBzaXplb2YodSkpOworICB1LmR4ID0gMTsKKyAgdS5keSA9IDE7CisgIHUudyA9IDE2OworICB1LmggPSAxNjsKKyAgdS5wcmVjID0gODsKKyAgdS5icHAgPSA4OworICBvcGpfaW1hZ2VfY29tcF90IHY7CisgIG1lbXNldCgmdiwgMCwgc2l6ZW9mKHYpKTsKKyAgdi5keCA9IDE7CisgIHYuZHkgPSAxOworICB2LncgPSAxNjsKKyAgdi5oID0gMTY7CisgIHYucHJlYyA9IDg7CisgIHYuYnBwID0gODsKKyAgb3BqX2ltYWdlX2NvbXBfdCB5OworICBtZW1zZXQoJnksIDAsIHNpemVvZih5KSk7CisgIHkuZHggPSAxOworICB5LmR5ID0gMTsKKyAgeS5wcmVjID0gODsKKyAgeS5icHAgPSA4OworICBvcGpfaW1hZ2VfdCBpbWc7CisgIG1lbXNldCgmaW1nLCAwLCBzaXplb2YoaW1nKSk7CisgIGltZy5udW1jb21wcyA9IDM7CisgIGltZy5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfU1lDQzsKKyAgaW1nLmNvbXBzID0gRlhfQWxsb2Mob3BqX2ltYWdlX2NvbXBfdCwgMyk7CisgIGNvbnN0IHN0cnVjdCB7CisgICAgT1BKX1VJTlQzMiB3OworICAgIGJvb2wgZXhwZWN0ZWQ7CisgIH0gY2FzZXNbXSA9IHt7MCwgZmFsc2V9LAorICAgICAgICAgICAgICAgezEsIGZhbHNlfSwKKyAgICAgICAgICAgICAgIHszMCwgZmFsc2V9LAorICAgICAgICAgICAgICAgezMxLCB0cnVlfSwKKyAgICAgICAgICAgICAgIHszMiwgdHJ1ZX0sCisgICAgICAgICAgICAgICB7MzMsIHRydWV9LAorICAgICAgICAgICAgICAgezM0LCBmYWxzZX0sCisgICAgICAgICAgICAgICB7VUlOVF9NQVgsIGZhbHNlfX07CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZW9mKGNhc2VzKSAvIHNpemVvZihjYXNlc1swXSk7ICsraSkgeworICAgIHkudyA9IGNhc2VzW2ldLnc7CisgICAgeS5oID0geS53OworICAgIGltZy54MSA9IHkudzsKKyAgICBpbWcueTEgPSB5Lmg7CisgICAgeS5kYXRhID0gRlhfQWxsb2MoT1BKX0lOVDMyLCB5LncgKiB5LmgpOworICAgIG1lbXNldCh5LmRhdGEsIDEsIHkudyAqIHkuaCAqIHNpemVvZihPUEpfSU5UMzIpKTsKKyAgICB1LmRhdGEgPSBGWF9BbGxvYyhPUEpfSU5UMzIsIHUudyAqIHUuaCk7CisgICAgbWVtc2V0KHUuZGF0YSwgMCwgdS53ICogdS5oICogc2l6ZW9mKE9QSl9JTlQzMikpOworICAgIHYuZGF0YSA9IEZYX0FsbG9jKE9QSl9JTlQzMiwgdi53ICogdi5oKTsKKyAgICBtZW1zZXQodi5kYXRhLCAwLCB2LncgKiB2LmggKiBzaXplb2YoT1BKX0lOVDMyKSk7CisgICAgaW1nLmNvbXBzWzBdID0geTsKKyAgICBpbWcuY29tcHNbMV0gPSB1OworICAgIGltZy5jb21wc1syXSA9IHY7CisgICAgc3ljYzQyMF90b19yZ2IoJmltZyk7CisgICAgaWYgKGNhc2VzW2ldLmV4cGVjdGVkKSB7CisgICAgICBFWFBFQ1RfRVEoaW1nLmNvbXBzWzBdLncsIGltZy5jb21wc1sxXS53KTsKKyAgICAgIEVYUEVDVF9FUShpbWcuY29tcHNbMF0uaCwgaW1nLmNvbXBzWzFdLmgpOworICAgICAgRVhQRUNUX0VRKGltZy5jb21wc1swXS53LCBpbWcuY29tcHNbMl0udyk7CisgICAgICBFWFBFQ1RfRVEoaW1nLmNvbXBzWzBdLmgsIGltZy5jb21wc1syXS5oKTsKKyAgICB9IGVsc2UgeworICAgICAgRVhQRUNUX05FKGltZy5jb21wc1swXS53LCBpbWcuY29tcHNbMV0udyk7CisgICAgICBFWFBFQ1RfTkUoaW1nLmNvbXBzWzBdLmgsIGltZy5jb21wc1sxXS5oKTsKKyAgICAgIEVYUEVDVF9ORShpbWcuY29tcHNbMF0udywgaW1nLmNvbXBzWzJdLncpOworICAgICAgRVhQRUNUX05FKGltZy5jb21wc1swXS5oLCBpbWcuY29tcHNbMl0uaCk7CisgICAgfQorICAgIEZYX0ZyZWUoaW1nLmNvbXBzWzBdLmRhdGEpOworICAgIEZYX0ZyZWUoaW1nLmNvbXBzWzFdLmRhdGEpOworICAgIEZYX0ZyZWUoaW1nLmNvbXBzWzJdLmRhdGEpOworICB9CisgIEZYX0ZyZWUoaW1nLmNvbXBzKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfcG5nLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfcG5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWNmYzE5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19wbmcuY3BwCkBAIC0wLDAgKzEsMjU2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlIDxhbGdvcml0aG0+DQorDQorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiDQorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2RpYi5oIg0KKyNpbmNsdWRlICJjb2RlY19pbnQuaCINCisNCitleHRlcm4gIkMiIHsNCisjdW5kZWYgRkFSDQorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xwbmdfdjE2My9wbmcuaCINCit9DQorDQorc3RhdGljIHZvaWQgX3BuZ19lcnJvcl9kYXRhKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tc2cpIHsNCisgIGlmIChwbmdfZ2V0X2Vycm9yX3B0cihwbmdfcHRyKSkgew0KKyAgICBGWFNZU19zdHJuY3B5KChjaGFyKilwbmdfZ2V0X2Vycm9yX3B0cihwbmdfcHRyKSwgZXJyb3JfbXNnLA0KKyAgICAgICAgICAgICAgICAgIFBOR19FUlJPUl9TSVpFIC0gMSk7DQorICB9DQorICBsb25nam1wKHBuZ19qbXBidWYocG5nX3B0ciksIDEpOw0KK30NCitzdGF0aWMgdm9pZCBfcG5nX3dhcm5pbmdfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgZXJyb3JfbXNnKSB7fQ0KK3N0YXRpYyB2b2lkIF9wbmdfbG9hZF9ibXBfYXR0cmlidXRlKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2luZm9wIGluZm9fcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpIHsNCisgIGlmIChwQXR0cmlidXRlKSB7DQorI2lmIGRlZmluZWQoUE5HX3BIWXNfU1VQUE9SVEVEKQ0KKyAgICBwQXR0cmlidXRlLT5tX25YRFBJID0gcG5nX2dldF94X3BpeGVsc19wZXJfbWV0ZXIocG5nX3B0ciwgaW5mb19wdHIpOw0KKyAgICBwQXR0cmlidXRlLT5tX25ZRFBJID0gcG5nX2dldF95X3BpeGVsc19wZXJfbWV0ZXIocG5nX3B0ciwgaW5mb19wdHIpOw0KKyAgICBwbmdfdWludF8zMiByZXNfeCwgcmVzX3k7DQorICAgIGludCB1bml0X3R5cGU7DQorICAgIHBuZ19nZXRfcEhZcyhwbmdfcHRyLCBpbmZvX3B0ciwgJnJlc194LCAmcmVzX3ksICZ1bml0X3R5cGUpOw0KKyAgICBzd2l0Y2ggKHVuaXRfdHlwZSkgew0KKyAgICAgIGNhc2UgUE5HX1JFU09MVVRJT05fTUVURVI6DQorICAgICAgICBwQXR0cmlidXRlLT5tX3dEUElVbml0ID0gRlhDT0RFQ19SRVNVTklUX01FVEVSOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIHBBdHRyaWJ1dGUtPm1fd0RQSVVuaXQgPSBGWENPREVDX1JFU1VOSVRfTk9ORTsNCisgICAgfQ0KKyNlbmRpZg0KKyNpZiBkZWZpbmVkKFBOR19pQ0NQX1NVUFBPUlRFRCkNCisgICAgcG5nX2NoYXJwIGljY19uYW1lOw0KKyAgICBwbmdfYnl0ZXAgaWNjX3Byb2ZpbGU7DQorICAgIHBuZ191aW50XzMyIGljY19wcm9mbGVuOw0KKyAgICBpbnQgY29tcHJlc3NfdHlwZTsNCisgICAgcG5nX2dldF9pQ0NQKHBuZ19wdHIsIGluZm9fcHRyLCAmaWNjX25hbWUsICZjb21wcmVzc190eXBlLCAmaWNjX3Byb2ZpbGUsDQorICAgICAgICAgICAgICAgICAmaWNjX3Byb2ZsZW4pOw0KKyNlbmRpZg0KKyAgICBpbnQgYlRpbWUgPSAwOw0KKyNpZiBkZWZpbmVkKFBOR190SU1FX1NVUFBPUlRFRCkNCisgICAgcG5nX3RpbWVwIHQgPSBOVUxMOw0KKyAgICBwbmdfZ2V0X3RJTUUocG5nX3B0ciwgaW5mb19wdHIsICZ0KTsNCisgICAgaWYgKHQpIHsNCisgICAgICBGWFNZU19tZW1zZXQocEF0dHJpYnV0ZS0+bV9zdHJUaW1lLCAwLCBzaXplb2YocEF0dHJpYnV0ZS0+bV9zdHJUaW1lKSk7DQorICAgICAgRlhTWVNfc25wcmludGYoKEZYX0NIQVIqKXBBdHRyaWJ1dGUtPm1fc3RyVGltZSwNCisgICAgICAgICAgICAgICAgICAgICBzaXplb2YocEF0dHJpYnV0ZS0+bV9zdHJUaW1lKSwgIiU0ZDolMmQ6JTJkICUyZDolMmQ6JTJkIiwNCisgICAgICAgICAgICAgICAgICAgICB0LT55ZWFyLCB0LT5tb250aCwgdC0+ZGF5LCB0LT5ob3VyLCB0LT5taW51dGUsIHQtPnNlY29uZCk7DQorICAgICAgcEF0dHJpYnV0ZS0+bV9zdHJUaW1lW3NpemVvZihwQXR0cmlidXRlLT5tX3N0clRpbWUpIC0gMV0gPSAwOw0KKyAgICAgIGJUaW1lID0gMTsNCisgICAgfQ0KKyNlbmRpZg0KKyNpZiBkZWZpbmVkKFBOR19URVhUX1NVUFBPUlRFRCkNCisgICAgaW50IGk7DQorICAgIEZYX1NUUlNJWkUgbGVuOw0KKyAgICBjb25zdCBGWF9DSEFSKiBidWY7DQorICAgIGludCBudW1fdGV4dDsNCisgICAgcG5nX3RleHRwIHRleHQgPSBOVUxMOw0KKyAgICBwbmdfZ2V0X3RleHQocG5nX3B0ciwgaW5mb19wdHIsICZ0ZXh0LCAmbnVtX3RleHQpOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3RleHQ7IGkrKykgew0KKyAgICAgIGxlbiA9IEZYU1lTX3N0cmxlbih0ZXh0W2ldLmtleSk7DQorICAgICAgYnVmID0gIlRpbWUiOw0KKyAgICAgIGlmICghRlhTWVNfbWVtY21wKGJ1ZiwgdGV4dFtpXS5rZXksIHN0ZDo6bWluKGxlbiwgRlhTWVNfc3RybGVuKGJ1ZikpKSkgew0KKyAgICAgICAgaWYgKCFiVGltZSkgew0KKyAgICAgICAgICBGWFNZU19tZW1zZXQocEF0dHJpYnV0ZS0+bV9zdHJUaW1lLCAwLCBzaXplb2YocEF0dHJpYnV0ZS0+bV9zdHJUaW1lKSk7DQorICAgICAgICAgIEZYU1lTX21lbWNweSgNCisgICAgICAgICAgICAgIHBBdHRyaWJ1dGUtPm1fc3RyVGltZSwgdGV4dFtpXS50ZXh0LA0KKyAgICAgICAgICAgICAgc3RkOjptaW4oc2l6ZW9mKHBBdHRyaWJ1dGUtPm1fc3RyVGltZSkgLSAxLCB0ZXh0W2ldLnRleHRfbGVuZ3RoKSk7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGJ1ZiA9ICJBdXRob3IiOw0KKyAgICAgICAgaWYgKCFGWFNZU19tZW1jbXAoYnVmLCB0ZXh0W2ldLmtleSwgc3RkOjptaW4obGVuLCBGWFNZU19zdHJsZW4oYnVmKSkpKSB7DQorICAgICAgICAgIHBBdHRyaWJ1dGUtPm1fc3RyQXV0aG9yLkVtcHR5KCk7DQorICAgICAgICAgIHBBdHRyaWJ1dGUtPm1fc3RyQXV0aG9yLkxvYWQoKHVpbnQ4X3QqKXRleHRbaV0udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfU1RSU0laRSl0ZXh0W2ldLnRleHRfbGVuZ3RoKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisjZW5kaWYNCisgIH0NCit9DQorc3RydWN0IEZYUE5HX0NvbnRleHQgew0KKyAgcG5nX3N0cnVjdHAgcG5nX3B0cjsNCisgIHBuZ19pbmZvcCBpbmZvX3B0cjsNCisgIHZvaWQqIHBhcmVudF9wdHI7DQorICB2b2lkKiBjaGlsZF9wdHI7DQorDQorICB2b2lkKiAoKm1fQWxsb2NGdW5jKSh1bnNpZ25lZCBpbnQpOw0KKyAgdm9pZCAoKm1fRnJlZUZ1bmMpKHZvaWQqKTsNCit9Ow0KK2V4dGVybiAiQyIgew0KK3N0YXRpYyB2b2lkKiBfcG5nX2FsbG9jX2Z1bmModW5zaWduZWQgaW50IHNpemUpIHsNCisgIHJldHVybiBGWF9BbGxvYyhjaGFyLCBzaXplKTsNCit9DQorc3RhdGljIHZvaWQgX3BuZ19mcmVlX2Z1bmModm9pZCogcCkgew0KKyAgaWYgKHAgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKHApOw0KKyAgfQ0KK30NCit9Ow0KK3N0YXRpYyB2b2lkIF9wbmdfZ2V0X2hlYWRlcl9mdW5jKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikgew0KKyAgRlhQTkdfQ29udGV4dCogcCA9IChGWFBOR19Db250ZXh0KilwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cihwbmdfcHRyKTsNCisgIGlmIChwID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0NvZGVjX1BuZ01vZHVsZSogcE1vZHVsZSA9IChDQ29kZWNfUG5nTW9kdWxlKilwLT5wYXJlbnRfcHRyOw0KKyAgaWYgKHBNb2R1bGUgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBwbmdfdWludF8zMiB3aWR0aCA9IDAsIGhlaWdodCA9IDA7DQorICBpbnQgYnBjID0gMCwgY29sb3JfdHlwZSA9IDAsIGNvbG9yX3R5cGUxID0gMCwgcGFzcyA9IDA7DQorICBkb3VibGUgZ2FtbWEgPSAxLjA7DQorICBwbmdfZ2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsICZ3aWR0aCwgJmhlaWdodCwgJmJwYywgJmNvbG9yX3R5cGUsIE5VTEwsDQorICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7DQorICBjb2xvcl90eXBlMSA9IGNvbG9yX3R5cGU7DQorICBpZiAoYnBjID4gOCkgew0KKyAgICBwbmdfc2V0X3N0cmlwXzE2KHBuZ19wdHIpOw0KKyAgfSBlbHNlIGlmIChicGMgPCA4KSB7DQorICAgIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOChwbmdfcHRyKTsNCisgIH0NCisgIGJwYyA9IDg7DQorICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKSB7DQorICAgIHBuZ19zZXRfcGFsZXR0ZV90b19yZ2IocG5nX3B0cik7DQorICB9DQorICBwYXNzID0gcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7DQorICBpZiAoIXBNb2R1bGUtPlJlYWRIZWFkZXJDYWxsYmFjayhwLT5jaGlsZF9wdHIsIHdpZHRoLCBoZWlnaHQsIGJwYywgcGFzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvcl90eXBlLCAmZ2FtbWEpKSB7DQorICAgIHBuZ19lcnJvcihwLT5wbmdfcHRyLCAiUmVhZCBIZWFkZXIgQ2FsbGJhY2sgRXJyb3IiKTsNCisgIH0NCisgIGludCBpbnRlbnQ7DQorICBpZiAocG5nX2dldF9zUkdCKHBuZ19wdHIsIGluZm9fcHRyLCAmaW50ZW50KSkgew0KKyAgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIGdhbW1hLCAwLjQ1NDU1KTsNCisgIH0gZWxzZSB7DQorICAgIGRvdWJsZSBpbWFnZV9nYW1tYTsNCisgICAgaWYgKHBuZ19nZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgJmltYWdlX2dhbW1hKSkgew0KKyAgICAgIHBuZ19zZXRfZ2FtbWEocG5nX3B0ciwgZ2FtbWEsIGltYWdlX2dhbW1hKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIGdhbW1hLCAwLjQ1NDU1KTsNCisgICAgfQ0KKyAgfQ0KKyAgc3dpdGNoIChjb2xvcl90eXBlKSB7DQorICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfR1JBWToNCisgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBOiB7DQorICAgICAgaWYgKGNvbG9yX3R5cGUxICYgUE5HX0NPTE9SX01BU0tfQ09MT1IpIHsNCisgICAgICAgIHBuZ19zZXRfcmdiX3RvX2dyYXkocG5nX3B0ciwgMSwgMC4yOTksIDAuNTg3KTsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUEFMRVRURToNCisgICAgICBpZiAoY29sb3JfdHlwZTEgIT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkgew0KKyAgICAgICAgcG5nX2Vycm9yKHAtPnBuZ19wdHIsICJOb3QgU3VwcG9ydCBPdXRwdXQgUGFsZXR0ZSBOb3ciKTsNCisgICAgICB9DQorICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUkdCOg0KKyAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQToNCisgICAgICBpZiAoIShjb2xvcl90eXBlMSAmIFBOR19DT0xPUl9NQVNLX0NPTE9SKSkgew0KKyAgICAgICAgcG5nX3NldF9ncmF5X3RvX3JnYihwbmdfcHRyKTsNCisgICAgICB9DQorICAgICAgcG5nX3NldF9iZ3IocG5nX3B0cik7DQorICAgICAgYnJlYWs7DQorICB9DQorICBpZiAoIShjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpKSB7DQorICAgIHBuZ19zZXRfc3RyaXBfYWxwaGEocG5nX3B0cik7DQorICB9DQorICBpZiAoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBICYmDQorICAgICAgIShjb2xvcl90eXBlMSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKSkgew0KKyAgICBwbmdfc2V0X2ZpbGxlcihwbmdfcHRyLCAweGZmLCBQTkdfRklMTEVSX0FGVEVSKTsNCisgIH0NCisgIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKHBuZ19wdHIsIGluZm9fcHRyKTsNCit9DQorc3RhdGljIHZvaWQgX3BuZ19nZXRfZW5kX2Z1bmMocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2luZm9wIGluZm9fcHRyKSB7fQ0KK3N0YXRpYyB2b2lkIF9wbmdfZ2V0X3Jvd19mdW5jKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2J5dGVwIG5ld19yb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X251bSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFzcykgew0KKyAgRlhQTkdfQ29udGV4dCogcCA9IChGWFBOR19Db250ZXh0KilwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cihwbmdfcHRyKTsNCisgIGlmIChwID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0NvZGVjX1BuZ01vZHVsZSogcE1vZHVsZSA9IChDQ29kZWNfUG5nTW9kdWxlKilwLT5wYXJlbnRfcHRyOw0KKyAgdWludDhfdCogc3JjX2J1ZiA9IE5VTEw7DQorICBpZiAoIXBNb2R1bGUtPkFza1NjYW5saW5lQnVmQ2FsbGJhY2socC0+Y2hpbGRfcHRyLCByb3dfbnVtLCBzcmNfYnVmKSkgew0KKyAgICBwbmdfZXJyb3IocG5nX3B0ciwgIkFzayBTY2FubGluZSBidWZmZXIgQ2FsbGJhY2sgRXJyb3IiKTsNCisgIH0NCisgIGlmIChzcmNfYnVmICE9IE5VTEwpIHsNCisgICAgcG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93KHBuZ19wdHIsIHNyY19idWYsIG5ld19yb3cpOw0KKyAgfQ0KKyAgcE1vZHVsZS0+RmlsbFNjYW5saW5lQnVmQ29tcGxldGVkQ2FsbGJhY2socC0+Y2hpbGRfcHRyLCBwYXNzLCByb3dfbnVtKTsNCit9DQordm9pZCogQ0NvZGVjX1BuZ01vZHVsZTo6U3RhcnQodm9pZCogcE1vZHVsZSkgew0KKyAgRlhQTkdfQ29udGV4dCogcCA9IChGWFBOR19Db250ZXh0KilGWF9BbGxvYyh1aW50OF90LCBzaXplb2YoRlhQTkdfQ29udGV4dCkpOw0KKyAgaWYgKHAgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHAtPm1fQWxsb2NGdW5jID0gX3BuZ19hbGxvY19mdW5jOw0KKyAgcC0+bV9GcmVlRnVuYyA9IF9wbmdfZnJlZV9mdW5jOw0KKyAgcC0+cG5nX3B0ciA9IE5VTEw7DQorICBwLT5pbmZvX3B0ciA9IE5VTEw7DQorICBwLT5wYXJlbnRfcHRyID0gKHZvaWQqKXRoaXM7DQorICBwLT5jaGlsZF9wdHIgPSBwTW9kdWxlOw0KKyAgcC0+cG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCBOVUxMLCBOVUxMLCBOVUxMKTsNCisgIGlmIChwLT5wbmdfcHRyID09IE5VTEwpIHsNCisgICAgRlhfRnJlZShwKTsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBwLT5pbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocC0+cG5nX3B0cik7DQorICBpZiAocC0+aW5mb19wdHIgPT0gTlVMTCkgew0KKyAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmKHAtPnBuZ19wdHIpLCAocG5nX2luZm9wcClOVUxMLCAocG5nX2luZm9wcClOVUxMKTsNCisgICAgRlhfRnJlZShwKTsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpZiAoc2V0am1wKHBuZ19qbXBidWYocC0+cG5nX3B0cikpKSB7DQorICAgIGlmIChwICE9IE5VTEwpIHsNCisgICAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmKHAtPnBuZ19wdHIpLCAmKHAtPmluZm9fcHRyKSwgKHBuZ19pbmZvcHApTlVMTCk7DQorICAgICAgRlhfRnJlZShwKTsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbihwLT5wbmdfcHRyLCBwLCBfcG5nX2dldF9oZWFkZXJfZnVuYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcG5nX2dldF9yb3dfZnVuYywgX3BuZ19nZXRfZW5kX2Z1bmMpOw0KKyAgcG5nX3NldF9lcnJvcl9mbihwLT5wbmdfcHRyLCBtX3N6TGFzdEVycm9yLCAocG5nX2Vycm9yX3B0cilfcG5nX2Vycm9yX2RhdGEsDQorICAgICAgICAgICAgICAgICAgIChwbmdfZXJyb3JfcHRyKV9wbmdfd2FybmluZ19kYXRhKTsNCisgIHJldHVybiBwOw0KK30NCit2b2lkIENDb2RlY19QbmdNb2R1bGU6OkZpbmlzaCh2b2lkKiBwQ29udGV4dCkgew0KKyAgRlhQTkdfQ29udGV4dCogcCA9IChGWFBOR19Db250ZXh0KilwQ29udGV4dDsNCisgIGlmIChwICE9IE5VTEwpIHsNCisgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJihwLT5wbmdfcHRyKSwgJihwLT5pbmZvX3B0ciksIChwbmdfaW5mb3BwKU5VTEwpOw0KKyAgICBwLT5tX0ZyZWVGdW5jKHApOw0KKyAgfQ0KK30NCitGWF9CT09MIENDb2RlY19QbmdNb2R1bGU6OklucHV0KHZvaWQqIHBDb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkgew0KKyAgRlhQTkdfQ29udGV4dCogcCA9IChGWFBOR19Db250ZXh0KilwQ29udGV4dDsNCisgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwLT5wbmdfcHRyKSkpIHsNCisgICAgaWYgKHBBdHRyaWJ1dGUgJiYNCisgICAgICAgIDAgPT0gRlhTWVNfc3RyY21wKG1fc3pMYXN0RXJyb3IsICJSZWFkIEhlYWRlciBDYWxsYmFjayBFcnJvciIpKSB7DQorICAgICAgX3BuZ19sb2FkX2JtcF9hdHRyaWJ1dGUocC0+cG5nX3B0ciwgcC0+aW5mb19wdHIsIHBBdHRyaWJ1dGUpOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHBuZ19wcm9jZXNzX2RhdGEocC0+cG5nX3B0ciwgcC0+aW5mb19wdHIsICh1aW50OF90KilzcmNfYnVmLCBzcmNfc2l6ZSk7DQorICByZXR1cm4gVFJVRTsNCit9DQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19wcm9ncmVzcy5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3Byb2dyZXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODNlM2VkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19wcm9ncmVzcy5jcHAKQEAgLTAsMCArMSwyMzU0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9kaWIuaCINCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCINCisjaW5jbHVkZSAiZnhfY29kZWNfcHJvZ3Jlc3MuaCINCit2b2lkIENGWENPREVDX1dlaWdodFRhYmxlOjpDYWxjKGludCBkZXN0X2xlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X21pbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X21heCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19taW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX21heCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkludGVycG9sKSB7DQorICBpZiAobV9wV2VpZ2h0VGFibGVzKSB7DQorICAgIEZYX0ZyZWUobV9wV2VpZ2h0VGFibGVzKTsNCisgIH0NCisgIGRvdWJsZSBzY2FsZSwgYmFzZTsNCisgIHNjYWxlID0gRlhTWVNfRGl2KChGWF9GTE9BVCkoc3JjX2xlbiksIChGWF9GTE9BVCkoZGVzdF9sZW4pKTsNCisgIGlmIChkZXN0X2xlbiA8IDApIHsNCisgICAgYmFzZSA9IChGWF9GTE9BVCkoc3JjX2xlbik7DQorICB9IGVsc2Ugew0KKyAgICBiYXNlID0gMC4wZjsNCisgIH0NCisgIG1fSXRlbVNpemUgPQ0KKyAgICAgIChpbnQpKHNpemVvZihpbnQpICogMiArDQorICAgICAgICAgICAgc2l6ZW9mKGludCkgKiAoRlhTWVNfY2VpbChGWFNZU19mYWJzKChGWF9GTE9BVClzY2FsZSkpICsgMSkpOw0KKyAgbV9EZXN0TWluID0gZGVzdF9taW47DQorICBtX3BXZWlnaHRUYWJsZXMgPSBGWF9BbGxvYyh1aW50OF90LCAoZGVzdF9tYXggLSBkZXN0X21pbikgKiBtX0l0ZW1TaXplICsgNCk7DQorICBpZiAobV9wV2VpZ2h0VGFibGVzID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKEZYU1lTX2ZhYnMoKEZYX0ZMT0FUKXNjYWxlKSA8IDEuMGYpIHsNCisgICAgZm9yIChpbnQgZGVzdF9waXhlbCA9IGRlc3RfbWluOyBkZXN0X3BpeGVsIDwgZGVzdF9tYXg7IGRlc3RfcGl4ZWwrKykgew0KKyAgICAgIFBpeGVsV2VpZ2h0JiBwaXhlbF93ZWlnaHRzID0gKkdldFBpeGVsV2VpZ2h0KGRlc3RfcGl4ZWwpOw0KKyAgICAgIGRvdWJsZSBzcmNfcG9zID0gZGVzdF9waXhlbCAqIHNjYWxlICsgc2NhbGUgLyAyICsgYmFzZTsNCisgICAgICBpZiAoYkludGVycG9sKSB7DQorICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPQ0KKyAgICAgICAgICAgIChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY19wb3MgLSAxLjBmIC8gMik7DQorICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gKGludClGWFNZU19mbG9vcigoRlhfRkxPQVQpc3JjX3BvcyArIDEuMGYgLyAyKTsNCisgICAgICAgIGlmIChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPCBzcmNfbWluKSB7DQorICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9IHNyY19taW47DQorICAgICAgICB9DQorICAgICAgICBpZiAocGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA+PSBzcmNfbWF4KSB7DQorICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSBzcmNfbWF4IC0gMTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCkgew0KKyAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9IDY1NTM2Ow0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMV0gPSBGWFNZU19yb3VuZCgNCisgICAgICAgICAgICAgIChGWF9GTE9BVCkoc3JjX3BvcyAtIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCAtIDEuMGYgLyAyKSAqDQorICAgICAgICAgICAgICA2NTUzNik7DQorICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0gNjU1MzYgLSBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1sxXTsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9DQorICAgICAgICAgICAgKGludClGWFNZU19mbG9vcigoRlhfRkxPQVQpc3JjX3Bvcyk7DQorICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9IDY1NTM2Ow0KKyAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm47DQorICB9DQorICBmb3IgKGludCBkZXN0X3BpeGVsID0gZGVzdF9taW47IGRlc3RfcGl4ZWwgPCBkZXN0X21heDsgZGVzdF9waXhlbCsrKSB7DQorICAgIFBpeGVsV2VpZ2h0JiBwaXhlbF93ZWlnaHRzID0gKkdldFBpeGVsV2VpZ2h0KGRlc3RfcGl4ZWwpOw0KKyAgICBkb3VibGUgc3JjX3N0YXJ0ID0gZGVzdF9waXhlbCAqIHNjYWxlICsgYmFzZTsNCisgICAgZG91YmxlIHNyY19lbmQgPSBzcmNfc3RhcnQgKyBzY2FsZTsNCisgICAgaW50IHN0YXJ0X2ksIGVuZF9pOw0KKyAgICBpZiAoc3JjX3N0YXJ0IDwgc3JjX2VuZCkgew0KKyAgICAgIHN0YXJ0X2kgPSAoaW50KUZYU1lTX2Zsb29yKChGWF9GTE9BVClzcmNfc3RhcnQpOw0KKyAgICAgIGVuZF9pID0gKGludClGWFNZU19jZWlsKChGWF9GTE9BVClzcmNfZW5kKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBzdGFydF9pID0gKGludClGWFNZU19mbG9vcigoRlhfRkxPQVQpc3JjX2VuZCk7DQorICAgICAgZW5kX2kgPSAoaW50KUZYU1lTX2NlaWwoKEZYX0ZMT0FUKXNyY19zdGFydCk7DQorICAgIH0NCisgICAgaWYgKHN0YXJ0X2kgPCBzcmNfbWluKSB7DQorICAgICAgc3RhcnRfaSA9IHNyY19taW47DQorICAgIH0NCisgICAgaWYgKGVuZF9pID49IHNyY19tYXgpIHsNCisgICAgICBlbmRfaSA9IHNyY19tYXggLSAxOw0KKyAgICB9DQorICAgIGlmIChzdGFydF9pID4gZW5kX2kpIHsNCisgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPSBzdGFydF9pOw0KKyAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSBzdGFydF9pOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9IHN0YXJ0X2k7DQorICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSBlbmRfaTsNCisgICAgZm9yIChpbnQgaiA9IHN0YXJ0X2k7IGogPD0gZW5kX2k7IGorKykgew0KKyAgICAgIGRvdWJsZSBkZXN0X3N0YXJ0ID0gRlhTWVNfRGl2KChGWF9GTE9BVCkoaiktYmFzZSwgc2NhbGUpOw0KKyAgICAgIGRvdWJsZSBkZXN0X2VuZCA9IEZYU1lTX0RpdigoRlhfRkxPQVQpKGogKyAxKSAtIGJhc2UsIHNjYWxlKTsNCisgICAgICBpZiAoZGVzdF9zdGFydCA+IGRlc3RfZW5kKSB7DQorICAgICAgICBkb3VibGUgdGVtcCA9IGRlc3Rfc3RhcnQ7DQorICAgICAgICBkZXN0X3N0YXJ0ID0gZGVzdF9lbmQ7DQorICAgICAgICBkZXN0X2VuZCA9IHRlbXA7DQorICAgICAgfQ0KKyAgICAgIGRvdWJsZSBhcmVhX3N0YXJ0ID0gZGVzdF9zdGFydCA+IChGWF9GTE9BVCkoZGVzdF9waXhlbCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRlc3Rfc3RhcnQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChGWF9GTE9BVCkoZGVzdF9waXhlbCk7DQorICAgICAgZG91YmxlIGFyZWFfZW5kID0gZGVzdF9lbmQgPiAoRlhfRkxPQVQpKGRlc3RfcGl4ZWwgKyAxKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChGWF9GTE9BVCkoZGVzdF9waXhlbCArIDEpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGVzdF9lbmQ7DQorICAgICAgZG91YmxlIHdlaWdodCA9IGFyZWFfc3RhcnQgPj0gYXJlYV9lbmQgPyAwLjBmIDogYXJlYV9lbmQgLSBhcmVhX3N0YXJ0Ow0KKyAgICAgIGlmICh3ZWlnaHQgPT0gMCAmJiBqID09IGVuZF9pKSB7DQorICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kLS07DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbaiAtIHN0YXJ0X2ldID0NCisgICAgICAgICAgRlhTWVNfcm91bmQoKEZYX0ZMT0FUKSh3ZWlnaHQgKiA2NTUzNikpOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0ZYQ09ERUNfSG9yelRhYmxlOjpDYWxjKGludCBkZXN0X2xlbiwgaW50IHNyY19sZW4sIEZYX0JPT0wgYkludGVycG9sKSB7DQorICBpZiAobV9wV2VpZ2h0VGFibGVzKSB7DQorICAgIEZYX0ZyZWUobV9wV2VpZ2h0VGFibGVzKTsNCisgIH0NCisgIGRvdWJsZSBzY2FsZSA9IChkb3VibGUpZGVzdF9sZW4gLyAoZG91YmxlKXNyY19sZW47DQorICBtX0l0ZW1TaXplID0gc2l6ZW9mKGludCkgKiA0Ow0KKyAgaW50IHNpemUgPSBkZXN0X2xlbiAqIG1fSXRlbVNpemUgKyA0Ow0KKyAgbV9wV2VpZ2h0VGFibGVzID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7DQorICBpZiAobV9wV2VpZ2h0VGFibGVzID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhTWVNfbWVtc2V0KG1fcFdlaWdodFRhYmxlcywgMCwgc2l6ZSk7DQorICBpZiAoc2NhbGUgPiAxKSB7DQorICAgIGludCBwcmVfZGVzX2NvbCA9IDA7DQorICAgIGZvciAoaW50IHNyY19jb2wgPSAwOyBzcmNfY29sIDwgc3JjX2xlbjsgc3JjX2NvbCsrKSB7DQorICAgICAgZG91YmxlIGRlc19jb2xfZiA9IHNyY19jb2wgKiBzY2FsZTsNCisgICAgICBpbnQgZGVzX2NvbCA9IEZYU1lTX3JvdW5kKChGWF9GTE9BVClkZXNfY29sX2YpOw0KKyAgICAgIFBpeGVsV2VpZ2h0KiBwV2VpZ2h0ID0NCisgICAgICAgICAgKFBpeGVsV2VpZ2h0KikobV9wV2VpZ2h0VGFibGVzICsgZGVzX2NvbCAqIG1fSXRlbVNpemUpOw0KKyAgICAgIHBXZWlnaHQtPm1fU3JjU3RhcnQgPSBwV2VpZ2h0LT5tX1NyY0VuZCA9IHNyY19jb2w7DQorICAgICAgcFdlaWdodC0+bV9XZWlnaHRzWzBdID0gNjU1MzY7DQorICAgICAgcFdlaWdodC0+bV9XZWlnaHRzWzFdID0gMDsNCisgICAgICBpZiAoc3JjX2NvbCA9PSBzcmNfbGVuIC0gMSAmJiBkZXNfY29sIDwgZGVzdF9sZW4gLSAxKSB7DQorICAgICAgICBmb3IgKGludCBkZXNfY29sX2luZGV4ID0gcHJlX2Rlc19jb2wgKyAxOyBkZXNfY29sX2luZGV4IDwgZGVzdF9sZW47DQorICAgICAgICAgICAgIGRlc19jb2xfaW5kZXgrKykgew0KKyAgICAgICAgICBwV2VpZ2h0ID0NCisgICAgICAgICAgICAgIChQaXhlbFdlaWdodCopKG1fcFdlaWdodFRhYmxlcyArIGRlc19jb2xfaW5kZXggKiBtX0l0ZW1TaXplKTsNCisgICAgICAgICAgcFdlaWdodC0+bV9TcmNTdGFydCA9IHBXZWlnaHQtPm1fU3JjRW5kID0gc3JjX2NvbDsNCisgICAgICAgICAgcFdlaWdodC0+bV9XZWlnaHRzWzBdID0gNjU1MzY7DQorICAgICAgICAgIHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSA9IDA7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICAgIGludCBkZXNfY29sX2xlbiA9IGRlc19jb2wgLSBwcmVfZGVzX2NvbDsNCisgICAgICBmb3IgKGludCBkZXNfY29sX2luZGV4ID0gcHJlX2Rlc19jb2wgKyAxOyBkZXNfY29sX2luZGV4IDwgZGVzX2NvbDsNCisgICAgICAgICAgIGRlc19jb2xfaW5kZXgrKykgew0KKyAgICAgICAgcFdlaWdodCA9IChQaXhlbFdlaWdodCopKG1fcFdlaWdodFRhYmxlcyArIGRlc19jb2xfaW5kZXggKiBtX0l0ZW1TaXplKTsNCisgICAgICAgIHBXZWlnaHQtPm1fU3JjU3RhcnQgPSBzcmNfY29sIC0gMTsNCisgICAgICAgIHBXZWlnaHQtPm1fU3JjRW5kID0gc3JjX2NvbDsNCisgICAgICAgIHBXZWlnaHQtPm1fV2VpZ2h0c1swXSA9DQorICAgICAgICAgICAgYkludGVycG9sID8gRlhTWVNfcm91bmQoKEZYX0ZMT0FUKSgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGWF9GTE9BVClkZXNfY29sIC0gKEZYX0ZMT0FUKWRlc19jb2xfaW5kZXgpIC8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWRlc19jb2xfbGVuICogNjU1MzYpKQ0KKyAgICAgICAgICAgICAgICAgICAgICA6IDY1NTM2Ow0KKyAgICAgICAgcFdlaWdodC0+bV9XZWlnaHRzWzFdID0gNjU1MzYgLSBwV2VpZ2h0LT5tX1dlaWdodHNbMF07DQorICAgICAgfQ0KKyAgICAgIHByZV9kZXNfY29sID0gZGVzX2NvbDsNCisgICAgfQ0KKyAgICByZXR1cm47DQorICB9DQorICBmb3IgKGludCBkZXNfY29sID0gMDsgZGVzX2NvbCA8IGRlc3RfbGVuOyBkZXNfY29sKyspIHsNCisgICAgZG91YmxlIHNyY19jb2xfZiA9IGRlc19jb2wgLyBzY2FsZTsNCisgICAgaW50IHNyY19jb2wgPSBGWFNZU19yb3VuZCgoRlhfRkxPQVQpc3JjX2NvbF9mKTsNCisgICAgUGl4ZWxXZWlnaHQqIHBXZWlnaHQgPQ0KKyAgICAgICAgKFBpeGVsV2VpZ2h0KikobV9wV2VpZ2h0VGFibGVzICsgZGVzX2NvbCAqIG1fSXRlbVNpemUpOw0KKyAgICBwV2VpZ2h0LT5tX1NyY1N0YXJ0ID0gcFdlaWdodC0+bV9TcmNFbmQgPSBzcmNfY29sOw0KKyAgICBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gPSA2NTUzNjsNCisgICAgcFdlaWdodC0+bV9XZWlnaHRzWzFdID0gMDsNCisgIH0NCit9DQordm9pZCBDRlhDT0RFQ19WZXJ0VGFibGU6OkNhbGMoaW50IGRlc3RfbGVuLCBpbnQgc3JjX2xlbikgew0KKyAgaWYgKG1fcFdlaWdodFRhYmxlcykgew0KKyAgICBGWF9GcmVlKG1fcFdlaWdodFRhYmxlcyk7DQorICB9DQorICBkb3VibGUgc2NhbGUgPSAoZG91YmxlKWRlc3RfbGVuIC8gKGRvdWJsZSlzcmNfbGVuOw0KKyAgbV9JdGVtU2l6ZSA9IHNpemVvZihpbnQpICogNDsNCisgIGludCBzaXplID0gZGVzdF9sZW4gKiBtX0l0ZW1TaXplICsgNDsNCisgIG1fcFdlaWdodFRhYmxlcyA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNpemUpOw0KKyAgaWYgKG1fcFdlaWdodFRhYmxlcyA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYU1lTX21lbXNldChtX3BXZWlnaHRUYWJsZXMsIDAsIHNpemUpOw0KKyAgaWYgKHNjYWxlID4gMSkgew0KKyAgICBkb3VibGUgc3RlcCA9IDAuMDsNCisgICAgaW50IHNyY19yb3cgPSAwOw0KKyAgICB3aGlsZSAoc3RlcCA8IChkb3VibGUpZGVzdF9sZW4pIHsNCisgICAgICBpbnQgc3RhcnRfc3RlcCA9IChpbnQpc3RlcDsNCisgICAgICBzdGVwID0gc2NhbGUgKiAoKytzcmNfcm93KTsNCisgICAgICBpbnQgZW5kX3N0ZXAgPSAoaW50KXN0ZXA7DQorICAgICAgaWYgKGVuZF9zdGVwID49IGRlc3RfbGVuKSB7DQorICAgICAgICBlbmRfc3RlcCA9IGRlc3RfbGVuOw0KKyAgICAgICAgZm9yIChpbnQgZGVzX3JvdyA9IHN0YXJ0X3N0ZXA7IGRlc19yb3cgPCBlbmRfc3RlcDsgZGVzX3JvdysrKSB7DQorICAgICAgICAgIFBpeGVsV2VpZ2h0KiBwV2VpZ2h0ID0NCisgICAgICAgICAgICAgIChQaXhlbFdlaWdodCopKG1fcFdlaWdodFRhYmxlcyArIGRlc19yb3cgKiBtX0l0ZW1TaXplKTsNCisgICAgICAgICAgcFdlaWdodC0+bV9TcmNTdGFydCA9IHN0YXJ0X3N0ZXA7DQorICAgICAgICAgIHBXZWlnaHQtPm1fU3JjRW5kID0gc3RhcnRfc3RlcDsNCisgICAgICAgICAgcFdlaWdodC0+bV9XZWlnaHRzWzBdID0gNjU1MzY7DQorICAgICAgICAgIHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSA9IDA7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICAgIGludCBsZW5ndGggPSBlbmRfc3RlcCAtIHN0YXJ0X3N0ZXA7DQorICAgICAgew0KKyAgICAgICAgUGl4ZWxXZWlnaHQqIHBXZWlnaHQgPQ0KKyAgICAgICAgICAgIChQaXhlbFdlaWdodCopKG1fcFdlaWdodFRhYmxlcyArIHN0YXJ0X3N0ZXAgKiBtX0l0ZW1TaXplKTsNCisgICAgICAgIHBXZWlnaHQtPm1fU3JjU3RhcnQgPSBzdGFydF9zdGVwOw0KKyAgICAgICAgcFdlaWdodC0+bV9TcmNFbmQgPSBzdGFydF9zdGVwOw0KKyAgICAgICAgcFdlaWdodC0+bV9XZWlnaHRzWzBdID0gNjU1MzY7DQorICAgICAgICBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gPSAwOw0KKyAgICAgIH0NCisgICAgICBmb3IgKGludCBkZXNfcm93ID0gc3RhcnRfc3RlcCArIDE7IGRlc19yb3cgPCBlbmRfc3RlcDsgZGVzX3JvdysrKSB7DQorICAgICAgICBQaXhlbFdlaWdodCogcFdlaWdodCA9DQorICAgICAgICAgICAgKFBpeGVsV2VpZ2h0KikobV9wV2VpZ2h0VGFibGVzICsgZGVzX3JvdyAqIG1fSXRlbVNpemUpOw0KKyAgICAgICAgcFdlaWdodC0+bV9TcmNTdGFydCA9IHN0YXJ0X3N0ZXA7DQorICAgICAgICBwV2VpZ2h0LT5tX1NyY0VuZCA9IGVuZF9zdGVwOw0KKyAgICAgICAgcFdlaWdodC0+bV9XZWlnaHRzWzBdID0gRlhTWVNfcm91bmQoKEZYX0ZMT0FUKShlbmRfc3RlcCAtIGRlc19yb3cpIC8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClsZW5ndGggKiA2NTUzNik7DQorICAgICAgICBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gPSA2NTUzNiAtIHBXZWlnaHQtPm1fV2VpZ2h0c1swXTsNCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGZvciAoaW50IGRlc19yb3cgPSAwOyBkZXNfcm93IDwgZGVzdF9sZW47IGRlc19yb3crKykgew0KKyAgICAgIFBpeGVsV2VpZ2h0KiBwV2VpZ2h0ID0NCisgICAgICAgICAgKFBpeGVsV2VpZ2h0KikobV9wV2VpZ2h0VGFibGVzICsgZGVzX3JvdyAqIG1fSXRlbVNpemUpOw0KKyAgICAgIHBXZWlnaHQtPm1fU3JjU3RhcnQgPSBkZXNfcm93Ow0KKyAgICAgIHBXZWlnaHQtPm1fU3JjRW5kID0gZGVzX3JvdzsNCisgICAgICBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gPSA2NTUzNjsNCisgICAgICBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gPSAwOw0KKyAgICB9DQorICB9DQorfQ0KK0NDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkNDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIoDQorICAgIENDb2RlY19Nb2R1bGVNZ3IqIHBDb2RlY01ncikgew0KKyAgbV9wRmlsZSA9IE5VTEw7DQorICBtX3BKcGVnQ29udGV4dCA9IE5VTEw7DQorICBtX3BQbmdDb250ZXh0ID0gTlVMTDsNCisgIG1fcEdpZkNvbnRleHQgPSBOVUxMOw0KKyAgbV9wQm1wQ29udGV4dCA9IE5VTEw7DQorICBtX3BUaWZmQ29udGV4dCA9IE5VTEw7DQorICBtX3BDb2RlY01nciA9IE5VTEw7DQorICBtX3BTcmNCdWYgPSBOVUxMOw0KKyAgbV9wRGVjb2RlQnVmID0gTlVMTDsNCisgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICBtX3BTcmNQYWxldHRlID0gTlVMTDsNCisgIG1fcENvZGVjTWdyID0gcENvZGVjTWdyOw0KKyAgbV9vZmZTZXQgPSAwOw0KKyAgbV9TcmNTaXplID0gMDsNCisgIG1fU2NhbmxpbmVTaXplID0gMDsNCisgIG1fU3JjV2lkdGggPSBtX1NyY0hlaWdodCA9IDA7DQorICBtX1NyY0NvbXBvbmVudHMgPSAwOw0KKyAgbV9TcmNCUEMgPSAwOw0KKyAgbV9TcmNQYXNzTnVtYmVyID0gMDsNCisgIG1fY2xpcEJveCA9IEZYX1JFQ1QoMCwgMCwgMCwgMCk7DQorICBtX2ltYWdUeXBlID0gRlhDT0RFQ19JTUFHRV9VTktOT1dOOw0KKyAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOw0KKyAgbV9UcmFuc01ldGhvZCA9IC0xOw0KKyAgbV9TcmNSb3cgPSAwOw0KKyAgbV9TcmNGb3JtYXQgPSBGWENvZGVjX0ludmFsaWQ7DQorICBtX2JJbnRlcnBvbCA9IFRSVUU7DQorICBtX0ZyYW1lTnVtYmVyID0gMDsNCisgIG1fRnJhbWVDdXIgPSAwOw0KKyAgbV9TcmNQYWxldHRlTnVtYmVyID0gMDsNCisgIG1fR2lmUGx0TnVtYmVyID0gMDsNCisgIG1fR2lmQmdJbmRleCA9IDA7DQorICBtX3BHaWZQYWxldHRlID0gTlVMTDsNCisgIG1fR2lmVHJhbnNJbmRleCA9IC0xOw0KKyAgbV9HaWZGcmFtZVJlY3QgPSBGWF9SRUNUKDAsIDAsIDAsIDApOw0KKyAgbV9CbXBJc1RvcEJvdHRvbSA9IEZBTFNFOw0KK30NCitDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjp+Q0NvZGVjX1Byb2dyZXNzaXZlRGVjb2RlcigpIHsNCisgIG1fcEZpbGUgPSBOVUxMOw0KKyAgaWYgKG1fcEpwZWdDb250ZXh0ICE9IE5VTEwpIHsNCisgICAgbV9wQ29kZWNNZ3ItPkdldEpwZWdNb2R1bGUoKS0+RmluaXNoKG1fcEpwZWdDb250ZXh0KTsNCisgIH0NCisgIGlmIChtX3BQbmdDb250ZXh0ICE9IE5VTEwpIHsNCisgICAgbV9wQ29kZWNNZ3ItPkdldFBuZ01vZHVsZSgpLT5GaW5pc2gobV9wUG5nQ29udGV4dCk7DQorICB9DQorICBpZiAobV9wR2lmQ29udGV4dCAhPSBOVUxMKSB7DQorICAgIG1fcENvZGVjTWdyLT5HZXRHaWZNb2R1bGUoKS0+RmluaXNoKG1fcEdpZkNvbnRleHQpOw0KKyAgfQ0KKyAgaWYgKG1fcEJtcENvbnRleHQgIT0gTlVMTCkgew0KKyAgICBtX3BDb2RlY01nci0+R2V0Qm1wTW9kdWxlKCktPkZpbmlzaChtX3BCbXBDb250ZXh0KTsNCisgIH0NCisgIGlmIChtX3BUaWZmQ29udGV4dCAhPSBOVUxMKSB7DQorICAgIG1fcENvZGVjTWdyLT5HZXRUaWZmTW9kdWxlKCktPkRlc3Ryb3lEZWNvZGVyKG1fcFRpZmZDb250ZXh0KTsNCisgIH0NCisgIGlmIChtX3BTcmNCdWYgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKG1fcFNyY0J1Zik7DQorICB9DQorICBpZiAobV9wRGVjb2RlQnVmICE9IE5VTEwpIHsNCisgICAgRlhfRnJlZShtX3BEZWNvZGVCdWYpOw0KKyAgfQ0KKyAgaWYgKG1fcFNyY1BhbGV0dGUgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKG1fcFNyY1BhbGV0dGUpOw0KKyAgfQ0KK30NCitGWF9CT09MIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkpwZWdSZWFkTW9yZURhdGEoDQorICAgIElDb2RlY19KcGVnTW9kdWxlKiBwSnBlZ01vZHVsZSwNCisgICAgRlhDT0RFQ19TVEFUVVMmIGVycl9zdGF0dXMpIHsNCisgIEZYX0RXT1JEIGR3U2l6ZSA9IChGWF9EV09SRCltX3BGaWxlLT5HZXRTaXplKCk7DQorICBpZiAoZHdTaXplIDw9IG1fb2ZmU2V0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGR3U2l6ZSA9IGR3U2l6ZSAtIG1fb2ZmU2V0Ow0KKyAgRlhfRFdPUkQgZHdBdmFpbCA9IHBKcGVnTW9kdWxlLT5HZXRBdmFpbElucHV0KG1fcEpwZWdDb250ZXh0LCBOVUxMKTsNCisgIGlmIChkd0F2YWlsID09IG1fU3JjU2l6ZSkgew0KKyAgICBpZiAoZHdTaXplID4gRlhDT0RFQ19CTE9DS19TSVpFKSB7DQorICAgICAgZHdTaXplID0gRlhDT0RFQ19CTE9DS19TSVpFOw0KKyAgICB9DQorICAgIG1fU3JjU2l6ZSA9IChkd1NpemUgKyBkd0F2YWlsICsgRlhDT0RFQ19CTE9DS19TSVpFIC0gMSkgLw0KKyAgICAgICAgICAgICAgICBGWENPREVDX0JMT0NLX1NJWkUgKiBGWENPREVDX0JMT0NLX1NJWkU7DQorICAgIG1fcFNyY0J1ZiA9IEZYX1JlYWxsb2ModWludDhfdCwgbV9wU3JjQnVmLCBtX1NyY1NpemUpOw0KKyAgICBpZiAoIW1fcFNyY0J1Zikgew0KKyAgICAgIGVycl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgRlhfRFdPUkQgZHdDb25zdW1lID0gbV9TcmNTaXplIC0gZHdBdmFpbDsNCisgICAgaWYgKGR3QXZhaWwpIHsNCisgICAgICBGWFNZU19tZW1jcHkobV9wU3JjQnVmLCBtX3BTcmNCdWYgKyBkd0NvbnN1bWUsIGR3QXZhaWwpOw0KKyAgICB9DQorICAgIGlmIChkd1NpemUgPiBkd0NvbnN1bWUpIHsNCisgICAgICBkd1NpemUgPSBkd0NvbnN1bWU7DQorICAgIH0NCisgIH0NCisgIGlmICghbV9wRmlsZS0+UmVhZEJsb2NrKG1fcFNyY0J1ZiArIGR3QXZhaWwsIG1fb2ZmU2V0LCBkd1NpemUpKSB7DQorICAgIGVycl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfUkVBRDsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9vZmZTZXQgKz0gZHdTaXplOw0KKyAgcEpwZWdNb2R1bGUtPklucHV0KG1fcEpwZWdDb250ZXh0LCBtX3BTcmNCdWYsIGR3U2l6ZSArIGR3QXZhaWwpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6UG5nUmVhZEhlYWRlckZ1bmModm9pZCogcE1vZHVsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnBjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhc3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbG9yX3R5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGdhbW1hKSB7DQorICBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKiBwQ29kZWMgPSAoQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciopcE1vZHVsZTsNCisgIGlmIChwQ29kZWMtPm1fcERldmljZUJpdG1hcCA9PSBOVUxMKSB7DQorICAgIHBDb2RlYy0+bV9TcmNXaWR0aCA9IHdpZHRoOw0KKyAgICBwQ29kZWMtPm1fU3JjSGVpZ2h0ID0gaGVpZ2h0Ow0KKyAgICBwQ29kZWMtPm1fU3JjQlBDID0gYnBjOw0KKyAgICBwQ29kZWMtPm1fU3JjUGFzc051bWJlciA9IHBhc3M7DQorICAgIHBDb2RlYy0+bV9TcmNDb21wb25lbnRzID0NCisgICAgICAgICpjb2xvcl90eXBlID09IDAgPyAxIDogKmNvbG9yX3R5cGUgPT0gMg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAzDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICpjb2xvcl90eXBlID09IDMNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gNA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAqY29sb3JfdHlwZSA9PSA0DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKmNvbG9yX3R5cGUgPT0gNiA/IDQgOiAwOw0KKyAgICBwQ29kZWMtPm1fY2xpcEJveCA9IEZYX1JFQ1QoMCwgMCwgd2lkdGgsIGhlaWdodCk7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZYRElCX0Zvcm1hdCBmb3JtYXQgPSBwQ29kZWMtPm1fcERldmljZUJpdG1hcC0+R2V0Rm9ybWF0KCk7DQorICBzd2l0Y2ggKGZvcm1hdCkgew0KKyAgICBjYXNlIEZYRElCXzFicHBNYXNrOg0KKyAgICBjYXNlIEZYRElCXzFicHBSZ2I6DQorICAgICAgQVNTRVJUKEZBTFNFKTsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6DQorICAgIGNhc2UgRlhESUJfOGJwcFJnYjoNCisgICAgICAqY29sb3JfdHlwZSA9IDA7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhESUJfUmdiOg0KKyAgICAgICpjb2xvcl90eXBlID0gMjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWERJQl9SZ2IzMjoNCisgICAgY2FzZSBGWERJQl9BcmdiOg0KKyAgICAgICpjb2xvcl90eXBlID0gNjsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBBU1NFUlQoRkFMU0UpOw0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgICpnYW1tYSA9IEZYQ09ERUNfUE5HX0dBTU1BOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6UG5nQXNrU2NhbmxpbmVCdWZGdW5jKHZvaWQqIHBNb2R1bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIHNyY19idWYpIHsNCisgIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIqIHBDb2RlYyA9IChDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKilwTW9kdWxlOw0KKyAgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAgPSBwQ29kZWMtPm1fcERldmljZUJpdG1hcDsNCisgIEFTU0VSVChwRElCaXRtYXAgIT0gTlVMTCk7DQorICBpZiAocERJQml0bWFwID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGxpbmUgPj0gcENvZGVjLT5tX2NsaXBCb3gudG9wICYmIGxpbmUgPCBwQ29kZWMtPm1fY2xpcEJveC5ib3R0b20pIHsNCisgICAgZG91YmxlIHNjYWxlX3kgPQ0KKyAgICAgICAgKGRvdWJsZSlwQ29kZWMtPm1fc2l6ZVkgLyAoZG91YmxlKXBDb2RlYy0+bV9jbGlwQm94LkhlaWdodCgpOw0KKyAgICBpbnQzMl90IHJvdyA9DQorICAgICAgICAoaW50MzJfdCkoKGxpbmUgLSBwQ29kZWMtPm1fY2xpcEJveC50b3ApICogc2NhbGVfeSkgKyBwQ29kZWMtPm1fc3RhcnRZOw0KKyAgICB1aW50OF90KiBzcmNfc2NhbiA9ICh1aW50OF90KilwRElCaXRtYXAtPkdldFNjYW5saW5lKHJvdyk7DQorICAgIHVpbnQ4X3QqIGRlc19zY2FuID0gcENvZGVjLT5tX3BEZWNvZGVCdWY7DQorICAgIHNyY19idWYgPSBwQ29kZWMtPm1fcERlY29kZUJ1ZjsNCisgICAgaW50MzJfdCBzcmNfQnBwID0gcERJQml0bWFwLT5HZXRCUFAoKSA+PiAzOw0KKyAgICBpbnQzMl90IGRlc19CcHAgPSAocENvZGVjLT5tX1NyY0Zvcm1hdCAmIDB4ZmYpID4+IDM7DQorICAgIGludDMyX3Qgc3JjX2xlZnQgPSBwQ29kZWMtPm1fc3RhcnRYOw0KKyAgICBpbnQzMl90IGRlc19sZWZ0ID0gcENvZGVjLT5tX2NsaXBCb3gubGVmdDsNCisgICAgc3JjX3NjYW4gKz0gc3JjX2xlZnQgKiBzcmNfQnBwOw0KKyAgICBkZXNfc2NhbiArPSBkZXNfbGVmdCAqIGRlc19CcHA7DQorICAgIGZvciAoaW50MzJfdCBzcmNfY29sID0gMDsgc3JjX2NvbCA8IHBDb2RlYy0+bV9zaXplWDsgc3JjX2NvbCsrKSB7DQorICAgICAgUGl4ZWxXZWlnaHQqIHBQaXhlbFdlaWdodHMgPQ0KKyAgICAgICAgICBwQ29kZWMtPm1fV2VpZ2h0SG9yek9PLkdldFBpeGVsV2VpZ2h0KHNyY19jb2wpOw0KKyAgICAgIGlmIChwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0ICE9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgc3dpdGNoIChwRElCaXRtYXAtPkdldEZvcm1hdCgpKSB7DQorICAgICAgICBjYXNlIEZYRElCXzFicHBNYXNrOg0KKyAgICAgICAgY2FzZSBGWERJQl8xYnBwUmdiOg0KKyAgICAgICAgICBBU1NFUlQoRkFMU0UpOw0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICBjYXNlIEZYRElCXzhicHBNYXNrOg0KKyAgICAgICAgY2FzZSBGWERJQl84YnBwUmdiOiB7DQorICAgICAgICAgIGlmIChwRElCaXRtYXAtPkdldFBhbGV0dGUoKSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIEZYX0RXT1JEIGRlc19nID0gMDsNCisgICAgICAgICAgZGVzX2cgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzBdICogc3JjX3NjYW5bc3JjX2NvbF07DQorICAgICAgICAgIGRlc19zY2FuW3BQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdID0gKHVpbnQ4X3QpKGRlc19nID4+IDE2KTsNCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBjYXNlIEZYRElCX1JnYjoNCisgICAgICAgIGNhc2UgRlhESUJfUmdiMzI6IHsNCisgICAgICAgICAgRlhfRFdPUkQgZGVzX2IgPSAwLCBkZXNfZyA9IDAsIGRlc19yID0gMDsNCisgICAgICAgICAgY29uc3QgdWludDhfdCogcCA9IHNyY19zY2FuICsgc3JjX2NvbCAqIHNyY19CcHA7DQorICAgICAgICAgIGRlc19iICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1swXSAqICgqcCsrKTsNCisgICAgICAgICAgZGVzX2cgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzBdICogKCpwKyspOw0KKyAgICAgICAgICBkZXNfciArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMF0gKiAoKnApOw0KKyAgICAgICAgICB1aW50OF90KiBwRGVzID0gJmRlc19zY2FuW3BQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQgKiBkZXNfQnBwXTsNCisgICAgICAgICAgKnBEZXMrKyA9ICh1aW50OF90KSgoZGVzX2IpID4+IDE2KTsNCisgICAgICAgICAgKnBEZXMrKyA9ICh1aW50OF90KSgoZGVzX2cpID4+IDE2KTsNCisgICAgICAgICAgKnBEZXMgPSAodWludDhfdCkoKGRlc19yKSA+PiAxNik7DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWERJQl9BcmdiOiB7DQorICAgICAgICAgIEZYX0RXT1JEIGRlc19yID0gMCwgZGVzX2cgPSAwLCBkZXNfYiA9IDA7DQorICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHAgPSBzcmNfc2NhbiArIHNyY19jb2wgKiBzcmNfQnBwOw0KKyAgICAgICAgICBkZXNfYiArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMF0gKiAoKnArKyk7DQorICAgICAgICAgIGRlc19nICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1swXSAqICgqcCsrKTsNCisgICAgICAgICAgZGVzX3IgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzBdICogKCpwKyspOw0KKyAgICAgICAgICB1aW50OF90KiBwRGVzID0gJmRlc19zY2FuW3BQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQgKiBkZXNfQnBwXTsNCisgICAgICAgICAgKnBEZXMrKyA9ICh1aW50OF90KSgoZGVzX2IpID4+IDE2KTsNCisgICAgICAgICAgKnBEZXMrKyA9ICh1aW50OF90KSgoZGVzX2cpID4+IDE2KTsNCisgICAgICAgICAgKnBEZXMrKyA9ICh1aW50OF90KSgoZGVzX3IpID4+IDE2KTsNCisgICAgICAgICAgKnBEZXMgPSAqcDsNCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpQbmdPbmVPbmVNYXBSZXNhbXBsZUhvcnooDQorICAgIENGWF9ESUJpdG1hcCogcERldmljZUJpdG1hcCwNCisgICAgaW50MzJfdCBkZXNfbGluZSwNCisgICAgdWludDhfdCogc3JjX3NjYW4sDQorICAgIEZYQ29kZWNfRm9ybWF0IHNyY19mb3JtYXQpIHsNCisgIHVpbnQ4X3QqIGRlc19zY2FuID0gKHVpbnQ4X3QqKXBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKGRlc19saW5lKTsNCisgIGludDMyX3Qgc3JjX0JwcCA9IChtX1NyY0Zvcm1hdCAmIDB4ZmYpID4+IDM7DQorICBpbnQzMl90IGRlc19CcHAgPSBwRGV2aWNlQml0bWFwLT5HZXRCUFAoKSA+PiAzOw0KKyAgaW50MzJfdCBzcmNfbGVmdCA9IG1fY2xpcEJveC5sZWZ0Ow0KKyAgaW50MzJfdCBkZXNfbGVmdCA9IG1fc3RhcnRYOw0KKyAgc3JjX3NjYW4gKz0gc3JjX2xlZnQgKiBzcmNfQnBwOw0KKyAgZGVzX3NjYW4gKz0gZGVzX2xlZnQgKiBkZXNfQnBwOw0KKyAgZm9yIChpbnQzMl90IGRlc19jb2wgPSAwOyBkZXNfY29sIDwgbV9zaXplWDsgZGVzX2NvbCsrKSB7DQorICAgIFBpeGVsV2VpZ2h0KiBwUGl4ZWxXZWlnaHRzID0gbV9XZWlnaHRIb3J6T08uR2V0UGl4ZWxXZWlnaHQoZGVzX2NvbCk7DQorICAgIHN3aXRjaCAocERldmljZUJpdG1hcC0+R2V0Rm9ybWF0KCkpIHsNCisgICAgICBjYXNlIEZYRElCXzFicHBNYXNrOg0KKyAgICAgIGNhc2UgRlhESUJfMWJwcFJnYjoNCisgICAgICAgIEFTU0VSVChGQUxTRSk7DQorICAgICAgICByZXR1cm47DQorICAgICAgY2FzZSBGWERJQl84YnBwTWFzazoNCisgICAgICBjYXNlIEZYRElCXzhicHBSZ2I6IHsNCisgICAgICAgIGlmIChwRGV2aWNlQml0bWFwLT5HZXRQYWxldHRlKCkgIT0gTlVMTCkgew0KKyAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBGWF9EV09SRCBkZXNfZyA9IDA7DQorICAgICAgICBkZXNfZyArPQ0KKyAgICAgICAgICAgIHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1swXSAqIHNyY19zY2FuW3BQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOw0KKyAgICAgICAgZGVzX2cgKz0NCisgICAgICAgICAgICBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMV0gKiBzcmNfc2NhbltwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZF07DQorICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KShkZXNfZyA+PiAxNik7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIEZYRElCX1JnYjoNCisgICAgICBjYXNlIEZYRElCX1JnYjMyOiB7DQorICAgICAgICBGWF9EV09SRCBkZXNfYiA9IDAsIGRlc19nID0gMCwgZGVzX3IgPSAwOw0KKyAgICAgICAgY29uc3QgdWludDhfdCogcCA9IHNyY19zY2FuOw0KKyAgICAgICAgcCA9IHNyY19zY2FuICsgcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydCAqIHNyY19CcHA7DQorICAgICAgICBkZXNfYiArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMF0gKiAoKnArKyk7DQorICAgICAgICBkZXNfZyArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMF0gKiAoKnArKyk7DQorICAgICAgICBkZXNfciArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMF0gKiAoKnApOw0KKyAgICAgICAgcCA9IHNyY19zY2FuICsgcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQgKiBzcmNfQnBwOw0KKyAgICAgICAgZGVzX2IgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzFdICogKCpwKyspOw0KKyAgICAgICAgZGVzX2cgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzFdICogKCpwKyspOw0KKyAgICAgICAgZGVzX3IgKz0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzWzFdICogKCpwKTsNCisgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfYikgPj4gMTYpOw0KKyAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19nKSA+PiAxNik7DQorICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KSgoZGVzX3IpID4+IDE2KTsNCisgICAgICAgIGRlc19zY2FuICs9IGRlc19CcHAgLSAzOw0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBGWERJQl9BcmdiOiB7DQorICAgICAgICBGWF9EV09SRCBkZXNfYSA9IDAsIGRlc19iID0gMCwgZGVzX2cgPSAwLCBkZXNfciA9IDA7DQorICAgICAgICBjb25zdCB1aW50OF90KiBwID0gc3JjX3NjYW47DQorICAgICAgICBwID0gc3JjX3NjYW4gKyBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0ICogc3JjX0JwcDsNCisgICAgICAgIGRlc19iICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1swXSAqICgqcCsrKTsNCisgICAgICAgIGRlc19nICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1swXSAqICgqcCsrKTsNCisgICAgICAgIGRlc19yICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1swXSAqICgqcCsrKTsNCisgICAgICAgIGRlc19hICs9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1swXSAqICgqcCk7DQorICAgICAgICBwID0gc3JjX3NjYW4gKyBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZCAqIHNyY19CcHA7DQorICAgICAgICBkZXNfYiArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMV0gKiAoKnArKyk7DQorICAgICAgICBkZXNfZyArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMV0gKiAoKnArKyk7DQorICAgICAgICBkZXNfciArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMV0gKiAoKnArKyk7DQorICAgICAgICBkZXNfYSArPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbMV0gKiAoKnApOw0KKyAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19iKSA+PiAxNik7DQorICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KSgoZGVzX2cpID4+IDE2KTsNCisgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfcikgPj4gMTYpOw0KKyAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19hKSA+PiAxNik7DQorICAgICAgfSBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6UG5nRmlsbFNjYW5saW5lQnVmQ29tcGxldGVkRnVuYyh2b2lkKiBwTW9kdWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUpIHsNCisgIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIqIHBDb2RlYyA9IChDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKilwTW9kdWxlOw0KKyAgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAgPSBwQ29kZWMtPm1fcERldmljZUJpdG1hcDsNCisgIEFTU0VSVChwRElCaXRtYXAgIT0gTlVMTCk7DQorICBpbnQgc3JjX3RvcCA9IHBDb2RlYy0+bV9jbGlwQm94LnRvcDsNCisgIGludCBzcmNfYm90dG9tID0gcENvZGVjLT5tX2NsaXBCb3guYm90dG9tOw0KKyAgaW50IGRlc190b3AgPSBwQ29kZWMtPm1fc3RhcnRZOw0KKyAgaW50IHNyY19oZWkgPSBwQ29kZWMtPm1fY2xpcEJveC5IZWlnaHQoKTsNCisgIGludCBkZXNfaGVpID0gcENvZGVjLT5tX3NpemVZOw0KKyAgaWYgKGxpbmUgPj0gc3JjX3RvcCAmJiBsaW5lIDwgc3JjX2JvdHRvbSkgew0KKyAgICBkb3VibGUgc2NhbGVfeSA9IChkb3VibGUpZGVzX2hlaSAvIChkb3VibGUpc3JjX2hlaTsNCisgICAgaW50IHNyY19yb3cgPSBsaW5lIC0gc3JjX3RvcDsNCisgICAgaW50IGRlc19yb3cgPSAoaW50KShzcmNfcm93ICogc2NhbGVfeSkgKyBkZXNfdG9wOw0KKyAgICBpZiAoZGVzX3JvdyA+PSBkZXNfdG9wICsgZGVzX2hlaSkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBwQ29kZWMtPlBuZ09uZU9uZU1hcFJlc2FtcGxlSG9yeihwRElCaXRtYXAsIGRlc19yb3csIHBDb2RlYy0+bV9wRGVjb2RlQnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29kZWMtPm1fU3JjRm9ybWF0KTsNCisgICAgaWYgKHBDb2RlYy0+bV9TcmNQYXNzTnVtYmVyID09IDEgJiYgc2NhbGVfeSA+IDEuMCkgew0KKyAgICAgIHBDb2RlYy0+UmVzYW1wbGVWZXJ0KHBESUJpdG1hcCwgc2NhbGVfeSwgZGVzX3Jvdyk7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChwYXNzID09IDYgJiYgc2NhbGVfeSA+IDEuMCkgew0KKyAgICAgIHBDb2RlYy0+UmVzYW1wbGVWZXJ0KHBESUJpdG1hcCwgc2NhbGVfeSwgZGVzX3Jvdyk7DQorICAgIH0NCisgIH0NCit9DQorRlhfQk9PTCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpHaWZSZWFkTW9yZURhdGEoSUNvZGVjX0dpZk1vZHVsZSogcEdpZk1vZHVsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWENPREVDX1NUQVRVUyYgZXJyX3N0YXR1cykgew0KKyAgRlhfRFdPUkQgZHdTaXplID0gKEZYX0RXT1JEKW1fcEZpbGUtPkdldFNpemUoKTsNCisgIGlmIChkd1NpemUgPD0gbV9vZmZTZXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgZHdTaXplID0gZHdTaXplIC0gbV9vZmZTZXQ7DQorICBGWF9EV09SRCBkd0F2YWlsID0gcEdpZk1vZHVsZS0+R2V0QXZhaWxJbnB1dChtX3BHaWZDb250ZXh0LCBOVUxMKTsNCisgIGlmIChkd0F2YWlsID09IG1fU3JjU2l6ZSkgew0KKyAgICBpZiAoZHdTaXplID4gRlhDT0RFQ19CTE9DS19TSVpFKSB7DQorICAgICAgZHdTaXplID0gRlhDT0RFQ19CTE9DS19TSVpFOw0KKyAgICB9DQorICAgIG1fU3JjU2l6ZSA9IChkd1NpemUgKyBkd0F2YWlsICsgRlhDT0RFQ19CTE9DS19TSVpFIC0gMSkgLw0KKyAgICAgICAgICAgICAgICBGWENPREVDX0JMT0NLX1NJWkUgKiBGWENPREVDX0JMT0NLX1NJWkU7DQorICAgIG1fcFNyY0J1ZiA9IEZYX1JlYWxsb2ModWludDhfdCwgbV9wU3JjQnVmLCBtX1NyY1NpemUpOw0KKyAgICBpZiAoIW1fcFNyY0J1Zikgew0KKyAgICAgIGVycl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgRlhfRFdPUkQgZHdDb25zdW1lID0gbV9TcmNTaXplIC0gZHdBdmFpbDsNCisgICAgaWYgKGR3QXZhaWwpIHsNCisgICAgICBGWFNZU19tZW1jcHkobV9wU3JjQnVmLCBtX3BTcmNCdWYgKyBkd0NvbnN1bWUsIGR3QXZhaWwpOw0KKyAgICB9DQorICAgIGlmIChkd1NpemUgPiBkd0NvbnN1bWUpIHsNCisgICAgICBkd1NpemUgPSBkd0NvbnN1bWU7DQorICAgIH0NCisgIH0NCisgIGlmICghbV9wRmlsZS0+UmVhZEJsb2NrKG1fcFNyY0J1ZiArIGR3QXZhaWwsIG1fb2ZmU2V0LCBkd1NpemUpKSB7DQorICAgIGVycl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfUkVBRDsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9vZmZTZXQgKz0gZHdTaXplOw0KKyAgcEdpZk1vZHVsZS0+SW5wdXQobV9wR2lmQ29udGV4dCwgbV9wU3JjQnVmLCBkd1NpemUgKyBkd0F2YWlsKTsNCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkdpZlJlY29yZEN1cnJlbnRQb3NpdGlvbkNhbGxiYWNrKA0KKyAgICB2b2lkKiBwTW9kdWxlLA0KKyAgICBGWF9EV09SRCYgY3VyX3Bvcykgew0KKyAgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciogcENvZGVjID0gKENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIqKXBNb2R1bGU7DQorICBGWF9EV09SRCByZW1haW5fc2l6ZSA9DQorICAgICAgcENvZGVjLT5tX3BDb2RlY01nci0+R2V0R2lmTW9kdWxlKCktPkdldEF2YWlsSW5wdXQocENvZGVjLT5tX3BHaWZDb250ZXh0KTsNCisgIGN1cl9wb3MgPSBwQ29kZWMtPm1fb2ZmU2V0IC0gcmVtYWluX3NpemU7DQorfQ0KK3VpbnQ4X3QqIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkdpZkFza0xvY2FsUGFsZXR0ZUJ1ZkNhbGxiYWNrKA0KKyAgICB2b2lkKiBwTW9kdWxlLA0KKyAgICBpbnQzMl90IGZyYW1lX251bSwNCisgICAgaW50MzJfdCBwYWxfc2l6ZSkgew0KKyAgcmV0dXJuIEZYX0FsbG9jKHVpbnQ4X3QsIHBhbF9zaXplKTsNCit9DQorRlhfQk9PTCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpHaWZJbnB1dFJlY29yZFBvc2l0aW9uQnVmQ2FsbGJhY2soDQorICAgIHZvaWQqIHBNb2R1bGUsDQorICAgIEZYX0RXT1JEIHJjZF9wb3MsDQorICAgIGNvbnN0IEZYX1JFQ1QmIGltZ19yYywNCisgICAgaW50MzJfdCBwYWxfbnVtLA0KKyAgICB2b2lkKiBwYWxfcHRyLA0KKyAgICBpbnQzMl90IGRlbGF5X3RpbWUsDQorICAgIEZYX0JPT0wgdXNlcl9pbnB1dCwNCisgICAgaW50MzJfdCB0cmFuc19pbmRleCwNCisgICAgaW50MzJfdCBkaXNwb3NhbF9tZXRob2QsDQorICAgIEZYX0JPT0wgaW50ZXJsYWNlKSB7DQorICBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKiBwQ29kZWMgPSAoQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciopcE1vZHVsZTsNCisgIHBDb2RlYy0+bV9vZmZTZXQgPSByY2RfcG9zOw0KKyAgRlhDT0RFQ19TVEFUVVMgZXJyb3Jfc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7DQorICBpZiAoIXBDb2RlYy0+R2lmUmVhZE1vcmVEYXRhKHBDb2RlYy0+bV9wQ29kZWNNZ3ItPkdldEdpZk1vZHVsZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9zdGF0dXMpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHVpbnQ4X3QqIHBQYWxldHRlID0gTlVMTDsNCisgIGlmIChwYWxfbnVtICE9IDAgJiYgcGFsX3B0cikgew0KKyAgICBwUGFsZXR0ZSA9ICh1aW50OF90KilwYWxfcHRyOw0KKyAgfSBlbHNlIHsNCisgICAgcGFsX251bSA9IHBDb2RlYy0+bV9HaWZQbHROdW1iZXI7DQorICAgIHBQYWxldHRlID0gcENvZGVjLT5tX3BHaWZQYWxldHRlOw0KKyAgfQ0KKyAgaWYgKHBDb2RlYy0+bV9wU3JjUGFsZXR0ZSA9PSBOVUxMKSB7DQorICAgIHBDb2RlYy0+bV9wU3JjUGFsZXR0ZSA9IEZYX0FsbG9jKEZYX0FSR0IsIHBhbF9udW0pOw0KKyAgfSBlbHNlIGlmIChwYWxfbnVtID4gcENvZGVjLT5tX1NyY1BhbGV0dGVOdW1iZXIpIHsNCisgICAgcENvZGVjLT5tX3BTcmNQYWxldHRlID0gRlhfUmVhbGxvYyhGWF9BUkdCLCBwQ29kZWMtPm1fcFNyY1BhbGV0dGUsIHBhbF9udW0pOw0KKyAgfQ0KKyAgaWYgKHBDb2RlYy0+bV9wU3JjUGFsZXR0ZSA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHBDb2RlYy0+bV9TcmNQYWxldHRlTnVtYmVyID0gcGFsX251bTsNCisgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsX251bTsgaSsrKSB7DQorICAgIEZYX0RXT1JEIGogPSBpICogMzsNCisgICAgcENvZGVjLT5tX3BTcmNQYWxldHRlW2ldID0NCisgICAgICAgIEFyZ2JFbmNvZGUoMHhmZiwgcFBhbGV0dGVbal0sIHBQYWxldHRlW2ogKyAxXSwgcFBhbGV0dGVbaiArIDJdKTsNCisgIH0NCisgIHBDb2RlYy0+bV9HaWZUcmFuc0luZGV4ID0gdHJhbnNfaW5kZXg7DQorICBwQ29kZWMtPm1fR2lmRnJhbWVSZWN0ID0gaW1nX3JjOw0KKyAgcENvZGVjLT5tX1NyY1Bhc3NOdW1iZXIgPSBpbnRlcmxhY2UgPyA0IDogMTsNCisgIGludDMyX3QgcGFsX2luZGV4ID0gcENvZGVjLT5tX0dpZkJnSW5kZXg7DQorICBDRlhfRElCaXRtYXAqIHBEZXZpY2UgPSBwQ29kZWMtPm1fcERldmljZUJpdG1hcDsNCisgIGlmICh0cmFuc19pbmRleCA+PSBwYWxfbnVtKSB7DQorICAgIHRyYW5zX2luZGV4ID0gLTE7DQorICB9DQorICBpZiAodHJhbnNfaW5kZXggIT0gLTEpIHsNCisgICAgcENvZGVjLT5tX3BTcmNQYWxldHRlW3RyYW5zX2luZGV4XSAmPSAweDAwZmZmZmZmOw0KKyAgICBpZiAocERldmljZS0+SGFzQWxwaGEoKSkgew0KKyAgICAgIHBhbF9pbmRleCA9IHRyYW5zX2luZGV4Ow0KKyAgICB9DQorICB9DQorICBpbnQgc3RhcnRYID0gcENvZGVjLT5tX3N0YXJ0WDsNCisgIGludCBzdGFydFkgPSBwQ29kZWMtPm1fc3RhcnRZOw0KKyAgaW50IHNpemVYID0gcENvZGVjLT5tX3NpemVYOw0KKyAgaW50IHNpemVZID0gcENvZGVjLT5tX3NpemVZOw0KKyAgaW50IEJwcCA9IHBEZXZpY2UtPkdldEJQUCgpIC8gODsNCisgIEZYX0FSR0IgYXJnYiA9IHBDb2RlYy0+bV9wU3JjUGFsZXR0ZVtwYWxfaW5kZXhdOw0KKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgc2l6ZVk7IHJvdysrKSB7DQorICAgIHVpbnQ4X3QqIHBTY2FubGluZSA9DQorICAgICAgICAodWludDhfdCopcERldmljZS0+R2V0U2NhbmxpbmUocm93ICsgc3RhcnRZKSArIHN0YXJ0WCAqIEJwcDsNCisgICAgc3dpdGNoIChwQ29kZWMtPm1fVHJhbnNNZXRob2QpIHsNCisgICAgICBjYXNlIDM6IHsNCisgICAgICAgIHVpbnQ4X3QgZ3JheSA9DQorICAgICAgICAgICAgRlhSR0IyR1JBWShGWEFSR0JfUihhcmdiKSwgRlhBUkdCX0coYXJnYiksIEZYQVJHQl9CKGFyZ2IpKTsNCisgICAgICAgIEZYU1lTX21lbXNldChwU2NhbmxpbmUsIGdyYXksIHNpemVYKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIDg6IHsNCisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHNpemVYOyBjb2wrKykgew0KKyAgICAgICAgICAqcFNjYW5saW5lKysgPSBGWEFSR0JfQihhcmdiKTsNCisgICAgICAgICAgKnBTY2FubGluZSsrID0gRlhBUkdCX0coYXJnYik7DQorICAgICAgICAgICpwU2NhbmxpbmUrKyA9IEZYQVJHQl9SKGFyZ2IpOw0KKyAgICAgICAgICBwU2NhbmxpbmUgKz0gQnBwIC0gMzsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIDEyOiB7DQorICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBzaXplWDsgY29sKyspIHsNCisgICAgICAgICAgRlhBUkdCX1NFVERJQihwU2NhbmxpbmUsIGFyZ2IpOw0KKyAgICAgICAgICBwU2NhbmxpbmUgKz0gNDsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6R2lmUmVhZFNjYW5saW5lQ2FsbGJhY2sodm9pZCogcE1vZHVsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm93X251bSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHJvd19idWYpIHsNCisgIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIqIHBDb2RlYyA9IChDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKilwTW9kdWxlOw0KKyAgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAgPSBwQ29kZWMtPm1fcERldmljZUJpdG1hcDsNCisgIEFTU0VSVChwRElCaXRtYXAgIT0gTlVMTCk7DQorICBpbnQzMl90IGltZ193aWR0aCA9IHBDb2RlYy0+bV9HaWZGcmFtZVJlY3QuV2lkdGgoKTsNCisgIGlmICghcERJQml0bWFwLT5IYXNBbHBoYSgpKSB7DQorICAgIHVpbnQ4X3QqIGJ5dGVfcHRyID0gcm93X2J1ZjsNCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbWdfd2lkdGg7IGkrKykgew0KKyAgICAgIGlmICgqYnl0ZV9wdHIgPT0gcENvZGVjLT5tX0dpZlRyYW5zSW5kZXgpIHsNCisgICAgICAgICpieXRlX3B0ciA9IHBDb2RlYy0+bV9HaWZCZ0luZGV4Ow0KKyAgICAgIH0NCisgICAgICBieXRlX3B0cisrOw0KKyAgICB9DQorICB9DQorICBpbnQzMl90IHBhbF9pbmRleCA9IHBDb2RlYy0+bV9HaWZCZ0luZGV4Ow0KKyAgaWYgKHBDb2RlYy0+bV9HaWZUcmFuc0luZGV4ICE9IC0xICYmIHBDb2RlYy0+bV9wRGV2aWNlQml0bWFwLT5IYXNBbHBoYSgpKSB7DQorICAgIHBhbF9pbmRleCA9IHBDb2RlYy0+bV9HaWZUcmFuc0luZGV4Ow0KKyAgfQ0KKyAgRlhTWVNfbWVtc2V0KHBDb2RlYy0+bV9wRGVjb2RlQnVmLCBwYWxfaW5kZXgsIHBDb2RlYy0+bV9TcmNXaWR0aCk7DQorICBGWF9CT09MIGJMYXN0UGFzcyA9IChyb3dfbnVtICUgMikgPT0gMTsNCisgIGludDMyX3QgbGluZSA9IHJvd19udW0gKyBwQ29kZWMtPm1fR2lmRnJhbWVSZWN0LnRvcDsNCisgIGludDMyX3QgbGVmdCA9IHBDb2RlYy0+bV9HaWZGcmFtZVJlY3QubGVmdDsNCisgIEZYU1lTX21lbWNweShwQ29kZWMtPm1fcERlY29kZUJ1ZiArIGxlZnQsIHJvd19idWYsIGltZ193aWR0aCk7DQorICBpbnQgc3JjX3RvcCA9IHBDb2RlYy0+bV9jbGlwQm94LnRvcDsNCisgIGludCBzcmNfYm90dG9tID0gcENvZGVjLT5tX2NsaXBCb3guYm90dG9tOw0KKyAgaW50IGRlc190b3AgPSBwQ29kZWMtPm1fc3RhcnRZOw0KKyAgaW50IHNyY19oZWkgPSBwQ29kZWMtPm1fY2xpcEJveC5IZWlnaHQoKTsNCisgIGludCBkZXNfaGVpID0gcENvZGVjLT5tX3NpemVZOw0KKyAgaWYgKGxpbmUgPj0gc3JjX3RvcCAmJiBsaW5lIDwgc3JjX2JvdHRvbSkgew0KKyAgICBkb3VibGUgc2NhbGVfeSA9IChkb3VibGUpZGVzX2hlaSAvIChkb3VibGUpc3JjX2hlaTsNCisgICAgaW50IHNyY19yb3cgPSBsaW5lIC0gc3JjX3RvcDsNCisgICAgaW50IGRlc19yb3cgPSAoaW50KShzcmNfcm93ICogc2NhbGVfeSkgKyBkZXNfdG9wOw0KKyAgICBpZiAoZGVzX3JvdyA+PSBkZXNfdG9wICsgZGVzX2hlaSkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBwQ29kZWMtPlJlU2FtcGxlU2NhbmxpbmUocERJQml0bWFwLCBkZXNfcm93LCBwQ29kZWMtPm1fcERlY29kZUJ1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2RlYy0+bV9TcmNGb3JtYXQpOw0KKyAgICBpZiAoc2NhbGVfeSA+IDEuMCAmJg0KKyAgICAgICAgKCFwQ29kZWMtPm1fYkludGVycG9sIHx8IHBDb2RlYy0+bV9TcmNQYXNzTnVtYmVyID09IDEpKSB7DQorICAgICAgcENvZGVjLT5SZXNhbXBsZVZlcnQocERJQml0bWFwLCBzY2FsZV95LCBkZXNfcm93KTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKHNjYWxlX3kgPiAxLjApIHsNCisgICAgICBpbnQgZGVzX2JvdHRvbSA9IGRlc190b3AgKyBwQ29kZWMtPm1fc2l6ZVk7DQorICAgICAgaW50IGRlc19CcHAgPSBwRElCaXRtYXAtPkdldEJQUCgpID4+IDM7DQorICAgICAgRlhfRFdPUkQgZGVzX1NjYW5PZmZldCA9IHBDb2RlYy0+bV9zdGFydFggKiBkZXNfQnBwOw0KKyAgICAgIGlmIChkZXNfcm93ICsgKGludClzY2FsZV95ID49IGRlc19ib3R0b20gLSAxKSB7DQorICAgICAgICB1aW50OF90KiBzY2FuX3NyYyA9DQorICAgICAgICAgICAgKHVpbnQ4X3QqKXBESUJpdG1hcC0+R2V0U2NhbmxpbmUoZGVzX3JvdykgKyBkZXNfU2Nhbk9mZmV0Ow0KKyAgICAgICAgaW50IGN1cl9yb3cgPSBkZXNfcm93Ow0KKyAgICAgICAgd2hpbGUgKCsrY3VyX3JvdyA8IGRlc19ib3R0b20pIHsNCisgICAgICAgICAgdWludDhfdCogc2Nhbl9kZXMgPQ0KKyAgICAgICAgICAgICAgKHVpbnQ4X3QqKXBESUJpdG1hcC0+R2V0U2NhbmxpbmUoY3VyX3JvdykgKyBkZXNfU2Nhbk9mZmV0Ow0KKyAgICAgICAgICBGWF9EV09SRCBzaXplID0gcENvZGVjLT5tX3NpemVYICogZGVzX0JwcDsNCisgICAgICAgICAgRlhTWVNfbWVtY3B5KHNjYW5fZGVzLCBzY2FuX3NyYywgc2l6ZSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmIChiTGFzdFBhc3MpIHsNCisgICAgICAgIHBDb2RlYy0+R2lmRG91YmxlTGluZVJlc2FtcGxlVmVydChwRElCaXRtYXAsIHNjYWxlX3ksIGRlc19yb3cpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkdpZkRvdWJsZUxpbmVSZXNhbXBsZVZlcnQoDQorICAgIENGWF9ESUJpdG1hcCogcERldmljZUJpdG1hcCwNCisgICAgZG91YmxlIHNjYWxlX3ksDQorICAgIGludCBkZXNfcm93KSB7DQorICBpbnQgZGVzX0JwcCA9IHBEZXZpY2VCaXRtYXAtPkdldEJQUCgpID4+IDM7DQorICBGWF9EV09SRCBkZXNfU2Nhbk9mZmV0ID0gbV9zdGFydFggKiBkZXNfQnBwOw0KKyAgaW50IGRlc190b3AgPSBtX3N0YXJ0WTsNCisgIGludCBkZXNfcm93XzEgPSBkZXNfcm93IC0gaW50KDIgKiBzY2FsZV95KTsNCisgIGlmIChkZXNfcm93XzEgPCBkZXNfdG9wKSB7DQorICAgIGRlc19yb3dfMSA9IGRlc190b3A7DQorICB9DQorICBmb3IgKDsgZGVzX3Jvd18xIDwgZGVzX3JvdzsgZGVzX3Jvd18xKyspIHsNCisgICAgdWludDhfdCogc2Nhbl9kZXMgPQ0KKyAgICAgICAgKHVpbnQ4X3QqKXBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKGRlc19yb3dfMSkgKyBkZXNfU2Nhbk9mZmV0Ow0KKyAgICBQaXhlbFdlaWdodCogcFdlaWdodCA9IG1fV2VpZ2h0VmVydC5HZXRQaXhlbFdlaWdodChkZXNfcm93XzEgLSBkZXNfdG9wKTsNCisgICAgY29uc3QgdWludDhfdCogc2Nhbl9zcmMxID0NCisgICAgICAgIHBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKHBXZWlnaHQtPm1fU3JjU3RhcnQgKyBkZXNfdG9wKSArDQorICAgICAgICBkZXNfU2Nhbk9mZmV0Ow0KKyAgICBjb25zdCB1aW50OF90KiBzY2FuX3NyYzIgPQ0KKyAgICAgICAgcERldmljZUJpdG1hcC0+R2V0U2NhbmxpbmUocFdlaWdodC0+bV9TcmNFbmQgKyBkZXNfdG9wKSArIGRlc19TY2FuT2ZmZXQ7DQorICAgIGZvciAoaW50IGRlc19jb2wgPSAwOyBkZXNfY29sIDwgbV9zaXplWDsgZGVzX2NvbCsrKSB7DQorICAgICAgc3dpdGNoIChwRGV2aWNlQml0bWFwLT5HZXRGb3JtYXQoKSkgew0KKyAgICAgICAgY2FzZSBGWERJQl9JbnZhbGlkOg0KKyAgICAgICAgY2FzZSBGWERJQl8xYnBwTWFzazoNCisgICAgICAgIGNhc2UgRlhESUJfMWJwcFJnYjoNCisgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgY2FzZSBGWERJQl84YnBwTWFzazoNCisgICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYjogew0KKyAgICAgICAgICBpZiAocERldmljZUJpdG1hcC0+R2V0UGFsZXR0ZSgpICE9IE5VTEwpIHsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgIH0NCisgICAgICAgICAgaW50IGRlc19nID0gMDsNCisgICAgICAgICAgZGVzX2cgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KKyAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KShkZXNfZyA+PiAxNik7DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWERJQl9SZ2I6DQorICAgICAgICBjYXNlIEZYRElCX1JnYjMyOiB7DQorICAgICAgICAgIEZYX0RXT1JEIGRlc19iID0gMCwgZGVzX2cgPSAwLCBkZXNfciA9IDA7DQorICAgICAgICAgIGRlc19iICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KKyAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCisgICAgICAgICAgZGVzX3IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgIHNjYW5fc3JjMSArPSBkZXNfQnBwIC0gMzsNCisgICAgICAgICAgZGVzX2IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQorICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KKyAgICAgICAgICBkZXNfciArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCisgICAgICAgICAgc2Nhbl9zcmMyICs9IGRlc19CcHAgLSAzOw0KKyAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX2IpID4+IDE2KTsNCisgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoKGRlc19nKSA+PiAxNik7DQorICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKChkZXNfcikgPj4gMTYpOw0KKyAgICAgICAgICBzY2FuX2RlcyArPSBkZXNfQnBwIC0gMzsNCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBjYXNlIEZYRElCX0FyZ2I6IHsNCisgICAgICAgICAgRlhfRFdPUkQgZGVzX2EgPSAwLCBkZXNfYiA9IDAsIGRlc19nID0gMCwgZGVzX3IgPSAwOw0KKyAgICAgICAgICBkZXNfYiArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCisgICAgICAgICAgZGVzX2cgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgIGRlc19yICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KKyAgICAgICAgICBkZXNfYSArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCisgICAgICAgICAgZGVzX2IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQorICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KKyAgICAgICAgICBkZXNfciArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCisgICAgICAgICAgZGVzX2EgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQorICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKChkZXNfYikgPj4gMTYpOw0KKyAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX2cpID4+IDE2KTsNCisgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoKGRlc19yKSA+PiAxNik7DQorICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKChkZXNfYSkgPj4gMTYpOw0KKyAgICAgICAgfSBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGludCBkZXNfYm90dG9tID0gZGVzX3RvcCArIG1fc2l6ZVkgLSAxOw0KKyAgaWYgKGRlc19yb3cgKyAoaW50KSgyICogc2NhbGVfeSkgPj0gZGVzX2JvdHRvbSAmJg0KKyAgICAgIGRlc19yb3cgKyAoaW50KXNjYWxlX3kgPCBkZXNfYm90dG9tKSB7DQorICAgIEdpZkRvdWJsZUxpbmVSZXNhbXBsZVZlcnQocERldmljZUJpdG1hcCwgc2NhbGVfeSwgZGVzX3JvdyArIChpbnQpc2NhbGVfeSk7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6Qm1wUmVhZE1vcmVEYXRhKElDb2RlY19CbXBNb2R1bGUqIHBCbXBNb2R1bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhDT0RFQ19TVEFUVVMmIGVycl9zdGF0dXMpIHsNCisgIEZYX0RXT1JEIGR3U2l6ZSA9IChGWF9EV09SRCltX3BGaWxlLT5HZXRTaXplKCk7DQorICBpZiAoZHdTaXplIDw9IG1fb2ZmU2V0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGR3U2l6ZSA9IGR3U2l6ZSAtIG1fb2ZmU2V0Ow0KKyAgRlhfRFdPUkQgZHdBdmFpbCA9IHBCbXBNb2R1bGUtPkdldEF2YWlsSW5wdXQobV9wQm1wQ29udGV4dCwgTlVMTCk7DQorICBpZiAoZHdBdmFpbCA9PSBtX1NyY1NpemUpIHsNCisgICAgaWYgKGR3U2l6ZSA+IEZYQ09ERUNfQkxPQ0tfU0laRSkgew0KKyAgICAgIGR3U2l6ZSA9IEZYQ09ERUNfQkxPQ0tfU0laRTsNCisgICAgfQ0KKyAgICBtX1NyY1NpemUgPSAoZHdTaXplICsgZHdBdmFpbCArIEZYQ09ERUNfQkxPQ0tfU0laRSAtIDEpIC8NCisgICAgICAgICAgICAgICAgRlhDT0RFQ19CTE9DS19TSVpFICogRlhDT0RFQ19CTE9DS19TSVpFOw0KKyAgICBtX3BTcmNCdWYgPSBGWF9SZWFsbG9jKHVpbnQ4X3QsIG1fcFNyY0J1ZiwgbV9TcmNTaXplKTsNCisgICAgaWYgKCFtX3BTcmNCdWYpIHsNCisgICAgICBlcnJfc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIEZYX0RXT1JEIGR3Q29uc3VtZSA9IG1fU3JjU2l6ZSAtIGR3QXZhaWw7DQorICAgIGlmIChkd0F2YWlsKSB7DQorICAgICAgRlhTWVNfbWVtY3B5KG1fcFNyY0J1ZiwgbV9wU3JjQnVmICsgZHdDb25zdW1lLCBkd0F2YWlsKTsNCisgICAgfQ0KKyAgICBpZiAoZHdTaXplID4gZHdDb25zdW1lKSB7DQorICAgICAgZHdTaXplID0gZHdDb25zdW1lOw0KKyAgICB9DQorICB9DQorICBpZiAoIW1fcEZpbGUtPlJlYWRCbG9jayhtX3BTcmNCdWYgKyBkd0F2YWlsLCBtX29mZlNldCwgZHdTaXplKSkgew0KKyAgICBlcnJfc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX1JFQUQ7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIG1fb2ZmU2V0ICs9IGR3U2l6ZTsNCisgIHBCbXBNb2R1bGUtPklucHV0KG1fcEJtcENvbnRleHQsIG1fcFNyY0J1ZiwgZHdTaXplICsgZHdBdmFpbCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpCbXBJbnB1dEltYWdlUG9zaXRpb25CdWZDYWxsYmFjaygNCisgICAgdm9pZCogcE1vZHVsZSwNCisgICAgRlhfRFdPUkQgcmNkX3Bvcykgew0KKyAgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciogcENvZGVjID0gKENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIqKXBNb2R1bGU7DQorICBwQ29kZWMtPm1fb2ZmU2V0ID0gcmNkX3BvczsNCisgIEZYQ09ERUNfU1RBVFVTIGVycm9yX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOw0KKyAgaWYgKCFwQ29kZWMtPkJtcFJlYWRNb3JlRGF0YShwQ29kZWMtPm1fcENvZGVjTWdyLT5HZXRCbXBNb2R1bGUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Jfc3RhdHVzKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpCbXBSZWFkU2NhbmxpbmVDYWxsYmFjayh2b2lkKiBwTW9kdWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByb3dfbnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcm93X2J1Zikgew0KKyAgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciogcENvZGVjID0gKENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIqKXBNb2R1bGU7DQorICBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCA9IHBDb2RlYy0+bV9wRGV2aWNlQml0bWFwOw0KKyAgQVNTRVJUKHBESUJpdG1hcCAhPSBOVUxMKTsNCisgIEZYU1lTX21lbWNweShwQ29kZWMtPm1fcERlY29kZUJ1Ziwgcm93X2J1ZiwgcENvZGVjLT5tX1NjYW5saW5lU2l6ZSk7DQorICBpbnQgc3JjX3RvcCA9IHBDb2RlYy0+bV9jbGlwQm94LnRvcDsNCisgIGludCBzcmNfYm90dG9tID0gcENvZGVjLT5tX2NsaXBCb3guYm90dG9tOw0KKyAgaW50IGRlc190b3AgPSBwQ29kZWMtPm1fc3RhcnRZOw0KKyAgaW50IHNyY19oZWkgPSBwQ29kZWMtPm1fY2xpcEJveC5IZWlnaHQoKTsNCisgIGludCBkZXNfaGVpID0gcENvZGVjLT5tX3NpemVZOw0KKyAgaWYgKHJvd19udW0gPj0gc3JjX3RvcCAmJiByb3dfbnVtIDwgc3JjX2JvdHRvbSkgew0KKyAgICBkb3VibGUgc2NhbGVfeSA9IChkb3VibGUpZGVzX2hlaSAvIChkb3VibGUpc3JjX2hlaTsNCisgICAgaW50IHNyY19yb3cgPSByb3dfbnVtIC0gc3JjX3RvcDsNCisgICAgaW50IGRlc19yb3cgPSAoaW50KShzcmNfcm93ICogc2NhbGVfeSkgKyBkZXNfdG9wOw0KKyAgICBpZiAoZGVzX3JvdyA+PSBkZXNfdG9wICsgZGVzX2hlaSkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBwQ29kZWMtPlJlU2FtcGxlU2NhbmxpbmUocERJQml0bWFwLCBkZXNfcm93LCBwQ29kZWMtPm1fcERlY29kZUJ1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2RlYy0+bV9TcmNGb3JtYXQpOw0KKyAgICBpZiAoc2NhbGVfeSA+IDEuMCkgew0KKyAgICAgIGlmIChwQ29kZWMtPm1fQm1wSXNUb3BCb3R0b20gfHwgIXBDb2RlYy0+bV9iSW50ZXJwb2wpIHsNCisgICAgICAgIHBDb2RlYy0+UmVzYW1wbGVWZXJ0KHBESUJpdG1hcCwgc2NhbGVfeSwgZGVzX3Jvdyk7DQorICAgICAgICByZXR1cm47DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHBDb2RlYy0+UmVzYW1wbGVWZXJ0QlQocERJQml0bWFwLCBzY2FsZV95LCBkZXNfcm93KTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpSZXNhbXBsZVZlcnRCVChDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgc2NhbGVfeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXNfcm93KSB7DQorICBpbnQgZGVzX0JwcCA9IHBEZXZpY2VCaXRtYXAtPkdldEJQUCgpID4+IDM7DQorICBGWF9EV09SRCBkZXNfU2Nhbk9mZmV0ID0gbV9zdGFydFggKiBkZXNfQnBwOw0KKyAgaW50IGRlc190b3AgPSBtX3N0YXJ0WTsNCisgIGludCBkZXNfYm90dG9tID0gbV9zdGFydFkgKyBtX3NpemVZOw0KKyAgaW50IGRlc19yb3dfMSA9IGRlc19yb3cgKyBpbnQoc2NhbGVfeSk7DQorICBpZiAoZGVzX3Jvd18xID49IGRlc19ib3R0b20gLSAxKSB7DQorICAgIHVpbnQ4X3QqIHNjYW5fc3JjID0NCisgICAgICAgICh1aW50OF90KilwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShkZXNfcm93KSArIGRlc19TY2FuT2ZmZXQ7DQorICAgIHdoaWxlICgrK2Rlc19yb3cgPCBkZXNfYm90dG9tKSB7DQorICAgICAgdWludDhfdCogc2Nhbl9kZXMgPQ0KKyAgICAgICAgICAodWludDhfdCopcERldmljZUJpdG1hcC0+R2V0U2NhbmxpbmUoZGVzX3JvdykgKyBkZXNfU2Nhbk9mZmV0Ow0KKyAgICAgIEZYX0RXT1JEIHNpemUgPSBtX3NpemVYICogZGVzX0JwcDsNCisgICAgICBGWFNZU19tZW1jcHkoc2Nhbl9kZXMsIHNjYW5fc3JjLCBzaXplKTsNCisgICAgfQ0KKyAgICByZXR1cm47DQorICB9DQorICBmb3IgKDsgZGVzX3Jvd18xID4gZGVzX3JvdzsgZGVzX3Jvd18xLS0pIHsNCisgICAgdWludDhfdCogc2Nhbl9kZXMgPQ0KKyAgICAgICAgKHVpbnQ4X3QqKXBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKGRlc19yb3dfMSkgKyBkZXNfU2Nhbk9mZmV0Ow0KKyAgICBQaXhlbFdlaWdodCogcFdlaWdodCA9IG1fV2VpZ2h0VmVydC5HZXRQaXhlbFdlaWdodChkZXNfcm93XzEgLSBkZXNfdG9wKTsNCisgICAgY29uc3QgdWludDhfdCogc2Nhbl9zcmMxID0NCisgICAgICAgIHBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKHBXZWlnaHQtPm1fU3JjU3RhcnQgKyBkZXNfdG9wKSArDQorICAgICAgICBkZXNfU2Nhbk9mZmV0Ow0KKyAgICBjb25zdCB1aW50OF90KiBzY2FuX3NyYzIgPQ0KKyAgICAgICAgcERldmljZUJpdG1hcC0+R2V0U2NhbmxpbmUocFdlaWdodC0+bV9TcmNFbmQgKyBkZXNfdG9wKSArIGRlc19TY2FuT2ZmZXQ7DQorICAgIGZvciAoaW50IGRlc19jb2wgPSAwOyBkZXNfY29sIDwgbV9zaXplWDsgZGVzX2NvbCsrKSB7DQorICAgICAgc3dpdGNoIChwRGV2aWNlQml0bWFwLT5HZXRGb3JtYXQoKSkgew0KKyAgICAgICAgY2FzZSBGWERJQl9JbnZhbGlkOg0KKyAgICAgICAgY2FzZSBGWERJQl8xYnBwTWFzazoNCisgICAgICAgIGNhc2UgRlhESUJfMWJwcFJnYjoNCisgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgY2FzZSBGWERJQl84YnBwTWFzazoNCisgICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYjogew0KKyAgICAgICAgICBpZiAocERldmljZUJpdG1hcC0+R2V0UGFsZXR0ZSgpICE9IE5VTEwpIHsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgIH0NCisgICAgICAgICAgaW50IGRlc19nID0gMDsNCisgICAgICAgICAgZGVzX2cgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KKyAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KShkZXNfZyA+PiAxNik7DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWERJQl9SZ2I6DQorICAgICAgICBjYXNlIEZYRElCX1JnYjMyOiB7DQorICAgICAgICAgIEZYX0RXT1JEIGRlc19iID0gMCwgZGVzX2cgPSAwLCBkZXNfciA9IDA7DQorICAgICAgICAgIGRlc19iICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KKyAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCisgICAgICAgICAgZGVzX3IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgIHNjYW5fc3JjMSArPSBkZXNfQnBwIC0gMzsNCisgICAgICAgICAgZGVzX2IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQorICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KKyAgICAgICAgICBkZXNfciArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCisgICAgICAgICAgc2Nhbl9zcmMyICs9IGRlc19CcHAgLSAzOw0KKyAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX2IpID4+IDE2KTsNCisgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoKGRlc19nKSA+PiAxNik7DQorICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKChkZXNfcikgPj4gMTYpOw0KKyAgICAgICAgICBzY2FuX2RlcyArPSBkZXNfQnBwIC0gMzsNCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBjYXNlIEZYRElCX0FyZ2I6IHsNCisgICAgICAgICAgRlhfRFdPUkQgZGVzX2EgPSAwLCBkZXNfYiA9IDAsIGRlc19nID0gMCwgZGVzX3IgPSAwOw0KKyAgICAgICAgICBkZXNfYiArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCisgICAgICAgICAgZGVzX2cgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgIGRlc19yICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOw0KKyAgICAgICAgICBkZXNfYSArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCisgICAgICAgICAgZGVzX2IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQorICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOw0KKyAgICAgICAgICBkZXNfciArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCisgICAgICAgICAgZGVzX2EgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQorICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKChkZXNfYikgPj4gMTYpOw0KKyAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX2cpID4+IDE2KTsNCisgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoKGRlc19yKSA+PiAxNik7DQorICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKChkZXNfYSkgPj4gMTYpOw0KKyAgICAgICAgfSBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgIH0NCisgIH0NCit9DQorRlhfQk9PTCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpEZXRlY3RJbWFnZVR5cGUoDQorICAgIEZYQ09ERUNfSU1BR0VfVFlQRSBpbWFnZVR5cGUsDQorICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpIHsNCisgIG1fb2ZmU2V0ID0gMDsNCisgIEZYX0RXT1JEIHNpemUgPSAoRlhfRFdPUkQpbV9wRmlsZS0+R2V0U2l6ZSgpOw0KKyAgaWYgKHNpemUgPiBGWENPREVDX0JMT0NLX1NJWkUpIHsNCisgICAgc2l6ZSA9IEZYQ09ERUNfQkxPQ0tfU0laRTsNCisgIH0NCisgIGlmIChtX3BTcmNCdWYgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKG1fcFNyY0J1Zik7DQorICAgIG1fcFNyY0J1ZiA9IE5VTEw7DQorICB9DQorICBtX3BTcmNCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsNCisgIGlmIChtX3BTcmNCdWYgPT0gTlVMTCkgew0KKyAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZYU1lTX21lbXNldChtX3BTcmNCdWYsIDAsIHNpemUpOw0KKyAgbV9TcmNTaXplID0gc2l6ZTsNCisgIHN3aXRjaCAoaW1hZ2VUeXBlKSB7DQorICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9CTVA6IHsNCisgICAgICBJQ29kZWNfQm1wTW9kdWxlKiBwQm1wTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldEJtcE1vZHVsZSgpOw0KKyAgICAgIGlmIChwQm1wTW9kdWxlID09IE5VTEwpIHsNCisgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgcEJtcE1vZHVsZS0+SW5wdXRJbWFnZVBvc2l0aW9uQnVmQ2FsbGJhY2sgPQ0KKyAgICAgICAgICBCbXBJbnB1dEltYWdlUG9zaXRpb25CdWZDYWxsYmFjazsNCisgICAgICBwQm1wTW9kdWxlLT5SZWFkU2NhbmxpbmVDYWxsYmFjayA9IEJtcFJlYWRTY2FubGluZUNhbGxiYWNrOw0KKyAgICAgIG1fcEJtcENvbnRleHQgPSBwQm1wTW9kdWxlLT5TdGFydCgodm9pZCopdGhpcyk7DQorICAgICAgaWYgKG1fcEJtcENvbnRleHQgPT0gTlVMTCkgew0KKyAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBGWF9CT09MIGJSZXN1bHQgPSBtX3BGaWxlLT5SZWFkQmxvY2sobV9wU3JjQnVmLCAwLCBzaXplKTsNCisgICAgICBpZiAoIWJSZXN1bHQpIHsNCisgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX1JFQUQ7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIG1fb2ZmU2V0ICs9IHNpemU7DQorICAgICAgcEJtcE1vZHVsZS0+SW5wdXQobV9wQm1wQ29udGV4dCwgbV9wU3JjQnVmLCBzaXplKTsNCisgICAgICBGWF9EV09SRCogcFBhbGV0dGUgPSBOVUxMOw0KKyAgICAgIGludDMyX3QgcmVhZFJlc3VsdCA9IHBCbXBNb2R1bGUtPlJlYWRIZWFkZXIoDQorICAgICAgICAgIG1fcEJtcENvbnRleHQsICZtX1NyY1dpZHRoLCAmbV9TcmNIZWlnaHQsICZtX0JtcElzVG9wQm90dG9tLA0KKyAgICAgICAgICAmbV9TcmNDb21wb25lbnRzLCAmbV9TcmNQYWxldHRlTnVtYmVyLCAmcFBhbGV0dGUsIHBBdHRyaWJ1dGUpOw0KKyAgICAgIHdoaWxlIChyZWFkUmVzdWx0ID09IDIpIHsNCisgICAgICAgIEZYQ09ERUNfU1RBVFVTIGVycm9yX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7DQorICAgICAgICBpZiAoIUJtcFJlYWRNb3JlRGF0YShwQm1wTW9kdWxlLCBlcnJvcl9zdGF0dXMpKSB7DQorICAgICAgICAgIG1fc3RhdHVzID0gZXJyb3Jfc3RhdHVzOw0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICByZWFkUmVzdWx0ID0gcEJtcE1vZHVsZS0+UmVhZEhlYWRlcigNCisgICAgICAgICAgICBtX3BCbXBDb250ZXh0LCAmbV9TcmNXaWR0aCwgJm1fU3JjSGVpZ2h0LCAmbV9CbXBJc1RvcEJvdHRvbSwNCisgICAgICAgICAgICAmbV9TcmNDb21wb25lbnRzLCAmbV9TcmNQYWxldHRlTnVtYmVyLCAmcFBhbGV0dGUsIHBBdHRyaWJ1dGUpOw0KKyAgICAgIH0NCisgICAgICBpZiAocmVhZFJlc3VsdCA9PSAxKSB7DQorICAgICAgICBtX1NyY0JQQyA9IDg7DQorICAgICAgICBtX2NsaXBCb3ggPSBGWF9SRUNUKDAsIDAsIG1fU3JjV2lkdGgsIG1fU3JjSGVpZ2h0KTsNCisgICAgICAgIGlmIChtX3BTcmNQYWxldHRlICE9IE5VTEwpIHsNCisgICAgICAgICAgRlhfRnJlZShtX3BTcmNQYWxldHRlKTsNCisgICAgICAgICAgbV9wU3JjUGFsZXR0ZSA9IE5VTEw7DQorICAgICAgICB9DQorICAgICAgICBpZiAobV9TcmNQYWxldHRlTnVtYmVyKSB7DQorICAgICAgICAgIG1fcFNyY1BhbGV0dGUgPSBGWF9BbGxvYyhGWF9BUkdCLCBtX1NyY1BhbGV0dGVOdW1iZXIpOw0KKyAgICAgICAgICBpZiAobV9wU3JjUGFsZXR0ZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBGWFNZU19tZW1jcHkobV9wU3JjUGFsZXR0ZSwgcFBhbGV0dGUsDQorICAgICAgICAgICAgICAgICAgICAgICBtX1NyY1BhbGV0dGVOdW1iZXIgKiBzaXplb2YoRlhfRFdPUkQpKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgICBpZiAobV9wQm1wQ29udGV4dCAhPSBOVUxMKSB7DQorICAgICAgICBwQm1wTW9kdWxlLT5GaW5pc2gobV9wQm1wQ29udGV4dCk7DQorICAgICAgICBtX3BCbXBDb250ZXh0ID0gTlVMTDsNCisgICAgICB9DQorICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfRk9STUFUOw0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGWENPREVDX0lNQUdFX0pQRzogew0KKyAgICAgIElDb2RlY19KcGVnTW9kdWxlKiBwSnBlZ01vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRKcGVnTW9kdWxlKCk7DQorICAgICAgaWYgKHBKcGVnTW9kdWxlID09IE5VTEwpIHsNCisgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgbV9wSnBlZ0NvbnRleHQgPSBwSnBlZ01vZHVsZS0+U3RhcnQoKTsNCisgICAgICBpZiAobV9wSnBlZ0NvbnRleHQgPT0gTlVMTCkgew0KKyAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBGWF9CT09MIGJSZXN1bHQgPSBtX3BGaWxlLT5SZWFkQmxvY2sobV9wU3JjQnVmLCAwLCBzaXplKTsNCisgICAgICBpZiAoIWJSZXN1bHQpIHsNCisgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX1JFQUQ7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIG1fb2ZmU2V0ICs9IHNpemU7DQorICAgICAgcEpwZWdNb2R1bGUtPklucHV0KG1fcEpwZWdDb250ZXh0LCBtX3BTcmNCdWYsIHNpemUpOw0KKyAgICAgIGludDMyX3QgcmVhZFJlc3VsdCA9DQorICAgICAgICAgIHBKcGVnTW9kdWxlLT5SZWFkSGVhZGVyKG1fcEpwZWdDb250ZXh0LCAmbV9TcmNXaWR0aCwgJm1fU3JjSGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9TcmNDb21wb25lbnRzLCBwQXR0cmlidXRlKTsNCisgICAgICB3aGlsZSAocmVhZFJlc3VsdCA9PSAyKSB7DQorICAgICAgICBGWENPREVDX1NUQVRVUyBlcnJvcl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfRk9STUFUOw0KKyAgICAgICAgaWYgKCFKcGVnUmVhZE1vcmVEYXRhKHBKcGVnTW9kdWxlLCBlcnJvcl9zdGF0dXMpKSB7DQorICAgICAgICAgIG1fc3RhdHVzID0gZXJyb3Jfc3RhdHVzOw0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICByZWFkUmVzdWx0ID0NCisgICAgICAgICAgICBwSnBlZ01vZHVsZS0+UmVhZEhlYWRlcihtX3BKcGVnQ29udGV4dCwgJm1fU3JjV2lkdGgsICZtX1NyY0hlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9TcmNDb21wb25lbnRzLCBwQXR0cmlidXRlKTsNCisgICAgICB9DQorICAgICAgaWYgKCFyZWFkUmVzdWx0KSB7DQorICAgICAgICBtX1NyY0JQQyA9IDg7DQorICAgICAgICBtX2NsaXBCb3ggPSBGWF9SRUNUKDAsIDAsIG1fU3JjV2lkdGgsIG1fU3JjSGVpZ2h0KTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgICBpZiAobV9wSnBlZ0NvbnRleHQgIT0gTlVMTCkgew0KKyAgICAgICAgcEpwZWdNb2R1bGUtPkZpbmlzaChtX3BKcGVnQ29udGV4dCk7DQorICAgICAgICBtX3BKcGVnQ29udGV4dCA9IE5VTEw7DQorICAgICAgfQ0KKyAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX0ZPUk1BVDsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9QTkc6IHsNCisgICAgICBJQ29kZWNfUG5nTW9kdWxlKiBwUG5nTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldFBuZ01vZHVsZSgpOw0KKyAgICAgIGlmIChwUG5nTW9kdWxlID09IE5VTEwpIHsNCisgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgcFBuZ01vZHVsZS0+UmVhZEhlYWRlckNhbGxiYWNrID0NCisgICAgICAgICAgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6UG5nUmVhZEhlYWRlckZ1bmM7DQorICAgICAgcFBuZ01vZHVsZS0+QXNrU2NhbmxpbmVCdWZDYWxsYmFjayA9DQorICAgICAgICAgIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OlBuZ0Fza1NjYW5saW5lQnVmRnVuYzsNCisgICAgICBwUG5nTW9kdWxlLT5GaWxsU2NhbmxpbmVCdWZDb21wbGV0ZWRDYWxsYmFjayA9DQorICAgICAgICAgIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OlBuZ0ZpbGxTY2FubGluZUJ1ZkNvbXBsZXRlZEZ1bmM7DQorICAgICAgbV9wUG5nQ29udGV4dCA9IHBQbmdNb2R1bGUtPlN0YXJ0KCh2b2lkKil0aGlzKTsNCisgICAgICBpZiAobV9wUG5nQ29udGV4dCA9PSBOVUxMKSB7DQorICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIEZYX0JPT0wgYlJlc3VsdCA9IG1fcEZpbGUtPlJlYWRCbG9jayhtX3BTcmNCdWYsIDAsIHNpemUpOw0KKyAgICAgIGlmICghYlJlc3VsdCkgew0KKyAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfUkVBRDsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgbV9vZmZTZXQgKz0gc2l6ZTsNCisgICAgICBiUmVzdWx0ID0gcFBuZ01vZHVsZS0+SW5wdXQobV9wUG5nQ29udGV4dCwgbV9wU3JjQnVmLCBzaXplLCBwQXR0cmlidXRlKTsNCisgICAgICB3aGlsZSAoYlJlc3VsdCkgew0KKyAgICAgICAgRlhfRFdPUkQgcmVtYWluX3NpemUgPSAoRlhfRFdPUkQpbV9wRmlsZS0+R2V0U2l6ZSgpIC0gbV9vZmZTZXQ7DQorICAgICAgICBGWF9EV09SRCBpbnB1dF9zaXplID0NCisgICAgICAgICAgICByZW1haW5fc2l6ZSA+IEZYQ09ERUNfQkxPQ0tfU0laRSA/IEZYQ09ERUNfQkxPQ0tfU0laRSA6IHJlbWFpbl9zaXplOw0KKyAgICAgICAgaWYgKGlucHV0X3NpemUgPT0gMCkgew0KKyAgICAgICAgICBpZiAobV9wUG5nQ29udGV4dCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgcFBuZ01vZHVsZS0+RmluaXNoKG1fcFBuZ0NvbnRleHQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIG1fcFBuZ0NvbnRleHQgPSBOVUxMOw0KKyAgICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChtX3BTcmNCdWYgIT0gTlVMTCAmJiBpbnB1dF9zaXplID4gbV9TcmNTaXplKSB7DQorICAgICAgICAgIEZYX0ZyZWUobV9wU3JjQnVmKTsNCisgICAgICAgICAgbV9wU3JjQnVmID0gRlhfQWxsb2ModWludDhfdCwgaW5wdXRfc2l6ZSk7DQorICAgICAgICAgIGlmIChtX3BTcmNCdWYgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgRlhTWVNfbWVtc2V0KG1fcFNyY0J1ZiwgMCwgaW5wdXRfc2l6ZSk7DQorICAgICAgICAgIG1fU3JjU2l6ZSA9IGlucHV0X3NpemU7DQorICAgICAgICB9DQorICAgICAgICBiUmVzdWx0ID0gbV9wRmlsZS0+UmVhZEJsb2NrKG1fcFNyY0J1ZiwgbV9vZmZTZXQsIGlucHV0X3NpemUpOw0KKyAgICAgICAgaWYgKCFiUmVzdWx0KSB7DQorICAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX1JFQUQ7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIG1fb2ZmU2V0ICs9IGlucHV0X3NpemU7DQorICAgICAgICBiUmVzdWx0ID0NCisgICAgICAgICAgICBwUG5nTW9kdWxlLT5JbnB1dChtX3BQbmdDb250ZXh0LCBtX3BTcmNCdWYsIGlucHV0X3NpemUsIHBBdHRyaWJ1dGUpOw0KKyAgICAgIH0NCisgICAgICBBU1NFUlQoIWJSZXN1bHQpOw0KKyAgICAgIGlmIChtX3BQbmdDb250ZXh0ICE9IE5VTEwpIHsNCisgICAgICAgIHBQbmdNb2R1bGUtPkZpbmlzaChtX3BQbmdDb250ZXh0KTsNCisgICAgICAgIG1fcFBuZ0NvbnRleHQgPSBOVUxMOw0KKyAgICAgIH0NCisgICAgICBpZiAobV9TcmNQYXNzTnVtYmVyID09IDApIHsNCisgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX0ZPUk1BVDsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9HSUY6IHsNCisgICAgICBJQ29kZWNfR2lmTW9kdWxlKiBwR2lmTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldEdpZk1vZHVsZSgpOw0KKyAgICAgIGlmIChwR2lmTW9kdWxlID09IE5VTEwpIHsNCisgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgcEdpZk1vZHVsZS0+UmVjb3JkQ3VycmVudFBvc2l0aW9uQ2FsbGJhY2sgPQ0KKyAgICAgICAgICBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpHaWZSZWNvcmRDdXJyZW50UG9zaXRpb25DYWxsYmFjazsNCisgICAgICBwR2lmTW9kdWxlLT5Bc2tMb2NhbFBhbGV0dGVCdWZDYWxsYmFjayA9DQorICAgICAgICAgIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkdpZkFza0xvY2FsUGFsZXR0ZUJ1ZkNhbGxiYWNrOw0KKyAgICAgIHBHaWZNb2R1bGUtPklucHV0UmVjb3JkUG9zaXRpb25CdWZDYWxsYmFjayA9DQorICAgICAgICAgIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkdpZklucHV0UmVjb3JkUG9zaXRpb25CdWZDYWxsYmFjazsNCisgICAgICBwR2lmTW9kdWxlLT5SZWFkU2NhbmxpbmVDYWxsYmFjayA9DQorICAgICAgICAgIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkdpZlJlYWRTY2FubGluZUNhbGxiYWNrOw0KKyAgICAgIG1fcEdpZkNvbnRleHQgPSBwR2lmTW9kdWxlLT5TdGFydCgodm9pZCopdGhpcyk7DQorICAgICAgaWYgKG1fcEdpZkNvbnRleHQgPT0gTlVMTCkgew0KKyAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBGWF9CT09MIGJSZXN1bHQgPSBtX3BGaWxlLT5SZWFkQmxvY2sobV9wU3JjQnVmLCAwLCBzaXplKTsNCisgICAgICBpZiAoIWJSZXN1bHQpIHsNCisgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX1JFQUQ7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIG1fb2ZmU2V0ICs9IHNpemU7DQorICAgICAgcEdpZk1vZHVsZS0+SW5wdXQobV9wR2lmQ29udGV4dCwgbV9wU3JjQnVmLCBzaXplKTsNCisgICAgICBtX1NyY0NvbXBvbmVudHMgPSAxOw0KKyAgICAgIGludDMyX3QgcmVhZFJlc3VsdCA9IHBHaWZNb2R1bGUtPlJlYWRIZWFkZXIoDQorICAgICAgICAgIG1fcEdpZkNvbnRleHQsICZtX1NyY1dpZHRoLCAmbV9TcmNIZWlnaHQsICZtX0dpZlBsdE51bWJlciwNCisgICAgICAgICAgKHZvaWQqKikmbV9wR2lmUGFsZXR0ZSwgJm1fR2lmQmdJbmRleCwgbnVsbHB0cik7DQorICAgICAgd2hpbGUgKHJlYWRSZXN1bHQgPT0gMikgew0KKyAgICAgICAgRlhDT0RFQ19TVEFUVVMgZXJyb3Jfc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX0ZPUk1BVDsNCisgICAgICAgIGlmICghR2lmUmVhZE1vcmVEYXRhKHBHaWZNb2R1bGUsIGVycm9yX3N0YXR1cykpIHsNCisgICAgICAgICAgbV9zdGF0dXMgPSBlcnJvcl9zdGF0dXM7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIHJlYWRSZXN1bHQgPSBwR2lmTW9kdWxlLT5SZWFkSGVhZGVyKA0KKyAgICAgICAgICAgIG1fcEdpZkNvbnRleHQsICZtX1NyY1dpZHRoLCAmbV9TcmNIZWlnaHQsICZtX0dpZlBsdE51bWJlciwNCisgICAgICAgICAgICAodm9pZCoqKSZtX3BHaWZQYWxldHRlLCAmbV9HaWZCZ0luZGV4LCBudWxscHRyKTsNCisgICAgICB9DQorICAgICAgaWYgKHJlYWRSZXN1bHQgPT0gMSkgew0KKyAgICAgICAgbV9TcmNCUEMgPSA4Ow0KKyAgICAgICAgbV9jbGlwQm94ID0gRlhfUkVDVCgwLCAwLCBtX1NyY1dpZHRoLCBtX1NyY0hlaWdodCk7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQorICAgICAgaWYgKG1fcEdpZkNvbnRleHQgIT0gTlVMTCkgew0KKyAgICAgICAgcEdpZk1vZHVsZS0+RmluaXNoKG1fcEdpZkNvbnRleHQpOw0KKyAgICAgICAgbV9wR2lmQ29udGV4dCA9IE5VTEw7DQorICAgICAgfQ0KKyAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX0ZPUk1BVDsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9USUY6IHsNCisgICAgICBJQ29kZWNfVGlmZk1vZHVsZSogcFRpZmZNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0VGlmZk1vZHVsZSgpOw0KKyAgICAgIGlmIChwVGlmZk1vZHVsZSA9PSBOVUxMKSB7DQorICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIG1fcFRpZmZDb250ZXh0ID0gcFRpZmZNb2R1bGUtPkNyZWF0ZURlY29kZXIobV9wRmlsZSk7DQorICAgICAgaWYgKG1fcFRpZmZDb250ZXh0ID09IE5VTEwpIHsNCisgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX0ZPUk1BVDsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgaW50MzJfdCBmcmFtZXMgPSAwOw0KKyAgICAgIHBUaWZmTW9kdWxlLT5HZXRGcmFtZXMobV9wVGlmZkNvbnRleHQsIGZyYW1lcyk7DQorICAgICAgRlhfRFdPUkQgYnBjOw0KKyAgICAgIEZYX0JPT0wgcmV0ID0gcFRpZmZNb2R1bGUtPkxvYWRGcmFtZUluZm8oDQorICAgICAgICAgIG1fcFRpZmZDb250ZXh0LCAwLCAoRlhfRFdPUkQmKW1fU3JjV2lkdGgsIChGWF9EV09SRCYpbV9TcmNIZWlnaHQsDQorICAgICAgICAgIChGWF9EV09SRCYpbV9TcmNDb21wb25lbnRzLCBicGMsIHBBdHRyaWJ1dGUpOw0KKyAgICAgIG1fU3JjQ29tcG9uZW50cyA9IDQ7DQorICAgICAgbV9jbGlwQm94ID0gRlhfUkVDVCgwLCAwLCBtX1NyY1dpZHRoLCBtX1NyY0hlaWdodCk7DQorICAgICAgaWYgKCFyZXQpIHsNCisgICAgICAgIHBUaWZmTW9kdWxlLT5EZXN0cm95RGVjb2RlcihtX3BUaWZmQ29udGV4dCk7DQorICAgICAgICAobV9wVGlmZkNvbnRleHQgPSBOVUxMKTsNCisgICAgICAgIChtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQpOw0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYQ09ERUNfU1RBVFVTIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkxvYWRJbWFnZUluZm8oDQorICAgIElGWF9GaWxlUmVhZCogcEZpbGUsDQorICAgIEZYQ09ERUNfSU1BR0VfVFlQRSBpbWFnZVR5cGUsDQorICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpIHsNCisgIHN3aXRjaCAobV9zdGF0dXMpIHsNCisgICAgY2FzZSBGWENPREVDX1NUQVRVU19GUkFNRV9SRUFEWToNCisgICAgY2FzZSBGWENPREVDX1NUQVRVU19GUkFNRV9UT0JFQ09OVElOVUU6DQorICAgIGNhc2UgRlhDT0RFQ19TVEFUVVNfREVDT0RFX1JFQURZOg0KKyAgICBjYXNlIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU6DQorICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOw0KKyAgICBkZWZhdWx0OjsNCisgIH0NCisgIGlmIChwRmlsZSA9PSBOVUxMKSB7DQorICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX1BBUkFNUzsNCisgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgIHJldHVybiBtX3N0YXR1czsNCisgIH0NCisgIG1fcEZpbGUgPSBwRmlsZTsNCisgIG1fb2ZmU2V0ID0gMDsNCisgIG1fU3JjV2lkdGggPSBtX1NyY0hlaWdodCA9IDA7DQorICBtX1NyY0NvbXBvbmVudHMgPSBtX1NyY0JQQyA9IDA7DQorICBtX2NsaXBCb3ggPSBGWF9SRUNUKDAsIDAsIDAsIDApOw0KKyAgbV9zdGFydFggPSBtX3N0YXJ0WSA9IDA7DQorICBtX3NpemVYID0gbV9zaXplWSA9IDA7DQorICBtX1NyY1Bhc3NOdW1iZXIgPSAwOw0KKyAgaWYgKGltYWdlVHlwZSAhPSBGWENPREVDX0lNQUdFX1VOS05PV04gJiYNCisgICAgICBEZXRlY3RJbWFnZVR5cGUoaW1hZ2VUeXBlLCBwQXR0cmlidXRlKSkgew0KKyAgICBtX2ltYWdUeXBlID0gaW1hZ2VUeXBlOw0KKyAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0ZSQU1FX1JFQURZOw0KKyAgICByZXR1cm4gbV9zdGF0dXM7DQorICB9DQorICBmb3IgKGludCB0eXBlID0gRlhDT0RFQ19JTUFHRV9CTVA7IHR5cGUgPCBGWENPREVDX0lNQUdFX01BWDsgdHlwZSsrKSB7DQorICAgIGlmIChEZXRlY3RJbWFnZVR5cGUoKEZYQ09ERUNfSU1BR0VfVFlQRSl0eXBlLCBwQXR0cmlidXRlKSkgew0KKyAgICAgIG1faW1hZ1R5cGUgPSAoRlhDT0RFQ19JTUFHRV9UWVBFKXR5cGU7DQorICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19GUkFNRV9SRUFEWTsNCisgICAgICByZXR1cm4gbV9zdGF0dXM7DQorICAgIH0NCisgIH0NCisgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX0ZPUk1BVDsNCisgIG1fcEZpbGUgPSBOVUxMOw0KKyAgcmV0dXJuIG1fc3RhdHVzOw0KK30NCit2b2lkIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OlNldENsaXBCb3goRlhfUkVDVCogY2xpcCkgew0KKyAgaWYgKG1fc3RhdHVzICE9IEZYQ09ERUNfU1RBVFVTX0ZSQU1FX1JFQURZKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChjbGlwLT5Jc0VtcHR5KCkpIHsNCisgICAgbV9jbGlwQm94ID0gRlhfUkVDVCgwLCAwLCAwLCAwKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKGNsaXAtPmxlZnQgPCAwKSB7DQorICAgIGNsaXAtPmxlZnQgPSAwOw0KKyAgfQ0KKyAgaWYgKGNsaXAtPnJpZ2h0ID4gbV9TcmNXaWR0aCkgew0KKyAgICBjbGlwLT5yaWdodCA9IG1fU3JjV2lkdGg7DQorICB9DQorICBpZiAoY2xpcC0+dG9wIDwgMCkgew0KKyAgICBjbGlwLT50b3AgPSAwOw0KKyAgfQ0KKyAgaWYgKGNsaXAtPmJvdHRvbSA+IG1fU3JjSGVpZ2h0KSB7DQorICAgIGNsaXAtPmJvdHRvbSA9IG1fU3JjSGVpZ2h0Ow0KKyAgfQ0KKyAgaWYgKGNsaXAtPklzRW1wdHkoKSkgew0KKyAgICBtX2NsaXBCb3ggPSBGWF9SRUNUKDAsIDAsIDAsIDApOw0KKyAgICByZXR1cm47DQorICB9DQorICBtX2NsaXBCb3ggPSAqY2xpcDsNCit9DQordm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpHZXREb3duU2NhbGUoaW50JiBkb3duX3NjYWxlKSB7DQorICBkb3duX3NjYWxlID0gMTsNCisgIGludCByYXRpb193ID0gbV9jbGlwQm94LldpZHRoKCkgLyBtX3NpemVYOw0KKyAgaW50IHJhdGlvX2ggPSBtX2NsaXBCb3guSGVpZ2h0KCkgLyBtX3NpemVZOw0KKyAgaW50IHJhdGlvID0gKHJhdGlvX3cgPiByYXRpb19oKSA/IHJhdGlvX2ggOiByYXRpb193Ow0KKyAgaWYgKHJhdGlvID49IDgpIHsNCisgICAgZG93bl9zY2FsZSA9IDg7DQorICB9IGVsc2UgaWYgKHJhdGlvID49IDQpIHsNCisgICAgZG93bl9zY2FsZSA9IDQ7DQorICB9IGVsc2UgaWYgKHJhdGlvID49IDIpIHsNCisgICAgZG93bl9zY2FsZSA9IDI7DQorICB9DQorICBtX2NsaXBCb3gubGVmdCAvPSBkb3duX3NjYWxlOw0KKyAgbV9jbGlwQm94LnJpZ2h0IC89IGRvd25fc2NhbGU7DQorICBtX2NsaXBCb3gudG9wIC89IGRvd25fc2NhbGU7DQorICBtX2NsaXBCb3guYm90dG9tIC89IGRvd25fc2NhbGU7DQorICBpZiAobV9jbGlwQm94LnJpZ2h0ID09IG1fY2xpcEJveC5sZWZ0KSB7DQorICAgIG1fY2xpcEJveC5yaWdodCA9IG1fY2xpcEJveC5sZWZ0ICsgMTsNCisgIH0NCisgIGlmIChtX2NsaXBCb3guYm90dG9tID09IG1fY2xpcEJveC50b3ApIHsNCisgICAgbV9jbGlwQm94LmJvdHRvbSA9IG1fY2xpcEJveC50b3AgKyAxOw0KKyAgfQ0KK30NCit2b2lkIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkdldFRyYW5zTWV0aG9kKEZYRElCX0Zvcm1hdCBkZXNfZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhDb2RlY19Gb3JtYXQgc3JjX2Zvcm1hdCkgew0KKyAgc3dpdGNoIChkZXNfZm9ybWF0KSB7DQorICAgIGNhc2UgRlhESUJfMWJwcE1hc2s6DQorICAgIGNhc2UgRlhESUJfMWJwcFJnYjogew0KKyAgICAgIHN3aXRjaCAoc3JjX2Zvcm1hdCkgew0KKyAgICAgICAgY2FzZSBGWENvZGVjXzFicHBHcmF5Og0KKyAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gMDsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gLTE7DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZYRElCXzhicHBNYXNrOg0KKyAgICBjYXNlIEZYRElCXzhicHBSZ2I6IHsNCisgICAgICBzd2l0Y2ggKHNyY19mb3JtYXQpIHsNCisgICAgICAgIGNhc2UgRlhDb2RlY18xYnBwR3JheToNCisgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDE7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWENvZGVjXzhicHBHcmF5Og0KKyAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gMjsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYQ29kZWNfMWJwcFJnYjoNCisgICAgICAgIGNhc2UgRlhDb2RlY184YnBwUmdiOg0KKyAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gMzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYQ29kZWNfUmdiOg0KKyAgICAgICAgY2FzZSBGWENvZGVjX1JnYjMyOg0KKyAgICAgICAgY2FzZSBGWENvZGVjX0FyZ2I6DQorICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSA0Ow0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhDb2RlY19DbXlrOg0KKyAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gNTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gLTE7DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZYRElCX1JnYjogew0KKyAgICAgIHN3aXRjaCAoc3JjX2Zvcm1hdCkgew0KKyAgICAgICAgY2FzZSBGWENvZGVjXzFicHBHcmF5Og0KKyAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gNjsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYQ29kZWNfOGJwcEdyYXk6DQorICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSA3Ow0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhDb2RlY18xYnBwUmdiOg0KKyAgICAgICAgY2FzZSBGWENvZGVjXzhicHBSZ2I6DQorICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSA4Ow0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhDb2RlY19SZ2I6DQorICAgICAgICBjYXNlIEZYQ29kZWNfUmdiMzI6DQorICAgICAgICBjYXNlIEZYQ29kZWNfQXJnYjoNCisgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWENvZGVjX0NteWs6DQorICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSAxMDsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gLTE7DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZYRElCX1JnYjMyOg0KKyAgICBjYXNlIEZYRElCX0FyZ2I6IHsNCisgICAgICBzd2l0Y2ggKHNyY19mb3JtYXQpIHsNCisgICAgICAgIGNhc2UgRlhDb2RlY18xYnBwR3JheToNCisgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDY7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWENvZGVjXzhicHBHcmF5Og0KKyAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gNzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYQ29kZWNfMWJwcFJnYjoNCisgICAgICAgIGNhc2UgRlhDb2RlY184YnBwUmdiOg0KKyAgICAgICAgICBpZiAoZGVzX2Zvcm1hdCA9PSBGWERJQl9BcmdiKSB7DQorICAgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDEyOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSA4Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWENvZGVjX1JnYjoNCisgICAgICAgIGNhc2UgRlhDb2RlY19SZ2IzMjoNCisgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGWENvZGVjX0NteWs6DQorICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSAxMDsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZYQ29kZWNfQXJnYjoNCisgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDExOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSAtMTsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgbV9UcmFuc01ldGhvZCA9IC0xOw0KKyAgfQ0KK30NCit2b2lkIF9SR0IyQkdSKHVpbnQ4X3QqIGJ1ZmZlciwgaW50IHdpZHRoID0gMSkgew0KKyAgaWYgKGJ1ZmZlciAmJiB3aWR0aCA+IDApIHsNCisgICAgdWludDhfdCB0ZW1wOw0KKyAgICBpbnQgaSA9IDA7DQorICAgIGludCBqID0gMDsNCisgICAgZm9yICg7IGkgPCB3aWR0aDsgaSsrLCBqICs9IDMpIHsNCisgICAgICB0ZW1wID0gYnVmZmVyW2pdOw0KKyAgICAgIGJ1ZmZlcltqXSA9IGJ1ZmZlcltqICsgMl07DQorICAgICAgYnVmZmVyW2ogKyAyXSA9IHRlbXA7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpSZVNhbXBsZVNjYW5saW5lKENGWF9ESUJpdG1hcCogcERldmljZUJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc19saW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfc2NhbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhDb2RlY19Gb3JtYXQgc3JjX2Zvcm1hdCkgew0KKyAgaW50IHNyY19sZWZ0ID0gbV9jbGlwQm94LmxlZnQ7DQorICBpbnQgZGVzX2xlZnQgPSBtX3N0YXJ0WDsNCisgIHVpbnQ4X3QqIGRlc19zY2FuID0NCisgICAgICBwRGV2aWNlQml0bWFwLT5HZXRCdWZmZXIoKSArIGRlc19saW5lICogcERldmljZUJpdG1hcC0+R2V0UGl0Y2goKTsNCisgIGludCBzcmNfYnBwID0gc3JjX2Zvcm1hdCAmIDB4ZmY7DQorICBpbnQgZGVzX2JwcCA9IHBEZXZpY2VCaXRtYXAtPkdldEJQUCgpOw0KKyAgaW50IHNyY19CcHAgPSBzcmNfYnBwID4+IDM7DQorICBpbnQgZGVzX0JwcCA9IGRlc19icHAgPj4gMzsNCisgIHNyY19zY2FuICs9IHNyY19sZWZ0ICogc3JjX0JwcDsNCisgIGRlc19zY2FuICs9IGRlc19sZWZ0ICogZGVzX0JwcDsNCisgIGZvciAoaW50IGRlc19jb2wgPSAwOyBkZXNfY29sIDwgbV9zaXplWDsgZGVzX2NvbCsrKSB7DQorICAgIFBpeGVsV2VpZ2h0KiBwUGl4ZWxXZWlnaHRzID0gbV9XZWlnaHRIb3J6LkdldFBpeGVsV2VpZ2h0KGRlc19jb2wpOw0KKyAgICBzd2l0Y2ggKG1fVHJhbnNNZXRob2QpIHsNCisgICAgICBjYXNlIC0xOg0KKyAgICAgICAgcmV0dXJuOw0KKyAgICAgIGNhc2UgMDoNCisgICAgICAgIHJldHVybjsNCisgICAgICBjYXNlIDE6DQorICAgICAgICByZXR1cm47DQorICAgICAgY2FzZSAyOiB7DQorICAgICAgICBGWF9EV09SRCBkZXNfZyA9IDA7DQorICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsNCisgICAgICAgICAgICAgaisrKSB7DQorICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPQ0KKyAgICAgICAgICAgICAgcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsNCisgICAgICAgICAgZGVzX2cgKz0gcGl4ZWxfd2VpZ2h0ICogc3JjX3NjYW5bal07DQorICAgICAgICB9DQorICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KShkZXNfZyA+PiAxNik7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIDM6IHsNCisgICAgICAgIGludCBkZXNfciA9IDAsIGRlc19nID0gMCwgZGVzX2IgPSAwOw0KKyAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7DQorICAgICAgICAgICAgIGorKykgew0KKyAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0NCisgICAgICAgICAgICAgIHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1tqIC0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydF07DQorICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnYiA9IG1fcFNyY1BhbGV0dGVbc3JjX3NjYW5bal1dOw0KKyAgICAgICAgICBkZXNfciArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdCkoYXJnYiA+PiAxNik7DQorICAgICAgICAgIGRlc19nICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KShhcmdiID4+IDgpOw0KKyAgICAgICAgICBkZXNfYiArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdClhcmdiOw0KKyAgICAgICAgfQ0KKyAgICAgICAgKmRlc19zY2FuKysgPQ0KKyAgICAgICAgICAgICh1aW50OF90KUZYUkdCMkdSQVkoKGRlc19yID4+IDE2KSwgKGRlc19nID4+IDE2KSwgKGRlc19iID4+IDE2KSk7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIDQ6IHsNCisgICAgICAgIEZYX0RXT1JEIGRlc19iID0gMCwgZGVzX2cgPSAwLCBkZXNfciA9IDA7DQorICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsNCisgICAgICAgICAgICAgaisrKSB7DQorICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPQ0KKyAgICAgICAgICAgICAgcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsNCisgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3BpeGVsID0gc3JjX3NjYW4gKyBqICogc3JjX0JwcDsNCisgICAgICAgICAgZGVzX2IgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7DQorICAgICAgICAgIGRlc19nICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKyspOw0KKyAgICAgICAgICBkZXNfciArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCk7DQorICAgICAgICB9DQorICAgICAgICAqZGVzX3NjYW4rKyA9DQorICAgICAgICAgICAgKHVpbnQ4X3QpRlhSR0IyR1JBWSgoZGVzX3IgPj4gMTYpLCAoZGVzX2cgPj4gMTYpLCAoZGVzX2IgPj4gMTYpKTsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgNTogew0KKyAgICAgICAgRlhfRFdPUkQgZGVzX2IgPSAwLCBkZXNfZyA9IDAsIGRlc19yID0gMDsNCisgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOw0KKyAgICAgICAgICAgICBqKyspIHsNCisgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9DQorICAgICAgICAgICAgICBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOw0KKyAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfcGl4ZWwgPSBzcmNfc2NhbiArIGogKiBzcmNfQnBwOw0KKyAgICAgICAgICB1aW50OF90IHNyY19iID0gMCwgc3JjX2cgPSAwLCBzcmNfciA9IDA7DQorICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMSgyNTUgLSBzcmNfcGl4ZWxbMF0sIDI1NSAtIHNyY19waXhlbFsxXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NSAtIHNyY19waXhlbFsyXSwgMjU1IC0gc3JjX3BpeGVsWzNdLCBzcmNfciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19nLCBzcmNfYik7DQorICAgICAgICAgIGRlc19iICs9IHBpeGVsX3dlaWdodCAqIHNyY19iOw0KKyAgICAgICAgICBkZXNfZyArPSBwaXhlbF93ZWlnaHQgKiBzcmNfZzsNCisgICAgICAgICAgZGVzX3IgKz0gcGl4ZWxfd2VpZ2h0ICogc3JjX3I7DQorICAgICAgICB9DQorICAgICAgICAqZGVzX3NjYW4rKyA9DQorICAgICAgICAgICAgKHVpbnQ4X3QpRlhSR0IyR1JBWSgoZGVzX3IgPj4gMTYpLCAoZGVzX2cgPj4gMTYpLCAoZGVzX2IgPj4gMTYpKTsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgNjoNCisgICAgICAgIHJldHVybjsNCisgICAgICBjYXNlIDc6IHsNCisgICAgICAgIEZYX0RXT1JEIGRlc19nID0gMDsNCisgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOw0KKyAgICAgICAgICAgICBqKyspIHsNCisgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9DQorICAgICAgICAgICAgICBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOw0KKyAgICAgICAgICBkZXNfZyArPSBwaXhlbF93ZWlnaHQgKiBzcmNfc2NhbltqXTsNCisgICAgICAgIH0NCisgICAgICAgIEZYU1lTX21lbXNldChkZXNfc2NhbiwgKHVpbnQ4X3QpKGRlc19nID4+IDE2KSwgMyk7DQorICAgICAgICBkZXNfc2NhbiArPSBkZXNfQnBwOw0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSA4OiB7DQorICAgICAgICBpbnQgZGVzX3IgPSAwLCBkZXNfZyA9IDAsIGRlc19iID0gMDsNCisgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOw0KKyAgICAgICAgICAgICBqKyspIHsNCisgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9DQorICAgICAgICAgICAgICBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOw0KKyAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZ2IgPSBtX3BTcmNQYWxldHRlW3NyY19zY2FuW2pdXTsNCisgICAgICAgICAgZGVzX3IgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpKGFyZ2IgPj4gMTYpOw0KKyAgICAgICAgICBkZXNfZyArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdCkoYXJnYiA+PiA4KTsNCisgICAgICAgICAgZGVzX2IgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpYXJnYjsNCisgICAgICAgIH0NCisgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfYikgPj4gMTYpOw0KKyAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19nKSA+PiAxNik7DQorICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KSgoZGVzX3IpID4+IDE2KTsNCisgICAgICAgIGRlc19zY2FuICs9IGRlc19CcHAgLSAzOw0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSAxMjogew0KKyAgICAgICAgaWYgKG1fcEJtcENvbnRleHQpIHsNCisgICAgICAgICAgaW50IGRlc19yID0gMCwgZGVzX2cgPSAwLCBkZXNfYiA9IDA7DQorICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOw0KKyAgICAgICAgICAgICAgIGorKykgew0KKyAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPQ0KKyAgICAgICAgICAgICAgICBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOw0KKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnYiA9IG1fcFNyY1BhbGV0dGVbc3JjX3NjYW5bal1dOw0KKyAgICAgICAgICAgIGRlc19yICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KShhcmdiID4+IDE2KTsNCisgICAgICAgICAgICBkZXNfZyArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdCkoYXJnYiA+PiA4KTsNCisgICAgICAgICAgICBkZXNfYiArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdClhcmdiOw0KKyAgICAgICAgICB9DQorICAgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfYikgPj4gMTYpOw0KKyAgICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KSgoZGVzX2cpID4+IDE2KTsNCisgICAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19yKSA+PiAxNik7DQorICAgICAgICAgICpkZXNfc2NhbisrID0gMHhGRjsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGludCBkZXNfYSA9IDAsIGRlc19yID0gMCwgZGVzX2cgPSAwLCBkZXNfYiA9IDA7DQorICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOw0KKyAgICAgICAgICAgICAgIGorKykgew0KKyAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPQ0KKyAgICAgICAgICAgICAgICBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOw0KKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnYiA9IG1fcFNyY1BhbGV0dGVbc3JjX3NjYW5bal1dOw0KKyAgICAgICAgICAgIGRlc19hICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KShhcmdiID4+IDI0KTsNCisgICAgICAgICAgICBkZXNfciArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdCkoYXJnYiA+PiAxNik7DQorICAgICAgICAgICAgZGVzX2cgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpKGFyZ2IgPj4gOCk7DQorICAgICAgICAgICAgZGVzX2IgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpYXJnYjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KSgoZGVzX2IpID4+IDE2KTsNCisgICAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19nKSA+PiAxNik7DQorICAgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfcikgPj4gMTYpOw0KKyAgICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KSgoZGVzX2EpID4+IDE2KTsNCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgOTogew0KKyAgICAgICAgRlhfRFdPUkQgZGVzX2IgPSAwLCBkZXNfZyA9IDAsIGRlc19yID0gMDsNCisgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOw0KKyAgICAgICAgICAgICBqKyspIHsNCisgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9DQorICAgICAgICAgICAgICBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOw0KKyAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfcGl4ZWwgPSBzcmNfc2NhbiArIGogKiBzcmNfQnBwOw0KKyAgICAgICAgICBkZXNfYiArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCsrKTsNCisgICAgICAgICAgZGVzX2cgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7DQorICAgICAgICAgIGRlc19yICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKTsNCisgICAgICAgIH0NCisgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfYikgPj4gMTYpOw0KKyAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19nKSA+PiAxNik7DQorICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KSgoZGVzX3IpID4+IDE2KTsNCisgICAgICAgIGRlc19zY2FuICs9IGRlc19CcHAgLSAzOw0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSAxMDogew0KKyAgICAgICAgRlhfRFdPUkQgZGVzX2IgPSAwLCBkZXNfZyA9IDAsIGRlc19yID0gMDsNCisgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOw0KKyAgICAgICAgICAgICBqKyspIHsNCisgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9DQorICAgICAgICAgICAgICBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOw0KKyAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfcGl4ZWwgPSBzcmNfc2NhbiArIGogKiBzcmNfQnBwOw0KKyAgICAgICAgICB1aW50OF90IHNyY19iID0gMCwgc3JjX2cgPSAwLCBzcmNfciA9IDA7DQorICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMSgyNTUgLSBzcmNfcGl4ZWxbMF0sIDI1NSAtIHNyY19waXhlbFsxXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NSAtIHNyY19waXhlbFsyXSwgMjU1IC0gc3JjX3BpeGVsWzNdLCBzcmNfciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19nLCBzcmNfYik7DQorICAgICAgICAgIGRlc19iICs9IHBpeGVsX3dlaWdodCAqIHNyY19iOw0KKyAgICAgICAgICBkZXNfZyArPSBwaXhlbF93ZWlnaHQgKiBzcmNfZzsNCisgICAgICAgICAgZGVzX3IgKz0gcGl4ZWxfd2VpZ2h0ICogc3JjX3I7DQorICAgICAgICB9DQorICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KSgoZGVzX2IpID4+IDE2KTsNCisgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfZykgPj4gMTYpOw0KKyAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19yKSA+PiAxNik7DQorICAgICAgICBkZXNfc2NhbiArPSBkZXNfQnBwIC0gMzsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgMTE6IHsNCisgICAgICAgIEZYX0RXT1JEIGRlc19hbHBoYSA9IDAsIGRlc19yID0gMCwgZGVzX2cgPSAwLCBkZXNfYiA9IDA7DQorICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsNCisgICAgICAgICAgICAgaisrKSB7DQorICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPQ0KKyAgICAgICAgICAgICAgcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsNCisgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3BpeGVsID0gc3JjX3NjYW4gKyBqICogc3JjX0JwcDsNCisgICAgICAgICAgcGl4ZWxfd2VpZ2h0ID0gcGl4ZWxfd2VpZ2h0ICogc3JjX3BpeGVsWzNdIC8gMjU1Ow0KKyAgICAgICAgICBkZXNfYiArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCsrKTsNCisgICAgICAgICAgZGVzX2cgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7DQorICAgICAgICAgIGRlc19yICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKTsNCisgICAgICAgICAgZGVzX2FscGhhICs9IHBpeGVsX3dlaWdodDsNCisgICAgICAgIH0NCisgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfYikgPj4gMTYpOw0KKyAgICAgICAgKmRlc19zY2FuKysgPSAodWludDhfdCkoKGRlc19nKSA+PiAxNik7DQorICAgICAgICAqZGVzX3NjYW4rKyA9ICh1aW50OF90KSgoZGVzX3IpID4+IDE2KTsNCisgICAgICAgICpkZXNfc2NhbisrID0gKHVpbnQ4X3QpKChkZXNfYWxwaGEgKiAyNTUpID4+IDE2KTsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpSZXNhbXBsZVZlcnQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlQml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzY2FsZV95LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXNfcm93KSB7DQorICBpbnQgZGVzX0JwcCA9IHBEZXZpY2VCaXRtYXAtPkdldEJQUCgpID4+IDM7DQorICBGWF9EV09SRCBkZXNfU2Nhbk9mZmV0ID0gbV9zdGFydFggKiBkZXNfQnBwOw0KKyAgaWYgKG1fYkludGVycG9sKSB7DQorICAgIGludCBkZXNfdG9wID0gbV9zdGFydFk7DQorICAgIGludCBkZXNfcm93XzEgPSBkZXNfcm93IC0gaW50KHNjYWxlX3kpOw0KKyAgICBpZiAoZGVzX3Jvd18xIDwgZGVzX3RvcCkgew0KKyAgICAgIGludCBkZXNfYm90dG9tID0gZGVzX3RvcCArIG1fc2l6ZVk7DQorICAgICAgaWYgKGRlc19yb3cgKyAoaW50KXNjYWxlX3kgPj0gZGVzX2JvdHRvbSAtIDEpIHsNCisgICAgICAgIHVpbnQ4X3QqIHNjYW5fc3JjID0NCisgICAgICAgICAgICAodWludDhfdCopcERldmljZUJpdG1hcC0+R2V0U2NhbmxpbmUoZGVzX3JvdykgKyBkZXNfU2Nhbk9mZmV0Ow0KKyAgICAgICAgd2hpbGUgKCsrZGVzX3JvdyA8IGRlc19ib3R0b20pIHsNCisgICAgICAgICAgdWludDhfdCogc2Nhbl9kZXMgPQ0KKyAgICAgICAgICAgICAgKHVpbnQ4X3QqKXBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKGRlc19yb3cpICsgZGVzX1NjYW5PZmZldDsNCisgICAgICAgICAgRlhfRFdPUkQgc2l6ZSA9IG1fc2l6ZVggKiBkZXNfQnBwOw0KKyAgICAgICAgICBGWFNZU19tZW1jcHkoc2Nhbl9kZXMsIHNjYW5fc3JjLCBzaXplKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGZvciAoOyBkZXNfcm93XzEgPCBkZXNfcm93OyBkZXNfcm93XzErKykgew0KKyAgICAgIHVpbnQ4X3QqIHNjYW5fZGVzID0NCisgICAgICAgICAgKHVpbnQ4X3QqKXBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKGRlc19yb3dfMSkgKyBkZXNfU2Nhbk9mZmV0Ow0KKyAgICAgIFBpeGVsV2VpZ2h0KiBwV2VpZ2h0ID0gbV9XZWlnaHRWZXJ0LkdldFBpeGVsV2VpZ2h0KGRlc19yb3dfMSAtIGRlc190b3ApOw0KKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHNjYW5fc3JjMSA9DQorICAgICAgICAgIHBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKHBXZWlnaHQtPm1fU3JjU3RhcnQgKyBkZXNfdG9wKSArDQorICAgICAgICAgIGRlc19TY2FuT2ZmZXQ7DQorICAgICAgY29uc3QgdWludDhfdCogc2Nhbl9zcmMyID0NCisgICAgICAgICAgcERldmljZUJpdG1hcC0+R2V0U2NhbmxpbmUocFdlaWdodC0+bV9TcmNFbmQgKyBkZXNfdG9wKSArDQorICAgICAgICAgIGRlc19TY2FuT2ZmZXQ7DQorICAgICAgZm9yIChpbnQgZGVzX2NvbCA9IDA7IGRlc19jb2wgPCBtX3NpemVYOyBkZXNfY29sKyspIHsNCisgICAgICAgIHN3aXRjaCAocERldmljZUJpdG1hcC0+R2V0Rm9ybWF0KCkpIHsNCisgICAgICAgICAgY2FzZSBGWERJQl9JbnZhbGlkOg0KKyAgICAgICAgICBjYXNlIEZYRElCXzFicHBNYXNrOg0KKyAgICAgICAgICBjYXNlIEZYRElCXzFicHBSZ2I6DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICBjYXNlIEZYRElCXzhicHBNYXNrOg0KKyAgICAgICAgICBjYXNlIEZYRElCXzhicHBSZ2I6IHsNCisgICAgICAgICAgICBpZiAocERldmljZUJpdG1hcC0+R2V0UGFsZXR0ZSgpICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaW50IGRlc19nID0gMDsNCisgICAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCisgICAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsNCisgICAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KShkZXNfZyA+PiAxNik7DQorICAgICAgICAgIH0gYnJlYWs7DQorICAgICAgICAgIGNhc2UgRlhESUJfUmdiOg0KKyAgICAgICAgICBjYXNlIEZYRElCX1JnYjMyOiB7DQorICAgICAgICAgICAgRlhfRFdPUkQgZGVzX2IgPSAwLCBkZXNfZyA9IDAsIGRlc19yID0gMDsNCisgICAgICAgICAgICBkZXNfYiArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCisgICAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCisgICAgICAgICAgICBkZXNfciArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsNCisgICAgICAgICAgICBzY2FuX3NyYzEgKz0gZGVzX0JwcCAtIDM7DQorICAgICAgICAgICAgZGVzX2IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQorICAgICAgICAgICAgZGVzX2cgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQorICAgICAgICAgICAgZGVzX3IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQorICAgICAgICAgICAgc2Nhbl9zcmMyICs9IGRlc19CcHAgLSAzOw0KKyAgICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKChkZXNfYikgPj4gMTYpOw0KKyAgICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKChkZXNfZykgPj4gMTYpOw0KKyAgICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKChkZXNfcikgPj4gMTYpOw0KKyAgICAgICAgICAgIHNjYW5fZGVzICs9IGRlc19CcHAgLSAzOw0KKyAgICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgICBjYXNlIEZYRElCX0FyZ2I6IHsNCisgICAgICAgICAgICBGWF9EV09SRCBkZXNfYSA9IDAsIGRlc19iID0gMCwgZGVzX2cgPSAwLCBkZXNfciA9IDA7DQorICAgICAgICAgICAgZGVzX2IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgICAgZGVzX2cgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgICAgZGVzX3IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgICAgZGVzX2EgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7DQorICAgICAgICAgICAgZGVzX2IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQorICAgICAgICAgICAgZGVzX2cgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQorICAgICAgICAgICAgZGVzX3IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQorICAgICAgICAgICAgZGVzX2EgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7DQorICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoKGRlc19iKSA+PiAxNik7DQorICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoKGRlc19nKSA+PiAxNik7DQorICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoKGRlc19yKSA+PiAxNik7DQorICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoKGRlc19hKSA+PiAxNik7DQorICAgICAgICAgIH0gYnJlYWs7DQorICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpbnQgZGVzX2JvdHRvbSA9IGRlc190b3AgKyBtX3NpemVZOw0KKyAgICBpZiAoZGVzX3JvdyArIChpbnQpc2NhbGVfeSA+PSBkZXNfYm90dG9tIC0gMSkgew0KKyAgICAgIHVpbnQ4X3QqIHNjYW5fc3JjID0NCisgICAgICAgICAgKHVpbnQ4X3QqKXBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKGRlc19yb3cpICsgZGVzX1NjYW5PZmZldDsNCisgICAgICB3aGlsZSAoKytkZXNfcm93IDwgZGVzX2JvdHRvbSkgew0KKyAgICAgICAgdWludDhfdCogc2Nhbl9kZXMgPQ0KKyAgICAgICAgICAgICh1aW50OF90KilwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShkZXNfcm93KSArIGRlc19TY2FuT2ZmZXQ7DQorICAgICAgICBGWF9EV09SRCBzaXplID0gbV9zaXplWCAqIGRlc19CcHA7DQorICAgICAgICBGWFNZU19tZW1jcHkoc2Nhbl9kZXMsIHNjYW5fc3JjLCBzaXplKTsNCisgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50IG11bHRpcGxlID0gKGludClGWFNZU19jZWlsKChGWF9GTE9BVClzY2FsZV95IC0gMSk7DQorICBpZiAobXVsdGlwbGUgPiAwKSB7DQorICAgIHVpbnQ4X3QqIHNjYW5fc3JjID0NCisgICAgICAgICh1aW50OF90KilwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShkZXNfcm93KSArIGRlc19TY2FuT2ZmZXQ7DQorICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG11bHRpcGxlOyBpKyspIHsNCisgICAgICBpZiAoZGVzX3JvdyArIGkgPj0gbV9zdGFydFkgKyBtX3NpemVZKSB7DQorICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICAgIHVpbnQ4X3QqIHNjYW5fZGVzID0NCisgICAgICAgICAgKHVpbnQ4X3QqKXBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKGRlc19yb3cgKyBpKSArIGRlc19TY2FuT2ZmZXQ7DQorICAgICAgRlhfRFdPUkQgc2l6ZSA9IG1fc2l6ZVggKiBkZXNfQnBwOw0KKyAgICAgIEZYU1lTX21lbWNweShzY2FuX2Rlcywgc2Nhbl9zcmMsIHNpemUpOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6UmVzYW1wbGUoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlQml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19zY2FuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhDb2RlY19Gb3JtYXQgc3JjX2Zvcm1hdCkgew0KKyAgaW50IHNyY190b3AgPSBtX2NsaXBCb3gudG9wOw0KKyAgaW50IGRlc190b3AgPSBtX3N0YXJ0WTsNCisgIGludCBzcmNfaGVpID0gbV9jbGlwQm94LkhlaWdodCgpOw0KKyAgaW50IGRlc19oZWkgPSBtX3NpemVZOw0KKyAgaWYgKHNyY19saW5lID49IHNyY190b3ApIHsNCisgICAgZG91YmxlIHNjYWxlX3kgPSAoZG91YmxlKWRlc19oZWkgLyAoZG91YmxlKXNyY19oZWk7DQorICAgIGludCBzcmNfcm93ID0gc3JjX2xpbmUgLSBzcmNfdG9wOw0KKyAgICBpbnQgZGVzX3JvdyA9IChpbnQpKHNyY19yb3cgKiBzY2FsZV95KSArIGRlc190b3A7DQorICAgIGlmIChkZXNfcm93ID49IGRlc190b3AgKyBkZXNfaGVpKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIFJlU2FtcGxlU2NhbmxpbmUocERldmljZUJpdG1hcCwgZGVzX3JvdywgbV9wRGVjb2RlQnVmLCBzcmNfZm9ybWF0KTsNCisgICAgaWYgKHNjYWxlX3kgPiAxLjApIHsNCisgICAgICBSZXNhbXBsZVZlcnQocERldmljZUJpdG1hcCwgc2NhbGVfeSwgZGVzX3Jvdyk7DQorICAgIH0NCisgIH0NCit9DQorRlhDT0RFQ19TVEFUVVMgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6R2V0RnJhbWVzKGludDMyX3QmIGZyYW1lcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsNCisgIGlmICghKG1fc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0ZSQU1FX1JFQURZIHx8DQorICAgICAgICBtX3N0YXR1cyA9PSBGWENPREVDX1NUQVRVU19GUkFNRV9UT0JFQ09OVElOVUUpKSB7DQorICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsNCisgIH0NCisgIHN3aXRjaCAobV9pbWFnVHlwZSkgew0KKyAgICBjYXNlIEZYQ09ERUNfSU1BR0VfQk1QOg0KKyAgICBjYXNlIEZYQ09ERUNfSU1BR0VfSlBHOg0KKyAgICBjYXNlIEZYQ09ERUNfSU1BR0VfUE5HOg0KKyAgICBjYXNlIEZYQ09ERUNfSU1BR0VfVElGOg0KKyAgICAgIGZyYW1lcyA9IG1fRnJhbWVOdW1iZXIgPSAxOw0KKyAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9SRUFEWTsNCisgICAgY2FzZSBGWENPREVDX0lNQUdFX0dJRjogew0KKyAgICAgIElDb2RlY19HaWZNb2R1bGUqIHBHaWZNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0R2lmTW9kdWxlKCk7DQorICAgICAgd2hpbGUgKFRSVUUpIHsNCisgICAgICAgIGludDMyX3QgcmVhZFJlc3VsdCA9DQorICAgICAgICAgICAgcEdpZk1vZHVsZS0+TG9hZEZyYW1lSW5mbyhtX3BHaWZDb250ZXh0LCAmbV9GcmFtZU51bWJlcik7DQorICAgICAgICB3aGlsZSAocmVhZFJlc3VsdCA9PSAyKSB7DQorICAgICAgICAgIEZYQ09ERUNfU1RBVFVTIGVycm9yX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9SRUFEOw0KKyAgICAgICAgICBpZiAoIUdpZlJlYWRNb3JlRGF0YShwR2lmTW9kdWxlLCBlcnJvcl9zdGF0dXMpKSB7DQorICAgICAgICAgICAgcmV0dXJuIGVycm9yX3N0YXR1czsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgew0KKyAgICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0ZSQU1FX1RPQkVDT05USU5VRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICByZWFkUmVzdWx0ID0gcEdpZk1vZHVsZS0+TG9hZEZyYW1lSW5mbyhtX3BHaWZDb250ZXh0LCAmbV9GcmFtZU51bWJlcik7DQorICAgICAgICB9DQorICAgICAgICBpZiAocmVhZFJlc3VsdCA9PSAxKSB7DQorICAgICAgICAgIGZyYW1lcyA9IG1fRnJhbWVOdW1iZXI7DQorICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9SRUFEWTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChtX3BHaWZDb250ZXh0ICE9IE5VTEwpIHsNCisgICAgICAgICAgcEdpZk1vZHVsZS0+RmluaXNoKG1fcEdpZkNvbnRleHQpOw0KKyAgICAgICAgICBtX3BHaWZDb250ZXh0ID0gTlVMTDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgZGVmYXVsdDo7DQorICB9DQorICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7DQorfQ0KK0ZYQ09ERUNfU1RBVFVTIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OlN0YXJ0RGVjb2RlKENGWF9ESUJpdG1hcCogcERJQml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF95LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbnRlcnBvbCkgew0KKyAgaWYgKG1fc3RhdHVzICE9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9SRUFEWSkgew0KKyAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7DQorICB9DQorICBpZiAocERJQml0bWFwID09IE5VTEwgfHwgcERJQml0bWFwLT5HZXRCUFAoKSA8IDggfHwgZnJhbWVzIDwgMCB8fA0KKyAgICAgIGZyYW1lcyA+PSBtX0ZyYW1lTnVtYmVyKSB7DQorICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJfUEFSQU1TOw0KKyAgfQ0KKyAgbV9wRGV2aWNlQml0bWFwID0gcERJQml0bWFwOw0KKyAgaWYgKG1fY2xpcEJveC5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUl9QQVJBTVM7DQorICB9DQorICBpZiAoc2l6ZV94IDw9IDAgfHwgc2l6ZV94ID4gNjU1MzUgfHwgc2l6ZV95IDw9IDAgfHwgc2l6ZV95ID4gNjU1MzUpIHsNCisgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUl9QQVJBTVM7DQorICB9DQorICBGWF9SRUNUIGRldmljZV9yYyA9DQorICAgICAgRlhfUkVDVChzdGFydF94LCBzdGFydF95LCBzdGFydF94ICsgc2l6ZV94LCBzdGFydF95ICsgc2l6ZV95KTsNCisgIGludDMyX3Qgb3V0X3JhbmdlX3ggPSBkZXZpY2VfcmMucmlnaHQgLSBwRElCaXRtYXAtPkdldFdpZHRoKCk7DQorICBpbnQzMl90IG91dF9yYW5nZV95ID0gZGV2aWNlX3JjLmJvdHRvbSAtIHBESUJpdG1hcC0+R2V0SGVpZ2h0KCk7DQorICBkZXZpY2VfcmMuSW50ZXJzZWN0KA0KKyAgICAgIEZYX1JFQ1QoMCwgMCwgcERJQml0bWFwLT5HZXRXaWR0aCgpLCBwRElCaXRtYXAtPkdldEhlaWdodCgpKSk7DQorICBpZiAoZGV2aWNlX3JjLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJSX1BBUkFNUzsNCisgIH0NCisgIG1fc3RhcnRYID0gZGV2aWNlX3JjLmxlZnQ7DQorICBtX3N0YXJ0WSA9IGRldmljZV9yYy50b3A7DQorICBtX3NpemVYID0gZGV2aWNlX3JjLldpZHRoKCk7DQorICBtX3NpemVZID0gZGV2aWNlX3JjLkhlaWdodCgpOw0KKyAgbV9iSW50ZXJwb2wgPSBiSW50ZXJwb2w7DQorICBtX0ZyYW1lQ3VyID0gMDsNCisgIGlmIChzdGFydF94IDwgMCB8fCBvdXRfcmFuZ2VfeCA+IDApIHsNCisgICAgRlhfRkxPQVQgc2NhbGVYID0gKEZYX0ZMT0FUKW1fY2xpcEJveC5XaWR0aCgpIC8gKEZYX0ZMT0FUKXNpemVfeDsNCisgICAgaWYgKHN0YXJ0X3ggPCAwKSB7DQorICAgICAgbV9jbGlwQm94LmxlZnQgLT0gKGludDMyX3QpRlhTWVNfY2VpbCgoRlhfRkxPQVQpc3RhcnRfeCAqIHNjYWxlWCk7DQorICAgIH0NCisgICAgaWYgKG91dF9yYW5nZV94ID4gMCkgew0KKyAgICAgIG1fY2xpcEJveC5yaWdodCAtPSAoaW50MzJfdClGWFNZU19mbG9vcigoRlhfRkxPQVQpb3V0X3JhbmdlX3ggKiBzY2FsZVgpOw0KKyAgICB9DQorICB9DQorICBpZiAoc3RhcnRfeSA8IDAgfHwgb3V0X3JhbmdlX3kgPiAwKSB7DQorICAgIEZYX0ZMT0FUIHNjYWxlWSA9IChGWF9GTE9BVCltX2NsaXBCb3guSGVpZ2h0KCkgLyAoRlhfRkxPQVQpc2l6ZV95Ow0KKyAgICBpZiAoc3RhcnRfeSA8IDApIHsNCisgICAgICBtX2NsaXBCb3gudG9wIC09IChpbnQzMl90KUZYU1lTX2NlaWwoKEZYX0ZMT0FUKXN0YXJ0X3kgKiBzY2FsZVkpOw0KKyAgICB9DQorICAgIGlmIChvdXRfcmFuZ2VfeSA+IDApIHsNCisgICAgICBtX2NsaXBCb3guYm90dG9tIC09IChpbnQzMl90KUZYU1lTX2Zsb29yKChGWF9GTE9BVClvdXRfcmFuZ2VfeSAqIHNjYWxlWSk7DQorICAgIH0NCisgIH0NCisgIGlmIChtX2NsaXBCb3guSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJfUEFSQU1TOw0KKyAgfQ0KKyAgc3dpdGNoIChtX2ltYWdUeXBlKSB7DQorICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9KUEc6IHsNCisgICAgICBJQ29kZWNfSnBlZ01vZHVsZSogcEpwZWdNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0SnBlZ01vZHVsZSgpOw0KKyAgICAgIGludCBkb3duX3NjYWxlID0gMTsNCisgICAgICBHZXREb3duU2NhbGUoZG93bl9zY2FsZSk7DQorICAgICAgRlhfQk9PTCBiU3RhcnQgPSBwSnBlZ01vZHVsZS0+U3RhcnRTY2FubGluZShtX3BKcGVnQ29udGV4dCwgZG93bl9zY2FsZSk7DQorICAgICAgd2hpbGUgKCFiU3RhcnQpIHsNCisgICAgICAgIEZYQ09ERUNfU1RBVFVTIGVycm9yX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOw0KKyAgICAgICAgaWYgKCFKcGVnUmVhZE1vcmVEYXRhKHBKcGVnTW9kdWxlLCBlcnJvcl9zdGF0dXMpKSB7DQorICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBlcnJvcl9zdGF0dXM7DQorICAgICAgICB9DQorICAgICAgICBiU3RhcnQgPSBwSnBlZ01vZHVsZS0+U3RhcnRTY2FubGluZShtX3BKcGVnQ29udGV4dCwgZG93bl9zY2FsZSk7DQorICAgICAgfQ0KKyAgICAgIGludCBzY2FubGluZV9zaXplID0gKG1fU3JjV2lkdGggKyBkb3duX3NjYWxlIC0gMSkgLyBkb3duX3NjYWxlOw0KKyAgICAgIHNjYW5saW5lX3NpemUgPSAoc2NhbmxpbmVfc2l6ZSAqIG1fU3JjQ29tcG9uZW50cyArIDMpIC8gNCAqIDQ7DQorICAgICAgaWYgKG1fcERlY29kZUJ1ZiAhPSBOVUxMKSB7DQorICAgICAgICBGWF9GcmVlKG1fcERlY29kZUJ1Zik7DQorICAgICAgICBtX3BEZWNvZGVCdWYgPSBOVUxMOw0KKyAgICAgIH0NCisgICAgICBtX3BEZWNvZGVCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBzY2FubGluZV9zaXplKTsNCisgICAgICBpZiAobV9wRGVjb2RlQnVmID09IE5VTEwpIHsNCisgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgfQ0KKyAgICAgIEZYU1lTX21lbXNldChtX3BEZWNvZGVCdWYsIDAsIHNjYW5saW5lX3NpemUpOw0KKyAgICAgIG1fV2VpZ2h0SG9yei5DYWxjKG1fc2l6ZVgsIDAsIG1fc2l6ZVgsIG1fY2xpcEJveC5XaWR0aCgpLCAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fY2xpcEJveC5XaWR0aCgpLCBtX2JJbnRlcnBvbCk7DQorICAgICAgbV9XZWlnaHRWZXJ0LkNhbGMobV9zaXplWSwgbV9jbGlwQm94LkhlaWdodCgpKTsNCisgICAgICBzd2l0Y2ggKG1fU3JjQ29tcG9uZW50cykgew0KKyAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICBtX1NyY0Zvcm1hdCA9IEZYQ29kZWNfOGJwcEdyYXk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAzOg0KKyAgICAgICAgICBtX1NyY0Zvcm1hdCA9IEZYQ29kZWNfUmdiOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgNDoNCisgICAgICAgICAgbV9TcmNGb3JtYXQgPSBGWENvZGVjX0NteWs7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBHZXRUcmFuc01ldGhvZChwRElCaXRtYXAtPkdldEZvcm1hdCgpLCBtX1NyY0Zvcm1hdCk7DQorICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGWENPREVDX0lNQUdFX1BORzogew0KKyAgICAgIElDb2RlY19QbmdNb2R1bGUqIHBQbmdNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0UG5nTW9kdWxlKCk7DQorICAgICAgaWYgKHBQbmdNb2R1bGUgPT0gTlVMTCkgew0KKyAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICB9DQorICAgICAgaWYgKG1fcFBuZ0NvbnRleHQgIT0gTlVMTCkgew0KKyAgICAgICAgcFBuZ01vZHVsZS0+RmluaXNoKG1fcFBuZ0NvbnRleHQpOw0KKyAgICAgICAgbV9wUG5nQ29udGV4dCA9IE5VTEw7DQorICAgICAgfQ0KKyAgICAgIG1fcFBuZ0NvbnRleHQgPSBwUG5nTW9kdWxlLT5TdGFydCgodm9pZCopdGhpcyk7DQorICAgICAgaWYgKG1fcFBuZ0NvbnRleHQgPT0gTlVMTCkgew0KKyAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICB9DQorICAgICAgbV9vZmZTZXQgPSAwOw0KKyAgICAgIHN3aXRjaCAobV9wRGV2aWNlQml0bWFwLT5HZXRGb3JtYXQoKSkgew0KKyAgICAgICAgY2FzZSBGWERJQl84YnBwTWFzazoNCisgICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYjoNCisgICAgICAgICAgbV9TcmNDb21wb25lbnRzID0gMTsNCisgICAgICAgICAgbV9TcmNGb3JtYXQgPSBGWENvZGVjXzhicHBHcmF5Ow0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhESUJfUmdiOg0KKyAgICAgICAgICBtX1NyY0NvbXBvbmVudHMgPSAzOw0KKyAgICAgICAgICBtX1NyY0Zvcm1hdCA9IEZYQ29kZWNfUmdiOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRlhESUJfUmdiMzI6DQorICAgICAgICBjYXNlIEZYRElCX0FyZ2I6DQorICAgICAgICAgIG1fU3JjQ29tcG9uZW50cyA9IDQ7DQorICAgICAgICAgIG1fU3JjRm9ybWF0ID0gRlhDb2RlY19BcmdiOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9QQVJBTVM7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIEdldFRyYW5zTWV0aG9kKG1fcERldmljZUJpdG1hcC0+R2V0Rm9ybWF0KCksIG1fU3JjRm9ybWF0KTsNCisgICAgICBpbnQgc2NhbmxpbmVfc2l6ZSA9IChtX1NyY1dpZHRoICogbV9TcmNDb21wb25lbnRzICsgMykgLyA0ICogNDsNCisgICAgICBpZiAobV9wRGVjb2RlQnVmICE9IE5VTEwpIHsNCisgICAgICAgIEZYX0ZyZWUobV9wRGVjb2RlQnVmKTsNCisgICAgICAgIG1fcERlY29kZUJ1ZiA9IE5VTEw7DQorICAgICAgfQ0KKyAgICAgIG1fcERlY29kZUJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNjYW5saW5lX3NpemUpOw0KKyAgICAgIGlmIChtX3BEZWNvZGVCdWYgPT0gTlVMTCkgew0KKyAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICB9DQorICAgICAgRlhTWVNfbWVtc2V0KG1fcERlY29kZUJ1ZiwgMCwgc2NhbmxpbmVfc2l6ZSk7DQorICAgICAgbV9XZWlnaHRIb3J6T08uQ2FsYyhtX3NpemVYLCBtX2NsaXBCb3guV2lkdGgoKSwgbV9iSW50ZXJwb2wpOw0KKyAgICAgIG1fV2VpZ2h0VmVydC5DYWxjKG1fc2l6ZVksIG1fY2xpcEJveC5IZWlnaHQoKSk7DQorICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGWENPREVDX0lNQUdFX0dJRjogew0KKyAgICAgIElDb2RlY19HaWZNb2R1bGUqIHBHaWZNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0R2lmTW9kdWxlKCk7DQorICAgICAgaWYgKHBHaWZNb2R1bGUgPT0gTlVMTCkgew0KKyAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICB9DQorICAgICAgbV9TcmNGb3JtYXQgPSBGWENvZGVjXzhicHBSZ2I7DQorICAgICAgR2V0VHJhbnNNZXRob2QobV9wRGV2aWNlQml0bWFwLT5HZXRGb3JtYXQoKSwgbV9TcmNGb3JtYXQpOw0KKyAgICAgIGludCBzY2FubGluZV9zaXplID0gKG1fU3JjV2lkdGggKyAzKSAvIDQgKiA0Ow0KKyAgICAgIGlmIChtX3BEZWNvZGVCdWYgIT0gTlVMTCkgew0KKyAgICAgICAgRlhfRnJlZShtX3BEZWNvZGVCdWYpOw0KKyAgICAgICAgbV9wRGVjb2RlQnVmID0gTlVMTDsNCisgICAgICB9DQorICAgICAgbV9wRGVjb2RlQnVmID0gRlhfQWxsb2ModWludDhfdCwgc2NhbmxpbmVfc2l6ZSk7DQorICAgICAgaWYgKG1fcERlY29kZUJ1ZiA9PSBOVUxMKSB7DQorICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KKyAgICAgIH0NCisgICAgICBGWFNZU19tZW1zZXQobV9wRGVjb2RlQnVmLCAwLCBzY2FubGluZV9zaXplKTsNCisgICAgICBtX1dlaWdodEhvcnouQ2FsYyhtX3NpemVYLCAwLCBtX3NpemVYLCBtX2NsaXBCb3guV2lkdGgoKSwgMCwNCisgICAgICAgICAgICAgICAgICAgICAgICBtX2NsaXBCb3guV2lkdGgoKSwgbV9iSW50ZXJwb2wpOw0KKyAgICAgIG1fV2VpZ2h0VmVydC5DYWxjKG1fc2l6ZVksIG1fY2xpcEJveC5IZWlnaHQoKSk7DQorICAgICAgbV9GcmFtZUN1ciA9IGZyYW1lczsNCisgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZYQ09ERUNfSU1BR0VfQk1QOiB7DQorICAgICAgSUNvZGVjX0JtcE1vZHVsZSogcEJtcE1vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRCbXBNb2R1bGUoKTsNCisgICAgICBpZiAocEJtcE1vZHVsZSA9PSBOVUxMKSB7DQorICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KKyAgICAgIH0NCisgICAgICBzd2l0Y2ggKG1fU3JjQ29tcG9uZW50cykgew0KKyAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICBtX1NyY0Zvcm1hdCA9IEZYQ29kZWNfOGJwcFJnYjsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDM6DQorICAgICAgICAgIG1fU3JjRm9ybWF0ID0gRlhDb2RlY19SZ2I7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSA0Og0KKyAgICAgICAgICBtX1NyY0Zvcm1hdCA9IEZYQ29kZWNfUmdiMzI7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBHZXRUcmFuc01ldGhvZChtX3BEZXZpY2VCaXRtYXAtPkdldEZvcm1hdCgpLCBtX1NyY0Zvcm1hdCk7DQorICAgICAgbV9TY2FubGluZVNpemUgPSAobV9TcmNXaWR0aCAqIG1fU3JjQ29tcG9uZW50cyArIDMpIC8gNCAqIDQ7DQorICAgICAgaWYgKG1fcERlY29kZUJ1ZiAhPSBOVUxMKSB7DQorICAgICAgICBGWF9GcmVlKG1fcERlY29kZUJ1Zik7DQorICAgICAgICBtX3BEZWNvZGVCdWYgPSBOVUxMOw0KKyAgICAgIH0NCisgICAgICBtX3BEZWNvZGVCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBtX1NjYW5saW5lU2l6ZSk7DQorICAgICAgaWYgKG1fcERlY29kZUJ1ZiA9PSBOVUxMKSB7DQorICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KKyAgICAgIH0NCisgICAgICBGWFNZU19tZW1zZXQobV9wRGVjb2RlQnVmLCAwLCBtX1NjYW5saW5lU2l6ZSk7DQorICAgICAgbV9XZWlnaHRIb3J6LkNhbGMobV9zaXplWCwgMCwgbV9zaXplWCwgbV9jbGlwQm94LldpZHRoKCksIDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgbV9jbGlwQm94LldpZHRoKCksIG1fYkludGVycG9sKTsNCisgICAgICBtX1dlaWdodFZlcnQuQ2FsYyhtX3NpemVZLCBtX2NsaXBCb3guSGVpZ2h0KCkpOw0KKyAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9USUY6DQorICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsNCit9DQorRlhDT0RFQ19TVEFUVVMgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6Q29udGludWVEZWNvZGUoSUZYX1BhdXNlKiBwUGF1c2UpIHsNCisgIGlmIChtX3N0YXR1cyAhPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7DQorICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsNCisgIH0NCisgIHN3aXRjaCAobV9pbWFnVHlwZSkgew0KKyAgICBjYXNlIEZYQ09ERUNfSU1BR0VfSlBHOiB7DQorICAgICAgSUNvZGVjX0pwZWdNb2R1bGUqIHBKcGVnTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldEpwZWdNb2R1bGUoKTsNCisgICAgICB3aGlsZSAoVFJVRSkgew0KKyAgICAgICAgRlhfQk9PTCByZWFkUmVzID0NCisgICAgICAgICAgICBwSnBlZ01vZHVsZS0+UmVhZFNjYW5saW5lKG1fcEpwZWdDb250ZXh0LCBtX3BEZWNvZGVCdWYpOw0KKyAgICAgICAgd2hpbGUgKCFyZWFkUmVzKSB7DQorICAgICAgICAgIEZYQ09ERUNfU1RBVFVTIGVycm9yX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7DQorICAgICAgICAgIGlmICghSnBlZ1JlYWRNb3JlRGF0YShwSnBlZ01vZHVsZSwgZXJyb3Jfc3RhdHVzKSkgew0KKyAgICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gZXJyb3Jfc3RhdHVzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHJlYWRSZXMgPSBwSnBlZ01vZHVsZS0+UmVhZFNjYW5saW5lKG1fcEpwZWdDb250ZXh0LCBtX3BEZWNvZGVCdWYpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1fU3JjRm9ybWF0ID09IEZYQ29kZWNfUmdiKSB7DQorICAgICAgICAgIGludCBzcmNfQnBwID0gKG1fU3JjRm9ybWF0ICYgMHhmZikgPj4gMzsNCisgICAgICAgICAgX1JHQjJCR1IobV9wRGVjb2RlQnVmICsgbV9jbGlwQm94LmxlZnQgKiBzcmNfQnBwLCBtX2NsaXBCb3guV2lkdGgoKSk7DQorICAgICAgICB9DQorICAgICAgICBpZiAobV9TcmNSb3cgPj0gbV9jbGlwQm94LmJvdHRvbSkgew0KKyAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsNCisgICAgICAgIH0NCisgICAgICAgIFJlc2FtcGxlKG1fcERldmljZUJpdG1hcCwgbV9TcmNSb3csIG1fcERlY29kZUJ1ZiwgbV9TcmNGb3JtYXQpOw0KKyAgICAgICAgbV9TcmNSb3crKzsNCisgICAgICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7DQorICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZYQ09ERUNfSU1BR0VfUE5HOiB7DQorICAgICAgSUNvZGVjX1BuZ01vZHVsZSogcFBuZ01vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRQbmdNb2R1bGUoKTsNCisgICAgICB3aGlsZSAoVFJVRSkgew0KKyAgICAgICAgRlhfRFdPUkQgcmVtYWluX3NpemUgPSAoRlhfRFdPUkQpbV9wRmlsZS0+R2V0U2l6ZSgpIC0gbV9vZmZTZXQ7DQorICAgICAgICBGWF9EV09SRCBpbnB1dF9zaXplID0NCisgICAgICAgICAgICByZW1haW5fc2l6ZSA+IEZYQ09ERUNfQkxPQ0tfU0laRSA/IEZYQ09ERUNfQkxPQ0tfU0laRSA6IHJlbWFpbl9zaXplOw0KKyAgICAgICAgaWYgKGlucHV0X3NpemUgPT0gMCkgew0KKyAgICAgICAgICBpZiAobV9wUG5nQ29udGV4dCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgcFBuZ01vZHVsZS0+RmluaXNoKG1fcFBuZ0NvbnRleHQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIG1fcFBuZ0NvbnRleHQgPSBOVUxMOw0KKyAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChtX3BTcmNCdWYgIT0gTlVMTCAmJiBpbnB1dF9zaXplID4gbV9TcmNTaXplKSB7DQorICAgICAgICAgIEZYX0ZyZWUobV9wU3JjQnVmKTsNCisgICAgICAgICAgbV9wU3JjQnVmID0gRlhfQWxsb2ModWludDhfdCwgaW5wdXRfc2l6ZSk7DQorICAgICAgICAgIGlmIChtX3BTcmNCdWYgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBGWFNZU19tZW1zZXQobV9wU3JjQnVmLCAwLCBpbnB1dF9zaXplKTsNCisgICAgICAgICAgbV9TcmNTaXplID0gaW5wdXRfc2l6ZTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0JPT0wgYlJlc3VsdCA9IG1fcEZpbGUtPlJlYWRCbG9jayhtX3BTcmNCdWYsIG1fb2ZmU2V0LCBpbnB1dF9zaXplKTsNCisgICAgICAgIGlmICghYlJlc3VsdCkgew0KKyAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX1JFQUQ7DQorICAgICAgICB9DQorICAgICAgICBtX29mZlNldCArPSBpbnB1dF9zaXplOw0KKyAgICAgICAgYlJlc3VsdCA9DQorICAgICAgICAgICAgcFBuZ01vZHVsZS0+SW5wdXQobV9wUG5nQ29udGV4dCwgbV9wU3JjQnVmLCBpbnB1dF9zaXplLCBudWxscHRyKTsNCisgICAgICAgIGlmICghYlJlc3VsdCkgew0KKyAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7DQorICAgICAgICB9DQorICAgICAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgew0KKyAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGWENPREVDX0lNQUdFX0dJRjogew0KKyAgICAgIElDb2RlY19HaWZNb2R1bGUqIHBHaWZNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0R2lmTW9kdWxlKCk7DQorICAgICAgd2hpbGUgKFRSVUUpIHsNCisgICAgICAgIGludDMyX3QgcmVhZFJlcyA9DQorICAgICAgICAgICAgcEdpZk1vZHVsZS0+TG9hZEZyYW1lKG1fcEdpZkNvbnRleHQsIG1fRnJhbWVDdXIsIG51bGxwdHIpOw0KKyAgICAgICAgd2hpbGUgKHJlYWRSZXMgPT0gMikgew0KKyAgICAgICAgICBGWENPREVDX1NUQVRVUyBlcnJvcl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOw0KKyAgICAgICAgICBpZiAoIUdpZlJlYWRNb3JlRGF0YShwR2lmTW9kdWxlLCBlcnJvcl9zdGF0dXMpKSB7DQorICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBlcnJvcl9zdGF0dXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsNCisgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHJlYWRSZXMgPSBwR2lmTW9kdWxlLT5Mb2FkRnJhbWUobV9wR2lmQ29udGV4dCwgbV9GcmFtZUN1ciwgbnVsbHB0cik7DQorICAgICAgICB9DQorICAgICAgICBpZiAocmVhZFJlcyA9PSAxKSB7DQorICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZYQ09ERUNfSU1BR0VfQk1QOiB7DQorICAgICAgSUNvZGVjX0JtcE1vZHVsZSogcEJtcE1vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRCbXBNb2R1bGUoKTsNCisgICAgICB3aGlsZSAoVFJVRSkgew0KKyAgICAgICAgaW50MzJfdCByZWFkUmVzID0gcEJtcE1vZHVsZS0+TG9hZEltYWdlKG1fcEJtcENvbnRleHQpOw0KKyAgICAgICAgd2hpbGUgKHJlYWRSZXMgPT0gMikgew0KKyAgICAgICAgICBGWENPREVDX1NUQVRVUyBlcnJvcl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOw0KKyAgICAgICAgICBpZiAoIUJtcFJlYWRNb3JlRGF0YShwQm1wTW9kdWxlLCBlcnJvcl9zdGF0dXMpKSB7DQorICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgICBtX3BGaWxlID0gTlVMTDsNCisgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBlcnJvcl9zdGF0dXM7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsNCisgICAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHJlYWRSZXMgPSBwQm1wTW9kdWxlLT5Mb2FkSW1hZ2UobV9wQm1wQ29udGV4dCk7DQorICAgICAgICB9DQorICAgICAgICBpZiAocmVhZFJlcyA9PSAxKSB7DQorICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZYQ09ERUNfSU1BR0VfVElGOiB7DQorICAgICAgSUNvZGVjX1RpZmZNb2R1bGUqIHBUaWZmTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldFRpZmZNb2R1bGUoKTsNCisgICAgICBGWF9CT09MIHJldCA9IEZBTFNFOw0KKyAgICAgIGlmIChtX3BEZXZpY2VCaXRtYXAtPkdldEJQUCgpID09IDMyICYmDQorICAgICAgICAgIG1fcERldmljZUJpdG1hcC0+R2V0V2lkdGgoKSA9PSBtX1NyY1dpZHRoICYmIG1fU3JjV2lkdGggPT0gbV9zaXplWCAmJg0KKyAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAtPkdldEhlaWdodCgpID09IG1fU3JjSGVpZ2h0ICYmDQorICAgICAgICAgIG1fU3JjSGVpZ2h0ID09IG1fc2l6ZVkgJiYgbV9zdGFydFggPT0gMCAmJiBtX3N0YXJ0WSA9PSAwICYmDQorICAgICAgICAgIG1fY2xpcEJveC5sZWZ0ID09IDAgJiYgbV9jbGlwQm94LnRvcCA9PSAwICYmDQorICAgICAgICAgIG1fY2xpcEJveC5yaWdodCA9PSBtX1NyY1dpZHRoICYmIG1fY2xpcEJveC5ib3R0b20gPT0gbV9TcmNIZWlnaHQpIHsNCisgICAgICAgIHJldCA9IHBUaWZmTW9kdWxlLT5EZWNvZGUobV9wVGlmZkNvbnRleHQsIG1fcERldmljZUJpdG1hcCk7DQorICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICBpZiAoIXJldCkgew0KKyAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJPUjsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9ESUJpdG1hcCogcERJQml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsNCisgICAgICAgIHBESUJpdG1hcC0+Q3JlYXRlKG1fU3JjV2lkdGgsIG1fU3JjSGVpZ2h0LCBGWERJQl9BcmdiKTsNCisgICAgICAgIGlmIChwRElCaXRtYXAtPkdldEJ1ZmZlcigpID09IE5VTEwpIHsNCisgICAgICAgICAgZGVsZXRlIHBESUJpdG1hcDsNCisgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgICB9DQorICAgICAgICByZXQgPSBwVGlmZk1vZHVsZS0+RGVjb2RlKG1fcFRpZmZDb250ZXh0LCBwRElCaXRtYXApOw0KKyAgICAgICAgaWYgKCFyZXQpIHsNCisgICAgICAgICAgZGVsZXRlIHBESUJpdG1hcDsNCisgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX0RJQml0bWFwKiBwQ2xpcEJpdG1hcCA9DQorICAgICAgICAgICAgKG1fY2xpcEJveC5sZWZ0ID09IDAgJiYgbV9jbGlwQm94LnRvcCA9PSAwICYmDQorICAgICAgICAgICAgIG1fY2xpcEJveC5yaWdodCA9PSBtX1NyY1dpZHRoICYmIG1fY2xpcEJveC5ib3R0b20gPT0gbV9TcmNIZWlnaHQpDQorICAgICAgICAgICAgICAgID8gcERJQml0bWFwDQorICAgICAgICAgICAgICAgIDogcERJQml0bWFwLT5DbG9uZSgmbV9jbGlwQm94KTsNCisgICAgICAgIGlmIChwRElCaXRtYXAgIT0gcENsaXBCaXRtYXApIHsNCisgICAgICAgICAgZGVsZXRlIHBESUJpdG1hcDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwQ2xpcEJpdG1hcCA9PSBOVUxMKSB7DQorICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IE5VTEw7DQorICAgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgICByZXR1cm4gbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX0RJQml0bWFwKiBwRm9ybWF0Qml0bWFwID0gTlVMTDsNCisgICAgICAgIHN3aXRjaCAobV9wRGV2aWNlQml0bWFwLT5HZXRGb3JtYXQoKSkgew0KKyAgICAgICAgICBjYXNlIEZYRElCXzhicHBSZ2I6DQorICAgICAgICAgICAgcEZvcm1hdEJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7DQorICAgICAgICAgICAgcEZvcm1hdEJpdG1hcC0+Q3JlYXRlKHBDbGlwQml0bWFwLT5HZXRXaWR0aCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEJpdG1hcC0+R2V0SGVpZ2h0KCksIEZYRElCXzhicHBSZ2IpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBjYXNlIEZYRElCXzhicHBNYXNrOg0KKyAgICAgICAgICAgIHBGb3JtYXRCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOw0KKyAgICAgICAgICAgIHBGb3JtYXRCaXRtYXAtPkNyZWF0ZShwQ2xpcEJpdG1hcC0+R2V0V2lkdGgoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBCaXRtYXAtPkdldEhlaWdodCgpLCBGWERJQl84YnBwTWFzayk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGNhc2UgRlhESUJfUmdiOg0KKyAgICAgICAgICAgIHBGb3JtYXRCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOw0KKyAgICAgICAgICAgIHBGb3JtYXRCaXRtYXAtPkNyZWF0ZShwQ2xpcEJpdG1hcC0+R2V0V2lkdGgoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBCaXRtYXAtPkdldEhlaWdodCgpLCBGWERJQl9SZ2IpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBjYXNlIEZYRElCX1JnYjMyOg0KKyAgICAgICAgICAgIHBGb3JtYXRCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOw0KKyAgICAgICAgICAgIHBGb3JtYXRCaXRtYXAtPkNyZWF0ZShwQ2xpcEJpdG1hcC0+R2V0V2lkdGgoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBCaXRtYXAtPkdldEhlaWdodCgpLCBGWERJQl9SZ2IzMik7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGNhc2UgRlhESUJfQXJnYjoNCisgICAgICAgICAgICBwRm9ybWF0Qml0bWFwID0gcENsaXBCaXRtYXA7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGRlZmF1bHQ6Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgc3dpdGNoIChtX3BEZXZpY2VCaXRtYXAtPkdldEZvcm1hdCgpKSB7DQorICAgICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYjoNCisgICAgICAgICAgY2FzZSBGWERJQl84YnBwTWFzazogew0KKyAgICAgICAgICAgIGZvciAoaW50MzJfdCByb3cgPSAwOyByb3cgPCBwQ2xpcEJpdG1hcC0+R2V0SGVpZ2h0KCk7IHJvdysrKSB7DQorICAgICAgICAgICAgICB1aW50OF90KiBzcmNfbGluZSA9ICh1aW50OF90KilwQ2xpcEJpdG1hcC0+R2V0U2NhbmxpbmUocm93KTsNCisgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc19saW5lID0gKHVpbnQ4X3QqKXBGb3JtYXRCaXRtYXAtPkdldFNjYW5saW5lKHJvdyk7DQorICAgICAgICAgICAgICBmb3IgKGludDMyX3QgY29sID0gMDsgY29sIDwgcENsaXBCaXRtYXAtPkdldFdpZHRoKCk7IGNvbCsrKSB7DQorICAgICAgICAgICAgICAgIHVpbnQ4X3QgX2EgPSAyNTUgLSBzcmNfbGluZVszXTsNCisgICAgICAgICAgICAgICAgdWludDhfdCBiID0gKHNyY19saW5lWzBdICogc3JjX2xpbmVbM10gKyAweEZGICogX2EpIC8gMjU1Ow0KKyAgICAgICAgICAgICAgICB1aW50OF90IGcgPSAoc3JjX2xpbmVbMV0gKiBzcmNfbGluZVszXSArIDB4RkYgKiBfYSkgLyAyNTU7DQorICAgICAgICAgICAgICAgIHVpbnQ4X3QgciA9IChzcmNfbGluZVsyXSAqIHNyY19saW5lWzNdICsgMHhGRiAqIF9hKSAvIDI1NTsNCisgICAgICAgICAgICAgICAgKmRlc19saW5lKysgPSBGWFJHQjJHUkFZKHIsIGcsIGIpOw0KKyAgICAgICAgICAgICAgICBzcmNfbGluZSArPSA0Ow0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBicmVhazsNCisgICAgICAgICAgY2FzZSBGWERJQl9SZ2I6DQorICAgICAgICAgIGNhc2UgRlhESUJfUmdiMzI6IHsNCisgICAgICAgICAgICBpbnQzMl90IGRlc0JwcCA9DQorICAgICAgICAgICAgICAgIChtX3BEZXZpY2VCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCX1JnYikgPyAzIDogNDsNCisgICAgICAgICAgICBmb3IgKGludDMyX3Qgcm93ID0gMDsgcm93IDwgcENsaXBCaXRtYXAtPkdldEhlaWdodCgpOyByb3crKykgew0KKyAgICAgICAgICAgICAgdWludDhfdCogc3JjX2xpbmUgPSAodWludDhfdCopcENsaXBCaXRtYXAtPkdldFNjYW5saW5lKHJvdyk7DQorICAgICAgICAgICAgICB1aW50OF90KiBkZXNfbGluZSA9ICh1aW50OF90KilwRm9ybWF0Qml0bWFwLT5HZXRTY2FubGluZShyb3cpOw0KKyAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGNvbCA9IDA7IGNvbCA8IHBDbGlwQml0bWFwLT5HZXRXaWR0aCgpOyBjb2wrKykgew0KKyAgICAgICAgICAgICAgICB1aW50OF90IF9hID0gMjU1IC0gc3JjX2xpbmVbM107DQorICAgICAgICAgICAgICAgIHVpbnQ4X3QgYiA9IChzcmNfbGluZVswXSAqIHNyY19saW5lWzNdICsgMHhGRiAqIF9hKSAvIDI1NTsNCisgICAgICAgICAgICAgICAgdWludDhfdCBnID0gKHNyY19saW5lWzFdICogc3JjX2xpbmVbM10gKyAweEZGICogX2EpIC8gMjU1Ow0KKyAgICAgICAgICAgICAgICB1aW50OF90IHIgPSAoc3JjX2xpbmVbMl0gKiBzcmNfbGluZVszXSArIDB4RkYgKiBfYSkgLyAyNTU7DQorICAgICAgICAgICAgICAgICpkZXNfbGluZSsrID0gYjsNCisgICAgICAgICAgICAgICAgKmRlc19saW5lKysgPSBnOw0KKyAgICAgICAgICAgICAgICAqZGVzX2xpbmUrKyA9IHI7DQorICAgICAgICAgICAgICAgIGRlc19saW5lICs9IGRlc0JwcCAtIDM7DQorICAgICAgICAgICAgICAgIHNyY19saW5lICs9IDQ7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgICBkZWZhdWx0OjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwQ2xpcEJpdG1hcCAhPSBwRm9ybWF0Qml0bWFwKSB7DQorICAgICAgICAgIGRlbGV0ZSBwQ2xpcEJpdG1hcDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwRm9ybWF0Qml0bWFwID09IE5VTEwpIHsNCisgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgICB9DQorICAgICAgICBDRlhfRElCaXRtYXAqIHBTdHJlY2hCaXRtYXAgPSBwRm9ybWF0Qml0bWFwLT5TdHJldGNoVG8oDQorICAgICAgICAgICAgbV9zaXplWCwgbV9zaXplWSwgbV9iSW50ZXJwb2wgPyBGWERJQl9JTlRFUlBPTCA6IEZYRElCX0RPV05TQU1QTEUpOw0KKyAgICAgICAgZGVsZXRlIHBGb3JtYXRCaXRtYXA7DQorICAgICAgICBwRm9ybWF0Qml0bWFwID0gTlVMTDsNCisgICAgICAgIGlmIChwU3RyZWNoQml0bWFwID09IE5VTEwpIHsNCisgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgICAgbV9wRmlsZSA9IE5VTEw7DQorICAgICAgICAgIHJldHVybiBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7DQorICAgICAgICB9DQorICAgICAgICBtX3BEZXZpY2VCaXRtYXAtPlRyYW5zZmVyQml0bWFwKG1fc3RhcnRYLCBtX3N0YXJ0WSwgbV9zaXplWCwgbV9zaXplWSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVjaEJpdG1hcCwgMCwgMCk7DQorICAgICAgICBkZWxldGUgcFN0cmVjaEJpdG1hcDsNCisgICAgICAgIHBTdHJlY2hCaXRtYXAgPSBOVUxMOw0KKyAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gTlVMTDsNCisgICAgICAgIG1fcEZpbGUgPSBOVUxMOw0KKyAgICAgICAgcmV0dXJuIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7DQorfQ0KK0lDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIqIENDb2RlY19Nb2R1bGVNZ3I6OkNyZWF0ZVByb2dyZXNzaXZlRGVjb2RlcigpIHsNCisgIHJldHVybiBuZXcgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcih0aGlzKTsNCit9DQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19wcm9ncmVzcy5oIGIvY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19wcm9ncmVzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZThiMzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3Byb2dyZXNzLmgKQEAgLTAsMCArMSwyMjMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhfQ09ERUNfUFJPR1JFU1NfSF8NCisjZGVmaW5lIF9GWF9DT0RFQ19QUk9HUkVTU19IXw0KKyNkZWZpbmUgRlhDT0RFQ19CTE9DS19TSVpFIDQwOTYNCisjZGVmaW5lIEZYQ09ERUNfUE5HX0dBTU1BIDIuMg0KKyNpZiBfRlhfT1NfID09IF9GWF9NQUNPU1hfIHx8IF9GWF9PU18gPT0gX0ZYX0lPU18NCisjdW5kZWYgRlhDT0RFQ19QTkdfR0FNTUENCisjZGVmaW5lIEZYQ09ERUNfUE5HX0dBTU1BIDEuNw0KKyNlbmRpZg0KK3N0cnVjdCBQaXhlbFdlaWdodCB7DQorICBpbnQgbV9TcmNTdGFydDsNCisgIGludCBtX1NyY0VuZDsNCisgIGludCBtX1dlaWdodHNbMV07DQorfTsNCitjbGFzcyBDRlhDT0RFQ19XZWlnaHRUYWJsZSB7DQorIHB1YmxpYzoNCisgIENGWENPREVDX1dlaWdodFRhYmxlKCkgeyBtX3BXZWlnaHRUYWJsZXMgPSBOVUxMOyB9DQorICB+Q0ZYQ09ERUNfV2VpZ2h0VGFibGUoKSB7DQorICAgIGlmIChtX3BXZWlnaHRUYWJsZXMgIT0gTlVMTCkgew0KKyAgICAgIEZYX0ZyZWUobV9wV2VpZ2h0VGFibGVzKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgdm9pZCBDYWxjKGludCBkZXN0X2xlbiwNCisgICAgICAgICAgICBpbnQgZGVzdF9taW4sDQorICAgICAgICAgICAgaW50IGRlc3RfbWF4LA0KKyAgICAgICAgICAgIGludCBzcmNfbGVuLA0KKyAgICAgICAgICAgIGludCBzcmNfbWluLA0KKyAgICAgICAgICAgIGludCBzcmNfbWF4LA0KKyAgICAgICAgICAgIEZYX0JPT0wgYkludGVycG9sKTsNCisgIFBpeGVsV2VpZ2h0KiBHZXRQaXhlbFdlaWdodChpbnQgcGl4ZWwpIHsNCisgICAgcmV0dXJuIChQaXhlbFdlaWdodCopKG1fcFdlaWdodFRhYmxlcyArIChwaXhlbCAtIG1fRGVzdE1pbikgKiBtX0l0ZW1TaXplKTsNCisgIH0NCisNCisgIGludCBtX0Rlc3RNaW4sIG1fSXRlbVNpemU7DQorICB1aW50OF90KiBtX3BXZWlnaHRUYWJsZXM7DQorfTsNCitjbGFzcyBDRlhDT0RFQ19Ib3J6VGFibGUgew0KKyBwdWJsaWM6DQorICBDRlhDT0RFQ19Ib3J6VGFibGUoKSB7IG1fcFdlaWdodFRhYmxlcyA9IE5VTEw7IH0NCisgIH5DRlhDT0RFQ19Ib3J6VGFibGUoKSB7DQorICAgIGlmIChtX3BXZWlnaHRUYWJsZXMgIT0gTlVMTCkgew0KKyAgICAgIEZYX0ZyZWUobV9wV2VpZ2h0VGFibGVzKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgdm9pZCBDYWxjKGludCBkZXN0X2xlbiwgaW50IHNyY19sZW4sIEZYX0JPT0wgYkludGVycG9sKTsNCisgIFBpeGVsV2VpZ2h0KiBHZXRQaXhlbFdlaWdodChpbnQgcGl4ZWwpIHsNCisgICAgcmV0dXJuIChQaXhlbFdlaWdodCopKG1fcFdlaWdodFRhYmxlcyArIHBpeGVsICogbV9JdGVtU2l6ZSk7DQorICB9DQorDQorICBpbnQgbV9JdGVtU2l6ZTsNCisgIHVpbnQ4X3QqIG1fcFdlaWdodFRhYmxlczsNCit9Ow0KK2NsYXNzIENGWENPREVDX1ZlcnRUYWJsZSB7DQorIHB1YmxpYzoNCisgIENGWENPREVDX1ZlcnRUYWJsZSgpIHsgbV9wV2VpZ2h0VGFibGVzID0gTlVMTDsgfQ0KKyAgfkNGWENPREVDX1ZlcnRUYWJsZSgpIHsNCisgICAgaWYgKG1fcFdlaWdodFRhYmxlcyAhPSBOVUxMKSB7DQorICAgICAgRlhfRnJlZShtX3BXZWlnaHRUYWJsZXMpOw0KKyAgICB9DQorICB9DQorICB2b2lkIENhbGMoaW50IGRlc3RfbGVuLCBpbnQgc3JjX2xlbik7DQorICBQaXhlbFdlaWdodCogR2V0UGl4ZWxXZWlnaHQoaW50IHBpeGVsKSB7DQorICAgIHJldHVybiAoUGl4ZWxXZWlnaHQqKShtX3BXZWlnaHRUYWJsZXMgKyBwaXhlbCAqIG1fSXRlbVNpemUpOw0KKyAgfQ0KKyAgaW50IG1fSXRlbVNpemU7DQorICB1aW50OF90KiBtX3BXZWlnaHRUYWJsZXM7DQorfTsNCitlbnVtIEZYQ29kZWNfRm9ybWF0IHsNCisgIEZYQ29kZWNfSW52YWxpZCA9IDAsDQorICBGWENvZGVjXzFicHBHcmF5ID0gMHgxMDEsDQorICBGWENvZGVjXzFicHBSZ2IgPSAweDAwMSwNCisgIEZYQ29kZWNfOGJwcEdyYXkgPSAweDEwOCwNCisgIEZYQ29kZWNfOGJwcFJnYiA9IDB4MDA4LA0KKyAgRlhDb2RlY19SZ2IgPSAweDAxOCwNCisgIEZYQ29kZWNfUmdiMzIgPSAweDAyMCwNCisgIEZYQ29kZWNfQXJnYiA9IDB4MjIwLA0KKyAgRlhDb2RlY19DbXlrID0gMHgxMjANCit9Ow0KK2NsYXNzIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIgOiBwdWJsaWMgSUNvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciB7DQorIHB1YmxpYzoNCisgIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIoQ0NvZGVjX01vZHVsZU1nciogcENvZGVjTWdyKTsNCisgIH5DQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyKCkgb3ZlcnJpZGU7DQorDQorICBGWENPREVDX1NUQVRVUyBMb2FkSW1hZ2VJbmZvKElGWF9GaWxlUmVhZCogcEZpbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQ09ERUNfSU1BR0VfVFlQRSBpbWFnZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpIG92ZXJyaWRlOw0KKw0KKyAgRlhDT0RFQ19JTUFHRV9UWVBFIEdldFR5cGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtX2ltYWdUeXBlOyB9DQorICBpbnQzMl90IEdldFdpZHRoKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbV9TcmNXaWR0aDsgfQ0KKyAgaW50MzJfdCBHZXRIZWlnaHQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtX1NyY0hlaWdodDsgfQ0KKyAgaW50MzJfdCBHZXROdW1Db21wb25lbnRzKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbV9TcmNDb21wb25lbnRzOyB9DQorICBpbnQzMl90IEdldEJQQygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1fU3JjQlBDOyB9DQorICB2b2lkIFNldENsaXBCb3goRlhfUkVDVCogY2xpcCkgb3ZlcnJpZGU7DQorDQorICBGWENPREVDX1NUQVRVUyBHZXRGcmFtZXMoaW50MzJfdCYgZnJhbWVzLCBJRlhfUGF1c2UqIHBQYXVzZSkgb3ZlcnJpZGU7DQorICBGWENPREVDX1NUQVRVUyBTdGFydERlY29kZShDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW50ZXJwb2wpIG92ZXJyaWRlOw0KKw0KKyAgRlhDT0RFQ19TVEFUVVMgQ29udGludWVEZWNvZGUoSUZYX1BhdXNlKiBwUGF1c2UpIG92ZXJyaWRlOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBzdGF0aWMgRlhfQk9PTCBQbmdSZWFkSGVhZGVyRnVuYyh2b2lkKiBwTW9kdWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBicGMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29sb3JfdHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZ2FtbWEpOw0KKyAgc3RhdGljIEZYX0JPT0wgUG5nQXNrU2NhbmxpbmVCdWZGdW5jKHZvaWQqIHBNb2R1bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIHNyY19idWYpOw0KKyAgc3RhdGljIHZvaWQgUG5nRmlsbFNjYW5saW5lQnVmQ29tcGxldGVkRnVuYyh2b2lkKiBwTW9kdWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUpOw0KKyAgc3RhdGljIHZvaWQgR2lmUmVjb3JkQ3VycmVudFBvc2l0aW9uQ2FsbGJhY2sodm9pZCogcE1vZHVsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBjdXJfcG9zKTsNCisgIHN0YXRpYyB1aW50OF90KiBHaWZBc2tMb2NhbFBhbGV0dGVCdWZDYWxsYmFjayh2b2lkKiBwTW9kdWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVfbnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGFsX3NpemUpOw0KKyAgc3RhdGljIEZYX0JPT0wgR2lmSW5wdXRSZWNvcmRQb3NpdGlvbkJ1ZkNhbGxiYWNrKHZvaWQqIHBNb2R1bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgcmNkX3BvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUJiBpbWdfcmMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwYWxfbnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhbF9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZWxheV90aW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgdXNlcl9pbnB1dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRyYW5zX2luZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGlzcG9zYWxfbWV0aG9kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaW50ZXJsYWNlKTsNCisgIHN0YXRpYyB2b2lkIEdpZlJlYWRTY2FubGluZUNhbGxiYWNrKHZvaWQqIHBNb2R1bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJvd19udW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByb3dfYnVmKTsNCisgIHN0YXRpYyBGWF9CT09MIEJtcElucHV0SW1hZ2VQb3NpdGlvbkJ1ZkNhbGxiYWNrKHZvaWQqIHBNb2R1bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCByY2RfcG9zKTsNCisgIHN0YXRpYyB2b2lkIEJtcFJlYWRTY2FubGluZUNhbGxiYWNrKHZvaWQqIHBNb2R1bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJvd19udW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByb3dfYnVmKTsNCisNCisgIEZYX0JPT0wgRGV0ZWN0SW1hZ2VUeXBlKEZYQ09ERUNfSU1BR0VfVFlQRSBpbWFnZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKTsNCisgIHZvaWQgR2V0RG93blNjYWxlKGludCYgZG93bl9zY2FsZSk7DQorICB2b2lkIEdldFRyYW5zTWV0aG9kKEZYRElCX0Zvcm1hdCBkZXNfZm9ybWF0LCBGWENvZGVjX0Zvcm1hdCBzcmNfZm9ybWF0KTsNCisgIHZvaWQgUmVTYW1wbGVTY2FubGluZShDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZXNfbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfc2NhbiwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWENvZGVjX0Zvcm1hdCBzcmNfZm9ybWF0KTsNCisgIHZvaWQgUmVzYW1wbGUoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlQml0bWFwLA0KKyAgICAgICAgICAgICAgICBpbnQzMl90IHNyY19saW5lLA0KKyAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfc2NhbiwNCisgICAgICAgICAgICAgICAgRlhDb2RlY19Gb3JtYXQgc3JjX2Zvcm1hdCk7DQorICB2b2lkIFJlc2FtcGxlVmVydChDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsIGRvdWJsZSBzY2FsZV95LCBpbnQgZGVzX3Jvdyk7DQorICBGWF9CT09MIEpwZWdSZWFkTW9yZURhdGEoSUNvZGVjX0pwZWdNb2R1bGUqIHBKcGVnTW9kdWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQ09ERUNfU1RBVFVTJiBlcnJfc3RhdHVzKTsNCisgIHZvaWQgUG5nT25lT25lTWFwUmVzYW1wbGVIb3J6KENGWF9ESUJpdG1hcCogcERldmljZUJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGVzX2xpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfc2NhbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQ29kZWNfRm9ybWF0IHNyY19mb3JtYXQpOw0KKyAgRlhfQk9PTCBHaWZSZWFkTW9yZURhdGEoSUNvZGVjX0dpZk1vZHVsZSogcEdpZk1vZHVsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQ09ERUNfU1RBVFVTJiBlcnJfc3RhdHVzKTsNCisgIHZvaWQgR2lmRG91YmxlTGluZVJlc2FtcGxlVmVydChDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHNjYWxlX3ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc19yb3cpOw0KKyAgRlhfQk9PTCBCbXBSZWFkTW9yZURhdGEoSUNvZGVjX0JtcE1vZHVsZSogcEJtcE1vZHVsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQ09ERUNfU1RBVFVTJiBlcnJfc3RhdHVzKTsNCisgIHZvaWQgUmVzYW1wbGVWZXJ0QlQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlQml0bWFwLCBkb3VibGUgc2NhbGVfeSwgaW50IGRlc19yb3cpOw0KKw0KKyBwdWJsaWM6DQorICBJRlhfRmlsZVJlYWQqIG1fcEZpbGU7DQorICBDQ29kZWNfTW9kdWxlTWdyKiBtX3BDb2RlY01ncjsNCisgIHZvaWQqIG1fcEpwZWdDb250ZXh0Ow0KKyAgdm9pZCogbV9wUG5nQ29udGV4dDsNCisgIHZvaWQqIG1fcEdpZkNvbnRleHQ7DQorICB2b2lkKiBtX3BCbXBDb250ZXh0Ow0KKyAgdm9pZCogbV9wVGlmZkNvbnRleHQ7DQorICBGWENPREVDX0lNQUdFX1RZUEUgbV9pbWFnVHlwZTsNCisgIEZYX0RXT1JEIG1fb2ZmU2V0Ow0KKyAgdWludDhfdCogbV9wU3JjQnVmOw0KKyAgRlhfRFdPUkQgbV9TcmNTaXplOw0KKyAgdWludDhfdCogbV9wRGVjb2RlQnVmOw0KKyAgaW50IG1fU2NhbmxpbmVTaXplOw0KKyAgQ0ZYX0RJQml0bWFwKiBtX3BEZXZpY2VCaXRtYXA7DQorICBGWF9CT09MIG1fYkludGVycG9sOw0KKyAgQ0ZYQ09ERUNfV2VpZ2h0VGFibGUgbV9XZWlnaHRIb3J6Ow0KKyAgQ0ZYQ09ERUNfVmVydFRhYmxlIG1fV2VpZ2h0VmVydDsNCisgIENGWENPREVDX0hvcnpUYWJsZSBtX1dlaWdodEhvcnpPTzsNCisgIGludCBtX1NyY1dpZHRoOw0KKyAgaW50IG1fU3JjSGVpZ2h0Ow0KKyAgaW50IG1fU3JjQ29tcG9uZW50czsNCisgIGludCBtX1NyY0JQQzsNCisgIEZYX1JFQ1QgbV9jbGlwQm94Ow0KKyAgaW50IG1fc3RhcnRYOw0KKyAgaW50IG1fc3RhcnRZOw0KKyAgaW50IG1fc2l6ZVg7DQorICBpbnQgbV9zaXplWTsNCisgIGludCBtX1RyYW5zTWV0aG9kOw0KKyAgRlhfQVJHQiogbV9wU3JjUGFsZXR0ZTsNCisgIGludCBtX1NyY1BhbGV0dGVOdW1iZXI7DQorICBpbnQgbV9TcmNSb3c7DQorICBGWENvZGVjX0Zvcm1hdCBtX1NyY0Zvcm1hdDsNCisgIGludCBtX1NyY1Bhc3NOdW1iZXI7DQorICBpbnQgbV9GcmFtZU51bWJlcjsNCisgIGludCBtX0ZyYW1lQ3VyOw0KKyAgaW50IG1fR2lmQmdJbmRleDsNCisgIHVpbnQ4X3QqIG1fcEdpZlBhbGV0dGU7DQorICBpbnQzMl90IG1fR2lmUGx0TnVtYmVyOw0KKyAgaW50IG1fR2lmVHJhbnNJbmRleDsNCisgIEZYX1JFQ1QgbV9HaWZGcmFtZVJlY3Q7DQorICBGWF9CT09MIG1fQm1wSXNUb3BCb3R0b207DQorICBGWENPREVDX1NUQVRVUyBtX3N0YXR1czsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfdGlmZi5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3RpZmYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNThjMDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3RpZmYuY3BwCkBAIC0wLDAgKzEsNTQ0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIg0KKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9kaWIuaCINCisjaW5jbHVkZSAiY29kZWNfaW50LmgiDQorDQorZXh0ZXJuICJDIiB7DQorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xpYnRpZmYvdGlmZmlvcC5oIg0KK30NCisNCit2b2lkKiBJY2NMaWJfQ3JlYXRlVHJhbnNmb3JtX3NSR0IoY29uc3QgdW5zaWduZWQgY2hhciogcFByb2ZpbGVEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZHdQcm9maWxlU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db21wb25lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW50ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1NyY0Zvcm1hdCA9IEljY19GT1JNQVRfREVGQVVMVCk7DQordm9pZCBJY2NMaWJfVHJhbnNsYXRlSW1hZ2Uodm9pZCogcFRyYW5zZm9ybSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBwRGVzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBwU3JjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbHMpOw0KK3ZvaWQgSWNjTGliX0Rlc3Ryb3lUcmFuc2Zvcm0odm9pZCogcFRyYW5zZm9ybSk7DQorY2xhc3MgQ0NvZGVjX1RpZmZDb250ZXh0IHsNCisgcHVibGljOg0KKyAgQ0NvZGVjX1RpZmZDb250ZXh0KCk7DQorICB+Q0NvZGVjX1RpZmZDb250ZXh0KCk7DQorDQorICBGWF9CT09MIEluaXREZWNvZGVyKElGWF9GaWxlUmVhZCogZmlsZV9wdHIpOw0KKyAgdm9pZCBHZXRGcmFtZXMoaW50MzJfdCYgZnJhbWVzKTsNCisgIEZYX0JPT0wgTG9hZEZyYW1lSW5mbyhpbnQzMl90IGZyYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBjb21wcywNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgYnBjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpOw0KKyAgRlhfQk9PTCBEZWNvZGUoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXApOw0KKw0KKyAgdW5pb24gew0KKyAgICBJRlhfRmlsZVJlYWQqIGluOw0KKyAgICBJRlhfRmlsZVN0cmVhbSogb3V0Ow0KKyAgfSBpbzsNCisNCisgIEZYX0RXT1JEIG9mZnNldDsNCisNCisgIFRJRkYqIHRpZl9jdHg7DQorICB2b2lkKiBpY2NfY3R4Ow0KKyAgaW50MzJfdCBmcmFtZV9udW07DQorICBpbnQzMl90IGZyYW1lX2N1cjsNCisgIEZYX0JPT0wgaXNEZWNvZGVyOw0KKw0KKyBwcml2YXRlOg0KKyAgRlhfQk9PTCBpc1N1cHBvcnQoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXApOw0KKyAgdm9pZCBTZXRQYWxldHRlKENGWF9ESUJpdG1hcCogcERJQml0bWFwLCB1aW50MTZfdCBicHMpOw0KKyAgRlhfQk9PTCBEZWNvZGUxYnBwUkdCKENGWF9ESUJpdG1hcCogcERJQml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYnBzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNwcCk7DQorICBGWF9CT09MIERlY29kZThicHBSR0IoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBicHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3BwKTsNCisgIEZYX0JPT0wgRGVjb2RlMjRicHBSR0IoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBicHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNwcCk7DQorfTsNCitDQ29kZWNfVGlmZkNvbnRleHQ6OkNDb2RlY19UaWZmQ29udGV4dCgpIHsNCisgIG9mZnNldCA9IDA7DQorICBmcmFtZV9udW0gPSAwOw0KKyAgZnJhbWVfY3VyID0gMDsNCisgIGlvLmluID0gTlVMTDsNCisgIHRpZl9jdHggPSBOVUxMOw0KKyAgaWNjX2N0eCA9IE5VTEw7DQorICBpc0RlY29kZXIgPSBUUlVFOw0KK30NCitDQ29kZWNfVGlmZkNvbnRleHQ6On5DQ29kZWNfVGlmZkNvbnRleHQoKSB7DQorICBpZiAoaWNjX2N0eCkgew0KKyAgICBJY2NMaWJfRGVzdHJveVRyYW5zZm9ybShpY2NfY3R4KTsNCisgICAgaWNjX2N0eCA9IE5VTEw7DQorICB9DQorICBpZiAodGlmX2N0eCkgew0KKyAgICBUSUZGQ2xvc2UodGlmX2N0eCk7DQorICB9DQorfQ0KK3N0YXRpYyB0c2l6ZV90IF90aWZmX3JlYWQodGhhbmRsZV90IGNvbnRleHQsIHRkYXRhX3QgYnVmLCB0c2l6ZV90IGxlbmd0aCkgew0KKyAgQ0NvZGVjX1RpZmZDb250ZXh0KiBwVGlmZkNvbnRleHQgPSAoQ0NvZGVjX1RpZmZDb250ZXh0Kiljb250ZXh0Ow0KKyAgRlhfQk9PTCByZXQgPSBGQUxTRTsNCisgIGlmIChwVGlmZkNvbnRleHQtPmlzRGVjb2Rlcikgew0KKyAgICByZXQgPSBwVGlmZkNvbnRleHQtPmlvLmluLT5SZWFkQmxvY2soYnVmLCBwVGlmZkNvbnRleHQtPm9mZnNldCwgbGVuZ3RoKTsNCisgIH0gZWxzZSB7DQorICAgIHJldCA9IHBUaWZmQ29udGV4dC0+aW8ub3V0LT5SZWFkQmxvY2soYnVmLCBwVGlmZkNvbnRleHQtPm9mZnNldCwgbGVuZ3RoKTsNCisgIH0NCisgIGlmICghcmV0KSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgcFRpZmZDb250ZXh0LT5vZmZzZXQgKz0gKEZYX0RXT1JEKWxlbmd0aDsNCisgIHJldHVybiBsZW5ndGg7DQorfQ0KK3N0YXRpYyB0c2l6ZV90IF90aWZmX3dyaXRlKHRoYW5kbGVfdCBjb250ZXh0LCB0ZGF0YV90IGJ1ZiwgdHNpemVfdCBsZW5ndGgpIHsNCisgIENDb2RlY19UaWZmQ29udGV4dCogcFRpZmZDb250ZXh0ID0gKENDb2RlY19UaWZmQ29udGV4dCopY29udGV4dDsNCisgIEFTU0VSVCghcFRpZmZDb250ZXh0LT5pc0RlY29kZXIpOw0KKyAgaWYgKCFwVGlmZkNvbnRleHQtPmlvLm91dC0+V3JpdGVCbG9jayhidWYsIHBUaWZmQ29udGV4dC0+b2Zmc2V0LCBsZW5ndGgpKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgcFRpZmZDb250ZXh0LT5vZmZzZXQgKz0gKEZYX0RXT1JEKWxlbmd0aDsNCisgIHJldHVybiBsZW5ndGg7DQorfQ0KK3N0YXRpYyB0b2ZmX3QgX3RpZmZfc2Vlayh0aGFuZGxlX3QgY29udGV4dCwgdG9mZl90IG9mZnNldCwgaW50IHdoZW5jZSkgew0KKyAgQ0NvZGVjX1RpZmZDb250ZXh0KiBwVGlmZkNvbnRleHQgPSAoQ0NvZGVjX1RpZmZDb250ZXh0Kiljb250ZXh0Ow0KKyAgc3dpdGNoICh3aGVuY2UpIHsNCisgICAgY2FzZSAwOg0KKyAgICAgIHBUaWZmQ29udGV4dC0+b2Zmc2V0ID0gKEZYX0RXT1JEKW9mZnNldDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAxOg0KKyAgICAgIHBUaWZmQ29udGV4dC0+b2Zmc2V0ICs9IChGWF9EV09SRClvZmZzZXQ7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMjoNCisgICAgICBpZiAocFRpZmZDb250ZXh0LT5pc0RlY29kZXIpIHsNCisgICAgICAgIGlmIChwVGlmZkNvbnRleHQtPmlvLmluLT5HZXRTaXplKCkgPCAoRlhfRklMRVNJWkUpb2Zmc2V0KSB7DQorICAgICAgICAgIHJldHVybiAtMTsNCisgICAgICAgIH0NCisgICAgICAgIHBUaWZmQ29udGV4dC0+b2Zmc2V0ID0NCisgICAgICAgICAgICAoRlhfRFdPUkQpKHBUaWZmQ29udGV4dC0+aW8uaW4tPkdldFNpemUoKSAtIG9mZnNldCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChwVGlmZkNvbnRleHQtPmlvLm91dC0+R2V0U2l6ZSgpIDwgKEZYX0ZJTEVTSVpFKW9mZnNldCkgew0KKyAgICAgICAgICByZXR1cm4gLTE7DQorICAgICAgICB9DQorICAgICAgICBwVGlmZkNvbnRleHQtPm9mZnNldCA9DQorICAgICAgICAgICAgKEZYX0RXT1JEKShwVGlmZkNvbnRleHQtPmlvLm91dC0+R2V0U2l6ZSgpIC0gb2Zmc2V0KTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgQVNTRVJUKHBUaWZmQ29udGV4dC0+aXNEZWNvZGVyID8gKHBUaWZmQ29udGV4dC0+b2Zmc2V0IDw9DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0RXT1JEKXBUaWZmQ29udGV4dC0+aW8uaW4tPkdldFNpemUoKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFRSVUUpOw0KKyAgcmV0dXJuIHBUaWZmQ29udGV4dC0+b2Zmc2V0Ow0KK30NCitzdGF0aWMgaW50IF90aWZmX2Nsb3NlKHRoYW5kbGVfdCBjb250ZXh0KSB7DQorICByZXR1cm4gMDsNCit9DQorc3RhdGljIHRvZmZfdCBfdGlmZl9nZXRfc2l6ZSh0aGFuZGxlX3QgY29udGV4dCkgew0KKyAgQ0NvZGVjX1RpZmZDb250ZXh0KiBwVGlmZkNvbnRleHQgPSAoQ0NvZGVjX1RpZmZDb250ZXh0Kiljb250ZXh0Ow0KKyAgcmV0dXJuIHBUaWZmQ29udGV4dC0+aXNEZWNvZGVyID8gKHRvZmZfdClwVGlmZkNvbnRleHQtPmlvLmluLT5HZXRTaXplKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICh0b2ZmX3QpcFRpZmZDb250ZXh0LT5pby5vdXQtPkdldFNpemUoKTsNCit9DQorc3RhdGljIGludCBfdGlmZl9tYXAodGhhbmRsZV90IGNvbnRleHQsIHRkYXRhX3QqLCB0b2ZmX3QqKSB7DQorICByZXR1cm4gMDsNCit9DQorc3RhdGljIHZvaWQgX3RpZmZfdW5tYXAodGhhbmRsZV90IGNvbnRleHQsIHRkYXRhX3QsIHRvZmZfdCkge30NCitUSUZGKiBfdGlmZl9vcGVuKHZvaWQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIG1vZGUpIHsNCisgIFRJRkYqIHRpZiA9IFRJRkZDbGllbnRPcGVuKCJUaWZmIEltYWdlIiwgbW9kZSwgKHRoYW5kbGVfdCljb250ZXh0LCBfdGlmZl9yZWFkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RpZmZfd3JpdGUsIF90aWZmX3NlZWssIF90aWZmX2Nsb3NlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RpZmZfZ2V0X3NpemUsIF90aWZmX21hcCwgX3RpZmZfdW5tYXApOw0KKyAgaWYgKHRpZikgew0KKyAgICB0aWYtPnRpZl9mZCA9IChpbnQpKGludHB0cl90KWNvbnRleHQ7DQorICB9DQorICByZXR1cm4gdGlmOw0KK30NCit2b2lkKiBfVElGRm1hbGxvYyh0bXNpemVfdCBzaXplKSB7DQorICByZXR1cm4gRlhNRU1fRGVmYXVsdEFsbG9jKHNpemUsIDApOw0KK30NCit2b2lkIF9USUZGZnJlZSh2b2lkKiBwdHIpIHsNCisgIEZYTUVNX0RlZmF1bHRGcmVlKHB0ciwgMCk7DQorfQ0KK3ZvaWQqIF9USUZGcmVhbGxvYyh2b2lkKiBwdHIsIHRtc2l6ZV90IHNpemUpIHsNCisgIHJldHVybiBGWE1FTV9EZWZhdWx0UmVhbGxvYyhwdHIsIHNpemUsIDApOw0KK30NCit2b2lkIF9USUZGbWVtc2V0KHZvaWQqIHB0ciwgaW50IHZhbCwgdG1zaXplX3Qgc2l6ZSkgew0KKyAgRlhTWVNfbWVtc2V0KHB0ciwgdmFsLCAoc2l6ZV90KXNpemUpOw0KK30NCit2b2lkIF9USUZGbWVtY3B5KHZvaWQqIGRlcywgY29uc3Qgdm9pZCogc3JjLCB0bXNpemVfdCBzaXplKSB7DQorICBGWFNZU19tZW1jcHkoZGVzLCBzcmMsIChzaXplX3Qpc2l6ZSk7DQorfQ0KK2ludCBfVElGRm1lbWNtcChjb25zdCB2b2lkKiBwdHIxLCBjb25zdCB2b2lkKiBwdHIyLCB0bXNpemVfdCBzaXplKSB7DQorICByZXR1cm4gRlhTWVNfbWVtY21wKHB0cjEsIHB0cjIsIChzaXplX3Qpc2l6ZSk7DQorfQ0KKw0KK1RJRkZFcnJvckhhbmRsZXIgX1RJRkZ3YXJuaW5nSGFuZGxlciA9IG51bGxwdHI7DQorVElGRkVycm9ySGFuZGxlciBfVElGRmVycm9ySGFuZGxlciA9IG51bGxwdHI7DQorDQoraW50IFRJRkZDbXlrMlJnYih0aGFuZGxlX3QgY29udGV4dCwNCisgICAgICAgICAgICAgICAgIHVpbnQ4IGMsDQorICAgICAgICAgICAgICAgICB1aW50OCBtLA0KKyAgICAgICAgICAgICAgICAgdWludDggeSwNCisgICAgICAgICAgICAgICAgIHVpbnQ4IGssDQorICAgICAgICAgICAgICAgICB1aW50OCogciwNCisgICAgICAgICAgICAgICAgIHVpbnQ4KiBnLA0KKyAgICAgICAgICAgICAgICAgdWludDgqIGIpIHsNCisgIGlmIChjb250ZXh0ID09IE5VTEwpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBDQ29kZWNfVGlmZkNvbnRleHQqIHAgPSAoQ0NvZGVjX1RpZmZDb250ZXh0Kiljb250ZXh0Ow0KKyAgaWYgKHAtPmljY19jdHgpIHsNCisgICAgdW5zaWduZWQgY2hhciBjbXlrWzRdLCBiZ3JbM107DQorICAgIGNteWtbMF0gPSBjLCBjbXlrWzFdID0gbSwgY215a1syXSA9IHksIGNteWtbM10gPSBrOw0KKyAgICBJY2NMaWJfVHJhbnNsYXRlSW1hZ2UocC0+aWNjX2N0eCwgYmdyLCBjbXlrLCAxKTsNCisgICAgKnIgPSBiZ3JbMl0sICpnID0gYmdyWzFdLCAqYiA9IGJnclswXTsNCisgIH0gZWxzZSB7DQorICAgIEFkb2JlQ01ZS190b19zUkdCMShjLCBtLCB5LCBrLCAqciwgKmcsICpiKTsNCisgIH0NCisgIHJldHVybiAxOw0KK30NCitGWF9CT09MIENDb2RlY19UaWZmQ29udGV4dDo6SW5pdERlY29kZXIoSUZYX0ZpbGVSZWFkKiBmaWxlX3B0cikgew0KKyAgaW8uaW4gPSBmaWxlX3B0cjsNCisgIHRpZl9jdHggPSBfdGlmZl9vcGVuKHRoaXMsICJyIik7DQorICBpZiAodGlmX2N0eCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENDb2RlY19UaWZmQ29udGV4dDo6R2V0RnJhbWVzKGludDMyX3QmIGZyYW1lcykgew0KKyAgZnJhbWVzID0gZnJhbWVfbnVtID0gVElGRk51bWJlck9mRGlyZWN0b3JpZXModGlmX2N0eCk7DQorfQ0KKyNkZWZpbmUgVElGRl9FWElGX0dFVElORk8oa2V5LCBULCB0YWcpICAgICAgXA0KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICBUIHZhbCA9IChUKTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICBUSUZGR2V0RmllbGQodGlmX2N0eCwgdGFnLCAmdmFsKTsgICAgICAgXA0KKyAgICBpZiAodmFsKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICAgIChrZXkpID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZW9mKFQpKTsgXA0KKyAgICAgIGlmICgoa2V5KSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICAgICAgVCogcHRyID0gKFQqKShrZXkpOyAgICAgICAgICAgICAgICAgXA0KKyAgICAgICAgKnB0ciA9IHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICAgICAgcEV4aWYtPm1fVGFnVmFsLlNldEF0KHRhZywgKGtleSkpOyAgXA0KKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgKGtleSkgPSBOVUxMOw0KKyNkZWZpbmUgVElGRl9FWElGX0dFVFNUUklOR0lORk8oa2V5LCB0YWcpICAgIFwNCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgIEZYX0RXT1JEIHNpemUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICB1aW50OF90KiBidWYgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgVElGRkdldEZpZWxkKHRpZl9jdHgsIHRhZywgJnNpemUsICZidWYpOyBcDQorICAgIGlmIChzaXplICYmIGJ1ZikgeyAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICAgIChrZXkpID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7ICAgICAgIFwNCisgICAgICBpZiAoKGtleSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgICAgICBGWFNZU19tZW1jcHkoKGtleSksIGJ1Ziwgc2l6ZSk7ICAgICAgXA0KKyAgICAgICAgcEV4aWYtPm1fVGFnVmFsLlNldEF0KHRhZywgKGtleSkpOyAgIFwNCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgIChrZXkpID0gTlVMTDsNCisNCituYW1lc3BhY2Ugew0KKw0KK3RlbXBsYXRlIDxjbGFzcyBUPg0KK0ZYX0JPT0wgVGlmZl9FeGlmX0dldEluZm8oVElGRiogdGlmX2N0eCwgdHRhZ190IHRhZywgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHIpIHsNCisgIFQgdmFsID0gMDsNCisgIFRJRkZHZXRGaWVsZCh0aWZfY3R4LCB0YWcsICZ2YWwpOw0KKyAgaWYgKCF2YWwpDQorICAgIHJldHVybiBGQUxTRTsNCisgIFQqIHB0ciA9IEZYX0FsbG9jKFQsIDEpOw0KKyAgKnB0ciA9IHZhbDsNCisgIHBBdHRyLT5tX0V4aWZbdGFnXSA9ICh2b2lkKilwdHI7DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBUaWZmX0V4aWZfR2V0U3RyaW5nSW5mbyhUSUZGKiB0aWZfY3R4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRhZ190IHRhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyKSB7DQorICBGWF9DSEFSKiBidWYgPSBudWxscHRyOw0KKyAgVElGRkdldEZpZWxkKHRpZl9jdHgsIHRhZywgJmJ1Zik7DQorICBpZiAoIWJ1ZikNCisgICAgcmV0dXJuOw0KKyAgRlhfU1RSU0laRSBzaXplID0gRlhTWVNfc3RybGVuKGJ1Zik7DQorICB1aW50OF90KiBwdHIgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplICsgMSk7DQorICBGWFNZU19tZW1jcHkocHRyLCBidWYsIHNpemUpOw0KKyAgcHRyW3NpemVdID0gMDsNCisgIHBBdHRyLT5tX0V4aWZbdGFnXSA9IHB0cjsNCit9DQorDQorfSAgLy8gbmFtZXNwYWNlDQorDQorRlhfQk9PTCBDQ29kZWNfVGlmZkNvbnRleHQ6OkxvYWRGcmFtZUluZm8oaW50MzJfdCBmcmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgY29tcHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGJwYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKSB7DQorICBpZiAoIVRJRkZTZXREaXJlY3RvcnkodGlmX2N0eCwgKHVpbnQxNilmcmFtZSkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRlhfV09SRCB0aWZfY3M7DQorICBGWF9EV09SRCB0aWZfaWNjX3NpemUgPSAwOw0KKyAgdWludDhfdCogdGlmX2ljY19idWYgPSBOVUxMOw0KKyAgRlhfV09SRCB0aWZfYnBjID0gMDsNCisgIEZYX1dPUkQgdGlmX2NwczsNCisgIEZYX0RXT1JEIHRpZl9ycHM7DQorICB3aWR0aCA9IGhlaWdodCA9IGNvbXBzID0gMDsNCisgIFRJRkZHZXRGaWVsZCh0aWZfY3R4LCBUSUZGVEFHX0lNQUdFV0lEVEgsICZ3aWR0aCk7DQorICBUSUZGR2V0RmllbGQodGlmX2N0eCwgVElGRlRBR19JTUFHRUxFTkdUSCwgJmhlaWdodCk7DQorICBUSUZGR2V0RmllbGQodGlmX2N0eCwgVElGRlRBR19TQU1QTEVTUEVSUElYRUwsICZjb21wcyk7DQorICBUSUZGR2V0RmllbGQodGlmX2N0eCwgVElGRlRBR19CSVRTUEVSU0FNUExFLCAmdGlmX2JwYyk7DQorICBUSUZGR2V0RmllbGQodGlmX2N0eCwgVElGRlRBR19QSE9UT01FVFJJQywgJnRpZl9jcyk7DQorICBUSUZGR2V0RmllbGQodGlmX2N0eCwgVElGRlRBR19DT01QUkVTU0lPTiwgJnRpZl9jcHMpOw0KKyAgVElGRkdldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfUk9XU1BFUlNUUklQLCAmdGlmX3Jwcyk7DQorICBUSUZGR2V0RmllbGQodGlmX2N0eCwgVElGRlRBR19JQ0NQUk9GSUxFLCAmdGlmX2ljY19zaXplLCAmdGlmX2ljY19idWYpOw0KKyAgaWYgKHBBdHRyaWJ1dGUpIHsNCisgICAgcEF0dHJpYnV0ZS0+bV93RFBJVW5pdCA9IEZYQ09ERUNfUkVTVU5JVF9JTkNIOw0KKyAgICBpZiAoVElGRkdldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfUkVTT0xVVElPTlVOSVQsDQorICAgICAgICAgICAgICAgICAgICAgJnBBdHRyaWJ1dGUtPm1fd0RQSVVuaXQpKSB7DQorICAgICAgcEF0dHJpYnV0ZS0+bV93RFBJVW5pdCAtPSAxOw0KKyAgICB9DQorICAgIFRpZmZfRXhpZl9HZXRJbmZvPEZYX1dPUkQ+KHRpZl9jdHgsIFRJRkZUQUdfT1JJRU5UQVRJT04sIHBBdHRyaWJ1dGUpOw0KKyAgICBpZiAoVGlmZl9FeGlmX0dldEluZm88RlhfRkxPQVQ+KHRpZl9jdHgsIFRJRkZUQUdfWFJFU09MVVRJT04sIHBBdHRyaWJ1dGUpKSB7DQorICAgICAgdm9pZCogdmFsID0gcEF0dHJpYnV0ZS0+bV9FeGlmW1RJRkZUQUdfWFJFU09MVVRJT05dOw0KKyAgICAgIEZYX0ZMT0FUIGZEcGkgPSB2YWwgPyAqcmVpbnRlcnByZXRfY2FzdDxGWF9GTE9BVCo+KHZhbCkgOiAwOw0KKyAgICAgIHBBdHRyaWJ1dGUtPm1fblhEUEkgPSAoaW50MzJfdCkoZkRwaSArIDAuNWYpOw0KKyAgICB9DQorICAgIGlmIChUaWZmX0V4aWZfR2V0SW5mbzxGWF9GTE9BVD4odGlmX2N0eCwgVElGRlRBR19ZUkVTT0xVVElPTiwgcEF0dHJpYnV0ZSkpIHsNCisgICAgICB2b2lkKiB2YWwgPSBwQXR0cmlidXRlLT5tX0V4aWZbVElGRlRBR19ZUkVTT0xVVElPTl07DQorICAgICAgRlhfRkxPQVQgZkRwaSA9IHZhbCA/ICpyZWludGVycHJldF9jYXN0PEZYX0ZMT0FUKj4odmFsKSA6IDA7DQorICAgICAgcEF0dHJpYnV0ZS0+bV9uWURQSSA9IChpbnQzMl90KShmRHBpICsgMC41Zik7DQorICAgIH0NCisgICAgVGlmZl9FeGlmX0dldFN0cmluZ0luZm8odGlmX2N0eCwgVElGRlRBR19JTUFHRURFU0NSSVBUSU9OLCBwQXR0cmlidXRlKTsNCisgICAgVGlmZl9FeGlmX0dldFN0cmluZ0luZm8odGlmX2N0eCwgVElGRlRBR19NQUtFLCBwQXR0cmlidXRlKTsNCisgICAgVGlmZl9FeGlmX0dldFN0cmluZ0luZm8odGlmX2N0eCwgVElGRlRBR19NT0RFTCwgcEF0dHJpYnV0ZSk7DQorICB9DQorICBicGMgPSB0aWZfYnBjOw0KKyAgaWYgKHRpZl9ycHMgPiBoZWlnaHQpIHsNCisgICAgVElGRlNldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfUk9XU1BFUlNUUklQLCB0aWZfcnBzID0gaGVpZ2h0KTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIF9UaWZmQkdSQTJSR0JBKHVpbnQ4X3QqIHBCdWYsIGludDMyX3QgcGl4ZWwsIGludDMyX3Qgc3BwKSB7DQorICBmb3IgKGludDMyX3QgbiA9IDA7IG4gPCBwaXhlbDsgbisrKSB7DQorICAgIHVpbnQ4X3QgdG1wID0gcEJ1ZlswXTsNCisgICAgcEJ1ZlswXSA9IHBCdWZbMl07DQorICAgIHBCdWZbMl0gPSB0bXA7DQorICAgIHBCdWYgKz0gc3BwOw0KKyAgfQ0KK30NCitGWF9CT09MIENDb2RlY19UaWZmQ29udGV4dDo6aXNTdXBwb3J0KENGWF9ESUJpdG1hcCogcERJQml0bWFwKSB7DQorICBpZiAoVElGRklzVGlsZWQodGlmX2N0eCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgdWludDE2X3QgcGhvdG9tZXRyaWM7DQorICBpZiAoIVRJRkZHZXRGaWVsZCh0aWZfY3R4LCBUSUZGVEFHX1BIT1RPTUVUUklDLCAmcGhvdG9tZXRyaWMpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHN3aXRjaCAocERJQml0bWFwLT5HZXRCUFAoKSkgew0KKyAgICBjYXNlIDE6DQorICAgIGNhc2UgODoNCisgICAgICBpZiAocGhvdG9tZXRyaWMgIT0gUEhPVE9NRVRSSUNfUEFMRVRURSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgY2FzZSAyNDoNCisgICAgICBpZiAocGhvdG9tZXRyaWMgIT0gUEhPVE9NRVRSSUNfUkdCKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHVpbnQxNl90IHBsYW5hcmNvbmZpZzsNCisgIGlmICghVElGRkdldEZpZWxkRGVmYXVsdGVkKHRpZl9jdHgsIFRJRkZUQUdfUExBTkFSQ09ORklHLCAmcGxhbmFyY29uZmlnKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAocGxhbmFyY29uZmlnID09IFBMQU5BUkNPTkZJR19TRVBBUkFURSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDQ29kZWNfVGlmZkNvbnRleHQ6OlNldFBhbGV0dGUoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsIHVpbnQxNl90IGJwcykgew0KKyAgdWludDE2X3QgKnJlZF9vcmlnLCAqZ3JlZW5fb3JpZywgKmJsdWVfb3JpZzsNCisgIFRJRkZHZXRGaWVsZCh0aWZfY3R4LCBUSUZGVEFHX0NPTE9STUFQLCAmcmVkX29yaWcsICZncmVlbl9vcmlnLCAmYmx1ZV9vcmlnKTsNCisgIGZvciAoaW50MzJfdCBpID0gKDFMIDw8IGJwcykgLSAxOyBpID49IDA7IGktLSkgew0KKyNkZWZpbmUgQ1ZUKHgpICgodWludDE2X3QpKCh4KSA+PiA4KSkNCisgICAgcmVkX29yaWdbaV0gPSBDVlQocmVkX29yaWdbaV0pOw0KKyAgICBncmVlbl9vcmlnW2ldID0gQ1ZUKGdyZWVuX29yaWdbaV0pOw0KKyAgICBibHVlX29yaWdbaV0gPSBDVlQoYmx1ZV9vcmlnW2ldKTsNCisjdW5kZWYgQ1ZUDQorICB9DQorICBpbnQzMl90IGxlbiA9IDEgPDwgYnBzOw0KKyAgZm9yIChpbnQzMl90IGluZGV4ID0gMDsgaW5kZXggPCBsZW47IGluZGV4KyspIHsNCisgICAgRlhfRFdPUkQgciA9IHJlZF9vcmlnW2luZGV4XSAmIDB4RkY7DQorICAgIEZYX0RXT1JEIGcgPSBncmVlbl9vcmlnW2luZGV4XSAmIDB4RkY7DQorICAgIEZYX0RXT1JEIGIgPSBibHVlX29yaWdbaW5kZXhdICYgMHhGRjsNCisgICAgRlhfRFdPUkQgY29sb3IgPSAodWludDMyX3QpYiB8ICgodWludDMyX3QpZyA8PCA4KSB8ICgodWludDMyX3QpciA8PCAxNikgfA0KKyAgICAgICAgICAgICAgICAgICAgICgoKHVpbnQzMikweGZmTCkgPDwgMjQpOw0KKyAgICBwRElCaXRtYXAtPlNldFBhbGV0dGVFbnRyeShpbmRleCwgY29sb3IpOw0KKyAgfQ0KK30NCitGWF9CT09MIENDb2RlY19UaWZmQ29udGV4dDo6RGVjb2RlMWJwcFJHQihDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGJwcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzcHApIHsNCisgIGlmIChwRElCaXRtYXAtPkdldEJQUCgpICE9IDEgfHwgc3BwICE9IDEgfHwgYnBzICE9IDEgfHwNCisgICAgICAhaXNTdXBwb3J0KHBESUJpdG1hcCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgU2V0UGFsZXR0ZShwRElCaXRtYXAsIGJwcyk7DQorICBpbnQzMl90IHNpemUgPSAoaW50MzJfdClUSUZGU2NhbmxpbmVTaXplKHRpZl9jdHgpOw0KKyAgdWludDhfdCogYnVmID0gKHVpbnQ4X3QqKV9USUZGbWFsbG9jKHNpemUpOw0KKyAgaWYgKGJ1ZiA9PSBOVUxMKSB7DQorICAgIFRJRkZFcnJvcihUSUZGRmlsZU5hbWUodGlmX2N0eCksICJObyBzcGFjZSBmb3Igc2NhbmxpbmUgYnVmZmVyIik7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHVpbnQ4X3QqIGJpdE1hcGJ1ZmZlciA9ICh1aW50OF90KilwRElCaXRtYXAtPkdldEJ1ZmZlcigpOw0KKyAgRlhfRFdPUkQgcGl0Y2ggPSBwRElCaXRtYXAtPkdldFBpdGNoKCk7DQorICBmb3IgKGludDMyX3Qgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgew0KKyAgICBUSUZGUmVhZFNjYW5saW5lKHRpZl9jdHgsIGJ1Ziwgcm93LCAwKTsNCisgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7DQorICAgICAgYml0TWFwYnVmZmVyW3JvdyAqIHBpdGNoICsgal0gPSBidWZbal07DQorICAgIH0NCisgIH0NCisgIF9USUZGZnJlZShidWYpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0NvZGVjX1RpZmZDb250ZXh0OjpEZWNvZGU4YnBwUkdCKENGWF9ESUJpdG1hcCogcERJQml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYnBzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNwcCkgew0KKyAgaWYgKHBESUJpdG1hcC0+R2V0QlBQKCkgIT0gOCB8fCBzcHAgIT0gMSB8fCAoYnBzICE9IDQgJiYgYnBzICE9IDgpIHx8DQorICAgICAgIWlzU3VwcG9ydChwRElCaXRtYXApKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIFNldFBhbGV0dGUocERJQml0bWFwLCBicHMpOw0KKyAgaW50MzJfdCBzaXplID0gKGludDMyX3QpVElGRlNjYW5saW5lU2l6ZSh0aWZfY3R4KTsNCisgIHVpbnQ4X3QqIGJ1ZiA9ICh1aW50OF90KilfVElGRm1hbGxvYyhzaXplKTsNCisgIGlmIChidWYgPT0gTlVMTCkgew0KKyAgICBUSUZGRXJyb3IoVElGRkZpbGVOYW1lKHRpZl9jdHgpLCAiTm8gc3BhY2UgZm9yIHNjYW5saW5lIGJ1ZmZlciIpOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB1aW50OF90KiBiaXRNYXBidWZmZXIgPSAodWludDhfdCopcERJQml0bWFwLT5HZXRCdWZmZXIoKTsNCisgIEZYX0RXT1JEIHBpdGNoID0gcERJQml0bWFwLT5HZXRQaXRjaCgpOw0KKyAgZm9yIChpbnQzMl90IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsNCisgICAgVElGRlJlYWRTY2FubGluZSh0aWZfY3R4LCBidWYsIHJvdywgMCk7DQorICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IHNpemU7IGorKykgew0KKyAgICAgIHN3aXRjaCAoYnBzKSB7DQorICAgICAgICBjYXNlIDQ6DQorICAgICAgICAgIGJpdE1hcGJ1ZmZlcltyb3cgKiBwaXRjaCArIDIgKiBqICsgMF0gPSAoYnVmW2pdICYgMHhGMCkgPj4gNDsNCisgICAgICAgICAgYml0TWFwYnVmZmVyW3JvdyAqIHBpdGNoICsgMiAqIGogKyAxXSA9IChidWZbal0gJiAweDBGKSA+PiAwOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgODoNCisgICAgICAgICAgYml0TWFwYnVmZmVyW3JvdyAqIHBpdGNoICsgal0gPSBidWZbal07DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgX1RJRkZmcmVlKGJ1Zik7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDQ29kZWNfVGlmZkNvbnRleHQ6OkRlY29kZTI0YnBwUkdCKENGWF9ESUJpdG1hcCogcERJQml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYnBzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzcHApIHsNCisgIGlmIChwRElCaXRtYXAtPkdldEJQUCgpICE9IDI0IHx8ICFpc1N1cHBvcnQocERJQml0bWFwKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpbnQzMl90IHNpemUgPSAoaW50MzJfdClUSUZGU2NhbmxpbmVTaXplKHRpZl9jdHgpOw0KKyAgdWludDhfdCogYnVmID0gKHVpbnQ4X3QqKV9USUZGbWFsbG9jKHNpemUpOw0KKyAgaWYgKGJ1ZiA9PSBOVUxMKSB7DQorICAgIFRJRkZFcnJvcihUSUZGRmlsZU5hbWUodGlmX2N0eCksICJObyBzcGFjZSBmb3Igc2NhbmxpbmUgYnVmZmVyIik7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHVpbnQ4X3QqIGJpdE1hcGJ1ZmZlciA9ICh1aW50OF90KilwRElCaXRtYXAtPkdldEJ1ZmZlcigpOw0KKyAgRlhfRFdPUkQgcGl0Y2ggPSBwRElCaXRtYXAtPkdldFBpdGNoKCk7DQorICBmb3IgKGludDMyX3Qgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgew0KKyAgICBUSUZGUmVhZFNjYW5saW5lKHRpZl9jdHgsIGJ1Ziwgcm93LCAwKTsNCisgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgc2l6ZSAtIDI7IGogKz0gMykgew0KKyAgICAgIGJpdE1hcGJ1ZmZlcltyb3cgKiBwaXRjaCArIGogKyAwXSA9IGJ1ZltqICsgMl07DQorICAgICAgYml0TWFwYnVmZmVyW3JvdyAqIHBpdGNoICsgaiArIDFdID0gYnVmW2ogKyAxXTsNCisgICAgICBiaXRNYXBidWZmZXJbcm93ICogcGl0Y2ggKyBqICsgMl0gPSBidWZbaiArIDBdOw0KKyAgICB9DQorICB9DQorICBfVElGRmZyZWUoYnVmKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENDb2RlY19UaWZmQ29udGV4dDo6RGVjb2RlKENGWF9ESUJpdG1hcCogcERJQml0bWFwKSB7DQorICBGWF9EV09SRCBpbWdfd2lkID0gcERJQml0bWFwLT5HZXRXaWR0aCgpOw0KKyAgRlhfRFdPUkQgaW1nX2hlaSA9IHBESUJpdG1hcC0+R2V0SGVpZ2h0KCk7DQorICBGWF9EV09SRCB3aWR0aCA9IDA7DQorICBGWF9EV09SRCBoZWlnaHQgPSAwOw0KKyAgVElGRkdldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfSU1BR0VXSURUSCwgJndpZHRoKTsNCisgIFRJRkZHZXRGaWVsZCh0aWZfY3R4LCBUSUZGVEFHX0lNQUdFTEVOR1RILCAmaGVpZ2h0KTsNCisgIGlmIChpbWdfd2lkICE9IHdpZHRoIHx8IGltZ19oZWkgIT0gaGVpZ2h0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChwRElCaXRtYXAtPkdldEJQUCgpID09IDMyKSB7DQorICAgIEZYX1dPUkQgcm90YXRpb24gPSBPUklFTlRBVElPTl9UT1BMRUZUOw0KKyAgICBUSUZGR2V0RmllbGQodGlmX2N0eCwgVElGRlRBR19PUklFTlRBVElPTiwgJnJvdGF0aW9uKTsNCisgICAgaWYgKFRJRkZSZWFkUkdCQUltYWdlT3JpZW50ZWQodGlmX2N0eCwgaW1nX3dpZCwgaW1nX2hlaSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMiopcERJQml0bWFwLT5HZXRCdWZmZXIoKSwgcm90YXRpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpKSB7DQorICAgICAgZm9yIChGWF9EV09SRCByb3cgPSAwOyByb3cgPCBpbWdfaGVpOyByb3crKykgew0KKyAgICAgICAgdWludDhfdCogcm93X2J1ZiA9ICh1aW50OF90KilwRElCaXRtYXAtPkdldFNjYW5saW5lKHJvdyk7DQorICAgICAgICBfVGlmZkJHUkEyUkdCQShyb3dfYnVmLCBpbWdfd2lkLCA0KTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgIH0NCisgIHVpbnQxNl90IHNwcCwgYnBzOw0KKyAgVElGRkdldEZpZWxkKHRpZl9jdHgsIFRJRkZUQUdfU0FNUExFU1BFUlBJWEVMLCAmc3BwKTsNCisgIFRJRkZHZXRGaWVsZCh0aWZfY3R4LCBUSUZGVEFHX0JJVFNQRVJTQU1QTEUsICZicHMpOw0KKyAgRlhfRFdPUkQgYnBwID0gYnBzICogc3BwOw0KKyAgaWYgKGJwcCA9PSAxKSB7DQorICAgIHJldHVybiBEZWNvZGUxYnBwUkdCKHBESUJpdG1hcCwgaGVpZ2h0LCB3aWR0aCwgYnBzLCBzcHApOw0KKyAgfSBlbHNlIGlmIChicHAgPD0gOCkgew0KKyAgICByZXR1cm4gRGVjb2RlOGJwcFJHQihwRElCaXRtYXAsIGhlaWdodCwgd2lkdGgsIGJwcywgc3BwKTsNCisgIH0gZWxzZSBpZiAoYnBwIDw9IDI0KSB7DQorICAgIHJldHVybiBEZWNvZGUyNGJwcFJHQihwRElCaXRtYXAsIGhlaWdodCwgd2lkdGgsIGJwcywgc3BwKTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCogQ0NvZGVjX1RpZmZNb2R1bGU6OkNyZWF0ZURlY29kZXIoSUZYX0ZpbGVSZWFkKiBmaWxlX3B0cikgew0KKyAgQ0NvZGVjX1RpZmZDb250ZXh0KiBwRGVjb2RlciA9IG5ldyBDQ29kZWNfVGlmZkNvbnRleHQ7DQorICBpZiAoIXBEZWNvZGVyLT5Jbml0RGVjb2RlcihmaWxlX3B0cikpIHsNCisgICAgZGVsZXRlIHBEZWNvZGVyOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBwRGVjb2RlcjsNCit9DQordm9pZCBDQ29kZWNfVGlmZk1vZHVsZTo6R2V0RnJhbWVzKHZvaWQqIGN0eCwgaW50MzJfdCYgZnJhbWVzKSB7DQorICBDQ29kZWNfVGlmZkNvbnRleHQqIHBEZWNvZGVyID0gKENDb2RlY19UaWZmQ29udGV4dCopY3R4Ow0KKyAgcERlY29kZXItPkdldEZyYW1lcyhmcmFtZXMpOw0KK30NCitGWF9CT09MIENDb2RlY19UaWZmTW9kdWxlOjpMb2FkRnJhbWVJbmZvKHZvaWQqIGN0eCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGNvbXBzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGJwYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpIHsNCisgIENDb2RlY19UaWZmQ29udGV4dCogcERlY29kZXIgPSAoQ0NvZGVjX1RpZmZDb250ZXh0KiljdHg7DQorICByZXR1cm4gcERlY29kZXItPkxvYWRGcmFtZUluZm8oZnJhbWUsIHdpZHRoLCBoZWlnaHQsIGNvbXBzLCBicGMsIHBBdHRyaWJ1dGUpOw0KK30NCitGWF9CT09MIENDb2RlY19UaWZmTW9kdWxlOjpEZWNvZGUodm9pZCogY3R4LCBjbGFzcyBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCkgew0KKyAgQ0NvZGVjX1RpZmZDb250ZXh0KiBwRGVjb2RlciA9IChDQ29kZWNfVGlmZkNvbnRleHQqKWN0eDsNCisgIHJldHVybiBwRGVjb2Rlci0+RGVjb2RlKHBESUJpdG1hcCk7DQorfQ0KK3ZvaWQgQ0NvZGVjX1RpZmZNb2R1bGU6OkRlc3Ryb3lEZWNvZGVyKHZvaWQqIGN0eCkgew0KKyAgQ0NvZGVjX1RpZmZDb250ZXh0KiBwRGVjb2RlciA9IChDQ29kZWNfVGlmZkNvbnRleHQqKWN0eDsNCisgIGRlbGV0ZSBwRGVjb2RlcjsNCit9DQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9pbmNsdWRlL2Z4X29wZW5qcGVnLmggYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2luY2x1ZGUvZnhfb3BlbmpwZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcyNWE1Ny4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2luY2x1ZGUvZnhfb3BlbmpwZWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgQ09SRV9TUkNfRlhDT0RFQ19GWF9MSUJPUEVOSlBFR19JTkNMVURFX0ZYX09QRU5KUEVHX0hfCi0jZGVmaW5lIENPUkVfU1JDX0ZYQ09ERUNfRlhfTElCT1BFTkpQRUdfSU5DTFVERV9GWF9PUEVOSlBFR19IXwotCi0jaWZkZWYgX01TQ19WRVIKLSNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKLSNlbmRpZgotCi0jaW5jbHVkZSAiLi4vbGlib3BlbmpwZWcyMC9vcGVuanBlZy5oIgotCi0jZW5kaWYgIC8vIENPUkVfU1JDX0ZYQ09ERUNfRlhfTElCT1BFTkpQRUdfSU5DTFVERV9GWF9PUEVOSlBFR19IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL2Jpby5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL2Jpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2U2NDkyLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9iaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCi0gKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCi0gKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFVuaXZlcnNpdGUgY2F0aG9saXF1ZSBkZSBMb3V2YWluIChVQ0wpLCBCZWxnaXVtCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQotICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKLSAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJvcGpfaW5jbHVkZXMuaCIKLQotLyoqIEBkZWZncm91cCBCSU8gQklPIC0gSW5kaXZpZHVhbCBiaXQgaW5wdXQtb3V0cHV0IHN0cmVhbSAqLwotLypAeyovCi0KLS8qKiBAbmFtZSBMb2NhbCBzdGF0aWMgZnVuY3Rpb25zICovCi0vKkB7Ki8KLQotLyoqCi1Xcml0ZSBhIGJpdAotQHBhcmFtIGJpbyBCSU8gaGFuZGxlCi1AcGFyYW0gYiBCaXQgdG8gd3JpdGUgKDAgb3IgMSkKLSovCi1zdGF0aWMgdm9pZCBvcGpfYmlvX3B1dGJpdChvcGpfYmlvX3QgKmJpbywgT1BKX1VJTlQzMiBiKTsKLS8qKgotUmVhZCBhIGJpdAotQHBhcmFtIGJpbyBCSU8gaGFuZGxlCi1AcmV0dXJuIFJldHVybnMgdGhlIHJlYWQgYml0Ci0qLwotc3RhdGljIE9QSl9VSU5UMzIgb3BqX2Jpb19nZXRiaXQob3BqX2Jpb190ICpiaW8pOwotLyoqCi1Xcml0ZSBhIGJ5dGUKLUBwYXJhbSBiaW8gQklPIGhhbmRsZQotQHJldHVybiBSZXR1cm5zIE9QSl9UUlVFIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgT1BKX0ZBTFNFIG90aGVyd2lzZQotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfYmlvX2J5dGVvdXQob3BqX2Jpb190ICpiaW8pOwotLyoqCi1SZWFkIGEgYnl0ZQotQHBhcmFtIGJpbyBCSU8gaGFuZGxlCi1AcmV0dXJuIFJldHVybnMgT1BKX1RSVUUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBPUEpfRkFMU0Ugb3RoZXJ3aXNlCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9iaW9fYnl0ZWluKG9wal9iaW9fdCAqYmlvKTsKLQotLypAfSovCi0KLS8qQH0qLwotCi0vKiAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIGxvY2FsIGZ1bmN0aW9ucwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLQotT1BKX0JPT0wgb3BqX2Jpb19ieXRlb3V0KG9wal9iaW9fdCAqYmlvKSB7Ci0JYmlvLT5idWYgPSAoYmlvLT5idWYgPDwgOCkgJiAweGZmZmY7Ci0JYmlvLT5jdCA9IGJpby0+YnVmID09IDB4ZmYwMCA/IDcgOiA4OwotCWlmICgoT1BKX1NJWkVfVCliaW8tPmJwID49IChPUEpfU0laRV9UKWJpby0+ZW5kKSB7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCSpiaW8tPmJwKysgPSAoT1BKX0JZVEUpKGJpby0+YnVmID4+IDgpOwotCXJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX0JPT0wgb3BqX2Jpb19ieXRlaW4ob3BqX2Jpb190ICpiaW8pIHsKLQliaW8tPmJ1ZiA9IChiaW8tPmJ1ZiA8PCA4KSAmIDB4ZmZmZjsKLQliaW8tPmN0ID0gYmlvLT5idWYgPT0gMHhmZjAwID8gNyA6IDg7Ci0JaWYgKChPUEpfU0laRV9UKWJpby0+YnAgPj0gKE9QSl9TSVpFX1QpYmlvLT5lbmQpIHsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0JYmlvLT5idWYgfD0gKmJpby0+YnArKzsKLQlyZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLXZvaWQgb3BqX2Jpb19wdXRiaXQob3BqX2Jpb190ICpiaW8sIE9QSl9VSU5UMzIgYikgewotCWlmIChiaW8tPmN0ID09IDApIHsKLQkJb3BqX2Jpb19ieXRlb3V0KGJpbyk7IC8qIE1TRDogd2h5IG5vdCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24gPyAqLwotCX0KLQliaW8tPmN0LS07Ci0JYmlvLT5idWYgfD0gYiA8PCBiaW8tPmN0OwotfQotCi1PUEpfVUlOVDMyIG9wal9iaW9fZ2V0Yml0KG9wal9iaW9fdCAqYmlvKSB7Ci0JaWYgKGJpby0+Y3QgPT0gMCkgewotCQlvcGpfYmlvX2J5dGVpbihiaW8pOyAvKiBNU0Q6IHdoeSBub3QgY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIGZ1bmN0aW9uID8gKi8KLQl9Ci0JYmlvLT5jdC0tOwotCXJldHVybiAoYmlvLT5idWYgPj4gYmlvLT5jdCkgJiAxOwotfQotCi0vKiAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEJpdCBJbnB1dC9PdXRwdXQgaW50ZXJmYWNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotCi1vcGpfYmlvX3QqIG9wal9iaW9fY3JlYXRlKHZvaWQpIHsKLQlvcGpfYmlvX3QgKmJpbyA9IChvcGpfYmlvX3QqKW9wal9tYWxsb2Moc2l6ZW9mKG9wal9iaW9fdCkpOwotCXJldHVybiBiaW87Ci19Ci0KLXZvaWQgb3BqX2Jpb19kZXN0cm95KG9wal9iaW9fdCAqYmlvKSB7Ci0JaWYoYmlvKSB7Ci0JCW9wal9mcmVlKGJpbyk7Ci0JfQotfQotCi1wdHJkaWZmX3Qgb3BqX2Jpb19udW1ieXRlcyhvcGpfYmlvX3QgKmJpbykgewotCXJldHVybiAoYmlvLT5icCAtIGJpby0+c3RhcnQpOwotfQotCi12b2lkIG9wal9iaW9faW5pdF9lbmMob3BqX2Jpb190ICpiaW8sIE9QSl9CWVRFICpicCwgT1BKX1VJTlQzMiBsZW4pIHsKLQliaW8tPnN0YXJ0ID0gYnA7Ci0JYmlvLT5lbmQgPSBicCArIGxlbjsKLQliaW8tPmJwID0gYnA7Ci0JYmlvLT5idWYgPSAwOwotCWJpby0+Y3QgPSA4OwotfQotCi12b2lkIG9wal9iaW9faW5pdF9kZWMob3BqX2Jpb190ICpiaW8sIE9QSl9CWVRFICpicCwgT1BKX1VJTlQzMiBsZW4pIHsKLQliaW8tPnN0YXJ0ID0gYnA7Ci0JYmlvLT5lbmQgPSBicCArIGxlbjsKLQliaW8tPmJwID0gYnA7Ci0JYmlvLT5idWYgPSAwOwotCWJpby0+Y3QgPSAwOwotfQotCi12b2lkIG9wal9iaW9fd3JpdGUob3BqX2Jpb190ICpiaW8sIE9QSl9VSU5UMzIgdiwgT1BKX1VJTlQzMiBuKSB7Ci0JT1BKX1VJTlQzMiBpOwotCWZvciAoaSA9IG4gLSAxOyBpIDwgbjsgaS0tKSB7Ci0JCW9wal9iaW9fcHV0Yml0KGJpbywgKHYgPj4gaSkgJiAxKTsKLQl9Ci19Ci0KLU9QSl9VSU5UMzIgb3BqX2Jpb19yZWFkKG9wal9iaW9fdCAqYmlvLCBPUEpfVUlOVDMyIG4pIHsKLQlPUEpfVUlOVDMyIGk7Ci0gICAgT1BKX1VJTlQzMiB2OwotCXYgPSAwOwotCWZvciAoaSA9IG4gLSAxOyBpIDwgbjsgaS0tKSB7Ci0JCXYgKz0gb3BqX2Jpb19nZXRiaXQoYmlvKSA8PCBpOwotCX0KLQlyZXR1cm4gdjsKLX0KLQotT1BKX0JPT0wgb3BqX2Jpb19mbHVzaChvcGpfYmlvX3QgKmJpbykgewotCWlmICghIG9wal9iaW9fYnl0ZW91dChiaW8pKSB7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCWlmIChiaW8tPmN0ID09IDcpIHsKLQkJaWYgKCEgb3BqX2Jpb19ieXRlb3V0KGJpbykpIHsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KLQl9Ci0JcmV0dXJuIE9QSl9UUlVFOwotfQotCi1PUEpfQk9PTCBvcGpfYmlvX2luYWxpZ24ob3BqX2Jpb190ICpiaW8pIHsKLQlpZiAoKGJpby0+YnVmICYgMHhmZikgPT0gMHhmZikgewotCQlpZiAoISBvcGpfYmlvX2J5dGVpbihiaW8pKSB7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9Ci0JfQotCWJpby0+Y3QgPSAwOwotCXJldHVybiBPUEpfVFJVRTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9jaW8uYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9jaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ1NWJmNy4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvY2lvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NDQgKzAsMCBAQAotLyoKLSAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzIAotICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIAotICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cwotICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBVbml2ZXJzaXRlIGNhdGhvbGlxdWUgZGUgTG91dmFpbiAoVUNMKSwgQmVsZ2l1bQotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFByb2Zlc3NvciBCZW5vaXQgTWFjcQotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMsIERhdmlkIEphbnNzZW5zCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgWWFubmljayBWZXJzY2h1ZXJlbgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4IAotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTQsIEFudG9uaW4gRGVzY2FtcGUKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExLTIwMTIsIENlbnRyZSBOYXRpb25hbCBkJ0V0dWRlcyBTcGF0aWFsZXMgKENORVMpLCBGUiAKLSAqIENvcHlyaWdodCAoYykgMjAxMiwgQ1MgU3lzdGVtZXMgZCdJbmZvcm1hdGlvbiwgRnJhbmNlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKLSAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJvcGpfaW5jbHVkZXMuaCIKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi12b2lkIG9wal93cml0ZV9ieXRlc19CRSAoT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX1VJTlQzMiBwX3ZhbHVlLCBPUEpfVUlOVDMyIHBfbmJfYnl0ZXMpCi17Ci0JY29uc3QgT1BKX0JZVEUgKiBsX2RhdGFfcHRyID0gKChjb25zdCBPUEpfQllURSAqKSAmcF92YWx1ZSkgKyBwX25iX2J5dGVzOwotCi0JYXNzZXJ0KHBfbmJfYnl0ZXMgPiAwICYmIHBfbmJfYnl0ZXMgPD0gIHNpemVvZihPUEpfVUlOVDMyKSk7Ci0KLQltZW1jcHkocF9idWZmZXIsbF9kYXRhX3B0cixwX25iX2J5dGVzKTsKLX0KLQotdm9pZCBvcGpfd3JpdGVfYnl0ZXNfTEUgKE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9VSU5UMzIgcF92YWx1ZSwgT1BKX1VJTlQzMiBwX25iX2J5dGVzKQotewotCWNvbnN0IE9QSl9CWVRFICogbF9kYXRhX3B0ciA9ICgoY29uc3QgT1BKX0JZVEUgKikgJnBfdmFsdWUpICsgcF9uYl9ieXRlcyAtIDE7Ci0JT1BKX1VJTlQzMiBpOwotCi0JYXNzZXJ0KHBfbmJfYnl0ZXMgPiAwICYmIHBfbmJfYnl0ZXMgPD0gc2l6ZW9mKE9QSl9VSU5UMzIpKTsKLQotCWZvcgkoaT0wO2k8cF9uYl9ieXRlczsrK2kpIHsKLQkJKihwX2J1ZmZlcisrKSA9ICoobF9kYXRhX3B0ci0tKTsKLQl9Ci19Ci0KLXZvaWQgb3BqX3JlYWRfYnl0ZXNfQkUoY29uc3QgT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX1VJTlQzMiAqIHBfdmFsdWUsIE9QSl9VSU5UMzIgcF9uYl9ieXRlcykKLXsKLQlPUEpfQllURSAqIGxfZGF0YV9wdHIgPSAoKE9QSl9CWVRFICopIHBfdmFsdWUpOwotCi0JYXNzZXJ0KHBfbmJfYnl0ZXMgPiAwICYmIHBfbmJfYnl0ZXMgPD0gc2l6ZW9mKE9QSl9VSU5UMzIpKTsKLQotCSpwX3ZhbHVlID0gMDsKLQltZW1jcHkobF9kYXRhX3B0cis0LXBfbmJfYnl0ZXMscF9idWZmZXIscF9uYl9ieXRlcyk7Ci19Ci0KLXZvaWQgb3BqX3JlYWRfYnl0ZXNfTEUoY29uc3QgT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX1VJTlQzMiAqIHBfdmFsdWUsIE9QSl9VSU5UMzIgcF9uYl9ieXRlcykKLXsKLQlPUEpfQllURSAqIGxfZGF0YV9wdHIgPSAoKE9QSl9CWVRFICopIHBfdmFsdWUpICsgcF9uYl9ieXRlcy0xOwotCU9QSl9VSU5UMzIgaTsKLQotCWFzc2VydChwX25iX2J5dGVzID4gMCAmJiBwX25iX2J5dGVzIDw9IHNpemVvZihPUEpfVUlOVDMyKSk7Ci0KLQkqcF92YWx1ZSA9IDA7Ci0JZm9yIChpPTA7aTxwX25iX2J5dGVzOysraSkgewotCQkqKGxfZGF0YV9wdHItLSkgPSAqKHBfYnVmZmVyKyspOwotCX0KLX0KLQotdm9pZCBvcGpfd3JpdGVfZG91YmxlX0JFKE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9GTE9BVDY0IHBfdmFsdWUpCi17Ci0JY29uc3QgT1BKX0JZVEUgKiBsX2RhdGFfcHRyID0gKChjb25zdCBPUEpfQllURSAqKSAmcF92YWx1ZSk7Ci0JbWVtY3B5KHBfYnVmZmVyLGxfZGF0YV9wdHIsc2l6ZW9mKE9QSl9GTE9BVDY0KSk7Ci19Ci0KLXZvaWQgb3BqX3dyaXRlX2RvdWJsZV9MRShPUEpfQllURSAqIHBfYnVmZmVyLCBPUEpfRkxPQVQ2NCBwX3ZhbHVlKQotewotCWNvbnN0IE9QSl9CWVRFICogbF9kYXRhX3B0ciA9ICgoY29uc3QgT1BKX0JZVEUgKikgJnBfdmFsdWUpICsgc2l6ZW9mKE9QSl9GTE9BVDY0KSAtIDE7Ci0JT1BKX1VJTlQzMiBpOwotCWZvcgkoaT0wO2k8c2l6ZW9mKE9QSl9GTE9BVDY0KTsrK2kpIHsKLQkJKihwX2J1ZmZlcisrKSA9ICoobF9kYXRhX3B0ci0tKTsKLQl9Ci19Ci0KLXZvaWQgb3BqX3JlYWRfZG91YmxlX0JFKGNvbnN0IE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9GTE9BVDY0ICogcF92YWx1ZSkKLXsKLQlPUEpfQllURSAqIGxfZGF0YV9wdHIgPSAoKE9QSl9CWVRFICopIHBfdmFsdWUpOwotCW1lbWNweShsX2RhdGFfcHRyLHBfYnVmZmVyLHNpemVvZihPUEpfRkxPQVQ2NCkpOwotfQotCi12b2lkIG9wal9yZWFkX2RvdWJsZV9MRShjb25zdCBPUEpfQllURSAqIHBfYnVmZmVyLCBPUEpfRkxPQVQ2NCAqIHBfdmFsdWUpCi17Ci0JT1BKX0JZVEUgKiBsX2RhdGFfcHRyID0gKChPUEpfQllURSAqKSBwX3ZhbHVlKSArIHNpemVvZihPUEpfRkxPQVQ2NCktMTsKLQlPUEpfVUlOVDMyIGk7Ci0JZm9yIChpPTA7aTxzaXplb2YoT1BKX0ZMT0FUNjQpOysraSkgewotCQkqKGxfZGF0YV9wdHItLSkgPSAqKHBfYnVmZmVyKyspOwotCX0KLX0KLQotdm9pZCBvcGpfd3JpdGVfZmxvYXRfQkUoT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX0ZMT0FUMzIgcF92YWx1ZSkKLXsKLQljb25zdCBPUEpfQllURSAqIGxfZGF0YV9wdHIgPSAoKGNvbnN0IE9QSl9CWVRFICopICZwX3ZhbHVlKTsKLQltZW1jcHkocF9idWZmZXIsbF9kYXRhX3B0cixzaXplb2YoT1BKX0ZMT0FUMzIpKTsKLX0KLQotdm9pZCBvcGpfd3JpdGVfZmxvYXRfTEUoT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX0ZMT0FUMzIgcF92YWx1ZSkKLXsKLQljb25zdCBPUEpfQllURSAqIGxfZGF0YV9wdHIgPSAoKGNvbnN0IE9QSl9CWVRFICopICZwX3ZhbHVlKSArIHNpemVvZihPUEpfRkxPQVQzMikgLSAxOwotCU9QSl9VSU5UMzIgaTsKLQlmb3IJKGk9MDtpPHNpemVvZihPUEpfRkxPQVQzMik7KytpKSB7Ci0JCSoocF9idWZmZXIrKykgPSAqKGxfZGF0YV9wdHItLSk7Ci0JfQotfQotCi12b2lkIG9wal9yZWFkX2Zsb2F0X0JFKGNvbnN0IE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9GTE9BVDMyICogcF92YWx1ZSkKLXsKLQlPUEpfQllURSAqIGxfZGF0YV9wdHIgPSAoKE9QSl9CWVRFICopIHBfdmFsdWUpOwotCW1lbWNweShsX2RhdGFfcHRyLHBfYnVmZmVyLHNpemVvZihPUEpfRkxPQVQzMikpOwotfQotCi12b2lkIG9wal9yZWFkX2Zsb2F0X0xFKGNvbnN0IE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9GTE9BVDMyICogcF92YWx1ZSkKLXsKLQlPUEpfQllURSAqIGxfZGF0YV9wdHIgPSAoKE9QSl9CWVRFICopIHBfdmFsdWUpICsgc2l6ZW9mKE9QSl9GTE9BVDMyKS0xOwotCU9QSl9VSU5UMzIgaTsKLQlmb3IJKGk9MDtpPHNpemVvZihPUEpfRkxPQVQzMik7KytpKSB7Ci0JCSoobF9kYXRhX3B0ci0tKSA9ICoocF9idWZmZXIrKyk7Ci0JfQotfQotCi1vcGpfc3RyZWFtX3QqIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX2NyZWF0ZShPUEpfU0laRV9UIHBfYnVmZmVyX3NpemUsT1BKX0JPT0wgbF9pc19pbnB1dCkKLXsKLQlvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIGxfc3RyZWFtID0gMDA7Ci0JbF9zdHJlYW0gPSAob3BqX3N0cmVhbV9wcml2YXRlX3QqKSBvcGpfY2FsbG9jKDEsc2l6ZW9mKG9wal9zdHJlYW1fcHJpdmF0ZV90KSk7Ci0JaWYgKCEgbF9zdHJlYW0pIHsKLQkJcmV0dXJuIDAwOwotCX0KLQotCWxfc3RyZWFtLT5tX2J1ZmZlcl9zaXplID0gcF9idWZmZXJfc2l6ZTsKLQlsX3N0cmVhbS0+bV9zdG9yZWRfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfbWFsbG9jKHBfYnVmZmVyX3NpemUpOwotCWlmICghIGxfc3RyZWFtLT5tX3N0b3JlZF9kYXRhKSB7Ci0JCW9wal9mcmVlKGxfc3RyZWFtKTsKLQkJcmV0dXJuIDAwOwotCX0KLQotCWxfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSA9IGxfc3RyZWFtLT5tX3N0b3JlZF9kYXRhOwotCi0JaWYgKGxfaXNfaW5wdXQpIHsKLQkJbF9zdHJlYW0tPm1fc3RhdHVzIHw9IG9wal9zdHJlYW1fZV9pbnB1dDsKLQkJbF9zdHJlYW0tPm1fb3BqX3NraXAgPSBvcGpfc3RyZWFtX3JlYWRfc2tpcDsKLQkJbF9zdHJlYW0tPm1fb3BqX3NlZWsgPSBvcGpfc3RyZWFtX3JlYWRfc2VlazsKLQl9Ci0JZWxzZSB7Ci0JCWxfc3RyZWFtLT5tX3N0YXR1cyB8PSBvcGpfc3RyZWFtX2Vfb3V0cHV0OwotCQlsX3N0cmVhbS0+bV9vcGpfc2tpcCA9IG9wal9zdHJlYW1fd3JpdGVfc2tpcDsKLQkJbF9zdHJlYW0tPm1fb3BqX3NlZWsgPSBvcGpfc3RyZWFtX3dyaXRlX3NlZWs7Ci0JfQotCi0JbF9zdHJlYW0tPm1fcmVhZF9mbiA9IG9wal9zdHJlYW1fZGVmYXVsdF9yZWFkOwotCWxfc3RyZWFtLT5tX3dyaXRlX2ZuID0gb3BqX3N0cmVhbV9kZWZhdWx0X3dyaXRlOwotCWxfc3RyZWFtLT5tX3NraXBfZm4gPSBvcGpfc3RyZWFtX2RlZmF1bHRfc2tpcDsKLQlsX3N0cmVhbS0+bV9zZWVrX2ZuID0gb3BqX3N0cmVhbV9kZWZhdWx0X3NlZWs7Ci0KLQlyZXR1cm4gKG9wal9zdHJlYW1fdCAqKSBsX3N0cmVhbTsKLX0KLQotb3BqX3N0cmVhbV90KiBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9kZWZhdWx0X2NyZWF0ZShPUEpfQk9PTCBsX2lzX2lucHV0KQotewotCXJldHVybiBvcGpfc3RyZWFtX2NyZWF0ZShPUEpfSjJLX1NUUkVBTV9DSFVOS19TSVpFLGxfaXNfaW5wdXQpOwotfQotCi12b2lkIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX2Rlc3Ryb3kob3BqX3N0cmVhbV90KiBwX3N0cmVhbSkKLXsKLQlvcGpfc3RyZWFtX3ByaXZhdGVfdCogbF9zdHJlYW0gPSAob3BqX3N0cmVhbV9wcml2YXRlX3QqKSBwX3N0cmVhbTsKLQkKLQlpZiAobF9zdHJlYW0pIHsKLQkJaWYgKGxfc3RyZWFtLT5tX2ZyZWVfdXNlcl9kYXRhX2ZuKSB7Ci0JCQlsX3N0cmVhbS0+bV9mcmVlX3VzZXJfZGF0YV9mbihsX3N0cmVhbS0+bV91c2VyX2RhdGEpOwotCQl9Ci0JCW9wal9mcmVlKGxfc3RyZWFtLT5tX3N0b3JlZF9kYXRhKTsKLQkJbF9zdHJlYW0tPm1fc3RvcmVkX2RhdGEgPSAwMDsKLQkJb3BqX2ZyZWUobF9zdHJlYW0pOwotCX0KLX0KLQotdm9pZCBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9zZXRfcmVhZF9mdW5jdGlvbihvcGpfc3RyZWFtX3QqIHBfc3RyZWFtLCBvcGpfc3RyZWFtX3JlYWRfZm4gcF9mdW5jdGlvbikKLXsKLQlvcGpfc3RyZWFtX3ByaXZhdGVfdCogbF9zdHJlYW0gPSAob3BqX3N0cmVhbV9wcml2YXRlX3QqKSBwX3N0cmVhbTsKLQotCWlmICgoIWxfc3RyZWFtKSB8fCAoISAobF9zdHJlYW0tPm1fc3RhdHVzICYgb3BqX3N0cmVhbV9lX2lucHV0KSkpIHsKLQkJcmV0dXJuOwotCX0KLQotCWxfc3RyZWFtLT5tX3JlYWRfZm4gPSBwX2Z1bmN0aW9uOwotfQotCi12b2lkIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX3NldF9zZWVrX2Z1bmN0aW9uKG9wal9zdHJlYW1fdCogcF9zdHJlYW0sIG9wal9zdHJlYW1fc2Vla19mbiBwX2Z1bmN0aW9uKQotewotCW9wal9zdHJlYW1fcHJpdmF0ZV90KiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCopIHBfc3RyZWFtOwotCQotCWlmICghbF9zdHJlYW0pIHsKLQkJcmV0dXJuOwotCX0KLQlsX3N0cmVhbS0+bV9zZWVrX2ZuID0gcF9mdW5jdGlvbjsKLX0KLQotdm9pZCBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9zZXRfd3JpdGVfZnVuY3Rpb24ob3BqX3N0cmVhbV90KiBwX3N0cmVhbSwgb3BqX3N0cmVhbV93cml0ZV9mbiBwX2Z1bmN0aW9uKQotewotCW9wal9zdHJlYW1fcHJpdmF0ZV90KiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCopIHBfc3RyZWFtOwotCQotCWlmICgoIWxfc3RyZWFtICl8fCAoISAobF9zdHJlYW0tPm1fc3RhdHVzICYgb3BqX3N0cmVhbV9lX291dHB1dCkpKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlsX3N0cmVhbS0+bV93cml0ZV9mbiA9IHBfZnVuY3Rpb247Ci19Ci0KLXZvaWQgT1BKX0NBTExDT05WIG9wal9zdHJlYW1fc2V0X3NraXBfZnVuY3Rpb24ob3BqX3N0cmVhbV90KiBwX3N0cmVhbSwgb3BqX3N0cmVhbV9za2lwX2ZuIHBfZnVuY3Rpb24pCi17Ci0Jb3BqX3N0cmVhbV9wcml2YXRlX3QqIGxfc3RyZWFtID0gKG9wal9zdHJlYW1fcHJpdmF0ZV90KikgcF9zdHJlYW07Ci0JCi0JaWYgKCEgbF9zdHJlYW0pIHsKLQkJcmV0dXJuOwotCX0KLQotCWxfc3RyZWFtLT5tX3NraXBfZm4gPSBwX2Z1bmN0aW9uOwotfQotCi12b2lkIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX3NldF91c2VyX2RhdGEob3BqX3N0cmVhbV90KiBwX3N0cmVhbSwgdm9pZCAqIHBfZGF0YSwgb3BqX3N0cmVhbV9mcmVlX3VzZXJfZGF0YV9mbiBwX2Z1bmN0aW9uKQotewotCW9wal9zdHJlYW1fcHJpdmF0ZV90KiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCopIHBfc3RyZWFtOwotCWlmICghbF9zdHJlYW0pCi0JCXJldHVybjsKLQlsX3N0cmVhbS0+bV91c2VyX2RhdGEgPSBwX2RhdGE7Ci0gIGxfc3RyZWFtLT5tX2ZyZWVfdXNlcl9kYXRhX2ZuID0gcF9mdW5jdGlvbjsKLX0KLQotdm9pZCBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9zZXRfdXNlcl9kYXRhX2xlbmd0aChvcGpfc3RyZWFtX3QqIHBfc3RyZWFtLCBPUEpfVUlOVDY0IGRhdGFfbGVuZ3RoKQotewotCW9wal9zdHJlYW1fcHJpdmF0ZV90KiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCopIHBfc3RyZWFtOwotCWlmICghbF9zdHJlYW0pCi0JCXJldHVybjsKLQlsX3N0cmVhbS0+bV91c2VyX2RhdGFfbGVuZ3RoID0gZGF0YV9sZW5ndGg7Ci19Ci0KLU9QSl9TSVpFX1Qgb3BqX3N0cmVhbV9yZWFkX2RhdGEgKG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0sT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX1NJWkVfVCBwX3NpemUsIG9wal9ldmVudF9tZ3JfdCAqIHBfZXZlbnRfbWdyKQotewotCU9QSl9TSVpFX1QgbF9yZWFkX25iX2J5dGVzID0gMDsKLQlpZiAocF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyID49IHBfc2l6ZSkgewotCQltZW1jcHkocF9idWZmZXIscF9zdHJlYW0tPm1fY3VycmVudF9kYXRhLHBfc2l6ZSk7Ci0JCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSArPSBwX3NpemU7Ci0JCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciAtPSBwX3NpemU7Ci0JCWxfcmVhZF9uYl9ieXRlcyArPSBwX3NpemU7Ci0JCXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IChPUEpfT0ZGX1QpcF9zaXplOwotCQlyZXR1cm4gbF9yZWFkX25iX2J5dGVzOwotCX0KLQotCS8qIHdlIGFyZSBub3cgaW4gdGhlIGNhc2Ugd2hlbiB0aGUgcmVtYWluaW5nIGRhdGEgaWYgbm90IHN1ZmZpY2llbnQgKi8KLQlpZiAocF9zdHJlYW0tPm1fc3RhdHVzICYgb3BqX3N0cmVhbV9lX2VuZCkgewotCQlsX3JlYWRfbmJfYnl0ZXMgKz0gcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOwotCQltZW1jcHkocF9idWZmZXIscF9zdHJlYW0tPm1fY3VycmVudF9kYXRhLHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcik7Ci0JCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSArPSBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXI7Ci0JCXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IChPUEpfT0ZGX1QpcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOwotCQlwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPSAwOwotCQlyZXR1cm4gbF9yZWFkX25iX2J5dGVzID8gbF9yZWFkX25iX2J5dGVzIDogKE9QSl9TSVpFX1QpLTE7Ci0JfQotCi0JLyogdGhlIGZsYWcgaXMgbm90IHNldCwgd2UgY29weSBkYXRhIGFuZCB0aGVuIGRvIGFuIGFjdHVhbCByZWFkIG9uIHRoZSBzdHJlYW0gKi8KLQlpZiAocF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyKSB7Ci0JCWxfcmVhZF9uYl9ieXRlcyArPSBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXI7Ci0JCW1lbWNweShwX2J1ZmZlcixwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEscF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyKTsKLQkJcF9zdHJlYW0tPm1fY3VycmVudF9kYXRhID0gcF9zdHJlYW0tPm1fc3RvcmVkX2RhdGE7Ci0JCXBfYnVmZmVyICs9IHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKLQkJcF9zaXplIC09IHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKLQkJcF9zdHJlYW0tPm1fYnl0ZV9vZmZzZXQgKz0gKE9QSl9PRkZfVClwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXI7Ci0JCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA9IDA7Ci0JfQotCWVsc2UgewotICAgIC8qIGNhc2Ugd2hlcmUgd2UgYXJlIGFscmVhZHkgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyCi0gICAgICAgc28gcmVzZXQgdGhlIG1fY3VycmVudF9kYXRhIHRvIHBvaW50IHRvIHRoZSBzdGFydCBvZiB0aGUKLSAgICAgICBzdG9yZWQgYnVmZmVyIHRvIGdldCByZWFkeSB0byByZWFkIGZyb20gZGlzayovCi0JCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSA9IHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhOwotCX0KLQotCXdoaWxlKDEpewotCQkvKiB3ZSBzaG91bGQgcmVhZCBsZXNzIHRoYW4gYSBjaHVuayAtPiByZWFkIGEgY2h1bmsgKi8KLQkJaWYgKHBfc2l6ZSA8IHBfc3RyZWFtLT5tX2J1ZmZlcl9zaXplKSB7Ci0JCQkvKiB3ZSBzaG91bGQgZG8gYW4gYWN0dWFsIHJlYWQgb24gdGhlIG1lZGlhICovCi0JCQlwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPSBwX3N0cmVhbS0+bV9yZWFkX2ZuKHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhLHBfc3RyZWFtLT5tX2J1ZmZlcl9zaXplLHBfc3RyZWFtLT5tX3VzZXJfZGF0YSk7Ci0KLQkJCWlmIChwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPT0gKE9QSl9TSVpFX1QpLTEpIHsKLQkJCQkvKiBlbmQgb2Ygc3RyZWFtICovCi0JCQkJb3BqX2V2ZW50X21zZyhwX2V2ZW50X21nciwgRVZUX0lORk8sICJTdHJlYW0gcmVhY2hlZCBpdHMgZW5kICFcbiIpOwotCi0JCQkJcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyID0gMDsKLQkJCQlwX3N0cmVhbS0+bV9zdGF0dXMgfD0gb3BqX3N0cmVhbV9lX2VuZDsKLQkJCQkvKiBlbmQgb2Ygc3RyZWFtICovCi0JCQkJcmV0dXJuIGxfcmVhZF9uYl9ieXRlcyA/IGxfcmVhZF9uYl9ieXRlcyA6IChPUEpfU0laRV9UKS0xOwotCQkJfQotCQkJZWxzZSBpZgkocF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyIDwgcF9zaXplKSB7Ci0JCQkJLyogbm90IGVub3VnaCBkYXRhICovCi0JCQkJbF9yZWFkX25iX2J5dGVzICs9IHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKLQkJCQltZW1jcHkocF9idWZmZXIscF9zdHJlYW0tPm1fY3VycmVudF9kYXRhLHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcik7Ci0JCQkJcF9zdHJlYW0tPm1fY3VycmVudF9kYXRhID0gcF9zdHJlYW0tPm1fc3RvcmVkX2RhdGE7Ci0JCQkJcF9idWZmZXIgKz0gcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOwotCQkJCXBfc2l6ZSAtPSBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXI7Ci0JCQkJcF9zdHJlYW0tPm1fYnl0ZV9vZmZzZXQgKz0gKE9QSl9PRkZfVClwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXI7Ci0JCQkJcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyID0gMDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWxfcmVhZF9uYl9ieXRlcyArPSBwX3NpemU7Ci0JCQkJbWVtY3B5KHBfYnVmZmVyLHBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSxwX3NpemUpOwotCQkJCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSArPSBwX3NpemU7Ci0JCQkJcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyIC09IHBfc2l6ZTsKLQkJCQlwX3N0cmVhbS0+bV9ieXRlX29mZnNldCArPSAoT1BKX09GRl9UKXBfc2l6ZTsKLQkJCQlyZXR1cm4gbF9yZWFkX25iX2J5dGVzOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLyogZGlyZWN0IHJlYWQgb24gdGhlIGRlc3QgYnVmZmVyICovCi0JCQlwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPSBwX3N0cmVhbS0+bV9yZWFkX2ZuKHBfYnVmZmVyLHBfc2l6ZSxwX3N0cmVhbS0+bV91c2VyX2RhdGEpOwotCi0JCQlpZiAocF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyID09IChPUEpfU0laRV9UKS0xKSB7Ci0JCQkJLyogIGVuZCBvZiBzdHJlYW0gKi8KLQkJCQlvcGpfZXZlbnRfbXNnKHBfZXZlbnRfbWdyLCBFVlRfSU5GTywgIlN0cmVhbSByZWFjaGVkIGl0cyBlbmQgIVxuIik7Ci0KLQkJCQlwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPSAwOwotCQkJCXBfc3RyZWFtLT5tX3N0YXR1cyB8PSBvcGpfc3RyZWFtX2VfZW5kOwotCQkJCS8qIGVuZCBvZiBzdHJlYW0gKi8KLQkJCQlyZXR1cm4gbF9yZWFkX25iX2J5dGVzID8gbF9yZWFkX25iX2J5dGVzIDogKE9QSl9TSVpFX1QpLTE7Ci0JCQl9Ci0JCQllbHNlIGlmIChwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPCBwX3NpemUpIHsKLQkJCQkvKiBub3QgZW5vdWdoIGRhdGEgKi8KLQkJCQlsX3JlYWRfbmJfYnl0ZXMgKz0gcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOwotCQkJCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSA9IHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhOwotCQkJCXBfYnVmZmVyICs9IHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKLQkJCQlwX3NpemUgLT0gcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOwotCQkJCXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IChPUEpfT0ZGX1QpcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOwotCQkJCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA9IDA7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKiB3ZSBoYXZlIHJlYWQgdGhlIGV4YWN0IHNpemUgKi8KLQkJCQlsX3JlYWRfbmJfYnl0ZXMgKz0gcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOwotCQkJCXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IChPUEpfT0ZGX1QpcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOwotCQkJCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSA9IHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhOwotCQkJCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA9IDA7Ci0JCQkJcmV0dXJuIGxfcmVhZF9uYl9ieXRlczsKLQkJCX0KLQkJfQotCX0KLX0KLQotT1BKX1NJWkVfVCBvcGpfc3RyZWFtX3dyaXRlX2RhdGEgKG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0sCi0JCQkJCQkJCSAgY29uc3QgT1BKX0JZVEUgKiBwX2J1ZmZlciwKLQkJCQkJCQkJICBPUEpfU0laRV9UIHBfc2l6ZSwgCi0JCQkJCQkJCSAgb3BqX2V2ZW50X21ncl90ICogcF9ldmVudF9tZ3IpCi17Ci0JT1BKX1NJWkVfVCBsX3JlbWFpbmluZ19ieXRlcyA9IDA7Ci0JT1BKX1NJWkVfVCBsX3dyaXRlX25iX2J5dGVzID0gMDsKLQotCWlmIChwX3N0cmVhbS0+bV9zdGF0dXMgJiBvcGpfc3RyZWFtX2VfZXJyb3IpIHsKLQkJcmV0dXJuIChPUEpfU0laRV9UKS0xOwotCX0KLQotCXdoaWxlKDEpIHsKLQkJbF9yZW1haW5pbmdfYnl0ZXMgPSBwX3N0cmVhbS0+bV9idWZmZXJfc2l6ZSAtIHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKLQkJCi0JCS8qIHdlIGhhdmUgbW9yZSBtZW1vcnkgdGhhbiByZXF1aXJlZCAqLwotCQlpZiAobF9yZW1haW5pbmdfYnl0ZXMgPj0gcF9zaXplKSB7Ci0JCQltZW1jcHkocF9zdHJlYW0tPm1fY3VycmVudF9kYXRhLCBwX2J1ZmZlciwgcF9zaXplKTsKLQkJCQotCQkJcF9zdHJlYW0tPm1fY3VycmVudF9kYXRhICs9IHBfc2l6ZTsKLQkJCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciArPSBwX3NpemU7Ci0JCQlsX3dyaXRlX25iX2J5dGVzICs9IHBfc2l6ZTsKLQkJCXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IChPUEpfT0ZGX1QpcF9zaXplOwotCQkJCi0JCQlyZXR1cm4gbF93cml0ZV9uYl9ieXRlczsKLQkJfQotCi0JCS8qIHdlIGNvcHkgZGF0YSBhbmQgdGhlbiBkbyBhbiBhY3R1YWwgcmVhZCBvbiB0aGUgc3RyZWFtICovCi0JCWlmIChsX3JlbWFpbmluZ19ieXRlcykgewotCQkJbF93cml0ZV9uYl9ieXRlcyArPSBsX3JlbWFpbmluZ19ieXRlczsKLQkJCQotCQkJbWVtY3B5KHBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSxwX2J1ZmZlcixsX3JlbWFpbmluZ19ieXRlcyk7Ci0JCQkKLQkJCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSA9IHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhOwotCQkJCi0JCQlwX2J1ZmZlciArPSBsX3JlbWFpbmluZ19ieXRlczsKLQkJCXBfc2l6ZSAtPSBsX3JlbWFpbmluZ19ieXRlczsKLQkJCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciArPSBsX3JlbWFpbmluZ19ieXRlczsKLQkJCXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IChPUEpfT0ZGX1QpbF9yZW1haW5pbmdfYnl0ZXM7Ci0JCX0KLQotCQlpZiAoISBvcGpfc3RyZWFtX2ZsdXNoKHBfc3RyZWFtLCBwX2V2ZW50X21ncikpIHsKLQkJCXJldHVybiAoT1BKX1NJWkVfVCktMTsKLQkJfQotCX0KLQotfQotCi1PUEpfQk9PTCBvcGpfc3RyZWFtX2ZsdXNoIChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLCBvcGpfZXZlbnRfbWdyX3QgKiBwX2V2ZW50X21ncikKLXsKLQkvKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gb24gdGhlIG1lZGlhLiAqLwotCU9QSl9TSVpFX1QgbF9jdXJyZW50X3dyaXRlX25iX2J5dGVzID0gMDsKLQotCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSA9IHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhOwotCi0Jd2hpbGUgKHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcikgewotCQkvKiB3ZSBzaG91bGQgZG8gYW4gYWN0dWFsIHdyaXRlIG9uIHRoZSBtZWRpYSAqLwotCQlsX2N1cnJlbnRfd3JpdGVfbmJfYnl0ZXMgPSBwX3N0cmVhbS0+bV93cml0ZV9mbihwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEsCi0JCQkJCQkJCQkJCQkJCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciwKLQkJCQkJCQkJCQkJCQkJcF9zdHJlYW0tPm1fdXNlcl9kYXRhKTsKLQkJCi0JCWlmIChsX2N1cnJlbnRfd3JpdGVfbmJfYnl0ZXMgPT0gKE9QSl9TSVpFX1QpLTEpIHsKLQkJCXBfc3RyZWFtLT5tX3N0YXR1cyB8PSBvcGpfc3RyZWFtX2VfZXJyb3I7Ci0JCQlvcGpfZXZlbnRfbXNnKHBfZXZlbnRfbWdyLCBFVlRfSU5GTywgIkVycm9yIG9uIHdyaXRpbmcgc3RyZWFtIVxuIik7Ci0KLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KLQotCQlwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEgKz0gbF9jdXJyZW50X3dyaXRlX25iX2J5dGVzOwotCQlwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgLT0gbF9jdXJyZW50X3dyaXRlX25iX2J5dGVzOwotCX0KLQotCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSA9IHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhOwotCQotCXJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX09GRl9UIG9wal9zdHJlYW1fcmVhZF9za2lwIChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLCBPUEpfT0ZGX1QgcF9zaXplLCBvcGpfZXZlbnRfbWdyX3QgKiBwX2V2ZW50X21ncikKLXsKLQlPUEpfT0ZGX1QgbF9za2lwX25iX2J5dGVzID0gMDsKLQlPUEpfT0ZGX1QgbF9jdXJyZW50X3NraXBfbmJfYnl0ZXMgPSAwOwotCQotCWFzc2VydCggcF9zaXplID49IDAgKTsKLQkKLQlpZiAocF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyID49IChPUEpfU0laRV9UKXBfc2l6ZSkgewotCQlwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEgKz0gcF9zaXplOwotCQkvKiBpdCBpcyBzYWZlIHRvIGNhc3QgcF9zaXplIHRvIE9QSl9TSVpFX1Qgc2luY2UgaXQgaXMgPD0gbV9ieXRlc19pbl9idWZmZXIKLQkJd2hpY2ggaXMgb2YgdHlwZSBPUEpfU0laRV9UICovCi0JCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciAtPSAoT1BKX1NJWkVfVClwX3NpemU7Ci0JCWxfc2tpcF9uYl9ieXRlcyArPSBwX3NpemU7Ci0JCXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IGxfc2tpcF9uYl9ieXRlczsKLQkJcmV0dXJuIGxfc2tpcF9uYl9ieXRlczsKLQl9Ci0KLQkvKiB3ZSBhcmUgbm93IGluIHRoZSBjYXNlIHdoZW4gdGhlIHJlbWFpbmluZyBkYXRhIGlmIG5vdCBzdWZmaWNpZW50ICovCi0JaWYgKHBfc3RyZWFtLT5tX3N0YXR1cyAmIG9wal9zdHJlYW1fZV9lbmQpIHsKLQkJbF9za2lwX25iX2J5dGVzICs9IChPUEpfT0ZGX1QpcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOwotCQlwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEgKz0gcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOwotCQlwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPSAwOwotCQlwX3N0cmVhbS0+bV9ieXRlX29mZnNldCArPSBsX3NraXBfbmJfYnl0ZXM7Ci0JCXJldHVybiBsX3NraXBfbmJfYnl0ZXMgPyBsX3NraXBfbmJfYnl0ZXMgOiAoT1BKX09GRl9UKSAtMTsKLQl9Ci0KLQkvKiB0aGUgZmxhZyBpcyBub3Qgc2V0LCB3ZSBjb3B5IGRhdGEgYW5kIHRoZW4gZG8gYW4gYWN0dWFsIHNraXAgb24gdGhlIHN0cmVhbSAqLwotCWlmIChwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIpIHsKLQkJbF9za2lwX25iX2J5dGVzICs9IChPUEpfT0ZGX1QpcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOwotCQlwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEgPSBwX3N0cmVhbS0+bV9zdG9yZWRfZGF0YTsKLQkJcF9zaXplIC09IChPUEpfT0ZGX1QpcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOwotCQlwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPSAwOwotCX0KLQotCXdoaWxlIChwX3NpemUgPiAwKSB7Ci0JCS8qIHdlIHNob3VsZCBkbyBhbiBhY3R1YWwgc2tpcCBvbiB0aGUgbWVkaWEgKi8KLQkJbF9jdXJyZW50X3NraXBfbmJfYnl0ZXMgPSBwX3N0cmVhbS0+bV9za2lwX2ZuKHBfc2l6ZSwgcF9zdHJlYW0tPm1fdXNlcl9kYXRhKTsKLQkJaWYgKGxfY3VycmVudF9za2lwX25iX2J5dGVzID09IChPUEpfT0ZGX1QpIC0xKSB7Ci0JCQlvcGpfZXZlbnRfbXNnKHBfZXZlbnRfbWdyLCBFVlRfSU5GTywgIlN0cmVhbSByZWFjaGVkIGl0cyBlbmQgIVxuIik7Ci0KLQkJCXBfc3RyZWFtLT5tX3N0YXR1cyB8PSBvcGpfc3RyZWFtX2VfZW5kOwotCQkJcF9zdHJlYW0tPm1fYnl0ZV9vZmZzZXQgKz0gbF9za2lwX25iX2J5dGVzOwotCQkJLyogZW5kIGlmIHN0cmVhbSAqLwotCQkJcmV0dXJuIGxfc2tpcF9uYl9ieXRlcyA/IGxfc2tpcF9uYl9ieXRlcyA6IChPUEpfT0ZGX1QpIC0xOwotCQl9Ci0JCXBfc2l6ZSAtPSBsX2N1cnJlbnRfc2tpcF9uYl9ieXRlczsKLQkJbF9za2lwX25iX2J5dGVzICs9IGxfY3VycmVudF9za2lwX25iX2J5dGVzOwotCX0KLQotCXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IGxfc2tpcF9uYl9ieXRlczsKLQkKLQlyZXR1cm4gbF9za2lwX25iX2J5dGVzOwotfQotCi1PUEpfT0ZGX1Qgb3BqX3N0cmVhbV93cml0ZV9za2lwIChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLCBPUEpfT0ZGX1QgcF9zaXplLCBvcGpfZXZlbnRfbWdyX3QgKiBwX2V2ZW50X21ncikKLXsKLQlPUEpfQk9PTCBsX2lzX3dyaXR0ZW4gPSAwOwotCU9QSl9PRkZfVCBsX2N1cnJlbnRfc2tpcF9uYl9ieXRlcyA9IDA7Ci0JT1BKX09GRl9UIGxfc2tpcF9uYl9ieXRlcyA9IDA7Ci0KLQlpZiAocF9zdHJlYW0tPm1fc3RhdHVzICYgb3BqX3N0cmVhbV9lX2Vycm9yKSB7Ci0JCXJldHVybiAoT1BKX09GRl9UKSAtMTsKLQl9Ci0KLQkvKiB3ZSBzaG91bGQgZmx1c2ggZGF0YSAqLwotCWxfaXNfd3JpdHRlbiA9IG9wal9zdHJlYW1fZmx1c2ggKHBfc3RyZWFtLCBwX2V2ZW50X21ncik7Ci0JaWYgKCEgbF9pc193cml0dGVuKSB7Ci0JCXBfc3RyZWFtLT5tX3N0YXR1cyB8PSBvcGpfc3RyZWFtX2VfZXJyb3I7Ci0JCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA9IDA7Ci0JCXJldHVybiAoT1BKX09GRl9UKSAtMTsKLQl9Ci0JLyogdGhlbiBza2lwICovCi0KLQl3aGlsZSAocF9zaXplID4gMCkgewotCQkvKiB3ZSBzaG91bGQgZG8gYW4gYWN0dWFsIHNraXAgb24gdGhlIG1lZGlhICovCi0JCWxfY3VycmVudF9za2lwX25iX2J5dGVzID0gcF9zdHJlYW0tPm1fc2tpcF9mbihwX3NpemUsIHBfc3RyZWFtLT5tX3VzZXJfZGF0YSk7Ci0JCQotCQlpZiAobF9jdXJyZW50X3NraXBfbmJfYnl0ZXMgPT0gKE9QSl9PRkZfVCktMSkgewotCQkJb3BqX2V2ZW50X21zZyhwX2V2ZW50X21nciwgRVZUX0lORk8sICJTdHJlYW0gZXJyb3IhXG4iKTsKLQotCQkJcF9zdHJlYW0tPm1fc3RhdHVzIHw9IG9wal9zdHJlYW1fZV9lcnJvcjsKLQkJCXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IGxfc2tpcF9uYl9ieXRlczsKLQkJCS8qIGVuZCBpZiBzdHJlYW0gKi8KLQkJCXJldHVybiBsX3NraXBfbmJfYnl0ZXMgPyBsX3NraXBfbmJfYnl0ZXMgOiAoT1BKX09GRl9UKS0xOwotCQl9Ci0JCXBfc2l6ZSAtPSBsX2N1cnJlbnRfc2tpcF9uYl9ieXRlczsKLQkJbF9za2lwX25iX2J5dGVzICs9IGxfY3VycmVudF9za2lwX25iX2J5dGVzOwotCX0KLQotCXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IGxfc2tpcF9uYl9ieXRlczsKLQkKLQlyZXR1cm4gbF9za2lwX25iX2J5dGVzOwotfQotCi1PUEpfT0ZGX1Qgb3BqX3N0cmVhbV90ZWxsIChjb25zdCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtKQotewotCXJldHVybiBwX3N0cmVhbS0+bV9ieXRlX29mZnNldDsKLX0KLQotT1BKX09GRl9UIG9wal9zdHJlYW1fZ2V0X251bWJlcl9ieXRlX2xlZnQgKGNvbnN0IG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0pCi17Ci0gIGFzc2VydCggcF9zdHJlYW0tPm1fYnl0ZV9vZmZzZXQgPj0gMCApOwotICBhc3NlcnQoIHBfc3RyZWFtLT5tX3VzZXJfZGF0YV9sZW5ndGggPj0gKE9QSl9VSU5UNjQpcF9zdHJlYW0tPm1fYnl0ZV9vZmZzZXQpOwotICByZXR1cm4gcF9zdHJlYW0tPm1fdXNlcl9kYXRhX2xlbmd0aCA/Ci0JCQkJKE9QSl9PRkZfVCkocF9zdHJlYW0tPm1fdXNlcl9kYXRhX2xlbmd0aCkgLSBwX3N0cmVhbS0+bV9ieXRlX29mZnNldCA6Ci0JCQkJMDsKLX0KLQotT1BKX09GRl9UIG9wal9zdHJlYW1fc2tpcCAob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSwgT1BKX09GRl9UIHBfc2l6ZSwgb3BqX2V2ZW50X21ncl90ICogcF9ldmVudF9tZ3IpCi17Ci0JYXNzZXJ0KHBfc2l6ZSA+PSAwKTsKLQlyZXR1cm4gcF9zdHJlYW0tPm1fb3BqX3NraXAocF9zdHJlYW0scF9zaXplLHBfZXZlbnRfbWdyKTsKLX0KLQotT1BKX0JPT0wgb3BqX3N0cmVhbV9yZWFkX3NlZWsgKG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0sIE9QSl9PRkZfVCBwX3NpemUsIG9wal9ldmVudF9tZ3JfdCAqIHBfZXZlbnRfbWdyKQotewotCU9QSl9BUkdfTk9UX1VTRUQocF9ldmVudF9tZ3IpOwotCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSA9IHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhOwotCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA9IDA7Ci0KLQlpZiggIShwX3N0cmVhbS0+bV9zZWVrX2ZuKHBfc2l6ZSxwX3N0cmVhbS0+bV91c2VyX2RhdGEpKSApIHsKLQkJcF9zdHJlYW0tPm1fc3RhdHVzIHw9IG9wal9zdHJlYW1fZV9lbmQ7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCWVsc2UgewotCQkvKiByZXNldCBzdHJlYW0gc3RhdHVzICovCi0JCXBfc3RyZWFtLT5tX3N0YXR1cyAmPSAofm9wal9zdHJlYW1fZV9lbmQpOwotCQlwX3N0cmVhbS0+bV9ieXRlX29mZnNldCA9IHBfc2l6ZTsKLQotCX0KLQotCXJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX0JPT0wgb3BqX3N0cmVhbV93cml0ZV9zZWVrIChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLCBPUEpfT0ZGX1QgcF9zaXplLCBvcGpfZXZlbnRfbWdyX3QgKiBwX2V2ZW50X21ncikKLXsKLQlpZiAoISBvcGpfc3RyZWFtX2ZsdXNoKHBfc3RyZWFtLHBfZXZlbnRfbWdyKSkgewotCQlwX3N0cmVhbS0+bV9zdGF0dXMgfD0gb3BqX3N0cmVhbV9lX2Vycm9yOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQotCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSA9IHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhOwotCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA9IDA7Ci0KLQlpZiAoISBwX3N0cmVhbS0+bV9zZWVrX2ZuKHBfc2l6ZSxwX3N0cmVhbS0+bV91c2VyX2RhdGEpKSB7Ci0JCXBfc3RyZWFtLT5tX3N0YXR1cyB8PSBvcGpfc3RyZWFtX2VfZXJyb3I7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCWVsc2UgewotCQlwX3N0cmVhbS0+bV9ieXRlX29mZnNldCA9IHBfc2l6ZTsKLQl9Ci0KLQlyZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9CT09MIG9wal9zdHJlYW1fc2VlayAob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSwgT1BKX09GRl9UIHBfc2l6ZSwgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX2V2ZW50X21ncikKLXsKLQlhc3NlcnQocF9zaXplID49IDApOwotCXJldHVybiBwX3N0cmVhbS0+bV9vcGpfc2VlayhwX3N0cmVhbSxwX3NpemUscF9ldmVudF9tZ3IpOwotfQotCi1PUEpfQk9PTCBvcGpfc3RyZWFtX2hhc19zZWVrIChjb25zdCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtKQotewotCXJldHVybiBwX3N0cmVhbS0+bV9zZWVrX2ZuICE9IG9wal9zdHJlYW1fZGVmYXVsdF9zZWVrOwotfQotCi1PUEpfU0laRV9UIG9wal9zdHJlYW1fZGVmYXVsdF9yZWFkICh2b2lkICogcF9idWZmZXIsIE9QSl9TSVpFX1QgcF9uYl9ieXRlcywgdm9pZCAqIHBfdXNlcl9kYXRhKQotewotCU9QSl9BUkdfTk9UX1VTRUQocF9idWZmZXIpOwotCU9QSl9BUkdfTk9UX1VTRUQocF9uYl9ieXRlcyk7Ci0JT1BKX0FSR19OT1RfVVNFRChwX3VzZXJfZGF0YSk7Ci0JcmV0dXJuIChPUEpfU0laRV9UKSAtMTsKLX0KLQotT1BKX1NJWkVfVCBvcGpfc3RyZWFtX2RlZmF1bHRfd3JpdGUgKHZvaWQgKiBwX2J1ZmZlciwgT1BKX1NJWkVfVCBwX25iX2J5dGVzLCB2b2lkICogcF91c2VyX2RhdGEpCi17Ci0JT1BKX0FSR19OT1RfVVNFRChwX2J1ZmZlcik7Ci0JT1BKX0FSR19OT1RfVVNFRChwX25iX2J5dGVzKTsKLQlPUEpfQVJHX05PVF9VU0VEKHBfdXNlcl9kYXRhKTsKLQlyZXR1cm4gKE9QSl9TSVpFX1QpIC0xOwotfQotCi1PUEpfT0ZGX1Qgb3BqX3N0cmVhbV9kZWZhdWx0X3NraXAgKE9QSl9PRkZfVCBwX25iX2J5dGVzLCB2b2lkICogcF91c2VyX2RhdGEpCi17Ci0JT1BKX0FSR19OT1RfVVNFRChwX25iX2J5dGVzKTsKLQlPUEpfQVJHX05PVF9VU0VEKHBfdXNlcl9kYXRhKTsKLQlyZXR1cm4gKE9QSl9PRkZfVCkgLTE7Ci19Ci0KLU9QSl9CT09MIG9wal9zdHJlYW1fZGVmYXVsdF9zZWVrIChPUEpfT0ZGX1QgcF9uYl9ieXRlcywgdm9pZCAqIHBfdXNlcl9kYXRhKQotewotCU9QSl9BUkdfTk9UX1VTRUQocF9uYl9ieXRlcyk7Ci0JT1BKX0FSR19OT1RfVVNFRChwX3VzZXJfZGF0YSk7Ci0JcmV0dXJuIE9QSl9GQUxTRTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9jaW8uaCBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9jaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRmYTViYi4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvY2lvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOTkgKzAsMCBAQAotLyoKLSAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzIAotICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIAotICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cwotICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBVbml2ZXJzaXRlIGNhdGhvbGlxdWUgZGUgTG91dmFpbiAoVUNMKSwgQmVsZ2l1bQotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFByb2Zlc3NvciBCZW5vaXQgTWFjcQotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMsIERhdmlkIEphbnNzZW5zCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgWWFubmljayBWZXJzY2h1ZXJlbgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4IAotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTQsIEFudG9uaW4gRGVzY2FtcGUKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExLTIwMTIsIENlbnRyZSBOYXRpb25hbCBkJ0V0dWRlcyBTcGF0aWFsZXMgKENORVMpLCBGUiAKLSAqIENvcHlyaWdodCAoYykgMjAxMiwgQ1MgU3lzdGVtZXMgZCdJbmZvcm1hdGlvbiwgRnJhbmNlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKLSAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX19DSU9fSAotI2RlZmluZSBfX0NJT19ICi0vKioKLUBmaWxlIGNpby5oCi1AYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYSBieXRlIGlucHV0LW91dHB1dCBwcm9jZXNzIChDSU8pCi0KLVRoZSBmdW5jdGlvbnMgaW4gQ0lPLkMgaGF2ZSBmb3IgZ29hbCB0byByZWFsaXplIGEgYnl0ZSBpbnB1dCAvIG91dHB1dCBwcm9jZXNzLgotKi8KLQotLyoqIEBkZWZncm91cCBDSU8gQ0lPIC0gYnl0ZSBpbnB1dC1vdXRwdXQgc3RyZWFtICovCi0vKkB7Ki8KLQotI2luY2x1ZGUgIm9wal9jb25maWdfcHJpdmF0ZS5oIgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaWYgZGVmaW5lZChPUEpfQklHX0VORElBTikKLQkjZGVmaW5lIG9wal93cml0ZV9ieXRlcwkJb3BqX3dyaXRlX2J5dGVzX0JFCi0JI2RlZmluZSBvcGpfcmVhZF9ieXRlcwkJb3BqX3JlYWRfYnl0ZXNfQkUKLQkjZGVmaW5lIG9wal93cml0ZV9kb3VibGUJb3BqX3dyaXRlX2RvdWJsZV9CRQotCSNkZWZpbmUgb3BqX3JlYWRfZG91YmxlCQlvcGpfcmVhZF9kb3VibGVfQkUKLQkjZGVmaW5lIG9wal93cml0ZV9mbG9hdAkJb3BqX3dyaXRlX2Zsb2F0X0JFCi0JI2RlZmluZSBvcGpfcmVhZF9mbG9hdAkJb3BqX3JlYWRfZmxvYXRfQkUKLSNlbHNlCi0JI2RlZmluZSBvcGpfd3JpdGVfYnl0ZXMJCW9wal93cml0ZV9ieXRlc19MRQotCSNkZWZpbmUgb3BqX3JlYWRfYnl0ZXMJCW9wal9yZWFkX2J5dGVzX0xFCi0JI2RlZmluZSBvcGpfd3JpdGVfZG91YmxlCW9wal93cml0ZV9kb3VibGVfTEUKLQkjZGVmaW5lIG9wal9yZWFkX2RvdWJsZQkJb3BqX3JlYWRfZG91YmxlX0xFCi0JI2RlZmluZSBvcGpfd3JpdGVfZmxvYXQJCW9wal93cml0ZV9mbG9hdF9MRQotCSNkZWZpbmUgb3BqX3JlYWRfZmxvYXQJCW9wal9yZWFkX2Zsb2F0X0xFCi0jZW5kaWYKLQotCi0KLXR5cGVkZWYgZW51bQotewotCW9wal9zaWduZWRfc2VudGluZWwJCT0gLTEsIC8qIGRvIG5vdCB1c2UgaW4gY29kZSAqLwotCW9wal9zdHJlYW1fZV9vdXRwdXQJCT0gMHgxLAotCW9wal9zdHJlYW1fZV9pbnB1dAkJPSAweDIsCi0Jb3BqX3N0cmVhbV9lX2VuZAkJPSAweDQsCi0Jb3BqX3N0cmVhbV9lX2Vycm9yCQk9IDB4OAotfQotb3BqX3N0cmVhbV9mbGFnIDsKLQotLyoqCi1CeXRlIGlucHV0LW91dHB1dCBzdHJlYW0uCi0qLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlCi17Ci0JLyoqCi0JICogVXNlciBkYXRhLCBiZSBpdCBmaWxlcywgLi4uIFRoZSBhY3R1YWwgZGF0YSBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHRoZSBzdHJlYW0uCi0JICovCi0Jdm9pZCAqCQkJCQltX3VzZXJfZGF0YTsKLQotCS8qKgotCSAqIFBvaW50ZXIgdG8gZnVuY3Rpb24gdG8gZnJlZSBtX3VzZXJfZGF0YSAoTlVMTCBhdCBpbml0aWFsaXphdGlvbikKLQkgKiB3aGVuIGRlc3Ryb3lpbmcgdGhlIHN0cmVhbS4gSWYgcG9pbnRlciBpcyBOVUxMIHRoZSBmdW5jdGlvbiBpcyBub3QKLQkgKiBjYWxsZWQgYW5kIHRoZSBtX3VzZXJfZGF0YSBpcyBub3QgZnJlZWQgKGV2ZW4gaWYgbm9uLU5VTEwpLgotCSAqLwotCW9wal9zdHJlYW1fZnJlZV91c2VyX2RhdGFfZm4JCW1fZnJlZV91c2VyX2RhdGFfZm47Ci0KLQkvKioKLQkgKiBVc2VyIGRhdGEgbGVuZ3RoCi0JICovCi0JT1BKX1VJTlQ2NCAJCQkJbV91c2VyX2RhdGFfbGVuZ3RoOwotCi0JLyoqCi0JICogUG9pbnRlciB0byBhY3R1YWwgcmVhZCBmdW5jdGlvbiAoTlVMTCBhdCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNpby4KLQkgKi8KLQlvcGpfc3RyZWFtX3JlYWRfZm4JCW1fcmVhZF9mbjsKLQotCS8qKgotCSAqIFBvaW50ZXIgdG8gYWN0dWFsIHdyaXRlIGZ1bmN0aW9uIChOVUxMIGF0IHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgY2lvLgotCSAqLwotCW9wal9zdHJlYW1fd3JpdGVfZm4JCW1fd3JpdGVfZm47Ci0KLQkvKioKLQkgKiBQb2ludGVyIHRvIGFjdHVhbCBza2lwIGZ1bmN0aW9uIChOVUxMIGF0IHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgY2lvLgotCSAqIFRoZXJlIGlzIG5vIHNlZWsgZnVuY3Rpb24gdG8gcHJldmVudCBmcm9tIGJhY2sgYW5kIGZvcnRoIHNsb3cgcHJvY2VkdXJlcy4KLQkgKi8KLQlvcGpfc3RyZWFtX3NraXBfZm4JCW1fc2tpcF9mbjsKLQotCS8qKgotCSAqIFBvaW50ZXIgdG8gYWN0dWFsIHNlZWsgZnVuY3Rpb24gKGlmIGF2YWlsYWJsZSkuCi0JICovCi0Jb3BqX3N0cmVhbV9zZWVrX2ZuCQltX3NlZWtfZm47Ci0KLQkvKioKLQkgKiBBY3R1YWwgZGF0YSBzdG9yZWQgaW50byB0aGUgc3RyZWFtIGlmIHJlYWRlZCBmcm9tLiBEYXRhIGlzIHJlYWQgYnkgY2h1bmsgb2YgZml4ZWQgc2l6ZS4KLQkgKiB5b3Ugc2hvdWxkIG5ldmVyIGFjY2VzcyB0aGlzIGRhdGEgZGlyZWN0bHkuCi0JICovCi0JT1BKX0JZVEUgKgkJCQkJbV9zdG9yZWRfZGF0YTsKLQotCS8qKgotCSAqIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcmVhZCBkYXRhLgotCSAqLwotCU9QSl9CWVRFICoJCQkJCW1fY3VycmVudF9kYXRhOwotCi0gICAgLyoqCi0gICAgKiBGSVhNRSBET0MuCi0gICAgKi8KLQlPUEpfT0ZGX1QgKCogbV9vcGpfc2tpcCkoc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqICxPUEpfT0ZGX1QgLCBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqKTsKLQotICAgIC8qKgotICAgICogRklYTUUgRE9DLgotICAgICovCi0JT1BKX0JPT0wgKCogbV9vcGpfc2VlaykgKHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiAsIE9QSl9PRkZfVCAsIHN0cnVjdCBvcGpfZXZlbnRfbWdyICopOwotCi0JLyoqCi0JICogbnVtYmVyIG9mIGJ5dGVzIGNvbnRhaW5pbmcgaW4gdGhlIGJ1ZmZlci4KLQkgKi8KLQlPUEpfU0laRV9UCQkJbV9ieXRlc19pbl9idWZmZXI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQvd3JpdHRlbiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbQotCSAqLwotCU9QSl9PRkZfVAkJCW1fYnl0ZV9vZmZzZXQ7Ci0KLQkvKioKLQkgKiBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyLgotCSAqLwotCU9QSl9TSVpFX1QJCQltX2J1ZmZlcl9zaXplOwotCi0JLyoqCi0JICogRmxhZ3MgdG8gdGVsbCB0aGUgc3RhdHVzIG9mIHRoZSBzdHJlYW0uCi0JICovCi0Jb3BqX3N0cmVhbV9mbGFnIG1fc3RhdHVzOwotCi19Ci1vcGpfc3RyZWFtX3ByaXZhdGVfdDsKLQotLyoqIEBuYW1lIEV4cG9ydGVkIGZ1bmN0aW9ucyAoc2VlIGFsc28gb3BlbmpwZWcuaCkgKi8KLS8qQHsqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qKgotICogV3JpdGUgc29tZSBieXRlcyB0byB0aGUgZ2l2ZW4gZGF0YSBidWZmZXIsIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiBCaWcgRW5kaWFuIGNwdXMuCi0gKiBAcGFyYW0gcF9idWZmZXIJCXBvaW50ZXIgdGhlIGRhdGEgYnVmZmVyIHRvIHdyaXRlIGRhdGEgdG8uCi0gKiBAcGFyYW0gcF92YWx1ZQkJdGhlIHZhbHVlIHRvIHdyaXRlCi0gKiBAcGFyYW0gcF9uYl9ieXRlcwl0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCi0qLwotdm9pZCBvcGpfd3JpdGVfYnl0ZXNfQkUgKE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9VSU5UMzIgcF92YWx1ZSwgT1BKX1VJTlQzMiBwX25iX2J5dGVzKTsKLQotLyoqCi0gKiBSZWFkcyBzb21lIGJ5dGVzIGZyb20gdGhlIGdpdmVuIGRhdGEgYnVmZmVyLCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gQmlnIEVuZGlhbiBjcHVzLgotICogQHBhcmFtIHBfYnVmZmVyCQlwb2ludGVyIHRoZSBkYXRhIGJ1ZmZlciB0byByZWFkIGRhdGEgZnJvbS4KLSAqIEBwYXJhbSBwX3ZhbHVlCQlwb2ludGVyIHRvIHRoZSB2YWx1ZSB0aGF0IHdpbGwgc3RvcmUgdGhlIGRhdGEuCi0gKiBAcGFyYW0gcF9uYl9ieXRlcwl0aGUgbmIgYnl0ZXMgdG8gcmVhZC4KLSAqIEByZXR1cm4JCQkJdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VyZWQuCi0gKi8KLXZvaWQgb3BqX3JlYWRfYnl0ZXNfQkUoY29uc3QgT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX1VJTlQzMiAqIHBfdmFsdWUsIE9QSl9VSU5UMzIgcF9uYl9ieXRlcyk7Ci0KLS8qKgotICogV3JpdGUgc29tZSBieXRlcyB0byB0aGUgZ2l2ZW4gZGF0YSBidWZmZXIsIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiBMaXR0bGUgRW5kaWFuIGNwdXMuCi0gKiBAcGFyYW0gcF9idWZmZXIJCXBvaW50ZXIgdGhlIGRhdGEgYnVmZmVyIHRvIHdyaXRlIGRhdGEgdG8uCi0gKiBAcGFyYW0gcF92YWx1ZQkJdGhlIHZhbHVlIHRvIHdyaXRlCi0gKiBAcGFyYW0gcF9uYl9ieXRlcwl0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCi0gKiBAcmV0dXJuCQkJCXRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBvciAtMSBpZiBhbiBlcnJvciBvY2N1cmVkCi0qLwotdm9pZCBvcGpfd3JpdGVfYnl0ZXNfTEUgKE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9VSU5UMzIgcF92YWx1ZSwgT1BKX1VJTlQzMiBwX25iX2J5dGVzKTsKLQotLyoqCi0gKiBSZWFkcyBzb21lIGJ5dGVzIGZyb20gdGhlIGdpdmVuIGRhdGEgYnVmZmVyLCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gTGl0dGxlIEVuZGlhbiBjcHVzLgotICogQHBhcmFtIHBfYnVmZmVyCQlwb2ludGVyIHRoZSBkYXRhIGJ1ZmZlciB0byByZWFkIGRhdGEgZnJvbS4KLSAqIEBwYXJhbSBwX3ZhbHVlCQlwb2ludGVyIHRvIHRoZSB2YWx1ZSB0aGF0IHdpbGwgc3RvcmUgdGhlIGRhdGEuCi0gKiBAcGFyYW0gcF9uYl9ieXRlcwl0aGUgbmIgYnl0ZXMgdG8gcmVhZC4KLSAqIEByZXR1cm4JCQkJdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VyZWQuCi0gKi8KLXZvaWQgb3BqX3JlYWRfYnl0ZXNfTEUoY29uc3QgT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX1VJTlQzMiAqIHBfdmFsdWUsIE9QSl9VSU5UMzIgcF9uYl9ieXRlcyk7Ci0KLQotLyoqCi0gKiBXcml0ZSBzb21lIGJ5dGVzIHRvIHRoZSBnaXZlbiBkYXRhIGJ1ZmZlciwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIExpdHRsZSBFbmRpYW4gY3B1cy4KLSAqIEBwYXJhbSBwX2J1ZmZlcgkJcG9pbnRlciB0aGUgZGF0YSBidWZmZXIgdG8gd3JpdGUgZGF0YSB0by4KLSAqIEBwYXJhbSBwX3ZhbHVlCQl0aGUgdmFsdWUgdG8gd3JpdGUKLSAqLwotdm9pZCBvcGpfd3JpdGVfZG91YmxlX0xFKE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9GTE9BVDY0IHBfdmFsdWUpOwotCi0vKioqCi0gKiBXcml0ZSBzb21lIGJ5dGVzIHRvIHRoZSBnaXZlbiBkYXRhIGJ1ZmZlciwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIEJpZyBFbmRpYW4gY3B1cy4KLSAqIEBwYXJhbSBwX2J1ZmZlcgkJcG9pbnRlciB0aGUgZGF0YSBidWZmZXIgdG8gd3JpdGUgZGF0YSB0by4KLSAqIEBwYXJhbSBwX3ZhbHVlCQl0aGUgdmFsdWUgdG8gd3JpdGUKLSAqLwotdm9pZCBvcGpfd3JpdGVfZG91YmxlX0JFKE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9GTE9BVDY0IHBfdmFsdWUpOwotCi0vKioKLSAqIFJlYWRzIHNvbWUgYnl0ZXMgZnJvbSB0aGUgZ2l2ZW4gZGF0YSBidWZmZXIsIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiBMaXR0bGUgRW5kaWFuIGNwdXMuCi0gKiBAcGFyYW0gcF9idWZmZXIJCXBvaW50ZXIgdGhlIGRhdGEgYnVmZmVyIHRvIHJlYWQgZGF0YSBmcm9tLgotICogQHBhcmFtIHBfdmFsdWUJCXBvaW50ZXIgdG8gdGhlIHZhbHVlIHRoYXQgd2lsbCBzdG9yZSB0aGUgZGF0YS4KLSAqLwotdm9pZCBvcGpfcmVhZF9kb3VibGVfTEUoY29uc3QgT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX0ZMT0FUNjQgKiBwX3ZhbHVlKTsKLQotLyoqCi0gKiBSZWFkcyBzb21lIGJ5dGVzIGZyb20gdGhlIGdpdmVuIGRhdGEgYnVmZmVyLCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gQmlnIEVuZGlhbiBjcHVzLgotICogQHBhcmFtIHBfYnVmZmVyCQlwb2ludGVyIHRoZSBkYXRhIGJ1ZmZlciB0byByZWFkIGRhdGEgZnJvbS4KLSAqIEBwYXJhbSBwX3ZhbHVlCQlwb2ludGVyIHRvIHRoZSB2YWx1ZSB0aGF0IHdpbGwgc3RvcmUgdGhlIGRhdGEuCi0gKi8KLXZvaWQgb3BqX3JlYWRfZG91YmxlX0JFKGNvbnN0IE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9GTE9BVDY0ICogcF92YWx1ZSk7Ci0KLS8qKgotICogUmVhZHMgc29tZSBieXRlcyBmcm9tIHRoZSBnaXZlbiBkYXRhIGJ1ZmZlciwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIExpdHRsZSBFbmRpYW4gY3B1cy4KLSAqIEBwYXJhbSBwX2J1ZmZlcgkJcG9pbnRlciB0aGUgZGF0YSBidWZmZXIgdG8gcmVhZCBkYXRhIGZyb20uCi0gKiBAcGFyYW0gcF92YWx1ZQkJcG9pbnRlciB0byB0aGUgdmFsdWUgdGhhdCB3aWxsIHN0b3JlIHRoZSBkYXRhLgotICovCi12b2lkIG9wal9yZWFkX2Zsb2F0X0xFKGNvbnN0IE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9GTE9BVDMyICogcF92YWx1ZSk7Ci0KLS8qKgotICogUmVhZHMgc29tZSBieXRlcyBmcm9tIHRoZSBnaXZlbiBkYXRhIGJ1ZmZlciwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIEJpZyBFbmRpYW4gY3B1cy4KLSAqIEBwYXJhbSBwX2J1ZmZlcgkJcG9pbnRlciB0aGUgZGF0YSBidWZmZXIgdG8gcmVhZCBkYXRhIGZyb20uCi0gKiBAcGFyYW0gcF92YWx1ZQkJcG9pbnRlciB0byB0aGUgdmFsdWUgdGhhdCB3aWxsIHN0b3JlIHRoZSBkYXRhLgotICovCi12b2lkIG9wal9yZWFkX2Zsb2F0X0JFKGNvbnN0IE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9GTE9BVDMyICogcF92YWx1ZSk7Ci0KLS8qKgotICogV3JpdGUgc29tZSBieXRlcyB0byB0aGUgZ2l2ZW4gZGF0YSBidWZmZXIsIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiBMaXR0bGUgRW5kaWFuIGNwdXMuCi0gKiBAcGFyYW0gcF9idWZmZXIJCXBvaW50ZXIgdGhlIGRhdGEgYnVmZmVyIHRvIHdyaXRlIGRhdGEgdG8uCi0gKiBAcGFyYW0gcF92YWx1ZQkJdGhlIHZhbHVlIHRvIHdyaXRlCi0gKi8KLXZvaWQgb3BqX3dyaXRlX2Zsb2F0X0xFKE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9GTE9BVDMyIHBfdmFsdWUpOwotCi0vKioqCi0gKiBXcml0ZSBzb21lIGJ5dGVzIHRvIHRoZSBnaXZlbiBkYXRhIGJ1ZmZlciwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIEJpZyBFbmRpYW4gY3B1cy4KLSAqIEBwYXJhbSBwX2J1ZmZlcgkJcG9pbnRlciB0aGUgZGF0YSBidWZmZXIgdG8gd3JpdGUgZGF0YSB0by4KLSAqIEBwYXJhbSBwX3ZhbHVlCQl0aGUgdmFsdWUgdG8gd3JpdGUKLSAqLwotdm9pZCBvcGpfd3JpdGVfZmxvYXRfQkUoT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX0ZMT0FUMzIgcF92YWx1ZSk7Ci0KLS8qKgotICogUmVhZHMgc29tZSBieXRlcyBmcm9tIHRoZSBzdHJlYW0uCi0gKiBAcGFyYW0JCXBfc3RyZWFtCXRoZSBzdHJlYW0gdG8gcmVhZCBkYXRhIGZyb20uCi0gKiBAcGFyYW0JCXBfYnVmZmVyCXBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyIHRoYXQgd2lsbCByZWNlaXZlIHRoZSBkYXRhLgotICogQHBhcmFtCQlwX3NpemUJCW51bWJlciBvZiBieXRlcyB0byByZWFkLgotICogQHBhcmFtCQlwX2V2ZW50X21ncgl0aGUgdXNlciBldmVudCBtYW5hZ2VyIHRvIGJlIG5vdGlmaWVkIG9mIHNwZWNpYWwgZXZlbnRzLgotICogQHJldHVybgkJdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciAtMSBpZiBhbiBlcnJvciBvY2N1cmVkIG9yIGlmIHRoZSBzdHJlYW0gaXMgYXQgdGhlIGVuZC4KLSAqLwotT1BKX1NJWkVfVCBvcGpfc3RyZWFtX3JlYWRfZGF0YSAob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSxPUEpfQllURSAqIHBfYnVmZmVyLCBPUEpfU0laRV9UIHBfc2l6ZSwgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX2V2ZW50X21ncik7Ci0KLS8qKgotICogV3JpdGVzIHNvbWUgYnl0ZXMgdG8gdGhlIHN0cmVhbS4KLSAqIEBwYXJhbQkJcF9zdHJlYW0JdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgotICogQHBhcmFtCQlwX2J1ZmZlcglwb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciBob2xkcyB0aGUgZGF0YSB0byBiZSB3cml0dGVudC4KLSAqIEBwYXJhbQkJcF9zaXplCQludW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUuCi0gKiBAcGFyYW0JCXBfZXZlbnRfbWdyCXRoZSB1c2VyIGV2ZW50IG1hbmFnZXIgdG8gYmUgbm90aWZpZWQgb2Ygc3BlY2lhbCBldmVudHMuCi0gKiBAcmV0dXJuCQl0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW50LCBvciAtMSBpZiBhbiBlcnJvciBvY2N1cmVkLgotICovCi1PUEpfU0laRV9UIG9wal9zdHJlYW1fd3JpdGVfZGF0YSAob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSxjb25zdCBPUEpfQllURSAqIHBfYnVmZmVyLCBPUEpfU0laRV9UIHBfc2l6ZSwgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX2V2ZW50X21ncik7Ci0KLS8qKgotICogV3JpdGVzIHRoZSBjb250ZW50IG9mIHRoZSBzdHJlYW0gYnVmZmVyIHRvIHRoZSBzdHJlYW0uCi0gKiBAcGFyYW0JCXBfc3RyZWFtCXRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KLSAqIEBwYXJhbQkJcF9ldmVudF9tZ3IJdGhlIHVzZXIgZXZlbnQgbWFuYWdlciB0byBiZSBub3RpZmllZCBvZiBzcGVjaWFsIGV2ZW50cy4KLSAqIEByZXR1cm4JCXRydWUgaWYgdGhlIGRhdGEgY291bGQgYmUgZmx1c2hlZCwgZmFsc2UgZWxzZS4KLSAqLwotT1BKX0JPT0wgb3BqX3N0cmVhbV9mbHVzaCAob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSwgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX2V2ZW50X21ncik7Ci0KLS8qKgotICogU2tpcHMgYSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLgotICogQHBhcmFtCQlwX3N0cmVhbQl0aGUgc3RyZWFtIHRvIHNraXAgZGF0YSBmcm9tLgotICogQHBhcmFtCQlwX3NpemUJCXRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcC4KLSAqIEBwYXJhbQkJcF9ldmVudF9tZ3IJdGhlIHVzZXIgZXZlbnQgbWFuYWdlciB0byBiZSBub3RpZmllZCBvZiBzcGVjaWFsIGV2ZW50cy4KLSAqIEByZXR1cm4JCXRoZSBudW1iZXIgb2YgYnl0ZXMgc2tpcHBlZCwgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJlZC4KLSAqLwotT1BKX09GRl9UIG9wal9zdHJlYW1fc2tpcCAob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSxPUEpfT0ZGX1QgcF9zaXplLCBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfZXZlbnRfbWdyKTsKLQotLyoqCi0gKiBUZWxscyB0aGUgYnl0ZSBvZmZzZXQgb24gdGhlIHN0cmVhbSAoc2ltaWxhciB0byBmdGVsbCkuCi0gKgotICogQHBhcmFtCQlwX3N0cmVhbQl0aGUgc3RyZWFtIHRvIGdldCB0aGUgaW5mb3JtYXRpb24gZnJvbS4KLSAqCi0gKiBAcmV0dXJuCQl0aGUgY3VycmVudCBwb3NpdGlvbiBvIGZ0aGUgc3RyZWFtLgotICovCi1PUEpfT0ZGX1Qgb3BqX3N0cmVhbV90ZWxsIChjb25zdCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtKTsKLQotCi0vKioKLSAqIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGxlZnQgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSAoc2ltaWxhciB0byBjaW9fbnVtYnl0ZXNsZWZ0KS4KLSAqCi0gKiBAcGFyYW0JCXBfc3RyZWFtCXRoZSBzdHJlYW0gdG8gZ2V0IHRoZSBpbmZvcm1hdGlvbiBmcm9tLgotICoKLSAqIEByZXR1cm4JCU51bWJlciBvZiBieXRlcyBsZWZ0IGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uCi0gKi8KLU9QSl9PRkZfVCBvcGpfc3RyZWFtX2dldF9udW1iZXJfYnl0ZV9sZWZ0IChjb25zdCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtKTsKLQotLyoqCi0gKiBTa2lwcyBhIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBzdHJlYW0uCi0gKiBAcGFyYW0JCXBfc3RyZWFtCXRoZSBzdHJlYW0gdG8gc2tpcCBkYXRhIGZyb20uCi0gKiBAcGFyYW0JCXBfc2l6ZQkJdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwLgotICogQHBhcmFtCQlwX2V2ZW50X21ncgl0aGUgdXNlciBldmVudCBtYW5hZ2VyIHRvIGJlIG5vdGlmaWVkIG9mIHNwZWNpYWwgZXZlbnRzLgotICogQHJldHVybgkJdGhlIG51bWJlciBvZiBieXRlcyBza2lwcGVkLCBvciAtMSBpZiBhbiBlcnJvciBvY2N1cmVkLgotICovCi1PUEpfT0ZGX1Qgb3BqX3N0cmVhbV93cml0ZV9za2lwIChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLCBPUEpfT0ZGX1QgcF9zaXplLCBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfZXZlbnRfbWdyKTsKLQotLyoqCi0gKiBTa2lwcyBhIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBzdHJlYW0uCi0gKiBAcGFyYW0JCXBfc3RyZWFtCXRoZSBzdHJlYW0gdG8gc2tpcCBkYXRhIGZyb20uCi0gKiBAcGFyYW0JCXBfc2l6ZQkJdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwLgotICogQHBhcmFtCQlwX2V2ZW50X21ncgl0aGUgdXNlciBldmVudCBtYW5hZ2VyIHRvIGJlIG5vdGlmaWVkIG9mIHNwZWNpYWwgZXZlbnRzLgotICogQHJldHVybgkJdGhlIG51bWJlciBvZiBieXRlcyBza2lwcGVkLCBvciAtMSBpZiBhbiBlcnJvciBvY2N1cmVkLgotICovCi1PUEpfT0ZGX1Qgb3BqX3N0cmVhbV9yZWFkX3NraXAgKG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0sIE9QSl9PRkZfVCBwX3NpemUsIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9ldmVudF9tZ3IpOwotCi0vKioKLSAqIFNraXBzIGEgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHN0cmVhbS4KLSAqIEBwYXJhbQkJcF9zdHJlYW0JdGhlIHN0cmVhbSB0byBza2lwIGRhdGEgZnJvbS4KLSAqIEBwYXJhbQkJcF9zaXplCQl0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuCi0gKiBAcGFyYW0JCXBfZXZlbnRfbWdyCXRoZSB1c2VyIGV2ZW50IG1hbmFnZXIgdG8gYmUgbm90aWZpZWQgb2Ygc3BlY2lhbCBldmVudHMuCi0gKiBAcmV0dXJuCQlPUEpfVFJVRSBpZiBzdWNjZXNzLCBvciBPUEpfRkFMU0UgaWYgYW4gZXJyb3Igb2NjdXJlZC4KLSAqLwotT1BKX0JPT0wgb3BqX3N0cmVhbV9yZWFkX3NlZWsgKG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0sIE9QSl9PRkZfVCBwX3NpemUsIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9ldmVudF9tZ3IpOwotCi0vKioKLSAqIFNraXBzIGEgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHN0cmVhbS4KLSAqIEBwYXJhbQkJcF9zdHJlYW0JdGhlIHN0cmVhbSB0byBza2lwIGRhdGEgZnJvbS4KLSAqIEBwYXJhbQkJcF9zaXplCQl0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuCi0gKiBAcGFyYW0JCXBfZXZlbnRfbWdyCXRoZSB1c2VyIGV2ZW50IG1hbmFnZXIgdG8gYmUgbm90aWZpZWQgb2Ygc3BlY2lhbCBldmVudHMuCi0gKiBAcmV0dXJuCQl0aGUgbnVtYmVyIG9mIGJ5dGVzIHNraXBwZWQsIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VyZWQuCi0gKi8KLU9QSl9CT09MIG9wal9zdHJlYW1fd3JpdGVfc2VlayAob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSwgT1BKX09GRl9UIHBfc2l6ZSwgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX2V2ZW50X21ncik7Ci0KLS8qKgotICogU2Vla3MgYSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLgotICogQHBhcmFtCQlwX3N0cmVhbQl0aGUgc3RyZWFtIHRvIHNraXAgZGF0YSBmcm9tLgotICogQHBhcmFtCQlwX3NpemUJCXRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcC4KLSAqIEBwYXJhbQkJcF9ldmVudF9tZ3IJdGhlIHVzZXIgZXZlbnQgbWFuYWdlciB0byBiZSBub3RpZmllZCBvZiBzcGVjaWFsIGV2ZW50cy4KLSAqIEByZXR1cm4JCXRydWUgaWYgdGhlIHN0cmVhbSBpcyBzZWVrYWJsZS4KLSAqLwotT1BKX0JPT0wgb3BqX3N0cmVhbV9zZWVrIChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLCBPUEpfT0ZGX1QgcF9zaXplLCBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfZXZlbnRfbWdyKTsKLQotLyoqCi0gKiBUZWxscyBpZiB0aGUgZ2l2ZW4gc3RyZWFtIGlzIHNlZWthYmxlLgotICovCi1PUEpfQk9PTCBvcGpfc3RyZWFtX2hhc19zZWVrIChjb25zdCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtKTsKLQotLyoqCi0gKiBGSVhNRSBET0MuCi0gKi8KLU9QSl9TSVpFX1Qgb3BqX3N0cmVhbV9kZWZhdWx0X3JlYWQgKHZvaWQgKiBwX2J1ZmZlciwgT1BKX1NJWkVfVCBwX25iX2J5dGVzLCB2b2lkICogcF91c2VyX2RhdGEpOwotCi0vKioKLSAqIEZJWE1FIERPQy4KLSAqLwotT1BKX1NJWkVfVCBvcGpfc3RyZWFtX2RlZmF1bHRfd3JpdGUgKHZvaWQgKiBwX2J1ZmZlciwgT1BKX1NJWkVfVCBwX25iX2J5dGVzLCB2b2lkICogcF91c2VyX2RhdGEpOwotCi0vKioKLSAqIEZJWE1FIERPQy4KLSAqLwotT1BKX09GRl9UIG9wal9zdHJlYW1fZGVmYXVsdF9za2lwIChPUEpfT0ZGX1QgcF9uYl9ieXRlcywgdm9pZCAqIHBfdXNlcl9kYXRhKTsKLQotLyoqCi0gKiBGSVhNRSBET0MuCi0gKi8KLU9QSl9CT09MIG9wal9zdHJlYW1fZGVmYXVsdF9zZWVrIChPUEpfT0ZGX1QgcF9uYl9ieXRlcywgdm9pZCAqIHBfdXNlcl9kYXRhKTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qQH0qLwotCi0vKkB9Ki8KLQotCi0jZW5kaWYgLyogX19DSU9fSCAqLwotCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvZHd0LmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvZHd0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYTQ1NzQuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL2R3dC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTMwICswLDAgQEAKLS8qCi0gKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKLSAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKLSAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKLSAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgVW5pdmVyc2l0ZSBjYXRob2xpcXVlIGRlIExvdXZhaW4gKFVDTCksIEJlbGdpdW0KLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBQcm9mZXNzb3IgQmVub2l0IE1hY3EKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzLCBEYXZpZCBKYW5zc2VucwotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIFlhbm5pY2sgVmVyc2NodWVyZW4KLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eCAKLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE0LCBBbnRvbmluIERlc2NhbXBlCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KLSAqIENvcHlyaWdodCAoYykgMjAwNywgSm9uYXRoYW4gQmFsbGFyZCA8ZHpvbmF0YXNAZHpvbnV4Lm5ldD4KLSAqIENvcHlyaWdodCAoYykgMjAwNywgQ2FsbHVtIExlcndpY2sgPHNlZ0BoYXh4ZWQuY29tPgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCi0gKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZkZWYgX19TU0VfXwotI2luY2x1ZGUgPHhtbWludHJpbi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJvcGpfaW5jbHVkZXMuaCIKLQotLyoqIEBkZWZncm91cCBEV1QgRFdUIC0gSW1wbGVtZW50YXRpb24gb2YgYSBkaXNjcmV0ZSB3YXZlbGV0IHRyYW5zZm9ybSAqLwotLypAeyovCi0KLSNkZWZpbmUgT1BKX1dTKGkpIHYtPm1lbVsoaSkqMl0KLSNkZWZpbmUgT1BKX1dEKGkpIHYtPm1lbVsoMSsoaSkqMildCi0KLS8qKiBAbmFtZSBMb2NhbCBkYXRhIHN0cnVjdHVyZXMgKi8KLS8qQHsqLwotCi10eXBlZGVmIHN0cnVjdCBkd3RfbG9jYWwgewotCU9QSl9JTlQzMiogbWVtOwotCU9QSl9JTlQzMiBkbjsKLQlPUEpfSU5UMzIgc247Ci0JT1BKX0lOVDMyIGNhczsKLX0gb3BqX2R3dF90OwotCi10eXBlZGVmIHVuaW9uIHsKLQlPUEpfRkxPQVQzMglmWzRdOwotfSBvcGpfdjRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgdjRkd3RfbG9jYWwgewotCW9wal92NF90Kgl3YXZlbGV0IDsKLQlPUEpfSU5UMzIJCWRuIDsKLQlPUEpfSU5UMzIJCXNuIDsKLQlPUEpfSU5UMzIJCWNhcyA7Ci19IG9wal92NGR3dF90IDsKLQotc3RhdGljIGNvbnN0IE9QSl9GTE9BVDMyIG9wal9kd3RfYWxwaGEgPSAgMS41ODYxMzQzNDJmOyAvKiAgMTI5OTQgKi8KLXN0YXRpYyBjb25zdCBPUEpfRkxPQVQzMiBvcGpfZHd0X2JldGEgID0gIDAuMDUyOTgwMTE4ZjsgLyogICAgNDM0ICovCi1zdGF0aWMgY29uc3QgT1BKX0ZMT0FUMzIgb3BqX2R3dF9nYW1tYSA9IC0wLjg4MjkxMTA3NWY7IC8qICAtNzIzMyAqLwotc3RhdGljIGNvbnN0IE9QSl9GTE9BVDMyIG9wal9kd3RfZGVsdGEgPSAtMC40NDM1MDY4NTJmOyAvKiAgLTM2MzMgKi8KLQotc3RhdGljIGNvbnN0IE9QSl9GTE9BVDMyIG9wal9LICAgICAgPSAxLjIzMDE3NDEwNWY7IC8qICAxMDA3OCAqLwotc3RhdGljIGNvbnN0IE9QSl9GTE9BVDMyIG9wal9jMTMzMTggPSAxLjYyNTczMjQyMmY7Ci0KLS8qQH0qLwotCi0vKioKLVZpcnR1YWwgZnVuY3Rpb24gdHlwZSBmb3Igd2F2ZWxldCB0cmFuc2Zvcm0gaW4gMS1EIAotKi8KLXR5cGVkZWYgdm9pZCAoKkRXVDFERk4pKG9wal9kd3RfdCogdik7Ci0KLS8qKiBAbmFtZSBMb2NhbCBzdGF0aWMgZnVuY3Rpb25zICovCi0vKkB7Ki8KLQotLyoqCi1Gb3J3YXJkIGxhenkgdHJhbnNmb3JtIChob3Jpem9udGFsKQotKi8KLXN0YXRpYyB2b2lkIG9wal9kd3RfZGVpbnRlcmxlYXZlX2goT1BKX0lOVDMyICphLCBPUEpfSU5UMzIgKmIsIE9QSl9JTlQzMiBkbiwgT1BKX0lOVDMyIHNuLCBPUEpfSU5UMzIgY2FzKTsKLS8qKgotRm9yd2FyZCBsYXp5IHRyYW5zZm9ybSAodmVydGljYWwpCi0qLwotc3RhdGljIHZvaWQgb3BqX2R3dF9kZWludGVybGVhdmVfdihPUEpfSU5UMzIgKmEsIE9QSl9JTlQzMiAqYiwgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiB4LCBPUEpfSU5UMzIgY2FzKTsKLS8qKgotSW52ZXJzZSBsYXp5IHRyYW5zZm9ybSAoaG9yaXpvbnRhbCkKLSovCi1zdGF0aWMgdm9pZCBvcGpfZHd0X2ludGVybGVhdmVfaChvcGpfZHd0X3QqIGgsIE9QSl9JTlQzMiAqYSk7Ci0vKioKLUludmVyc2UgbGF6eSB0cmFuc2Zvcm0gKHZlcnRpY2FsKQotKi8KLXN0YXRpYyB2b2lkIG9wal9kd3RfaW50ZXJsZWF2ZV92KG9wal9kd3RfdCogdiwgT1BKX0lOVDMyICphLCBPUEpfSU5UMzIgeCk7Ci0vKioKLUZvcndhcmQgNS0zIHdhdmVsZXQgdHJhbnNmb3JtIGluIDEtRAotKi8KLXN0YXRpYyB2b2lkIG9wal9kd3RfZW5jb2RlXzEoT1BKX0lOVDMyICphLCBPUEpfSU5UMzIgZG4sIE9QSl9JTlQzMiBzbiwgT1BKX0lOVDMyIGNhcyk7Ci0vKioKLUludmVyc2UgNS0zIHdhdmVsZXQgdHJhbnNmb3JtIGluIDEtRAotKi8KLXN0YXRpYyB2b2lkIG9wal9kd3RfZGVjb2RlXzEob3BqX2R3dF90ICp2KTsKLXN0YXRpYyB2b2lkIG9wal9kd3RfZGVjb2RlXzFfKE9QSl9JTlQzMiAqYSwgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpOwotLyoqCi1Gb3J3YXJkIDktNyB3YXZlbGV0IHRyYW5zZm9ybSBpbiAxLUQKLSovCi1zdGF0aWMgdm9pZCBvcGpfZHd0X2VuY29kZV8xX3JlYWwoT1BKX0lOVDMyICphLCBPUEpfSU5UMzIgZG4sIE9QSl9JTlQzMiBzbiwgT1BKX0lOVDMyIGNhcyk7Ci0vKioKLUV4cGxpY2l0IGNhbGN1bGF0aW9uIG9mIHRoZSBRdWFudGl6YXRpb24gU3RlcHNpemVzIAotKi8KLXN0YXRpYyB2b2lkIG9wal9kd3RfZW5jb2RlX3N0ZXBzaXplKE9QSl9JTlQzMiBzdGVwc2l6ZSwgT1BKX0lOVDMyIG51bWJwcywgb3BqX3N0ZXBzaXplX3QgKmJhbmRub19zdGVwc2l6ZSk7Ci0vKioKLUludmVyc2Ugd2F2ZWxldCB0cmFuc2Zvcm0gaW4gMi1ELgotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfZHd0X2RlY29kZV90aWxlKG9wal90Y2RfdGlsZWNvbXBfdCogdGlsZWMsIE9QSl9VSU5UMzIgaSwgRFdUMURGTiBmbik7Ci0KLXN0YXRpYyBPUEpfQk9PTCBvcGpfZHd0X2VuY29kZV9wcm9jZWR1cmUoCW9wal90Y2RfdGlsZWNvbXBfdCAqIHRpbGVjLAotCQkJCQkJCQkJCSAgICB2b2lkICgqcF9mdW5jdGlvbikoT1BKX0lOVDMyICosIE9QSl9JTlQzMixPUEpfSU5UMzIsT1BKX0lOVDMyKSApOwotCi1zdGF0aWMgT1BKX1VJTlQzMiBvcGpfZHd0X21heF9yZXNvbHV0aW9uKG9wal90Y2RfcmVzb2x1dGlvbl90KiByZXN0cmljdCByLCBPUEpfVUlOVDMyIGkpOwotCi0vKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBJbnZlcnNlIDktNyB3YXZlbGV0IHRyYW5zZm9ybSBpbiAxLUQuICovCi0vKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1zdGF0aWMgdm9pZCBvcGpfdjRkd3RfZGVjb2RlKG9wal92NGR3dF90KiByZXN0cmljdCBkd3QpOwotCi1zdGF0aWMgdm9pZCBvcGpfdjRkd3RfaW50ZXJsZWF2ZV9oKG9wal92NGR3dF90KiByZXN0cmljdCB3LCBPUEpfRkxPQVQzMiogcmVzdHJpY3QgYSwgT1BKX0lOVDMyIHgsIE9QSl9JTlQzMiBzaXplKTsKLQotc3RhdGljIHZvaWQgb3BqX3Y0ZHd0X2ludGVybGVhdmVfdihvcGpfdjRkd3RfdCogcmVzdHJpY3QgdiAsIE9QSl9GTE9BVDMyKiByZXN0cmljdCBhICwgT1BKX0lOVDMyIHgsIE9QSl9JTlQzMiBuYl9lbHRzX3JlYWQpOwotCi0jaWZkZWYgX19TU0VfXwotc3RhdGljIHZvaWQgb3BqX3Y0ZHd0X2RlY29kZV9zdGVwMV9zc2Uob3BqX3Y0X3QqIHcsIE9QSl9JTlQzMiBjb3VudCwgY29uc3QgX19tMTI4IGMpOwotCi1zdGF0aWMgdm9pZCBvcGpfdjRkd3RfZGVjb2RlX3N0ZXAyX3NzZShvcGpfdjRfdCogbCwgb3BqX3Y0X3QqIHcsIE9QSl9JTlQzMiBrLCBPUEpfSU5UMzIgbSwgX19tMTI4IGMpOwotCi0jZWxzZQotc3RhdGljIHZvaWQgb3BqX3Y0ZHd0X2RlY29kZV9zdGVwMShvcGpfdjRfdCogdywgT1BKX0lOVDMyIGNvdW50LCBjb25zdCBPUEpfRkxPQVQzMiBjKTsKLQotc3RhdGljIHZvaWQgb3BqX3Y0ZHd0X2RlY29kZV9zdGVwMihvcGpfdjRfdCogbCwgb3BqX3Y0X3QqIHcsIE9QSl9JTlQzMiBrLCBPUEpfSU5UMzIgbSwgT1BKX0ZMT0FUMzIgYyk7Ci0KLSNlbmRpZgotCi0vKkB9Ki8KLQotLypAfSovCi0KLSNkZWZpbmUgT1BKX1MoaSkgYVsoaSkqMl0KLSNkZWZpbmUgT1BKX0QoaSkgYVsoMSsoaSkqMildCi0jZGVmaW5lIE9QSl9TXyhpKSAoKGkpPDA/T1BKX1MoMCk6KChpKT49c24/T1BKX1Moc24tMSk6T1BKX1MoaSkpKQotI2RlZmluZSBPUEpfRF8oaSkgKChpKTwwP09QSl9EKDApOigoaSk+PWRuP09QSl9EKGRuLTEpOk9QSl9EKGkpKSkKLS8qIG5ldyAqLwotI2RlZmluZSBPUEpfU1NfKGkpICgoaSk8MD9PUEpfUygwKTooKGkpPj1kbj9PUEpfUyhkbi0xKTpPUEpfUyhpKSkpCi0jZGVmaW5lIE9QSl9ERF8oaSkgKChpKTwwP09QSl9EKDApOigoaSk+PXNuP09QSl9EKHNuLTEpOk9QSl9EKGkpKSkKLQotLyogPHN1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyB0YWJsZSBjb250YWlucyB0aGUgbm9ybXMgb2YgdGhlIDUtMyB3YXZlbGV0cyBmb3IgZGlmZmVyZW50IGJhbmRzLiAqLwotLyogPC9zdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotc3RhdGljIGNvbnN0IE9QSl9GTE9BVDY0IG9wal9kd3Rfbm9ybXNbNF1bMTBdID0gewotCXsxLjAwMCwgMS41MDAsIDIuNzUwLCA1LjM3NSwgMTAuNjgsIDIxLjM0LCA0Mi42NywgODUuMzMsIDE3MC43LCAzNDEuM30sCi0JezEuMDM4LCAxLjU5MiwgMi45MTksIDUuNzAzLCAxMS4zMywgMjIuNjQsIDQ1LjI1LCA5MC40OCwgMTgwLjl9LAotCXsxLjAzOCwgMS41OTIsIDIuOTE5LCA1LjcwMywgMTEuMzMsIDIyLjY0LCA0NS4yNSwgOTAuNDgsIDE4MC45fSwKLQl7LjcxODYsIC45MjE4LCAxLjU4NiwgMy4wNDMsIDYuMDE5LCAxMi4wMSwgMjQuMDAsIDQ3Ljk3LCA5NS45M30KLX07Ci0KLS8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIG5vcm1zIG9mIHRoZSA5LTcgd2F2ZWxldHMgZm9yIGRpZmZlcmVudCBiYW5kcy4gKi8KLS8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLXN0YXRpYyBjb25zdCBPUEpfRkxPQVQ2NCBvcGpfZHd0X25vcm1zX3JlYWxbNF1bMTBdID0gewotCXsxLjAwMCwgMS45NjUsIDQuMTc3LCA4LjQwMywgMTYuOTAsIDMzLjg0LCA2Ny42OSwgMTM1LjMsIDI3MC42LCA1NDAuOX0sCi0JezIuMDIyLCAzLjk4OSwgOC4zNTUsIDE3LjA0LCAzNC4yNywgNjguNjMsIDEzNy4zLCAyNzQuNiwgNTQ5LjB9LAotCXsyLjAyMiwgMy45ODksIDguMzU1LCAxNy4wNCwgMzQuMjcsIDY4LjYzLCAxMzcuMywgMjc0LjYsIDU0OS4wfSwKLQl7Mi4wODAsIDMuODY1LCA4LjMwNywgMTcuMTgsIDM0LjcxLCA2OS41OSwgMTM5LjMsIDI3OC42LCA1NTcuMn0KLX07Ci0KLS8qIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgbG9jYWwgZnVuY3Rpb25zCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotCi0vKiA8c3VtbWFyeT4JCQkgICAgICAgICAgICAgICAgICovCi0vKiBGb3J3YXJkIGxhenkgdHJhbnNmb3JtIChob3Jpem9udGFsKS4gICovCi0vKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIAotdm9pZCBvcGpfZHd0X2RlaW50ZXJsZWF2ZV9oKE9QSl9JTlQzMiAqYSwgT1BKX0lOVDMyICpiLCBPUEpfSU5UMzIgZG4sIE9QSl9JTlQzMiBzbiwgT1BKX0lOVDMyIGNhcykgewotCU9QSl9JTlQzMiBpOwotCU9QSl9JTlQzMiAqIGxfZGVzdCA9IGI7Ci0JT1BKX0lOVDMyICogbF9zcmMgPSBhK2NhczsKLQotICAgIGZvciAoaT0wOyBpPHNuOyArK2kpIHsKLQkJKmxfZGVzdCsrID0gKmxfc3JjOwotCQlsX3NyYyArPSAyOwotCX0KLQkKLSAgICBsX2Rlc3QgPSBiICsgc247Ci0JbF9zcmMgPSBhICsgMSAtIGNhczsKLQotICAgIGZvcgkoaT0wOyBpPGRuOyArK2kpICB7Ci0JCSpsX2Rlc3QrKz0qbF9zcmM7Ci0JCWxfc3JjICs9IDI7Ci0JfQotfQotCi0vKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICAKLS8qIEZvcndhcmQgbGF6eSB0cmFuc2Zvcm0gKHZlcnRpY2FsKS4gICAgKi8KLS8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gCi12b2lkIG9wal9kd3RfZGVpbnRlcmxlYXZlX3YoT1BKX0lOVDMyICphLCBPUEpfSU5UMzIgKmIsIE9QSl9JTlQzMiBkbiwgT1BKX0lOVDMyIHNuLCBPUEpfSU5UMzIgeCwgT1BKX0lOVDMyIGNhcykgewotICAgIE9QSl9JTlQzMiBpID0gc247Ci0JT1BKX0lOVDMyICogbF9kZXN0ID0gYjsKLQlPUEpfSU5UMzIgKiBsX3NyYyA9IGErY2FzOwotCi0gICAgd2hpbGUgKGktLSkgewotCQkqbF9kZXN0ID0gKmxfc3JjOwotCQlsX2Rlc3QgKz0geDsKLQkJbF9zcmMgKz0gMjsKLQkJfSAvKiBiW2kqeF09YVsyKmkrY2FzXTsgKi8KLQotCWxfZGVzdCA9IGIgKyBzbiAqIHg7Ci0JbF9zcmMgPSBhICsgMSAtIGNhczsKLQkKLQlpID0gZG47Ci0gICAgd2hpbGUgKGktLSkgewotCQkqbF9kZXN0ID0gKmxfc3JjOwotCQlsX2Rlc3QgKz0geDsKLQkJbF9zcmMgKz0gMjsKLSAgICAgICAgfSAvKmJbKHNuK2kpKnhdPWFbKDIqaSsxLWNhcyldOyovCi19Ci0KLS8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEludmVyc2UgbGF6eSB0cmFuc2Zvcm0gKGhvcml6b250YWwpLiAgKi8KLS8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLXZvaWQgb3BqX2R3dF9pbnRlcmxlYXZlX2gob3BqX2R3dF90KiBoLCBPUEpfSU5UMzIgKmEpIHsKLSAgICBPUEpfSU5UMzIgKmFpID0gYTsKLSAgICBPUEpfSU5UMzIgKmJpID0gaC0+bWVtICsgaC0+Y2FzOwotICAgIE9QSl9JTlQzMiAgaQk9IGgtPnNuOwotICAgIHdoaWxlKCBpLS0gKSB7Ci0gICAgICAqYmkgPSAqKGFpKyspOwotCSAgYmkgKz0gMjsKLSAgICB9Ci0gICAgYWkJPSBhICsgaC0+c247Ci0gICAgYmkJPSBoLT5tZW0gKyAxIC0gaC0+Y2FzOwotICAgIGkJPSBoLT5kbiA7Ci0gICAgd2hpbGUoIGktLSApIHsKLSAgICAgICpiaSA9ICooYWkrKyk7Ci0JICBiaSArPSAyOwotICAgIH0KLX0KLQotLyogPHN1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgCi0vKiBJbnZlcnNlIGxhenkgdHJhbnNmb3JtICh2ZXJ0aWNhbCkuICAgICovCi0vKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIAotdm9pZCBvcGpfZHd0X2ludGVybGVhdmVfdihvcGpfZHd0X3QqIHYsIE9QSl9JTlQzMiAqYSwgT1BKX0lOVDMyIHgpIHsKLSAgICBPUEpfSU5UMzIgKmFpID0gYTsKLSAgICBPUEpfSU5UMzIgKmJpID0gdi0+bWVtICsgdi0+Y2FzOwotICAgIE9QSl9JTlQzMiAgaSA9IHYtPnNuOwotICAgIHdoaWxlKCBpLS0gKSB7Ci0gICAgICAqYmkgPSAqYWk7Ci0JICBiaSArPSAyOwotCSAgYWkgKz0geDsKLSAgICB9Ci0gICAgYWkgPSBhICsgKHYtPnNuICogeCk7Ci0gICAgYmkgPSB2LT5tZW0gKyAxIC0gdi0+Y2FzOwotICAgIGkgPSB2LT5kbiA7Ci0gICAgd2hpbGUoIGktLSApIHsKLSAgICAgICpiaSA9ICphaTsKLQkgIGJpICs9IDI7ICAKLQkgIGFpICs9IHg7Ci0gICAgfQotfQotCi0KLS8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRm9yd2FyZCA1LTMgd2F2ZWxldCB0cmFuc2Zvcm0gaW4gMS1ELiAqLwotLyogPC9zdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi12b2lkIG9wal9kd3RfZW5jb2RlXzEoT1BKX0lOVDMyICphLCBPUEpfSU5UMzIgZG4sIE9QSl9JTlQzMiBzbiwgT1BKX0lOVDMyIGNhcykgewotCU9QSl9JTlQzMiBpOwotCQotCWlmICghY2FzKSB7Ci0JCWlmICgoZG4gPiAwKSB8fCAoc24gPiAxKSkgewkvKiBORVcgOiAgQ0FTRSBPTkUgRUxFTUVOVCAqLwotCQkJZm9yIChpID0gMDsgaSA8IGRuOyBpKyspIE9QSl9EKGkpIC09IChPUEpfU18oaSkgKyBPUEpfU18oaSArIDEpKSA+PiAxOwotCQkJZm9yIChpID0gMDsgaSA8IHNuOyBpKyspIE9QSl9TKGkpICs9IChPUEpfRF8oaSAtIDEpICsgT1BKX0RfKGkpICsgMikgPj4gMjsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmICghc24gJiYgZG4gPT0gMSkJCSAgICAvKiBORVcgOiAgQ0FTRSBPTkUgRUxFTUVOVCAqLwotCQkJT1BKX1MoMCkgKj0gMjsKLQkJZWxzZSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgZG47IGkrKykgT1BKX1MoaSkgLT0gKE9QSl9ERF8oaSkgKyBPUEpfRERfKGkgLSAxKSkgPj4gMTsKLQkJCWZvciAoaSA9IDA7IGkgPCBzbjsgaSsrKSBPUEpfRChpKSArPSAoT1BKX1NTXyhpKSArIE9QSl9TU18oaSArIDEpICsgMikgPj4gMjsKLQkJfQotCX0KLX0KLQotLyogPHN1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBJbnZlcnNlIDUtMyB3YXZlbGV0IHRyYW5zZm9ybSBpbiAxLUQuICovCi0vKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gCi12b2lkIG9wal9kd3RfZGVjb2RlXzFfKE9QSl9JTlQzMiAqYSwgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpIHsKLQlPUEpfSU5UMzIgaTsKLQkKLQlpZiAoIWNhcykgewotCQlpZiAoKGRuID4gMCkgfHwgKHNuID4gMSkpIHsgLyogTkVXIDogIENBU0UgT05FIEVMRU1FTlQgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBzbjsgaSsrKSBPUEpfUyhpKSAtPSAoT1BKX0RfKGkgLSAxKSArIE9QSl9EXyhpKSArIDIpID4+IDI7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgZG47IGkrKykgT1BKX0QoaSkgKz0gKE9QSl9TXyhpKSArIE9QSl9TXyhpICsgMSkpID4+IDE7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoIXNuICAmJiBkbiA9PSAxKSAgICAgICAgICAvKiBORVcgOiAgQ0FTRSBPTkUgRUxFTUVOVCAqLwotCQkJT1BKX1MoMCkgLz0gMjsKLQkJZWxzZSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgc247IGkrKykgT1BKX0QoaSkgLT0gKE9QSl9TU18oaSkgKyBPUEpfU1NfKGkgKyAxKSArIDIpID4+IDI7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgZG47IGkrKykgT1BKX1MoaSkgKz0gKE9QSl9ERF8oaSkgKyBPUEpfRERfKGkgLSAxKSkgPj4gMTsKLQkJfQotCX0KLX0KLQotLyogPHN1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBJbnZlcnNlIDUtMyB3YXZlbGV0IHRyYW5zZm9ybSBpbiAxLUQuICovCi0vKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gCi12b2lkIG9wal9kd3RfZGVjb2RlXzEob3BqX2R3dF90ICp2KSB7Ci0Jb3BqX2R3dF9kZWNvZGVfMV8odi0+bWVtLCB2LT5kbiwgdi0+c24sIHYtPmNhcyk7Ci19Ci0KLS8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZvcndhcmQgOS03IHdhdmVsZXQgdHJhbnNmb3JtIGluIDEtRC4gKi8KLS8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLXZvaWQgb3BqX2R3dF9lbmNvZGVfMV9yZWFsKE9QSl9JTlQzMiAqYSwgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpIHsKLQlPUEpfSU5UMzIgaTsKLQlpZiAoIWNhcykgewotCQlpZiAoKGRuID4gMCkgfHwgKHNuID4gMSkpIHsJLyogTkVXIDogIENBU0UgT05FIEVMRU1FTlQgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBkbjsgaSsrKQotCQkJCU9QSl9EKGkpIC09IG9wal9pbnRfZml4X211bChPUEpfU18oaSkgKyBPUEpfU18oaSArIDEpLCAxMjk5Myk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgc247IGkrKykKLQkJCQlPUEpfUyhpKSAtPSBvcGpfaW50X2ZpeF9tdWwoT1BKX0RfKGkgLSAxKSArIE9QSl9EXyhpKSwgNDM0KTsKLQkJCWZvciAoaSA9IDA7IGkgPCBkbjsgaSsrKQotCQkJCU9QSl9EKGkpICs9IG9wal9pbnRfZml4X211bChPUEpfU18oaSkgKyBPUEpfU18oaSArIDEpLCA3MjMzKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBzbjsgaSsrKQotCQkJCU9QSl9TKGkpICs9IG9wal9pbnRfZml4X211bChPUEpfRF8oaSAtIDEpICsgT1BKX0RfKGkpLCAzNjMzKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBkbjsgaSsrKQotCQkJCU9QSl9EKGkpID0gb3BqX2ludF9maXhfbXVsKE9QSl9EKGkpLCA1MDM4KTsJLyo1MDM4ICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgc247IGkrKykKLQkJCQlPUEpfUyhpKSA9IG9wal9pbnRfZml4X211bChPUEpfUyhpKSwgNjY1OSk7CS8qNjY2MCAqLwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKChzbiA+IDApIHx8IChkbiA+IDEpKSB7CS8qIE5FVyA6ICBDQVNFIE9ORSBFTEVNRU5UICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgZG47IGkrKykKLQkJCQlPUEpfUyhpKSAtPSBvcGpfaW50X2ZpeF9tdWwoT1BKX0REXyhpKSArIE9QSl9ERF8oaSAtIDEpLCAxMjk5Myk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgc247IGkrKykKLQkJCQlPUEpfRChpKSAtPSBvcGpfaW50X2ZpeF9tdWwoT1BKX1NTXyhpKSArIE9QSl9TU18oaSArIDEpLCA0MzQpOwotCQkJZm9yIChpID0gMDsgaSA8IGRuOyBpKyspCi0JCQkJT1BKX1MoaSkgKz0gb3BqX2ludF9maXhfbXVsKE9QSl9ERF8oaSkgKyBPUEpfRERfKGkgLSAxKSwgNzIzMyk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgc247IGkrKykKLQkJCQlPUEpfRChpKSArPSBvcGpfaW50X2ZpeF9tdWwoT1BKX1NTXyhpKSArIE9QSl9TU18oaSArIDEpLCAzNjMzKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBkbjsgaSsrKQotCQkJCU9QSl9TKGkpID0gb3BqX2ludF9maXhfbXVsKE9QSl9TKGkpLCA1MDM4KTsJLyo1MDM4ICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgc247IGkrKykKLQkJCQlPUEpfRChpKSA9IG9wal9pbnRfZml4X211bChPUEpfRChpKSwgNjY1OSk7CS8qNjY2MCAqLwotCQl9Ci0JfQotfQotCi12b2lkIG9wal9kd3RfZW5jb2RlX3N0ZXBzaXplKE9QSl9JTlQzMiBzdGVwc2l6ZSwgT1BKX0lOVDMyIG51bWJwcywgb3BqX3N0ZXBzaXplX3QgKmJhbmRub19zdGVwc2l6ZSkgewotCU9QSl9JTlQzMiBwLCBuOwotCXAgPSBvcGpfaW50X2Zsb29ybG9nMihzdGVwc2l6ZSkgLSAxMzsKLQluID0gMTEgLSBvcGpfaW50X2Zsb29ybG9nMihzdGVwc2l6ZSk7Ci0JYmFuZG5vX3N0ZXBzaXplLT5tYW50ID0gKG4gPCAwID8gc3RlcHNpemUgPj4gLW4gOiBzdGVwc2l6ZSA8PCBuKSAmIDB4N2ZmOwotCWJhbmRub19zdGVwc2l6ZS0+ZXhwbiA9IG51bWJwcyAtIHA7Ci19Ci0KLS8qIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgRFdUIGludGVyZmFjZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLQotCi0vKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZvcndhcmQgNS0zIHdhdmVsZXQgdHJhbnNmb3JtIGluIDItRC4gKi8KLS8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotSU5MSU5FIE9QSl9CT09MIG9wal9kd3RfZW5jb2RlX3Byb2NlZHVyZShvcGpfdGNkX3RpbGVjb21wX3QgKiB0aWxlYyx2b2lkICgqcF9mdW5jdGlvbikoT1BKX0lOVDMyICosIE9QSl9JTlQzMixPUEpfSU5UMzIsT1BKX0lOVDMyKSApCi17Ci0JT1BKX0lOVDMyIGksIGosIGs7Ci0JT1BKX0lOVDMyICphID0gMDA7Ci0JT1BKX0lOVDMyICphaiA9IDAwOwotCU9QSl9JTlQzMiAqYmogPSAwMDsKLQlPUEpfSU5UMzIgdywgbDsKLQotCU9QSl9JTlQzMiBydzsJCQkvKiB3aWR0aCBvZiB0aGUgcmVzb2x1dGlvbiBsZXZlbCBjb21wdXRlZCAgICovCi0JT1BKX0lOVDMyIHJoOwkJCS8qIGhlaWdodCBvZiB0aGUgcmVzb2x1dGlvbiBsZXZlbCBjb21wdXRlZCAgKi8KLQlPUEpfVUlOVDMyIGxfZGF0YV9zaXplOwotCi0Jb3BqX3RjZF9yZXNvbHV0aW9uX3QgKiBsX2N1cl9yZXMgPSAwOwotCW9wal90Y2RfcmVzb2x1dGlvbl90ICogbF9sYXN0X3JlcyA9IDA7Ci0KLQl3ID0gdGlsZWMtPngxLXRpbGVjLT54MDsKLQlsID0gKE9QSl9JTlQzMil0aWxlYy0+bnVtcmVzb2x1dGlvbnMtMTsKLQlhID0gdGlsZWMtPmRhdGE7Ci0KLQlsX2N1cl9yZXMgPSB0aWxlYy0+cmVzb2x1dGlvbnMgKyBsOwotCWxfbGFzdF9yZXMgPSBsX2N1cl9yZXMgLSAxOwotCi0JbF9kYXRhX3NpemUgPSBvcGpfZHd0X21heF9yZXNvbHV0aW9uKCB0aWxlYy0+cmVzb2x1dGlvbnMsdGlsZWMtPm51bXJlc29sdXRpb25zKSAqIChPUEpfVUlOVDMyKXNpemVvZihPUEpfSU5UMzIpOwotCWJqID0gKE9QSl9JTlQzMiopb3BqX21hbGxvYygoc2l6ZV90KWxfZGF0YV9zaXplKTsKLQlpZiAoISBiaikgewotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQlpID0gbDsKLQotCXdoaWxlIChpLS0pIHsKLQkJT1BKX0lOVDMyIHJ3MTsJCS8qIHdpZHRoIG9mIHRoZSByZXNvbHV0aW9uIGxldmVsIG9uY2UgbG93ZXIgdGhhbiBjb21wdXRlZCBvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCQlPUEpfSU5UMzIgcmgxOwkJLyogaGVpZ2h0IG9mIHRoZSByZXNvbHV0aW9uIGxldmVsIG9uY2UgbG93ZXIgdGhhbiBjb21wdXRlZCBvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCU9QSl9JTlQzMiBjYXNfY29sOwkvKiAwID0gbm9uIGludmVyc2lvbiBvbiBob3Jpem9udGFsIGZpbHRlcmluZyAxID0gaW52ZXJzaW9uIGJldHdlZW4gbG93LXBhc3MgYW5kIGhpZ2gtcGFzcyBmaWx0ZXJpbmcgKi8KLQkJT1BKX0lOVDMyIGNhc19yb3c7CS8qIDAgPSBub24gaW52ZXJzaW9uIG9uIHZlcnRpY2FsIGZpbHRlcmluZyAxID0gaW52ZXJzaW9uIGJldHdlZW4gbG93LXBhc3MgYW5kIGhpZ2gtcGFzcyBmaWx0ZXJpbmcgICAqLwotCQlPUEpfSU5UMzIgZG4sIHNuOwotCi0JCXJ3ICA9IGxfY3VyX3Jlcy0+eDEgLSBsX2N1cl9yZXMtPngwOwotCQlyaCAgPSBsX2N1cl9yZXMtPnkxIC0gbF9jdXJfcmVzLT55MDsKLQkJcncxID0gbF9sYXN0X3Jlcy0+eDEgLSBsX2xhc3RfcmVzLT54MDsKLQkJcmgxID0gbF9sYXN0X3Jlcy0+eTEgLSBsX2xhc3RfcmVzLT55MDsKLQotCQljYXNfcm93ID0gbF9jdXJfcmVzLT54MCAmIDE7Ci0JCWNhc19jb2wgPSBsX2N1cl9yZXMtPnkwICYgMTsKLQotCQlzbiA9IHJoMTsKLQkJZG4gPSByaCAtIHJoMTsKLQkJZm9yIChqID0gMDsgaiA8IHJ3OyArK2opIHsKLQkJCWFqID0gYSArIGo7Ci0JCQlmb3IgKGsgPSAwOyBrIDwgcmg7ICsraykgewotCQkJCWJqW2tdID0gYWpbayp3XTsKLQkJCX0KLQotCQkJKCpwX2Z1bmN0aW9uKSAoYmosIGRuLCBzbiwgY2FzX2NvbCk7Ci0KLQkJCW9wal9kd3RfZGVpbnRlcmxlYXZlX3YoYmosIGFqLCBkbiwgc24sIHcsIGNhc19jb2wpOwotCQl9Ci0KLQkJc24gPSBydzE7Ci0JCWRuID0gcncgLSBydzE7Ci0KLQkJZm9yIChqID0gMDsgaiA8IHJoOyBqKyspIHsKLQkJCWFqID0gYSArIGogKiB3OwotCQkJZm9yIChrID0gMDsgayA8IHJ3OyBrKyspICBialtrXSA9IGFqW2tdOwotCQkJKCpwX2Z1bmN0aW9uKSAoYmosIGRuLCBzbiwgY2FzX3Jvdyk7Ci0JCQlvcGpfZHd0X2RlaW50ZXJsZWF2ZV9oKGJqLCBhaiwgZG4sIHNuLCBjYXNfcm93KTsKLQkJfQotCi0JCWxfY3VyX3JlcyA9IGxfbGFzdF9yZXM7Ci0KLQkJLS1sX2xhc3RfcmVzOwotCX0KLQotCW9wal9mcmVlKGJqKTsKLQlyZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLS8qIEZvcndhcmQgNS0zIHdhdmVsZXQgdHJhbnNmb3JtIGluIDItRC4gKi8KLS8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotT1BKX0JPT0wgb3BqX2R3dF9lbmNvZGUob3BqX3RjZF90aWxlY29tcF90ICogdGlsZWMpCi17Ci0JcmV0dXJuIG9wal9kd3RfZW5jb2RlX3Byb2NlZHVyZSh0aWxlYyxvcGpfZHd0X2VuY29kZV8xKTsKLX0KLQotLyogPHN1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBJbnZlcnNlIDUtMyB3YXZlbGV0IHRyYW5zZm9ybSBpbiAyLUQuICovCi0vKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLU9QSl9CT09MIG9wal9kd3RfZGVjb2RlKG9wal90Y2RfdGlsZWNvbXBfdCogdGlsZWMsIE9QSl9VSU5UMzIgbnVtcmVzKSB7Ci0JcmV0dXJuIG9wal9kd3RfZGVjb2RlX3RpbGUodGlsZWMsIG51bXJlcywgJm9wal9kd3RfZGVjb2RlXzEpOwotfQotCi0KLS8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEdldCBnYWluIG9mIDUtMyB3YXZlbGV0IHRyYW5zZm9ybS4gKi8KLS8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLU9QSl9VSU5UMzIgb3BqX2R3dF9nZXRnYWluKE9QSl9VSU5UMzIgb3JpZW50KSB7Ci0JaWYgKG9yaWVudCA9PSAwKQotCQlyZXR1cm4gMDsKLQlpZiAob3JpZW50ID09IDEgfHwgb3JpZW50ID09IDIpCi0JCXJldHVybiAxOwotCXJldHVybiAyOwotfQotCi0vKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgKi8KLS8qIEdldCBub3JtIG9mIDUtMyB3YXZlbGV0LiAqLwotLyogPC9zdW1tYXJ5PiAgICAgICAgICAgICAgICovCi1PUEpfRkxPQVQ2NCBvcGpfZHd0X2dldG5vcm0oT1BKX1VJTlQzMiBsZXZlbCwgT1BKX1VJTlQzMiBvcmllbnQpIHsKLQlyZXR1cm4gb3BqX2R3dF9ub3Jtc1tvcmllbnRdW2xldmVsXTsKLX0KLQotLyogPHN1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRm9yd2FyZCA5LTcgd2F2ZWxldCB0cmFuc2Zvcm0gaW4gMi1ELiAqLwotLyogPC9zdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotT1BKX0JPT0wgb3BqX2R3dF9lbmNvZGVfcmVhbChvcGpfdGNkX3RpbGVjb21wX3QgKiB0aWxlYykKLXsKLQlyZXR1cm4gb3BqX2R3dF9lbmNvZGVfcHJvY2VkdXJlKHRpbGVjLG9wal9kd3RfZW5jb2RlXzFfcmVhbCk7Ci19Ci0KLS8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEdldCBnYWluIG9mIDktNyB3YXZlbGV0IHRyYW5zZm9ybS4gKi8KLS8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLU9QSl9VSU5UMzIgb3BqX2R3dF9nZXRnYWluX3JlYWwoT1BKX1VJTlQzMiBvcmllbnQpIHsKLQkodm9pZClvcmllbnQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAqLwotLyogR2V0IG5vcm0gb2YgOS03IHdhdmVsZXQuICovCi0vKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgKi8KLU9QSl9GTE9BVDY0IG9wal9kd3RfZ2V0bm9ybV9yZWFsKE9QSl9VSU5UMzIgbGV2ZWwsIE9QSl9VSU5UMzIgb3JpZW50KSB7Ci0JcmV0dXJuIG9wal9kd3Rfbm9ybXNfcmVhbFtvcmllbnRdW2xldmVsXTsKLX0KLQotdm9pZCBvcGpfZHd0X2NhbGNfZXhwbGljaXRfc3RlcHNpemVzKG9wal90Y2NwX3QgKiB0Y2NwLCBPUEpfVUlOVDMyIHByZWMpIHsKLQlPUEpfVUlOVDMyIG51bWJhbmRzLCBiYW5kbm87Ci0JbnVtYmFuZHMgPSAzICogdGNjcC0+bnVtcmVzb2x1dGlvbnMgLSAyOwotCWZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgbnVtYmFuZHM7IGJhbmRubysrKSB7Ci0JCU9QSl9GTE9BVDY0IHN0ZXBzaXplOwotCQlPUEpfVUlOVDMyIHJlc25vLCBsZXZlbCwgb3JpZW50LCBnYWluOwotCi0JCXJlc25vID0gKGJhbmRubyA9PSAwKSA/IDAgOiAoKGJhbmRubyAtIDEpIC8gMyArIDEpOwotCQlvcmllbnQgPSAoYmFuZG5vID09IDApID8gMCA6ICgoYmFuZG5vIC0gMSkgJSAzICsgMSk7Ci0JCWxldmVsID0gdGNjcC0+bnVtcmVzb2x1dGlvbnMgLSAxIC0gcmVzbm87Ci0JCWdhaW4gPSAodGNjcC0+cW1mYmlkID09IDApID8gMCA6ICgob3JpZW50ID09IDApID8gMCA6ICgoKG9yaWVudCA9PSAxKSB8fCAob3JpZW50ID09IDIpKSA/IDEgOiAyKSk7Ci0JCWlmICh0Y2NwLT5xbnRzdHkgPT0gSjJLX0NDUF9RTlRTVFlfTk9RTlQpIHsKLQkJCXN0ZXBzaXplID0gMS4wOwotCQl9IGVsc2UgewotCQkJT1BKX0ZMT0FUNjQgbm9ybSA9IG9wal9kd3Rfbm9ybXNfcmVhbFtvcmllbnRdW2xldmVsXTsKLQkJCXN0ZXBzaXplID0gKDEgPDwgKGdhaW4pKSAvIG5vcm07Ci0JCX0KLQkJb3BqX2R3dF9lbmNvZGVfc3RlcHNpemUoKE9QSl9JTlQzMikgZmxvb3Ioc3RlcHNpemUgKiA4MTkyLjApLCAoT1BKX0lOVDMyKShwcmVjICsgZ2FpbiksICZ0Y2NwLT5zdGVwc2l6ZXNbYmFuZG5vXSk7Ci0JfQotfQotCi0vKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBEZXRlcm1pbmUgbWF4aW11bSBjb21wdXRlZCByZXNvbHV0aW9uIGxldmVsIGZvciBpbnZlcnNlIHdhdmVsZXQgdHJhbnNmb3JtICovCi0vKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1PUEpfVUlOVDMyIG9wal9kd3RfbWF4X3Jlc29sdXRpb24ob3BqX3RjZF9yZXNvbHV0aW9uX3QqIHJlc3RyaWN0IHIsIE9QSl9VSU5UMzIgaSkgewotCU9QSl9VSU5UMzIgbXIJPSAwOwotCU9QSl9VSU5UMzIgdzsKLQl3aGlsZSggLS1pICkgewotCQkrK3I7Ci0JCWlmKCBtciA8ICggdyA9IChPUEpfVUlOVDMyKShyLT54MSAtIHItPngwKSApICkKLQkJCW1yID0gdyA7Ci0JCWlmKCBtciA8ICggdyA9IChPUEpfVUlOVDMyKShyLT55MSAtIHItPnkwKSApICkKLQkJCW1yID0gdyA7Ci0JfQotCXJldHVybiBtciA7Ci19Ci0KLS8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogSW52ZXJzZSB3YXZlbGV0IHRyYW5zZm9ybSBpbiAyLUQuICAgICAqLwotLyogPC9zdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1PUEpfQk9PTCBvcGpfZHd0X2RlY29kZV90aWxlKG9wal90Y2RfdGlsZWNvbXBfdCogdGlsZWMsIE9QSl9VSU5UMzIgbnVtcmVzLCBEV1QxREZOIGR3dF8xRCkgewotCW9wal9kd3RfdCBoOwotCW9wal9kd3RfdCB2OwotCi0Jb3BqX3RjZF9yZXNvbHV0aW9uX3QqIHRyID0gdGlsZWMtPnJlc29sdXRpb25zOwotCi0JT1BKX1VJTlQzMiBydyA9IChPUEpfVUlOVDMyKSh0ci0+eDEgLSB0ci0+eDApOwkvKiB3aWR0aCBvZiB0aGUgcmVzb2x1dGlvbiBsZXZlbCBjb21wdXRlZCAqLwotCU9QSl9VSU5UMzIgcmggPSAoT1BKX1VJTlQzMikodHItPnkxIC0gdHItPnkwKTsJLyogaGVpZ2h0IG9mIHRoZSByZXNvbHV0aW9uIGxldmVsIGNvbXB1dGVkICovCi0KLQlPUEpfVUlOVDMyIHcgPSAoT1BKX1VJTlQzMikodGlsZWMtPngxIC0gdGlsZWMtPngwKTsKLQotCWgubWVtID0gKE9QSl9JTlQzMiopCi0Jb3BqX2FsaWduZWRfbWFsbG9jKG9wal9kd3RfbWF4X3Jlc29sdXRpb24odHIsIG51bXJlcykgKiBzaXplb2YoT1BKX0lOVDMyKSk7Ci0JaWYgKCEgaC5tZW0pewotCQkvKiBGSVhNRSBldmVudCBtYW5hZ2VyIGVycm9yIGNhbGxiYWNrICovCi0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCi0Jdi5tZW0gPSBoLm1lbTsKLQotCXdoaWxlKCAtLW51bXJlcykgewotCQlPUEpfSU5UMzIgKiByZXN0cmljdCB0aWxlZHAgPSB0aWxlYy0+ZGF0YTsKLQkJT1BKX1VJTlQzMiBqOwotCi0JCSsrdHI7Ci0JCWguc24gPSAoT1BKX0lOVDMyKXJ3OwotCQl2LnNuID0gKE9QSl9JTlQzMilyaDsKLQotCQlydyA9IChPUEpfVUlOVDMyKSh0ci0+eDEgLSB0ci0+eDApOwotCQlyaCA9IChPUEpfVUlOVDMyKSh0ci0+eTEgLSB0ci0+eTApOwotCi0JCWguZG4gPSAoT1BKX0lOVDMyKShydyAtIChPUEpfVUlOVDMyKWguc24pOwotCQloLmNhcyA9IHRyLT54MCAlIDI7Ci0KLQkJZm9yKGogPSAwOyBqIDwgcmg7ICsraikgewotCQkJb3BqX2R3dF9pbnRlcmxlYXZlX2goJmgsICZ0aWxlZHBbaip3XSk7Ci0JCQkoZHd0XzFEKSgmaCk7Ci0JCQltZW1jcHkoJnRpbGVkcFtqKnddLCBoLm1lbSwgcncgKiBzaXplb2YoT1BKX0lOVDMyKSk7Ci0JCX0KLQotCQl2LmRuID0gKE9QSl9JTlQzMikocmggLSAoT1BKX1VJTlQzMil2LnNuKTsKLQkJdi5jYXMgPSB0ci0+eTAgJSAyOwotCi0JCWZvcihqID0gMDsgaiA8IHJ3OyArK2opewotCQkJT1BKX1VJTlQzMiBrOwotCQkJb3BqX2R3dF9pbnRlcmxlYXZlX3YoJnYsICZ0aWxlZHBbal0sIChPUEpfSU5UMzIpdyk7Ci0JCQkoZHd0XzFEKSgmdik7Ci0JCQlmb3IoayA9IDA7IGsgPCByaDsgKytrKSB7Ci0JCQkJdGlsZWRwW2sgKiB3ICsgal0gPSB2Lm1lbVtrXTsKLQkJCX0KLQkJfQotCX0KLQlvcGpfYWxpZ25lZF9mcmVlKGgubWVtKTsKLQlyZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLXZvaWQgb3BqX3Y0ZHd0X2ludGVybGVhdmVfaChvcGpfdjRkd3RfdCogcmVzdHJpY3QgdywgT1BKX0ZMT0FUMzIqIHJlc3RyaWN0IGEsIE9QSl9JTlQzMiB4LCBPUEpfSU5UMzIgc2l6ZSl7Ci0JT1BKX0ZMT0FUMzIqIHJlc3RyaWN0IGJpID0gKE9QSl9GTE9BVDMyKikgKHctPndhdmVsZXQgKyB3LT5jYXMpOwotCU9QSl9JTlQzMiBjb3VudCA9IHctPnNuOwotCU9QSl9JTlQzMiBpLCBrOwotCi0JZm9yKGsgPSAwOyBrIDwgMjsgKytrKXsKLQkJaWYgKCBjb3VudCArIDMgKiB4IDwgc2l6ZSAmJiAoKHNpemVfdCkgYSAmIDB4MGYpID09IDAgJiYgKChzaXplX3QpIGJpICYgMHgwZikgPT0gMCAmJiAoeCAmIDB4MGYpID09IDAgKSB7Ci0JCQkvKiBGYXN0IGNvZGUgcGF0aCAqLwotCQkJZm9yKGkgPSAwOyBpIDwgY291bnQ7ICsraSl7Ci0JCQkJT1BKX0lOVDMyIGogPSBpOwotCQkJCWJpW2kqOCAgICBdID0gYVtqXTsKLQkJCQlqICs9IHg7Ci0JCQkJYmlbaSo4ICsgMV0gPSBhW2pdOwotCQkJCWogKz0geDsKLQkJCQliaVtpKjggKyAyXSA9IGFbal07Ci0JCQkJaiArPSB4OwotCQkJCWJpW2kqOCArIDNdID0gYVtqXTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8qIFNsb3cgY29kZSBwYXRoICovCi0JCQlmb3IoaSA9IDA7IGkgPCBjb3VudDsgKytpKXsKLQkJCQlPUEpfSU5UMzIgaiA9IGk7Ci0JCQkJYmlbaSo4ICAgIF0gPSBhW2pdOwotCQkJCWogKz0geDsKLQkJCQlpZihqID49IHNpemUpIGNvbnRpbnVlOwotCQkJCWJpW2kqOCArIDFdID0gYVtqXTsKLQkJCQlqICs9IHg7Ci0JCQkJaWYoaiA+PSBzaXplKSBjb250aW51ZTsKLQkJCQliaVtpKjggKyAyXSA9IGFbal07Ci0JCQkJaiArPSB4OwotCQkJCWlmKGogPj0gc2l6ZSkgY29udGludWU7Ci0JCQkJYmlbaSo4ICsgM10gPSBhW2pdOyAvKiBUaGlzIG9uZSovCi0JCQl9Ci0JCX0KLQotCQliaSA9IChPUEpfRkxPQVQzMiopICh3LT53YXZlbGV0ICsgMSAtIHctPmNhcyk7Ci0JCWEgKz0gdy0+c247Ci0JCXNpemUgLT0gdy0+c247Ci0JCWNvdW50ID0gdy0+ZG47Ci0JfQotfQotCi12b2lkIG9wal92NGR3dF9pbnRlcmxlYXZlX3Yob3BqX3Y0ZHd0X3QqIHJlc3RyaWN0IHYgLCBPUEpfRkxPQVQzMiogcmVzdHJpY3QgYSAsIE9QSl9JTlQzMiB4LCBPUEpfSU5UMzIgbmJfZWx0c19yZWFkKXsKLQlvcGpfdjRfdCogcmVzdHJpY3QgYmkgPSB2LT53YXZlbGV0ICsgdi0+Y2FzOwotCU9QSl9JTlQzMiBpOwotCi0JZm9yKGkgPSAwOyBpIDwgdi0+c247ICsraSl7Ci0JCW1lbWNweSgmYmlbaSoyXSwgJmFbaSp4XSwgKHNpemVfdCluYl9lbHRzX3JlYWQgKiBzaXplb2YoT1BKX0ZMT0FUMzIpKTsKLQl9Ci0KLQlhICs9IHYtPnNuICogeDsKLQliaSA9IHYtPndhdmVsZXQgKyAxIC0gdi0+Y2FzOwotCi0JZm9yKGkgPSAwOyBpIDwgdi0+ZG47ICsraSl7Ci0JCW1lbWNweSgmYmlbaSoyXSwgJmFbaSp4XSwgKHNpemVfdCluYl9lbHRzX3JlYWQgKiBzaXplb2YoT1BKX0ZMT0FUMzIpKTsKLQl9Ci19Ci0KLSNpZmRlZiBfX1NTRV9fCi0KLXZvaWQgb3BqX3Y0ZHd0X2RlY29kZV9zdGVwMV9zc2Uob3BqX3Y0X3QqIHcsIE9QSl9JTlQzMiBjb3VudCwgY29uc3QgX19tMTI4IGMpewotCV9fbTEyOCogcmVzdHJpY3QgdncgPSAoX19tMTI4KikgdzsKLQlPUEpfSU5UMzIgaTsKLQkvKiA0eCB1bnJvbGxlZCBsb29wICovCi0JZm9yKGkgPSAwOyBpIDwgY291bnQgPj4gMjsgKytpKXsKLQkJKnZ3ID0gX21tX211bF9wcygqdncsIGMpOwotCQl2dyArPSAyOwotCQkqdncgPSBfbW1fbXVsX3BzKCp2dywgYyk7Ci0JCXZ3ICs9IDI7Ci0JCSp2dyA9IF9tbV9tdWxfcHMoKnZ3LCBjKTsKLQkJdncgKz0gMjsKLQkJKnZ3ID0gX21tX211bF9wcygqdncsIGMpOwotCQl2dyArPSAyOwotCX0KLQljb3VudCAmPSAzOwotCWZvcihpID0gMDsgaSA8IGNvdW50OyArK2kpewotCQkqdncgPSBfbW1fbXVsX3BzKCp2dywgYyk7Ci0JCXZ3ICs9IDI7Ci0JfQotfQotCi12b2lkIG9wal92NGR3dF9kZWNvZGVfc3RlcDJfc3NlKG9wal92NF90KiBsLCBvcGpfdjRfdCogdywgT1BKX0lOVDMyIGssIE9QSl9JTlQzMiBtLCBfX20xMjggYyl7Ci0JX19tMTI4KiByZXN0cmljdCB2bCA9IChfX20xMjgqKSBsOwotCV9fbTEyOCogcmVzdHJpY3QgdncgPSAoX19tMTI4KikgdzsKLQlPUEpfSU5UMzIgaTsKLQlfX20xMjggdG1wMSwgdG1wMiwgdG1wMzsKLQl0bXAxID0gdmxbMF07Ci0JZm9yKGkgPSAwOyBpIDwgbTsgKytpKXsKLQkJdG1wMiA9IHZ3Wy0xXTsKLQkJdG1wMyA9IHZ3WyAwXTsKLQkJdndbLTFdID0gX21tX2FkZF9wcyh0bXAyLCBfbW1fbXVsX3BzKF9tbV9hZGRfcHModG1wMSwgdG1wMyksIGMpKTsKLQkJdG1wMSA9IHRtcDM7Ci0JCXZ3ICs9IDI7Ci0JfQotCXZsID0gdncgLSAyOwotCWlmKG0gPj0gayl7Ci0JCXJldHVybjsKLQl9Ci0JYyA9IF9tbV9hZGRfcHMoYywgYyk7Ci0JYyA9IF9tbV9tdWxfcHMoYywgdmxbMF0pOwotCWZvcig7IG0gPCBrOyArK20pewotCQlfX20xMjggdG1wID0gdndbLTFdOwotCQl2d1stMV0gPSBfbW1fYWRkX3BzKHRtcCwgYyk7Ci0JCXZ3ICs9IDI7Ci0JfQotfQotCi0jZWxzZQotCi12b2lkIG9wal92NGR3dF9kZWNvZGVfc3RlcDEob3BqX3Y0X3QqIHcsIE9QSl9JTlQzMiBjb3VudCwgY29uc3QgT1BKX0ZMT0FUMzIgYykKLXsKLQlPUEpfRkxPQVQzMiogcmVzdHJpY3QgZncgPSAoT1BKX0ZMT0FUMzIqKSB3OwotCU9QSl9JTlQzMiBpOwotCWZvcihpID0gMDsgaSA8IGNvdW50OyArK2kpewotCQlPUEpfRkxPQVQzMiB0bXAxID0gZndbaSo4ICAgIF07Ci0JCU9QSl9GTE9BVDMyIHRtcDIgPSBmd1tpKjggKyAxXTsKLQkJT1BKX0ZMT0FUMzIgdG1wMyA9IGZ3W2kqOCArIDJdOwotCQlPUEpfRkxPQVQzMiB0bXA0ID0gZndbaSo4ICsgM107Ci0JCWZ3W2kqOCAgICBdID0gdG1wMSAqIGM7Ci0JCWZ3W2kqOCArIDFdID0gdG1wMiAqIGM7Ci0JCWZ3W2kqOCArIDJdID0gdG1wMyAqIGM7Ci0JCWZ3W2kqOCArIDNdID0gdG1wNCAqIGM7Ci0JfQotfQotCi12b2lkIG9wal92NGR3dF9kZWNvZGVfc3RlcDIob3BqX3Y0X3QqIGwsIG9wal92NF90KiB3LCBPUEpfSU5UMzIgaywgT1BKX0lOVDMyIG0sIE9QSl9GTE9BVDMyIGMpCi17Ci0JT1BKX0ZMT0FUMzIqIHJlc3RyaWN0IGZsID0gKE9QSl9GTE9BVDMyKikgbDsKLQlPUEpfRkxPQVQzMiogcmVzdHJpY3QgZncgPSAoT1BKX0ZMT0FUMzIqKSB3OwotCU9QSl9JTlQzMiBpOwotCWZvcihpID0gMDsgaSA8IG07ICsraSl7Ci0JCU9QSl9GTE9BVDMyIHRtcDFfMSA9IGZsWzBdOwotCQlPUEpfRkxPQVQzMiB0bXAxXzIgPSBmbFsxXTsKLQkJT1BKX0ZMT0FUMzIgdG1wMV8zID0gZmxbMl07Ci0JCU9QSl9GTE9BVDMyIHRtcDFfNCA9IGZsWzNdOwotCQlPUEpfRkxPQVQzMiB0bXAyXzEgPSBmd1stNF07Ci0JCU9QSl9GTE9BVDMyIHRtcDJfMiA9IGZ3Wy0zXTsKLQkJT1BKX0ZMT0FUMzIgdG1wMl8zID0gZndbLTJdOwotCQlPUEpfRkxPQVQzMiB0bXAyXzQgPSBmd1stMV07Ci0JCU9QSl9GTE9BVDMyIHRtcDNfMSA9IGZ3WzBdOwotCQlPUEpfRkxPQVQzMiB0bXAzXzIgPSBmd1sxXTsKLQkJT1BKX0ZMT0FUMzIgdG1wM18zID0gZndbMl07Ci0JCU9QSl9GTE9BVDMyIHRtcDNfNCA9IGZ3WzNdOwotCQlmd1stNF0gPSB0bXAyXzEgKyAoKHRtcDFfMSArIHRtcDNfMSkgKiBjKTsKLQkJZndbLTNdID0gdG1wMl8yICsgKCh0bXAxXzIgKyB0bXAzXzIpICogYyk7Ci0JCWZ3Wy0yXSA9IHRtcDJfMyArICgodG1wMV8zICsgdG1wM18zKSAqIGMpOwotCQlmd1stMV0gPSB0bXAyXzQgKyAoKHRtcDFfNCArIHRtcDNfNCkgKiBjKTsKLQkJZmwgPSBmdzsKLQkJZncgKz0gODsKLQl9Ci0JaWYobSA8IGspewotCQlPUEpfRkxPQVQzMiBjMTsKLQkJT1BKX0ZMT0FUMzIgYzI7Ci0JCU9QSl9GTE9BVDMyIGMzOwotCQlPUEpfRkxPQVQzMiBjNDsKLQkJYyArPSBjOwotCQljMSA9IGZsWzBdICogYzsKLQkJYzIgPSBmbFsxXSAqIGM7Ci0JCWMzID0gZmxbMl0gKiBjOwotCQljNCA9IGZsWzNdICogYzsKLQkJZm9yKDsgbSA8IGs7ICsrbSl7Ci0JCQlPUEpfRkxPQVQzMiB0bXAxID0gZndbLTRdOwotCQkJT1BKX0ZMT0FUMzIgdG1wMiA9IGZ3Wy0zXTsKLQkJCU9QSl9GTE9BVDMyIHRtcDMgPSBmd1stMl07Ci0JCQlPUEpfRkxPQVQzMiB0bXA0ID0gZndbLTFdOwotCQkJZndbLTRdID0gdG1wMSArIGMxOwotCQkJZndbLTNdID0gdG1wMiArIGMyOwotCQkJZndbLTJdID0gdG1wMyArIGMzOwotCQkJZndbLTFdID0gdG1wNCArIGM0OwotCQkJZncgKz0gODsKLQkJfQotCX0KLX0KLQotI2VuZGlmCi0KLS8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEludmVyc2UgOS03IHdhdmVsZXQgdHJhbnNmb3JtIGluIDEtRC4gKi8KLS8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLXZvaWQgb3BqX3Y0ZHd0X2RlY29kZShvcGpfdjRkd3RfdCogcmVzdHJpY3QgZHd0KQotewotCU9QSl9JTlQzMiBhLCBiOwotCWlmKGR3dC0+Y2FzID09IDApIHsKLQkJaWYoISgoZHd0LT5kbiA+IDApIHx8IChkd3QtPnNuID4gMSkpKXsKLQkJCXJldHVybjsKLQkJfQotCQlhID0gMDsKLQkJYiA9IDE7Ci0JfWVsc2V7Ci0JCWlmKCEoKGR3dC0+c24gPiAwKSB8fCAoZHd0LT5kbiA+IDEpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWEgPSAxOwotCQliID0gMDsKLQl9Ci0jaWZkZWYgX19TU0VfXwotCW9wal92NGR3dF9kZWNvZGVfc3RlcDFfc3NlKGR3dC0+d2F2ZWxldCthLCBkd3QtPnNuLCBfbW1fc2V0MV9wcyhvcGpfSykpOwotCW9wal92NGR3dF9kZWNvZGVfc3RlcDFfc3NlKGR3dC0+d2F2ZWxldCtiLCBkd3QtPmRuLCBfbW1fc2V0MV9wcyhvcGpfYzEzMzE4KSk7Ci0Jb3BqX3Y0ZHd0X2RlY29kZV9zdGVwMl9zc2UoZHd0LT53YXZlbGV0K2IsIGR3dC0+d2F2ZWxldCthKzEsIGR3dC0+c24sIG9wal9pbnRfbWluKGR3dC0+c24sIGR3dC0+ZG4tYSksIF9tbV9zZXQxX3BzKG9wal9kd3RfZGVsdGEpKTsKLQlvcGpfdjRkd3RfZGVjb2RlX3N0ZXAyX3NzZShkd3QtPndhdmVsZXQrYSwgZHd0LT53YXZlbGV0K2IrMSwgZHd0LT5kbiwgb3BqX2ludF9taW4oZHd0LT5kbiwgZHd0LT5zbi1iKSwgX21tX3NldDFfcHMob3BqX2R3dF9nYW1tYSkpOwotCW9wal92NGR3dF9kZWNvZGVfc3RlcDJfc3NlKGR3dC0+d2F2ZWxldCtiLCBkd3QtPndhdmVsZXQrYSsxLCBkd3QtPnNuLCBvcGpfaW50X21pbihkd3QtPnNuLCBkd3QtPmRuLWEpLCBfbW1fc2V0MV9wcyhvcGpfZHd0X2JldGEpKTsKLQlvcGpfdjRkd3RfZGVjb2RlX3N0ZXAyX3NzZShkd3QtPndhdmVsZXQrYSwgZHd0LT53YXZlbGV0K2IrMSwgZHd0LT5kbiwgb3BqX2ludF9taW4oZHd0LT5kbiwgZHd0LT5zbi1iKSwgX21tX3NldDFfcHMob3BqX2R3dF9hbHBoYSkpOwotI2Vsc2UKLQlvcGpfdjRkd3RfZGVjb2RlX3N0ZXAxKGR3dC0+d2F2ZWxldCthLCBkd3QtPnNuLCBvcGpfSyk7Ci0Jb3BqX3Y0ZHd0X2RlY29kZV9zdGVwMShkd3QtPndhdmVsZXQrYiwgZHd0LT5kbiwgb3BqX2MxMzMxOCk7Ci0Jb3BqX3Y0ZHd0X2RlY29kZV9zdGVwMihkd3QtPndhdmVsZXQrYiwgZHd0LT53YXZlbGV0K2ErMSwgZHd0LT5zbiwgb3BqX2ludF9taW4oZHd0LT5zbiwgZHd0LT5kbi1hKSwgb3BqX2R3dF9kZWx0YSk7Ci0Jb3BqX3Y0ZHd0X2RlY29kZV9zdGVwMihkd3QtPndhdmVsZXQrYSwgZHd0LT53YXZlbGV0K2IrMSwgZHd0LT5kbiwgb3BqX2ludF9taW4oZHd0LT5kbiwgZHd0LT5zbi1iKSwgb3BqX2R3dF9nYW1tYSk7Ci0Jb3BqX3Y0ZHd0X2RlY29kZV9zdGVwMihkd3QtPndhdmVsZXQrYiwgZHd0LT53YXZlbGV0K2ErMSwgZHd0LT5zbiwgb3BqX2ludF9taW4oZHd0LT5zbiwgZHd0LT5kbi1hKSwgb3BqX2R3dF9iZXRhKTsKLQlvcGpfdjRkd3RfZGVjb2RlX3N0ZXAyKGR3dC0+d2F2ZWxldCthLCBkd3QtPndhdmVsZXQrYisxLCBkd3QtPmRuLCBvcGpfaW50X21pbihkd3QtPmRuLCBkd3QtPnNuLWIpLCBvcGpfZHd0X2FscGhhKTsKLSNlbmRpZgotfQotCi0KLS8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEludmVyc2UgOS03IHdhdmVsZXQgdHJhbnNmb3JtIGluIDItRC4gKi8KLS8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLU9QSl9CT09MIG9wal9kd3RfZGVjb2RlX3JlYWwob3BqX3RjZF90aWxlY29tcF90KiByZXN0cmljdCB0aWxlYywgT1BKX1VJTlQzMiBudW1yZXMpCi17Ci0Jb3BqX3Y0ZHd0X3QgaDsKLQlvcGpfdjRkd3RfdCB2OwotCi0Jb3BqX3RjZF9yZXNvbHV0aW9uX3QqIHJlcyA9IHRpbGVjLT5yZXNvbHV0aW9uczsKLQotCU9QSl9VSU5UMzIgcncgPSAoT1BKX1VJTlQzMikocmVzLT54MSAtIHJlcy0+eDApOwkvKiB3aWR0aCBvZiB0aGUgcmVzb2x1dGlvbiBsZXZlbCBjb21wdXRlZCAqLwotCU9QSl9VSU5UMzIgcmggPSAoT1BKX1VJTlQzMikocmVzLT55MSAtIHJlcy0+eTApOwkvKiBoZWlnaHQgb2YgdGhlIHJlc29sdXRpb24gbGV2ZWwgY29tcHV0ZWQgKi8KLQotCU9QSl9VSU5UMzIgdyA9IChPUEpfVUlOVDMyKSh0aWxlYy0+eDEgLSB0aWxlYy0+eDApOwotCi0JaC53YXZlbGV0ID0gKG9wal92NF90Kikgb3BqX2FsaWduZWRfbWFsbG9jKChvcGpfZHd0X21heF9yZXNvbHV0aW9uKHJlcywgbnVtcmVzKSs1KSAqIHNpemVvZihvcGpfdjRfdCkpOwotCWlmICghaC53YXZlbGV0KSB7Ci0JCS8qIEZJWE1FIGV2ZW50IG1hbmFnZXIgZXJyb3IgY2FsbGJhY2sgKi8KLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0Jdi53YXZlbGV0ID0gaC53YXZlbGV0OwotCi0Jd2hpbGUoIC0tbnVtcmVzKSB7Ci0JCU9QSl9GTE9BVDMyICogcmVzdHJpY3QgYWogPSAoT1BKX0ZMT0FUMzIqKSB0aWxlYy0+ZGF0YTsKLQkJT1BKX1VJTlQzMiBidWZzaXplID0gKE9QSl9VSU5UMzIpKCh0aWxlYy0+eDEgLSB0aWxlYy0+eDApICogKHRpbGVjLT55MSAtIHRpbGVjLT55MCkpOwotCQlPUEpfSU5UMzIgajsKLQotCQloLnNuID0gKE9QSl9JTlQzMilydzsKLQkJdi5zbiA9IChPUEpfSU5UMzIpcmg7Ci0KLQkJKytyZXM7Ci0KLQkJcncgPSAoT1BKX1VJTlQzMikocmVzLT54MSAtIHJlcy0+eDApOwkvKiB3aWR0aCBvZiB0aGUgcmVzb2x1dGlvbiBsZXZlbCBjb21wdXRlZCAqLwotCQlyaCA9IChPUEpfVUlOVDMyKShyZXMtPnkxIC0gcmVzLT55MCk7CS8qIGhlaWdodCBvZiB0aGUgcmVzb2x1dGlvbiBsZXZlbCBjb21wdXRlZCAqLwotCi0JCWguZG4gPSAoT1BKX0lOVDMyKShydyAtIChPUEpfVUlOVDMyKWguc24pOwotCQloLmNhcyA9IHJlcy0+eDAgJSAyOwotCi0JCWZvcihqID0gKE9QSl9JTlQzMilyaDsgaiA+IDM7IGogLT0gNCkgewotCQkJT1BKX0lOVDMyIGs7Ci0JCQlvcGpfdjRkd3RfaW50ZXJsZWF2ZV9oKCZoLCBhaiwgKE9QSl9JTlQzMil3LCAoT1BKX0lOVDMyKWJ1ZnNpemUpOwotCQkJb3BqX3Y0ZHd0X2RlY29kZSgmaCk7Ci0KLQkJCWZvcihrID0gKE9QSl9JTlQzMilydzsgLS1rID49IDA7KXsKLQkJCQlhaltrICAgICAgICAgICAgICAgXSA9IGgud2F2ZWxldFtrXS5mWzBdOwotCQkJCWFqW2srKE9QSl9JTlQzMil3ICBdID0gaC53YXZlbGV0W2tdLmZbMV07Ci0JCQkJYWpbaysoT1BKX0lOVDMyKXcqMl0gPSBoLndhdmVsZXRba10uZlsyXTsKLQkJCQlhaltrKyhPUEpfSU5UMzIpdyozXSA9IGgud2F2ZWxldFtrXS5mWzNdOwotCQkJfQotCi0JCQlhaiArPSB3KjQ7Ci0JCQlidWZzaXplIC09IHcqNDsKLQkJfQotCi0JCWlmIChyaCAmIDB4MDMpIHsKLQkJCU9QSl9JTlQzMiBrOwotCQkJaiA9IHJoICYgMHgwMzsKLQkJCW9wal92NGR3dF9pbnRlcmxlYXZlX2goJmgsIGFqLCAoT1BKX0lOVDMyKXcsIChPUEpfSU5UMzIpYnVmc2l6ZSk7Ci0JCQlvcGpfdjRkd3RfZGVjb2RlKCZoKTsKLQkJCWZvcihrID0gKE9QSl9JTlQzMilydzsgLS1rID49IDA7KXsKLQkJCQlzd2l0Y2goaikgewotCQkJCQljYXNlIDM6IGFqW2srKE9QSl9JTlQzMil3KjJdID0gaC53YXZlbGV0W2tdLmZbMl07Ci0JCQkJCWNhc2UgMjogYWpbaysoT1BKX0lOVDMyKXcgIF0gPSBoLndhdmVsZXRba10uZlsxXTsKLQkJCQkJY2FzZSAxOiBhaltrICAgICAgICAgICAgICAgXSA9IGgud2F2ZWxldFtrXS5mWzBdOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXYuZG4gPSAoT1BKX0lOVDMyKShyaCAtIChPUEpfVUlOVDMyKXYuc24pOwotCQl2LmNhcyA9IHJlcy0+eTAgJSAyOwotCi0JCWFqID0gKE9QSl9GTE9BVDMyKikgdGlsZWMtPmRhdGE7Ci0JCWZvcihqID0gKE9QSl9JTlQzMilydzsgaiA+IDM7IGogLT0gNCl7Ci0JCQlPUEpfVUlOVDMyIGs7Ci0KLQkJCW9wal92NGR3dF9pbnRlcmxlYXZlX3YoJnYsIGFqLCAoT1BKX0lOVDMyKXcsIDQpOwotCQkJb3BqX3Y0ZHd0X2RlY29kZSgmdik7Ci0KLQkJCWZvcihrID0gMDsgayA8IHJoOyArK2spewotCQkJCW1lbWNweSgmYWpbayp3XSwgJnYud2F2ZWxldFtrXSwgNCAqIHNpemVvZihPUEpfRkxPQVQzMikpOwotCQkJfQotCQkJYWogKz0gNDsKLQkJfQotCi0JCWlmIChydyAmIDB4MDMpewotCQkJT1BKX1VJTlQzMiBrOwotCi0JCQlqID0gcncgJiAweDAzOwotCi0JCQlvcGpfdjRkd3RfaW50ZXJsZWF2ZV92KCZ2LCBhaiwgKE9QSl9JTlQzMil3LCBqKTsKLQkJCW9wal92NGR3dF9kZWNvZGUoJnYpOwotCi0JCQlmb3IoayA9IDA7IGsgPCByaDsgKytrKXsKLQkJCQltZW1jcHkoJmFqW2sqd10sICZ2LndhdmVsZXRba10sIChzaXplX3QpaiAqIHNpemVvZihPUEpfRkxPQVQzMikpOwotCQkJfQotCQl9Ci0JfQotCi0Jb3BqX2FsaWduZWRfZnJlZShoLndhdmVsZXQpOwotCXJldHVybiBPUEpfVFJVRTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9kd3QuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9kd3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhiNTdiYy4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvZHd0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoKLSAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzIAotICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIAotICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cwotICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBVbml2ZXJzaXRlIGNhdGhvbGlxdWUgZGUgTG91dmFpbiAoVUNMKSwgQmVsZ2l1bQotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFByb2Zlc3NvciBCZW5vaXQgTWFjcQotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMsIERhdmlkIEphbnNzZW5zCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgWWFubmljayBWZXJzY2h1ZXJlbgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4IAotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTQsIEFudG9uaW4gRGVzY2FtcGUKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCi0gKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9fRFdUX0gKLSNkZWZpbmUgX19EV1RfSAotLyoqCi1AZmlsZSBkd3QuaAotQGJyaWVmIEltcGxlbWVudGF0aW9uIG9mIGEgZGlzY3JldGUgd2F2ZWxldCB0cmFuc2Zvcm0gKERXVCkKLQotVGhlIGZ1bmN0aW9ucyBpbiBEV1QuQyBoYXZlIGZvciBnb2FsIHRvIHJlYWxpemUgZm9yd2FyZCBhbmQgaW52ZXJzZSBkaXNjcmV0IHdhdmVsZXQKLXRyYW5zZm9ybSB3aXRoIGZpbHRlciA1LTMgKHJldmVyc2libGUpIGFuZCBmaWx0ZXIgOS03IChpcnJldmVyc2libGUpLiBUaGUgZnVuY3Rpb25zIGluCi1EV1QuQyBhcmUgdXNlZCBieSBzb21lIGZ1bmN0aW9uIGluIFRDRC5DLgotKi8KLQotLyoqIEBkZWZncm91cCBEV1QgRFdUIC0gSW1wbGVtZW50YXRpb24gb2YgYSBkaXNjcmV0ZSB3YXZlbGV0IHRyYW5zZm9ybSAqLwotLypAeyovCi0KLQotLyoqIEBuYW1lIEV4cG9ydGVkIGZ1bmN0aW9ucyAqLwotLypAeyovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoqCi1Gb3J3YXJkIDUtMyB3YXZlbGV0IHRyYW5mb3JtIGluIDItRC4gCi1BcHBseSBhIHJldmVyc2libGUgRFdUIHRyYW5zZm9ybSB0byBhIGNvbXBvbmVudCBvZiBhbiBpbWFnZS4KLUBwYXJhbSB0aWxlYyBUaWxlIGNvbXBvbmVudCBpbmZvcm1hdGlvbiAoY3VycmVudCB0aWxlKQotKi8KLU9QSl9CT09MIG9wal9kd3RfZW5jb2RlKG9wal90Y2RfdGlsZWNvbXBfdCAqIHRpbGVjKTsKLQotLyoqCi1JbnZlcnNlIDUtMyB3YXZlbGV0IHRyYW5mb3JtIGluIDItRC4KLUFwcGx5IGEgcmV2ZXJzaWJsZSBpbnZlcnNlIERXVCB0cmFuc2Zvcm0gdG8gYSBjb21wb25lbnQgb2YgYW4gaW1hZ2UuCi1AcGFyYW0gdGlsZWMgVGlsZSBjb21wb25lbnQgaW5mb3JtYXRpb24gKGN1cnJlbnQgdGlsZSkKLUBwYXJhbSBudW1yZXMgTnVtYmVyIG9mIHJlc29sdXRpb24gbGV2ZWxzIHRvIGRlY29kZQotKi8KLU9QSl9CT09MIG9wal9kd3RfZGVjb2RlKG9wal90Y2RfdGlsZWNvbXBfdCogdGlsZWMsIE9QSl9VSU5UMzIgbnVtcmVzKTsKLQotLyoqCi1HZXQgdGhlIGdhaW4gb2YgYSBzdWJiYW5kIGZvciB0aGUgcmV2ZXJzaWJsZSA1LTMgRFdULgotQHBhcmFtIG9yaWVudCBOdW1iZXIgdGhhdCBpZGVudGlmaWVzIHRoZSBzdWJiYW5kICgwLT5MTCwgMS0+SEwsIDItPkxILCAzLT5ISCkKLUByZXR1cm4gUmV0dXJucyAwIGlmIG9yaWVudCA9IDAsIHJldHVybnMgMSBpZiBvcmllbnQgPSAxIG9yIDIsIHJldHVybnMgMiBvdGhlcndpc2UKLSovCi1PUEpfVUlOVDMyIG9wal9kd3RfZ2V0Z2FpbihPUEpfVUlOVDMyIG9yaWVudCkgOwotLyoqCi1HZXQgdGhlIG5vcm0gb2YgYSB3YXZlbGV0IGZ1bmN0aW9uIG9mIGEgc3ViYmFuZCBhdCBhIHNwZWNpZmllZCBsZXZlbCBmb3IgdGhlIHJldmVyc2libGUgNS0zIERXVC4KLUBwYXJhbSBsZXZlbCBMZXZlbCBvZiB0aGUgd2F2ZWxldCBmdW5jdGlvbgotQHBhcmFtIG9yaWVudCBCYW5kIG9mIHRoZSB3YXZlbGV0IGZ1bmN0aW9uCi1AcmV0dXJuIFJldHVybnMgdGhlIG5vcm0gb2YgdGhlIHdhdmVsZXQgZnVuY3Rpb24KLSovCi1PUEpfRkxPQVQ2NCBvcGpfZHd0X2dldG5vcm0oT1BKX1VJTlQzMiBsZXZlbCwgT1BKX1VJTlQzMiBvcmllbnQpOwotLyoqCi1Gb3J3YXJkIDktNyB3YXZlbGV0IHRyYW5zZm9ybSBpbiAyLUQuIAotQXBwbHkgYW4gaXJyZXZlcnNpYmxlIERXVCB0cmFuc2Zvcm0gdG8gYSBjb21wb25lbnQgb2YgYW4gaW1hZ2UuCi1AcGFyYW0gdGlsZWMgVGlsZSBjb21wb25lbnQgaW5mb3JtYXRpb24gKGN1cnJlbnQgdGlsZSkKLSovCi1PUEpfQk9PTCBvcGpfZHd0X2VuY29kZV9yZWFsKG9wal90Y2RfdGlsZWNvbXBfdCAqIHRpbGVjKTsKLS8qKgotSW52ZXJzZSA5LTcgd2F2ZWxldCB0cmFuc2Zvcm0gaW4gMi1ELiAKLUFwcGx5IGFuIGlycmV2ZXJzaWJsZSBpbnZlcnNlIERXVCB0cmFuc2Zvcm0gdG8gYSBjb21wb25lbnQgb2YgYW4gaW1hZ2UuCi1AcGFyYW0gdGlsZWMgVGlsZSBjb21wb25lbnQgaW5mb3JtYXRpb24gKGN1cnJlbnQgdGlsZSkKLUBwYXJhbSBudW1yZXMgTnVtYmVyIG9mIHJlc29sdXRpb24gbGV2ZWxzIHRvIGRlY29kZQotKi8KLU9QSl9CT09MIG9wal9kd3RfZGVjb2RlX3JlYWwob3BqX3RjZF90aWxlY29tcF90KiByZXN0cmljdCB0aWxlYywgT1BKX1VJTlQzMiBudW1yZXMpOwotCi0vKioKLUdldCB0aGUgZ2FpbiBvZiBhIHN1YmJhbmQgZm9yIHRoZSBpcnJldmVyc2libGUgOS03IERXVC4KLUBwYXJhbSBvcmllbnQgTnVtYmVyIHRoYXQgaWRlbnRpZmllcyB0aGUgc3ViYmFuZCAoMC0+TEwsIDEtPkhMLCAyLT5MSCwgMy0+SEgpCi1AcmV0dXJuIFJldHVybnMgdGhlIGdhaW4gb2YgdGhlIDktNyB3YXZlbGV0IHRyYW5zZm9ybQotKi8KLU9QSl9VSU5UMzIgb3BqX2R3dF9nZXRnYWluX3JlYWwoT1BKX1VJTlQzMiBvcmllbnQpOwotLyoqCi1HZXQgdGhlIG5vcm0gb2YgYSB3YXZlbGV0IGZ1bmN0aW9uIG9mIGEgc3ViYmFuZCBhdCBhIHNwZWNpZmllZCBsZXZlbCBmb3IgdGhlIGlycmV2ZXJzaWJsZSA5LTcgRFdUCi1AcGFyYW0gbGV2ZWwgTGV2ZWwgb2YgdGhlIHdhdmVsZXQgZnVuY3Rpb24KLUBwYXJhbSBvcmllbnQgQmFuZCBvZiB0aGUgd2F2ZWxldCBmdW5jdGlvbgotQHJldHVybiBSZXR1cm5zIHRoZSBub3JtIG9mIHRoZSA5LTcgd2F2ZWxldAotKi8KLU9QSl9GTE9BVDY0IG9wal9kd3RfZ2V0bm9ybV9yZWFsKE9QSl9VSU5UMzIgbGV2ZWwsIE9QSl9VSU5UMzIgb3JpZW50KTsKLS8qKgotRXhwbGljaXQgY2FsY3VsYXRpb24gb2YgdGhlIFF1YW50aXphdGlvbiBTdGVwc2l6ZXMgCi1AcGFyYW0gdGNjcCBUaWxlLWNvbXBvbmVudCBjb2RpbmcgcGFyYW1ldGVycwotQHBhcmFtIHByZWMgUHJlY2ludCBhbmFseXplZAotKi8KLXZvaWQgb3BqX2R3dF9jYWxjX2V4cGxpY2l0X3N0ZXBzaXplcyhvcGpfdGNjcF90ICogdGNjcCwgT1BKX1VJTlQzMiBwcmVjKTsKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKkB9Ki8KLQotLypAfSovCi0KLSNlbmRpZiAvKiBfX0RXVF9IICovCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvZXZlbnQuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9ldmVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGUwMzk1Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9ldmVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKLSAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKLSAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKLSAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMS0yMDEyLCBDZW50cmUgTmF0aW9uYWwgZCdFdHVkZXMgU3BhdGlhbGVzIChDTkVTKSwgRlIgCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENTIFN5c3RlbWVzIGQnSW5mb3JtYXRpb24sIEZyYW5jZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCi0gKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotI2lmbmRlZiBfX0VWRU5UX0gKLSNkZWZpbmUgX19FVkVOVF9ICi0vKioKLUBmaWxlIGV2ZW50LmgKLUBicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBhIGV2ZW50IGNhbGxiYWNrIHN5c3RlbQotCi1UaGUgZnVuY3Rpb25zIGluIEVWRU5ULkMgaGF2ZSBmb3IgZ29hbCB0byBzZW5kIG91dHB1dCBtZXNzYWdlcyAoZXJyb3JzLCB3YXJuaW5ncywgZGVidWcpIHRvIHRoZSB1c2VyLgotKi8KLS8qKgotTWVzc2FnZSBoYW5kbGVyIG9iamVjdAotdXNlZCBmb3IgCi08dWw+Ci08bGk+RXJyb3IgbWVzc2FnZXMKLTxsaT5XYXJuaW5nIG1lc3NhZ2VzCi08bGk+RGVidWdnaW5nIG1lc3NhZ2VzCi08L3VsPgotKi8KLXR5cGVkZWYgc3RydWN0IG9wal9ldmVudF9tZ3IgCi17Ci0JLyoqIERhdGEgdG8gY2FsbCB0aGUgZXZlbnQgbWFuYWdlciB1cG9uICovCi0Jdm9pZCAqCQkJbV9lcnJvcl9kYXRhOwotCS8qKiBEYXRhIHRvIGNhbGwgdGhlIGV2ZW50IG1hbmFnZXIgdXBvbiAqLwotCXZvaWQgKgkJCW1fd2FybmluZ19kYXRhOwotCS8qKiBEYXRhIHRvIGNhbGwgdGhlIGV2ZW50IG1hbmFnZXIgdXBvbiAqLwotCXZvaWQgKgkJCW1faW5mb19kYXRhOwotCS8qKiBFcnJvciBtZXNzYWdlIGNhbGxiYWNrIGlmIGF2YWlsYWJsZSwgTlVMTCBvdGhlcndpc2UgKi8KLQlvcGpfbXNnX2NhbGxiYWNrIGVycm9yX2hhbmRsZXI7Ci0JLyoqIFdhcm5pbmcgbWVzc2FnZSBjYWxsYmFjayBpZiBhdmFpbGFibGUsIE5VTEwgb3RoZXJ3aXNlICovCi0Jb3BqX21zZ19jYWxsYmFjayB3YXJuaW5nX2hhbmRsZXI7Ci0JLyoqIERlYnVnIG1lc3NhZ2UgY2FsbGJhY2sgaWYgYXZhaWxhYmxlLCBOVUxMIG90aGVyd2lzZSAqLwotCW9wal9tc2dfY2FsbGJhY2sgaW5mb19oYW5kbGVyOwotfSBvcGpfZXZlbnRfbWdyX3Q7Ci0KLQotI2RlZmluZSBFVlRfRVJST1IJMQkvKio8IEVycm9yIGV2ZW50IHR5cGUgKi8KLSNkZWZpbmUgRVZUX1dBUk5JTkcJMgkvKio8IFdhcm5pbmcgZXZlbnQgdHlwZSAqLwotI2RlZmluZSBFVlRfSU5GTwk0CS8qKjwgRGVidWcgZXZlbnQgdHlwZSAqLwotCi0vKiogQGRlZmdyb3VwIEVWRU5UIEVWRU5UIC0gSW1wbGVtZW50YXRpb24gb2YgYSBldmVudCBjYWxsYmFjayBzeXN0ZW0gKi8KLS8qQHsqLwotCi0vKiogQG5hbWUgRXhwb3J0ZWQgZnVuY3Rpb25zIChzZWUgYWxzbyBvcGVuanBlZy5oKSAqLwotLypAeyovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKgotICogV3JpdGUgZm9ybWF0dGVkIGRhdGEgdG8gYSBzdHJpbmcgYW5kIHNlbmQgdGhlIHN0cmluZyB0byBhIHVzZXIgY2FsbGJhY2suCi0gKgotICogQHBhcmFtIGV2ZW50X21ncgkJCUV2ZW50IGhhbmRsZXIKLSAqIEBwYXJhbSBldmVudF90eXBlIAkJRXZlbnQgdHlwZSBvciBjYWxsYmFjayB0byB1c2UgdG8gc2VuZCB0aGUgbWVzc2FnZQotICogQHBhcmFtIGZtdCAJCQkJRm9ybWF0LWNvbnRyb2wgc3RyaW5nIChwbHVzIG9wdGlvbmFsIGFyZ3VtZW50cykKLSAqCi0gKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIGZhbHNlIG90aGVyd2lzZQotICovCi1PUEpfQk9PTCBvcGpfZXZlbnRfbXNnKG9wal9ldmVudF9tZ3JfdCogZXZlbnRfbWdyLCBPUEpfSU5UMzIgZXZlbnRfdHlwZSwgY29uc3QgY2hhciAqZm10LCAuLi4pOwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqCi0gKiBTZXQgdGhlIGV2ZW50IG1hbmFnZXIgd2l0aCB0aGUgZGVmYXVsdCBjYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhlIDMgbGV2ZWxzLgotICovCi12b2lkIG9wal9zZXRfZGVmYXVsdF9ldmVudF9oYW5kbGVyKG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7Ci0KLS8qQH0qLwotCi0vKkB9Ki8KLQotI2VuZGlmIC8qIF9fRVZFTlRfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL2Z1bmN0aW9uX2xpc3QuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9mdW5jdGlvbl9saXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YThiNGEuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL2Z1bmN0aW9uX2xpc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCi0gKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCi0gKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCBKZXJvbWUgRmltZXMsIENvbW11bmljYXRpb25zICYgU3lzdGVtZXMgPGplcm9tZS5maW1lc0BjLXMuZnI+Ci0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKLSAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJvcGpfaW5jbHVkZXMuaCIKLQotLyoqCi0gKiBEZWZhdWx0IHNpemUgb2YgdGhlIHZhbGlkYXRpb24gbGlzdCwgaWYgbm90IHN1ZmZpY2llbnQsIGRhdGEgd2lsbCBiZSByZWFsbG9jYXRlZCB3aXRoIGEgZG91YmxlIHNpemUuCi0gKi8KLSNkZWZpbmUgT1BKX1ZBTElEQVRJT05fU0laRSAxMAotCi1vcGpfcHJvY2VkdXJlX2xpc3RfdCAqICBvcGpfcHJvY2VkdXJlX2xpc3RfY3JlYXRlKCkKLXsKLSAgICAgICAgLyogbWVtb3J5IGFsbG9jYXRpb24gKi8KLSAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X3QgKiBsX3ZhbGlkYXRpb24gPSAob3BqX3Byb2NlZHVyZV9saXN0X3QgKikgb3BqX2NhbGxvYygxLHNpemVvZihvcGpfcHJvY2VkdXJlX2xpc3RfdCkpOwotICAgICAgICBpZiAoISBsX3ZhbGlkYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDA7Ci0gICAgICAgIH0KLSAgICAgICAgLyogaW5pdGlhbGl6YXRpb24gKi8KLSAgICAgICAgbF92YWxpZGF0aW9uLT5tX25iX21heF9wcm9jZWR1cmVzID0gT1BKX1ZBTElEQVRJT05fU0laRTsKLSAgICAgICAgbF92YWxpZGF0aW9uLT5tX3Byb2NlZHVyZXMgPSAob3BqX3Byb2NlZHVyZSopb3BqX2NhbGxvYyhPUEpfVkFMSURBVElPTl9TSVpFLCBzaXplb2Yob3BqX3Byb2NlZHVyZSkpOwotICAgICAgICBpZiAoISBsX3ZhbGlkYXRpb24tPm1fcHJvY2VkdXJlcykKLSAgICAgICAgewotICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfdmFsaWRhdGlvbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsX3ZhbGlkYXRpb247Ci19Ci0KLXZvaWQgIG9wal9wcm9jZWR1cmVfbGlzdF9kZXN0cm95KG9wal9wcm9jZWR1cmVfbGlzdF90ICogcF9saXN0KQotewotICAgICAgICBpZiAoISBwX2xpc3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLyogaW5pdGlhbGl6YXRpb24gKi8KLSAgICAgICAgaWYgKHBfbGlzdC0+bV9wcm9jZWR1cmVzKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9saXN0LT5tX3Byb2NlZHVyZXMpOwotICAgICAgICB9Ci0gICAgICAgIG9wal9mcmVlKHBfbGlzdCk7Ci19Ci0KLU9QSl9CT09MIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlIChvcGpfcHJvY2VkdXJlX2xpc3RfdCAqIHBfdmFsaWRhdGlvbl9saXN0LCBvcGpfcHJvY2VkdXJlIHBfcHJvY2VkdXJlKQotewotICAgICAgICBpZiAocF92YWxpZGF0aW9uX2xpc3QtPm1fbmJfbWF4X3Byb2NlZHVyZXMgPT0gcF92YWxpZGF0aW9uX2xpc3QtPm1fbmJfcHJvY2VkdXJlcykKLSAgICAgICAgewotICAgICAgICAgICAgICAgIG9wal9wcm9jZWR1cmUgKiBuZXdfcHJvY2VkdXJlczsKLQotICAgICAgICAgICAgICAgIHBfdmFsaWRhdGlvbl9saXN0LT5tX25iX21heF9wcm9jZWR1cmVzICs9IE9QSl9WQUxJREFUSU9OX1NJWkU7Ci0gICAgICAgICAgICAgICAgbmV3X3Byb2NlZHVyZXMgPSAob3BqX3Byb2NlZHVyZSopb3BqX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICBwX3ZhbGlkYXRpb25fbGlzdC0+bV9wcm9jZWR1cmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgcF92YWxpZGF0aW9uX2xpc3QtPm1fbmJfbWF4X3Byb2NlZHVyZXMgKiBzaXplb2Yob3BqX3Byb2NlZHVyZSkpOwotICAgICAgICAgICAgICAgIGlmICghIG5ld19wcm9jZWR1cmVzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfdmFsaWRhdGlvbl9saXN0LT5tX3Byb2NlZHVyZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgcF92YWxpZGF0aW9uX2xpc3QtPm1fbmJfbWF4X3Byb2NlZHVyZXMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgcF92YWxpZGF0aW9uX2xpc3QtPm1fbmJfcHJvY2VkdXJlcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWRkIGEgbmV3IHZhbGlkYXRpb24gcHJvY2VkdXJlXG4iKTsgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWRkIGEgbmV3IHZhbGlkYXRpb24gcHJvY2VkdXJlXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfdmFsaWRhdGlvbl9saXN0LT5tX3Byb2NlZHVyZXMgPSBuZXdfcHJvY2VkdXJlczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcF92YWxpZGF0aW9uX2xpc3QtPm1fcHJvY2VkdXJlc1twX3ZhbGlkYXRpb25fbGlzdC0+bV9uYl9wcm9jZWR1cmVzXSA9IHBfcHJvY2VkdXJlOwotICAgICAgICArK3BfdmFsaWRhdGlvbl9saXN0LT5tX25iX3Byb2NlZHVyZXM7Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi1PUEpfVUlOVDMyIG9wal9wcm9jZWR1cmVfbGlzdF9nZXRfbmJfcHJvY2VkdXJlcyAob3BqX3Byb2NlZHVyZV9saXN0X3QgKiBwX3ZhbGlkYXRpb25fbGlzdCkKLXsKLSAgICAgICAgcmV0dXJuIHBfdmFsaWRhdGlvbl9saXN0LT5tX25iX3Byb2NlZHVyZXM7Ci19Ci0KLW9wal9wcm9jZWR1cmUqIG9wal9wcm9jZWR1cmVfbGlzdF9nZXRfZmlyc3RfcHJvY2VkdXJlIChvcGpfcHJvY2VkdXJlX2xpc3RfdCAqIHBfdmFsaWRhdGlvbl9saXN0KQotewotICAgICAgICByZXR1cm4gcF92YWxpZGF0aW9uX2xpc3QtPm1fcHJvY2VkdXJlczsKLX0KLQotdm9pZCBvcGpfcHJvY2VkdXJlX2xpc3RfY2xlYXIgKG9wal9wcm9jZWR1cmVfbGlzdF90ICogcF92YWxpZGF0aW9uX2xpc3QpCi17Ci0gICAgICAgIHBfdmFsaWRhdGlvbl9saXN0LT5tX25iX3Byb2NlZHVyZXMgPSAwOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL2Z1bmN0aW9uX2xpc3QuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9mdW5jdGlvbl9saXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OWFkOWUuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL2Z1bmN0aW9uX2xpc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCi0gKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCi0gKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCBKZXJvbWUgRmltZXMsIENvbW11bmljYXRpb25zICYgU3lzdGVtZXMgPGplcm9tZS5maW1lc0BjLXMuZnI+Ci0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKLSAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX19GVU5DVElPTl9MSVNUX0gKLSNkZWZpbmUgX19GVU5DVElPTl9MSVNUX0gKLQotLyoqIAotICogQGZpbGUgZnVuY3Rpb25fbGlzdC5oCi0gKiBAYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYSBsaXN0IG9mIHByb2NlZHVyZXMuCi0KLSAqIFRoZSBmdW5jdGlvbnMgaW4gdmFsaWRhdGlvbi5jIGFpbXMgdG8gaGF2ZSBhY2Nlc3MgdG8gYSBsaXN0IG9mIHByb2NlZHVyZXMuCi0qLwotCi0vKiogQGRlZmdyb3VwIFZBTCBWQUwgLSB2YWxpZGF0aW9uIHByb2NlZHVyZSovCi0vKkB7Ki8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRk9SV0FSRCBERUNMQVJBVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqCi0gKiBkZWNsYXJlIGEgZnVuY3Rpb24gcG9pbnRlcgotICovCi10eXBlZGVmIHZvaWQgKCpvcGpfcHJvY2VkdXJlKSh2b2lkKTsKLQotLyoqCi0gKiBBIGxpc3Qgb2YgcHJvY2VkdXJlcy4KLSovCi10eXBlZGVmIHN0cnVjdCBvcGpfcHJvY2VkdXJlX2xpc3QgCi17Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiB2YWxpZGF0aW9uIHByb2NlZHVyZXMuCi0JICovCi0JT1BKX1VJTlQzMiBtX25iX3Byb2NlZHVyZXM7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiB0aGUgYXJyYXkgb2YgdmFsaWRhdGlvbiBwcm9jZWR1cmVzLgotCSAqLwotCU9QSl9VSU5UMzIgbV9uYl9tYXhfcHJvY2VkdXJlczsKLQkvKioKLQkgKiBUaGUgYXJyYXkgb2YgcHJvY2VkdXJlcy4KLQkgKi8KLQlvcGpfcHJvY2VkdXJlICogbV9wcm9jZWR1cmVzOwotCi19IG9wal9wcm9jZWR1cmVfbGlzdF90OwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKioKLSAqIENyZWF0ZXMgYSB2YWxpZGF0aW9uIGxpc3QuCi0gKgotICogQHJldHVybgl0aGUgbmV3bHkgY3JlYXRlZCB2YWxpZGF0aW9uIGxpc3QuCi0gKi8KLW9wal9wcm9jZWR1cmVfbGlzdF90ICogIG9wal9wcm9jZWR1cmVfbGlzdF9jcmVhdGUodm9pZCk7Ci0KLS8qKgotICogRGVzdHJveXMgYSB2YWxpZGF0aW9uIGxpc3QuCi0gKgotICogQHBhcmFtIHBfbGlzdCB0aGUgbGlzdCB0byBkZXN0cm95LgotICovCi12b2lkICBvcGpfcHJvY2VkdXJlX2xpc3RfZGVzdHJveShvcGpfcHJvY2VkdXJlX2xpc3RfdCAqIHBfbGlzdCk7Ci0KLS8qKgotICogQWRkcyBhIG5ldyB2YWxpZGF0aW9uIHByb2NlZHVyZS4KLSAqCi0gKiBAcGFyYW0JcF92YWxpZGF0aW9uX2xpc3QgdGhlIGxpc3Qgb2YgcHJvY2VkdXJlIHRvIG1vZGlmeS4KLSAqIEBwYXJhbQlwX3Byb2NlZHVyZQkJdGhlIHByb2NlZHVyZSB0byBhZGQuCi0gKgotICogQHJldHVybglPUEpfVFJVRSBpZiB0aGUgcHJvY2VkdXJlIGNvdWxkIGJlIGFkZGVkLgotICovCi1PUEpfQk9PTCBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZSAob3BqX3Byb2NlZHVyZV9saXN0X3QgKiBwX3ZhbGlkYXRpb25fbGlzdCwgb3BqX3Byb2NlZHVyZSBwX3Byb2NlZHVyZSk7Ci0KLS8qKgotICogR2V0cyB0aGUgbnVtYmVyIG9mIHZhbGlkYXRpb24gcHJvY2VkdXJlcy4KLSAqCi0gKiBAcGFyYW0JcF92YWxpZGF0aW9uX2xpc3QgdGhlIGxpc3Qgb2YgcHJvY2VkdXJlIHRvIG1vZGlmeS4KLSAqCi0gKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgdmFsaWRhdGlvbiBwcm9jZWR1cmVzLgotICovCi1PUEpfVUlOVDMyIG9wal9wcm9jZWR1cmVfbGlzdF9nZXRfbmJfcHJvY2VkdXJlcyAob3BqX3Byb2NlZHVyZV9saXN0X3QgKiBwX3ZhbGlkYXRpb25fbGlzdCk7Ci0KLS8qKgotICogR2V0cyB0aGUgcG9pbnRlciBvbiB0aGUgZmlyc3QgdmFsaWRhdGlvbiBwcm9jZWR1cmUuIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byB0aGUgQysrCi0gKiBpdGVyYXRvciBjbGFzcyB0byBpdGVyYXRlIHRocm91Z2ggYWxsIHRoZSBwcm9jZWR1cmVzIGluc2lkZSB0aGUgdmFsaWRhdGlvbiBsaXN0LgotICogdGhlIGNhbGxlciBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB0aGUgcG9pbnRlci4KLSAqCi0gKiBAcGFyYW0JcF92YWxpZGF0aW9uX2xpc3QgdGhlIGxpc3Qgb2YgcHJvY2VkdXJlIHRvIGdldCB0aGUgZmlyc3QgcHJvY2VkdXJlIGZyb20uCi0gKgotICogQHJldHVybglhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IHByb2NlZHVyZS4KLSAqLwotb3BqX3Byb2NlZHVyZSogb3BqX3Byb2NlZHVyZV9saXN0X2dldF9maXJzdF9wcm9jZWR1cmUgKG9wal9wcm9jZWR1cmVfbGlzdF90ICogcF92YWxpZGF0aW9uX2xpc3QpOwotCi0KLS8qKgotICogQ2xlYXJzIHRoZSBsaXN0IG9mIHZhbGlkYXRpb24gcHJvY2VkdXJlcy4KLSAqCi0gKiBAcGFyYW0JcF92YWxpZGF0aW9uX2xpc3QgdGhlIGxpc3Qgb2YgcHJvY2VkdXJlIHRvIGNsZWFyLgotICoKLSAqLwotdm9pZCBvcGpfcHJvY2VkdXJlX2xpc3RfY2xlYXIgKG9wal9wcm9jZWR1cmVfbGlzdF90ICogcF92YWxpZGF0aW9uX2xpc3QpOwotLypAfSovCi0KLSNlbmRpZiAvKiBfX0ZVTkNUSU9OX0xJU1RfSCAqLwotCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvaW1hZ2UuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9pbWFnZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTY4NjY4Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9pbWFnZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qCi0gKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKLSAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKLSAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKLSAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgQVMgSVMnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQotICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgIm9wal9pbmNsdWRlcy5oIgotCi1vcGpfaW1hZ2VfdCogb3BqX2ltYWdlX2NyZWF0ZTAodm9pZCkgewotCW9wal9pbWFnZV90ICppbWFnZSA9IChvcGpfaW1hZ2VfdCopb3BqX2NhbGxvYygxLCBzaXplb2Yob3BqX2ltYWdlX3QpKTsKLQlyZXR1cm4gaW1hZ2U7Ci19Ci0KLW9wal9pbWFnZV90KiBPUEpfQ0FMTENPTlYgb3BqX2ltYWdlX2NyZWF0ZShPUEpfVUlOVDMyIG51bWNtcHRzLCBvcGpfaW1hZ2VfY21wdHBhcm1fdCAqY21wdHBhcm1zLCBPUEpfQ09MT1JfU1BBQ0UgY2xyc3BjKSB7Ci0JT1BKX1VJTlQzMiBjb21wbm87Ci0Jb3BqX2ltYWdlX3QgKmltYWdlID0gTlVMTDsKLQotCWltYWdlID0gKG9wal9pbWFnZV90Kikgb3BqX2NhbGxvYygxLCBzaXplb2Yob3BqX2ltYWdlX3QpKTsKLQlpZihpbWFnZSkgewotCQlpbWFnZS0+Y29sb3Jfc3BhY2UgPSBjbHJzcGM7Ci0JCWltYWdlLT5udW1jb21wcyA9IG51bWNtcHRzOwotCQkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBwZXItY29tcG9uZW50IGluZm9ybWF0aW9uICovCi0JCWltYWdlLT5jb21wcyA9IChvcGpfaW1hZ2VfY29tcF90KilvcGpfY2FsbG9jKDEsaW1hZ2UtPm51bWNvbXBzICogc2l6ZW9mKG9wal9pbWFnZV9jb21wX3QpKTsKLQkJaWYoIWltYWdlLT5jb21wcykgewotCQkJZnByaW50ZihzdGRlcnIsIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGltYWdlLlxuIik7Ci0JCQlvcGpfaW1hZ2VfZGVzdHJveShpbWFnZSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQkvKiBjcmVhdGUgdGhlIGluZGl2aWR1YWwgaW1hZ2UgY29tcG9uZW50cyAqLwotCQlmb3IoY29tcG5vID0gMDsgY29tcG5vIDwgbnVtY21wdHM7IGNvbXBubysrKSB7Ci0JCQlvcGpfaW1hZ2VfY29tcF90ICpjb21wID0gJmltYWdlLT5jb21wc1tjb21wbm9dOwotCQkJY29tcC0+ZHggPSBjbXB0cGFybXNbY29tcG5vXS5keDsKLQkJCWNvbXAtPmR5ID0gY21wdHBhcm1zW2NvbXBub10uZHk7Ci0JCQljb21wLT53ID0gY21wdHBhcm1zW2NvbXBub10udzsKLQkJCWNvbXAtPmggPSBjbXB0cGFybXNbY29tcG5vXS5oOwotCQkJY29tcC0+eDAgPSBjbXB0cGFybXNbY29tcG5vXS54MDsKLQkJCWNvbXAtPnkwID0gY21wdHBhcm1zW2NvbXBub10ueTA7Ci0JCQljb21wLT5wcmVjID0gY21wdHBhcm1zW2NvbXBub10ucHJlYzsKLQkJCWNvbXAtPmJwcCA9IGNtcHRwYXJtc1tjb21wbm9dLmJwcDsKLQkJCWNvbXAtPnNnbmQgPSBjbXB0cGFybXNbY29tcG5vXS5zZ25kOwotCQkJY29tcC0+ZGF0YSA9IChPUEpfSU5UMzIqKSBvcGpfY2FsbG9jKGNvbXAtPncgKiBjb21wLT5oLCBzaXplb2YoT1BKX0lOVDMyKSk7Ci0JCQlpZighY29tcC0+ZGF0YSkgewotCQkJCWZwcmludGYoc3RkZXJyLCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBpbWFnZS5cbiIpOwotCQkJCW9wal9pbWFnZV9kZXN0cm95KGltYWdlKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiBpbWFnZTsKLX0KLQotdm9pZCBPUEpfQ0FMTENPTlYgb3BqX2ltYWdlX2Rlc3Ryb3kob3BqX2ltYWdlX3QgKmltYWdlKSB7Ci0JaWYoaW1hZ2UpIHsKLQkJaWYoaW1hZ2UtPmNvbXBzKSB7Ci0JCQlPUEpfVUlOVDMyIGNvbXBubzsKLQotCQkJLyogaW1hZ2UgY29tcG9uZW50cyAqLwotCQkJZm9yKGNvbXBubyA9IDA7IGNvbXBubyA8IGltYWdlLT5udW1jb21wczsgY29tcG5vKyspIHsKLQkJCQlvcGpfaW1hZ2VfY29tcF90ICppbWFnZV9jb21wID0gJihpbWFnZS0+Y29tcHNbY29tcG5vXSk7Ci0JCQkJaWYoaW1hZ2VfY29tcC0+ZGF0YSkgewotCQkJCQlvcGpfZnJlZShpbWFnZV9jb21wLT5kYXRhKTsKLQkJCQl9Ci0JCQl9Ci0JCQlvcGpfZnJlZShpbWFnZS0+Y29tcHMpOwotCQl9Ci0KLQkJaWYoaW1hZ2UtPmljY19wcm9maWxlX2J1ZikgewotCQkJb3BqX2ZyZWUoaW1hZ2UtPmljY19wcm9maWxlX2J1Zik7Ci0JCX0KLQotCQlvcGpfZnJlZShpbWFnZSk7Ci0JfQotfQotCi0vKioKLSAqIFVwZGF0ZXMgdGhlIGNvbXBvbmVudHMgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBpbWFnZSBmcm9tIHRoZSBjb2RpbmcgcGFyYW1ldGVycy4KLSAqCi0gKiBAcGFyYW0gcF9pbWFnZV9oZWFkZXIJdGhlIGltYWdlIGhlYWRlciB0byB1cGRhdGUuCi0gKiBAcGFyYW0gcF9jcAkJCQl0aGUgY29kaW5nIHBhcmFtZXRlcnMgZnJvbSB3aGljaCB0byB1cGRhdGUgdGhlIGltYWdlLgotICovCi12b2lkIG9wal9pbWFnZV9jb21wX2hlYWRlcl91cGRhdGUob3BqX2ltYWdlX3QgKiBwX2ltYWdlX2hlYWRlciwgY29uc3Qgc3RydWN0IG9wal9jcCAqIHBfY3ApCi17Ci0JT1BKX1VJTlQzMiBpLCBsX3dpZHRoLCBsX2hlaWdodDsKLQlPUEpfSU5UMzIgbF94MCwgbF95MCwgbF94MSwgbF95MTsKLQlPUEpfSU5UMzIgbF9jb21wX3gwLCBsX2NvbXBfeTAsIGxfY29tcF94MSwgbF9jb21wX3kxOwotCW9wal9pbWFnZV9jb21wX3QqIGxfaW1nX2NvbXAgPSBOVUxMOwotCi0JbF94MCA9IG9wal9pbnRfbWF4KChPUEpfSU5UMzIpcF9jcC0+dHgwICwgKE9QSl9JTlQzMilwX2ltYWdlX2hlYWRlci0+eDApOwotCWxfeTAgPSBvcGpfaW50X21heCgoT1BKX0lOVDMyKXBfY3AtPnR5MCAsIChPUEpfSU5UMzIpcF9pbWFnZV9oZWFkZXItPnkwKTsKLQlsX3gxID0gb3BqX2ludF9taW4oKE9QSl9JTlQzMikocF9jcC0+dHgwICsgcF9jcC0+dHcgKiBwX2NwLT50ZHgpLCAoT1BKX0lOVDMyKXBfaW1hZ2VfaGVhZGVyLT54MSk7Ci0JbF95MSA9IG9wal9pbnRfbWluKChPUEpfSU5UMzIpKHBfY3AtPnR5MCArIHBfY3AtPnRoICogcF9jcC0+dGR5KSwgKE9QSl9JTlQzMilwX2ltYWdlX2hlYWRlci0+eTEpOwotCi0JbF9pbWdfY29tcCA9IHBfaW1hZ2VfaGVhZGVyLT5jb21wczsKLQlmb3IJKGkgPSAwOyBpIDwgcF9pbWFnZV9oZWFkZXItPm51bWNvbXBzOyArK2kpIHsKLQkJbF9jb21wX3gwID0gb3BqX2ludF9jZWlsZGl2KGxfeDAsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHgpOwotCQlsX2NvbXBfeTAgPSBvcGpfaW50X2NlaWxkaXYobF95MCwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5keSk7Ci0JCWxfY29tcF94MSA9IG9wal9pbnRfY2VpbGRpdihsX3gxLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR4KTsKLQkJbF9jb21wX3kxID0gb3BqX2ludF9jZWlsZGl2KGxfeTEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHkpOwotCQlsX3dpZHRoID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2cG93MihsX2NvbXBfeDEgLSBsX2NvbXBfeDAsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZmFjdG9yKTsKLQkJbF9oZWlnaHQgPSAoT1BKX1VJTlQzMilvcGpfaW50X2NlaWxkaXZwb3cyKGxfY29tcF95MSAtIGxfY29tcF95MCwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5mYWN0b3IpOwotCQlsX2ltZ19jb21wLT53ID0gbF93aWR0aDsKLQkJbF9pbWdfY29tcC0+aCA9IGxfaGVpZ2h0OwotCQlsX2ltZ19jb21wLT54MCA9IChPUEpfVUlOVDMyKWxfY29tcF94MC8qbF94MCovOwotCQlsX2ltZ19jb21wLT55MCA9IChPUEpfVUlOVDMyKWxfY29tcF95MC8qbF95MCovOwotCQkrK2xfaW1nX2NvbXA7Ci0JfQotfQotCi0KLS8qKgotICogQ29weSBvbmx5IGhlYWRlciBvZiBpbWFnZSBhbmQgaXRzIGNvbXBvbmVudCBoZWFkZXIgKG5vIGRhdGEgYXJlIGNvcGllZCkKLSAqIGlmIGRlc3QgaW1hZ2UgaGF2ZSBkYXRhLCB0aGV5IHdpbGwgYmUgZnJlZWQKLSAqCi0gKiBAcGFyYW0JcF9pbWFnZV9zcmMJCXRoZSBzcmMgaW1hZ2UKLSAqIEBwYXJhbQlwX2ltYWdlX2Rlc3QJdGhlIGRlc3QgaW1hZ2UKLSAqCi0gKi8KLXZvaWQgb3BqX2NvcHlfaW1hZ2VfaGVhZGVyKGNvbnN0IG9wal9pbWFnZV90KiBwX2ltYWdlX3NyYywgb3BqX2ltYWdlX3QqIHBfaW1hZ2VfZGVzdCkKLXsKLQlPUEpfVUlOVDMyIGNvbXBubzsKLQotCS8qIHByZWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQocF9pbWFnZV9zcmMgIT0gMDApOwotCWFzc2VydChwX2ltYWdlX2Rlc3QgIT0gMDApOwotCi0JcF9pbWFnZV9kZXN0LT54MCA9IHBfaW1hZ2Vfc3JjLT54MDsKLQlwX2ltYWdlX2Rlc3QtPnkwID0gcF9pbWFnZV9zcmMtPnkwOwotCXBfaW1hZ2VfZGVzdC0+eDEgPSBwX2ltYWdlX3NyYy0+eDE7Ci0JcF9pbWFnZV9kZXN0LT55MSA9IHBfaW1hZ2Vfc3JjLT55MTsKLQotCWlmIChwX2ltYWdlX2Rlc3QtPmNvbXBzKXsKLQkJZm9yKGNvbXBubyA9IDA7IGNvbXBubyA8IHBfaW1hZ2VfZGVzdC0+bnVtY29tcHM7IGNvbXBubysrKSB7Ci0JCQlvcGpfaW1hZ2VfY29tcF90ICppbWFnZV9jb21wID0gJihwX2ltYWdlX2Rlc3QtPmNvbXBzW2NvbXBub10pOwotCQkJaWYoaW1hZ2VfY29tcC0+ZGF0YSkgewotCQkJCW9wal9mcmVlKGltYWdlX2NvbXAtPmRhdGEpOwotCQkJfQotCQl9Ci0JCW9wal9mcmVlKHBfaW1hZ2VfZGVzdC0+Y29tcHMpOwotCQlwX2ltYWdlX2Rlc3QtPmNvbXBzID0gTlVMTDsKLQl9Ci0KLQlwX2ltYWdlX2Rlc3QtPm51bWNvbXBzID0gcF9pbWFnZV9zcmMtPm51bWNvbXBzOwotCi0JcF9pbWFnZV9kZXN0LT5jb21wcyA9IChvcGpfaW1hZ2VfY29tcF90Kikgb3BqX21hbGxvYyhwX2ltYWdlX2Rlc3QtPm51bWNvbXBzICogc2l6ZW9mKG9wal9pbWFnZV9jb21wX3QpKTsKLQlpZiAoIXBfaW1hZ2VfZGVzdC0+Y29tcHMpewotCQlwX2ltYWdlX2Rlc3QtPmNvbXBzID0gTlVMTDsKLQkJcF9pbWFnZV9kZXN0LT5udW1jb21wcyA9IDA7Ci0JCXJldHVybjsKLQl9Ci0KLQlmb3IgKGNvbXBubz0wOyBjb21wbm8gPCBwX2ltYWdlX2Rlc3QtPm51bWNvbXBzOyBjb21wbm8rKyl7Ci0JCW1lbWNweSggJihwX2ltYWdlX2Rlc3QtPmNvbXBzW2NvbXBub10pLAotCQkJCSYocF9pbWFnZV9zcmMtPmNvbXBzW2NvbXBub10pLAotCQkJCXNpemVvZihvcGpfaW1hZ2VfY29tcF90KSk7Ci0JCXBfaW1hZ2VfZGVzdC0+Y29tcHNbY29tcG5vXS5kYXRhID0gTlVMTDsKLQl9Ci0KLQlwX2ltYWdlX2Rlc3QtPmNvbG9yX3NwYWNlID0gcF9pbWFnZV9zcmMtPmNvbG9yX3NwYWNlOwotCXBfaW1hZ2VfZGVzdC0+aWNjX3Byb2ZpbGVfbGVuID0gcF9pbWFnZV9zcmMtPmljY19wcm9maWxlX2xlbjsKLQotCWlmIChwX2ltYWdlX2Rlc3QtPmljY19wcm9maWxlX2xlbikgewotCQlwX2ltYWdlX2Rlc3QtPmljY19wcm9maWxlX2J1ZiA9IChPUEpfQllURSopb3BqX21hbGxvYyhwX2ltYWdlX2Rlc3QtPmljY19wcm9maWxlX2xlbik7Ci0JCWlmICghcF9pbWFnZV9kZXN0LT5pY2NfcHJvZmlsZV9idWYpewotCQkJcF9pbWFnZV9kZXN0LT5pY2NfcHJvZmlsZV9idWYgPSBOVUxMOwotCQkJcF9pbWFnZV9kZXN0LT5pY2NfcHJvZmlsZV9sZW4gPSAwOwotCQkJcmV0dXJuOwotCQl9Ci0JCW1lbWNweSggcF9pbWFnZV9kZXN0LT5pY2NfcHJvZmlsZV9idWYsCi0JCQkJcF9pbWFnZV9zcmMtPmljY19wcm9maWxlX2J1ZiwKLQkJCQlwX2ltYWdlX3NyYy0+aWNjX3Byb2ZpbGVfbGVuKTsKLQkJfQotCQllbHNlCi0JCQlwX2ltYWdlX2Rlc3QtPmljY19wcm9maWxlX2J1ZiA9IE5VTEw7Ci0KLQlyZXR1cm47Ci19Ci0KLW9wal9pbWFnZV90KiBPUEpfQ0FMTENPTlYgb3BqX2ltYWdlX3RpbGVfY3JlYXRlKE9QSl9VSU5UMzIgbnVtY21wdHMsIG9wal9pbWFnZV9jbXB0cGFybV90ICpjbXB0cGFybXMsIE9QSl9DT0xPUl9TUEFDRSBjbHJzcGMpIHsKLQlPUEpfVUlOVDMyIGNvbXBubzsKLQlvcGpfaW1hZ2VfdCAqaW1hZ2UgPSAwMDsKLQotCWltYWdlID0gKG9wal9pbWFnZV90Kikgb3BqX2NhbGxvYygxLHNpemVvZihvcGpfaW1hZ2VfdCkpOwotCWlmIChpbWFnZSkKLQl7Ci0JCQotCQlpbWFnZS0+Y29sb3Jfc3BhY2UgPSBjbHJzcGM7Ci0JCWltYWdlLT5udW1jb21wcyA9IG51bWNtcHRzOwotCQkKLQkJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcGVyLWNvbXBvbmVudCBpbmZvcm1hdGlvbiAqLwotCQlpbWFnZS0+Y29tcHMgPSAob3BqX2ltYWdlX2NvbXBfdCopb3BqX2NhbGxvYyhpbWFnZS0+bnVtY29tcHMsIHNpemVvZihvcGpfaW1hZ2VfY29tcF90KSk7Ci0JCWlmICghaW1hZ2UtPmNvbXBzKSB7Ci0JCQlvcGpfaW1hZ2VfZGVzdHJveShpbWFnZSk7Ci0JCQlyZXR1cm4gMDA7Ci0JCX0KLQkJCi0JCS8qIGNyZWF0ZSB0aGUgaW5kaXZpZHVhbCBpbWFnZSBjb21wb25lbnRzICovCi0JCWZvcihjb21wbm8gPSAwOyBjb21wbm8gPCBudW1jbXB0czsgY29tcG5vKyspIHsKLQkJCW9wal9pbWFnZV9jb21wX3QgKmNvbXAgPSAmaW1hZ2UtPmNvbXBzW2NvbXBub107Ci0JCQljb21wLT5keCA9IGNtcHRwYXJtc1tjb21wbm9dLmR4OwotCQkJY29tcC0+ZHkgPSBjbXB0cGFybXNbY29tcG5vXS5keTsKLQkJCWNvbXAtPncgPSBjbXB0cGFybXNbY29tcG5vXS53OwotCQkJY29tcC0+aCA9IGNtcHRwYXJtc1tjb21wbm9dLmg7Ci0JCQljb21wLT54MCA9IGNtcHRwYXJtc1tjb21wbm9dLngwOwotCQkJY29tcC0+eTAgPSBjbXB0cGFybXNbY29tcG5vXS55MDsKLQkJCWNvbXAtPnByZWMgPSBjbXB0cGFybXNbY29tcG5vXS5wcmVjOwotCQkJY29tcC0+c2duZCA9IGNtcHRwYXJtc1tjb21wbm9dLnNnbmQ7Ci0JCQljb21wLT5kYXRhID0gMDsKLQkJfQotCX0KLQotCXJldHVybiBpbWFnZTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9pbmRleGJveF9tYW5hZ2VyLmggYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvaW5kZXhib3hfbWFuYWdlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzU1MjVmLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9pbmRleGJveF9tYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoKLSAqICRJZDogaW5kZXhib3hfbWFuYWdlci5oIDg5NyAyMDExLTA4LTI4IDIxOjQzOjU3WiBLYW9yaS5IYWdpaGFyYUBnbWFpbC5jb20gJAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBVbml2ZXJzaXRlIGNhdGhvbGlxdWUgZGUgTG91dmFpbiAoVUNMKSwgQmVsZ2l1bQotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFByb2Zlc3NvciBCZW5vaXQgTWFjcQotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQsIFlhbm5pY2sgVmVyc2NodWVyZW4KLSAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBLYW9yaSBIYWdpaGFyYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCi0gKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0vKiEgXGZpbGUKLSAqICBcYnJpZWYgTW9kaWZpY2F0aW9uIG9mIGpwaXAuYyBmcm9tIDJLQU4gaW5kZXhlcgotICovCi0KLSNpZm5kZWYgIElOREVYQk9YX01BTkFHRVJfSF8KLSMgZGVmaW5lIElOREVYQk9YX01BTkFHRVJfSF8KLQotI2luY2x1ZGUgIm9wZW5qcGVnLmgiCi0jaW5jbHVkZSAiajJrLmgiIC8qIG5lZWRlZCB0byB1c2UganAyLmggKi8KLSNpbmNsdWRlICJqcDIuaCIKLQotI2RlZmluZSBKUElQX0NJRFggMHg2MzY5NjQ3OCAgIC8qIENvZGVzdHJlYW0gaW5kZXggICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSlBJUF9DUFRSIDB4NjM3MDc0NzIgICAvKiBDb2Rlc3RyZWFtIEZpbmRlciBCb3ggICAgICAgICAgICovCi0jZGVmaW5lIEpQSVBfTUFORiAweDZkNjE2ZTY2ICAgLyogTWFuaWZlc3QgQm94ICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBKUElQX0ZBSVggMHg2NjYxNjk3OCAgIC8qIEZyYWdtZW50IGFycmF5IEluZGV4IGJveCAgICAgICAgKi8KLSNkZWZpbmUgSlBJUF9NSElYIDB4NmQ2ODY5NzggICAvKiBNYWluIEhlYWRlciBJbmRleCBUYWJsZSAgICAgICAgICovCi0jZGVmaW5lIEpQSVBfVFBJWCAweDc0NzA2OTc4ICAgLyogVGlsZS1wYXJ0IEluZGV4IFRhYmxlIGJveCAgICAgICAqLwotI2RlZmluZSBKUElQX1RISVggMHg3NDY4Njk3OCAgIC8qIFRpbGUgaGVhZGVyIEluZGV4IFRhYmxlIGJveCAgICAgKi8KLSNkZWZpbmUgSlBJUF9QUElYIDB4NzA3MDY5NzggICAvKiBQcmVjaW5jdCBQYWNrZXQgSW5kZXggVGFibGUgYm94ICovCi0jZGVmaW5lIEpQSVBfUEhJWCAweDcwNjg2OTc4ICAgLyogUGFja2V0IEhlYWRlciBpbmRleCBUYWJsZSAgICAgICAqLwotI2RlZmluZSBKUElQX0ZJRFggMHg2NjY5NjQ3OCAgIC8qIEZpbGUgSW5kZXggICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSlBJUF9GUFRSIDB4NjY3MDc0NzIgICAvKiBGaWxlIEZpbmRlciAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEpQSVBfUFJYWSAweDcwNzI3ODc5ICAgLyogUHJveHkgYm94ZXMgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBKUElQX0lQVFIgMHg2OTcwNzQ3MiAgIC8qIEluZGV4IGZpbmRlciBib3ggICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSlBJUF9QSExEIDB4NzA2ODZjNjQgICAvKiBQbGFjZSBob2xkZXIgICAgICAgICAgICAgICAgICAgICovCi0KLQotLyogCi0gKiBXcml0ZSB0aWxlLXBhcnQgSW5kZXggdGFibGUgYm94IChzdXBlcmJveCkKLSAqCi0gKiBAcGFyYW1baW5dIGNvZmYgICAgICBvZmZzZXQgb2YgajJrIGNvZGVzdHJlYW0KLSAqIEBwYXJhbVtpbl0gY3N0cl9pbmZvIGNvZGVzdHJlYW0gaW5mb3JtYXRpb24KLSAqIEBwYXJhbVtpbl0gajJrbGVuICAgIGxlbmd0aCBvZiBqMmsgY29kZXN0cmVhbQotICogQHBhcmFtW2luXSBjaW8gICAgICAgZmlsZSBvdXRwdXQgaGFuZGxlCi0gKiBAcmV0dXJuICAgICAgICAgICAgICBsZW5ndGggb2YgdHBpeCBib3gKLSAqLwotaW50IG9wal93cml0ZV90cGl4KCBpbnQgY29mZiwgb3BqX2NvZGVzdHJlYW1faW5mb190IGNzdHJfaW5mbywgaW50IGoya2xlbiwgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKLSAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLQotLyogCi0gKiBXcml0ZSB0aWxlIGhlYWRlciBpbmRleCB0YWJsZSBib3ggKHN1cGVyYm94KQotICoKLSAqIEBwYXJhbVtpbl0gY29mZiAgICAgIG9mZnNldCBvZiBqMmsgY29kZXN0cmVhbQotICogQHBhcmFtW2luXSBjc3RyX2luZm8gY29kZXN0cmVhbSBpbmZvcm1hdGlvbiBwb2ludGVyCi0gKiBAcGFyYW1baW5dIGNpbyAgICAgICBmaWxlIG91dHB1dCBoYW5kbGUKLSAqIEByZXR1cm4gICAgICAgICAgICAgIGxlbmd0aCBvZiB0aGl4IGJveAotICovCi1pbnQgb3BqX3dyaXRlX3RoaXgoIGludCBjb2ZmLCBvcGpfY29kZXN0cmVhbV9pbmZvX3QgY3N0cl9pbmZvLCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLCBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotCi0vKiAKLSAqIFdyaXRlIHByZWNpbmN0IHBhY2tldCBpbmRleCB0YWJsZSBib3ggKHN1cGVyYm94KQotICoKLSAqIEBwYXJhbVtpbl0gY29mZiAgICAgIG9mZnNldCBvZiBqMmsgY29kZXN0cmVhbQotICogQHBhcmFtW2luXSBjc3RyX2luZm8gY29kZXN0cmVhbSBpbmZvcm1hdGlvbgotICogQHBhcmFtW2luXSBFUEh1c2VkICAgdHJ1ZSBpZiBFUEggb3B0aW9uIHVzZWQKLSAqIEBwYXJhbVtpbl0gajJrbGVuICAgIGxlbmd0aCBvZiBqMmsgY29kZXN0cmVhbQotICogQHBhcmFtW2luXSBjaW8gICAgICAgZmlsZSBvdXRwdXQgaGFuZGxlCi0gKiBAcmV0dXJuICAgICAgICAgICAgICBsZW5ndGggb2YgcHBpeCBib3gKLSAqLwotaW50IG9wal93cml0ZV9wcGl4KCBpbnQgY29mZiwgb3BqX2NvZGVzdHJlYW1faW5mb190IGNzdHJfaW5mbywgT1BKX0JPT0wgRVBIdXNlZCwgaW50IGoya2xlbiwgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKLSAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLQotLyogCi0gKiBXcml0ZSBwYWNrZXQgaGVhZGVyIGluZGV4IHRhYmxlIGJveCAoc3VwZXJib3gpCi0gKgotICogQHBhcmFtW2luXSBjb2ZmICAgICAgb2Zmc2V0IG9mIGoyayBjb2Rlc3RyZWFtCi0gKiBAcGFyYW1baW5dIGNzdHJfaW5mbyBjb2Rlc3RyZWFtIGluZm9ybWF0aW9uCi0gKiBAcGFyYW1baW5dIEVQSHVzZWQgICB0cnVlIGlmIEVQSCBvcHRpb24gdXNlZAotICogQHBhcmFtW2luXSBqMmtsZW4gICAgbGVuZ3RoIG9mIGoyayBjb2Rlc3RyZWFtCi0gKiBAcGFyYW1baW5dIGNpbyAgICAgICBmaWxlIG91dHB1dCBoYW5kbGUKLSAqIEByZXR1cm4gICAgICAgICAgICAgIGxlbmd0aCBvZiBwcGl4IGJveAotICovCi1pbnQgb3BqX3dyaXRlX3BoaXgoIGludCBjb2ZmLCBvcGpfY29kZXN0cmVhbV9pbmZvX3QgY3N0cl9pbmZvLCBPUEpfQk9PTCBFUEh1c2VkLCBpbnQgajJrbGVuLCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAotICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotLyogCi0gKiBXcmlldCBtYW5pZmVzdCBib3ggKGJveCkKLSAqCi0gKiBAcGFyYW1baW5dIHNlY29uZCBudW1iZXIgdG8gYmUgdmlzaXRlZAotICogQHBhcmFtW2luXSB2ICAgICAgbnVtYmVyIG9mIGJveGVzCi0gKiBAcGFyYW1baW5dIGJveCAgICBib3ggdG8gYmUgbWFuaWZlc3RlZAotICogQHBhcmFtW2luXSBjaW8gICAgZmlsZSBvdXRwdXQgaGFuZGxlCi0gKi8KLQotdm9pZCBvcGpfd3JpdGVfbWFuZihpbnQgc2Vjb25kLCAKLSAgICAgICAgICAgICAgICAgICAgaW50IHYsIAotICAgICAgICAgICAgICAgICAgICBvcGpfanAyX2JveF90ICpib3gsIAotICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAotICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotLyogCi0gKiBXcml0ZSBtYWluIGhlYWRlciBpbmRleCB0YWJsZSAoYm94KQotICoKLSAqIEBwYXJhbVtpbl0gY29mZiBvZmZzZXQgb2YgajJrIGNvZGVzdHJlYW0KLSAqIEBwYXJhbVtpbl0gY3N0cl9pbmZvIGNvZGVzdHJlYW0gaW5mb3JtYXRpb24KLSAqIEBwYXJhbVtpbl0gY2lvICBmaWxlIG91dHB1dCBoYW5kbGUKLSAqIEByZXR1cm4gICAgICAgICBsZW5ndGggb2YgbWFpbm1oaXggYm94Ci0gKi8KLWludCBvcGpfd3JpdGVfbWFpbm1oaXgoIGludCBjb2ZmLCBvcGpfY29kZXN0cmVhbV9pbmZvX3QgY3N0cl9pbmZvLCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAotICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotaW50IG9wal93cml0ZV9waGl4ZmFpeCggaW50IGNvZmYsIGludCBjb21wbm8sIG9wal9jb2Rlc3RyZWFtX2luZm9fdCBjc3RyX2luZm8sIE9QSl9CT09MIEVQSHVzZWQsIGludCBqMmtsZW4sIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCi0gICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotCi1pbnQgb3BqX3dyaXRlX3BwaXhmYWl4KCBpbnQgY29mZiwgaW50IGNvbXBubywgb3BqX2NvZGVzdHJlYW1faW5mb190IGNzdHJfaW5mbywgT1BKX0JPT0wgRVBIdXNlZCwgaW50IGoya2xlbiwgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKLSAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLWludCBvcGpfd3JpdGVfdGlsZW1oaXgoIGludCBjb2ZmLCBvcGpfY29kZXN0cmVhbV9pbmZvX3QgY3N0cl9pbmZvLCBpbnQgdGlsZW5vLCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAotICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotaW50IG9wal93cml0ZV90cGl4ZmFpeCggaW50IGNvZmYsIGludCBjb21wbm8sIG9wal9jb2Rlc3RyZWFtX2luZm9fdCBjc3RyX2luZm8sIGludCBqMmtsZW4sIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCi0gICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotCi0jZW5kaWYgICAgICAvKiAhSU5ERVhCT1hfTUFOQUdFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL2ludmVydC5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL2ludmVydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzFlZTc4Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9pbnZlcnQuYworKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCi0gKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCi0gKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCBKZXJvbWUgRmltZXMsIENvbW11bmljYXRpb25zICYgU3lzdGVtZXMgPGplcm9tZS5maW1lc0BjLXMuZnI+Ci0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKLSAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJvcGpfaW5jbHVkZXMuaCIKLQotLyoqIAotICogTFVQIGRlY29tcG9zaXRpb24KLSAqLwotc3RhdGljIE9QSl9CT09MIG9wal9sdXBEZWNvbXBvc2UoT1BKX0ZMT0FUMzIgKiBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcGVybXV0YXRpb25zLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcF9zd2FwX2FyZWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG5iX2NvbXBvKTsKLS8qKiAKLSAqIExVUCBzb2x2aW5nCi0gKi8KLXN0YXRpYyB2b2lkIG9wal9sdXBTb2x2ZShPUEpfRkxPQVQzMiAqIHBSZXN1bHQsIAotICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyKiBwTWF0cml4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiogcFZlY3RvciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiogcFBlcm11dGF0aW9ucywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBuYl9jb21wbywKLSAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiAqIHBfaW50ZXJtZWRpYXRlX2RhdGEpOwotCi0vKiogCi0gKkxVUCBpbnZlcnNpb24gKGNhbGwgd2l0aCB0aGUgcmVzdWx0IG9mIGx1cERlY29tcG9zZSkKLSAqLwotc3RhdGljIHZvaWQgb3BqX2x1cEludmVydCAoIE9QSl9GTE9BVDMyICogcFNyY01hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiAqIHBEZXN0TWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbmJfY29tcG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBQZXJtdXRhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIgKiBwX3NyY190ZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcF9kZXN0X3RlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIgKiBwX3N3YXBfYXJlYSk7Ci0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBNYXRyaWMgaW52ZXJzaW9uIGludGVyZmFjZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLS8qKgotICogTWF0cml4IGludmVyc2lvbi4KLSAqLwotT1BKX0JPT0wgb3BqX21hdHJpeF9pbnZlcnNpb25fZihPUEpfRkxPQVQzMiAqIHBTcmNNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcERlc3RNYXRyaXgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG5iX2NvbXBvKQotewotCU9QSl9CWVRFICogbF9kYXRhID0gMDA7Ci0JT1BKX1VJTlQzMiBsX3Blcm11dGF0aW9uX3NpemUgPSBuYl9jb21wbyAqIChPUEpfVUlOVDMyKXNpemVvZihPUEpfVUlOVDMyKTsKLQlPUEpfVUlOVDMyIGxfc3dhcF9zaXplID0gbmJfY29tcG8gKiAoT1BKX1VJTlQzMilzaXplb2YoT1BKX0ZMT0FUMzIpOwotCU9QSl9VSU5UMzIgbF90b3RhbF9zaXplID0gbF9wZXJtdXRhdGlvbl9zaXplICsgMyAqIGxfc3dhcF9zaXplOwotCU9QSl9VSU5UMzIgKiBsUGVybXV0YXRpb25zID0gMDA7Ci0JT1BKX0ZMT0FUMzIgKiBsX2RvdWJsZV9kYXRhID0gMDA7Ci0KLQlsX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX21hbGxvYyhsX3RvdGFsX3NpemUpOwotCWlmIChsX2RhdGEgPT0gMCkgewotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQlsUGVybXV0YXRpb25zID0gKE9QSl9VSU5UMzIgKikgbF9kYXRhOwotCWxfZG91YmxlX2RhdGEgPSAoT1BKX0ZMT0FUMzIgKikgKGxfZGF0YSArIGxfcGVybXV0YXRpb25fc2l6ZSk7Ci0JbWVtc2V0KGxQZXJtdXRhdGlvbnMsMCxsX3Blcm11dGF0aW9uX3NpemUpOwotCi0JaWYoISBvcGpfbHVwRGVjb21wb3NlKHBTcmNNYXRyaXgsbFBlcm11dGF0aW9ucyxsX2RvdWJsZV9kYXRhLG5iX2NvbXBvKSkgewotCQlvcGpfZnJlZShsX2RhdGEpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQkKLSAgICBvcGpfbHVwSW52ZXJ0KHBTcmNNYXRyaXgscERlc3RNYXRyaXgsbmJfY29tcG8sbFBlcm11dGF0aW9ucyxsX2RvdWJsZV9kYXRhLGxfZG91YmxlX2RhdGEgKyBuYl9jb21wbyxsX2RvdWJsZV9kYXRhICsgMipuYl9jb21wbyk7Ci0Jb3BqX2ZyZWUobF9kYXRhKTsKLQkKLSAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIExvY2FsIGZ1bmN0aW9ucwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLU9QSl9CT09MIG9wal9sdXBEZWNvbXBvc2UoT1BKX0ZMT0FUMzIgKiBtYXRyaXgsT1BKX1VJTlQzMiAqIHBlcm11dGF0aW9ucywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcF9zd2FwX2FyZWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbmJfY29tcG8pIAotewotCU9QSl9VSU5UMzIgKiB0bXBQZXJtdXRhdGlvbnMgPSBwZXJtdXRhdGlvbnM7Ci0JT1BKX1VJTlQzMiAqIGRzdFBlcm11dGF0aW9uczsKLQlPUEpfVUlOVDMyIGsyPTAsdDsKLQlPUEpfRkxPQVQzMiB0ZW1wOwotCU9QSl9VSU5UMzIgaSxqLGs7Ci0JT1BKX0ZMT0FUMzIgcDsKLQlPUEpfVUlOVDMyIGxMYXN0Q29sdW0gPSBuYl9jb21wbyAtIDE7Ci0JT1BKX1VJTlQzMiBsU3dhcFNpemUgPSBuYl9jb21wbyAqIChPUEpfVUlOVDMyKXNpemVvZihPUEpfRkxPQVQzMik7Ci0JT1BKX0ZMT0FUMzIgKiBsVG1wTWF0cml4ID0gbWF0cml4OwotCU9QSl9GTE9BVDMyICogbENvbHVtbk1hdHJpeCwqIGxEZXN0TWF0cml4OwotCU9QSl9VSU5UMzIgb2Zmc2V0ID0gMTsKLQlPUEpfVUlOVDMyIGxTdHJpZGUgPSBuYl9jb21wby0xOwotCi0JLyppbml0aWFsaXplIHBlcm11dGF0aW9ucyAqLwotCWZvciAoaSA9IDA7IGkgPCBuYl9jb21wbzsgKytpKSAKLQl7Ci0gICAgCSp0bXBQZXJtdXRhdGlvbnMrKyA9IGk7Ci0JfQotCS8qIG5vdyBtYWtlIGEgcGl2b3Qgd2l0aCBjb2x1bSBzd2l0Y2ggKi8KLQl0bXBQZXJtdXRhdGlvbnMgPSBwZXJtdXRhdGlvbnM7Ci0JZm9yIChrID0gMDsgayA8IGxMYXN0Q29sdW07ICsraykgewotCQlwID0gMC4wOwotCi0JCS8qIHRha2UgdGhlIG1pZGRsZSBlbGVtZW50ICovCi0JCWxDb2x1bW5NYXRyaXggPSBsVG1wTWF0cml4ICsgazsKLQkJCi0JCS8qIG1ha2UgcGVybXV0YXRpb24gd2l0aCB0aGUgYmlnZ2VzdCB2YWx1ZSBpbiB0aGUgY29sdW1uICovCi0gICAgICAgIGZvciAoaSA9IGs7IGkgPCBuYl9jb21wbzsgKytpKSB7Ci0JCQl0ZW1wID0gKCgqbENvbHVtbk1hdHJpeCA+IDApID8gKmxDb2x1bW5NYXRyaXggOiAtKCpsQ29sdW1uTWF0cml4KSk7Ci0gICAgIAkJaWYgKHRlbXAgPiBwKSB7Ci0gICAgIAkJCXAgPSB0ZW1wOwotICAgICAJCQlrMiA9IGk7Ci0gICAgIAkJfQotCQkJLyogbmV4dCBsaW5lICovCi0JCQlsQ29sdW1uTWF0cml4ICs9IG5iX2NvbXBvOwotICAgICAJfQotCi0gICAgIAkvKiBhIHdob2xlIHJlc3Qgb2YgMCAtPiBub24gc2luZ3VsYXIgKi8KLSAgICAgCWlmIChwID09IDAuMCkgewotICAgIAkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCi0JCS8qIHNob3VsZCB3ZSBwZXJtdXRlID8gKi8KLQkJaWYgKGsyICE9IGspIHsKLQkJCS8qZXhjaGFuZ2Ugb2YgbGluZSAqLwotICAgICAJCS8qIGsyID4gayAqLwotCQkJZHN0UGVybXV0YXRpb25zID0gdG1wUGVybXV0YXRpb25zICsgazIgLSBrOwotCQkJLyogc3dhcCBpbmRpY2VzICovCi0JCQl0ID0gKnRtcFBlcm11dGF0aW9uczsKLSAgICAgCQkqdG1wUGVybXV0YXRpb25zID0gKmRzdFBlcm11dGF0aW9uczsKLSAgICAgCQkqZHN0UGVybXV0YXRpb25zID0gdDsKLQotCQkJLyogYW5kIHN3YXAgZW50aXJlIGxpbmUuICovCi0JCQlsQ29sdW1uTWF0cml4ID0gbFRtcE1hdHJpeCArIChrMiAtIGspICogbmJfY29tcG87Ci0JCQltZW1jcHkocF9zd2FwX2FyZWEsbENvbHVtbk1hdHJpeCxsU3dhcFNpemUpOwotCQkJbWVtY3B5KGxDb2x1bW5NYXRyaXgsbFRtcE1hdHJpeCxsU3dhcFNpemUpOwotCQkJbWVtY3B5KGxUbXBNYXRyaXgscF9zd2FwX2FyZWEsbFN3YXBTaXplKTsKLQkJfQotCi0JCS8qIG5vdyB1cGRhdGUgZGF0YSBpbiB0aGUgcmVzdCBvZiB0aGUgbGluZSBhbmQgbGluZSBhZnRlciAqLwotCQlsRGVzdE1hdHJpeCA9IGxUbXBNYXRyaXggKyBrOwotCQlsQ29sdW1uTWF0cml4ID0gbERlc3RNYXRyaXggKyBuYl9jb21wbzsKLQkJLyogdGFrZSB0aGUgbWlkZGxlIGVsZW1lbnQgKi8KLQkJdGVtcCA9ICoobERlc3RNYXRyaXgrKyk7Ci0KLQkJLyogbm93IGNvbXB1dGUgdXAgZGF0YSAoaS5lLiBjb2VmZiB1cCBvZiB0aGUgZGlhZ29uYWwpLiAqLwotICAgICAJZm9yIChpID0gb2Zmc2V0OyBpIDwgbmJfY29tcG87ICsraSkgIHsKLQkJCS8qbENvbHVtbk1hdHJpeDsgKi8KLQkJCS8qIGRpdmlkZSB0aGUgbG93ZXIgY29sdW1uIGVsZW1lbnRzIGJ5IHRoZSBkaWFnb25hbCB2YWx1ZSAqLwotCi0JCQkvKiBtYXRyaXhbaV1ba10gLz0gbWF0cml4W2tdW2tdOyAqLwotICAgICAJCS8qIHAgPSBtYXRyaXhbaV1ba10gKi8KLQkJCXAgPSAqbENvbHVtbk1hdHJpeCAvIHRlbXA7Ci0JCQkqKGxDb2x1bW5NYXRyaXgrKykgPSBwOwotICAgICAJCQotICAgICAgICAgICAgZm9yIChqID0gLyogayArIDEgKi8gb2Zmc2V0OyBqIDwgbmJfY29tcG87ICsraikgewotCQkJCS8qIG1hdHJpeFtpXVtqXSAtPSBtYXRyaXhbaV1ba10gKiBtYXRyaXhba11bal07ICovCi0gICAgIAkJCSoobENvbHVtbk1hdHJpeCsrKSAtPSBwICogKCoobERlc3RNYXRyaXgrKykpOwotCQkJfQotCQkJLyogY29tZSBiYWNrIHRvIHRoZSBrKzF0aCBlbGVtZW50ICovCi0JCQlsRGVzdE1hdHJpeCAtPSBsU3RyaWRlOwotCQkJLyogZ28gdG8ga3RoIGVsZW1lbnQgb2YgdGhlIG5leHQgbGluZSAqLwotCQkJbENvbHVtbk1hdHJpeCArPSBrOwotICAgICAJfQotCi0JCS8qIG9mZnNldCBpcyBub3cgaysyICovCi0JCSsrb2Zmc2V0OwotCQkvKiAxIGVsZW1lbnQgbGVzcyBmb3Igc3RyaWRlICovCi0JCS0tbFN0cmlkZTsKLQkJLyogbmV4dCBsaW5lICovCi0JCWxUbXBNYXRyaXgrPW5iX2NvbXBvOwotCQkvKiBuZXh0IHBlcm11dGF0aW9uIGVsZW1lbnQgKi8KLQkJKyt0bXBQZXJtdXRhdGlvbnM7Ci0JfQotICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLSAgIAkJCi12b2lkIG9wal9sdXBTb2x2ZSAoT1BKX0ZMT0FUMzIgKiBwUmVzdWx0LCAKLSAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiAqIHBNYXRyaXgsIAotICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcFZlY3RvciwgCi0gICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiogcFBlcm11dGF0aW9ucywgCi0gICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBuYl9jb21wbyxPUEpfRkxPQVQzMiAqIHBfaW50ZXJtZWRpYXRlX2RhdGEpIAotewotCU9QSl9JTlQzMiBrOwotICAgIE9QSl9VSU5UMzIgaSxqOwotCU9QSl9GTE9BVDMyIHN1bTsKLQlPUEpfRkxPQVQzMiB1OwotICAgIE9QSl9VSU5UMzIgbFN0cmlkZSA9IG5iX2NvbXBvKzE7Ci0JT1BKX0ZMT0FUMzIgKiBsQ3VycmVudFB0cjsKLQlPUEpfRkxPQVQzMiAqIGxJbnRlcm1lZGlhdGVQdHI7Ci0JT1BKX0ZMT0FUMzIgKiBsRGVzdFB0cjsKLQlPUEpfRkxPQVQzMiAqIGxUbXBNYXRyaXg7Ci0JT1BKX0ZMT0FUMzIgKiBsTGluZU1hdHJpeCA9IHBNYXRyaXg7Ci0JT1BKX0ZMT0FUMzIgKiBsQmVnaW5QdHIgPSBwUmVzdWx0ICsgbmJfY29tcG8gLSAxOwotCU9QSl9GTE9BVDMyICogbEdlbmVyYXRlZERhdGE7Ci0JT1BKX1VJTlQzMiAqIGxDdXJyZW50UGVybXV0YXRpb25QdHIgPSBwUGVybXV0YXRpb25zOwotCi0JCi0JbEludGVybWVkaWF0ZVB0ciA9IHBfaW50ZXJtZWRpYXRlX2RhdGE7Ci0JbEdlbmVyYXRlZERhdGEgPSBwX2ludGVybWVkaWF0ZV9kYXRhICsgbmJfY29tcG8gLSAxOwotCQotICAgIGZvciAoaSA9IDA7IGkgPCBuYl9jb21wbzsgKytpKSB7Ci0gICAgICAgCXN1bSA9IDAuMDsKLQkJbEN1cnJlbnRQdHIgPSBwX2ludGVybWVkaWF0ZV9kYXRhOwotCQlsVG1wTWF0cml4ID0gbExpbmVNYXRyaXg7Ci0gICAgICAgIGZvciAoaiA9IDE7IGogPD0gaTsgKytqKSAKLQkJewotCQkJLyogc3VtICs9IG1hdHJpeFtpXVtqLTFdICogeVtqLTFdOyAqLwotICAgICAgICAJc3VtICs9ICgqKGxUbXBNYXRyaXgrKykpICogKCoobEN1cnJlbnRQdHIrKykpOwotICAgICAgICB9Ci0JCS8qeVtpXSA9IHBWZWN0b3JbcFBlcm11dGF0aW9uc1tpXV0gLSBzdW07ICovCi0gICAgICAgICoobEludGVybWVkaWF0ZVB0cisrKSA9IHBWZWN0b3JbKihsQ3VycmVudFBlcm11dGF0aW9uUHRyKyspXSAtIHN1bTsKLQkJbExpbmVNYXRyaXggKz0gbmJfY29tcG87Ci0JfQotCi0JLyogd2UgdGFrZSB0aGUgbGFzdCBwb2ludCBvZiB0aGUgbWF0cml4ICovCi0JbExpbmVNYXRyaXggPSBwTWF0cml4ICsgbmJfY29tcG8qbmJfY29tcG8gLSAxOwotCi0JLyogYW5kIHdlIHRha2UgYWZ0ZXIgdGhlIGxhc3QgcG9pbnQgb2YgdGhlIGRlc3RpbmF0aW9uIHZlY3RvciAqLwotCWxEZXN0UHRyID0gcFJlc3VsdCArIG5iX2NvbXBvOwotCi0KLSAgICBhc3NlcnQobmJfY29tcG8gIT0gMCk7Ci0JZm9yIChrID0gKE9QSl9JTlQzMiluYl9jb21wbyAtIDE7IGsgIT0gLTEgOyAtLWspIHsKLQkJc3VtID0gMC4wOwotCQlsVG1wTWF0cml4ID0gbExpbmVNYXRyaXg7Ci0gICAgICAgIHUgPSAqKGxUbXBNYXRyaXgrKyk7Ci0JCWxDdXJyZW50UHRyID0gbERlc3RQdHItLTsKLSAgICAgICAgZm9yIChqID0gKE9QSl9VSU5UMzIpKGsgKyAxKTsgaiA8IG5iX2NvbXBvOyArK2opIHsKLQkJCS8qIHN1bSArPSBtYXRyaXhba11bal0gKiB4W2pdICovCi0gICAgICAgIAlzdW0gKz0gKCoobFRtcE1hdHJpeCsrKSkgKiAoKihsQ3VycmVudFB0cisrKSk7Ci0JCX0KLQkJLyp4W2tdID0gKHlba10gLSBzdW0pIC8gdTsgKi8KLSAgICAgICAgKihsQmVnaW5QdHItLSkgPSAoKihsR2VuZXJhdGVkRGF0YS0tKSAtIHN1bSkgLyB1OwotCQlsTGluZU1hdHJpeCAtPSBsU3RyaWRlOwotCX0KLX0KLSAgICAKLQotdm9pZCBvcGpfbHVwSW52ZXJ0IChPUEpfRkxPQVQzMiAqIHBTcmNNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcERlc3RNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbmJfY29tcG8sCi0gICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwUGVybXV0YXRpb25zLAotICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiAqIHBfc3JjX3RlbXAsCi0gICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcF9kZXN0X3RlbXAsCi0gICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcF9zd2FwX2FyZWEgKQotewotCU9QSl9VSU5UMzIgaixpOwotCU9QSl9GTE9BVDMyICogbEN1cnJlbnRQdHI7Ci0JT1BKX0ZMT0FUMzIgKiBsTGluZU1hdHJpeCA9IHBEZXN0TWF0cml4OwotCU9QSl9VSU5UMzIgbFN3YXBTaXplID0gbmJfY29tcG8gKiAoT1BKX1VJTlQzMilzaXplb2YoT1BKX0ZMT0FUMzIpOwotCi0JZm9yIChqID0gMDsgaiA8IG5iX2NvbXBvOyArK2opIHsKLQkJbEN1cnJlbnRQdHIgPSBsTGluZU1hdHJpeCsrOwotICAgICAgICBtZW1zZXQocF9zcmNfdGVtcCwwLGxTd2FwU2l6ZSk7Ci0gICAgCXBfc3JjX3RlbXBbal0gPSAxLjA7Ci0JCW9wal9sdXBTb2x2ZShwX2Rlc3RfdGVtcCxwU3JjTWF0cml4LHBfc3JjX3RlbXAsIHBQZXJtdXRhdGlvbnMsIG5iX2NvbXBvICwgcF9zd2FwX2FyZWEpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBuYl9jb21wbzsgKytpKSB7Ci0gICAgCQkqKGxDdXJyZW50UHRyKSA9IHBfZGVzdF90ZW1wW2ldOwotCQkJbEN1cnJlbnRQdHIrPW5iX2NvbXBvOwotICAgIAl9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvajJrLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvajJrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNGJjNTguLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL2oyay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2MTYgKzAsMCBAQAotLyoKLSAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzIAotICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIAotICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cwotICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBVbml2ZXJzaXRlIGNhdGhvbGlxdWUgZGUgTG91dmFpbiAoVUNMKSwgQmVsZ2l1bQotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFByb2Zlc3NvciBCZW5vaXQgTWFjcQotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMsIERhdmlkIEphbnNzZW5zCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgWWFubmljayBWZXJzY2h1ZXJlbgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4IAotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTQsIEFudG9uaW4gRGVzY2FtcGUKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQotICogQ29weXJpZ2h0IChjKSAyMDA4LCBKZXJvbWUgRmltZXMsIENvbW11bmljYXRpb25zICYgU3lzdGVtZXMgPGplcm9tZS5maW1lc0BjLXMuZnI+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNywgUGFydmF0aGEgRWxhbmdvdmFuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgS2FvcmkgSGFnaWhhcmEKLSAqIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCBDZW50cmUgTmF0aW9uYWwgZCdFdHVkZXMgU3BhdGlhbGVzIChDTkVTKSwgRnJhbmNlIAotICogQ29weXJpZ2h0IChjKSAyMDEyLCBDUyBTeXN0ZW1lcyBkJ0luZm9ybWF0aW9uLCBGcmFuY2UKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgQVMgSVMnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQotICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgIm9wal9pbmNsdWRlcy5oIgotCi0vKiogQGRlZmdyb3VwIEoySyBKMksgLSBKUEVHLTIwMDAgY29kZXN0cmVhbSByZWFkZXIvd3JpdGVyICovCi0vKkB7Ki8KLQotLyoqIEBuYW1lIExvY2FsIHN0YXRpYyBmdW5jdGlvbnMgKi8KLS8qQHsqLwotCi0vKioKLSAqIFNldHMgdXAgdGhlIHByb2NlZHVyZXMgdG8gZG8gb24gcmVhZGluZyBoZWFkZXIuIERldmVsb3BwZXJzIHdhbnRpbmcgdG8gZXh0ZW5kIHRoZSBsaWJyYXJ5IGNhbiBhZGQgdGhlaXIgb3duIHJlYWRpbmcgcHJvY2VkdXJlcy4KLSAqLwotc3RhdGljIHZvaWQgb3BqX2oya19zZXR1cF9oZWFkZXJfcmVhZGluZyAob3BqX2oya190ICpwX2oyayk7Ci0KLS8qKgotICogVGhlIHJlYWQgaGVhZGVyIHByb2NlZHVyZS4KLSAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9oZWFkZXJfcHJvY2VkdXJlKCAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgZW5jb2RpbmcgdmFsaWRhdGlvbiBwcm9jZWR1cmUgd2l0aG91dCBhbnkgZXh0ZW5zaW9uLgotICoKLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMgdG8gdmFsaWRhdGUuCi0gKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgICAgICAgICAgdGhlIGlucHV0IHN0cmVhbSB0byB2YWxpZGF0ZS4KLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotICoKLSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGFyYW1ldGVycyBhcmUgY29ycmVjdC4KLSAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfZW5jb2RpbmdfdmFsaWRhdGlvbiAoICAgb3BqX2oya190ICogcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBkZWNvZGluZyB2YWxpZGF0aW9uIHByb2NlZHVyZSB3aXRob3V0IGFueSBleHRlbnNpb24uCi0gKgotICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYyB0byB2YWxpZGF0ZS4KLSAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGlucHV0IHN0cmVhbSB0byB2YWxpZGF0ZS4KLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotICoKLSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGFyYW1ldGVycyBhcmUgY29ycmVjdC4KLSAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfZGVjb2RpbmdfdmFsaWRhdGlvbiAoICAgb3BqX2oya190ICogcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotLyoqCi0gKiBTZXRzIHVwIHRoZSB2YWxpZGF0aW9uICxpLmUuIGFkZHMgdGhlIHByb2NlZHVyZXMgdG8gbGF1Y2ggdG8gbWFrZSBzdXJlIHRoZSBjb2RlYyBwYXJhbWV0ZXJzCi0gKiBhcmUgdmFsaWQuIERldmVsb3BwZXJzIHdhbnRpbmcgdG8gZXh0ZW5kIHRoZSBsaWJyYXJ5IGNhbiBhZGQgdGhlaXIgb3duIHZhbGlkYXRpb24gcHJvY2VkdXJlcy4KLSAqLwotc3RhdGljIHZvaWQgb3BqX2oya19zZXR1cF9lbmNvZGluZ192YWxpZGF0aW9uIChvcGpfajJrX3QgKnBfajJrKTsKLQotLyoqCi0gKiBTZXRzIHVwIHRoZSB2YWxpZGF0aW9uICxpLmUuIGFkZHMgdGhlIHByb2NlZHVyZXMgdG8gbGF1Y2ggdG8gbWFrZSBzdXJlIHRoZSBjb2RlYyBwYXJhbWV0ZXJzCi0gKiBhcmUgdmFsaWQuIERldmVsb3BwZXJzIHdhbnRpbmcgdG8gZXh0ZW5kIHRoZSBsaWJyYXJ5IGNhbiBhZGQgdGhlaXIgb3duIHZhbGlkYXRpb24gcHJvY2VkdXJlcy4KLSAqLwotc3RhdGljIHZvaWQgb3BqX2oya19zZXR1cF9kZWNvZGluZ192YWxpZGF0aW9uIChvcGpfajJrX3QgKnBfajJrKTsKLQotLyoqCi0gKiBTZXRzIHVwIHRoZSB2YWxpZGF0aW9uICxpLmUuIGFkZHMgdGhlIHByb2NlZHVyZXMgdG8gbGF1Y2ggdG8gbWFrZSBzdXJlIHRoZSBjb2RlYyBwYXJhbWV0ZXJzCi0gKiBhcmUgdmFsaWQuIERldmVsb3BwZXJzIHdhbnRpbmcgdG8gZXh0ZW5kIHRoZSBsaWJyYXJ5IGNhbiBhZGQgdGhlaXIgb3duIHZhbGlkYXRpb24gcHJvY2VkdXJlcy4KLSAqLwotc3RhdGljIHZvaWQgb3BqX2oya19zZXR1cF9lbmRfY29tcHJlc3MgKG9wal9qMmtfdCAqcF9qMmspOwotCi0vKioKLSAqIFRoZSBtY3QgZW5jb2RpbmcgdmFsaWRhdGlvbiBwcm9jZWR1cmUuCi0gKgotICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYyB0byB2YWxpZGF0ZS4KLSAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGlucHV0IHN0cmVhbSB0byB2YWxpZGF0ZS4KLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotICoKLSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGFyYW1ldGVycyBhcmUgY29ycmVjdC4KLSAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfbWN0X3ZhbGlkYXRpb24gKG9wal9qMmtfdCAqIHBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotLyoqCi0gKiBCdWlsZHMgdGhlIHRjZCBkZWNvZGVyIHRvIHVzZSB0byBkZWNvZGUgdGlsZS4KLSAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfYnVpbGRfZGVjb2RlciAoIG9wal9qMmtfdCAqIHBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLS8qKgotICogQnVpbGRzIHRoZSB0Y2QgZW5jb2RlciB0byB1c2UgdG8gZW5jb2RlIHRpbGUuCi0gKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2J1aWxkX2VuY29kZXIgKCBvcGpfajJrX3QgKiBwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLS8qKgotICogQ3JlYXRlcyBhIHRpbGUtY29kZXIgZGVjb2Rlci4KLSAqCi0gKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfY3JlYXRlX3RjZCggICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLS8qKgotICogRXhjdXRlcyB0aGUgZ2l2ZW4gcHJvY2VkdXJlcyBvbiB0aGUgZ2l2ZW4gY29kZWMuCi0gKgotICogQHBhcmFtICAgICAgIHBfcHJvY2VkdXJlX2xpc3QgICAgICAgIHRoZSBsaXN0IG9mIHByb2NlZHVyZXMgdG8gZXhlY3V0ZQotICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjIHRvIGV4ZWN1dGUgdGhlIHByb2NlZHVyZXMgb24uCi0gKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3RyZWFtIHRvIGV4ZWN1dGUgdGhlIHByb2NlZHVyZXMgb24uCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgICAgICAgICB0aGUgdXNlciBtYW5hZ2VyLgotICoKLSAqIEByZXR1cm4gICAgICB0cnVlICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGFsbCB0aGUgcHJvY2VkdXJlcyB3ZXJlIHN1Y2Nlc3NmdWxseSBleGVjdXRlZC4KLSAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfZXhlYyAoICBvcGpfajJrX3QgKiBwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcHJvY2VkdXJlX2xpc3RfdCAqIHBfcHJvY2VkdXJlX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7Ci0KLS8qKgotICogVXBkYXRlcyB0aGUgcmF0ZXMgb2YgdGhlIHRjcC4KLSAqCi0gKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICAgICAgICAgIEoySyBjb2RlYy4KLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3VwZGF0ZV9yYXRlcyggICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotLyoqCi0gKiBDb3BpZXMgdGhlIGRlY29kaW5nIHRpbGUgcGFyYW1ldGVycyBvbnRvIGFsbCB0aGUgdGlsZSBwYXJhbWV0ZXJzLgotICogQ3JlYXRlcyBhbHNvIHRoZSB0aWxlIGRlY29kZXIuCi0gKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2NvcHlfZGVmYXVsdF90Y3BfYW5kX2NyZWF0ZV90Y2QgKCAgICAgICBvcGpfajJrX3QgKiBwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotCi0vKioKLSAqIERlc3Ryb3lzIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWNvZGluZyBvZiBoZWFkZXJzLgotICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19kZXN0cm95X2hlYWRlcl9tZW1vcnkgKCBvcGpfajJrX3QgKiBwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotCi0vKioKLSAqIFJlYWRzIHRoZSBsb29rdXAgdGFibGUgY29udGFpbmluZyBhbGwgdGhlIG1hcmtlciwgc3RhdHVzIGFuZCBhY3Rpb24sIGFuZCByZXR1cm5zIHRoZSBoYW5kbGVyIGFzc29jaWF0ZWQKLSAqIHdpdGggdGhlIG1hcmtlciB2YWx1ZS4KLSAqIEBwYXJhbSAgICAgICBwX2lkICAgICAgICAgICAgTWFya2VyIHZhbHVlIHRvIGxvb2sgdXAKLSAqCi0gKiBAcmV0dXJuICAgICAgdGhlIGhhbmRsZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBpZC4KLSovCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9wal9kZWNfbWVtb3J5X21hcmtlcl9oYW5kbGVyICogb3BqX2oya19nZXRfbWFya2VyX2hhbmRsZXIgKE9QSl9VSU5UMzIgcF9pZCk7Ci0KLS8qKgotICogRGVzdHJveXMgYSB0aWxlIGNvZGluZyBwYXJhbWV0ZXIgc3RydWN0dXJlLgotICoKLSAqIEBwYXJhbSAgICAgICBwX3RjcCAgICAgICAgICAgdGhlIHRpbGUgY29kaW5nIHBhcmFtZXRlciB0byBkZXN0cm95LgotICovCi1zdGF0aWMgdm9pZCBvcGpfajJrX3RjcF9kZXN0cm95IChvcGpfdGNwX3QgKnBfdGNwKTsKLQotLyoqCi0gKiBEZXN0cm95cyB0aGUgZGF0YSBpbnNpZGUgYSB0aWxlIGNvZGluZyBwYXJhbWV0ZXIgc3RydWN0dXJlLgotICoKLSAqIEBwYXJhbSAgICAgICBwX3RjcCAgICAgICAgICAgdGhlIHRpbGUgY29kaW5nIHBhcmFtZXRlciB3aGljaCBjb250YWluIGRhdGEgdG8gZGVzdHJveS4KLSAqLwotc3RhdGljIHZvaWQgb3BqX2oya190Y3BfZGF0YV9kZXN0cm95IChvcGpfdGNwX3QgKnBfdGNwKTsKLQotLyoqCi0gKiBEZXN0cm95cyBhIGNvZGluZyBwYXJhbWV0ZXIgc3RydWN0dXJlLgotICoKLSAqIEBwYXJhbSAgICAgICBwX2NwICAgICAgICAgICAgdGhlIGNvZGluZyBwYXJhbWV0ZXIgdG8gZGVzdHJveS4KLSAqLwotc3RhdGljIHZvaWQgb3BqX2oya19jcF9kZXN0cm95IChvcGpfY3BfdCAqcF9jcCk7Ci0KLS8qKgotICogV3JpdGVzIGEgU1BDb2Qgb3IgU1BDb2MgZWxlbWVudCwgaS5lLiB0aGUgY29kaW5nIHN0eWxlIG9mIGEgZ2l2ZW4gY29tcG9uZW50IG9mIGEgdGlsZS4KLSAqCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgIEoySyBjb2RlYy4KLSAqIEBwYXJhbSAgICAgICBwX3RpbGVfbm8gICAgICAgRklYTUUgRE9DCi0gKiBAcGFyYW0gICAgICAgcF9jb21wX25vICAgICAgIHRoZSBjb21wb25lbnQgbnVtYmVyIHRvIG91dHB1dC4KLSAqIEBwYXJhbSAgICAgICBwX2RhdGEgICAgICAgICAgRklYTUUgRE9DCi0gKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIEZJWE1FIERPQwotICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotICoKLSAqIEByZXR1cm4gRklYTUUgRE9DCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfU1BDb2RfU1BDb2MoICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX25vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLS8qKgotICogR2V0cyB0aGUgc2l6ZSB0YWtlbiBieSB3cml0aW5nIGEgU1BDb2Qgb3IgU1BDb2MgZm9yIHRoZSBnaXZlbiB0aWxlIGFuZCBjb21wb25lbnQuCi0gKgotICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIHRoZSBKMksgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF90aWxlX25vICAgICAgICAgICAgICAgdGhlIHRpbGUgaW5kZXguCi0gKiBAcGFyYW0gICAgICAgcF9jb21wX25vICAgICAgICAgICAgICAgdGhlIGNvbXBvbmVudCBiZWluZyBvdXRwdXR0ZWQuCi0gKgotICogQHJldHVybiAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGFrZW4gYnkgdGhlIFNQQ29kIGVsZW1lbnQuCi0gKi8KLXN0YXRpYyBPUEpfVUlOVDMyIG9wal9qMmtfZ2V0X1NQQ29kX1NQQ29jX3NpemUgKG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX25vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29tcF9ubyApOwotCi0vKioKLSAqIFJlYWRzIGEgU1BDb2Qgb3IgU1BDb2MgZWxlbWVudCwgaS5lLiB0aGUgY29kaW5nIHN0eWxlIG9mIGEgZ2l2ZW4gY29tcG9uZW50IG9mIGEgdGlsZS4KLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgotICogQHBhcmFtICAgICAgIGNvbXBubyAgICAgICAgICBGSVhNRSBET0MKLSAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9kYXRhICAgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBDT00gYm94LgotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENPTSBtYXJrZXIuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9TUENvZF9TUENvYyggICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNvbXBubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLS8qKgotICogR2V0cyB0aGUgc2l6ZSB0YWtlbiBieSB3cml0aW5nIFNRY2Qgb3IgU1FjYyBlbGVtZW50LCBpLmUuIHRoZSBxdWFudGl6YXRpb24gdmFsdWVzIG9mIGEgYmFuZCBpbiB0aGUgUUNEIG9yIFFDQy4KLSAqCi0gKiBAcGFyYW0gICAgICAgcF90aWxlX25vICAgICAgICAgICAgICAgdGhlIHRpbGUgaW5kZXguCi0gKiBAcGFyYW0gICAgICAgcF9jb21wX25vICAgICAgICAgICAgICAgdGhlIGNvbXBvbmVudCBiZWluZyBvdXRwdXR0ZWQuCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIEoySyBjb2RlYy4KLSAqCi0gKiBAcmV0dXJuICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0YWtlbiBieSB0aGUgU1BDb2QgZWxlbWVudC4KLSAqLwotc3RhdGljIE9QSl9VSU5UMzIgb3BqX2oya19nZXRfU1FjZF9TUWNjX3NpemUgKCAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX25vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8gKTsKLQotLyoqCi0gKiBXcml0ZXMgYSBTUWNkIG9yIFNRY2MgZWxlbWVudCwgaS5lLiB0aGUgcXVhbnRpemF0aW9uIHZhbHVlcyBvZiBhIGJhbmQgaW4gdGhlIFFDRCBvciBRQ0MuCi0gKgotICogQHBhcmFtICAgICAgIHBfdGlsZV9ubyAgICAgICAgICAgICAgIHRoZSB0aWxlIHRvIG91dHB1dC4KLSAqIEBwYXJhbSAgICAgICBwX2NvbXBfbm8gICAgICAgICAgICAgICB0aGUgY29tcG9uZW50IG51bWJlciB0byBvdXRwdXQuCi0gKiBAcGFyYW0gICAgICAgcF9kYXRhICAgICAgICAgICAgICAgICAgdGhlIGRhdGEgYnVmZmVyLgotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICBwb2ludGVyIHRvIHRoZSBzaXplIG9mIHRoZSBkYXRhIGJ1ZmZlciwgaXQgaXMgY2hhbmdlZCBieSB0aGUgZnVuY3Rpb24uCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgSjJLIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0gKgotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX1NRY2RfU1FjYyhvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX25vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7Ci0KLS8qKgotICogVXBkYXRlcyB0aGUgVGlsZSBMZW5ndGggTWFya2VyLgotICovCi1zdGF0aWMgdm9pZCBvcGpfajJrX3VwZGF0ZV90bG0gKCBvcGpfajJrX3QgKiBwX2oyaywgT1BKX1VJTlQzMiBwX3RpbGVfcGFydF9zaXplKTsKLQotLyoqCi0gKiBSZWFkcyBhIFNRY2Qgb3IgU1FjYyBlbGVtZW50LCBpLmUuIHRoZSBxdWFudGl6YXRpb24gdmFsdWVzIG9mIGEgYmFuZCBpbiB0aGUgUUNEIG9yIFFDQy4KLSAqCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgIEoySyBjb2RlYy4KLSAqIEBwYXJhbSAgICAgICBjb21wbm8gICAgICAgICAgdGhlIGNvbXBvbmVudCBudW1iZXIgdG8gb3V0cHV0LgotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBidWZmZXIuCi0gKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHBvaW50ZXIgdG8gdGhlIHNpemUgb2YgdGhlIGRhdGEgYnVmZmVyLCBpdCBpcyBjaGFuZ2VkIGJ5IHRoZSBmdW5jdGlvbi4KLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSAqCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9TUWNkX1NRY2MoIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBjb21wbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotCi0vKioKLSAqIENvcGllcyB0aGUgdGlsZSBjb21wb25lbnQgcGFyYW1ldGVycyBvZiBhbGwgdGhlIGNvbXBvbmVudCBmcm9tIHRoZSBmaXJzdCB0aWxlIGNvbXBvbmVudC4KLSAqCi0gKiBAcGFyYW0gICAgICAgICAgICAgICBwX2oyayAgICAgICAgICAgdGhlIEoyayBjb2RlYy4KLSAqLwotc3RhdGljIHZvaWQgb3BqX2oya19jb3B5X3RpbGVfY29tcG9uZW50X3BhcmFtZXRlcnMoIG9wal9qMmtfdCAqcF9qMmsgKTsKLQotLyoqCi0gKiBDb3BpZXMgdGhlIHRpbGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlcnMgb2YgYWxsIHRoZSBjb21wb25lbnQgZnJvbSB0aGUgZmlyc3QgdGlsZSBjb21wb25lbnQuCi0gKgotICogQHBhcmFtICAgICAgICAgICAgICAgcF9qMmsgICAgICAgICAgIHRoZSBKMmsgY29kZWMuCi0gKi8KLXN0YXRpYyB2b2lkIG9wal9qMmtfY29weV90aWxlX3F1YW50aXphdGlvbl9wYXJhbWV0ZXJzKCBvcGpfajJrX3QgKnBfajJrICk7Ci0KLS8qKgotICogUmVhZHMgdGhlIHRpbGVzLgotICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19kZWNvZGVfdGlsZXMgKCAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKLQotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcHJlX3dyaXRlX3RpbGUgKCBvcGpfajJrX3QgKiBwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3VwZGF0ZV9pbWFnZV9kYXRhIChvcGpfdGNkX3QgKiBwX3RjZCwgT1BKX0JZVEUgKiBwX2RhdGEsIG9wal9pbWFnZV90KiBwX291dHB1dF9pbWFnZSk7Ci0KLXN0YXRpYyB2b2lkIG9wal9nZXRfdGlsZV9kaW1lbnNpb25zKG9wal9pbWFnZV90ICogbF9pbWFnZSwKLQkJCQkJCQkJCQkJCQkJCQkJCW9wal90Y2RfdGlsZWNvbXBfdCAqIGxfdGlsZWMsCi0JCQkJCQkJCQkJCQkJCQkJCQlvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCwKLQkJCQkJCQkJCQkJCQkJCQkJCU9QSl9VSU5UMzIqIGxfc2l6ZV9jb21wLAotCQkJCQkJCQkJCQkJCQkJCQkJT1BKX1VJTlQzMiogbF93aWR0aCwKLQkJCQkJCQkJCQkJCQkJCQkJCU9QSl9VSU5UMzIqIGxfaGVpZ2h0LAotCQkJCQkJCQkJCQkJCQkJCQkJT1BKX1VJTlQzMiogbF9vZmZzZXRfeCwKLQkJCQkJCQkJCQkJCQkJCQkJCU9QSl9VSU5UMzIqIGxfb2Zmc2V0X3ksCi0JCQkJCQkJCQkJCQkJCQkJCQlPUEpfVUlOVDMyKiBsX2ltYWdlX3dpZHRoLAotCQkJCQkJCQkJCQkJCQkJCQkJT1BKX1VJTlQzMiogbF9zdHJpZGUsCi0JCQkJCQkJCQkJCQkJCQkJCQlPUEpfVUlOVDMyKiBsX3RpbGVfb2Zmc2V0KTsKLQotc3RhdGljIHZvaWQgb3BqX2oya19nZXRfdGlsZV9kYXRhIChvcGpfdGNkX3QgKiBwX3RjZCwgT1BKX0JZVEUgKiBwX2RhdGEpOwotCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19wb3N0X3dyaXRlX3RpbGUgKG9wal9qMmtfdCAqIHBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotCi0vKioKLSAqIFNldHMgdXAgdGhlIHByb2NlZHVyZXMgdG8gZG8gb24gd3JpdGluZyBoZWFkZXIuCi0gKiBEZXZlbG9wZXJzIHdhbnRpbmcgdG8gZXh0ZW5kIHRoZSBsaWJyYXJ5IGNhbiBhZGQgdGhlaXIgb3duIHdyaXRpbmcgcHJvY2VkdXJlcy4KLSAqLwotc3RhdGljIHZvaWQgb3BqX2oya19zZXR1cF9oZWFkZXJfd3JpdGluZyAob3BqX2oya190ICpwX2oyayk7Ci0KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2ZpcnN0X3RpbGVfcGFydCggIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90b3RhbF9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIgKTsKLQotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfYWxsX3RpbGVfcGFydHMoICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RvdGFsX2RhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlciApOwotCi0vKioKLSAqIEdldHMgdGhlIG9mZnNldCBvZiB0aGUgaGVhZGVyLgotICoKLSAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgSjJLIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfZ2V0X2VuZF9oZWFkZXIoIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19hbGxvY2F0ZV90aWxlX2VsZW1lbnRfY3N0cl9pbmRleChvcGpfajJrX3QgKnBfajJrKTsKLQotLyoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0vKioKLSAqIFdyaXRlcyB0aGUgU09DIG1hcmtlciAoU3RhcnQgT2YgQ29kZXN0cmVhbSkKLSAqCi0gKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgSjJLIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX3NvYyggICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotLyoqCi0gKiBSZWFkcyBhIFNPQyBtYXJrZXIgKFN0YXJ0IG9mIENvZGVzdHJlYW0pCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgIHRoZSBqcGVnMjAwMCBmaWxlIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICBYWFggbmVlZHMgZGF0YQotICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfc29jKCAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotLyoqCi0gKiBXcml0ZXMgdGhlIFNJWiBtYXJrZXIgKGltYWdlIGFuZCB0aWxlIHNpemUpCi0gKgotICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICBKMksgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9zaXooICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLS8qKgotICogUmVhZHMgYSBTSVogbWFya2VyIChpbWFnZSBhbmQgdGlsZSBzaXplKQotICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICB0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KLSAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9kYXRhICAgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBTSVogYm94LgotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFNJWiBtYXJrZXIuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9zaXoob3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7Ci0KLS8qKgotICogV3JpdGVzIHRoZSBDT00gbWFya2VyIChjb21tZW50KQotICoKLSAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfY29tKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotLyoqCi0gKiBSZWFkcyBhIENPTSBtYXJrZXIgKGNvbW1lbnRzKQotICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICB0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KLSAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9kYXRhICAgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBDT00gYm94LgotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENPTSBtYXJrZXIuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9jb20gKCAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotLyoqCi0gKiBXcml0ZXMgdGhlIENPRCBtYXJrZXIgKENvZGluZyBzdHlsZSBkZWZhdWx0KQotICoKLSAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfY29kKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotLyoqCi0gKiBSZWFkcyBhIENPRCBtYXJrZXIgKENvZGluZyBTdHlrZSBkZWZhdWx0cykKLSAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9kYXRhICAgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBDT0QgYm94LgotICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KLSAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBDT0QgbWFya2VyLgotICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9jb2QgKCAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7Ci0KLSNpZiAwCi0vKioKLSAqIFdyaXRlcyB0aGUgQ09DIG1hcmtlciAoQ29kaW5nIHN0eWxlIGNvbXBvbmVudCkKLSAqCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgSjJLIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfY29tcF9ubyAgIHRoZSBpbmRleCBvZiB0aGUgY29tcG9uZW50IHRvIG91dHB1dC4KLSAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9jb2MoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLSNlbmRpZgotCi0jaWYgMAotLyoqCi0gKiBXcml0ZXMgdGhlIENPQyBtYXJrZXIgKENvZGluZyBzdHlsZSBjb21wb25lbnQpCi0gKgotICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIEoySyBjb2RlYy4KLSAqIEBwYXJhbSAgICAgICBwX2NvbXBfbm8gICAgICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbXBvbmVudCB0byBvdXRwdXQuCi0gKiBAcGFyYW0gICAgICAgcF9kYXRhICAgICAgICAgIEZJWE1FIERPQwotICogQHBhcmFtICAgICAgIHBfZGF0YV93cml0dGVuICBGSVhNRSBET0MKLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotKi8KLXN0YXRpYyB2b2lkIG9wal9qMmtfd3JpdGVfY29jX2luX21lbW9yeShvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLSNlbmRpZgotCi0vKioKLSAqIEdldHMgdGhlIG1heGltdW0gc2l6ZSB0YWtlbiBieSBhIGNvYy4KLSAqCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICB0aGUganBlZzIwMDAgY29kZWMgdG8gdXNlLgotICovCi1zdGF0aWMgT1BKX1VJTlQzMiBvcGpfajJrX2dldF9tYXhfY29jX3NpemUob3BqX2oya190ICpwX2oyayk7Ci0KLS8qKgotICogUmVhZHMgYSBDT0MgbWFya2VyIChDb2RpbmcgU3R5bGUgQ29tcG9uZW50KQotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENPQyBib3guCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENPQyBtYXJrZXIuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX2NvYyAoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLS8qKgotICogV3JpdGVzIHRoZSBRQ0QgbWFya2VyIChxdWFudGl6YXRpb24gZGVmYXVsdCkKLSAqCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgSjJLIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX3FjZCggICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLS8qKgotICogUmVhZHMgYSBRQ0QgbWFya2VyIChRdWFudGl6YXRpb24gZGVmYXVsdHMpCi0gKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUUNEIGJveC4KLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUUNEIG1hcmtlci4KLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfcWNkICggIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLSNpZiAwCi0vKioKLSAqIFdyaXRlcyB0aGUgUUNDIG1hcmtlciAocXVhbnRpemF0aW9uIGNvbXBvbmVudCkKLSAqCi0gKiBAcGFyYW0gICAgICAgcF9jb21wX25vICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29tcG9uZW50IHRvIG91dHB1dC4KLSAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgSjJLIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfcWNjKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29tcF9ubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotI2VuZGlmCi0KLSNpZiAwCi0vKioKLSAqIFdyaXRlcyB0aGUgUUNDIG1hcmtlciAocXVhbnRpemF0aW9uIGNvbXBvbmVudCkKLSAqCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgIEoySyBjb2RlYy4KLSAqIEBwYXJhbSAgICAgICBwX2NvbXBfbm8gICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb21wb25lbnQgdG8gb3V0cHV0LgotICogQHBhcmFtICAgICAgIHBfZGF0YSAgICAgICAgICBGSVhNRSBET0MKLSAqIEBwYXJhbSAgICAgICBwX2RhdGFfd3JpdHRlbiAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgotICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotKi8KLXN0YXRpYyB2b2lkIG9wal9qMmtfd3JpdGVfcWNjX2luX21lbW9yeShvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLSNlbmRpZgotCi0vKioKLSAqIEdldHMgdGhlIG1heGltdW0gc2l6ZSB0YWtlbiBieSBhIHFjYy4KLSAqLwotc3RhdGljIE9QSl9VSU5UMzIgb3BqX2oya19nZXRfbWF4X3FjY19zaXplIChvcGpfajJrX3QgKnBfajJrKTsKLQotLyoqCi0gKiBSZWFkcyBhIFFDQyBtYXJrZXIgKFF1YW50aXphdGlvbiBjb21wb25lbnQpCi0gKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUUNDIGJveC4KLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUUNDIG1hcmtlci4KLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfcWNjKCAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwotLyoqCi0gKiBXcml0ZXMgdGhlIFBPQyBtYXJrZXIgKFByb2dyZXNzaW9uIE9yZGVyIENoYW5nZSkKLSAqCi0gKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICAgICAgICAgIEoySyBjb2RlYy4KLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX3BvYyggICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0vKioKLSAqIFdyaXRlcyB0aGUgUE9DIG1hcmtlciAoUHJvZ3Jlc3Npb24gT3JkZXIgQ2hhbmdlKQotICoKLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICBKMksgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF9kYXRhICAgICAgICAgRklYTUUgRE9DCi0gKiBAcGFyYW0gICAgICAgcF9kYXRhX3dyaXR0ZW4gdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgotICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0gKi8KLXN0YXRpYyB2b2lkIG9wal9qMmtfd3JpdGVfcG9jX2luX21lbW9yeShvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLS8qKgotICogR2V0cyB0aGUgbWF4aW11bSBzaXplIHRha2VuIGJ5IHRoZSB3cml0aW5nIG9mIGEgUE9DLgotICovCi1zdGF0aWMgT1BKX1VJTlQzMiBvcGpfajJrX2dldF9tYXhfcG9jX3NpemUob3BqX2oya190ICpwX2oyayk7Ci0KLS8qKgotICogUmVhZHMgYSBQT0MgbWFya2VyIChQcm9ncmVzc2lvbiBPcmRlciBDaGFuZ2UpCi0gKgotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFBPQyBib3guCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFBPQyBtYXJrZXIuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3BvYyAoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLS8qKgotICogR2V0cyB0aGUgbWF4aW11bSBzaXplIHRha2VuIGJ5IHRoZSB0b2MgaGVhZGVycyBvZiBhbGwgdGhlIHRpbGUgcGFydHMgb2YgYW55IGdpdmVuIHRpbGUuCi0gKi8KLXN0YXRpYyBPUEpfVUlOVDMyIG9wal9qMmtfZ2V0X21heF90b2Nfc2l6ZSAob3BqX2oya190ICpwX2oyayk7Ci0KLS8qKgotICogR2V0cyB0aGUgbWF4aW11bSBzaXplIHRha2VuIGJ5IHRoZSBoZWFkZXJzIG9mIHRoZSBTT1QuCi0gKgotICogQHBhcmFtICAgICAgIHBfajJrICAgdGhlIGpwZWcyMDAwIGNvZGVjIHRvIHVzZS4KLSAqLwotc3RhdGljIE9QSl9VSU5UMzIgb3BqX2oya19nZXRfc3BlY2lmaWNfaGVhZGVyX3NpemVzKG9wal9qMmtfdCAqcF9qMmspOwotCi0vKioKLSAqIFJlYWRzIGEgQ1JHIG1hcmtlciAoQ29tcG9uZW50IHJlZ2lzdHJhdGlvbikKLSAqCi0gKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgVExNIGJveC4KLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgVExNIG1hcmtlci4KLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfY3JnICggIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLS8qKgotICogUmVhZHMgYSBUTE0gbWFya2VyIChUaWxlIExlbmd0aCBNYXJrZXIpCi0gKgotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFRMTSBib3guCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFRMTSBtYXJrZXIuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3RsbSAoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKLQotLyoqCi0gKiBXcml0ZXMgdGhlIHVwZGF0ZWQgdGxtLgotICoKLSAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgSjJLIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfdXBkYXRlZF90bG0oICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotLyoqCi0gKiBSZWFkcyBhIFBMTSBtYXJrZXIgKFBhY2tldCBsZW5ndGgsIG1haW4gaGVhZGVyIG1hcmtlcikKLSAqCi0gKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgVExNIGJveC4KLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgVExNIG1hcmtlci4KLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfcGxtICggIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwotLyoqCi0gKiBSZWFkcyBhIFBMVCBtYXJrZXIgKFBhY2tldCBsZW5ndGgsIHRpbGUtcGFydCBoZWFkZXIpCi0gKgotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFBMVCBib3guCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFBMVCBtYXJrZXIuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3BsdCAoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLSNpZiAwCi0vKioKLSAqIFJlYWRzIGEgUFBNIG1hcmtlciAoUGFja2VkIHBhY2tldCBoZWFkZXJzLCBtYWluIGhlYWRlcikKLSAqCi0gKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUE9DIGJveC4KLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUE9DIG1hcmtlci4KLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotKi8KLXN0YXRpYyBPUEpfQk9PTCBqMmtfcmVhZF9wcG1fdjIgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSNlbmRpZgotCi1zdGF0aWMgT1BKX0JPT0wgajJrX3JlYWRfcHBtX3YzICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotLyoqCi0gKiBSZWFkcyBhIFBQVCBtYXJrZXIgKFBhY2tlZCBwYWNrZXQgaGVhZGVycywgdGlsZS1wYXJ0IGhlYWRlcikKLSAqCi0gKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUFBUIGJveC4KLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUFBUIG1hcmtlci4KLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfcHB0ICggIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLS8qKgotICogV3JpdGVzIHRoZSBUTE0gbWFya2VyIChUaWxlIExlbmd0aCBNYXJrZXIpCi0gKgotICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV90bG0oICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotCi0vKioKLSAqIFdyaXRlcyB0aGUgU09UIG1hcmtlciAoU3RhcnQgb2YgdGlsZS1wYXJ0KQotICoKLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgIEoySyBjb2RlYy4KLSAqIEBwYXJhbSAgICAgICBwX2RhdGEgICAgICAgICAgIEZJWE1FIERPQwotICogQHBhcmFtICAgICAgIHBfZGF0YV93cml0dGVuICAgRklYTUUgRE9DCi0gKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX3NvdCggICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotLyoqCi0gKiBSZWFkcyBhIFBQVCBtYXJrZXIgKFBhY2tlZCBwYWNrZXQgaGVhZGVycywgdGlsZS1wYXJ0IGhlYWRlcikKLSAqCi0gKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUFBUIGJveC4KLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUFBUIG1hcmtlci4KLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfc290ICggIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLS8qKgotICogV3JpdGVzIHRoZSBTT0QgbWFya2VyIChTdGFydCBvZiBkYXRhKQotICoKLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgIEoySyBjb2RlYy4KLSAqIEBwYXJhbSAgICAgICBwX3RpbGVfY29kZXIgICAgICAgIEZJWE1FIERPQwotICogQHBhcmFtICAgICAgIHBfZGF0YSAgICAgICAgICAgICAgRklYTUUgRE9DCi0gKiBAcGFyYW0gICAgICAgcF9kYXRhX3dyaXR0ZW4gICAgICBGSVhNRSBET0MKLSAqIEBwYXJhbSAgICAgICBwX3RvdGFsX2RhdGFfc2l6ZSAgIEZJWE1FIERPQwotICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgotICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9zb2QoICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdCAqIHBfdGlsZV9jb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RvdGFsX2RhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotCi0vKioKLSAqIFJlYWRzIGEgU09EIG1hcmtlciAoU3RhcnQgT2YgRGF0YSkKLSAqCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICAgICAgICAgIEZJWE1FIERPQwotICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9zb2QoICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotCi12b2lkIG9wal9qMmtfdXBkYXRlX3RsbSAob3BqX2oya190ICogcF9qMmssIE9QSl9VSU5UMzIgcF90aWxlX3BhcnRfc2l6ZSApCi17Ci0gICAgICAgIG9wal93cml0ZV9ieXRlcyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90bG1fc290X29mZnNldHNfY3VycmVudCxwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLDEpOyAgICAgICAgICAgIC8qIFBTT1QgKi8KLSAgICAgICAgKytwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90bG1fc290X29mZnNldHNfY3VycmVudDsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdGxtX3NvdF9vZmZzZXRzX2N1cnJlbnQscF90aWxlX3BhcnRfc2l6ZSw0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUFNPVCAqLwotICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90bG1fc290X29mZnNldHNfY3VycmVudCArPSA0OwotfQotCi0vKioKLSAqIFdyaXRlcyB0aGUgUkdOIG1hcmtlciAoUmVnaW9uIE9mIEludGVyZXN0KQotICoKLSAqIEBwYXJhbSAgICAgICBwX3RpbGVfbm8gICAgICAgICAgICAgICB0aGUgdGlsZSB0byBvdXRwdXQKLSAqIEBwYXJhbSAgICAgICBwX2NvbXBfbm8gICAgICAgICAgICAgICB0aGUgY29tcG9uZW50IHRvIG91dHB1dAotICogQHBhcmFtICAgICAgIG5iX2NvbXBzICAgICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cwotICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9yZ24oICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29tcF9ubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbmJfY29tcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotLyoqCi0gKiBSZWFkcyBhIFJHTiBtYXJrZXIgKFJlZ2lvbiBPZiBJbnRlcmVzdCkKLSAqCi0gKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUE9DIGJveC4KLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUE9DIG1hcmtlci4KLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfcmduIChvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLS8qKgotICogV3JpdGVzIHRoZSBFT0MgbWFya2VyIChFbmQgb2YgQ29kZXN0cmVhbSkKLSAqCi0gKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgICAgICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgotICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIEoySyBjb2RlYy4KLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2VvYyggICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLSNpZiAwCi0vKioKLSAqIFJlYWRzIGEgRU9DIG1hcmtlciAoRW5kIE9mIENvZGVzdHJlYW0pCi0gKgotICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KLSAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICBGSVhNRSBET0MKLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfZW9jICggICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLSNlbmRpZgotCi0vKioKLSAqIFdyaXRlcyB0aGUgQ0JELU1DVC1NQ0MtTUNPIG1hcmtlcnMgKE11bHRpIGNvbXBvbmVudHMgdHJhbnNmb3JtKQotICoKLSAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfbWN0X2RhdGFfZ3JvdXAoICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotCi0vKioKLSAqIEluaXRzIHRoZSBJbmZvCi0gKgotICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19pbml0X2luZm8oICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotCi0vKioKLUFkZCBtYWluIGhlYWRlciBtYXJrZXIgaW5mb3JtYXRpb24KLUBwYXJhbSBjc3RyX2luZGV4ICAgIENvZGVzdHJlYW0gaW5mb3JtYXRpb24gc3RydWN0dXJlCi1AcGFyYW0gdHlwZSAgICAgICAgIG1hcmtlciB0eXBlCi1AcGFyYW0gcG9zICAgICAgICAgIGJ5dGUgb2Zmc2V0IG9mIG1hcmtlciBzZWdtZW50Ci1AcGFyYW0gbGVuICAgICAgICAgIGxlbmd0aCBvZiBtYXJrZXIgc2VnbWVudAotICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19hZGRfbWhtYXJrZXIob3BqX2NvZGVzdHJlYW1faW5kZXhfdCAqY3N0cl9pbmRleCwgT1BKX1VJTlQzMiB0eXBlLCBPUEpfT0ZGX1QgcG9zLCBPUEpfVUlOVDMyIGxlbikgOwotLyoqCi1BZGQgdGlsZSBoZWFkZXIgbWFya2VyIGluZm9ybWF0aW9uCi1AcGFyYW0gdGlsZW5vICAgICAgIHRpbGUgaW5kZXggbnVtYmVyCi1AcGFyYW0gY3N0cl9pbmRleCAgIENvZGVzdHJlYW0gaW5mb3JtYXRpb24gc3RydWN0dXJlCi1AcGFyYW0gdHlwZSAgICAgICAgIG1hcmtlciB0eXBlCi1AcGFyYW0gcG9zICAgICAgICAgIGJ5dGUgb2Zmc2V0IG9mIG1hcmtlciBzZWdtZW50Ci1AcGFyYW0gbGVuICAgICAgICAgIGxlbmd0aCBvZiBtYXJrZXIgc2VnbWVudAotICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19hZGRfdGxtYXJrZXIoT1BKX1VJTlQzMiB0aWxlbm8sIG9wal9jb2Rlc3RyZWFtX2luZGV4X3QgKmNzdHJfaW5kZXgsIE9QSl9VSU5UMzIgdHlwZSwgT1BKX09GRl9UIHBvcywgT1BKX1VJTlQzMiBsZW4pOwotCi0vKioKLSAqIFJlYWRzIGFuIHVua25vd24gbWFya2VyCi0gKgotICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KLSAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICB0aGUgc3RyZWFtIG9iamVjdCB0byByZWFkIGZyb20uCi0gKiBAcGFyYW0gICAgICAgb3V0cHV0X21hcmtlciAgICAgICAgICAgRklYTUUgRE9DCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSAqCi0gKiBAcmV0dXJuICAgICAgdHJ1ZSAgICAgICAgICAgICAgICAgICAgaWYgdGhlIG1hcmtlciBjb3VsZCBiZSBkZWR1Y2VkLgotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfdW5rKCBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICpvdXRwdXRfbWFya2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotCi0vKioKLSAqIFdyaXRlcyB0aGUgTUNUIG1hcmtlciAoTXVsdGlwbGUgQ29tcG9uZW50IFRyYW5zZm9ybSkKLSAqCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgIEoySyBjb2RlYy4KLSAqIEBwYXJhbSAgICAgICBwX21jdF9yZWNvcmQgICAgRklYTUUgRE9DCi0gKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9tY3RfcmVjb3JkKCAgICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX21jdF9kYXRhX3QgKiBwX21jdF9yZWNvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLS8qKgotICogUmVhZHMgYSBNQ1QgbWFya2VyIChNdWx0aXBsZSBDb21wb25lbnQgVHJhbnNmb3JtKQotICoKLSAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9kYXRhICAgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBNQ1QgYm94LgotICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KLSAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBNQ1QgbWFya2VyLgotICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9tY3QgKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotLyoqCi0gKiBXcml0ZXMgdGhlIE1DQyBtYXJrZXIgKE11bHRpcGxlIENvbXBvbmVudCBDb2xsZWN0aW9uKQotICoKLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF9tY2NfcmVjb3JkICAgICAgICAgICAgRklYTUUgRE9DCi0gKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgICAgICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgotICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfbWNjX3JlY29yZCggICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCAqIHBfbWNjX3JlY29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotLyoqCi0gKiBSZWFkcyBhIE1DQyBtYXJrZXIgKE11bHRpcGxlIENvbXBvbmVudCBDb2xsZWN0aW9uKQotICoKLSAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9kYXRhICAgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBNQ0MgYm94LgotICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KLSAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBNQ0MgbWFya2VyLgotICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9tY2MgKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotLyoqCi0gKiBXcml0ZXMgdGhlIE1DTyBtYXJrZXIgKE11bHRpcGxlIGNvbXBvbmVudCB0cmFuc2Zvcm1hdGlvbiBvcmRlcmluZykKLSAqCi0gKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICAgICAgICAgIEoySyBjb2RlYy4KLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX21jbyggICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLS8qKgotICogUmVhZHMgYSBNQ08gbWFya2VyIChNdWx0aXBsZSBDb21wb25lbnQgVHJhbnNmb3JtIE9yZGVyaW5nKQotICoKLSAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9kYXRhICAgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBNQ08gYm94LgotICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KLSAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBNQ08gbWFya2VyLgotICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9tY28gKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfYWRkX21jdChvcGpfdGNwX3QgKiBwX3RjcCwgb3BqX2ltYWdlX3QgKiBwX2ltYWdlLCBPUEpfVUlOVDMyIHBfaW5kZXgpOwotCi1zdGF0aWMgdm9pZCAgb3BqX2oya19yZWFkX2ludDE2X3RvX2Zsb2F0IChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSk7Ci1zdGF0aWMgdm9pZCAgb3BqX2oya19yZWFkX2ludDMyX3RvX2Zsb2F0IChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSk7Ci1zdGF0aWMgdm9pZCAgb3BqX2oya19yZWFkX2Zsb2F0MzJfdG9fZmxvYXQgKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLCB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKTsKLXN0YXRpYyB2b2lkICBvcGpfajJrX3JlYWRfZmxvYXQ2NF90b19mbG9hdCAoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pOwotCi1zdGF0aWMgdm9pZCAgb3BqX2oya19yZWFkX2ludDE2X3RvX2ludDMyIChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSk7Ci1zdGF0aWMgdm9pZCAgb3BqX2oya19yZWFkX2ludDMyX3RvX2ludDMyIChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSk7Ci1zdGF0aWMgdm9pZCAgb3BqX2oya19yZWFkX2Zsb2F0MzJfdG9faW50MzIgKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLCB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKTsKLXN0YXRpYyB2b2lkICBvcGpfajJrX3JlYWRfZmxvYXQ2NF90b19pbnQzMiAoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pOwotCi1zdGF0aWMgdm9pZCAgb3BqX2oya193cml0ZV9mbG9hdF90b19pbnQxNiAoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pOwotc3RhdGljIHZvaWQgIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9faW50MzIgKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLCB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKTsKLXN0YXRpYyB2b2lkICBvcGpfajJrX3dyaXRlX2Zsb2F0X3RvX2Zsb2F0IChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSk7Ci1zdGF0aWMgdm9pZCAgb3BqX2oya193cml0ZV9mbG9hdF90b19mbG9hdDY0IChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSk7Ci0KLS8qKgotICogRW5kcyB0aGUgZW5jb2RpbmcsIGkuZS4gZnJlZXMgbWVtb3J5LgotICoKLSAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgSjJLIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfZW5kX2VuY29kaW5nKCAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotCi0vKioKLSAqIFdyaXRlcyB0aGUgQ0JEIG1hcmtlciAoQ29tcG9uZW50IGJpdCBkZXB0aCBkZWZpbml0aW9uKQotICoKLSAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgotICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgICAgICAgICAgSjJLIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfY2JkKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotCi0vKioKLSAqIFJlYWRzIGEgQ0JEIG1hcmtlciAoQ29tcG9uZW50IGJpdCBkZXB0aCBkZWZpbml0aW9uKQotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENCRCBib3guCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENCRCBtYXJrZXIuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX2NiZCAoICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7Ci0KLSNpZiAwCi0vKioKLSAqIFdyaXRlcyBDT0MgbWFya2VyIGZvciBlYWNoIGNvbXBvbmVudC4KLSAqCi0gKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgICAgICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgotICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIEoySyBjb2RlYy4KLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2FsbF9jb2MoIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLSNlbmRpZgotCi0jaWYgMAotLyoqCi0gKiBXcml0ZXMgUUNDIG1hcmtlciBmb3IgZWFjaCBjb21wb25lbnQuCi0gKgotICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9hbGxfcWNjKCBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0jZW5kaWYKLQotLyoqCi0gKiBXcml0ZXMgcmVnaW9ucyBvZiBpbnRlcmVzdHMuCi0gKgotICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9yZWdpb25zKCAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotCi0vKioKLSAqIFdyaXRlcyBFUEMgPz8/PwotICoKLSAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgSjJLIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfZXBjKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLS8qKgotICogQ2hlY2tzIHRoZSBwcm9ncmVzc2lvbiBvcmRlciBjaGFuZ2VzIHZhbHVlcy4gVGVsbHMgb2YgdGhlIHBvYyBnaXZlbiBhcyBpbnB1dCBhcmUgdmFsaWQuCi0gKiBBIG5pY2UgbWVzc2FnZSBpcyBvdXRwdXR0ZWQgYXQgZXJyb3JzLgotICoKLSAqIEBwYXJhbSAgICAgICBwX3BvY3MgICAgICAgICAgICAgICAgICB0aGUgcHJvZ3Jlc3Npb24gb3JkZXIgY2hhbmdlcy4KLSAqIEBwYXJhbSAgICAgICBwX25iX3BvY3MgICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHByb2dyZXNzaW9uIG9yZGVyIGNoYW5nZXMuCi0gKiBAcGFyYW0gICAgICAgcF9uYl9yZXNvbHV0aW9ucyAgICAgICAgdGhlIG51bWJlciBvZiByZXNvbHV0aW9ucy4KLSAqIEBwYXJhbSAgICAgICBudW1jb21wcyAgICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMKLSAqIEBwYXJhbSAgICAgICBudW1sYXllcnMgICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGxheWVycy4KLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotICoKLSAqIEByZXR1cm4gICAgICB0cnVlIGlmIHRoZSBwb2NzIGFyZSB2YWxpZC4KLSAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfY2hlY2tfcG9jX3ZhbCggIGNvbnN0IG9wal9wb2NfdCAqcF9wb2NzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9uYl9wb2NzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9uYl9yZXNvbHV0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG51bWNvbXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbnVtbGF5ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7Ci0KLS8qKgotICogR2V0cyB0aGUgbnVtYmVyIG9mIHRpbGUgcGFydHMgdXNlZCBmb3IgdGhlIGdpdmVuIGNoYW5nZSBvZiBwcm9ncmVzc2lvbiAoaWYgYW55KSBhbmQgdGhlIGdpdmVuIHRpbGUuCi0gKgotICogQHBhcmFtICAgICAgICAgICAgICAgY3AgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvZGluZyBwYXJhbWV0ZXJzLgotICogQHBhcmFtICAgICAgICAgICAgICAgcGlubyAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGdpdmVuIHBvYyAoaS5lLiBpdHMgcG9zaXRpb24gaW4gdGhlIGNvZGluZyBwYXJhbWV0ZXIpLgotICogQHBhcmFtICAgICAgICAgICAgICAgdGlsZW5vICAgICAgICAgIHRoZSBnaXZlbiB0aWxlLgotICoKLSAqIEByZXR1cm4gICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgdGlsZSBwYXJ0cy4KLSAqLwotc3RhdGljIE9QSl9VSU5UMzIgb3BqX2oya19nZXRfbnVtX3RwKCBvcGpfY3BfdCAqY3AsIE9QSl9VSU5UMzIgcGlubywgT1BKX1VJTlQzMiB0aWxlbm8pOwotCi0vKioKLSAqIENhbGN1bGF0ZXMgdGhlIHRvdGFsIG51bWJlciBvZiB0aWxlIHBhcnRzIG5lZWRlZCBieSB0aGUgZW5jb2RlciB0bwotICogZW5jb2RlIHN1Y2ggYW4gaW1hZ2UuIElmIG5vdCBlbm91Z2ggbWVtb3J5IGlzIGF2YWlsYWJsZSwgdGhlbiB0aGUgZnVuY3Rpb24gcmV0dXJuIGZhbHNlLgotICoKLSAqIEBwYXJhbSAgICAgICBwX25iX3RpbGVzICAgICAgcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgbnVtYmVyIG9mIHRpbGUgcGFydHMuCi0gKiBAcGFyYW0gICAgICAgY3AgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvZGluZyBwYXJhbWV0ZXJzIGZvciB0aGUgaW1hZ2UuCi0gKiBAcGFyYW0gICAgICAgaW1hZ2UgICAgICAgICAgIHRoZSBpbWFnZSB0byBlbmNvZGUuCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIHBfajJrIGVuY29kZXIuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0gKgotICogQHJldHVybiB0cnVlIGlmIHRoZSBmdW5jdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2UgZWxzZS4KLSAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfY2FsY3VsYXRlX3RwKCAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NwX3QgKmNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX25iX3RpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90ICppbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwotCi1zdGF0aWMgdm9pZCBvcGpfajJrX2R1bXBfTUhfaW5mbyhvcGpfajJrX3QqIHBfajJrLCBGSUxFKiBvdXRfc3RyZWFtKTsKLQotc3RhdGljIHZvaWQgb3BqX2oya19kdW1wX01IX2luZGV4KG9wal9qMmtfdCogcF9qMmssIEZJTEUqIG91dF9zdHJlYW0pOwotCi1zdGF0aWMgb3BqX2NvZGVzdHJlYW1faW5kZXhfdCogb3BqX2oya19jcmVhdGVfY3N0cl9pbmRleCh2b2lkKTsKLQotc3RhdGljIE9QSl9GTE9BVDMyIG9wal9qMmtfZ2V0X3RwX3N0cmlkZSAob3BqX3RjcF90ICogcF90Y3ApOwotCi1zdGF0aWMgT1BKX0ZMT0FUMzIgb3BqX2oya19nZXRfZGVmYXVsdF9zdHJpZGUgKG9wal90Y3BfdCAqIHBfdGNwKTsKLQotc3RhdGljIGludCBvcGpfajJrX2luaXRpYWxpc2VfNEtfcG9jKG9wal9wb2NfdCAqUE9DLCBpbnQgbnVtcmVzKTsKLQotc3RhdGljIHZvaWQgb3BqX2oya19zZXRfY2luZW1hX3BhcmFtZXRlcnMob3BqX2NwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMsIG9wal9pbWFnZV90ICppbWFnZSwgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIpOwotCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19pc19jaW5lbWFfY29tcGxpYW50KG9wal9pbWFnZV90ICppbWFnZSwgT1BKX1VJTlQxNiByc2l6LCBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcik7Ci0KLS8qQH0qLwotCi0vKkB9Ki8KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXR5cGVkZWYgc3RydWN0IGoya19wcm9nX29yZGVyewotICAgICAgICBPUEpfUFJPR19PUkRFUiBlbnVtX3Byb2c7Ci0gICAgICAgIGNoYXIgc3RyX3Byb2dbNV07Ci19ajJrX3Byb2dfb3JkZXJfdDsKLQotajJrX3Byb2dfb3JkZXJfdCBqMmtfcHJvZ19vcmRlcl9saXN0W10gPSB7Ci0gICAgICAgIHtPUEpfQ1BSTCwgIkNQUkwifSwKLSAgICAgICAge09QSl9MUkNQLCAiTFJDUCJ9LAotICAgICAgICB7T1BKX1BDUkwsICJQQ1JMIn0sCi0gICAgICAgIHtPUEpfUkxDUCwgIlJMQ1AifSwKLSAgICAgICAge09QSl9SUENMLCAiUlBDTCJ9LAotICAgICAgICB7KE9QSl9QUk9HX09SREVSKS0xLCAiIn0KLX07Ci0KLS8qKgotICogRklYTUUgRE9DCi0gKi8KLXN0YXRpYyBjb25zdCBPUEpfVUlOVDMyIE1DVF9FTEVNRU5UX1NJWkUgW10gPQotewotICAgICAgICAyLAotICAgICAgICA0LAotICAgICAgICA0LAotICAgICAgICA4Ci19OwotCi10eXBlZGVmIHZvaWQgKCogb3BqX2oya19tY3RfZnVuY3Rpb24pIChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSk7Ci0KLWNvbnN0IG9wal9qMmtfbWN0X2Z1bmN0aW9uIGoya19tY3RfcmVhZF9mdW5jdGlvbnNfdG9fZmxvYXQgW10gPQotewotICAgICAgICBvcGpfajJrX3JlYWRfaW50MTZfdG9fZmxvYXQsCi0gICAgICAgIG9wal9qMmtfcmVhZF9pbnQzMl90b19mbG9hdCwKLSAgICAgICAgb3BqX2oya19yZWFkX2Zsb2F0MzJfdG9fZmxvYXQsCi0gICAgICAgIG9wal9qMmtfcmVhZF9mbG9hdDY0X3RvX2Zsb2F0Ci19OwotCi1jb25zdCBvcGpfajJrX21jdF9mdW5jdGlvbiBqMmtfbWN0X3JlYWRfZnVuY3Rpb25zX3RvX2ludDMyIFtdID0KLXsKLSAgICAgICAgb3BqX2oya19yZWFkX2ludDE2X3RvX2ludDMyLAotICAgICAgICBvcGpfajJrX3JlYWRfaW50MzJfdG9faW50MzIsCi0gICAgICAgIG9wal9qMmtfcmVhZF9mbG9hdDMyX3RvX2ludDMyLAotICAgICAgICBvcGpfajJrX3JlYWRfZmxvYXQ2NF90b19pbnQzMgotfTsKLQotY29uc3Qgb3BqX2oya19tY3RfZnVuY3Rpb24gajJrX21jdF93cml0ZV9mdW5jdGlvbnNfZnJvbV9mbG9hdCBbXSA9Ci17Ci0gICAgICAgIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9faW50MTYsCi0gICAgICAgIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9faW50MzIsCi0gICAgICAgIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9fZmxvYXQsCi0gICAgICAgIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9fZmxvYXQ2NAotfTsKLQotdHlwZWRlZiBzdHJ1Y3Qgb3BqX2RlY19tZW1vcnlfbWFya2VyX2hhbmRsZXIKLXsKLSAgICAgICAgLyoqIG1hcmtlciB2YWx1ZSAqLwotICAgICAgICBPUEpfVUlOVDMyIGlkOwotICAgICAgICAvKiogdmFsdWUgb2YgdGhlIHN0YXRlIHdoZW4gdGhlIG1hcmtlciBjYW4gYXBwZWFyICovCi0gICAgICAgIE9QSl9VSU5UMzIgc3RhdGVzOwotICAgICAgICAvKiogYWN0aW9uIGxpbmtlZCB0byB0aGUgbWFya2VyICovCi0gICAgICAgIE9QSl9CT09MICgqaGFuZGxlcikgKCAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLX0KLW9wal9kZWNfbWVtb3J5X21hcmtlcl9oYW5kbGVyX3Q7Ci0KLWNvbnN0IG9wal9kZWNfbWVtb3J5X21hcmtlcl9oYW5kbGVyX3QgajJrX21lbW9yeV9tYXJrZXJfaGFuZGxlcl90YWIgW10gPQotewotICB7SjJLX01TX1NPVCwgSjJLX1NUQVRFX01IIHwgSjJLX1NUQVRFX1RQSFNPVCwgb3BqX2oya19yZWFkX3NvdH0sCi0gIHtKMktfTVNfQ09ELCBKMktfU1RBVEVfTUggfCBKMktfU1RBVEVfVFBILCBvcGpfajJrX3JlYWRfY29kfSwKLSAge0oyS19NU19DT0MsIEoyS19TVEFURV9NSCB8IEoyS19TVEFURV9UUEgsIG9wal9qMmtfcmVhZF9jb2N9LAotICB7SjJLX01TX1JHTiwgSjJLX1NUQVRFX01IIHwgSjJLX1NUQVRFX1RQSCwgb3BqX2oya19yZWFkX3Jnbn0sCi0gIHtKMktfTVNfUUNELCBKMktfU1RBVEVfTUggfCBKMktfU1RBVEVfVFBILCBvcGpfajJrX3JlYWRfcWNkfSwKLSAge0oyS19NU19RQ0MsIEoyS19TVEFURV9NSCB8IEoyS19TVEFURV9UUEgsIG9wal9qMmtfcmVhZF9xY2N9LAotICB7SjJLX01TX1BPQywgSjJLX1NUQVRFX01IIHwgSjJLX1NUQVRFX1RQSCwgb3BqX2oya19yZWFkX3BvY30sCi0gIHtKMktfTVNfU0laLCBKMktfU1RBVEVfTUhTSVosIG9wal9qMmtfcmVhZF9zaXp9LAotICB7SjJLX01TX1RMTSwgSjJLX1NUQVRFX01ILCBvcGpfajJrX3JlYWRfdGxtfSwKLSAge0oyS19NU19QTE0sIEoyS19TVEFURV9NSCwgb3BqX2oya19yZWFkX3BsbX0sCi0gIHtKMktfTVNfUExULCBKMktfU1RBVEVfVFBILCBvcGpfajJrX3JlYWRfcGx0fSwKLSAge0oyS19NU19QUE0sIEoyS19TVEFURV9NSCwgajJrX3JlYWRfcHBtX3YzfSwKLSAge0oyS19NU19QUFQsIEoyS19TVEFURV9UUEgsIG9wal9qMmtfcmVhZF9wcHR9LAotICB7SjJLX01TX1NPUCwgMCwgMH0sCi0gIHtKMktfTVNfQ1JHLCBKMktfU1RBVEVfTUgsIG9wal9qMmtfcmVhZF9jcmd9LAotICB7SjJLX01TX0NPTSwgSjJLX1NUQVRFX01IIHwgSjJLX1NUQVRFX1RQSCwgb3BqX2oya19yZWFkX2NvbX0sCi0gIHtKMktfTVNfTUNULCBKMktfU1RBVEVfTUggfCBKMktfU1RBVEVfVFBILCBvcGpfajJrX3JlYWRfbWN0fSwKLSAge0oyS19NU19DQkQsIEoyS19TVEFURV9NSCAsIG9wal9qMmtfcmVhZF9jYmR9LAotICB7SjJLX01TX01DQywgSjJLX1NUQVRFX01IIHwgSjJLX1NUQVRFX1RQSCwgb3BqX2oya19yZWFkX21jY30sCi0gIHtKMktfTVNfTUNPLCBKMktfU1RBVEVfTUggfCBKMktfU1RBVEVfVFBILCBvcGpfajJrX3JlYWRfbWNvfSwKLSNpZmRlZiBVU0VfSlBXTAotI2lmZGVmIFRPRE9fTVMgLyogcmVtb3ZlIHRoZXNlIGZ1bmN0aW9ucyB3aGljaCBhcmUgbm90IGNvbW1wYXRpYmxlIHdpdGggdGhlIHYyIEFQSSAqLwotICB7SjJLX01TX0VQQywgSjJLX1NUQVRFX01IIHwgSjJLX1NUQVRFX1RQSCwgajJrX3JlYWRfZXBjfSwKLSAge0oyS19NU19FUEIsIEoyS19TVEFURV9NSCB8IEoyS19TVEFURV9UUEgsIGoya19yZWFkX2VwYn0sCi0gIHtKMktfTVNfRVNELCBKMktfU1RBVEVfTUggfCBKMktfU1RBVEVfVFBILCBqMmtfcmVhZF9lc2R9LAotICB7SjJLX01TX1JFRCwgSjJLX1NUQVRFX01IIHwgSjJLX1NUQVRFX1RQSCwgajJrX3JlYWRfcmVkfSwKLSNlbmRpZgotI2VuZGlmIC8qIFVTRV9KUFdMICovCi0jaWZkZWYgVVNFX0pQU0VDCi0gIHtKMktfTVNfU0VDLCBKMktfREVDX1NUQVRFX01ILCBqMmtfcmVhZF9zZWN9LAotICB7SjJLX01TX0lOU0VDLCAwLCBqMmtfcmVhZF9pbnNlY30KLSNlbmRpZiAvKiBVU0VfSlBTRUMgKi8KLSAge0oyS19NU19VTkssIEoyS19TVEFURV9NSCB8IEoyS19TVEFURV9UUEgsIDB9LypvcGpfajJrX3JlYWRfdW5rIGlzIGRpcmVjdGx5IHVzZWQqLwotfTsKLQotdm9pZCAgb3BqX2oya19yZWFkX2ludDE2X3RvX2Zsb2F0IChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSkKLXsKLSAgICAgICAgT1BKX0JZVEUgKiBsX3NyY19kYXRhID0gKE9QSl9CWVRFICopIHBfc3JjX2RhdGE7Ci0gICAgICAgIE9QSl9GTE9BVDMyICogbF9kZXN0X2RhdGEgPSAoT1BKX0ZMT0FUMzIgKikgcF9kZXN0X2RhdGE7Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3RlbXA7Ci0KLSAgICAgICAgZm9yIChpPTA7aTxwX25iX2VsZW07KytpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMobF9zcmNfZGF0YSwmbF90ZW1wLDIpOwotCi0gICAgICAgICAgICAgICAgbF9zcmNfZGF0YSs9c2l6ZW9mKE9QSl9JTlQxNik7Ci0KLSAgICAgICAgICAgICAgICAqKGxfZGVzdF9kYXRhKyspID0gKE9QSl9GTE9BVDMyKSBsX3RlbXA7Ci0gICAgICAgIH0KLX0KLQotdm9pZCAgb3BqX2oya19yZWFkX2ludDMyX3RvX2Zsb2F0IChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSkKLXsKLSAgICAgICAgT1BKX0JZVEUgKiBsX3NyY19kYXRhID0gKE9QSl9CWVRFICopIHBfc3JjX2RhdGE7Ci0gICAgICAgIE9QSl9GTE9BVDMyICogbF9kZXN0X2RhdGEgPSAoT1BKX0ZMT0FUMzIgKikgcF9kZXN0X2RhdGE7Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3RlbXA7Ci0KLSAgICAgICAgZm9yIChpPTA7aTxwX25iX2VsZW07KytpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMobF9zcmNfZGF0YSwmbF90ZW1wLDQpOwotCi0gICAgICAgICAgICAgICAgbF9zcmNfZGF0YSs9c2l6ZW9mKE9QSl9JTlQzMik7Ci0KLSAgICAgICAgICAgICAgICAqKGxfZGVzdF9kYXRhKyspID0gKE9QSl9GTE9BVDMyKSBsX3RlbXA7Ci0gICAgICAgIH0KLX0KLQotdm9pZCAgb3BqX2oya19yZWFkX2Zsb2F0MzJfdG9fZmxvYXQgKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLCB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKQotewotICAgICAgICBPUEpfQllURSAqIGxfc3JjX2RhdGEgPSAoT1BKX0JZVEUgKikgcF9zcmNfZGF0YTsKLSAgICAgICAgT1BKX0ZMT0FUMzIgKiBsX2Rlc3RfZGF0YSA9IChPUEpfRkxPQVQzMiAqKSBwX2Rlc3RfZGF0YTsKLSAgICAgICAgT1BKX1VJTlQzMiBpOwotICAgICAgICBPUEpfRkxPQVQzMiBsX3RlbXA7Ci0KLSAgICAgICAgZm9yIChpPTA7aTxwX25iX2VsZW07KytpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3JlYWRfZmxvYXQobF9zcmNfZGF0YSwmbF90ZW1wKTsKLQotICAgICAgICAgICAgICAgIGxfc3JjX2RhdGErPXNpemVvZihPUEpfRkxPQVQzMik7Ci0KLSAgICAgICAgICAgICAgICAqKGxfZGVzdF9kYXRhKyspID0gbF90ZW1wOwotICAgICAgICB9Ci19Ci0KLXZvaWQgIG9wal9qMmtfcmVhZF9mbG9hdDY0X3RvX2Zsb2F0IChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSkKLXsKLSAgICAgICAgT1BKX0JZVEUgKiBsX3NyY19kYXRhID0gKE9QSl9CWVRFICopIHBfc3JjX2RhdGE7Ci0gICAgICAgIE9QSl9GTE9BVDMyICogbF9kZXN0X2RhdGEgPSAoT1BKX0ZMT0FUMzIgKikgcF9kZXN0X2RhdGE7Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgT1BKX0ZMT0FUNjQgbF90ZW1wOwotCi0gICAgICAgIGZvciAoaT0wO2k8cF9uYl9lbGVtOysraSkgewotICAgICAgICAgICAgICAgIG9wal9yZWFkX2RvdWJsZShsX3NyY19kYXRhLCZsX3RlbXApOwotCi0gICAgICAgICAgICAgICAgbF9zcmNfZGF0YSs9c2l6ZW9mKE9QSl9GTE9BVDY0KTsKLQotICAgICAgICAgICAgICAgICoobF9kZXN0X2RhdGErKykgPSAoT1BKX0ZMT0FUMzIpIGxfdGVtcDsKLSAgICAgICAgfQotfQotCi12b2lkICBvcGpfajJrX3JlYWRfaW50MTZfdG9faW50MzIgKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLCB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKQotewotICAgICAgICBPUEpfQllURSAqIGxfc3JjX2RhdGEgPSAoT1BKX0JZVEUgKikgcF9zcmNfZGF0YTsKLSAgICAgICAgT1BKX0lOVDMyICogbF9kZXN0X2RhdGEgPSAoT1BKX0lOVDMyICopIHBfZGVzdF9kYXRhOwotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF90ZW1wOwotCi0gICAgICAgIGZvciAoaT0wO2k8cF9uYl9lbGVtOysraSkgewotICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKGxfc3JjX2RhdGEsJmxfdGVtcCwyKTsKLQotICAgICAgICAgICAgICAgIGxfc3JjX2RhdGErPXNpemVvZihPUEpfSU5UMTYpOwotCi0gICAgICAgICAgICAgICAgKihsX2Rlc3RfZGF0YSsrKSA9IChPUEpfSU5UMzIpIGxfdGVtcDsKLSAgICAgICAgfQotfQotCi12b2lkICBvcGpfajJrX3JlYWRfaW50MzJfdG9faW50MzIgKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLCB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKQotewotICAgICAgICBPUEpfQllURSAqIGxfc3JjX2RhdGEgPSAoT1BKX0JZVEUgKikgcF9zcmNfZGF0YTsKLSAgICAgICAgT1BKX0lOVDMyICogbF9kZXN0X2RhdGEgPSAoT1BKX0lOVDMyICopIHBfZGVzdF9kYXRhOwotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF90ZW1wOwotCi0gICAgICAgIGZvciAoaT0wO2k8cF9uYl9lbGVtOysraSkgewotICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKGxfc3JjX2RhdGEsJmxfdGVtcCw0KTsKLQotICAgICAgICAgICAgICAgIGxfc3JjX2RhdGErPXNpemVvZihPUEpfSU5UMzIpOwotCi0gICAgICAgICAgICAgICAgKihsX2Rlc3RfZGF0YSsrKSA9IChPUEpfSU5UMzIpIGxfdGVtcDsKLSAgICAgICAgfQotfQotCi12b2lkICBvcGpfajJrX3JlYWRfZmxvYXQzMl90b19pbnQzMiAoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pCi17Ci0gICAgICAgIE9QSl9CWVRFICogbF9zcmNfZGF0YSA9IChPUEpfQllURSAqKSBwX3NyY19kYXRhOwotICAgICAgICBPUEpfSU5UMzIgKiBsX2Rlc3RfZGF0YSA9IChPUEpfSU5UMzIgKikgcF9kZXN0X2RhdGE7Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgT1BKX0ZMT0FUMzIgbF90ZW1wOwotCi0gICAgICAgIGZvciAoaT0wO2k8cF9uYl9lbGVtOysraSkgewotICAgICAgICAgICAgICAgIG9wal9yZWFkX2Zsb2F0KGxfc3JjX2RhdGEsJmxfdGVtcCk7Ci0KLSAgICAgICAgICAgICAgICBsX3NyY19kYXRhKz1zaXplb2YoT1BKX0ZMT0FUMzIpOwotCi0gICAgICAgICAgICAgICAgKihsX2Rlc3RfZGF0YSsrKSA9IChPUEpfSU5UMzIpIGxfdGVtcDsKLSAgICAgICAgfQotfQotCi12b2lkICBvcGpfajJrX3JlYWRfZmxvYXQ2NF90b19pbnQzMiAoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pCi17Ci0gICAgICAgIE9QSl9CWVRFICogbF9zcmNfZGF0YSA9IChPUEpfQllURSAqKSBwX3NyY19kYXRhOwotICAgICAgICBPUEpfSU5UMzIgKiBsX2Rlc3RfZGF0YSA9IChPUEpfSU5UMzIgKikgcF9kZXN0X2RhdGE7Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgT1BKX0ZMT0FUNjQgbF90ZW1wOwotCi0gICAgICAgIGZvciAoaT0wO2k8cF9uYl9lbGVtOysraSkgewotICAgICAgICAgICAgICAgIG9wal9yZWFkX2RvdWJsZShsX3NyY19kYXRhLCZsX3RlbXApOwotCi0gICAgICAgICAgICAgICAgbF9zcmNfZGF0YSs9c2l6ZW9mKE9QSl9GTE9BVDY0KTsKLQotICAgICAgICAgICAgICAgICoobF9kZXN0X2RhdGErKykgPSAoT1BKX0lOVDMyKSBsX3RlbXA7Ci0gICAgICAgIH0KLX0KLQotdm9pZCAgb3BqX2oya193cml0ZV9mbG9hdF90b19pbnQxNiAoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pCi17Ci0gICAgICAgIE9QSl9CWVRFICogbF9kZXN0X2RhdGEgPSAoT1BKX0JZVEUgKikgcF9kZXN0X2RhdGE7Ci0gICAgICAgIE9QSl9GTE9BVDMyICogbF9zcmNfZGF0YSA9IChPUEpfRkxPQVQzMiAqKSBwX3NyY19kYXRhOwotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF90ZW1wOwotCi0gICAgICAgIGZvciAoaT0wO2k8cF9uYl9lbGVtOysraSkgewotICAgICAgICAgICAgICAgIGxfdGVtcCA9IChPUEpfVUlOVDMyKSAqKGxfc3JjX2RhdGErKyk7Ci0KLSAgICAgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9kZXN0X2RhdGEsbF90ZW1wLHNpemVvZihPUEpfSU5UMTYpKTsKLQotICAgICAgICAgICAgICAgIGxfZGVzdF9kYXRhKz1zaXplb2YoT1BKX0lOVDE2KTsKLSAgICAgICAgfQotfQotCi12b2lkIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9faW50MzIgKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLCB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKQotewotICAgICAgICBPUEpfQllURSAqIGxfZGVzdF9kYXRhID0gKE9QSl9CWVRFICopIHBfZGVzdF9kYXRhOwotICAgICAgICBPUEpfRkxPQVQzMiAqIGxfc3JjX2RhdGEgPSAoT1BKX0ZMT0FUMzIgKikgcF9zcmNfZGF0YTsKLSAgICAgICAgT1BKX1VJTlQzMiBpOwotICAgICAgICBPUEpfVUlOVDMyIGxfdGVtcDsKLQotICAgICAgICBmb3IgKGk9MDtpPHBfbmJfZWxlbTsrK2kpIHsKLSAgICAgICAgICAgICAgICBsX3RlbXAgPSAoT1BKX1VJTlQzMikgKihsX3NyY19kYXRhKyspOwotCi0gICAgICAgICAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfZGVzdF9kYXRhLGxfdGVtcCxzaXplb2YoT1BKX0lOVDMyKSk7Ci0KLSAgICAgICAgICAgICAgICBsX2Rlc3RfZGF0YSs9c2l6ZW9mKE9QSl9JTlQzMik7Ci0gICAgICAgIH0KLX0KLQotdm9pZCAgb3BqX2oya193cml0ZV9mbG9hdF90b19mbG9hdCAoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pCi17Ci0gICAgICAgIE9QSl9CWVRFICogbF9kZXN0X2RhdGEgPSAoT1BKX0JZVEUgKikgcF9kZXN0X2RhdGE7Ci0gICAgICAgIE9QSl9GTE9BVDMyICogbF9zcmNfZGF0YSA9IChPUEpfRkxPQVQzMiAqKSBwX3NyY19kYXRhOwotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIE9QSl9GTE9BVDMyIGxfdGVtcDsKLQotICAgICAgICBmb3IgKGk9MDtpPHBfbmJfZWxlbTsrK2kpIHsKLSAgICAgICAgICAgICAgICBsX3RlbXAgPSAoT1BKX0ZMT0FUMzIpICoobF9zcmNfZGF0YSsrKTsKLQotICAgICAgICAgICAgICAgIG9wal93cml0ZV9mbG9hdChsX2Rlc3RfZGF0YSxsX3RlbXApOwotCi0gICAgICAgICAgICAgICAgbF9kZXN0X2RhdGErPXNpemVvZihPUEpfRkxPQVQzMik7Ci0gICAgICAgIH0KLX0KLQotdm9pZCAgb3BqX2oya193cml0ZV9mbG9hdF90b19mbG9hdDY0IChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSkKLXsKLSAgICAgICAgT1BKX0JZVEUgKiBsX2Rlc3RfZGF0YSA9IChPUEpfQllURSAqKSBwX2Rlc3RfZGF0YTsKLSAgICAgICAgT1BKX0ZMT0FUMzIgKiBsX3NyY19kYXRhID0gKE9QSl9GTE9BVDMyICopIHBfc3JjX2RhdGE7Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgT1BKX0ZMT0FUNjQgbF90ZW1wOwotCi0gICAgICAgIGZvciAoaT0wO2k8cF9uYl9lbGVtOysraSkgewotICAgICAgICAgICAgICAgIGxfdGVtcCA9IChPUEpfRkxPQVQ2NCkgKihsX3NyY19kYXRhKyspOwotCi0gICAgICAgICAgICAgICAgb3BqX3dyaXRlX2RvdWJsZShsX2Rlc3RfZGF0YSxsX3RlbXApOwotCi0gICAgICAgICAgICAgICAgbF9kZXN0X2RhdGErPXNpemVvZihPUEpfRkxPQVQ2NCk7Ci0gICAgICAgIH0KLX0KLQotY2hhciAqb3BqX2oya19jb252ZXJ0X3Byb2dyZXNzaW9uX29yZGVyKE9QSl9QUk9HX09SREVSIHByZ19vcmRlcil7Ci0gICAgICAgIGoya19wcm9nX29yZGVyX3QgKnBvOwotICAgICAgICBmb3IocG8gPSBqMmtfcHJvZ19vcmRlcl9saXN0OyBwby0+ZW51bV9wcm9nICE9IC0xOyBwbysrICl7Ci0gICAgICAgICAgICAgICAgaWYocG8tPmVudW1fcHJvZyA9PSBwcmdfb3JkZXIpewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvLT5zdHJfcHJvZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBvLT5zdHJfcHJvZzsKLX0KLQotT1BKX0JPT0wgb3BqX2oya19jaGVja19wb2NfdmFsKCBjb25zdCBvcGpfcG9jX3QgKnBfcG9jcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX25iX3BvY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9uYl9yZXNvbHV0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX251bV9jb21wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX251bV9sYXllcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKLXsKLSAgICAgICAgT1BKX1VJTlQzMiogcGFja2V0X2FycmF5OwotICAgICAgICBPUEpfVUlOVDMyIGluZGV4ICwgcmVzbm8sIGNvbXBubywgbGF5bm87Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgT1BKX1VJTlQzMiBzdGVwX2MgPSAxOwotICAgICAgICBPUEpfVUlOVDMyIHN0ZXBfciA9IHBfbnVtX2NvbXBzICogc3RlcF9jOwotICAgICAgICBPUEpfVUlOVDMyIHN0ZXBfbCA9IHBfbmJfcmVzb2x1dGlvbnMgKiBzdGVwX3I7Ci0gICAgICAgIE9QSl9CT09MIGxvc3MgPSBPUEpfRkFMU0U7Ci0gICAgICAgIE9QSl9VSU5UMzIgbGF5bm8wID0gMDsKLQotICAgICAgICBwYWNrZXRfYXJyYXkgPSAoT1BKX1VJTlQzMiopIG9wal9jYWxsb2Moc3RlcF9sICogcF9udW1fbGF5ZXJzLCBzaXplb2YoT1BKX1VJTlQzMikpOwotICAgICAgICBpZiAocGFja2V0X2FycmF5ID09IDAwKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIgLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgY2hlY2tpbmcgdGhlIHBvYyB2YWx1ZXMuXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBfbmJfcG9jcyA9PSAwKSB7Ci0gICAgICAgIG9wal9mcmVlKHBhY2tldF9hcnJheSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5kZXggPSBzdGVwX3IgKiBwX3BvY3MtPnJlc25vMDsKLSAgICAgICAgLyogdGFrZSBlYWNoIHJlc29sdXRpb24gZm9yIGVhY2ggcG9jICovCi0gICAgICAgIGZvciAocmVzbm8gPSBwX3BvY3MtPnJlc25vMCA7IHJlc25vIDwgcF9wb2NzLT5yZXNubzEgOyArK3Jlc25vKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT1BKX1VJTlQzMiByZXNfaW5kZXggPSBpbmRleCArIHBfcG9jcy0+Y29tcG5vMCAqIHN0ZXBfYzsKLQotICAgICAgICAgICAgICAgIC8qIHRha2UgZWFjaCBjb21wIG9mIGVhY2ggcmVzb2x1dGlvbiBmb3IgZWFjaCBwb2MgKi8KLSAgICAgICAgICAgICAgICBmb3IgKGNvbXBubyA9IHBfcG9jcy0+Y29tcG5vMCA7IGNvbXBubyA8IHBfcG9jcy0+Y29tcG5vMSA7ICsrY29tcG5vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNvbXBfaW5kZXggPSByZXNfaW5kZXggKyBsYXlubzAgKiBzdGVwX2w7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBmaW5hbGx5IHRha2UgZWFjaCBsYXllciBvZiBlYWNoIHJlcyBvZiAuLi4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGF5bm8gPSBsYXlubzA7IGxheW5vIDwgcF9wb2NzLT5sYXlubzEgOyArK2xheW5vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaW5kZXggPSBzdGVwX3IgKiByZXNubyArIHN0ZXBfYyAqIGNvbXBubyArIHN0ZXBfbCAqIGxheW5vOyovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldF9hcnJheVtjb21wX2luZGV4XSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBfaW5kZXggKz0gc3RlcF9sOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXNfaW5kZXggKz0gc3RlcF9jOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGluZGV4ICs9IHN0ZXBfcjsKLSAgICAgICAgfQotICAgICAgICArK3BfcG9jczsKLQotICAgICAgICAvKiBpdGVyYXRlIHRocm91Z2ggYWxsIHRoZSBwb2NzICovCi0gICAgICAgIGZvciAoaSA9IDE7IGkgPCBwX25iX3BvY3MgOyArK2kpIHsKLSAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxfbGFzdF9sYXlubzEgPSAocF9wb2NzLTEpLT5sYXlubzEgOwotCi0gICAgICAgICAgICAgICAgbGF5bm8wID0gKHBfcG9jcy0+bGF5bm8xID4gbF9sYXN0X2xheW5vMSk/IGxfbGFzdF9sYXlubzEgOiAwOwotICAgICAgICAgICAgICAgIGluZGV4ID0gc3RlcF9yICogcF9wb2NzLT5yZXNubzA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0YWtlIGVhY2ggcmVzb2x1dGlvbiBmb3IgZWFjaCBwb2MgKi8KLSAgICAgICAgICAgICAgICBmb3IgKHJlc25vID0gcF9wb2NzLT5yZXNubzAgOyByZXNubyA8IHBfcG9jcy0+cmVzbm8xIDsgKytyZXNubykgewotICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiByZXNfaW5kZXggPSBpbmRleCArIHBfcG9jcy0+Y29tcG5vMCAqIHN0ZXBfYzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGFrZSBlYWNoIGNvbXAgb2YgZWFjaCByZXNvbHV0aW9uIGZvciBlYWNoIHBvYyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb21wbm8gPSBwX3BvY3MtPmNvbXBubzAgOyBjb21wbm8gPCBwX3BvY3MtPmNvbXBubzEgOyArK2NvbXBubykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNvbXBfaW5kZXggPSByZXNfaW5kZXggKyBsYXlubzAgKiBzdGVwX2w7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIGZpbmFsbHkgdGFrZSBlYWNoIGxheWVyIG9mIGVhY2ggcmVzIG9mIC4uLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxheW5vID0gbGF5bm8wOyBsYXlubyA8IHBfcG9jcy0+bGF5bm8xIDsgKytsYXlubykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaW5kZXggPSBzdGVwX3IgKiByZXNubyArIHN0ZXBfYyAqIGNvbXBubyArIHN0ZXBfbCAqIGxheW5vOyovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0X2FycmF5W2NvbXBfaW5kZXhdID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wX2luZGV4ICs9IHN0ZXBfbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc19pbmRleCArPSBzdGVwX2M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IHN0ZXBfcjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICArK3BfcG9jczsKLSAgICAgICAgfQotCi0gICAgICAgIGluZGV4ID0gMDsKLSAgICAgICAgZm9yIChsYXlubyA9IDA7IGxheW5vIDwgcF9udW1fbGF5ZXJzIDsgKytsYXlubykgewotICAgICAgICAgICAgICAgIGZvciAocmVzbm8gPSAwOyByZXNubyA8IHBfbmJfcmVzb2x1dGlvbnM7ICsrcmVzbm8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgcF9udW1fY29tcHM7ICsrY29tcG5vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvc3MgfD0gKHBhY2tldF9hcnJheVtpbmRleF0hPTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmluZGV4ID0gc3RlcF9yICogcmVzbm8gKyBzdGVwX2MgKiBjb21wbm8gKyBzdGVwX2wgKiBsYXlubzsqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCArPSBzdGVwX2M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvc3MpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciAsIEVWVF9FUlJPUiwgIk1pc3NpbmcgcGFja2V0cyBwb3NzaWJsZSBsb3NzIG9mIGRhdGFcbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3BqX2ZyZWUocGFja2V0X2FycmF5KTsKLQotICAgICAgICByZXR1cm4gIWxvc3M7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLU9QSl9VSU5UMzIgb3BqX2oya19nZXRfbnVtX3RwKG9wal9jcF90ICpjcCwgT1BKX1VJTlQzMiBwaW5vLCBPUEpfVUlOVDMyIHRpbGVubykKLXsKLSAgICAgICAgY29uc3QgT1BKX0NIQVIgKnByb2cgPSAwMDsKLSAgICAgICAgT1BKX0lOVDMyIGk7Ci0gICAgICAgIE9QSl9VSU5UMzIgdHBudW0gPSAxOwotICAgICAgICBvcGpfdGNwX3QgKnRjcCA9IDAwOwotICAgICAgICBvcGpfcG9jX3QgKiBsX2N1cnJlbnRfcG9jID0gMDA7Ci0KLSAgICAgICAgLyogIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHRpbGVubyA8IChjcC0+dHcgKiBjcC0+dGgpKTsKLSAgICAgICAgYXNzZXJ0KHBpbm8gPCAoY3AtPnRjcHNbdGlsZW5vXS5udW1wb2NzICsgMSkpOwotCi0gICAgICAgIC8qIGdldCB0aGUgZ2l2ZW4gdGlsZSBjb2RpbmcgcGFyYW1ldGVyICovCi0gICAgICAgIHRjcCA9ICZjcC0+dGNwc1t0aWxlbm9dOwotICAgICAgICBhc3NlcnQodGNwICE9IDAwKTsKLQotICAgICAgICBsX2N1cnJlbnRfcG9jID0gJih0Y3AtPnBvY3NbcGlub10pOwotICAgICAgICBhc3NlcnQobF9jdXJyZW50X3BvYyAhPSAwKTsKLQotICAgICAgICAvKiBnZXQgdGhlIHByb2dyZXNzaW9uIG9yZGVyIGFzIGEgY2hhcmFjdGVyIHN0cmluZyAqLwotICAgICAgICBwcm9nID0gb3BqX2oya19jb252ZXJ0X3Byb2dyZXNzaW9uX29yZGVyKHRjcC0+cHJnKTsKLSAgICAgICAgYXNzZXJ0KHN0cmxlbihwcm9nKSA+IDApOwotCi0gICAgICAgIGlmIChjcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX3RwX29uID09IDEpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGk9MDtpPDQ7KytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHByb2dbaV0pCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbXBvbmVudCB3aXNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0MnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwbnVtICo9IGxfY3VycmVudF9wb2MtPmNvbXBFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXNvbHV0aW9uIHdpc2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnUic6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBudW0gKj0gbF9jdXJyZW50X3BvYy0+cmVzRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJlY2luY3Qgd2lzZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdQJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cG51bSAqPSBsX2N1cnJlbnRfcG9jLT5wcmNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsYXllciB3aXNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0wnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwbnVtICo9IGxfY3VycmVudF9wb2MtPmxheUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3aG91bGQgd2Ugc3BsaXQgaGVyZSA/ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fdHBfZmxhZyA9PSBwcm9nW2ldICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX3RwX3Bvcz1pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHBudW09MTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cG51bTsKLX0KLQotT1BKX0JPT0wgb3BqX2oya19jYWxjdWxhdGVfdHAoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY3BfdCAqY3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX25iX3RpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgcGlubyx0aWxlbm87Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl90aWxlczsKLSAgICAgICAgb3BqX3RjcF90ICp0Y3A7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9uYl90aWxlcyAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChjcCAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChpbWFnZSAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotCi0gICAgICAgIGxfbmJfdGlsZXMgPSBjcC0+dHcgKiBjcC0+dGg7Ci0gICAgICAgICogcF9uYl90aWxlcyA9IDA7Ci0gICAgICAgIHRjcCA9IGNwLT50Y3BzOwotCi0gICAgICAgIC8qIElOREVYID4+ICovCi0gICAgICAgIC8qIFRPRE8gbWVyZ2VWMjogY2hlY2sgdGhpcyBwYXJ0IHdoaWNoIHVzZSBjc3RyX2luZm8gKi8KLSAgICAgICAgLyppZiAocF9qMmstPmNzdHJfaW5mbykgewotICAgICAgICAgICAgICAgIG9wal90aWxlX2luZm9fdCAqIGxfaW5mb190aWxlX3B0ciA9IHBfajJrLT5jc3RyX2luZm8tPnRpbGU7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKHRpbGVubyA9IDA7IHRpbGVubyA8IGxfbmJfdGlsZXM7ICsrdGlsZW5vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGN1cl90b3RudW1fdHAgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfdXBkYXRlX2VuY29kaW5nX3BhcmFtZXRlcnMoaW1hZ2UsY3AsdGlsZW5vKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChwaW5vID0gMDsgcGlubyA8PSB0Y3AtPm51bXBvY3M7ICsrcGlubykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0cF9udW0gPSBvcGpfajJrX2dldF9udW1fdHAoY3AscGlubyx0aWxlbm8pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX25iX3RpbGVzID0gKnBfbmJfdGlsZXMgKyB0cF9udW07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3RvdG51bV90cCArPSB0cF9udW07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRjcC0+bV9uYl90aWxlX3BhcnRzID0gY3VyX3RvdG51bV90cDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbF9pbmZvX3RpbGVfcHRyLT50cCA9IChvcGpfdHBfaW5mb190ICopIG9wal9tYWxsb2MoY3VyX3RvdG51bV90cCAqIHNpemVvZihvcGpfdHBfaW5mb190KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9pbmZvX3RpbGVfcHRyLT50cCA9PSAwMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQobF9pbmZvX3RpbGVfcHRyLT50cCwwLGN1cl90b3RudW1fdHAgKiBzaXplb2Yob3BqX3RwX2luZm9fdCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBsX2luZm9fdGlsZV9wdHItPm51bV90cHMgPSBjdXJfdG90bnVtX3RwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICArK2xfaW5mb190aWxlX3B0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICsrdGNwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlICovewotICAgICAgICAgICAgICAgIGZvciAodGlsZW5vID0gMDsgdGlsZW5vIDwgbF9uYl90aWxlczsgKyt0aWxlbm8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgY3VyX3RvdG51bV90cCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9waV91cGRhdGVfZW5jb2RpbmdfcGFyYW1ldGVycyhpbWFnZSxjcCx0aWxlbm8pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHBpbm8gPSAwOyBwaW5vIDw9IHRjcC0+bnVtcG9jczsgKytwaW5vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdHBfbnVtID0gb3BqX2oya19nZXRfbnVtX3RwKGNwLHBpbm8sdGlsZW5vKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9uYl90aWxlcyA9ICpwX25iX3RpbGVzICsgdHBfbnVtOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl90b3RudW1fdHAgKz0gdHBfbnVtOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT5tX25iX3RpbGVfcGFydHMgPSBjdXJfdG90bnVtX3RwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICArK3RjcDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9CT09MIG9wal9qMmtfd3JpdGVfc29jKCAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQotewotICAgICAgICAvKiAyIGJ5dGVzIHdpbGwgYmUgd3JpdHRlbiAqLwotICAgICAgICBPUEpfQllURSAqIGxfc3RhcnRfc3RyZWFtID0gMDA7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLQotICAgICAgICBsX3N0YXJ0X3N0cmVhbSA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGE7Ci0KLSAgICAgICAgLyogd3JpdGUgU09DIGlkZW50aWZpZXIgKi8KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfc3RhcnRfc3RyZWFtLEoyS19NU19TT0MsMik7Ci0KLSAgICAgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShwX3N0cmVhbSxsX3N0YXJ0X3N0cmVhbSwyLHBfbWFuYWdlcikgIT0gMikgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotLyogVW5pUEc+PiAqLwotI2lmZGVmIFVTRV9KUFdMCi0gICAgICAgIC8qIHVwZGF0ZSBtYXJrZXJzIHN0cnVjdCAqLwotLyoKLSAgICAgICAgT1BKX0JPT0wgcmVzID0gajJrX2FkZF9tYXJrZXIocF9qMmstPmNzdHJfaW5mbywgSjJLX01TX1NPQywgcF9zdHJlYW1fdGVsbChwX3N0cmVhbSkgLSAyLCAyKTsKLSovCi0gIGFzc2VydCggMCAmJiAiVE9ETyIgKTsKLSNlbmRpZiAvKiBVU0VfSlBXTCAqLwotLyogPDxVbmlQRyAqLwotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotLyoqCi0gKiBSZWFkcyBhIFNPQyBtYXJrZXIgKFN0YXJ0IG9mIENvZGVzdHJlYW0pCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgIHRoZSBqcGVnMjAwMCBmaWxlIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICBGSVhNRSBET0MKLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3NvYyggICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgICAgIE9QSl9CWVRFIGxfZGF0YSBbMl07Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9tYXJrZXI7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKLQotICAgICAgICBpZiAob3BqX3N0cmVhbV9yZWFkX2RhdGEocF9zdHJlYW0sbF9kYXRhLDIscF9tYW5hZ2VyKSAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIG9wal9yZWFkX2J5dGVzKGxfZGF0YSwmbF9tYXJrZXIsMik7Ci0gICAgICAgIGlmIChsX21hcmtlciAhPSBKMktfTVNfU09DKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIE5leHQgbWFya2VyIHNob3VsZCBiZSBhIFNJWiBtYXJrZXIgaW4gdGhlIG1haW4gaGVhZGVyICovCi0gICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID0gSjJLX1NUQVRFX01IU0laOwotCi0gICAgICAgIC8qIEZJWE1FIG1vdmUgaXQgaW4gYSBpbmRleCBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gcF9qMmsqLwotICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+bWFpbl9oZWFkX3N0YXJ0ID0gb3BqX3N0cmVhbV90ZWxsKHBfc3RyZWFtKSAtIDI7Ci0KLSAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9JTkZPLCAiU3RhcnQgdG8gcmVhZCBqMmsgbWFpbiBoZWFkZXIgKCVkKS5cbiIsIHBfajJrLT5jc3RyX2luZGV4LT5tYWluX2hlYWRfc3RhcnQpOwotCi0gICAgICAgIC8qIEFkZCB0aGUgbWFya2VyIHRvIHRoZSBjb2Rlc3RyZWFtIGluZGV4Ki8KLSAgICAgICAgaWYgKE9QSl9GQUxTRSA9PSBvcGpfajJrX2FkZF9taG1hcmtlcihwX2oyay0+Y3N0cl9pbmRleCwgSjJLX01TX1NPQywgcF9qMmstPmNzdHJfaW5kZXgtPm1haW5faGVhZF9zdGFydCwgMikpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWRkIG1oIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9CT09MIG9wal9qMmtfd3JpdGVfc2l6KCAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQotewotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9zaXplX2xlbjsKLSAgICAgICAgT1BKX0JZVEUgKiBsX2N1cnJlbnRfcHRyOwotICAgICAgICBvcGpfaW1hZ2VfdCAqIGxfaW1hZ2UgPSAwMDsKLSAgICAgICAgb3BqX2NwX3QgKmNwID0gMDA7Ci0gICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wID0gMDA7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLQotICAgICAgICBsX2ltYWdlID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZTsKLSAgICAgICAgY3AgPSAmKHBfajJrLT5tX2NwKTsKLSAgICAgICAgbF9zaXplX2xlbiA9IDQwICsgMyAqIGxfaW1hZ2UtPm51bWNvbXBzOwotICAgICAgICBsX2ltZ19jb21wID0gbF9pbWFnZS0+Y29tcHM7Ci0KLSAgICAgICAgaWYgKGxfc2l6ZV9sZW4gPiBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUpIHsKLQotICAgICAgICAgICAgICAgIE9QSl9CWVRFICpuZXdfaGVhZGVyX3RpbGVfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfcmVhbGxvYyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLCBsX3NpemVfbGVuKTsKLSAgICAgICAgICAgICAgICBpZiAoISBuZXdfaGVhZGVyX3RpbGVfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgZm9yIHRoZSBTSVogbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBuZXdfaGVhZGVyX3RpbGVfZGF0YTsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSBsX3NpemVfbGVuOwotICAgICAgICB9Ci0KLSAgICAgICAgbF9jdXJyZW50X3B0ciA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGE7Ci0KLSAgICAgICAgLyogd3JpdGUgU09DIGlkZW50aWZpZXIgKi8KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9wdHIsSjJLX01TX1NJWiwyKTsgICAgLyogU0laICovCi0gICAgICAgIGxfY3VycmVudF9wdHIrPTI7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9wdHIsbF9zaXplX2xlbi0yLDIpOyAvKiBMX1NJWiAqLwotICAgICAgICBsX2N1cnJlbnRfcHRyKz0yOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLCBjcC0+cnNpeiwgMik7ICAgIC8qIFJzaXogKGNhcGFiaWxpdGllcykgKi8KLSAgICAgICAgbF9jdXJyZW50X3B0cis9MjsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X3B0ciwgbF9pbWFnZS0+eDEsIDQpOyAvKiBYc2l6ICovCi0gICAgICAgIGxfY3VycmVudF9wdHIrPTQ7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9wdHIsIGxfaW1hZ2UtPnkxLCA0KTsgLyogWXNpeiAqLwotICAgICAgICBsX2N1cnJlbnRfcHRyKz00OwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLCBsX2ltYWdlLT54MCwgNCk7IC8qIFgwc2l6ICovCi0gICAgICAgIGxfY3VycmVudF9wdHIrPTQ7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9wdHIsIGxfaW1hZ2UtPnkwLCA0KTsgLyogWTBzaXogKi8KLSAgICAgICAgbF9jdXJyZW50X3B0cis9NDsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X3B0ciwgY3AtPnRkeCwgNCk7ICAgICAgICAgICAgIC8qIFhUc2l6ICovCi0gICAgICAgIGxfY3VycmVudF9wdHIrPTQ7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9wdHIsIGNwLT50ZHksIDQpOyAgICAgICAgICAgICAvKiBZVHNpeiAqLwotICAgICAgICBsX2N1cnJlbnRfcHRyKz00OwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLCBjcC0+dHgwLCA0KTsgICAgICAgICAgICAgLyogWFQwc2l6ICovCi0gICAgICAgIGxfY3VycmVudF9wdHIrPTQ7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9wdHIsIGNwLT50eTAsIDQpOyAgICAgICAgICAgICAvKiBZVDBzaXogKi8KLSAgICAgICAgbF9jdXJyZW50X3B0cis9NDsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X3B0ciwgbF9pbWFnZS0+bnVtY29tcHMsIDIpOyAgIC8qIENzaXogKi8KLSAgICAgICAgbF9jdXJyZW50X3B0cis9MjsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbF9pbWFnZS0+bnVtY29tcHM7ICsraSkgewotICAgICAgICAgICAgICAgIC8qIFRPRE8gaGVyZSB3aXRoIE1DVCA/ICovCi0gICAgICAgICAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9wdHIsIGxfaW1nX2NvbXAtPnByZWMgLSAxICsgKGxfaW1nX2NvbXAtPnNnbmQgPDwgNyksIDEpOyAgICAgIC8qIFNzaXpfaSAqLwotICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X3B0cjsKLQotICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLCBsX2ltZ19jb21wLT5keCwgMSk7ICAgICAgLyogWFJzaXpfaSAqLwotICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X3B0cjsKLQotICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLCBsX2ltZ19jb21wLT5keSwgMSk7ICAgICAgLyogWVJzaXpfaSAqLwotICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X3B0cjsKLQotICAgICAgICAgICAgICAgICsrbF9pbWdfY29tcDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSxsX3NpemVfbGVuLHBfbWFuYWdlcikgIT0gbF9zaXplX2xlbikgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLS8qKgotICogUmVhZHMgYSBTSVogbWFya2VyIChpbWFnZSBhbmQgdGlsZSBzaXplKQotICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICB0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KLSAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9kYXRhICAgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBTSVogYm94LgotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFNJWiBtYXJrZXIuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9zaXoob3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl9jb21wOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfY29tcF9yZW1haW47Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9yZW1haW5pbmdfc2l6ZTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX3RpbGVzOwotICAgICAgICBPUEpfVUlOVDMyIGxfdG1wLCBsX3R4MSwgbF90eTE7Ci0gICAgICAgIG9wal9pbWFnZV90ICpsX2ltYWdlID0gMDA7Ci0gICAgICAgIG9wal9jcF90ICpsX2NwID0gMDA7Ci0gICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wID0gMDA7Ci0gICAgICAgIG9wal90Y3BfdCAqIGxfY3VycmVudF90aWxlX3BhcmFtID0gMDA7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOwotCi0gICAgICAgIGxfaW1hZ2UgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlOwotICAgICAgICBsX2NwID0gJihwX2oyay0+bV9jcCk7Ci0KLSAgICAgICAgLyogbWluaW11bSBzaXplID09IDM5IC0gMyAoPSBtaW5pbXVtIGNvbXBvbmVudCBwYXJhbWV0ZXIpICovCi0gICAgICAgIGlmIChwX2hlYWRlcl9zaXplIDwgMzYpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd2l0aCBTSVogbWFya2VyIHNpemVcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBsX3JlbWFpbmluZ19zaXplID0gcF9oZWFkZXJfc2l6ZSAtIDM2OwotICAgICAgICBsX25iX2NvbXAgPSBsX3JlbWFpbmluZ19zaXplIC8gMzsKLSAgICAgICAgbF9uYl9jb21wX3JlbWFpbiA9IGxfcmVtYWluaW5nX3NpemUgJSAzOwotICAgICAgICBpZiAobF9uYl9jb21wX3JlbWFpbiAhPSAwKXsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd2l0aCBTSVogbWFya2VyIHNpemVcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX3RtcCAsMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUnNpeiAoY2FwYWJpbGl0aWVzKSAqLwotICAgICAgICBwX2hlYWRlcl9kYXRhKz0yOwotICAgICAgICBsX2NwLT5yc2l6ID0gKE9QSl9VSU5UMTYpIGxfdG1wOwotICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAoT1BKX1VJTlQzMiopICZsX2ltYWdlLT54MSwgNCk7ICAgLyogWHNpeiAqLwotICAgICAgICBwX2hlYWRlcl9kYXRhKz00OwotICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAoT1BKX1VJTlQzMiopICZsX2ltYWdlLT55MSwgNCk7ICAgLyogWXNpeiAqLwotICAgICAgICBwX2hlYWRlcl9kYXRhKz00OwotICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAoT1BKX1VJTlQzMiopICZsX2ltYWdlLT54MCwgNCk7ICAgLyogWDBzaXogKi8KLSAgICAgICAgcF9oZWFkZXJfZGF0YSs9NDsKLSAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgKE9QSl9VSU5UMzIqKSAmbF9pbWFnZS0+eTAsIDQpOyAgIC8qIFkwc2l6ICovCi0gICAgICAgIHBfaGVhZGVyX2RhdGErPTQ7Ci0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsIChPUEpfVUlOVDMyKikgJmxfY3AtPnRkeCwgNCk7ICAgICAgICAgICAgIC8qIFhUc2l6ICovCi0gICAgICAgIHBfaGVhZGVyX2RhdGErPTQ7Ci0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsIChPUEpfVUlOVDMyKikgJmxfY3AtPnRkeSwgNCk7ICAgICAgICAgICAgIC8qIFlUc2l6ICovCi0gICAgICAgIHBfaGVhZGVyX2RhdGErPTQ7Ci0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsIChPUEpfVUlOVDMyKikgJmxfY3AtPnR4MCwgNCk7ICAgICAgICAgICAgIC8qIFhUMHNpeiAqLwotICAgICAgICBwX2hlYWRlcl9kYXRhKz00OwotICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAoT1BKX1VJTlQzMiopICZsX2NwLT50eTAsIDQpOyAgICAgICAgICAgICAvKiBZVDBzaXogKi8KLSAgICAgICAgcF9oZWFkZXJfZGF0YSs9NDsKLSAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgKE9QSl9VSU5UMzIqKSAmbF90bXAsIDIpOyAgICAgICAgICAgICAgICAgLyogQ3NpeiAqLwotICAgICAgICBwX2hlYWRlcl9kYXRhKz0yOwotICAgICAgICBpZiAobF90bXAgPCAxNjM4NSkKLSAgICAgICAgICAgICAgICBsX2ltYWdlLT5udW1jb21wcyA9IChPUEpfVUlOVDE2KSBsX3RtcDsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdpdGggU0laIG1hcmtlcjogbnVtYmVyIG9mIGNvbXBvbmVudCBpcyBpbGxlZ2FsIC0+ICVkXG4iLCBsX3RtcCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsX2ltYWdlLT5udW1jb21wcyAhPSBsX25iX2NvbXApIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd2l0aCBTSVogbWFya2VyOiBudW1iZXIgb2YgY29tcG9uZW50IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIHJlbWFpbmluZyBudW1iZXIgb2YgcGFyYW1ldGVycyAoICVkIHZzICVkKVxuIiwgbF9pbWFnZS0+bnVtY29tcHMsIGxfbmJfY29tcCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHRlc3RjYXNlIDQwMzUucGRmLlNJR1NFR1YuZDhiLjMzNzUgKi8KLSAgICAgICAgLyogdGVzdGNhc2UgaXNzdWU0MjctbnVsbC1pbWFnZS1zaXplLmpwMiAqLwotICAgICAgICBpZiAoKGxfaW1hZ2UtPngwID49IGxfaW1hZ2UtPngxKSB8fCAobF9pbWFnZS0+eTAgPj0gbF9pbWFnZS0+eTEpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdpdGggU0laIG1hcmtlcjogbmVnYXRpdmUgb3IgemVybyBpbWFnZSBzaXplICglZCB4ICVkKVxuIiwgbF9pbWFnZS0+eDEgLSBsX2ltYWdlLT54MCwgbF9pbWFnZS0+eTEgLSBsX2ltYWdlLT55MCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICAvKiB0ZXN0Y2FzZSAyNTM5LnBkZi5TSUdGUEUuNzA2LjE3MTIgKGFsc28gMzYyMi5wZGYuU0lHRlBFLjcwNi4yOTE2IGFuZCA0MDA4LnBkZi5TSUdGUEUuNzA2LjMzNDUgYW5kIG1heWJlIG1vcmUpICovCi0gICAgICAgIGlmICghKGxfY3AtPnRkeCAqIGxfY3AtPnRkeSkpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd2l0aCBTSVogbWFya2VyOiBpbnZhbGlkIHRpbGUgc2l6ZSAodGR4OiAlZCwgdGR5OiAlZClcbiIsIGxfY3AtPnRkeCwgbF9jcC0+dGR5KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogdGVzdGNhc2UgMTYxMC5wZGYuU0lHU0VHVi41OWMuNjgxICovCi0gICAgICAgIGlmICgoKE9QSl9VSU5UNjQpbF9pbWFnZS0+eDEpICogKChPUEpfVUlOVDY0KWxfaW1hZ2UtPnkxKSAhPSAobF9pbWFnZS0+eDEgKiBsX2ltYWdlLT55MSkpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiUHJldmVudCBidWZmZXIgb3ZlcmZsb3cgKHgxOiAlZCwgeTE6ICVkKVxuIiwgbF9pbWFnZS0+eDEsIGxfaW1hZ2UtPnkxKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogdGVzdGNhc2UgaXNzdWU0MjctaWxsZWdhbC10aWxlLW9mZnNldC5qcDIgKi8KLSAgICAgICAgbF90eDEgPSBsX2NwLT50eDAgKyBsX2NwLT50ZHg7Ci0gICAgICAgIGlmIChsX3R4MSA8IGxfY3AtPnR4MCkgeyAvKiBtYW5hZ2Ugb3ZlcmZsb3cgKi8KLSAgICAgICAgICAgICAgICBsX3R4MSA9IDB4RkZGRkZGRkZVOwotICAgICAgICB9Ci0gICAgICAgIGxfdHkxID0gbF9jcC0+dHkwICsgbF9jcC0+dGR5OwotICAgICAgICBpZiAobF90eTEgPCBsX2NwLT50eTApIHsgLyogbWFuYWdlIG92ZXJmbG93ICovCi0gICAgICAgICAgICAgICAgbF90eTEgPSAweEZGRkZGRkZGVTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGxfY3AtPnR4MCA+IGxfaW1hZ2UtPngwKSB8fCAobF9jcC0+dHkwID4gbF9pbWFnZS0+eTApIHx8IChsX3R4MSA8PSBsX2ltYWdlLT54MCkgfHwgKGxfdHkxIDw9IGxfaW1hZ2UtPnkwKSApIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd2l0aCBTSVogbWFya2VyOiBpbGxlZ2FsIHRpbGUgb2Zmc2V0XG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSNpZmRlZiBVU0VfSlBXTAotICAgICAgICBpZiAobF9jcC0+Y29ycmVjdCkgewotICAgICAgICAgICAgICAgIC8qIGlmIEpQV0wgaXMgb24sIHdlIGNoZWNrIHdoZXRoZXIgVFggZXJyb3JzIGhhdmUgZGFtYWdlZAotICAgICAgICAgICAgICAgICAgdG9vIG11Y2ggdGhlIFNJWiBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgICAgaWYgKCEobF9pbWFnZS0+eDEgKiBsX2ltYWdlLT55MSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKUFdMOiBiYWQgaW1hZ2Ugc2l6ZSAoJWQgeCAlZClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaW1hZ2UtPngxLCBsX2ltYWdlLT55MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUpQV0xfQVNTVU1FIHx8IEpQV0xfQVNTVU1FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJKUFdMOiBnaXZpbmcgdXBcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAvKiBGSVhNRSBjaGVjayBwcmV2aW91c2x5IGluIHRoZSBmdW5jdGlvbiBzbyB3aHkga2VlcCB0aGlzIHBpZWNlIG9mIGNvZGUgPyBOZWVkIGJ5IHRoZSBub3JtID8KLSAgICAgICAgICAgICAgICBpZiAobF9pbWFnZS0+bnVtY29tcHMgIT0gKChsZW4gLSAzOCkgLyAzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEpQV0xfQVNTVU1FID8gRVZUX1dBUk5JTkcgOiBFVlRfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKUFdMOiBDc2l6IGlzICVkID0+IHNwYWNlIGluIFNJWiBvbmx5IGZvciAlZCBjb21wcy4hISFcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaW1hZ2UtPm51bWNvbXBzLCAoKGxlbiAtIDM4KSAvIDMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSlBXTF9BU1NVTUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkpQV0w6IGdpdmluZyB1cFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICovICAgICAgICAgICAgICAvKiB3ZSB0cnkgdG8gY29ycmVjdCAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiLSB0cnlpbmcgdG8gYWRqdXN0IHRoaXNcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfaW1hZ2UtPm51bWNvbXBzIDwgKChsZW4gLSAzOCkgLyAzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAzOCArIDMgKiBsX2ltYWdlLT5udW1jb21wczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiLSBzZXR0aW5nIExzaXogdG8gJWQgPT4gSFlQT1RIRVNJUyEhIVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9pbWFnZS0+bnVtY29tcHMgPSAoKGxlbiAtIDM4KSAvIDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICItIHNldHRpbmcgQ3NpeiB0byAlZCA9PiBIWVBPVEhFU0lTISEhXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaW1hZ2UtPm51bWNvbXBzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAvKiB1cGRhdGUgY29tcG9uZW50cyBudW1iZXIgaW4gdGhlIGpwd2xfZXhwX2NvbXBzIGZpbGVkICovCi0gICAgICAgICAgICAgICAgbF9jcC0+ZXhwX2NvbXBzID0gbF9pbWFnZS0+bnVtY29tcHM7Ci0gICAgICAgIH0KLSNlbmRpZiAvKiBVU0VfSlBXTCAqLwotCi0gICAgICAgIC8qIEFsbG9jYXRlIHRoZSByZXN1bHRpbmcgaW1hZ2UgY29tcG9uZW50cyAqLwotICAgICAgICBsX2ltYWdlLT5jb21wcyA9IChvcGpfaW1hZ2VfY29tcF90Kikgb3BqX2NhbGxvYyhsX2ltYWdlLT5udW1jb21wcywgc2l6ZW9mKG9wal9pbWFnZV9jb21wX3QpKTsKLSAgICAgICAgaWYgKGxfaW1hZ2UtPmNvbXBzID09IDAwKXsKLSAgICAgICAgICAgICAgICBsX2ltYWdlLT5udW1jb21wcyA9IDA7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHRha2UgaW4gY2hhcmdlIFNJWiBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBsX2ltZ19jb21wID0gbF9pbWFnZS0+Y29tcHM7Ci0KLSAgICAgICAgLyogUmVhZCB0aGUgY29tcG9uZW50IGluZm9ybWF0aW9uICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsX2ltYWdlLT5udW1jb21wczsgKytpKXsKLSAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHRtcDsKLSAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZ0bXAsMSk7ICAgLyogU3Npel9pICovCi0gICAgICAgICAgICAgICAgKytwX2hlYWRlcl9kYXRhOwotICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPnByZWMgPSAodG1wICYgMHg3ZikgKyAxOwotICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPnNnbmQgPSB0bXAgPj4gNzsKLSAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZ0bXAsMSk7ICAgLyogWFJzaXpfaSAqLwotICAgICAgICAgICAgICAgICsrcF9oZWFkZXJfZGF0YTsKLSAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT5keCA9IChPUEpfVUlOVDMyKXRtcDsgLyogc2hvdWxkIGJlIGJldHdlZW4gMSBhbmQgMjU1ICovCi0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmdG1wLDEpOyAgIC8qIFlSc2l6X2kgKi8KLSAgICAgICAgICAgICAgICArK3BfaGVhZGVyX2RhdGE7Ci0gICAgICAgICAgICAgICAgbF9pbWdfY29tcC0+ZHkgPSAoT1BKX1VJTlQzMil0bXA7IC8qIHNob3VsZCBiZSBiZXR3ZWVuIDEgYW5kIDI1NSAqLwotICAgICAgICAgICAgICAgIGlmKCBsX2ltZ19jb21wLT5keCA8IDEgfHwgbF9pbWdfY29tcC0+ZHggPiAyNTUgfHwKLSAgICAgICAgICAgICAgICAgICAgbF9pbWdfY29tcC0+ZHkgPCAxIHx8IGxfaW1nX2NvbXAtPmR5ID4gMjU1ICkgewotICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHZhbHVlcyBmb3IgY29tcCA9ICVkIDogZHg9JXUgZHk9JXVcbiAoc2hvdWxkIGJlIGJldHdlZW4gMSBhbmQgMjU1IGFjY29yZGluZyB0aGUgSlBFRzIwMDAgbm9ybSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGxfaW1nX2NvbXAtPmR4LCBsX2ltZ19jb21wLT5keSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotCi0jaWZkZWYgVVNFX0pQV0wKLSAgICAgICAgICAgICAgICBpZiAobF9jcC0+Y29ycmVjdCkgewotICAgICAgICAgICAgICAgIC8qIGlmIEpQV0wgaXMgb24sIHdlIGNoZWNrIHdoZXRoZXIgVFggZXJyb3JzIGhhdmUgZGFtYWdlZAotICAgICAgICAgICAgICAgICAgICAgICAgdG9vIG11Y2ggdGhlIFNJWiBwYXJhbWV0ZXJzLCBhZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEobF9pbWFnZS0+Y29tcHNbaV0uZHggKiBsX2ltYWdlLT5jb21wc1tpXS5keSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEpQV0xfQVNTVU1FID8gRVZUX1dBUk5JTkcgOiBFVlRfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpQV0w6IGJhZCBYUnNpel8lZC9ZUnNpel8lZCAoJWQgeCAlZClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgaSwgbF9pbWFnZS0+Y29tcHNbaV0uZHgsIGxfaW1hZ2UtPmNvbXBzW2ldLmR5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFKUFdMX0FTU1VNRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJKUFdMOiBnaXZpbmcgdXBcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UgdHJ5IHRvIGNvcnJlY3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiLSB0cnlpbmcgdG8gYWRqdXN0IHRoZW1cbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxfaW1hZ2UtPmNvbXBzW2ldLmR4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9pbWFnZS0+Y29tcHNbaV0uZHggPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIi0gc2V0dGluZyBYUnNpel8lZCB0byAlZCA9PiBIWVBPVEhFU0lTISEhXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgbF9pbWFnZS0+Y29tcHNbaV0uZHgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbF9pbWFnZS0+Y29tcHNbaV0uZHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2ltYWdlLT5jb21wc1tpXS5keSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiLSBzZXR0aW5nIFlSc2l6XyVkIHRvICVkID0+IEhZUE9USEVTSVMhISFcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBsX2ltYWdlLT5jb21wc1tpXS5keSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYgLyogVVNFX0pQV0wgKi8KLSAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT5yZXNub19kZWNvZGVkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHJlc29sdXRpb24gZGVjb2RlZCAqLwotICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPmZhY3RvciA9IGxfY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWMubV9yZWR1Y2U7IC8qIHJlZHVjaW5nIGZhY3RvciBwZXIgY29tcG9uZW50ICovCi0gICAgICAgICAgICAgICAgKytsX2ltZ19jb21wOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHRpbGVzICovCi0gICAgICAgIGxfY3AtPnR3ID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpKGxfaW1hZ2UtPngxIC0gbF9jcC0+dHgwKSwgKE9QSl9JTlQzMilsX2NwLT50ZHgpOwotICAgICAgICBsX2NwLT50aCA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKShsX2ltYWdlLT55MSAtIGxfY3AtPnR5MCksIChPUEpfSU5UMzIpbF9jcC0+dGR5KTsKLQotICAgICAgICAvKiBDaGVjayB0aGF0IHRoZSBudW1iZXIgb2YgdGlsZXMgaXMgdmFsaWQgKi8KLSAgICAgICAgaWYgKGxfY3AtPnR3ID09IDAgfHwgbF9jcC0+dGggPT0gMCB8fCBsX2NwLT50dyA+IDY1NTM1IC8gbF9jcC0+dGgpIHsKLSAgICAgICAgICAgIG9wal9ldmVudF9tc2coICBwX21hbmFnZXIsIEVWVF9FUlJPUiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgbnVtYmVyIG9mIHRpbGVzIDogJXUgeCAldSAobWF4aW11bSBmaXhlZCBieSBqcGVnMjAwMCBub3JtIGlzIDY1NTM1IHRpbGVzKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NwLT50dywgbF9jcC0+dGgpOwotICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICBsX25iX3RpbGVzID0gbF9jcC0+dHcgKiBsX2NwLT50aDsKLQotICAgICAgICAvKiBEZWZpbmUgdGhlIHRpbGVzIHdoaWNoIHdpbGwgYmUgZGVjb2RlZCAqLwotICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGlzY2FyZF90aWxlcykgewotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXJ0X3RpbGVfeCA9IChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3ggLSBsX2NwLT50eDApIC8gbF9jcC0+dGR4OwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXJ0X3RpbGVfeSA9IChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3kgLSBsX2NwLT50eTApIC8gbF9jcC0+dGR5OwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2VuZF90aWxlX3ggPSAoT1BKX1VJTlQzMilvcGpfaW50X2NlaWxkaXYoKE9QSl9JTlQzMikocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeCAtIGxfY3AtPnR4MCksIChPUEpfSU5UMzIpbF9jcC0+dGR4KTsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9lbmRfdGlsZV95ID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2VuZF90aWxlX3kgLSBsX2NwLT50eTApLCAoT1BKX0lOVDMyKWxfY3AtPnRkeSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhcnRfdGlsZV94ID0gMDsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3kgPSAwOwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2VuZF90aWxlX3ggPSBsX2NwLT50dzsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9lbmRfdGlsZV95ID0gbF9jcC0+dGg7Ci0gICAgICAgIH0KLQotI2lmZGVmIFVTRV9KUFdMCi0gICAgICAgIGlmIChsX2NwLT5jb3JyZWN0KSB7Ci0gICAgICAgICAgICAgICAgLyogaWYgSlBXTCBpcyBvbiwgd2UgY2hlY2sgd2hldGhlciBUWCBlcnJvcnMgaGF2ZSBkYW1hZ2VkCi0gICAgICAgICAgICAgICAgICB0b28gbXVjaCB0aGUgU0laIHBhcmFtZXRlcnMgKi8KLSAgICAgICAgICAgICAgICBpZiAoKGxfY3AtPnR3IDwgMSkgfHwgKGxfY3AtPnRoIDwgMSkgfHwgKGxfY3AtPnR3ID4gbF9jcC0+bWF4X3RpbGVzKSB8fCAobF9jcC0+dGggPiBsX2NwLT5tYXhfdGlsZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgSlBXTF9BU1NVTUUgPyBFVlRfV0FSTklORyA6IEVWVF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpQV0w6IGJhZCBudW1iZXIgb2YgdGlsZXMgKCVkIHggJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NwLT50dywgbF9jcC0+dGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFKUFdMX0FTU1VNRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSlBXTDogZ2l2aW5nIHVwXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIHRyeSB0byBjb3JyZWN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICItIHRyeWluZyB0byBhZGp1c3QgdGhlbVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9jcC0+dHcgPCAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnR3PSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICItIHNldHRpbmcgJWQgdGlsZXMgaW4geCA9PiBIWVBPVEhFU0lTISEhXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+dHcpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfY3AtPnR3ID4gbF9jcC0+bWF4X3RpbGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnR3PSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICItIHRvbyBsYXJnZSB4LCBpbmNyZWFzZSBleHBlY3RhbmNlIG9mICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0gc2V0dGluZyAlZCB0aWxlcyBpbiB4ID0+IEhZUE9USEVTSVMhISFcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+bWF4X3RpbGVzLCBsX2NwLT50dyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9jcC0+dGggPCAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnRoPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICItIHNldHRpbmcgJWQgdGlsZXMgaW4geSA9PiBIWVBPVEhFU0lTISEhXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+dGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfY3AtPnRoID4gbF9jcC0+bWF4X3RpbGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnRoPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICItIHRvbyBsYXJnZSB5LCBpbmNyZWFzZSBleHBlY3RhbmNlIG9mICVkIHRvIGNvbnRpbnVlXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItIHNldHRpbmcgJWQgdGlsZXMgaW4geSA9PiBIWVBPVEhFU0lTISEhXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPm1heF90aWxlcywgbF9jcC0+dGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotI2VuZGlmIC8qIFVTRV9KUFdMICovCi0KLSAgICAgICAgLyogbWVtb3J5IGFsbG9jYXRpb25zICovCi0gICAgICAgIGxfY3AtPnRjcHMgPSAob3BqX3RjcF90Kikgb3BqX2NhbGxvYyhsX25iX3RpbGVzLCBzaXplb2Yob3BqX3RjcF90KSk7Ci0gICAgICAgIGlmIChsX2NwLT50Y3BzID09IDAwKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHRha2UgaW4gY2hhcmdlIFNJWiBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotI2lmZGVmIFVTRV9KUFdMCi0gICAgICAgIGlmIChsX2NwLT5jb3JyZWN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFsX2NwLT50Y3BzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgSlBXTF9BU1NVTUUgPyBFVlRfV0FSTklORyA6IEVWVF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpQV0w6IGNvdWxkIG5vdCBhbGxvYyB0Y3BzIGZpZWxkIG9mIGNwXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSlBXTF9BU1NVTUUgfHwgSlBXTF9BU1NVTUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkpQV0w6IGdpdmluZyB1cFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0jZW5kaWYgLyogVVNFX0pQV0wgKi8KLQotICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcC0+dGNjcHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgKG9wal90Y2NwX3QqKSBvcGpfY2FsbG9jKGxfaW1hZ2UtPm51bWNvbXBzLCBzaXplb2Yob3BqX3RjY3BfdCkpOwotICAgICAgICBpZihwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcC0+dGNjcHMgID09IDAwKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHRha2UgaW4gY2hhcmdlIFNJWiBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcC0+bV9tY3RfcmVjb3JkcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAob3BqX21jdF9kYXRhX3QqKW9wal9jYWxsb2MoT1BKX0oyS19NQ1RfREVGQVVMVF9OQl9SRUNPUkRTICxzaXplb2Yob3BqX21jdF9kYXRhX3QpKTsKLQotICAgICAgICBpZiAoISBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcC0+bV9tY3RfcmVjb3JkcykgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byB0YWtlIGluIGNoYXJnZSBTSVogbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwLT5tX25iX21heF9tY3RfcmVjb3JkcyA9IE9QSl9KMktfTUNUX0RFRkFVTFRfTkJfUkVDT1JEUzsKLQotICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcC0+bV9tY2NfcmVjb3JkcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAob3BqX3NpbXBsZV9tY2NfZGVjb3JyZWxhdGlvbl9kYXRhX3QqKQotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NhbGxvYyhPUEpfSjJLX01DQ19ERUZBVUxUX05CX1JFQ09SRFMsIHNpemVvZihvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCkpOwotCi0gICAgICAgIGlmICghIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwLT5tX21jY19yZWNvcmRzKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHRha2UgaW4gY2hhcmdlIFNJWiBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzID0gT1BKX0oyS19NQ0NfREVGQVVMVF9OQl9SRUNPUkRTOwotCi0gICAgICAgIC8qIHNldCB1cCBkZWZhdWx0IGRjIGxldmVsIHNoaWZ0ICovCi0gICAgICAgIGZvciAoaT0wO2k8bF9pbWFnZS0+bnVtY29tcHM7KytpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEgbF9pbWFnZS0+Y29tcHNbaV0uc2duZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3AtPnRjY3BzW2ldLm1fZGNfbGV2ZWxfc2hpZnQgPSAxIDw8IChsX2ltYWdlLT5jb21wc1tpXS5wcmVjIC0gMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbF9jdXJyZW50X3RpbGVfcGFyYW0gPSBsX2NwLT50Y3BzOwotICAgICAgICBmb3IgICAgIChpID0gMDsgaSA8IGxfbmJfdGlsZXM7ICsraSkgewotICAgICAgICAgICAgICAgIGxfY3VycmVudF90aWxlX3BhcmFtLT50Y2NwcyA9IChvcGpfdGNjcF90Kikgb3BqX2NhbGxvYyhsX2ltYWdlLT5udW1jb21wcywgc2l6ZW9mKG9wal90Y2NwX3QpKTsKLSAgICAgICAgICAgICAgICBpZiAobF9jdXJyZW50X3RpbGVfcGFyYW0tPnRjY3BzID09IDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gdGFrZSBpbiBjaGFyZ2UgU0laIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X3RpbGVfcGFyYW07Ci0gICAgICAgIH0KLQotICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9ICBKMktfU1RBVEVfTUg7IC8qIEZJWE1FIEoyS19ERUNfU1RBVEVfTUg7ICovCi0gICAgICAgIG9wal9pbWFnZV9jb21wX2hlYWRlcl91cGRhdGUobF9pbWFnZSxsX2NwKTsKLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9CT09MIG9wal9qMmtfd3JpdGVfY29tKCAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9jb21tZW50X3NpemU7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF90b3RhbF9jb21fc2l6ZTsKLSAgICAgICAgY29uc3QgT1BKX0NIQVIgKmxfY29tbWVudDsKLSAgICAgICAgT1BKX0JZVEUgKiBsX2N1cnJlbnRfcHRyID0gMDA7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLQotICAgICAgICBsX2NvbW1lbnQgPSBwX2oyay0+bV9jcC5jb21tZW50OwotICAgICAgICBsX2NvbW1lbnRfc2l6ZSA9IChPUEpfVUlOVDMyKXN0cmxlbihsX2NvbW1lbnQpOwotICAgICAgICBsX3RvdGFsX2NvbV9zaXplID0gbF9jb21tZW50X3NpemUgKyA2OwotCi0gICAgICAgIGlmIChsX3RvdGFsX2NvbV9zaXplID4gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplKSB7Ci0gICAgICAgICAgICAgICAgT1BKX0JZVEUgKm5ld19oZWFkZXJfdGlsZV9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsIGxfdG90YWxfY29tX3NpemUpOwotICAgICAgICAgICAgICAgIGlmICghIG5ld19oZWFkZXJfdGlsZV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byB3cml0ZSB0aGUgQ09NIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gbmV3X2hlYWRlcl90aWxlX2RhdGE7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gbF90b3RhbF9jb21fc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGxfY3VycmVudF9wdHIgPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLEoyS19NU19DT00gLCAyKTsgIC8qIENPTSAqLwotICAgICAgICBsX2N1cnJlbnRfcHRyKz0yOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLGxfdG90YWxfY29tX3NpemUgLSAyICwgMik7ICAgICAgICAvKiBMX0NPTSAqLwotICAgICAgICBsX2N1cnJlbnRfcHRyKz0yOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLDEgLCAyKTsgICAvKiBHZW5lcmFsIHVzZSAoSVMgODg1OS0xNToxOTk5IChMYXRpbikgdmFsdWVzKSAqLwotICAgICAgICBsX2N1cnJlbnRfcHRyKz0yOwotCi0gICAgICAgIG1lbWNweSggbF9jdXJyZW50X3B0cixsX2NvbW1lbnQsbF9jb21tZW50X3NpemUpOwotCi0gICAgICAgIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSxsX3RvdGFsX2NvbV9zaXplLHBfbWFuYWdlcikgIT0gbF90b3RhbF9jb21fc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLS8qKgotICogUmVhZHMgYSBDT00gbWFya2VyIChjb21tZW50cykKLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgQ09NIGJveC4KLSAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBDT00gbWFya2VyLgotICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9jb20gKCAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7Ci0gICh2b2lkKXBfaGVhZGVyX3NpemU7Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi1PUEpfQk9PTCBvcGpfajJrX3dyaXRlX2NvZCggICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKLXsKLSAgICAgICAgb3BqX2NwX3QgKmxfY3AgPSAwMDsKLSAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfY29kZV9zaXplLGxfcmVtYWluaW5nX3NpemU7Ci0gICAgICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotCi0gICAgICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKLSAgICAgICAgbF90Y3AgPSAmbF9jcC0+dGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXTsKLSAgICAgICAgbF9jb2RlX3NpemUgPSA5ICsgb3BqX2oya19nZXRfU1BDb2RfU1BDb2Nfc2l6ZShwX2oyayxwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLDApOwotICAgICAgICBsX3JlbWFpbmluZ19zaXplID0gbF9jb2RlX3NpemU7Ci0KLSAgICAgICAgaWYgKGxfY29kZV9zaXplID4gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplKSB7Ci0gICAgICAgICAgICAgICAgT1BKX0JZVEUgKm5ld19oZWFkZXJfdGlsZV9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsIGxfY29kZV9zaXplKTsKLSAgICAgICAgICAgICAgICBpZiAoISBuZXdfaGVhZGVyX3RpbGVfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gd3JpdGUgQ09EIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gbmV3X2hlYWRlcl90aWxlX2RhdGE7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gbF9jb2RlX3NpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBsX2N1cnJlbnRfZGF0YSA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGE7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLEoyS19NU19DT0QsMik7ICAgICAgICAgICAvKiBDT0QgKi8KLSAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF9jb2RlX3NpemUtMiwyKTsgICAgICAgIC8qIExfQ09EICovCi0gICAgICAgIGxfY3VycmVudF9kYXRhICs9IDI7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfdGNwLT5jc3R5LDEpOyAgICAgICAgICAvKiBTY29kICovCi0gICAgICAgICsrbF9jdXJyZW50X2RhdGE7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfdGNwLT5wcmcsMSk7ICAgICAgICAgICAvKiBTR2NvZCAoQSkgKi8KLSAgICAgICAgKytsX2N1cnJlbnRfZGF0YTsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF90Y3AtPm51bWxheWVycywyKTsgICAgIC8qIFNHY29kIChCKSAqLwotICAgICAgICBsX2N1cnJlbnRfZGF0YSs9MjsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF90Y3AtPm1jdCwxKTsgICAgICAgICAgIC8qIFNHY29kIChDKSAqLwotICAgICAgICArK2xfY3VycmVudF9kYXRhOwotCi0gICAgICAgIGxfcmVtYWluaW5nX3NpemUgLT0gOTsKLQotICAgICAgICBpZiAoISBvcGpfajJrX3dyaXRlX1NQQ29kX1NQQ29jKHBfajJrLHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIsMCxsX2N1cnJlbnRfZGF0YSwmbF9yZW1haW5pbmdfc2l6ZSxwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdyaXRpbmcgQ09EIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsX3JlbWFpbmluZ19zaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd3JpdGluZyBDT0QgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLGxfY29kZV9zaXplLHBfbWFuYWdlcikgIT0gbF9jb2RlX3NpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi0vKioKLSAqIFJlYWRzIGEgQ09EIG1hcmtlciAoQ29kaW5nIFN0eWtlIGRlZmF1bHRzKQotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENPRCBib3guCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENPRCBtYXJrZXIuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX2NvZCAoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgICAgIC8qIGxvb3AgKi8KLSAgICAgICAgT1BKX1VJTlQzMiBpOwotICAgICAgICBPUEpfVUlOVDMyIGxfdG1wOwotICAgICAgICBvcGpfY3BfdCAqbF9jcCA9IDAwOwotICAgICAgICBvcGpfdGNwX3QgKmxfdGNwID0gMDA7Ci0gICAgICAgIG9wal9pbWFnZV90ICpsX2ltYWdlID0gMDA7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotCi0gICAgICAgIGxfaW1hZ2UgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlOwotICAgICAgICBsX2NwID0gJihwX2oyay0+bV9jcCk7Ci0KLSAgICAgICAgLyogSWYgd2UgYXJlIGluIHRoZSBmaXJzdCB0aWxlLXBhcnQgaGVhZGVyIG9mIHRoZSBjdXJyZW50IHRpbGUgKi8KLSAgICAgICAgbF90Y3AgPSAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPT0gSjJLX1NUQVRFX1RQSCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF9jcC0+dGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwOwotCQotICAgICAgICAvKiBPbmx5IG9uZSBDT0QgcGVyIHRpbGUgKi8KLSAgICAgICAgaWYgKGxfdGNwLT5jb2QpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ09EIG1hcmtlciBhbHJlYWR5IHJlYWQuIE5vIG1vcmUgdGhhbiBvbmUgQ09EIG1hcmtlciBwZXIgdGlsZS5cbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgbF90Y3AtPmNvZCA9IDE7Ci0JCi0gICAgICAgIC8qIE1ha2Ugc3VyZSByb29tIGlzIHN1ZmZpY2llbnQgKi8KLSAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCA1KSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgQ09EIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfdGNwLT5jc3R5LDEpOyAgICAgICAgICAgLyogU2NvZCAqLwotICAgICAgICArK3BfaGVhZGVyX2RhdGE7Ci0gICAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBrbm93IGhvdyB0byBkZWNvZGUgdGhpcyAqLwotICAgICAgICBpZiAoKGxfdGNwLT5jc3R5ICYgfihPUEpfVUlOVDMyKShKMktfQ1BfQ1NUWV9QUlQgfCBKMktfQ1BfQ1NUWV9TT1AgfCBKMktfQ1BfQ1NUWV9FUEgpKSAhPSAwVSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJVbmtub3duIFNjb2QgdmFsdWUgaW4gQ09EIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX3RtcCwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0djb2QgKEEpICovCi0gICAgICAgICsrcF9oZWFkZXJfZGF0YTsKLSAgICAgICAgbF90Y3AtPnByZyA9IChPUEpfUFJPR19PUkRFUikgbF90bXA7Ci0gICAgICAgIC8qIE1ha2Ugc3VyZSBwcm9ncmVzc2lvbiBvcmRlciBpcyB2YWxpZCAqLwotICAgICAgICBpZiAobF90Y3AtPnByZyA+IE9QSl9DUFJMICkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJVbmtub3duIHByb2dyZXNzaW9uIG9yZGVyIGluIENPRCBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIGxfdGNwLT5wcmcgPSBPUEpfUFJPR19VTktOT1dOOwotICAgICAgICB9Ci0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfdGNwLT5udW1sYXllcnMsMik7ICAgICAgLyogU0djb2QgKEIpICovCi0gICAgICAgIHBfaGVhZGVyX2RhdGErPTI7Ci0JCi0gICAgICAgIGlmICgobF90Y3AtPm51bWxheWVycyA8IDFVKSB8fCAobF90Y3AtPm51bWxheWVycyA+IDY1NTM1VSkpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSW52YWxpZCBudW1iZXIgb2YgbGF5ZXJzIGluIENPRCBtYXJrZXIgOiAlZCBub3QgaW4gcmFuZ2UgWzEtNjU1MzVdXG4iLCBsX3RjcC0+bnVtbGF5ZXJzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSWYgdXNlciBkaWRuJ3Qgc2V0IGEgbnVtYmVyIGxheWVyIHRvIGRlY29kZSB0YWtlIHRoZSBtYXggc3BlY2lmeSBpbiB0aGUgY29kZXN0cmVhbS4gKi8KLSAgICAgICAgaWYgICAgICAobF9jcC0+bV9zcGVjaWZpY19wYXJhbS5tX2RlYy5tX2xheWVyKSB7Ci0gICAgICAgICAgICAgICAgbF90Y3AtPm51bV9sYXllcnNfdG9fZGVjb2RlID0gbF9jcC0+bV9zcGVjaWZpY19wYXJhbS5tX2RlYy5tX2xheWVyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGxfdGNwLT5udW1fbGF5ZXJzX3RvX2RlY29kZSA9IGxfdGNwLT5udW1sYXllcnM7Ci0gICAgICAgIH0KLQotICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX3RjcC0+bWN0LDEpOyAgICAgICAgICAgIC8qIFNHY29kIChDKSAqLwotICAgICAgICArK3BfaGVhZGVyX2RhdGE7Ci0KLSAgICAgICAgcF9oZWFkZXJfc2l6ZSAtPSA1OwotICAgICAgICBmb3IgICAgIChpID0gMDsgaSA8IGxfaW1hZ2UtPm51bWNvbXBzOyArK2kpIHsKLSAgICAgICAgICAgICAgICBsX3RjcC0+dGNjcHNbaV0uY3N0eSA9IGxfdGNwLT5jc3R5ICYgSjJLX0NDUF9DU1RZX1BSVDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghIG9wal9qMmtfcmVhZF9TUENvZF9TUENvYyhwX2oyaywwLHBfaGVhZGVyX2RhdGEsJnBfaGVhZGVyX3NpemUscF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIENPRCBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocF9oZWFkZXJfc2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgQ09EIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFwcGx5IHRoZSBjb2Rpbmcgc3R5bGUgdG8gb3RoZXIgY29tcG9uZW50cyBvZiB0aGUgY3VycmVudCB0aWxlIG9yIHRoZSBtX2RlZmF1bHRfdGNwKi8KLSAgICAgICAgb3BqX2oya19jb3B5X3RpbGVfY29tcG9uZW50X3BhcmFtZXRlcnMocF9qMmspOwotCi0gICAgICAgIC8qIEluZGV4ICovCi0jaWZkZWYgV0lQX1JFTU9WRV9NU0QKLSAgICAgICAgaWYgKHBfajJrLT5jc3RyX2luZm8pIHsKLSAgICAgICAgICAgICAgICAvKm9wal9jb2Rlc3RyZWFtX2luZm9fdCAqbF9jc3RyX2luZm8gPSBwX2oyay0+Y3N0cl9pbmZvOyovCi0gICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5mby0+cHJvZyA9IGxfdGNwLT5wcmc7Ci0gICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5mby0+bnVtbGF5ZXJzID0gbF90Y3AtPm51bWxheWVyczsKLSAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmZvLT5udW1kZWNvbXBvcyA9IChPUEpfSU5UMzIqKSBvcGpfbWFsbG9jKGxfaW1hZ2UtPm51bWNvbXBzICogc2l6ZW9mKE9QSl9VSU5UMzIpKTsKLSAgICAgICAgICAgICAgICBmb3IgICAgIChpID0gMDsgaSA8IGxfaW1hZ2UtPm51bWNvbXBzOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPm51bWRlY29tcG9zW2ldID0gbF90Y3AtPnRjY3BzW2ldLm51bXJlc29sdXRpb25zIC0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotI2lmIDAKLU9QSl9CT09MIG9wal9qMmtfd3JpdGVfY29jKCBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQotewotICAgICAgICBPUEpfVUlOVDMyIGxfY29jX3NpemUsbF9yZW1haW5pbmdfc2l6ZTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2NvbXBfcm9vbTsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotCi0gICAgICAgIGxfY29tcF9yb29tID0gKHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzIDw9IDI1NikgPyAxIDogMjsKLQotICAgICAgICBsX2NvY19zaXplID0gNSArIGxfY29tcF9yb29tICsgb3BqX2oya19nZXRfU1BDb2RfU1BDb2Nfc2l6ZShwX2oyayxwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLHBfY29tcF9ubyk7Ci0KLSAgICAgICAgaWYgKGxfY29jX3NpemUgPiBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUpIHsKLSAgICAgICAgICAgICAgICBPUEpfQllURSAqbmV3X2hlYWRlcl90aWxlX2RhdGE7Ci0gICAgICAgICAgICAgICAgLypwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICA9IChPUEpfQllURSopb3BqX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY29jX3NpemUpOyovCi0KLSAgICAgICAgICAgICAgICBuZXdfaGVhZGVyX3RpbGVfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfcmVhbGxvYyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLCBsX2NvY19zaXplKTsKLSAgICAgICAgICAgICAgICBpZiAoISBuZXdfaGVhZGVyX3RpbGVfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gd3JpdGUgQ09DIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gbmV3X2hlYWRlcl90aWxlX2RhdGE7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gbF9jb2Nfc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIG9wal9qMmtfd3JpdGVfY29jX2luX21lbW9yeShwX2oyayxwX2NvbXBfbm8scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwmbF9yZW1haW5pbmdfc2l6ZSxwX21hbmFnZXIpOwotCi0gICAgICAgIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSxsX2NvY19zaXplLHBfbWFuYWdlcikgIT0gbF9jb2Nfc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0jZW5kaWYKLQotI2lmIDAKLXZvaWQgb3BqX2oya193cml0ZV9jb2NfaW5fbWVtb3J5KCAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29tcF9ubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgICAgIG9wal9jcF90ICpsX2NwID0gMDA7Ci0gICAgICAgIG9wal90Y3BfdCAqbF90Y3AgPSAwMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2NvY19zaXplLGxfcmVtYWluaW5nX3NpemU7Ci0gICAgICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKLSAgICAgICAgb3BqX2ltYWdlX3QgKmxfaW1hZ2UgPSAwMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2NvbXBfcm9vbTsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotCi0gICAgICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKLSAgICAgICAgbF90Y3AgPSAmbF9jcC0+dGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXTsKLSAgICAgICAgbF9pbWFnZSA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2U7Ci0gICAgICAgIGxfY29tcF9yb29tID0gKGxfaW1hZ2UtPm51bWNvbXBzIDw9IDI1NikgPyAxIDogMjsKLQotICAgICAgICBsX2NvY19zaXplID0gNSArIGxfY29tcF9yb29tICsgb3BqX2oya19nZXRfU1BDb2RfU1BDb2Nfc2l6ZShwX2oyayxwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLHBfY29tcF9ubyk7Ci0gICAgICAgIGxfcmVtYWluaW5nX3NpemUgPSBsX2NvY19zaXplOwotCi0gICAgICAgIGxfY3VycmVudF9kYXRhID0gcF9kYXRhOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxKMktfTVNfQ09DLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENPQyAqLwotICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX2NvY19zaXplLTIsMik7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExfQ09DICovCi0gICAgICAgIGxfY3VycmVudF9kYXRhICs9IDI7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLHBfY29tcF9ubywgbF9jb21wX3Jvb20pOyAgICAgICAgIC8qIENjb2MgKi8KLSAgICAgICAgbF9jdXJyZW50X2RhdGErPWxfY29tcF9yb29tOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgbF90Y3AtPnRjY3BzW3BfY29tcF9ub10uY3N0eSwgMSk7ICAgICAgICAgICAgICAgLyogU2NvYyAqLwotICAgICAgICArK2xfY3VycmVudF9kYXRhOwotCi0gICAgICAgIGxfcmVtYWluaW5nX3NpemUgLT0gKDUgKyBsX2NvbXBfcm9vbSk7Ci0gICAgICAgIG9wal9qMmtfd3JpdGVfU1BDb2RfU1BDb2MocF9qMmsscF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciwwLGxfY3VycmVudF9kYXRhLCZsX3JlbWFpbmluZ19zaXplLHBfbWFuYWdlcik7Ci0gICAgICAgICogcF9kYXRhX3dyaXR0ZW4gPSBsX2NvY19zaXplOwotfQotI2VuZGlmCi0KLU9QSl9VSU5UMzIgb3BqX2oya19nZXRfbWF4X2NvY19zaXplKG9wal9qMmtfdCAqcF9qMmspCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgaSxqOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfY29tcDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX3RpbGVzOwotICAgICAgICBPUEpfVUlOVDMyIGxfbWF4ID0gMDsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0KLSAgICAgICAgbF9uYl90aWxlcyA9IHBfajJrLT5tX2NwLnR3ICogcF9qMmstPm1fY3AudGggOwotICAgICAgICBsX25iX2NvbXAgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wczsKLQotICAgICAgICBmb3IgKGk9MDtpPGxfbmJfdGlsZXM7KytpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChqPTA7ajxsX25iX2NvbXA7KytqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX21heCA9IG9wal91aW50X21heChsX21heCxvcGpfajJrX2dldF9TUENvZF9TUENvY19zaXplKHBfajJrLGksaikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiA2ICsgbF9tYXg7Ci19Ci0KLS8qKgotICogUmVhZHMgYSBDT0MgbWFya2VyIChDb2RpbmcgU3R5bGUgQ29tcG9uZW50KQotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENPQyBib3guCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENPQyBtYXJrZXIuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX2NvYyAoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgICAgIG9wal9jcF90ICpsX2NwID0gTlVMTDsKLSAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IE5VTEw7Ci0gICAgICAgIG9wal9pbWFnZV90ICpsX2ltYWdlID0gTlVMTDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2NvbXBfcm9vbTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2NvbXBfbm87Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotCi0gICAgICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKLSAgICAgICAgbF90Y3AgPSAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPT0gSjJLX1NUQVRFX1RQSCApID8gLypGSVhNRSBKMktfREVDX1NUQVRFX1RQSCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX2NwLT50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3A7Ci0gICAgICAgIGxfaW1hZ2UgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlOwotCi0gICAgICAgIGxfY29tcF9yb29tID0gbF9pbWFnZS0+bnVtY29tcHMgPD0gMjU2ID8gMSA6IDI7Ci0KLSAgICAgICAgLyogbWFrZSBzdXJlIHJvb20gaXMgc3VmZmljaWVudCovCi0gICAgICAgIGlmIChwX2hlYWRlcl9zaXplIDwgbF9jb21wX3Jvb20gKyAxKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgQ09DIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICBwX2hlYWRlcl9zaXplIC09IGxfY29tcF9yb29tICsgMTsKLQotICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX2NvbXBfbm8sbF9jb21wX3Jvb20pOyAgICAgICAgICAgICAgICAgICAvKiBDY29jICovCi0gICAgICAgIHBfaGVhZGVyX2RhdGEgKz0gbF9jb21wX3Jvb207Ci0gICAgICAgIGlmIChsX2NvbXBfbm8gPj0gbF9pbWFnZS0+bnVtY29tcHMpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBDT0MgbWFya2VyIChiYWQgbnVtYmVyIG9mIGNvbXBvbmVudHMpXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF90Y3AtPnRjY3BzW2xfY29tcF9ub10uY3N0eSwxKTsgICAgICAgICAgICAgICAgICAvKiBTY29jICovCi0gICAgICAgICsrcF9oZWFkZXJfZGF0YSA7Ci0KLSAgICAgICAgaWYgKCEgb3BqX2oya19yZWFkX1NQQ29kX1NQQ29jKHBfajJrLGxfY29tcF9ubyxwX2hlYWRlcl9kYXRhLCZwX2hlYWRlcl9zaXplLHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBDT0MgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgIT0gMCkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIENPQyBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi1PUEpfQk9PTCBvcGpfajJrX3dyaXRlX3FjZCggICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAgICAgICBPUEpfVUlOVDMyIGxfcWNkX3NpemUsbF9yZW1haW5pbmdfc2l6ZTsKLSAgICAgICAgT1BKX0JZVEUgKiBsX2N1cnJlbnRfZGF0YSA9IDAwOwotCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7Ci0KLSAgICAgICAgbF9xY2Rfc2l6ZSA9IDQgKyBvcGpfajJrX2dldF9TUWNkX1NRY2Nfc2l6ZShwX2oyayxwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLDApOwotICAgICAgICBsX3JlbWFpbmluZ19zaXplID0gbF9xY2Rfc2l6ZTsKLQotICAgICAgICBpZiAobF9xY2Rfc2l6ZSA+IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSkgewotICAgICAgICAgICAgICAgIE9QSl9CWVRFICpuZXdfaGVhZGVyX3RpbGVfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfcmVhbGxvYyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLCBsX3FjZF9zaXplKTsKLSAgICAgICAgICAgICAgICBpZiAoISBuZXdfaGVhZGVyX3RpbGVfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gd3JpdGUgUUNEIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gbmV3X2hlYWRlcl90aWxlX2RhdGE7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gbF9xY2Rfc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGxfY3VycmVudF9kYXRhID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YTsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsSjJLX01TX1FDRCwyKTsgICAgICAgICAgIC8qIFFDRCAqLwotICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX3FjZF9zaXplLTIsMik7ICAgICAgICAgLyogTF9RQ0QgKi8KLSAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKLQotICAgICAgICBsX3JlbWFpbmluZ19zaXplIC09IDQ7Ci0KLSAgICAgICAgaWYgKCEgb3BqX2oya193cml0ZV9TUWNkX1NRY2MocF9qMmsscF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciwwLGxfY3VycmVudF9kYXRhLCZsX3JlbWFpbmluZ19zaXplLHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd3JpdGluZyBRQ0QgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxfcmVtYWluaW5nX3NpemUgIT0gMCkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciB3cml0aW5nIFFDRCBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKHBfc3RyZWFtLCBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLGxfcWNkX3NpemUscF9tYW5hZ2VyKSAhPSBsX3FjZF9zaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotLyoqCi0gKiBSZWFkcyBhIFFDRCBtYXJrZXIgKFF1YW50aXphdGlvbiBkZWZhdWx0cykKLSAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9kYXRhICAgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBRQ0QgYm94LgotICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KLSAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBRQ0QgbWFya2VyLgotICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9xY2QgKCAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0KLSAgICAgICAgaWYgKCEgb3BqX2oya19yZWFkX1NRY2RfU1FjYyhwX2oyaywwLHBfaGVhZGVyX2RhdGEsJnBfaGVhZGVyX3NpemUscF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFFDRCBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocF9oZWFkZXJfc2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUUNEIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFwcGx5IHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVycyB0byBvdGhlciBjb21wb25lbnRzIG9mIHRoZSBjdXJyZW50IHRpbGUgb3IgdGhlIG1fZGVmYXVsdF90Y3AgKi8KLSAgICAgICAgb3BqX2oya19jb3B5X3RpbGVfcXVhbnRpemF0aW9uX3BhcmFtZXRlcnMocF9qMmspOwotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotI2lmIDAKLU9QSl9CT09MIG9wal9qMmtfd3JpdGVfcWNjKCAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAgICAgICBPUEpfVUlOVDMyIGxfcWNjX3NpemUsbF9yZW1haW5pbmdfc2l6ZTsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotCi0gICAgICAgIGxfcWNjX3NpemUgPSA1ICsgb3BqX2oya19nZXRfU1FjZF9TUWNjX3NpemUocF9qMmsscF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcixwX2NvbXBfbm8pOwotICAgICAgICBsX3FjY19zaXplICs9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzIDw9IDI1NiA/IDA6MTsKLSAgICAgICAgbF9yZW1haW5pbmdfc2l6ZSA9IGxfcWNjX3NpemU7Ci0KLSAgICAgICAgaWYgKGxfcWNjX3NpemUgPiBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUpIHsKLSAgICAgICAgICAgICAgICBPUEpfQllURSAqbmV3X2hlYWRlcl90aWxlX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwgbF9xY2Nfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCEgbmV3X2hlYWRlcl90aWxlX2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHdyaXRlIFFDQyBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IG5ld19oZWFkZXJfdGlsZV9kYXRhOwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IGxfcWNjX3NpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBvcGpfajJrX3dyaXRlX3FjY19pbl9tZW1vcnkocF9qMmsscF9jb21wX25vLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsJmxfcmVtYWluaW5nX3NpemUscF9tYW5hZ2VyKTsKLQotICAgICAgICBpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKHBfc3RyZWFtLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsbF9xY2Nfc2l6ZSxwX21hbmFnZXIpICE9IGxfcWNjX3NpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotI2VuZGlmCi0KLSNpZiAwCi12b2lkIG9wal9qMmtfd3JpdGVfcWNjX2luX21lbW9yeSggICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3FjY19zaXplLGxfcmVtYWluaW5nX3NpemU7Ci0gICAgICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotCi0gICAgICAgIGxfcWNjX3NpemUgPSA2ICsgb3BqX2oya19nZXRfU1FjZF9TUWNjX3NpemUocF9qMmsscF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcixwX2NvbXBfbm8pOwotICAgICAgICBsX3JlbWFpbmluZ19zaXplID0gbF9xY2Nfc2l6ZTsKLQotICAgICAgICBsX2N1cnJlbnRfZGF0YSA9IHBfZGF0YTsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsSjJLX01TX1FDQywyKTsgICAgICAgICAgIC8qIFFDQyAqLwotICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOwotCi0gICAgICAgIGlmIChwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wcyA8PSAyNTYpIHsKLSAgICAgICAgICAgICAgICAtLWxfcWNjX3NpemU7Ci0KLSAgICAgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF9xY2Nfc2l6ZS0yLDIpOyAgICAgICAgIC8qIExfUUNDICovCi0gICAgICAgICAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKLQotICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgcF9jb21wX25vLCAxKTsgIC8qIENxY2MgKi8KLSAgICAgICAgICAgICAgICArK2xfY3VycmVudF9kYXRhOwotCi0gICAgICAgICAgICAgICAgLyogaW4gdGhlIGNhc2Ugb25seSBvbmUgYnl0ZSBpcyBzdWZmaWNpZW50IHRoZSBsYXN0IGJ5dGUgYWxsb2NhdGVkIGlzIHVzZWxlc3MgLT4gc3RpbGwgZG8gLTYgZm9yIGF2YWlsYWJsZSAqLwotICAgICAgICAgICAgICAgIGxfcmVtYWluaW5nX3NpemUgLT0gNjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF9xY2Nfc2l6ZS0yLDIpOyAgICAgICAgIC8qIExfUUNDICovCi0gICAgICAgICAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKLQotICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgcF9jb21wX25vLCAyKTsgIC8qIENxY2MgKi8KLSAgICAgICAgICAgICAgICBsX2N1cnJlbnRfZGF0YSs9MjsKLQotICAgICAgICAgICAgICAgIGxfcmVtYWluaW5nX3NpemUgLT0gNjsKLSAgICAgICAgfQotCi0gICAgICAgIG9wal9qMmtfd3JpdGVfU1FjZF9TUWNjKHBfajJrLHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIscF9jb21wX25vLGxfY3VycmVudF9kYXRhLCZsX3JlbWFpbmluZ19zaXplLHBfbWFuYWdlcik7Ci0KLSAgICAgICAgKnBfZGF0YV93cml0dGVuID0gbF9xY2Nfc2l6ZTsKLX0KLSNlbmRpZgotCi1PUEpfVUlOVDMyIG9wal9qMmtfZ2V0X21heF9xY2Nfc2l6ZSAob3BqX2oya190ICpwX2oyaykKLXsKLSAgICAgICAgcmV0dXJuIG9wal9qMmtfZ2V0X21heF9jb2Nfc2l6ZShwX2oyayk7Ci19Ci0KLS8qKgotICogUmVhZHMgYSBRQ0MgbWFya2VyIChRdWFudGl6YXRpb24gY29tcG9uZW50KQotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFFDQyBib3guCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFFDQyBtYXJrZXIuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3FjYyggICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9udW1fY29tcCxsX2NvbXBfbm87Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotCi0gICAgICAgIGxfbnVtX2NvbXAgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wczsKLQotICAgICAgICBpZiAobF9udW1fY29tcCA8PSAyNTYpIHsKLSAgICAgICAgICAgICAgICBpZiAocF9oZWFkZXJfc2l6ZSA8IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFFDQyBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9jb21wX25vLDEpOwotICAgICAgICAgICAgICAgICsrcF9oZWFkZXJfZGF0YTsKLSAgICAgICAgICAgICAgICAtLXBfaGVhZGVyX3NpemU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBRQ0MgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfY29tcF9ubywyKTsKLSAgICAgICAgICAgICAgICBwX2hlYWRlcl9kYXRhKz0yOwotICAgICAgICAgICAgICAgIHBfaGVhZGVyX3NpemUtPTI7Ci0gICAgICAgIH0KLQotI2lmZGVmIFVTRV9KUFdMCi0gICAgICAgIGlmIChwX2oyay0+bV9jcC5jb3JyZWN0KSB7Ci0KLSAgICAgICAgICAgICAgICBzdGF0aWMgT1BKX1VJTlQzMiBiYWNrdXBfY29tcG5vID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIGNvbXBubyBpcyBuZWdhdGl2ZSBvciBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMhISEgKi8KLSAgICAgICAgICAgICAgICBpZiAoLyoobF9jb21wX25vIDwgMCkgfHwqLyAobF9jb21wX25vID49IGxfbnVtX2NvbXApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSlBXTDogYmFkIGNvbXBvbmVudCBudW1iZXIgaW4gUUNDICglZCBvdXQgb2YgYSBtYXhpbXVtIG9mICVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jb21wX25vLCBsX251bV9jb21wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSlBXTF9BU1NVTUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkpQV0w6IGdpdmluZyB1cFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSB0cnkgdG8gY29ycmVjdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbF9jb21wX25vID0gYmFja3VwX2NvbXBubyAlIGxfbnVtX2NvbXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICItIHRyeWluZyB0byBhZGp1c3QgdGhpc1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLSBzZXR0aW5nIGNvbXBvbmVudCBudW1iZXIgdG8gJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY29tcF9ubyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoga2VlcCB5b3VyIHByaXZhdGUgY291bnQgb2YgdGlsZXMgKi8KLSAgICAgICAgICAgICAgICBiYWNrdXBfY29tcG5vKys7Ci0gICAgICAgIH07Ci0jZW5kaWYgLyogVVNFX0pQV0wgKi8KLQotICAgICAgICBpZiAobF9jb21wX25vID49IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGNvbXBvbmVudCBudW1iZXI6ICVkLCByZWdhcmRpbmcgdGhlIG51bWJlciBvZiBjb21wb25lbnRzICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jb21wX25vLCBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghIG9wal9qMmtfcmVhZF9TUWNkX1NRY2MocF9qMmssbF9jb21wX25vLHBfaGVhZGVyX2RhdGEsJnBfaGVhZGVyX3NpemUscF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFFDQyBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocF9oZWFkZXJfc2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUUNDIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX0JPT0wgb3BqX2oya193cml0ZV9wb2MoICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX2NvbXA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl9wb2M7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9wb2Nfc2l6ZTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3dyaXR0ZW5fc2l6ZSA9IDA7Ci0gICAgICAgIG9wal90Y3BfdCAqbF90Y3AgPSAwMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3BvY19yb29tOwotCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7Ci0KLSAgICAgICAgbF90Y3AgPSAmcF9qMmstPm1fY3AudGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXTsKLSAgICAgICAgbF9uYl9jb21wID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHM7Ci0gICAgICAgIGxfbmJfcG9jID0gMSArIGxfdGNwLT5udW1wb2NzOwotCi0gICAgICAgIGlmIChsX25iX2NvbXAgPD0gMjU2KSB7Ci0gICAgICAgICAgICAgICAgbF9wb2Nfcm9vbSA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbF9wb2Nfcm9vbSA9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgbF9wb2Nfc2l6ZSA9IDQgKyAoNSArIDIgKiBsX3BvY19yb29tKSAqIGxfbmJfcG9jOwotCi0gICAgICAgIGlmIChsX3BvY19zaXplID4gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplKSB7Ci0gICAgICAgICAgICAgICAgT1BKX0JZVEUgKm5ld19oZWFkZXJfdGlsZV9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsIGxfcG9jX3NpemUpOwotICAgICAgICAgICAgICAgIGlmICghIG5ld19oZWFkZXJfdGlsZV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byB3cml0ZSBQT0MgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBuZXdfaGVhZGVyX3RpbGVfZGF0YTsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSBsX3BvY19zaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgb3BqX2oya193cml0ZV9wb2NfaW5fbWVtb3J5KHBfajJrLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsJmxfd3JpdHRlbl9zaXplLHBfbWFuYWdlcik7Ci0KLSAgICAgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLGxfcG9jX3NpemUscF9tYW5hZ2VyKSAhPSBsX3BvY19zaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotdm9pZCBvcGpfajJrX3dyaXRlX3BvY19pbl9tZW1vcnkoICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgT1BKX0JZVEUgKiBsX2N1cnJlbnRfZGF0YSA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfY29tcDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX3BvYzsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3BvY19zaXplOwotICAgICAgICBvcGpfaW1hZ2VfdCAqbF9pbWFnZSA9IDAwOwotICAgICAgICBvcGpfdGNwX3QgKmxfdGNwID0gMDA7Ci0gICAgICAgIG9wal90Y2NwX3QgKmxfdGNjcCA9IDAwOwotICAgICAgICBvcGpfcG9jX3QgKmxfY3VycmVudF9wb2MgPSAwMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3BvY19yb29tOwotCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0KLSAgICAgICAgbF90Y3AgPSAmcF9qMmstPm1fY3AudGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXTsKLSAgICAgICAgbF90Y2NwID0gJmxfdGNwLT50Y2Nwc1swXTsKLSAgICAgICAgbF9pbWFnZSA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2U7Ci0gICAgICAgIGxfbmJfY29tcCA9IGxfaW1hZ2UtPm51bWNvbXBzOwotICAgICAgICBsX25iX3BvYyA9IDEgKyBsX3RjcC0+bnVtcG9jczsKLQotICAgICAgICBpZiAobF9uYl9jb21wIDw9IDI1NikgewotICAgICAgICAgICAgICAgIGxfcG9jX3Jvb20gPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGxfcG9jX3Jvb20gPSAyOwotICAgICAgICB9Ci0KLSAgICAgICAgbF9wb2Nfc2l6ZSA9IDQgKyAoNSArIDIgKiBsX3BvY19yb29tKSAqIGxfbmJfcG9jOwotCi0gICAgICAgIGxfY3VycmVudF9kYXRhID0gcF9kYXRhOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxKMktfTVNfUE9DLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUE9DICAqLwotICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX3BvY19zaXplLTIsMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTHBvYyAqLwotICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOwotCi0gICAgICAgIGxfY3VycmVudF9wb2MgPSAgbF90Y3AtPnBvY3M7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsX25iX3BvYzsgKytpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfY3VycmVudF9wb2MtPnJlc25vMCwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJTcG9jX2kgKi8KLSAgICAgICAgICAgICAgICArK2xfY3VycmVudF9kYXRhOwotCi0gICAgICAgICAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfY3VycmVudF9wb2MtPmNvbXBubzAsbF9wb2Nfcm9vbSk7ICAgICAgICAgICAgICAvKiBDU3BvY19pICovCi0gICAgICAgICAgICAgICAgbF9jdXJyZW50X2RhdGErPWxfcG9jX3Jvb207Ci0KLSAgICAgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF9jdXJyZW50X3BvYy0+bGF5bm8xLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTFlFcG9jX2kgKi8KLSAgICAgICAgICAgICAgICBsX2N1cnJlbnRfZGF0YSs9MjsKLQotICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX2N1cnJlbnRfcG9jLT5yZXNubzEsMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSRXBvY19pICovCi0gICAgICAgICAgICAgICAgKytsX2N1cnJlbnRfZGF0YTsKLQotICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX2N1cnJlbnRfcG9jLT5jb21wbm8xLGxfcG9jX3Jvb20pOyAgICAgICAgICAgICAgLyogQ0Vwb2NfaSAqLwotICAgICAgICAgICAgICAgIGxfY3VycmVudF9kYXRhKz1sX3BvY19yb29tOwotCi0gICAgICAgICAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfY3VycmVudF9wb2MtPnByZywxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBwb2NfaSAqLwotICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X2RhdGE7Ci0KLSAgICAgICAgICAgICAgICAvKiBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBtYXggbGF5ZXIgYWNjb3JkaW5nIHRvIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGxheWVycyBpbiB0aGUgZmlsZSwgY29tcG9uZW50cyBhbmQgcmVzb2x1dGlvbnMqLwotICAgICAgICAgICAgICAgIGxfY3VycmVudF9wb2MtPmxheW5vMSA9IChPUEpfVUlOVDMyKW9wal9pbnRfbWluKChPUEpfSU5UMzIpbF9jdXJyZW50X3BvYy0+bGF5bm8xLCAoT1BKX0lOVDMyKWxfdGNwLT5udW1sYXllcnMpOwotICAgICAgICAgICAgICAgIGxfY3VycmVudF9wb2MtPnJlc25vMSA9IChPUEpfVUlOVDMyKW9wal9pbnRfbWluKChPUEpfSU5UMzIpbF9jdXJyZW50X3BvYy0+cmVzbm8xLCAoT1BKX0lOVDMyKWxfdGNjcC0+bnVtcmVzb2x1dGlvbnMpOwotICAgICAgICAgICAgICAgIGxfY3VycmVudF9wb2MtPmNvbXBubzEgPSAoT1BKX1VJTlQzMilvcGpfaW50X21pbigoT1BKX0lOVDMyKWxfY3VycmVudF9wb2MtPmNvbXBubzEsIChPUEpfSU5UMzIpbF9uYl9jb21wKTsKLQotICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X3BvYzsKLSAgICAgICAgfQotCi0gICAgICAgICpwX2RhdGFfd3JpdHRlbiA9IGxfcG9jX3NpemU7Ci19Ci0KLU9QSl9VSU5UMzIgb3BqX2oya19nZXRfbWF4X3BvY19zaXplKG9wal9qMmtfdCAqcF9qMmspCi17Ci0gICAgICAgIG9wal90Y3BfdCAqIGxfdGNwID0gMDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl90aWxlcyA9IDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9tYXhfcG9jID0gMDsKLSAgICAgICAgT1BKX1VJTlQzMiBpOwotCi0gICAgICAgIGxfdGNwID0gcF9qMmstPm1fY3AudGNwczsKLSAgICAgICAgbF9uYl90aWxlcyA9IHBfajJrLT5tX2NwLnRoICogcF9qMmstPm1fY3AudHc7Ci0KLSAgICAgICAgZm9yIChpPTA7aTxsX25iX3RpbGVzOysraSkgewotICAgICAgICAgICAgICAgIGxfbWF4X3BvYyA9IG9wal91aW50X21heChsX21heF9wb2MsbF90Y3AtPm51bXBvY3MpOwotICAgICAgICAgICAgICAgICsrbF90Y3A7Ci0gICAgICAgIH0KLQotICAgICAgICArK2xfbWF4X3BvYzsKLQotICAgICAgICByZXR1cm4gNCArIDkgKiBsX21heF9wb2M7Ci19Ci0KLU9QSl9VSU5UMzIgb3BqX2oya19nZXRfbWF4X3RvY19zaXplIChvcGpfajJrX3QgKnBfajJrKQotewotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl90aWxlczsKLSAgICAgICAgT1BKX1VJTlQzMiBsX21heCA9IDA7Ci0gICAgICAgIG9wal90Y3BfdCAqIGxfdGNwID0gMDA7Ci0KLSAgICAgICAgbF90Y3AgPSBwX2oyay0+bV9jcC50Y3BzOwotICAgICAgICBsX25iX3RpbGVzID0gcF9qMmstPm1fY3AudHcgKiBwX2oyay0+bV9jcC50aCA7Ci0KLSAgICAgICAgZm9yIChpPTA7aTxsX25iX3RpbGVzOysraSkgewotICAgICAgICAgICAgICAgIGxfbWF4ID0gb3BqX3VpbnRfbWF4KGxfbWF4LGxfdGNwLT5tX25iX3RpbGVfcGFydHMpOwotCi0gICAgICAgICAgICAgICAgKytsX3RjcDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAxMiAqIGxfbWF4OwotfQotCi1PUEpfVUlOVDMyIG9wal9qMmtfZ2V0X3NwZWNpZmljX2hlYWRlcl9zaXplcyhvcGpfajJrX3QgKnBfajJrKQotewotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfYnl0ZXMgPSAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfY29tcHM7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9jb2NfYnl0ZXMsbF9xY2NfYnl0ZXM7Ci0KLSAgICAgICAgbF9uYl9jb21wcyA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzIC0gMTsKLSAgICAgICAgbF9uYl9ieXRlcyArPSBvcGpfajJrX2dldF9tYXhfdG9jX3NpemUocF9qMmspOwotCi0gICAgICAgIGlmICghKE9QSl9JU19DSU5FTUEocF9qMmstPm1fY3AucnNpeikpKSB7Ci0gICAgICAgICAgICAgICAgbF9jb2NfYnl0ZXMgPSBvcGpfajJrX2dldF9tYXhfY29jX3NpemUocF9qMmspOwotICAgICAgICAgICAgICAgIGxfbmJfYnl0ZXMgKz0gbF9uYl9jb21wcyAqIGxfY29jX2J5dGVzOwotCi0gICAgICAgICAgICAgICAgbF9xY2NfYnl0ZXMgPSBvcGpfajJrX2dldF9tYXhfcWNjX3NpemUocF9qMmspOwotICAgICAgICAgICAgICAgIGxfbmJfYnl0ZXMgKz0gbF9uYl9jb21wcyAqIGxfcWNjX2J5dGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgbF9uYl9ieXRlcyArPSBvcGpfajJrX2dldF9tYXhfcG9jX3NpemUocF9qMmspOwotCi0gICAgICAgIC8qKiogREVWRUxPUEVSIENPUk5FUiwgQWRkIHJvb20gZm9yIHlvdXIgaGVhZGVycyAqKiovCi0KLSAgICAgICAgcmV0dXJuIGxfbmJfYnl0ZXM7Ci19Ci0KLS8qKgotICogUmVhZHMgYSBQT0MgbWFya2VyIChQcm9ncmVzc2lvbiBPcmRlciBDaGFuZ2UpCi0gKgotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFBPQyBib3guCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFBPQyBtYXJrZXIuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3BvYyAoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgaSwgbF9uYl9jb21wLCBsX3RtcDsKLSAgICAgICAgb3BqX2ltYWdlX3QgKiBsX2ltYWdlID0gMDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9vbGRfcG9jX25iLCBsX2N1cnJlbnRfcG9jX25iLCBsX2N1cnJlbnRfcG9jX3JlbWFpbmluZzsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2NodW5rX3NpemUsIGxfY29tcF9yb29tOwotCi0gICAgICAgIG9wal9jcF90ICpsX2NwID0gMDA7Ci0gICAgICAgIG9wal90Y3BfdCAqbF90Y3AgPSAwMDsKLSAgICAgICAgb3BqX3BvY190ICpsX2N1cnJlbnRfcG9jID0gMDA7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotCi0gICAgICAgIGxfaW1hZ2UgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlOwotICAgICAgICBsX25iX2NvbXAgPSBsX2ltYWdlLT5udW1jb21wczsKLSAgICAgICAgaWYgKGxfbmJfY29tcCA8PSAyNTYpIHsKLSAgICAgICAgICAgICAgICBsX2NvbXBfcm9vbSA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbF9jb21wX3Jvb20gPSAyOwotICAgICAgICB9Ci0gICAgICAgIGxfY2h1bmtfc2l6ZSA9IDUgKyAyICogbF9jb21wX3Jvb207Ci0gICAgICAgIGxfY3VycmVudF9wb2NfbmIgPSBwX2hlYWRlcl9zaXplIC8gbF9jaHVua19zaXplOwotICAgICAgICBsX2N1cnJlbnRfcG9jX3JlbWFpbmluZyA9IHBfaGVhZGVyX3NpemUgJSBsX2NodW5rX3NpemU7Ci0KLSAgICAgICAgaWYgKChsX2N1cnJlbnRfcG9jX25iIDw9IDApIHx8IChsX2N1cnJlbnRfcG9jX3JlbWFpbmluZyAhPSAwKSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFBPQyBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBsX2NwID0gJihwX2oyay0+bV9jcCk7Ci0gICAgICAgIGxfdGNwID0gKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IEoyS19TVEFURV9UUEgpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfY3AtPnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0gOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcDsKLSAgICAgICAgbF9vbGRfcG9jX25iID0gbF90Y3AtPlBPQyA/IGxfdGNwLT5udW1wb2NzICsgMSA6IDA7Ci0gICAgICAgIGxfY3VycmVudF9wb2NfbmIgKz0gbF9vbGRfcG9jX25iOwotCi0gICAgICAgIGlmKGxfY3VycmVudF9wb2NfbmIgPj0gMzIpCi0gICAgICAgICAgewotICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJUb28gbWFueSBQT0NzICVkXG4iLCBsX2N1cnJlbnRfcG9jX25iKTsKLSAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgIH0KLSAgICAgICAgYXNzZXJ0KGxfY3VycmVudF9wb2NfbmIgPCAzMik7Ci0KLSAgICAgICAgLyogbm93IHBvYyBpcyBpbiB1c2UuKi8KLSAgICAgICAgbF90Y3AtPlBPQyA9IDE7Ci0KLSAgICAgICAgbF9jdXJyZW50X3BvYyA9ICZsX3RjcC0+cG9jc1tsX29sZF9wb2NfbmJdOwotICAgICAgICBmb3IgICAgIChpID0gbF9vbGRfcG9jX25iOyBpIDwgbF9jdXJyZW50X3BvY19uYjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmKGxfY3VycmVudF9wb2MtPnJlc25vMCksMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJTcG9jX2kgKi8KLSAgICAgICAgICAgICAgICArK3BfaGVhZGVyX2RhdGE7Ci0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmKGxfY3VycmVudF9wb2MtPmNvbXBubzApLGxfY29tcF9yb29tKTsgICAgLyogQ1Nwb2NfaSAqLwotICAgICAgICAgICAgICAgIHBfaGVhZGVyX2RhdGErPWxfY29tcF9yb29tOwotICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJihsX2N1cnJlbnRfcG9jLT5sYXlubzEpLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMWUVwb2NfaSAqLwotICAgICAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSBsYXllciBlbmQgaXMgaW4gYWNjZXB0YWJsZSBib3VuZHMgKi8KLSAgICAgICAgICAgICAgICBsX2N1cnJlbnRfcG9jLT5sYXlubzEgPSBvcGpfdWludF9taW4obF9jdXJyZW50X3BvYy0+bGF5bm8xLCBsX3RjcC0+bnVtbGF5ZXJzKTsKLSAgICAgICAgICAgICAgICBwX2hlYWRlcl9kYXRhKz0yOwotICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJihsX2N1cnJlbnRfcG9jLT5yZXNubzEpLDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSRXBvY19pICovCi0gICAgICAgICAgICAgICAgKytwX2hlYWRlcl9kYXRhOwotICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJihsX2N1cnJlbnRfcG9jLT5jb21wbm8xKSxsX2NvbXBfcm9vbSk7ICAgIC8qIENFcG9jX2kgKi8KLSAgICAgICAgICAgICAgICBwX2hlYWRlcl9kYXRhKz1sX2NvbXBfcm9vbTsKLSAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX3RtcCwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBwb2NfaSAqLwotICAgICAgICAgICAgICAgICsrcF9oZWFkZXJfZGF0YTsKLSAgICAgICAgICAgICAgICBsX2N1cnJlbnRfcG9jLT5wcmcgPSAoT1BKX1BST0dfT1JERVIpIGxfdG1wOwotICAgICAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSBjb21wIGlzIGluIGFjY2VwdGFibGUgYm91bmRzICovCi0gICAgICAgICAgICAgICAgbF9jdXJyZW50X3BvYy0+Y29tcG5vMSA9IG9wal91aW50X21pbihsX2N1cnJlbnRfcG9jLT5jb21wbm8xLCBsX25iX2NvbXApOwotICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X3BvYzsKLSAgICAgICAgfQotCi0gICAgICAgIGxfdGNwLT5udW1wb2NzID0gbF9jdXJyZW50X3BvY19uYiAtIDE7Ci0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotLyoqCi0gKiBSZWFkcyBhIENSRyBtYXJrZXIgKENvbXBvbmVudCByZWdpc3RyYXRpb24pCi0gKgotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFRMTSBib3guCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFRMTSBtYXJrZXIuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX2NyZyAoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl9jb21wOwotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0KLSAgICAgICAgbF9uYl9jb21wID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHM7Ci0KLSAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgIT0gbF9uYl9jb21wICo0KSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgQ1JHIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICAvKiBEbyBub3QgY2FyZSBvZiB0aGlzIGF0IHRoZSBtb21lbnQgc2luY2Ugb25seSBsb2NhbCB2YXJpYWJsZXMgYXJlIHNldCBoZXJlICovCi0gICAgICAgIC8qCi0gICAgICAgIGZvcgotICAgICAgICAgICAgICAgIChpID0gMDsgaSA8IGxfbmJfY29tcDsgKytpKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9YY3JnX2ksMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWGNyZ19pCi0gICAgICAgICAgICAgICAgcF9oZWFkZXJfZGF0YSs9MjsKLSAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX1ljcmdfaSwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYY3JnX2kKLSAgICAgICAgICAgICAgICBwX2hlYWRlcl9kYXRhKz0yOwotICAgICAgICB9Ci0gICAgICAgICovCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotLyoqCi0gKiBSZWFkcyBhIFRMTSBtYXJrZXIgKFRpbGUgTGVuZ3RoIE1hcmtlcikKLSAqCi0gKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgVExNIGJveC4KLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgVExNIG1hcmtlci4KLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfdGxtICggIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICAgICAgT1BKX1VJTlQzMiBsX1p0bG0sIGxfU3RsbSwgbF9TVCwgbF9TUCwgbF90b3RfbnVtX3RwX3JlbWFpbmluZywgbF9xdW90aWVudCwgbF9QdGxtX3NpemU7Ci0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLQotICAgICAgICBpZiAocF9oZWFkZXJfc2l6ZSA8IDIpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBUTE0gbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIHBfaGVhZGVyX3NpemUgLT0gMjsKLQotICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX1p0bG0sMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBadGxtICovCi0gICAgICAgICsrcF9oZWFkZXJfZGF0YTsKLSAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9TdGxtLDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RsbSAqLwotICAgICAgICArK3BfaGVhZGVyX2RhdGE7Ci0KLSAgICAgICAgbF9TVCA9ICgobF9TdGxtID4+IDQpICYgMHgzKTsKLSAgICAgICAgbF9TUCA9IChsX1N0bG0gPj4gNikgJiAweDE7Ci0KLSAgICAgICAgbF9QdGxtX3NpemUgPSAobF9TUCArIDEpICogMjsKLSAgICAgICAgbF9xdW90aWVudCA9IGxfUHRsbV9zaXplICsgbF9TVDsKLQotICAgICAgICBsX3RvdF9udW1fdHBfcmVtYWluaW5nID0gcF9oZWFkZXJfc2l6ZSAlIGxfcXVvdGllbnQ7Ci0KLSAgICAgICAgaWYgKGxfdG90X251bV90cF9yZW1haW5pbmcgIT0gMCkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFRMTSBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRklYTUUgRG8gbm90IGNhcmUgb2YgdGhpcyBhdCB0aGUgbW9tZW50IHNpbmNlIG9ubHkgbG9jYWwgdmFyaWFibGVzIGFyZSBzZXQgaGVyZSAqLwotICAgICAgICAvKgotICAgICAgICBmb3IKLSAgICAgICAgICAgICAgICAoaSA9IDA7IGkgPCBsX3RvdF9udW1fdHA7ICsraSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfVHRsbV9pLGxfU1QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR0bG1faQotICAgICAgICAgICAgICAgIHBfaGVhZGVyX2RhdGEgKz0gbF9TVDsKLSAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX1B0bG1faSxsX1B0bG1fc2l6ZSk7ICAgICAgICAgICAgLy8gUHRsbV9pCi0gICAgICAgICAgICAgICAgcF9oZWFkZXJfZGF0YSArPSBsX1B0bG1fc2l6ZTsKLSAgICAgICAgfSovCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotLyoqCi0gKiBSZWFkcyBhIFBMTSBtYXJrZXIgKFBhY2tldCBsZW5ndGgsIG1haW4gaGVhZGVyIG1hcmtlcikKLSAqCi0gKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgVExNIGJveC4KLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgVExNIG1hcmtlci4KLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfcGxtICggIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotCi0gICAgICAgIGlmIChwX2hlYWRlcl9zaXplIDwgMSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFBMTSBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRG8gbm90IGNhcmUgb2YgdGhpcyBhdCB0aGUgbW9tZW50IHNpbmNlIG9ubHkgbG9jYWwgdmFyaWFibGVzIGFyZSBzZXQgaGVyZSAqLwotICAgICAgICAvKgotICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX1pwbG0sMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFpwbG0KLSAgICAgICAgKytwX2hlYWRlcl9kYXRhOwotICAgICAgICAtLXBfaGVhZGVyX3NpemU7Ci0KLSAgICAgICAgd2hpbGUKLSAgICAgICAgICAgICAgICAocF9oZWFkZXJfc2l6ZSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX05wbG0sMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOcGxtCi0gICAgICAgICAgICAgICAgKytwX2hlYWRlcl9kYXRhOwotICAgICAgICAgICAgICAgIHBfaGVhZGVyX3NpemUgLT0gKDErbF9OcGxtKTsKLSAgICAgICAgICAgICAgICBpZgotICAgICAgICAgICAgICAgICAgICAgICAgKHBfaGVhZGVyX3NpemUgPCAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFBMTSBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIChpID0gMDsgaSA8IGxfTnBsbTsgKytpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfdG1wLDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcGxtX2lqCi0gICAgICAgICAgICAgICAgICAgICAgICArK3BfaGVhZGVyX2RhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWtlIG9ubHkgdGhlIGxhc3Qgc2V2ZW4gYnl0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfcGFja2V0X2xlbiB8PSAobF90bXAgJiAweDdmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsX3RtcCAmIDB4ODApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfcGFja2V0X2xlbiA8PD0gNzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBzdG9yZSBwYWNrZXQgbGVuZ3RoIGFuZCBwcm9jZWVkIHRvIG5leHQgcGFja2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfcGFja2V0X2xlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAobF9wYWNrZXRfbGVuICE9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUExNIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICovCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotLyoqCi0gKiBSZWFkcyBhIFBMVCBtYXJrZXIgKFBhY2tldCBsZW5ndGgsIHRpbGUtcGFydCBoZWFkZXIpCi0gKgotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFBMVCBib3guCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFBMVCBtYXJrZXIuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3BsdCAoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9acGx0LCBsX3RtcCwgbF9wYWNrZXRfbGVuID0gMCwgaTsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0KLSAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCAxKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUExUIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfWnBsdCwxKTsgICAgICAgICAgICAgICAgLyogWnBsdCAqLwotICAgICAgICArK3BfaGVhZGVyX2RhdGE7Ci0gICAgICAgIC0tcF9oZWFkZXJfc2l6ZTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcF9oZWFkZXJfc2l6ZTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF90bXAsMSk7ICAgICAgICAgLyogSXBsdF9paiAqLwotICAgICAgICAgICAgICAgICsrcF9oZWFkZXJfZGF0YTsKLSAgICAgICAgICAgICAgICAvKiB0YWtlIG9ubHkgdGhlIGxhc3Qgc2V2ZW4gYnl0ZXMgKi8KLSAgICAgICAgICAgICAgICBsX3BhY2tldF9sZW4gfD0gKGxfdG1wICYgMHg3Zik7Ci0gICAgICAgICAgICAgICAgaWYgKGxfdG1wICYgMHg4MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbF9wYWNrZXRfbGVuIDw8PSA3OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qIHN0b3JlIHBhY2tldCBsZW5ndGggYW5kIHByb2NlZWQgdG8gbmV4dCBwYWNrZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGxfcGFja2V0X2xlbiA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxfcGFja2V0X2xlbiAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUExUIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotI2lmIDAKLU9QSl9CT09MIGoya19yZWFkX3BwbV92MiAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0KLSAgICAgICAgb3BqX2NwX3QgKmxfY3AgPSAwMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3JlbWFpbmluZ19kYXRhLCBsX1pfcHBtLCBsX05fcHBtOwotCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLQotICAgICAgICBpZiAocF9oZWFkZXJfc2l6ZSA8IDEpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBQUE0gbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOwotICAgICAgICBsX2NwLT5wcG0gPSAxOwotCi0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfWl9wcG0sMSk7ICAgICAgICAgICAgICAgLyogWl9wcG0gKi8KLSAgICAgICAgKytwX2hlYWRlcl9kYXRhOwotICAgICAgICAtLXBfaGVhZGVyX3NpemU7Ci0KLSAgICAgICAgLyogRmlyc3QgUFBNIG1hcmtlciAqLwotICAgICAgICBpZiAobF9aX3BwbSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCA0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBQUE0gbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9OX3BwbSw0KTsgICAgICAgICAgICAgICAvKiBOX3BwbSAqLwotICAgICAgICAgICAgICAgIHBfaGVhZGVyX2RhdGErPTQ7Ci0gICAgICAgICAgICAgICAgcF9oZWFkZXJfc2l6ZS09NDsKLQotICAgICAgICAgICAgICAgIC8qIEZpcnN0IFBQTSBtYXJrZXI6IEluaXRpYWxpemF0aW9uICovCi0gICAgICAgICAgICAgICAgbF9jcC0+cHBtX2xlbiA9IGxfTl9wcG07Ci0gICAgICAgICAgICAgICAgbF9jcC0+cHBtX2RhdGFfc2l6ZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICBsX2NwLT5wcG1fYnVmZmVyID0gKE9QSl9CWVRFICopIG9wal9tYWxsb2MobF9jcC0+cHBtX2xlbik7Ci0gICAgICAgICAgICAgICAgaWYgKGxfY3AtPnBwbV9idWZmZXIgPT0gMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSByZWFkaW5nIHBwbSBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtc2V0KGxfY3AtPnBwbV9idWZmZXIsMCxsX2NwLT5wcG1fbGVuKTsKLQotICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9kYXRhID0gbF9jcC0+cHBtX2J1ZmZlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxfY3AtPnBwbV9kYXRhX3NpemUgPT0gbF9jcC0+cHBtX2xlbikgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPj0gNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkIGEgTl9wcG0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9OX3BwbSw0KTsgICAgICAgICAgICAgICAvKiBOX3BwbSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2hlYWRlcl9kYXRhKz00OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2hlYWRlcl9zaXplLT00OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NwLT5wcG1fbGVuICs9IGxfTl9wcG0gOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpuZXdfcHBtX2J1ZmZlciA9IChPUEpfQllURSAqKSBvcGpfcmVhbGxvYyhsX2NwLT5wcG1fYnVmZmVyLCBsX2NwLT5wcG1fbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmV3X3BwbV9idWZmZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2NwLT5wcG1fYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NwLT5wcG1fYnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NwLT5wcG1fbGVuID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NwLT5wcG1fZGF0YSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHJlYWRpbmcgcHBtIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NwLT5wcG1fYnVmZmVyID0gbmV3X3BwbV9idWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChsX2NwLT5wcG1fYnVmZmVyK2xfY3AtPnBwbV9kYXRhX3NpemUsMCxsX05fcHBtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+cHBtX2RhdGEgPSBsX2NwLT5wcG1fYnVmZmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbF9yZW1haW5pbmdfZGF0YSA9IGxfY3AtPnBwbV9sZW4gLSBsX2NwLT5wcG1fZGF0YV9zaXplOwotCi0gICAgICAgICAgICAgICAgaWYgKGxfcmVtYWluaW5nX2RhdGEgPD0gcF9oZWFkZXJfc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UgbXVzdCBzdG9yZSBsZXNzIGluZm9ybWF0aW9uIHRoYW4gYXZhaWxhYmxlIGluIHRoZSBwYWNrZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShsX2NwLT5wcG1fYnVmZmVyICsgbF9jcC0+cHBtX2RhdGFfc2l6ZSAsIHBfaGVhZGVyX2RhdGEgLCBsX3JlbWFpbmluZ19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9kYXRhX3NpemUgPSBsX2NwLT5wcG1fbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9oZWFkZXJfc2l6ZSAtPSBsX3JlbWFpbmluZ19kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9oZWFkZXJfZGF0YSArPSBsX3JlbWFpbmluZ19kYXRhOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShsX2NwLT5wcG1fYnVmZmVyICsgbF9jcC0+cHBtX2RhdGFfc2l6ZSAsIHBfaGVhZGVyX2RhdGEgLCBwX2hlYWRlcl9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9kYXRhX3NpemUgKz0gcF9oZWFkZXJfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfaGVhZGVyX2RhdGEgKz0gcF9oZWFkZXJfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfaGVhZGVyX3NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotI2VuZGlmCi0KLU9QSl9CT09MIGoya19yZWFkX3BwbV92MyAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgICAgIG9wal9jcF90ICpsX2NwID0gMDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9yZW1haW5pbmdfZGF0YSwgbF9aX3BwbSwgbF9OX3BwbTsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0KLSAgICAgICAgLyogTWluaW11bSBzaXplIG9mIFBQTSBtYXJrZXIgaXMgZXF1YWwgdG8gdGhlIHNpemUgb2YgWnBwbSBlbGVtZW50ICovCi0gICAgICAgIGlmIChwX2hlYWRlcl9zaXplIDwgMSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFBQTSBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBsX2NwID0gJihwX2oyay0+bV9jcCk7Ci0gICAgICAgIGxfY3AtPnBwbSA9IDE7Ci0KLSAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9aX3BwbSwxKTsgICAgICAgICAgICAgICAvKiBaX3BwbSAqLwotICAgICAgICArK3BfaGVhZGVyX2RhdGE7Ci0gICAgICAgIC0tcF9oZWFkZXJfc2l6ZTsKLQotICAgICAgICAvKiBGaXJzdCBQUE0gbWFya2VyICovCi0gICAgICAgIGlmIChsX1pfcHBtID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAobF9jcC0+cHBtX2RhdGEgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlpwcG0gTyBhbHJlYWR5IHByb2Nlc3NlZC4gRm91bmQgdHdpY2UuXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3AtPnBwbV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9kYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9idWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+cHBtID0gMDsgLyogZG8gbm90IHVzZSBQUE0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgbm93IGF0IGxlYXN0IHRoZSBOcHBtXjAgZWxlbWVudCAqLwotICAgICAgICAgICAgICAgIGlmIChwX2hlYWRlcl9zaXplIDwgNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUFBNIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfTl9wcG0sNCk7ICAgICAgICAgICAgICAgLyogRmlyc3QgTl9wcG0gKi8KLSAgICAgICAgICAgICAgICBwX2hlYWRlcl9kYXRhKz00OwotICAgICAgICAgICAgICAgIHBfaGVhZGVyX3NpemUtPTQ7Ci0KLSAgICAgICAgICAgICAgICAvKiBzYW5pdHkgY2hlY2s6IGhvdyBtdWNoIGJ5dGVzIGlzIGxlZnQgZm9yIElwcG0gKi8KLSAgICAgICAgICAgICAgICBpZiggcF9oZWFkZXJfc2l6ZSA8IGxfTl9wcG0gKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggYnl0ZXMgKCV1KSB0byBob2xkIElwcG0gc2VyaWVzICgldSksIEluZGV4ICglZClcbiIsIHBfaGVhZGVyX3NpemUsIGxfTl9wcG0sIGxfWl9wcG0gKTsKLSAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3AtPnBwbV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9kYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9idWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgbF9jcC0+cHBtID0gMDsgLyogZG8gbm90IHVzZSBQUE0gKi8KLSAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBGaXJzdCBQUE0gbWFya2VyOiBJbml0aWFsaXphdGlvbiAqLwotICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9sZW4gPSBsX05fcHBtOwotICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9kYXRhX3JlYWQgPSAwOwotCi0gICAgICAgICAgICAgICAgbF9jcC0+cHBtX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX2NhbGxvYygxLGxfY3AtPnBwbV9sZW4pOwotICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9idWZmZXIgPSBsX2NwLT5wcG1fZGF0YTsKLSAgICAgICAgICAgICAgICBpZiAobF9jcC0+cHBtX2RhdGEgPT0gMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIHBwbSBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsX2NwLT5wcG1fZGF0YV9jdXJyZW50ID0gbF9jcC0+cHBtX2RhdGE7Ci0KLSAgICAgICAgICAgICAgICAvKmxfY3AtPnBwbV9kYXRhID0gbF9jcC0+cHBtX2J1ZmZlcjsqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChwX2hlYWRlcl9zaXplIDwgNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiRW1wdHkgUFBNIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogVW5jb21wbGV0ZWQgSXBwbSBzZXJpZXMgaW4gdGhlIHByZXZpb3VzIFBQTSBtYXJrZXI/Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2NwLT5wcG1fZGF0YV9yZWFkIDwgbF9jcC0+cHBtX2xlbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHBsYWNlIHdoZXJlIGFkZCB0aGUgcmVtYWluaW5nIElwcG0gc2VyaWVzKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+cHBtX2RhdGFfY3VycmVudCA9ICYobF9jcC0+cHBtX2RhdGFbbF9jcC0+cHBtX2RhdGFfcmVhZF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX05fcHBtID0gbF9jcC0+cHBtX2xlbiAtIGxfY3AtPnBwbV9kYXRhX3JlYWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKm5ld19wcG1fZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9OX3BwbSw0KTsgICAgICAgICAgICAgICAvKiBGaXJzdCBOX3BwbSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2hlYWRlcl9kYXRhKz00OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2hlYWRlcl9zaXplLT00OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNhbml0eSBjaGVjazogaG93IG11Y2ggYnl0ZXMgaXMgbGVmdCBmb3IgSXBwbSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggcF9oZWFkZXJfc2l6ZSA8IGxfTl9wcG0gKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBieXRlcyAoJXUpIHRvIGhvbGQgSXBwbSBzZXJpZXMgKCV1KSwgSW5kZXggKCVkKVxuIiwgcF9oZWFkZXJfc2l6ZSwgbF9OX3BwbSwgbF9aX3BwbSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3AtPnBwbV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NwLT5wcG1fZGF0YSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+cHBtX2J1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+cHBtID0gMDsgLyogZG8gbm90IHVzZSBQUE0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jcmVhc2UgdGhlIHNpemUgb2YgcHBtX2RhdGEgdG8gYWRkIHRoZSBuZXcgSXBwbSBzZXJpZXMqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQobF9jcC0+cHBtX2RhdGEgPT0gbF9jcC0+cHBtX2J1ZmZlciAmJiAiV2UgbmVlZCBwcG1fZGF0YSBhbmQgcHBtX2J1ZmZlciB0byBiZSB0aGUgc2FtZSB3aGVuIHJlYWxsb2NhdGluZyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfcHBtX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MobF9jcC0+cHBtX2RhdGEsIGxfY3AtPnBwbV9sZW4gKyBsX05fcHBtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmV3X3BwbV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jcC0+cHBtX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9kYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NwLT5wcG1fYnVmZmVyID0gTlVMTDsgIC8qIFRPRE86IG5vIG5lZWQgZm9yIGEgbmV3IGxvY2FsIHZhcmlhYmxlOiBwcG1fYnVmZmVyIGFuZCBwcG1fZGF0YSBhcmUgZW5vdWdoICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+cHBtX2xlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGluY3JlYXNlIHRoZSBzaXplIG9mIHBwbV9kYXRhIHRvIGFkZCB0aGUgbmV3IElwcG0gc2VyaWVzXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9kYXRhID0gbmV3X3BwbV9kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NwLT5wcG1fYnVmZmVyID0gbF9jcC0+cHBtX2RhdGE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogS2VlcCB0aGUgcG9zaXRpb24gb2YgdGhlIHBsYWNlIHdoZXJlIGNvbmNhdGVuYXRlIHRoZSBuZXcgc2VyaWVzKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+cHBtX2RhdGFfY3VycmVudCA9ICYobF9jcC0+cHBtX2RhdGFbbF9jcC0+cHBtX2xlbl0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NwLT5wcG1fbGVuICs9IGxfTl9wcG07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbF9yZW1haW5pbmdfZGF0YSA9IHBfaGVhZGVyX3NpemU7Ci0KLSAgICAgICAgd2hpbGUgKGxfcmVtYWluaW5nX2RhdGEgPj0gbF9OX3BwbSkgewotICAgICAgICAgICAgICAgIC8qIHJlYWQgYSBjb21wbGV0ZSBJcHBtIHNlcmllcyovCi0gICAgICAgICAgICAgICAgbWVtY3B5KGxfY3AtPnBwbV9kYXRhX2N1cnJlbnQsIHBfaGVhZGVyX2RhdGEsIGxfTl9wcG0pOwotICAgICAgICAgICAgICAgIHBfaGVhZGVyX3NpemUgLT0gbF9OX3BwbTsKLSAgICAgICAgICAgICAgICBwX2hlYWRlcl9kYXRhICs9IGxfTl9wcG07Ci0KLSAgICAgICAgICAgICAgICBsX2NwLT5wcG1fZGF0YV9yZWFkICs9IGxfTl9wcG07IC8qIEluY3JlYXNlIHRoZSBudW1iZXIgb2YgZGF0YSByZWFkKi8KLQotICAgICAgICAgICAgICAgIGlmIChwX2hlYWRlcl9zaXplKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwX2hlYWRlcl9zaXplIDwgNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2NwLT5wcG1fZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9kYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+cHBtX2J1ZmZlciA9IE5VTEw7ICAvKiBUT0RPOiBubyBuZWVkIGZvciBhIG5ldyBsb2NhbCB2YXJpYWJsZTogcHBtX2J1ZmZlciBhbmQgcHBtX2RhdGEgYXJlIGVub3VnaCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NwLT5wcG1fbGVuID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+cHBtID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUFBNIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX05fcHBtLDQpOyAgICAgICAgICAgICAgIC8qIE5fcHBtXmkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBfaGVhZGVyX2RhdGErPTQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2hlYWRlcl9zaXplLT00OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfcmVtYWluaW5nX2RhdGEgPSBwX2hlYWRlcl9zaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbF9yZW1haW5pbmdfZGF0YSA9IHBfaGVhZGVyX3NpemU7Ci0KLSAgICAgICAgICAgICAgICAvKiBOZXh0IElwcG0gc2VyaWVzIGlzIGEgY29tcGxldGUgc2VyaWVzID8qLwotICAgICAgICAgICAgICAgIGlmIChsX3JlbWFpbmluZ19kYXRhID49IGxfTl9wcG0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpuZXdfcHBtX2RhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNyZWFzZSB0aGUgc2l6ZSBvZiBwcG1fZGF0YSB0byBhZGQgdGhlIG5ldyBJcHBtIHNlcmllcyovCi0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQobF9jcC0+cHBtX2RhdGEgPT0gbF9jcC0+cHBtX2J1ZmZlciAmJiAiV2UgbmVlZCBwcG1fZGF0YSBhbmQgcHBtX2J1ZmZlciB0byBiZSB0aGUgc2FtZSB3aGVuIHJlYWxsb2NhdGluZyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogT3ZlcmZsb3cgY2hlY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobF9jcC0+cHBtX2xlbiArIGxfTl9wcG0pIDwgbF9OX3BwbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2NwLT5wcG1fZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9kYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+cHBtX2J1ZmZlciA9IE5VTEw7ICAvKiBUT0RPOiBubyBuZWVkIGZvciBhIG5ldyBsb2NhbCB2YXJpYWJsZTogcHBtX2J1ZmZlciBhbmQgcHBtX2RhdGEgYXJlIGVub3VnaCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NwLT5wcG1fbGVuID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGluY3JlYXNlIHRoZSBzaXplIG9mIHBwbV9kYXRhIHRvIGFkZCB0aGUgbmV3IChjb21wbGV0ZSkgSXBwbSBzZXJpZXNcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3BwbV9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKGxfY3AtPnBwbV9kYXRhLCBsX2NwLT5wcG1fbGVuICsgbF9OX3BwbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBuZXdfcHBtX2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jcC0+cHBtX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NwLT5wcG1fZGF0YSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9idWZmZXIgPSBOVUxMOyAgLyogVE9ETzogbm8gbmVlZCBmb3IgYSBuZXcgbG9jYWwgdmFyaWFibGU6IHBwbV9idWZmZXIgYW5kIHBwbV9kYXRhIGFyZSBlbm91Z2ggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+cHBtX2xlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBpbmNyZWFzZSB0aGUgc2l6ZSBvZiBwcG1fZGF0YSB0byBhZGQgdGhlIG5ldyAoY29tcGxldGUpIElwcG0gc2VyaWVzXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9kYXRhID0gbmV3X3BwbV9kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+cHBtX2J1ZmZlciA9IGxfY3AtPnBwbV9kYXRhOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBLZWVwIHRoZSBwb3NpdGlvbiBvZiB0aGUgcGxhY2Ugd2hlcmUgY29uY2F0ZW5hdGUgdGhlIG5ldyBzZXJpZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9kYXRhX2N1cnJlbnQgPSAmKGxfY3AtPnBwbV9kYXRhW2xfY3AtPnBwbV9sZW5dKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9sZW4gKz0gbF9OX3BwbTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIE5lZWQgdG8gcmVhZCBhbiBpbmNvbXBsZXRlIElwcG0gc2VyaWVzKi8KLSAgICAgICAgaWYgKGxfcmVtYWluaW5nX2RhdGEpIHsKLSAgICAgICAgICAgICAgICBPUEpfQllURSAqbmV3X3BwbV9kYXRhOwotICAgICAgICAgICAgICAgIGFzc2VydChsX2NwLT5wcG1fZGF0YSA9PSBsX2NwLT5wcG1fYnVmZmVyICYmICJXZSBuZWVkIHBwbV9kYXRhIGFuZCBwcG1fYnVmZmVyIHRvIGJlIHRoZSBzYW1lIHdoZW4gcmVhbGxvY2F0aW5nIik7Ci0KLSAgICAgICAgICAgICAgICAvKiBPdmVyZmxvdyBjaGVjayAqLwotICAgICAgICAgICAgICAgIGlmICgobF9jcC0+cHBtX2xlbiArIGxfTl9wcG0pIDwgbF9OX3BwbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jcC0+cHBtX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+cHBtX2RhdGEgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+cHBtX2J1ZmZlciA9IE5VTEw7ICAvKiBUT0RPOiBubyBuZWVkIGZvciBhIG5ldyBsb2NhbCB2YXJpYWJsZTogcHBtX2J1ZmZlciBhbmQgcHBtX2RhdGEgYXJlIGVub3VnaCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+cHBtX2xlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gaW5jcmVhc2UgdGhlIHNpemUgb2YgcHBtX2RhdGEgdG8gYWRkIHRoZSBuZXcgKGNvbXBsZXRlKSBJcHBtIHNlcmllc1xuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZXdfcHBtX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MobF9jcC0+cHBtX2RhdGEsIGxfY3AtPnBwbV9sZW4gKyBsX05fcHBtKTsKLSAgICAgICAgICAgICAgICBpZiAoISBuZXdfcHBtX2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3AtPnBwbV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9kYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9idWZmZXIgPSBOVUxMOyAgLyogVE9ETzogbm8gbmVlZCBmb3IgYSBuZXcgbG9jYWwgdmFyaWFibGU6IHBwbV9idWZmZXIgYW5kIHBwbV9kYXRhIGFyZSBlbm91Z2ggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9sZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGluY3JlYXNlIHRoZSBzaXplIG9mIHBwbV9kYXRhIHRvIGFkZCB0aGUgbmV3IChpbmNvbXBsZXRlKSBJcHBtIHNlcmllc1xuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsX2NwLT5wcG1fZGF0YSA9IG5ld19wcG1fZGF0YTsKLSAgICAgICAgICAgICAgICBsX2NwLT5wcG1fYnVmZmVyID0gbF9jcC0+cHBtX2RhdGE7Ci0KLSAgICAgICAgICAgICAgICAvKiBLZWVwIHRoZSBwb3NpdGlvbiBvZiB0aGUgcGxhY2Ugd2hlcmUgY29uY2F0ZW5hdGUgdGhlIG5ldyBzZXJpZXMqLwotICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9kYXRhX2N1cnJlbnQgPSAmKGxfY3AtPnBwbV9kYXRhW2xfY3AtPnBwbV9sZW5dKTsKLSAgICAgICAgICAgICAgICBsX2NwLT5wcG1fbGVuICs9IGxfTl9wcG07Ci0KLSAgICAgICAgICAgICAgICAvKiBSZWFkIGluY29tcGxldGUgSXBwbSBzZXJpZXMqLwotICAgICAgICAgICAgICAgIG1lbWNweShsX2NwLT5wcG1fZGF0YV9jdXJyZW50LCBwX2hlYWRlcl9kYXRhLCBsX3JlbWFpbmluZ19kYXRhKTsKLSAgICAgICAgICAgICAgICBwX2hlYWRlcl9zaXplIC09IGxfcmVtYWluaW5nX2RhdGE7Ci0gICAgICAgICAgICAgICAgcF9oZWFkZXJfZGF0YSArPSBsX3JlbWFpbmluZ19kYXRhOwotCi0gICAgICAgICAgICAgICAgbF9jcC0+cHBtX2RhdGFfcmVhZCArPSBsX3JlbWFpbmluZ19kYXRhOyAvKiBJbmNyZWFzZSB0aGUgbnVtYmVyIG9mIGRhdGEgcmVhZCovCi0gICAgICAgIH0KLQotI2lmZGVmIENMRUFOX01TRAotCi0gICAgICAgICAgICAgICAgaWYgKGxfY3AtPnBwbV9kYXRhX3NpemUgPT0gbF9jcC0+cHBtX2xlbikgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPj0gNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkIGEgTl9wcG0qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX05fcHBtLDQpOyAgICAgICAgICAgICAgIC8qIE5fcHBtICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfaGVhZGVyX2RhdGErPTQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfaGVhZGVyX3NpemUtPTQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9sZW4gKz0gbF9OX3BwbSA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKm5ld19wcG1fYnVmZmVyID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKGxfY3AtPnBwbV9idWZmZXIsIGxfY3AtPnBwbV9sZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBuZXdfcHBtX2J1ZmZlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3AtPnBwbV9idWZmZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9idWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9sZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIHBwbSBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+cHBtX2J1ZmZlciA9IG5ld19wcG1fYnVmZmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQobF9jcC0+cHBtX2J1ZmZlcitsX2NwLT5wcG1fZGF0YV9zaXplLDAsbF9OX3BwbSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+cHBtX2RhdGEgPSBsX2NwLT5wcG1fYnVmZmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbF9yZW1haW5pbmdfZGF0YSA9IGxfY3AtPnBwbV9sZW4gLSBsX2NwLT5wcG1fZGF0YV9zaXplOwotCi0gICAgICAgICAgICAgICAgaWYgKGxfcmVtYWluaW5nX2RhdGEgPD0gcF9oZWFkZXJfc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UgbXVzdCBzdG9yZSBsZXNzIGluZm9ybWF0aW9uIHRoYW4gYXZhaWxhYmxlIGluIHRoZSBwYWNrZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShsX2NwLT5wcG1fYnVmZmVyICsgbF9jcC0+cHBtX2RhdGFfc2l6ZSAsIHBfaGVhZGVyX2RhdGEgLCBsX3JlbWFpbmluZ19kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9kYXRhX3NpemUgPSBsX2NwLT5wcG1fbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9oZWFkZXJfc2l6ZSAtPSBsX3JlbWFpbmluZ19kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9oZWFkZXJfZGF0YSArPSBsX3JlbWFpbmluZ19kYXRhOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShsX2NwLT5wcG1fYnVmZmVyICsgbF9jcC0+cHBtX2RhdGFfc2l6ZSAsIHBfaGVhZGVyX2RhdGEgLCBwX2hlYWRlcl9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnBwbV9kYXRhX3NpemUgKz0gcF9oZWFkZXJfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfaGVhZGVyX2RhdGEgKz0gcF9oZWFkZXJfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfaGVhZGVyX3NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi0vKioKLSAqIFJlYWRzIGEgUFBUIG1hcmtlciAoUGFja2VkIHBhY2tldCBoZWFkZXJzLCB0aWxlLXBhcnQgaGVhZGVyKQotICoKLSAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9kYXRhICAgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBQUFQgYm94LgotICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KLSAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBQUFQgbWFya2VyLgotICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9wcHQgKCAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAgICAgICBvcGpfY3BfdCAqbF9jcCA9IDAwOwotICAgICAgICBvcGpfdGNwX3QgKmxfdGNwID0gMDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9aX3BwdDsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0KLSAgICAgICAgLyogV2UgbmVlZCB0byBoYXZlIHRoZSBaX3BwdCBlbGVtZW50IGF0IG1pbmltdW0gKi8KLSAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCAxKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUFBUIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKLSAgICAgICAgaWYgKGxfY3AtPnBwbSl7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUFBUIG1hcmtlcjogcGFja2V0IGhlYWRlciBoYXZlIGJlZW4gcHJldmlvdXNseSBmb3VuZCBpbiB0aGUgbWFpbiBoZWFkZXIgKFBQTSBtYXJrZXIpLlxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIGxfdGNwID0gJihsX2NwLT50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdKTsKLSAgICAgICAgbF90Y3AtPnBwdCA9IDE7Ci0KLSAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9aX3BwdCwxKTsgICAgICAgICAgICAgICAvKiBaX3BwdCAqLwotICAgICAgICArK3BfaGVhZGVyX2RhdGE7Ci0gICAgICAgIC0tcF9oZWFkZXJfc2l6ZTsKLQotICAgICAgICAvKiBBbGxvY2F0ZSBidWZmZXIgdG8gcmVhZCB0aGUgcGFja2V0IGhlYWRlciAqLwotICAgICAgICBpZiAobF9aX3BwdCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLyogRmlyc3QgUFBUIG1hcmtlciAqLwotICAgICAgICAgICAgICAgIGxfdGNwLT5wcHRfZGF0YV9zaXplID0gMDsKLSAgICAgICAgICAgICAgICBsX3RjcC0+cHB0X2xlbiA9IHBfaGVhZGVyX3NpemU7Ci0KLSAgICAgICAgICAgICAgICBvcGpfZnJlZShsX3RjcC0+cHB0X2J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgbF90Y3AtPnBwdF9idWZmZXIgPSAoT1BKX0JZVEUgKikgb3BqX2NhbGxvYyhsX3RjcC0+cHB0X2xlbiwgc2l6ZW9mKE9QSl9CWVRFKSApOwotICAgICAgICAgICAgICAgIGlmIChsX3RjcC0+cHB0X2J1ZmZlciA9PSAwMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgUFBUIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsX3RjcC0+cHB0X2RhdGEgPSBsX3RjcC0+cHB0X2J1ZmZlcjsKLQotICAgICAgICAgICAgICAgIC8qIG1lbXNldChsX3RjcC0+cHB0X2J1ZmZlciwwLGxfdGNwLT5wcHRfbGVuKTsgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBPUEpfQllURSAqbmV3X3BwdF9idWZmZXI7Ci0gICAgICAgICAgICAgICAgbF90Y3AtPnBwdF9sZW4gKz0gcF9oZWFkZXJfc2l6ZTsKLQotICAgICAgICAgICAgICAgIG5ld19wcHRfYnVmZmVyID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKGxfdGNwLT5wcHRfYnVmZmVyLCBsX3RjcC0+cHB0X2xlbik7Ci0gICAgICAgICAgICAgICAgaWYgKCEgbmV3X3BwdF9idWZmZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfdGNwLT5wcHRfYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNwLT5wcHRfYnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNwLT5wcHRfbGVuID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIFBQVCBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbF90Y3AtPnBwdF9idWZmZXIgPSBuZXdfcHB0X2J1ZmZlcjsKLSAgICAgICAgICAgICAgICBsX3RjcC0+cHB0X2RhdGEgPSBsX3RjcC0+cHB0X2J1ZmZlcjsKLQotICAgICAgICAgICAgICAgIG1lbXNldChsX3RjcC0+cHB0X2J1ZmZlcitsX3RjcC0+cHB0X2RhdGFfc2l6ZSwwLHBfaGVhZGVyX3NpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogUmVhZCBwYWNrZXQgaGVhZGVyIGZyb20gYnVmZmVyICovCi0gICAgICAgIG1lbWNweShsX3RjcC0+cHB0X2J1ZmZlcitsX3RjcC0+cHB0X2RhdGFfc2l6ZSxwX2hlYWRlcl9kYXRhLHBfaGVhZGVyX3NpemUpOwotCi0gICAgICAgIGxfdGNwLT5wcHRfZGF0YV9zaXplICs9IHBfaGVhZGVyX3NpemU7Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi1PUEpfQk9PTCBvcGpfajJrX3dyaXRlX3RsbSggICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAgICAgICBPUEpfQllURSAqIGxfY3VycmVudF9kYXRhID0gMDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF90bG1fc2l6ZTsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotCi0gICAgICAgIGxfdGxtX3NpemUgPSA2ICsgKDUqcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdG90YWxfdGlsZV9wYXJ0cyk7Ci0KLSAgICAgICAgaWYgKGxfdGxtX3NpemUgPiBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUpIHsKLSAgICAgICAgICAgICAgICBPUEpfQllURSAqbmV3X2hlYWRlcl90aWxlX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwgbF90bG1fc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCEgbmV3X2hlYWRlcl90aWxlX2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHdyaXRlIFRMTSBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IG5ld19oZWFkZXJfdGlsZV9kYXRhOwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IGxfdGxtX3NpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBsX2N1cnJlbnRfZGF0YSA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGE7Ci0KLSAgICAgICAgLyogY2hhbmdlIHRoZSB3YXkgZGF0YSBpcyB3cml0dGVuIHRvIGF2b2lkIHNlZWtpbmcgaWYgcG9zc2libGUgKi8KLSAgICAgICAgLyogVE9ETyAqLwotICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90bG1fc3RhcnQgPSBvcGpfc3RyZWFtX3RlbGwocF9zdHJlYW0pOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxKMktfTVNfVExNLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVExNICovCi0gICAgICAgIGxfY3VycmVudF9kYXRhICs9IDI7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfdGxtX3NpemUtMiwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMcG9jICovCi0gICAgICAgIGxfY3VycmVudF9kYXRhICs9IDI7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLDAsMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFp0bG09MCovCi0gICAgICAgICsrbF9jdXJyZW50X2RhdGE7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLDB4NTAsMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0bG0gU1Q9MSg4Yml0cy0yNTUgdGlsZXMgbWF4KSxTUD0xKFB0bG09MzJiaXRzKSAqLwotICAgICAgICArK2xfY3VycmVudF9kYXRhOwotCi0gICAgICAgIC8qIGRvIG5vdGhpbmcgb24gdGhlIDUgKiBsX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90b3RhbF90aWxlX3BhcnRzIHJlbWFpbmluZyBkYXRhICovCi0gICAgICAgIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSxsX3RsbV9zaXplLHBfbWFuYWdlcikgIT0gbF90bG1fc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9CT09MIG9wal9qMmtfd3JpdGVfc290KCAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKHBfZGF0YSxKMktfTVNfU09ULDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU09UICovCi0gICAgICAgIHBfZGF0YSArPSAyOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhwX2RhdGEsMTAsMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTHNvdCAqLwotICAgICAgICBwX2RhdGEgKz0gMjsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLCBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLDIpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIElzb3QgKi8KLSAgICAgICAgcF9kYXRhICs9IDI7Ci0KLSAgICAgICAgLyogUHNvdCAgKi8KLSAgICAgICAgcF9kYXRhICs9IDQ7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKHBfZGF0YSwgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fY3VycmVudF90aWxlX3BhcnRfbnVtYmVyLDEpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRQc290ICovCi0gICAgICAgICsrcF9kYXRhOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhwX2RhdGEsIHBfajJrLT5tX2NwLnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0ubV9uYl90aWxlX3BhcnRzLDEpOyAgICAgICAgICAgICAgICAgICAgICAvKiBUTnNvdCAqLwotICAgICAgICArK3BfZGF0YTsKLQotICAgICAgICAvKiBVbmlQRz4+ICovCi0jaWZkZWYgVVNFX0pQV0wKLSAgICAgICAgLyogdXBkYXRlIG1hcmtlcnMgc3RydWN0ICovCi0vKgotICAgICAgICBPUEpfQk9PTCByZXMgPSBqMmtfYWRkX21hcmtlcihwX2oyay0+Y3N0cl9pbmZvLCBKMktfTVNfU09ULCBwX2oyay0+c290X3N0YXJ0LCBsZW4gKyAyKTsKLSovCi0gIGFzc2VydCggMCAmJiAiVE9ETyIgKTsKLSNlbmRpZiAvKiBVU0VfSlBXTCAqLwotCi0gICAgICAgICogcF9kYXRhX3dyaXR0ZW4gPSAxMjsKLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9CT09MIG9wal9qMmtfcmVhZF9zb3QgKCBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKLXsKLSAgICAgICAgb3BqX2NwX3QgKmxfY3AgPSAwMDsKLSAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfdG90X2xlbiwgbF9udW1fcGFydHMgPSAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfY3VycmVudF9wYXJ0OwotICAgICAgICBPUEpfVUlOVDMyIGxfdGlsZV94LGxfdGlsZV95OwotCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLQotICAgICAgICAvKiBTaXplIG9mIHRoaXMgbWFya2VyIGlzIGZpeGVkID0gMTIgKHdlIGhhdmUgYWxyZWFkeSByZWFkIG1hcmtlciBhbmQgaXRzIHNpemUpKi8KLSAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgIT0gOCkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFNPVCBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBsX2NwID0gJihwX2oyay0+bV9jcCk7Ci0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJihwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyKSwyKTsgICAgICAgICAgICAgICAgLyogSXNvdCAqLwotICAgICAgICBwX2hlYWRlcl9kYXRhKz0yOwotCi0gICAgICAgIC8qIHRlc3RjYXNlIDIucGRmLlNJR0ZQRS43MDYuMTExMiAqLwotICAgICAgICBpZiAocF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciA+PSBsX2NwLT50dyAqIGxfY3AtPnRoKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkludmFsaWQgdGlsZSBudW1iZXIgJWRcbiIsIHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBsX3RjcCA9ICZsX2NwLT50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdOwotICAgICAgICBsX3RpbGVfeCA9IHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIgJSBsX2NwLT50dzsKLSAgICAgICAgbF90aWxlX3kgPSBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyIC8gbF9jcC0+dHc7Ci0KLSNpZmRlZiBVU0VfSlBXTAotICAgICAgICBpZiAobF9jcC0+Y29ycmVjdCkgewotCi0gICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0aWxlbm8gPSBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyOwotICAgICAgICAgICAgICAgIHN0YXRpYyBPUEpfVUlOVDMyIGJhY2t1cF90aWxlbm8gPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGlsZW5vIGlzIG5lZ2F0aXZlIG9yIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgdGlsZXMhISEgKi8KLSAgICAgICAgICAgICAgICBpZiAodGlsZW5vID4gKGxfY3AtPnR3ICogbF9jcC0+dGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKUFdMOiBiYWQgdGlsZSBudW1iZXIgKCVkIG91dCBvZiBhIG1heGltdW0gb2YgJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVubywgKGxfY3AtPnR3ICogbF9jcC0+dGgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSlBXTF9BU1NVTUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkpQV0w6IGdpdmluZyB1cFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSB0cnkgdG8gY29ycmVjdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdGlsZW5vID0gYmFja3VwX3RpbGVubzsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIi0gdHJ5aW5nIHRvIGFkanVzdCB0aGlzXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0gc2V0dGluZyB0aWxlIG51bWJlciB0byAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlbm8pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIGtlZXAgeW91ciBwcml2YXRlIGNvdW50IG9mIHRpbGVzICovCi0gICAgICAgICAgICAgICAgYmFja3VwX3RpbGVubysrOwotICAgICAgICB9OwotI2VuZGlmIC8qIFVTRV9KUFdMICovCi0KLSAgICAgICAgLyogbG9vayBmb3IgdGhlIHRpbGUgaW4gdGhlIGxpc3Qgb2YgYWxyZWFkeSBwcm9jZXNzZWQgdGlsZSAoaW4gcGFydHMpLiAqLwotICAgICAgICAvKiBPcHRpbWl6YXRpb24gcG9zc2libGUgaGVyZSB3aXRoIGEgbW9yZSBjb21wbGV4IGRhdGEgc3RydWN0dXJlIGFuZCB3aXRoIHRoZSByZW1vdmluZyBvZiB0aWxlcyAqLwotICAgICAgICAvKiBzaW5jZSB0aGUgdGltZSB0YWtlbiBieSB0aGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGdyb3cgYXQgdGhlIHRpbWUgKi8KLQotICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX3RvdF9sZW4sNCk7ICAgICAgICAgICAgIC8qIFBzb3QgKi8KLSAgICAgICAgcF9oZWFkZXJfZGF0YSs9NDsKLQotICAgICAgICAvKiBQU290IHNob3VsZCBiZSBlcXVhbCB0byB6ZXJvIG9yID49MTQgb3IgPD0gMl4zMi0xICovCi0gICAgICAgIGlmICgobF90b3RfbGVuICE9MCApICYmIChsX3RvdF9sZW4gPCAxNCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobF90b3RfbGVuID09IDEyICkgLyogTVNEOiBTcGVjaWFsIGNhc2UgZm9yIHRoZSBQSFIgZGF0YSB3aGljaCBhcmUgcmVhZCBieSBrYWthZHUqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkVtcHR5IFNPVCBtYXJrZXIgZGV0ZWN0ZWQ6IFBzb3Q9JWQuXG4iLCBsX3RvdF9sZW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJQc290IHZhbHVlIGlzIG5vdCBjb3JyZWN0IHJlZ2FyZHMgdG8gdGhlIEpQRUcyMDAwIG5vcm06ICVkLlxuIiwgbF90b3RfbGVuKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSNpZmRlZiBVU0VfSlBXTAotICAgICAgICBpZiAobF9jcC0+Y29ycmVjdCkgewotCi0gICAgICAgICAgICAgICAgLyogdG90bGVuIGlzIG5lZ2F0aXZlIG9yIGxhcmdlciB0aGFuIHRoZSBieXRlcyBsZWZ0ISEhICovCi0gICAgICAgICAgICAgICAgaWYgKC8qKGxfdG90X2xlbiA8IDApIHx8Ki8gKGxfdG90X2xlbiA+IHBfaGVhZGVyX3NpemUgKSApIHsgLyogRklYTUUgaXQgc2VlbXMgY29ycmVjdDsgZm9yIGluZm8gaW4gVjEgLT4gKHBfc3RyZWFtX251bWJ5dGVzbGVmdChwX3N0cmVhbSkgKyA4KSkpIHsgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpQV0w6IGJhZCB0aWxlIGJ5dGUgc2l6ZSAoJWQgYnl0ZXMgYWdhaW5zdCAlZCBieXRlcyBsZWZ0KVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RvdF9sZW4sIHBfaGVhZGVyX3NpemUgKTsgLyogRklYTUUgaXQgc2VlbXMgY29ycmVjdDsgZm9yIGluZm8gaW4gVjEgLT4gcF9zdHJlYW1fbnVtYnl0ZXNsZWZ0KHBfc3RyZWFtKSArIDgpOyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFKUFdMX0FTU1VNRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSlBXTDogZ2l2aW5nIHVwXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIHRyeSB0byBjb3JyZWN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBsX3RvdF9sZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiLSB0cnlpbmcgdG8gYWRqdXN0IHRoaXNcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLSBzZXR0aW5nIFBzb3QgdG8gJWQgPT4gYXNzdW1pbmcgaXQgaXMgdGhlIGxhc3QgdGlsZVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RvdF9sZW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9OwotI2VuZGlmIC8qIFVTRV9KUFdMICovCi0KLSAgICAgICAgICAgICAgICAvKiBSZWYgQS40LjI6IFBzb3QgY291bGQgYmUgZXF1YWwgemVybyBpZiBpdCBpcyB0aGUgbGFzdCB0aWxlLXBhcnQgb2YgdGhlIGNvZGVzdHJlYW0uKi8KLSAgICAgICAgICAgICAgICBpZiAoIWxfdG90X2xlbikgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9JTkZPLCAiUHNvdCB2YWx1ZSBvZiB0aGUgY3VycmVudCB0aWxlLXBhcnQgaXMgZXF1YWwgdG8gemVybywgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZSBhc3N1bWluZyBpdCBpcyB0aGUgbGFzdCB0aWxlLXBhcnQgb2YgdGhlIGNvZGVzdHJlYW0uXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2xhc3RfdGlsZV9wYXJ0ID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX2N1cnJlbnRfcGFydCAsMSk7ICAgICAgIC8qIFRQc290ICovCi0gICAgICAgICAgICAgICAgKytwX2hlYWRlcl9kYXRhOwotCi0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9udW1fcGFydHMgLDEpOyAgICAgICAgICAvKiBUTnNvdCAqLwotICAgICAgICAgICAgICAgICsrcF9oZWFkZXJfZGF0YTsKLQotICAgICAgICAgICAgICAgIGlmIChsX251bV9wYXJ0cyAhPSAwKSB7IC8qIE51bWJlciBvZiB0aWxlLXBhcnQgaGVhZGVyIGlzIHByb3ZpZGVkIGJ5IHRoaXMgdGlsZS1wYXJ0IGhlYWRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogVXNlZnVsIHRvIG1hbmFnZSB0aGUgY2FzZSBvZiB0ZXh0R0JSLmpwMiBmaWxlIGJlY2F1c2UgdHdvIHZhbHVlcyBvZiBUTlNvdCBhcmUgYWxsb3dlZDogdGhlIGNvcnJlY3QgbnVtYmVycyBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICogdGlsZS1wYXJ0cyBmb3IgdGhhdCB0aWxlIGFuZCB6ZXJvIChBLjQuMiBvZiAxNTQ0NC0xIDogMjAwMikuICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF90Y3AtPm1fbmJfdGlsZV9wYXJ0cykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9jdXJyZW50X3BhcnQgPj0gbF90Y3AtPm1fbmJfdGlsZV9wYXJ0cyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkluIFNPVCBtYXJrZXIsIFRQU290ICglZCkgaXMgbm90IHZhbGlkIHJlZ2FyZHMgdG8gdGhlIGN1cnJlbnQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtYmVyIG9mIHRpbGUtcGFydCAoJWQpLCBnaXZpbmcgdXBcbiIsIGxfY3VycmVudF9wYXJ0LCBsX3RjcC0+bV9uYl90aWxlX3BhcnRzICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fbGFzdF90aWxlX3BhcnQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBsX2N1cnJlbnRfcGFydCA+PSBsX251bV9wYXJ0cyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVzdGNhc2UgNDUxLnBkZi5TSUdTRUdWLmNlOS4zNzIzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJJbiBTT1QgbWFya2VyLCBUUFNvdCAoJWQpIGlzIG5vdCB2YWxpZCByZWdhcmRzIHRvIHRoZSBjdXJyZW50ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtYmVyIG9mIHRpbGUtcGFydCAoaGVhZGVyKSAoJWQpLCBnaXZpbmcgdXBcbiIsIGxfY3VycmVudF9wYXJ0LCBsX251bV9wYXJ0cyApOwotICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9sYXN0X3RpbGVfcGFydCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX3RjcC0+bV9uYl90aWxlX3BhcnRzID0gbF9udW1fcGFydHM7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogSWYga25vdyB0aGUgbnVtYmVyIG9mIHRpbGUgcGFydCBoZWFkZXIgd2Ugd2lsbCBjaGVjayBpZiB3ZSBkaWRuJ3QgcmVhZCB0aGUgbGFzdCovCi0gICAgICAgICAgICAgICAgaWYgKGxfdGNwLT5tX25iX3RpbGVfcGFydHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX3RjcC0+bV9uYl90aWxlX3BhcnRzID09IChsX2N1cnJlbnRfcGFydCsxKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9jYW5fZGVjb2RlID0gMTsgLyogUHJvY2VzcyB0aGUgbGFzdCB0aWxlLXBhcnQgaGVhZGVyKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIXBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2xhc3RfdGlsZV9wYXJ0KXsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEtlZXAgdGhlIHNpemUgb2YgZGF0YSB0byBza2lwIGFmdGVyIHRoaXMgbWFya2VyICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoID0gbF90b3RfbGVuIC0gMTI7IC8qIFNPVF9tYXJrZXJfc2l6ZSA9IDEyICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogRklYTUU6IG5lZWQgdG8gYmUgY29tcHV0ZWQgZnJvbSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGUgY29kZXN0cmVhbSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc290X2xlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPSBKMktfU1RBVEVfVFBIOwotCi0gICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgdGlsZSBpcyBvdXRzaWRlIHRoZSBhcmVhIHdlIHdhbnQgZGVjb2RlIG9yIG5vdCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0aWxlIGluZGV4Ki8KLSAgICAgICAgICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fdGlsZV9pbmRfdG9fZGVjID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9za2lwX2RhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobF90aWxlX3ggPCBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3gpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgICAgKGxfdGlsZV94ID49IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2VuZF90aWxlX3gpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAobF90aWxlX3kgPCBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3kpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgICAgKGxfdGlsZV95ID49IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2VuZF90aWxlX3kpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCggcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fdGlsZV9pbmRfdG9fZGVjID49IDAgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NraXBfZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyICE9IChPUEpfVUlOVDMyKXBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3RpbGVfaW5kX3RvX2RlYyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogSW5kZXggKi8KLSAgICAgICAgICAgICAgICBpZiAocF9qMmstPmNzdHJfaW5kZXgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4ICE9IDAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRpbGVubyA9IHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS5jdXJyZW50X3Rwc25vID0gbF9jdXJyZW50X3BhcnQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX251bV9wYXJ0cyAhPSAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0ubmJfdHBzID0gbF9udW1fcGFydHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLmN1cnJlbnRfbmJfdHBzID0gbF9udW1fcGFydHM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50cF9pbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRwX2luZGV4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcGpfdHBfaW5kZXhfdCopb3BqX2NhbGxvYyhsX251bV9wYXJ0cywgc2l6ZW9mKG9wal90cF9pbmRleF90KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50cF9pbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgU09UIG1hcmtlci4gVGlsZSBpbmRleCBhbGxvY2F0aW9uIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotCQkJCQkJCQkJCQkJCQkJCQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RwX2luZGV4X3QgKm5ld190cF9pbmRleCA9IChvcGpfdHBfaW5kZXhfdCAqKSBvcGpfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udHBfaW5kZXgsIGxfbnVtX3BhcnRzKiBzaXplb2Yob3BqX3RwX2luZGV4X3QpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBuZXdfdHBfaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRwX2luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRwX2luZGV4ID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIFNPVCBtYXJrZXIuIFRpbGUgaW5kZXggYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udHBfaW5kZXggPSBuZXdfdHBfaW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaWYgKCFwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50cF9pbmRleCkqLyB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRwX2luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS5jdXJyZW50X25iX3RwcyA9IDEwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udHBfaW5kZXggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3BqX3RwX2luZGV4X3QqKW9wal9jYWxsb2MoIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLmN1cnJlbnRfbmJfdHBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9wal90cF9pbmRleF90KSk7Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlpZiAoIXBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRwX2luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLmN1cnJlbnRfbmJfdHBzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgU09UIG1hcmtlci4gVGlsZSBpbmRleCBhbGxvY2F0aW9uIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbF9jdXJyZW50X3BhcnQgPj0gcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0uY3VycmVudF9uYl90cHMgKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90cF9pbmRleF90ICpuZXdfdHBfaW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS5jdXJyZW50X25iX3RwcyA9IGxfY3VycmVudF9wYXJ0ICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld190cF9pbmRleCA9IChvcGpfdHBfaW5kZXhfdCAqKSBvcGpfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50cF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS5jdXJyZW50X25iX3RwcyAqIHNpemVvZihvcGpfdHBfaW5kZXhfdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmV3X3RwX2luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRwX2luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udHBfaW5kZXggPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS5jdXJyZW50X25iX3RwcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIFNPVCBtYXJrZXIuIFRpbGUgaW5kZXggYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udHBfaW5kZXggPSBuZXdfdHBfaW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIEZJWE1FIG1vdmUgdGhpcyBvbnRvIGEgc2VwYXJhdGUgbWV0aG9kIHRvIGNhbGwgYmVmb3JlIHJlYWRpbmcgYW55IFNPVCwgcmVtb3ZlIHBhcnQgYWJvdXQgbWFpbl9lbmQgaGVhZGVyLCB1c2UgYSBpbmRleCBzdHJ1Y3QgaW5zaWRlIHBfajJrICovCi0gICAgICAgICAgICAgICAgLyogaWYgKHBfajJrLT5jc3RyX2luZm8pIHsKLSAgICAgICAgICAgICAgICAgICBpZiAobF90Y3AtPmZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgaWYgKHRpbGVubyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5mby0+bWFpbl9oZWFkX2VuZCA9IHBfc3RyZWFtX3RlbGwocF9zdHJlYW0pIC0gMTM7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5mby0+dGlsZVt0aWxlbm9dLnRpbGVubyA9IHRpbGVubzsKLSAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmZvLT50aWxlW3RpbGVub10uc3RhcnRfcG9zID0gcF9zdHJlYW1fdGVsbChwX3N0cmVhbSkgLSAxMjsKLSAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmZvLT50aWxlW3RpbGVub10uZW5kX3BvcyA9IHBfajJrLT5jc3RyX2luZm8tPnRpbGVbdGlsZW5vXS5zdGFydF9wb3MgKyB0b3RsZW4gLSAxOwotICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPnRpbGVbdGlsZW5vXS5udW1fdHBzID0gbnVtcGFydHM7Ci0KLSAgICAgICAgICAgICAgICAgICBpZiAobnVtcGFydHMpIHsKLSAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmZvLT50aWxlW3RpbGVub10udHAgPSAob3BqX3RwX2luZm9fdCAqKSBvcGpfbWFsbG9jKG51bXBhcnRzICogc2l6ZW9mKG9wal90cF9pbmZvX3QpKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5mby0+dGlsZVt0aWxlbm9dLnRwID0gKG9wal90cF9pbmZvX3QgKikgb3BqX21hbGxvYygxMCAqIHNpemVvZihvcGpfdHBfaW5mb190KSk7IC8vIEZpeG1lICgxMCkKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPnRpbGVbdGlsZW5vXS5lbmRfcG9zICs9IHRvdGxlbjsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmZvLT50aWxlW3RpbGVub10udHBbcGFydG5vXS50cF9zdGFydF9wb3MgPSBwX3N0cmVhbV90ZWxsKHBfc3RyZWFtKSAtIDEyOwotICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPnRpbGVbdGlsZW5vXS50cFtwYXJ0bm9dLnRwX2VuZF9wb3MgPQotICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPnRpbGVbdGlsZW5vXS50cFtwYXJ0bm9dLnRwX3N0YXJ0X3BvcyArIHRvdGxlbiAtIDE7Ci0gICAgICAgICAgICAgICAgICAgfSovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotICAgICAgICB9Ci0KLU9QSl9CT09MIG9wal9qMmtfd3JpdGVfc29kKCAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90ICogcF90aWxlX2NvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdG90YWxfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICAgICAgb3BqX2NvZGVzdHJlYW1faW5mb190ICpsX2NzdHJfaW5mbyA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfcmVtYWluaW5nX2RhdGE7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLEoyS19NU19TT0QsMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTT0QgKi8KLSAgICAgICAgcF9kYXRhICs9IDI7Ci0KLSAgICAgICAgLyogbWFrZSByb29tIGZvciB0aGUgRU9GIG1hcmtlciAqLwotICAgICAgICBsX3JlbWFpbmluZ19kYXRhID0gIHBfdG90YWxfZGF0YV9zaXplIC0gNDsKLQotICAgICAgICAvKiB1cGRhdGUgdGlsZSBjb2RlciAqLwotICAgICAgICBwX3RpbGVfY29kZXItPnRwX251bSA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2N1cnJlbnRfcG9jX3RpbGVfcGFydF9udW1iZXIgOwotICAgICAgICBwX3RpbGVfY29kZXItPmN1cl90cF9udW0gPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9jdXJyZW50X3RpbGVfcGFydF9udW1iZXI7Ci0KLSAgICAgICAgIC8qIElOREVYID4+ICovCi0gICAgICAgIC8qIFRPRE8gbWVyZ2VWMjogY2hlY2sgdGhpcyBwYXJ0IHdoaWNoIHVzZSBjc3RyX2luZm8gKi8KLSAgICAgICAgLypsX2NzdHJfaW5mbyA9IHBfajJrLT5jc3RyX2luZm87Ci0gICAgICAgIGlmIChsX2NzdHJfaW5mbykgewotICAgICAgICAgICAgICAgIGlmICghcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fY3VycmVudF90aWxlX3BhcnRfbnVtYmVyICkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIGNzdHJfaW5mby0+dGlsZVtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS5lbmRfaGVhZGVyID0gcF9zdHJlYW1fdGVsbChwX3N0cmVhbSkgKyBwX2oyay0+cG9zX2NvcnJlY3Rpb24gLSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgbF9jc3RyX2luZm8tPnRpbGVbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udGlsZW5vID0gcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICBUT0RPCi0gICAgICAgICAgICAgICAgICAgICAgICBpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3N0cl9pbmZvLT50aWxlW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnBhY2tldFtjc3RyX2luZm8tPnBhY2tubyAtIDFdLmVuZF9wb3MgPCBwX3N0cmVhbV90ZWxsKHBfc3RyZWFtKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmZvLT50aWxlW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnBhY2tldFtjc3RyX2luZm8tPnBhY2tub10uc3RhcnRfcG9zID0gcF9zdHJlYW1fdGVsbChwX3N0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ki8KLSAgICAgICAgICAgICAgICAvKn0qLwotICAgICAgICAgICAgICAgIC8qIFVuaVBHPj4gKi8KLSNpZmRlZiBVU0VfSlBXTAotICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBtYXJrZXJzIHN0cnVjdCAqLwotICAgICAgICAgICAgICAgIC8qT1BKX0JPT0wgcmVzID0gajJrX2FkZF9tYXJrZXIocF9qMmstPmNzdHJfaW5mbywgSjJLX01TX1NPRCwgcF9qMmstPnNvZF9zdGFydCwgMik7Ci0qLwotICBhc3NlcnQoIDAgJiYgIlRPRE8iICk7Ci0jZW5kaWYgLyogVVNFX0pQV0wgKi8KLSAgICAgICAgICAgICAgICAvKiA8PFVuaVBHICovCi0gICAgICAgIC8qfSovCi0gICAgICAgIC8qIDw8IElOREVYICovCi0KLSAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2N1cnJlbnRfdGlsZV9wYXJ0X251bWJlciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcF90aWxlX2NvZGVyLT50Y2RfaW1hZ2UtPnRpbGVzLT5wYWNrbm8gPSAwOwotICAgICAgICAgICAgICAgIGlmIChsX2NzdHJfaW5mbykgewotICAgICAgICAgICAgICAgICAgICAgICAgbF9jc3RyX2luZm8tPnBhY2tubyA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgKnBfZGF0YV93cml0dGVuID0gMDsKLQotICAgICAgICBpZiAoISBvcGpfdGNkX2VuY29kZV90aWxlKHBfdGlsZV9jb2RlciwgcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciwgcF9kYXRhLCBwX2RhdGFfd3JpdHRlbiwgbF9yZW1haW5pbmdfZGF0YSAsIGxfY3N0cl9pbmZvKSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJDYW5ub3QgZW5jb2RlIHRpbGVcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICAqcF9kYXRhX3dyaXR0ZW4gKz0gMjsKLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9CT09MIG9wal9qMmtfcmVhZF9zb2QgKG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICAgICAgT1BKX1NJWkVfVCBsX2N1cnJlbnRfcmVhZF9zaXplOwotICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmRleF90ICogbF9jc3RyX2luZGV4ID0gMDA7Ci0gICAgICAgIE9QSl9CWVRFICoqIGxfY3VycmVudF9kYXRhID0gMDA7Ci0gICAgICAgIG9wal90Y3BfdCAqIGxfdGNwID0gMDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgKiBsX3RpbGVfbGVuID0gMDA7Ci0gICAgICAgIE9QSl9CT09MIGxfc290X2xlbmd0aF9wYl9kZXRlY3RlZCA9IE9QSl9GQUxTRTsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotCi0gICAgICAgIGxfdGNwID0gJihwX2oyay0+bV9jcC50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdKTsKLQotICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fbGFzdF90aWxlX3BhcnQpIHsKLSAgICAgICAgICAgICAgICAvKiBvcGpfc3RyZWFtX2dldF9udW1iZXJfYnl0ZV9sZWZ0IHJldHVybnMgT1BKX09GRl9UCi0gICAgICAgICAgICAgICAgLy8gYnV0IHdlIGFyZSBpbiB0aGUgbGFzdCB0aWxlIHBhcnQsCi0gICAgICAgICAgICAgICAgLy8gc28gaXRzIHJlc3VsdCB3aWxsIGZpdCBvbiBPUEpfVUlOVDMyIHVubGVzcyB3ZSBmaW5kCi0gICAgICAgICAgICAgICAgLy8gYSBmaWxlIHdpdGggYSBzaW5nbGUgdGlsZSBwYXJ0IG9mIG1vcmUgdGhhbiA0IEdCLi4uKi8KLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoID0gKE9QSl9VSU5UMzIpKG9wal9zdHJlYW1fZ2V0X251bWJlcl9ieXRlX2xlZnQocF9zdHJlYW0pIC0gMik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKiBDaGVjayB0byBhdm9pZCBwYXNzIHRoZSBsaW1pdCBvZiBPUEpfVUlOVDMyICovCi0gICAgICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc290X2xlbmd0aCA+PSAyICkKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoIC09IDI7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiBNU0Q6IGNhc2UgY29tbWVudGVkIHRvIHN1cHBvcnQgZW1wdHkgU09UIG1hcmtlciAoUEhSIGRhdGEpICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBsX2N1cnJlbnRfZGF0YSA9ICYobF90Y3AtPm1fZGF0YSk7Ci0gICAgICAgIGxfdGlsZV9sZW4gPSAmbF90Y3AtPm1fZGF0YV9zaXplOwotCi0gICAgICAgIC8qIFBhdGNoIHRvIHN1cHBvcnQgbmV3IFBIUiBkYXRhICovCi0gICAgICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoKSB7Ci0gICAgICAgICAgICAvKiBJZiB3ZSBhcmUgaGVyZSwgd2UnbGwgdHJ5IHRvIHJlYWQgdGhlIGRhdGEgYWZ0ZXIgYWxsb2NhdGlvbiAqLwotICAgICAgICAgICAgLyogQ2hlY2sgZW5vdWdoIGJ5dGVzIGxlZnQgaW4gc3RyZWFtIGJlZm9yZSBhbGxvY2F0aW9uICovCi0gICAgICAgICAgICBpZiAoKE9QSl9PRkZfVClwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoID4gb3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdChwX3N0cmVhbSkpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiVGlsZSBwYXJ0IGxlbmd0aCBzaXplIGluY29uc2lzdGVudCB3aXRoIHN0cmVhbSBsZW5ndGhcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoISAqbF9jdXJyZW50X2RhdGEpIHsKLSAgICAgICAgICAgICAgICAvKiBMSDogb2RkbHkgZW5vdWdoLCBpbiB0aGlzIHBhdGgsIGxfdGlsZV9sZW4hPTAuCi0gICAgICAgICAgICAgICAgICogVE9ETzogSWYgdGhpcyB3YXMgY29uc2lzdGFudCwgd2UgY291bGQgc2ltcGxpZnkgdGhlIGNvZGUgdG8gb25seSB1c2UgcmVhbGxvYygpLCBhcyByZWFsbG9jKDAsLi4uKSBkZWZhdWx0IHRvIG1hbGxvYygwLC4uLikuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgKmxfY3VycmVudF9kYXRhID0gKE9QSl9CWVRFKikgb3BqX21hbGxvYyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIE9QSl9CWVRFICpsX25ld19jdXJyZW50X2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MoKmxfY3VycmVudF9kYXRhLCAqbF90aWxlX2xlbiArIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmICghIGxfbmV3X2N1cnJlbnRfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUoKmxfY3VycmVudF9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qbm90aGluZyBtb3JlIGlzIGRvbmUgYXMgbF9jdXJyZW50X2RhdGEgd2lsbCBiZSBzZXQgdG8gbnVsbCwgYW5kIGp1c3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJ3YXJkIHdlIGVudGVyIGluIHRoZSBlcnJvciBwYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgYWN0dWFsIHRpbGVfbGVuIGlzIHVwZGF0ZWQgKGNvbW1pdHRlZCkgYXQgdGhlIGVuZCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICpsX2N1cnJlbnRfZGF0YSA9IGxfbmV3X2N1cnJlbnRfZGF0YTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCpsX2N1cnJlbnRfZGF0YSA9PSAwMCkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBkZWNvZGUgdGlsZVxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGxfc290X2xlbmd0aF9wYl9kZXRlY3RlZCA9IE9QSl9UUlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSW5kZXggKi8KLSAgICAgICAgbF9jc3RyX2luZGV4ID0gcF9qMmstPmNzdHJfaW5kZXg7Ci0gICAgICAgIGlmIChsX2NzdHJfaW5kZXgpIHsKLSAgICAgICAgICAgICAgICBPUEpfT0ZGX1QgbF9jdXJyZW50X3BvcyA9IG9wal9zdHJlYW1fdGVsbChwX3N0cmVhbSkgLSAyOwotCi0gICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsX2N1cnJlbnRfdGlsZV9wYXJ0ID0gbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLmN1cnJlbnRfdHBzbm87Ci0gICAgICAgICAgICAgICAgbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRwX2luZGV4W2xfY3VycmVudF90aWxlX3BhcnRdLmVuZF9oZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfcG9zOwotICAgICAgICAgICAgICAgIGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50cF9pbmRleFtsX2N1cnJlbnRfdGlsZV9wYXJ0XS5lbmRfcG9zID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X3BvcyArIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGggKyAyOwotCi0gICAgICAgICAgICAgICAgaWYgKE9QSl9GQUxTRSA9PSBvcGpfajJrX2FkZF90bG1hcmtlcihwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3N0cl9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKMktfTVNfU09ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc290X2xlbmd0aCArIDIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWRkIHRsIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qbF9jc3RyX2luZGV4LT5wYWNrbm8gPSAwOyovCi0gICAgICAgIH0KLQotICAgICAgICAvKiBQYXRjaCB0byBzdXBwb3J0IG5ldyBQSFIgZGF0YSAqLwotICAgICAgICBpZiAoIWxfc290X2xlbmd0aF9wYl9kZXRlY3RlZCkgewotICAgICAgICAgICAgbF9jdXJyZW50X3JlYWRfc2l6ZSA9IG9wal9zdHJlYW1fcmVhZF9kYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAgcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAqbF9jdXJyZW50X2RhdGEgKyAqbF90aWxlX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbF9jdXJyZW50X3JlYWRfc2l6ZSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobF9jdXJyZW50X3JlYWRfc2l6ZSAhPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPSBKMktfU1RBVEVfTkVPQzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9IEoyS19TVEFURV9UUEhTT1Q7Ci0gICAgICAgIH0KLQotICAgICAgICAqbF90aWxlX2xlbiArPSAoT1BKX1VJTlQzMilsX2N1cnJlbnRfcmVhZF9zaXplOwotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfcmduKG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBuYl9jb21wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAgICAgICBPUEpfQllURSAqIGxfY3VycmVudF9kYXRhID0gMDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9yZ25fc2l6ZTsKLSAgICAgICAgb3BqX2NwX3QgKmxfY3AgPSAwMDsKLSAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOwotICAgICAgICBvcGpfdGNjcF90ICpsX3RjY3AgPSAwMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2NvbXBfcm9vbTsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotCi0gICAgICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKLSAgICAgICAgbF90Y3AgPSAmbF9jcC0+dGNwc1twX3RpbGVfbm9dOwotICAgICAgICBsX3RjY3AgPSAmbF90Y3AtPnRjY3BzW3BfY29tcF9ub107Ci0KLSAgICAgICAgaWYgKG5iX2NvbXBzIDw9IDI1NikgewotICAgICAgICAgICAgICAgIGxfY29tcF9yb29tID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBsX2NvbXBfcm9vbSA9IDI7Ci0gICAgICAgIH0KLQotICAgICAgICBsX3Jnbl9zaXplID0gNiArIGxfY29tcF9yb29tOwotCi0gICAgICAgIGxfY3VycmVudF9kYXRhID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YTsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsSjJLX01TX1JHTiwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJHTiAgKi8KLSAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF9yZ25fc2l6ZS0yLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExyZ24gKi8KLSAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEscF9jb21wX25vLGxfY29tcF9yb29tKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENyZ24gKi8KLSAgICAgICAgbF9jdXJyZW50X2RhdGErPWxfY29tcF9yb29tOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgMCwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3JnbiAqLwotICAgICAgICArK2xfY3VycmVudF9kYXRhOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgKE9QSl9VSU5UMzIpbF90Y2NwLT5yb2lzaGlmdCwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU1ByZ24gKi8KLSAgICAgICAgKytsX2N1cnJlbnRfZGF0YTsKLQotICAgICAgICBpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKHBfc3RyZWFtLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsbF9yZ25fc2l6ZSxwX21hbmFnZXIpICE9IGxfcmduX3NpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi1PUEpfQk9PTCBvcGpfajJrX3dyaXRlX2VvYyggICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSxKMktfTVNfRU9DLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFT0MgKi8KLQotLyogVW5pUEc+PiAqLwotI2lmZGVmIFVTRV9KUFdMCi0gICAgICAgIC8qIHVwZGF0ZSBtYXJrZXJzIHN0cnVjdCAqLwotICAgICAgICAvKgotICAgICAgICBPUEpfQk9PTCByZXMgPSBqMmtfYWRkX21hcmtlcihwX2oyay0+Y3N0cl9pbmZvLCBKMktfTVNfRU9DLCBwX3N0cmVhbV90ZWxsKHBfc3RyZWFtKSAtIDIsIDIpOwotKi8KLSNlbmRpZiAvKiBVU0VfSlBXTCAqLwotCi0gICAgICAgIGlmICggb3BqX3N0cmVhbV93cml0ZV9kYXRhKHBfc3RyZWFtLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsMixwX21hbmFnZXIpICE9IDIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAhIG9wal9zdHJlYW1fZmx1c2gocF9zdHJlYW0scF9tYW5hZ2VyKSApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi0vKioKLSAqIFJlYWRzIGEgUkdOIG1hcmtlciAoUmVnaW9uIE9mIEludGVyZXN0KQotICoKLSAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9kYXRhICAgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBQT0MgYm94LgotICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KLSAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBQT0MgbWFya2VyLgotICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9yZ24gKG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl9jb21wOwotICAgICAgICBvcGpfaW1hZ2VfdCAqIGxfaW1hZ2UgPSAwMDsKLQotICAgICAgICBvcGpfY3BfdCAqbF9jcCA9IDAwOwotICAgICAgICBvcGpfdGNwX3QgKmxfdGNwID0gMDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9jb21wX3Jvb20sIGxfY29tcF9ubywgbF9yb2lfc3R5OwotCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMqLwotICAgICAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotCi0gICAgICAgIGxfaW1hZ2UgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlOwotICAgICAgICBsX25iX2NvbXAgPSBsX2ltYWdlLT5udW1jb21wczsKLQotICAgICAgICBpZiAobF9uYl9jb21wIDw9IDI1NikgewotICAgICAgICAgICAgICAgIGxfY29tcF9yb29tID0gMTsgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBsX2NvbXBfcm9vbSA9IDI7IH0KLQotICAgICAgICBpZiAocF9oZWFkZXJfc2l6ZSAhPSAyICsgbF9jb21wX3Jvb20pIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBSR04gbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOwotICAgICAgICBsX3RjcCA9IChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9PSBKMktfU1RBVEVfVFBIKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX2NwLT50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3A7Ci0KLSAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9jb21wX25vLGxfY29tcF9yb29tKTsgICAgICAgICAgIC8qIENyZ24gKi8KLSAgICAgICAgcF9oZWFkZXJfZGF0YSs9bF9jb21wX3Jvb207Ci0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfcm9pX3N0eSwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3JnbiAqLwotICAgICAgICArK3BfaGVhZGVyX2RhdGE7Ci0KLSNpZmRlZiBVU0VfSlBXTAotICAgICAgICBpZiAobF9jcC0+Y29ycmVjdCkgewotICAgICAgICAgICAgICAgIC8qIHRvdGxlbiBpcyBuZWdhdGl2ZSBvciBsYXJnZXIgdGhhbiB0aGUgYnl0ZXMgbGVmdCEhISAqLwotICAgICAgICAgICAgICAgIGlmIChsX2NvbXBfcm9vbSA+PSBsX25iX2NvbXApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKUFdMOiBiYWQgY29tcG9uZW50IG51bWJlciBpbiBSR04gKCVkIHdoZW4gdGhlcmUgYXJlIG9ubHkgJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NvbXBfcm9vbSwgbF9uYl9jb21wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSlBXTF9BU1NVTUUgfHwgSlBXTF9BU1NVTUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkpQV0w6IGdpdmluZyB1cFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9OwotI2VuZGlmIC8qIFVTRV9KUFdMICovCi0KLSAgICAgICAgLyogdGVzdGNhc2UgMzYzNS5wZGYuYXNhbi43Ny4yOTMwICovCi0gICAgICAgIGlmIChsX2NvbXBfbm8gPj0gbF9uYl9jb21wKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJiYWQgY29tcG9uZW50IG51bWJlciBpbiBSR04gKCVkIHdoZW4gdGhlcmUgYXJlIG9ubHkgJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbF9jb21wX25vLCBsX25iX2NvbXApOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLChPUEpfVUlOVDMyICopICgmKGxfdGNwLT50Y2Nwc1tsX2NvbXBfbm9dLnJvaXNoaWZ0KSksMSk7ICAgLyogU1ByZ24gKi8KLSAgICAgICAgKytwX2hlYWRlcl9kYXRhOwotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLQotfQotCi1PUEpfRkxPQVQzMiBvcGpfajJrX2dldF90cF9zdHJpZGUgKG9wal90Y3BfdCAqIHBfdGNwKQotewotICAgICAgICByZXR1cm4gKE9QSl9GTE9BVDMyKSAoKHBfdGNwLT5tX25iX3RpbGVfcGFydHMgLSAxKSAqIDE0KTsKLX0KLQotT1BKX0ZMT0FUMzIgb3BqX2oya19nZXRfZGVmYXVsdF9zdHJpZGUgKG9wal90Y3BfdCAqIHBfdGNwKQotewotICAgICh2b2lkKXBfdGNwOwotICAgIHJldHVybiAwOwotfQotCi1PUEpfQk9PTCBvcGpfajJrX3VwZGF0ZV9yYXRlcyggIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQotewotICAgICAgICBvcGpfY3BfdCAqIGxfY3AgPSAwMDsKLSAgICAgICAgb3BqX2ltYWdlX3QgKiBsX2ltYWdlID0gMDA7Ci0gICAgICAgIG9wal90Y3BfdCAqIGxfdGNwID0gMDA7Ci0gICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wID0gMDA7Ci0KLSAgICAgICAgT1BKX1VJTlQzMiBpLGosazsKLSAgICAgICAgT1BKX0lOVDMyIGxfeDAsbF95MCxsX3gxLGxfeTE7Ci0gICAgICAgIE9QSl9GTE9BVDMyICogbF9yYXRlcyA9IDA7Ci0gICAgICAgIE9QSl9GTE9BVDMyIGxfc290X3JlbW92ZTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2JpdHNfZW1wdHksIGxfc2l6ZV9waXhlbDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3RpbGVfc2l6ZSA9IDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9sYXN0X3JlczsKLSAgICAgICAgT1BKX0ZMT0FUMzIgKCogbF90cF9zdHJpZGVfZnVuYykob3BqX3RjcF90ICopID0gMDA7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKLQotICAgICAgICBsX2NwID0gJihwX2oyay0+bV9jcCk7Ci0gICAgICAgIGxfaW1hZ2UgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlOwotICAgICAgICBsX3RjcCA9IGxfY3AtPnRjcHM7Ci0KLSAgICAgICAgbF9iaXRzX2VtcHR5ID0gOCAqIGxfaW1hZ2UtPmNvbXBzLT5keCAqIGxfaW1hZ2UtPmNvbXBzLT5keTsKLSAgICAgICAgbF9zaXplX3BpeGVsID0gbF9pbWFnZS0+bnVtY29tcHMgKiBsX2ltYWdlLT5jb21wcy0+cHJlYzsKLSAgICAgICAgbF9zb3RfcmVtb3ZlID0gKE9QSl9GTE9BVDMyKSBvcGpfc3RyZWFtX3RlbGwocF9zdHJlYW0pIC8gKE9QSl9GTE9BVDMyKShsX2NwLT50aCAqIGxfY3AtPnR3KTsKLQotICAgICAgICBpZiAobF9jcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX3RwX29uKSB7Ci0gICAgICAgICAgICAgICAgbF90cF9zdHJpZGVfZnVuYyA9IG9wal9qMmtfZ2V0X3RwX3N0cmlkZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBsX3RwX3N0cmlkZV9mdW5jID0gb3BqX2oya19nZXRfZGVmYXVsdF9zdHJpZGU7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGk9MDtpPGxfY3AtPnRoOysraSkgewotICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9jcC0+dHc7KytqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiBsX29mZnNldCA9IChPUEpfRkxPQVQzMikoKmxfdHBfc3RyaWRlX2Z1bmMpKGxfdGNwKSAvIChPUEpfRkxPQVQzMilsX3RjcC0+bnVtbGF5ZXJzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiA0IGJvcmRlcnMgb2YgdGhlIHRpbGUgcmVzY2FsZSBvbiB0aGUgaW1hZ2UgaWYgbmVjZXNzYXJ5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBsX3gwID0gb3BqX2ludF9tYXgoKE9QSl9JTlQzMikobF9jcC0+dHgwICsgaiAqIGxfY3AtPnRkeCksIChPUEpfSU5UMzIpbF9pbWFnZS0+eDApOwotICAgICAgICAgICAgICAgICAgICAgICAgbF95MCA9IG9wal9pbnRfbWF4KChPUEpfSU5UMzIpKGxfY3AtPnR5MCArIGkgKiBsX2NwLT50ZHkpLCAoT1BKX0lOVDMyKWxfaW1hZ2UtPnkwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfeDEgPSBvcGpfaW50X21pbigoT1BKX0lOVDMyKShsX2NwLT50eDAgKyAoaiArIDEpICogbF9jcC0+dGR4KSwgKE9QSl9JTlQzMilsX2ltYWdlLT54MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX3kxID0gb3BqX2ludF9taW4oKE9QSl9JTlQzMikobF9jcC0+dHkwICsgKGkgKyAxKSAqIGxfY3AtPnRkeSksIChPUEpfSU5UMzIpbF9pbWFnZS0+eTEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBsX3JhdGVzID0gbF90Y3AtPnJhdGVzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBNb2RpZmljYXRpb24gb2YgdGhlIFJBVEUgPj4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqbF9yYXRlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbF9yYXRlcyA9ICAgICAgICAgICAgICAoKCAoT1BKX0ZMT0FUMzIpIChsX3NpemVfcGl4ZWwgKiAoT1BKX1VJTlQzMikobF94MSAtIGxfeDApICogKE9QSl9VSU5UMzIpKGxfeTEgLSBsX3kwKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKmxfcmF0ZXMpICogKE9QSl9GTE9BVDMyKWxfYml0c19lbXB0eSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICArK2xfcmF0ZXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDE7IGsgPCBsX3RjcC0+bnVtbGF5ZXJzOyArK2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpsX3JhdGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxfcmF0ZXMgPSAgICAgICAgICAgICAgKCggKE9QSl9GTE9BVDMyKSAobF9zaXplX3BpeGVsICogKE9QSl9VSU5UMzIpKGxfeDEgLSBsX3gwKSAqIChPUEpfVUlOVDMyKShsX3kxIC0gbF95MCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCpsX3JhdGVzKSAqIChPUEpfRkxPQVQzMilsX2JpdHNfZW1wdHkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9yYXRlczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgKytsX3RjcDsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGxfdGNwID0gbF9jcC0+dGNwczsKLQotICAgICAgICBmb3IgKGk9MDtpPGxfY3AtPnRoOysraSkgewotICAgICAgICAgICAgICAgIGZvciAgICAgKGo9MDtqPGxfY3AtPnR3OysraikgewotICAgICAgICAgICAgICAgICAgICAgICAgbF9yYXRlcyA9IGxfdGNwLT5yYXRlczsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpsX3JhdGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsX3JhdGVzIC09IGxfc290X3JlbW92ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKmxfcmF0ZXMgPCAzMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsX3JhdGVzID0gMzA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgKytsX3JhdGVzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBsX2xhc3RfcmVzID0gbF90Y3AtPm51bWxheWVycyAtIDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDE7IGsgPCBsX2xhc3RfcmVzOyArK2spIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKmxfcmF0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbF9yYXRlcyAtPSBsX3NvdF9yZW1vdmU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKmxfcmF0ZXMgPCAqKGxfcmF0ZXMgLSAxKSArIDEwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbF9yYXRlcyAgPSAoKihsX3JhdGVzIC0gMSkpICsgMjA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX3JhdGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKmxfcmF0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxfcmF0ZXMgLT0gKGxfc290X3JlbW92ZSArIDIuZik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpsX3JhdGVzIDwgKihsX3JhdGVzIC0gMSkgKyAxMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsX3JhdGVzICA9ICgqKGxfcmF0ZXMgLSAxKSkgKyAyMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICArK2xfdGNwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGxfaW1nX2NvbXAgPSBsX2ltYWdlLT5jb21wczsKLSAgICAgICAgbF90aWxlX3NpemUgPSAwOwotCi0gICAgICAgIGZvciAoaT0wO2k8bF9pbWFnZS0+bnVtY29tcHM7KytpKSB7Ci0gICAgICAgICAgICAgICAgbF90aWxlX3NpemUgKz0gKCAgICAgICAgb3BqX3VpbnRfY2VpbGRpdihsX2NwLT50ZHgsbF9pbWdfY29tcC0+ZHgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3VpbnRfY2VpbGRpdihsX2NwLT50ZHksbF9pbWdfY29tcC0+ZHkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9pbWdfY29tcC0+cHJlYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgICAgICsrbF9pbWdfY29tcDsKLSAgICAgICAgfQotCi0gICAgICAgIGxfdGlsZV9zaXplID0gKE9QSl9VSU5UMzIpIChsX3RpbGVfc2l6ZSAqIDAuMTYyNSk7IC8qIDEuMy84ID0gMC4xNjI1ICovCi0KLSAgICAgICAgbF90aWxlX3NpemUgKz0gb3BqX2oya19nZXRfc3BlY2lmaWNfaGVhZGVyX3NpemVzKHBfajJrKTsKLQotICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfc2l6ZSA9IGxfdGlsZV9zaXplOwotICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0JZVEUgKikgb3BqX21hbGxvYyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfc2l6ZSk7Ci0gICAgICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfZGF0YSA9PSAwMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoT1BKX0lTX0NJTkVNQShsX2NwLT5yc2l6KSkgewotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zb3Rfb2Zmc2V0c19idWZmZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0JZVEUgKikgb3BqX21hbGxvYyg1KnBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RvdGFsX3RpbGVfcGFydHMpOwotICAgICAgICAgICAgICAgIGlmICghIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zb3Rfb2Zmc2V0c19idWZmZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdGxtX3NvdF9vZmZzZXRzX2N1cnJlbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90bG1fc290X29mZnNldHNfYnVmZmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi0jaWYgMAotT1BKX0JPT0wgb3BqX2oya19yZWFkX2VvYyAoICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgb3BqX3RjZF90ICogbF90Y2QgPSAwMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX3RpbGVzOwotICAgICAgICBvcGpfdGNwX3QgKiBsX3RjcCA9IDAwOwotICAgICAgICBPUEpfQk9PTCBsX3N1Y2Nlc3M7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKLQotICAgICAgICBsX25iX3RpbGVzID0gcF9qMmstPm1fY3AudGggKiBwX2oyay0+bV9jcC50dzsKLSAgICAgICAgbF90Y3AgPSBwX2oyay0+bV9jcC50Y3BzOwotCi0gICAgICAgIGxfdGNkID0gb3BqX3RjZF9jcmVhdGUoT1BKX1RSVUUpOwotICAgICAgICBpZiAobF90Y2QgPT0gMDApIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ2Fubm90IGRlY29kZSB0aWxlLCBtZW1vcnkgZXJyb3JcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbF9uYl90aWxlczsgKytpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxfdGNwLT5tX2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG9wal90Y2RfaW5pdF9kZWNvZGVfdGlsZShsX3RjZCwgaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9kZXN0cm95KGxfdGNkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkNhbm5vdCBkZWNvZGUgdGlsZSwgbWVtb3J5IGVycm9yXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgbF9zdWNjZXNzID0gb3BqX3RjZF9kZWNvZGVfdGlsZShsX3RjZCwgbF90Y3AtPm1fZGF0YSwgbF90Y3AtPm1fZGF0YV9zaXplLCBpLCBwX2oyay0+Y3N0cl9pbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhbnVwICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIGxfc3VjY2VzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSB8PSBKMktfU1RBVEVfRVJSOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBvcGpfajJrX3RjcF9kZXN0cm95KGxfdGNwKTsKLSAgICAgICAgICAgICAgICArK2xfdGNwOwotICAgICAgICB9Ci0KLSAgICAgICAgb3BqX3RjZF9kZXN0cm95KGxfdGNkKTsKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotI2VuZGlmCi0KLU9QSl9CT09MIG9wal9qMmtfZ2V0X2VuZF9oZWFkZXIob3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyICkKLXsKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKLQotICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+bWFpbl9oZWFkX2VuZCA9IG9wal9zdHJlYW1fdGVsbChwX3N0cmVhbSk7Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi1PUEpfQk9PTCBvcGpfajJrX3dyaXRlX21jdF9kYXRhX2dyb3VwKCAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIgKQotewotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90ICogbF9tY2NfcmVjb3JkOwotICAgICAgICBvcGpfbWN0X2RhdGFfdCAqIGxfbWN0X3JlY29yZDsKLSAgICAgICAgb3BqX3RjcF90ICogbF90Y3A7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLQotICAgICAgICBpZiAoISBvcGpfajJrX3dyaXRlX2NiZChwX2oyayxwX3N0cmVhbSxwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIGxfdGNwID0gJihwX2oyay0+bV9jcC50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdKTsKLSAgICAgICAgbF9tY3RfcmVjb3JkID0gbF90Y3AtPm1fbWN0X3JlY29yZHM7Ci0KLSAgICAgICAgZm9yIChpPTA7aTxsX3RjcC0+bV9uYl9tY3RfcmVjb3JkczsrK2kpIHsKLQotICAgICAgICAgICAgICAgIGlmICghIG9wal9qMmtfd3JpdGVfbWN0X3JlY29yZChwX2oyayxsX21jdF9yZWNvcmQscF9zdHJlYW0scF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICArK2xfbWN0X3JlY29yZDsKLSAgICAgICAgfQotCi0gICAgICAgIGxfbWNjX3JlY29yZCA9IGxfdGNwLT5tX21jY19yZWNvcmRzOwotCi0gICAgICAgIGZvciAgICAgKGk9MDtpPGxfdGNwLT5tX25iX21jY19yZWNvcmRzOysraSkgewotCi0gICAgICAgICAgICAgICAgaWYgKCEgb3BqX2oya193cml0ZV9tY2NfcmVjb3JkKHBfajJrLGxfbWNjX3JlY29yZCxwX3N0cmVhbSxwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICsrbF9tY2NfcmVjb3JkOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCEgb3BqX2oya193cml0ZV9tY28ocF9qMmsscF9zdHJlYW0scF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLSNpZiAwCi1PUEpfQk9PTCBvcGpfajJrX3dyaXRlX2FsbF9jb2Mob3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIgKQotewotICAgICAgICBPUEpfVUlOVDMyIGNvbXBubzsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotCi0gICAgICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHM7ICsrY29tcG5vKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCEgb3BqX2oya193cml0ZV9jb2MocF9qMmssY29tcG5vLHBfc3RyZWFtLCBwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLSNlbmRpZgotCi0jaWYgMAotT1BKX0JPT0wgb3BqX2oya193cml0ZV9hbGxfcWNjKG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyICkKLXsKLSAgICAgICAgT1BKX1VJTlQzMiBjb21wbm87Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKLQotICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOyArK2NvbXBubykKLSAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghIG9wal9qMmtfd3JpdGVfcWNjKHBfajJrLGNvbXBubyxwX3N0cmVhbSwgcF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0jZW5kaWYKLQotCi1PUEpfQk9PTCBvcGpfajJrX3dyaXRlX3JlZ2lvbnMoIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlciApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgY29tcG5vOwotICAgICAgICBjb25zdCBvcGpfdGNjcF90ICpsX3RjY3AgPSAwMDsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotCi0gICAgICAgIGxfdGNjcCA9IHBfajJrLT5tX2NwLnRjcHMtPnRjY3BzOwotCi0gICAgICAgIGZvciAgICAgKGNvbXBubyA9IDA7IGNvbXBubyA8IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOyArK2NvbXBubykgIHsKLSAgICAgICAgICAgICAgICBpZiAobF90Y2NwLT5yb2lzaGlmdCkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBvcGpfajJrX3dyaXRlX3JnbihwX2oyaywwLGNvbXBubyxwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wcyxwX3N0cmVhbSxwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgKytsX3RjY3A7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9CT09MIG9wal9qMmtfd3JpdGVfZXBjKCAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIgKQotewotICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmRleF90ICogbF9jc3RyX2luZGV4ID0gMDA7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKLQotICAgICAgICBsX2NzdHJfaW5kZXggPSBwX2oyay0+Y3N0cl9pbmRleDsKLSAgICAgICAgaWYgKGxfY3N0cl9pbmRleCkgewotICAgICAgICAgICAgICAgIGxfY3N0cl9pbmRleC0+Y29kZXN0cmVhbV9zaXplID0gKE9QSl9VSU5UNjQpb3BqX3N0cmVhbV90ZWxsKHBfc3RyZWFtKTsKLSAgICAgICAgICAgICAgICAvKiBVbmlQRz4+ICovCi0gICAgICAgICAgICAgICAgLyogVGhlIGZvbGxvd2luZyBhZGp1c3RtZW50IGlzIGRvbmUgdG8gYWRqdXN0IHRoZSBjb2Rlc3RyZWFtIHNpemUgKi8KLSAgICAgICAgICAgICAgICAvKiBpZiBTT0QgaXMgbm90IGF0IDAgaW4gdGhlIGJ1ZmZlci4gVXNlZnVsIGluIGNhc2Ugb2YgSlAyLCB3aGVyZSAqLwotICAgICAgICAgICAgICAgIC8qIHRoZSBmaXJzdCBidW5jaCBvZiBieXRlcyBpcyBub3QgaW4gdGhlIGNvZGVzdHJlYW0gICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgbF9jc3RyX2luZGV4LT5jb2Rlc3RyZWFtX3NpemUgLT0gKE9QSl9VSU5UNjQpbF9jc3RyX2luZGV4LT5tYWluX2hlYWRfc3RhcnQ7Ci0gICAgICAgICAgICAgICAgLyogPDxVbmlQRyAqLwotICAgICAgICB9Ci0KLSNpZmRlZiBVU0VfSlBXTAotICAgICAgICAvKiBwcmVwYXJhdGlvbiBvZiBKUFdMIG1hcmtlciBzZWdtZW50cyAqLwotI2lmIDAKLSAgICAgICAgaWYoY3AtPmVwY19vbikgewotCi0gICAgICAgICAgICAgICAgLyogZW5jb2RlIGFjY29yZGluZyB0byBKUFdMICovCi0gICAgICAgICAgICAgICAganB3bF9lbmNvZGUocF9qMmssIHBfc3RyZWFtLCBpbWFnZSk7Ci0KLSAgICAgICAgfQotI2VuZGlmCi0gIGFzc2VydCggMCAmJiAiVE9ETyIgKTsKLSNlbmRpZiAvKiBVU0VfSlBXTCAqLwotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX0JPT0wgb3BqX2oya19yZWFkX3VuayAoICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKm91dHB1dF9tYXJrZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgbF91bmtub3duX21hcmtlcjsKLSAgICAgICAgY29uc3Qgb3BqX2RlY19tZW1vcnlfbWFya2VyX2hhbmRsZXJfdCAqIGxfbWFya2VyX2hhbmRsZXI7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9zaXplX3VuayA9IDI7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotCi0gICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIlVua25vd24gbWFya2VyXG4iKTsKLQotICAgICAgICB3aGlsZSgxKSB7Ci0gICAgICAgICAgICAgICAgLyogVHJ5IHRvIHJlYWQgMiBieXRlcyAodGhlIG5leHQgbWFya2VyIElEKSBmcm9tIHN0cmVhbSBhbmQgY29weSB0aGVtIGludG8gdGhlIGJ1ZmZlciovCi0gICAgICAgICAgICAgICAgaWYgKG9wal9zdHJlYW1fcmVhZF9kYXRhKHBfc3RyZWFtLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLDIscF9tYW5hZ2VyKSAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIHRvbyBzaG9ydFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIHJlYWQgMiBieXRlcyBhcyB0aGUgbmV3IG1hcmtlciBJRCovCi0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsJmxfdW5rbm93bl9tYXJrZXIsMik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIShsX3Vua25vd25fbWFya2VyIDwgMHhmZjAwKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG1hcmtlciBoYW5kbGVyIGZyb20gdGhlIG1hcmtlciBJRCovCi0gICAgICAgICAgICAgICAgICAgICAgICBsX21hcmtlcl9oYW5kbGVyID0gb3BqX2oya19nZXRfbWFya2VyX2hhbmRsZXIobF91bmtub3duX21hcmtlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlICYgbF9tYXJrZXJfaGFuZGxlci0+c3RhdGVzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTWFya2VyIGlzIG5vdCBjb21wbGlhbnQgd2l0aCBpdHMgcG9zaXRpb25cbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX21hcmtlcl9oYW5kbGVyLT5pZCAhPSBKMktfTVNfVU5LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWRkIHRoZSBtYXJrZXIgdG8gdGhlIGNvZGVzdHJlYW0gaW5kZXgqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX21hcmtlcl9oYW5kbGVyLT5pZCAhPSBKMktfTVNfU09UKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CT09MIHJlcyA9IG9wal9qMmtfYWRkX21obWFya2VyKHBfajJrLT5jc3RyX2luZGV4LCBKMktfTVNfVU5LLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfVUlOVDMyKSBvcGpfc3RyZWFtX3RlbGwocF9zdHJlYW0pIC0gbF9zaXplX3VuaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NpemVfdW5rKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gT1BKX0ZBTFNFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhZGQgbWggbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8qIG5leHQgbWFya2VyIGlzIGtub3duIGFuZCB3ZWxsIGxvY2F0ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zaXplX3VuayArPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgICpvdXRwdXRfbWFya2VyID0gbF9tYXJrZXJfaGFuZGxlci0+aWQgOwotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX0JPT0wgb3BqX2oya193cml0ZV9tY3RfcmVjb3JkKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX21jdF9kYXRhX3QgKiBwX21jdF9yZWNvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIgKQotewotICAgICAgICBPUEpfVUlOVDMyIGxfbWN0X3NpemU7Ci0gICAgICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3RtcDsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotCi0gICAgICAgIGxfbWN0X3NpemUgPSAxMCArIHBfbWN0X3JlY29yZC0+bV9kYXRhX3NpemU7Ci0KLSAgICAgICAgaWYgKGxfbWN0X3NpemUgPiBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUpIHsKLSAgICAgICAgICAgICAgICBPUEpfQllURSAqbmV3X2hlYWRlcl90aWxlX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwgbF9tY3Rfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCEgbmV3X2hlYWRlcl90aWxlX2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHdyaXRlIE1DVCBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IG5ld19oZWFkZXJfdGlsZV9kYXRhOwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IGxfbWN0X3NpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBsX2N1cnJlbnRfZGF0YSA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGE7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLEoyS19NU19NQ1QsMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNQ1QgKi8KLSAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF9tY3Rfc2l6ZS0yLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExtY3QgKi8KLSAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsMCwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWm1jdCAqLwotICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOwotCi0gICAgICAgIC8qIG9ubHkgb25lIG1hcmtlciBhdG0gKi8KLSAgICAgICAgbF90bXAgPSAocF9tY3RfcmVjb3JkLT5tX2luZGV4ICYgMHhmZikgfCAocF9tY3RfcmVjb3JkLT5tX2FycmF5X3R5cGUgPDwgOCkgfCAocF9tY3RfcmVjb3JkLT5tX2VsZW1lbnRfdHlwZSA8PCAxMCk7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfdG1wLDIpOwotICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwwLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBZbWN0ICovCi0gICAgICAgIGxfY3VycmVudF9kYXRhKz0yOwotCi0gICAgICAgIG1lbWNweShsX2N1cnJlbnRfZGF0YSxwX21jdF9yZWNvcmQtPm1fZGF0YSxwX21jdF9yZWNvcmQtPm1fZGF0YV9zaXplKTsKLQotICAgICAgICBpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKHBfc3RyZWFtLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsbF9tY3Rfc2l6ZSxwX21hbmFnZXIpICE9IGxfbWN0X3NpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi0vKioKLSAqIFJlYWRzIGEgTUNUIG1hcmtlciAoTXVsdGlwbGUgQ29tcG9uZW50IFRyYW5zZm9ybSkKLSAqCi0gKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgTUNUIGJveC4KLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgTUNUIG1hcmtlci4KLSAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfbWN0ICggICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfdG1wOwotICAgICAgICBPUEpfVUlOVDMyIGxfaW5kaXg7Ci0gICAgICAgIG9wal9tY3RfZGF0YV90ICogbF9tY3RfZGF0YTsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLQotICAgICAgICBsX3RjcCA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IEoyS19TVEFURV9UUEggPwotICAgICAgICAgICAgICAgICAgICAgICAgJnBfajJrLT5tX2NwLnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0gOgotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3A7Ci0KLSAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCAyKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgTUNUIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGZpcnN0IG1hcmtlciAqLwotICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX3RtcCwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogWm1jdCAqLwotICAgICAgICBwX2hlYWRlcl9kYXRhICs9IDI7Ci0gICAgICAgIGlmIChsX3RtcCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiQ2Fubm90IHRha2UgaW4gY2hhcmdlIG1jdCBkYXRhIHdpdGhpbiBtdWx0aXBsZSBNQ1QgcmVjb3Jkc1xuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYocF9oZWFkZXJfc2l6ZSA8PSA2KSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgTUNUIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEltY3QgLT4gbm8gbmVlZCBmb3Igb3RoZXIgdmFsdWVzLCB0YWtlIHRoZSBmaXJzdCwgdHlwZSBpcyBkb3VibGUgd2l0aCBkZWNvcnJlbGF0aW9uIHgwMDAwIDExMDEgMDAwMCAwMDAwKi8KLSAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF90bXAsMik7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEltY3QgKi8KLSAgICAgICAgcF9oZWFkZXJfZGF0YSArPSAyOwotCi0gICAgICAgIGxfaW5kaXggPSBsX3RtcCAmIDB4ZmY7Ci0gICAgICAgIGxfbWN0X2RhdGEgPSBsX3RjcC0+bV9tY3RfcmVjb3JkczsKLQotICAgICAgICBmb3IgKGk9MDtpPGxfdGNwLT5tX25iX21jdF9yZWNvcmRzOysraSkgewotICAgICAgICAgICAgICAgIGlmIChsX21jdF9kYXRhLT5tX2luZGV4ID09IGxfaW5kaXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICArK2xfbWN0X2RhdGE7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBOT1QgRk9VTkQgKi8KLSAgICAgICAgaWYgKGkgPT0gbF90Y3AtPm1fbmJfbWN0X3JlY29yZHMpIHsKLSAgICAgICAgICAgICAgICBpZiAobF90Y3AtPm1fbmJfbWN0X3JlY29yZHMgPT0gbF90Y3AtPm1fbmJfbWF4X21jdF9yZWNvcmRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfbWN0X2RhdGFfdCAqbmV3X21jdF9yZWNvcmRzOwotICAgICAgICAgICAgICAgICAgICAgICAgbF90Y3AtPm1fbmJfbWF4X21jdF9yZWNvcmRzICs9IE9QSl9KMktfTUNUX0RFRkFVTFRfTkJfUkVDT1JEUzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3X21jdF9yZWNvcmRzID0gKG9wal9tY3RfZGF0YV90ICopIG9wal9yZWFsbG9jKGxfdGNwLT5tX21jdF9yZWNvcmRzLCBsX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMgKiBzaXplb2Yob3BqX21jdF9kYXRhX3QpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG5ld19tY3RfcmVjb3JkcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX3RjcC0+bV9tY3RfcmVjb3Jkcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNwLT5tX21jdF9yZWNvcmRzID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90Y3AtPm1fbmJfbWF4X21jdF9yZWNvcmRzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90Y3AtPm1fbmJfbWN0X3JlY29yZHMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBNQ1QgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNwLT5tX21jdF9yZWNvcmRzID0gbmV3X21jdF9yZWNvcmRzOwotICAgICAgICAgICAgICAgICAgICAgICAgbF9tY3RfZGF0YSA9IGxfdGNwLT5tX21jdF9yZWNvcmRzICsgbF90Y3AtPm1fbmJfbWN0X3JlY29yZHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQobF9tY3RfZGF0YSAsMCwobF90Y3AtPm1fbmJfbWF4X21jdF9yZWNvcmRzIC0gbF90Y3AtPm1fbmJfbWN0X3JlY29yZHMpICogc2l6ZW9mKG9wal9tY3RfZGF0YV90KSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbF9tY3RfZGF0YSA9IGxfdGNwLT5tX21jdF9yZWNvcmRzICsgbF90Y3AtPm1fbmJfbWN0X3JlY29yZHM7Ci0gICAgICAgICAgICAgICAgKytsX3RjcC0+bV9uYl9tY3RfcmVjb3JkczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsX21jdF9kYXRhLT5tX2RhdGEpIHsKLSAgICAgICAgICAgICAgICBvcGpfZnJlZShsX21jdF9kYXRhLT5tX2RhdGEpOwotICAgICAgICAgICAgICAgIGxfbWN0X2RhdGEtPm1fZGF0YSA9IDAwOwotICAgICAgICB9Ci0KLSAgICAgICAgbF9tY3RfZGF0YS0+bV9pbmRleCA9IGxfaW5kaXg7Ci0gICAgICAgIGxfbWN0X2RhdGEtPm1fYXJyYXlfdHlwZSA9IChKMktfTUNUX0FSUkFZX1RZUEUpKChsX3RtcCAgPj4gOCkgJiAzKTsKLSAgICAgICAgbF9tY3RfZGF0YS0+bV9lbGVtZW50X3R5cGUgPSAoSjJLX01DVF9FTEVNRU5UX1RZUEUpKChsX3RtcCAgPj4gMTApICYgMyk7Ci0KLSAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF90bXAsMik7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFltY3QgKi8KLSAgICAgICAgcF9oZWFkZXJfZGF0YSs9MjsKLSAgICAgICAgaWYgKGxfdG1wICE9IDApIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbXVsdGlwbGUgTUNUIG1hcmtlcnNcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKLSAgICAgICAgfQotCi0gICAgICAgIHBfaGVhZGVyX3NpemUgLT0gNjsKLQotICAgICAgICBsX21jdF9kYXRhLT5tX2RhdGEgPSAoT1BKX0JZVEUqKW9wal9tYWxsb2MocF9oZWFkZXJfc2l6ZSk7Ci0gICAgICAgIGlmICghIGxfbWN0X2RhdGEtPm1fZGF0YSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIE1DVCBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5KGxfbWN0X2RhdGEtPm1fZGF0YSxwX2hlYWRlcl9kYXRhLHBfaGVhZGVyX3NpemUpOwotCi0gICAgICAgIGxfbWN0X2RhdGEtPm1fZGF0YV9zaXplID0gcF9oZWFkZXJfc2l6ZTsKLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9CT09MIG9wal9qMmtfd3JpdGVfbWNjX3JlY29yZCggICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGEgKiBwX21jY19yZWNvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIgKQotewotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9tY2Nfc2l6ZTsKLSAgICAgICAgT1BKX0JZVEUgKiBsX2N1cnJlbnRfZGF0YSA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfYnl0ZXNfZm9yX2NvbXA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9tYXNrOwotICAgICAgICBPUEpfVUlOVDMyIGxfdG1jYzsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotCi0gICAgICAgIGlmIChwX21jY19yZWNvcmQtPm1fbmJfY29tcHMgPiAyNTUgKSB7Ci0gICAgICAgIGxfbmJfYnl0ZXNfZm9yX2NvbXAgPSAyOwotICAgICAgICAgICAgICAgIGxfbWFzayA9IDB4ODAwMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBsX25iX2J5dGVzX2Zvcl9jb21wID0gMTsKLSAgICAgICAgICAgICAgICBsX21hc2sgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgbF9tY2Nfc2l6ZSA9IHBfbWNjX3JlY29yZC0+bV9uYl9jb21wcyAqIDIgKiBsX25iX2J5dGVzX2Zvcl9jb21wICsgMTk7Ci0gICAgICAgIGlmIChsX21jY19zaXplID4gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT1BKX0JZVEUgKm5ld19oZWFkZXJfdGlsZV9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsIGxfbWNjX3NpemUpOwotICAgICAgICAgICAgICAgIGlmICghIG5ld19oZWFkZXJfdGlsZV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byB3cml0ZSBNQ0MgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBuZXdfaGVhZGVyX3RpbGVfZGF0YTsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSBsX21jY19zaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgbF9jdXJyZW50X2RhdGEgPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxKMktfTVNfTUNDLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTUNDICovCi0gICAgICAgIGxfY3VycmVudF9kYXRhICs9IDI7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfbWNjX3NpemUtMiwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMbWNjICovCi0gICAgICAgIGxfY3VycmVudF9kYXRhICs9IDI7Ci0KLSAgICAgICAgLyogZmlyc3QgbWFya2VyICovCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwwLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFptY2MgKi8KLSAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEscF9tY2NfcmVjb3JkLT5tX2luZGV4LDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbWNjIC0+IG5vIG5lZWQgZm9yIG90aGVyIHZhbHVlcywgdGFrZSB0aGUgZmlyc3QgKi8KLSAgICAgICAgKytsX2N1cnJlbnRfZGF0YTsKLQotICAgICAgICAvKiBvbmx5IG9uZSBtYXJrZXIgYXRtICovCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwwLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFltY2MgKi8KLSAgICAgICAgbF9jdXJyZW50X2RhdGErPTI7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLDEsMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUW1jYyAtPiBudW1iZXIgb2YgY29sbGVjdGlvbnMgLT4gMSAqLwotICAgICAgICBsX2N1cnJlbnRfZGF0YSs9MjsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsMHgxLDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBYbWNjaSB0eXBlIG9mIGNvbXBvbmVudCB0cmFuc2Zvcm1hdGlvbiAtPiBhcnJheSBiYXNlZCBkZWNvcnJlbGF0aW9uICovCi0gICAgICAgICsrbF9jdXJyZW50X2RhdGE7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLHBfbWNjX3JlY29yZC0+bV9uYl9jb21wcyB8IGxfbWFzaywyKTsgICAgLyogTm1jY2kgbnVtYmVyIG9mIGlucHV0IGNvbXBvbmVudHMgaW52b2x2ZWQgYW5kIHNpemUgZm9yIGVhY2ggY29tcG9uZW50IG9mZnNldCA9IDggYml0cyAqLwotICAgICAgICBsX2N1cnJlbnRfZGF0YSs9MjsKLQotICAgICAgICBmb3IgKGk9MDtpPHBfbWNjX3JlY29yZC0+bV9uYl9jb21wczsrK2kpIHsKLSAgICAgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsaSxsX25iX2J5dGVzX2Zvcl9jb21wKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENtY2NpaiBDb21wb25lbnQgb2Zmc2V0Ki8KLSAgICAgICAgICAgICAgICBsX2N1cnJlbnRfZGF0YSs9bF9uYl9ieXRlc19mb3JfY29tcDsKLSAgICAgICAgfQotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxwX21jY19yZWNvcmQtPm1fbmJfY29tcHN8bF9tYXNrLDIpOyAgICAgIC8qIE1tY2NpIG51bWJlciBvZiBvdXRwdXQgY29tcG9uZW50cyBpbnZvbHZlZCBhbmQgc2l6ZSBmb3IgZWFjaCBjb21wb25lbnQgb2Zmc2V0ID0gOCBiaXRzICovCi0gICAgICAgIGxfY3VycmVudF9kYXRhKz0yOwotCi0gICAgICAgIGZvciAoaT0wO2k8cF9tY2NfcmVjb3JkLT5tX25iX2NvbXBzOysraSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxpLGxfbmJfYnl0ZXNfZm9yX2NvbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV21jY2lqIENvbXBvbmVudCBvZmZzZXQqLwotICAgICAgICAgICAgICAgIGxfY3VycmVudF9kYXRhKz1sX25iX2J5dGVzX2Zvcl9jb21wOwotICAgICAgICB9Ci0KLSAgICAgICAgbF90bWNjID0gKCghcF9tY2NfcmVjb3JkLT5tX2lzX2lycmV2ZXJzaWJsZSkmMSk8PDE2OwotCi0gICAgICAgIGlmIChwX21jY19yZWNvcmQtPm1fZGVjb3JyZWxhdGlvbl9hcnJheSkgewotICAgICAgICAgICAgICAgIGxfdG1jYyB8PSBwX21jY19yZWNvcmQtPm1fZGVjb3JyZWxhdGlvbl9hcnJheS0+bV9pbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwX21jY19yZWNvcmQtPm1fb2Zmc2V0X2FycmF5KSB7Ci0gICAgICAgICAgICAgICAgbF90bWNjIHw9ICgocF9tY2NfcmVjb3JkLT5tX29mZnNldF9hcnJheS0+bV9pbmRleCk8PDgpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfdG1jYywzKTsgICAgICAgLyogVG1jY2kgOiB1c2UgTUNUIGRlZmluZWQgYXMgbnVtYmVyIDEgYW5kIGlycmV2ZXJzaWJsZSBhcnJheSBiYXNlZC4gKi8KLSAgICAgICAgbF9jdXJyZW50X2RhdGErPTM7Ci0KLSAgICAgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLGxfbWNjX3NpemUscF9tYW5hZ2VyKSAhPSBsX21jY19zaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX0JPT0wgb3BqX2oya19yZWFkX21jYyAoICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKLXsKLSAgICAgICAgT1BKX1VJTlQzMiBpLGo7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF90bXA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9pbmRpeDsKLSAgICAgICAgb3BqX3RjcF90ICogbF90Y3A7Ci0gICAgICAgIG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90ICogbF9tY2NfcmVjb3JkOwotICAgICAgICBvcGpfbWN0X2RhdGFfdCAqIGxfbWN0X2RhdGE7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl9jb2xsZWN0aW9uczsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX2NvbXBzOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfYnl0ZXNfYnlfY29tcDsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0KLSAgICAgICAgbF90Y3AgPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9PSBKMktfU1RBVEVfVFBIID8KLSAgICAgICAgICAgICAgICAgICAgICAgICZwX2oyay0+bV9jcC50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwOwotCi0gICAgICAgIGlmIChwX2hlYWRlcl9zaXplIDwgMikgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIE1DQyBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBmaXJzdCBtYXJrZXIgKi8KLSAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF90bXAsMik7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFptY2MgKi8KLSAgICAgICAgcF9oZWFkZXJfZGF0YSArPSAyOwotICAgICAgICBpZiAobF90bXAgIT0gMCkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkNhbm5vdCB0YWtlIGluIGNoYXJnZSBtdWx0aXBsZSBkYXRhIHNwYW5uaW5nXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocF9oZWFkZXJfc2l6ZSA8IDcpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBNQ0MgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9pbmRpeCwxKTsgLyogSW1jYyAtPiBubyBuZWVkIGZvciBvdGhlciB2YWx1ZXMsIHRha2UgdGhlIGZpcnN0ICovCi0gICAgICAgICsrcF9oZWFkZXJfZGF0YTsKLQotICAgICAgICBsX21jY19yZWNvcmQgPSBsX3RjcC0+bV9tY2NfcmVjb3JkczsKLQotICAgICAgICBmb3IoaT0wO2k8bF90Y3AtPm1fbmJfbWNjX3JlY29yZHM7KytpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxfbWNjX3JlY29yZC0+bV9pbmRleCA9PSBsX2luZGl4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKytsX21jY19yZWNvcmQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogTk9UIEZPVU5EICovCi0gICAgICAgIGlmIChpID09IGxfdGNwLT5tX25iX21jY19yZWNvcmRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxfdGNwLT5tX25iX21jY19yZWNvcmRzID09IGxfdGNwLT5tX25iX21heF9tY2NfcmVjb3JkcykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3NpbXBsZV9tY2NfZGVjb3JyZWxhdGlvbl9kYXRhX3QgKm5ld19tY2NfcmVjb3JkczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNwLT5tX25iX21heF9tY2NfcmVjb3JkcyArPSBPUEpfSjJLX01DQ19ERUZBVUxUX05CX1JFQ09SRFM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld19tY2NfcmVjb3JkcyA9IChvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCAqKSBvcGpfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RjcC0+bV9tY2NfcmVjb3JkcywgbF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzICogc2l6ZW9mKG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBuZXdfbWNjX3JlY29yZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF90Y3AtPm1fbWNjX3JlY29yZHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RjcC0+bV9tY2NfcmVjb3JkcyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNwLT5tX25iX21heF9tY2NfcmVjb3JkcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNwLT5tX25iX21jY19yZWNvcmRzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgTUNDIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX3RjcC0+bV9tY2NfcmVjb3JkcyA9IG5ld19tY2NfcmVjb3JkczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfbWNjX3JlY29yZCA9IGxfdGNwLT5tX21jY19yZWNvcmRzICsgbF90Y3AtPm1fbmJfbWNjX3JlY29yZHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQobF9tY2NfcmVjb3JkLDAsKGxfdGNwLT5tX25iX21heF9tY2NfcmVjb3Jkcy1sX3RjcC0+bV9uYl9tY2NfcmVjb3JkcykgKiBzaXplb2Yob3BqX3NpbXBsZV9tY2NfZGVjb3JyZWxhdGlvbl9kYXRhX3QpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbF9tY2NfcmVjb3JkID0gbF90Y3AtPm1fbWNjX3JlY29yZHMgKyBsX3RjcC0+bV9uYl9tY2NfcmVjb3JkczsKLSAgICAgICAgfQotICAgICAgICBsX21jY19yZWNvcmQtPm1faW5kZXggPSBsX2luZGl4OwotCi0gICAgICAgIC8qIG9ubHkgb25lIG1hcmtlciBhdG0gKi8KLSAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF90bXAsMik7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFltY2MgKi8KLSAgICAgICAgcF9oZWFkZXJfZGF0YSs9MjsKLSAgICAgICAgaWYgKGxfdG1wICE9IDApIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbXVsdGlwbGUgZGF0YSBzcGFubmluZ1xuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9uYl9jb2xsZWN0aW9ucywyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRbWNjIC0+IG51bWJlciBvZiBjb2xsZWN0aW9ucyAtPiAxICovCi0gICAgICAgIHBfaGVhZGVyX2RhdGErPTI7Ci0KLSAgICAgICAgaWYgKGxfbmJfY29sbGVjdGlvbnMgPiAxKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiQ2Fubm90IHRha2UgaW4gY2hhcmdlIG11bHRpcGxlIGNvbGxlY3Rpb25zXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBwX2hlYWRlcl9zaXplIC09IDc7Ci0KLSAgICAgICAgZm9yIChpPTA7aTxsX25iX2NvbGxlY3Rpb25zOysraSkgewotICAgICAgICAgICAgICAgIGlmIChwX2hlYWRlcl9zaXplIDwgMykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgTUNDIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfdG1wLDEpOyAvKiBYbWNjaSB0eXBlIG9mIGNvbXBvbmVudCB0cmFuc2Zvcm1hdGlvbiAtPiBhcnJheSBiYXNlZCBkZWNvcnJlbGF0aW9uICovCi0gICAgICAgICAgICAgICAgKytwX2hlYWRlcl9kYXRhOwotCi0gICAgICAgICAgICAgICAgaWYgKGxfdG1wICE9IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkNhbm5vdCB0YWtlIGluIGNoYXJnZSBjb2xsZWN0aW9ucyBvdGhlciB0aGFuIGFycmF5IGRlY29ycmVsYXRpb25cbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfbmJfY29tcHMsMik7Ci0KLSAgICAgICAgICAgICAgICBwX2hlYWRlcl9kYXRhKz0yOwotICAgICAgICAgICAgICAgIHBfaGVhZGVyX3NpemUtPTM7Ci0KLSAgICAgICAgICAgICAgICBsX25iX2J5dGVzX2J5X2NvbXAgPSAxICsgKGxfbmJfY29tcHM+PjE1KTsKLSAgICAgICAgICAgICAgICBsX21jY19yZWNvcmQtPm1fbmJfY29tcHMgPSBsX25iX2NvbXBzICYgMHg3ZmZmOwotCi0gICAgICAgICAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCAobF9uYl9ieXRlc19ieV9jb21wICogbF9tY2NfcmVjb3JkLT5tX25iX2NvbXBzICsgMikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIE1DQyBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwX2hlYWRlcl9zaXplIC09IChsX25iX2J5dGVzX2J5X2NvbXAgKiBsX21jY19yZWNvcmQtPm1fbmJfY29tcHMgKyAyKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9tY2NfcmVjb3JkLT5tX25iX2NvbXBzOysraikgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF90bXAsbF9uYl9ieXRlc19ieV9jb21wKTsgICAgICAgIC8qIENtY2NpaiBDb21wb25lbnQgb2Zmc2V0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBfaGVhZGVyX2RhdGErPWxfbmJfYnl0ZXNfYnlfY29tcDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfdG1wICE9IGopIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiQ2Fubm90IHRha2UgaW4gY2hhcmdlIGNvbGxlY3Rpb25zIHdpdGggaW5kaXggc2h1ZmZsZVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX25iX2NvbXBzLDIpOwotICAgICAgICAgICAgICAgIHBfaGVhZGVyX2RhdGErPTI7Ci0KLSAgICAgICAgICAgICAgICBsX25iX2J5dGVzX2J5X2NvbXAgPSAxICsgKGxfbmJfY29tcHM+PjE1KTsKLSAgICAgICAgICAgICAgICBsX25iX2NvbXBzICY9IDB4N2ZmZjsKLQotICAgICAgICAgICAgICAgIGlmIChsX25iX2NvbXBzICE9IGxfbWNjX3JlY29yZC0+bV9uYl9jb21wcykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiQ2Fubm90IHRha2UgaW4gY2hhcmdlIGNvbGxlY3Rpb25zIHdpdGhvdXQgc2FtZSBudW1iZXIgb2YgaW5kaXhlc1xuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCAobF9uYl9ieXRlc19ieV9jb21wICogbF9tY2NfcmVjb3JkLT5tX25iX2NvbXBzICsgMykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIE1DQyBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwX2hlYWRlcl9zaXplIC09IChsX25iX2J5dGVzX2J5X2NvbXAgKiBsX21jY19yZWNvcmQtPm1fbmJfY29tcHMgKyAzKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9tY2NfcmVjb3JkLT5tX25iX2NvbXBzOysraikgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF90bXAsbF9uYl9ieXRlc19ieV9jb21wKTsgICAgICAgIC8qIFdtY2NpaiBDb21wb25lbnQgb2Zmc2V0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBfaGVhZGVyX2RhdGErPWxfbmJfYnl0ZXNfYnlfY29tcDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfdG1wICE9IGopIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiQ2Fubm90IHRha2UgaW4gY2hhcmdlIGNvbGxlY3Rpb25zIHdpdGggaW5kaXggc2h1ZmZsZVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX3RtcCwzKTsgLyogV21jY2lqIENvbXBvbmVudCBvZmZzZXQqLwotICAgICAgICAgICAgICAgIHBfaGVhZGVyX2RhdGEgKz0gMzsKLQotICAgICAgICAgICAgICAgIGxfbWNjX3JlY29yZC0+bV9pc19pcnJldmVyc2libGUgPSAhICgobF90bXA+PjE2KSAmIDEpOwotICAgICAgICAgICAgICAgIGxfbWNjX3JlY29yZC0+bV9kZWNvcnJlbGF0aW9uX2FycmF5ID0gMDA7Ci0gICAgICAgICAgICAgICAgbF9tY2NfcmVjb3JkLT5tX29mZnNldF9hcnJheSA9IDAwOwotCi0gICAgICAgICAgICAgICAgbF9pbmRpeCA9IGxfdG1wICYgMHhmZjsKLSAgICAgICAgICAgICAgICBpZiAobF9pbmRpeCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX21jdF9kYXRhID0gbF90Y3AtPm1fbWN0X3JlY29yZHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfdGNwLT5tX25iX21jdF9yZWNvcmRzOysraikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9tY3RfZGF0YS0+bV9pbmRleCA9PSBsX2luZGl4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9tY2NfcmVjb3JkLT5tX2RlY29ycmVsYXRpb25fYXJyYXkgPSBsX21jdF9kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9tY3RfZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfbWNjX3JlY29yZC0+bV9kZWNvcnJlbGF0aW9uX2FycmF5ID09IDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIE1DQyBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxfaW5kaXggPSAobF90bXAgPj4gOCkgJiAweGZmOwotICAgICAgICAgICAgICAgIGlmIChsX2luZGl4ICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfbWN0X2RhdGEgPSBsX3RjcC0+bV9tY3RfcmVjb3JkczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF90Y3AtPm1fbmJfbWN0X3JlY29yZHM7KytqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX21jdF9kYXRhLT5tX2luZGV4ID09IGxfaW5kaXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX21jY19yZWNvcmQtPm1fb2Zmc2V0X2FycmF5ID0gbF9tY3RfZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfbWN0X2RhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX21jY19yZWNvcmQtPm1fb2Zmc2V0X2FycmF5ID09IDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIE1DQyBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwX2hlYWRlcl9zaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBNQ0MgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgKytsX3RjcC0+bV9uYl9tY2NfcmVjb3JkczsKLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9CT09MIG9wal9qMmtfd3JpdGVfbWNvKCAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX21jb19zaXplOwotICAgICAgICBvcGpfdGNwX3QgKiBsX3RjcCA9IDAwOwotICAgICAgICBvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCAqIGxfbWNjX3JlY29yZDsKLSAgICAgICAgT1BKX1VJTlQzMiBpOwotCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7Ci0KLSAgICAgICAgbF90Y3AgPSYocF9qMmstPm1fY3AudGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXSk7Ci0gICAgICAgIGxfY3VycmVudF9kYXRhID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YTsKLQotICAgICAgICBsX21jb19zaXplID0gNSArIGxfdGNwLT5tX25iX21jY19yZWNvcmRzOwotICAgICAgICBpZiAobF9tY29fc2l6ZSA+IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSkgewotCi0gICAgICAgICAgICAgICAgT1BKX0JZVEUgKm5ld19oZWFkZXJfdGlsZV9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsIGxfbWNvX3NpemUpOwotICAgICAgICAgICAgICAgIGlmICghIG5ld19oZWFkZXJfdGlsZV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byB3cml0ZSBNQ08gbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBuZXdfaGVhZGVyX3RpbGVfZGF0YTsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSBsX21jb19zaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLEoyS19NU19NQ08sMik7ICAgICAgICAgICAgICAgICAgIC8qIE1DTyAqLwotICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX21jb19zaXplLTIsMik7ICAgICAgICAgICAgICAgICAvKiBMbWNvICovCi0gICAgICAgIGxfY3VycmVudF9kYXRhICs9IDI7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfdGNwLT5tX25iX21jY19yZWNvcmRzLDEpOyAgICAgIC8qIE5tY28gOiBvbmx5IG9uZSB0cmFuZm9ybSBzdGFnZSovCi0gICAgICAgICsrbF9jdXJyZW50X2RhdGE7Ci0KLSAgICAgICAgbF9tY2NfcmVjb3JkID0gbF90Y3AtPm1fbWNjX3JlY29yZHM7Ci0gICAgICAgIGZvciAgICAgKGk9MDtpPGxfdGNwLT5tX25iX21jY19yZWNvcmRzOysraSkgewotICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX21jY19yZWNvcmQtPm1faW5kZXgsMSk7LyogSW1jbyAtPiB1c2UgdGhlIG1jYyBpbmRpY2F0ZWQgYnkgMSovCi0gICAgICAgICAgICAgICAgKytsX2N1cnJlbnRfZGF0YTsKLQotICAgICAgICAgICAgICAgICsrbF9tY2NfcmVjb3JkOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLGxfbWNvX3NpemUscF9tYW5hZ2VyKSAhPSBsX21jb19zaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotLyoqCi0gKiBSZWFkcyBhIE1DTyBtYXJrZXIgKE11bHRpcGxlIENvbXBvbmVudCBUcmFuc2Zvcm0gT3JkZXJpbmcpCi0gKgotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIE1DTyBib3guCi0gKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIE1DTyBtYXJrZXIuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX21jbyAoICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAgICAgICBPUEpfVUlOVDMyIGxfdG1wLCBpOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfc3RhZ2VzOwotICAgICAgICBvcGpfdGNwX3QgKiBsX3RjcDsKLSAgICAgICAgb3BqX3RjY3BfdCAqIGxfdGNjcDsKLSAgICAgICAgb3BqX2ltYWdlX3QgKiBsX2ltYWdlOwotCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLQotICAgICAgICBsX2ltYWdlID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZTsKLSAgICAgICAgbF90Y3AgPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9PSBKMktfU1RBVEVfVFBIID8KLSAgICAgICAgICAgICAgICAgICAgICAgICZwX2oyay0+bV9jcC50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwOwotCi0gICAgICAgIGlmIChwX2hlYWRlcl9zaXplIDwgMSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIE1DTyBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX25iX3N0YWdlcywxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObWNvIDogb25seSBvbmUgdHJhbmZvcm0gc3RhZ2UqLwotICAgICAgICArK3BfaGVhZGVyX2RhdGE7Ci0KLSAgICAgICAgaWYgKGxfbmJfc3RhZ2VzID4gMSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkNhbm5vdCB0YWtlIGluIGNoYXJnZSBtdWx0aXBsZSB0cmFuc2Zvcm1hdGlvbiBzdGFnZXMuXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocF9oZWFkZXJfc2l6ZSAhPSBsX25iX3N0YWdlcyArIDEpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJFcnJvciByZWFkaW5nIE1DTyBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBsX3RjY3AgPSBsX3RjcC0+dGNjcHM7Ci0KLSAgICAgICAgZm9yIChpPTA7aTxsX2ltYWdlLT5udW1jb21wczsrK2kpIHsKLSAgICAgICAgICAgICAgICBsX3RjY3AtPm1fZGNfbGV2ZWxfc2hpZnQgPSAwOwotICAgICAgICAgICAgICAgICsrbF90Y2NwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxfdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgpIHsKLSAgICAgICAgICAgICAgICBvcGpfZnJlZShsX3RjcC0+bV9tY3RfZGVjb2RpbmdfbWF0cml4KTsKLSAgICAgICAgICAgICAgICBsX3RjcC0+bV9tY3RfZGVjb2RpbmdfbWF0cml4ID0gMDA7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGk9MDtpPGxfbmJfc3RhZ2VzOysraSkgewotICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfdG1wLDEpOwotICAgICAgICAgICAgICAgICsrcF9oZWFkZXJfZGF0YTsKLQotICAgICAgICAgICAgICAgIGlmICghIG9wal9qMmtfYWRkX21jdChsX3RjcCxwX2oyay0+bV9wcml2YXRlX2ltYWdlLGxfdG1wKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9CT09MIG9wal9qMmtfYWRkX21jdChvcGpfdGNwX3QgKiBwX3RjcCwgb3BqX2ltYWdlX3QgKiBwX2ltYWdlLCBPUEpfVUlOVDMyIHBfaW5kZXgpCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgb3BqX3NpbXBsZV9tY2NfZGVjb3JyZWxhdGlvbl9kYXRhX3QgKiBsX21jY19yZWNvcmQ7Ci0gICAgICAgIG9wal9tY3RfZGF0YV90ICogbF9kZWNvX2FycmF5LCAqIGxfb2Zmc2V0X2FycmF5OwotICAgICAgICBPUEpfVUlOVDMyIGxfZGF0YV9zaXplLGxfbWN0X3NpemUsIGxfb2Zmc2V0X3NpemU7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl9lbGVtOwotICAgICAgICBPUEpfVUlOVDMyICogbF9vZmZzZXRfZGF0YSwgKiBsX2N1cnJlbnRfb2Zmc2V0X2RhdGE7Ci0gICAgICAgIG9wal90Y2NwX3QgKiBsX3RjY3A7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF90Y3AgIT0gMDApOwotCi0gICAgICAgIGxfbWNjX3JlY29yZCA9IHBfdGNwLT5tX21jY19yZWNvcmRzOwotCi0gICAgICAgIGZvciAoaT0wO2k8cF90Y3AtPm1fbmJfbWNjX3JlY29yZHM7KytpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxfbWNjX3JlY29yZC0+bV9pbmRleCA9PSBwX2luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaT09cF90Y3AtPm1fbmJfbWNjX3JlY29yZHMpIHsKLSAgICAgICAgICAgICAgICAvKiogZWxlbWVudCBkaXNjYXJkZWQgKiovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxfbWNjX3JlY29yZC0+bV9uYl9jb21wcyAhPSBwX2ltYWdlLT5udW1jb21wcykgewotICAgICAgICAgICAgICAgIC8qKiBkbyBub3Qgc3VwcG9ydCBudW1iZXIgb2YgY29tcHMgIT0gaW1hZ2UgKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBsX2RlY29fYXJyYXkgPSBsX21jY19yZWNvcmQtPm1fZGVjb3JyZWxhdGlvbl9hcnJheTsKLQotICAgICAgICBpZiAobF9kZWNvX2FycmF5KSB7Ci0gICAgICAgICAgICAgICAgbF9kYXRhX3NpemUgPSBNQ1RfRUxFTUVOVF9TSVpFW2xfZGVjb19hcnJheS0+bV9lbGVtZW50X3R5cGVdICogcF9pbWFnZS0+bnVtY29tcHMgKiBwX2ltYWdlLT5udW1jb21wczsKLSAgICAgICAgICAgICAgICBpZiAobF9kZWNvX2FycmF5LT5tX2RhdGFfc2l6ZSAhPSBsX2RhdGFfc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsX25iX2VsZW0gPSBwX2ltYWdlLT5udW1jb21wcyAqIHBfaW1hZ2UtPm51bWNvbXBzOwotICAgICAgICAgICAgICAgIGxfbWN0X3NpemUgPSBsX25iX2VsZW0gKiAoT1BKX1VJTlQzMilzaXplb2YoT1BKX0ZMT0FUMzIpOwotICAgICAgICAgICAgICAgIHBfdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXggPSAoT1BKX0ZMT0FUMzIqKW9wal9tYWxsb2MobF9tY3Rfc2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoISBwX3RjcC0+bV9tY3RfZGVjb2RpbmdfbWF0cml4ICkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBqMmtfbWN0X3JlYWRfZnVuY3Rpb25zX3RvX2Zsb2F0W2xfZGVjb19hcnJheS0+bV9lbGVtZW50X3R5cGVdKGxfZGVjb19hcnJheS0+bV9kYXRhLHBfdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgsbF9uYl9lbGVtKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxfb2Zmc2V0X2FycmF5ID0gbF9tY2NfcmVjb3JkLT5tX29mZnNldF9hcnJheTsKLQotICAgICAgICBpZiAobF9vZmZzZXRfYXJyYXkpIHsKLSAgICAgICAgICAgICAgICBsX2RhdGFfc2l6ZSA9IE1DVF9FTEVNRU5UX1NJWkVbbF9vZmZzZXRfYXJyYXktPm1fZWxlbWVudF90eXBlXSAqIHBfaW1hZ2UtPm51bWNvbXBzOwotICAgICAgICAgICAgICAgIGlmIChsX29mZnNldF9hcnJheS0+bV9kYXRhX3NpemUgIT0gbF9kYXRhX3NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbF9uYl9lbGVtID0gcF9pbWFnZS0+bnVtY29tcHM7Ci0gICAgICAgICAgICAgICAgbF9vZmZzZXRfc2l6ZSA9IGxfbmJfZWxlbSAqIChPUEpfVUlOVDMyKXNpemVvZihPUEpfVUlOVDMyKTsKLSAgICAgICAgICAgICAgICBsX29mZnNldF9kYXRhID0gKE9QSl9VSU5UMzIqKW9wal9tYWxsb2MobF9vZmZzZXRfc2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoISBsX29mZnNldF9kYXRhICkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBqMmtfbWN0X3JlYWRfZnVuY3Rpb25zX3RvX2ludDMyW2xfb2Zmc2V0X2FycmF5LT5tX2VsZW1lbnRfdHlwZV0obF9vZmZzZXRfYXJyYXktPm1fZGF0YSxsX29mZnNldF9kYXRhLGxfbmJfZWxlbSk7Ci0KLSAgICAgICAgICAgICAgICBsX3RjY3AgPSBwX3RjcC0+dGNjcHM7Ci0gICAgICAgICAgICAgICAgbF9jdXJyZW50X29mZnNldF9kYXRhID0gbF9vZmZzZXRfZGF0YTsKLQotICAgICAgICAgICAgICAgIGZvciAoaT0wO2k8cF9pbWFnZS0+bnVtY29tcHM7KytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX3RjY3AtPm1fZGNfbGV2ZWxfc2hpZnQgPSAoT1BKX0lOVDMyKSoobF9jdXJyZW50X29mZnNldF9kYXRhKyspOwotICAgICAgICAgICAgICAgICAgICAgICAgKytsX3RjY3A7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9vZmZzZXRfZGF0YSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9CT09MIG9wal9qMmtfd3JpdGVfY2JkKCBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlciApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2NiZF9zaXplOwotICAgICAgICBPUEpfQllURSAqIGxfY3VycmVudF9kYXRhID0gMDA7Ci0gICAgICAgIG9wal9pbWFnZV90ICpsX2ltYWdlID0gMDA7Ci0gICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2NvbXAgPSAwMDsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotCi0gICAgICAgIGxfaW1hZ2UgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlOwotICAgICAgICBsX2NiZF9zaXplID0gNiArIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOwotCi0gICAgICAgIGlmIChsX2NiZF9zaXplID4gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplKSB7Ci0gICAgICAgICAgICAgICAgT1BKX0JZVEUgKm5ld19oZWFkZXJfdGlsZV9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsIGxfY2JkX3NpemUpOwotICAgICAgICAgICAgICAgIGlmICghIG5ld19oZWFkZXJfdGlsZV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byB3cml0ZSBDQkQgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBuZXdfaGVhZGVyX3RpbGVfZGF0YTsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSBsX2NiZF9zaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgbF9jdXJyZW50X2RhdGEgPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxKMktfTVNfQ0JELDIpOyAgICAgICAgICAgICAgICAgICAvKiBDQkQgKi8KLSAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF9jYmRfc2l6ZS0yLDIpOyAgICAgICAgICAgICAgICAgLyogTF9DQkQgKi8KLSAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF9pbWFnZS0+bnVtY29tcHMsIDIpOyAgICAgICAgICAgLyogTmNiZCAqLwotICAgICAgICBsX2N1cnJlbnRfZGF0YSs9MjsKLQotICAgICAgICBsX2NvbXAgPSBsX2ltYWdlLT5jb21wczsKLQotICAgICAgICBmb3IgKGk9MDtpPGxfaW1hZ2UtPm51bWNvbXBzOysraSkgewotICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgKGxfY29tcC0+c2duZCA8PCA3KSB8IChsX2NvbXAtPnByZWMgLSAxKSwgMSk7ICAgICAgICAgICAvKiBDb21wb25lbnQgYml0IGRlcHRoICovCi0gICAgICAgICAgICAgICAgKytsX2N1cnJlbnRfZGF0YTsKLQotICAgICAgICAgICAgICAgICsrbF9jb21wOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLGxfY2JkX3NpemUscF9tYW5hZ2VyKSAhPSBsX2NiZF9zaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotLyoqCi0gKiBSZWFkcyBhIENCRCBtYXJrZXIgKENvbXBvbmVudCBiaXQgZGVwdGggZGVmaW5pdGlvbikKLSAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9kYXRhICAgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBDQkQgYm94LgotICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KLSAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBDQkQgbWFya2VyLgotICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9jYmQgKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX2NvbXAsbF9udW1fY29tcDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2NvbXBfZGVmOwotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2NvbXAgPSAwMDsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0KLSAgICAgICAgbF9udW1fY29tcCA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOwotCi0gICAgICAgIGlmIChwX2hlYWRlcl9zaXplICE9IChwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wcyArIDIpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkNycm9yIHJlYWRpbmcgQ0JEIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfbmJfY29tcCwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5jYmQgKi8KLSAgICAgICAgcF9oZWFkZXJfZGF0YSs9MjsKLQotICAgICAgICBpZiAobF9uYl9jb21wICE9IGxfbnVtX2NvbXApIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ3Jyb3IgcmVhZGluZyBDQkQgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgbF9jb21wID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+Y29tcHM7Ci0gICAgICAgIGZvciAoaT0wO2k8bF9udW1fY29tcDsrK2kpIHsKLSAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX2NvbXBfZGVmLDEpOyAgICAgICAgICAgICAgICAgICAgLyogQ29tcG9uZW50IGJpdCBkZXB0aCAqLwotICAgICAgICAgICAgICAgICsrcF9oZWFkZXJfZGF0YTsKLSAgICAgICAgbF9jb21wLT5zZ25kID0gKGxfY29tcF9kZWY+PjcpICYgMTsKLSAgICAgICAgICAgICAgICBsX2NvbXAtPnByZWMgPSAobF9jb21wX2RlZiYweDdmKSArIDE7Ci0gICAgICAgICAgICAgICAgKytsX2NvbXA7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBKMksgLyBKUFQgZGVjb2RlciBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotdm9pZCBvcGpfajJrX3NldHVwX2RlY29kZXIob3BqX2oya190ICpqMmssIG9wal9kcGFyYW1ldGVyc190ICpwYXJhbWV0ZXJzKQotewotICAgICAgICBpZihqMmsgJiYgcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgIGoyay0+bV9jcC5tX3NwZWNpZmljX3BhcmFtLm1fZGVjLm1fbGF5ZXIgPSBwYXJhbWV0ZXJzLT5jcF9sYXllcjsKLSAgICAgICAgICAgICAgICBqMmstPm1fY3AubV9zcGVjaWZpY19wYXJhbS5tX2RlYy5tX3JlZHVjZSA9IHBhcmFtZXRlcnMtPmNwX3JlZHVjZTsKLQotI2lmZGVmIFVTRV9KUFdMCi0gICAgICAgICAgICAgICAgajJrLT5tX2NwLmNvcnJlY3QgPSBwYXJhbWV0ZXJzLT5qcHdsX2NvcnJlY3Q7Ci0gICAgICAgICAgICAgICAgajJrLT5tX2NwLmV4cF9jb21wcyA9IHBhcmFtZXRlcnMtPmpwd2xfZXhwX2NvbXBzOwotICAgICAgICAgICAgICAgIGoyay0+bV9jcC5tYXhfdGlsZXMgPSBwYXJhbWV0ZXJzLT5qcHdsX21heF90aWxlczsKLSNlbmRpZiAvKiBVU0VfSlBXTCAqLwotICAgICAgICB9Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBKMksgZW5jb2RlciBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLW9wal9qMmtfdCogb3BqX2oya19jcmVhdGVfY29tcHJlc3Modm9pZCkKLXsKLSAgICAgICAgb3BqX2oya190ICpsX2oyayA9IChvcGpfajJrX3QqKSBvcGpfY2FsbG9jKDEsc2l6ZW9mKG9wal9qMmtfdCkpOwotICAgICAgICBpZiAoIWxfajJrKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGxfajJrLT5tX2lzX2RlY29kZXIgPSAwOwotICAgICAgICBsX2oyay0+bV9jcC5tX2lzX2RlY29kZXIgPSAwOwotCi0gICAgICAgIGxfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX21hbGxvYyhPUEpfSjJLX0RFRkFVTFRfSEVBREVSX1NJWkUpOwotICAgICAgICBpZiAoISBsX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2oya19kZXN0cm95KGxfajJrKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGxfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IE9QSl9KMktfREVGQVVMVF9IRUFERVJfU0laRTsKLQotICAgICAgICAvKiB2YWxpZGF0aW9uIGxpc3QgY3JlYXRpb24qLwotICAgICAgICBsX2oyay0+bV92YWxpZGF0aW9uX2xpc3QgPSBvcGpfcHJvY2VkdXJlX2xpc3RfY3JlYXRlKCk7Ci0gICAgICAgIGlmICghIGxfajJrLT5tX3ZhbGlkYXRpb25fbGlzdCkgewotICAgICAgICAgICAgICAgIG9wal9qMmtfZGVzdHJveShsX2oyayk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBleGVjdXRpb24gbGlzdCBjcmVhdGlvbiovCi0gICAgICAgIGxfajJrLT5tX3Byb2NlZHVyZV9saXN0ID0gb3BqX3Byb2NlZHVyZV9saXN0X2NyZWF0ZSgpOwotICAgICAgICBpZiAoISBsX2oyay0+bV9wcm9jZWR1cmVfbGlzdCkgewotICAgICAgICAgICAgICAgIG9wal9qMmtfZGVzdHJveShsX2oyayk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbF9qMms7Ci19Ci0KLWludCBvcGpfajJrX2luaXRpYWxpc2VfNEtfcG9jKG9wal9wb2NfdCAqUE9DLCBpbnQgbnVtcmVzKXsKLSAgICBQT0NbMF0udGlsZSAgPSAxOwotICAgIFBPQ1swXS5yZXNubzAgID0gMDsKLSAgICBQT0NbMF0uY29tcG5vMCA9IDA7Ci0gICAgUE9DWzBdLmxheW5vMSAgPSAxOwotICAgIFBPQ1swXS5yZXNubzEgID0gKE9QSl9VSU5UMzIpKG51bXJlcy0xKTsKLSAgICBQT0NbMF0uY29tcG5vMSA9IDM7Ci0gICAgUE9DWzBdLnByZzEgPSBPUEpfQ1BSTDsKLSAgICBQT0NbMV0udGlsZSAgPSAxOwotICAgIFBPQ1sxXS5yZXNubzAgID0gKE9QSl9VSU5UMzIpKG51bXJlcy0xKTsKLSAgICBQT0NbMV0uY29tcG5vMCA9IDA7Ci0gICAgUE9DWzFdLmxheW5vMSAgPSAxOwotICAgIFBPQ1sxXS5yZXNubzEgID0gKE9QSl9VSU5UMzIpbnVtcmVzOwotICAgIFBPQ1sxXS5jb21wbm8xID0gMzsKLSAgICBQT0NbMV0ucHJnMSA9IE9QSl9DUFJMOwotICAgIHJldHVybiAyOwotfQotCi12b2lkIG9wal9qMmtfc2V0X2NpbmVtYV9wYXJhbWV0ZXJzKG9wal9jcGFyYW1ldGVyc190ICpwYXJhbWV0ZXJzLCBvcGpfaW1hZ2VfdCAqaW1hZ2UsIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyKQotewotICAgIC8qIENvbmZpZ3VyZSBjaW5lbWEgcGFyYW1ldGVycyAqLwotICAgIGludCBpOwotCi0gICAgLyogTm8gdGlsaW5nICovCi0gICAgcGFyYW1ldGVycy0+dGlsZV9zaXplX29uID0gT1BKX0ZBTFNFOwotICAgIHBhcmFtZXRlcnMtPmNwX3RkeD0xOwotICAgIHBhcmFtZXRlcnMtPmNwX3RkeT0xOwotCi0gICAgLyogT25lIHRpbGUgcGFydCBmb3IgZWFjaCBjb21wb25lbnQgKi8KLSAgICBwYXJhbWV0ZXJzLT50cF9mbGFnID0gJ0MnOwotICAgIHBhcmFtZXRlcnMtPnRwX29uID0gMTsKLQotICAgIC8qIFRpbGUgYW5kIEltYWdlIHNoYWxsIGJlIGF0ICgwLDApICovCi0gICAgcGFyYW1ldGVycy0+Y3BfdHgwID0gMDsKLSAgICBwYXJhbWV0ZXJzLT5jcF90eTAgPSAwOwotICAgIHBhcmFtZXRlcnMtPmltYWdlX29mZnNldF94MCA9IDA7Ci0gICAgcGFyYW1ldGVycy0+aW1hZ2Vfb2Zmc2V0X3kwID0gMDsKLQotICAgIC8qIENvZGVibG9jayBzaXplPSAzMiozMiAqLwotICAgIHBhcmFtZXRlcnMtPmNibG9ja3dfaW5pdCA9IDMyOwotICAgIHBhcmFtZXRlcnMtPmNibG9ja2hfaW5pdCA9IDMyOwotCi0gICAgLyogQ29kZWJsb2NrIHN0eWxlOiBubyBtb2RlIHN3aXRjaCBlbmFibGVkICovCi0gICAgcGFyYW1ldGVycy0+bW9kZSA9IDA7Ci0KLSAgICAvKiBObyBST0kgKi8KLSAgICBwYXJhbWV0ZXJzLT5yb2lfY29tcG5vID0gLTE7Ci0KLSAgICAvKiBObyBzdWJzYW1wbGluZyAqLwotICAgIHBhcmFtZXRlcnMtPnN1YnNhbXBsaW5nX2R4ID0gMTsKLSAgICBwYXJhbWV0ZXJzLT5zdWJzYW1wbGluZ19keSA9IDE7Ci0KLSAgICAvKiA5LTcgdHJhbnNmb3JtICovCi0gICAgcGFyYW1ldGVycy0+aXJyZXZlcnNpYmxlID0gMTsKLQotICAgIC8qIE51bWJlciBvZiBsYXllcnMgKi8KLSAgICBpZiAocGFyYW1ldGVycy0+dGNwX251bWxheWVycyA+IDEpewotICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgIkpQRUcgMjAwMCBQcm9maWxlLTMgYW5kIDQgKDJrLzRrIGRjIHByb2ZpbGUpIHJlcXVpcmVzOlxuIgotICAgICAgICAgICAgICAgICIxIHNpbmdsZSBxdWFsaXR5IGxheWVyIgotICAgICAgICAgICAgICAgICItPiBOdW1iZXIgb2YgbGF5ZXJzIGZvcmNlZCB0byAxIChyYXRoZXIgdGhhbiAlZClcbiIKLSAgICAgICAgICAgICAgICAiLT4gUmF0ZSBvZiB0aGUgbGFzdCBsYXllciAoJTMuMWYpIHdpbGwgYmUgdXNlZCIsCi0gICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+dGNwX251bWxheWVycywgcGFyYW1ldGVycy0+dGNwX3JhdGVzW3BhcmFtZXRlcnMtPnRjcF9udW1sYXllcnMtMV0pOwotICAgICAgICBwYXJhbWV0ZXJzLT50Y3BfcmF0ZXNbMF0gPSBwYXJhbWV0ZXJzLT50Y3BfcmF0ZXNbcGFyYW1ldGVycy0+dGNwX251bWxheWVycy0xXTsKLSAgICAgICAgcGFyYW1ldGVycy0+dGNwX251bWxheWVycyA9IDE7Ci0gICAgfQotCi0gICAgLyogUmVzb2x1dGlvbiBsZXZlbHMgKi8KLSAgICBzd2l0Y2ggKHBhcmFtZXRlcnMtPnJzaXopewotICAgIGNhc2UgT1BKX1BST0ZJTEVfQ0lORU1BXzJLOgotICAgICAgICBpZihwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uID4gNil7Ci0gICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICJKUEVHIDIwMDAgUHJvZmlsZS0zICgyayBkYyBwcm9maWxlKSByZXF1aXJlczpcbiIKLSAgICAgICAgICAgICAgICAgICAgIk51bWJlciBvZiBkZWNvbXBvc2l0aW9uIGxldmVscyA8PSA1XG4iCi0gICAgICAgICAgICAgICAgICAgICItPiBOdW1iZXIgb2YgZGVjb21wb3NpdGlvbiBsZXZlbHMgZm9yY2VkIHRvIDUgKHJhdGhlciB0aGFuICVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+bnVtcmVzb2x1dGlvbisxKTsKLSAgICAgICAgICAgIHBhcmFtZXRlcnMtPm51bXJlc29sdXRpb24gPSA2OwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BKX1BST0ZJTEVfQ0lORU1BXzRLOgotICAgICAgICBpZihwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uIDwgMil7Ci0gICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICJKUEVHIDIwMDAgUHJvZmlsZS00ICg0ayBkYyBwcm9maWxlKSByZXF1aXJlczpcbiIKLSAgICAgICAgICAgICAgICAgICAgIk51bWJlciBvZiBkZWNvbXBvc2l0aW9uIGxldmVscyA+PSAxICYmIDw9IDZcbiIKLSAgICAgICAgICAgICAgICAgICAgIi0+IE51bWJlciBvZiBkZWNvbXBvc2l0aW9uIGxldmVscyBmb3JjZWQgdG8gMSAocmF0aGVyIHRoYW4gJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uKzEpOwotICAgICAgICAgICAgcGFyYW1ldGVycy0+bnVtcmVzb2x1dGlvbiA9IDE7Ci0gICAgICAgIH1lbHNlIGlmKHBhcmFtZXRlcnMtPm51bXJlc29sdXRpb24gPiA3KXsKLSAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgIkpQRUcgMjAwMCBQcm9maWxlLTQgKDRrIGRjIHByb2ZpbGUpIHJlcXVpcmVzOlxuIgotICAgICAgICAgICAgICAgICAgICAiTnVtYmVyIG9mIGRlY29tcG9zaXRpb24gbGV2ZWxzID49IDEgJiYgPD0gNlxuIgotICAgICAgICAgICAgICAgICAgICAiLT4gTnVtYmVyIG9mIGRlY29tcG9zaXRpb24gbGV2ZWxzIGZvcmNlZCB0byA2IChyYXRoZXIgdGhhbiAlZClcbiIsCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMtPm51bXJlc29sdXRpb24rMSk7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uID0gNzsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogUHJlY2luY3RzICovCi0gICAgcGFyYW1ldGVycy0+Y3N0eSB8PSAweDAxOwotICAgIHBhcmFtZXRlcnMtPnJlc19zcGVjID0gcGFyYW1ldGVycy0+bnVtcmVzb2x1dGlvbi0xOwotICAgIGZvciAoaSA9IDA7IGk8cGFyYW1ldGVycy0+cmVzX3NwZWM7IGkrKykgewotICAgICAgICBwYXJhbWV0ZXJzLT5wcmN3X2luaXRbaV0gPSAyNTY7Ci0gICAgICAgIHBhcmFtZXRlcnMtPnByY2hfaW5pdFtpXSA9IDI1NjsKLSAgICB9Ci0KLSAgICAvKiBUaGUgcHJvZ3Jlc3Npb24gb3JkZXIgc2hhbGwgYmUgQ1BSTCAqLwotICAgIHBhcmFtZXRlcnMtPnByb2dfb3JkZXIgPSBPUEpfQ1BSTDsKLQotICAgIC8qIFByb2dyZXNzaW9uIG9yZGVyIGNoYW5nZXMgZm9yIDRLLCBkaXNhbGxvd2VkIGZvciAySyAqLwotICAgIGlmIChwYXJhbWV0ZXJzLT5yc2l6ID09IE9QSl9QUk9GSUxFX0NJTkVNQV80SykgewotICAgICAgICBwYXJhbWV0ZXJzLT5udW1wb2NzID0gKE9QSl9VSU5UMzIpb3BqX2oya19pbml0aWFsaXNlXzRLX3BvYyhwYXJhbWV0ZXJzLT5QT0MscGFyYW1ldGVycy0+bnVtcmVzb2x1dGlvbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcGFyYW1ldGVycy0+bnVtcG9jcyA9IDA7Ci0gICAgfQotCi0gICAgLyogTGltaXRlZCBiaXQtcmF0ZSAqLwotICAgIHBhcmFtZXRlcnMtPmNwX2Rpc3RvX2FsbG9jID0gMTsKLSAgICBpZiAocGFyYW1ldGVycy0+bWF4X2NzX3NpemUgPD0gMCkgewotICAgICAgICAvKiBObyByYXRlIGhhcyBiZWVuIGludHJvZHVjZWQsIDI0IGZwcyBpcyBhc3N1bWVkICovCi0gICAgICAgIHBhcmFtZXRlcnMtPm1heF9jc19zaXplID0gT1BKX0NJTkVNQV8yNF9DUzsKLSAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICJKUEVHIDIwMDAgUHJvZmlsZS0zIGFuZCA0ICgyay80ayBkYyBwcm9maWxlKSByZXF1aXJlczpcbiIKLSAgICAgICAgICAgICAgICAgICAgICAiTWF4aW11bSAxMzAyMDgzIGNvbXByZXNzZWQgYnl0ZXMgQCAyNGZwc1xuIgotICAgICAgICAgICAgICAgICAgICAgICJBcyBubyByYXRlIGhhcyBiZWVuIGdpdmVuLCB0aGlzIGxpbWl0IHdpbGwgYmUgdXNlZC5cbiIpOwotICAgIH0gZWxzZSBpZiAocGFyYW1ldGVycy0+bWF4X2NzX3NpemUgPiBPUEpfQ0lORU1BXzI0X0NTKSB7Ci0gICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAiSlBFRyAyMDAwIFByb2ZpbGUtMyBhbmQgNCAoMmsvNGsgZGMgcHJvZmlsZSkgcmVxdWlyZXM6XG4iCi0gICAgICAgICAgICAgICAgICAgICAgIk1heGltdW0gMTMwMjA4MyBjb21wcmVzc2VkIGJ5dGVzIEAgMjRmcHNcbiIKLSAgICAgICAgICAgICAgICAgICAgICAiLT4gU3BlY2lmaWVkIHJhdGUgZXhjZWVkcyB0aGlzIGxpbWl0LiBSYXRlIHdpbGwgYmUgZm9yY2VkIHRvIDEzMDIwODMgYnl0ZXMuXG4iKTsKLSAgICAgICAgcGFyYW1ldGVycy0+bWF4X2NzX3NpemUgPSBPUEpfQ0lORU1BXzI0X0NTOwotICAgIH0KLQotICAgIGlmIChwYXJhbWV0ZXJzLT5tYXhfY29tcF9zaXplIDw9IDApIHsKLSAgICAgICAgLyogTm8gcmF0ZSBoYXMgYmVlbiBpbnRyb2R1Y2VkLCAyNCBmcHMgaXMgYXNzdW1lZCAqLwotICAgICAgICBwYXJhbWV0ZXJzLT5tYXhfY29tcF9zaXplID0gT1BKX0NJTkVNQV8yNF9DT01QOwotICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgIkpQRUcgMjAwMCBQcm9maWxlLTMgYW5kIDQgKDJrLzRrIGRjIHByb2ZpbGUpIHJlcXVpcmVzOlxuIgotICAgICAgICAgICAgICAgICAgICAgICJNYXhpbXVtIDEwNDE2NjYgY29tcHJlc3NlZCBieXRlcyBAIDI0ZnBzXG4iCi0gICAgICAgICAgICAgICAgICAgICAgIkFzIG5vIHJhdGUgaGFzIGJlZW4gZ2l2ZW4sIHRoaXMgbGltaXQgd2lsbCBiZSB1c2VkLlxuIik7Ci0gICAgfSBlbHNlIGlmIChwYXJhbWV0ZXJzLT5tYXhfY29tcF9zaXplID4gT1BKX0NJTkVNQV8yNF9DT01QKSB7Ci0gICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAiSlBFRyAyMDAwIFByb2ZpbGUtMyBhbmQgNCAoMmsvNGsgZGMgcHJvZmlsZSkgcmVxdWlyZXM6XG4iCi0gICAgICAgICAgICAgICAgICAgICAgIk1heGltdW0gMTA0MTY2NiBjb21wcmVzc2VkIGJ5dGVzIEAgMjRmcHNcbiIKLSAgICAgICAgICAgICAgICAgICAgICAiLT4gU3BlY2lmaWVkIHJhdGUgZXhjZWVkcyB0aGlzIGxpbWl0LiBSYXRlIHdpbGwgYmUgZm9yY2VkIHRvIDEwNDE2NjYgYnl0ZXMuXG4iKTsKLSAgICAgICAgcGFyYW1ldGVycy0+bWF4X2NvbXBfc2l6ZSA9IE9QSl9DSU5FTUFfMjRfQ09NUDsKLSAgICB9Ci0KLSAgICBwYXJhbWV0ZXJzLT50Y3BfcmF0ZXNbMF0gPSAoT1BKX0ZMT0FUMzIpIChpbWFnZS0+bnVtY29tcHMgKiBpbWFnZS0+Y29tcHNbMF0udyAqIGltYWdlLT5jb21wc1swXS5oICogaW1hZ2UtPmNvbXBzWzBdLnByZWMpLwotICAgICAgICAgICAgKE9QSl9GTE9BVDMyKSgoKE9QSl9VSU5UMzIpcGFyYW1ldGVycy0+bWF4X2NzX3NpemUpICogOCAqIGltYWdlLT5jb21wc1swXS5keCAqIGltYWdlLT5jb21wc1swXS5keSk7Ci0KLX0KLQotT1BKX0JPT0wgb3BqX2oya19pc19jaW5lbWFfY29tcGxpYW50KG9wal9pbWFnZV90ICppbWFnZSwgT1BKX1VJTlQxNiByc2l6LCBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcikKLXsKLSAgICBPUEpfVUlOVDMyIGk7Ci0KLSAgICAvKiBOdW1iZXIgb2YgY29tcG9uZW50cyAqLwotICAgIGlmIChpbWFnZS0+bnVtY29tcHMgIT0gMyl7Ci0gICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKLSAgICAgICAgICAgICAgICAiSlBFRyAyMDAwIFByb2ZpbGUtMyAoMmsgZGMgcHJvZmlsZSkgcmVxdWlyZXM6XG4iCi0gICAgICAgICAgICAgICAgIjMgY29tcG9uZW50cyIKLSAgICAgICAgICAgICAgICAiLT4gTnVtYmVyIG9mIGNvbXBvbmVudHMgb2YgaW5wdXQgaW1hZ2UgKCVkKSBpcyBub3QgY29tcGxpYW50XG4iCi0gICAgICAgICAgICAgICAgIi0+IE5vbi1wcm9maWxlLTMgY29kZXN0cmVhbSB3aWxsIGJlIGdlbmVyYXRlZFxuIiwKLSAgICAgICAgICAgICAgICBpbWFnZS0+bnVtY29tcHMpOwotICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgIH0KLQotICAgIC8qIEJpdGRlcHRoICovCi0gICAgZm9yIChpID0gMDsgaSA8IGltYWdlLT5udW1jb21wczsgaSsrKSB7Ci0gICAgICAgIGlmICgoaW1hZ2UtPmNvbXBzW2ldLmJwcCAhPSAxMikgfCAoaW1hZ2UtPmNvbXBzW2ldLnNnbmQpKXsKLSAgICAgICAgICAgIGNoYXIgc2lnbmVkX3N0cltdID0gInNpZ25lZCI7Ci0gICAgICAgICAgICBjaGFyIHVuc2lnbmVkX3N0cltdID0gInVuc2lnbmVkIjsKLSAgICAgICAgICAgIGNoYXIgKnRtcF9zdHIgPSBpbWFnZS0+Y29tcHNbaV0uc2duZD9zaWduZWRfc3RyOnVuc2lnbmVkX3N0cjsKLSAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgIkpQRUcgMjAwMCBQcm9maWxlLTMgKDJrIGRjIHByb2ZpbGUpIHJlcXVpcmVzOlxuIgotICAgICAgICAgICAgICAgICAgICAiUHJlY2lzaW9uIG9mIGVhY2ggY29tcG9uZW50IHNoYWxsIGJlIDEyIGJpdHMgdW5zaWduZWQiCi0gICAgICAgICAgICAgICAgICAgICItPiBBdCBsZWFzdCBjb21wb25lbnQgJWQgb2YgaW5wdXQgaW1hZ2UgKCVkIGJpdHMsICVzKSBpcyBub3QgY29tcGxpYW50XG4iCi0gICAgICAgICAgICAgICAgICAgICItPiBOb24tcHJvZmlsZS0zIGNvZGVzdHJlYW0gd2lsbCBiZSBnZW5lcmF0ZWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIGksaW1hZ2UtPmNvbXBzW2ldLmJwcCwgdG1wX3N0cik7Ci0gICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogSW1hZ2Ugc2l6ZSAqLwotICAgIHN3aXRjaCAocnNpeil7Ci0gICAgY2FzZSBPUEpfUFJPRklMRV9DSU5FTUFfMks6Ci0gICAgICAgIGlmICgoKGltYWdlLT5jb21wc1swXS53ID4gMjA0OCkgfCAoaW1hZ2UtPmNvbXBzWzBdLmggPiAxMDgwKSkpewotICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAiSlBFRyAyMDAwIFByb2ZpbGUtMyAoMmsgZGMgcHJvZmlsZSkgcmVxdWlyZXM6XG4iCi0gICAgICAgICAgICAgICAgICAgICJ3aWR0aCA8PSAyMDQ4IGFuZCBoZWlnaHQgPD0gMTA4MFxuIgotICAgICAgICAgICAgICAgICAgICAiLT4gSW5wdXQgaW1hZ2Ugc2l6ZSAlZCB4ICVkIGlzIG5vdCBjb21wbGlhbnRcbiIKLSAgICAgICAgICAgICAgICAgICAgIi0+IE5vbi1wcm9maWxlLTMgY29kZXN0cmVhbSB3aWxsIGJlIGdlbmVyYXRlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPmNvbXBzWzBdLncsaW1hZ2UtPmNvbXBzWzBdLmgpOwotICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIE9QSl9QUk9GSUxFX0NJTkVNQV80SzoKLSAgICAgICAgaWYgKCgoaW1hZ2UtPmNvbXBzWzBdLncgPiA0MDk2KSB8IChpbWFnZS0+Y29tcHNbMF0uaCA+IDIxNjApKSl7Ci0gICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICJKUEVHIDIwMDAgUHJvZmlsZS00ICg0ayBkYyBwcm9maWxlKSByZXF1aXJlczpcbiIKLSAgICAgICAgICAgICAgICAgICAgIndpZHRoIDw9IDQwOTYgYW5kIGhlaWdodCA8PSAyMTYwXG4iCi0gICAgICAgICAgICAgICAgICAgICItPiBJbWFnZSBzaXplICVkIHggJWQgaXMgbm90IGNvbXBsaWFudFxuIgotICAgICAgICAgICAgICAgICAgICAiLT4gTm9uLXByb2ZpbGUtNCBjb2Rlc3RyZWFtIHdpbGwgYmUgZ2VuZXJhdGVkXG4iLAotICAgICAgICAgICAgICAgICAgICBpbWFnZS0+Y29tcHNbMF0udyxpbWFnZS0+Y29tcHNbMF0uaCk7Ci0gICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9CT09MIG9wal9qMmtfc2V0dXBfZW5jb2RlciggICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKmltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKLXsKLSAgICAgICAgT1BKX1VJTlQzMiBpLCBqLCB0aWxlbm8sIG51bXBvY3NfdGlsZTsKLSAgICAgICAgb3BqX2NwX3QgKmNwID0gMDA7Ci0KLSAgICAgICAgaWYoIXBfajJrIHx8ICFwYXJhbWV0ZXJzIHx8ICEgaW1hZ2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uIDw9IDApIHx8IChwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uID4gT1BKX0oyS19NQVhSTFZMUykpIHsKLSAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJJbnZhbGlkIG51bWJlciBvZiByZXNvbHV0aW9ucyA6ICVkIG5vdCBpbiByYW5nZSBbMSwlZF1cbiIsIHBhcmFtZXRlcnMtPm51bXJlc29sdXRpb24sIE9QSl9KMktfTUFYUkxWTFMpOwotICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGtlZXAgYSBsaW5rIHRvIGNwIHNvIHRoYXQgd2UgY2FuIGRlc3Ryb3kgaXQgbGF0ZXIgaW4gajJrX2Rlc3Ryb3lfY29tcHJlc3MgKi8KLSAgICAgICAgY3AgPSAmKHBfajJrLT5tX2NwKTsKLQotICAgICAgICAvKiBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIGNwICovCi0gICAgICAgIGNwLT50dyA9IDE7Ci0gICAgICAgIGNwLT50aCA9IDE7Ci0KLSAgICAgICAgLyogRklYTUUgQURFOiB0byBiZSByZW1vdmVkIG9uY2UgZGVwcmVjYXRlZCBjcF9jaW5lbWEgYW5kIGNwX3JzaXogaGF2ZSBiZWVuIHJlbW92ZWQgKi8KLSAgICAgICAgaWYgKHBhcmFtZXRlcnMtPnJzaXogPT0gT1BKX1BST0ZJTEVfTk9ORSkgeyAvKiBjb25zaWRlciBkZXByZWNhdGVkIGZpZWxkcyBvbmx5IGlmIFJTSVogaGFzIG5vdCBiZWVuIHNldCAqLwotICAgICAgICAgICAgT1BKX0JPT0wgZGVwcmVjYXRlZF91c2VkID0gT1BKX0ZBTFNFOwotICAgICAgICAgICAgc3dpdGNoIChwYXJhbWV0ZXJzLT5jcF9jaW5lbWEpewotICAgICAgICAgICAgY2FzZSBPUEpfQ0lORU1BMktfMjQ6Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+cnNpeiA9IE9QSl9QUk9GSUxFX0NJTkVNQV8ySzsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5tYXhfY3Nfc2l6ZSA9IE9QSl9DSU5FTUFfMjRfQ1M7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+bWF4X2NvbXBfc2l6ZSA9IE9QSl9DSU5FTUFfMjRfQ09NUDsKLSAgICAgICAgICAgICAgICBkZXByZWNhdGVkX3VzZWQgPSBPUEpfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT1BKX0NJTkVNQTJLXzQ4OgotICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMtPnJzaXogPSBPUEpfUFJPRklMRV9DSU5FTUFfMks7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+bWF4X2NzX3NpemUgPSBPUEpfQ0lORU1BXzQ4X0NTOwotICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMtPm1heF9jb21wX3NpemUgPSBPUEpfQ0lORU1BXzQ4X0NPTVA7Ci0gICAgICAgICAgICAgICAgZGVwcmVjYXRlZF91c2VkID0gT1BKX1RSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE9QSl9DSU5FTUE0S18yNDoKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5yc2l6ID0gT1BKX1BST0ZJTEVfQ0lORU1BXzRLOwotICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMtPm1heF9jc19zaXplID0gT1BKX0NJTkVNQV8yNF9DUzsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5tYXhfY29tcF9zaXplID0gT1BKX0NJTkVNQV8yNF9DT01QOwotICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWRfdXNlZCA9IE9QSl9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPUEpfT0ZGOgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAocGFyYW1ldGVycy0+Y3BfcnNpeil7Ci0gICAgICAgICAgICBjYXNlIE9QSl9DSU5FTUEySzoKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5yc2l6ID0gT1BKX1BST0ZJTEVfQ0lORU1BXzJLOwotICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWRfdXNlZCA9IE9QSl9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPUEpfQ0lORU1BNEs6Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+cnNpeiA9IE9QSl9QUk9GSUxFX0NJTkVNQV80SzsKLSAgICAgICAgICAgICAgICBkZXByZWNhdGVkX3VzZWQgPSBPUEpfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT1BKX01DVDoKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5yc2l6ID0gT1BKX1BST0ZJTEVfUEFSVDIgfCBPUEpfRVhURU5TSU9OX01DVDsKLSAgICAgICAgICAgICAgICBkZXByZWNhdGVkX3VzZWQgPSBPUEpfVFJVRTsKLSAgICAgICAgICAgIGNhc2UgT1BKX1NURF9SU0laOgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkZXByZWNhdGVkX3VzZWQpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiRGVwcmVjYXRlZCBmaWVsZHMgY3BfY2luZW1hIG9yIGNwX3JzaXogYXJlIHVzZWRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICJQbGVhc2UgY29uc2lkZXIgdXNpbmcgb25seSB0aGUgcnNpeiBmaWVsZFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgIlNlZSBvcGVuanBlZy5oIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlsc1xuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBzZWUgaWYgbWF4X2NvZGVzdHJlYW1fc2l6ZSBkb2VzIGxpbWl0IGlucHV0IHJhdGUgKi8KLSAgICAgICAgaWYgKHBhcmFtZXRlcnMtPm1heF9jc19zaXplIDw9IDApIHsKLSAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLT50Y3BfcmF0ZXNbcGFyYW1ldGVycy0+dGNwX251bWxheWVycy0xXSA+IDApIHsKLSAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiB0ZW1wX3NpemU7Ci0gICAgICAgICAgICAgICAgdGVtcF9zaXplID0oT1BKX0ZMT0FUMzIpKGltYWdlLT5udW1jb21wcyAqIGltYWdlLT5jb21wc1swXS53ICogaW1hZ2UtPmNvbXBzWzBdLmggKiBpbWFnZS0+Y29tcHNbMF0ucHJlYykvCi0gICAgICAgICAgICAgICAgICAgICAgICAocGFyYW1ldGVycy0+dGNwX3JhdGVzW3BhcmFtZXRlcnMtPnRjcF9udW1sYXllcnMtMV0gKiA4ICogKE9QSl9GTE9BVDMyKWltYWdlLT5jb21wc1swXS5keCAqIChPUEpfRkxPQVQzMilpbWFnZS0+Y29tcHNbMF0uZHkpOwotICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMtPm1heF9jc19zaXplID0gKGludCkgZmxvb3IodGVtcF9zaXplKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+bWF4X2NzX3NpemUgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgT1BKX0ZMT0FUMzIgdGVtcF9yYXRlOwotICAgICAgICAgICAgT1BKX0JPT0wgY2FwID0gT1BKX0ZBTFNFOwotICAgICAgICAgICAgdGVtcF9yYXRlID0gKE9QSl9GTE9BVDMyKSAoaW1hZ2UtPm51bWNvbXBzICogaW1hZ2UtPmNvbXBzWzBdLncgKiBpbWFnZS0+Y29tcHNbMF0uaCAqIGltYWdlLT5jb21wc1swXS5wcmVjKS8KLSAgICAgICAgICAgICAgICAgICAgKE9QSl9GTE9BVDMyKSgoKE9QSl9VSU5UMzIpcGFyYW1ldGVycy0+bWF4X2NzX3NpemUpICogOCAqIGltYWdlLT5jb21wc1swXS5keCAqIGltYWdlLT5jb21wc1swXS5keSk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKE9QSl9VSU5UMzIpIHBhcmFtZXRlcnMtPnRjcF9udW1sYXllcnM7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLT50Y3BfcmF0ZXNbaV0gPCB0ZW1wX3JhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+dGNwX3JhdGVzW2ldID0gdGVtcF9yYXRlOwotICAgICAgICAgICAgICAgICAgICBjYXAgPSBPUEpfVFJVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2FwKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBkZXNpcmVkIG1heGltdW0gY29kZXN0cmVhbSBzaXplIGhhcyBsaW1pdGVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAiYXQgbGVhc3Qgb25lIG9mIHRoZSBkZXNpcmVkIHF1YWxpdHkgbGF5ZXJzXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIE1hbmFnZSBwcm9maWxlcyBhbmQgYXBwbGljYXRpb25zIGFuZCBzZXQgUlNJWiAqLwotICAgICAgICAvKiBzZXQgY2luZW1hIHBhcmFtZXRlcnMgaWYgcmVxdWlyZWQgKi8KLSAgICAgICAgaWYgKE9QSl9JU19DSU5FTUEocGFyYW1ldGVycy0+cnNpeikpewotICAgICAgICAgICAgaWYgKChwYXJhbWV0ZXJzLT5yc2l6ID09IE9QSl9QUk9GSUxFX0NJTkVNQV9TMkspCi0gICAgICAgICAgICAgICAgICAgIHx8IChwYXJhbWV0ZXJzLT5yc2l6ID09IE9QSl9QUk9GSUxFX0NJTkVNQV9TNEspKXsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiSlBFRyAyMDAwIFNjYWxhYmxlIERpZ2l0YWwgQ2luZW1hIHByb2ZpbGVzIG5vdCB5ZXQgc3VwcG9ydGVkXG4iKTsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5yc2l6ID0gT1BKX1BST0ZJTEVfTk9ORTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb3BqX2oya19zZXRfY2luZW1hX3BhcmFtZXRlcnMocGFyYW1ldGVycyxpbWFnZSxwX21hbmFnZXIpOwotICAgICAgICAgICAgICAgIGlmICghb3BqX2oya19pc19jaW5lbWFfY29tcGxpYW50KGltYWdlLHBhcmFtZXRlcnMtPnJzaXoscF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5yc2l6ID0gT1BKX1BST0ZJTEVfTk9ORTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoT1BKX0lTX1NUT1JBR0UocGFyYW1ldGVycy0+cnNpeikpIHsKLSAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgIkpQRUcgMjAwMCBMb25nIFRlcm0gU3RvcmFnZSBwcm9maWxlIG5vdCB5ZXQgc3VwcG9ydGVkXG4iKTsKLSAgICAgICAgICAgIHBhcmFtZXRlcnMtPnJzaXogPSBPUEpfUFJPRklMRV9OT05FOwotICAgICAgICB9IGVsc2UgaWYgKE9QSl9JU19CUk9BRENBU1QocGFyYW1ldGVycy0+cnNpeikpIHsKLSAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgIkpQRUcgMjAwMCBCcm9hZGNhc3QgcHJvZmlsZXMgbm90IHlldCBzdXBwb3J0ZWRcbiIpOwotICAgICAgICAgICAgcGFyYW1ldGVycy0+cnNpeiA9IE9QSl9QUk9GSUxFX05PTkU7Ci0gICAgICAgIH0gZWxzZSBpZiAoT1BKX0lTX0lNRihwYXJhbWV0ZXJzLT5yc2l6KSkgewotICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAiSlBFRyAyMDAwIElNRiBwcm9maWxlcyBub3QgeWV0IHN1cHBvcnRlZFxuIik7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzLT5yc2l6ID0gT1BKX1BST0ZJTEVfTk9ORTsKLSAgICAgICAgfSBlbHNlIGlmIChPUEpfSVNfUEFSVDIocGFyYW1ldGVycy0+cnNpeikpIHsKLSAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLT5yc2l6ID09ICgoT1BKX1BST0ZJTEVfUEFSVDIpIHwgKE9QSl9FWFRFTlNJT05fTk9ORSkpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpQRUcgMjAwMCBQYXJ0LTIgcHJvZmlsZSBkZWZpbmVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IG5vIFBhcnQtMiBleHRlbnNpb24gZW5hYmxlZC5cbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9maWxlIHNldCB0byBOT05FLlxuIik7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+cnNpeiA9IE9QSl9QUk9GSUxFX05PTkU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlcnMtPnJzaXogIT0gKChPUEpfUFJPRklMRV9QQVJUMikgfCAoT1BKX0VYVEVOU0lPTl9NQ1QpKSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBQYXJ0LTIgZXh0ZW5zaW9uIGVuYWJsZWRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9maWxlIHNldCB0byBOT05FLlxuIik7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+cnNpeiA9IE9QSl9QUk9GSUxFX05PTkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICBjb3B5IHVzZXIgZW5jb2RpbmcgcGFyYW1ldGVycwotICAgICAgICAqLwotICAgICAgICBjcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX21heF9jb21wX3NpemUgPSAoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT5tYXhfY29tcF9zaXplOwotICAgICAgICBjcC0+cnNpeiA9IHBhcmFtZXRlcnMtPnJzaXo7Ci0gICAgICAgIGNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fZGlzdG9fYWxsb2MgPSAoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT5jcF9kaXN0b19hbGxvYyAmIDF1OwotICAgICAgICBjcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX2ZpeGVkX2FsbG9jID0gKE9QSl9VSU5UMzIpcGFyYW1ldGVycy0+Y3BfZml4ZWRfYWxsb2MgJiAxdTsKLSAgICAgICAgY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9maXhlZF9xdWFsaXR5ID0gKE9QSl9VSU5UMzIpcGFyYW1ldGVycy0+Y3BfZml4ZWRfcXVhbGl0eSAmIDF1OwotCi0gICAgICAgIC8qIG1vZCBmaXhlZF9xdWFsaXR5ICovCi0gICAgICAgIGlmIChwYXJhbWV0ZXJzLT5jcF9maXhlZF9hbGxvYyAmJiBwYXJhbWV0ZXJzLT5jcF9tYXRyaWNlKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGFycmF5X3NpemUgPSAoc2l6ZV90KXBhcmFtZXRlcnMtPnRjcF9udW1sYXllcnMgKiAoc2l6ZV90KXBhcmFtZXRlcnMtPm51bXJlc29sdXRpb24gKiAzICogc2l6ZW9mKE9QSl9JTlQzMik7Ci0gICAgICAgICAgICAgICAgY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9tYXRyaWNlID0gKE9QSl9JTlQzMiAqKSBvcGpfbWFsbG9jKGFycmF5X3NpemUpOwotCQkJCQkJCQlpZiAoIWNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fbWF0cmljZSkgewotCQkJCQkJCQkgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBjb3B5IG9mIHVzZXIgZW5jb2RpbmcgcGFyYW1ldGVycyBtYXRyaXggXG4iKTsKLQkJCQkJCQkJICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotCQkJCQkJCQl9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fbWF0cmljZSwgcGFyYW1ldGVycy0+Y3BfbWF0cmljZSwgYXJyYXlfc2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB0aWxlcyAqLwotICAgICAgICBjcC0+dGR4ID0gKE9QSl9VSU5UMzIpcGFyYW1ldGVycy0+Y3BfdGR4OwotICAgICAgICBjcC0+dGR5ID0gKE9QSl9VSU5UMzIpcGFyYW1ldGVycy0+Y3BfdGR5OwotCi0gICAgICAgIC8qIHRpbGUgb2Zmc2V0ICovCi0gICAgICAgIGNwLT50eDAgPSAoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT5jcF90eDA7Ci0gICAgICAgIGNwLT50eTAgPSAoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT5jcF90eTA7Ci0KLSAgICAgICAgLyogY29tbWVudCBzdHJpbmcgKi8KLSAgICAgICAgaWYocGFyYW1ldGVycy0+Y3BfY29tbWVudCkgewotICAgICAgICAgICAgICAgIGNwLT5jb21tZW50ID0gKGNoYXIqKW9wal9tYWxsb2Moc3RybGVuKHBhcmFtZXRlcnMtPmNwX2NvbW1lbnQpICsgMVUpOwotCQkJCQkJCQlpZighY3AtPmNvbW1lbnQpIHsKLQkJCQkJCQkJICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgY29weSBvZiBjb21tZW50IHN0cmluZ1xuIik7Ci0JCQkJCQkJCSAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLQkJCQkJCQkJfQotICAgICAgICAgICAgICAgIHN0cmNweShjcC0+Y29tbWVudCwgcGFyYW1ldGVycy0+Y3BfY29tbWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLyogQ3JlYXRlIGRlZmF1bHQgY29tbWVudCBmb3IgY29kZXN0cmVhbSAqLwotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgY29tbWVudFtdID0gIkNyZWF0ZWQgYnkgT3BlbkpQRUcgdmVyc2lvbiAiOwotICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBjbGVuID0gc3RybGVuKGNvbW1lbnQpOwotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24gPSBvcGpfdmVyc2lvbigpOwotCi0gICAgICAgICAgICAgICAgLyogVW5pUEc+PiAqLwotI2lmZGVmIFVTRV9KUFdMCi0gICAgICAgICAgICAgICAgY3AtPmNvbW1lbnQgPSAoY2hhciopb3BqX21hbGxvYyhjbGVuK3N0cmxlbih2ZXJzaW9uKSsxMSk7Ci0JCQkJCQkJCWlmKCFjcC0+Y29tbWVudCkgewotCQkJCQkJCQkgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBjb21tZW50IHN0cmluZ1xuIik7Ci0JCQkJCQkJCSAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLQkJCQkJCQkJfQotICAgICAgICAgICAgICAgIHNwcmludGYoY3AtPmNvbW1lbnQsIiVzJXMgd2l0aCBKUFdMIiwgY29tbWVudCwgdmVyc2lvbik7Ci0jZWxzZQotICAgICAgICAgICAgICAgIGNwLT5jb21tZW50ID0gKGNoYXIqKW9wal9tYWxsb2MoY2xlbitzdHJsZW4odmVyc2lvbikrMSk7Ci0JCQkJCQkJCWlmKCFjcC0+Y29tbWVudCkgewotCQkJCQkJCQkgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBjb21tZW50IHN0cmluZ1xuIik7Ci0JCQkJCQkJCSAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLQkJCQkJCQkJfQotICAgICAgICAgICAgICAgIHNwcmludGYoY3AtPmNvbW1lbnQsIiVzJXMiLCBjb21tZW50LCB2ZXJzaW9uKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIC8qIDw8VW5pUEcgKi8KLQkJCQl9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgY2FsY3VsYXRlIG90aGVyIGVuY29kaW5nIHBhcmFtZXRlcnMKLSAgICAgICAgKi8KLQotICAgICAgICBpZiAocGFyYW1ldGVycy0+dGlsZV9zaXplX29uKSB7Ci0gICAgICAgICAgICAgICAgY3AtPnR3ID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpKGltYWdlLT54MSAtIGNwLT50eDApLCAoT1BKX0lOVDMyKWNwLT50ZHgpOwotICAgICAgICAgICAgICAgIGNwLT50aCA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKShpbWFnZS0+eTEgLSBjcC0+dHkwKSwgKE9QSl9JTlQzMiljcC0+dGR5KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjcC0+dGR4ID0gaW1hZ2UtPngxIC0gY3AtPnR4MDsKLSAgICAgICAgICAgICAgICBjcC0+dGR5ID0gaW1hZ2UtPnkxIC0gY3AtPnR5MDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXJhbWV0ZXJzLT50cF9vbikgewotICAgICAgICAgICAgICAgIGNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fdHBfZmxhZyA9IChPUEpfQllURSlwYXJhbWV0ZXJzLT50cF9mbGFnOwotICAgICAgICAgICAgICAgIGNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fdHBfb24gPSAxOwotICAgICAgICB9Ci0KLSNpZmRlZiBVU0VfSlBXTAotICAgICAgICAvKgotICAgICAgICBjYWxjdWxhdGUgSlBXTCBlbmNvZGluZyBwYXJhbWV0ZXJzCi0gICAgICAgICovCi0KLSAgICAgICAgaWYgKHBhcmFtZXRlcnMtPmpwd2xfZXBjX29uKSB7Ci0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIGk7Ci0KLSAgICAgICAgICAgICAgICAvKiBzZXQgSlBXTCBvbiAqLwotICAgICAgICAgICAgICAgIGNwLT5lcGNfb24gPSBPUEpfVFJVRTsKLSAgICAgICAgICAgICAgICBjcC0+aW5mb19vbiA9IE9QSl9GQUxTRTsgLyogbm8gaW5mb3JtYXRpdmUgdGVjaG5pcXVlICovCi0KLSAgICAgICAgICAgICAgICAvKiBzZXQgRVBCIG9uICovCi0gICAgICAgICAgICAgICAgaWYgKChwYXJhbWV0ZXJzLT5qcHdsX2hwcm90X01IID4gMCkgfHwgKHBhcmFtZXRlcnMtPmpwd2xfaHByb3RfVFBIWzBdID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNwLT5lcGJfb24gPSBPUEpfVFJVRTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY3AtPmhwcm90X01IID0gcGFyYW1ldGVycy0+anB3bF9ocHJvdF9NSDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBKUFdMX01BWF9OT19USUxFU1BFQ1M7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC0+aHByb3RfVFBIX3RpbGVub1tpXSA9IHBhcmFtZXRlcnMtPmpwd2xfaHByb3RfVFBIX3RpbGVub1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AtPmhwcm90X1RQSFtpXSA9IHBhcmFtZXRlcnMtPmpwd2xfaHByb3RfVFBIW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgdGlsZSBzcGVjcyBhcmUgbm90IHNwZWNpZmllZCwgY29weSBNSCBzcGVjcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNwLT5ocHJvdF9UUEhbMF0gPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AtPmhwcm90X1RQSF90aWxlbm9bMF0gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC0+aHByb3RfVFBIWzBdID0gcGFyYW1ldGVycy0+anB3bF9ocHJvdF9NSDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBKUFdMX01BWF9OT19QQUNLU1BFQ1M7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC0+cHByb3RfdGlsZW5vW2ldID0gcGFyYW1ldGVycy0+anB3bF9wcHJvdF90aWxlbm9baV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLT5wcHJvdF9wYWNrbm9baV0gPSBwYXJhbWV0ZXJzLT5qcHdsX3Bwcm90X3BhY2tub1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AtPnBwcm90W2ldID0gcGFyYW1ldGVycy0+anB3bF9wcHJvdFtpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBzZXQgRVNEIHdyaXRpbmcgKi8KLSAgICAgICAgICAgICAgICBpZiAoKHBhcmFtZXRlcnMtPmpwd2xfc2Vuc19zaXplID09IDEpIHx8IChwYXJhbWV0ZXJzLT5qcHdsX3NlbnNfc2l6ZSA9PSAyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY3AtPmVzZF9vbiA9IE9QSl9UUlVFOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjcC0+c2Vuc19zaXplID0gcGFyYW1ldGVycy0+anB3bF9zZW5zX3NpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcC0+c2Vuc19hZGRyID0gcGFyYW1ldGVycy0+anB3bF9zZW5zX2FkZHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcC0+c2Vuc19yYW5nZSA9IHBhcmFtZXRlcnMtPmpwd2xfc2Vuc19yYW5nZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY3AtPnNlbnNfTUggPSBwYXJhbWV0ZXJzLT5qcHdsX3NlbnNfTUg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgSlBXTF9NQVhfTk9fVElMRVNQRUNTOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AtPnNlbnNfVFBIX3RpbGVub1tpXSA9IHBhcmFtZXRlcnMtPmpwd2xfc2Vuc19UUEhfdGlsZW5vW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC0+c2Vuc19UUEhbaV0gPSBwYXJhbWV0ZXJzLT5qcHdsX3NlbnNfVFBIW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIGFsd2F5cyBzZXQgUkVEIHdyaXRpbmcgdG8gZmFsc2U6IHdlIGFyZSBhdCB0aGUgZW5jb2RlciAqLwotICAgICAgICAgICAgICAgIGNwLT5yZWRfb24gPSBPUEpfRkFMU0U7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjcC0+ZXBjX29uID0gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0jZW5kaWYgLyogVVNFX0pQV0wgKi8KLQotICAgICAgICAvKiBpbml0aWFsaXplIHRoZSBtdXRpcGxlIHRpbGVzICovCi0gICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAgICAgY3AtPnRjcHMgPSAob3BqX3RjcF90Kikgb3BqX2NhbGxvYyhjcC0+dHcgKiBjcC0+dGgsIHNpemVvZihvcGpfdGNwX3QpKTsKLSAgICAgICAgaWYgKCFjcC0+dGNwcykgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSB0aWxlIGNvZGluZyBwYXJhbWV0ZXJzXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbWV0ZXJzLT5udW1wb2NzKSB7Ci0gICAgICAgICAgICAgICAgLyogaW5pdGlhbGlzYXRpb24gb2YgUE9DICovCi0gICAgICAgICAgICAgICAgb3BqX2oya19jaGVja19wb2NfdmFsKHBhcmFtZXRlcnMtPlBPQyxwYXJhbWV0ZXJzLT5udW1wb2NzLCAoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uLCBpbWFnZS0+bnVtY29tcHMsIChPUEpfVUlOVDMyKXBhcmFtZXRlcnMtPnRjcF9udW1sYXllcnMsIHBfbWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgLyogVE9ETyBNU0QgdXNlIHRoZSByZXR1cm4gdmFsdWUqLwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yICh0aWxlbm8gPSAwOyB0aWxlbm8gPCBjcC0+dHcgKiBjcC0+dGg7IHRpbGVubysrKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3RjcF90ICp0Y3AgPSAmY3AtPnRjcHNbdGlsZW5vXTsKLSAgICAgICAgICAgICAgICB0Y3AtPm51bWxheWVycyA9IChPUEpfVUlOVDMyKXBhcmFtZXRlcnMtPnRjcF9udW1sYXllcnM7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdGNwLT5udW1sYXllcnM7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoT1BKX0lTX0NJTkVNQShjcC0+cnNpeikpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9maXhlZF9xdWFsaXR5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT5kaXN0b3JhdGlvW2pdID0gcGFyYW1ldGVycy0+dGNwX2Rpc3RvcmF0aW9bal07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT5yYXRlc1tqXSA9IHBhcmFtZXRlcnMtPnRjcF9yYXRlc1tqXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9maXhlZF9xdWFsaXR5KSB7ICAgICAgIC8qIGFkZCBmaXhlZF9xdWFsaXR5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT5kaXN0b3JhdGlvW2pdID0gcGFyYW1ldGVycy0+dGNwX2Rpc3RvcmF0aW9bal07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT5yYXRlc1tqXSA9IHBhcmFtZXRlcnMtPnRjcF9yYXRlc1tqXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRjcC0+Y3N0eSA9IChPUEpfVUlOVDMyKXBhcmFtZXRlcnMtPmNzdHk7Ci0gICAgICAgICAgICAgICAgdGNwLT5wcmcgPSBwYXJhbWV0ZXJzLT5wcm9nX29yZGVyOwotICAgICAgICAgICAgICAgIHRjcC0+bWN0ID0gKE9QSl9VSU5UMzIpcGFyYW1ldGVycy0+dGNwX21jdDsKLQotICAgICAgICAgICAgICAgIG51bXBvY3NfdGlsZSA9IDA7Ci0gICAgICAgICAgICAgICAgdGNwLT5QT0MgPSAwOwotCi0gICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMtPm51bXBvY3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpc2F0aW9uIG9mIFBPQyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT5QT0MgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcmFtZXRlcnMtPm51bXBvY3M7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGlsZW5vICsgMSA9PSBwYXJhbWV0ZXJzLT5QT0NbaV0udGlsZSApICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BvY190ICp0Y3BfcG9jID0gJnRjcC0+cG9jc1tudW1wb2NzX3RpbGVdOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwX3BvYy0+cmVzbm8wICAgICAgICAgPSBwYXJhbWV0ZXJzLT5QT0NbbnVtcG9jc190aWxlXS5yZXNubzA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwX3BvYy0+Y29tcG5vMCAgICAgICAgPSBwYXJhbWV0ZXJzLT5QT0NbbnVtcG9jc190aWxlXS5jb21wbm8wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcF9wb2MtPmxheW5vMSAgICAgICAgID0gcGFyYW1ldGVycy0+UE9DW251bXBvY3NfdGlsZV0ubGF5bm8xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcF9wb2MtPnJlc25vMSAgICAgICAgID0gcGFyYW1ldGVycy0+UE9DW251bXBvY3NfdGlsZV0ucmVzbm8xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcF9wb2MtPmNvbXBubzEgICAgICAgID0gcGFyYW1ldGVycy0+UE9DW251bXBvY3NfdGlsZV0uY29tcG5vMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3BfcG9jLT5wcmcxICAgICAgICAgICA9IHBhcmFtZXRlcnMtPlBPQ1tudW1wb2NzX3RpbGVdLnByZzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwX3BvYy0+dGlsZSAgICAgICAgICAgPSBwYXJhbWV0ZXJzLT5QT0NbbnVtcG9jc190aWxlXS50aWxlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtcG9jc190aWxlKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT5udW1wb2NzID0gbnVtcG9jc190aWxlIC0xIDsKLSAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRjcC0+bnVtcG9jcyA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdGNwLT50Y2NwcyA9IChvcGpfdGNjcF90Kikgb3BqX2NhbGxvYyhpbWFnZS0+bnVtY29tcHMsIHNpemVvZihvcGpfdGNjcF90KSk7Ci0gICAgICAgICAgICAgICAgaWYgKCF0Y3AtPnRjY3BzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgdGlsZSBjb21wb25lbnQgY29kaW5nIHBhcmFtZXRlcnNcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMtPm1jdF9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbE1jdFNpemUgPSBpbWFnZS0+bnVtY29tcHMgKiBpbWFnZS0+bnVtY29tcHMgKiAoT1BKX1VJTlQzMilzaXplb2YoT1BKX0ZMT0FUMzIpOwotICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiAqIGxUbXBCdWYgPSAoT1BKX0ZMT0FUMzIqKW9wal9tYWxsb2MobE1jdFNpemUpOwotICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBsX2RjX3NoaWZ0ID0gKE9QSl9JTlQzMiAqKSAoKE9QSl9CWVRFICopIHBhcmFtZXRlcnMtPm1jdF9kYXRhICsgbE1jdFNpemUpOwotCi0JCQkJCQkJCQkJaWYgKCFsVG1wQnVmKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHRlbXAgYnVmZmVyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdGNwLT5tY3QgPSAyOwotICAgICAgICAgICAgICAgICAgICB0Y3AtPm1fbWN0X2NvZGluZ19tYXRyaXggPSAoT1BKX0ZMT0FUMzIqKW9wal9tYWxsb2MobE1jdFNpemUpOwotCQkJCQkJCQkJCWlmICghIHRjcC0+bV9tY3RfY29kaW5nX21hdHJpeCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxUbXBCdWYpOwotCQkJCQkJCQkJCQkJCQlsVG1wQnVmID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgZW5jb2RlciBNQ1QgY29kaW5nIG1hdHJpeCBcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHRjcC0+bV9tY3RfY29kaW5nX21hdHJpeCxwYXJhbWV0ZXJzLT5tY3RfZGF0YSxsTWN0U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweShsVG1wQnVmLHBhcmFtZXRlcnMtPm1jdF9kYXRhLGxNY3RTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICB0Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCA9IChPUEpfRkxPQVQzMiopb3BqX21hbGxvYyhsTWN0U2l6ZSk7Ci0JCQkJCQkJCQkJaWYgKCEgdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgpIHsKLQkJCQkJCQkJCQkJCQkJb3BqX2ZyZWUobFRtcEJ1Zik7Ci0JCQkJCQkJCQkJCQkJCWxUbXBCdWYgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBlbmNvZGVyIE1DVCBkZWNvZGluZyBtYXRyaXggXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmKG9wal9tYXRyaXhfaW52ZXJzaW9uX2YobFRtcEJ1ZiwodGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgpLGltYWdlLT5udW1jb21wcykgPT0gT1BKX0ZBTFNFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobFRtcEJ1Zik7Ci0JCQkJCQkJCQkJCQkJCWxUbXBCdWYgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gaW52ZXJzZSBlbmNvZGVyIE1DVCBkZWNvZGluZyBtYXRyaXggXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotCQkJCQkJCQkJCX0KLQotICAgICAgICAgICAgICAgICAgICB0Y3AtPm1jdF9ub3JtcyA9IChPUEpfRkxPQVQ2NCopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfbWFsbG9jKGltYWdlLT5udW1jb21wcyAqIHNpemVvZihPUEpfRkxPQVQ2NCkpOwotCQkJCQkJCQkJCWlmICghIHRjcC0+bWN0X25vcm1zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobFRtcEJ1Zik7Ci0JCQkJCQkJCQkJCQkJCWxUbXBCdWYgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBlbmNvZGVyIE1DVCBub3JtcyBcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3BqX2NhbGN1bGF0ZV9ub3Jtcyh0Y3AtPm1jdF9ub3JtcyxpbWFnZS0+bnVtY29tcHMsdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgpOwotICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsVG1wQnVmKTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW1hZ2UtPm51bWNvbXBzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNjcF90ICp0Y2NwID0gJnRjcC0+dGNjcHNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+bV9kY19sZXZlbF9zaGlmdCA9IGxfZGNfc2hpZnRbaV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAob3BqX2oya19zZXR1cF9tY3RfZW5jb2RpbmcodGNwLGltYWdlKSA9PSBPUEpfRkFMU0UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZyZWUgd2lsbCBiZSBoYW5kbGVkIGJ5IG9wal9qMmtfZGVzdHJveSAqLwotCQkJCQkJCQkJCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWxlZCB0byBzZXR1cCBqMmsgbWN0IGVuY29kaW5nXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHRjcC0+bWN0PT0xICYmIGltYWdlLT5udW1jb21wcyA+PSAzKSB7IC8qIFJHQi0+WUNDIE1DVCBpcyBlbmFibGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGltYWdlLT5jb21wc1swXS5keCAhPSBpbWFnZS0+Y29tcHNbMV0uZHgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbWFnZS0+Y29tcHNbMF0uZHggIT0gaW1hZ2UtPmNvbXBzWzJdLmR4KSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW1hZ2UtPmNvbXBzWzBdLmR5ICE9IGltYWdlLT5jb21wc1sxXS5keSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGltYWdlLT5jb21wc1swXS5keSAhPSBpbWFnZS0+Y29tcHNbMl0uZHkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiQ2Fubm90IHBlcmZvcm0gTUNUIG9uIGNvbXBvbmVudHMgd2l0aCBkaWZmZXJlbnQgc2l6ZXMuIERpc2FibGluZyBNQ1QuXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3AtPm1jdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbWFnZS0+bnVtY29tcHM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNjcF90ICp0Y2NwID0gJnRjcC0+dGNjcHNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2NvbXAgPSAmKGltYWdlLT5jb21wc1tpXSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbF9jb21wLT5zZ25kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+bV9kY19sZXZlbF9zaGlmdCA9IDEgPDwgKGxfY29tcC0+cHJlYyAtIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGltYWdlLT5udW1jb21wczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNjcF90ICp0Y2NwID0gJnRjcC0+dGNjcHNbaV07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPmNzdHkgPSBwYXJhbWV0ZXJzLT5jc3R5ICYgMHgwMTsgICAvKiAwID0+IG9uZSBwcmVjaW5jdCB8fCAxID0+IGN1c3RvbSBwcmVjaW5jdCAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPm51bXJlc29sdXRpb25zID0gKE9QSl9VSU5UMzIpcGFyYW1ldGVycy0+bnVtcmVzb2x1dGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPmNibGt3ID0gKE9QSl9VSU5UMzIpb3BqX2ludF9mbG9vcmxvZzIocGFyYW1ldGVycy0+Y2Jsb2Nrd19pbml0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPmNibGtoID0gKE9QSl9VSU5UMzIpb3BqX2ludF9mbG9vcmxvZzIocGFyYW1ldGVycy0+Y2Jsb2NraF9pbml0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPmNibGtzdHkgPSAoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT5tb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cW1mYmlkID0gcGFyYW1ldGVycy0+aXJyZXZlcnNpYmxlID8gMCA6IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0Y2NwLT5xbnRzdHkgPSBwYXJhbWV0ZXJzLT5pcnJldmVyc2libGUgPyBKMktfQ0NQX1FOVFNUWV9TRVFOVCA6IEoyS19DQ1BfUU5UU1RZX05PUU5UOwotICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+bnVtZ2JpdHMgPSAyOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKE9QSl9JTlQzMilpID09IHBhcmFtZXRlcnMtPnJvaV9jb21wbm8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cm9pc2hpZnQgPSBwYXJhbWV0ZXJzLT5yb2lfc2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2NwLT5yb2lzaGlmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMtPmNzdHkgJiBKMktfQ0NQX0NTVFlfUFJUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHAgPSAwLCBpdF9yZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCB0Y2NwLT5udW1yZXNvbHV0aW9ucyA+IDAgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGl0X3JlcyA9IChPUEpfSU5UMzIpdGNjcC0+bnVtcmVzb2x1dGlvbnMgLSAxOyBpdF9yZXMgPj0gMDsgaXRfcmVzLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwIDwgcGFyYW1ldGVycy0+cmVzX3NwZWMpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVycy0+cHJjd19pbml0W3BdIDwgMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPnByY3dbaXRfcmVzXSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cHJjd1tpdF9yZXNdID0gKE9QSl9VSU5UMzIpb3BqX2ludF9mbG9vcmxvZzIocGFyYW1ldGVycy0+cHJjd19pbml0W3BdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLT5wcmNoX2luaXRbcF0gPCAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cHJjaFtpdF9yZXNdID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPnByY2hbaXRfcmVzXSA9IChPUEpfVUlOVDMyKW9wal9pbnRfZmxvb3Jsb2cyKHBhcmFtZXRlcnMtPnByY2hfaW5pdFtwXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHJlc19zcGVjID0gcGFyYW1ldGVycy0+cmVzX3NwZWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBzaXplX3ByY3cgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgc2l6ZV9wcmNoID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmVzX3NwZWM+MCk7IC8qIGlzc3VlIDE4OSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3ByY3cgPSBwYXJhbWV0ZXJzLT5wcmN3X2luaXRbcmVzX3NwZWMgLSAxXSA+PiAocCAtIChyZXNfc3BlYyAtIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9wcmNoID0gcGFyYW1ldGVycy0+cHJjaF9pbml0W3Jlc19zcGVjIC0gMV0gPj4gKHAgLSAocmVzX3NwZWMgLSAxKSk7Ci0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZV9wcmN3IDwgMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPnByY3dbaXRfcmVzXSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cHJjd1tpdF9yZXNdID0gKE9QSl9VSU5UMzIpb3BqX2ludF9mbG9vcmxvZzIoc2l6ZV9wcmN3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplX3ByY2ggPCAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cHJjaFtpdF9yZXNdID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2NwLT5wcmNoW2l0X3Jlc10gPSAoT1BKX1VJTlQzMilvcGpfaW50X2Zsb29ybG9nMihzaXplX3ByY2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnByaW50ZigiXG5zaXplIHByZWNpbmN0IGZvciBsZXZlbCAlZCA6ICVkLCVkXG4iLCBpdF9yZXMsdGNjcC0+cHJjd1tpdF9yZXNdLCB0Y2NwLT5wcmNoW2l0X3Jlc10pOyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgLyplbmQgZm9yKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdGNjcC0+bnVtcmVzb2x1dGlvbnM7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cHJjd1tqXSA9IDE1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cHJjaFtqXSA9IDE1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZHd0X2NhbGNfZXhwbGljaXRfc3RlcHNpemVzKHRjY3AsIGltYWdlLT5jb21wc1tpXS5wcmVjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFyYW1ldGVycy0+bWN0X2RhdGEpIHsKLSAgICAgICAgICAgICAgICBvcGpfZnJlZShwYXJhbWV0ZXJzLT5tY3RfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+bWN0X2RhdGEgPSAwMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2FkZF9taG1hcmtlcihvcGpfY29kZXN0cmVhbV9pbmRleF90ICpjc3RyX2luZGV4LCBPUEpfVUlOVDMyIHR5cGUsIE9QSl9PRkZfVCBwb3MsIE9QSl9VSU5UMzIgbGVuKQotewotICAgICAgICBhc3NlcnQoY3N0cl9pbmRleCAhPSAwMCk7Ci0KLSAgICAgICAgLyogZXhwYW5kIHRoZSBsaXN0PyAqLwotICAgICAgICBpZiAoKGNzdHJfaW5kZXgtPm1hcmtudW0gKyAxKSA+IGNzdHJfaW5kZXgtPm1heG1hcmtudW0pIHsKLSAgICAgICAgICAgICAgICBvcGpfbWFya2VyX2luZm9fdCAqbmV3X21hcmtlcjsKLSAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT5tYXhtYXJrbnVtID0gKE9QSl9VSU5UMzIpKDEwMCArIChPUEpfRkxPQVQzMikgY3N0cl9pbmRleC0+bWF4bWFya251bSk7Ci0gICAgICAgICAgICAgICAgbmV3X21hcmtlciA9IChvcGpfbWFya2VyX2luZm9fdCAqKSBvcGpfcmVhbGxvYyhjc3RyX2luZGV4LT5tYXJrZXIsIGNzdHJfaW5kZXgtPm1heG1hcmtudW0gKnNpemVvZihvcGpfbWFya2VyX2luZm9fdCkpOwotICAgICAgICAgICAgICAgIGlmICghIG5ld19tYXJrZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGNzdHJfaW5kZXgtPm1hcmtlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT5tYXJrZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+bWF4bWFya251bSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT5tYXJrbnVtID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhZGQgbWggbWFya2VyXG4iKTsgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNzdHJfaW5kZXgtPm1hcmtlciA9IG5ld19tYXJrZXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBhZGQgdGhlIG1hcmtlciAqLwotICAgICAgICBjc3RyX2luZGV4LT5tYXJrZXJbY3N0cl9pbmRleC0+bWFya251bV0udHlwZSA9IChPUEpfVUlOVDE2KXR5cGU7Ci0gICAgICAgIGNzdHJfaW5kZXgtPm1hcmtlcltjc3RyX2luZGV4LT5tYXJrbnVtXS5wb3MgPSAoT1BKX0lOVDMyKXBvczsKLSAgICAgICAgY3N0cl9pbmRleC0+bWFya2VyW2NzdHJfaW5kZXgtPm1hcmtudW1dLmxlbiA9IChPUEpfSU5UMzIpbGVuOwotICAgICAgICBjc3RyX2luZGV4LT5tYXJrbnVtKys7Ci0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfYWRkX3RsbWFya2VyKE9QSl9VSU5UMzIgdGlsZW5vLCBvcGpfY29kZXN0cmVhbV9pbmRleF90ICpjc3RyX2luZGV4LCBPUEpfVUlOVDMyIHR5cGUsIE9QSl9PRkZfVCBwb3MsIE9QSl9VSU5UMzIgbGVuKQotewotICAgICAgICBhc3NlcnQoY3N0cl9pbmRleCAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChjc3RyX2luZGV4LT50aWxlX2luZGV4ICE9IDAwKTsKLQotICAgICAgICAvKiBleHBhbmQgdGhlIGxpc3Q/ICovCi0gICAgICAgIGlmICgoY3N0cl9pbmRleC0+dGlsZV9pbmRleFt0aWxlbm9dLm1hcmtudW0gKyAxKSA+IGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5tYXhtYXJrbnVtKSB7Ci0gICAgICAgICAgICAgICAgb3BqX21hcmtlcl9pbmZvX3QgKm5ld19tYXJrZXI7Ci0gICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFt0aWxlbm9dLm1heG1hcmtudW0gPSAoT1BKX1VJTlQzMikoMTAwICsgKE9QSl9GTE9BVDMyKSBjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10ubWF4bWFya251bSk7Ci0gICAgICAgICAgICAgICAgbmV3X21hcmtlciA9IChvcGpfbWFya2VyX2luZm9fdCAqKSBvcGpfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFt0aWxlbm9dLm1hcmtlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFt0aWxlbm9dLm1heG1hcmtudW0gKnNpemVvZihvcGpfbWFya2VyX2luZm9fdCkpOwotICAgICAgICAgICAgICAgIGlmICghIG5ld19tYXJrZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5tYXJrZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFt0aWxlbm9dLm1hcmtlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10ubWF4bWFya251bSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10ubWFya251bSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWRkIHRsIG1hcmtlclxuIik7ICovCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10ubWFya2VyID0gbmV3X21hcmtlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGFkZCB0aGUgbWFya2VyICovCi0gICAgICAgIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5tYXJrZXJbY3N0cl9pbmRleC0+dGlsZV9pbmRleFt0aWxlbm9dLm1hcmtudW1dLnR5cGUgPSAoT1BKX1VJTlQxNil0eXBlOwotICAgICAgICBjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10ubWFya2VyW2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5tYXJrbnVtXS5wb3MgPSAoT1BKX0lOVDMyKXBvczsKLSAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFt0aWxlbm9dLm1hcmtlcltjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10ubWFya251bV0ubGVuID0gKE9QSl9JTlQzMilsZW47Ci0gICAgICAgIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5tYXJrbnVtKys7Ci0KLSAgICAgICAgaWYgKHR5cGUgPT0gSjJLX01TX1NPVCkgewotICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbF9jdXJyZW50X3RpbGVfcGFydCA9IGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5jdXJyZW50X3Rwc25vOwotCi0gICAgICAgICAgICAgICAgaWYgKGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS50cF9pbmRleCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS50cF9pbmRleFtsX2N1cnJlbnRfdGlsZV9wYXJ0XS5zdGFydF9wb3MgPSBwb3M7Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotT1BKX0JPT0wgb3BqX2oya19lbmRfZGVjb21wcmVzcyhvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgKHZvaWQpcF9qMms7Ci0gICAgKHZvaWQpcF9zdHJlYW07Ci0gICAgKHZvaWQpcF9tYW5hZ2VyOwotICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX0JPT0wgb3BqX2oya19yZWFkX2hlYWRlciggICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfajJrX3QqIHBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QqKiBwX2ltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90KiBwX21hbmFnZXIgKQotewotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotCi0gICAgICAgIC8qIGNyZWF0ZSBhbiBlbXB0eSBpbWFnZSBoZWFkZXIgKi8KLSAgICAgICAgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZSA9IG9wal9pbWFnZV9jcmVhdGUwKCk7Ci0gICAgICAgIGlmICghIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogY3VzdG9taXphdGlvbiBvZiB0aGUgdmFsaWRhdGlvbiAqLwotICAgICAgICBvcGpfajJrX3NldHVwX2RlY29kaW5nX3ZhbGlkYXRpb24ocF9qMmspOwotCi0gICAgICAgIC8qIHZhbGlkYXRpb24gb2YgdGhlIHBhcmFtZXRlcnMgY29kZWMgKi8KLSAgICAgICAgaWYgKCEgb3BqX2oya19leGVjKHBfajJrLCBwX2oyay0+bV92YWxpZGF0aW9uX2xpc3QsIHBfc3RyZWFtLHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfZGVzdHJveShwX2oyay0+bV9wcml2YXRlX2ltYWdlKTsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9wcml2YXRlX2ltYWdlID0gTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogY3VzdG9taXphdGlvbiBvZiB0aGUgZW5jb2RpbmcgKi8KLSAgICAgICAgb3BqX2oya19zZXR1cF9oZWFkZXJfcmVhZGluZyhwX2oyayk7Ci0KLSAgICAgICAgLyogcmVhZCBoZWFkZXIgKi8KLSAgICAgICAgaWYgKCEgb3BqX2oya19leGVjIChwX2oyayxwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCxwX3N0cmVhbSxwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2ltYWdlX2Rlc3Ryb3kocF9qMmstPm1fcHJpdmF0ZV9pbWFnZSk7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgICpwX2ltYWdlID0gb3BqX2ltYWdlX2NyZWF0ZTAoKTsKLSAgICAgICAgaWYgKCEgKCpwX2ltYWdlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDb3B5IGNvZGVzdHJlYW0gaW1hZ2UgaW5mb3JtYXRpb24gdG8gdGhlIG91dHB1dCBpbWFnZSAqLwotICAgICAgICBvcGpfY29weV9pbWFnZV9oZWFkZXIocF9qMmstPm1fcHJpdmF0ZV9pbWFnZSwgKnBfaW1hZ2UpOwotCi0gICAgLypBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBzb21lIGVsZW1lbnRzIG9mIGNvZGVzdHJlbSBpbmRleCovCi0gICAgICAgIGlmICghb3BqX2oya19hbGxvY2F0ZV90aWxlX2VsZW1lbnRfY3N0cl9pbmRleChwX2oyaykpewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLXZvaWQgb3BqX2oya19zZXR1cF9oZWFkZXJfcmVhZGluZyAob3BqX2oya190ICpwX2oyaykKLXsKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0KLSAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya19yZWFkX2hlYWRlcl9wcm9jZWR1cmUpOwotCi0gICAgICAgIC8qIERFVkVMT1BFUiBDT1JORVIsIGFkZCB5b3VyIGN1c3RvbSBwcm9jZWR1cmVzICovCi0gICAgICAgIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfY29weV9kZWZhdWx0X3RjcF9hbmRfY3JlYXRlX3RjZCk7Ci0KLX0KLQotdm9pZCBvcGpfajJrX3NldHVwX2RlY29kaW5nX3ZhbGlkYXRpb24gKG9wal9qMmtfdCAqcF9qMmspCi17Ci0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotCi0gICAgICAgIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3ZhbGlkYXRpb25fbGlzdCwgKG9wal9wcm9jZWR1cmUpb3BqX2oya19idWlsZF9kZWNvZGVyKTsKLSAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fdmFsaWRhdGlvbl9saXN0LCAob3BqX3Byb2NlZHVyZSlvcGpfajJrX2RlY29kaW5nX3ZhbGlkYXRpb24pOwotICAgICAgICAvKiBERVZFTE9QRVIgQ09STkVSLCBhZGQgeW91ciBjdXN0b20gdmFsaWRhdGlvbiBwcm9jZWR1cmUgKi8KLQotfQotCi1PUEpfQk9PTCBvcGpfajJrX21jdF92YWxpZGF0aW9uICggICAgICAgb3BqX2oya190ICogcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCi17Ci0gICAgICAgIE9QSl9CT09MIGxfaXNfdmFsaWQgPSBPUEpfVFJVRTsKLSAgICAgICAgT1BKX1VJTlQzMiBpLGo7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLQotICAgICAgICBpZiAoKHBfajJrLT5tX2NwLnJzaXogJiAweDgyMDApID09IDB4ODIwMCkgewotICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbF9uYl90aWxlcyA9IHBfajJrLT5tX2NwLnRoICogcF9qMmstPm1fY3AudHc7Ci0gICAgICAgICAgICAgICAgb3BqX3RjcF90ICogbF90Y3AgPSBwX2oyay0+bV9jcC50Y3BzOwotCi0gICAgICAgICAgICAgICAgZm9yIChpPTA7aTxsX25iX3RpbGVzOysraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfdGNwLT5tY3QgPT0gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNjcF90ICogbF90Y2NwID0gbF90Y3AtPnRjY3BzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2lzX3ZhbGlkICY9IChsX3RjcC0+bV9tY3RfY29kaW5nX21hdHJpeCAhPSAwMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7ajxwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wczsrK2opIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2lzX3ZhbGlkICY9ICEgKGxfdGNjcC0+cW1mYmlkICYgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX3RjY3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICsrbF90Y3A7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGxfaXNfdmFsaWQ7Ci19Ci0KLU9QSl9CT09MIG9wal9qMmtfc2V0dXBfbWN0X2VuY29kaW5nKG9wal90Y3BfdCAqIHBfdGNwLCBvcGpfaW1hZ2VfdCAqIHBfaW1hZ2UpCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2luZGl4ID0gMTsKLSAgICAgICAgb3BqX21jdF9kYXRhX3QgKiBsX21jdF9kZWNvX2RhdGEgPSAwMCwqIGxfbWN0X29mZnNldF9kYXRhID0gMDA7Ci0gICAgICAgIG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90ICogbF9tY2NfZGF0YTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX21jdF9zaXplLGxfbmJfZWxlbTsKLSAgICAgICAgT1BKX0ZMT0FUMzIgKiBsX2RhdGEsICogbF9jdXJyZW50X2RhdGE7Ci0gICAgICAgIG9wal90Y2NwX3QgKiBsX3RjY3A7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF90Y3AgIT0gMDApOwotCi0gICAgICAgIGlmIChwX3RjcC0+bWN0ICE9IDIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCkgewotICAgICAgICAgICAgICAgIGlmIChwX3RjcC0+bV9uYl9tY3RfcmVjb3JkcyA9PSBwX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9tY3RfZGF0YV90ICpuZXdfbWN0X3JlY29yZHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMgKz0gT1BKX0oyS19NQ1RfREVGQVVMVF9OQl9SRUNPUkRTOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXdfbWN0X3JlY29yZHMgPSAob3BqX21jdF9kYXRhX3QgKikgb3BqX3JlYWxsb2MocF90Y3AtPm1fbWN0X3JlY29yZHMsIHBfdGNwLT5tX25iX21heF9tY3RfcmVjb3JkcyAqIHNpemVvZihvcGpfbWN0X2RhdGFfdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmV3X21jdF9yZWNvcmRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfdGNwLT5tX21jdF9yZWNvcmRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90Y3AtPm1fbWN0X3JlY29yZHMgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3RjcC0+bV9uYl9tY3RfcmVjb3JkcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBzZXR1cCBtY3QgZW5jb2RpbmdcbiIpOyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcF90Y3AtPm1fbWN0X3JlY29yZHMgPSBuZXdfbWN0X3JlY29yZHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX21jdF9kZWNvX2RhdGEgPSBwX3RjcC0+bV9tY3RfcmVjb3JkcyArIHBfdGNwLT5tX25iX21jdF9yZWNvcmRzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQobF9tY3RfZGVjb19kYXRhICwwLChwX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMgLSBwX3RjcC0+bV9uYl9tY3RfcmVjb3JkcykgKiBzaXplb2Yob3BqX21jdF9kYXRhX3QpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbF9tY3RfZGVjb19kYXRhID0gcF90Y3AtPm1fbWN0X3JlY29yZHMgKyBwX3RjcC0+bV9uYl9tY3RfcmVjb3JkczsKLQotICAgICAgICAgICAgICAgIGlmIChsX21jdF9kZWNvX2RhdGEtPm1fZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9tY3RfZGVjb19kYXRhLT5tX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgbF9tY3RfZGVjb19kYXRhLT5tX2RhdGEgPSAwMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsX21jdF9kZWNvX2RhdGEtPm1faW5kZXggPSBsX2luZGl4Kys7Ci0gICAgICAgICAgICAgICAgbF9tY3RfZGVjb19kYXRhLT5tX2FycmF5X3R5cGUgPSBNQ1RfVFlQRV9ERUNPUlJFTEFUSU9OOwotICAgICAgICAgICAgICAgIGxfbWN0X2RlY29fZGF0YS0+bV9lbGVtZW50X3R5cGUgPSBNQ1RfVFlQRV9GTE9BVDsKLSAgICAgICAgICAgICAgICBsX25iX2VsZW0gPSBwX2ltYWdlLT5udW1jb21wcyAqIHBfaW1hZ2UtPm51bWNvbXBzOwotICAgICAgICAgICAgICAgIGxfbWN0X3NpemUgPSBsX25iX2VsZW0gKiBNQ1RfRUxFTUVOVF9TSVpFW2xfbWN0X2RlY29fZGF0YS0+bV9lbGVtZW50X3R5cGVdOwotICAgICAgICAgICAgICAgIGxfbWN0X2RlY29fZGF0YS0+bV9kYXRhID0gKE9QSl9CWVRFKilvcGpfbWFsbG9jKGxfbWN0X3NpemUgKTsKLQotICAgICAgICAgICAgICAgIGlmICghIGxfbWN0X2RlY29fZGF0YS0+bV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGoya19tY3Rfd3JpdGVfZnVuY3Rpb25zX2Zyb21fZmxvYXRbbF9tY3RfZGVjb19kYXRhLT5tX2VsZW1lbnRfdHlwZV0ocF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCxsX21jdF9kZWNvX2RhdGEtPm1fZGF0YSxsX25iX2VsZW0pOwotCi0gICAgICAgICAgICAgICAgbF9tY3RfZGVjb19kYXRhLT5tX2RhdGFfc2l6ZSA9IGxfbWN0X3NpemU7Ci0gICAgICAgICAgICAgICAgKytwX3RjcC0+bV9uYl9tY3RfcmVjb3JkczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwX3RjcC0+bV9uYl9tY3RfcmVjb3JkcyA9PSBwX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMpIHsKLSAgICAgICAgICAgICAgICBvcGpfbWN0X2RhdGFfdCAqbmV3X21jdF9yZWNvcmRzOwotICAgICAgICAgICAgICAgIHBfdGNwLT5tX25iX21heF9tY3RfcmVjb3JkcyArPSBPUEpfSjJLX01DVF9ERUZBVUxUX05CX1JFQ09SRFM7Ci0gICAgICAgICAgICAgICAgbmV3X21jdF9yZWNvcmRzID0gKG9wal9tY3RfZGF0YV90ICopIG9wal9yZWFsbG9jKHBfdGNwLT5tX21jdF9yZWNvcmRzLCBwX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMgKiBzaXplb2Yob3BqX21jdF9kYXRhX3QpKTsKLSAgICAgICAgICAgICAgICBpZiAoISBuZXdfbWN0X3JlY29yZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfdGNwLT5tX21jdF9yZWNvcmRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfdGNwLT5tX21jdF9yZWNvcmRzID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfdGNwLT5tX25iX21heF9tY3RfcmVjb3JkcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX3RjcC0+bV9uYl9tY3RfcmVjb3JkcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gc2V0dXAgbWN0IGVuY29kaW5nXG4iKTsgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBfdGNwLT5tX21jdF9yZWNvcmRzID0gbmV3X21jdF9yZWNvcmRzOwotICAgICAgICAgICAgICAgIGxfbWN0X29mZnNldF9kYXRhID0gcF90Y3AtPm1fbWN0X3JlY29yZHMgKyBwX3RjcC0+bV9uYl9tY3RfcmVjb3JkczsKLQotICAgICAgICAgICAgICAgIG1lbXNldChsX21jdF9vZmZzZXRfZGF0YSAsMCwocF90Y3AtPm1fbmJfbWF4X21jdF9yZWNvcmRzIC0gcF90Y3AtPm1fbmJfbWN0X3JlY29yZHMpICogc2l6ZW9mKG9wal9tY3RfZGF0YV90KSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobF9tY3RfZGVjb19kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX21jdF9kZWNvX2RhdGEgPSBsX21jdF9vZmZzZXRfZGF0YSAtIDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbF9tY3Rfb2Zmc2V0X2RhdGEgPSBwX3RjcC0+bV9tY3RfcmVjb3JkcyArIHBfdGNwLT5tX25iX21jdF9yZWNvcmRzOwotCi0gICAgICAgIGlmIChsX21jdF9vZmZzZXRfZGF0YS0+bV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9tY3Rfb2Zmc2V0X2RhdGEtPm1fZGF0YSk7Ci0gICAgICAgICAgICAgICAgbF9tY3Rfb2Zmc2V0X2RhdGEtPm1fZGF0YSA9IDAwOwotICAgICAgICB9Ci0KLSAgICAgICAgbF9tY3Rfb2Zmc2V0X2RhdGEtPm1faW5kZXggPSBsX2luZGl4Kys7Ci0gICAgICAgIGxfbWN0X29mZnNldF9kYXRhLT5tX2FycmF5X3R5cGUgPSBNQ1RfVFlQRV9PRkZTRVQ7Ci0gICAgICAgIGxfbWN0X29mZnNldF9kYXRhLT5tX2VsZW1lbnRfdHlwZSA9IE1DVF9UWVBFX0ZMT0FUOwotICAgICAgICBsX25iX2VsZW0gPSBwX2ltYWdlLT5udW1jb21wczsKLSAgICAgICAgbF9tY3Rfc2l6ZSA9IGxfbmJfZWxlbSAqIE1DVF9FTEVNRU5UX1NJWkVbbF9tY3Rfb2Zmc2V0X2RhdGEtPm1fZWxlbWVudF90eXBlXTsKLSAgICAgICAgbF9tY3Rfb2Zmc2V0X2RhdGEtPm1fZGF0YSA9IChPUEpfQllURSopb3BqX21hbGxvYyhsX21jdF9zaXplICk7Ci0KLSAgICAgICAgaWYgKCEgbF9tY3Rfb2Zmc2V0X2RhdGEtPm1fZGF0YSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBsX2RhdGEgPSAoT1BKX0ZMT0FUMzIqKW9wal9tYWxsb2MobF9uYl9lbGVtICogc2l6ZW9mKE9QSl9GTE9BVDMyKSk7Ci0gICAgICAgIGlmICghIGxfZGF0YSkgewotICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfbWN0X29mZnNldF9kYXRhLT5tX2RhdGEpOwotICAgICAgICAgICAgICAgIGxfbWN0X29mZnNldF9kYXRhLT5tX2RhdGEgPSAwMDsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgbF90Y2NwID0gcF90Y3AtPnRjY3BzOwotICAgICAgICBsX2N1cnJlbnRfZGF0YSA9IGxfZGF0YTsKLQotICAgICAgICBmb3IgKGk9MDtpPGxfbmJfZWxlbTsrK2kpIHsKLSAgICAgICAgICAgICAgICAqKGxfY3VycmVudF9kYXRhKyspID0gKE9QSl9GTE9BVDMyKSAobF90Y2NwLT5tX2RjX2xldmVsX3NoaWZ0KTsKLSAgICAgICAgICAgICAgICArK2xfdGNjcDsKLSAgICAgICAgfQotCi0gICAgICAgIGoya19tY3Rfd3JpdGVfZnVuY3Rpb25zX2Zyb21fZmxvYXRbbF9tY3Rfb2Zmc2V0X2RhdGEtPm1fZWxlbWVudF90eXBlXShsX2RhdGEsbF9tY3Rfb2Zmc2V0X2RhdGEtPm1fZGF0YSxsX25iX2VsZW0pOwotCi0gICAgICAgIG9wal9mcmVlKGxfZGF0YSk7Ci0KLSAgICAgICAgbF9tY3Rfb2Zmc2V0X2RhdGEtPm1fZGF0YV9zaXplID0gbF9tY3Rfc2l6ZTsKLQotICAgICAgICArK3BfdGNwLT5tX25iX21jdF9yZWNvcmRzOwotCi0gICAgICAgIGlmIChwX3RjcC0+bV9uYl9tY2NfcmVjb3JkcyA9PSBwX3RjcC0+bV9uYl9tYXhfbWNjX3JlY29yZHMpIHsKLSAgICAgICAgICAgICAgICBvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCAqbmV3X21jY19yZWNvcmRzOwotICAgICAgICAgICAgICAgIHBfdGNwLT5tX25iX21heF9tY2NfcmVjb3JkcyArPSBPUEpfSjJLX01DVF9ERUZBVUxUX05CX1JFQ09SRFM7Ci0gICAgICAgICAgICAgICAgbmV3X21jY19yZWNvcmRzID0gKG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90ICopIG9wal9yZWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3RjcC0+bV9tY2NfcmVjb3JkcywgcF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzICogc2l6ZW9mKG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90KSk7Ci0gICAgICAgICAgICAgICAgaWYgKCEgbmV3X21jY19yZWNvcmRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX3RjcC0+bV9tY2NfcmVjb3Jkcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX3RjcC0+bV9tY2NfcmVjb3JkcyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX3RjcC0+bV9uYl9tYXhfbWNjX3JlY29yZHMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgcF90Y3AtPm1fbmJfbWNjX3JlY29yZHMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHNldHVwIG1jdCBlbmNvZGluZ1xuIik7ICovCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwX3RjcC0+bV9tY2NfcmVjb3JkcyA9IG5ld19tY2NfcmVjb3JkczsKLSAgICAgICAgICAgICAgICBsX21jY19kYXRhID0gcF90Y3AtPm1fbWNjX3JlY29yZHMgKyBwX3RjcC0+bV9uYl9tY2NfcmVjb3JkczsKLSAgICAgICAgICAgICAgICBtZW1zZXQobF9tY2NfZGF0YSAsMCwocF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzIC0gcF90Y3AtPm1fbmJfbWNjX3JlY29yZHMpICogc2l6ZW9mKG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90KSk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGxfbWNjX2RhdGEgPSBwX3RjcC0+bV9tY2NfcmVjb3JkcyArIHBfdGNwLT5tX25iX21jY19yZWNvcmRzOwotICAgICAgICBsX21jY19kYXRhLT5tX2RlY29ycmVsYXRpb25fYXJyYXkgPSBsX21jdF9kZWNvX2RhdGE7Ci0gICAgICAgIGxfbWNjX2RhdGEtPm1faXNfaXJyZXZlcnNpYmxlID0gMTsKLSAgICAgICAgbF9tY2NfZGF0YS0+bV9uYl9jb21wcyA9IHBfaW1hZ2UtPm51bWNvbXBzOwotICAgICAgICBsX21jY19kYXRhLT5tX2luZGV4ID0gbF9pbmRpeCsrOwotICAgICAgICBsX21jY19kYXRhLT5tX29mZnNldF9hcnJheSA9IGxfbWN0X29mZnNldF9kYXRhOwotICAgICAgICArK3BfdGNwLT5tX25iX21jY19yZWNvcmRzOwotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX0JPT0wgb3BqX2oya19idWlsZF9kZWNvZGVyIChvcGpfajJrX3QgKiBwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCi17Ci0gICAgICAgIC8qIGFkZCBoZXJlIGluaXRpYWxpemF0aW9uIG9mIGNwCi0gICAgICAgICAgIGNvcHkgcGFzdGUgb2Ygc2V0dXBfZGVjb2RlciAqLwotICAodm9pZClwX2oyazsKLSAgKHZvaWQpcF9zdHJlYW07Ci0gICh2b2lkKXBfbWFuYWdlcjsKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi1PUEpfQk9PTCBvcGpfajJrX2J1aWxkX2VuY29kZXIgKG9wal9qMmtfdCAqIHBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCi17Ci0gICAgICAgIC8qIGFkZCBoZXJlIGluaXRpYWxpemF0aW9uIG9mIGNwCi0gICAgICAgICAgIGNvcHkgcGFzdGUgb2Ygc2V0dXBfZW5jb2RlciAqLwotICAodm9pZClwX2oyazsKLSAgKHZvaWQpcF9zdHJlYW07Ci0gICh2b2lkKXBfbWFuYWdlcjsKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi1PUEpfQk9PTCBvcGpfajJrX2VuY29kaW5nX3ZhbGlkYXRpb24gKCAgb3BqX2oya190ICogcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCi17Ci0gICAgICAgIE9QSl9CT09MIGxfaXNfdmFsaWQgPSBPUEpfVFJVRTsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotCi0gICAgICAgIC8qIFNUQVRFIGNoZWNraW5nICovCi0gICAgICAgIC8qIG1ha2Ugc3VyZSB0aGUgc3RhdGUgaXMgYXQgMCAqLwotICAgICAgICBsX2lzX3ZhbGlkICY9IChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9PSBKMktfU1RBVEVfTk9ORSk7Ci0KLSAgICAgICAgLyogUE9JTlRFUiB2YWxpZGF0aW9uICovCi0gICAgICAgIC8qIG1ha2Ugc3VyZSBhIHBfajJrIGNvZGVjIGlzIHByZXNlbnQgKi8KLSAgICAgICAgbF9pc192YWxpZCAmPSAocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QgIT0gMDApOwotICAgICAgICAvKiBtYWtlIHN1cmUgYSB2YWxpZGF0aW9uIGxpc3QgaXMgcHJlc2VudCAqLwotICAgICAgICBsX2lzX3ZhbGlkICY9IChwX2oyay0+bV92YWxpZGF0aW9uX2xpc3QgIT0gMDApOwotCi0gICAgICAgIC8qIElTTyAxNTQ0NC0xOjIwMDQgc3RhdGVzIGJldHdlZW4gMSAmIDMzICgwIC0+IDMyKSAqLwotICAgICAgICAvKiAzMyAoMzIpIHdvdWxkIGFsd2F5cyBmYWlsIHRoZSBjaGVjayBiZWxvdyAoaWYgYSBjYXN0IHRvIDY0Yml0cyB3YXMgZG9uZSkgKi8KLSAgICAgICAgLyogRklYTUUgU2hhbGwgd2UgY2hhbmdlIE9QSl9KMktfTUFYUkxWTFMgdG8gMzIgPyAqLwotICAgICAgICBpZiAoKHBfajJrLT5tX2NwLnRjcHMtPnRjY3BzLT5udW1yZXNvbHV0aW9ucyA8PSAwKSB8fCAocF9qMmstPm1fY3AudGNwcy0+dGNjcHMtPm51bXJlc29sdXRpb25zID4gMzIpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk51bWJlciBvZiByZXNvbHV0aW9ucyBpcyB0b28gaGlnaCBpbiBjb21wYXJpc29uIHRvIHRoZSBzaXplIG9mIHRpbGVzXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChwX2oyay0+bV9jcC50ZHgpIDwgKE9QSl9VSU5UMzIpICgxIDw8IChwX2oyay0+bV9jcC50Y3BzLT50Y2Nwcy0+bnVtcmVzb2x1dGlvbnMgLSAxVSkpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk51bWJlciBvZiByZXNvbHV0aW9ucyBpcyB0b28gaGlnaCBpbiBjb21wYXJpc29uIHRvIHRoZSBzaXplIG9mIHRpbGVzXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChwX2oyay0+bV9jcC50ZHkpIDwgKE9QSl9VSU5UMzIpICgxIDw8IChwX2oyay0+bV9jcC50Y3BzLT50Y2Nwcy0+bnVtcmVzb2x1dGlvbnMgLSAxVSkpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk51bWJlciBvZiByZXNvbHV0aW9ucyBpcyB0b28gaGlnaCBpbiBjb21wYXJpc29uIHRvIHRoZSBzaXplIG9mIHRpbGVzXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogUEFSQU1FVEVSIFZBTElEQVRJT04gKi8KLSAgICAgICAgcmV0dXJuIGxfaXNfdmFsaWQ7Ci19Ci0KLU9QSl9CT09MIG9wal9qMmtfZGVjb2RpbmdfdmFsaWRhdGlvbiAoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgICAgIE9QSl9CT09MIGxfaXNfdmFsaWQgPSBPUEpfVFJVRTsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0KLSAgICAgICAgLyogU1RBVEUgY2hlY2tpbmcgKi8KLSAgICAgICAgLyogbWFrZSBzdXJlIHRoZSBzdGF0ZSBpcyBhdCAwICovCi0jaWZkZWYgVE9ET19NU0QKLSAgICAgICAgbF9pc192YWxpZCAmPSAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPT0gSjJLX0RFQ19TVEFURV9OT05FKTsKLSNlbmRpZgotICAgICAgICBsX2lzX3ZhbGlkICY9IChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9PSAweDAwMDApOwotCi0gICAgICAgIC8qIFBPSU5URVIgdmFsaWRhdGlvbiAqLwotICAgICAgICAvKiBtYWtlIHN1cmUgYSBwX2oyayBjb2RlYyBpcyBwcmVzZW50ICovCi0gICAgICAgIC8qIG1ha2Ugc3VyZSBhIHByb2NlZHVyZSBsaXN0IGlzIHByZXNlbnQgKi8KLSAgICAgICAgbF9pc192YWxpZCAmPSAocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QgIT0gMDApOwotICAgICAgICAvKiBtYWtlIHN1cmUgYSB2YWxpZGF0aW9uIGxpc3QgaXMgcHJlc2VudCAqLwotICAgICAgICBsX2lzX3ZhbGlkICY9IChwX2oyay0+bV92YWxpZGF0aW9uX2xpc3QgIT0gMDApOwotCi0gICAgICAgIC8qIFBBUkFNRVRFUiBWQUxJREFUSU9OICovCi0gICAgICAgIHJldHVybiBsX2lzX3ZhbGlkOwotfQotCi1PUEpfQk9PTCBvcGpfajJrX3JlYWRfaGVhZGVyX3Byb2NlZHVyZSggb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQotewotICAgICAgICBPUEpfVUlOVDMyIGxfY3VycmVudF9tYXJrZXI7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9tYXJrZXJfc2l6ZTsKLSAgICAgICAgY29uc3Qgb3BqX2RlY19tZW1vcnlfbWFya2VyX2hhbmRsZXJfdCAqIGxfbWFya2VyX2hhbmRsZXIgPSAwMDsKLSAgICAgICAgT1BKX0JPT0wgbF9oYXNfc2l6ID0gMDsKLSAgICAgICAgT1BKX0JPT0wgbF9oYXNfY29kID0gMDsKLSAgICAgICAgT1BKX0JPT0wgbF9oYXNfcWNkID0gMDsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotCi0gICAgICAgIC8qICBXZSBlbnRlciBpbiB0aGUgbWFpbiBoZWFkZXIgKi8KLSAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPSBKMktfU1RBVEVfTUhTT0M7Ci0KLSAgICAgICAgLyogVHJ5IHRvIHJlYWQgdGhlIFNPQyBtYXJrZXIsIHRoZSBjb2Rlc3RyZWFtIG11c3QgYmVnaW4gd2l0aCBTT0MgbWFya2VyICovCi0gICAgICAgIGlmICghIG9wal9qMmtfcmVhZF9zb2MocF9qMmsscF9zdHJlYW0scF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFeHBlY3RlZCBhIFNPQyBtYXJrZXIgXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogVHJ5IHRvIHJlYWQgMiBieXRlcyAodGhlIG5leHQgbWFya2VyIElEKSBmcm9tIHN0cmVhbSBhbmQgY29weSB0aGVtIGludG8gdGhlIGJ1ZmZlciAqLwotICAgICAgICBpZiAob3BqX3N0cmVhbV9yZWFkX2RhdGEocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsMixwX21hbmFnZXIpICE9IDIpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIHRvbyBzaG9ydFxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFJlYWQgMiBieXRlcyBhcyB0aGUgbmV3IG1hcmtlciBJRCAqLwotICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSwmbF9jdXJyZW50X21hcmtlciwyKTsKLQotICAgICAgICAvKiBUcnkgdG8gcmVhZCB1bnRpbCB0aGUgU09UIGlzIGRldGVjdGVkICovCi0gICAgICAgIHdoaWxlIChsX2N1cnJlbnRfbWFya2VyICE9IEoyS19NU19TT1QpIHsKLQotICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSBjdXJyZW50IG1hcmtlciBJRCBpcyB2YWxpZCAqLwotICAgICAgICAgICAgICAgIGlmIChsX2N1cnJlbnRfbWFya2VyIDwgMHhmZjAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQSBtYXJrZXIgSUQgd2FzIGV4cGVjdGVkICgweGZmLS0pIGluc3RlYWQgb2YgJS44eFxuIiwgbF9jdXJyZW50X21hcmtlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbWFya2VyIGhhbmRsZXIgZnJvbSB0aGUgbWFya2VyIElEICovCi0gICAgICAgICAgICAgICAgbF9tYXJrZXJfaGFuZGxlciA9IG9wal9qMmtfZ2V0X21hcmtlcl9oYW5kbGVyKGxfY3VycmVudF9tYXJrZXIpOwotCi0gICAgICAgICAgICAgICAgLyogTWFuYWdlIGNhc2Ugd2hlcmUgbWFya2VyIGlzIHVua25vd24gKi8KLSAgICAgICAgICAgICAgICBpZiAobF9tYXJrZXJfaGFuZGxlci0+aWQgPT0gSjJLX01TX1VOSykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgb3BqX2oya19yZWFkX3VuayhwX2oyaywgcF9zdHJlYW0sICZsX2N1cnJlbnRfbWFya2VyLCBwX21hbmFnZXIpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlVua25vdyBtYXJrZXIgaGF2ZSBiZWVuIGRldGVjdGVkIGFuZCBnZW5lcmF0ZWQgZXJyb3IuXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfY3VycmVudF9tYXJrZXIgPT0gSjJLX01TX1NPVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8qIFNPVCBtYXJrZXIgaXMgZGV0ZWN0ZWQgbWFpbiBoZWFkZXIgaXMgY29tcGxldGVseSByZWFkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlICAgIC8qIEdldCB0aGUgbWFya2VyIGhhbmRsZXIgZnJvbSB0aGUgbWFya2VyIElEICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfbWFya2VyX2hhbmRsZXIgPSBvcGpfajJrX2dldF9tYXJrZXJfaGFuZGxlcihsX2N1cnJlbnRfbWFya2VyKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobF9tYXJrZXJfaGFuZGxlci0+aWQgPT0gSjJLX01TX1NJWikgewotICAgICAgICAgICAgICAgICAgICAvKiBNYXJrIHJlcXVpcmVkIFNJWiBtYXJrZXIgYXMgZm91bmQgKi8KLSAgICAgICAgICAgICAgICAgICAgbF9oYXNfc2l6ID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxfbWFya2VyX2hhbmRsZXItPmlkID09IEoyS19NU19DT0QpIHsKLSAgICAgICAgICAgICAgICAgICAgLyogTWFyayByZXF1aXJlZCBDT0QgbWFya2VyIGFzIGZvdW5kICovCi0gICAgICAgICAgICAgICAgICAgIGxfaGFzX2NvZCA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChsX21hcmtlcl9oYW5kbGVyLT5pZCA9PSBKMktfTVNfUUNEKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIE1hcmsgcmVxdWlyZWQgUUNEIG1hcmtlciBhcyBmb3VuZCAqLwotICAgICAgICAgICAgICAgICAgICBsX2hhc19xY2QgPSAxOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSBtYXJrZXIgaXMga25vd24gYW5kIGlmIGl0IGlzIHRoZSByaWdodCBwbGFjZSB0byBmaW5kIGl0ICovCi0gICAgICAgICAgICAgICAgaWYgKCEgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlICYgbF9tYXJrZXJfaGFuZGxlci0+c3RhdGVzKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJNYXJrZXIgaXMgbm90IGNvbXBsaWFudCB3aXRoIGl0cyBwb3NpdGlvblxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIFRyeSB0byByZWFkIDIgYnl0ZXMgKHRoZSBtYXJrZXIgc2l6ZSkgZnJvbSBzdHJlYW0gYW5kIGNvcHkgdGhlbSBpbnRvIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBpZiAob3BqX3N0cmVhbV9yZWFkX2RhdGEocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsMixwX21hbmFnZXIpICE9IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJTdHJlYW0gdG9vIHNob3J0XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogcmVhZCAyIGJ5dGVzIGFzIHRoZSBtYXJrZXIgc2l6ZSAqLwotICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLCZsX21hcmtlcl9zaXplLDIpOwotICAgICAgICAgICAgICAgIGxfbWFya2VyX3NpemUgLT0gMjsgLyogU3VidHJhY3QgdGhlIHNpemUgb2YgdGhlIG1hcmtlciBJRCBhbHJlYWR5IHJlYWQgKi8KLQotICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSBtYXJrZXIgc2l6ZSBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGhlYWRlciBkYXRhIHNpemUgKi8KLSAgICAgICAgICAgICAgICBpZiAobF9tYXJrZXJfc2l6ZSA+IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhX3NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpuZXdfaGVhZGVyX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsIGxfbWFya2VyX3NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmV3X2hlYWRlcl9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YV9zaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgaGVhZGVyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhID0gbmV3X2hlYWRlcl9kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGFfc2l6ZSA9IGxfbWFya2VyX3NpemU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogVHJ5IHRvIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIG1hcmtlciBzZWdtZW50IGZyb20gc3RyZWFtIGFuZCBjb3B5IHRoZW0gaW50byB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgaWYgKG9wal9zdHJlYW1fcmVhZF9kYXRhKHBfc3RyZWFtLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLGxfbWFya2VyX3NpemUscF9tYW5hZ2VyKSAhPSBsX21hcmtlcl9zaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIHRvbyBzaG9ydFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIFJlYWQgdGhlIG1hcmtlciBzZWdtZW50IHdpdGggdGhlIGNvcnJlY3QgbWFya2VyIGhhbmRsZXIgKi8KLSAgICAgICAgICAgICAgICBpZiAoISAoKihsX21hcmtlcl9oYW5kbGVyLT5oYW5kbGVyKSkocF9qMmsscF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsbF9tYXJrZXJfc2l6ZSxwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTWFya2VyIGhhbmRsZXIgZnVuY3Rpb24gZmFpbGVkIHRvIHJlYWQgdGhlIG1hcmtlciBzZWdtZW50XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQWRkIHRoZSBtYXJrZXIgdG8gdGhlIGNvZGVzdHJlYW0gaW5kZXgqLwotICAgICAgICAgICAgICAgIGlmIChPUEpfRkFMU0UgPT0gb3BqX2oya19hZGRfbWhtYXJrZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9tYXJrZXJfaGFuZGxlci0+aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9VSU5UMzIpIG9wal9zdHJlYW1fdGVsbChwX3N0cmVhbSkgLSBsX21hcmtlcl9zaXplIC0gNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX21hcmtlcl9zaXplICsgNCApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWRkIG1oIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIFRyeSB0byByZWFkIDIgYnl0ZXMgKHRoZSBuZXh0IG1hcmtlciBJRCkgZnJvbSBzdHJlYW0gYW5kIGNvcHkgdGhlbSBpbnRvIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBpZiAob3BqX3N0cmVhbV9yZWFkX2RhdGEocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsMixwX21hbmFnZXIpICE9IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJTdHJlYW0gdG9vIHNob3J0XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogcmVhZCAyIGJ5dGVzIGFzIHRoZSBuZXcgbWFya2VyIElEICovCi0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsJmxfY3VycmVudF9tYXJrZXIsMik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobF9oYXNfc2l6ID09IDApIHsKLSAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJyZXF1aXJlZCBTSVogbWFya2VyIG5vdCBmb3VuZCBpbiBtYWluIGhlYWRlclxuIik7Ci0gICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsX2hhc19jb2QgPT0gMCkgewotICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgInJlcXVpcmVkIENPRCBtYXJrZXIgbm90IGZvdW5kIGluIG1haW4gaGVhZGVyXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxfaGFzX3FjZCA9PSAwKSB7Ci0gICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAicmVxdWlyZWQgUUNEIG1hcmtlciBub3QgZm91bmQgaW4gbWFpbiBoZWFkZXJcbiIpOwotICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfSU5GTywgIk1haW4gaGVhZGVyIGhhcyBiZWVuIGNvcnJlY3RseSBkZWNvZGVkLlxuIik7Ci0KLSAgICAgICAgLyogUG9zaXRpb24gb2YgdGhlIGxhc3QgZWxlbWVudCBpZiB0aGUgbWFpbiBoZWFkZXIgKi8KLSAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPm1haW5faGVhZF9lbmQgPSAoT1BKX1VJTlQzMikgb3BqX3N0cmVhbV90ZWxsKHBfc3RyZWFtKSAtIDI7Ci0KLSAgICAgICAgLyogTmV4dCBzdGVwOiByZWFkIGEgdGlsZS1wYXJ0IGhlYWRlciAqLwotICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9IEoyS19TVEFURV9UUEhTT1Q7Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi1PUEpfQk9PTCBvcGpfajJrX2V4ZWMgKCBvcGpfajJrX3QgKiBwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcHJvY2VkdXJlX2xpc3RfdCAqIHBfcHJvY2VkdXJlX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCi17Ci0gICAgICAgIE9QSl9CT09MICgqKiBsX3Byb2NlZHVyZSkgKG9wal9qMmtfdCAqICxvcGpfc3RyZWFtX3ByaXZhdGVfdCAqLG9wal9ldmVudF9tZ3JfdCAqKSA9IDAwOwotICAgICAgICBPUEpfQk9PTCBsX3Jlc3VsdCA9IE9QSl9UUlVFOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfcHJvYywgaTsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zKi8KLSAgICAgICAgYXNzZXJ0KHBfcHJvY2VkdXJlX2xpc3QgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLQotICAgICAgICBsX25iX3Byb2MgPSBvcGpfcHJvY2VkdXJlX2xpc3RfZ2V0X25iX3Byb2NlZHVyZXMocF9wcm9jZWR1cmVfbGlzdCk7Ci0gICAgICAgIGxfcHJvY2VkdXJlID0gKE9QSl9CT09MICgqKikgKG9wal9qMmtfdCAqICxvcGpfc3RyZWFtX3ByaXZhdGVfdCAqLG9wal9ldmVudF9tZ3JfdCAqKSkgb3BqX3Byb2NlZHVyZV9saXN0X2dldF9maXJzdF9wcm9jZWR1cmUocF9wcm9jZWR1cmVfbGlzdCk7Ci0KLSAgICAgICAgZm9yICAgICAoaT0wO2k8bF9uYl9wcm9jOysraSkgewotICAgICAgICAgICAgICAgIGxfcmVzdWx0ID0gbF9yZXN1bHQgJiYgKCgqbF9wcm9jZWR1cmUpIChwX2oyayxwX3N0cmVhbSxwX21hbmFnZXIpKTsKLSAgICAgICAgICAgICAgICArK2xfcHJvY2VkdXJlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogYW5kIGNsZWFyIHRoZSBwcm9jZWR1cmUgbGlzdCBhdCB0aGUgZW5kLiovCi0gICAgICAgIG9wal9wcm9jZWR1cmVfbGlzdF9jbGVhcihwX3Byb2NlZHVyZV9saXN0KTsKLSAgICAgICAgcmV0dXJuIGxfcmVzdWx0OwotfQotCi0vKiBGSVhNRSBET0MqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfY29weV9kZWZhdWx0X3RjcF9hbmRfY3JlYXRlX3RjZCAoICAgICAgIG9wal9qMmtfdCAqIHBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgICAgIG9wal90Y3BfdCAqIGxfdGNwID0gMDA7Ci0gICAgICAgIG9wal90Y3BfdCAqIGxfZGVmYXVsdF90Y3AgPSAwMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX3RpbGVzOwotICAgICAgICBPUEpfVUlOVDMyIGksajsKLSAgICAgICAgb3BqX3RjY3BfdCAqbF9jdXJyZW50X3RjY3AgPSAwMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3RjY3Bfc2l6ZTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX21jdF9zaXplOwotICAgICAgICBvcGpfaW1hZ2VfdCAqIGxfaW1hZ2U7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9tY2NfcmVjb3Jkc19zaXplLGxfbWN0X3JlY29yZHNfc2l6ZTsKLSAgICAgICAgb3BqX21jdF9kYXRhX3QgKiBsX3NyY19tY3RfcmVjLCAqbF9kZXN0X21jdF9yZWM7Ci0gICAgICAgIG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90ICogbF9zcmNfbWNjX3JlYywgKmxfZGVzdF9tY2NfcmVjOwotICAgICAgICBPUEpfVUlOVDMyIGxfb2Zmc2V0OwotCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0KLSAgICAgICAgbF9pbWFnZSA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2U7Ci0gICAgICAgIGxfbmJfdGlsZXMgPSBwX2oyay0+bV9jcC50aCAqIHBfajJrLT5tX2NwLnR3OwotICAgICAgICBsX3RjcCA9IHBfajJrLT5tX2NwLnRjcHM7Ci0gICAgICAgIGxfdGNjcF9zaXplID0gbF9pbWFnZS0+bnVtY29tcHMgKiAoT1BKX1VJTlQzMilzaXplb2Yob3BqX3RjY3BfdCk7Ci0gICAgICAgIGxfZGVmYXVsdF90Y3AgPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcDsKLSAgICAgICAgbF9tY3Rfc2l6ZSA9IGxfaW1hZ2UtPm51bWNvbXBzICogbF9pbWFnZS0+bnVtY29tcHMgKiAoT1BKX1VJTlQzMilzaXplb2YoT1BKX0ZMT0FUMzIpOwotCi0gICAgICAgIC8qIEZvciBlYWNoIHRpbGUgKi8KLSAgICAgICAgZm9yIChpPTA7IGk8bF9uYl90aWxlczsgKytpKSB7Ci0gICAgICAgICAgICAgICAgLyoga2VlcCB0aGUgdGlsZS1jb21wbyBjb2RpbmcgcGFyYW1ldGVycyBwb2ludGVyIG9mIHRoZSBjdXJyZW50IHRpbGUgY29kaW5nIHBhcmFtZXRlcnMqLwotICAgICAgICAgICAgICAgIGxfY3VycmVudF90Y2NwID0gbF90Y3AtPnRjY3BzOwotICAgICAgICAgICAgICAgIC8qQ29weSBkZWZhdWx0IGNvZGluZyBwYXJhbWV0ZXJzIGludG8gdGhlIGN1cnJlbnQgdGlsZSBjb2RpbmcgcGFyYW1ldGVycyovCi0gICAgICAgICAgICAgICAgbWVtY3B5KGxfdGNwLCBsX2RlZmF1bHRfdGNwLCBzaXplb2Yob3BqX3RjcF90KSk7Ci0gICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBzb21lIHZhbHVlcyBvZiB0aGUgY3VycmVudCB0aWxlIGNvZGluZyBwYXJhbWV0ZXJzKi8KLSAgICAgICAgICAgICAgICBsX3RjcC0+Y29kID0gMDsKLSAgICAgICAgICAgICAgICBsX3RjcC0+cHB0ID0gMDsKLSAgICAgICAgICAgICAgICBsX3RjcC0+cHB0X2RhdGEgPSAwMDsKLSAgICAgICAgICAgICAgICAvKiBSZW1vdmUgbWVtb3J5IG5vdCBvd25lZCBieSB0aGlzIHRpbGUgaW4gY2FzZSBvZiBlYXJseSBlcnJvciByZXR1cm4uICovCi0gICAgICAgICAgICAgICAgbF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCA9IDAwOwotICAgICAgICAgICAgICAgIGxfdGNwLT5tX25iX21heF9tY3RfcmVjb3JkcyA9IDA7Ci0gICAgICAgICAgICAgICAgbF90Y3AtPm1fbWN0X3JlY29yZHMgPSAwMDsKLSAgICAgICAgICAgICAgICBsX3RjcC0+bV9uYl9tYXhfbWNjX3JlY29yZHMgPSAwOwotICAgICAgICAgICAgICAgIGxfdGNwLT5tX21jY19yZWNvcmRzID0gMDA7Ci0gICAgICAgICAgICAgICAgLyogUmVjb25uZWN0IHRoZSB0aWxlLWNvbXBvIGNvZGluZyBwYXJhbWV0ZXJzIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgdGlsZSBjb2RpbmcgcGFyYW1ldGVycyovCi0gICAgICAgICAgICAgICAgbF90Y3AtPnRjY3BzID0gbF9jdXJyZW50X3RjY3A7Ci0KLSAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG1jdF9kZWNvZGluZ19tYXRyaXggb2YgdGhlIGRmbHRfdGlsZV9jcCBhbmQgY29weSB0aGVtIGludG8gdGhlIGN1cnJlbnQgdGlsZSBjcCovCi0gICAgICAgICAgICAgICAgaWYgKGxfZGVmYXVsdF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCA9IChPUEpfRkxPQVQzMiopb3BqX21hbGxvYyhsX21jdF9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIGxfdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXggKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkobF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCxsX2RlZmF1bHRfdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgsbF9tY3Rfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogR2V0IHRoZSBtY3RfcmVjb3JkIG9mIHRoZSBkZmx0X3RpbGVfY3AgYW5kIGNvcHkgdGhlbSBpbnRvIHRoZSBjdXJyZW50IHRpbGUgY3AqLwotICAgICAgICAgICAgICAgIGxfbWN0X3JlY29yZHNfc2l6ZSA9IGxfZGVmYXVsdF90Y3AtPm1fbmJfbWF4X21jdF9yZWNvcmRzICogKE9QSl9VSU5UMzIpc2l6ZW9mKG9wal9tY3RfZGF0YV90KTsKLSAgICAgICAgICAgICAgICBsX3RjcC0+bV9tY3RfcmVjb3JkcyA9IChvcGpfbWN0X2RhdGFfdCopb3BqX21hbGxvYyhsX21jdF9yZWNvcmRzX3NpemUpOwotICAgICAgICAgICAgICAgIGlmICghIGxfdGNwLT5tX21jdF9yZWNvcmRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHkobF90Y3AtPm1fbWN0X3JlY29yZHMsIGxfZGVmYXVsdF90Y3AtPm1fbWN0X3JlY29yZHMsbF9tY3RfcmVjb3Jkc19zaXplKTsKLQotICAgICAgICAgICAgICAgIC8qIENvcHkgdGhlIG1jdCByZWNvcmQgZGF0YSBmcm9tIGRmbHRfdGlsZV9jcCB0byB0aGUgY3VycmVudCB0aWxlKi8KLSAgICAgICAgICAgICAgICBsX3NyY19tY3RfcmVjID0gbF9kZWZhdWx0X3RjcC0+bV9tY3RfcmVjb3JkczsKLSAgICAgICAgICAgICAgICBsX2Rlc3RfbWN0X3JlYyA9IGxfdGNwLT5tX21jdF9yZWNvcmRzOwotCi0gICAgICAgICAgICAgICAgZm9yIChqPTA7ajxsX2RlZmF1bHRfdGNwLT5tX25iX21jdF9yZWNvcmRzOysraikgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9zcmNfbWN0X3JlYy0+bV9kYXRhKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9kZXN0X21jdF9yZWMtPm1fZGF0YSA9IChPUEpfQllURSopIG9wal9tYWxsb2MobF9zcmNfbWN0X3JlYy0+bV9kYXRhX3NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighIGxfZGVzdF9tY3RfcmVjLT5tX2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShsX2Rlc3RfbWN0X3JlYy0+bV9kYXRhLGxfc3JjX21jdF9yZWMtPm1fZGF0YSxsX3NyY19tY3RfcmVjLT5tX2RhdGFfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICsrbF9zcmNfbWN0X3JlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICsrbF9kZXN0X21jdF9yZWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgd2l0aCBlYWNoIHBhc3MgdG8gZnJlZSBleGFjdGx5IHdoYXQgaGFzIGJlZW4gYWxsb2NhdGVkIG9uIGVhcmx5IHJldHVybi4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNwLT5tX25iX21heF9tY3RfcmVjb3JkcyArPSAxOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbWNjX3JlY29yZCBvZiB0aGUgZGZsdF90aWxlX2NwIGFuZCBjb3B5IHRoZW0gaW50byB0aGUgY3VycmVudCB0aWxlIGNwKi8KLSAgICAgICAgICAgICAgICBsX21jY19yZWNvcmRzX3NpemUgPSBsX2RlZmF1bHRfdGNwLT5tX25iX21heF9tY2NfcmVjb3JkcyAqIChPUEpfVUlOVDMyKXNpemVvZihvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCk7Ci0gICAgICAgICAgICAgICAgbF90Y3AtPm1fbWNjX3JlY29yZHMgPSAob3BqX3NpbXBsZV9tY2NfZGVjb3JyZWxhdGlvbl9kYXRhX3QqKSBvcGpfbWFsbG9jKGxfbWNjX3JlY29yZHNfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCEgbF90Y3AtPm1fbWNjX3JlY29yZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweShsX3RjcC0+bV9tY2NfcmVjb3JkcyxsX2RlZmF1bHRfdGNwLT5tX21jY19yZWNvcmRzLGxfbWNjX3JlY29yZHNfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgbF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzID0gbF9kZWZhdWx0X3RjcC0+bV9uYl9tYXhfbWNjX3JlY29yZHM7Ci0KLSAgICAgICAgICAgICAgICAvKiBDb3B5IHRoZSBtY2MgcmVjb3JkIGRhdGEgZnJvbSBkZmx0X3RpbGVfY3AgdG8gdGhlIGN1cnJlbnQgdGlsZSovCi0gICAgICAgICAgICAgICAgbF9zcmNfbWNjX3JlYyA9IGxfZGVmYXVsdF90Y3AtPm1fbWNjX3JlY29yZHM7Ci0gICAgICAgICAgICAgICAgbF9kZXN0X21jY19yZWMgPSBsX3RjcC0+bV9tY2NfcmVjb3JkczsKLQotICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9kZWZhdWx0X3RjcC0+bV9uYl9tYXhfbWNjX3JlY29yZHM7KytqKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX3NyY19tY2NfcmVjLT5tX2RlY29ycmVsYXRpb25fYXJyYXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9vZmZzZXQgPSAoT1BKX1VJTlQzMikobF9zcmNfbWNjX3JlYy0+bV9kZWNvcnJlbGF0aW9uX2FycmF5IC0gbF9kZWZhdWx0X3RjcC0+bV9tY3RfcmVjb3Jkcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZGVzdF9tY2NfcmVjLT5tX2RlY29ycmVsYXRpb25fYXJyYXkgPSBsX3RjcC0+bV9tY3RfcmVjb3JkcyArIGxfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9zcmNfbWNjX3JlYy0+bV9vZmZzZXRfYXJyYXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9vZmZzZXQgPSAoT1BKX1VJTlQzMikobF9zcmNfbWNjX3JlYy0+bV9vZmZzZXRfYXJyYXkgLSBsX2RlZmF1bHRfdGNwLT5tX21jdF9yZWNvcmRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9kZXN0X21jY19yZWMtPm1fb2Zmc2V0X2FycmF5ID0gbF90Y3AtPm1fbWN0X3JlY29yZHMgKyBsX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgKytsX3NyY19tY2NfcmVjOwotICAgICAgICAgICAgICAgICAgICAgICAgKytsX2Rlc3RfbWNjX3JlYzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBDb3B5IGFsbCB0aGUgZGZsdF90aWxlX2NvbXBvX2NwIHRvIHRoZSBjdXJyZW50IHRpbGUgY3AgKi8KLSAgICAgICAgICAgICAgICBtZW1jcHkobF9jdXJyZW50X3RjY3AsbF9kZWZhdWx0X3RjcC0+dGNjcHMsbF90Y2NwX3NpemUpOwotCi0gICAgICAgICAgICAgICAgLyogTW92ZSB0byBuZXh0IHRpbGUgY3AqLwotICAgICAgICAgICAgICAgICsrbF90Y3A7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDcmVhdGUgdGhlIGN1cnJlbnQgdGlsZSBkZWNvZGVyKi8KLSAgICAgICAgcF9qMmstPm1fdGNkID0gKG9wal90Y2RfdCopb3BqX3RjZF9jcmVhdGUoT1BKX1RSVUUpOyAvKiBGSVhNRSB3aHkgYSBjYXN0ID8gKi8KLSAgICAgICAgaWYgKCEgcF9qMmstPm1fdGNkICkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoICFvcGpfdGNkX2luaXQocF9qMmstPm1fdGNkLCBsX2ltYWdlLCAmKHBfajJrLT5tX2NwKSkgKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3RjZF9kZXN0cm95KHBfajJrLT5tX3RjZCk7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fdGNkID0gMDA7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkNhbm5vdCBkZWNvZGUgdGlsZSwgbWVtb3J5IGVycm9yXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi1jb25zdCBvcGpfZGVjX21lbW9yeV9tYXJrZXJfaGFuZGxlcl90ICogb3BqX2oya19nZXRfbWFya2VyX2hhbmRsZXIgKE9QSl9VSU5UMzIgcF9pZCkKLXsKLSAgICAgICAgY29uc3Qgb3BqX2RlY19tZW1vcnlfbWFya2VyX2hhbmRsZXJfdCAqZTsKLSAgICAgICAgZm9yIChlID0gajJrX21lbW9yeV9tYXJrZXJfaGFuZGxlcl90YWI7IGUtPmlkICE9IDA7ICsrZSkgewotICAgICAgICAgICAgICAgIGlmIChlLT5pZCA9PSBwX2lkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLyogd2UgZmluZCBhIGhhbmRsZXIgY29ycmVzcG9uZGluZyB0byB0aGUgbWFya2VyIElEKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGU7Ci19Ci0KLXZvaWQgb3BqX2oya19kZXN0cm95IChvcGpfajJrX3QgKnBfajJrKQotewotICAgICAgICBpZiAocF9qMmsgPT0gMDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocF9qMmstPm1faXNfZGVjb2RlcikgewotCi0gICAgICAgICAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwICE9IDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfajJrX3RjcF9kZXN0cm95KHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwID0gMDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhICE9IDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSA9IDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGFfc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotCi0gICAgICAgICAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2VuY29kZWRfdGlsZV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfZGF0YSA9IDAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90bG1fc290X29mZnNldHNfYnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90bG1fc290X29mZnNldHNfYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zb3Rfb2Zmc2V0c19idWZmZXIgPSAwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zb3Rfb2Zmc2V0c19jdXJyZW50ID0gMDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBvcGpfdGNkX2Rlc3Ryb3kocF9qMmstPm1fdGNkKTsKLQotICAgICAgICBvcGpfajJrX2NwX2Rlc3Ryb3koJihwX2oyay0+bV9jcCkpOwotICAgICAgICBtZW1zZXQoJihwX2oyay0+bV9jcCksMCxzaXplb2Yob3BqX2NwX3QpKTsKLQotICAgICAgICBvcGpfcHJvY2VkdXJlX2xpc3RfZGVzdHJveShwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCk7Ci0gICAgICAgIHBfajJrLT5tX3Byb2NlZHVyZV9saXN0ID0gMDA7Ci0KLSAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X2Rlc3Ryb3kocF9qMmstPm1fdmFsaWRhdGlvbl9saXN0KTsKLSAgICAgICAgcF9qMmstPm1fcHJvY2VkdXJlX2xpc3QgPSAwMDsKLQotICAgICAgICBqMmtfZGVzdHJveV9jc3RyX2luZGV4KHBfajJrLT5jc3RyX2luZGV4KTsKLSAgICAgICAgcF9qMmstPmNzdHJfaW5kZXggPSBOVUxMOwotCi0gICAgICAgIG9wal9pbWFnZV9kZXN0cm95KHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UpOwotICAgICAgICBwX2oyay0+bV9wcml2YXRlX2ltYWdlID0gTlVMTDsKLQotICAgICAgICBvcGpfaW1hZ2VfZGVzdHJveShwX2oyay0+bV9vdXRwdXRfaW1hZ2UpOwotICAgICAgICBwX2oyay0+bV9vdXRwdXRfaW1hZ2UgPSBOVUxMOwotCi0gICAgICAgIG9wal9mcmVlKHBfajJrKTsKLX0KLQotdm9pZCBqMmtfZGVzdHJveV9jc3RyX2luZGV4IChvcGpfY29kZXN0cmVhbV9pbmRleF90ICpwX2NzdHJfaW5kKQotewotICAgICAgICBpZiAocF9jc3RyX2luZCkgewotCi0gICAgICAgICAgICAgICAgaWYgKHBfY3N0cl9pbmQtPm1hcmtlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9jc3RyX2luZC0+bWFya2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmQtPm1hcmtlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHBfY3N0cl9pbmQtPnRpbGVfaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgaXRfdGlsZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaXRfdGlsZT0wOyBpdF90aWxlIDwgcF9jc3RyX2luZC0+bmJfb2ZfdGlsZXM7IGl0X3RpbGUrKykgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBfY3N0cl9pbmQtPnRpbGVfaW5kZXhbaXRfdGlsZV0ucGFja2V0X2luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9jc3RyX2luZC0+dGlsZV9pbmRleFtpdF90aWxlXS5wYWNrZXRfaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmQtPnRpbGVfaW5kZXhbaXRfdGlsZV0ucGFja2V0X2luZGV4ID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBfY3N0cl9pbmQtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfY3N0cl9pbmQtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmQtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXggPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocF9jc3RyX2luZC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrZXIpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfY3N0cl9pbmQtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NzdHJfaW5kLT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZSggcF9jc3RyX2luZC0+dGlsZV9pbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2NzdHJfaW5kLT50aWxlX2luZGV4ID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2NzdHJfaW5kKTsKLSAgICAgICAgfQotfQotCi12b2lkIG9wal9qMmtfdGNwX2Rlc3Ryb3kgKG9wal90Y3BfdCAqcF90Y3ApCi17Ci0gICAgICAgIGlmIChwX3RjcCA9PSAwMCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwX3RjcC0+cHB0X2J1ZmZlciAhPSAwMCkgewotICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfdGNwLT5wcHRfYnVmZmVyKTsKLSAgICAgICAgICAgICAgICBwX3RjcC0+cHB0X2J1ZmZlciA9IDAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBfdGNwLT50Y2NwcyAhPSAwMCkgewotICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfdGNwLT50Y2Nwcyk7Ci0gICAgICAgICAgICAgICAgcF90Y3AtPnRjY3BzID0gMDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocF90Y3AtPm1fbWN0X2NvZGluZ19tYXRyaXggIT0gMDApIHsKLSAgICAgICAgICAgICAgICBvcGpfZnJlZShwX3RjcC0+bV9tY3RfY29kaW5nX21hdHJpeCk7Ci0gICAgICAgICAgICAgICAgcF90Y3AtPm1fbWN0X2NvZGluZ19tYXRyaXggPSAwMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwX3RjcC0+bV9tY3RfZGVjb2RpbmdfbWF0cml4ICE9IDAwKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2ZyZWUocF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCk7Ci0gICAgICAgICAgICAgICAgcF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCA9IDAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBfdGNwLT5tX21jY19yZWNvcmRzKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2ZyZWUocF90Y3AtPm1fbWNjX3JlY29yZHMpOwotICAgICAgICAgICAgICAgIHBfdGNwLT5tX21jY19yZWNvcmRzID0gMDA7Ci0gICAgICAgICAgICAgICAgcF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzID0gMDsKLSAgICAgICAgICAgICAgICBwX3RjcC0+bV9uYl9tY2NfcmVjb3JkcyA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocF90Y3AtPm1fbWN0X3JlY29yZHMpIHsKLSAgICAgICAgICAgICAgICBvcGpfbWN0X2RhdGFfdCAqIGxfbWN0X2RhdGEgPSBwX3RjcC0+bV9tY3RfcmVjb3JkczsKLSAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGk9MDtpPHBfdGNwLT5tX25iX21jdF9yZWNvcmRzOysraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfbWN0X2RhdGEtPm1fZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX21jdF9kYXRhLT5tX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX21jdF9kYXRhLT5tX2RhdGEgPSAwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgKytsX21jdF9kYXRhOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfdGNwLT5tX21jdF9yZWNvcmRzKTsKLSAgICAgICAgICAgICAgICBwX3RjcC0+bV9tY3RfcmVjb3JkcyA9IDAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBfdGNwLT5tY3Rfbm9ybXMgIT0gMDApIHsKLSAgICAgICAgICAgICAgICBvcGpfZnJlZShwX3RjcC0+bWN0X25vcm1zKTsKLSAgICAgICAgICAgICAgICBwX3RjcC0+bWN0X25vcm1zID0gMDA7Ci0gICAgICAgIH0KLQotICAgICAgICBvcGpfajJrX3RjcF9kYXRhX2Rlc3Ryb3kocF90Y3ApOwotCi19Ci0KLXZvaWQgb3BqX2oya190Y3BfZGF0YV9kZXN0cm95IChvcGpfdGNwX3QgKnBfdGNwKQotewotICAgICAgICBpZiAocF90Y3AtPm1fZGF0YSkgewotICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfdGNwLT5tX2RhdGEpOwotICAgICAgICAgICAgICAgIHBfdGNwLT5tX2RhdGEgPSBOVUxMOwotICAgICAgICAgICAgICAgIHBfdGNwLT5tX2RhdGFfc2l6ZSA9IDA7Ci0gICAgICAgIH0KLX0KLQotdm9pZCBvcGpfajJrX2NwX2Rlc3Ryb3kgKG9wal9jcF90ICpwX2NwKQotewotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfdGlsZXM7Ci0gICAgICAgIG9wal90Y3BfdCAqIGxfY3VycmVudF90aWxlID0gMDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLQotICAgICAgICBpZiAocF9jcCA9PSAwMCkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAocF9jcC0+dGNwcyAhPSAwMCkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIGxfY3VycmVudF90aWxlID0gcF9jcC0+dGNwczsKLSAgICAgICAgICAgICAgICBsX25iX3RpbGVzID0gcF9jcC0+dGggKiBwX2NwLT50dzsKLQotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsX25iX3RpbGVzOyArK2kpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2oya190Y3BfZGVzdHJveShsX2N1cnJlbnRfdGlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICArK2xfY3VycmVudF90aWxlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2NwLT50Y3BzKTsKLSAgICAgICAgICAgICAgICBwX2NwLT50Y3BzID0gMDA7Ci0gICAgICAgIH0KLSAgICAgICAgb3BqX2ZyZWUocF9jcC0+cHBtX2J1ZmZlcik7Ci0gICAgICAgIHBfY3AtPnBwbV9idWZmZXIgPSAwMDsKLSAgICAgICAgcF9jcC0+cHBtX2RhdGEgPSBOVUxMOyAvKiBwcG1fZGF0YSBiZWxvbmdzIHRvIHRoZSBhbGxvY2F0ZWQgYnVmZmVyIHBvaW50ZWQgYnkgcHBtX2J1ZmZlciAqLwotICAgICAgICBvcGpfZnJlZShwX2NwLT5jb21tZW50KTsKLSAgICAgICAgcF9jcC0+Y29tbWVudCA9IDAwOwotICAgICAgICBpZiAoISBwX2NwLT5tX2lzX2RlY29kZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2NwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fbWF0cmljZSk7Ci0gICAgICAgICAgICAgICAgcF9jcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX21hdHJpY2UgPSAwMDsKLSAgICAgICAgfQotfQotCi1PUEpfQk9PTCBvcGpfajJrX3JlYWRfdGlsZV9oZWFkZXIoICAgICAgb3BqX2oya190ICogcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX3RpbGVfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90aWxlX3gwLCBPUEpfSU5UMzIgKiBwX3RpbGVfeTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV94MSwgT1BKX0lOVDMyICogcF90aWxlX3kxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9uYl9jb21wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JPT0wgKiBwX2dvX29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9jdXJyZW50X21hcmtlciA9IEoyS19NU19TT1Q7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9tYXJrZXJfc2l6ZTsKLSAgICAgICAgY29uc3Qgb3BqX2RlY19tZW1vcnlfbWFya2VyX2hhbmRsZXJfdCAqIGxfbWFya2VyX2hhbmRsZXIgPSAwMDsKLSAgICAgICAgb3BqX3RjcF90ICogbF90Y3AgPSBOVUxMOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfdGlsZXM7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLQotICAgICAgICAvKiBSZWFjaCB0aGUgRW5kIE9mIENvZGVzdHJlYW0gPyovCi0gICAgICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9PSBKMktfU1RBVEVfRU9DKXsKLSAgICAgICAgICAgICAgICBsX2N1cnJlbnRfbWFya2VyID0gSjJLX01TX0VPQzsKLSAgICAgICAgfQotICAgICAgICAvKiBXZSBuZWVkIHRvIGVuY291bnRlciBhIFNPVCBtYXJrZXIgKGEgbmV3IHRpbGUtcGFydCBoZWFkZXIpICovCi0gICAgICAgIGVsc2UgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlICE9IEoyS19TVEFURV9UUEhTT1QpewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBSZWFkIGludG8gdGhlIGNvZGVzdHJlYW0gdW50aWwgcmVhY2ggdGhlIEVPQyBvciAhIGNhbl9kZWNvZGUgPz8/IEZJWE1FICovCi0gICAgICAgIHdoaWxlICggKCFwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9jYW5fZGVjb2RlKSAmJiAobF9jdXJyZW50X21hcmtlciAhPSBKMktfTVNfRU9DKSApIHsKLQotICAgICAgICAgICAgICAgIC8qIFRyeSB0byByZWFkIHVudGlsIHRoZSBTdGFydCBPZiBEYXRhIGlzIGRldGVjdGVkICovCi0gICAgICAgICAgICAgICAgd2hpbGUgKGxfY3VycmVudF9tYXJrZXIgIT0gSjJLX01TX1NPRCkgewotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYob3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdChwX3N0cmVhbSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPSBKMktfU1RBVEVfTkVPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyeSB0byByZWFkIDIgYnl0ZXMgKHRoZSBtYXJrZXIgc2l6ZSkgZnJvbSBzdHJlYW0gYW5kIGNvcHkgdGhlbSBpbnRvIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGpfc3RyZWFtX3JlYWRfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSwyLHBfbWFuYWdlcikgIT0gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIHRvbyBzaG9ydFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlYWQgMiBieXRlcyBmcm9tIHRoZSBidWZmZXIgYXMgdGhlIG1hcmtlciBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSwmbF9tYXJrZXJfc2l6ZSwyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgbWFya2VyIHNpemUgKGRvZXMgbm90IGluY2x1ZGUgbWFya2VyIElEIGJ1dCBpbmNsdWRlcyBtYXJrZXIgc2l6ZSkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX21hcmtlcl9zaXplIDwgMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSW5jb25zaXN0ZW50IG1hcmtlciBzaXplXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogY2YuIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3Avb3BlbmpwZWcvaXNzdWVzL2RldGFpbD9pZD0yMjYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2N1cnJlbnRfbWFya2VyID09IDB4ODA4MCAmJiBvcGpfc3RyZWFtX2dldF9udW1iZXJfYnl0ZV9sZWZ0KHBfc3RyZWFtKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID0gSjJLX1NUQVRFX05FT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBXaHkgdGhpcyBjb25kaXRpb24/IEZJWE1FICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgJiBKMktfU1RBVEVfVFBIKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc290X2xlbmd0aCAtPSAobF9tYXJrZXJfc2l6ZSArIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbF9tYXJrZXJfc2l6ZSAtPSAyOyAvKiBTdWJ0cmFjdCB0aGUgc2l6ZSBvZiB0aGUgbWFya2VyIElEIGFscmVhZHkgcmVhZCAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG1hcmtlciBoYW5kbGVyIGZyb20gdGhlIG1hcmtlciBJRCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbF9tYXJrZXJfaGFuZGxlciA9IG9wal9qMmtfZ2V0X21hcmtlcl9oYW5kbGVyKGxfY3VycmVudF9tYXJrZXIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgbWFya2VyIGlzIGtub3duIGFuZCBpZiBpdCBpcyB0aGUgcmlnaHQgcGxhY2UgdG8gZmluZCBpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlICYgbF9tYXJrZXJfaGFuZGxlci0+c3RhdGVzKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk1hcmtlciBpcyBub3QgY29tcGxpYW50IHdpdGggaXRzIHBvc2l0aW9uXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLS8qIEZJWE1FIG1hbmFnZSBjYXNlIG9mIHVua25vd24gbWFya2VyIGFzIGluIHRoZSBtYWluIGhlYWRlciA/ICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSBtYXJrZXIgc2l6ZSBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGhlYWRlciBkYXRhIHNpemUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX21hcmtlcl9zaXplID4gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGFfc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqbmV3X2hlYWRlcl9kYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgd2UgYXJlIGhlcmUsIHRoaXMgbWVhbnMgd2UgY29uc2lkZXIgdGhpcyBtYXJrZXIgYXMga25vd24gJiB3ZSB3aWxsIHJlYWQgaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgZW5vdWdoIGJ5dGVzIGxlZnQgaW4gc3RyZWFtIGJlZm9yZSBhbGxvY2F0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoT1BKX09GRl9UKWxfbWFya2VyX3NpemUgPiAgb3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdChwX3N0cmVhbSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTWFya2VyIHNpemUgaW5jb25zaXN0ZW50IHdpdGggc3RyZWFtIGxlbmd0aFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfaGVhZGVyX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsIGxfbWFya2VyX3NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBuZXdfaGVhZGVyX2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhX3NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIGhlYWRlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSA9IG5ld19oZWFkZXJfZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGFfc2l6ZSA9IGxfbWFya2VyX3NpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyeSB0byByZWFkIHRoZSByZXN0IG9mIHRoZSBtYXJrZXIgc2VnbWVudCBmcm9tIHN0cmVhbSBhbmQgY29weSB0aGVtIGludG8gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wal9zdHJlYW1fcmVhZF9kYXRhKHBfc3RyZWFtLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLGxfbWFya2VyX3NpemUscF9tYW5hZ2VyKSAhPSBsX21hcmtlcl9zaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJTdHJlYW0gdG9vIHNob3J0XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsX21hcmtlcl9oYW5kbGVyLT5oYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZSBpc3N1ZSAjMTc1ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3Qgc3VyZSBob3cgdGhhdCBoYXBwZW5lZC5cbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVhZCB0aGUgbWFya2VyIHNlZ21lbnQgd2l0aCB0aGUgY29ycmVjdCBtYXJrZXIgaGFuZGxlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgKCoobF9tYXJrZXJfaGFuZGxlci0+aGFuZGxlcikpKHBfajJrLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLGxfbWFya2VyX3NpemUscF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRmFpbCB0byByZWFkIHRoZSBjdXJyZW50IG1hcmtlciBzZWdtZW50ICglI3gpXG4iLCBsX2N1cnJlbnRfbWFya2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogQWRkIHRoZSBtYXJrZXIgdG8gdGhlIGNvZGVzdHJlYW0gaW5kZXgqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9QSl9GQUxTRSA9PSBvcGpfajJrX2FkZF90bG1hcmtlcihwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX21hcmtlcl9oYW5kbGVyLT5pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfVUlOVDMyKSBvcGpfc3RyZWFtX3RlbGwocF9zdHJlYW0pIC0gbF9tYXJrZXJfc2l6ZSAtIDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX21hcmtlcl9zaXplICsgNCApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhZGQgdGwgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogS2VlcCB0aGUgcG9zaXRpb24gb2YgdGhlIGxhc3QgU09UIG1hcmtlciByZWFkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGxfbWFya2VyX2hhbmRsZXItPmlkID09IEoyS19NU19TT1QgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgc290X3BvcyA9IChPUEpfVUlOVDMyKSBvcGpfc3RyZWFtX3RlbGwocF9zdHJlYW0pIC0gbF9tYXJrZXJfc2l6ZSAtIDQgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc290X3BvcyA+IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2xhc3Rfc290X3JlYWRfcG9zKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fbGFzdF9zb3RfcmVhZF9wb3MgPSBzb3RfcG9zOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9za2lwX2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2tpcCB0aGUgcmVzdCBvZiB0aGUgdGlsZSBwYXJ0IGhlYWRlciovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGpfc3RyZWFtX3NraXAocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc290X2xlbmd0aCxwX21hbmFnZXIpICE9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIHRvbyBzaG9ydFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfbWFya2VyID0gSjJLX01TX1NPRDsgLyogTm9ybWFsbHkgd2UgcmVhY2hlZCBhIFNPRCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyeSB0byByZWFkIDIgYnl0ZXMgKHRoZSBuZXh0IG1hcmtlciBJRCkgZnJvbSBzdHJlYW0gYW5kIGNvcHkgdGhlbSBpbnRvIHRoZSBidWZmZXIqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BqX3N0cmVhbV9yZWFkX2RhdGEocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsMixwX21hbmFnZXIpICE9IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIHRvbyBzaG9ydFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWFkIDIgYnl0ZXMgZnJvbSB0aGUgYnVmZmVyIGFzIHRoZSBuZXcgbWFya2VyIElEICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLCZsX2N1cnJlbnRfbWFya2VyLDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihvcGpfc3RyZWFtX2dldF9udW1iZXJfYnl0ZV9sZWZ0KHBfc3RyZWFtKSA9PSAwCi0gICAgICAgICAgICAgICAgICAgICYmIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IEoyS19TVEFURV9ORU9DKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIC8qIElmIHdlIGRpZG4ndCBza2lwIGRhdGEgYmVmb3JlLCB3ZSBuZWVkIHRvIHJlYWQgdGhlIFNPRCBtYXJrZXIqLwotICAgICAgICAgICAgICAgIGlmICghIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NraXBfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJ5IHRvIHJlYWQgdGhlIFNPRCBtYXJrZXIgYW5kIHNraXAgZGF0YSA/IEZJWE1FICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBvcGpfajJrX3JlYWRfc29kKHBfajJrLCBwX3N0cmVhbSwgcF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9jYW5fZGVjb2RlKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJ5IHRvIHJlYWQgMiBieXRlcyAodGhlIG5leHQgbWFya2VyIElEKSBmcm9tIHN0cmVhbSBhbmQgY29weSB0aGVtIGludG8gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BqX3N0cmVhbV9yZWFkX2RhdGEocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsMixwX21hbmFnZXIpICE9IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIHRvbyBzaG9ydFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlYWQgMiBieXRlcyBmcm9tIGJ1ZmZlciBhcyB0aGUgbmV3IG1hcmtlciBJRCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSwmbF9jdXJyZW50X21hcmtlciwyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmRpY2F0ZSB3ZSB3aWxsIHRyeSB0byByZWFkIGEgbmV3IHRpbGUtcGFydCBoZWFkZXIqLwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc2tpcF9kYXRhID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2Nhbl9kZWNvZGUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPSBKMktfU1RBVEVfVFBIU09UOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUcnkgdG8gcmVhZCAyIGJ5dGVzICh0aGUgbmV4dCBtYXJrZXIgSUQpIGZyb20gc3RyZWFtIGFuZCBjb3B5IHRoZW0gaW50byB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BqX3N0cmVhbV9yZWFkX2RhdGEocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsMixwX21hbmFnZXIpICE9IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWFkIDIgYnl0ZXMgZnJvbSBidWZmZXIgYXMgdGhlIG5ldyBtYXJrZXIgSUQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLCZsX2N1cnJlbnRfbWFya2VyLDIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIEN1cnJlbnQgbWFya2VyIGlzIHRoZSBFT0MgbWFya2VyID8qLwotICAgICAgICBpZiAobF9jdXJyZW50X21hcmtlciA9PSBKMktfTVNfRU9DKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlICE9IEoyS19TVEFURV9FT0MgKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPSBKMktfU1RBVEVfRU9DOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIEZJWE1FIERPQyA/Pz8qLwotICAgICAgICBpZiAoICEgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fY2FuX2RlY29kZSkgewotICAgICAgICAgICAgICAgIGxfdGNwID0gcF9qMmstPm1fY3AudGNwcyArIHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXI7Ci0gICAgICAgICAgICAgICAgbF9uYl90aWxlcyA9IHBfajJrLT5tX2NwLnRoICogcF9qMmstPm1fY3AudHc7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSggKHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIgPCBsX25iX3RpbGVzKSAmJiAobF90Y3AtPm1fZGF0YSA9PSAwMCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICArK3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICArK2xfdGNwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyID09IGxfbmJfdGlsZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpwX2dvX29uID0gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qRklYTUUgPz8/Ki8KLSAgICAgICAgaWYgKCEgb3BqX3RjZF9pbml0X2RlY29kZV90aWxlKHBfajJrLT5tX3RjZCwgcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcikpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ2Fubm90IGRlY29kZSB0aWxlLCBtZW1vcnkgZXJyb3JcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0lORk8sICJIZWFkZXIgb2YgdGlsZSAlZCAvICVkIGhhcyBiZWVuIHJlYWQuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcisxLCAocF9qMmstPm1fY3AudGggKiBwX2oyay0+bV9jcC50dykpOwotCi0gICAgICAgICpwX3RpbGVfaW5kZXggPSBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyOwotICAgICAgICAqcF9nb19vbiA9IE9QSl9UUlVFOwotICAgICAgICAqcF9kYXRhX3NpemUgPSBvcGpfdGNkX2dldF9kZWNvZGVkX3RpbGVfc2l6ZShwX2oyay0+bV90Y2QpOwotICAgICAgICAqcF90aWxlX3gwID0gcF9qMmstPm1fdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT54MDsKLSAgICAgICAgKnBfdGlsZV95MCA9IHBfajJrLT5tX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+eTA7Ci0gICAgICAgICpwX3RpbGVfeDEgPSBwX2oyay0+bV90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPngxOwotICAgICAgICAqcF90aWxlX3kxID0gcF9qMmstPm1fdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT55MTsKLSAgICAgICAgKnBfbmJfY29tcHMgPSBwX2oyay0+bV90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPm51bWNvbXBzOwotCi0gICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSB8PSAweDAwODA7LyogRklYTUUgSjJLX0RFQ19TVEFURV9EQVRBOyovCi0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi1PUEpfQk9PTCBvcGpfajJrX2RlY29kZV90aWxlICggIG9wal9qMmtfdCAqIHBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKLXsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2N1cnJlbnRfbWFya2VyOwotICAgICAgICBPUEpfQllURSBsX2RhdGEgWzJdOwotICAgICAgICBvcGpfdGNwX3QgKiBsX3RjcDsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotCi0gICAgICAgIGlmICggIShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSAmIDB4MDA4MC8qRklYTUUgSjJLX0RFQ19TVEFURV9EQVRBKi8pCi0gICAgICAgICAgICAgICAgfHwgKHBfdGlsZV9pbmRleCAhPSBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyKSApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgbF90Y3AgPSAmKHBfajJrLT5tX2NwLnRjcHNbcF90aWxlX2luZGV4XSk7Ci0gICAgICAgIGlmICghIGxfdGNwLT5tX2RhdGEpIHsKLSAgICAgICAgICAgICAgICBvcGpfajJrX3RjcF9kZXN0cm95KGxfdGNwKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCEgb3BqX3RjZF9kZWNvZGVfdGlsZSggICAgICBwX2oyay0+bV90Y2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90Y3AtPm1fZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RjcC0+bV9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90aWxlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4KSApIHsKLSAgICAgICAgICAgICAgICBvcGpfajJrX3RjcF9kZXN0cm95KGxfdGNwKTsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSB8PSAweDgwMDA7LypGSVhNRSBKMktfREVDX1NUQVRFX0VSUjsqLwotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gZGVjb2RlLlxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghIG9wal90Y2RfdXBkYXRlX3RpbGVfZGF0YShwX2oyay0+bV90Y2QscF9kYXRhLHBfZGF0YV9zaXplKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBUbyBhdm9pZCB0byBkZXN0cm95IHRoZSB0Y3Agd2hpY2ggY2FuIGJlIHVzZWZ1bCB3aGVuIHdlIHRyeSB0byBkZWNvZGUgYSB0aWxlIGRlY29kZWQgYmVmb3JlIChjZiBqMmtfcmFuZG9tX3RpbGVfYWNjZXNzKQotICAgICAgICAgKiB3ZSBkZXN0cm95IGp1c3QgdGhlIGRhdGEgd2hpY2ggd2lsbCBiZSByZS1yZWFkIGluIHJlYWRfdGlsZV9oZWFkZXIqLwotICAgICAgICAvKm9wal9qMmtfdGNwX2Rlc3Ryb3kobF90Y3ApOwotICAgICAgICBwX2oyay0+bV90Y2QtPnRjcCA9IDA7Ki8KLSAgICAgICAgb3BqX2oya190Y3BfZGF0YV9kZXN0cm95KGxfdGNwKTsKLQotICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9jYW5fZGVjb2RlID0gMDsKLSAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgJj0gKH4gKDB4MDA4MHUpKTsvKiBGSVhNRSBKMktfREVDX1NUQVRFX0RBVEEpOyovCi0KLSAgICAgICAgaWYob3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdChwX3N0cmVhbSkgPT0gMCAKLSAgICAgICAgICAgICYmIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IEoyS19TVEFURV9ORU9DKXsKLSAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSAhPSAweDAxMDApeyAvKkZJWE1FIEoyS19ERUNfU1RBVEVfRU9DKSovCi0gICAgICAgICAgICAgICAgaWYgKG9wal9zdHJlYW1fcmVhZF9kYXRhKHBfc3RyZWFtLGxfZGF0YSwyLHBfbWFuYWdlcikgIT0gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhsX2RhdGEsJmxfY3VycmVudF9tYXJrZXIsMik7Ci0KLSAgICAgICAgICAgICAgICBpZiAobF9jdXJyZW50X21hcmtlciA9PSBKMktfTVNfRU9DKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID0gIDB4MDEwMDsvKkZJWE1FIEoyS19ERUNfU1RBVEVfRU9DOyovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxfY3VycmVudF9tYXJrZXIgIT0gSjJLX01TX1NPVCkKLSAgICAgICAgICAgICAgICB7ICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYob3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdChwX3N0cmVhbSkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID0gSjJLX1NUQVRFX05FT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiU3RyZWFtIGRvZXMgbm90IGVuZCB3aXRoIEVPQ1xuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnQsIGV4cGVjdGVkIFNPVFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX0JPT0wgb3BqX2oya191cGRhdGVfaW1hZ2VfZGF0YSAob3BqX3RjZF90ICogcF90Y2QsIE9QSl9CWVRFICogcF9kYXRhLCBvcGpfaW1hZ2VfdCogcF9vdXRwdXRfaW1hZ2UpCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgaSxqLGsgPSAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfd2lkdGhfc3JjLGxfaGVpZ2h0X3NyYzsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3dpZHRoX2Rlc3QsbF9oZWlnaHRfZGVzdDsKLSAgICAgICAgT1BKX0lOVDMyIGxfb2Zmc2V0X3gwX3NyYywgbF9vZmZzZXRfeTBfc3JjLCBsX29mZnNldF94MV9zcmMsIGxfb2Zmc2V0X3kxX3NyYzsKLSAgICAgICAgT1BKX0lOVDMyIGxfc3RhcnRfb2Zmc2V0X3NyYywgbF9saW5lX29mZnNldF9zcmMsIGxfZW5kX29mZnNldF9zcmMgOwotICAgICAgICBPUEpfVUlOVDMyIGxfc3RhcnRfeF9kZXN0ICwgbF9zdGFydF95X2Rlc3Q7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF94MF9kZXN0LCBsX3kwX2Rlc3QsIGxfeDFfZGVzdCwgbF95MV9kZXN0OwotICAgICAgICBPUEpfSU5UMzIgbF9zdGFydF9vZmZzZXRfZGVzdCwgbF9saW5lX29mZnNldF9kZXN0OwotCi0gICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wX3NyYyA9IDAwOwotICAgICAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcF9kZXN0ID0gMDA7Ci0KLSAgICAgICAgb3BqX3RjZF90aWxlY29tcF90ICogbF90aWxlYyA9IDAwOwotICAgICAgICBvcGpfaW1hZ2VfdCAqIGxfaW1hZ2Vfc3JjID0gMDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9zaXplX2NvbXAsIGxfcmVtYWluaW5nOwotICAgICAgICBPUEpfSU5UMzIgKiBsX2Rlc3RfcHRyOwotICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCogbF9yZXM9IDAwOwotCi0gICAgICAgIGxfdGlsZWMgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+Y29tcHM7Ci0gICAgICAgIGxfaW1hZ2Vfc3JjID0gcF90Y2QtPmltYWdlOwotICAgICAgICBsX2ltZ19jb21wX3NyYyA9IGxfaW1hZ2Vfc3JjLT5jb21wczsKLQotICAgICAgICBsX2ltZ19jb21wX2Rlc3QgPSBwX291dHB1dF9pbWFnZS0+Y29tcHM7Ci0KLSAgICAgICAgZm9yIChpPTA7IGk8bF9pbWFnZV9zcmMtPm51bWNvbXBzOyBpKyspIHsKLQotICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIG91dHB1dCBjb21wb25lbnQgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLwotICAgICAgICAgICAgICAgIGlmICghbF9pbWdfY29tcF9kZXN0LT5kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgd2lkdGggPSBsX2ltZ19jb21wX2Rlc3QtPnc7Ci0gICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgaGVpZ2h0ID0gbF9pbWdfY29tcF9kZXN0LT5oOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBPUEpfVUlOVDMyIE1BWF9TSVpFID0gVUlOVDMyX01BWCAvIHNpemVvZihPUEpfSU5UMzIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaGVpZ2h0ID09IDAgfHwgd2lkdGggPiBNQVhfU0laRSAvIGhlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICAgICAgbF9pbWdfY29tcF9kZXN0LT5kYXRhID0gKE9QSl9JTlQzMiopIG9wal9jYWxsb2Mod2lkdGggKiBoZWlnaHQsIHNpemVvZihPUEpfSU5UMzIpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFsX2ltZ19jb21wX2Rlc3QtPmRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBDb3B5IGluZm8gZnJvbSBkZWNvZGVkIGNvbXAgaW1hZ2UgdG8gb3V0cHV0IGltYWdlICovCi0gICAgICAgICAgICAgICAgbF9pbWdfY29tcF9kZXN0LT5yZXNub19kZWNvZGVkID0gbF9pbWdfY29tcF9zcmMtPnJlc25vX2RlY29kZWQ7Ci0KLSAgICAgICAgICAgICAgICAvKi0tLS0tKi8KLSAgICAgICAgICAgICAgICAvKiBDb21wdXRlIHRoZSBwcmVjaXNpb24gb2YgdGhlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBsX3NpemVfY29tcCA9IGxfaW1nX2NvbXBfc3JjLT5wcmVjID4+IDM7IC8qKC8gOCkqLwotICAgICAgICAgICAgICAgIGxfcmVtYWluaW5nID0gbF9pbWdfY29tcF9zcmMtPnByZWMgJiA3OyAgLyogKCU4KSAqLwotICAgICAgICAgICAgICAgIGxfcmVzID0gbF90aWxlYy0+cmVzb2x1dGlvbnMgKyBsX2ltZ19jb21wX3NyYy0+cmVzbm9fZGVjb2RlZDsKLQotICAgICAgICAgICAgICAgIGlmIChsX3JlbWFpbmluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgKytsX3NpemVfY29tcDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobF9zaXplX2NvbXAgPT0gMykgewotICAgICAgICAgICAgICAgICAgICAgICAgbF9zaXplX2NvbXAgPSA0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKi0tLS0tKi8KLQotICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgdGlsZSBjb21wb25lbnQgc2l6ZSovCi0gICAgICAgICAgICAgICAgLyppZiAoaSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICJTUkM6IGxfcmVzX3gwPSVkLCBsX3Jlc194MT0lZCwgbF9yZXNfeTA9JWQsIGxfcmVzX3kxPSVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3Jlcy0+eDAsIGxfcmVzLT54MSwgbF9yZXMtPnkwLCBsX3Jlcy0+eTEpOwotICAgICAgICAgICAgICAgIH0qLwotCi0gICAgICAgICAgICAgICAgbF93aWR0aF9zcmMgPSAoT1BKX1VJTlQzMikobF9yZXMtPngxIC0gbF9yZXMtPngwKTsKLSAgICAgICAgICAgICAgICBsX2hlaWdodF9zcmMgPSAoT1BKX1VJTlQzMikobF9yZXMtPnkxIC0gbF9yZXMtPnkwKTsKLQotICAgICAgICAgICAgICAgIC8qIEJvcmRlciBvZiB0aGUgY3VycmVudCBvdXRwdXQgY29tcG9uZW50Ki8KLSAgICAgICAgICAgICAgICBsX3gwX2Rlc3QgPSAoT1BKX1VJTlQzMilvcGpfaW50X2NlaWxkaXZwb3cyKChPUEpfSU5UMzIpbF9pbWdfY29tcF9kZXN0LT54MCwgKE9QSl9JTlQzMilsX2ltZ19jb21wX2Rlc3QtPmZhY3Rvcik7Ci0gICAgICAgICAgICAgICAgbF95MF9kZXN0ID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2cG93MigoT1BKX0lOVDMyKWxfaW1nX2NvbXBfZGVzdC0+eTAsIChPUEpfSU5UMzIpbF9pbWdfY29tcF9kZXN0LT5mYWN0b3IpOwotICAgICAgICAgICAgICAgIGxfeDFfZGVzdCA9IGxfeDBfZGVzdCArIGxfaW1nX2NvbXBfZGVzdC0+dzsKLSAgICAgICAgICAgICAgICBsX3kxX2Rlc3QgPSBsX3kwX2Rlc3QgKyBsX2ltZ19jb21wX2Rlc3QtPmg7Ci0KLSAgICAgICAgICAgICAgICAvKmlmIChpID09IDApIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIkRFU1Q6IGxfeDBfZGVzdD0lZCwgbF94MV9kZXN0PSVkLCBsX3kwX2Rlc3Q9JWQsIGxfeTFfZGVzdD0lZCAoJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3gwX2Rlc3QsIGxfeDFfZGVzdCwgbF95MF9kZXN0LCBsX3kxX2Rlc3QsIGxfaW1nX2NvbXBfZGVzdC0+ZmFjdG9yICk7Ci0gICAgICAgICAgICAgICAgfSovCi0KLSAgICAgICAgICAgICAgICAvKi0tLS0tKi8KLSAgICAgICAgICAgICAgICAvKiBDb21wdXRlIHRoZSBhcmVhIChsX29mZnNldF94MF9zcmMsIGxfb2Zmc2V0X3kwX3NyYywgbF9vZmZzZXRfeDFfc3JjLCBsX29mZnNldF95MV9zcmMpCi0gICAgICAgICAgICAgICAgICogb2YgdGhlIGlucHV0IGJ1ZmZlciAoZGVjb2RlZCB0aWxlIGNvbXBvbmVudCkgd2hpY2ggd2lsbCBiZSBtb3ZlCi0gICAgICAgICAgICAgICAgICogaW4gdGhlIG91dHB1dCBidWZmZXIuIENvbXB1dGUgdGhlIGFyZWEgb2YgdGhlIG91dHB1dCBidWZmZXIgKGxfc3RhcnRfeF9kZXN0LAotICAgICAgICAgICAgICAgICAqIGxfc3RhcnRfeV9kZXN0LCBsX3dpZHRoX2Rlc3QsIGxfaGVpZ2h0X2Rlc3QpICB3aGljaCB3aWxsIGJlIG1vZGlmaWVkCi0gICAgICAgICAgICAgICAgICogYnkgdGhpcyBpbnB1dCBhcmVhLgotICAgICAgICAgICAgICAgICAqICovCi0gICAgICAgICAgICAgICAgYXNzZXJ0KCBsX3Jlcy0+eDAgPj0gMCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KCBsX3Jlcy0+eDEgPj0gMCk7Ci0gICAgICAgICAgICAgICAgaWYgKCBsX3gwX2Rlc3QgPCAoT1BKX1VJTlQzMilsX3Jlcy0+eDAgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX3N0YXJ0X3hfZGVzdCA9IChPUEpfVUlOVDMyKWxfcmVzLT54MCAtIGxfeDBfZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfb2Zmc2V0X3gwX3NyYyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbF94MV9kZXN0ID49IChPUEpfVUlOVDMyKWxfcmVzLT54MSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF93aWR0aF9kZXN0ID0gbF93aWR0aF9zcmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfb2Zmc2V0X3gxX3NyYyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF93aWR0aF9kZXN0ID0gbF94MV9kZXN0IC0gKE9QSl9VSU5UMzIpbF9yZXMtPngwIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9vZmZzZXRfeDFfc3JjID0gKE9QSl9JTlQzMikobF93aWR0aF9zcmMgLSBsX3dpZHRoX2Rlc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfc3RhcnRfeF9kZXN0ID0gMCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX29mZnNldF94MF9zcmMgPSAoT1BKX0lOVDMyKWxfeDBfZGVzdCAtIGxfcmVzLT54MDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBsX3gxX2Rlc3QgPj0gKE9QSl9VSU5UMzIpbF9yZXMtPngxICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3dpZHRoX2Rlc3QgPSBsX3dpZHRoX3NyYyAtIChPUEpfVUlOVDMyKWxfb2Zmc2V0X3gwX3NyYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9vZmZzZXRfeDFfc3JjID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3dpZHRoX2Rlc3QgPSBsX2ltZ19jb21wX2Rlc3QtPncgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX29mZnNldF94MV9zcmMgPSBsX3Jlcy0+eDEgLSAoT1BKX0lOVDMyKWxfeDFfZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIGxfeTBfZGVzdCA8IChPUEpfVUlOVDMyKWxfcmVzLT55MCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfc3RhcnRfeV9kZXN0ID0gKE9QSl9VSU5UMzIpbF9yZXMtPnkwIC0gbF95MF9kZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgbF9vZmZzZXRfeTBfc3JjID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBsX3kxX2Rlc3QgPj0gKE9QSl9VSU5UMzIpbF9yZXMtPnkxICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2hlaWdodF9kZXN0ID0gbF9oZWlnaHRfc3JjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX29mZnNldF95MV9zcmMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaGVpZ2h0X2Rlc3QgPSBsX3kxX2Rlc3QgLSAoT1BKX1VJTlQzMilsX3Jlcy0+eTAgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX29mZnNldF95MV9zcmMgPSAgKE9QSl9JTlQzMikobF9oZWlnaHRfc3JjIC0gbF9oZWlnaHRfZGVzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbF9zdGFydF95X2Rlc3QgPSAwIDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfb2Zmc2V0X3kwX3NyYyA9IChPUEpfSU5UMzIpbF95MF9kZXN0IC0gbF9yZXMtPnkwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGxfeTFfZGVzdCA+PSAoT1BKX1VJTlQzMilsX3Jlcy0+eTEgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaGVpZ2h0X2Rlc3QgPSBsX2hlaWdodF9zcmMgLSAoT1BKX1VJTlQzMilsX29mZnNldF95MF9zcmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfb2Zmc2V0X3kxX3NyYyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9oZWlnaHRfZGVzdCA9IGxfaW1nX2NvbXBfZGVzdC0+aCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfb2Zmc2V0X3kxX3NyYyA9IGxfcmVzLT55MSAtIChPUEpfSU5UMzIpbF95MV9kZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKCAobF9vZmZzZXRfeDBfc3JjIDwgMCApIHx8IChsX29mZnNldF95MF9zcmMgPCAwICkgfHwgKGxfb2Zmc2V0X3gxX3NyYyA8IDAgKSB8fCAobF9vZmZzZXRfeTFfc3JjIDwgMCApICl7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiB0ZXN0Y2FzZSAyOTc3LnBkZi5hc2FuLjY3LjIxOTggKi8KLSAgICAgICAgICAgICAgICBpZiAoKE9QSl9JTlQzMilsX3dpZHRoX2Rlc3QgPCAwIHx8IChPUEpfSU5UMzIpbF9oZWlnaHRfZGVzdCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qLS0tLS0qLwotCi0gICAgICAgICAgICAgICAgLyogQ29tcHV0ZSB0aGUgaW5wdXQgYnVmZmVyIG9mZnNldCAqLwotICAgICAgICAgICAgICAgIGxfc3RhcnRfb2Zmc2V0X3NyYyA9IGxfb2Zmc2V0X3gwX3NyYyArIGxfb2Zmc2V0X3kwX3NyYyAqIChPUEpfSU5UMzIpbF93aWR0aF9zcmM7Ci0gICAgICAgICAgICAgICAgbF9saW5lX29mZnNldF9zcmMgPSBsX29mZnNldF94MV9zcmMgKyBsX29mZnNldF94MF9zcmM7Ci0gICAgICAgICAgICAgICAgbF9lbmRfb2Zmc2V0X3NyYyA9IGxfb2Zmc2V0X3kxX3NyYyAqIChPUEpfSU5UMzIpbF93aWR0aF9zcmMgLSBsX29mZnNldF94MF9zcmM7Ci0KLSAgICAgICAgICAgICAgICAvKiBDb21wdXRlIHRoZSBvdXRwdXQgYnVmZmVyIG9mZnNldCAqLwotICAgICAgICAgICAgICAgIGxfc3RhcnRfb2Zmc2V0X2Rlc3QgPSAoT1BKX0lOVDMyKShsX3N0YXJ0X3hfZGVzdCArIGxfc3RhcnRfeV9kZXN0ICogbF9pbWdfY29tcF9kZXN0LT53KTsKLSAgICAgICAgICAgICAgICBsX2xpbmVfb2Zmc2V0X2Rlc3QgPSAoT1BKX0lOVDMyKShsX2ltZ19jb21wX2Rlc3QtPncgLSBsX3dpZHRoX2Rlc3QpOwotCi0gICAgICAgICAgICAgICAgLyogTW92ZSB0aGUgb3V0cHV0IGJ1ZmZlciB0byB0aGUgZmlyc3QgcGxhY2Ugd2hlcmUgd2Ugd2lsbCB3cml0ZSovCi0gICAgICAgICAgICAgICAgbF9kZXN0X3B0ciA9IGxfaW1nX2NvbXBfZGVzdC0+ZGF0YSArIGxfc3RhcnRfb2Zmc2V0X2Rlc3Q7Ci0KLSAgICAgICAgICAgICAgICAvKmlmIChpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiQ09NUE9bJWRdOlxuIixpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiU1JDOiBsX3N0YXJ0X3hfc3JjPSVkLCBsX3N0YXJ0X3lfc3JjPSVkLCBsX3dpZHRoX3NyYz0lZCwgbF9oZWlnaHRfc3JjPSVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0IHRpbGUgb2Zmc2V0OiVkLCAlZCwgJWQsICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0IGJ1ZmZlciBvZmZzZXQ6ICVkOyAlZCwgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9yZXMtPngwLCBsX3Jlcy0+eTAsIGxfd2lkdGhfc3JjLCBsX2hlaWdodF9zcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9vZmZzZXRfeDBfc3JjLCBsX29mZnNldF95MF9zcmMsIGxfb2Zmc2V0X3gxX3NyYywgbF9vZmZzZXRfeTFfc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3RhcnRfb2Zmc2V0X3NyYywgbF9saW5lX29mZnNldF9zcmMsIGxfZW5kX29mZnNldF9zcmMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIkRFU1Q6IGxfc3RhcnRfeF9kZXN0PSVkLCBsX3N0YXJ0X3lfZGVzdD0lZCwgbF93aWR0aF9kZXN0PSVkLCBsX2hlaWdodF9kZXN0PSVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0IHN0YXJ0IG9mZnNldDogJWQsIGxpbmUgb2Zmc2V0PSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3N0YXJ0X3hfZGVzdCwgbF9zdGFydF95X2Rlc3QsIGxfd2lkdGhfZGVzdCwgbF9oZWlnaHRfZGVzdCwgbF9zdGFydF9vZmZzZXRfZGVzdCwgbF9saW5lX29mZnNldF9kZXN0KTsKLSAgICAgICAgICAgICAgICB9Ki8KLQotICAgICAgICAgICAgICAgIHN3aXRjaCAobF9zaXplX2NvbXApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9DSEFSICogbF9zcmNfcHRyID0gKE9QSl9DSEFSKikgcF9kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX3N0YXJ0X29mZnNldF9zcmM7IC8qIE1vdmUgdG8gdGhlIGZpcnN0IHBsYWNlIHdoZXJlIHdlIHdpbGwgcmVhZCovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9pbWdfY29tcF9zcmMtPnNnbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDAgOyBqIDwgbF9oZWlnaHRfZGVzdCA7ICsraikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCBrID0gMCA7IGsgPCBsX3dpZHRoX2Rlc3QgOyArK2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGxfZGVzdF9wdHIrKykgPSAoT1BKX0lOVDMyKSAoKihsX3NyY19wdHIrKykpOyAvKiBDb3B5IG9ubHkgdGhlIGRhdGEgbmVlZGVkIGZvciB0aGUgb3V0cHV0IGltYWdlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2Rlc3RfcHRyKz0gbF9saW5lX29mZnNldF9kZXN0OyAvKiBNb3ZlIHRvIHRoZSBuZXh0IHBsYWNlIHdoZXJlIHdlIHdpbGwgd3JpdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zcmNfcHRyICs9IGxfbGluZV9vZmZzZXRfc3JjIDsgLyogTW92ZSB0byB0aGUgbmV4dCBwbGFjZSB3aGVyZSB3ZSB3aWxsIHJlYWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCBqID0gMCA7IGogPCBsX2hlaWdodF9kZXN0IDsgKytqICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCBrID0gMCA7IGsgPCBsX3dpZHRoX2Rlc3QgOyArK2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGxfZGVzdF9wdHIrKykgPSAoT1BKX0lOVDMyKSAoKCoobF9zcmNfcHRyKyspKSYweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZGVzdF9wdHIrPSBsX2xpbmVfb2Zmc2V0X2Rlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX2xpbmVfb2Zmc2V0X3NyYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NyY19wdHIgKz0gbF9lbmRfb2Zmc2V0X3NyYzsgLyogTW92ZSB0byB0aGUgZW5kIG9mIHRoaXMgY29tcG9uZW50LXBhcnQgb2YgdGhlIGlucHV0IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YSA9IChPUEpfQllURSopIGxfc3JjX3B0cjsgLyogS2VlcCB0aGUgY3VycmVudCBwb3NpdGlvbiBmb3IgdGhlIG5leHQgY29tcG9uZW50LXBhcnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQxNiAqIGxfc3JjX3B0ciA9IChPUEpfSU5UMTYgKikgcF9kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX3N0YXJ0X29mZnNldF9zcmM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9pbWdfY29tcF9zcmMtPnNnbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9oZWlnaHRfZGVzdDsrK2opIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrPTA7azxsX3dpZHRoX2Rlc3Q7KytrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKihsX3NyY19wdHIrKyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2Rlc3RfcHRyKz0gbF9saW5lX29mZnNldF9kZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NyY19wdHIgKz0gbF9saW5lX29mZnNldF9zcmMgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9oZWlnaHRfZGVzdDsrK2opIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrPTA7azxsX3dpZHRoX2Rlc3Q7KytrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKCoobF9zcmNfcHRyKyspKSYweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2Rlc3RfcHRyKz0gbF9saW5lX29mZnNldF9kZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NyY19wdHIgKz0gbF9saW5lX29mZnNldF9zcmMgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX2VuZF9vZmZzZXRfc3JjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YSA9IChPUEpfQllURSopIGxfc3JjX3B0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIGxfc3JjX3B0ciA9IChPUEpfSU5UMzIgKikgcF9kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX3N0YXJ0X29mZnNldF9zcmM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfaGVpZ2h0X2Rlc3Q7KytqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGs9MDtrPGxfd2lkdGhfZGVzdDsrK2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKCoobF9zcmNfcHRyKyspKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9kZXN0X3B0cis9IGxfbGluZV9vZmZzZXRfZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX2xpbmVfb2Zmc2V0X3NyYyA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zcmNfcHRyICs9IGxfZW5kX29mZnNldF9zcmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhID0gKE9QSl9CWVRFKikgbF9zcmNfcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICsrbF9pbWdfY29tcF9kZXN0OwotICAgICAgICAgICAgICAgICsrbF9pbWdfY29tcF9zcmM7Ci0gICAgICAgICAgICAgICAgKytsX3RpbGVjOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi1PUEpfQk9PTCBvcGpfajJrX3NldF9kZWNvZGVfYXJlYSggICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QqIHBfaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX3N0YXJ0X3gsIE9QSl9JTlQzMiBwX3N0YXJ0X3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX2VuZF94LCBPUEpfSU5UMzIgcF9lbmRfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKLXsKLSAgICAgICAgb3BqX2NwX3QgKiBsX2NwID0gJihwX2oyay0+bV9jcCk7Ci0gICAgICAgIG9wal9pbWFnZV90ICogbF9pbWFnZSA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2U7Ci0KLSAgICAgICAgT1BKX1VJTlQzMiBpdF9jb21wOwotICAgICAgICBPUEpfSU5UMzIgbF9jb21wX3gxLCBsX2NvbXBfeTE7Ci0gICAgICAgIG9wal9pbWFnZV9jb21wX3QqIGxfaW1nX2NvbXAgPSBOVUxMOwotCi0gICAgICAgIC8qIENoZWNrIGlmIHdlIGFyZSByZWFkIHRoZSBtYWluIGhlYWRlciAqLwotICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgIT0gSjJLX1NUQVRFX1RQSFNPVCkgeyAvKiBGSVhNRSBKMktfREVDX1NUQVRFX1RQSFNPVCkqLwotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOZWVkIHRvIGRlY29kZSB0aGUgbWFpbiBoZWFkZXIgYmVmb3JlIGJlZ2luIHRvIGRlY29kZSB0aGUgcmVtYWluaW5nIGNvZGVzdHJlYW0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAhcF9zdGFydF94ICYmICFwX3N0YXJ0X3kgJiYgIXBfZW5kX3ggJiYgIXBfZW5kX3kpewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfSU5GTywgIk5vIGRlY29kZWQgYXJlYSBwYXJhbWV0ZXJzLCBzZXQgdGhlIGRlY29kZWQgYXJlYSB0byB0aGUgd2hvbGUgaW1hZ2VcbiIpOwotCi0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhcnRfdGlsZV94ID0gMDsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3kgPSAwOwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2VuZF90aWxlX3ggPSBsX2NwLT50dzsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9lbmRfdGlsZV95ID0gbF9jcC0+dGg7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAtLS0tLSAqLwotICAgICAgICAvKiBDaGVjayBpZiB0aGUgcG9zaXRpb25zIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIGFyZSBjb3JyZWN0ICovCi0KLSAgICAgICAgLyogTGVmdCAqLwotICAgICAgICBhc3NlcnQocF9zdGFydF94ID49IDAgKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RhcnRfeSA+PSAwICk7Ci0KLSAgICAgICAgaWYgKChPUEpfVUlOVDMyKXBfc3RhcnRfeCA+IGxfaW1hZ2UtPngxICkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiTGVmdCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDA9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhzaXo9JWQpLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfc3RhcnRfeCwgbF9pbWFnZS0+eDEpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKE9QSl9VSU5UMzIpcF9zdGFydF94IDwgbF9pbWFnZS0+eDApewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlZnQgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3gwPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChYT3Npej0lZCkuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3N0YXJ0X3gsIGxfaW1hZ2UtPngwKTsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3ggPSAwOwotICAgICAgICAgICAgICAgIHBfaW1hZ2UtPngwID0gbF9pbWFnZS0+eDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhcnRfdGlsZV94ID0gKChPUEpfVUlOVDMyKXBfc3RhcnRfeCAtIGxfY3AtPnR4MCkgLyBsX2NwLT50ZHg7Ci0gICAgICAgICAgICAgICAgcF9pbWFnZS0+eDAgPSAoT1BKX1VJTlQzMilwX3N0YXJ0X3g7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBVcCAqLwotICAgICAgICBpZiAoKE9QSl9VSU5UMzIpcF9zdGFydF95ID4gbF9pbWFnZS0+eTEpewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVcCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feTA9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFlzaXo9JWQpLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zdGFydF95LCBsX2ltYWdlLT55MSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgoT1BKX1VJTlQzMilwX3N0YXJ0X3kgPCBsX2ltYWdlLT55MCl7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXAgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kwPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChZT3Npej0lZCkuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3N0YXJ0X3ksIGxfaW1hZ2UtPnkwKTsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3kgPSAwOwotICAgICAgICAgICAgICAgIHBfaW1hZ2UtPnkwID0gbF9pbWFnZS0+eTA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhcnRfdGlsZV95ID0gKChPUEpfVUlOVDMyKXBfc3RhcnRfeSAtIGxfY3AtPnR5MCkgLyBsX2NwLT50ZHk7Ci0gICAgICAgICAgICAgICAgcF9pbWFnZS0+eTAgPSAoT1BKX1VJTlQzMilwX3N0YXJ0X3k7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBSaWdodCAqLwotICAgICAgICBhc3NlcnQoKE9QSl9VSU5UMzIpcF9lbmRfeCA+IDApOwotICAgICAgICBhc3NlcnQoKE9QSl9VSU5UMzIpcF9lbmRfeSA+IDApOwotICAgICAgICBpZiAoKE9QSl9VSU5UMzIpcF9lbmRfeCA8IGxfaW1hZ2UtPngwKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJSaWdodCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDE9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhPc2l6PSVkKS5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwX2VuZF94LCBsX2ltYWdlLT54MCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgoT1BKX1VJTlQzMilwX2VuZF94ID4gbF9pbWFnZS0+eDEpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiUmlnaHQgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3gxPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChYc2l6PSVkKS5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwX2VuZF94LCBsX2ltYWdlLT54MSk7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeCA9IGxfY3AtPnR3OwotICAgICAgICAgICAgICAgIHBfaW1hZ2UtPngxID0gbF9pbWFnZS0+eDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeCA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdihwX2VuZF94IC0gKE9QSl9JTlQzMilsX2NwLT50eDAsIChPUEpfSU5UMzIpbF9jcC0+dGR4KTsKLSAgICAgICAgICAgICAgICBwX2ltYWdlLT54MSA9IChPUEpfVUlOVDMyKXBfZW5kX3g7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBCb3R0b20gKi8KLSAgICAgICAgaWYgKChPUEpfVUlOVDMyKXBfZW5kX3kgPCBsX2ltYWdlLT55MCkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQm90dG9tIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MT0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWU9zaXo9JWQpLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfZW5kX3ksIGxfaW1hZ2UtPnkwKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoT1BKX1VJTlQzMilwX2VuZF95ID4gbF9pbWFnZS0+eTEpewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICJCb3R0b20gcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kxPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChZc2l6PSVkKS5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwX2VuZF95LCBsX2ltYWdlLT55MSk7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeSA9IGxfY3AtPnRoOwotICAgICAgICAgICAgICAgIHBfaW1hZ2UtPnkxID0gbF9pbWFnZS0+eTE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9lbmRfdGlsZV95ID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2KHBfZW5kX3kgLSAoT1BKX0lOVDMyKWxfY3AtPnR5MCwgKE9QSl9JTlQzMilsX2NwLT50ZHkpOwotICAgICAgICAgICAgICAgIHBfaW1hZ2UtPnkxID0gKE9QSl9VSU5UMzIpcF9lbmRfeTsKLSAgICAgICAgfQotICAgICAgICAvKiAtLS0tLSAqLwotCi0gICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2Rpc2NhcmRfdGlsZXMgPSAxOwotCi0gICAgICAgIGxfaW1nX2NvbXAgPSBwX2ltYWdlLT5jb21wczsKLSAgICAgICAgZm9yIChpdF9jb21wPTA7IGl0X2NvbXAgPCBwX2ltYWdlLT5udW1jb21wczsgKytpdF9jb21wKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIGxfaCxsX3c7Ci0KLSAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT54MCA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKXBfaW1hZ2UtPngwLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR4KTsKLSAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT55MCA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKXBfaW1hZ2UtPnkwLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR5KTsKLSAgICAgICAgICAgICAgICBsX2NvbXBfeDEgPSBvcGpfaW50X2NlaWxkaXYoKE9QSl9JTlQzMilwX2ltYWdlLT54MSwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5keCk7Ci0gICAgICAgICAgICAgICAgbF9jb21wX3kxID0gb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpcF9pbWFnZS0+eTEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHkpOwotCi0gICAgICAgICAgICAgICAgbF93ID0gb3BqX2ludF9jZWlsZGl2cG93MihsX2NvbXBfeDEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZmFjdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG9wal9pbnRfY2VpbGRpdnBvdzIoKE9QSl9JTlQzMilsX2ltZ19jb21wLT54MCwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5mYWN0b3IpOwotICAgICAgICAgICAgICAgIGlmIChsX3cgPCAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaXplIHggb2YgdGhlIGRlY29kZWQgY29tcG9uZW50IGltYWdlIGlzIGluY29ycmVjdCAoY29tcFslZF0udz0lZCkuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdF9jb21wLCBsX3cpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbF9pbWdfY29tcC0+dyA9IChPUEpfVUlOVDMyKWxfdzsKLQotICAgICAgICAgICAgICAgIGxfaCA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF9jb21wX3kxLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmZhY3RvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBvcGpfaW50X2NlaWxkaXZwb3cyKChPUEpfSU5UMzIpbF9pbWdfY29tcC0+eTAsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZmFjdG9yKTsKLSAgICAgICAgICAgICAgICBpZiAobF9oIDwgMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2l6ZSB5IG9mIHRoZSBkZWNvZGVkIGNvbXBvbmVudCBpbWFnZSBpcyBpbmNvcnJlY3QgKGNvbXBbJWRdLmg9JWQpLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRfY29tcCwgbF9oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPmggPSAoT1BKX1VJTlQzMilsX2g7Ci0KLSAgICAgICAgICAgICAgICBsX2ltZ19jb21wKys7Ci0gICAgICAgIH0KLQotICAgICAgICBvcGpfZXZlbnRfbXNnKCBwX21hbmFnZXIsIEVWVF9JTkZPLCJTZXR0aW5nIGRlY29kaW5nIGFyZWEgdG8gJWQsJWQsJWQsJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwX2ltYWdlLT54MCwgcF9pbWFnZS0+eTAsIHBfaW1hZ2UtPngxLCBwX2ltYWdlLT55MSk7Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi1vcGpfajJrX3QqIG9wal9qMmtfY3JlYXRlX2RlY29tcHJlc3Modm9pZCkKLXsKLSAgICAgICAgb3BqX2oya190ICpsX2oyayA9IChvcGpfajJrX3QqKSBvcGpfY2FsbG9jKDEsc2l6ZW9mKG9wal9qMmtfdCkpOwotICAgICAgICBpZiAoIWxfajJrKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDAwOwotICAgICAgICB9Ci0KLSAgICAgICAgbF9qMmstPm1faXNfZGVjb2RlciA9IDE7Ci0gICAgICAgIGxfajJrLT5tX2NwLm1faXNfZGVjb2RlciA9IDE7Ci0KLSAgICAgICAgbF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3AgPSAob3BqX3RjcF90Kikgb3BqX2NhbGxvYygxLHNpemVvZihvcGpfdGNwX3QpKTsKLSAgICAgICAgaWYgKCFsX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcCkgewotICAgICAgICAgICAgICAgIG9wal9qMmtfZGVzdHJveShsX2oyayk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDAwOwotICAgICAgICB9Ci0KLSAgICAgICAgbF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX2NhbGxvYygxLE9QSl9KMktfREVGQVVMVF9IRUFERVJfU0laRSk7Ci0gICAgICAgIGlmICghIGxfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2oya19kZXN0cm95KGxfajJrKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDA7Ci0gICAgICAgIH0KLQotICAgICAgICBsX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YV9zaXplID0gT1BKX0oyS19ERUZBVUxUX0hFQURFUl9TSVpFOwotCi0gICAgICAgIGxfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3RpbGVfaW5kX3RvX2RlYyA9IC0xIDsKLQotICAgICAgICBsX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9sYXN0X3NvdF9yZWFkX3BvcyA9IDAgOwotCi0gICAgICAgIC8qIGNvZGVzdHJlYW0gaW5kZXggY3JlYXRpb24gKi8KLSAgICAgICAgbF9qMmstPmNzdHJfaW5kZXggPSBvcGpfajJrX2NyZWF0ZV9jc3RyX2luZGV4KCk7Ci0gICAgICAgIGlmICghbF9qMmstPmNzdHJfaW5kZXgpewotICAgICAgICAgICAgICAgIG9wal9qMmtfZGVzdHJveShsX2oyayk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogdmFsaWRhdGlvbiBsaXN0IGNyZWF0aW9uICovCi0gICAgICAgIGxfajJrLT5tX3ZhbGlkYXRpb25fbGlzdCA9IG9wal9wcm9jZWR1cmVfbGlzdF9jcmVhdGUoKTsKLSAgICAgICAgaWYgKCEgbF9qMmstPm1fdmFsaWRhdGlvbl9saXN0KSB7Ci0gICAgICAgICAgICAgICAgb3BqX2oya19kZXN0cm95KGxfajJrKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBleGVjdXRpb24gbGlzdCBjcmVhdGlvbiAqLwotICAgICAgICBsX2oyay0+bV9wcm9jZWR1cmVfbGlzdCA9IG9wal9wcm9jZWR1cmVfbGlzdF9jcmVhdGUoKTsKLSAgICAgICAgaWYgKCEgbF9qMmstPm1fcHJvY2VkdXJlX2xpc3QpIHsKLSAgICAgICAgICAgICAgICBvcGpfajJrX2Rlc3Ryb3kobF9qMmspOwotICAgICAgICAgICAgICAgIHJldHVybiAwMDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBsX2oyazsKLX0KLQotb3BqX2NvZGVzdHJlYW1faW5kZXhfdCogb3BqX2oya19jcmVhdGVfY3N0cl9pbmRleCh2b2lkKQotewotICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmRleF90KiBjc3RyX2luZGV4ID0gKG9wal9jb2Rlc3RyZWFtX2luZGV4X3QqKQotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NhbGxvYygxLHNpemVvZihvcGpfY29kZXN0cmVhbV9pbmRleF90KSk7Ci0gICAgICAgIGlmICghY3N0cl9pbmRleCkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgICAgICBjc3RyX2luZGV4LT5tYXhtYXJrbnVtID0gMTAwOwotICAgICAgICBjc3RyX2luZGV4LT5tYXJrbnVtID0gMDsKLSAgICAgICAgY3N0cl9pbmRleC0+bWFya2VyID0gKG9wal9tYXJrZXJfaW5mb190KikKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jYWxsb2MoY3N0cl9pbmRleC0+bWF4bWFya251bSwgc2l6ZW9mKG9wal9tYXJrZXJfaW5mb190KSk7Ci0gICAgICAgIGlmICghY3N0cl9pbmRleC0+IG1hcmtlcikKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgICAgICBjc3RyX2luZGV4LT50aWxlX2luZGV4ID0gTlVMTDsKLQotICAgICAgICByZXR1cm4gY3N0cl9pbmRleDsKLX0KLQotT1BKX1VJTlQzMiBvcGpfajJrX2dldF9TUENvZF9TUENvY19zaXplICggICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vICkKLXsKLSAgICAgICAgb3BqX2NwX3QgKmxfY3AgPSAwMDsKLSAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOwotICAgICAgICBvcGpfdGNjcF90ICpsX3RjY3AgPSAwMDsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0KLSAgICAgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOwotICAgICAgICBsX3RjcCA9ICZsX2NwLT50Y3BzW3BfdGlsZV9ub107Ci0gICAgICAgIGxfdGNjcCA9ICZsX3RjcC0+dGNjcHNbcF9jb21wX25vXTsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zIGFnYWluICovCi0gICAgICAgIGFzc2VydChwX3RpbGVfbm8gPCAobF9jcC0+dHcgKiBsX2NwLT50aCkpOwotICAgICAgICBhc3NlcnQocF9jb21wX25vIDwgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHMpOwotCi0gICAgICAgIGlmIChsX3RjY3AtPmNzdHkgJiBKMktfQ0NQX0NTVFlfUFJUKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDUgKyBsX3RjY3AtPm51bXJlc29sdXRpb25zOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiA1OwotICAgICAgICB9Ci19Ci0KLU9QSl9CT09MIG9wal9qMmtfd3JpdGVfU1BDb2RfU1BDb2MoICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9ubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIgKQotewotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIG9wal9jcF90ICpsX2NwID0gMDA7Ci0gICAgICAgIG9wal90Y3BfdCAqbF90Y3AgPSAwMDsKLSAgICAgICAgb3BqX3RjY3BfdCAqbF90Y2NwID0gMDA7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9oZWFkZXJfc2l6ZSAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9kYXRhICE9IDAwKTsKLQotICAgICAgICBsX2NwID0gJihwX2oyay0+bV9jcCk7Ci0gICAgICAgIGxfdGNwID0gJmxfY3AtPnRjcHNbcF90aWxlX25vXTsKLSAgICAgICAgbF90Y2NwID0gJmxfdGNwLT50Y2Nwc1twX2NvbXBfbm9dOwotCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgYWdhaW4gKi8KLSAgICAgICAgYXNzZXJ0KHBfdGlsZV9ubyA8IChsX2NwLT50dyAqIGxfY3AtPnRoKSk7Ci0gICAgICAgIGFzc2VydChwX2NvbXBfbm8gPChwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wcykpOwotCi0gICAgICAgIGlmICgqcF9oZWFkZXJfc2l6ZSA8IDUpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd3JpdGluZyBTUENvZCBTUENvYyBlbGVtZW50XG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKHBfZGF0YSxsX3RjY3AtPm51bXJlc29sdXRpb25zIC0gMSwgMSk7ICAvKiBTUGNvYyAoRCkgKi8KLSAgICAgICAgKytwX2RhdGE7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKHBfZGF0YSxsX3RjY3AtPmNibGt3IC0gMiwgMSk7ICAgICAgICAgICAgICAgICAgIC8qIFNQY29jIChFKSAqLwotICAgICAgICArK3BfZGF0YTsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLGxfdGNjcC0+Y2Jsa2ggLSAyLCAxKTsgICAgICAgICAgICAgICAgICAgLyogU1Bjb2MgKEYpICovCi0gICAgICAgICsrcF9kYXRhOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhwX2RhdGEsbF90Y2NwLT5jYmxrc3R5LCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNQY29jIChHKSAqLwotICAgICAgICArK3BfZGF0YTsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLGxfdGNjcC0+cW1mYmlkLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTUGNvYyAoSCkgKi8KLSAgICAgICAgKytwX2RhdGE7Ci0KLSAgICAgICAgKnBfaGVhZGVyX3NpemUgPSAqcF9oZWFkZXJfc2l6ZSAtIDU7Ci0KLSAgICAgICAgaWYgKGxfdGNjcC0+Y3N0eSAmIEoyS19DQ1BfQ1NUWV9QUlQpIHsKLQotICAgICAgICAgICAgICAgIGlmICgqcF9oZWFkZXJfc2l6ZSA8IGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciB3cml0aW5nIFNQQ29kIFNQQ29jIGVsZW1lbnRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbF90Y2NwLT5udW1yZXNvbHV0aW9uczsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLGxfdGNjcC0+cHJjd1tpXSArIChsX3RjY3AtPnByY2hbaV0gPDwgNCksIDEpOyAgICAvKiBTUGNvYyAoSV9pKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKytwX2RhdGE7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgKnBfaGVhZGVyX3NpemUgPSAqcF9oZWFkZXJfc2l6ZSAtIGxfdGNjcC0+bnVtcmVzb2x1dGlvbnM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9CT09MIG9wal9qMmtfcmVhZF9TUENvZF9TUENvYyggIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBjb21wbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKLXsKLSAgICAgICAgT1BKX1VJTlQzMiBpLCBsX3RtcDsKLSAgICAgICAgb3BqX2NwX3QgKmxfY3AgPSBOVUxMOwotICAgICAgICBvcGpfdGNwX3QgKmxfdGNwID0gTlVMTDsKLSAgICAgICAgb3BqX3RjY3BfdCAqbF90Y2NwID0gTlVMTDsKLSAgICAgICAgT1BKX0JZVEUgKiBsX2N1cnJlbnRfcHRyID0gTlVMTDsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7Ci0KLSAgICAgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOwotICAgICAgICBsX3RjcCA9IChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9PSBKMktfU1RBVEVfVFBIKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX2NwLT50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3A7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9uIGFnYWluICovCi0gICAgICAgIGFzc2VydChjb21wbm8gPCBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wcyk7Ci0KLSAgICAgICAgbF90Y2NwID0gJmxfdGNwLT50Y2Nwc1tjb21wbm9dOwotICAgICAgICBsX2N1cnJlbnRfcHRyID0gcF9oZWFkZXJfZGF0YTsKLQotICAgICAgICAvKiBtYWtlIHN1cmUgcm9vbSBpcyBzdWZmaWNpZW50ICovCi0gICAgICAgIGlmICgqcF9oZWFkZXJfc2l6ZSA8IDUpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBTUENvZCBTUENvYyBlbGVtZW50XG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgb3BqX3JlYWRfYnl0ZXMobF9jdXJyZW50X3B0ciwgJmxfdGNjcC0+bnVtcmVzb2x1dGlvbnMgLDEpOyAgICAgICAgICAgICAgLyogU1Bjb3ggKEQpICovCi0gICAgICAgICsrbF90Y2NwLT5udW1yZXNvbHV0aW9uczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGNjcC0+bnVtcmVzb2x1dGlvbnMgPSByZWFkKCkgKyAxICovCi0gICAgICAgIGlmIChsX3RjY3AtPm51bXJlc29sdXRpb25zID4gT1BKX0oyS19NQVhSTFZMUykgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCB2YWx1ZSBmb3IgbnVtcmVzb2x1dGlvbnMgOiAlZCwgbWF4IHZhbHVlIGlzIHNldCBpbiBvcGVuanBlZy5oIGF0ICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90Y2NwLT5udW1yZXNvbHV0aW9ucywgT1BKX0oyS19NQVhSTFZMUyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICArK2xfY3VycmVudF9wdHI7Ci0KLSAgICAgICAgLyogSWYgdXNlciB3YW50cyB0byByZW1vdmUgbW9yZSByZXNvbHV0aW9ucyB0aGFuIHRoZSBjb2Rlc3RyZWFtIGNvbnRhaW5zLCByZXR1cm4gZXJyb3IgKi8KLSAgICAgICAgaWYgKGxfY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWMubV9yZWR1Y2UgPj0gbF90Y2NwLT5udW1yZXNvbHV0aW9ucykgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciBkZWNvZGluZyBjb21wb25lbnQgJWQuXG5UaGUgbnVtYmVyIG9mIHJlc29sdXRpb25zIHRvIHJlbW92ZSBpcyBoaWdoZXIgdGhhbiB0aGUgbnVtYmVyICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2YgcmVzb2x1dGlvbnMgb2YgdGhpcyBjb21wb25lbnRcbk1vZGlmeSB0aGUgY3BfcmVkdWNlIHBhcmFtZXRlci5cblxuIiwgY29tcG5vKTsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSB8PSAweDgwMDA7LyogRklYTUUgSjJLX0RFQ19TVEFURV9FUlI7Ki8KLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgb3BqX3JlYWRfYnl0ZXMobF9jdXJyZW50X3B0ciwmbF90Y2NwLT5jYmxrdyAsMSk7ICAgICAgICAgICAgICAgIC8qIFNQY29jIChFKSAqLwotICAgICAgICArK2xfY3VycmVudF9wdHI7Ci0gICAgICAgIGxfdGNjcC0+Y2Jsa3cgKz0gMjsKLQotICAgICAgICBvcGpfcmVhZF9ieXRlcyhsX2N1cnJlbnRfcHRyLCZsX3RjY3AtPmNibGtoICwxKTsgICAgICAgICAgICAgICAgLyogU1Bjb2MgKEYpICovCi0gICAgICAgICsrbF9jdXJyZW50X3B0cjsKLSAgICAgICAgbF90Y2NwLT5jYmxraCArPSAyOwotCi0gICAgICAgIGlmICgobF90Y2NwLT5jYmxrdyA+IDEwKSB8fCAobF90Y2NwLT5jYmxraCA+IDEwKSB8fCAoKGxfdGNjcC0+Y2Jsa3cgKyBsX3RjY3AtPmNibGtoKSA+IDEyKSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFNQQ29kIFNQQ29jIGVsZW1lbnQsIEludmFsaWQgY2Jsa3cvY2Jsa2ggY29tYmluYXRpb25cbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQkKLQotICAgICAgICBvcGpfcmVhZF9ieXRlcyhsX2N1cnJlbnRfcHRyLCZsX3RjY3AtPmNibGtzdHkgLDEpOyAgICAgICAgICAgICAgLyogU1Bjb2MgKEcpICovCi0gICAgICAgICsrbF9jdXJyZW50X3B0cjsKLQotICAgICAgICBvcGpfcmVhZF9ieXRlcyhsX2N1cnJlbnRfcHRyLCZsX3RjY3AtPnFtZmJpZCAsMSk7ICAgICAgICAgICAgICAgLyogU1Bjb2MgKEgpICovCi0gICAgICAgICsrbF9jdXJyZW50X3B0cjsKLQotICAgICAgICAqcF9oZWFkZXJfc2l6ZSA9ICpwX2hlYWRlcl9zaXplIC0gNTsKLQotICAgICAgICAvKiB1c2UgY3VzdG9tIHByZWNpbmN0IHNpemUgPyAqLwotICAgICAgICBpZiAobF90Y2NwLT5jc3R5ICYgSjJLX0NDUF9DU1RZX1BSVCkgewotICAgICAgICAgICAgICAgIGlmICgqcF9oZWFkZXJfc2l6ZSA8IGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFNQQ29kIFNQQ29jIGVsZW1lbnRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgICAgIChpID0gMDsgaSA8IGxfdGNjcC0+bnVtcmVzb2x1dGlvbnM7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMobF9jdXJyZW50X3B0ciwmbF90bXAgLDEpOyAgICAgICAgICAgICAgICAvKiBTUGNvYyAoSV9pKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKytsX2N1cnJlbnRfcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJlY2luY3QgZXhwb25lbnQgMCBpcyBvbmx5IGFsbG93ZWQgZm9yIGxvd2VzdCByZXNvbHV0aW9uIGxldmVsIChUYWJsZSBBLjIxKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpICE9IDApICYmICgoKGxfdG1wICYgMHhmKSA9PSAwKSB8fCAoKGxfdG1wID4+IDQpID09IDApKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSW52YWxpZCBwcmVjaW5jdCBzaXplXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNjcC0+cHJjd1tpXSA9IGxfdG1wICYgMHhmOwotICAgICAgICAgICAgICAgICAgICAgICAgbF90Y2NwLT5wcmNoW2ldID0gbF90bXAgPj4gNDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAqcF9oZWFkZXJfc2l6ZSA9ICpwX2hlYWRlcl9zaXplIC0gbF90Y2NwLT5udW1yZXNvbHV0aW9uczsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiBzZXQgZGVmYXVsdCBzaXplIGZvciB0aGUgcHJlY2luY3Qgd2lkdGggYW5kIGhlaWdodCAqLwotICAgICAgICAgICAgICAgIGZvciAgICAgKGkgPSAwOyBpIDwgbF90Y2NwLT5udW1yZXNvbHV0aW9uczsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX3RjY3AtPnByY3dbaV0gPSAxNTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNjcC0+cHJjaFtpXSA9IDE1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0jaWZkZWYgV0lQX1JFTU9WRV9NU0QKLSAgICAgICAgLyogSU5ERVggPj4gKi8KLSAgICAgICAgaWYgKHBfajJrLT5jc3RyX2luZm8gJiYgY29tcG5vID09IDApIHsKLSAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxfZGF0YV9zaXplID0gbF90Y2NwLT5udW1yZXNvbHV0aW9ucyAqIHNpemVvZihPUEpfVUlOVDMyKTsKLQotICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPnRpbGVbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udGNjcF9pbmZvW2NvbXBub10uY2Jsa2ggPSBsX3RjY3AtPmNibGtoOwotICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPnRpbGVbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udGNjcF9pbmZvW2NvbXBub10uY2Jsa3cgPSBsX3RjY3AtPmNibGt3OwotICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPnRpbGVbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udGNjcF9pbmZvW2NvbXBub10ubnVtcmVzb2x1dGlvbnMgPSBsX3RjY3AtPm51bXJlc29sdXRpb25zOwotICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPnRpbGVbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udGNjcF9pbmZvW2NvbXBub10uY2Jsa3N0eSA9IGxfdGNjcC0+Y2Jsa3N0eTsKLSAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmZvLT50aWxlW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRjY3BfaW5mb1tjb21wbm9dLnFtZmJpZCA9IGxfdGNjcC0+cW1mYmlkOwotCi0gICAgICAgICAgICAgICAgbWVtY3B5KHBfajJrLT5jc3RyX2luZm8tPnRpbGVbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0ucGR4LGxfdGNjcC0+cHJjdywgbF9kYXRhX3NpemUpOwotICAgICAgICAgICAgICAgIG1lbWNweShwX2oyay0+Y3N0cl9pbmZvLT50aWxlW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnBkeSxsX3RjY3AtPnByY2gsIGxfZGF0YV9zaXplKTsKLSAgICAgICAgfQotICAgICAgICAvKiA8PCBJTkRFWCAqLwotI2VuZGlmCi0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi12b2lkIG9wal9qMmtfY29weV90aWxlX2NvbXBvbmVudF9wYXJhbWV0ZXJzKCBvcGpfajJrX3QgKnBfajJrICkKLXsKLSAgICAgICAgLyogbG9vcCAqLwotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIG9wal9jcF90ICpsX2NwID0gTlVMTDsKLSAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IE5VTEw7Ci0gICAgICAgIG9wal90Y2NwX3QgKmxfcmVmX3RjY3AgPSBOVUxMLCAqbF9jb3BpZWRfdGNjcCA9IE5VTEw7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9wcmNfc2l6ZTsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0KLSAgICAgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOwotICAgICAgICBsX3RjcCA9IChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9PSBKMktfU1RBVEVfVFBIKSA/IC8qIEZJWE1FIEoyS19ERUNfU1RBVEVfVFBIKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfY3AtPnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0gOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcDsKLQotICAgICAgICBsX3JlZl90Y2NwID0gJmxfdGNwLT50Y2Nwc1swXTsKLSAgICAgICAgbF9jb3BpZWRfdGNjcCA9IGxfcmVmX3RjY3AgKyAxOwotICAgICAgICBsX3ByY19zaXplID0gbF9yZWZfdGNjcC0+bnVtcmVzb2x1dGlvbnMgKiAoT1BKX1VJTlQzMilzaXplb2YoT1BKX1VJTlQzMik7Ci0KLSAgICAgICAgZm9yICAgICAoaT0xOyBpPHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOyArK2kpIHsKLSAgICAgICAgICAgICAgICBsX2NvcGllZF90Y2NwLT5udW1yZXNvbHV0aW9ucyA9IGxfcmVmX3RjY3AtPm51bXJlc29sdXRpb25zOwotICAgICAgICAgICAgICAgIGxfY29waWVkX3RjY3AtPmNibGt3ID0gbF9yZWZfdGNjcC0+Y2Jsa3c7Ci0gICAgICAgICAgICAgICAgbF9jb3BpZWRfdGNjcC0+Y2Jsa2ggPSBsX3JlZl90Y2NwLT5jYmxraDsKLSAgICAgICAgICAgICAgICBsX2NvcGllZF90Y2NwLT5jYmxrc3R5ID0gbF9yZWZfdGNjcC0+Y2Jsa3N0eTsKLSAgICAgICAgICAgICAgICBsX2NvcGllZF90Y2NwLT5xbWZiaWQgPSBsX3JlZl90Y2NwLT5xbWZiaWQ7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGxfY29waWVkX3RjY3AtPnByY3csbF9yZWZfdGNjcC0+cHJjdyxsX3ByY19zaXplKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkobF9jb3BpZWRfdGNjcC0+cHJjaCxsX3JlZl90Y2NwLT5wcmNoLGxfcHJjX3NpemUpOwotICAgICAgICAgICAgICAgICsrbF9jb3BpZWRfdGNjcDsKLSAgICAgICAgfQotfQotCi1PUEpfVUlOVDMyIG9wal9qMmtfZ2V0X1NRY2RfU1FjY19zaXplICggb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX25vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8gKQotewotICAgICAgICBPUEpfVUlOVDMyIGxfbnVtX2JhbmRzOwotCi0gICAgICAgIG9wal9jcF90ICpsX2NwID0gMDA7Ci0gICAgICAgIG9wal90Y3BfdCAqbF90Y3AgPSAwMDsKLSAgICAgICAgb3BqX3RjY3BfdCAqbF90Y2NwID0gMDA7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotCi0gICAgICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKLSAgICAgICAgbF90Y3AgPSAmbF9jcC0+dGNwc1twX3RpbGVfbm9dOwotICAgICAgICBsX3RjY3AgPSAmbF90Y3AtPnRjY3BzW3BfY29tcF9ub107Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyBhZ2FpbiAqLwotICAgICAgICBhc3NlcnQocF90aWxlX25vIDwgbF9jcC0+dHcgKiBsX2NwLT50aCk7Ci0gICAgICAgIGFzc2VydChwX2NvbXBfbm8gPCBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wcyk7Ci0KLSAgICAgICAgbF9udW1fYmFuZHMgPSAobF90Y2NwLT5xbnRzdHkgPT0gSjJLX0NDUF9RTlRTVFlfU0lRTlQpID8gMSA6IChsX3RjY3AtPm51bXJlc29sdXRpb25zICogMyAtIDIpOwotCi0gICAgICAgIGlmIChsX3RjY3AtPnFudHN0eSA9PSBKMktfQ0NQX1FOVFNUWV9OT1FOVCkgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMSArIGxfbnVtX2JhbmRzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiAxICsgMipsX251bV9iYW5kczsKLSAgICAgICAgfQotfQotCi1PUEpfQk9PTCBvcGpfajJrX3dyaXRlX1NRY2RfU1FjYyggICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9ubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29tcF9ubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlciApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9oZWFkZXJfc2l6ZTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2JhbmRfbm8sIGxfbnVtX2JhbmRzOwotICAgICAgICBPUEpfVUlOVDMyIGxfZXhwbixsX21hbnQ7Ci0KLSAgICAgICAgb3BqX2NwX3QgKmxfY3AgPSAwMDsKLSAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOwotICAgICAgICBvcGpfdGNjcF90ICpsX3RjY3AgPSAwMDsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX2hlYWRlcl9zaXplICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX2RhdGEgIT0gMDApOwotCi0gICAgICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKLSAgICAgICAgbF90Y3AgPSAmbF9jcC0+dGNwc1twX3RpbGVfbm9dOwotICAgICAgICBsX3RjY3AgPSAmbF90Y3AtPnRjY3BzW3BfY29tcF9ub107Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyBhZ2FpbiAqLwotICAgICAgICBhc3NlcnQocF90aWxlX25vIDwgbF9jcC0+dHcgKiBsX2NwLT50aCk7Ci0gICAgICAgIGFzc2VydChwX2NvbXBfbm8gPHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzKTsKLQotICAgICAgICBsX251bV9iYW5kcyA9IChsX3RjY3AtPnFudHN0eSA9PSBKMktfQ0NQX1FOVFNUWV9TSVFOVCkgPyAxIDogKGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMgKiAzIC0gMik7Ci0KLSAgICAgICAgaWYgKGxfdGNjcC0+cW50c3R5ID09IEoyS19DQ1BfUU5UU1RZX05PUU5UKSAgewotICAgICAgICAgICAgICAgIGxfaGVhZGVyX3NpemUgPSAxICsgbF9udW1fYmFuZHM7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKnBfaGVhZGVyX3NpemUgPCBsX2hlYWRlcl9zaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd3JpdGluZyBTUWNkIFNRY2MgZWxlbWVudFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhwX2RhdGEsbF90Y2NwLT5xbnRzdHkgKyAobF90Y2NwLT5udW1nYml0cyA8PCA1KSwgMSk7ICAgIC8qIFNxY3ggKi8KLSAgICAgICAgICAgICAgICArK3BfZGF0YTsKLQotICAgICAgICAgICAgICAgIGZvciAobF9iYW5kX25vID0gMDsgbF9iYW5kX25vIDwgbF9udW1fYmFuZHM7ICsrbF9iYW5kX25vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX2V4cG4gPSAoT1BKX1VJTlQzMilsX3RjY3AtPnN0ZXBzaXplc1tsX2JhbmRfbm9dLmV4cG47Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLCBsX2V4cG4gPDwgMywgMSk7ICAgICAgICAvKiBTUHFjeF9pICovCi0gICAgICAgICAgICAgICAgICAgICAgICArK3BfZGF0YTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbF9oZWFkZXJfc2l6ZSA9IDEgKyAyKmxfbnVtX2JhbmRzOwotCi0gICAgICAgICAgICAgICAgaWYgKCpwX2hlYWRlcl9zaXplIDwgbF9oZWFkZXJfc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdyaXRpbmcgU1FjZCBTUWNjIGVsZW1lbnRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLGxfdGNjcC0+cW50c3R5ICsgKGxfdGNjcC0+bnVtZ2JpdHMgPDwgNSksIDEpOyAgICAvKiBTcWN4ICovCi0gICAgICAgICAgICAgICAgKytwX2RhdGE7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGxfYmFuZF9ubyA9IDA7IGxfYmFuZF9ubyA8IGxfbnVtX2JhbmRzOyArK2xfYmFuZF9ubykgewotICAgICAgICAgICAgICAgICAgICAgICAgbF9leHBuID0gKE9QSl9VSU5UMzIpbF90Y2NwLT5zdGVwc2l6ZXNbbF9iYW5kX25vXS5leHBuOwotICAgICAgICAgICAgICAgICAgICAgICAgbF9tYW50ID0gKE9QSl9VSU5UMzIpbF90Y2NwLT5zdGVwc2l6ZXNbbF9iYW5kX25vXS5tYW50OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLCAobF9leHBuIDw8IDExKSArIGxfbWFudCwgMik7ICAgIC8qIFNQcWN4X2kgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YSArPSAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgICpwX2hlYWRlcl9zaXplID0gKnBfaGVhZGVyX3NpemUgLSBsX2hlYWRlcl9zaXplOwotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX0JPT0wgb3BqX2oya19yZWFkX1NRY2RfU1FjYyhvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSogcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgICAgIC8qIGxvb3AqLwotICAgICAgICBPUEpfVUlOVDMyIGxfYmFuZF9ubzsKLSAgICAgICAgb3BqX2NwX3QgKmxfY3AgPSAwMDsKLSAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOwotICAgICAgICBvcGpfdGNjcF90ICpsX3RjY3AgPSAwMDsKLSAgICAgICAgT1BKX0JZVEUgKiBsX2N1cnJlbnRfcHRyID0gMDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF90bXAsIGxfbnVtX2JhbmQ7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7Ci0KLSAgICAgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOwotICAgICAgICAvKiBjb21lIGZyb20gdGlsZSBwYXJ0IGhlYWRlciBvciBtYWluIGhlYWRlciA/Ki8KLSAgICAgICAgbF90Y3AgPSAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPT0gSjJLX1NUQVRFX1RQSCkgPyAvKkZJWE1FIEoyS19ERUNfU1RBVEVfVFBIKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfY3AtPnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0gOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcDsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb24gYWdhaW4qLwotICAgICAgICBhc3NlcnQocF9jb21wX25vIDwgIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzKTsKLQotICAgICAgICBsX3RjY3AgPSAmbF90Y3AtPnRjY3BzW3BfY29tcF9ub107Ci0gICAgICAgIGxfY3VycmVudF9wdHIgPSBwX2hlYWRlcl9kYXRhOwotCi0gICAgICAgIGlmICgqcF9oZWFkZXJfc2l6ZSA8IDEpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBTUWNkIG9yIFNRY2MgZWxlbWVudFxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICAqcF9oZWFkZXJfc2l6ZSAtPSAxOwotCi0gICAgICAgIG9wal9yZWFkX2J5dGVzKGxfY3VycmVudF9wdHIsICZsX3RtcCAsMSk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTcWN4ICovCi0gICAgICAgICsrbF9jdXJyZW50X3B0cjsKLQotICAgICAgICBsX3RjY3AtPnFudHN0eSA9IGxfdG1wICYgMHgxZjsKLSAgICAgICAgbF90Y2NwLT5udW1nYml0cyA9IGxfdG1wID4+IDU7Ci0gICAgICAgIGlmIChsX3RjY3AtPnFudHN0eSA9PSBKMktfQ0NQX1FOVFNUWV9TSVFOVCkgewotICAgICAgICBsX251bV9iYW5kID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBsX251bV9iYW5kID0gKGxfdGNjcC0+cW50c3R5ID09IEoyS19DQ1BfUU5UU1RZX05PUU5UKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBfaGVhZGVyX3NpemUpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcF9oZWFkZXJfc2l6ZSkgLyAyOwotCi0gICAgICAgICAgICAgICAgaWYoIGxfbnVtX2JhbmQgPiBPUEpfSjJLX01BWEJBTkRTICkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiV2hpbGUgcmVhZGluZyBDQ1BfUU5UU1RZIGVsZW1lbnQgaW5zaWRlIFFDRCBvciBRQ0MgbWFya2VyIHNlZ21lbnQsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWJlciBvZiBzdWJiYW5kcyAoJWQpIGlzIGdyZWF0ZXIgdG8gT1BKX0oyS19NQVhCQU5EUyAoJWQpLiBTbyB3ZSBsaW1pdCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHN0b3JlZCB0byAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPUEpfSjJLX01BWEJBTkRTICglZCkgYW5kIHNraXAgdGhlIHJlc3QuIFxuIiwgbF9udW1fYmFuZCwgT1BKX0oyS19NQVhCQU5EUywgT1BKX0oyS19NQVhCQU5EUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKnJldHVybiBPUEpfRkFMU0U7Ki8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotI2lmZGVmIFVTRV9KUFdMCi0gICAgICAgIGlmIChsX2NwLT5jb3JyZWN0KSB7Ci0KLSAgICAgICAgICAgICAgICAvKiBpZiBKUFdMIGlzIG9uLCB3ZSBjaGVjayB3aGV0aGVyIHRoZXJlIGFyZSB0b28gbWFueSBzdWJiYW5kcyAqLwotICAgICAgICAgICAgICAgIGlmICgvKihsX251bV9iYW5kIDwgMCkgfHwqLyAobF9udW1fYmFuZCA+PSBPUEpfSjJLX01BWEJBTkRTKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEpQV0xfQVNTVU1FID8gRVZUX1dBUk5JTkcgOiBFVlRfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKUFdMOiBiYWQgbnVtYmVyIG9mIHN1YmJhbmRzIGluIFNxY3ggKCVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9udW1fYmFuZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUpQV0xfQVNTVU1FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJKUFdMOiBnaXZpbmcgdXBcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UgdHJ5IHRvIGNvcnJlY3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGxfbnVtX2JhbmQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiLSB0cnlpbmcgdG8gYWRqdXN0IHRoZW1cbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0gc2V0dGluZyBudW1iZXIgb2YgYmFuZHMgdG8gJWQgPT4gSFlQT1RIRVNJUyEhIVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9udW1fYmFuZCk7Ci0gICAgICAgICAgICAgICAgfTsKLQotICAgICAgICB9OwotI2VuZGlmIC8qIFVTRV9KUFdMICovCi0KLSAgICAgICAgaWYgKGxfdGNjcC0+cW50c3R5ID09IEoyS19DQ1BfUU5UU1RZX05PUU5UKSB7Ci0gICAgICAgICAgICAgICAgZm9yICAgICAobF9iYW5kX25vID0gMDsgbF9iYW5kX25vIDwgbF9udW1fYmFuZDsgbF9iYW5kX25vKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKGxfY3VycmVudF9wdHIsICZsX3RtcCAsMSk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTUHFjeF9pICovCi0gICAgICAgICAgICAgICAgICAgICAgICArK2xfY3VycmVudF9wdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9iYW5kX25vIDwgT1BKX0oyS19NQVhCQU5EUyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNjcC0+c3RlcHNpemVzW2xfYmFuZF9ub10uZXhwbiA9IChPUEpfSU5UMzIpKGxfdG1wID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RjY3AtPnN0ZXBzaXplc1tsX2JhbmRfbm9dLm1hbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAqcF9oZWFkZXJfc2l6ZSA9ICpwX2hlYWRlcl9zaXplIC0gbF9udW1fYmFuZDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgICAgIChsX2JhbmRfbm8gPSAwOyBsX2JhbmRfbm8gPCBsX251bV9iYW5kOyBsX2JhbmRfbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMobF9jdXJyZW50X3B0ciwgJmxfdG1wICwyKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFNQcWN4X2kgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9wdHIrPTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9iYW5kX25vIDwgT1BKX0oyS19NQVhCQU5EUyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNjcC0+c3RlcHNpemVzW2xfYmFuZF9ub10uZXhwbiA9IChPUEpfSU5UMzIpKGxfdG1wID4+IDExKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90Y2NwLT5zdGVwc2l6ZXNbbF9iYW5kX25vXS5tYW50ID0gbF90bXAgJiAweDdmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKnBfaGVhZGVyX3NpemUgPSAqcF9oZWFkZXJfc2l6ZSAtIDIqbF9udW1fYmFuZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFkZCBBbnRvbmluIDogaWYgc2NhbGFyX2Rlcml2ZWQgLT4gY29tcHV0ZSBvdGhlciBzdGVwc2l6ZXMgKi8KLSAgICAgICAgaWYgKGxfdGNjcC0+cW50c3R5ID09IEoyS19DQ1BfUU5UU1RZX1NJUU5UKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChsX2JhbmRfbm8gPSAxOyBsX2JhbmRfbm8gPCBPUEpfSjJLX01BWEJBTkRTOyBsX2JhbmRfbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgbF90Y2NwLT5zdGVwc2l6ZXNbbF9iYW5kX25vXS5leHBuID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPUEpfSU5UMzIpKGxfdGNjcC0+c3RlcHNpemVzWzBdLmV4cG4pIC0gKE9QSl9JTlQzMikoKGxfYmFuZF9ubyAtIDEpIC8gMykgPiAwKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMikobF90Y2NwLT5zdGVwc2l6ZXNbMF0uZXhwbikgLSAoT1BKX0lOVDMyKSgobF9iYW5kX25vIC0gMSkgLyAzKSA6IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX3RjY3AtPnN0ZXBzaXplc1tsX2JhbmRfbm9dLm1hbnQgPSBsX3RjY3AtPnN0ZXBzaXplc1swXS5tYW50OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotdm9pZCBvcGpfajJrX2NvcHlfdGlsZV9xdWFudGl6YXRpb25fcGFyYW1ldGVycyggb3BqX2oya190ICpwX2oyayApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgb3BqX2NwX3QgKmxfY3AgPSBOVUxMOwotICAgICAgICBvcGpfdGNwX3QgKmxfdGNwID0gTlVMTDsKLSAgICAgICAgb3BqX3RjY3BfdCAqbF9yZWZfdGNjcCA9IE5VTEw7Ci0gICAgICAgIG9wal90Y2NwX3QgKmxfY29waWVkX3RjY3AgPSBOVUxMOwotICAgICAgICBPUEpfVUlOVDMyIGxfc2l6ZTsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0KLSAgICAgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOwotICAgICAgICBsX3RjcCA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IEoyS19TVEFURV9UUEggPwotICAgICAgICAgICAgICAgICAgICAgICAgJmxfY3AtPnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0gOgotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3A7Ci0KLSAgICAgICAgbF9yZWZfdGNjcCA9ICZsX3RjcC0+dGNjcHNbMF07Ci0gICAgICAgIGxfY29waWVkX3RjY3AgPSBsX3JlZl90Y2NwICsgMTsKLSAgICAgICAgbF9zaXplID0gT1BKX0oyS19NQVhCQU5EUyAqIHNpemVvZihvcGpfc3RlcHNpemVfdCk7Ci0KLSAgICAgICAgZm9yICAgICAoaT0xO2k8cF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHM7KytpKSB7Ci0gICAgICAgICAgICAgICAgbF9jb3BpZWRfdGNjcC0+cW50c3R5ID0gbF9yZWZfdGNjcC0+cW50c3R5OwotICAgICAgICAgICAgICAgIGxfY29waWVkX3RjY3AtPm51bWdiaXRzID0gbF9yZWZfdGNjcC0+bnVtZ2JpdHM7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGxfY29waWVkX3RjY3AtPnN0ZXBzaXplcyxsX3JlZl90Y2NwLT5zdGVwc2l6ZXMsbF9zaXplKTsKLSAgICAgICAgICAgICAgICArK2xfY29waWVkX3RjY3A7Ci0gICAgICAgIH0KLX0KLQotc3RhdGljIHZvaWQgb3BqX2oya19kdW1wX3RpbGVfaW5mbyggb3BqX3RjcF90ICogbF9kZWZhdWx0X3RpbGUsT1BKX0lOVDMyIG51bWNvbXBzLEZJTEUqIG91dF9zdHJlYW0pCi17Ci0gICAgICAgIGlmIChsX2RlZmF1bHRfdGlsZSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBjb21wbm87Ci0KLSAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdCBkZWZhdWx0IHRpbGUge1xuIik7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHRcdCBjc3R5PSUjeFxuIiwgbF9kZWZhdWx0X3RpbGUtPmNzdHkpOwotICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHQgcHJnPSUjeFxuIiwgbF9kZWZhdWx0X3RpbGUtPnByZyk7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHRcdCBudW1sYXllcnM9JWRcbiIsIGxfZGVmYXVsdF90aWxlLT5udW1sYXllcnMpOwotICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHQgbWN0PSV4XG4iLCBsX2RlZmF1bHRfdGlsZS0+bWN0KTsKLQotICAgICAgICAgICAgICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgbnVtY29tcHM7IGNvbXBubysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNjcF90ICpsX3RjY3AgPSAmKGxfZGVmYXVsdF90aWxlLT50Y2Nwc1tjb21wbm9dKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcmVzbm87Ci0gICAgICBPUEpfSU5UMzIgYmFuZG5vLCBudW1iYW5kczsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogY29kaW5nIHN0eWxlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHQgY29tcCAlZCB7XG4iLCBjb21wbm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHRcdFx0IGNzdHk9JSN4XG4iLCBsX3RjY3AtPmNzdHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHRcdFx0IG51bXJlc29sdXRpb25zPSVkXG4iLCBsX3RjY3AtPm51bXJlc29sdXRpb25zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHRcdCBjYmxrdz0yXiVkXG4iLCBsX3RjY3AtPmNibGt3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHRcdCBjYmxraD0yXiVkXG4iLCBsX3RjY3AtPmNibGtoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHRcdCBjYmxrc3R5PSUjeFxuIiwgbF90Y2NwLT5jYmxrc3R5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHRcdCBxbWZiaWQ9JWRcbiIsIGxfdGNjcC0+cW1mYmlkKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHRcdFx0IHByZWNjaW50c2l6ZSAodyxoKT0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocmVzbm8gPSAwOyByZXNubyA8IGxfdGNjcC0+bnVtcmVzb2x1dGlvbnM7IHJlc25vKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiKCVkLCVkKSAiLCBsX3RjY3AtPnByY3dbcmVzbm9dLCBsX3RjY3AtPnByY2hbcmVzbm9dKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlxuIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHF1YW50aXphdGlvbiBzdHlsZSovCi0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0XHQgcW50c3R5PSVkXG4iLCBsX3RjY3AtPnFudHN0eSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0XHQgbnVtZ2JpdHM9JWRcbiIsIGxfdGNjcC0+bnVtZ2JpdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHRcdFx0IHN0ZXBzaXplcyAobSxlKT0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bWJhbmRzID0gKGxfdGNjcC0+cW50c3R5ID09IEoyS19DQ1BfUU5UU1RZX1NJUU5UKSA/IDEgOiAoT1BKX0lOVDMyKWxfdGNjcC0+bnVtcmVzb2x1dGlvbnMgKiAzIC0gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgbnVtYmFuZHM7IGJhbmRubysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIiglZCwlZCkgIiwgbF90Y2NwLT5zdGVwc2l6ZXNbYmFuZG5vXS5tYW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNjcC0+c3RlcHNpemVzW2JhbmRub10uZXhwbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcbiIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBSR04gdmFsdWUqLwotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHRcdFx0IHJvaXNoaWZ0PSVkXG4iLCBsX3RjY3AtPnJvaXNoaWZ0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHRcdCB9XG4iKTsKLSAgICAgICAgICAgICAgICB9IC8qZW5kIG9mIGNvbXBvbmVudCBvZiBkZWZhdWx0IHRpbGUqLwotICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0IH1cbiIpOyAvKmVuZCBvZiBkZWZhdWx0IHRpbGUqLwotICAgICAgICAgICAgfQotfQotCi12b2lkIGoya19kdW1wIChvcGpfajJrX3QqIHBfajJrLCBPUEpfSU5UMzIgZmxhZywgRklMRSogb3V0X3N0cmVhbSkKLXsKLSAgICAgICAgLyogQ2hlY2sgaWYgdGhlIGZsYWcgaXMgY29tcGF0aWJsZSB3aXRoIGoyayBmaWxlKi8KLSAgICAgICAgaWYgKCAoZmxhZyAmIE9QSl9KUDJfSU5GTykgfHwgKGZsYWcgJiBPUEpfSlAyX0lORCkpewotICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIldyb25nIGZsYWdcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIER1bXAgdGhlIGltYWdlX2hlYWRlciAqLwotICAgICAgICBpZiAoZmxhZyAmIE9QSl9JTUdfSU5GTyl7Ci0gICAgICAgICAgICAgICAgaWYgKHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UpCi0gICAgICAgICAgICAgICAgICAgICAgICBqMmtfZHVtcF9pbWFnZV9oZWFkZXIocF9qMmstPm1fcHJpdmF0ZV9pbWFnZSwgMCwgb3V0X3N0cmVhbSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBEdW1wIHRoZSBjb2Rlc3RyZWFtIGluZm8gZnJvbSBtYWluIGhlYWRlciAqLwotICAgICAgICBpZiAoZmxhZyAmIE9QSl9KMktfTUhfSU5GTyl7Ci0gICAgICAgICAgICAgICAgb3BqX2oya19kdW1wX01IX2luZm8ocF9qMmssIG91dF9zdHJlYW0pOwotICAgICAgICB9Ci0gICAgICAgIC8qIER1bXAgYWxsIHRpbGUvY29kZXN0cmVhbSBpbmZvICovCi0gICAgICAgIGlmIChmbGFnICYgT1BKX0oyS19UQ0hfSU5GTyl7Ci0gICAgICAgICAgT1BKX1VJTlQzMiBsX25iX3RpbGVzID0gcF9qMmstPm1fY3AudGggKiBwX2oyay0+bV9jcC50dzsKLSAgICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgICAgb3BqX3RjcF90ICogbF90Y3AgPSBwX2oyay0+bV9jcC50Y3BzOwotICAgICAgICAgIGZvciAoaT0wO2k8bF9uYl90aWxlczsrK2kpIHsKLSAgICAgICAgICAgIG9wal9qMmtfZHVtcF90aWxlX2luZm8oIGxfdGNwLChPUEpfSU5UMzIpcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHMsIG91dF9zdHJlYW0pOwotICAgICAgICAgICAgKytsX3RjcDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBEdW1wIHRoZSBjb2Rlc3RyZWFtIGluZm8gb2YgdGhlIGN1cnJlbnQgdGlsZSAqLwotICAgICAgICBpZiAoZmxhZyAmIE9QSl9KMktfVEhfSU5GTyl7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIER1bXAgdGhlIGNvZGVzdHJlYW0gaW5kZXggZnJvbSBtYWluIGhlYWRlciAqLwotICAgICAgICBpZiAoZmxhZyAmIE9QSl9KMktfTUhfSU5EKXsKLSAgICAgICAgICAgICAgICBvcGpfajJrX2R1bXBfTUhfaW5kZXgocF9qMmssIG91dF9zdHJlYW0pOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogRHVtcCB0aGUgY29kZXN0cmVhbSBpbmRleCBvZiB0aGUgY3VycmVudCB0aWxlICovCi0gICAgICAgIGlmIChmbGFnICYgT1BKX0oyS19USF9JTkQpewotCi0gICAgICAgIH0KLQotfQotCi12b2lkIG9wal9qMmtfZHVtcF9NSF9pbmRleChvcGpfajJrX3QqIHBfajJrLCBGSUxFKiBvdXRfc3RyZWFtKQotewotICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmRleF90KiBjc3RyX2luZGV4ID0gcF9qMmstPmNzdHJfaW5kZXg7Ci0gICAgICAgIE9QSl9VSU5UMzIgaXRfbWFya2VyLCBpdF90aWxlLCBpdF90aWxlX3BhcnQ7Ci0KLSAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiQ29kZXN0cmVhbSBpbmRleCBmcm9tIG1haW4gaGVhZGVyOiB7XG4iKTsKLQotICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdCBNYWluIGhlYWRlciBzdGFydCBwb3NpdGlvbj0lIiBQUklpNjQgIlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0IE1haW4gaGVhZGVyIGVuZCBwb3NpdGlvbj0lIiBQUklpNjQgIlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5kZXgtPm1haW5faGVhZF9zdGFydCwgY3N0cl9pbmRleC0+bWFpbl9oZWFkX2VuZCk7Ci0KLSAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHQgTWFya2VyIGxpc3Q6IHtcbiIpOwotCi0gICAgICAgIGlmIChjc3RyX2luZGV4LT5tYXJrZXIpewotICAgICAgICAgICAgICAgIGZvciAoaXRfbWFya2VyPTA7IGl0X21hcmtlciA8IGNzdHJfaW5kZXgtPm1hcmtudW0gOyBpdF9tYXJrZXIrKyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0IHR5cGU9JSN4LCBwb3M9JSIgUFJJaTY0ICIsIGxlbj0lZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT5tYXJrZXJbaXRfbWFya2VyXS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5kZXgtPm1hcmtlcltpdF9tYXJrZXJdLnBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT5tYXJrZXJbaXRfbWFya2VyXS5sZW4gKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdCB9XG4iKTsKLQotICAgICAgICBpZiAoY3N0cl9pbmRleC0+dGlsZV9pbmRleCl7Ci0KLSAgICAgICAgLyogU2ltcGxlIHRlc3QgdG8gYXZvaWQgdG8gd3JpdGUgZW1wdHkgaW5mb3JtYXRpb24qLwotICAgICAgICBPUEpfVUlOVDMyIGxfYWNjX25iX29mX3RpbGVfcGFydCA9IDA7Ci0gICAgICAgIGZvciAoaXRfdGlsZT0wOyBpdF90aWxlIDwgY3N0cl9pbmRleC0+bmJfb2ZfdGlsZXMgOyBpdF90aWxlKyspewotICAgICAgICAgICAgICAgICAgICAgICAgbF9hY2NfbmJfb2ZfdGlsZV9wYXJ0ICs9IGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubmJfdHBzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxfYWNjX25iX29mX3RpbGVfcGFydCkKLSAgICAgICAgewotICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHQgVGlsZSBpbmRleDoge1xuIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpdF90aWxlPTA7IGl0X3RpbGUgPCBjc3RyX2luZGV4LT5uYl9vZl90aWxlcyA7IGl0X3RpbGUrKyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBuYl9vZl90aWxlX3BhcnQgPSBjc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm5iX3RwczsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHQgbmIgb2YgdGlsZS1wYXJ0IGluIHRpbGUgWyVkXT0lZFxuIiwgaXRfdGlsZSwgbmJfb2ZfdGlsZV9wYXJ0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLnRwX2luZGV4KXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaXRfdGlsZV9wYXJ0ID0wOyBpdF90aWxlX3BhcnQgPCBuYl9vZl90aWxlX3BhcnQ7IGl0X3RpbGVfcGFydCsrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHRcdFx0IHRpbGUtcGFydFslZF06IHN0YXJfcG9zPSUiIFBSSWk2NCAiLCBlbmRfaGVhZGVyPSUiIFBSSWk2NCAiLCBlbmRfcG9zPSUiIFBSSWk2NCAiLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0X3RpbGVfcGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXhbaXRfdGlsZV9wYXJ0XS5zdGFydF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLnRwX2luZGV4W2l0X3RpbGVfcGFydF0uZW5kX2hlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXhbaXRfdGlsZV9wYXJ0XS5lbmRfcG9zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrZXIpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpdF9tYXJrZXI9MDsgaXRfbWFya2VyIDwgY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrbnVtIDsgaXRfbWFya2VyKyspewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0IHR5cGU9JSN4LCBwb3M9JSIgUFJJaTY0ICIsIGxlbj0lZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya2VyW2l0X21hcmtlcl0udHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya2VyW2l0X21hcmtlcl0ucG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrZXJbaXRfbWFya2VyXS5sZW4gKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCJcdCB9XG4iKTsKLSAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCJ9XG4iKTsKLQotfQotCi0KLXZvaWQgb3BqX2oya19kdW1wX01IX2luZm8ob3BqX2oya190KiBwX2oyaywgRklMRSogb3V0X3N0cmVhbSkKLXsKLQotICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJDb2Rlc3RyZWFtIGluZm8gZnJvbSBtYWluIGhlYWRlcjoge1xuIik7Ci0KLSAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHQgdHgwPSVkLCB0eTA9JWRcbiIsIHBfajJrLT5tX2NwLnR4MCwgcF9qMmstPm1fY3AudHkwKTsKLSAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHQgdGR4PSVkLCB0ZHk9JWRcbiIsIHBfajJrLT5tX2NwLnRkeCwgcF9qMmstPm1fY3AudGR5KTsKLSAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHQgdHc9JWQsIHRoPSVkXG4iLCBwX2oyay0+bV9jcC50dywgcF9qMmstPm1fY3AudGgpOwotICAgICAgICBvcGpfajJrX2R1bXBfdGlsZV9pbmZvKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwLChPUEpfSU5UMzIpcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHMsIG91dF9zdHJlYW0pOwotICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJ9XG4iKTsKLX0KLQotdm9pZCBqMmtfZHVtcF9pbWFnZV9oZWFkZXIob3BqX2ltYWdlX3QqIGltZ19oZWFkZXIsIE9QSl9CT09MIGRldl9kdW1wX2ZsYWcsIEZJTEUqIG91dF9zdHJlYW0pCi17Ci0gICAgICAgIGNoYXIgdGFiWzJdOwotCi0gICAgICAgIGlmIChkZXZfZHVtcF9mbGFnKXsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIltERVZdIER1bXAgYW4gaW1hZ2VfaGVhZGVyIHN0cnVjdCB7XG4iKTsKLSAgICAgICAgICAgICAgICB0YWJbMF0gPSAnXDAnOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIkltYWdlIGluZm8ge1xuIik7Ci0gICAgICAgICAgICAgICAgdGFiWzBdID0gJ1x0Jzt0YWJbMV0gPSAnXDAnOwotICAgICAgICB9Ci0KLSAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiJXMgeDA9JWQsIHkwPSVkXG4iLCB0YWIsIGltZ19oZWFkZXItPngwLCBpbWdfaGVhZGVyLT55MCk7Ci0gICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgICAgICIlcyB4MT0lZCwgeTE9JWRcbiIsIHRhYiwgaW1nX2hlYWRlci0+eDEsIGltZ19oZWFkZXItPnkxKTsKLSAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiJXMgbnVtY29tcHM9JWRcbiIsIHRhYiwgaW1nX2hlYWRlci0+bnVtY29tcHMpOwotCi0gICAgICAgIGlmIChpbWdfaGVhZGVyLT5jb21wcyl7Ci0gICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBjb21wbm87Ci0gICAgICAgICAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBpbWdfaGVhZGVyLT5udW1jb21wczsgY29tcG5vKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIiVzXHQgY29tcG9uZW50ICVkIHtcbiIsIHRhYiwgY29tcG5vKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGoya19kdW1wX2ltYWdlX2NvbXBfaGVhZGVyKCYoaW1nX2hlYWRlci0+Y29tcHNbY29tcG5vXSksIGRldl9kdW1wX2ZsYWcsIG91dF9zdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCIlc31cbiIsdGFiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJ9XG4iKTsKLX0KLQotdm9pZCBqMmtfZHVtcF9pbWFnZV9jb21wX2hlYWRlcihvcGpfaW1hZ2VfY29tcF90KiBjb21wX2hlYWRlciwgT1BKX0JPT0wgZGV2X2R1bXBfZmxhZywgRklMRSogb3V0X3N0cmVhbSkKLXsKLSAgICAgICAgY2hhciB0YWJbM107Ci0KLSAgICAgICAgaWYgKGRldl9kdW1wX2ZsYWcpewotICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiW0RFVl0gRHVtcCBhbiBpbWFnZV9jb21wX2hlYWRlciBzdHJ1Y3Qge1xuIik7Ci0gICAgICAgICAgICAgICAgdGFiWzBdID0gJ1wwJzsKLSAgICAgICAgfSAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0YWJbMF0gPSAnXHQnO3RhYlsxXSA9ICdcdCc7dGFiWzJdID0gJ1wwJzsKLSAgICAgICAgfQotCi0gICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIiVzIGR4PSVkLCBkeT0lZFxuIiwgdGFiLCBjb21wX2hlYWRlci0+ZHgsIGNvbXBfaGVhZGVyLT5keSk7Ci0gICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIiVzIHByZWM9JWRcbiIsIHRhYiwgY29tcF9oZWFkZXItPnByZWMpOwotICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICIlcyBzZ25kPSVkXG4iLCB0YWIsIGNvbXBfaGVhZGVyLT5zZ25kKTsKLQotICAgICAgICBpZiAoZGV2X2R1bXBfZmxhZykKLSAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJ9XG4iKTsKLX0KLQotb3BqX2NvZGVzdHJlYW1faW5mb192Ml90KiBqMmtfZ2V0X2NzdHJfaW5mbyhvcGpfajJrX3QqIHBfajJrKQotewotICAgICAgICBPUEpfVUlOVDMyIGNvbXBubzsKLSAgICAgICAgT1BKX1VJTlQzMiBudW1jb21wcyA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOwotICAgICAgICBvcGpfdGNwX3QgKmxfZGVmYXVsdF90aWxlOwotICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmZvX3YyX3QqIGNzdHJfaW5mbyA9IChvcGpfY29kZXN0cmVhbV9pbmZvX3YyX3QqKSBvcGpfY2FsbG9jKDEsc2l6ZW9mKG9wal9jb2Rlc3RyZWFtX2luZm9fdjJfdCkpOwotCQlpZiAoIWNzdHJfaW5mbykKLQkJCXJldHVybiBOVUxMOwotCi0gICAgICAgIGNzdHJfaW5mby0+bmJjb21wcyA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOwotCi0gICAgICAgIGNzdHJfaW5mby0+dHgwID0gcF9qMmstPm1fY3AudHgwOwotICAgICAgICBjc3RyX2luZm8tPnR5MCA9IHBfajJrLT5tX2NwLnR5MDsKLSAgICAgICAgY3N0cl9pbmZvLT50ZHggPSBwX2oyay0+bV9jcC50ZHg7Ci0gICAgICAgIGNzdHJfaW5mby0+dGR5ID0gcF9qMmstPm1fY3AudGR5OwotICAgICAgICBjc3RyX2luZm8tPnR3ID0gcF9qMmstPm1fY3AudHc7Ci0gICAgICAgIGNzdHJfaW5mby0+dGggPSBwX2oyay0+bV9jcC50aDsKLQotICAgICAgICBjc3RyX2luZm8tPnRpbGVfaW5mbyA9IE5VTEw7IC8qIE5vdCBmaWxsIGZyb20gdGhlIG1haW4gaGVhZGVyKi8KLQotICAgICAgICBsX2RlZmF1bHRfdGlsZSA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwOwotCi0gICAgICAgIGNzdHJfaW5mby0+bV9kZWZhdWx0X3RpbGVfaW5mby5jc3R5ID0gbF9kZWZhdWx0X3RpbGUtPmNzdHk7Ci0gICAgICAgIGNzdHJfaW5mby0+bV9kZWZhdWx0X3RpbGVfaW5mby5wcmcgPSBsX2RlZmF1bHRfdGlsZS0+cHJnOwotICAgICAgICBjc3RyX2luZm8tPm1fZGVmYXVsdF90aWxlX2luZm8ubnVtbGF5ZXJzID0gbF9kZWZhdWx0X3RpbGUtPm51bWxheWVyczsKLSAgICAgICAgY3N0cl9pbmZvLT5tX2RlZmF1bHRfdGlsZV9pbmZvLm1jdCA9IGxfZGVmYXVsdF90aWxlLT5tY3Q7Ci0KLSAgICAgICAgY3N0cl9pbmZvLT5tX2RlZmF1bHRfdGlsZV9pbmZvLnRjY3BfaW5mbyA9IChvcGpfdGNjcF9pbmZvX3QqKSBvcGpfY2FsbG9jKGNzdHJfaW5mby0+bmJjb21wcywgc2l6ZW9mKG9wal90Y2NwX2luZm9fdCkpOwotCQlpZiAoIWNzdHJfaW5mby0+bV9kZWZhdWx0X3RpbGVfaW5mby50Y2NwX2luZm8pCi0JCXsKLQkJCW9wal9kZXN0cm95X2NzdHJfaW5mbygmY3N0cl9pbmZvKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0KLSAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBudW1jb21wczsgY29tcG5vKyspIHsKLSAgICAgICAgICAgICAgICBvcGpfdGNjcF90ICpsX3RjY3AgPSAmKGxfZGVmYXVsdF90aWxlLT50Y2Nwc1tjb21wbm9dKTsKLSAgICAgICAgICAgICAgICBvcGpfdGNjcF9pbmZvX3QgKmxfdGNjcF9pbmZvID0gJihjc3RyX2luZm8tPm1fZGVmYXVsdF90aWxlX2luZm8udGNjcF9pbmZvW2NvbXBub10pOwotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBiYW5kbm8sIG51bWJhbmRzOwotCi0gICAgICAgICAgICAgICAgLyogY29kaW5nIHN0eWxlKi8KLSAgICAgICAgICAgICAgICBsX3RjY3BfaW5mby0+Y3N0eSA9IGxfdGNjcC0+Y3N0eTsKLSAgICAgICAgICAgICAgICBsX3RjY3BfaW5mby0+bnVtcmVzb2x1dGlvbnMgPSBsX3RjY3AtPm51bXJlc29sdXRpb25zOwotICAgICAgICAgICAgICAgIGxfdGNjcF9pbmZvLT5jYmxrdyA9IGxfdGNjcC0+Y2Jsa3c7Ci0gICAgICAgICAgICAgICAgbF90Y2NwX2luZm8tPmNibGtoID0gbF90Y2NwLT5jYmxraDsKLSAgICAgICAgICAgICAgICBsX3RjY3BfaW5mby0+Y2Jsa3N0eSA9IGxfdGNjcC0+Y2Jsa3N0eTsKLSAgICAgICAgICAgICAgICBsX3RjY3BfaW5mby0+cW1mYmlkID0gbF90Y2NwLT5xbWZiaWQ7Ci0gICAgICAgICAgICAgICAgaWYgKGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMgPCBPUEpfSjJLX01BWFJMVkxTKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShsX3RjY3BfaW5mby0+cHJjaCwgbF90Y2NwLT5wcmNoLCBsX3RjY3AtPm51bXJlc29sdXRpb25zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShsX3RjY3BfaW5mby0+cHJjdywgbF90Y2NwLT5wcmN3LCBsX3RjY3AtPm51bXJlc29sdXRpb25zKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBxdWFudGl6YXRpb24gc3R5bGUqLwotICAgICAgICAgICAgICAgIGxfdGNjcF9pbmZvLT5xbnRzdHkgPSBsX3RjY3AtPnFudHN0eTsKLSAgICAgICAgICAgICAgICBsX3RjY3BfaW5mby0+bnVtZ2JpdHMgPSBsX3RjY3AtPm51bWdiaXRzOwotCi0gICAgICAgICAgICAgICAgbnVtYmFuZHMgPSAobF90Y2NwLT5xbnRzdHkgPT0gSjJLX0NDUF9RTlRTVFlfU0lRTlQpID8gMSA6IChPUEpfSU5UMzIpbF90Y2NwLT5udW1yZXNvbHV0aW9ucyAqIDMgLSAyOwotICAgICAgICAgICAgICAgIGlmIChudW1iYW5kcyA8IE9QSl9KMktfTUFYQkFORFMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgbnVtYmFuZHM7IGJhbmRubysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNjcF9pbmZvLT5zdGVwc2l6ZXNfbWFudFtiYW5kbm9dID0gKE9QSl9VSU5UMzIpbF90Y2NwLT5zdGVwc2l6ZXNbYmFuZG5vXS5tYW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RjY3BfaW5mby0+c3RlcHNpemVzX2V4cG5bYmFuZG5vXSA9IChPUEpfVUlOVDMyKWxfdGNjcC0+c3RlcHNpemVzW2JhbmRub10uZXhwbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBSR04gdmFsdWUqLwotICAgICAgICAgICAgICAgIGxfdGNjcF9pbmZvLT5yb2lzaGlmdCA9IGxfdGNjcC0+cm9pc2hpZnQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY3N0cl9pbmZvOwotfQotCi1vcGpfY29kZXN0cmVhbV9pbmRleF90KiBqMmtfZ2V0X2NzdHJfaW5kZXgob3BqX2oya190KiBwX2oyaykKLXsKLSAgICAgICAgb3BqX2NvZGVzdHJlYW1faW5kZXhfdCogbF9jc3RyX2luZGV4ID0gKG9wal9jb2Rlc3RyZWFtX2luZGV4X3QqKQotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NhbGxvYygxLHNpemVvZihvcGpfY29kZXN0cmVhbV9pbmRleF90KSk7Ci0gICAgICAgIGlmICghbF9jc3RyX2luZGV4KQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgICAgIGxfY3N0cl9pbmRleC0+bWFpbl9oZWFkX3N0YXJ0ID0gcF9qMmstPmNzdHJfaW5kZXgtPm1haW5faGVhZF9zdGFydDsKLSAgICAgICAgbF9jc3RyX2luZGV4LT5tYWluX2hlYWRfZW5kID0gcF9qMmstPmNzdHJfaW5kZXgtPm1haW5faGVhZF9lbmQ7Ci0gICAgICAgIGxfY3N0cl9pbmRleC0+Y29kZXN0cmVhbV9zaXplID0gcF9qMmstPmNzdHJfaW5kZXgtPmNvZGVzdHJlYW1fc2l6ZTsKLQotICAgICAgICBsX2NzdHJfaW5kZXgtPm1hcmtudW0gPSBwX2oyay0+Y3N0cl9pbmRleC0+bWFya251bTsKLSAgICAgICAgbF9jc3RyX2luZGV4LT5tYXJrZXIgPSAob3BqX21hcmtlcl9pbmZvX3QqKW9wal9tYWxsb2MobF9jc3RyX2luZGV4LT5tYXJrbnVtKnNpemVvZihvcGpfbWFya2VyX2luZm9fdCkpOwotICAgICAgICBpZiAoIWxfY3N0cl9pbmRleC0+bWFya2VyKXsKLSAgICAgICAgICAgICAgICBvcGpfZnJlZSggbF9jc3RyX2luZGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwX2oyay0+Y3N0cl9pbmRleC0+bWFya2VyKQotICAgICAgICAgICAgICAgIG1lbWNweShsX2NzdHJfaW5kZXgtPm1hcmtlciwgcF9qMmstPmNzdHJfaW5kZXgtPm1hcmtlciwgbF9jc3RyX2luZGV4LT5tYXJrbnVtICogc2l6ZW9mKG9wal9tYXJrZXJfaW5mb190KSApOwotICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3N0cl9pbmRleC0+bWFya2VyKTsKLSAgICAgICAgICAgICAgICBsX2NzdHJfaW5kZXgtPm1hcmtlciA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBsX2NzdHJfaW5kZXgtPm5iX29mX3RpbGVzID0gcF9qMmstPmNzdHJfaW5kZXgtPm5iX29mX3RpbGVzOwotICAgICAgICBsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXggPSAob3BqX3RpbGVfaW5kZXhfdCopb3BqX2NhbGxvYyhsX2NzdHJfaW5kZXgtPm5iX29mX3RpbGVzLCBzaXplb2Yob3BqX3RpbGVfaW5kZXhfdCkgKTsKLSAgICAgICAgaWYgKCFsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXgpewotICAgICAgICAgICAgICAgIG9wal9mcmVlKCBsX2NzdHJfaW5kZXgtPm1hcmtlcik7Ci0gICAgICAgICAgICAgICAgb3BqX2ZyZWUoIGxfY3N0cl9pbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4KXsKLSAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXgpOwotICAgICAgICAgICAgICAgIGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleCA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBpdF90aWxlID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKGl0X3RpbGUgPSAwOyBpdF90aWxlIDwgbF9jc3RyX2luZGV4LT5uYl9vZl90aWxlczsgaXRfdGlsZSsrICl7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRpbGUgTWFya2VyKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrbnVtID0gcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya251bTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcGpfbWFya2VyX2luZm9fdCopb3BqX21hbGxvYyhsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya251bSpzaXplb2Yob3BqX21hcmtlcl9pbmZvX3QpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya2VyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgaXRfdGlsZV9mcmVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaXRfdGlsZV9mcmVlPTA7IGl0X3RpbGVfZnJlZSA8IGl0X3RpbGU7IGl0X3RpbGVfZnJlZSsrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV9mcmVlXS5tYXJrZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUoIGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKCBsX2NzdHJfaW5kZXgtPm1hcmtlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKCBsX2NzdHJfaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCBsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtudW0gKiBzaXplb2Yob3BqX21hcmtlcl9pbmZvX3QpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRpbGUgcGFydCBpbmRleCovCi0gICAgICAgICAgICAgICAgICAgICAgICBsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubmJfdHBzID0gcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubmJfdHBzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3BqX3RwX2luZGV4X3QqKW9wal9tYWxsb2MobF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm5iX3RwcypzaXplb2Yob3BqX3RwX2luZGV4X3QpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS50cF9pbmRleCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgaXRfdGlsZV9mcmVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaXRfdGlsZV9mcmVlPTA7IGl0X3RpbGVfZnJlZSA8IGl0X3RpbGU7IGl0X3RpbGVfZnJlZSsrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV9mcmVlXS5tYXJrZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlX2ZyZWVdLnRwX2luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKCBsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZSggbF9jc3RyX2luZGV4LT5tYXJrZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZSggbF9jc3RyX2luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS50cF9pbmRleCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSggbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLnRwX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubmJfdHBzICogc2l6ZW9mKG9wal90cF9pbmRleF90KSApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLnRwX2luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLnRwX2luZGV4ID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogUGFja2V0IGluZGV4IChOT1QgVVNFRCkqLwotICAgICAgICAgICAgICAgICAgICAgICAgbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm5iX3BhY2tldCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ucGFja2V0X2luZGV4ID0gTlVMTDsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBsX2NzdHJfaW5kZXg7Ci19Ci0KLU9QSl9CT09MIG9wal9qMmtfYWxsb2NhdGVfdGlsZV9lbGVtZW50X2NzdHJfaW5kZXgob3BqX2oya190ICpwX2oyaykKLXsKLSAgICAgICAgT1BKX1VJTlQzMiBpdF90aWxlPTA7Ci0KLSAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPm5iX29mX3RpbGVzID0gcF9qMmstPm1fY3AudHcgKiBwX2oyay0+bV9jcC50aDsKLSAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXggPSAob3BqX3RpbGVfaW5kZXhfdCopb3BqX2NhbGxvYyhwX2oyay0+Y3N0cl9pbmRleC0+bmJfb2ZfdGlsZXMsIHNpemVvZihvcGpfdGlsZV9pbmRleF90KSk7Ci0gICAgICAgIGlmICghcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXgpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLQotICAgICAgICBmb3IgKGl0X3RpbGU9MDsgaXRfdGlsZSA8IHBfajJrLT5jc3RyX2luZGV4LT5uYl9vZl90aWxlczsgaXRfdGlsZSsrKXsKLSAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXhtYXJrbnVtID0gMTAwOwotICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtudW0gPSAwOwotICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtlciA9IChvcGpfbWFya2VyX2luZm9fdCopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jYWxsb2MocF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWF4bWFya251bSwgc2l6ZW9mKG9wal9tYXJrZXJfaW5mb190KSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi1PUEpfQk9PTCBvcGpfajJrX2RlY29kZV90aWxlcyAoIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCi17Ci0gICAgICAgIE9QSl9CT09MIGxfZ29fb24gPSBPUEpfVFJVRTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2N1cnJlbnRfdGlsZV9ubzsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2RhdGFfc2l6ZSxsX21heF9kYXRhX3NpemU7Ci0gICAgICAgIE9QSl9JTlQzMiBsX3RpbGVfeDAsbF90aWxlX3kwLGxfdGlsZV94MSxsX3RpbGVfeTE7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl9jb21wczsKLSAgICAgICAgT1BKX0JZVEUgKiBsX2N1cnJlbnRfZGF0YTsKLSAgICAgICAgT1BKX1VJTlQzMiBucl90aWxlcyA9IDA7Ci0KLSAgICAgICAgbF9jdXJyZW50X2RhdGEgPSAoT1BKX0JZVEUqKW9wal9tYWxsb2MoMTAwMCk7Ci0gICAgICAgIGlmICghIGxfY3VycmVudF9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGRlY29kZSB0aWxlc1xuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICBsX21heF9kYXRhX3NpemUgPSAxMDAwOwotCi0gICAgICAgIHdoaWxlIChPUEpfVFJVRSkgewotICAgICAgICAgICAgICAgIGlmICghIG9wal9qMmtfcmVhZF90aWxlX2hlYWRlciggcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfY3VycmVudF90aWxlX25vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX2RhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF90aWxlX3gwLCAmbF90aWxlX3kwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX3RpbGVfeDEsICZsX3RpbGVfeTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfbmJfY29tcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfZ29fb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoISBsX2dvX29uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobF9kYXRhX3NpemUgPiBsX21heF9kYXRhX3NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpsX25ld19jdXJyZW50X2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MobF9jdXJyZW50X2RhdGEsIGxfZGF0YV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIGxfbmV3X2N1cnJlbnRfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBkZWNvZGUgdGlsZSAlZC8lZFxuIiwgbF9jdXJyZW50X3RpbGVfbm8gKzEsIHBfajJrLT5tX2NwLnRoICogcF9qMmstPm1fY3AudHcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X2RhdGEgPSBsX25ld19jdXJyZW50X2RhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX21heF9kYXRhX3NpemUgPSBsX2RhdGFfc2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoISBvcGpfajJrX2RlY29kZV90aWxlKHBfajJrLGxfY3VycmVudF90aWxlX25vLGxfY3VycmVudF9kYXRhLGxfZGF0YV9zaXplLHBfc3RyZWFtLHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gZGVjb2RlIHRpbGUgJWQvJWRcbiIsIGxfY3VycmVudF90aWxlX25vICsxLCBwX2oyay0+bV9jcC50aCAqIHBfajJrLT5tX2NwLnR3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfSU5GTywgIlRpbGUgJWQvJWQgaGFzIGJlZW4gZGVjb2RlZC5cbiIsIGxfY3VycmVudF90aWxlX25vICsxLCBwX2oyay0+bV9jcC50aCAqIHBfajJrLT5tX2NwLnR3KTsKLQotICAgICAgICAgICAgICAgIGlmICghIG9wal9qMmtfdXBkYXRlX2ltYWdlX2RhdGEocF9qMmstPm1fdGNkLGxfY3VycmVudF9kYXRhLCBwX2oyay0+bV9vdXRwdXRfaW1hZ2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0lORk8sICJJbWFnZSBkYXRhIGhhcyBiZWVuIHVwZGF0ZWQgd2l0aCB0aWxlICVkLlxuXG4iLCBsX2N1cnJlbnRfdGlsZV9ubyArIDEpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKG9wal9zdHJlYW1fZ2V0X251bWJlcl9ieXRlX2xlZnQocF9zdHJlYW0pID09IDAgIAotICAgICAgICAgICAgICAgICAgICAmJiBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9PSBKMktfU1RBVEVfTkVPQykKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgaWYoKytucl90aWxlcyA9PSAgcF9qMmstPm1fY3AudGggKiBwX2oyay0+bV9jcC50dykgCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOwotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotLyoqCi0gKiBTZXRzIHVwIHRoZSBwcm9jZWR1cmVzIHRvIGRvIG9uIGRlY29kaW5nIGRhdGEuIERldmVsb3BwZXJzIHdhbnRpbmcgdG8gZXh0ZW5kIHRoZSBsaWJyYXJ5IGNhbiBhZGQgdGhlaXIgb3duIHJlYWRpbmcgcHJvY2VkdXJlcy4KLSAqLwotc3RhdGljIHZvaWQgb3BqX2oya19zZXR1cF9kZWNvZGluZyAob3BqX2oya190ICpwX2oyaykKLXsKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0KLSAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya19kZWNvZGVfdGlsZXMpOwotICAgICAgICAvKiBERVZFTE9QRVIgQ09STkVSLCBhZGQgeW91ciBjdXN0b20gcHJvY2VkdXJlcyAqLwotCi19Ci0KLS8qCi0gKiBSZWFkIGFuZCBkZWNvZGUgb25lIHRpbGUuCi0gKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2RlY29kZV9vbmVfdGlsZSAoICAgICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKLXsKLSAgICAgICAgT1BKX0JPT0wgbF9nb19vbiA9IE9QSl9UUlVFOwotICAgICAgICBPUEpfVUlOVDMyIGxfY3VycmVudF90aWxlX25vOwotICAgICAgICBPUEpfVUlOVDMyIGxfdGlsZV9ub190b19kZWM7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9kYXRhX3NpemUsbF9tYXhfZGF0YV9zaXplOwotICAgICAgICBPUEpfSU5UMzIgbF90aWxlX3gwLGxfdGlsZV95MCxsX3RpbGVfeDEsbF90aWxlX3kxOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfY29tcHM7Ci0gICAgICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGE7Ci0KLSAgICAgICAgbF9jdXJyZW50X2RhdGEgPSAoT1BKX0JZVEUqKW9wal9tYWxsb2MoMTAwMCk7Ci0gICAgICAgIGlmICghIGxfY3VycmVudF9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGRlY29kZSBvbmUgdGlsZVxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICBsX21heF9kYXRhX3NpemUgPSAxMDAwOwotCi0gICAgICAgIC8qQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgc29tZSBlbGVtZW50cyBvZiBjb2Rlc3RyZW0gaW5kZXggaWYgbm90IGFscmVhZHkgZG9uZSovCi0gICAgICAgIGlmKCAhcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIW9wal9qMmtfYWxsb2NhdGVfdGlsZV9lbGVtZW50X2NzdHJfaW5kZXgocF9qMmspKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIE1vdmUgaW50byB0aGUgY29kZXN0cmVhbSB0byB0aGUgZmlyc3QgU09UIHVzZWQgdG8gZGVjb2RlIHRoZSBkZXNpcmVkIHRpbGUgKi8KLSAgICAgICAgbF90aWxlX25vX3RvX2RlYyA9IChPUEpfVUlOVDMyKXBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3RpbGVfaW5kX3RvX2RlYzsKLSAgICAgICAgaWYgKHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4KQotICAgICAgICAgICAgICAgIGlmKHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4LT50cF9pbmRleCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbbF90aWxlX25vX3RvX2RlY10ubmJfdHBzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBpbmRleCBmb3IgdGhpcyB0aWxlIGhhcyBub3QgYmVlbiBidWlsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIHNvIG1vdmUgdG8gdGhlIGxhc3QgU09UIHJlYWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhKG9wal9zdHJlYW1fcmVhZF9zZWVrKHBfc3RyZWFtLCBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9sYXN0X3NvdF9yZWFkX3BvcysyLCBwX21hbmFnZXIpKSApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJQcm9ibGVtIHdpdGggc2VlayBmdW5jdGlvblxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhKG9wal9zdHJlYW1fcmVhZF9zZWVrKHBfc3RyZWFtLCBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtsX3RpbGVfbm9fdG9fZGVjXS50cF9pbmRleFswXS5zdGFydF9wb3MrMiwgcF9tYW5hZ2VyKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlByb2JsZW0gd2l0aCBzZWVrIGZ1bmN0aW9uXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTcGVjaWFsIGNhc2UgaWYgd2UgaGF2ZSBwcmV2aW91c2x5IHJlYWQgdGhlIEVPQyBtYXJrZXIgKGlmIHRoZSBwcmV2aW91cyB0aWxlIGdldHRlZCBpcyB0aGUgbGFzdCApICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9PSBKMktfU1RBVEVfRU9DKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9IEoyS19TVEFURV9UUEhTT1Q7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChPUEpfVFJVRSkgewotICAgICAgICAgICAgICAgIGlmICghIG9wal9qMmtfcmVhZF90aWxlX2hlYWRlciggcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfY3VycmVudF90aWxlX25vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX2RhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF90aWxlX3gwLCAmbF90aWxlX3kwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX3RpbGVfeDEsICZsX3RpbGVfeTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfbmJfY29tcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfZ29fb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoISBsX2dvX29uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobF9kYXRhX3NpemUgPiBsX21heF9kYXRhX3NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpsX25ld19jdXJyZW50X2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MobF9jdXJyZW50X2RhdGEsIGxfZGF0YV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIGxfbmV3X2N1cnJlbnRfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9kYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETzogTEg6IHdoeSB0aWxlIG51bWJlcmluZyBwb2xpY3kgdXNlZCBpbiBtZXNzYWdlcyBkaWZmZXJzIGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG9uZSB1c2VkIGluIG9wal9qMmtfZGVjb2RlX3RpbGVzKCkgPyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gZGVjb2RlIHRpbGUgJWQvJWRcbiIsIGxfY3VycmVudF90aWxlX25vLCAocF9qMmstPm1fY3AudGggKiBwX2oyay0+bV9jcC50dykgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9kYXRhID0gbF9uZXdfY3VycmVudF9kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgbF9tYXhfZGF0YV9zaXplID0gbF9kYXRhX3NpemU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCEgb3BqX2oya19kZWNvZGVfdGlsZShwX2oyayxsX2N1cnJlbnRfdGlsZV9ubyxsX2N1cnJlbnRfZGF0YSxsX2RhdGFfc2l6ZSxwX3N0cmVhbSxwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0lORk8sICJUaWxlICVkLyVkIGhhcyBiZWVuIGRlY29kZWQuXG4iLCBsX2N1cnJlbnRfdGlsZV9ubywgKHBfajJrLT5tX2NwLnRoICogcF9qMmstPm1fY3AudHcpIC0gMSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoISBvcGpfajJrX3VwZGF0ZV9pbWFnZV9kYXRhKHBfajJrLT5tX3RjZCxsX2N1cnJlbnRfZGF0YSwgcF9qMmstPm1fb3V0cHV0X2ltYWdlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9JTkZPLCAiSW1hZ2UgZGF0YSBoYXMgYmVlbiB1cGRhdGVkIHdpdGggdGlsZSAlZC5cblxuIiwgbF9jdXJyZW50X3RpbGVfbm8pOwotCi0gICAgICAgICAgICAgICAgaWYobF9jdXJyZW50X3RpbGVfbm8gPT0gbF90aWxlX25vX3RvX2RlYykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3ZlIGludG8gdGhlIGNvZGVzdHJlYW0gdG8gdGhlIHRoZSBmaXJzdCBTT1QgKEZJWE1FIG9yIG5vdCBtb3ZlPykqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEob3BqX3N0cmVhbV9yZWFkX3NlZWsocF9zdHJlYW0sIHBfajJrLT5jc3RyX2luZGV4LT5tYWluX2hlYWRfZW5kICsgMiwgcF9tYW5hZ2VyKSApICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiUHJvYmxlbSB3aXRoIHNlZWsgZnVuY3Rpb25cbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiVGlsZSByZWFkLCBkZWNvZGUgYW5kIHVwZGF0ZWQgaXMgbm90IHRoZSBkZXNpcmVkICglZCB2cyAlZCkuXG4iLCBsX2N1cnJlbnRfdGlsZV9ubywgbF90aWxlX25vX3RvX2RlYyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi0vKioKLSAqIFNldHMgdXAgdGhlIHByb2NlZHVyZXMgdG8gZG8gb24gZGVjb2Rpbmcgb25lIHRpbGUuIERldmVsb3BwZXJzIHdhbnRpbmcgdG8gZXh0ZW5kIHRoZSBsaWJyYXJ5IGNhbiBhZGQgdGhlaXIgb3duIHJlYWRpbmcgcHJvY2VkdXJlcy4KLSAqLwotc3RhdGljIHZvaWQgb3BqX2oya19zZXR1cF9kZWNvZGluZ190aWxlIChvcGpfajJrX3QgKnBfajJrKQotewotICAgICAgICAvKiBwcmVjb25kaXRpb25zKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLQotICAgICAgICBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfajJrX2RlY29kZV9vbmVfdGlsZSk7Ci0gICAgICAgIC8qIERFVkVMT1BFUiBDT1JORVIsIGFkZCB5b3VyIGN1c3RvbSBwcm9jZWR1cmVzICovCi0KLX0KLQotT1BKX0JPT0wgb3BqX2oya19kZWNvZGUob3BqX2oya190ICogcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKiBwX2ltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQotewotICAgICAgICBPUEpfVUlOVDMyIGNvbXBubzsKLQotICAgICAgICBpZiAoIXBfaW1hZ2UpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLQotICAgICAgICBwX2oyay0+bV9vdXRwdXRfaW1hZ2UgPSBvcGpfaW1hZ2VfY3JlYXRlMCgpOwotICAgICAgICBpZiAoISAocF9qMmstPm1fb3V0cHV0X2ltYWdlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgb3BqX2NvcHlfaW1hZ2VfaGVhZGVyKHBfaW1hZ2UsIHBfajJrLT5tX291dHB1dF9pbWFnZSk7Ci0KLSAgICAgICAgLyogY3VzdG9taXphdGlvbiBvZiB0aGUgZGVjb2RpbmcgKi8KLSAgICAgICAgb3BqX2oya19zZXR1cF9kZWNvZGluZyhwX2oyayk7Ci0KLSAgICAgICAgLyogRGVjb2RlIHRoZSBjb2Rlc3RyZWFtICovCi0gICAgICAgIGlmICghIG9wal9qMmtfZXhlYyAocF9qMmsscF9qMmstPm1fcHJvY2VkdXJlX2xpc3QscF9zdHJlYW0scF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIG9wal9pbWFnZV9kZXN0cm95KHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UpOwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UgPSBOVUxMOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBNb3ZlIGRhdGEgYW5kIGNvcHkgb25lIGluZm9ybWF0aW9uIGZyb20gY29kZWMgdG8gb3V0cHV0IGltYWdlKi8KLSAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBwX2ltYWdlLT5udW1jb21wczsgY29tcG5vKyspIHsKLSAgICAgICAgICAgICAgICBwX2ltYWdlLT5jb21wc1tjb21wbm9dLnJlc25vX2RlY29kZWQgPSBwX2oyay0+bV9vdXRwdXRfaW1hZ2UtPmNvbXBzW2NvbXBub10ucmVzbm9fZGVjb2RlZDsKLSAgICAgICAgICAgICAgICBwX2ltYWdlLT5jb21wc1tjb21wbm9dLmRhdGEgPSBwX2oyay0+bV9vdXRwdXRfaW1hZ2UtPmNvbXBzW2NvbXBub10uZGF0YTsKLSNpZiAwCi0gICAgICAgICAgICAgICAgY2hhciBmblsyNTZdOwotICAgICAgICAgICAgICAgIHNwcmludGYoIGZuLCAiL3RtcC8lZC5yYXciLCBjb21wbm8gKTsKLSAgICAgICAgICAgICAgICBGSUxFICpkZWJ1ZyA9IGZvcGVuKCBmbiwgIndiIiApOwotICAgICAgICAgICAgICAgIGZ3cml0ZSggcF9pbWFnZS0+Y29tcHNbY29tcG5vXS5kYXRhLCBzaXplb2YoT1BKX0lOVDMyKSwgcF9pbWFnZS0+Y29tcHNbY29tcG5vXS53ICogcF9pbWFnZS0+Y29tcHNbY29tcG5vXS5oLCBkZWJ1ZyApOwotICAgICAgICAgICAgICAgIGZjbG9zZSggZGVidWcgKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIHBfajJrLT5tX291dHB1dF9pbWFnZS0+Y29tcHNbY29tcG5vXS5kYXRhID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX0JPT0wgb3BqX2oya19nZXRfdGlsZSggICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCogcF9pbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0aWxlX2luZGV4ICkKLXsKLSAgICAgICAgT1BKX1VJTlQzMiBjb21wbm87Ci0gICAgICAgIE9QSl9VSU5UMzIgbF90aWxlX3gsIGxfdGlsZV95OwotICAgICAgICBvcGpfaW1hZ2VfY29tcF90KiBsX2ltZ19jb21wOwotCi0gICAgICAgIGlmICghcF9pbWFnZSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJXZSBuZWVkIGFuIGltYWdlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIC8qKHRpbGVfaW5kZXggPCAwKSAmJiovICh0aWxlX2luZGV4ID49IHBfajJrLT5tX2NwLnR3ICogcF9qMmstPm1fY3AudGgpICl7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlRpbGUgaW5kZXggcHJvdmlkZWQgYnkgdGhlIHVzZXIgaXMgaW5jb3JyZWN0ICVkIChtYXggPSAlZCkgXG4iLCB0aWxlX2luZGV4LCAocF9qMmstPm1fY3AudHcgKiBwX2oyay0+bV9jcC50aCkgLSAxKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ29tcHV0ZSB0aGUgZGltZW5zaW9uIG9mIHRoZSBkZXNpcmVkIHRpbGUqLwotICAgICAgICBsX3RpbGVfeCA9IHRpbGVfaW5kZXggJSBwX2oyay0+bV9jcC50dzsKLSAgICAgICAgbF90aWxlX3kgPSB0aWxlX2luZGV4IC8gcF9qMmstPm1fY3AudHc7Ci0KLSAgICAgICAgcF9pbWFnZS0+eDAgPSBsX3RpbGVfeCAqIHBfajJrLT5tX2NwLnRkeCArIHBfajJrLT5tX2NwLnR4MDsKLSAgICAgICAgaWYgKHBfaW1hZ2UtPngwIDwgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+eDApCi0gICAgICAgICAgICAgICAgcF9pbWFnZS0+eDAgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT54MDsKLSAgICAgICAgcF9pbWFnZS0+eDEgPSAobF90aWxlX3ggKyAxKSAqIHBfajJrLT5tX2NwLnRkeCArIHBfajJrLT5tX2NwLnR4MDsKLSAgICAgICAgaWYgKHBfaW1hZ2UtPngxID4gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+eDEpCi0gICAgICAgICAgICAgICAgcF9pbWFnZS0+eDEgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT54MTsKLQotICAgICAgICBwX2ltYWdlLT55MCA9IGxfdGlsZV95ICogcF9qMmstPm1fY3AudGR5ICsgcF9qMmstPm1fY3AudHkwOwotICAgICAgICBpZiAocF9pbWFnZS0+eTAgPCBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT55MCkKLSAgICAgICAgICAgICAgICBwX2ltYWdlLT55MCA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPnkwOwotICAgICAgICBwX2ltYWdlLT55MSA9IChsX3RpbGVfeSArIDEpICogcF9qMmstPm1fY3AudGR5ICsgcF9qMmstPm1fY3AudHkwOwotICAgICAgICBpZiAocF9pbWFnZS0+eTEgPiBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT55MSkKLSAgICAgICAgICAgICAgICBwX2ltYWdlLT55MSA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPnkxOwotCi0gICAgICAgIGxfaW1nX2NvbXAgPSBwX2ltYWdlLT5jb21wczsKLSAgICAgICAgZm9yIChjb21wbm89MDsgY29tcG5vIDwgcF9pbWFnZS0+bnVtY29tcHM7ICsrY29tcG5vKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIGxfY29tcF94MSwgbF9jb21wX3kxOwotCi0gICAgICAgICAgICAgICAgbF9pbWdfY29tcC0+ZmFjdG9yID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+Y29tcHNbY29tcG5vXS5mYWN0b3I7Ci0KLSAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT54MCA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKXBfaW1hZ2UtPngwLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR4KTsKLSAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT55MCA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKXBfaW1hZ2UtPnkwLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR5KTsKLSAgICAgICAgICAgICAgICBsX2NvbXBfeDEgPSBvcGpfaW50X2NlaWxkaXYoKE9QSl9JTlQzMilwX2ltYWdlLT54MSwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5keCk7Ci0gICAgICAgICAgICAgICAgbF9jb21wX3kxID0gb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpcF9pbWFnZS0+eTEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHkpOwotCi0gICAgICAgICAgICAgICAgbF9pbWdfY29tcC0+dyA9IChPUEpfVUlOVDMyKShvcGpfaW50X2NlaWxkaXZwb3cyKGxfY29tcF94MSwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5mYWN0b3IpIC0gb3BqX2ludF9jZWlsZGl2cG93MigoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPngwLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmZhY3RvcikpOwotICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPmggPSAoT1BKX1VJTlQzMikob3BqX2ludF9jZWlsZGl2cG93MihsX2NvbXBfeTEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZmFjdG9yKSAtIG9wal9pbnRfY2VpbGRpdnBvdzIoKE9QSl9JTlQzMilsX2ltZ19jb21wLT55MCwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5mYWN0b3IpKTsKLQotICAgICAgICAgICAgICAgIGxfaW1nX2NvbXArKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIERlc3Ryb3kgdGhlIHByZXZpb3VzIG91dHB1dCBpbWFnZSovCi0gICAgICAgIGlmIChwX2oyay0+bV9vdXRwdXRfaW1hZ2UpCi0gICAgICAgICAgICAgICAgb3BqX2ltYWdlX2Rlc3Ryb3kocF9qMmstPm1fb3V0cHV0X2ltYWdlKTsKLQotICAgICAgICAvKiBDcmVhdGUgdGhlIG91cHV0IGltYWdlIGZyb20gdGhlIGluZm9ybWF0aW9uIHByZXZpb3VzbHkgY29tcHV0ZWQqLwotICAgICAgICBwX2oyay0+bV9vdXRwdXRfaW1hZ2UgPSBvcGpfaW1hZ2VfY3JlYXRlMCgpOwotICAgICAgICBpZiAoISAocF9qMmstPm1fb3V0cHV0X2ltYWdlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgb3BqX2NvcHlfaW1hZ2VfaGVhZGVyKHBfaW1hZ2UsIHBfajJrLT5tX291dHB1dF9pbWFnZSk7Ci0KLSAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fdGlsZV9pbmRfdG9fZGVjID0gKE9QSl9JTlQzMil0aWxlX2luZGV4OwotCi0gICAgICAgIC8qIGN1c3RvbWl6YXRpb24gb2YgdGhlIGRlY29kaW5nICovCi0gICAgICAgIG9wal9qMmtfc2V0dXBfZGVjb2RpbmdfdGlsZShwX2oyayk7Ci0KLSAgICAgICAgLyogRGVjb2RlIHRoZSBjb2Rlc3RyZWFtICovCi0gICAgICAgIGlmICghIG9wal9qMmtfZXhlYyAocF9qMmsscF9qMmstPm1fcHJvY2VkdXJlX2xpc3QscF9zdHJlYW0scF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIG9wal9pbWFnZV9kZXN0cm95KHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UpOwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UgPSBOVUxMOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBNb3ZlIGRhdGEgYW5kIGNvcHkgb25lIGluZm9ybWF0aW9uIGZyb20gY29kZWMgdG8gb3V0cHV0IGltYWdlKi8KLSAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBwX2ltYWdlLT5udW1jb21wczsgY29tcG5vKyspIHsKLSAgICAgICAgICAgICAgICBwX2ltYWdlLT5jb21wc1tjb21wbm9dLnJlc25vX2RlY29kZWQgPSBwX2oyay0+bV9vdXRwdXRfaW1hZ2UtPmNvbXBzW2NvbXBub10ucmVzbm9fZGVjb2RlZDsKLQotICAgICAgICAgICAgICAgIGlmIChwX2ltYWdlLT5jb21wc1tjb21wbm9dLmRhdGEpCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2ltYWdlLT5jb21wc1tjb21wbm9dLmRhdGEpOwotCi0gICAgICAgICAgICAgICAgcF9pbWFnZS0+Y29tcHNbY29tcG5vXS5kYXRhID0gcF9qMmstPm1fb3V0cHV0X2ltYWdlLT5jb21wc1tjb21wbm9dLmRhdGE7Ci0KLSAgICAgICAgICAgICAgICBwX2oyay0+bV9vdXRwdXRfaW1hZ2UtPmNvbXBzW2NvbXBub10uZGF0YSA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9CT09MIG9wal9qMmtfc2V0X2RlY29kZWRfcmVzb2x1dGlvbl9mYWN0b3Iob3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiByZXNfZmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgaXRfY29tcDsKLQotICAgICAgICBwX2oyay0+bV9jcC5tX3NwZWNpZmljX3BhcmFtLm1fZGVjLm1fcmVkdWNlID0gcmVzX2ZhY3RvcjsKLQotICAgICAgICBpZiAocF9qMmstPm1fcHJpdmF0ZV9pbWFnZSkgewotICAgICAgICAgICAgICAgIGlmIChwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5jb21wcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcC0+dGNjcHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGl0X2NvbXAgPSAwIDsgaXRfY29tcCA8IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOyBpdF9jb21wKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbWF4X3JlcyA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwLT50Y2Nwc1tpdF9jb21wXS5udW1yZXNvbHV0aW9uczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcmVzX2ZhY3RvciA+PSBtYXhfcmVzKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlJlc29sdXRpb24gZmFjdG9yIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSByZXNvbHV0aW9uIGluIHRoZSBjb21wb25lbnQuXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPmNvbXBzW2l0X2NvbXBdLmZhY3RvciA9IHJlc19mYWN0b3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci19Ci0KLU9QSl9CT09MIG9wal9qMmtfZW5jb2RlKG9wal9qMmtfdCAqIHBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKLXsKLSAgICAgICAgT1BKX1VJTlQzMiBpLCBqOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfdGlsZXM7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9tYXhfdGlsZV9zaXplID0gMCwgbF9jdXJyZW50X3RpbGVfc2l6ZTsKLSAgICAgICAgT1BKX0JZVEUgKiBsX2N1cnJlbnRfZGF0YSA9IDAwOwotICAgICAgICBvcGpfdGNkX3QqIHBfdGNkID0gMDA7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLQkKLSAgICAgICAgcF90Y2QgPSBwX2oyay0+bV90Y2Q7Ci0KLSAgICAgICAgbF9uYl90aWxlcyA9IHBfajJrLT5tX2NwLnRoICogcF9qMmstPm1fY3AudHc7Ci0gICAgICAgIGZvciAoaT0wO2k8bF9uYl90aWxlczsrK2kpIHsKLSAgICAgICAgICAgICAgICBpZiAoISBvcGpfajJrX3ByZV93cml0ZV90aWxlKHBfajJrLGkscF9zdHJlYW0scF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfY3VycmVudF9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogaWYgd2Ugb25seSBoYXZlIG9uZSB0aWxlLCB0aGVuIHNpbXBseSBzZXQgdGlsZSBjb21wb25lbnQgZGF0YSBlcXVhbCB0byBpbWFnZSBjb21wb25lbnQgZGF0YSAqLwotICAgICAgICAgICAgICAgIC8qIG90aGVyd2lzZSwgYWxsb2NhdGUgdGhlIGRhdGEgKi8KLSAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPHBfajJrLT5tX3RjZC0+aW1hZ2UtPm51bWNvbXBzOysraikgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlY29tcF90KiBsX3RpbGVjID0gcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPmNvbXBzICsgajsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX25iX3RpbGVzID09IDEpIHsKLQkJCQkJCQkJCQkJCSAgICAgICAgb3BqX2ltYWdlX2NvbXBfdCAqIGxfaW1nX2NvbXAgPSBwX3RjZC0+aW1hZ2UtPmNvbXBzICsgajsKLQkJCQkJCQkJCQkJCSAgICAgICAgbF90aWxlYy0+ZGF0YSAgPSAgbF9pbWdfY29tcC0+ZGF0YTsKLQkJCQkJCQkJCQkJCSAgICAgICAgbF90aWxlYy0+b3duc0RhdGEgPSBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotCQkJCQkJCQkJCQkJICAgICAgICBpZighIG9wal9hbGxvY190aWxlX2NvbXBvbmVudF9kYXRhKGxfdGlsZWMpKSB7Ci0JCQkJCQkJCQkJCQkgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIGFsbG9jYXRpbmcgdGlsZSBjb21wb25lbnQgZGF0YS4iICk7Ci0JCQkJCQkJCQkJCQkgICAgICAgICAgICAgICAgaWYgKGxfY3VycmVudF9kYXRhKSB7Ci0JCQkJCQkJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7Ci0JCQkJCQkJCQkJCQkgICAgICAgICAgICAgICAgfQotCQkJCQkJCQkJCQkJICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0JCQkJCQkJCQkJCQkgICAgICAgIH0KLQkJCQkJCQkJCQkJCSAgICAgICAgb3BqX2FsbG9jX3RpbGVfY29tcG9uZW50X2RhdGEobF90aWxlYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxfY3VycmVudF90aWxlX3NpemUgPSBvcGpfdGNkX2dldF9lbmNvZGVkX3RpbGVfc2l6ZShwX2oyay0+bV90Y2QpOwotICAgICAgICAgICAgICAgIGlmIChsX25iX3RpbGVzID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfY3VycmVudF90aWxlX3NpemUgPiBsX21heF90aWxlX3NpemUpIHsKLQkJCQkJCQkJCQkJCSAgICAgICAgT1BKX0JZVEUgKmxfbmV3X2N1cnJlbnRfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfcmVhbGxvYyhsX2N1cnJlbnRfZGF0YSwgbF9jdXJyZW50X3RpbGVfc2l6ZSk7Ci0JCQkJCQkJCQkJCQkgICAgICAgIGlmICghIGxfbmV3X2N1cnJlbnRfZGF0YSkgewotCQkJCQkJCQkJCQkJICAgICAgICAgICAgICAgIGlmIChsX2N1cnJlbnRfZGF0YSkgewotCQkJCQkJCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOwotCQkJCQkJCQkJCQkJICAgICAgICAgICAgICAgIH0KLQkJCQkJCQkJCQkJCSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gZW5jb2RlIGFsbCB0aWxlc1xuIik7Ci0JCQkJCQkJCQkJCQkgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLQkJCQkJCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQkJCQkJbF9jdXJyZW50X2RhdGEgPSBsX25ld19jdXJyZW50X2RhdGE7Ci0JCQkJCQkJCQkJCQkJCQkJbF9tYXhfdGlsZV9zaXplID0gbF9jdXJyZW50X3RpbGVfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSBpbWFnZSBkYXRhICgzMiBiaXQpIHRvIGxfY3VycmVudF9kYXRhIGFzIGNvbnRpZ3VvdXMsIGFsbC1jb21wb25lbnQsIHplcm8gb2Zmc2V0IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogMzIgYml0IGNvbXBvbmVudHMgQCA4IGJpdCBwcmVjaXNpb24gZ2V0IGNvbnZlcnRlZCB0byA4IGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogMzIgYml0IGNvbXBvbmVudHMgQCAxNiBiaXQgcHJlY2lzaW9uIGdldCBjb252ZXJ0ZWQgdG8gMTYgYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfajJrX2dldF90aWxlX2RhdGEocF9qMmstPm1fdGNkLGxfY3VycmVudF9kYXRhKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IGNvcHkgdGhpcyBkYXRhIGludG8gdGhlIHRpbGUgY29tcG9uZW50ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBvcGpfdGNkX2NvcHlfdGlsZV9kYXRhKHBfajJrLT5tX3RjZCxsX2N1cnJlbnRfZGF0YSxsX2N1cnJlbnRfdGlsZV9zaXplKSkgewotCQkJCQkJCQkJCQkJCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJTaXplIG1pc21hdGNoIGJldHdlZW4gdGlsZSBkYXRhIGFuZCBzZW50IGRhdGEuIiApOwotCQkJCQkJCQkJCQkJCQkJCXJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCEgb3BqX2oya19wb3N0X3dyaXRlX3RpbGUgKHBfajJrLHBfc3RyZWFtLHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxfY3VycmVudF9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX0JPT0wgb3BqX2oya19lbmRfY29tcHJlc3MoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKLXsKLSAgICAgICAgLyogY3VzdG9taXphdGlvbiBvZiB0aGUgZW5jb2RpbmcgKi8KLSAgICAgICAgb3BqX2oya19zZXR1cF9lbmRfY29tcHJlc3MocF9qMmspOwotCi0gICAgICAgIGlmICghIG9wal9qMmtfZXhlYyAocF9qMmssIHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LCBwX3N0cmVhbSwgcF9tYW5hZ2VyKSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9CT09MIG9wal9qMmtfc3RhcnRfY29tcHJlc3Mob3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90ICogcF9pbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKLXsKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLQotICAgICAgICBwX2oyay0+bV9wcml2YXRlX2ltYWdlID0gb3BqX2ltYWdlX2NyZWF0ZTAoKTsKLSAgICAgICAgaWYgKCEgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gYWxsb2NhdGUgaW1hZ2UgaGVhZGVyLiIgKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIG9wal9jb3B5X2ltYWdlX2hlYWRlcihwX2ltYWdlLCBwX2oyay0+bV9wcml2YXRlX2ltYWdlKTsKLQotICAgICAgICAvKiBUT0RPX01TRDogRmluZCBhIGJldHRlciB3YXkgKi8KLSAgICAgICAgaWYgKHBfaW1hZ2UtPmNvbXBzKSB7Ci0gICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBpdF9jb21wOwotICAgICAgICAgICAgICAgIGZvciAoaXRfY29tcCA9IDAgOyBpdF9jb21wIDwgcF9pbWFnZS0+bnVtY29tcHM7IGl0X2NvbXArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBfaW1hZ2UtPmNvbXBzW2l0X2NvbXBdLmRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+Y29tcHNbaXRfY29tcF0uZGF0YSA9cF9pbWFnZS0+Y29tcHNbaXRfY29tcF0uZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9pbWFnZS0+Y29tcHNbaXRfY29tcF0uZGF0YSA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBjdXN0b21pemF0aW9uIG9mIHRoZSB2YWxpZGF0aW9uICovCi0gICAgICAgIG9wal9qMmtfc2V0dXBfZW5jb2RpbmdfdmFsaWRhdGlvbiAocF9qMmspOwotCi0gICAgICAgIC8qIHZhbGlkYXRpb24gb2YgdGhlIHBhcmFtZXRlcnMgY29kZWMgKi8KLSAgICAgICAgaWYgKCEgb3BqX2oya19leGVjKHBfajJrLHBfajJrLT5tX3ZhbGlkYXRpb25fbGlzdCxwX3N0cmVhbSxwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGN1c3RvbWl6YXRpb24gb2YgdGhlIGVuY29kaW5nICovCi0gICAgICAgIG9wal9qMmtfc2V0dXBfaGVhZGVyX3dyaXRpbmcocF9qMmspOwotCi0gICAgICAgIC8qIHdyaXRlIGhlYWRlciAqLwotICAgICAgICBpZiAoISBvcGpfajJrX2V4ZWMgKHBfajJrLHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LHBfc3RyZWFtLHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi1PUEpfQk9PTCBvcGpfajJrX3ByZV93cml0ZV90aWxlICggICAgICAgb3BqX2oya190ICogcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCi17Ci0gICh2b2lkKXBfc3RyZWFtOwotICAgICAgICBpZiAocF90aWxlX2luZGV4ICE9IHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiVGhlIGdpdmVuIHRpbGUgaW5kZXggZG9lcyBub3QgbWF0Y2guIiApOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0lORk8sICJ0aWxlIG51bWJlciAlZCAvICVkXG4iLCBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyICsgMSwgcF9qMmstPm1fY3AudHcgKiBwX2oyay0+bV9jcC50aCk7Ci0KLSAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fY3VycmVudF90aWxlX3BhcnRfbnVtYmVyID0gMDsKLSAgICAgICAgcF9qMmstPm1fdGNkLT5jdXJfdG90bnVtX3RwID0gcF9qMmstPm1fY3AudGNwc1twX3RpbGVfaW5kZXhdLm1fbmJfdGlsZV9wYXJ0czsKLSAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fY3VycmVudF9wb2NfdGlsZV9wYXJ0X251bWJlciA9IDA7Ci0KLSAgICAgICAgLyogaW5pdGlhbGlzYXRpb24gYmVmb3JlIHRpbGUgZW5jb2RpbmcgICovCi0gICAgICAgIGlmICghIG9wal90Y2RfaW5pdF9lbmNvZGVfdGlsZShwX2oyay0+bV90Y2QsIHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotdm9pZCBvcGpfZ2V0X3RpbGVfZGltZW5zaW9ucyhvcGpfaW1hZ2VfdCAqIGxfaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqIGxfdGlsZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyKiBsX3NpemVfY29tcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiogbF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiogbF9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIqIGxfb2Zmc2V0X3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIqIGxfb2Zmc2V0X3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIqIGxfaW1hZ2Vfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIqIGxfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyKiBsX3RpbGVfb2Zmc2V0KSB7Ci0JT1BKX1VJTlQzMiBsX3JlbWFpbmluZzsKLQkqbF9zaXplX2NvbXAgPSBsX2ltZ19jb21wLT5wcmVjID4+IDM7IC8qICgvOCkgKi8KLQlsX3JlbWFpbmluZyA9IGxfaW1nX2NvbXAtPnByZWMgJiA3OyAgLyogKCU4KSAqLwotCWlmIChsX3JlbWFpbmluZykgewotCQkqbF9zaXplX2NvbXAgKz0gMTsKLQl9Ci0KLQlpZiAoKmxfc2l6ZV9jb21wID09IDMpIHsKLQkJKmxfc2l6ZV9jb21wID0gNDsKLQl9Ci0KLQkqbF93aWR0aCAgPSAoT1BKX1VJTlQzMikobF90aWxlYy0+eDEgLSBsX3RpbGVjLT54MCk7Ci0JKmxfaGVpZ2h0ID0gKE9QSl9VSU5UMzIpKGxfdGlsZWMtPnkxIC0gbF90aWxlYy0+eTApOwotCSpsX29mZnNldF94ID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpbF9pbWFnZS0+eDAsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHgpOwotCSpsX29mZnNldF95ID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpbF9pbWFnZS0+eTAsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHkpOwotCSpsX2ltYWdlX3dpZHRoID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpbF9pbWFnZS0+eDEgLSAoT1BKX0lOVDMyKWxfaW1hZ2UtPngwLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR4KTsKLQkqbF9zdHJpZGUgPSAqbF9pbWFnZV93aWR0aCAtICpsX3dpZHRoOwotCSpsX3RpbGVfb2Zmc2V0ID0gKChPUEpfVUlOVDMyKWxfdGlsZWMtPngwIC0gKmxfb2Zmc2V0X3gpICsgKChPUEpfVUlOVDMyKWxfdGlsZWMtPnkwIC0gKmxfb2Zmc2V0X3kpICogKmxfaW1hZ2Vfd2lkdGg7Ci19Ci0KLXZvaWQgb3BqX2oya19nZXRfdGlsZV9kYXRhIChvcGpfdGNkX3QgKiBwX3RjZCwgT1BKX0JZVEUgKiBwX2RhdGEpCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgaSxqLGsgPSAwOwotCi0gICAgICAgIGZvciAoaT0wO2k8cF90Y2QtPmltYWdlLT5udW1jb21wczsrK2kpIHsKLSAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqIGxfaW1hZ2UgPSAgcF90Y2QtPmltYWdlOwotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIGxfc3JjX3B0cjsKLSAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKiBsX3RpbGVjID0gcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPmNvbXBzICsgaTsKLSAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IGxfaW1hZ2UtPmNvbXBzICsgaTsKLSAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxfc2l6ZV9jb21wLGxfd2lkdGgsbF9oZWlnaHQsbF9vZmZzZXRfeCxsX29mZnNldF95LCBsX2ltYWdlX3dpZHRoLGxfc3RyaWRlLGxfdGlsZV9vZmZzZXQ7Ci0KLSAgICAgICAgICAgICAgICBvcGpfZ2V0X3RpbGVfZGltZW5zaW9ucyhsX2ltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGlsZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9pbWdfY29tcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF9zaXplX2NvbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX29mZnNldF94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX29mZnNldF95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX2ltYWdlX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF90aWxlX29mZnNldCk7Ci0KLSAgICAgICAgICAgICAgICBsX3NyY19wdHIgPSBsX2ltZ19jb21wLT5kYXRhICsgbF90aWxlX29mZnNldDsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCAobF9zaXplX2NvbXApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9DSEFSICogbF9kZXN0X3B0ciA9IChPUEpfQ0hBUiopIHBfZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9pbWdfY29tcC0+c2duZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICAgICAoaj0wO2o8bF9oZWlnaHQ7KytqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaz0wO2s8bF93aWR0aDsrK2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGxfZGVzdF9wdHIpID0gKE9QSl9DSEFSKSAoKmxfc3JjX3B0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX2Rlc3RfcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9zcmNfcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfaGVpZ2h0OysraikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGs9MDtrPGxfd2lkdGg7KytrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKSA9IChPUEpfQ0hBUikoKCpsX3NyY19wdHIpJjB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9kZXN0X3B0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfc3JjX3B0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NyY19wdHIgKz0gbF9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhID0gKE9QSl9CWVRFKikgbF9kZXN0X3B0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQxNiAqIGxfZGVzdF9wdHIgPSAoT1BKX0lOVDE2ICopIHBfZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9pbWdfY29tcC0+c2duZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7ajxsX2hlaWdodDsrK2opIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrPTA7azxsX3dpZHRoOysraykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoobF9kZXN0X3B0cisrKSA9IChPUEpfSU5UMTYpICgqKGxfc3JjX3B0cisrKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zcmNfcHRyICs9IGxfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9oZWlnaHQ7KytqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaz0wO2s8bF93aWR0aDsrK2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGxfZGVzdF9wdHIrKykgPSAoT1BKX0lOVDE2KSgoKihsX3NyY19wdHIrKykpICYgMHhmZmZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NyY19wdHIgKz0gbF9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhID0gKE9QSl9CWVRFKikgbF9kZXN0X3B0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIGxfZGVzdF9wdHIgPSAoT1BKX0lOVDMyICopIHBfZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfaGVpZ2h0OysraikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrPTA7azxsX3dpZHRoOysraykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGxfZGVzdF9wdHIrKykgPSAqKGxfc3JjX3B0cisrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEgPSAoT1BKX0JZVEUqKSBsX2Rlc3RfcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotfQotCi1PUEpfQk9PTCBvcGpfajJrX3Bvc3Rfd3JpdGVfdGlsZSAoICAgICAgb3BqX2oya190ICogcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl9ieXRlc193cml0dGVuOwotICAgICAgICBPUEpfQllURSAqIGxfY3VycmVudF9kYXRhID0gMDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF90aWxlX3NpemUgPSAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfYXZhaWxhYmxlX2RhdGE7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fZW5jb2RlZF90aWxlX2RhdGEpOwotCi0gICAgICAgIGxfdGlsZV9zaXplID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fZW5jb2RlZF90aWxlX3NpemU7Ci0gICAgICAgIGxfYXZhaWxhYmxlX2RhdGEgPSBsX3RpbGVfc2l6ZTsKLSAgICAgICAgbF9jdXJyZW50X2RhdGEgPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfZGF0YTsKLQotICAgICAgICBsX25iX2J5dGVzX3dyaXR0ZW4gPSAwOwotICAgICAgICBpZiAoISBvcGpfajJrX3dyaXRlX2ZpcnN0X3RpbGVfcGFydChwX2oyayxsX2N1cnJlbnRfZGF0YSwmbF9uYl9ieXRlc193cml0dGVuLGxfYXZhaWxhYmxlX2RhdGEscF9zdHJlYW0scF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gbF9uYl9ieXRlc193cml0dGVuOwotICAgICAgICBsX2F2YWlsYWJsZV9kYXRhIC09IGxfbmJfYnl0ZXNfd3JpdHRlbjsKLQotICAgICAgICBsX25iX2J5dGVzX3dyaXR0ZW4gPSAwOwotICAgICAgICBpZiAoISBvcGpfajJrX3dyaXRlX2FsbF90aWxlX3BhcnRzKHBfajJrLGxfY3VycmVudF9kYXRhLCZsX25iX2J5dGVzX3dyaXR0ZW4sbF9hdmFpbGFibGVfZGF0YSxwX3N0cmVhbSxwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIGxfYXZhaWxhYmxlX2RhdGEgLT0gbF9uYl9ieXRlc193cml0dGVuOwotICAgICAgICBsX25iX2J5dGVzX3dyaXR0ZW4gPSBsX3RpbGVfc2l6ZSAtIGxfYXZhaWxhYmxlX2RhdGE7Ci0KLSAgICAgICAgaWYgKCBvcGpfc3RyZWFtX3dyaXRlX2RhdGEoICAgICBwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX25iX2J5dGVzX3dyaXR0ZW4scF9tYW5hZ2VyKSAhPSBsX25iX2J5dGVzX3dyaXR0ZW4pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgKytwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyOwotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotdm9pZCBvcGpfajJrX3NldHVwX2VuZF9jb21wcmVzcyAob3BqX2oya190ICpwX2oyaykKLXsKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotCi0gICAgICAgIC8qIERFVkVMT1BFUiBDT1JORVIsIGluc2VydCB5b3VyIGN1c3RvbSBwcm9jZWR1cmVzICovCi0gICAgICAgIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfd3JpdGVfZW9jICk7Ci0KLSAgICAgICAgaWYgKE9QSl9JU19DSU5FTUEocF9qMmstPm1fY3AucnNpeikpIHsKLSAgICAgICAgICAgICAgICBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfajJrX3dyaXRlX3VwZGF0ZWRfdGxtKTsKLSAgICAgICAgfQotCi0gICAgICAgIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfd3JpdGVfZXBjICk7Ci0gICAgICAgIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfZW5kX2VuY29kaW5nICk7Ci0gICAgICAgIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfZGVzdHJveV9oZWFkZXJfbWVtb3J5KTsKLX0KLQotdm9pZCBvcGpfajJrX3NldHVwX2VuY29kaW5nX3ZhbGlkYXRpb24gKG9wal9qMmtfdCAqcF9qMmspCi17Ci0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLQotICAgICAgICBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV92YWxpZGF0aW9uX2xpc3QsIChvcGpfcHJvY2VkdXJlKW9wal9qMmtfYnVpbGRfZW5jb2Rlcik7Ci0gICAgICAgIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3ZhbGlkYXRpb25fbGlzdCwgKG9wal9wcm9jZWR1cmUpb3BqX2oya19lbmNvZGluZ192YWxpZGF0aW9uKTsKLQotICAgICAgICAvKiBERVZFTE9QRVIgQ09STkVSLCBhZGQgeW91ciBjdXN0b20gdmFsaWRhdGlvbiBwcm9jZWR1cmUgKi8KLSAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fdmFsaWRhdGlvbl9saXN0LCAob3BqX3Byb2NlZHVyZSlvcGpfajJrX21jdF92YWxpZGF0aW9uKTsKLX0KLQotdm9pZCBvcGpfajJrX3NldHVwX2hlYWRlcl93cml0aW5nIChvcGpfajJrX3QgKnBfajJrKQotewotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0KLSAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya19pbml0X2luZm8gKTsKLSAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV9zb2MgKTsKLSAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV9zaXogKTsKLSAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV9jb2QgKTsKLSAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV9xY2QgKTsKLQotICAgICAgICBpZiAoT1BKX0lTX0NJTkVNQShwX2oyay0+bV9jcC5yc2l6KSkgewotICAgICAgICAgICAgICAgIC8qIE5vIG5lZWQgZm9yIENPQyBvciBRQ0MsIFFDRCBhbmQgQ09EIGFyZSB1c2VkCi0gICAgICAgICAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV9hbGxfY29jICk7Ci0gICAgICAgICAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV9hbGxfcWNjICk7Ci0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfajJrX3dyaXRlX3RsbSApOwotCi0gICAgICAgICAgICAgICAgaWYgKHBfajJrLT5tX2NwLnJzaXogPT0gT1BKX1BST0ZJTEVfQ0lORU1BXzRLKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfajJrX3dyaXRlX3BvYyApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfd3JpdGVfcmVnaW9ucyk7Ci0KLSAgICAgICAgaWYgKHBfajJrLT5tX2NwLmNvbW1lbnQgIT0gMDApICB7Ci0gICAgICAgICAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV9jb20pOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogREVWRUxPUEVSIENPUk5FUiwgaW5zZXJ0IHlvdXIgY3VzdG9tIHByb2NlZHVyZXMgKi8KLSAgICAgICAgaWYgKHBfajJrLT5tX2NwLnJzaXogJiBPUEpfRVhURU5TSU9OX01DVCkgewotICAgICAgICAgICAgICAgIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfd3JpdGVfbWN0X2RhdGFfZ3JvdXAgKTsKLSAgICAgICAgfQotICAgICAgICAvKiBFbmQgb2YgRGV2ZWxvcGVyIENvcm5lciAqLwotCi0gICAgICAgIGlmIChwX2oyay0+Y3N0cl9pbmRleCkgewotICAgICAgICAgICAgICAgIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfZ2V0X2VuZF9oZWFkZXIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfY3JlYXRlX3RjZCk7Ci0gICAgICAgIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfdXBkYXRlX3JhdGVzKTsKLX0KLQotT1BKX0JPT0wgb3BqX2oya193cml0ZV9maXJzdF90aWxlX3BhcnQgKG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90b3RhbF9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlciApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl9ieXRlc193cml0dGVuID0gMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKLSAgICAgICAgT1BKX0JZVEUgKiBsX2JlZ2luX2RhdGEgPSAwMDsKLQotICAgICAgICBvcGpfdGNkX3QgKiBsX3RjZCA9IDAwOwotICAgICAgICBvcGpfY3BfdCAqIGxfY3AgPSAwMDsKLQotICAgICAgICBsX3RjZCA9IHBfajJrLT5tX3RjZDsKLSAgICAgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOwotCi0gICAgICAgIGxfdGNkLT5jdXJfcGlubyA9IDA7Ci0KLSAgICAgICAgLypHZXQgbnVtYmVyIG9mIHRpbGUgcGFydHMqLwotICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9jdXJyZW50X3BvY190aWxlX3BhcnRfbnVtYmVyID0gMDsKLQotICAgICAgICAvKiBJTkRFWCA+PiAqLwotICAgICAgICAvKiA8PCBJTkRFWCAqLwotCi0gICAgICAgIGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuID0gMDsKLSAgICAgICAgbF9iZWdpbl9kYXRhID0gcF9kYXRhOwotICAgICAgICBpZiAoISBvcGpfajJrX3dyaXRlX3NvdChwX2oyayxwX2RhdGEsJmxfY3VycmVudF9uYl9ieXRlc193cml0dGVuLHBfc3RyZWFtLHBfbWFuYWdlcikpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgbF9uYl9ieXRlc193cml0dGVuICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOwotICAgICAgICBwX2RhdGEgKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47Ci0gICAgICAgIHBfdG90YWxfZGF0YV9zaXplIC09IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOwotCi0gICAgICAgIGlmICghT1BKX0lTX0NJTkVNQShsX2NwLT5yc2l6KSkgewotI2lmIDAKLSAgICAgICAgICAgICAgICBmb3IgKGNvbXBubyA9IDE7IGNvbXBubyA8IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOyBjb21wbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2oya193cml0ZV9jb2NfaW5fbWVtb3J5KHBfajJrLGNvbXBubyxwX2RhdGEsJmxfY3VycmVudF9uYl9ieXRlc193cml0dGVuLHBfbWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX25iX2J5dGVzX3dyaXR0ZW4gKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEgKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX3RvdGFsX2RhdGFfc2l6ZSAtPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2oya193cml0ZV9xY2NfaW5fbWVtb3J5KHBfajJrLGNvbXBubyxwX2RhdGEsJmxfY3VycmVudF9uYl9ieXRlc193cml0dGVuLHBfbWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX25iX2J5dGVzX3dyaXR0ZW4gKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEgKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX3RvdGFsX2RhdGFfc2l6ZSAtPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAgICAgICAgIGlmIChsX2NwLT50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLm51bXBvY3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9qMmtfd3JpdGVfcG9jX2luX21lbW9yeShwX2oyayxwX2RhdGEsJmxfY3VycmVudF9uYl9ieXRlc193cml0dGVuLHBfbWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX25iX2J5dGVzX3dyaXR0ZW4gKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEgKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX3RvdGFsX2RhdGFfc2l6ZSAtPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbiA9IDA7Ci0gICAgICAgIGlmICghIG9wal9qMmtfd3JpdGVfc29kKHBfajJrLGxfdGNkLHBfZGF0YSwmbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW4scF90b3RhbF9kYXRhX3NpemUscF9zdHJlYW0scF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBsX25iX2J5dGVzX3dyaXR0ZW4gKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47Ci0gICAgICAgICogcF9kYXRhX3dyaXR0ZW4gPSBsX25iX2J5dGVzX3dyaXR0ZW47Ci0KLSAgICAgICAgLyogV3JpdGluZyBQc290IGluIFNPVCBtYXJrZXIgKi8KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfYmVnaW5fZGF0YSArIDYsbF9uYl9ieXRlc193cml0dGVuLDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBTT1QgKi8KLQotICAgICAgICBpZiAoT1BKX0lTX0NJTkVNQShsX2NwLT5yc2l6KSl7Ci0gICAgICAgICAgICAgICAgb3BqX2oya191cGRhdGVfdGxtKHBfajJrLGxfbmJfYnl0ZXNfd3JpdHRlbik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9CT09MIG9wal9qMmtfd3JpdGVfYWxsX3RpbGVfcGFydHMoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdG90YWxfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgdGlsZXBhcnRubz0wOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfYnl0ZXNfd3JpdHRlbiA9IDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9wYXJ0X3RpbGVfc2l6ZTsKLSAgICAgICAgT1BKX1VJTlQzMiB0b3RfbnVtX3RwOwotICAgICAgICBPUEpfVUlOVDMyIHBpbm87Ci0KLSAgICAgICAgT1BKX0JZVEUgKiBsX2JlZ2luX2RhdGE7Ci0gICAgICAgIG9wal90Y3BfdCAqbF90Y3AgPSAwMDsKLSAgICAgICAgb3BqX3RjZF90ICogbF90Y2QgPSAwMDsKLSAgICAgICAgb3BqX2NwX3QgKiBsX2NwID0gMDA7Ci0KLSAgICAgICAgbF90Y2QgPSBwX2oyay0+bV90Y2Q7Ci0gICAgICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKLSAgICAgICAgbF90Y3AgPSBsX2NwLT50Y3BzICsgcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcjsKLQotICAgICAgICAvKkdldCBudW1iZXIgb2YgdGlsZSBwYXJ0cyovCi0gICAgICAgIHRvdF9udW1fdHAgPSBvcGpfajJrX2dldF9udW1fdHAobF9jcCwwLHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIpOwotCi0gICAgICAgIC8qIHN0YXJ0IHdyaXRpbmcgcmVtYWluaW5nIHRpbGUgcGFydHMgKi8KLSAgICAgICAgKytwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9jdXJyZW50X3RpbGVfcGFydF9udW1iZXI7Ci0gICAgICAgIGZvciAodGlsZXBhcnRubyA9IDE7IHRpbGVwYXJ0bm8gPCB0b3RfbnVtX3RwIDsgKyt0aWxlcGFydG5vKSB7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fY3VycmVudF9wb2NfdGlsZV9wYXJ0X251bWJlciA9IHRpbGVwYXJ0bm87Ci0gICAgICAgICAgICAgICAgbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW4gPSAwOwotICAgICAgICAgICAgICAgIGxfcGFydF90aWxlX3NpemUgPSAwOwotICAgICAgICAgICAgICAgIGxfYmVnaW5fZGF0YSA9IHBfZGF0YTsKLQotICAgICAgICAgICAgICAgIGlmICghIG9wal9qMmtfd3JpdGVfc290KHBfajJrLHBfZGF0YSwmbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW4scF9zdHJlYW0scF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsX25iX2J5dGVzX3dyaXR0ZW4gKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgcF9kYXRhICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOwotICAgICAgICAgICAgICAgIHBfdG90YWxfZGF0YV9zaXplIC09IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOwotICAgICAgICAgICAgICAgIGxfcGFydF90aWxlX3NpemUgKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47Ci0KLSAgICAgICAgICAgICAgICBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbiA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKCEgb3BqX2oya193cml0ZV9zb2QocF9qMmssbF90Y2QscF9kYXRhLCZsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbixwX3RvdGFsX2RhdGFfc2l6ZSxwX3N0cmVhbSxwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBfZGF0YSArPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKLSAgICAgICAgICAgICAgICBsX25iX2J5dGVzX3dyaXR0ZW4gKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgcF90b3RhbF9kYXRhX3NpemUgLT0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgbF9wYXJ0X3RpbGVfc2l6ZSArPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKLQotICAgICAgICAgICAgICAgIC8qIFdyaXRpbmcgUHNvdCBpbiBTT1QgbWFya2VyICovCi0gICAgICAgICAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfYmVnaW5fZGF0YSArIDYsbF9wYXJ0X3RpbGVfc2l6ZSw0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBTT1QgKi8KLQotICAgICAgICAgICAgICAgIGlmIChPUEpfSVNfQ0lORU1BKGxfY3AtPnJzaXopKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfajJrX3VwZGF0ZV90bG0ocF9qMmssbF9wYXJ0X3RpbGVfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgKytwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9jdXJyZW50X3RpbGVfcGFydF9udW1iZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKHBpbm8gPSAxOyBwaW5vIDw9IGxfdGNwLT5udW1wb2NzOyArK3Bpbm8pIHsKLSAgICAgICAgICAgICAgICBsX3RjZC0+Y3VyX3Bpbm8gPSBwaW5vOwotCi0gICAgICAgICAgICAgICAgLypHZXQgbnVtYmVyIG9mIHRpbGUgcGFydHMqLwotICAgICAgICAgICAgICAgIHRvdF9udW1fdHAgPSBvcGpfajJrX2dldF9udW1fdHAobF9jcCxwaW5vLHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIpOwotICAgICAgICAgICAgICAgIGZvciAodGlsZXBhcnRubyA9IDA7IHRpbGVwYXJ0bm8gPCB0b3RfbnVtX3RwIDsgKyt0aWxlcGFydG5vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9jdXJyZW50X3BvY190aWxlX3BhcnRfbnVtYmVyID0gdGlsZXBhcnRubzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfcGFydF90aWxlX3NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgbF9iZWdpbl9kYXRhID0gcF9kYXRhOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBvcGpfajJrX3dyaXRlX3NvdChwX2oyayxwX2RhdGEsJmxfY3VycmVudF9uYl9ieXRlc193cml0dGVuLHBfc3RyZWFtLHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgbF9uYl9ieXRlc193cml0dGVuICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgcF90b3RhbF9kYXRhX3NpemUgLT0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX3BhcnRfdGlsZV9zaXplICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbiA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG9wal9qMmtfd3JpdGVfc29kKHBfajJrLGxfdGNkLHBfZGF0YSwmbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW4scF90b3RhbF9kYXRhX3NpemUscF9zdHJlYW0scF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBsX25iX2J5dGVzX3dyaXR0ZW4gKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEgKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX3RvdGFsX2RhdGFfc2l6ZSAtPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfcGFydF90aWxlX3NpemUgKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdyaXRpbmcgUHNvdCBpbiBTT1QgbWFya2VyICovCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9iZWdpbl9kYXRhICsgNixsX3BhcnRfdGlsZV9zaXplLDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUFNPVCAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoT1BKX0lTX0NJTkVNQShsX2NwLT5yc2l6KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfajJrX3VwZGF0ZV90bG0ocF9qMmssbF9wYXJ0X3RpbGVfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICsrcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fY3VycmVudF90aWxlX3BhcnRfbnVtYmVyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgICpwX2RhdGFfd3JpdHRlbiA9IGxfbmJfYnl0ZXNfd3JpdHRlbjsKLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9CT09MIG9wal9qMmtfd3JpdGVfdXBkYXRlZF90bG0oIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlciApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgbF90bG1fc2l6ZTsKLSAgICAgICAgT1BKX09GRl9UIGxfdGxtX3Bvc2l0aW9uLCBsX2N1cnJlbnRfcG9zaXRpb247Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKLQotICAgICAgICBsX3RsbV9zaXplID0gNSAqIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RvdGFsX3RpbGVfcGFydHM7Ci0gICAgICAgIGxfdGxtX3Bvc2l0aW9uID0gNiArIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zdGFydDsKLSAgICAgICAgbF9jdXJyZW50X3Bvc2l0aW9uID0gb3BqX3N0cmVhbV90ZWxsKHBfc3RyZWFtKTsKLQotICAgICAgICBpZiAoISBvcGpfc3RyZWFtX3NlZWsocF9zdHJlYW0sbF90bG1fcG9zaXRpb24scF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKHBfc3RyZWFtLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zb3Rfb2Zmc2V0c19idWZmZXIsbF90bG1fc2l6ZSxwX21hbmFnZXIpICE9IGxfdGxtX3NpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCEgb3BqX3N0cmVhbV9zZWVrKHBfc3RyZWFtLGxfY3VycmVudF9wb3NpdGlvbixwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX0JPT0wgb3BqX2oya19lbmRfZW5jb2RpbmcoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIgKQotewotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotCi0gICAgICAgIG9wal90Y2RfZGVzdHJveShwX2oyay0+bV90Y2QpOwotICAgICAgICBwX2oyay0+bV90Y2QgPSAwMDsKLQotICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdGxtX3NvdF9vZmZzZXRzX2J1ZmZlcikgewotICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zb3Rfb2Zmc2V0c19idWZmZXIpOwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zb3Rfb2Zmc2V0c19idWZmZXIgPSAwOwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zb3Rfb2Zmc2V0c19jdXJyZW50ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfZGF0YSkgewotICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2VuY29kZWRfdGlsZV9kYXRhKTsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfZGF0YSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfc2l6ZSA9IDA7Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi0vKioKLSAqIERlc3Ryb3lzIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWNvZGluZyBvZiBoZWFkZXJzLgotICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19kZXN0cm95X2hlYWRlcl9tZW1vcnkgKCBvcGpfajJrX3QgKiBwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotCi0gICAgICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSAwOwotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX0JPT0wgb3BqX2oya19pbml0X2luZm8oICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlciApCi17Ci0gICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZm9fdCAqIGxfY3N0cl9pbmZvID0gMDA7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKLSAgKHZvaWQpbF9jc3RyX2luZm87Ci0KLSAgICAgICAgLyogVE9ETyBtZXJnZVYyOiBjaGVjayB0aGlzIHBhcnQgd2hpY2ggdXNlIGNzdHJfaW5mbyAqLwotICAgICAgICAvKmxfY3N0cl9pbmZvID0gcF9qMmstPmNzdHJfaW5mbzsKLQotICAgICAgICBpZiAobF9jc3RyX2luZm8pICB7Ci0gICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBjb21wbm87Ci0gICAgICAgICAgICAgICAgbF9jc3RyX2luZm8tPnRpbGUgPSAob3BqX3RpbGVfaW5mb190ICopIG9wal9tYWxsb2MocF9qMmstPm1fY3AudHcgKiBwX2oyay0+bV9jcC50aCAqIHNpemVvZihvcGpfdGlsZV9pbmZvX3QpKTsKLQotICAgICAgICAgICAgICAgIGxfY3N0cl9pbmZvLT5pbWFnZV93ID0gcF9qMmstPm1faW1hZ2UtPngxIC0gcF9qMmstPm1faW1hZ2UtPngwOwotICAgICAgICAgICAgICAgIGxfY3N0cl9pbmZvLT5pbWFnZV9oID0gcF9qMmstPm1faW1hZ2UtPnkxIC0gcF9qMmstPm1faW1hZ2UtPnkwOwotCi0gICAgICAgICAgICAgICAgbF9jc3RyX2luZm8tPnByb2cgPSAoJnBfajJrLT5tX2NwLnRjcHNbMF0pLT5wcmc7Ci0KLSAgICAgICAgICAgICAgICBsX2NzdHJfaW5mby0+dHcgPSBwX2oyay0+bV9jcC50dzsKLSAgICAgICAgICAgICAgICBsX2NzdHJfaW5mby0+dGggPSBwX2oyay0+bV9jcC50aDsKLQotICAgICAgICAgICAgICAgIGxfY3N0cl9pbmZvLT50aWxlX3ggPSBwX2oyay0+bV9jcC50ZHg7Ki8gICAgICAgIC8qIG5ldyB2ZXJzaW9uIHBhcnNlciAqLwotICAgICAgICAgICAgICAgIC8qbF9jc3RyX2luZm8tPnRpbGVfeSA9IHBfajJrLT5tX2NwLnRkeTsqLyAgICAgIC8qIG5ldyB2ZXJzaW9uIHBhcnNlciAqLwotICAgICAgICAgICAgICAgIC8qbF9jc3RyX2luZm8tPnRpbGVfT3ggPSBwX2oyay0+bV9jcC50eDA7Ki8gICAgIC8qIG5ldyB2ZXJzaW9uIHBhcnNlciAqLwotICAgICAgICAgICAgICAgIC8qbF9jc3RyX2luZm8tPnRpbGVfT3kgPSBwX2oyay0+bV9jcC50eTA7Ki8gICAgIC8qIG5ldyB2ZXJzaW9uIHBhcnNlciAqLwotCi0gICAgICAgICAgICAgICAgLypsX2NzdHJfaW5mby0+bnVtY29tcHMgPSBwX2oyay0+bV9pbWFnZS0+bnVtY29tcHM7Ci0KLSAgICAgICAgICAgICAgICBsX2NzdHJfaW5mby0+bnVtbGF5ZXJzID0gKCZwX2oyay0+bV9jcC50Y3BzWzBdKS0+bnVtbGF5ZXJzOwotCi0gICAgICAgICAgICAgICAgbF9jc3RyX2luZm8tPm51bWRlY29tcG9zID0gKE9QSl9JTlQzMiopIG9wal9tYWxsb2MocF9qMmstPm1faW1hZ2UtPm51bWNvbXBzICogc2l6ZW9mKE9QSl9JTlQzMikpOwotCi0gICAgICAgICAgICAgICAgZm9yIChjb21wbm89MDsgY29tcG5vIDwgcF9qMmstPm1faW1hZ2UtPm51bWNvbXBzOyBjb21wbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgbF9jc3RyX2luZm8tPm51bWRlY29tcG9zW2NvbXBub10gPSAoJnBfajJrLT5tX2NwLnRjcHNbMF0pLT50Y2Nwcy0+bnVtcmVzb2x1dGlvbnMgLSAxOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxfY3N0cl9pbmZvLT5EX21heCA9IDAuMDsgICAgICAgKi8gICAgICAvKiBBREQgTWFyY2VsYSAqLwotCi0gICAgICAgICAgICAgICAgLypsX2NzdHJfaW5mby0+bWFpbl9oZWFkX3N0YXJ0ID0gb3BqX3N0cmVhbV90ZWxsKHBfc3RyZWFtKTsqLyAvKiBwb3NpdGlvbiBvZiBTT0MgKi8KLQotICAgICAgICAgICAgICAgIC8qbF9jc3RyX2luZm8tPm1heG1hcmtudW0gPSAxMDA7Ci0gICAgICAgICAgICAgICAgbF9jc3RyX2luZm8tPm1hcmtlciA9IChvcGpfbWFya2VyX2luZm9fdCAqKSBvcGpfbWFsbG9jKGxfY3N0cl9pbmZvLT5tYXhtYXJrbnVtICogc2l6ZW9mKG9wal9tYXJrZXJfaW5mb190KSk7Ci0gICAgICAgICAgICAgICAgbF9jc3RyX2luZm8tPm1hcmtudW0gPSAwOwotICAgICAgICB9Ki8KLQotICAgICAgICByZXR1cm4gb3BqX2oya19jYWxjdWxhdGVfdHAocF9qMmssJihwX2oyay0+bV9jcCksJnBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RvdGFsX3RpbGVfcGFydHMscF9qMmstPm1fcHJpdmF0ZV9pbWFnZSxwX21hbmFnZXIpOwotfQotCi0vKioKLSAqIENyZWF0ZXMgYSB0aWxlLWNvZGVyIGRlY29kZXIuCi0gKgotICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KLSAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCi0gKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19jcmVhdGVfdGNkKCAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKLQotICAgICAgICBwX2oyay0+bV90Y2QgPSBvcGpfdGNkX2NyZWF0ZShPUEpfRkFMU0UpOwotCi0gICAgICAgIGlmICghIHBfajJrLT5tX3RjZCkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgVGlsZSBDb2RlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghb3BqX3RjZF9pbml0KHBfajJrLT5tX3RjZCxwX2oyay0+bV9wcml2YXRlX2ltYWdlLCZwX2oyay0+bV9jcCkpIHsKLSAgICAgICAgICAgICAgICBvcGpfdGNkX2Rlc3Ryb3kocF9qMmstPm1fdGNkKTsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV90Y2QgPSAwMDsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi1PUEpfQk9PTCBvcGpfajJrX3dyaXRlX3RpbGUgKG9wal9qMmtfdCAqIHBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCi17Ci0gICAgICAgIGlmICghIG9wal9qMmtfcHJlX3dyaXRlX3RpbGUocF9qMmsscF90aWxlX2luZGV4LHBfc3RyZWFtLHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd2hpbGUgb3BqX2oya19wcmVfd3JpdGVfdGlsZSB3aXRoIHRpbGUgaW5kZXggPSAlZFxuIiwgcF90aWxlX2luZGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgajsKLSAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBkYXRhICovCi0gICAgICAgICAgICAgICAgZm9yIChqPTA7ajxwX2oyay0+bV90Y2QtPmltYWdlLT5udW1jb21wczsrK2opIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZWNvbXBfdCogbF90aWxlYyA9IHBfajJrLT5tX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+Y29tcHMgKyBqOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZighIG9wal9hbGxvY190aWxlX2NvbXBvbmVudF9kYXRhKGxfdGlsZWMpKSB7Ci0JCQkJCQkJCQkJCQkgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciBhbGxvY2F0aW5nIHRpbGUgY29tcG9uZW50IGRhdGEuIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIG5vdyBjb3B5IGRhdGEgaW50byB0aGUgdGhlIHRpbGUgY29tcG9uZW50ICovCi0gICAgICAgICAgICAgICAgaWYgKCEgb3BqX3RjZF9jb3B5X3RpbGVfZGF0YShwX2oyay0+bV90Y2QscF9kYXRhLHBfZGF0YV9zaXplKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlNpemUgbWlzbWF0Y2ggYmV0d2VlbiB0aWxlIGRhdGEgYW5kIHNlbnQgZGF0YS4iICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoISBvcGpfajJrX3Bvc3Rfd3JpdGVfdGlsZShwX2oyayxwX3N0cmVhbSxwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd2hpbGUgb3BqX2oya19wb3N0X3dyaXRlX3RpbGUgd2l0aCB0aWxlIGluZGV4ID0gJWRcbiIsIHBfdGlsZV9pbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9qMmsuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9qMmsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlMjJhYS4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvajJrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NDQgKzAsMCBAQAotLyoKLSAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzIAotICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIAotICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cwotICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBVbml2ZXJzaXRlIGNhdGhvbGlxdWUgZGUgTG91dmFpbiAoVUNMKSwgQmVsZ2l1bQotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFByb2Zlc3NvciBCZW5vaXQgTWFjcQotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMsIERhdmlkIEphbnNzZW5zCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgWWFubmljayBWZXJzY2h1ZXJlbgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4IAotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTQsIEFudG9uaW4gRGVzY2FtcGUKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQotICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcsIFBhcnZhdGhhIEVsYW5nb3ZhbgotICogQ29weXJpZ2h0IChjKSAyMDA4LCBKZXJvbWUgRmltZXMsIENvbW11bmljYXRpb25zICYgU3lzdGVtZXMgPGplcm9tZS5maW1lc0BjLXMuZnI+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZyYW5jZSAKLSAqIENvcHlyaWdodCAoYykgMjAxMiwgQ1MgU3lzdGVtZXMgZCdJbmZvcm1hdGlvbiwgRnJhbmNlCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCi0gKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotI2lmbmRlZiBfX0oyS19ICi0jZGVmaW5lIF9fSjJLX0gKLS8qKgotQGZpbGUgajJrLmgKLUBicmllZiBUaGUgSlBFRy0yMDAwIENvZGVzdHJlYW0gUmVhZGVyL1dyaXRlciAoSjJLKQotCi1UaGUgZnVuY3Rpb25zIGluIEoySy5DIGhhdmUgZm9yIGdvYWwgdG8gcmVhZC93cml0ZSB0aGUgc2V2ZXJhbCBwYXJ0cyBvZiB0aGUgY29kZXN0cmVhbTogbWFya2VycyBhbmQgZGF0YS4KLSovCi0KLS8qKiBAZGVmZ3JvdXAgSjJLIEoySyAtIEpQRUctMjAwMCBjb2Rlc3RyZWFtIHJlYWRlci93cml0ZXIgKi8KLS8qQHsqLwotCi0jZGVmaW5lIEoyS19DUF9DU1RZX1BSVCAweDAxCi0jZGVmaW5lIEoyS19DUF9DU1RZX1NPUCAweDAyCi0jZGVmaW5lIEoyS19DUF9DU1RZX0VQSCAweDA0Ci0jZGVmaW5lIEoyS19DQ1BfQ1NUWV9QUlQgMHgwMQotI2RlZmluZSBKMktfQ0NQX0NCTEtTVFlfTEFaWSAweDAxICAgICAvKio8IFNlbGVjdGl2ZSBhcml0aG1ldGljIGNvZGluZyBieXBhc3MgKi8KLSNkZWZpbmUgSjJLX0NDUF9DQkxLU1RZX1JFU0VUIDB4MDIgICAgLyoqPCBSZXNldCBjb250ZXh0IHByb2JhYmlsaXRpZXMgb24gY29kaW5nIHBhc3MgYm91bmRhcmllcyAqLwotI2RlZmluZSBKMktfQ0NQX0NCTEtTVFlfVEVSTUFMTCAweDA0ICAvKio8IFRlcm1pbmF0aW9uIG9uIGVhY2ggY29kaW5nIHBhc3MgKi8KLSNkZWZpbmUgSjJLX0NDUF9DQkxLU1RZX1ZTQyAweDA4ICAgICAgLyoqPCBWZXJ0aWNhbGx5IHN0cmlwZSBjYXVzYWwgY29udGV4dCAqLwotI2RlZmluZSBKMktfQ0NQX0NCTEtTVFlfUFRFUk0gMHgxMCAgICAvKio8IFByZWRpY3RhYmxlIHRlcm1pbmF0aW9uICovCi0jZGVmaW5lIEoyS19DQ1BfQ0JMS1NUWV9TRUdTWU0gMHgyMCAgIC8qKjwgU2VnbWVudGF0aW9uIHN5bWJvbHMgYXJlIHVzZWQgKi8KLSNkZWZpbmUgSjJLX0NDUF9RTlRTVFlfTk9RTlQgMAotI2RlZmluZSBKMktfQ0NQX1FOVFNUWV9TSVFOVCAxCi0jZGVmaW5lIEoyS19DQ1BfUU5UU1RZX1NFUU5UIDIKLQotI2RlZmluZSBPUEpfSjJLX0RFRkFVTFRfQ0JMS19EQVRBX1NJWkUgODE5MgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jZGVmaW5lIEoyS19NU19TT0MgMHhmZjRmCS8qKjwgU09DIG1hcmtlciB2YWx1ZSAqLwotI2RlZmluZSBKMktfTVNfU09UIDB4ZmY5MAkvKio8IFNPVCBtYXJrZXIgdmFsdWUgKi8KLSNkZWZpbmUgSjJLX01TX1NPRCAweGZmOTMJLyoqPCBTT0QgbWFya2VyIHZhbHVlICovCi0jZGVmaW5lIEoyS19NU19FT0MgMHhmZmQ5CS8qKjwgRU9DIG1hcmtlciB2YWx1ZSAqLwotI2RlZmluZSBKMktfTVNfU0laIDB4ZmY1MQkvKio8IFNJWiBtYXJrZXIgdmFsdWUgKi8KLSNkZWZpbmUgSjJLX01TX0NPRCAweGZmNTIJLyoqPCBDT0QgbWFya2VyIHZhbHVlICovCi0jZGVmaW5lIEoyS19NU19DT0MgMHhmZjUzCS8qKjwgQ09DIG1hcmtlciB2YWx1ZSAqLwotI2RlZmluZSBKMktfTVNfUkdOIDB4ZmY1ZQkvKio8IFJHTiBtYXJrZXIgdmFsdWUgKi8KLSNkZWZpbmUgSjJLX01TX1FDRCAweGZmNWMJLyoqPCBRQ0QgbWFya2VyIHZhbHVlICovCi0jZGVmaW5lIEoyS19NU19RQ0MgMHhmZjVkCS8qKjwgUUNDIG1hcmtlciB2YWx1ZSAqLwotI2RlZmluZSBKMktfTVNfUE9DIDB4ZmY1ZgkvKio8IFBPQyBtYXJrZXIgdmFsdWUgKi8KLSNkZWZpbmUgSjJLX01TX1RMTSAweGZmNTUJLyoqPCBUTE0gbWFya2VyIHZhbHVlICovCi0jZGVmaW5lIEoyS19NU19QTE0gMHhmZjU3CS8qKjwgUExNIG1hcmtlciB2YWx1ZSAqLwotI2RlZmluZSBKMktfTVNfUExUIDB4ZmY1OAkvKio8IFBMVCBtYXJrZXIgdmFsdWUgKi8KLSNkZWZpbmUgSjJLX01TX1BQTSAweGZmNjAJLyoqPCBQUE0gbWFya2VyIHZhbHVlICovCi0jZGVmaW5lIEoyS19NU19QUFQgMHhmZjYxCS8qKjwgUFBUIG1hcmtlciB2YWx1ZSAqLwotI2RlZmluZSBKMktfTVNfU09QIDB4ZmY5MQkvKio8IFNPUCBtYXJrZXIgdmFsdWUgKi8KLSNkZWZpbmUgSjJLX01TX0VQSCAweGZmOTIJLyoqPCBFUEggbWFya2VyIHZhbHVlICovCi0jZGVmaW5lIEoyS19NU19DUkcgMHhmZjYzCS8qKjwgQ1JHIG1hcmtlciB2YWx1ZSAqLwotI2RlZmluZSBKMktfTVNfQ09NIDB4ZmY2NAkvKio8IENPTSBtYXJrZXIgdmFsdWUgKi8KLSNkZWZpbmUgSjJLX01TX0NCRCAweGZmNzgJLyoqPCBDQkQgbWFya2VyIHZhbHVlICovCi0jZGVmaW5lIEoyS19NU19NQ0MgMHhmZjc1CS8qKjwgTUNDIG1hcmtlciB2YWx1ZSAqLwotI2RlZmluZSBKMktfTVNfTUNUIDB4ZmY3NAkvKio8IE1DVCBtYXJrZXIgdmFsdWUgKi8KLSNkZWZpbmUgSjJLX01TX01DTyAweGZmNzcJLyoqPCBNQ08gbWFya2VyIHZhbHVlICovCi0KLSNkZWZpbmUgSjJLX01TX1VOSyAwCQkvKio8IFVOS05PV04gbWFya2VyIHZhbHVlICovCi0KLS8qIFVuaVBHPj4gKi8KLSNpZmRlZiBVU0VfSlBXTAotI2RlZmluZSBKMktfTVNfRVBDIDB4ZmY2OAkvKio8IEVQQyBtYXJrZXIgdmFsdWUgKFBhcnQgMTE6IEpQRUcgMjAwMCBmb3IgV2lyZWxlc3MpICovCi0jZGVmaW5lIEoyS19NU19FUEIgMHhmZjY2CS8qKjwgRVBCIG1hcmtlciB2YWx1ZSAoUGFydCAxMTogSlBFRyAyMDAwIGZvciBXaXJlbGVzcykgKi8gCi0jZGVmaW5lIEoyS19NU19FU0QgMHhmZjY3CS8qKjwgRVNEIG1hcmtlciB2YWx1ZSAoUGFydCAxMTogSlBFRyAyMDAwIGZvciBXaXJlbGVzcykgKi8gCi0jZGVmaW5lIEoyS19NU19SRUQgMHhmZjY5CS8qKjwgUkVEIG1hcmtlciB2YWx1ZSAoUGFydCAxMTogSlBFRyAyMDAwIGZvciBXaXJlbGVzcykgKi8KLSNlbmRpZiAvKiBVU0VfSlBXTCAqLwotI2lmZGVmIFVTRV9KUFNFQwotI2RlZmluZSBKMktfTVNfU0VDIDB4ZmY2NSAgICAvKio8IFNFQyBtYXJrZXIgdmFsdWUgKFBhcnQgODogU2VjdXJlIEpQRUcgMjAwMCkgKi8KLSNkZWZpbmUgSjJLX01TX0lOU0VDIDB4ZmY5NCAgLyoqPCBJTlNFQyBtYXJrZXIgdmFsdWUgKFBhcnQgODogU2VjdXJlIEpQRUcgMjAwMCkgKi8KLSNlbmRpZiAvKiBVU0VfSlBTRUMgKi8KLS8qIDw8VW5pUEcgKi8KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqCi0gKiBWYWx1ZXMgdGhhdCBzcGVjaWZ5IHRoZSBzdGF0dXMgb2YgdGhlIGRlY29kaW5nIHByb2Nlc3Mgd2hlbiBkZWNvZGluZyB0aGUgbWFpbiBoZWFkZXIuCi0gKiBUaGVzZSB2YWx1ZXMgbWF5IGJlIGNvbWJpbmVkIHdpdGggYSB8IG9wZXJhdG9yLgotICogKi8KLXR5cGVkZWYgZW51bSBKMktfU1RBVFVTIHsKLQlKMktfU1RBVEVfTk9ORSAgPSAgMHgwMDAwLCAvKio8IGEgU09DIG1hcmtlciBpcyBleHBlY3RlZCAqLwotCUoyS19TVEFURV9NSFNPQyAgPSAweDAwMDEsIC8qKjwgYSBTT0MgbWFya2VyIGlzIGV4cGVjdGVkICovCi0JSjJLX1NUQVRFX01IU0laICA9IDB4MDAwMiwgLyoqPCBhIFNJWiBtYXJrZXIgaXMgZXhwZWN0ZWQgKi8KLQlKMktfU1RBVEVfTUggICAgID0gMHgwMDA0LCAvKio8IHRoZSBkZWNvZGluZyBwcm9jZXNzIGlzIGluIHRoZSBtYWluIGhlYWRlciAqLwotCUoyS19TVEFURV9UUEhTT1QgPSAweDAwMDgsIC8qKjwgdGhlIGRlY29kaW5nIHByb2Nlc3MgaXMgaW4gYSB0aWxlIHBhcnQgaGVhZGVyIGFuZCBleHBlY3RzIGEgU09UIG1hcmtlciAqLwotCUoyS19TVEFURV9UUEggICAgPSAweDAwMTAsIC8qKjwgdGhlIGRlY29kaW5nIHByb2Nlc3MgaXMgaW4gYSB0aWxlIHBhcnQgaGVhZGVyICovCi0JSjJLX1NUQVRFX01UICAgICA9IDB4MDAyMCwgLyoqPCB0aGUgRU9DIG1hcmtlciBoYXMganVzdCBiZWVuIHJlYWQgKi8KLQlKMktfU1RBVEVfTkVPQyAgID0gMHgwMDQwLCAvKio8IHRoZSBkZWNvZGluZyBwcm9jZXNzIG11c3Qgbm90IGV4cGVjdCBhIEVPQyBtYXJrZXIgYmVjYXVzZSB0aGUgY29kZXN0cmVhbSBpcyB0cnVuY2F0ZWQgKi8KLQotCUoyS19TVEFURV9FT0MJID0gMHgwMTAwLCAvKio8IHRoZSBkZWNvZGluZyBwcm9jZXNzIGhhcyBlbmNvdW50ZXJlZCB0aGUgRU9DIG1hcmtlciAqLwotCUoyS19TVEFURV9FUlIgICAgPSAweDgwMDAgIC8qKjwgdGhlIGRlY29kaW5nIHByb2Nlc3MgaGFzIGVuY291bnRlcmVkIGFuIGVycm9yIChGSVhNRSB3YXJuaW5nIFYxID0gMHgwMDgwKSovCi19IEoyS19TVEFUVVM7Ci0KLS8qKgotICogVHlwZSBvZiBlbGVtZW50cyBzdG9yaW5nIGluIHRoZSBNQ1QgZGF0YQotICovCi10eXBlZGVmIGVudW0gTUNUX0VMRU1FTlRfVFlQRQotewotCU1DVF9UWVBFX0lOVDE2ID0gMCwJCS8qKiBNQ1QgZGF0YSBpcyBzdG9yZWQgYXMgc2lnbmVkIHNob3J0cyovCi0JTUNUX1RZUEVfSU5UMzIgPSAxLAkJLyoqIE1DVCBkYXRhIGlzIHN0b3JlZCBhcyBzaWduZWQgaW50ZWdlcnMqLwotCU1DVF9UWVBFX0ZMT0FUID0gMiwJCS8qKiBNQ1QgZGF0YSBpcyBzdG9yZWQgYXMgZmxvYXRzKi8KLQlNQ1RfVFlQRV9ET1VCTEUgPSAzCQkvKiogTUNUIGRhdGEgaXMgc3RvcmVkIGFzIGRvdWJsZXMqLwotfSBKMktfTUNUX0VMRU1FTlRfVFlQRTsKLQotLyoqCi0gKiBUeXBlIG9mIE1DVCBhcnJheQotICovCi10eXBlZGVmIGVudW0gTUNUX0FSUkFZX1RZUEUKLXsKLQlNQ1RfVFlQRV9ERVBFTkRFTkNZID0gMCwKLQlNQ1RfVFlQRV9ERUNPUlJFTEFUSU9OID0gMSwKLQlNQ1RfVFlQRV9PRkZTRVQgPSAyCi19IEoyS19NQ1RfQVJSQVlfVFlQRTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqIAotVDIgZW5jb2RpbmcgbW9kZSAKLSovCi10eXBlZGVmIGVudW0gVDJfTU9ERSB7Ci0JVEhSRVNIX0NBTEMgPSAwLAkvKiogRnVuY3Rpb24gY2FsbGVkIGluIFJhdGUgYWxsb2NhdGlvbiBwcm9jZXNzKi8KLQlGSU5BTF9QQVNTID0gMQkJLyoqIEZ1bmN0aW9uIGNhbGxlZCBpbiBUaWVyIDIgcHJvY2VzcyovCi19SjJLX1QyX01PREU7Ci0KLS8qKgotICogUXVhbnRpemF0aW9uIHN0ZXBzaXplCi0gKi8KLXR5cGVkZWYgc3RydWN0IG9wal9zdGVwc2l6ZSB7Ci0JLyoqIGV4cG9uZW50ICovCi0JT1BKX0lOVDMyIGV4cG47Ci0JLyoqIG1hbnRpc3NhICovCi0JT1BKX0lOVDMyIG1hbnQ7Ci19IG9wal9zdGVwc2l6ZV90OwotCi0vKioKLVRpbGUtY29tcG9uZW50IGNvZGluZyBwYXJhbWV0ZXJzCi0qLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX3RjY3AKLXsKLQkvKiogY29kaW5nIHN0eWxlICovCi0JT1BKX1VJTlQzMiBjc3R5OwotCS8qKiBudW1iZXIgb2YgcmVzb2x1dGlvbnMgKi8KLQlPUEpfVUlOVDMyIG51bXJlc29sdXRpb25zOwotCS8qKiBjb2RlLWJsb2NrcyB3aWR0aCAqLwotCU9QSl9VSU5UMzIgY2Jsa3c7Ci0JLyoqIGNvZGUtYmxvY2tzIGhlaWdodCAqLwotCU9QSl9VSU5UMzIgY2Jsa2g7Ci0JLyoqIGNvZGUtYmxvY2sgY29kaW5nIHN0eWxlICovCi0JT1BKX1VJTlQzMiBjYmxrc3R5OwotCS8qKiBkaXNjcmV0ZSB3YXZlbGV0IHRyYW5zZm9ybSBpZGVudGlmaWVyICovCi0JT1BKX1VJTlQzMiBxbWZiaWQ7Ci0JLyoqIHF1YW50aXNhdGlvbiBzdHlsZSAqLwotCU9QSl9VSU5UMzIgcW50c3R5OwotCS8qKiBzdGVwc2l6ZXMgdXNlZCBmb3IgcXVhbnRpemF0aW9uICovCi0Jb3BqX3N0ZXBzaXplX3Qgc3RlcHNpemVzW09QSl9KMktfTUFYQkFORFNdOwotCS8qKiBudW1iZXIgb2YgZ3VhcmQgYml0cyAqLwotCU9QSl9VSU5UMzIgbnVtZ2JpdHM7Ci0JLyoqIFJlZ2lvbiBPZiBJbnRlcmVzdCBzaGlmdCAqLwotCU9QSl9JTlQzMiByb2lzaGlmdDsKLQkvKiogcHJlY2luY3Qgd2lkdGggKi8KLQlPUEpfVUlOVDMyIHByY3dbT1BKX0oyS19NQVhSTFZMU107Ci0JLyoqIHByZWNpbmN0IGhlaWdodCAqLwotCU9QSl9VSU5UMzIgcHJjaFtPUEpfSjJLX01BWFJMVkxTXTsKLQkvKiogdGhlIGRjX2xldmVsX3NoaWZ0ICoqLwotCU9QSl9JTlQzMiBtX2RjX2xldmVsX3NoaWZ0OwotfQotb3BqX3RjY3BfdDsKLQotCi0KLS8qKgotICogRklYTUUgRE9DCi0gKi8KLXR5cGVkZWYgc3RydWN0IG9wal9tY3RfZGF0YQotewotCUoyS19NQ1RfRUxFTUVOVF9UWVBFIG1fZWxlbWVudF90eXBlOwotCUoyS19NQ1RfQVJSQVlfVFlQRQkgbV9hcnJheV90eXBlOwotCU9QSl9VSU5UMzIJCQkgbV9pbmRleDsKLQlPUEpfQllURSAqCQkJIG1fZGF0YTsKLQlPUEpfVUlOVDMyCQkJIG1fZGF0YV9zaXplOwotfQotb3BqX21jdF9kYXRhX3Q7Ci0KLS8qKgotICogRklYTUUgRE9DCi0gKi8KLXR5cGVkZWYgc3RydWN0IG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YQotewotCU9QSl9VSU5UMzIJCQkgbV9pbmRleDsKLQlPUEpfVUlOVDMyCQkJIG1fbmJfY29tcHM7Ci0Jb3BqX21jdF9kYXRhX3QgKgkgbV9kZWNvcnJlbGF0aW9uX2FycmF5OwotCW9wal9tY3RfZGF0YV90ICoJIG1fb2Zmc2V0X2FycmF5OwotCU9QSl9VSU5UMzIJCQkgbV9pc19pcnJldmVyc2libGUgOiAxOwotfQotb3BqX3NpbXBsZV9tY2NfZGVjb3JyZWxhdGlvbl9kYXRhX3Q7Ci0KLS8qKgotVGlsZSBjb2RpbmcgcGFyYW1ldGVycyA6Ci10aGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHN0b3JlIGNvZGluZy9kZWNvZGluZyBwYXJhbWV0ZXJzIGNvbW1vbiB0byBhbGwKLXRpbGVzIChpbmZvcm1hdGlvbiBsaWtlIENPRCwgQ09DIGluIG1haW4gaGVhZGVyKQotKi8KLXR5cGVkZWYgc3RydWN0IG9wal90Y3AKLXsKLQkvKiogY29kaW5nIHN0eWxlICovCi0JT1BKX1VJTlQzMiBjc3R5OwotCS8qKiBwcm9ncmVzc2lvbiBvcmRlciAqLwotCU9QSl9QUk9HX09SREVSIHByZzsKLQkvKiogbnVtYmVyIG9mIGxheWVycyAqLwotCU9QSl9VSU5UMzIgbnVtbGF5ZXJzOwotCU9QSl9VSU5UMzIgbnVtX2xheWVyc190b19kZWNvZGU7Ci0JLyoqIG11bHRpLWNvbXBvbmVudCB0cmFuc2Zvcm0gaWRlbnRpZmllciAqLwotCU9QSl9VSU5UMzIgbWN0OwotCS8qKiByYXRlcyBvZiBsYXllcnMgKi8KLQlPUEpfRkxPQVQzMiByYXRlc1sxMDBdOwotCS8qKiBudW1iZXIgb2YgcHJvZ3Jlc3Npb24gb3JkZXIgY2hhbmdlcyAqLwotCU9QSl9VSU5UMzIgbnVtcG9jczsKLQkvKiogcHJvZ3Jlc3Npb24gb3JkZXIgY2hhbmdlcyAqLwotCW9wal9wb2NfdCBwb2NzWzMyXTsKLQkvKiogcGFja2V0IGhlYWRlciBzdG9yZSB0aGVyZSBmb3IgZnV0dXIgdXNlIGluIHQyX2RlY29kZV9wYWNrZXQgKi8KLQlPUEpfQllURSAqcHB0X2RhdGE7Ci0JLyoqIHVzZWQgdG8ga2VlcCBhIHRyYWNrIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5ICovCi0JT1BKX0JZVEUgKnBwdF9idWZmZXI7Ci0JLyoqIE51bWJlciBvZiBieXRlcyBzdG9yZWQgaW5zaWRlIHBwdF9kYXRhKi8KLQlPUEpfVUlOVDMyIHBwdF9kYXRhX3NpemU7Ci0JLyoqIHNpemUgb2YgcHB0X2RhdGEqLwotCU9QSl9VSU5UMzIgcHB0X2xlbjsKLQkvKiogYWRkIGZpeGVkX3F1YWxpdHkgKi8KLQlPUEpfRkxPQVQzMiBkaXN0b3JhdGlvWzEwMF07Ci0JLyoqIHRpbGUtY29tcG9uZW50IGNvZGluZyBwYXJhbWV0ZXJzICovCi0Jb3BqX3RjY3BfdCAqdGNjcHM7Ci0JLyoqIG51bWJlciBvZiB0aWxlIHBhcnRzIGZvciB0aGUgdGlsZS4gKi8KLQlPUEpfVUlOVDMyIG1fbmJfdGlsZV9wYXJ0czsKLQkvKiogZGF0YSBmb3IgdGhlIHRpbGUgKi8KLQlPUEpfQllURSAqCQltX2RhdGE7Ci0JLyoqIHNpemUgb2YgZGF0YSAqLwotCU9QSl9VSU5UMzIJCW1fZGF0YV9zaXplOwotCS8qKiBlbmNvZGluZyBub3JtcyAqLwotCU9QSl9GTE9BVDY0ICoJbWN0X25vcm1zOwotCS8qKiB0aGUgbWN0IGRlY29kaW5nIG1hdHJpeCAqLwotCU9QSl9GTE9BVDMyICoJbV9tY3RfZGVjb2RpbmdfbWF0cml4OwotCS8qKiB0aGUgbWN0IGNvZGluZyBtYXRyaXggKi8KLQlPUEpfRkxPQVQzMiAqCW1fbWN0X2NvZGluZ19tYXRyaXg7Ci0JLyoqIG1jdCByZWNvcmRzICovCi0Jb3BqX21jdF9kYXRhX3QgKiBtX21jdF9yZWNvcmRzOwotCS8qKiB0aGUgbnVtYmVyIG9mIG1jdCByZWNvcmRzLiAqLwotCU9QSl9VSU5UMzIgbV9uYl9tY3RfcmVjb3JkczsKLQkvKiogdGhlIG1heCBudW1iZXIgb2YgbWN0IHJlY29yZHMuICovCi0JT1BKX1VJTlQzMiBtX25iX21heF9tY3RfcmVjb3JkczsKLQkvKiogbWNjIHJlY29yZHMgKi8KLQlvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCAqIG1fbWNjX3JlY29yZHM7Ci0JLyoqIHRoZSBudW1iZXIgb2YgbWN0IHJlY29yZHMuICovCi0JT1BKX1VJTlQzMiBtX25iX21jY19yZWNvcmRzOwotCS8qKiB0aGUgbWF4IG51bWJlciBvZiBtY3QgcmVjb3Jkcy4gKi8KLQlPUEpfVUlOVDMyIG1fbmJfbWF4X21jY19yZWNvcmRzOwotCi0KLQkvKioqKiogRkxBR1MgKioqKioqKi8KLQkvKiogSWYgY29kID09IDEgLS0+IHRoZXJlIHdhcyBhIENPRCBtYXJrZXIgZm9yIHRoZSBwcmVzZW50IHRpbGUgKi8KLQlPUEpfVUlOVDMyIGNvZCA6IDE7Ci0JLyoqIElmIHBwdCA9PSAxIC0tPiB0aGVyZSB3YXMgYSBQUFQgbWFya2VyIGZvciB0aGUgcHJlc2VudCB0aWxlICovCi0JT1BKX1VJTlQzMiBwcHQgOiAxOwotCS8qKiBpbmRpY2F0ZXMgaWYgYSBQT0MgbWFya2VyIGhhcyBiZWVuIHVzZWQgTzpOTywgMTpZRVMgKi8KLQlPUEpfVUlOVDMyIFBPQyA6IDE7Ci19IG9wal90Y3BfdDsKLQotCi0KLQotdHlwZWRlZiBzdHJ1Y3Qgb3BqX2VuY29kaW5nX3BhcmFtCi17Ci0JLyoqIE1heGltdW0gcmF0ZSBmb3IgZWFjaCBjb21wb25lbnQuIElmID09IDAsIGNvbXBvbmVudCBzaXplIGxpbWl0YXRpb24gaXMgbm90IGNvbnNpZGVyZWQgKi8KLQlPUEpfVUlOVDMyIG1fbWF4X2NvbXBfc2l6ZTsKLQkvKiogUG9zaXRpb24gb2YgdGlsZSBwYXJ0IGZsYWcgaW4gcHJvZ3Jlc3Npb24gb3JkZXIqLwotCU9QSl9JTlQzMiBtX3RwX3BvczsKLQkvKiogZml4ZWQgbGF5ZXIgKi8KLQlPUEpfSU5UMzIgKm1fbWF0cmljZTsKLQkvKiogRmxhZyBkZXRlcm1pbmluZyB0aWxlIHBhcnQgZ2VuZXJhdGlvbiovCi0JT1BKX0JZVEUgbV90cF9mbGFnOwotCS8qKiBhbGxvY2F0aW9uIGJ5IHJhdGUvZGlzdG9ydGlvbiAqLwotCU9QSl9VSU5UMzIgbV9kaXN0b19hbGxvYyA6IDE7Ci0JLyoqIGFsbG9jYXRpb24gYnkgZml4ZWQgbGF5ZXIgKi8KLQlPUEpfVUlOVDMyIG1fZml4ZWRfYWxsb2MgOiAxOwotCS8qKiBhZGQgZml4ZWRfcXVhbGl0eSAqLwotCU9QSl9VSU5UMzIgbV9maXhlZF9xdWFsaXR5IDogMTsKLQkvKiogRW5hYmxpbmcgVGlsZSBwYXJ0IGdlbmVyYXRpb24qLwotCU9QSl9VSU5UMzIgbV90cF9vbiA6IDE7Ci19Ci1vcGpfZW5jb2RpbmdfcGFyYW1fdDsKLQotdHlwZWRlZiBzdHJ1Y3Qgb3BqX2RlY29kaW5nX3BhcmFtCi17Ci0JLyoqIGlmICE9IDAsIHRoZW4gb3JpZ2luYWwgZGltZW5zaW9uIGRpdmlkZWQgYnkgMl4ocmVkdWNlKTsgaWYgPT0gMCBvciBub3QgdXNlZCwgaW1hZ2UgaXMgZGVjb2RlZCB0byB0aGUgZnVsbCByZXNvbHV0aW9uICovCi0JT1BKX1VJTlQzMiBtX3JlZHVjZTsKLQkvKiogaWYgIT0gMCwgdGhlbiBvbmx5IHRoZSBmaXJzdCAibGF5ZXIiIGxheWVycyBhcmUgZGVjb2RlZDsgaWYgPT0gMCBvciBub3QgdXNlZCwgYWxsIHRoZSBxdWFsaXR5IGxheWVycyBhcmUgZGVjb2RlZCAqLwotCU9QSl9VSU5UMzIgbV9sYXllcjsKLX0KLW9wal9kZWNvZGluZ19wYXJhbV90OwotCi0KLS8qKgotICogQ29kaW5nIHBhcmFtZXRlcnMKLSAqLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX2NwCi17Ci0JLyoqIFNpemUgb2YgdGhlIGltYWdlIGluIGJpdHMqLwotCS8qaW50IGltZ19zaXplOyovCi0JLyoqIFJzaXoqLwotICAgIE9QSl9VSU5UMTYgcnNpejsKLQkvKiogWFRPc2l6ICovCi0JT1BKX1VJTlQzMiB0eDA7IC8qIE1TRCBzZWUgbm9ybSAqLwotCS8qKiBZVE9zaXogKi8KLQlPUEpfVUlOVDMyIHR5MDsgLyogTVNEIHNlZSBub3JtICovCi0JLyoqIFhUc2l6ICovCi0JT1BKX1VJTlQzMiB0ZHg7Ci0JLyoqIFlUc2l6ICovCi0JT1BKX1VJTlQzMiB0ZHk7Ci0JLyoqIGNvbW1lbnQgKi8KLQlPUEpfQ0hBUiAqY29tbWVudDsKLQkvKiogbnVtYmVyIG9mIHRpbGVzIGluIHdpZHRoICovCi0JT1BKX1VJTlQzMiB0dzsKLQkvKiogbnVtYmVyIG9mIHRpbGVzIGluIGhlaWd0aCAqLwotCU9QSl9VSU5UMzIgdGg7Ci0KLQkvKiogcGFja2V0IGhlYWRlciBzdG9yZSB0aGVyZSBmb3IgZnV0dXIgdXNlIGluIHQyX2RlY29kZV9wYWNrZXQgKi8KLQlPUEpfQllURSAqcHBtX2RhdGE7Ci0JLyoqIHNpemUgb2YgdGhlIHBwbV9kYXRhKi8KLQlPUEpfVUlOVDMyIHBwbV9sZW47Ci0JLyoqIHNpemUgb2YgdGhlIHBwbV9kYXRhKi8KLQlPUEpfVUlOVDMyIHBwbV9kYXRhX3JlYWQ7Ci0KLQlPUEpfQllURSAqcHBtX2RhdGFfY3VycmVudDsKLQotCS8qKiBwYWNrZXQgaGVhZGVyIHN0b3JhZ2Ugb3JpZ2luYWwgYnVmZmVyICovCi0JT1BKX0JZVEUgKnBwbV9idWZmZXI7Ci0JLyoqIHBvaW50ZXIgcmVtYWluaW5nIG9uIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBmaXJzdCBoZWFkZXIgaWYgcHBtIGlzIHVzZWQgKi8KLQlPUEpfQllURSAqcHBtX2RhdGFfZmlyc3Q7Ci0JLyoqIE51bWJlciBvZiBieXRlcyBhY3R1YWxseSBzdG9yZWQgaW5zaWRlIHRoZSBwcG1fZGF0YSAqLwotCU9QSl9VSU5UMzIgcHBtX2RhdGFfc2l6ZTsKLQkvKiogdXNlIGluIGNhc2Ugb2YgbXVsdGlwbGUgbWFya2VyIFBQTSAobnVtYmVyIG9mIGluZm8gYWxyZWFkeSBzdG9yZSkgKi8KLQlPUEpfSU5UMzIgcHBtX3N0b3JlOwotCS8qKiB1c2UgaW4gY2FzZSBvZiBtdWx0aXBsZSBtYXJrZXIgUFBNIChjYXNlIG9uIG5vbi1maW5pc2hlZCBwcmV2aW91cyBpbmZvKSAqLwotCU9QSl9JTlQzMiBwcG1fcHJldmlvdXM7Ci0KLQkvKiogdGlsZSBjb2RpbmcgcGFyYW1ldGVycyAqLwotCW9wal90Y3BfdCAqdGNwczsKLQotCXVuaW9uCi0JewotCQlvcGpfZGVjb2RpbmdfcGFyYW1fdCBtX2RlYzsKLQkJb3BqX2VuY29kaW5nX3BhcmFtX3QgbV9lbmM7Ci0JfQotCW1fc3BlY2lmaWNfcGFyYW07Ci0KLQotLyogVW5pUEc+PiAqLwotI2lmZGVmIFVTRV9KUFdMCi0JLyoqIGVuYWJsZXMgd3JpdGluZyBvZiBFUEMgaW4gTUgsIHRodXMgYWN0aXZhdGluZyBKUFdMICovCi0JT1BKX0JPT0wgZXBjX29uOwotCS8qKiBlbmFibGVzIHdyaXRpbmcgb2YgRVBCLCBpbiBjYXNlIG9mIGFjdGl2YXRlZCBKUFdMICovCi0JT1BKX0JPT0wgZXBiX29uOwotCS8qKiBlbmFibGVzIHdyaXRpbmcgb2YgRVNELCBpbiBjYXNlIG9mIGFjdGl2YXRlZCBKUFdMICovCi0JT1BKX0JPT0wgZXNkX29uOwotCS8qKiBlbmFibGVzIHdyaXRpbmcgb2YgaW5mb3JtYXRpdmUgdGVjaG5pcXVlcyBvZiBFU0QsIGluIGNhc2Ugb2YgYWN0aXZhdGVkIEpQV0wgKi8KLQlPUEpfQk9PTCBpbmZvX29uOwotCS8qKiBlbmFibGVzIHdyaXRpbmcgb2YgUkVELCBpbiBjYXNlIG9mIGFjdGl2YXRlZCBKUFdMICovCi0JT1BKX0JPT0wgcmVkX29uOwotCS8qKiBlcnJvciBwcm90ZWN0aW9uIG1ldGhvZCBmb3IgTUggKDAsMSwxNiwzMiwzNy0xMjgpICovCi0JaW50IGhwcm90X01IOwotCS8qKiB0aWxlIG51bWJlciBvZiBoZWFkZXIgcHJvdGVjdGlvbiBzcGVjaWZpY2F0aW9uICg+PTApICovCi0JaW50IGhwcm90X1RQSF90aWxlbm9bSlBXTF9NQVhfTk9fVElMRVNQRUNTXTsKLQkvKiogZXJyb3IgcHJvdGVjdGlvbiBtZXRob2RzIGZvciBUUEhzICgwLDEsMTYsMzIsMzctMTI4KSAqLwotCWludCBocHJvdF9UUEhbSlBXTF9NQVhfTk9fVElMRVNQRUNTXTsKLQkvKiogdGlsZSBudW1iZXIgb2YgcGFja2V0IHByb3RlY3Rpb24gc3BlY2lmaWNhdGlvbiAoPj0wKSAqLwotCWludCBwcHJvdF90aWxlbm9bSlBXTF9NQVhfTk9fUEFDS1NQRUNTXTsKLQkvKiogcGFja2V0IG51bWJlciBvZiBwYWNrZXQgcHJvdGVjdGlvbiBzcGVjaWZpY2F0aW9uICg+PTApICovCi0JaW50IHBwcm90X3BhY2tub1tKUFdMX01BWF9OT19QQUNLU1BFQ1NdOwotCS8qKiBlcnJvciBwcm90ZWN0aW9uIG1ldGhvZHMgZm9yIHBhY2tldHMgKDAsMSwxNiwzMiwzNy0xMjgpICovCi0JaW50IHBwcm90W0pQV0xfTUFYX05PX1BBQ0tTUEVDU107Ci0JLyoqIGVuYWJsZXMgd3JpdGluZyBvZiBFU0QsICgwLzIvNCBieXRlcykgKi8KLQlpbnQgc2Vuc19zaXplOwotCS8qKiBzZW5zaXRpdml0eSBhZGRyZXNzaW5nIHNpemUgKDA9YXV0by8yLzQgYnl0ZXMpICovCi0JaW50IHNlbnNfYWRkcjsKLQkvKiogc2Vuc2l0aXZpdHkgcmFuZ2UgKDAtMykgKi8KLQlpbnQgc2Vuc19yYW5nZTsKLQkvKiogc2Vuc2l0aXZpdHkgbWV0aG9kIGZvciBNSCAoLTEsMC03KSAqLwotCWludCBzZW5zX01IOwotCS8qKiB0aWxlIG51bWJlciBvZiBzZW5zaXRpdml0eSBzcGVjaWZpY2F0aW9uICg+PTApICovCi0JaW50IHNlbnNfVFBIX3RpbGVub1tKUFdMX01BWF9OT19USUxFU1BFQ1NdOwotCS8qKiBzZW5zaXRpdml0eSBtZXRob2RzIGZvciBUUEhzICgtMSwwLTcpICovCi0JaW50IHNlbnNfVFBIW0pQV0xfTUFYX05PX1RJTEVTUEVDU107Ci0JLyoqIGVuYWJsZXMgSlBXTCBjb3JyZWN0aW9uIGF0IHRoZSBkZWNvZGVyICovCi0JT1BKX0JPT0wgY29ycmVjdDsKLQkvKiogZXhwZWN0ZWQgbnVtYmVyIG9mIGNvbXBvbmVudHMgYXQgdGhlIGRlY29kZXIgKi8KLQlpbnQgZXhwX2NvbXBzOwotCS8qKiBtYXhpbXVtIG51bWJlciBvZiB0aWxlcyBhdCB0aGUgZGVjb2RlciAqLwotCU9QSl9VSU5UMzIgbWF4X3RpbGVzOwotI2VuZGlmIC8qIFVTRV9KUFdMICovCi0KLQkvKioqKioqKiogRkxBR1MgKioqKioqKioqLwotCS8qKiBpZiBwcG0gPT0gMSAtLT4gdGhlcmUgd2FzIGEgUFBNIG1hcmtlciovCi0JT1BKX1VJTlQzMiBwcG0gOiAxOwotCS8qKiB0ZWxscyBpZiB0aGUgcGFyYW1ldGVyIGlzIGEgY29kaW5nIG9yIGRlY29kaW5nIG9uZSAqLwotCU9QSl9VSU5UMzIgbV9pc19kZWNvZGVyIDogMTsKLS8qIDw8VW5pUEcgKi8KLX0gb3BqX2NwX3Q7Ci0KLQotdHlwZWRlZiBzdHJ1Y3Qgb3BqX2oya19kZWMKLXsKLQkvKiogbG9jYXRlIGluIHdoaWNoIHBhcnQgb2YgdGhlIGNvZGVzdHJlYW0gdGhlIGRlY29kZXIgaXMgKG1haW4gaGVhZGVyLCB0aWxlIGhlYWRlciwgZW5kKSAqLwotCU9QSl9VSU5UMzIgbV9zdGF0ZTsKLQkvKioKLQkgKiBzdG9yZSBkZWNvZGluZyBwYXJhbWV0ZXJzIGNvbW1vbiB0byBhbGwgdGlsZXMgKGluZm9ybWF0aW9uIGxpa2UgQ09ELCBDT0MgaW4gbWFpbiBoZWFkZXIpCi0JICovCi0Jb3BqX3RjcF90ICptX2RlZmF1bHRfdGNwOwotCU9QSl9CWVRFICAqbV9oZWFkZXJfZGF0YTsKLQlPUEpfVUlOVDMyIG1faGVhZGVyX2RhdGFfc2l6ZTsKLQkvKiogdG8gdGVsbCB0aGUgdGlsZSBwYXJ0IGxlbmd0aCAqLwotCU9QSl9VSU5UMzIgbV9zb3RfbGVuZ3RoOwotCS8qKiBPbmx5IHRpbGVzIGluZGV4IGluIHRoZSBjb3JyZWN0IHJhbmdlIHdpbGwgYmUgZGVjb2RlZC4qLwotCU9QSl9VSU5UMzIgbV9zdGFydF90aWxlX3g7Ci0JT1BKX1VJTlQzMiBtX3N0YXJ0X3RpbGVfeTsKLQlPUEpfVUlOVDMyIG1fZW5kX3RpbGVfeDsKLQlPUEpfVUlOVDMyIG1fZW5kX3RpbGVfeTsKLQkvKioKLQkgKiBEZWNvZGVkIGFyZWEgc2V0IGJ5IHRoZSB1c2VyCi0JICovCi0JT1BKX1VJTlQzMiBtX0RBX3gwOwotCU9QSl9VSU5UMzIgbV9EQV95MDsKLQlPUEpfVUlOVDMyIG1fREFfeDE7Ci0JT1BKX1VJTlQzMiBtX0RBX3kxOwotCi0JLyoqIEluZGV4IG9mIHRoZSB0aWxlIHRvIGRlY29kZSAodXNlZCBpbiBnZXRfdGlsZSkgKi8KLQlPUEpfSU5UMzIgbV90aWxlX2luZF90b19kZWM7Ci0JLyoqIFBvc2l0aW9uIG9mIHRoZSBsYXN0IFNPVCBtYXJrZXIgcmVhZCAqLwotCU9QSl9PRkZfVCBtX2xhc3Rfc290X3JlYWRfcG9zOwotCi0JLyoqCi0JICogSW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCB0aWxlLXBhcnQgaXMgYXNzdW1lIGFzIHRoZSBsYXN0IHRpbGUgcGFydCBvZiB0aGUgY29kZXN0cmVhbS4KLQkgKiBJdCBpcyB1c2VmdWwgaW4gdGhlIGNhc2Ugb2YgUFNvdCBpcyBlcXVhbCB0byB6ZXJvLiBUaGUgc290IGxlbmd0aCB3aWxsIGJlIGNvbXB1dGUgaW4gdGhlCi0JICogU09EIHJlYWRlciBmdW5jdGlvbi4gRklYTUUgTk9UIFVTRUQgZm9yIHRoZSBtb21lbnQKLQkgKi8KLQlPUEpfQk9PTCAgIG1fbGFzdF90aWxlX3BhcnQ7Ci0JLyoqIHRvIHRlbGwgdGhhdCBhIHRpbGUgY2FuIGJlIGRlY29kZWQuICovCi0JT1BKX1VJTlQzMiBtX2Nhbl9kZWNvZGUJCQk6IDE7Ci0JT1BKX1VJTlQzMiBtX2Rpc2NhcmRfdGlsZXMJCTogMTsKLQlPUEpfVUlOVDMyIG1fc2tpcF9kYXRhCQkJOiAxOwotCi19IG9wal9qMmtfZGVjX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IG9wal9qMmtfZW5jCi17Ci0JLyoqIFRpbGUgcGFydCBudW1iZXIsIHJlZ2FyZGxlc3Mgb2YgcG9jLCBmb3IgZWFjaCBuZXcgcG9jLCB0cCBpcyByZXNldCB0byAxKi8KLQlPUEpfVUlOVDMyIG1fY3VycmVudF9wb2NfdGlsZV9wYXJ0X251bWJlcjsgLyogdHBfbnVtICovCi0KLQkvKiogVGlsZSBwYXJ0IG51bWJlciBjdXJyZW50bHkgY29kaW5nLCB0YWtpbmcgaW50byBhY2NvdW50IFBPQy4gbV9jdXJyZW50X3RpbGVfcGFydF9udW1iZXIgaG9sZHMgdGhlIHRvdGFsIG51bWJlciBvZiB0aWxlIHBhcnRzIHdoaWxlIGVuY29kaW5nIHRoZSBsYXN0IHRpbGUgcGFydC4qLwotCU9QSl9VSU5UMzIgbV9jdXJyZW50X3RpbGVfcGFydF9udW1iZXI7IC8qY3VyX3RwX251bSAqLwotCi0JLyoqCi0JbG9jYXRlIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgVExNIG1hcmtlcgotCWFmdGVyIGVuY29kaW5nIHRoZSB0aWxlcGFydCwgYSBqdW1wIChpbiBqMmtfd3JpdGVfc29kKSBpcyBkb25lIHRvIHRoZSBUTE0gbWFya2VyIHRvIHN0b3JlIHRoZSB2YWx1ZSBvZiBpdHMgbGVuZ3RoLgotCSovCi0gICAgT1BKX09GRl9UIG1fdGxtX3N0YXJ0OwotCS8qKgotCSAqIFN0b3JlcyB0aGUgc2l6ZXMgb2YgdGhlIHRsbS4KLQkgKi8KLQlPUEpfQllURSAqIG1fdGxtX3NvdF9vZmZzZXRzX2J1ZmZlcjsKLQkvKioKLQkgKiBUaGUgY3VycmVudCBvZmZzZXQgb2YgdGhlIHRsbSBidWZmZXIuCi0JICovCi0JT1BKX0JZVEUgKiBtX3RsbV9zb3Rfb2Zmc2V0c19jdXJyZW50OwotCi0JLyoqIFRvdGFsIG51bSBvZiB0aWxlIHBhcnRzIGluIHdob2xlIGltYWdlID0gbnVtIHRpbGVzKiBudW0gdGlsZXBhcnRzIGluIGVhY2ggdGlsZSovCi0JLyoqIHVzZWQgaW4gVExNbWFya2VyKi8KLQlPUEpfVUlOVDMyIG1fdG90YWxfdGlsZV9wYXJ0czsJIC8qIHRvdG51bV90cCAqLwotCi0JLyogZW5jb2RlZCBkYXRhIGZvciBhIHRpbGUgKi8KLQlPUEpfQllURSAqIG1fZW5jb2RlZF90aWxlX2RhdGE7Ci0KLQkvKiBzaXplIG9mIHRoZSBlbmNvZGVkX2RhdGEgKi8KLQlPUEpfVUlOVDMyIG1fZW5jb2RlZF90aWxlX3NpemU7Ci0KLQkvKiBlbmNvZGVkIGRhdGEgZm9yIGEgdGlsZSAqLwotCU9QSl9CWVRFICogbV9oZWFkZXJfdGlsZV9kYXRhOwotCi0JLyogc2l6ZSBvZiB0aGUgZW5jb2RlZF9kYXRhICovCi0JT1BKX1VJTlQzMiBtX2hlYWRlcl90aWxlX2RhdGFfc2l6ZTsKLQotCi19IG9wal9qMmtfZW5jX3Q7Ci0KLQotCi1zdHJ1Y3Qgb3BqX3RjZDsKLS8qKgotSlBFRy0yMDAwIGNvZGVzdHJlYW0gcmVhZGVyL3dyaXRlcgotKi8KLXR5cGVkZWYgc3RydWN0IG9wal9qMmsKLXsKLQkvKiBKMksgY29kZXN0cmVhbSBpcyBkZWNvZGVkKi8KLQlPUEpfQk9PTCBtX2lzX2RlY29kZXI7Ci0KLQkvKiBGSVhNRSBET0MqLwotCXVuaW9uCi0JewotCQlvcGpfajJrX2RlY190IG1fZGVjb2RlcjsKLQkJb3BqX2oya19lbmNfdCBtX2VuY29kZXI7Ci0JfQotCW1fc3BlY2lmaWNfcGFyYW07Ci0KLQkvKiogcG9pbnRlciB0byB0aGUgaW50ZXJuYWwvcHJpdmF0ZSBlbmNvZGVkIC8gZGVjb2RlZCBpbWFnZSAqLwotCW9wal9pbWFnZV90KiBtX3ByaXZhdGVfaW1hZ2U7Ci0KLQkvKiBwb2ludGVyIHRvIHRoZSBvdXRwdXQgaW1hZ2UgKGRlY29kZWQpKi8KLQlvcGpfaW1hZ2VfdCogbV9vdXRwdXRfaW1hZ2U7Ci0KLQkvKiogQ29kaW5nIHBhcmFtZXRlcnMgKi8KLQlvcGpfY3BfdCBtX2NwOwotCi0JLyoqIHRoZSBsaXN0IG9mIHByb2NlZHVyZXMgdG8gZXhlYyAqKi8KLQlvcGpfcHJvY2VkdXJlX2xpc3RfdCAqCW1fcHJvY2VkdXJlX2xpc3Q7Ci0KLQkvKiogdGhlIGxpc3Qgb2YgdmFsaWRhdGlvbiBwcm9jZWR1cmVzIHRvIGZvbGxvdyB0byBtYWtlIHN1cmUgdGhlIGNvZGUgaXMgdmFsaWQgKiovCi0Jb3BqX3Byb2NlZHVyZV9saXN0X3QgKgltX3ZhbGlkYXRpb25fbGlzdDsKLQotCS8qKiBoZWxwZXIgdXNlZCB0byB3cml0ZSB0aGUgaW5kZXggZmlsZSAqLwotCW9wal9jb2Rlc3RyZWFtX2luZGV4X3QgKmNzdHJfaW5kZXg7Ci0KLQkvKiogbnVtYmVyIG9mIHRoZSB0aWxlIGN1cmVudGx5IGNvbmNlcm4gYnkgY29kaW5nL2RlY29kaW5nICovCi0JT1BKX1VJTlQzMiBtX2N1cnJlbnRfdGlsZV9udW1iZXI7Ci0KLQkvKiogdGhlIGN1cnJlbnQgdGlsZSBjb2Rlci9kZWNvZGVyICoqLwotCXN0cnVjdCBvcGpfdGNkICoJbV90Y2Q7Ci0KLX0KLW9wal9qMmtfdDsKLQotCi0KLQotLyoqIEBuYW1lIEV4cG9ydGVkIGZ1bmN0aW9ucyAqLwotLypAeyovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKioKLVNldHVwIHRoZSBkZWNvZGVyIGRlY29kaW5nIHBhcmFtZXRlcnMgdXNpbmcgdXNlciBwYXJhbWV0ZXJzLgotRGVjb2RpbmcgcGFyYW1ldGVycyBhcmUgcmV0dXJuZWQgaW4gajJrLT5jcC4gCi1AcGFyYW0gajJrIEoySyBkZWNvbXByZXNzb3IgaGFuZGxlCi1AcGFyYW0gcGFyYW1ldGVycyBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMKLSovCi12b2lkIG9wal9qMmtfc2V0dXBfZGVjb2RlcihvcGpfajJrX3QgKmoyaywgb3BqX2RwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMpOwotCi0vKioKLSAqIENyZWF0ZXMgYSBKMksgY29tcHJlc3Npb24gc3RydWN0dXJlCi0gKgotICogQHJldHVybiBSZXR1cm5zIGEgaGFuZGxlIHRvIGEgSjJLIGNvbXByZXNzb3IgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQotKi8KLW9wal9qMmtfdCogb3BqX2oya19jcmVhdGVfY29tcHJlc3Modm9pZCk7Ci0KLQotT1BKX0JPT0wgb3BqX2oya19zZXR1cF9lbmNvZGVyKAlvcGpfajJrX3QgKnBfajJrLAotCQkJCQkJICAgIG9wal9jcGFyYW1ldGVyc190ICpwYXJhbWV0ZXJzLAotCQkJCQkJICAgIG9wal9pbWFnZV90ICppbWFnZSwKLQkJCQkJCSAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwotCi0vKioKLUNvbnZlcnRzIGFuIGVudW0gdHlwZSBwcm9ncmVzc2lvbiBvcmRlciB0byBzdHJpbmcgdHlwZQotKi8KLWNoYXIgKm9wal9qMmtfY29udmVydF9wcm9ncmVzc2lvbl9vcmRlcihPUEpfUFJPR19PUkRFUiBwcmdfb3JkZXIpOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLypAfSovCi0KLS8qQH0qLwotCi0vKioKLSAqIEVuZHMgdGhlIGRlY29tcHJlc3Npb24gcHJvY2VkdXJlcyBhbmQgcG9zc2liaWxpeSBhZGQgZGF0YSB0byBiZSByZWFkIGFmdGVyIHRoZQotICogY29kZXN0cmVhbS4KLSAqLwotT1BKX0JPT0wgb3BqX2oya19lbmRfZGVjb21wcmVzcyhvcGpfajJrX3QgKmoyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwotCi0vKioKLSAqIFJlYWRzIGEganBlZzIwMDAgY29kZXN0cmVhbSBoZWFkZXIgc3RydWN0dXJlLgotICoKLSAqIEBwYXJhbSBwX3N0cmVhbSB0aGUgc3RyZWFtIHRvIHJlYWQgZGF0YSBmcm9tLgotICogQHBhcmFtIHBfajJrIHRoZSBqcGVnMjAwMCBjb2RlYy4KLSAqIEBwYXJhbSBwX2ltYWdlIEZJWE1FIERPQwotICogQHBhcmFtIHBfbWFuYWdlciB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotICoKLSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYm94IGlzIHZhbGlkLgotICovCi1PUEpfQk9PTCBvcGpfajJrX3JlYWRfaGVhZGVyKAlvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9qMmtfdCogcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90KiogcF9pbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90KiBwX21hbmFnZXIgKTsKLQotCi0vKioKLSAqIERlc3Ryb3lzIGEganBlZzIwMDAgY29kZWMuCi0gKgotICogQHBhcmFtCXBfajJrCXRoZSBqcGVnMjAwMDAgc3RydWN0dXJlIHRvIGRlc3Ryb3kuCi0gKi8KLXZvaWQgb3BqX2oya19kZXN0cm95IChvcGpfajJrX3QgKnBfajJrKTsKLQotLyoqCi0gKiBEZXN0cm95cyBhIGNvZGVzdHJlYW0gaW5kZXggc3RydWN0dXJlLgotICoKLSAqIEBwYXJhbQlwX2NzdHJfaW5kCXRoZSBjb2Rlc3RyZWFtIGluZGV4IHBhcmFtZXRlciB0byBkZXN0cm95LgotICovCi12b2lkIGoya19kZXN0cm95X2NzdHJfaW5kZXggKG9wal9jb2Rlc3RyZWFtX2luZGV4X3QgKnBfY3N0cl9pbmQpOwotCi0vKioKLSAqIERlY29kZSB0aWxlIGRhdGEuCi0gKiBAcGFyYW0JcF9qMmsJCXRoZSBqcGVnMjAwMCBjb2RlYy4KLSAqIEBwYXJhbQlwX3RpbGVfaW5kZXgKLSAqIEBwYXJhbSBwX2RhdGEgICAgICAgRklYTUUgRE9DCi0gKiBAcGFyYW0gcF9kYXRhX3NpemUgIEZJWE1FIERPQwotICogQHBhcmFtCXBfc3RyZWFtCQkJdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgotICogQHBhcmFtCXBfbWFuYWdlcgl0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotICovCi1PUEpfQk9PTCBvcGpfajJrX2RlY29kZV90aWxlICggIG9wal9qMmtfdCAqIHBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLS8qKgotICogUmVhZHMgYSB0aWxlIGhlYWRlci4KLSAqIEBwYXJhbQlwX2oyawkJdGhlIGpwZWcyMDAwIGNvZGVjLgotICogQHBhcmFtCXBfdGlsZV9pbmRleCBGSVhNRSBET0MKLSAqIEBwYXJhbQlwX2RhdGFfc2l6ZSBGSVhNRSBET0MKLSAqIEBwYXJhbQlwX3RpbGVfeDAgRklYTUUgRE9DCi0gKiBAcGFyYW0JcF90aWxlX3kwIEZJWE1FIERPQwotICogQHBhcmFtCXBfdGlsZV94MSBGSVhNRSBET0MKLSAqIEBwYXJhbQlwX3RpbGVfeTEgRklYTUUgRE9DCi0gKiBAcGFyYW0JcF9uYl9jb21wcyBGSVhNRSBET0MKLSAqIEBwYXJhbQlwX2dvX29uIEZJWE1FIERPQwotICogQHBhcmFtCXBfc3RyZWFtCQkJdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgotICogQHBhcmFtCXBfbWFuYWdlcgl0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotICovCi1PUEpfQk9PTCBvcGpfajJrX3JlYWRfdGlsZV9oZWFkZXIgKCBvcGpfajJrX3QgKiBwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX3RpbGVfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBwX3RpbGVfeDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBwX3RpbGVfeTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBwX3RpbGVfeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBwX3RpbGVfeTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9uYl9jb21wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CT09MICogcF9nb19vbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotCi0KLS8qKgotICogU2V0cyB0aGUgZ2l2ZW4gYXJlYSB0byBiZSBkZWNvZGVkLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYWZ0ZXIgb3BqX3JlYWRfaGVhZGVyIGFuZCBiZWZvcmUgYW55IHRpbGUgaGVhZGVyIHJlYWRpbmcuCi0gKgotICogQHBhcmFtCXBfajJrCQkJdGhlIGpwZWcyMDAwIGNvZGVjLgotICogQHBhcmFtCXBfaW1hZ2UgICAgIEZJWE1FIERPQwotICogQHBhcmFtCXBfc3RhcnRfeAkJdGhlIGxlZnQgcG9zaXRpb24gb2YgdGhlIHJlY3RhbmdsZSB0byBkZWNvZGUgKGluIGltYWdlIGNvb3JkaW5hdGVzKS4KLSAqIEBwYXJhbQlwX3N0YXJ0X3kJCXRoZSB1cCBwb3NpdGlvbiBvZiB0aGUgcmVjdGFuZ2xlIHRvIGRlY29kZSAoaW4gaW1hZ2UgY29vcmRpbmF0ZXMpLgotICogQHBhcmFtCXBfZW5kX3gJCQl0aGUgcmlnaHQgcG9zaXRpb24gb2YgdGhlIHJlY3RhbmdsZSB0byBkZWNvZGUgKGluIGltYWdlIGNvb3JkaW5hdGVzKS4KLSAqIEBwYXJhbQlwX2VuZF95CQkJdGhlIGJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgcmVjdGFuZ2xlIHRvIGRlY29kZSAoaW4gaW1hZ2UgY29vcmRpbmF0ZXMpLgotICogQHBhcmFtCXBfbWFuYWdlcgkJdGhlIHVzZXIgZXZlbnQgbWFuYWdlcgotICoKLSAqIEByZXR1cm4JdHJ1ZQkJCWlmIHRoZSBhcmVhIGNvdWxkIGJlIHNldC4KLSAqLwotT1BKX0JPT0wgb3BqX2oya19zZXRfZGVjb2RlX2FyZWEoCW9wal9qMmtfdCAqcF9qMmssCi0JCQkJCQkJCSAgICBvcGpfaW1hZ2VfdCogcF9pbWFnZSwKLQkJCQkJCQkJICAgIE9QSl9JTlQzMiBwX3N0YXJ0X3gsIE9QSl9JTlQzMiBwX3N0YXJ0X3ksCi0JCQkJCQkJCSAgICBPUEpfSU5UMzIgcF9lbmRfeCwgT1BKX0lOVDMyIHBfZW5kX3ksCi0JCQkJCQkJCSAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotLyoqCi0gKiBDcmVhdGVzIGEgSjJLIGRlY29tcHJlc3Npb24gc3RydWN0dXJlLgotICoKLSAqIEByZXR1cm4gYSBoYW5kbGUgdG8gYSBKMksgZGVjb21wcmVzc29yIGlmIHN1Y2Nlc3NmdWwsIE5VTEwgb3RoZXJ3aXNlLgotICovCi1vcGpfajJrX3QqIG9wal9qMmtfY3JlYXRlX2RlY29tcHJlc3Modm9pZCk7Ci0KLQotLyoqCi0gKiBEdW1wIHNvbWUgZWxlbWVudHMgZnJvbSB0aGUgSjJLIGRlY29tcHJlc3Npb24gc3RydWN0dXJlIC4KLSAqCi0gKkBwYXJhbSBwX2oyawkJCQl0aGUganBlZzIwMDAgY29kZWMuCi0gKkBwYXJhbSBmbGFnCQkJCWZsYWcgdG8gZGVzY3JpYmUgd2hhdCBlbG1lbnRzIGFyZSBkdW1wLgotICpAcGFyYW0gb3V0X3N0cmVhbQkJCW91dHB1dCBzdHJlYW0gd2hlcmUgZHVtcCB0aGUgZWxlbWVudHMuCi0gKgotKi8KLXZvaWQgajJrX2R1bXAgKG9wal9qMmtfdCogcF9qMmssIE9QSl9JTlQzMiBmbGFnLCBGSUxFKiBvdXRfc3RyZWFtKTsKLQotCi0KLS8qKgotICogRHVtcCBhbiBpbWFnZSBoZWFkZXIgc3RydWN0dXJlLgotICoKLSAqQHBhcmFtIGltYWdlCQkJdGhlIGltYWdlIGhlYWRlciB0byBkdW1wLgotICpAcGFyYW0gZGV2X2R1bXBfZmxhZwkJZmxhZyB0byBkZXNjcmliZSBpZiB3ZSBhcmUgaW4gdGhlIGNhc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB1c2Ugb3V0c2lkZSBqMmtfZHVtcCBmdW5jdGlvbgotICpAcGFyYW0gb3V0X3N0cmVhbQkJCW91dHB1dCBzdHJlYW0gd2hlcmUgZHVtcCB0aGUgZWxlbWVudHMuCi0gKi8KLXZvaWQgajJrX2R1bXBfaW1hZ2VfaGVhZGVyKG9wal9pbWFnZV90KiBpbWFnZSwgT1BKX0JPT0wgZGV2X2R1bXBfZmxhZywgRklMRSogb3V0X3N0cmVhbSk7Ci0KLS8qKgotICogRHVtcCBhIGNvbXBvbmVudCBpbWFnZSBoZWFkZXIgc3RydWN0dXJlLgotICoKLSAqQHBhcmFtIGNvbXAJCXRoZSBjb21wb25lbnQgaW1hZ2UgaGVhZGVyIHRvIGR1bXAuCi0gKkBwYXJhbSBkZXZfZHVtcF9mbGFnCQlmbGFnIHRvIGRlc2NyaWJlIGlmIHdlIGFyZSBpbiB0aGUgY2FzZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHVzZSBvdXRzaWRlIGoya19kdW1wIGZ1bmN0aW9uCi0gKkBwYXJhbSBvdXRfc3RyZWFtCQkJb3V0cHV0IHN0cmVhbSB3aGVyZSBkdW1wIHRoZSBlbGVtZW50cy4KLSAqLwotdm9pZCBqMmtfZHVtcF9pbWFnZV9jb21wX2hlYWRlcihvcGpfaW1hZ2VfY29tcF90KiBjb21wLCBPUEpfQk9PTCBkZXZfZHVtcF9mbGFnLCBGSUxFKiBvdXRfc3RyZWFtKTsKLQotLyoqCi0gKiBHZXQgdGhlIGNvZGVzdHJlYW0gaW5mbyBmcm9tIGEgSlBFRzIwMDAgY29kZWMuCi0gKgotICpAcGFyYW0JcF9qMmsJCQkJdGhlIGNvbXBvbmVudCBpbWFnZSBoZWFkZXIgdG8gZHVtcC4KLSAqCi0gKkByZXR1cm4JdGhlIGNvZGVzdHJlYW0gaW5mb3JtYXRpb24gZXh0cmFjdCBmcm9tIHRoZSBqcGcyMDAwIGNvZGVjCi0gKi8KLW9wal9jb2Rlc3RyZWFtX2luZm9fdjJfdCogajJrX2dldF9jc3RyX2luZm8ob3BqX2oya190KiBwX2oyayk7Ci0KLS8qKgotICogR2V0IHRoZSBjb2Rlc3RyZWFtIGluZGV4IGZyb20gYSBKUEVHMjAwMCBjb2RlYy4KLSAqCi0gKkBwYXJhbQlwX2oyawkJCQl0aGUgY29tcG9uZW50IGltYWdlIGhlYWRlciB0byBkdW1wLgotICoKLSAqQHJldHVybgl0aGUgY29kZXN0cmVhbSBpbmRleCBleHRyYWN0IGZyb20gdGhlIGpwZzIwMDAgY29kZWMKLSAqLwotb3BqX2NvZGVzdHJlYW1faW5kZXhfdCogajJrX2dldF9jc3RyX2luZGV4KG9wal9qMmtfdCogcF9qMmspOwotCi0vKioKLSAqIERlY29kZSBhbiBpbWFnZSBmcm9tIGEgSlBFRy0yMDAwIGNvZGVzdHJlYW0KLSAqIEBwYXJhbSBqMmsgSjJLIGRlY29tcHJlc3NvciBoYW5kbGUKLSAqIEBwYXJhbSBwX3N0cmVhbSAgRklYTUUgRE9DCi0gKiBAcGFyYW0gcF9pbWFnZSAgIEZJWE1FIERPQwotICogQHBhcmFtIHBfbWFuYWdlciBGSVhNRSBET0MKLSAqIEByZXR1cm4gRklYTUUgRE9DCi0qLwotT1BKX0JPT0wgb3BqX2oya19kZWNvZGUob3BqX2oya190ICpqMmssCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqcF9pbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyKTsKLQotCi1PUEpfQk9PTCBvcGpfajJrX2dldF90aWxlKAlvcGpfajJrX3QgKnBfajJrLAotCQkJICAgIAkJCW9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLQkJCQkgICAgCQlvcGpfaW1hZ2VfdCogcF9pbWFnZSwKLQkJCQkJICAgIAlvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIsCi0JCQkJCQkgICAgT1BKX1VJTlQzMiB0aWxlX2luZGV4ICk7Ci0KLU9QSl9CT09MIG9wal9qMmtfc2V0X2RlY29kZWRfcmVzb2x1dGlvbl9mYWN0b3Iob3BqX2oya190ICpwX2oyaywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcmVzX2ZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKLQotCi0vKioKLSAqIFdyaXRlcyBhIHRpbGUuCi0gKiBAcGFyYW0JcF9qMmsJCXRoZSBqcGVnMjAwMCBjb2RlYy4KLSAqIEBwYXJhbSBwX3RpbGVfaW5kZXggRklYTUUgRE9DCi0gKiBAcGFyYW0gcF9kYXRhIEZJWE1FIERPQwotICogQHBhcmFtIHBfZGF0YV9zaXplIEZJWE1FIERPQwotICogQHBhcmFtCXBfc3RyZWFtCQkJdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgotICogQHBhcmFtCXBfbWFuYWdlcgl0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotICovCi1PUEpfQk9PTCBvcGpfajJrX3dyaXRlX3RpbGUgKAlvcGpfajJrX3QgKiBwX2oyaywKLQkJCQkJCQkgICAgT1BKX1VJTlQzMiBwX3RpbGVfaW5kZXgsCi0JCQkJCQkJICAgIE9QSl9CWVRFICogcF9kYXRhLAotCQkJCQkJCSAgICBPUEpfVUlOVDMyIHBfZGF0YV9zaXplLAotCQkJCQkJCSAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0JCQkJCQkJICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotCi0vKioKLSAqIEVuY29kZXMgYW4gaW1hZ2UgaW50byBhIEpQRUctMjAwMCBjb2Rlc3RyZWFtCi0gKi8KLU9QSl9CT09MIG9wal9qMmtfZW5jb2RlKAlvcGpfajJrX3QgKiBwX2oyaywKLQkJCSAgICAJCQlvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAotCQkJCSAgICAJCW9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotCi0vKioKLSAqIFN0YXJ0cyBhIGNvbXByZXNzaW9uIHNjaGVtZSwgaS5lLiB2YWxpZGF0ZXMgdGhlIGNvZGVjIHBhcmFtZXRlcnMsIHdyaXRlcyB0aGUgaGVhZGVyLgotICoKLSAqIEBwYXJhbQlwX2oyawkJdGhlIGpwZWcyMDAwIGNvZGVjLgotICogQHBhcmFtCXBfc3RyZWFtCQkJdGhlIHN0cmVhbSBvYmplY3QuCi0gKiBAcGFyYW0JcF9pbWFnZSBGSVhNRSBET0MKLSAqIEBwYXJhbQlwX21hbmFnZXIJdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSAqCi0gKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvZGVjIGlzIHZhbGlkLgotICovCi1PUEpfQk9PTCBvcGpfajJrX3N0YXJ0X2NvbXByZXNzKG9wal9qMmtfdCAqcF9qMmssCi0JCQkJCQkJICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLQkJCQkJCQkgICAgb3BqX2ltYWdlX3QgKiBwX2ltYWdlLAotCQkJCQkJCSAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwotCi0vKioKLSAqIEVuZHMgdGhlIGNvbXByZXNzaW9uIHByb2NlZHVyZXMgYW5kIHBvc3NpYmlsaXkgYWRkIGRhdGEgdG8gYmUgcmVhZCBhZnRlciB0aGUKLSAqIGNvZGVzdHJlYW0uCi0gKi8KLU9QSl9CT09MIG9wal9qMmtfZW5kX2NvbXByZXNzKCAJb3BqX2oya190ICpwX2oyaywKLQkJCQkJCQkgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKLQkJCQkJCQkgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKLQotT1BKX0JPT0wgb3BqX2oya19zZXR1cF9tY3RfZW5jb2RpbmcgKG9wal90Y3BfdCAqIHBfdGNwLCBvcGpfaW1hZ2VfdCAqIHBfaW1hZ2UpOwotCi0KLSNlbmRpZiAvKiBfX0oyS19IICovCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvanAyLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvanAyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZmJlMTkuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL2pwMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzAwMCArMCwwIEBACi0vKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCi0gKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCi0gKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFVuaXZlcnNpdGUgY2F0aG9saXF1ZSBkZSBMb3V2YWluIChVQ0wpLCBCZWxnaXVtCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQotICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgS2FvcmkgSGFnaWhhcmEKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMS0yMDEyLCBDZW50cmUgTmF0aW9uYWwgZCdFdHVkZXMgU3BhdGlhbGVzIChDTkVTKSwgRlIgCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENTIFN5c3RlbWVzIGQnSW5mb3JtYXRpb24sIEZyYW5jZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCi0gKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotI2luY2x1ZGUgIm9wal9pbmNsdWRlcy5oIgotCi0vKiogQGRlZmdyb3VwIEpQMiBKUDIgLSBKUEVHLTIwMDAgZmlsZSBmb3JtYXQgcmVhZGVyL3dyaXRlciAqLwotLypAeyovCi0KLSNkZWZpbmUgT1BKX0JPWF9TSVpFCTEwMjQKLQotLyoqIEBuYW1lIExvY2FsIHN0YXRpYyBmdW5jdGlvbnMgKi8KLS8qQHsqLwotCi0vKnN0YXRpYyB2b2lkIGpwMl93cml0ZV91cmwob3BqX2Npb190ICpjaW8sIGNoYXIgKklkeF9maWxlKTsqLwotCi0vKioKLSAqIFJlYWRzIGEgSUhEUiBib3ggLSBJbWFnZSBIZWFkZXIgYm94Ci0gKgotICogQHBhcmFtCXBfaW1hZ2VfaGVhZGVyX2RhdGEJCQlwb2ludGVyIHRvIGFjdHVhbCBkYXRhIChhbHJlYWR5IHJlYWQgZnJvbSBmaWxlKQotICogQHBhcmFtCWpwMgkJCQkJCQl0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KLSAqIEBwYXJhbQlwX2ltYWdlX2hlYWRlcl9zaXplCQkJdGhlIHNpemUgb2YgdGhlIGltYWdlIGhlYWRlcgotICogQHBhcmFtCXBfbWFuYWdlcgkJCQkJdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSAqCi0gKiBAcmV0dXJuCXRydWUgaWYgdGhlIGltYWdlIGhlYWRlciBpcyB2YWxpZCwgZmFsc2UgZWxzZS4KLSAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qcDJfcmVhZF9paGRyKCAgb3BqX2pwMl90ICpqcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqcF9pbWFnZV9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9pbWFnZV9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotCi0vKioKLSAqIFdyaXRlcyB0aGUgSW1hZ2UgSGVhZGVyIGJveCAtIEltYWdlIEhlYWRlciBib3guCi0gKgotICogQHBhcmFtIGpwMgkJCQkJanBlZzIwMDAgZmlsZSBjb2RlYy4KLSAqIEBwYXJhbSBwX25iX2J5dGVzX3dyaXR0ZW4JcG9pbnRlciB0byBzdG9yZSB0aGUgbmIgb2YgYnl0ZXMgd3JpdHRlbiBieSB0aGUgZnVuY3Rpb24uCi0gKgotICogQHJldHVybgl0aGUgZGF0YSBiZWluZyBjb3BpZWQuCi0qLwotc3RhdGljIE9QSl9CWVRFICogb3BqX2pwMl93cml0ZV9paGRyKG9wal9qcDJfdCAqanAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX25iX2J5dGVzX3dyaXR0ZW4gKTsKLQotLyoqCi0gKiBXcml0ZXMgdGhlIEJpdCBwZXIgQ29tcG9uZW50IGJveC4KLSAqCi0gKiBAcGFyYW0JanAyCQkJCQkJanBlZzIwMDAgZmlsZSBjb2RlYy4KLSAqIEBwYXJhbQlwX25iX2J5dGVzX3dyaXR0ZW4JCXBvaW50ZXIgdG8gc3RvcmUgdGhlIG5iIG9mIGJ5dGVzIHdyaXR0ZW4gYnkgdGhlIGZ1bmN0aW9uLgotICoKLSAqIEByZXR1cm4JdGhlIGRhdGEgYmVpbmcgY29waWVkLgotKi8KLXN0YXRpYyBPUEpfQllURSAqIG9wal9qcDJfd3JpdGVfYnBjYygJb3BqX2pwMl90ICpqcDIsCi0JCQkJCQkJCSAgICAgICAgT1BKX1VJTlQzMiAqIHBfbmJfYnl0ZXNfd3JpdHRlbiApOwotCi0vKioKLSAqIFJlYWRzIGEgQml0IHBlciBDb21wb25lbnQgYm94LgotICoKLSAqIEBwYXJhbQlwX2JwY19oZWFkZXJfZGF0YQkJCXBvaW50ZXIgdG8gYWN0dWFsIGRhdGEgKGFscmVhZHkgcmVhZCBmcm9tIGZpbGUpCi0gKiBAcGFyYW0JanAyCQkJCQkJCXRoZSBqcGVnMjAwMCBmaWxlIGNvZGVjLgotICogQHBhcmFtCXBfYnBjX2hlYWRlcl9zaXplCQkJdGhlIHNpemUgb2YgdGhlIGJwYyBoZWFkZXIKLSAqIEBwYXJhbQlwX21hbmFnZXIJCQkJCXRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0gKgotICogQHJldHVybgl0cnVlIGlmIHRoZSBicGMgaGVhZGVyIGlzIHZhbGlkLCBmYWxlIGVsc2UuCi0gKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfYnBjYyggIG9wal9qcDJfdCAqanAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2JwY19oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9icGNfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotc3RhdGljIE9QSl9CT09MIG9wal9qcDJfcmVhZF9jZGVmKAlvcGpfanAyX3QgKiBqcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfY2RlZl9oZWFkZXJfZGF0YSwKLQkJCQkJCQkJCU9QSl9VSU5UMzIgcF9jZGVmX2hlYWRlcl9zaXplLAotCQkJCQkJCQkJb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLXN0YXRpYyB2b2lkIG9wal9qcDJfYXBwbHlfY2RlZihvcGpfaW1hZ2VfdCAqaW1hZ2UsIG9wal9qcDJfY29sb3JfdCAqY29sb3IpOwotCi0vKioKLSAqIFdyaXRlcyB0aGUgQ2hhbm5lbCBEZWZpbml0aW9uIGJveC4KLSAqCi0gKiBAcGFyYW0ganAyCQkJCQlqcGVnMjAwMCBmaWxlIGNvZGVjLgotICogQHBhcmFtIHBfbmJfYnl0ZXNfd3JpdHRlbglwb2ludGVyIHRvIHN0b3JlIHRoZSBuYiBvZiBieXRlcyB3cml0dGVuIGJ5IHRoZSBmdW5jdGlvbi4KLSAqCi0gKiBAcmV0dXJuCXRoZSBkYXRhIGJlaW5nIGNvcGllZC4KLSAqLwotc3RhdGljIE9QSl9CWVRFICogb3BqX2pwMl93cml0ZV9jZGVmKCAgIG9wal9qcDJfdCAqanAyLAotCQkJCQkJCQkJCQkJCQkJCQkJIE9QSl9VSU5UMzIgKiBwX25iX2J5dGVzX3dyaXR0ZW4gKTsKLQotLyoqCi0gKiBXcml0ZXMgdGhlIENvbG91ciBTcGVjaWZpY2F0aW9uIGJveC4KLSAqCi0gKiBAcGFyYW0ganAyCQkJCQlqcGVnMjAwMCBmaWxlIGNvZGVjLgotICogQHBhcmFtIHBfbmJfYnl0ZXNfd3JpdHRlbglwb2ludGVyIHRvIHN0b3JlIHRoZSBuYiBvZiBieXRlcyB3cml0dGVuIGJ5IHRoZSBmdW5jdGlvbi4KLSAqCi0gKiBAcmV0dXJuCXRoZSBkYXRhIGJlaW5nIGNvcGllZC4KLSovCi1zdGF0aWMgT1BKX0JZVEUgKiBvcGpfanAyX3dyaXRlX2NvbHIoICAgb3BqX2pwMl90ICpqcDIsCi0JCQkJCQkJCQkgICAgT1BKX1VJTlQzMiAqIHBfbmJfYnl0ZXNfd3JpdHRlbiApOwotCi0vKioKLSAqIFdyaXRlcyBhIEZUWVAgYm94IC0gRmlsZSB0eXBlIGJveAotICoKLSAqIEBwYXJhbQljaW8JCQl0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCi0gKiBAcGFyYW0JanAyCQkJdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCi0gKiBAcGFyYW0JcF9tYW5hZ2VyCXRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0gKgotICogQHJldHVybgl0cnVlIGlmIHdyaXRpbmcgd2FzIHN1Y2Nlc3NmdWwuCi0gKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3dyaXRlX2Z0eXAoCW9wal9qcDJfdCAqanAyLAotCQkJCQkJCQkJb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKLQkJCQkJCQkJCW9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotCi0vKioKLSAqIFJlYWRzIGEgYSBGVFlQIGJveCAtIEZpbGUgdHlwZSBib3gKLSAqCi0gKiBAcGFyYW0JcF9oZWFkZXJfZGF0YQl0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIEZUWVAgYm94LgotICogQHBhcmFtCWpwMgkJCQl0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KLSAqIEBwYXJhbQlwX2hlYWRlcl9zaXplCXRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgRlRZUCBib3guCi0gKiBAcGFyYW0JcF9tYW5hZ2VyCQl0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotICoKLSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgRlRZUCBib3ggaXMgdmFsaWQuCi0gKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfZnR5cCgJb3BqX2pwMl90ICpqcDIsCi0JCQkJCQkJCQlPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCi0JCQkJCQkJCQlPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCi0JCQkJCQkJCQlvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotT1BKX0JPT0wgb3BqX2pwMl9za2lwX2pwMmMoCW9wal9qcDJfdCAqanAyLAotCQkJCQkJICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCi0JCQkJCQkgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLS8qKgotICogUmVhZHMgdGhlIEpwZWcyMDAwIGZpbGUgSGVhZGVyIGJveCAtIEpQMiBIZWFkZXIgYm94ICh3YXJuaW5nLCB0aGlzIGlzIGEgc3VwZXIgYm94KS4KLSAqCi0gKiBAcGFyYW0JcF9oZWFkZXJfZGF0YQl0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIGZpbGUgaGVhZGVyIGJveC4KLSAqIEBwYXJhbQlqcDIJCQkJdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCi0gKiBAcGFyYW0JcF9oZWFkZXJfc2l6ZQl0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIGZpbGUgaGVhZGVyIGJveC4KLSAqIEBwYXJhbQlwX21hbmFnZXIJCXRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0gKgotICogQHJldHVybiB0cnVlIGlmIHRoZSBKUDIgSGVhZGVyIGJveCB3YXMgc3VjY2Vzc2Z1bGx5IHJlY29uaXplZC4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2pwMmgoICBvcGpfanAyX3QgKmpwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLS8qKgotICogV3JpdGVzIHRoZSBKcGVnMjAwMCBjb2Rlc3RyZWFtIEhlYWRlciBib3ggLSBKUDJDIEhlYWRlciBib3guIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgQUZURVIgdGhlIGNvZGluZyBoYXMgYmVlbiBkb25lLgotICoKLSAqIEBwYXJhbQljaW8JCQl0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCi0gKiBAcGFyYW0JanAyCQkJdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCi0gKiBAcGFyYW0JcF9tYW5hZ2VyCXVzZXIgZXZlbnQgbWFuYWdlci4KLSAqCi0gKiBAcmV0dXJuIHRydWUgaWYgd3JpdGluZyB3YXMgc3VjY2Vzc2Z1bC4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl93cml0ZV9qcDJjKAlvcGpfanAyX3QgKmpwMiwKLQkJCQkJCQkJICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCi0JCQkJCQkJCSAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotI2lmZGVmIFVTRV9KUElQCi0vKioKLSAqIFdyaXRlIGluZGV4IEZpbmRlciBib3gKLSAqIEBwYXJhbSBjaW8gICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgdG8uCi0gKiBAcGFyYW0JanAyCQkJdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCi0gKiBAcGFyYW0JcF9tYW5hZ2VyCXVzZXIgZXZlbnQgbWFuYWdlci4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwaXBfd3JpdGVfaXB0cigJb3BqX2pwMl90ICpqcDIsCi0JCQkJCQkJCSAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAotCQkJCQkJCQkgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLS8qKgotICogV3JpdGUgaW5kZXggRmluZGVyIGJveAotICogQHBhcmFtIGNpbyAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSB0by4KLSAqIEBwYXJhbQlqcDIJCQl0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KLSAqIEBwYXJhbQlwX21hbmFnZXIJdXNlciBldmVudCBtYW5hZ2VyLgotICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwaXBfd3JpdGVfY2lkeChvcGpfanAyX3QgKmpwMiwKLSAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKLSAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLS8qKgotICogV3JpdGUgZmlsZSBJbmRleCAoc3VwZXJib3gpCi0gKiBAcGFyYW0gY2lvICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIHRvLgotICogQHBhcmFtCWpwMgkJCXRoZSBqcGVnMjAwMCBmaWxlIGNvZGVjLgotICogQHBhcmFtCXBfbWFuYWdlcgl1c2VyIGV2ZW50IG1hbmFnZXIuCi0gKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfanBpcF93cml0ZV9maWR4KG9wal9qcDJfdCAqanAyLAotICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAotICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLSNlbmRpZiAvKiBVU0VfSlBJUCAqLwotCi0vKioKLSAqIFJlYWRzIGEganBlZzIwMDAgZmlsZSBzaWduYXR1cmUgYm94LgotICoKLSAqIEBwYXJhbQlwX2hlYWRlcl9kYXRhCXRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgc2lnbmF0dXJlIGJveC4KLSAqIEBwYXJhbQlqcDIJCQkJdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCi0gKiBAcGFyYW0JcF9oZWFkZXJfc2l6ZQl0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIHNpZ25hdHVyZSBib3guCi0gKiBAcGFyYW0JcF9tYW5hZ2VyCQl0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotICoKLSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSBzaWduYXR1cmUgYm94IGlzIHZhbGlkLgotICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2pwKG9wal9qcDJfdCAqanAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKLQotLyoqCi0gKiBXcml0ZXMgYSBqcGVnMjAwMCBmaWxlIHNpZ25hdHVyZSBib3guCi0gKgotICogQHBhcmFtIGNpbyB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCi0gKiBAcGFyYW0JanAyCQkJdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCi0gKiBAcGFyYW0gcF9tYW5hZ2VyIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0gKgotICogQHJldHVybiB0cnVlIGlmIHdyaXRpbmcgd2FzIHN1Y2Nlc3NmdWwuCi0gKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3dyaXRlX2pwKAlvcGpfanAyX3QgKmpwMiwKLQkJCSAgICAJICAgICAgICAJICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCi0JCQkJICAgICAgICAgICAgCQlvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotLyoqCi1BcHBseSBjb2xsZWN0ZWQgcGFsZXR0ZSBkYXRhCi1AcGFyYW0gY29sb3IgQ29sbGVjdG9yIGZvciBwcm9maWxlLCBjZGVmIGFuZCBwY2xyIGRhdGEKLUBwYXJhbSBpbWFnZQotKi8KLXN0YXRpYyB2b2lkIG9wal9qcDJfYXBwbHlfcGNscihvcGpfaW1hZ2VfdCAqaW1hZ2UsIG9wal9qcDJfY29sb3JfdCAqY29sb3IpOwotCi1zdGF0aWMgdm9pZCBvcGpfanAyX2ZyZWVfcGNscihvcGpfanAyX2NvbG9yX3QgKmNvbG9yKTsKLQotLyoqCi0gKiBDb2xsZWN0IHBhbGV0dGUgZGF0YQotICoKLSAqIEBwYXJhbSBqcDIgSlAyIGhhbmRsZQotICogQHBhcmFtIHBfcGNscl9oZWFkZXJfZGF0YSAgICBGSVhNRSBET0MKLSAqIEBwYXJhbSBwX3BjbHJfaGVhZGVyX3NpemUgICAgRklYTUUgRE9DCi0gKiBAcGFyYW0gcF9tYW5hZ2VyCi0gKgotICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBmYWxzZSBvdGhlcndpc2UKLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX3BjbHIoCW9wal9qcDJfdCAqanAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX3BjbHJfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfcGNscl9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotCi0vKioKLSAqIENvbGxlY3QgY29tcG9uZW50IG1hcHBpbmcgZGF0YQotICoKLSAqIEBwYXJhbSBqcDIgICAgICAgICAgICAgICAgIEpQMiBoYW5kbGUKLSAqIEBwYXJhbSBwX2NtYXBfaGVhZGVyX2RhdGEgIEZJWE1FIERPQwotICogQHBhcmFtIHBfY21hcF9oZWFkZXJfc2l6ZSAgRklYTUUgRE9DCi0gKiBAcGFyYW0gcF9tYW5hZ2VyICAgICAgICAgICBGSVhNRSBET0MKLSAqCi0gKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIGZhbHNlIG90aGVyd2lzZQotKi8KLQotc3RhdGljIE9QSl9CT09MIG9wal9qcDJfcmVhZF9jbWFwKAlvcGpfanAyX3QgKiBqcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfY21hcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jbWFwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLS8qKgotICogUmVhZHMgdGhlIENvbG9yIFNwZWNpZmljYXRpb24gYm94LgotICoKLSAqIEBwYXJhbQlwX2NvbHJfaGVhZGVyX2RhdGEJCQlwb2ludGVyIHRvIGFjdHVhbCBkYXRhIChhbHJlYWR5IHJlYWQgZnJvbSBmaWxlKQotICogQHBhcmFtCWpwMgkJCQkJCQl0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KLSAqIEBwYXJhbQlwX2NvbHJfaGVhZGVyX3NpemUJCQl0aGUgc2l6ZSBvZiB0aGUgY29sb3IgaGVhZGVyCi0gKiBAcGFyYW0JcF9tYW5hZ2VyCQkJCQl0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotICoKLSAqIEByZXR1cm4JdHJ1ZSBpZiB0aGUgYnBjIGhlYWRlciBpcyB2YWxpZCwgZmFsZSBlbHNlLgotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfY29sciggIG9wal9qcDJfdCAqanAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2NvbHJfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29scl9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotCi0vKkB9Ki8KLQotLypAfSovCi0KLS8qKgotICogU2V0cyB1cCB0aGUgcHJvY2VkdXJlcyB0byBkbyBvbiB3cml0aW5nIGhlYWRlciBhZnRlciB0aGUgY29kZXN0cmVhbS4KLSAqIERldmVsb3BwZXJzIHdhbnRpbmcgdG8gZXh0ZW5kIHRoZSBsaWJyYXJ5IGNhbiBhZGQgdGhlaXIgb3duIHdyaXRpbmcgcHJvY2VkdXJlcy4KLSAqLwotc3RhdGljIHZvaWQgb3BqX2pwMl9zZXR1cF9lbmRfaGVhZGVyX3dyaXRpbmcgKG9wal9qcDJfdCAqanAyKTsKLQotLyoqCi0gKiBTZXRzIHVwIHRoZSBwcm9jZWR1cmVzIHRvIGRvIG9uIHJlYWRpbmcgaGVhZGVyIGFmdGVyIHRoZSBjb2Rlc3RyZWFtLgotICogRGV2ZWxvcHBlcnMgd2FudGluZyB0byBleHRlbmQgdGhlIGxpYnJhcnkgY2FuIGFkZCB0aGVpciBvd24gd3JpdGluZyBwcm9jZWR1cmVzLgotICovCi1zdGF0aWMgdm9pZCBvcGpfanAyX3NldHVwX2VuZF9oZWFkZXJfcmVhZGluZyAob3BqX2pwMl90ICpqcDIpOwotCi0vKioKLSAqIFJlYWRzIGEganBlZzIwMDAgZmlsZSBoZWFkZXIgc3RydWN0dXJlLgotICoKLSAqIEBwYXJhbSBqcDIgdGhlIGpwZWcyMDAwIGZpbGUgaGVhZGVyIHN0cnVjdHVyZS4KLSAqIEBwYXJhbSBzdHJlYW0gdGhlIHN0cmVhbSB0byByZWFkIGRhdGEgZnJvbS4KLSAqIEBwYXJhbSBwX21hbmFnZXIgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSAqCi0gKiBAcmV0dXJuIHRydWUgaWYgdGhlIGJveCBpcyB2YWxpZC4KLSAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qcDJfcmVhZF9oZWFkZXJfcHJvY2VkdXJlKCAgb3BqX2pwMl90ICpqcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLS8qKgotICogRXhjdXRlcyB0aGUgZ2l2ZW4gcHJvY2VkdXJlcyBvbiB0aGUgZ2l2ZW4gY29kZWMuCi0gKgotICogQHBhcmFtCXBfcHJvY2VkdXJlX2xpc3QJdGhlIGxpc3Qgb2YgcHJvY2VkdXJlcyB0byBleGVjdXRlCi0gKiBAcGFyYW0JanAyCQkJCQl0aGUganBlZzIwMDAgZmlsZSBjb2RlYyB0byBleGVjdXRlIHRoZSBwcm9jZWR1cmVzIG9uLgotICogQHBhcmFtCXN0cmVhbQkJCQkJdGhlIHN0cmVhbSB0byBleGVjdXRlIHRoZSBwcm9jZWR1cmVzIG9uLgotICogQHBhcmFtCXBfbWFuYWdlcgkJCXRoZSB1c2VyIG1hbmFnZXIuCi0gKgotICogQHJldHVybgl0cnVlCQkJCWlmIGFsbCB0aGUgcHJvY2VkdXJlcyB3ZXJlIHN1Y2Nlc3NmdWxseSBleGVjdXRlZC4KLSAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qcDJfZXhlYyAoICBvcGpfanAyX3QgKiBqcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9wcm9jZWR1cmVfbGlzdF90ICogcF9wcm9jZWR1cmVfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLS8qKgotICogUmVhZHMgYSBib3ggaGVhZGVyLiBUaGUgYm94IGlzIHRoZSB3YXkgZGF0YSBpcyBwYWNrZWQgaW5zaWRlIGEganBlZzIwMDAgZmlsZSBzdHJ1Y3R1cmUuCi0gKgotICogQHBhcmFtCWNpbwkJCQkJCXRoZSBpbnB1dCBzdHJlYW0gdG8gcmVhZCBkYXRhIGZyb20uCi0gKiBAcGFyYW0JYm94CQkJCQkJdGhlIGJveCBzdHJ1Y3R1cmUgdG8gZmlsbC4KLSAqIEBwYXJhbQlwX251bWJlcl9ieXRlc19yZWFkCQlwb2ludGVyIHRvIGFuIGludCB0aGF0IHdpbGwgc3RvcmUgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gdGhlIHN0cmVhbSAoc2hvdWwgdXN1YWxseSBiZSAyKS4KLSAqIEBwYXJhbQlwX21hbmFnZXIJCQkJdXNlciBldmVudCBtYW5hZ2VyLgotICoKLSAqIEByZXR1cm4JdHJ1ZSBpZiB0aGUgYm94IGlzIHJlY29uaXplZCwgZmFsc2Ugb3RoZXJ3aXNlCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9qcDJfcmVhZF9ib3hoZHIob3BqX2pwMl9ib3hfdCAqYm94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfbnVtYmVyX2J5dGVzX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKLQotLyoqCi0gKiBTZXRzIHVwIHRoZSB2YWxpZGF0aW9uICxpLmUuIGFkZHMgdGhlIHByb2NlZHVyZXMgdG8gbGF1Y2ggdG8gbWFrZSBzdXJlIHRoZSBjb2RlYyBwYXJhbWV0ZXJzCi0gKiBhcmUgdmFsaWQuIERldmVsb3BwZXJzIHdhbnRpbmcgdG8gZXh0ZW5kIHRoZSBsaWJyYXJ5IGNhbiBhZGQgdGhlaXIgb3duIHZhbGlkYXRpb24gcHJvY2VkdXJlcy4KLSAqLwotc3RhdGljIHZvaWQgb3BqX2pwMl9zZXR1cF9lbmNvZGluZ192YWxpZGF0aW9uIChvcGpfanAyX3QgKmpwMik7Ci0KLS8qKgotICogU2V0cyB1cCB0aGUgcHJvY2VkdXJlcyB0byBkbyBvbiB3cml0aW5nIGhlYWRlci4gRGV2ZWxvcHBlcnMgd2FudGluZyB0byBleHRlbmQgdGhlIGxpYnJhcnkgY2FuIGFkZCB0aGVpciBvd24gd3JpdGluZyBwcm9jZWR1cmVzLgotICovCi1zdGF0aWMgdm9pZCBvcGpfanAyX3NldHVwX2hlYWRlcl93cml0aW5nIChvcGpfanAyX3QgKmpwMik7Ci0KLU9QSl9CT09MIG9wal9qcDJfZGVmYXVsdF92YWxpZGF0aW9uICgJb3BqX2pwMl90ICoganAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLS8qKgotICogRmluZHMgdGhlIGltYWdlIGV4ZWN1dGlvbiBmdW5jdGlvbiByZWxhdGVkIHRvIHRoZSBnaXZlbiBib3ggaWQuCi0gKgotICogQHBhcmFtCXBfaWQJdGhlIGlkIG9mIHRoZSBoYW5kbGVyIHRvIGZldGNoLgotICoKLSAqIEByZXR1cm4JdGhlIGdpdmVuIGhhbmRsZXIgb3IgTlVMTCBpZiBpdCBjb3VsZCBub3QgYmUgZm91bmQuCi0gKi8KLXN0YXRpYyBjb25zdCBvcGpfanAyX2hlYWRlcl9oYW5kbGVyX3QgKiBvcGpfanAyX2ltZ19maW5kX2hhbmRsZXIgKE9QSl9VSU5UMzIgcF9pZCk7Ci0KLS8qKgotICogRmluZHMgdGhlIGV4ZWN1dGlvbiBmdW5jdGlvbiByZWxhdGVkIHRvIHRoZSBnaXZlbiBib3ggaWQuCi0gKgotICogQHBhcmFtCXBfaWQJdGhlIGlkIG9mIHRoZSBoYW5kbGVyIHRvIGZldGNoLgotICoKLSAqIEByZXR1cm4JdGhlIGdpdmVuIGhhbmRsZXIgb3IgTlVMTCBpZiBpdCBjb3VsZCBub3QgYmUgZm91bmQuCi0gKi8KLXN0YXRpYyBjb25zdCBvcGpfanAyX2hlYWRlcl9oYW5kbGVyX3QgKiBvcGpfanAyX2ZpbmRfaGFuZGxlciAoT1BKX1VJTlQzMiBwX2lkICk7Ci0KLWNvbnN0IG9wal9qcDJfaGVhZGVyX2hhbmRsZXJfdCBqcDJfaGVhZGVyIFtdID0KLXsKLQl7SlAyX0pQLG9wal9qcDJfcmVhZF9qcH0sCi0Je0pQMl9GVFlQLG9wal9qcDJfcmVhZF9mdHlwfSwKLQl7SlAyX0pQMkgsb3BqX2pwMl9yZWFkX2pwMmh9Ci19OwotCi1jb25zdCBvcGpfanAyX2hlYWRlcl9oYW5kbGVyX3QganAyX2ltZ19oZWFkZXIgW10gPQotewotCXtKUDJfSUhEUixvcGpfanAyX3JlYWRfaWhkcn0sCi0Je0pQMl9DT0xSLG9wal9qcDJfcmVhZF9jb2xyfSwKLQl7SlAyX0JQQ0Msb3BqX2pwMl9yZWFkX2JwY2N9LAotCXtKUDJfUENMUixvcGpfanAyX3JlYWRfcGNscn0sCi0Je0pQMl9DTUFQLG9wal9qcDJfcmVhZF9jbWFwfSwKLQl7SlAyX0NERUYsb3BqX2pwMl9yZWFkX2NkZWZ9Ci0KLX07Ci0KLS8qKgotICogUmVhZHMgYSBib3ggaGVhZGVyLiBUaGUgYm94IGlzIHRoZSB3YXkgZGF0YSBpcyBwYWNrZWQgaW5zaWRlIGEganBlZzIwMDAgZmlsZSBzdHJ1Y3R1cmUuIERhdGEgaXMgcmVhZCBmcm9tIGEgY2hhcmFjdGVyIHN0cmluZwotICoKLSAqIEBwYXJhbQlib3gJCQkJCQl0aGUgYm94IHN0cnVjdHVyZSB0byBmaWxsLgotICogQHBhcmFtCXBfZGF0YQkJCQkJdGhlIGNoYXJhY3RlciBzdHJpbmcgdG8gcmVhZCBkYXRhIGZyb20uCi0gKiBAcGFyYW0JcF9udW1iZXJfYnl0ZXNfcmVhZAkJcG9pbnRlciB0byBhbiBpbnQgdGhhdCB3aWxsIHN0b3JlIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBmcm9tIHRoZSBzdHJlYW0gKHNob3VsIHVzdWFsbHkgYmUgMikuCi0gKiBAcGFyYW0JcF9ib3hfbWF4X3NpemUJCQl0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJveC4KLSAqIEBwYXJhbQlwX21hbmFnZXIgICAgICAgICBGSVhNRSBET0MKLSAqCi0gKiBAcmV0dXJuCXRydWUgaWYgdGhlIGJveCBpcyByZWNvbml6ZWQsIGZhbHNlIG90aGVyd2lzZQotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfYm94aGRyX2NoYXIoICAgb3BqX2pwMl9ib3hfdCAqYm94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfbnVtYmVyX2J5dGVzX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9ib3hfbWF4X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotCi0vKioKLSAqIFNldHMgdXAgdGhlIHZhbGlkYXRpb24gLGkuZS4gYWRkcyB0aGUgcHJvY2VkdXJlcyB0byBsYXVjaCB0byBtYWtlIHN1cmUgdGhlIGNvZGVjIHBhcmFtZXRlcnMKLSAqIGFyZSB2YWxpZC4gRGV2ZWxvcHBlcnMgd2FudGluZyB0byBleHRlbmQgdGhlIGxpYnJhcnkgY2FuIGFkZCB0aGVpciBvd24gdmFsaWRhdGlvbiBwcm9jZWR1cmVzLgotICovCi1zdGF0aWMgdm9pZCBvcGpfanAyX3NldHVwX2RlY29kaW5nX3ZhbGlkYXRpb24gKG9wal9qcDJfdCAqanAyKTsKLQotLyoqCi0gKiBTZXRzIHVwIHRoZSBwcm9jZWR1cmVzIHRvIGRvIG9uIHJlYWRpbmcgaGVhZGVyLgotICogRGV2ZWxvcHBlcnMgd2FudGluZyB0byBleHRlbmQgdGhlIGxpYnJhcnkgY2FuIGFkZCB0aGVpciBvd24gd3JpdGluZyBwcm9jZWR1cmVzLgotICovCi1zdGF0aWMgdm9pZCBvcGpfanAyX3NldHVwX2hlYWRlcl9yZWFkaW5nIChvcGpfanAyX3QgKmpwMik7Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2JveGhkcihvcGpfanAyX2JveF90ICpib3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9udW1iZXJfYnl0ZXNfcmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQotewotCS8qIHJlYWQgaGVhZGVyIGZyb20gZmlsZSAqLwotCU9QSl9CWVRFIGxfZGF0YV9oZWFkZXIgWzhdOwotCi0JLyogcHJlY29uZGl0aW9ucyAqLwotCWFzc2VydChjaW8gIT0gMDApOwotCWFzc2VydChib3ggIT0gMDApOwotCWFzc2VydChwX251bWJlcl9ieXRlc19yZWFkICE9IDAwKTsKLQlhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLQotCSpwX251bWJlcl9ieXRlc19yZWFkID0gKE9QSl9VSU5UMzIpb3BqX3N0cmVhbV9yZWFkX2RhdGEoY2lvLGxfZGF0YV9oZWFkZXIsOCxwX21hbmFnZXIpOwotCWlmICgqcF9udW1iZXJfYnl0ZXNfcmVhZCAhPSA4KSB7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCi0JLyogcHJvY2VzcyByZWFkIGRhdGEgKi8KLQlvcGpfcmVhZF9ieXRlcyhsX2RhdGFfaGVhZGVyLCYoYm94LT5sZW5ndGgpLCA0KTsKLQlvcGpfcmVhZF9ieXRlcyhsX2RhdGFfaGVhZGVyKzQsJihib3gtPnR5cGUpLCA0KTsKLSAgICAKLSAgaWYoYm94LT5sZW5ndGggPT0gMCkvKiBsYXN0IGJveCAqLwotICAgIHsKLSAgICBjb25zdCBPUEpfT0ZGX1QgYmxlZnQgPSBvcGpfc3RyZWFtX2dldF9udW1iZXJfYnl0ZV9sZWZ0KGNpbyk7Ci0gICAgYm94LT5sZW5ndGggPSAoT1BKX1VJTlQzMilibGVmdDsKLSAgICBhc3NlcnQoIChPUEpfT0ZGX1QpYm94LT5sZW5ndGggPT0gYmxlZnQgKTsKLSAgICByZXR1cm4gT1BKX1RSVUU7Ci0gICAgfQotCi0JLyogZG8gd2UgaGF2ZSBhICJzcGVjaWFsIHZlcnkgbGFyZ2UgYm94ID8iICovCi0JLyogcmVhZCB0aGVuIHRoZSBYTEJveCAqLwotCWlmIChib3gtPmxlbmd0aCA9PSAxKSB7Ci0JCU9QSl9VSU5UMzIgbF94bF9wYXJ0X3NpemU7Ci0KLQkJT1BKX1VJTlQzMiBsX25iX2J5dGVzX3JlYWQgPSAoT1BKX1VJTlQzMilvcGpfc3RyZWFtX3JlYWRfZGF0YShjaW8sbF9kYXRhX2hlYWRlciw4LHBfbWFuYWdlcik7Ci0JCWlmIChsX25iX2J5dGVzX3JlYWQgIT0gOCkgewotCQkJaWYgKGxfbmJfYnl0ZXNfcmVhZCA+IDApIHsKLQkJCQkqcF9udW1iZXJfYnl0ZXNfcmVhZCArPSBsX25iX2J5dGVzX3JlYWQ7Ci0JCQl9Ci0KLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KLQotICAgICAgICAqcF9udW1iZXJfYnl0ZXNfcmVhZCA9IDE2OwotCQlvcGpfcmVhZF9ieXRlcyhsX2RhdGFfaGVhZGVyLCZsX3hsX3BhcnRfc2l6ZSwgNCk7Ci0JCWlmIChsX3hsX3BhcnRfc2l6ZSAhPSAwKSB7Ci0JCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ2Fubm90IGhhbmRsZSBib3ggc2l6ZXMgaGlnaGVyIHRoYW4gMl4zMlxuIik7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9Ci0JCW9wal9yZWFkX2J5dGVzKGxfZGF0YV9oZWFkZXIrNCwmKGJveC0+bGVuZ3RoKSwgNCk7Ci0JfQotICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotI2lmIDAKLXN0YXRpYyB2b2lkIGpwMl93cml0ZV91cmwob3BqX2Npb190ICpjaW8sIGNoYXIgKklkeF9maWxlKSB7Ci0JT1BKX1VJTlQzMiBpOwotCW9wal9qcDJfYm94X3QgYm94OwotCi0JYm94LmluaXRfcG9zID0gY2lvX3RlbGwoY2lvKTsKLQljaW9fc2tpcChjaW8sIDQpOwotCWNpb193cml0ZShjaW8sIEpQMl9VUkwsIDQpOwkvKiBEQlRMICovCi0JY2lvX3dyaXRlKGNpbywgMCwgMSk7CQkvKiBWRVJTICovCi0JY2lvX3dyaXRlKGNpbywgMCwgMyk7CQkvKiBGTEFHICovCi0KLQlpZihJZHhfZmlsZSkgewotCQlmb3IgKGkgPSAwOyBpIDwgc3RybGVuKElkeF9maWxlKTsgaSsrKSB7Ci0JCQljaW9fd3JpdGUoY2lvLCBJZHhfZmlsZVtpXSwgMSk7Ci0JCX0KLQl9Ci0KLQlib3gubGVuZ3RoID0gY2lvX3RlbGwoY2lvKSAtIGJveC5pbml0X3BvczsKLQljaW9fc2VlayhjaW8sIGJveC5pbml0X3Bvcyk7Ci0JY2lvX3dyaXRlKGNpbywgYm94Lmxlbmd0aCwgNCk7CS8qIEwgKi8KLQljaW9fc2VlayhjaW8sIGJveC5pbml0X3BvcyArIGJveC5sZW5ndGgpOwotfQotI2VuZGlmCi0KLU9QSl9CT09MIG9wal9qcDJfcmVhZF9paGRyKCBvcGpfanAyX3QgKmpwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqcF9pbWFnZV9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaW1hZ2VfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKLXsKLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KHBfaW1hZ2VfaGVhZGVyX2RhdGEgIT0gMDApOwotCWFzc2VydChqcDIgIT0gMDApOwotCWFzc2VydChwX21hbmFnZXIgIT0gMDApOwotCi0JaWYgKHBfaW1hZ2VfaGVhZGVyX3NpemUgIT0gMTQpIHsKLQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkJhZCBpbWFnZSBoZWFkZXIgYm94IChiYWQgc2l6ZSlcbiIpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQotCW9wal9yZWFkX2J5dGVzKHBfaW1hZ2VfaGVhZGVyX2RhdGEsJihqcDItPmgpLDQpOwkJCS8qIEhFSUdIVCAqLwotCXBfaW1hZ2VfaGVhZGVyX2RhdGEgKz0gNDsKLQlvcGpfcmVhZF9ieXRlcyhwX2ltYWdlX2hlYWRlcl9kYXRhLCYoanAyLT53KSw0KTsJCQkvKiBXSURUSCAqLwotCXBfaW1hZ2VfaGVhZGVyX2RhdGEgKz0gNDsKLQlvcGpfcmVhZF9ieXRlcyhwX2ltYWdlX2hlYWRlcl9kYXRhLCYoanAyLT5udW1jb21wcyksMik7CQkvKiBOQyAqLwotCXBfaW1hZ2VfaGVhZGVyX2RhdGEgKz0gMjsKLQotCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgY29tcG9uZW50cyAqLwotCWpwMi0+Y29tcHMgPSAob3BqX2pwMl9jb21wc190Kikgb3BqX2NhbGxvYyhqcDItPm51bWNvbXBzLCBzaXplb2Yob3BqX2pwMl9jb21wc190KSk7Ci0JaWYgKGpwMi0+Y29tcHMgPT0gMCkgewotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGltYWdlIGhlYWRlciAoaWhkcilcbiIpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQotCW9wal9yZWFkX2J5dGVzKHBfaW1hZ2VfaGVhZGVyX2RhdGEsJihqcDItPmJwYyksMSk7CQkJLyogQlBDICovCi0JKysgcF9pbWFnZV9oZWFkZXJfZGF0YTsKLQotCW9wal9yZWFkX2J5dGVzKHBfaW1hZ2VfaGVhZGVyX2RhdGEsJihqcDItPkMpLDEpOwkJCS8qIEMgKi8KLQkrKyBwX2ltYWdlX2hlYWRlcl9kYXRhOwotCi0JLyogU2hvdWxkIGJlIGVxdWFsIHRvIDcgY2YuIGNoYXB0ZXIgYWJvdXQgaW1hZ2UgaGVhZGVyIGJveCBvZiB0aGUgbm9ybSAqLwotCWlmIChqcDItPkMgIT0gNyl7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfSU5GTywgIkpQMiBJSERSIGJveDogY29tcHJlc3Npb24gdHlwZSBpbmRpY2F0ZSB0aGF0IHRoZSBmaWxlIGlzIG5vdCBhIGNvbmZvcm1pbmcgSlAyIGZpbGUgKCVkKSBcbiIsIGpwMi0+Qyk7Ci0JfQotCi0Jb3BqX3JlYWRfYnl0ZXMocF9pbWFnZV9oZWFkZXJfZGF0YSwmKGpwMi0+VW5rQyksMSk7CQkJLyogVW5rQyAqLwotCSsrIHBfaW1hZ2VfaGVhZGVyX2RhdGE7Ci0Jb3BqX3JlYWRfYnl0ZXMocF9pbWFnZV9oZWFkZXJfZGF0YSwmKGpwMi0+SVBSKSwxKTsJCQkvKiBJUFIgKi8KLQkrKyBwX2ltYWdlX2hlYWRlcl9kYXRhOwotCi0JcmV0dXJuIE9QSl9UUlVFOwotfQotCi1PUEpfQllURSAqIG9wal9qcDJfd3JpdGVfaWhkcihvcGpfanAyX3QgKmpwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX25iX2J5dGVzX3dyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLQlPUEpfQllURSAqIGxfaWhkcl9kYXRhLCogbF9jdXJyZW50X2loZHJfcHRyOwotCQotCS8qIHByZWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQoanAyICE9IDAwKTsKLQlhc3NlcnQocF9uYl9ieXRlc193cml0dGVuICE9IDAwKTsKLQotCS8qIGRlZmF1bHQgaW1hZ2UgaGVhZGVyIGlzIDIyIGJ5dGVzIHdpZGUgKi8KLQlsX2loZHJfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfY2FsbG9jKDEsMjIpOwotCWlmIChsX2loZHJfZGF0YSA9PSAwMCkgewotCQlyZXR1cm4gMDA7Ci0JfQotCi0JbF9jdXJyZW50X2loZHJfcHRyID0gbF9paGRyX2RhdGE7Ci0JCi0Jb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9paGRyX3B0ciwyMiw0KTsJCQkJLyogd3JpdGUgYm94IHNpemUgKi8KLQlsX2N1cnJlbnRfaWhkcl9wdHIrPTQ7Ci0KLQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2loZHJfcHRyLEpQMl9JSERSLCA0KTsJCS8qIElIRFIgKi8KLQlsX2N1cnJlbnRfaWhkcl9wdHIrPTQ7Ci0JCi0Jb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9paGRyX3B0cixqcDItPmgsIDQpOwkJLyogSEVJR0hUICovCi0JbF9jdXJyZW50X2loZHJfcHRyKz00OwotCQotCW9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfaWhkcl9wdHIsIGpwMi0+dywgNCk7CQkvKiBXSURUSCAqLwotCWxfY3VycmVudF9paGRyX3B0cis9NDsKLQkKLQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2loZHJfcHRyLCBqcDItPm51bWNvbXBzLCAyKTsJCS8qIE5DICovCi0JbF9jdXJyZW50X2loZHJfcHRyKz0yOwotCQotCW9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfaWhkcl9wdHIsIGpwMi0+YnBjLCAxKTsJCS8qIEJQQyAqLwotCSsrbF9jdXJyZW50X2loZHJfcHRyOwotCQotCW9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfaWhkcl9wdHIsIGpwMi0+QywgMSk7CQkvKiBDIDogQWx3YXlzIDcgKi8KLQkrK2xfY3VycmVudF9paGRyX3B0cjsKLQkKLQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2loZHJfcHRyLCBqcDItPlVua0MsIDEpOwkJLyogVW5rQywgY29sb3JzcGFjZSB1bmtub3duICovCi0JKytsX2N1cnJlbnRfaWhkcl9wdHI7Ci0JCi0Jb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9paGRyX3B0ciwganAyLT5JUFIsIDEpOwkJLyogSVBSLCBubyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgKi8KLQkrK2xfY3VycmVudF9paGRyX3B0cjsKLQkKLQkqcF9uYl9ieXRlc193cml0dGVuID0gMjI7Ci0JCi0JcmV0dXJuIGxfaWhkcl9kYXRhOwotfQotCi1PUEpfQllURSAqIG9wal9qcDJfd3JpdGVfYnBjYygJb3BqX2pwMl90ICpqcDIsCi0JCQkJCQkgICAgICAgIE9QSl9VSU5UMzIgKiBwX25iX2J5dGVzX3dyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotCU9QSl9VSU5UMzIgaTsKLQkvKiByb29tIGZvciA4IGJ5dGVzIGZvciBib3ggYW5kIDEgYnl0ZSBmb3IgZWFjaCBjb21wb25lbnQgKi8KLQlPUEpfVUlOVDMyIGxfYnBjY19zaXplID0gOCArIGpwMi0+bnVtY29tcHM7Ci0JT1BKX0JZVEUgKiBsX2JwY2NfZGF0YSwqIGxfY3VycmVudF9icGNjX3B0cjsKLQkKLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KHBfbmJfYnl0ZXNfd3JpdHRlbiAhPSAwMCk7Ci0KLQlsX2JwY2NfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfY2FsbG9jKDEsbF9icGNjX3NpemUpOwotCWlmIChsX2JwY2NfZGF0YSA9PSAwMCkgewotCQlyZXR1cm4gMDA7Ci0JfQotCi0JbF9jdXJyZW50X2JwY2NfcHRyID0gbF9icGNjX2RhdGE7Ci0KLQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2JwY2NfcHRyLGxfYnBjY19zaXplLDQpOwkJCQkvKiB3cml0ZSBib3ggc2l6ZSAqLwotCWxfY3VycmVudF9icGNjX3B0ciArPSA0OwotCQotCW9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfYnBjY19wdHIsSlAyX0JQQ0MsNCk7CQkJCQkvKiBCUENDICovCi0JbF9jdXJyZW50X2JwY2NfcHRyICs9IDQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwganAyLT5udW1jb21wczsgKytpKSAgewotCQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2JwY2NfcHRyLCBqcDItPmNvbXBzW2ldLmJwY2MsIDEpOyAvKiB3cml0ZSBlYWNoIGNvbXBvbmVudCBpbmZvcm1hdGlvbiAqLwotCQkrK2xfY3VycmVudF9icGNjX3B0cjsKLQl9Ci0KLQkqcF9uYl9ieXRlc193cml0dGVuID0gbF9icGNjX3NpemU7Ci0JCi0JcmV0dXJuIGxfYnBjY19kYXRhOwotfQotCi1PUEpfQk9PTCBvcGpfanAyX3JlYWRfYnBjYyggb3BqX2pwMl90ICpqcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2JwY19oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfYnBjX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLQlPUEpfVUlOVDMyIGk7Ci0KLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KHBfYnBjX2hlYWRlcl9kYXRhICE9IDAwKTsKLQlhc3NlcnQoanAyICE9IDAwKTsKLQlhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLQotCQotCWlmIChqcDItPmJwYyAhPSAyNTUgKXsKLQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiQSBCUENDIGhlYWRlciBib3ggaXMgYXZhaWxhYmxlIGFsdGhvdWdoIEJQQyBnaXZlbiBieSB0aGUgSUhEUiBib3ggKCVkKSBpbmRpY2F0ZSBjb21wb25lbnRzIGJpdCBkZXB0aCBpcyBjb25zdGFudFxuIixqcDItPmJwYyk7Ci0JfQotCi0JLyogYW5kIGxlbmd0aCBpcyByZWxldmFudCAqLwotCWlmIChwX2JwY19oZWFkZXJfc2l6ZSAhPSBqcDItPm51bWNvbXBzKSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJCYWQgQlBDQyBoZWFkZXIgYm94IChiYWQgc2l6ZSlcbiIpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQotCS8qIHJlYWQgaW5mbyBmb3IgZWFjaCBjb21wb25lbnQgKi8KLQlmb3IgKGkgPSAwOyBpIDwganAyLT5udW1jb21wczsgKytpKSB7Ci0JCW9wal9yZWFkX2J5dGVzKHBfYnBjX2hlYWRlcl9kYXRhLCZqcDItPmNvbXBzW2ldLmJwY2MgLDEpOwkvKiByZWFkIGVhY2ggQlBDQyBjb21wb25lbnQgKi8KLQkJKytwX2JwY19oZWFkZXJfZGF0YTsKLQl9Ci0KLQlyZXR1cm4gT1BKX1RSVUU7Ci19Ci1zdGF0aWMgT1BKX0JZVEUgKiBvcGpfanAyX3dyaXRlX2NkZWYob3BqX2pwMl90ICpqcDIsIE9QSl9VSU5UMzIgKiBwX25iX2J5dGVzX3dyaXR0ZW4pCi17Ci0JLyogcm9vbSBmb3IgOCBieXRlcyBmb3IgYm94LCAyIGZvciBuICovCi0JT1BKX1VJTlQzMiBsX2NkZWZfc2l6ZSA9IDEwOwotCU9QSl9CWVRFICogbF9jZGVmX2RhdGEsKiBsX2N1cnJlbnRfY2RlZl9wdHI7Ci0JT1BKX1VJTlQzMiBsX3ZhbHVlOwotCU9QSl9VSU5UMTYgaTsKLQotCS8qIHByZWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQoanAyICE9IDAwKTsKLQlhc3NlcnQocF9uYl9ieXRlc193cml0dGVuICE9IDAwKTsKLQlhc3NlcnQoanAyLT5jb2xvci5qcDJfY2RlZiAhPSAwMCk7Ci0JYXNzZXJ0KGpwMi0+Y29sb3IuanAyX2NkZWYtPmluZm8gIT0gMDApOwotCWFzc2VydChqcDItPmNvbG9yLmpwMl9jZGVmLT5uID4gMFUpOwotCi0JbF9jZGVmX3NpemUgKz0gNlUgKiBqcDItPmNvbG9yLmpwMl9jZGVmLT5uOwotCi0JbF9jZGVmX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX21hbGxvYyhsX2NkZWZfc2l6ZSk7Ci0JaWYgKGxfY2RlZl9kYXRhID09IDAwKSB7Ci0JCXJldHVybiAwMDsKLQl9Ci0KLQlsX2N1cnJlbnRfY2RlZl9wdHIgPSBsX2NkZWZfZGF0YTsKLQkKLQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2NkZWZfcHRyLGxfY2RlZl9zaXplLDQpOwkJCS8qIHdyaXRlIGJveCBzaXplICovCi0JbF9jdXJyZW50X2NkZWZfcHRyICs9IDQ7Ci0KLQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2NkZWZfcHRyLEpQMl9DREVGLDQpOwkJCQkJLyogQlBDQyAqLwotCWxfY3VycmVudF9jZGVmX3B0ciArPSA0OwotCi0JbF92YWx1ZSA9IGpwMi0+Y29sb3IuanAyX2NkZWYtPm47Ci0Jb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9jZGVmX3B0cixsX3ZhbHVlLDIpOwkJCQkJLyogTiAqLwotCWxfY3VycmVudF9jZGVmX3B0ciArPSAyOwotCi0JZm9yIChpID0gMFU7IGkgPCBqcDItPmNvbG9yLmpwMl9jZGVmLT5uOyArK2kpIHsKLQkJbF92YWx1ZSA9IGpwMi0+Y29sb3IuanAyX2NkZWYtPmluZm9baV0uY247Ci0JCW9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfY2RlZl9wdHIsbF92YWx1ZSwyKTsJCQkJCS8qIENuaSAqLwotCQlsX2N1cnJlbnRfY2RlZl9wdHIgKz0gMjsKLQkJbF92YWx1ZSA9IGpwMi0+Y29sb3IuanAyX2NkZWYtPmluZm9baV0udHlwOwotCQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2NkZWZfcHRyLGxfdmFsdWUsMik7CQkJCQkvKiBUeXBpICovCi0JCWxfY3VycmVudF9jZGVmX3B0ciArPSAyOwotCQlsX3ZhbHVlID0ganAyLT5jb2xvci5qcDJfY2RlZi0+aW5mb1tpXS5hc29jOwotCQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2NkZWZfcHRyLGxfdmFsdWUsMik7CQkJCQkvKiBBc29jaSAqLwotCQlsX2N1cnJlbnRfY2RlZl9wdHIgKz0gMjsKLQl9Ci0JKnBfbmJfYnl0ZXNfd3JpdHRlbiA9IGxfY2RlZl9zaXplOwotCi0JcmV0dXJuIGxfY2RlZl9kYXRhOwotfQotCi1PUEpfQllURSAqIG9wal9qcDJfd3JpdGVfY29sciggIG9wal9qcDJfdCAqanAyLAotCQkJCQkJCSAgICBPUEpfVUlOVDMyICogcF9uYl9ieXRlc193cml0dGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLQkvKiByb29tIGZvciA4IGJ5dGVzIGZvciBib3ggMyBmb3IgY29tbW9uIGRhdGEgYW5kIHZhcmlhYmxlIHVwb24gcHJvZmlsZSovCi0JT1BKX1VJTlQzMiBsX2NvbHJfc2l6ZSA9IDExOwotCU9QSl9CWVRFICogbF9jb2xyX2RhdGEsKiBsX2N1cnJlbnRfY29scl9wdHI7Ci0KLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KHBfbmJfYnl0ZXNfd3JpdHRlbiAhPSAwMCk7Ci0gICAgYXNzZXJ0KGpwMi0+bWV0aCA9PSAxIHx8IGpwMi0+bWV0aCA9PSAyKTsKLQotCXN3aXRjaCAoanAyLT5tZXRoKSB7IAotCQljYXNlIDEgOgotCQkJbF9jb2xyX3NpemUgKz0gNDsgLyogRW51bUNTICovCi0JCQlicmVhazsKLQkJY2FzZSAyIDoKLSAgICAgICAgICAgIGFzc2VydChqcDItPmNvbG9yLmljY19wcm9maWxlX2xlbik7CS8qIElDQyBwcm9maWxlICovCi0gICAgICAgICAgICBsX2NvbHJfc2l6ZSArPSBqcDItPmNvbG9yLmljY19wcm9maWxlX2xlbjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0IDoKLQkJCXJldHVybiAwMDsKLQl9Ci0KLQlsX2NvbHJfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfY2FsbG9jKDEsbF9jb2xyX3NpemUpOwotCWlmIChsX2NvbHJfZGF0YSA9PSAwMCkgewotCQlyZXR1cm4gMDA7Ci0JfQotCQotCWxfY3VycmVudF9jb2xyX3B0ciA9IGxfY29scl9kYXRhOwotCi0Jb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9jb2xyX3B0cixsX2NvbHJfc2l6ZSw0KTsJCQkJLyogd3JpdGUgYm94IHNpemUgKi8KLQlsX2N1cnJlbnRfY29scl9wdHIgKz0gNDsKLQkKLQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2NvbHJfcHRyLEpQMl9DT0xSLDQpOwkJCQkJLyogQlBDQyAqLwotCWxfY3VycmVudF9jb2xyX3B0ciArPSA0OwotCQotCW9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfY29scl9wdHIsIGpwMi0+bWV0aCwxKTsJCQkJLyogTUVUSCAqLwotCSsrbF9jdXJyZW50X2NvbHJfcHRyOwotCQotCW9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfY29scl9wdHIsIGpwMi0+cHJlY2VkZW5jZSwxKTsJCQkvKiBQUkVDRURFTkNFICovCi0JKytsX2N1cnJlbnRfY29scl9wdHI7Ci0JCi0Jb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9jb2xyX3B0ciwganAyLT5hcHByb3gsMSk7CQkJCS8qIEFQUFJPWCAqLwotCSsrbF9jdXJyZW50X2NvbHJfcHRyOwotCQotCWlmIChqcDItPm1ldGggPT0gMSkgeyAvKiBNZXRoIHZhbHVlIGlzIHJlc3RyaWN0ZWQgdG8gMSBvciAyIChUYWJsZSBJLjkgb2YgcGFydCAxKSAqLwotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2NvbHJfcHRyLCBqcDItPmVudW1jcyw0KTsgfSAgICAgICAvKiBFbnVtQ1MgKi8KLSAgICBlbHNlIHsKLSAgICAgICAgaWYgKGpwMi0+bWV0aCA9PSAyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJQ0MgcHJvZmlsZSAqLwotICAgICAgICAgICAgT1BKX1VJTlQzMiBpOwotICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwganAyLT5jb2xvci5pY2NfcHJvZmlsZV9sZW47ICsraSkgewotICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfY29scl9wdHIsIGpwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfYnVmW2ldLCAxKTsKLSAgICAgICAgICAgICAgICArK2xfY3VycmVudF9jb2xyX3B0cjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCX0KLQotCSpwX25iX2J5dGVzX3dyaXR0ZW4gPSBsX2NvbHJfc2l6ZTsKLQkKLQlyZXR1cm4gbF9jb2xyX2RhdGE7Ci19Ci0KLXZvaWQgb3BqX2pwMl9mcmVlX3BjbHIob3BqX2pwMl9jb2xvcl90ICpjb2xvcikKLXsKLSAgICBvcGpfZnJlZShjb2xvci0+anAyX3BjbHItPmNoYW5uZWxfc2lnbik7Ci0gICAgb3BqX2ZyZWUoY29sb3ItPmpwMl9wY2xyLT5jaGFubmVsX3NpemUpOwotICAgIG9wal9mcmVlKGNvbG9yLT5qcDJfcGNsci0+ZW50cmllcyk7Ci0KLQlpZihjb2xvci0+anAyX3BjbHItPmNtYXApIG9wal9mcmVlKGNvbG9yLT5qcDJfcGNsci0+Y21hcCk7Ci0KLSAgICBvcGpfZnJlZShjb2xvci0+anAyX3BjbHIpOyBjb2xvci0+anAyX3BjbHIgPSBOVUxMOwotfQotCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9jaGVja19jb2xvcihvcGpfaW1hZ2VfdCAqaW1hZ2UsIG9wal9qcDJfY29sb3JfdCAqY29sb3IsIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyKQotewotCU9QSl9VSU5UMTYgaTsKLQotCS8qIHRlc3RjYXNlIDQxNDkucGRmLlNJR1NFR1YuY2Y3LjM1MDEgKi8KLQlpZiAoY29sb3ItPmpwMl9jZGVmKSB7Ci0JCW9wal9qcDJfY2RlZl9pbmZvX3QgKmluZm8gPSBjb2xvci0+anAyX2NkZWYtPmluZm87Ci0JCU9QSl9VSU5UMTYgbiA9IGNvbG9yLT5qcDJfY2RlZi0+bjsKLQkJT1BKX1VJTlQzMiBucl9jaGFubmVscyA9IGltYWdlLT5udW1jb21wczsgLyogRklYTUUgaW1hZ2UtPm51bWNvbXBzID09IGpwMi0+bnVtY29tcHMgYmVmb3JlIGNvbG9yIGlzIGFwcGxpZWQgPz8/ICovCi0KLQkJLyogY2RlZiBhcHBsaWVzIHRvIGNtYXAgY2hhbm5lbHMgaWYgYW55ICovCi0JCWlmIChjb2xvci0+anAyX3BjbHIgJiYgY29sb3ItPmpwMl9wY2xyLT5jbWFwKSB7Ci0JCQlucl9jaGFubmVscyA9IChPUEpfVUlOVDMyKWNvbG9yLT5qcDJfcGNsci0+bnJfY2hhbm5lbHM7Ci0JCX0KLQotCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQlpZiAoaW5mb1tpXS5jbiA+PSBucl9jaGFubmVscykgewotCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJJbnZhbGlkIGNvbXBvbmVudCBpbmRleCAlZCAoPj0gJWQpLlxuIiwgaW5mb1tpXS5jbiwgbnJfY2hhbm5lbHMpOwotCQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCQl9Ci0JCQlpZiAoaW5mb1tpXS5hc29jID4gMCAmJiAoT1BKX1VJTlQzMikoaW5mb1tpXS5hc29jIC0gMSkgPj0gbnJfY2hhbm5lbHMpIHsKLQkJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSW52YWxpZCBjb21wb25lbnQgaW5kZXggJWQgKD49ICVkKS5cbiIsIGluZm9baV0uYXNvYyAtIDEsIG5yX2NoYW5uZWxzKTsKLQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQkJfQotCQl9Ci0KLQkJLyogaXNzdWUgMzk3ICovCi0JCS8qIElTTyAxNTQ0NC0xIHN0YXRlcyB0aGF0IGlmIGNkZWYgaXMgcHJlc2VudCwgaXQgc2hhbGwgY29udGFpbiBhIGNvbXBsZXRlIGxpc3Qgb2YgY2hhbm5lbCBkZWZpbml0aW9ucy4gKi8KLQkJd2hpbGUgKG5yX2NoYW5uZWxzID4gMCkKLQkJewotCQkJZm9yKGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0JCQkJaWYgKChPUEpfVUlOVDMyKWluZm9baV0uY24gPT0gKG5yX2NoYW5uZWxzIC0gMVUpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChpID09IG4pIHsKLQkJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSW5jb21wbGV0ZSBjaGFubmVsIGRlZmluaXRpb25zLlxuIik7Ci0JCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJCX0KLQkJCS0tbnJfY2hhbm5lbHM7Ci0JCX0KLQl9Ci0KLQkvKiB0ZXN0Y2FzZXMgNDUxLnBkZi5TSUdTRUdWLmY0Yy4zNzIzLCA0NTEucGRmLlNJR1NFR1YuNWI1LjM3MjMgYW5kCi0JICAgNjZlYTMxYWNiYjBmMjNhMmJiYzkxZjY0ZDY5YTAzZjVfc2lnbmFsX3NpZ3NlZ3ZfMTM5MzdjMF83MDMwXzU3MjUucGRmICovCi0JaWYgKGNvbG9yLT5qcDJfcGNsciAmJiBjb2xvci0+anAyX3BjbHItPmNtYXApIHsKLQkJT1BKX1VJTlQxNiBucl9jaGFubmVscyA9IGNvbG9yLT5qcDJfcGNsci0+bnJfY2hhbm5lbHM7Ci0JCW9wal9qcDJfY21hcF9jb21wX3QgKmNtYXAgPSBjb2xvci0+anAyX3BjbHItPmNtYXA7Ci0JCU9QSl9CT09MICpwY29sX3VzYWdlLCBpc19zYW5lID0gT1BKX1RSVUU7Ci0KLQkJLyogdmVyaWZ5IHRoYXQgYWxsIG9yaWdpbmFsIGNvbXBvbmVudHMgbWF0Y2ggYW4gZXhpc3Rpbmcgb25lICovCi0JCWZvciAoaSA9IDA7IGkgPCBucl9jaGFubmVsczsgaSsrKSB7Ci0JCQlpZiAoY21hcFtpXS5jbXAgPj0gaW1hZ2UtPm51bWNvbXBzKSB7Ci0JCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkludmFsaWQgY29tcG9uZW50IGluZGV4ICVkICg+PSAlZCkuXG4iLCBjbWFwW2ldLmNtcCwgaW1hZ2UtPm51bWNvbXBzKTsKLQkJCQlpc19zYW5lID0gT1BKX0ZBTFNFOwotCQkJfQotCQl9Ci0KLQkJcGNvbF91c2FnZSA9IG9wal9jYWxsb2MobnJfY2hhbm5lbHMsIHNpemVvZihPUEpfQk9PTCkpOwotCQlpZiAoIXBjb2xfdXNhZ2UpIHsKLQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJVbmV4cGVjdGVkIE9PTS5cbiIpOwotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCQkvKiB2ZXJpZnkgdGhhdCBubyBjb21wb25lbnQgaXMgdGFyZ2V0ZWQgbW9yZSB0aGFuIG9uY2UgKi8KLQkJZm9yIChpID0gMDsgaSA8IG5yX2NoYW5uZWxzOyBpKyspIHsKLSAgICAgIE9QSl9VSU5UMTYgcGNvbCA9IGNtYXBbaV0ucGNvbDsKLSAgICAgIGFzc2VydChjbWFwW2ldLm10eXAgPT0gMCB8fCBjbWFwW2ldLm10eXAgPT0gMSk7Ci0JCQlpZiAocGNvbCA+PSBucl9jaGFubmVscykgewotCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJJbnZhbGlkIGNvbXBvbmVudC9wYWxldHRlIGluZGV4IGZvciBkaXJlY3QgbWFwcGluZyAlZC5cbiIsIHBjb2wpOwotCQkJCWlzX3NhbmUgPSBPUEpfRkFMU0U7Ci0JCQl9Ci0JCQllbHNlIGlmIChwY29sX3VzYWdlW3Bjb2xdICYmIGNtYXBbaV0ubXR5cCA9PSAxKSB7Ci0JCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkNvbXBvbmVudCAlZCBpcyBtYXBwZWQgdHdpY2UuXG4iLCBwY29sKTsKLQkJCQlpc19zYW5lID0gT1BKX0ZBTFNFOwotCQkJfQotICAgICAgZWxzZSBpZiAoY21hcFtpXS5tdHlwID09IDAgJiYgY21hcFtpXS5wY29sICE9IDApIHsKLSAgICAgICAgLyogSS41LjMuNSBQQ09MOiBJZiB0aGUgdmFsdWUgb2YgdGhlIE1UWVAgZmllbGQgZm9yIHRoaXMgY2hhbm5lbCBpcyAwLCB0aGVuCi0gICAgICAgICAqIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIHNoYWxsIGJlIDAuICovCi0JCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkRpcmVjdCB1c2UgYXQgIyVkIGhvd2V2ZXIgcGNvbD0lZC5cbiIsIGksIHBjb2wpOwotCQkJCWlzX3NhbmUgPSBPUEpfRkFMU0U7Ci0gICAgICB9Ci0JCQllbHNlCi0JCQkJcGNvbF91c2FnZVtwY29sXSA9IE9QSl9UUlVFOwotCQl9Ci0JCS8qIHZlcmlmeSB0aGF0IGFsbCBjb21wb25lbnRzIGFyZSB0YXJnZXRlZCBhdCBsZWFzdCBvbmNlICovCi0JCWZvciAoaSA9IDA7IGkgPCBucl9jaGFubmVsczsgaSsrKSB7Ci0JCQlpZiAoIXBjb2xfdXNhZ2VbaV0gJiYgY21hcFtpXS5tdHlwICE9IDApIHsKLQkJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ29tcG9uZW50ICVkIGRvZXNuJ3QgaGF2ZSBhIG1hcHBpbmcuXG4iLCBpKTsKLQkJCQlpc19zYW5lID0gT1BKX0ZBTFNFOwotCQkJfQotCQl9Ci0JCW9wal9mcmVlKHBjb2xfdXNhZ2UpOwotCQlpZiAoIWlzX3NhbmUpIHsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLS8qIGZpbGU5LmpwMiAqLwotdm9pZCBvcGpfanAyX2FwcGx5X3BjbHIob3BqX2ltYWdlX3QgKmltYWdlLCBvcGpfanAyX2NvbG9yX3QgKmNvbG9yKQotewotCW9wal9pbWFnZV9jb21wX3QgKm9sZF9jb21wcywgKm5ld19jb21wczsKLQlPUEpfQllURSAqY2hhbm5lbF9zaXplLCAqY2hhbm5lbF9zaWduOwotCU9QSl9VSU5UMzIgKmVudHJpZXM7Ci0Jb3BqX2pwMl9jbWFwX2NvbXBfdCAqY21hcDsKLQlPUEpfSU5UMzIgKnNyYywgKmRzdDsKLQlPUEpfVUlOVDMyIGosIG1heDsKLQlPUEpfVUlOVDE2IGksIG5yX2NoYW5uZWxzLCBjbXAsIHBjb2w7Ci0JT1BKX0lOVDMyIGssIHRvcF9rOwotCi0JY2hhbm5lbF9zaXplID0gY29sb3ItPmpwMl9wY2xyLT5jaGFubmVsX3NpemU7Ci0JY2hhbm5lbF9zaWduID0gY29sb3ItPmpwMl9wY2xyLT5jaGFubmVsX3NpZ247Ci0JZW50cmllcyA9IGNvbG9yLT5qcDJfcGNsci0+ZW50cmllczsKLQljbWFwID0gY29sb3ItPmpwMl9wY2xyLT5jbWFwOwotCW5yX2NoYW5uZWxzID0gY29sb3ItPmpwMl9wY2xyLT5ucl9jaGFubmVsczsKLQotCW9sZF9jb21wcyA9IGltYWdlLT5jb21wczsKLQluZXdfY29tcHMgPSAob3BqX2ltYWdlX2NvbXBfdCopCi0JCQlvcGpfbWFsbG9jKG5yX2NoYW5uZWxzICogc2l6ZW9mKG9wal9pbWFnZV9jb21wX3QpKTsKLQlpZiAoIW5ld19jb21wcykgewotCQkvKiBGSVhNRSBubyBlcnJvciBjb2RlIGZvciBvcGpfanAyX2FwcGx5X3BjbHIgKi8KLQkJLyogRklYTUUgZXZlbnQgbWFuYWdlciBlcnJvciBjYWxsYmFjayAqLwotCQlyZXR1cm47Ci0JfQotCWZvcihpID0gMDsgaSA8IG5yX2NoYW5uZWxzOyArK2kpIHsKLQkJcGNvbCA9IGNtYXBbaV0ucGNvbDsgY21wID0gY21hcFtpXS5jbXA7Ci0KLQkJLyogRGlyZWN0IHVzZSAqLwotICAgIGlmKGNtYXBbaV0ubXR5cCA9PSAwKXsKLSAgICAgIGFzc2VydCggcGNvbCA9PSAwICk7Ci0gICAgICBuZXdfY29tcHNbaV0gPSBvbGRfY29tcHNbY21wXTsKLSAgICB9IGVsc2UgewotICAgICAgYXNzZXJ0KCBpID09IHBjb2wgKTsKLSAgICAgIG5ld19jb21wc1twY29sXSA9IG9sZF9jb21wc1tjbXBdOwotICAgIH0KLQotCQkvKiBQYWxldHRlIG1hcHBpbmc6ICovCi0JCW5ld19jb21wc1tpXS5kYXRhID0gKE9QSl9JTlQzMiopCi0JCQkJb3BqX21hbGxvYyhvbGRfY29tcHNbY21wXS53ICogb2xkX2NvbXBzW2NtcF0uaCAqIHNpemVvZihPUEpfSU5UMzIpKTsKLQkJaWYgKCFuZXdfY29tcHNbaV0uZGF0YSkgewotCQkJb3BqX2ZyZWUobmV3X2NvbXBzKTsKLQkJCW5ld19jb21wcyA9IE5VTEw7Ci0JCQkvKiBGSVhNRSBubyBlcnJvciBjb2RlIGZvciBvcGpfanAyX2FwcGx5X3BjbHIgKi8KLQkJCS8qIEZJWE1FIGV2ZW50IG1hbmFnZXIgZXJyb3IgY2FsbGJhY2sgKi8KLQkJCXJldHVybjsKLQkJfQotCQluZXdfY29tcHNbaV0ucHJlYyA9IGNoYW5uZWxfc2l6ZVtpXTsKLQkJbmV3X2NvbXBzW2ldLnNnbmQgPSBjaGFubmVsX3NpZ25baV07Ci0JfQotCi0JdG9wX2sgPSBjb2xvci0+anAyX3BjbHItPm5yX2VudHJpZXMgLSAxOwotCi0JZm9yKGkgPSAwOyBpIDwgbnJfY2hhbm5lbHM7ICsraSkgewotCQkvKiBQYWxldHRlIG1hcHBpbmc6ICovCi0JCWNtcCA9IGNtYXBbaV0uY21wOyBwY29sID0gY21hcFtpXS5wY29sOwotCQlzcmMgPSBvbGRfY29tcHNbY21wXS5kYXRhOwotICAgIGFzc2VydCggc3JjICk7Ci0JCW1heCA9IG5ld19jb21wc1twY29sXS53ICogbmV3X2NvbXBzW3Bjb2xdLmg7Ci0KLQkJLyogRGlyZWN0IHVzZTogKi8KLSAgICBpZihjbWFwW2ldLm10eXAgPT0gMCkgewotICAgICAgYXNzZXJ0KCBjbXAgPT0gMCApOwotICAgICAgZHN0ID0gbmV3X2NvbXBzW2ldLmRhdGE7Ci0gICAgICBhc3NlcnQoIGRzdCApOwotICAgICAgZm9yKGogPSAwOyBqIDwgbWF4OyArK2opIHsKLSAgICAgICAgZHN0W2pdID0gc3JjW2pdOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGFzc2VydCggaSA9PSBwY29sICk7Ci0gICAgICBkc3QgPSBuZXdfY29tcHNbcGNvbF0uZGF0YTsKLSAgICAgIGFzc2VydCggZHN0ICk7Ci0gICAgICBmb3IoaiA9IDA7IGogPCBtYXg7ICsraikgewotICAgICAgICAvKiBUaGUgaW5kZXggKi8KLSAgICAgICAgaWYoKGsgPSBzcmNbal0pIDwgMCkgayA9IDA7IGVsc2UgaWYoayA+IHRvcF9rKSBrID0gdG9wX2s7Ci0KLSAgICAgICAgLyogVGhlIGNvbG91ciAqLwotICAgICAgICBkc3Rbal0gPSAoT1BKX0lOVDMyKWVudHJpZXNbayAqIG5yX2NoYW5uZWxzICsgcGNvbF07Ci0gICAgICAgIH0KLSAgICB9Ci0JfQotCi0JbWF4ID0gaW1hZ2UtPm51bWNvbXBzOwotCWZvcihpID0gMDsgaSA8IG1heDsgKytpKSB7Ci0JCWlmKG9sZF9jb21wc1tpXS5kYXRhKSBvcGpfZnJlZShvbGRfY29tcHNbaV0uZGF0YSk7Ci0JfQotCi0Jb3BqX2ZyZWUob2xkX2NvbXBzKTsKLQlpbWFnZS0+Y29tcHMgPSBuZXdfY29tcHM7Ci0JaW1hZ2UtPm51bWNvbXBzID0gbnJfY2hhbm5lbHM7Ci0KLQlvcGpfanAyX2ZyZWVfcGNscihjb2xvcik7Ci0KLX0vKiBhcHBseV9wY2xyKCkgKi8KLQotT1BKX0JPT0wgb3BqX2pwMl9yZWFkX3BjbHIoCW9wal9qcDJfdCAqanAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9wY2xyX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9wY2xyX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLQlvcGpfanAyX3BjbHJfdCAqanAyX3BjbHI7Ci0JT1BKX0JZVEUgKmNoYW5uZWxfc2l6ZSwgKmNoYW5uZWxfc2lnbjsKLQlPUEpfVUlOVDMyICplbnRyaWVzOwotCU9QSl9VSU5UMTYgbnJfZW50cmllcyxucl9jaGFubmVsczsKLQlPUEpfVUlOVDE2IGksIGo7Ci0JT1BKX1VJTlQzMiBsX3ZhbHVlOwotCU9QSl9CWVRFICpvcmlnX2hlYWRlcl9kYXRhID0gcF9wY2xyX2hlYWRlcl9kYXRhOwotCi0JLyogcHJlY29uZGl0aW9ucyAqLwotCWFzc2VydChwX3BjbHJfaGVhZGVyX2RhdGEgIT0gMDApOwotCWFzc2VydChqcDIgIT0gMDApOwotCWFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICh2b2lkKXBfcGNscl9oZWFkZXJfc2l6ZTsKLQotCWlmKGpwMi0+Y29sb3IuanAyX3BjbHIpCi0JCXJldHVybiBPUEpfRkFMU0U7Ci0KLQlpZiAocF9wY2xyX2hlYWRlcl9zaXplIDwgMykKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQotCW9wal9yZWFkX2J5dGVzKHBfcGNscl9oZWFkZXJfZGF0YSwgJmxfdmFsdWUgLCAyKTsJLyogTkUgKi8KLQlwX3BjbHJfaGVhZGVyX2RhdGEgKz0gMjsKLQlucl9lbnRyaWVzID0gKE9QSl9VSU5UMTYpIGxfdmFsdWU7Ci0JaWYgKChucl9lbnRyaWVzID09IDBVKSB8fCAobnJfZW50cmllcyA+IDEwMjRVKSkgewotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSW52YWxpZCBQQ0xSIGJveC4gUmVwb3J0cyAlZCBlbnRyaWVzXG4iLCAoaW50KW5yX2VudHJpZXMpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQotCW9wal9yZWFkX2J5dGVzKHBfcGNscl9oZWFkZXJfZGF0YSwgJmxfdmFsdWUgLCAxKTsJLyogTlBDICovCi0JKytwX3BjbHJfaGVhZGVyX2RhdGE7Ci0JbnJfY2hhbm5lbHMgPSAoT1BKX1VJTlQxNikgbF92YWx1ZTsKLQlpZiAobnJfY2hhbm5lbHMgPT0gMFUpIHsKLQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkludmFsaWQgUENMUiBib3guIFJlcG9ydHMgMCBwYWxldHRlIGNvbHVtbnNcbiIpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQotCWlmIChwX3BjbHJfaGVhZGVyX3NpemUgPCAzICsgKE9QSl9VSU5UMzIpbnJfY2hhbm5lbHMpCi0JCXJldHVybiBPUEpfRkFMU0U7Ci0KLQllbnRyaWVzID0gKE9QSl9VSU5UMzIqKSBvcGpfbWFsbG9jKChzaXplX3QpbnJfY2hhbm5lbHMgKiBucl9lbnRyaWVzICogc2l6ZW9mKE9QSl9VSU5UMzIpKTsKLSAgICBpZiAoIWVudHJpZXMpCi0gICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0JY2hhbm5lbF9zaXplID0gKE9QSl9CWVRFKikgb3BqX21hbGxvYyhucl9jaGFubmVscyk7Ci0gICAgaWYgKCFjaGFubmVsX3NpemUpCi0gICAgewotICAgICAgICBvcGpfZnJlZShlbnRyaWVzKTsKLSAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICB9Ci0JY2hhbm5lbF9zaWduID0gKE9QSl9CWVRFKikgb3BqX21hbGxvYyhucl9jaGFubmVscyk7Ci0JaWYgKCFjaGFubmVsX3NpZ24pCi0JewotICAgICAgICBvcGpfZnJlZShlbnRyaWVzKTsKLSAgICAgICAgb3BqX2ZyZWUoY2hhbm5lbF9zaXplKTsKLSAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0KLQlqcDJfcGNsciA9IChvcGpfanAyX3BjbHJfdCopb3BqX21hbGxvYyhzaXplb2Yob3BqX2pwMl9wY2xyX3QpKTsKLSAgICBpZiAoIWpwMl9wY2xyKQotICAgIHsKLSAgICAgICAgb3BqX2ZyZWUoZW50cmllcyk7Ci0gICAgICAgIG9wal9mcmVlKGNoYW5uZWxfc2l6ZSk7Ci0gICAgICAgIG9wal9mcmVlKGNoYW5uZWxfc2lnbik7Ci0gICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgfQotCi0JanAyX3BjbHItPmNoYW5uZWxfc2lnbiA9IGNoYW5uZWxfc2lnbjsKLQlqcDJfcGNsci0+Y2hhbm5lbF9zaXplID0gY2hhbm5lbF9zaXplOwotCWpwMl9wY2xyLT5lbnRyaWVzID0gZW50cmllczsKLQlqcDJfcGNsci0+bnJfZW50cmllcyA9IG5yX2VudHJpZXM7Ci0JanAyX3BjbHItPm5yX2NoYW5uZWxzID0gKE9QSl9CWVRFKSBsX3ZhbHVlOwotCWpwMl9wY2xyLT5jbWFwID0gTlVMTDsKLQotCWpwMi0+Y29sb3IuanAyX3BjbHIgPSBqcDJfcGNscjsKLQotCWZvcihpID0gMDsgaSA8IG5yX2NoYW5uZWxzOyArK2kpIHsKLQkJb3BqX3JlYWRfYnl0ZXMocF9wY2xyX2hlYWRlcl9kYXRhLCAmbF92YWx1ZSAsIDEpOwkvKiBCaSAqLwotCQkrK3BfcGNscl9oZWFkZXJfZGF0YTsKLQotCQljaGFubmVsX3NpemVbaV0gPSAoT1BKX0JZVEUpKChsX3ZhbHVlICYgMHg3ZikgKyAxKTsKLQkJY2hhbm5lbF9zaWduW2ldID0gKGxfdmFsdWUgJiAweDgwKSA/IDEgOiAwOwotCX0KLQotCWZvcihqID0gMDsgaiA8IG5yX2VudHJpZXM7ICsraikgewotCQlmb3IoaSA9IDA7IGkgPCBucl9jaGFubmVsczsgKytpKSB7Ci0JCQlPUEpfVUlOVDMyIGJ5dGVzX3RvX3JlYWQgPSAoT1BKX1VJTlQzMikoKGNoYW5uZWxfc2l6ZVtpXSs3KT4+Myk7Ci0KLQkJCWlmIChieXRlc190b19yZWFkID4gc2l6ZW9mKE9QSl9VSU5UMzIpKQotCQkJCWJ5dGVzX3RvX3JlYWQgPSBzaXplb2YoT1BKX1VJTlQzMik7Ci0JCQlpZiAoKHB0cmRpZmZfdClwX3BjbHJfaGVhZGVyX3NpemUgPCAocHRyZGlmZl90KShwX3BjbHJfaGVhZGVyX2RhdGEgLSBvcmlnX2hlYWRlcl9kYXRhKSArIChwdHJkaWZmX3QpYnl0ZXNfdG9fcmVhZCkKLQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotCi0JCQlvcGpfcmVhZF9ieXRlcyhwX3BjbHJfaGVhZGVyX2RhdGEsICZsX3ZhbHVlICwgYnl0ZXNfdG9fcmVhZCk7CS8qIENqaSAqLwotCQkJcF9wY2xyX2hlYWRlcl9kYXRhICs9IGJ5dGVzX3RvX3JlYWQ7Ci0JCQkqZW50cmllcyA9IChPUEpfVUlOVDMyKSBsX3ZhbHVlOwotCQkJZW50cmllcysrOwotCQl9Ci0JfQotCi0JcmV0dXJuIE9QSl9UUlVFOwotfQotCi1PUEpfQk9PTCBvcGpfanAyX3JlYWRfY21hcCgJb3BqX2pwMl90ICoganAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9jbWFwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jbWFwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLQlvcGpfanAyX2NtYXBfY29tcF90ICpjbWFwOwotCU9QSl9CWVRFIGksIG5yX2NoYW5uZWxzOwotCU9QSl9VSU5UMzIgbF92YWx1ZTsKLQotCS8qIHByZWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQoanAyICE9IDAwKTsKLQlhc3NlcnQocF9jbWFwX2hlYWRlcl9kYXRhICE9IDAwKTsKLQlhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgICAodm9pZClwX2NtYXBfaGVhZGVyX3NpemU7Ci0KLQkvKiBOZWVkIG5yX2NoYW5uZWxzOiAqLwotCWlmKGpwMi0+Y29sb3IuanAyX3BjbHIgPT0gTlVMTCkgewotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTmVlZCB0byByZWFkIGEgUENMUiBib3ggYmVmb3JlIHRoZSBDTUFQIGJveC5cbiIpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQotCS8qIFBhcnQgMSwgSS41LjMuNTogJ1RoZXJlIHNoYWxsIGJlIGF0IG1vc3Qgb25lIENvbXBvbmVudCBNYXBwaW5nIGJveAotCSAqIGluc2lkZSBhIEpQMiBIZWFkZXIgYm94JyA6Ci0JKi8KLQlpZihqcDItPmNvbG9yLmpwMl9wY2xyLT5jbWFwKSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJPbmx5IG9uZSBDTUFQIGJveCBpcyBhbGxvd2VkLlxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCi0JbnJfY2hhbm5lbHMgPSBqcDItPmNvbG9yLmpwMl9wY2xyLT5ucl9jaGFubmVsczsKLQlpZiAocF9jbWFwX2hlYWRlcl9zaXplIDwgKE9QSl9VSU5UMzIpbnJfY2hhbm5lbHMgKiA0KSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJJbnN1ZmZpY2llbnQgZGF0YSBmb3IgQ01BUCBib3guXG4iKTsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0KLQljbWFwID0gKG9wal9qcDJfY21hcF9jb21wX3QqKSBvcGpfbWFsbG9jKG5yX2NoYW5uZWxzICogc2l6ZW9mKG9wal9qcDJfY21hcF9jb21wX3QpKTsKLSAgICBpZiAoIWNtYXApCi0gICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0KLQotCWZvcihpID0gMDsgaSA8IG5yX2NoYW5uZWxzOyArK2kpIHsKLQkJb3BqX3JlYWRfYnl0ZXMocF9jbWFwX2hlYWRlcl9kYXRhLCAmbF92YWx1ZSwgMik7CQkJLyogQ01QXmkgKi8KLQkJcF9jbWFwX2hlYWRlcl9kYXRhICs9MjsKLQkJY21hcFtpXS5jbXAgPSAoT1BKX1VJTlQxNikgbF92YWx1ZTsKLQotCQlvcGpfcmVhZF9ieXRlcyhwX2NtYXBfaGVhZGVyX2RhdGEsICZsX3ZhbHVlLCAxKTsJCQkvKiBNVFlQXmkgKi8KLQkJKytwX2NtYXBfaGVhZGVyX2RhdGE7Ci0JCWNtYXBbaV0ubXR5cCA9IChPUEpfQllURSkgbF92YWx1ZTsKLQotCQlvcGpfcmVhZF9ieXRlcyhwX2NtYXBfaGVhZGVyX2RhdGEsICZsX3ZhbHVlLCAxKTsJCQkvKiBQQ09MXmkgKi8KLQkJKytwX2NtYXBfaGVhZGVyX2RhdGE7Ci0JCWNtYXBbaV0ucGNvbCA9IChPUEpfQllURSkgbF92YWx1ZTsKLQl9Ci0KLQlqcDItPmNvbG9yLmpwMl9wY2xyLT5jbWFwID0gY21hcDsKLQotCXJldHVybiBPUEpfVFJVRTsKLX0KLQotdm9pZCBvcGpfanAyX2FwcGx5X2NkZWYob3BqX2ltYWdlX3QgKmltYWdlLCBvcGpfanAyX2NvbG9yX3QgKmNvbG9yKQotewotCW9wal9qcDJfY2RlZl9pbmZvX3QgKmluZm87Ci0JT1BKX1VJTlQxNiBpLCBuLCBjbiwgYXNvYywgYWNuOwotCQotCWluZm8gPSBjb2xvci0+anAyX2NkZWYtPmluZm87Ci0JbiA9IGNvbG9yLT5qcDJfY2RlZi0+bjsKLQkKLQlmb3IoaSA9IDA7IGkgPCBuOyArK2kpCi0JewotCQkvKiBXQVRDSDogYWNuID0gYXNvYyAtIDEgISAqLwotCQlhc29jID0gaW5mb1tpXS5hc29jOwotCQljbiA9IGluZm9baV0uY247Ci0JCQotCQlpZiggY24gPj0gaW1hZ2UtPm51bWNvbXBzKQotCQl7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgImNuPSVkLCBudW1jb21wcz0lZFxuIiwgY24sIGltYWdlLT5udW1jb21wcyk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZihhc29jID09IDAgfHwgYXNvYyA9PSA2NTUzNSkKLQkJewotCQkJaW1hZ2UtPmNvbXBzW2NuXS5hbHBoYSA9IGluZm9baV0udHlwOwotCQkJY29udGludWU7Ci0JCX0KLQkJCi0JCWFjbiA9IChPUEpfVUlOVDE2KShhc29jIC0gMSk7Ci0JCWlmKCBhY24gPj0gaW1hZ2UtPm51bWNvbXBzICkKLQkJewotCQkJZnByaW50ZihzdGRlcnIsICJhY249JWQsIG51bWNvbXBzPSVkXG4iLCBhY24sIGltYWdlLT5udW1jb21wcyk7Ci0JCQljb250aW51ZTsKLQkJfQotCQkKLQkJLyogU3dhcCBvbmx5IGlmIGNvbG9yIGNoYW5uZWwgKi8KLQkJaWYoKGNuICE9IGFjbikgJiYgKGluZm9baV0udHlwID09IDApKQotCQl7Ci0JCQlvcGpfaW1hZ2VfY29tcF90IHNhdmVkOwotCQkJT1BKX1VJTlQxNiBqOwotCQkJCi0JCQltZW1jcHkoJnNhdmVkLCAmaW1hZ2UtPmNvbXBzW2NuXSwgc2l6ZW9mKG9wal9pbWFnZV9jb21wX3QpKTsKLQkJCW1lbWNweSgmaW1hZ2UtPmNvbXBzW2NuXSwgJmltYWdlLT5jb21wc1thY25dLCBzaXplb2Yob3BqX2ltYWdlX2NvbXBfdCkpOwotCQkJbWVtY3B5KCZpbWFnZS0+Y29tcHNbYWNuXSwgJnNhdmVkLCBzaXplb2Yob3BqX2ltYWdlX2NvbXBfdCkpOwotCQkJCi0JCQkvKiBTd2FwIGNoYW5uZWxzIGluIGZvbGxvd2luZyBjaGFubmVsIGRlZmluaXRpb25zLCBkb24ndCBib3RoZXIgd2l0aCBqIDw9IGkgdGhhdCBhcmUgYWxyZWFkeSBwcm9jZXNzZWQgKi8KLQkJCWZvciAoaiA9IChPUEpfVUlOVDE2KShpICsgMVUpOyBqIDwgbiA7ICsraikKLQkJCXsKLQkJCQlpZiAoaW5mb1tqXS5jbiA9PSBjbikgewotCQkJCQlpbmZvW2pdLmNuID0gYWNuOwotCQkJCX0KLQkJCQllbHNlIGlmIChpbmZvW2pdLmNuID09IGFjbikgewotCQkJCQlpbmZvW2pdLmNuID0gY247Ci0JCQkJfQotCQkJCS8qIGFzb2MgaXMgcmVsYXRlZCB0byBjb2xvciBpbmRleC4gRG8gbm90IHVwZGF0ZS4gKi8KLQkJCX0KLQkJfQotCQkKLQkJaW1hZ2UtPmNvbXBzW2NuXS5hbHBoYSA9IGluZm9baV0udHlwOwotCX0KLQkKLQlpZihjb2xvci0+anAyX2NkZWYtPmluZm8pIG9wal9mcmVlKGNvbG9yLT5qcDJfY2RlZi0+aW5mbyk7Ci0JCi0Jb3BqX2ZyZWUoY29sb3ItPmpwMl9jZGVmKTsgY29sb3ItPmpwMl9jZGVmID0gTlVMTDsKLQkKLX0vKiBqcDJfYXBwbHlfY2RlZigpICovCi0KLU9QSl9CT09MIG9wal9qcDJfcmVhZF9jZGVmKAlvcGpfanAyX3QgKiBqcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2NkZWZfaGVhZGVyX2RhdGEsCi0JCQkJCQkJT1BKX1VJTlQzMiBwX2NkZWZfaGVhZGVyX3NpemUsCi0JCQkJCQkJb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotCW9wal9qcDJfY2RlZl9pbmZvX3QgKmNkZWZfaW5mbzsKLQlPUEpfVUlOVDE2IGk7Ci0JT1BKX1VJTlQzMiBsX3ZhbHVlOwotCi0JLyogcHJlY29uZGl0aW9ucyAqLwotCWFzc2VydChqcDIgIT0gMDApOwotCWFzc2VydChwX2NkZWZfaGVhZGVyX2RhdGEgIT0gMDApOwotCWFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICh2b2lkKXBfY2RlZl9oZWFkZXJfc2l6ZTsKLQotCS8qIFBhcnQgMSwgSS41LjMuNjogJ1RoZSBzaGFsbCBiZSBhdCBtb3N0IG9uZSBDaGFubmVsIERlZmluaXRpb24gYm94Ci0JICogaW5zaWRlIGEgSlAyIEhlYWRlciBib3guJyovCi0JaWYoanAyLT5jb2xvci5qcDJfY2RlZikgcmV0dXJuIE9QSl9GQUxTRTsKLQotCWlmIChwX2NkZWZfaGVhZGVyX3NpemUgPCAyKSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJJbnN1ZmZpY2llbnQgZGF0YSBmb3IgQ0RFRiBib3guXG4iKTsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0KLQlvcGpfcmVhZF9ieXRlcyhwX2NkZWZfaGVhZGVyX2RhdGEsJmxfdmFsdWUgLDIpOwkJCS8qIE4gKi8KLQlwX2NkZWZfaGVhZGVyX2RhdGErPSAyOwotCi0JaWYgKCAoT1BKX1VJTlQxNilsX3ZhbHVlID09IDApeyAvKiBzenVrdzAwMDogRklYTUUgKi8KLQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk51bWJlciBvZiBjaGFubmVsIGRlc2NyaXB0aW9uIGlzIGVxdWFsIHRvIHplcm8gaW4gQ0RFRiBib3guXG4iKTsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0KLQlpZiAocF9jZGVmX2hlYWRlcl9zaXplIDwgMiArIChPUEpfVUlOVDMyKShPUEpfVUlOVDE2KWxfdmFsdWUgKiA2KSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJJbnN1ZmZpY2llbnQgZGF0YSBmb3IgQ0RFRiBib3guXG4iKTsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0KLQljZGVmX2luZm8gPSAob3BqX2pwMl9jZGVmX2luZm9fdCopIG9wal9tYWxsb2MobF92YWx1ZSAqIHNpemVvZihvcGpfanAyX2NkZWZfaW5mb190KSk7Ci0gICAgaWYgKCFjZGVmX2luZm8pCi0gICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0KLQlqcDItPmNvbG9yLmpwMl9jZGVmID0gKG9wal9qcDJfY2RlZl90KilvcGpfbWFsbG9jKHNpemVvZihvcGpfanAyX2NkZWZfdCkpOwotICAgIGlmKCFqcDItPmNvbG9yLmpwMl9jZGVmKQotICAgIHsKLSAgICAgICAgb3BqX2ZyZWUoY2RlZl9pbmZvKTsKLSAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICB9Ci0JanAyLT5jb2xvci5qcDJfY2RlZi0+aW5mbyA9IGNkZWZfaW5mbzsKLQlqcDItPmNvbG9yLmpwMl9jZGVmLT5uID0gKE9QSl9VSU5UMTYpIGxfdmFsdWU7Ci0KLQlmb3IoaSA9IDA7IGkgPCBqcDItPmNvbG9yLmpwMl9jZGVmLT5uOyArK2kpIHsKLQkJb3BqX3JlYWRfYnl0ZXMocF9jZGVmX2hlYWRlcl9kYXRhLCAmbF92YWx1ZSwgMik7CQkJLyogQ25eaSAqLwotCQlwX2NkZWZfaGVhZGVyX2RhdGEgKz0yOwotCQljZGVmX2luZm9baV0uY24gPSAoT1BKX1VJTlQxNikgbF92YWx1ZTsKLQotCQlvcGpfcmVhZF9ieXRlcyhwX2NkZWZfaGVhZGVyX2RhdGEsICZsX3ZhbHVlLCAyKTsJCQkvKiBUeXBeaSAqLwotCQlwX2NkZWZfaGVhZGVyX2RhdGEgKz0yOwotCQljZGVmX2luZm9baV0udHlwID0gKE9QSl9VSU5UMTYpIGxfdmFsdWU7Ci0KLQkJb3BqX3JlYWRfYnl0ZXMocF9jZGVmX2hlYWRlcl9kYXRhLCAmbF92YWx1ZSwgMik7CQkJLyogQXNvY15pICovCi0JCXBfY2RlZl9oZWFkZXJfZGF0YSArPTI7Ci0JCWNkZWZfaW5mb1tpXS5hc29jID0gKE9QSl9VSU5UMTYpIGxfdmFsdWU7Ci0gICB9Ci0KLQlyZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9CT09MIG9wal9qcDJfcmVhZF9jb2xyKCBvcGpfanAyX3QgKmpwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfY29scl9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29scl9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0JT1BKX1VJTlQzMiBsX3ZhbHVlOwotCi0JLyogcHJlY29uZGl0aW9ucyAqLwotCWFzc2VydChqcDIgIT0gMDApOwotCWFzc2VydChwX2NvbHJfaGVhZGVyX2RhdGEgIT0gMDApOwotCWFzc2VydChwX21hbmFnZXIgIT0gMDApOwotCi0JaWYgKHBfY29scl9oZWFkZXJfc2l6ZSA8IDMpIHsKLQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkJhZCBDT0xSIGhlYWRlciBib3ggKGJhZCBzaXplKVxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCi0JLyogUGFydCAxLCBJLjUuMy4zIDogJ0EgY29uZm9ybWluZyBKUDIgcmVhZGVyIHNoYWxsIGlnbm9yZSBhbGwgQ29sb3VyCi0JICogU3BlY2lmaWNhdGlvbiBib3hlcyBhZnRlciB0aGUgZmlyc3QuJwotCSovCi0JaWYoanAyLT5jb2xvci5qcDJfaGFzX2NvbHIpIHsKLQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9JTkZPLCAiQSBjb25mb3JtaW5nIEpQMiByZWFkZXIgc2hhbGwgaWdub3JlIGFsbCBDb2xvdXIgU3BlY2lmaWNhdGlvbiBib3hlcyBhZnRlciB0aGUgZmlyc3QsIHNvIHdlIGlnbm9yZSB0aGlzIG9uZS5cbiIpOwotCQlwX2NvbHJfaGVhZGVyX2RhdGEgKz0gcF9jb2xyX2hlYWRlcl9zaXplOwotCQlyZXR1cm4gT1BKX1RSVUU7Ci0JfQotCi0Jb3BqX3JlYWRfYnl0ZXMocF9jb2xyX2hlYWRlcl9kYXRhLCZqcDItPm1ldGggLDEpOwkJCS8qIE1FVEggKi8KLQkrK3BfY29scl9oZWFkZXJfZGF0YTsKLQotCW9wal9yZWFkX2J5dGVzKHBfY29scl9oZWFkZXJfZGF0YSwmanAyLT5wcmVjZWRlbmNlICwxKTsJCS8qIFBSRUNFREVOQ0UgKi8KLQkrK3BfY29scl9oZWFkZXJfZGF0YTsKLQotCW9wal9yZWFkX2J5dGVzKHBfY29scl9oZWFkZXJfZGF0YSwmanAyLT5hcHByb3ggLDEpOwkJCS8qIEFQUFJPWCAqLwotCSsrcF9jb2xyX2hlYWRlcl9kYXRhOwotCi0JaWYgKGpwMi0+bWV0aCA9PSAxKSB7Ci0JCWlmIChwX2NvbHJfaGVhZGVyX3NpemUgPCA3KSB7Ci0JCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQmFkIENPTFIgaGVhZGVyIGJveCAoYmFkIHNpemU6ICVkKVxuIiwgcF9jb2xyX2hlYWRlcl9zaXplKTsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KLQkJaWYgKHBfY29scl9oZWFkZXJfc2l6ZSA+IDcpIHsKLQkJCS8qIHRlc3RjYXNlIEFsdG9uYV9UZWNobmljYWxfdjIwX3g0LnBkZiAqLwotCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiQmFkIENPTFIgaGVhZGVyIGJveCAoYmFkIHNpemU6ICVkKVxuIiwgcF9jb2xyX2hlYWRlcl9zaXplKTsKLQkJfQotCi0JCW9wal9yZWFkX2J5dGVzKHBfY29scl9oZWFkZXJfZGF0YSwmanAyLT5lbnVtY3MgLDQpOwkJCS8qIEVudW1DUyAqLwotICAgICAgICAKLSAgICAgICAganAyLT5jb2xvci5qcDJfaGFzX2NvbHIgPSAxOwotCX0KLQllbHNlIGlmIChqcDItPm1ldGggPT0gMikgewotCQkvKiBJQ0MgcHJvZmlsZSAqLwotCQlPUEpfSU5UMzIgaXRfaWNjX3ZhbHVlID0gMDsKLQkJT1BKX0lOVDMyIGljY19sZW4gPSAoT1BKX0lOVDMyKXBfY29scl9oZWFkZXJfc2l6ZSAtIDM7Ci0KLQkJanAyLT5jb2xvci5pY2NfcHJvZmlsZV9sZW4gPSAoT1BKX1VJTlQzMilpY2NfbGVuOwotCQlqcDItPmNvbG9yLmljY19wcm9maWxlX2J1ZiA9IChPUEpfQllURSopIG9wal9jYWxsb2MoMSwoc2l6ZV90KWljY19sZW4pOwotICAgICAgICBpZiAoIWpwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfYnVmKQotICAgICAgICB7Ci0gICAgICAgICAgICBqcDItPmNvbG9yLmljY19wcm9maWxlX2xlbiA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLQkJZm9yIChpdF9pY2NfdmFsdWUgPSAwOyBpdF9pY2NfdmFsdWUgPCBpY2NfbGVuOyArK2l0X2ljY192YWx1ZSkKLQkJewotCQkJb3BqX3JlYWRfYnl0ZXMocF9jb2xyX2hlYWRlcl9kYXRhLCZsX3ZhbHVlLDEpOwkJLyogaWNjIHZhbHVlcyAqLwotCQkJKytwX2NvbHJfaGVhZGVyX2RhdGE7Ci0JCQlqcDItPmNvbG9yLmljY19wcm9maWxlX2J1ZltpdF9pY2NfdmFsdWVdID0gKE9QSl9CWVRFKSBsX3ZhbHVlOwotCQl9Ci0JICAgIAotICAgICAgICBqcDItPmNvbG9yLmpwMl9oYXNfY29sciA9IDE7Ci0JfQotCWVsc2UgaWYgKGpwMi0+bWV0aCA+IDIpCi0gICAgewotICAgICAgICAvKglJU08vSUVDIDE1NDQ0LTE6MjAwNCAoRSksIFRhYmxlIEkuOSBMZWdhbCBNRVRIIHZhbHVlczoKLSAgICAgICAgY29uZm9ybWluZyBKUDIgcmVhZGVyIHNoYWxsIGlnbm9yZSB0aGUgZW50aXJlIENvbG91ciBTcGVjaWZpY2F0aW9uIGJveC4qLwotICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0lORk8sICJDT0xSIEJPWCBtZXRoIHZhbHVlIGlzIG5vdCBhIHJlZ3VsYXIgdmFsdWUgKCVkKSwgIiAKLSAgICAgICAgICAgICJzbyB3ZSB3aWxsIGlnbm9yZSB0aGUgZW50aXJlIENvbG91ciBTcGVjaWZpY2F0aW9uIGJveC4gXG4iLCBqcDItPm1ldGgpOwotICAgIH0KLSAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9CT09MIG9wal9qcDJfZGVjb2RlKG9wal9qcDJfdCAqanAyLAotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QqIHBfaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCi17Ci0JaWYgKCFwX2ltYWdlKQotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCi0JLyogSjJLIGRlY29kaW5nICovCi0JaWYoICEgb3BqX2oya19kZWNvZGUoanAyLT5qMmssIHBfc3RyZWFtLCBwX2ltYWdlLCBwX21hbmFnZXIpICkgewotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRmFpbGVkIHRvIGRlY29kZSB0aGUgY29kZXN0cmVhbSBpbiB0aGUgSlAyIGZpbGVcbiIpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQotICAgIGlmICghanAyLT5pZ25vcmVfcGNscl9jbWFwX2NkZWYpewotCSAgICBpZiAoIW9wal9qcDJfY2hlY2tfY29sb3IocF9pbWFnZSwgJihqcDItPmNvbG9yKSwgcF9tYW5hZ2VyKSkgewotCQkgICAgcmV0dXJuIE9QSl9GQUxTRTsKLQkgICAgfQotCi0JICAgIC8qIFNldCBJbWFnZSBDb2xvciBTcGFjZSAqLwotCSAgICBpZiAoanAyLT5lbnVtY3MgPT0gMTYpCi0JCSAgICBwX2ltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfU1JHQjsKLQkgICAgZWxzZSBpZiAoanAyLT5lbnVtY3MgPT0gMTcpCi0JCSAgICBwX2ltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfR1JBWTsKLQkgICAgZWxzZSBpZiAoanAyLT5lbnVtY3MgPT0gMTgpCi0JCSAgICBwX2ltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfU1lDQzsKLSAgICAgICAgICAgIGVsc2UgaWYgKGpwMi0+ZW51bWNzID09IDI0KQotICAgICAgICAgICAgICAgICAgICBwX2ltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfRVlDQzsKLQkgICAgZWxzZQotCQkgICAgcF9pbWFnZS0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX1VOS05PV047Ci0KLQkgICAgaWYoanAyLT5jb2xvci5qcDJfcGNscikgewotCQkgICAgLyogUGFydCAxLCBJLjUuMy40OiBFaXRoZXIgYm90aCBvciBub25lIDogKi8KLQkJICAgIGlmKCAhanAyLT5jb2xvci5qcDJfcGNsci0+Y21hcCkKLQkJCSAgICBvcGpfanAyX2ZyZWVfcGNscigmKGpwMi0+Y29sb3IpKTsKLQkJICAgIGVsc2UKLQkJCSAgICBvcGpfanAyX2FwcGx5X3BjbHIocF9pbWFnZSwgJihqcDItPmNvbG9yKSk7Ci0JICAgIH0KLQotCSAgICAvKiBBcHBseSB0aGUgY29sb3Igc3BhY2UgaWYgbmVlZGVkICovCi0JICAgIGlmKGpwMi0+Y29sb3IuanAyX2NkZWYpIHsKLQkJICAgIG9wal9qcDJfYXBwbHlfY2RlZihwX2ltYWdlLCAmKGpwMi0+Y29sb3IpKTsKLQkgICAgfQotCi0JICAgIGlmKGpwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfYnVmKSB7Ci0JCSAgICBwX2ltYWdlLT5pY2NfcHJvZmlsZV9idWYgPSBqcDItPmNvbG9yLmljY19wcm9maWxlX2J1ZjsKLQkJICAgIHBfaW1hZ2UtPmljY19wcm9maWxlX2xlbiA9IGpwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfbGVuOwotCQkgICAganAyLT5jb2xvci5pY2NfcHJvZmlsZV9idWYgPSBOVUxMOwotCSAgICB9Ci0gICAgfQotCi0JcmV0dXJuIE9QSl9UUlVFOwotfQotCi1PUEpfQk9PTCBvcGpfanAyX3dyaXRlX2pwMmgob3BqX2pwMl90ICpqcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0Jb3BqX2pwMl9pbWdfaGVhZGVyX3dyaXRlcl9oYW5kbGVyX3QgbF93cml0ZXJzIFs0XTsKLQlvcGpfanAyX2ltZ19oZWFkZXJfd3JpdGVyX2hhbmRsZXJfdCAqIGxfY3VycmVudF93cml0ZXI7Ci0KLQlPUEpfSU5UMzIgaSwgbF9uYl9wYXNzOwotCS8qIHNpemUgb2YgZGF0YSBmb3Igc3VwZXIgYm94Ki8KLQlPUEpfVUlOVDMyIGxfanAyaF9zaXplID0gODsKLQlPUEpfQk9PTCBsX3Jlc3VsdCA9IE9QSl9UUlVFOwotCi0JLyogdG8gc3RvcmUgdGhlIGRhdGEgb2YgdGhlIHN1cGVyIGJveCAqLwotCU9QSl9CWVRFIGxfanAyaF9kYXRhIFs4XTsKLQkKLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KHN0cmVhbSAhPSAwMCk7Ci0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0KLQltZW1zZXQobF93cml0ZXJzLDAsc2l6ZW9mKGxfd3JpdGVycykpOwotCi0JaWYgKGpwMi0+YnBjID09IDI1NSkgewotCQlsX25iX3Bhc3MgPSAzOwotCQlsX3dyaXRlcnNbMF0uaGFuZGxlciA9IG9wal9qcDJfd3JpdGVfaWhkcjsKLQkJbF93cml0ZXJzWzFdLmhhbmRsZXIgPSBvcGpfanAyX3dyaXRlX2JwY2M7Ci0JCWxfd3JpdGVyc1syXS5oYW5kbGVyID0gb3BqX2pwMl93cml0ZV9jb2xyOwotCX0KLQllbHNlIHsKLQkJbF9uYl9wYXNzID0gMjsKLQkJbF93cml0ZXJzWzBdLmhhbmRsZXIgPSBvcGpfanAyX3dyaXRlX2loZHI7Ci0JCWxfd3JpdGVyc1sxXS5oYW5kbGVyID0gb3BqX2pwMl93cml0ZV9jb2xyOwotCX0KLQkKLQlpZiAoanAyLT5jb2xvci5qcDJfY2RlZiAhPSBOVUxMKSB7Ci0JCWxfd3JpdGVyc1tsX25iX3Bhc3NdLmhhbmRsZXIgPSBvcGpfanAyX3dyaXRlX2NkZWY7Ci0JCWxfbmJfcGFzcysrOwotCX0KLQkKLQkvKiB3cml0ZSBib3ggaGVhZGVyICovCi0JLyogd3JpdGUgSlAySCB0eXBlICovCi0Jb3BqX3dyaXRlX2J5dGVzKGxfanAyaF9kYXRhKzQsSlAyX0pQMkgsNCk7Ci0KLQlsX2N1cnJlbnRfd3JpdGVyID0gbF93cml0ZXJzOwotCWZvciAoaT0wO2k8bF9uYl9wYXNzOysraSkgewotCQlsX2N1cnJlbnRfd3JpdGVyLT5tX2RhdGEgPSBsX2N1cnJlbnRfd3JpdGVyLT5oYW5kbGVyKGpwMiwmKGxfY3VycmVudF93cml0ZXItPm1fc2l6ZSkpOwotCQlpZiAobF9jdXJyZW50X3dyaXRlci0+bV9kYXRhID09IDAwKSB7Ci0JCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gaG9sZCBKUDIgSGVhZGVyIGRhdGFcbiIpOwotCQkJbF9yZXN1bHQgPSBPUEpfRkFMU0U7Ci0JCQlicmVhazsKLQkJfQotCi0JCWxfanAyaF9zaXplICs9IGxfY3VycmVudF93cml0ZXItPm1fc2l6ZTsKLQkJKytsX2N1cnJlbnRfd3JpdGVyOwotCX0KLQotCWlmICghIGxfcmVzdWx0KSB7Ci0JCWxfY3VycmVudF93cml0ZXIgPSBsX3dyaXRlcnM7Ci0JCWZvciAoaT0wO2k8bF9uYl9wYXNzOysraSkgewotCQkJaWYgKGxfY3VycmVudF93cml0ZXItPm1fZGF0YSAhPSAwMCkgewotCQkJCW9wal9mcmVlKGxfY3VycmVudF93cml0ZXItPm1fZGF0YSApOwotCQkJfQotCQkJKytsX2N1cnJlbnRfd3JpdGVyOwotCQl9Ci0KLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0KLQkvKiB3cml0ZSBzdXBlciBib3ggc2l6ZSAqLwotCW9wal93cml0ZV9ieXRlcyhsX2pwMmhfZGF0YSxsX2pwMmhfc2l6ZSw0KTsKLQkKLQkvKiB3cml0ZSBzdXBlciBib3ggZGF0YSBvbiBzdHJlYW0gKi8KLQlpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKHN0cmVhbSxsX2pwMmhfZGF0YSw4LHBfbWFuYWdlcikgIT0gOCkgewotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIGVycm9yIHdoaWxlIHdyaXRpbmcgSlAyIEhlYWRlciBib3hcbiIpOwotCQlsX3Jlc3VsdCA9IE9QSl9GQUxTRTsKLQl9Ci0JCi0JaWYgKGxfcmVzdWx0KSB7Ci0JCWxfY3VycmVudF93cml0ZXIgPSBsX3dyaXRlcnM7Ci0JCWZvciAoaT0wO2k8bF9uYl9wYXNzOysraSkgewotCQkJaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShzdHJlYW0sbF9jdXJyZW50X3dyaXRlci0+bV9kYXRhLGxfY3VycmVudF93cml0ZXItPm1fc2l6ZSxwX21hbmFnZXIpICE9IGxfY3VycmVudF93cml0ZXItPm1fc2l6ZSkgewotCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJTdHJlYW0gZXJyb3Igd2hpbGUgd3JpdGluZyBKUDIgSGVhZGVyIGJveFxuIik7Ci0JCQkJbF9yZXN1bHQgPSBPUEpfRkFMU0U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkrK2xfY3VycmVudF93cml0ZXI7Ci0JCX0KLQl9Ci0KLQlsX2N1cnJlbnRfd3JpdGVyID0gbF93cml0ZXJzOwotCQotCS8qIGNsZWFudXAgKi8KLQlmb3IgKGk9MDtpPGxfbmJfcGFzczsrK2kpIHsKLQkJaWYgKGxfY3VycmVudF93cml0ZXItPm1fZGF0YSAhPSAwMCkgewotCQkJb3BqX2ZyZWUobF9jdXJyZW50X3dyaXRlci0+bV9kYXRhICk7Ci0JCX0KLQkJKytsX2N1cnJlbnRfd3JpdGVyOwotCX0KLQotCXJldHVybiBsX3Jlc3VsdDsKLX0KLQotT1BKX0JPT0wgb3BqX2pwMl93cml0ZV9mdHlwKG9wal9qcDJfdCAqanAyLAotCQkJCQkJCW9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCi0JCQkJCQkJb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKLXsKLQlPUEpfVUlOVDMyIGk7Ci0JT1BKX1VJTlQzMiBsX2Z0eXBfc2l6ZSA9IDE2ICsgNCAqIGpwMi0+bnVtY2w7Ci0JT1BKX0JZVEUgKiBsX2Z0eXBfZGF0YSwgKiBsX2N1cnJlbnRfZGF0YV9wdHI7Ci0JT1BKX0JPT0wgbF9yZXN1bHQ7Ci0KLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KGNpbyAhPSAwMCk7Ci0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0KLQlsX2Z0eXBfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfY2FsbG9jKDEsbF9mdHlwX3NpemUpOwotCQotCWlmIChsX2Z0eXBfZGF0YSA9PSAwMCkgewotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGZ0eXAgZGF0YVxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCi0JbF9jdXJyZW50X2RhdGFfcHRyID0gbF9mdHlwX2RhdGE7Ci0KLQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGFfcHRyLCBsX2Z0eXBfc2l6ZSw0KTsgLyogYm94IHNpemUgKi8KLQlsX2N1cnJlbnRfZGF0YV9wdHIgKz0gNDsKLQotCW9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YV9wdHIsIEpQMl9GVFlQLDQpOyAvKiBGVFlQICovCi0JbF9jdXJyZW50X2RhdGFfcHRyICs9IDQ7Ci0KLQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGFfcHRyLCBqcDItPmJyYW5kLDQpOyAvKiBCUiAqLwotCWxfY3VycmVudF9kYXRhX3B0ciArPSA0OwotCi0Jb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhX3B0ciwganAyLT5taW52ZXJzaW9uLDQpOyAvKiBNaW5WICovCi0JbF9jdXJyZW50X2RhdGFfcHRyICs9IDQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwganAyLT5udW1jbDsgaSsrKSAgewotCQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGFfcHRyLCBqcDItPmNsW2ldLDQpOwkvKiBDTCAqLwotCX0KLQkKLQlsX3Jlc3VsdCA9IChvcGpfc3RyZWFtX3dyaXRlX2RhdGEoY2lvLGxfZnR5cF9kYXRhLGxfZnR5cF9zaXplLHBfbWFuYWdlcikgPT0gbF9mdHlwX3NpemUpOwotCWlmICghIGxfcmVzdWx0KQotCXsKLQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdoaWxlIHdyaXRpbmcgZnR5cCBkYXRhIHRvIHN0cmVhbVxuIik7Ci0JfQotCi0Jb3BqX2ZyZWUobF9mdHlwX2RhdGEpOwotCQotCXJldHVybiBsX3Jlc3VsdDsKLX0KLQotT1BKX0JPT0wgb3BqX2pwMl93cml0ZV9qcDJjKG9wal9qcDJfdCAqanAyLAotCQkJCQkJCW9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCi0JCQkJCQkJb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKLXsKLQlPUEpfT0ZGX1QgajJrX2NvZGVzdHJlYW1fZXhpdDsKLQlPUEpfQllURSBsX2RhdGFfaGVhZGVyIFs4XTsKLQkKLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KGNpbyAhPSAwMCk7Ci0JYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0JYXNzZXJ0KG9wal9zdHJlYW1faGFzX3NlZWsoY2lvKSk7Ci0JCi0JajJrX2NvZGVzdHJlYW1fZXhpdCA9IG9wal9zdHJlYW1fdGVsbChjaW8pOwotCW9wal93cml0ZV9ieXRlcyhsX2RhdGFfaGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMikgKGoya19jb2Rlc3RyZWFtX2V4aXQgLSBqcDItPmoya19jb2Rlc3RyZWFtX29mZnNldCksCi0gICAgICAgICAgICAgICAgICAgIDQpOyAvKiBzaXplIG9mIGNvZGVzdHJlYW0gKi8KLQlvcGpfd3JpdGVfYnl0ZXMobF9kYXRhX2hlYWRlciArIDQsSlAyX0pQMkMsNCk7CQkJCQkJCQkJICAgLyogSlAyQyAqLwotCi0JaWYgKCEgb3BqX3N0cmVhbV9zZWVrKGNpbyxqcDItPmoya19jb2Rlc3RyZWFtX29mZnNldCxwX21hbmFnZXIpKSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gc2VlayBpbiB0aGUgc3RyZWFtLlxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCQotCWlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEoY2lvLGxfZGF0YV9oZWFkZXIsOCxwX21hbmFnZXIpICE9IDgpIHsKLQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWxlZCB0byBzZWVrIGluIHRoZSBzdHJlYW0uXG4iKTsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0KLQlpZiAoISBvcGpfc3RyZWFtX3NlZWsoY2lvLGoya19jb2Rlc3RyZWFtX2V4aXQscF9tYW5hZ2VyKSkgewotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRmFpbGVkIHRvIHNlZWsgaW4gdGhlIHN0cmVhbS5cbiIpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQotCXJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX0JPT0wgb3BqX2pwMl93cml0ZV9qcCgJb3BqX2pwMl90ICpqcDIsCi0JCQkgICAgCQkgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKLQkJCQkgICAgCQlvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQotewotCS8qIDEyIGJ5dGVzIHdpbGwgYmUgcmVhZCAqLwotCU9QSl9CWVRFIGxfc2lnbmF0dXJlX2RhdGEgWzEyXTsKLQotCS8qIHByZWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQoY2lvICE9IDAwKTsKLQlhc3NlcnQoanAyICE9IDAwKTsKLQlhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLQotCS8qIHdyaXRlIGJveCBsZW5ndGggKi8KLQlvcGpfd3JpdGVfYnl0ZXMobF9zaWduYXR1cmVfZGF0YSwxMiw0KTsKLQkvKiB3cml0ZXMgYm94IHR5cGUgKi8KLQlvcGpfd3JpdGVfYnl0ZXMobF9zaWduYXR1cmVfZGF0YSs0LEpQMl9KUCw0KTsKLQkvKiB3cml0ZXMgbWFnaWMgbnVtYmVyKi8KLQlvcGpfd3JpdGVfYnl0ZXMobF9zaWduYXR1cmVfZGF0YSs4LDB4MGQwYTg3MGEsNCk7Ci0JCi0JaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShjaW8sbF9zaWduYXR1cmVfZGF0YSwxMixwX21hbmFnZXIpICE9IDEyKSB7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCi0JcmV0dXJuIE9QSl9UUlVFOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogSlAyIGRlY29kZXIgaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXZvaWQgb3BqX2pwMl9zZXR1cF9kZWNvZGVyKG9wal9qcDJfdCAqanAyLCBvcGpfZHBhcmFtZXRlcnNfdCAqcGFyYW1ldGVycykKLXsKLQkvKiBzZXR1cCB0aGUgSjJLIGNvZGVjICovCi0Jb3BqX2oya19zZXR1cF9kZWNvZGVyKGpwMi0+ajJrLCBwYXJhbWV0ZXJzKTsKLQotCS8qIGZ1cnRoZXIgSlAyIGluaXRpYWxpemF0aW9ucyBnbyBoZXJlICovCi0JanAyLT5jb2xvci5qcDJfaGFzX2NvbHIgPSAwOwotICAgIGpwMi0+aWdub3JlX3BjbHJfY21hcF9jZGVmID0gcGFyYW1ldGVycy0+ZmxhZ3MgJiBPUEpfRFBBUkFNRVRFUlNfSUdOT1JFX1BDTFJfQ01BUF9DREVGX0ZMQUc7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBKUDIgZW5jb2RlciBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotT1BKX0JPT0wgb3BqX2pwMl9zZXR1cF9lbmNvZGVyKAlvcGpfanAyX3QgKmpwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY3BhcmFtZXRlcnNfdCAqcGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQotewotCU9QSl9VSU5UMzIgaTsKLQlPUEpfVUlOVDMyIGRlcHRoXzA7Ci0gIE9QSl9VSU5UMzIgc2lnbjsKLQlPUEpfVUlOVDMyIGFscGhhX2NvdW50OwotCU9QSl9VSU5UMzIgY29sb3JfY2hhbm5lbHMgPSAwVTsKLQlPUEpfVUlOVDMyIGFscGhhX2NoYW5uZWwgPSAwVTsKLQkKLQotCWlmKCFqcDIgfHwgIXBhcmFtZXRlcnMgfHwgIWltYWdlKQotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCi0JLyogc2V0dXAgdGhlIEoySyBjb2RlYyAqLwotCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotCS8qIENoZWNrIGlmIG51bWJlciBvZiBjb21wb25lbnRzIHJlc3BlY3RzIHN0YW5kYXJkICovCi0JaWYgKGltYWdlLT5udW1jb21wcyA8IDEgfHwgaW1hZ2UtPm51bWNvbXBzID4gMTYzODQpIHsKLQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkludmFsaWQgbnVtYmVyIG9mIGNvbXBvbmVudHMgc3BlY2lmaWVkIHdoaWxlIHNldHRpbmcgdXAgSlAyIGVuY29kZXJcbiIpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQotCWlmIChvcGpfajJrX3NldHVwX2VuY29kZXIoanAyLT5qMmssIHBhcmFtZXRlcnMsIGltYWdlLCBwX21hbmFnZXIgKSA9PSBPUEpfRkFMU0UpIHsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0KLQkvKiBzZXR1cCB0aGUgSlAyIGNvZGVjICovCi0JLyogLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCQotCS8qIFByb2ZpbGUgYm94ICovCi0KLQlqcDItPmJyYW5kID0gSlAyX0pQMjsJLyogQlIgKi8KLQlqcDItPm1pbnZlcnNpb24gPSAwOwkvKiBNaW5WICovCi0JanAyLT5udW1jbCA9IDE7Ci0JanAyLT5jbCA9IChPUEpfVUlOVDMyKikgb3BqX21hbGxvYyhqcDItPm51bWNsICogc2l6ZW9mKE9QSl9VSU5UMzIpKTsKLQlpZiAoIWpwMi0+Y2wpewotCQlqcDItPmNsID0gTlVMTDsKLQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHdoZW4gc2V0dXAgdGhlIEpQMiBlbmNvZGVyXG4iKTsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0JanAyLT5jbFswXSA9IEpQMl9KUDI7CS8qIENMMCA6IEpQMiAqLwotCi0JLyogSW1hZ2UgSGVhZGVyIGJveCAqLwotCi0JanAyLT5udW1jb21wcyA9IGltYWdlLT5udW1jb21wczsJLyogTkMgKi8KLQlqcDItPmNvbXBzID0gKG9wal9qcDJfY29tcHNfdCopIG9wal9tYWxsb2MoanAyLT5udW1jb21wcyAqIHNpemVvZihvcGpfanAyX2NvbXBzX3QpKTsKLQlpZiAoIWpwMi0+Y29tcHMpIHsKLQkJanAyLT5jb21wcyA9IE5VTEw7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB3aGVuIHNldHVwIHRoZSBKUDIgZW5jb2RlclxuIik7Ci0JCS8qIE1lbW9yeSBvZiBqcDItPmNsIHdpbGwgYmUgZnJlZWQgYnkgb3BqX2pwMl9kZXN0cm95ICovCi0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCi0JanAyLT5oID0gaW1hZ2UtPnkxIC0gaW1hZ2UtPnkwOwkJLyogSEVJR0hUICovCi0JanAyLT53ID0gaW1hZ2UtPngxIC0gaW1hZ2UtPngwOwkJLyogV0lEVEggKi8KLQkvKiBCUEMgKi8KLQlkZXB0aF8wID0gaW1hZ2UtPmNvbXBzWzBdLnByZWMgLSAxOwotCXNpZ24gPSBpbWFnZS0+Y29tcHNbMF0uc2duZDsKLQlqcDItPmJwYyA9IGRlcHRoXzAgKyAoc2lnbiA8PCA3KTsKLQlmb3IgKGkgPSAxOyBpIDwgaW1hZ2UtPm51bWNvbXBzOyBpKyspIHsKLQkJT1BKX1VJTlQzMiBkZXB0aCA9IGltYWdlLT5jb21wc1tpXS5wcmVjIC0gMTsKLQkJc2lnbiA9IGltYWdlLT5jb21wc1tpXS5zZ25kOwotCQlpZiAoZGVwdGhfMCAhPSBkZXB0aCkKLQkJCWpwMi0+YnBjID0gMjU1OwotCX0KLQlqcDItPkMgPSA3OwkJCS8qIEMgOiBBbHdheXMgNyAqLwotCWpwMi0+VW5rQyA9IDA7CQkvKiBVbmtDLCBjb2xvcnNwYWNlIHNwZWNpZmllZCBpbiBjb2xyIGJveCAqLwotCWpwMi0+SVBSID0gMDsJCS8qIElQUiwgbm8gaW50ZWxsZWN0dWFsIHByb3BlcnR5ICovCi0JCi0JLyogQml0c1BlckNvbXBvbmVudCBib3ggKi8KLQlmb3IgKGkgPSAwOyBpIDwgaW1hZ2UtPm51bWNvbXBzOyBpKyspIHsKLQkJanAyLT5jb21wc1tpXS5icGNjID0gaW1hZ2UtPmNvbXBzW2ldLnByZWMgLSAxICsgKGltYWdlLT5jb21wc1tpXS5zZ25kIDw8IDcpOwotCX0KLQotCS8qIENvbG91ciBTcGVjaWZpY2F0aW9uIGJveCAqLwotICAgIGlmKGltYWdlLT5pY2NfcHJvZmlsZV9sZW4pIHsKLSAgICAgICAganAyLT5tZXRoID0gMjsKLSAgICAgICAganAyLT5lbnVtY3MgPSAwOwotICAgIH0gCi0gICAgZWxzZSB7Ci0gICAgICAgIGpwMi0+bWV0aCA9IDE7Ci0gICAgICAgIGlmIChpbWFnZS0+Y29sb3Jfc3BhY2UgPT0gMSkKLSAgICAgICAgICAgIGpwMi0+ZW51bWNzID0gMTY7CS8qIHNSR0IgYXMgZGVmaW5lZCBieSBJRUMgNjE5NjYtMi0xICovCi0gICAgICAgIGVsc2UgaWYgKGltYWdlLT5jb2xvcl9zcGFjZSA9PSAyKQotICAgICAgICAgICAganAyLT5lbnVtY3MgPSAxNzsJLyogZ3JleXNjYWxlICovCi0gICAgICAgIGVsc2UgaWYgKGltYWdlLT5jb2xvcl9zcGFjZSA9PSAzKQotICAgICAgICAgICAganAyLT5lbnVtY3MgPSAxODsJLyogWVVWICovCi0gICAgfQotCi0JLyogQ2hhbm5lbCBEZWZpbml0aW9uIGJveCAqLwotCS8qIEZJWE1FIG5vdCBwcm92aWRlZCBieSBwYXJhbWV0ZXJzICovCi0JLyogV2UgdHJ5IHRvIGRvIHdoYXQgd2UgY2FuLi4uICovCi0JYWxwaGFfY291bnQgPSAwVTsKLQlmb3IgKGkgPSAwOyBpIDwgaW1hZ2UtPm51bWNvbXBzOyBpKyspIHsKLQkJaWYgKGltYWdlLT5jb21wc1tpXS5hbHBoYSAhPSAwKSB7Ci0JCQlhbHBoYV9jb3VudCsrOwotCQkJYWxwaGFfY2hhbm5lbCA9IGk7Ci0JCX0KLQl9Ci0JaWYgKGFscGhhX2NvdW50ID09IDFVKSB7IC8qIG5vIHdheSB0byBkZWFsIHdpdGggbW9yZSB0aGFuIDEgYWxwaGEgY2hhbm5lbCAqLwotCQlzd2l0Y2ggKGpwMi0+ZW51bWNzKSB7Ci0JCQljYXNlIDE2OgotCQkJY2FzZSAxODoKLQkJCQljb2xvcl9jaGFubmVscyA9IDM7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE3OgotCQkJCWNvbG9yX2NoYW5uZWxzID0gMTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYWxwaGFfY291bnQgPSAwVTsKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoYWxwaGFfY291bnQgPT0gMFUpIHsKLQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkFscGhhIGNoYW5uZWwgc3BlY2lmaWVkIGJ1dCB1bmtub3duIGVudW1jcy4gTm8gY2RlZiBib3ggd2lsbCBiZSBjcmVhdGVkLlxuIik7Ci0JCX0gZWxzZSBpZiAoaW1hZ2UtPm51bWNvbXBzIDwgKGNvbG9yX2NoYW5uZWxzKzEpKSB7Ci0JCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJBbHBoYSBjaGFubmVsIHNwZWNpZmllZCBidXQgbm90IGVub3VnaCBpbWFnZSBjb21wb25lbnRzIGZvciBhbiBhdXRvbWF0aWMgY2RlZiBib3ggY3JlYXRpb24uXG4iKTsKLQkJCWFscGhhX2NvdW50ID0gMFU7Ci0JCX0gZWxzZSBpZiAoKE9QSl9VSU5UMzIpYWxwaGFfY2hhbm5lbCA8IGNvbG9yX2NoYW5uZWxzKSB7Ci0JCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJBbHBoYSBjaGFubmVsIHBvc2l0aW9uIGNvbmZsaWN0cyB3aXRoIGNvbG9yIGNoYW5uZWwuIE5vIGNkZWYgYm94IHdpbGwgYmUgY3JlYXRlZC5cbiIpOwotCQkJYWxwaGFfY291bnQgPSAwVTsKLQkJfQotCX0gZWxzZSBpZiAoYWxwaGFfY291bnQgPiAxKSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIk11bHRpcGxlIGFscGhhIGNoYW5uZWxzIHNwZWNpZmllZC4gTm8gY2RlZiBib3ggd2lsbCBiZSBjcmVhdGVkLlxuIik7Ci0JfQotCWlmIChhbHBoYV9jb3VudCA9PSAxVSkgeyAvKiBpZiBoZXJlLCB3ZSBrbm93IHdoYXQgd2UgY2FuIGRvICovCi0JCWpwMi0+Y29sb3IuanAyX2NkZWYgPSAob3BqX2pwMl9jZGVmX3QqKW9wal9tYWxsb2Moc2l6ZW9mKG9wal9qcDJfY2RlZl90KSk7Ci0JCWlmKCFqcDItPmNvbG9yLmpwMl9jZGVmKSB7Ci0JCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gc2V0dXAgdGhlIEpQMiBlbmNvZGVyXG4iKTsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KLQkJLyogbm8gbWVtc2V0IG5lZWRlZCwgYWxsIHZhbHVlcyB3aWxsIGJlIG92ZXJ3cml0dGVuIGV4Y2VwdCBpZiBqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvIGFsbG9jYXRpb24gZmFpbHMsICovCi0JCS8qIGluIHdoaWNoIGNhc2UganAyLT5jb2xvci5qcDJfY2RlZi0+aW5mbyB3aWxsIGJlIE5VTEwgPT4gdmFsaWQgZm9yIGRlc3RydWN0aW9uICovCi0JCWpwMi0+Y29sb3IuanAyX2NkZWYtPmluZm8gPSAob3BqX2pwMl9jZGVmX2luZm9fdCopIG9wal9tYWxsb2MoaW1hZ2UtPm51bWNvbXBzICogc2l6ZW9mKG9wal9qcDJfY2RlZl9pbmZvX3QpKTsKLQkJaWYgKCFqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvKSB7Ci0JCQkvKiBtZW1vcnkgd2lsbCBiZSBmcmVlZCBieSBvcGpfanAyX2Rlc3Ryb3kgKi8KLQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBzZXR1cCB0aGUgSlAyIGVuY29kZXJcbiIpOwotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCQlqcDItPmNvbG9yLmpwMl9jZGVmLT5uID0gKE9QSl9VSU5UMTYpIGltYWdlLT5udW1jb21wczsgLyogY2FzdCBpcyB2YWxpZCA6IGltYWdlLT5udW1jb21wcyBbMSwxNjM4NF0gKi8KLQkJZm9yIChpID0gMFU7IGkgPCBjb2xvcl9jaGFubmVsczsgaSsrKSB7Ci0JCQlqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvW2ldLmNuID0gKE9QSl9VSU5UMTYpaTsgLyogY2FzdCBpcyB2YWxpZCA6IGltYWdlLT5udW1jb21wcyBbMSwxNjM4NF0gKi8KLQkJCWpwMi0+Y29sb3IuanAyX2NkZWYtPmluZm9baV0udHlwID0gMFU7Ci0JCQlqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvW2ldLmFzb2MgPSAoT1BKX1VJTlQxNikoaSsxVSk7IC8qIE5vIG92ZXJmbG93ICsgY2FzdCBpcyB2YWxpZCA6IGltYWdlLT5udW1jb21wcyBbMSwxNjM4NF0gKi8KLQkJfQotCQlmb3IgKDsgaSA8IGltYWdlLT5udW1jb21wczsgaSsrKSB7Ci0JCQlpZiAoaW1hZ2UtPmNvbXBzW2ldLmFscGhhICE9IDApIHsgLyogd2UnbGwgYmUgaGVyZSBleGFjdGx5IG9uY2UgKi8KLQkJCQlqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvW2ldLmNuID0gKE9QSl9VSU5UMTYpaTsgLyogY2FzdCBpcyB2YWxpZCA6IGltYWdlLT5udW1jb21wcyBbMSwxNjM4NF0gKi8KLQkJCQlqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvW2ldLnR5cCA9IDFVOyAvKiBPcGFjaXR5IGNoYW5uZWwgKi8KLQkJCQlqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvW2ldLmFzb2MgPSAwVTsgLyogQXBwbHkgYWxwaGEgY2hhbm5lbCB0byB0aGUgd2hvbGUgaW1hZ2UgKi8KLQkJCX0gZWxzZSB7Ci0JCQkJLyogVW5rbm93biBjaGFubmVsICovCi0JCQkJanAyLT5jb2xvci5qcDJfY2RlZi0+aW5mb1tpXS5jbiA9IChPUEpfVUlOVDE2KWk7IC8qIGNhc3QgaXMgdmFsaWQgOiBpbWFnZS0+bnVtY29tcHMgWzEsMTYzODRdICovCi0JCQkJanAyLT5jb2xvci5qcDJfY2RlZi0+aW5mb1tpXS50eXAgPSA2NTUzNVU7Ci0JCQkJanAyLT5jb2xvci5qcDJfY2RlZi0+aW5mb1tpXS5hc29jID0gNjU1MzVVOwotCQkJfQotCQl9Ci0JfQotCi0JanAyLT5wcmVjZWRlbmNlID0gMDsJLyogUFJFQ0VERU5DRSAqLwotCWpwMi0+YXBwcm94ID0gMDsJCS8qIEFQUFJPWCAqLwotCi0JanAyLT5qcGlwX29uID0gcGFyYW1ldGVycy0+anBpcF9vbjsKLQotCXJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX0JPT0wgb3BqX2pwMl9lbmNvZGUob3BqX2pwMl90ICpqcDIsCi0JCQkJCQlvcGpfc3RyZWFtX3ByaXZhdGVfdCAqc3RyZWFtLAotCQkJCQkJb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQotewotCXJldHVybiBvcGpfajJrX2VuY29kZShqcDItPmoyaywgc3RyZWFtLCBwX21hbmFnZXIpOwotfQotCi1PUEpfQk9PTCBvcGpfanAyX2VuZF9kZWNvbXByZXNzKG9wal9qcDJfdCAqanAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotCS8qIHByZWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQoanAyICE9IDAwKTsKLQlhc3NlcnQoY2lvICE9IDAwKTsKLQlhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLQotCS8qIGN1c3RvbWl6YXRpb24gb2YgdGhlIGVuZCBlbmNvZGluZyAqLwotCW9wal9qcDJfc2V0dXBfZW5kX2hlYWRlcl9yZWFkaW5nKGpwMik7Ci0KLQkvKiB3cml0ZSBoZWFkZXIgKi8KLQlpZiAoISBvcGpfanAyX2V4ZWMgKGpwMixqcDItPm1fcHJvY2VkdXJlX2xpc3QsY2lvLHBfbWFuYWdlcikpIHsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0KLQlyZXR1cm4gb3BqX2oya19lbmRfZGVjb21wcmVzcyhqcDItPmoyaywgY2lvLCBwX21hbmFnZXIpOwotfQotCi1PUEpfQk9PTCBvcGpfanAyX2VuZF9jb21wcmVzcygJb3BqX2pwMl90ICpqcDIsCi0JCQkJCQkJICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCi0JCQkJCQkJICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0JLyogcHJlY29uZGl0aW9ucyAqLwotCWFzc2VydChqcDIgIT0gMDApOwotCWFzc2VydChjaW8gIT0gMDApOwotCWFzc2VydChwX21hbmFnZXIgIT0gMDApOwotCi0JLyogY3VzdG9taXphdGlvbiBvZiB0aGUgZW5kIGVuY29kaW5nICovCi0Jb3BqX2pwMl9zZXR1cF9lbmRfaGVhZGVyX3dyaXRpbmcoanAyKTsKLQotCWlmICghIG9wal9qMmtfZW5kX2NvbXByZXNzKGpwMi0+ajJrLGNpbyxwX21hbmFnZXIpKSB7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCi0JLyogd3JpdGUgaGVhZGVyICovCi0JcmV0dXJuIG9wal9qcDJfZXhlYyhqcDIsanAyLT5tX3Byb2NlZHVyZV9saXN0LGNpbyxwX21hbmFnZXIpOwotfQotCi12b2lkIG9wal9qcDJfc2V0dXBfZW5kX2hlYWRlcl93cml0aW5nIChvcGpfanAyX3QgKmpwMikKLXsKLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0KLSNpZmRlZiBVU0VfSlBJUAotICBpZigganAyLT5qcGlwX29uICkKLSAgICBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShqcDItPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2pwaXBfd3JpdGVfaXB0ciApOwotI2VuZGlmCi0Jb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUoanAyLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qcDJfd3JpdGVfanAyYyApOwotCS8qIERFVkVMT1BFUiBDT1JORVIsIGFkZCB5b3VyIGN1c3RvbSBwcm9jZWR1cmVzICovCi0jaWZkZWYgVVNFX0pQSVAKLSAgaWYoIGpwMi0+anBpcF9vbiApCi0gICAgewotICAgIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKGpwMi0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfanBpcF93cml0ZV9jaWR4ICk7Ci0gICAgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUoanAyLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qcGlwX3dyaXRlX2ZpZHggKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotdm9pZCBvcGpfanAyX3NldHVwX2VuZF9oZWFkZXJfcmVhZGluZyAob3BqX2pwMl90ICpqcDIpCi17Ci0JLyogcHJlY29uZGl0aW9ucyAqLwotCWFzc2VydChqcDIgIT0gMDApOwotCW9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKGpwMi0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfanAyX3JlYWRfaGVhZGVyX3Byb2NlZHVyZSApOwotCS8qIERFVkVMT1BFUiBDT1JORVIsIGFkZCB5b3VyIGN1c3RvbSBwcm9jZWR1cmVzICovCi19Ci0KLU9QSl9CT09MIG9wal9qcDJfZGVmYXVsdF92YWxpZGF0aW9uICgJb3BqX2pwMl90ICoganAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotCU9QSl9CT09MIGxfaXNfdmFsaWQgPSBPUEpfVFJVRTsKLQlPUEpfVUlOVDMyIGk7Ci0KLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KGNpbyAhPSAwMCk7Ci0JYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0KLQkvKiBKUEVHMjAwMCBjb2RlYyB2YWxpZGF0aW9uICovCi0KLQkvKiBTVEFURSBjaGVja2luZyAqLwotCS8qIG1ha2Ugc3VyZSB0aGUgc3RhdGUgaXMgYXQgMCAqLwotCWxfaXNfdmFsaWQgJj0gKGpwMi0+anAyX3N0YXRlID09IEpQMl9TVEFURV9OT05FKTsKLQotCS8qIG1ha2Ugc3VyZSBub3QgcmVhZGluZyBhIGpwMmggPz8/PyBXRUlSRCAqLwotCWxfaXNfdmFsaWQgJj0gKGpwMi0+anAyX2ltZ19zdGF0ZSA9PSBKUDJfSU1HX1NUQVRFX05PTkUpOwotCi0JLyogUE9JTlRFUiB2YWxpZGF0aW9uICovCi0JLyogbWFrZSBzdXJlIGEgajJrIGNvZGVjIGlzIHByZXNlbnQgKi8KLQlsX2lzX3ZhbGlkICY9IChqcDItPmoyayAhPSAwMCk7Ci0KLQkvKiBtYWtlIHN1cmUgYSBwcm9jZWR1cmUgbGlzdCBpcyBwcmVzZW50ICovCi0JbF9pc192YWxpZCAmPSAoanAyLT5tX3Byb2NlZHVyZV9saXN0ICE9IDAwKTsKLQotCS8qIG1ha2Ugc3VyZSBhIHZhbGlkYXRpb24gbGlzdCBpcyBwcmVzZW50ICovCi0JbF9pc192YWxpZCAmPSAoanAyLT5tX3ZhbGlkYXRpb25fbGlzdCAhPSAwMCk7Ci0KLQkvKiBQQVJBTUVURVIgVkFMSURBVElPTiAqLwotCS8qIG51bWJlciBvZiBjb21wb25lbnRzICovCi0JbF9pc192YWxpZCAmPSAoanAyLT5udW1jbCA+IDApOwotCS8qIHdpZHRoICovCi0JbF9pc192YWxpZCAmPSAoanAyLT5oID4gMCk7Ci0JLyogaGVpZ2h0ICovCi0JbF9pc192YWxpZCAmPSAoanAyLT53ID4gMCk7Ci0JLyogcHJlY2lzaW9uICovCi0JZm9yIChpID0gMDsgaSA8IGpwMi0+bnVtY29tcHM7ICsraSkJewotCQlsX2lzX3ZhbGlkICY9ICgoanAyLT5jb21wc1tpXS5icGNjICYgMHg3RlUpIDwgMzhVKTsgLyogMCBpcyB2YWxpZCwgaWdub3JlIHNpZ24gZm9yIGNoZWNrICovCi0JfQotCi0JLyogTUVUSCAqLwotCWxfaXNfdmFsaWQgJj0gKChqcDItPm1ldGggPiAwKSAmJiAoanAyLT5tZXRoIDwgMykpOwotCi0JLyogc3RyZWFtIHZhbGlkYXRpb24gKi8KLQkvKiBiYWNrIGFuZCBmb3J0aCBpcyBuZWVkZWQgKi8KLQlsX2lzX3ZhbGlkICY9IG9wal9zdHJlYW1faGFzX3NlZWsoY2lvKTsKLQotCXJldHVybiBsX2lzX3ZhbGlkOwotfQotCi1PUEpfQk9PTCBvcGpfanAyX3JlYWRfaGVhZGVyX3Byb2NlZHVyZSggIG9wal9qcDJfdCAqanAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotCW9wal9qcDJfYm94X3QgYm94OwotCU9QSl9VSU5UMzIgbF9uYl9ieXRlc19yZWFkOwotCWNvbnN0IG9wal9qcDJfaGVhZGVyX2hhbmRsZXJfdCAqIGxfY3VycmVudF9oYW5kbGVyOwotCU9QSl9VSU5UMzIgbF9sYXN0X2RhdGFfc2l6ZSA9IE9QSl9CT1hfU0laRTsKLQlPUEpfVUlOVDMyIGxfY3VycmVudF9kYXRhX3NpemU7Ci0JT1BKX0JZVEUgKiBsX2N1cnJlbnRfZGF0YSA9IDAwOwotCi0JLyogcHJlY29uZGl0aW9ucyAqLwotCWFzc2VydChzdHJlYW0gIT0gMDApOwotCWFzc2VydChqcDIgIT0gMDApOwotCWFzc2VydChwX21hbmFnZXIgIT0gMDApOwotCi0JbF9jdXJyZW50X2RhdGEgPSAoT1BKX0JZVEUqKW9wal9jYWxsb2MoMSxsX2xhc3RfZGF0YV9zaXplKTsKLQotCWlmIChsX2N1cnJlbnRfZGF0YSA9PSAwMCkgewotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGpwZWcyMDAwIGZpbGUgaGVhZGVyXG4iKTsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0KLQl3aGlsZSAob3BqX2pwMl9yZWFkX2JveGhkcigmYm94LCZsX25iX2J5dGVzX3JlYWQsc3RyZWFtLHBfbWFuYWdlcikpIHsKLQkJLyogaXMgaXQgdGhlIGNvZGVzdHJlYW0gYm94ID8gKi8KLQkJaWYgKGJveC50eXBlID09IEpQMl9KUDJDKSB7Ci0JCQlpZiAoanAyLT5qcDJfc3RhdGUgJiBKUDJfU1RBVEVfSEVBREVSKSB7Ci0JCQkJanAyLT5qcDJfc3RhdGUgfD0gSlAyX1NUQVRFX0NPREVTVFJFQU07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKLQkJCQlyZXR1cm4gT1BKX1RSVUU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiYmFkIHBsYWNlZCBqcGVnIGNvZGVzdHJlYW1cbiIpOwotCQkJCW9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKLQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYJKGJveC5sZW5ndGggPT0gMCkgewotCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkNhbm5vdCBoYW5kbGUgYm94IG9mIHVuZGVmaW5lZCBzaXplc1xuIik7Ci0JCQlvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9Ci0JCS8qIHRlc3RjYXNlIDE4NTEucGRmLlNJR1NFR1YuY2U5Ljk0OCAqLwotICAgICAgICBlbHNlIGlmIChib3gubGVuZ3RoIDwgbF9uYl9ieXRlc19yZWFkKSB7Ci0JCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiaW52YWxpZCBib3ggc2l6ZSAlZCAoJXgpXG4iLCBib3gubGVuZ3RoLCBib3gudHlwZSk7Ci0JCQlvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9Ci0KLQkJbF9jdXJyZW50X2hhbmRsZXIgPSBvcGpfanAyX2ZpbmRfaGFuZGxlcihib3gudHlwZSk7Ci0JCWxfY3VycmVudF9kYXRhX3NpemUgPSBib3gubGVuZ3RoIC0gbF9uYl9ieXRlc19yZWFkOwotCi0JCWlmIChsX2N1cnJlbnRfaGFuZGxlciAhPSAwMCkgewotCQkJaWYgKChPUEpfT0ZGX1QpbF9jdXJyZW50X2RhdGFfc2l6ZSA+IG9wal9zdHJlYW1fZ2V0X251bWJlcl9ieXRlX2xlZnQoc3RyZWFtKSkgewotCQkJCS8qIGRvIG5vdCBldmVuIHRyeSB0byBtYWxsb2MgaWYgd2UgY2FuJ3QgcmVhZCAqLwotCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJJbnZhbGlkIGJveCBzaXplICVkIGZvciBib3ggJyVjJWMlYyVjJy4gTmVlZCAlZCBieXRlcywgJWQgYnl0ZXMgcmVtYWluaW5nIFxuIiwgYm94Lmxlbmd0aCwgKE9QSl9CWVRFKShib3gudHlwZT4+MjQpLCAoT1BKX0JZVEUpKGJveC50eXBlPj4xNiksIChPUEpfQllURSkoYm94LnR5cGU+PjgpLCAoT1BKX0JZVEUpKGJveC50eXBlPj4wKSwgbF9jdXJyZW50X2RhdGFfc2l6ZSwgKE9QSl9VSU5UMzIpb3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdChzdHJlYW0pKTsKLQkJCQlvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7Ci0JCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJCX0KLQkJCWlmIChsX2N1cnJlbnRfZGF0YV9zaXplID4gbF9sYXN0X2RhdGFfc2l6ZSkgewotCQkJCU9QSl9CWVRFKiBuZXdfY3VycmVudF9kYXRhID0gKE9QSl9CWVRFKilvcGpfcmVhbGxvYyhsX2N1cnJlbnRfZGF0YSxsX2N1cnJlbnRfZGF0YV9zaXplKTsKLQkJCQlpZiAoIW5ld19jdXJyZW50X2RhdGEpIHsKLQkJCQkJb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOwotICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGpwZWcyMDAwIGJveFxuIik7Ci0JCQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCQkJfQotICAgICAgICAgICAgICAgIGxfY3VycmVudF9kYXRhID0gbmV3X2N1cnJlbnRfZGF0YTsKLQkJCQlsX2xhc3RfZGF0YV9zaXplID0gbF9jdXJyZW50X2RhdGFfc2l6ZTsKLQkJCX0KLQotCQkJbF9uYl9ieXRlc19yZWFkID0gKE9QSl9VSU5UMzIpb3BqX3N0cmVhbV9yZWFkX2RhdGEoc3RyZWFtLGxfY3VycmVudF9kYXRhLGxfY3VycmVudF9kYXRhX3NpemUscF9tYW5hZ2VyKTsKLQkJCWlmIChsX25iX2J5dGVzX3JlYWQgIT0gbF9jdXJyZW50X2RhdGFfc2l6ZSkgewotCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJQcm9ibGVtIHdpdGggcmVhZGluZyBKUEVHMjAwMCBib3gsIHN0cmVhbSBlcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOyAgICAgICAgICAgICAgICAKLQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQkJfQotCi0JCQlpZiAoISBsX2N1cnJlbnRfaGFuZGxlci0+aGFuZGxlcihqcDIsbF9jdXJyZW50X2RhdGEsbF9jdXJyZW50X2RhdGFfc2l6ZSxwX21hbmFnZXIpKSB7Ci0JCQkJb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOwotCQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIShqcDItPmpwMl9zdGF0ZSAmIEpQMl9TVEFURV9TSUdOQVRVUkUpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk1hbGZvcm1lZCBKUDIgZmlsZSBmb3JtYXQ6IGZpcnN0IGJveCBtdXN0IGJlIEpQRUcgMjAwMCBzaWduYXR1cmUgYm94XG4iKTsKLSAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghKGpwMi0+anAyX3N0YXRlICYgSlAyX1NUQVRFX0ZJTEVfVFlQRSkpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTWFsZm9ybWVkIEpQMiBmaWxlIGZvcm1hdDogc2Vjb25kIGJveCBtdXN0IGJlIGZpbGUgdHlwZSBib3hcbiIpOwotICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgfQotCQkJanAyLT5qcDJfc3RhdGUgfD0gSlAyX1NUQVRFX1VOS05PV047Ci0JCQlpZiAob3BqX3N0cmVhbV9za2lwKHN0cmVhbSxsX2N1cnJlbnRfZGF0YV9zaXplLHBfbWFuYWdlcikgIT0gbF9jdXJyZW50X2RhdGFfc2l6ZSkgewotCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJQcm9ibGVtIHdpdGggc2tpcHBpbmcgSlBFRzIwMDAgYm94LCBzdHJlYW0gZXJyb3JcbiIpOwotCQkJCW9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKLQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQkJfQotCQl9Ci0JfQotCi0Jb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOwotCi0JcmV0dXJuIE9QSl9UUlVFOwotfQotCi0vKioKLSAqIEV4Y3V0ZXMgdGhlIGdpdmVuIHByb2NlZHVyZXMgb24gdGhlIGdpdmVuIGNvZGVjLgotICoKLSAqIEBwYXJhbQlwX3Byb2NlZHVyZV9saXN0CXRoZSBsaXN0IG9mIHByb2NlZHVyZXMgdG8gZXhlY3V0ZQotICogQHBhcmFtCWpwMgkJCQkJdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMgdG8gZXhlY3V0ZSB0aGUgcHJvY2VkdXJlcyBvbi4KLSAqIEBwYXJhbQlzdHJlYW0JCQkJCXRoZSBzdHJlYW0gdG8gZXhlY3V0ZSB0aGUgcHJvY2VkdXJlcyBvbi4KLSAqIEBwYXJhbQlwX21hbmFnZXIJCQl0aGUgdXNlciBtYW5hZ2VyLgotICoKLSAqIEByZXR1cm4JdHJ1ZQkJCQlpZiBhbGwgdGhlIHByb2NlZHVyZXMgd2VyZSBzdWNjZXNzZnVsbHkgZXhlY3V0ZWQuCi0gKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX2V4ZWMgKCAgb3BqX2pwMl90ICoganAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcHJvY2VkdXJlX2xpc3RfdCAqIHBfcHJvY2VkdXJlX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0KLXsKLQlPUEpfQk9PTCAoKiogbF9wcm9jZWR1cmUpIChvcGpfanAyX3QgKiBqcDIsIG9wal9zdHJlYW1fcHJpdmF0ZV90ICosIG9wal9ldmVudF9tZ3JfdCAqKSA9IDAwOwotCU9QSl9CT09MIGxfcmVzdWx0ID0gT1BKX1RSVUU7Ci0JT1BKX1VJTlQzMiBsX25iX3Byb2MsIGk7Ci0KLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KHBfcHJvY2VkdXJlX2xpc3QgIT0gMDApOwotCWFzc2VydChqcDIgIT0gMDApOwotCWFzc2VydChzdHJlYW0gIT0gMDApOwotCWFzc2VydChwX21hbmFnZXIgIT0gMDApOwotCi0JbF9uYl9wcm9jID0gb3BqX3Byb2NlZHVyZV9saXN0X2dldF9uYl9wcm9jZWR1cmVzKHBfcHJvY2VkdXJlX2xpc3QpOwotCWxfcHJvY2VkdXJlID0gKE9QSl9CT09MICgqKikgKG9wal9qcDJfdCAqIGpwMiwgb3BqX3N0cmVhbV9wcml2YXRlX3QgKiwgb3BqX2V2ZW50X21ncl90ICopKSBvcGpfcHJvY2VkdXJlX2xpc3RfZ2V0X2ZpcnN0X3Byb2NlZHVyZShwX3Byb2NlZHVyZV9saXN0KTsKLQotCWZvcgkoaT0wO2k8bF9uYl9wcm9jOysraSkgewotCQlsX3Jlc3VsdCA9IGxfcmVzdWx0ICYmICgqbF9wcm9jZWR1cmUpIChqcDIsc3RyZWFtLHBfbWFuYWdlcik7Ci0JCSsrbF9wcm9jZWR1cmU7Ci0JfQotCi0JLyogYW5kIGNsZWFyIHRoZSBwcm9jZWR1cmUgbGlzdCBhdCB0aGUgZW5kLiAqLwotCW9wal9wcm9jZWR1cmVfbGlzdF9jbGVhcihwX3Byb2NlZHVyZV9saXN0KTsKLQlyZXR1cm4gbF9yZXN1bHQ7Ci19Ci0KLU9QSl9CT09MIG9wal9qcDJfc3RhcnRfY29tcHJlc3Mob3BqX2pwMl90ICpqcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90ICogcF9pbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KHN0cmVhbSAhPSAwMCk7Ci0JYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0KLQkvKiBjdXN0b21pemF0aW9uIG9mIHRoZSB2YWxpZGF0aW9uICovCi0Jb3BqX2pwMl9zZXR1cF9lbmNvZGluZ192YWxpZGF0aW9uIChqcDIpOwotCi0JLyogdmFsaWRhdGlvbiBvZiB0aGUgcGFyYW1ldGVycyBjb2RlYyAqLwotCWlmICghIG9wal9qcDJfZXhlYyhqcDIsanAyLT5tX3ZhbGlkYXRpb25fbGlzdCxzdHJlYW0scF9tYW5hZ2VyKSkgewotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQotCS8qIGN1c3RvbWl6YXRpb24gb2YgdGhlIGVuY29kaW5nICovCi0Jb3BqX2pwMl9zZXR1cF9oZWFkZXJfd3JpdGluZyhqcDIpOwotCi0JLyogd3JpdGUgaGVhZGVyICovCi0JaWYgKCEgb3BqX2pwMl9leGVjIChqcDIsanAyLT5tX3Byb2NlZHVyZV9saXN0LHN0cmVhbSxwX21hbmFnZXIpKSB7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCi0JcmV0dXJuIG9wal9qMmtfc3RhcnRfY29tcHJlc3MoanAyLT5qMmssc3RyZWFtLHBfaW1hZ2UscF9tYW5hZ2VyKTsKLX0KLQotY29uc3Qgb3BqX2pwMl9oZWFkZXJfaGFuZGxlcl90ICogb3BqX2pwMl9maW5kX2hhbmRsZXIgKE9QSl9VSU5UMzIgcF9pZCkKLXsKLQlPUEpfVUlOVDMyIGksIGxfaGFuZGxlcl9zaXplID0gc2l6ZW9mKGpwMl9oZWFkZXIpIC8gc2l6ZW9mKG9wal9qcDJfaGVhZGVyX2hhbmRsZXJfdCk7Ci0KLQlmb3IgKGk9MDtpPGxfaGFuZGxlcl9zaXplOysraSkgewotCQlpZiAoanAyX2hlYWRlcltpXS5pZCA9PSBwX2lkKSB7Ci0JCQlyZXR1cm4gJmpwMl9oZWFkZXJbaV07Ci0JCX0KLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKgotICogRmluZHMgdGhlIGltYWdlIGV4ZWN1dGlvbiBmdW5jdGlvbiByZWxhdGVkIHRvIHRoZSBnaXZlbiBib3ggaWQuCi0gKgotICogQHBhcmFtCXBfaWQJdGhlIGlkIG9mIHRoZSBoYW5kbGVyIHRvIGZldGNoLgotICoKLSAqIEByZXR1cm4JdGhlIGdpdmVuIGhhbmRsZXIgb3IgMDAgaWYgaXQgY291bGQgbm90IGJlIGZvdW5kLgotICovCi1zdGF0aWMgY29uc3Qgb3BqX2pwMl9oZWFkZXJfaGFuZGxlcl90ICogb3BqX2pwMl9pbWdfZmluZF9oYW5kbGVyIChPUEpfVUlOVDMyIHBfaWQpCi17Ci0JT1BKX1VJTlQzMiBpLCBsX2hhbmRsZXJfc2l6ZSA9IHNpemVvZihqcDJfaW1nX2hlYWRlcikgLyBzaXplb2Yob3BqX2pwMl9oZWFkZXJfaGFuZGxlcl90KTsKLQlmb3IgKGk9MDtpPGxfaGFuZGxlcl9zaXplOysraSkKLQl7Ci0JCWlmIChqcDJfaW1nX2hlYWRlcltpXS5pZCA9PSBwX2lkKSB7Ci0JCQlyZXR1cm4gJmpwMl9pbWdfaGVhZGVyW2ldOwotCQl9Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKgotICogUmVhZHMgYSBqcGVnMjAwMCBmaWxlIHNpZ25hdHVyZSBib3guCi0gKgotICogQHBhcmFtCXBfaGVhZGVyX2RhdGEJdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBzaWduYXR1cmUgYm94LgotICogQHBhcmFtCWpwMgkJCQl0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KLSAqIEBwYXJhbQlwX2hlYWRlcl9zaXplCXRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgc2lnbmF0dXJlIGJveC4KLSAqIEBwYXJhbQlwX21hbmFnZXIJCXRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0gKgotICogQHJldHVybiB0cnVlIGlmIHRoZSBmaWxlIHNpZ25hdHVyZSBib3ggaXMgdmFsaWQuCi0gKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfanAob3BqX2pwMl90ICpqcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotCi17Ci0JT1BKX1VJTlQzMiBsX21hZ2ljX251bWJlcjsKLQotCS8qIHByZWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7Ci0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0KLQlpZiAoanAyLT5qcDJfc3RhdGUgIT0gSlAyX1NUQVRFX05PTkUpIHsKLQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlRoZSBzaWduYXR1cmUgYm94IG11c3QgYmUgdGhlIGZpcnN0IGJveCBpbiB0aGUgZmlsZS5cbiIpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQotCS8qIGFzc3VyZSBsZW5ndGggb2YgZGF0YSBpcyBjb3JyZWN0ICg0IC0+IG1hZ2ljIG51bWJlcikgKi8KLQlpZiAocF9oZWFkZXJfc2l6ZSAhPSA0KSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciB3aXRoIEpQIHNpZ25hdHVyZSBCb3ggc2l6ZVxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCi0JLyogcmVhcnJhbmdlIGRhdGEgKi8KLQlvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX21hZ2ljX251bWJlciw0KTsKLQlpZiAobF9tYWdpY19udW1iZXIgIT0gMHgwZDBhODcwYSApIHsKLQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdpdGggSlAgU2lnbmF0dXJlIDogYmFkIG1hZ2ljIG51bWJlclxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCi0JanAyLT5qcDJfc3RhdGUgfD0gSlAyX1NUQVRFX1NJR05BVFVSRTsKLQotCXJldHVybiBPUEpfVFJVRTsKLX0KLQotLyoqCi0gKiBSZWFkcyBhIGEgRlRZUCBib3ggLSBGaWxlIHR5cGUgYm94Ci0gKgotICogQHBhcmFtCXBfaGVhZGVyX2RhdGEJdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBGVFlQIGJveC4KLSAqIEBwYXJhbQlqcDIJCQkJdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCi0gKiBAcGFyYW0JcF9oZWFkZXJfc2l6ZQl0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIEZUWVAgYm94LgotICogQHBhcmFtCXBfbWFuYWdlcgkJdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSAqCi0gKiBAcmV0dXJuIHRydWUgaWYgdGhlIEZUWVAgYm94IGlzIHZhbGlkLgotICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2Z0eXAoCW9wal9qcDJfdCAqanAyLAotCQkJCQkJCQkJT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotCQkJCQkJCQkJT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotCQkJCQkJCQkJb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0JT1BKX1VJTlQzMiBpLCBsX3JlbWFpbmluZ19ieXRlczsKLQotCS8qIHByZWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7Ci0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0KLQlpZiAoanAyLT5qcDJfc3RhdGUgIT0gSlAyX1NUQVRFX1NJR05BVFVSRSkgewotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiVGhlIGZ0eXAgYm94IG11c3QgYmUgdGhlIHNlY29uZCBib3ggaW4gdGhlIGZpbGUuXG4iKTsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0KLQkvKiBhc3N1cmUgbGVuZ3RoIG9mIGRhdGEgaXMgY29ycmVjdCAqLwotCWlmIChwX2hlYWRlcl9zaXplIDwgOCkgewotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd2l0aCBGVFlQIHNpZ25hdHVyZSBCb3ggc2l6ZVxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCi0Jb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmanAyLT5icmFuZCw0KTsJCS8qIEJSICovCi0JcF9oZWFkZXJfZGF0YSArPSA0OwotCi0Jb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmanAyLT5taW52ZXJzaW9uLDQpOwkJLyogTWluViAqLwotCXBfaGVhZGVyX2RhdGEgKz0gNDsKLQotCWxfcmVtYWluaW5nX2J5dGVzID0gcF9oZWFkZXJfc2l6ZSAtIDg7Ci0KLQkvKiB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBieXRlcyBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiA0ICovCi0JaWYgKChsX3JlbWFpbmluZ19ieXRlcyAmIDB4MykgIT0gMCkgewotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd2l0aCBGVFlQIHNpZ25hdHVyZSBCb3ggc2l6ZVxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCi0JLyogZGl2IGJ5IDQgKi8KLQlqcDItPm51bWNsID0gbF9yZW1haW5pbmdfYnl0ZXMgPj4gMjsKLQlpZiAoanAyLT5udW1jbCkgewotCQlqcDItPmNsID0gKE9QSl9VSU5UMzIgKikgb3BqX2NhbGxvYyhqcDItPm51bWNsLCBzaXplb2YoT1BKX1VJTlQzMikpOwotCQlpZiAoanAyLT5jbCA9PSAwMCkgewotCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHdpdGggRlRZUCBCb3hcbiIpOwotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBqcDItPm51bWNsOyArK2kpCi0JewotCQlvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZqcDItPmNsW2ldLDQpOwkJLyogQ0xpICovCi0JCXBfaGVhZGVyX2RhdGEgKz0gNDsKLQl9Ci0KLQlqcDItPmpwMl9zdGF0ZSB8PSBKUDJfU1RBVEVfRklMRV9UWVBFOwotCi0JcmV0dXJuIE9QSl9UUlVFOwotfQotCi1PUEpfQk9PTCBvcGpfanAyX3NraXBfanAyYygJb3BqX2pwMl90ICpqcDIsCi0JCQkJCSAgICAJb3BqX3N0cmVhbV9wcml2YXRlX3QgKnN0cmVhbSwKLQkJCQkJICAgIAlvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQotewotCS8qIHByZWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQoanAyICE9IDAwKTsKLQlhc3NlcnQoc3RyZWFtICE9IDAwKTsKLQlhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLQotCWpwMi0+ajJrX2NvZGVzdHJlYW1fb2Zmc2V0ID0gb3BqX3N0cmVhbV90ZWxsKHN0cmVhbSk7Ci0KLQlpZiAob3BqX3N0cmVhbV9za2lwKHN0cmVhbSw4LHBfbWFuYWdlcikgIT0gOCkgewotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQotCXJldHVybiBPUEpfVFJVRTsKLX0KLQotc3RhdGljIE9QSl9CT09MIG9wal9qcGlwX3NraXBfaXB0cigJb3BqX2pwMl90ICpqcDIsCi0gIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpzdHJlYW0sCi0gIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCi17Ci0gIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgYXNzZXJ0KGpwMiAhPSAwMCk7Ci0gIGFzc2VydChzdHJlYW0gIT0gMDApOwotICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLQotICBqcDItPmpwaXBfaXB0cl9vZmZzZXQgPSBvcGpfc3RyZWFtX3RlbGwoc3RyZWFtKTsKLQotICBpZiAob3BqX3N0cmVhbV9za2lwKHN0cmVhbSwyNCxwX21hbmFnZXIpICE9IDI0KSB7Ci0gICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgfQotCi0gIHJldHVybiBPUEpfVFJVRTsKLX0KLQotLyoqCi0gKiBSZWFkcyB0aGUgSnBlZzIwMDAgZmlsZSBIZWFkZXIgYm94IC0gSlAyIEhlYWRlciBib3ggKHdhcm5pbmcsIHRoaXMgaXMgYSBzdXBlciBib3gpLgotICoKLSAqIEBwYXJhbQlwX2hlYWRlcl9kYXRhCXRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSBoZWFkZXIgYm94LgotICogQHBhcmFtCWpwMgkJCQl0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KLSAqIEBwYXJhbQlwX2hlYWRlcl9zaXplCXRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSBoZWFkZXIgYm94LgotICogQHBhcmFtCXBfbWFuYWdlcgkJdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSAqCi0gKiBAcmV0dXJuIHRydWUgaWYgdGhlIEpQMiBIZWFkZXIgYm94IHdhcyBzdWNjZXNzZnVsbHkgcmVjb25pemVkLgotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfanAyaCggIG9wal9qcDJfdCAqanAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKnBfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLQlPUEpfVUlOVDMyIGxfYm94X3NpemU9MCwgbF9jdXJyZW50X2RhdGFfc2l6ZSA9IDA7Ci0Jb3BqX2pwMl9ib3hfdCBib3g7Ci0JY29uc3Qgb3BqX2pwMl9oZWFkZXJfaGFuZGxlcl90ICogbF9jdXJyZW50X2hhbmRsZXI7Ci0JT1BKX0JPT0wgbF9oYXNfaWhkciA9IDA7Ci0KLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOwotCWFzc2VydChqcDIgIT0gMDApOwotCWFzc2VydChwX21hbmFnZXIgIT0gMDApOwotCi0JLyogbWFrZSBzdXJlIHRoZSBib3ggaXMgd2VsbCBwbGFjZWQgKi8KLQlpZiAoKGpwMi0+anAyX3N0YXRlICYgSlAyX1NUQVRFX0ZJTEVfVFlQRSkgIT0gSlAyX1NUQVRFX0ZJTEVfVFlQRSApIHsKLQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlRoZSAgYm94IG11c3QgYmUgdGhlIGZpcnN0IGJveCBpbiB0aGUgZmlsZS5cbiIpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQotCWpwMi0+anAyX2ltZ19zdGF0ZSA9IEpQMl9JTUdfU1RBVEVfTk9ORTsKLQotCS8qIGl0ZXJhdGUgd2hpbGUgcmVtYWluaW5nIGRhdGEgKi8KLQl3aGlsZSAocF9oZWFkZXJfc2l6ZSA+IDApIHsKLQotCQlpZiAoISBvcGpfanAyX3JlYWRfYm94aGRyX2NoYXIoJmJveCxwX2hlYWRlcl9kYXRhLCZsX2JveF9zaXplLHBfaGVhZGVyX3NpemUsIHBfbWFuYWdlcikpIHsKLQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJTdHJlYW0gZXJyb3Igd2hpbGUgcmVhZGluZyBKUDIgSGVhZGVyIGJveFxuIik7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9Ci0KLQkJaWYgKGJveC5sZW5ndGggPiBwX2hlYWRlcl9zaXplKSB7Ci0JCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIGVycm9yIHdoaWxlIHJlYWRpbmcgSlAyIEhlYWRlciBib3g6IGJveCBsZW5ndGggaXMgaW5jb25zaXN0ZW50LlxuIik7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9Ci0KLQkJbF9jdXJyZW50X2hhbmRsZXIgPSBvcGpfanAyX2ltZ19maW5kX2hhbmRsZXIoYm94LnR5cGUpOwotCQlsX2N1cnJlbnRfZGF0YV9zaXplID0gYm94Lmxlbmd0aCAtIGxfYm94X3NpemU7Ci0JCXBfaGVhZGVyX2RhdGEgKz0gbF9ib3hfc2l6ZTsKLQotCQlpZiAobF9jdXJyZW50X2hhbmRsZXIgIT0gMDApIHsKLQkJCWlmICghIGxfY3VycmVudF9oYW5kbGVyLT5oYW5kbGVyKGpwMixwX2hlYWRlcl9kYXRhLGxfY3VycmVudF9kYXRhX3NpemUscF9tYW5hZ2VyKSkgewotCQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlqcDItPmpwMl9pbWdfc3RhdGUgfD0gSlAyX0lNR19TVEFURV9VTktOT1dOOwotCQl9Ci0KLQkJaWYgKGJveC50eXBlID09IEpQMl9JSERSKSB7Ci0JCQlsX2hhc19paGRyID0gMTsKLQkJfQotCi0JCXBfaGVhZGVyX2RhdGEgKz0gbF9jdXJyZW50X2RhdGFfc2l6ZTsKLQkJcF9oZWFkZXJfc2l6ZSAtPSBib3gubGVuZ3RoOwotCX0KLQotCWlmIChsX2hhc19paGRyID09IDApIHsKLQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSBlcnJvciB3aGlsZSByZWFkaW5nIEpQMiBIZWFkZXIgYm94OiBubyAnaWhkcicgYm94LlxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCi0JanAyLT5qcDJfc3RhdGUgfD0gSlAyX1NUQVRFX0hFQURFUjsKLQotCXJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2JveGhkcl9jaGFyKCAgIG9wal9qcDJfYm94X3QgKmJveCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9udW1iZXJfYnl0ZXNfcmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfYm94X21heF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLQlPUEpfVUlOVDMyIGxfdmFsdWU7Ci0KLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KHBfZGF0YSAhPSAwMCk7Ci0JYXNzZXJ0KGJveCAhPSAwMCk7Ci0JYXNzZXJ0KHBfbnVtYmVyX2J5dGVzX3JlYWQgIT0gMDApOwotCWFzc2VydChwX21hbmFnZXIgIT0gMDApOwotCi0JaWYgKHBfYm94X21heF9zaXplIDwgOCkgewotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ2Fubm90IGhhbmRsZSBib3ggb2YgbGVzcyB0aGFuIDggYnl0ZXNcbiIpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQotCS8qIHByb2Nlc3MgcmVhZCBkYXRhICovCi0Jb3BqX3JlYWRfYnl0ZXMocF9kYXRhLCAmbF92YWx1ZSwgNCk7Ci0JcF9kYXRhICs9IDQ7Ci0JYm94LT5sZW5ndGggPSAoT1BKX1VJTlQzMikobF92YWx1ZSk7Ci0KLQlvcGpfcmVhZF9ieXRlcyhwX2RhdGEsICZsX3ZhbHVlLCA0KTsKLQlwX2RhdGEgKz0gNDsKLQlib3gtPnR5cGUgPSAoT1BKX1VJTlQzMikobF92YWx1ZSk7Ci0KLQkqcF9udW1iZXJfYnl0ZXNfcmVhZCA9IDg7Ci0KLQkvKiBkbyB3ZSBoYXZlIGEgInNwZWNpYWwgdmVyeSBsYXJnZSBib3ggPyIgKi8KLQkvKiByZWFkIHRoZW4gdGhlIFhMQm94ICovCi0JaWYgKGJveC0+bGVuZ3RoID09IDEpIHsKLQkJT1BKX1VJTlQzMiBsX3hsX3BhcnRfc2l6ZTsKLQotCQlpZiAocF9ib3hfbWF4X3NpemUgPCAxNikgewotCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkNhbm5vdCBoYW5kbGUgWEwgYm94IG9mIGxlc3MgdGhhbiAxNiBieXRlc1xuIik7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9Ci0KLQkJb3BqX3JlYWRfYnl0ZXMocF9kYXRhLCZsX3hsX3BhcnRfc2l6ZSwgNCk7Ci0JCXBfZGF0YSArPSA0OwotCQkqcF9udW1iZXJfYnl0ZXNfcmVhZCArPSA0OwotCi0JCWlmIChsX3hsX3BhcnRfc2l6ZSAhPSAwKSB7Ci0JCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ2Fubm90IGhhbmRsZSBib3ggc2l6ZXMgaGlnaGVyIHRoYW4gMl4zMlxuIik7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9Ci0KLQkJb3BqX3JlYWRfYnl0ZXMocF9kYXRhLCAmbF92YWx1ZSwgNCk7Ci0JCSpwX251bWJlcl9ieXRlc19yZWFkICs9IDQ7Ci0JCWJveC0+bGVuZ3RoID0gKE9QSl9VSU5UMzIpKGxfdmFsdWUpOwotCi0JCWlmIChib3gtPmxlbmd0aCA9PSAwKSB7Ci0JCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ2Fubm90IGhhbmRsZSBib3ggb2YgdW5kZWZpbmVkIHNpemVzXG4iKTsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoYm94LT5sZW5ndGggPT0gMCkgewotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ2Fubm90IGhhbmRsZSBib3ggb2YgdW5kZWZpbmVkIHNpemVzXG4iKTsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0JaWYgKGJveC0+bGVuZ3RoIDwgKnBfbnVtYmVyX2J5dGVzX3JlYWQpIHsKLQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkJveCBsZW5ndGggaXMgaW5jb25zaXN0ZW50LlxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCXJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2hlYWRlcigJb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfanAyX3QgKmpwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKiogcF9pbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKLQlhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLQotCS8qIGN1c3RvbWl6YXRpb24gb2YgdGhlIHZhbGlkYXRpb24gKi8KLQlvcGpfanAyX3NldHVwX2RlY29kaW5nX3ZhbGlkYXRpb24gKGpwMik7Ci0KLQkvKiBjdXN0b21pemF0aW9uIG9mIHRoZSBlbmNvZGluZyAqLwotCW9wal9qcDJfc2V0dXBfaGVhZGVyX3JlYWRpbmcoanAyKTsKLQotCS8qIHZhbGlkYXRpb24gb2YgdGhlIHBhcmFtZXRlcnMgY29kZWMgKi8KLQlpZiAoISBvcGpfanAyX2V4ZWMoanAyLGpwMi0+bV92YWxpZGF0aW9uX2xpc3QscF9zdHJlYW0scF9tYW5hZ2VyKSkgewotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQotCS8qIHJlYWQgaGVhZGVyICovCi0JaWYgKCEgb3BqX2pwMl9leGVjIChqcDIsanAyLT5tX3Byb2NlZHVyZV9saXN0LHBfc3RyZWFtLHBfbWFuYWdlcikpIHsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0KLQlyZXR1cm4gb3BqX2oya19yZWFkX2hlYWRlcigJcF9zdHJlYW0sCi0JCQkJCQkJanAyLT5qMmssCi0JCQkJCQkJcF9pbWFnZSwKLQkJCQkJCQlwX21hbmFnZXIpOwotfQotCi12b2lkIG9wal9qcDJfc2V0dXBfZW5jb2RpbmdfdmFsaWRhdGlvbiAob3BqX2pwMl90ICpqcDIpCi17Ci0JLyogcHJlY29uZGl0aW9ucyAqLwotCWFzc2VydChqcDIgIT0gMDApOwotCi0Jb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUoanAyLT5tX3ZhbGlkYXRpb25fbGlzdCwgKG9wal9wcm9jZWR1cmUpb3BqX2pwMl9kZWZhdWx0X3ZhbGlkYXRpb24pOwotCS8qIERFVkVMT1BFUiBDT1JORVIsIGFkZCB5b3VyIGN1c3RvbSB2YWxpZGF0aW9uIHByb2NlZHVyZSAqLwotfQotCi12b2lkIG9wal9qcDJfc2V0dXBfZGVjb2RpbmdfdmFsaWRhdGlvbiAob3BqX2pwMl90ICpqcDIpCi17Ci0JLyogcHJlY29uZGl0aW9ucyAqLwotCWFzc2VydChqcDIgIT0gMDApOwotCS8qIERFVkVMT1BFUiBDT1JORVIsIGFkZCB5b3VyIGN1c3RvbSB2YWxpZGF0aW9uIHByb2NlZHVyZSAqLwotfQotCi12b2lkIG9wal9qcDJfc2V0dXBfaGVhZGVyX3dyaXRpbmcgKG9wal9qcDJfdCAqanAyKQotewotCS8qIHByZWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQoanAyICE9IDAwKTsKLQotCW9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKGpwMi0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfanAyX3dyaXRlX2pwICk7Ci0Jb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUoanAyLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qcDJfd3JpdGVfZnR5cCApOwotCW9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKGpwMi0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfanAyX3dyaXRlX2pwMmggKTsKLSAgaWYoIGpwMi0+anBpcF9vbiApCi0gICAgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUoanAyLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qcGlwX3NraXBfaXB0ciApOwotCW9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKGpwMi0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfanAyX3NraXBfanAyYyApOwotCi0JLyogREVWRUxPUEVSIENPUk5FUiwgaW5zZXJ0IHlvdXIgY3VzdG9tIHByb2NlZHVyZXMgKi8KLQotfQotCi12b2lkIG9wal9qcDJfc2V0dXBfaGVhZGVyX3JlYWRpbmcgKG9wal9qcDJfdCAqanAyKQotewotCS8qIHByZWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQoanAyICE9IDAwKTsKLQotCW9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKGpwMi0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfanAyX3JlYWRfaGVhZGVyX3Byb2NlZHVyZSApOwotCS8qIERFVkVMT1BFUiBDT1JORVIsIGFkZCB5b3VyIGN1c3RvbSBwcm9jZWR1cmVzICovCi19Ci0KLU9QSl9CT09MIG9wal9qcDJfcmVhZF90aWxlX2hlYWRlciAoIG9wal9qcDJfdCAqIHBfanAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfdGlsZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV94MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV95MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV94MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV95MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX25iX2NvbXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JPT0wgKiBwX2dvX29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0JcmV0dXJuIG9wal9qMmtfcmVhZF90aWxlX2hlYWRlcihwX2pwMi0+ajJrLAotCQkJCQkJCQlwX3RpbGVfaW5kZXgsCi0JCQkJCQkJCXBfZGF0YV9zaXplLAotCQkJCQkJCQlwX3RpbGVfeDAsIHBfdGlsZV95MCwKLQkJCQkJCQkJcF90aWxlX3gxLCBwX3RpbGVfeTEsCi0JCQkJCQkJCXBfbmJfY29tcHMsCi0JCQkJCQkJCXBfZ29fb24sCi0JCQkJCQkJCXBfc3RyZWFtLAotCQkJCQkJCQlwX21hbmFnZXIpOwotfQotCi1PUEpfQk9PTCBvcGpfanAyX3dyaXRlX3RpbGUgKAlvcGpfanAyX3QgKnBfanAyLAotCQkJCQkgCSAJICAgIE9QSl9VSU5UMzIgcF90aWxlX2luZGV4LAotCQkJCQkgCSAJICAgIE9QSl9CWVRFICogcF9kYXRhLAotCQkJCQkgCSAJICAgIE9QSl9VSU5UMzIgcF9kYXRhX3NpemUsCi0JCQkJCSAJIAkgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotCQkJCQkgCSAJICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0KLXsKLQlyZXR1cm4gb3BqX2oya193cml0ZV90aWxlIChwX2pwMi0+ajJrLHBfdGlsZV9pbmRleCxwX2RhdGEscF9kYXRhX3NpemUscF9zdHJlYW0scF9tYW5hZ2VyKTsKLX0KLQotT1BKX0JPT0wgb3BqX2pwMl9kZWNvZGVfdGlsZSAoICBvcGpfanAyX3QgKiBwX2pwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0JcmV0dXJuIG9wal9qMmtfZGVjb2RlX3RpbGUgKHBfanAyLT5qMmsscF90aWxlX2luZGV4LHBfZGF0YSxwX2RhdGFfc2l6ZSxwX3N0cmVhbSxwX21hbmFnZXIpOwotfQotCi12b2lkIG9wal9qcDJfZGVzdHJveShvcGpfanAyX3QgKmpwMikKLXsKLQlpZiAoanAyKSB7Ci0JCS8qIGRlc3Ryb3kgdGhlIEoySyBjb2RlYyAqLwotCQlvcGpfajJrX2Rlc3Ryb3koanAyLT5qMmspOwotCQlqcDItPmoyayA9IDAwOwotCi0JCWlmIChqcDItPmNvbXBzKSB7Ci0JCQlvcGpfZnJlZShqcDItPmNvbXBzKTsKLQkJCWpwMi0+Y29tcHMgPSAwMDsKLQkJfQotCi0JCWlmIChqcDItPmNsKSB7Ci0JCQlvcGpfZnJlZShqcDItPmNsKTsKLQkJCWpwMi0+Y2wgPSAwMDsKLQkJfQotCi0JCWlmIChqcDItPmNvbG9yLmljY19wcm9maWxlX2J1ZikgewotCQkJb3BqX2ZyZWUoanAyLT5jb2xvci5pY2NfcHJvZmlsZV9idWYpOwotCQkJanAyLT5jb2xvci5pY2NfcHJvZmlsZV9idWYgPSAwMDsKLQkJfQotCi0JCWlmIChqcDItPmNvbG9yLmpwMl9jZGVmKSB7Ci0JCQlpZiAoanAyLT5jb2xvci5qcDJfY2RlZi0+aW5mbykgewotCQkJCW9wal9mcmVlKGpwMi0+Y29sb3IuanAyX2NkZWYtPmluZm8pOwotCQkJCWpwMi0+Y29sb3IuanAyX2NkZWYtPmluZm8gPSBOVUxMOwotCQkJfQotCi0JCQlvcGpfZnJlZShqcDItPmNvbG9yLmpwMl9jZGVmKTsKLQkJCWpwMi0+Y29sb3IuanAyX2NkZWYgPSAwMDsKLQkJfQotCi0JCWlmIChqcDItPmNvbG9yLmpwMl9wY2xyKSB7Ci0JCQlpZiAoanAyLT5jb2xvci5qcDJfcGNsci0+Y21hcCkgewotCQkJCW9wal9mcmVlKGpwMi0+Y29sb3IuanAyX3BjbHItPmNtYXApOwotCQkJCWpwMi0+Y29sb3IuanAyX3BjbHItPmNtYXAgPSBOVUxMOwotCQkJfQotCQkJaWYgKGpwMi0+Y29sb3IuanAyX3BjbHItPmNoYW5uZWxfc2lnbikgewotCQkJCW9wal9mcmVlKGpwMi0+Y29sb3IuanAyX3BjbHItPmNoYW5uZWxfc2lnbik7Ci0JCQkJanAyLT5jb2xvci5qcDJfcGNsci0+Y2hhbm5lbF9zaWduID0gTlVMTDsKLQkJCX0KLQkJCWlmIChqcDItPmNvbG9yLmpwMl9wY2xyLT5jaGFubmVsX3NpemUpIHsKLQkJCQlvcGpfZnJlZShqcDItPmNvbG9yLmpwMl9wY2xyLT5jaGFubmVsX3NpemUpOwotCQkJCWpwMi0+Y29sb3IuanAyX3BjbHItPmNoYW5uZWxfc2l6ZSA9IE5VTEw7Ci0JCQl9Ci0JCQlpZiAoanAyLT5jb2xvci5qcDJfcGNsci0+ZW50cmllcykgewotCQkJCW9wal9mcmVlKGpwMi0+Y29sb3IuanAyX3BjbHItPmVudHJpZXMpOwotCQkJCWpwMi0+Y29sb3IuanAyX3BjbHItPmVudHJpZXMgPSBOVUxMOwotCQkJfQotCi0JCQlvcGpfZnJlZShqcDItPmNvbG9yLmpwMl9wY2xyKTsKLQkJCWpwMi0+Y29sb3IuanAyX3BjbHIgPSAwMDsKLQkJfQotCi0JCWlmIChqcDItPm1fdmFsaWRhdGlvbl9saXN0KSB7Ci0JCQlvcGpfcHJvY2VkdXJlX2xpc3RfZGVzdHJveShqcDItPm1fdmFsaWRhdGlvbl9saXN0KTsKLQkJCWpwMi0+bV92YWxpZGF0aW9uX2xpc3QgPSAwMDsKLQkJfQotCi0JCWlmIChqcDItPm1fcHJvY2VkdXJlX2xpc3QpIHsKLQkJCW9wal9wcm9jZWR1cmVfbGlzdF9kZXN0cm95KGpwMi0+bV9wcm9jZWR1cmVfbGlzdCk7Ci0JCQlqcDItPm1fcHJvY2VkdXJlX2xpc3QgPSAwMDsKLQkJfQotCi0JCW9wal9mcmVlKGpwMik7Ci0JfQotfQotCi1PUEpfQk9PTCBvcGpfanAyX3NldF9kZWNvZGVfYXJlYSgJb3BqX2pwMl90ICpwX2pwMiwKLQkJCQkJCQkJICAgIG9wal9pbWFnZV90KiBwX2ltYWdlLAotCQkJCQkJCQkgICAgT1BKX0lOVDMyIHBfc3RhcnRfeCwgT1BKX0lOVDMyIHBfc3RhcnRfeSwKLQkJCQkJCQkJICAgIE9QSl9JTlQzMiBwX2VuZF94LCBPUEpfSU5UMzIgcF9lbmRfeSwKLQkJCQkJCQkJICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotCXJldHVybiBvcGpfajJrX3NldF9kZWNvZGVfYXJlYShwX2pwMi0+ajJrLCBwX2ltYWdlLCBwX3N0YXJ0X3gsIHBfc3RhcnRfeSwgcF9lbmRfeCwgcF9lbmRfeSwgcF9tYW5hZ2VyKTsKLX0KLQotT1BKX0JPT0wgb3BqX2pwMl9nZXRfdGlsZSgJb3BqX2pwMl90ICpwX2pwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QqIHBfaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdGlsZV9pbmRleAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLQlpZiAoIXBfaW1hZ2UpCi0JCXJldHVybiBPUEpfRkFMU0U7Ci0KLQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJKUDIgYm94IHdoaWNoIGFyZSBhZnRlciB0aGUgY29kZXN0cmVhbSB3aWxsIG5vdCBiZSByZWFkIGJ5IHRoaXMgZnVuY3Rpb24uXG4iKTsKLQotCWlmICghIG9wal9qMmtfZ2V0X3RpbGUocF9qcDItPmoyaywgcF9zdHJlYW0sIHBfaW1hZ2UsIHBfbWFuYWdlciwgdGlsZV9pbmRleCkgKXsKLQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWxlZCB0byBkZWNvZGUgdGhlIGNvZGVzdHJlYW0gaW4gdGhlIEpQMiBmaWxlXG4iKTsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0KLQlpZiAoIW9wal9qcDJfY2hlY2tfY29sb3IocF9pbWFnZSwgJihwX2pwMi0+Y29sb3IpLCBwX21hbmFnZXIpKSB7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCi0JLyogU2V0IEltYWdlIENvbG9yIFNwYWNlICovCi0JaWYgKHBfanAyLT5lbnVtY3MgPT0gMTYpCi0JCXBfaW1hZ2UtPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19TUkdCOwotCWVsc2UgaWYgKHBfanAyLT5lbnVtY3MgPT0gMTcpCi0JCXBfaW1hZ2UtPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19HUkFZOwotCWVsc2UgaWYgKHBfanAyLT5lbnVtY3MgPT0gMTgpCi0JCXBfaW1hZ2UtPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19TWUNDOwotCWVsc2UKLQkJcF9pbWFnZS0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX1VOS05PV047Ci0KLQlpZihwX2pwMi0+Y29sb3IuanAyX3BjbHIpIHsKLQkJLyogUGFydCAxLCBJLjUuMy40OiBFaXRoZXIgYm90aCBvciBub25lIDogKi8KLQkJaWYoICFwX2pwMi0+Y29sb3IuanAyX3BjbHItPmNtYXApCi0JCQlvcGpfanAyX2ZyZWVfcGNscigmKHBfanAyLT5jb2xvcikpOwotCQllbHNlCi0JCQlvcGpfanAyX2FwcGx5X3BjbHIocF9pbWFnZSwgJihwX2pwMi0+Y29sb3IpKTsKLQl9Ci0JCi0JLyogQXBwbHkgdGhlIGNvbG9yIHNwYWNlIGlmIG5lZWRlZCAqLwotCWlmKHBfanAyLT5jb2xvci5qcDJfY2RlZikgewotCQlvcGpfanAyX2FwcGx5X2NkZWYocF9pbWFnZSwgJihwX2pwMi0+Y29sb3IpKTsKLQl9Ci0KLQlpZihwX2pwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfYnVmKSB7Ci0JCXBfaW1hZ2UtPmljY19wcm9maWxlX2J1ZiA9IHBfanAyLT5jb2xvci5pY2NfcHJvZmlsZV9idWY7Ci0JCXBfaW1hZ2UtPmljY19wcm9maWxlX2xlbiA9IHBfanAyLT5jb2xvci5pY2NfcHJvZmlsZV9sZW47Ci0JCXBfanAyLT5jb2xvci5pY2NfcHJvZmlsZV9idWYgPSBOVUxMOwotCX0KLQotCXJldHVybiBPUEpfVFJVRTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIEpQMiBlbmNvZGVyIGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1vcGpfanAyX3QqIG9wal9qcDJfY3JlYXRlKE9QSl9CT09MIHBfaXNfZGVjb2RlcikKLXsKLQlvcGpfanAyX3QgKmpwMiA9IChvcGpfanAyX3QqKW9wal9jYWxsb2MoMSxzaXplb2Yob3BqX2pwMl90KSk7Ci0JaWYgKGpwMikgewotCi0JCS8qIGNyZWF0ZSB0aGUgSjJLIGNvZGVjICovCi0JCWlmICghIHBfaXNfZGVjb2RlcikgewotCQkJanAyLT5qMmsgPSBvcGpfajJrX2NyZWF0ZV9jb21wcmVzcygpOwotCQl9Ci0JCWVsc2UgewotCQkJanAyLT5qMmsgPSBvcGpfajJrX2NyZWF0ZV9kZWNvbXByZXNzKCk7Ci0JCX0KLQotCQlpZiAoanAyLT5qMmsgPT0gMDApIHsKLQkJCW9wal9qcDJfZGVzdHJveShqcDIpOwotCQkJcmV0dXJuIDAwOwotCQl9Ci0KLQkJLyogQ29sb3Igc3RydWN0dXJlICovCi0JCWpwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfYnVmID0gTlVMTDsKLQkJanAyLT5jb2xvci5pY2NfcHJvZmlsZV9sZW4gPSAwOwotCQlqcDItPmNvbG9yLmpwMl9jZGVmID0gTlVMTDsKLQkJanAyLT5jb2xvci5qcDJfcGNsciA9IE5VTEw7Ci0JCWpwMi0+Y29sb3IuanAyX2hhc19jb2xyID0gMDsKLQotCQkvKiB2YWxpZGF0aW9uIGxpc3QgY3JlYXRpb24gKi8KLQkJanAyLT5tX3ZhbGlkYXRpb25fbGlzdCA9IG9wal9wcm9jZWR1cmVfbGlzdF9jcmVhdGUoKTsKLQkJaWYgKCEganAyLT5tX3ZhbGlkYXRpb25fbGlzdCkgewotCQkJb3BqX2pwMl9kZXN0cm95KGpwMik7Ci0JCQlyZXR1cm4gMDA7Ci0JCX0KLQotCQkvKiBleGVjdXRpb24gbGlzdCBjcmVhdGlvbiAqLwotCQlqcDItPm1fcHJvY2VkdXJlX2xpc3QgPSBvcGpfcHJvY2VkdXJlX2xpc3RfY3JlYXRlKCk7Ci0JCWlmICghIGpwMi0+bV9wcm9jZWR1cmVfbGlzdCkgewotCQkJb3BqX2pwMl9kZXN0cm95KGpwMik7Ci0JCQlyZXR1cm4gMDA7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4ganAyOwotfQotCi12b2lkIGpwMl9kdW1wKG9wal9qcDJfdCogcF9qcDIsIE9QSl9JTlQzMiBmbGFnLCBGSUxFKiBvdXRfc3RyZWFtKQotewotCS8qIHByZWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQocF9qcDIgIT0gMDApOwotCi0JajJrX2R1bXAocF9qcDItPmoyaywKLQkJCQkJZmxhZywKLQkJCQkJb3V0X3N0cmVhbSk7Ci19Ci0KLW9wal9jb2Rlc3RyZWFtX2luZGV4X3QqIGpwMl9nZXRfY3N0cl9pbmRleChvcGpfanAyX3QqIHBfanAyKQotewotCXJldHVybiBqMmtfZ2V0X2NzdHJfaW5kZXgocF9qcDItPmoyayk7Ci19Ci0KLW9wal9jb2Rlc3RyZWFtX2luZm9fdjJfdCoganAyX2dldF9jc3RyX2luZm8ob3BqX2pwMl90KiBwX2pwMikKLXsKLQlyZXR1cm4gajJrX2dldF9jc3RyX2luZm8ocF9qcDItPmoyayk7Ci19Ci0KLU9QSl9CT09MIG9wal9qcDJfc2V0X2RlY29kZWRfcmVzb2x1dGlvbl9mYWN0b3Iob3BqX2pwMl90ICpwX2pwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiByZXNfZmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCi17Ci0JcmV0dXJuIG9wal9qMmtfc2V0X2RlY29kZWRfcmVzb2x1dGlvbl9mYWN0b3IocF9qcDItPmoyaywgcmVzX2ZhY3RvciwgcF9tYW5hZ2VyKTsKLX0KLQotLyogSlBJUCBzcGVjaWZpYyAqLwotCi0jaWZkZWYgVVNFX0pQSVAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfanBpcF93cml0ZV9pcHRyKG9wal9qcDJfdCAqanAyLAotICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAotICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQotewotICBPUEpfT0ZGX1QgajJrX2NvZGVzdHJlYW1fZXhpdDsKLSAgT1BKX0JZVEUgbF9kYXRhX2hlYWRlciBbMjRdOwotCi0gIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgYXNzZXJ0KGpwMiAhPSAwMCk7Ci0gIGFzc2VydChjaW8gIT0gMDApOwotICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgYXNzZXJ0KG9wal9zdHJlYW1faGFzX3NlZWsoY2lvKSk7Ci0KLSAgajJrX2NvZGVzdHJlYW1fZXhpdCA9IG9wal9zdHJlYW1fdGVsbChjaW8pOwotICBvcGpfd3JpdGVfYnl0ZXMobF9kYXRhX2hlYWRlciwgMjQsIDQpOyAvKiBzaXplIG9mIGlwdHIgKi8KLSAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIgKyA0LEpQSVBfSVBUUiw0KTsJCQkJCQkJCQkgICAvKiBJUFRSICovCi0jaWYgMAotICBvcGpfd3JpdGVfYnl0ZXMobF9kYXRhX2hlYWRlciArIDQgKyA0LCAwLCA4KTsgLyogb2Zmc2V0ICovCi0gIG9wal93cml0ZV9ieXRlcyhsX2RhdGFfaGVhZGVyICsgOCArIDgsIDAsIDgpOyAvKiBsZW5ndGggKi8KLSNlbHNlCi0gIG9wal93cml0ZV9kb3VibGUobF9kYXRhX2hlYWRlciArIDQgKyA0LCAwKTsgLyogb2Zmc2V0ICovCi0gIG9wal93cml0ZV9kb3VibGUobF9kYXRhX2hlYWRlciArIDggKyA4LCAwKTsgLyogbGVuZ3RoICovCi0jZW5kaWYKLQotICBpZiAoISBvcGpfc3RyZWFtX3NlZWsoY2lvLGpwMi0+anBpcF9pcHRyX29mZnNldCxwX21hbmFnZXIpKSB7Ci0gICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWxlZCB0byBzZWVrIGluIHRoZSBzdHJlYW0uXG4iKTsKLSAgICByZXR1cm4gT1BKX0ZBTFNFOwotICB9Ci0KLSAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShjaW8sbF9kYXRhX2hlYWRlciwyNCxwX21hbmFnZXIpICE9IDI0KSB7Ci0gICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWxlZCB0byBzZWVrIGluIHRoZSBzdHJlYW0uXG4iKTsKLSAgICByZXR1cm4gT1BKX0ZBTFNFOwotICB9Ci0KLSAgaWYgKCEgb3BqX3N0cmVhbV9zZWVrKGNpbyxqMmtfY29kZXN0cmVhbV9leGl0LHBfbWFuYWdlcikpIHsKLSAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRmFpbGVkIHRvIHNlZWsgaW4gdGhlIHN0cmVhbS5cbiIpOwotICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gIH0KLQotICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLXN0YXRpYyBPUEpfQk9PTCBvcGpfanBpcF93cml0ZV9maWR4KG9wal9qcDJfdCAqanAyLAotICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAotICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQotewotICBPUEpfT0ZGX1QgajJrX2NvZGVzdHJlYW1fZXhpdDsKLSAgT1BKX0JZVEUgbF9kYXRhX2hlYWRlciBbMjRdOwotCi0gIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgYXNzZXJ0KGpwMiAhPSAwMCk7Ci0gIGFzc2VydChjaW8gIT0gMDApOwotICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgYXNzZXJ0KG9wal9zdHJlYW1faGFzX3NlZWsoY2lvKSk7Ci0KLSAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIsIDI0LCA0KTsgLyogc2l6ZSBvZiBpcHRyICovCi0gIG9wal93cml0ZV9ieXRlcyhsX2RhdGFfaGVhZGVyICsgNCxKUElQX0ZJRFgsNCk7CQkJCQkJCQkJICAgLyogSVBUUiAqLwotICBvcGpfd3JpdGVfZG91YmxlKGxfZGF0YV9oZWFkZXIgKyA0ICsgNCwgMCk7IC8qIG9mZnNldCAqLwotICBvcGpfd3JpdGVfZG91YmxlKGxfZGF0YV9oZWFkZXIgKyA4ICsgOCwgMCk7IC8qIGxlbmd0aCAqLwotCi0gIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEoY2lvLGxfZGF0YV9oZWFkZXIsMjQscF9tYW5hZ2VyKSAhPSAyNCkgewotICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gc2VlayBpbiB0aGUgc3RyZWFtLlxuIik7Ci0gICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgfQotCi0gIGoya19jb2Rlc3RyZWFtX2V4aXQgPSBvcGpfc3RyZWFtX3RlbGwoY2lvKTsKLSAgaWYgKCEgb3BqX3N0cmVhbV9zZWVrKGNpbyxqMmtfY29kZXN0cmVhbV9leGl0LHBfbWFuYWdlcikpIHsKLSAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRmFpbGVkIHRvIHNlZWsgaW4gdGhlIHN0cmVhbS5cbiIpOwotICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gIH0KLQotICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLXN0YXRpYyBPUEpfQk9PTCBvcGpfanBpcF93cml0ZV9jaWR4KG9wal9qcDJfdCAqanAyLAotICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAotICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQotewotICBPUEpfT0ZGX1QgajJrX2NvZGVzdHJlYW1fZXhpdDsKLSAgT1BKX0JZVEUgbF9kYXRhX2hlYWRlciBbMjRdOwotCi0gIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgYXNzZXJ0KGpwMiAhPSAwMCk7Ci0gIGFzc2VydChjaW8gIT0gMDApOwotICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgYXNzZXJ0KG9wal9zdHJlYW1faGFzX3NlZWsoY2lvKSk7Ci0KLSAgajJrX2NvZGVzdHJlYW1fZXhpdCA9IG9wal9zdHJlYW1fdGVsbChjaW8pOwotICBvcGpfd3JpdGVfYnl0ZXMobF9kYXRhX2hlYWRlciwgMjQsIDQpOyAvKiBzaXplIG9mIGlwdHIgKi8KLSAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIgKyA0LEpQSVBfQ0lEWCw0KTsJCQkJCQkJCQkgICAvKiBJUFRSICovCi0jaWYgMAotICBvcGpfd3JpdGVfYnl0ZXMobF9kYXRhX2hlYWRlciArIDQgKyA0LCAwLCA4KTsgLyogb2Zmc2V0ICovCi0gIG9wal93cml0ZV9ieXRlcyhsX2RhdGFfaGVhZGVyICsgOCArIDgsIDAsIDgpOyAvKiBsZW5ndGggKi8KLSNlbHNlCi0gIG9wal93cml0ZV9kb3VibGUobF9kYXRhX2hlYWRlciArIDQgKyA0LCAwKTsgLyogb2Zmc2V0ICovCi0gIG9wal93cml0ZV9kb3VibGUobF9kYXRhX2hlYWRlciArIDggKyA4LCAwKTsgLyogbGVuZ3RoICovCi0jZW5kaWYKLQotICBpZiAoISBvcGpfc3RyZWFtX3NlZWsoY2lvLGoya19jb2Rlc3RyZWFtX2V4aXQscF9tYW5hZ2VyKSkgewotICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gc2VlayBpbiB0aGUgc3RyZWFtLlxuIik7Ci0gICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgfQotCi0gIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEoY2lvLGxfZGF0YV9oZWFkZXIsMjQscF9tYW5hZ2VyKSAhPSAyNCkgewotICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gc2VlayBpbiB0aGUgc3RyZWFtLlxuIik7Ci0gICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgfQotCi0gIGoya19jb2Rlc3RyZWFtX2V4aXQgPSBvcGpfc3RyZWFtX3RlbGwoY2lvKTsKLSAgaWYgKCEgb3BqX3N0cmVhbV9zZWVrKGNpbyxqMmtfY29kZXN0cmVhbV9leGl0LHBfbWFuYWdlcikpIHsKLSAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRmFpbGVkIHRvIHNlZWsgaW4gdGhlIHN0cmVhbS5cbiIpOwotICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gIH0KLQotICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLSNpZiAwCi1zdGF0aWMgdm9pZCB3cml0ZV9wcnh5KCBpbnQgb2Zmc2V0X2pwMmMsIGludCBsZW5ndGhfanAyYywgaW50IG9mZnNldF9pZHgsIGludCBsZW5ndGhfaWR4LCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAotICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQotewotICBPUEpfQllURSBsX2RhdGFfaGVhZGVyIFs4XTsKLSAgT1BKX09GRl9UIGxlbiwgbGVucDsKLQotICBsZW5wID0gb3BqX3N0cmVhbV90ZWxsKGNpbyk7Ci0gIG9wal9zdHJlYW1fc2tpcChjaW8sIDQsIHBfbWFuYWdlcik7ICAgICAgICAgLyogTCBbYXQgdGhlIGVuZF0gKi8KLSAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIsSlBJUF9QUlhZLDQpOyAvKiBJUFRSICAgICAgICAgICAqLwotICBvcGpfc3RyZWFtX3dyaXRlX2RhdGEoY2lvLGxfZGF0YV9oZWFkZXIsNCxwX21hbmFnZXIpOwotCi0gIG9wal93cml0ZV9ieXRlcyggbF9kYXRhX2hlYWRlciwgb2Zmc2V0X2pwMmMsIDgpOyAvKiBPT0ZGICAgICAgICAgICAqLwotICBvcGpfc3RyZWFtX3dyaXRlX2RhdGEoY2lvLGxfZGF0YV9oZWFkZXIsOCxwX21hbmFnZXIpOwotICBvcGpfd3JpdGVfYnl0ZXMoIGxfZGF0YV9oZWFkZXIsIGxlbmd0aF9qcDJjLCA0KTsgLyogT0JIIHBhcnQgMSAgICAgKi8KLSAgb3BqX3dyaXRlX2J5dGVzKCBsX2RhdGFfaGVhZGVyKzQsIEpQMl9KUDJDLCA0KTsgIC8qIE9CSCBwYXJ0IDIgICAgICovCi0gIG9wal9zdHJlYW1fd3JpdGVfZGF0YShjaW8sbF9kYXRhX2hlYWRlciw4LHBfbWFuYWdlcik7Ci0KLSAgb3BqX3dyaXRlX2J5dGVzKCBsX2RhdGFfaGVhZGVyLCAxLCAxKTsvKiBOSSAgICAgICAgICAgICAqLwotICBvcGpfc3RyZWFtX3dyaXRlX2RhdGEoY2lvLGxfZGF0YV9oZWFkZXIsMSxwX21hbmFnZXIpOwotCi0gIG9wal93cml0ZV9ieXRlcyggbF9kYXRhX2hlYWRlciwgb2Zmc2V0X2lkeCwgOCk7ICAvKiBJT0ZGICAgICAgICAgICAqLwotICBvcGpfc3RyZWFtX3dyaXRlX2RhdGEoY2lvLGxfZGF0YV9oZWFkZXIsOCxwX21hbmFnZXIpOwotICBvcGpfd3JpdGVfYnl0ZXMoIGxfZGF0YV9oZWFkZXIsIGxlbmd0aF9pZHgsIDQpOyAgLyogSUJIIHBhcnQgMSAgICAgKi8KLSAgb3BqX3dyaXRlX2J5dGVzKCBsX2RhdGFfaGVhZGVyKzQsIEpQSVBfQ0lEWCwgNCk7ICAgLyogSUJIIHBhcnQgMiAgICAgKi8KLSAgb3BqX3N0cmVhbV93cml0ZV9kYXRhKGNpbyxsX2RhdGFfaGVhZGVyLDgscF9tYW5hZ2VyKTsKLQotICBsZW4gPSBvcGpfc3RyZWFtX3RlbGwoY2lvKS1sZW5wOwotICBvcGpfc3RyZWFtX3NraXAoY2lvLCBsZW5wLCBwX21hbmFnZXIpOwotICBvcGpfd3JpdGVfYnl0ZXMobF9kYXRhX2hlYWRlcixsZW4sNCk7LyogTCAgICAgICAgICAgICAgKi8KLSAgb3BqX3N0cmVhbV93cml0ZV9kYXRhKGNpbyxsX2RhdGFfaGVhZGVyLDQscF9tYW5hZ2VyKTsKLSAgb3BqX3N0cmVhbV9zZWVrKGNpbywgbGVucCtsZW4scF9tYW5hZ2VyKTsKLX0KLSNlbmRpZgotCi0KLSNpZiAwCi1zdGF0aWMgaW50IHdyaXRlX2ZpZHgoIGludCBvZmZzZXRfanAyYywgaW50IGxlbmd0aF9qcDJjLCBpbnQgb2Zmc2V0X2lkeCwgaW50IGxlbmd0aF9pZHgsIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCi0gIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCi17Ci0gIE9QSl9CWVRFIGxfZGF0YV9oZWFkZXIgWzRdOwotICBPUEpfT0ZGX1QgbGVuLCBsZW5wOwotCi0gIGxlbnAgPSBvcGpfc3RyZWFtX3RlbGwoY2lvKTsKLSAgb3BqX3N0cmVhbV9za2lwKGNpbywgNCwgcF9tYW5hZ2VyKTsKLSAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIsSlBJUF9GSURYLDQpOyAvKiBGSURYICovCi0gIG9wal9zdHJlYW1fd3JpdGVfZGF0YShjaW8sbF9kYXRhX2hlYWRlciw0LHBfbWFuYWdlcik7Ci0KLSAgd3JpdGVfcHJ4eSggb2Zmc2V0X2pwMmMsIGxlbmd0aF9qcDJjLCBvZmZzZXRfaWR4LCBsZW5ndGhfaWR4LCBjaW8scF9tYW5hZ2VyKTsKLQotICBsZW4gPSBvcGpfc3RyZWFtX3RlbGwoY2lvKS1sZW5wOwotICBvcGpfc3RyZWFtX3NraXAoY2lvLCBsZW5wLCBwX21hbmFnZXIpOwotICBvcGpfd3JpdGVfYnl0ZXMobF9kYXRhX2hlYWRlcixsZW4sNCk7LyogTCAgICAgICAgICAgICAgKi8KLSAgb3BqX3N0cmVhbV93cml0ZV9kYXRhKGNpbyxsX2RhdGFfaGVhZGVyLDQscF9tYW5hZ2VyKTsKLSAgb3BqX3N0cmVhbV9zZWVrKGNpbywgbGVucCtsZW4scF9tYW5hZ2VyKTsKLQotICByZXR1cm4gbGVuOwotfQotI2VuZGlmCi0jZW5kaWYgLyogVVNFX0pQSVAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9qcDIuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9qcDIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU0MWZiNi4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvanAyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OTYgKzAsMCBAQAotLyoKLSAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzIAotICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIAotICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cwotICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBVbml2ZXJzaXRlIGNhdGhvbGlxdWUgZGUgTG91dmFpbiAoVUNMKSwgQmVsZ2l1bQotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFByb2Zlc3NvciBCZW5vaXQgTWFjcQotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIFlhbm5pY2sgVmVyc2NodWVyZW4KLSAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExLTIwMTIsIENlbnRyZSBOYXRpb25hbCBkJ0V0dWRlcyBTcGF0aWFsZXMgKENORVMpLCBGUiAKLSAqIENvcHlyaWdodCAoYykgMjAxMiwgQ1MgU3lzdGVtZXMgZCdJbmZvcm1hdGlvbiwgRnJhbmNlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKLSAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0jaWZuZGVmIF9fSlAyX0gKLSNkZWZpbmUgX19KUDJfSAotLyoqCi1AZmlsZSBqcDIuaAotQGJyaWVmIFRoZSBKUEVHLTIwMDAgZmlsZSBmb3JtYXQgUmVhZGVyL1dyaXRlciAoSlAyKQotCi0qLwotCi0vKiogQGRlZmdyb3VwIEpQMiBKUDIgLSBKUEVHLTIwMDAgZmlsZSBmb3JtYXQgcmVhZGVyL3dyaXRlciAqLwotLypAeyovCi0KLS8qI2RlZmluZSBKUElQX0pQSVAgMHg2YTcwNjk3MCovCi0KLSNkZWZpbmUgICAgIEpQMl9KUCAgIDB4NmE1MDIwMjAgICAgLyoqPCBKUEVHIDIwMDAgc2lnbmF0dXJlIGJveCAqLwotI2RlZmluZSAgICAgSlAyX0ZUWVAgMHg2Njc0Nzk3MCAgICAvKio8IEZpbGUgdHlwZSBib3ggKi8KLSNkZWZpbmUgICAgIEpQMl9KUDJIIDB4NmE3MDMyNjggICAgLyoqPCBKUDIgaGVhZGVyIGJveCAoc3VwZXItYm94KSAqLwotI2RlZmluZSAgICAgSlAyX0lIRFIgMHg2OTY4NjQ3MiAgICAvKio8IEltYWdlIGhlYWRlciBib3ggKi8KLSNkZWZpbmUgICAgIEpQMl9DT0xSIDB4NjM2ZjZjNzIgICAgLyoqPCBDb2xvdXIgc3BlY2lmaWNhdGlvbiBib3ggKi8KLSNkZWZpbmUgICAgIEpQMl9KUDJDIDB4NmE3MDMyNjMgICAgLyoqPCBDb250aWd1b3VzIGNvZGVzdHJlYW0gYm94ICovCi0jZGVmaW5lICAgICBKUDJfVVJMICAweDc1NzI2YzIwICAgIC8qKjwgRGF0YSBlbnRyeSBVUkwgYm94ICovCi0jZGVmaW5lICAgICBKUDJfUENMUiAweDcwNjM2YzcyICAgIC8qKjwgUGFsZXR0ZSBib3ggKi8KLSNkZWZpbmUgICAgIEpQMl9DTUFQIDB4NjM2ZDYxNzAgICAgLyoqPCBDb21wb25lbnQgTWFwcGluZyBib3ggKi8KLSNkZWZpbmUgICAgIEpQMl9DREVGIDB4NjM2NDY1NjYgICAgLyoqPCBDaGFubmVsIERlZmluaXRpb24gYm94ICovCi0jZGVmaW5lICAgICBKUDJfRFRCTCAweDY0NzQ2MjZjICAgIC8qKjwgRGF0YSBSZWZlcmVuY2UgYm94ICovCi0jZGVmaW5lICAgICBKUDJfQlBDQyAweDYyNzA2MzYzICAgIC8qKjwgQml0cyBwZXIgY29tcG9uZW50IGJveCAqLwotI2RlZmluZSAgICAgSlAyX0pQMiAgMHg2YTcwMzIyMCAgICAvKio8IEZpbGUgdHlwZSBmaWVsZHMgKi8KLQotLyogRm9yIHRoZSBmdXR1cmUgKi8KLS8qICNkZWZpbmUgSlAyX1JFUyAweDcyNjU3MzIwICovICAvKio8IFJlc29sdXRpb24gYm94IChzdXBlci1ib3gpICovCi0vKiAjZGVmaW5lIEpQMl9KUDJJIDB4NmE3MDMyNjkgKi8gIC8qKjwgSW50ZWxsZWN0dWFsIHByb3BlcnR5IGJveCAqLwotLyogI2RlZmluZSBKUDJfWE1MICAweDc4NmQ2YzIwICovICAvKio8IFhNTCBib3ggKi8KLS8qICNkZWZpbmUgSlAyX1VVSUQgMHg3NTc1Njk5NCAqLyAgLyoqPCBVVUlEIGJveCAqLwotLyogI2RlZmluZSBKUDJfVUlORiAweDc1Njk2ZTY2ICovICAvKio8IFVVSUQgaW5mbyBib3ggKHN1cGVyLWJveCkgKi8KLS8qICNkZWZpbmUgSlAyX1VMU1QgMHg3NTZjNzM3NCAqLyAgLyoqPCBVVUlEIGxpc3QgYm94ICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXR5cGVkZWYgZW51bQotewotICBKUDJfU1RBVEVfTk9ORSAgICAgICAgICAgID0gMHgwLAotICBKUDJfU1RBVEVfU0lHTkFUVVJFICAgICAgID0gMHgxLAotICBKUDJfU1RBVEVfRklMRV9UWVBFICAgICAgID0gMHgyLAotICBKUDJfU1RBVEVfSEVBREVSICAgICAgICAgID0gMHg0LAotICBKUDJfU1RBVEVfQ09ERVNUUkVBTSAgICAgID0gMHg4LAotICBKUDJfU1RBVEVfRU5EX0NPREVTVFJFQU0gID0gMHgxMCwKLSAgSlAyX1NUQVRFX1VOS05PV04gICAgICAgICA9IDB4N2ZmZmZmZmYgLyogSVNPIEMgcmVzdHJpY3RzIGVudW1lcmF0b3IgdmFsdWVzIHRvIHJhbmdlIG9mICdpbnQnICovCi19Ci1KUDJfU1RBVEU7Ci0KLXR5cGVkZWYgZW51bQotewotICBKUDJfSU1HX1NUQVRFX05PTkUgICAgICAgID0gMHgwLAotICBKUDJfSU1HX1NUQVRFX1VOS05PV04gICAgID0gMHg3ZmZmZmZmZgotfQotSlAyX0lNR19TVEFURTsKLQotLyoqIAotQ2hhbm5lbCBkZXNjcmlwdGlvbjogY2hhbm5lbCBpbmRleCwgdHlwZSwgYXNzb2NhdGlvbgotKi8KLXR5cGVkZWYgc3RydWN0IG9wal9qcDJfY2RlZl9pbmZvCi17Ci0gICAgT1BKX1VJTlQxNiBjbiwgdHlwLCBhc29jOwotfSBvcGpfanAyX2NkZWZfaW5mb190OwotCi0vKiogCi1DaGFubmVsIGRlc2NyaXB0aW9ucyBhbmQgbnVtYmVyIG9mIGRlc2NyaXB0aW9ucwotKi8KLXR5cGVkZWYgc3RydWN0IG9wal9qcDJfY2RlZgotewotICAgIG9wal9qcDJfY2RlZl9pbmZvX3QgKmluZm87Ci0gICAgT1BKX1VJTlQxNiBuOwotfSBvcGpfanAyX2NkZWZfdDsKLQotLyoqIAotQ29tcG9uZW50IG1hcHBpbmdzOiBjaGFubmVsIGluZGV4LCBtYXBwaW5nIHR5cGUsIHBhbGV0dGUgaW5kZXgKLSovCi10eXBlZGVmIHN0cnVjdCBvcGpfanAyX2NtYXBfY29tcAotewotICAgIE9QSl9VSU5UMTYgY21wOwotICAgIE9QSl9CWVRFIG10eXAsIHBjb2w7Ci19IG9wal9qcDJfY21hcF9jb21wX3Q7Ci0KLS8qKiAKLVBhbGV0dGUgZGF0YTogdGFibGUgZW50cmllcywgcGFsZXR0ZSBjb2x1bW5zCi0qLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX2pwMl9wY2xyCi17Ci0gICAgT1BKX1VJTlQzMiAqZW50cmllczsKLSAgICBPUEpfQllURSAqY2hhbm5lbF9zaWduOwotICAgIE9QSl9CWVRFICpjaGFubmVsX3NpemU7Ci0gICAgb3BqX2pwMl9jbWFwX2NvbXBfdCAqY21hcDsKLSAgICBPUEpfVUlOVDE2IG5yX2VudHJpZXM7Ci0gICAgT1BKX0JZVEUgbnJfY2hhbm5lbHM7Ci19IG9wal9qcDJfcGNscl90OwotCi0vKiogCi1Db2xsZWN0b3IgZm9yIElDQyBwcm9maWxlLCBwYWxldHRlLCBjb21wb25lbnQgbWFwcGluZywgY2hhbm5lbCBkZXNjcmlwdGlvbiAKLSovCi10eXBlZGVmIHN0cnVjdCBvcGpfanAyX2NvbG9yCi17Ci0gICAgT1BKX0JZVEUgKmljY19wcm9maWxlX2J1ZjsKLSAgICBPUEpfVUlOVDMyIGljY19wcm9maWxlX2xlbjsKLQotICAgIG9wal9qcDJfY2RlZl90ICpqcDJfY2RlZjsKLSAgICBvcGpfanAyX3BjbHJfdCAqanAyX3BjbHI7Ci0gICAgT1BKX0JZVEUganAyX2hhc19jb2xyOwotfSBvcGpfanAyX2NvbG9yX3Q7Ci0KLS8qKiAKLUpQMiBjb21wb25lbnQKLSovCi10eXBlZGVmIHN0cnVjdCBvcGpfanAyX2NvbXBzIHsKLSAgT1BKX1VJTlQzMiBkZXB0aDsgICAgICAKLSAgT1BKX1VJTlQzMiBzZ25kOyAgICAgICAKLSAgT1BKX1VJTlQzMiBicGNjOwotfSBvcGpfanAyX2NvbXBzX3Q7Ci0KLS8qKgotSlBFRy0yMDAwIGZpbGUgZm9ybWF0IHJlYWRlci93cml0ZXIKLSovCi10eXBlZGVmIHN0cnVjdCBvcGpfanAyCi17Ci0gIC8qKiBoYW5kbGUgdG8gdGhlIEoySyBjb2RlYyAgKi8KLSAgb3BqX2oya190ICpqMms7Ci0gIC8qKiBsaXN0IG9mIHZhbGlkYXRpb24gcHJvY2VkdXJlcyAqLwotICBzdHJ1Y3Qgb3BqX3Byb2NlZHVyZV9saXN0ICogbV92YWxpZGF0aW9uX2xpc3Q7Ci0gIC8qKiBsaXN0IG9mIGV4ZWN1dGlvbiBwcm9jZWR1cmVzICovCi0gIHN0cnVjdCBvcGpfcHJvY2VkdXJlX2xpc3QgKiBtX3Byb2NlZHVyZV9saXN0OwotCi0gIC8qIHdpZHRoIG9mIGltYWdlICovCi0gIE9QSl9VSU5UMzIgdzsKLSAgLyogaGVpZ2h0IG9mIGltYWdlICovCi0gIE9QSl9VSU5UMzIgaDsKLSAgLyogbnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gdGhlIGltYWdlICovCi0gIE9QSl9VSU5UMzIgbnVtY29tcHM7Ci0gIE9QSl9VSU5UMzIgYnBjOwotICBPUEpfVUlOVDMyIEM7Ci0gIE9QSl9VSU5UMzIgVW5rQzsKLSAgT1BKX1VJTlQzMiBJUFI7Ci0gIE9QSl9VSU5UMzIgbWV0aDsKLSAgT1BKX1VJTlQzMiBhcHByb3g7Ci0gIE9QSl9VSU5UMzIgZW51bWNzOwotICBPUEpfVUlOVDMyIHByZWNlZGVuY2U7Ci0gIE9QSl9VSU5UMzIgYnJhbmQ7Ci0gIE9QSl9VSU5UMzIgbWludmVyc2lvbjsKLSAgT1BKX1VJTlQzMiBudW1jbDsKLSAgT1BKX1VJTlQzMiAqY2w7Ci0gIG9wal9qcDJfY29tcHNfdCAqY29tcHM7Ci0gIC8qIEZJWE1FOiBUaGUgZm9sbG93aW5nIHR3byB2YXJpYWJsZXMgYXJlIHVzZWQgdG8gc2F2ZSBvZmZzZXQKLSAgICBhcyB3ZSB3cml0ZSBvdXQgYSBKUDIgZmlsZSB0byBkaXNrLiBUaGlzIG1lY2FuaXNtIGlzIG5vdCBmbGV4aWJsZQotICAgIGFzIGNvZGVjIHdyaXRlcnMgd2lsbCBuZWVkIHRvIGV4dGFuZCB0aG9zZSBmaWVsZHMgYXMgbmV3IHBhcnQKLSAgICBvZiB0aGUgc3RhbmRhcmQgYXJlIGltcGxlbWVudGVkLgotICAqLwotICAgIE9QSl9PRkZfVCBqMmtfY29kZXN0cmVhbV9vZmZzZXQ7Ci0gICAgT1BKX09GRl9UIGpwaXBfaXB0cl9vZmZzZXQ7Ci0JT1BKX0JPT0wganBpcF9vbjsKLSAgT1BKX1VJTlQzMiBqcDJfc3RhdGU7Ci0gIE9QSl9VSU5UMzIganAyX2ltZ19zdGF0ZTsKLQotICBvcGpfanAyX2NvbG9yX3QgY29sb3I7Ci0gICAgCi0gICAgT1BKX0JPT0wgaWdub3JlX3BjbHJfY21hcF9jZGVmOwotfQotb3BqX2pwMl90OwotCi0vKioKLUpQMiBCb3gKLSovCi10eXBlZGVmIHN0cnVjdCBvcGpfanAyX2JveCB7Ci0gICAgT1BKX1VJTlQzMiBsZW5ndGg7Ci0gICAgT1BKX1VJTlQzMiB0eXBlOwotICAgIE9QSl9JTlQzMiBpbml0X3BvczsKLX0gb3BqX2pwMl9ib3hfdDsKLQotdHlwZWRlZiBzdHJ1Y3Qgb3BqX2pwMl9oZWFkZXJfaGFuZGxlcgotewotICAvKiBtYXJrZXIgdmFsdWUgKi8KLSAgT1BKX1VJTlQzMiBpZDsKLSAgLyogYWN0aW9uIGxpbmtlZCB0byB0aGUgbWFya2VyICovCi0gIE9QSl9CT09MICgqaGFuZGxlcikgKCAgICAgb3BqX2pwMl90ICpqcDIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpwX2hlYWRlcl9kYXRhLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7Ci19Ci1vcGpfanAyX2hlYWRlcl9oYW5kbGVyX3Q7Ci0KLQotdHlwZWRlZiBzdHJ1Y3Qgb3BqX2pwMl9pbWdfaGVhZGVyX3dyaXRlcl9oYW5kbGVyIAotewotICAvKiBhY3Rpb24gdG8gcGVyZm9ybSAqLwotICBPUEpfQllURSogICAoKmhhbmRsZXIpIChvcGpfanAyX3QgKmpwMiwgT1BKX1VJTlQzMiAqIHBfZGF0YV9zaXplKTsKLSAgLyogcmVzdWx0IG9mIHRoZSBhY3Rpb24gOiBkYXRhICovCi0gIE9QSl9CWVRFKiAgIG1fZGF0YTsKLSAgLyogc2l6ZSBvZiBkYXRhICovCi0gIE9QSl9VSU5UMzIgIG1fc2l6ZTsKLX0gCi1vcGpfanAyX2ltZ19oZWFkZXJfd3JpdGVyX2hhbmRsZXJfdDsKLQotLyoqIEBuYW1lIEV4cG9ydGVkIGZ1bmN0aW9ucyAqLwotLypAeyovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKioKLSAqIFdyaXRlcyB0aGUgSnBlZzIwMDAgZmlsZSBIZWFkZXIgYm94IC0gSlAyIEhlYWRlciBib3ggKHdhcm5pbmcsIHRoaXMgaXMgYSBzdXBlciBib3gpLgotICoKLSAqIEBwYXJhbSAganAyICAgICAgdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCi0gKiBAcGFyYW0gIHN0cmVhbSAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KLSAqIEBwYXJhbSAgcF9tYW5hZ2VyICB1c2VyIGV2ZW50IG1hbmFnZXIuCi0gKgotICogQHJldHVybiB0cnVlIGlmIHdyaXRpbmcgd2FzIHN1Y2Nlc3NmdWwuCi0qLwotT1BKX0JPT0wgb3BqX2pwMl93cml0ZV9qcDJoKG9wal9qcDJfdCAqanAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLS8qKgotU2V0dXAgdGhlIGRlY29kZXIgZGVjb2RpbmcgcGFyYW1ldGVycyB1c2luZyB1c2VyIHBhcmFtZXRlcnMuCi1EZWNvZGluZyBwYXJhbWV0ZXJzIGFyZSByZXR1cm5lZCBpbiBqcDItPmoyay0+Y3AuCi1AcGFyYW0ganAyIEpQMiBkZWNvbXByZXNzb3IgaGFuZGxlCi1AcGFyYW0gcGFyYW1ldGVycyBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMKLSovCi12b2lkIG9wal9qcDJfc2V0dXBfZGVjb2RlcihvcGpfanAyX3QgKmpwMiwgb3BqX2RwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMpOwotCi0vKioKLSAqIERlY29kZSBhbiBpbWFnZSBmcm9tIGEgSlBFRy0yMDAwIGZpbGUgc3RyZWFtCi0gKiBAcGFyYW0ganAyIEpQMiBkZWNvbXByZXNzb3IgaGFuZGxlCi0gKiBAcGFyYW0gcF9zdHJlYW0gIEZJWE1FIERPQwotICogQHBhcmFtIHBfaW1hZ2UgICBGSVhNRSBET0MKLSAqIEBwYXJhbSBwX21hbmFnZXIgRklYTUUgRE9DCi0gKgotICogQHJldHVybiBSZXR1cm5zIGEgZGVjb2RlZCBpbWFnZSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIE5VTEwgb3RoZXJ3aXNlCi0qLwotT1BKX0JPT0wgb3BqX2pwMl9kZWNvZGUob3BqX2pwMl90ICpqcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICBvcGpfaW1hZ2VfdCogcF9pbWFnZSwKLSAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7Ci0KLS8qKgotICogU2V0dXAgdGhlIGVuY29kZXIgcGFyYW1ldGVycyB1c2luZyB0aGUgY3VycmVudCBpbWFnZSBhbmQgdXNpbmcgdXNlciBwYXJhbWV0ZXJzLiAKLSAqIENvZGluZyBwYXJhbWV0ZXJzIGFyZSByZXR1cm5lZCBpbiBqcDItPmoyay0+Y3AuIAotICoKLSAqIEBwYXJhbSBqcDIgSlAyIGNvbXByZXNzb3IgaGFuZGxlCi0gKiBAcGFyYW0gcGFyYW1ldGVycyBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzCi0gKiBAcGFyYW0gaW1hZ2UgaW5wdXQgZmlsbGVkIGltYWdlCi0gKiBAcGFyYW0gcF9tYW5hZ2VyICBGSVhNRSBET0MKLSAqIEByZXR1cm4gT1BKX1RSVUUgaWYgc3VjY2Vzc2Z1bCwgT1BKX0ZBTFNFIG90aGVyd2lzZQotKi8KLU9QSl9CT09MIG9wal9qcDJfc2V0dXBfZW5jb2RlciggIG9wal9qcDJfdCAqanAyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY3BhcmFtZXRlcnNfdCAqcGFyYW1ldGVycywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKmltYWdlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwotCi0vKioKLUVuY29kZSBhbiBpbWFnZSBpbnRvIGEgSlBFRy0yMDAwIGZpbGUgc3RyZWFtCi1AcGFyYW0ganAyICAgICAgSlAyIGNvbXByZXNzb3IgaGFuZGxlCi1AcGFyYW0gc3RyZWFtICAgIE91dHB1dCBidWZmZXIgc3RyZWFtCi1AcGFyYW0gcF9tYW5hZ2VyICBldmVudCBtYW5hZ2VyCi1AcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIGZhbHNlIG90aGVyd2lzZQotKi8KLU9QSl9CT09MIG9wal9qcDJfZW5jb2RlKCAgb3BqX2pwMl90ICpqcDIsIAotICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqc3RyZWFtLCAKLSAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKLQotCi0vKioKLSAqIFN0YXJ0cyBhIGNvbXByZXNzaW9uIHNjaGVtZSwgaS5lLiB2YWxpZGF0ZXMgdGhlIGNvZGVjIHBhcmFtZXRlcnMsIHdyaXRlcyB0aGUgaGVhZGVyLgotICoKLSAqIEBwYXJhbSAganAyICAgIHRoZSBqcGVnMjAwMCBmaWxlIGNvZGVjLgotICogQHBhcmFtICBzdHJlYW0gICAgdGhlIHN0cmVhbSBvYmplY3QuCi0gKiBAcGFyYW0gIHBfaW1hZ2UgICBGSVhNRSBET0MKLSAqIEBwYXJhbSBwX21hbmFnZXIgRklYTUUgRE9DCi0gKgotICogQHJldHVybiB0cnVlIGlmIHRoZSBjb2RlYyBpcyB2YWxpZC4KLSAqLwotT1BKX0JPT0wgb3BqX2pwMl9zdGFydF9jb21wcmVzcyhvcGpfanAyX3QgKmpwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKiBwX2ltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwotCi0KLS8qKgotICogRW5kcyB0aGUgY29tcHJlc3Npb24gcHJvY2VkdXJlcyBhbmQgcG9zc2liaWxpeSBhZGQgZGF0YSB0byBiZSByZWFkIGFmdGVyIHRoZQotICogY29kZXN0cmVhbS4KLSAqLwotT1BKX0JPT0wgb3BqX2pwMl9lbmRfY29tcHJlc3MoICBvcGpfanAyX3QgKmpwMiwKLSAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCi0gICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKioKLSAqIEVuZHMgdGhlIGRlY29tcHJlc3Npb24gcHJvY2VkdXJlcyBhbmQgcG9zc2liaWxpeSBhZGQgZGF0YSB0byBiZSByZWFkIGFmdGVyIHRoZQotICogY29kZXN0cmVhbS4KLSAqLwotT1BKX0JPT0wgb3BqX2pwMl9lbmRfZGVjb21wcmVzcyhvcGpfanAyX3QgKmpwMiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7Ci0KLS8qKgotICogUmVhZHMgYSBqcGVnMjAwMCBmaWxlIGhlYWRlciBzdHJ1Y3R1cmUuCi0gKgotICogQHBhcmFtIHBfc3RyZWFtIHRoZSBzdHJlYW0gdG8gcmVhZCBkYXRhIGZyb20uCi0gKiBAcGFyYW0ganAyIHRoZSBqcGVnMjAwMCBmaWxlIGhlYWRlciBzdHJ1Y3R1cmUuCi0gKiBAcGFyYW0gcF9pbWFnZSAgIEZJWE1FIERPQwotICogQHBhcmFtIHBfbWFuYWdlciB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgotICoKLSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYm94IGlzIHZhbGlkLgotICovCi1PUEpfQk9PTCBvcGpfanAyX3JlYWRfaGVhZGVyKCAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfanAyX3QgKmpwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKiogcF9pbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLS8qKgotICogUmVhZHMgYSB0aWxlIGhlYWRlci4KLSAqIEBwYXJhbSAgcF9qcDIgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCi0gKiBAcGFyYW0gIHBfdGlsZV9pbmRleCAgRklYTUUgRE9DCi0gKiBAcGFyYW0gIHBfZGF0YV9zaXplICAgRklYTUUgRE9DCi0gKiBAcGFyYW0gIHBfdGlsZV94MCAgICAgRklYTUUgRE9DCi0gKiBAcGFyYW0gIHBfdGlsZV95MCAgICAgRklYTUUgRE9DCi0gKiBAcGFyYW0gIHBfdGlsZV94MSAgICAgRklYTUUgRE9DCi0gKiBAcGFyYW0gIHBfdGlsZV95MSAgICAgRklYTUUgRE9DCi0gKiBAcGFyYW0gIHBfbmJfY29tcHMgICAgRklYTUUgRE9DCi0gKiBAcGFyYW0gIHBfZ29fb24gICAgICAgRklYTUUgRE9DCi0gKiBAcGFyYW0gIHBfc3RyZWFtICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgotICogQHBhcmFtICBwX21hbmFnZXIgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0gKi8KLU9QSl9CT09MIG9wal9qcDJfcmVhZF90aWxlX2hlYWRlciAoIG9wal9qcDJfdCAqIHBfanAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfdGlsZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV94MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV95MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV94MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV95MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX25iX2NvbXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JPT0wgKiBwX2dvX29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLS8qKgotICogV3JpdGVzIGEgdGlsZS4KLSAqCi0gKiBAcGFyYW0gIHBfanAyICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KLSAqIEBwYXJhbSBwX3RpbGVfaW5kZXggIEZJWE1FIERPQwotICogQHBhcmFtIHBfZGF0YSAgICAgICAgRklYTUUgRE9DCi0gKiBAcGFyYW0gcF9kYXRhX3NpemUgICBGSVhNRSBET0MKLSAqIEBwYXJhbSAgcF9zdHJlYW0gICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCi0gKiBAcGFyYW0gIHBfbWFuYWdlciAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KLSAqLwotT1BKX0JPT0wgb3BqX2pwMl93cml0ZV90aWxlICggIG9wal9qcDJfdCAqcF9qcDIsCi0gICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2RhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKLQotLyoqCi0gKiBEZWNvZGUgdGlsZSBkYXRhLgotICogQHBhcmFtICBwX2pwMiAgICB0aGUganBlZzIwMDAgY29kZWMuCi0gKiBAcGFyYW0gIHBfdGlsZV9pbmRleCBGSVhNRSBET0MKLSAqIEBwYXJhbSAgcF9kYXRhICAgICAgIEZJWE1FIERPQwotICogQHBhcmFtICBwX2RhdGFfc2l6ZSAgRklYTUUgRE9DCi0gKiBAcGFyYW0gIHBfc3RyZWFtICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgotICogQHBhcmFtICBwX21hbmFnZXIgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCi0gKgotICogQHJldHVybiBGSVhNRSBET0MKLSAqLwotT1BKX0JPT0wgb3BqX2pwMl9kZWNvZGVfdGlsZSAoICBvcGpfanAyX3QgKiBwX2pwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotCi0vKioKLSAqIENyZWF0ZXMgYSBqcGVnMjAwMCBmaWxlIGRlY29tcHJlc3Nvci4KLSAqCi0gKiBAcmV0dXJuICBhbiBlbXB0eSBqcGVnMjAwMCBmaWxlIGNvZGVjLgotICovCi1vcGpfanAyX3QqIG9wal9qcDJfY3JlYXRlIChPUEpfQk9PTCBwX2lzX2RlY29kZXIpOwotCi0vKioKLURlc3Ryb3kgYSBKUDIgZGVjb21wcmVzc29yIGhhbmRsZQotQHBhcmFtIGpwMiBKUDIgZGVjb21wcmVzc29yIGhhbmRsZSB0byBkZXN0cm95Ci0qLwotdm9pZCBvcGpfanAyX2Rlc3Ryb3kob3BqX2pwMl90ICpqcDIpOwotCi0KLS8qKgotICogU2V0cyB0aGUgZ2l2ZW4gYXJlYSB0byBiZSBkZWNvZGVkLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYWZ0ZXIgb3BqX3JlYWRfaGVhZGVyIGFuZCBiZWZvcmUgYW55IHRpbGUgaGVhZGVyIHJlYWRpbmcuCi0gKgotICogQHBhcmFtICBwX2pwMiAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KLSAqIEBwYXJhbSAgcF9pbWFnZSAgICAgRklYTUUgRE9DCi0gKiBAcGFyYW0gIHBfc3RhcnRfeCAgIHRoZSBsZWZ0IHBvc2l0aW9uIG9mIHRoZSByZWN0YW5nbGUgdG8gZGVjb2RlIChpbiBpbWFnZSBjb29yZGluYXRlcykuCi0gKiBAcGFyYW0gIHBfc3RhcnRfeSAgICB0aGUgdXAgcG9zaXRpb24gb2YgdGhlIHJlY3RhbmdsZSB0byBkZWNvZGUgKGluIGltYWdlIGNvb3JkaW5hdGVzKS4KLSAqIEBwYXJhbSAgcF9lbmRfeCAgICAgIHRoZSByaWdodCBwb3NpdGlvbiBvZiB0aGUgcmVjdGFuZ2xlIHRvIGRlY29kZSAoaW4gaW1hZ2UgY29vcmRpbmF0ZXMpLgotICogQHBhcmFtICBwX2VuZF95ICAgICAgdGhlIGJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgcmVjdGFuZ2xlIHRvIGRlY29kZSAoaW4gaW1hZ2UgY29vcmRpbmF0ZXMpLgotICogQHBhcmFtICBwX21hbmFnZXIgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlcgotICoKLSAqIEByZXR1cm4gIHRydWUgICAgICBpZiB0aGUgYXJlYSBjb3VsZCBiZSBzZXQuCi0gKi8KLU9QSl9CT09MIG9wal9qcDJfc2V0X2RlY29kZV9hcmVhKCAgb3BqX2pwMl90ICpwX2pwMiwKLSAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QqIHBfaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX3N0YXJ0X3gsIE9QSl9JTlQzMiBwX3N0YXJ0X3ksCi0gICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX2VuZF94LCBPUEpfSU5UMzIgcF9lbmRfeSwKLSAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0KLSAvKioKLSAqIAotICovCi1PUEpfQk9PTCBvcGpfanAyX2dldF90aWxlKCAgb3BqX2pwMl90ICpwX2pwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QqIHBfaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdGlsZV9pbmRleCApOwotCi0KLS8qKgotICogCi0gKi8KLU9QSl9CT09MIG9wal9qcDJfc2V0X2RlY29kZWRfcmVzb2x1dGlvbl9mYWN0b3Iob3BqX2pwMl90ICpwX2pwMiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcmVzX2ZhY3RvciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7Ci0KLQotLyogVE9ETyBNU0Q6IGNsZWFuIHRoZXNlIDMgZnVuY3Rpb25zICovCi0vKioKLSAqIER1bXAgc29tZSBlbGVtZW50cyBmcm9tIHRoZSBKUDIgZGVjb21wcmVzc2lvbiBzdHJ1Y3R1cmUgLgotICoKLSAqQHBhcmFtIHBfanAyICAgICAgICB0aGUganAyIGNvZGVjLgotICpAcGFyYW0gZmxhZyAgICAgICAgZmxhZyB0byBkZXNjcmliZSB3aGF0IGVsbWVudHMgYXJlIGR1bXAuCi0gKkBwYXJhbSBvdXRfc3RyZWFtICAgICAgb3V0cHV0IHN0cmVhbSB3aGVyZSBkdW1wIHRoZSBlbGVtZW50cy4KLSAqCi0qLwotdm9pZCBqcDJfZHVtcCAob3BqX2pwMl90KiBwX2pwMiwgT1BKX0lOVDMyIGZsYWcsIEZJTEUqIG91dF9zdHJlYW0pOwotCi0vKioKLSAqIEdldCB0aGUgY29kZXN0cmVhbSBpbmZvIGZyb20gYSBKUEVHMjAwMCBjb2RlYy4KLSAqCi0gKkBwYXJhbSAgcF9qcDIgICAgICAgIGpwMiBjb2RlYy4KLSAqCi0gKkByZXR1cm4gIHRoZSBjb2Rlc3RyZWFtIGluZm9ybWF0aW9uIGV4dHJhY3QgZnJvbSB0aGUganBnMjAwMCBjb2RlYwotICovCi1vcGpfY29kZXN0cmVhbV9pbmZvX3YyX3QqIGpwMl9nZXRfY3N0cl9pbmZvKG9wal9qcDJfdCogcF9qcDIpOwotCi0vKioKLSAqIEdldCB0aGUgY29kZXN0cmVhbSBpbmRleCBmcm9tIGEgSlBFRzIwMDAgY29kZWMuCi0gKgotICpAcGFyYW0gIHBfanAyICAgICAgICBqcDIgY29kZWMuCi0gKgotICpAcmV0dXJuICB0aGUgY29kZXN0cmVhbSBpbmRleCBleHRyYWN0IGZyb20gdGhlIGpwZzIwMDAgY29kZWMKLSAqLwotb3BqX2NvZGVzdHJlYW1faW5kZXhfdCoganAyX2dldF9jc3RyX2luZGV4KG9wal9qcDJfdCogcF9qcDIpOwotCi0KLS8qQH0qLwotCi0vKkB9Ki8KLQotI2VuZGlmIC8qIF9fSlAyX0ggKi8KLQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL21jdC5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL21jdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGRhMDk5Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9tY3QuYworKysgL2Rldi9udWxsCkBAIC0xLDU1MyArMCwwIEBACi0vKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCi0gKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCi0gKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFVuaXZlcnNpdGUgY2F0aG9saXF1ZSBkZSBMb3V2YWluIChVQ0wpLCBCZWxnaXVtCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQotICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZSIAotICogQ29weXJpZ2h0IChjKSAyMDEyLCBDUyBTeXN0ZW1lcyBkJ0luZm9ybWF0aW9uLCBGcmFuY2UKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgQVMgSVMnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQotICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmZGVmIF9fU1NFX18KLSNpbmNsdWRlIDx4bW1pbnRyaW4uaD4KLSNlbmRpZgotI2lmZGVmIF9fU1NFMl9fCi0jaW5jbHVkZSA8ZW1taW50cmluLmg+Ci0jZW5kaWYKLSNpZmRlZiBfX1NTRTRfMV9fCi0jaW5jbHVkZSA8c21taW50cmluLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIm9wal9pbmNsdWRlcy5oIgotCi0vKiA8c3VtbWFyeT4gKi8KLS8qIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIG5vcm1zIG9mIHRoZSBiYXNpcyBmdW5jdGlvbiBvZiB0aGUgcmV2ZXJzaWJsZSBNQ1QuICovCi0vKiA8L3N1bW1hcnk+ICovCi1zdGF0aWMgY29uc3QgT1BKX0ZMT0FUNjQgb3BqX21jdF9ub3Jtc1szXSA9IHsgMS43MzIsIC44MjkyLCAuODI5MiB9OwotCi0vKiA8c3VtbWFyeT4gKi8KLS8qIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIG5vcm1zIG9mIHRoZSBiYXNpcyBmdW5jdGlvbiBvZiB0aGUgaXJyZXZlcnNpYmxlIE1DVC4gKi8KLS8qIDwvc3VtbWFyeT4gKi8KLXN0YXRpYyBjb25zdCBPUEpfRkxPQVQ2NCBvcGpfbWN0X25vcm1zX3JlYWxbM10gPSB7IDEuNzMyLCAxLjgwNSwgMS41NzMgfTsKLQotY29uc3QgT1BKX0ZMT0FUNjQgKiBvcGpfbWN0X2dldF9tY3Rfbm9ybXMgKCkKLXsKLQlyZXR1cm4gb3BqX21jdF9ub3JtczsKLX0KLQotY29uc3QgT1BKX0ZMT0FUNjQgKiBvcGpfbWN0X2dldF9tY3Rfbm9ybXNfcmVhbCAoKQotewotCXJldHVybiBvcGpfbWN0X25vcm1zX3JlYWw7Ci19Ci0KLS8qIDxzdW1tYXJ5PiAqLwotLyogRm93YXJkIHJldmVyc2libGUgTUNULiAqLwotLyogPC9zdW1tYXJ5PiAqLwotI2lmZGVmIF9fU1NFMl9fCi12b2lkIG9wal9tY3RfZW5jb2RlKAotCQlPUEpfSU5UMzIqIHJlc3RyaWN0IGMwLAotCQlPUEpfSU5UMzIqIHJlc3RyaWN0IGMxLAotCQlPUEpfSU5UMzIqIHJlc3RyaWN0IGMyLAotCQlPUEpfVUlOVDMyIG4pCi17Ci0JT1BKX1NJWkVfVCBpOwotCWNvbnN0IE9QSl9TSVpFX1QgbGVuID0gbjsKLQkKLQlmb3IoaSA9IDA7IGkgPCAobGVuICYgfjNVKTsgaSArPSA0KSB7Ci0JCV9fbTEyOGkgeSwgdSwgdjsKLQkJX19tMTI4aSByID0gX21tX2xvYWRfc2kxMjgoKGNvbnN0IF9fbTEyOGkgKikmKGMwW2ldKSk7Ci0JCV9fbTEyOGkgZyA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpICopJihjMVtpXSkpOwotCQlfX20xMjhpIGIgPSBfbW1fbG9hZF9zaTEyOCgoY29uc3QgX19tMTI4aSAqKSYoYzJbaV0pKTsKLQkJeSA9IF9tbV9hZGRfZXBpMzIoZywgZyk7Ci0JCXkgPSBfbW1fYWRkX2VwaTMyKHksIGIpOwotCQl5ID0gX21tX2FkZF9lcGkzMih5LCByKTsKLQkJeSA9IF9tbV9zcmFpX2VwaTMyKHksIDIpOwotCQl1ID0gX21tX3N1Yl9lcGkzMihiLCBnKTsKLQkJdiA9IF9tbV9zdWJfZXBpMzIociwgZyk7Ci0JCV9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSAqKSYoYzBbaV0pLCB5KTsKLQkJX21tX3N0b3JlX3NpMTI4KChfX20xMjhpICopJihjMVtpXSksIHUpOwotCQlfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkgKikmKGMyW2ldKSwgdik7Ci0JfQotCQotCWZvcig7IGkgPCBsZW47ICsraSkgewotCQlPUEpfSU5UMzIgciA9IGMwW2ldOwotCQlPUEpfSU5UMzIgZyA9IGMxW2ldOwotCQlPUEpfSU5UMzIgYiA9IGMyW2ldOwotCQlPUEpfSU5UMzIgeSA9IChyICsgKGcgKiAyKSArIGIpID4+IDI7Ci0JCU9QSl9JTlQzMiB1ID0gYiAtIGc7Ci0JCU9QSl9JTlQzMiB2ID0gciAtIGc7Ci0JCWMwW2ldID0geTsKLQkJYzFbaV0gPSB1OwotCQljMltpXSA9IHY7Ci0JfQotfQotI2Vsc2UKLXZvaWQgb3BqX21jdF9lbmNvZGUoCi0JCU9QSl9JTlQzMiogcmVzdHJpY3QgYzAsCi0JCU9QSl9JTlQzMiogcmVzdHJpY3QgYzEsCi0JCU9QSl9JTlQzMiogcmVzdHJpY3QgYzIsCi0JCU9QSl9VSU5UMzIgbikKLXsKLQlPUEpfU0laRV9UIGk7Ci0JY29uc3QgT1BKX1NJWkVfVCBsZW4gPSBuOwotCQotCWZvcihpID0gMDsgaSA8IGxlbjsgKytpKSB7Ci0JCU9QSl9JTlQzMiByID0gYzBbaV07Ci0JCU9QSl9JTlQzMiBnID0gYzFbaV07Ci0JCU9QSl9JTlQzMiBiID0gYzJbaV07Ci0JCU9QSl9JTlQzMiB5ID0gKHIgKyAoZyAqIDIpICsgYikgPj4gMjsKLQkJT1BKX0lOVDMyIHUgPSBiIC0gZzsKLQkJT1BKX0lOVDMyIHYgPSByIC0gZzsKLQkJYzBbaV0gPSB5OwotCQljMVtpXSA9IHU7Ci0JCWMyW2ldID0gdjsKLQl9Ci19Ci0jZW5kaWYKLQotLyogPHN1bW1hcnk+ICovCi0vKiBJbnZlcnNlIHJldmVyc2libGUgTUNULiAqLwotLyogPC9zdW1tYXJ5PiAqLwotI2lmZGVmIF9fU1NFMl9fCi12b2lkIG9wal9tY3RfZGVjb2RlKAotCQlPUEpfSU5UMzIqIHJlc3RyaWN0IGMwLAotCQlPUEpfSU5UMzIqIHJlc3RyaWN0IGMxLAotCQlPUEpfSU5UMzIqIHJlc3RyaWN0IGMyLAotCQlPUEpfVUlOVDMyIG4pCi17Ci0JT1BKX1NJWkVfVCBpOwotCWNvbnN0IE9QSl9TSVpFX1QgbGVuID0gbjsKLQkKLQlmb3IoaSA9IDA7IGkgPCAobGVuICYgfjNVKTsgaSArPSA0KSB7Ci0JCV9fbTEyOGkgciwgZywgYjsKLQkJX19tMTI4aSB5ID0gX21tX2xvYWRfc2kxMjgoKGNvbnN0IF9fbTEyOGkgKikmKGMwW2ldKSk7Ci0JCV9fbTEyOGkgdSA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpICopJihjMVtpXSkpOwotCQlfX20xMjhpIHYgPSBfbW1fbG9hZF9zaTEyOCgoY29uc3QgX19tMTI4aSAqKSYoYzJbaV0pKTsKLQkJZyA9IHk7Ci0JCWcgPSBfbW1fc3ViX2VwaTMyKGcsIF9tbV9zcmFpX2VwaTMyKF9tbV9hZGRfZXBpMzIodSwgdiksIDIpKTsKLQkJciA9IF9tbV9hZGRfZXBpMzIodiwgZyk7Ci0JCWIgPSBfbW1fYWRkX2VwaTMyKHUsIGcpOwotCQlfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkgKikmKGMwW2ldKSwgcik7Ci0JCV9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSAqKSYoYzFbaV0pLCBnKTsKLQkJX21tX3N0b3JlX3NpMTI4KChfX20xMjhpICopJihjMltpXSksIGIpOwotCX0KLQlmb3IgKDsgaSA8IGxlbjsgKytpKSB7Ci0JCU9QSl9JTlQzMiB5ID0gYzBbaV07Ci0JCU9QSl9JTlQzMiB1ID0gYzFbaV07Ci0JCU9QSl9JTlQzMiB2ID0gYzJbaV07Ci0JCU9QSl9JTlQzMiBnID0geSAtICgodSArIHYpID4+IDIpOwotCQlPUEpfSU5UMzIgciA9IHYgKyBnOwotCQlPUEpfSU5UMzIgYiA9IHUgKyBnOwotCQljMFtpXSA9IHI7Ci0JCWMxW2ldID0gZzsKLQkJYzJbaV0gPSBiOwotCX0KLX0KLSNlbHNlCi12b2lkIG9wal9tY3RfZGVjb2RlKAotCQlPUEpfSU5UMzIqIHJlc3RyaWN0IGMwLAotCQlPUEpfSU5UMzIqIHJlc3RyaWN0IGMxLCAKLQkJT1BKX0lOVDMyKiByZXN0cmljdCBjMiwgCi0JCU9QSl9VSU5UMzIgbikKLXsKLQlPUEpfVUlOVDMyIGk7Ci0JZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotCQlPUEpfSU5UMzIgeSA9IGMwW2ldOwotCQlPUEpfSU5UMzIgdSA9IGMxW2ldOwotCQlPUEpfSU5UMzIgdiA9IGMyW2ldOwotCQlPUEpfSU5UMzIgZyA9IHkgLSAoKHUgKyB2KSA+PiAyKTsKLQkJT1BKX0lOVDMyIHIgPSB2ICsgZzsKLQkJT1BKX0lOVDMyIGIgPSB1ICsgZzsKLQkJYzBbaV0gPSByOwotCQljMVtpXSA9IGc7Ci0JCWMyW2ldID0gYjsKLQl9Ci19Ci0jZW5kaWYKLQotLyogPHN1bW1hcnk+ICovCi0vKiBHZXQgbm9ybSBvZiBiYXNpcyBmdW5jdGlvbiBvZiByZXZlcnNpYmxlIE1DVC4gKi8KLS8qIDwvc3VtbWFyeT4gKi8KLU9QSl9GTE9BVDY0IG9wal9tY3RfZ2V0bm9ybShPUEpfVUlOVDMyIGNvbXBubykgewotCXJldHVybiBvcGpfbWN0X25vcm1zW2NvbXBub107Ci19Ci0KLS8qIDxzdW1tYXJ5PiAqLwotLyogRm93YXJkIGlycmV2ZXJzaWJsZSBNQ1QuICovCi0vKiA8L3N1bW1hcnk+ICovCi0jaWZkZWYgX19TU0U0XzFfXwotdm9pZCBvcGpfbWN0X2VuY29kZV9yZWFsKAotCQkJCQkJCQkJCQkJIE9QSl9JTlQzMiogcmVzdHJpY3QgYzAsCi0JCQkJCQkJCQkJCQkgT1BKX0lOVDMyKiByZXN0cmljdCBjMSwKLQkJCQkJCQkJCQkJCSBPUEpfSU5UMzIqIHJlc3RyaWN0IGMyLAotCQkJCQkJCQkJCQkJIE9QSl9VSU5UMzIgbikKLXsKLQlPUEpfU0laRV9UIGk7Ci0JY29uc3QgT1BKX1NJWkVfVCBsZW4gPSBuOwotCQotCWNvbnN0IF9fbTEyOGkgcnkgPSBfbW1fc2V0MV9lcGkzMigyNDQ5KTsKLQljb25zdCBfX20xMjhpIGd5ID0gX21tX3NldDFfZXBpMzIoNDgwOSk7Ci0JY29uc3QgX19tMTI4aSBieSA9IF9tbV9zZXQxX2VwaTMyKDkzNCk7Ci0JY29uc3QgX19tMTI4aSBydSA9IF9tbV9zZXQxX2VwaTMyKDEzODIpOwotCWNvbnN0IF9fbTEyOGkgZ3UgPSBfbW1fc2V0MV9lcGkzMigyNzE0KTsKLQkvKiBjb25zdCBfX20xMjhpIGJ1ID0gX21tX3NldDFfZXBpMzIoNDA5Nik7ICovCi0JLyogY29uc3QgX19tMTI4aSBydiA9IF9tbV9zZXQxX2VwaTMyKDQwOTYpOyAqLwotCWNvbnN0IF9fbTEyOGkgZ3YgPSBfbW1fc2V0MV9lcGkzMigzNDMwKTsKLQljb25zdCBfX20xMjhpIGJ2ID0gX21tX3NldDFfZXBpMzIoNjY2KTsKLQljb25zdCBfX20xMjhpIG11bHJvdW5kID0gX21tX3NodWZmbGVfZXBpMzIoX21tX2N2dHNpMzJfc2kxMjgoNDA5NiksIF9NTV9TSFVGRkxFKDEsIDAsIDEsIDApKTsKLQkKLQlmb3IoaSA9IDA7IGkgPCAobGVuICYgfjNVKTsgaSArPSA0KSB7Ci0JCV9fbTEyOGkgbG8sIGhpOwotCQlfX20xMjhpIHksIHUsIHY7Ci0JCV9fbTEyOGkgciA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpICopJihjMFtpXSkpOwotCQlfX20xMjhpIGcgPSBfbW1fbG9hZF9zaTEyOCgoY29uc3QgX19tMTI4aSAqKSYoYzFbaV0pKTsKLQkJX19tMTI4aSBiID0gX21tX2xvYWRfc2kxMjgoKGNvbnN0IF9fbTEyOGkgKikmKGMyW2ldKSk7Ci0JCQotCQlsbyA9IHI7Ci0JCWhpID0gX21tX3NodWZmbGVfZXBpMzIociwgX01NX1NIVUZGTEUoMywgMywgMSwgMSkpOwotCQlsbyA9IF9tbV9tdWxfZXBpMzIobG8sIHJ5KTsKLQkJaGkgPSBfbW1fbXVsX2VwaTMyKGhpLCByeSk7Ci0JCWxvID0gX21tX2FkZF9lcGk2NChsbywgbXVscm91bmQpOwotCQloaSA9IF9tbV9hZGRfZXBpNjQoaGksIG11bHJvdW5kKTsKLQkJbG8gPSBfbW1fc3JsaV9lcGk2NChsbywgMTMpOwotCQloaSA9IF9tbV9zbGxpX2VwaTY0KGhpLCAzMi0xMyk7Ci0JCXkgPSBfbW1fYmxlbmRfZXBpMTYobG8sIGhpLCAweENDKTsKLQkJCi0JCWxvID0gZzsKLQkJaGkgPSBfbW1fc2h1ZmZsZV9lcGkzMihnLCBfTU1fU0hVRkZMRSgzLCAzLCAxLCAxKSk7Ci0JCWxvID0gX21tX211bF9lcGkzMihsbywgZ3kpOwotCQloaSA9IF9tbV9tdWxfZXBpMzIoaGksIGd5KTsKLQkJbG8gPSBfbW1fYWRkX2VwaTY0KGxvLCBtdWxyb3VuZCk7Ci0JCWhpID0gX21tX2FkZF9lcGk2NChoaSwgbXVscm91bmQpOwotCQlsbyA9IF9tbV9zcmxpX2VwaTY0KGxvLCAxMyk7Ci0JCWhpID0gX21tX3NsbGlfZXBpNjQoaGksIDMyLTEzKTsKLQkJeSA9IF9tbV9hZGRfZXBpMzIoeSwgX21tX2JsZW5kX2VwaTE2KGxvLCBoaSwgMHhDQykpOwotCQkKLQkJbG8gPSBiOwotCQloaSA9IF9tbV9zaHVmZmxlX2VwaTMyKGIsIF9NTV9TSFVGRkxFKDMsIDMsIDEsIDEpKTsKLQkJbG8gPSBfbW1fbXVsX2VwaTMyKGxvLCBieSk7Ci0JCWhpID0gX21tX211bF9lcGkzMihoaSwgYnkpOwotCQlsbyA9IF9tbV9hZGRfZXBpNjQobG8sIG11bHJvdW5kKTsKLQkJaGkgPSBfbW1fYWRkX2VwaTY0KGhpLCBtdWxyb3VuZCk7Ci0JCWxvID0gX21tX3NybGlfZXBpNjQobG8sIDEzKTsKLQkJaGkgPSBfbW1fc2xsaV9lcGk2NChoaSwgMzItMTMpOwotCQl5ID0gX21tX2FkZF9lcGkzMih5LCBfbW1fYmxlbmRfZXBpMTYobG8sIGhpLCAweENDKSk7Ci0JCV9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSAqKSYoYzBbaV0pLCB5KTsKLQkJCi0JCS8qbG8gPSBiOwotCQloaSA9IF9tbV9zaHVmZmxlX2VwaTMyKGIsIF9NTV9TSFVGRkxFKDMsIDMsIDEsIDEpKTsKLQkJbG8gPSBfbW1fbXVsX2VwaTMyKGxvLCBtdWxyb3VuZCk7Ci0JCWhpID0gX21tX211bF9lcGkzMihoaSwgbXVscm91bmQpOyovCi0JCWxvID0gX21tX2N2dGVwaTMyX2VwaTY0KF9tbV9zaHVmZmxlX2VwaTMyKGIsIF9NTV9TSFVGRkxFKDMsIDIsIDIsIDApKSk7Ci0JCWhpID0gX21tX2N2dGVwaTMyX2VwaTY0KF9tbV9zaHVmZmxlX2VwaTMyKGIsIF9NTV9TSFVGRkxFKDMsIDIsIDMsIDEpKSk7Ci0JCWxvID0gX21tX3NsbGlfZXBpNjQobG8sIDEyKTsKLQkJaGkgPSBfbW1fc2xsaV9lcGk2NChoaSwgMTIpOwotCQlsbyA9IF9tbV9hZGRfZXBpNjQobG8sIG11bHJvdW5kKTsKLQkJaGkgPSBfbW1fYWRkX2VwaTY0KGhpLCBtdWxyb3VuZCk7Ci0JCWxvID0gX21tX3NybGlfZXBpNjQobG8sIDEzKTsKLQkJaGkgPSBfbW1fc2xsaV9lcGk2NChoaSwgMzItMTMpOwotCQl1ID0gX21tX2JsZW5kX2VwaTE2KGxvLCBoaSwgMHhDQyk7Ci0JCQotCQlsbyA9IHI7Ci0JCWhpID0gX21tX3NodWZmbGVfZXBpMzIociwgX01NX1NIVUZGTEUoMywgMywgMSwgMSkpOwotCQlsbyA9IF9tbV9tdWxfZXBpMzIobG8sIHJ1KTsKLQkJaGkgPSBfbW1fbXVsX2VwaTMyKGhpLCBydSk7Ci0JCWxvID0gX21tX2FkZF9lcGk2NChsbywgbXVscm91bmQpOwotCQloaSA9IF9tbV9hZGRfZXBpNjQoaGksIG11bHJvdW5kKTsKLQkJbG8gPSBfbW1fc3JsaV9lcGk2NChsbywgMTMpOwotCQloaSA9IF9tbV9zbGxpX2VwaTY0KGhpLCAzMi0xMyk7Ci0JCXUgPSBfbW1fc3ViX2VwaTMyKHUsIF9tbV9ibGVuZF9lcGkxNihsbywgaGksIDB4Q0MpKTsKLQkJCi0JCWxvID0gZzsKLQkJaGkgPSBfbW1fc2h1ZmZsZV9lcGkzMihnLCBfTU1fU0hVRkZMRSgzLCAzLCAxLCAxKSk7Ci0JCWxvID0gX21tX211bF9lcGkzMihsbywgZ3UpOwotCQloaSA9IF9tbV9tdWxfZXBpMzIoaGksIGd1KTsKLQkJbG8gPSBfbW1fYWRkX2VwaTY0KGxvLCBtdWxyb3VuZCk7Ci0JCWhpID0gX21tX2FkZF9lcGk2NChoaSwgbXVscm91bmQpOwotCQlsbyA9IF9tbV9zcmxpX2VwaTY0KGxvLCAxMyk7Ci0JCWhpID0gX21tX3NsbGlfZXBpNjQoaGksIDMyLTEzKTsKLQkJdSA9IF9tbV9zdWJfZXBpMzIodSwgX21tX2JsZW5kX2VwaTE2KGxvLCBoaSwgMHhDQykpOwotCQlfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkgKikmKGMxW2ldKSwgdSk7Ci0JCQotCQkvKmxvID0gcjsKLQkJaGkgPSBfbW1fc2h1ZmZsZV9lcGkzMihyLCBfTU1fU0hVRkZMRSgzLCAzLCAxLCAxKSk7Ci0JCWxvID0gX21tX211bF9lcGkzMihsbywgbXVscm91bmQpOwotCQloaSA9IF9tbV9tdWxfZXBpMzIoaGksIG11bHJvdW5kKTsqLwotCQlsbyA9IF9tbV9jdnRlcGkzMl9lcGk2NChfbW1fc2h1ZmZsZV9lcGkzMihyLCBfTU1fU0hVRkZMRSgzLCAyLCAyLCAwKSkpOwotCQloaSA9IF9tbV9jdnRlcGkzMl9lcGk2NChfbW1fc2h1ZmZsZV9lcGkzMihyLCBfTU1fU0hVRkZMRSgzLCAyLCAzLCAxKSkpOwotCQlsbyA9IF9tbV9zbGxpX2VwaTY0KGxvLCAxMik7Ci0JCWhpID0gX21tX3NsbGlfZXBpNjQoaGksIDEyKTsKLQkJbG8gPSBfbW1fYWRkX2VwaTY0KGxvLCBtdWxyb3VuZCk7Ci0JCWhpID0gX21tX2FkZF9lcGk2NChoaSwgbXVscm91bmQpOwotCQlsbyA9IF9tbV9zcmxpX2VwaTY0KGxvLCAxMyk7Ci0JCWhpID0gX21tX3NsbGlfZXBpNjQoaGksIDMyLTEzKTsKLQkJdiA9IF9tbV9ibGVuZF9lcGkxNihsbywgaGksIDB4Q0MpOwotCQkKLQkJbG8gPSBnOwotCQloaSA9IF9tbV9zaHVmZmxlX2VwaTMyKGcsIF9NTV9TSFVGRkxFKDMsIDMsIDEsIDEpKTsKLQkJbG8gPSBfbW1fbXVsX2VwaTMyKGxvLCBndik7Ci0JCWhpID0gX21tX211bF9lcGkzMihoaSwgZ3YpOwotCQlsbyA9IF9tbV9hZGRfZXBpNjQobG8sIG11bHJvdW5kKTsKLQkJaGkgPSBfbW1fYWRkX2VwaTY0KGhpLCBtdWxyb3VuZCk7Ci0JCWxvID0gX21tX3NybGlfZXBpNjQobG8sIDEzKTsKLQkJaGkgPSBfbW1fc2xsaV9lcGk2NChoaSwgMzItMTMpOwotCQl2ID0gX21tX3N1Yl9lcGkzMih2LCBfbW1fYmxlbmRfZXBpMTYobG8sIGhpLCAweENDKSk7Ci0JCQotCQlsbyA9IGI7Ci0JCWhpID0gX21tX3NodWZmbGVfZXBpMzIoYiwgX01NX1NIVUZGTEUoMywgMywgMSwgMSkpOwotCQlsbyA9IF9tbV9tdWxfZXBpMzIobG8sIGJ2KTsKLQkJaGkgPSBfbW1fbXVsX2VwaTMyKGhpLCBidik7Ci0JCWxvID0gX21tX2FkZF9lcGk2NChsbywgbXVscm91bmQpOwotCQloaSA9IF9tbV9hZGRfZXBpNjQoaGksIG11bHJvdW5kKTsKLQkJbG8gPSBfbW1fc3JsaV9lcGk2NChsbywgMTMpOwotCQloaSA9IF9tbV9zbGxpX2VwaTY0KGhpLCAzMi0xMyk7Ci0JCXYgPSBfbW1fc3ViX2VwaTMyKHYsIF9tbV9ibGVuZF9lcGkxNihsbywgaGksIDB4Q0MpKTsKLQkJX21tX3N0b3JlX3NpMTI4KChfX20xMjhpICopJihjMltpXSksIHYpOwotCX0KLQlmb3IoOyBpIDwgbGVuOyArK2kpIHsKLQkJT1BKX0lOVDMyIHIgPSBjMFtpXTsKLQkJT1BKX0lOVDMyIGcgPSBjMVtpXTsKLQkJT1BKX0lOVDMyIGIgPSBjMltpXTsKLQkJT1BKX0lOVDMyIHkgPSAgb3BqX2ludF9maXhfbXVsKHIsIDI0NDkpICsgb3BqX2ludF9maXhfbXVsKGcsIDQ4MDkpICsgb3BqX2ludF9maXhfbXVsKGIsIDkzNCk7Ci0JCU9QSl9JTlQzMiB1ID0gLW9wal9pbnRfZml4X211bChyLCAxMzgyKSAtIG9wal9pbnRfZml4X211bChnLCAyNzE0KSArIG9wal9pbnRfZml4X211bChiLCA0MDk2KTsKLQkJT1BKX0lOVDMyIHYgPSAgb3BqX2ludF9maXhfbXVsKHIsIDQwOTYpIC0gb3BqX2ludF9maXhfbXVsKGcsIDM0MzApIC0gb3BqX2ludF9maXhfbXVsKGIsIDY2Nik7Ci0JCWMwW2ldID0geTsKLQkJYzFbaV0gPSB1OwotCQljMltpXSA9IHY7Ci0JfQotfQotI2Vsc2UKLXZvaWQgb3BqX21jdF9lbmNvZGVfcmVhbCgKLQkJT1BKX0lOVDMyKiByZXN0cmljdCBjMCwKLQkJT1BKX0lOVDMyKiByZXN0cmljdCBjMSwKLQkJT1BKX0lOVDMyKiByZXN0cmljdCBjMiwKLQkJT1BKX1VJTlQzMiBuKQotewotCU9QSl9VSU5UMzIgaTsKLQlmb3IoaSA9IDA7IGkgPCBuOyArK2kpIHsKLQkJT1BKX0lOVDMyIHIgPSBjMFtpXTsKLQkJT1BKX0lOVDMyIGcgPSBjMVtpXTsKLQkJT1BKX0lOVDMyIGIgPSBjMltpXTsKLQkJT1BKX0lOVDMyIHkgPSAgb3BqX2ludF9maXhfbXVsKHIsIDI0NDkpICsgb3BqX2ludF9maXhfbXVsKGcsIDQ4MDkpICsgb3BqX2ludF9maXhfbXVsKGIsIDkzNCk7Ci0JCU9QSl9JTlQzMiB1ID0gLW9wal9pbnRfZml4X211bChyLCAxMzgyKSAtIG9wal9pbnRfZml4X211bChnLCAyNzE0KSArIG9wal9pbnRfZml4X211bChiLCA0MDk2KTsKLQkJT1BKX0lOVDMyIHYgPSAgb3BqX2ludF9maXhfbXVsKHIsIDQwOTYpIC0gb3BqX2ludF9maXhfbXVsKGcsIDM0MzApIC0gb3BqX2ludF9maXhfbXVsKGIsIDY2Nik7Ci0JCWMwW2ldID0geTsKLQkJYzFbaV0gPSB1OwotCQljMltpXSA9IHY7Ci0JfQotfQotI2VuZGlmCi0KLS8qIDxzdW1tYXJ5PiAqLwotLyogSW52ZXJzZSBpcnJldmVyc2libGUgTUNULiAqLwotLyogPC9zdW1tYXJ5PiAqLwotdm9pZCBvcGpfbWN0X2RlY29kZV9yZWFsKAotCQlPUEpfRkxPQVQzMiogcmVzdHJpY3QgYzAsCi0JCU9QSl9GTE9BVDMyKiByZXN0cmljdCBjMSwKLQkJT1BKX0ZMT0FUMzIqIHJlc3RyaWN0IGMyLAotCQlPUEpfVUlOVDMyIG4pCi17Ci0JT1BKX1VJTlQzMiBpOwotI2lmZGVmIF9fU1NFX18KLQlfX20xMjggdnJ2LCB2Z3UsIHZndiwgdmJ1OwotCXZydiA9IF9tbV9zZXQxX3BzKDEuNDAyZik7Ci0Jdmd1ID0gX21tX3NldDFfcHMoMC4zNDQxM2YpOwotCXZndiA9IF9tbV9zZXQxX3BzKDAuNzE0MTRmKTsKLQl2YnUgPSBfbW1fc2V0MV9wcygxLjc3MmYpOwotCWZvciAoaSA9IDA7IGkgPCAobiA+PiAzKTsgKytpKSB7Ci0JCV9fbTEyOCB2eSwgdnUsIHZ2OwotCQlfX20xMjggdnIsIHZnLCB2YjsKLQotCQl2eSA9IF9tbV9sb2FkX3BzKGMwKTsKLQkJdnUgPSBfbW1fbG9hZF9wcyhjMSk7Ci0JCXZ2ID0gX21tX2xvYWRfcHMoYzIpOwotCQl2ciA9IF9tbV9hZGRfcHModnksIF9tbV9tdWxfcHModnYsIHZydikpOwotCQl2ZyA9IF9tbV9zdWJfcHMoX21tX3N1Yl9wcyh2eSwgX21tX211bF9wcyh2dSwgdmd1KSksIF9tbV9tdWxfcHModnYsIHZndikpOwotCQl2YiA9IF9tbV9hZGRfcHModnksIF9tbV9tdWxfcHModnUsIHZidSkpOwotCQlfbW1fc3RvcmVfcHMoYzAsIHZyKTsKLQkJX21tX3N0b3JlX3BzKGMxLCB2Zyk7Ci0JCV9tbV9zdG9yZV9wcyhjMiwgdmIpOwotCQljMCArPSA0OwotCQljMSArPSA0OwotCQljMiArPSA0OwotCi0JCXZ5ID0gX21tX2xvYWRfcHMoYzApOwotCQl2dSA9IF9tbV9sb2FkX3BzKGMxKTsKLQkJdnYgPSBfbW1fbG9hZF9wcyhjMik7Ci0JCXZyID0gX21tX2FkZF9wcyh2eSwgX21tX211bF9wcyh2diwgdnJ2KSk7Ci0JCXZnID0gX21tX3N1Yl9wcyhfbW1fc3ViX3BzKHZ5LCBfbW1fbXVsX3BzKHZ1LCB2Z3UpKSwgX21tX211bF9wcyh2diwgdmd2KSk7Ci0JCXZiID0gX21tX2FkZF9wcyh2eSwgX21tX211bF9wcyh2dSwgdmJ1KSk7Ci0JCV9tbV9zdG9yZV9wcyhjMCwgdnIpOwotCQlfbW1fc3RvcmVfcHMoYzEsIHZnKTsKLQkJX21tX3N0b3JlX3BzKGMyLCB2Yik7Ci0JCWMwICs9IDQ7Ci0JCWMxICs9IDQ7Ci0JCWMyICs9IDQ7Ci0JfQotCW4gJj0gNzsKLSNlbmRpZgotCWZvcihpID0gMDsgaSA8IG47ICsraSkgewotCQlPUEpfRkxPQVQzMiB5ID0gYzBbaV07Ci0JCU9QSl9GTE9BVDMyIHUgPSBjMVtpXTsKLQkJT1BKX0ZMT0FUMzIgdiA9IGMyW2ldOwotCQlPUEpfRkxPQVQzMiByID0geSArICh2ICogMS40MDJmKTsKLQkJT1BKX0ZMT0FUMzIgZyA9IHkgLSAodSAqIDAuMzQ0MTNmKSAtICh2ICogKDAuNzE0MTRmKSk7Ci0JCU9QSl9GTE9BVDMyIGIgPSB5ICsgKHUgKiAxLjc3MmYpOwotCQljMFtpXSA9IHI7Ci0JCWMxW2ldID0gZzsKLQkJYzJbaV0gPSBiOwotCX0KLX0KLQotLyogPHN1bW1hcnk+ICovCi0vKiBHZXQgbm9ybSBvZiBiYXNpcyBmdW5jdGlvbiBvZiBpcnJldmVyc2libGUgTUNULiAqLwotLyogPC9zdW1tYXJ5PiAqLwotT1BKX0ZMT0FUNjQgb3BqX21jdF9nZXRub3JtX3JlYWwoT1BKX1VJTlQzMiBjb21wbm8pIHsKLQlyZXR1cm4gb3BqX21jdF9ub3Jtc19yZWFsW2NvbXBub107Ci19Ci0KLQotT1BKX0JPT0wgb3BqX21jdF9lbmNvZGVfY3VzdG9tKAotCQkJCQkgICBPUEpfQllURSAqIHBDb2RpbmdkYXRhLAotCQkJCQkgICBPUEpfVUlOVDMyIG4sCi0JCQkJCSAgIE9QSl9CWVRFICoqIHBEYXRhLAotCQkJCQkgICBPUEpfVUlOVDMyIHBOYkNvbXAsCi0JCQkJCSAgIE9QSl9VSU5UMzIgaXNTaWduZWQpCi17Ci0JT1BKX0ZMT0FUMzIgKiBsTWN0ID0gKE9QSl9GTE9BVDMyICopIHBDb2RpbmdkYXRhOwotCU9QSl9VSU5UMzIgaTsKLQlPUEpfVUlOVDMyIGo7Ci0JT1BKX1VJTlQzMiBrOwotCU9QSl9VSU5UMzIgbE5iTWF0Q29lZmYgPSBwTmJDb21wICogcE5iQ29tcDsKLQlPUEpfSU5UMzIgKiBsQ3VycmVudERhdGEgPSAwMDsKLQlPUEpfSU5UMzIgKiBsQ3VycmVudE1hdHJpeCA9IDAwOwotCU9QSl9JTlQzMiAqKiBsRGF0YSA9IChPUEpfSU5UMzIgKiopIHBEYXRhOwotCU9QSl9VSU5UMzIgbE11bHRpcGxpY2F0b3IgPSAxIDw8IDEzOwotCU9QSl9JTlQzMiAqIGxNY3RQdHI7Ci0KLSAgICBPUEpfQVJHX05PVF9VU0VEKGlzU2lnbmVkKTsKLQotCWxDdXJyZW50RGF0YSA9IChPUEpfSU5UMzIgKikgb3BqX21hbGxvYygocE5iQ29tcCArIGxOYk1hdENvZWZmKSAqIHNpemVvZihPUEpfSU5UMzIpKTsKLQlpZiAoISBsQ3VycmVudERhdGEpIHsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0KLQlsQ3VycmVudE1hdHJpeCA9IGxDdXJyZW50RGF0YSArIHBOYkNvbXA7Ci0KLQlmb3IgKGkgPTA7aTxsTmJNYXRDb2VmZjsrK2kpIHsKLQkJbEN1cnJlbnRNYXRyaXhbaV0gPSAoT1BKX0lOVDMyKSAoKihsTWN0KyspICogKE9QSl9GTE9BVDMyKWxNdWx0aXBsaWNhdG9yKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSAgewotCQlsTWN0UHRyID0gbEN1cnJlbnRNYXRyaXg7Ci0JCWZvciAoaj0wO2o8cE5iQ29tcDsrK2opIHsKLQkJCWxDdXJyZW50RGF0YVtqXSA9ICgqKGxEYXRhW2pdKSk7Ci0JCX0KLQotCQlmb3IgKGo9MDtqPHBOYkNvbXA7KytqKSB7Ci0JCQkqKGxEYXRhW2pdKSA9IDA7Ci0JCQlmb3IgKGs9MDtrPHBOYkNvbXA7KytrKSB7Ci0JCQkJKihsRGF0YVtqXSkgKz0gb3BqX2ludF9maXhfbXVsKCpsTWN0UHRyLCBsQ3VycmVudERhdGFba10pOwotCQkJCSsrbE1jdFB0cjsKLQkJCX0KLQotCQkJKytsRGF0YVtqXTsKLQkJfQotCX0KLQotCW9wal9mcmVlKGxDdXJyZW50RGF0YSk7Ci0KLQlyZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9CT09MIG9wal9tY3RfZGVjb2RlX2N1c3RvbSgKLQkJCQkJICAgT1BKX0JZVEUgKiBwRGVjb2RpbmdEYXRhLAotCQkJCQkgICBPUEpfVUlOVDMyIG4sCi0JCQkJCSAgIE9QSl9CWVRFICoqIHBEYXRhLAotCQkJCQkgICBPUEpfVUlOVDMyIHBOYkNvbXAsCi0JCQkJCSAgIE9QSl9VSU5UMzIgaXNTaWduZWQpCi17Ci0JT1BKX0ZMT0FUMzIgKiBsTWN0OwotCU9QSl9VSU5UMzIgaTsKLQlPUEpfVUlOVDMyIGo7Ci0JT1BKX1VJTlQzMiBrOwotCi0JT1BKX0ZMT0FUMzIgKiBsQ3VycmVudERhdGEgPSAwMDsKLQlPUEpfRkxPQVQzMiAqIGxDdXJyZW50UmVzdWx0ID0gMDA7Ci0JT1BKX0ZMT0FUMzIgKiogbERhdGEgPSAoT1BKX0ZMT0FUMzIgKiopIHBEYXRhOwotCi0gICAgT1BKX0FSR19OT1RfVVNFRChpc1NpZ25lZCk7Ci0KLQlsQ3VycmVudERhdGEgPSAoT1BKX0ZMT0FUMzIgKikgb3BqX21hbGxvYyAoMiAqIHBOYkNvbXAgKiBzaXplb2YoT1BKX0ZMT0FUMzIpKTsKLQlpZiAoISBsQ3VycmVudERhdGEpIHsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0JbEN1cnJlbnRSZXN1bHQgPSBsQ3VycmVudERhdGEgKyBwTmJDb21wOwotCi0JZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotCQlsTWN0ID0gKE9QSl9GTE9BVDMyICopIHBEZWNvZGluZ0RhdGE7Ci0JCWZvciAoaj0wO2o8cE5iQ29tcDsrK2opIHsKLQkJCWxDdXJyZW50RGF0YVtqXSA9IChPUEpfRkxPQVQzMikgKCoobERhdGFbal0pKTsKLQkJfQotCQlmb3IgKGo9MDtqPHBOYkNvbXA7KytqKSB7Ci0JCQlsQ3VycmVudFJlc3VsdFtqXSA9IDA7Ci0JCQlmb3IJKGs9MDtrPHBOYkNvbXA7KytrKQl7Ci0JCQkJbEN1cnJlbnRSZXN1bHRbal0gKz0gKihsTWN0KyspICogbEN1cnJlbnREYXRhW2tdOwotCQkJfQotCQkJKihsRGF0YVtqXSsrKSA9IChPUEpfRkxPQVQzMikgKGxDdXJyZW50UmVzdWx0W2pdKTsKLQkJfQotCX0KLQlvcGpfZnJlZShsQ3VycmVudERhdGEpOwotCXJldHVybiBPUEpfVFJVRTsKLX0KLQotdm9pZCBvcGpfY2FsY3VsYXRlX25vcm1zKAlPUEpfRkxPQVQ2NCAqIHBOb3JtcywKLQkJCQkJCQlPUEpfVUlOVDMyIHBOYkNvbXBzLAotCQkJCQkJCU9QSl9GTE9BVDMyICogcE1hdHJpeCkKLXsKLQlPUEpfVUlOVDMyIGksaixsSW5kZXg7Ci0JT1BKX0ZMT0FUMzIgbEN1cnJlbnRWYWx1ZTsKLQlPUEpfRkxPQVQ2NCAqIGxOb3JtcyA9IChPUEpfRkxPQVQ2NCAqKSBwTm9ybXM7Ci0JT1BKX0ZMT0FUMzIgKiBsTWF0cml4ID0gKE9QSl9GTE9BVDMyICopIHBNYXRyaXg7Ci0KLQlmb3IJKGk9MDtpPHBOYkNvbXBzOysraSkgewotCQlsTm9ybXNbaV0gPSAwOwotCQlsSW5kZXggPSBpOwotCi0JCWZvcgkoaj0wO2o8cE5iQ29tcHM7KytqKSB7Ci0JCQlsQ3VycmVudFZhbHVlID0gbE1hdHJpeFtsSW5kZXhdOwotCQkJbEluZGV4ICs9IHBOYkNvbXBzOwotCQkJbE5vcm1zW2ldICs9IGxDdXJyZW50VmFsdWUgKiBsQ3VycmVudFZhbHVlOwotCQl9Ci0JCWxOb3Jtc1tpXSA9IHNxcnQobE5vcm1zW2ldKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvbXFjLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvbXFjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NTU5NGIuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL21xYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjE0ICswLDAgQEAKLS8qCi0gKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKLSAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKLSAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKLSAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgVW5pdmVyc2l0ZSBjYXRob2xpcXVlIGRlIExvdXZhaW4gKFVDTCksIEJlbGdpdW0KLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBQcm9mZXNzb3IgQmVub2l0IE1hY3EKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzLCBEYXZpZCBKYW5zc2VucwotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIFlhbm5pY2sgVmVyc2NodWVyZW4KLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eCAKLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE0LCBBbnRvbmluIERlc2NhbXBlCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KLSAqIENvcHlyaWdodCAoYykgMjAwOCwgSmVyb21lIEZpbWVzLCBDb21tdW5pY2F0aW9ucyAmIFN5c3RlbWVzIDxqZXJvbWUuZmltZXNAYy1zLmZyPgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCi0gKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAib3BqX2luY2x1ZGVzLmgiCi0KLS8qKiBAZGVmZ3JvdXAgTVFDIE1RQyAtIEltcGxlbWVudGF0aW9uIG9mIGFuIE1RLUNvZGVyICovCi0vKkB7Ki8KLQotLyoqIEBuYW1lIExvY2FsIHN0YXRpYyBmdW5jdGlvbnMgKi8KLS8qQHsqLwotCi0vKioKLU91dHB1dCBhIGJ5dGUsIGRvaW5nIGJpdC1zdHVmZmluZyBpZiBuZWNlc3NhcnkuCi1BZnRlciBhIDB4ZmYgYnl0ZSwgdGhlIG5leHQgYnl0ZSBtdXN0IGJlIHNtYWxsZXIgdGhhbiAweDkwLgotQHBhcmFtIG1xYyBNUUMgaGFuZGxlCi0qLwotc3RhdGljIHZvaWQgb3BqX21xY19ieXRlb3V0KG9wal9tcWNfdCAqbXFjKTsKLS8qKgotUmVub3JtYWxpemUgbXFjLT5hIGFuZCBtcWMtPmMgd2hpbGUgZW5jb2RpbmcsIHNvIHRoYXQgbXFjLT5hIHN0YXlzIGJldHdlZW4gMHg4MDAwIGFuZCAweDEwMDAwCi1AcGFyYW0gbXFjIE1RQyBoYW5kbGUKLSovCi1zdGF0aWMgdm9pZCBvcGpfbXFjX3Jlbm9ybWUob3BqX21xY190ICptcWMpOwotLyoqCi1FbmNvZGUgdGhlIG1vc3QgcHJvYmFibGUgc3ltYm9sCi1AcGFyYW0gbXFjIE1RQyBoYW5kbGUKLSovCi1zdGF0aWMgdm9pZCBvcGpfbXFjX2NvZGVtcHMob3BqX21xY190ICptcWMpOwotLyoqCi1FbmNvZGUgdGhlIG1vc3QgbGVhc3Qgc3ltYm9sCi1AcGFyYW0gbXFjIE1RQyBoYW5kbGUKLSovCi1zdGF0aWMgdm9pZCBvcGpfbXFjX2NvZGVscHMob3BqX21xY190ICptcWMpOwotLyoqCi1GaWxsIG1xYy0+YyB3aXRoIDEncyBmb3IgZmx1c2hpbmcKLUBwYXJhbSBtcWMgTVFDIGhhbmRsZQotKi8KLXN0YXRpYyB2b2lkIG9wal9tcWNfc2V0Yml0cyhvcGpfbXFjX3QgKm1xYyk7Ci0vKioKLUZJWE1FIERPQwotQHBhcmFtIG1xYyBNUUMgaGFuZGxlCi1AcmV0dXJuIAotKi8KLXN0YXRpYyBJTkxJTkUgT1BKX0lOVDMyIG9wal9tcWNfbXBzZXhjaGFuZ2Uob3BqX21xY190ICpjb25zdCBtcWMpOwotLyoqCi1GSVhNRSBET0MKLUBwYXJhbSBtcWMgTVFDIGhhbmRsZQotQHJldHVybiAKLSovCi1zdGF0aWMgSU5MSU5FIE9QSl9JTlQzMiBvcGpfbXFjX2xwc2V4Y2hhbmdlKG9wal9tcWNfdCAqY29uc3QgbXFjKTsKLS8qKgotSW5wdXQgYSBieXRlCi1AcGFyYW0gbXFjIE1RQyBoYW5kbGUKLSovCi1zdGF0aWMgSU5MSU5FIHZvaWQgb3BqX21xY19ieXRlaW4ob3BqX21xY190ICpjb25zdCBtcWMpOwotLyoqCi1SZW5vcm1hbGl6ZSBtcWMtPmEgYW5kIG1xYy0+YyB3aGlsZSBkZWNvZGluZwotQHBhcmFtIG1xYyBNUUMgaGFuZGxlCi0qLwotc3RhdGljIElOTElORSB2b2lkIG9wal9tcWNfcmVub3JtZChvcGpfbXFjX3QgKmNvbnN0IG1xYyk7Ci0vKkB9Ki8KLQotLypAfSovCi0KLS8qIDxzdW1tYXJ5PiAqLwotLyogVGhpcyBhcnJheSBkZWZpbmVzIGFsbCB0aGUgcG9zc2libGUgc3RhdGVzIGZvciBhIGNvbnRleHQuICovCi0vKiA8L3N1bW1hcnk+ICovCi1zdGF0aWMgb3BqX21xY19zdGF0ZV90IG1xY19zdGF0ZXNbNDcgKiAyXSA9IHsKLQl7MHg1NjAxLCAwLCAmbXFjX3N0YXRlc1syXSwgJm1xY19zdGF0ZXNbM119LAotCXsweDU2MDEsIDEsICZtcWNfc3RhdGVzWzNdLCAmbXFjX3N0YXRlc1syXX0sCi0JezB4MzQwMSwgMCwgJm1xY19zdGF0ZXNbNF0sICZtcWNfc3RhdGVzWzEyXX0sCi0JezB4MzQwMSwgMSwgJm1xY19zdGF0ZXNbNV0sICZtcWNfc3RhdGVzWzEzXX0sCi0JezB4MTgwMSwgMCwgJm1xY19zdGF0ZXNbNl0sICZtcWNfc3RhdGVzWzE4XX0sCi0JezB4MTgwMSwgMSwgJm1xY19zdGF0ZXNbN10sICZtcWNfc3RhdGVzWzE5XX0sCi0JezB4MGFjMSwgMCwgJm1xY19zdGF0ZXNbOF0sICZtcWNfc3RhdGVzWzI0XX0sCi0JezB4MGFjMSwgMSwgJm1xY19zdGF0ZXNbOV0sICZtcWNfc3RhdGVzWzI1XX0sCi0JezB4MDUyMSwgMCwgJm1xY19zdGF0ZXNbMTBdLCAmbXFjX3N0YXRlc1s1OF19LAotCXsweDA1MjEsIDEsICZtcWNfc3RhdGVzWzExXSwgJm1xY19zdGF0ZXNbNTldfSwKLQl7MHgwMjIxLCAwLCAmbXFjX3N0YXRlc1s3Nl0sICZtcWNfc3RhdGVzWzY2XX0sCi0JezB4MDIyMSwgMSwgJm1xY19zdGF0ZXNbNzddLCAmbXFjX3N0YXRlc1s2N119LAotCXsweDU2MDEsIDAsICZtcWNfc3RhdGVzWzE0XSwgJm1xY19zdGF0ZXNbMTNdfSwKLQl7MHg1NjAxLCAxLCAmbXFjX3N0YXRlc1sxNV0sICZtcWNfc3RhdGVzWzEyXX0sCi0JezB4NTQwMSwgMCwgJm1xY19zdGF0ZXNbMTZdLCAmbXFjX3N0YXRlc1syOF19LAotCXsweDU0MDEsIDEsICZtcWNfc3RhdGVzWzE3XSwgJm1xY19zdGF0ZXNbMjldfSwKLQl7MHg0ODAxLCAwLCAmbXFjX3N0YXRlc1sxOF0sICZtcWNfc3RhdGVzWzI4XX0sCi0JezB4NDgwMSwgMSwgJm1xY19zdGF0ZXNbMTldLCAmbXFjX3N0YXRlc1syOV19LAotCXsweDM4MDEsIDAsICZtcWNfc3RhdGVzWzIwXSwgJm1xY19zdGF0ZXNbMjhdfSwKLQl7MHgzODAxLCAxLCAmbXFjX3N0YXRlc1syMV0sICZtcWNfc3RhdGVzWzI5XX0sCi0JezB4MzAwMSwgMCwgJm1xY19zdGF0ZXNbMjJdLCAmbXFjX3N0YXRlc1szNF19LAotCXsweDMwMDEsIDEsICZtcWNfc3RhdGVzWzIzXSwgJm1xY19zdGF0ZXNbMzVdfSwKLQl7MHgyNDAxLCAwLCAmbXFjX3N0YXRlc1syNF0sICZtcWNfc3RhdGVzWzM2XX0sCi0JezB4MjQwMSwgMSwgJm1xY19zdGF0ZXNbMjVdLCAmbXFjX3N0YXRlc1szN119LAotCXsweDFjMDEsIDAsICZtcWNfc3RhdGVzWzI2XSwgJm1xY19zdGF0ZXNbNDBdfSwKLQl7MHgxYzAxLCAxLCAmbXFjX3N0YXRlc1syN10sICZtcWNfc3RhdGVzWzQxXX0sCi0JezB4MTYwMSwgMCwgJm1xY19zdGF0ZXNbNThdLCAmbXFjX3N0YXRlc1s0Ml19LAotCXsweDE2MDEsIDEsICZtcWNfc3RhdGVzWzU5XSwgJm1xY19zdGF0ZXNbNDNdfSwKLQl7MHg1NjAxLCAwLCAmbXFjX3N0YXRlc1szMF0sICZtcWNfc3RhdGVzWzI5XX0sCi0JezB4NTYwMSwgMSwgJm1xY19zdGF0ZXNbMzFdLCAmbXFjX3N0YXRlc1syOF19LAotCXsweDU0MDEsIDAsICZtcWNfc3RhdGVzWzMyXSwgJm1xY19zdGF0ZXNbMjhdfSwKLQl7MHg1NDAxLCAxLCAmbXFjX3N0YXRlc1szM10sICZtcWNfc3RhdGVzWzI5XX0sCi0JezB4NTEwMSwgMCwgJm1xY19zdGF0ZXNbMzRdLCAmbXFjX3N0YXRlc1szMF19LAotCXsweDUxMDEsIDEsICZtcWNfc3RhdGVzWzM1XSwgJm1xY19zdGF0ZXNbMzFdfSwKLQl7MHg0ODAxLCAwLCAmbXFjX3N0YXRlc1szNl0sICZtcWNfc3RhdGVzWzMyXX0sCi0JezB4NDgwMSwgMSwgJm1xY19zdGF0ZXNbMzddLCAmbXFjX3N0YXRlc1szM119LAotCXsweDM4MDEsIDAsICZtcWNfc3RhdGVzWzM4XSwgJm1xY19zdGF0ZXNbMzRdfSwKLQl7MHgzODAxLCAxLCAmbXFjX3N0YXRlc1szOV0sICZtcWNfc3RhdGVzWzM1XX0sCi0JezB4MzQwMSwgMCwgJm1xY19zdGF0ZXNbNDBdLCAmbXFjX3N0YXRlc1szNl19LAotCXsweDM0MDEsIDEsICZtcWNfc3RhdGVzWzQxXSwgJm1xY19zdGF0ZXNbMzddfSwKLQl7MHgzMDAxLCAwLCAmbXFjX3N0YXRlc1s0Ml0sICZtcWNfc3RhdGVzWzM4XX0sCi0JezB4MzAwMSwgMSwgJm1xY19zdGF0ZXNbNDNdLCAmbXFjX3N0YXRlc1szOV19LAotCXsweDI4MDEsIDAsICZtcWNfc3RhdGVzWzQ0XSwgJm1xY19zdGF0ZXNbMzhdfSwKLQl7MHgyODAxLCAxLCAmbXFjX3N0YXRlc1s0NV0sICZtcWNfc3RhdGVzWzM5XX0sCi0JezB4MjQwMSwgMCwgJm1xY19zdGF0ZXNbNDZdLCAmbXFjX3N0YXRlc1s0MF19LAotCXsweDI0MDEsIDEsICZtcWNfc3RhdGVzWzQ3XSwgJm1xY19zdGF0ZXNbNDFdfSwKLQl7MHgyMjAxLCAwLCAmbXFjX3N0YXRlc1s0OF0sICZtcWNfc3RhdGVzWzQyXX0sCi0JezB4MjIwMSwgMSwgJm1xY19zdGF0ZXNbNDldLCAmbXFjX3N0YXRlc1s0M119LAotCXsweDFjMDEsIDAsICZtcWNfc3RhdGVzWzUwXSwgJm1xY19zdGF0ZXNbNDRdfSwKLQl7MHgxYzAxLCAxLCAmbXFjX3N0YXRlc1s1MV0sICZtcWNfc3RhdGVzWzQ1XX0sCi0JezB4MTgwMSwgMCwgJm1xY19zdGF0ZXNbNTJdLCAmbXFjX3N0YXRlc1s0Nl19LAotCXsweDE4MDEsIDEsICZtcWNfc3RhdGVzWzUzXSwgJm1xY19zdGF0ZXNbNDddfSwKLQl7MHgxNjAxLCAwLCAmbXFjX3N0YXRlc1s1NF0sICZtcWNfc3RhdGVzWzQ4XX0sCi0JezB4MTYwMSwgMSwgJm1xY19zdGF0ZXNbNTVdLCAmbXFjX3N0YXRlc1s0OV19LAotCXsweDE0MDEsIDAsICZtcWNfc3RhdGVzWzU2XSwgJm1xY19zdGF0ZXNbNTBdfSwKLQl7MHgxNDAxLCAxLCAmbXFjX3N0YXRlc1s1N10sICZtcWNfc3RhdGVzWzUxXX0sCi0JezB4MTIwMSwgMCwgJm1xY19zdGF0ZXNbNThdLCAmbXFjX3N0YXRlc1s1Ml19LAotCXsweDEyMDEsIDEsICZtcWNfc3RhdGVzWzU5XSwgJm1xY19zdGF0ZXNbNTNdfSwKLQl7MHgxMTAxLCAwLCAmbXFjX3N0YXRlc1s2MF0sICZtcWNfc3RhdGVzWzU0XX0sCi0JezB4MTEwMSwgMSwgJm1xY19zdGF0ZXNbNjFdLCAmbXFjX3N0YXRlc1s1NV19LAotCXsweDBhYzEsIDAsICZtcWNfc3RhdGVzWzYyXSwgJm1xY19zdGF0ZXNbNTZdfSwKLQl7MHgwYWMxLCAxLCAmbXFjX3N0YXRlc1s2M10sICZtcWNfc3RhdGVzWzU3XX0sCi0JezB4MDljMSwgMCwgJm1xY19zdGF0ZXNbNjRdLCAmbXFjX3N0YXRlc1s1OF19LAotCXsweDA5YzEsIDEsICZtcWNfc3RhdGVzWzY1XSwgJm1xY19zdGF0ZXNbNTldfSwKLQl7MHgwOGExLCAwLCAmbXFjX3N0YXRlc1s2Nl0sICZtcWNfc3RhdGVzWzYwXX0sCi0JezB4MDhhMSwgMSwgJm1xY19zdGF0ZXNbNjddLCAmbXFjX3N0YXRlc1s2MV19LAotCXsweDA1MjEsIDAsICZtcWNfc3RhdGVzWzY4XSwgJm1xY19zdGF0ZXNbNjJdfSwKLQl7MHgwNTIxLCAxLCAmbXFjX3N0YXRlc1s2OV0sICZtcWNfc3RhdGVzWzYzXX0sCi0JezB4MDQ0MSwgMCwgJm1xY19zdGF0ZXNbNzBdLCAmbXFjX3N0YXRlc1s2NF19LAotCXsweDA0NDEsIDEsICZtcWNfc3RhdGVzWzcxXSwgJm1xY19zdGF0ZXNbNjVdfSwKLQl7MHgwMmExLCAwLCAmbXFjX3N0YXRlc1s3Ml0sICZtcWNfc3RhdGVzWzY2XX0sCi0JezB4MDJhMSwgMSwgJm1xY19zdGF0ZXNbNzNdLCAmbXFjX3N0YXRlc1s2N119LAotCXsweDAyMjEsIDAsICZtcWNfc3RhdGVzWzc0XSwgJm1xY19zdGF0ZXNbNjhdfSwKLQl7MHgwMjIxLCAxLCAmbXFjX3N0YXRlc1s3NV0sICZtcWNfc3RhdGVzWzY5XX0sCi0JezB4MDE0MSwgMCwgJm1xY19zdGF0ZXNbNzZdLCAmbXFjX3N0YXRlc1s3MF19LAotCXsweDAxNDEsIDEsICZtcWNfc3RhdGVzWzc3XSwgJm1xY19zdGF0ZXNbNzFdfSwKLQl7MHgwMTExLCAwLCAmbXFjX3N0YXRlc1s3OF0sICZtcWNfc3RhdGVzWzcyXX0sCi0JezB4MDExMSwgMSwgJm1xY19zdGF0ZXNbNzldLCAmbXFjX3N0YXRlc1s3M119LAotCXsweDAwODUsIDAsICZtcWNfc3RhdGVzWzgwXSwgJm1xY19zdGF0ZXNbNzRdfSwKLQl7MHgwMDg1LCAxLCAmbXFjX3N0YXRlc1s4MV0sICZtcWNfc3RhdGVzWzc1XX0sCi0JezB4MDA0OSwgMCwgJm1xY19zdGF0ZXNbODJdLCAmbXFjX3N0YXRlc1s3Nl19LAotCXsweDAwNDksIDEsICZtcWNfc3RhdGVzWzgzXSwgJm1xY19zdGF0ZXNbNzddfSwKLQl7MHgwMDI1LCAwLCAmbXFjX3N0YXRlc1s4NF0sICZtcWNfc3RhdGVzWzc4XX0sCi0JezB4MDAyNSwgMSwgJm1xY19zdGF0ZXNbODVdLCAmbXFjX3N0YXRlc1s3OV19LAotCXsweDAwMTUsIDAsICZtcWNfc3RhdGVzWzg2XSwgJm1xY19zdGF0ZXNbODBdfSwKLQl7MHgwMDE1LCAxLCAmbXFjX3N0YXRlc1s4N10sICZtcWNfc3RhdGVzWzgxXX0sCi0JezB4MDAwOSwgMCwgJm1xY19zdGF0ZXNbODhdLCAmbXFjX3N0YXRlc1s4Ml19LAotCXsweDAwMDksIDEsICZtcWNfc3RhdGVzWzg5XSwgJm1xY19zdGF0ZXNbODNdfSwKLQl7MHgwMDA1LCAwLCAmbXFjX3N0YXRlc1s5MF0sICZtcWNfc3RhdGVzWzg0XX0sCi0JezB4MDAwNSwgMSwgJm1xY19zdGF0ZXNbOTFdLCAmbXFjX3N0YXRlc1s4NV19LAotCXsweDAwMDEsIDAsICZtcWNfc3RhdGVzWzkwXSwgJm1xY19zdGF0ZXNbODZdfSwKLQl7MHgwMDAxLCAxLCAmbXFjX3N0YXRlc1s5MV0sICZtcWNfc3RhdGVzWzg3XX0sCi0JezB4NTYwMSwgMCwgJm1xY19zdGF0ZXNbOTJdLCAmbXFjX3N0YXRlc1s5Ml19LAotCXsweDU2MDEsIDEsICZtcWNfc3RhdGVzWzkzXSwgJm1xY19zdGF0ZXNbOTNdfSwKLX07Ci0KLS8qIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgbG9jYWwgZnVuY3Rpb25zCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotCi12b2lkIG9wal9tcWNfYnl0ZW91dChvcGpfbXFjX3QgKm1xYykgewotCWlmICgqbXFjLT5icCA9PSAweGZmKSB7Ci0JCW1xYy0+YnArKzsKLQkJKm1xYy0+YnAgPSAoT1BKX0JZVEUpKG1xYy0+YyA+PiAyMCk7Ci0JCW1xYy0+YyAmPSAweGZmZmZmOwotCQltcWMtPmN0ID0gNzsKLQl9IGVsc2UgewotCQlpZiAoKG1xYy0+YyAmIDB4ODAwMDAwMCkgPT0gMCkgewkvKiAoKG1xYy0+YyYweDgwMDAwMDApPT0wKSBDSEFOR0UgKi8KLQkJCW1xYy0+YnArKzsKLQkJCSptcWMtPmJwID0gKE9QSl9CWVRFKShtcWMtPmMgPj4gMTkpOwotCQkJbXFjLT5jICY9IDB4N2ZmZmY7Ci0JCQltcWMtPmN0ID0gODsKLQkJfSBlbHNlIHsKLQkJCSgqbXFjLT5icCkrKzsKLQkJCWlmICgqbXFjLT5icCA9PSAweGZmKSB7Ci0JCQkJbXFjLT5jICY9IDB4N2ZmZmZmZjsKLQkJCQltcWMtPmJwKys7Ci0JCQkJKm1xYy0+YnAgPSAoT1BKX0JZVEUpKG1xYy0+YyA+PiAyMCk7Ci0JCQkJbXFjLT5jICY9IDB4ZmZmZmY7Ci0JCQkJbXFjLT5jdCA9IDc7Ci0JCQl9IGVsc2UgewotCQkJCW1xYy0+YnArKzsKLQkJCQkqbXFjLT5icCA9IChPUEpfQllURSkobXFjLT5jID4+IDE5KTsKLQkJCQltcWMtPmMgJj0gMHg3ZmZmZjsKLQkJCQltcWMtPmN0ID0gODsKLQkJCX0KLQkJfQotCX0KLX0KLQotdm9pZCBvcGpfbXFjX3Jlbm9ybWUob3BqX21xY190ICptcWMpIHsKLQlkbyB7Ci0JCW1xYy0+YSA8PD0gMTsKLQkJbXFjLT5jIDw8PSAxOwotCQltcWMtPmN0LS07Ci0JCWlmIChtcWMtPmN0ID09IDApIHsKLQkJCW9wal9tcWNfYnl0ZW91dChtcWMpOwotCQl9Ci0JfSB3aGlsZSAoKG1xYy0+YSAmIDB4ODAwMCkgPT0gMCk7Ci19Ci0KLXZvaWQgb3BqX21xY19jb2RlbXBzKG9wal9tcWNfdCAqbXFjKSB7Ci0JbXFjLT5hIC09ICgqbXFjLT5jdXJjdHgpLT5xZXZhbDsKLQlpZiAoKG1xYy0+YSAmIDB4ODAwMCkgPT0gMCkgewotCQlpZiAobXFjLT5hIDwgKCptcWMtPmN1cmN0eCktPnFldmFsKSB7Ci0JCQltcWMtPmEgPSAoKm1xYy0+Y3VyY3R4KS0+cWV2YWw7Ci0JCX0gZWxzZSB7Ci0JCQltcWMtPmMgKz0gKCptcWMtPmN1cmN0eCktPnFldmFsOwotCQl9Ci0JCSptcWMtPmN1cmN0eCA9ICgqbXFjLT5jdXJjdHgpLT5ubXBzOwotCQlvcGpfbXFjX3Jlbm9ybWUobXFjKTsKLQl9IGVsc2UgewotCQltcWMtPmMgKz0gKCptcWMtPmN1cmN0eCktPnFldmFsOwotCX0KLX0KLQotdm9pZCBvcGpfbXFjX2NvZGVscHMob3BqX21xY190ICptcWMpIHsKLQltcWMtPmEgLT0gKCptcWMtPmN1cmN0eCktPnFldmFsOwotCWlmIChtcWMtPmEgPCAoKm1xYy0+Y3VyY3R4KS0+cWV2YWwpIHsKLQkJbXFjLT5jICs9ICgqbXFjLT5jdXJjdHgpLT5xZXZhbDsKLQl9IGVsc2UgewotCQltcWMtPmEgPSAoKm1xYy0+Y3VyY3R4KS0+cWV2YWw7Ci0JfQotCSptcWMtPmN1cmN0eCA9ICgqbXFjLT5jdXJjdHgpLT5ubHBzOwotCW9wal9tcWNfcmVub3JtZShtcWMpOwotfQotCi12b2lkIG9wal9tcWNfc2V0Yml0cyhvcGpfbXFjX3QgKm1xYykgewotCU9QSl9VSU5UMzIgdGVtcGMgPSBtcWMtPmMgKyBtcWMtPmE7Ci0JbXFjLT5jIHw9IDB4ZmZmZjsKLQlpZiAobXFjLT5jID49IHRlbXBjKSB7Ci0JCW1xYy0+YyAtPSAweDgwMDA7Ci0JfQotfQotCi1zdGF0aWMgSU5MSU5FIE9QSl9JTlQzMiBvcGpfbXFjX21wc2V4Y2hhbmdlKG9wal9tcWNfdCAqY29uc3QgbXFjKSB7Ci0JT1BKX0lOVDMyIGQ7Ci0JaWYgKG1xYy0+YSA8ICgqbXFjLT5jdXJjdHgpLT5xZXZhbCkgewotCQlkID0gKE9QSl9JTlQzMikoMSAtICgqbXFjLT5jdXJjdHgpLT5tcHMpOwotCQkqbXFjLT5jdXJjdHggPSAoKm1xYy0+Y3VyY3R4KS0+bmxwczsKLQl9IGVsc2UgewotCQlkID0gKE9QSl9JTlQzMikoKm1xYy0+Y3VyY3R4KS0+bXBzOwotCQkqbXFjLT5jdXJjdHggPSAoKm1xYy0+Y3VyY3R4KS0+bm1wczsKLQl9Ci0JCi0JcmV0dXJuIGQ7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgT1BKX0lOVDMyIG9wal9tcWNfbHBzZXhjaGFuZ2Uob3BqX21xY190ICpjb25zdCBtcWMpIHsKLQlPUEpfSU5UMzIgZDsKLQlpZiAobXFjLT5hIDwgKCptcWMtPmN1cmN0eCktPnFldmFsKSB7Ci0JCW1xYy0+YSA9ICgqbXFjLT5jdXJjdHgpLT5xZXZhbDsKLQkJZCA9IChPUEpfSU5UMzIpKCptcWMtPmN1cmN0eCktPm1wczsKLQkJKm1xYy0+Y3VyY3R4ID0gKCptcWMtPmN1cmN0eCktPm5tcHM7Ci0JfSBlbHNlIHsKLQkJbXFjLT5hID0gKCptcWMtPmN1cmN0eCktPnFldmFsOwotCQlkID0gKE9QSl9JTlQzMikoMSAtICgqbXFjLT5jdXJjdHgpLT5tcHMpOwotCQkqbXFjLT5jdXJjdHggPSAoKm1xYy0+Y3VyY3R4KS0+bmxwczsKLQl9Ci0JCi0JcmV0dXJuIGQ7Ci19Ci0KLSNpZmRlZiBNUUNfUEVSRl9PUFQKLXN0YXRpYyBJTkxJTkUgdm9pZCBvcGpfbXFjX2J5dGVpbihvcGpfbXFjX3QgKmNvbnN0IG1xYykgewotCXVuc2lnbmVkIGludCBpID0gKigodW5zaWduZWQgaW50ICopIG1xYy0+YnApOwotCW1xYy0+YyArPSBpICYgMHhmZmZmMDA7Ci0JbXFjLT5jdCA9IGkgJiAweDBmOwotCW1xYy0+YnAgKz0gKGkgPj4gMikgJiAweDA0OwotfQotI2Vsc2UKLXN0YXRpYyB2b2lkIG9wal9tcWNfYnl0ZWluKG9wal9tcWNfdCAqY29uc3QgbXFjKSB7Ci0JaWYgKG1xYy0+YnAgIT0gbXFjLT5lbmQpIHsKLQkJT1BKX1VJTlQzMiBjOwotCQlpZiAobXFjLT5icCArIDEgIT0gbXFjLT5lbmQpIHsKLQkJCWMgPSAqKG1xYy0+YnAgKyAxKTsKLQkJfSBlbHNlIHsKLQkJCWMgPSAweGZmOwotCQl9Ci0JCWlmICgqbXFjLT5icCA9PSAweGZmKSB7Ci0JCQlpZiAoYyA+IDB4OGYpIHsKLQkJCQltcWMtPmMgKz0gMHhmZjAwOwotCQkJCW1xYy0+Y3QgPSA4OwotCQkJfSBlbHNlIHsKLQkJCQltcWMtPmJwKys7Ci0JCQkJbXFjLT5jICs9IGMgPDwgOTsKLQkJCQltcWMtPmN0ID0gNzsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW1xYy0+YnArKzsKLQkJCW1xYy0+YyArPSBjIDw8IDg7Ci0JCQltcWMtPmN0ID0gODsKLQkJfQotCX0gZWxzZSB7Ci0JCW1xYy0+YyArPSAweGZmMDA7Ci0JCW1xYy0+Y3QgPSA4OwotCX0KLX0KLSNlbmRpZgotCi1zdGF0aWMgSU5MSU5FIHZvaWQgb3BqX21xY19yZW5vcm1kKG9wal9tcWNfdCAqY29uc3QgbXFjKSB7Ci0JZG8gewotCQlpZiAobXFjLT5jdCA9PSAwKSB7Ci0JCQlvcGpfbXFjX2J5dGVpbihtcWMpOwotCQl9Ci0JCW1xYy0+YSA8PD0gMTsKLQkJbXFjLT5jIDw8PSAxOwotCQltcWMtPmN0LS07Ci0JfSB3aGlsZSAobXFjLT5hIDwgMHg4MDAwKTsKLX0KLQotLyogCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBNUS1Db2RlciBpbnRlcmZhY2UKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi0KLW9wal9tcWNfdCogb3BqX21xY19jcmVhdGUodm9pZCkgewotCW9wal9tcWNfdCAqbXFjID0gKG9wal9tcWNfdCopb3BqX21hbGxvYyhzaXplb2Yob3BqX21xY190KSk7Ci0jaWZkZWYgTVFDX1BFUkZfT1BUCi0JaWYgKG1xYykgewotCQltcWMtPmJ1ZmZlciA9IE5VTEw7Ci0JfQotI2VuZGlmCi0JcmV0dXJuIG1xYzsKLX0KLQotdm9pZCBvcGpfbXFjX2Rlc3Ryb3kob3BqX21xY190ICptcWMpIHsKLQlpZihtcWMpIHsKLSNpZmRlZiBNUUNfUEVSRl9PUFQKLQkJaWYgKG1xYy0+YnVmZmVyKSB7Ci0JCQlvcGpfZnJlZShtcWMtPmJ1ZmZlcik7Ci0JCX0KLSNlbmRpZgotCQlvcGpfZnJlZShtcWMpOwotCX0KLX0KLQotT1BKX1VJTlQzMiBvcGpfbXFjX251bWJ5dGVzKG9wal9tcWNfdCAqbXFjKSB7Ci0JY29uc3QgcHRyZGlmZl90IGRpZmYgPSBtcWMtPmJwIC0gbXFjLT5zdGFydDsKLSNpZiAwCi0gIGFzc2VydCggZGlmZiA8PSAweGZmZmZmZmZmICYmIGRpZmYgPj0gMCApOyAvKiBVSU5UMzJfTUFYICovCi0jZW5kaWYKLQlyZXR1cm4gKE9QSl9VSU5UMzIpZGlmZjsKLX0KLQotdm9pZCBvcGpfbXFjX2luaXRfZW5jKG9wal9tcWNfdCAqbXFjLCBPUEpfQllURSAqYnApIHsKLSAgICAvKiBUT0RPIE1TRDogbmVlZCB0byB0YWtlIGEgbG9vayB0byB0aGUgdjIgdmVyc2lvbiAqLwotCW9wal9tcWNfc2V0Y3VyY3R4KG1xYywgMCk7Ci0JbXFjLT5hID0gMHg4MDAwOwotCW1xYy0+YyA9IDA7Ci0JbXFjLT5icCA9IGJwIC0gMTsKLQltcWMtPmN0ID0gMTI7Ci0JaWYgKCptcWMtPmJwID09IDB4ZmYpIHsKLQkJbXFjLT5jdCA9IDEzOwotCX0KLQltcWMtPnN0YXJ0ID0gYnA7Ci19Ci0KLXZvaWQgb3BqX21xY19lbmNvZGUob3BqX21xY190ICptcWMsIE9QSl9VSU5UMzIgZCkgewotCWlmICgoKm1xYy0+Y3VyY3R4KS0+bXBzID09IGQpIHsKLQkJb3BqX21xY19jb2RlbXBzKG1xYyk7Ci0JfSBlbHNlIHsKLQkJb3BqX21xY19jb2RlbHBzKG1xYyk7Ci0JfQotfQotCi12b2lkIG9wal9tcWNfZmx1c2gob3BqX21xY190ICptcWMpIHsKLQlvcGpfbXFjX3NldGJpdHMobXFjKTsKLQltcWMtPmMgPDw9IG1xYy0+Y3Q7Ci0Jb3BqX21xY19ieXRlb3V0KG1xYyk7Ci0JbXFjLT5jIDw8PSBtcWMtPmN0OwotCW9wal9tcWNfYnl0ZW91dChtcWMpOwotCQotCWlmICgqbXFjLT5icCAhPSAweGZmKSB7Ci0JCW1xYy0+YnArKzsKLQl9Ci19Ci0KLXZvaWQgb3BqX21xY19ieXBhc3NfaW5pdF9lbmMob3BqX21xY190ICptcWMpIHsKLQltcWMtPmMgPSAwOwotCW1xYy0+Y3QgPSA4OwotCS8qaWYgKCptcWMtPmJwID09IDB4ZmYpIHsKLQltcWMtPmN0ID0gNzsKLSAgICAgfSAqLwotfQotCi12b2lkIG9wal9tcWNfYnlwYXNzX2VuYyhvcGpfbXFjX3QgKm1xYywgT1BKX1VJTlQzMiBkKSB7Ci0JbXFjLT5jdC0tOwotCW1xYy0+YyA9IG1xYy0+YyArIChkIDw8IG1xYy0+Y3QpOwotCWlmIChtcWMtPmN0ID09IDApIHsKLQkJbXFjLT5icCsrOwotCQkqbXFjLT5icCA9IChPUEpfQllURSltcWMtPmM7Ci0JCW1xYy0+Y3QgPSA4OwotCQlpZiAoKm1xYy0+YnAgPT0gMHhmZikgewotCQkJbXFjLT5jdCA9IDc7Ci0JCX0KLQkJbXFjLT5jID0gMDsKLQl9Ci19Ci0KLU9QSl9VSU5UMzIgb3BqX21xY19ieXBhc3NfZmx1c2hfZW5jKG9wal9tcWNfdCAqbXFjKSB7Ci0JT1BKX0JZVEUgYml0X3BhZGRpbmc7Ci0JCi0JYml0X3BhZGRpbmcgPSAwOwotCQotCWlmIChtcWMtPmN0ICE9IDApIHsKLQkJd2hpbGUgKG1xYy0+Y3QgPiAwKSB7Ci0JCQltcWMtPmN0LS07Ci0JCQltcWMtPmMgKz0gKE9QSl9VSU5UMzIpKGJpdF9wYWRkaW5nIDw8IG1xYy0+Y3QpOwotCQkJYml0X3BhZGRpbmcgPSAoYml0X3BhZGRpbmcgKyAxKSAmIDB4MDE7Ci0JCX0KLQkJbXFjLT5icCsrOwotCQkqbXFjLT5icCA9IChPUEpfQllURSltcWMtPmM7Ci0JCW1xYy0+Y3QgPSA4OwotCQltcWMtPmMgPSAwOwotCX0KLQkKLQlyZXR1cm4gMTsKLX0KLQotdm9pZCBvcGpfbXFjX3Jlc2V0X2VuYyhvcGpfbXFjX3QgKm1xYykgewotCW9wal9tcWNfcmVzZXRzdGF0ZXMobXFjKTsKLQlvcGpfbXFjX3NldHN0YXRlKG1xYywgVDFfQ1RYTk9fVU5JLCAwLCA0Nik7Ci0Jb3BqX21xY19zZXRzdGF0ZShtcWMsIFQxX0NUWE5PX0FHRywgMCwgMyk7Ci0Jb3BqX21xY19zZXRzdGF0ZShtcWMsIFQxX0NUWE5PX1pDLCAwLCA0KTsKLX0KLQotT1BKX1VJTlQzMiBvcGpfbXFjX3Jlc3RhcnRfZW5jKG9wal9tcWNfdCAqbXFjKSB7Ci0JT1BKX1VJTlQzMiBjb3JyZWN0aW9uID0gMTsKLQkKLQkvKiA8Zmx1c2ggcGFydD4gKi8KLQlPUEpfSU5UMzIgbiA9IChPUEpfSU5UMzIpKDI3IC0gMTUgLSBtcWMtPmN0KTsKLQltcWMtPmMgPDw9IG1xYy0+Y3Q7Ci0Jd2hpbGUgKG4gPiAwKSB7Ci0JCW9wal9tcWNfYnl0ZW91dChtcWMpOwotCQluIC09IChPUEpfSU5UMzIpbXFjLT5jdDsKLQkJbXFjLT5jIDw8PSBtcWMtPmN0OwotCX0KLQlvcGpfbXFjX2J5dGVvdXQobXFjKTsKLQkKLQlyZXR1cm4gY29ycmVjdGlvbjsKLX0KLQotdm9pZCBvcGpfbXFjX3Jlc3RhcnRfaW5pdF9lbmMob3BqX21xY190ICptcWMpIHsKLQkvKiA8UmUtaW5pdCBwYXJ0PiAqLwotCW9wal9tcWNfc2V0Y3VyY3R4KG1xYywgMCk7Ci0JbXFjLT5hID0gMHg4MDAwOwotCW1xYy0+YyA9IDA7Ci0JbXFjLT5jdCA9IDEyOwotCW1xYy0+YnAtLTsKLQlpZiAoKm1xYy0+YnAgPT0gMHhmZikgewotCQltcWMtPmN0ID0gMTM7Ci0JfQotfQotCi12b2lkIG9wal9tcWNfZXJ0ZXJtX2VuYyhvcGpfbXFjX3QgKm1xYykgewotCU9QSl9JTlQzMiBrID0gKE9QSl9JTlQzMikoMTEgLSBtcWMtPmN0ICsgMSk7Ci0JCi0Jd2hpbGUgKGsgPiAwKSB7Ci0JCW1xYy0+YyA8PD0gbXFjLT5jdDsKLQkJbXFjLT5jdCA9IDA7Ci0JCW9wal9tcWNfYnl0ZW91dChtcWMpOwotCQlrIC09IChPUEpfSU5UMzIpbXFjLT5jdDsKLQl9Ci0JCi0JaWYgKCptcWMtPmJwICE9IDB4ZmYpIHsKLQkJb3BqX21xY19ieXRlb3V0KG1xYyk7Ci0JfQotfQotCi12b2lkIG9wal9tcWNfc2VnbWFya19lbmMob3BqX21xY190ICptcWMpIHsKLQlPUEpfVUlOVDMyIGk7Ci0Jb3BqX21xY19zZXRjdXJjdHgobXFjLCAxOCk7Ci0JCi0JZm9yIChpID0gMTsgaSA8IDU7IGkrKykgewotCQlvcGpfbXFjX2VuY29kZShtcWMsIGkgJSAyKTsKLQl9Ci19Ci0KLU9QSl9CT09MIG9wal9tcWNfaW5pdF9kZWMob3BqX21xY190ICptcWMsIE9QSl9CWVRFICpicCwgT1BKX1VJTlQzMiBsZW4pIHsKLQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIDApOwotCW1xYy0+c3RhcnQgPSBicDsKLQltcWMtPmVuZCA9IGJwICsgbGVuOwotCW1xYy0+YnAgPSBicDsKLQlpZiAobGVuPT0wKSBtcWMtPmMgPSAweGZmIDw8IDE2OwotCWVsc2UgbXFjLT5jID0gKE9QSl9VSU5UMzIpKCptcWMtPmJwIDw8IDE2KTsKLQotI2lmZGVmIE1RQ19QRVJGX09QVCAvKiBUT0RPX01TRDogY2hlY2sgdGhpcyBvcHRpb24gYW5kIHB1dCBpbiBleHBlcmltZW50YWwgKi8KLQl7Ci0gICAgICAgIE9QSl9VSU5UMzIgYzsKLQkJT1BKX1VJTlQzMiAqaXA7Ci0JCU9QSl9CWVRFICplbmQgPSBtcWMtPmVuZCAtIDE7Ci0gICAgICAgIHZvaWQqIG5ld19idWZmZXIgPSBvcGpfcmVhbGxvYyhtcWMtPmJ1ZmZlciwgKGxlbiArIDEpICogc2l6ZW9mKE9QSl9VSU5UMzIpKTsKLSAgICAgICAgaWYgKCEgbmV3X2J1ZmZlcikgewotICAgICAgICAgICAgb3BqX2ZyZWUobXFjLT5idWZmZXIpOwotICAgICAgICAgICAgbXFjLT5idWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICBtcWMtPmJ1ZmZlciA9IG5ld19idWZmZXI7Ci0JCQotICAgICAgICBpcCA9IChPUEpfVUlOVDMyICopIG1xYy0+YnVmZmVyOwotCi0JCXdoaWxlIChicCA8IGVuZCkgewotCQkJYyA9ICooYnAgKyAxKTsKLQkJCWlmICgqYnAgPT0gMHhmZikgewotCQkJCWlmIChjID4gMHg4ZikgewotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgewotCQkJCQkqaXAgPSAweDAwMDAwMDE3IHwgKGMgPDwgOSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkqaXAgPSAweDAwMDAwMDE4IHwgKGMgPDwgOCk7Ci0JCQl9Ci0JCQlicCsrOwotCQkJaXArKzsKLQkJfQotCi0JCS8qIEhhbmRsZSBsYXN0IGJ5dGUgb2YgZGF0YSAqLwotCQljID0gMHhmZjsKLQkJaWYgKCpicCA9PSAweGZmKSB7Ci0JCQkqaXAgPSAweDAwMDBmZjE4OwotCQl9IGVsc2UgewotCQkJYnArKzsKLQkJCSppcCA9IDB4MDAwMDAwMTggfCAoYyA8PCA4KTsKLQkJfQotCQlpcCsrOwotCi0JCSppcCA9IDB4MDAwMGZmMDg7Ci0JCW1xYy0+YnAgPSBtcWMtPmJ1ZmZlcjsKLQl9Ci0jZW5kaWYKLQlvcGpfbXFjX2J5dGVpbihtcWMpOwotCW1xYy0+YyA8PD0gNzsKLQltcWMtPmN0IC09IDc7Ci0JbXFjLT5hID0gMHg4MDAwOwotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9JTlQzMiBvcGpfbXFjX2RlY29kZShvcGpfbXFjX3QgKmNvbnN0IG1xYykgewotCU9QSl9JTlQzMiBkOwotCW1xYy0+YSAtPSAoKm1xYy0+Y3VyY3R4KS0+cWV2YWw7Ci0JaWYgKChtcWMtPmMgPj4gMTYpIDwgKCptcWMtPmN1cmN0eCktPnFldmFsKSB7Ci0JCWQgPSBvcGpfbXFjX2xwc2V4Y2hhbmdlKG1xYyk7Ci0JCW9wal9tcWNfcmVub3JtZChtcWMpOwotCX0gZWxzZSB7Ci0JCW1xYy0+YyAtPSAoKm1xYy0+Y3VyY3R4KS0+cWV2YWwgPDwgMTY7Ci0JCWlmICgobXFjLT5hICYgMHg4MDAwKSA9PSAwKSB7Ci0JCQlkID0gb3BqX21xY19tcHNleGNoYW5nZShtcWMpOwotCQkJb3BqX21xY19yZW5vcm1kKG1xYyk7Ci0JCX0gZWxzZSB7Ci0JCQlkID0gKE9QSl9JTlQzMikoKm1xYy0+Y3VyY3R4KS0+bXBzOwotCQl9Ci0JfQotCi0JcmV0dXJuIGQ7Ci19Ci0KLXZvaWQgb3BqX21xY19yZXNldHN0YXRlcyhvcGpfbXFjX3QgKm1xYykgewotCU9QSl9VSU5UMzIgaTsKLQlmb3IgKGkgPSAwOyBpIDwgTVFDX05VTUNUWFM7IGkrKykgewotCQltcWMtPmN0eHNbaV0gPSBtcWNfc3RhdGVzOwotCX0KLX0KLQotdm9pZCBvcGpfbXFjX3NldHN0YXRlKG9wal9tcWNfdCAqbXFjLCBPUEpfVUlOVDMyIGN0eG5vLCBPUEpfVUlOVDMyIG1zYiwgT1BKX0lOVDMyIHByb2IpIHsKLQltcWMtPmN0eHNbY3R4bm9dID0gJm1xY19zdGF0ZXNbbXNiICsgKE9QSl9VSU5UMzIpKHByb2IgPDwgMSldOwotfQotCi0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9vcGVuanBlZy5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL29wZW5qcGVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MDdjMGMuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL29wZW5qcGVnLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NjIgKzAsMCBAQAotLyoKLSAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzIAotICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIAotICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cwotICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExLTIwMTIsIENlbnRyZSBOYXRpb25hbCBkJ0V0dWRlcyBTcGF0aWFsZXMgKENORVMpLCBGUiAKLSAqIENvcHlyaWdodCAoYykgMjAxMiwgQ1MgU3lzdGVtZXMgZCdJbmZvcm1hdGlvbiwgRnJhbmNlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKLSAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZmRlZiBfV0lOMzIKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZW5kaWYgLyogX1dJTjMyICovCi0KLSNpbmNsdWRlICJvcGpfaW5jbHVkZXMuaCIKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBGdW5jdGlvbnMgdG8gc2V0IHRoZSBtZXNzYWdlIGhhbmRsZXJzICovCi0KLU9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfc2V0X2luZm9faGFuZGxlcigJb3BqX2NvZGVjX3QgKiBwX2NvZGVjLCAKLQkJCQkJCQkJCQkJb3BqX21zZ19jYWxsYmFjayBwX2NhbGxiYWNrLAotCQkJCQkJCQkJCQl2b2lkICogcF91c2VyX2RhdGEpCi17Ci0Jb3BqX2NvZGVjX3ByaXZhdGVfdCAqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCAqKSBwX2NvZGVjOwotCWlmKCEgbF9jb2RlYyl7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCQotCWxfY29kZWMtPm1fZXZlbnRfbWdyLmluZm9faGFuZGxlciA9IHBfY2FsbGJhY2s7Ci0JbF9jb2RlYy0+bV9ldmVudF9tZ3IubV9pbmZvX2RhdGEgPSBwX3VzZXJfZGF0YTsKLQkKLQlyZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfc2V0X3dhcm5pbmdfaGFuZGxlcigJb3BqX2NvZGVjX3QgKiBwX2NvZGVjLCAKLQkJCQkJCQkJCQkJCW9wal9tc2dfY2FsbGJhY2sgcF9jYWxsYmFjaywKLQkJCQkJCQkJCQkJCXZvaWQgKiBwX3VzZXJfZGF0YSkKLXsKLQlvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfY29kZWM7Ci0JaWYgKCEgbF9jb2RlYykgewotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQkKLQlsX2NvZGVjLT5tX2V2ZW50X21nci53YXJuaW5nX2hhbmRsZXIgPSBwX2NhbGxiYWNrOwotCWxfY29kZWMtPm1fZXZlbnRfbWdyLm1fd2FybmluZ19kYXRhID0gcF91c2VyX2RhdGE7Ci0JCi0JcmV0dXJuIE9QSl9UUlVFOwotfQotCi1PUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3NldF9lcnJvcl9oYW5kbGVyKG9wal9jb2RlY190ICogcF9jb2RlYywgCi0JCQkJCQkJCQkJCW9wal9tc2dfY2FsbGJhY2sgcF9jYWxsYmFjaywKLQkJCQkJCQkJCQkJdm9pZCAqIHBfdXNlcl9kYXRhKQotewotCW9wal9jb2RlY19wcml2YXRlX3QgKiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QgKikgcF9jb2RlYzsKLQlpZiAoISBsX2NvZGVjKSB7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCQotCWxfY29kZWMtPm1fZXZlbnRfbWdyLmVycm9yX2hhbmRsZXIgPSBwX2NhbGxiYWNrOwotCWxfY29kZWMtPm1fZXZlbnRfbWdyLm1fZXJyb3JfZGF0YSA9IHBfdXNlcl9kYXRhOwotCQotCXJldHVybiBPUEpfVFJVRTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgT1BKX1NJWkVfVCBvcGpfcmVhZF9mcm9tX2ZpbGUgKHZvaWQgKiBwX2J1ZmZlciwgT1BKX1NJWkVfVCBwX25iX2J5dGVzLCBGSUxFICogcF9maWxlKQotewotCU9QSl9TSVpFX1QgbF9uYl9yZWFkID0gZnJlYWQocF9idWZmZXIsMSxwX25iX2J5dGVzLHBfZmlsZSk7Ci0JcmV0dXJuIGxfbmJfcmVhZCA/IGxfbmJfcmVhZCA6IChPUEpfU0laRV9UKS0xOwotfQotCi1zdGF0aWMgT1BKX1VJTlQ2NCBvcGpfZ2V0X2RhdGFfbGVuZ3RoX2Zyb21fZmlsZSAoRklMRSAqIHBfZmlsZSkKLXsKLQlPUEpfT0ZGX1QgZmlsZV9sZW5ndGggPSAwOwotCi0JT1BKX0ZTRUVLKHBfZmlsZSwgMCwgU0VFS19FTkQpOwotCWZpbGVfbGVuZ3RoID0gKE9QSl9PRkZfVClPUEpfRlRFTEwocF9maWxlKTsKLQlPUEpfRlNFRUsocF9maWxlLCAwLCBTRUVLX1NFVCk7Ci0KLQlyZXR1cm4gKE9QSl9VSU5UNjQpZmlsZV9sZW5ndGg7Ci19Ci0KLXN0YXRpYyBPUEpfU0laRV9UIG9wal93cml0ZV9mcm9tX2ZpbGUgKHZvaWQgKiBwX2J1ZmZlciwgT1BKX1NJWkVfVCBwX25iX2J5dGVzLCBGSUxFICogcF9maWxlKQotewotCXJldHVybiBmd3JpdGUocF9idWZmZXIsMSxwX25iX2J5dGVzLHBfZmlsZSk7Ci19Ci0KLXN0YXRpYyBPUEpfT0ZGX1Qgb3BqX3NraXBfZnJvbV9maWxlIChPUEpfT0ZGX1QgcF9uYl9ieXRlcywgRklMRSAqIHBfdXNlcl9kYXRhKQotewotCWlmIChPUEpfRlNFRUsocF91c2VyX2RhdGEscF9uYl9ieXRlcyxTRUVLX0NVUikpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiBwX25iX2J5dGVzOwotfQotCi1zdGF0aWMgT1BKX0JPT0wgb3BqX3NlZWtfZnJvbV9maWxlIChPUEpfT0ZGX1QgcF9uYl9ieXRlcywgRklMRSAqIHBfdXNlcl9kYXRhKQotewotCWlmIChPUEpfRlNFRUsocF91c2VyX2RhdGEscF9uYl9ieXRlcyxTRUVLX1NFVCkpIHsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0KLQlyZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSNpZmRlZiBfV0lOMzIKLSNpZm5kZWYgT1BKX1NUQVRJQwotQk9PTCBBUElFTlRSWQotRGxsTWFpbihISU5TVEFOQ0UgaE1vZHVsZSwgRFdPUkQgdWxfcmVhc29uX2Zvcl9jYWxsLCBMUFZPSUQgbHBSZXNlcnZlZCkgewotCi0JT1BKX0FSR19OT1RfVVNFRChscFJlc2VydmVkKTsKLQlPUEpfQVJHX05PVF9VU0VEKGhNb2R1bGUpOwotCi0Jc3dpdGNoICh1bF9yZWFzb25fZm9yX2NhbGwpIHsKLQkJY2FzZSBETExfUFJPQ0VTU19BVFRBQ0ggOgotCQkJYnJlYWs7Ci0JCWNhc2UgRExMX1BST0NFU1NfREVUQUNIIDoKLQkJCWJyZWFrOwotCQljYXNlIERMTF9USFJFQURfQVRUQUNIIDoKLQkJY2FzZSBETExfVEhSRUFEX0RFVEFDSCA6Ci0JCQlicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLSNlbmRpZiAvKiBPUEpfU1RBVElDICovCi0jZW5kaWYgLyogX1dJTjMyICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotY29uc3QgY2hhciogT1BKX0NBTExDT05WIG9wal92ZXJzaW9uKHZvaWQpIHsKLSAgICByZXR1cm4gT1BKX1BBQ0tBR0VfVkVSU0lPTjsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogREVDT01QUkVTU0lPTiBGVU5DVElPTlMqLwotCi1vcGpfY29kZWNfdCogT1BKX0NBTExDT05WIG9wal9jcmVhdGVfZGVjb21wcmVzcyhPUEpfQ09ERUNfRk9STUFUIHBfZm9ybWF0KQotewotCW9wal9jb2RlY19wcml2YXRlX3QgKmxfY29kZWMgPSAwMDsKLQotCWxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCopIG9wal9jYWxsb2MoMSwgc2l6ZW9mKG9wal9jb2RlY19wcml2YXRlX3QpKTsKLQlpZiAoIWxfY29kZWMpewotCQlyZXR1cm4gMDA7Ci0JfQotCi0JbF9jb2RlYy0+aXNfZGVjb21wcmVzc29yID0gMTsKLQotCXN3aXRjaCAocF9mb3JtYXQpIHsKLQkJY2FzZSBPUEpfQ09ERUNfSjJLOgotCQkJbF9jb2RlYy0+b3BqX2R1bXBfY29kZWMgPSAodm9pZCAoKikgKHZvaWQqLCBPUEpfSU5UMzIsIEZJTEUqKSkgajJrX2R1bXA7Ci0KLQkJCWxfY29kZWMtPm9wal9nZXRfY29kZWNfaW5mbyA9IChvcGpfY29kZXN0cmVhbV9pbmZvX3YyX3QqICgqKSAodm9pZCopICkgajJrX2dldF9jc3RyX2luZm87Ci0KLQkJCWxfY29kZWMtPm9wal9nZXRfY29kZWNfaW5kZXggPSAob3BqX2NvZGVzdHJlYW1faW5kZXhfdCogKCopICh2b2lkKikgKSBqMmtfZ2V0X2NzdHJfaW5kZXg7Ci0KLQkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX2RlY29kZSA9Ci0JCQkJCShPUEpfQk9PTCAoKikgKAl2b2lkICosCi0JCQkJCQkJCQlzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICosCi0JCQkJCQkJCQlvcGpfaW1hZ2VfdCosIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogKSkgb3BqX2oya19kZWNvZGU7Ci0KLQkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX2VuZF9kZWNvbXByZXNzID0KLQkJCQkJKE9QSl9CT09MICgqKSAoCXZvaWQgKiwKLQkJCQkJCQkJCXN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiwKLQkJCQkJCQkJCXN0cnVjdCBvcGpfZXZlbnRfbWdyICopKSBvcGpfajJrX2VuZF9kZWNvbXByZXNzOwotCi0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9yZWFkX2hlYWRlciA9Ci0JCQkJCShPUEpfQk9PTCAoKikgKAlzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICosCi0JCQkJCQkJCQl2b2lkICosCi0JCQkJCQkJCQlvcGpfaW1hZ2VfdCAqKiwKLQkJCQkJCQkJCXN0cnVjdCBvcGpfZXZlbnRfbWdyICogKSkgb3BqX2oya19yZWFkX2hlYWRlcjsKLQotCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfZGVzdHJveSA9Ci0JCQkJCSh2b2lkICgqKSAodm9pZCAqKSlvcGpfajJrX2Rlc3Ryb3k7Ci0KLQkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX3NldHVwX2RlY29kZXIgPQotCQkJCQkodm9pZCAoKikgKHZvaWQgKiAsIG9wal9kcGFyYW1ldGVyc190ICogKSkgb3BqX2oya19zZXR1cF9kZWNvZGVyOwotCi0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9yZWFkX3RpbGVfaGVhZGVyID0KLQkJCQkJKE9QSl9CT09MICgqKSAoCXZvaWQgKiwKLQkJCQkJCQkJCU9QSl9VSU5UMzIqLAotCQkJCQkJCQkJT1BKX1VJTlQzMiosCi0JCQkJCQkJCQlPUEpfSU5UMzIqLCBPUEpfSU5UMzIqLAotCQkJCQkJCQkJT1BKX0lOVDMyKiwgT1BKX0lOVDMyKiwKLQkJCQkJCQkJCU9QSl9VSU5UMzIqLAotCQkJCQkJCQkJT1BKX0JPT0wqLAotCQkJCQkJCQkJc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAotCQkJCQkJCQkJc3RydWN0IG9wal9ldmVudF9tZ3IgKiApKSBvcGpfajJrX3JlYWRfdGlsZV9oZWFkZXI7Ci0KLQkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX2RlY29kZV90aWxlX2RhdGEgPQotCQkJCQkoT1BKX0JPT0wgKCopICggdm9pZCAqLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUqLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKikpIG9wal9qMmtfZGVjb2RlX3RpbGU7Ci0KLQkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX3NldF9kZWNvZGVfYXJlYSA9Ci0JCQkJCShPUEpfQk9PTCAoKikgKCB2b2lkICosIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QqLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiwgT1BKX0lOVDMyLCBPUEpfSU5UMzIsIE9QSl9JTlQzMiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqKSkgb3BqX2oya19zZXRfZGVjb2RlX2FyZWE7Ci0KLQkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX2dldF9kZWNvZGVkX3RpbGUgPSAKLSAgICAgICAgICAgICAgICAgICAgKE9QSl9CT09MICgqKSAoIHZvaWQgKnBfY29kZWMsCi0JCQkJCQkJCSAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9jaW8sCi0JCQkJCQkJCSAgICBvcGpfaW1hZ2VfdCAqcF9pbWFnZSwKLQkJCQkJCQkJICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyLAotCQkJCQkJCQkgICAgT1BKX1VJTlQzMiB0aWxlX2luZGV4KSkgb3BqX2oya19nZXRfdGlsZTsKLQotCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfc2V0X2RlY29kZWRfcmVzb2x1dGlvbl9mYWN0b3IgPSAKLSAgICAgICAgICAgICAgICAgICAgKE9QSl9CT09MICgqKSAoIHZvaWQgKiBwX2NvZGVjLAotCQkJCQkJCQkJT1BKX1VJTlQzMiByZXNfZmFjdG9yLAotCQkJCQkJCQkJc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIpKSBvcGpfajJrX3NldF9kZWNvZGVkX3Jlc29sdXRpb25fZmFjdG9yOwotCi0JCQlsX2NvZGVjLT5tX2NvZGVjID0gb3BqX2oya19jcmVhdGVfZGVjb21wcmVzcygpOwotCi0JCQlpZiAoISBsX2NvZGVjLT5tX2NvZGVjKSB7Ci0JCQkJb3BqX2ZyZWUobF9jb2RlYyk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0KLQkJCWJyZWFrOwotCi0JCWNhc2UgT1BKX0NPREVDX0pQMjoKLQkJCS8qIGdldCBhIEpQMiBkZWNvZGVyIGhhbmRsZSAqLwotCQkJbF9jb2RlYy0+b3BqX2R1bXBfY29kZWMgPSAodm9pZCAoKikgKHZvaWQqLCBPUEpfSU5UMzIsIEZJTEUqKSkganAyX2R1bXA7Ci0KLQkJCWxfY29kZWMtPm9wal9nZXRfY29kZWNfaW5mbyA9IChvcGpfY29kZXN0cmVhbV9pbmZvX3YyX3QqICgqKSAodm9pZCopICkganAyX2dldF9jc3RyX2luZm87Ci0KLQkJCWxfY29kZWMtPm9wal9nZXRfY29kZWNfaW5kZXggPSAob3BqX2NvZGVzdHJlYW1faW5kZXhfdCogKCopICh2b2lkKikgKSBqcDJfZ2V0X2NzdHJfaW5kZXg7Ci0KLQkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX2RlY29kZSA9Ci0JCQkJCShPUEpfQk9PTCAoKikgKAl2b2lkICosCi0JCQkJCQkJCQlzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICosCi0JCQkJCQkJCQlvcGpfaW1hZ2VfdCosCi0JCQkJCQkJCQlzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqICkpIG9wal9qcDJfZGVjb2RlOwotCi0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9lbmRfZGVjb21wcmVzcyA9ICAKLSAgICAgICAgICAgICAgICAgICAgKE9QSl9CT09MICgqKSAoIHZvaWQgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICopKSBvcGpfanAyX2VuZF9kZWNvbXByZXNzOwotCi0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9yZWFkX2hlYWRlciA9ICAKLSAgICAgICAgICAgICAgICAgICAgKE9QSl9CT09MICgqKSAoIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiwKLQkJCQkJICAgICAgICAgICAgICAgIHZvaWQgKiwKLQkJCQkJICAgICAgICAgICAgICAgIG9wal9pbWFnZV90ICoqLAotCQkJCQkgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiApKSBvcGpfanAyX3JlYWRfaGVhZGVyOwotCi0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9yZWFkX3RpbGVfaGVhZGVyID0gCi0gICAgICAgICAgICAgICAgICAgIChPUEpfQk9PTCAoKikgKCB2b2lkICosCi0JCQkJCSAgICAgICAgICAgICAgICBPUEpfVUlOVDMyKiwKLQkJCQkJICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIqLAotCQkJCQkgICAgICAgICAgICAgICAgT1BKX0lOVDMyKiwKLQkJCQkJICAgICAgICAgICAgICAgIE9QSl9JTlQzMiosCi0JCQkJCSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiAsCi0JCQkJCSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiAsCi0JCQkJCSAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogLAotCQkJCQkgICAgICAgICAgICAgICAgT1BKX0JPT0wgKiwKLQkJCQkJICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiwKLQkJCQkJICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogKSkgb3BqX2pwMl9yZWFkX3RpbGVfaGVhZGVyOwotCi0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9kZWNvZGVfdGlsZV9kYXRhID0gCi0gICAgICAgICAgICAgICAgICAgIChPUEpfQk9PTCAoKikgKCB2b2lkICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyLE9QSl9CWVRFKixPUEpfVUlOVDMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiApKSBvcGpfanAyX2RlY29kZV90aWxlOwotCi0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9kZXN0cm95ID0gKHZvaWQgKCopICh2b2lkICopKW9wal9qcDJfZGVzdHJveTsKLQotCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfc2V0dXBfZGVjb2RlciA9IAotICAgICAgICAgICAgICAgICAgICAodm9pZCAoKikgKHZvaWQgKiAsb3BqX2RwYXJhbWV0ZXJzX3QgKiApKSBvcGpfanAyX3NldHVwX2RlY29kZXI7Ci0KLQkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX3NldF9kZWNvZGVfYXJlYSA9IAotICAgICAgICAgICAgICAgICAgICAoT1BKX0JPT0wgKCopICggdm9pZCAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QqLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMixPUEpfSU5UMzIsT1BKX0lOVDMyLE9QSl9JTlQzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogKSkgb3BqX2pwMl9zZXRfZGVjb2RlX2FyZWE7Ci0KLQkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX2dldF9kZWNvZGVkX3RpbGUgPSAKLSAgICAgICAgICAgICAgICAgICAgKE9QSl9CT09MICgqKSAoIHZvaWQgKnBfY29kZWMsCi0JCQkJCQkJCQlvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9jaW8sCi0JCQkJCQkJCQlvcGpfaW1hZ2VfdCAqcF9pbWFnZSwKLQkJCQkJCQkJCXN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyLAotCQkJCQkJCQkJT1BKX1VJTlQzMiB0aWxlX2luZGV4KSkgb3BqX2pwMl9nZXRfdGlsZTsKLQotCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfc2V0X2RlY29kZWRfcmVzb2x1dGlvbl9mYWN0b3IgPSAKLSAgICAgICAgICAgICAgICAgICAgKE9QSl9CT09MICgqKSAoIHZvaWQgKiBwX2NvZGVjLAotCQkJCQkJICAgIAkJT1BKX1VJTlQzMiByZXNfZmFjdG9yLAotCQkJCQkJCSAgICAJb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKSkgb3BqX2pwMl9zZXRfZGVjb2RlZF9yZXNvbHV0aW9uX2ZhY3RvcjsKLQotCQkJbF9jb2RlYy0+bV9jb2RlYyA9IG9wal9qcDJfY3JlYXRlKE9QSl9UUlVFKTsKLQotCQkJaWYgKCEgbF9jb2RlYy0+bV9jb2RlYykgewotCQkJCW9wal9mcmVlKGxfY29kZWMpOwotCQkJCXJldHVybiAwMDsKLQkJCX0KLQotCQkJYnJlYWs7Ci0JCWNhc2UgT1BKX0NPREVDX1VOS05PV046Ci0JCWNhc2UgT1BKX0NPREVDX0pQVDoKLQkJZGVmYXVsdDoKLQkJCW9wal9mcmVlKGxfY29kZWMpOwotCQkJcmV0dXJuIDAwOwotCX0KLQotCW9wal9zZXRfZGVmYXVsdF9ldmVudF9oYW5kbGVyKCYobF9jb2RlYy0+bV9ldmVudF9tZ3IpKTsKLQlyZXR1cm4gKG9wal9jb2RlY190KikgbF9jb2RlYzsKLX0KLQotdm9pZCBPUEpfQ0FMTENPTlYgb3BqX3NldF9kZWZhdWx0X2RlY29kZXJfcGFyYW1ldGVycyhvcGpfZHBhcmFtZXRlcnNfdCAqcGFyYW1ldGVycykgewotCWlmKHBhcmFtZXRlcnMpIHsKLQkJbWVtc2V0KHBhcmFtZXRlcnMsIDAsIHNpemVvZihvcGpfZHBhcmFtZXRlcnNfdCkpOwotCQkvKiBkZWZhdWx0IGRlY29kaW5nIHBhcmFtZXRlcnMgKi8KLQkJcGFyYW1ldGVycy0+Y3BfbGF5ZXIgPSAwOwotCQlwYXJhbWV0ZXJzLT5jcF9yZWR1Y2UgPSAwOwotCi0JCXBhcmFtZXRlcnMtPmRlY29kX2Zvcm1hdCA9IC0xOwotCQlwYXJhbWV0ZXJzLT5jb2RfZm9ybWF0ID0gLTE7Ci0JCXBhcmFtZXRlcnMtPmZsYWdzID0gMDsJCQotLyogVW5pUEc+PiAqLwotI2lmZGVmIFVTRV9KUFdMCi0JCXBhcmFtZXRlcnMtPmpwd2xfY29ycmVjdCA9IE9QSl9GQUxTRTsKLQkJcGFyYW1ldGVycy0+anB3bF9leHBfY29tcHMgPSBKUFdMX0VYUEVDVEVEX0NPTVBPTkVOVFM7Ci0JCXBhcmFtZXRlcnMtPmpwd2xfbWF4X3RpbGVzID0gSlBXTF9NQVhJTVVNX1RJTEVTOwotI2VuZGlmIC8qIFVTRV9KUFdMICovCi0vKiA8PFVuaVBHICovCi0JfQotfQotCi1PUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3NldHVwX2RlY29kZXIob3BqX2NvZGVjX3QgKnBfY29kZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2RwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMgCi0JCQkJCQkJCQkJKQotewotCWlmIChwX2NvZGVjICYmIHBhcmFtZXRlcnMpIHsgCi0JCW9wal9jb2RlY19wcml2YXRlX3QgKiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QgKikgcF9jb2RlYzsKLQotCQlpZiAoISBsX2NvZGVjLT5pc19kZWNvbXByZXNzb3IpIHsKLQkJCW9wal9ldmVudF9tc2coJihsX2NvZGVjLT5tX2V2ZW50X21nciksIEVWVF9FUlJPUiwgCi0gICAgICAgICAgICAgICAgIkNvZGVjIHByb3ZpZGVkIHRvIHRoZSBvcGpfc2V0dXBfZGVjb2RlciBmdW5jdGlvbiBpcyBub3QgYSBkZWNvbXByZXNzb3IgaGFuZGxlci5cbiIpOwotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCi0JCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX3NldHVwX2RlY29kZXIobF9jb2RlYy0+bV9jb2RlYywKLQkJCQkJCQkJCQkJCQkJCQlwYXJhbWV0ZXJzKTsKLQkJcmV0dXJuIE9QSl9UUlVFOwotCX0KLQlyZXR1cm4gT1BKX0ZBTFNFOwotfQotCi1PUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3JlYWRfaGVhZGVyICgJb3BqX3N0cmVhbV90ICpwX3N0cmVhbSwKLQkJCQkJCQkJCQlvcGpfY29kZWNfdCAqcF9jb2RlYywKLQkJCQkJCQkJCQlvcGpfaW1hZ2VfdCAqKnBfaW1hZ2UgKQotewotCWlmIChwX2NvZGVjICYmIHBfc3RyZWFtKSB7Ci0JCW9wal9jb2RlY19wcml2YXRlX3QqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCopIHBfY29kZWM7Ci0JCW9wal9zdHJlYW1fcHJpdmF0ZV90KiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCopIHBfc3RyZWFtOwotCi0JCWlmKCEgbF9jb2RlYy0+aXNfZGVjb21wcmVzc29yKSB7Ci0JCQlvcGpfZXZlbnRfbXNnKCYobF9jb2RlYy0+bV9ldmVudF9tZ3IpLCBFVlRfRVJST1IsIAotICAgICAgICAgICAgICAgICJDb2RlYyBwcm92aWRlZCB0byB0aGUgb3BqX3JlYWRfaGVhZGVyIGZ1bmN0aW9uIGlzIG5vdCBhIGRlY29tcHJlc3NvciBoYW5kbGVyLlxuIik7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9Ci0KLQkJcmV0dXJuIGxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX3JlYWRfaGVhZGVyKAlsX3N0cmVhbSwKLQkJCQkJCQkJCQkJCQkJCQkJCWxfY29kZWMtPm1fY29kZWMsCi0JCQkJCQkJCQkJCQkJCQkJCQlwX2ltYWdlLAotCQkJCQkJCQkJCQkJCQkJCQkJJihsX2NvZGVjLT5tX2V2ZW50X21ncikgKTsKLQl9Ci0KLQlyZXR1cm4gT1BKX0ZBTFNFOwotfQotCi1PUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX2RlY29kZSggICBvcGpfY29kZWNfdCAqcF9jb2RlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCogcF9pbWFnZSkKLXsKLQlpZiAocF9jb2RlYyAmJiBwX3N0cmVhbSkgewotCQlvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfY29kZWM7Ci0JCW9wal9zdHJlYW1fcHJpdmF0ZV90ICogbF9zdHJlYW0gPSAob3BqX3N0cmVhbV9wcml2YXRlX3QgKikgcF9zdHJlYW07Ci0KLQkJaWYgKCEgbF9jb2RlYy0+aXNfZGVjb21wcmVzc29yKSB7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9Ci0KLQkJcmV0dXJuIGxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX2RlY29kZShsX2NvZGVjLT5tX2NvZGVjLAotCQkJCQkJCQkJCQkJCQkJCWxfc3RyZWFtLAotCQkJCQkJCQkJCQkJCQkJCXBfaW1hZ2UsCi0JCQkJCQkJCQkJCQkJCQkJJihsX2NvZGVjLT5tX2V2ZW50X21ncikgKTsKLQl9Ci0KLQlyZXR1cm4gT1BKX0ZBTFNFOwotfQotCi1PUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3NldF9kZWNvZGVfYXJlYSgJb3BqX2NvZGVjX3QgKnBfY29kZWMsCi0JCQkJCQkJCQkJCW9wal9pbWFnZV90KiBwX2ltYWdlLAotCQkJCQkJCQkJCQlPUEpfSU5UMzIgcF9zdGFydF94LCBPUEpfSU5UMzIgcF9zdGFydF95LAotCQkJCQkJCQkJCQlPUEpfSU5UMzIgcF9lbmRfeCwgT1BKX0lOVDMyIHBfZW5kX3kKLQkJCQkJCQkJCQkJKQotewotCWlmIChwX2NvZGVjKSB7Ci0JCW9wal9jb2RlY19wcml2YXRlX3QgKiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QgKikgcF9jb2RlYzsKLQkJCi0JCWlmICghIGxfY29kZWMtPmlzX2RlY29tcHJlc3NvcikgewotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCi0JCXJldHVybiAgbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfc2V0X2RlY29kZV9hcmVhKAlsX2NvZGVjLT5tX2NvZGVjLAotCQkJCQkJCQkJCQkJCQkJCQkJCXBfaW1hZ2UsCi0JCQkJCQkJCQkJCQkJCQkJCQkJcF9zdGFydF94LCBwX3N0YXJ0X3ksCi0JCQkJCQkJCQkJCQkJCQkJCQkJcF9lbmRfeCwgcF9lbmRfeSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkmKGxfY29kZWMtPm1fZXZlbnRfbWdyKSApOwotCX0KLQlyZXR1cm4gT1BKX0ZBTFNFOwotfQotCi1PUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3JlYWRfdGlsZV9oZWFkZXIoCW9wal9jb2RlY190ICpwX2NvZGVjLAotCQkJCQkJCQkJCQlvcGpfc3RyZWFtX3QgKiBwX3N0cmVhbSwKLQkJCQkJCQkJCQkJT1BKX1VJTlQzMiAqIHBfdGlsZV9pbmRleCwKLQkJCQkJCQkJCQkJT1BKX1VJTlQzMiAqIHBfZGF0YV9zaXplLAotCQkJCQkJCQkJCQlPUEpfSU5UMzIgKiBwX3RpbGVfeDAsIE9QSl9JTlQzMiAqIHBfdGlsZV95MCwKLQkJCQkJCQkJCQkJT1BKX0lOVDMyICogcF90aWxlX3gxLCBPUEpfSU5UMzIgKiBwX3RpbGVfeTEsCi0JCQkJCQkJCQkJCU9QSl9VSU5UMzIgKiBwX25iX2NvbXBzLAotCQkJCQkJCQkJCQlPUEpfQk9PTCAqIHBfc2hvdWxkX2dvX29uKQotewotCWlmIChwX2NvZGVjICYmIHBfc3RyZWFtICYmIHBfZGF0YV9zaXplICYmIHBfdGlsZV9pbmRleCkgewotCQlvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfY29kZWM7Ci0JCW9wal9zdHJlYW1fcHJpdmF0ZV90ICogbF9zdHJlYW0gPSAob3BqX3N0cmVhbV9wcml2YXRlX3QgKikgcF9zdHJlYW07Ci0KLQkJaWYgKCEgbF9jb2RlYy0+aXNfZGVjb21wcmVzc29yKSB7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9Ci0KLQkJcmV0dXJuIGxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX3JlYWRfdGlsZV9oZWFkZXIoCWxfY29kZWMtPm1fY29kZWMsCi0JCQkJCQkJCQkJCQkJCQkJCQkJcF90aWxlX2luZGV4LAotCQkJCQkJCQkJCQkJCQkJCQkJCXBfZGF0YV9zaXplLAotCQkJCQkJCQkJCQkJCQkJCQkJCXBfdGlsZV94MCwgcF90aWxlX3kwLAotCQkJCQkJCQkJCQkJCQkJCQkJCXBfdGlsZV94MSwgcF90aWxlX3kxLAotCQkJCQkJCQkJCQkJCQkJCQkJCXBfbmJfY29tcHMsCi0JCQkJCQkJCQkJCQkJCQkJCQkJcF9zaG91bGRfZ29fb24sCi0JCQkJCQkJCQkJCQkJCQkJCQkJbF9zdHJlYW0sCi0JCQkJCQkJCQkJCQkJCQkJCQkJJihsX2NvZGVjLT5tX2V2ZW50X21ncikpOwotCX0KLQlyZXR1cm4gT1BKX0ZBTFNFOwotfQotCi1PUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX2RlY29kZV90aWxlX2RhdGEoCW9wal9jb2RlY190ICpwX2NvZGVjLAotCQkJCQkJCQkJCQlPUEpfVUlOVDMyIHBfdGlsZV9pbmRleCwKLQkJCQkJCQkJCQkJT1BKX0JZVEUgKiBwX2RhdGEsCi0JCQkJCQkJCQkJCU9QSl9VSU5UMzIgcF9kYXRhX3NpemUsCi0JCQkJCQkJCQkJCW9wal9zdHJlYW1fdCAqcF9zdHJlYW0KLQkJCQkJCQkJCQkJKQotewotCWlmIChwX2NvZGVjICYmIHBfZGF0YSAmJiBwX3N0cmVhbSkgewotCQlvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfY29kZWM7Ci0JCW9wal9zdHJlYW1fcHJpdmF0ZV90ICogbF9zdHJlYW0gPSAob3BqX3N0cmVhbV9wcml2YXRlX3QgKikgcF9zdHJlYW07Ci0KLQkJaWYgKCEgbF9jb2RlYy0+aXNfZGVjb21wcmVzc29yKSB7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9Ci0KLQkJcmV0dXJuIGxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX2RlY29kZV90aWxlX2RhdGEoCWxfY29kZWMtPm1fY29kZWMsCi0JCQkJCQkJCQkJCQkJCQkJCQkJcF90aWxlX2luZGV4LAotCQkJCQkJCQkJCQkJCQkJCQkJCXBfZGF0YSwKLQkJCQkJCQkJCQkJCQkJCQkJCQlwX2RhdGFfc2l6ZSwKLQkJCQkJCQkJCQkJCQkJCQkJCQlsX3N0cmVhbSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkmKGxfY29kZWMtPm1fZXZlbnRfbWdyKSApOwotCX0KLQlyZXR1cm4gT1BKX0ZBTFNFOwotfQotCi1PUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX2dldF9kZWNvZGVkX3RpbGUoCW9wal9jb2RlY190ICpwX2NvZGVjLAotCQkJCQkJCQkJCQlvcGpfc3RyZWFtX3QgKnBfc3RyZWFtLAotCQkJCQkJCQkJCQlvcGpfaW1hZ2VfdCAqcF9pbWFnZSwKLQkJCQkJCQkJCQkJT1BKX1VJTlQzMiB0aWxlX2luZGV4KQotewotCWlmIChwX2NvZGVjICYmIHBfc3RyZWFtKSB7Ci0JCW9wal9jb2RlY19wcml2YXRlX3QgKiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QgKikgcF9jb2RlYzsKLQkJb3BqX3N0cmVhbV9wcml2YXRlX3QgKiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqKSBwX3N0cmVhbTsKLQotCQlpZiAoISBsX2NvZGVjLT5pc19kZWNvbXByZXNzb3IpIHsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KLQkJCi0JCXJldHVybiBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9nZXRfZGVjb2RlZF90aWxlKAlsX2NvZGVjLT5tX2NvZGVjLAotCQkJCQkJCQkJCQkJCQkJCQkJCWxfc3RyZWFtLAotCQkJCQkJCQkJCQkJCQkJCQkJCXBfaW1hZ2UsCi0JCQkJCQkJCQkJCQkJCQkJCQkJJihsX2NvZGVjLT5tX2V2ZW50X21nciksCi0JCQkJCQkJCQkJCQkJCQkJCQkJdGlsZV9pbmRleCk7Ci0JfQotCi0JcmV0dXJuIE9QSl9GQUxTRTsKLX0KLQotT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9zZXRfZGVjb2RlZF9yZXNvbHV0aW9uX2ZhY3RvcihvcGpfY29kZWNfdCAqcF9jb2RlYywgCi0JCQkJCQkJCQkJCQkJCU9QSl9VSU5UMzIgcmVzX2ZhY3RvciApCi17Ci0Jb3BqX2NvZGVjX3ByaXZhdGVfdCAqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCAqKSBwX2NvZGVjOwotCi0JaWYgKCAhbF9jb2RlYyApewotCQlmcHJpbnRmKHN0ZGVyciwgIltFUlJPUl0gSW5wdXQgcGFyYW1ldGVycyBvZiB0aGUgc2V0dXBfZGVjb2RlciBmdW5jdGlvbiBhcmUgaW5jb3JyZWN0LlxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCi0JbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfc2V0X2RlY29kZWRfcmVzb2x1dGlvbl9mYWN0b3IobF9jb2RlYy0+bV9jb2RlYywgCi0JCQkJCQkJCQkJCQkJCQkJCQkJcmVzX2ZhY3RvciwKLQkJCQkJCQkJCQkJCQkJCQkJCQkmKGxfY29kZWMtPm1fZXZlbnRfbWdyKSApOwotCXJldHVybiBPUEpfVFJVRTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogQ09NUFJFU1NJT04gRlVOQ1RJT05TKi8KLQotb3BqX2NvZGVjX3QqIE9QSl9DQUxMQ09OViBvcGpfY3JlYXRlX2NvbXByZXNzKE9QSl9DT0RFQ19GT1JNQVQgcF9mb3JtYXQpCi17Ci0Jb3BqX2NvZGVjX3ByaXZhdGVfdCAqbF9jb2RlYyA9IDAwOwotCi0JbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90KilvcGpfY2FsbG9jKDEsIHNpemVvZihvcGpfY29kZWNfcHJpdmF0ZV90KSk7Ci0JaWYgKCFsX2NvZGVjKSB7Ci0JCXJldHVybiAwMDsKLQl9Ci0JCi0JbF9jb2RlYy0+aXNfZGVjb21wcmVzc29yID0gMDsKLQotCXN3aXRjaChwX2Zvcm1hdCkgewotCQljYXNlIE9QSl9DT0RFQ19KMks6Ci0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfZW5jb2RlID0gKE9QSl9CT09MICgqKSAodm9pZCAqLAotCQkJCQkJCQkJCQkJCQkJCQkJCXN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiwKLQkJCQkJCQkJCQkJCQkJCQkJCQlzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqICkpIG9wal9qMmtfZW5jb2RlOwotCi0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfZW5kX2NvbXByZXNzID0gKE9QSl9CT09MICgqKSAoCXZvaWQgKiwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCXN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCXN0cnVjdCBvcGpfZXZlbnRfbWdyICopKSBvcGpfajJrX2VuZF9jb21wcmVzczsKLQotCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX3N0YXJ0X2NvbXByZXNzID0gKE9QSl9CT09MICgqKSAodm9pZCAqLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJc3RydWN0IG9wal9pbWFnZSAqICwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCXN0cnVjdCBvcGpfZXZlbnRfbWdyICopKSBvcGpfajJrX3N0YXJ0X2NvbXByZXNzOwotCi0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfd3JpdGVfdGlsZSA9IChPUEpfQk9PTCAoKikgKHZvaWQgKiwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJT1BKX1VJTlQzMiwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJT1BKX0JZVEUqLAotCQkJCQkJCQkJCQkJCQkJCQkJCQlPUEpfVUlOVDMyLAotCQkJCQkJCQkJCQkJCQkJCQkJCQlzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICosCi0JCQkJCQkJCQkJCQkJCQkJCQkJCXN0cnVjdCBvcGpfZXZlbnRfbWdyICopICkgb3BqX2oya193cml0ZV90aWxlOwotCi0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfZGVzdHJveSA9ICh2b2lkICgqKSAodm9pZCAqKSkgb3BqX2oya19kZXN0cm95OwotCi0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfc2V0dXBfZW5jb2RlciA9IChPUEpfQk9PTCAoKikgKAl2b2lkICosCi0JCQkJCQkJCQkJCQkJCQkJCQkJCW9wal9jcGFyYW1ldGVyc190ICosCi0JCQkJCQkJCQkJCQkJCQkJCQkJCXN0cnVjdCBvcGpfaW1hZ2UgKiwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJc3RydWN0IG9wal9ldmVudF9tZ3IgKiApKSBvcGpfajJrX3NldHVwX2VuY29kZXI7Ci0KLQkJCWxfY29kZWMtPm1fY29kZWMgPSBvcGpfajJrX2NyZWF0ZV9jb21wcmVzcygpOwotCQkJaWYgKCEgbF9jb2RlYy0+bV9jb2RlYykgewotCQkJCW9wal9mcmVlKGxfY29kZWMpOwotCQkJCXJldHVybiAwMDsKLQkJCX0KLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBPUEpfQ09ERUNfSlAyOgotCQkJLyogZ2V0IGEgSlAyIGRlY29kZXIgaGFuZGxlICovCi0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfZW5jb2RlID0gKE9QSl9CT09MICgqKSAodm9pZCAqLAotCQkJCQkJCQkJCQkJCQkJCQkJCXN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiwKLQkJCQkJCQkJCQkJCQkJCQkJCQlzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqICkpIG9wal9qcDJfZW5jb2RlOwotCi0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfZW5kX2NvbXByZXNzID0gKE9QSl9CT09MICgqKSAoCXZvaWQgKiwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCXN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCXN0cnVjdCBvcGpfZXZlbnRfbWdyICopKSBvcGpfanAyX2VuZF9jb21wcmVzczsKLQotCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX3N0YXJ0X2NvbXByZXNzID0gKE9QSl9CT09MICgqKSAodm9pZCAqLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJc3RydWN0IG9wal9pbWFnZSAqICwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCXN0cnVjdCBvcGpfZXZlbnRfbWdyICopKSAgb3BqX2pwMl9zdGFydF9jb21wcmVzczsKLQotCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX3dyaXRlX3RpbGUgPSAoT1BKX0JPT0wgKCopICh2b2lkICosCi0JCQkJCQkJCQkJCQkJCQkJCQkJCU9QSl9VSU5UMzIsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCU9QSl9CWVRFKiwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJT1BKX1VJTlQzMiwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAotCQkJCQkJCQkJCQkJCQkJCQkJCQlzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqKSkgb3BqX2pwMl93cml0ZV90aWxlOwotCi0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfZGVzdHJveSA9ICh2b2lkICgqKSAodm9pZCAqKSkgb3BqX2pwMl9kZXN0cm95OwotCi0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfc2V0dXBfZW5jb2RlciA9IChPUEpfQk9PTCAoKikgKAl2b2lkICosCi0JCQkJCQkJCQkJCQkJCQkJCQkJCW9wal9jcGFyYW1ldGVyc190ICosCi0JCQkJCQkJCQkJCQkJCQkJCQkJCXN0cnVjdCBvcGpfaW1hZ2UgKiwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJc3RydWN0IG9wal9ldmVudF9tZ3IgKiApKSBvcGpfanAyX3NldHVwX2VuY29kZXI7Ci0KLQkJCWxfY29kZWMtPm1fY29kZWMgPSBvcGpfanAyX2NyZWF0ZShPUEpfRkFMU0UpOwotCQkJaWYgKCEgbF9jb2RlYy0+bV9jb2RlYykgewotCQkJCW9wal9mcmVlKGxfY29kZWMpOwotCQkJCXJldHVybiAwMDsKLQkJCX0KLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBPUEpfQ09ERUNfVU5LTk9XTjoKLQkJY2FzZSBPUEpfQ09ERUNfSlBUOgotCQlkZWZhdWx0OgotCQkJb3BqX2ZyZWUobF9jb2RlYyk7Ci0JCQlyZXR1cm4gMDA7Ci0JfQotCi0Jb3BqX3NldF9kZWZhdWx0X2V2ZW50X2hhbmRsZXIoJihsX2NvZGVjLT5tX2V2ZW50X21ncikpOwotCXJldHVybiAob3BqX2NvZGVjX3QqKSBsX2NvZGVjOwotfQotCi12b2lkIE9QSl9DQUxMQ09OViBvcGpfc2V0X2RlZmF1bHRfZW5jb2Rlcl9wYXJhbWV0ZXJzKG9wal9jcGFyYW1ldGVyc190ICpwYXJhbWV0ZXJzKSB7Ci0JaWYocGFyYW1ldGVycykgewotCQltZW1zZXQocGFyYW1ldGVycywgMCwgc2l6ZW9mKG9wal9jcGFyYW1ldGVyc190KSk7Ci0JCS8qIGRlZmF1bHQgY29kaW5nIHBhcmFtZXRlcnMgKi8KLSAgICAgICAgcGFyYW1ldGVycy0+Y3BfY2luZW1hID0gT1BKX09GRjsgLyogREVQUkVDQVRFRCAqLwotICAgICAgICBwYXJhbWV0ZXJzLT5yc2l6ID0gT1BKX1BST0ZJTEVfTk9ORTsKLQkJcGFyYW1ldGVycy0+bWF4X2NvbXBfc2l6ZSA9IDA7Ci0JCXBhcmFtZXRlcnMtPm51bXJlc29sdXRpb24gPSA2OwotICAgICAgICBwYXJhbWV0ZXJzLT5jcF9yc2l6ID0gT1BKX1NURF9SU0laOyAvKiBERVBSRUNBVEVEICovCi0JCXBhcmFtZXRlcnMtPmNibG9ja3dfaW5pdCA9IDY0OwotCQlwYXJhbWV0ZXJzLT5jYmxvY2toX2luaXQgPSA2NDsKLQkJcGFyYW1ldGVycy0+cHJvZ19vcmRlciA9IE9QSl9MUkNQOwotCQlwYXJhbWV0ZXJzLT5yb2lfY29tcG5vID0gLTE7CQkvKiBubyBST0kgKi8KLQkJcGFyYW1ldGVycy0+c3Vic2FtcGxpbmdfZHggPSAxOwotCQlwYXJhbWV0ZXJzLT5zdWJzYW1wbGluZ19keSA9IDE7Ci0JCXBhcmFtZXRlcnMtPnRwX29uID0gMDsKLQkJcGFyYW1ldGVycy0+ZGVjb2RfZm9ybWF0ID0gLTE7Ci0JCXBhcmFtZXRlcnMtPmNvZF9mb3JtYXQgPSAtMTsKLQkJcGFyYW1ldGVycy0+dGNwX3JhdGVzWzBdID0gMDsgICAKLQkJcGFyYW1ldGVycy0+dGNwX251bWxheWVycyA9IDA7Ci0JCXBhcmFtZXRlcnMtPmNwX2Rpc3RvX2FsbG9jID0gMDsKLQkJcGFyYW1ldGVycy0+Y3BfZml4ZWRfYWxsb2MgPSAwOwotCQlwYXJhbWV0ZXJzLT5jcF9maXhlZF9xdWFsaXR5ID0gMDsKLQkJcGFyYW1ldGVycy0+anBpcF9vbiA9IE9QSl9GQUxTRTsKLS8qIFVuaVBHPj4gKi8KLSNpZmRlZiBVU0VfSlBXTAotCQlwYXJhbWV0ZXJzLT5qcHdsX2VwY19vbiA9IE9QSl9GQUxTRTsKLQkJcGFyYW1ldGVycy0+anB3bF9ocHJvdF9NSCA9IC0xOyAvKiAtMSBtZWFucyB1bmFzc2lnbmVkICovCi0JCXsKLQkJCWludCBpOwotCQkJZm9yIChpID0gMDsgaSA8IEpQV0xfTUFYX05PX1RJTEVTUEVDUzsgaSsrKSB7Ci0JCQkJcGFyYW1ldGVycy0+anB3bF9ocHJvdF9UUEhfdGlsZW5vW2ldID0gLTE7IC8qIHVuYXNzaWduZWQgKi8KLQkJCQlwYXJhbWV0ZXJzLT5qcHdsX2hwcm90X1RQSFtpXSA9IDA7IC8qIGFic2VudCAqLwotCQkJfQotCQl9OwotCQl7Ci0JCQlpbnQgaTsKLQkJCWZvciAoaSA9IDA7IGkgPCBKUFdMX01BWF9OT19QQUNLU1BFQ1M7IGkrKykgewotCQkJCXBhcmFtZXRlcnMtPmpwd2xfcHByb3RfdGlsZW5vW2ldID0gLTE7IC8qIHVuYXNzaWduZWQgKi8KLQkJCQlwYXJhbWV0ZXJzLT5qcHdsX3Bwcm90X3BhY2tub1tpXSA9IC0xOyAvKiB1bmFzc2lnbmVkICovCi0JCQkJcGFyYW1ldGVycy0+anB3bF9wcHJvdFtpXSA9IDA7IC8qIGFic2VudCAqLwotCQkJfQotCQl9OwotCQlwYXJhbWV0ZXJzLT5qcHdsX3NlbnNfc2l6ZSA9IDA7IC8qIDAgbWVhbnMgbm8gRVNEICovCi0JCXBhcmFtZXRlcnMtPmpwd2xfc2Vuc19hZGRyID0gMDsgLyogMCBtZWFucyBhdXRvICovCi0JCXBhcmFtZXRlcnMtPmpwd2xfc2Vuc19yYW5nZSA9IDA7IC8qIDAgbWVhbnMgcGFja2V0ICovCi0JCXBhcmFtZXRlcnMtPmpwd2xfc2Vuc19NSCA9IC0xOyAvKiAtMSBtZWFucyB1bmFzc2lnbmVkICovCi0JCXsKLQkJCWludCBpOwotCQkJZm9yIChpID0gMDsgaSA8IEpQV0xfTUFYX05PX1RJTEVTUEVDUzsgaSsrKSB7Ci0JCQkJcGFyYW1ldGVycy0+anB3bF9zZW5zX1RQSF90aWxlbm9baV0gPSAtMTsgLyogdW5hc3NpZ25lZCAqLwotCQkJCXBhcmFtZXRlcnMtPmpwd2xfc2Vuc19UUEhbaV0gPSAtMTsgLyogYWJzZW50ICovCi0JCQl9Ci0JCX07Ci0jZW5kaWYgLyogVVNFX0pQV0wgKi8KLS8qIDw8VW5pUEcgKi8KLQl9Ci19Ci0KLU9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfc2V0dXBfZW5jb2RlcihvcGpfY29kZWNfdCAqcF9jb2RlYywgCi0JCQkJCQkJCQkJb3BqX2NwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMsIAotCQkJCQkJCQkJCW9wal9pbWFnZV90ICpwX2ltYWdlKQotewotCWlmIChwX2NvZGVjICYmIHBhcmFtZXRlcnMgJiYgcF9pbWFnZSkgewotCQlvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfY29kZWM7Ci0KLQkJaWYgKCEgbF9jb2RlYy0+aXNfZGVjb21wcmVzc29yKSB7Ci0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfc2V0dXBfZW5jb2RlcigJbF9jb2RlYy0+bV9jb2RlYywKLQkJCQkJCQkJCQkJCQkJCQkJcGFyYW1ldGVycywKLQkJCQkJCQkJCQkJCQkJCQkJcF9pbWFnZSwKLQkJCQkJCQkJCQkJCQkJCQkJJihsX2NvZGVjLT5tX2V2ZW50X21ncikgKTsKLQkJCXJldHVybiBPUEpfVFJVRTsKLQkJfQotCX0KLQotCXJldHVybiBPUEpfRkFMU0U7Ci19Ci0KLU9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfc3RhcnRfY29tcHJlc3MgKAlvcGpfY29kZWNfdCAqcF9jb2RlYywKLQkJCQkJCQkJCQkJb3BqX2ltYWdlX3QgKiBwX2ltYWdlLAotCQkJCQkJCQkJCQlvcGpfc3RyZWFtX3QgKnBfc3RyZWFtKQotewotCWlmIChwX2NvZGVjICYmIHBfc3RyZWFtKSB7Ci0JCW9wal9jb2RlY19wcml2YXRlX3QgKiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QgKikgcF9jb2RlYzsKLQkJb3BqX3N0cmVhbV9wcml2YXRlX3QgKiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqKSBwX3N0cmVhbTsKLQotCQlpZiAoISBsX2NvZGVjLT5pc19kZWNvbXByZXNzb3IpIHsKLQkJCXJldHVybiBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfc3RhcnRfY29tcHJlc3MoCWxfY29kZWMtPm1fY29kZWMsCi0JCQkJCQkJCQkJCQkJCQkJCQkJbF9zdHJlYW0sCi0JCQkJCQkJCQkJCQkJCQkJCQkJcF9pbWFnZSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkmKGxfY29kZWMtPm1fZXZlbnRfbWdyKSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gT1BKX0ZBTFNFOwotfQotCi1PUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX2VuY29kZShvcGpfY29kZWNfdCAqcF9pbmZvLCBvcGpfc3RyZWFtX3QgKnBfc3RyZWFtKQotewotCWlmIChwX2luZm8gJiYgcF9zdHJlYW0pIHsKLQkJb3BqX2NvZGVjX3ByaXZhdGVfdCAqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCAqKSBwX2luZm87Ci0JCW9wal9zdHJlYW1fcHJpdmF0ZV90ICogbF9zdHJlYW0gPSAob3BqX3N0cmVhbV9wcml2YXRlX3QgKikgcF9zdHJlYW07Ci0KLQkJaWYgKCEgbF9jb2RlYy0+aXNfZGVjb21wcmVzc29yKSB7Ci0JCQlyZXR1cm4gbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX2VuY29kZSgJbF9jb2RlYy0+bV9jb2RlYywKLQkJCQkJCQkJCQkJCQkJCWxfc3RyZWFtLAotCQkJCQkJCQkJCQkJCQkJJihsX2NvZGVjLT5tX2V2ZW50X21ncikpOwotCQl9Ci0JfQotCi0JcmV0dXJuIE9QSl9GQUxTRTsKLQotfQotCi1PUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX2VuZF9jb21wcmVzcyAob3BqX2NvZGVjX3QgKnBfY29kZWMsCi0JCQkJCQkJCQkJb3BqX3N0cmVhbV90ICpwX3N0cmVhbSkKLXsKLQlpZiAocF9jb2RlYyAmJiBwX3N0cmVhbSkgewotCQlvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfY29kZWM7Ci0JCW9wal9zdHJlYW1fcHJpdmF0ZV90ICogbF9zdHJlYW0gPSAob3BqX3N0cmVhbV9wcml2YXRlX3QgKikgcF9zdHJlYW07Ci0KLQkJaWYgKCEgbF9jb2RlYy0+aXNfZGVjb21wcmVzc29yKSB7Ci0JCQlyZXR1cm4gbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX2VuZF9jb21wcmVzcyhsX2NvZGVjLT5tX2NvZGVjLAotCQkJCQkJCQkJCQkJCQkJCQkJbF9zdHJlYW0sCi0JCQkJCQkJCQkJCQkJCQkJCQkmKGxfY29kZWMtPm1fZXZlbnRfbWdyKSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIE9QSl9GQUxTRTsKLQotfQotCi1PUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX2VuZF9kZWNvbXByZXNzICgJb3BqX2NvZGVjX3QgKnBfY29kZWMsCi0JCQkJCQkJCQkJCW9wal9zdHJlYW1fdCAqcF9zdHJlYW0pCi17Ci0JaWYgKHBfY29kZWMgJiYgcF9zdHJlYW0pIHsKLQkJb3BqX2NvZGVjX3ByaXZhdGVfdCAqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCAqKSBwX2NvZGVjOwotCQlvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIGxfc3RyZWFtID0gKG9wal9zdHJlYW1fcHJpdmF0ZV90ICopIHBfc3RyZWFtOwotCi0JCWlmICghIGxfY29kZWMtPmlzX2RlY29tcHJlc3NvcikgewotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCQkKLQkJcmV0dXJuIGxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX2VuZF9kZWNvbXByZXNzKGxfY29kZWMtPm1fY29kZWMsCi0JCQkJCQkJCQkJCQkJCQkJCQlsX3N0cmVhbSwKLQkJCQkJCQkJCQkJCQkJCQkJCSYobF9jb2RlYy0+bV9ldmVudF9tZ3IpICk7Ci0JfQotCi0JcmV0dXJuIE9QSl9GQUxTRTsKLX0KLQotT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9zZXRfTUNUKG9wal9jcGFyYW1ldGVyc190ICpwYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcEVuY29kaW5nTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfZGNfc2hpZnQsT1BKX1VJTlQzMiBwTmJDb21wKQotewotCU9QSl9VSU5UMzIgbF9tYXRyaXhfc2l6ZSA9IHBOYkNvbXAgKiBwTmJDb21wICogKE9QSl9VSU5UMzIpc2l6ZW9mKE9QSl9GTE9BVDMyKTsKLQlPUEpfVUlOVDMyIGxfZGNfc2hpZnRfc2l6ZSA9IHBOYkNvbXAgKiAoT1BKX1VJTlQzMilzaXplb2YoT1BKX0lOVDMyKTsKLQlPUEpfVUlOVDMyIGxfbWN0X3RvdGFsX3NpemUgPSBsX21hdHJpeF9zaXplICsgbF9kY19zaGlmdF9zaXplOwotCi0JLyogYWRkIE1DVCBjYXBhYmlsaXR5ICovCi0gICAgaWYgKE9QSl9JU19QQVJUMihwYXJhbWV0ZXJzLT5yc2l6KSkgewotICAgICAgICBwYXJhbWV0ZXJzLT5yc2l6IHw9IE9QSl9FWFRFTlNJT05fTUNUOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBhcmFtZXRlcnMtPnJzaXogPSAoKE9QSl9QUk9GSUxFX1BBUlQyKSB8IChPUEpfRVhURU5TSU9OX01DVCkpOwotICAgIH0KLQlwYXJhbWV0ZXJzLT5pcnJldmVyc2libGUgPSAxOwotCi0JLyogdXNlIGFycmF5IGJhc2VkIE1DVCAqLwotCXBhcmFtZXRlcnMtPnRjcF9tY3QgPSAyOwotCXBhcmFtZXRlcnMtPm1jdF9kYXRhID0gb3BqX21hbGxvYyhsX21jdF90b3RhbF9zaXplKTsKLQlpZiAoISBwYXJhbWV0ZXJzLT5tY3RfZGF0YSkgewotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQotCW1lbWNweShwYXJhbWV0ZXJzLT5tY3RfZGF0YSxwRW5jb2RpbmdNYXRyaXgsbF9tYXRyaXhfc2l6ZSk7Ci0JbWVtY3B5KCgoT1BKX0JZVEUgKikgcGFyYW1ldGVycy0+bWN0X2RhdGEpICsgIGxfbWF0cml4X3NpemUscF9kY19zaGlmdCxsX2RjX3NoaWZ0X3NpemUpOwotCi0JcmV0dXJuIE9QSl9UUlVFOwotfQotCi1PUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3dyaXRlX3RpbGUgKAlvcGpfY29kZWNfdCAqcF9jb2RlYywKLQkJCQkJCQkJCQlPUEpfVUlOVDMyIHBfdGlsZV9pbmRleCwKLQkJCQkJCQkJCQlPUEpfQllURSAqIHBfZGF0YSwKLQkJCQkJCQkJCQlPUEpfVUlOVDMyIHBfZGF0YV9zaXplLAotCQkJCQkJCQkJCW9wal9zdHJlYW1fdCAqcF9zdHJlYW0gKQotewotCWlmIChwX2NvZGVjICYmIHBfc3RyZWFtICYmIHBfZGF0YSkgewotCQlvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfY29kZWM7Ci0JCW9wal9zdHJlYW1fcHJpdmF0ZV90ICogbF9zdHJlYW0gPSAob3BqX3N0cmVhbV9wcml2YXRlX3QgKikgcF9zdHJlYW07Ci0KLQkJaWYgKGxfY29kZWMtPmlzX2RlY29tcHJlc3NvcikgewotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCi0JCXJldHVybiBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfd3JpdGVfdGlsZSgJbF9jb2RlYy0+bV9jb2RlYywKLQkJCQkJCQkJCQkJCQkJCQkJcF90aWxlX2luZGV4LAotCQkJCQkJCQkJCQkJCQkJCQlwX2RhdGEsCi0JCQkJCQkJCQkJCQkJCQkJCXBfZGF0YV9zaXplLAotCQkJCQkJCQkJCQkJCQkJCQlsX3N0cmVhbSwKLQkJCQkJCQkJCQkJCQkJCQkJJihsX2NvZGVjLT5tX2V2ZW50X21ncikgKTsKLQl9Ci0KLQlyZXR1cm4gT1BKX0ZBTFNFOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXZvaWQgT1BKX0NBTExDT05WIG9wal9kZXN0cm95X2NvZGVjKG9wal9jb2RlY190ICpwX2NvZGVjKQotewotCWlmIChwX2NvZGVjKSB7Ci0JCW9wal9jb2RlY19wcml2YXRlX3QgKiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QgKikgcF9jb2RlYzsKLQotCQlpZiAobF9jb2RlYy0+aXNfZGVjb21wcmVzc29yKSB7Ci0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9kZXN0cm95KGxfY29kZWMtPm1fY29kZWMpOwotCQl9Ci0JCWVsc2UgewotCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX2Rlc3Ryb3kobF9jb2RlYy0+bV9jb2RlYyk7Ci0JCX0KLQotCQlsX2NvZGVjLT5tX2NvZGVjID0gMDA7Ci0JCW9wal9mcmVlKGxfY29kZWMpOwotCX0KLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi12b2lkIE9QSl9DQUxMQ09OViBvcGpfZHVtcF9jb2RlYygJb3BqX2NvZGVjX3QgKnBfY29kZWMsCi0JCQkJCQkJCQlPUEpfSU5UMzIgaW5mb19mbGFnLAotCQkJCQkJCQkJRklMRSogb3V0cHV0X3N0cmVhbSkKLXsKLQlpZiAocF9jb2RlYykgewotCQlvcGpfY29kZWNfcHJpdmF0ZV90KiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QqKSBwX2NvZGVjOwotCi0JCWxfY29kZWMtPm9wal9kdW1wX2NvZGVjKGxfY29kZWMtPm1fY29kZWMsIGluZm9fZmxhZywgb3V0cHV0X3N0cmVhbSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlmcHJpbnRmKHN0ZGVyciwgIltFUlJPUl0gSW5wdXQgcGFyYW1ldGVyIG9mIHRoZSBkdW1wX2NvZGVjIGZ1bmN0aW9uIGFyZSBpbmNvcnJlY3QuXG4iKTsKLQlyZXR1cm47Ci19Ci0KLW9wal9jb2Rlc3RyZWFtX2luZm9fdjJfdCogT1BKX0NBTExDT05WIG9wal9nZXRfY3N0cl9pbmZvKG9wal9jb2RlY190ICpwX2NvZGVjKQotewotCWlmIChwX2NvZGVjKSB7Ci0JCW9wal9jb2RlY19wcml2YXRlX3QqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCopIHBfY29kZWM7Ci0KLQkJcmV0dXJuIGxfY29kZWMtPm9wal9nZXRfY29kZWNfaW5mbyhsX2NvZGVjLT5tX2NvZGVjKTsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBPUEpfQ0FMTENPTlYgb3BqX2Rlc3Ryb3lfY3N0cl9pbmZvKG9wal9jb2Rlc3RyZWFtX2luZm9fdjJfdCAqKmNzdHJfaW5mbykgewotCWlmIChjc3RyX2luZm8pIHsKLQotCQlpZiAoKCpjc3RyX2luZm8pLT5tX2RlZmF1bHRfdGlsZV9pbmZvLnRjY3BfaW5mbyl7Ci0JCQlvcGpfZnJlZSgoKmNzdHJfaW5mbyktPm1fZGVmYXVsdF90aWxlX2luZm8udGNjcF9pbmZvKTsKLQkJfQotCi0JCWlmICgoKmNzdHJfaW5mbyktPnRpbGVfaW5mbyl7Ci0JCQkvKiBGSVhNRSBub3QgdXNlZCBmb3IgdGhlIG1vbWVudCovCi0JCX0KLQotCQlvcGpfZnJlZSgoKmNzdHJfaW5mbykpOwotCQkoKmNzdHJfaW5mbykgPSBOVUxMOwotCX0KLX0KLQotb3BqX2NvZGVzdHJlYW1faW5kZXhfdCAqIE9QSl9DQUxMQ09OViBvcGpfZ2V0X2NzdHJfaW5kZXgob3BqX2NvZGVjX3QgKnBfY29kZWMpCi17Ci0JaWYgKHBfY29kZWMpIHsKLQkJb3BqX2NvZGVjX3ByaXZhdGVfdCogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90KikgcF9jb2RlYzsKLQotCQlyZXR1cm4gbF9jb2RlYy0+b3BqX2dldF9jb2RlY19pbmRleChsX2NvZGVjLT5tX2NvZGVjKTsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBPUEpfQ0FMTENPTlYgb3BqX2Rlc3Ryb3lfY3N0cl9pbmRleChvcGpfY29kZXN0cmVhbV9pbmRleF90ICoqcF9jc3RyX2luZGV4KQotewotCWlmICgqcF9jc3RyX2luZGV4KXsKLQkJajJrX2Rlc3Ryb3lfY3N0cl9pbmRleCgqcF9jc3RyX2luZGV4KTsKLQkJKCpwX2NzdHJfaW5kZXgpID0gTlVMTDsKLQl9Ci19Ci0KLW9wal9zdHJlYW1fdCogT1BKX0NBTExDT05WIG9wal9zdHJlYW1fY3JlYXRlX2RlZmF1bHRfZmlsZV9zdHJlYW0gKGNvbnN0IGNoYXIgKmZuYW1lLCBPUEpfQk9PTCBwX2lzX3JlYWRfc3RyZWFtKQotewotICAgIHJldHVybiBvcGpfc3RyZWFtX2NyZWF0ZV9maWxlX3N0cmVhbShmbmFtZSwgT1BKX0oyS19TVFJFQU1fQ0hVTktfU0laRSwgcF9pc19yZWFkX3N0cmVhbSk7Ci19Ci0KLW9wal9zdHJlYW1fdCogT1BKX0NBTExDT05WIG9wal9zdHJlYW1fY3JlYXRlX2ZpbGVfc3RyZWFtICgKLSAgICAgICAgY29uc3QgY2hhciAqZm5hbWUsIAotCQlPUEpfU0laRV9UIHBfc2l6ZSwgCi0gICAgICAgIE9QSl9CT09MIHBfaXNfcmVhZF9zdHJlYW0pCi17Ci0gICAgb3BqX3N0cmVhbV90KiBsX3N0cmVhbSA9IDAwOwotICAgIEZJTEUgKnBfZmlsZTsKLSAgICBjb25zdCBjaGFyICptb2RlOwotCi0gICAgaWYgKCEgZm5hbWUpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIAotICAgIGlmKHBfaXNfcmVhZF9zdHJlYW0pIG1vZGUgPSAicmIiOyBlbHNlIG1vZGUgPSAid2IiOwotCi0gICAgcF9maWxlID0gZm9wZW4oZm5hbWUsIG1vZGUpOwotCi0gICAgaWYgKCEgcF9maWxlKSB7Ci0JICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGxfc3RyZWFtID0gb3BqX3N0cmVhbV9jcmVhdGUocF9zaXplLHBfaXNfcmVhZF9zdHJlYW0pOwotICAgIGlmICghIGxfc3RyZWFtKSB7Ci0gICAgICAgIGZjbG9zZShwX2ZpbGUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBvcGpfc3RyZWFtX3NldF91c2VyX2RhdGEobF9zdHJlYW0sIHBfZmlsZSwgKG9wal9zdHJlYW1fZnJlZV91c2VyX2RhdGFfZm4pIGZjbG9zZSk7Ci0gICAgb3BqX3N0cmVhbV9zZXRfdXNlcl9kYXRhX2xlbmd0aChsX3N0cmVhbSwgb3BqX2dldF9kYXRhX2xlbmd0aF9mcm9tX2ZpbGUocF9maWxlKSk7Ci0gICAgb3BqX3N0cmVhbV9zZXRfcmVhZF9mdW5jdGlvbihsX3N0cmVhbSwgKG9wal9zdHJlYW1fcmVhZF9mbikgb3BqX3JlYWRfZnJvbV9maWxlKTsKLSAgICBvcGpfc3RyZWFtX3NldF93cml0ZV9mdW5jdGlvbihsX3N0cmVhbSwgKG9wal9zdHJlYW1fd3JpdGVfZm4pIG9wal93cml0ZV9mcm9tX2ZpbGUpOwotICAgIG9wal9zdHJlYW1fc2V0X3NraXBfZnVuY3Rpb24obF9zdHJlYW0sIChvcGpfc3RyZWFtX3NraXBfZm4pIG9wal9za2lwX2Zyb21fZmlsZSk7Ci0gICAgb3BqX3N0cmVhbV9zZXRfc2Vla19mdW5jdGlvbihsX3N0cmVhbSwgKG9wal9zdHJlYW1fc2Vla19mbikgb3BqX3NlZWtfZnJvbV9maWxlKTsKLQotICAgIHJldHVybiBsX3N0cmVhbTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9vcGVuanBlZy5oIGIvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL29wZW5qcGVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhOGU3NWMuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL29wZW5qcGVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYzICswLDAgQEAKLSAvKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCi0gKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCi0gKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFVuaXZlcnNpdGUgY2F0aG9saXF1ZSBkZSBMb3V2YWluIChVQ0wpLCBCZWxnaXVtCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQotICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNywgUGFydmF0aGEgRWxhbmdvdmFuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIEplcm9tZSBGaW1lcywgQ29tbXVuaWNhdGlvbnMgJiBTeXN0ZW1lcyA8amVyb21lLmZpbWVzQGMtcy5mcj4KLSAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBLYW9yaSBIYWdpaGFyYQotICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIENlbnRyZSBOYXRpb25hbCBkJ0V0dWRlcyBTcGF0aWFsZXMgKENORVMpLCBGcmFuY2UgCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENTIFN5c3RlbWVzIGQnSW5mb3JtYXRpb24sIEZyYW5jZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCi0gKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotI2lmbmRlZiBPUEVOSlBFR19ICi0jZGVmaW5lIE9QRU5KUEVHX0gKLQotCi0vKiAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIENvbXBpbGVyIGRpcmVjdGl2ZXMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi0KLS8qCi1UaGUgaW5saW5lIGtleXdvcmQgaXMgc3VwcG9ydGVkIGJ5IEM5OSBidXQgbm90IGJ5IEM5MC4gCi1Nb3N0IGNvbXBpbGVycyBpbXBsZW1lbnQgdGhlaXIgb3duIHZlcnNpb24gb2YgdGhpcyBrZXl3b3JkIC4uLiAKLSovCi0jaWZuZGVmIElOTElORQotCSNpZiBkZWZpbmVkKF9NU0NfVkVSKQotCQkjZGVmaW5lIElOTElORSBfX2ZvcmNlaW5saW5lCi0JI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKLQkJI2RlZmluZSBJTkxJTkUgX19pbmxpbmVfXwotCSNlbGlmIGRlZmluZWQoX19NV0VSS1NfXykKLQkJI2RlZmluZSBJTkxJTkUgaW5saW5lCi0JI2Vsc2UgCi0JCS8qIGFkZCBvdGhlciBjb21waWxlcnMgaGVyZSAuLi4gKi8KLQkJI2RlZmluZSBJTkxJTkUgCi0JI2VuZGlmIC8qIGRlZmluZWQoPENvbXBpbGVyPikgKi8KLSNlbmRpZiAvKiBJTkxJTkUgKi8KLQotLyogZGVwcmVjYXRlZCBhdHRyaWJ1dGUgKi8KLSNpZmRlZiBfX0dOVUNfXwotCSNkZWZpbmUgT1BKX0RFUFJFQ0FURUQoZnVuYykgZnVuYyBfX2F0dHJpYnV0ZV9fICgoZGVwcmVjYXRlZCkpCi0jZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQotCSNkZWZpbmUgT1BKX0RFUFJFQ0FURUQoZnVuYykgX19kZWNsc3BlYyhkZXByZWNhdGVkKSBmdW5jCi0jZWxzZQotCSNwcmFnbWEgbWVzc2FnZSgiV0FSTklORzogWW91IG5lZWQgdG8gaW1wbGVtZW50IERFUFJFQ0FURUQgZm9yIHRoaXMgY29tcGlsZXIiKQotCSNkZWZpbmUgT1BKX0RFUFJFQ0FURUQoZnVuYykgZnVuYwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKE9QSl9TVEFUSUMpIHx8ICFkZWZpbmVkKF9XSU4zMikKLS8qIGh0dHA6Ly9nY2MuZ251Lm9yZy93aWtpL1Zpc2liaWxpdHkgKi8KLSMJaWYgX19HTlVDX18gPj0gNAotIwkJaWYgZGVmaW5lZChPUEpfU1RBVElDKSAvKiBzdGF0aWMgbGlicmFyeSB1c2VzICJoaWRkZW4iICovCi0jCQkJZGVmaW5lIE9QSl9BUEkgICAgX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJoaWRkZW4iKSkpCi0jCQllbHNlCi0jCQkJZGVmaW5lIE9QSl9BUEkgICAgX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotIwkJZW5kaWYKLSMJCWRlZmluZSBPUEpfTE9DQUwgIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiaGlkZGVuIikpKQotIwllbHNlCi0jCQlkZWZpbmUgT1BKX0FQSQotIwkJZGVmaW5lIE9QSl9MT0NBTAotIwllbmRpZgotIwlkZWZpbmUgT1BKX0NBTExDT05WCi0jZWxzZQotIwlkZWZpbmUgT1BKX0NBTExDT05WIF9fc3RkY2FsbAotLyoKLVRoZSBmb2xsb3dpbmcgaWZkZWYgYmxvY2sgaXMgdGhlIHN0YW5kYXJkIHdheSBvZiBjcmVhdGluZyBtYWNyb3Mgd2hpY2ggbWFrZSBleHBvcnRpbmcgCi1mcm9tIGEgRExMIHNpbXBsZXIuIEFsbCBmaWxlcyB3aXRoaW4gdGhpcyBETEwgYXJlIGNvbXBpbGVkIHdpdGggdGhlIE9QSl9FWFBPUlRTCi1zeW1ib2wgZGVmaW5lZCBvbiB0aGUgY29tbWFuZCBsaW5lLiB0aGlzIHN5bWJvbCBzaG91bGQgbm90IGJlIGRlZmluZWQgb24gYW55IHByb2plY3QKLXRoYXQgdXNlcyB0aGlzIERMTC4gVGhpcyB3YXkgYW55IG90aGVyIHByb2plY3Qgd2hvc2Ugc291cmNlIGZpbGVzIGluY2x1ZGUgdGhpcyBmaWxlIHNlZSAKLU9QSl9BUEkgZnVuY3Rpb25zIGFzIGJlaW5nIGltcG9ydGVkIGZyb20gYSBETEwsIHdoZXJhcyB0aGlzIERMTCBzZWVzIHN5bWJvbHMKLWRlZmluZWQgd2l0aCB0aGlzIG1hY3JvIGFzIGJlaW5nIGV4cG9ydGVkLgotKi8KLSMJaWYgZGVmaW5lZChPUEpfRVhQT1JUUykgfHwgZGVmaW5lZChETExfRVhQT1JUKQotIwkJZGVmaW5lIE9QSl9BUEkgX19kZWNsc3BlYyhkbGxleHBvcnQpCi0jCWVsc2UKLSMJCWRlZmluZSBPUEpfQVBJIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQotIwllbmRpZiAvKiBPUEpfRVhQT1JUUyAqLwotI2VuZGlmIC8qICFPUEpfU1RBVElDIHx8ICFfV0lOMzIgKi8KLQotdHlwZWRlZiBpbnQgT1BKX0JPT0w7Ci0jZGVmaW5lIE9QSl9UUlVFIDEKLSNkZWZpbmUgT1BKX0ZBTFNFIDAKLQotdHlwZWRlZiBjaGFyICAgICAgICAgIE9QSl9DSEFSOwotdHlwZWRlZiBmbG9hdCAgICAgICAgIE9QSl9GTE9BVDMyOwotdHlwZWRlZiBkb3VibGUgICAgICAgIE9QSl9GTE9BVDY0OwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIE9QSl9CWVRFOwotCi0jaW5jbHVkZSAib3BqX3N0ZGludC5oIgotCi10eXBlZGVmIGludDhfdCAgIE9QSl9JTlQ4OwotdHlwZWRlZiB1aW50OF90ICBPUEpfVUlOVDg7Ci10eXBlZGVmIGludDE2X3QgIE9QSl9JTlQxNjsKLXR5cGVkZWYgdWludDE2X3QgT1BKX1VJTlQxNjsKLXR5cGVkZWYgaW50MzJfdCAgT1BKX0lOVDMyOwotdHlwZWRlZiB1aW50MzJfdCBPUEpfVUlOVDMyOwotdHlwZWRlZiBpbnQ2NF90ICBPUEpfSU5UNjQ7Ci10eXBlZGVmIHVpbnQ2NF90IE9QSl9VSU5UNjQ7Ci0KLXR5cGVkZWYgaW50NjRfdCAgT1BKX09GRl9UOyAvKiA2NC1iaXQgZmlsZSBvZmZzZXQgdHlwZSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLXR5cGVkZWYgc2l6ZV90ICAgT1BKX1NJWkVfVDsKLQotLyogQXZvaWQgY29tcGlsZS10aW1lIHdhcm5pbmcgYmVjYXVzZSBwYXJhbWV0ZXIgaXMgbm90IHVzZWQgKi8KLSNkZWZpbmUgT1BKX0FSR19OT1RfVVNFRCh4KSAodm9pZCkoeCkKLQotLyogCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBVc2VmdWwgY29uc3RhbnQgZGVmaW5pdGlvbnMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi0KLSNkZWZpbmUgT1BKX1BBVEhfTEVOIDQwOTYgLyoqPCBNYXhpbXVtIGFsbG93ZWQgc2l6ZSBmb3IgZmlsZW5hbWVzICovCi0KLSNkZWZpbmUgT1BKX0oyS19NQVhSTFZMUyAzMwkJCQkJLyoqPCBOdW1iZXIgb2YgbWF4aW11bSByZXNvbHV0aW9uIGxldmVsIGF1dGhvcml6ZWQgKi8KLSNkZWZpbmUgT1BKX0oyS19NQVhCQU5EUyAoMypPUEpfSjJLX01BWFJMVkxTLTIpCS8qKjwgTnVtYmVyIG9mIG1heGltdW0gc3ViLWJhbmQgbGlua2VkIHRvIG51bWJlciBvZiByZXNvbHV0aW9uIGxldmVsICovCi0KLSNkZWZpbmUgT1BKX0oyS19ERUZBVUxUX05CX1NFR1MJCQkJMTAKLSNkZWZpbmUgT1BKX0oyS19TVFJFQU1fQ0hVTktfU0laRQkJCTB4MTAwMDAwIC8qKiAxIG1lZ2EgYnkgZGVmYXVsdCAqLwotI2RlZmluZSBPUEpfSjJLX0RFRkFVTFRfSEVBREVSX1NJWkUJCQkxMDAwCi0jZGVmaW5lIE9QSl9KMktfTUNDX0RFRkFVTFRfTkJfUkVDT1JEUwkJMTAKLSNkZWZpbmUgT1BKX0oyS19NQ1RfREVGQVVMVF9OQl9SRUNPUkRTCQkxMAotCi0vKiBVbmlQRz4+ICovIC8qIE5PVCBZRVQgVVNFRCBJTiBUSEUgVjIgVkVSU0lPTiBPRiBPUEVOSlBFRyAqLwotI2RlZmluZSBKUFdMX01BWF9OT19USUxFU1BFQ1MJMTYgLyoqPCBNYXhpbXVtIG51bWJlciBvZiB0aWxlIHBhcnRzIGV4cGVjdGVkIGJ5IEpQV0w6IGluY3JlYXNlIGF0IHlvdXIgd2lsbCAqLwotI2RlZmluZSBKUFdMX01BWF9OT19QQUNLU1BFQ1MJMTYgLyoqPCBNYXhpbXVtIG51bWJlciBvZiBwYWNrZXQgcGFydHMgZXhwZWN0ZWQgYnkgSlBXTDogaW5jcmVhc2UgYXQgeW91ciB3aWxsICovCi0jZGVmaW5lIEpQV0xfTUFYX05PX01BUktFUlMJNTEyIC8qKjwgTWF4aW11bSBudW1iZXIgb2YgSlBXTCBtYXJrZXJzOiBpbmNyZWFzZSBhdCB5b3VyIHdpbGwgKi8KLSNkZWZpbmUgSlBXTF9QUklWQVRFSU5ERVhfTkFNRSAianB3bF9pbmRleF9wcml2YXRlZmlsZW5hbWUiIC8qKjwgaW5kZXggZmlsZSBuYW1lIHVzZWQgd2hlbiBKUFdMIGlzIG9uICovCi0jZGVmaW5lIEpQV0xfRVhQRUNURURfQ09NUE9ORU5UUyAzIC8qKjwgRXhwZWN0IHRoaXMgbnVtYmVyIG9mIGNvbXBvbmVudHMsIHNvIHlvdSdsbCBmaW5kIGJldHRlciB0aGUgZmlyc3QgRVBCICovCi0jZGVmaW5lIEpQV0xfTUFYSU1VTV9USUxFUyA4MTkyIC8qKjwgRXhwZWN0IHRoaXMgbWF4aW11bSBudW1iZXIgb2YgdGlsZXMsIHRvIGF2b2lkIHNvbWUgY3Jhc2hlcyAqLwotI2RlZmluZSBKUFdMX01BWElNVU1fSEFNTUlORyAyIC8qKjwgRXhwZWN0IHRoaXMgbWF4aW11bSBudW1iZXIgb2YgYml0IGVycm9ycyBpbiBtYXJrZXIgaWQncyAqLwotI2RlZmluZSBKUFdMX01BWElNVU1fRVBCX1JPT00gNjU0NTAgLyoqPCBFeHBlY3QgdGhpcyBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBmb3IgY29tcG9zaXRpb24gb2YgRVBCcyAqLwotLyogPDxVbmlQRyAqLwotCi0vKioKLSAqIEVYUEVSSU1FTlRBTCBGT1IgVEhFIE1PTUVOVAotICogU3VwcG9ydGVkIG9wdGlvbnMgYWJvdXQgZmlsZSBpbmZvcm1hdGlvbiB1c2VkIG9ubHkgaW4gajJrX2R1bXAKLSovCi0jZGVmaW5lIE9QSl9JTUdfSU5GTwkJMQkvKio8IEJhc2ljIGltYWdlIGluZm9ybWF0aW9uIHByb3ZpZGVkIHRvIHRoZSB1c2VyICovCi0jZGVmaW5lIE9QSl9KMktfTUhfSU5GTwkJMgkvKio8IENvZGVzdHJlYW0gaW5mb3JtYXRpb24gYmFzZWQgb25seSBvbiB0aGUgbWFpbiBoZWFkZXIgKi8KLSNkZWZpbmUgT1BKX0oyS19USF9JTkZPCQk0CS8qKjwgVGlsZSBpbmZvcm1hdGlvbiBiYXNlZCBvbiB0aGUgY3VycmVudCB0aWxlIGhlYWRlciAqLwotI2RlZmluZSBPUEpfSjJLX1RDSF9JTkZPCTgJLyoqPCBUaWxlL0NvbXBvbmVudCBpbmZvcm1hdGlvbiBvZiBhbGwgdGlsZXMgKi8KLSNkZWZpbmUgT1BKX0oyS19NSF9JTkQJCTE2CS8qKjwgQ29kZXN0cmVhbSBpbmRleCBiYXNlZCBvbmx5IG9uIHRoZSBtYWluIGhlYWRlciAqLwotI2RlZmluZSBPUEpfSjJLX1RIX0lORAkJMzIJLyoqPCBUaWxlIGluZGV4IGJhc2VkIG9uIHRoZSBjdXJyZW50IHRpbGUgKi8KLS8qRklYTUUgI2RlZmluZSBPUEpfSjJLX0NTVFJfSU5ECTQ4Ki8JLyoqPCAgKi8KLSNkZWZpbmUgT1BKX0pQMl9JTkZPCQkxMjgJLyoqPCBKUDIgZmlsZSBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBPUEpfSlAyX0lORAkJCTI1NgkvKio8IEpQMiBmaWxlIGluZGV4ICovCi0KLS8qKgotICogSlBFRyAyMDAwIFByb2ZpbGVzLCBzZWUgVGFibGUgQS4xMCBmcm9tIDE1NDQ0LTEgKHVwZGF0ZWQgaW4gdmFyaW91cyBBTUQpCi0gKiBUaGVzZSB2YWx1ZXMgaGVscCBjaG9zaW5nIHRoZSBSU0laIHZhbHVlIGZvciB0aGUgSjJLIGNvZGVzdHJlYW0uCi0gKiBUaGUgUlNJWiB2YWx1ZSB0cmlnZ2VycyB2YXJpb3VzIGVuY29kaW5nIG9wdGlvbnMsIGFzIGRldGFpbGVkIGluIFRhYmxlIEEuMTAuCi0gKiBJZiBPUEpfUFJPRklMRV9QQVJUMiBpcyBjaG9zZW4sIGl0IGhhcyB0byBiZSBjb21iaW5lZCB3aXRoIG9uZSBvciBtb3JlIGV4dGVuc2lvbnMKLSAqIGRlc2NyaWJlZCBoZXJldW5kZXIuCi0gKiAgIEV4YW1wbGU6IHJzaXogPSBPUEpfUFJPRklMRV9QQVJUMiB8IE9QSl9FWFRFTlNJT05fTUNUOwotICogRm9yIGJyb2FkY2FzdCBwcm9maWxlcywgdGhlIE9QSl9QUk9GSUxFIHZhbHVlIGhhcyB0byBiZSBjb21iaW5lZCB3aXRoIHRoZSB0YXJnZXRlZAotICogbWFpbmxldmVsICgzLTAgTFNCLCB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDExKToKLSAqICAgRXhhbXBsZTogcnNpeiA9IE9QSl9QUk9GSUxFX0JDX01VTFRJIHwgMHgwMDA1OyAoaGVyZSBtYWlubGV2ZWwgNSkKLSAqIEZvciBJTUYgcHJvZmlsZXMsIHRoZSBPUEpfUFJPRklMRSB2YWx1ZSBoYXMgdG8gYmUgY29tYmluZWQgd2l0aCB0aGUgdGFyZ2V0ZWQgbWFpbmxldmVsCi0gKiAoMy0wIExTQiwgdmFsdWUgYmV0d2VlbiAwIGFuZCAxMSkgYW5kIHN1YmxldmVsICg3LTQgTFNCLCB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDkpOgotICogICBFeGFtcGxlOiByc2l6ID0gT1BKX1BST0ZJTEVfSU1GXzJLIHwgMHgwMDQwIHwgMHgwMDA1OyAoaGVyZSBtYWluIDUgYW5kIHN1YmxldmVsIDQpCi0gKiAqLwotI2RlZmluZSBPUEpfUFJPRklMRV9OT05FICAgICAgICAweDAwMDAgLyoqIG5vIHByb2ZpbGUsIGNvbmZvcm0gdG8gMTU0NDQtMSAqLwotI2RlZmluZSBPUEpfUFJPRklMRV8wICAgICAgICAgICAweDAwMDEgLyoqIFByb2ZpbGUgMCBhcyBkZXNjcmliZWQgaW4gMTU0NDQtMSxUYWJsZSBBLjQ1ICovCi0jZGVmaW5lIE9QSl9QUk9GSUxFXzEgICAgICAgICAgIDB4MDAwMiAvKiogUHJvZmlsZSAxIGFzIGRlc2NyaWJlZCBpbiAxNTQ0NC0xLFRhYmxlIEEuNDUgKi8KLSNkZWZpbmUgT1BKX1BST0ZJTEVfUEFSVDIgICAgICAgMHg4MDAwIC8qKiBBdCBsZWFzdCAxIGV4dGVuc2lvbiBkZWZpbmVkIGluIDE1NDQ0LTIgKFBhcnQtMikgKi8KLSNkZWZpbmUgT1BKX1BST0ZJTEVfQ0lORU1BXzJLICAgMHgwMDAzIC8qKiAySyBjaW5lbWEgcHJvZmlsZSBkZWZpbmVkIGluIDE1NDQ0LTEgQU1EMSAqLwotI2RlZmluZSBPUEpfUFJPRklMRV9DSU5FTUFfNEsgICAweDAwMDQgLyoqIDRLIGNpbmVtYSBwcm9maWxlIGRlZmluZWQgaW4gMTU0NDQtMSBBTUQxICovCi0jZGVmaW5lIE9QSl9QUk9GSUxFX0NJTkVNQV9TMksgIDB4MDAwNSAvKiogU2NhbGFibGUgMksgY2luZW1hIHByb2ZpbGUgZGVmaW5lZCBpbiAxNTQ0NC0xIEFNRDIgKi8KLSNkZWZpbmUgT1BKX1BST0ZJTEVfQ0lORU1BX1M0SyAgMHgwMDA2IC8qKiBTY2FsYWJsZSA0SyBjaW5lbWEgcHJvZmlsZSBkZWZpbmVkIGluIDE1NDQ0LTEgQU1EMiAqLwotI2RlZmluZSBPUEpfUFJPRklMRV9DSU5FTUFfTFRTICAweDAwMDcgLyoqIExvbmcgdGVybSBzdG9yYWdlIGNpbmVtYSBwcm9maWxlIGRlZmluZWQgaW4gMTU0NDQtMSBBTUQyICovCi0jZGVmaW5lIE9QSl9QUk9GSUxFX0JDX1NJTkdMRSAgIDB4MDEwMCAvKiogU2luZ2xlIFRpbGUgQnJvYWRjYXN0IHByb2ZpbGUgZGVmaW5lZCBpbiAxNTQ0NC0xIEFNRDMgKi8KLSNkZWZpbmUgT1BKX1BST0ZJTEVfQkNfTVVMVEkgICAgMHgwMjAwIC8qKiBNdWx0aSBUaWxlIEJyb2FkY2FzdCBwcm9maWxlIGRlZmluZWQgaW4gMTU0NDQtMSBBTUQzICovCi0jZGVmaW5lIE9QSl9QUk9GSUxFX0JDX01VTFRJX1IgIDB4MDMwMCAvKiogTXVsdGkgVGlsZSBSZXZlcnNpYmxlIEJyb2FkY2FzdCBwcm9maWxlIGRlZmluZWQgaW4gMTU0NDQtMSBBTUQzICovCi0jZGVmaW5lIE9QSl9QUk9GSUxFX0lNRl8ySyAgICAgIDB4MDQwMCAvKiogMksgU2luZ2xlIFRpbGUgTG9zc3kgSU1GIHByb2ZpbGUgZGVmaW5lZCBpbiAxNTQ0NC0xIEFNRCA4ICovCi0jZGVmaW5lIE9QSl9QUk9GSUxFX0lNRl80SyAgICAgIDB4MDQwMSAvKiogNEsgU2luZ2xlIFRpbGUgTG9zc3kgSU1GIHByb2ZpbGUgZGVmaW5lZCBpbiAxNTQ0NC0xIEFNRCA4ICovCi0jZGVmaW5lIE9QSl9QUk9GSUxFX0lNRl84SyAgICAgIDB4MDQwMiAvKiogOEsgU2luZ2xlIFRpbGUgTG9zc3kgSU1GIHByb2ZpbGUgZGVmaW5lZCBpbiAxNTQ0NC0xIEFNRCA4ICovCi0jZGVmaW5lIE9QSl9QUk9GSUxFX0lNRl8yS19SICAgIDB4MDQwMyAvKiogMksgU2luZ2xlL011bHRpIFRpbGUgUmV2ZXJzaWJsZSBJTUYgcHJvZmlsZSBkZWZpbmVkIGluIDE1NDQ0LTEgQU1EIDggKi8KLSNkZWZpbmUgT1BKX1BST0ZJTEVfSU1GXzRLX1IgICAgMHgwODAwIC8qKiA0SyBTaW5nbGUvTXVsdGkgVGlsZSBSZXZlcnNpYmxlIElNRiBwcm9maWxlIGRlZmluZWQgaW4gMTU0NDQtMSBBTUQgOCAqLwotI2RlZmluZSBPUEpfUFJPRklMRV9JTUZfOEtfUiAgICAweDA4MDEgIC8qKiA4SyBTaW5nbGUvTXVsdGkgVGlsZSBSZXZlcnNpYmxlIElNRiBwcm9maWxlIGRlZmluZWQgaW4gMTU0NDQtMSBBTUQgOCAqLwotCi0vKioKLSAqIEpQRUcgMjAwMCBQYXJ0LTIgZXh0ZW5zaW9ucwotICogKi8KLSNkZWZpbmUgT1BKX0VYVEVOU0lPTl9OT05FICAgICAgMHgwMDAwIC8qKiBObyBQYXJ0LTIgZXh0ZW5zaW9uICovCi0jZGVmaW5lIE9QSl9FWFRFTlNJT05fTUNUICAgICAgIDB4MDEwMCAgLyoqIEN1c3RvbSBNQ1Qgc3VwcG9ydCAqLwotCi0vKioKLSAqIEpQRUcgMjAwMCBwcm9maWxlIG1hY3JvcwotICogKi8KLSNkZWZpbmUgT1BKX0lTX0NJTkVNQSh2KSAgICAgKCgodikgPj0gT1BKX1BST0ZJTEVfQ0lORU1BXzJLKSYmKCh2KSA8PSBPUEpfUFJPRklMRV9DSU5FTUFfUzRLKSkKLSNkZWZpbmUgT1BKX0lTX1NUT1JBR0UodikgICAgKCh2KSA9PSBPUEpfUFJPRklMRV9DSU5FTUFfTFRTKQotI2RlZmluZSBPUEpfSVNfQlJPQURDQVNUKHYpICAoKCh2KSA+PSBPUEpfUFJPRklMRV9CQ19TSU5HTEUpJiYoKHYpIDw9ICgoT1BKX1BST0ZJTEVfQkNfTVVMVElfUikgfCAoMHgwMDBiKSkpKQotI2RlZmluZSBPUEpfSVNfSU1GKHYpICAgICAgICAoKCh2KSA+PSBPUEpfUFJPRklMRV9JTUZfMkspJiYoKHYpIDw9ICgoT1BKX1BST0ZJTEVfSU1GXzhLX1IpIHwgKDB4MDA5YikpKSkKLSNkZWZpbmUgT1BKX0lTX1BBUlQyKHYpICAgICAgKCh2KSAmIE9QSl9QUk9GSUxFX1BBUlQyKQotCi0vKioKLSAqIEpQRUcgMjAwMCBjb2Rlc3RyZWFtIGFuZCBjb21wb25lbnQgc2l6ZSBsaW1pdHMgaW4gY2luZW1hIHByb2ZpbGVzCi0gKiAqLwotI2RlZmluZSBPUEpfQ0lORU1BXzI0X0NTICAgICAxMzAyMDgzICAgCS8qKiBNYXhpbXVtIGNvZGVzdHJlYW0gbGVuZ3RoIGZvciAyNGZwcyAqLwotI2RlZmluZSBPUEpfQ0lORU1BXzQ4X0NTICAgICA2NTEwNDEgICAgIC8qKiBNYXhpbXVtIGNvZGVzdHJlYW0gbGVuZ3RoIGZvciA0OGZwcyAqLwotI2RlZmluZSBPUEpfQ0lORU1BXzI0X0NPTVAgICAxMDQxNjY2ICAgIC8qKiBNYXhpbXVtIHNpemUgcGVyIGNvbG9yIGNvbXBvbmVudCBmb3IgMksgJiA0SyBAIDI0ZnBzICovCi0jZGVmaW5lIE9QSl9DSU5FTUFfNDhfQ09NUCAgIDUyMDgzMwkJLyoqIE1heGltdW0gc2l6ZSBwZXIgY29sb3IgY29tcG9uZW50IGZvciAySyBAIDQ4ZnBzICovCi0KLS8qIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgZW51bSBkZWZpbml0aW9ucwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLQotLyoqCi0gKiBERVBSRUNBVEVEOiB1c2UgUlNJWiwgT1BKX1BST0ZJTEVfKiBhbmQgT1BKX0VYVEVOU0lPTl8qIGluc3RlYWQKLSAqIFJzaXogQ2FwYWJpbGl0aWVzCi0gKiAqLwotdHlwZWRlZiBlbnVtIFJTSVpfQ0FQQUJJTElUSUVTIHsKLSAgICBPUEpfU1REX1JTSVogPSAwLAkJLyoqIFN0YW5kYXJkIEpQRUcyMDAwIHByb2ZpbGUqLwotICAgIE9QSl9DSU5FTUEySyA9IDMsCQkvKiogUHJvZmlsZSBuYW1lIGZvciBhIDJLIGltYWdlKi8KLSAgICBPUEpfQ0lORU1BNEsgPSA0LAkJLyoqIFByb2ZpbGUgbmFtZSBmb3IgYSA0SyBpbWFnZSovCi0gICAgT1BKX01DVCA9IDB4ODEwMAotfSBPUEpfUlNJWl9DQVBBQklMSVRJRVM7Ci0KLS8qKgotICogREVQUkVDQVRFRDogdXNlIFJTSVosIE9QSl9QUk9GSUxFXyogYW5kIE9QSl9FWFRFTlNJT05fKiBpbnN0ZWFkCi0gKiBEaWdpdGFsIGNpbmVtYSBvcGVyYXRpb24gbW9kZQotICogKi8KLXR5cGVkZWYgZW51bSBDSU5FTUFfTU9ERSB7Ci0gICAgT1BKX09GRiA9IDAsCQkJLyoqIE5vdCBEaWdpdGFsIENpbmVtYSovCi0gICAgT1BKX0NJTkVNQTJLXzI0ID0gMSwJLyoqIDJLIERpZ2l0YWwgQ2luZW1hIGF0IDI0IGZwcyovCi0gICAgT1BKX0NJTkVNQTJLXzQ4ID0gMiwJLyoqIDJLIERpZ2l0YWwgQ2luZW1hIGF0IDQ4IGZwcyovCi0gICAgT1BKX0NJTkVNQTRLXzI0ID0gMwkJLyoqIDRLIERpZ2l0YWwgQ2luZW1hIGF0IDI0IGZwcyovCi19T1BKX0NJTkVNQV9NT0RFOwotCi0vKiogCi0gKiBQcm9ncmVzc2lvbiBvcmRlcgotICogKi8KLXR5cGVkZWYgZW51bSBQUk9HX09SREVSIHsKLQlPUEpfUFJPR19VTktOT1dOID0gLTEsCS8qKjwgcGxhY2UtaG9sZGVyICovCi0JT1BKX0xSQ1AgPSAwLAkJCS8qKjwgbGF5ZXItcmVzb2x1dGlvbi1jb21wb25lbnQtcHJlY2luY3Qgb3JkZXIgKi8KLQlPUEpfUkxDUCA9IDEsCQkJLyoqPCByZXNvbHV0aW9uLWxheWVyLWNvbXBvbmVudC1wcmVjaW5jdCBvcmRlciAqLwotCU9QSl9SUENMID0gMiwJCQkvKio8IHJlc29sdXRpb24tcHJlY2luY3QtY29tcG9uZW50LWxheWVyIG9yZGVyICovCi0JT1BKX1BDUkwgPSAzLAkJCS8qKjwgcHJlY2luY3QtY29tcG9uZW50LXJlc29sdXRpb24tbGF5ZXIgb3JkZXIgKi8KLQlPUEpfQ1BSTCA9IDQJCQkvKio8IGNvbXBvbmVudC1wcmVjaW5jdC1yZXNvbHV0aW9uLWxheWVyIG9yZGVyICovCi19IE9QSl9QUk9HX09SREVSOwotCi0vKioKLSAqIFN1cHBvcnRlZCBpbWFnZSBjb2xvciBzcGFjZXMKLSovCi10eXBlZGVmIGVudW0gQ09MT1JfU1BBQ0UgewotICAgIE9QSl9DTFJTUENfVU5LTk9XTiA9IC0xLAkvKio8IG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGxpYnJhcnkgKi8KLSAgICBPUEpfQ0xSU1BDX1VOU1BFQ0lGSUVEID0gMCwJLyoqPCBub3Qgc3BlY2lmaWVkIGluIHRoZSBjb2Rlc3RyZWFtICovCi0gICAgT1BKX0NMUlNQQ19TUkdCID0gMSwJCS8qKjwgc1JHQiAqLwotICAgIE9QSl9DTFJTUENfR1JBWSA9IDIsCQkvKio8IGdyYXlzY2FsZSAqLwotICAgIE9QSl9DTFJTUENfU1lDQyA9IDMsCQkvKio8IFlVViAqLwotICAgIE9QSl9DTFJTUENfRVlDQyA9IDQsICAgICAgICAvKio8IGUtWUNDICovCi0gICAgT1BKX0NMUlNQQ19DTVlLID0gNSAgICAgICAgIC8qKjwgQ01ZSyAqLwotfSBPUEpfQ09MT1JfU1BBQ0U7Ci0KLS8qKgotICogU3VwcG9ydGVkIGNvZGVjCi0qLwotdHlwZWRlZiBlbnVtIENPREVDX0ZPUk1BVCB7Ci0JT1BKX0NPREVDX1VOS05PV04gPSAtMSwJLyoqPCBwbGFjZS1ob2xkZXIgKi8KLQlPUEpfQ09ERUNfSjJLICA9IDAsCQkvKio8IEpQRUctMjAwMCBjb2Rlc3RyZWFtIDogcmVhZC93cml0ZSAqLwotCU9QSl9DT0RFQ19KUFQgID0gMSwJCS8qKjwgSlBULXN0cmVhbSAoSlBFRyAyMDAwLCBKUElQKSA6IHJlYWQgb25seSAqLwotICAgIE9QSl9DT0RFQ19KUDIgID0gMiwJCS8qKjwgSlAyIGZpbGUgZm9ybWF0IDogcmVhZC93cml0ZSAqLwotICAgIE9QSl9DT0RFQ19KUFAgID0gMywJCS8qKjwgSlBQLXN0cmVhbSAoSlBFRyAyMDAwLCBKUElQKSA6IHRvIGJlIGNvZGVkICovCi0gICAgT1BKX0NPREVDX0pQWCAgPSA0CQkvKio8IEpQWCBmaWxlIGZvcm1hdCAoSlBFRyAyMDAwIFBhcnQtMikgOiB0byBiZSBjb2RlZCAqLwotfSBPUEpfQ09ERUNfRk9STUFUOwotCi0KLS8qIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgZXZlbnQgbWFuYWdlciB0eXBlZGVmIGRlZmluaXRpb25zCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotCi0vKioKLSAqIENhbGxiYWNrIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgZXZlbnRzCi0gKiBAcGFyYW0gbXNnICAgICAgICAgICAgICAgRXZlbnQgbWVzc2FnZQotICogQHBhcmFtIGNsaWVudF9kYXRhICAgICAgIENsaWVudCBvYmplY3Qgd2hlcmUgd2lsbCBiZSByZXR1cm4gdGhlIGV2ZW50IG1lc3NhZ2UgCi0gKiAqLwotdHlwZWRlZiB2b2lkICgqb3BqX21zZ19jYWxsYmFjaykgKGNvbnN0IGNoYXIgKm1zZywgdm9pZCAqY2xpZW50X2RhdGEpOwotCi0vKiAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIGNvZGVjIHR5cGVkZWYgZGVmaW5pdGlvbnMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi0KLS8qKgotICogUHJvZ3Jlc3Npb24gb3JkZXIgY2hhbmdlcwotICogCi0gKi8KLXR5cGVkZWYgc3RydWN0IG9wal9wb2MgewotCS8qKiBSZXNvbHV0aW9uIG51bSBzdGFydCwgQ29tcG9uZW50IG51bSBzdGFydCwgZ2l2ZW4gYnkgUE9DICovCi0JT1BKX1VJTlQzMiByZXNubzAsIGNvbXBubzA7Ci0JLyoqIExheWVyIG51bSBlbmQsUmVzb2x1dGlvbiBudW0gZW5kLCBDb21wb25lbnQgbnVtIGVuZCwgZ2l2ZW4gYnkgUE9DICovCi0JT1BKX1VJTlQzMiBsYXlubzEsIHJlc25vMSwgY29tcG5vMTsKLQkvKiogTGF5ZXIgbnVtIHN0YXJ0LFByZWNpbmN0IG51bSBzdGFydCwgUHJlY2luY3QgbnVtIGVuZCAqLwotCU9QSl9VSU5UMzIgbGF5bm8wLCBwcmVjbm8wLCBwcmVjbm8xOwotCS8qKiBQcm9ncmVzc2lvbiBvcmRlciBlbnVtKi8KLQlPUEpfUFJPR19PUkRFUiBwcmcxLHByZzsKLQkvKiogUHJvZ3Jlc3Npb24gb3JkZXIgc3RyaW5nKi8KLQlPUEpfQ0hBUiBwcm9nb3JkZXJbNV07Ci0JLyoqIFRpbGUgbnVtYmVyICovCi0JT1BKX1VJTlQzMiB0aWxlOwotCS8qKiBTdGFydCBhbmQgZW5kIHZhbHVlcyBmb3IgVGlsZSB3aWR0aCBhbmQgaGVpZ2h0Ki8KLQlPUEpfSU5UMzIgdHgwLHR4MSx0eTAsdHkxOwotCS8qKiBTdGFydCB2YWx1ZSwgaW5pdGlhbGlzZWQgaW4gcGlfaW5pdGlhbGlzZV9lbmNvZGUqLwotCU9QSl9VSU5UMzIgbGF5UywgcmVzUywgY29tcFMsIHByY1M7Ci0JLyoqIEVuZCB2YWx1ZSwgaW5pdGlhbGlzZWQgaW4gcGlfaW5pdGlhbGlzZV9lbmNvZGUgKi8KLQlPUEpfVUlOVDMyIGxheUUsIHJlc0UsIGNvbXBFLCBwcmNFOwotCS8qKiBTdGFydCBhbmQgZW5kIHZhbHVlcyBvZiBUaWxlIHdpZHRoIGFuZCBoZWlnaHQsIGluaXRpYWxpc2VkIGluIHBpX2luaXRpYWxpc2VfZW5jb2RlKi8KLQlPUEpfVUlOVDMyIHR4Uyx0eEUsdHlTLHR5RSxkeCxkeTsKLQkvKiogVGVtcG9yYXJ5IHZhbHVlcyBmb3IgVGlsZSBwYXJ0cywgaW5pdGlhbGlzZWQgaW4gcGlfY3JlYXRlX2VuY29kZSAqLwotCU9QSl9VSU5UMzIgbGF5X3QsIHJlc190LCBjb21wX3QsIHByY190LHR4MF90LHR5MF90OwotfSBvcGpfcG9jX3Q7Ci0KLS8qKgotICogQ29tcHJlc3Npb24gcGFyYW1ldGVycwotICogKi8KLXR5cGVkZWYgc3RydWN0IG9wal9jcGFyYW1ldGVycyB7Ci0JLyoqIHNpemUgb2YgdGlsZTogdGlsZV9zaXplX29uID0gZmFsc2UgKG5vdCBpbiBhcmd1bWVudCkgb3IgPSB0cnVlIChpbiBhcmd1bWVudCkgKi8KLQlPUEpfQk9PTCB0aWxlX3NpemVfb247Ci0JLyoqIFhUT3NpeiAqLwotCWludCBjcF90eDA7Ci0JLyoqIFlUT3NpeiAqLwotCWludCBjcF90eTA7Ci0JLyoqIFhUc2l6ICovCi0JaW50IGNwX3RkeDsKLQkvKiogWVRzaXogKi8KLQlpbnQgY3BfdGR5OwotCS8qKiBhbGxvY2F0aW9uIGJ5IHJhdGUvZGlzdG9ydGlvbiAqLwotCWludCBjcF9kaXN0b19hbGxvYzsKLQkvKiogYWxsb2NhdGlvbiBieSBmaXhlZCBsYXllciAqLwotCWludCBjcF9maXhlZF9hbGxvYzsKLQkvKiogYWRkIGZpeGVkX3F1YWxpdHkgKi8KLQlpbnQgY3BfZml4ZWRfcXVhbGl0eTsKLQkvKiogZml4ZWQgbGF5ZXIgKi8KLQlpbnQgKmNwX21hdHJpY2U7Ci0JLyoqIGNvbW1lbnQgZm9yIGNvZGluZyAqLwotCWNoYXIgKmNwX2NvbW1lbnQ7Ci0JLyoqIGNzdHkgOiBjb2Rpbmcgc3R5bGUgKi8KLQlpbnQgY3N0eTsKLQkvKiogcHJvZ3Jlc3Npb24gb3JkZXIgKGRlZmF1bHQgT1BKX0xSQ1ApICovCi0JT1BKX1BST0dfT1JERVIgcHJvZ19vcmRlcjsKLQkvKiogcHJvZ3Jlc3Npb24gb3JkZXIgY2hhbmdlcyAqLwotCW9wal9wb2NfdCBQT0NbMzJdOwotCS8qKiBudW1iZXIgb2YgcHJvZ3Jlc3Npb24gb3JkZXIgY2hhbmdlcyAoUE9DKSwgZGVmYXVsdCB0byAwICovCi0JT1BKX1VJTlQzMiBudW1wb2NzOwotCS8qKiBudW1iZXIgb2YgbGF5ZXJzICovCi0JaW50IHRjcF9udW1sYXllcnM7Ci0gICAgLyoqIHJhdGVzIG9mIGxheWVycyAtIG1pZ2h0IGJlIHN1YnNlcXVlbnRseSBsaW1pdGVkIGJ5IHRoZSBtYXhfY3Nfc2l6ZSBmaWVsZCAqLwotCWZsb2F0IHRjcF9yYXRlc1sxMDBdOwotCS8qKiBkaWZmZXJlbnQgcHNuciBmb3Igc3VjY2Vzc2l2ZSBsYXllcnMgKi8KLQlmbG9hdCB0Y3BfZGlzdG9yYXRpb1sxMDBdOwotCS8qKiBudW1iZXIgb2YgcmVzb2x1dGlvbnMgKi8KLQlpbnQgbnVtcmVzb2x1dGlvbjsKLQkvKiogaW5pdGlhbCBjb2RlIGJsb2NrIHdpZHRoLCBkZWZhdWx0IHRvIDY0ICovCi0gCWludCBjYmxvY2t3X2luaXQ7Ci0JLyoqIGluaXRpYWwgY29kZSBibG9jayBoZWlnaHQsIGRlZmF1bHQgdG8gNjQgKi8KLQlpbnQgY2Jsb2NraF9pbml0OwotCS8qKiBtb2RlIHN3aXRjaCAoY2Jsa19zdHlsZSkgKi8KLQlpbnQgbW9kZTsKLQkvKiogMSA6IHVzZSB0aGUgaXJyZXZlcnNpYmxlIERXVCA5LTcsIDAgOiB1c2UgbG9zc2xlc3MgY29tcHJlc3Npb24gKGRlZmF1bHQpICovCi0JaW50IGlycmV2ZXJzaWJsZTsKLQkvKiogcmVnaW9uIG9mIGludGVyZXN0OiBhZmZlY3RlZCBjb21wb25lbnQgaW4gWzAuLjNdLCAtMSBtZWFucyBubyBST0kgKi8KLQlpbnQgcm9pX2NvbXBubzsKLQkvKiogcmVnaW9uIG9mIGludGVyZXN0OiB1cHNoaWZ0IHZhbHVlICovCi0JaW50IHJvaV9zaGlmdDsKLQkvKiBudW1iZXIgb2YgcHJlY2luY3Qgc2l6ZSBzcGVjaWZpY2F0aW9ucyAqLwotCWludCByZXNfc3BlYzsKLQkvKiogaW5pdGlhbCBwcmVjaW5jdCB3aWR0aCAqLwotCWludCBwcmN3X2luaXRbT1BKX0oyS19NQVhSTFZMU107Ci0JLyoqIGluaXRpYWwgcHJlY2luY3QgaGVpZ2h0ICovCi0JaW50IHByY2hfaW5pdFtPUEpfSjJLX01BWFJMVkxTXTsKLQotCS8qKkBuYW1lIGNvbW1hbmQgbGluZSBlbmNvZGVyIHBhcmFtZXRlcnMgKG5vdCB1c2VkIGluc2lkZSB0aGUgbGlicmFyeSkgKi8KLQkvKkB7Ki8KLQkvKiogaW5wdXQgZmlsZSBuYW1lICovCi0JY2hhciBpbmZpbGVbT1BKX1BBVEhfTEVOXTsKLQkvKiogb3V0cHV0IGZpbGUgbmFtZSAqLwotCWNoYXIgb3V0ZmlsZVtPUEpfUEFUSF9MRU5dOwotCS8qKiBERVBSRUNBVEVELiBJbmRleCBnZW5lcmF0aW9uIGlzIG5vdyBoYW5kZWxkIHdpdGggdGhlIG9wal9lbmNvZGVfd2l0aF9pbmZvKCkgZnVuY3Rpb24uIFNldCB0byBOVUxMICovCi0JaW50IGluZGV4X29uOwotCS8qKiBERVBSRUNBVEVELiBJbmRleCBnZW5lcmF0aW9uIGlzIG5vdyBoYW5kZWxkIHdpdGggdGhlIG9wal9lbmNvZGVfd2l0aF9pbmZvKCkgZnVuY3Rpb24uIFNldCB0byBOVUxMICovCi0JY2hhciBpbmRleFtPUEpfUEFUSF9MRU5dOwotCS8qKiBzdWJpbWFnZSBlbmNvZGluZzogb3JpZ2luIGltYWdlIG9mZnNldCBpbiB4IGRpcmVjdGlvbiAqLwotCWludCBpbWFnZV9vZmZzZXRfeDA7Ci0JLyoqIHN1YmltYWdlIGVuY29kaW5nOiBvcmlnaW4gaW1hZ2Ugb2Zmc2V0IGluIHkgZGlyZWN0aW9uICovCi0JaW50IGltYWdlX29mZnNldF95MDsKLQkvKiogc3Vic2FtcGxpbmcgdmFsdWUgZm9yIGR4ICovCi0JaW50IHN1YnNhbXBsaW5nX2R4OwotCS8qKiBzdWJzYW1wbGluZyB2YWx1ZSBmb3IgZHkgKi8KLQlpbnQgc3Vic2FtcGxpbmdfZHk7Ci0JLyoqIGlucHV0IGZpbGUgZm9ybWF0IDA6IFBHWCwgMTogUHhNLCAyOiBCTVAgMzpUSUYqLwotCWludCBkZWNvZF9mb3JtYXQ7Ci0JLyoqIG91dHB1dCBmaWxlIGZvcm1hdCAwOiBKMkssIDE6IEpQMiwgMjogSlBUICovCi0JaW50IGNvZF9mb3JtYXQ7Ci0JLypAfSovCi0KLS8qIFVuaVBHPj4gKi8gLyogTk9UIFlFVCBVU0VEIElOIFRIRSBWMiBWRVJTSU9OIE9GIE9QRU5KUEVHICovCi0JLyoqQG5hbWUgSlBXTCBlbmNvZGluZyBwYXJhbWV0ZXJzICovCi0JLypAeyovCi0JLyoqIGVuYWJsZXMgd3JpdGluZyBvZiBFUEMgaW4gTUgsIHRodXMgYWN0aXZhdGluZyBKUFdMICovCi0JT1BKX0JPT0wganB3bF9lcGNfb247Ci0JLyoqIGVycm9yIHByb3RlY3Rpb24gbWV0aG9kIGZvciBNSCAoMCwxLDE2LDMyLDM3LTEyOCkgKi8KLQlpbnQganB3bF9ocHJvdF9NSDsKLQkvKiogdGlsZSBudW1iZXIgb2YgaGVhZGVyIHByb3RlY3Rpb24gc3BlY2lmaWNhdGlvbiAoPj0wKSAqLwotCWludCBqcHdsX2hwcm90X1RQSF90aWxlbm9bSlBXTF9NQVhfTk9fVElMRVNQRUNTXTsKLQkvKiogZXJyb3IgcHJvdGVjdGlvbiBtZXRob2RzIGZvciBUUEhzICgwLDEsMTYsMzIsMzctMTI4KSAqLwotCWludCBqcHdsX2hwcm90X1RQSFtKUFdMX01BWF9OT19USUxFU1BFQ1NdOwotCS8qKiB0aWxlIG51bWJlciBvZiBwYWNrZXQgcHJvdGVjdGlvbiBzcGVjaWZpY2F0aW9uICg+PTApICovCi0JaW50IGpwd2xfcHByb3RfdGlsZW5vW0pQV0xfTUFYX05PX1BBQ0tTUEVDU107Ci0JLyoqIHBhY2tldCBudW1iZXIgb2YgcGFja2V0IHByb3RlY3Rpb24gc3BlY2lmaWNhdGlvbiAoPj0wKSAqLwotCWludCBqcHdsX3Bwcm90X3BhY2tub1tKUFdMX01BWF9OT19QQUNLU1BFQ1NdOwotCS8qKiBlcnJvciBwcm90ZWN0aW9uIG1ldGhvZHMgZm9yIHBhY2tldHMgKDAsMSwxNiwzMiwzNy0xMjgpICovCi0JaW50IGpwd2xfcHByb3RbSlBXTF9NQVhfTk9fUEFDS1NQRUNTXTsKLQkvKiogZW5hYmxlcyB3cml0aW5nIG9mIEVTRCwgKDA9bm8vMS8yIGJ5dGVzKSAqLwotCWludCBqcHdsX3NlbnNfc2l6ZTsKLQkvKiogc2Vuc2l0aXZpdHkgYWRkcmVzc2luZyBzaXplICgwPWF1dG8vMi80IGJ5dGVzKSAqLwotCWludCBqcHdsX3NlbnNfYWRkcjsKLQkvKiogc2Vuc2l0aXZpdHkgcmFuZ2UgKDAtMykgKi8KLQlpbnQganB3bF9zZW5zX3JhbmdlOwotCS8qKiBzZW5zaXRpdml0eSBtZXRob2QgZm9yIE1IICgtMT1ubywwLTcpICovCi0JaW50IGpwd2xfc2Vuc19NSDsKLQkvKiogdGlsZSBudW1iZXIgb2Ygc2Vuc2l0aXZpdHkgc3BlY2lmaWNhdGlvbiAoPj0wKSAqLwotCWludCBqcHdsX3NlbnNfVFBIX3RpbGVub1tKUFdMX01BWF9OT19USUxFU1BFQ1NdOwotCS8qKiBzZW5zaXRpdml0eSBtZXRob2RzIGZvciBUUEhzICgtMT1ubywwLTcpICovCi0JaW50IGpwd2xfc2Vuc19UUEhbSlBXTF9NQVhfTk9fVElMRVNQRUNTXTsKLQkvKkB9Ki8KLS8qIDw8VW5pUEcgKi8KLQotICAgIC8qKgotICAgICAqIERFUFJFQ0FURUQ6IHVzZSBSU0laLCBPUEpfUFJPRklMRV8qIGFuZCBNQVhfQ09NUF9TSVpFIGluc3RlYWQKLSAgICAgKiBEaWdpdGFsIENpbmVtYSBjb21wbGlhbmNlIDAtbm90IGNvbXBsaWFudCwgMS1jb21wbGlhbnQKLSAgICAgKiAqLwotICAgIE9QSl9DSU5FTUFfTU9ERSBjcF9jaW5lbWE7Ci0gICAgLyoqCi0gICAgICogTWF4aW11bSBzaXplIChpbiBieXRlcykgZm9yIGVhY2ggY29tcG9uZW50LgotICAgICAqIElmID09IDAsIGNvbXBvbmVudCBzaXplIGxpbWl0YXRpb24gaXMgbm90IGNvbnNpZGVyZWQKLSAgICAgKiAqLwotCWludCBtYXhfY29tcF9zaXplOwotICAgIC8qKgotICAgICAqIERFUFJFQ0FURUQ6IHVzZSBSU0laLCBPUEpfUFJPRklMRV8qIGFuZCBPUEpfRVhURU5TSU9OXyogaW5zdGVhZAotICAgICAqIFByb2ZpbGUgbmFtZQotICAgICAqICovCi0gICAgT1BKX1JTSVpfQ0FQQUJJTElUSUVTIGNwX3JzaXo7Ci0JLyoqIFRpbGUgcGFydCBnZW5lcmF0aW9uKi8KLQljaGFyIHRwX29uOwotCS8qKiBGbGFnIGZvciBUaWxlIHBhcnQgZ2VuZXJhdGlvbiovCi0JY2hhciB0cF9mbGFnOwotCS8qKiBNQ1QgKG11bHRpcGxlIGNvbXBvbmVudCB0cmFuc2Zvcm0pICovCi0JY2hhciB0Y3BfbWN0OwotCS8qKiBFbmFibGUgSlBJUCBpbmRleGluZyovCi0JT1BKX0JPT0wganBpcF9vbjsKLQkvKiogTmFpdmUgaW1wbGVtZW50YXRpb24gb2YgTUNUIHJlc3RyaWN0ZWQgdG8gYSBzaW5nbGUgcmV2ZXJzaWJsZSBhcnJheSBiYXNlZCAKLSAgICAgICAgZW5jb2Rpbmcgd2l0aG91dCBvZmZzZXQgY29uY2VybmluZyBhbGwgdGhlIGNvbXBvbmVudHMuICovCi0Jdm9pZCAqIG1jdF9kYXRhOwotICAgIC8qKgotICAgICAqIE1heGltdW0gc2l6ZSAoaW4gYnl0ZXMpIGZvciB0aGUgd2hvbGUgY29kZXN0cmVhbS4KLSAgICAgKiBJZiA9PSAwLCBjb2Rlc3RyZWFtIHNpemUgbGltaXRhdGlvbiBpcyBub3QgY29uc2lkZXJlZAotICAgICAqIElmIGl0IGRvZXMgbm90IGNvbXBseSB3aXRoIHRjcF9yYXRlcywgbWF4X2NzX3NpemUgcHJldmFpbHMKLSAgICAgKiBhbmQgYSB3YXJuaW5nIGlzIGlzc3VlZC4KLSAgICAgKiAqLwotICAgIGludCBtYXhfY3Nfc2l6ZTsKLSAgICAvKiogUlNJWiB2YWx1ZQotICAgICAgICBUbyBiZSB1c2VkIHRvIGNvbWJpbmUgT1BKX1BST0ZJTEVfKiwgT1BKX0VYVEVOU0lPTl8qIGFuZCAoc3ViKWxldmVscyB2YWx1ZXMuICovCi0gICAgT1BKX1VJTlQxNiByc2l6OwotfSBvcGpfY3BhcmFtZXRlcnNfdDsgIAotCi0jZGVmaW5lIE9QSl9EUEFSQU1FVEVSU19JR05PUkVfUENMUl9DTUFQX0NERUZfRkxBRwkweDAwMDEKLQotLyoqCi0gKiBEZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMKLSAqICovCi10eXBlZGVmIHN0cnVjdCBvcGpfZHBhcmFtZXRlcnMgewotCS8qKiAKLQlTZXQgdGhlIG51bWJlciBvZiBoaWdoZXN0IHJlc29sdXRpb24gbGV2ZWxzIHRvIGJlIGRpc2NhcmRlZC4gCi0JVGhlIGltYWdlIHJlc29sdXRpb24gaXMgZWZmZWN0aXZlbHkgZGl2aWRlZCBieSAyIHRvIHRoZSBwb3dlciBvZiB0aGUgbnVtYmVyIG9mIGRpc2NhcmRlZCBsZXZlbHMuIAotCVRoZSByZWR1Y2UgZmFjdG9yIGlzIGxpbWl0ZWQgYnkgdGhlIHNtYWxsZXN0IHRvdGFsIG51bWJlciBvZiBkZWNvbXBvc2l0aW9uIGxldmVscyBhbW9uZyB0aWxlcy4KLQlpZiAhPSAwLCB0aGVuIG9yaWdpbmFsIGRpbWVuc2lvbiBkaXZpZGVkIGJ5IDJeKHJlZHVjZSk7IAotCWlmID09IDAgb3Igbm90IHVzZWQsIGltYWdlIGlzIGRlY29kZWQgdG8gdGhlIGZ1bGwgcmVzb2x1dGlvbiAKLQkqLwotCU9QSl9VSU5UMzIgY3BfcmVkdWNlOwotCS8qKiAKLQlTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHF1YWxpdHkgbGF5ZXJzIHRvIGRlY29kZS4gCi0JSWYgdGhlcmUgYXJlIGxlc3MgcXVhbGl0eSBsYXllcnMgdGhhbiB0aGUgc3BlY2lmaWVkIG51bWJlciwgYWxsIHRoZSBxdWFsaXR5IGxheWVycyBhcmUgZGVjb2RlZC4KLQlpZiAhPSAwLCB0aGVuIG9ubHkgdGhlIGZpcnN0ICJsYXllciIgbGF5ZXJzIGFyZSBkZWNvZGVkOyAKLQlpZiA9PSAwIG9yIG5vdCB1c2VkLCBhbGwgdGhlIHF1YWxpdHkgbGF5ZXJzIGFyZSBkZWNvZGVkIAotCSovCi0JT1BKX1VJTlQzMiBjcF9sYXllcjsKLQotCS8qKkBuYW1lIGNvbW1hbmQgbGluZSBkZWNvZGVyIHBhcmFtZXRlcnMgKG5vdCB1c2VkIGluc2lkZSB0aGUgbGlicmFyeSkgKi8KLQkvKkB7Ki8KLQkvKiogaW5wdXQgZmlsZSBuYW1lICovCi0JY2hhciBpbmZpbGVbT1BKX1BBVEhfTEVOXTsKLQkvKiogb3V0cHV0IGZpbGUgbmFtZSAqLwotCWNoYXIgb3V0ZmlsZVtPUEpfUEFUSF9MRU5dOwotCS8qKiBpbnB1dCBmaWxlIGZvcm1hdCAwOiBKMkssIDE6IEpQMiwgMjogSlBUICovCi0JaW50IGRlY29kX2Zvcm1hdDsKLQkvKiogb3V0cHV0IGZpbGUgZm9ybWF0IDA6IFBHWCwgMTogUHhNLCAyOiBCTVAgKi8KLQlpbnQgY29kX2Zvcm1hdDsKLQotCS8qKiBEZWNvZGluZyBhcmVhIGxlZnQgYm91bmRhcnkgKi8KLQlPUEpfVUlOVDMyIERBX3gwOwotCS8qKiBEZWNvZGluZyBhcmVhIHJpZ2h0IGJvdW5kYXJ5ICovCi0JT1BKX1VJTlQzMiBEQV94MTsKLQkvKiogRGVjb2RpbmcgYXJlYSB1cCBib3VuZGFyeSAqLwotCU9QSl9VSU5UMzIgREFfeTA7Ci0JLyoqIERlY29kaW5nIGFyZWEgYm90dG9tIGJvdW5kYXJ5ICovCi0JT1BKX1VJTlQzMiBEQV95MTsKLQkvKiogVmVyYm9zZSBtb2RlICovCi0JT1BKX0JPT0wgbV92ZXJib3NlOwotCi0JLyoqIHRpbGUgbnVtYmVyIG90IHRoZSBkZWNvZGVkIHRpbGUqLwotCU9QSl9VSU5UMzIgdGlsZV9pbmRleDsKLQkvKiogTmIgb2YgdGlsZSB0byBkZWNvZGUgKi8KLQlPUEpfVUlOVDMyIG5iX3RpbGVfdG9fZGVjb2RlOwotCi0JLypAfSovCi0KLS8qIFVuaVBHPj4gKi8gLyogTk9UIFlFVCBVU0VEIElOIFRIRSBWMiBWRVJTSU9OIE9GIE9QRU5KUEVHICovCi0JLyoqQG5hbWUgSlBXTCBkZWNvZGluZyBwYXJhbWV0ZXJzICovCi0JLypAeyovCi0JLyoqIGFjdGl2YXRlcyB0aGUgSlBXTCBjb3JyZWN0aW9uIGNhcGFiaWxpdGllcyAqLwotCU9QSl9CT09MIGpwd2xfY29ycmVjdDsKLQkvKiogZXhwZWN0ZWQgbnVtYmVyIG9mIGNvbXBvbmVudHMgKi8KLQlpbnQganB3bF9leHBfY29tcHM7Ci0JLyoqIG1heGltdW0gbnVtYmVyIG9mIHRpbGVzICovCi0JaW50IGpwd2xfbWF4X3RpbGVzOwotCS8qQH0qLwotLyogPDxVbmlQRyAqLwotCi0JdW5zaWduZWQgaW50IGZsYWdzOwotCi19IG9wal9kcGFyYW1ldGVyc190OwotCi0KLS8qKgotICogSlBFRzIwMDAgY29kZWMgVjIuCi0gKiAqLwotdHlwZWRlZiB2b2lkICogb3BqX2NvZGVjX3Q7Ci0KLS8qIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgSS9PIHN0cmVhbSB0eXBlZGVmIGRlZmluaXRpb25zCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotCi0vKioKLSAqIFN0cmVhbSBvcGVuIGZsYWdzLgotICogKi8KLS8qKiBUaGUgc3RyZWFtIHdhcyBvcGVuZWQgZm9yIHJlYWRpbmcuICovCi0jZGVmaW5lIE9QSl9TVFJFQU1fUkVBRAlPUEpfVFJVRQotLyoqIFRoZSBzdHJlYW0gd2FzIG9wZW5lZCBmb3Igd3JpdGluZy4gKi8KLSNkZWZpbmUgT1BKX1NUUkVBTV9XUklURSBPUEpfRkFMU0UKLQotLyoKLSAqIENhbGxiYWNrIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgcmVhZCBmdW5jdGlvbgotICovCi10eXBlZGVmIE9QSl9TSVpFX1QgKCogb3BqX3N0cmVhbV9yZWFkX2ZuKSAodm9pZCAqIHBfYnVmZmVyLCBPUEpfU0laRV9UIHBfbmJfYnl0ZXMsIHZvaWQgKiBwX3VzZXJfZGF0YSkgOwotCi0vKgotICogQ2FsbGJhY2sgZnVuY3Rpb24gcHJvdG90eXBlIGZvciB3cml0ZSBmdW5jdGlvbgotICovCi10eXBlZGVmIE9QSl9TSVpFX1QgKCogb3BqX3N0cmVhbV93cml0ZV9mbikgKHZvaWQgKiBwX2J1ZmZlciwgT1BKX1NJWkVfVCBwX25iX2J5dGVzLCB2b2lkICogcF91c2VyX2RhdGEpIDsKLQotLyoKLSAqIENhbGxiYWNrIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3Igc2tpcCBmdW5jdGlvbgotICovCi10eXBlZGVmIE9QSl9PRkZfVCAoKiBvcGpfc3RyZWFtX3NraXBfZm4pIChPUEpfT0ZGX1QgcF9uYl9ieXRlcywgdm9pZCAqIHBfdXNlcl9kYXRhKSA7Ci0KLS8qCi0gKiBDYWxsYmFjayBmdW5jdGlvbiBwcm90b3R5cGUgZm9yIHNlZWsgZnVuY3Rpb24KLSAqLwotdHlwZWRlZiBPUEpfQk9PTCAoKiBvcGpfc3RyZWFtX3NlZWtfZm4pIChPUEpfT0ZGX1QgcF9uYl9ieXRlcywgdm9pZCAqIHBfdXNlcl9kYXRhKSA7Ci0KLS8qCi0gKiBDYWxsYmFjayBmdW5jdGlvbiBwcm90b3R5cGUgZm9yIGZyZWUgdXNlciBkYXRhIGZ1bmN0aW9uCi0gKi8KLXR5cGVkZWYgdm9pZCAoKiBvcGpfc3RyZWFtX2ZyZWVfdXNlcl9kYXRhX2ZuKSAodm9pZCAqIHBfdXNlcl9kYXRhKSA7Ci0KLS8qCi0gKiBKUEVHMjAwMCBTdHJlYW0uCi0gKi8KLXR5cGVkZWYgdm9pZCAqIG9wal9zdHJlYW1fdDsKLQotLyogCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBpbWFnZSB0eXBlZGVmIGRlZmluaXRpb25zCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotCi0vKioKLSAqIERlZmluZXMgYSBzaW5nbGUgaW1hZ2UgY29tcG9uZW50Ci0gKiAqLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX2ltYWdlX2NvbXAgewotCS8qKiBYUnNpejogaG9yaXpvbnRhbCBzZXBhcmF0aW9uIG9mIGEgc2FtcGxlIG9mIGl0aCBjb21wb25lbnQgd2l0aCByZXNwZWN0IHRvIHRoZSByZWZlcmVuY2UgZ3JpZCAqLwotCU9QSl9VSU5UMzIgZHg7Ci0JLyoqIFlSc2l6OiB2ZXJ0aWNhbCBzZXBhcmF0aW9uIG9mIGEgc2FtcGxlIG9mIGl0aCBjb21wb25lbnQgd2l0aCByZXNwZWN0IHRvIHRoZSByZWZlcmVuY2UgZ3JpZCAqLwotCU9QSl9VSU5UMzIgZHk7Ci0JLyoqIGRhdGEgd2lkdGggKi8KLQlPUEpfVUlOVDMyIHc7Ci0JLyoqIGRhdGEgaGVpZ2h0ICovCi0JT1BKX1VJTlQzMiBoOwotCS8qKiB4IGNvbXBvbmVudCBvZmZzZXQgY29tcGFyZWQgdG8gdGhlIHdob2xlIGltYWdlICovCi0JT1BKX1VJTlQzMiB4MDsKLQkvKiogeSBjb21wb25lbnQgb2Zmc2V0IGNvbXBhcmVkIHRvIHRoZSB3aG9sZSBpbWFnZSAqLwotCU9QSl9VSU5UMzIgeTA7Ci0JLyoqIHByZWNpc2lvbiAqLwotCU9QSl9VSU5UMzIgcHJlYzsKLQkvKiogaW1hZ2UgZGVwdGggaW4gYml0cyAqLwotCU9QSl9VSU5UMzIgYnBwOwotCS8qKiBzaWduZWQgKDEpIC8gdW5zaWduZWQgKDApICovCi0JT1BKX1VJTlQzMiBzZ25kOwotCS8qKiBudW1iZXIgb2YgZGVjb2RlZCByZXNvbHV0aW9uICovCi0JT1BKX1VJTlQzMiByZXNub19kZWNvZGVkOwotCS8qKiBudW1iZXIgb2YgZGl2aXNpb24gYnkgMiBvZiB0aGUgb3V0IGltYWdlIGNvbXBhcmVkIHRvIHRoZSBvcmlnaW5hbCBzaXplIG9mIGltYWdlICovCi0JT1BKX1VJTlQzMiBmYWN0b3I7Ci0JLyoqIGltYWdlIGNvbXBvbmVudCBkYXRhICovCi0JT1BKX0lOVDMyICpkYXRhOwotICAvKiogYWxwaGEgY2hhbm5lbCAqLwotICBPUEpfVUlOVDE2IGFscGhhOwotfSBvcGpfaW1hZ2VfY29tcF90OwotCi0vKiogCi0gKiBEZWZpbmVzIGltYWdlIGRhdGEgYW5kIGNoYXJhY3RlcmlzdGljcwotICogKi8KLXR5cGVkZWYgc3RydWN0IG9wal9pbWFnZSB7Ci0JLyoqIFhPc2l6OiBob3Jpem9udGFsIG9mZnNldCBmcm9tIHRoZSBvcmlnaW4gb2YgdGhlIHJlZmVyZW5jZSBncmlkIHRvIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGltYWdlIGFyZWEgKi8KLQlPUEpfVUlOVDMyIHgwOwotCS8qKiBZT3NpejogdmVydGljYWwgb2Zmc2V0IGZyb20gdGhlIG9yaWdpbiBvZiB0aGUgcmVmZXJlbmNlIGdyaWQgdG8gdGhlIHRvcCBzaWRlIG9mIHRoZSBpbWFnZSBhcmVhICovCi0JT1BKX1VJTlQzMiB5MDsKLQkvKiogWHNpejogd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBncmlkICovCi0JT1BKX1VJTlQzMiB4MTsKLQkvKiogWXNpejogaGVpZ2h0IG9mIHRoZSByZWZlcmVuY2UgZ3JpZCAqLwotCU9QSl9VSU5UMzIgeTE7Ci0JLyoqIG51bWJlciBvZiBjb21wb25lbnRzIGluIHRoZSBpbWFnZSAqLwotCU9QSl9VSU5UMzIgbnVtY29tcHM7Ci0JLyoqIGNvbG9yIHNwYWNlOiBzUkdCLCBHcmV5c2NhbGUgb3IgWVVWICovCi0JT1BKX0NPTE9SX1NQQUNFIGNvbG9yX3NwYWNlOwotCS8qKiBpbWFnZSBjb21wb25lbnRzICovCi0Jb3BqX2ltYWdlX2NvbXBfdCAqY29tcHM7Ci0JLyoqICdyZXN0cmljdGVkJyBJQ0MgcHJvZmlsZSAqLwotCU9QSl9CWVRFICppY2NfcHJvZmlsZV9idWY7Ci0JLyoqIHNpemUgb2YgSUNDIHByb2ZpbGUgKi8KLQlPUEpfVUlOVDMyIGljY19wcm9maWxlX2xlbjsKLX0gb3BqX2ltYWdlX3Q7Ci0KLQotLyoqCi0gKiBDb21wb25lbnQgcGFyYW1ldGVycyBzdHJ1Y3R1cmUgdXNlZCBieSB0aGUgb3BqX2ltYWdlX2NyZWF0ZSBmdW5jdGlvbgotICogKi8KLXR5cGVkZWYgc3RydWN0IG9wal9pbWFnZV9jb21wdHBhcm0gewotCS8qKiBYUnNpejogaG9yaXpvbnRhbCBzZXBhcmF0aW9uIG9mIGEgc2FtcGxlIG9mIGl0aCBjb21wb25lbnQgd2l0aCByZXNwZWN0IHRvIHRoZSByZWZlcmVuY2UgZ3JpZCAqLwotCU9QSl9VSU5UMzIgZHg7Ci0JLyoqIFlSc2l6OiB2ZXJ0aWNhbCBzZXBhcmF0aW9uIG9mIGEgc2FtcGxlIG9mIGl0aCBjb21wb25lbnQgd2l0aCByZXNwZWN0IHRvIHRoZSByZWZlcmVuY2UgZ3JpZCAqLwotCU9QSl9VSU5UMzIgZHk7Ci0JLyoqIGRhdGEgd2lkdGggKi8KLQlPUEpfVUlOVDMyIHc7Ci0JLyoqIGRhdGEgaGVpZ2h0ICovCi0JT1BKX1VJTlQzMiBoOwotCS8qKiB4IGNvbXBvbmVudCBvZmZzZXQgY29tcGFyZWQgdG8gdGhlIHdob2xlIGltYWdlICovCi0JT1BKX1VJTlQzMiB4MDsKLQkvKiogeSBjb21wb25lbnQgb2Zmc2V0IGNvbXBhcmVkIHRvIHRoZSB3aG9sZSBpbWFnZSAqLwotCU9QSl9VSU5UMzIgeTA7Ci0JLyoqIHByZWNpc2lvbiAqLwotCU9QSl9VSU5UMzIgcHJlYzsKLQkvKiogaW1hZ2UgZGVwdGggaW4gYml0cyAqLwotCU9QSl9VSU5UMzIgYnBwOwotCS8qKiBzaWduZWQgKDEpIC8gdW5zaWduZWQgKDApICovCi0JT1BKX1VJTlQzMiBzZ25kOwotfSBvcGpfaW1hZ2VfY21wdHBhcm1fdDsKLQotCi0vKiAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIEluZm9ybWF0aW9uIG9uIHRoZSBKUEVHIDIwMDAgY29kZXN0cmVhbQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLS8qIFFVSVRFIEVYUEVSSU1FTlRBTCBGT1IgVEhFIE1PTUVOVCAqLwotCi0vKioKLSAqIEluZGV4IHN0cnVjdHVyZSA6IEluZm9ybWF0aW9uIGNvbmNlcm5pbmcgYSBwYWNrZXQgaW5zaWRlIHRpbGUKLSAqICovCi10eXBlZGVmIHN0cnVjdCBvcGpfcGFja2V0X2luZm8gewotCS8qKiBwYWNrZXQgc3RhcnQgcG9zaXRpb24gKGluY2x1ZGluZyBTT1AgbWFya2VyIGlmIGl0IGV4aXN0cykgKi8KLQlPUEpfT0ZGX1Qgc3RhcnRfcG9zOwotCS8qKiBlbmQgb2YgcGFja2V0IGhlYWRlciBwb3NpdGlvbiAoaW5jbHVkaW5nIEVQSCBtYXJrZXIgaWYgaXQgZXhpc3RzKSovCi0JT1BKX09GRl9UIGVuZF9waF9wb3M7Ci0JLyoqIHBhY2tldCBlbmQgcG9zaXRpb24gKi8KLQlPUEpfT0ZGX1QgZW5kX3BvczsKLQkvKiogcGFja2V0IGRpc3RvcnNpb24gKi8KLQlkb3VibGUgZGlzdG87Ci19IG9wal9wYWNrZXRfaW5mb190OwotCi0KLS8qIFVuaVBHPj4gKi8KLS8qKgotICogTWFya2VyIHN0cnVjdHVyZQotICogKi8KLXR5cGVkZWYgc3RydWN0IG9wal9tYXJrZXJfaW5mbyB7Ci0JLyoqIG1hcmtlciB0eXBlICovCi0JdW5zaWduZWQgc2hvcnQgaW50IHR5cGU7Ci0JLyoqIHBvc2l0aW9uIGluIGNvZGVzdHJlYW0gKi8KLQlPUEpfT0ZGX1QgcG9zOwotCS8qKiBsZW5ndGgsIG1hcmtlciB2YWwgaW5jbHVkZWQgKi8KLQlpbnQgbGVuOwotfSBvcGpfbWFya2VyX2luZm9fdDsKLS8qIDw8VW5pUEcgKi8KLQotLyoqCi0gKiBJbmRleCBzdHJ1Y3R1cmUgOiBJbmZvcm1hdGlvbiBjb25jZXJuaW5nIHRpbGUtcGFydHMKLSovCi10eXBlZGVmIHN0cnVjdCBvcGpfdHBfaW5mbyB7Ci0JLyoqIHN0YXJ0IHBvc2l0aW9uIG9mIHRpbGUgcGFydCAqLwotCWludCB0cF9zdGFydF9wb3M7Ci0JLyoqIGVuZCBwb3NpdGlvbiBvZiB0aWxlIHBhcnQgaGVhZGVyICovCi0JaW50IHRwX2VuZF9oZWFkZXI7Ci0JLyoqIGVuZCBwb3NpdGlvbiBvZiB0aWxlIHBhcnQgKi8KLQlpbnQgdHBfZW5kX3BvczsKLQkvKiogc3RhcnQgcGFja2V0IG9mIHRpbGUgcGFydCAqLwotCWludCB0cF9zdGFydF9wYWNrOwotCS8qKiBudW1iZXIgb2YgcGFja2V0cyBvZiB0aWxlIHBhcnQgKi8KLQlpbnQgdHBfbnVtcGFja3M7Ci19IG9wal90cF9pbmZvX3Q7Ci0KLS8qKgotICogSW5kZXggc3RydWN0dXJlIDogaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRpbGVzCi0qLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX3RpbGVfaW5mbyB7Ci0JLyoqIHZhbHVlIG9mIHRocmVzaCBmb3IgZWFjaCBsYXllciBieSB0aWxlIGNmci4gTWFyY2VsYSAgICovCi0JZG91YmxlICp0aHJlc2g7Ci0JLyoqIG51bWJlciBvZiB0aWxlICovCi0JaW50IHRpbGVubzsKLQkvKiogc3RhcnQgcG9zaXRpb24gKi8KLQlpbnQgc3RhcnRfcG9zOwotCS8qKiBlbmQgcG9zaXRpb24gb2YgdGhlIGhlYWRlciAqLwotCWludCBlbmRfaGVhZGVyOwotCS8qKiBlbmQgcG9zaXRpb24gKi8KLQlpbnQgZW5kX3BvczsKLQkvKiogcHJlY2luY3QgbnVtYmVyIGZvciBlYWNoIHJlc29sdXRpb24gbGV2ZWwgKHdpZHRoKSAqLwotCWludCBwd1szM107Ci0JLyoqIHByZWNpbmN0IG51bWJlciBmb3IgZWFjaCByZXNvbHV0aW9uIGxldmVsIChoZWlnaHQpICovCi0JaW50IHBoWzMzXTsKLQkvKiogcHJlY2luY3Qgc2l6ZSAoaW4gcG93ZXIgb2YgMiksIGluIFggZm9yIGVhY2ggcmVzb2x1dGlvbiBsZXZlbCAqLwotCWludCBwZHhbMzNdOwotCS8qKiBwcmVjaW5jdCBzaXplIChpbiBwb3dlciBvZiAyKSwgaW4gWSBmb3IgZWFjaCByZXNvbHV0aW9uIGxldmVsICovCi0JaW50IHBkeVszM107Ci0JLyoqIGluZm9ybWF0aW9uIGNvbmNlcm5pbmcgcGFja2V0cyBpbnNpZGUgdGlsZSAqLwotCW9wal9wYWNrZXRfaW5mb190ICpwYWNrZXQ7Ci0JLyoqIGFkZCBmaXhlZF9xdWFsaXR5ICovCi0JaW50IG51bXBpeDsKLQkvKiogYWRkIGZpeGVkX3F1YWxpdHkgKi8KLQlkb3VibGUgZGlzdG90aWxlOwotICAJLyoqIG51bWJlciBvZiBtYXJrZXJzICovCi0JaW50IG1hcmtudW07Ci0JLyoqIGxpc3Qgb2YgbWFya2VycyAqLwotCW9wal9tYXJrZXJfaW5mb190ICptYXJrZXI7Ci0JLyoqIGFjdHVhbCBzaXplIG9mIG1hcmtlcnMgYXJyYXkgKi8KLQlpbnQgbWF4bWFya251bTsKLQkvKiogbnVtYmVyIG9mIHRpbGUgcGFydHMgKi8KLQlpbnQgbnVtX3RwczsKLQkvKiogaW5mb3JtYXRpb24gY29uY2VybmluZyB0aWxlIHBhcnRzICovCi0Jb3BqX3RwX2luZm9fdCAqdHA7Ci19IG9wal90aWxlX2luZm9fdDsKLQotLyoqCi0gKiBJbmRleCBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGVzdHJlYW0KLSovCi10eXBlZGVmIHN0cnVjdCBvcGpfY29kZXN0cmVhbV9pbmZvIHsKLQkvKiogbWF4aW11bSBkaXN0b3J0aW9uIHJlZHVjdGlvbiBvbiB0aGUgd2hvbGUgaW1hZ2UgKGFkZCBmb3IgTWFyY2VsYSkgKi8KLQlkb3VibGUgRF9tYXg7Ci0JLyoqIHBhY2tldCBudW1iZXIgKi8KLQlpbnQgcGFja25vOwotCS8qKiB3cml0aW5nIHRoZSBwYWNrZXQgaW4gdGhlIGluZGV4IHdpdGggdDJfZW5jb2RlX3BhY2tldHMgKi8KLQlpbnQgaW5kZXhfd3JpdGU7Ci0JLyoqIGltYWdlIHdpZHRoICovCi0JaW50IGltYWdlX3c7Ci0JLyoqIGltYWdlIGhlaWdodCAqLwotCWludCBpbWFnZV9oOwotCS8qKiBwcm9ncmVzc2lvbiBvcmRlciAqLwotCU9QSl9QUk9HX09SREVSIHByb2c7Ci0JLyoqIHRpbGUgc2l6ZSBpbiB4ICovCi0JaW50IHRpbGVfeDsKLQkvKiogdGlsZSBzaXplIGluIHkgKi8KLQlpbnQgdGlsZV95OwotCS8qKiAqLwotCWludCB0aWxlX094OwotCS8qKiAqLwotCWludCB0aWxlX095OwotCS8qKiBudW1iZXIgb2YgdGlsZXMgaW4gWCAqLwotCWludCB0dzsKLQkvKiogbnVtYmVyIG9mIHRpbGVzIGluIFkgKi8KLQlpbnQgdGg7Ci0JLyoqIGNvbXBvbmVudCBudW1iZXJzICovCi0JaW50IG51bWNvbXBzOwotCS8qKiBudW1iZXIgb2YgbGF5ZXIgKi8KLQlpbnQgbnVtbGF5ZXJzOwotCS8qKiBudW1iZXIgb2YgZGVjb21wb3NpdGlvbiBmb3IgZWFjaCBjb21wb25lbnQgKi8KLQlpbnQgKm51bWRlY29tcG9zOwotLyogVW5pUEc+PiAqLwotCS8qKiBudW1iZXIgb2YgbWFya2VycyAqLwotCWludCBtYXJrbnVtOwotCS8qKiBsaXN0IG9mIG1hcmtlcnMgKi8KLQlvcGpfbWFya2VyX2luZm9fdCAqbWFya2VyOwotCS8qKiBhY3R1YWwgc2l6ZSBvZiBtYXJrZXJzIGFycmF5ICovCi0JaW50IG1heG1hcmtudW07Ci0vKiA8PFVuaVBHICovCi0JLyoqIG1haW4gaGVhZGVyIHBvc2l0aW9uICovCi0JaW50IG1haW5faGVhZF9zdGFydDsKLQkvKiogbWFpbiBoZWFkZXIgcG9zaXRpb24gKi8KLQlpbnQgbWFpbl9oZWFkX2VuZDsKLQkvKiogY29kZXN0cmVhbSdzIHNpemUgKi8KLQlpbnQgY29kZXN0cmVhbV9zaXplOwotCS8qKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGlsZXMgaW5zaWRlIGltYWdlICovCi0Jb3BqX3RpbGVfaW5mb190ICp0aWxlOwotfSBvcGpfY29kZXN0cmVhbV9pbmZvX3Q7Ci0KLS8qIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogbmV3IG91dHB1dCBtYW5hZ21lbnQgb2YgdGhlIGNvZGVzdHJlYW0gaW5mb3JtYXRpb24gYW5kIGluZGV4ICovCi0KLS8qKgotICogVGlsZS1jb21wb25lbnQgY29kaW5nIHBhcmFtZXRlcnMgaW5mb3JtYXRpb24KLSAqLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX3RjY3BfaW5mbwotewotCS8qKiBjb21wb25lbnQgaW5kZXggKi8KLQlPUEpfVUlOVDMyIGNvbXBubzsKLQkvKiogY29kaW5nIHN0eWxlICovCi0JT1BKX1VJTlQzMiBjc3R5OwotCS8qKiBudW1iZXIgb2YgcmVzb2x1dGlvbnMgKi8KLQlPUEpfVUlOVDMyIG51bXJlc29sdXRpb25zOwotCS8qKiBjb2RlLWJsb2NrcyB3aWR0aCAqLwotCU9QSl9VSU5UMzIgY2Jsa3c7Ci0JLyoqIGNvZGUtYmxvY2tzIGhlaWdodCAqLwotCU9QSl9VSU5UMzIgY2Jsa2g7Ci0JLyoqIGNvZGUtYmxvY2sgY29kaW5nIHN0eWxlICovCi0JT1BKX1VJTlQzMiBjYmxrc3R5OwotCS8qKiBkaXNjcmV0ZSB3YXZlbGV0IHRyYW5zZm9ybSBpZGVudGlmaWVyICovCi0JT1BKX1VJTlQzMiBxbWZiaWQ7Ci0JLyoqIHF1YW50aXNhdGlvbiBzdHlsZSAqLwotCU9QSl9VSU5UMzIgcW50c3R5OwotCS8qKiBzdGVwc2l6ZXMgdXNlZCBmb3IgcXVhbnRpemF0aW9uICovCi0JT1BKX1VJTlQzMiBzdGVwc2l6ZXNfbWFudFtPUEpfSjJLX01BWEJBTkRTXTsKLQkvKiogc3RlcHNpemVzIHVzZWQgZm9yIHF1YW50aXphdGlvbiAqLwotCU9QSl9VSU5UMzIgc3RlcHNpemVzX2V4cG5bT1BKX0oyS19NQVhCQU5EU107Ci0JLyoqIG51bWJlciBvZiBndWFyZCBiaXRzICovCi0JT1BKX1VJTlQzMiBudW1nYml0czsKLQkvKiogUmVnaW9uIE9mIEludGVyZXN0IHNoaWZ0ICovCi0JT1BKX0lOVDMyIHJvaXNoaWZ0OwotCS8qKiBwcmVjaW5jdCB3aWR0aCAqLwotCU9QSl9VSU5UMzIgcHJjd1tPUEpfSjJLX01BWFJMVkxTXTsKLQkvKiogcHJlY2luY3QgaGVpZ2h0ICovCi0JT1BKX1VJTlQzMiBwcmNoW09QSl9KMktfTUFYUkxWTFNdOwotfQotb3BqX3RjY3BfaW5mb190OwotCi0vKioKLSAqIFRpbGUgY29kaW5nIHBhcmFtZXRlcnMgaW5mb3JtYXRpb24KLSAqLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX3RpbGVfdjJfaW5mbyB7Ci0KLQkvKiogbnVtYmVyIChpbmRleCkgb2YgdGlsZSAqLwotCWludCB0aWxlbm87Ci0JLyoqIGNvZGluZyBzdHlsZSAqLwotCU9QSl9VSU5UMzIgY3N0eTsKLQkvKiogcHJvZ3Jlc3Npb24gb3JkZXIgKi8KLQlPUEpfUFJPR19PUkRFUiBwcmc7Ci0JLyoqIG51bWJlciBvZiBsYXllcnMgKi8KLQlPUEpfVUlOVDMyIG51bWxheWVyczsKLQkvKiogbXVsdGktY29tcG9uZW50IHRyYW5zZm9ybSBpZGVudGlmaWVyICovCi0JT1BKX1VJTlQzMiBtY3Q7Ci0KLQkvKiogaW5mb3JtYXRpb24gY29uY2VybmluZyB0aWxlIGNvbXBvbmVudCBwYXJhbWV0ZXJzKi8KLQlvcGpfdGNjcF9pbmZvX3QgKnRjY3BfaW5mbzsKLQotfSBvcGpfdGlsZV9pbmZvX3YyX3Q7Ci0KLS8qKgotICogSW5mb3JtYXRpb24gc3RydWN0dXJlIGFib3V0IHRoZSBjb2Rlc3RyZWFtIChGSVhNRSBzaG91bGQgYmUgZXhwYW5kIGFuZCBlbmhhbmNlKQotICovCi10eXBlZGVmIHN0cnVjdCBvcGpfY29kZXN0cmVhbV9pbmZvX3YyIHsKLQkvKiBUaWxlIGluZm8gKi8KLQkvKiogdGlsZSBvcmlnaW4gaW4geCA9IFhUT3NpeiAqLwotCU9QSl9VSU5UMzIgdHgwOwotCS8qKiB0aWxlIG9yaWdpbiBpbiB5ID0gWVRPc2l6ICovCi0JT1BKX1VJTlQzMiB0eTA7Ci0JLyoqIHRpbGUgc2l6ZSBpbiB4ID0gWFRzaXogKi8KLQlPUEpfVUlOVDMyIHRkeDsKLQkvKiogdGlsZSBzaXplIGluIHkgPSBZVHNpeiAqLwotCU9QSl9VSU5UMzIgdGR5OwotCS8qKiBudW1iZXIgb2YgdGlsZXMgaW4gWCAqLwotCU9QSl9VSU5UMzIgdHc7Ci0JLyoqIG51bWJlciBvZiB0aWxlcyBpbiBZICovCi0JT1BKX1VJTlQzMiB0aDsKLQotCS8qKiBudW1iZXIgb2YgY29tcG9uZW50cyovCi0JT1BKX1VJTlQzMiBuYmNvbXBzOwotCi0JLyoqIERlZmF1bHQgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRpbGVzIGluc2lkZSBpbWFnZSAqLwotCW9wal90aWxlX2luZm9fdjJfdCBtX2RlZmF1bHRfdGlsZV9pbmZvOwotCi0JLyoqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aWxlcyBpbnNpZGUgaW1hZ2UgKi8KLQlvcGpfdGlsZV9pbmZvX3YyX3QgKnRpbGVfaW5mbzsgLyogRklYTUUgbm90IHVzZWQgZm9yIHRoZSBtb21lbnQgKi8KLQotfSBvcGpfY29kZXN0cmVhbV9pbmZvX3YyX3Q7Ci0KLQotLyoqCi0gKiBJbmRleCBzdHJ1Y3R1cmUgYWJvdXQgYSB0aWxlIHBhcnQKLSAqLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX3RwX2luZGV4IHsKLQkvKiogc3RhcnQgcG9zaXRpb24gKi8KLQlPUEpfT0ZGX1Qgc3RhcnRfcG9zOwotCS8qKiBlbmQgcG9zaXRpb24gb2YgdGhlIGhlYWRlciAqLwotCU9QSl9PRkZfVCBlbmRfaGVhZGVyOwotCS8qKiBlbmQgcG9zaXRpb24gKi8KLQlPUEpfT0ZGX1QgZW5kX3BvczsKLQotfSBvcGpfdHBfaW5kZXhfdDsKLQotLyoqCi0gKiBJbmRleCBzdHJ1Y3R1cmUgYWJvdXQgYSB0aWxlCi0gKi8KLXR5cGVkZWYgc3RydWN0IG9wal90aWxlX2luZGV4IHsKLQkvKiogdGlsZSBpbmRleCAqLwotCU9QSl9VSU5UMzIgdGlsZW5vOwotCi0JLyoqIG51bWJlciBvZiB0aWxlIHBhcnRzICovCi0JT1BKX1VJTlQzMiBuYl90cHM7Ci0JLyoqIGN1cnJlbnQgbmIgb2YgdGlsZSBwYXJ0IChhbGxvY2F0ZWQpKi8KLQlPUEpfVUlOVDMyIGN1cnJlbnRfbmJfdHBzOwotCS8qKiBjdXJyZW50IHRpbGUtcGFydCBpbmRleCAqLwotCU9QSl9VSU5UMzIgY3VycmVudF90cHNubzsKLQkvKiogaW5mb3JtYXRpb24gY29uY2VybmluZyB0aWxlIHBhcnRzICovCi0Jb3BqX3RwX2luZGV4X3QgKnRwX2luZGV4OwotCi0JLyogVW5pUEc+PiAqLyAvKiBOT1QgVVNFRCBGT1IgVEhFIE1PTUVOVCBJTiBUSEUgVjIgVkVSU0lPTiAqLwotCQkvKiogbnVtYmVyIG9mIG1hcmtlcnMgKi8KLQkJT1BKX1VJTlQzMiBtYXJrbnVtOwotCQkvKiogbGlzdCBvZiBtYXJrZXJzICovCi0JCW9wal9tYXJrZXJfaW5mb190ICptYXJrZXI7Ci0JCS8qKiBhY3R1YWwgc2l6ZSBvZiBtYXJrZXJzIGFycmF5ICovCi0JCU9QSl9VSU5UMzIgbWF4bWFya251bTsKLQkvKiA8PFVuaVBHICovCi0KLQkvKiogcGFja2V0IG51bWJlciAqLwotCU9QSl9VSU5UMzIgbmJfcGFja2V0OwotCS8qKiBpbmZvcm1hdGlvbiBjb25jZXJuaW5nIHBhY2tldHMgaW5zaWRlIHRpbGUgKi8KLQlvcGpfcGFja2V0X2luZm9fdCAqcGFja2V0X2luZGV4OwotCi19IG9wal90aWxlX2luZGV4X3Q7Ci0KLS8qKgotICogSW5kZXggc3RydWN0dXJlIG9mIHRoZSBjb2Rlc3RyZWFtIChGSVhNRSBzaG91bGQgYmUgZXhwYW5kIGFuZCBlbmhhbmNlKQotICovCi10eXBlZGVmIHN0cnVjdCBvcGpfY29kZXN0cmVhbV9pbmRleCB7Ci0JLyoqIG1haW4gaGVhZGVyIHN0YXJ0IHBvc2l0aW9uIChTT0MgcG9zaXRpb24pICovCi0JT1BKX09GRl9UIG1haW5faGVhZF9zdGFydDsKLQkvKiogbWFpbiBoZWFkZXIgZW5kIHBvc2l0aW9uIChmaXJzdCBTT1QgcG9zaXRpb24pICovCi0JT1BKX09GRl9UIG1haW5faGVhZF9lbmQ7Ci0KLQkvKiogY29kZXN0cmVhbSdzIHNpemUgKi8KLQlPUEpfVUlOVDY0IGNvZGVzdHJlYW1fc2l6ZTsKLQotLyogVW5pUEc+PiAqLyAvKiBOT1QgVVNFRCBGT1IgVEhFIE1PTUVOVCBJTiBUSEUgVjIgVkVSU0lPTiAqLwotCS8qKiBudW1iZXIgb2YgbWFya2VycyAqLwotCU9QSl9VSU5UMzIgbWFya251bTsKLQkvKiogbGlzdCBvZiBtYXJrZXJzICovCi0Jb3BqX21hcmtlcl9pbmZvX3QgKm1hcmtlcjsKLQkvKiogYWN0dWFsIHNpemUgb2YgbWFya2VycyBhcnJheSAqLwotCU9QSl9VSU5UMzIgbWF4bWFya251bTsKLS8qIDw8VW5pUEcgKi8KLQotCS8qKiAqLwotCU9QSl9VSU5UMzIgbmJfb2ZfdGlsZXM7Ci0JLyoqICovCi0Jb3BqX3RpbGVfaW5kZXhfdCAqdGlsZV9pbmRleDsgLyogRklYTUUgbm90IHVzZWQgZm9yIHRoZSBtb21lbnQgKi8KLQotfW9wal9jb2Rlc3RyZWFtX2luZGV4X3Q7Ci0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gKi8KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIE1ldGFkYXRhIGZyb20gdGhlIEpQMmZpbGUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi0KLS8qKgotICogSW5mbyBzdHJ1Y3R1cmUgb2YgdGhlIEpQMiBmaWxlCi0gKiBFWFBFUklNRU5UQUwgRk9SIFRIRSBNT01FTlQKLSAqLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX2pwMl9tZXRhZGF0YSB7Ci0JLyoqICovCi0JT1BKX0lOVDMyCW5vdF91c2VkOwotCi19IG9wal9qcDJfbWV0YWRhdGFfdDsKLQotLyoqCi0gKiBJbmRleCBzdHJ1Y3R1cmUgb2YgdGhlIEpQMiBmaWxlCi0gKiBFWFBFUklNRU5UQUwgRk9SIFRIRSBNT01FTlQKLSAqLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX2pwMl9pbmRleCB7Ci0JLyoqICovCi0JT1BKX0lOVDMyCW5vdF91c2VkOwotCi19IG9wal9qcDJfaW5kZXhfdDsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotLyogCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBvcGVuanBlZyB2ZXJzaW9uCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotCi0vKiBHZXQgdGhlIHZlcnNpb24gb2YgdGhlIG9wZW5qcGVnIGxpYnJhcnkqLwotT1BKX0FQSSBjb25zdCBjaGFyICogT1BKX0NBTExDT05WIG9wal92ZXJzaW9uKHZvaWQpOwotCi0vKiAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIGltYWdlIGZ1bmN0aW9ucyBkZWZpbml0aW9ucwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLQotLyoqCi0gKiBDcmVhdGUgYW4gaW1hZ2UKLSAqCi0gKiBAcGFyYW0gbnVtY21wdHMgICAgICBudW1iZXIgb2YgY29tcG9uZW50cwotICogQHBhcmFtIGNtcHRwYXJtcyAgICAgY29tcG9uZW50cyBwYXJhbWV0ZXJzCi0gKiBAcGFyYW0gY2xyc3BjICAgICAgICBpbWFnZSBjb2xvciBzcGFjZQotICogQHJldHVybiByZXR1cm5zICAgICAgYSBuZXcgaW1hZ2Ugc3RydWN0dXJlIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKLSAqICovCi1PUEpfQVBJIG9wal9pbWFnZV90KiBPUEpfQ0FMTENPTlYgb3BqX2ltYWdlX2NyZWF0ZShPUEpfVUlOVDMyIG51bWNtcHRzLCBvcGpfaW1hZ2VfY21wdHBhcm1fdCAqY21wdHBhcm1zLCBPUEpfQ09MT1JfU1BBQ0UgY2xyc3BjKTsKLQotLyoqCi0gKiBEZWFsbG9jYXRlIGFueSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGFuIGltYWdlCi0gKgotICogQHBhcmFtIGltYWdlICAgICAgICAgaW1hZ2UgdG8gYmUgZGVzdHJveWVkCi0gKi8KLU9QSl9BUEkgdm9pZCBPUEpfQ0FMTENPTlYgb3BqX2ltYWdlX2Rlc3Ryb3kob3BqX2ltYWdlX3QgKmltYWdlKTsKLQotLyoqCi0gKiBDcmVhdGVzIGFuIGltYWdlIHdpdGhvdXQgYWxsb2NhdGluZyBtZW1vcnkgZm9yIHRoZSBpbWFnZSAodXNlZCBpbiB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIGxpYnJhcnkpLgotICoKLSAqIEBwYXJhbQludW1jbXB0cyAgICB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMKLSAqIEBwYXJhbQljbXB0cGFybXMgICB0aGUgY29tcG9uZW50cyBwYXJhbWV0ZXJzCi0gKiBAcGFyYW0JY2xyc3BjICAgICAgdGhlIGltYWdlIGNvbG9yIHNwYWNlCi0gKgotICogQHJldHVybglhIG5ldyBpbWFnZSBzdHJ1Y3R1cmUgaWYgc3VjY2Vzc2Z1bCwgTlVMTCBvdGhlcndpc2UuCi0qLwotT1BKX0FQSSBvcGpfaW1hZ2VfdCogT1BKX0NBTExDT05WIG9wal9pbWFnZV90aWxlX2NyZWF0ZShPUEpfVUlOVDMyIG51bWNtcHRzLCBvcGpfaW1hZ2VfY21wdHBhcm1fdCAqY21wdHBhcm1zLCBPUEpfQ09MT1JfU1BBQ0UgY2xyc3BjKTsKLQotLyogCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBzdHJlYW0gZnVuY3Rpb25zIGRlZmluaXRpb25zCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotCi0vKioKLSAqIENyZWF0ZXMgYW4gYWJzdHJhY3Qgc3RyZWFtLiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZyBleGNlcHQgYWxsb2NhdGluZyBtZW1vcnkgYW5kIGluaXRpYWxpemluZyB0aGUgYWJzdHJhY3Qgc3RyZWFtLgotICoKLSAqIEBwYXJhbQlwX2lzX2lucHV0CQlpZiBzZXQgdG8gdHJ1ZSB0aGVuIHRoZSBzdHJlYW0gd2lsbCBiZSBhbiBpbnB1dCBzdHJlYW0sIGFuIG91dHB1dCBzdHJlYW0gZWxzZS4KLSAqCi0gKiBAcmV0dXJuCWEgc3RyZWFtIG9iamVjdC4KLSovCi1PUEpfQVBJIG9wal9zdHJlYW1fdCogT1BKX0NBTExDT05WIG9wal9zdHJlYW1fZGVmYXVsdF9jcmVhdGUoT1BKX0JPT0wgcF9pc19pbnB1dCk7Ci0KLS8qKgotICogQ3JlYXRlcyBhbiBhYnN0cmFjdCBzdHJlYW0uIFRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nIGV4Y2VwdCBhbGxvY2F0aW5nIG1lbW9yeSBhbmQgaW5pdGlhbGl6aW5nIHRoZSBhYnN0cmFjdCBzdHJlYW0uCi0gKgotICogQHBhcmFtCXBfYnVmZmVyX3NpemUgIEZJWE1FIERPQwotICogQHBhcmFtCXBfaXNfaW5wdXQJCWlmIHNldCB0byB0cnVlIHRoZW4gdGhlIHN0cmVhbSB3aWxsIGJlIGFuIGlucHV0IHN0cmVhbSwgYW4gb3V0cHV0IHN0cmVhbSBlbHNlLgotICoKLSAqIEByZXR1cm4JYSBzdHJlYW0gb2JqZWN0LgotKi8KLU9QSl9BUEkgb3BqX3N0cmVhbV90KiBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9jcmVhdGUoT1BKX1NJWkVfVCBwX2J1ZmZlcl9zaXplLCBPUEpfQk9PTCBwX2lzX2lucHV0KTsKLQotLyoqCi0gKiBEZXN0cm95cyBhIHN0cmVhbSBjcmVhdGVkIGJ5IG9wal9jcmVhdGVfc3RyZWFtLiBUaGlzIGZ1bmN0aW9uIGRvZXMgTk9UIGNsb3NlIHRoZSBhYnN0cmFjdCBzdHJlYW0uIElmIG5lZWRlZCB0aGUgdXNlciBtdXN0Ci0gKiBjbG9zZSBpdHMgb3duIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzdHJlYW0uCi0gKgotICogQHBhcmFtCXBfc3RyZWFtCXRoZSBzdHJlYW0gdG8gZGVzdHJveS4KLSAqLwotT1BKX0FQSSB2b2lkIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX2Rlc3Ryb3kob3BqX3N0cmVhbV90KiBwX3N0cmVhbSk7Ci0gCi0vKioKLSAqIFNldHMgdGhlIGdpdmVuIGZ1bmN0aW9uIHRvIGJlIHVzZWQgYXMgYSByZWFkIGZ1bmN0aW9uLgotICogQHBhcmFtCQlwX3N0cmVhbQl0aGUgc3RyZWFtIHRvIG1vZGlmeQotICogQHBhcmFtCQlwX2Z1bmN0aW9uCXRoZSBmdW5jdGlvbiB0byB1c2UgYSByZWFkIGZ1bmN0aW9uLgotKi8KLU9QSl9BUEkgdm9pZCBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9zZXRfcmVhZF9mdW5jdGlvbihvcGpfc3RyZWFtX3QqIHBfc3RyZWFtLCBvcGpfc3RyZWFtX3JlYWRfZm4gcF9mdW5jdGlvbik7Ci0KLS8qKgotICogU2V0cyB0aGUgZ2l2ZW4gZnVuY3Rpb24gdG8gYmUgdXNlZCBhcyBhIHdyaXRlIGZ1bmN0aW9uLgotICogQHBhcmFtCQlwX3N0cmVhbQl0aGUgc3RyZWFtIHRvIG1vZGlmeQotICogQHBhcmFtCQlwX2Z1bmN0aW9uCXRoZSBmdW5jdGlvbiB0byB1c2UgYSB3cml0ZSBmdW5jdGlvbi4KLSovCi1PUEpfQVBJIHZvaWQgT1BKX0NBTExDT05WIG9wal9zdHJlYW1fc2V0X3dyaXRlX2Z1bmN0aW9uKG9wal9zdHJlYW1fdCogcF9zdHJlYW0sIG9wal9zdHJlYW1fd3JpdGVfZm4gcF9mdW5jdGlvbik7Ci0KLS8qKgotICogU2V0cyB0aGUgZ2l2ZW4gZnVuY3Rpb24gdG8gYmUgdXNlZCBhcyBhIHNraXAgZnVuY3Rpb24uCi0gKiBAcGFyYW0JCXBfc3RyZWFtCXRoZSBzdHJlYW0gdG8gbW9kaWZ5Ci0gKiBAcGFyYW0JCXBfZnVuY3Rpb24JdGhlIGZ1bmN0aW9uIHRvIHVzZSBhIHNraXAgZnVuY3Rpb24uCi0qLwotT1BKX0FQSSB2b2lkIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX3NldF9za2lwX2Z1bmN0aW9uKG9wal9zdHJlYW1fdCogcF9zdHJlYW0sIG9wal9zdHJlYW1fc2tpcF9mbiBwX2Z1bmN0aW9uKTsKLQotLyoqCi0gKiBTZXRzIHRoZSBnaXZlbiBmdW5jdGlvbiB0byBiZSB1c2VkIGFzIGEgc2VlayBmdW5jdGlvbiwgdGhlIHN0cmVhbSBpcyB0aGVuIHNlZWthYmxlLgotICogQHBhcmFtCQlwX3N0cmVhbQl0aGUgc3RyZWFtIHRvIG1vZGlmeQotICogQHBhcmFtCQlwX2Z1bmN0aW9uCXRoZSBmdW5jdGlvbiB0byB1c2UgYSBza2lwIGZ1bmN0aW9uLgotKi8KLU9QSl9BUEkgdm9pZCBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9zZXRfc2Vla19mdW5jdGlvbihvcGpfc3RyZWFtX3QqIHBfc3RyZWFtLCBvcGpfc3RyZWFtX3NlZWtfZm4gcF9mdW5jdGlvbik7Ci0KLS8qKgotICogU2V0cyB0aGUgZ2l2ZW4gZGF0YSB0byBiZSB1c2VkIGFzIGEgdXNlciBkYXRhIGZvciB0aGUgc3RyZWFtLgotICogQHBhcmFtCQlwX3N0cmVhbQl0aGUgc3RyZWFtIHRvIG1vZGlmeQotICogQHBhcmFtCQlwX2RhdGEJCXRoZSBkYXRhIHRvIHNldC4KLSAqIEBwYXJhbQkJcF9mdW5jdGlvbgl0aGUgZnVuY3Rpb24gdG8gZnJlZSBwX2RhdGEgd2hlbiBvcGpfc3RyZWFtX2Rlc3Ryb3koKSBpcyBjYWxsZWQuCi0qLwotT1BKX0FQSSB2b2lkIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX3NldF91c2VyX2RhdGEgKG9wal9zdHJlYW1fdCogcF9zdHJlYW0sIHZvaWQgKiBwX2RhdGEsIG9wal9zdHJlYW1fZnJlZV91c2VyX2RhdGFfZm4gcF9mdW5jdGlvbik7Ci0KLS8qKgotICogU2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSB1c2VyIGRhdGEgZm9yIHRoZSBzdHJlYW0uCi0gKgotICogQHBhcmFtIHBfc3RyZWFtICAgIHRoZSBzdHJlYW0gdG8gbW9kaWZ5Ci0gKiBAcGFyYW0gZGF0YV9sZW5ndGggbGVuZ3RoIG9mIHRoZSB1c2VyX2RhdGEuCi0qLwotT1BKX0FQSSB2b2lkIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX3NldF91c2VyX2RhdGFfbGVuZ3RoKG9wal9zdHJlYW1fdCogcF9zdHJlYW0sIE9QSl9VSU5UNjQgZGF0YV9sZW5ndGgpOwotCi0vKioKLSAqIENyZWF0ZSBhIHN0cmVhbSBmcm9tIGEgZmlsZSBpZGVudGlmaWVkIHdpdGggaXRzIGZpbGVuYW1lIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzIChoZWxwZXIgZnVuY3Rpb24pCi0gKiBAcGFyYW0gZm5hbWUgICAgICAgICAgICAgdGhlIGZpbGVuYW1lIG9mIHRoZSBmaWxlIHRvIHN0cmVhbQotICogQHBhcmFtIHBfaXNfcmVhZF9zdHJlYW0gIHdoZXRoZXIgdGhlIHN0cmVhbSBpcyBhIHJlYWQgc3RyZWFtICh0cnVlKSBvciBub3QgKGZhbHNlKQotKi8KLU9QSl9BUEkgb3BqX3N0cmVhbV90KiBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9jcmVhdGVfZGVmYXVsdF9maWxlX3N0cmVhbSAoY29uc3QgY2hhciAqZm5hbWUsIE9QSl9CT09MIHBfaXNfcmVhZF9zdHJlYW0pOwotIAotLyoqIENyZWF0ZSBhIHN0cmVhbSBmcm9tIGEgZmlsZSBpZGVudGlmaWVkIHdpdGggaXRzIGZpbGVuYW1lIHdpdGggYSBzcGVjaWZpYyBidWZmZXIgc2l6ZQotICogQHBhcmFtIGZuYW1lICAgICAgICAgICAgIHRoZSBmaWxlbmFtZSBvZiB0aGUgZmlsZSB0byBzdHJlYW0KLSAqIEBwYXJhbSBwX2J1ZmZlcl9zaXplICAgICBzaXplIG9mIHRoZSBjaHVuayB1c2VkIHRvIHN0cmVhbQotICogQHBhcmFtIHBfaXNfcmVhZF9zdHJlYW0gIHdoZXRoZXIgdGhlIHN0cmVhbSBpcyBhIHJlYWQgc3RyZWFtICh0cnVlKSBvciBub3QgKGZhbHNlKQotKi8KLU9QSl9BUEkgb3BqX3N0cmVhbV90KiBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9jcmVhdGVfZmlsZV9zdHJlYW0gKGNvbnN0IGNoYXIgKmZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1NJWkVfVCBwX2J1ZmZlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JPT0wgcF9pc19yZWFkX3N0cmVhbSk7Ci0gCi0vKiAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIGV2ZW50IG1hbmFnZXIgZnVuY3Rpb25zIGRlZmluaXRpb25zCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotLyoqCi0gKiBTZXQgdGhlIGluZm8gaGFuZGxlciB1c2UgYnkgb3BlbmpwZWcuCi0gKiBAcGFyYW0gcF9jb2RlYyAgICAgICB0aGUgY29kZWMgcHJldmlvdXNseSBpbml0aWFsaXNlCi0gKiBAcGFyYW0gcF9jYWxsYmFjayAgICB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSB1c2VkCi0gKiBAcGFyYW0gcF91c2VyX2RhdGEgICBjbGllbnQgb2JqZWN0IHdoZXJlIHdpbGwgYmUgcmV0dXJuZWQgdGhlIG1lc3NhZ2UKLSovCi1PUEpfQVBJIE9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfc2V0X2luZm9faGFuZGxlcihvcGpfY29kZWNfdCAqIHBfY29kZWMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX21zZ19jYWxsYmFjayBwX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIHBfdXNlcl9kYXRhKTsKLS8qKgotICogU2V0IHRoZSB3YXJuaW5nIGhhbmRsZXIgdXNlIGJ5IG9wZW5qcGVnLgotICogQHBhcmFtIHBfY29kZWMgICAgICAgdGhlIGNvZGVjIHByZXZpb3VzbHkgaW5pdGlhbGlzZQotICogQHBhcmFtIHBfY2FsbGJhY2sgICAgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgdXNlZAotICogQHBhcmFtIHBfdXNlcl9kYXRhICAgY2xpZW50IG9iamVjdCB3aGVyZSB3aWxsIGJlIHJldHVybmVkIHRoZSBtZXNzYWdlCi0qLwotT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3NldF93YXJuaW5nX2hhbmRsZXIob3BqX2NvZGVjX3QgKiBwX2NvZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX21zZ19jYWxsYmFjayBwX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIHBfdXNlcl9kYXRhKTsKLS8qKgotICogU2V0IHRoZSBlcnJvciBoYW5kbGVyIHVzZSBieSBvcGVuanBlZy4KLSAqIEBwYXJhbSBwX2NvZGVjICAgICAgIHRoZSBjb2RlYyBwcmV2aW91c2x5IGluaXRpYWxpc2UKLSAqIEBwYXJhbSBwX2NhbGxiYWNrICAgIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIHVzZWQKLSAqIEBwYXJhbSBwX3VzZXJfZGF0YSAgIGNsaWVudCBvYmplY3Qgd2hlcmUgd2lsbCBiZSByZXR1cm5lZCB0aGUgbWVzc2FnZQotKi8KLU9QSl9BUEkgT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9zZXRfZXJyb3JfaGFuZGxlcihvcGpfY29kZWNfdCAqIHBfY29kZWMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9tc2dfY2FsbGJhY2sgcF9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogcF91c2VyX2RhdGEpOwotCi0vKiAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIGNvZGVjIGZ1bmN0aW9ucyBkZWZpbml0aW9ucwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLQotLyoqCi0gKiBDcmVhdGVzIGEgSjJLL0pQMiBkZWNvbXByZXNzaW9uIHN0cnVjdHVyZQotICogQHBhcmFtIGZvcm1hdCAJCURlY29kZXIgdG8gc2VsZWN0Ci0gKgotICogQHJldHVybiBSZXR1cm5zIGEgaGFuZGxlIHRvIGEgZGVjb21wcmVzc29yIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKLSAqICovCi1PUEpfQVBJIG9wal9jb2RlY190KiBPUEpfQ0FMTENPTlYgb3BqX2NyZWF0ZV9kZWNvbXByZXNzKE9QSl9DT0RFQ19GT1JNQVQgZm9ybWF0KTsKLQotLyoqCi0gKiBEZXN0cm95IGEgZGVjb21wcmVzc29yIGhhbmRsZQotICoKLSAqIEBwYXJhbQlwX2NvZGVjCQkJZGVjb21wcmVzc29yIGhhbmRsZSB0byBkZXN0cm95Ci0gKi8KLU9QSl9BUEkgdm9pZCBPUEpfQ0FMTENPTlYgb3BqX2Rlc3Ryb3lfY29kZWMob3BqX2NvZGVjX3QgKiBwX2NvZGVjKTsKLQotLyoqCi0gKiBSZWFkIGFmdGVyIHRoZSBjb2Rlc3RyZWFtIGlmIG5lY2Vzc2FyeQotICogQHBhcmFtCXBfY29kZWMJCQl0aGUgSlBFRzIwMDAgY29kZWMgdG8gcmVhZC4KLSAqIEBwYXJhbQlwX3N0cmVhbQkJdGhlIEpQRUcyMDAwIHN0cmVhbS4KLSAqLwotT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX2VuZF9kZWNvbXByZXNzICgJb3BqX2NvZGVjX3QgKnBfY29kZWMsCi0JCQkJCQkJCQkJCQkJb3BqX3N0cmVhbV90ICpwX3N0cmVhbSk7Ci0KLQotLyoqCi0gKiBTZXQgZGVjb2RpbmcgcGFyYW1ldGVycyB0byBkZWZhdWx0IHZhbHVlcwotICogQHBhcmFtIHBhcmFtZXRlcnMgRGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzCi0gKi8KLU9QSl9BUEkgdm9pZCBPUEpfQ0FMTENPTlYgb3BqX3NldF9kZWZhdWx0X2RlY29kZXJfcGFyYW1ldGVycyhvcGpfZHBhcmFtZXRlcnNfdCAqcGFyYW1ldGVycyk7Ci0KLS8qKgotICogU2V0dXAgdGhlIGRlY29kZXIgd2l0aCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgcHJvdmlkZWQgYnkgdGhlIHVzZXIgYW5kIHdpdGggdGhlIG1lc3NhZ2UgaGFuZGxlcgotICogcHJvdmlkZWQgYnkgdGhlIHVzZXIuCi0gKgotICogQHBhcmFtIHBfY29kZWMgCQlkZWNvbXByZXNzb3IgaGFuZGxlcgotICogQHBhcmFtIHBhcmFtZXRlcnMgCWRlY29tcHJlc3Npb24gcGFyYW1ldGVycwotICoKLSAqIEByZXR1cm4gdHJ1ZQkJCWlmIHRoZSBkZWNvZGVyIGlzIGNvcnJlY3RseSBzZXQKLSAqLwotT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3NldHVwX2RlY29kZXIob3BqX2NvZGVjX3QgKnBfY29kZWMsCi0JCQkJCQkJCQkJCQlvcGpfZHBhcmFtZXRlcnNfdCAqcGFyYW1ldGVycyApOwotCi0vKioKLSAqIERlY29kZXMgYW4gaW1hZ2UgaGVhZGVyLgotICoKLSAqIEBwYXJhbQlwX3N0cmVhbQkJdGhlIGpwZWcyMDAwIHN0cmVhbS4KLSAqIEBwYXJhbQlwX2NvZGVjCQkJdGhlIGpwZWcyMDAwIGNvZGVjIHRvIHJlYWQuCi0gKiBAcGFyYW0JcF9pbWFnZQkJCXRoZSBpbWFnZSBzdHJ1Y3R1cmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIGVuY29kZWQgaW1hZ2UuCi0gKgotICogQHJldHVybiB0cnVlCQkJCWlmIHRoZSBtYWluIGhlYWRlciBvZiB0aGUgY29kZXN0cmVhbSBhbmQgdGhlIEpQMiBoZWFkZXIgaXMgY29ycmVjdGx5IHJlYWQuCi0gKi8KLU9QSl9BUEkgT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9yZWFkX2hlYWRlciAoCW9wal9zdHJlYW1fdCAqcF9zdHJlYW0sCi0JCQkJCQkJCQkJCQlvcGpfY29kZWNfdCAqcF9jb2RlYywKLQkJCQkJCQkJCQkJCW9wal9pbWFnZV90ICoqcF9pbWFnZSk7Ci0KLS8qKgotICogU2V0cyB0aGUgZ2l2ZW4gYXJlYSB0byBiZSBkZWNvZGVkLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgcmlnaHQgYWZ0ZXIgb3BqX3JlYWRfaGVhZGVyIGFuZCBiZWZvcmUgYW55IHRpbGUgaGVhZGVyIHJlYWRpbmcuCi0gKgotICogQHBhcmFtCXBfY29kZWMJCQl0aGUganBlZzIwMDAgY29kZWMuCi0gKiBAcGFyYW0JcF9pbWFnZSAgICAgICAgIHRoZSBkZWNvZGVkIGltYWdlIHByZXZpb3VzbHkgc2V0dGVkIGJ5IG9wal9yZWFkX2hlYWRlcgotICogQHBhcmFtCXBfc3RhcnRfeAkJdGhlIGxlZnQgcG9zaXRpb24gb2YgdGhlIHJlY3RhbmdsZSB0byBkZWNvZGUgKGluIGltYWdlIGNvb3JkaW5hdGVzKS4KLSAqIEBwYXJhbQlwX2VuZF94CQkJdGhlIHJpZ2h0IHBvc2l0aW9uIG9mIHRoZSByZWN0YW5nbGUgdG8gZGVjb2RlIChpbiBpbWFnZSBjb29yZGluYXRlcykuCi0gKiBAcGFyYW0JcF9zdGFydF95CQl0aGUgdXAgcG9zaXRpb24gb2YgdGhlIHJlY3RhbmdsZSB0byBkZWNvZGUgKGluIGltYWdlIGNvb3JkaW5hdGVzKS4KLSAqIEBwYXJhbQlwX2VuZF95CQkJdGhlIGJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgcmVjdGFuZ2xlIHRvIGRlY29kZSAoaW4gaW1hZ2UgY29vcmRpbmF0ZXMpLgotICoKLSAqIEByZXR1cm4JdHJ1ZQkJCWlmIHRoZSBhcmVhIGNvdWxkIGJlIHNldC4KLSAqLwotT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3NldF9kZWNvZGVfYXJlYSgJb3BqX2NvZGVjX3QgKnBfY29kZWMsCi0JCQkJCQkJCQkJCQkJb3BqX2ltYWdlX3QqIHBfaW1hZ2UsCi0JCQkJCQkJCQkJCQkJT1BKX0lOVDMyIHBfc3RhcnRfeCwgT1BKX0lOVDMyIHBfc3RhcnRfeSwKLQkJCQkJCQkJCQkJCQlPUEpfSU5UMzIgcF9lbmRfeCwgT1BKX0lOVDMyIHBfZW5kX3kgKTsKLQotLyoqCi0gKiBEZWNvZGUgYW4gaW1hZ2UgZnJvbSBhIEpQRUctMjAwMCBjb2Rlc3RyZWFtCi0gKgotICogQHBhcmFtIHBfZGVjb21wcmVzc29yIAlkZWNvbXByZXNzb3IgaGFuZGxlCi0gKiBAcGFyYW0gcF9zdHJlYW0JCQlJbnB1dCBidWZmZXIgc3RyZWFtCi0gKiBAcGFyYW0gcF9pbWFnZSAJCQl0aGUgZGVjb2RlZCBpbWFnZQotICogQHJldHVybiAJCQkJCXRydWUgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlCi0gKiAqLwotT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX2RlY29kZSggICBvcGpfY29kZWNfdCAqcF9kZWNvbXByZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90ICpwX2ltYWdlKTsKLQotLyoqCi0gKiBHZXQgdGhlIGRlY29kZWQgdGlsZSBmcm9tIHRoZSBjb2RlYwotICoKLSAqIEBwYXJhbQlwX2NvZGVjCQkJdGhlIGpwZWcyMDAwIGNvZGVjLgotICogQHBhcmFtCXBfc3RyZWFtCQlpbnB1dCBzdHJlYW1tCi0gKiBAcGFyYW0JcF9pbWFnZQkJCW91dHB1dCBpbWFnZQotICogQHBhcmFtCXRpbGVfaW5kZXgJCWluZGV4IG9mIHRoZSB0aWxlIHdoaWNoIHdpbGwgYmUgZGVjb2RlCi0gKgotICogQHJldHVybgkJCQkJdHJ1ZSBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UKLSAqLwotT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX2dldF9kZWNvZGVkX3RpbGUoCW9wal9jb2RlY190ICpwX2NvZGVjLAotCQkJCQkJCQkJCQkJCW9wal9zdHJlYW1fdCAqcF9zdHJlYW0sCi0JCQkJCQkJCQkJCQkJb3BqX2ltYWdlX3QgKnBfaW1hZ2UsCi0JCQkJCQkJCQkJCQkJT1BKX1VJTlQzMiB0aWxlX2luZGV4KTsKLQotLyoqCi0gKiBTZXQgdGhlIHJlc29sdXRpb24gZmFjdG9yIG9mIHRoZSBkZWNvZGVkIGltYWdlCi0gKiBAcGFyYW0JcF9jb2RlYwkJCXRoZSBqcGVnMjAwMCBjb2RlYy4KLSAqIEBwYXJhbQlyZXNfZmFjdG9yCQlyZXNvbHV0aW9uIGZhY3RvciB0byBzZXQKLSAqCi0gKiBAcmV0dXJuCQkJCQl0cnVlIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZQotICovCi1PUEpfQVBJIE9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfc2V0X2RlY29kZWRfcmVzb2x1dGlvbl9mYWN0b3Iob3BqX2NvZGVjX3QgKnBfY29kZWMsIE9QSl9VSU5UMzIgcmVzX2ZhY3Rvcik7Ci0KLS8qKgotICogV3JpdGVzIGEgdGlsZSB3aXRoIHRoZSBnaXZlbiBkYXRhLgotICoKLSAqIEBwYXJhbQlwX2NvZGVjCQkgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KLSAqIEBwYXJhbQlwX3RpbGVfaW5kZXgJCXRoZSBpbmRleCBvZiB0aGUgdGlsZSB0byB3cml0ZS4gQXQgdGhlIG1vbWVudCwgdGhlIHRpbGVzIG11c3QgYmUgd3JpdHRlbiBmcm9tIDAgdG8gbi0xIGluIHNlcXVlbmNlLgotICogQHBhcmFtCXBfZGF0YQkJCQlwb2ludGVyIHRvIHRoZSBkYXRhIHRvIHdyaXRlLiBEYXRhIGlzIGFycmFuZ2VkIGluIHNlcXVlbmNlLCBkYXRhX2NvbXAwLCB0aGVuIGRhdGFfY29tcDEsIHRoZW4gLi4uIE5PIElOVEVSTEVBVklORyBzaG91bGQgYmUgc2V0LgotICogQHBhcmFtCXBfZGF0YV9zaXplCQkJdGhpcyB2YWx1ZSBvcyB1c2VkIHRvIG1ha2Ugc3VyZSB0aGUgZGF0YSBiZWluZyB3cml0dGVuIGlzIGNvcnJlY3QuIFRoZSBzaXplIG11c3QgYmUgZXF1YWwgdG8gdGhlIHN1bSBmb3IgZWFjaCBjb21wb25lbnQgb2YgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfd2lkdGggKiB0aWxlX2hlaWdodCAqIGNvbXBvbmVudF9zaXplLiBjb21wb25lbnRfc2l6ZSBjYW4gYmUgMSwyIG9yIDQgYnl0ZXMsIGRlcGVuZGluZyBvbiB0aGUgcHJlY2lzaW9uIG9mIHRoZSBnaXZlbiBjb21wb25lbnQuCi0gKiBAcGFyYW0JcF9zdHJlYW0JCQl0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCi0gKgotICogQHJldHVybgl0cnVlIGlmIHRoZSBkYXRhIGNvdWxkIGJlIHdyaXR0ZW4uCi0gKi8KLU9QSl9BUEkgT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal93cml0ZV90aWxlICgJb3BqX2NvZGVjX3QgKnBfY29kZWMsCi0JCQkJCQkJCQkJCQlPUEpfVUlOVDMyIHBfdGlsZV9pbmRleCwKLQkJCQkJCQkJCQkJCU9QSl9CWVRFICogcF9kYXRhLAotCQkJCQkJCQkJCQkJT1BKX1VJTlQzMiBwX2RhdGFfc2l6ZSwKLQkJCQkJCQkJCQkJCW9wal9zdHJlYW1fdCAqcF9zdHJlYW0gKTsKLQotLyoqCi0gKiBSZWFkcyBhIHRpbGUgaGVhZGVyLiBUaGlzIGZ1bmN0aW9uIGlzIGNvbXB1bHNvcnkgYW5kIGFsbG93cyBvbmUgdG8ga25vdyB0aGUgc2l6ZSBvZiB0aGUgdGlsZSB0aHRhIHdpbGwgYmUgZGVjb2RlZC4KLSAqIFRoZSB1c2VyIG1heSBuZWVkIHRvIHJlZmVyIHRvIHRoZSBpbWFnZSBnb3QgYnkgb3BqX3JlYWRfaGVhZGVyIHRvIHVuZGVyc3RhbmQgdGhlIHNpemUgYmVpbmcgdGFrZW4gYnkgdGhlIHRpbGUuCi0gKgotICogQHBhcmFtCXBfY29kZWMJCQl0aGUganBlZzIwMDAgY29kZWMuCi0gKiBAcGFyYW0JcF90aWxlX2luZGV4CXBvaW50ZXIgdG8gYSB2YWx1ZSB0aGF0IHdpbGwgaG9sZCB0aGUgaW5kZXggb2YgdGhlIHRpbGUgYmVpbmcgZGVjb2RlZCwgaW4gY2FzZSBvZiBzdWNjZXNzLgotICogQHBhcmFtCXBfZGF0YV9zaXplCQlwb2ludGVyIHRvIGEgdmFsdWUgdGhhdCB3aWxsIGhvbGQgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgZGVjb2RlZCBkYXRhLCBpbiBjYXNlIG9mIHN1Y2Nlc3MuIEluIGNhc2UKLSAqCQkJCQkJCW9mIHRydW5jYXRlZCBjb2Rlc3RyZWFtcywgdGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgZGVjb2RlZCBtYXkgYmUgbG93ZXIuIFRoZSBjb21wdXRhdGlvbiBvZiB0aGUgc2l6ZSBpcyB0aGUgc2FtZQotICoJCQkJCQkJYXMgZGVwaWN0ZWQgaW4gb3BqX3dyaXRlX3RpbGUuCi0gKiBAcGFyYW0JcF90aWxlX3gwCQlwb2ludGVyIHRvIGEgdmFsdWUgdGhhdCB3aWxsIGhvbGQgdGhlIHgwIHBvcyBvZiB0aGUgdGlsZSAoaW4gdGhlIGltYWdlKS4KLSAqIEBwYXJhbQlwX3RpbGVfeTAJCXBvaW50ZXIgdG8gYSB2YWx1ZSB0aGF0IHdpbGwgaG9sZCB0aGUgeTAgcG9zIG9mIHRoZSB0aWxlIChpbiB0aGUgaW1hZ2UpLgotICogQHBhcmFtCXBfdGlsZV94MQkJcG9pbnRlciB0byBhIHZhbHVlIHRoYXQgd2lsbCBob2xkIHRoZSB4MSBwb3Mgb2YgdGhlIHRpbGUgKGluIHRoZSBpbWFnZSkuCi0gKiBAcGFyYW0JcF90aWxlX3kxCQlwb2ludGVyIHRvIGEgdmFsdWUgdGhhdCB3aWxsIGhvbGQgdGhlIHkxIHBvcyBvZiB0aGUgdGlsZSAoaW4gdGhlIGltYWdlKS4KLSAqIEBwYXJhbQlwX25iX2NvbXBzCQlwb2ludGVyIHRvIGEgdmFsdWUgdGhhdCB3aWxsIGhvbGQgdGhlIG51bWJlciBvZiBjb21wb25lbnRzIGluIHRoZSB0aWxlLgotICogQHBhcmFtCXBfc2hvdWxkX2dvX29uCXBvaW50ZXIgdG8gYSBib29sZWFuIHRoYXQgd2lsbCBob2xkIHRoZSBmYWN0IHRoYXQgdGhlIGRlY29kaW5nIHNob3VsZCBnbyBvbi4gSW4gY2FzZSB0aGUKLSAqCQkJCQkJCWNvZGVzdHJlYW0gaXMgb3ZlciBhdCB0aGUgdGltZSBvZiB0aGUgY2FsbCwgdGhlIHZhbHVlIHdpbGwgYmUgc2V0IHRvIGZhbHNlLiBUaGUgdXNlciBzaG91bGQgdGhlbiBzdG9wCi0gKgkJCQkJCQl0aGUgZGVjb2RpbmcuCi0gKiBAcGFyYW0JcF9zdHJlYW0JCXRoZSBzdHJlYW0gdG8gZGVjb2RlLgotICogQHJldHVybgl0cnVlCQkJaWYgdGhlIHRpbGUgaGVhZGVyIGNvdWxkIGJlIGRlY29kZWQuIEluIGNhc2UgdGhlIGRlY29kaW5nIHNob3VsZCBlbmQsIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBzdGlsbCB0cnVlLgotICoJCQkJCQkJcmV0dXJuaW5nIGZhbHNlIG1heSBiZSB0aGUgcmVzdWx0IG9mIGEgc2hvcnRhZ2Ugb2YgbWVtb3J5IG9yIGFuIGludGVybmFsIGVycm9yLgotICovCi1PUEpfQVBJIE9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfcmVhZF90aWxlX2hlYWRlcigJb3BqX2NvZGVjX3QgKnBfY29kZWMsCi0JCQkJCQkJCQkJCQlvcGpfc3RyZWFtX3QgKiBwX3N0cmVhbSwKLQkJCQkJCQkJCQkJCU9QSl9VSU5UMzIgKiBwX3RpbGVfaW5kZXgsCi0JCQkJCQkJCQkJCQlPUEpfVUlOVDMyICogcF9kYXRhX3NpemUsCi0JCQkJCQkJCQkJCQlPUEpfSU5UMzIgKiBwX3RpbGVfeDAsIE9QSl9JTlQzMiAqIHBfdGlsZV95MCwKLQkJCQkJCQkJCQkJCU9QSl9JTlQzMiAqIHBfdGlsZV94MSwgT1BKX0lOVDMyICogcF90aWxlX3kxLAotCQkJCQkJCQkJCQkJT1BKX1VJTlQzMiAqIHBfbmJfY29tcHMsCi0JCQkJCQkJCQkJCQlPUEpfQk9PTCAqIHBfc2hvdWxkX2dvX29uICk7Ci0KLS8qKgotICogUmVhZHMgYSB0aWxlIGRhdGEuIFRoaXMgZnVuY3Rpb24gaXMgY29tcHVsc29yeSBhbmQgYWxsb3dzIG9uZSB0byBkZWNvZGUgdGlsZSBkYXRhLiBvcGpfcmVhZF90aWxlX2hlYWRlciBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZS4KLSAqIFRoZSB1c2VyIG1heSBuZWVkIHRvIHJlZmVyIHRvIHRoZSBpbWFnZSBnb3QgYnkgb3BqX3JlYWRfaGVhZGVyIHRvIHVuZGVyc3RhbmQgdGhlIHNpemUgYmVpbmcgdGFrZW4gYnkgdGhlIHRpbGUuCi0gKgotICogQHBhcmFtCXBfY29kZWMJCQl0aGUganBlZzIwMDAgY29kZWMuCi0gKiBAcGFyYW0JcF90aWxlX2luZGV4CXRoZSBpbmRleCBvZiB0aGUgdGlsZSBiZWluZyBkZWNvZGVkLCB0aGlzIHNob3VsZCBiZSB0aGUgdmFsdWUgc2V0IGJ5IG9wal9yZWFkX3RpbGVfaGVhZGVyLgotICogQHBhcmFtCXBfZGF0YQkJCXBvaW50ZXIgdG8gYSBtZW1vcnkgYmxvY2sgdGhhdCB3aWxsIGhvbGQgdGhlIGRlY29kZWQgZGF0YS4KLSAqIEBwYXJhbQlwX2RhdGFfc2l6ZQkJc2l6ZSBvZiBwX2RhdGEuIHBfZGF0YV9zaXplIHNob3VsZCBiZSBiaWdnZXIgb3IgZXF1YWwgdG8gdGhlIHZhbHVlIHNldCBieSBvcGpfcmVhZF90aWxlX2hlYWRlci4KLSAqIEBwYXJhbQlwX3N0cmVhbQkJdGhlIHN0cmVhbSB0byBkZWNvZGUuCi0gKgotICogQHJldHVybgl0cnVlCQkJaWYgdGhlIGRhdGEgY291bGQgYmUgZGVjb2RlZC4KLSAqLwotT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX2RlY29kZV90aWxlX2RhdGEoCW9wal9jb2RlY190ICpwX2NvZGVjLAotCQkJCQkJCQkJCQkJCU9QSl9VSU5UMzIgcF90aWxlX2luZGV4LAotCQkJCQkJCQkJCQkJCU9QSl9CWVRFICogcF9kYXRhLAotCQkJCQkJCQkJCQkJCU9QSl9VSU5UMzIgcF9kYXRhX3NpemUsCi0JCQkJCQkJCQkJCQkJb3BqX3N0cmVhbV90ICpwX3N0cmVhbSApOwotCi0vKiBDT01QUkVTU0lPTiBGVU5DVElPTlMqLwotCi0vKioKLSAqIENyZWF0ZXMgYSBKMksvSlAyIGNvbXByZXNzaW9uIHN0cnVjdHVyZQotICogQHBhcmFtIAlmb3JtYXQgCQlDb2RlciB0byBzZWxlY3QKLSAqIEByZXR1cm4gCQkJCVJldHVybnMgYSBoYW5kbGUgdG8gYSBjb21wcmVzc29yIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKLSAqLwotT1BKX0FQSSBvcGpfY29kZWNfdCogT1BKX0NBTExDT05WIG9wal9jcmVhdGVfY29tcHJlc3MoT1BKX0NPREVDX0ZPUk1BVCBmb3JtYXQpOwotCi0vKioKLVNldCBlbmNvZGluZyBwYXJhbWV0ZXJzIHRvIGRlZmF1bHQgdmFsdWVzLCB0aGF0IG1lYW5zIDogCi08dWw+Ci08bGk+TG9zc2xlc3MKLTxsaT4xIHRpbGUKLTxsaT5TaXplIG9mIHByZWNpbmN0IDogMl4xNSB4IDJeMTUgKG1lYW5zIDEgcHJlY2luY3QpCi08bGk+U2l6ZSBvZiBjb2RlLWJsb2NrIDogNjQgeCA2NAotPGxpPk51bWJlciBvZiByZXNvbHV0aW9uczogNgotPGxpPk5vIFNPUCBtYXJrZXIgaW4gdGhlIGNvZGVzdHJlYW0KLTxsaT5ObyBFUEggbWFya2VyIGluIHRoZSBjb2Rlc3RyZWFtCi08bGk+Tm8gc3ViLXNhbXBsaW5nIGluIHggb3IgeSBkaXJlY3Rpb24KLTxsaT5ObyBtb2RlIHN3aXRjaCBhY3RpdmF0ZWQKLTxsaT5Qcm9ncmVzc2lvbiBvcmRlcjogTFJDUAotPGxpPk5vIGluZGV4IGZpbGUKLTxsaT5ObyBST0kgdXBzaGlmdGVkCi08bGk+Tm8gb2Zmc2V0IG9mIHRoZSBvcmlnaW4gb2YgdGhlIGltYWdlCi08bGk+Tm8gb2Zmc2V0IG9mIHRoZSBvcmlnaW4gb2YgdGhlIHRpbGVzCi08bGk+UmV2ZXJzaWJsZSBEV1QgNS0zCi08L3VsPgotQHBhcmFtIHBhcmFtZXRlcnMgQ29tcHJlc3Npb24gcGFyYW1ldGVycwotKi8KLU9QSl9BUEkgdm9pZCBPUEpfQ0FMTENPTlYgb3BqX3NldF9kZWZhdWx0X2VuY29kZXJfcGFyYW1ldGVycyhvcGpfY3BhcmFtZXRlcnNfdCAqcGFyYW1ldGVycyk7Ci0KLS8qKgotICogU2V0dXAgdGhlIGVuY29kZXIgcGFyYW1ldGVycyB1c2luZyB0aGUgY3VycmVudCBpbWFnZSBhbmQgdXNpbmcgdXNlciBwYXJhbWV0ZXJzLgotICogQHBhcmFtIHBfY29kZWMgCQlDb21wcmVzc29yIGhhbmRsZQotICogQHBhcmFtIHBhcmFtZXRlcnMgCUNvbXByZXNzaW9uIHBhcmFtZXRlcnMKLSAqIEBwYXJhbSBpbWFnZSAJCUlucHV0IGZpbGxlZCBpbWFnZQotICovCi1PUEpfQVBJIE9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfc2V0dXBfZW5jb2RlcihvcGpfY29kZWNfdCAqcF9jb2RlYywgCi0JCQkJCQkJCQkJCQlvcGpfY3BhcmFtZXRlcnNfdCAqcGFyYW1ldGVycywgCi0JCQkJCQkJCQkJCQlvcGpfaW1hZ2VfdCAqaW1hZ2UpOwotCi0vKioKLSAqIFN0YXJ0IHRvIGNvbXByZXNzIHRoZSBjdXJyZW50IGltYWdlLgotICogQHBhcmFtIHBfY29kZWMgCQlDb21wcmVzc29yIGhhbmRsZQotICogQHBhcmFtIGltYWdlIAkgICAgSW5wdXQgZmlsbGVkIGltYWdlCi0gKiBAcGFyYW0gcF9zdHJlYW0gCQlJbnB1dCBzdGdyZWFtCi0gKi8KLU9QSl9BUEkgT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9zdGFydF9jb21wcmVzcyAoCW9wal9jb2RlY190ICpwX2NvZGVjLAotCQkJCQkJCQkJCQkJCW9wal9pbWFnZV90ICogcF9pbWFnZSwKLQkJCQkJCQkJCQkJCQlvcGpfc3RyZWFtX3QgKnBfc3RyZWFtKTsKLQotLyoqCi0gKiBFbmQgdG8gY29tcHJlc3MgdGhlIGN1cnJlbnQgaW1hZ2UuCi0gKiBAcGFyYW0gcF9jb2RlYyAJCUNvbXByZXNzb3IgaGFuZGxlCi0gKiBAcGFyYW0gcF9zdHJlYW0gCQlJbnB1dCBzdGdyZWFtCi0gKi8KLU9QSl9BUEkgT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9lbmRfY29tcHJlc3MgKG9wal9jb2RlY190ICpwX2NvZGVjLAotCQkJCQkJCQkJCQkJb3BqX3N0cmVhbV90ICpwX3N0cmVhbSk7Ci0KLS8qKgotICogRW5jb2RlIGFuIGltYWdlIGludG8gYSBKUEVHLTIwMDAgY29kZXN0cmVhbQotICogQHBhcmFtIHBfY29kZWMgCQljb21wcmVzc29yIGhhbmRsZQotICogQHBhcmFtIHBfc3RyZWFtIAkJT3V0cHV0IGJ1ZmZlciBzdHJlYW0KLSAqCi0gKiBAcmV0dXJuIAkJCQlSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBmYWxzZSBvdGhlcndpc2UKLSAqLwotT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX2VuY29kZShvcGpfY29kZWNfdCAqcF9jb2RlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV90ICpwX3N0cmVhbSk7Ci0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgY29kZWMgb3V0cHV0IGZ1bmN0aW9ucyBkZWZpbml0aW9ucwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLS8qIEVYUEVSSU1FTlRBTCBGVU5DVElPTlMgRk9SIE5PVywgVVNFRCBPTkxZIElOIEoyS19EVU1QKi8KLQotLyoqCi1EZXN0cm95IENvZGVzdHJlYW0gaW5mb3JtYXRpb24gYWZ0ZXIgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbgotQHBhcmFtIGNzdHJfaW5mbyBDb2Rlc3RyZWFtIGluZm9ybWF0aW9uIHN0cnVjdHVyZQotKi8KLU9QSl9BUEkgdm9pZCBPUEpfQ0FMTENPTlYgb3BqX2Rlc3Ryb3lfY3N0cl9pbmZvKG9wal9jb2Rlc3RyZWFtX2luZm9fdjJfdCAqKmNzdHJfaW5mbyk7Ci0KLQotLyoqCi0gKiBEdW1wIHRoZSBjb2RlYyBpbmZvcm1hdGlvbiBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtCi0gKgotICogQHBhcmFtCXBfY29kZWMJCQl0aGUganBlZzIwMDAgY29kZWMuCi0gKiBAcGFyYW0JaW5mb19mbGFnCQl0eXBlIG9mIGluZm9ybWF0aW9uIGR1bXAuCi0gKiBAcGFyYW0Jb3V0cHV0X3N0cmVhbQlvdXRwdXQgc3RyZWFtIHdoZXJlIGR1bXAgdGhlIGluZm9ybWF0aW9ucyBnZXQgZnJvbSB0aGUgY29kZWMuCi0gKgotICovCi1PUEpfQVBJIHZvaWQgT1BKX0NBTExDT05WIG9wal9kdW1wX2NvZGVjKAlvcGpfY29kZWNfdCAqcF9jb2RlYywKLQkJCQkJCQkJCQkJT1BKX0lOVDMyIGluZm9fZmxhZywKLQkJCQkJCQkJCQkJRklMRSogb3V0cHV0X3N0cmVhbSk7Ci0KLS8qKgotICogR2V0IHRoZSBjb2Rlc3RyZWFtIGluZm9ybWF0aW9uIGZyb20gdGhlIGNvZGVjCi0gKgotICogQHBhcmFtCXBfY29kZWMJCQl0aGUganBlZzIwMDAgY29kZWMuCi0gKgotICogQHJldHVybgkJCQkJYSBwb2ludGVyIHRvIGEgY29kZXN0cmVhbSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCi0gKgotICovCi1PUEpfQVBJIG9wal9jb2Rlc3RyZWFtX2luZm9fdjJfdCogT1BKX0NBTExDT05WIG9wal9nZXRfY3N0cl9pbmZvKG9wal9jb2RlY190ICpwX2NvZGVjKTsKLQotLyoqCi0gKiBHZXQgdGhlIGNvZGVzdHJlYW0gaW5kZXggZnJvbSB0aGUgY29kZWMKLSAqCi0gKiBAcGFyYW0JcF9jb2RlYwkJCXRoZSBqcGVnMjAwMCBjb2RlYy4KLSAqCi0gKiBAcmV0dXJuCQkJCQlhIHBvaW50ZXIgdG8gYSBjb2Rlc3RyZWFtIGluZGV4IHN0cnVjdHVyZS4KLSAqCi0gKi8KLU9QSl9BUEkgb3BqX2NvZGVzdHJlYW1faW5kZXhfdCAqIE9QSl9DQUxMQ09OViBvcGpfZ2V0X2NzdHJfaW5kZXgob3BqX2NvZGVjX3QgKnBfY29kZWMpOwotCi1PUEpfQVBJIHZvaWQgT1BKX0NBTExDT05WIG9wal9kZXN0cm95X2NzdHJfaW5kZXgob3BqX2NvZGVzdHJlYW1faW5kZXhfdCAqKnBfY3N0cl9pbmRleCk7Ci0KLQotLyoqCi0gKiBHZXQgdGhlIEpQMiBmaWxlIGluZm9ybWF0aW9uIGZyb20gdGhlIGNvZGVjIEZJWE1FCi0gKgotICogQHBhcmFtCXBfY29kZWMJCQl0aGUganBlZzIwMDAgY29kZWMuCi0gKgotICogQHJldHVybgkJCQkJYSBwb2ludGVyIHRvIGEgSlAyIG1ldGFkYXRhIHN0cnVjdHVyZS4KLSAqCi0gKi8KLU9QSl9BUEkgb3BqX2pwMl9tZXRhZGF0YV90KiBPUEpfQ0FMTENPTlYgb3BqX2dldF9qcDJfbWV0YWRhdGEob3BqX2NvZGVjX3QgKnBfY29kZWMpOwotCi0vKioKLSAqIEdldCB0aGUgSlAyIGZpbGUgaW5kZXggZnJvbSB0aGUgY29kZWMgRklYTUUKLSAqCi0gKiBAcGFyYW0JcF9jb2RlYwkJCXRoZSBqcGVnMjAwMCBjb2RlYy4KLSAqCi0gKiBAcmV0dXJuCQkJCQlhIHBvaW50ZXIgdG8gYSBKUDIgaW5kZXggc3RydWN0dXJlLgotICoKLSAqLwotT1BKX0FQSSBvcGpfanAyX2luZGV4X3QqIE9QSl9DQUxMQ09OViBvcGpfZ2V0X2pwMl9pbmRleChvcGpfY29kZWNfdCAqcF9jb2RlYyk7Ci0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIE1DVCBmdW5jdGlvbnMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi0KLS8qKgotICogU2V0cyB0aGUgTUNUIG1hdHJpeCB0byB1c2UuCi0gKgotICogQHBhcmFtCXBhcmFtZXRlcnMJCXRoZSBwYXJhbWV0ZXJzIHRvIGNoYW5nZS4KLSAqIEBwYXJhbQlwRW5jb2RpbmdNYXRyaXgJdGhlIGVuY29kaW5nIG1hdHJpeC4KLSAqIEBwYXJhbQlwX2RjX3NoaWZ0CQl0aGUgZGMgc2hpZnQgY29lZmZpY2llbnRzIHRvIHVzZS4KLSAqIEBwYXJhbQlwTmJDb21wCQkJdGhlIG51bWJlciBvZiBjb21wb25lbnRzIG9mIHRoZSBpbWFnZS4KLSAqCi0gKiBAcmV0dXJuCXRydWUgaWYgdGhlIHBhcmFtZXRlcnMgY291bGQgYmUgc2V0LgotICovCi1PUEpfQVBJIE9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfc2V0X01DVCggb3BqX2NwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgT1BKX0ZMT0FUMzIgKiBwRW5jb2RpbmdNYXRyaXgsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgT1BKX0lOVDMyICogcF9kY19zaGlmdCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICBPUEpfVUlOVDMyIHBOYkNvbXApOwotCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIE9QRU5KUEVHX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9vcGpfaW5jbHVkZXMuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9vcGpfaW5jbHVkZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNkNDY4Ni4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvb3BqX2luY2x1ZGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoKLSAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzIAotICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIAotICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cwotICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExLTIwMTIsIENlbnRyZSBOYXRpb25hbCBkJ0V0dWRlcyBTcGF0aWFsZXMgKENORVMpLCBGUiAKLSAqIENvcHlyaWdodCAoYykgMjAxMiwgQ1MgU3lzdGVtZXMgZCdJbmZvcm1hdGlvbiwgRnJhbmNlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKLSAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0jaWZuZGVmIE9QSl9JTkNMVURFU19ICi0jZGVmaW5lIE9QSl9JTkNMVURFU19ICi0KLS8qCi0gKiBUaGlzIG11c3QgYmUgaW5jbHVkZWQgYmVmb3JlIGFueSBzeXN0ZW0gaGVhZGVycywKLSAqIHNpbmNlIHRoZXkgY2FuIHJlYWN0IHRvIG1hY3JvIGRlZmluZWQgdGhlcmUKLSAqLwotI2luY2x1ZGUgIm9wal9jb25maWdfcHJpdmF0ZS5oIgotCi0vKgotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIFN0YW5kYXJkIGluY2x1ZGVzIHVzZWQgYnkgdGhlIGxpYnJhcnkKLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotI2luY2x1ZGUgPG1lbW9yeS5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLS8qCi0gIFVzZSBmc2Vla28oKSBhbmQgZnRlbGxvKCkgaWYgdGhleSBhcmUgYXZhaWxhYmxlIHNpbmNlIHRoZXkgdXNlCi0gICdvZmZfdCcgcmF0aGVyIHRoYW4gJ2xvbmcnLiAgSXQgaXMgd3JvbmcgdG8gdXNlIGZzZWVrbygpIGFuZAotICBmdGVsbG8oKSBvbmx5IG9uIHN5c3RlbXMgd2l0aCBzcGVjaWFsIExGUyBzdXBwb3J0IHNpbmNlIHNvbWUgc3lzdGVtcwotICAoZS5nLiBGcmVlQlNEKSBzdXBwb3J0IGEgNjQtYml0IG9mZl90IGJ5IGRlZmF1bHQuCi0qLwotI2lmIGRlZmluZWQoT1BKX0hBVkVfRlNFRUtPKSAmJiAhZGVmaW5lZChmc2VlaykKLSMgIGRlZmluZSBmc2VlayAgZnNlZWtvCi0jICBkZWZpbmUgZnRlbGwgIGZ0ZWxsbwotI2VuZGlmCi0KLQotI2lmIGRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKFdpbmRvd3M5NSkgJiYgIWRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiBcCi0gICEoZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPCAxNDAwKSAmJiBcCi0gICEoZGVmaW5lZChfX01JTkdXMzJfXykgJiYgX19NU1ZDUlRfVkVSU0lPTl9fIDwgMHg4MDApCi0gIC8qCi0gICAgV2luZG93cyAnOTUgYW5kIEJvcmxhbmQgQyBkbyBub3Qgc3VwcG9ydCBfbHNlZWtpNjQKLSAgICBWaXN1YWwgU3R1ZGlvIGRvZXMgbm90IHN1cHBvcnQgX2ZzZWVraTY0IGFuZCBfZnRlbGxpNjQgdW50aWwgdGhlIDIwMDUgcmVsZWFzZS4KLSAgICBXaXRob3V0IHRoZXNlIGludGVyZmFjZXMsIGZpbGVzIG92ZXIgMkdCIGluIHNpemUgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MuCi0gICovCi0jICBkZWZpbmUgT1BKX0ZTRUVLKHN0cmVhbSxvZmZzZXQsd2hlbmNlKSBfZnNlZWtpNjQoc3RyZWFtLC8qIF9faW50NjQgKi8gb2Zmc2V0LHdoZW5jZSkKLSMgIGRlZmluZSBPUEpfRlNUQVQoZmlsZGVzLHN0YXRfYnVmZikgX2ZzdGF0aTY0KGZpbGRlcywvKiBzdHJ1Y3QgX3N0YXRpNjQgKi8gc3RhdF9idWZmKQotIyAgZGVmaW5lIE9QSl9GVEVMTChzdHJlYW0pIC8qIF9faW50NjQgKi8gX2Z0ZWxsaTY0KHN0cmVhbSkKLSMgIGRlZmluZSBPUEpfU1RBVF9TVFJVQ1RfVCBzdHJ1Y3QgX3N0YXRpNjQKLSMgIGRlZmluZSBPUEpfU1RBVChwYXRoLHN0YXRfYnVmZikgX3N0YXRpNjQocGF0aCwvKiBzdHJ1Y3QgX3N0YXRpNjQgKi8gc3RhdF9idWZmKQotI2Vsc2UKLSMgIGRlZmluZSBPUEpfRlNFRUsoc3RyZWFtLG9mZnNldCx3aGVuY2UpIGZzZWVrKHN0cmVhbSxvZmZzZXQsd2hlbmNlKQotIyAgZGVmaW5lIE9QSl9GU1RBVChmaWxkZXMsc3RhdF9idWZmKSBmc3RhdChmaWxkZXMsc3RhdF9idWZmKQotIyAgZGVmaW5lIE9QSl9GVEVMTChzdHJlYW0pIGZ0ZWxsKHN0cmVhbSkKLSMgIGRlZmluZSBPUEpfU1RBVF9TVFJVQ1RfVCBzdHJ1Y3Qgc3RhdAotIyAgZGVmaW5lIE9QSl9TVEFUKHBhdGgsc3RhdF9idWZmKSBzdGF0KHBhdGgsc3RhdF9idWZmKQotI2VuZGlmCi0KLQotLyoKLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBPcGVuSlBFRyBpbnRlcmZhY2UKLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLSNpbmNsdWRlICJvcGVuanBlZy5oIgotCi0vKgotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIE9wZW5KUEVHIG1vZHVsZXMKLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotCi0vKiBJZ25vcmUgR0NDIGF0dHJpYnV0ZXMgaWYgdGhpcyBpcyBub3QgR0NDICovCi0jaWZuZGVmIF9fR05VQ19fCi0JI2RlZmluZSBfX2F0dHJpYnV0ZV9fKHgpIC8qIF9fYXR0cmlidXRlX18oeCkgKi8KLSNlbmRpZgotCi0KLS8qIEFyZSByZXN0cmljdGVkIHBvaW50ZXJzIGF2YWlsYWJsZT8gKEM5OSkgKi8KLSNpZiAoX19TVERDX1ZFUlNJT05fXyAhPSAxOTk5MDFMKQotCS8qIE5vdCBhIEM5OSBjb21waWxlciAqLwotCSNpZmRlZiBfX0dOVUNfXwotCQkjZGVmaW5lIHJlc3RyaWN0IF9fcmVzdHJpY3RfXwotCSNlbHNlCi0JCSNkZWZpbmUgcmVzdHJpY3QgLyogcmVzdHJpY3QgKi8KLQkjZW5kaWYKLSNlbmRpZgotCi0vKiBNU1ZDIGJlZm9yZSAyMDEzIGFuZCBCb3JsYW5kIEMgZG8gbm90IGhhdmUgbHJpbnRmICovCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSIDwgMTgwMCkgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCi1zdGF0aWMgSU5MSU5FIGxvbmcgbHJpbnRmKGZsb2F0IGYpewotI2lmZGVmIF9NX1g2NAotICAgIHJldHVybiAobG9uZykoKGY+MC4wZikgPyAoZiArIDAuNWYpOihmIC0wLjVmKSk7Ci0jZWxzZQotICAgIGludCBpOwotIAotICAgIF9hc217Ci0gICAgICAgIGZsZCBmCi0gICAgICAgIGZpc3RwIGkKLSAgICB9OwotIAotICAgIHJldHVybiBpOwotI2VuZGlmCi19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA8IDE0MDApCi0JI2RlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgotI2VuZGlmCi0KLSNpbmNsdWRlICJvcGpfaW50dHlwZXMuaCIKLSNpbmNsdWRlICJvcGpfY2xvY2suaCIKLSNpbmNsdWRlICJvcGpfbWFsbG9jLmgiCi0jaW5jbHVkZSAiZnVuY3Rpb25fbGlzdC5oIgotI2luY2x1ZGUgImV2ZW50LmgiCi0jaW5jbHVkZSAiYmlvLmgiCi0jaW5jbHVkZSAiY2lvLmgiCi0KLSNpbmNsdWRlICJpbWFnZS5oIgotI2luY2x1ZGUgImludmVydC5oIgotI2luY2x1ZGUgImoyay5oIgotI2luY2x1ZGUgImpwMi5oIgotCi0jaW5jbHVkZSAibXFjLmgiCi0jaW5jbHVkZSAicmF3LmgiCi0jaW5jbHVkZSAiYmlvLmgiCi0KLSNpbmNsdWRlICJwaS5oIgotI2luY2x1ZGUgInRndC5oIgotI2luY2x1ZGUgInRjZC5oIgotI2luY2x1ZGUgInQxLmgiCi0jaW5jbHVkZSAiZHd0LmgiCi0jaW5jbHVkZSAidDIuaCIKLSNpbmNsdWRlICJtY3QuaCIKLSNpbmNsdWRlICJvcGpfaW50bWF0aC5oIgotCi0jaWZkZWYgVVNFX0pQSVAKLSNpbmNsdWRlICJjaWR4X21hbmFnZXIuaCIKLSNpbmNsdWRlICJpbmRleGJveF9tYW5hZ2VyLmgiCi0jZW5kaWYKLQotLyogSlBXTD4+ICovCi0jaWZkZWYgVVNFX0pQV0wKLSNpbmNsdWRlICJvcGVuanB3bC9qcHdsLmgiCi0jZW5kaWYgLyogVVNFX0pQV0wgKi8KLS8qIDw8SlBXTCAqLwotCi0vKiBWMiAqLwotI2luY2x1ZGUgIm9wal9jb2RlYy5oIgotCi0KLSNlbmRpZiAvKiBPUEpfSU5DTFVERVNfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL29wal9pbnRtYXRoLmggYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvb3BqX2ludG1hdGguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUyOTk0Ni4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvb3BqX2ludG1hdGguaAorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCi0gKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCi0gKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFVuaXZlcnNpdGUgY2F0aG9saXF1ZSBkZSBMb3V2YWluIChVQ0wpLCBCZWxnaXVtCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQotICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKLSAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0jaWZuZGVmIF9fSU5UX0gKLSNkZWZpbmUgX19JTlRfSAotLyoqCi1AZmlsZSBvcGpfaW50bWF0aC5oCi1AYnJpZWYgSW1wbGVtZW50YXRpb24gb2Ygb3BlcmF0aW9ucyBvbiBpbnRlZ2VycyAoSU5UKQotCi1UaGUgZnVuY3Rpb25zIGluIE9QSl9JTlRNQVRILkggaGF2ZSBmb3IgZ29hbCB0byByZWFsaXplIG9wZXJhdGlvbnMgb24gaW50ZWdlcnMuCi0qLwotCi0vKiogQGRlZmdyb3VwIE9QSl9JTlRNQVRIIE9QSl9JTlRNQVRIIC0gSW1wbGVtZW50YXRpb24gb2Ygb3BlcmF0aW9ucyBvbiBpbnRlZ2VycyAqLwotLypAeyovCi0KLS8qKiBAbmFtZSBFeHBvcnRlZCBmdW5jdGlvbnMgKHNlZSBhbHNvIG9wZW5qcGVnLmgpICovCi0vKkB7Ki8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKioKLUdldCB0aGUgbWluaW11bSBvZiB0d28gaW50ZWdlcnMKLUByZXR1cm4gUmV0dXJucyBhIGlmIGEgPCBiIGVsc2UgYgotKi8KLXN0YXRpYyBJTkxJTkUgT1BKX0lOVDMyIG9wal9pbnRfbWluKE9QSl9JTlQzMiBhLCBPUEpfSU5UMzIgYikgewotCXJldHVybiBhIDwgYiA/IGEgOiBiOwotfQotCi0vKioKLUdldCB0aGUgbWluaW11bSBvZiB0d28gaW50ZWdlcnMKLUByZXR1cm4gUmV0dXJucyBhIGlmIGEgPCBiIGVsc2UgYgotKi8KLXN0YXRpYyBJTkxJTkUgT1BKX1VJTlQzMiBvcGpfdWludF9taW4oT1BKX1VJTlQzMiBhLCBPUEpfVUlOVDMyIGIpIHsKLQlyZXR1cm4gYSA8IGIgPyBhIDogYjsKLX0KLQotLyoqCi1HZXQgdGhlIG1heGltdW0gb2YgdHdvIGludGVnZXJzCi1AcmV0dXJuIFJldHVybnMgYSBpZiBhID4gYiBlbHNlIGIKLSovCi1zdGF0aWMgSU5MSU5FIE9QSl9JTlQzMiBvcGpfaW50X21heChPUEpfSU5UMzIgYSwgT1BKX0lOVDMyIGIpIHsKLQlyZXR1cm4gKGEgPiBiKSA/IGEgOiBiOwotfQotCi0vKioKLUdldCB0aGUgbWF4aW11bSBvZiB0d28gaW50ZWdlcnMKLUByZXR1cm4gUmV0dXJucyBhIGlmIGEgPiBiIGVsc2UgYgotKi8KLXN0YXRpYyBJTkxJTkUgT1BKX1VJTlQzMiBvcGpfdWludF9tYXgoT1BKX1VJTlQzMiAgYSwgT1BKX1VJTlQzMiAgYikgewotCXJldHVybiAoYSA+IGIpID8gYSA6IGI7Ci19Ci0KLS8qKgotIEdldCB0aGUgc2F0dXJhdGVkIHN1bSBvZiB0d28gdW5zaWduZWQgaW50ZWdlcnMKLSBAcmV0dXJuIFJldHVybnMgc2F0dXJhdGVkIHN1bSBvZiBhK2IKLSAqLwotc3RhdGljIElOTElORSBPUEpfVUlOVDMyIG9wal91aW50X2FkZHMoT1BKX1VJTlQzMiBhLCBPUEpfVUlOVDMyIGIpIHsKLQlPUEpfVUlOVDY0IHN1bSA9IChPUEpfVUlOVDY0KWEgKyAoT1BKX1VJTlQ2NCliOwotCXJldHVybiAtKE9QSl9VSU5UMzIpKHN1bSA+PiAzMikgfCAoT1BKX1VJTlQzMilzdW07Ci19Ci0KLS8qKgotQ2xhbXAgYW4gaW50ZWdlciBpbnNpZGUgYW4gaW50ZXJ2YWwKLUByZXR1cm4KLTx1bD4KLTxsaT5SZXR1cm5zIGEgaWYgKG1pbiA8IGEgPCBtYXgpCi08bGk+UmV0dXJucyBtYXggaWYgKGEgPiBtYXgpCi08bGk+UmV0dXJucyBtaW4gaWYgKGEgPCBtaW4pIAotPC91bD4KLSovCi1zdGF0aWMgSU5MSU5FIE9QSl9JTlQzMiBvcGpfaW50X2NsYW1wKE9QSl9JTlQzMiBhLCBPUEpfSU5UMzIgbWluLCBPUEpfSU5UMzIgbWF4KSB7Ci0JaWYgKGEgPCBtaW4pCi0JCXJldHVybiBtaW47Ci0JaWYgKGEgPiBtYXgpCi0JCXJldHVybiBtYXg7Ci0JcmV0dXJuIGE7Ci19Ci0vKioKLUByZXR1cm4gR2V0IGFic29sdXRlIHZhbHVlIG9mIGludGVnZXIKLSovCi1zdGF0aWMgSU5MSU5FIE9QSl9JTlQzMiBvcGpfaW50X2FicyhPUEpfSU5UMzIgYSkgewotCXJldHVybiBhIDwgMCA/IC1hIDogYTsKLX0KLS8qKgotRGl2aWRlIGFuIGludGVnZXIgYW5kIHJvdW5kIHVwd2FyZHMKLUByZXR1cm4gUmV0dXJucyBhIGRpdmlkZWQgYnkgYgotKi8KLXN0YXRpYyBJTkxJTkUgT1BKX0lOVDMyIG9wal9pbnRfY2VpbGRpdihPUEpfSU5UMzIgYSwgT1BKX0lOVDMyIGIpIHsKLQlhc3NlcnQoYik7Ci0JcmV0dXJuIChhICsgYiAtIDEpIC8gYjsKLX0KLQotLyoqCi1EaXZpZGUgYW4gaW50ZWdlciBhbmQgcm91bmQgdXB3YXJkcwotQHJldHVybiBSZXR1cm5zIGEgZGl2aWRlZCBieSBiCi0qLwotc3RhdGljIElOTElORSBPUEpfVUlOVDMyICBvcGpfdWludF9jZWlsZGl2KE9QSl9VSU5UMzIgIGEsIE9QSl9VSU5UMzIgIGIpIHsKLQlhc3NlcnQoYik7Ci0JcmV0dXJuIChhICsgYiAtIDEpIC8gYjsKLX0KLQotLyoqCi1EaXZpZGUgYW4gaW50ZWdlciBieSBhIHBvd2VyIG9mIDIgYW5kIHJvdW5kIHVwd2FyZHMKLUByZXR1cm4gUmV0dXJucyBhIGRpdmlkZWQgYnkgMl5iCi0qLwotc3RhdGljIElOTElORSBPUEpfSU5UMzIgb3BqX2ludF9jZWlsZGl2cG93MihPUEpfSU5UMzIgYSwgT1BKX0lOVDMyIGIpIHsKLQlyZXR1cm4gKE9QSl9JTlQzMikoKGEgKyAoT1BKX0lOVDY0KSgxIDw8IGIpIC0gMSkgPj4gYik7Ci19Ci0vKioKLURpdmlkZSBhbiBpbnRlZ2VyIGJ5IGEgcG93ZXIgb2YgMiBhbmQgcm91bmQgZG93bndhcmRzCi1AcmV0dXJuIFJldHVybnMgYSBkaXZpZGVkIGJ5IDJeYgotKi8KLXN0YXRpYyBJTkxJTkUgT1BKX0lOVDMyIG9wal9pbnRfZmxvb3JkaXZwb3cyKE9QSl9JTlQzMiBhLCBPUEpfSU5UMzIgYikgewotCXJldHVybiBhID4+IGI7Ci19Ci0vKioKLUdldCBsb2dhcml0aG0gb2YgYW4gaW50ZWdlciBhbmQgcm91bmQgZG93bndhcmRzCi1AcmV0dXJuIFJldHVybnMgbG9nMihhKQotKi8KLXN0YXRpYyBJTkxJTkUgT1BKX0lOVDMyIG9wal9pbnRfZmxvb3Jsb2cyKE9QSl9JTlQzMiBhKSB7Ci0JT1BKX0lOVDMyIGw7Ci0JZm9yIChsID0gMDsgYSA+IDE7IGwrKykgewotCQlhID4+PSAxOwotCX0KLQlyZXR1cm4gbDsKLX0KLS8qKgotR2V0IGxvZ2FyaXRobSBvZiBhbiBpbnRlZ2VyIGFuZCByb3VuZCBkb3dud2FyZHMKLUByZXR1cm4gUmV0dXJucyBsb2cyKGEpCi0qLwotc3RhdGljIElOTElORSBPUEpfVUlOVDMyICBvcGpfdWludF9mbG9vcmxvZzIoT1BKX1VJTlQzMiAgYSkgewotCU9QSl9VSU5UMzIgIGw7Ci0JZm9yIChsID0gMDsgYSA+IDE7ICsrbCkKLQl7Ci0JCWEgPj49IDE7Ci0JfQotCXJldHVybiBsOwotfQotCi0vKioKLU11bHRpcGx5IHR3byBmaXhlZC1wcmVjaXNpb24gcmF0aW9uYWwgbnVtYmVycy4KLUBwYXJhbSBhCi1AcGFyYW0gYgotQHJldHVybiBSZXR1cm5zIGEgKiBiCi0qLwotc3RhdGljIElOTElORSBPUEpfSU5UMzIgb3BqX2ludF9maXhfbXVsKE9QSl9JTlQzMiBhLCBPUEpfSU5UMzIgYikgewotCU9QSl9JTlQ2NCB0ZW1wID0gKE9QSl9JTlQ2NCkgYSAqIChPUEpfSU5UNjQpIGIgOwotCXRlbXAgKz0gNDA5NjsKLQlhc3NlcnQoKHRlbXAgPj4gMTMpIDw9IChPUEpfSU5UNjQpMHg3RkZGRkZGRik7Ci0JYXNzZXJ0KCh0ZW1wID4+IDEzKSA+PSAoLShPUEpfSU5UNjQpMHg3RkZGRkZGRiAtIChPUEpfSU5UNjQpMSkpOwotCXJldHVybiAoT1BKX0lOVDMyKSAodGVtcCA+PiAxMyk7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgT1BKX0lOVDMyIG9wal9pbnRfZml4X211bF90MShPUEpfSU5UMzIgYSwgT1BKX0lOVDMyIGIpIHsKLQlPUEpfSU5UNjQgdGVtcCA9IChPUEpfSU5UNjQpIGEgKiAoT1BKX0lOVDY0KSBiIDsKLQl0ZW1wICs9IDQwOTY7Ci0JYXNzZXJ0KCh0ZW1wID4+ICgxMyArIDExIC0gVDFfTk1TRURFQ19GUkFDQklUUykpIDw9IChPUEpfSU5UNjQpMHg3RkZGRkZGRik7Ci0JYXNzZXJ0KCh0ZW1wID4+ICgxMyArIDExIC0gVDFfTk1TRURFQ19GUkFDQklUUykpID49ICgtKE9QSl9JTlQ2NCkweDdGRkZGRkZGIC0gKE9QSl9JTlQ2NCkxKSk7Ci0JcmV0dXJuIChPUEpfSU5UMzIpICh0ZW1wID4+ICgxMyArIDExIC0gVDFfTk1TRURFQ19GUkFDQklUUykpIDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qQH0qLwotCi0vKkB9Ki8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvb3BqX21hbGxvYy5oIGIvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL29wal9tYWxsb2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAwN2IwYy4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvb3BqX21hbGxvYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qCi0gKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKLSAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKLSAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKLSAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KLSAqIENvcHlyaWdodCAoYykgMjAwNywgQ2FsbHVtIExlcndpY2sgPHNlZ0BoYXh4ZWQuY29tPgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCi0gKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotI2lmbmRlZiBfX09QSl9NQUxMT0NfSAotI2RlZmluZSBfX09QSl9NQUxMT0NfSAotLyoqCi1AZmlsZSBvcGpfbWFsbG9jLmgKLUBicmllZiBJbnRlcm5hbCBmdW5jdGlvbnMKLQotVGhlIGZ1bmN0aW9ucyBpbiBvcGpfbWFsbG9jLmggYXJlIGludGVybmFsIHV0aWxpdGllcyB1c2VkIGZvciBtZW1vcnkgbWFuYWdlbWVudC4KLSovCi0KLS8qKiBAZGVmZ3JvdXAgTUlTQyBNSVNDIC0gTWlzY2VsbGFuZW91cyBpbnRlcm5hbCBmdW5jdGlvbnMgKi8KLS8qQHsqLwotCi0vKiogQG5hbWUgRXhwb3J0ZWQgZnVuY3Rpb25zICovCi0vKkB7Ki8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKgotQWxsb2NhdGUgYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgYmxvY2sKLUBwYXJhbSBzaXplIEJ5dGVzIHRvIGFsbG9jYXRlCi1AcmV0dXJuIFJldHVybnMgYSB2b2lkIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBzcGFjZSwgb3IgTlVMTCBpZiB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgbWVtb3J5IGF2YWlsYWJsZQotKi8KLSNpZmRlZiBBTExPQ19QRVJGX09QVAotdm9pZCAqIE9QSl9DQUxMQ09OViBvcGpfbWFsbG9jKHNpemVfdCBzaXplKTsKLSNlbHNlCi0vKiBwcmV2ZW50IGFzc2VydGlvbiBvbiBvdmVyZmxvdyBmb3IgTVNWQyAqLwotI2lmZGVmIF9NU0NfVkVSCi0jZGVmaW5lIG9wal9tYWxsb2Moc2l6ZSkgKChzaXplX3QpKHNpemUpID49IChzaXplX3QpLTB4MTAwID8gTlVMTCA6IG1hbGxvYyhzaXplKSkKLSNlbHNlCi0jZGVmaW5lIG9wal9tYWxsb2Moc2l6ZSkgbWFsbG9jKHNpemUpCi0jZW5kaWYKLSNlbmRpZgotCi0vKioKLUFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrIHdpdGggZWxlbWVudHMgaW5pdGlhbGl6ZWQgdG8gMAotQHBhcmFtIG51bSBCbG9ja3MgdG8gYWxsb2NhdGUKLUBwYXJhbSBzaXplIEJ5dGVzIHBlciBibG9jayB0byBhbGxvY2F0ZQotQHJldHVybiBSZXR1cm5zIGEgdm9pZCBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgc3BhY2UsIG9yIE5VTEwgaWYgdGhlcmUgaXMgaW5zdWZmaWNpZW50IG1lbW9yeSBhdmFpbGFibGUKLSovCi0jaWZkZWYgQUxMT0NfUEVSRl9PUFQKLXZvaWQgKiBPUEpfQ0FMTENPTlYgb3BqX2NhbGxvYyhzaXplX3QgX051bU9mRWxlbWVudHMsIHNpemVfdCBfU2l6ZU9mRWxlbWVudHMpOwotI2Vsc2UKLS8qIHByZXZlbnQgYXNzZXJ0aW9uIG9uIG92ZXJmbG93IGZvciBNU1ZDICovCi0jaWZkZWYgX01TQ19WRVIKLSNkZWZpbmUgb3BqX2NhbGxvYyhudW0sIHNpemUpICgoc2l6ZV90KShudW0pICE9IDAgJiYgKHNpemVfdCkobnVtKSA+PSAoc2l6ZV90KS0weDEwMCAvIChzaXplX3QpKHNpemUpID8gTlVMTCA6IGNhbGxvYyhudW0sIHNpemUpKQotI2Vsc2UKLSNkZWZpbmUgb3BqX2NhbGxvYyhudW0sIHNpemUpIGNhbGxvYyhudW0sIHNpemUpCi0jZW5kaWYKLSNlbmRpZgotCi0vKioKLUFsbG9jYXRlIG1lbW9yeSBhbGlnbmVkIHRvIGEgMTYgYnl0ZSBib3VuZHJ5Ci1AcGFyYW0gc2l6ZSBCeXRlcyB0byBhbGxvY2F0ZQotQHJldHVybiBSZXR1cm5zIGEgdm9pZCBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgc3BhY2UsIG9yIE5VTEwgaWYgdGhlcmUgaXMgaW5zdWZmaWNpZW50IG1lbW9yeSBhdmFpbGFibGUKLSovCi0vKiBGSVhNRTogVGhlc2Ugc2hvdWxkIGJlIHNldCB3aXRoIGNtYWtlIHRlc3RzLCBidXQgd2UncmUgY3VycmVudGx5IG5vdCByZXF1aXJpbmcgdXNlIG9mIGNtYWtlICovCi0jaWZkZWYgX1dJTjMyCi0JLyogU29tZW9uZSBzaG91bGQgdGVsbCB0aGUgbWluZ3cgcGVvcGxlIHRoYXQgdGhlaXIgbWFsbG9jLmggb3VnaHQgdG8gcHJvdmlkZSBfbW1fbWFsbG9jKCkgKi8KLQkjaWZkZWYgX19HTlVDX18KLQkJI2luY2x1ZGUgPG1tX21hbGxvYy5oPgotCQkjZGVmaW5lIEhBVkVfTU1fTUFMTE9DCi0JI2Vsc2UgLyogTVNWQywgSW50ZWwgQysrICovCi0JCSNpbmNsdWRlIDxtYWxsb2MuaD4KLQkJI2lmZGVmIF9tbV9tYWxsb2MKLQkJCSNkZWZpbmUgSEFWRV9NTV9NQUxMT0MKLQkJI2VuZGlmCi0JI2VuZGlmCi0jZWxzZSAvKiBOb3QgX1dJTjMyICovCi0JI2lmIGRlZmluZWQoX19zdW4pCi0JCSNkZWZpbmUgSEFWRV9NRU1BTElHTgotICAjZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKQotICAgICNkZWZpbmUgSEFWRV9QT1NJWF9NRU1BTElHTgotCS8qIExpbnV4IHg4Nl82NCBhbmQgT1NYIGFsd2F5cyBhbGlnbiBhbGxvY2F0aW9ucyB0byAxNiBieXRlcyAqLwotCSNlbGlmICFkZWZpbmVkKF9fYW1kNjRfXykgJiYgIWRlZmluZWQoX19BUFBMRV9fKSAmJiAhZGVmaW5lZChfQUlYKQotCQkjZGVmaW5lIEhBVkVfTUVNQUxJR04KLQkJI2luY2x1ZGUgPG1hbGxvYy5oPgkJCQotCSNlbmRpZgotI2VuZGlmCi0KLSNkZWZpbmUgb3BqX2FsaWduZWRfbWFsbG9jKHNpemUpIG1hbGxvYyhzaXplKQotI2RlZmluZSBvcGpfYWxpZ25lZF9mcmVlKG0pIGZyZWUobSkKLQotI2lmZGVmIEhBVkVfTU1fTUFMTE9DCi0JI3VuZGVmIG9wal9hbGlnbmVkX21hbGxvYwotCSNkZWZpbmUgb3BqX2FsaWduZWRfbWFsbG9jKHNpemUpIF9tbV9tYWxsb2Moc2l6ZSwgMTYpCi0JI3VuZGVmIG9wal9hbGlnbmVkX2ZyZWUKLQkjZGVmaW5lIG9wal9hbGlnbmVkX2ZyZWUobSkgX21tX2ZyZWUobSkKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9NRU1BTElHTgotCWV4dGVybiB2b2lkKiBtZW1hbGlnbihzaXplX3QsIHNpemVfdCk7Ci0JI3VuZGVmIG9wal9hbGlnbmVkX21hbGxvYwotCSNkZWZpbmUgb3BqX2FsaWduZWRfbWFsbG9jKHNpemUpIG1lbWFsaWduKDE2LCAoc2l6ZSkpCi0JI3VuZGVmIG9wal9hbGlnbmVkX2ZyZWUKLQkjZGVmaW5lIG9wal9hbGlnbmVkX2ZyZWUobSkgZnJlZShtKQotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1BPU0lYX01FTUFMSUdOCi0JI3VuZGVmIG9wal9hbGlnbmVkX21hbGxvYwotCWV4dGVybiBpbnQgcG9zaXhfbWVtYWxpZ24odm9pZCoqLCBzaXplX3QsIHNpemVfdCk7Ci0KLQlzdGF0aWMgSU5MSU5FIHZvaWQqIF9fYXR0cmlidXRlX18gKChtYWxsb2MpKSBvcGpfYWxpZ25lZF9tYWxsb2Moc2l6ZV90IHNpemUpewotCQl2b2lkKiBtZW0gPSBOVUxMOwotCQlwb3NpeF9tZW1hbGlnbigmbWVtLCAxNiwgc2l6ZSk7Ci0JCXJldHVybiBtZW07Ci0JfQotCSN1bmRlZiBvcGpfYWxpZ25lZF9mcmVlCi0JI2RlZmluZSBvcGpfYWxpZ25lZF9mcmVlKG0pIGZyZWUobSkKLSNlbmRpZgotCi0jaWZkZWYgQUxMT0NfUEVSRl9PUFQKLQkjdW5kZWYgb3BqX2FsaWduZWRfbWFsbG9jCi0JI2RlZmluZSBvcGpfYWxpZ25lZF9tYWxsb2Moc2l6ZSkgb3BqX21hbGxvYyhzaXplKQotCSN1bmRlZiBvcGpfYWxpZ25lZF9mcmVlCi0JI2RlZmluZSBvcGpfYWxpZ25lZF9mcmVlKG0pIG9wal9mcmVlKG0pCi0jZW5kaWYKLQotLyoqCi1SZWFsbG9jYXRlIG1lbW9yeSBibG9ja3MuCi1AcGFyYW0gbSBQb2ludGVyIHRvIHByZXZpb3VzbHkgYWxsb2NhdGVkIG1lbW9yeSBibG9jawotQHBhcmFtIHMgTmV3IHNpemUgaW4gYnl0ZXMKLUByZXR1cm4gUmV0dXJucyBhIHZvaWQgcG9pbnRlciB0byB0aGUgcmVhbGxvY2F0ZWQgKGFuZCBwb3NzaWJseSBtb3ZlZCkgbWVtb3J5IGJsb2NrCi0qLwotI2lmZGVmIEFMTE9DX1BFUkZfT1BUCi12b2lkICogT1BKX0NBTExDT05WIG9wal9yZWFsbG9jKHZvaWQgKiBtLCBzaXplX3Qgcyk7Ci0jZWxzZQotLyogcHJldmVudCBhc3NlcnRpb24gb24gb3ZlcmZsb3cgZm9yIE1TVkMgKi8KLSNpZmRlZiBfTVNDX1ZFUgotI2RlZmluZSBvcGpfcmVhbGxvYyhtLCBzKSAoKHNpemVfdCkocykgPj0gKHNpemVfdCktMHgxMDAgPyBOVUxMIDogcmVhbGxvYyhtLCBzKSkKLSNlbHNlCi0jZGVmaW5lIG9wal9yZWFsbG9jKG0sIHMpIHJlYWxsb2MobSwgcykKLSNlbmRpZgotI2VuZGlmCi0KLS8qKgotRGVhbGxvY2F0ZXMgb3IgZnJlZXMgYSBtZW1vcnkgYmxvY2suCi1AcGFyYW0gbSBQcmV2aW91c2x5IGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sgdG8gYmUgZnJlZWQKLSovCi0jaWZkZWYgQUxMT0NfUEVSRl9PUFQKLXZvaWQgT1BKX0NBTExDT05WIG9wal9mcmVlKHZvaWQgKiBtKTsKLSNlbHNlCi0jZGVmaW5lIG9wal9mcmVlKG0pIGZyZWUobSkKLSNlbmRpZgotCi0jaWZkZWYgX19HTlVDX18KLSNwcmFnbWEgR0NDIHBvaXNvbiBtYWxsb2MgY2FsbG9jIHJlYWxsb2MgZnJlZQotI2VuZGlmCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKkB9Ki8KLQotLypAfSovCi0KLSNlbmRpZiAvKiBfX09QSl9NQUxMT0NfSCAqLwotCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvcGkuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9waS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTNhMWU1Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9waS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg3NyArMCwwIEBACi0vKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCi0gKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCi0gKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFVuaXZlcnNpdGUgY2F0aG9saXF1ZSBkZSBMb3V2YWluIChVQ0wpLCBCZWxnaXVtCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQotICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNywgUGFydmF0aGEgRWxhbmdvdmFuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKLSAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJvcGpfaW5jbHVkZXMuaCIKLQotLyoqIEBkZWZncm91cCBQSSBQSSAtIEltcGxlbWVudGF0aW9uIG9mIGEgcGFja2V0IGl0ZXJhdG9yICovCi0vKkB7Ki8KLQotLyoqIEBuYW1lIExvY2FsIHN0YXRpYyBmdW5jdGlvbnMgKi8KLS8qQHsqLwotCi0vKioKLUdldCBuZXh0IHBhY2tldCBpbiBsYXllci1yZXNvbHV0aW9uLWNvbXBvbmVudC1wcmVjaW5jdCBvcmRlci4KLUBwYXJhbSBwaSBwYWNrZXQgaXRlcmF0b3IgdG8gbW9kaWZ5Ci1AcmV0dXJuIHJldHVybnMgZmFsc2UgaWYgcGkgcG9pbnRlZCB0byB0aGUgbGFzdCBwYWNrZXQgb3IgZWxzZSByZXR1cm5zIHRydWUKLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX3BpX25leHRfbHJjcChvcGpfcGlfaXRlcmF0b3JfdCAqIHBpKTsKLS8qKgotR2V0IG5leHQgcGFja2V0IGluIHJlc29sdXRpb24tbGF5ZXItY29tcG9uZW50LXByZWNpbmN0IG9yZGVyLgotQHBhcmFtIHBpIHBhY2tldCBpdGVyYXRvciB0byBtb2RpZnkKLUByZXR1cm4gcmV0dXJucyBmYWxzZSBpZiBwaSBwb2ludGVkIHRvIHRoZSBsYXN0IHBhY2tldCBvciBlbHNlIHJldHVybnMgdHJ1ZQotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfcGlfbmV4dF9ybGNwKG9wal9waV9pdGVyYXRvcl90ICogcGkpOwotLyoqCi1HZXQgbmV4dCBwYWNrZXQgaW4gcmVzb2x1dGlvbi1wcmVjaW5jdC1jb21wb25lbnQtbGF5ZXIgb3JkZXIuCi1AcGFyYW0gcGkgcGFja2V0IGl0ZXJhdG9yIHRvIG1vZGlmeQotQHJldHVybiByZXR1cm5zIGZhbHNlIGlmIHBpIHBvaW50ZWQgdG8gdGhlIGxhc3QgcGFja2V0IG9yIGVsc2UgcmV0dXJucyB0cnVlCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal9waV9uZXh0X3JwY2wob3BqX3BpX2l0ZXJhdG9yX3QgKiBwaSk7Ci0vKioKLUdldCBuZXh0IHBhY2tldCBpbiBwcmVjaW5jdC1jb21wb25lbnQtcmVzb2x1dGlvbi1sYXllciBvcmRlci4KLUBwYXJhbSBwaSBwYWNrZXQgaXRlcmF0b3IgdG8gbW9kaWZ5Ci1AcmV0dXJuIHJldHVybnMgZmFsc2UgaWYgcGkgcG9pbnRlZCB0byB0aGUgbGFzdCBwYWNrZXQgb3IgZWxzZSByZXR1cm5zIHRydWUKLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX3BpX25leHRfcGNybChvcGpfcGlfaXRlcmF0b3JfdCAqIHBpKTsKLS8qKgotR2V0IG5leHQgcGFja2V0IGluIGNvbXBvbmVudC1wcmVjaW5jdC1yZXNvbHV0aW9uLWxheWVyIG9yZGVyLgotQHBhcmFtIHBpIHBhY2tldCBpdGVyYXRvciB0byBtb2RpZnkKLUByZXR1cm4gcmV0dXJucyBmYWxzZSBpZiBwaSBwb2ludGVkIHRvIHRoZSBsYXN0IHBhY2tldCBvciBlbHNlIHJldHVybnMgdHJ1ZQotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfcGlfbmV4dF9jcHJsKG9wal9waV9pdGVyYXRvcl90ICogcGkpOwotCi0vKioKLSAqIFVwZGF0ZXMgdGhlIGNvZGluZyBwYXJhbWV0ZXJzIGlmIHRoZSBlbmNvZGluZyBpcyB1c2VkIHdpdGggUHJvZ3Jlc3Npb24gb3JkZXIgY2hhbmdlcyBhbmQgZmluYWwgKG9yIGNpbmVtYSBwYXJhbWV0ZXJzIGFyZSB1c2VkKS4KLSAqCi0gKiBAcGFyYW0JcF9jcAkJdGhlIGNvZGluZyBwYXJhbWV0ZXJzIHRvIG1vZGlmeQotICogQHBhcmFtCXBfdGlsZW5vCXRoZSB0aWxlIGluZGV4IGJlaW5nIGNvbmNlcm5lZC4KLSAqIEBwYXJhbQlwX3R4MAkJWDAgcGFyYW1ldGVyIGZvciB0aGUgdGlsZQotICogQHBhcmFtCXBfdHgxCQlYMSBwYXJhbWV0ZXIgZm9yIHRoZSB0aWxlCi0gKiBAcGFyYW0JcF90eTAJCVkwIHBhcmFtZXRlciBmb3IgdGhlIHRpbGUKLSAqIEBwYXJhbQlwX3R5MQkJWTEgcGFyYW1ldGVyIGZvciB0aGUgdGlsZQotICogQHBhcmFtCXBfbWF4X3ByZWMJdGhlIG1heGltdW0gcHJlY2lzaW9uIGZvciBhbGwgdGhlIGJhbmRzIG9mIHRoZSB0aWxlCi0gKiBAcGFyYW0JcF9tYXhfcmVzCXRoZSBtYXhpbXVtIG51bWJlciBvZiByZXNvbHV0aW9ucyBmb3IgYWxsIHRoZSBwb2MgaW5zaWRlIHRoZSB0aWxlLgotICogQHBhcmFtCXBfZHhfbWluCQl0aGUgbWluaW11bSBkeCBvZiBhbGwgdGhlIGNvbXBvbmVudHMgb2YgYWxsIHRoZSByZXNvbHV0aW9ucyBmb3IgdGhlIHRpbGUuCi0gKiBAcGFyYW0JcF9keV9taW4JCXRoZSBtaW5pbXVtIGR5IG9mIGFsbCB0aGUgY29tcG9uZW50cyBvZiBhbGwgdGhlIHJlc29sdXRpb25zIGZvciB0aGUgdGlsZS4KLSAqLwotc3RhdGljIHZvaWQgb3BqX3BpX3VwZGF0ZV9lbmNvZGVfcG9jX2FuZF9maW5hbCAoIG9wal9jcF90ICpwX2NwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfdHgwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX3R4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcF90eTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfdHkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfcHJlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X3JlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZHhfbWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9keV9taW4pOwotCi0vKioKLSAqIFVwZGF0ZXMgdGhlIGNvZGluZyBwYXJhbWV0ZXJzIGlmIHRoZSBlbmNvZGluZyBpcyBub3QgdXNlZCB3aXRoIFByb2dyZXNzaW9uIG9yZGVyIGNoYW5nZXMgYW5kIGZpbmFsIChhbmQgY2luZW1hIHBhcmFtZXRlcnMgYXJlIHVzZWQpLgotICoKLSAqIEBwYXJhbQlwX2NwCQl0aGUgY29kaW5nIHBhcmFtZXRlcnMgdG8gbW9kaWZ5Ci0gKiBAcGFyYW0JcF9udW1fY29tcHMJCXRoZSBudW1iZXIgb2YgY29tcG9uZW50cwotICogQHBhcmFtCXBfdGlsZW5vCXRoZSB0aWxlIGluZGV4IGJlaW5nIGNvbmNlcm5lZC4KLSAqIEBwYXJhbQlwX3R4MAkJWDAgcGFyYW1ldGVyIGZvciB0aGUgdGlsZQotICogQHBhcmFtCXBfdHgxCQlYMSBwYXJhbWV0ZXIgZm9yIHRoZSB0aWxlCi0gKiBAcGFyYW0JcF90eTAJCVkwIHBhcmFtZXRlciBmb3IgdGhlIHRpbGUKLSAqIEBwYXJhbQlwX3R5MQkJWTEgcGFyYW1ldGVyIGZvciB0aGUgdGlsZQotICogQHBhcmFtCXBfbWF4X3ByZWMJdGhlIG1heGltdW0gcHJlY2lzaW9uIGZvciBhbGwgdGhlIGJhbmRzIG9mIHRoZSB0aWxlCi0gKiBAcGFyYW0JcF9tYXhfcmVzCXRoZSBtYXhpbXVtIG51bWJlciBvZiByZXNvbHV0aW9ucyBmb3IgYWxsIHRoZSBwb2MgaW5zaWRlIHRoZSB0aWxlLgotICogQHBhcmFtCXBfZHhfbWluCQl0aGUgbWluaW11bSBkeCBvZiBhbGwgdGhlIGNvbXBvbmVudHMgb2YgYWxsIHRoZSByZXNvbHV0aW9ucyBmb3IgdGhlIHRpbGUuCi0gKiBAcGFyYW0JcF9keV9taW4JCXRoZSBtaW5pbXVtIGR5IG9mIGFsbCB0aGUgY29tcG9uZW50cyBvZiBhbGwgdGhlIHJlc29sdXRpb25zIGZvciB0aGUgdGlsZS4KLSAqLwotc3RhdGljIHZvaWQgb3BqX3BpX3VwZGF0ZV9lbmNvZGVfbm90X3BvYyAoICBvcGpfY3BfdCAqcF9jcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX251bV9jb21wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfdHgwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcF90eDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX3R5MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfdHkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X3ByZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfcmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZHhfbWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZHlfbWluKTsKLS8qKgotICogR2V0cyB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycyBuZWVkZWQgdG8gdXBkYXRlIHRoZSBjb2RpbmcgcGFyYW1ldGVycyBhbmQgYWxsIHRoZSBwb2NzLgotICogCi0gKiBAcGFyYW0JcF9pbWFnZQkJCXRoZSBpbWFnZSBiZWluZyBlbmNvZGVkLgotICogQHBhcmFtCXBfY3AJCQl0aGUgY29kaW5nIHBhcmFtZXRlcnMuCi0gKiBAcGFyYW0JdGlsZW5vCQkJdGhlIHRpbGUgaW5kZXggb2YgdGhlIHRpbGUgYmVpbmcgZW5jb2RlZC4KLSAqIEBwYXJhbQlwX3R4MAkJCXBvaW50ZXIgdGhhdCB3aWxsIGhvbGQgdGhlIFgwIHBhcmFtZXRlciBmb3IgdGhlIHRpbGUKLSAqIEBwYXJhbQlwX3R4MQkJCXBvaW50ZXIgdGhhdCB3aWxsIGhvbGQgdGhlIFgxIHBhcmFtZXRlciBmb3IgdGhlIHRpbGUKLSAqIEBwYXJhbQlwX3R5MAkJCXBvaW50ZXIgdGhhdCB3aWxsIGhvbGQgdGhlIFkwIHBhcmFtZXRlciBmb3IgdGhlIHRpbGUKLSAqIEBwYXJhbQlwX3R5MQkJCXBvaW50ZXIgdGhhdCB3aWxsIGhvbGQgdGhlIFkxIHBhcmFtZXRlciBmb3IgdGhlIHRpbGUKLSAqIEBwYXJhbQlwX21heF9wcmVjCQlwb2ludGVyIHRoYXQgd2lsbCBob2xkIHRoZSB0aGUgbWF4aW11bSBwcmVjaXNpb24gZm9yIGFsbCB0aGUgYmFuZHMgb2YgdGhlIHRpbGUKLSAqIEBwYXJhbQlwX21heF9yZXMJCXBvaW50ZXIgdGhhdCB3aWxsIGhvbGQgdGhlIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXNvbHV0aW9ucyBmb3IgYWxsIHRoZSBwb2MgaW5zaWRlIHRoZSB0aWxlLgotICogQHBhcmFtCXBfZHhfbWluCQkJcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgdGhlIG1pbmltdW0gZHggb2YgYWxsIHRoZSBjb21wb25lbnRzIG9mIGFsbCB0aGUgcmVzb2x1dGlvbnMgZm9yIHRoZSB0aWxlLgotICogQHBhcmFtCXBfZHlfbWluCQkJcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgdGhlIG1pbmltdW0gZHkgb2YgYWxsIHRoZSBjb21wb25lbnRzIG9mIGFsbCB0aGUgcmVzb2x1dGlvbnMgZm9yIHRoZSB0aWxlLgotICovCi1zdGF0aWMgdm9pZCBvcGpfZ2V0X2VuY29kaW5nX3BhcmFtZXRlcnMoY29uc3Qgb3BqX2ltYWdlX3QgKnBfaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BqX2NwX3QgKnBfY3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAgdGlsZW5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAgKiBwX3R4MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBwX3R4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBwX3R5MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBwX3R5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9keF9taW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZHlfbWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX21heF9wcmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX21heF9yZXMgKTsKLQotLyoqCi0gKiBHZXRzIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzIG5lZWRlZCB0byB1cGRhdGUgdGhlIGNvZGluZyBwYXJhbWV0ZXJzIGFuZCBhbGwgdGhlIHBvY3MuCi0gKiBUaGUgcHJlY2luY3Qgd2lkdGhzLCBoZWlnaHRzLCBkeCBhbmQgZHkgZm9yIGVhY2ggY29tcG9uZW50IGF0IGVhY2ggcmVzb2x1dGlvbiB3aWxsIGJlIHN0b3JlZCBhcyB3ZWxsLgotICogdGhlIGxhc3QgcGFyYW1ldGVyIG9mIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgYW4gYXJyYXkgb2YgcG9pbnRlcnMgb2Ygc2l6ZSBuYiBjb21wb25lbnRzLCBlYWNoIHBvaW50ZXIgbGVhZGluZwotICogdG8gYW4gYXJlYSBvZiBzaXplIDQgKiBtYXhfcmVzLiBUaGUgZGF0YSBpcyBzdG9yZWQgaW5zaWRlIHRoaXMgYXJlYSB3aXRoIHRoZSBmb2xsb3dpbmcgcGF0dGVybiA6Ci0gKiBkeF9jb21waV9yZXMwICwgZHlfY29tcGlfcmVzMCAsIHdfY29tcGlfcmVzMCwgaF9jb21waV9yZXMwICwgZHhfY29tcGlfcmVzMSAsIGR5X2NvbXBpX3JlczEgLCB3X2NvbXBpX3JlczEsIGhfY29tcGlfcmVzMSAsIC4uLgotICoKLSAqIEBwYXJhbQlwX2ltYWdlCQkJdGhlIGltYWdlIGJlaW5nIGVuY29kZWQuCi0gKiBAcGFyYW0JcF9jcAkJCXRoZSBjb2RpbmcgcGFyYW1ldGVycy4KLSAqIEBwYXJhbQl0aWxlbm8JCQl0aGUgdGlsZSBpbmRleCBvZiB0aGUgdGlsZSBiZWluZyBlbmNvZGVkLgotICogQHBhcmFtCXBfdHgwCQkJcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgWDAgcGFyYW1ldGVyIGZvciB0aGUgdGlsZQotICogQHBhcmFtCXBfdHgxCQkJcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgWDEgcGFyYW1ldGVyIGZvciB0aGUgdGlsZQotICogQHBhcmFtCXBfdHkwCQkJcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgWTAgcGFyYW1ldGVyIGZvciB0aGUgdGlsZQotICogQHBhcmFtCXBfdHkxCQkJcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgWTEgcGFyYW1ldGVyIGZvciB0aGUgdGlsZQotICogQHBhcmFtCXBfbWF4X3ByZWMJCXBvaW50ZXIgdGhhdCB3aWxsIGhvbGQgdGhlIHRoZSBtYXhpbXVtIHByZWNpc2lvbiBmb3IgYWxsIHRoZSBiYW5kcyBvZiB0aGUgdGlsZQotICogQHBhcmFtCXBfbWF4X3JlcwkJcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlc29sdXRpb25zIGZvciBhbGwgdGhlIHBvYyBpbnNpZGUgdGhlIHRpbGUuCi0gKiBAcGFyYW0JcF9keF9taW4JCXBvaW50ZXIgdGhhdCB3aWxsIGhvbGQgdGhlIHRoZSBtaW5pbXVtIGR4IG9mIGFsbCB0aGUgY29tcG9uZW50cyBvZiBhbGwgdGhlIHJlc29sdXRpb25zIGZvciB0aGUgdGlsZS4KLSAqIEBwYXJhbQlwX2R5X21pbgkJcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgdGhlIG1pbmltdW0gZHkgb2YgYWxsIHRoZSBjb21wb25lbnRzIG9mIGFsbCB0aGUgcmVzb2x1dGlvbnMgZm9yIHRoZSB0aWxlLgotICogQHBhcmFtCXBfcmVzb2x1dGlvbnMJcG9pbnRlciB0byBhbiBhcmVhIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG9uZSBkZXNjcmliZWQgYWJvdmUuCi0gKi8KLXN0YXRpYyB2b2lkIG9wal9nZXRfYWxsX2VuY29kaW5nX3BhcmFtZXRlcnMoY29uc3Qgb3BqX2ltYWdlX3QgKnBfaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wal9jcF90ICpwX2NwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHRpbGVubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90eDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdHgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBwX3R5MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90eTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2R4X21pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZHlfbWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9tYXhfcHJlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfbWF4X3JlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqKiBwX3Jlc29sdXRpb25zICk7Ci0vKioKLSAqIEFsbG9jYXRlcyBtZW1vcnkgZm9yIGEgcGFja2V0IGl0ZXJhdG9yLiBEYXRhIGFuZCBkYXRhIHNpemVzIGFyZSBzZXQgYnkgdGhpcyBvcGVyYXRpb24uCi0gKiBObyBvdGhlciBkYXRhIGlzIHNldC4gVGhlIGluY2x1ZGUgc2VjdGlvbiBvZiB0aGUgcGFja2V0ICBpdGVyYXRvciBpcyBub3QgYWxsb2NhdGVkLgotICogCi0gKiBAcGFyYW0JcF9pbWFnZQkJdGhlIGltYWdlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcGFja2V0IGl0ZXJhdG9yIChpbiBmYWN0IG9ubHkgdGhlIG51bWJlciBvZiBjb21wb25lbnRzIGlzIHJlbGV2YW50LgotICogQHBhcmFtCXBfY3AJCXRoZSBjb2RpbmcgcGFyYW1ldGVycy4KLSAqIEBwYXJhbQl0aWxlbm8JdGhlIGluZGV4IG9mIHRoZSB0aWxlIGZyb20gd2hpY2ggY3JlYXRpbmcgdGhlIHBhY2tldCBpdGVyYXRvci4KLSAqLwotc3RhdGljIG9wal9waV9pdGVyYXRvcl90ICogb3BqX3BpX2NyZWF0ZSgJY29uc3Qgb3BqX2ltYWdlX3QgKnBfaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wal9jcF90ICpwX2NwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHRpbGVubyApOwotLyoqCi0gKiBGSVhNRSBET0MKLSAqLwotc3RhdGljIHZvaWQgb3BqX3BpX3VwZGF0ZV9kZWNvZGVfbm90X3BvYyAob3BqX3BpX2l0ZXJhdG9yX3QgKiBwX3BpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjcF90ICogcF90Y3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X3ByZWNpc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfcmVzKTsKLS8qKgotICogRklYTUUgRE9DCi0gKi8KLXN0YXRpYyB2b2lkIG9wal9waV91cGRhdGVfZGVjb2RlX3BvYyAoICBvcGpfcGlfaXRlcmF0b3JfdCAqIHBfcGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjcF90ICogcF90Y3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9wcmVjaXNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9yZXMpOwotCi0vKioKLSAqIEZJWE1FIERPQwotICovCi1PUEpfQk9PTCBvcGpfcGlfY2hlY2tfbmV4dF9sZXZlbCgJT1BKX0lOVDMyIHBvcywKLQkJCQkJCQkJb3BqX2NwX3QgKmNwLAotCQkJCQkJCQlPUEpfVUlOVDMyIHRpbGVubywKLQkJCQkJCQkJT1BKX1VJTlQzMiBwaW5vLAotCQkJCQkJCQljb25zdCBPUEpfQ0hBUiAqcHJvZyk7Ci0KLS8qQH0qLwotCi0vKkB9Ki8KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgIGxvY2FsIGZ1bmN0aW9ucwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KLQotT1BKX0JPT0wgb3BqX3BpX25leHRfbHJjcChvcGpfcGlfaXRlcmF0b3JfdCAqIHBpKSB7Ci0Jb3BqX3BpX2NvbXBfdCAqY29tcCA9IE5VTEw7Ci0Jb3BqX3BpX3Jlc29sdXRpb25fdCAqcmVzID0gTlVMTDsKLQlPUEpfVUlOVDMyIGluZGV4ID0gMDsKLQkKLQlpZiAoIXBpLT5maXJzdCkgewotCQljb21wID0gJnBpLT5jb21wc1twaS0+Y29tcG5vXTsKLQkJcmVzID0gJmNvbXAtPnJlc29sdXRpb25zW3BpLT5yZXNub107Ci0JCWdvdG8gTEFCRUxfU0tJUDsKLQl9IGVsc2UgewotCQlwaS0+Zmlyc3QgPSAwOwotCX0KLQotCWZvciAocGktPmxheW5vID0gcGktPnBvYy5sYXlubzA7IHBpLT5sYXlubyA8IHBpLT5wb2MubGF5bm8xOyBwaS0+bGF5bm8rKykgewotCQlmb3IgKHBpLT5yZXNubyA9IHBpLT5wb2MucmVzbm8wOyBwaS0+cmVzbm8gPCBwaS0+cG9jLnJlc25vMTsKLQkJcGktPnJlc25vKyspIHsKLQkJCWZvciAocGktPmNvbXBubyA9IHBpLT5wb2MuY29tcG5vMDsgcGktPmNvbXBubyA8IHBpLT5wb2MuY29tcG5vMTsgcGktPmNvbXBubysrKSB7Ci0JCQkJY29tcCA9ICZwaS0+Y29tcHNbcGktPmNvbXBub107Ci0JCQkJaWYgKHBpLT5yZXNubyA+PSBjb21wLT5udW1yZXNvbHV0aW9ucykgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJcmVzID0gJmNvbXAtPnJlc29sdXRpb25zW3BpLT5yZXNub107Ci0JCQkJaWYgKCFwaS0+dHBfb24pewotCQkJCQlwaS0+cG9jLnByZWNubzEgPSByZXMtPnB3ICogcmVzLT5waDsKLQkJCQl9Ci0JCQkJZm9yIChwaS0+cHJlY25vID0gcGktPnBvYy5wcmVjbm8wOyBwaS0+cHJlY25vIDwgcGktPnBvYy5wcmVjbm8xOyBwaS0+cHJlY25vKyspIHsKLQkJCQkJaW5kZXggPSBwaS0+bGF5bm8gKiBwaS0+c3RlcF9sICsgcGktPnJlc25vICogcGktPnN0ZXBfciArIHBpLT5jb21wbm8gKiBwaS0+c3RlcF9jICsgcGktPnByZWNubyAqIHBpLT5zdGVwX3A7Ci0JCQkJCWlmICghcGktPmluY2x1ZGVbaW5kZXhdKSB7Ci0JCQkJCQlwaS0+aW5jbHVkZVtpbmRleF0gPSAxOwotCQkJCQkJcmV0dXJuIE9QSl9UUlVFOwotCQkJCQl9Ci1MQUJFTF9TS0lQOjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcmV0dXJuIE9QSl9GQUxTRTsKLX0KLQotT1BKX0JPT0wgb3BqX3BpX25leHRfcmxjcChvcGpfcGlfaXRlcmF0b3JfdCAqIHBpKSB7Ci0Jb3BqX3BpX2NvbXBfdCAqY29tcCA9IE5VTEw7Ci0Jb3BqX3BpX3Jlc29sdXRpb25fdCAqcmVzID0gTlVMTDsKLQlPUEpfVUlOVDMyIGluZGV4ID0gMDsKLQotCWlmICghcGktPmZpcnN0KSB7Ci0JCWNvbXAgPSAmcGktPmNvbXBzW3BpLT5jb21wbm9dOwotCQlyZXMgPSAmY29tcC0+cmVzb2x1dGlvbnNbcGktPnJlc25vXTsKLQkJZ290byBMQUJFTF9TS0lQOwotCX0gZWxzZSB7Ci0JCXBpLT5maXJzdCA9IDA7Ci0JfQotCi0JZm9yIChwaS0+cmVzbm8gPSBwaS0+cG9jLnJlc25vMDsgcGktPnJlc25vIDwgcGktPnBvYy5yZXNubzE7IHBpLT5yZXNubysrKSB7Ci0JCWZvciAocGktPmxheW5vID0gcGktPnBvYy5sYXlubzA7IHBpLT5sYXlubyA8IHBpLT5wb2MubGF5bm8xOyBwaS0+bGF5bm8rKykgewotCQkJZm9yIChwaS0+Y29tcG5vID0gcGktPnBvYy5jb21wbm8wOyBwaS0+Y29tcG5vIDwgcGktPnBvYy5jb21wbm8xOyBwaS0+Y29tcG5vKyspIHsKLQkJCQljb21wID0gJnBpLT5jb21wc1twaS0+Y29tcG5vXTsKLQkJCQlpZiAocGktPnJlc25vID49IGNvbXAtPm51bXJlc29sdXRpb25zKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlyZXMgPSAmY29tcC0+cmVzb2x1dGlvbnNbcGktPnJlc25vXTsKLQkJCQlpZighcGktPnRwX29uKXsKLQkJCQkJcGktPnBvYy5wcmVjbm8xID0gcmVzLT5wdyAqIHJlcy0+cGg7Ci0JCQkJfQotCQkJCWZvciAocGktPnByZWNubyA9IHBpLT5wb2MucHJlY25vMDsgcGktPnByZWNubyA8IHBpLT5wb2MucHJlY25vMTsgcGktPnByZWNubysrKSB7Ci0JCQkJCWluZGV4ID0gcGktPmxheW5vICogcGktPnN0ZXBfbCArIHBpLT5yZXNubyAqIHBpLT5zdGVwX3IgKyBwaS0+Y29tcG5vICogcGktPnN0ZXBfYyArIHBpLT5wcmVjbm8gKiBwaS0+c3RlcF9wOwotCQkJCQlpZiAoIXBpLT5pbmNsdWRlW2luZGV4XSkgewotCQkJCQkJcGktPmluY2x1ZGVbaW5kZXhdID0gMTsKLQkJCQkJCXJldHVybiBPUEpfVFJVRTsKLQkJCQkJfQotTEFCRUxfU0tJUDo7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXJldHVybiBPUEpfRkFMU0U7Ci19Ci0KLU9QSl9CT09MIG9wal9waV9uZXh0X3JwY2wob3BqX3BpX2l0ZXJhdG9yX3QgKiBwaSkgewotCW9wal9waV9jb21wX3QgKmNvbXAgPSBOVUxMOwotCW9wal9waV9yZXNvbHV0aW9uX3QgKnJlcyA9IE5VTEw7Ci0JT1BKX1VJTlQzMiBpbmRleCA9IDA7Ci0KLQlpZiAoIXBpLT5maXJzdCkgewotCQlnb3RvIExBQkVMX1NLSVA7Ci0JfSBlbHNlIHsKLQkJT1BKX1VJTlQzMiBjb21wbm8sIHJlc25vOwotCQlwaS0+Zmlyc3QgPSAwOwotCQlwaS0+ZHggPSAwOwotCQlwaS0+ZHkgPSAwOwotCQlmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHBpLT5udW1jb21wczsgY29tcG5vKyspIHsKLQkJCWNvbXAgPSAmcGktPmNvbXBzW2NvbXBub107Ci0JCQlmb3IgKHJlc25vID0gMDsgcmVzbm8gPCBjb21wLT5udW1yZXNvbHV0aW9uczsgcmVzbm8rKykgewotCQkJCU9QSl9VSU5UMzIgZHgsIGR5OwotCQkJCXJlcyA9ICZjb21wLT5yZXNvbHV0aW9uc1tyZXNub107Ci0JCQkJZHggPSBjb21wLT5keCAqICgxdSA8PCAocmVzLT5wZHggKyBjb21wLT5udW1yZXNvbHV0aW9ucyAtIDEgLSByZXNubykpOwotCQkJCWR5ID0gY29tcC0+ZHkgKiAoMXUgPDwgKHJlcy0+cGR5ICsgY29tcC0+bnVtcmVzb2x1dGlvbnMgLSAxIC0gcmVzbm8pKTsKLQkJCQlwaS0+ZHggPSAhcGktPmR4ID8gZHggOiBvcGpfdWludF9taW4ocGktPmR4LCBkeCk7Ci0JCQkJcGktPmR5ID0gIXBpLT5keSA/IGR5IDogb3BqX3VpbnRfbWluKHBpLT5keSwgZHkpOwotCQkJfQotCQl9Ci0JfQotaWYgKCFwaS0+dHBfb24pewotCQkJcGktPnBvYy50eTAgPSBwaS0+dHkwOwotCQkJcGktPnBvYy50eDAgPSBwaS0+dHgwOwotCQkJcGktPnBvYy50eTEgPSBwaS0+dHkxOwotCQkJcGktPnBvYy50eDEgPSBwaS0+dHgxOwotCQl9Ci0JZm9yIChwaS0+cmVzbm8gPSBwaS0+cG9jLnJlc25vMDsgcGktPnJlc25vIDwgcGktPnBvYy5yZXNubzE7IHBpLT5yZXNubysrKSB7Ci0JCWZvciAocGktPnkgPSBwaS0+cG9jLnR5MDsgcGktPnkgPCBwaS0+cG9jLnR5MTsgcGktPnkgKz0gKE9QSl9JTlQzMikocGktPmR5IC0gKE9QSl9VSU5UMzIpKHBpLT55ICUgKE9QSl9JTlQzMilwaS0+ZHkpKSkgewotCQkJZm9yIChwaS0+eCA9IHBpLT5wb2MudHgwOyBwaS0+eCA8IHBpLT5wb2MudHgxOyBwaS0+eCArPSAoT1BKX0lOVDMyKShwaS0+ZHggLSAoT1BKX1VJTlQzMikocGktPnggJSAoT1BKX0lOVDMyKXBpLT5keCkpKSB7Ci0JCQkJZm9yIChwaS0+Y29tcG5vID0gcGktPnBvYy5jb21wbm8wOyBwaS0+Y29tcG5vIDwgcGktPnBvYy5jb21wbm8xOyBwaS0+Y29tcG5vKyspIHsKLQkJCQkJT1BKX1VJTlQzMiBsZXZlbG5vOwotCQkJCQlPUEpfSU5UMzIgdHJ4MCwgdHJ5MDsKLQkJCQkJT1BKX0lOVDMyICB0cngxLCB0cnkxOwotCQkJCQlPUEpfVUlOVDMyICBycHgsIHJweTsKLQkJCQkJT1BKX0lOVDMyICBwcmNpLCBwcmNqOwotCQkJCQljb21wID0gJnBpLT5jb21wc1twaS0+Y29tcG5vXTsKLQkJCQkJaWYgKHBpLT5yZXNubyA+PSBjb21wLT5udW1yZXNvbHV0aW9ucykgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJcmVzID0gJmNvbXAtPnJlc29sdXRpb25zW3BpLT5yZXNub107Ci0JCQkJCWxldmVsbm8gPSBjb21wLT5udW1yZXNvbHV0aW9ucyAtIDEgLSBwaS0+cmVzbm87Ci0JCQkJCXRyeDAgPSBvcGpfaW50X2NlaWxkaXYocGktPnR4MCwgKE9QSl9JTlQzMikoY29tcC0+ZHggPDwgbGV2ZWxubykpOwotCQkJCQl0cnkwID0gb3BqX2ludF9jZWlsZGl2KHBpLT50eTAsIChPUEpfSU5UMzIpKGNvbXAtPmR5IDw8IGxldmVsbm8pKTsKLQkJCQkJdHJ4MSA9IG9wal9pbnRfY2VpbGRpdihwaS0+dHgxLCAoT1BKX0lOVDMyKShjb21wLT5keCA8PCBsZXZlbG5vKSk7Ci0JCQkJCXRyeTEgPSBvcGpfaW50X2NlaWxkaXYocGktPnR5MSwgKE9QSl9JTlQzMikoY29tcC0+ZHkgPDwgbGV2ZWxubykpOwotCQkJCQlycHggPSByZXMtPnBkeCArIGxldmVsbm87Ci0JCQkJCXJweSA9IHJlcy0+cGR5ICsgbGV2ZWxubzsKLQkJCQkJaWYgKCEoKHBpLT55ICUgKE9QSl9JTlQzMikoY29tcC0+ZHkgPDwgcnB5KSA9PSAwKSB8fCAoKHBpLT55ID09IHBpLT50eTApICYmICgodHJ5MCA8PCBsZXZlbG5vKSAlICgxIDw8IHJweSkpKSkpewotCQkJCQkJY29udGludWU7CQotCQkJCQl9Ci0JCQkJCWlmICghKChwaS0+eCAlIChPUEpfSU5UMzIpKGNvbXAtPmR4IDw8IHJweCkgPT0gMCkgfHwgKChwaS0+eCA9PSBwaS0+dHgwKSAmJiAoKHRyeDAgPDwgbGV2ZWxubykgJSAoMSA8PCBycHgpKSkpKXsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoKHJlcy0+cHc9PTApfHwocmVzLT5waD09MCkpIGNvbnRpbnVlOwotCQkJCQkKLQkJCQkJaWYgKCh0cngwPT10cngxKXx8KHRyeTA9PXRyeTEpKSBjb250aW51ZTsKLQkJCQkJCi0JCQkJCXByY2kgPSBvcGpfaW50X2Zsb29yZGl2cG93MihvcGpfaW50X2NlaWxkaXYocGktPngsIChPUEpfSU5UMzIpKGNvbXAtPmR4IDw8IGxldmVsbm8pKSwgKE9QSl9JTlQzMilyZXMtPnBkeCkKLQkJCQkJCSAtIG9wal9pbnRfZmxvb3JkaXZwb3cyKHRyeDAsIChPUEpfSU5UMzIpcmVzLT5wZHgpOwotCQkJCQlwcmNqID0gb3BqX2ludF9mbG9vcmRpdnBvdzIob3BqX2ludF9jZWlsZGl2KHBpLT55LCAoT1BKX0lOVDMyKShjb21wLT5keSA8PCBsZXZlbG5vKSksIChPUEpfSU5UMzIpcmVzLT5wZHkpCi0JCQkJCQkgLSBvcGpfaW50X2Zsb29yZGl2cG93Mih0cnkwLCAoT1BKX0lOVDMyKXJlcy0+cGR5KTsKLQkJCQkJcGktPnByZWNubyA9IChPUEpfVUlOVDMyKShwcmNpICsgcHJjaiAqIChPUEpfSU5UMzIpcmVzLT5wdyk7Ci0JCQkJCWZvciAocGktPmxheW5vID0gcGktPnBvYy5sYXlubzA7IHBpLT5sYXlubyA8IHBpLT5wb2MubGF5bm8xOyBwaS0+bGF5bm8rKykgewotCQkJCQkJaW5kZXggPSBwaS0+bGF5bm8gKiBwaS0+c3RlcF9sICsgcGktPnJlc25vICogcGktPnN0ZXBfciArIHBpLT5jb21wbm8gKiBwaS0+c3RlcF9jICsgcGktPnByZWNubyAqIHBpLT5zdGVwX3A7Ci0JCQkJCQlpZiAoIXBpLT5pbmNsdWRlW2luZGV4XSkgewotCQkJCQkJCXBpLT5pbmNsdWRlW2luZGV4XSA9IDE7Ci0JCQkJCQkJcmV0dXJuIE9QSl9UUlVFOwotCQkJCQkJfQotTEFCRUxfU0tJUDo7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcmV0dXJuIE9QSl9GQUxTRTsKLX0KLQotT1BKX0JPT0wgb3BqX3BpX25leHRfcGNybChvcGpfcGlfaXRlcmF0b3JfdCAqIHBpKSB7Ci0Jb3BqX3BpX2NvbXBfdCAqY29tcCA9IE5VTEw7Ci0Jb3BqX3BpX3Jlc29sdXRpb25fdCAqcmVzID0gTlVMTDsKLQlPUEpfVUlOVDMyIGluZGV4ID0gMDsKLQotCWlmICghcGktPmZpcnN0KSB7Ci0JCWNvbXAgPSAmcGktPmNvbXBzW3BpLT5jb21wbm9dOwotCQlnb3RvIExBQkVMX1NLSVA7Ci0JfSBlbHNlIHsKLQkJT1BKX1VJTlQzMiBjb21wbm8sIHJlc25vOwotCQlwaS0+Zmlyc3QgPSAwOwotCQlwaS0+ZHggPSAwOwotCQlwaS0+ZHkgPSAwOwotCQlmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHBpLT5udW1jb21wczsgY29tcG5vKyspIHsKLQkJCWNvbXAgPSAmcGktPmNvbXBzW2NvbXBub107Ci0JCQlmb3IgKHJlc25vID0gMDsgcmVzbm8gPCBjb21wLT5udW1yZXNvbHV0aW9uczsgcmVzbm8rKykgewotCQkJCU9QSl9VSU5UMzIgZHgsIGR5OwotCQkJCXJlcyA9ICZjb21wLT5yZXNvbHV0aW9uc1tyZXNub107Ci0JCQkJZHggPSBjb21wLT5keCAqICgxdSA8PCAocmVzLT5wZHggKyBjb21wLT5udW1yZXNvbHV0aW9ucyAtIDEgLSByZXNubykpOwotCQkJCWR5ID0gY29tcC0+ZHkgKiAoMXUgPDwgKHJlcy0+cGR5ICsgY29tcC0+bnVtcmVzb2x1dGlvbnMgLSAxIC0gcmVzbm8pKTsKLQkJCQlwaS0+ZHggPSAhcGktPmR4ID8gZHggOiBvcGpfdWludF9taW4ocGktPmR4LCBkeCk7Ci0JCQkJcGktPmR5ID0gIXBpLT5keSA/IGR5IDogb3BqX3VpbnRfbWluKHBpLT5keSwgZHkpOwotCQkJfQotCQl9Ci0JfQotCWlmICghcGktPnRwX29uKXsKLQkJCXBpLT5wb2MudHkwID0gcGktPnR5MDsKLQkJCXBpLT5wb2MudHgwID0gcGktPnR4MDsKLQkJCXBpLT5wb2MudHkxID0gcGktPnR5MTsKLQkJCXBpLT5wb2MudHgxID0gcGktPnR4MTsKLQkJfQotCWZvciAocGktPnkgPSBwaS0+cG9jLnR5MDsgcGktPnkgPCBwaS0+cG9jLnR5MTsgcGktPnkgKz0gKE9QSl9JTlQzMikocGktPmR5IC0gKE9QSl9VSU5UMzIpKHBpLT55ICUgKE9QSl9JTlQzMilwaS0+ZHkpKSkgewotCQlmb3IgKHBpLT54ID0gcGktPnBvYy50eDA7IHBpLT54IDwgcGktPnBvYy50eDE7IHBpLT54ICs9IChPUEpfSU5UMzIpKHBpLT5keCAtIChPUEpfVUlOVDMyKShwaS0+eCAlIChPUEpfSU5UMzIpcGktPmR4KSkpIHsKLQkJCWZvciAocGktPmNvbXBubyA9IHBpLT5wb2MuY29tcG5vMDsgcGktPmNvbXBubyA8IHBpLT5wb2MuY29tcG5vMTsgcGktPmNvbXBubysrKSB7Ci0JCQkJY29tcCA9ICZwaS0+Y29tcHNbcGktPmNvbXBub107Ci0JCQkJZm9yIChwaS0+cmVzbm8gPSBwaS0+cG9jLnJlc25vMDsgcGktPnJlc25vIDwgb3BqX3VpbnRfbWluKHBpLT5wb2MucmVzbm8xLCBjb21wLT5udW1yZXNvbHV0aW9ucyk7IHBpLT5yZXNubysrKSB7Ci0JCQkJCU9QSl9VSU5UMzIgbGV2ZWxubzsKLQkJCQkJT1BKX0lOVDMyIHRyeDAsIHRyeTA7Ci0JCQkJCU9QSl9JTlQzMiB0cngxLCB0cnkxOwotCQkJCQlPUEpfVUlOVDMyIHJweCwgcnB5OwotCQkJCQlPUEpfSU5UMzIgcHJjaSwgcHJjajsKLQkJCQkJcmVzID0gJmNvbXAtPnJlc29sdXRpb25zW3BpLT5yZXNub107Ci0JCQkJCWxldmVsbm8gPSBjb21wLT5udW1yZXNvbHV0aW9ucyAtIDEgLSBwaS0+cmVzbm87Ci0JCQkJCXRyeDAgPSBvcGpfaW50X2NlaWxkaXYocGktPnR4MCwgKE9QSl9JTlQzMikoY29tcC0+ZHggPDwgbGV2ZWxubykpOwotCQkJCQl0cnkwID0gb3BqX2ludF9jZWlsZGl2KHBpLT50eTAsIChPUEpfSU5UMzIpKGNvbXAtPmR5IDw8IGxldmVsbm8pKTsKLQkJCQkJdHJ4MSA9IG9wal9pbnRfY2VpbGRpdihwaS0+dHgxLCAoT1BKX0lOVDMyKShjb21wLT5keCA8PCBsZXZlbG5vKSk7Ci0JCQkJCXRyeTEgPSBvcGpfaW50X2NlaWxkaXYocGktPnR5MSwgKE9QSl9JTlQzMikoY29tcC0+ZHkgPDwgbGV2ZWxubykpOwotCQkJCQlycHggPSByZXMtPnBkeCArIGxldmVsbm87Ci0JCQkJCXJweSA9IHJlcy0+cGR5ICsgbGV2ZWxubzsKLQkJCQkJaWYgKCEoKHBpLT55ICUgKE9QSl9JTlQzMikoY29tcC0+ZHkgPDwgcnB5KSA9PSAwKSB8fCAoKHBpLT55ID09IHBpLT50eTApICYmICgodHJ5MCA8PCBsZXZlbG5vKSAlICgxIDw8IHJweSkpKSkpewotCQkJCQkJY29udGludWU7CQotCQkJCQl9Ci0JCQkJCWlmICghKChwaS0+eCAlIChPUEpfSU5UMzIpKGNvbXAtPmR4IDw8IHJweCkgPT0gMCkgfHwgKChwaS0+eCA9PSBwaS0+dHgwKSAmJiAoKHRyeDAgPDwgbGV2ZWxubykgJSAoMSA8PCBycHgpKSkpKXsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoKHJlcy0+cHc9PTApfHwocmVzLT5waD09MCkpIGNvbnRpbnVlOwotCQkJCQkKLQkJCQkJaWYgKCh0cngwPT10cngxKXx8KHRyeTA9PXRyeTEpKSBjb250aW51ZTsKLQkJCQkJCi0JCQkJCXByY2kgPSBvcGpfaW50X2Zsb29yZGl2cG93MihvcGpfaW50X2NlaWxkaXYocGktPngsIChPUEpfSU5UMzIpKGNvbXAtPmR4IDw8IGxldmVsbm8pKSwgKE9QSl9JTlQzMilyZXMtPnBkeCkKLQkJCQkJCSAtIG9wal9pbnRfZmxvb3JkaXZwb3cyKHRyeDAsIChPUEpfSU5UMzIpcmVzLT5wZHgpOwotCQkJCQlwcmNqID0gb3BqX2ludF9mbG9vcmRpdnBvdzIob3BqX2ludF9jZWlsZGl2KHBpLT55LCAoT1BKX0lOVDMyKShjb21wLT5keSA8PCBsZXZlbG5vKSksIChPUEpfSU5UMzIpcmVzLT5wZHkpCi0JCQkJCQkgLSBvcGpfaW50X2Zsb29yZGl2cG93Mih0cnkwLCAoT1BKX0lOVDMyKXJlcy0+cGR5KTsKLQkJCQkJcGktPnByZWNubyA9IChPUEpfVUlOVDMyKShwcmNpICsgcHJjaiAqIChPUEpfSU5UMzIpcmVzLT5wdyk7Ci0JCQkJCWZvciAocGktPmxheW5vID0gcGktPnBvYy5sYXlubzA7IHBpLT5sYXlubyA8IHBpLT5wb2MubGF5bm8xOyBwaS0+bGF5bm8rKykgewotCQkJCQkJaW5kZXggPSBwaS0+bGF5bm8gKiBwaS0+c3RlcF9sICsgcGktPnJlc25vICogcGktPnN0ZXBfciArIHBpLT5jb21wbm8gKiBwaS0+c3RlcF9jICsgcGktPnByZWNubyAqIHBpLT5zdGVwX3A7Ci0JCQkJCQlpZiAoIXBpLT5pbmNsdWRlW2luZGV4XSkgewotCQkJCQkJCXBpLT5pbmNsdWRlW2luZGV4XSA9IDE7Ci0JCQkJCQkJcmV0dXJuIE9QSl9UUlVFOwotCQkJCQkJfQkKLUxBQkVMX1NLSVA6OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXJldHVybiBPUEpfRkFMU0U7Ci19Ci0KLU9QSl9CT09MIG9wal9waV9uZXh0X2Nwcmwob3BqX3BpX2l0ZXJhdG9yX3QgKiBwaSkgewotCW9wal9waV9jb21wX3QgKmNvbXAgPSBOVUxMOwotCW9wal9waV9yZXNvbHV0aW9uX3QgKnJlcyA9IE5VTEw7Ci0JT1BKX1VJTlQzMiBpbmRleCA9IDA7Ci0KLQlpZiAoIXBpLT5maXJzdCkgewotCQljb21wID0gJnBpLT5jb21wc1twaS0+Y29tcG5vXTsKLQkJZ290byBMQUJFTF9TS0lQOwotCX0gZWxzZSB7Ci0JCXBpLT5maXJzdCA9IDA7Ci0JfQotCi0JZm9yIChwaS0+Y29tcG5vID0gcGktPnBvYy5jb21wbm8wOyBwaS0+Y29tcG5vIDwgcGktPnBvYy5jb21wbm8xOyBwaS0+Y29tcG5vKyspIHsKLQkJT1BKX1VJTlQzMiByZXNubzsKLQkJY29tcCA9ICZwaS0+Y29tcHNbcGktPmNvbXBub107Ci0JCXBpLT5keCA9IDA7Ci0JCXBpLT5keSA9IDA7Ci0JCWZvciAocmVzbm8gPSAwOyByZXNubyA8IGNvbXAtPm51bXJlc29sdXRpb25zOyByZXNubysrKSB7Ci0JCQlPUEpfVUlOVDMyIGR4LCBkeTsKLQkJCXJlcyA9ICZjb21wLT5yZXNvbHV0aW9uc1tyZXNub107Ci0JCQlkeCA9IGNvbXAtPmR4ICogKDF1IDw8IChyZXMtPnBkeCArIGNvbXAtPm51bXJlc29sdXRpb25zIC0gMSAtIHJlc25vKSk7Ci0JCQlkeSA9IGNvbXAtPmR5ICogKDF1IDw8IChyZXMtPnBkeSArIGNvbXAtPm51bXJlc29sdXRpb25zIC0gMSAtIHJlc25vKSk7Ci0JCQlwaS0+ZHggPSAhcGktPmR4ID8gZHggOiBvcGpfdWludF9taW4ocGktPmR4LCBkeCk7Ci0JCQlwaS0+ZHkgPSAhcGktPmR5ID8gZHkgOiBvcGpfdWludF9taW4ocGktPmR5LCBkeSk7Ci0JCX0KLQkJaWYgKCFwaS0+dHBfb24pewotCQkJcGktPnBvYy50eTAgPSBwaS0+dHkwOwotCQkJcGktPnBvYy50eDAgPSBwaS0+dHgwOwotCQkJcGktPnBvYy50eTEgPSBwaS0+dHkxOwotCQkJcGktPnBvYy50eDEgPSBwaS0+dHgxOwotCQl9Ci0JCWZvciAocGktPnkgPSBwaS0+cG9jLnR5MDsgcGktPnkgPCBwaS0+cG9jLnR5MTsgcGktPnkgKz0gKE9QSl9JTlQzMikocGktPmR5IC0gKE9QSl9VSU5UMzIpKHBpLT55ICUgKE9QSl9JTlQzMilwaS0+ZHkpKSkgewotCQkJZm9yIChwaS0+eCA9IHBpLT5wb2MudHgwOyBwaS0+eCA8IHBpLT5wb2MudHgxOyBwaS0+eCArPSAoT1BKX0lOVDMyKShwaS0+ZHggLSAoT1BKX1VJTlQzMikocGktPnggJSAoT1BKX0lOVDMyKXBpLT5keCkpKSB7Ci0JCQkJZm9yIChwaS0+cmVzbm8gPSBwaS0+cG9jLnJlc25vMDsgcGktPnJlc25vIDwgb3BqX3VpbnRfbWluKHBpLT5wb2MucmVzbm8xLCBjb21wLT5udW1yZXNvbHV0aW9ucyk7IHBpLT5yZXNubysrKSB7Ci0JCQkJCU9QSl9VSU5UMzIgbGV2ZWxubzsKLQkJCQkJT1BKX0lOVDMyIHRyeDAsIHRyeTA7Ci0JCQkJCU9QSl9JTlQzMiB0cngxLCB0cnkxOwotCQkJCQlPUEpfVUlOVDMyIHJweCwgcnB5OwotCQkJCQlPUEpfSU5UMzIgcHJjaSwgcHJjajsKLQkJCQkJcmVzID0gJmNvbXAtPnJlc29sdXRpb25zW3BpLT5yZXNub107Ci0JCQkJCWxldmVsbm8gPSBjb21wLT5udW1yZXNvbHV0aW9ucyAtIDEgLSBwaS0+cmVzbm87Ci0JCQkJCXRyeDAgPSBvcGpfaW50X2NlaWxkaXYocGktPnR4MCwgKE9QSl9JTlQzMikoY29tcC0+ZHggPDwgbGV2ZWxubykpOwotCQkJCQl0cnkwID0gb3BqX2ludF9jZWlsZGl2KHBpLT50eTAsIChPUEpfSU5UMzIpKGNvbXAtPmR5IDw8IGxldmVsbm8pKTsKLQkJCQkJdHJ4MSA9IG9wal9pbnRfY2VpbGRpdihwaS0+dHgxLCAoT1BKX0lOVDMyKShjb21wLT5keCA8PCBsZXZlbG5vKSk7Ci0JCQkJCXRyeTEgPSBvcGpfaW50X2NlaWxkaXYocGktPnR5MSwgKE9QSl9JTlQzMikoY29tcC0+ZHkgPDwgbGV2ZWxubykpOwotCQkJCQlycHggPSByZXMtPnBkeCArIGxldmVsbm87Ci0JCQkJCXJweSA9IHJlcy0+cGR5ICsgbGV2ZWxubzsKLQkJCQkJaWYgKCEoKHBpLT55ICUgKE9QSl9JTlQzMikoY29tcC0+ZHkgPDwgcnB5KSA9PSAwKSB8fCAoKHBpLT55ID09IHBpLT50eTApICYmICgodHJ5MCA8PCBsZXZlbG5vKSAlICgxIDw8IHJweSkpKSkpewotCQkJCQkJY29udGludWU7CQotCQkJCQl9Ci0JCQkJCWlmICghKChwaS0+eCAlIChPUEpfSU5UMzIpKGNvbXAtPmR4IDw8IHJweCkgPT0gMCkgfHwgKChwaS0+eCA9PSBwaS0+dHgwKSAmJiAoKHRyeDAgPDwgbGV2ZWxubykgJSAoMSA8PCBycHgpKSkpKXsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoKHJlcy0+cHc9PTApfHwocmVzLT5waD09MCkpIGNvbnRpbnVlOwotCQkJCQkKLQkJCQkJaWYgKCh0cngwPT10cngxKXx8KHRyeTA9PXRyeTEpKSBjb250aW51ZTsKLQkJCQkJCi0JCQkJCXByY2kgPSBvcGpfaW50X2Zsb29yZGl2cG93MihvcGpfaW50X2NlaWxkaXYocGktPngsIChPUEpfSU5UMzIpKGNvbXAtPmR4IDw8IGxldmVsbm8pKSwgKE9QSl9JTlQzMilyZXMtPnBkeCkKLQkJCQkJCSAtIG9wal9pbnRfZmxvb3JkaXZwb3cyKHRyeDAsIChPUEpfSU5UMzIpcmVzLT5wZHgpOwotCQkJCQlwcmNqID0gb3BqX2ludF9mbG9vcmRpdnBvdzIob3BqX2ludF9jZWlsZGl2KHBpLT55LCAoT1BKX0lOVDMyKShjb21wLT5keSA8PCBsZXZlbG5vKSksIChPUEpfSU5UMzIpcmVzLT5wZHkpCi0JCQkJCQkgLSBvcGpfaW50X2Zsb29yZGl2cG93Mih0cnkwLCAoT1BKX0lOVDMyKXJlcy0+cGR5KTsKLQkJCQkJcGktPnByZWNubyA9IChPUEpfVUlOVDMyKShwcmNpICsgcHJjaiAqIChPUEpfSU5UMzIpcmVzLT5wdyk7Ci0JCQkJCWZvciAocGktPmxheW5vID0gcGktPnBvYy5sYXlubzA7IHBpLT5sYXlubyA8IHBpLT5wb2MubGF5bm8xOyBwaS0+bGF5bm8rKykgewotCQkJCQkJaW5kZXggPSBwaS0+bGF5bm8gKiBwaS0+c3RlcF9sICsgcGktPnJlc25vICogcGktPnN0ZXBfciArIHBpLT5jb21wbm8gKiBwaS0+c3RlcF9jICsgcGktPnByZWNubyAqIHBpLT5zdGVwX3A7Ci0JCQkJCQlpZiAoIXBpLT5pbmNsdWRlW2luZGV4XSkgewotCQkJCQkJCXBpLT5pbmNsdWRlW2luZGV4XSA9IDE7Ci0JCQkJCQkJcmV0dXJuIE9QSl9UUlVFOwotCQkJCQkJfQotTEFCRUxfU0tJUDo7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcmV0dXJuIE9QSl9GQUxTRTsKLX0KLQotdm9pZCBvcGpfZ2V0X2VuY29kaW5nX3BhcmFtZXRlcnMoCWNvbnN0IG9wal9pbWFnZV90ICpwX2ltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BqX2NwX3QgKnBfY3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZW5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90eDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgICogcF90eDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgICogcF90eTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgICogcF90eTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9keF9taW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9keV9taW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9tYXhfcHJlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX21heF9yZXMgKQotewotCS8qIGxvb3AgKi8KLQlPUEpfVUlOVDMyICBjb21wbm8sIHJlc25vOwotCS8qIHBvaW50ZXJzICovCi0JY29uc3Qgb3BqX3RjcF90ICpsX3RjcCA9IDAwOwotCWNvbnN0IG9wal90Y2NwX3QgKiBsX3RjY3AgPSAwMDsKLQljb25zdCBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IDAwOwotCi0JLyogcG9zaXRpb24gaW4geCBhbmQgeSBvZiB0aWxlICovCi0JT1BKX1VJTlQzMiBwLCBxOwotCi0JLyogcHJlY29uZGl0aW9ucyAqLwotCWFzc2VydChwX2NwICE9IDAwKTsKLQlhc3NlcnQocF9pbWFnZSAhPSAwMCk7Ci0JYXNzZXJ0KHBfdGlsZW5vIDwgcF9jcC0+dHcgKiBwX2NwLT50aCk7Ci0KLQkvKiBpbml0aWFsaXphdGlvbnMgKi8KLQlsX3RjcCA9ICZwX2NwLT50Y3BzIFtwX3RpbGVub107Ci0JbF9pbWdfY29tcCA9IHBfaW1hZ2UtPmNvbXBzOwotCWxfdGNjcCA9IGxfdGNwLT50Y2NwczsKLQotCS8qIGhlcmUgY2FsY3VsYXRpb24gb2YgdHgwLCB0eDEsIHR5MCwgdHkxLCBtYXhwcmVjLCBkeCBhbmQgZHkgKi8KLQlwID0gcF90aWxlbm8gJSBwX2NwLT50dzsKLQlxID0gcF90aWxlbm8gLyBwX2NwLT50dzsKLQotCS8qIGZpbmQgZXh0ZW50IG9mIHRpbGUgKi8KLQkqcF90eDAgPSBvcGpfaW50X21heCgoT1BKX0lOVDMyKShwX2NwLT50eDAgKyBwICogcF9jcC0+dGR4KSwgKE9QSl9JTlQzMilwX2ltYWdlLT54MCk7Ci0JKnBfdHgxID0gb3BqX2ludF9taW4oKE9QSl9JTlQzMikocF9jcC0+dHgwICsgKHAgKyAxKSAqIHBfY3AtPnRkeCksIChPUEpfSU5UMzIpcF9pbWFnZS0+eDEpOwotCSpwX3R5MCA9IG9wal9pbnRfbWF4KChPUEpfSU5UMzIpKHBfY3AtPnR5MCArIHEgKiBwX2NwLT50ZHkpLCAoT1BKX0lOVDMyKXBfaW1hZ2UtPnkwKTsKLQkqcF90eTEgPSBvcGpfaW50X21pbigoT1BKX0lOVDMyKShwX2NwLT50eTAgKyAocSArIDEpICogcF9jcC0+dGR5KSwgKE9QSl9JTlQzMilwX2ltYWdlLT55MSk7Ci0KLQkvKiBtYXggcHJlY2lzaW9uIGlzIDAgKGNhbiBvbmx5IGdyb3cpICovCi0JKnBfbWF4X3ByZWMgPSAwOwotCSpwX21heF9yZXMgPSAwOwotCi0JLyogdGFrZSB0aGUgbGFyZ2VzdCB2YWx1ZSBmb3IgZHhfbWluIGFuZCBkeV9taW4gKi8KLQkqcF9keF9taW4gPSAweDdmZmZmZmZmOwotCSpwX2R5X21pbiAgPSAweDdmZmZmZmZmOwotCi0JZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBwX2ltYWdlLT5udW1jb21wczsgKytjb21wbm8pIHsKLQkJLyogYXJpdGhtZXRpYyB2YXJpYWJsZXMgdG8gY2FsY3VsYXRlICovCi0JCU9QSl9VSU5UMzIgbF9sZXZlbF9ubzsKLQkJT1BKX0lOVDMyIGxfcngwLCBsX3J5MCwgbF9yeDEsIGxfcnkxOwotCQlPUEpfSU5UMzIgbF9weDAsIGxfcHkwLCBsX3B4MSwgcHkxOwotCQlPUEpfVUlOVDMyIGxfcGR4LCBsX3BkeTsKLQkJT1BKX1VJTlQzMiBsX3B3LCBsX3BoOwotCQlPUEpfVUlOVDMyIGxfcHJvZHVjdDsKLQkJT1BKX0lOVDMyIGxfdGN4MCwgbF90Y3kwLCBsX3RjeDEsIGxfdGN5MTsKLQotCQlsX3RjeDAgPSBvcGpfaW50X2NlaWxkaXYoKnBfdHgwLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR4KTsKLQkJbF90Y3kwID0gb3BqX2ludF9jZWlsZGl2KCpwX3R5MCwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5keSk7Ci0JCWxfdGN4MSA9IG9wal9pbnRfY2VpbGRpdigqcF90eDEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHgpOwotCQlsX3RjeTEgPSBvcGpfaW50X2NlaWxkaXYoKnBfdHkxLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR5KTsKLQotCQlpZiAobF90Y2NwLT5udW1yZXNvbHV0aW9ucyA+ICpwX21heF9yZXMpIHsKLQkJCSpwX21heF9yZXMgPSBsX3RjY3AtPm51bXJlc29sdXRpb25zOwotCQl9Ci0KLQkJLyogdXNlIGN1c3RvbSBzaXplIGZvciBwcmVjaW5jdHMgKi8KLQkJZm9yIChyZXNubyA9IDA7IHJlc25vIDwgbF90Y2NwLT5udW1yZXNvbHV0aW9uczsgKytyZXNubykgewotCQkJT1BKX1VJTlQzMiBsX2R4LCBsX2R5OwotCi0JCQkvKiBwcmVjaW5jdCB3aWR0aCBhbmQgaGVpZ2h0ICovCi0JCQlsX3BkeCA9IGxfdGNjcC0+cHJjd1tyZXNub107Ci0JCQlsX3BkeSA9IGxfdGNjcC0+cHJjaFtyZXNub107Ci0KLQkJCWxfZHggPSBsX2ltZ19jb21wLT5keCAqICgxdSA8PCAobF9wZHggKyBsX3RjY3AtPm51bXJlc29sdXRpb25zIC0gMSAtIHJlc25vKSk7Ci0JCQlsX2R5ID0gbF9pbWdfY29tcC0+ZHkgKiAoMXUgPDwgKGxfcGR5ICsgbF90Y2NwLT5udW1yZXNvbHV0aW9ucyAtIDEgLSByZXNubykpOwotCi0JCQkvKiB0YWtlIHRoZSBtaW5pbXVtIHNpemUgZm9yIGR4IGZvciBlYWNoIGNvbXAgYW5kIHJlc29sdXRpb24gKi8KLQkJCSpwX2R4X21pbiA9IG9wal91aW50X21pbigqcF9keF9taW4sIGxfZHgpOwotCQkJKnBfZHlfbWluID0gb3BqX3VpbnRfbWluKCpwX2R5X21pbiwgbF9keSk7Ci0KLQkJCS8qIHZhcmlvdXMgY2FsY3VsYXRpb25zIG9mIGV4dGVudHMgKi8KLQkJCWxfbGV2ZWxfbm8gPSBsX3RjY3AtPm51bXJlc29sdXRpb25zIC0gMSAtIHJlc25vOwotCi0JCQlsX3J4MCA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF90Y3gwLCAoT1BKX0lOVDMyKWxfbGV2ZWxfbm8pOwotCQkJbF9yeTAgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGN5MCwgKE9QSl9JTlQzMilsX2xldmVsX25vKTsKLQkJCWxfcngxID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3RjeDEsIChPUEpfSU5UMzIpbF9sZXZlbF9ubyk7Ci0JCQlsX3J5MSA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF90Y3kxLCAoT1BKX0lOVDMyKWxfbGV2ZWxfbm8pOwotCi0JCQlsX3B4MCA9IG9wal9pbnRfZmxvb3JkaXZwb3cyKGxfcngwLCAoT1BKX0lOVDMyKWxfcGR4KSA8PCBsX3BkeDsKLQkJCWxfcHkwID0gb3BqX2ludF9mbG9vcmRpdnBvdzIobF9yeTAsIChPUEpfSU5UMzIpbF9wZHkpIDw8IGxfcGR5OwotCQkJbF9weDEgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfcngxLCAoT1BKX0lOVDMyKWxfcGR4KSA8PCBsX3BkeDsKLQotCQkJcHkxID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3J5MSwgKE9QSl9JTlQzMilsX3BkeSkgPDwgbF9wZHk7Ci0KLQkJCWxfcHcgPSAobF9yeDA9PWxfcngxKT8wOihPUEpfVUlOVDMyKSgobF9weDEgLSBsX3B4MCkgPj4gbF9wZHgpOwotCQkJbF9waCA9IChsX3J5MD09bF9yeTEpPzA6KE9QSl9VSU5UMzIpKChweTEgLSBsX3B5MCkgPj4gbF9wZHkpOwotCi0JCQlsX3Byb2R1Y3QgPSBsX3B3ICogbF9waDsKLQotCQkJLyogdXBkYXRlIHByZWNpc2lvbiAqLwotCQkJaWYgKGxfcHJvZHVjdCA+ICpwX21heF9wcmVjKSB7Ci0JCQkJKnBfbWF4X3ByZWMgPSBsX3Byb2R1Y3Q7Ci0JCQl9Ci0JCX0KLQkJKytsX2ltZ19jb21wOwotCQkrK2xfdGNjcDsKLQl9Ci19Ci0KLQotdm9pZCBvcGpfZ2V0X2FsbF9lbmNvZGluZ19wYXJhbWV0ZXJzKCAgIGNvbnN0IG9wal9pbWFnZV90ICpwX2ltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wal9jcF90ICpwX2NwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdGlsZW5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdHgwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdHgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdHkwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdHkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2R4X21pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9keV9taW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfbWF4X3ByZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfbWF4X3JlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICoqIHBfcmVzb2x1dGlvbnMgKQotewotCS8qIGxvb3AqLwotCU9QSl9VSU5UMzIgY29tcG5vLCByZXNubzsKLQotCS8qIHBvaW50ZXJzKi8KLQljb25zdCBvcGpfdGNwX3QgKnRjcCA9IDAwOwotCWNvbnN0IG9wal90Y2NwX3QgKiBsX3RjY3AgPSAwMDsKLQljb25zdCBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IDAwOwotCi0JLyogdG8gc3RvcmUgbF9keCwgbF9keSwgdyBhbmQgaCBmb3IgZWFjaCByZXNvbHV0aW9uIGFuZCBjb21wb25lbnQuKi8KLQlPUEpfVUlOVDMyICogbFJlc29sdXRpb25QdHI7Ci0KLQkvKiBwb3NpdGlvbiBpbiB4IGFuZCB5IG9mIHRpbGUqLwotCU9QSl9VSU5UMzIgcCwgcTsKLQotCS8qIG5vbi1jb3JyZWN0ZWQgKGluIHJlZ2FyZCB0byBpbWFnZSBvZmZzZXQpIHRpbGUgb2Zmc2V0ICovCi0JT1BKX1VJTlQzMiBsX3R4MCwgbF90eTA7Ci0KLQkvKiBwcmVjb25kaXRpb25zIGluIGRlYnVnKi8KLQlhc3NlcnQocF9jcCAhPSAwMCk7Ci0JYXNzZXJ0KHBfaW1hZ2UgIT0gMDApOwotCWFzc2VydCh0aWxlbm8gPCBwX2NwLT50dyAqIHBfY3AtPnRoKTsKLQotCS8qIGluaXRpYWxpemF0aW9ucyovCi0JdGNwID0gJnBfY3AtPnRjcHMgW3RpbGVub107Ci0JbF90Y2NwID0gdGNwLT50Y2NwczsKLQlsX2ltZ19jb21wID0gcF9pbWFnZS0+Y29tcHM7Ci0KLQkvKiBwb3NpdGlvbiBpbiB4IGFuZCB5IG9mIHRpbGUqLwotCXAgPSB0aWxlbm8gJSBwX2NwLT50dzsKLQlxID0gdGlsZW5vIC8gcF9jcC0+dHc7Ci0KLQkvKiBoZXJlIGNhbGN1bGF0aW9uIG9mIHR4MCwgdHgxLCB0eTAsIHR5MSwgbWF4cHJlYywgbF9keCBhbmQgbF9keSAqLwotCWxfdHgwID0gcF9jcC0+dHgwICsgcCAqIHBfY3AtPnRkeDsgLyogY2FuJ3QgYmUgZ3JlYXRlciB0aGFuIHBfaW1hZ2UtPngxIHNvIHdvbid0IG92ZXJmbG93ICovCi0JKnBfdHgwID0gKE9QSl9JTlQzMilvcGpfdWludF9tYXgobF90eDAsIHBfaW1hZ2UtPngwKTsKLQkqcF90eDEgPSAoT1BKX0lOVDMyKW9wal91aW50X21pbihvcGpfdWludF9hZGRzKGxfdHgwLCBwX2NwLT50ZHgpLCBwX2ltYWdlLT54MSk7Ci0JbF90eTAgPSBwX2NwLT50eTAgKyBxICogcF9jcC0+dGR5OyAvKiBjYW4ndCBiZSBncmVhdGVyIHRoYW4gcF9pbWFnZS0+eTEgc28gd29uJ3Qgb3ZlcmZsb3cgKi8KLQkqcF90eTAgPSAoT1BKX0lOVDMyKW9wal91aW50X21heChsX3R5MCwgcF9pbWFnZS0+eTApOwotCSpwX3R5MSA9IChPUEpfSU5UMzIpb3BqX3VpbnRfbWluKG9wal91aW50X2FkZHMobF90eTAsIHBfY3AtPnRkeSksIHBfaW1hZ2UtPnkxKTsKLQotCS8qIG1heCBwcmVjaXNpb24gYW5kIHJlc29sdXRpb24gaXMgMCAoY2FuIG9ubHkgZ3JvdykqLwotCSpwX21heF9wcmVjID0gMDsKLQkqcF9tYXhfcmVzID0gMDsKLQotCS8qIHRha2UgdGhlIGxhcmdlc3QgdmFsdWUgZm9yIGR4X21pbiBhbmQgZHlfbWluKi8KLQkqcF9keF9taW4gPSAweDdmZmZmZmZmOwotCSpwX2R5X21pbiA9IDB4N2ZmZmZmZmY7Ci0KLQlmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHBfaW1hZ2UtPm51bWNvbXBzOyArK2NvbXBubykgewotCQkvKiBhcml0bWV0aWMgdmFyaWFibGVzIHRvIGNhbGN1bGF0ZSovCi0JCU9QSl9VSU5UMzIgbF9sZXZlbF9ubzsKLQkJT1BKX0lOVDMyIGxfcngwLCBsX3J5MCwgbF9yeDEsIGxfcnkxOwotCQlPUEpfSU5UMzIgbF9weDAsIGxfcHkwLCBsX3B4MSwgcHkxOwotCQlPUEpfVUlOVDMyIGxfcHJvZHVjdDsKLQkJT1BKX0lOVDMyIGxfdGN4MCwgbF90Y3kwLCBsX3RjeDEsIGxfdGN5MTsKLQkJT1BKX1VJTlQzMiBsX3BkeCwgbF9wZHkgLCBsX3B3ICwgbF9waDsKLQotCQlsUmVzb2x1dGlvblB0ciA9IHBfcmVzb2x1dGlvbnNbY29tcG5vXTsKLQotCQlsX3RjeDAgPSBvcGpfaW50X2NlaWxkaXYoKnBfdHgwLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR4KTsKLQkJbF90Y3kwID0gb3BqX2ludF9jZWlsZGl2KCpwX3R5MCwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5keSk7Ci0JCWxfdGN4MSA9IG9wal9pbnRfY2VpbGRpdigqcF90eDEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHgpOwotCQlsX3RjeTEgPSBvcGpfaW50X2NlaWxkaXYoKnBfdHkxLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR5KTsKLQotCQlpZiAobF90Y2NwLT5udW1yZXNvbHV0aW9ucyA+ICpwX21heF9yZXMpIHsKLQkJCSpwX21heF9yZXMgPSBsX3RjY3AtPm51bXJlc29sdXRpb25zOwotCQl9Ci0KLQkJLyogdXNlIGN1c3RvbSBzaXplIGZvciBwcmVjaW5jdHMqLwotCQlsX2xldmVsX25vID0gbF90Y2NwLT5udW1yZXNvbHV0aW9ucyAtIDE7Ci0JCWZvciAocmVzbm8gPSAwOyByZXNubyA8IGxfdGNjcC0+bnVtcmVzb2x1dGlvbnM7ICsrcmVzbm8pIHsKLQkJCU9QSl9VSU5UMzIgbF9keCwgbF9keTsKLQotCQkJLyogcHJlY2luY3Qgd2lkdGggYW5kIGhlaWdodCovCi0JCQlsX3BkeCA9IGxfdGNjcC0+cHJjd1tyZXNub107Ci0JCQlsX3BkeSA9IGxfdGNjcC0+cHJjaFtyZXNub107Ci0JCQkqbFJlc29sdXRpb25QdHIrKyA9IGxfcGR4OwotCQkJKmxSZXNvbHV0aW9uUHRyKysgPSBsX3BkeTsKLQkJCWxfZHggPSBsX2ltZ19jb21wLT5keCAqICgxdSA8PCAobF9wZHggKyBsX2xldmVsX25vKSk7Ci0JCQlsX2R5ID0gbF9pbWdfY29tcC0+ZHkgKiAoMXUgPDwgKGxfcGR5ICsgbF9sZXZlbF9ubykpOwotCQkJLyogdGFrZSB0aGUgbWluaW11bSBzaXplIGZvciBsX2R4IGZvciBlYWNoIGNvbXAgYW5kIHJlc29sdXRpb24qLwotCQkJKnBfZHhfbWluID0gKE9QSl9VSU5UMzIpb3BqX2ludF9taW4oKE9QSl9JTlQzMikqcF9keF9taW4sIChPUEpfSU5UMzIpbF9keCk7Ci0JCQkqcF9keV9taW4gPSAoT1BKX1VJTlQzMilvcGpfaW50X21pbigoT1BKX0lOVDMyKSpwX2R5X21pbiwgKE9QSl9JTlQzMilsX2R5KTsKLQotCQkJLyogdmFyaW91cyBjYWxjdWxhdGlvbnMgb2YgZXh0ZW50cyovCi0JCQlsX3J4MCA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF90Y3gwLCAoT1BKX0lOVDMyKWxfbGV2ZWxfbm8pOwotCQkJbF9yeTAgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGN5MCwgKE9QSl9JTlQzMilsX2xldmVsX25vKTsKLQkJCWxfcngxID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3RjeDEsIChPUEpfSU5UMzIpbF9sZXZlbF9ubyk7Ci0JCQlsX3J5MSA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF90Y3kxLCAoT1BKX0lOVDMyKWxfbGV2ZWxfbm8pOwotCQkJbF9weDAgPSBvcGpfaW50X2Zsb29yZGl2cG93MihsX3J4MCwgKE9QSl9JTlQzMilsX3BkeCkgPDwgbF9wZHg7Ci0JCQlsX3B5MCA9IG9wal9pbnRfZmxvb3JkaXZwb3cyKGxfcnkwLCAoT1BKX0lOVDMyKWxfcGR5KSA8PCBsX3BkeTsKLQkJCWxfcHgxID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3J4MSwgKE9QSl9JTlQzMilsX3BkeCkgPDwgbF9wZHg7Ci0JCQlweTEgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfcnkxLCAoT1BKX0lOVDMyKWxfcGR5KSA8PCBsX3BkeTsKLQkJCWxfcHcgPSAobF9yeDA9PWxfcngxKT8wOihPUEpfVUlOVDMyKSgobF9weDEgLSBsX3B4MCkgPj4gbF9wZHgpOwotCQkJbF9waCA9IChsX3J5MD09bF9yeTEpPzA6KE9QSl9VSU5UMzIpKChweTEgLSBsX3B5MCkgPj4gbF9wZHkpOwotCQkJKmxSZXNvbHV0aW9uUHRyKysgPSBsX3B3OwotCQkJKmxSZXNvbHV0aW9uUHRyKysgPSBsX3BoOwotCQkJbF9wcm9kdWN0ID0gbF9wdyAqIGxfcGg7Ci0JCQkKLSAgICAgICAgICAgIC8qIHVwZGF0ZSBwcmVjaXNpb24qLwotCQkJaWYgKGxfcHJvZHVjdCA+ICpwX21heF9wcmVjKSB7Ci0JCQkJKnBfbWF4X3ByZWMgPSBsX3Byb2R1Y3Q7Ci0JCQl9Ci0KLQkJCS0tbF9sZXZlbF9ubzsKLQkJfQotCQkrK2xfdGNjcDsKLQkJKytsX2ltZ19jb21wOwotCX0KLX0KLQotb3BqX3BpX2l0ZXJhdG9yX3QgKiBvcGpfcGlfY3JlYXRlKAljb25zdCBvcGpfaW1hZ2VfdCAqaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGpfY3BfdCAqY3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHRpbGVubyApCi17Ci0JLyogbG9vcCovCi0JT1BKX1VJTlQzMiBwaW5vLCBjb21wbm87Ci0JLyogbnVtYmVyIG9mIHBvYyBpbiB0aGUgcF9waSovCi0JT1BKX1VJTlQzMiBsX3BvY19ib3VuZDsKLQotCS8qIHBvaW50ZXJzIHRvIHRpbGUgY29kaW5nIHBhcmFtZXRlcnMgYW5kIGNvbXBvbmVudHMuKi8KLQlvcGpfcGlfaXRlcmF0b3JfdCAqbF9waSA9IDAwOwotCW9wal90Y3BfdCAqdGNwID0gMDA7Ci0JY29uc3Qgb3BqX3RjY3BfdCAqdGNjcCA9IDAwOwotCi0JLyogY3VycmVudCBwYWNrZXQgaXRlcmF0b3IgYmVpbmcgYWxsb2NhdGVkKi8KLQlvcGpfcGlfaXRlcmF0b3JfdCAqbF9jdXJyZW50X3BpID0gMDA7Ci0KLQkvKiBwcmVjb25kaXRpb25zIGluIGRlYnVnKi8KLQlhc3NlcnQoY3AgIT0gMDApOwotCWFzc2VydChpbWFnZSAhPSAwMCk7Ci0JYXNzZXJ0KHRpbGVubyA8IGNwLT50dyAqIGNwLT50aCk7Ci0KLQkvKiBpbml0aWFsaXphdGlvbnMqLwotCXRjcCA9ICZjcC0+dGNwc1t0aWxlbm9dOwotCWxfcG9jX2JvdW5kID0gdGNwLT5udW1wb2NzKzE7Ci0KLQkvKiBtZW1vcnkgYWxsb2NhdGlvbnMqLwotCWxfcGkgPSAob3BqX3BpX2l0ZXJhdG9yX3QqKSBvcGpfY2FsbG9jKChsX3BvY19ib3VuZCksIHNpemVvZihvcGpfcGlfaXRlcmF0b3JfdCkpOwotCWlmICghbF9waSkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlsX2N1cnJlbnRfcGkgPSBsX3BpOwotCWZvciAocGlubyA9IDA7IHBpbm8gPCBsX3BvY19ib3VuZCA7ICsrcGlubykgewotCi0JCWxfY3VycmVudF9waS0+Y29tcHMgPSAob3BqX3BpX2NvbXBfdCopIG9wal9jYWxsb2MoaW1hZ2UtPm51bWNvbXBzLCBzaXplb2Yob3BqX3BpX2NvbXBfdCkpOwotCQlpZiAoISBsX2N1cnJlbnRfcGktPmNvbXBzKSB7Ci0JCQlvcGpfcGlfZGVzdHJveShsX3BpLCBsX3BvY19ib3VuZCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCi0JCWxfY3VycmVudF9waS0+bnVtY29tcHMgPSBpbWFnZS0+bnVtY29tcHM7Ci0KLQkJZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBpbWFnZS0+bnVtY29tcHM7ICsrY29tcG5vKSB7Ci0JCQlvcGpfcGlfY29tcF90ICpjb21wID0gJmxfY3VycmVudF9waS0+Y29tcHNbY29tcG5vXTsKLQotCQkJdGNjcCA9ICZ0Y3AtPnRjY3BzW2NvbXBub107Ci0KLQkJCWNvbXAtPnJlc29sdXRpb25zID0gKG9wal9waV9yZXNvbHV0aW9uX3QqKSBvcGpfY2FsbG9jKHRjY3AtPm51bXJlc29sdXRpb25zLCBzaXplb2Yob3BqX3BpX3Jlc29sdXRpb25fdCkpOwotCQkJaWYgKCFjb21wLT5yZXNvbHV0aW9ucykgewotCQkJCW9wal9waV9kZXN0cm95KGxfcGksIGxfcG9jX2JvdW5kKTsKLQkJCQlyZXR1cm4gMDA7Ci0JCQl9Ci0KLQkJCWNvbXAtPm51bXJlc29sdXRpb25zID0gdGNjcC0+bnVtcmVzb2x1dGlvbnM7Ci0JCX0KLQkJKytsX2N1cnJlbnRfcGk7Ci0JfQotCXJldHVybiBsX3BpOwotfQotCi12b2lkIG9wal9waV91cGRhdGVfZW5jb2RlX3BvY19hbmRfZmluYWwgKCAgIG9wal9jcF90ICpwX2NwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZW5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcF90eDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX3R4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfdHkwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcF90eTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfcHJlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9yZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9keF9taW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9keV9taW4pCi17Ci0JLyogbG9vcCovCi0JT1BKX1VJTlQzMiBwaW5vOwotCS8qIHRpbGUgY29kaW5nIHBhcmFtZXRlciovCi0Jb3BqX3RjcF90ICpsX3RjcCA9IDAwOwotCS8qIGN1cnJlbnQgcG9jIGJlaW5nIHVwZGF0ZWQqLwotCW9wal9wb2NfdCAqIGxfY3VycmVudF9wb2MgPSAwMDsKLQotCS8qIG51bWJlciBvZiBwb2NzKi8KLQlPUEpfVUlOVDMyIGxfcG9jX2JvdW5kOwotCi0gICAgT1BKX0FSR19OT1RfVVNFRChwX21heF9yZXMpOwotCi0JLyogcHJlY29uZGl0aW9ucyBpbiBkZWJ1ZyovCi0JYXNzZXJ0KHBfY3AgIT0gMDApOwotCWFzc2VydChwX3RpbGVubyA8IHBfY3AtPnR3ICogcF9jcC0+dGgpOwotCi0JLyogaW5pdGlhbGl6YXRpb25zKi8KLQlsX3RjcCA9ICZwX2NwLT50Y3BzIFtwX3RpbGVub107Ci0JLyogbnVtYmVyIG9mIGl0ZXJhdGlvbnMgaW4gdGhlIGxvb3AgKi8KLQlsX3BvY19ib3VuZCA9IGxfdGNwLT5udW1wb2NzKzE7Ci0KLQkvKiBzdGFydCBhdCBmaXJzdCBlbGVtZW50LCBhbmQgdG8gbWFrZSBzdXJlIHRoZSBjb21waWxlciB3aWxsIG5vdCBtYWtlIGEgY2FsY3VsYXRpb24gZWFjaCB0aW1lIGluIHRoZSBsb29wCi0JICAgc3RvcmUgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGVsZW1lbnQgdG8gbW9kaWZ5IHJhdGhlciB0aGFuIGxfdGNwLT5wb2NzW2ldKi8KLQlsX2N1cnJlbnRfcG9jID0gbF90Y3AtPnBvY3M7Ci0KLQlsX2N1cnJlbnRfcG9jLT5jb21wUyA9IGxfY3VycmVudF9wb2MtPmNvbXBubzA7Ci0JbF9jdXJyZW50X3BvYy0+Y29tcEUgPSBsX2N1cnJlbnRfcG9jLT5jb21wbm8xOwotCWxfY3VycmVudF9wb2MtPnJlc1MgPSBsX2N1cnJlbnRfcG9jLT5yZXNubzA7Ci0JbF9jdXJyZW50X3BvYy0+cmVzRSA9IGxfY3VycmVudF9wb2MtPnJlc25vMTsKLQlsX2N1cnJlbnRfcG9jLT5sYXlFID0gbF9jdXJyZW50X3BvYy0+bGF5bm8xOwotCi0JLyogc3BlY2lhbCB0cmVhdG1lbnQgZm9yIHRoZSBmaXJzdCBlbGVtZW50Ki8KLQlsX2N1cnJlbnRfcG9jLT5sYXlTID0gMDsKLQlsX2N1cnJlbnRfcG9jLT5wcmcgID0gbF9jdXJyZW50X3BvYy0+cHJnMTsKLQlsX2N1cnJlbnRfcG9jLT5wcmNTID0gMDsKLQotCWxfY3VycmVudF9wb2MtPnByY0UgPSBwX21heF9wcmVjOwotCWxfY3VycmVudF9wb2MtPnR4UyA9IChPUEpfVUlOVDMyKXBfdHgwOwotCWxfY3VycmVudF9wb2MtPnR4RSA9IChPUEpfVUlOVDMyKXBfdHgxOwotCWxfY3VycmVudF9wb2MtPnR5UyA9IChPUEpfVUlOVDMyKXBfdHkwOwotCWxfY3VycmVudF9wb2MtPnR5RSA9IChPUEpfVUlOVDMyKXBfdHkxOwotCWxfY3VycmVudF9wb2MtPmR4ID0gcF9keF9taW47Ci0JbF9jdXJyZW50X3BvYy0+ZHkgPSBwX2R5X21pbjsKLQotCSsrIGxfY3VycmVudF9wb2M7Ci0JZm9yIChwaW5vID0gMTtwaW5vIDwgbF9wb2NfYm91bmQgOyArK3Bpbm8pIHsKLQkJbF9jdXJyZW50X3BvYy0+Y29tcFMgPSBsX2N1cnJlbnRfcG9jLT5jb21wbm8wOwotCQlsX2N1cnJlbnRfcG9jLT5jb21wRT0gbF9jdXJyZW50X3BvYy0+Y29tcG5vMTsKLQkJbF9jdXJyZW50X3BvYy0+cmVzUyA9IGxfY3VycmVudF9wb2MtPnJlc25vMDsKLQkJbF9jdXJyZW50X3BvYy0+cmVzRSA9IGxfY3VycmVudF9wb2MtPnJlc25vMTsKLQkJbF9jdXJyZW50X3BvYy0+bGF5RSA9IGxfY3VycmVudF9wb2MtPmxheW5vMTsKLQkJbF9jdXJyZW50X3BvYy0+cHJnICA9IGxfY3VycmVudF9wb2MtPnByZzE7Ci0JCWxfY3VycmVudF9wb2MtPnByY1MgPSAwOwotCQkvKiBzcGVjaWFsIHRyZWF0bWVudCBoZXJlIGRpZmZlcmVudCBmcm9tIHRoZSBmaXJzdCBlbGVtZW50Ki8KLQkJbF9jdXJyZW50X3BvYy0+bGF5UyA9IChsX2N1cnJlbnRfcG9jLT5sYXlFID4gKGxfY3VycmVudF9wb2MtMSktPmxheUUpID8gbF9jdXJyZW50X3BvYy0+bGF5RSA6IDA7Ci0KLQkJbF9jdXJyZW50X3BvYy0+cHJjRSA9IHBfbWF4X3ByZWM7Ci0JCWxfY3VycmVudF9wb2MtPnR4UyA9IChPUEpfVUlOVDMyKXBfdHgwOwotCQlsX2N1cnJlbnRfcG9jLT50eEUgPSAoT1BKX1VJTlQzMilwX3R4MTsKLQkJbF9jdXJyZW50X3BvYy0+dHlTID0gKE9QSl9VSU5UMzIpcF90eTA7Ci0JCWxfY3VycmVudF9wb2MtPnR5RSA9IChPUEpfVUlOVDMyKXBfdHkxOwotCQlsX2N1cnJlbnRfcG9jLT5keCA9IHBfZHhfbWluOwotCQlsX2N1cnJlbnRfcG9jLT5keSA9IHBfZHlfbWluOwotCQkrKyBsX2N1cnJlbnRfcG9jOwotCX0KLX0KLQotdm9pZCBvcGpfcGlfdXBkYXRlX2VuY29kZV9ub3RfcG9jICgJb3BqX2NwX3QgKnBfY3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbnVtX2NvbXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX3R4MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX3R4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX3R5MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX3R5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfcHJlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfcmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2R4X21pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9keV9taW4pCi17Ci0JLyogbG9vcCovCi0JT1BKX1VJTlQzMiBwaW5vOwotCS8qIHRpbGUgY29kaW5nIHBhcmFtZXRlciovCi0Jb3BqX3RjcF90ICpsX3RjcCA9IDAwOwotCS8qIGN1cnJlbnQgcG9jIGJlaW5nIHVwZGF0ZWQqLwotCW9wal9wb2NfdCAqIGxfY3VycmVudF9wb2MgPSAwMDsKLQkvKiBudW1iZXIgb2YgcG9jcyovCi0JT1BKX1VJTlQzMiBsX3BvY19ib3VuZDsKLQotCS8qIHByZWNvbmRpdGlvbnMgaW4gZGVidWcqLwotCWFzc2VydChwX2NwICE9IDAwKTsKLQlhc3NlcnQocF90aWxlbm8gPCBwX2NwLT50dyAqIHBfY3AtPnRoKTsKLQotCS8qIGluaXRpYWxpemF0aW9ucyovCi0JbF90Y3AgPSAmcF9jcC0+dGNwcyBbcF90aWxlbm9dOwotCi0JLyogbnVtYmVyIG9mIGl0ZXJhdGlvbnMgaW4gdGhlIGxvb3AgKi8KLQlsX3BvY19ib3VuZCA9IGxfdGNwLT5udW1wb2NzKzE7Ci0KLQkvKiBzdGFydCBhdCBmaXJzdCBlbGVtZW50LCBhbmQgdG8gbWFrZSBzdXJlIHRoZSBjb21waWxlciB3aWxsIG5vdCBtYWtlIGEgY2FsY3VsYXRpb24gZWFjaCB0aW1lIGluIHRoZSBsb29wCi0JICAgc3RvcmUgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGVsZW1lbnQgdG8gbW9kaWZ5IHJhdGhlciB0aGFuIGxfdGNwLT5wb2NzW2ldKi8KLQlsX2N1cnJlbnRfcG9jID0gbF90Y3AtPnBvY3M7Ci0KLQlmb3IgKHBpbm8gPSAwOyBwaW5vIDwgbF9wb2NfYm91bmQgOyArK3Bpbm8pIHsKLQkJbF9jdXJyZW50X3BvYy0+Y29tcFMgPSAwOwotCQlsX2N1cnJlbnRfcG9jLT5jb21wRSA9IHBfbnVtX2NvbXBzOy8qcF9pbWFnZS0+bnVtY29tcHM7Ki8KLQkJbF9jdXJyZW50X3BvYy0+cmVzUyA9IDA7Ci0JCWxfY3VycmVudF9wb2MtPnJlc0UgPSBwX21heF9yZXM7Ci0JCWxfY3VycmVudF9wb2MtPmxheVMgPSAwOwotCQlsX2N1cnJlbnRfcG9jLT5sYXlFID0gbF90Y3AtPm51bWxheWVyczsKLQkJbF9jdXJyZW50X3BvYy0+cHJnICA9IGxfdGNwLT5wcmc7Ci0JCWxfY3VycmVudF9wb2MtPnByY1MgPSAwOwotCQlsX2N1cnJlbnRfcG9jLT5wcmNFID0gcF9tYXhfcHJlYzsKLQkJbF9jdXJyZW50X3BvYy0+dHhTID0gKE9QSl9VSU5UMzIpcF90eDA7Ci0JCWxfY3VycmVudF9wb2MtPnR4RSA9IChPUEpfVUlOVDMyKXBfdHgxOwotCQlsX2N1cnJlbnRfcG9jLT50eVMgPSAoT1BKX1VJTlQzMilwX3R5MDsKLQkJbF9jdXJyZW50X3BvYy0+dHlFID0gKE9QSl9VSU5UMzIpcF90eTE7Ci0JCWxfY3VycmVudF9wb2MtPmR4ID0gcF9keF9taW47Ci0JCWxfY3VycmVudF9wb2MtPmR5ID0gcF9keV9taW47Ci0JCSsrIGxfY3VycmVudF9wb2M7Ci0JfQotfQotCi12b2lkIG9wal9waV91cGRhdGVfZGVjb2RlX3BvYyAob3BqX3BpX2l0ZXJhdG9yX3QgKiBwX3BpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y3BfdCAqIHBfdGNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfcHJlY2lzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfcmVzKQotewotCS8qIGxvb3AqLwotCU9QSl9VSU5UMzIgcGlubzsKLQotCS8qIGVuY29kaW5nIHByYW1ldGVycyB0byBzZXQqLwotCU9QSl9VSU5UMzIgbF9ib3VuZDsKLQotCW9wal9waV9pdGVyYXRvcl90ICogbF9jdXJyZW50X3BpID0gMDA7Ci0Jb3BqX3BvY190KiBsX2N1cnJlbnRfcG9jID0gMDsKLQotICAgIE9QSl9BUkdfTk9UX1VTRUQocF9tYXhfcmVzKTsKLQotCS8qIHByZWNvbmRpdGlvbnMgaW4gZGVidWcqLwotCWFzc2VydChwX3BpICE9IDAwKTsKLQlhc3NlcnQocF90Y3AgIT0gMDApOwotCi0JLyogaW5pdGlhbGl6YXRpb25zKi8KLQlsX2JvdW5kID0gcF90Y3AtPm51bXBvY3MrMTsKLQlsX2N1cnJlbnRfcGkgPSBwX3BpOwotCWxfY3VycmVudF9wb2MgPSBwX3RjcC0+cG9jczsKLQotCWZvcgkocGlubyA9IDA7cGlubzxsX2JvdW5kOysrcGlubykgewotCQlsX2N1cnJlbnRfcGktPnBvYy5wcmcgPSBsX2N1cnJlbnRfcG9jLT5wcmc7IC8qIFByb2dyZXNzaW9uIE9yZGVyICMwICovCi0JCWxfY3VycmVudF9waS0+Zmlyc3QgPSAxOwotCi0JCWxfY3VycmVudF9waS0+cG9jLnJlc25vMCA9IGxfY3VycmVudF9wb2MtPnJlc25vMDsgLyogUmVzb2x1dGlvbiBMZXZlbCBJbmRleCAjMCAoU3RhcnQpICovCi0JCWxfY3VycmVudF9waS0+cG9jLmNvbXBubzAgPSBsX2N1cnJlbnRfcG9jLT5jb21wbm8wOyAvKiBDb21wb25lbnQgSW5kZXggIzAgKFN0YXJ0KSAqLwotCQlsX2N1cnJlbnRfcGktPnBvYy5sYXlubzAgPSAwOwotCQlsX2N1cnJlbnRfcGktPnBvYy5wcmVjbm8wID0gMDsKLQkJbF9jdXJyZW50X3BpLT5wb2MucmVzbm8xID0gbF9jdXJyZW50X3BvYy0+cmVzbm8xOyAvKiBSZXNvbHV0aW9uIExldmVsIEluZGV4ICMwIChFbmQpICovCi0JCWxfY3VycmVudF9waS0+cG9jLmNvbXBubzEgPSBsX2N1cnJlbnRfcG9jLT5jb21wbm8xOyAvKiBDb21wb25lbnQgSW5kZXggIzAgKEVuZCkgKi8KLQkJbF9jdXJyZW50X3BpLT5wb2MubGF5bm8xID0gbF9jdXJyZW50X3BvYy0+bGF5bm8xOyAvKiBMYXllciBJbmRleCAjMCAoRW5kKSAqLwotCQlsX2N1cnJlbnRfcGktPnBvYy5wcmVjbm8xID0gcF9tYXhfcHJlY2lzaW9uOwotCQkrK2xfY3VycmVudF9waTsKLQkJKytsX2N1cnJlbnRfcG9jOwotCX0KLX0KLQotdm9pZCBvcGpfcGlfdXBkYXRlX2RlY29kZV9ub3RfcG9jIChvcGpfcGlfaXRlcmF0b3JfdCAqIHBfcGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y3BfdCAqIHBfdGNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X3ByZWNpc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9yZXMpCi17Ci0JLyogbG9vcCovCi0JT1BKX1VJTlQzMiBwaW5vOwotCi0JLyogZW5jb2RpbmcgcHJhbWV0ZXJzIHRvIHNldCovCi0JT1BKX1VJTlQzMiBsX2JvdW5kOwotCi0Jb3BqX3BpX2l0ZXJhdG9yX3QgKiBsX2N1cnJlbnRfcGkgPSAwMDsKLQkvKiBwcmVjb25kaXRpb25zIGluIGRlYnVnKi8KLQlhc3NlcnQocF90Y3AgIT0gMDApOwotCWFzc2VydChwX3BpICE9IDAwKTsKLQotCS8qIGluaXRpYWxpemF0aW9ucyovCi0JbF9ib3VuZCA9IHBfdGNwLT5udW1wb2NzKzE7Ci0JbF9jdXJyZW50X3BpID0gcF9waTsKLQotCWZvciAocGlubyA9IDA7cGlubzxsX2JvdW5kOysrcGlubykgewotCQlsX2N1cnJlbnRfcGktPnBvYy5wcmcgPSBwX3RjcC0+cHJnOwotCQlsX2N1cnJlbnRfcGktPmZpcnN0ID0gMTsKLQkJbF9jdXJyZW50X3BpLT5wb2MucmVzbm8wID0gMDsKLQkJbF9jdXJyZW50X3BpLT5wb2MuY29tcG5vMCA9IDA7Ci0JCWxfY3VycmVudF9waS0+cG9jLmxheW5vMCA9IDA7Ci0JCWxfY3VycmVudF9waS0+cG9jLnByZWNubzAgPSAwOwotCQlsX2N1cnJlbnRfcGktPnBvYy5yZXNubzEgPSBwX21heF9yZXM7Ci0JCWxfY3VycmVudF9waS0+cG9jLmNvbXBubzEgPSBsX2N1cnJlbnRfcGktPm51bWNvbXBzOwotCQlsX2N1cnJlbnRfcGktPnBvYy5sYXlubzEgPSBwX3RjcC0+bnVtbGF5ZXJzOwotCQlsX2N1cnJlbnRfcGktPnBvYy5wcmVjbm8xID0gcF9tYXhfcHJlY2lzaW9uOwotCQkrK2xfY3VycmVudF9waTsKLQl9Ci19Ci0KLQotCi1PUEpfQk9PTCBvcGpfcGlfY2hlY2tfbmV4dF9sZXZlbCgJT1BKX0lOVDMyIHBvcywKLQkJCQkJCQkJb3BqX2NwX3QgKmNwLAotCQkJCQkJCQlPUEpfVUlOVDMyIHRpbGVubywKLQkJCQkJCQkJT1BKX1VJTlQzMiBwaW5vLAotCQkJCQkJCQljb25zdCBPUEpfQ0hBUiAqcHJvZykKLXsKLQlPUEpfSU5UMzIgaTsKLQlvcGpfdGNwX3QgKnRjcHMgPSZjcC0+dGNwc1t0aWxlbm9dOwotCW9wal9wb2NfdCAqdGNwID0gJnRjcHMtPnBvY3NbcGlub107Ci0KLQlpZihwb3M+PTApewotCQlmb3IoaT1wb3M7cG9zPj0wO2ktLSl7Ci0JCQlzd2l0Y2gocHJvZ1tpXSl7Ci0JCSAgICBjYXNlICdSJzoKLQkJCSAgICBpZih0Y3AtPnJlc190PT10Y3AtPnJlc0UpewotCQkJCSAgICBpZihvcGpfcGlfY2hlY2tfbmV4dF9sZXZlbChwb3MtMSxjcCx0aWxlbm8scGlubyxwcm9nKSl7Ci0JCQkJCSAgICByZXR1cm4gT1BKX1RSVUU7Ci0JCQkJICAgIH1lbHNlewotCQkJCQkgICAgcmV0dXJuIE9QSl9GQUxTRTsKLQkJCQkgICAgfQotCQkJICAgIH1lbHNlewotCQkJCSAgICByZXR1cm4gT1BKX1RSVUU7Ci0JCQkgICAgfQotCQkJICAgIGJyZWFrOwotCQkgICAgY2FzZSAnQyc6Ci0JCQkgICAgaWYodGNwLT5jb21wX3Q9PXRjcC0+Y29tcEUpewotCQkJCSAgICBpZihvcGpfcGlfY2hlY2tfbmV4dF9sZXZlbChwb3MtMSxjcCx0aWxlbm8scGlubyxwcm9nKSl7Ci0JCQkJCSAgICByZXR1cm4gT1BKX1RSVUU7Ci0JCQkJICAgIH1lbHNlewotCQkJCQkgICAgcmV0dXJuIE9QSl9GQUxTRTsKLQkJCQkgICAgfQotCQkJICAgIH1lbHNlewotCQkJCSAgICByZXR1cm4gT1BKX1RSVUU7Ci0JCQkgICAgfQotCQkJICAgIGJyZWFrOwotCQkgICAgY2FzZSAnTCc6Ci0JCQkgICAgaWYodGNwLT5sYXlfdD09dGNwLT5sYXlFKXsKLQkJCQkgICAgaWYob3BqX3BpX2NoZWNrX25leHRfbGV2ZWwocG9zLTEsY3AsdGlsZW5vLHBpbm8scHJvZykpewotCQkJCQkgICAgcmV0dXJuIE9QSl9UUlVFOwotCQkJCSAgICB9ZWxzZXsKLQkJCQkJICAgIHJldHVybiBPUEpfRkFMU0U7Ci0JCQkJICAgIH0KLQkJCSAgICB9ZWxzZXsKLQkJCQkgICAgcmV0dXJuIE9QSl9UUlVFOwotCQkJICAgIH0KLQkJCSAgICBicmVhazsKLQkJICAgIGNhc2UgJ1AnOgotCQkJICAgIHN3aXRjaCh0Y3AtPnByZyl7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgT1BKX0xSQ1A6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgICAgICAgICAgICBjYXNlIE9QSl9STENQOgotCQkJCQkgICAgaWYodGNwLT5wcmNfdCA9PSB0Y3AtPnByY0UpewotCQkJCQkJICAgIGlmKG9wal9waV9jaGVja19uZXh0X2xldmVsKGktMSxjcCx0aWxlbm8scGlubyxwcm9nKSl7Ci0JCQkJCQkJICAgIHJldHVybiBPUEpfVFJVRTsKLQkJCQkJCSAgICB9ZWxzZXsKLQkJCQkJCQkgICAgcmV0dXJuIE9QSl9GQUxTRTsKLQkJCQkJCSAgICB9Ci0JCQkJCSAgICB9ZWxzZXsKLQkJCQkJCSAgICByZXR1cm4gT1BKX1RSVUU7Ci0JCQkJCSAgICB9Ci0JCQkJCSAgICBicmVhazsKLQkJCSAgICBkZWZhdWx0OgotCQkJCSAgICBpZih0Y3AtPnR4MF90ID09IHRjcC0+dHhFKXsKLQkJCQkJICAgIC8qVFkqLwotCQkJCQkgICAgaWYodGNwLT50eTBfdCA9PSB0Y3AtPnR5RSl7Ci0JCQkJCQkgICAgaWYob3BqX3BpX2NoZWNrX25leHRfbGV2ZWwoaS0xLGNwLHRpbGVubyxwaW5vLHByb2cpKXsKLQkJCQkJCQkgICAgcmV0dXJuIE9QSl9UUlVFOwotCQkJCQkJICAgIH1lbHNlewotCQkJCQkJCSAgICByZXR1cm4gT1BKX0ZBTFNFOwotCQkJCQkJICAgIH0KLQkJCQkJICAgIH1lbHNlewotCQkJCQkJICAgIHJldHVybiBPUEpfVFJVRTsKLQkJCQkJICAgIH0vKlRZKi8KLQkJCQkgICAgfWVsc2V7Ci0JCQkJCSAgICByZXR1cm4gT1BKX1RSVUU7Ci0JCQkJICAgIH0KLQkJCQkgICAgYnJlYWs7Ci0JCQkgICAgfS8qZW5kIGNhc2UgUCovCi0JCSAgICB9LyplbmQgc3dpdGNoKi8KLQkJfS8qZW5kIGZvciovCi0JfS8qZW5kIGlmKi8KLQlyZXR1cm4gT1BKX0ZBTFNFOwotfQotCi0KLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBQYWNrZXQgaXRlcmF0b3IgaW50ZXJmYWNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotb3BqX3BpX2l0ZXJhdG9yX3QgKm9wal9waV9jcmVhdGVfZGVjb2RlKG9wal9pbWFnZV90ICpwX2ltYWdlLAotCQkJCQkJCQkJCW9wal9jcF90ICpwX2NwLAotCQkJCQkJCQkJCU9QSl9VSU5UMzIgcF90aWxlX25vKQotewotCS8qIGxvb3AgKi8KLQlPUEpfVUlOVDMyIHBpbm87Ci0JT1BKX1VJTlQzMiBjb21wbm8sIHJlc25vOwotCi0JLyogdG8gc3RvcmUgdywgaCwgZHggYW5kIGR5IGZybyBhbGwgY29tcG9uZW50cyBhbmQgcmVzb2x1dGlvbnMgKi8KLQlPUEpfVUlOVDMyICogbF90bXBfZGF0YTsKLQlPUEpfVUlOVDMyICoqIGxfdG1wX3B0cjsKLQotCS8qIGVuY29kaW5nIHByYW1ldGVycyB0byBzZXQgKi8KLQlPUEpfVUlOVDMyIGxfbWF4X3JlczsKLQlPUEpfVUlOVDMyIGxfbWF4X3ByZWM7Ci0JT1BKX0lOVDMyIGxfdHgwLGxfdHgxLGxfdHkwLGxfdHkxOwotCU9QSl9VSU5UMzIgbF9keF9taW4sbF9keV9taW47Ci0JT1BKX1VJTlQzMiBsX2JvdW5kOwotCU9QSl9VSU5UMzIgbF9zdGVwX3AgLCBsX3N0ZXBfYyAsIGxfc3RlcF9yICwgbF9zdGVwX2wgOwotCU9QSl9VSU5UMzIgbF9kYXRhX3N0cmlkZTsKLQotCS8qIHBvaW50ZXJzICovCi0Jb3BqX3BpX2l0ZXJhdG9yX3QgKmxfcGkgPSAwMDsKLQlvcGpfdGNwX3QgKmxfdGNwID0gMDA7Ci0JY29uc3Qgb3BqX3RjY3BfdCAqbF90Y2NwID0gMDA7Ci0Jb3BqX3BpX2NvbXBfdCAqbF9jdXJyZW50X2NvbXAgPSAwMDsKLQlvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IDAwOwotCW9wal9waV9pdGVyYXRvcl90ICogbF9jdXJyZW50X3BpID0gMDA7Ci0JT1BKX1VJTlQzMiAqIGxfZW5jb2RpbmdfdmFsdWVfcHRyID0gMDA7Ci0KLQkvKiBwcmVjb25kaXRpb25zIGluIGRlYnVnICovCi0JYXNzZXJ0KHBfY3AgIT0gMDApOwotCWFzc2VydChwX2ltYWdlICE9IDAwKTsKLQlhc3NlcnQocF90aWxlX25vIDwgcF9jcC0+dHcgKiBwX2NwLT50aCk7Ci0KLQkvKiBpbml0aWFsaXphdGlvbnMgKi8KLQlsX3RjcCA9ICZwX2NwLT50Y3BzW3BfdGlsZV9ub107Ci0JbF9ib3VuZCA9IGxfdGNwLT5udW1wb2NzKzE7Ci0KLQlsX2RhdGFfc3RyaWRlID0gNCAqIE9QSl9KMktfTUFYUkxWTFM7Ci0JbF90bXBfZGF0YSA9IChPUEpfVUlOVDMyKilvcGpfbWFsbG9jKAotCQlsX2RhdGFfc3RyaWRlICogcF9pbWFnZS0+bnVtY29tcHMgKiBzaXplb2YoT1BKX1VJTlQzMikpOwotCWlmCi0JCSghIGxfdG1wX2RhdGEpCi0JewotCQlyZXR1cm4gMDA7Ci0JfQotCWxfdG1wX3B0ciA9IChPUEpfVUlOVDMyKiopb3BqX21hbGxvYygKLQkJcF9pbWFnZS0+bnVtY29tcHMgKiBzaXplb2YoT1BKX1VJTlQzMiAqKSk7Ci0JaWYKLQkJKCEgbF90bXBfcHRyKQotCXsKLQkJb3BqX2ZyZWUobF90bXBfZGF0YSk7Ci0JCXJldHVybiAwMDsKLQl9Ci0KLQkvKiBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgcGkgKi8KLQlsX3BpID0gb3BqX3BpX2NyZWF0ZShwX2ltYWdlLCBwX2NwLCBwX3RpbGVfbm8pOwotCWlmICghbF9waSkgewotCQlvcGpfZnJlZShsX3RtcF9kYXRhKTsKLQkJb3BqX2ZyZWUobF90bXBfcHRyKTsKLQkJcmV0dXJuIDAwOwotCX0KLQotCWxfZW5jb2RpbmdfdmFsdWVfcHRyID0gbF90bXBfZGF0YTsKLQkvKiB1cGRhdGUgcG9pbnRlciBhcnJheSAqLwotCWZvcgotCQkoY29tcG5vID0gMDsgY29tcG5vIDwgcF9pbWFnZS0+bnVtY29tcHM7ICsrY29tcG5vKQotCXsKLQkJbF90bXBfcHRyW2NvbXBub10gPSBsX2VuY29kaW5nX3ZhbHVlX3B0cjsKLQkJbF9lbmNvZGluZ192YWx1ZV9wdHIgKz0gbF9kYXRhX3N0cmlkZTsKLQl9Ci0JLyogZ2V0IGVuY29kaW5nIHBhcmFtZXRlcnMgKi8KLQlvcGpfZ2V0X2FsbF9lbmNvZGluZ19wYXJhbWV0ZXJzKHBfaW1hZ2UscF9jcCxwX3RpbGVfbm8sJmxfdHgwLCZsX3R4MSwmbF90eTAsJmxfdHkxLCZsX2R4X21pbiwmbF9keV9taW4sJmxfbWF4X3ByZWMsJmxfbWF4X3JlcyxsX3RtcF9wdHIpOwotCi0JLyogc3RlcCBjYWxjdWxhdGlvbnMgKi8KLQlsX3N0ZXBfcCA9IDE7Ci0JbF9zdGVwX2MgPSBsX21heF9wcmVjICogbF9zdGVwX3A7Ci0JbF9zdGVwX3IgPSBwX2ltYWdlLT5udW1jb21wcyAqIGxfc3RlcF9jOwotCWxfc3RlcF9sID0gbF9tYXhfcmVzICogbF9zdGVwX3I7Ci0KLQkvKiBzZXQgdmFsdWVzIGZvciBmaXJzdCBwYWNrZXQgaXRlcmF0b3IgKi8KLQlsX2N1cnJlbnRfcGkgPSBsX3BpOwotCi0JLyogbWVtb3J5IGFsbG9jYXRpb24gZm9yIGluY2x1ZGUgKi8KLQlsX2N1cnJlbnRfcGktPmluY2x1ZGUgPSAoT1BKX0lOVDE2Kikgb3BqX2NhbGxvYygobF90Y3AtPm51bWxheWVycyArMSkgKiBsX3N0ZXBfbCwgc2l6ZW9mKE9QSl9JTlQxNikpOwotCWlmCi0JCSghbF9jdXJyZW50X3BpLT5pbmNsdWRlKQotCXsKLQkJb3BqX2ZyZWUobF90bXBfZGF0YSk7Ci0JCW9wal9mcmVlKGxfdG1wX3B0cik7Ci0JCW9wal9waV9kZXN0cm95KGxfcGksIGxfYm91bmQpOwotCQlyZXR1cm4gMDA7Ci0JfQotCi0JLyogc3BlY2lhbCB0cmVhdG1lbnQgZm9yIHRoZSBmaXJzdCBwYWNrZXQgaXRlcmF0b3IgKi8KLQlsX2N1cnJlbnRfY29tcCA9IGxfY3VycmVudF9waS0+Y29tcHM7Ci0JbF9pbWdfY29tcCA9IHBfaW1hZ2UtPmNvbXBzOwotCWxfdGNjcCA9IGxfdGNwLT50Y2NwczsKLQotCWxfY3VycmVudF9waS0+dHgwID0gbF90eDA7Ci0JbF9jdXJyZW50X3BpLT50eTAgPSBsX3R5MDsKLQlsX2N1cnJlbnRfcGktPnR4MSA9IGxfdHgxOwotCWxfY3VycmVudF9waS0+dHkxID0gbF90eTE7Ci0KLQkvKmxfY3VycmVudF9waS0+ZHggPSBsX2ltZ19jb21wLT5keDsqLwotCS8qbF9jdXJyZW50X3BpLT5keSA9IGxfaW1nX2NvbXAtPmR5OyovCi0KLQlsX2N1cnJlbnRfcGktPnN0ZXBfcCA9IGxfc3RlcF9wOwotCWxfY3VycmVudF9waS0+c3RlcF9jID0gbF9zdGVwX2M7Ci0JbF9jdXJyZW50X3BpLT5zdGVwX3IgPSBsX3N0ZXBfcjsKLQlsX2N1cnJlbnRfcGktPnN0ZXBfbCA9IGxfc3RlcF9sOwotCi0JLyogYWxsb2NhdGlvbiBmb3IgY29tcG9uZW50cyBhbmQgbnVtYmVyIG9mIGNvbXBvbmVudHMgaGFzIGFscmVhZHkgYmVlbiBjYWxjdWxhdGVkIGJ5IG9wal9waV9jcmVhdGUgKi8KLQlmb3IKLQkJKGNvbXBubyA9IDA7IGNvbXBubyA8IGxfY3VycmVudF9waS0+bnVtY29tcHM7ICsrY29tcG5vKQotCXsKLQkJb3BqX3BpX3Jlc29sdXRpb25fdCAqbF9yZXMgPSBsX2N1cnJlbnRfY29tcC0+cmVzb2x1dGlvbnM7Ci0JCWxfZW5jb2RpbmdfdmFsdWVfcHRyID0gbF90bXBfcHRyW2NvbXBub107Ci0KLQkJbF9jdXJyZW50X2NvbXAtPmR4ID0gbF9pbWdfY29tcC0+ZHg7Ci0JCWxfY3VycmVudF9jb21wLT5keSA9IGxfaW1nX2NvbXAtPmR5OwotCQkvKiByZXNvbHV0aW9ucyBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCAqLwotCQlmb3IKLQkJCShyZXNubyA9IDA7IHJlc25vIDwgbF9jdXJyZW50X2NvbXAtPm51bXJlc29sdXRpb25zOyByZXNubysrKQotCQl7Ci0JCQlsX3Jlcy0+cGR4ID0gKihsX2VuY29kaW5nX3ZhbHVlX3B0cisrKTsKLQkJCWxfcmVzLT5wZHkgPSAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOwotCQkJbF9yZXMtPnB3ID0gICoobF9lbmNvZGluZ192YWx1ZV9wdHIrKyk7Ci0JCQlsX3Jlcy0+cGggPSAgKihsX2VuY29kaW5nX3ZhbHVlX3B0cisrKTsKLQkJCSsrbF9yZXM7Ci0JCX0KLQkJKytsX2N1cnJlbnRfY29tcDsKLQkJKytsX2ltZ19jb21wOwotCQkrK2xfdGNjcDsKLQl9Ci0JKytsX2N1cnJlbnRfcGk7Ci0KLQlmb3IgKHBpbm8gPSAxIDsgcGlubzxsX2JvdW5kIDsgKytwaW5vICkKLQl7Ci0JCWxfY3VycmVudF9jb21wID0gbF9jdXJyZW50X3BpLT5jb21wczsKLQkJbF9pbWdfY29tcCA9IHBfaW1hZ2UtPmNvbXBzOwotCQlsX3RjY3AgPSBsX3RjcC0+dGNjcHM7Ci0KLQkJbF9jdXJyZW50X3BpLT50eDAgPSBsX3R4MDsKLQkJbF9jdXJyZW50X3BpLT50eTAgPSBsX3R5MDsKLQkJbF9jdXJyZW50X3BpLT50eDEgPSBsX3R4MTsKLQkJbF9jdXJyZW50X3BpLT50eTEgPSBsX3R5MTsKLQkJLypsX2N1cnJlbnRfcGktPmR4ID0gbF9keF9taW47Ki8KLQkJLypsX2N1cnJlbnRfcGktPmR5ID0gbF9keV9taW47Ki8KLQkJbF9jdXJyZW50X3BpLT5zdGVwX3AgPSBsX3N0ZXBfcDsKLQkJbF9jdXJyZW50X3BpLT5zdGVwX2MgPSBsX3N0ZXBfYzsKLQkJbF9jdXJyZW50X3BpLT5zdGVwX3IgPSBsX3N0ZXBfcjsKLQkJbF9jdXJyZW50X3BpLT5zdGVwX2wgPSBsX3N0ZXBfbDsKLQotCQkvKiBhbGxvY2F0aW9uIGZvciBjb21wb25lbnRzIGFuZCBudW1iZXIgb2YgY29tcG9uZW50cyBoYXMgYWxyZWFkeSBiZWVuIGNhbGN1bGF0ZWQgYnkgb3BqX3BpX2NyZWF0ZSAqLwotCQlmb3IKLQkJCShjb21wbm8gPSAwOyBjb21wbm8gPCBsX2N1cnJlbnRfcGktPm51bWNvbXBzOyArK2NvbXBubykKLQkJewotCQkJb3BqX3BpX3Jlc29sdXRpb25fdCAqbF9yZXMgPSBsX2N1cnJlbnRfY29tcC0+cmVzb2x1dGlvbnM7Ci0JCQlsX2VuY29kaW5nX3ZhbHVlX3B0ciA9IGxfdG1wX3B0cltjb21wbm9dOwotCi0JCQlsX2N1cnJlbnRfY29tcC0+ZHggPSBsX2ltZ19jb21wLT5keDsKLQkJCWxfY3VycmVudF9jb21wLT5keSA9IGxfaW1nX2NvbXAtPmR5OwotCQkJLyogcmVzb2x1dGlvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgKi8KLQkJCWZvcgotCQkJCShyZXNubyA9IDA7IHJlc25vIDwgbF9jdXJyZW50X2NvbXAtPm51bXJlc29sdXRpb25zOyByZXNubysrKQotCQkJewotCQkJCWxfcmVzLT5wZHggPSAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOwotCQkJCWxfcmVzLT5wZHkgPSAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOwotCQkJCWxfcmVzLT5wdyA9ICAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOwotCQkJCWxfcmVzLT5waCA9ICAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOwotCQkJCSsrbF9yZXM7Ci0JCQl9Ci0JCQkrK2xfY3VycmVudF9jb21wOwotCQkJKytsX2ltZ19jb21wOwotCQkJKytsX3RjY3A7Ci0JCX0KLQkJLyogc3BlY2lhbCB0cmVhdG1lbnQqLwotCQlsX2N1cnJlbnRfcGktPmluY2x1ZGUgPSAobF9jdXJyZW50X3BpLTEpLT5pbmNsdWRlOwotCQkrK2xfY3VycmVudF9waTsKLQl9Ci0Jb3BqX2ZyZWUobF90bXBfZGF0YSk7Ci0JbF90bXBfZGF0YSA9IDAwOwotCW9wal9mcmVlKGxfdG1wX3B0cik7Ci0JbF90bXBfcHRyID0gMDA7Ci0JaWYKLQkJKGxfdGNwLT5QT0MpCi0JewotCQlvcGpfcGlfdXBkYXRlX2RlY29kZV9wb2MgKGxfcGksbF90Y3AsbF9tYXhfcHJlYyxsX21heF9yZXMpOwotCX0KLQllbHNlCi0JewotCQlvcGpfcGlfdXBkYXRlX2RlY29kZV9ub3RfcG9jKGxfcGksbF90Y3AsbF9tYXhfcHJlYyxsX21heF9yZXMpOwotCX0KLQlyZXR1cm4gbF9waTsKLX0KLQotCi0KLW9wal9waV9pdGVyYXRvcl90ICpvcGpfcGlfaW5pdGlhbGlzZV9lbmNvZGUoY29uc3Qgb3BqX2ltYWdlX3QgKnBfaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jcF90ICpwX2NwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9ubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSjJLX1QyX01PREUgcF90Ml9tb2RlICkKLXsKLQkvKiBsb29wKi8KLQlPUEpfVUlOVDMyIHBpbm87Ci0JT1BKX1VJTlQzMiBjb21wbm8sIHJlc25vOwotCi0JLyogdG8gc3RvcmUgdywgaCwgZHggYW5kIGR5IGZybyBhbGwgY29tcG9uZW50cyBhbmQgcmVzb2x1dGlvbnMqLwotCU9QSl9VSU5UMzIgKiBsX3RtcF9kYXRhOwotCU9QSl9VSU5UMzIgKiogbF90bXBfcHRyOwotCi0JLyogZW5jb2RpbmcgcHJhbWV0ZXJzIHRvIHNldCovCi0JT1BKX1VJTlQzMiBsX21heF9yZXM7Ci0JT1BKX1VJTlQzMiBsX21heF9wcmVjOwotCU9QSl9JTlQzMiBsX3R4MCxsX3R4MSxsX3R5MCxsX3R5MTsKLQlPUEpfVUlOVDMyIGxfZHhfbWluLGxfZHlfbWluOwotCU9QSl9VSU5UMzIgbF9ib3VuZDsKLQlPUEpfVUlOVDMyIGxfc3RlcF9wICwgbF9zdGVwX2MgLCBsX3N0ZXBfciAsIGxfc3RlcF9sIDsKLQlPUEpfVUlOVDMyIGxfZGF0YV9zdHJpZGU7Ci0KLQkvKiBwb2ludGVycyovCi0Jb3BqX3BpX2l0ZXJhdG9yX3QgKmxfcGkgPSAwMDsKLQlvcGpfdGNwX3QgKmxfdGNwID0gMDA7Ci0JY29uc3Qgb3BqX3RjY3BfdCAqbF90Y2NwID0gMDA7Ci0Jb3BqX3BpX2NvbXBfdCAqbF9jdXJyZW50X2NvbXAgPSAwMDsKLQlvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IDAwOwotCW9wal9waV9pdGVyYXRvcl90ICogbF9jdXJyZW50X3BpID0gMDA7Ci0JT1BKX1VJTlQzMiAqIGxfZW5jb2RpbmdfdmFsdWVfcHRyID0gMDA7Ci0KLQkvKiBwcmVjb25kaXRpb25zIGluIGRlYnVnKi8KLQlhc3NlcnQocF9jcCAhPSAwMCk7Ci0JYXNzZXJ0KHBfaW1hZ2UgIT0gMDApOwotCWFzc2VydChwX3RpbGVfbm8gPCBwX2NwLT50dyAqIHBfY3AtPnRoKTsKLQotCS8qIGluaXRpYWxpemF0aW9ucyovCi0JbF90Y3AgPSAmcF9jcC0+dGNwc1twX3RpbGVfbm9dOwotCWxfYm91bmQgPSBsX3RjcC0+bnVtcG9jcysxOwotCi0JbF9kYXRhX3N0cmlkZSA9IDQgKiBPUEpfSjJLX01BWFJMVkxTOwotCWxfdG1wX2RhdGEgPSAoT1BKX1VJTlQzMiopb3BqX21hbGxvYygKLQkJbF9kYXRhX3N0cmlkZSAqIHBfaW1hZ2UtPm51bWNvbXBzICogc2l6ZW9mKE9QSl9VSU5UMzIpKTsKLQlpZiAoISBsX3RtcF9kYXRhKSB7Ci0JCXJldHVybiAwMDsKLQl9Ci0KLQlsX3RtcF9wdHIgPSAoT1BKX1VJTlQzMioqKW9wal9tYWxsb2MoCi0JCXBfaW1hZ2UtPm51bWNvbXBzICogc2l6ZW9mKE9QSl9VSU5UMzIgKikpOwotCWlmICghIGxfdG1wX3B0cikgewotCQlvcGpfZnJlZShsX3RtcF9kYXRhKTsKLQkJcmV0dXJuIDAwOwotCX0KLQotCS8qIG1lbW9yeSBhbGxvY2F0aW9uIGZvciBwaSovCi0JbF9waSA9IG9wal9waV9jcmVhdGUocF9pbWFnZSxwX2NwLHBfdGlsZV9ubyk7Ci0JaWYgKCFsX3BpKSB7Ci0JCW9wal9mcmVlKGxfdG1wX2RhdGEpOwotCQlvcGpfZnJlZShsX3RtcF9wdHIpOwotCQlyZXR1cm4gMDA7Ci0JfQotCi0JbF9lbmNvZGluZ192YWx1ZV9wdHIgPSBsX3RtcF9kYXRhOwotCS8qIHVwZGF0ZSBwb2ludGVyIGFycmF5Ki8KLQlmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHBfaW1hZ2UtPm51bWNvbXBzOyArK2NvbXBubykgewotCQlsX3RtcF9wdHJbY29tcG5vXSA9IGxfZW5jb2RpbmdfdmFsdWVfcHRyOwotCQlsX2VuY29kaW5nX3ZhbHVlX3B0ciArPSBsX2RhdGFfc3RyaWRlOwotCX0KLQotCS8qIGdldCBlbmNvZGluZyBwYXJhbWV0ZXJzKi8KLQlvcGpfZ2V0X2FsbF9lbmNvZGluZ19wYXJhbWV0ZXJzKHBfaW1hZ2UscF9jcCxwX3RpbGVfbm8sJmxfdHgwLCZsX3R4MSwmbF90eTAsJmxfdHkxLCZsX2R4X21pbiwmbF9keV9taW4sJmxfbWF4X3ByZWMsJmxfbWF4X3JlcyxsX3RtcF9wdHIpOwotCi0JLyogc3RlcCBjYWxjdWxhdGlvbnMqLwotCWxfc3RlcF9wID0gMTsKLQlsX3N0ZXBfYyA9IGxfbWF4X3ByZWMgKiBsX3N0ZXBfcDsKLQlsX3N0ZXBfciA9IHBfaW1hZ2UtPm51bWNvbXBzICogbF9zdGVwX2M7Ci0JbF9zdGVwX2wgPSBsX21heF9yZXMgKiBsX3N0ZXBfcjsKLQotCS8qIHNldCB2YWx1ZXMgZm9yIGZpcnN0IHBhY2tldCBpdGVyYXRvciovCi0JbF9waS0+dHBfb24gPSBwX2NwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fdHBfb247Ci0JbF9jdXJyZW50X3BpID0gbF9waTsKLQotCS8qIG1lbW9yeSBhbGxvY2F0aW9uIGZvciBpbmNsdWRlKi8KLQlsX2N1cnJlbnRfcGktPmluY2x1ZGUgPSAoT1BKX0lOVDE2Kikgb3BqX2NhbGxvYyhsX3RjcC0+bnVtbGF5ZXJzICogbF9zdGVwX2wsIHNpemVvZihPUEpfSU5UMTYpKTsKLQlpZiAoIWxfY3VycmVudF9waS0+aW5jbHVkZSkgewotCQlvcGpfZnJlZShsX3RtcF9kYXRhKTsKLQkJb3BqX2ZyZWUobF90bXBfcHRyKTsKLQkJb3BqX3BpX2Rlc3Ryb3kobF9waSwgbF9ib3VuZCk7Ci0JCXJldHVybiAwMDsKLQl9Ci0KLQkvKiBzcGVjaWFsIHRyZWF0bWVudCBmb3IgdGhlIGZpcnN0IHBhY2tldCBpdGVyYXRvciovCi0JbF9jdXJyZW50X2NvbXAgPSBsX2N1cnJlbnRfcGktPmNvbXBzOwotCWxfaW1nX2NvbXAgPSBwX2ltYWdlLT5jb21wczsKLQlsX3RjY3AgPSBsX3RjcC0+dGNjcHM7Ci0JbF9jdXJyZW50X3BpLT50eDAgPSBsX3R4MDsKLQlsX2N1cnJlbnRfcGktPnR5MCA9IGxfdHkwOwotCWxfY3VycmVudF9waS0+dHgxID0gbF90eDE7Ci0JbF9jdXJyZW50X3BpLT50eTEgPSBsX3R5MTsKLQlsX2N1cnJlbnRfcGktPmR4ID0gbF9keF9taW47Ci0JbF9jdXJyZW50X3BpLT5keSA9IGxfZHlfbWluOwotCWxfY3VycmVudF9waS0+c3RlcF9wID0gbF9zdGVwX3A7Ci0JbF9jdXJyZW50X3BpLT5zdGVwX2MgPSBsX3N0ZXBfYzsKLQlsX2N1cnJlbnRfcGktPnN0ZXBfciA9IGxfc3RlcF9yOwotCWxfY3VycmVudF9waS0+c3RlcF9sID0gbF9zdGVwX2w7Ci0KLQkvKiBhbGxvY2F0aW9uIGZvciBjb21wb25lbnRzIGFuZCBudW1iZXIgb2YgY29tcG9uZW50cyBoYXMgYWxyZWFkeSBiZWVuIGNhbGN1bGF0ZWQgYnkgb3BqX3BpX2NyZWF0ZSAqLwotCWZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgbF9jdXJyZW50X3BpLT5udW1jb21wczsgKytjb21wbm8pIHsKLQkJb3BqX3BpX3Jlc29sdXRpb25fdCAqbF9yZXMgPSBsX2N1cnJlbnRfY29tcC0+cmVzb2x1dGlvbnM7Ci0JCWxfZW5jb2RpbmdfdmFsdWVfcHRyID0gbF90bXBfcHRyW2NvbXBub107Ci0KLQkJbF9jdXJyZW50X2NvbXAtPmR4ID0gbF9pbWdfY29tcC0+ZHg7Ci0JCWxfY3VycmVudF9jb21wLT5keSA9IGxfaW1nX2NvbXAtPmR5OwotCi0JCS8qIHJlc29sdXRpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkICovCi0JCWZvciAocmVzbm8gPSAwOyByZXNubyA8IGxfY3VycmVudF9jb21wLT5udW1yZXNvbHV0aW9uczsgcmVzbm8rKykgewotCQkJbF9yZXMtPnBkeCA9ICoobF9lbmNvZGluZ192YWx1ZV9wdHIrKyk7Ci0JCQlsX3Jlcy0+cGR5ID0gKihsX2VuY29kaW5nX3ZhbHVlX3B0cisrKTsKLQkJCWxfcmVzLT5wdyA9ICAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOwotCQkJbF9yZXMtPnBoID0gICoobF9lbmNvZGluZ192YWx1ZV9wdHIrKyk7Ci0JCQkrK2xfcmVzOwotCQl9Ci0KLQkJKytsX2N1cnJlbnRfY29tcDsKLQkJKytsX2ltZ19jb21wOwotCQkrK2xfdGNjcDsKLQl9Ci0JKytsX2N1cnJlbnRfcGk7Ci0KLQlmb3IgKHBpbm8gPSAxIDsgcGlubzxsX2JvdW5kIDsgKytwaW5vICkgewotCQlsX2N1cnJlbnRfY29tcCA9IGxfY3VycmVudF9waS0+Y29tcHM7Ci0JCWxfaW1nX2NvbXAgPSBwX2ltYWdlLT5jb21wczsKLQkJbF90Y2NwID0gbF90Y3AtPnRjY3BzOwotCi0JCWxfY3VycmVudF9waS0+dHgwID0gbF90eDA7Ci0JCWxfY3VycmVudF9waS0+dHkwID0gbF90eTA7Ci0JCWxfY3VycmVudF9waS0+dHgxID0gbF90eDE7Ci0JCWxfY3VycmVudF9waS0+dHkxID0gbF90eTE7Ci0JCWxfY3VycmVudF9waS0+ZHggPSBsX2R4X21pbjsKLQkJbF9jdXJyZW50X3BpLT5keSA9IGxfZHlfbWluOwotCQlsX2N1cnJlbnRfcGktPnN0ZXBfcCA9IGxfc3RlcF9wOwotCQlsX2N1cnJlbnRfcGktPnN0ZXBfYyA9IGxfc3RlcF9jOwotCQlsX2N1cnJlbnRfcGktPnN0ZXBfciA9IGxfc3RlcF9yOwotCQlsX2N1cnJlbnRfcGktPnN0ZXBfbCA9IGxfc3RlcF9sOwotCi0JCS8qIGFsbG9jYXRpb24gZm9yIGNvbXBvbmVudHMgYW5kIG51bWJlciBvZiBjb21wb25lbnRzIGhhcyBhbHJlYWR5IGJlZW4gY2FsY3VsYXRlZCBieSBvcGpfcGlfY3JlYXRlICovCi0JCWZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgbF9jdXJyZW50X3BpLT5udW1jb21wczsgKytjb21wbm8pIHsKLQkJCW9wal9waV9yZXNvbHV0aW9uX3QgKmxfcmVzID0gbF9jdXJyZW50X2NvbXAtPnJlc29sdXRpb25zOwotCQkJbF9lbmNvZGluZ192YWx1ZV9wdHIgPSBsX3RtcF9wdHJbY29tcG5vXTsKLQotCQkJbF9jdXJyZW50X2NvbXAtPmR4ID0gbF9pbWdfY29tcC0+ZHg7Ci0JCQlsX2N1cnJlbnRfY29tcC0+ZHkgPSBsX2ltZ19jb21wLT5keTsKLQkJCS8qIHJlc29sdXRpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkICovCi0JCQlmb3IgKHJlc25vID0gMDsgcmVzbm8gPCBsX2N1cnJlbnRfY29tcC0+bnVtcmVzb2x1dGlvbnM7IHJlc25vKyspIHsKLQkJCQlsX3Jlcy0+cGR4ID0gKihsX2VuY29kaW5nX3ZhbHVlX3B0cisrKTsKLQkJCQlsX3Jlcy0+cGR5ID0gKihsX2VuY29kaW5nX3ZhbHVlX3B0cisrKTsKLQkJCQlsX3Jlcy0+cHcgPSAgKihsX2VuY29kaW5nX3ZhbHVlX3B0cisrKTsKLQkJCQlsX3Jlcy0+cGggPSAgKihsX2VuY29kaW5nX3ZhbHVlX3B0cisrKTsKLQkJCQkrK2xfcmVzOwotCQkJfQotCQkJKytsX2N1cnJlbnRfY29tcDsKLQkJCSsrbF9pbWdfY29tcDsKLQkJCSsrbF90Y2NwOwotCQl9Ci0KLQkJLyogc3BlY2lhbCB0cmVhdG1lbnQqLwotCQlsX2N1cnJlbnRfcGktPmluY2x1ZGUgPSAobF9jdXJyZW50X3BpLTEpLT5pbmNsdWRlOwotCQkrK2xfY3VycmVudF9waTsKLQl9Ci0KLQlvcGpfZnJlZShsX3RtcF9kYXRhKTsKLQlsX3RtcF9kYXRhID0gMDA7Ci0Jb3BqX2ZyZWUobF90bXBfcHRyKTsKLQlsX3RtcF9wdHIgPSAwMDsKLQotICAgIGlmIChsX3RjcC0+UE9DICYmIChPUEpfSVNfQ0lORU1BKHBfY3AtPnJzaXopIHx8IHBfdDJfbW9kZSA9PSBGSU5BTF9QQVNTKSkgewotCQlvcGpfcGlfdXBkYXRlX2VuY29kZV9wb2NfYW5kX2ZpbmFsKHBfY3AscF90aWxlX25vLGxfdHgwLGxfdHgxLGxfdHkwLGxfdHkxLGxfbWF4X3ByZWMsbF9tYXhfcmVzLGxfZHhfbWluLGxfZHlfbWluKTsKLQl9Ci0JZWxzZSB7Ci0JCW9wal9waV91cGRhdGVfZW5jb2RlX25vdF9wb2MocF9jcCxwX2ltYWdlLT5udW1jb21wcyxwX3RpbGVfbm8sbF90eDAsbF90eDEsbF90eTAsbF90eTEsbF9tYXhfcHJlYyxsX21heF9yZXMsbF9keF9taW4sbF9keV9taW4pOwotCX0KLQotCXJldHVybiBsX3BpOwotfQotCi12b2lkIG9wal9waV9jcmVhdGVfZW5jb2RlKCAJb3BqX3BpX2l0ZXJhdG9yX3QgKnBpLAotCQkJCQkJCW9wal9jcF90ICpjcCwKLQkJCQkJCQlPUEpfVUlOVDMyIHRpbGVubywKLQkJCQkJCQlPUEpfVUlOVDMyIHBpbm8sCi0JCQkJCQkJT1BKX1VJTlQzMiB0cG51bSwKLQkJCQkJCQlPUEpfSU5UMzIgdHBwb3MsCi0JCQkJCQkJSjJLX1QyX01PREUgdDJfbW9kZSkKLXsKLQljb25zdCBPUEpfQ0hBUiAqcHJvZzsKLQlPUEpfSU5UMzIgaTsKLQlPUEpfVUlOVDMyIGluY3JfdG9wPTEscmVzZXRYPTA7Ci0Jb3BqX3RjcF90ICp0Y3BzID0mY3AtPnRjcHNbdGlsZW5vXTsKLQlvcGpfcG9jX3QgKnRjcD0gJnRjcHMtPnBvY3NbcGlub107Ci0KLQlwcm9nID0gb3BqX2oya19jb252ZXJ0X3Byb2dyZXNzaW9uX29yZGVyKHRjcC0+cHJnKTsKLQotCXBpW3Bpbm9dLmZpcnN0ID0gMTsKLQlwaVtwaW5vXS5wb2MucHJnID0gdGNwLT5wcmc7Ci0KLSAgICBpZighKGNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fdHBfb24gJiYgKCghT1BKX0lTX0NJTkVNQShjcC0+cnNpeikgJiYgKHQyX21vZGUgPT0gRklOQUxfUEFTUykpIHx8IE9QSl9JU19DSU5FTUEoY3AtPnJzaXopKSkpewotCQlwaVtwaW5vXS5wb2MucmVzbm8wID0gdGNwLT5yZXNTOwotCQlwaVtwaW5vXS5wb2MucmVzbm8xID0gdGNwLT5yZXNFOwotCQlwaVtwaW5vXS5wb2MuY29tcG5vMCA9IHRjcC0+Y29tcFM7Ci0JCXBpW3Bpbm9dLnBvYy5jb21wbm8xID0gdGNwLT5jb21wRTsKLQkJcGlbcGlub10ucG9jLmxheW5vMCA9IHRjcC0+bGF5UzsKLQkJcGlbcGlub10ucG9jLmxheW5vMSA9IHRjcC0+bGF5RTsKLQkJcGlbcGlub10ucG9jLnByZWNubzAgPSB0Y3AtPnByY1M7Ci0JCXBpW3Bpbm9dLnBvYy5wcmVjbm8xID0gdGNwLT5wcmNFOwotCQlwaVtwaW5vXS5wb2MudHgwID0gKE9QSl9JTlQzMil0Y3AtPnR4UzsKLQkJcGlbcGlub10ucG9jLnR5MCA9IChPUEpfSU5UMzIpdGNwLT50eVM7Ci0JCXBpW3Bpbm9dLnBvYy50eDEgPSAoT1BKX0lOVDMyKXRjcC0+dHhFOwotCQlwaVtwaW5vXS5wb2MudHkxID0gKE9QSl9JTlQzMil0Y3AtPnR5RTsKLQl9ZWxzZSB7Ci0JCWZvcihpPXRwcG9zKzE7aTw0O2krKyl7Ci0JCQlzd2l0Y2gocHJvZ1tpXSl7Ci0JCQljYXNlICdSJzoKLQkJCQlwaVtwaW5vXS5wb2MucmVzbm8wID0gdGNwLT5yZXNTOwotCQkJCXBpW3Bpbm9dLnBvYy5yZXNubzEgPSB0Y3AtPnJlc0U7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdDJzoKLQkJCQlwaVtwaW5vXS5wb2MuY29tcG5vMCA9IHRjcC0+Y29tcFM7Ci0JCQkJcGlbcGlub10ucG9jLmNvbXBubzEgPSB0Y3AtPmNvbXBFOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnTCc6Ci0JCQkJcGlbcGlub10ucG9jLmxheW5vMCA9IHRjcC0+bGF5UzsKLQkJCQlwaVtwaW5vXS5wb2MubGF5bm8xID0gdGNwLT5sYXlFOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnUCc6Ci0JCQkJc3dpdGNoKHRjcC0+cHJnKXsKLQkJCQljYXNlIE9QSl9MUkNQOgotCQkJCWNhc2UgT1BKX1JMQ1A6Ci0JCQkJCXBpW3Bpbm9dLnBvYy5wcmVjbm8wID0gdGNwLT5wcmNTOwotCQkJCQlwaVtwaW5vXS5wb2MucHJlY25vMSA9IHRjcC0+cHJjRTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcGlbcGlub10ucG9jLnR4MCA9IChPUEpfSU5UMzIpdGNwLT50eFM7Ci0JCQkJCXBpW3Bpbm9dLnBvYy50eTAgPSAoT1BKX0lOVDMyKXRjcC0+dHlTOwotCQkJCQlwaVtwaW5vXS5wb2MudHgxID0gKE9QSl9JTlQzMil0Y3AtPnR4RTsKLQkJCQkJcGlbcGlub10ucG9jLnR5MSA9IChPUEpfSU5UMzIpdGNwLT50eUU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmKHRwbnVtPT0wKXsKLQkJCWZvcihpPXRwcG9zO2k+PTA7aS0tKXsKLQkJCQlzd2l0Y2gocHJvZ1tpXSl7Ci0JCQkJY2FzZSAnQyc6Ci0JCQkJCXRjcC0+Y29tcF90ID0gdGNwLT5jb21wUzsKLQkJCQkJcGlbcGlub10ucG9jLmNvbXBubzAgPSB0Y3AtPmNvbXBfdDsKLQkJCQkJcGlbcGlub10ucG9jLmNvbXBubzEgPSB0Y3AtPmNvbXBfdCsxOwotCQkJCQl0Y3AtPmNvbXBfdCs9MTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnUic6Ci0JCQkJCXRjcC0+cmVzX3QgPSB0Y3AtPnJlc1M7Ci0JCQkJCXBpW3Bpbm9dLnBvYy5yZXNubzAgPSB0Y3AtPnJlc190OwotCQkJCQlwaVtwaW5vXS5wb2MucmVzbm8xID0gdGNwLT5yZXNfdCsxOwotCQkJCQl0Y3AtPnJlc190Kz0xOwotCQkJCQlicmVhazsKLQkJCQljYXNlICdMJzoKLQkJCQkJdGNwLT5sYXlfdCA9IHRjcC0+bGF5UzsKLQkJCQkJcGlbcGlub10ucG9jLmxheW5vMCA9IHRjcC0+bGF5X3Q7Ci0JCQkJCXBpW3Bpbm9dLnBvYy5sYXlubzEgPSB0Y3AtPmxheV90KzE7Ci0JCQkJCXRjcC0+bGF5X3QrPTE7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1AnOgotCQkJCQlzd2l0Y2godGNwLT5wcmcpewotCQkJCQljYXNlIE9QSl9MUkNQOgotCQkJCQljYXNlIE9QSl9STENQOgotCQkJCQkJdGNwLT5wcmNfdCA9IHRjcC0+cHJjUzsKLQkJCQkJCXBpW3Bpbm9dLnBvYy5wcmVjbm8wID0gdGNwLT5wcmNfdDsKLQkJCQkJCXBpW3Bpbm9dLnBvYy5wcmVjbm8xID0gdGNwLT5wcmNfdCsxOwotCQkJCQkJdGNwLT5wcmNfdCs9MTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJdGNwLT50eDBfdCA9IHRjcC0+dHhTOwotCQkJCQkJdGNwLT50eTBfdCA9IHRjcC0+dHlTOwotCQkJCQkJcGlbcGlub10ucG9jLnR4MCA9IChPUEpfSU5UMzIpdGNwLT50eDBfdDsKLQkJCQkJCXBpW3Bpbm9dLnBvYy50eDEgPSAoT1BKX0lOVDMyKSh0Y3AtPnR4MF90ICsgdGNwLT5keCAtICh0Y3AtPnR4MF90ICUgdGNwLT5keCkpOwotCQkJCQkJcGlbcGlub10ucG9jLnR5MCA9IChPUEpfSU5UMzIpdGNwLT50eTBfdDsKLQkJCQkJCXBpW3Bpbm9dLnBvYy50eTEgPSAoT1BKX0lOVDMyKSh0Y3AtPnR5MF90ICsgdGNwLT5keSAtICh0Y3AtPnR5MF90ICUgdGNwLT5keSkpOwotCQkJCQkJdGNwLT50eDBfdCA9IChPUEpfVUlOVDMyKXBpW3Bpbm9dLnBvYy50eDE7Ci0JCQkJCQl0Y3AtPnR5MF90ID0gKE9QSl9VSU5UMzIpcGlbcGlub10ucG9jLnR5MTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWluY3JfdG9wPTE7Ci0JCX1lbHNlewotCQkJZm9yKGk9dHBwb3M7aT49MDtpLS0pewotCQkJCXN3aXRjaChwcm9nW2ldKXsKLQkJCQljYXNlICdDJzoKLQkJCQkJcGlbcGlub10ucG9jLmNvbXBubzAgPSB0Y3AtPmNvbXBfdC0xOwotCQkJCQlwaVtwaW5vXS5wb2MuY29tcG5vMSA9IHRjcC0+Y29tcF90OwotCQkJCQlicmVhazsKLQkJCQljYXNlICdSJzoKLQkJCQkJcGlbcGlub10ucG9jLnJlc25vMCA9IHRjcC0+cmVzX3QtMTsKLQkJCQkJcGlbcGlub10ucG9jLnJlc25vMSA9IHRjcC0+cmVzX3Q7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ0wnOgotCQkJCQlwaVtwaW5vXS5wb2MubGF5bm8wID0gdGNwLT5sYXlfdC0xOwotCQkJCQlwaVtwaW5vXS5wb2MubGF5bm8xID0gdGNwLT5sYXlfdDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnUCc6Ci0JCQkJCXN3aXRjaCh0Y3AtPnByZyl7Ci0JCQkJCWNhc2UgT1BKX0xSQ1A6Ci0JCQkJCWNhc2UgT1BKX1JMQ1A6Ci0JCQkJCQlwaVtwaW5vXS5wb2MucHJlY25vMCA9IHRjcC0+cHJjX3QtMTsKLQkJCQkJCXBpW3Bpbm9dLnBvYy5wcmVjbm8xID0gdGNwLT5wcmNfdDsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJcGlbcGlub10ucG9jLnR4MCA9IChPUEpfSU5UMzIpKHRjcC0+dHgwX3QgLSB0Y3AtPmR4IC0gKHRjcC0+dHgwX3QgJSB0Y3AtPmR4KSk7Ci0JCQkJCQlwaVtwaW5vXS5wb2MudHgxID0gKE9QSl9JTlQzMil0Y3AtPnR4MF90IDsKLQkJCQkJCXBpW3Bpbm9dLnBvYy50eTAgPSAoT1BKX0lOVDMyKSh0Y3AtPnR5MF90IC0gdGNwLT5keSAtICh0Y3AtPnR5MF90ICUgdGNwLT5keSkpOwotCQkJCQkJcGlbcGlub10ucG9jLnR5MSA9IChPUEpfSU5UMzIpdGNwLT50eTBfdCA7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYoaW5jcl90b3A9PTEpewotCQkJCQlzd2l0Y2gocHJvZ1tpXSl7Ci0JCQkJCWNhc2UgJ1InOgotCQkJCQkJaWYodGNwLT5yZXNfdD09dGNwLT5yZXNFKXsKLQkJCQkJCQlpZihvcGpfcGlfY2hlY2tfbmV4dF9sZXZlbChpLTEsY3AsdGlsZW5vLHBpbm8scHJvZykpewotCQkJCQkJCQl0Y3AtPnJlc190ID0gdGNwLT5yZXNTOwotCQkJCQkJCQlwaVtwaW5vXS5wb2MucmVzbm8wID0gdGNwLT5yZXNfdDsKLQkJCQkJCQkJcGlbcGlub10ucG9jLnJlc25vMSA9IHRjcC0+cmVzX3QrMTsKLQkJCQkJCQkJdGNwLT5yZXNfdCs9MTsKLQkJCQkJCQkJaW5jcl90b3A9MTsKLQkJCQkJCQl9ZWxzZXsKLQkJCQkJCQkJaW5jcl90b3A9MDsKLQkJCQkJCQl9Ci0JCQkJCQl9ZWxzZXsKLQkJCQkJCQlwaVtwaW5vXS5wb2MucmVzbm8wID0gdGNwLT5yZXNfdDsKLQkJCQkJCQlwaVtwaW5vXS5wb2MucmVzbm8xID0gdGNwLT5yZXNfdCsxOwotCQkJCQkJCXRjcC0+cmVzX3QrPTE7Ci0JCQkJCQkJaW5jcl90b3A9MDsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlICdDJzoKLQkJCQkJCWlmKHRjcC0+Y29tcF90ID09dGNwLT5jb21wRSl7Ci0JCQkJCQkJaWYob3BqX3BpX2NoZWNrX25leHRfbGV2ZWwoaS0xLGNwLHRpbGVubyxwaW5vLHByb2cpKXsKLQkJCQkJCQkJdGNwLT5jb21wX3QgPSB0Y3AtPmNvbXBTOwotCQkJCQkJCQlwaVtwaW5vXS5wb2MuY29tcG5vMCA9IHRjcC0+Y29tcF90OwotCQkJCQkJCQlwaVtwaW5vXS5wb2MuY29tcG5vMSA9IHRjcC0+Y29tcF90KzE7Ci0JCQkJCQkJCXRjcC0+Y29tcF90Kz0xOwotCQkJCQkJCQlpbmNyX3RvcD0xOwotCQkJCQkJCX1lbHNlewotCQkJCQkJCQlpbmNyX3RvcD0wOwotCQkJCQkJCX0KLQkJCQkJCX1lbHNlewotCQkJCQkJCXBpW3Bpbm9dLnBvYy5jb21wbm8wID0gdGNwLT5jb21wX3Q7Ci0JCQkJCQkJcGlbcGlub10ucG9jLmNvbXBubzEgPSB0Y3AtPmNvbXBfdCsxOwotCQkJCQkJCXRjcC0+Y29tcF90Kz0xOwotCQkJCQkJCWluY3JfdG9wPTA7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAnTCc6Ci0JCQkJCQlpZih0Y3AtPmxheV90ID09IHRjcC0+bGF5RSl7Ci0JCQkJCQkJaWYob3BqX3BpX2NoZWNrX25leHRfbGV2ZWwoaS0xLGNwLHRpbGVubyxwaW5vLHByb2cpKXsKLQkJCQkJCQkJdGNwLT5sYXlfdCA9IHRjcC0+bGF5UzsKLQkJCQkJCQkJcGlbcGlub10ucG9jLmxheW5vMCA9IHRjcC0+bGF5X3Q7Ci0JCQkJCQkJCXBpW3Bpbm9dLnBvYy5sYXlubzEgPSB0Y3AtPmxheV90KzE7Ci0JCQkJCQkJCXRjcC0+bGF5X3QrPTE7Ci0JCQkJCQkJCWluY3JfdG9wPTE7Ci0JCQkJCQkJfWVsc2V7Ci0JCQkJCQkJCWluY3JfdG9wPTA7Ci0JCQkJCQkJfQotCQkJCQkJfWVsc2V7Ci0JCQkJCQkJcGlbcGlub10ucG9jLmxheW5vMCA9IHRjcC0+bGF5X3Q7Ci0JCQkJCQkJcGlbcGlub10ucG9jLmxheW5vMSA9IHRjcC0+bGF5X3QrMTsKLQkJCQkJCQl0Y3AtPmxheV90Kz0xOwotCQkJCQkJCWluY3JfdG9wPTA7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAnUCc6Ci0JCQkJCQlzd2l0Y2godGNwLT5wcmcpewotCQkJCQkJY2FzZSBPUEpfTFJDUDoKLQkJCQkJCWNhc2UgT1BKX1JMQ1A6Ci0JCQkJCQkJaWYodGNwLT5wcmNfdCA9PSB0Y3AtPnByY0UpewotCQkJCQkJCQlpZihvcGpfcGlfY2hlY2tfbmV4dF9sZXZlbChpLTEsY3AsdGlsZW5vLHBpbm8scHJvZykpewotCQkJCQkJCQkJdGNwLT5wcmNfdCA9IHRjcC0+cHJjUzsKLQkJCQkJCQkJCXBpW3Bpbm9dLnBvYy5wcmVjbm8wID0gdGNwLT5wcmNfdDsKLQkJCQkJCQkJCXBpW3Bpbm9dLnBvYy5wcmVjbm8xID0gdGNwLT5wcmNfdCsxOwotCQkJCQkJCQkJdGNwLT5wcmNfdCs9MTsKLQkJCQkJCQkJCWluY3JfdG9wPTE7Ci0JCQkJCQkJCX1lbHNlewotCQkJCQkJCQkJaW5jcl90b3A9MDsKLQkJCQkJCQkJfQotCQkJCQkJCX1lbHNlewotCQkJCQkJCQlwaVtwaW5vXS5wb2MucHJlY25vMCA9IHRjcC0+cHJjX3Q7Ci0JCQkJCQkJCXBpW3Bpbm9dLnBvYy5wcmVjbm8xID0gdGNwLT5wcmNfdCsxOwotCQkJCQkJCQl0Y3AtPnByY190Kz0xOwotCQkJCQkJCQlpbmNyX3RvcD0wOwotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJaWYodGNwLT50eDBfdCA+PSB0Y3AtPnR4RSl7Ci0JCQkJCQkJCWlmKHRjcC0+dHkwX3QgPj0gdGNwLT50eUUpewotCQkJCQkJCQkJaWYob3BqX3BpX2NoZWNrX25leHRfbGV2ZWwoaS0xLGNwLHRpbGVubyxwaW5vLHByb2cpKXsKLQkJCQkJCQkJCQl0Y3AtPnR5MF90ID0gdGNwLT50eVM7Ci0JCQkJCQkJCQkJcGlbcGlub10ucG9jLnR5MCA9IChPUEpfSU5UMzIpdGNwLT50eTBfdDsKLQkJCQkJCQkJCQlwaVtwaW5vXS5wb2MudHkxID0gKE9QSl9JTlQzMikodGNwLT50eTBfdCArIHRjcC0+ZHkgLSAodGNwLT50eTBfdCAlIHRjcC0+ZHkpKTsKLQkJCQkJCQkJCQl0Y3AtPnR5MF90ID0gKE9QSl9VSU5UMzIpcGlbcGlub10ucG9jLnR5MTsKLQkJCQkJCQkJCQlpbmNyX3RvcD0xO3Jlc2V0WD0xOwotCQkJCQkJCQkJfWVsc2V7Ci0JCQkJCQkJCQkJaW5jcl90b3A9MDtyZXNldFg9MDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfWVsc2V7Ci0JCQkJCQkJCQlwaVtwaW5vXS5wb2MudHkwID0gKE9QSl9JTlQzMil0Y3AtPnR5MF90OwotCQkJCQkJCQkJcGlbcGlub10ucG9jLnR5MSA9IChPUEpfSU5UMzIpKHRjcC0+dHkwX3QgKyB0Y3AtPmR5IC0gKHRjcC0+dHkwX3QgJSB0Y3AtPmR5KSk7Ci0JCQkJCQkJCQl0Y3AtPnR5MF90ID0gKE9QSl9VSU5UMzIpcGlbcGlub10ucG9jLnR5MTsKLQkJCQkJCQkJCWluY3JfdG9wPTA7cmVzZXRYPTE7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYocmVzZXRYPT0xKXsKLQkJCQkJCQkJCXRjcC0+dHgwX3QgPSB0Y3AtPnR4UzsKLQkJCQkJCQkJCXBpW3Bpbm9dLnBvYy50eDAgPSAoT1BKX0lOVDMyKXRjcC0+dHgwX3Q7Ci0JCQkJCQkJCQlwaVtwaW5vXS5wb2MudHgxID0gKE9QSl9JTlQzMikodGNwLT50eDBfdCArIHRjcC0+ZHgtICh0Y3AtPnR4MF90ICUgdGNwLT5keCkpOwotCQkJCQkJCQkJdGNwLT50eDBfdCA9IChPUEpfVUlOVDMyKXBpW3Bpbm9dLnBvYy50eDE7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9ZWxzZXsKLQkJCQkJCQkJcGlbcGlub10ucG9jLnR4MCA9IChPUEpfSU5UMzIpdGNwLT50eDBfdDsKLQkJCQkJCQkJcGlbcGlub10ucG9jLnR4MSA9IChPUEpfSU5UMzIpKHRjcC0+dHgwX3QgKyB0Y3AtPmR4LSAodGNwLT50eDBfdCAlIHRjcC0+ZHgpKTsKLQkJCQkJCQkJdGNwLT50eDBfdCA9IChPUEpfVUlOVDMyKXBpW3Bpbm9dLnBvYy50eDE7Ci0JCQkJCQkJCWluY3JfdG9wPTA7Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgb3BqX3BpX2Rlc3Ryb3kob3BqX3BpX2l0ZXJhdG9yX3QgKnBfcGksCi0gICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9uYl9lbGVtZW50cykKLXsKLQlPUEpfVUlOVDMyIGNvbXBubywgcGlubzsKLQlvcGpfcGlfaXRlcmF0b3JfdCAqbF9jdXJyZW50X3BpID0gcF9waTsKLSAgICBpZiAocF9waSkgewotCQlpZiAocF9waS0+aW5jbHVkZSkgewotCQkJb3BqX2ZyZWUocF9waS0+aW5jbHVkZSk7Ci0JCQlwX3BpLT5pbmNsdWRlID0gMDA7Ci0JCX0KLQkJZm9yIChwaW5vID0gMDsgcGlubyA8IHBfbmJfZWxlbWVudHM7ICsrcGlubyl7Ci0JCQlpZihsX2N1cnJlbnRfcGktPmNvbXBzKSB7Ci0JCQkJb3BqX3BpX2NvbXBfdCAqbF9jdXJyZW50X2NvbXBvbmVudCA9IGxfY3VycmVudF9waS0+Y29tcHM7Ci0gICAgICAgICAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBsX2N1cnJlbnRfcGktPm51bWNvbXBzOyBjb21wbm8rKyl7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxfY3VycmVudF9jb21wb25lbnQtPnJlc29sdXRpb25zKSB7Ci0JCQkJCQlvcGpfZnJlZShsX2N1cnJlbnRfY29tcG9uZW50LT5yZXNvbHV0aW9ucyk7Ci0JCQkJCQlsX2N1cnJlbnRfY29tcG9uZW50LT5yZXNvbHV0aW9ucyA9IDAwOwotCQkJCQl9Ci0KLQkJCQkJKytsX2N1cnJlbnRfY29tcG9uZW50OwotCQkJCX0KLQkJCQlvcGpfZnJlZShsX2N1cnJlbnRfcGktPmNvbXBzKTsKLQkJCQlsX2N1cnJlbnRfcGktPmNvbXBzID0gMDsKLQkJCX0KLQkJCSsrbF9jdXJyZW50X3BpOwotCQl9Ci0JCW9wal9mcmVlKHBfcGkpOwotCX0KLX0KLQotCi0KLXZvaWQgb3BqX3BpX3VwZGF0ZV9lbmNvZGluZ19wYXJhbWV0ZXJzKAljb25zdCBvcGpfaW1hZ2VfdCAqcF9pbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY3BfdCAqcF9jcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9ubyApCi17Ci0JLyogZW5jb2RpbmcgcGFyYW1ldGVycyB0byBzZXQgKi8KLQlPUEpfVUlOVDMyIGxfbWF4X3JlczsKLQlPUEpfVUlOVDMyIGxfbWF4X3ByZWM7Ci0JT1BKX0lOVDMyIGxfdHgwLGxfdHgxLGxfdHkwLGxfdHkxOwotCU9QSl9VSU5UMzIgbF9keF9taW4sbF9keV9taW47Ci0KLQkvKiBwb2ludGVycyAqLwotCW9wal90Y3BfdCAqbF90Y3AgPSAwMDsKLQotCS8qIHByZWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQocF9jcCAhPSAwMCk7Ci0JYXNzZXJ0KHBfaW1hZ2UgIT0gMDApOwotCWFzc2VydChwX3RpbGVfbm8gPCBwX2NwLT50dyAqIHBfY3AtPnRoKTsKLQotCWxfdGNwID0gJihwX2NwLT50Y3BzW3BfdGlsZV9ub10pOwotCi0JLyogZ2V0IGVuY29kaW5nIHBhcmFtZXRlcnMgKi8KLQlvcGpfZ2V0X2VuY29kaW5nX3BhcmFtZXRlcnMocF9pbWFnZSxwX2NwLHBfdGlsZV9ubywmbF90eDAsJmxfdHgxLCZsX3R5MCwmbF90eTEsJmxfZHhfbWluLCZsX2R5X21pbiwmbF9tYXhfcHJlYywmbF9tYXhfcmVzKTsKLQotCWlmIChsX3RjcC0+UE9DKSB7Ci0JCW9wal9waV91cGRhdGVfZW5jb2RlX3BvY19hbmRfZmluYWwocF9jcCxwX3RpbGVfbm8sbF90eDAsbF90eDEsbF90eTAsbF90eTEsbF9tYXhfcHJlYyxsX21heF9yZXMsbF9keF9taW4sbF9keV9taW4pOwotCX0KLQllbHNlIHsKLQkJb3BqX3BpX3VwZGF0ZV9lbmNvZGVfbm90X3BvYyhwX2NwLHBfaW1hZ2UtPm51bWNvbXBzLHBfdGlsZV9ubyxsX3R4MCxsX3R4MSxsX3R5MCxsX3R5MSxsX21heF9wcmVjLGxfbWF4X3JlcyxsX2R4X21pbixsX2R5X21pbik7Ci0JfQotfQotCi1PUEpfQk9PTCBvcGpfcGlfbmV4dChvcGpfcGlfaXRlcmF0b3JfdCAqIHBpKSB7Ci0Jc3dpdGNoIChwaS0+cG9jLnByZykgewotCQljYXNlIE9QSl9MUkNQOgotCQkJcmV0dXJuIG9wal9waV9uZXh0X2xyY3AocGkpOwotCQljYXNlIE9QSl9STENQOgotCQkJcmV0dXJuIG9wal9waV9uZXh0X3JsY3AocGkpOwotCQljYXNlIE9QSl9SUENMOgotCQkJcmV0dXJuIG9wal9waV9uZXh0X3JwY2wocGkpOwotCQljYXNlIE9QSl9QQ1JMOgotCQkJcmV0dXJuIG9wal9waV9uZXh0X3BjcmwocGkpOwotCQljYXNlIE9QSl9DUFJMOgotCQkJcmV0dXJuIG9wal9waV9uZXh0X2NwcmwocGkpOwotCQljYXNlIE9QSl9QUk9HX1VOS05PV046Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQkKLQlyZXR1cm4gT1BKX0ZBTFNFOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL3BpLmggYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIzOTY3OS4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCi0gKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCi0gKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFVuaXZlcnNpdGUgY2F0aG9saXF1ZSBkZSBMb3V2YWluIChVQ0wpLCBCZWxnaXVtCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQotICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKLSAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX19QSV9ICi0jZGVmaW5lIF9fUElfSAotLyoqCi1AZmlsZSBwaS5oCi1AYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYSBwYWNrZXQgaXRlcmF0b3IgKFBJKQotCi1UaGUgZnVuY3Rpb25zIGluIFBJLkMgaGF2ZSBmb3IgZ29hbCB0byByZWFsaXplIGEgcGFja2V0IGl0ZXJhdG9yIHRoYXQgcGVybWl0cyB0byBnZXQgdGhlIG5leHQKLXBhY2tldCBmb2xsb3dpbmcgdGhlIHByb2dyZXNzaW9uIG9yZGVyIGFuZCBjaGFuZ2Ugb2YgaXQuIFRoZSBmdW5jdGlvbnMgaW4gUEkuQyBhcmUgdXNlZAotYnkgc29tZSBmdW5jdGlvbiBpbiBUMi5DLgotKi8KLQotLyoqIEBkZWZncm91cCBQSSBQSSAtIEltcGxlbWVudGF0aW9uIG9mIGEgcGFja2V0IGl0ZXJhdG9yICovCi0vKkB7Ki8KLQotLyoqCi1GSVhNRSBET0MKLSovCi10eXBlZGVmIHN0cnVjdCBvcGpfcGlfcmVzb2x1dGlvbiB7Ci0gIE9QSl9VSU5UMzIgcGR4LCBwZHk7Ci0gIE9QSl9VSU5UMzIgcHcsIHBoOwotfSBvcGpfcGlfcmVzb2x1dGlvbl90OwotCi0vKioKLUZJWE1FIERPQwotKi8KLXR5cGVkZWYgc3RydWN0IG9wal9waV9jb21wIHsKLSAgT1BKX1VJTlQzMiBkeCwgZHk7Ci0gIC8qKiBudW1iZXIgb2YgcmVzb2x1dGlvbiBsZXZlbHMgKi8KLSAgT1BKX1VJTlQzMiBudW1yZXNvbHV0aW9uczsKLSAgb3BqX3BpX3Jlc29sdXRpb25fdCAqcmVzb2x1dGlvbnM7Ci19IG9wal9waV9jb21wX3Q7Ci0KLS8qKgotUGFja2V0IGl0ZXJhdG9yCi0qLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX3BpX2l0ZXJhdG9yIHsKLSAgLyoqIEVuYWJsaW5nIFRpbGUgcGFydCBnZW5lcmF0aW9uKi8KLSAgT1BKX0JZVEUgdHBfb247Ci0gIC8qKiBwcmVjaXNlIGlmIHRoZSBwYWNrZXQgaGFzIGJlZW4gYWxyZWFkeSB1c2VkICh1c2VmdWxsIGZvciBwcm9ncmVzc2lvbiBvcmRlciBjaGFuZ2UpICovCi0gIE9QSl9JTlQxNiAqaW5jbHVkZTsKLSAgLyoqIGxheWVyIHN0ZXAgdXNlZCB0byBsb2NhbGl6ZSB0aGUgcGFja2V0IGluIHRoZSBpbmNsdWRlIHZlY3RvciAqLwotICBPUEpfVUlOVDMyIHN0ZXBfbDsKLSAgLyoqIHJlc29sdXRpb24gc3RlcCB1c2VkIHRvIGxvY2FsaXplIHRoZSBwYWNrZXQgaW4gdGhlIGluY2x1ZGUgdmVjdG9yICovCi0gIE9QSl9VSU5UMzIgc3RlcF9yOwotICAvKiogY29tcG9uZW50IHN0ZXAgdXNlZCB0byBsb2NhbGl6ZSB0aGUgcGFja2V0IGluIHRoZSBpbmNsdWRlIHZlY3RvciAqLwotICBPUEpfVUlOVDMyIHN0ZXBfYzsKLSAgLyoqIHByZWNpbmN0IHN0ZXAgdXNlZCB0byBsb2NhbGl6ZSB0aGUgcGFja2V0IGluIHRoZSBpbmNsdWRlIHZlY3RvciAqLwotICBPUEpfVUlOVDMyIHN0ZXBfcDsKLSAgLyoqIGNvbXBvbmVudCB0aGF0IGlkZW50aWZ5IHRoZSBwYWNrZXQgKi8KLSAgT1BKX1VJTlQzMiBjb21wbm87Ci0gIC8qKiByZXNvbHV0aW9uIHRoYXQgaWRlbnRpZnkgdGhlIHBhY2tldCAqLwotICBPUEpfVUlOVDMyIHJlc25vOwotICAvKiogcHJlY2luY3QgdGhhdCBpZGVudGlmeSB0aGUgcGFja2V0ICovCi0gIE9QSl9VSU5UMzIgcHJlY25vOwotICAvKiogbGF5ZXIgdGhhdCBpZGVudGlmeSB0aGUgcGFja2V0ICovCi0gIE9QSl9VSU5UMzIgbGF5bm87Ci0gIC8qKiAwIGlmIHRoZSBmaXJzdCBwYWNrZXQgKi8KLSAgT1BKX0JPT0wgZmlyc3Q7Ci0gIC8qKiBwcm9ncmVzc2lvbiBvcmRlciBjaGFuZ2UgaW5mb3JtYXRpb24gKi8KLSAgb3BqX3BvY190IHBvYzsKLSAgLyoqIG51bWJlciBvZiBjb21wb25lbnRzIGluIHRoZSBpbWFnZSAqLwotICBPUEpfVUlOVDMyIG51bWNvbXBzOwotICAvKiogQ29tcG9uZW50cyovCi0gIG9wal9waV9jb21wX3QgKmNvbXBzOwotICAvKiogRklYTUUgRE9DKi8KLSAgT1BKX0lOVDMyIHR4MCwgdHkwLCB0eDEsIHR5MTsKLSAgLyoqIEZJWE1FIERPQyovCi0gIE9QSl9JTlQzMiB4LCB5OwotICAvKiogRklYTUUgRE9DKi8KLSAgT1BKX1VJTlQzMiBkeCwgZHk7Ci19IG9wal9waV9pdGVyYXRvcl90OwotCi0vKiogQG5hbWUgRXhwb3J0ZWQgZnVuY3Rpb25zICovCi0vKkB7Ki8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKioKLSAqIENyZWF0ZXMgYSBwYWNrZXQgaXRlcmF0b3IgZm9yIGVuY29kaW5nLgotICoKLSAqIEBwYXJhbQlpbWFnZQkJdGhlIGltYWdlIGJlaW5nIGVuY29kZWQuCi0gKiBAcGFyYW0JY3AJCXRoZSBjb2RpbmcgcGFyYW1ldGVycy4KLSAqIEBwYXJhbQl0aWxlbm8JaW5kZXggb2YgdGhlIHRpbGUgYmVpbmcgZW5jb2RlZC4KLSAqIEBwYXJhbQl0Ml9tb2RlCXRoZSB0eXBlIG9mIHBhc3MgZm9yIGdlbmVyYXRpbmcgdGhlIHBhY2tldCBpdGVyYXRvcgotICoKLSAqIEByZXR1cm4JYSBsaXN0IG9mIHBhY2tldCBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QgcGFja2V0IG9mIHRoZSB0aWxlIChub3QgdHJ1ZSkuCi0qLwotb3BqX3BpX2l0ZXJhdG9yX3QgKm9wal9waV9pbml0aWFsaXNlX2VuY29kZShjb25zdCBvcGpfaW1hZ2VfdCAqaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jcF90ICpjcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0aWxlbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEoyS19UMl9NT0RFIHQyX21vZGUpOwotCi0vKioKLSAqIFVwZGF0ZXMgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMgb2YgdGhlIGNvZGVjLgotICoKLSAqIEBwYXJhbQlwX2ltYWdlCQl0aGUgaW1hZ2UgYmVpbmcgZW5jb2RlZC4KLSAqIEBwYXJhbQlwX2NwCQl0aGUgY29kaW5nIHBhcmFtZXRlcnMuCi0gKiBAcGFyYW0JcF90aWxlX25vCWluZGV4IG9mIHRoZSB0aWxlIGJlaW5nIGVuY29kZWQuCi0qLwotdm9pZCBvcGpfcGlfdXBkYXRlX2VuY29kaW5nX3BhcmFtZXRlcnMoCWNvbnN0IG9wal9pbWFnZV90ICpwX2ltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jcF90ICpwX2NwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX25vICk7Ci0KLS8qKgotTW9kaWZ5IHRoZSBwYWNrZXQgaXRlcmF0b3IgZm9yIGVuYWJsaW5nIHRpbGUgcGFydCBnZW5lcmF0aW9uCi1AcGFyYW0gcGkgSGFuZGxlIHRvIHRoZSBwYWNrZXQgaXRlcmF0b3IgZ2VuZXJhdGVkIGluIHBpX2luaXRpYWxpc2VfZW5jb2RlCi1AcGFyYW0gY3AgQ29kaW5nIHBhcmFtZXRlcnMKLUBwYXJhbSB0aWxlbm8gTnVtYmVyIHRoYXQgaWRlbnRpZmllcyB0aGUgdGlsZSBmb3Igd2hpY2ggdG8gbGlzdCB0aGUgcGFja2V0cwotQHBhcmFtIHBpbm8gICBGSVhNRSBET0MKLUBwYXJhbSB0cG51bSBUaWxlIHBhcnQgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHRpbGUKLUBwYXJhbSB0cHBvcyBUaGUgcG9zaXRpb24gb2YgdGhlIHRpbGUgcGFydCBmbGFnIGluIHRoZSBwcm9ncmVzc2lvbiBvcmRlcgotQHBhcmFtIHQyX21vZGUgRklYTUUgRE9DCi0qLwotdm9pZCBvcGpfcGlfY3JlYXRlX2VuY29kZSggIG9wal9waV9pdGVyYXRvcl90ICpwaSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NwX3QgKmNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdGlsZW5vLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBpbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0cG51bSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHRwcG9zLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKMktfVDJfTU9ERSB0Ml9tb2RlKTsKLQotLyoqCi1DcmVhdGUgYSBwYWNrZXQgaXRlcmF0b3IgZm9yIERlY29kZXIKLUBwYXJhbSBpbWFnZSBSYXcgaW1hZ2UgZm9yIHdoaWNoIHRoZSBwYWNrZXRzIHdpbGwgYmUgbGlzdGVkCi1AcGFyYW0gY3AgQ29kaW5nIHBhcmFtZXRlcnMKLUBwYXJhbSB0aWxlbm8gTnVtYmVyIHRoYXQgaWRlbnRpZmllcyB0aGUgdGlsZSBmb3Igd2hpY2ggdG8gbGlzdCB0aGUgcGFja2V0cwotQHJldHVybiBSZXR1cm5zIGEgcGFja2V0IGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdCBwYWNrZXQgb2YgdGhlIHRpbGUKLUBzZWUgb3BqX3BpX2Rlc3Ryb3kKLSovCi1vcGpfcGlfaXRlcmF0b3JfdCAqb3BqX3BpX2NyZWF0ZV9kZWNvZGUob3BqX2ltYWdlX3QgKiBpbWFnZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NwX3QgKiBjcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHRpbGVubyk7Ci0vKioKLSAqIERlc3Ryb3lzIGEgcGFja2V0IGl0ZXJhdG9yIGFycmF5LgotICoKLSAqIEBwYXJhbQlwX3BpCQkJdGhlIHBhY2tldCBpdGVyYXRvciBhcnJheSB0byBkZXN0cm95LgotICogQHBhcmFtCXBfbmJfZWxlbWVudHMJdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkuCi0gKi8KLXZvaWQgb3BqX3BpX2Rlc3Ryb3kob3BqX3BpX2l0ZXJhdG9yX3QgKnBfcGksCi0gICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9uYl9lbGVtZW50cyk7Ci0KLS8qKgotTW9kaWZ5IHRoZSBwYWNrZXQgaXRlcmF0b3IgdG8gcG9pbnQgdG8gdGhlIG5leHQgcGFja2V0Ci1AcGFyYW0gcGkgUGFja2V0IGl0ZXJhdG9yIHRvIG1vZGlmeQotQHJldHVybiBSZXR1cm5zIGZhbHNlIGlmIHBpIHBvaW50ZWQgdG8gdGhlIGxhc3QgcGFja2V0IG9yIGVsc2UgcmV0dXJucyB0cnVlCi0qLwotT1BKX0JPT0wgb3BqX3BpX25leHQob3BqX3BpX2l0ZXJhdG9yX3QgKiBwaSk7Ci0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLypAfSovCi0KLS8qQH0qLwotCi0jZW5kaWYgLyogX19QSV9IICovCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvdDEuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC90MS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2IyMzBmLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC90MS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc3NCArMCwwIEBACi0vKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCi0gKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCi0gKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFVuaXZlcnNpdGUgY2F0aG9saXF1ZSBkZSBMb3V2YWluIChVQ0wpLCBCZWxnaXVtCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQotICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIENhbGx1bSBMZXJ3aWNrIDxzZWdAaGF4eGVkLmNvbT4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgQVMgSVMnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQotICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgIm9wal9pbmNsdWRlcy5oIgotI2luY2x1ZGUgInQxX2x1dHMuaCIKLQotLyoqIEBkZWZncm91cCBUMSBUMSAtIEltcGxlbWVudGF0aW9uIG9mIHRoZSB0aWVyLTEgY29kaW5nICovCi0vKkB7Ki8KLQotLyoqIEBuYW1lIExvY2FsIHN0YXRpYyBmdW5jdGlvbnMgKi8KLS8qQHsqLwotCi1zdGF0aWMgSU5MSU5FIE9QSl9CWVRFIG9wal90MV9nZXRjdHhub196YyhPUEpfVUlOVDMyIGYsIE9QSl9VSU5UMzIgb3JpZW50KTsKLXN0YXRpYyBPUEpfQllURSBvcGpfdDFfZ2V0Y3R4bm9fc2MoT1BKX1VJTlQzMiBmKTsKLXN0YXRpYyBJTkxJTkUgT1BKX1VJTlQzMiBvcGpfdDFfZ2V0Y3R4bm9fbWFnKE9QSl9VSU5UMzIgZik7Ci1zdGF0aWMgT1BKX0JZVEUgb3BqX3QxX2dldHNwYihPUEpfVUlOVDMyIGYpOwotc3RhdGljIE9QSl9JTlQxNiBvcGpfdDFfZ2V0bm1zZWRlY19zaWcoT1BKX1VJTlQzMiB4LCBPUEpfVUlOVDMyIGJpdHBvcyk7Ci1zdGF0aWMgT1BKX0lOVDE2IG9wal90MV9nZXRubXNlZGVjX3JlZihPUEpfVUlOVDMyIHgsIE9QSl9VSU5UMzIgYml0cG9zKTsKLXN0YXRpYyB2b2lkIG9wal90MV91cGRhdGVmbGFncyhvcGpfZmxhZ190ICpmbGFnc3AsIE9QSl9VSU5UMzIgcywgT1BKX1VJTlQzMiBzdHJpZGUpOwotLyoqCi1FbmNvZGUgc2lnbmlmaWNhbnQgcGFzcwotKi8KLXN0YXRpYyB2b2lkIG9wal90MV9lbmNfc2lncGFzc19zdGVwKG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG9yaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBicG5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqbm1zZWRlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHZzYyk7Ci0KLS8qKgotRGVjb2RlIHNpZ25pZmljYW50IHBhc3MKLSovCi0jaWYgMAotc3RhdGljIHZvaWQgb3BqX3QxX2RlY19zaWdwYXNzX3N0ZXAob3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3NwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICpkYXRhcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgb3JpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIG9uZXBsdXNoYWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdnNjKTsKLSNlbmRpZgotCi1zdGF0aWMgSU5MSU5FIHZvaWQgb3BqX3QxX2RlY19zaWdwYXNzX3N0ZXBfcmF3KAotICAgICAgICAgICAgICAgIG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICBvcGpfZmxhZ190ICpmbGFnc3AsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyICpkYXRhcCwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgb3JpZW50LAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvbmVwbHVzaGFsZiwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgdnNjKTsKLXN0YXRpYyBJTkxJTkUgdm9pZCBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcF9tcWMoCi0gICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKmRhdGFwLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvcmllbnQsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIG9uZXBsdXNoYWxmKTsKLXN0YXRpYyBJTkxJTkUgdm9pZCBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcF9tcWNfdnNjKAotICAgICAgICAgICAgICAgIG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICBvcGpfZmxhZ190ICpmbGFnc3AsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyICpkYXRhcCwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgb3JpZW50LAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvbmVwbHVzaGFsZiwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgdnNjKTsKLQotCi0vKioKLUVuY29kZSBzaWduaWZpY2FudCBwYXNzCi0qLwotc3RhdGljIHZvaWQgb3BqX3QxX2VuY19zaWdwYXNzKCBvcGpfdDFfdCAqdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBicG5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG9yaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICpubXNlZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNibGtzdHkpOwotCi0vKioKLURlY29kZSBzaWduaWZpY2FudCBwYXNzCi0qLwotc3RhdGljIHZvaWQgb3BqX3QxX2RlY19zaWdwYXNzX3JhdygKLSAgICAgICAgICAgICAgICBvcGpfdDFfdCAqdDEsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIGJwbm8sCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIG9yaWVudCwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgY2Jsa3N0eSk7Ci1zdGF0aWMgdm9pZCBvcGpfdDFfZGVjX3NpZ3Bhc3NfbXFjKAotICAgICAgICAgICAgICAgIG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYnBubywKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgb3JpZW50KTsKLXN0YXRpYyB2b2lkIG9wal90MV9kZWNfc2lncGFzc19tcWNfdnNjKAotICAgICAgICAgICAgICAgIG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYnBubywKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgb3JpZW50KTsKLQotCi0KLS8qKgotRW5jb2RlIHJlZmluZW1lbnQgcGFzcwotKi8KLXN0YXRpYyB2b2lkIG9wal90MV9lbmNfcmVmcGFzc19zdGVwKG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYnBubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKm5tc2VkZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB2c2MpOwotCi0KLS8qKgotRW5jb2RlIHJlZmluZW1lbnQgcGFzcwotKi8KLXN0YXRpYyB2b2lkIG9wal90MV9lbmNfcmVmcGFzcyggb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYnBubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICpubXNlZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNibGtzdHkpOwotCi0vKioKLURlY29kZSByZWZpbmVtZW50IHBhc3MKLSovCi1zdGF0aWMgdm9pZCBvcGpfdDFfZGVjX3JlZnBhc3NfcmF3KAotICAgICAgICAgICAgICAgIG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYnBubywKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgY2Jsa3N0eSk7Ci1zdGF0aWMgdm9pZCBvcGpfdDFfZGVjX3JlZnBhc3NfbXFjKAotICAgICAgICAgICAgICAgIG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYnBubyk7Ci1zdGF0aWMgdm9pZCBvcGpfdDFfZGVjX3JlZnBhc3NfbXFjX3ZzYygKLSAgICAgICAgICAgICAgICBvcGpfdDFfdCAqdDEsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIGJwbm8pOwotCi0KLS8qKgotRGVjb2RlIHJlZmluZW1lbnQgcGFzcwotKi8KLSNpZiAwCi1zdGF0aWMgdm9pZCBvcGpfdDFfZGVjX3JlZnBhc3Nfc3RlcChvcGpfdDFfdCAqdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZmxhZ190ICpmbGFnc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKmRhdGFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBvc2hhbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgbmVnaGFsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHZzYyk7Ci0jZW5kaWYKLQotc3RhdGljIElOTElORSB2b2lkICBvcGpfdDFfZGVjX3JlZnBhc3Nfc3RlcF9yYXcoCi0gICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKmRhdGFwLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwb3NoYWxmLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBuZWdoYWxmLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiB2c2MpOwotc3RhdGljIElOTElORSB2b2lkIG9wal90MV9kZWNfcmVmcGFzc19zdGVwX21xYygKLSAgICAgICAgICAgICAgICBvcGpfdDFfdCAqdDEsCi0gICAgICAgICAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3NwLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YXAsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBvc2hhbGYsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIG5lZ2hhbGYpOwotc3RhdGljIElOTElORSB2b2lkIG9wal90MV9kZWNfcmVmcGFzc19zdGVwX21xY192c2MoCi0gICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKmRhdGFwLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwb3NoYWxmLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBuZWdoYWxmLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiB2c2MpOwotCi0KLQotLyoqCi1FbmNvZGUgY2xlYW4tdXAgcGFzcwotKi8KLXN0YXRpYyB2b2lkIG9wal90MV9lbmNfY2xucGFzc19zdGVwKAotCQlvcGpfdDFfdCAqdDEsCi0JCW9wal9mbGFnX3QgKmZsYWdzcCwKLQkJT1BKX0lOVDMyICpkYXRhcCwKLQkJT1BKX1VJTlQzMiBvcmllbnQsCi0JCU9QSl9JTlQzMiBicG5vLAotCQlPUEpfSU5UMzIgb25lLAotCQlPUEpfSU5UMzIgKm5tc2VkZWMsCi0JCU9QSl9VSU5UMzIgcGFydGlhbCwKLQkJT1BKX1VJTlQzMiB2c2MpOwotLyoqCi1EZWNvZGUgY2xlYW4tdXAgcGFzcwotKi8KLXN0YXRpYyB2b2lkIG9wal90MV9kZWNfY2xucGFzc19zdGVwX3BhcnRpYWwoCi0JCW9wal90MV90ICp0MSwKLQkJb3BqX2ZsYWdfdCAqZmxhZ3NwLAotCQlPUEpfSU5UMzIgKmRhdGFwLAotCQlPUEpfSU5UMzIgb3JpZW50LAotCQlPUEpfSU5UMzIgb25lcGx1c2hhbGYpOwotc3RhdGljIHZvaWQgb3BqX3QxX2RlY19jbG5wYXNzX3N0ZXAoCi0JCW9wal90MV90ICp0MSwKLQkJb3BqX2ZsYWdfdCAqZmxhZ3NwLAotCQlPUEpfSU5UMzIgKmRhdGFwLAotCQlPUEpfSU5UMzIgb3JpZW50LAotCQlPUEpfSU5UMzIgb25lcGx1c2hhbGYpOwotc3RhdGljIHZvaWQgb3BqX3QxX2RlY19jbG5wYXNzX3N0ZXBfdnNjKAotCQlvcGpfdDFfdCAqdDEsCi0JCW9wal9mbGFnX3QgKmZsYWdzcCwKLQkJT1BKX0lOVDMyICpkYXRhcCwKLQkJT1BKX0lOVDMyIG9yaWVudCwKLQkJT1BKX0lOVDMyIG9uZXBsdXNoYWxmLAotCQlPUEpfSU5UMzIgcGFydGlhbCwKLQkJT1BKX0lOVDMyIHZzYyk7Ci0vKioKLUVuY29kZSBjbGVhbi11cCBwYXNzCi0qLwotc3RhdGljIHZvaWQgb3BqX3QxX2VuY19jbG5wYXNzKAotCQlvcGpfdDFfdCAqdDEsCi0JCU9QSl9JTlQzMiBicG5vLAotCQlPUEpfVUlOVDMyIG9yaWVudCwKLQkJT1BKX0lOVDMyICpubXNlZGVjLAotCQlPUEpfVUlOVDMyIGNibGtzdHkpOwotLyoqCi1EZWNvZGUgY2xlYW4tdXAgcGFzcwotKi8KLXN0YXRpYyB2b2lkIG9wal90MV9kZWNfY2xucGFzcygKLQkJb3BqX3QxX3QgKnQxLAotCQlPUEpfSU5UMzIgYnBubywKLQkJT1BKX0lOVDMyIG9yaWVudCwKLQkJT1BKX0lOVDMyIGNibGtzdHkpOwotCi1zdGF0aWMgT1BKX0ZMT0FUNjQgb3BqX3QxX2dldHdtc2VkZWMoCi0JCU9QSl9JTlQzMiBubXNlZGVjLAotCQlPUEpfVUlOVDMyIGNvbXBubywKLQkJT1BKX1VJTlQzMiBsZXZlbCwKLQkJT1BKX1VJTlQzMiBvcmllbnQsCi0JCU9QSl9JTlQzMiBicG5vLAotCQlPUEpfVUlOVDMyIHFtZmJpZCwKLQkJT1BKX0ZMT0FUNjQgc3RlcHNpemUsCi0JCU9QSl9VSU5UMzIgbnVtY29tcHMsCi0JCWNvbnN0IE9QSl9GTE9BVDY0ICogbWN0X25vcm1zLAotCQlPUEpfVUlOVDMyIG1jdF9udW1jb21wcyk7Ci0KLXN0YXRpYyB2b2lkIG9wal90MV9lbmNvZGVfY2Jsayggb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX2NibGtfZW5jX3QqIGNibGssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgb3JpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNvbXBubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBxbWZiaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDY0IHN0ZXBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNibGtzdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbnVtY29tcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICogdGlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1BKX0ZMT0FUNjQgKiBtY3Rfbm9ybXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbWN0X251bWNvbXBzKTsKLQotLyoqCi1EZWNvZGUgMSBjb2RlLWJsb2NrCi1AcGFyYW0gdDEgVDEgaGFuZGxlCi1AcGFyYW0gY2JsayBDb2RlLWJsb2NrIGNvZGluZyBwYXJhbWV0ZXJzCi1AcGFyYW0gb3JpZW50Ci1AcGFyYW0gcm9pc2hpZnQgUmVnaW9uIG9mIGludGVyZXN0IHNoaWZ0aW5nIHZhbHVlCi1AcGFyYW0gY2Jsa3N0eSBDb2RlLWJsb2NrIHN0eWxlCi0qLwotc3RhdGljIE9QSl9CT09MIG9wal90MV9kZWNvZGVfY2Jsayggb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9jYmxrX2RlY190KiBjYmxrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBvcmllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHJvaXNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBjYmxrc3R5KTsKLQotT1BKX0JPT0wgb3BqX3QxX2FsbG9jYXRlX2J1ZmZlcnMoICAgb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBoKTsKLQotLypAfSovCi0KLS8qQH0qLwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1PUEpfQllURSBvcGpfdDFfZ2V0Y3R4bm9femMoT1BKX1VJTlQzMiBmLCBPUEpfVUlOVDMyIG9yaWVudCkgewotCXJldHVybiBsdXRfY3R4bm9femNbKG9yaWVudCA8PCA4KSB8IChmICYgVDFfU0lHX09USCldOwotfQotCi1PUEpfQllURSBvcGpfdDFfZ2V0Y3R4bm9fc2MoT1BKX1VJTlQzMiBmKSB7Ci0JcmV0dXJuIGx1dF9jdHhub19zY1soZiAmIChUMV9TSUdfUFJJTSB8IFQxX1NHTikpID4+IDRdOwotfQotCi1PUEpfVUlOVDMyIG9wal90MV9nZXRjdHhub19tYWcoT1BKX1VJTlQzMiBmKSB7Ci0JT1BKX1VJTlQzMiB0bXAxID0gKGYgJiBUMV9TSUdfT1RIKSA/IFQxX0NUWE5PX01BRyArIDEgOiBUMV9DVFhOT19NQUc7Ci0JT1BKX1VJTlQzMiB0bXAyID0gKGYgJiBUMV9SRUZJTkUpID8gVDFfQ1RYTk9fTUFHICsgMiA6IHRtcDE7Ci0JcmV0dXJuICh0bXAyKTsKLX0KLQotT1BKX0JZVEUgb3BqX3QxX2dldHNwYihPUEpfVUlOVDMyIGYpIHsKLQlyZXR1cm4gbHV0X3NwYlsoZiAmIChUMV9TSUdfUFJJTSB8IFQxX1NHTikpID4+IDRdOwotfQotCi1PUEpfSU5UMTYgb3BqX3QxX2dldG5tc2VkZWNfc2lnKE9QSl9VSU5UMzIgeCwgT1BKX1VJTlQzMiBiaXRwb3MpIHsKLQlpZiAoYml0cG9zID4gVDFfTk1TRURFQ19GUkFDQklUUykgewotCQlyZXR1cm4gbHV0X25tc2VkZWNfc2lnWyh4ID4+IChiaXRwb3MgLSBUMV9OTVNFREVDX0ZSQUNCSVRTKSkgJiAoKDEgPDwgVDFfTk1TRURFQ19CSVRTKSAtIDEpXTsKLQl9Ci0JCi0JcmV0dXJuIGx1dF9ubXNlZGVjX3NpZzBbeCAmICgoMSA8PCBUMV9OTVNFREVDX0JJVFMpIC0gMSldOwotfQotCi1PUEpfSU5UMTYgb3BqX3QxX2dldG5tc2VkZWNfcmVmKE9QSl9VSU5UMzIgeCwgT1BKX1VJTlQzMiBiaXRwb3MpIHsKLQlpZiAoYml0cG9zID4gVDFfTk1TRURFQ19GUkFDQklUUykgewotCQlyZXR1cm4gbHV0X25tc2VkZWNfcmVmWyh4ID4+IChiaXRwb3MgLSBUMV9OTVNFREVDX0ZSQUNCSVRTKSkgJiAoKDEgPDwgVDFfTk1TRURFQ19CSVRTKSAtIDEpXTsKLQl9Ci0KLSAgICByZXR1cm4gbHV0X25tc2VkZWNfcmVmMFt4ICYgKCgxIDw8IFQxX05NU0VERUNfQklUUykgLSAxKV07Ci19Ci0KLXZvaWQgb3BqX3QxX3VwZGF0ZWZsYWdzKG9wal9mbGFnX3QgKmZsYWdzcCwgT1BKX1VJTlQzMiBzLCBPUEpfVUlOVDMyIHN0cmlkZSkgewotCW9wal9mbGFnX3QgKm5wID0gZmxhZ3NwIC0gc3RyaWRlOwotCW9wal9mbGFnX3QgKnNwID0gZmxhZ3NwICsgc3RyaWRlOwotCi0Jc3RhdGljIGNvbnN0IG9wal9mbGFnX3QgbW9kW10gPSB7Ci0JCVQxX1NJR19TLCBUMV9TSUdfU3xUMV9TR05fUywKLQkJVDFfU0lHX0UsIFQxX1NJR19FfFQxX1NHTl9FLAotCQlUMV9TSUdfVywgVDFfU0lHX1d8VDFfU0dOX1csCi0JCVQxX1NJR19OLCBUMV9TSUdfTnxUMV9TR05fTgotCX07Ci0KLQlucFstMV0gfD0gVDFfU0lHX1NFOwotCW5wWzBdICB8PSBtb2Rbc107Ci0JbnBbMV0gIHw9IFQxX1NJR19TVzsKLQotCWZsYWdzcFstMV0gfD0gbW9kW3MrMl07Ci0JZmxhZ3NwWzBdICB8PSBUMV9TSUc7Ci0JZmxhZ3NwWzFdICB8PSBtb2Rbcys0XTsKLQotCXNwWy0xXSB8PSBUMV9TSUdfTkU7Ci0Jc3BbMF0gIHw9IG1vZFtzKzZdOwotCXNwWzFdICB8PSBUMV9TSUdfTlc7Ci19Ci0KLXZvaWQgb3BqX3QxX2VuY19zaWdwYXNzX3N0ZXAoICAgb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZmxhZ190ICpmbGFnc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgb3JpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYnBubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICpubXNlZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHZzYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0JT1BKX0lOVDMyIHY7Ci0gICAgT1BKX1VJTlQzMiBmbGFnOwotCQotCW9wal9tcWNfdCAqbXFjID0gdDEtPm1xYzsJLyogTVFDIGNvbXBvbmVudCAqLwotCQotCWZsYWcgPSB2c2MgPyAoT1BKX1VJTlQzMikoKCpmbGFnc3ApICYgKH4oVDFfU0lHX1MgfCBUMV9TSUdfU0UgfCBUMV9TSUdfU1cgfCBUMV9TR05fUykpKSA6IChPUEpfVUlOVDMyKSgqZmxhZ3NwKTsKLQlpZiAoKGZsYWcgJiBUMV9TSUdfT1RIKSAmJiAhKGZsYWcgJiAoVDFfU0lHIHwgVDFfVklTSVQpKSkgewotCQl2ID0gb3BqX2ludF9hYnMoKmRhdGFwKSAmIG9uZSA/IDEgOiAwOwotCQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIG9wal90MV9nZXRjdHhub196YyhmbGFnLCBvcmllbnQpKTsJLyogRVNTQUkgKi8KLQkJaWYgKHR5cGUgPT0gVDFfVFlQRV9SQVcpIHsJLyogQllQQVNTL0xBWlkgTU9ERSAqLwotCQkJb3BqX21xY19ieXBhc3NfZW5jKG1xYywgKE9QSl9VSU5UMzIpdik7Ci0JCX0gZWxzZSB7Ci0JCQlvcGpfbXFjX2VuY29kZShtcWMsIChPUEpfVUlOVDMyKXYpOwotCQl9Ci0JCWlmICh2KSB7Ci0JCQl2ID0gKmRhdGFwIDwgMCA/IDEgOiAwOwotCQkJKm5tc2VkZWMgKz0Jb3BqX3QxX2dldG5tc2VkZWNfc2lnKChPUEpfVUlOVDMyKW9wal9pbnRfYWJzKCpkYXRhcCksIChPUEpfVUlOVDMyKShicG5vICsgVDFfTk1TRURFQ19GUkFDQklUUykpOwotCQkJb3BqX21xY19zZXRjdXJjdHgobXFjLCBvcGpfdDFfZ2V0Y3R4bm9fc2MoZmxhZykpOwkvKiBFU1NBSSAqLwotCQkJaWYgKHR5cGUgPT0gVDFfVFlQRV9SQVcpIHsJLyogQllQQVNTL0xBWlkgTU9ERSAqLwotCQkJCW9wal9tcWNfYnlwYXNzX2VuYyhtcWMsIChPUEpfVUlOVDMyKXYpOwotCQkJfSBlbHNlIHsKLQkJCQlvcGpfbXFjX2VuY29kZShtcWMsIChPUEpfVUlOVDMyKSh2IF4gb3BqX3QxX2dldHNwYigoT1BKX1VJTlQzMilmbGFnKSkpOwotCQkJfQotCQkJb3BqX3QxX3VwZGF0ZWZsYWdzKGZsYWdzcCwgKE9QSl9VSU5UMzIpdiwgdDEtPmZsYWdzX3N0cmlkZSk7Ci0JCX0KLQkJKmZsYWdzcCB8PSBUMV9WSVNJVDsKLQl9Ci19Ci0KLQotc3RhdGljIElOTElORSB2b2lkIG9wal90MV9kZWNfc2lncGFzc19zdGVwX3JhdygKLSAgICAgICAgICAgICAgICBvcGpfdDFfdCAqdDEsCi0gICAgICAgICAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3NwLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YXAsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIG9yaWVudCwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgb25lcGx1c2hhbGYsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIHZzYykKLXsKLSAgICAgICAgT1BKX0lOVDMyIHYsIGZsYWc7Ci0gICAgICAgIG9wal9yYXdfdCAqcmF3ID0gdDEtPnJhdzsgICAgICAgLyogUkFXIGNvbXBvbmVudCAqLwotICAgICAgICBPUEpfQVJHX05PVF9VU0VEKG9yaWVudCk7Ci0gICAgICAgCi0gICAgICAgIGZsYWcgPSB2c2MgPyAoKCpmbGFnc3ApICYgKH4oVDFfU0lHX1MgfCBUMV9TSUdfU0UgfCBUMV9TSUdfU1cgfCBUMV9TR05fUykpKSA6ICgqZmxhZ3NwKTsKLSAgICAgICAgaWYgKChmbGFnICYgVDFfU0lHX09USCkgJiYgIShmbGFnICYgKFQxX1NJRyB8IFQxX1ZJU0lUKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGpfcmF3X2RlY29kZShyYXcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSAoT1BKX0lOVDMyKW9wal9yYXdfZGVjb2RlKHJhdyk7ICAgIC8qIEVTU0FJICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhcCA9IHYgPyAtb25lcGx1c2hhbGYgOiBvbmVwbHVzaGFsZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QxX3VwZGF0ZWZsYWdzKGZsYWdzcCwgKE9QSl9VSU5UMzIpdiwgdDEtPmZsYWdzX3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKmZsYWdzcCB8PSBUMV9WSVNJVDsKLSAgICAgICAgfQotfSAgICAgIAotCi1JTkxJTkUgdm9pZCBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcF9tcWMoCi0gICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKmRhdGFwLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvcmllbnQsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIG9uZXBsdXNoYWxmKQotewotICAgICAgICBPUEpfSU5UMzIgdiwgZmxhZzsKLSAgICAgICAKLSAgICAgICAgb3BqX21xY190ICptcWMgPSB0MS0+bXFjOyAgICAgICAvKiBNUUMgY29tcG9uZW50ICovCi0gICAgICAgCi0gICAgICAgIGZsYWcgPSAqZmxhZ3NwOwotICAgICAgICBpZiAoKGZsYWcgJiBUMV9TSUdfT1RIKSAmJiAhKGZsYWcgJiAoVDFfU0lHIHwgVDFfVklTSVQpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX21xY19zZXRjdXJjdHgobXFjLCBvcGpfdDFfZ2V0Y3R4bm9femMoKE9QSl9VSU5UMzIpZmxhZywgKE9QSl9VSU5UMzIpb3JpZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BqX21xY19kZWNvZGUobXFjKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfbXFjX3NldGN1cmN0eChtcWMsIG9wal90MV9nZXRjdHhub19zYygoT1BKX1VJTlQzMilmbGFnKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBvcGpfbXFjX2RlY29kZShtcWMpIF4gb3BqX3QxX2dldHNwYigoT1BKX1VJTlQzMilmbGFnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFwID0gdiA/IC1vbmVwbHVzaGFsZiA6IG9uZXBsdXNoYWxmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfdXBkYXRlZmxhZ3MoZmxhZ3NwLCAoT1BKX1VJTlQzMil2LCB0MS0+ZmxhZ3Nfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAqZmxhZ3NwIHw9IFQxX1ZJU0lUOwotICAgICAgICB9Ci19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZTQyBhbmQgIEJZUEFTUyBieSBBbnRvbmluICovCi0KLUlOTElORSB2b2lkIG9wal90MV9kZWNfc2lncGFzc19zdGVwX21xY192c2MoCi0gICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKmRhdGFwLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvcmllbnQsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIG9uZXBsdXNoYWxmLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiB2c2MpCi17Ci0gICAgICAgIE9QSl9JTlQzMiB2LCBmbGFnOwotICAgICAgIAotICAgICAgICBvcGpfbXFjX3QgKm1xYyA9IHQxLT5tcWM7ICAgICAgIC8qIE1RQyBjb21wb25lbnQgKi8KLSAgICAgICAKLSAgICAgICAgZmxhZyA9IHZzYyA/ICgoKmZsYWdzcCkgJiAofihUMV9TSUdfUyB8IFQxX1NJR19TRSB8IFQxX1NJR19TVyB8IFQxX1NHTl9TKSkpIDogKCpmbGFnc3ApOwotICAgICAgICBpZiAoKGZsYWcgJiBUMV9TSUdfT1RIKSAmJiAhKGZsYWcgJiAoVDFfU0lHIHwgVDFfVklTSVQpKSkgewotICAgICAgICAgICAgICAgIG9wal9tcWNfc2V0Y3VyY3R4KG1xYywgb3BqX3QxX2dldGN0eG5vX3pjKChPUEpfVUlOVDMyKWZsYWcsIChPUEpfVUlOVDMyKW9yaWVudCkpOwotICAgICAgICAgICAgICAgIGlmIChvcGpfbXFjX2RlY29kZShtcWMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfbXFjX3NldGN1cmN0eChtcWMsIG9wal90MV9nZXRjdHhub19zYygoT1BKX1VJTlQzMilmbGFnKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2ID0gb3BqX21xY19kZWNvZGUobXFjKSBeIG9wal90MV9nZXRzcGIoKE9QSl9VSU5UMzIpZmxhZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGF0YXAgPSB2ID8gLW9uZXBsdXNoYWxmIDogb25lcGx1c2hhbGY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfdXBkYXRlZmxhZ3MoZmxhZ3NwLCAoT1BKX1VJTlQzMil2LCB0MS0+ZmxhZ3Nfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKmZsYWdzcCB8PSBUMV9WSVNJVDsKLSAgICAgICAgfQotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWU0MgYW5kICBCWVBBU1MgYnkgQW50b25pbiAqLwotCi0KLQotdm9pZCBvcGpfdDFfZW5jX3NpZ3Bhc3Mob3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIGJwbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG9yaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqbm1zZWRlYywKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNibGtzdHkKLSAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLQlPUEpfVUlOVDMyIGksIGosIGssIHZzYzsgCi0gICAgT1BKX0lOVDMyIG9uZTsKLQotCSpubXNlZGVjID0gMDsKLQlvbmUgPSAxIDw8IChicG5vICsgVDFfTk1TRURFQ19GUkFDQklUUyk7Ci0JZm9yIChrID0gMDsgayA8IHQxLT5oOyBrICs9IDQpIHsKLQkJZm9yIChpID0gMDsgaSA8IHQxLT53OyArK2kpIHsKLQkJCWZvciAoaiA9IGs7IGogPCBrICsgNCAmJiBqIDwgdDEtPmg7ICsraikgewotCQkJCXZzYyA9ICgoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9WU0MpICYmIChqID09IGsgKyAzIHx8IGogPT0gdDEtPmggLSAxKSkgPyAxIDogMDsKLQkJCQlvcGpfdDFfZW5jX3NpZ3Bhc3Nfc3RlcCgKLQkJCQkJCXQxLAotCQkJCQkJJnQxLT5mbGFnc1soKGorMSkgKiB0MS0+ZmxhZ3Nfc3RyaWRlKSArIGkgKyAxXSwKLQkJCQkJCSZ0MS0+ZGF0YVsoaiAqIHQxLT5kYXRhX3N0cmlkZSkgKyBpXSwKLQkJCQkJCW9yaWVudCwKLQkJCQkJCWJwbm8sCi0JCQkJCQlvbmUsCi0JCQkJCQlubXNlZGVjLAotCQkJCQkJdHlwZSwKLQkJCQkJCXZzYyk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgb3BqX3QxX2RlY19zaWdwYXNzX3JhdygKLSAgICAgICAgICAgICAgICBvcGpfdDFfdCAqdDEsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIGJwbm8sCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIG9yaWVudCwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgY2Jsa3N0eSkKLXsKLSAgICAgICAgT1BKX0lOVDMyIG9uZSwgaGFsZiwgb25lcGx1c2hhbGYsIHZzYzsKLSAgICAgICAgT1BKX1VJTlQzMiBpLCBqLCBrOyAKLSAgICAgICAgb25lID0gMSA8PCBicG5vOwotICAgICAgICBoYWxmID0gb25lID4+IDE7Ci0gICAgICAgIG9uZXBsdXNoYWxmID0gb25lIHwgaGFsZjsKLSAgICAgICAgZm9yIChrID0gMDsgayA8IHQxLT5oOyBrICs9IDQpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdDEtPnc7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gazsgaiA8IGsgKyA0ICYmIGogPCB0MS0+aDsgKytqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZzYyA9ICgoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9WU0MpICYmIChqID09IGsgKyAzIHx8IGogPT0gdDEtPmggLSAxKSkgPyAxIDogMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19zaWdwYXNzX3N0ZXBfcmF3KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdDEtPmZsYWdzWygoaisxKSAqIHQxLT5mbGFnc19zdHJpZGUpICsgaSArIDFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnQxLT5kYXRhWyhqICogdDEtPncpICsgaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVwbHVzaGFsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZzYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZTQyBhbmQgIEJZUEFTUyBieSBBbnRvbmluICovCi0KLXZvaWQgb3BqX3QxX2RlY19zaWdwYXNzX21xYygKLSAgICAgICAgICAgICAgICBvcGpfdDFfdCAqdDEsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIGJwbm8sCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIG9yaWVudCkKLXsKLSAgICAgICAgT1BKX0lOVDMyIG9uZSwgaGFsZiwgb25lcGx1c2hhbGY7Ci0gICAgICAgIE9QSl9VSU5UMzIgaSwgaiwgazsKLSAgICAgICAgT1BKX0lOVDMyICpkYXRhMSA9IHQxLT5kYXRhOwotICAgICAgICBvcGpfZmxhZ190ICpmbGFnczEgPSAmdDEtPmZsYWdzWzFdOwotICAgICAgICBvbmUgPSAxIDw8IGJwbm87Ci0gICAgICAgIGhhbGYgPSBvbmUgPj4gMTsKLSAgICAgICAgb25lcGx1c2hhbGYgPSBvbmUgfCBoYWxmOwotICAgICAgICBmb3IgKGsgPSAwOyBrIDwgKHQxLT5oICYgfjN1KTsgayArPSA0KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHQxLT53OyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YTIgPSBkYXRhMSArIGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZmxhZ190ICpmbGFnczIgPSBmbGFnczEgKyBpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MyICs9IHQxLT5mbGFnc19zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcF9tcWModDEsIGZsYWdzMiwgZGF0YTIsIG9yaWVudCwgb25lcGx1c2hhbGYpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTIgKz0gdDEtPnc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbGFnczIgKz0gdDEtPmZsYWdzX3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90MV9kZWNfc2lncGFzc19zdGVwX21xYyh0MSwgZmxhZ3MyLCBkYXRhMiwgb3JpZW50LCBvbmVwbHVzaGFsZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhMiArPSB0MS0+dzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzMiArPSB0MS0+ZmxhZ3Nfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19zaWdwYXNzX3N0ZXBfbXFjKHQxLCBmbGFnczIsIGRhdGEyLCBvcmllbnQsIG9uZXBsdXNoYWxmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEyICs9IHQxLT53OwotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MyICs9IHQxLT5mbGFnc19zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcF9tcWModDEsIGZsYWdzMiwgZGF0YTIsIG9yaWVudCwgb25lcGx1c2hhbGYpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTIgKz0gdDEtPnc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRhdGExICs9IHQxLT53IDw8IDI7Ci0gICAgICAgICAgICAgICAgZmxhZ3MxICs9IHQxLT5mbGFnc19zdHJpZGUgPDwgMjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdDEtPnc7ICsraSkgewotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YTIgPSBkYXRhMSArIGk7Ci0gICAgICAgICAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3MyID0gZmxhZ3MxICsgaTsKLSAgICAgICAgICAgICAgICBmb3IgKGogPSBrOyBqIDwgdDEtPmg7ICsraikgewotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MyICs9IHQxLT5mbGFnc19zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcF9tcWModDEsIGZsYWdzMiwgZGF0YTIsIG9yaWVudCwgb25lcGx1c2hhbGYpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTIgKz0gdDEtPnc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZTQyBhbmQgIEJZUEFTUyBieSBBbnRvbmluICovCi0KLXZvaWQgb3BqX3QxX2RlY19zaWdwYXNzX21xY192c2MoCi0gICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBicG5vLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvcmllbnQpCi17Ci0gICAgICAgIE9QSl9JTlQzMiBvbmUsIGhhbGYsIG9uZXBsdXNoYWxmLCB2c2M7Ci0gICAgICAgIE9QSl9VSU5UMzIgaSwgaiwgazsKLSAgICAgICAgb25lID0gMSA8PCBicG5vOwotICAgICAgICBoYWxmID0gb25lID4+IDE7Ci0gICAgICAgIG9uZXBsdXNoYWxmID0gb25lIHwgaGFsZjsKLSAgICAgICAgZm9yIChrID0gMDsgayA8IHQxLT5oOyBrICs9IDQpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdDEtPnc7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gazsgaiA8IGsgKyA0ICYmIGogPCB0MS0+aDsgKytqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZzYyA9IChqID09IGsgKyAzIHx8IGogPT0gdDEtPmggLSAxKSA/IDEgOiAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcF9tcWNfdnNjKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdDEtPmZsYWdzWygoaisxKSAqIHQxLT5mbGFnc19zdHJpZGUpICsgaSArIDFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnQxLT5kYXRhWyhqICogdDEtPncpICsgaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVwbHVzaGFsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZzYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZTQyBhbmQgIEJZUEFTUyBieSBBbnRvbmluICovCi0KLQotCi12b2lkIG9wal90MV9lbmNfcmVmcGFzc19zdGVwKCAgIG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3NwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKmRhdGFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYnBubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICpubXNlZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHZzYykKLXsKLQlPUEpfSU5UMzIgdjsKLQlPUEpfVUlOVDMyIGZsYWc7Ci0JCi0Jb3BqX21xY190ICptcWMgPSB0MS0+bXFjOwkvKiBNUUMgY29tcG9uZW50ICovCi0JCi0JZmxhZyA9IHZzYyA/IChPUEpfVUlOVDMyKSgoKmZsYWdzcCkgJiAofihUMV9TSUdfUyB8IFQxX1NJR19TRSB8IFQxX1NJR19TVyB8IFQxX1NHTl9TKSkpIDogKE9QSl9VSU5UMzIpKCpmbGFnc3ApOwotCWlmICgoZmxhZyAmIChUMV9TSUcgfCBUMV9WSVNJVCkpID09IFQxX1NJRykgewotCQkqbm1zZWRlYyArPSBvcGpfdDFfZ2V0bm1zZWRlY19yZWYoKE9QSl9VSU5UMzIpb3BqX2ludF9hYnMoKmRhdGFwKSwgKE9QSl9VSU5UMzIpKGJwbm8gKyBUMV9OTVNFREVDX0ZSQUNCSVRTKSk7Ci0JCXYgPSBvcGpfaW50X2FicygqZGF0YXApICYgb25lID8gMSA6IDA7Ci0JCW9wal9tcWNfc2V0Y3VyY3R4KG1xYywgb3BqX3QxX2dldGN0eG5vX21hZyhmbGFnKSk7CS8qIEVTU0FJICovCi0JCWlmICh0eXBlID09IFQxX1RZUEVfUkFXKSB7CS8qIEJZUEFTUy9MQVpZIE1PREUgKi8KLQkJCW9wal9tcWNfYnlwYXNzX2VuYyhtcWMsIChPUEpfVUlOVDMyKXYpOwotCQl9IGVsc2UgewotCQkJb3BqX21xY19lbmNvZGUobXFjLCAoT1BKX1VJTlQzMil2KTsKLQkJfQotCQkqZmxhZ3NwIHw9IFQxX1JFRklORTsKLQl9Ci19Ci0KLUlOTElORSB2b2lkIG9wal90MV9kZWNfcmVmcGFzc19zdGVwX3JhdygKLSAgICAgICAgICAgICAgICBvcGpfdDFfdCAqdDEsCi0gICAgICAgICAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3NwLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YXAsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBvc2hhbGYsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIG5lZ2hhbGYsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIHZzYykKLXsKLSAgICAgICAgT1BKX0lOVDMyIHYsIHQsIGZsYWc7Ci0gICAgICAgCi0gICAgICAgIG9wal9yYXdfdCAqcmF3ID0gdDEtPnJhdzsgICAgICAgLyogUkFXIGNvbXBvbmVudCAqLwotICAgICAgIAotICAgICAgICBmbGFnID0gdnNjID8gKCgqZmxhZ3NwKSAmICh+KFQxX1NJR19TIHwgVDFfU0lHX1NFIHwgVDFfU0lHX1NXIHwgVDFfU0dOX1MpKSkgOiAoKmZsYWdzcCk7Ci0gICAgICAgIGlmICgoZmxhZyAmIChUMV9TSUcgfCBUMV9WSVNJVCkpID09IFQxX1NJRykgewotICAgICAgICAgICAgICAgICAgICAgICAgdiA9IChPUEpfSU5UMzIpb3BqX3Jhd19kZWNvZGUocmF3KTsKLSAgICAgICAgICAgICAgICB0ID0gdiA/IHBvc2hhbGYgOiBuZWdoYWxmOwotICAgICAgICAgICAgICAgICpkYXRhcCArPSAqZGF0YXAgPCAwID8gLXQgOiB0OwotICAgICAgICAgICAgICAgICpmbGFnc3AgfD0gVDFfUkVGSU5FOwotICAgICAgICB9Ci19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZTQyBhbmQgIEJZUEFTUyBieSBBbnRvbmluICAqLwotCi1JTkxJTkUgdm9pZCBvcGpfdDFfZGVjX3JlZnBhc3Nfc3RlcF9tcWMoCi0gICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKmRhdGFwLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwb3NoYWxmLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBuZWdoYWxmKQotewotICAgICAgICBPUEpfSU5UMzIgdiwgdCwgZmxhZzsKLSAgICAgICAKLSAgICAgICAgb3BqX21xY190ICptcWMgPSB0MS0+bXFjOyAgICAgICAvKiBNUUMgY29tcG9uZW50ICovCi0gICAgICAgCi0gICAgICAgIGZsYWcgPSAqZmxhZ3NwOwotICAgICAgICBpZiAoKGZsYWcgJiAoVDFfU0lHIHwgVDFfVklTSVQpKSA9PSBUMV9TSUcpIHsKLSAgICAgICAgICAgICAgICBvcGpfbXFjX3NldGN1cmN0eChtcWMsIG9wal90MV9nZXRjdHhub19tYWcoKE9QSl9VSU5UMzIpZmxhZykpOyAgICAgIC8qIEVTU0FJICovCi0gICAgICAgICAgICAgICAgICAgICAgICB2ID0gb3BqX21xY19kZWNvZGUobXFjKTsKLSAgICAgICAgICAgICAgICB0ID0gdiA/IHBvc2hhbGYgOiBuZWdoYWxmOwotICAgICAgICAgICAgICAgICpkYXRhcCArPSAqZGF0YXAgPCAwID8gLXQgOiB0OwotICAgICAgICAgICAgICAgICpmbGFnc3AgfD0gVDFfUkVGSU5FOwotICAgICAgICAgICAgICAgIH0KLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVlNDIGFuZCAgQllQQVNTIGJ5IEFudG9uaW4gICovCi0KLUlOTElORSB2b2lkIG9wal90MV9kZWNfcmVmcGFzc19zdGVwX21xY192c2MoCi0gICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKmRhdGFwLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwb3NoYWxmLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBuZWdoYWxmLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiB2c2MpCi17Ci0gICAgICAgIE9QSl9JTlQzMiB2LCB0LCBmbGFnOwotICAgICAgIAotICAgICAgICBvcGpfbXFjX3QgKm1xYyA9IHQxLT5tcWM7ICAgICAgIC8qIE1RQyBjb21wb25lbnQgKi8KLSAgICAgICAKLSAgICAgICAgZmxhZyA9IHZzYyA/ICgoKmZsYWdzcCkgJiAofihUMV9TSUdfUyB8IFQxX1NJR19TRSB8IFQxX1NJR19TVyB8IFQxX1NHTl9TKSkpIDogKCpmbGFnc3ApOwotICAgICAgICBpZiAoKGZsYWcgJiAoVDFfU0lHIHwgVDFfVklTSVQpKSA9PSBUMV9TSUcpIHsKLSAgICAgICAgICAgICAgICBvcGpfbXFjX3NldGN1cmN0eChtcWMsIG9wal90MV9nZXRjdHhub19tYWcoKE9QSl9VSU5UMzIpZmxhZykpOyAgICAgIC8qIEVTU0FJICovCi0gICAgICAgICAgICAgICAgdiA9IG9wal9tcWNfZGVjb2RlKG1xYyk7Ci0gICAgICAgICAgICAgICAgdCA9IHYgPyBwb3NoYWxmIDogbmVnaGFsZjsKLSAgICAgICAgICAgICAgICAqZGF0YXAgKz0gKmRhdGFwIDwgMCA/IC10IDogdDsKLSAgICAgICAgICAgICAgICAqZmxhZ3NwIHw9IFQxX1JFRklORTsKLSAgICAgICAgfQotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWU0MgYW5kICBCWVBBU1MgYnkgQW50b25pbiAgKi8KLQotCi12b2lkIG9wal90MV9lbmNfcmVmcGFzcygKLQkJb3BqX3QxX3QgKnQxLAotCQlPUEpfSU5UMzIgYnBubywKLQkJT1BKX0lOVDMyICpubXNlZGVjLAotCQlPUEpfQllURSB0eXBlLAotCQlPUEpfVUlOVDMyIGNibGtzdHkpCi17Ci0JT1BKX1VJTlQzMiBpLCBqLCBrLCB2c2M7Ci0gICAgT1BKX0lOVDMyIG9uZTsKLQotCSpubXNlZGVjID0gMDsKLQlvbmUgPSAxIDw8IChicG5vICsgVDFfTk1TRURFQ19GUkFDQklUUyk7Ci0JZm9yIChrID0gMDsgayA8IHQxLT5oOyBrICs9IDQpIHsKLQkJZm9yIChpID0gMDsgaSA8IHQxLT53OyArK2kpIHsKLQkJCWZvciAoaiA9IGs7IGogPCBrICsgNCAmJiBqIDwgdDEtPmg7ICsraikgewotCQkJCXZzYyA9ICgoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9WU0MpICYmIChqID09IGsgKyAzIHx8IGogPT0gdDEtPmggLSAxKSkgPyAxIDogMDsKLQkJCQlvcGpfdDFfZW5jX3JlZnBhc3Nfc3RlcCgKLQkJCQkJCXQxLAotCQkJCQkJJnQxLT5mbGFnc1soKGorMSkgKiB0MS0+ZmxhZ3Nfc3RyaWRlKSArIGkgKyAxXSwKLQkJCQkJCSZ0MS0+ZGF0YVsoaiAqIHQxLT5kYXRhX3N0cmlkZSkgKyBpXSwKLQkJCQkJCWJwbm8sCi0JCQkJCQlvbmUsCi0JCQkJCQlubXNlZGVjLAotCQkJCQkJdHlwZSwKLQkJCQkJCXZzYyk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgb3BqX3QxX2RlY19yZWZwYXNzX3JhdygKLSAgICAgICAgICAgICAgICBvcGpfdDFfdCAqdDEsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIGJwbm8sCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIGNibGtzdHkpCi17Ci0gICAgICAgIE9QSl9JTlQzMiBvbmUsIHBvc2hhbGYsIG5lZ2hhbGY7Ci0gICAgICAgIE9QSl9VSU5UMzIgaSwgaiwgazsKLSAgICAgICAgT1BKX0lOVDMyIHZzYzsKLSAgICAgICAgb25lID0gMSA8PCBicG5vOwotICAgICAgICBwb3NoYWxmID0gb25lID4+IDE7Ci0gICAgICAgIG5lZ2hhbGYgPSBicG5vID4gMCA/IC1wb3NoYWxmIDogLTE7Ci0gICAgICAgIGZvciAoayA9IDA7IGsgPCB0MS0+aDsgayArPSA0KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHQxLT53OyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IGs7IGogPCBrICsgNCAmJiBqIDwgdDEtPmg7ICsraikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c2MgPSAoKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfVlNDKSAmJiAoaiA9PSBrICsgMyB8fCBqID09IHQxLT5oIC0gMSkpID8gMSA6IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90MV9kZWNfcmVmcGFzc19zdGVwX3JhdygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnQxLT5mbGFnc1soKGorMSkgKiB0MS0+ZmxhZ3Nfc3RyaWRlKSArIGkgKyAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0MS0+ZGF0YVsoaiAqIHQxLT53KSArIGldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaGFsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2hhbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWU0MgYW5kICBCWVBBU1MgYnkgQW50b25pbiAqLwotCi12b2lkIG9wal90MV9kZWNfcmVmcGFzc19tcWMoCi0gICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBicG5vKQotewotICAgICAgICBPUEpfSU5UMzIgb25lLCBwb3NoYWxmLCBuZWdoYWxmOwotICAgICAgICBPUEpfVUlOVDMyIGksIGosIGs7Ci0gICAgICAgIE9QSl9JTlQzMiAqZGF0YTEgPSB0MS0+ZGF0YTsKLSAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3MxID0gJnQxLT5mbGFnc1sxXTsKLSAgICAgICAgb25lID0gMSA8PCBicG5vOwotICAgICAgICBwb3NoYWxmID0gb25lID4+IDE7Ci0gICAgICAgIG5lZ2hhbGYgPSBicG5vID4gMCA/IC1wb3NoYWxmIDogLTE7Ci0gICAgICAgIGZvciAoayA9IDA7IGsgPCAodDEtPmggJiB+M3UpOyBrICs9IDQpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdDEtPnc7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICpkYXRhMiA9IGRhdGExICsgaTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzMiA9IGZsYWdzMSArIGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbGFnczIgKz0gdDEtPmZsYWdzX3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90MV9kZWNfcmVmcGFzc19zdGVwX21xYyh0MSwgZmxhZ3MyLCBkYXRhMiwgcG9zaGFsZiwgbmVnaGFsZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhMiArPSB0MS0+dzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzMiArPSB0MS0+ZmxhZ3Nfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19yZWZwYXNzX3N0ZXBfbXFjKHQxLCBmbGFnczIsIGRhdGEyLCBwb3NoYWxmLCBuZWdoYWxmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEyICs9IHQxLT53OwotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MyICs9IHQxLT5mbGFnc19zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3JlZnBhc3Nfc3RlcF9tcWModDEsIGZsYWdzMiwgZGF0YTIsIHBvc2hhbGYsIG5lZ2hhbGYpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTIgKz0gdDEtPnc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbGFnczIgKz0gdDEtPmZsYWdzX3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90MV9kZWNfcmVmcGFzc19zdGVwX21xYyh0MSwgZmxhZ3MyLCBkYXRhMiwgcG9zaGFsZiwgbmVnaGFsZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhMiArPSB0MS0+dzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGF0YTEgKz0gdDEtPncgPDwgMjsKLSAgICAgICAgICAgICAgICBmbGFnczEgKz0gdDEtPmZsYWdzX3N0cmlkZSA8PCAyOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0MS0+dzsgKytpKSB7Ci0gICAgICAgICAgICAgICAgT1BKX0lOVDMyICpkYXRhMiA9IGRhdGExICsgaTsKLSAgICAgICAgICAgICAgICBvcGpfZmxhZ190ICpmbGFnczIgPSBmbGFnczEgKyBpOwotICAgICAgICAgICAgICAgIGZvciAoaiA9IGs7IGogPCB0MS0+aDsgKytqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbGFnczIgKz0gdDEtPmZsYWdzX3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90MV9kZWNfcmVmcGFzc19zdGVwX21xYyh0MSwgZmxhZ3MyLCBkYXRhMiwgcG9zaGFsZiwgbmVnaGFsZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhMiArPSB0MS0+dzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVlNDIGFuZCAgQllQQVNTIGJ5IEFudG9uaW4gKi8KLQotdm9pZCBvcGpfdDFfZGVjX3JlZnBhc3NfbXFjX3ZzYygKLSAgICAgICAgICAgICAgICBvcGpfdDFfdCAqdDEsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIGJwbm8pCi17Ci0gICAgICAgIE9QSl9JTlQzMiBvbmUsIHBvc2hhbGYsIG5lZ2hhbGY7Ci0gICAgICAgIE9QSl9VSU5UMzIgaSwgaiwgazsKLSAgICAgICAgT1BKX0lOVDMyIHZzYzsKLSAgICAgICAgb25lID0gMSA8PCBicG5vOwotICAgICAgICBwb3NoYWxmID0gb25lID4+IDE7Ci0gICAgICAgIG5lZ2hhbGYgPSBicG5vID4gMCA/IC1wb3NoYWxmIDogLTE7Ci0gICAgICAgIGZvciAoayA9IDA7IGsgPCB0MS0+aDsgayArPSA0KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHQxLT53OyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IGs7IGogPCBrICsgNCAmJiBqIDwgdDEtPmg7ICsraikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c2MgPSAoKGogPT0gayArIDMgfHwgaiA9PSB0MS0+aCAtIDEpKSA/IDEgOiAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3JlZnBhc3Nfc3RlcF9tcWNfdnNjKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdDEtPmZsYWdzWygoaisxKSAqIHQxLT5mbGFnc19zdHJpZGUpICsgaSArIDFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnQxLT5kYXRhWyhqICogdDEtPncpICsgaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NoYWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnaGFsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZzYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZTQyBhbmQgIEJZUEFTUyBieSBBbnRvbmluICovCi0KLQotdm9pZCBvcGpfdDFfZW5jX2NsbnBhc3Nfc3RlcCgKLQkJb3BqX3QxX3QgKnQxLAotCQlvcGpfZmxhZ190ICpmbGFnc3AsCi0JCU9QSl9JTlQzMiAqZGF0YXAsCi0JCU9QSl9VSU5UMzIgb3JpZW50LAotCQlPUEpfSU5UMzIgYnBubywKLQkJT1BKX0lOVDMyIG9uZSwKLQkJT1BKX0lOVDMyICpubXNlZGVjLAotCQlPUEpfVUlOVDMyIHBhcnRpYWwsCi0JCU9QSl9VSU5UMzIgdnNjKQotewotCU9QSl9JTlQzMiB2OwotCU9QSl9VSU5UMzIgZmxhZzsKLQkKLQlvcGpfbXFjX3QgKm1xYyA9IHQxLT5tcWM7CS8qIE1RQyBjb21wb25lbnQgKi8KLQkKLQlmbGFnID0gdnNjID8gKE9QSl9VSU5UMzIpKCgqZmxhZ3NwKSAmICh+KFQxX1NJR19TIHwgVDFfU0lHX1NFIHwgVDFfU0lHX1NXIHwgVDFfU0dOX1MpKSkgOiAoT1BKX1VJTlQzMikoKmZsYWdzcCk7Ci0JaWYgKHBhcnRpYWwpIHsKLQkJZ290byBMQUJFTF9QQVJUSUFMOwotCX0KLQlpZiAoISgqZmxhZ3NwICYgKFQxX1NJRyB8IFQxX1ZJU0lUKSkpIHsKLQkJb3BqX21xY19zZXRjdXJjdHgobXFjLCBvcGpfdDFfZ2V0Y3R4bm9femMoZmxhZywgb3JpZW50KSk7Ci0JCXYgPSBvcGpfaW50X2FicygqZGF0YXApICYgb25lID8gMSA6IDA7Ci0JCW9wal9tcWNfZW5jb2RlKG1xYywgKE9QSl9VSU5UMzIpdik7Ci0JCWlmICh2KSB7Ci1MQUJFTF9QQVJUSUFMOgotCQkJKm5tc2VkZWMgKz0gb3BqX3QxX2dldG5tc2VkZWNfc2lnKChPUEpfVUlOVDMyKW9wal9pbnRfYWJzKCpkYXRhcCksIChPUEpfVUlOVDMyKShicG5vICsgVDFfTk1TRURFQ19GUkFDQklUUykpOwotCQkJb3BqX21xY19zZXRjdXJjdHgobXFjLCBvcGpfdDFfZ2V0Y3R4bm9fc2MoZmxhZykpOwotCQkJdiA9ICpkYXRhcCA8IDAgPyAxIDogMDsKLQkJCW9wal9tcWNfZW5jb2RlKG1xYywgKE9QSl9VSU5UMzIpKHYgXiBvcGpfdDFfZ2V0c3BiKChPUEpfVUlOVDMyKWZsYWcpKSk7Ci0JCQlvcGpfdDFfdXBkYXRlZmxhZ3MoZmxhZ3NwLCAoT1BKX1VJTlQzMil2LCB0MS0+ZmxhZ3Nfc3RyaWRlKTsKLQkJfQotCX0KLQkqZmxhZ3NwICY9IH5UMV9WSVNJVDsKLX0KLQotc3RhdGljIHZvaWQgb3BqX3QxX2RlY19jbG5wYXNzX3N0ZXBfcGFydGlhbCgKLQkJb3BqX3QxX3QgKnQxLAotCQlvcGpfZmxhZ190ICpmbGFnc3AsCi0JCU9QSl9JTlQzMiAqZGF0YXAsCi0JCU9QSl9JTlQzMiBvcmllbnQsCi0JCU9QSl9JTlQzMiBvbmVwbHVzaGFsZikKLXsKLQlPUEpfSU5UMzIgdiwgZmxhZzsKLQlvcGpfbXFjX3QgKm1xYyA9IHQxLT5tcWM7CS8qIE1RQyBjb21wb25lbnQgKi8KLQkKLQlPUEpfQVJHX05PVF9VU0VEKG9yaWVudCk7Ci0JCi0JZmxhZyA9ICpmbGFnc3A7Ci0Jb3BqX21xY19zZXRjdXJjdHgobXFjLCBvcGpfdDFfZ2V0Y3R4bm9fc2MoKE9QSl9VSU5UMzIpZmxhZykpOwotCXYgPSBvcGpfbXFjX2RlY29kZShtcWMpIF4gb3BqX3QxX2dldHNwYigoT1BKX1VJTlQzMilmbGFnKTsKLQkqZGF0YXAgPSB2ID8gLW9uZXBsdXNoYWxmIDogb25lcGx1c2hhbGY7Ci0Jb3BqX3QxX3VwZGF0ZWZsYWdzKGZsYWdzcCwgKE9QSl9VSU5UMzIpdiwgdDEtPmZsYWdzX3N0cmlkZSk7Ci0JKmZsYWdzcCAmPSB+VDFfVklTSVQ7Ci19CQkJCS8qIFZTQyBhbmQgIEJZUEFTUyBieSBBbnRvbmluICovCi0KLXN0YXRpYyB2b2lkIG9wal90MV9kZWNfY2xucGFzc19zdGVwKAotCQlvcGpfdDFfdCAqdDEsCi0JCW9wal9mbGFnX3QgKmZsYWdzcCwKLQkJT1BKX0lOVDMyICpkYXRhcCwKLQkJT1BKX0lOVDMyIG9yaWVudCwKLQkJT1BKX0lOVDMyIG9uZXBsdXNoYWxmKQotewotCU9QSl9JTlQzMiB2LCBmbGFnOwotCQotCW9wal9tcWNfdCAqbXFjID0gdDEtPm1xYzsJLyogTVFDIGNvbXBvbmVudCAqLwotCQotCWZsYWcgPSAqZmxhZ3NwOwotCWlmICghKGZsYWcgJiAoVDFfU0lHIHwgVDFfVklTSVQpKSkgewotCQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIG9wal90MV9nZXRjdHhub196YygoT1BKX1VJTlQzMilmbGFnLCAoT1BKX1VJTlQzMilvcmllbnQpKTsKLQkJaWYgKG9wal9tcWNfZGVjb2RlKG1xYykpIHsKLQkJCW9wal9tcWNfc2V0Y3VyY3R4KG1xYywgb3BqX3QxX2dldGN0eG5vX3NjKChPUEpfVUlOVDMyKWZsYWcpKTsKLQkJCXYgPSBvcGpfbXFjX2RlY29kZShtcWMpIF4gb3BqX3QxX2dldHNwYigoT1BKX1VJTlQzMilmbGFnKTsKLQkJCSpkYXRhcCA9IHYgPyAtb25lcGx1c2hhbGYgOiBvbmVwbHVzaGFsZjsKLQkJCW9wal90MV91cGRhdGVmbGFncyhmbGFnc3AsIChPUEpfVUlOVDMyKXYsIHQxLT5mbGFnc19zdHJpZGUpOwotCQl9Ci0JfQotCSpmbGFnc3AgJj0gflQxX1ZJU0lUOwotfQkJCQkvKiBWU0MgYW5kICBCWVBBU1MgYnkgQW50b25pbiAqLwotCi1zdGF0aWMgdm9pZCBvcGpfdDFfZGVjX2NsbnBhc3Nfc3RlcF92c2MoCi0JCW9wal90MV90ICp0MSwKLQkJb3BqX2ZsYWdfdCAqZmxhZ3NwLAotCQlPUEpfSU5UMzIgKmRhdGFwLAotCQlPUEpfSU5UMzIgb3JpZW50LAotCQlPUEpfSU5UMzIgb25lcGx1c2hhbGYsCi0JCU9QSl9JTlQzMiBwYXJ0aWFsLAotCQlPUEpfSU5UMzIgdnNjKQotewotCU9QSl9JTlQzMiB2LCBmbGFnOwotCQotCW9wal9tcWNfdCAqbXFjID0gdDEtPm1xYzsJLyogTVFDIGNvbXBvbmVudCAqLwotCQotCWZsYWcgPSB2c2MgPyAoKCpmbGFnc3ApICYgKH4oVDFfU0lHX1MgfCBUMV9TSUdfU0UgfCBUMV9TSUdfU1cgfCBUMV9TR05fUykpKSA6ICgqZmxhZ3NwKTsKLQlpZiAocGFydGlhbCkgewotCQlnb3RvIExBQkVMX1BBUlRJQUw7Ci0JfQotCWlmICghKGZsYWcgJiAoVDFfU0lHIHwgVDFfVklTSVQpKSkgewotCQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIG9wal90MV9nZXRjdHhub196YygoT1BKX1VJTlQzMilmbGFnLCAoT1BKX1VJTlQzMilvcmllbnQpKTsKLQkJaWYgKG9wal9tcWNfZGVjb2RlKG1xYykpIHsKLUxBQkVMX1BBUlRJQUw6Ci0JCQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIG9wal90MV9nZXRjdHhub19zYygoT1BKX1VJTlQzMilmbGFnKSk7Ci0JCQl2ID0gb3BqX21xY19kZWNvZGUobXFjKSBeIG9wal90MV9nZXRzcGIoKE9QSl9VSU5UMzIpZmxhZyk7Ci0JCQkqZGF0YXAgPSB2ID8gLW9uZXBsdXNoYWxmIDogb25lcGx1c2hhbGY7Ci0JCQlvcGpfdDFfdXBkYXRlZmxhZ3MoZmxhZ3NwLCAoT1BKX1VJTlQzMil2LCB0MS0+ZmxhZ3Nfc3RyaWRlKTsKLQkJfQotCX0KLQkqZmxhZ3NwICY9IH5UMV9WSVNJVDsKLX0KLQotdm9pZCBvcGpfdDFfZW5jX2NsbnBhc3MoCi0JCW9wal90MV90ICp0MSwKLQkJT1BKX0lOVDMyIGJwbm8sCi0JCU9QSl9VSU5UMzIgb3JpZW50LAotCQlPUEpfSU5UMzIgKm5tc2VkZWMsCi0JCU9QSl9VSU5UMzIgY2Jsa3N0eSkKLXsKLQlPUEpfVUlOVDMyIGksIGosIGs7Ci0JT1BKX0lOVDMyIG9uZTsKLQlPUEpfVUlOVDMyIGFnZywgcnVubGVuLCB2c2M7Ci0JCi0Jb3BqX21xY190ICptcWMgPSB0MS0+bXFjOwkvKiBNUUMgY29tcG9uZW50ICovCi0JCi0JKm5tc2VkZWMgPSAwOwotCW9uZSA9IDEgPDwgKGJwbm8gKyBUMV9OTVNFREVDX0ZSQUNCSVRTKTsKLQlmb3IgKGsgPSAwOyBrIDwgdDEtPmg7IGsgKz0gNCkgewotCQlmb3IgKGkgPSAwOyBpIDwgdDEtPnc7ICsraSkgewotCQkJaWYgKGsgKyAzIDwgdDEtPmgpIHsKLQkJCQlpZiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9WU0MpIHsKLQkJCQkJYWdnID0gIShNQUNST190MV9mbGFncygxICsgaywxICsgaSkgJiAoVDFfU0lHIHwgVDFfVklTSVQgfCBUMV9TSUdfT1RIKQotCQkJCQkJfHwgTUFDUk9fdDFfZmxhZ3MoMSArIGsgKyAxLDEgKyBpKSAmIChUMV9TSUcgfCBUMV9WSVNJVCB8IFQxX1NJR19PVEgpCi0JCQkJCQl8fCBNQUNST190MV9mbGFncygxICsgayArIDIsMSArIGkpICYgKFQxX1NJRyB8IFQxX1ZJU0lUIHwgVDFfU0lHX09USCkKLQkJCQkJCXx8IChNQUNST190MV9mbGFncygxICsgayArIDMsMSArIGkpIAotCQkJCQkJJiAofihUMV9TSUdfUyB8IFQxX1NJR19TRSB8IFQxX1NJR19TVyB8CVQxX1NHTl9TKSkpICYgKFQxX1NJRyB8IFQxX1ZJU0lUIHwgVDFfU0lHX09USCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWFnZyA9ICEoTUFDUk9fdDFfZmxhZ3MoMSArIGssMSArIGkpICYgKFQxX1NJRyB8IFQxX1ZJU0lUIHwgVDFfU0lHX09USCkKLQkJCQkJCXx8IE1BQ1JPX3QxX2ZsYWdzKDEgKyBrICsgMSwxICsgaSkgJiAoVDFfU0lHIHwgVDFfVklTSVQgfCBUMV9TSUdfT1RIKQotCQkJCQkJfHwgTUFDUk9fdDFfZmxhZ3MoMSArIGsgKyAyLDEgKyBpKSAmIChUMV9TSUcgfCBUMV9WSVNJVCB8IFQxX1NJR19PVEgpCi0JCQkJCQl8fCBNQUNST190MV9mbGFncygxICsgayArIDMsMSArIGkpICYgKFQxX1NJRyB8IFQxX1ZJU0lUIHwgVDFfU0lHX09USCkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJYWdnID0gMDsKLQkJCX0KLQkJCWlmIChhZ2cpIHsKLQkJCQlmb3IgKHJ1bmxlbiA9IDA7IHJ1bmxlbiA8IDQ7ICsrcnVubGVuKSB7Ci0JCQkJCWlmIChvcGpfaW50X2Ficyh0MS0+ZGF0YVsoKGsgKyBydW5sZW4pKnQxLT5kYXRhX3N0cmlkZSkgKyBpXSkgJiBvbmUpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJb3BqX21xY19zZXRjdXJjdHgobXFjLCBUMV9DVFhOT19BR0cpOwotCQkJCW9wal9tcWNfZW5jb2RlKG1xYywgcnVubGVuICE9IDQpOwotCQkJCWlmIChydW5sZW4gPT0gNCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJb3BqX21xY19zZXRjdXJjdHgobXFjLCBUMV9DVFhOT19VTkkpOwotCQkJCW9wal9tcWNfZW5jb2RlKG1xYywgcnVubGVuID4+IDEpOwotCQkJCW9wal9tcWNfZW5jb2RlKG1xYywgcnVubGVuICYgMSk7Ci0JCQl9IGVsc2UgewotCQkJCXJ1bmxlbiA9IDA7Ci0JCQl9Ci0JCQlmb3IgKGogPSBrICsgcnVubGVuOyBqIDwgayArIDQgJiYgaiA8IHQxLT5oOyArK2opIHsKLQkJCQl2c2MgPSAoKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfVlNDKSAmJiAoaiA9PSBrICsgMyB8fCBqID09IHQxLT5oIC0gMSkpID8gMSA6IDA7Ci0JCQkJb3BqX3QxX2VuY19jbG5wYXNzX3N0ZXAoCi0JCQkJCQl0MSwKLQkJCQkJCSZ0MS0+ZmxhZ3NbKChqKzEpICogdDEtPmZsYWdzX3N0cmlkZSkgKyBpICsgMV0sCi0JCQkJCQkmdDEtPmRhdGFbKGogKiB0MS0+ZGF0YV9zdHJpZGUpICsgaV0sCi0JCQkJCQlvcmllbnQsCi0JCQkJCQlicG5vLAotCQkJCQkJb25lLAotCQkJCQkJbm1zZWRlYywKLQkJCQkJCWFnZyAmJiAoaiA9PSBrICsgcnVubGVuKSwKLQkJCQkJCXZzYyk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG9wal90MV9kZWNfY2xucGFzcygKLQkJb3BqX3QxX3QgKnQxLAotCQlPUEpfSU5UMzIgYnBubywKLQkJT1BKX0lOVDMyIG9yaWVudCwKLQkJT1BKX0lOVDMyIGNibGtzdHkpCi17Ci0JT1BKX0lOVDMyIG9uZSwgaGFsZiwgb25lcGx1c2hhbGYsIGFnZywgcnVubGVuLCB2c2M7Ci0gICAgT1BKX1VJTlQzMiBpLCBqLCBrOwotCU9QSl9JTlQzMiBzZWdzeW0gPSBjYmxrc3R5ICYgSjJLX0NDUF9DQkxLU1RZX1NFR1NZTTsKLQkKLQlvcGpfbXFjX3QgKm1xYyA9IHQxLT5tcWM7CS8qIE1RQyBjb21wb25lbnQgKi8KLQkKLQlvbmUgPSAxIDw8IGJwbm87Ci0JaGFsZiA9IG9uZSA+PiAxOwotCW9uZXBsdXNoYWxmID0gb25lIHwgaGFsZjsKLQlpZiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9WU0MpIHsKLQlmb3IgKGsgPSAwOyBrIDwgdDEtPmg7IGsgKz0gNCkgewotCQlmb3IgKGkgPSAwOyBpIDwgdDEtPnc7ICsraSkgewotCQkJaWYgKGsgKyAzIDwgdDEtPmgpIHsKLQkJCQkJYWdnID0gIShNQUNST190MV9mbGFncygxICsgaywxICsgaSkgJiAoVDFfU0lHIHwgVDFfVklTSVQgfCBUMV9TSUdfT1RIKQotCQkJCQkJfHwgTUFDUk9fdDFfZmxhZ3MoMSArIGsgKyAxLDEgKyBpKSAmIChUMV9TSUcgfCBUMV9WSVNJVCB8IFQxX1NJR19PVEgpCi0JCQkJCQl8fCBNQUNST190MV9mbGFncygxICsgayArIDIsMSArIGkpICYgKFQxX1NJRyB8IFQxX1ZJU0lUIHwgVDFfU0lHX09USCkKLQkJCQkJCXx8IChNQUNST190MV9mbGFncygxICsgayArIDMsMSArIGkpIAotCQkJCQkJJiAofihUMV9TSUdfUyB8IFQxX1NJR19TRSB8IFQxX1NJR19TVyB8CVQxX1NHTl9TKSkpICYgKFQxX1NJRyB8IFQxX1ZJU0lUIHwgVDFfU0lHX09USCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJYWdnID0gMDsKLQkJCX0KLQkJCWlmIChhZ2cpIHsKLQkJCQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIFQxX0NUWE5PX0FHRyk7Ci0JCQkJaWYgKCFvcGpfbXFjX2RlY29kZShtcWMpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIFQxX0NUWE5PX1VOSSk7Ci0JCQkJcnVubGVuID0gb3BqX21xY19kZWNvZGUobXFjKTsKLQkJCQlydW5sZW4gPSAocnVubGVuIDw8IDEpIHwgb3BqX21xY19kZWNvZGUobXFjKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcnVubGVuID0gMDsKLQkJCX0KLQkJCWZvciAoaiA9IGsgKyAoT1BKX1VJTlQzMilydW5sZW47IGogPCBrICsgNCAmJiBqIDwgdDEtPmg7ICsraikgewotCQkJCQl2c2MgPSAoaiA9PSBrICsgMyB8fCBqID09IHQxLT5oIC0gMSkgPyAxIDogMDsKLQkJCQkJb3BqX3QxX2RlY19jbG5wYXNzX3N0ZXBfdnNjKAotCQkJCQkJdDEsCi0JCQkJCQkmdDEtPmZsYWdzWygoaisxKSAqIHQxLT5mbGFnc19zdHJpZGUpICsgaSArIDFdLAotCQkJCQkJJnQxLT5kYXRhWyhqICogdDEtPncpICsgaV0sCi0JCQkJCQlvcmllbnQsCi0JCQkJCQlvbmVwbHVzaGFsZiwKLQkJCQkJCWFnZyAmJiAoaiA9PSBrICsgKE9QSl9VSU5UMzIpcnVubGVuKSwKLQkJCQkJCXZzYyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JfSBlbHNlIHsKLQkJT1BKX0lOVDMyICpkYXRhMSA9IHQxLT5kYXRhOwotCQlvcGpfZmxhZ190ICpmbGFnczEgPSAmdDEtPmZsYWdzWzFdOwotCQlmb3IgKGsgPSAwOyBrIDwgKHQxLT5oICYgfjN1KTsgayArPSA0KSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgdDEtPnc7ICsraSkgewotCQkJCU9QSl9JTlQzMiAqZGF0YTIgPSBkYXRhMSArIGk7Ci0JCQkJb3BqX2ZsYWdfdCAqZmxhZ3MyID0gZmxhZ3MxICsgaTsKLQkJCQlhZ2cgPSAhKE1BQ1JPX3QxX2ZsYWdzKDEgKyBrLDEgKyBpKSAmIChUMV9TSUcgfCBUMV9WSVNJVCB8IFQxX1NJR19PVEgpCi0JCQkJCXx8IE1BQ1JPX3QxX2ZsYWdzKDEgKyBrICsgMSwxICsgaSkgJiAoVDFfU0lHIHwgVDFfVklTSVQgfCBUMV9TSUdfT1RIKQotCQkJCQl8fCBNQUNST190MV9mbGFncygxICsgayArIDIsMSArIGkpICYgKFQxX1NJRyB8IFQxX1ZJU0lUIHwgVDFfU0lHX09USCkKLQkJCQkJfHwgTUFDUk9fdDFfZmxhZ3MoMSArIGsgKyAzLDEgKyBpKSAmIChUMV9TSUcgfCBUMV9WSVNJVCB8IFQxX1NJR19PVEgpKTsKLQkJCQlpZiAoYWdnKSB7Ci0JCQkJCW9wal9tcWNfc2V0Y3VyY3R4KG1xYywgVDFfQ1RYTk9fQUdHKTsKLQkJCQkJaWYgKCFvcGpfbXFjX2RlY29kZShtcWMpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIFQxX0NUWE5PX1VOSSk7Ci0JCQkJCXJ1bmxlbiA9IG9wal9tcWNfZGVjb2RlKG1xYyk7Ci0JCQkJCXJ1bmxlbiA9IChydW5sZW4gPDwgMSkgfCBvcGpfbXFjX2RlY29kZShtcWMpOwotCQkJCQlmbGFnczIgKz0gKE9QSl9VSU5UMzIpcnVubGVuICogdDEtPmZsYWdzX3N0cmlkZTsKLQkJCQkJZGF0YTIgKz0gKE9QSl9VSU5UMzIpcnVubGVuICogdDEtPnc7Ci0JCQkJCWZvciAoaiA9IGsgKyAoT1BKX1VJTlQzMilydW5sZW47IGogPCBrICsgNCAmJiBqIDwgdDEtPmg7ICsraikgewotCQkJCQkJZmxhZ3MyICs9IHQxLT5mbGFnc19zdHJpZGU7Ci0JCQkJCQlpZiAoYWdnICYmIChqID09IGsgKyAoT1BKX1VJTlQzMilydW5sZW4pKSB7Ci0JCQkJCQkJb3BqX3QxX2RlY19jbG5wYXNzX3N0ZXBfcGFydGlhbCh0MSwgZmxhZ3MyLCBkYXRhMiwgb3JpZW50LCBvbmVwbHVzaGFsZik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCW9wal90MV9kZWNfY2xucGFzc19zdGVwKHQxLCBmbGFnczIsIGRhdGEyLCBvcmllbnQsIG9uZXBsdXNoYWxmKTsKLQkJCQkJCX0KLQkJCQkJCWRhdGEyICs9IHQxLT53OwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZmxhZ3MyICs9IHQxLT5mbGFnc19zdHJpZGU7Ci0JCQkJCW9wal90MV9kZWNfY2xucGFzc19zdGVwKHQxLCBmbGFnczIsIGRhdGEyLCBvcmllbnQsIG9uZXBsdXNoYWxmKTsKLQkJCQkJZGF0YTIgKz0gdDEtPnc7Ci0JCQkJCWZsYWdzMiArPSB0MS0+ZmxhZ3Nfc3RyaWRlOwotCQkJCQlvcGpfdDFfZGVjX2NsbnBhc3Nfc3RlcCh0MSwgZmxhZ3MyLCBkYXRhMiwgb3JpZW50LCBvbmVwbHVzaGFsZik7Ci0JCQkJCWRhdGEyICs9IHQxLT53OwotCQkJCQlmbGFnczIgKz0gdDEtPmZsYWdzX3N0cmlkZTsKLQkJCQkJb3BqX3QxX2RlY19jbG5wYXNzX3N0ZXAodDEsIGZsYWdzMiwgZGF0YTIsIG9yaWVudCwgb25lcGx1c2hhbGYpOwotCQkJCQlkYXRhMiArPSB0MS0+dzsKLQkJCQkJZmxhZ3MyICs9IHQxLT5mbGFnc19zdHJpZGU7Ci0JCQkJCW9wal90MV9kZWNfY2xucGFzc19zdGVwKHQxLCBmbGFnczIsIGRhdGEyLCBvcmllbnQsIG9uZXBsdXNoYWxmKTsKLQkJCQkJZGF0YTIgKz0gdDEtPnc7Ci0JCQkJfQotCQkJfQotCQkJZGF0YTEgKz0gdDEtPncgPDwgMjsKLQkJCWZsYWdzMSArPSB0MS0+ZmxhZ3Nfc3RyaWRlIDw8IDI7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IHQxLT53OyArK2kpIHsKLQkJCU9QSl9JTlQzMiAqZGF0YTIgPSBkYXRhMSArIGk7Ci0JCQlvcGpfZmxhZ190ICpmbGFnczIgPSBmbGFnczEgKyBpOwotCQkJZm9yIChqID0gazsgaiA8IHQxLT5oOyArK2opIHsKLQkJCQlmbGFnczIgKz0gdDEtPmZsYWdzX3N0cmlkZTsKLQkJCQlvcGpfdDFfZGVjX2NsbnBhc3Nfc3RlcCh0MSwgZmxhZ3MyLCBkYXRhMiwgb3JpZW50LCBvbmVwbHVzaGFsZik7Ci0JCQkJZGF0YTIgKz0gdDEtPnc7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoc2Vnc3ltKSB7Ci0JCU9QSl9JTlQzMiB2ID0gMDsKLQkJb3BqX21xY19zZXRjdXJjdHgobXFjLCBUMV9DVFhOT19VTkkpOwotCQl2ID0gb3BqX21xY19kZWNvZGUobXFjKTsKLQkJdiA9ICh2IDw8IDEpIHwgb3BqX21xY19kZWNvZGUobXFjKTsKLQkJdiA9ICh2IDw8IDEpIHwgb3BqX21xY19kZWNvZGUobXFjKTsKLQkJdiA9ICh2IDw8IDEpIHwgb3BqX21xY19kZWNvZGUobXFjKTsKLQkJLyoKLQkJaWYgKHYhPTB4YSkgewotCQkJb3BqX2V2ZW50X21zZyh0MS0+Y2luZm8sIEVWVF9XQVJOSU5HLCAiQmFkIHNlZ21lbnRhdGlvbiBzeW1ib2wgJXhcbiIsIHYpOwotCQl9IAotCQkqLwotCX0KLX0JCQkJLyogVlNDIGFuZCAgQllQQVNTIGJ5IEFudG9uaW4gKi8KLQotCi0vKiogbW9kIGZpeGVkX3F1YWxpdHkgKi8KLXN0YXRpYyBPUEpfRkxPQVQ2NCBvcGpfdDFfZ2V0d21zZWRlYygKLQkJT1BKX0lOVDMyIG5tc2VkZWMsCi0JCU9QSl9VSU5UMzIgY29tcG5vLAotCQlPUEpfVUlOVDMyIGxldmVsLAotCQlPUEpfVUlOVDMyIG9yaWVudCwKLQkJT1BKX0lOVDMyIGJwbm8sCi0JCU9QSl9VSU5UMzIgcW1mYmlkLAotCQlPUEpfRkxPQVQ2NCBzdGVwc2l6ZSwKLQkJT1BKX1VJTlQzMiBudW1jb21wcywKLQkJY29uc3QgT1BKX0ZMT0FUNjQgKiBtY3Rfbm9ybXMsCi0JCU9QSl9VSU5UMzIgbWN0X251bWNvbXBzKQotewotCU9QSl9GTE9BVDY0IHcxID0gMSwgdzIsIHdtc2VkZWM7Ci0JT1BKX0FSR19OT1RfVVNFRChudW1jb21wcyk7Ci0KLQlpZiAobWN0X25vcm1zICYmIChjb21wbm8gPCBtY3RfbnVtY29tcHMpKSB7Ci0JCXcxID0gbWN0X25vcm1zW2NvbXBub107Ci0JfQotCi0JaWYgKHFtZmJpZCA9PSAxKSB7Ci0JCXcyID0gb3BqX2R3dF9nZXRub3JtKGxldmVsLCBvcmllbnQpOwotCX0gZWxzZSB7CS8qIGlmIChxbWZiaWQgPT0gMCkgKi8KLQkJdzIgPSBvcGpfZHd0X2dldG5vcm1fcmVhbChsZXZlbCwgb3JpZW50KTsKLQl9Ci0KLQl3bXNlZGVjID0gdzEgKiB3MiAqIHN0ZXBzaXplICogKDEgPDwgYnBubyk7Ci0Jd21zZWRlYyAqPSB3bXNlZGVjICogbm1zZWRlYyAvIDgxOTIuMDsKLQotCXJldHVybiB3bXNlZGVjOwotfQotCi1PUEpfQk9PTCBvcGpfdDFfYWxsb2NhdGVfYnVmZmVycygKLQkJb3BqX3QxX3QgKnQxLAotCQlPUEpfVUlOVDMyIHcsCi0JCU9QSl9VSU5UMzIgaCkKLXsKLQlPUEpfVUlOVDMyIGRhdGFzaXplPXcgKiBoOwotCU9QSl9VSU5UMzIgZmxhZ3NzaXplOwotCi0JLyogZW5jb2RlciB1c2VzIHRpbGUgYnVmZmVyLCBzbyBubyBuZWVkIHRvIGFsbG9jYXRlICovCi0JaWYgKCF0MS0+ZW5jb2RlcikgewotCQlpZihkYXRhc2l6ZSA+IHQxLT5kYXRhc2l6ZSl7Ci0JCQlvcGpfYWxpZ25lZF9mcmVlKHQxLT5kYXRhKTsKLQkJCXQxLT5kYXRhID0gKE9QSl9JTlQzMiopIG9wal9hbGlnbmVkX21hbGxvYyhkYXRhc2l6ZSAqIHNpemVvZihPUEpfSU5UMzIpKTsKLQkJCWlmKCF0MS0+ZGF0YSl7Ci0JCQkJLyogRklYTUUgZXZlbnQgbWFuYWdlciBlcnJvciBjYWxsYmFjayAqLwotCQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCQl9Ci0JCQl0MS0+ZGF0YXNpemU9ZGF0YXNpemU7Ci0JCX0KLQkJbWVtc2V0KHQxLT5kYXRhLDAsZGF0YXNpemUgKiBzaXplb2YoT1BKX0lOVDMyKSk7Ci0JfQotCXQxLT5mbGFnc19zdHJpZGU9dysyOwotCWZsYWdzc2l6ZT10MS0+ZmxhZ3Nfc3RyaWRlICogKGgrMik7Ci0KLQlpZihmbGFnc3NpemUgPiB0MS0+ZmxhZ3NzaXplKXsKLQkJb3BqX2FsaWduZWRfZnJlZSh0MS0+ZmxhZ3MpOwotCQl0MS0+ZmxhZ3MgPSAob3BqX2ZsYWdfdCopIG9wal9hbGlnbmVkX21hbGxvYyhmbGFnc3NpemUgKiBzaXplb2Yob3BqX2ZsYWdfdCkpOwotCQlpZighdDEtPmZsYWdzKXsKLQkJCS8qIEZJWE1FIGV2ZW50IG1hbmFnZXIgZXJyb3IgY2FsbGJhY2sgKi8KLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KLQkJdDEtPmZsYWdzc2l6ZT1mbGFnc3NpemU7Ci0JfQotCW1lbXNldCh0MS0+ZmxhZ3MsMCxmbGFnc3NpemUgKiBzaXplb2Yob3BqX2ZsYWdfdCkpOwotCi0JdDEtPnc9dzsKLQl0MS0+aD1oOwotCi0JcmV0dXJuIE9QSl9UUlVFOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoqCi0gKiBDcmVhdGVzIGEgbmV3IFRpZXIgMSBoYW5kbGUKLSAqIGFuZCBpbml0aWFsaXplcyB0aGUgbG9vay11cCB0YWJsZXMgb2YgdGhlIFRpZXItMSBjb2Rlci9kZWNvZGVyCi0gKiBAcmV0dXJuIGEgbmV3IFQxIGhhbmRsZSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIE5VTEwgb3RoZXJ3aXNlCi0qLwotb3BqX3QxX3QqIG9wal90MV9jcmVhdGUoT1BKX0JPT0wgaXNFbmNvZGVyKQotewotCW9wal90MV90ICpsX3QxID0gMDA7Ci0KLQlsX3QxID0gKG9wal90MV90Kikgb3BqX2NhbGxvYygxLHNpemVvZihvcGpfdDFfdCkpOwotCWlmICghbF90MSkgewotCQlyZXR1cm4gMDA7Ci0JfQotCi0JLyogY3JlYXRlIE1RQyBhbmQgUkFXIGhhbmRsZXMgKi8KLQlsX3QxLT5tcWMgPSBvcGpfbXFjX2NyZWF0ZSgpOwotCWlmICghIGxfdDEtPm1xYykgewotCQlvcGpfdDFfZGVzdHJveShsX3QxKTsKLQkJcmV0dXJuIDAwOwotCX0KLQotCWxfdDEtPnJhdyA9IG9wal9yYXdfY3JlYXRlKCk7Ci0JaWYgKCEgbF90MS0+cmF3KSB7Ci0JCW9wal90MV9kZXN0cm95KGxfdDEpOwotCQlyZXR1cm4gMDA7Ci0JfQotCWxfdDEtPmVuY29kZXIgPSBpc0VuY29kZXI7Ci0KLQlyZXR1cm4gbF90MTsKLX0KLQotCi0vKioKLSAqIERlc3Ryb3lzIGEgcHJldmlvdXNseSBjcmVhdGVkIFQxIGhhbmRsZQotICoKLSAqIEBwYXJhbSBwX3QxIFRpZXIgMSBoYW5kbGUgdG8gZGVzdHJveQotKi8KLXZvaWQgb3BqX3QxX2Rlc3Ryb3kob3BqX3QxX3QgKnBfdDEpCi17Ci0JaWYgKCEgcF90MSkgewotCQlyZXR1cm47Ci0JfQotCi0JLyogZGVzdHJveSBNUUMgYW5kIFJBVyBoYW5kbGVzICovCi0Jb3BqX21xY19kZXN0cm95KHBfdDEtPm1xYyk7Ci0JcF90MS0+bXFjID0gMDA7Ci0Jb3BqX3Jhd19kZXN0cm95KHBfdDEtPnJhdyk7Ci0JcF90MS0+cmF3ID0gMDA7Ci0JCi0JLyogZW5jb2RlciB1c2VzIHRpbGUgYnVmZmVyLCBzbyBubyBuZWVkIHRvIGZyZWUgKi8KLQlpZiAoIXBfdDEtPmVuY29kZXIgJiYgcF90MS0+ZGF0YSkgewotCQlvcGpfYWxpZ25lZF9mcmVlKHBfdDEtPmRhdGEpOwotCQlwX3QxLT5kYXRhID0gMDA7Ci0JfQotCi0JaWYgKHBfdDEtPmZsYWdzKSB7Ci0JCW9wal9hbGlnbmVkX2ZyZWUocF90MS0+ZmxhZ3MpOwotCQlwX3QxLT5mbGFncyA9IDAwOwotCX0KLQotCW9wal9mcmVlKHBfdDEpOwotfQotCi1PUEpfQk9PTCBvcGpfdDFfZGVjb2RlX2NibGtzKCAgIG9wal90MV90KiB0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QqIHRpbGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2NwX3QqIHRjY3AKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0JT1BKX1VJTlQzMiByZXNubywgYmFuZG5vLCBwcmVjbm8sIGNibGtubzsKLQlPUEpfVUlOVDMyIHRpbGVfdyA9IChPUEpfVUlOVDMyKSh0aWxlYy0+eDEgLSB0aWxlYy0+eDApOwotCi0JZm9yIChyZXNubyA9IDA7IHJlc25vIDwgdGlsZWMtPm1pbmltdW1fbnVtX3Jlc29sdXRpb25zOyArK3Jlc25vKSB7Ci0JCW9wal90Y2RfcmVzb2x1dGlvbl90KiByZXMgPSAmdGlsZWMtPnJlc29sdXRpb25zW3Jlc25vXTsKLQotCQlmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IHJlcy0+bnVtYmFuZHM7ICsrYmFuZG5vKSB7Ci0JCQlvcGpfdGNkX2JhbmRfdCogcmVzdHJpY3QgYmFuZCA9ICZyZXMtPmJhbmRzW2JhbmRub107Ci0KLQkJCWZvciAocHJlY25vID0gMDsgcHJlY25vIDwgcmVzLT5wdyAqIHJlcy0+cGg7ICsrcHJlY25vKSB7Ci0JCQkJb3BqX3RjZF9wcmVjaW5jdF90KiBwcmVjaW5jdCA9ICZiYW5kLT5wcmVjaW5jdHNbcHJlY25vXTsKLQotCQkJCWZvciAoY2Jsa25vID0gMDsgY2Jsa25vIDwgcHJlY2luY3QtPmN3ICogcHJlY2luY3QtPmNoOyArK2NibGtubykgewotCQkJCQlvcGpfdGNkX2NibGtfZGVjX3QqIGNibGsgPSAmcHJlY2luY3QtPmNibGtzLmRlY1tjYmxrbm9dOwotCQkJCQlPUEpfSU5UMzIqIHJlc3RyaWN0IGRhdGFwOwotCQkJCQkvKnZvaWQqIHJlc3RyaWN0IHRpbGVkcDsqLwotCQkJCQlPUEpfVUlOVDMyIGNibGtfdywgY2Jsa19oOwotCQkJCQlPUEpfSU5UMzIgeCwgeTsKLQkJCQkJT1BKX1VJTlQzMiBpLCBqOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChPUEpfRkFMU0UgPT0gb3BqX3QxX2RlY29kZV9jYmxrKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2JsaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZC0+YmFuZG5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMil0Y2NwLT5yb2lzaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+Y2Jsa3N0eSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLQkJCQkJeCA9IGNibGstPngwIC0gYmFuZC0+eDA7Ci0JCQkJCXkgPSBjYmxrLT55MCAtIGJhbmQtPnkwOwotCQkJCQlpZiAoYmFuZC0+YmFuZG5vICYgMSkgewotCQkJCQkJb3BqX3RjZF9yZXNvbHV0aW9uX3QqIHByZXMgPSAmdGlsZWMtPnJlc29sdXRpb25zW3Jlc25vIC0gMV07Ci0JCQkJCQl4ICs9IHByZXMtPngxIC0gcHJlcy0+eDA7Ci0JCQkJCX0KLQkJCQkJaWYgKGJhbmQtPmJhbmRubyAmIDIpIHsKLQkJCQkJCW9wal90Y2RfcmVzb2x1dGlvbl90KiBwcmVzID0gJnRpbGVjLT5yZXNvbHV0aW9uc1tyZXNubyAtIDFdOwotCQkJCQkJeSArPSBwcmVzLT55MSAtIHByZXMtPnkwOwotCQkJCQl9Ci0KLQkJCQkJZGF0YXA9dDEtPmRhdGE7Ci0JCQkJCWNibGtfdyA9IHQxLT53OwotCQkJCQljYmxrX2ggPSB0MS0+aDsKLQotCQkJCQlpZiAodGNjcC0+cm9pc2hpZnQpIHsKLQkJCQkJCU9QSl9JTlQzMiB0aHJlc2ggPSAxIDw8IHRjY3AtPnJvaXNoaWZ0OwotCQkJCQkJZm9yIChqID0gMDsgaiA8IGNibGtfaDsgKytqKSB7Ci0JCQkJCQkJZm9yIChpID0gMDsgaSA8IGNibGtfdzsgKytpKSB7Ci0JCQkJCQkJCU9QSl9JTlQzMiB2YWwgPSBkYXRhcFsoaiAqIGNibGtfdykgKyBpXTsKLQkJCQkJCQkJT1BKX0lOVDMyIG1hZyA9IGFicyh2YWwpOwotCQkJCQkJCQlpZiAobWFnID49IHRocmVzaCkgewotCQkJCQkJCQkJbWFnID4+PSB0Y2NwLT5yb2lzaGlmdDsKLQkJCQkJCQkJCWRhdGFwWyhqICogY2Jsa193KSArIGldID0gdmFsIDwgMCA/IC1tYWcgOiBtYWc7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvKnRpbGVkcD0odm9pZCopJnRpbGVjLT5kYXRhWyh5ICogdGlsZV93KSArIHhdOyovCi0JCQkJCWlmICh0Y2NwLT5xbWZiaWQgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyKiByZXN0cmljdCB0aWxlZHAgPSAmdGlsZWMtPmRhdGFbKE9QSl9VSU5UMzIpeSAqIHRpbGVfdyArIChPUEpfVUlOVDMyKXhdOwotCQkJCQkJZm9yIChqID0gMDsgaiA8IGNibGtfaDsgKytqKSB7Ci0JCQkJCQkJZm9yIChpID0gMDsgaSA8IGNibGtfdzsgKytpKSB7Ci0JCQkJCQkJCU9QSl9JTlQzMiB0bXAgPSBkYXRhcFsoaiAqIGNibGtfdykgKyBpXTsKLQkJCQkJCQkJKChPUEpfSU5UMzIqKXRpbGVkcClbKGogKiB0aWxlX3cpICsgaV0gPSB0bXAgLyAyOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsJCS8qIGlmICh0Y2NwLT5xbWZiaWQgPT0gMCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyKiByZXN0cmljdCB0aWxlZHAgPSAoT1BKX0ZMT0FUMzIqKSAmdGlsZWMtPmRhdGFbKE9QSl9VSU5UMzIpeSAqIHRpbGVfdyArIChPUEpfVUlOVDMyKXhdOwotCQkJCQkJZm9yIChqID0gMDsgaiA8IGNibGtfaDsgKytqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIqIHJlc3RyaWN0IHRpbGVkcDIgPSB0aWxlZHA7Ci0JCQkJCQkJZm9yIChpID0gMDsgaSA8IGNibGtfdzsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyIHRtcCA9IChPUEpfRkxPQVQzMikqZGF0YXAgKiBiYW5kLT5zdGVwc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRpbGVkcDIgPSB0bXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFwKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVkcDIrKzsKLQkJCQkJCQkJLypmbG9hdCB0bXAgPSBkYXRhcFsoaiAqIGNibGtfdykgKyBpXSAqIGJhbmQtPnN0ZXBzaXplOwotCQkJCQkJCQkoKGZsb2F0Kil0aWxlZHApWyhqICogdGlsZV93KSArIGldID0gdG1wOyovCi0KLQkJCQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZWRwICs9IHRpbGVfdzsKLQkJCQkJCX0KLQkJCQkJfQotICAgICAgICAgICAgICAgICAgICAvKm9wal9mcmVlKGNibGstPmRhdGEpOwotCQkJCQlvcGpfZnJlZShjYmxrLT5zZWdzKTsqLwotCQkJCQkvKmNibGstPnNlZ3MgPSAwMDsqLwotCQkJCX0gLyogY2Jsa25vICovCi0gICAgICAgICAgICAgICAgLypvcGpfZnJlZShwcmVjaW5jdC0+Y2Jsa3MuZGVjKTsqLwotCQkJfSAvKiBwcmVjbm8gKi8KLQkJfSAvKiBiYW5kbm8gKi8KLQl9IC8qIHJlc25vICovCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotCi1PUEpfQk9PTCBvcGpfdDFfZGVjb2RlX2NibGsob3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfY2Jsa19kZWNfdCogY2JsaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG9yaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHJvaXNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgY2Jsa3N0eSkKLXsKLQlvcGpfcmF3X3QgKnJhdyA9IHQxLT5yYXc7CS8qIFJBVyBjb21wb25lbnQgKi8KLQlvcGpfbXFjX3QgKm1xYyA9IHQxLT5tcWM7CS8qIE1RQyBjb21wb25lbnQgKi8KLQotCU9QSl9JTlQzMiBicG5vOwotCU9QSl9VSU5UMzIgcGFzc3R5cGU7Ci0JT1BKX1VJTlQzMiBzZWdubywgcGFzc25vOwotCU9QSl9CWVRFIHR5cGUgPSBUMV9UWVBFX01ROyAvKiBCWVBBU1MgbW9kZSAqLwotCi0JaWYoIW9wal90MV9hbGxvY2F0ZV9idWZmZXJzKAotCQkJCXQxLAotCQkJCShPUEpfVUlOVDMyKShjYmxrLT54MSAtIGNibGstPngwKSwKLQkJCQkoT1BKX1VJTlQzMikoY2Jsay0+eTEgLSBjYmxrLT55MCkpKQotCXsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0KLQlicG5vID0gKE9QSl9JTlQzMikocm9pc2hpZnQgKyBjYmxrLT5udW1icHMgLSAxKTsKLQlwYXNzdHlwZSA9IDI7Ci0KLQlvcGpfbXFjX3Jlc2V0c3RhdGVzKG1xYyk7Ci0Jb3BqX21xY19zZXRzdGF0ZShtcWMsIFQxX0NUWE5PX1VOSSwgMCwgNDYpOwotCW9wal9tcWNfc2V0c3RhdGUobXFjLCBUMV9DVFhOT19BR0csIDAsIDMpOwotCW9wal9tcWNfc2V0c3RhdGUobXFjLCBUMV9DVFhOT19aQywgMCwgNCk7Ci0KLQlmb3IgKHNlZ25vID0gMDsgc2Vnbm8gPCBjYmxrLT5yZWFsX251bV9zZWdzOyArK3NlZ25vKSB7Ci0JCW9wal90Y2Rfc2VnX3QgKnNlZyA9ICZjYmxrLT5zZWdzW3NlZ25vXTsKLQotCQkvKiBCWVBBU1MgbW9kZSAqLwotCQl0eXBlID0gKChicG5vIDw9ICgoT1BKX0lOVDMyKSAoY2Jsay0+bnVtYnBzKSAtIDEpIC0gNCkgJiYgKHBhc3N0eXBlIDwgMikgJiYgKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfTEFaWSkpID8gVDFfVFlQRV9SQVcgOiBUMV9UWVBFX01ROwotCQkvKiBGSVhNRTogc2x2aWV3ZXIgZ2V0cyBoZXJlIHdpdGggYSBudWxsIHBvaW50ZXIuIFdoeT8gUGFydGlhbGx5IGRvd25sb2FkZWQgYW5kL29yIGNvcnJ1cHQgdGV4dHVyZXM/ICovCi0JCWlmKHNlZy0+ZGF0YSA9PSAwMCl7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAodHlwZSA9PSBUMV9UWVBFX1JBVykgewotCQkJb3BqX3Jhd19pbml0X2RlYyhyYXcsICgqc2VnLT5kYXRhKSArIHNlZy0+ZGF0YWluZGV4LCBzZWctPmxlbik7Ci0JCX0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoT1BKX0ZBTFNFID09IG9wal9tcWNfaW5pdF9kZWMobXFjLCAoKnNlZy0+ZGF0YSkgKyBzZWctPmRhdGFpbmRleCwgc2VnLT5sZW4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0JCX0KLQotCQlmb3IgKHBhc3NubyA9IDA7IHBhc3NubyA8IHNlZy0+cmVhbF9udW1fcGFzc2VzOyArK3Bhc3NubykgewotICAgICAgICAgICAgc3dpdGNoIChwYXNzdHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gVDFfVFlQRV9SQVcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90MV9kZWNfc2lncGFzc19yYXcodDEsIGJwbm8rMSwgKE9QSl9JTlQzMilvcmllbnQsIChPUEpfSU5UMzIpY2Jsa3N0eSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9WU0MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3NpZ3Bhc3NfbXFjX3ZzYyh0MSwgYnBubysxLCAoT1BKX0lOVDMyKW9yaWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90MV9kZWNfc2lncGFzc19tcWModDEsIGJwbm8rMSwgKE9QSl9JTlQzMilvcmllbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gVDFfVFlQRV9SQVcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3JlZnBhc3NfcmF3KHQxLCBicG5vKzEsIChPUEpfSU5UMzIpY2Jsa3N0eSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9WU0MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3JlZnBhc3NfbXFjX3ZzYyh0MSwgYnBubysxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19yZWZwYXNzX21xYyh0MSwgYnBubysxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIG9wal90MV9kZWNfY2xucGFzcyh0MSwgYnBubysxLCAoT1BKX0lOVDMyKW9yaWVudCwgKE9QSl9JTlQzMiljYmxrc3R5KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLQkJCWlmICgoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9SRVNFVCkgJiYgdHlwZSA9PSBUMV9UWVBFX01RKSB7Ci0JCQkJb3BqX21xY19yZXNldHN0YXRlcyhtcWMpOwotCQkJCW9wal9tcWNfc2V0c3RhdGUobXFjLCBUMV9DVFhOT19VTkksIDAsIDQ2KTsKLQkJCQlvcGpfbXFjX3NldHN0YXRlKG1xYywgVDFfQ1RYTk9fQUdHLCAwLCAzKTsKLQkJCQlvcGpfbXFjX3NldHN0YXRlKG1xYywgVDFfQ1RYTk9fWkMsIDAsIDQpOwotCQkJfQotCQkJaWYgKCsrcGFzc3R5cGUgPT0gMykgewotCQkJCXBhc3N0eXBlID0gMDsKLQkJCQlicG5vLS07Ci0JCQl9Ci0JCX0KLQl9Ci0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotCi0KLQotT1BKX0JPT0wgb3BqX3QxX2VuY29kZV9jYmxrcyggICBvcGpfdDFfdCAqdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICp0aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNwX3QgKnRjcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1BKX0ZMT0FUNjQgKiBtY3Rfbm9ybXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbWN0X251bWNvbXBzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLQlPUEpfVUlOVDMyIGNvbXBubywgcmVzbm8sIGJhbmRubywgcHJlY25vLCBjYmxrbm87Ci0KLQl0aWxlLT5kaXN0b3RpbGUgPSAwOwkJLyogZml4ZWRfcXVhbGl0eSAqLwotCi0JZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCB0aWxlLT5udW1jb21wczsgKytjb21wbm8pIHsKLQkJb3BqX3RjZF90aWxlY29tcF90KiB0aWxlYyA9ICZ0aWxlLT5jb21wc1tjb21wbm9dOwotCQlvcGpfdGNjcF90KiB0Y2NwID0gJnRjcC0+dGNjcHNbY29tcG5vXTsKLQkJT1BKX1VJTlQzMiB0aWxlX3cgPSAoT1BKX1VJTlQzMikodGlsZWMtPngxIC0gdGlsZWMtPngwKTsKLQotCQlmb3IgKHJlc25vID0gMDsgcmVzbm8gPCB0aWxlYy0+bnVtcmVzb2x1dGlvbnM7ICsrcmVzbm8pIHsKLQkJCW9wal90Y2RfcmVzb2x1dGlvbl90ICpyZXMgPSAmdGlsZWMtPnJlc29sdXRpb25zW3Jlc25vXTsKLQotCQkJZm9yIChiYW5kbm8gPSAwOyBiYW5kbm8gPCByZXMtPm51bWJhbmRzOyArK2JhbmRubykgewotCQkJCW9wal90Y2RfYmFuZF90KiByZXN0cmljdCBiYW5kID0gJnJlcy0+YmFuZHNbYmFuZG5vXTsKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYmFuZGNvbnN0ID0gODE5MiAqIDgxOTIgLyAoKE9QSl9JTlQzMikgZmxvb3IoYmFuZC0+c3RlcHNpemUgKiA4MTkyKSk7Ci0KLQkJCQlmb3IgKHByZWNubyA9IDA7IHByZWNubyA8IHJlcy0+cHcgKiByZXMtPnBoOyArK3ByZWNubykgewotCQkJCQlvcGpfdGNkX3ByZWNpbmN0X3QgKnByYyA9ICZiYW5kLT5wcmVjaW5jdHNbcHJlY25vXTsKLQotCQkJCQlmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IHByYy0+Y3cgKiBwcmMtPmNoOyArK2NibGtubykgewotCQkJCQkJb3BqX3RjZF9jYmxrX2VuY190KiBjYmxrID0gJnByYy0+Y2Jsa3MuZW5jW2NibGtub107Ci0JCQkJCQlPUEpfSU5UMzIqIHJlc3RyaWN0IHRpbGVkcDsKLQkJCQkJCU9QSl9VSU5UMzIgY2Jsa193OwotCQkJCQkJT1BKX1VJTlQzMiBjYmxrX2g7Ci0JCQkJCQlPUEpfVUlOVDMyIGksIGosIHRpbGVJbmRleD0wLCB0aWxlTGluZUFkdmFuY2U7Ci0KLQkJCQkJCU9QSl9JTlQzMiB4ID0gY2Jsay0+eDAgLSBiYW5kLT54MDsKLQkJCQkJCU9QSl9JTlQzMiB5ID0gY2Jsay0+eTAgLSBiYW5kLT55MDsKLQkJCQkJCWlmIChiYW5kLT5iYW5kbm8gJiAxKSB7Ci0JCQkJCQkJb3BqX3RjZF9yZXNvbHV0aW9uX3QgKnByZXMgPSAmdGlsZWMtPnJlc29sdXRpb25zW3Jlc25vIC0gMV07Ci0JCQkJCQkJeCArPSBwcmVzLT54MSAtIHByZXMtPngwOwotCQkJCQkJfQotCQkJCQkJaWYgKGJhbmQtPmJhbmRubyAmIDIpIHsKLQkJCQkJCQlvcGpfdGNkX3Jlc29sdXRpb25fdCAqcHJlcyA9ICZ0aWxlYy0+cmVzb2x1dGlvbnNbcmVzbm8gLSAxXTsKLQkJCQkJCQl5ICs9IHByZXMtPnkxIC0gcHJlcy0+eTA7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmKCFvcGpfdDFfYWxsb2NhdGVfYnVmZmVycygKLQkJCQkJCQkJCXQxLAotCQkJCQkJCQkJKE9QSl9VSU5UMzIpKGNibGstPngxIC0gY2Jsay0+eDApLAotCQkJCQkJCQkJKE9QSl9VSU5UMzIpKGNibGstPnkxIC0gY2Jsay0+eTApKSkKLQkJCQkJCXsKLQkJCQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQkJCQkJfQotCi0JCQkJCQljYmxrX3cgPSB0MS0+dzsKLQkJCQkJCWNibGtfaCA9IHQxLT5oOwotCQkJCQkJdGlsZUxpbmVBZHZhbmNlID0gdGlsZV93IC0gY2Jsa193OwotCi0JCQkJCQl0aWxlZHA9JnRpbGVjLT5kYXRhWyhPUEpfVUlOVDMyKXkgKiB0aWxlX3cgKyAoT1BKX1VJTlQzMil4XTsKLQkJCQkJCXQxLT5kYXRhID0gdGlsZWRwOwotCQkJCQkJdDEtPmRhdGFfc3RyaWRlID0gdGlsZV93OwotCQkJCQkJaWYgKHRjY3AtPnFtZmJpZCA9PSAxKSB7Ci0JCQkJCQkJZm9yIChqID0gMDsgaiA8IGNibGtfaDsgKytqKSB7Ci0JCQkJCQkJCWZvciAoaSA9IDA7IGkgPCBjYmxrX3c7ICsraSkgewotCQkJCQkJCQkJdGlsZWRwW3RpbGVJbmRleF0gPDw9IFQxX05NU0VERUNfRlJBQ0JJVFM7Ci0JCQkJCQkJCQl0aWxlSW5kZXgrKzsKLQkJCQkJCQkJfQotCQkJCQkJCQl0aWxlSW5kZXggKz0gdGlsZUxpbmVBZHZhbmNlOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7CQkvKiBpZiAodGNjcC0+cW1mYmlkID09IDApICovCi0JCQkJCQkJZm9yIChqID0gMDsgaiA8IGNibGtfaDsgKytqKSB7Ci0JCQkJCQkJCWZvciAoaSA9IDA7IGkgPCBjYmxrX3c7ICsraSkgewotCQkJCQkJCQkJT1BKX0lOVDMyIHRtcCA9IHRpbGVkcFt0aWxlSW5kZXhdOwotCQkJCQkJCQkJdGlsZWRwW3RpbGVJbmRleF0gPQotCQkJCQkJCQkJCW9wal9pbnRfZml4X211bF90MSgKLQkJCQkJCQkJCQl0bXAsCi0JCQkJCQkJCQkJYmFuZGNvbnN0KTsKLQkJCQkJCQkJCXRpbGVJbmRleCsrOwotCQkJCQkJCQl9Ci0JCQkJCQkJCXRpbGVJbmRleCArPSB0aWxlTGluZUFkdmFuY2U7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlvcGpfdDFfZW5jb2RlX2NibGsoCi0JCQkJCQkJCXQxLAotCQkJCQkJCQljYmxrLAotCQkJCQkJCQliYW5kLT5iYW5kbm8sCi0JCQkJCQkJCWNvbXBubywKLQkJCQkJCQkJdGlsZWMtPm51bXJlc29sdXRpb25zIC0gMSAtIHJlc25vLAotCQkJCQkJCQl0Y2NwLT5xbWZiaWQsCi0JCQkJCQkJCWJhbmQtPnN0ZXBzaXplLAotCQkJCQkJCQl0Y2NwLT5jYmxrc3R5LAotCQkJCQkJCQl0aWxlLT5udW1jb21wcywKLQkJCQkJCQkJdGlsZSwKLQkJCQkJCQkJbWN0X25vcm1zLAotCQkJCQkJCQltY3RfbnVtY29tcHMpOwotCi0JCQkJCX0gLyogY2Jsa25vICovCi0JCQkJfSAvKiBwcmVjbm8gKi8KLQkJCX0gLyogYmFuZG5vICovCi0JCX0gLyogcmVzbm8gICovCi0JfSAvKiBjb21wbm8gICovCi0JcmV0dXJuIE9QSl9UUlVFOwotfQotCi0vKiogbW9kIGZpeGVkX3F1YWxpdHkgKi8KLXZvaWQgb3BqX3QxX2VuY29kZV9jYmxrKG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfY2Jsa19lbmNfdCogY2JsaywKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgb3JpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBjb21wbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBxbWZiaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQ2NCBzdGVwc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgY2Jsa3N0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbnVtY29tcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVfdCAqIHRpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUEpfRkxPQVQ2NCAqIG1jdF9ub3JtcywKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbWN0X251bWNvbXBzKQotewotCU9QSl9GTE9BVDY0IGN1bXdtc2VkZWMgPSAwLjA7Ci0KLQlvcGpfbXFjX3QgKm1xYyA9IHQxLT5tcWM7CS8qIE1RQyBjb21wb25lbnQgKi8KLQotCU9QSl9VSU5UMzIgcGFzc25vOwotCU9QSl9JTlQzMiBicG5vOwotCU9QSl9VSU5UMzIgcGFzc3R5cGU7Ci0JT1BKX0lOVDMyIG5tc2VkZWMgPSAwOwotCU9QSl9JTlQzMiBtYXg7Ci0JT1BKX1VJTlQzMiBpLCBqOwotCU9QSl9CWVRFIHR5cGUgPSBUMV9UWVBFX01ROwotCU9QSl9GTE9BVDY0IHRlbXB3bXNlZGVjOwotCi0JbWF4ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgdDEtPnc7ICsraSkgewotCQlmb3IgKGogPSAwOyBqIDwgdDEtPmg7ICsraikgewotCQkJT1BKX0lOVDMyIHRtcCA9IGFicyh0MS0+ZGF0YVtpICsgaip0MS0+ZGF0YV9zdHJpZGVdKTsKLQkJCW1heCA9IG9wal9pbnRfbWF4KG1heCwgdG1wKTsKLQkJfQotCX0KLQotCWNibGstPm51bWJwcyA9IG1heCA/IChPUEpfVUlOVDMyKSgob3BqX2ludF9mbG9vcmxvZzIobWF4KSArIDEpIC0gVDFfTk1TRURFQ19GUkFDQklUUykgOiAwOwotCi0JYnBubyA9IChPUEpfSU5UMzIpKGNibGstPm51bWJwcyAtIDEpOwotCXBhc3N0eXBlID0gMjsKLQotCW9wal9tcWNfcmVzZXRzdGF0ZXMobXFjKTsKLQlvcGpfbXFjX3NldHN0YXRlKG1xYywgVDFfQ1RYTk9fVU5JLCAwLCA0Nik7Ci0Jb3BqX21xY19zZXRzdGF0ZShtcWMsIFQxX0NUWE5PX0FHRywgMCwgMyk7Ci0Jb3BqX21xY19zZXRzdGF0ZShtcWMsIFQxX0NUWE5PX1pDLCAwLCA0KTsKLQlvcGpfbXFjX2luaXRfZW5jKG1xYywgY2Jsay0+ZGF0YSk7Ci0KLQlmb3IgKHBhc3NubyA9IDA7IGJwbm8gPj0gMDsgKytwYXNzbm8pIHsKLQkJb3BqX3RjZF9wYXNzX3QgKnBhc3MgPSAmY2Jsay0+cGFzc2VzW3Bhc3Nub107Ci0JCU9QSl9VSU5UMzIgY29ycmVjdGlvbiA9IDM7Ci0JCXR5cGUgPSAoKGJwbm8gPCAoKE9QSl9JTlQzMikgKGNibGstPm51bWJwcykgLSA0KSkgJiYgKHBhc3N0eXBlIDwgMikgJiYgKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfTEFaWSkpID8gVDFfVFlQRV9SQVcgOiBUMV9UWVBFX01ROwotCi0JCXN3aXRjaCAocGFzc3R5cGUpIHsKLQkJCWNhc2UgMDoKLQkJCQlvcGpfdDFfZW5jX3NpZ3Bhc3ModDEsIGJwbm8sIG9yaWVudCwgJm5tc2VkZWMsIHR5cGUsIGNibGtzdHkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCW9wal90MV9lbmNfcmVmcGFzcyh0MSwgYnBubywgJm5tc2VkZWMsIHR5cGUsIGNibGtzdHkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCW9wal90MV9lbmNfY2xucGFzcyh0MSwgYnBubywgb3JpZW50LCAmbm1zZWRlYywgY2Jsa3N0eSk7Ci0JCQkJLyogY29kZSBzd2l0Y2ggU0VHTUFSSyAoaS5lLiBTRUdTWU0pICovCi0JCQkJaWYgKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfU0VHU1lNKQotCQkJCQlvcGpfbXFjX3NlZ21hcmtfZW5jKG1xYyk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBmaXhlZF9xdWFsaXR5ICovCi0JCXRlbXB3bXNlZGVjID0gb3BqX3QxX2dldHdtc2VkZWMobm1zZWRlYywgY29tcG5vLCBsZXZlbCwgb3JpZW50LCBicG5vLCBxbWZiaWQsIHN0ZXBzaXplLCBudW1jb21wcyxtY3Rfbm9ybXMsIG1jdF9udW1jb21wcykgOwotCQljdW13bXNlZGVjICs9IHRlbXB3bXNlZGVjOwotCQl0aWxlLT5kaXN0b3RpbGUgKz0gdGVtcHdtc2VkZWM7Ci0KLQkJLyogQ29kZSBzd2l0Y2ggIlJFU1RBUlQiIChpLmUuIFRFUk1BTEwpICovCi0JCWlmICgoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9URVJNQUxMKQkmJiAhKChwYXNzdHlwZSA9PSAyKSAmJiAoYnBubyAtIDEgPCAwKSkpIHsKLQkJCWlmICh0eXBlID09IFQxX1RZUEVfUkFXKSB7Ci0JCQkJb3BqX21xY19mbHVzaChtcWMpOwotCQkJCWNvcnJlY3Rpb24gPSAxOwotCQkJCS8qIGNvcnJlY3Rpb24gPSBtcWNfYnlwYXNzX2ZsdXNoX2VuYygpOyAqLwotCQkJfSBlbHNlIHsJCQkvKiBjb3JyZWN0aW9uID0gbXFjX3Jlc3RhcnRfZW5jKCk7ICovCi0JCQkJb3BqX21xY19mbHVzaChtcWMpOwotCQkJCWNvcnJlY3Rpb24gPSAxOwotCQkJfQotCQkJcGFzcy0+dGVybSA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKChicG5vIDwgKChPUEpfSU5UMzIpIChjYmxrLT5udW1icHMpIC0gNCkgJiYgKHBhc3N0eXBlID4gMCkpCi0JCQkJfHwgKChicG5vID09ICgoT1BKX0lOVDMyKWNibGstPm51bWJwcyAtIDQpKSAmJiAocGFzc3R5cGUgPT0gMikpKSAmJiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9MQVpZKSkgewotCQkJCWlmICh0eXBlID09IFQxX1RZUEVfUkFXKSB7Ci0JCQkJCW9wal9tcWNfZmx1c2gobXFjKTsKLQkJCQkJY29ycmVjdGlvbiA9IDE7Ci0JCQkJCS8qIGNvcnJlY3Rpb24gPSBtcWNfYnlwYXNzX2ZsdXNoX2VuYygpOyAqLwotCQkJCX0gZWxzZSB7CQkvKiBjb3JyZWN0aW9uID0gbXFjX3Jlc3RhcnRfZW5jKCk7ICovCi0JCQkJCW9wal9tcWNfZmx1c2gobXFjKTsKLQkJCQkJY29ycmVjdGlvbiA9IDE7Ci0JCQkJfQotCQkJCXBhc3MtPnRlcm0gPSAxOwotCQkJfSBlbHNlIHsKLQkJCQlwYXNzLT50ZXJtID0gMDsKLQkJCX0KLQkJfQotCi0JCWlmICgrK3Bhc3N0eXBlID09IDMpIHsKLQkJCXBhc3N0eXBlID0gMDsKLQkJCWJwbm8tLTsKLQkJfQotCi0JCWlmIChwYXNzLT50ZXJtICYmIGJwbm8gPiAwKSB7Ci0JCQl0eXBlID0gKChicG5vIDwgKChPUEpfSU5UMzIpIChjYmxrLT5udW1icHMpIC0gNCkpICYmIChwYXNzdHlwZSA8IDIpICYmIChjYmxrc3R5ICYgSjJLX0NDUF9DQkxLU1RZX0xBWlkpKSA/IFQxX1RZUEVfUkFXIDogVDFfVFlQRV9NUTsKLQkJCWlmICh0eXBlID09IFQxX1RZUEVfUkFXKQotCQkJCW9wal9tcWNfYnlwYXNzX2luaXRfZW5jKG1xYyk7Ci0JCQllbHNlCi0JCQkJb3BqX21xY19yZXN0YXJ0X2luaXRfZW5jKG1xYyk7Ci0JCX0KLQotCQlwYXNzLT5kaXN0b3J0aW9uZGVjID0gY3Vtd21zZWRlYzsKLQkJcGFzcy0+cmF0ZSA9IG9wal9tcWNfbnVtYnl0ZXMobXFjKSArIGNvcnJlY3Rpb247CS8qIEZJWE1FICovCi0KLQkJLyogQ29kZS1zd2l0Y2ggIlJFU0VUIiAqLwotCQlpZiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9SRVNFVCkKLQkJCW9wal9tcWNfcmVzZXRfZW5jKG1xYyk7Ci0JfQotCi0JLyogQ29kZSBzd2l0Y2ggIkVSVEVSTSIgKGkuZS4gUFRFUk0pICovCi0JaWYgKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfUFRFUk0pCi0JCW9wal9tcWNfZXJ0ZXJtX2VuYyhtcWMpOwotCWVsc2UgLyogRGVmYXVsdCBjb2RpbmcgKi8gaWYgKCEoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9MQVpZKSkKLQkJb3BqX21xY19mbHVzaChtcWMpOwotCi0JY2Jsay0+dG90YWxwYXNzZXMgPSBwYXNzbm87Ci0KLQlmb3IgKHBhc3NubyA9IDA7IHBhc3NubzxjYmxrLT50b3RhbHBhc3NlczsgcGFzc25vKyspIHsKLQkJb3BqX3RjZF9wYXNzX3QgKnBhc3MgPSAmY2Jsay0+cGFzc2VzW3Bhc3Nub107Ci0JCWlmIChwYXNzLT5yYXRlID4gb3BqX21xY19udW1ieXRlcyhtcWMpKQotCQkJcGFzcy0+cmF0ZSA9IG9wal9tcWNfbnVtYnl0ZXMobXFjKTsKLQkJLypQcmV2ZW50aW5nIGdlbmVyYXRpb24gb2YgRkYgYXMgbGFzdCBkYXRhIGJ5dGUgb2YgYSBwYXNzKi8KLQkJaWYoKHBhc3MtPnJhdGU+MSkgJiYgKGNibGstPmRhdGFbcGFzcy0+cmF0ZSAtIDFdID09IDB4RkYpKXsKLQkJCXBhc3MtPnJhdGUtLTsKLQkJfQotCQlwYXNzLT5sZW4gPSBwYXNzLT5yYXRlIC0gKHBhc3NubyA9PSAwID8gMCA6IGNibGstPnBhc3Nlc1twYXNzbm8gLSAxXS5yYXRlKTsKLQl9Ci19Ci0KLSNpZiAwCi12b2lkIG9wal90MV9kZWNfcmVmcGFzc19zdGVwKCAgIG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3NwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKmRhdGFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcG9zaGFsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIG5lZ2hhbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdnNjKQotewotCU9QSl9JTlQzMiAgdDsKLQlPUEpfVUlOVDMyIHYsZmxhZzsKLQotCW9wal9tcWNfdCAqbXFjID0gdDEtPm1xYzsJLyogTVFDIGNvbXBvbmVudCAqLwotCW9wal9yYXdfdCAqcmF3ID0gdDEtPnJhdzsJLyogUkFXIGNvbXBvbmVudCAqLwotCi0JZmxhZyA9IHZzYyA/ICgoKmZsYWdzcCkgJiAofihUMV9TSUdfUyB8IFQxX1NJR19TRSB8IFQxX1NJR19TVyB8IFQxX1NHTl9TKSkpIDogKCpmbGFnc3ApOwotCWlmICgoZmxhZyAmIChUMV9TSUcgfCBUMV9WSVNJVCkpID09IFQxX1NJRykgewotCQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIG9wal90MV9nZXRjdHhub19tYWcoZmxhZykpOwkvKiBFU1NBSSAqLwotCQlpZiAodHlwZSA9PSBUMV9UWVBFX1JBVykgewotCQkJdiA9IG9wal9yYXdfZGVjb2RlKHJhdyk7Ci0JCX0gZWxzZSB7Ci0JCQl2ID0gb3BqX21xY19kZWNvZGUobXFjKTsKLQkJfQotCQl0ID0gdiA/IHBvc2hhbGYgOiBuZWdoYWxmOwotCQkqZGF0YXAgKz0gKmRhdGFwIDwgMCA/IC10IDogdDsKLQkJKmZsYWdzcCB8PSBUMV9SRUZJTkU7Ci0JfQotfQkJCQkvKiBWU0MgYW5kICBCWVBBU1MgYnkgQW50b25pbiAgKi8KLSNlbmRpZgotCi0KLQotI2lmIDAKLXZvaWQgb3BqX3QxX2RlY19zaWdwYXNzX3N0ZXAoICAgb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZmxhZ190ICpmbGFnc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgb3JpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgb25lcGx1c2hhbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdnNjKQotewotCU9QSl9VSU5UMzIgdiwgZmxhZzsKLQotCW9wal9yYXdfdCAqcmF3ID0gdDEtPnJhdzsJLyogUkFXIGNvbXBvbmVudCAqLwotCW9wal9tcWNfdCAqbXFjID0gdDEtPm1xYzsJLyogTVFDIGNvbXBvbmVudCAqLwotCi0JZmxhZyA9IHZzYyA/ICgoKmZsYWdzcCkgJiAofihUMV9TSUdfUyB8IFQxX1NJR19TRSB8IFQxX1NJR19TVyB8IFQxX1NHTl9TKSkpIDogKCpmbGFnc3ApOwotCWlmICgoZmxhZyAmIFQxX1NJR19PVEgpICYmICEoZmxhZyAmIChUMV9TSUcgfCBUMV9WSVNJVCkpKSB7Ci0JCWlmICh0eXBlID09IFQxX1RZUEVfUkFXKSB7Ci0JCQlpZiAob3BqX3Jhd19kZWNvZGUocmF3KSkgewotCQkJCXYgPSBvcGpfcmF3X2RlY29kZShyYXcpOwkvKiBFU1NBSSAqLwotCQkJCSpkYXRhcCA9IHYgPyAtb25lcGx1c2hhbGYgOiBvbmVwbHVzaGFsZjsKLQkJCQlvcGpfdDFfdXBkYXRlZmxhZ3MoZmxhZ3NwLCB2LCB0MS0+ZmxhZ3Nfc3RyaWRlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW9wal9tcWNfc2V0Y3VyY3R4KG1xYywgb3BqX3QxX2dldGN0eG5vX3pjKGZsYWcsIG9yaWVudCkpOwotCQkJaWYgKG9wal9tcWNfZGVjb2RlKG1xYykpIHsKLQkJCQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIG9wal90MV9nZXRjdHhub19zYyhmbGFnKSk7Ci0JCQkJdiA9IG9wal9tcWNfZGVjb2RlKG1xYykgXiBvcGpfdDFfZ2V0c3BiKGZsYWcpOwotCQkJCSpkYXRhcCA9IHYgPyAtb25lcGx1c2hhbGYgOiBvbmVwbHVzaGFsZjsKLQkJCQlvcGpfdDFfdXBkYXRlZmxhZ3MoZmxhZ3NwLCB2LCB0MS0+ZmxhZ3Nfc3RyaWRlKTsKLQkJCX0KLQkJfQotCQkqZmxhZ3NwIHw9IFQxX1ZJU0lUOwotCX0KLX0JCQkJLyogVlNDIGFuZCAgQllQQVNTIGJ5IEFudG9uaW4gKi8KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL3QyLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvdDIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwYWM5MS4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvdDIuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNzMgKzAsMCBAQAotLyoKLSAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzIAotICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIAotICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cwotICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBVbml2ZXJzaXRlIGNhdGhvbGlxdWUgZGUgTG91dmFpbiAoVUNMKSwgQmVsZ2l1bQotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFByb2Zlc3NvciBCZW5vaXQgTWFjcQotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMsIERhdmlkIEphbnNzZW5zCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgWWFubmljayBWZXJzY2h1ZXJlbgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4IAotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTQsIEFudG9uaW4gRGVzY2FtcGUKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExLTIwMTIsIENlbnRyZSBOYXRpb25hbCBkJ0V0dWRlcyBTcGF0aWFsZXMgKENORVMpLCBGUiAKLSAqIENvcHlyaWdodCAoYykgMjAxMiwgQ1MgU3lzdGVtZXMgZCdJbmZvcm1hdGlvbiwgRnJhbmNlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKLSAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJvcGpfaW5jbHVkZXMuaCIKLQotLyoqIEBkZWZncm91cCBUMiBUMiAtIEltcGxlbWVudGF0aW9uIG9mIGEgdGllci0yIGNvZGluZyAqLwotLypAeyovCi0KLS8qKiBAbmFtZSBMb2NhbCBzdGF0aWMgZnVuY3Rpb25zICovCi0vKkB7Ki8KLQotc3RhdGljIHZvaWQgb3BqX3QyX3B1dGNvbW1hY29kZShvcGpfYmlvX3QgKmJpbywgT1BKX0lOVDMyIG4pOwotCi1zdGF0aWMgT1BKX1VJTlQzMiBvcGpfdDJfZ2V0Y29tbWFjb2RlKG9wal9iaW9fdCAqYmlvKTsgCi0vKioKLVZhcmlhYmxlIGxlbmd0aCBjb2RlIGZvciBzaWduYWxsaW5nIGRlbHRhIFppbCAodHJ1bmNhdGlvbiBwb2ludCkKLUBwYXJhbSBiaW8gIEJpdCBJbnB1dC9PdXRwdXQgY29tcG9uZW50Ci1AcGFyYW0gbiAgICBkZWx0YSBaaWwKLSovCi1zdGF0aWMgdm9pZCBvcGpfdDJfcHV0bnVtcGFzc2VzKG9wal9iaW9fdCAqYmlvLCBPUEpfVUlOVDMyIG4pOwotc3RhdGljIE9QSl9VSU5UMzIgb3BqX3QyX2dldG51bXBhc3NlcyhvcGpfYmlvX3QgKmJpbyk7Ci0KLS8qKgotRW5jb2RlIGEgcGFja2V0IG9mIGEgdGlsZSB0byBhIGRlc3RpbmF0aW9uIGJ1ZmZlcgotQHBhcmFtIHRpbGVubyBOdW1iZXIgb2YgdGhlIHRpbGUgZW5jb2RlZAotQHBhcmFtIHRpbGUgVGlsZSBmb3Igd2hpY2ggdG8gd3JpdGUgdGhlIHBhY2tldHMKLUBwYXJhbSB0Y3AgVGlsZSBjb2RpbmcgcGFyYW1ldGVycwotQHBhcmFtIHBpIFBhY2tldCBpZGVudGl0eQotQHBhcmFtIGRlc3QgRGVzdGluYXRpb24gYnVmZmVyCi1AcGFyYW0gcF9kYXRhX3dyaXR0ZW4gICBGSVhNRSBET0MKLUBwYXJhbSBsZW4gTGVuZ3RoIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLUBwYXJhbSBjc3RyX2luZm8gQ29kZXN0cmVhbSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKLUByZXR1cm4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX3QyX2VuY29kZV9wYWNrZXQoICAgT1BKX1VJTlQzMiB0aWxlbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlX3QgKnRpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjcF90ICp0Y3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2l0ZXJhdG9yX3QgKnBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmZvX3QgKmNzdHJfaW5mbyk7Ci0KLS8qKgotRGVjb2RlIGEgcGFja2V0IG9mIGEgdGlsZSBmcm9tIGEgc291cmNlIGJ1ZmZlcgotQHBhcmFtIHQyIFQyIGhhbmRsZQotQHBhcmFtIHRpbGUgVGlsZSBmb3Igd2hpY2ggdG8gd3JpdGUgdGhlIHBhY2tldHMKLUBwYXJhbSB0Y3AgVGlsZSBjb2RpbmcgcGFyYW1ldGVycwotQHBhcmFtIHBpIFBhY2tldCBpZGVudGl0eQotQHBhcmFtIHNyYyBTb3VyY2UgYnVmZmVyCi1AcGFyYW0gZGF0YV9yZWFkICAgRklYTUUgRE9DCi1AcGFyYW0gbWF4X2xlbmd0aCAgRklYTUUgRE9DCi1AcGFyYW0gcGFja19pbmZvIFBhY2tldCBpbmZvcm1hdGlvbgotCi1AcmV0dXJuICBGSVhNRSBET0MKLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX3QyX2RlY29kZV9wYWNrZXQoICAgb3BqX3QyX3QqIHQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICp0aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y3BfdCAqdGNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9waV9pdGVyYXRvcl90ICpwaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBkYXRhX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBtYXhfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9wYWNrZXRfaW5mb190ICpwYWNrX2luZm8pOwotCi1zdGF0aWMgT1BKX0JPT0wgb3BqX3QyX3NraXBfcGFja2V0KCBvcGpfdDJfdCogcF90MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICpwX3RpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNwX3QgKnBfdGNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2l0ZXJhdG9yX3QgKnBfcGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqcF9zcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9wYWNrZXRfaW5mb190ICpwX3BhY2tfaW5mbyk7Ci0KLXN0YXRpYyBPUEpfQk9PTCBvcGpfdDJfcmVhZF9wYWNrZXRfaGVhZGVyKCAgb3BqX3QyX3QqIHBfdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICpwX3RpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y3BfdCAqcF90Y3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9waV9pdGVyYXRvcl90ICpwX3BpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQk9PTCAqIHBfaXNfZGF0YV9wcmVzZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqcF9zcmNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV9yZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BhY2tldF9pbmZvX3QgKnBfcGFja19pbmZvKTsKLQotc3RhdGljIE9QSl9CT09MIG9wal90Ml9yZWFkX3BhY2tldF9kYXRhKG9wal90Ml90KiBwX3QyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICpwX3RpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2l0ZXJhdG9yX3QgKnBfcGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKnBfc3JjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV9yZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9wYWNrZXRfaW5mb190ICpwYWNrX2luZm8pOwotCi1zdGF0aWMgT1BKX0JPT0wgb3BqX3QyX3NraXBfcGFja2V0X2RhdGEob3BqX3QyX3QqIHBfdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlX3QgKnBfdGlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfaXRlcmF0b3JfdCAqcF9waSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BhY2tldF9pbmZvX3QgKnBhY2tfaW5mbyk7Ci0KLS8qKgotQHBhcmFtIGNibGsKLUBwYXJhbSBpbmRleAotQHBhcmFtIGNibGtzdHkKLUBwYXJhbSBmaXJzdAotKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfdDJfaW5pdF9zZWcoICAgIG9wal90Y2RfY2Jsa19kZWNfdCogY2JsaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNibGtzdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGZpcnN0KTsKLQotLypAfSovCi0KLS8qQH0qLwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiAjZGVmaW5lIFJFU1RBUlQgMHgwNCAqLwotc3RhdGljIHZvaWQgb3BqX3QyX3B1dGNvbW1hY29kZShvcGpfYmlvX3QgKmJpbywgT1BKX0lOVDMyIG4pIHsKLSAgICAgICAgd2hpbGUgKC0tbiA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2Jpb193cml0ZShiaW8sIDEsIDEpOwotICAgICAgICB9Ci0gICAgICAgIG9wal9iaW9fd3JpdGUoYmlvLCAwLCAxKTsKLX0KLQotT1BKX1VJTlQzMiBvcGpfdDJfZ2V0Y29tbWFjb2RlKG9wal9iaW9fdCAqYmlvKSAKLXsKLSAgICBPUEpfVUlOVDMyIG4gPSAwOwotICAgIHdoaWxlIChvcGpfYmlvX3JlYWQoYmlvLCAxKSkgewotCSAgICArK247Ci0gICAgfQotICAgIHJldHVybiBuOwotfQotCi12b2lkIG9wal90Ml9wdXRudW1wYXNzZXMob3BqX2Jpb190ICpiaW8sIE9QSl9VSU5UMzIgbikgewotICAgICAgICBpZiAobiA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2Jpb193cml0ZShiaW8sIDAsIDEpOwotICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMikgewotICAgICAgICAgICAgICAgIG9wal9iaW9fd3JpdGUoYmlvLCAyLCAyKTsKLSAgICAgICAgfSBlbHNlIGlmIChuIDw9IDUpIHsKLSAgICAgICAgICAgICAgICBvcGpfYmlvX3dyaXRlKGJpbywgMHhjIHwgKG4gLSAzKSwgNCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobiA8PSAzNikgewotICAgICAgICAgICAgICAgIG9wal9iaW9fd3JpdGUoYmlvLCAweDFlMCB8IChuIC0gNiksIDkpOwotICAgICAgICB9IGVsc2UgaWYgKG4gPD0gMTY0KSB7Ci0gICAgICAgICAgICAgICAgb3BqX2Jpb193cml0ZShiaW8sIDB4ZmY4MCB8IChuIC0gMzcpLCAxNik7Ci0gICAgICAgIH0KLX0KLQotT1BKX1VJTlQzMiBvcGpfdDJfZ2V0bnVtcGFzc2VzKG9wal9iaW9fdCAqYmlvKSB7Ci0gICAgICAgIE9QSl9VSU5UMzIgbjsKLSAgICAgICAgaWYgKCFvcGpfYmlvX3JlYWQoYmlvLCAxKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgaWYgKCFvcGpfYmlvX3JlYWQoYmlvLCAxKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgaWYgKChuID0gb3BqX2Jpb19yZWFkKGJpbywgMikpICE9IDMpCi0gICAgICAgICAgICAgICAgcmV0dXJuICgzICsgbik7Ci0gICAgICAgIGlmICgobiA9IG9wal9iaW9fcmVhZChiaW8sIDUpKSAhPSAzMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKDYgKyBuKTsKLSAgICAgICAgcmV0dXJuICgzNyArIG9wal9iaW9fcmVhZChiaW8sIDcpKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotT1BKX0JPT0wgb3BqX3QyX2VuY29kZV9wYWNrZXRzKCBvcGpfdDJfdCogcF90MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICpwX3RpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhsYXllcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpwX2Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZm9fdCAqY3N0cl9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdHBfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcF90cF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9waW5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKMktfVDJfTU9ERSBwX3QyX21vZGUpCi17Ci0gICAgICAgIE9QSl9CWVRFICpsX2N1cnJlbnRfZGF0YSA9IHBfZGVzdDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX2J5dGVzID0gMDsKLSAgICAgICAgT1BKX1VJTlQzMiBjb21wbm87Ci0gICAgICAgIE9QSl9VSU5UMzIgcG9jOwotICAgICAgICBvcGpfcGlfaXRlcmF0b3JfdCAqbF9waSA9IDAwOwotICAgICAgICBvcGpfcGlfaXRlcmF0b3JfdCAqbF9jdXJyZW50X3BpID0gMDA7Ci0gICAgICAgIG9wal9pbWFnZV90ICpsX2ltYWdlID0gcF90Mi0+aW1hZ2U7Ci0gICAgICAgIG9wal9jcF90ICpsX2NwID0gcF90Mi0+Y3A7Ci0gICAgICAgIG9wal90Y3BfdCAqbF90Y3AgPSAmbF9jcC0+dGNwc1twX3RpbGVfbm9dOwotICAgICAgICBPUEpfVUlOVDMyIHBvY25vID0gKGxfY3AtPnJzaXogPT0gT1BKX1BST0ZJTEVfQ0lORU1BXzRLKT8gMjogMTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX21heF9jb21wID0gbF9jcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX21heF9jb21wX3NpemUgPiAwID8gbF9pbWFnZS0+bnVtY29tcHMgOiAxOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfcG9jcyA9IGxfdGNwLT5udW1wb2NzICsgMTsKLQotICAgICAgICBsX3BpID0gb3BqX3BpX2luaXRpYWxpc2VfZW5jb2RlKGxfaW1hZ2UsIGxfY3AsIHBfdGlsZV9ubywgcF90Ml9tb2RlKTsKLSAgICAgICAgaWYgKCFsX3BpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgICogcF9kYXRhX3dyaXR0ZW4gPSAwOwotCi0gICAgICAgIGlmIChwX3QyX21vZGUgPT0gVEhSRVNIX0NBTEMgKXsgLyogQ2FsY3VsYXRpbmcgdGhyZXNob2xkICovCi0gICAgICAgICAgICAgICAgbF9jdXJyZW50X3BpID0gbF9waTsKLQotICAgICAgICAgICAgICAgIGZvciAgICAgKGNvbXBubyA9IDA7IGNvbXBubyA8IGxfbWF4X2NvbXA7ICsrY29tcG5vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxfY29tcF9sZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X3BpID0gbF9waTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChwb2MgPSAwOyBwb2MgPCBwb2NubyA7ICsrcG9jKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbF90cF9udW0gPSBjb21wbm87Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyBNU0QgOiBjaGVjayB3aHkgdGhpcyBmdW5jdGlvbiBjYW5ub3QgZmFpbCAoY2YuIHYxKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfY3JlYXRlX2VuY29kZShsX3BpLCBsX2NwLHBfdGlsZV9ubyxwb2MsbF90cF9udW0scF90cF9wb3MscF90Ml9tb2RlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9jdXJyZW50X3BpLT5wb2MucHJnID09IE9QSl9QUk9HX1VOS05PV04pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gQURFIDogYWRkIGFuIGVycm9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfZGVzdHJveShsX3BpLCBsX25iX3BvY3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAob3BqX3BpX25leHQobF9jdXJyZW50X3BpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2N1cnJlbnRfcGktPmxheW5vIDwgcF9tYXhsYXllcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfbmJfYnl0ZXMgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBvcGpfdDJfZW5jb2RlX3BhY2tldChwX3RpbGVfbm8scF90aWxlLCBsX3RjcCwgbF9jdXJyZW50X3BpLCBsX2N1cnJlbnRfZGF0YSwgJmxfbmJfYnl0ZXMsIHBfbWF4X2xlbiwgY3N0cl9pbmZvKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfZGVzdHJveShsX3BpLCBsX25iX3BvY3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NvbXBfbGVuICs9IGxfbmJfYnl0ZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSBsX25iX2J5dGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYXhfbGVuIC09IGxfbmJfYnl0ZXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcF9kYXRhX3dyaXR0ZW4gKz0gbF9uYl9ieXRlczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9jcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX21heF9jb21wX3NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9jb21wX2xlbiA+IGxfY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9tYXhfY29tcF9zaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfZGVzdHJveShsX3BpLCBsX25iX3BvY3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfY3VycmVudF9waTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7ICAvKiB0Ml9tb2RlID09IEZJTkFMX1BBU1MgICovCi0gICAgICAgICAgICAgICAgb3BqX3BpX2NyZWF0ZV9lbmNvZGUobF9waSwgbF9jcCxwX3RpbGVfbm8scF9waW5vLHBfdHBfbnVtLHBfdHBfcG9zLHBfdDJfbW9kZSk7Ci0KLSAgICAgICAgICAgICAgICBsX2N1cnJlbnRfcGkgPSAmbF9waVtwX3Bpbm9dOwotICAgICAgICAgICAgICAgIGlmIChsX2N1cnJlbnRfcGktPnBvYy5wcmcgPT0gT1BKX1BST0dfVU5LTk9XTikgewotICAgICAgICAgICAgICAgICAgICAvKiBUT0RPIEFERSA6IGFkZCBhbiBlcnJvciAqLwotICAgICAgICAgICAgICAgICAgICBvcGpfcGlfZGVzdHJveShsX3BpLCBsX25iX3BvY3MpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3aGlsZSAob3BqX3BpX25leHQobF9jdXJyZW50X3BpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfY3VycmVudF9waS0+bGF5bm8gPCBwX21heGxheWVycykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX25iX2J5dGVzPTA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgb3BqX3QyX2VuY29kZV9wYWNrZXQocF90aWxlX25vLHBfdGlsZSwgbF90Y3AsIGxfY3VycmVudF9waSwgbF9jdXJyZW50X2RhdGEsICZsX25iX2J5dGVzLCBwX21heF9sZW4sIGNzdHJfaW5mbykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfZGVzdHJveShsX3BpLCBsX25iX3BvY3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSBsX25iX2J5dGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21heF9sZW4gLT0gbF9uYl9ieXRlczsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBfZGF0YV93cml0dGVuICs9IGxfbmJfYnl0ZXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSU5ERVggPj4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY3N0cl9pbmZvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY3N0cl9pbmZvLT5pbmRleF93cml0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RpbGVfaW5mb190ICppbmZvX1RMID0gJmNzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BhY2tldF9pbmZvX3QgKmluZm9fUEsgPSAmaW5mb19UTC0+cGFja2V0W2NzdHJfaW5mby0+cGFja25vXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3N0cl9pbmZvLT5wYWNrbm8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19QSy0+c3RhcnRfcG9zID0gaW5mb19UTC0+ZW5kX2hlYWRlciArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX1BLLT5zdGFydF9wb3MgPSAoKGxfY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV90cF9vbiB8IGxfdGNwLT5QT0MpJiYgaW5mb19QSy0+c3RhcnRfcG9zKSA/IGluZm9fUEstPnN0YXJ0X3BvcyA6IGluZm9fVEwtPnBhY2tldFtjc3RyX2luZm8tPnBhY2tubyAtIDFdLmVuZF9wb3MgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19QSy0+ZW5kX3BvcyA9IGluZm9fUEstPnN0YXJ0X3BvcyArIGxfbmJfYnl0ZXMgLSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19QSy0+ZW5kX3BoX3BvcyArPSBpbmZvX1BLLT5zdGFydF9wb3MgLSAxOyAgLyogRW5kIG9mIHBhY2tldCBoZWFkZXIgd2hpY2ggbm93IG9ubHkgcmVwcmVzZW50cyB0aGUgZGlzdGFuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHN0YXJ0IG9mIHBhY2tldCBpcyBpbmNyZW1lbnRlZCBieSB2YWx1ZSBvZiBzdGFydCBvZiBwYWNrZXQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5mby0+cGFja25vKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogPDwgSU5ERVggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytwX3RpbGUtPnBhY2tubzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBvcGpfcGlfZGVzdHJveShsX3BpLCBsX25iX3BvY3MpOwotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotLyogc2VlIGlzc3VlIDgwICovCi0jaWYgMAotI2RlZmluZSBKQVNfRlBSSU5URiBmcHJpbnRmCi0jZWxzZQotLyogaXNzdWUgMjkwICovCi1zdGF0aWMgdm9pZCBvcGpfbnVsbF9qYXNfZnByaW50ZihGSUxFKiBmaWxlLCBjb25zdCBjaGFyICogZm9ybWF0LCAuLi4pCi17Ci0gICh2b2lkKWZpbGU7Ci0gICh2b2lkKWZvcm1hdDsKLX0KLSNkZWZpbmUgSkFTX0ZQUklOVEYgb3BqX251bGxfamFzX2ZwcmludGYKLSNlbmRpZgotCi1PUEpfQk9PTCBvcGpfdDJfZGVjb2RlX3BhY2tldHMoIG9wal90Ml90ICpwX3QyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9ubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlX3QgKnBfdGlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKnBfc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmRleF90ICpwX2NzdHJfaW5kZXgpCi17Ci0gICAgICAgIE9QSl9CWVRFICpsX2N1cnJlbnRfZGF0YSA9IHBfc3JjOwotICAgICAgICBvcGpfcGlfaXRlcmF0b3JfdCAqbF9waSA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIHBpbm87Ci0gICAgICAgIG9wal9pbWFnZV90ICpsX2ltYWdlID0gcF90Mi0+aW1hZ2U7Ci0gICAgICAgIG9wal9jcF90ICpsX2NwID0gcF90Mi0+Y3A7Ci0gICAgICAgIG9wal90Y3BfdCAqbF90Y3AgPSAmKHBfdDItPmNwLT50Y3BzW3BfdGlsZV9ub10pOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfYnl0ZXNfcmVhZDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX3BvY3MgPSBsX3RjcC0+bnVtcG9jcyArIDE7Ci0gICAgICAgIG9wal9waV9pdGVyYXRvcl90ICpsX2N1cnJlbnRfcGkgPSAwMDsKLSNpZmRlZiBUT0RPX01TRAotICAgICAgICBPUEpfVUlOVDMyIGN1cnRwID0gMDsKLSAgICAgICAgT1BKX1VJTlQzMiB0cF9zdGFydF9wYWNrbm87Ci0jZW5kaWYgCi0gICAgICAgIG9wal9wYWNrZXRfaW5mb190ICpsX3BhY2tfaW5mbyA9IDAwOwotICAgICAgICBvcGpfaW1hZ2VfY29tcF90KiBsX2ltZ19jb21wID0gMDA7Ci0KLSAgICAgICAgT1BKX0FSR19OT1RfVVNFRChwX2NzdHJfaW5kZXgpOwotCi0jaWZkZWYgVE9ET19NU0QKLSAgICAgICAgaWYgKHBfY3N0cl9pbmRleCkgewotICAgICAgICAgICAgICAgIGxfcGFja19pbmZvID0gcF9jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfdGlsZV9ub10ucGFja2V0OwotICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAvKiBjcmVhdGUgYSBwYWNrZXQgaXRlcmF0b3IgKi8KLSAgICAgICAgbF9waSA9IG9wal9waV9jcmVhdGVfZGVjb2RlKGxfaW1hZ2UsIGxfY3AsIHBfdGlsZV9ubyk7Ci0gICAgICAgIGlmICghbF9waSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGxfY3VycmVudF9waSA9IGxfcGk7Ci0KLSAgICAgICAgZm9yICAgICAocGlubyA9IDA7IHBpbm8gPD0gbF90Y3AtPm51bXBvY3M7ICsrcGlubykgewotCi0gICAgICAgICAgICAgICAgLyogaWYgdGhlIHJlc29sdXRpb24gbmVlZGVkIGlzIHRvbyBsb3csIG9uZSBkaW0gb2YgdGhlIHRpbGVjIGNvdWxkIGJlIGVxdWFsIHRvIHplcm8KLSAgICAgICAgICAgICAgICAgKiBhbmQgbm8gcGFja2V0cyBhcmUgdXNlZCB0byBkZWNvZGUgdGhpcyByZXNvbHV0aW9uIGFuZAotICAgICAgICAgICAgICAgICAqIGxfY3VycmVudF9waS0+cmVzbm8gaXMgYWx3YXlzID49IHBfdGlsZS0+Y29tcHNbbF9jdXJyZW50X3BpLT5jb21wbm9dLm1pbmltdW1fbnVtX3Jlc29sdXRpb25zCi0gICAgICAgICAgICAgICAgICogYW5kIG5vIGxfaW1nX2NvbXAtPnJlc25vX2RlY29kZWQgYXJlIGNvbXB1dGVkCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgT1BKX0JPT0wqIGZpcnN0X3Bhc3NfZmFpbGVkID0gTlVMTDsKLQkJCQkJCi0gICAgICAgICAgICAgICAgaWYgKGxfY3VycmVudF9waS0+cG9jLnByZyA9PSBPUEpfUFJPR19VTktOT1dOKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gQURFIDogYWRkIGFuIGVycm9yICovCi0gICAgICAgICAgICAgICAgICAgIG9wal9waV9kZXN0cm95KGxfcGksIGxfbmJfcG9jcyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotCQkJCQkKLSAgICAgICAgICAgICAgICBmaXJzdF9wYXNzX2ZhaWxlZCA9IChPUEpfQk9PTCopb3BqX21hbGxvYyhsX2ltYWdlLT5udW1jb21wcyAqIHNpemVvZihPUEpfQk9PTCkpOwotICAgICAgICAgICAgICAgIGlmICghZmlyc3RfcGFzc19mYWlsZWQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvcGpfcGlfZGVzdHJveShsX3BpLGxfbmJfcG9jcyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbXNldChmaXJzdF9wYXNzX2ZhaWxlZCwgT1BKX1RSVUUsIGxfaW1hZ2UtPm51bWNvbXBzICogc2l6ZW9mKE9QSl9CT09MKSk7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAob3BqX3BpX25leHQobF9jdXJyZW50X3BpKSkgewotICAgICAgICAgICAgICAgICAgSkFTX0ZQUklOVEYoIHN0ZGVyciwgInBhY2tldCBvZmZzZXQ9MDAwMDAxNjYgcHJnPSVkIGNtcHRubz0lMDJkIHJsdmxubz0lMDJkIHByY25vPSUwM2QgbHlybm89JTAyZFxuXG4iLAotICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfcGktPnBvYy5wcmcxLCBsX2N1cnJlbnRfcGktPmNvbXBubywgbF9jdXJyZW50X3BpLT5yZXNubywgbF9jdXJyZW50X3BpLT5wcmVjbm8sIGxfY3VycmVudF9waS0+bGF5bm8gKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfdGNwLT5udW1fbGF5ZXJzX3RvX2RlY29kZSA+IGxfY3VycmVudF9waS0+bGF5bm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsX2N1cnJlbnRfcGktPnJlc25vIDwgcF90aWxlLT5jb21wc1tsX2N1cnJlbnRfcGktPmNvbXBub10ubWluaW11bV9udW1fcmVzb2x1dGlvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9uYl9ieXRlc19yZWFkID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9wYXNzX2ZhaWxlZFtsX2N1cnJlbnRfcGktPmNvbXBub10gPSBPUEpfRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgb3BqX3QyX2RlY29kZV9wYWNrZXQocF90MixwX3RpbGUsbF90Y3AsbF9jdXJyZW50X3BpLGxfY3VycmVudF9kYXRhLCZsX25iX2J5dGVzX3JlYWQscF9tYXhfbGVuLGxfcGFja19pbmZvKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9waV9kZXN0cm95KGxfcGksbF9uYl9wb2NzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShmaXJzdF9wYXNzX2ZhaWxlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAgPSAmKGxfaW1hZ2UtPmNvbXBzW2xfY3VycmVudF9waS0+Y29tcG5vXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPnJlc25vX2RlY29kZWQgPSBvcGpfdWludF9tYXgobF9jdXJyZW50X3BpLT5yZXNubywgbF9pbWdfY29tcC0+cmVzbm9fZGVjb2RlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9uYl9ieXRlc19yZWFkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgb3BqX3QyX3NraXBfcGFja2V0KHBfdDIscF90aWxlLGxfdGNwLGxfY3VycmVudF9waSxsX2N1cnJlbnRfZGF0YSwmbF9uYl9ieXRlc19yZWFkLHBfbWF4X2xlbixsX3BhY2tfaW5mbykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfZGVzdHJveShsX3BpLGxfbmJfcG9jcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUoZmlyc3RfcGFzc19mYWlsZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0X3Bhc3NfZmFpbGVkW2xfY3VycmVudF9waS0+Y29tcG5vXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2ltZ19jb21wID0gJihsX2ltYWdlLT5jb21wc1tsX2N1cnJlbnRfcGktPmNvbXBub10pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9pbWdfY29tcC0+cmVzbm9fZGVjb2RlZCA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPnJlc25vX2RlY29kZWQgPSBwX3RpbGUtPmNvbXBzW2xfY3VycmVudF9waS0+Y29tcG5vXS5taW5pbXVtX251bV9yZXNvbHV0aW9ucyAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9kYXRhICs9IGxfbmJfYnl0ZXNfcmVhZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfbWF4X2xlbiAtPSBsX25iX2J5dGVzX3JlYWQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIElOREVYID4+ICovCi0jaWZkZWYgVE9ET19NU0QKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBfY3N0cl9pbmZvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90aWxlX2luZm9fdjJfdCAqaW5mb19UTCA9ICZwX2NzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGFja2V0X2luZm9fdCAqaW5mb19QSyA9ICZpbmZvX1RMLT5wYWNrZXRbcF9jc3RyX2luZm8tPnBhY2tub107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwX3N0YXJ0X3BhY2tubyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcF9jc3RyX2luZm8tPnBhY2tubykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fUEstPnN0YXJ0X3BvcyA9IGluZm9fVEwtPmVuZF9oZWFkZXIgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluZm9fVEwtPnBhY2tldFtwX2NzdHJfaW5mby0+cGFja25vLTFdLmVuZF9wb3MgPj0gKE9QSl9JTlQzMilwX2NzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dLnRwW2N1cnRwXS50cF9lbmRfcG9zKXsgLyogTmV3IHRpbGUgcGFydCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fVEwtPnRwW2N1cnRwXS50cF9udW1wYWNrcyA9IHBfY3N0cl9pbmZvLT5wYWNrbm8gLSB0cF9zdGFydF9wYWNrbm87IC8qIE51bWJlciBvZiBwYWNrZXRzIGluIHByZXZpb3VzIHRpbGUtcGFydCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwX3N0YXJ0X3BhY2tubyA9IHBfY3N0cl9pbmZvLT5wYWNrbm87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VydHArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX1BLLT5zdGFydF9wb3MgPSBwX2NzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dLnRwW2N1cnRwXS50cF9lbmRfaGVhZGVyKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19QSy0+c3RhcnRfcG9zID0gKGxfY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV90cF9vbiAmJiBpbmZvX1BLLT5zdGFydF9wb3MpID8gaW5mb19QSy0+c3RhcnRfcG9zIDogaW5mb19UTC0+cGFja2V0W3BfY3N0cl9pbmZvLT5wYWNrbm8gLSAxXS5lbmRfcG9zICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX1BLLT5lbmRfcG9zID0gaW5mb19QSy0+c3RhcnRfcG9zICsgbF9uYl9ieXRlc19yZWFkIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19QSy0+ZW5kX3BoX3BvcyArPSBpbmZvX1BLLT5zdGFydF9wb3MgLSAxOyAgLyogRW5kIG9mIHBhY2tldCBoZWFkZXIgd2hpY2ggbm93IG9ubHkgcmVwcmVzZW50cyB0aGUgZGlzdGFuY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytwX2NzdHJfaW5mby0+cGFja25vOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiA8PCBJTkRFWCAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICArK2xfY3VycmVudF9waTsKLQotICAgICAgICAgICAgICAgIG9wal9mcmVlKGZpcnN0X3Bhc3NfZmFpbGVkKTsKLSAgICAgICAgfQotICAgICAgICAvKiBJTkRFWCA+PiAqLwotI2lmZGVmIFRPRE9fTVNECi0gICAgICAgIGlmCi0gICAgICAgICAgICAgICAgKHBfY3N0cl9pbmZvKSB7Ci0gICAgICAgICAgICAgICAgcF9jc3RyX2luZm8tPnRpbGVbcF90aWxlX25vXS50cFtjdXJ0cF0udHBfbnVtcGFja3MgPSBwX2NzdHJfaW5mby0+cGFja25vIC0gdHBfc3RhcnRfcGFja25vOyAvKiBOdW1iZXIgb2YgcGFja2V0cyBpbiBsYXN0IHRpbGUtcGFydCAqLwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgLyogPDwgSU5ERVggKi8KLQotICAgICAgICAvKiBkb24ndCBmb3JnZXQgdG8gcmVsZWFzZSBwaSAqLwotICAgICAgICBvcGpfcGlfZGVzdHJveShsX3BpLGxfbmJfcG9jcyk7Ci0gICAgICAgICpwX2RhdGFfcmVhZCA9IChPUEpfVUlOVDMyKShsX2N1cnJlbnRfZGF0YSAtIHBfc3JjKTsKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKioKLSAqIENyZWF0ZXMgYSBUaWVyIDIgaGFuZGxlCi0gKgotICogQHBhcmFtICAgICAgIHBfaW1hZ2UgICAgICAgICBTb3VyY2Ugb3IgZGVzdGluYXRpb24gaW1hZ2UKLSAqIEBwYXJhbSAgICAgICBwX2NwICAgICAgICAgICAgSW1hZ2UgY29kaW5nIHBhcmFtZXRlcnMuCi0gKiBAcmV0dXJuICAgICAgICAgICAgICBhIG5ldyBUMiBoYW5kbGUgaWYgc3VjY2Vzc2Z1bCwgTlVMTCBvdGhlcndpc2UuCi0qLwotb3BqX3QyX3QqIG9wal90Ml9jcmVhdGUob3BqX2ltYWdlX3QgKnBfaW1hZ2UsIG9wal9jcF90ICpwX2NwKQotewotICAgICAgICAvKiBjcmVhdGUgdGhlIHQyIHN0cnVjdHVyZSAqLwotICAgICAgICBvcGpfdDJfdCAqbF90MiA9IChvcGpfdDJfdCopb3BqX2NhbGxvYygxLHNpemVvZihvcGpfdDJfdCkpOwotICAgICAgICBpZiAoIWxfdDIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGxfdDItPmltYWdlID0gcF9pbWFnZTsKLSAgICAgICAgbF90Mi0+Y3AgPSBwX2NwOwotCi0gICAgICAgIHJldHVybiBsX3QyOwotfQotCi12b2lkIG9wal90Ml9kZXN0cm95KG9wal90Ml90ICp0MikgewotICAgICAgICBpZih0MikgewotICAgICAgICAgICAgICAgIG9wal9mcmVlKHQyKTsKLSAgICAgICAgfQotfQotCi1PUEpfQk9PTCBvcGpfdDJfZGVjb2RlX3BhY2tldCggIG9wal90Ml90KiBwX3QyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVfdCAqcF90aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNwX3QgKnBfdGNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfaXRlcmF0b3JfdCAqcF9waSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKnBfc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGFja2V0X2luZm9fdCAqcF9wYWNrX2luZm8pCi17Ci0gICAgICAgIE9QSl9CT09MIGxfcmVhZF9kYXRhOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfYnl0ZXNfcmVhZCA9IDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl90b3RhbF9ieXRlc19yZWFkID0gMDsKLQotICAgICAgICAqcF9kYXRhX3JlYWQgPSAwOwotCi0gICAgICAgIGlmICghIG9wal90Ml9yZWFkX3BhY2tldF9oZWFkZXIocF90MixwX3RpbGUscF90Y3AscF9waSwmbF9yZWFkX2RhdGEscF9zcmMsJmxfbmJfYnl0ZXNfcmVhZCxwX21heF9sZW5ndGgscF9wYWNrX2luZm8pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIHBfc3JjICs9IGxfbmJfYnl0ZXNfcmVhZDsKLSAgICAgICAgbF9uYl90b3RhbF9ieXRlc19yZWFkICs9IGxfbmJfYnl0ZXNfcmVhZDsKLSAgICAgICAgcF9tYXhfbGVuZ3RoIC09IGxfbmJfYnl0ZXNfcmVhZDsKLQotICAgICAgICAvKiB3ZSBzaG91bGQgcmVhZCBkYXRhIGZvciB0aGUgcGFja2V0ICovCi0gICAgICAgIGlmIChsX3JlYWRfZGF0YSkgewotICAgICAgICAgICAgICAgIGxfbmJfYnl0ZXNfcmVhZCA9IDA7Ci0KLSAgICAgICAgICAgICAgICBpZiAoISBvcGpfdDJfcmVhZF9wYWNrZXRfZGF0YShwX3QyLHBfdGlsZSxwX3BpLHBfc3JjLCZsX25iX2J5dGVzX3JlYWQscF9tYXhfbGVuZ3RoLHBfcGFja19pbmZvKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsX25iX3RvdGFsX2J5dGVzX3JlYWQgKz0gbF9uYl9ieXRlc19yZWFkOwotICAgICAgICB9Ci0KLSAgICAgICAgKnBfZGF0YV9yZWFkID0gbF9uYl90b3RhbF9ieXRlc19yZWFkOwotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX0JPT0wgb3BqX3QyX2VuY29kZV9wYWNrZXQoICBPUEpfVUlOVDMyIHRpbGVubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlX3QgKiB0aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNwX3QgKiB0Y3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9waV9pdGVyYXRvcl90ICpwaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKmRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZm9fdCAqY3N0cl9pbmZvKQotewotICAgICAgICBPUEpfVUlOVDMyIGJhbmRubywgY2Jsa25vOwotICAgICAgICBPUEpfQllURSogYyA9IGRlc3Q7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl9ieXRlczsKLSAgICAgICAgT1BKX1VJTlQzMiBjb21wbm8gPSBwaS0+Y29tcG5vOyAgICAgLyogY29tcG9uZW50IHZhbHVlICovCi0gICAgICAgIE9QSl9VSU5UMzIgcmVzbm8gID0gcGktPnJlc25vOyAgICAgIC8qIHJlc29sdXRpb24gbGV2ZWwgdmFsdWUgKi8KLSAgICAgICAgT1BKX1VJTlQzMiBwcmVjbm8gPSBwaS0+cHJlY25vOyAgICAgLyogcHJlY2luY3QgdmFsdWUgKi8KLSAgICAgICAgT1BKX1VJTlQzMiBsYXlubyAgPSBwaS0+bGF5bm87ICAgICAgLyogcXVhbGl0eSBsYXllciB2YWx1ZSAqLwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfYmxvY2tzOwotICAgICAgICBvcGpfdGNkX2JhbmRfdCAqYmFuZCA9IDAwOwotICAgICAgICBvcGpfdGNkX2NibGtfZW5jX3QqIGNibGsgPSAwMDsKLSAgICAgICAgb3BqX3RjZF9wYXNzX3QgKnBhc3MgPSAwMDsKLQotICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKnRpbGVjID0gJnRpbGUtPmNvbXBzW2NvbXBub107Ci0gICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90ICpyZXMgPSAmdGlsZWMtPnJlc29sdXRpb25zW3Jlc25vXTsKLQotICAgICAgICBvcGpfYmlvX3QgKmJpbyA9IDAwOyAgICAvKiBCSU8gY29tcG9uZW50ICovCi0KLSAgICAgICAgLyogPFNPUCAweGZmOTE+ICovCi0gICAgICAgIGlmICh0Y3AtPmNzdHkgJiBKMktfQ1BfQ1NUWV9TT1ApIHsKLSAgICAgICAgICAgICAgICBjWzBdID0gMjU1OwotICAgICAgICAgICAgICAgIGNbMV0gPSAxNDU7Ci0gICAgICAgICAgICAgICAgY1syXSA9IDA7Ci0gICAgICAgICAgICAgICAgY1szXSA9IDQ7Ci0jaWYgMAotICAgICAgICAgICAgICAgIGNbNF0gPSAodGlsZS0+cGFja25vICUgNjU1MzYpIC8gMjU2OwotICAgICAgICAgICAgICAgIGNbNV0gPSAodGlsZS0+cGFja25vICUgNjU1MzYpICUgMjU2OwotI2Vsc2UKLSAgICAgICAgICAgICAgICBjWzRdID0gKHRpbGUtPnBhY2tubyA+PiA4KSAmIDB4ZmY7IC8qIHBhY2tubyBpcyB1aW50MzJfdCAqLwotICAgICAgICAgICAgICAgIGNbNV0gPSB0aWxlLT5wYWNrbm8gJiAweGZmOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgYyArPSA2OwotICAgICAgICAgICAgICAgIGxlbmd0aCAtPSA2OwotICAgICAgICB9Ci0gICAgICAgIC8qIDwvU09QPiAqLwotCi0gICAgICAgIGlmICghbGF5bm8pIHsKLSAgICAgICAgICAgICAgICBiYW5kID0gcmVzLT5iYW5kczsKLQotICAgICAgICAgICAgICAgIGZvcihiYW5kbm8gPSAwOyBiYW5kbm8gPCByZXMtPm51bWJhbmRzOyArK2JhbmRubykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9wcmVjaW5jdF90ICpwcmMgPSAmYmFuZC0+cHJlY2luY3RzW3ByZWNub107Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Z3RfcmVzZXQocHJjLT5pbmNsdHJlZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGd0X3Jlc2V0KHByYy0+aW1zYnRyZWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBsX25iX2Jsb2NrcyA9IHByYy0+Y3cgKiBwcmMtPmNoOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yICAgICAoY2Jsa25vID0gMDsgY2Jsa25vIDwgbF9uYl9ibG9ja3M7ICsrY2Jsa25vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibGsgPSAmcHJjLT5jYmxrcy5lbmNbY2Jsa25vXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYmxrLT5udW1wYXNzZXMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGd0X3NldHZhbHVlKHByYy0+aW1zYnRyZWUsIGNibGtubywgYmFuZC0+bnVtYnBzIC0gKE9QSl9JTlQzMiljYmxrLT5udW1icHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKytiYW5kOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJpbyA9IG9wal9iaW9fY3JlYXRlKCk7Ci0gICAgICAgIGlmICghYmlvKSB7Ci0gICAgICAgICAgICAgICAgLyogRklYTUUgZXZlbnQgbWFuYWdlciBlcnJvciBjYWxsYmFjayAqLwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgb3BqX2Jpb19pbml0X2VuYyhiaW8sIGMsIGxlbmd0aCk7Ci0gICAgICAgIG9wal9iaW9fd3JpdGUoYmlvLCAxLCAxKTsgICAgICAgICAgIC8qIEVtcHR5IGhlYWRlciBiaXQgKi8KLQotICAgICAgICAvKiBXcml0aW5nIFBhY2tldCBoZWFkZXIgKi8KLSAgICAgICAgYmFuZCA9IHJlcy0+YmFuZHM7Ci0gICAgICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgcmVzLT5udW1iYW5kczsgKytiYW5kbm8pICAgICAgewotICAgICAgICAgICAgICAgIG9wal90Y2RfcHJlY2luY3RfdCAqcHJjID0gJmJhbmQtPnByZWNpbmN0c1twcmVjbm9dOwotCi0gICAgICAgICAgICAgICAgbF9uYl9ibG9ja3MgPSBwcmMtPmN3ICogcHJjLT5jaDsKLSAgICAgICAgICAgICAgICBjYmxrID0gcHJjLT5jYmxrcy5lbmM7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IGxfbmJfYmxvY2tzOyArK2NibGtubykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9sYXllcl90ICpsYXllciA9ICZjYmxrLT5sYXllcnNbbGF5bm9dOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNibGstPm51bXBhc3NlcyAmJiBsYXllci0+bnVtcGFzc2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Z3Rfc2V0dmFsdWUocHJjLT5pbmNsdHJlZSwgY2Jsa25vLCAoT1BKX0lOVDMyKWxheW5vKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgKytjYmxrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNibGsgPSBwcmMtPmNibGtzLmVuYzsKLSAgICAgICAgICAgICAgICBmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IGxfbmJfYmxvY2tzOyBjYmxrbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9sYXllcl90ICpsYXllciA9ICZjYmxrLT5sYXllcnNbbGF5bm9dOwotICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBpbmNyZW1lbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBudW1wID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbGVuID0gMCwgcGFzc25vOwotICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsX25iX3Bhc3NlczsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogY2JsayBpbmNsdXNpb24gYml0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYmxrLT5udW1wYXNzZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RndF9lbmNvZGUoYmlvLCBwcmMtPmluY2x0cmVlLCBjYmxrbm8sIChPUEpfSU5UMzIpKGxheW5vICsgMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2Jpb193cml0ZShiaW8sIGxheWVyLT5udW1wYXNzZXMgIT0gMCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIGNibGsgbm90IGluY2x1ZGVkLCBnbyB0byB0aGUgbmV4dCBjYmxrICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXllci0+bnVtcGFzc2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrY2JsazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIGZpcnN0IGluc3RhbmNlIG9mIGNibGsgLS0+IHplcm8gYml0LXBsYW5lcyBpbmZvcm1hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYmxrLT5udW1wYXNzZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jsay0+bnVtbGVuYml0cyA9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Z3RfZW5jb2RlKGJpbywgcHJjLT5pbXNidHJlZSwgY2Jsa25vLCA5OTkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kaW5nIHBhc3NlcyBpbmNsdWRlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QyX3B1dG51bXBhc3NlcyhiaW8sIGxheWVyLT5udW1wYXNzZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbF9uYl9wYXNzZXMgPSBjYmxrLT5udW1wYXNzZXMgKyBsYXllci0+bnVtcGFzc2VzOwotICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IGNibGstPnBhc3NlcyArICBjYmxrLT5udW1wYXNzZXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbXB1dGF0aW9uIG9mIHRoZSBpbmNyZWFzZSBvZiB0aGUgbGVuZ3RoIGluZGljYXRvciBhbmQgaW5zZXJ0aW9uIGluIHRoZSBoZWFkZXIgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHBhc3NubyA9IGNibGstPm51bXBhc3NlczsgcGFzc25vIDwgbF9uYl9wYXNzZXM7ICsrcGFzc25vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbnVtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuICs9IHBhc3MtPmxlbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzcy0+dGVybSB8fCBwYXNzbm8gPT0gKGNibGstPm51bXBhc3NlcyArIGxheWVyLT5udW1wYXNzZXMpIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudCA9IChPUEpfVUlOVDMyKW9wal9pbnRfbWF4KChPUEpfSU5UMzIpaW5jcmVtZW50LCBvcGpfaW50X2Zsb29ybG9nMigoT1BKX0lOVDMyKWxlbikgKyAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICgoT1BKX0lOVDMyKWNibGstPm51bWxlbmJpdHMgKyBvcGpfaW50X2Zsb29ybG9nMigoT1BKX0lOVDMyKW51bXApKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1wID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrcGFzczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Ml9wdXRjb21tYWNvZGUoYmlvLCAoT1BKX0lOVDMyKWluY3JlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbXB1dGF0aW9uIG9mIHRoZSBuZXcgTGVuZ3RoIGluZGljYXRvciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY2Jsay0+bnVtbGVuYml0cyArPSBpbmNyZW1lbnQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBjYmxrLT5wYXNzZXMgKyAgY2Jsay0+bnVtcGFzc2VzOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5zZXJ0aW9uIG9mIHRoZSBjb2Rld29yZCBzZWdtZW50IGxlbmd0aCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChwYXNzbm8gPSBjYmxrLT5udW1wYXNzZXM7IHBhc3NubyA8IGxfbmJfcGFzc2VzOyArK3Bhc3NubykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1wKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiArPSBwYXNzLT5sZW47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3MtPnRlcm0gfHwgcGFzc25vID09IChjYmxrLT5udW1wYXNzZXMgKyBsYXllci0+bnVtcGFzc2VzKSAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfYmlvX3dyaXRlKGJpbywgKE9QSl9VSU5UMzIpbGVuLCBjYmxrLT5udW1sZW5iaXRzICsgKE9QSl9VSU5UMzIpb3BqX2ludF9mbG9vcmxvZzIoKE9QSl9JTlQzMiludW1wKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1wID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3Bhc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICsrY2JsazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICArK2JhbmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW9wal9iaW9fZmx1c2goYmlvKSkgewotICAgICAgICAgICAgICAgIG9wal9iaW9fZGVzdHJveShiaW8pOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7ICAgICAgICAgICAgICAgLyogbW9kaWZpZWQgdG8gZWxpbWluYXRlIGxvbmdqbXAgISEgKi8KLSAgICAgICAgfQotCi0gICAgICAgIGxfbmJfYnl0ZXMgPSAoT1BKX1VJTlQzMilvcGpfYmlvX251bWJ5dGVzKGJpbyk7Ci0gICAgICAgIGMgKz0gbF9uYl9ieXRlczsKLSAgICAgICAgbGVuZ3RoIC09IGxfbmJfYnl0ZXM7Ci0KLSAgICAgICAgb3BqX2Jpb19kZXN0cm95KGJpbyk7Ci0KLSAgICAgICAgLyogPEVQSCAweGZmOTI+ICovCi0gICAgICAgIGlmICh0Y3AtPmNzdHkgJiBKMktfQ1BfQ1NUWV9FUEgpIHsKLSAgICAgICAgICAgICAgICBjWzBdID0gMjU1OwotICAgICAgICAgICAgICAgIGNbMV0gPSAxNDY7Ci0gICAgICAgICAgICAgICAgYyArPSAyOwotICAgICAgICAgICAgICAgIGxlbmd0aCAtPSAyOwotICAgICAgICB9Ci0gICAgICAgIC8qIDwvRVBIPiAqLwotCi0gICAgICAgIC8qIDw8IElOREVYICovCi0gICAgICAgIC8qIEVuZCBvZiBwYWNrZXQgaGVhZGVyIHBvc2l0aW9uLiBDdXJyZW50bHkgb25seSByZXByZXNlbnRzIHRoZSBkaXN0YW5jZSB0byBzdGFydCBvZiBwYWNrZXQKLSAgICAgICAgICAgV2lsbCBiZSB1cGRhdGVkIGxhdGVyIGJ5IGluY3JlbWVudGluZyB3aXRoIHBhY2tldCBzdGFydCB2YWx1ZSovCi0gICAgICAgIGlmKGNzdHJfaW5mbyAmJiBjc3RyX2luZm8tPmluZGV4X3dyaXRlKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3BhY2tldF9pbmZvX3QgKmluZm9fUEsgPSAmY3N0cl9pbmZvLT50aWxlW3RpbGVub10ucGFja2V0W2NzdHJfaW5mby0+cGFja25vXTsKLSAgICAgICAgICAgICAgICBpbmZvX1BLLT5lbmRfcGhfcG9zID0gKE9QSl9JTlQzMikoYyAtIGRlc3QpOwotICAgICAgICB9Ci0gICAgICAgIC8qIElOREVYID4+ICovCi0KLSAgICAgICAgLyogV3JpdGluZyB0aGUgcGFja2V0IGJvZHkgKi8KLSAgICAgICAgYmFuZCA9IHJlcy0+YmFuZHM7Ci0gICAgICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgcmVzLT5udW1iYW5kczsgYmFuZG5vKyspIHsKLSAgICAgICAgICAgICAgICBvcGpfdGNkX3ByZWNpbmN0X3QgKnByYyA9ICZiYW5kLT5wcmVjaW5jdHNbcHJlY25vXTsKLQotICAgICAgICAgICAgICAgIGxfbmJfYmxvY2tzID0gcHJjLT5jdyAqIHByYy0+Y2g7Ci0gICAgICAgICAgICAgICAgY2JsayA9IHByYy0+Y2Jsa3MuZW5jOwotCi0gICAgICAgICAgICAgICAgZm9yIChjYmxrbm8gPSAwOyBjYmxrbm8gPCBsX25iX2Jsb2NrczsgKytjYmxrbm8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfbGF5ZXJfdCAqbGF5ZXIgPSAmY2Jsay0+bGF5ZXJzW2xheW5vXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXllci0+bnVtcGFzc2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrY2JsazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXllci0+bGVuID4gbGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShjLCBsYXllci0+ZGF0YSwgbGF5ZXItPmxlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYmxrLT5udW1wYXNzZXMgKz0gbGF5ZXItPm51bXBhc3NlczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMgKz0gbGF5ZXItPmxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCAtPSBsYXllci0+bGVuOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiA8PCBJTkRFWCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoY3N0cl9pbmZvICYmIGNzdHJfaW5mby0+aW5kZXhfd3JpdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BhY2tldF9pbmZvX3QgKmluZm9fUEsgPSAmY3N0cl9pbmZvLT50aWxlW3RpbGVub10ucGFja2V0W2NzdHJfaW5mby0+cGFja25vXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19QSy0+ZGlzdG8gKz0gbGF5ZXItPmRpc3RvOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3N0cl9pbmZvLT5EX21heCA8IGluZm9fUEstPmRpc3RvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmZvLT5EX21heCA9IGluZm9fUEstPmRpc3RvOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICsrY2JsazsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIElOREVYID4+ICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICsrYmFuZDsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydCggYyA+PSBkZXN0ICk7Ci0gICAgICAgICogcF9kYXRhX3dyaXR0ZW4gKz0gKE9QSl9VSU5UMzIpKGMgLSBkZXN0KTsKLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLXN0YXRpYyBPUEpfQk9PTCBvcGpfdDJfc2tpcF9wYWNrZXQoIG9wal90Ml90KiBwX3QyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlX3QgKnBfdGlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y3BfdCAqcF90Y3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfaXRlcmF0b3JfdCAqcF9waSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpwX3NyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfcmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BhY2tldF9pbmZvX3QgKnBfcGFja19pbmZvKQotewotICAgICAgICBPUEpfQk9PTCBsX3JlYWRfZGF0YTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX2J5dGVzX3JlYWQgPSAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfdG90YWxfYnl0ZXNfcmVhZCA9IDA7Ci0KLSAgICAgICAgKnBfZGF0YV9yZWFkID0gMDsKLQotICAgICAgICBpZiAoISBvcGpfdDJfcmVhZF9wYWNrZXRfaGVhZGVyKHBfdDIscF90aWxlLHBfdGNwLHBfcGksJmxfcmVhZF9kYXRhLHBfc3JjLCZsX25iX2J5dGVzX3JlYWQscF9tYXhfbGVuZ3RoLHBfcGFja19pbmZvKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBwX3NyYyArPSBsX25iX2J5dGVzX3JlYWQ7Ci0gICAgICAgIGxfbmJfdG90YWxfYnl0ZXNfcmVhZCArPSBsX25iX2J5dGVzX3JlYWQ7Ci0gICAgICAgIHBfbWF4X2xlbmd0aCAtPSBsX25iX2J5dGVzX3JlYWQ7Ci0KLSAgICAgICAgLyogd2Ugc2hvdWxkIHJlYWQgZGF0YSBmb3IgdGhlIHBhY2tldCAqLwotICAgICAgICBpZiAobF9yZWFkX2RhdGEpIHsKLSAgICAgICAgICAgICAgICBsX25iX2J5dGVzX3JlYWQgPSAwOwotCi0gICAgICAgICAgICAgICAgaWYgKCEgb3BqX3QyX3NraXBfcGFja2V0X2RhdGEocF90MixwX3RpbGUscF9waSwmbF9uYl9ieXRlc19yZWFkLHBfbWF4X2xlbmd0aCxwX3BhY2tfaW5mbykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbF9uYl90b3RhbF9ieXRlc19yZWFkICs9IGxfbmJfYnl0ZXNfcmVhZDsKLSAgICAgICAgfQotICAgICAgICAqcF9kYXRhX3JlYWQgPSBsX25iX3RvdGFsX2J5dGVzX3JlYWQ7Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi0KLU9QSl9CT09MIG9wal90Ml9yZWFkX3BhY2tldF9oZWFkZXIoIG9wal90Ml90KiBwX3QyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlX3QgKnBfdGlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y3BfdCAqcF90Y3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfaXRlcmF0b3JfdCAqcF9waSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CT09MICogcF9pc19kYXRhX3ByZXNlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqcF9zcmNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfcmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BhY2tldF9pbmZvX3QgKnBfcGFja19pbmZvKQotCi17Ci0gICAgICAgIC8qIGxvb3AgKi8KLSAgICAgICAgT1BKX1VJTlQzMiBiYW5kbm8sIGNibGtubzsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX2NvZGVfYmxvY2tzOwotICAgICAgICBPUEpfVUlOVDMyIGxfcmVtYWluaW5nX2xlbmd0aDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2hlYWRlcl9sZW5ndGg7Ci0gICAgICAgIE9QSl9VSU5UMzIgKiBsX21vZGlmaWVkX2xlbmd0aF9wdHIgPSAwMDsKLSAgICAgICAgT1BKX0JZVEUgKmxfY3VycmVudF9kYXRhID0gcF9zcmNfZGF0YTsKLSAgICAgICAgb3BqX2NwX3QgKmxfY3AgPSBwX3QyLT5jcDsKLSAgICAgICAgb3BqX2Jpb190ICpsX2JpbyA9IDAwOyAgLyogQklPIGNvbXBvbmVudCAqLwotICAgICAgICBvcGpfdGNkX2JhbmRfdCAqbF9iYW5kID0gMDA7Ci0gICAgICAgIG9wal90Y2RfY2Jsa19kZWNfdCogbF9jYmxrID0gMDA7Ci0gICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90KiBsX3JlcyA9ICZwX3RpbGUtPmNvbXBzW3BfcGktPmNvbXBub10ucmVzb2x1dGlvbnNbcF9waS0+cmVzbm9dOwotCi0gICAgICAgIE9QSl9CWVRFICpsX2hlYWRlcl9kYXRhID0gMDA7Ci0gICAgICAgIE9QSl9CWVRFICoqbF9oZWFkZXJfZGF0YV9zdGFydCA9IDAwOwotCi0gICAgICAgIE9QSl9VSU5UMzIgbF9wcmVzZW50OwotCi0gICAgICAgIGlmIChwX3BpLT5sYXlubyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbF9iYW5kID0gbF9yZXMtPmJhbmRzOwotCi0gICAgICAgICAgICAgICAgLyogcmVzZXQgdGFndHJlZXMgKi8KLSAgICAgICAgICAgICAgICBmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IGxfcmVzLT5udW1iYW5kczsgKytiYW5kbm8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfcHJlY2luY3RfdCAqbF9wcmMgPSAmbF9iYW5kLT5wcmVjaW5jdHNbcF9waS0+cHJlY25vXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhICgobF9iYW5kLT54MS1sX2JhbmQtPngwID09IDApfHwobF9iYW5kLT55MS1sX2JhbmQtPnkwID09IDApKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RndF9yZXNldChsX3ByYy0+aW5jbHRyZWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGd0X3Jlc2V0KGxfcHJjLT5pbXNidHJlZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY2JsayA9IGxfcHJjLT5jYmxrcy5kZWM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9uYl9jb2RlX2Jsb2NrcyA9IGxfcHJjLT5jdyAqIGxfcHJjLT5jaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjYmxrbm8gPSAwOyBjYmxrbm8gPCBsX25iX2NvZGVfYmxvY2tzOyArK2NibGtubykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+bnVtc2VncyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jYmxrLT5yZWFsX251bV9zZWdzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfY2JsazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICArK2xfYmFuZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBTT1AgbWFya2VycyAqLwotCi0gICAgICAgIGlmIChwX3RjcC0+Y3N0eSAmIEoyS19DUF9DU1RZX1NPUCkgewotICAgICAgICAgICAgICAgIGlmIChwX21heF9sZW5ndGggPCA2KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPIG9wal9ldmVudF9tc2cocF90Mi0+Y2luZm8tPmV2ZW50X21nciwgRVZUX1dBUk5JTkcsICJOb3QgZW5vdWdoIHNwYWNlIGZvciBleHBlY3RlZCBTT1AgbWFya2VyXG4iKTsgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTm90IGVub3VnaCBzcGFjZSBmb3IgZXhwZWN0ZWQgU09QIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoKmxfY3VycmVudF9kYXRhKSAhPSAweGZmIHx8ICgqKGxfY3VycmVudF9kYXRhICsgMSkgIT0gMHg5MSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gb3BqX2V2ZW50X21zZyhwX3QyLT5jaW5mby0+ZXZlbnRfbWdyLCBFVlRfV0FSTklORywgIkV4cGVjdGVkIFNPUCBtYXJrZXJcbiIpOyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBleHBlY3RlZCBTT1AgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gNjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiogVE9ETyA6IGNoZWNrIHRoZSBOc29wIHZhbHVlICovCi0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICBXaGVuIHRoZSBtYXJrZXIgUFBUL1BQTSBpcyB1c2VkIHRoZSBwYWNrZXQgaGVhZGVyIGFyZSBzdG9yZSBpbiBQUFQvUFBNIG1hcmtlcgotICAgICAgICBUaGlzIHBhcnQgZGVhbCB3aXRoIHRoaXMgY2FyYWN0ZXJpc3RpYwotICAgICAgICBzdGVwIDE6IFJlYWQgcGFja2V0IGhlYWRlciBpbiB0aGUgc2F2ZWQgc3RydWN0dXJlCi0gICAgICAgIHN0ZXAgMjogUmV0dXJuIHRvIGNvZGVzdHJlYW0gZm9yIGRlY29kaW5nCi0gICAgICAgICovCi0KLSAgICAgICAgbF9iaW8gPSBvcGpfYmlvX2NyZWF0ZSgpOwotICAgICAgICBpZiAoISBsX2JpbykgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobF9jcC0+cHBtID09IDEpIHsgLyogUFBNICovCi0gICAgICAgICAgICAgICAgbF9oZWFkZXJfZGF0YV9zdGFydCA9ICZsX2NwLT5wcG1fZGF0YTsKLSAgICAgICAgICAgICAgICBsX2hlYWRlcl9kYXRhID0gKmxfaGVhZGVyX2RhdGFfc3RhcnQ7Ci0gICAgICAgICAgICAgICAgbF9tb2RpZmllZF9sZW5ndGhfcHRyID0gJihsX2NwLT5wcG1fbGVuKTsKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBfdGNwLT5wcHQgPT0gMSkgeyAvKiBQUFQgKi8KLSAgICAgICAgICAgICAgICBsX2hlYWRlcl9kYXRhX3N0YXJ0ID0gJihwX3RjcC0+cHB0X2RhdGEpOwotICAgICAgICAgICAgICAgIGxfaGVhZGVyX2RhdGEgPSAqbF9oZWFkZXJfZGF0YV9zdGFydDsKLSAgICAgICAgICAgICAgICBsX21vZGlmaWVkX2xlbmd0aF9wdHIgPSAmKHBfdGNwLT5wcHRfbGVuKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsgIC8qIE5vcm1hbCBDYXNlICovCi0gICAgICAgICAgICAgICAgbF9oZWFkZXJfZGF0YV9zdGFydCA9ICYobF9jdXJyZW50X2RhdGEpOwotICAgICAgICAgICAgICAgIGxfaGVhZGVyX2RhdGEgPSAqbF9oZWFkZXJfZGF0YV9zdGFydDsKLSAgICAgICAgICAgICAgICBsX3JlbWFpbmluZ19sZW5ndGggPSAoT1BKX1VJTlQzMikocF9zcmNfZGF0YStwX21heF9sZW5ndGgtbF9oZWFkZXJfZGF0YSk7Ci0gICAgICAgICAgICAgICAgbF9tb2RpZmllZF9sZW5ndGhfcHRyID0gJihsX3JlbWFpbmluZ19sZW5ndGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3BqX2Jpb19pbml0X2RlYyhsX2JpbywgbF9oZWFkZXJfZGF0YSwqbF9tb2RpZmllZF9sZW5ndGhfcHRyKTsKLQotICAgICAgICBsX3ByZXNlbnQgPSBvcGpfYmlvX3JlYWQobF9iaW8sIDEpOwotICAgICAgICBKQVNfRlBSSU5URihzdGRlcnIsICJwcmVzZW50PSVkIFxuIiwgbF9wcmVzZW50ICk7Ci0gICAgICAgIGlmICghbF9wcmVzZW50KSB7Ci0gICAgICAgICAgICAvKiBUT0RPIE1TRDogbm8gdGVzdCB0byBjb250cm9sIHRoZSBvdXRwdXQgb2YgdGhpcyBmdW5jdGlvbiovCi0gICAgICAgICAgICAgICAgb3BqX2Jpb19pbmFsaWduKGxfYmlvKTsKLSAgICAgICAgICAgICAgICBsX2hlYWRlcl9kYXRhICs9IG9wal9iaW9fbnVtYnl0ZXMobF9iaW8pOwotICAgICAgICAgICAgICAgIG9wal9iaW9fZGVzdHJveShsX2Jpbyk7Ci0KLSAgICAgICAgICAgICAgICAvKiBFUEggbWFya2VycyAqLwotICAgICAgICAgICAgICAgIGlmIChwX3RjcC0+Y3N0eSAmIEoyS19DUF9DU1RZX0VQSCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgqbF9tb2RpZmllZF9sZW5ndGhfcHRyIC0gKE9QSl9VSU5UMzIpKGxfaGVhZGVyX2RhdGEgLSAqbF9oZWFkZXJfZGF0YV9zdGFydCkpIDwgMlUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJOb3QgZW5vdWdoIHNwYWNlIGZvciBleHBlY3RlZCBFUEggbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKCpsX2hlYWRlcl9kYXRhKSAhPSAweGZmIHx8ICgqKGxfaGVhZGVyX2RhdGEgKyAxKSAhPSAweDkyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIDogZXhwZWN0ZWQgRVBIIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2hlYWRlcl9kYXRhICs9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbF9oZWFkZXJfbGVuZ3RoID0gKE9QSl9VSU5UMzIpKGxfaGVhZGVyX2RhdGEgLSAqbF9oZWFkZXJfZGF0YV9zdGFydCk7Ci0gICAgICAgICAgICAgICAgKmxfbW9kaWZpZWRfbGVuZ3RoX3B0ciAtPSBsX2hlYWRlcl9sZW5ndGg7Ci0gICAgICAgICAgICAgICAgKmxfaGVhZGVyX2RhdGFfc3RhcnQgKz0gbF9oZWFkZXJfbGVuZ3RoOwotCi0gICAgICAgICAgICAgICAgLyogPDwgSU5ERVggKi8KLSAgICAgICAgICAgICAgICAvKiBFbmQgb2YgcGFja2V0IGhlYWRlciBwb3NpdGlvbi4gQ3VycmVudGx5IG9ubHkgcmVwcmVzZW50cyB0aGUgZGlzdGFuY2UgdG8gc3RhcnQgb2YgcGFja2V0Ci0gICAgICAgICAgICAgICAgICAgV2lsbCBiZSB1cGRhdGVkIGxhdGVyIGJ5IGluY3JlbWVudGluZyB3aXRoIHBhY2tldCBzdGFydCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgIGlmIChwX3BhY2tfaW5mbykgewotICAgICAgICAgICAgICAgICAgICAgICAgcF9wYWNrX2luZm8tPmVuZF9waF9wb3MgPSAoT1BKX0lOVDMyKShsX2N1cnJlbnRfZGF0YSAtIHBfc3JjX2RhdGEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBJTkRFWCA+PiAqLwotCi0gICAgICAgICAgICAgICAgKiBwX2lzX2RhdGFfcHJlc2VudCA9IE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAqcF9kYXRhX3JlYWQgPSAoT1BKX1VJTlQzMikobF9jdXJyZW50X2RhdGEgLSBwX3NyY19kYXRhKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBsX2JhbmQgPSBsX3Jlcy0+YmFuZHM7Ci0gICAgICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgbF9yZXMtPm51bWJhbmRzOyArK2JhbmRubykgewotICAgICAgICAgICAgICAgIG9wal90Y2RfcHJlY2luY3RfdCAqbF9wcmMgPSAmKGxfYmFuZC0+cHJlY2luY3RzW3BfcGktPnByZWNub10pOwotCi0gICAgICAgICAgICAgICAgaWYgKChsX2JhbmQtPngxLWxfYmFuZC0+eDAgPT0gMCl8fChsX2JhbmQtPnkxLWxfYmFuZC0+eTAgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICsrbF9iYW5kOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbF9uYl9jb2RlX2Jsb2NrcyA9IGxfcHJjLT5jdyAqIGxfcHJjLT5jaDsKLSAgICAgICAgICAgICAgICBsX2NibGsgPSBsX3ByYy0+Y2Jsa3MuZGVjOwotICAgICAgICAgICAgICAgIGZvciAoY2Jsa25vID0gMDsgY2Jsa25vIDwgbF9uYl9jb2RlX2Jsb2NrczsgY2Jsa25vKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbF9pbmNsdWRlZCxsX2luY3JlbWVudCwgbF9zZWdubzsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBuOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBjYmxrIG5vdCB5ZXQgaW5jbHVkZWQgYmVmb3JlIC0tPiBpbmNsdXNpb24gdGFndHJlZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsX2NibGstPm51bXNlZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9pbmNsdWRlZCA9IG9wal90Z3RfZGVjb2RlKGxfYmlvLCBsX3ByYy0+aW5jbHRyZWUsIGNibGtubywgKE9QSl9JTlQzMikocF9waS0+bGF5bm8gKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsc2Ugb25lIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaW5jbHVkZWQgPSBvcGpfYmlvX3JlYWQobF9iaW8sIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBjYmxrIG5vdCBpbmNsdWRlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsX2luY2x1ZGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+bnVtbmV3cGFzc2VzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX2NibGs7Ci0gICAgICAgIEpBU19GUFJJTlRGKHN0ZGVyciwgImluY2x1ZGVkPSVkIFxuIiwgbF9pbmNsdWRlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBjYmxrIG5vdCB5ZXQgaW5jbHVkZWQgLS0+IHplcm8tYml0cGxhbmUgdGFndHJlZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsX2NibGstPm51bXNlZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBpID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIW9wal90Z3RfZGVjb2RlKGxfYmlvLCBsX3ByYy0+aW1zYnRyZWUsIGNibGtubywgKE9QSl9JTlQzMilpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+bnVtYnBzID0gKE9QSl9VSU5UMzIpbF9iYW5kLT5udW1icHMgKyAxIC0gaTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jYmxrLT5udW1sZW5iaXRzID0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGluZyBwYXNzZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+bnVtbmV3cGFzc2VzID0gb3BqX3QyX2dldG51bXBhc3NlcyhsX2Jpbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX2luY3JlbWVudCA9IG9wal90Ml9nZXRjb21tYWNvZGUobF9iaW8pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggaW5kaWNhdG9yIGluY3JlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbF9jYmxrLT5udW1sZW5iaXRzICs9IGxfaW5jcmVtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgbF9zZWdubyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbF9jYmxrLT5udW1zZWdzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG9wal90Ml9pbml0X3NlZyhsX2NibGssIGxfc2Vnbm8sIHBfdGNwLT50Y2Nwc1twX3BpLT5jb21wbm9dLmNibGtzdHksIDEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2Jpb19kZXN0cm95KGxfYmlvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zZWdubyA9IGxfY2Jsay0+bnVtc2VncyAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2NibGstPnNlZ3NbbF9zZWdub10ubnVtcGFzc2VzID09IGxfY2Jsay0+c2Vnc1tsX3NlZ25vXS5tYXhwYXNzZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfc2Vnbm87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgb3BqX3QyX2luaXRfc2VnKGxfY2JsaywgbF9zZWdubywgcF90Y3AtPnRjY3BzW3BfcGktPmNvbXBub10uY2Jsa3N0eSwgMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9iaW9fZGVzdHJveShsX2Jpbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbiA9IChPUEpfSU5UMzIpbF9jYmxrLT5udW1uZXdwYXNzZXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jYmxrLT5zZWdzW2xfc2Vnbm9dLm51bW5ld3Bhc3NlcyA9IChPUEpfVUlOVDMyKW9wal9pbnRfbWluKChPUEpfSU5UMzIpKGxfY2Jsay0+c2Vnc1tsX3NlZ25vXS5tYXhwYXNzZXMgLSBsX2NibGstPnNlZ3NbbF9zZWdub10ubnVtcGFzc2VzKSwgbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+c2Vnc1tsX3NlZ25vXS5uZXdsZW4gPSBvcGpfYmlvX3JlYWQobF9iaW8sIGxfY2Jsay0+bnVtbGVuYml0cyArIG9wal91aW50X2Zsb29ybG9nMihsX2NibGstPnNlZ3NbbF9zZWdub10ubnVtbmV3cGFzc2VzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFTX0ZQUklOVEYoc3RkZXJyLCAiaW5jbHVkZWQ9JWQgbnVtbmV3cGFzc2VzPSVkIGluY3JlbWVudD0lZCBsZW49JWQgXG4iLCBsX2luY2x1ZGVkLCBsX2NibGstPnNlZ3NbbF9zZWdub10ubnVtbmV3cGFzc2VzLCBsX2luY3JlbWVudCwgbF9jYmxrLT5zZWdzW2xfc2Vnbm9dLm5ld2xlbiApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gLT0gKE9QSl9JTlQzMilsX2NibGstPnNlZ3NbbF9zZWdub10ubnVtbmV3cGFzc2VzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfc2Vnbm87Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBvcGpfdDJfaW5pdF9zZWcobF9jYmxrLCBsX3NlZ25vLCBwX3RjcC0+dGNjcHNbcF9waS0+Y29tcG5vXS5jYmxrc3R5LCAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2Jpb19kZXN0cm95KGxfYmlvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChuID4gMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICsrbF9jYmxrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICsrbF9iYW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFvcGpfYmlvX2luYWxpZ24obF9iaW8pKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2Jpb19kZXN0cm95KGxfYmlvKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgbF9oZWFkZXJfZGF0YSArPSBvcGpfYmlvX251bWJ5dGVzKGxfYmlvKTsKLSAgICAgICAgb3BqX2Jpb19kZXN0cm95KGxfYmlvKTsKLQotICAgICAgICAvKiBFUEggbWFya2VycyAqLwotICAgICAgICBpZiAocF90Y3AtPmNzdHkgJiBKMktfQ1BfQ1NUWV9FUEgpIHsKLSAgICAgICAgICAgICAgICBpZiAoKCpsX21vZGlmaWVkX2xlbmd0aF9wdHIgLSAoT1BKX1VJTlQzMikobF9oZWFkZXJfZGF0YSAtICpsX2hlYWRlcl9kYXRhX3N0YXJ0KSkgPCAyVSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJOb3QgZW5vdWdoIHNwYWNlIGZvciBleHBlY3RlZCBFUEggbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCgqbF9oZWFkZXJfZGF0YSkgIT0gMHhmZiB8fCAoKihsX2hlYWRlcl9kYXRhICsgMSkgIT0gMHg5MikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gb3BqX2V2ZW50X21zZyh0Mi0+Y2luZm8tPmV2ZW50X21nciwgRVZUX0VSUk9SLCAiRXhwZWN0ZWQgRVBIIG1hcmtlclxuIik7ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIDogZXhwZWN0ZWQgRVBIIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfaGVhZGVyX2RhdGEgKz0gMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBsX2hlYWRlcl9sZW5ndGggPSAoT1BKX1VJTlQzMikobF9oZWFkZXJfZGF0YSAtICpsX2hlYWRlcl9kYXRhX3N0YXJ0KTsKLSAgICAgICAgSkFTX0ZQUklOVEYoIHN0ZGVyciwgImhkcmxlbj0lZCBcbiIsIGxfaGVhZGVyX2xlbmd0aCApOwotICAgICAgICBKQVNfRlBSSU5URiggc3RkZXJyLCAicGFja2V0IGJvZHlcbiIpOwotICAgICAgICAqbF9tb2RpZmllZF9sZW5ndGhfcHRyIC09IGxfaGVhZGVyX2xlbmd0aDsKLSAgICAgICAgKmxfaGVhZGVyX2RhdGFfc3RhcnQgKz0gbF9oZWFkZXJfbGVuZ3RoOwotCi0gICAgICAgIC8qIDw8IElOREVYICovCi0gICAgICAgIC8qIEVuZCBvZiBwYWNrZXQgaGVhZGVyIHBvc2l0aW9uLiBDdXJyZW50bHkgb25seSByZXByZXNlbnRzIHRoZSBkaXN0YW5jZSB0byBzdGFydCBvZiBwYWNrZXQKLSAgICAgICAgIFdpbGwgYmUgdXBkYXRlZCBsYXRlciBieSBpbmNyZW1lbnRpbmcgd2l0aCBwYWNrZXQgc3RhcnQgdmFsdWUgKi8KLSAgICAgICAgaWYgKHBfcGFja19pbmZvKSB7Ci0gICAgICAgICAgICAgICAgcF9wYWNrX2luZm8tPmVuZF9waF9wb3MgPSAoT1BKX0lOVDMyKShsX2N1cnJlbnRfZGF0YSAtIHBfc3JjX2RhdGEpOwotICAgICAgICB9Ci0gICAgICAgIC8qIElOREVYID4+ICovCi0KLSAgICAgICAgKnBfaXNfZGF0YV9wcmVzZW50ID0gT1BKX1RSVUU7Ci0gICAgICAgICpwX2RhdGFfcmVhZCA9IChPUEpfVUlOVDMyKShsX2N1cnJlbnRfZGF0YSAtIHBfc3JjX2RhdGEpOwotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX0JPT0wgb3BqX3QyX3JlYWRfcGFja2V0X2RhdGEoICAgb3BqX3QyX3QqIHBfdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVfdCAqcF90aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2l0ZXJhdG9yX3QgKnBfcGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqcF9zcmNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfcmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BhY2tldF9pbmZvX3QgKnBhY2tfaW5mbykKLXsKLSAgICAgICAgT1BKX1VJTlQzMiBiYW5kbm8sIGNibGtubzsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX2NvZGVfYmxvY2tzOwotICAgICAgICBPUEpfQllURSAqbF9jdXJyZW50X2RhdGEgPSBwX3NyY19kYXRhOwotICAgICAgICBvcGpfdGNkX2JhbmRfdCAqbF9iYW5kID0gMDA7Ci0gICAgICAgIG9wal90Y2RfY2Jsa19kZWNfdCogbF9jYmxrID0gMDA7Ci0gICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90KiBsX3JlcyA9ICZwX3RpbGUtPmNvbXBzW3BfcGktPmNvbXBub10ucmVzb2x1dGlvbnNbcF9waS0+cmVzbm9dOwotCi0gICAgICAgIE9QSl9BUkdfTk9UX1VTRUQocF90Mik7Ci0gICAgICAgIE9QSl9BUkdfTk9UX1VTRUQocGFja19pbmZvKTsKLQotICAgICAgICBsX2JhbmQgPSBsX3Jlcy0+YmFuZHM7Ci0gICAgICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgbF9yZXMtPm51bWJhbmRzOyArK2JhbmRubykgewotICAgICAgICAgICAgICAgIG9wal90Y2RfcHJlY2luY3RfdCAqbF9wcmMgPSAmbF9iYW5kLT5wcmVjaW5jdHNbcF9waS0+cHJlY25vXTsKLQotICAgICAgICAgICAgICAgIGlmICgobF9iYW5kLT54MS1sX2JhbmQtPngwID09IDApfHwobF9iYW5kLT55MS1sX2JhbmQtPnkwID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICArK2xfYmFuZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxfbmJfY29kZV9ibG9ja3MgPSBsX3ByYy0+Y3cgKiBsX3ByYy0+Y2g7Ci0gICAgICAgICAgICAgICAgbF9jYmxrID0gbF9wcmMtPmNibGtzLmRlYzsKLQotICAgICAgICAgICAgICAgIGZvciAoY2Jsa25vID0gMDsgY2Jsa25vIDwgbF9uYl9jb2RlX2Jsb2NrczsgKytjYmxrbm8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2Rfc2VnX3QgKmxfc2VnID0gMDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbF9jYmxrLT5udW1uZXdwYXNzZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90aGluZyB0byBkbyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfY2JsazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbF9jYmxrLT5udW1zZWdzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2VnID0gbF9jYmxrLT5zZWdzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfY2Jsay0+bnVtc2VnczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jYmxrLT5kYXRhX2N1cnJlbnRfc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zZWcgPSAmbF9jYmxrLT5zZWdzW2xfY2Jsay0+bnVtc2VncyAtIDFdOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX3NlZy0+bnVtcGFzc2VzID09IGxfc2VnLT5tYXhwYXNzZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfc2VnOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9jYmxrLT5udW1zZWdzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgcG9zc2libGUgb3ZlcmZsb3cgKG9uIGxfY3VycmVudF9kYXRhIG9ubHksIGFzc3VtZXMgaW5wdXQgYXJncyBhbHJlYWR5IGNoZWNrZWQpIHRoZW4gc2l6ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCgoT1BKX1NJWkVfVClsX2N1cnJlbnRfZGF0YSArIChPUEpfU0laRV9UKWxfc2VnLT5uZXdsZW4pIDwgKE9QSl9TSVpFX1QpbF9jdXJyZW50X2RhdGEpIHx8IChsX2N1cnJlbnRfZGF0YSArIGxfc2VnLT5uZXdsZW4gPiBwX3NyY19kYXRhICsgcF9tYXhfbGVuZ3RoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicmVhZDogc2VnbWVudCB0b28gbG9uZyAoJWQpIHdpdGggbWF4ICglZCkgZm9yIGNvZGVibG9jayAlZCAocD0lZCwgYj0lZCwgcj0lZCwgYz0lZClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NlZy0+bmV3bGVuLCBwX21heF9sZW5ndGgsIGNibGtubywgcF9waS0+cHJlY25vLCBiYW5kbm8sIHBfcGktPnJlc25vLCBwX3BpLT5jb21wbm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotI2lmZGVmIFVTRV9KUFdMCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBuZWVkIGhlcmUgYSBqMmsgaGFuZGxlIHRvIHZlcmlmeSBpZiBtYWtpbmcgYSBjaGVjayB0bwotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHZhbGlkaXR5IG9mIGNibG9ja3MgcGFyYW1ldGVycyBpcyBzZWxlY3RlZCBmcm9tIHVzZXIgKC1XKSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldCdzIGNoZWNrIHRoYXQgd2UgYXJlIG5vdCBleGNlZWRpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsX2NibGstPmxlbiArIGxfc2VnLT5uZXdsZW4pID4gODE5MikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF90Mi0+Y2luZm8sIEVWVF9XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpQV0w6IHNlZ21lbnQgdG9vIGxvbmcgKCVkKSBmb3IgY29kZWJsb2NrICVkIChwPSVkLCBiPSVkLCByPSVkLCBjPSVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2VnLT5uZXdsZW4sIGNibGtubywgcF9waS0+cHJlY25vLCBiYW5kbm8sIHBfcGktPnJlc25vLCBwX3BpLT5jb21wbm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSlBXTF9BU1NVTUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF90Mi0+Y2luZm8sIEVWVF9FUlJPUiwgIkpQV0w6IGdpdmluZyB1cFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NlZy0+bmV3bGVuID0gODE5MiAtIGxfY2Jsay0+bGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF90Mi0+Y2luZm8sIEVWVF9XQVJOSU5HLCAiICAgICAgLSB0cnVuY2F0aW5nIHNlZ21lbnQgdG8gJWRcbiIsIGxfc2VnLT5uZXdsZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0jZW5kaWYgLyogVVNFX0pQV0wgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgcG9zc2libGUgb3ZlcmZsb3cgb24gc2l6ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGxfY2Jsay0+ZGF0YV9jdXJyZW50X3NpemUgKyBsX3NlZy0+bmV3bGVuKSA8IGxfY2Jsay0+ZGF0YV9jdXJyZW50X3NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInJlYWQ6IHNlZ21lbnQgdG9vIGxvbmcgKCVkKSB3aXRoIGN1cnJlbnQgc2l6ZSAoJWQgPiAlZCkgZm9yIGNvZGVibG9jayAlZCAocD0lZCwgYj0lZCwgcj0lZCwgYz0lZClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NlZy0+bmV3bGVuLCBsX2NibGstPmRhdGFfY3VycmVudF9zaXplLCAweEZGRkZGRkZGIC0gbF9zZWctPm5ld2xlbiwgY2Jsa25vLCBwX3BpLT5wcmVjbm8sIGJhbmRubywgcF9waS0+cmVzbm8sIHBfcGktPmNvbXBubyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgY2Jsay0+ZGF0YSBoYXZlIGFsbG9jYXRlZCBlbm91Z2ggbWVtb3J5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobF9jYmxrLT5kYXRhX2N1cnJlbnRfc2l6ZSArIGxfc2VnLT5uZXdsZW4pID4gbF9jYmxrLT5kYXRhX21heF9zaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSogbmV3X2NibGtfZGF0YSA9IChPUEpfQllURSopIG9wal9yZWFsbG9jKGxfY2Jsay0+ZGF0YSwgbF9jYmxrLT5kYXRhX2N1cnJlbnRfc2l6ZSArIGxfc2VnLT5uZXdsZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoISBuZXdfY2Jsa19kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jYmxrLT5kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NibGstPmRhdGEgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+ZGF0YV9tYXhfc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWxsb2MgY29kZSBibG9jayBjYXRhIVxuIik7ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+ZGF0YV9tYXhfc2l6ZSA9IGxfY2Jsay0+ZGF0YV9jdXJyZW50X3NpemUgKyBsX3NlZy0+bmV3bGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jYmxrLT5kYXRhID0gbmV3X2NibGtfZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkobF9jYmxrLT5kYXRhICsgbF9jYmxrLT5kYXRhX2N1cnJlbnRfc2l6ZSwgbF9jdXJyZW50X2RhdGEsIGxfc2VnLT5uZXdsZW4pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX3NlZy0+bnVtcGFzc2VzID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NlZy0+ZGF0YSA9ICZsX2NibGstPmRhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zZWctPmRhdGFpbmRleCA9IGxfY2Jsay0+ZGF0YV9jdXJyZW50X3NpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSBsX3NlZy0+bmV3bGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NlZy0+bnVtcGFzc2VzICs9IGxfc2VnLT5udW1uZXdwYXNzZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+bnVtbmV3cGFzc2VzIC09IGxfc2VnLT5udW1uZXdwYXNzZXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zZWctPnJlYWxfbnVtX3Bhc3NlcyA9IGxfc2VnLT5udW1wYXNzZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+ZGF0YV9jdXJyZW50X3NpemUgKz0gbF9zZWctPm5ld2xlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zZWctPmxlbiArPSBsX3NlZy0+bmV3bGVuOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2NibGstPm51bW5ld3Bhc3NlcyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfc2VnOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9jYmxrLT5udW1zZWdzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChsX2NibGstPm51bW5ld3Bhc3NlcyA+IDApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBsX2NibGstPnJlYWxfbnVtX3NlZ3MgPSBsX2NibGstPm51bXNlZ3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICArK2xfY2JsazsKLSAgICAgICAgICAgICAgICB9IC8qIG5leHQgY29kZV9ibG9jayAqLwotCi0gICAgICAgICAgICAgICAgKytsX2JhbmQ7Ci0gICAgICAgIH0KLQotICAgICAgICAqKHBfZGF0YV9yZWFkKSA9IChPUEpfVUlOVDMyKShsX2N1cnJlbnRfZGF0YSAtIHBfc3JjX2RhdGEpOwotCi0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi1PUEpfQk9PTCBvcGpfdDJfc2tpcF9wYWNrZXRfZGF0YSggICBvcGpfdDJfdCogcF90MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICpwX3RpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfaXRlcmF0b3JfdCAqcF9waSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfcmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BhY2tldF9pbmZvX3QgKnBhY2tfaW5mbykKLXsKLSAgICAgICAgT1BKX1VJTlQzMiBiYW5kbm8sIGNibGtubzsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX2NvZGVfYmxvY2tzOwotICAgICAgICBvcGpfdGNkX2JhbmRfdCAqbF9iYW5kID0gMDA7Ci0gICAgICAgIG9wal90Y2RfY2Jsa19kZWNfdCogbF9jYmxrID0gMDA7Ci0gICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90KiBsX3JlcyA9ICZwX3RpbGUtPmNvbXBzW3BfcGktPmNvbXBub10ucmVzb2x1dGlvbnNbcF9waS0+cmVzbm9dOwotCi0gICAgICAgIE9QSl9BUkdfTk9UX1VTRUQocF90Mik7Ci0gICAgICAgIE9QSl9BUkdfTk9UX1VTRUQocGFja19pbmZvKTsKLQotICAgICAgICAqcF9kYXRhX3JlYWQgPSAwOwotICAgICAgICBsX2JhbmQgPSBsX3Jlcy0+YmFuZHM7Ci0KLSAgICAgICAgZm9yIChiYW5kbm8gPSAwOyBiYW5kbm8gPCBsX3Jlcy0+bnVtYmFuZHM7ICsrYmFuZG5vKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3RjZF9wcmVjaW5jdF90ICpsX3ByYyA9ICZsX2JhbmQtPnByZWNpbmN0c1twX3BpLT5wcmVjbm9dOwotCi0gICAgICAgICAgICAgICAgaWYgKChsX2JhbmQtPngxLWxfYmFuZC0+eDAgPT0gMCl8fChsX2JhbmQtPnkxLWxfYmFuZC0+eTAgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICsrbF9iYW5kOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbF9uYl9jb2RlX2Jsb2NrcyA9IGxfcHJjLT5jdyAqIGxfcHJjLT5jaDsKLSAgICAgICAgICAgICAgICBsX2NibGsgPSBsX3ByYy0+Y2Jsa3MuZGVjOwotCi0gICAgICAgICAgICAgICAgZm9yIChjYmxrbm8gPSAwOyBjYmxrbm8gPCBsX25iX2NvZGVfYmxvY2tzOyArK2NibGtubykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9zZWdfdCAqbF9zZWcgPSAwMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsX2NibGstPm51bW5ld3Bhc3NlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9jYmxrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsX2NibGstPm51bXNlZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zZWcgPSBsX2NibGstPnNlZ3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9jYmxrLT5udW1zZWdzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NibGstPmRhdGFfY3VycmVudF9zaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NlZyA9ICZsX2NibGstPnNlZ3NbbF9jYmxrLT5udW1zZWdzIC0gMV07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfc2VnLT5udW1wYXNzZXMgPT0gbF9zZWctPm1heHBhc3NlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9zZWc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX2NibGstPm51bXNlZ3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBwb3NzaWJsZSBvdmVyZmxvdyB0aGVuIHNpemUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoKnBfZGF0YV9yZWFkICsgbF9zZWctPm5ld2xlbikgPCAoKnBfZGF0YV9yZWFkKSkgfHwgKCgqcF9kYXRhX3JlYWQgKyBsX3NlZy0+bmV3bGVuKSA+IHBfbWF4X2xlbmd0aCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNraXA6IHNlZ21lbnQgdG9vIGxvbmcgKCVkKSB3aXRoIG1heCAoJWQpIGZvciBjb2RlYmxvY2sgJWQgKHA9JWQsIGI9JWQsIHI9JWQsIGM9JWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zZWctPm5ld2xlbiwgcF9tYXhfbGVuZ3RoLCBjYmxrbm8sIHBfcGktPnByZWNubywgYmFuZG5vLCBwX3BpLT5yZXNubywgcF9waS0+Y29tcG5vKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSNpZmRlZiBVU0VfSlBXTAotICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UgbmVlZCBoZXJlIGEgajJrIGhhbmRsZSB0byB2ZXJpZnkgaWYgbWFraW5nIGEgY2hlY2sgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB2YWxpZGl0eSBvZiBjYmxvY2tzIHBhcmFtZXRlcnMgaXMgc2VsZWN0ZWQgZnJvbSB1c2VyICgtVykgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZXQncyBjaGVjayB0aGF0IHdlIGFyZSBub3QgZXhjZWVkaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobF9jYmxrLT5sZW4gKyBsX3NlZy0+bmV3bGVuKSA+IDgxOTIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfdDItPmNpbmZvLCBFVlRfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKUFdMOiBzZWdtZW50IHRvbyBsb25nICglZCkgZm9yIGNvZGVibG9jayAlZCAocD0lZCwgYj0lZCwgcj0lZCwgYz0lZClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NlZy0+bmV3bGVuLCBjYmxrbm8sIHBfcGktPnByZWNubywgYmFuZG5vLCBwX3BpLT5yZXNubywgcF9waS0+Y29tcG5vKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUpQV0xfQVNTVU1FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfdDItPmNpbmZvLCBFVlRfRVJST1IsICJKUFdMOiBnaXZpbmcgdXBcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC05OTk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2VnLT5uZXdsZW4gPSA4MTkyIC0gbF9jYmxrLT5sZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX3QyLT5jaW5mbywgRVZUX1dBUk5JTkcsICIgICAgICAtIHRydW5jYXRpbmcgc2VnbWVudCB0byAlZFxuIiwgbF9zZWctPm5ld2xlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSNlbmRpZiAvKiBVU0VfSlBXTCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBU19GUFJJTlRGKHN0ZGVyciwgInBfZGF0YV9yZWFkICglZCkgbmV3bGVuICglZCkgXG4iLCAqcF9kYXRhX3JlYWQsIGxfc2VnLT5uZXdsZW4gKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwX2RhdGFfcmVhZCkgKz0gbF9zZWctPm5ld2xlbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NlZy0+bnVtcGFzc2VzICs9IGxfc2VnLT5udW1uZXdwYXNzZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+bnVtbmV3cGFzc2VzIC09IGxfc2VnLT5udW1uZXdwYXNzZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2NibGstPm51bW5ld3Bhc3NlcyA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfc2VnOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9jYmxrLT5udW1zZWdzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChsX2NibGstPm51bW5ld3Bhc3NlcyA+IDApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICArK2xfY2JsazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICArK2xfYmFuZDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotCi1PUEpfQk9PTCBvcGpfdDJfaW5pdF9zZWcoICAgb3BqX3RjZF9jYmxrX2RlY190KiBjYmxrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgaW5kZXgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgY2Jsa3N0eSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBmaXJzdCkKLXsKLSAgICAgICAgb3BqX3RjZF9zZWdfdCogc2VnID0gMDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl9zZWdzID0gaW5kZXggKyAxOwotCi0gICAgICAgIGlmIChsX25iX3NlZ3MgPiBjYmxrLT5tX2N1cnJlbnRfbWF4X3NlZ3MpIHsKLSAgICAgICAgICAgICAgICBvcGpfdGNkX3NlZ190KiBuZXdfc2VnczsKLSAgICAgICAgICAgICAgICBjYmxrLT5tX2N1cnJlbnRfbWF4X3NlZ3MgKz0gT1BKX0oyS19ERUZBVUxUX05CX1NFR1M7Ci0KLSAgICAgICAgICAgICAgICBuZXdfc2VncyA9IChvcGpfdGNkX3NlZ190Kikgb3BqX3JlYWxsb2MoY2Jsay0+c2VncywgY2Jsay0+bV9jdXJyZW50X21heF9zZWdzICogc2l6ZW9mKG9wal90Y2Rfc2VnX3QpKTsKLSAgICAgICAgICAgICAgICBpZighIG5ld19zZWdzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShjYmxrLT5zZWdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPnNlZ3MgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgY2Jsay0+bV9jdXJyZW50X21heF9zZWdzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBpbml0aWFsaXplIHNlZ21lbnQgJWRcbiIsIGxfbmJfc2Vncyk7ICovCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYmxrLT5zZWdzID0gbmV3X3NlZ3M7Ci0gICAgICAgIH0KLQotICAgICAgICBzZWcgPSAmY2Jsay0+c2Vnc1tpbmRleF07Ci0gICAgICAgIG1lbXNldChzZWcsMCxzaXplb2Yob3BqX3RjZF9zZWdfdCkpOwotCi0gICAgICAgIGlmIChjYmxrc3R5ICYgSjJLX0NDUF9DQkxLU1RZX1RFUk1BTEwpIHsKLSAgICAgICAgICAgICAgICBzZWctPm1heHBhc3NlcyA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9MQVpZKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWctPm1heHBhc3NlcyA9IDEwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWctPm1heHBhc3NlcyA9ICgoKHNlZyAtIDEpLT5tYXhwYXNzZXMgPT0gMSkgfHwgKChzZWcgLSAxKS0+bWF4cGFzc2VzID09IDEwKSkgPyAyIDogMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2VnLT5tYXhwYXNzZXMgPSAxMDk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvdDIuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC90Mi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzExNDFlLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC90Mi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKLSAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKLSAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKLSAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgVW5pdmVyc2l0ZSBjYXRob2xpcXVlIGRlIExvdXZhaW4gKFVDTCksIEJlbGdpdW0KLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBQcm9mZXNzb3IgQmVub2l0IE1hY3EKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzLCBEYXZpZCBKYW5zc2VucwotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIFlhbm5pY2sgVmVyc2NodWVyZW4KLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eCAKLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE0LCBBbnRvbmluIERlc2NhbXBlCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMS0yMDEyLCBDZW50cmUgTmF0aW9uYWwgZCdFdHVkZXMgU3BhdGlhbGVzIChDTkVTKSwgRlIgCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENTIFN5c3RlbWVzIGQnSW5mb3JtYXRpb24sIEZyYW5jZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCi0gKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotI2lmbmRlZiBfX1QyX0gKLSNkZWZpbmUgX19UMl9ICi0vKioKLUBmaWxlIHQyLmgKLUBicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBhIHRpZXItMiBjb2RpbmcgKHBhY2tldGl6YXRpb24gb2YgY29kZS1ibG9jayBkYXRhKSAoVDIpCi0KLSovCi0KLS8qKiBAZGVmZ3JvdXAgVDIgVDIgLSBJbXBsZW1lbnRhdGlvbiBvZiBhIHRpZXItMiBjb2RpbmcgKi8KLS8qQHsqLwotCi0vKioKLVRpZXItMiBjb2RpbmcKLSovCi10eXBlZGVmIHN0cnVjdCBvcGpfdDIgewotCi0JLyoqIEVuY29kaW5nOiBwb2ludGVyIHRvIHRoZSBzcmMgaW1hZ2UuIERlY29kaW5nOiBwb2ludGVyIHRvIHRoZSBkc3QgaW1hZ2UuICovCi0Jb3BqX2ltYWdlX3QgKmltYWdlOwotCS8qKiBwb2ludGVyIHRvIHRoZSBpbWFnZSBjb2RpbmcgcGFyYW1ldGVycyAqLwotCW9wal9jcF90ICpjcDsKLX0gb3BqX3QyX3Q7Ci0KLS8qKiBAbmFtZSBFeHBvcnRlZCBmdW5jdGlvbnMgKi8KLS8qQHsqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqCi1FbmNvZGUgdGhlIHBhY2tldHMgb2YgYSB0aWxlIHRvIGEgZGVzdGluYXRpb24gYnVmZmVyCi1AcGFyYW0gdDIgICAgICAgICAgICAgICBUMiBoYW5kbGUKLUBwYXJhbSB0aWxlbm8gICAgICAgICAgIG51bWJlciBvZiB0aGUgdGlsZSBlbmNvZGVkCi1AcGFyYW0gdGlsZSAgICAgICAgICAgICB0aGUgdGlsZSBmb3Igd2hpY2ggdG8gd3JpdGUgdGhlIHBhY2tldHMKLUBwYXJhbSBtYXhsYXllcnMgICAgICAgIG1heGltdW0gbnVtYmVyIG9mIGxheWVycwotQHBhcmFtIGRlc3QgICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgotQHBhcmFtIHBfZGF0YV93cml0dGVuICAgRklYTUUgRE9DCi1AcGFyYW0gbGVuICAgICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLUBwYXJhbSBjc3RyX2luZm8gICAgICAgIENvZGVzdHJlYW0gaW5mb3JtYXRpb24gc3RydWN0dXJlCi1AcGFyYW0gdHBudW0gICAgICAgICAgICBUaWxlIHBhcnQgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHRpbGUKLUBwYXJhbSB0cHBvcyAgICAgICAgICAgIFRoZSBwb3NpdGlvbiBvZiB0aGUgdGlsZSBwYXJ0IGZsYWcgaW4gdGhlIHByb2dyZXNzaW9uIG9yZGVyCi1AcGFyYW0gcGlubyAgICAgICAgICAgICBGSVhNRSBET0MKLUBwYXJhbSB0Ml9tb2RlICAgICAgICAgIElmID09IDAgSW4gVGhyZXNob2xkIGNhbGN1bGF0aW9uICxJZiA9PSAxIEZpbmFsIHBhc3MKLSovCi1PUEpfQk9PTCBvcGpfdDJfZW5jb2RlX3BhY2tldHMoCW9wal90Ml90KiB0MiwKLQkJCQkJCQkJT1BKX1VJTlQzMiB0aWxlbm8sCi0JCQkJCQkJCW9wal90Y2RfdGlsZV90ICp0aWxlLAotCQkJCQkJCQlPUEpfVUlOVDMyIG1heGxheWVycywKLQkJCQkJCQkJT1BKX0JZVEUgKmRlc3QsCi0JCQkJCQkJCU9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKLQkJCQkJCQkJT1BKX1VJTlQzMiBsZW4sCi0JCQkJCQkJCW9wal9jb2Rlc3RyZWFtX2luZm9fdCAqY3N0cl9pbmZvLAotCQkJCQkJCQlPUEpfVUlOVDMyIHRwbnVtLAotCQkJCQkJCQlPUEpfSU5UMzIgdHBwb3MsCi0JCQkJCQkJCU9QSl9VSU5UMzIgcGlubywKLQkJCQkJCQkJSjJLX1QyX01PREUgdDJfbW9kZSk7Ci0KLS8qKgotRGVjb2RlIHRoZSBwYWNrZXRzIG9mIGEgdGlsZSBmcm9tIGEgc291cmNlIGJ1ZmZlcgotQHBhcmFtIHQyIFQyIGhhbmRsZQotQHBhcmFtIHRpbGVubyBudW1iZXIgdGhhdCBpZGVudGlmaWVzIHRoZSB0aWxlIGZvciB3aGljaCB0byBkZWNvZGUgdGhlIHBhY2tldHMKLUBwYXJhbSB0aWxlIHRpbGUgZm9yIHdoaWNoIHRvIGRlY29kZSB0aGUgcGFja2V0cwotQHBhcmFtIHNyYyAgICAgICAgIEZJWE1FIERPQwotQHBhcmFtIHBfZGF0YV9yZWFkIHRoZSBzb3VyY2UgYnVmZmVyCi1AcGFyYW0gbGVuIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlcgotQHBhcmFtIGNzdHJfaW5mbyAgIEZJWE1FIERPQwotCi1AcmV0dXJuIEZJWE1FIERPQwotICovCi1PUEpfQk9PTCBvcGpfdDJfZGVjb2RlX3BhY2tldHMoCW9wal90Ml90ICp0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0aWxlbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICp0aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmRleF90ICpjc3RyX2luZm8pOwotCi0vKioKLSAqIENyZWF0ZXMgYSBUaWVyIDIgaGFuZGxlCi0gKgotICogQHBhcmFtCXBfaW1hZ2UJCVNvdXJjZSBvciBkZXN0aW5hdGlvbiBpbWFnZQotICogQHBhcmFtCXBfY3AJCUltYWdlIGNvZGluZyBwYXJhbWV0ZXJzLgotICogQHJldHVybgkJYSBuZXcgVDIgaGFuZGxlIGlmIHN1Y2Nlc3NmdWwsIE5VTEwgb3RoZXJ3aXNlLgotKi8KLW9wal90Ml90KiBvcGpfdDJfY3JlYXRlKG9wal9pbWFnZV90ICpwX2ltYWdlLCBvcGpfY3BfdCAqcF9jcCk7Ci0KLS8qKgotRGVzdHJveSBhIFQyIGhhbmRsZQotQHBhcmFtIHQyIFQyIGhhbmRsZSB0byBkZXN0cm95Ci0qLwotdm9pZCBvcGpfdDJfZGVzdHJveShvcGpfdDJfdCAqdDIpOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLypAfSovCi0KLS8qQH0qLwotCi0jZW5kaWYgLyogX19UMl9IICovCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvdGNkLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvdGNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MjMxMjAuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL3RjZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIwOSArMCwwIEBACi0vKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCi0gKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCi0gKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFVuaXZlcnNpdGUgY2F0aG9saXF1ZSBkZSBMb3V2YWluIChVQ0wpLCBCZWxnaXVtCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQotICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNywgUGFydmF0aGEgRWxhbmdvdmFuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZSIAotICogQ29weXJpZ2h0IChjKSAyMDEyLCBDUyBTeXN0ZW1lcyBkJ0luZm9ybWF0aW9uLCBGcmFuY2UKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgQVMgSVMnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQotICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgIm9wal9pbmNsdWRlcy5oIgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBUT0RPIE1TRDogKi8KLSNpZmRlZiBUT0RPX01TRCAKLXZvaWQgdGNkX2R1bXAoRklMRSAqZmQsIG9wal90Y2RfdCAqdGNkLCBvcGpfdGNkX2ltYWdlX3QgKiBpbWcpIHsKLSAgICAgICAgaW50IHRpbGVubywgY29tcG5vLCByZXNubywgYmFuZG5vLCBwcmVjbm87LyosIGNibGtubzsqLwotCi0gICAgICAgIGZwcmludGYoZmQsICJpbWFnZSB7XG4iKTsKLSAgICAgICAgZnByaW50ZihmZCwgIiAgdHc9JWQsIHRoPSVkIHgwPSVkIHgxPSVkIHkwPSVkIHkxPSVkXG4iLCAKLSAgICAgICAgICAgICAgICBpbWctPnR3LCBpbWctPnRoLCB0Y2QtPmltYWdlLT54MCwgdGNkLT5pbWFnZS0+eDEsIHRjZC0+aW1hZ2UtPnkwLCB0Y2QtPmltYWdlLT55MSk7Ci0KLSAgICAgICAgZm9yICh0aWxlbm8gPSAwOyB0aWxlbm8gPCBpbWctPnRoICogaW1nLT50dzsgdGlsZW5vKyspIHsKLSAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVfdCAqdGlsZSA9ICZ0Y2QtPnRjZF9pbWFnZS0+dGlsZXNbdGlsZW5vXTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICB0aWxlIHtcbiIpOwotICAgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgeDA9JWQsIHkwPSVkLCB4MT0lZCwgeTE9JWQsIG51bWNvbXBzPSVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgdGlsZS0+eDAsIHRpbGUtPnkwLCB0aWxlLT54MSwgdGlsZS0+eTEsIHRpbGUtPm51bWNvbXBzKTsKLSAgICAgICAgICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHRpbGUtPm51bWNvbXBzOyBjb21wbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlY29tcF90ICp0aWxlYyA9ICZ0aWxlLT5jb21wc1tjb21wbm9dOwotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgICB0aWxlYyB7XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICB4MD0lZCwgeTA9JWQsIHgxPSVkLCB5MT0lZCwgbnVtcmVzb2x1dGlvbnM9JWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVjLT54MCwgdGlsZWMtPnkwLCB0aWxlYy0+eDEsIHRpbGVjLT55MSwgdGlsZWMtPm51bXJlc29sdXRpb25zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocmVzbm8gPSAwOyByZXNubyA8IHRpbGVjLT5udW1yZXNvbHV0aW9uczsgcmVzbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCAqcmVzID0gJnRpbGVjLT5yZXNvbHV0aW9uc1tyZXNub107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmQsICJcbiAgIHJlcyB7XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgIHgwPSVkLCB5MD0lZCwgeDE9JWQsIHkxPSVkLCBwdz0lZCwgcGg9JWQsIG51bWJhbmRzPSVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy0+eDAsIHJlcy0+eTAsIHJlcy0+eDEsIHJlcy0+eTEsIHJlcy0+cHcsIHJlcy0+cGgsIHJlcy0+bnVtYmFuZHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IHJlcy0+bnVtYmFuZHM7IGJhbmRubysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9iYW5kX3QgKmJhbmQgPSAmcmVzLT5iYW5kc1tiYW5kbm9dOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgICAgIGJhbmQge1xuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgeDA9JWQsIHkwPSVkLCB4MT0lZCwgeTE9JWQsIHN0ZXBzaXplPSVmLCBudW1icHM9JWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kLT54MCwgYmFuZC0+eTAsIGJhbmQtPngxLCBiYW5kLT55MSwgYmFuZC0+c3RlcHNpemUsIGJhbmQtPm51bWJwcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChwcmVjbm8gPSAwOyBwcmVjbm8gPCByZXMtPnB3ICogcmVzLT5waDsgcHJlY25vKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfcHJlY2luY3RfdCAqcHJlYyA9ICZiYW5kLT5wcmVjaW5jdHNbcHJlY25vXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgICAgICAgcHJlYyB7XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICB4MD0lZCwgeTA9JWQsIHgxPSVkLCB5MT0lZCwgY3c9JWQsIGNoPSVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjLT54MCwgcHJlYy0+eTAsIHByZWMtPngxLCBwcmVjLT55MSwgcHJlYy0+Y3csIHByZWMtPmNoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IHByZWMtPmN3ICogcHJlYy0+Y2g7IGNibGtubysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfY2Jsa190ICpjYmxrID0gJnByZWMtPmNibGtzW2NibGtub107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgICAgICAgICBjYmxrIHtcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIHgwPSVkLCB5MD0lZCwgeDE9JWQsIHkxPSVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPngwLCBjYmxrLT55MCwgY2Jsay0+eDEsIGNibGstPnkxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgICAgICAgICAgIH1cbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgICAgICAgfVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgICAgIH1cbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgICB9XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgfVxuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgIH1cbiIpOwotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYoZmQsICJ9XG4iKTsKLX0KLSNlbmRpZgotCi0vKioKLSAqIEluaXRpYWxpemVzIHRpbGUgY29kaW5nL2RlY29kaW5nCi0gKi8KLXN0YXRpYyBJTkxJTkUgT1BKX0JPT0wgb3BqX3RjZF9pbml0X3RpbGUob3BqX3RjZF90ICpwX3RjZCwgT1BKX1VJTlQzMiBwX3RpbGVfbm8sIE9QSl9CT09MIGlzRW5jb2RlciwgT1BKX0ZMT0FUMzIgZnJhY3Rpb24sIE9QSl9TSVpFX1Qgc2l6ZW9mX2Jsb2NrKTsKLQotLyoqCi0qIEFsbG9jYXRlcyBtZW1vcnkgZm9yIGEgZGVjb2RpbmcgY29kZSBibG9jay4KLSovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF9jb2RlX2Jsb2NrX2RlY19hbGxvY2F0ZSAob3BqX3RjZF9jYmxrX2RlY190ICogcF9jb2RlX2Jsb2NrKTsKLQotLyoqCi0gKiBEZWFsbG9jYXRlcyB0aGUgZGVjb2RpbmcgZGF0YSBvZiB0aGUgZ2l2ZW4gcHJlY2luY3QuCi0gKi8KLXN0YXRpYyB2b2lkIG9wal90Y2RfY29kZV9ibG9ja19kZWNfZGVhbGxvY2F0ZSAob3BqX3RjZF9wcmVjaW5jdF90ICogcF9wcmVjaW5jdCk7Ci0KLS8qKgotICogQWxsb2NhdGVzIG1lbW9yeSBmb3IgYW4gZW5jb2RpbmcgY29kZSBibG9jayAoYnV0IG5vdCBkYXRhKS4KLSAqLwotc3RhdGljIE9QSl9CT09MIG9wal90Y2RfY29kZV9ibG9ja19lbmNfYWxsb2NhdGUgKG9wal90Y2RfY2Jsa19lbmNfdCAqIHBfY29kZV9ibG9jayk7Ci0KLS8qKgotICogQWxsb2NhdGVzIGRhdGEgZm9yIGFuIGVuY29kaW5nIGNvZGUgYmxvY2sKLSAqLwotc3RhdGljIE9QSl9CT09MIG9wal90Y2RfY29kZV9ibG9ja19lbmNfYWxsb2NhdGVfZGF0YSAob3BqX3RjZF9jYmxrX2VuY190ICogcF9jb2RlX2Jsb2NrKTsKLQotLyoqCi0gKiBEZWFsbG9jYXRlcyB0aGUgZW5jb2RpbmcgZGF0YSBvZiB0aGUgZ2l2ZW4gcHJlY2luY3QuCi0gKi8KLXN0YXRpYyB2b2lkIG9wal90Y2RfY29kZV9ibG9ja19lbmNfZGVhbGxvY2F0ZSAob3BqX3RjZF9wcmVjaW5jdF90ICogcF9wcmVjaW5jdCk7Ci0KLQotLyoqCi1GcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBlbmNvZGluZwotQHBhcmFtIHRjZCBUQ0QgaGFuZGxlCi0qLwotc3RhdGljIHZvaWQgb3BqX3RjZF9mcmVlX3RpbGUob3BqX3RjZF90ICp0Y2QpOwotCi0KLXN0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX3QyX2RlY29kZSAoIG9wal90Y2RfdCAqcF90Y2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfc3JjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X3NyY19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NvZGVzdHJlYW1faW5kZXhfdCAqcF9jc3RyX2luZGV4ICk7Ci0KLXN0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX3QxX2RlY29kZSAob3BqX3RjZF90ICpwX3RjZCk7Ci0KLXN0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX2R3dF9kZWNvZGUgKG9wal90Y2RfdCAqcF90Y2QpOwotCi1zdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF9tY3RfZGVjb2RlIChvcGpfdGNkX3QgKnBfdGNkKTsKLQotc3RhdGljIE9QSl9CT09MIG9wal90Y2RfZGNfbGV2ZWxfc2hpZnRfZGVjb2RlIChvcGpfdGNkX3QgKnBfdGNkKTsKLQotCi1zdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF9kY19sZXZlbF9zaGlmdF9lbmNvZGUgKCBvcGpfdGNkX3QgKnBfdGNkICk7Ci0KLXN0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX21jdF9lbmNvZGUgKCBvcGpfdGNkX3QgKnBfdGNkICk7Ci0KLXN0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX2R3dF9lbmNvZGUgKCBvcGpfdGNkX3QgKnBfdGNkICk7Ci0KLXN0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX3QxX2VuY29kZSAoIG9wal90Y2RfdCAqcF90Y2QgKTsKLQotc3RhdGljIE9QSl9CT09MIG9wal90Y2RfdDJfZW5jb2RlICggICAgIG9wal90Y2RfdCAqcF90Y2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kZXN0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9kZXN0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZm9fdCAqcF9jc3RyX2luZm8gKTsKLQotc3RhdGljIE9QSl9CT09MIG9wal90Y2RfcmF0ZV9hbGxvY2F0ZV9lbmNvZGUoICAgb3BqX3RjZF90ICpwX3RjZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGVzdF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfZGVzdF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZm9fdCAqcF9jc3RyX2luZm8gKTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyoqCi1DcmVhdGUgYSBuZXcgVENEIGhhbmRsZQotKi8KLW9wal90Y2RfdCogb3BqX3RjZF9jcmVhdGUoT1BKX0JPT0wgcF9pc19kZWNvZGVyKQotewotICAgICAgICBvcGpfdGNkX3QgKmxfdGNkID0gMDA7Ci0KLSAgICAgICAgLyogY3JlYXRlIHRoZSB0Y2Qgc3RydWN0dXJlICovCi0gICAgICAgIGxfdGNkID0gKG9wal90Y2RfdCopIG9wal9jYWxsb2MoMSxzaXplb2Yob3BqX3RjZF90KSk7Ci0gICAgICAgIGlmICghbF90Y2QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDA7Ci0gICAgICAgIH0KLQotICAgICAgICBsX3RjZC0+bV9pc19kZWNvZGVyID0gcF9pc19kZWNvZGVyID8gMSA6IDA7Ci0KLSAgICAgICAgbF90Y2QtPnRjZF9pbWFnZSA9IChvcGpfdGNkX2ltYWdlX3QqKW9wal9jYWxsb2MoMSxzaXplb2Yob3BqX3RjZF9pbWFnZV90KSk7Ci0gICAgICAgIGlmICghbF90Y2QtPnRjZF9pbWFnZSkgewotICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfdGNkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDA7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbF90Y2Q7Ci19Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotdm9pZCBvcGpfdGNkX3JhdGVhbGxvY2F0ZV9maXhlZChvcGpfdGNkX3QgKnRjZCkgewotICAgICAgICBPUEpfVUlOVDMyIGxheW5vOwotCi0gICAgICAgIGZvciAobGF5bm8gPSAwOyBsYXlubyA8IHRjZC0+dGNwLT5udW1sYXllcnM7IGxheW5vKyspIHsKLSAgICAgICAgICAgICAgICBvcGpfdGNkX21ha2VsYXllcl9maXhlZCh0Y2QsIGxheW5vLCAxKTsKLSAgICAgICAgfQotfQotCi0KLXZvaWQgb3BqX3RjZF9tYWtlbGF5ZXIoIG9wal90Y2RfdCAqdGNkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsYXlubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDY0IHRocmVzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgZmluYWwpCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgY29tcG5vLCByZXNubywgYmFuZG5vLCBwcmVjbm8sIGNibGtubzsKLSAgICAgICAgT1BKX1VJTlQzMiBwYXNzbm87Ci0KLSAgICAgICAgb3BqX3RjZF90aWxlX3QgKnRjZF90aWxlID0gdGNkLT50Y2RfaW1hZ2UtPnRpbGVzOwotCi0gICAgICAgIHRjZF90aWxlLT5kaXN0b2xheWVyW2xheW5vXSA9IDA7ICAgICAgICAvKiBmaXhlZF9xdWFsaXR5ICovCi0KLSAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCB0Y2RfdGlsZS0+bnVtY29tcHM7IGNvbXBubysrKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlY29tcF90ICp0aWxlYyA9ICZ0Y2RfdGlsZS0+Y29tcHNbY29tcG5vXTsKLQotICAgICAgICAgICAgICAgIGZvciAocmVzbm8gPSAwOyByZXNubyA8IHRpbGVjLT5udW1yZXNvbHV0aW9uczsgcmVzbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9yZXNvbHV0aW9uX3QgKnJlcyA9ICZ0aWxlYy0+cmVzb2x1dGlvbnNbcmVzbm9dOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IHJlcy0+bnVtYmFuZHM7IGJhbmRubysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfYmFuZF90ICpiYW5kID0gJnJlcy0+YmFuZHNbYmFuZG5vXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHByZWNubyA9IDA7IHByZWNubyA8IHJlcy0+cHcgKiByZXMtPnBoOyBwcmVjbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfcHJlY2luY3RfdCAqcHJjID0gJmJhbmQtPnByZWNpbmN0c1twcmVjbm9dOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjYmxrbm8gPSAwOyBjYmxrbm8gPCBwcmMtPmN3ICogcHJjLT5jaDsgY2Jsa25vKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfY2Jsa19lbmNfdCAqY2JsayA9ICZwcmMtPmNibGtzLmVuY1tjYmxrbm9dOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9sYXllcl90ICpsYXllciA9ICZjYmxrLT5sYXllcnNbbGF5bm9dOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBuOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF5bm8gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYmxrLT5udW1wYXNzZXNpbmxheWVycyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBjYmxrLT5udW1wYXNzZXNpbmxheWVyczsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChwYXNzbm8gPSBjYmxrLT5udW1wYXNzZXNpbmxheWVyczsgcGFzc25vIDwgY2Jsay0+dG90YWxwYXNzZXM7IHBhc3NubysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgZHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDY0IGRkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3Bhc3NfdCAqcGFzcyA9ICZjYmxrLT5wYXNzZXNbcGFzc25vXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHIgPSBwYXNzLT5yYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkID0gcGFzcy0+ZGlzdG9ydGlvbmRlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkciA9IHBhc3MtPnJhdGUgLSBjYmxrLT5wYXNzZXNbbiAtIDFdLnJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGQgPSBwYXNzLT5kaXN0b3J0aW9uZGVjIC0gY2Jsay0+cGFzc2VzW24gLSAxXS5kaXN0b3J0aW9uZGVjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZCAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHBhc3NubyArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRkIC8gZHIgPj0gdGhyZXNoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBwYXNzbm8gKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci0+bnVtcGFzc2VzID0gbiAtIGNibGstPm51bXBhc3Nlc2lubGF5ZXJzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxheWVyLT5udW1wYXNzZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXItPmRpc3RvID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYmxrLT5udW1wYXNzZXNpbmxheWVycyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5sZW4gPSBjYmxrLT5wYXNzZXNbbiAtIDFdLnJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5kYXRhID0gY2Jsay0+ZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXItPmRpc3RvID0gY2Jsay0+cGFzc2VzW24gLSAxXS5kaXN0b3J0aW9uZGVjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXItPmxlbiA9IGNibGstPnBhc3Nlc1tuIC0gMV0ucmF0ZSAtIGNibGstPnBhc3Nlc1tjYmxrLT5udW1wYXNzZXNpbmxheWVycyAtIDFdLnJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5kYXRhID0gY2Jsay0+ZGF0YSArIGNibGstPnBhc3Nlc1tjYmxrLT5udW1wYXNzZXNpbmxheWVycyAtIDFdLnJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5kaXN0byA9IGNibGstPnBhc3Nlc1tuIC0gMV0uZGlzdG9ydGlvbmRlYyAtIGNibGstPnBhc3Nlc1tjYmxrLT5udW1wYXNzZXNpbmxheWVycyAtIDFdLmRpc3RvcnRpb25kZWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZF90aWxlLT5kaXN0b2xheWVyW2xheW5vXSArPSBsYXllci0+ZGlzdG87ICAgIC8qIGZpeGVkX3F1YWxpdHkgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYmxrLT5udW1wYXNzZXNpbmxheWVycyA9IG47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci19Ci0KLXZvaWQgb3BqX3RjZF9tYWtlbGF5ZXJfZml4ZWQob3BqX3RjZF90ICp0Y2QsIE9QSl9VSU5UMzIgbGF5bm8sIE9QSl9VSU5UMzIgZmluYWwpIHsKLSAgICAgICAgT1BKX1VJTlQzMiBjb21wbm8sIHJlc25vLCBiYW5kbm8sIHByZWNubywgY2Jsa25vOwotICAgICAgICBPUEpfSU5UMzIgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgLyosIG1hdHJpY2VbdGNkX3RjcC0+bnVtbGF5ZXJzXVt0Y2RfdGlsZS0+Y29tcHNbMF0ubnVtcmVzb2x1dGlvbnNdWzNdOyAqLwotICAgICAgICBPUEpfSU5UMzIgbWF0cmljZVsxMF1bMTBdWzNdOwotICAgICAgICBPUEpfVUlOVDMyIGksIGosIGs7Ci0KLSAgICAgICAgb3BqX2NwX3QgKmNwID0gdGNkLT5jcDsKLSAgICAgICAgb3BqX3RjZF90aWxlX3QgKnRjZF90aWxlID0gdGNkLT50Y2RfaW1hZ2UtPnRpbGVzOwotICAgICAgICBvcGpfdGNwX3QgKnRjZF90Y3AgPSB0Y2QtPnRjcDsKLQotICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHRjZF90aWxlLT5udW1jb21wczsgY29tcG5vKyspIHsKLSAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKnRpbGVjID0gJnRjZF90aWxlLT5jb21wc1tjb21wbm9dOwotCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRjZF90Y3AtPm51bWxheWVyczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdGlsZWMtPm51bXJlc29sdXRpb25zOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDM7IGsrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpY2VbaV1bal1ba10gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMikgKChPUEpfRkxPQVQzMiljcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX21hdHJpY2VbaSAqIHRpbGVjLT5udW1yZXNvbHV0aW9ucyAqIDMgKyBqICogMyArIGtdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChPUEpfRkxPQVQzMikgKHRjZC0+aW1hZ2UtPmNvbXBzW2NvbXBub10ucHJlYyAvIDE2LjApKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAocmVzbm8gPSAwOyByZXNubyA8IHRpbGVjLT5udW1yZXNvbHV0aW9uczsgcmVzbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9yZXNvbHV0aW9uX3QgKnJlcyA9ICZ0aWxlYy0+cmVzb2x1dGlvbnNbcmVzbm9dOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IHJlcy0+bnVtYmFuZHM7IGJhbmRubysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfYmFuZF90ICpiYW5kID0gJnJlcy0+YmFuZHNbYmFuZG5vXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHByZWNubyA9IDA7IHByZWNubyA8IHJlcy0+cHcgKiByZXMtPnBoOyBwcmVjbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfcHJlY2luY3RfdCAqcHJjID0gJmJhbmQtPnByZWNpbmN0c1twcmVjbm9dOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjYmxrbm8gPSAwOyBjYmxrbm8gPCBwcmMtPmN3ICogcHJjLT5jaDsgY2Jsa25vKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfY2Jsa19lbmNfdCAqY2JsayA9ICZwcmMtPmNibGtzLmVuY1tjYmxrbm9dOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9sYXllcl90ICpsYXllciA9ICZjYmxrLT5sYXllcnNbbGF5bm9dOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIGltc2IgPSAoT1BKX0lOVDMyKSh0Y2QtPmltYWdlLT5jb21wc1tjb21wbm9dLnByZWMgLSBjYmxrLT5udW1icHMpOyAvKiBudW1iZXIgb2YgYml0LXBsYW4gZXF1YWwgdG8gemVybyAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb3JyZWN0aW9uIG9mIHRoZSBtYXRyaXggb2YgY29lZmZpY2llbnQgdG8gaW5jbHVkZSB0aGUgSU1TQiBpbmZvcm1hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxheW5vID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBtYXRyaWNlW2xheW5vXVtyZXNub11bYmFuZG5vXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltc2IgPj0gdmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgLT0gaW1zYjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBtYXRyaWNlW2xheW5vXVtyZXNub11bYmFuZG5vXSAtIG1hdHJpY2VbbGF5bm8gLSAxXVtyZXNub11bYmFuZG5vXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltc2IgPj0gbWF0cmljZVtsYXlubyAtIDFdW3Jlc25vXVtiYW5kbm9dKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgLT0gKGltc2IgLSBtYXRyaWNlW2xheW5vIC0gMV1bcmVzbm9dW2JhbmRub10pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxheW5vID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jsay0+bnVtcGFzc2VzaW5sYXllcnMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gY2Jsay0+bnVtcGFzc2VzaW5sYXllcnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2Jsay0+bnVtcGFzc2VzaW5sYXllcnMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAzICogKE9QSl9VSU5UMzIpdmFsdWUgLSAyICsgY2Jsay0+bnVtcGFzc2VzaW5sYXllcnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGNibGstPm51bXBhc3Nlc2lubGF5ZXJzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gMyAqIChPUEpfVUlOVDMyKXZhbHVlICsgY2Jsay0+bnVtcGFzc2VzaW5sYXllcnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5udW1wYXNzZXMgPSBuIC0gY2Jsay0+bnVtcGFzc2VzaW5sYXllcnM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGF5ZXItPm51bXBhc3NlcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYmxrLT5udW1wYXNzZXNpbmxheWVycyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5sZW4gPSBjYmxrLT5wYXNzZXNbbiAtIDFdLnJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5kYXRhID0gY2Jsay0+ZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5sZW4gPSBjYmxrLT5wYXNzZXNbbiAtIDFdLnJhdGUgLSBjYmxrLT5wYXNzZXNbY2Jsay0+bnVtcGFzc2VzaW5sYXllcnMgLSAxXS5yYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci0+ZGF0YSA9IGNibGstPmRhdGEgKyBjYmxrLT5wYXNzZXNbY2Jsay0+bnVtcGFzc2VzaW5sYXllcnMgLSAxXS5yYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluYWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPm51bXBhc3Nlc2lubGF5ZXJzID0gbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLX0KLQotT1BKX0JPT0wgb3BqX3RjZF9yYXRlYWxsb2NhdGUoICBvcGpfdGNkX3QgKnRjZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NvZGVzdHJlYW1faW5mb190ICpjc3RyX2luZm8pCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgY29tcG5vLCByZXNubywgYmFuZG5vLCBwcmVjbm8sIGNibGtubywgbGF5bm87Ci0gICAgICAgIE9QSl9VSU5UMzIgcGFzc25vOwotICAgICAgICBPUEpfRkxPQVQ2NCBtaW4sIG1heDsKLSAgICAgICAgT1BKX0ZMT0FUNjQgY3VtZGlzdG9bMTAwXTsgICAgICAvKiBmaXhlZF9xdWFsaXR5ICovCi0gICAgICAgIGNvbnN0IE9QSl9GTE9BVDY0IEsgPSAxOyAgICAgICAgICAgICAgICAvKiAxLjE7IGZpeGVkX3F1YWxpdHkgKi8KLSAgICAgICAgT1BKX0ZMT0FUNjQgbWF4U0UgPSAwOwotCi0gICAgICAgIG9wal9jcF90ICpjcCA9IHRjZC0+Y3A7Ci0gICAgICAgIG9wal90Y2RfdGlsZV90ICp0Y2RfdGlsZSA9IHRjZC0+dGNkX2ltYWdlLT50aWxlczsKLSAgICAgICAgb3BqX3RjcF90ICp0Y2RfdGNwID0gdGNkLT50Y3A7Ci0KLSAgICAgICAgbWluID0gREJMX01BWDsKLSAgICAgICAgbWF4ID0gMDsKLQotICAgICAgICB0Y2RfdGlsZS0+bnVtcGl4ID0gMDsgICAgICAgICAgIC8qIGZpeGVkX3F1YWxpdHkgKi8KLQotICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHRjZF90aWxlLT5udW1jb21wczsgY29tcG5vKyspIHsKLSAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKnRpbGVjID0gJnRjZF90aWxlLT5jb21wc1tjb21wbm9dOwotICAgICAgICAgICAgICAgIHRpbGVjLT5udW1waXggPSAwOwotCi0gICAgICAgICAgICAgICAgZm9yIChyZXNubyA9IDA7IHJlc25vIDwgdGlsZWMtPm51bXJlc29sdXRpb25zOyByZXNubysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCAqcmVzID0gJnRpbGVjLT5yZXNvbHV0aW9uc1tyZXNub107Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgcmVzLT5udW1iYW5kczsgYmFuZG5vKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9iYW5kX3QgKmJhbmQgPSAmcmVzLT5iYW5kc1tiYW5kbm9dOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocHJlY25vID0gMDsgcHJlY25vIDwgcmVzLT5wdyAqIHJlcy0+cGg7IHByZWNubysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9wcmVjaW5jdF90ICpwcmMgPSAmYmFuZC0+cHJlY2luY3RzW3ByZWNub107Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IHByYy0+Y3cgKiBwcmMtPmNoOyBjYmxrbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9jYmxrX2VuY190ICpjYmxrID0gJnByYy0+Y2Jsa3MuZW5jW2NibGtub107Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocGFzc25vID0gMDsgcGFzc25vIDwgY2Jsay0+dG90YWxwYXNzZXM7IHBhc3NubysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfcGFzc190ICpwYXNzID0gJmNibGstPnBhc3Nlc1twYXNzbm9dOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgZHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDY0IGRkLCByZHNsb3BlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzbm8gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyID0gKE9QSl9JTlQzMilwYXNzLT5yYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkID0gcGFzcy0+ZGlzdG9ydGlvbmRlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkciA9IChPUEpfSU5UMzIpKHBhc3MtPnJhdGUgLSBjYmxrLT5wYXNzZXNbcGFzc25vIC0gMV0ucmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGQgPSBwYXNzLT5kaXN0b3J0aW9uZGVjIC0gY2Jsay0+cGFzc2VzW3Bhc3NubyAtIDFdLmRpc3RvcnRpb25kZWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHIgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmRzbG9wZSA9IGRkIC8gZHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZHNsb3BlIDwgbWluKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluID0gcmRzbG9wZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZHNsb3BlID4gbWF4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gcmRzbG9wZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBwYXNzbm8gKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWRfcXVhbGl0eSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNkX3RpbGUtPm51bXBpeCArPSAoKGNibGstPngxIC0gY2Jsay0+eDApICogKGNibGstPnkxIC0gY2Jsay0+eTApKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVjLT5udW1waXggKz0gKChjYmxrLT54MSAtIGNibGstPngwKSAqIChjYmxrLT55MSAtIGNibGstPnkwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBjYmtsbm8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBwcmVjbm8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogYmFuZG5vICovCi0gICAgICAgICAgICAgICAgfSAvKiByZXNubyAqLwotCi0gICAgICAgICAgICAgICAgbWF4U0UgKz0gKCgoT1BKX0ZMT0FUNjQpKDEgPDwgdGNkLT5pbWFnZS0+Y29tcHNbY29tcG5vXS5wcmVjKSAtIDEuMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogKChPUEpfRkxPQVQ2NCkoMSA8PCB0Y2QtPmltYWdlLT5jb21wc1tjb21wbm9dLnByZWMpIC0xLjApKQotICAgICAgICAgICAgICAgICAgICAgICAgKiAoKE9QSl9GTE9BVDY0KSh0aWxlYy0+bnVtcGl4KSk7Ci0gICAgICAgIH0gLyogY29tcG5vICovCi0KLSAgICAgICAgLyogaW5kZXggZmlsZSAqLwotICAgICAgICBpZihjc3RyX2luZm8pIHsKLSAgICAgICAgICAgICAgICBvcGpfdGlsZV9pbmZvX3QgKnRpbGVfaW5mbyA9ICZjc3RyX2luZm8tPnRpbGVbdGNkLT50Y2RfdGlsZW5vXTsKLSAgICAgICAgICAgICAgICB0aWxlX2luZm8tPm51bXBpeCA9IHRjZF90aWxlLT5udW1waXg7Ci0gICAgICAgICAgICAgICAgdGlsZV9pbmZvLT5kaXN0b3RpbGUgPSB0Y2RfdGlsZS0+ZGlzdG90aWxlOwotICAgICAgICAgICAgICAgIHRpbGVfaW5mby0+dGhyZXNoID0gKE9QSl9GTE9BVDY0ICopIG9wal9tYWxsb2ModGNkX3RjcC0+bnVtbGF5ZXJzICogc2l6ZW9mKE9QSl9GTE9BVDY0KSk7Ci0gICAgICAgICAgICAgICAgaWYgKCF0aWxlX2luZm8tPnRocmVzaCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogRklYTUUgZXZlbnQgbWFuYWdlciBlcnJvciBjYWxsYmFjayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGxheW5vID0gMDsgbGF5bm8gPCB0Y2RfdGNwLT5udW1sYXllcnM7IGxheW5vKyspIHsKLSAgICAgICAgICAgICAgICBPUEpfRkxPQVQ2NCBsbyA9IG1pbjsKLSAgICAgICAgICAgICAgICBPUEpfRkxPQVQ2NCBoaSA9IG1heDsKLSAgICAgICAgICAgICAgICBPUEpfQk9PTCBzdWNjZXNzID0gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbWF4bGVuID0gdGNkX3RjcC0+cmF0ZXNbbGF5bm9dID8gb3BqX3VpbnRfbWluKCgoT1BKX1VJTlQzMikgY2VpbCh0Y2RfdGNwLT5yYXRlc1tsYXlub10pKSwgbGVuKSA6IGxlbjsKLSAgICAgICAgICAgICAgICBPUEpfRkxPQVQ2NCBnb29kdGhyZXNoID0gMDsKLSAgICAgICAgICAgICAgICBPUEpfRkxPQVQ2NCBzdGFibGVfdGhyZXNoID0gMDsKLSAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgICAgICAgICAgT1BKX0ZMT0FUNjQgZGlzdG90YXJnZXQ7ICAgICAgICAgICAgICAgIC8qIGZpeGVkX3F1YWxpdHkgKi8KLQotICAgICAgICAgICAgICAgIC8qIGZpeGVkX3F1YWxpdHkgKi8KLSAgICAgICAgICAgICAgICBkaXN0b3RhcmdldCA9IHRjZF90aWxlLT5kaXN0b3RpbGUgLSAoKEsgKiBtYXhTRSkgLyBwb3coKE9QSl9GTE9BVDMyKTEwLCB0Y2RfdGNwLT5kaXN0b3JhdGlvW2xheW5vXSAvIDEwKSk7Ci0KLSAgICAgICAgICAgICAgICAvKiBEb24ndCB0cnkgdG8gZmluZCBhbiBvcHRpbWFsIHRocmVzaG9sZCBidXQgcmF0aGVyIHRha2UgZXZlcnl0aGluZyBub3QgaW5jbHVkZWQgeWV0LCBpZgotICAgICAgICAgICAgICAgICAgLXIgeHgseXksenosMCAgIChkaXN0b19hbGxvYyA9PSAxIGFuZCByYXRlcyA9PSAwKQotICAgICAgICAgICAgICAgICAgLXEgeHgseXksenosMCAgIChmaXhlZF9xdWFsaXR5ID09IDEgYW5kIGRpc3RvcmF0aW8gPT0gMCkKLSAgICAgICAgICAgICAgICAgID09PiBwb3NzaWJsZSB0byBoYXZlIHNvbWUgbG9zc3kgbGF5ZXJzIGFuZCB0aGUgbGFzdCBsYXllciBmb3Igc3VyZSBsb3NzbGVzcyAqLwotICAgICAgICAgICAgICAgIGlmICggKChjcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX2Rpc3RvX2FsbG9jPT0xKSAmJiAodGNkX3RjcC0+cmF0ZXNbbGF5bm9dPjApKSB8fCAoKGNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fZml4ZWRfcXVhbGl0eT09MSkgJiYgKHRjZF90Y3AtPmRpc3RvcmF0aW9bbGF5bm9dPjApKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QyX3QqdDIgPSBvcGpfdDJfY3JlYXRlKHRjZC0+aW1hZ2UsIGNwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDY0IHRocmVzaCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0MiA9PSAwMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgICAgIChpID0gMDsgaSA8IDEyODsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDY0IGRpc3RvYWNoaWV2ZWQgPSAwOyAgLyogZml4ZWRfcXVhbGl0eSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaCA9IChsbyArIGhpKSAvIDI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9tYWtlbGF5ZXIodGNkLCBsYXlubywgdGhyZXNoLCAwKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9maXhlZF9xdWFsaXR5KSB7ICAgICAgIC8qIGZpeGVkX3F1YWxpdHkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihPUEpfSVNfQ0lORU1BKGNwLT5yc2l6KSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBvcGpfdDJfZW5jb2RlX3BhY2tldHModDIsdGNkLT50Y2RfdGlsZW5vLCB0Y2RfdGlsZSwgbGF5bm8gKyAxLCBkZXN0LCBwX2RhdGFfd3JpdHRlbiwgbWF4bGVuLCBjc3RyX2luZm8sdGNkLT5jdXJfdHBfbnVtLHRjZC0+dHBfcG9zLHRjZC0+Y3VyX3Bpbm8sVEhSRVNIX0NBTEMpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG8gPSB0aHJlc2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RvYWNoaWV2ZWQgPSBsYXlubyA9PSAwID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZF90aWxlLT5kaXN0b2xheWVyWzBdIDogY3VtZGlzdG9bbGF5bm8gLSAxXSArIHRjZF90aWxlLT5kaXN0b2xheWVyW2xheW5vXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlzdG9hY2hpZXZlZCA8IGRpc3RvdGFyZ2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGk9dGhyZXNoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWJsZV90aHJlc2ggPSB0aHJlc2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvPXRocmVzaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdG9hY2hpZXZlZCA9IChsYXlubyA9PSAwKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNkX3RpbGUtPmRpc3RvbGF5ZXJbMF0gOiAoY3VtZGlzdG9bbGF5bm8gLSAxXSArIHRjZF90aWxlLT5kaXN0b2xheWVyW2xheW5vXSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXN0b2FjaGlldmVkIDwgZGlzdG90YXJnZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGkgPSB0aHJlc2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWJsZV90aHJlc2ggPSB0aHJlc2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG8gPSB0aHJlc2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG9wal90Ml9lbmNvZGVfcGFja2V0cyh0MiwgdGNkLT50Y2RfdGlsZW5vLCB0Y2RfdGlsZSwgbGF5bm8gKyAxLCBkZXN0LHBfZGF0YV93cml0dGVuLCBtYXhsZW4sIGNzdHJfaW5mbyx0Y2QtPmN1cl90cF9udW0sdGNkLT50cF9wb3MsdGNkLT5jdXJfcGlubyxUSFJFU0hfQ0FMQykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETzogd2hhdCB0byBkbyB3aXRoIGwgPz8/IHNlZWsgLyB0ZWxsID8/PyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3BqX2V2ZW50X21zZyh0Y2QtPmNpbmZvLCBFVlRfSU5GTywgInJhdGUgYWxsb2M6IGxlbj0lZCwgbWF4PSVkXG4iLCBsLCBtYXhsZW4pOyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG8gPSB0aHJlc2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaSA9IHRocmVzaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFibGVfdGhyZXNoID0gdGhyZXNoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBPUEpfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvb2R0aHJlc2ggPSBzdGFibGVfdGhyZXNoID09IDA/IHRocmVzaCA6IHN0YWJsZV90aHJlc2g7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Ml9kZXN0cm95KHQyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IE9QSl9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgZ29vZHRocmVzaCA9IG1pbjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoY3N0cl9pbmZvKSB7IC8qIFRocmVzaG9sZCBmb3IgTWFyY2VsYSBJbmRleCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmZvLT50aWxlW3RjZC0+dGNkX3RpbGVub10udGhyZXNoW2xheW5vXSA9IGdvb2R0aHJlc2g7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgb3BqX3RjZF9tYWtlbGF5ZXIodGNkLCBsYXlubywgZ29vZHRocmVzaCwgMSk7Ci0KLSAgICAgICAgICAgICAgICAvKiBmaXhlZF9xdWFsaXR5ICovCi0gICAgICAgICAgICAgICAgY3VtZGlzdG9bbGF5bm9dID0gKGxheW5vID09IDApID8gdGNkX3RpbGUtPmRpc3RvbGF5ZXJbMF0gOiAoY3VtZGlzdG9bbGF5bm8gLSAxXSArIHRjZF90aWxlLT5kaXN0b2xheWVyW2xheW5vXSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9CT09MIG9wal90Y2RfaW5pdCggb3BqX3RjZF90ICpwX3RjZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqIHBfaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NwX3QgKiBwX2NwICkKLXsKLSAgICAgICAgcF90Y2QtPmltYWdlID0gcF9pbWFnZTsKLSAgICAgICAgcF90Y2QtPmNwID0gcF9jcDsKLQotICAgICAgICBwX3RjZC0+dGNkX2ltYWdlLT50aWxlcyA9IChvcGpfdGNkX3RpbGVfdCAqKSBvcGpfY2FsbG9jKDEsc2l6ZW9mKG9wal90Y2RfdGlsZV90KSk7Ci0gICAgICAgIGlmICghIHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT5jb21wcyA9IChvcGpfdGNkX3RpbGVjb21wX3QgKikgb3BqX2NhbGxvYyhwX2ltYWdlLT5udW1jb21wcyxzaXplb2Yob3BqX3RjZF90aWxlY29tcF90KSk7Ci0gICAgICAgIGlmICghIHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT5jb21wcyApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPm51bWNvbXBzID0gcF9pbWFnZS0+bnVtY29tcHM7Ci0gICAgICAgIHBfdGNkLT50cF9wb3MgPSBwX2NwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fdHBfcG9zOwotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotLyoqCi1EZXN0cm95IGEgcHJldmlvdXNseSBjcmVhdGVkIFRDRCBoYW5kbGUKLSovCi12b2lkIG9wal90Y2RfZGVzdHJveShvcGpfdGNkX3QgKnRjZCkgewotICAgICAgICBpZiAodGNkKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3RjZF9mcmVlX3RpbGUodGNkKTsKLQotICAgICAgICAgICAgICAgIGlmICh0Y2QtPnRjZF9pbWFnZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUodGNkLT50Y2RfaW1hZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGNkLT50Y2RfaW1hZ2UgPSAwMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BqX2ZyZWUodGNkKTsKLSAgICAgICAgfQotfQotCi1PUEpfQk9PTCBvcGpfYWxsb2NfdGlsZV9jb21wb25lbnRfZGF0YShvcGpfdGNkX3RpbGVjb21wX3QgKmxfdGlsZWMpCi17Ci0JaWYgKChsX3RpbGVjLT5kYXRhID09IDAwKSB8fCAoKGxfdGlsZWMtPmRhdGFfc2l6ZV9uZWVkZWQgPiBsX3RpbGVjLT5kYXRhX3NpemUpICYmIChsX3RpbGVjLT5vd25zRGF0YSA9PSBPUEpfRkFMU0UpKSkgewotCQlsX3RpbGVjLT5kYXRhID0gKE9QSl9JTlQzMiAqKSBvcGpfbWFsbG9jKGxfdGlsZWMtPmRhdGFfc2l6ZV9uZWVkZWQpOwotCQlpZiAoISBsX3RpbGVjLT5kYXRhICkgewotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCQkvKmZwcmludGYoc3RkZXJyLCAidEFsbG9jYXRlIGRhdGEgb2YgdGlsZWMgKGludCk6ICVkIHggT1BKX1VJTlQzMm4iLGxfZGF0YV9zaXplKTsqLwotCQlsX3RpbGVjLT5kYXRhX3NpemUgPSBsX3RpbGVjLT5kYXRhX3NpemVfbmVlZGVkOwotCQlsX3RpbGVjLT5vd25zRGF0YSA9IE9QSl9UUlVFOwotCX0KLQllbHNlIGlmIChsX3RpbGVjLT5kYXRhX3NpemVfbmVlZGVkID4gbF90aWxlYy0+ZGF0YV9zaXplKSB7Ci0JCU9QSl9JTlQzMiAqIG5ld19kYXRhID0gKE9QSl9JTlQzMiAqKSBvcGpfcmVhbGxvYyhsX3RpbGVjLT5kYXRhLCBsX3RpbGVjLT5kYXRhX3NpemVfbmVlZGVkKTsKLQkJLyogb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGhhbmRsZSB0aWxlIGRhdGFuIik7ICovCi0JCS8qIGZwcmludGYoc3RkZXJyLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIHRpbGUgZGF0YSIpOyAqLwotCQlpZiAoISBuZXdfZGF0YSkgewotCQkJb3BqX2ZyZWUobF90aWxlYy0+ZGF0YSk7Ci0JCQlsX3RpbGVjLT5kYXRhID0gTlVMTDsKLQkJCWxfdGlsZWMtPmRhdGFfc2l6ZSA9IDA7Ci0JCQlsX3RpbGVjLT5kYXRhX3NpemVfbmVlZGVkID0gMDsKLQkJCWxfdGlsZWMtPm93bnNEYXRhID0gT1BKX0ZBTFNFOwotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCQlsX3RpbGVjLT5kYXRhID0gbmV3X2RhdGE7Ci0JCS8qZnByaW50ZihzdGRlcnIsICJ0UmVhbGxvY2F0ZSBkYXRhIG9mIHRpbGVjIChpbnQpOiBmcm9tICVkIHRvICVkIHggT1BKX1VJTlQzMm4iLCBsX3RpbGVjLT5kYXRhX3NpemUsIGxfZGF0YV9zaXplKTsqLwotCQlsX3RpbGVjLT5kYXRhX3NpemUgPSBsX3RpbGVjLT5kYXRhX3NpemVfbmVlZGVkOwotCQlsX3RpbGVjLT5vd25zRGF0YSA9IE9QSl9UUlVFOwotCX0KLQlyZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyBJTkxJTkUgT1BKX0JPT0wgb3BqX3RjZF9pbml0X3RpbGUob3BqX3RjZF90ICpwX3RjZCwgT1BKX1VJTlQzMiBwX3RpbGVfbm8sIE9QSl9CT09MIGlzRW5jb2RlciwgT1BKX0ZMT0FUMzIgZnJhY3Rpb24sIE9QSl9TSVpFX1Qgc2l6ZW9mX2Jsb2NrKQotewotCU9QSl9VSU5UMzIgKCpsX2dhaW5fcHRyKShPUEpfVUlOVDMyKSA9IDAwOwotCU9QSl9VSU5UMzIgY29tcG5vLCByZXNubywgYmFuZG5vLCBwcmVjbm8sIGNibGtubzsKLQlvcGpfdGNwX3QgKiBsX3RjcCA9IDAwOwotCW9wal9jcF90ICogbF9jcCA9IDAwOwotCW9wal90Y2RfdGlsZV90ICogbF90aWxlID0gMDA7Ci0Jb3BqX3RjY3BfdCAqbF90Y2NwID0gMDA7Ci0Jb3BqX3RjZF90aWxlY29tcF90ICpsX3RpbGVjID0gMDA7Ci0Jb3BqX2ltYWdlX2NvbXBfdCAqIGxfaW1hZ2VfY29tcCA9IDAwOwotCW9wal90Y2RfcmVzb2x1dGlvbl90ICpsX3JlcyA9IDAwOwotCW9wal90Y2RfYmFuZF90ICpsX2JhbmQgPSAwMDsKLQlvcGpfc3RlcHNpemVfdCAqIGxfc3RlcF9zaXplID0gMDA7Ci0Jb3BqX3RjZF9wcmVjaW5jdF90ICpsX2N1cnJlbnRfcHJlY2luY3QgPSAwMDsKLQlvcGpfaW1hZ2VfdCAqbF9pbWFnZSA9IDAwOwotCU9QSl9VSU5UMzIgcCxxOwotCU9QSl9VSU5UMzIgbF9sZXZlbF9ubzsKLQlPUEpfVUlOVDMyIGxfcGR4LCBsX3BkeTsKLQlPUEpfVUlOVDMyIGxfZ2FpbjsKLQlPUEpfSU5UMzIgbF94MGIsIGxfeTBiOwotCU9QSl9VSU5UMzIgbF90eDAsIGxfdHkwOwotCS8qIGV4dGVudCBvZiBwcmVjaW5jdHMgLCB0b3AgbGVmdCwgYm90dG9tIHJpZ2h0KiovCi0JT1BKX0lOVDMyIGxfdGxfcHJjX3hfc3RhcnQsIGxfdGxfcHJjX3lfc3RhcnQsIGxfYnJfcHJjX3hfZW5kLCBsX2JyX3ByY195X2VuZDsKLQkvKiBudW1iZXIgb2YgcHJlY2luY3QgZm9yIGEgcmVzb2x1dGlvbiAqLwotCU9QSl9VSU5UMzIgbF9uYl9wcmVjaW5jdHM7Ci0JLyogcm9vbSBuZWVkZWQgdG8gc3RvcmUgbF9uYl9wcmVjaW5jdCBwcmVjaW5jdCBmb3IgYSByZXNvbHV0aW9uICovCi0JT1BKX1VJTlQzMiBsX25iX3ByZWNpbmN0X3NpemU7Ci0JLyogbnVtYmVyIG9mIGNvZGUgYmxvY2tzIGZvciBhIHByZWNpbmN0Ki8KLQlPUEpfVUlOVDMyIGxfbmJfY29kZV9ibG9ja3M7Ci0JLyogcm9vbSBuZWVkZWQgdG8gc3RvcmUgbF9uYl9jb2RlX2Jsb2NrcyBjb2RlIGJsb2NrcyBmb3IgYSBwcmVjaW5jdCovCi0JT1BKX1VJTlQzMiBsX25iX2NvZGVfYmxvY2tzX3NpemU7Ci0JLyogc2l6ZSBvZiBkYXRhIGZvciBhIHRpbGUgKi8KLQlPUEpfVUlOVDMyIGxfZGF0YV9zaXplOwotCQotCWxfY3AgPSBwX3RjZC0+Y3A7Ci0JbF90Y3AgPSAmKGxfY3AtPnRjcHNbcF90aWxlX25vXSk7Ci0JbF90aWxlID0gcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXM7Ci0JbF90Y2NwID0gbF90Y3AtPnRjY3BzOwotCWxfdGlsZWMgPSBsX3RpbGUtPmNvbXBzOwotCWxfaW1hZ2UgPSBwX3RjZC0+aW1hZ2U7Ci0JbF9pbWFnZV9jb21wID0gcF90Y2QtPmltYWdlLT5jb21wczsKLQkKLQlwID0gcF90aWxlX25vICUgbF9jcC0+dHc7ICAgICAgIC8qIHRpbGUgY29vcmRpbmF0ZXMgKi8KLQlxID0gcF90aWxlX25vIC8gbF9jcC0+dHc7Ci0JLypmcHJpbnRmKHN0ZGVyciwgIlRpbGUgY29vcmRpbmF0ZSA9ICVkLCVkXG4iLCBwLCBxKTsqLwotCQotCS8qIDQgYm9yZGVycyBvZiB0aGUgdGlsZSByZXNjYWxlIG9uIHRoZSBpbWFnZSBpZiBuZWNlc3NhcnkgKi8KLQlsX3R4MCA9IGxfY3AtPnR4MCArIHAgKiBsX2NwLT50ZHg7IC8qIGNhbid0IGJlIGdyZWF0ZXIgdGhhbiBsX2ltYWdlLT54MSBzbyB3b24ndCBvdmVyZmxvdyAqLwotCWxfdGlsZS0+eDAgPSAoT1BKX0lOVDMyKW9wal91aW50X21heChsX3R4MCwgbF9pbWFnZS0+eDApOwotCWxfdGlsZS0+eDEgPSAoT1BKX0lOVDMyKW9wal91aW50X21pbihvcGpfdWludF9hZGRzKGxfdHgwLCBsX2NwLT50ZHgpLCBsX2ltYWdlLT54MSk7Ci0JbF90eTAgPSBsX2NwLT50eTAgKyBxICogbF9jcC0+dGR5OyAvKiBjYW4ndCBiZSBncmVhdGVyIHRoYW4gbF9pbWFnZS0+eTEgc28gd29uJ3Qgb3ZlcmZsb3cgKi8KLQlsX3RpbGUtPnkwID0gKE9QSl9JTlQzMilvcGpfdWludF9tYXgobF90eTAsIGxfaW1hZ2UtPnkwKTsKLQlsX3RpbGUtPnkxID0gKE9QSl9JTlQzMilvcGpfdWludF9taW4ob3BqX3VpbnRfYWRkcyhsX3R5MCwgbF9jcC0+dGR5KSwgbF9pbWFnZS0+eTEpOwotCi0JLyogdGVzdGNhc2UgMTg4OC5wZGYuYXNhbi4zNS45ODggKi8KLQlpZiAobF90Y2NwLT5udW1yZXNvbHV0aW9ucyA9PSAwKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAidGlsZXMgcmVxdWlyZSBhdCBsZWFzdCBvbmUgcmVzb2x1dGlvblxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCS8qZnByaW50ZihzdGRlcnIsICJUaWxlIGJvcmRlciA9ICVkLCVkLCVkLCVkXG4iLCBsX3RpbGUtPngwLCBsX3RpbGUtPnkwLGxfdGlsZS0+eDEsbF90aWxlLT55MSk7Ki8KLQkKLQkvKnRpbGUtPm51bWNvbXBzID0gaW1hZ2UtPm51bWNvbXBzOyAqLwotCWZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgbF90aWxlLT5udW1jb21wczsgKytjb21wbm8pIHsKLQkJLypmcHJpbnRmKHN0ZGVyciwgImNvbXBubyA9ICVkLyVkXG4iLCBjb21wbm8sIGxfdGlsZS0+bnVtY29tcHMpOyovCi0JCWxfaW1hZ2VfY29tcC0+cmVzbm9fZGVjb2RlZCA9IDA7Ci0JCS8qIGJvcmRlciBvZiBlYWNoIGxfdGlsZSBjb21wb25lbnQgKGdsb2JhbCkgKi8KLQkJbF90aWxlYy0+eDAgPSBvcGpfaW50X2NlaWxkaXYobF90aWxlLT54MCwgKE9QSl9JTlQzMilsX2ltYWdlX2NvbXAtPmR4KTsKLQkJbF90aWxlYy0+eTAgPSBvcGpfaW50X2NlaWxkaXYobF90aWxlLT55MCwgKE9QSl9JTlQzMilsX2ltYWdlX2NvbXAtPmR5KTsKLQkJbF90aWxlYy0+eDEgPSBvcGpfaW50X2NlaWxkaXYobF90aWxlLT54MSwgKE9QSl9JTlQzMilsX2ltYWdlX2NvbXAtPmR4KTsKLQkJbF90aWxlYy0+eTEgPSBvcGpfaW50X2NlaWxkaXYobF90aWxlLT55MSwgKE9QSl9JTlQzMilsX2ltYWdlX2NvbXAtPmR5KTsKLQkJLypmcHJpbnRmKHN0ZGVyciwgIlx0VGlsZSBjb21wbyBib3JkZXIgPSAlZCwlZCwlZCwlZFxuIiwgbF90aWxlYy0+eDAsIGxfdGlsZWMtPnkwLGxfdGlsZWMtPngxLGxfdGlsZWMtPnkxKTsqLwotCQkKLQkJLyogY29tcHV0ZSBsX2RhdGFfc2l6ZSB3aXRoIG92ZXJmbG93IGNoZWNrICovCi0JCWxfZGF0YV9zaXplID0gKE9QSl9VSU5UMzIpKGxfdGlsZWMtPngxIC0gbF90aWxlYy0+eDApOwotCQlpZiAoKCgoT1BKX1VJTlQzMiktMSkgLyBsX2RhdGFfc2l6ZSkgPCAoT1BKX1VJTlQzMikobF90aWxlYy0+eTEgLSBsX3RpbGVjLT55MCkpIHsKLQkJCS8qIFRPRE8gZXZlbnQgKi8KLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KLQkJbF9kYXRhX3NpemUgPSBsX2RhdGFfc2l6ZSAqIChPUEpfVUlOVDMyKShsX3RpbGVjLT55MSAtIGxfdGlsZWMtPnkwKTsKLQkJCi0JCWlmICgoKChPUEpfVUlOVDMyKS0xKSAvIChPUEpfVUlOVDMyKXNpemVvZihPUEpfVUlOVDMyKSkgPCBsX2RhdGFfc2l6ZSkgewotCQkJLyogVE9ETyBldmVudCAqLwotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCQlsX2RhdGFfc2l6ZSA9IGxfZGF0YV9zaXplICogKE9QSl9VSU5UMzIpc2l6ZW9mKE9QSl9VSU5UMzIpOwotCQlsX3RpbGVjLT5udW1yZXNvbHV0aW9ucyA9IGxfdGNjcC0+bnVtcmVzb2x1dGlvbnM7Ci0JCWlmIChsX3RjY3AtPm51bXJlc29sdXRpb25zIDwgbF9jcC0+bV9zcGVjaWZpY19wYXJhbS5tX2RlYy5tX3JlZHVjZSkgewotCQkJbF90aWxlYy0+bWluaW11bV9udW1fcmVzb2x1dGlvbnMgPSAxOwotCQl9Ci0JCWVsc2UgewotCQkJbF90aWxlYy0+bWluaW11bV9udW1fcmVzb2x1dGlvbnMgPSBsX3RjY3AtPm51bXJlc29sdXRpb25zIC0gbF9jcC0+bV9zcGVjaWZpY19wYXJhbS5tX2RlYy5tX3JlZHVjZTsKLQkJfQotCQkKLQkJbF90aWxlYy0+ZGF0YV9zaXplX25lZWRlZCA9IGxfZGF0YV9zaXplOwotCQlpZiAocF90Y2QtPm1faXNfZGVjb2RlciAmJiAhb3BqX2FsbG9jX3RpbGVfY29tcG9uZW50X2RhdGEobF90aWxlYykpIHsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KLQkJCi0JCWxfZGF0YV9zaXplID0gbF90aWxlYy0+bnVtcmVzb2x1dGlvbnMgKiAoT1BKX1VJTlQzMilzaXplb2Yob3BqX3RjZF9yZXNvbHV0aW9uX3QpOwotCQkKLQkJaWYgKGxfdGlsZWMtPnJlc29sdXRpb25zID09IDAwKSB7Ci0JCQlsX3RpbGVjLT5yZXNvbHV0aW9ucyA9IChvcGpfdGNkX3Jlc29sdXRpb25fdCAqKSBvcGpfbWFsbG9jKGxfZGF0YV9zaXplKTsKLQkJCWlmICghIGxfdGlsZWMtPnJlc29sdXRpb25zICkgewotCQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCQl9Ci0JCQkvKmZwcmludGYoc3RkZXJyLCAiXHRBbGxvY2F0ZSByZXNvbHV0aW9ucyBvZiB0aWxlYyAob3BqX3RjZF9yZXNvbHV0aW9uX3QpOiAlZFxuIixsX2RhdGFfc2l6ZSk7Ki8KLQkJCWxfdGlsZWMtPnJlc29sdXRpb25zX3NpemUgPSBsX2RhdGFfc2l6ZTsKLQkJCW1lbXNldChsX3RpbGVjLT5yZXNvbHV0aW9ucywwLGxfZGF0YV9zaXplKTsKLQkJfQotCQllbHNlIGlmIChsX2RhdGFfc2l6ZSA+IGxfdGlsZWMtPnJlc29sdXRpb25zX3NpemUpIHsKLQkJCW9wal90Y2RfcmVzb2x1dGlvbl90KiBuZXdfcmVzb2x1dGlvbnMgPSAob3BqX3RjZF9yZXNvbHV0aW9uX3QgKikgb3BqX3JlYWxsb2MobF90aWxlYy0+cmVzb2x1dGlvbnMsIGxfZGF0YV9zaXplKTsKLQkJCWlmICghIG5ld19yZXNvbHV0aW9ucykgewotCQkJCS8qIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byB0aWxlIHJlc29sdXRpb25zXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCQkJZnByaW50ZihzdGRlcnIsICJOb3QgZW5vdWdoIG1lbW9yeSB0byB0aWxlIHJlc29sdXRpb25zXG4iKTsKLQkJCQlvcGpfZnJlZShsX3RpbGVjLT5yZXNvbHV0aW9ucyk7Ci0JCQkJbF90aWxlYy0+cmVzb2x1dGlvbnMgPSBOVUxMOwotCQkJCWxfdGlsZWMtPnJlc29sdXRpb25zX3NpemUgPSAwOwotCQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCQl9Ci0JCQlsX3RpbGVjLT5yZXNvbHV0aW9ucyA9IG5ld19yZXNvbHV0aW9uczsKLQkJCS8qZnByaW50ZihzdGRlcnIsICJcdFJlYWxsb2NhdGUgZGF0YSBvZiB0aWxlYyAoaW50KTogZnJvbSAlZCB0byAlZCB4IE9QSl9VSU5UMzJcbiIsIGxfdGlsZWMtPnJlc29sdXRpb25zX3NpemUsIGxfZGF0YV9zaXplKTsqLwotCQkJbWVtc2V0KCgoT1BKX0JZVEUqKSBsX3RpbGVjLT5yZXNvbHV0aW9ucykrbF90aWxlYy0+cmVzb2x1dGlvbnNfc2l6ZSwwLGxfZGF0YV9zaXplIC0gbF90aWxlYy0+cmVzb2x1dGlvbnNfc2l6ZSk7Ci0JCQlsX3RpbGVjLT5yZXNvbHV0aW9uc19zaXplID0gbF9kYXRhX3NpemU7Ci0JCX0KLQkJCi0JCWxfbGV2ZWxfbm8gPSBsX3RpbGVjLT5udW1yZXNvbHV0aW9ucyAtIDE7Ci0JCWxfcmVzID0gbF90aWxlYy0+cmVzb2x1dGlvbnM7Ci0JCWxfc3RlcF9zaXplID0gbF90Y2NwLT5zdGVwc2l6ZXM7Ci0JCWlmIChsX3RjY3AtPnFtZmJpZCA9PSAwKSB7Ci0JCQlsX2dhaW5fcHRyID0gJm9wal9kd3RfZ2V0Z2Fpbl9yZWFsOwotCQl9Ci0JCWVsc2UgewotCQkJbF9nYWluX3B0ciAgPSAmb3BqX2R3dF9nZXRnYWluOwotCQl9Ci0JCS8qZnByaW50ZihzdGRlcnIsICJcdGxldmVsX25vPSVkXG4iLGxfbGV2ZWxfbm8pOyovCi0JCQotCQlmb3IgKHJlc25vID0gMDsgcmVzbm8gPCBsX3RpbGVjLT5udW1yZXNvbHV0aW9uczsgKytyZXNubykgewotCQkJLypmcHJpbnRmKHN0ZGVyciwgIlx0XHRyZXNubyA9ICVkLyVkXG4iLCByZXNubywgbF90aWxlYy0+bnVtcmVzb2x1dGlvbnMpOyovCi0JCQlPUEpfSU5UMzIgdGxjYmd4c3RhcnQsIHRsY2JneXN0YXJ0IC8qLCBicmNiZ3hlbmQsIGJyY2JneWVuZCovOwotCQkJT1BKX1VJTlQzMiBjYmd3aWR0aGV4cG4sIGNiZ2hlaWdodGV4cG47Ci0JCQlPUEpfVUlOVDMyIGNibGt3aWR0aGV4cG4sIGNibGtoZWlnaHRleHBuOwotCQkJCi0JCQkvKiBib3JkZXIgZm9yIGVhY2ggcmVzb2x1dGlvbiBsZXZlbCAoZ2xvYmFsKSAqLwotCQkJbF9yZXMtPngwID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3RpbGVjLT54MCwgKE9QSl9JTlQzMilsX2xldmVsX25vKTsKLQkJCWxfcmVzLT55MCA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF90aWxlYy0+eTAsIChPUEpfSU5UMzIpbF9sZXZlbF9ubyk7Ci0JCQlsX3Jlcy0+eDEgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGlsZWMtPngxLCAoT1BKX0lOVDMyKWxfbGV2ZWxfbm8pOwotCQkJbF9yZXMtPnkxID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3RpbGVjLT55MSwgKE9QSl9JTlQzMilsX2xldmVsX25vKTsKLQkJCS8qZnByaW50ZihzdGRlcnIsICJcdFx0XHRyZXNfeDA9ICVkLCByZXNfeTAgPSVkLCByZXNfeDE9JWQsIHJlc195MT0lZFxuIiwgbF9yZXMtPngwLCBsX3Jlcy0+eTAsIGxfcmVzLT54MSwgbF9yZXMtPnkxKTsqLwotCQkJLyogcC4gMzUsIHRhYmxlIEEtMjMsIElTTy9JRUMgRkRJUzE1NDQ0NC0xIDogMjAwMCAoMTggYXVndXN0IDIwMDApICovCi0JCQlsX3BkeCA9IGxfdGNjcC0+cHJjd1tyZXNub107Ci0JCQlsX3BkeSA9IGxfdGNjcC0+cHJjaFtyZXNub107Ci0JCQkvKmZwcmludGYoc3RkZXJyLCAiXHRcdFx0cGR4PSVkLCBwZHk9JWRcbiIsIGxfcGR4LCBsX3BkeSk7Ki8KLQkJCS8qIHAuIDY0LCBCLjYsIElTTy9JRUMgRkRJUzE1NDQ0LTEgOiAyMDAwICgxOCBhdWd1c3QgMjAwMCkgICovCi0JCQlsX3RsX3ByY194X3N0YXJ0ID0gb3BqX2ludF9mbG9vcmRpdnBvdzIobF9yZXMtPngwLCAoT1BKX0lOVDMyKWxfcGR4KSA8PCBsX3BkeDsKLQkJCWxfdGxfcHJjX3lfc3RhcnQgPSBvcGpfaW50X2Zsb29yZGl2cG93MihsX3Jlcy0+eTAsIChPUEpfSU5UMzIpbF9wZHkpIDw8IGxfcGR5OwotCQkJbF9icl9wcmNfeF9lbmQgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfcmVzLT54MSwgKE9QSl9JTlQzMilsX3BkeCkgPDwgbF9wZHg7Ci0JCQlsX2JyX3ByY195X2VuZCA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF9yZXMtPnkxLCAoT1BKX0lOVDMyKWxfcGR5KSA8PCBsX3BkeTsKLQkJCS8qZnByaW50ZihzdGRlcnIsICJcdFx0XHRwcmNfeF9zdGFydD0lZCwgcHJjX3lfc3RhcnQ9JWQsIGJyX3ByY194X2VuZD0lZCwgYnJfcHJjX3lfZW5kPSVkIFxuIiwgbF90bF9wcmNfeF9zdGFydCwgbF90bF9wcmNfeV9zdGFydCwgbF9icl9wcmNfeF9lbmQgLGxfYnJfcHJjX3lfZW5kICk7Ki8KLQkJCQotCQkJbF9yZXMtPnB3ID0gKGxfcmVzLT54MCA9PSBsX3Jlcy0+eDEpID8gMCA6IChPUEpfVUlOVDMyKSgobF9icl9wcmNfeF9lbmQgLSBsX3RsX3ByY194X3N0YXJ0KSA+PiBsX3BkeCk7Ci0JCQlsX3Jlcy0+cGggPSAobF9yZXMtPnkwID09IGxfcmVzLT55MSkgPyAwIDogKE9QSl9VSU5UMzIpKChsX2JyX3ByY195X2VuZCAtIGxfdGxfcHJjX3lfc3RhcnQpID4+IGxfcGR5KTsKLQkJCS8qZnByaW50ZihzdGRlcnIsICJcdFx0XHRyZXNfcHc9JWQsIHJlc19waD0lZFxuIiwgbF9yZXMtPnB3LCBsX3Jlcy0+cGggKTsqLwotCQkJCi0JCQlsX25iX3ByZWNpbmN0cyA9IGxfcmVzLT5wdyAqIGxfcmVzLT5waDsKLQkJCWxfbmJfcHJlY2luY3Rfc2l6ZSA9IGxfbmJfcHJlY2luY3RzICogKE9QSl9VSU5UMzIpc2l6ZW9mKG9wal90Y2RfcHJlY2luY3RfdCk7Ci0JCQlpZiAocmVzbm8gPT0gMCkgewotCQkJCXRsY2JneHN0YXJ0ID0gbF90bF9wcmNfeF9zdGFydDsKLQkJCQl0bGNiZ3lzdGFydCA9IGxfdGxfcHJjX3lfc3RhcnQ7Ci0JCQkJLypicmNiZ3hlbmQgPSBsX2JyX3ByY194X2VuZDsqLwotCQkJCS8qIGJyY2JneWVuZCA9IGxfYnJfcHJjX3lfZW5kOyovCi0JCQkJY2Jnd2lkdGhleHBuID0gbF9wZHg7Ci0JCQkJY2JnaGVpZ2h0ZXhwbiA9IGxfcGR5OwotCQkJCWxfcmVzLT5udW1iYW5kcyA9IDE7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0bGNiZ3hzdGFydCA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF90bF9wcmNfeF9zdGFydCwgMSk7Ci0JCQkJdGxjYmd5c3RhcnQgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGxfcHJjX3lfc3RhcnQsIDEpOwotCQkJCS8qYnJjYmd4ZW5kID0gb3BqX2ludF9jZWlsZGl2cG93MihsX2JyX3ByY194X2VuZCwgMSk7Ki8KLQkJCQkvKmJyY2JneWVuZCA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF9icl9wcmNfeV9lbmQsIDEpOyovCi0JCQkJY2Jnd2lkdGhleHBuID0gbF9wZHggLSAxOwotCQkJCWNiZ2hlaWdodGV4cG4gPSBsX3BkeSAtIDE7Ci0JCQkJbF9yZXMtPm51bWJhbmRzID0gMzsKLQkJCX0KLQkJCQotCQkJY2Jsa3dpZHRoZXhwbiA9IG9wal91aW50X21pbihsX3RjY3AtPmNibGt3LCBjYmd3aWR0aGV4cG4pOwotCQkJY2Jsa2hlaWdodGV4cG4gPSBvcGpfdWludF9taW4obF90Y2NwLT5jYmxraCwgY2JnaGVpZ2h0ZXhwbik7Ci0JCQlsX2JhbmQgPSBsX3Jlcy0+YmFuZHM7Ci0JCQkKLQkJCWZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgbF9yZXMtPm51bWJhbmRzOyArK2JhbmRubykgewotCQkJCU9QSl9JTlQzMiBudW1icHM7Ci0JCQkJLypmcHJpbnRmKHN0ZGVyciwgIlx0XHRcdGJhbmRfbm89JWQvJWRcbiIsIGJhbmRubywgbF9yZXMtPm51bWJhbmRzICk7Ki8KLQkJCQkKLQkJCQlpZiAocmVzbm8gPT0gMCkgewotCQkJCQlsX2JhbmQtPmJhbmRubyA9IDAgOwotCQkJCQlsX2JhbmQtPngwID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3RpbGVjLT54MCwgKE9QSl9JTlQzMilsX2xldmVsX25vKTsKLQkJCQkJbF9iYW5kLT55MCA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF90aWxlYy0+eTAsIChPUEpfSU5UMzIpbF9sZXZlbF9ubyk7Ci0JCQkJCWxfYmFuZC0+eDEgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGlsZWMtPngxLCAoT1BKX0lOVDMyKWxfbGV2ZWxfbm8pOwotCQkJCQlsX2JhbmQtPnkxID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3RpbGVjLT55MSwgKE9QSl9JTlQzMilsX2xldmVsX25vKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWxfYmFuZC0+YmFuZG5vID0gYmFuZG5vICsgMTsKLQkJCQkJLyogeDBiID0gMSBpZiBiYW5kbm8gPSAxIG9yIDMgKi8KLQkJCQkJbF94MGIgPSBsX2JhbmQtPmJhbmRubyYxOwotCQkJCQkvKiB5MGIgPSAxIGlmIGJhbmRubyA9IDIgb3IgMyAqLwotCQkJCQlsX3kwYiA9IChPUEpfSU5UMzIpKChsX2JhbmQtPmJhbmRubyk+PjEpOwotCQkJCQkvKiBsX2JhbmQgYm9yZGVyIChnbG9iYWwpICovCi0JCQkJCWxfYmFuZC0+eDAgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGlsZWMtPngwIC0gKDEgPDwgbF9sZXZlbF9ubykgKiBsX3gwYiwgKE9QSl9JTlQzMikobF9sZXZlbF9ubyArIDEpKTsKLQkJCQkJbF9iYW5kLT55MCA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF90aWxlYy0+eTAgLSAoMSA8PCBsX2xldmVsX25vKSAqIGxfeTBiLCAoT1BKX0lOVDMyKShsX2xldmVsX25vICsgMSkpOwotCQkJCQlsX2JhbmQtPngxID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3RpbGVjLT54MSAtICgxIDw8IGxfbGV2ZWxfbm8pICogbF94MGIsIChPUEpfSU5UMzIpKGxfbGV2ZWxfbm8gKyAxKSk7Ci0JCQkJCWxfYmFuZC0+eTEgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGlsZWMtPnkxIC0gKDEgPDwgbF9sZXZlbF9ubykgKiBsX3kwYiwgKE9QSl9JTlQzMikobF9sZXZlbF9ubyArIDEpKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLyoqIGF2b2lkIGFuIGlmIHdpdGggc3RvcmluZyBmdW5jdGlvbiBwb2ludGVyICovCi0JCQkJbF9nYWluID0gKCpsX2dhaW5fcHRyKSAobF9iYW5kLT5iYW5kbm8pOwotCQkJCW51bWJwcyA9IChPUEpfSU5UMzIpKGxfaW1hZ2VfY29tcC0+cHJlYyArIGxfZ2Fpbik7Ci0JCQkJbF9iYW5kLT5zdGVwc2l6ZSA9IChPUEpfRkxPQVQzMikoKCgxLjAgKyBsX3N0ZXBfc2l6ZS0+bWFudCAvIDIwNDguMCkgKiBwb3coMi4wLCAoT1BKX0lOVDMyKSAobnVtYnBzIC0gbF9zdGVwX3NpemUtPmV4cG4pKSkpICogZnJhY3Rpb247Ci0JCQkJbF9iYW5kLT5udW1icHMgPSBsX3N0ZXBfc2l6ZS0+ZXhwbiArIChPUEpfSU5UMzIpbF90Y2NwLT5udW1nYml0cyAtIDE7ICAgICAgLyogV0hZIC0xID8gKi8KLQkJCQkKLQkJCQlpZiAoISBsX2JhbmQtPnByZWNpbmN0cykgewotCQkJCQlsX2JhbmQtPnByZWNpbmN0cyA9IChvcGpfdGNkX3ByZWNpbmN0X3QgKikgb3BqX21hbGxvYyggLyozICogKi8gbF9uYl9wcmVjaW5jdF9zaXplKTsKLQkJCQkJaWYgKCEgbF9iYW5kLT5wcmVjaW5jdHMpIHsKLQkJCQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCQkJCX0KLQkJCQkJLypmcHJpbnRmKHN0ZGVyciwgIlx0XHRcdFx0QWxsb2NhdGUgcHJlY2luY3RzIG9mIGEgYmFuZCAob3BqX3RjZF9wcmVjaW5jdF90KTogJWRcbiIsbF9uYl9wcmVjaW5jdF9zaXplKTsgICAgICovCi0JCQkJCW1lbXNldChsX2JhbmQtPnByZWNpbmN0cywwLGxfbmJfcHJlY2luY3Rfc2l6ZSk7Ci0JCQkJCWxfYmFuZC0+cHJlY2luY3RzX2RhdGFfc2l6ZSA9IGxfbmJfcHJlY2luY3Rfc2l6ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobF9iYW5kLT5wcmVjaW5jdHNfZGF0YV9zaXplIDwgbF9uYl9wcmVjaW5jdF9zaXplKSB7Ci0JCQkJCQotCQkJCQlvcGpfdGNkX3ByZWNpbmN0X3QgKiBuZXdfcHJlY2luY3RzID0gKG9wal90Y2RfcHJlY2luY3RfdCAqKSBvcGpfcmVhbGxvYyhsX2JhbmQtPnByZWNpbmN0cywvKjMgKiAqLyBsX25iX3ByZWNpbmN0X3NpemUpOwotCQkJCQlpZiAoISBuZXdfcHJlY2luY3RzKSB7Ci0JCQkJCQkvKiBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGJhbmQgcHJlY2ludHNcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJCQkJCWZwcmludGYoc3RkZXJyLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGJhbmQgcHJlY2ludHNcbiIpOwotCQkJCQkJb3BqX2ZyZWUobF9iYW5kLT5wcmVjaW5jdHMpOwotCQkJCQkJbF9iYW5kLT5wcmVjaW5jdHMgPSBOVUxMOwotCQkJCQkJbF9iYW5kLT5wcmVjaW5jdHNfZGF0YV9zaXplID0gMDsKLQkJCQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCQkJCX0KLQkJCQkJbF9iYW5kLT5wcmVjaW5jdHMgPSBuZXdfcHJlY2luY3RzOwotCQkJCQkvKmZwcmludGYoc3RkZXJyLCAiXHRcdFx0XHRSZWFsbG9jYXRlIHByZWNpbmN0cyBvZiBhIGJhbmQgKG9wal90Y2RfcHJlY2luY3RfdCk6IGZyb20gJWQgdG8gJWRcbiIsbF9iYW5kLT5wcmVjaW5jdHNfZGF0YV9zaXplLCBsX25iX3ByZWNpbmN0X3NpemUpOyovCi0JCQkJCW1lbXNldCgoKE9QSl9CWVRFICopIGxfYmFuZC0+cHJlY2luY3RzKSArIGxfYmFuZC0+cHJlY2luY3RzX2RhdGFfc2l6ZSwwLGxfbmJfcHJlY2luY3Rfc2l6ZSAtIGxfYmFuZC0+cHJlY2luY3RzX2RhdGFfc2l6ZSk7Ci0JCQkJCWxfYmFuZC0+cHJlY2luY3RzX2RhdGFfc2l6ZSA9IGxfbmJfcHJlY2luY3Rfc2l6ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJbF9jdXJyZW50X3ByZWNpbmN0ID0gbF9iYW5kLT5wcmVjaW5jdHM7Ci0JCQkJZm9yIChwcmVjbm8gPSAwOyBwcmVjbm8gPCBsX25iX3ByZWNpbmN0czsgKytwcmVjbm8pIHsKLQkJCQkJT1BKX0lOVDMyIHRsY2Jsa3hzdGFydCwgdGxjYmxreXN0YXJ0LCBicmNibGt4ZW5kLCBicmNibGt5ZW5kOwotCQkJCQlPUEpfSU5UMzIgY2JneHN0YXJ0ID0gdGxjYmd4c3RhcnQgKyAoT1BKX0lOVDMyKShwcmVjbm8gJSBsX3Jlcy0+cHcpICogKDEgPDwgY2Jnd2lkdGhleHBuKTsKLQkJCQkJT1BKX0lOVDMyIGNiZ3lzdGFydCA9IHRsY2JneXN0YXJ0ICsgKE9QSl9JTlQzMikocHJlY25vIC8gbF9yZXMtPnB3KSAqICgxIDw8IGNiZ2hlaWdodGV4cG4pOwotCQkJCQlPUEpfSU5UMzIgY2JneGVuZCA9IGNiZ3hzdGFydCArICgxIDw8IGNiZ3dpZHRoZXhwbik7Ci0JCQkJCU9QSl9JTlQzMiBjYmd5ZW5kID0gY2JneXN0YXJ0ICsgKDEgPDwgY2JnaGVpZ2h0ZXhwbik7Ci0JCQkJCS8qZnByaW50ZihzdGRlcnIsICJcdCBwcmVjbm89JWQ7IGJhbmRubz0lZCwgcmVzbm89JWQ7IGNvbXBubz0lZFxuIiwgcHJlY25vLCBiYW5kbm8gLCByZXNubywgY29tcG5vKTsqLwotCQkJCQkvKmZwcmludGYoc3RkZXJyLCAiXHQgdGxjYmd4c3RhcnQoPSVkKSArIChwcmVjbm8oPSVkKSBwZXJjZW50IHJlcy0+cHcoPSVkKSkgKiAoMSA8PCBjYmd3aWR0aGV4cG4oPSVkKSkgXG4iLHRsY2JneHN0YXJ0LHByZWNubyxsX3Jlcy0+cHcsY2Jnd2lkdGhleHBuKTsqLwotCQkJCQkKLQkJCQkJLyogcHJlY2luY3Qgc2l6ZSAoZ2xvYmFsKSAqLwotCQkJCQkvKmZwcmludGYoc3RkZXJyLCAiXHQgY2JneHN0YXJ0PSVkLCBsX2JhbmQtPngwID0gJWQgXG4iLGNiZ3hzdGFydCwgbF9iYW5kLT54MCk7Ki8KLQkJCQkJCi0JCQkJCWxfY3VycmVudF9wcmVjaW5jdC0+eDAgPSBvcGpfaW50X21heChjYmd4c3RhcnQsIGxfYmFuZC0+eDApOwotCQkJCQlsX2N1cnJlbnRfcHJlY2luY3QtPnkwID0gb3BqX2ludF9tYXgoY2JneXN0YXJ0LCBsX2JhbmQtPnkwKTsKLQkJCQkJbF9jdXJyZW50X3ByZWNpbmN0LT54MSA9IG9wal9pbnRfbWluKGNiZ3hlbmQsIGxfYmFuZC0+eDEpOwotCQkJCQlsX2N1cnJlbnRfcHJlY2luY3QtPnkxID0gb3BqX2ludF9taW4oY2JneWVuZCwgbF9iYW5kLT55MSk7Ci0JCQkJCS8qZnByaW50ZihzdGRlcnIsICJcdCBwcmNfeDA9JWQ7IHByY195MD0lZCwgcHJjX3gxPSVkOyBwcmNfeTE9JWRcbiIsbF9jdXJyZW50X3ByZWNpbmN0LT54MCwgbF9jdXJyZW50X3ByZWNpbmN0LT55MCAsbF9jdXJyZW50X3ByZWNpbmN0LT54MSwgbF9jdXJyZW50X3ByZWNpbmN0LT55MSk7Ki8KLQkJCQkJCi0JCQkJCXRsY2Jsa3hzdGFydCA9IG9wal9pbnRfZmxvb3JkaXZwb3cyKGxfY3VycmVudF9wcmVjaW5jdC0+eDAsIChPUEpfSU5UMzIpY2Jsa3dpZHRoZXhwbikgPDwgY2Jsa3dpZHRoZXhwbjsKLQkJCQkJLypmcHJpbnRmKHN0ZGVyciwgIlx0IHRsY2Jsa3hzdGFydCA9JWRcbiIsdGxjYmxreHN0YXJ0ICk7Ki8KLQkJCQkJdGxjYmxreXN0YXJ0ID0gb3BqX2ludF9mbG9vcmRpdnBvdzIobF9jdXJyZW50X3ByZWNpbmN0LT55MCwgKE9QSl9JTlQzMiljYmxraGVpZ2h0ZXhwbikgPDwgY2Jsa2hlaWdodGV4cG47Ci0JCQkJCS8qZnByaW50ZihzdGRlcnIsICJcdCB0bGNibGt5c3RhcnQgPSVkXG4iLHRsY2Jsa3lzdGFydCApOyovCi0JCQkJCWJyY2Jsa3hlbmQgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfY3VycmVudF9wcmVjaW5jdC0+eDEsIChPUEpfSU5UMzIpY2Jsa3dpZHRoZXhwbikgPDwgY2Jsa3dpZHRoZXhwbjsKLQkJCQkJLypmcHJpbnRmKHN0ZGVyciwgIlx0IGJyY2Jsa3hlbmQgPSVkXG4iLGJyY2Jsa3hlbmQgKTsqLwotCQkJCQlicmNibGt5ZW5kID0gb3BqX2ludF9jZWlsZGl2cG93MihsX2N1cnJlbnRfcHJlY2luY3QtPnkxLCAoT1BKX0lOVDMyKWNibGtoZWlnaHRleHBuKSA8PCBjYmxraGVpZ2h0ZXhwbjsKLQkJCQkJLypmcHJpbnRmKHN0ZGVyciwgIlx0IGJyY2Jsa3llbmQgPSVkXG4iLGJyY2Jsa3llbmQgKTsqLwotCQkJCQlsX2N1cnJlbnRfcHJlY2luY3QtPmN3ID0gKE9QSl9VSU5UMzIpKChicmNibGt4ZW5kIC0gdGxjYmxreHN0YXJ0KSA+PiBjYmxrd2lkdGhleHBuKTsKLQkJCQkJbF9jdXJyZW50X3ByZWNpbmN0LT5jaCA9IChPUEpfVUlOVDMyKSgoYnJjYmxreWVuZCAtIHRsY2Jsa3lzdGFydCkgPj4gY2Jsa2hlaWdodGV4cG4pOwotCQkJCQkKLQkJCQkJbF9uYl9jb2RlX2Jsb2NrcyA9IGxfY3VycmVudF9wcmVjaW5jdC0+Y3cgKiBsX2N1cnJlbnRfcHJlY2luY3QtPmNoOwotCQkJCQkvKmZwcmludGYoc3RkZXJyLCAiXHRcdFx0XHQgcHJlY2luY3RfY3cgPSAlZCB4IHJlY2luY3RfY2ggPSAlZFxuIixsX2N1cnJlbnRfcHJlY2luY3QtPmN3LCBsX2N1cnJlbnRfcHJlY2luY3QtPmNoKTsgICAgICAqLwotCQkJCQlsX25iX2NvZGVfYmxvY2tzX3NpemUgPSBsX25iX2NvZGVfYmxvY2tzICogKE9QSl9VSU5UMzIpc2l6ZW9mX2Jsb2NrOwotCQkJCQkKLQkJCQkJaWYgKCEgbF9jdXJyZW50X3ByZWNpbmN0LT5jYmxrcy5ibG9ja3MpIHsKLQkJCQkJCWxfY3VycmVudF9wcmVjaW5jdC0+Y2Jsa3MuYmxvY2tzID0gb3BqX21hbGxvYyhsX25iX2NvZGVfYmxvY2tzX3NpemUpOwotCQkJCQkJaWYgKCEgbF9jdXJyZW50X3ByZWNpbmN0LT5jYmxrcy5ibG9ja3MgKSB7Ci0JCQkJCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJCQkJCX0KLQkJCQkJCS8qZnByaW50ZihzdGRlcnIsICJcdFx0XHRcdEFsbG9jYXRlIGNibGtzIG9mIGEgcHJlY2luY3QgKG9wal90Y2RfY2Jsa19kZWNfdCk6ICVkXG4iLGxfbmJfY29kZV9ibG9ja3Nfc2l6ZSk7Ki8KLQkJCQkJCQotCQkJCQkJbWVtc2V0KGxfY3VycmVudF9wcmVjaW5jdC0+Y2Jsa3MuYmxvY2tzLDAsbF9uYl9jb2RlX2Jsb2Nrc19zaXplKTsKLQkJCQkJCQotCQkJCQkJbF9jdXJyZW50X3ByZWNpbmN0LT5ibG9ja19zaXplID0gbF9uYl9jb2RlX2Jsb2Nrc19zaXplOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGxfbmJfY29kZV9ibG9ja3Nfc2l6ZSA+IGxfY3VycmVudF9wcmVjaW5jdC0+YmxvY2tfc2l6ZSkgewotCQkJCQkJdm9pZCAqbmV3X2Jsb2NrcyA9IG9wal9yZWFsbG9jKGxfY3VycmVudF9wcmVjaW5jdC0+Y2Jsa3MuYmxvY2tzLCBsX25iX2NvZGVfYmxvY2tzX3NpemUpOwotCQkJCQkJaWYgKCEgbmV3X2Jsb2NrcykgewotCQkJCQkJCW9wal9mcmVlKGxfY3VycmVudF9wcmVjaW5jdC0+Y2Jsa3MuYmxvY2tzKTsKLQkJCQkJCQlsX2N1cnJlbnRfcHJlY2luY3QtPmNibGtzLmJsb2NrcyA9IE5VTEw7Ci0JCQkJCQkJbF9jdXJyZW50X3ByZWNpbmN0LT5ibG9ja19zaXplID0gMDsKLQkJCQkJCQkvKiBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgZm9yIGN1cnJlbnQgcHJlY2luY3QgY29kZWJsb2NrIGVsZW1lbnRcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCQkJCQkJCWZwcmludGYoc3RkZXJyLCAiTm90IGVub3VnaCBtZW1vcnkgZm9yIGN1cnJlbnQgcHJlY2luY3QgY29kZWJsb2NrIGVsZW1lbnRcbiIpOwotCQkJCQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCQkJCQl9Ci0JCQkJCQlsX2N1cnJlbnRfcHJlY2luY3QtPmNibGtzLmJsb2NrcyA9IG5ld19ibG9ja3M7Ci0JCQkJCQkvKmZwcmludGYoc3RkZXJyLCAiXHRcdFx0XHRSZWFsbG9jYXRlIGNibGtzIG9mIGEgcHJlY2luY3QgKG9wal90Y2RfY2Jsa19kZWNfdCk6IGZyb20gJWQgdG8gJWRcbiIsbF9jdXJyZW50X3ByZWNpbmN0LT5ibG9ja19zaXplLCBsX25iX2NvZGVfYmxvY2tzX3NpemUpOyAgICAgKi8KLQkJCQkJCQotCQkJCQkJbWVtc2V0KCgoT1BKX0JZVEUgKikgbF9jdXJyZW50X3ByZWNpbmN0LT5jYmxrcy5ibG9ja3MpICsgbF9jdXJyZW50X3ByZWNpbmN0LT5ibG9ja19zaXplCi0JCQkJCQkJCQkgLDAKLQkJCQkJCQkJCSAsbF9uYl9jb2RlX2Jsb2Nrc19zaXplIC0gbF9jdXJyZW50X3ByZWNpbmN0LT5ibG9ja19zaXplKTsKLQkJCQkJCQotCQkJCQkJbF9jdXJyZW50X3ByZWNpbmN0LT5ibG9ja19zaXplID0gbF9uYl9jb2RlX2Jsb2Nrc19zaXplOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoISBsX2N1cnJlbnRfcHJlY2luY3QtPmluY2x0cmVlKSB7Ci0JCQkJCQlsX2N1cnJlbnRfcHJlY2luY3QtPmluY2x0cmVlID0gb3BqX3RndF9jcmVhdGUobF9jdXJyZW50X3ByZWNpbmN0LT5jdywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJbF9jdXJyZW50X3ByZWNpbmN0LT5jaCk7Ci0JCQkJCX0KLQkJCQkJZWxzZXsKLQkJCQkJCWxfY3VycmVudF9wcmVjaW5jdC0+aW5jbHRyZWUgPSBvcGpfdGd0X2luaXQobF9jdXJyZW50X3ByZWNpbmN0LT5pbmNsdHJlZSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlsX2N1cnJlbnRfcHJlY2luY3QtPmN3LAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCWxfY3VycmVudF9wcmVjaW5jdC0+Y2gpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKCEgbF9jdXJyZW50X3ByZWNpbmN0LT5pbmNsdHJlZSkgICAgIHsKLQkJCQkJCWZwcmludGYoc3RkZXJyLCAiV0FSTklORzogTm8gaW5jbHRyZWUgY3JlYXRlZC5cbiIpOwotCQkJCQkJLypyZXR1cm4gT1BKX0ZBTFNFOyovCi0JCQkJCX0KLQotCQkJCQlpZiAoISBsX2N1cnJlbnRfcHJlY2luY3QtPmltc2J0cmVlKSB7Ci0JCQkJCQlsX2N1cnJlbnRfcHJlY2luY3QtPmltc2J0cmVlID0gb3BqX3RndF9jcmVhdGUoCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCWxfY3VycmVudF9wcmVjaW5jdC0+Y3csCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCWxfY3VycmVudF9wcmVjaW5jdC0+Y2gpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJbF9jdXJyZW50X3ByZWNpbmN0LT5pbXNidHJlZSA9IG9wal90Z3RfaW5pdCgKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlsX2N1cnJlbnRfcHJlY2luY3QtPmltc2J0cmVlLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCWxfY3VycmVudF9wcmVjaW5jdC0+Y3csCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJbF9jdXJyZW50X3ByZWNpbmN0LT5jaCk7Ci0JCQkJCX0KLQotCQkJCQlpZiAoISBsX2N1cnJlbnRfcHJlY2luY3QtPmltc2J0cmVlKSB7Ci0JCQkJCQlmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkc6IE5vIGltc2J0cmVlIGNyZWF0ZWQuXG4iKTsKLQkJCQkJCS8qcmV0dXJuIE9QSl9GQUxTRTsqLwotCQkJCQl9Ci0KLQkJCQkJZm9yIChjYmxrbm8gPSAwOyBjYmxrbm8gPCBsX25iX2NvZGVfYmxvY2tzOyArK2NibGtubykgewotCQkJCQkJT1BKX0lOVDMyIGNibGt4c3RhcnQgPSB0bGNibGt4c3RhcnQgKyAoT1BKX0lOVDMyKShjYmxrbm8gJSBsX2N1cnJlbnRfcHJlY2luY3QtPmN3KSAqICgxIDw8IGNibGt3aWR0aGV4cG4pOwotCQkJCQkJT1BKX0lOVDMyIGNibGt5c3RhcnQgPSB0bGNibGt5c3RhcnQgKyAoT1BKX0lOVDMyKShjYmxrbm8gLyBsX2N1cnJlbnRfcHJlY2luY3QtPmN3KSAqICgxIDw8IGNibGtoZWlnaHRleHBuKTsKLQkJCQkJCU9QSl9JTlQzMiBjYmxreGVuZCA9IGNibGt4c3RhcnQgKyAoMSA8PCBjYmxrd2lkdGhleHBuKTsKLQkJCQkJCU9QSl9JTlQzMiBjYmxreWVuZCA9IGNibGt5c3RhcnQgKyAoMSA8PCBjYmxraGVpZ2h0ZXhwbik7Ci0JCQkJCQkKLQkJCQkJCWlmIChpc0VuY29kZXIpIHsKLQkJCQkJCQlvcGpfdGNkX2NibGtfZW5jX3QqIGxfY29kZV9ibG9jayA9IGxfY3VycmVudF9wcmVjaW5jdC0+Y2Jsa3MuZW5jICsgY2Jsa25vOwotCQkJCQkJCQotCQkJCQkJCWlmICghIG9wal90Y2RfY29kZV9ibG9ja19lbmNfYWxsb2NhdGUobF9jb2RlX2Jsb2NrKSkgewotCQkJCQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQkJCQkJCX0KLQkJCQkJCQkvKiBjb2RlLWJsb2NrIHNpemUgKGdsb2JhbCkgKi8KLQkJCQkJCQlsX2NvZGVfYmxvY2stPngwID0gb3BqX2ludF9tYXgoY2Jsa3hzdGFydCwgbF9jdXJyZW50X3ByZWNpbmN0LT54MCk7Ci0JCQkJCQkJbF9jb2RlX2Jsb2NrLT55MCA9IG9wal9pbnRfbWF4KGNibGt5c3RhcnQsIGxfY3VycmVudF9wcmVjaW5jdC0+eTApOwotCQkJCQkJCWxfY29kZV9ibG9jay0+eDEgPSBvcGpfaW50X21pbihjYmxreGVuZCwgbF9jdXJyZW50X3ByZWNpbmN0LT54MSk7Ci0JCQkJCQkJbF9jb2RlX2Jsb2NrLT55MSA9IG9wal9pbnRfbWluKGNibGt5ZW5kLCBsX2N1cnJlbnRfcHJlY2luY3QtPnkxKTsKLQkJCQkJCQkKLQkJCQkJCQlpZiAoISBvcGpfdGNkX2NvZGVfYmxvY2tfZW5jX2FsbG9jYXRlX2RhdGEobF9jb2RlX2Jsb2NrKSkgewotCQkJCQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJb3BqX3RjZF9jYmxrX2RlY190KiBsX2NvZGVfYmxvY2sgPSBsX2N1cnJlbnRfcHJlY2luY3QtPmNibGtzLmRlYyArIGNibGtubzsKLQkJCQkJCQkKLQkJCQkJCQlpZiAoISBvcGpfdGNkX2NvZGVfYmxvY2tfZGVjX2FsbG9jYXRlKGxfY29kZV9ibG9jaykpIHsKLQkJCQkJCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJCQkJCQl9Ci0JCQkJCQkJLyogY29kZS1ibG9jayBzaXplIChnbG9iYWwpICovCi0JCQkJCQkJbF9jb2RlX2Jsb2NrLT54MCA9IG9wal9pbnRfbWF4KGNibGt4c3RhcnQsIGxfY3VycmVudF9wcmVjaW5jdC0+eDApOwotCQkJCQkJCWxfY29kZV9ibG9jay0+eTAgPSBvcGpfaW50X21heChjYmxreXN0YXJ0LCBsX2N1cnJlbnRfcHJlY2luY3QtPnkwKTsKLQkJCQkJCQlsX2NvZGVfYmxvY2stPngxID0gb3BqX2ludF9taW4oY2Jsa3hlbmQsIGxfY3VycmVudF9wcmVjaW5jdC0+eDEpOwotCQkJCQkJCWxfY29kZV9ibG9jay0+eTEgPSBvcGpfaW50X21pbihjYmxreWVuZCwgbF9jdXJyZW50X3ByZWNpbmN0LT55MSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJKytsX2N1cnJlbnRfcHJlY2luY3Q7Ci0JCQkJfSAvKiBwcmVjbm8gKi8KLQkJCQkrK2xfYmFuZDsKLQkJCQkrK2xfc3RlcF9zaXplOwotCQkJfSAvKiBiYW5kbm8gKi8KLQkJCSsrbF9yZXM7Ci0JCQktLWxfbGV2ZWxfbm87Ci0JCX0gLyogcmVzbm8gKi8KLQkJKytsX3RjY3A7Ci0JCSsrbF90aWxlYzsKLQkJKytsX2ltYWdlX2NvbXA7Ci0JfSAvKiBjb21wbm8gKi8KLQlyZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9CT09MIG9wal90Y2RfaW5pdF9lbmNvZGVfdGlsZSAob3BqX3RjZF90ICpwX3RjZCwgT1BKX1VJTlQzMiBwX3RpbGVfbm8pCi17Ci0JcmV0dXJuIG9wal90Y2RfaW5pdF90aWxlKHBfdGNkLCBwX3RpbGVfbm8sIE9QSl9UUlVFLCAxLjBGLCBzaXplb2Yob3BqX3RjZF9jYmxrX2VuY190KSk7Ci19Ci0KLU9QSl9CT09MIG9wal90Y2RfaW5pdF9kZWNvZGVfdGlsZSAob3BqX3RjZF90ICpwX3RjZCwgT1BKX1VJTlQzMiBwX3RpbGVfbm8pCi17Ci0JcmV0dXJuIG9wal90Y2RfaW5pdF90aWxlKHBfdGNkLCBwX3RpbGVfbm8sIE9QSl9GQUxTRSwgMC41Riwgc2l6ZW9mKG9wal90Y2RfY2Jsa19kZWNfdCkpOwotfQotCi0vKioKLSAqIEFsbG9jYXRlcyBtZW1vcnkgZm9yIGFuIGVuY29kaW5nIGNvZGUgYmxvY2sgKGJ1dCBub3QgZGF0YSBtZW1vcnkpLgotICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF9jb2RlX2Jsb2NrX2VuY19hbGxvY2F0ZSAob3BqX3RjZF9jYmxrX2VuY190ICogcF9jb2RlX2Jsb2NrKQotewotCWlmICghIHBfY29kZV9ibG9jay0+bGF5ZXJzKSB7Ci0JCS8qIG5vIG1lbXNldCBzaW5jZSBkYXRhICovCi0JCXBfY29kZV9ibG9jay0+bGF5ZXJzID0gKG9wal90Y2RfbGF5ZXJfdCopIG9wal9jYWxsb2MoMTAwLCBzaXplb2Yob3BqX3RjZF9sYXllcl90KSk7Ci0JCWlmICghIHBfY29kZV9ibG9jay0+bGF5ZXJzKSB7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9Ci0JfQotCWlmICghIHBfY29kZV9ibG9jay0+cGFzc2VzKSB7Ci0JCXBfY29kZV9ibG9jay0+cGFzc2VzID0gKG9wal90Y2RfcGFzc190Kikgb3BqX2NhbGxvYygxMDAsIHNpemVvZihvcGpfdGNkX3Bhc3NfdCkpOwotCQlpZiAoISBwX2NvZGVfYmxvY2stPnBhc3NlcykgewotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCX0KLQlyZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLS8qKgotICogQWxsb2NhdGVzIGRhdGEgbWVtb3J5IGZvciBhbiBlbmNvZGluZyBjb2RlIGJsb2NrLgotICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF9jb2RlX2Jsb2NrX2VuY19hbGxvY2F0ZV9kYXRhIChvcGpfdGNkX2NibGtfZW5jX3QgKiBwX2NvZGVfYmxvY2spCi17Ci0JT1BKX1VJTlQzMiBsX2RhdGFfc2l6ZTsKLQkKLQlsX2RhdGFfc2l6ZSA9IChPUEpfVUlOVDMyKSgocF9jb2RlX2Jsb2NrLT54MSAtIHBfY29kZV9ibG9jay0+eDApICogKHBfY29kZV9ibG9jay0+eTEgLSBwX2NvZGVfYmxvY2stPnkwKSAqIChPUEpfSU5UMzIpc2l6ZW9mKE9QSl9VSU5UMzIpKTsKLQkKLQlpZiAobF9kYXRhX3NpemUgPiBwX2NvZGVfYmxvY2stPmRhdGFfc2l6ZSkgewotCQlpZiAocF9jb2RlX2Jsb2NrLT5kYXRhKSB7Ci0JCQlvcGpfZnJlZShwX2NvZGVfYmxvY2stPmRhdGEgLSAxKTsgLyogYWdhaW4sIHdoeSAtMSAqLwotCQl9Ci0JCXBfY29kZV9ibG9jay0+ZGF0YSA9IChPUEpfQllURSopIG9wal9tYWxsb2MobF9kYXRhX3NpemUpOwotCQlpZighIHBfY29kZV9ibG9jay0+ZGF0YSkgewotCQkJcF9jb2RlX2Jsb2NrLT5kYXRhX3NpemUgPSAwVTsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KLQkJcF9jb2RlX2Jsb2NrLT5kYXRhX3NpemUgPSBsX2RhdGFfc2l6ZTsKLQkJCi0JCXBfY29kZV9ibG9jay0+ZGF0YVswXSA9IDA7Ci0JCXBfY29kZV9ibG9jay0+ZGF0YSs9MTsgICAvKndoeSArMSA/Ki8KLQl9Ci0JcmV0dXJuIE9QSl9UUlVFOwotfQotCi0vKioKLSAqIEFsbG9jYXRlcyBtZW1vcnkgZm9yIGEgZGVjb2RpbmcgY29kZSBibG9jay4KLSAqLwotc3RhdGljIE9QSl9CT09MIG9wal90Y2RfY29kZV9ibG9ja19kZWNfYWxsb2NhdGUgKG9wal90Y2RfY2Jsa19kZWNfdCAqIHBfY29kZV9ibG9jaykKLXsKLSAgICAgICAgaWYgKCEgcF9jb2RlX2Jsb2NrLT5kYXRhKSB7Ci0KLSAgICAgICAgICAgICAgICBwX2NvZGVfYmxvY2stPmRhdGEgPSAoT1BKX0JZVEUqKSBvcGpfbWFsbG9jKE9QSl9KMktfREVGQVVMVF9DQkxLX0RBVEFfU0laRSk7Ci0gICAgICAgICAgICAgICAgaWYgKCEgcF9jb2RlX2Jsb2NrLT5kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwX2NvZGVfYmxvY2stPmRhdGFfbWF4X3NpemUgPSBPUEpfSjJLX0RFRkFVTFRfQ0JMS19EQVRBX1NJWkU7Ci0gICAgICAgICAgICAgICAgLypmcHJpbnRmKHN0ZGVyciwgIkFsbG9jYXRlIDgxOTIgZWxlbWVudHMgb2YgY29kZV9ibG9jay0+ZGF0YVxuIik7Ki8KLQotICAgICAgICAgICAgICAgIHBfY29kZV9ibG9jay0+c2VncyA9IChvcGpfdGNkX3NlZ190ICopIG9wal9jYWxsb2MoT1BKX0oyS19ERUZBVUxUX05CX1NFR1Msc2l6ZW9mKG9wal90Y2Rfc2VnX3QpKTsKLSAgICAgICAgICAgICAgICBpZiAoISBwX2NvZGVfYmxvY2stPnNlZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qZnByaW50ZihzdGRlcnIsICJBbGxvY2F0ZSAlZCBlbGVtZW50cyBvZiBjb2RlX2Jsb2NrLT5kYXRhXG4iLCBPUEpfSjJLX0RFRkFVTFRfTkJfU0VHUyAqIHNpemVvZihvcGpfdGNkX3NlZ190KSk7Ki8KLQotICAgICAgICAgICAgICAgIHBfY29kZV9ibG9jay0+bV9jdXJyZW50X21heF9zZWdzID0gT1BKX0oyS19ERUZBVUxUX05CX1NFR1M7Ci0gICAgICAgICAgICAgICAgLypmcHJpbnRmKHN0ZGVyciwgIm1fY3VycmVudF9tYXhfc2VncyBvZiBjb2RlX2Jsb2NrLT5kYXRhID0gJWRcbiIsIHBfY29kZV9ibG9jay0+bV9jdXJyZW50X21heF9zZWdzKTsqLwotICAgICAgICB9IGVsc2UgewotCQkJCQkvKiBzYW5pdGl6ZSAqLwotCQkJCQlPUEpfQllURSogbF9kYXRhID0gcF9jb2RlX2Jsb2NrLT5kYXRhOwotCQkJCQlPUEpfVUlOVDMyIGxfZGF0YV9tYXhfc2l6ZSA9IHBfY29kZV9ibG9jay0+ZGF0YV9tYXhfc2l6ZTsKLQkJCQkJb3BqX3RjZF9zZWdfdCAqIGxfc2VncyA9IHBfY29kZV9ibG9jay0+c2VnczsKLQkJCQkJT1BKX1VJTlQzMiBsX2N1cnJlbnRfbWF4X3NlZ3MgPSBwX2NvZGVfYmxvY2stPm1fY3VycmVudF9tYXhfc2VnczsKLQotCQkJCQltZW1zZXQocF9jb2RlX2Jsb2NrLCAwLCBzaXplb2Yob3BqX3RjZF9jYmxrX2RlY190KSk7Ci0JCQkJCXBfY29kZV9ibG9jay0+ZGF0YSA9IGxfZGF0YTsKLQkJCQkJcF9jb2RlX2Jsb2NrLT5kYXRhX21heF9zaXplID0gbF9kYXRhX21heF9zaXplOwotCQkJCQlwX2NvZGVfYmxvY2stPnNlZ3MgPSBsX3NlZ3M7Ci0JCQkJCXBfY29kZV9ibG9jay0+bV9jdXJyZW50X21heF9zZWdzID0gbF9jdXJyZW50X21heF9zZWdzOwotCQkJCX0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9VSU5UMzIgb3BqX3RjZF9nZXRfZGVjb2RlZF90aWxlX3NpemUgKCBvcGpfdGNkX3QgKnBfdGNkICkKLXsKLSAgICAgICAgT1BKX1VJTlQzMiBpOwotICAgICAgICBPUEpfVUlOVDMyIGxfZGF0YV9zaXplID0gMDsKLSAgICAgICAgb3BqX2ltYWdlX2NvbXBfdCAqIGxfaW1nX2NvbXAgPSAwMDsKLSAgICAgICAgb3BqX3RjZF90aWxlY29tcF90ICogbF90aWxlX2NvbXAgPSAwMDsKLSAgICAgICAgb3BqX3RjZF9yZXNvbHV0aW9uX3QgKiBsX3JlcyA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfc2l6ZV9jb21wLCBsX3JlbWFpbmluZzsKLQotICAgICAgICBsX3RpbGVfY29tcCA9IHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT5jb21wczsKLSAgICAgICAgbF9pbWdfY29tcCA9IHBfdGNkLT5pbWFnZS0+Y29tcHM7Ci0KLSAgICAgICAgZm9yIChpPTA7aTxwX3RjZC0+aW1hZ2UtPm51bWNvbXBzOysraSkgewotICAgICAgICAgICAgICAgIGxfc2l6ZV9jb21wID0gbF9pbWdfY29tcC0+cHJlYyA+PiAzOyAvKigvIDgpKi8KLSAgICAgICAgICAgICAgICBsX3JlbWFpbmluZyA9IGxfaW1nX2NvbXAtPnByZWMgJiA3OyAgLyogKCU4KSAqLwotCi0gICAgICAgICAgICAgICAgaWYobF9yZW1haW5pbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICsrbF9zaXplX2NvbXA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGxfc2l6ZV9jb21wID09IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfc2l6ZV9jb21wID0gNDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsX3JlcyA9IGxfdGlsZV9jb21wLT5yZXNvbHV0aW9ucyArIGxfdGlsZV9jb21wLT5taW5pbXVtX251bV9yZXNvbHV0aW9ucyAtIDE7Ci0gICAgICAgICAgICAgICAgbF9kYXRhX3NpemUgKz0gbF9zaXplX2NvbXAgKiAoT1BKX1VJTlQzMikoKGxfcmVzLT54MSAtIGxfcmVzLT54MCkgKiAobF9yZXMtPnkxIC0gbF9yZXMtPnkwKSk7Ci0gICAgICAgICAgICAgICAgKytsX2ltZ19jb21wOwotICAgICAgICAgICAgICAgICsrbF90aWxlX2NvbXA7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbF9kYXRhX3NpemU7Ci19Ci0KLU9QSl9CT09MIG9wal90Y2RfZW5jb2RlX3RpbGUoICAgb3BqX3RjZF90ICpwX3RjZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpwX2Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZm9fdCAqcF9jc3RyX2luZm8pCi17Ci0KLSAgICAgICAgaWYgKHBfdGNkLT5jdXJfdHBfbnVtID09IDApIHsKLQotICAgICAgICAgICAgICAgIHBfdGNkLT50Y2RfdGlsZW5vID0gcF90aWxlX25vOwotICAgICAgICAgICAgICAgIHBfdGNkLT50Y3AgPSAmcF90Y2QtPmNwLT50Y3BzW3BfdGlsZV9ub107Ci0KLSAgICAgICAgICAgICAgICAvKiBJTkRFWCA+PiAiUHJlY2luY3RfbmJfWCBldCBQcmVjaW5jdF9uYl9ZIiAqLwotICAgICAgICAgICAgICAgIGlmKHBfY3N0cl9pbmZvKSAgewotICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsX251bV9wYWNrcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKmxfdGlsZWNfaWR4ID0gJnBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT5jb21wc1swXTsgICAgICAgIC8qIGJhc2VkIG9uIGNvbXBvbmVudCAwICovCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNjcF90ICpsX3RjY3AgPSBwX3RjZC0+dGNwLT50Y2NwczsgLyogYmFzZWQgb24gY29tcG9uZW50IDAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxfdGlsZWNfaWR4LT5udW1yZXNvbHV0aW9uczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90ICpsX3Jlc19pZHggPSAmbF90aWxlY19pZHgtPnJlc29sdXRpb25zW2ldOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmZvLT50aWxlW3BfdGlsZV9ub10ucHdbaV0gPSAoaW50KWxfcmVzX2lkeC0+cHc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmZvLT50aWxlW3BfdGlsZV9ub10ucGhbaV0gPSAoaW50KWxfcmVzX2lkeC0+cGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9udW1fcGFja3MgKz0gbF9yZXNfaWR4LT5wdyAqIGxfcmVzX2lkeC0+cGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmZvLT50aWxlW3BfdGlsZV9ub10ucGR4W2ldID0gKGludClsX3RjY3AtPnByY3dbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmZvLT50aWxlW3BfdGlsZV9ub10ucGR5W2ldID0gKGludClsX3RjY3AtPnByY2hbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2NzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dLnBhY2tldCA9IChvcGpfcGFja2V0X2luZm9fdCopIG9wal9jYWxsb2MoKHNpemVfdClwX2NzdHJfaW5mby0+bnVtY29tcHMgKiAoc2l6ZV90KXBfY3N0cl9pbmZvLT5udW1sYXllcnMgKiBsX251bV9wYWNrcywgc2l6ZW9mKG9wal9wYWNrZXRfaW5mb190KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBfY3N0cl9pbmZvLT50aWxlW3BfdGlsZV9ub10ucGFja2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZJWE1FIGV2ZW50IG1hbmFnZXIgZXJyb3IgY2FsbGJhY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogPDwgSU5ERVggKi8KLQotICAgICAgICAgICAgICAgIC8qIEZJWE1FIF9Qcm9mU3RhcnQoUEdST1VQX0RDX1NISUZUKTsgKi8KLSAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLVRJTEUtLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgICAgICAgICAgICBpZiAoISBvcGpfdGNkX2RjX2xldmVsX3NoaWZ0X2VuY29kZShwX3RjZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIEZJWE1FIF9Qcm9mU3RvcChQR1JPVVBfRENfU0hJRlQpOyAqLwotCi0gICAgICAgICAgICAgICAgLyogRklYTUUgX1Byb2ZTdGFydChQR1JPVVBfTUNUKTsgKi8KLSAgICAgICAgICAgICAgICBpZiAoISBvcGpfdGNkX21jdF9lbmNvZGUocF90Y2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBGSVhNRSBfUHJvZlN0b3AoUEdST1VQX01DVCk7ICovCi0KLSAgICAgICAgICAgICAgICAvKiBGSVhNRSBfUHJvZlN0YXJ0KFBHUk9VUF9EV1QpOyAqLwotICAgICAgICAgICAgICAgIGlmICghIG9wal90Y2RfZHd0X2VuY29kZShwX3RjZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIEZJWE1FICBfUHJvZlN0b3AoUEdST1VQX0RXVCk7ICovCi0KLSAgICAgICAgICAgICAgICAvKiBGSVhNRSAgX1Byb2ZTdGFydChQR1JPVVBfVDEpOyAqLwotICAgICAgICAgICAgICAgIGlmICghIG9wal90Y2RfdDFfZW5jb2RlKHBfdGNkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogRklYTUUgX1Byb2ZTdG9wKFBHUk9VUF9UMSk7ICovCi0KLSAgICAgICAgICAgICAgICAvKiBGSVhNRSBfUHJvZlN0YXJ0KFBHUk9VUF9SQVRFKTsgKi8KLSAgICAgICAgICAgICAgICBpZiAoISBvcGpfdGNkX3JhdGVfYWxsb2NhdGVfZW5jb2RlKHBfdGNkLHBfZGVzdCxwX21heF9sZW5ndGgscF9jc3RyX2luZm8pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBGSVhNRSBfUHJvZlN0b3AoUEdST1VQX1JBVEUpOyAqLwotCi0gICAgICAgIH0KLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLVRJRVIyLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgICAgICAvKiBJTkRFWCAqLwotICAgICAgICBpZiAocF9jc3RyX2luZm8pIHsKLSAgICAgICAgICAgICAgICBwX2NzdHJfaW5mby0+aW5kZXhfd3JpdGUgPSAxOwotICAgICAgICB9Ci0gICAgICAgIC8qIEZJWE1FIF9Qcm9mU3RhcnQoUEdST1VQX1QyKTsgKi8KLQotICAgICAgICBpZiAoISBvcGpfdGNkX3QyX2VuY29kZShwX3RjZCxwX2Rlc3QscF9kYXRhX3dyaXR0ZW4scF9tYXhfbGVuZ3RoLHBfY3N0cl9pbmZvKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRklYTUUgX1Byb2ZTdG9wKFBHUk9VUF9UMik7ICovCi0KLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS1DTEVBTi0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX0JPT0wgb3BqX3RjZF9kZWNvZGVfdGlsZSggICBvcGpfdGNkX3QgKnBfdGNkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqcF9zcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9ubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NvZGVzdHJlYW1faW5kZXhfdCAqcF9jc3RyX2luZGV4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2RhdGFfcmVhZDsKLSAgICAgICAgcF90Y2QtPnRjZF90aWxlbm8gPSBwX3RpbGVfbm87Ci0gICAgICAgIHBfdGNkLT50Y3AgPSAmKHBfdGNkLT5jcC0+dGNwc1twX3RpbGVfbm9dKTsKLQotI2lmZGVmIFRPRE9fTVNEIC8qIEZJWE1FICovCi0gICAgICAgIC8qIElOREVYID4+ICAqLwotICAgICAgICBpZihwX2NzdHJfaW5mbykgewotICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcmVzbm8sIGNvbXBubywgbnVtcHJlYyA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCAoT1BKX1VJTlQzMikgcF9jc3RyX2luZm8tPm51bWNvbXBzOyBjb21wbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjcF90ICp0Y3AgPSAmcF90Y2QtPmNwLT50Y3BzWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjY3BfdCAqdGNjcCA9ICZ0Y3AtPnRjY3BzW2NvbXBub107Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKnRpbGVjX2lkeCA9ICZwX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+Y29tcHNbY29tcG5vXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocmVzbm8gPSAwOyByZXNubyA8IHRpbGVjX2lkeC0+bnVtcmVzb2x1dGlvbnM7IHJlc25vKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9yZXNvbHV0aW9uX3QgKnJlc19pZHggPSAmdGlsZWNfaWR4LT5yZXNvbHV0aW9uc1tyZXNub107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmZvLT50aWxlW3BfdGlsZV9ub10ucHdbcmVzbm9dID0gcmVzX2lkeC0+cHc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmZvLT50aWxlW3BfdGlsZV9ub10ucGhbcmVzbm9dID0gcmVzX2lkeC0+cGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bXByZWMgKz0gcmVzX2lkeC0+cHcgKiByZXNfaWR4LT5waDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jc3RyX2luZm8tPnRpbGVbcF90aWxlX25vXS5wZHhbcmVzbm9dID0gdGNjcC0+cHJjd1tyZXNub107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmZvLT50aWxlW3BfdGlsZV9ub10ucGR5W3Jlc25vXSA9IHRjY3AtPnByY2hbcmVzbm9dOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwX2NzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dLnBhY2tldCA9IChvcGpfcGFja2V0X2luZm9fdCAqKSBvcGpfbWFsbG9jKHBfY3N0cl9pbmZvLT5udW1sYXllcnMgKiBudW1wcmVjICogc2l6ZW9mKG9wal9wYWNrZXRfaW5mb190KSk7Ci0gICAgICAgICAgICAgICAgcF9jc3RyX2luZm8tPnBhY2tubyA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgLyogPDwgSU5ERVggKi8KLSNlbmRpZgotCi0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS1USUVSMi0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgIC8qIEZJWE1FIF9Qcm9mU3RhcnQoUEdST1VQX1QyKTsgKi8KLSAgICAgICAgbF9kYXRhX3JlYWQgPSAwOwotICAgICAgICBpZiAoISBvcGpfdGNkX3QyX2RlY29kZShwX3RjZCwgcF9zcmMsICZsX2RhdGFfcmVhZCwgcF9tYXhfbGVuZ3RoLCBwX2NzdHJfaW5kZXgpKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICAvKiBGSVhNRSBfUHJvZlN0b3AoUEdST1VQX1QyKTsgKi8KLQotICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLVRJRVIxLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgICAgIC8qIEZJWE1FIF9Qcm9mU3RhcnQoUEdST1VQX1QxKTsgKi8KLSAgICAgICAgaWYKLSAgICAgICAgICAgICAgICAoISBvcGpfdGNkX3QxX2RlY29kZShwX3RjZCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIC8qIEZJWE1FIF9Qcm9mU3RvcChQR1JPVVBfVDEpOyAqLwotCi0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLURXVC0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICAgICAgLyogRklYTUUgX1Byb2ZTdGFydChQR1JPVVBfRFdUKTsgKi8KLSAgICAgICAgaWYKLSAgICAgICAgICAgICAgICAoISBvcGpfdGNkX2R3dF9kZWNvZGUocF90Y2QpKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICAvKiBGSVhNRSBfUHJvZlN0b3AoUEdST1VQX0RXVCk7ICovCi0KLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tTUNULS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgIC8qIEZJWE1FIF9Qcm9mU3RhcnQoUEdST1VQX01DVCk7ICovCi0gICAgICAgIGlmCi0gICAgICAgICAgICAgICAgKCEgb3BqX3RjZF9tY3RfZGVjb2RlKHBfdGNkKSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRklYTUUgX1Byb2ZTdG9wKFBHUk9VUF9NQ1QpOyAqLwotCi0gICAgICAgIC8qIEZJWE1FIF9Qcm9mU3RhcnQoUEdST1VQX0RDX1NISUZUKTsgKi8KLSAgICAgICAgaWYKLSAgICAgICAgICAgICAgICAoISBvcGpfdGNkX2RjX2xldmVsX3NoaWZ0X2RlY29kZShwX3RjZCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIC8qIEZJWE1FIF9Qcm9mU3RvcChQR1JPVVBfRENfU0hJRlQpOyAqLwotCi0KLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS1USUxFLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX0JPT0wgb3BqX3RjZF91cGRhdGVfdGlsZV9kYXRhICggb3BqX3RjZF90ICpwX3RjZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2Rlc3RfbGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgaSxqLGssbF9kYXRhX3NpemUgPSAwOwotICAgICAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IDAwOwotICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKiBsX3RpbGVjID0gMDA7Ci0gICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90ICogbF9yZXM7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9zaXplX2NvbXAsIGxfcmVtYWluaW5nOwotICAgICAgICBPUEpfVUlOVDMyIGxfc3RyaWRlLCBsX3dpZHRoLGxfaGVpZ2h0OwotCi0gICAgICAgIGxfZGF0YV9zaXplID0gb3BqX3RjZF9nZXRfZGVjb2RlZF90aWxlX3NpemUocF90Y2QpOwotICAgICAgICBpZiAobF9kYXRhX3NpemUgPiBwX2Rlc3RfbGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIGxfdGlsZWMgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+Y29tcHM7Ci0gICAgICAgIGxfaW1nX2NvbXAgPSBwX3RjZC0+aW1hZ2UtPmNvbXBzOwotCi0gICAgICAgIGZvciAoaT0wO2k8cF90Y2QtPmltYWdlLT5udW1jb21wczsrK2kpIHsKLSAgICAgICAgICAgICAgICBsX3NpemVfY29tcCA9IGxfaW1nX2NvbXAtPnByZWMgPj4gMzsgLyooLyA4KSovCi0gICAgICAgICAgICAgICAgbF9yZW1haW5pbmcgPSBsX2ltZ19jb21wLT5wcmVjICYgNzsgIC8qICglOCkgKi8KLSAgICAgICAgICAgICAgICBsX3JlcyA9IGxfdGlsZWMtPnJlc29sdXRpb25zICsgbF9pbWdfY29tcC0+cmVzbm9fZGVjb2RlZDsKLSAgICAgICAgICAgICAgICBsX3dpZHRoID0gKE9QSl9VSU5UMzIpKGxfcmVzLT54MSAtIGxfcmVzLT54MCk7Ci0gICAgICAgICAgICAgICAgbF9oZWlnaHQgPSAoT1BKX1VJTlQzMikobF9yZXMtPnkxIC0gbF9yZXMtPnkwKTsKLSAgICAgICAgICAgICAgICBsX3N0cmlkZSA9IChPUEpfVUlOVDMyKShsX3RpbGVjLT54MSAtIGxfdGlsZWMtPngwKSAtIGxfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICBpZiAobF9yZW1haW5pbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICsrbF9zaXplX2NvbXA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGxfc2l6ZV9jb21wID09IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfc2l6ZV9jb21wID0gNDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGxfc2l6ZV9jb21wKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0NIQVIgKiBsX2Rlc3RfcHRyID0gKE9QSl9DSEFSICopIHBfZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUEpfSU5UMzIgKiBsX3NyY19wdHIgPSBsX3RpbGVjLT5kYXRhOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfaW1nX2NvbXAtPnNnbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9oZWlnaHQ7KytqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaz0wO2s8bF93aWR0aDsrK2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGxfZGVzdF9wdHIrKykgPSAoT1BKX0NIQVIpICgqKGxfc3JjX3B0cisrKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zcmNfcHRyICs9IGxfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9oZWlnaHQ7KytqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAgICAgKGs9MDtrPGxfd2lkdGg7KytrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKE9QSl9DSEFSKSAoKCoobF9zcmNfcHRyKyspKSYweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NyY19wdHIgKz0gbF9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kZXN0ID0gKE9QSl9CWVRFICopbF9kZXN0X3B0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9QSl9JTlQzMiAqIGxfc3JjX3B0ciA9IGxfdGlsZWMtPmRhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDE2ICogbF9kZXN0X3B0ciA9IChPUEpfSU5UMTYgKikgcF9kZXN0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfaW1nX2NvbXAtPnNnbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9oZWlnaHQ7KytqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaz0wO2s8bF93aWR0aDsrK2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGxfZGVzdF9wdHIrKykgPSAoT1BKX0lOVDE2KSAoKihsX3NyY19wdHIrKykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfaGVpZ2h0OysraikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGs9MDtrPGxfd2lkdGg7KytrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKE9QSl9JTlQxNikgKCgqKGxfc3JjX3B0cisrKSkmMHhmZmZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NyY19wdHIgKz0gbF9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kZXN0ID0gKE9QSl9CWVRFKikgbF9kZXN0X3B0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIGxfZGVzdF9wdHIgPSAoT1BKX0lOVDMyICopIHBfZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBsX3NyY19wdHIgPSBsX3RpbGVjLT5kYXRhOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7ajxsX2hlaWdodDsrK2opIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaz0wO2s8bF93aWR0aDsrK2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKCoobF9zcmNfcHRyKyspKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Rlc3QgPSAoT1BKX0JZVEUqKSBsX2Rlc3RfcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICsrbF9pbWdfY29tcDsKLSAgICAgICAgICAgICAgICArK2xfdGlsZWM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLQotCi0KLXZvaWQgb3BqX3RjZF9mcmVlX3RpbGUob3BqX3RjZF90ICpwX3RjZCkKLXsKLSAgICAgICAgT1BKX1VJTlQzMiBjb21wbm8sIHJlc25vLCBiYW5kbm8sIHByZWNubzsKLSAgICAgICAgb3BqX3RjZF90aWxlX3QgKmxfdGlsZSA9IDAwOwotICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKmxfdGlsZV9jb21wID0gMDA7Ci0gICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90ICpsX3JlcyA9IDAwOwotICAgICAgICBvcGpfdGNkX2JhbmRfdCAqbF9iYW5kID0gMDA7Ci0gICAgICAgIG9wal90Y2RfcHJlY2luY3RfdCAqbF9wcmVjaW5jdCA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfcmVzb2x1dGlvbnMsIGxfbmJfcHJlY2luY3RzOwotICAgICAgICB2b2lkICgqIGxfdGNkX2NvZGVfYmxvY2tfZGVhbGxvY2F0ZSkgKG9wal90Y2RfcHJlY2luY3RfdCAqKSA9IDAwOwotCi0gICAgICAgIGlmICghIHBfdGNkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCEgcF90Y2QtPnRjZF9pbWFnZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwX3RjZC0+bV9pc19kZWNvZGVyKSB7Ci0gICAgICAgICAgICAgICAgbF90Y2RfY29kZV9ibG9ja19kZWFsbG9jYXRlID0gb3BqX3RjZF9jb2RlX2Jsb2NrX2RlY19kZWFsbG9jYXRlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGxfdGNkX2NvZGVfYmxvY2tfZGVhbGxvY2F0ZSA9IG9wal90Y2RfY29kZV9ibG9ja19lbmNfZGVhbGxvY2F0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGxfdGlsZSA9IHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzOwotICAgICAgICBpZiAoISBsX3RpbGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBsX3RpbGVfY29tcCA9IGxfdGlsZS0+Y29tcHM7Ci0KLSAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBsX3RpbGUtPm51bWNvbXBzOyArK2NvbXBubykgewotICAgICAgICAgICAgICAgIGxfcmVzID0gbF90aWxlX2NvbXAtPnJlc29sdXRpb25zOwotICAgICAgICAgICAgICAgIGlmIChsX3JlcykgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBsX25iX3Jlc29sdXRpb25zID0gbF90aWxlX2NvbXAtPnJlc29sdXRpb25zX3NpemUgLyBzaXplb2Yob3BqX3RjZF9yZXNvbHV0aW9uX3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChyZXNubyA9IDA7IHJlc25vIDwgbF9uYl9yZXNvbHV0aW9uczsgKytyZXNubykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2JhbmQgPSBsX3Jlcy0+YmFuZHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAgICAgKGJhbmRubyA9IDA7IGJhbmRubyA8IDM7ICsrYmFuZG5vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9wcmVjaW5jdCA9IGxfYmFuZC0+cHJlY2luY3RzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX3ByZWNpbmN0KSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfbmJfcHJlY2luY3RzID0gbF9iYW5kLT5wcmVjaW5jdHNfZGF0YV9zaXplIC8gc2l6ZW9mKG9wal90Y2RfcHJlY2luY3RfdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHByZWNubyA9IDA7IHByZWNubyA8IGxfbmJfcHJlY2luY3RzOyArK3ByZWNubykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGd0X2Rlc3Ryb3kobF9wcmVjaW5jdC0+aW5jbHRyZWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3ByZWNpbmN0LT5pbmNsdHJlZSA9IDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGd0X2Rlc3Ryb3kobF9wcmVjaW5jdC0+aW1zYnRyZWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3ByZWNpbmN0LT5pbXNidHJlZSA9IDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmxfdGNkX2NvZGVfYmxvY2tfZGVhbGxvY2F0ZSkgKGxfcHJlY2luY3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfcHJlY2luY3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfYmFuZC0+cHJlY2luY3RzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfYmFuZC0+cHJlY2luY3RzID0gMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9iYW5kOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8qIGZvciAocmVzbm8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX3JlczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF90aWxlX2NvbXAtPnJlc29sdXRpb25zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfdGlsZV9jb21wLT5yZXNvbHV0aW9ucyA9IDAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChsX3RpbGVfY29tcC0+b3duc0RhdGEgJiYgbF90aWxlX2NvbXAtPmRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfdGlsZV9jb21wLT5kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfdGlsZV9jb21wLT5kYXRhID0gMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX3RpbGVfY29tcC0+b3duc0RhdGEgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgbF90aWxlX2NvbXAtPmRhdGFfc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX3RpbGVfY29tcC0+ZGF0YV9zaXplX25lZWRlZCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICsrbF90aWxlX2NvbXA7Ci0gICAgICAgIH0KLQotICAgICAgICBvcGpfZnJlZShsX3RpbGUtPmNvbXBzKTsKLSAgICAgICAgbF90aWxlLT5jb21wcyA9IDAwOwotICAgICAgICBvcGpfZnJlZShwX3RjZC0+dGNkX2ltYWdlLT50aWxlcyk7Ci0gICAgICAgIHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzID0gMDA7Ci19Ci0KLQotT1BKX0JPT0wgb3BqX3RjZF90Ml9kZWNvZGUgKG9wal90Y2RfdCAqcF90Y2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX3NyY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfcmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X3NyY19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZGV4X3QgKnBfY3N0cl9pbmRleAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICAgICAgb3BqX3QyX3QgKiBsX3QyOwotCi0gICAgICAgIGxfdDIgPSBvcGpfdDJfY3JlYXRlKHBfdGNkLT5pbWFnZSwgcF90Y2QtPmNwKTsKLSAgICAgICAgaWYgKGxfdDIgPT0gMDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCEgb3BqX3QyX2RlY29kZV9wYWNrZXRzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90Y2QtPnRjZF90aWxlbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zcmNfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGFfcmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21heF9zcmNfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NzdHJfaW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3QyX2Rlc3Ryb3kobF90Mik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIG9wal90Ml9kZXN0cm95KGxfdDIpOwotCi0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tQ0xFQU4tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi1PUEpfQk9PTCBvcGpfdGNkX3QxX2RlY29kZSAoIG9wal90Y2RfdCAqcF90Y2QgKQotewotICAgICAgICBPUEpfVUlOVDMyIGNvbXBubzsKLSAgICAgICAgb3BqX3QxX3QgKiBsX3QxOwotICAgICAgICBvcGpfdGNkX3RpbGVfdCAqIGxfdGlsZSA9IHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzOwotICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QqIGxfdGlsZV9jb21wID0gbF90aWxlLT5jb21wczsKLSAgICAgICAgb3BqX3RjY3BfdCAqIGxfdGNjcCA9IHBfdGNkLT50Y3AtPnRjY3BzOwotCi0KLSAgICAgICAgbF90MSA9IG9wal90MV9jcmVhdGUoT1BKX0ZBTFNFKTsKLSAgICAgICAgaWYgKGxfdDEgPT0gMDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBsX3RpbGUtPm51bWNvbXBzOyArK2NvbXBubykgewotICAgICAgICAgICAgICAgIC8qIFRoZSArMyBpcyBoZWFkcm9vbSByZXF1aXJlZCBieSB0aGUgdmVjdG9yaXplZCBEV1QgKi8KLSAgICAgICAgICAgICAgICBpZiAoT1BKX0ZBTFNFID09IG9wal90MV9kZWNvZGVfY2Jsa3MobF90MSwgbF90aWxlX2NvbXAsIGxfdGNjcCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90MV9kZXN0cm95KGxfdDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKytsX3RpbGVfY29tcDsKLSAgICAgICAgICAgICAgICArK2xfdGNjcDsKLSAgICAgICAgfQotCi0gICAgICAgIG9wal90MV9kZXN0cm95KGxfdDEpOwotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotCi1PUEpfQk9PTCBvcGpfdGNkX2R3dF9kZWNvZGUgKCBvcGpfdGNkX3QgKnBfdGNkICkKLXsKLSAgICAgICAgT1BKX1VJTlQzMiBjb21wbm87Ci0gICAgICAgIG9wal90Y2RfdGlsZV90ICogbF90aWxlID0gcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXM7Ci0gICAgICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqIGxfdGlsZV9jb21wID0gbF90aWxlLT5jb21wczsKLSAgICAgICAgb3BqX3RjY3BfdCAqIGxfdGNjcCA9IHBfdGNkLT50Y3AtPnRjY3BzOwotICAgICAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IHBfdGNkLT5pbWFnZS0+Y29tcHM7Ci0KLSAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBsX3RpbGUtPm51bWNvbXBzOyBjb21wbm8rKykgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgaWYgKHRjZC0+Y3AtPnJlZHVjZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0Y2QtPmltYWdlLT5jb21wc1tjb21wbm9dLnJlc25vX2RlY29kZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlLT5jb21wc1tjb21wbm9dLm51bXJlc29sdXRpb25zIC0gdGNkLT5jcC0+cmVkdWNlIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0Y2QtPmltYWdlLT5jb21wc1tjb21wbm9dLnJlc25vX2RlY29kZWQgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG51bXJlczJkZWNvZGUgPSB0Y2QtPmltYWdlLT5jb21wc1tjb21wbm9dLnJlc25vX2RlY29kZWQgKyAxOwotICAgICAgICAgICAgICAgIGlmKG51bXJlczJkZWNvZGUgPiAwKXsKLSAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgaWYgKGxfdGNjcC0+cW1mYmlkID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG9wal9kd3RfZGVjb2RlKGxfdGlsZV9jb21wLCBsX2ltZ19jb21wLT5yZXNub19kZWNvZGVkKzEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgb3BqX2R3dF9kZWNvZGVfcmVhbChsX3RpbGVfY29tcCwgbF9pbWdfY29tcC0+cmVzbm9fZGVjb2RlZCsxKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICsrbF90aWxlX2NvbXA7Ci0gICAgICAgICAgICAgICAgKytsX2ltZ19jb21wOwotICAgICAgICAgICAgICAgICsrbF90Y2NwOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotT1BKX0JPT0wgb3BqX3RjZF9tY3RfZGVjb2RlICggb3BqX3RjZF90ICpwX3RjZCApCi17Ci0gICAgICAgIG9wal90Y2RfdGlsZV90ICogbF90aWxlID0gcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXM7Ci0gICAgICAgIG9wal90Y3BfdCAqIGxfdGNwID0gcF90Y2QtPnRjcDsKLSAgICAgICAgb3BqX3RjZF90aWxlY29tcF90ICogbF90aWxlX2NvbXAgPSBsX3RpbGUtPmNvbXBzOwotICAgICAgICBPUEpfVUlOVDMyIGxfc2FtcGxlcyxpOwotCi0gICAgICAgIGlmICghIGxfdGNwLT5tY3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBsX3NhbXBsZXMgPSAoT1BKX1VJTlQzMikoKGxfdGlsZV9jb21wLT54MSAtIGxfdGlsZV9jb21wLT54MCkgKiAobF90aWxlX2NvbXAtPnkxIC0gbF90aWxlX2NvbXAtPnkwKSk7Ci0KLSAgICAgICAgaWYgKGxfdGlsZS0+bnVtY29tcHMgPj0gMyApewotICAgICAgICAgICAgICAgIC8qIHRlc3RjYXNlIDEzMzYucGRmLmFzYW4uNDcuMzc2ICovCi0gICAgICAgICAgICAgICAgaWYgKChsX3RpbGUtPmNvbXBzWzBdLngxIC0gbF90aWxlLT5jb21wc1swXS54MCkgKiAobF90aWxlLT5jb21wc1swXS55MSAtIGxfdGlsZS0+Y29tcHNbMF0ueTApIDwgKE9QSl9JTlQzMilsX3NhbXBsZXMgfHwKLSAgICAgICAgICAgICAgICAgICAgKGxfdGlsZS0+Y29tcHNbMV0ueDEgLSBsX3RpbGUtPmNvbXBzWzFdLngwKSAqIChsX3RpbGUtPmNvbXBzWzFdLnkxIC0gbF90aWxlLT5jb21wc1sxXS55MCkgPCAoT1BKX0lOVDMyKWxfc2FtcGxlcyB8fAotICAgICAgICAgICAgICAgICAgICAobF90aWxlLT5jb21wc1syXS54MSAtIGxfdGlsZS0+Y29tcHNbMl0ueDApICogKGxfdGlsZS0+Y29tcHNbMl0ueTEgLSBsX3RpbGUtPmNvbXBzWzJdLnkwKSA8IChPUEpfSU5UMzIpbF9zYW1wbGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRpbGVzIGRvbid0IGFsbCBoYXZlIHRoZSBzYW1lIGRpbWVuc2lvbi4gU2tpcCB0aGUgTUNUIHN0ZXAuXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxfdGNwLT5tY3QgPT0gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiogbF9kYXRhOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBsX3RjcC0+bV9tY3RfZGVjb2RpbmdfbWF0cml4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgbF9kYXRhID0gKE9QSl9CWVRFICoqKSBvcGpfbWFsbG9jKGxfdGlsZS0+bnVtY29tcHMqc2l6ZW9mKE9QSl9CWVRFKikpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbF9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wO2k8bF90aWxlLT5udW1jb21wczsrK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9kYXRhW2ldID0gKE9QSl9CWVRFKikgbF90aWxlX2NvbXAtPmRhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF90aWxlX2NvbXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG9wal9tY3RfZGVjb2RlX2N1c3RvbSgvKiBNQ1QgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9CWVRFKikgbF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2YgY29tcG9uZW50cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29tcG9uZW50cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmIgb2YgY29tcG9uZW50cyAoaS5lLiBzaXplIG9mIHBEYXRhKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90aWxlLT5udW1jb21wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlbGxzIGlmIHRoZSBkYXRhIGlzIHNpZ25lZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90Y2QtPmltYWdlLT5jb21wcy0+c2duZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9kYXRhKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF90Y3AtPnRjY3BzLT5xbWZiaWQgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfbWN0X2RlY29kZSggICAgIGxfdGlsZS0+Y29tcHNbMF0uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90aWxlLT5jb21wc1sxXS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RpbGUtPmNvbXBzWzJdLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfbWN0X2RlY29kZV9yZWFsKChPUEpfRkxPQVQzMiopbF90aWxlLT5jb21wc1swXS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9GTE9BVDMyKilsX3RpbGUtPmNvbXBzWzFdLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0ZMT0FUMzIqKWxfdGlsZS0+Y29tcHNbMl0uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8qIEZJWE1FIG5lZWQgdG8gdXNlIG9wal9ldmVudF9tc2cgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiTnVtYmVyIG9mIGNvbXBvbmVudHMgKCVkKSBpcyBpbmNvbnNpc3RlbnQgd2l0aCBhIE1DVC4gU2tpcCB0aGUgTUNUIHN0ZXAuXG4iLGxfdGlsZS0+bnVtY29tcHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi0KLU9QSl9CT09MIG9wal90Y2RfZGNfbGV2ZWxfc2hpZnRfZGVjb2RlICggb3BqX3RjZF90ICpwX3RjZCApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgY29tcG5vOwotICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKiBsX3RpbGVfY29tcCA9IDAwOwotICAgICAgICBvcGpfdGNjcF90ICogbF90Y2NwID0gMDA7Ci0gICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wID0gMDA7Ci0gICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90KiBsX3JlcyA9IDAwOwotICAgICAgICBvcGpfdGNkX3RpbGVfdCAqIGxfdGlsZTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3dpZHRoLGxfaGVpZ2h0LGksajsKLSAgICAgICAgT1BKX0lOVDMyICogbF9jdXJyZW50X3B0cjsKLSAgICAgICAgT1BKX0lOVDMyIGxfbWluLCBsX21heDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3N0cmlkZTsKLQotICAgICAgICBsX3RpbGUgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlczsKLSAgICAgICAgbF90aWxlX2NvbXAgPSBsX3RpbGUtPmNvbXBzOwotICAgICAgICBsX3RjY3AgPSBwX3RjZC0+dGNwLT50Y2NwczsKLSAgICAgICAgbF9pbWdfY29tcCA9IHBfdGNkLT5pbWFnZS0+Y29tcHM7Ci0KLSAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBsX3RpbGUtPm51bWNvbXBzOyBjb21wbm8rKykgewotICAgICAgICAgICAgICAgIGxfcmVzID0gbF90aWxlX2NvbXAtPnJlc29sdXRpb25zICsgbF9pbWdfY29tcC0+cmVzbm9fZGVjb2RlZDsKLSAgICAgICAgICAgICAgICBsX3dpZHRoID0gKE9QSl9VSU5UMzIpKGxfcmVzLT54MSAtIGxfcmVzLT54MCk7Ci0gICAgICAgICAgICAgICAgbF9oZWlnaHQgPSAoT1BKX1VJTlQzMikobF9yZXMtPnkxIC0gbF9yZXMtPnkwKTsKLSAgICAgICAgICAgICAgICBsX3N0cmlkZSA9IChPUEpfVUlOVDMyKShsX3RpbGVfY29tcC0+eDEgLSBsX3RpbGVfY29tcC0+eDApIC0gbF93aWR0aDsKLQotICAgICAgICAgICAgICAgIGFzc2VydChsX2hlaWdodCA9PSAwIHx8IGxfd2lkdGggKyBsX3N0cmlkZSA8PSBsX3RpbGVfY29tcC0+ZGF0YV9zaXplIC8gbF9oZWlnaHQpOyAvKk1VUERGKi8KLQotICAgICAgICAgICAgICAgIGlmIChsX2ltZ19jb21wLT5zZ25kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX21pbiA9IC0oMSA8PCAobF9pbWdfY29tcC0+cHJlYyAtIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfbWF4ID0gKDEgPDwgKGxfaW1nX2NvbXAtPnByZWMgLSAxKSkgLSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGxfbWluID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfbWF4ID0gKDEgPDwgbF9pbWdfY29tcC0+cHJlYykgLSAxOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxfY3VycmVudF9wdHIgPSBsX3RpbGVfY29tcC0+ZGF0YTsKLQotICAgICAgICAgICAgICAgIGlmIChsX3RjY3AtPnFtZmJpZCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfaGVpZ2h0OysraikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbF93aWR0aDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxfY3VycmVudF9wdHIgPSBvcGpfaW50X2NsYW1wKCpsX2N1cnJlbnRfcHRyICsgbF90Y2NwLT5tX2RjX2xldmVsX3NoaWZ0LCBsX21pbiwgbF9tYXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X3B0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfcHRyICs9IGxfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9oZWlnaHQ7KytqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsX3dpZHRoOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiBsX3ZhbHVlID0gKigoT1BKX0ZMT0FUMzIgKikgbF9jdXJyZW50X3B0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxfY3VycmVudF9wdHIgPSBvcGpfaW50X2NsYW1wKChPUEpfSU5UMzIpbHJpbnRmKGxfdmFsdWUpICsgbF90Y2NwLT5tX2RjX2xldmVsX3NoaWZ0LCBsX21pbiwgbF9tYXgpOyA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX2N1cnJlbnRfcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9wdHIgKz0gbF9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgKytsX2ltZ19jb21wOwotICAgICAgICAgICAgICAgICsrbF90Y2NwOwotICAgICAgICAgICAgICAgICsrbF90aWxlX2NvbXA7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLQotCi0vKioKLSAqIERlYWxsb2NhdGVzIHRoZSBlbmNvZGluZyBkYXRhIG9mIHRoZSBnaXZlbiBwcmVjaW5jdC4KLSAqLwotdm9pZCBvcGpfdGNkX2NvZGVfYmxvY2tfZGVjX2RlYWxsb2NhdGUgKG9wal90Y2RfcHJlY2luY3RfdCAqIHBfcHJlY2luY3QpCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgY2Jsa25vICwgbF9uYl9jb2RlX2Jsb2NrczsKLQotICAgICAgICBvcGpfdGNkX2NibGtfZGVjX3QgKiBsX2NvZGVfYmxvY2sgPSBwX3ByZWNpbmN0LT5jYmxrcy5kZWM7Ci0gICAgICAgIGlmIChsX2NvZGVfYmxvY2spIHsKLSAgICAgICAgICAgICAgICAvKmZwcmludGYoc3RkZXJyLCJkZWFsbG9jYXRlIGNvZGVibG9jazp7XG4iKTsqLwotICAgICAgICAgICAgICAgIC8qZnByaW50ZihzdGRlcnIsIlx0IHgwPSVkLCB5MD0lZCwgeDE9JWQsIHkxPSVkXG4iLGxfY29kZV9ibG9jay0+eDAsIGxfY29kZV9ibG9jay0+eTAsIGxfY29kZV9ibG9jay0+eDEsIGxfY29kZV9ibG9jay0+eTEpOyovCi0gICAgICAgICAgICAgICAgLypmcHJpbnRmKHN0ZGVyciwiXHQgbnVtYnBzPSVkLCBudW1sZW5iaXRzPSVkLCBsZW49JWQsIG51bW5ld3Bhc3Nlcz0lZCwgcmVhbF9udW1fc2Vncz0lZCwgbV9jdXJyZW50X21heF9zZWdzPSVkXG4gIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jb2RlX2Jsb2NrLT5udW1icHMsIGxfY29kZV9ibG9jay0+bnVtbGVuYml0cywgbF9jb2RlX2Jsb2NrLT5sZW4sIGxfY29kZV9ibG9jay0+bnVtbmV3cGFzc2VzLCBsX2NvZGVfYmxvY2stPnJlYWxfbnVtX3NlZ3MsIGxfY29kZV9ibG9jay0+bV9jdXJyZW50X21heF9zZWdzICk7Ki8KLQotCi0gICAgICAgICAgICAgICAgbF9uYl9jb2RlX2Jsb2NrcyA9IHBfcHJlY2luY3QtPmJsb2NrX3NpemUgLyBzaXplb2Yob3BqX3RjZF9jYmxrX2RlY190KTsKLSAgICAgICAgICAgICAgICAvKmZwcmludGYoc3RkZXJyLCJuYl9jb2RlX2Jsb2NrcyA9JWRcdH1cbiIsIGxfbmJfY29kZV9ibG9ja3MpOyovCi0KLSAgICAgICAgICAgICAgICBmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IGxfbmJfY29kZV9ibG9ja3M7ICsrY2Jsa25vKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2NvZGVfYmxvY2stPmRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jb2RlX2Jsb2NrLT5kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jb2RlX2Jsb2NrLT5kYXRhID0gMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2NvZGVfYmxvY2stPnNlZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jb2RlX2Jsb2NrLT5zZWdzICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY29kZV9ibG9jay0+c2VncyA9IDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICArK2xfY29kZV9ibG9jazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBvcGpfZnJlZShwX3ByZWNpbmN0LT5jYmxrcy5kZWMpOwotICAgICAgICAgICAgICAgIHBfcHJlY2luY3QtPmNibGtzLmRlYyA9IDAwOwotICAgICAgICB9Ci19Ci0KLS8qKgotICogRGVhbGxvY2F0ZXMgdGhlIGVuY29kaW5nIGRhdGEgb2YgdGhlIGdpdmVuIHByZWNpbmN0LgotICovCi12b2lkIG9wal90Y2RfY29kZV9ibG9ja19lbmNfZGVhbGxvY2F0ZSAob3BqX3RjZF9wcmVjaW5jdF90ICogcF9wcmVjaW5jdCkKLXsgICAgICAgCi0gICAgICAgIE9QSl9VSU5UMzIgY2Jsa25vICwgbF9uYl9jb2RlX2Jsb2NrczsKLQotICAgICAgICBvcGpfdGNkX2NibGtfZW5jX3QgKiBsX2NvZGVfYmxvY2sgPSBwX3ByZWNpbmN0LT5jYmxrcy5lbmM7Ci0gICAgICAgIGlmIChsX2NvZGVfYmxvY2spIHsKLSAgICAgICAgICAgICAgICBsX25iX2NvZGVfYmxvY2tzID0gcF9wcmVjaW5jdC0+YmxvY2tfc2l6ZSAvIHNpemVvZihvcGpfdGNkX2NibGtfZW5jX3QpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAgICAgKGNibGtubyA9IDA7IGNibGtubyA8IGxfbmJfY29kZV9ibG9ja3M7ICsrY2Jsa25vKSAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfY29kZV9ibG9jay0+ZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2NvZGVfYmxvY2stPmRhdGEgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jb2RlX2Jsb2NrLT5kYXRhID0gMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2NvZGVfYmxvY2stPmxheWVycykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2NvZGVfYmxvY2stPmxheWVycyApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NvZGVfYmxvY2stPmxheWVycyA9IDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9jb2RlX2Jsb2NrLT5wYXNzZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jb2RlX2Jsb2NrLT5wYXNzZXMgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jb2RlX2Jsb2NrLT5wYXNzZXMgPSAwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICsrbF9jb2RlX2Jsb2NrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfcHJlY2luY3QtPmNibGtzLmVuYyk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcF9wcmVjaW5jdC0+Y2Jsa3MuZW5jID0gMDA7Ci0gICAgICAgIH0KLX0KLQotT1BKX1VJTlQzMiBvcGpfdGNkX2dldF9lbmNvZGVkX3RpbGVfc2l6ZSAoIG9wal90Y2RfdCAqcF90Y2QgKQotewotICAgICAgICBPUEpfVUlOVDMyIGksbF9kYXRhX3NpemUgPSAwOwotICAgICAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IDAwOwotICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKiBsX3RpbGVjID0gMDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9zaXplX2NvbXAsIGxfcmVtYWluaW5nOwotCi0gICAgICAgIGxfdGlsZWMgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+Y29tcHM7Ci0gICAgICAgIGxfaW1nX2NvbXAgPSBwX3RjZC0+aW1hZ2UtPmNvbXBzOwotICAgICAgICBmb3IgKGk9MDtpPHBfdGNkLT5pbWFnZS0+bnVtY29tcHM7KytpKSB7Ci0gICAgICAgICAgICAgICAgbF9zaXplX2NvbXAgPSBsX2ltZ19jb21wLT5wcmVjID4+IDM7IC8qKC8gOCkqLwotICAgICAgICAgICAgICAgIGxfcmVtYWluaW5nID0gbF9pbWdfY29tcC0+cHJlYyAmIDc7ICAvKiAoJTgpICovCi0KLSAgICAgICAgICAgICAgICBpZiAobF9yZW1haW5pbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICsrbF9zaXplX2NvbXA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGxfc2l6ZV9jb21wID09IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfc2l6ZV9jb21wID0gNDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsX2RhdGFfc2l6ZSArPSBsX3NpemVfY29tcCAqIChPUEpfVUlOVDMyKSgobF90aWxlYy0+eDEgLSBsX3RpbGVjLT54MCkgKiAobF90aWxlYy0+eTEgLSBsX3RpbGVjLT55MCkpOwotICAgICAgICAgICAgICAgICsrbF9pbWdfY29tcDsKLSAgICAgICAgICAgICAgICArK2xfdGlsZWM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbF9kYXRhX3NpemU7Ci19Ci0gICAgICAgICAgICAgICAgCi1PUEpfQk9PTCBvcGpfdGNkX2RjX2xldmVsX3NoaWZ0X2VuY29kZSAoIG9wal90Y2RfdCAqcF90Y2QgKQotewotICAgICAgICBPUEpfVUlOVDMyIGNvbXBubzsKLSAgICAgICAgb3BqX3RjZF90aWxlY29tcF90ICogbF90aWxlX2NvbXAgPSAwMDsKLSAgICAgICAgb3BqX3RjY3BfdCAqIGxfdGNjcCA9IDAwOwotICAgICAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IDAwOwotICAgICAgICBvcGpfdGNkX3RpbGVfdCAqIGxfdGlsZTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX2VsZW0saTsKLSAgICAgICAgT1BKX0lOVDMyICogbF9jdXJyZW50X3B0cjsKLQotICAgICAgICBsX3RpbGUgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlczsKLSAgICAgICAgbF90aWxlX2NvbXAgPSBsX3RpbGUtPmNvbXBzOwotICAgICAgICBsX3RjY3AgPSBwX3RjZC0+dGNwLT50Y2NwczsKLSAgICAgICAgbF9pbWdfY29tcCA9IHBfdGNkLT5pbWFnZS0+Y29tcHM7Ci0KLSAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBsX3RpbGUtPm51bWNvbXBzOyBjb21wbm8rKykgewotICAgICAgICAgICAgICAgIGxfY3VycmVudF9wdHIgPSBsX3RpbGVfY29tcC0+ZGF0YTsKLSAgICAgICAgICAgICAgICBsX25iX2VsZW0gPSAoT1BKX1VJTlQzMikoKGxfdGlsZV9jb21wLT54MSAtIGxfdGlsZV9jb21wLT54MCkgKiAobF90aWxlX2NvbXAtPnkxIC0gbF90aWxlX2NvbXAtPnkwKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobF90Y2NwLT5xbWZiaWQgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yICAgICAoaSA9IDA7IGkgPCBsX25iX2VsZW07ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbF9jdXJyZW50X3B0ciAtPSBsX3RjY3AtPm1fZGNfbGV2ZWxfc2hpZnQgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfY3VycmVudF9wdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxfbmJfZWxlbTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsX2N1cnJlbnRfcHRyID0gKCpsX2N1cnJlbnRfcHRyIC0gbF90Y2NwLT5tX2RjX2xldmVsX3NoaWZ0KSA8PCAxMSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X3B0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICArK2xfaW1nX2NvbXA7Ci0gICAgICAgICAgICAgICAgKytsX3RjY3A7Ci0gICAgICAgICAgICAgICAgKytsX3RpbGVfY29tcDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX0JPT0wgb3BqX3RjZF9tY3RfZW5jb2RlICggb3BqX3RjZF90ICpwX3RjZCApCi17Ci0gICAgICAgIG9wal90Y2RfdGlsZV90ICogbF90aWxlID0gcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXM7Ci0gICAgICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqIGxfdGlsZV9jb21wID0gcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPmNvbXBzOwotICAgICAgICBPUEpfVUlOVDMyIHNhbXBsZXMgPSAoT1BKX1VJTlQzMikoKGxfdGlsZV9jb21wLT54MSAtIGxfdGlsZV9jb21wLT54MCkgKiAobF90aWxlX2NvbXAtPnkxIC0gbF90aWxlX2NvbXAtPnkwKSk7Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgT1BKX0JZVEUgKiogbF9kYXRhID0gMDA7Ci0gICAgICAgIG9wal90Y3BfdCAqIGxfdGNwID0gcF90Y2QtPnRjcDsKLQotICAgICAgICBpZighcF90Y2QtPnRjcC0+bWN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBfdGNkLT50Y3AtPm1jdCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEgcF90Y2QtPnRjcC0+bV9tY3RfY29kaW5nX21hdHJpeCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICBsX2RhdGEgPSAoT1BKX0JZVEUgKiopIG9wal9tYWxsb2MobF90aWxlLT5udW1jb21wcypzaXplb2YoT1BKX0JZVEUqKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCEgbF9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoaT0wO2k8bF90aWxlLT5udW1jb21wczsrK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfZGF0YVtpXSA9IChPUEpfQllURSopIGxfdGlsZV9jb21wLT5kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgKytsX3RpbGVfY29tcDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoISBvcGpfbWN0X2VuY29kZV9jdXN0b20oLyogTUNUIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0JZVEUqKSBwX3RjZC0+dGNwLT5tX21jdF9jb2RpbmdfbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2YgY29tcG9uZW50cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29tcG9uZW50cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYiBvZiBjb21wb25lbnRzIChpLmUuIHNpemUgb2YgcERhdGEpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90aWxlLT5udW1jb21wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZWxscyBpZiB0aGUgZGF0YSBpcyBzaWduZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3RjZC0+aW1hZ2UtPmNvbXBzLT5zZ25kKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgb3BqX2ZyZWUobF9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9kYXRhKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChsX3RjcC0+dGNjcHMtPnFtZmJpZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgb3BqX21jdF9lbmNvZGVfcmVhbChsX3RpbGUtPmNvbXBzWzBdLmRhdGEsIGxfdGlsZS0+Y29tcHNbMV0uZGF0YSwgbF90aWxlLT5jb21wc1syXS5kYXRhLCBzYW1wbGVzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBvcGpfbWN0X2VuY29kZShsX3RpbGUtPmNvbXBzWzBdLmRhdGEsIGxfdGlsZS0+Y29tcHNbMV0uZGF0YSwgbF90aWxlLT5jb21wc1syXS5kYXRhLCBzYW1wbGVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX0JPT0wgb3BqX3RjZF9kd3RfZW5jb2RlICggb3BqX3RjZF90ICpwX3RjZCApCi17Ci0gICAgICAgIG9wal90Y2RfdGlsZV90ICogbF90aWxlID0gcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXM7Ci0gICAgICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqIGxfdGlsZV9jb21wID0gcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPmNvbXBzOwotICAgICAgICBvcGpfdGNjcF90ICogbF90Y2NwID0gcF90Y2QtPnRjcC0+dGNjcHM7Ci0gICAgICAgIE9QSl9VSU5UMzIgY29tcG5vOwotCi0gICAgICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgbF90aWxlLT5udW1jb21wczsgKytjb21wbm8pIHsKLSAgICAgICAgICAgICAgICBpZiAobF90Y2NwLT5xbWZiaWQgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgb3BqX2R3dF9lbmNvZGUobF90aWxlX2NvbXApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxfdGNjcC0+cW1mYmlkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG9wal9kd3RfZW5jb2RlX3JlYWwobF90aWxlX2NvbXApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgKytsX3RpbGVfY29tcDsKLSAgICAgICAgICAgICAgICArK2xfdGNjcDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotT1BKX0JPT0wgb3BqX3RjZF90MV9lbmNvZGUgKCBvcGpfdGNkX3QgKnBfdGNkICkKLXsKLSAgICAgICAgb3BqX3QxX3QgKiBsX3QxOwotICAgICAgICBjb25zdCBPUEpfRkxPQVQ2NCAqIGxfbWN0X25vcm1zOwotICAgICAgICBPUEpfVUlOVDMyIGxfbWN0X251bWNvbXBzID0gMFU7Ci0gICAgICAgIG9wal90Y3BfdCAqIGxfdGNwID0gcF90Y2QtPnRjcDsKLQotICAgICAgICBsX3QxID0gb3BqX3QxX2NyZWF0ZShPUEpfVFJVRSk7Ci0gICAgICAgIGlmIChsX3QxID09IDAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsX3RjcC0+bWN0ID09IDEpIHsKLSAgICAgICAgICAgICAgICBsX21jdF9udW1jb21wcyA9IDNVOwotICAgICAgICAgICAgICAgIC8qIGlycmV2ZXJzaWJsZSBlbmNvZGluZyAqLwotICAgICAgICAgICAgICAgIGlmIChsX3RjcC0+dGNjcHMtPnFtZmJpZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX21jdF9ub3JtcyA9IG9wal9tY3RfZ2V0X21jdF9ub3Jtc19yZWFsKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbF9tY3Rfbm9ybXMgPSBvcGpfbWN0X2dldF9tY3Rfbm9ybXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbF9tY3RfbnVtY29tcHMgPSBwX3RjZC0+aW1hZ2UtPm51bWNvbXBzOwotICAgICAgICAgICAgICAgIGxfbWN0X25vcm1zID0gKGNvbnN0IE9QSl9GTE9BVDY0ICopIChsX3RjcC0+bWN0X25vcm1zKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghIG9wal90MV9lbmNvZGVfY2Jsa3MobF90MSwgcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMgLCBsX3RjcCwgbF9tY3Rfbm9ybXMsIGxfbWN0X251bWNvbXBzKSkgewotICAgICAgICBvcGpfdDFfZGVzdHJveShsX3QxKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgb3BqX3QxX2Rlc3Ryb3kobF90MSk7Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi1PUEpfQk9PTCBvcGpfdGNkX3QyX2VuY29kZSAob3BqX3RjZF90ICpwX3RjZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kZXN0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X2Rlc3Rfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZm9fdCAqcF9jc3RyX2luZm8gKQotewotICAgICAgICBvcGpfdDJfdCAqIGxfdDI7Ci0KLSAgICAgICAgbF90MiA9IG9wal90Ml9jcmVhdGUocF90Y2QtPmltYWdlLCBwX3RjZC0+Y3ApOwotICAgICAgICBpZiAobF90MiA9PSAwMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoISBvcGpfdDJfZW5jb2RlX3BhY2tldHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3RjZC0+dGNkX3RpbGVubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3RjZC0+dGNkX2ltYWdlLT50aWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3RjZC0+dGNwLT5udW1sYXllcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kZXN0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhX3dyaXR0ZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYXhfZGVzdF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdGNkLT50cF9udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90Y2QtPnRwX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3RjZC0+Y3VyX3Bpbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklOQUxfUEFTUykpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBvcGpfdDJfZGVzdHJveShsX3QyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgb3BqX3QyX2Rlc3Ryb3kobF90Mik7Ci0KLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS1DTEVBTi0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLQotT1BKX0JPT0wgb3BqX3RjZF9yYXRlX2FsbG9jYXRlX2VuY29kZSggIG9wal90Y2RfdCAqcF90Y2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2Rlc3RfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X2Rlc3Rfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmZvX3QgKnBfY3N0cl9pbmZvICkKLXsKLSAgICAgICAgb3BqX2NwX3QgKiBsX2NwID0gcF90Y2QtPmNwOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfd3JpdHRlbiA9IDA7Ci0KLSAgICAgICAgaWYgKHBfY3N0cl9pbmZvKSAgewotICAgICAgICAgICAgICAgIHBfY3N0cl9pbmZvLT5pbmRleF93cml0ZSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobF9jcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX2Rpc3RvX2FsbG9jfHwgbF9jcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX2ZpeGVkX3F1YWxpdHkpICB7Ci0gICAgICAgICAgICAgICAgLyogZml4ZWRfcXVhbGl0eSAqLwotICAgICAgICAgICAgICAgIC8qIE5vcm1hbCBSYXRlL2Rpc3RvcnRpb24gYWxsb2NhdGlvbiAqLwotICAgICAgICAgICAgICAgIGlmICghIG9wal90Y2RfcmF0ZWFsbG9jYXRlKHBfdGNkLCBwX2Rlc3RfZGF0YSwmbF9uYl93cml0dGVuLCBwX21heF9kZXN0X3NpemUsIHBfY3N0cl9pbmZvKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLyogRml4ZWQgbGF5ZXIgYWxsb2NhdGlvbiAqLwotICAgICAgICAgICAgICAgIG9wal90Y2RfcmF0ZWFsbG9jYXRlX2ZpeGVkKHBfdGNkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotCi1PUEpfQk9PTCBvcGpfdGNkX2NvcHlfdGlsZV9kYXRhICggICAgICAgb3BqX3RjZF90ICpwX3RjZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX3NyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3NyY19sZW5ndGggKQotewotICAgICAgICBPUEpfVUlOVDMyIGksaixsX2RhdGFfc2l6ZSA9IDA7Ci0gICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wID0gMDA7Ci0gICAgICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqIGxfdGlsZWMgPSAwMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3NpemVfY29tcCwgbF9yZW1haW5pbmc7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl9lbGVtOwotCi0gICAgICAgIGxfZGF0YV9zaXplID0gb3BqX3RjZF9nZXRfZW5jb2RlZF90aWxlX3NpemUocF90Y2QpOwotICAgICAgICBpZiAobF9kYXRhX3NpemUgIT0gcF9zcmNfbGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIGxfdGlsZWMgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+Y29tcHM7Ci0gICAgICAgIGxfaW1nX2NvbXAgPSBwX3RjZC0+aW1hZ2UtPmNvbXBzOwotICAgICAgICBmb3IgKGk9MDtpPHBfdGNkLT5pbWFnZS0+bnVtY29tcHM7KytpKSB7Ci0gICAgICAgICAgICAgICAgbF9zaXplX2NvbXAgPSBsX2ltZ19jb21wLT5wcmVjID4+IDM7IC8qKC8gOCkqLwotICAgICAgICAgICAgICAgIGxfcmVtYWluaW5nID0gbF9pbWdfY29tcC0+cHJlYyAmIDc7ICAvKiAoJTgpICovCi0gICAgICAgICAgICAgICAgbF9uYl9lbGVtID0gKE9QSl9VSU5UMzIpKChsX3RpbGVjLT54MSAtIGxfdGlsZWMtPngwKSAqIChsX3RpbGVjLT55MSAtIGxfdGlsZWMtPnkwKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobF9yZW1haW5pbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICsrbF9zaXplX2NvbXA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGxfc2l6ZV9jb21wID09IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfc2l6ZV9jb21wID0gNDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGxfc2l6ZV9jb21wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQ0hBUiAqIGxfc3JjX3B0ciA9IChPUEpfQ0hBUiAqKSBwX3NyYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBsX2Rlc3RfcHRyID0gbF90aWxlYy0+ZGF0YTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2ltZ19jb21wLT5zZ25kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfbmJfZWxlbTsrK2opIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKE9QSl9JTlQzMikgKCoobF9zcmNfcHRyKyspKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfbmJfZWxlbTsrK2opIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKCoobF9zcmNfcHRyKyspKSYweGZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc3JjID0gKE9QSl9CWVRFKikgbF9zcmNfcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogbF9kZXN0X3B0ciA9IGxfdGlsZWMtPmRhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDE2ICogbF9zcmNfcHRyID0gKE9QSl9JTlQxNiAqKSBwX3NyYzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2ltZ19jb21wLT5zZ25kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfbmJfZWxlbTsrK2opIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKE9QSl9JTlQzMikgKCoobF9zcmNfcHRyKyspKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfbmJfZWxlbTsrK2opIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKCoobF9zcmNfcHRyKyspKSYweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zcmMgPSAoT1BKX0JZVEUqKSBsX3NyY19wdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBsX3NyY19wdHIgPSAoT1BKX0lOVDMyICopIHBfc3JjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIGxfZGVzdF9wdHIgPSBsX3RpbGVjLT5kYXRhOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7ajxsX25iX2VsZW07KytqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGxfZGVzdF9wdHIrKykgPSAoT1BKX0lOVDMyKSAoKihsX3NyY19wdHIrKykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc3JjID0gKE9QSl9CWVRFKikgbF9zcmNfcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICsrbF9pbWdfY29tcDsKLSAgICAgICAgICAgICAgICArK2xfdGlsZWM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvdGNkLmggYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvdGNkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZWYwZmUuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL3RjZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzY1ICswLDAgQEAKLS8qCi0gKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKLSAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKLSAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKLSAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgVW5pdmVyc2l0ZSBjYXRob2xpcXVlIGRlIExvdXZhaW4gKFVDTCksIEJlbGdpdW0KLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBQcm9mZXNzb3IgQmVub2l0IE1hY3EKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzLCBEYXZpZCBKYW5zc2VucwotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIFlhbm5pY2sgVmVyc2NodWVyZW4KLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eCAKLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE0LCBBbnRvbmluIERlc2NhbXBlCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMS0yMDEyLCBDZW50cmUgTmF0aW9uYWwgZCdFdHVkZXMgU3BhdGlhbGVzIChDTkVTKSwgRlIgCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENTIFN5c3RlbWVzIGQnSW5mb3JtYXRpb24sIEZyYW5jZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCi0gKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotI2lmbmRlZiBfX1RDRF9ICi0jZGVmaW5lIF9fVENEX0gKLS8qKgotQGZpbGUgdGNkLmgKLUBicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBhIHRpbGUgY29kZXIvZGVjb2RlciAoVENEKQotCi1UaGUgZnVuY3Rpb25zIGluIFRDRC5DIGVuY29kZSBvciBkZWNvZGUgZWFjaCB0aWxlIGluZGVwZW5kZW50bHkgZnJvbQotZWFjaCBvdGhlci4gVGhlIGZ1bmN0aW9ucyBpbiBUQ0QuQyBhcmUgdXNlZCBieSBvdGhlciBmdW5jdGlvbnMgaW4gSjJLLkMuCi0qLwotCi0vKiogQGRlZmdyb3VwIFRDRCBUQ0QgLSBJbXBsZW1lbnRhdGlvbiBvZiBhIHRpbGUgY29kZXIvZGVjb2RlciAqLwotLypAeyovCi0KLS8qKgotRklYTUUgRE9DCi0qLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX3RjZF9zZWcgewotCU9QSl9CWVRFICoqIGRhdGE7Ci0JT1BKX1VJTlQzMiBkYXRhaW5kZXg7Ci0JT1BKX1VJTlQzMiBudW1wYXNzZXM7Ci0JT1BKX1VJTlQzMiByZWFsX251bV9wYXNzZXM7Ci0JT1BKX1VJTlQzMiBsZW47Ci0JT1BKX1VJTlQzMiBtYXhwYXNzZXM7Ci0JT1BKX1VJTlQzMiBudW1uZXdwYXNzZXM7Ci0JT1BKX1VJTlQzMiBuZXdsZW47Ci19IG9wal90Y2Rfc2VnX3Q7Ci0KLS8qKgotRklYTUUgRE9DCi0qLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX3RjZF9wYXNzIHsKLQlPUEpfVUlOVDMyIHJhdGU7Ci0JT1BKX0ZMT0FUNjQgZGlzdG9ydGlvbmRlYzsKLQlPUEpfVUlOVDMyIGxlbjsKLQlPUEpfVUlOVDMyIHRlcm0gOiAxOwotfSBvcGpfdGNkX3Bhc3NfdDsKLQotLyoqCi1GSVhNRSBET0MKLSovCi10eXBlZGVmIHN0cnVjdCBvcGpfdGNkX2xheWVyIHsKLQlPUEpfVUlOVDMyIG51bXBhc3NlczsJCS8qIE51bWJlciBvZiBwYXNzZXMgaW4gdGhlIGxheWVyICovCi0JT1BKX1VJTlQzMiBsZW47CQkJCS8qIGxlbiBvZiBpbmZvcm1hdGlvbiAqLwotCU9QSl9GTE9BVDY0IGRpc3RvOwkJCS8qIGFkZCBmb3IgaW5kZXggKENmci4gTWFyY2VsYSkgKi8KLQlPUEpfQllURSAqZGF0YTsJCQkJLyogZGF0YSAqLwotfSBvcGpfdGNkX2xheWVyX3Q7Ci0KLS8qKgotRklYTUUgRE9DCi0qLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX3RjZF9jYmxrX2VuYyB7Ci0JT1BKX0JZVEUqIGRhdGE7ICAgICAgICAgICAgICAgLyogRGF0YSAqLwotCW9wal90Y2RfbGF5ZXJfdCogbGF5ZXJzOyAgICAgIC8qIGxheWVyIGluZm9ybWF0aW9uICovCi0Jb3BqX3RjZF9wYXNzX3QqIHBhc3NlczsgICAgICAgLyogaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhc3NlcyAqLwotCU9QSl9JTlQzMiB4MCwgeTAsIHgxLCB5MTsgICAgIC8qIGRpbWVuc2lvbiBvZiB0aGUgY29kZS1ibG9ja3MgOiBsZWZ0IHVwcGVyIGNvcm5lciAoeDAsIHkwKSByaWdodCBsb3cgY29ybmVyICh4MSx5MSkgKi8KLQlPUEpfVUlOVDMyIG51bWJwczsKLQlPUEpfVUlOVDMyIG51bWxlbmJpdHM7Ci0JT1BKX1VJTlQzMiBkYXRhX3NpemU7ICAgICAgICAgLyogU2l6ZSBvZiBhbGxvY2F0ZWQgZGF0YSBidWZmZXIgKi8KLQlPUEpfVUlOVDMyIG51bXBhc3NlczsgICAgICAgICAvKiBudW1iZXIgb2YgcGFzcyBhbHJlYWR5IGRvbmUgZm9yIHRoZSBjb2RlLWJsb2NrcyAqLwotCU9QSl9VSU5UMzIgbnVtcGFzc2VzaW5sYXllcnM7IC8qIG51bWJlciBvZiBwYXNzZXMgaW4gdGhlIGxheWVyICovCi0JT1BKX1VJTlQzMiB0b3RhbHBhc3NlczsJICAgICAgLyogdG90YWwgbnVtYmVyIG9mIHBhc3NlcyAqLwotfSBvcGpfdGNkX2NibGtfZW5jX3Q7Ci0KLQotdHlwZWRlZiBzdHJ1Y3Qgb3BqX3RjZF9jYmxrX2RlYyB7Ci0JT1BKX0JZVEUgKiBkYXRhOwkJCQkvKiBEYXRhICovCi0Jb3BqX3RjZF9zZWdfdCogc2VnczsJCQkvKiBzZWdtZW50cyBpbmZvcm1hdGlvbiAqLwotCU9QSl9JTlQzMiB4MCwgeTAsIHgxLCB5MTsJCS8qIHBvc2l0aW9uIG9mIHRoZSBjb2RlLWJsb2NrcyA6IGxlZnQgdXBwZXIgY29ybmVyICh4MCwgeTApIHJpZ2h0IGxvdyBjb3JuZXIgKHgxLHkxKSAqLwotCU9QSl9VSU5UMzIgbnVtYnBzOwotCU9QSl9VSU5UMzIgbnVtbGVuYml0czsKLQlPUEpfVUlOVDMyIGRhdGFfbWF4X3NpemU7CQkvKiBTaXplIG9mIGFsbG9jYXRlZCBkYXRhIGJ1ZmZlciAqLwotCU9QSl9VSU5UMzIgZGF0YV9jdXJyZW50X3NpemU7CS8qIFNpemUgb2YgdXNlZCBkYXRhIGJ1ZmZlciAqLwotCU9QSl9VSU5UMzIgbnVtbmV3cGFzc2VzOwkJLyogbnVtYmVyIG9mIHBhc3MgYWRkZWQgdG8gdGhlIGNvZGUtYmxvY2tzICovCi0JT1BKX1VJTlQzMiBudW1zZWdzOwkJCQkvKiBudW1iZXIgb2Ygc2VnbWVudHMgKi8KLQlPUEpfVUlOVDMyIHJlYWxfbnVtX3NlZ3M7Ci0JT1BKX1VJTlQzMiBtX2N1cnJlbnRfbWF4X3NlZ3M7Ci19IG9wal90Y2RfY2Jsa19kZWNfdDsKLQotLyoqCi1GSVhNRSBET0MKLSovCi10eXBlZGVmIHN0cnVjdCBvcGpfdGNkX3ByZWNpbmN0IHsKLQlPUEpfSU5UMzIgeDAsIHkwLCB4MSwgeTE7CQkvKiBkaW1lbnNpb24gb2YgdGhlIHByZWNpbmN0IDogbGVmdCB1cHBlciBjb3JuZXIgKHgwLCB5MCkgcmlnaHQgbG93IGNvcm5lciAoeDEseTEpICovCi0JT1BKX1VJTlQzMiBjdywgY2g7CQkJCS8qIG51bWJlciBvZiBwcmVjaW5jdCBpbiB3aWR0aCBhbmQgaGVpZ2h0ICovCi0JdW5pb257CQkJCQkJCS8qIGNvZGUtYmxvY2tzIGluZm9ybWF0aW9uICovCi0JCW9wal90Y2RfY2Jsa19lbmNfdCogZW5jOwotCQlvcGpfdGNkX2NibGtfZGVjX3QqIGRlYzsKLQkJdm9pZCogICAgICAgICAgICAgICBibG9ja3M7Ci0JfSBjYmxrczsKLQlPUEpfVUlOVDMyIGJsb2NrX3NpemU7CQkJLyogc2l6ZSB0YWtlbiBieSBjYmxrcyAoaW4gYnl0ZXMpICovCi0Jb3BqX3RndF90cmVlX3QgKmluY2x0cmVlOwkgICAgLyogaW5jbHVzaW9uIHRyZWUgKi8KLQlvcGpfdGd0X3RyZWVfdCAqaW1zYnRyZWU7CSAgICAvKiBJTVNCIHRyZWUgKi8KLX0gb3BqX3RjZF9wcmVjaW5jdF90OwotCi0vKioKLUZJWE1FIERPQwotKi8KLXR5cGVkZWYgc3RydWN0IG9wal90Y2RfYmFuZCB7Ci0JT1BKX0lOVDMyIHgwLCB5MCwgeDEsIHkxOwkJLyogZGltZW5zaW9uIG9mIHRoZSBzdWJiYW5kIDogbGVmdCB1cHBlciBjb3JuZXIgKHgwLCB5MCkgcmlnaHQgbG93IGNvcm5lciAoeDEseTEpICovCi0JT1BKX1VJTlQzMiBiYW5kbm87Ci0Jb3BqX3RjZF9wcmVjaW5jdF90ICpwcmVjaW5jdHM7CS8qIHByZWNpbmN0IGluZm9ybWF0aW9uICovCi0JT1BKX1VJTlQzMiBwcmVjaW5jdHNfZGF0YV9zaXplOwkvKiBzaXplIG9mIGRhdGEgdGFrZW4gYnkgcHJlY2luY3RzICovCi0JT1BKX0lOVDMyIG51bWJwczsKLQlPUEpfRkxPQVQzMiBzdGVwc2l6ZTsKLX0gb3BqX3RjZF9iYW5kX3Q7Ci0KLS8qKgotRklYTUUgRE9DCi0qLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX3RjZF9yZXNvbHV0aW9uIHsKLQlPUEpfSU5UMzIgeDAsIHkwLCB4MSwgeTE7CQkvKiBkaW1lbnNpb24gb2YgdGhlIHJlc29sdXRpb24gbGV2ZWwgOiBsZWZ0IHVwcGVyIGNvcm5lciAoeDAsIHkwKSByaWdodCBsb3cgY29ybmVyICh4MSx5MSkgKi8KLQlPUEpfVUlOVDMyIHB3LCBwaDsKLQlPUEpfVUlOVDMyIG51bWJhbmRzOwkJCS8qIG51bWJlciBzdWItYmFuZCBmb3IgdGhlIHJlc29sdXRpb24gbGV2ZWwgKi8KLQlvcGpfdGNkX2JhbmRfdCBiYW5kc1szXTsJCS8qIHN1YmJhbmQgaW5mb3JtYXRpb24gKi8KLX0gb3BqX3RjZF9yZXNvbHV0aW9uX3Q7Ci0KLS8qKgotRklYTUUgRE9DCi0qLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX3RjZF90aWxlY29tcAotewotCU9QSl9JTlQzMiB4MCwgeTAsIHgxLCB5MTsgICAgICAgICAgIC8qIGRpbWVuc2lvbiBvZiBjb21wb25lbnQgOiBsZWZ0IHVwcGVyIGNvcm5lciAoeDAsIHkwKSByaWdodCBsb3cgY29ybmVyICh4MSx5MSkgKi8KLQlPUEpfVUlOVDMyIG51bXJlc29sdXRpb25zOyAgICAgICAgICAvKiBudW1iZXIgb2YgcmVzb2x1dGlvbnMgbGV2ZWwgKi8KLQlPUEpfVUlOVDMyIG1pbmltdW1fbnVtX3Jlc29sdXRpb25zOyAvKiBudW1iZXIgb2YgcmVzb2x1dGlvbnMgbGV2ZWwgdG8gZGVjb2RlIChhdCBtYXgpKi8KLQlvcGpfdGNkX3Jlc29sdXRpb25fdCAqcmVzb2x1dGlvbnM7ICAvKiByZXNvbHV0aW9ucyBpbmZvcm1hdGlvbiAqLwotCU9QSl9VSU5UMzIgcmVzb2x1dGlvbnNfc2l6ZTsgICAgICAgIC8qIHNpemUgb2YgZGF0YSBmb3IgcmVzb2x1dGlvbnMgKGluIGJ5dGVzKSAqLwotCU9QSl9JTlQzMiAqZGF0YTsgICAgICAgICAgICAgICAgICAgIC8qIGRhdGEgb2YgdGhlIGNvbXBvbmVudCAqLwotCU9QSl9CT09MICBvd25zRGF0YTsgICAgICAgICAgICAgICAgIC8qIGlmIHRydWUsIHRoZW4gbmVlZCB0byBmcmVlIGFmdGVyIHVzYWdlLCBvdGhlcndpc2UgZG8gbm90IGZyZWUgKi8KLQlPUEpfVUlOVDMyIGRhdGFfc2l6ZV9uZWVkZWQ7ICAgICAgICAvKiB3ZSBtYXkgZWl0aGVyIG5lZWQgdG8gYWxsb2NhdGUgdGhpcyBhbW91bnQgb2YgZGF0YSwgb3IgcmUtdXNlIGltYWdlIGRhdGEgYW5kIGlnbm9yZSB0aGlzIHZhbHVlICovCi0JT1BKX1VJTlQzMiBkYXRhX3NpemU7ICAgICAgICAgICAgICAgLyogc2l6ZSBvZiB0aGUgZGF0YSBvZiB0aGUgY29tcG9uZW50ICovCi0JT1BKX0lOVDMyIG51bXBpeDsgICAgICAgICAgICAgICAgICAgLyogYWRkIGZpeGVkX3F1YWxpdHkgKi8KLX0gb3BqX3RjZF90aWxlY29tcF90OwotCi0KLS8qKgotRklYTUUgRE9DCi0qLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX3RjZF90aWxlIHsKLQlPUEpfSU5UMzIgeDAsIHkwLCB4MSwgeTE7CQkvKiBkaW1lbnNpb24gb2YgdGhlIHRpbGUgOiBsZWZ0IHVwcGVyIGNvcm5lciAoeDAsIHkwKSByaWdodCBsb3cgY29ybmVyICh4MSx5MSkgKi8KLQlPUEpfVUlOVDMyIG51bWNvbXBzOwkJCS8qIG51bWJlciBvZiBjb21wb25lbnRzIGluIHRpbGUgKi8KLQlvcGpfdGNkX3RpbGVjb21wX3QgKmNvbXBzOwkvKiBDb21wb25lbnRzIGluZm9ybWF0aW9uICovCi0JT1BKX0lOVDMyIG51bXBpeDsJCQkJLyogYWRkIGZpeGVkX3F1YWxpdHkgKi8KLQlPUEpfRkxPQVQ2NCBkaXN0b3RpbGU7CQkJLyogYWRkIGZpeGVkX3F1YWxpdHkgKi8KLQlPUEpfRkxPQVQ2NCBkaXN0b2xheWVyWzEwMF07CS8qIGFkZCBmaXhlZF9xdWFsaXR5ICovCi0JT1BKX1VJTlQzMiBwYWNrbm87ICAgICAgICAgICAgICAvKiBwYWNrZXQgbnVtYmVyICovCi19IG9wal90Y2RfdGlsZV90OwotCi0vKioKLUZJWE1FIERPQwotKi8KLXR5cGVkZWYgc3RydWN0IG9wal90Y2RfaW1hZ2UKLXsKLQlvcGpfdGNkX3RpbGVfdCAqdGlsZXM7CQkvKiBUaWxlcyBpbmZvcm1hdGlvbiAqLwotfQotb3BqX3RjZF9pbWFnZV90OwotCi0KLS8qKgotVGlsZSBjb2Rlci9kZWNvZGVyCi0qLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX3RjZAotewotCS8qKiBQb3NpdGlvbiBvZiB0aGUgdGlsZXBhcnQgZmxhZyBpbiBQcm9ncmVzc2lvbiBvcmRlciovCi0JT1BKX0lOVDMyIHRwX3BvczsKLQkvKiogVGlsZSBwYXJ0IG51bWJlciovCi0JT1BKX1VJTlQzMiB0cF9udW07Ci0JLyoqIEN1cnJlbnQgdGlsZSBwYXJ0IG51bWJlciovCi0JT1BKX1VJTlQzMiBjdXJfdHBfbnVtOwotCS8qKiBUb3RhbCBudW1iZXIgb2YgdGlsZXBhcnRzIG9mIHRoZSBjdXJyZW50IHRpbGUqLwotCU9QSl9VSU5UMzIgY3VyX3RvdG51bV90cDsKLQkvKiogQ3VycmVudCBQYWNrZXQgaXRlcmF0b3IgbnVtYmVyICovCi0JT1BKX1VJTlQzMiBjdXJfcGlubzsKLQkvKiogaW5mbyBvbiBlYWNoIGltYWdlIHRpbGUgKi8KLQlvcGpfdGNkX2ltYWdlX3QgKnRjZF9pbWFnZTsKLQkvKiogaW1hZ2UgaGVhZGVyICovCi0Jb3BqX2ltYWdlX3QgKmltYWdlOwotCS8qKiBjb2RpbmcgcGFyYW1ldGVycyAqLwotCW9wal9jcF90ICpjcDsKLQkvKiogY29kaW5nL2RlY29kaW5nIHBhcmFtZXRlcnMgY29tbW9uIHRvIGFsbCB0aWxlcyAqLwotCW9wal90Y3BfdCAqdGNwOwotCS8qKiBjdXJyZW50IGVuY29kZWQvZGVjb2RlZCB0aWxlICovCi0JT1BKX1VJTlQzMiB0Y2RfdGlsZW5vOwotCS8qKiB0ZWxsIGlmIHRoZSB0Y2QgaXMgYSBkZWNvZGVyLiAqLwotCU9QSl9VSU5UMzIgbV9pc19kZWNvZGVyIDogMTsKLX0gb3BqX3RjZF90OwotCi0vKiogQG5hbWUgRXhwb3J0ZWQgZnVuY3Rpb25zICovCi0vKkB7Ki8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qKgotRHVtcCB0aGUgY29udGVudCBvZiBhIHRjZCBzdHJ1Y3R1cmUKLSovCi0vKnZvaWQgdGNkX2R1bXAoRklMRSAqZmQsIG9wal90Y2RfdCAqdGNkLCBvcGpfdGNkX2ltYWdlX3QgKmltZyk7Ki8gLyogVE9ETyBNU0Qgc2hvdWwgdXNlIHRoZSBuZXcgdjIgc3RydWN0dXJlcyAqLyAKLQotLyoqCi1DcmVhdGUgYSBuZXcgVENEIGhhbmRsZQotQHBhcmFtIHBfaXNfZGVjb2RlciBGSVhNRSBET0MKLUByZXR1cm4gUmV0dXJucyBhIG5ldyBUQ0QgaGFuZGxlIGlmIHN1Y2Nlc3NmdWwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQotKi8KLW9wal90Y2RfdCogb3BqX3RjZF9jcmVhdGUoT1BKX0JPT0wgcF9pc19kZWNvZGVyKTsKLQotLyoqCi1EZXN0cm95IGEgcHJldmlvdXNseSBjcmVhdGVkIFRDRCBoYW5kbGUKLUBwYXJhbSB0Y2QgVENEIGhhbmRsZSB0byBkZXN0cm95Ci0qLwotdm9pZCBvcGpfdGNkX2Rlc3Ryb3kob3BqX3RjZF90ICp0Y2QpOwotCi0vKioKLSAqIEluaXRpYWxpemUgdGhlIHRpbGUgY29kZXIgYW5kIG1heSByZXVzZSBzb21lIG1lbW9yeS4KLSAqIEBwYXJhbQlwX3RjZAkJVENEIGhhbmRsZS4KLSAqIEBwYXJhbQlwX2ltYWdlCQlyYXcgaW1hZ2UuCi0gKiBAcGFyYW0JcF9jcAkJY29kaW5nIHBhcmFtZXRlcnMuCi0gKgotICogQHJldHVybiB0cnVlIGlmIHRoZSBlbmNvZGluZyB2YWx1ZXMgY291bGQgYmUgc2V0IChmYWxzZSBvdGhlcndpc2UpLgotKi8KLU9QSl9CT09MIG9wal90Y2RfaW5pdCgJb3BqX3RjZF90ICpwX3RjZCwKLQkJCQkJCW9wal9pbWFnZV90ICogcF9pbWFnZSwKLQkJCQkJCW9wal9jcF90ICogcF9jcCApOwotCi0vKioKLSAqIEFsbG9jYXRlcyBtZW1vcnkgZm9yIGRlY29kaW5nIGEgc3BlY2lmaWMgdGlsZS4KLSAqCi0gKiBAcGFyYW0JcF90Y2QJCXRoZSB0aWxlIGRlY29kZXIuCi0gKiBAcGFyYW0JcF90aWxlX25vCXRoZSBpbmRleCBvZiB0aGUgdGlsZSByZWNlaXZlZCBpbiBzZXF1ZW5jZS4gVGhpcyBub3QgbmVjZXNzYXJpbHkgbGVhZCB0byB0aGUKLSAqIHRpbGUgYXQgaW5kZXggcF90aWxlX25vLgotICoKLSAqIEByZXR1cm4JdHJ1ZSBpZiB0aGUgcmVtYWluaW5nIGRhdGEgaXMgc3VmZmljaWVudC4KLSAqLwotT1BKX0JPT0wgb3BqX3RjZF9pbml0X2RlY29kZV90aWxlKG9wal90Y2RfdCAqcF90Y2QsIE9QSl9VSU5UMzIgcF90aWxlX25vKTsKLQotdm9pZCBvcGpfdGNkX21ha2VsYXllcl9maXhlZChvcGpfdGNkX3QgKnRjZCwgT1BKX1VJTlQzMiBsYXlubywgT1BKX1VJTlQzMiBmaW5hbCk7Ci0KLXZvaWQgb3BqX3RjZF9yYXRlYWxsb2NhdGVfZml4ZWQob3BqX3RjZF90ICp0Y2QpOwotCi12b2lkIG9wal90Y2RfbWFrZWxheWVyKAlvcGpfdGNkX3QgKnRjZCwKLQkJCQkJCU9QSl9VSU5UMzIgbGF5bm8sCi0JCQkJCQlPUEpfRkxPQVQ2NCB0aHJlc2gsCi0JCQkJCQlPUEpfVUlOVDMyIGZpbmFsKTsKLQotT1BKX0JPT0wgb3BqX3RjZF9yYXRlYWxsb2NhdGUoCW9wal90Y2RfdCAqdGNkLAotCQkJCQkJCQlPUEpfQllURSAqZGVzdCwKLQkJCQkJCQkJT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAotCQkJCQkJCQlPUEpfVUlOVDMyIGxlbiwKLQkJCQkJCQkJb3BqX2NvZGVzdHJlYW1faW5mb190ICpjc3RyX2luZm8pOwotCi0vKioKLSAqIEdldHMgdGhlIG1heGltdW0gdGlsZSBzaXplIHRoYXQgd2lsbCBiZSB0YWtlbiBieSB0aGUgdGlsZSBvbmNlIGRlY29kZWQuCi0gKi8KLU9QSl9VSU5UMzIgb3BqX3RjZF9nZXRfZGVjb2RlZF90aWxlX3NpemUgKG9wal90Y2RfdCAqcF90Y2QgKTsKLQotLyoqCi0gKiBFbmNvZGVzIGEgdGlsZSBmcm9tIHRoZSByYXcgaW1hZ2UgaW50byB0aGUgZ2l2ZW4gYnVmZmVyLgotICogQHBhcmFtCXBfdGNkCQkJVGlsZSBDb2RlciBoYW5kbGUKLSAqIEBwYXJhbQlwX3RpbGVfbm8JCUluZGV4IG9mIHRoZSB0aWxlIHRvIGVuY29kZS4KLSAqIEBwYXJhbQlwX2Rlc3QJCQlEZXN0aW5hdGlvbiBidWZmZXIKLSAqIEBwYXJhbQlwX2RhdGFfd3JpdHRlbglwb2ludGVyIHRvIGFuIGludCB0aGF0IGlzIGluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhbGx5IHdyaXR0ZW4gb24gcF9kZXN0Ci0gKiBAcGFyYW0JcF9sZW4JCQlNYXhpbXVtIGxlbmd0aCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKiBAcGFyYW0JcF9jc3RyX2luZm8JCUNvZGVzdHJlYW0gaW5mb3JtYXRpb24gc3RydWN0dXJlCi0gKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjb2RpbmcgaXMgc3VjY2Vzc2Z1bGwuCi0qLwotT1BKX0JPT0wgb3BqX3RjZF9lbmNvZGVfdGlsZSggICBvcGpfdGNkX3QgKnBfdGNkLAotCQkJCQkJCSAgICBPUEpfVUlOVDMyIHBfdGlsZV9ubywKLQkJCQkJCQkgICAgT1BKX0JZVEUgKnBfZGVzdCwKLQkJCQkJCQkgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAotCQkJCQkJCSAgICBPUEpfVUlOVDMyIHBfbGVuLAotCQkJCQkJCSAgICBzdHJ1Y3Qgb3BqX2NvZGVzdHJlYW1faW5mbyAqcF9jc3RyX2luZm8pOwotCi0KLS8qKgotRGVjb2RlIGEgdGlsZSBmcm9tIGEgYnVmZmVyIGludG8gYSByYXcgaW1hZ2UKLUBwYXJhbSB0Y2QgVENEIGhhbmRsZQotQHBhcmFtIHNyYyBTb3VyY2UgYnVmZmVyCi1AcGFyYW0gbGVuIExlbmd0aCBvZiBzb3VyY2UgYnVmZmVyCi1AcGFyYW0gdGlsZW5vIE51bWJlciB0aGF0IGlkZW50aWZpZXMgb25lIG9mIHRoZSB0aWxlcyB0byBiZSBkZWNvZGVkCi1AcGFyYW0gY3N0cl9pbmZvICBGSVhNRSBET0MKLSovCi1PUEpfQk9PTCBvcGpfdGNkX2RlY29kZV90aWxlKCAgIG9wal90Y2RfdCAqdGNkLAotCQkJCQkJCSAgICBPUEpfQllURSAqc3JjLAotCQkJCQkJCSAgICBPUEpfVUlOVDMyIGxlbiwKLQkJCQkJCQkgICAgT1BKX1VJTlQzMiB0aWxlbm8sCi0JCQkJCQkJICAgIG9wal9jb2Rlc3RyZWFtX2luZGV4X3QgKmNzdHJfaW5mbyk7Ci0KLQotLyoqCi0gKiBDb3BpZXMgdGlsZSBkYXRhIGZyb20gdGhlIHN5c3RlbSBvbnRvIHRoZSBnaXZlbiBtZW1vcnkgYmxvY2suCi0gKi8KLU9QSl9CT09MIG9wal90Y2RfdXBkYXRlX3RpbGVfZGF0YSAoCW9wal90Y2RfdCAqcF90Y2QsCi0JCQkJCQkJCSAgICBPUEpfQllURSAqIHBfZGVzdCwKLQkJCQkJCQkJICAgIE9QSl9VSU5UMzIgcF9kZXN0X2xlbmd0aCApOwotCi0vKioKLSAqCi0gKi8KLU9QSl9VSU5UMzIgb3BqX3RjZF9nZXRfZW5jb2RlZF90aWxlX3NpemUgKCBvcGpfdGNkX3QgKnBfdGNkICk7Ci0KLS8qKgotICogSW5pdGlhbGl6ZSB0aGUgdGlsZSBjb2RlciBhbmQgbWF5IHJldXNlIHNvbWUgbWVvcnkuCi0gKgotICogQHBhcmFtCXBfdGNkCQlUQ0QgaGFuZGxlLgotICogQHBhcmFtCXBfdGlsZV9ubwljdXJyZW50IHRpbGUgaW5kZXggdG8gZW5jb2RlLgotICoKLSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZW5jb2RpbmcgdmFsdWVzIGNvdWxkIGJlIHNldCAoZmFsc2Ugb3RoZXJ3aXNlKS4KLSovCi1PUEpfQk9PTCBvcGpfdGNkX2luaXRfZW5jb2RlX3RpbGUgKAlvcGpfdGNkX3QgKnBfdGNkLAotCQkJCQkJCQkgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8gKTsKLQotLyoqCi0gKiBDb3BpZXMgdGlsZSBkYXRhIGZyb20gdGhlIGdpdmVuIG1lbW9yeSBibG9jayBvbnRvIHRoZSBzeXN0ZW0uCi0gKi8KLU9QSl9CT09MIG9wal90Y2RfY29weV90aWxlX2RhdGEgKG9wal90Y2RfdCAqcF90Y2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3NyY19sZW5ndGggKTsKLQotLyoqCi0gKiBBbGxvY2F0ZXMgdGlsZSBjb21wb25lbnQgZGF0YQotICoKLSAqCi0gKi8KLU9QSl9CT09MIG9wal9hbGxvY190aWxlX2NvbXBvbmVudF9kYXRhKG9wal90Y2RfdGlsZWNvbXBfdCAqbF90aWxlYyk7Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKkB9Ki8KLQotLypAfSovCi0KLSNlbmRpZiAvKiBfX1RDRF9IICovCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvdGd0LmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvdGd0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNDNjMDguLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL3RndC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8qCi0gKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKLSAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKLSAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKLSAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgVW5pdmVyc2l0ZSBjYXRob2xpcXVlIGRlIExvdXZhaW4gKFVDTCksIEJlbGdpdW0KLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBQcm9mZXNzb3IgQmVub2l0IE1hY3EKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzLCBEYXZpZCBKYW5zc2VucwotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIFlhbm5pY2sgVmVyc2NodWVyZW4KLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eCAKLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE0LCBBbnRvbmluIERlc2NhbXBlCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMS0yMDEyLCBDZW50cmUgTmF0aW9uYWwgZCdFdHVkZXMgU3BhdGlhbGVzIChDTkVTKSwgRlIgCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENTIFN5c3RlbWVzIGQnSW5mb3JtYXRpb24sIEZyYW5jZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCi0gKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAib3BqX2luY2x1ZGVzLmgiCi0KLS8qIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgVGFnLXRyZWUgY29kZXIgaW50ZXJmYWNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotCi1vcGpfdGd0X3RyZWVfdCAqb3BqX3RndF9jcmVhdGUoT1BKX1VJTlQzMiBudW1sZWFmc2gsIE9QSl9VSU5UMzIgbnVtbGVhZnN2KSB7Ci0gICAgICAgIE9QSl9JTlQzMiBucGxoWzMyXTsKLSAgICAgICAgT1BKX0lOVDMyIG5wbHZbMzJdOwotICAgICAgICBvcGpfdGd0X25vZGVfdCAqbm9kZSA9IDAwOwotICAgICAgICBvcGpfdGd0X25vZGVfdCAqbF9wYXJlbnRfbm9kZSA9IDAwOwotICAgICAgICBvcGpfdGd0X25vZGVfdCAqbF9wYXJlbnRfbm9kZTAgPSAwMDsKLSAgICAgICAgb3BqX3RndF90cmVlX3QgKnRyZWUgPSAwMDsKLSAgICAgICAgT1BKX1VJTlQzMiBpOwotICAgICAgICBPUEpfSU5UMzIgIGosazsKLSAgICAgICAgT1BKX1VJTlQzMiBudW1sdmxzOwotICAgICAgICBPUEpfVUlOVDMyIG47Ci0KLSAgICAgICAgdHJlZSA9IChvcGpfdGd0X3RyZWVfdCAqKSBvcGpfY2FsbG9jKDEsc2l6ZW9mKG9wal90Z3RfdHJlZV90KSk7Ci0gICAgICAgIGlmKCF0cmVlKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiBpbiB0Z3RfY3JlYXRlIHdoaWxlIGFsbG9jYXRpbmcgdHJlZVxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDAwOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJlZS0+bnVtbGVhZnNoID0gbnVtbGVhZnNoOwotICAgICAgICB0cmVlLT5udW1sZWFmc3YgPSBudW1sZWFmc3Y7Ci0KLSAgICAgICAgbnVtbHZscyA9IDA7Ci0gICAgICAgIG5wbGhbMF0gPSAoT1BKX0lOVDMyKW51bWxlYWZzaDsKLSAgICAgICAgbnBsdlswXSA9IChPUEpfSU5UMzIpbnVtbGVhZnN2OwotICAgICAgICB0cmVlLT5udW1ub2RlcyA9IDA7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBuID0gKE9QSl9VSU5UMzIpKG5wbGhbbnVtbHZsc10gKiBucGx2W251bWx2bHNdKTsKLSAgICAgICAgICAgICAgICBucGxoW251bWx2bHMgKyAxXSA9IChucGxoW251bWx2bHNdICsgMSkgLyAyOwotICAgICAgICAgICAgICAgIG5wbHZbbnVtbHZscyArIDFdID0gKG5wbHZbbnVtbHZsc10gKyAxKSAvIDI7Ci0gICAgICAgICAgICAgICAgdHJlZS0+bnVtbm9kZXMgKz0gbjsKLSAgICAgICAgICAgICAgICArK251bWx2bHM7Ci0gICAgICAgIH0gd2hpbGUgKG4gPiAxKTsKLQotICAgICAgICAvKiBBREQgKi8KLSAgICAgICAgaWYgKHRyZWUtPm51bW5vZGVzID09IDApIHsKLSAgICAgICAgICAgICAgICBvcGpfZnJlZSh0cmVlKTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkcgaW4gdGd0X2NyZWF0ZSB0cmVlLT5udW1ub2RlcyA9PSAwLCBubyB0cmVlIGNyZWF0ZWQuXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDA7Ci0gICAgICAgIH0KLQotICAgICAgICB0cmVlLT5ub2RlcyA9IChvcGpfdGd0X25vZGVfdCopIG9wal9jYWxsb2ModHJlZS0+bnVtbm9kZXMsIHNpemVvZihvcGpfdGd0X25vZGVfdCkpOwotICAgICAgICBpZighdHJlZS0+bm9kZXMpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIGluIHRndF9jcmVhdGUgd2hpbGUgYWxsb2NhdGluZyBub2RlIG9mIHRoZSB0cmVlXG4iKTsKLSAgICAgICAgICAgICAgICBvcGpfZnJlZSh0cmVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDA7Ci0gICAgICAgIH0KLSAgICAgICAgdHJlZS0+bm9kZXNfc2l6ZSA9IHRyZWUtPm51bW5vZGVzICogKE9QSl9VSU5UMzIpc2l6ZW9mKG9wal90Z3Rfbm9kZV90KTsKLQotICAgICAgICBub2RlID0gdHJlZS0+bm9kZXM7Ci0gICAgICAgIGxfcGFyZW50X25vZGUgPSAmdHJlZS0+bm9kZXNbdHJlZS0+bnVtbGVhZnNoICogdHJlZS0+bnVtbGVhZnN2XTsKLSAgICAgICAgbF9wYXJlbnRfbm9kZTAgPSBsX3BhcmVudF9ub2RlOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1sdmxzIC0gMTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG5wbHZbaV07ICsraikgewotICAgICAgICAgICAgICAgICAgICAgICAgayA9IG5wbGhbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoLS1rID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+cGFyZW50ID0gbF9wYXJlbnRfbm9kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytub2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLS1rID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5wYXJlbnQgPSBsX3BhcmVudF9ub2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbm9kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfcGFyZW50X25vZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGogJiAxKSB8fCBqID09IG5wbHZbaV0gLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfcGFyZW50X25vZGUwID0gbF9wYXJlbnRfbm9kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfcGFyZW50X25vZGUgPSBsX3BhcmVudF9ub2RlMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9wYXJlbnRfbm9kZTAgKz0gbnBsaFtpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZS0+cGFyZW50ID0gMDsKLSAgICAgICAgb3BqX3RndF9yZXNldCh0cmVlKTsKLSAgICAgICAgcmV0dXJuIHRyZWU7Ci19Ci0KLS8qKgotICogUmVpbml0aWFsaXNlcyBhIHRhZy10cmVlIGZyb20gYW4gZXhpc3Rpbmcgb25lLgotICoKLSAqIEBwYXJhbSAgICAgICBwX3RyZWUgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0cmVlIHRvIHJlaW5pdGlhbGl6ZS4KLSAqIEBwYXJhbSAgICAgICBwX251bV9sZWFmc19oICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGFycmF5IG9mIGxlYWZzIG9mIHRoZSB0cmVlCi0gKiBAcGFyYW0gICAgICAgcF9udW1fbGVhZnNfdiAgICAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgYXJyYXkgb2YgbGVhZnMgb2YgdGhlIHRyZWUKLSAqIEByZXR1cm4gICAgICBhIG5ldyB0YWctdHJlZSBpZiBzdWNjZXNzZnVsLCBOVUxMIG90aGVyd2lzZQotKi8KLW9wal90Z3RfdHJlZV90ICpvcGpfdGd0X2luaXQob3BqX3RndF90cmVlX3QgKiBwX3RyZWUsT1BKX1VJTlQzMiBwX251bV9sZWFmc19oLCBPUEpfVUlOVDMyIHBfbnVtX2xlYWZzX3YpCi17Ci0gICAgICAgIE9QSl9JTlQzMiBsX25wbGhbMzJdOwotICAgICAgICBPUEpfSU5UMzIgbF9ucGx2WzMyXTsKLSAgICAgICAgb3BqX3RndF9ub2RlX3QgKmxfbm9kZSA9IDAwOwotICAgICAgICBvcGpfdGd0X25vZGVfdCAqbF9wYXJlbnRfbm9kZSA9IDAwOwotICAgICAgICBvcGpfdGd0X25vZGVfdCAqbF9wYXJlbnRfbm9kZTAgPSAwMDsKLSAgICAgICAgT1BKX1VJTlQzMiBpOwotICAgICAgICBPUEpfSU5UMzIgaixrOwotICAgICAgICBPUEpfVUlOVDMyIGxfbnVtX2xldmVsczsKLSAgICAgICAgT1BKX1VJTlQzMiBuOwotICAgICAgICBPUEpfVUlOVDMyIGxfbm9kZV9zaXplOwotCi0gICAgICAgIGlmICghIHBfdHJlZSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChwX3RyZWUtPm51bWxlYWZzaCAhPSBwX251bV9sZWFmc19oKSB8fCAocF90cmVlLT5udW1sZWFmc3YgIT0gcF9udW1fbGVhZnNfdikpIHsKLSAgICAgICAgICAgICAgICBwX3RyZWUtPm51bWxlYWZzaCA9IHBfbnVtX2xlYWZzX2g7Ci0gICAgICAgICAgICAgICAgcF90cmVlLT5udW1sZWFmc3YgPSBwX251bV9sZWFmc192OwotCi0gICAgICAgICAgICAgICAgbF9udW1fbGV2ZWxzID0gMDsKLSAgICAgICAgICAgICAgICBsX25wbGhbMF0gPSAoT1BKX0lOVDMyKXBfbnVtX2xlYWZzX2g7Ci0gICAgICAgICAgICAgICAgbF9ucGx2WzBdID0gKE9QSl9JTlQzMilwX251bV9sZWFmc192OwotICAgICAgICAgICAgICAgIHBfdHJlZS0+bnVtbm9kZXMgPSAwOwotICAgICAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbiA9IChPUEpfVUlOVDMyKShsX25wbGhbbF9udW1fbGV2ZWxzXSAqIGxfbnBsdltsX251bV9sZXZlbHNdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfbnBsaFtsX251bV9sZXZlbHMgKyAxXSA9IChsX25wbGhbbF9udW1fbGV2ZWxzXSArIDEpIC8gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfbnBsdltsX251bV9sZXZlbHMgKyAxXSA9IChsX25wbHZbbF9udW1fbGV2ZWxzXSArIDEpIC8gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfdHJlZS0+bnVtbm9kZXMgKz0gbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICsrbF9udW1fbGV2ZWxzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3aGlsZSAobiA+IDEpOwotCi0gICAgICAgICAgICAgICAgLyogQUREICovCi0gICAgICAgICAgICAgICAgaWYgKHBfdHJlZS0+bnVtbm9kZXMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RndF9kZXN0cm95KHBfdHJlZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxfbm9kZV9zaXplID0gcF90cmVlLT5udW1ub2RlcyAqIChPUEpfVUlOVDMyKXNpemVvZihvcGpfdGd0X25vZGVfdCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGxfbm9kZV9zaXplID4gcF90cmVlLT5ub2Rlc19zaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGd0X25vZGVfdCogbmV3X25vZGVzID0gKG9wal90Z3Rfbm9kZV90Kikgb3BqX3JlYWxsb2MocF90cmVlLT5ub2RlcywgbF9ub2RlX3NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmV3X25vZGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgTm90IGVub3VnaCBtZW1vcnkgdG8gcmVpbml0aWFsaXplIHRoZSB0YWcgdHJlZVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Z3RfZGVzdHJveShwX3RyZWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX3RyZWUtPm5vZGVzID0gbmV3X25vZGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCgoY2hhciAqKSBwX3RyZWUtPm5vZGVzKSArIHBfdHJlZS0+bm9kZXNfc2l6ZSwgMCAsIGxfbm9kZV9zaXplIC0gcF90cmVlLT5ub2Rlc19zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfdHJlZS0+bm9kZXNfc2l6ZSA9IGxfbm9kZV9zaXplOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsX25vZGUgPSBwX3RyZWUtPm5vZGVzOwotICAgICAgICAgICAgICAgIGxfcGFyZW50X25vZGUgPSAmcF90cmVlLT5ub2Rlc1twX3RyZWUtPm51bWxlYWZzaCAqIHBfdHJlZS0+bnVtbGVhZnN2XTsKLSAgICAgICAgICAgICAgICBsX3BhcmVudF9ub2RlMCA9IGxfcGFyZW50X25vZGU7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbF9udW1fbGV2ZWxzIC0gMTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbF9ucGx2W2ldOyArK2opIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgayA9IGxfbnBsaFtpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKC0tayA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9ub2RlLT5wYXJlbnQgPSBsX3BhcmVudF9ub2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9ub2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtLWsgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9ub2RlLT5wYXJlbnQgPSBsX3BhcmVudF9ub2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX25vZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9wYXJlbnRfbm9kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaiAmIDEpIHx8IGogPT0gbF9ucGx2W2ldIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfcGFyZW50X25vZGUwID0gbF9wYXJlbnRfbm9kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3BhcmVudF9ub2RlID0gbF9wYXJlbnRfbm9kZTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9wYXJlbnRfbm9kZTAgKz0gbF9ucGxoW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxfbm9kZS0+cGFyZW50ID0gMDsKLSAgICAgICAgfQotICAgICAgICBvcGpfdGd0X3Jlc2V0KHBfdHJlZSk7Ci0KLSAgICAgICAgcmV0dXJuIHBfdHJlZTsKLX0KLQotdm9pZCBvcGpfdGd0X2Rlc3Ryb3kob3BqX3RndF90cmVlX3QgKnBfdHJlZSkKLXsKLSAgICAgICAgaWYgKCEgcF90cmVlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBfdHJlZS0+bm9kZXMpIHsKLSAgICAgICAgICAgICAgICBvcGpfZnJlZShwX3RyZWUtPm5vZGVzKTsKLSAgICAgICAgICAgICAgICBwX3RyZWUtPm5vZGVzID0gMDA7Ci0gICAgICAgIH0KLSAgICAgICAgb3BqX2ZyZWUocF90cmVlKTsKLX0KLQotdm9pZCBvcGpfdGd0X3Jlc2V0KG9wal90Z3RfdHJlZV90ICpwX3RyZWUpIHsKLSAgICAgICAgT1BKX1VJTlQzMiBpOwotICAgICAgICBvcGpfdGd0X25vZGVfdCAqIGxfY3VycmVudF9ub2RlID0gMDA7OwotCi0gICAgICAgIGlmICghIHBfdHJlZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGxfY3VycmVudF9ub2RlID0gcF90cmVlLT5ub2RlczsKLSAgICAgICAgZm9yICAgICAoaSA9IDA7IGkgPCBwX3RyZWUtPm51bW5vZGVzOyArK2kpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBsX2N1cnJlbnRfbm9kZS0+dmFsdWUgPSA5OTk7Ci0gICAgICAgICAgICAgICAgbF9jdXJyZW50X25vZGUtPmxvdyA9IDA7Ci0gICAgICAgICAgICAgICAgbF9jdXJyZW50X25vZGUtPmtub3duID0gMDsKLSAgICAgICAgICAgICAgICArK2xfY3VycmVudF9ub2RlOwotICAgICAgICB9Ci19Ci0KLXZvaWQgb3BqX3RndF9zZXR2YWx1ZShvcGpfdGd0X3RyZWVfdCAqdHJlZSwgT1BKX1VJTlQzMiBsZWFmbm8sIE9QSl9JTlQzMiB2YWx1ZSkgewotICAgICAgICBvcGpfdGd0X25vZGVfdCAqbm9kZTsKLSAgICAgICAgbm9kZSA9ICZ0cmVlLT5ub2Rlc1tsZWFmbm9dOwotICAgICAgICB3aGlsZSAobm9kZSAmJiBub2RlLT52YWx1ZSA+IHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgbm9kZS0+dmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBub2RlID0gbm9kZS0+cGFyZW50OwotICAgICAgICB9Ci19Ci0KLXZvaWQgb3BqX3RndF9lbmNvZGUob3BqX2Jpb190ICpiaW8sIG9wal90Z3RfdHJlZV90ICp0cmVlLCBPUEpfVUlOVDMyIGxlYWZubywgT1BKX0lOVDMyIHRocmVzaG9sZCkgewotICAgICAgICBvcGpfdGd0X25vZGVfdCAqc3RrWzMxXTsKLSAgICAgICAgb3BqX3RndF9ub2RlX3QgKipzdGtwdHI7Ci0gICAgICAgIG9wal90Z3Rfbm9kZV90ICpub2RlOwotICAgICAgICBPUEpfSU5UMzIgbG93OwotCi0gICAgICAgIHN0a3B0ciA9IHN0azsKLSAgICAgICAgbm9kZSA9ICZ0cmVlLT5ub2Rlc1tsZWFmbm9dOwotICAgICAgICB3aGlsZSAobm9kZS0+cGFyZW50KSB7Ci0gICAgICAgICAgICAgICAgKnN0a3B0cisrID0gbm9kZTsKLSAgICAgICAgICAgICAgICBub2RlID0gbm9kZS0+cGFyZW50OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBsb3cgPSAwOwotICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvdyA+IG5vZGUtPmxvdykgewotICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+bG93ID0gbG93OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb3cgPSBub2RlLT5sb3c7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlIChsb3cgPCB0aHJlc2hvbGQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb3cgPj0gbm9kZS0+dmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFub2RlLT5rbm93bikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9iaW9fd3JpdGUoYmlvLCAxLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5rbm93biA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfYmlvX3dyaXRlKGJpbywgMCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICArK2xvdzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgbm9kZS0+bG93ID0gbG93OwotICAgICAgICAgICAgICAgIGlmIChzdGtwdHIgPT0gc3RrKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgbm9kZSA9ICotLXN0a3B0cjsKLSAgICAgICAgfQotfQotCi1PUEpfVUlOVDMyIG9wal90Z3RfZGVjb2RlKG9wal9iaW9fdCAqYmlvLCBvcGpfdGd0X3RyZWVfdCAqdHJlZSwgT1BKX1VJTlQzMiBsZWFmbm8sIE9QSl9JTlQzMiB0aHJlc2hvbGQpIHsKLSAgICAgICAgb3BqX3RndF9ub2RlX3QgKnN0a1szMV07Ci0gICAgICAgIG9wal90Z3Rfbm9kZV90ICoqc3RrcHRyOwotICAgICAgICBvcGpfdGd0X25vZGVfdCAqbm9kZTsKLSAgICAgICAgT1BKX0lOVDMyIGxvdzsKLQotICAgICAgICBzdGtwdHIgPSBzdGs7Ci0gICAgICAgIG5vZGUgPSAmdHJlZS0+bm9kZXNbbGVhZm5vXTsKLSAgICAgICAgd2hpbGUgKG5vZGUtPnBhcmVudCkgewotICAgICAgICAgICAgICAgICpzdGtwdHIrKyA9IG5vZGU7Ci0gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUtPnBhcmVudDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbG93ID0gMDsKLSAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgIGlmIChsb3cgPiBub2RlLT5sb3cpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmxvdyA9IGxvdzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbG93ID0gbm9kZS0+bG93OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3aGlsZSAobG93IDwgdGhyZXNob2xkICYmIGxvdyA8IG5vZGUtPnZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BqX2Jpb19yZWFkKGJpbywgMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+dmFsdWUgPSBsb3c7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xvdzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbm9kZS0+bG93ID0gbG93OwotICAgICAgICAgICAgICAgIGlmIChzdGtwdHIgPT0gc3RrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbm9kZSA9ICotLXN0a3B0cjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIChub2RlLT52YWx1ZSA8IHRocmVzaG9sZCkgPyAxIDogMDsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC90Z3QuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC90Z3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxNTJmOC4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvdGd0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzIAotICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIAotICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cwotICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBVbml2ZXJzaXRlIGNhdGhvbGlxdWUgZGUgTG91dmFpbiAoVUNMKSwgQmVsZ2l1bQotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFByb2Zlc3NvciBCZW5vaXQgTWFjcQotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMsIERhdmlkIEphbnNzZW5zCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgWWFubmljayBWZXJzY2h1ZXJlbgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4IAotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTQsIEFudG9uaW4gRGVzY2FtcGUKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQotICogQ29weXJpZ2h0IChjKSAyMDA4LCBKZXJvbWUgRmltZXMsIENvbW11bmljYXRpb25zICYgU3lzdGVtZXMgPGplcm9tZS5maW1lc0BjLXMuZnI+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZyYW5jZSAKLSAqIENvcHlyaWdodCAoYykgMjAxMiwgQ1MgU3lzdGVtZXMgZCdJbmZvcm1hdGlvbiwgRnJhbmNlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKLSAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX19UR1RfSAotI2RlZmluZSBfX1RHVF9ICi0vKioKLUBmaWxlIHRndC5oCi1AYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYSB0YWctdHJlZSBjb2RlciAoVEdUKQotCi1UaGUgZnVuY3Rpb25zIGluIFRHVC5DIGhhdmUgZm9yIGdvYWwgdG8gcmVhbGl6ZSBhIHRhZy10cmVlIGNvZGVyLiBUaGUgZnVuY3Rpb25zIGluIFRHVC5DCi1hcmUgdXNlZCBieSBzb21lIGZ1bmN0aW9uIGluIFQyLkMuCi0qLwotCi0vKiogQGRlZmdyb3VwIFRHVCBUR1QgLSBJbXBsZW1lbnRhdGlvbiBvZiBhIHRhZy10cmVlIGNvZGVyICovCi0vKkB7Ki8KLQotLyoqCi1UYWcgbm9kZQotKi8KLXR5cGVkZWYgc3RydWN0IG9wal90Z3Rfbm9kZSB7Ci0gICAgc3RydWN0IG9wal90Z3Rfbm9kZSAqcGFyZW50OwotICAgIE9QSl9JTlQzMiB2YWx1ZTsKLSAgICBPUEpfSU5UMzIgbG93OwotICAgIE9QSl9VSU5UMzIga25vd247Ci19IG9wal90Z3Rfbm9kZV90OwotCi0vKioKLVRhZyB0cmVlCi0qLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX3RndF90cmVlCi17Ci0JT1BKX1VJTlQzMiAgbnVtbGVhZnNoOwotCU9QSl9VSU5UMzIgIG51bWxlYWZzdjsKLQlPUEpfVUlOVDMyIG51bW5vZGVzOwotCW9wal90Z3Rfbm9kZV90ICpub2RlczsKLQlPUEpfVUlOVDMyICBub2Rlc19zaXplOwkJLyogbWF4aW11bSBzaXplIHRha2VuIGJ5IG5vZGVzICovCi19IG9wal90Z3RfdHJlZV90OwotCi0KLS8qKiBAbmFtZSBFeHBvcnRlZCBmdW5jdGlvbnMgKi8KLS8qQHsqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qKgotQ3JlYXRlIGEgdGFnLXRyZWUKLUBwYXJhbSBudW1sZWFmc2ggV2lkdGggb2YgdGhlIGFycmF5IG9mIGxlYWZzIG9mIHRoZSB0cmVlCi1AcGFyYW0gbnVtbGVhZnN2IEhlaWdodCBvZiB0aGUgYXJyYXkgb2YgbGVhZnMgb2YgdGhlIHRyZWUKLUByZXR1cm4gUmV0dXJucyBhIG5ldyB0YWctdHJlZSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIE5VTEwgb3RoZXJ3aXNlCi0qLwotb3BqX3RndF90cmVlX3QgKm9wal90Z3RfY3JlYXRlKE9QSl9VSU5UMzIgbnVtbGVhZnNoLCBPUEpfVUlOVDMyIG51bWxlYWZzdik7Ci0KLS8qKgotICogUmVpbml0aWFsaXNlcyBhIHRhZy10cmVlIGZyb20gYW4gZXhpeHRpbmcgb25lLgotICoKLSAqIEBwYXJhbQlwX3RyZWUJCQkJdGhlIHRyZWUgdG8gcmVpbml0aWFsaXplLgotICogQHBhcmFtCXBfbnVtX2xlYWZzX2gJCXRoZSB3aWR0aCBvZiB0aGUgYXJyYXkgb2YgbGVhZnMgb2YgdGhlIHRyZWUKLSAqIEBwYXJhbQlwX251bV9sZWFmc192CQl0aGUgaGVpZ2h0IG9mIHRoZSBhcnJheSBvZiBsZWFmcyBvZiB0aGUgdHJlZQotICogQHJldHVybglhIG5ldyB0YWctdHJlZSBpZiBzdWNjZXNzZnVsLCBOVUxMIG90aGVyd2lzZQotKi8KLW9wal90Z3RfdHJlZV90ICpvcGpfdGd0X2luaXQob3BqX3RndF90cmVlX3QgKiBwX3RyZWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICBwX251bV9sZWFmc19oLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAgcF9udW1fbGVhZnNfdik7Ci0vKioKLURlc3Ryb3kgYSB0YWctdHJlZSwgbGliZXJhdGluZyBtZW1vcnkKLUBwYXJhbSB0cmVlIFRhZy10cmVlIHRvIGRlc3Ryb3kKLSovCi12b2lkIG9wal90Z3RfZGVzdHJveShvcGpfdGd0X3RyZWVfdCAqdHJlZSk7Ci0vKioKLVJlc2V0IGEgdGFnLXRyZWUgKHNldCBhbGwgbGVhdmVzIHRvIDApCi1AcGFyYW0gdHJlZSBUYWctdHJlZSB0byByZXNldAotKi8KLXZvaWQgb3BqX3RndF9yZXNldChvcGpfdGd0X3RyZWVfdCAqdHJlZSk7Ci0vKioKLVNldCB0aGUgdmFsdWUgb2YgYSBsZWFmIG9mIGEgdGFnLXRyZWUKLUBwYXJhbSB0cmVlIFRhZy10cmVlIHRvIG1vZGlmeQotQHBhcmFtIGxlYWZubyBOdW1iZXIgdGhhdCBpZGVudGlmaWVzIHRoZSBsZWFmIHRvIG1vZGlmeQotQHBhcmFtIHZhbHVlIE5ldyB2YWx1ZSBvZiB0aGUgbGVhZgotKi8KLXZvaWQgb3BqX3RndF9zZXR2YWx1ZShvcGpfdGd0X3RyZWVfdCAqdHJlZSwgCi0gICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsZWFmbm8sIAotICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiB2YWx1ZSk7Ci0vKioKLUVuY29kZSB0aGUgdmFsdWUgb2YgYSBsZWFmIG9mIHRoZSB0YWctdHJlZSB1cCB0byBhIGdpdmVuIHRocmVzaG9sZAotQHBhcmFtIGJpbyBQb2ludGVyIHRvIGEgQklPIGhhbmRsZQotQHBhcmFtIHRyZWUgVGFnLXRyZWUgdG8gbW9kaWZ5Ci1AcGFyYW0gbGVhZm5vIE51bWJlciB0aGF0IGlkZW50aWZpZXMgdGhlIGxlYWYgdG8gZW5jb2RlCi1AcGFyYW0gdGhyZXNob2xkIFRocmVzaG9sZCB0byB1c2Ugd2hlbiBlbmNvZGluZyB2YWx1ZSBvZiB0aGUgbGVhZgotKi8KLXZvaWQgb3BqX3RndF9lbmNvZGUob3BqX2Jpb190ICpiaW8sIAotICAgICAgICAgICAgICAgICAgICBvcGpfdGd0X3RyZWVfdCAqdHJlZSwgCi0gICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbGVhZm5vLCAKLSAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHRocmVzaG9sZCk7Ci0vKioKLURlY29kZSB0aGUgdmFsdWUgb2YgYSBsZWFmIG9mIHRoZSB0YWctdHJlZSB1cCB0byBhIGdpdmVuIHRocmVzaG9sZAotQHBhcmFtIGJpbyBQb2ludGVyIHRvIGEgQklPIGhhbmRsZQotQHBhcmFtIHRyZWUgVGFnLXRyZWUgdG8gZGVjb2RlCi1AcGFyYW0gbGVhZm5vIE51bWJlciB0aGF0IGlkZW50aWZpZXMgdGhlIGxlYWYgdG8gZGVjb2RlCi1AcGFyYW0gdGhyZXNob2xkIFRocmVzaG9sZCB0byB1c2Ugd2hlbiBkZWNvZGluZyB2YWx1ZSBvZiB0aGUgbGVhZgotQHJldHVybiBSZXR1cm5zIDEgaWYgdGhlIG5vZGUncyB2YWx1ZSA8IHRocmVzaG9sZCwgcmV0dXJucyAwIG90aGVyd2lzZQotKi8KLU9QSl9VSU5UMzIgb3BqX3RndF9kZWNvZGUob3BqX2Jpb190ICpiaW8sIAotICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGd0X3RyZWVfdCAqdHJlZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbGVhZm5vLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHRocmVzaG9sZCk7Ci0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLypAfSovCi0KLS8qQH0qLwotCi0jZW5kaWYgLyogX19UR1RfSCAqLwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfYmlvLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9iaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdlZDZmOC4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9iaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZmRlZiBfTVNDX1ZFUgotI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUwotI2VuZGlmCi0jaW5jbHVkZSAiLi4vbGlib3BlbmpwZWcyMC9iaW8uYyIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X2Npby5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfY2lvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNzBlZTUuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfY2lvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZkZWYgX01TQ19WRVIKLSNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKLSNlbmRpZgotI2luY2x1ZGUgIi4uL2xpYm9wZW5qcGVnMjAvY2lvLmMiCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9kd3QuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X2R3dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ0MjhmLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X2R3dC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmZGVmIF9NU0NfVkVSCi0jZGVmaW5lIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCi0jZW5kaWYKLSNpbmNsdWRlICIuLi9saWJvcGVuanBlZzIwL2R3dC5jIgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfZXZlbnQuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X2V2ZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZDliY2EuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfZXZlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZmRlZiBfTVNDX1ZFUgotI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUwotI2VuZGlmCi0jaW5jbHVkZSAiLi4vbGlib3BlbmpwZWcyMC9ldmVudC5jIgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfZnVuY3Rpb25fbGlzdC5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfZnVuY3Rpb25fbGlzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTliMTQxLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X2Z1bmN0aW9uX2xpc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZmRlZiBfTVNDX1ZFUgotI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUwotI2VuZGlmCi0jaW5jbHVkZSAiLi4vbGlib3BlbmpwZWcyMC9mdW5jdGlvbl9saXN0LmMiCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9pbWFnZS5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfaW1hZ2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZiMGZhYS4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9pbWFnZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmZGVmIF9NU0NfVkVSCi0jZGVmaW5lIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCi0jZW5kaWYKLSNpbmNsdWRlICIuLi9saWJvcGVuanBlZzIwL2ltYWdlLmMiCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9pbnZlcnQuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X2ludmVydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWE4OWFiLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X2ludmVydC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmZGVmIF9NU0NfVkVSCi0jZGVmaW5lIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCi0jZW5kaWYKLSNpbmNsdWRlICIuLi9saWJvcGVuanBlZzIwL2ludmVydC5jIgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfajJrLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9qMmsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNhZTZkNC4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9qMmsuYworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZmRlZiBfTVNDX1ZFUgotI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUwotI2VuZGlmCi0jaW5jbHVkZSAiLi4vbGlib3BlbmpwZWcyMC9qMmsuYyIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X2oya19saWIuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X2oya19saWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhNjJhMC4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9qMmtfbGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZmRlZiBfTVNDX1ZFUgotI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUwotI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9qcHQuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X2pwdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWE2MmEwLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X2pwdC5jCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZkZWYgX01TQ19WRVIKLSNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfbWN0LmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9tY3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJhMzg2MS4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9tY3QuYworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZmRlZiBfTVNDX1ZFUgotI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUwotI2VuZGlmCi0jaW5jbHVkZSAiLi4vbGlib3BlbmpwZWcyMC9tY3QuYyIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X21xYy5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfbXFjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYTg1MWQuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfbXFjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZkZWYgX01TQ19WRVIKLSNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKLSNlbmRpZgotI2luY2x1ZGUgIi4uL2xpYm9wZW5qcGVnMjAvbXFjLmMiCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9vcGVuanBlZy5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfb3BlbmpwZWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkZGI5MC4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9vcGVuanBlZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmZGVmIF9NU0NfVkVSCi0jZGVmaW5lIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCi0jZW5kaWYKLSNpbmNsdWRlICIuLi9saWJvcGVuanBlZzIwL29wZW5qcGVnLmMiCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9vcGVuanBlZ19qcDIuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X29wZW5qcGVnX2pwMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjcxZGQwLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X29wZW5qcGVnX2pwMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmZGVmIF9NU0NfVkVSCi0jZGVmaW5lIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCi0jZW5kaWYKLSNpbmNsdWRlICIuLi9saWJvcGVuanBlZzIwL2pwMi5jIgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfb3BqX2Nsb2NrLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9vcGpfY2xvY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFlZDQ3MS4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9vcGpfY2xvY2suYworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZmRlZiBfTVNDX1ZFUgotI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUwotI2VuZGlmCi0jaW5jbHVkZSAiLi4vbGlib3BlbmpwZWcyMC9vcGpfY2xvY2suYyIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X3BpLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9waS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzRhMTIwLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X3BpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZkZWYgX01TQ19WRVIKLSNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKLSNlbmRpZgotI2luY2x1ZGUgIi4uL2xpYm9wZW5qcGVnMjAvcGkuYyIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X3Jhdy5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfcmF3LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NzVkZjIuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfcmF3LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZkZWYgX01TQ19WRVIKLSNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKLSNlbmRpZgotI2luY2x1ZGUgIi4uL2xpYm9wZW5qcGVnMjAvcmF3LmMiCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF90MS5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfdDEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRhOGFlMi4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF90MS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmZGVmIF9NU0NfVkVSCi0jZGVmaW5lIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCi0jZW5kaWYKLSNpbmNsdWRlICIuLi9saWJvcGVuanBlZzIwL3QxLmMiCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF90MV9nZW5lcmF0ZV9sdXRzLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF90MV9nZW5lcmF0ZV9sdXRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0Yjg4OTAuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfdDFfZ2VuZXJhdGVfbHV0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmZGVmIF9NU0NfVkVSCi0jZGVmaW5lIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCi0jZW5kaWYKLSNpbmNsdWRlICIuLi9saWJvcGVuanBlZzIwL3QxX2dlbmVyYXRlX2x1dHMuYyIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X3QyLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF90Mi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTVjYTUwLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X3QyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZkZWYgX01TQ19WRVIKLSNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKLSNlbmRpZgotI2luY2x1ZGUgIi4uL2xpYm9wZW5qcGVnMjAvdDIuYyIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X3RjZC5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfdGNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNTc1NzAuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfdGNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZkZWYgX01TQ19WRVIKLSNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKLSNlbmRpZgotI2luY2x1ZGUgIi4uL2xpYm9wZW5qcGVnMjAvdGNkLmMiCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF90Z3QuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X3RndC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODNkYzU0Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X3RndC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmZGVmIF9NU0NfVkVSCi0jZGVmaW5lIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCi0jZW5kaWYKLSNpbmNsdWRlICIuLi9saWJvcGVuanBlZzIwL3RndC5jIgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF96bGliL2luY2x1ZGUvZnhfemxpYi5oIGIvY29yZS9zcmMvZnhjb2RlYy9meF96bGliL2luY2x1ZGUvZnhfemxpYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGE2NzRkLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9pbmNsdWRlL2Z4X3psaWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgQ09SRV9TUkNfRlhDT0RFQ19GWF9aTElCX0lOQ0xVREVfRlhfWkxJQl9IXwotI2RlZmluZSBDT1JFX1NSQ19GWENPREVDX0ZYX1pMSUJfSU5DTFVERV9GWF9aTElCX0hfCi0KLSNpZmRlZiBfTVNDX1ZFUgotI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUwotI2VuZGlmCi0jaW5jbHVkZSAiLi4vemxpYl92MTI4L3psaWIuaCIKLQotI2VuZGlmICAvLyBDT1JFX1NSQ19GWENPREVDX0ZYX1pMSUJfSU5DTFVERV9GWF9aTElCX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfYWRsZXIzMi5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX2FkbGVyMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhhMzVhMC4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfYWRsZXIzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmZGVmIF9NU0NfVkVSCi0jZGVmaW5lIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCi0jZW5kaWYKLSNpbmNsdWRlICIuLi96bGliX3YxMjgvZnhfemxpYl9hZGxlcjMyLmMiCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfY29tcHJlc3MuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl9jb21wcmVzcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODhhNjc1Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl9jb21wcmVzcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmZGVmIF9NU0NfVkVSCi0jZGVmaW5lIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCi0jZW5kaWYKLSNpbmNsdWRlICIuLi96bGliX3YxMjgvZnhfemxpYl9jb21wcmVzcy5jIgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX2NyYzMyLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfY3JjMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdmNzQ1My4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfY3JjMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZmRlZiBfTVNDX1ZFUgotI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUwotI2VuZGlmCi0jaW5jbHVkZSAiLi4vemxpYl92MTI4L2Z4X3psaWJfY3JjMzIuYyIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl9kZWZsYXRlLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfZGVmbGF0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzc3NzlhLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl9kZWZsYXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZkZWYgX01TQ19WRVIKLSNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKLSNlbmRpZgotI2luY2x1ZGUgIi4uL3psaWJfdjEyOC9meF96bGliX2RlZmxhdGUuYyIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl9nemNsb3NlLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfZ3pjbG9zZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjZjYmMyLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl9nemNsb3NlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZkZWYgX01TQ19WRVIKLSNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKLSNlbmRpZgotI2luY2x1ZGUgIi4uL3psaWJfdjEyOC9nemNsb3NlLmMiCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfZ3psaWIuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl9nemxpYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTk1NDU0Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl9nemxpYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmZGVmIF9NU0NfVkVSCi0jZGVmaW5lIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCi0jZW5kaWYKLSNpbmNsdWRlICIuLi96bGliX3YxMjgvZ3psaWIuYyIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl9nenJlYWQuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl9nenJlYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMxNGZmNy4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfZ3pyZWFkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZkZWYgX01TQ19WRVIKLSNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKLSNlbmRpZgotI2luY2x1ZGUgIi4uL3psaWJfdjEyOC9nenJlYWQuYyIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl9nendyaXRlLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfZ3p3cml0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTM3ZmVkLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl9nendyaXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZkZWYgX01TQ19WRVIKLSNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKLSNlbmRpZgotI2luY2x1ZGUgIi4uL3psaWJfdjEyOC9nendyaXRlLmMiCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfaW5mYmFjay5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX2luZmJhY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdiYzc4MS4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfaW5mYmFjay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmZGVmIF9NU0NfVkVSCi0jZGVmaW5lIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCi0jZW5kaWYKLSNpbmNsdWRlICIuLi96bGliX3YxMjgvZnhfemxpYl9pbmZiYWNrLmMiCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfaW5mZmFzdC5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX2luZmZhc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY4MjhjYy4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfaW5mZmFzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmZGVmIF9NU0NfVkVSCi0jZGVmaW5lIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCi0jZW5kaWYKLSNpbmNsdWRlICIuLi96bGliX3YxMjgvZnhfemxpYl9pbmZmYXN0LmMiCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfaW5mbGF0ZS5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX2luZmxhdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI4YTM4OS4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfaW5mbGF0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmZGVmIF9NU0NfVkVSCi0jZGVmaW5lIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCi0jZW5kaWYKLSNpbmNsdWRlICIuLi96bGliX3YxMjgvZnhfemxpYl9pbmZsYXRlLmMiCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfaW5mdHJlZXMuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl9pbmZ0cmVlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWJlM2YwLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl9pbmZ0cmVlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmZGVmIF9NU0NfVkVSCi0jZGVmaW5lIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCi0jZW5kaWYKLSNpbmNsdWRlICIuLi96bGliX3YxMjgvZnhfemxpYl9pbmZ0cmVlcy5jIgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX3RyZWVzLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfdHJlZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlMTc1Yi4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfdHJlZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZmRlZiBfTVNDX1ZFUgotI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUwotI2VuZGlmCi0jaW5jbHVkZSAiLi4vemxpYl92MTI4L2Z4X3psaWJfdHJlZXMuYyIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl91bmNvbXByLmMgYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfdW5jb21wci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTFjYjZmLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl91bmNvbXByLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZkZWYgX01TQ19WRVIKLSNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKLSNlbmRpZgotI2luY2x1ZGUgIi4uL3psaWJfdjEyOC9meF96bGliX3VuY29tcHIuYyIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl96dXRpbC5jIGIvY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX3p1dGlsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5N2VkZDUuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX3p1dGlsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZkZWYgX01TQ19WRVIKLSNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKLSNlbmRpZgotI2luY2x1ZGUgIi4uL3psaWJfdjEyOC9meF96bGliX3p1dGlsLmMiCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvemxpYl92MTI4L3p1dGlsLmggYi9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvemxpYl92MTI4L3p1dGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MmQxYjUuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3psaWJfdjEyOC96dXRpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qIHp1dGlsLmggLS0gaW50ZXJuYWwgaW50ZXJmYWNlIGFuZCBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5Ci0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5LgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCi0gICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKLSAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KLSAqLwotCi0vKiBAKCMpICRJZCQgKi8KLQotI2lmbmRlZiBaVVRJTF9ICi0jZGVmaW5lIFpVVElMX0gKLQotI2luY2x1ZGUgIi4uLy4uLy4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmgiCQkvKiBYWVEgMjAwNy01LTIyICovCi0KLSNpZmRlZiBIQVZFX0hJRERFTgotIyAgZGVmaW5lIFpMSUJfSU5URVJOQUwgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSAoImhpZGRlbiIpKSkKLSNlbHNlCi0jICBkZWZpbmUgWkxJQl9JTlRFUk5BTAotI2VuZGlmCi0KLSNpbmNsdWRlICJ6bGliLmgiCi0KLSNpZiBkZWZpbmVkKFNUREMpICYmICFkZWZpbmVkKFpfU09MTykKLSMgIGlmICEoZGVmaW5lZChfV0lOMzJfV0NFKSAmJiBkZWZpbmVkKF9NU0NfVkVSKSkKLSMgICAgaW5jbHVkZSA8c3RkZGVmLmg+Ci0jICBlbmRpZgotIyAgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZkZWYgWl9TT0xPCi0gICB0eXBlZGVmIGxvbmcgcHRyZGlmZl90OyAgLyogZ3Vlc3MgLS0gd2lsbCBiZSBjYXVnaHQgaWYgZ3Vlc3MgaXMgd3JvbmcgKi8KLSNlbmRpZgotCi0jaWZuZGVmIGxvY2FsCi0jICBkZWZpbmUgbG9jYWwgc3RhdGljCi0jZW5kaWYKLS8qIGNvbXBpbGUgd2l0aCAtRGxvY2FsIGlmIHlvdXIgZGVidWdnZXIgY2FuJ3QgZmluZCBzdGF0aWMgc3ltYm9scyAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgIHVjaDsKLXR5cGVkZWYgdWNoIEZBUiB1Y2hmOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1c2g7Ci10eXBlZGVmIHVzaCBGQVIgdXNoZjsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAgdWxnOwotCi1leHRlcm4gel9jb25zdCBjaGFyICogY29uc3Qgel9lcnJtc2dbMTBdOyAvKiBpbmRleGVkIGJ5IDItemxpYl9lcnJvciAqLwotLyogKHNpemUgZ2l2ZW4gdG8gYXZvaWQgc2lsbHkgd2FybmluZ3Mgd2l0aCBWaXN1YWwgQysrKSAqLwotCi0jZGVmaW5lIEVSUl9NU0coZXJyKSB6X2Vycm1zZ1taX05FRURfRElDVC0oZXJyKV0KLQotI2RlZmluZSBFUlJfUkVUVVJOKHN0cm0sZXJyKSBcCi0gIHJldHVybiAoc3RybS0+bXNnID0gRVJSX01TRyhlcnIpLCAoZXJyKSkKLS8qIFRvIGJlIHVzZWQgb25seSB3aGVuIHRoZSBzdGF0ZSBpcyBrbm93biB0byBiZSB2YWxpZCAqLwotCi0gICAgICAgIC8qIGNvbW1vbiBjb25zdGFudHMgKi8KLQotI2lmbmRlZiBERUZfV0JJVFMKLSMgIGRlZmluZSBERUZfV0JJVFMgTUFYX1dCSVRTCi0jZW5kaWYKLS8qIGRlZmF1bHQgd2luZG93Qml0cyBmb3IgZGVjb21wcmVzc2lvbi4gTUFYX1dCSVRTIGlzIGZvciBjb21wcmVzc2lvbiBvbmx5ICovCi0KLSNpZiBNQVhfTUVNX0xFVkVMID49IDgKLSMgIGRlZmluZSBERUZfTUVNX0xFVkVMIDgKLSNlbHNlCi0jICBkZWZpbmUgREVGX01FTV9MRVZFTCAgTUFYX01FTV9MRVZFTAotI2VuZGlmCi0vKiBkZWZhdWx0IG1lbUxldmVsICovCi0KLSNkZWZpbmUgU1RPUkVEX0JMT0NLIDAKLSNkZWZpbmUgU1RBVElDX1RSRUVTIDEKLSNkZWZpbmUgRFlOX1RSRUVTICAgIDIKLS8qIFRoZSB0aHJlZSBraW5kcyBvZiBibG9jayB0eXBlICovCi0KLSNkZWZpbmUgTUlOX01BVENIICAzCi0jZGVmaW5lIE1BWF9NQVRDSCAgMjU4Ci0vKiBUaGUgbWluaW11bSBhbmQgbWF4aW11bSBtYXRjaCBsZW5ndGhzICovCi0KLSNkZWZpbmUgUFJFU0VUX0RJQ1QgMHgyMCAvKiBwcmVzZXQgZGljdGlvbmFyeSBmbGFnIGluIHpsaWIgaGVhZGVyICovCi0KLSAgICAgICAgLyogdGFyZ2V0IGRlcGVuZGVuY2llcyAqLwotCi0jaWYgZGVmaW5lZChNU0RPUykgfHwgKGRlZmluZWQoV0lORE9XUykgJiYgIWRlZmluZWQoV0lOMzIpKQotIyAgZGVmaW5lIE9TX0NPREUgIDB4MDAKLSMgIGlmbmRlZiBaX1NPTE8KLSMgICAgaWYgZGVmaW5lZChfX1RVUkJPQ19fKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKLSMgICAgICBpZiAoX19TVERDX18gPT0gMSkgJiYgKGRlZmluZWQoX19MQVJHRV9fKSB8fCBkZWZpbmVkKF9fQ09NUEFDVF9fKSkKLSAgICAgICAgIC8qIEFsbG93IGNvbXBpbGF0aW9uIHdpdGggQU5TSSBrZXl3b3JkcyBvbmx5IGVuYWJsZWQgKi8KLSAgICAgICAgIHZvaWQgX0NkZWNsIGZhcmZyZWUoIHZvaWQgKmJsb2NrICk7Ci0gICAgICAgICB2b2lkICpfQ2RlY2wgZmFybWFsbG9jKCB1bnNpZ25lZCBsb25nIG5ieXRlcyApOwotIyAgICAgIGVsc2UKLSMgICAgICAgIGluY2x1ZGUgPGFsbG9jLmg+Ci0jICAgICAgZW5kaWYKLSMgICAgZWxzZSAvKiBNU0Mgb3IgREpHUFAgKi8KLSMgICAgICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIEFNSUdBCi0jICBkZWZpbmUgT1NfQ09ERSAgMHgwMQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFZBWEMpIHx8IGRlZmluZWQoVk1TKQotIyAgZGVmaW5lIE9TX0NPREUgIDB4MDIKLSMgIGRlZmluZSBGX09QRU4obmFtZSwgbW9kZSkgXAotICAgICBGWFNZU19mb3BlbigobmFtZSksIChtb2RlKSwgIm1iYz02MCIsICJjdHg9c3RtIiwgInJmbT1maXgiLCAibXJzPTUxMiIpCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQVRBUkkpIHx8IGRlZmluZWQoYXRhcmlzdCkKLSMgIGRlZmluZSBPU19DT0RFICAweDA1Ci0jZW5kaWYKLQotI2lmZGVmIE9TMgotIyAgZGVmaW5lIE9TX0NPREUgIDB4MDYKLSMgIGlmIGRlZmluZWQoTV9JODYpICYmICFkZWZpbmVkKFpfU09MTykKLSMgICAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKE1BQ09TKSB8fCBkZWZpbmVkKFRBUkdFVF9PU19NQUMpCi0jICBkZWZpbmUgT1NfQ09ERSAgMHgwNwotIyAgaWZuZGVmIFpfU09MTwotIyAgICBpZiBkZWZpbmVkKF9fTVdFUktTX18pICYmIF9fZGVzdF9vcyAhPSBfX2JlX29zICYmIF9fZGVzdF9vcyAhPSBfX3dpbjMyX29zCi0jICAgICAgaW5jbHVkZSA8dW5peC5oPiAvKiBmb3IgZmRvcGVuICovCi0jICAgIGVsc2UKLSMgICAgICBpZm5kZWYgZmRvcGVuCi0jICAgICAgICBkZWZpbmUgZmRvcGVuKGZkLG1vZGUpIE5VTEwgLyogTm8gZmRvcGVuKCkgKi8KLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgVE9QUzIwCi0jICBkZWZpbmUgT1NfQ09ERSAgMHgwYQotI2VuZGlmCi0KLSNpZmRlZiBXSU4zMgotIyAgaWZuZGVmIF9fQ1lHV0lOX18gIC8qIEN5Z3dpbiBpcyBVbml4LCBub3QgV2luMzIgKi8KLSMgICAgZGVmaW5lIE9TX0NPREUgIDB4MGIKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIF9fNTBTRVJJRVMgLyogUHJpbWUvUFJJTU9TICovCi0jICBkZWZpbmUgT1NfQ09ERSAgMHgwZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9CRU9TXykgfHwgZGVmaW5lZChSSVNDT1MpCi0jICBkZWZpbmUgZmRvcGVuKGZkLG1vZGUpIE5VTEwgLyogTm8gZmRvcGVuKCkgKi8KLSNlbmRpZgotCi0jaWYgKGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+IDYwMCkpICYmICFkZWZpbmVkIF9fSU5URVJJWAotIyAgaWYgZGVmaW5lZChfV0lOMzJfV0NFKQotIyAgICBkZWZpbmUgZmRvcGVuKGZkLG1vZGUpIE5VTEwgLyogTm8gZmRvcGVuKCkgKi8KLSMgICAgaWZuZGVmIF9QVFJESUZGX1RfREVGSU5FRAotICAgICAgIHR5cGVkZWYgaW50IHB0cmRpZmZfdDsKLSMgICAgICBkZWZpbmUgX1BUUkRJRkZfVF9ERUZJTkVECi0jICAgIGVuZGlmCi0jICBlbHNlCi0jICAgIGRlZmluZSBmZG9wZW4oZmQsdHlwZSkgIF9mZG9wZW4oZmQsdHlwZSkKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiAhZGVmaW5lZChNU0RPUykKLSAgI3ByYWdtYSB3YXJuIC04MDA0Ci0gICNwcmFnbWEgd2FybiAtODAwOAotICAjcHJhZ21hIHdhcm4gLTgwNjYKLSNlbmRpZgotCi0vKiBwcm92aWRlIHByb3RvdHlwZXMgZm9yIHRoZXNlIHdoZW4gYnVpbGRpbmcgemxpYiB3aXRob3V0IExGUyAqLwotI2lmICFkZWZpbmVkKF9XSU4zMikgJiYgXAotICAgICghZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKSB8fCBfTEZTNjRfTEFSR0VGSUxFLTAgPT0gMCkKLSAgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMl9jb21iaW5lNjQgT0YoKHVMb25nLCB1TG9uZywgel9vZmZfdCkpOwotICAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lNjQgT0YoKHVMb25nLCB1TG9uZywgel9vZmZfdCkpOwotI2VuZGlmCi0KLSAgICAgICAgLyogY29tbW9uIGRlZmF1bHRzICovCi0KLSNpZm5kZWYgT1NfQ09ERQotIyAgZGVmaW5lIE9TX0NPREUgIDB4MDMgIC8qIGFzc3VtZSBVbml4ICovCi0jZW5kaWYKLQotI2lmbmRlZiBGX09QRU4KLSMgIGRlZmluZSBGX09QRU4obmFtZSwgbW9kZSkgRlhTWVNfZm9wZW4oKG5hbWUpLCAobW9kZSkpCi0jZW5kaWYKLQotICAgICAgICAgLyogZnVuY3Rpb25zICovCi0KLSNpZiBkZWZpbmVkKHB5cikgfHwgZGVmaW5lZChaX1NPTE8pCi0jICBkZWZpbmUgTk9fTUVNQ1BZCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFNNQUxMX01FRElVTSkgJiYgIWRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9fU0NfXykKLSAvKiBVc2Ugb3VyIG93biBmdW5jdGlvbnMgZm9yIHNtYWxsIGFuZCBtZWRpdW0gbW9kZWwgd2l0aCBNU0MgPD0gNS4wLgotICAqIFlvdSBtYXkgaGF2ZSB0byB1c2UgdGhlIHNhbWUgc3RyYXRlZ3kgZm9yIEJvcmxhbmQgQyAodW50ZXN0ZWQpLgotICAqIFRoZSBfX1NDX18gY2hlY2sgaXMgZm9yIFN5bWFudGVjLgotICAqLwotIyAgZGVmaW5lIE5PX01FTUNQWQotI2VuZGlmCi0jaWYgZGVmaW5lZChTVERDKSAmJiAhZGVmaW5lZChIQVZFX01FTUNQWSkgJiYgIWRlZmluZWQoTk9fTUVNQ1BZKQotIyAgZGVmaW5lIEhBVkVfTUVNQ1BZCi0jZW5kaWYKLSNpZmRlZiBIQVZFX01FTUNQWQotIyAgaWZkZWYgU01BTExfTUVESVVNIC8qIE1TRE9TIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLwotIyAgICBkZWZpbmUgem1lbWNweSBfZm1lbWNweQotIyAgICBkZWZpbmUgem1lbWNtcCBfZm1lbWNtcAotIyAgICBkZWZpbmUgem1lbXplcm8oZGVzdCwgbGVuKSBfZm1lbXNldChkZXN0LCAwLCBsZW4pCi0jICBlbHNlCi0jICAgIGRlZmluZSB6bWVtY3B5IEZYU1lTX21lbWNweTMyCi0jICAgIGRlZmluZSB6bWVtY21wIEZYU1lTX21lbWNtcDMyCi0jICAgIGRlZmluZSB6bWVtemVybyhkZXN0LCBsZW4pIEZYU1lTX21lbXNldDMyKGRlc3QsIDAsIGxlbikKLSMgIGVuZGlmCi0jZWxzZQotICAgdm9pZCBaTElCX0lOVEVSTkFMIHptZW1jcHkgT0YoKEJ5dGVmKiBkZXN0LCBjb25zdCBCeXRlZiogc291cmNlLCB1SW50IGxlbikpOwotICAgaW50IFpMSUJfSU5URVJOQUwgem1lbWNtcCBPRigoY29uc3QgQnl0ZWYqIHMxLCBjb25zdCBCeXRlZiogczIsIHVJbnQgbGVuKSk7Ci0gICB2b2lkIFpMSUJfSU5URVJOQUwgem1lbXplcm8gT0YoKEJ5dGVmKiBkZXN0LCB1SW50IGxlbikpOwotI2VuZGlmCi0KLS8qIERpYWdub3N0aWMgZnVuY3Rpb25zICovCi0jaWZkZWYgREVCVUcKLSMgIGluY2x1ZGUgPHN0ZGlvLmg+Ci0gICBleHRlcm4gaW50IFpMSUJfSU5URVJOQUwgel92ZXJib3NlOwotICAgZXh0ZXJuIHZvaWQgWkxJQl9JTlRFUk5BTCB6X2Vycm9yIE9GKChjaGFyICptKSk7Ci0jICBkZWZpbmUgQXNzZXJ0KGNvbmQsbXNnKSB7aWYoIShjb25kKSkgel9lcnJvcihtc2cpO30KLSMgIGRlZmluZSBUcmFjZSh4KSB7aWYgKHpfdmVyYm9zZT49MCkgRlhTWVNfZnByaW50ZiB4IDt9Ci0jICBkZWZpbmUgVHJhY2V2KHgpIHtpZiAoel92ZXJib3NlPjApIEZYU1lTX2ZwcmludGYgeCA7fQotIyAgZGVmaW5lIFRyYWNldnYoeCkge2lmICh6X3ZlcmJvc2U+MSkgRlhTWVNfZnByaW50ZiB4IDt9Ci0jICBkZWZpbmUgVHJhY2VjKGMseCkge2lmICh6X3ZlcmJvc2U+MCAmJiAoYykpIEZYU1lTX2ZwcmludGYgeCA7fQotIyAgZGVmaW5lIFRyYWNlY3YoYyx4KSB7aWYgKHpfdmVyYm9zZT4xICYmIChjKSkgRlhTWVNfZnByaW50ZiB4IDt9Ci0jZWxzZQotIyAgZGVmaW5lIEFzc2VydChjb25kLG1zZykKLSMgIGRlZmluZSBUcmFjZSh4KQotIyAgZGVmaW5lIFRyYWNldih4KQotIyAgZGVmaW5lIFRyYWNldnYoeCkKLSMgIGRlZmluZSBUcmFjZWMoYyx4KQotIyAgZGVmaW5lIFRyYWNlY3YoYyx4KQotI2VuZGlmCi0KLSNpZm5kZWYgWl9TT0xPCi0gICB2b2lkcGYgWkxJQl9JTlRFUk5BTCB6Y2FsbG9jIE9GKCh2b2lkcGYgb3BhcXVlLCB1bnNpZ25lZCBpdGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNpemUpKTsKLSAgIHZvaWQgWkxJQl9JTlRFUk5BTCB6Y2ZyZWUgIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgcHRyKSk7Ci0jZW5kaWYKLQotI2RlZmluZSBaQUxMT0Moc3RybSwgaXRlbXMsIHNpemUpIFwKLSAgICAgICAgICAgKCooKHN0cm0pLT56YWxsb2MpKSgoc3RybSktPm9wYXF1ZSwgKGl0ZW1zKSwgKHNpemUpKQotI2RlZmluZSBaRlJFRShzdHJtLCBhZGRyKSAgKCooKHN0cm0pLT56ZnJlZSkpKChzdHJtKS0+b3BhcXVlLCAodm9pZHBmKShhZGRyKSkKLSNkZWZpbmUgVFJZX0ZSRUUocywgcCkge2lmIChwKSBaRlJFRShzLCBwKTt9Ci0KLS8qIFJldmVyc2UgdGhlIGJ5dGVzIGluIGEgMzItYml0IHZhbHVlICovCi0jZGVmaW5lIFpTV0FQMzIocSkgKCgoKHEpID4+IDI0KSAmIDB4ZmYpICsgKCgocSkgPj4gOCkgJiAweGZmMDApICsgXAotICAgICAgICAgICAgICAgICAgICAoKChxKSAmIDB4ZmYwMCkgPDwgOCkgKyAoKChxKSAmIDB4ZmYpIDw8IDI0KSkKLQotI2VuZGlmIC8qIFpVVElMX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQXJpdGhEZWNvZGVyLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQXJpdGhEZWNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTJmMjZkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Bcml0aERlY29kZXIuY3BwCkBAIC0wLDAgKzEsMTUyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJKQmlnMl9Bcml0aERlY29kZXIuaCIKKworI2luY2x1ZGUgIkpCaWcyX0JpdFN0cmVhbS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgorCituYW1lc3BhY2UgeworCitzdHJ1Y3QgSkJpZzJBcml0aFFlIHsKKyAgdW5zaWduZWQgaW50IFFlOworICB1bnNpZ25lZCBpbnQgTk1QUzsKKyAgdW5zaWduZWQgaW50IE5MUFM7CisgIHVuc2lnbmVkIGludCBuU3dpdGNoOworfTsKKworY29uc3QgSkJpZzJBcml0aFFlIGtRZVRhYmxlW10gPSB7CisgICAgLy8gU3R1cGlkIGhhY2sgdG8ga2VlcCBjbGFuZy1mb3JtYXQgZnJvbSByZWZvcm1hdHRpbmcgdGhpcyBiYWRseS4KKyAgICB7MHg1NjAxLCAxLCAxLCAxfSwKKyAgICB7MHgzNDAxLCAyLCA2LCAwfSwKKyAgICB7MHgxODAxLCAzLCA5LCAwfSwKKyAgICB7MHgwQUMxLCA0LCAxMiwgMH0sCisgICAgezB4MDUyMSwgNSwgMjksIDB9LAorICAgIHsweDAyMjEsIDM4LCAzMywgMH0sCisgICAgezB4NTYwMSwgNywgNiwgMX0sCisgICAgezB4NTQwMSwgOCwgMTQsIDB9LAorICAgIHsweDQ4MDEsIDksIDE0LCAwfSwKKyAgICB7MHgzODAxLCAxMCwgMTQsIDB9LAorICAgIHsweDMwMDEsIDExLCAxNywgMH0sCisgICAgezB4MjQwMSwgMTIsIDE4LCAwfSwKKyAgICB7MHgxQzAxLCAxMywgMjAsIDB9LAorICAgIHsweDE2MDEsIDI5LCAyMSwgMH0sCisgICAgezB4NTYwMSwgMTUsIDE0LCAxfSwKKyAgICB7MHg1NDAxLCAxNiwgMTQsIDB9LAorICAgIHsweDUxMDEsIDE3LCAxNSwgMH0sCisgICAgezB4NDgwMSwgMTgsIDE2LCAwfSwKKyAgICB7MHgzODAxLCAxOSwgMTcsIDB9LAorICAgIHsweDM0MDEsIDIwLCAxOCwgMH0sCisgICAgezB4MzAwMSwgMjEsIDE5LCAwfSwKKyAgICB7MHgyODAxLCAyMiwgMTksIDB9LAorICAgIHsweDI0MDEsIDIzLCAyMCwgMH0sCisgICAgezB4MjIwMSwgMjQsIDIxLCAwfSwKKyAgICB7MHgxQzAxLCAyNSwgMjIsIDB9LAorICAgIHsweDE4MDEsIDI2LCAyMywgMH0sCisgICAgezB4MTYwMSwgMjcsIDI0LCAwfSwKKyAgICB7MHgxNDAxLCAyOCwgMjUsIDB9LAorICAgIHsweDEyMDEsIDI5LCAyNiwgMH0sCisgICAgezB4MTEwMSwgMzAsIDI3LCAwfSwKKyAgICB7MHgwQUMxLCAzMSwgMjgsIDB9LAorICAgIHsweDA5QzEsIDMyLCAyOSwgMH0sCisgICAgezB4MDhBMSwgMzMsIDMwLCAwfSwKKyAgICB7MHgwNTIxLCAzNCwgMzEsIDB9LAorICAgIHsweDA0NDEsIDM1LCAzMiwgMH0sCisgICAgezB4MDJBMSwgMzYsIDMzLCAwfSwKKyAgICB7MHgwMjIxLCAzNywgMzQsIDB9LAorICAgIHsweDAxNDEsIDM4LCAzNSwgMH0sCisgICAgezB4MDExMSwgMzksIDM2LCAwfSwKKyAgICB7MHgwMDg1LCA0MCwgMzcsIDB9LAorICAgIHsweDAwNDksIDQxLCAzOCwgMH0sCisgICAgezB4MDAyNSwgNDIsIDM5LCAwfSwKKyAgICB7MHgwMDE1LCA0MywgNDAsIDB9LAorICAgIHsweDAwMDksIDQ0LCA0MSwgMH0sCisgICAgezB4MDAwNSwgNDUsIDQyLCAwfSwKKyAgICB7MHgwMDAxLCA0NSwgNDMsIDB9LAorICAgIHsweDU2MDEsIDQ2LCA0NiwgMH19OworCitjb25zdCB1bnNpZ25lZCBpbnQga0RlZmF1bHRBVmFsdWUgPSAweDgwMDA7CisKK2ludCBEZWNvZGVOTVBTKEpCaWcyQXJpdGhDdHgqIHBDWCwgY29uc3QgSkJpZzJBcml0aFFlJiBxZSkgeworICBwQ1gtPkkgPSBxZS5OTVBTOworICByZXR1cm4gcENYLT5NUFM7Cit9CisKK2ludCBEZWNvZGVOTFBTKEpCaWcyQXJpdGhDdHgqIHBDWCwgY29uc3QgSkJpZzJBcml0aFFlJiBxZSkgeworICAvLyBUT0RPKHRoZXN0aWcpOiB8RHwsIHxNUFN8IGFuZCBmcmllbmRzIHByb2JhYmx5IHNob3VsZCBiZSBib29sZWFucy4KKyAgaW50IEQgPSAxIC0gcENYLT5NUFM7CisgIGlmIChxZS5uU3dpdGNoID09IDEpCisgICAgcENYLT5NUFMgPSAxIC0gcENYLT5NUFM7CisgIHBDWC0+SSA9IHFlLk5MUFM7CisgIHJldHVybiBEOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworQ0pCaWcyX0FyaXRoRGVjb2Rlcjo6Q0pCaWcyX0FyaXRoRGVjb2RlcihDSkJpZzJfQml0U3RyZWFtKiBwU3RyZWFtKQorICAgIDogbV9wU3RyZWFtKHBTdHJlYW0pIHsKKyAgbV9CID0gbV9wU3RyZWFtLT5nZXRDdXJCeXRlX2FyaXRoKCk7CisgIG1fQyA9IChtX0IgXiAweGZmKSA8PCAxNjsKKyAgQllURUlOKCk7CisgIG1fQyA9IG1fQyA8PCA3OworICBtX0NUID0gbV9DVCAtIDc7CisgIG1fQSA9IGtEZWZhdWx0QVZhbHVlOworfQorCitDSkJpZzJfQXJpdGhEZWNvZGVyOjp+Q0pCaWcyX0FyaXRoRGVjb2RlcigpIHsKK30KKworaW50IENKQmlnMl9Bcml0aERlY29kZXI6OkRFQ09ERShKQmlnMkFyaXRoQ3R4KiBwQ1gpIHsKKyAgaWYgKCFwQ1ggfHwgcENYLT5JID49IEZYX0FycmF5U2l6ZShrUWVUYWJsZSkpCisgICAgcmV0dXJuIDA7CisKKyAgY29uc3QgSkJpZzJBcml0aFFlJiBxZSA9IGtRZVRhYmxlW3BDWC0+SV07CisgIG1fQSAtPSBxZS5RZTsKKyAgaWYgKChtX0MgPj4gMTYpIDwgbV9BKSB7CisgICAgaWYgKG1fQSAmIGtEZWZhdWx0QVZhbHVlKQorICAgICAgcmV0dXJuIHBDWC0+TVBTOworCisgICAgY29uc3QgaW50IEQgPSBtX0EgPCBxZS5RZSA/IERlY29kZU5MUFMocENYLCBxZSkgOiBEZWNvZGVOTVBTKHBDWCwgcWUpOworICAgIFJlYWRWYWx1ZUEoKTsKKyAgICByZXR1cm4gRDsKKyAgfQorCisgIG1fQyAtPSBtX0EgPDwgMTY7CisgIGNvbnN0IGludCBEID0gbV9BIDwgcWUuUWUgPyBEZWNvZGVOTVBTKHBDWCwgcWUpIDogRGVjb2RlTkxQUyhwQ1gsIHFlKTsKKyAgbV9BID0gcWUuUWU7CisgIFJlYWRWYWx1ZUEoKTsKKyAgcmV0dXJuIEQ7Cit9CisKK3ZvaWQgQ0pCaWcyX0FyaXRoRGVjb2Rlcjo6QllURUlOKCkgeworICB1bnNpZ25lZCBjaGFyIEIxOworICBpZiAobV9CID09IDB4ZmYpIHsKKyAgICBCMSA9IG1fcFN0cmVhbS0+Z2V0TmV4dEJ5dGVfYXJpdGgoKTsKKyAgICBpZiAoQjEgPiAweDhmKSB7CisgICAgICBtX0NUID0gODsKKyAgICB9IGVsc2UgeworICAgICAgbV9wU3RyZWFtLT5pbmNCeXRlSWR4KCk7CisgICAgICBtX0IgPSBCMTsKKyAgICAgIG1fQyA9IG1fQyArIDB4ZmUwMCAtIChtX0IgPDwgOSk7CisgICAgICBtX0NUID0gNzsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbV9wU3RyZWFtLT5pbmNCeXRlSWR4KCk7CisgICAgbV9CID0gbV9wU3RyZWFtLT5nZXRDdXJCeXRlX2FyaXRoKCk7CisgICAgbV9DID0gbV9DICsgMHhmZjAwIC0gKG1fQiA8PCA4KTsKKyAgICBtX0NUID0gODsKKyAgfQorfQorCit2b2lkIENKQmlnMl9Bcml0aERlY29kZXI6OlJlYWRWYWx1ZUEoKSB7CisgIGRvIHsKKyAgICBpZiAobV9DVCA9PSAwKQorICAgICAgQllURUlOKCk7CisgICAgbV9BIDw8PSAxOworICAgIG1fQyA8PD0gMTsKKyAgICAtLW1fQ1Q7CisgIH0gd2hpbGUgKChtX0EgJiBrRGVmYXVsdEFWYWx1ZSkgPT0gMCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0FyaXRoRGVjb2Rlci5oIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Bcml0aERlY29kZXIuaAppbmRleCAzM2JiZTM5Li4zY2I5NWFjIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0FyaXRoRGVjb2Rlci5oCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQXJpdGhEZWNvZGVyLmgKQEAgLTEsMTMwICsxLDM4IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpZm5kZWYgX0pCSUcyX0FSSVRITUVUSUNfREVDT0RFUl9IXwotI2RlZmluZSBfSkJJRzJfQVJJVEhNRVRJQ19ERUNPREVSX0hfCi0jaW5jbHVkZSAiSkJpZzJfRGVmaW5lLmgiCi0jaW5jbHVkZSAiSkJpZzJfQml0U3RyZWFtLmgiCi0jaW5jbHVkZSAiSkJpZzJfQXJpdGhRZS5oIgotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVuc2lnbmVkIGludCBNUFM7Ci0gICAgdW5zaWduZWQgaW50IEk7Ci19IEpCaWcyQXJpdGhDdHg7Ci1jbGFzcyBDSkJpZzJfQXJpdGhEZWNvZGVyIDogcHVibGljIENKQmlnMl9PYmplY3QKLXsKLXB1YmxpYzoKKyNpZm5kZWYgQ09SRV9TUkNfRlhDT0RFQ19KQklHMl9KQklHMl9BUklUSERFQ09ERVJfSF8KKyNkZWZpbmUgQ09SRV9TUkNfRlhDT0RFQ19KQklHMl9KQklHMl9BUklUSERFQ09ERVJfSF8KIAotICAgIENKQmlnMl9Bcml0aERlY29kZXIoQ0pCaWcyX0JpdFN0cmVhbSAqcFN0cmVhbSk7CitjbGFzcyBDSkJpZzJfQml0U3RyZWFtOwogCi0gICAgfkNKQmlnMl9Bcml0aERlY29kZXIoKTsKK3N0cnVjdCBKQmlnMkFyaXRoQ3R4IHsKKyAgSkJpZzJBcml0aEN0eCgpIDogTVBTKDApLCBJKDApIHt9CiAKLSAgICBpbnQgREVDT0RFKEpCaWcyQXJpdGhDdHggKnBDWCk7Ci1wcml2YXRlOgotCi0gICAgdm9pZCBJTklUREVDKCk7Ci0KLSAgICB2b2lkIEJZVEVJTigpOwotICAgIHVuc2lnbmVkIGNoYXIgQjsKLSAgICB1bnNpZ25lZCBpbnQgQzsKLSAgICB1bnNpZ25lZCBpbnQgQTsKLSAgICB1bnNpZ25lZCBpbnQgQ1Q7Ci0gICAgQ0pCaWcyX0JpdFN0cmVhbSAqbV9wU3RyZWFtOworICB1bnNpZ25lZCBpbnQgTVBTOworICB1bnNpZ25lZCBpbnQgSTsKIH07Ci1pbmxpbmUgQ0pCaWcyX0FyaXRoRGVjb2Rlcjo6Q0pCaWcyX0FyaXRoRGVjb2RlcihDSkJpZzJfQml0U3RyZWFtICpwU3RyZWFtKQotewotICAgIG1fcFN0cmVhbSA9IHBTdHJlYW07Ci0gICAgSU5JVERFQygpOwotfQotaW5saW5lIENKQmlnMl9Bcml0aERlY29kZXI6On5DSkJpZzJfQXJpdGhEZWNvZGVyKCkKLXsKLX0KLWlubGluZSB2b2lkIENKQmlnMl9Bcml0aERlY29kZXI6OklOSVRERUMoKQotewotICAgIEIgPSBtX3BTdHJlYW0tPmdldEN1ckJ5dGVfYXJpdGgoKTsKLSAgICBDID0gKEIgXiAweGZmKSA8PCAxNjs7Ci0gICAgQllURUlOKCk7Ci0gICAgQyA9IEMgPDwgNzsKLSAgICBDVCA9IENUIC0gNzsKLSAgICBBID0gMHg4MDAwOwotfQotaW5saW5lIHZvaWQgQ0pCaWcyX0FyaXRoRGVjb2Rlcjo6QllURUlOKCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyIEIxOwotICAgIGlmKEIgPT0gMHhmZikgewotICAgICAgICBCMSA9IG1fcFN0cmVhbS0+Z2V0TmV4dEJ5dGVfYXJpdGgoKTsKLSAgICAgICAgaWYoQjEgPiAweDhmKSB7Ci0gICAgICAgICAgICBDVCA9IDg7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX3BTdHJlYW0tPmluY0J5dGVJZHgoKTsKLSAgICAgICAgICAgIEIgPSBCMTsKLSAgICAgICAgICAgIEMgPSBDICsgMHhmZTAwIC0gKEIgPDwgOSk7Ci0gICAgICAgICAgICBDVCA9IDc7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtX3BTdHJlYW0tPmluY0J5dGVJZHgoKTsKLSAgICAgICAgQiA9IG1fcFN0cmVhbS0+Z2V0Q3VyQnl0ZV9hcml0aCgpOwotICAgICAgICBDID0gQyArIDB4ZmYwMCAtIChCIDw8IDgpOwotICAgICAgICBDVCA9IDg7Ci0gICAgfQotfQotaW5saW5lIGludCBDSkJpZzJfQXJpdGhEZWNvZGVyOjpERUNPREUoSkJpZzJBcml0aEN0eCAqcENYKQotewotICAgIGlmICghcENYIHx8IHBDWC0+SSA+PSBKQklHMl9RRV9OVU0pIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQogCi0gICAgaW50IEQ7Ci0gICAgY29uc3QgSkJpZzJBcml0aFFlICogcWUgPSAmUWVUYWJsZVtwQ1gtPkldOwotICAgIEEgPSBBIC0gcWUtPlFlOwotICAgIGlmKChDID4+IDE2KSA8IEEpIHsKLSAgICAgICAgaWYoQSAmIDB4ODAwMCkgewotICAgICAgICAgICAgRCA9IHBDWC0+TVBTOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYoQSA8IHFlLT5RZSkgewotICAgICAgICAgICAgICAgIEQgPSAxIC0gcENYLT5NUFM7Ci0gICAgICAgICAgICAgICAgaWYocWUtPm5Td2l0Y2ggPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBwQ1gtPk1QUyA9IDEgLSBwQ1gtPk1QUzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcENYLT5JID0gcWUtPk5MUFM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEQgPSBwQ1gtPk1QUzsKLSAgICAgICAgICAgICAgICBwQ1gtPkkgPSBxZS0+Tk1QUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpZiAoQ1QgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBCWVRFSU4oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQSA8PD0gMTsKLSAgICAgICAgICAgICAgICBDIDw8PSAxOwotICAgICAgICAgICAgICAgIENULS07Ci0gICAgICAgICAgICB9IHdoaWxlICgoQSAmIDB4ODAwMCkgPT0gMCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBDIC09IEEgPDwgMTY7Ci0gICAgICAgIGlmKEEgPCBxZS0+UWUpIHsKLSAgICAgICAgICAgIEEgPSBxZS0+UWU7Ci0gICAgICAgICAgICBEID0gcENYLT5NUFM7Ci0gICAgICAgICAgICBwQ1gtPkkgPSBxZS0+Tk1QUzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEEgPSBxZS0+UWU7Ci0gICAgICAgICAgICBEID0gMSAtIHBDWC0+TVBTOwotICAgICAgICAgICAgaWYocWUtPm5Td2l0Y2ggPT0gMSkgewotICAgICAgICAgICAgICAgIHBDWC0+TVBTID0gMSAtIHBDWC0+TVBTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcENYLT5JID0gcWUtPk5MUFM7Ci0gICAgICAgIH0KLSAgICAgICAgZG8gewotICAgICAgICAgICAgaWYgKENUID09IDApIHsKLSAgICAgICAgICAgICAgICBCWVRFSU4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEEgPDw9IDE7Ci0gICAgICAgICAgICBDIDw8PSAxOwotICAgICAgICAgICAgQ1QtLTsKLSAgICAgICAgfSB3aGlsZSAoKEEgJiAweDgwMDApID09IDApOwotICAgIH0KLSAgICByZXR1cm4gRDsKLX0KLSNlbmRpZgorY2xhc3MgQ0pCaWcyX0FyaXRoRGVjb2RlciB7CisgcHVibGljOgorICBleHBsaWNpdCBDSkJpZzJfQXJpdGhEZWNvZGVyKENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0pOworCisgIH5DSkJpZzJfQXJpdGhEZWNvZGVyKCk7CisKKyAgaW50IERFQ09ERShKQmlnMkFyaXRoQ3R4KiBwQ1gpOworCisgcHJpdmF0ZToKKyAgdm9pZCBCWVRFSU4oKTsKKyAgdm9pZCBSZWFkVmFsdWVBKCk7CisKKyAgdW5zaWduZWQgY2hhciBtX0I7CisgIHVuc2lnbmVkIGludCBtX0M7CisgIHVuc2lnbmVkIGludCBtX0E7CisgIHVuc2lnbmVkIGludCBtX0NUOworICBDSkJpZzJfQml0U3RyZWFtKiBjb25zdCBtX3BTdHJlYW07Cit9OworCisjZW5kaWYgIC8vIENPUkVfU1JDX0ZYQ09ERUNfSkJJRzJfSkJJRzJfQVJJVEhERUNPREVSX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0FyaXRoSW50RGVjb2Rlci5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0FyaXRoSW50RGVjb2Rlci5jcHAKaW5kZXggMWUxMTU4NC4uNmVlMjU1YSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Bcml0aEludERlY29kZXIuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQXJpdGhJbnREZWNvZGVyLmNwcApAQCAtMSwxMDUgKzEsOTcgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2luY2x1ZGUgIkpCaWcyX0FyaXRoSW50RGVjb2Rlci5oIgotQ0pCaWcyX0FyaXRoSW50RGVjb2Rlcjo6Q0pCaWcyX0FyaXRoSW50RGVjb2RlcigpCi17Ci0gICAgSUF4ID0gKEpCaWcyQXJpdGhDdHgqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoSkJpZzJBcml0aEN0eCksIDUxMik7Ci0gICAgSkJJRzJfbWVtc2V0KElBeCwgMCwgc2l6ZW9mKEpCaWcyQXJpdGhDdHgpICogNTEyKTsKKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgorCituYW1lc3BhY2UgeworCitpbnQgU2hpZnRPcihpbnQgdmFsLCBpbnQgYml0d2lzZV9vcl92YWwpIHsKKyAgcmV0dXJuICh2YWwgPDwgMSkgfCBiaXR3aXNlX29yX3ZhbDsKIH0KLUNKQmlnMl9Bcml0aEludERlY29kZXI6On5DSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkKLXsKLSAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoSUF4KTsKKworY29uc3Qgc3RydWN0IEFyaXRoSW50RGVjb2RlRGF0YSB7CisgIGludCBuTmVlZEJpdHM7CisgIGludCBuVmFsdWU7Cit9IGdfQXJpdGhJbnREZWNvZGVEYXRhW10gPSB7CisgICAgezIsIDB9LAorICAgIHs0LCA0fSwKKyAgICB7NiwgMjB9LAorICAgIHs4LCA4NH0sCisgICAgezEyLCAzNDB9LAorICAgIHszMiwgNDQzNn0sCit9OworCitzaXplX3QgUmVjdXJzaXZlRGVjb2RlKENKQmlnMl9Bcml0aERlY29kZXIqIGRlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEpCaWcyQXJpdGhDdHg+KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHByZXYsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkZXB0aCkgeworICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtEZXB0aEVuZCA9IEZYX0FycmF5U2l6ZShnX0FyaXRoSW50RGVjb2RlRGF0YSkgLSAxOworICBpZiAoZGVwdGggPT0ga0RlcHRoRW5kKQorICAgIHJldHVybiBrRGVwdGhFbmQ7CisKKyAgSkJpZzJBcml0aEN0eCogcENYID0gJigqY29udGV4dClbKnByZXZdOworICBpbnQgRCA9IGRlY29kZXItPkRFQ09ERShwQ1gpOworICAqcHJldiA9IFNoaWZ0T3IoKnByZXYsIEQpOworICBpZiAoIUQpCisgICAgcmV0dXJuIGRlcHRoOworICByZXR1cm4gUmVjdXJzaXZlRGVjb2RlKGRlY29kZXIsIGNvbnRleHQsIHByZXYsIGRlcHRoICsgMSk7CiB9Ci1pbnQgQ0pCaWcyX0FyaXRoSW50RGVjb2Rlcjo6ZGVjb2RlKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIGludCAqblJlc3VsdCkKLXsKLSAgICBpbnQgUFJFViwgVjsKLSAgICBpbnQgUywgRDsKLSAgICBpbnQgbk5lZWRCaXRzLCBuVGVtcCwgaTsKLSAgICBQUkVWID0gMTsKLSAgICBTID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKElBeCArIFBSRVYpOwotICAgIFBSRVYgPSAoUFJFViA8PCAxKSB8IFM7Ci0gICAgRCA9IHBBcml0aERlY29kZXItPkRFQ09ERShJQXggKyBQUkVWKTsKLSAgICBQUkVWID0gKFBSRVYgPDwgMSkgfCBEOwotICAgIGlmKEQpIHsKLSAgICAgICAgRCA9IHBBcml0aERlY29kZXItPkRFQ09ERShJQXggKyBQUkVWKTsKLSAgICAgICAgUFJFViA9IChQUkVWIDw8IDEpIHwgRDsKLSAgICAgICAgaWYoRCkgewotICAgICAgICAgICAgRCA9IHBBcml0aERlY29kZXItPkRFQ09ERShJQXggKyBQUkVWKTsKLSAgICAgICAgICAgIFBSRVYgPSAoUFJFViA8PCAxKSB8IEQ7Ci0gICAgICAgICAgICBpZihEKSB7Ci0gICAgICAgICAgICAgICAgRCA9IHBBcml0aERlY29kZXItPkRFQ09ERShJQXggKyBQUkVWKTsKLSAgICAgICAgICAgICAgICBQUkVWID0gKFBSRVYgPDwgMSkgfCBEOwotICAgICAgICAgICAgICAgIGlmKEQpIHsKLSAgICAgICAgICAgICAgICAgICAgRCA9IHBBcml0aERlY29kZXItPkRFQ09ERShJQXggKyBQUkVWKTsKLSAgICAgICAgICAgICAgICAgICAgUFJFViA9IChQUkVWIDw8IDEpIHwgRDsKLSAgICAgICAgICAgICAgICAgICAgaWYoRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbk5lZWRCaXRzID0gMzI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBWID0gNDQzNjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5OZWVkQml0cyA9IDEyOwotICAgICAgICAgICAgICAgICAgICAgICAgViA9IDM0MDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5OZWVkQml0cyA9IDg7Ci0gICAgICAgICAgICAgICAgICAgIFYgPSA4NDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5OZWVkQml0cyA9IDY7Ci0gICAgICAgICAgICAgICAgViA9IDIwOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbk5lZWRCaXRzID0gNDsKLSAgICAgICAgICAgIFYgPSA0OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbk5lZWRCaXRzID0gMjsKLSAgICAgICAgViA9IDA7Ci0gICAgfQotICAgIG5UZW1wID0gMDsKLSAgICBmb3IoaSA9IDA7IGkgPCBuTmVlZEJpdHM7IGkrKykgewotICAgICAgICBEID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKElBeCArIFBSRVYpOwotICAgICAgICBpZihQUkVWIDwgMjU2KSB7Ci0gICAgICAgICAgICBQUkVWID0gKFBSRVYgPDwgMSkgfCBEOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgUFJFViA9ICgoKFBSRVYgPDwgMSkgfCBEKSAmIDUxMSkgfCAyNTY7Ci0gICAgICAgIH0KLSAgICAgICAgblRlbXAgPSAoblRlbXAgPDwgMSkgfCBEOwotICAgIH0KLSAgICBWICs9IG5UZW1wOwotICAgIGlmKFMgPT0gMSAmJiBWID4gMCkgewotICAgICAgICBWID0gLVY7Ci0gICAgfQotICAgICpuUmVzdWx0ID0gVjsKLSAgICBpZihTID09IDEgJiYgViA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBKQklHMl9PT0I7Ci0gICAgfQotICAgIHJldHVybiAwOworCit9ICAvLyBuYW1lc3BhY2UKKworQ0pCaWcyX0FyaXRoSW50RGVjb2Rlcjo6Q0pCaWcyX0FyaXRoSW50RGVjb2RlcigpIHsKKyAgbV9JQXgucmVzaXplKDUxMik7CiB9CisKK0NKQmlnMl9Bcml0aEludERlY29kZXI6On5DSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkgeworfQorCitib29sIENKQmlnMl9Bcml0aEludERlY29kZXI6OmRlY29kZShDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBuUmVzdWx0KSB7CisgIGludCBQUkVWID0gMTsKKyAgY29uc3QgaW50IFMgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJm1fSUF4W1BSRVZdKTsKKyAgUFJFViA9IFNoaWZ0T3IoUFJFViwgUyk7CisKKyAgY29uc3Qgc2l6ZV90IG5EZWNvZGVEYXRhSW5kZXggPQorICAgICAgUmVjdXJzaXZlRGVjb2RlKHBBcml0aERlY29kZXIsICZtX0lBeCwgJlBSRVYsIDApOworCisgIGludCBuVGVtcCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19Bcml0aEludERlY29kZURhdGFbbkRlY29kZURhdGFJbmRleF0ubk5lZWRCaXRzOyArK2kpIHsKKyAgICBpbnQgRCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmbV9JQXhbUFJFVl0pOworICAgIFBSRVYgPSBTaGlmdE9yKFBSRVYsIEQpOworICAgIGlmIChQUkVWID49IDI1NikKKyAgICAgIFBSRVYgPSAoUFJFViAmIDUxMSkgfCAyNTY7CisgICAgblRlbXAgPSBTaGlmdE9yKG5UZW1wLCBEKTsKKyAgfQorICBpbnQgblZhbHVlID0gZ19Bcml0aEludERlY29kZURhdGFbbkRlY29kZURhdGFJbmRleF0ublZhbHVlOworICBuVmFsdWUgKz0gblRlbXA7CisgIGlmIChTID09IDEgJiYgblZhbHVlID4gMCkKKyAgICBuVmFsdWUgPSAtblZhbHVlOworCisgICpuUmVzdWx0ID0gblZhbHVlOworICByZXR1cm4gUyAhPSAxIHx8IG5WYWx1ZSAhPSAwOworfQorCiBDSkJpZzJfQXJpdGhJYWlkRGVjb2Rlcjo6Q0pCaWcyX0FyaXRoSWFpZERlY29kZXIodW5zaWduZWQgY2hhciBTQlNZTUNPREVMRU5BKQotewotICAgIFNCU1lNQ09ERUxFTiA9IFNCU1lNQ09ERUxFTkE7Ci0gICAgSUFJRCA9IChKQmlnMkFyaXRoQ3R4KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKEpCaWcyQXJpdGhDdHgpLCAoMSA8PCBTQlNZTUNPREVMRU4pKTsKLSAgICBKQklHMl9tZW1zZXQoSUFJRCwgMCwgc2l6ZW9mKEpCaWcyQXJpdGhDdHgpICogKGludCkoMSA8PCBTQlNZTUNPREVMRU4pKTsKKyAgICA6IFNCU1lNQ09ERUxFTihTQlNZTUNPREVMRU5BKSB7CisgIG1fSUFJRC5yZXNpemUoMSA8PCBTQlNZTUNPREVMRU4pOwogfQotQ0pCaWcyX0FyaXRoSWFpZERlY29kZXI6On5DSkJpZzJfQXJpdGhJYWlkRGVjb2RlcigpCi17Ci0gICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKElBSUQpOworCitDSkJpZzJfQXJpdGhJYWlkRGVjb2Rlcjo6fkNKQmlnMl9Bcml0aElhaWREZWNvZGVyKCkgewogfQotaW50IENKQmlnMl9Bcml0aElhaWREZWNvZGVyOjpkZWNvZGUoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgaW50ICpuUmVzdWx0KQotewotICAgIGludCBQUkVWOwotICAgIGludCBEOwotICAgIGludCBpOwotICAgIFBSRVYgPSAxOwotICAgIGZvcihpID0gMDsgaSA8IFNCU1lNQ09ERUxFTjsgaSsrKSB7Ci0gICAgICAgIEQgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoSUFJRCArIFBSRVYpOwotICAgICAgICBQUkVWID0gKFBSRVYgPDwgMSkgfCBEOwotICAgIH0KLSAgICBQUkVWID0gUFJFViAtICgxIDw8IFNCU1lNQ09ERUxFTik7Ci0gICAgKm5SZXN1bHQgPSBQUkVWOwotICAgIHJldHVybiAwOworCit2b2lkIENKQmlnMl9Bcml0aElhaWREZWNvZGVyOjpkZWNvZGUoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogblJlc3VsdCkgeworICBpbnQgUFJFViA9IDE7CisgIGZvciAodW5zaWduZWQgY2hhciBpID0gMDsgaSA8IFNCU1lNQ09ERUxFTjsgKytpKSB7CisgICAgSkJpZzJBcml0aEN0eCogcENYID0gJm1fSUFJRFtQUkVWXTsKKyAgICBpbnQgRCA9IHBBcml0aERlY29kZXItPkRFQ09ERShwQ1gpOworICAgIFBSRVYgPSBTaGlmdE9yKFBSRVYsIEQpOworICB9CisgICpuUmVzdWx0ID0gUFJFViAtICgxIDw8IFNCU1lNQ09ERUxFTik7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0FyaXRoSW50RGVjb2Rlci5oIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Bcml0aEludERlY29kZXIuaAppbmRleCA0ZWExMDRjLi5kYzNjYjExIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0FyaXRoSW50RGVjb2Rlci5oCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQXJpdGhJbnREZWNvZGVyLmgKQEAgLTEsMzkgKzEsNDEgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2lmbmRlZiBfSkJJRzJfQVJJVEhfSU5UX0RFQ09ERVJfSF8KLSNkZWZpbmUgX0pCSUcyX0FSSVRIX0lOVF9ERUNPREVSX0hfCi0jaW5jbHVkZSAiSkJpZzJfTW9kdWxlLmgiCisjaWZuZGVmIENPUkVfU1JDX0ZYQ09ERUNfSkJJRzJfSkJJRzJfQVJJVEhJTlRERUNPREVSX0hfCisjZGVmaW5lIENPUkVfU1JDX0ZYQ09ERUNfSkJJRzJfSkJJRzJfQVJJVEhJTlRERUNPREVSX0hfCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKICNpbmNsdWRlICJKQmlnMl9Bcml0aERlY29kZXIuaCIKLWNsYXNzIENKQmlnMl9Bcml0aEludERlY29kZXIgOiBwdWJsaWMgQ0pCaWcyX09iamVjdAotewotcHVibGljOgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaCIKIAotICAgIENKQmlnMl9Bcml0aEludERlY29kZXIoKTsKK2NsYXNzIENKQmlnMl9Bcml0aEludERlY29kZXIgeworIHB1YmxpYzoKKyAgQ0pCaWcyX0FyaXRoSW50RGVjb2RlcigpOworICB+Q0pCaWcyX0FyaXRoSW50RGVjb2RlcigpOwogCi0gICAgfkNKQmlnMl9Bcml0aEludERlY29kZXIoKTsKKyAgLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGFuZCBmYWxzZSB3aGVuIGFuIE9PQiBjb25kaXRpb24gb2NjdXJzLiBNYW55CisgIC8vIGNhbGxlcnMgY2FuIHRvbGVyYXRlIE9PQiBhbmQgZG8gbm90IGNoZWNrIHRoZSByZXR1cm4gdmFsdWUuCisgIGJvb2wgZGVjb2RlKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsIGludCogblJlc3VsdCk7CiAKLSAgICBpbnQgZGVjb2RlKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIGludCAqblJlc3VsdCk7Ci1wcml2YXRlOgotCi0gICAgSkJpZzJBcml0aEN0eCAqSUF4OworIHByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPEpCaWcyQXJpdGhDdHg+IG1fSUF4OwogfTsKLWNsYXNzIENKQmlnMl9Bcml0aElhaWREZWNvZGVyIDogcHVibGljIENKQmlnMl9PYmplY3QKLXsKLXB1YmxpYzoKIAotICAgIENKQmlnMl9Bcml0aElhaWREZWNvZGVyKHVuc2lnbmVkIGNoYXIgU0JTWU1DT0RFTEVOQSk7CitjbGFzcyBDSkJpZzJfQXJpdGhJYWlkRGVjb2RlciB7CisgcHVibGljOgorICBleHBsaWNpdCBDSkJpZzJfQXJpdGhJYWlkRGVjb2Rlcih1bnNpZ25lZCBjaGFyIFNCU1lNQ09ERUxFTkEpOworICB+Q0pCaWcyX0FyaXRoSWFpZERlY29kZXIoKTsKIAotICAgIH5DSkJpZzJfQXJpdGhJYWlkRGVjb2RlcigpOworICB2b2lkIGRlY29kZShDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLCBGWF9EV09SRCogblJlc3VsdCk7CiAKLSAgICBpbnQgZGVjb2RlKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIGludCAqblJlc3VsdCk7Ci1wcml2YXRlOgorIHByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPEpCaWcyQXJpdGhDdHg+IG1fSUFJRDsKIAotICAgIEpCaWcyQXJpdGhDdHggKklBSUQ7Ci0KLSAgICB1bnNpZ25lZCBjaGFyIFNCU1lNQ09ERUxFTjsKKyAgY29uc3QgdW5zaWduZWQgY2hhciBTQlNZTUNPREVMRU47CiB9OwotI2VuZGlmCisKKyNlbmRpZiAgLy8gQ09SRV9TUkNfRlhDT0RFQ19KQklHMl9KQklHMl9BUklUSElOVERFQ09ERVJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQXJpdGhRZS5oIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Bcml0aFFlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNzIzYmUuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Bcml0aFFlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIF9KQklHMl9BUklUSF9RRV9IXwotI2RlZmluZSBfSkJJRzJfQVJJVEhfUUVfSF8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bnNpZ25lZCBpbnQgUWU7Ci0gICAgdW5zaWduZWQgaW50IE5NUFM7Ci0gICAgdW5zaWduZWQgaW50IE5MUFM7Ci0gICAgdW5zaWduZWQgaW50IG5Td2l0Y2g7Ci19IEpCaWcyQXJpdGhRZTsKLWV4dGVybiBjb25zdCBKQmlnMkFyaXRoUWUgUWVUYWJsZVtdOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBKQklHMl9RRV9OVU07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQml0U3RyZWFtLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQml0U3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmIxZTY0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9CaXRTdHJlYW0uY3BwCkBAIC0wLDAgKzEsMTg5IEBACisvLyBDb3B5cmlnaHQgMjAxNSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJKQmlnMl9CaXRTdHJlYW0uaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfb2JqZWN0cy5oIgorCitDSkJpZzJfQml0U3RyZWFtOjpDSkJpZzJfQml0U3RyZWFtKENQREZfU3RyZWFtQWNjKiBwU3JjU3RyZWFtKQorICAgIDogbV9wQnVmKHBTcmNTdHJlYW0tPkdldERhdGEoKSksCisgICAgICBtX2R3TGVuZ3RoKHBTcmNTdHJlYW0tPkdldFNpemUoKSksCisgICAgICBtX2R3Qnl0ZUlkeCgwKSwKKyAgICAgIG1fZHdCaXRJZHgoMCksCisgICAgICBtX2R3T2JqTnVtKHBTcmNTdHJlYW0tPkdldFN0cmVhbSgpID8gcFNyY1N0cmVhbS0+R2V0U3RyZWFtKCktPkdldE9iak51bSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMCkgeworICBpZiAobV9kd0xlbmd0aCA+IDI1NiAqIDEwMjQgKiAxMDI0KSB7CisgICAgbV9kd0xlbmd0aCA9IDA7CisgICAgbV9wQnVmID0gbnVsbHB0cjsKKyAgfQorfQorCitDSkJpZzJfQml0U3RyZWFtOjp+Q0pCaWcyX0JpdFN0cmVhbSgpIHsKK30KKworaW50MzJfdCBDSkJpZzJfQml0U3RyZWFtOjpyZWFkTkJpdHMoRlhfRFdPUkQgZHdCaXRzLCBGWF9EV09SRCogZHdSZXN1bHQpIHsKKyAgRlhfRFdPUkQgZHdCaXRQb3MgPSBnZXRCaXRQb3MoKTsKKyAgaWYgKGR3Qml0UG9zID4gTGVuZ3RoSW5CaXRzKCkpCisgICAgcmV0dXJuIC0xOworCisgICpkd1Jlc3VsdCA9IDA7CisgIGlmIChkd0JpdFBvcyArIGR3Qml0cyA8PSBMZW5ndGhJbkJpdHMoKSkKKyAgICBkd0JpdFBvcyA9IGR3Qml0czsKKyAgZWxzZQorICAgIGR3Qml0UG9zID0gTGVuZ3RoSW5CaXRzKCkgLSBkd0JpdFBvczsKKworICBmb3IgKDsgZHdCaXRQb3MgPiAwOyAtLWR3Qml0UG9zKSB7CisgICAgKmR3UmVzdWx0ID0KKyAgICAgICAgKCpkd1Jlc3VsdCA8PCAxKSB8ICgobV9wQnVmW21fZHdCeXRlSWR4XSA+PiAoNyAtIG1fZHdCaXRJZHgpKSAmIDB4MDEpOworICAgIEFkdmFuY2VCaXQoKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50MzJfdCBDSkJpZzJfQml0U3RyZWFtOjpyZWFkTkJpdHMoRlhfRFdPUkQgZHdCaXRzLCBpbnQzMl90KiBuUmVzdWx0KSB7CisgIEZYX0RXT1JEIGR3Qml0UG9zID0gZ2V0Qml0UG9zKCk7CisgIGlmIChkd0JpdFBvcyA+IExlbmd0aEluQml0cygpKQorICAgIHJldHVybiAtMTsKKworICAqblJlc3VsdCA9IDA7CisgIGlmIChkd0JpdFBvcyArIGR3Qml0cyA8PSBMZW5ndGhJbkJpdHMoKSkKKyAgICBkd0JpdFBvcyA9IGR3Qml0czsKKyAgZWxzZQorICAgIGR3Qml0UG9zID0gTGVuZ3RoSW5CaXRzKCkgLSBkd0JpdFBvczsKKworICBmb3IgKDsgZHdCaXRQb3MgPiAwOyAtLWR3Qml0UG9zKSB7CisgICAgKm5SZXN1bHQgPQorICAgICAgICAoKm5SZXN1bHQgPDwgMSkgfCAoKG1fcEJ1ZlttX2R3Qnl0ZUlkeF0gPj4gKDcgLSBtX2R3Qml0SWR4KSkgJiAweDAxKTsKKyAgICBBZHZhbmNlQml0KCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludDMyX3QgQ0pCaWcyX0JpdFN0cmVhbTo6cmVhZDFCaXQoRlhfRFdPUkQqIGR3UmVzdWx0KSB7CisgIGlmICghSXNJbkJvdW5kKCkpCisgICAgcmV0dXJuIC0xOworCisgICpkd1Jlc3VsdCA9IChtX3BCdWZbbV9kd0J5dGVJZHhdID4+ICg3IC0gbV9kd0JpdElkeCkpICYgMHgwMTsKKyAgQWR2YW5jZUJpdCgpOworICByZXR1cm4gMDsKK30KKworaW50MzJfdCBDSkJpZzJfQml0U3RyZWFtOjpyZWFkMUJpdChGWF9CT09MKiBiUmVzdWx0KSB7CisgIGlmICghSXNJbkJvdW5kKCkpCisgICAgcmV0dXJuIC0xOworCisgICpiUmVzdWx0ID0gKG1fcEJ1ZlttX2R3Qnl0ZUlkeF0gPj4gKDcgLSBtX2R3Qml0SWR4KSkgJiAweDAxOworICBBZHZhbmNlQml0KCk7CisgIHJldHVybiAwOworfQorCitpbnQzMl90IENKQmlnMl9CaXRTdHJlYW06OnJlYWQxQnl0ZSh1aW50OF90KiBjUmVzdWx0KSB7CisgIGlmICghSXNJbkJvdW5kKCkpCisgICAgcmV0dXJuIC0xOworCisgICpjUmVzdWx0ID0gbV9wQnVmW21fZHdCeXRlSWR4XTsKKyAgKyttX2R3Qnl0ZUlkeDsKKyAgcmV0dXJuIDA7Cit9CisKK2ludDMyX3QgQ0pCaWcyX0JpdFN0cmVhbTo6cmVhZEludGVnZXIoRlhfRFdPUkQqIGR3UmVzdWx0KSB7CisgIGlmIChtX2R3Qnl0ZUlkeCArIDMgPj0gbV9kd0xlbmd0aCkKKyAgICByZXR1cm4gLTE7CisKKyAgKmR3UmVzdWx0ID0gKG1fcEJ1ZlttX2R3Qnl0ZUlkeF0gPDwgMjQpIHwgKG1fcEJ1ZlttX2R3Qnl0ZUlkeCArIDFdIDw8IDE2KSB8CisgICAgICAgICAgICAgIChtX3BCdWZbbV9kd0J5dGVJZHggKyAyXSA8PCA4KSB8IG1fcEJ1ZlttX2R3Qnl0ZUlkeCArIDNdOworICBtX2R3Qnl0ZUlkeCArPSA0OworICByZXR1cm4gMDsKK30KKworaW50MzJfdCBDSkJpZzJfQml0U3RyZWFtOjpyZWFkU2hvcnRJbnRlZ2VyKEZYX1dPUkQqIGR3UmVzdWx0KSB7CisgIGlmIChtX2R3Qnl0ZUlkeCArIDEgPj0gbV9kd0xlbmd0aCkKKyAgICByZXR1cm4gLTE7CisKKyAgKmR3UmVzdWx0ID0gKG1fcEJ1ZlttX2R3Qnl0ZUlkeF0gPDwgOCkgfCBtX3BCdWZbbV9kd0J5dGVJZHggKyAxXTsKKyAgbV9kd0J5dGVJZHggKz0gMjsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgQ0pCaWcyX0JpdFN0cmVhbTo6YWxpZ25CeXRlKCkgeworICBpZiAobV9kd0JpdElkeCAhPSAwKSB7CisgICAgKyttX2R3Qnl0ZUlkeDsKKyAgICBtX2R3Qml0SWR4ID0gMDsKKyAgfQorfQorCit1aW50OF90IENKQmlnMl9CaXRTdHJlYW06OmdldEN1ckJ5dGUoKSBjb25zdCB7CisgIHJldHVybiBJc0luQm91bmQoKSA/IG1fcEJ1ZlttX2R3Qnl0ZUlkeF0gOiAwOworfQorCit2b2lkIENKQmlnMl9CaXRTdHJlYW06OmluY0J5dGVJZHgoKSB7CisgIGlmIChJc0luQm91bmQoKSkKKyAgICArK21fZHdCeXRlSWR4OworfQorCit1aW50OF90IENKQmlnMl9CaXRTdHJlYW06OmdldEN1ckJ5dGVfYXJpdGgoKSBjb25zdCB7CisgIHJldHVybiBJc0luQm91bmQoKSA/IG1fcEJ1ZlttX2R3Qnl0ZUlkeF0gOiAweEZGOworfQorCit1aW50OF90IENKQmlnMl9CaXRTdHJlYW06OmdldE5leHRCeXRlX2FyaXRoKCkgY29uc3QgeworICByZXR1cm4gbV9kd0J5dGVJZHggKyAxIDwgbV9kd0xlbmd0aCA/IG1fcEJ1ZlttX2R3Qnl0ZUlkeCArIDFdIDogMHhGRjsKK30KKworRlhfRFdPUkQgQ0pCaWcyX0JpdFN0cmVhbTo6Z2V0T2Zmc2V0KCkgY29uc3QgeworICByZXR1cm4gbV9kd0J5dGVJZHg7Cit9CisKK3ZvaWQgQ0pCaWcyX0JpdFN0cmVhbTo6c2V0T2Zmc2V0KEZYX0RXT1JEIGR3T2Zmc2V0KSB7CisgIG1fZHdCeXRlSWR4ID0gc3RkOjptaW4oZHdPZmZzZXQsIG1fZHdMZW5ndGgpOworfQorCitGWF9EV09SRCBDSkJpZzJfQml0U3RyZWFtOjpnZXRCaXRQb3MoKSBjb25zdCB7CisgIHJldHVybiAobV9kd0J5dGVJZHggPDwgMykgKyBtX2R3Qml0SWR4OworfQorCit2b2lkIENKQmlnMl9CaXRTdHJlYW06OnNldEJpdFBvcyhGWF9EV09SRCBkd0JpdFBvcykgeworICBtX2R3Qnl0ZUlkeCA9IGR3Qml0UG9zID4+IDM7CisgIG1fZHdCaXRJZHggPSBkd0JpdFBvcyAmIDc7Cit9CisKK2NvbnN0IHVpbnQ4X3QqIENKQmlnMl9CaXRTdHJlYW06OmdldEJ1ZigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEJ1ZjsKK30KKworY29uc3QgdWludDhfdCogQ0pCaWcyX0JpdFN0cmVhbTo6Z2V0UG9pbnRlcigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEJ1ZiArIG1fZHdCeXRlSWR4OworfQorCit2b2lkIENKQmlnMl9CaXRTdHJlYW06Om9mZnNldChGWF9EV09SRCBkd09mZnNldCkgeworICBtX2R3Qnl0ZUlkeCArPSBkd09mZnNldDsKK30KKworRlhfRFdPUkQgQ0pCaWcyX0JpdFN0cmVhbTo6Z2V0Qnl0ZUxlZnQoKSBjb25zdCB7CisgIHJldHVybiBtX2R3TGVuZ3RoIC0gbV9kd0J5dGVJZHg7Cit9CisKK3ZvaWQgQ0pCaWcyX0JpdFN0cmVhbTo6QWR2YW5jZUJpdCgpIHsKKyAgaWYgKG1fZHdCaXRJZHggPT0gNykgeworICAgICsrbV9kd0J5dGVJZHg7CisgICAgbV9kd0JpdElkeCA9IDA7CisgIH0gZWxzZSB7CisgICAgKyttX2R3Qml0SWR4OworICB9Cit9CisKK2Jvb2wgQ0pCaWcyX0JpdFN0cmVhbTo6SXNJbkJvdW5kKCkgY29uc3QgeworICByZXR1cm4gbV9kd0J5dGVJZHggPCBtX2R3TGVuZ3RoOworfQorCitGWF9EV09SRCBDSkJpZzJfQml0U3RyZWFtOjpMZW5ndGhJbkJpdHMoKSBjb25zdCB7CisgIHJldHVybiBtX2R3TGVuZ3RoIDw8IDM7Cit9CisKK0ZYX0RXT1JEIENKQmlnMl9CaXRTdHJlYW06OmdldE9iak51bSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fZHdPYmpOdW07Cit9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0JpdFN0cmVhbS5oIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9CaXRTdHJlYW0uaAppbmRleCA5ZDVkMjk0Li5mYzlhYThhIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0JpdFN0cmVhbS5oCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQml0U3RyZWFtLmgKQEAgLTEsMzE2ICsxLDU4IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpZm5kZWYgX0pCSUcyX0JJVF9TVFJFQU1fSF8KLSNkZWZpbmUgX0pCSUcyX0JJVF9TVFJFQU1fSF8KLSNpbmNsdWRlICJKQmlnMl9EZWZpbmUuaCIKLWNsYXNzIENKQmlnMl9CaXRTdHJlYW0gOiBwdWJsaWMgQ0pCaWcyX09iamVjdAotewotcHVibGljOgorI2lmbmRlZiBDT1JFX1NSQ19GWENPREVDX0pCSUcyX0pCSUcyX0JJVFNUUkVBTV9IXworI2RlZmluZSBDT1JFX1NSQ19GWENPREVDX0pCSUcyX0pCSUcyX0JJVFNUUkVBTV9IXwogCi0gICAgQ0pCaWcyX0JpdFN0cmVhbShGWF9CWVRFICpwQnVmZmVyLCBGWF9EV09SRCBkd0xlbmd0aCk7CisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCiAKLSAgICBDSkJpZzJfQml0U3RyZWFtKENKQmlnMl9CaXRTdHJlYW0gJmJzKTsKK2NsYXNzIENQREZfU3RyZWFtQWNjOwogCi0gICAgfkNKQmlnMl9CaXRTdHJlYW0oKTsKK2NsYXNzIENKQmlnMl9CaXRTdHJlYW0geworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pCaWcyX0JpdFN0cmVhbShDUERGX1N0cmVhbUFjYyogcFNyY1N0cmVhbSk7CisgIH5DSkJpZzJfQml0U3RyZWFtKCk7CiAKLSAgICBGWF9JTlQzMiByZWFkTkJpdHMoRlhfRFdPUkQgbkJpdHMsIEZYX0RXT1JEICpkd1Jlc3VsdCk7CisgIC8vIFRPRE8odGhlc3RpZyk6IHJlYWRGb28oKSBzaG91bGQgcmV0dXJuIGJvb2wuCisgIGludDMyX3QgcmVhZE5CaXRzKEZYX0RXT1JEIG5CaXRzLCBGWF9EV09SRCogZHdSZXN1bHQpOworICBpbnQzMl90IHJlYWROQml0cyhGWF9EV09SRCBuQml0cywgaW50MzJfdCogblJlc3VsdCk7CisgIGludDMyX3QgcmVhZDFCaXQoRlhfRFdPUkQqIGR3UmVzdWx0KTsKKyAgaW50MzJfdCByZWFkMUJpdChGWF9CT09MKiBiUmVzdWx0KTsKKyAgaW50MzJfdCByZWFkMUJ5dGUodWludDhfdCogY1Jlc3VsdCk7CisgIGludDMyX3QgcmVhZEludGVnZXIoRlhfRFdPUkQqIGR3UmVzdWx0KTsKKyAgaW50MzJfdCByZWFkU2hvcnRJbnRlZ2VyKEZYX1dPUkQqIHdSZXN1bHQpOworICB2b2lkIGFsaWduQnl0ZSgpOworICB1aW50OF90IGdldEN1ckJ5dGUoKSBjb25zdDsKKyAgdm9pZCBpbmNCeXRlSWR4KCk7CisgIHVpbnQ4X3QgZ2V0Q3VyQnl0ZV9hcml0aCgpIGNvbnN0OworICB1aW50OF90IGdldE5leHRCeXRlX2FyaXRoKCkgY29uc3Q7CisgIEZYX0RXT1JEIGdldE9mZnNldCgpIGNvbnN0OworICB2b2lkIHNldE9mZnNldChGWF9EV09SRCBkd09mZnNldCk7CisgIEZYX0RXT1JEIGdldEJpdFBvcygpIGNvbnN0OworICB2b2lkIHNldEJpdFBvcyhGWF9EV09SRCBkd0JpdFBvcyk7CisgIGNvbnN0IHVpbnQ4X3QqIGdldEJ1ZigpIGNvbnN0OworICBGWF9EV09SRCBnZXRMZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX2R3TGVuZ3RoOyB9CisgIGNvbnN0IHVpbnQ4X3QqIGdldFBvaW50ZXIoKSBjb25zdDsKKyAgdm9pZCBvZmZzZXQoRlhfRFdPUkQgZHdPZmZzZXQpOworICBGWF9EV09SRCBnZXRCeXRlTGVmdCgpIGNvbnN0OworICBGWF9EV09SRCBnZXRPYmpOdW0oKSBjb25zdDsKIAotICAgIEZYX0lOVDMyIHJlYWROQml0cyhGWF9EV09SRCBuQml0cywgRlhfSU5UMzIgKm5SZXN1bHQpOworIHByaXZhdGU6CisgIHZvaWQgQWR2YW5jZUJpdCgpOworICBib29sIElzSW5Cb3VuZCgpIGNvbnN0OworICBGWF9EV09SRCBMZW5ndGhJbkJpdHMoKSBjb25zdDsKIAotICAgIEZYX0lOVDMyIHJlYWQxQml0KEZYX0RXT1JEICpkd1Jlc3VsdCk7CisgIGNvbnN0IHVpbnQ4X3QqIG1fcEJ1ZjsKKyAgRlhfRFdPUkQgbV9kd0xlbmd0aDsKKyAgRlhfRFdPUkQgbV9kd0J5dGVJZHg7CisgIEZYX0RXT1JEIG1fZHdCaXRJZHg7CisgIGNvbnN0IEZYX0RXT1JEIG1fZHdPYmpOdW07CiAKLSAgICBGWF9JTlQzMiByZWFkMUJpdChGWF9CT09MICAqYlJlc3VsdCk7Ci0KLSAgICBGWF9JTlQzMiByZWFkMUJ5dGUoRlhfQllURSAqY1Jlc3VsdCk7Ci0KLSAgICBGWF9JTlQzMiByZWFkSW50ZWdlcihGWF9EV09SRCAqZHdSZXN1bHQpOwotCi0gICAgRlhfSU5UMzIgcmVhZFNob3J0SW50ZWdlcihGWF9XT1JEICp3UmVzdWx0KTsKLQotICAgIHZvaWQgYWxpZ25CeXRlKCk7Ci0KLSAgICB2b2lkIGFsaWduNEJ5dGUoKTsKLQotICAgIEZYX0JZVEUgZ2V0QXQoRlhfRFdPUkQgZHdPZmZzZXQpOwotCi0gICAgRlhfQllURSBnZXRDdXJCeXRlKCk7Ci0KLSAgICBGWF9CWVRFIGdldE5leHRCeXRlKCk7Ci0KLSAgICBGWF9JTlQzMiBpbmNCeXRlSWR4KCk7Ci0KLSAgICBGWF9CWVRFIGdldEN1ckJ5dGVfYXJpdGgoKTsKLQotICAgIEZYX0JZVEUgZ2V0TmV4dEJ5dGVfYXJpdGgoKTsKLQotICAgIEZYX0RXT1JEIGdldE9mZnNldCgpOwotCi0gICAgdm9pZCBzZXRPZmZzZXQoRlhfRFdPUkQgZHdPZmZzZXQpOwotCi0gICAgRlhfRFdPUkQgZ2V0Qml0UG9zKCk7Ci0KLSAgICB2b2lkIHNldEJpdFBvcyhGWF9EV09SRCBkd0JpdFBvcyk7Ci0KLSAgICBGWF9CWVRFICpnZXRCdWYoKTsKLQotICAgIEZYX0RXT1JEIGdldExlbmd0aCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9kd0xlbmd0aDsKLSAgICB9Ci0KLSAgICBGWF9CWVRFICpnZXRQb2ludGVyKCk7Ci0KLSAgICB2b2lkIG9mZnNldChGWF9EV09SRCBkd09mZnNldCk7Ci0KLSAgICBGWF9EV09SRCBnZXRCeXRlTGVmdCgpOwotcHJpdmF0ZToKLQotICAgIEZYX0JZVEUgKm1fcEJ1ZjsKLQotICAgIEZYX0RXT1JEIG1fZHdMZW5ndGg7Ci0KLSAgICBGWF9EV09SRCBtX2R3Qnl0ZUlkeDsKLQotICAgIEZYX0RXT1JEIG1fZHdCaXRJZHg7CisgIENKQmlnMl9CaXRTdHJlYW0oY29uc3QgQ0pCaWcyX0JpdFN0cmVhbSYpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBDSkJpZzJfQml0U3RyZWFtJikgPSBkZWxldGU7CiB9OwotaW5saW5lIENKQmlnMl9CaXRTdHJlYW06OkNKQmlnMl9CaXRTdHJlYW0oRlhfQllURSAqcEJ1ZmZlciwgRlhfRFdPUkQgZHdMZW5ndGgpCi17Ci0gICAgbV9wQnVmID0gcEJ1ZmZlcjsKLSAgICBtX2R3TGVuZ3RoID0gZHdMZW5ndGg7Ci0gICAgbV9kd0J5dGVJZHggPSAwOwotICAgIG1fZHdCaXRJZHggID0gMDsKLSAgICBpZiAobV9kd0xlbmd0aCA+IDI1NiAqIDEwMjQgKiAxMDI0KSB7Ci0gICAgICAgIG1fZHdMZW5ndGggPSAwOwotICAgICAgICBtX3BCdWYgPSBOVUxMOwotICAgIH0KLX0KLWlubGluZSBDSkJpZzJfQml0U3RyZWFtOjpDSkJpZzJfQml0U3RyZWFtKENKQmlnMl9CaXRTdHJlYW0gJmJzKQotewotICAgIG1fcEJ1ZiA9IGJzLm1fcEJ1ZjsKLSAgICBtX2R3TGVuZ3RoID0gYnMubV9kd0xlbmd0aDsKLSAgICBtX2R3Qnl0ZUlkeCA9IGJzLm1fZHdCeXRlSWR4OwotICAgIG1fZHdCaXRJZHggPSBicy5tX2R3Qml0SWR4OwotfQotaW5saW5lIENKQmlnMl9CaXRTdHJlYW06On5DSkJpZzJfQml0U3RyZWFtKCkKLXsKLX0KLWlubGluZSBGWF9JTlQzMiBDSkJpZzJfQml0U3RyZWFtOjpyZWFkTkJpdHMoRlhfRFdPUkQgZHdCaXRzLCBGWF9EV09SRCAqZHdSZXN1bHQpCi17Ci0gICAgRlhfRFdPUkQgZHdUZW1wID0gKG1fZHdCeXRlSWR4IDw8IDMpICsgbV9kd0JpdElkeDsKLSAgICBpZihkd1RlbXAgPD0gKG1fZHdMZW5ndGggPDwgMykpIHsKLSAgICAgICAgKmR3UmVzdWx0ID0gMDsKLSAgICAgICAgaWYoZHdUZW1wICsgZHdCaXRzIDw9IChtX2R3TGVuZ3RoIDw8IDMpKSB7Ci0gICAgICAgICAgICBkd1RlbXAgPSBkd0JpdHM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkd1RlbXAgPSAobV9kd0xlbmd0aCA8PCAzKSAtIGR3VGVtcDsKLSAgICAgICAgfQotICAgICAgICB3aGlsZShkd1RlbXAgPiAwKSB7Ci0gICAgICAgICAgICAqZHdSZXN1bHQgPSAoKmR3UmVzdWx0IDw8IDEpIHwgKChtX3BCdWZbbV9kd0J5dGVJZHhdID4+ICg3IC0gbV9kd0JpdElkeCkpICYgMHgwMSk7Ci0gICAgICAgICAgICBpZihtX2R3Qml0SWR4ID09IDcpIHsKLSAgICAgICAgICAgICAgICBtX2R3Qnl0ZUlkeCArKzsKLSAgICAgICAgICAgICAgICBtX2R3Qml0SWR4ID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9kd0JpdElkeCArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGR3VGVtcCAtLTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotaW5saW5lIEZYX0lOVDMyIENKQmlnMl9CaXRTdHJlYW06OnJlYWROQml0cyhGWF9EV09SRCBkd0JpdHMsIEZYX0lOVDMyICpuUmVzdWx0KQotewotICAgIEZYX0RXT1JEIGR3VGVtcCA9IChtX2R3Qnl0ZUlkeCA8PCAzKSArIG1fZHdCaXRJZHg7Ci0gICAgaWYoZHdUZW1wIDw9IChtX2R3TGVuZ3RoIDw8IDMpKSB7Ci0gICAgICAgICpuUmVzdWx0ID0gMDsKLSAgICAgICAgaWYoZHdUZW1wICsgZHdCaXRzIDw9IChtX2R3TGVuZ3RoIDw8IDMpKSB7Ci0gICAgICAgICAgICBkd1RlbXAgPSBkd0JpdHM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkd1RlbXAgPSAobV9kd0xlbmd0aCA8PCAzKSAtIGR3VGVtcDsKLSAgICAgICAgfQotICAgICAgICB3aGlsZShkd1RlbXAgPiAwKSB7Ci0gICAgICAgICAgICAqblJlc3VsdCA9ICgqblJlc3VsdCA8PCAxKSB8ICgobV9wQnVmW21fZHdCeXRlSWR4XSA+PiAoNyAtIG1fZHdCaXRJZHgpKSAmIDB4MDEpOwotICAgICAgICAgICAgaWYobV9kd0JpdElkeCA9PSA3KSB7Ci0gICAgICAgICAgICAgICAgbV9kd0J5dGVJZHggKys7Ci0gICAgICAgICAgICAgICAgbV9kd0JpdElkeCA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fZHdCaXRJZHggKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkd1RlbXAgLS07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLX0KIAotaW5saW5lIEZYX0lOVDMyIENKQmlnMl9CaXRTdHJlYW06OnJlYWQxQml0KEZYX0RXT1JEICpkd1Jlc3VsdCkKLXsKLSAgICBpZihtX2R3Qnl0ZUlkeCA8IG1fZHdMZW5ndGgpIHsKLSAgICAgICAgKmR3UmVzdWx0ID0gKG1fcEJ1ZlttX2R3Qnl0ZUlkeF0gPj4gKDcgLSBtX2R3Qml0SWR4KSkgJiAweDAxOwotICAgICAgICBpZihtX2R3Qml0SWR4ID09IDcpIHsKLSAgICAgICAgICAgIG1fZHdCeXRlSWR4ICsrOwotICAgICAgICAgICAgbV9kd0JpdElkeCA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX2R3Qml0SWR4ICsrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19Ci0KLWlubGluZSBGWF9JTlQzMiBDSkJpZzJfQml0U3RyZWFtOjpyZWFkMUJpdChGWF9CT09MICpiUmVzdWx0KQotewotICAgIGlmKG1fZHdCeXRlSWR4IDwgbV9kd0xlbmd0aCkgewotICAgICAgICAqYlJlc3VsdCA9IChtX3BCdWZbbV9kd0J5dGVJZHhdID4+ICg3IC0gbV9kd0JpdElkeCkpICYgMHgwMTsKLSAgICAgICAgaWYobV9kd0JpdElkeCA9PSA3KSB7Ci0gICAgICAgICAgICBtX2R3Qnl0ZUlkeCArKzsKLSAgICAgICAgICAgIG1fZHdCaXRJZHggPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9kd0JpdElkeCArKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotaW5saW5lIEZYX0lOVDMyIENKQmlnMl9CaXRTdHJlYW06OnJlYWQxQnl0ZShGWF9CWVRFICpjUmVzdWx0KQotewotICAgIGlmKG1fZHdCeXRlSWR4IDwgbV9kd0xlbmd0aCkgewotICAgICAgICAqY1Jlc3VsdCA9IG1fcEJ1ZlttX2R3Qnl0ZUlkeF07Ci0gICAgICAgIG1fZHdCeXRlSWR4ICsrOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotCi1pbmxpbmUgRlhfSU5UMzIgQ0pCaWcyX0JpdFN0cmVhbTo6cmVhZEludGVnZXIoRlhfRFdPUkQgKmR3UmVzdWx0KQotewotICAgIGlmKG1fZHdCeXRlSWR4ICsgMyA8IG1fZHdMZW5ndGgpIHsKLSAgICAgICAgKmR3UmVzdWx0ID0gKG1fcEJ1ZlttX2R3Qnl0ZUlkeF0gPDwgMjQpIHwgKG1fcEJ1ZlttX2R3Qnl0ZUlkeCArIDFdIDw8IDE2KQotICAgICAgICAgICAgICAgICAgICB8IChtX3BCdWZbbV9kd0J5dGVJZHggKyAyXSA8PCA4KSB8IG1fcEJ1ZlttX2R3Qnl0ZUlkeCArIDNdOwotICAgICAgICBtX2R3Qnl0ZUlkeCArPSA0OwotICAgICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotCi1pbmxpbmUgRlhfSU5UMzIgQ0pCaWcyX0JpdFN0cmVhbTo6cmVhZFNob3J0SW50ZWdlcihGWF9XT1JEICpkd1Jlc3VsdCkKLXsKLSAgICBpZihtX2R3Qnl0ZUlkeCArIDEgPCBtX2R3TGVuZ3RoKSB7Ci0gICAgICAgICpkd1Jlc3VsdCA9IChtX3BCdWZbbV9kd0J5dGVJZHhdIDw8IDgpIHwgbV9wQnVmW21fZHdCeXRlSWR4ICsgMV07Ci0gICAgICAgIG1fZHdCeXRlSWR4ICs9IDI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19Ci1pbmxpbmUgdm9pZCBDSkJpZzJfQml0U3RyZWFtOjphbGlnbkJ5dGUoKQotewotICAgIGlmKG1fZHdCaXRJZHggIT0gMCkgewotICAgICAgICBtX2R3Qnl0ZUlkeCArKzsKLSAgICAgICAgbV9kd0JpdElkeCA9IDA7Ci0gICAgfQotfQotaW5saW5lIHZvaWQgQ0pCaWcyX0JpdFN0cmVhbTo6YWxpZ240Qnl0ZSgpCi17Ci0gICAgaWYobV9kd0JpdElkeCAhPSAwKSB7Ci0gICAgICAgIG1fZHdCeXRlSWR4ICsrOwotICAgICAgICBtX2R3Qml0SWR4ID0gMDsKLSAgICB9Ci0gICAgbV9kd0J5dGVJZHggPSAobV9kd0J5dGVJZHggKyAzKSAmIC00OwotfQotaW5saW5lIEZYX0JZVEUgQ0pCaWcyX0JpdFN0cmVhbTo6Z2V0QXQoRlhfRFdPUkQgZHdPZmZzZXQpCi17Ci0gICAgaWYoZHdPZmZzZXQgPCBtX2R3TGVuZ3RoKSB7Ci0gICAgICAgIHJldHVybiBtX3BCdWZbZHdPZmZzZXRdOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLWlubGluZSBGWF9CWVRFIENKQmlnMl9CaXRTdHJlYW06OmdldEN1ckJ5dGUoKQotewotICAgIGlmKG1fZHdCeXRlSWR4IDwgbV9kd0xlbmd0aCkgewotICAgICAgICByZXR1cm4gbV9wQnVmW21fZHdCeXRlSWR4XTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci1pbmxpbmUgRlhfQllURSBDSkJpZzJfQml0U3RyZWFtOjpnZXROZXh0Qnl0ZSgpCi17Ci0gICAgaWYobV9kd0J5dGVJZHggKyAxIDwgbV9kd0xlbmd0aCkgewotICAgICAgICByZXR1cm4gbV9wQnVmW21fZHdCeXRlSWR4ICsgMV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotaW5saW5lIEZYX0lOVDMyIENKQmlnMl9CaXRTdHJlYW06OmluY0J5dGVJZHgoKQotewotICAgIGlmKG1fZHdCeXRlSWR4IDwgbV9kd0xlbmd0aCkgewotICAgICAgICBtX2R3Qnl0ZUlkeCArKzsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLX0KLWlubGluZSBGWF9CWVRFIENKQmlnMl9CaXRTdHJlYW06OmdldEN1ckJ5dGVfYXJpdGgoKQotewotICAgIGlmKG1fZHdCeXRlSWR4IDwgbV9kd0xlbmd0aCkgewotICAgICAgICByZXR1cm4gbV9wQnVmW21fZHdCeXRlSWR4XTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gMHhmZjsKLSAgICB9Ci19Ci1pbmxpbmUgRlhfQllURSBDSkJpZzJfQml0U3RyZWFtOjpnZXROZXh0Qnl0ZV9hcml0aCgpCi17Ci0gICAgaWYobV9kd0J5dGVJZHggKyAxIDwgbV9kd0xlbmd0aCkgewotICAgICAgICByZXR1cm4gbV9wQnVmW21fZHdCeXRlSWR4ICsgMV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIDB4ZmY7Ci0gICAgfQotfQotaW5saW5lIEZYX0RXT1JEIENKQmlnMl9CaXRTdHJlYW06OmdldE9mZnNldCgpCi17Ci0gICAgcmV0dXJuIG1fZHdCeXRlSWR4OwotfQotaW5saW5lIHZvaWQgQ0pCaWcyX0JpdFN0cmVhbTo6c2V0T2Zmc2V0KEZYX0RXT1JEIGR3T2Zmc2V0KQotewotICAgIGlmIChkd09mZnNldCA+IG1fZHdMZW5ndGgpIHsKLSAgICAgICAgZHdPZmZzZXQgPSBtX2R3TGVuZ3RoOwotICAgIH0KLSAgICBtX2R3Qnl0ZUlkeCA9IGR3T2Zmc2V0OwotfQotaW5saW5lIEZYX0RXT1JEIENKQmlnMl9CaXRTdHJlYW06OmdldEJpdFBvcygpCi17Ci0gICAgcmV0dXJuIChtX2R3Qnl0ZUlkeCA8PCAzKSArIG1fZHdCaXRJZHg7Ci19Ci1pbmxpbmUgdm9pZCBDSkJpZzJfQml0U3RyZWFtOjpzZXRCaXRQb3MoRlhfRFdPUkQgZHdCaXRQb3MpCi17Ci0gICAgbV9kd0J5dGVJZHggPSBkd0JpdFBvcyA+PiAzOwotICAgIG1fZHdCaXRJZHggPSBkd0JpdFBvcyAmIDc7Ci19Ci1pbmxpbmUgRlhfQllURSAqQ0pCaWcyX0JpdFN0cmVhbTo6Z2V0QnVmKCkKLXsKLSAgICByZXR1cm4gbV9wQnVmOwotfQotaW5saW5lIEZYX0JZVEUgKkNKQmlnMl9CaXRTdHJlYW06OmdldFBvaW50ZXIoKQotewotICAgIHJldHVybiBtX3BCdWYgKyBtX2R3Qnl0ZUlkeDsKLX0KLWlubGluZSB2b2lkIENKQmlnMl9CaXRTdHJlYW06Om9mZnNldChGWF9EV09SRCBkd09mZnNldCkKLXsKLSAgICBtX2R3Qnl0ZUlkeCArPSBkd09mZnNldDsKLX0KLWlubGluZSBGWF9EV09SRCBDSkJpZzJfQml0U3RyZWFtOjpnZXRCeXRlTGVmdCgpCi17Ci0gICAgcmV0dXJuIG1fZHdMZW5ndGggLSBtX2R3Qnl0ZUlkeDsKLX0KLSNlbmRpZgorI2VuZGlmICAvLyBDT1JFX1NSQ19GWENPREVDX0pCSUcyX0pCSUcyX0JJVFNUUkVBTV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQ29udGV4dC5jcHAKaW5kZXggYmNkMTZlNy4uNTY2Yjg0ZSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmNwcAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0NvbnRleHQuY3BwCkBAIC0xLDEyICsxLDM3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSAiY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlICJKQmlnMl9Db250ZXh0LmgiCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0FyaXRoRGVjb2Rlci5oIgorI2luY2x1ZGUgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQml0U3RyZWFtLmgiCisjaW5jbHVkZSAiY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HcmRQcm9jLmgiCisjaW5jbHVkZSAiY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HcnJkUHJvYy5oIgorI2luY2x1ZGUgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHRyZFByb2MuaCIKKyNpbmNsdWRlICJjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5UYWJsZV9TdGFuZGFyZC5oIgorI2luY2x1ZGUgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfUGRkUHJvYy5oIgorI2luY2x1ZGUgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU2RkUHJvYy5oIgorI2luY2x1ZGUgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfVHJkUHJvYy5oIgorCituYW1lc3BhY2UgeworCitzaXplX3QgR2V0SHVmZkNvbnRleHRTaXplKHVpbnQ4X3QgdmFsKSB7CisgIHJldHVybiB2YWwgPT0gMCA/IDY1NTM2IDogdmFsID09IDEgPyA4MTkyIDogMTAyNDsKK30KKworc2l6ZV90IEdldFJlZkFnZ0NvbnRleHRTaXplKEZYX0JPT0wgdmFsKSB7CisgIHJldHVybiB2YWwgPyAxMDI0IDogODE5MjsKK30KKworfSAgLy8gbmFtZXNwYWNlCiAKIC8vIEltcGxlbWVudCBhIHZlcnkgc21hbGwgbGVhc3QgcmVjZW50bHkgdXNlZCAoTFJVKSBjYWNoZS4gSXQgaXMgdmVyeQogLy8gY29tbW9uIGZvciBhIEpCSUcyIGRpY3Rpb25hcnkgdG8gc3BhbiBtdWx0aXBsZSBwYWdlcyBpbiBhIFBERiBmaWxlLApAQCAtMTUsMTgzMyArNDAsMTM5NiBAQAogLy8gbGlzdCBrZWVwcyB0cmFjayBvZiB0aGUgZnJlc2huZXNzIG9mIGVudHJpZXMsIHdpdGggZnJlc2hlc3Qgb25lcwogLy8gYXQgdGhlIGZyb250LiBFdmVuIGEgdGlueSBjYWNoZSBzaXplIGxpa2UgMiBtYWtlcyBhIGRyYW1hdGljCiAvLyBkaWZmZXJlbmNlIGZvciB0eXBpY2FsIEpCSUcyIGRvY3VtZW50cy4KLWNvbnN0IGludCBrU3ltYm9sRGljdENhY2hlTWF4U2l6ZSA9IDI7CitzdGF0aWMgY29uc3QgaW50IGtTeW1ib2xEaWN0Q2FjaGVNYXhTaXplID0gMjsKIAotdm9pZCBPdXRwdXRCaXRtYXAoQ0pCaWcyX0ltYWdlKiBwSW1hZ2UpCi17Ci0gICAgaWYoIXBJbWFnZSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQorQ0pCaWcyX0NvbnRleHQqIENKQmlnMl9Db250ZXh0OjpDcmVhdGVDb250ZXh0KAorICAgIENQREZfU3RyZWFtQWNjKiBwR2xvYmFsU3RyZWFtLAorICAgIENQREZfU3RyZWFtQWNjKiBwU3JjU3RyZWFtLAorICAgIHN0ZDo6bGlzdDxDSkJpZzJfQ2FjaGVQYWlyPiogcFN5bWJvbERpY3RDYWNoZSwKKyAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICByZXR1cm4gbmV3IENKQmlnMl9Db250ZXh0KHBHbG9iYWxTdHJlYW0sIHBTcmNTdHJlYW0sIHBTeW1ib2xEaWN0Q2FjaGUsIHBQYXVzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CiB9Ci1DSkJpZzJfQ29udGV4dCAqQ0pCaWcyX0NvbnRleHQ6OkNyZWF0ZUNvbnRleHQoQ0pCaWcyX01vZHVsZSAqcE1vZHVsZSwgRlhfQllURSAqcEdsb2JhbERhdGEsIEZYX0RXT1JEIGR3R2xvYmFsTGVuZ3RoLAotICAgICAgICBGWF9CWVRFICpwRGF0YSwgRlhfRFdPUkQgZHdMZW5ndGgsIEZYX0lOVDMyIG5TdHJlYW1UeXBlLCBzdGQ6Omxpc3Q8Q0pCaWcyX0NhY2hlUGFpcj4qIHBTeW1ib2xEaWN0Q2FjaGUsIElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIHJldHVybiBuZXcocE1vZHVsZSlDSkJpZzJfQ29udGV4dChwR2xvYmFsRGF0YSwgZHdHbG9iYWxMZW5ndGgsIHBEYXRhLCBkd0xlbmd0aCwgblN0cmVhbVR5cGUsIHBTeW1ib2xEaWN0Q2FjaGUsIHBQYXVzZSk7CisKK3ZvaWQgQ0pCaWcyX0NvbnRleHQ6OkRlc3Ryb3lDb250ZXh0KENKQmlnMl9Db250ZXh0KiBwQ29udGV4dCkgeworICBkZWxldGUgcENvbnRleHQ7CiB9Ci12b2lkIENKQmlnMl9Db250ZXh0OjpEZXN0cm95Q29udGV4dChDSkJpZzJfQ29udGV4dCAqcENvbnRleHQpCi17Ci0gICAgaWYocENvbnRleHQpIHsKLSAgICAgICAgZGVsZXRlIHBDb250ZXh0OwotICAgIH0KKworQ0pCaWcyX0NvbnRleHQ6OkNKQmlnMl9Db250ZXh0KENQREZfU3RyZWFtQWNjKiBwR2xvYmFsU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtQWNjKiBwU3JjU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxDSkJpZzJfQ2FjaGVQYWlyPiogcFN5bWJvbERpY3RDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJc0dsb2JhbCkKKyAgICA6IG1fblNlZ21lbnREZWNvZGVkKDApLAorICAgICAgbV9iSW5QYWdlKGZhbHNlKSwKKyAgICAgIG1fYkJ1ZlNwZWNpZmllZChmYWxzZSksCisgICAgICBtX1BhdXNlU3RlcCgxMCksCisgICAgICBtX3BQYXVzZShwUGF1c2UpLAorICAgICAgbV9Qcm9jZXNzaW5nU3RhdHVzKEZYQ09ERUNfU1RBVFVTX0ZSQU1FX1JFQURZKSwKKyAgICAgIG1fZ2JDb250ZXh0KE5VTEwpLAorICAgICAgbV9kd09mZnNldCgwKSwKKyAgICAgIG1fcFN5bWJvbERpY3RDYWNoZShwU3ltYm9sRGljdENhY2hlKSwKKyAgICAgIG1fYklzR2xvYmFsKGJJc0dsb2JhbCkgeworICBpZiAocEdsb2JhbFN0cmVhbSAmJiAocEdsb2JhbFN0cmVhbS0+R2V0U2l6ZSgpID4gMCkpIHsKKyAgICBtX3BHbG9iYWxDb250ZXh0ID0gbmV3IENKQmlnMl9Db250ZXh0KG51bGxwdHIsIHBHbG9iYWxTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3ltYm9sRGljdENhY2hlLCBwUGF1c2UsIHRydWUpOworICB9IGVsc2UgeworICAgIG1fcEdsb2JhbENvbnRleHQgPSBudWxscHRyOworICB9CisKKyAgbV9wU3RyZWFtLnJlc2V0KG5ldyBDSkJpZzJfQml0U3RyZWFtKHBTcmNTdHJlYW0pKTsKIH0KLUNKQmlnMl9Db250ZXh0OjpDSkJpZzJfQ29udGV4dChGWF9CWVRFICpwR2xvYmFsRGF0YSwgRlhfRFdPUkQgZHdHbG9iYWxMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQllURSAqcERhdGEsIEZYX0RXT1JEIGR3TGVuZ3RoLCBGWF9JTlQzMiBuU3RyZWFtVHlwZSwgc3RkOjpsaXN0PENKQmlnMl9DYWNoZVBhaXI+KiBwU3ltYm9sRGljdENhY2hlLCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBpZihwR2xvYmFsRGF0YSAmJiAoZHdHbG9iYWxMZW5ndGggPiAwKSkgewotICAgICAgICBKQklHMl9BTExPQyhtX3BHbG9iYWxDb250ZXh0LCBDSkJpZzJfQ29udGV4dChOVUxMLCAwLCBwR2xvYmFsRGF0YSwgZHdHbG9iYWxMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgIEpCSUcyX0VNQkVEX1NUUkVBTSwgcFN5bWJvbERpY3RDYWNoZSwgcFBhdXNlKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wR2xvYmFsQ29udGV4dCA9IE5VTEw7Ci0gICAgfQotICAgIEpCSUcyX0FMTE9DKG1fcFN0cmVhbSwgQ0pCaWcyX0JpdFN0cmVhbShwRGF0YSwgZHdMZW5ndGgpKTsKLSAgICBtX25TdHJlYW1UeXBlID0gblN0cmVhbVR5cGU7Ci0gICAgbV9uU3RhdGUgPSBKQklHMl9PVVRfT0ZfUEFHRTsKLSAgICBKQklHMl9BTExPQyhtX3BTZWdtZW50TGlzdCwgQ0pCaWcyX0xpc3Q8Q0pCaWcyX1NlZ21lbnQ+KTsKLSAgICBKQklHMl9BTExPQyhtX3BQYWdlSW5mb0xpc3QsIENKQmlnMl9MaXN0PEpCaWcyUGFnZUluZm8+KDEpKTsKLSAgICBtX3BQYWdlID0gTlVMTDsKLSAgICBtX2JCdWZTcGVjaWZpZWQgPSBGQUxTRTsKLSAgICBtX3BQYXVzZSA9IHBQYXVzZTsKLSAgICBtX25TZWdtZW50RGVjb2RlZCA9IDA7Ci0gICAgbV9QYXVzZVN0ZXAgPSAxMDsKLSAgICBtX3BBcml0aERlY29kZXIgPSBOVUxMOwotICAgIG1fcEdSRCA9IE5VTEw7Ci0gICAgbV9nYkNvbnRleHQgPSBOVUxMOwotICAgIG1fcFNlZ21lbnQgPSBOVUxMOwotICAgIG1fZHdPZmZzZXQgPSAwOwotICAgIG1fUHJvY2Vzc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0ZSQU1FX1JFQURZOwotICAgIG1fcFN5bWJvbERpY3RDYWNoZSA9IHBTeW1ib2xEaWN0Q2FjaGU7CisKK0NKQmlnMl9Db250ZXh0Ojp+Q0pCaWcyX0NvbnRleHQoKSB7CisgIEZYX0ZyZWUobV9nYkNvbnRleHQpOworICBtX2diQ29udGV4dCA9IE5VTEw7CisgIGRlbGV0ZSBtX3BHbG9iYWxDb250ZXh0OworICBtX3BHbG9iYWxDb250ZXh0ID0gTlVMTDsKIH0KLUNKQmlnMl9Db250ZXh0Ojp+Q0pCaWcyX0NvbnRleHQoKQotewotICAgIGlmKG1fcEFyaXRoRGVjb2RlcikgewotICAgICAgICBkZWxldGUgbV9wQXJpdGhEZWNvZGVyOwotICAgIH0KLSAgICBtX3BBcml0aERlY29kZXIgPSBOVUxMOwotICAgIGlmKG1fcEdSRCkgewotICAgICAgICBkZWxldGUgbV9wR1JEOwotICAgIH0KLSAgICBtX3BHUkQgPSBOVUxMOwotICAgIGlmKG1fZ2JDb250ZXh0KSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShtX2diQ29udGV4dCk7Ci0gICAgfQotICAgIG1fZ2JDb250ZXh0ID0gTlVMTDsKLSAgICBpZihtX3BHbG9iYWxDb250ZXh0KSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BHbG9iYWxDb250ZXh0OwotICAgIH0KLSAgICBtX3BHbG9iYWxDb250ZXh0ID0gTlVMTDsKLSAgICBpZihtX3BQYWdlSW5mb0xpc3QpIHsKLSAgICAgICAgZGVsZXRlIG1fcFBhZ2VJbmZvTGlzdDsKLSAgICB9Ci0gICAgbV9wUGFnZUluZm9MaXN0ID0gTlVMTDsKLSAgICBpZihtX2JCdWZTcGVjaWZpZWQgJiYgbV9wUGFnZSkgewotICAgICAgICBkZWxldGUgbV9wUGFnZTsKLSAgICB9Ci0gICAgbV9wUGFnZSA9IE5VTEw7Ci0gICAgaWYobV9wU3RyZWFtKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BTdHJlYW07Ci0gICAgfQotICAgIG1fcFN0cmVhbSA9IE5VTEw7Ci0gICAgaWYobV9wU2VnbWVudExpc3QpIHsKLSAgICAgICAgZGVsZXRlIG1fcFNlZ21lbnRMaXN0OwotICAgIH0KLSAgICBtX3BTZWdtZW50TGlzdCA9IE5VTEw7Ci19Ci1GWF9JTlQzMiBDSkJpZzJfQ29udGV4dDo6ZGVjb2RlRmlsZShJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBGWF9CWVRFIGNGbGFnczsKLSAgICBGWF9EV09SRCBkd1RlbXA7Ci0gICAgY29uc3QgRlhfQllURSBmaWxlSURbXSA9IHsweDk3LCAweDRBLCAweDQyLCAweDMyLCAweDBELCAweDBBLCAweDFBLCAweDBBfTsKLSAgICBGWF9JTlQzMiBuUmV0OwotICAgIGlmKG1fcFN0cmVhbS0+Z2V0Qnl0ZUxlZnQoKSA8IDgpIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiZmlsZSBoZWFkZXIgdG9vIHNob3J0LiIpOwotICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfVE9PX1NIT1JUOwotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgaWYoSkJJRzJfbWVtY21wKG1fcFN0cmVhbS0+Z2V0UG9pbnRlcigpLCBmaWxlSUQsIDgpICE9IDApIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigibm90IGpiaWcyIGZpbGUiKTsKLSAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZJTEVfRk9STUFUOwotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgbV9wU3RyZWFtLT5vZmZzZXQoOCk7Ci0gICAgaWYobV9wU3RyZWFtLT5yZWFkMUJ5dGUoJmNGbGFncykgIT0gMCkgewotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJmaWxlIGhlYWRlciB0b28gc2hvcnQuIik7Ci0gICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9UT09fU0hPUlQ7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLSAgICBpZighKGNGbGFncyAmIDB4MDIpKSB7Ci0gICAgICAgIGlmKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoJmR3VGVtcCkgIT0gMCkgewotICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiZmlsZSBoZWFkZXIgdG9vIHNob3J0LiIpOwotICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKLSAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmKGR3VGVtcCA+IDApIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtX3BQYWdlSW5mb0xpc3Q7Ci0gICAgICAgICAgICBKQklHMl9BTExPQyhtX3BQYWdlSW5mb0xpc3QsIENKQmlnMl9MaXN0PEpCaWcyUGFnZUluZm8+KGR3VGVtcCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmKGNGbGFncyAmIDB4MDEpIHsKLSAgICAgICAgbV9uU3RyZWFtVHlwZSA9IEpCSUcyX1NRVUVOVElBTF9TVFJFQU07Ci0gICAgICAgIHJldHVybiBkZWNvZGVfU3F1ZW50aWFsT3JnbmF6YXRpb24ocFBhdXNlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX25TdHJlYW1UeXBlID0gSkJJRzJfUkFORE9NX1NUUkVBTTsKLSAgICAgICAgcmV0dXJuIGRlY29kZV9SYW5kb21PcmduYXphdGlvbl9GaXJzdFBhZ2UocFBhdXNlKTsKLSAgICB9Ci1mYWlsZWQ6Ci0gICAgcmV0dXJuIG5SZXQ7Ci19Ci1GWF9JTlQzMiBDSkJpZzJfQ29udGV4dDo6ZGVjb2RlX1NxdWVudGlhbE9yZ25hemF0aW9uKElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIEZYX0lOVDMyIG5SZXQ7Ci0gICAgaWYobV9wU3RyZWFtLT5nZXRCeXRlTGVmdCgpID4gMCkgewotICAgICAgICB3aGlsZShtX3BTdHJlYW0tPmdldEJ5dGVMZWZ0KCkgPj0gSkJJRzJfTUlOX1NFR01FTlRfU0laRSkgewotICAgICAgICAgICAgaWYobV9wU2VnbWVudCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MobV9wU2VnbWVudCwgQ0pCaWcyX1NlZ21lbnQoKSk7Ci0gICAgICAgICAgICAgICAgblJldCA9IHBhcnNlU2VnbWVudEhlYWRlcihtX3BTZWdtZW50KTsKLSAgICAgICAgICAgICAgICBpZihuUmV0ICE9IEpCSUcyX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1fcFNlZ21lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIG1fcFNlZ21lbnQgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gblJldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9kd09mZnNldCA9IG1fcFN0cmVhbS0+Z2V0T2Zmc2V0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuUmV0ID0gcGFyc2VTZWdtZW50RGF0YShtX3BTZWdtZW50LCBwUGF1c2UpOwotICAgICAgICAgICAgaWYobV9Qcm9jZXNzaXZlU3RhdHVzICA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7Ci0gICAgICAgICAgICAgICAgbV9Qcm9jZXNzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKLSAgICAgICAgICAgICAgICBtX1BhdXNlU3RlcCA9IDI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZigoblJldCA9PSBKQklHMl9FTkRfT0ZfUEFHRSkgfHwgKG5SZXQgPT0gSkJJRzJfRU5EX09GX0ZJTEUpKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIG1fcFNlZ21lbnQ7Ci0gICAgICAgICAgICAgICAgbV9wU2VnbWVudCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoblJldCAhPSBKQklHMl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIG1fcFNlZ21lbnQ7Ci0gICAgICAgICAgICAgICAgbV9wU2VnbWVudCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5SZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX3BTZWdtZW50TGlzdC0+YWRkSXRlbShtX3BTZWdtZW50KTsKLSAgICAgICAgICAgIGlmKG1fcFNlZ21lbnQtPm1fZHdEYXRhX2xlbmd0aCAhPSAweGZmZmZmZmZmKSB7Ci0gICAgICAgICAgICAgICAgbV9kd09mZnNldCA9IG1fZHdPZmZzZXQgKyBtX3BTZWdtZW50LT5tX2R3RGF0YV9sZW5ndGg7Ci0gICAgICAgICAgICAgICAgbV9wU3RyZWFtLT5zZXRPZmZzZXQobV9kd09mZnNldCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fcFN0cmVhbS0+b2Zmc2V0KDQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT3V0cHV0Qml0bWFwKG1fcFBhZ2UpOwotICAgICAgICAgICAgbV9wU2VnbWVudCA9IE5VTEw7Ci0gICAgICAgICAgICBpZihtX3BTdHJlYW0tPmdldEJ5dGVMZWZ0KCkgPiAwICYmIG1fcFBhZ2UgJiYgcFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewotICAgICAgICAgICAgICAgIG1fUHJvY2Vzc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7Ci0gICAgICAgICAgICAgICAgbV9QYXVzZVN0ZXAgPSAyOwotICAgICAgICAgICAgICAgIHJldHVybiBKQklHMl9TVUNDRVNTOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEpCSUcyX0VORF9PRl9GSUxFOwotICAgIH0KLSAgICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKLX0KLUZYX0lOVDMyIENKQmlnMl9Db250ZXh0OjpkZWNvZGVfRW1iZWRPcmduYXphdGlvbihJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICByZXR1cm4gZGVjb2RlX1NxdWVudGlhbE9yZ25hemF0aW9uKHBQYXVzZSk7Ci19Ci1GWF9JTlQzMiBDSkJpZzJfQ29udGV4dDo6ZGVjb2RlX1JhbmRvbU9yZ25hemF0aW9uX0ZpcnN0UGFnZShJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBDSkJpZzJfU2VnbWVudCAqcFNlZ21lbnQ7Ci0gICAgRlhfSU5UMzIgblJldDsKLSAgICB3aGlsZShtX3BTdHJlYW0tPmdldEJ5dGVMZWZ0KCkgPiBKQklHMl9NSU5fU0VHTUVOVF9TSVpFKSB7Ci0gICAgICAgIEpCSUcyX0FMTE9DKHBTZWdtZW50LCBDSkJpZzJfU2VnbWVudCgpKTsKLSAgICAgICAgblJldCA9IHBhcnNlU2VnbWVudEhlYWRlcihwU2VnbWVudCk7Ci0gICAgICAgIGlmKG5SZXQgIT0gSkJJRzJfU1VDQ0VTUykgewotICAgICAgICAgICAgZGVsZXRlIHBTZWdtZW50OwotICAgICAgICAgICAgcmV0dXJuIG5SZXQ7Ci0gICAgICAgIH0gZWxzZSBpZihwU2VnbWVudC0+bV9jRmxhZ3Mucy50eXBlID09IDUxKSB7Ci0gICAgICAgICAgICBkZWxldGUgcFNlZ21lbnQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtX3BTZWdtZW50TGlzdC0+YWRkSXRlbShwU2VnbWVudCk7Ci0gICAgICAgIGlmKHBQYXVzZSAmJiBtX3BQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgIG1fUGF1c2VTdGVwID0gMzsKLSAgICAgICAgICAgIG1fUHJvY2Vzc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7Ci0gICAgICAgICAgICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKLSAgICAgICAgfQotICAgIH0KLSAgICBtX25TZWdtZW50RGVjb2RlZCA9IDA7Ci0gICAgcmV0dXJuIGRlY29kZV9SYW5kb21PcmduYXphdGlvbihwUGF1c2UpOwotfQotRlhfSU5UMzIgQ0pCaWcyX0NvbnRleHQ6OmRlY29kZV9SYW5kb21PcmduYXphdGlvbihJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBGWF9JTlQzMiBuUmV0OwotICAgIGZvcig7IG1fblNlZ21lbnREZWNvZGVkIDwgbV9wU2VnbWVudExpc3QtPmdldExlbmd0aCgpOyBtX25TZWdtZW50RGVjb2RlZCsrKSB7Ci0gICAgICAgIG5SZXQgPSBwYXJzZVNlZ21lbnREYXRhKG1fcFNlZ21lbnRMaXN0LT5nZXRBdChtX25TZWdtZW50RGVjb2RlZCksIHBQYXVzZSk7Ci0gICAgICAgIGlmKChuUmV0ID09IEpCSUcyX0VORF9PRl9QQUdFKSB8fCAoblJldCA9PSBKQklHMl9FTkRfT0ZfRklMRSkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgaWYoblJldCAhPSBKQklHMl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICByZXR1cm4gblJldDsKLSAgICAgICAgfQotICAgICAgICBpZihtX3BQYWdlICYmIHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgIG1fUGF1c2VTdGVwID0gNDsKLSAgICAgICAgICAgIG1fUHJvY2Vzc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7Ci0gICAgICAgICAgICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKLX0KLUZYX0lOVDMyIENKQmlnMl9Db250ZXh0OjpnZXRGaXJzdFBhZ2UoRlhfQllURSAqcEJ1ZiwgRlhfSU5UMzIgd2lkdGgsIEZYX0lOVDMyIGhlaWdodCwgRlhfSU5UMzIgc3RyaWRlLCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBGWF9JTlQzMiBuUmV0ID0gMDsKLSAgICBpZihtX3BHbG9iYWxDb250ZXh0KSB7Ci0gICAgICAgIG5SZXQgPSBtX3BHbG9iYWxDb250ZXh0LT5kZWNvZGVfRW1iZWRPcmduYXphdGlvbihwUGF1c2UpOwotICAgICAgICBpZihuUmV0ICE9IEpCSUcyX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIG1fUHJvY2Vzc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOwotICAgICAgICAgICAgcmV0dXJuIG5SZXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9iRmlyc3RQYWdlID0gVFJVRTsKLSAgICBtX1BhdXNlU3RlcCA9IDA7Ci0gICAgaWYobV9wUGFnZSkgewotICAgICAgICBkZWxldGUgbV9wUGFnZTsKLSAgICB9Ci0gICAgSkJJRzJfQUxMT0MobV9wUGFnZSwgQ0pCaWcyX0ltYWdlKHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcEJ1ZikpOwotICAgIG1fYkJ1ZlNwZWNpZmllZCA9IFRSVUU7Ci0gICAgaWYobV9wUGFnZSAmJiBwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7Ci0gICAgICAgIG1fUGF1c2VTdGVwID0gMTsKLSAgICAgICAgbV9Qcm9jZXNzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKKworaW50MzJfdCBDSkJpZzJfQ29udGV4dDo6ZGVjb2RlX1NxdWVudGlhbE9yZ25hemF0aW9uKElGWF9QYXVzZSogcFBhdXNlKSB7CisgIGludDMyX3QgblJldDsKKyAgaWYgKG1fcFN0cmVhbS0+Z2V0Qnl0ZUxlZnQoKSA8PSAwKQorICAgIHJldHVybiBKQklHMl9FTkRfT0ZfRklMRTsKKworICB3aGlsZSAobV9wU3RyZWFtLT5nZXRCeXRlTGVmdCgpID49IEpCSUcyX01JTl9TRUdNRU5UX1NJWkUpIHsKKyAgICBpZiAoIW1fcFNlZ21lbnQpIHsKKyAgICAgIG1fcFNlZ21lbnQucmVzZXQobmV3IENKQmlnMl9TZWdtZW50KTsKKyAgICAgIG5SZXQgPSBwYXJzZVNlZ21lbnRIZWFkZXIobV9wU2VnbWVudC5nZXQoKSk7CisgICAgICBpZiAoblJldCAhPSBKQklHMl9TVUNDRVNTKSB7CisgICAgICAgIG1fcFNlZ21lbnQucmVzZXQoKTsKICAgICAgICAgcmV0dXJuIG5SZXQ7CisgICAgICB9CisgICAgICBtX2R3T2Zmc2V0ID0gbV9wU3RyZWFtLT5nZXRPZmZzZXQoKTsKICAgICB9Ci0gICAgaW50IHJldCA9IENvbnRpbnVlKHBQYXVzZSk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLUZYX0lOVDMyIENKQmlnMl9Db250ZXh0OjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBtX1Byb2Nlc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfUkVBRFk7Ci0gICAgRlhfSU5UMzIgblJldDsKLSAgICBpZihtX1BhdXNlU3RlcCA8PSAxKSB7Ci0gICAgICAgIHN3aXRjaChtX25TdHJlYW1UeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIEpCSUcyX0ZJTEVfU1RSRUFNOgotICAgICAgICAgICAgICAgIG5SZXQgPSBkZWNvZGVGaWxlKHBQYXVzZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEpCSUcyX1NRVUVOVElBTF9TVFJFQU06Ci0gICAgICAgICAgICAgICAgblJldCA9IGRlY29kZV9TcXVlbnRpYWxPcmduYXphdGlvbihwUGF1c2UpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBKQklHMl9SQU5ET01fU1RSRUFNOgotICAgICAgICAgICAgICAgIGlmKG1fYkZpcnN0UGFnZSkgewotICAgICAgICAgICAgICAgICAgICBuUmV0ID0gZGVjb2RlX1JhbmRvbU9yZ25hemF0aW9uX0ZpcnN0UGFnZShwUGF1c2UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5SZXQgPSBkZWNvZGVfUmFuZG9tT3JnbmF6YXRpb24ocFBhdXNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEpCSUcyX0VNQkVEX1NUUkVBTToKLSAgICAgICAgICAgICAgICBuUmV0ID0gZGVjb2RlX0VtYmVkT3JnbmF6YXRpb24ocFBhdXNlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgbV9Qcm9jZXNzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX1NUUkVBTV9UWVBFOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmKG1fUGF1c2VTdGVwID09IDIpIHsKLSAgICAgICAgblJldCA9IGRlY29kZV9TcXVlbnRpYWxPcmduYXphdGlvbihwUGF1c2UpOwotICAgIH0gZWxzZSBpZihtX1BhdXNlU3RlcCA9PSAzKSB7Ci0gICAgICAgIG5SZXQgPSBkZWNvZGVfUmFuZG9tT3JnbmF6YXRpb25fRmlyc3RQYWdlKHBQYXVzZSk7Ci0gICAgfSBlbHNlIGlmKG1fUGF1c2VTdGVwID09IDQpIHsKLSAgICAgICAgblJldCA9IGRlY29kZV9SYW5kb21PcmduYXphdGlvbihwUGF1c2UpOwotICAgIH0gZWxzZSBpZihtX1BhdXNlU3RlcCA9PSA1KSB7Ci0gICAgICAgIG1fUHJvY2Vzc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7Ci0gICAgICAgIHJldHVybiBKQklHMl9TVUNDRVNTOworICAgIG5SZXQgPSBwYXJzZVNlZ21lbnREYXRhKG1fcFNlZ21lbnQuZ2V0KCksIHBQYXVzZSk7CisgICAgaWYgKG1fUHJvY2Vzc2luZ1N0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7CisgICAgICBtX1Byb2Nlc3NpbmdTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOworICAgICAgbV9QYXVzZVN0ZXAgPSAyOworICAgICAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7CiAgICAgfQotICAgIGlmKG1fUHJvY2Vzc2l2ZVN0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7Ci0gICAgICAgIHJldHVybiBuUmV0OworICAgIGlmIChuUmV0ID09IEpCSUcyX0VORF9PRl9QQUdFIHx8IG5SZXQgPT0gSkJJRzJfRU5EX09GX0ZJTEUpIHsKKyAgICAgIG1fcFNlZ21lbnQucmVzZXQoKTsKKyAgICAgIHJldHVybiBKQklHMl9TVUNDRVNTOwogICAgIH0KLSAgICBtX1BhdXNlU3RlcCA9IDU7Ci0gICAgaWYoIW1fYkJ1ZlNwZWNpZmllZCAmJiBuUmV0ID09IEpCSUcyX1NVQ0NFU1MpIHsKLSAgICAgICAgbV9Qcm9jZXNzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKLSAgICAgICAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7CisgICAgaWYgKG5SZXQgIT0gSkJJRzJfU1VDQ0VTUykgeworICAgICAgbV9wU2VnbWVudC5yZXNldCgpOworICAgICAgcmV0dXJuIG5SZXQ7CiAgICAgfQotICAgIGlmKG5SZXQgPT0gSkJJRzJfU1VDQ0VTUykgewotICAgICAgICBtX1Byb2Nlc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworICAgIGlmIChtX3BTZWdtZW50LT5tX2R3RGF0YV9sZW5ndGggIT0gMHhmZmZmZmZmZikgeworICAgICAgbV9kd09mZnNldCArPSBtX3BTZWdtZW50LT5tX2R3RGF0YV9sZW5ndGg7CisgICAgICBtX3BTdHJlYW0tPnNldE9mZnNldChtX2R3T2Zmc2V0KTsKICAgICB9IGVsc2UgewotICAgICAgICBtX1Byb2Nlc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJPUjsKKyAgICAgIG1fcFN0cmVhbS0+b2Zmc2V0KDQpOwogICAgIH0KKyAgICBtX1NlZ21lbnRMaXN0LnB1c2hfYmFjayhtX3BTZWdtZW50LnJlbGVhc2UoKSk7CisgICAgaWYgKG1fcFN0cmVhbS0+Z2V0Qnl0ZUxlZnQoKSA+IDAgJiYgbV9wUGFnZSAmJiBwUGF1c2UgJiYKKyAgICAgICAgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7CisgICAgICBtX1Byb2Nlc3NpbmdTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOworICAgICAgbV9QYXVzZVN0ZXAgPSAyOworICAgICAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7CisgICAgfQorICB9CisgIHJldHVybiBKQklHMl9TVUNDRVNTOworfQoraW50MzJfdCBDSkJpZzJfQ29udGV4dDo6ZGVjb2RlX0VtYmVkT3JnbmF6YXRpb24oSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgcmV0dXJuIGRlY29kZV9TcXVlbnRpYWxPcmduYXphdGlvbihwUGF1c2UpOworfQoraW50MzJfdCBDSkJpZzJfQ29udGV4dDo6ZGVjb2RlX1JhbmRvbU9yZ25hemF0aW9uX0ZpcnN0UGFnZShJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpbnQzMl90IG5SZXQ7CisgIHdoaWxlIChtX3BTdHJlYW0tPmdldEJ5dGVMZWZ0KCkgPiBKQklHMl9NSU5fU0VHTUVOVF9TSVpFKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9TZWdtZW50PiBwU2VnbWVudChuZXcgQ0pCaWcyX1NlZ21lbnQpOworICAgIG5SZXQgPSBwYXJzZVNlZ21lbnRIZWFkZXIocFNlZ21lbnQuZ2V0KCkpOworICAgIGlmIChuUmV0ICE9IEpCSUcyX1NVQ0NFU1MpIHsKKyAgICAgIHJldHVybiBuUmV0OworICAgIH0gZWxzZSBpZiAocFNlZ21lbnQtPm1fY0ZsYWdzLnMudHlwZSA9PSA1MSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIG1fU2VnbWVudExpc3QucHVzaF9iYWNrKHBTZWdtZW50LnJlbGVhc2UoKSk7CisgICAgaWYgKHBQYXVzZSAmJiBtX3BQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKKyAgICAgIG1fUGF1c2VTdGVwID0gMzsKKyAgICAgIG1fUHJvY2Vzc2luZ1N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CisgICAgICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKKyAgICB9CisgIH0KKyAgbV9uU2VnbWVudERlY29kZWQgPSAwOworICByZXR1cm4gZGVjb2RlX1JhbmRvbU9yZ25hemF0aW9uKHBQYXVzZSk7Cit9CitpbnQzMl90IENKQmlnMl9Db250ZXh0OjpkZWNvZGVfUmFuZG9tT3JnbmF6YXRpb24oSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgZm9yICg7IG1fblNlZ21lbnREZWNvZGVkIDwgbV9TZWdtZW50TGlzdC5zaXplKCk7ICsrbV9uU2VnbWVudERlY29kZWQpIHsKKyAgICBpbnQzMl90IG5SZXQgPQorICAgICAgICBwYXJzZVNlZ21lbnREYXRhKG1fU2VnbWVudExpc3QuZ2V0KG1fblNlZ21lbnREZWNvZGVkKSwgcFBhdXNlKTsKKyAgICBpZiAoblJldCA9PSBKQklHMl9FTkRfT0ZfUEFHRSB8fCBuUmV0ID09IEpCSUcyX0VORF9PRl9GSUxFKQorICAgICAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7CisKKyAgICBpZiAoblJldCAhPSBKQklHMl9TVUNDRVNTKQorICAgICAgcmV0dXJuIG5SZXQ7CisKKyAgICBpZiAobV9wUGFnZSAmJiBwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7CisgICAgICBtX1BhdXNlU3RlcCA9IDQ7CisgICAgICBtX1Byb2Nlc3NpbmdTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOworICAgICAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7CisgICAgfQorICB9CisgIHJldHVybiBKQklHMl9TVUNDRVNTOworfQoraW50MzJfdCBDSkJpZzJfQ29udGV4dDo6Z2V0Rmlyc3RQYWdlKHVpbnQ4X3QqIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpbnQzMl90IG5SZXQgPSAwOworICBpZiAobV9wR2xvYmFsQ29udGV4dCkgeworICAgIG5SZXQgPSBtX3BHbG9iYWxDb250ZXh0LT5kZWNvZGVfRW1iZWRPcmduYXphdGlvbihwUGF1c2UpOworICAgIGlmIChuUmV0ICE9IEpCSUcyX1NVQ0NFU1MpIHsKKyAgICAgIG1fUHJvY2Vzc2luZ1N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOworICAgICAgcmV0dXJuIG5SZXQ7CisgICAgfQorICB9CisgIG1fUGF1c2VTdGVwID0gMDsKKyAgbV9wUGFnZS5yZXNldChuZXcgQ0pCaWcyX0ltYWdlKHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcEJ1ZikpOworICBtX2JCdWZTcGVjaWZpZWQgPSB0cnVlOworICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgeworICAgIG1fUGF1c2VTdGVwID0gMTsKKyAgICBtX1Byb2Nlc3NpbmdTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwogICAgIHJldHVybiBuUmV0OworICB9CisgIHJldHVybiBDb250aW51ZShwUGF1c2UpOwogfQotRlhfSU5UMzIgQ0pCaWcyX0NvbnRleHQ6OmdldE5leHRQYWdlKEZYX0JZVEUgKnBCdWYsIEZYX0lOVDMyIHdpZHRoLCBGWF9JTlQzMiBoZWlnaHQsIEZYX0lOVDMyIHN0cmlkZSwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgRlhfSU5UMzIgblJldCA9IEpCSUcyX0VSUk9SX1NUUkVBTV9UWVBFOwotICAgIG1fYkZpcnN0UGFnZSA9IEZBTFNFOwotICAgIG1fUGF1c2VTdGVwID0gMDsKLSAgICBpZihtX3BQYWdlKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BQYWdlOwotICAgIH0KLSAgICBKQklHMl9BTExPQyhtX3BQYWdlLCBDSkJpZzJfSW1hZ2Uod2lkdGgsIGhlaWdodCwgc3RyaWRlLCBwQnVmKSk7Ci0gICAgbV9iQnVmU3BlY2lmaWVkID0gVFJVRTsKLSAgICBpZihtX3BQYWdlICYmIHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgbV9QYXVzZVN0ZXAgPSAxOwotICAgICAgICBtX1Byb2Nlc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwotICAgICAgICByZXR1cm4gblJldDsKLSAgICB9Ci0gICAgcmV0dXJuIENvbnRpbnVlKHBQYXVzZSk7Ci0gICAgc3dpdGNoKG1fblN0cmVhbVR5cGUpIHsKLSAgICAgICAgY2FzZSBKQklHMl9GSUxFX1NUUkVBTToKLSAgICAgICAgICAgIG5SZXQgPSBkZWNvZGVGaWxlKHBQYXVzZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBKQklHMl9TUVVFTlRJQUxfU1RSRUFNOgotICAgICAgICAgICAgblJldCA9IGRlY29kZV9TcXVlbnRpYWxPcmduYXphdGlvbihwUGF1c2UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSkJJRzJfUkFORE9NX1NUUkVBTToKLSAgICAgICAgICAgIG5SZXQgPSBkZWNvZGVfUmFuZG9tT3JnbmF6YXRpb24ocFBhdXNlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEpCSUcyX0VNQkVEX1NUUkVBTToKLSAgICAgICAgICAgIG5SZXQgPSBkZWNvZGVfRW1iZWRPcmduYXphdGlvbihwUGF1c2UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfU1RSRUFNX1RZUEU7Ci0gICAgfQotICAgIHJldHVybiBuUmV0OwotfQotRlhfSU5UMzIgQ0pCaWcyX0NvbnRleHQ6OmdldEZpcnN0UGFnZShDSkJpZzJfSW1hZ2UgKippbWFnZSwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgRlhfSU5UMzIgblJldDsKLSAgICBtX2JGaXJzdFBhZ2UgPSBUUlVFOwotICAgIG1fUGF1c2VTdGVwID0gMDsKLSAgICBpZihtX3BHbG9iYWxDb250ZXh0KSB7Ci0gICAgICAgIG5SZXQgPSBtX3BHbG9iYWxDb250ZXh0LT5kZWNvZGVfRW1iZWRPcmduYXphdGlvbihwUGF1c2UpOwotICAgICAgICBpZihuUmV0ICE9IEpCSUcyX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHJldHVybiBuUmV0OwotICAgICAgICB9Ci0gICAgfQotICAgIG1fYkJ1ZlNwZWNpZmllZCA9IEZBTFNFOwotICAgIHJldHVybiBDb250aW51ZShwUGF1c2UpOwotfQotRlhfSU5UMzIgQ0pCaWcyX0NvbnRleHQ6OmdldE5leHRQYWdlKENKQmlnMl9JbWFnZSAqKmltYWdlLCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBGWF9JTlQzMiBuUmV0OwotICAgIG1fYkJ1ZlNwZWNpZmllZCA9IEZBTFNFOwotICAgIG1fYkZpcnN0UGFnZSA9IEZBTFNFOwotICAgIG1fUGF1c2VTdGVwID0gMDsKLSAgICBzd2l0Y2gobV9uU3RyZWFtVHlwZSkgewotICAgICAgICBjYXNlIEpCSUcyX0ZJTEVfU1RSRUFNOgotICAgICAgICAgICAgblJldCA9IGRlY29kZUZpbGUocFBhdXNlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEpCSUcyX1NRVUVOVElBTF9TVFJFQU06Ci0gICAgICAgICAgICBuUmV0ID0gZGVjb2RlX1NxdWVudGlhbE9yZ25hemF0aW9uKHBQYXVzZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBKQklHMl9SQU5ET01fU1RSRUFNOgotICAgICAgICAgICAgblJldCA9IGRlY29kZV9SYW5kb21PcmduYXphdGlvbihwUGF1c2UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSkJJRzJfRU1CRURfU1RSRUFNOgotICAgICAgICAgICAgblJldCA9IGRlY29kZV9FbWJlZE9yZ25hemF0aW9uKHBQYXVzZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBKQklHMl9FUlJPUl9TVFJFQU1fVFlQRTsKLSAgICB9Ci0gICAgaWYoblJldCA9PSBKQklHMl9TVUNDRVNTKSB7Ci0gICAgICAgICppbWFnZSA9IG1fcFBhZ2U7Ci0gICAgICAgIG1fcFBhZ2UgPSBOVUxMOwotICAgICAgICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKLSAgICB9Ci0gICAgcmV0dXJuIG5SZXQ7Ci19Ci1DSkJpZzJfU2VnbWVudCAqQ0pCaWcyX0NvbnRleHQ6OmZpbmRTZWdtZW50QnlOdW1iZXIoRlhfRFdPUkQgZHdOdW1iZXIpCi17Ci0gICAgQ0pCaWcyX1NlZ21lbnQgKnBTZWc7Ci0gICAgRlhfSU5UMzIgaTsKLSAgICBpZihtX3BHbG9iYWxDb250ZXh0KSB7Ci0gICAgICAgIHBTZWcgPSBtX3BHbG9iYWxDb250ZXh0LT5maW5kU2VnbWVudEJ5TnVtYmVyKGR3TnVtYmVyKTsKLSAgICAgICAgaWYocFNlZykgewotICAgICAgICAgICAgcmV0dXJuIHBTZWc7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9yKGkgPSAwOyBpIDwgbV9wU2VnbWVudExpc3QtPmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgcFNlZyA9IG1fcFNlZ21lbnRMaXN0LT5nZXRBdChpKTsKLSAgICAgICAgaWYocFNlZy0+bV9kd051bWJlciA9PSBkd051bWJlcikgewotICAgICAgICAgICAgcmV0dXJuIHBTZWc7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci1DSkJpZzJfU2VnbWVudCAqQ0pCaWcyX0NvbnRleHQ6OmZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChDSkJpZzJfU2VnbWVudCAqcFNlZ21lbnQsCi0gICAgICAgIEZYX0JZVEUgY1R5cGUsIEZYX0lOVDMyIG5JbmRleCkKLXsKLSAgICBDSkJpZzJfU2VnbWVudCAqcFNlZzsKLSAgICBGWF9JTlQzMiBpLCBjb3VudDsKLSAgICBjb3VudCA9IDA7Ci0gICAgZm9yKGkgPSAwOyBpIDwgcFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQ7IGkrKykgewotICAgICAgICBwU2VnID0gZmluZFNlZ21lbnRCeU51bWJlcihwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldKTsKLSAgICAgICAgaWYocFNlZyAmJiBwU2VnLT5tX2NGbGFncy5zLnR5cGUgPT0gY1R5cGUpIHsKLSAgICAgICAgICAgIGlmKGNvdW50ID09IG5JbmRleCkgewotICAgICAgICAgICAgICAgIHJldHVybiBwU2VnOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb3VudCArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLUZYX0lOVDMyIENKQmlnMl9Db250ZXh0OjpwYXJzZVNlZ21lbnRIZWFkZXIoQ0pCaWcyX1NlZ21lbnQgKnBTZWdtZW50KQotewotICAgIEZYX0JZVEUgIGNTU2l6ZSwgY1BTaXplOwotICAgIEZYX0JZVEUgY1RlbXA7Ci0gICAgRlhfV09SRCB3VGVtcDsKLSAgICBGWF9EV09SRCBkd1RlbXA7Ci0gICAgaWYoKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoJnBTZWdtZW50LT5tX2R3TnVtYmVyKSAhPSAwKQotICAgICAgICAgICAgfHwgKG1fcFN0cmVhbS0+cmVhZDFCeXRlKCZwU2VnbWVudC0+bV9jRmxhZ3MuYykgIT0gMCkpIHsKLSAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgIGNUZW1wID0gbV9wU3RyZWFtLT5nZXRDdXJCeXRlKCk7Ci0gICAgaWYoKGNUZW1wID4+IDUpID09IDcpIHsKLSAgICAgICAgaWYobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigoRlhfRFdPUkQqKSZwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudCkgIT0gMCkgewotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgcFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQgJj0gMHgxZmZmZmZmZjsKLSAgICAgICAgaWYgKHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50ID4gSkJJRzJfTUFYX1JFRkVSUkVEX1NFR01FTlRfQ09VTlQpIHsKLSAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoIlRvbyBtYW55IHJlZmVycmVkIHNlZ21lbnRzLiIpOwotICAgICAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0xJTUlUOwotICAgICAgICB9Ci0gICAgICAgIGR3VGVtcCA9IDUgKyA0ICsgKHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50ICsgMSkgLyA4OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKG1fcFN0cmVhbS0+cmVhZDFCeXRlKCZjVGVtcCkgIT0gMCkgewotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgcFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQgPSBjVGVtcCA+PiA1OwotICAgICAgICBkd1RlbXAgPSA1ICsgMTsKLSAgICB9Ci0gICAgY1NTaXplID0gcFNlZ21lbnQtPm1fZHdOdW1iZXIgPiA2NTUzNiA/IDQgOiBwU2VnbWVudC0+bV9kd051bWJlciA+IDI1NiA/IDIgOiAxOwotICAgIGNQU2l6ZSA9IHBTZWdtZW50LT5tX2NGbGFncy5zLnBhZ2VfYXNzb2NpYXRpb25fc2l6ZSA/IDQgOiAxOwotICAgIGlmKHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50KSB7Ci0gICAgICAgIHBTZWdtZW50LT5tX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnMgPSAoRlhfRFdPUkQqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMigKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZYX0RXT1JEKSwgcFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQpOwotICAgICAgICBmb3IoRlhfSU5UMzIgaSA9IDA7IGkgPCBwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBzd2l0Y2goY1NTaXplKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBpZihtX3BTdHJlYW0tPnJlYWQxQnl0ZSgmY1RlbXApICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBTZWdtZW50LT5tX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnNbaV0gPSBjVGVtcDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICBpZihtX3BTdHJlYW0tPnJlYWRTaG9ydEludGVnZXIoJndUZW1wKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldID0gd1RlbXA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgaWYobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigmZHdUZW1wKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldID0gZHdUZW1wOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldID49IHBTZWdtZW50LT5tX2R3TnVtYmVyKSB7Ci0gICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiVGhlIHJlZmVycmVkIHNlZ21lbnQgbnVtYmVyIGlzIGdyZWF0ZXIgdGhhbiB0aGlzIHNlZ21lbnQgbnVtYmVyLiIpOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmKGNQU2l6ZSA9PSAxKSB7Ci0gICAgICAgIGlmKG1fcFN0cmVhbS0+cmVhZDFCeXRlKCZjVGVtcCkgIT0gMCkgewotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgcFNlZ21lbnQtPm1fZHdQYWdlX2Fzc29jaWF0aW9uID0gY1RlbXA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigmcFNlZ21lbnQtPm1fZHdQYWdlX2Fzc29jaWF0aW9uKSAhPSAwKSB7Ci0gICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZihtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKCZwU2VnbWVudC0+bV9kd0RhdGFfbGVuZ3RoKSAhPSAwKSB7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLSAgICBwU2VnbWVudC0+bV9wRGF0YSA9IG1fcFN0cmVhbS0+Z2V0UG9pbnRlcigpOwotICAgIHBTZWdtZW50LT5tX1N0YXRlID0gSkJJRzJfU0VHTUVOVF9EQVRBX1VOUEFSU0VEOworaW50MzJfdCBDSkJpZzJfQ29udGV4dDo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgbV9Qcm9jZXNzaW5nU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1JFQURZOworICBpbnQzMl90IG5SZXQ7CisgIGlmIChtX1BhdXNlU3RlcCA8PSAxKSB7CisgICAgblJldCA9IGRlY29kZV9FbWJlZE9yZ25hemF0aW9uKHBQYXVzZSk7CisgIH0gZWxzZSBpZiAobV9QYXVzZVN0ZXAgPT0gMikgeworICAgIG5SZXQgPSBkZWNvZGVfU3F1ZW50aWFsT3JnbmF6YXRpb24ocFBhdXNlKTsKKyAgfSBlbHNlIGlmIChtX1BhdXNlU3RlcCA9PSAzKSB7CisgICAgblJldCA9IGRlY29kZV9SYW5kb21PcmduYXphdGlvbl9GaXJzdFBhZ2UocFBhdXNlKTsKKyAgfSBlbHNlIGlmIChtX1BhdXNlU3RlcCA9PSA0KSB7CisgICAgblJldCA9IGRlY29kZV9SYW5kb21PcmduYXphdGlvbihwUGF1c2UpOworICB9IGVsc2UgaWYgKG1fUGF1c2VTdGVwID09IDUpIHsKKyAgICBtX1Byb2Nlc3NpbmdTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwogICAgIHJldHVybiBKQklHMl9TVUNDRVNTOwotZmFpbGVkOgotICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoImhlYWRlciB0b28gc2hvcnQuIik7CisgIH0KKyAgaWYgKG1fUHJvY2Vzc2luZ1N0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7CisgICAgcmV0dXJuIG5SZXQ7CisgIH0KKyAgbV9QYXVzZVN0ZXAgPSA1OworICBpZiAoIW1fYkJ1ZlNwZWNpZmllZCAmJiBuUmV0ID09IEpCSUcyX1NVQ0NFU1MpIHsKKyAgICBtX1Byb2Nlc3NpbmdTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworICAgIHJldHVybiBKQklHMl9TVUNDRVNTOworICB9CisgIGlmIChuUmV0ID09IEpCSUcyX1NVQ0NFU1MpIHsKKyAgICBtX1Byb2Nlc3NpbmdTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworICB9IGVsc2UgeworICAgIG1fUHJvY2Vzc2luZ1N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOworICB9CisgIHJldHVybiBuUmV0OworfQorCitDSkJpZzJfU2VnbWVudCogQ0pCaWcyX0NvbnRleHQ6OmZpbmRTZWdtZW50QnlOdW1iZXIoRlhfRFdPUkQgZHdOdW1iZXIpIHsKKyAgaWYgKG1fcEdsb2JhbENvbnRleHQpIHsKKyAgICBDSkJpZzJfU2VnbWVudCogcFNlZyA9IG1fcEdsb2JhbENvbnRleHQtPmZpbmRTZWdtZW50QnlOdW1iZXIoZHdOdW1iZXIpOworICAgIGlmIChwU2VnKSB7CisgICAgICByZXR1cm4gcFNlZzsKKyAgICB9CisgIH0KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX1NlZ21lbnRMaXN0LnNpemUoKTsgKytpKSB7CisgICAgQ0pCaWcyX1NlZ21lbnQqIHBTZWcgPSBtX1NlZ21lbnRMaXN0LmdldChpKTsKKyAgICBpZiAocFNlZy0+bV9kd051bWJlciA9PSBkd051bWJlcikgeworICAgICAgcmV0dXJuIHBTZWc7CisgICAgfQorICB9CisgIHJldHVybiBudWxscHRyOworfQorQ0pCaWcyX1NlZ21lbnQqIENKQmlnMl9Db250ZXh0OjpmaW5kUmVmZXJyZWRTZWdtZW50QnlUeXBlQW5kSW5kZXgoCisgICAgQ0pCaWcyX1NlZ21lbnQqIHBTZWdtZW50LAorICAgIHVpbnQ4X3QgY1R5cGUsCisgICAgaW50MzJfdCBuSW5kZXgpIHsKKyAgaW50MzJfdCBjb3VudCA9IDA7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50OyArK2kpIHsKKyAgICBDSkJpZzJfU2VnbWVudCogcFNlZyA9CisgICAgICAgIGZpbmRTZWdtZW50QnlOdW1iZXIocFNlZ21lbnQtPm1fcFJlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVyc1tpXSk7CisgICAgaWYgKHBTZWcgJiYgcFNlZy0+bV9jRmxhZ3Mucy50eXBlID09IGNUeXBlKSB7CisgICAgICBpZiAoY291bnQgPT0gbkluZGV4KQorICAgICAgICByZXR1cm4gcFNlZzsKKyAgICAgICsrY291bnQ7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQoraW50MzJfdCBDSkJpZzJfQ29udGV4dDo6cGFyc2VTZWdtZW50SGVhZGVyKENKQmlnMl9TZWdtZW50KiBwU2VnbWVudCkgeworICBpZiAobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigmcFNlZ21lbnQtPm1fZHdOdW1iZXIpICE9IDAgfHwKKyAgICAgIG1fcFN0cmVhbS0+cmVhZDFCeXRlKCZwU2VnbWVudC0+bV9jRmxhZ3MuYykgIT0gMCkgewogICAgIHJldHVybiBKQklHMl9FUlJPUl9UT09fU0hPUlQ7Ci19Ci1GWF9JTlQzMiBDSkJpZzJfQ29udGV4dDo6cGFyc2VTZWdtZW50RGF0YShDSkJpZzJfU2VnbWVudCAqcFNlZ21lbnQsIElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIEZYX0lOVDMyIHJldCA9IFByb2Nlc3NpdmVQYXJzZVNlZ21lbnREYXRhKHBTZWdtZW50LCBwUGF1c2UpOwotICAgIHdoaWxlKG1fUHJvY2Vzc2l2ZVN0YXR1cyAgPT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRSAmJiBtX3BTdHJlYW0tPmdldEJ5dGVMZWZ0KCkgPiAwKSB7Ci0gICAgICAgIHJldCA9IFByb2Nlc3NpdmVQYXJzZVNlZ21lbnREYXRhKHBTZWdtZW50LCBwUGF1c2UpOworICB9CisKKyAgRlhfRFdPUkQgZHdUZW1wOworICB1aW50OF90IGNUZW1wID0gbV9wU3RyZWFtLT5nZXRDdXJCeXRlKCk7CisgIGlmICgoY1RlbXAgPj4gNSkgPT0gNykgeworICAgIGlmIChtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKAorICAgICAgICAgICAgKEZYX0RXT1JEKikmcFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQpICE9IDApIHsKKyAgICAgIHJldHVybiBKQklHMl9FUlJPUl9UT09fU0hPUlQ7CiAgICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci1GWF9JTlQzMiBDSkJpZzJfQ29udGV4dDo6UHJvY2Vzc2l2ZVBhcnNlU2VnbWVudERhdGEoQ0pCaWcyX1NlZ21lbnQgKnBTZWdtZW50LCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBzd2l0Y2gocFNlZ21lbnQtPm1fY0ZsYWdzLnMudHlwZSkgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICByZXR1cm4gcGFyc2VTeW1ib2xEaWN0KHBTZWdtZW50LCBwUGF1c2UpOworICAgIHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50ICY9IDB4MWZmZmZmZmY7CisgICAgaWYgKHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50ID4KKyAgICAgICAgSkJJRzJfTUFYX1JFRkVSUkVEX1NFR01FTlRfQ09VTlQpIHsKKyAgICAgIHJldHVybiBKQklHMl9FUlJPUl9MSU1JVDsKKyAgICB9CisgICAgZHdUZW1wID0gNSArIDQgKyAocFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQgKyAxKSAvIDg7CisgIH0gZWxzZSB7CisgICAgaWYgKG1fcFN0cmVhbS0+cmVhZDFCeXRlKCZjVGVtcCkgIT0gMCkKKyAgICAgIHJldHVybiBKQklHMl9FUlJPUl9UT09fU0hPUlQ7CisKKyAgICBwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudCA9IGNUZW1wID4+IDU7CisgICAgZHdUZW1wID0gNSArIDE7CisgIH0KKyAgdWludDhfdCBjU1NpemUgPQorICAgICAgcFNlZ21lbnQtPm1fZHdOdW1iZXIgPiA2NTUzNiA/IDQgOiBwU2VnbWVudC0+bV9kd051bWJlciA+IDI1NiA/IDIgOiAxOworICB1aW50OF90IGNQU2l6ZSA9IHBTZWdtZW50LT5tX2NGbGFncy5zLnBhZ2VfYXNzb2NpYXRpb25fc2l6ZSA/IDQgOiAxOworICBpZiAocFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQpIHsKKyAgICBwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzID0KKyAgICAgICAgRlhfQWxsb2MoRlhfRFdPUkQsIHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50KTsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudDsgKytpKSB7CisgICAgICBzd2l0Y2ggKGNTU2l6ZSkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgaWYgKG1fcFN0cmVhbS0+cmVhZDFCeXRlKCZjVGVtcCkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBKQklHMl9FUlJPUl9UT09fU0hPUlQ7CisKKyAgICAgICAgICBwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldID0gY1RlbXA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICBGWF9XT1JEIHdUZW1wOworICAgICAgICAgIGlmIChtX3BTdHJlYW0tPnJlYWRTaG9ydEludGVnZXIoJndUZW1wKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKKworICAgICAgICAgIHBTZWdtZW50LT5tX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnNbaV0gPSB3VGVtcDsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA0OgotICAgICAgICBjYXNlIDY6Ci0gICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgIGlmKG1fblN0YXRlID09IEpCSUcyX09VVF9PRl9QQUdFKSB7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsZWQyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VUZXh0UmVnaW9uKHBTZWdtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgIHJldHVybiBwYXJzZVBhdHRlcm5EaWN0KHBTZWdtZW50LCBwUGF1c2UpOwotICAgICAgICBjYXNlIDIwOgotICAgICAgICBjYXNlIDIyOgotICAgICAgICBjYXNlIDIzOgotICAgICAgICAgICAgaWYobV9uU3RhdGUgPT0gSkJJRzJfT1VUX09GX1BBR0UpIHsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUhhbGZ0b25lUmVnaW9uKHBTZWdtZW50LCBwUGF1c2UpOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIDM2OgotICAgICAgICBjYXNlIDM4OgotICAgICAgICBjYXNlIDM5OgotICAgICAgICAgICAgaWYobV9uU3RhdGUgPT0gSkJJRzJfT1VUX09GX1BBR0UpIHsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUdlbmVyaWNSZWdpb24ocFNlZ21lbnQsIHBQYXVzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNDA6Ci0gICAgICAgIGNhc2UgNDI6Ci0gICAgICAgIGNhc2UgNDM6Ci0gICAgICAgICAgICBpZihtX25TdGF0ZSA9PSBKQklHMl9PVVRfT0ZfUEFHRSkgewotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkMjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlR2VuZXJpY1JlZmluZW1lbnRSZWdpb24ocFNlZ21lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIDQ4OiB7Ci0gICAgICAgICAgICAgICAgRlhfV09SRCB3VGVtcDsKLSAgICAgICAgICAgICAgICBKQmlnMlBhZ2VJbmZvICpwUGFnZUluZm87Ci0gICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MocFBhZ2VJbmZvLCBKQmlnMlBhZ2VJbmZvKTsKLSAgICAgICAgICAgICAgICBpZigobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigmcFBhZ2VJbmZvLT5tX2R3V2lkdGgpICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigmcFBhZ2VJbmZvLT5tX2R3SGVpZ2h0KSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoJnBQYWdlSW5mby0+bV9kd1Jlc29sdXRpb25YKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoJnBQYWdlSW5mby0+bV9kd1Jlc29sdXRpb25ZKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKG1fcFN0cmVhbS0+cmVhZDFCeXRlKCZwUGFnZUluZm8tPm1fY0ZsYWdzKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKG1fcFN0cmVhbS0+cmVhZFNob3J0SW50ZWdlcigmd1RlbXApICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwUGFnZUluZm87Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcFBhZ2VJbmZvLT5tX2JJc1N0cmlwZWQgPSAoKHdUZW1wID4+IDE1KSAmIDEpID8gMSA6IDA7Ci0gICAgICAgICAgICAgICAgcFBhZ2VJbmZvLT5tX3dNYXhTdHJpcGVTaXplID0gd1RlbXAgJiAweDdmZmY7Ci0gICAgICAgICAgICAgICAgaWYoKHBQYWdlSW5mby0+bV9kd0hlaWdodCA9PSAweGZmZmZmZmZmKSAmJiAocFBhZ2VJbmZvLT5tX2JJc1N0cmlwZWQgIT0gMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9XYXJuKCJwYWdlIGhlaWdodCA9IDB4ZmZmZmZmZmYgYnVmIHN0cmlwZSBmaWVsZCBpcyAwIik7Ci0gICAgICAgICAgICAgICAgICAgIHBQYWdlSW5mby0+bV9iSXNTdHJpcGVkID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoIW1fYkJ1ZlNwZWNpZmllZCkgewotICAgICAgICAgICAgICAgICAgICBpZihtX3BQYWdlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgbV9wUGFnZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZihwUGFnZUluZm8tPm1fZHdIZWlnaHQgPT0gMHhmZmZmZmZmZikgewotICAgICAgICAgICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MobV9wUGFnZSwgQ0pCaWcyX0ltYWdlKHBQYWdlSW5mby0+bV9kd1dpZHRoLCBwUGFnZUluZm8tPm1fd01heFN0cmlwZVNpemUpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEpCSUcyX0FMTE9DKG1fcFBhZ2UsIENKQmlnMl9JbWFnZShwUGFnZUluZm8tPm1fZHdXaWR0aCwgcFBhZ2VJbmZvLT5tX2R3SGVpZ2h0KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9wUGFnZS0+ZmlsbCgocFBhZ2VJbmZvLT5tX2NGbGFncyAmIDQpID8gMSA6IDApOwotICAgICAgICAgICAgICAgIG1fcFBhZ2VJbmZvTGlzdC0+YWRkSXRlbShwUGFnZUluZm8pOwotICAgICAgICAgICAgICAgIG1fblN0YXRlID0gSkJJRzJfSU5fUEFHRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ5OgotICAgICAgICAgICAgbV9uU3RhdGUgPSBKQklHMl9PVVRfT0ZfUEFHRTsKLSAgICAgICAgICAgIHJldHVybiBKQklHMl9FTkRfT0ZfUEFHRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDUwOgotICAgICAgICAgICAgbV9wU3RyZWFtLT5vZmZzZXQocFNlZ21lbnQtPm1fZHdEYXRhX2xlbmd0aCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1MToKLSAgICAgICAgICAgIHJldHVybiBKQklHMl9FTkRfT0ZfRklMRTsKLSAgICAgICAgY2FzZSA1MjoKLSAgICAgICAgICAgIG1fcFN0cmVhbS0+b2Zmc2V0KHBTZWdtZW50LT5tX2R3RGF0YV9sZW5ndGgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTM6Ci0gICAgICAgICAgICByZXR1cm4gcGFyc2VUYWJsZShwU2VnbWVudCk7Ci0gICAgICAgIGNhc2UgNjI6Ci0gICAgICAgICAgICBtX3BTdHJlYW0tPm9mZnNldChwU2VnbWVudC0+bV9kd0RhdGFfbGVuZ3RoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBKQklHMl9TVUNDRVNTOwotZmFpbGVkMToKLSAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzZWdtZW50IGRhdGEgdG9vIHNob3J0LiIpOwotICAgIHJldHVybiBKQklHMl9FUlJPUl9UT09fU0hPUlQ7Ci1mYWlsZWQyOgotICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInNlZ21lbnQgc3ludGF4IGVycm9yLiIpOwotICAgIHJldHVybiBKQklHMl9FUlJPUl9GRVRBTDsKLX0KLUZYX0lOVDMyIENKQmlnMl9Db250ZXh0OjpwYXJzZVN5bWJvbERpY3QoQ0pCaWcyX1NlZ21lbnQgKnBTZWdtZW50LCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBGWF9EV09SRCBkd1RlbXA7Ci0gICAgRlhfV09SRCB3RmxhZ3M7Ci0gICAgRlhfQllURSBjU0RIVUZGREgsIGNTREhVRkZEVywgY1NESFVGRkJNU0laRSwgY1NESFVGRkFHR0lOU1Q7Ci0gICAgQ0pCaWcyX0h1ZmZtYW5UYWJsZSAqVGFibGVfQjEgPSBOVUxMLCAqVGFibGVfQjIgPSBOVUxMLCAqVGFibGVfQjMgPSBOVUxMLCAqVGFibGVfQjQgPSBOVUxMLCAqVGFibGVfQjUgPSBOVUxMOwotICAgIEZYX0lOVDMyIGksIG5JbmRleCwgblJldDsKLSAgICBDSkJpZzJfU2VnbWVudCAqcFNlZyA9IE5VTEwsICpwTFJTZWcgPSBOVUxMOwotICAgIEZYX0JPT0wgYlVzZWQ7Ci0gICAgQ0pCaWcyX0ltYWdlICoqIFNESU5TWU1TID0gTlVMTDsKLSAgICBDSkJpZzJfU0REUHJvYyAqcFN5bWJvbERpY3REZWNvZGVyOwotICAgIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCA9IE5VTEwsICpnckNvbnRleHQgPSBOVUxMOwotICAgIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXI7Ci0gICAgSkJJRzJfQUxMT0MocFN5bWJvbERpY3REZWNvZGVyLCBDSkJpZzJfU0REUHJvYygpKTsKLSAgICBGWF9CWVRFICprZXkgPSBwU2VnbWVudC0+bV9wRGF0YTsKLSAgICBGWF9CT09MIGNhY2hlX2hpdCA9IGZhbHNlOwotICAgIGlmKG1fcFN0cmVhbS0+cmVhZFNob3J0SW50ZWdlcigmd0ZsYWdzKSAhPSAwKSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInN5bWJvbCBkaWN0aW9uYXJ5IHNlZ21lbnQgOiBkYXRhIGhlYWRlciB0b28gc2hvcnQuIik7Ci0gICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9UT09fU0hPUlQ7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLSAgICBwU3ltYm9sRGljdERlY29kZXItPlNESFVGRiA9IHdGbGFncyAmIDB4MDAwMTsKLSAgICBwU3ltYm9sRGljdERlY29kZXItPlNEUkVGQUdHID0gKHdGbGFncyA+PiAxKSAmIDB4MDAwMTsKLSAgICBwU3ltYm9sRGljdERlY29kZXItPlNEVEVNUExBVEUgPSAod0ZsYWdzID4+IDEwKSAmIDB4MDAwMzsKLSAgICBwU3ltYm9sRGljdERlY29kZXItPlNEUlRFTVBMQVRFID0gKHdGbGFncyA+PiAxMikgJiAweDAwMDM7Ci0gICAgY1NESFVGRkRIID0gKHdGbGFncyA+PiAyKSAmIDB4MDAwMzsKLSAgICBjU0RIVUZGRFcgPSAod0ZsYWdzID4+IDQpICYgMHgwMDAzOwotICAgIGNTREhVRkZCTVNJWkUgPSAod0ZsYWdzID4+IDYpICYgMHgwMDAxOwotICAgIGNTREhVRkZBR0dJTlNUID0gKHdGbGFncyA+PiA3KSAmIDB4MDAwMTsKLSAgICBpZihwU3ltYm9sRGljdERlY29kZXItPlNESFVGRiA9PSAwKSB7Ci0gICAgICAgIGlmKHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RURU1QTEFURSA9PSAwKSB7Ci0gICAgICAgICAgICBkd1RlbXAgPSA4OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZHdUZW1wID0gMjsKLSAgICAgICAgfQotICAgICAgICBmb3IoaSA9IDA7IGkgPCAoRlhfSU5UMzIpZHdUZW1wOyBpKyspIHsKLSAgICAgICAgICAgIGlmKG1fcFN0cmVhbS0+cmVhZDFCeXRlKChGWF9CWVRFKikmcFN5bWJvbERpY3REZWNvZGVyLT5TREFUW2ldKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgc2VnbWVudCA6IGRhdGEgaGVhZGVyIHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfVE9PX1NIT1JUOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmKChwU3ltYm9sRGljdERlY29kZXItPlNEUkVGQUdHID09IDEpICYmIChwU3ltYm9sRGljdERlY29kZXItPlNEUlRFTVBMQVRFID09IDApKSB7Ci0gICAgICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgaWYobV9wU3RyZWFtLT5yZWFkMUJ5dGUoKEZYX0JZVEUqKSZwU3ltYm9sRGljdERlY29kZXItPlNEUkFUW2ldKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgc2VnbWVudCA6IGRhdGEgaGVhZGVyIHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfVE9PX1NIT1JUOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmKChtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKCZwU3ltYm9sRGljdERlY29kZXItPlNETlVNRVhTWU1TKSAhPSAwKQotICAgICAgICAgICAgfHwgKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoJnBTeW1ib2xEaWN0RGVjb2Rlci0+U0ROVU1ORVdTWU1TKSAhPSAwKSkgewotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzeW1ib2wgZGljdGlvbmFyeSBzZWdtZW50IDogZGF0YSBoZWFkZXIgdG9vIHNob3J0LiIpOwotICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfVE9PX1NIT1JUOwotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgaWYgKHBTeW1ib2xEaWN0RGVjb2Rlci0+U0ROVU1FWFNZTVMgPiBKQklHMl9NQVhfRVhQT1JUX1NZU01CT0xTCi0gICAgICAgICAgICB8fCBwU3ltYm9sRGljdERlY29kZXItPlNETlVNTkVXU1lNUyA+IEpCSUcyX01BWF9ORVdfU1lTTUJPTFMpIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgc2VnbWVudCA6IHRvbyBtYW55IGV4cG9ydC9uZXcgc3ltYm9scy4iKTsKLSAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0xJTUlUOwotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgZm9yKGkgPSAwOyBpIDwgcFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQ7IGkrKykgewotICAgICAgICBpZighZmluZFNlZ21lbnRCeU51bWJlcihwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldKSkgewotICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgc2VnbWVudCA6IGNhbid0IGZpbmQgcmVmZXJlZCB0byBzZWdtZW50cyIpOwotICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZFVEFMOwotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcFN5bWJvbERpY3REZWNvZGVyLT5TRE5VTUlOU1lNUyA9IDA7Ci0gICAgZm9yKGkgPSAwOyBpIDwgcFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQ7IGkrKykgewotICAgICAgICBwU2VnID0gZmluZFNlZ21lbnRCeU51bWJlcihwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldKTsKLSAgICAgICAgaWYocFNlZy0+bV9jRmxhZ3Mucy50eXBlID09IDApIHsKLSAgICAgICAgICAgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0ROVU1JTlNZTVMgKz0gcFNlZy0+bV9SZXN1bHQuc2QtPlNETlVNRVhTWU1TOwotICAgICAgICAgICAgcExSU2VnID0gcFNlZzsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZihwU3ltYm9sRGljdERlY29kZXItPlNETlVNSU5TWU1TID09IDApIHsKLSAgICAgICAgU0RJTlNZTVMgPSBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFNESU5TWU1TID0gKENKQmlnMl9JbWFnZSoqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMigKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKENKQmlnMl9JbWFnZSopLCBwU3ltYm9sRGljdERlY29kZXItPlNETlVNSU5TWU1TKTsKLSAgICAgICAgZHdUZW1wID0gMDsKLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgcFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQ7IGkrKykgewotICAgICAgICAgICAgcFNlZyA9IGZpbmRTZWdtZW50QnlOdW1iZXIocFNlZ21lbnQtPm1fcFJlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVyc1tpXSk7Ci0gICAgICAgICAgICBpZihwU2VnLT5tX2NGbGFncy5zLnR5cGUgPT0gMCkgewotICAgICAgICAgICAgICAgIEpCSUcyX21lbWNweShTRElOU1lNUyArIGR3VGVtcCwgcFNlZy0+bV9SZXN1bHQuc2QtPlNERVhTWU1TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnLT5tX1Jlc3VsdC5zZC0+U0ROVU1FWFNZTVMgKiBzaXplb2YoQ0pCaWcyX0ltYWdlKikpOwotICAgICAgICAgICAgICAgIGR3VGVtcCArPSBwU2VnLT5tX1Jlc3VsdC5zZC0+U0ROVU1FWFNZTVM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcFN5bWJvbERpY3REZWNvZGVyLT5TRElOU1lNUyA9IFNESU5TWU1TOwotICAgIGlmKHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RIVUZGID09IDEpIHsKLSAgICAgICAgaWYoKGNTREhVRkZESCA9PSAyKSB8fCAoY1NESFVGRkRXID09IDIpKSB7Ci0gICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzeW1ib2wgZGljdGlvbmFyeSBzZWdtZW50IDogU0RIVUZGREg9MiBvciBTREhVRkZEVz0yIGlzIG5vdCBwZXJtaXR0ZWQuIik7Ci0gICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkVUQUw7Ci0gICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotICAgICAgICBuSW5kZXggPSAwOwotICAgICAgICBpZihjU0RIVUZGREggPT0gMCkgewotICAgICAgICAgICAgSkJJRzJfQUxMT0MoVGFibGVfQjQsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0I0LAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CNCkgLyBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLCBIdWZmbWFuVGFibGVfSFRPT0JfQjQpKTsKLSAgICAgICAgICAgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RIVUZGREggPSBUYWJsZV9CNDsKLSAgICAgICAgfSBlbHNlIGlmKGNTREhVRkZESCA9PSAxKSB7Ci0gICAgICAgICAgICBKQklHMl9BTExPQyhUYWJsZV9CNSwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0I1KSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CNSkpOwotICAgICAgICAgICAgcFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkZESCA9IFRhYmxlX0I1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcFNlZyA9IGZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChwU2VnbWVudCwgNTMsIG5JbmRleCsrKTsKLSAgICAgICAgICAgIGlmKCFwU2VnKSB7Ci0gICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgc2VnbWVudCA6IFNESFVGRkRIIGNhbid0IGZpbmQgdXNlciBzdXBwbGllZCB0YWJsZS4iKTsKLSAgICAgICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkVUQUw7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwU3ltYm9sRGljdERlY29kZXItPlNESFVGRkRIID0gcFNlZy0+bV9SZXN1bHQuaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoY1NESFVGRkRXID09IDApIHsKLSAgICAgICAgICAgIEpCSUcyX0FMTE9DKFRhYmxlX0IyLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjIpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0IyKSk7Ci0gICAgICAgICAgICBwU3ltYm9sRGljdERlY29kZXItPlNESFVGRkRXID0gVGFibGVfQjI7Ci0gICAgICAgIH0gZWxzZSBpZihjU0RIVUZGRFcgPT0gMSkgewotICAgICAgICAgICAgSkJJRzJfQUxMT0MoVGFibGVfQjMsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IzLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMykgLyBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLCBIdWZmbWFuVGFibGVfSFRPT0JfQjMpKTsKLSAgICAgICAgICAgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RIVUZGRFcgPSBUYWJsZV9CMzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBTZWcgPSBmaW5kUmVmZXJyZWRTZWdtZW50QnlUeXBlQW5kSW5kZXgocFNlZ21lbnQsIDUzLCBuSW5kZXgrKyk7Ci0gICAgICAgICAgICBpZighcFNlZykgewotICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInN5bWJvbCBkaWN0aW9uYXJ5IHNlZ21lbnQgOiBTREhVRkZEVyBjYW4ndCBmaW5kIHVzZXIgc3VwcGxpZWQgdGFibGUuIik7Ci0gICAgICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZFVEFMOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkZEVyA9IHBTZWctPm1fUmVzdWx0Lmh0OwotICAgICAgICB9Ci0gICAgICAgIGlmKGNTREhVRkZCTVNJWkUgPT0gMCkgewotICAgICAgICAgICAgSkJJRzJfQUxMT0MoVGFibGVfQjEsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMSkgLyBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLCBIdWZmbWFuVGFibGVfSFRPT0JfQjEpKTsKLSAgICAgICAgICAgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RIVUZGQk1TSVpFID0gVGFibGVfQjE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwU2VnID0gZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOwotICAgICAgICAgICAgaWYoIXBTZWcpIHsKLSAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzeW1ib2wgZGljdGlvbmFyeSBzZWdtZW50IDogU0RIVUZGQk1TSVpFIGNhbid0IGZpbmQgdXNlciBzdXBwbGllZCB0YWJsZS4iKTsKLSAgICAgICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkVUQUw7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwU3ltYm9sRGljdERlY29kZXItPlNESFVGRkJNU0laRSA9IHBTZWctPm1fUmVzdWx0Lmh0OwotICAgICAgICB9Ci0gICAgICAgIGlmKHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RSRUZBR0cgPT0gMSkgewotICAgICAgICAgICAgaWYoY1NESFVGRkFHR0lOU1QgPT0gMCkgewotICAgICAgICAgICAgICAgIGlmKCFUYWJsZV9CMSkgewotICAgICAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhUYWJsZV9CMSwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjEpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0IxKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RIVUZGQUdHSU5TVCA9IFRhYmxlX0IxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwU2VnID0gZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOwotICAgICAgICAgICAgICAgIGlmKCFwU2VnKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInN5bWJvbCBkaWN0aW9uYXJ5IHNlZ21lbnQgOiBTREhVRkZBR0dJTlNUIGNhbid0IGZpbmQgdXNlciBzdXBwbGllZCB0YWJsZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZFVEFMOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkZBR0dJTlNUID0gcFNlZy0+bV9SZXN1bHQuaHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYoKHdGbGFncyAmIDB4MDEwMCkgJiYgcExSU2VnICYmIHBMUlNlZy0+bV9SZXN1bHQuc2QtPm1fYkNvbnRleHRSZXRhaW5lZCkgewotICAgICAgICBpZiAocFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkYgPT0gMCkgewotICAgICAgICAgICAgZHdUZW1wID0gcFN5bWJvbERpY3REZWNvZGVyLT5TRFRFTVBMQVRFID09IDAgPyA2NTUzNiA6IHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RURU1QTEFURSA9PSAxID8KLSAgICAgICAgICAgICAgICAgICAgIDgxOTIgOiAxMDI0OwotICAgICAgICAgICAgZ2JDb250ZXh0ID0gKEpCaWcyQXJpdGhDdHgqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoSkJpZzJBcml0aEN0eCksIGR3VGVtcCk7Ci0gICAgICAgICAgICBKQklHMl9tZW1jcHkoZ2JDb250ZXh0LCBwTFJTZWctPm1fUmVzdWx0LnNkLT5tX2diQ29udGV4dCwgc2l6ZW9mKEpCaWcyQXJpdGhDdHgpKmR3VGVtcCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RSRUZBR0cgPT0gMSkgewotICAgICAgICAgICAgZHdUZW1wID0gcFN5bWJvbERpY3REZWNvZGVyLT5TRFJURU1QTEFURSA/IDEgPDwgMTAgOiAxIDw8IDEzOwotICAgICAgICAgICAgZ3JDb250ZXh0ID0gKEpCaWcyQXJpdGhDdHgqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoSkJpZzJBcml0aEN0eCksIGR3VGVtcCk7Ci0gICAgICAgICAgICBKQklHMl9tZW1jcHkoZ3JDb250ZXh0LCBwTFJTZWctPm1fUmVzdWx0LnNkLT5tX2dyQ29udGV4dCwgc2l6ZW9mKEpCaWcyQXJpdGhDdHgpKmR3VGVtcCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAocFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkYgPT0gMCkgewotICAgICAgICAgICAgZHdUZW1wID0gcFN5bWJvbERpY3REZWNvZGVyLT5TRFRFTVBMQVRFID09IDAgPyA2NTUzNiA6IHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RURU1QTEFURSA9PSAxID8KLSAgICAgICAgICAgICAgICAgICAgIDgxOTIgOiAxMDI0OwotICAgICAgICAgICAgZ2JDb250ZXh0ID0gKEpCaWcyQXJpdGhDdHgqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoSkJpZzJBcml0aEN0eCksIGR3VGVtcCk7Ci0gICAgICAgICAgICBKQklHMl9tZW1zZXQoZ2JDb250ZXh0LCAwLCBzaXplb2YoSkJpZzJBcml0aEN0eCkqZHdUZW1wKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocFN5bWJvbERpY3REZWNvZGVyLT5TRFJFRkFHRyA9PSAxKSB7Ci0gICAgICAgICAgICBkd1RlbXAgPSBwU3ltYm9sRGljdERlY29kZXItPlNEUlRFTVBMQVRFID8gMSA8PCAxMCA6IDEgPDwgMTM7Ci0gICAgICAgICAgICBnckNvbnRleHQgPSAoSkJpZzJBcml0aEN0eCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihKQmlnMkFyaXRoQ3R4KSwgZHdUZW1wKTsKLSAgICAgICAgICAgIEpCSUcyX21lbXNldChnckNvbnRleHQsIDAsIHNpemVvZihKQmlnMkFyaXRoQ3R4KSpkd1RlbXApOwotICAgICAgICB9Ci0gICAgfQotICAgIHBTZWdtZW50LT5tX25SZXN1bHRUeXBlID0gSkJJRzJfU1lNQk9MX0RJQ1RfUE9JTlRFUjsKLSAgICBmb3Ioc3RkOjpsaXN0PENKQmlnMl9DYWNoZVBhaXI+OjppdGVyYXRvciBpdCA9Ci0gICAgICAgICAgICBtX3BTeW1ib2xEaWN0Q2FjaGUtPmJlZ2luKCk7IGl0ICE9IG1fcFN5bWJvbERpY3RDYWNoZS0+ZW5kKCk7ICsraXQpIHsKLSAgICAgICAgaWYgKGl0LT5maXJzdCA9PSBrZXkpIHsKLSAgICAgICAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5zZCA9IGl0LT5zZWNvbmQtPkRlZXBDb3B5KCk7Ci0gICAgICAgICAgICBtX3BTeW1ib2xEaWN0Q2FjaGUtPnB1c2hfZnJvbnQoKml0KTsKLSAgICAgICAgICAgIG1fcFN5bWJvbERpY3RDYWNoZS0+ZXJhc2UoaXQpOwotICAgICAgICAgICAgY2FjaGVfaGl0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghY2FjaGVfaGl0KSB7Ci0gICAgICAgIGlmKHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RIVUZGID09IDApIHsKLSAgICAgICAgICAgIEpCSUcyX0FMTE9DKHBBcml0aERlY29kZXIsIENKQmlnMl9Bcml0aERlY29kZXIobV9wU3RyZWFtKSk7Ci0gICAgICAgICAgICBwU2VnbWVudC0+bV9SZXN1bHQuc2QgPSBwU3ltYm9sRGljdERlY29kZXItPmRlY29kZV9Bcml0aChwQXJpdGhEZWNvZGVyLCBnYkNvbnRleHQsIGdyQ29udGV4dCk7Ci0gICAgICAgICAgICBkZWxldGUgcEFyaXRoRGVjb2RlcjsKLSAgICAgICAgICAgIGlmKHBTZWdtZW50LT5tX1Jlc3VsdC5zZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZFVEFMOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9wU3RyZWFtLT5hbGlnbkJ5dGUoKTsKLSAgICAgICAgICAgIG1fcFN0cmVhbS0+b2Zmc2V0KDIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcFNlZ21lbnQtPm1fUmVzdWx0LnNkID0gcFN5bWJvbERpY3REZWNvZGVyLT5kZWNvZGVfSHVmZm1hbihtX3BTdHJlYW0sIGdiQ29udGV4dCwgZ3JDb250ZXh0LCBwUGF1c2UpOwotICAgICAgICAgICAgaWYocFNlZ21lbnQtPm1fUmVzdWx0LnNkID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkVUQUw7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX3BTdHJlYW0tPmFsaWduQnl0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIENKQmlnMl9TeW1ib2xEaWN0ICp2YWx1ZSA9IHBTZWdtZW50LT5tX1Jlc3VsdC5zZC0+RGVlcENvcHkoKTsKLSAgICAgICAgaWYgKHZhbHVlICYmIGtTeW1ib2xEaWN0Q2FjaGVNYXhTaXplID4gMCkgewotICAgICAgICAgICAgd2hpbGUgKG1fcFN5bWJvbERpY3RDYWNoZS0+c2l6ZSgpID49IGtTeW1ib2xEaWN0Q2FjaGVNYXhTaXplKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIG1fcFN5bWJvbERpY3RDYWNoZS0+YmFjaygpLnNlY29uZDsKLSAgICAgICAgICAgICAgICBtX3BTeW1ib2xEaWN0Q2FjaGUtPnBvcF9iYWNrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX3BTeW1ib2xEaWN0Q2FjaGUtPnB1c2hfZnJvbnQoQ0pCaWcyX0NhY2hlUGFpcihrZXksIHZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYod0ZsYWdzICYgMHgwMjAwKSB7Ci0gICAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5zZC0+bV9iQ29udGV4dFJldGFpbmVkID0gVFJVRTsKLSAgICAgICAgaWYocFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkYgPT0gMCkgewotICAgICAgICAgICAgcFNlZ21lbnQtPm1fUmVzdWx0LnNkLT5tX2diQ29udGV4dCA9IGdiQ29udGV4dDsKLSAgICAgICAgfQotICAgICAgICBpZihwU3ltYm9sRGljdERlY29kZXItPlNEUkVGQUdHID09IDEpIHsKLSAgICAgICAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5zZC0+bV9nckNvbnRleHQgPSBnckNvbnRleHQ7Ci0gICAgICAgIH0KLSAgICAgICAgYlVzZWQgPSBUUlVFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJVc2VkID0gRkFMU0U7Ci0gICAgfQotICAgIGRlbGV0ZSBwU3ltYm9sRGljdERlY29kZXI7Ci0gICAgaWYoU0RJTlNZTVMpIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKFNESU5TWU1TKTsKLSAgICB9Ci0gICAgaWYoVGFibGVfQjEpIHsKLSAgICAgICAgZGVsZXRlIFRhYmxlX0IxOwotICAgIH0KLSAgICBpZihUYWJsZV9CMikgewotICAgICAgICBkZWxldGUgVGFibGVfQjI7Ci0gICAgfQotICAgIGlmKFRhYmxlX0IzKSB7Ci0gICAgICAgIGRlbGV0ZSBUYWJsZV9CMzsKLSAgICB9Ci0gICAgaWYoVGFibGVfQjQpIHsKLSAgICAgICAgZGVsZXRlIFRhYmxlX0I0OwotICAgIH0KLSAgICBpZihUYWJsZV9CNSkgewotICAgICAgICBkZWxldGUgVGFibGVfQjU7Ci0gICAgfQotICAgIGlmKGJVc2VkID09IEZBTFNFKSB7Ci0gICAgICAgIGlmKGdiQ29udGV4dCkgewotICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKGdiQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoZ3JDb250ZXh0KSB7Ci0gICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoZ3JDb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKLWZhaWxlZDoKLSAgICBkZWxldGUgcFN5bWJvbERpY3REZWNvZGVyOwotICAgIGlmKFNESU5TWU1TKSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTRElOU1lNUyk7Ci0gICAgfQotICAgIGlmKFRhYmxlX0IxKSB7Ci0gICAgICAgIGRlbGV0ZSBUYWJsZV9CMTsKLSAgICB9Ci0gICAgaWYoVGFibGVfQjIpIHsKLSAgICAgICAgZGVsZXRlIFRhYmxlX0IyOwotICAgIH0KLSAgICBpZihUYWJsZV9CMykgewotICAgICAgICBkZWxldGUgVGFibGVfQjM7Ci0gICAgfQotICAgIGlmKFRhYmxlX0I0KSB7Ci0gICAgICAgIGRlbGV0ZSBUYWJsZV9CNDsKLSAgICB9Ci0gICAgaWYoVGFibGVfQjUpIHsKLSAgICAgICAgZGVsZXRlIFRhYmxlX0I1OwotICAgIH0KLSAgICBpZihnYkNvbnRleHQpIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKGdiQ29udGV4dCk7Ci0gICAgfQotICAgIGlmKGdyQ29udGV4dCkgewotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoZ3JDb250ZXh0KTsKLSAgICB9Ci0gICAgcmV0dXJuIG5SZXQ7Ci19CisgICAgICAgICAgaWYgKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoJmR3VGVtcCkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBKQklHMl9FUlJPUl9UT09fU0hPUlQ7CiAKLUZYX0JPT0wgQ0pCaWcyX0NvbnRleHQ6OnBhcnNlVGV4dFJlZ2lvbihDSkJpZzJfU2VnbWVudCAqcFNlZ21lbnQpCi17Ci0gICAgRlhfRFdPUkQgZHdUZW1wOwotICAgIEZYX1dPUkQgd0ZsYWdzOwotICAgIEZYX0lOVDMyIGksIG5JbmRleCwgblJldDsKLSAgICBKQmlnMlJlZ2lvbkluZm8gcmk7Ci0gICAgQ0pCaWcyX1NlZ21lbnQgKnBTZWc7Ci0gICAgQ0pCaWcyX0ltYWdlICoqU0JTWU1TID0gTlVMTDsKLSAgICBKQmlnMkh1ZmZtYW5Db2RlICpTQlNZTUNPREVTID0gTlVMTDsKLSAgICBGWF9CWVRFIGNTQkhVRkZGUywgY1NCSFVGRkRTLCBjU0JIVUZGRFQsIGNTQkhVRkZSRFcsIGNTQkhVRkZSREgsIGNTQkhVRkZSRFgsIGNTQkhVRkZSRFksIGNTQkhVRkZSU0laRTsKLSAgICBDSkJpZzJfSHVmZm1hblRhYmxlICpUYWJsZV9CMSA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKlRhYmxlX0I2ID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKlRhYmxlX0I3ID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpUYWJsZV9COCA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKlRhYmxlX0I5ID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlRhYmxlX0IxMCA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVGFibGVfQjExID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVGFibGVfQjEyID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlRhYmxlX0IxMyA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVGFibGVfQjE0ID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVGFibGVfQjE1ID0gTlVMTDsKLSAgICBKQmlnMkFyaXRoQ3R4ICpnckNvbnRleHQgPSBOVUxMOwotICAgIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXI7Ci0gICAgQ0pCaWcyX1RSRFByb2MgKnBUUkQ7Ci0gICAgSkJJRzJfQUxMT0MocFRSRCwgQ0pCaWcyX1RSRFByb2MoKSk7Ci0gICAgaWYoKHBhcnNlUmVnaW9uSW5mbygmcmkpICE9IEpCSUcyX1NVQ0NFU1MpCi0gICAgICAgICAgICB8fCAobV9wU3RyZWFtLT5yZWFkU2hvcnRJbnRlZ2VyKCZ3RmxhZ3MpICE9IDApKSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIHNlZ21lbnQgOiBkYXRhIGhlYWRlciB0b28gc2hvcnQuIik7Ci0gICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9UT09fU0hPUlQ7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLSAgICBwVFJELT5TQlcgPSByaS53aWR0aDsKLSAgICBwVFJELT5TQkggPSByaS5oZWlnaHQ7Ci0gICAgcFRSRC0+U0JIVUZGID0gd0ZsYWdzICYgMHgwMDAxOwotICAgIHBUUkQtPlNCUkVGSU5FID0gKHdGbGFncyA+PiAxKSAmIDB4MDAwMTsKLSAgICBkd1RlbXAgPSAod0ZsYWdzID4+IDIpICYgMHgwMDAzOwotICAgIHBUUkQtPlNCU1RSSVBTID0gMSA8PCBkd1RlbXA7Ci0gICAgcFRSRC0+UkVGQ09STkVSID0gKEpCaWcyQ29ybmVyKSgod0ZsYWdzID4+IDQpICYgMHgwMDAzKTsKLSAgICBwVFJELT5UUkFOU1BPU0VEID0gKHdGbGFncyA+PiA2KSAmIDB4MDAwMTsKLSAgICBwVFJELT5TQkNPTUJPUCA9IChKQmlnMkNvbXBvc2VPcCkoKHdGbGFncyA+PiA3KSAmIDB4MDAwMyk7Ci0gICAgcFRSRC0+U0JERUZQSVhFTCA9ICh3RmxhZ3MgPj4gOSkgJiAweDAwMDE7Ci0gICAgcFRSRC0+U0JEU09GRlNFVCA9ICh3RmxhZ3MgPj4gMTApICYgMHgwMDFmOwotICAgIGlmKHBUUkQtPlNCRFNPRkZTRVQgPj0gMHgwMDEwKSB7Ci0gICAgICAgIHBUUkQtPlNCRFNPRkZTRVQgPSBwVFJELT5TQkRTT0ZGU0VUIC0gMHgwMDIwOwotICAgIH0KLSAgICBwVFJELT5TQlJURU1QTEFURSA9ICh3RmxhZ3MgPj4gMTUpICYgMHgwMDAxOwotICAgIGlmKHBUUkQtPlNCSFVGRiA9PSAxKSB7Ci0gICAgICAgIGlmKG1fcFN0cmVhbS0+cmVhZFNob3J0SW50ZWdlcigmd0ZsYWdzKSAhPSAwKSB7Ci0gICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBzZWdtZW50IDogZGF0YSBoZWFkZXIgdG9vIHNob3J0LiIpOwotICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKLSAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICB9Ci0gICAgICAgIGNTQkhVRkZGUyA9IHdGbGFncyAmIDB4MDAwMzsKLSAgICAgICAgY1NCSFVGRkRTID0gKHdGbGFncyA+PiAyKSAmIDB4MDAwMzsKLSAgICAgICAgY1NCSFVGRkRUID0gKHdGbGFncyA+PiA0KSAmIDB4MDAwMzsKLSAgICAgICAgY1NCSFVGRlJEVyA9ICh3RmxhZ3MgPj4gNikgJiAweDAwMDM7Ci0gICAgICAgIGNTQkhVRkZSREggPSAod0ZsYWdzID4+IDgpICYgMHgwMDAzOwotICAgICAgICBjU0JIVUZGUkRYID0gKHdGbGFncyA+PiAxMCkgJiAweDAwMDM7Ci0gICAgICAgIGNTQkhVRkZSRFkgPSAod0ZsYWdzID4+IDEyKSAmIDB4MDAwMzsKLSAgICAgICAgY1NCSFVGRlJTSVpFID0gKHdGbGFncyA+PiAxNCkgJiAweDAwMDE7Ci0gICAgfQotICAgIGlmKChwVFJELT5TQlJFRklORSA9PSAxKSAmJiAocFRSRC0+U0JSVEVNUExBVEUgPT0gMCkpIHsKLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgICAgICBpZihtX3BTdHJlYW0tPnJlYWQxQnl0ZSgoRlhfQllURSopJnBUUkQtPlNCUkFUW2ldKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigidGV4dCByZWdpb24gc2VnbWVudCA6IGRhdGEgaGVhZGVyIHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfVE9PX1NIT1JUOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoJnBUUkQtPlNCTlVNSU5TVEFOQ0VTKSAhPSAwKSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIHNlZ21lbnQgOiBkYXRhIGhlYWRlciB0b28gc2hvcnQuIik7Ci0gICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9UT09fU0hPUlQ7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLSAgICBmb3IoaSA9IDA7IGkgPCBwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudDsgaSsrKSB7Ci0gICAgICAgIGlmKCFmaW5kU2VnbWVudEJ5TnVtYmVyKHBTZWdtZW50LT5tX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnNbaV0pKSB7Ci0gICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBzZWdtZW50IDogY2FuJ3QgZmluZCByZWZlcmVkIHRvIHNlZ21lbnRzIik7Ci0gICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkVUQUw7Ci0gICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotICAgIH0KLSAgICBwVFJELT5TQk5VTVNZTVMgPSAwOwotICAgIGZvcihpID0gMDsgaSA8IHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50OyBpKyspIHsKLSAgICAgICAgcFNlZyA9IGZpbmRTZWdtZW50QnlOdW1iZXIocFNlZ21lbnQtPm1fcFJlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVyc1tpXSk7Ci0gICAgICAgIGlmKHBTZWctPm1fY0ZsYWdzLnMudHlwZSA9PSAwKSB7Ci0gICAgICAgICAgICBwVFJELT5TQk5VTVNZTVMgKz0gcFNlZy0+bV9SZXN1bHQuc2QtPlNETlVNRVhTWU1TOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwVFJELT5TQk5VTVNZTVMgPiAwKSB7Ci0gICAgICAgIFNCU1lNUyA9IChDSkJpZzJfSW1hZ2UqKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoCi0gICAgICAgICAgICAgICAgICAgICBzaXplb2YoQ0pCaWcyX0ltYWdlKiksIHBUUkQtPlNCTlVNU1lNUyk7Ci0gICAgICAgIGR3VGVtcCA9IDA7Ci0gICAgICAgIGZvcihpID0gMDsgaSA8IHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50OyBpKyspIHsKLSAgICAgICAgICAgIHBTZWcgPSBmaW5kU2VnbWVudEJ5TnVtYmVyKHBTZWdtZW50LT5tX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnNbaV0pOwotICAgICAgICAgICAgaWYocFNlZy0+bV9jRmxhZ3Mucy50eXBlID09IDApIHsKLSAgICAgICAgICAgICAgICBKQklHMl9tZW1jcHkoU0JTWU1TICsgZHdUZW1wLCBwU2VnLT5tX1Jlc3VsdC5zZC0+U0RFWFNZTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWctPm1fUmVzdWx0LnNkLT5TRE5VTUVYU1lNUyAqIHNpemVvZihDSkJpZzJfSW1hZ2UqKSk7Ci0gICAgICAgICAgICAgICAgZHdUZW1wICs9IHBTZWctPm1fUmVzdWx0LnNkLT5TRE5VTUVYU1lNUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwVFJELT5TQlNZTVMgPSBTQlNZTVM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcFRSRC0+U0JTWU1TID0gTlVMTDsKLSAgICB9Ci0gICAgaWYocFRSRC0+U0JIVUZGID09IDEpIHsKLSAgICAgICAgU0JTWU1DT0RFUyA9IGRlY29kZVN5bWJvbElESHVmZm1hblRhYmxlKG1fcFN0cmVhbSwgcFRSRC0+U0JOVU1TWU1TKTsKLSAgICAgICAgaWYoU0JTWU1DT0RFUyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBzZWdtZW50OiBzeW1ib2wgSUQgaHVmZm1hbiB0YWJsZSBkZWNvZGUgZmFpbHVyZSEiKTsKLSAgICAgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GRVRBTDsKLSAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICB9Ci0gICAgICAgIG1fcFN0cmVhbS0+YWxpZ25CeXRlKCk7Ci0gICAgICAgIHBUUkQtPlNCU1lNQ09ERVMgPSBTQlNZTUNPREVTOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGR3VGVtcCA9IDA7Ci0gICAgICAgIHdoaWxlKChGWF9EV09SRCkoMSA8PCBkd1RlbXApIDwgcFRSRC0+U0JOVU1TWU1TKSB7Ci0gICAgICAgICAgICBkd1RlbXAgKys7Ci0gICAgICAgIH0KLSAgICAgICAgcFRSRC0+U0JTWU1DT0RFTEVOID0gKEZYX0JZVEUpZHdUZW1wOwotICAgIH0KLSAgICBpZihwVFJELT5TQkhVRkYgPT0gMSkgewotICAgICAgICBpZigoY1NCSFVGRkZTID09IDIpIHx8IChjU0JIVUZGUkRXID09IDIpIHx8IChjU0JIVUZGUkRIID09IDIpCi0gICAgICAgICAgICAgICAgfHwgKGNTQkhVRkZSRFggPT0gMikgfHwgKGNTQkhVRkZSRFkgPT0gMikpIHsKLSAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIHNlZ21lbnQgOiBTQkhVRkZGUz0yIG9yIFNCSFVGRlJEVz0yIG9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNCSFVGRlJESD0yIG9yIFNCSFVGRlJEWD0yIG9yIFNCSFVGRlJEWT0yIGlzIG5vdCBwZXJtaXR0ZWQiKTsKLSAgICAgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GRVRBTDsKLSAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICB9Ci0gICAgICAgIG5JbmRleCA9IDA7Ci0gICAgICAgIGlmKGNTQkhVRkZGUyA9PSAwKSB7Ci0gICAgICAgICAgICBKQklHMl9BTExPQyhUYWJsZV9CNiwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjYsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0I2KSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CNikpOwotICAgICAgICAgICAgcFRSRC0+U0JIVUZGRlMgPSBUYWJsZV9CNjsKLSAgICAgICAgfSBlbHNlIGlmKGNTQkhVRkZGUyA9PSAxKSB7Ci0gICAgICAgICAgICBKQklHMl9BTExPQyhUYWJsZV9CNywgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjcsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0I3KSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CNykpOwotICAgICAgICAgICAgcFRSRC0+U0JIVUZGRlMgPSBUYWJsZV9CNzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBTZWcgPSBmaW5kUmVmZXJyZWRTZWdtZW50QnlUeXBlQW5kSW5kZXgocFNlZ21lbnQsIDUzLCBuSW5kZXgrKyk7Ci0gICAgICAgICAgICBpZighcFNlZykgewotICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIHNlZ21lbnQgOiBTQkhVRkZGUyBjYW4ndCBmaW5kIHVzZXIgc3VwcGxpZWQgdGFibGUiKTsKLSAgICAgICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkVUQUw7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwVFJELT5TQkhVRkZGUyA9IHBTZWctPm1fUmVzdWx0Lmh0OwotICAgICAgICB9Ci0gICAgICAgIGlmKGNTQkhVRkZEUyA9PSAwKSB7Ci0gICAgICAgICAgICBKQklHMl9BTExPQyhUYWJsZV9COCwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjgsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0I4KSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9COCkpOwotICAgICAgICAgICAgcFRSRC0+U0JIVUZGRFMgPSBUYWJsZV9CODsKLSAgICAgICAgfSBlbHNlIGlmKGNTQkhVRkZEUyA9PSAxKSB7Ci0gICAgICAgICAgICBKQklHMl9BTExPQyhUYWJsZV9COSwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjksCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0I5KSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9COSkpOwotICAgICAgICAgICAgcFRSRC0+U0JIVUZGRFMgPSBUYWJsZV9COTsKLSAgICAgICAgfSBlbHNlIGlmKGNTQkhVRkZEUyA9PSAyKSB7Ci0gICAgICAgICAgICBKQklHMl9BTExPQyhUYWJsZV9CMTAsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjEwKSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTApKTsKLSAgICAgICAgICAgIHBUUkQtPlNCSFVGRkRTID0gVGFibGVfQjEwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcFNlZyA9IGZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChwU2VnbWVudCwgNTMsIG5JbmRleCsrKTsKLSAgICAgICAgICAgIGlmKCFwU2VnKSB7Ci0gICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigidGV4dCByZWdpb24gc2VnbWVudCA6IFNCSFVGRkRTIGNhbid0IGZpbmQgdXNlciBzdXBwbGllZCB0YWJsZSIpOwotICAgICAgICAgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GRVRBTDsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBUUkQtPlNCSFVGRkRTID0gcFNlZy0+bV9SZXN1bHQuaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoY1NCSFVGRkRUID09IDApIHsKLSAgICAgICAgICAgIEpCSUcyX0FMTE9DKFRhYmxlX0IxMSwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjExLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMTEpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0IxMSkpOwotICAgICAgICAgICAgcFRSRC0+U0JIVUZGRFQgPSBUYWJsZV9CMTE7Ci0gICAgICAgIH0gZWxzZSBpZihjU0JIVUZGRFQgPT0gMSkgewotICAgICAgICAgICAgSkJJRzJfQUxMT0MoVGFibGVfQjEyLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxMikgLyBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLCBIdWZmbWFuVGFibGVfSFRPT0JfQjEyKSk7Ci0gICAgICAgICAgICBwVFJELT5TQkhVRkZEVCA9IFRhYmxlX0IxMjsKLSAgICAgICAgfSBlbHNlIGlmKGNTQkhVRkZEVCA9PSAyKSB7Ci0gICAgICAgICAgICBKQklHMl9BTExPQyhUYWJsZV9CMTMsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxMywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjEzKSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTMpKTsKLSAgICAgICAgICAgIHBUUkQtPlNCSFVGRkRUID0gVGFibGVfQjEzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcFNlZyA9IGZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChwU2VnbWVudCwgNTMsIG5JbmRleCsrKTsKLSAgICAgICAgICAgIGlmKCFwU2VnKSB7Ci0gICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigidGV4dCByZWdpb24gc2VnbWVudCA6IFNCSFVGRkRUIGNhbid0IGZpbmQgdXNlciBzdXBwbGllZCB0YWJsZSIpOwotICAgICAgICAgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GRVRBTDsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBUUkQtPlNCSFVGRkRUID0gcFNlZy0+bV9SZXN1bHQuaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoY1NCSFVGRlJEVyA9PSAwKSB7Ci0gICAgICAgICAgICBKQklHMl9BTExPQyhUYWJsZV9CMTQsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxNCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE0KSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTQpKTsKLSAgICAgICAgICAgIHBUUkQtPlNCSFVGRlJEVyA9IFRhYmxlX0IxNDsKLSAgICAgICAgfSBlbHNlIGlmKGNTQkhVRkZSRFcgPT0gMSkgewotICAgICAgICAgICAgSkJJRzJfQUxMT0MoVGFibGVfQjE1LCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxNSkgLyBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLCBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KSk7Ci0gICAgICAgICAgICBwVFJELT5TQkhVRkZSRFcgPSBUYWJsZV9CMTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwU2VnID0gZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOwotICAgICAgICAgICAgaWYoIXBTZWcpIHsKLSAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBzZWdtZW50IDogU0JIVUZGUkRXIGNhbid0IGZpbmQgdXNlciBzdXBwbGllZCB0YWJsZSIpOwotICAgICAgICAgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GRVRBTDsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBUUkQtPlNCSFVGRlJEVyA9IHBTZWctPm1fUmVzdWx0Lmh0OwotICAgICAgICB9Ci0gICAgICAgIGlmKGNTQkhVRkZSREggPT0gMCkgewotICAgICAgICAgICAgaWYoIVRhYmxlX0IxNCkgewotICAgICAgICAgICAgICAgIEpCSUcyX0FMTE9DKFRhYmxlX0IxNCwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjE0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE0KSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBUUkQtPlNCSFVGRlJESCA9IFRhYmxlX0IxNDsKLSAgICAgICAgfSBlbHNlIGlmKGNTQkhVRkZSREggPT0gMSkgewotICAgICAgICAgICAgaWYoIVRhYmxlX0IxNSkgewotICAgICAgICAgICAgICAgIEpCSUcyX0FMTE9DKFRhYmxlX0IxNSwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjE1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE1KSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBUUkQtPlNCSFVGRlJESCA9IFRhYmxlX0IxNTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBTZWcgPSBmaW5kUmVmZXJyZWRTZWdtZW50QnlUeXBlQW5kSW5kZXgocFNlZ21lbnQsIDUzLCBuSW5kZXgrKyk7Ci0gICAgICAgICAgICBpZighcFNlZykgewotICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIHNlZ21lbnQgOiBTQkhVRkZSREggY2FuJ3QgZmluZCB1c2VyIHN1cHBsaWVkIHRhYmxlIik7Ci0gICAgICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZFVEFMOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFRSRC0+U0JIVUZGUkRIID0gcFNlZy0+bV9SZXN1bHQuaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoY1NCSFVGRlJEWCA9PSAwKSB7Ci0gICAgICAgICAgICBpZighVGFibGVfQjE0KSB7Ci0gICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MoVGFibGVfQjE0LCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMTQpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0IxNCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFRSRC0+U0JIVUZGUkRYID0gVGFibGVfQjE0OwotICAgICAgICB9IGVsc2UgaWYoY1NCSFVGRlJEWCA9PSAxKSB7Ci0gICAgICAgICAgICBpZighVGFibGVfQjE1KSB7Ci0gICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MoVGFibGVfQjE1LCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMTUpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0IxNSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFRSRC0+U0JIVUZGUkRYID0gVGFibGVfQjE1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcFNlZyA9IGZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChwU2VnbWVudCwgNTMsIG5JbmRleCsrKTsKLSAgICAgICAgICAgIGlmKCFwU2VnKSB7Ci0gICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigidGV4dCByZWdpb24gc2VnbWVudCA6IFNCSFVGRlJEWCBjYW4ndCBmaW5kIHVzZXIgc3VwcGxpZWQgdGFibGUiKTsKLSAgICAgICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkVUQUw7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwVFJELT5TQkhVRkZSRFggPSBwU2VnLT5tX1Jlc3VsdC5odDsKLSAgICAgICAgfQotICAgICAgICBpZihjU0JIVUZGUkRZID09IDApIHsKLSAgICAgICAgICAgIGlmKCFUYWJsZV9CMTQpIHsKLSAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhUYWJsZV9CMTQsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxNCkgLyBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLCBIdWZmbWFuVGFibGVfSFRPT0JfQjE0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwVFJELT5TQkhVRkZSRFkgPSBUYWJsZV9CMTQ7Ci0gICAgICAgIH0gZWxzZSBpZihjU0JIVUZGUkRZID09IDEpIHsKLSAgICAgICAgICAgIGlmKCFUYWJsZV9CMTUpIHsKLSAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhUYWJsZV9CMTUsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxNSkgLyBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLCBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwVFJELT5TQkhVRkZSRFkgPSBUYWJsZV9CMTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwU2VnID0gZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOwotICAgICAgICAgICAgaWYoIXBTZWcpIHsKLSAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBzZWdtZW50IDogU0JIVUZGUkRZIGNhbid0IGZpbmQgdXNlciBzdXBwbGllZCB0YWJsZSIpOwotICAgICAgICAgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GRVRBTDsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBUUkQtPlNCSFVGRlJEWSA9IHBTZWctPm1fUmVzdWx0Lmh0OwotICAgICAgICB9Ci0gICAgICAgIGlmKGNTQkhVRkZSU0laRSA9PSAwKSB7Ci0gICAgICAgICAgICBKQklHMl9BTExPQyhUYWJsZV9CMSwgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjEsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxKSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMSkpOwotICAgICAgICAgICAgcFRSRC0+U0JIVUZGUlNJWkUgPSBUYWJsZV9CMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBTZWcgPSBmaW5kUmVmZXJyZWRTZWdtZW50QnlUeXBlQW5kSW5kZXgocFNlZ21lbnQsIDUzLCBuSW5kZXgrKyk7Ci0gICAgICAgICAgICBpZighcFNlZykgewotICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIHNlZ21lbnQgOiBTQkhVRkZSU0laRSBjYW4ndCBmaW5kIHVzZXIgc3VwcGxpZWQgdGFibGUiKTsKLSAgICAgICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkVUQUw7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwVFJELT5TQkhVRkZSU0laRSA9IHBTZWctPm1fUmVzdWx0Lmh0OwotICAgICAgICB9Ci0gICAgfQotICAgIGlmKHBUUkQtPlNCUkVGSU5FID09IDEpIHsKLSAgICAgICAgZHdUZW1wID0gcFRSRC0+U0JSVEVNUExBVEUgPyAxIDw8IDEwIDogMSA8PCAxMzsKLSAgICAgICAgZ3JDb250ZXh0ID0gKEpCaWcyQXJpdGhDdHgqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoSkJpZzJBcml0aEN0eCksIGR3VGVtcCk7Ci0gICAgICAgIEpCSUcyX21lbXNldChnckNvbnRleHQsIDAsIHNpemVvZihKQmlnMkFyaXRoQ3R4KSpkd1RlbXApOwotICAgIH0KLSAgICBpZihwVFJELT5TQkhVRkYgPT0gMCkgewotICAgICAgICBKQklHMl9BTExPQyhwQXJpdGhEZWNvZGVyLCBDSkJpZzJfQXJpdGhEZWNvZGVyKG1fcFN0cmVhbSkpOwotICAgICAgICBwU2VnbWVudC0+bV9uUmVzdWx0VHlwZSA9IEpCSUcyX0lNQUdFX1BPSU5URVI7Ci0gICAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5pbSA9IHBUUkQtPmRlY29kZV9Bcml0aChwQXJpdGhEZWNvZGVyLCBnckNvbnRleHQpOwotICAgICAgICBkZWxldGUgcEFyaXRoRGVjb2RlcjsKLSAgICAgICAgaWYocFNlZ21lbnQtPm1fUmVzdWx0LmltID09IE5VTEwpIHsKLSAgICAgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GRVRBTDsKLSAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICB9Ci0gICAgICAgIG1fcFN0cmVhbS0+YWxpZ25CeXRlKCk7Ci0gICAgICAgIG1fcFN0cmVhbS0+b2Zmc2V0KDIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBTZWdtZW50LT5tX25SZXN1bHRUeXBlID0gSkJJRzJfSU1BR0VfUE9JTlRFUjsKLSAgICAgICAgcFNlZ21lbnQtPm1fUmVzdWx0LmltID0gcFRSRC0+ZGVjb2RlX0h1ZmZtYW4obV9wU3RyZWFtLCBnckNvbnRleHQpOwotICAgICAgICBpZihwU2VnbWVudC0+bV9SZXN1bHQuaW0gPT0gTlVMTCkgewotICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZFVEFMOwotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wU3RyZWFtLT5hbGlnbkJ5dGUoKTsKLSAgICB9Ci0gICAgaWYocFNlZ21lbnQtPm1fY0ZsYWdzLnMudHlwZSAhPSA0KSB7Ci0gICAgICAgIGlmKCFtX2JCdWZTcGVjaWZpZWQpIHsKLSAgICAgICAgICAgIEpCaWcyUGFnZUluZm8gKnBQYWdlSW5mbyA9IG1fcFBhZ2VJbmZvTGlzdC0+Z2V0TGFzdCgpOwotICAgICAgICAgICAgaWYgKChwUGFnZUluZm8tPm1fYklzU3RyaXBlZCA9PSAxKSAmJiAocmkueSArIHJpLmhlaWdodCA+IG1fcFBhZ2UtPm1fbkhlaWdodCkpIHsKLSAgICAgICAgICAgICAgICBtX3BQYWdlLT5leHBhbmQocmkueSArIHJpLmhlaWdodCwgKHBQYWdlSW5mby0+bV9jRmxhZ3MgJiA0KSA/IDEgOiAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX3BQYWdlLT5jb21wb3NlRnJvbShyaS54LCByaS55LCBwU2VnbWVudC0+bV9SZXN1bHQuaW0sIChKQmlnMkNvbXBvc2VPcCkocmkuZmxhZ3MgJiAweDAzKSk7Ci0gICAgICAgIGRlbGV0ZSBwU2VnbWVudC0+bV9SZXN1bHQuaW07Ci0gICAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5pbSA9IE5VTEw7Ci0gICAgfQotICAgIGRlbGV0ZSBwVFJEOwotICAgIGlmKFNCU1lNUykgewotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1TKTsKLSAgICB9Ci0gICAgaWYoU0JTWU1DT0RFUykgewotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1DT0RFUyk7Ci0gICAgfQotICAgIGlmKGdyQ29udGV4dCkgewotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoZ3JDb250ZXh0KTsKLSAgICB9Ci0gICAgaWYoVGFibGVfQjEpIHsKLSAgICAgICAgZGVsZXRlIFRhYmxlX0IxOwotICAgIH0KLSAgICBpZihUYWJsZV9CNikgewotICAgICAgICBkZWxldGUgVGFibGVfQjY7Ci0gICAgfQotICAgIGlmKFRhYmxlX0I3KSB7Ci0gICAgICAgIGRlbGV0ZSBUYWJsZV9CNzsKLSAgICB9Ci0gICAgaWYoVGFibGVfQjgpIHsKLSAgICAgICAgZGVsZXRlIFRhYmxlX0I4OwotICAgIH0KLSAgICBpZihUYWJsZV9COSkgewotICAgICAgICBkZWxldGUgVGFibGVfQjk7Ci0gICAgfQotICAgIGlmKFRhYmxlX0IxMCkgewotICAgICAgICBkZWxldGUgVGFibGVfQjEwOwotICAgIH0KLSAgICBpZihUYWJsZV9CMTEpIHsKLSAgICAgICAgZGVsZXRlIFRhYmxlX0IxMTsKLSAgICB9Ci0gICAgaWYoVGFibGVfQjEyKSB7Ci0gICAgICAgIGRlbGV0ZSBUYWJsZV9CMTI7Ci0gICAgfQotICAgIGlmKFRhYmxlX0IxMykgewotICAgICAgICBkZWxldGUgVGFibGVfQjEzOwotICAgIH0KLSAgICBpZihUYWJsZV9CMTQpIHsKLSAgICAgICAgZGVsZXRlIFRhYmxlX0IxNDsKLSAgICB9Ci0gICAgaWYoVGFibGVfQjE1KSB7Ci0gICAgICAgIGRlbGV0ZSBUYWJsZV9CMTU7Ci0gICAgfQotICAgIHJldHVybiBKQklHMl9TVUNDRVNTOwotZmFpbGVkOgotICAgIGRlbGV0ZSBwVFJEOwotICAgIGlmKFNCU1lNUykgewotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1TKTsKLSAgICB9Ci0gICAgaWYoU0JTWU1DT0RFUykgewotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1DT0RFUyk7Ci0gICAgfQotICAgIGlmKGdyQ29udGV4dCkgewotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoZ3JDb250ZXh0KTsKLSAgICB9Ci0gICAgaWYoVGFibGVfQjEpIHsKLSAgICAgICAgZGVsZXRlIFRhYmxlX0IxOwotICAgIH0KLSAgICBpZihUYWJsZV9CNikgewotICAgICAgICBkZWxldGUgVGFibGVfQjY7Ci0gICAgfQotICAgIGlmKFRhYmxlX0I3KSB7Ci0gICAgICAgIGRlbGV0ZSBUYWJsZV9CNzsKLSAgICB9Ci0gICAgaWYoVGFibGVfQjgpIHsKLSAgICAgICAgZGVsZXRlIFRhYmxlX0I4OwotICAgIH0KLSAgICBpZihUYWJsZV9COSkgewotICAgICAgICBkZWxldGUgVGFibGVfQjk7Ci0gICAgfQotICAgIGlmKFRhYmxlX0IxMCkgewotICAgICAgICBkZWxldGUgVGFibGVfQjEwOwotICAgIH0KLSAgICBpZihUYWJsZV9CMTEpIHsKLSAgICAgICAgZGVsZXRlIFRhYmxlX0IxMTsKLSAgICB9Ci0gICAgaWYoVGFibGVfQjEyKSB7Ci0gICAgICAgIGRlbGV0ZSBUYWJsZV9CMTI7Ci0gICAgfQotICAgIGlmKFRhYmxlX0IxMykgewotICAgICAgICBkZWxldGUgVGFibGVfQjEzOwotICAgIH0KLSAgICBpZihUYWJsZV9CMTQpIHsKLSAgICAgICAgZGVsZXRlIFRhYmxlX0IxNDsKLSAgICB9Ci0gICAgaWYoVGFibGVfQjE1KSB7Ci0gICAgICAgIGRlbGV0ZSBUYWJsZV9CMTU7Ci0gICAgfQotICAgIHJldHVybiBuUmV0OwotfQotCi1GWF9CT09MIENKQmlnMl9Db250ZXh0OjpwYXJzZVBhdHRlcm5EaWN0KENKQmlnMl9TZWdtZW50ICpwU2VnbWVudCwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgRlhfRFdPUkQgZHdUZW1wOwotICAgIEZYX0JZVEUgY0ZsYWdzOwotICAgIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dDsKLSAgICBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyOwotICAgIENKQmlnMl9QRERQcm9jICpwUEREOwotICAgIEZYX0lOVDMyIG5SZXQ7Ci0gICAgSkJJRzJfQUxMT0MocFBERCwgQ0pCaWcyX1BERFByb2MoKSk7Ci0gICAgaWYoKG1fcFN0cmVhbS0+cmVhZDFCeXRlKCZjRmxhZ3MpICE9IDApCi0gICAgICAgICAgICB8fCAobV9wU3RyZWFtLT5yZWFkMUJ5dGUoJnBQREQtPkhEUFcpICE9IDApCi0gICAgICAgICAgICB8fCAobV9wU3RyZWFtLT5yZWFkMUJ5dGUoJnBQREQtPkhEUEgpICE9IDApCi0gICAgICAgICAgICB8fCAobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigmcFBERC0+R1JBWU1BWCkgIT0gMCkpIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigicGF0dGVybiBkaWN0aW9uYXJ5IHNlZ21lbnQgOiBkYXRhIGhlYWRlciB0b28gc2hvcnQuIik7Ci0gICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9UT09fU0hPUlQ7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLSAgICBpZiAocFBERC0+R1JBWU1BWCA+IEpCSUcyX01BWF9QQVRURVJOX0lOREVYKSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInBhdHRlcm4gZGljdGlvbmFyeSBzZWdtZW50IDogdG9vIG1heCBncmF5IG1heC4iKTsKLSAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0xJTUlUOwotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgcFBERC0+SERNTVIgPSBjRmxhZ3MgJiAweDAxOwotICAgIHBQREQtPkhEVEVNUExBVEUgPSAoY0ZsYWdzID4+IDEpICYgMHgwMzsKLSAgICBwU2VnbWVudC0+bV9uUmVzdWx0VHlwZSA9IEpCSUcyX1BBVFRFUk5fRElDVF9QT0lOVEVSOwotICAgIGlmKHBQREQtPkhETU1SID09IDApIHsKLSAgICAgICAgZHdUZW1wID0gcFBERC0+SERURU1QTEFURSA9PSAwID8gNjU1MzYgOiBwUERELT5IRFRFTVBMQVRFID09IDEgPyA4MTkyIDogMTAyNDsKLSAgICAgICAgZ2JDb250ZXh0ID0gKEpCaWcyQXJpdGhDdHgqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoSkJpZzJBcml0aEN0eCksIGR3VGVtcCk7Ci0gICAgICAgIEpCSUcyX21lbXNldChnYkNvbnRleHQsIDAsIHNpemVvZihKQmlnMkFyaXRoQ3R4KSpkd1RlbXApOwotICAgICAgICBKQklHMl9BTExPQyhwQXJpdGhEZWNvZGVyLCBDSkJpZzJfQXJpdGhEZWNvZGVyKG1fcFN0cmVhbSkpOwotICAgICAgICBwU2VnbWVudC0+bV9SZXN1bHQucGQgPSBwUERELT5kZWNvZGVfQXJpdGgocEFyaXRoRGVjb2RlciwgZ2JDb250ZXh0LCBwUGF1c2UpOwotICAgICAgICBkZWxldGUgcEFyaXRoRGVjb2RlcjsKLSAgICAgICAgaWYocFNlZ21lbnQtPm1fUmVzdWx0LnBkID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShnYkNvbnRleHQpOwotICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZFVEFMOwotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKGdiQ29udGV4dCk7Ci0gICAgICAgIG1fcFN0cmVhbS0+YWxpZ25CeXRlKCk7Ci0gICAgICAgIG1fcFN0cmVhbS0+b2Zmc2V0KDIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5wZCA9IHBQREQtPmRlY29kZV9NTVIobV9wU3RyZWFtLCBwUGF1c2UpOwotICAgICAgICBpZihwU2VnbWVudC0+bV9SZXN1bHQucGQgPT0gTlVMTCkgewotICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZFVEFMOwotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wU3RyZWFtLT5hbGlnbkJ5dGUoKTsKLSAgICB9Ci0gICAgZGVsZXRlIHBQREQ7Ci0gICAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7Ci1mYWlsZWQ6Ci0gICAgZGVsZXRlIHBQREQ7Ci0gICAgcmV0dXJuIG5SZXQ7Ci19Ci1GWF9CT09MIENKQmlnMl9Db250ZXh0OjpwYXJzZUhhbGZ0b25lUmVnaW9uKENKQmlnMl9TZWdtZW50ICpwU2VnbWVudCwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgRlhfRFdPUkQgZHdUZW1wOwotICAgIEZYX0JZVEUgY0ZsYWdzOwotICAgIEpCaWcyUmVnaW9uSW5mbyByaTsKLSAgICBDSkJpZzJfU2VnbWVudCAqcFNlZzsKLSAgICBDSkJpZzJfUGF0dGVybkRpY3QgKnBQYXR0ZXJuRGljdDsKLSAgICBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQ7Ci0gICAgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlcjsKLSAgICBDSkJpZzJfSFRSRFByb2MgKnBIUkQ7Ci0gICAgRlhfSU5UMzIgblJldDsKLSAgICBKQklHMl9BTExPQyhwSFJELCBDSkJpZzJfSFRSRFByb2MoKSk7Ci0gICAgaWYoKHBhcnNlUmVnaW9uSW5mbygmcmkpICE9IEpCSUcyX1NVQ0NFU1MpCi0gICAgICAgICAgICB8fCAobV9wU3RyZWFtLT5yZWFkMUJ5dGUoJmNGbGFncykgIT0gMCkKLSAgICAgICAgICAgIHx8IChtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKCZwSFJELT5IR1cpICE9IDApCi0gICAgICAgICAgICB8fCAobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigmcEhSRC0+SEdIKSAhPSAwKQotICAgICAgICAgICAgfHwgKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoKEZYX0RXT1JEKikmcEhSRC0+SEdYKSAhPSAwKQotICAgICAgICAgICAgfHwgKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoKEZYX0RXT1JEKikmcEhSRC0+SEdZKSAhPSAwKQotICAgICAgICAgICAgfHwgKG1fcFN0cmVhbS0+cmVhZFNob3J0SW50ZWdlcigmcEhSRC0+SFJYKSAhPSAwKQotICAgICAgICAgICAgfHwgKG1fcFN0cmVhbS0+cmVhZFNob3J0SW50ZWdlcigmcEhSRC0+SFJZKSAhPSAwKSkgewotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJoYWxmdG9uZSByZWdpb24gc2VnbWVudCA6IGRhdGEgaGVhZGVyIHRvbyBzaG9ydC4iKTsKLSAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKLSAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgIHBIUkQtPkhCVyA9IHJpLndpZHRoOwotICAgIHBIUkQtPkhCSCA9IHJpLmhlaWdodDsKLSAgICBwSFJELT5ITU1SID0gY0ZsYWdzICYgMHgwMTsKLSAgICBwSFJELT5IVEVNUExBVEUgPSAoY0ZsYWdzID4+IDEpICYgMHgwMzsKLSAgICBwSFJELT5IRU5BQkxFU0tJUCA9IChjRmxhZ3MgPj4gMykgJiAweDAxOwotICAgIHBIUkQtPkhDT01CT1AgPSAoSkJpZzJDb21wb3NlT3ApKChjRmxhZ3MgPj4gNCkgJiAweDA3KTsKLSAgICBwSFJELT5IREVGUElYRUwgPSAoY0ZsYWdzID4+IDcpICYgMHgwMTsKLSAgICBpZihwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudCAhPSAxKSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoImhhbGZ0b25lIHJlZ2lvbiBzZWdtZW50IDogcmVmZXJlZCB0byBzZWdtZW50IGNvdW50IG5vdCBlcXVhbHMgMSIpOwotICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkVUQUw7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLSAgICBwU2VnID0gZmluZFNlZ21lbnRCeU51bWJlcihwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzWzBdKTsKLSAgICBpZiggKHBTZWcgPT0gTlVMTCkgfHwgKHBTZWctPm1fY0ZsYWdzLnMudHlwZSAhPSAxNikpIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiaGFsZnRvbmUgcmVnaW9uIHNlZ21lbnQgOiByZWZlcmVkIHRvIHNlZ21lbnQgaXMgbm90IHBhdHRlcm4gZGljdCIpOwotICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkVUQUw7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLSAgICBwUGF0dGVybkRpY3QgPSBwU2VnLT5tX1Jlc3VsdC5wZDsKLSAgICBpZigocFBhdHRlcm5EaWN0ID09IE5VTEwpIHx8IChwUGF0dGVybkRpY3QtPk5VTVBBVFMgPT0gMCkpIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiaGFsZnRvbmUgcmVnaW9uIHNlZ21lbnQgOiBoYXMgbm8gcGF0dGVybnMgaW5wdXQiKTsKLSAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX0ZFVEFMOwotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgcEhSRC0+SE5VTVBBVFMgPSBwUGF0dGVybkRpY3QtPk5VTVBBVFM7Ci0gICAgcEhSRC0+SFBBVFMgPSBwUGF0dGVybkRpY3QtPkhEUEFUUzsKLSAgICBwSFJELT5IUFcgPSBwUGF0dGVybkRpY3QtPkhEUEFUU1swXS0+bV9uV2lkdGg7Ci0gICAgcEhSRC0+SFBIID0gcFBhdHRlcm5EaWN0LT5IRFBBVFNbMF0tPm1fbkhlaWdodDsKLSAgICBwU2VnbWVudC0+bV9uUmVzdWx0VHlwZSA9IEpCSUcyX0lNQUdFX1BPSU5URVI7Ci0gICAgaWYocEhSRC0+SE1NUiA9PSAwKSB7Ci0gICAgICAgIGR3VGVtcCA9IHBIUkQtPkhURU1QTEFURSA9PSAwID8gNjU1MzYgOiBwSFJELT5IVEVNUExBVEUgPT0gMSA/IDgxOTIgOiAxMDI0OwotICAgICAgICBnYkNvbnRleHQgPSAoSkJpZzJBcml0aEN0eCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihKQmlnMkFyaXRoQ3R4KSwgZHdUZW1wKTsKLSAgICAgICAgSkJJRzJfbWVtc2V0KGdiQ29udGV4dCwgMCwgc2l6ZW9mKEpCaWcyQXJpdGhDdHgpKmR3VGVtcCk7Ci0gICAgICAgIEpCSUcyX0FMTE9DKHBBcml0aERlY29kZXIsIENKQmlnMl9Bcml0aERlY29kZXIobV9wU3RyZWFtKSk7Ci0gICAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5pbSA9IHBIUkQtPmRlY29kZV9Bcml0aChwQXJpdGhEZWNvZGVyLCBnYkNvbnRleHQsIHBQYXVzZSk7Ci0gICAgICAgIGRlbGV0ZSBwQXJpdGhEZWNvZGVyOwotICAgICAgICBpZihwU2VnbWVudC0+bV9SZXN1bHQuaW0gPT0gTlVMTCkgewotICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKGdiQ29udGV4dCk7Ci0gICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkVUQUw7Ci0gICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoZ2JDb250ZXh0KTsKLSAgICAgICAgbV9wU3RyZWFtLT5hbGlnbkJ5dGUoKTsKLSAgICAgICAgbV9wU3RyZWFtLT5vZmZzZXQoMik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcFNlZ21lbnQtPm1fUmVzdWx0LmltID0gcEhSRC0+ZGVjb2RlX01NUihtX3BTdHJlYW0sIHBQYXVzZSk7Ci0gICAgICAgIGlmKHBTZWdtZW50LT5tX1Jlc3VsdC5pbSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkVUQUw7Ci0gICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotICAgICAgICBtX3BTdHJlYW0tPmFsaWduQnl0ZSgpOwotICAgIH0KLSAgICBpZihwU2VnbWVudC0+bV9jRmxhZ3Mucy50eXBlICE9IDIwKSB7Ci0gICAgICAgIGlmKCFtX2JCdWZTcGVjaWZpZWQpIHsKLSAgICAgICAgICAgIEpCaWcyUGFnZUluZm8gKnBQYWdlSW5mbyA9IG1fcFBhZ2VJbmZvTGlzdC0+Z2V0TGFzdCgpOwotICAgICAgICAgICAgaWYgKChwUGFnZUluZm8tPm1fYklzU3RyaXBlZCA9PSAxKSAmJiAocmkueSArIHJpLmhlaWdodCA+IG1fcFBhZ2UtPm1fbkhlaWdodCkpIHsKLSAgICAgICAgICAgICAgICBtX3BQYWdlLT5leHBhbmQocmkueSArIHJpLmhlaWdodCwgKHBQYWdlSW5mby0+bV9jRmxhZ3MgJiA0KSA/IDEgOiAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX3BQYWdlLT5jb21wb3NlRnJvbShyaS54LCByaS55LCBwU2VnbWVudC0+bV9SZXN1bHQuaW0sIChKQmlnMkNvbXBvc2VPcCkocmkuZmxhZ3MgJiAweDAzKSk7Ci0gICAgICAgIGRlbGV0ZSBwU2VnbWVudC0+bV9SZXN1bHQuaW07Ci0gICAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5pbSA9IE5VTEw7Ci0gICAgfQotICAgIGRlbGV0ZSBwSFJEOwotICAgIHJldHVybiBKQklHMl9TVUNDRVNTOwotZmFpbGVkOgotICAgIGRlbGV0ZSBwSFJEOwotICAgIHJldHVybiBuUmV0OwotfQotCi1GWF9CT09MIENKQmlnMl9Db250ZXh0OjpwYXJzZUdlbmVyaWNSZWdpb24oQ0pCaWcyX1NlZ21lbnQgKnBTZWdtZW50LCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBGWF9EV09SRCBkd1RlbXA7Ci0gICAgRlhfQllURSBjRmxhZ3M7Ci0gICAgRlhfSU5UMzIgaSwgblJldDsKLSAgICBpZihtX3BHUkQgPT0gTlVMTCkgewotICAgICAgICBKQklHMl9BTExPQyhtX3BHUkQsIENKQmlnMl9HUkRQcm9jKCkpOwotICAgICAgICBpZigocGFyc2VSZWdpb25JbmZvKCZtX3JpKSAhPSBKQklHMl9TVUNDRVNTKQotICAgICAgICAgICAgICAgIHx8IChtX3BTdHJlYW0tPnJlYWQxQnl0ZSgmY0ZsYWdzKSAhPSAwKSkgewotICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiZ2VuZXJpYyByZWdpb24gc2VnbWVudCA6IGRhdGEgaGVhZGVyIHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9UT09fU0hPUlQ7Ci0gICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9yaS5oZWlnaHQgPCAwIHx8IG1fcmkud2lkdGggPCAwKSB7Ci0gICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJnZW5lcmljIHJlZ2lvbiBzZWdtZW50IDogd3JvbmcgZGF0YS4iKTsKLSAgICAgICAgICAgIG5SZXQgPSBKQklHMl9GQUlMRUQ7Ci0gICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotICAgICAgICBtX3BHUkQtPkdCVyA9IG1fcmkud2lkdGg7Ci0gICAgICAgIG1fcEdSRC0+R0JIID0gbV9yaS5oZWlnaHQ7Ci0gICAgICAgIG1fcEdSRC0+TU1SID0gY0ZsYWdzICYgMHgwMTsKLSAgICAgICAgbV9wR1JELT5HQlRFTVBMQVRFID0gKGNGbGFncyA+PiAxKSAmIDB4MDM7Ci0gICAgICAgIG1fcEdSRC0+VFBHRE9OID0gKGNGbGFncyA+PiAzKSAmIDB4MDE7Ci0gICAgICAgIGlmKG1fcEdSRC0+TU1SID09IDApIHsKLSAgICAgICAgICAgIGlmKG1fcEdSRC0+R0JURU1QTEFURSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKG1fcFN0cmVhbS0+cmVhZDFCeXRlKChGWF9CWVRFKikmbV9wR1JELT5HQkFUW2ldKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJnZW5lcmljIHJlZ2lvbiBzZWdtZW50IDogZGF0YSBoZWFkZXIgdG9vIHNob3J0LiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobV9wU3RyZWFtLT5yZWFkMUJ5dGUoKEZYX0JZVEUqKSZtX3BHUkQtPkdCQVRbaV0pICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoImdlbmVyaWMgcmVnaW9uIHNlZ21lbnQgOiBkYXRhIGhlYWRlciB0b28gc2hvcnQuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfVE9PX1NIT1JUOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9wR1JELT5VU0VTS0lQID0gMDsKLSAgICB9Ci0gICAgcFNlZ21lbnQtPm1fblJlc3VsdFR5cGUgPSBKQklHMl9JTUFHRV9QT0lOVEVSOwotICAgIGlmKG1fcEdSRC0+TU1SID09IDApIHsKLSAgICAgICAgZHdUZW1wID0gbV9wR1JELT5HQlRFTVBMQVRFID09IDAgPyA2NTUzNiA6IG1fcEdSRC0+R0JURU1QTEFURSA9PSAxID8gODE5MiA6IDEwMjQ7Ci0gICAgICAgIGlmKG1fZ2JDb250ZXh0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1fZ2JDb250ZXh0ID0gKEpCaWcyQXJpdGhDdHgqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jKHNpemVvZihKQmlnMkFyaXRoQ3R4KSAqIGR3VGVtcCk7Ci0gICAgICAgICAgICBKQklHMl9tZW1zZXQobV9nYkNvbnRleHQsIDAsIHNpemVvZihKQmlnMkFyaXRoQ3R4KSpkd1RlbXApOwotICAgICAgICB9Ci0gICAgICAgIGlmKG1fcEFyaXRoRGVjb2RlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBKQklHMl9BTExPQyhtX3BBcml0aERlY29kZXIsIENKQmlnMl9Bcml0aERlY29kZXIobV9wU3RyZWFtKSk7Ci0gICAgICAgICAgICBtX1Byb2Nlc3NpdmVTdGF0dXMgPSBtX3BHUkQtPlN0YXJ0X2RlY29kZV9Bcml0aCgmcFNlZ21lbnQtPm1fUmVzdWx0LmltLCBtX3BBcml0aERlY29kZXIsIG1fZ2JDb250ZXh0LCBwUGF1c2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9Qcm9jZXNzaXZlU3RhdHVzID0gbV9wR1JELT5Db250aW51ZV9kZWNvZGUocFBhdXNlKTsKLSAgICAgICAgfQotICAgICAgICBPdXRwdXRCaXRtYXAocFNlZ21lbnQtPm1fUmVzdWx0LmltKTsKLSAgICAgICAgaWYobV9Qcm9jZXNzaXZlU3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsKLSAgICAgICAgICAgIGlmKHBTZWdtZW50LT5tX2NGbGFncy5zLnR5cGUgIT0gMzYpIHsKLSAgICAgICAgICAgICAgICBpZighbV9iQnVmU3BlY2lmaWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIEpCaWcyUGFnZUluZm8gKnBQYWdlSW5mbyA9IG1fcFBhZ2VJbmZvTGlzdC0+Z2V0TGFzdCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHBQYWdlSW5mby0+bV9iSXNTdHJpcGVkID09IDEpICYmIChtX3JpLnkgKyBtX3JpLmhlaWdodCA+IG1fcFBhZ2UtPm1fbkhlaWdodCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcFBhZ2UtPmV4cGFuZChtX3JpLnkgKyBtX3JpLmhlaWdodCwgKHBQYWdlSW5mby0+bV9jRmxhZ3MgJiA0KSA/IDEgOiAwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGWF9SRUNUIFJlY3QgPSBtX3BHUkQtPkdldFJlcGxhY2VSZWN0KCk7Ci0gICAgICAgICAgICAgICAgbV9wUGFnZS0+Y29tcG9zZUZyb20obV9yaS54ICsgUmVjdC5sZWZ0LCBtX3JpLnkgKyBSZWN0LnRvcCwgcFNlZ21lbnQtPm1fUmVzdWx0LmltLCAoSkJpZzJDb21wb3NlT3ApKG1fcmkuZmxhZ3MgJiAweDAzKSwgJlJlY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZWxldGUgbV9wQXJpdGhEZWNvZGVyOwotICAgICAgICAgICAgbV9wQXJpdGhEZWNvZGVyID0gTlVMTDsKLSAgICAgICAgICAgIGlmKHBTZWdtZW50LT5tX1Jlc3VsdC5pbSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKG1fZ2JDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkVUQUw7Ci0gICAgICAgICAgICAgICAgbV9nYkNvbnRleHQgPSBOVUxMOwotICAgICAgICAgICAgICAgIG1fUHJvY2Vzc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKG1fZ2JDb250ZXh0KTsKLSAgICAgICAgICAgIG1fZ2JDb250ZXh0ID0gTlVMTDsKLSAgICAgICAgICAgIG1fcFN0cmVhbS0+YWxpZ25CeXRlKCk7Ci0gICAgICAgICAgICBtX3BTdHJlYW0tPm9mZnNldCgyKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYQ09ERUNfU1RBVFVTIHN0YXR1cyA9IG1fcEdSRC0+U3RhcnRfZGVjb2RlX01NUigmcFNlZ21lbnQtPm1fUmVzdWx0LmltLCBtX3BTdHJlYW0sIHBQYXVzZSk7Ci0gICAgICAgIHdoaWxlKHN0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7Ci0gICAgICAgICAgICBtX3BHUkQtPkNvbnRpbnVlX2RlY29kZShwUGF1c2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmKHBTZWdtZW50LT5tX1Jlc3VsdC5pbSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkVUQUw7Ci0gICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotICAgICAgICBtX3BTdHJlYW0tPmFsaWduQnl0ZSgpOwotICAgIH0KLSAgICBpZihwU2VnbWVudC0+bV9jRmxhZ3Mucy50eXBlICE9IDM2KSB7Ci0gICAgICAgIGlmKCFtX2JCdWZTcGVjaWZpZWQpIHsKLSAgICAgICAgICAgIEpCaWcyUGFnZUluZm8gKnBQYWdlSW5mbyA9IG1fcFBhZ2VJbmZvTGlzdC0+Z2V0TGFzdCgpOwotICAgICAgICAgICAgaWYgKChwUGFnZUluZm8tPm1fYklzU3RyaXBlZCA9PSAxKSAmJiAobV9yaS55ICsgbV9yaS5oZWlnaHQgPiBtX3BQYWdlLT5tX25IZWlnaHQpKSB7Ci0gICAgICAgICAgICAgICAgbV9wUGFnZS0+ZXhwYW5kKG1fcmkueSArIG1fcmkuaGVpZ2h0LCAocFBhZ2VJbmZvLT5tX2NGbGFncyAmIDQpID8gMSA6IDApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEZYX1JFQ1QgUmVjdCA9IG1fcEdSRC0+R2V0UmVwbGFjZVJlY3QoKTsKLSAgICAgICAgbV9wUGFnZS0+Y29tcG9zZUZyb20obV9yaS54ICsgUmVjdC5sZWZ0LCBtX3JpLnkgKyBSZWN0LnRvcCwgcFNlZ21lbnQtPm1fUmVzdWx0LmltLCAoSkJpZzJDb21wb3NlT3ApKG1fcmkuZmxhZ3MgJiAweDAzKSwgJlJlY3QpOwotICAgICAgICBkZWxldGUgcFNlZ21lbnQtPm1fUmVzdWx0LmltOwotICAgICAgICBwU2VnbWVudC0+bV9SZXN1bHQuaW0gPSBOVUxMOwotICAgIH0KLSAgICBkZWxldGUgbV9wR1JEOwotICAgIG1fcEdSRCA9IE5VTEw7Ci0gICAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7Ci1mYWlsZWQ6Ci0gICAgZGVsZXRlIG1fcEdSRDsKLSAgICBtX3BHUkQgPSBOVUxMOwotICAgIHJldHVybiBuUmV0OwotfQotCi1GWF9CT09MIENKQmlnMl9Db250ZXh0OjpwYXJzZUdlbmVyaWNSZWZpbmVtZW50UmVnaW9uKENKQmlnMl9TZWdtZW50ICpwU2VnbWVudCkKLXsKLSAgICBGWF9EV09SRCBkd1RlbXA7Ci0gICAgSkJpZzJSZWdpb25JbmZvIHJpOwotICAgIENKQmlnMl9TZWdtZW50ICpwU2VnOwotICAgIEZYX0lOVDMyIGksIG5SZXQ7Ci0gICAgRlhfQllURSBjRmxhZ3M7Ci0gICAgSkJpZzJBcml0aEN0eCAqZ3JDb250ZXh0OwotICAgIENKQmlnMl9HUlJEUHJvYyAqcEdSUkQ7Ci0gICAgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlcjsKLSAgICBKQklHMl9BTExPQyhwR1JSRCwgQ0pCaWcyX0dSUkRQcm9jKCkpOwotICAgIGlmKChwYXJzZVJlZ2lvbkluZm8oJnJpKSAhPSBKQklHMl9TVUNDRVNTKQotICAgICAgICAgICAgfHwgKG1fcFN0cmVhbS0+cmVhZDFCeXRlKCZjRmxhZ3MpICE9IDApKSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoImdlbmVyaWMgcmVmaW5lbWVudCByZWdpb24gc2VnbWVudCA6IGRhdGEgaGVhZGVyIHRvbyBzaG9ydC4iKTsKLSAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKLSAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgIHBHUlJELT5HUlcgPSByaS53aWR0aDsKLSAgICBwR1JSRC0+R1JIID0gcmkuaGVpZ2h0OwotICAgIHBHUlJELT5HUlRFTVBMQVRFID0gY0ZsYWdzICYgMHgwMTsKLSAgICBwR1JSRC0+VFBHUk9OID0gKGNGbGFncyA+PiAxKSAmIDB4MDE7Ci0gICAgaWYocEdSUkQtPkdSVEVNUExBVEUgPT0gMCkgewotICAgICAgICBmb3IoaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgICAgIGlmKG1fcFN0cmVhbS0+cmVhZDFCeXRlKChGWF9CWVRFKikmcEdSUkQtPkdSQVRbaV0pICE9IDApIHsKLSAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJnZW5lcmljIHJlZmluZW1lbnQgcmVnaW9uIHNlZ21lbnQgOiBkYXRhIGhlYWRlciB0b28gc2hvcnQuIik7Ci0gICAgICAgICAgICAgICAgblJldCA9IEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBwU2VnID0gTlVMTDsKLSAgICBpZihwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudCA+IDApIHsKLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgcFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQ7IGkrKykgewotICAgICAgICAgICAgcFNlZyA9IHRoaXMtPmZpbmRTZWdtZW50QnlOdW1iZXIocFNlZ21lbnQtPm1fcFJlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVyc1swXSk7Ci0gICAgICAgICAgICBpZihwU2VnID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJnZW5lcmljIHJlZmluZW1lbnQgcmVnaW9uIHNlZ21lbnQgOiBjYW4ndCBmaW5kIHJlZmVyZWQgdG8gc2VnbWVudHMiKTsKLSAgICAgICAgICAgICAgICBuUmV0ID0gSkJJRzJfRVJST1JfRkVUQUw7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZigocFNlZy0+bV9jRmxhZ3Mucy50eXBlID09IDQpIHx8IChwU2VnLT5tX2NGbGFncy5zLnR5cGUgPT0gMjApCi0gICAgICAgICAgICAgICAgICAgIHx8IChwU2VnLT5tX2NGbGFncy5zLnR5cGUgPT0gMzYpIHx8IChwU2VnLT5tX2NGbGFncy5zLnR5cGUgPT0gNDApKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYoaSA+PSBwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudCkgewotICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiZ2VuZXJpYyByZWZpbmVtZW50IHJlZ2lvbiBzZWdtZW50IDogY2FuJ3QgZmluZCByZWZlcmVkIHRvIGludGVybWVkaWF0ZSByZWdpb24iKTsKLSAgICAgICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GRVRBTDsKLSAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICB9Ci0gICAgICAgIHBHUlJELT5HUlJFRkVSRU5DRSA9IHBTZWctPm1fUmVzdWx0LmltOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBHUlJELT5HUlJFRkVSRU5DRSA9IG1fcFBhZ2U7Ci0gICAgfQotICAgIHBHUlJELT5HUlJFRkVSRU5DRURYID0gMDsKLSAgICBwR1JSRC0+R1JSRUZFUkVOQ0VEWSA9IDA7Ci0gICAgZHdUZW1wID0gcEdSUkQtPkdSVEVNUExBVEUgPyAxIDw8IDEwIDogMSA8PCAxMzsKLSAgICBnckNvbnRleHQgPSAoSkJpZzJBcml0aEN0eCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihKQmlnMkFyaXRoQ3R4KSwgZHdUZW1wKTsKLSAgICBKQklHMl9tZW1zZXQoZ3JDb250ZXh0LCAwLCBzaXplb2YoSkJpZzJBcml0aEN0eCkqZHdUZW1wKTsKLSAgICBKQklHMl9BTExPQyhwQXJpdGhEZWNvZGVyLCBDSkJpZzJfQXJpdGhEZWNvZGVyKG1fcFN0cmVhbSkpOwotICAgIHBTZWdtZW50LT5tX25SZXN1bHRUeXBlID0gSkJJRzJfSU1BR0VfUE9JTlRFUjsKLSAgICBwU2VnbWVudC0+bV9SZXN1bHQuaW0gPSBwR1JSRC0+ZGVjb2RlKHBBcml0aERlY29kZXIsIGdyQ29udGV4dCk7Ci0gICAgZGVsZXRlIHBBcml0aERlY29kZXI7Ci0gICAgaWYocFNlZ21lbnQtPm1fUmVzdWx0LmltID09IE5VTEwpIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKGdyQ29udGV4dCk7Ci0gICAgICAgIG5SZXQgPSBKQklHMl9FUlJPUl9GRVRBTDsKLSAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShnckNvbnRleHQpOwotICAgIG1fcFN0cmVhbS0+YWxpZ25CeXRlKCk7Ci0gICAgbV9wU3RyZWFtLT5vZmZzZXQoMik7Ci0gICAgaWYocFNlZ21lbnQtPm1fY0ZsYWdzLnMudHlwZSAhPSA0MCkgewotICAgICAgICBpZighbV9iQnVmU3BlY2lmaWVkKSB7Ci0gICAgICAgICAgICBKQmlnMlBhZ2VJbmZvICpwUGFnZUluZm8gPSBtX3BQYWdlSW5mb0xpc3QtPmdldExhc3QoKTsKLSAgICAgICAgICAgIGlmICgocFBhZ2VJbmZvLT5tX2JJc1N0cmlwZWQgPT0gMSkgJiYgKHJpLnkgKyByaS5oZWlnaHQgPiBtX3BQYWdlLT5tX25IZWlnaHQpKSB7Ci0gICAgICAgICAgICAgICAgbV9wUGFnZS0+ZXhwYW5kKHJpLnkgKyByaS5oZWlnaHQsIChwUGFnZUluZm8tPm1fY0ZsYWdzICYgNCkgPyAxIDogMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9wUGFnZS0+Y29tcG9zZUZyb20ocmkueCwgcmkueSwgcFNlZ21lbnQtPm1fUmVzdWx0LmltLCAoSkJpZzJDb21wb3NlT3ApKHJpLmZsYWdzICYgMHgwMykpOwotICAgICAgICBkZWxldGUgcFNlZ21lbnQtPm1fUmVzdWx0LmltOwotICAgICAgICBwU2VnbWVudC0+bV9SZXN1bHQuaW0gPSBOVUxMOwotICAgIH0KLSAgICBkZWxldGUgcEdSUkQ7Ci0gICAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7Ci1mYWlsZWQ6Ci0gICAgZGVsZXRlIHBHUlJEOwotICAgIHJldHVybiBuUmV0OwotfQotRlhfQk9PTCBDSkJpZzJfQ29udGV4dDo6cGFyc2VUYWJsZShDSkJpZzJfU2VnbWVudCAqcFNlZ21lbnQpCi17Ci0gICAgcFNlZ21lbnQtPm1fblJlc3VsdFR5cGUgPSBKQklHMl9IVUZGTUFOX1RBQkxFX1BPSU5URVI7Ci0gICAgSkJJRzJfQUxMT0MocFNlZ21lbnQtPm1fUmVzdWx0Lmh0LCBDSkJpZzJfSHVmZm1hblRhYmxlKG1fcFN0cmVhbSkpOwotICAgIGlmKCFwU2VnbWVudC0+bV9SZXN1bHQuaHQtPmlzT0soKSkgewotICAgICAgICBkZWxldGUgcFNlZ21lbnQtPm1fUmVzdWx0Lmh0OwotICAgICAgICBwU2VnbWVudC0+bV9SZXN1bHQuaHQgPSBOVUxMOwotICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkVUQUw7Ci0gICAgfQotICAgIG1fcFN0cmVhbS0+YWxpZ25CeXRlKCk7Ci0gICAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7Ci19Ci1GWF9JTlQzMiBDSkJpZzJfQ29udGV4dDo6cGFyc2VSZWdpb25JbmZvKEpCaWcyUmVnaW9uSW5mbyAqcFJJKQotewotICAgIGlmKChtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKChGWF9EV09SRCopJnBSSS0+d2lkdGgpICE9IDApCi0gICAgICAgICAgICB8fCAobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigoRlhfRFdPUkQqKSZwUkktPmhlaWdodCkgIT0gMCkKLSAgICAgICAgICAgIHx8IChtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKChGWF9EV09SRCopJnBSSS0+eCkgIT0gMCkKLSAgICAgICAgICAgIHx8IChtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKChGWF9EV09SRCopJnBSSS0+eSkgIT0gMCkKLSAgICAgICAgICAgIHx8IChtX3BTdHJlYW0tPnJlYWQxQnl0ZSgmcFJJLT5mbGFncykgIT0gMCkpIHsKKyAgICAgICAgICBwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldID0gZHdUZW1wOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHBTZWdtZW50LT5tX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnNbaV0gPj0gcFNlZ21lbnQtPm1fZHdOdW1iZXIpCiAgICAgICAgIHJldHVybiBKQklHMl9FUlJPUl9UT09fU0hPUlQ7CiAgICAgfQotICAgIHJldHVybiBKQklHMl9TVUNDRVNTOwotfQotSkJpZzJIdWZmbWFuQ29kZSAqQ0pCaWcyX0NvbnRleHQ6OmRlY29kZVN5bWJvbElESHVmZm1hblRhYmxlKENKQmlnMl9CaXRTdHJlYW0gKnBTdHJlYW0sCi0gICAgICAgIEZYX0RXT1JEIFNCTlVNU1lNUykKLXsKLSAgICBKQmlnMkh1ZmZtYW5Db2RlICpTQlNZTUNPREVTOwotICAgIEZYX0lOVDMyIHJ1bmNvZGVzWzM1XSwgcnVuY29kZXNfbGVuWzM1XSwgcnVuY29kZTsKLSAgICBGWF9JTlQzMiBpLCBqLCBuVGVtcCwgblZhbCwgbkJpdHM7Ci0gICAgRlhfSU5UMzIgcnVuOwotICAgIFNCU1lNQ09ERVMgPSAoSkJpZzJIdWZmbWFuQ29kZSopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihKQmlnMkh1ZmZtYW5Db2RlKSwgU0JOVU1TWU1TKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMzU7IGkgKyspIHsKLSAgICAgICAgaWYocFN0cmVhbS0+cmVhZE5CaXRzKDQsICZydW5jb2Rlc19sZW5baV0pICE9IDApIHsKLSAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICB9CisgIH0KKyAgaWYgKGNQU2l6ZSA9PSAxKSB7CisgICAgaWYgKG1fcFN0cmVhbS0+cmVhZDFCeXRlKCZjVGVtcCkgIT0gMCkKKyAgICAgIHJldHVybiBKQklHMl9FUlJPUl9UT09fU0hPUlQ7CisgICAgcFNlZ21lbnQtPm1fZHdQYWdlX2Fzc29jaWF0aW9uID0gY1RlbXA7CisgIH0gZWxzZSB7CisgICAgaWYgKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoJnBTZWdtZW50LT5tX2R3UGFnZV9hc3NvY2lhdGlvbikgIT0gMCkgeworICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKICAgICB9Ci0gICAgaHVmZm1hbl9hc3NpZ25fY29kZShydW5jb2RlcywgcnVuY29kZXNfbGVuLCAzNSk7Ci0gICAgaSA9IDA7Ci0gICAgd2hpbGUoaSA8IChpbnQpU0JOVU1TWU1TKSB7Ci0gICAgICAgIG5WYWwgPSAwOwotICAgICAgICBuQml0cyA9IDA7Ci0gICAgICAgIGZvcig7OykgewotICAgICAgICAgICAgaWYocFN0cmVhbS0+cmVhZDFCaXQoJm5UZW1wKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuVmFsID0gKG5WYWwgPDwgMSkgfCBuVGVtcDsKLSAgICAgICAgICAgIG5CaXRzICsrOwotICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgMzU7IGorKykgewotICAgICAgICAgICAgICAgIGlmKChuQml0cyA9PSBydW5jb2Rlc19sZW5bal0pICYmIChuVmFsID09IHJ1bmNvZGVzW2pdKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihqIDwgMzUpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KKyAgfQorICBpZiAobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigmcFNlZ21lbnQtPm1fZHdEYXRhX2xlbmd0aCkgIT0gMCkKKyAgICByZXR1cm4gSkJJRzJfRVJST1JfVE9PX1NIT1JUOworCisgIHBTZWdtZW50LT5tX2R3T2JqTnVtID0gbV9wU3RyZWFtLT5nZXRPYmpOdW0oKTsKKyAgcFNlZ21lbnQtPm1fZHdEYXRhT2Zmc2V0ID0gbV9wU3RyZWFtLT5nZXRPZmZzZXQoKTsKKyAgcFNlZ21lbnQtPm1fU3RhdGUgPSBKQklHMl9TRUdNRU5UX0RBVEFfVU5QQVJTRUQ7CisgIHJldHVybiBKQklHMl9TVUNDRVNTOworfQorCitpbnQzMl90IENKQmlnMl9Db250ZXh0OjpwYXJzZVNlZ21lbnREYXRhKENKQmlnMl9TZWdtZW50KiBwU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgaW50MzJfdCByZXQgPSBQcm9jZXNzaW5nUGFyc2VTZWdtZW50RGF0YShwU2VnbWVudCwgcFBhdXNlKTsKKyAgd2hpbGUgKG1fUHJvY2Vzc2luZ1N0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFICYmCisgICAgICAgICBtX3BTdHJlYW0tPmdldEJ5dGVMZWZ0KCkgPiAwKSB7CisgICAgcmV0ID0gUHJvY2Vzc2luZ1BhcnNlU2VnbWVudERhdGEocFNlZ21lbnQsIHBQYXVzZSk7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworaW50MzJfdCBDSkJpZzJfQ29udGV4dDo6UHJvY2Vzc2luZ1BhcnNlU2VnbWVudERhdGEoQ0pCaWcyX1NlZ21lbnQqIHBTZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgc3dpdGNoIChwU2VnbWVudC0+bV9jRmxhZ3Mucy50eXBlKSB7CisgICAgY2FzZSAwOgorICAgICAgcmV0dXJuIHBhcnNlU3ltYm9sRGljdChwU2VnbWVudCwgcFBhdXNlKTsKKyAgICBjYXNlIDQ6CisgICAgY2FzZSA2OgorICAgIGNhc2UgNzoKKyAgICAgIGlmICghbV9iSW5QYWdlKQorICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7CisgICAgICByZXR1cm4gcGFyc2VUZXh0UmVnaW9uKHBTZWdtZW50KTsKKyAgICBjYXNlIDE2OgorICAgICAgcmV0dXJuIHBhcnNlUGF0dGVybkRpY3QocFNlZ21lbnQsIHBQYXVzZSk7CisgICAgY2FzZSAyMDoKKyAgICBjYXNlIDIyOgorICAgIGNhc2UgMjM6CisgICAgICBpZiAoIW1fYkluUGFnZSkKKyAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOworICAgICAgcmV0dXJuIHBhcnNlSGFsZnRvbmVSZWdpb24ocFNlZ21lbnQsIHBQYXVzZSk7CisgICAgY2FzZSAzNjoKKyAgICBjYXNlIDM4OgorICAgIGNhc2UgMzk6CisgICAgICBpZiAoIW1fYkluUGFnZSkKKyAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOworICAgICAgcmV0dXJuIHBhcnNlR2VuZXJpY1JlZ2lvbihwU2VnbWVudCwgcFBhdXNlKTsKKyAgICBjYXNlIDQwOgorICAgIGNhc2UgNDI6CisgICAgY2FzZSA0MzoKKyAgICAgIGlmICghbV9iSW5QYWdlKQorICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7CisgICAgICByZXR1cm4gcGFyc2VHZW5lcmljUmVmaW5lbWVudFJlZ2lvbihwU2VnbWVudCk7CisgICAgY2FzZSA0ODogeworICAgICAgRlhfV09SRCB3VGVtcDsKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxKQmlnMlBhZ2VJbmZvPiBwUGFnZUluZm8obmV3IEpCaWcyUGFnZUluZm8pOworICAgICAgaWYgKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoJnBQYWdlSW5mby0+bV9kd1dpZHRoKSAhPSAwIHx8CisgICAgICAgICAgbV9wU3RyZWFtLT5yZWFkSW50ZWdlcigmcFBhZ2VJbmZvLT5tX2R3SGVpZ2h0KSAhPSAwIHx8CisgICAgICAgICAgbV9wU3RyZWFtLT5yZWFkSW50ZWdlcigmcFBhZ2VJbmZvLT5tX2R3UmVzb2x1dGlvblgpICE9IDAgfHwKKyAgICAgICAgICBtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKCZwUGFnZUluZm8tPm1fZHdSZXNvbHV0aW9uWSkgIT0gMCB8fAorICAgICAgICAgIG1fcFN0cmVhbS0+cmVhZDFCeXRlKCZwUGFnZUluZm8tPm1fY0ZsYWdzKSAhPSAwIHx8CisgICAgICAgICAgbV9wU3RyZWFtLT5yZWFkU2hvcnRJbnRlZ2VyKCZ3VGVtcCkgIT0gMCkgeworICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfVE9PX1NIT1JUOworICAgICAgfQorICAgICAgcFBhZ2VJbmZvLT5tX2JJc1N0cmlwZWQgPSAhISh3VGVtcCAmIDB4ODAwMCk7CisgICAgICBwUGFnZUluZm8tPm1fd01heFN0cmlwZVNpemUgPSB3VGVtcCAmIDB4N2ZmZjsKKyAgICAgIGJvb2wgYk1heEhlaWdodCA9IChwUGFnZUluZm8tPm1fZHdIZWlnaHQgPT0gMHhmZmZmZmZmZik7CisgICAgICBpZiAoYk1heEhlaWdodCAmJiBwUGFnZUluZm8tPm1fYklzU3RyaXBlZCAhPSBUUlVFKQorICAgICAgICBwUGFnZUluZm8tPm1fYklzU3RyaXBlZCA9IFRSVUU7CisKKyAgICAgIGlmICghbV9iQnVmU3BlY2lmaWVkKSB7CisgICAgICAgIEZYX0RXT1JEIGhlaWdodCA9CisgICAgICAgICAgICBiTWF4SGVpZ2h0ID8gcFBhZ2VJbmZvLT5tX3dNYXhTdHJpcGVTaXplIDogcFBhZ2VJbmZvLT5tX2R3SGVpZ2h0OworICAgICAgICBtX3BQYWdlLnJlc2V0KG5ldyBDSkJpZzJfSW1hZ2UocFBhZ2VJbmZvLT5tX2R3V2lkdGgsIGhlaWdodCkpOworICAgICAgfQorCisgICAgICBpZiAoIW1fcFBhZ2UtPm1fcERhdGEpIHsKKyAgICAgICAgbV9Qcm9jZXNzaW5nU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisgICAgICAgIHJldHVybiBKQklHMl9FUlJPUl9UT09fU0hPUlQ7CisgICAgICB9CisKKyAgICAgIG1fcFBhZ2UtPmZpbGwoKHBQYWdlSW5mby0+bV9jRmxhZ3MgJiA0KSA/IDEgOiAwKTsKKyAgICAgIG1fUGFnZUluZm9MaXN0LnB1c2hfYmFjayhwUGFnZUluZm8ucmVsZWFzZSgpKTsKKyAgICAgIG1fYkluUGFnZSA9IHRydWU7CisgICAgfSBicmVhazsKKyAgICBjYXNlIDQ5OgorICAgICAgbV9iSW5QYWdlID0gZmFsc2U7CisgICAgICByZXR1cm4gSkJJRzJfRU5EX09GX1BBR0U7CisgICAgICBicmVhazsKKyAgICBjYXNlIDUwOgorICAgICAgbV9wU3RyZWFtLT5vZmZzZXQocFNlZ21lbnQtPm1fZHdEYXRhX2xlbmd0aCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDUxOgorICAgICAgcmV0dXJuIEpCSUcyX0VORF9PRl9GSUxFOworICAgIGNhc2UgNTI6CisgICAgICBtX3BTdHJlYW0tPm9mZnNldChwU2VnbWVudC0+bV9kd0RhdGFfbGVuZ3RoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNTM6CisgICAgICByZXR1cm4gcGFyc2VUYWJsZShwU2VnbWVudCk7CisgICAgY2FzZSA2MjoKKyAgICAgIG1fcFN0cmVhbS0+b2Zmc2V0KHBTZWdtZW50LT5tX2R3RGF0YV9sZW5ndGgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBKQklHMl9TVUNDRVNTOworfQorCitpbnQzMl90IENKQmlnMl9Db250ZXh0OjpwYXJzZVN5bWJvbERpY3QoQ0pCaWcyX1NlZ21lbnQqIHBTZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIEZYX1dPUkQgd0ZsYWdzOworICBpZiAobV9wU3RyZWFtLT5yZWFkU2hvcnRJbnRlZ2VyKCZ3RmxhZ3MpICE9IDApCisgICAgcmV0dXJuIEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX1NERFByb2M+IHBTeW1ib2xEaWN0RGVjb2RlcihuZXcgQ0pCaWcyX1NERFByb2MpOworICBwU3ltYm9sRGljdERlY29kZXItPlNESFVGRiA9IHdGbGFncyAmIDB4MDAwMTsKKyAgcFN5bWJvbERpY3REZWNvZGVyLT5TRFJFRkFHRyA9ICh3RmxhZ3MgPj4gMSkgJiAweDAwMDE7CisgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RURU1QTEFURSA9ICh3RmxhZ3MgPj4gMTApICYgMHgwMDAzOworICBwU3ltYm9sRGljdERlY29kZXItPlNEUlRFTVBMQVRFID0gKHdGbGFncyA+PiAxMikgJiAweDAwMDM7CisgIHVpbnQ4X3QgY1NESFVGRkRIID0gKHdGbGFncyA+PiAyKSAmIDB4MDAwMzsKKyAgdWludDhfdCBjU0RIVUZGRFcgPSAod0ZsYWdzID4+IDQpICYgMHgwMDAzOworICB1aW50OF90IGNTREhVRkZCTVNJWkUgPSAod0ZsYWdzID4+IDYpICYgMHgwMDAxOworICB1aW50OF90IGNTREhVRkZBR0dJTlNUID0gKHdGbGFncyA+PiA3KSAmIDB4MDAwMTsKKyAgaWYgKHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RIVUZGID09IDApIHsKKyAgICBjb25zdCBGWF9EV09SRCBkd1RlbXAgPSAocFN5bWJvbERpY3REZWNvZGVyLT5TRFRFTVBMQVRFID09IDApID8gOCA6IDI7CisgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IGR3VGVtcDsgKytpKSB7CisgICAgICBpZiAobV9wU3RyZWFtLT5yZWFkMUJ5dGUoKHVpbnQ4X3QqKSZwU3ltYm9sRGljdERlY29kZXItPlNEQVRbaV0pICE9IDApCisgICAgICAgIHJldHVybiBKQklHMl9FUlJPUl9UT09fU0hPUlQ7CisgICAgfQorICB9CisgIGlmIChwU3ltYm9sRGljdERlY29kZXItPlNEUkVGQUdHID09IDEgJiYKKyAgICAgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RSVEVNUExBVEUgPT0gMCkgeworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgaWYgKG1fcFN0cmVhbS0+cmVhZDFCeXRlKCh1aW50OF90KikmcFN5bWJvbERpY3REZWNvZGVyLT5TRFJBVFtpXSkgIT0gMCkKKyAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKKyAgICB9CisgIH0KKyAgaWYgKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoJnBTeW1ib2xEaWN0RGVjb2Rlci0+U0ROVU1FWFNZTVMpICE9IDAgfHwKKyAgICAgIG1fcFN0cmVhbS0+cmVhZEludGVnZXIoJnBTeW1ib2xEaWN0RGVjb2Rlci0+U0ROVU1ORVdTWU1TKSAhPSAwKSB7CisgICAgcmV0dXJuIEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKKyAgfQorICBpZiAocFN5bWJvbERpY3REZWNvZGVyLT5TRE5VTUVYU1lNUyA+IEpCSUcyX01BWF9FWFBPUlRfU1lTTUJPTFMgfHwKKyAgICAgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0ROVU1ORVdTWU1TID4gSkJJRzJfTUFYX05FV19TWVNNQk9MUykgeworICAgIHJldHVybiBKQklHMl9FUlJPUl9MSU1JVDsKKyAgfQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudDsgKytpKSB7CisgICAgaWYgKCFmaW5kU2VnbWVudEJ5TnVtYmVyKHBTZWdtZW50LT5tX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnNbaV0pKQorICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOworICB9CisgIENKQmlnMl9TZWdtZW50KiBwTFJTZWcgPSBudWxscHRyOworICBwU3ltYm9sRGljdERlY29kZXItPlNETlVNSU5TWU1TID0gMDsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQ7ICsraSkgeworICAgIENKQmlnMl9TZWdtZW50KiBwU2VnID0KKyAgICAgICAgZmluZFNlZ21lbnRCeU51bWJlcihwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldKTsKKyAgICBpZiAocFNlZy0+bV9jRmxhZ3Mucy50eXBlID09IDApIHsKKyAgICAgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0ROVU1JTlNZTVMgKz0gcFNlZy0+bV9SZXN1bHQuc2QtPk51bUltYWdlcygpOworICAgICAgcExSU2VnID0gcFNlZzsKKyAgICB9CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlKiwgRnhGcmVlRGVsZXRlcj4gU0RJTlNZTVM7CisgIGlmIChwU3ltYm9sRGljdERlY29kZXItPlNETlVNSU5TWU1TICE9IDApIHsKKyAgICBTRElOU1lNUy5yZXNldChGWF9BbGxvYyhDSkJpZzJfSW1hZ2UqLCBwU3ltYm9sRGljdERlY29kZXItPlNETlVNSU5TWU1TKSk7CisgICAgRlhfRFdPUkQgZHdUZW1wID0gMDsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudDsgKytpKSB7CisgICAgICBDSkJpZzJfU2VnbWVudCogcFNlZyA9CisgICAgICAgICAgZmluZFNlZ21lbnRCeU51bWJlcihwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldKTsKKyAgICAgIGlmIChwU2VnLT5tX2NGbGFncy5zLnR5cGUgPT0gMCkgeworICAgICAgICBjb25zdCBDSkJpZzJfU3ltYm9sRGljdCYgZGljdCA9ICpwU2VnLT5tX1Jlc3VsdC5zZDsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBkaWN0Lk51bUltYWdlcygpOyArK2opCisgICAgICAgICAgU0RJTlNZTVMuZ2V0KClbZHdUZW1wICsgal0gPSBkaWN0LkdldEltYWdlKGopOworICAgICAgICBkd1RlbXAgKz0gZGljdC5OdW1JbWFnZXMoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcFN5bWJvbERpY3REZWNvZGVyLT5TRElOU1lNUyA9IFNESU5TWU1TLmdldCgpOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSHVmZm1hblRhYmxlPiBUYWJsZV9CMTsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9IdWZmbWFuVGFibGU+IFRhYmxlX0IyOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4gVGFibGVfQjM7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSHVmZm1hblRhYmxlPiBUYWJsZV9CNDsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9IdWZmbWFuVGFibGU+IFRhYmxlX0I1OworICBpZiAocFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkYgPT0gMSkgeworICAgIGlmIChjU0RIVUZGREggPT0gMiB8fCBjU0RIVUZGRFcgPT0gMikKKyAgICAgIHJldHVybiBKQklHMl9FUlJPUl9GQVRBTDsKKworICAgIGludDMyX3QgbkluZGV4ID0gMDsKKyAgICBpZiAoY1NESFVGRkRIID09IDApIHsKKyAgICAgIFRhYmxlX0I0LnJlc2V0KG5ldyBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShIdWZmbWFuVGFibGVfQjQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0I0KSk7CisgICAgICBwU3ltYm9sRGljdERlY29kZXItPlNESFVGRkRIID0gVGFibGVfQjQuZ2V0KCk7CisgICAgfSBlbHNlIGlmIChjU0RIVUZGREggPT0gMSkgeworICAgICAgVGFibGVfQjUucmVzZXQobmV3IENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0I1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQXJyYXlTaXplKEh1ZmZtYW5UYWJsZV9CNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjUpKTsKKyAgICAgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RIVUZGREggPSBUYWJsZV9CNS5nZXQoKTsKKyAgICB9IGVsc2UgeworICAgICAgQ0pCaWcyX1NlZ21lbnQqIHBTZWcgPQorICAgICAgICAgIGZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChwU2VnbWVudCwgNTMsIG5JbmRleCsrKTsKKyAgICAgIGlmICghcFNlZykKKyAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOworICAgICAgcFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkZESCA9IHBTZWctPm1fUmVzdWx0Lmh0OworICAgIH0KKyAgICBpZiAoY1NESFVGRkRXID09IDApIHsKKyAgICAgIFRhYmxlX0IyLnJlc2V0KG5ldyBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShIdWZmbWFuVGFibGVfQjIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0IyKSk7CisgICAgICBwU3ltYm9sRGljdERlY29kZXItPlNESFVGRkRXID0gVGFibGVfQjIuZ2V0KCk7CisgICAgfSBlbHNlIGlmIChjU0RIVUZGRFcgPT0gMSkgeworICAgICAgVGFibGVfQjMucmVzZXQobmV3IENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQXJyYXlTaXplKEh1ZmZtYW5UYWJsZV9CMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjMpKTsKKyAgICAgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RIVUZGRFcgPSBUYWJsZV9CMy5nZXQoKTsKKyAgICB9IGVsc2UgeworICAgICAgQ0pCaWcyX1NlZ21lbnQqIHBTZWcgPQorICAgICAgICAgIGZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChwU2VnbWVudCwgNTMsIG5JbmRleCsrKTsKKyAgICAgIGlmICghcFNlZykKKyAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOworICAgICAgcFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkZEVyA9IHBTZWctPm1fUmVzdWx0Lmh0OworICAgIH0KKyAgICBpZiAoY1NESFVGRkJNU0laRSA9PSAwKSB7CisgICAgICBUYWJsZV9CMS5yZXNldChuZXcgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BcnJheVNpemUoSHVmZm1hblRhYmxlX0IxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMSkpOworICAgICAgcFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkZCTVNJWkUgPSBUYWJsZV9CMS5nZXQoKTsKKyAgICB9IGVsc2UgeworICAgICAgQ0pCaWcyX1NlZ21lbnQqIHBTZWcgPQorICAgICAgICAgIGZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChwU2VnbWVudCwgNTMsIG5JbmRleCsrKTsKKyAgICAgIGlmICghcFNlZykKKyAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOworICAgICAgcFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkZCTVNJWkUgPSBwU2VnLT5tX1Jlc3VsdC5odDsKKyAgICB9CisgICAgaWYgKHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RSRUZBR0cgPT0gMSkgeworICAgICAgaWYgKGNTREhVRkZBR0dJTlNUID09IDApIHsKKyAgICAgICAgaWYgKCFUYWJsZV9CMSkgeworICAgICAgICAgIFRhYmxlX0IxLnJlc2V0KG5ldyBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BcnJheVNpemUoSHVmZm1hblRhYmxlX0IxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjEpKTsKICAgICAgICAgfQotICAgICAgICBydW5jb2RlID0gajsKLSAgICAgICAgaWYocnVuY29kZSA8IDMyKSB7Ci0gICAgICAgICAgICBTQlNZTUNPREVTW2ldLmNvZGVsZW4gPSBydW5jb2RlOwotICAgICAgICAgICAgcnVuID0gMDsKLSAgICAgICAgfSBlbHNlIGlmKHJ1bmNvZGUgPT0gMzIpIHsKLSAgICAgICAgICAgIGlmKHBTdHJlYW0tPnJlYWROQml0cygyLCAmblRlbXApICE9IDApIHsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJ1biA9IG5UZW1wICsgMzsKLSAgICAgICAgfSBlbHNlIGlmKHJ1bmNvZGUgPT0gMzMpIHsKLSAgICAgICAgICAgIGlmKHBTdHJlYW0tPnJlYWROQml0cygzLCAmblRlbXApICE9IDApIHsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJ1biA9IG5UZW1wICsgMzsKLSAgICAgICAgfSBlbHNlIGlmKHJ1bmNvZGUgPT0gMzQpIHsKLSAgICAgICAgICAgIGlmKHBTdHJlYW0tPnJlYWROQml0cyg3LCAmblRlbXApICE9IDApIHsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJ1biA9IG5UZW1wICsgMTE7CisgICAgICAgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RIVUZGQUdHSU5TVCA9IFRhYmxlX0IxLmdldCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ0pCaWcyX1NlZ21lbnQqIHBTZWcgPQorICAgICAgICAgICAgZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOworICAgICAgICBpZiAoIXBTZWcpCisgICAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOworICAgICAgICBwU3ltYm9sRGljdERlY29kZXItPlNESFVGRkFHR0lOU1QgPSBwU2VnLT5tX1Jlc3VsdC5odDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjb25zdCBib29sIGJVc2VHYkNvbnRleHQgPSAocFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkYgPT0gMCk7CisgIGNvbnN0IGJvb2wgYlVzZUdyQ29udGV4dCA9IChwU3ltYm9sRGljdERlY29kZXItPlNEUkVGQUdHID09IDEpOworICBjb25zdCBzaXplX3QgZ2JDb250ZXh0U2l6ZSA9CisgICAgICBHZXRIdWZmQ29udGV4dFNpemUocFN5bWJvbERpY3REZWNvZGVyLT5TRFRFTVBMQVRFKTsKKyAgY29uc3Qgc2l6ZV90IGdyQ29udGV4dFNpemUgPQorICAgICAgR2V0UmVmQWdnQ29udGV4dFNpemUocFN5bWJvbERpY3REZWNvZGVyLT5TRFJURU1QTEFURSk7CisgIHN0ZDo6dmVjdG9yPEpCaWcyQXJpdGhDdHg+IGdiQ29udGV4dDsKKyAgc3RkOjp2ZWN0b3I8SkJpZzJBcml0aEN0eD4gZ3JDb250ZXh0OworICBpZiAoKHdGbGFncyAmIDB4MDEwMCkgJiYgcExSU2VnKSB7CisgICAgaWYgKGJVc2VHYkNvbnRleHQpIHsKKyAgICAgIGdiQ29udGV4dCA9IHBMUlNlZy0+bV9SZXN1bHQuc2QtPkdiQ29udGV4dCgpOworICAgICAgaWYgKGdiQ29udGV4dC5zaXplKCkgIT0gZ2JDb250ZXh0U2l6ZSkKKyAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOworICAgIH0KKyAgICBpZiAoYlVzZUdyQ29udGV4dCkgeworICAgICAgZ3JDb250ZXh0ID0gcExSU2VnLT5tX1Jlc3VsdC5zZC0+R3JDb250ZXh0KCk7CisgICAgICBpZiAoZ3JDb250ZXh0LnNpemUoKSAhPSBnckNvbnRleHRTaXplKQorICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChiVXNlR2JDb250ZXh0KQorICAgICAgZ2JDb250ZXh0LnJlc2l6ZShnYkNvbnRleHRTaXplKTsKKyAgICBpZiAoYlVzZUdyQ29udGV4dCkKKyAgICAgIGdyQ29udGV4dC5yZXNpemUoZ3JDb250ZXh0U2l6ZSk7CisgIH0KKworICBDSkJpZzJfQ2FjaGVLZXkga2V5ID0KKyAgICAgIENKQmlnMl9DYWNoZUtleShwU2VnbWVudC0+bV9kd09iak51bSwgcFNlZ21lbnQtPm1fZHdEYXRhT2Zmc2V0KTsKKyAgRlhfQk9PTCBjYWNoZV9oaXQgPSBmYWxzZTsKKyAgcFNlZ21lbnQtPm1fblJlc3VsdFR5cGUgPSBKQklHMl9TWU1CT0xfRElDVF9QT0lOVEVSOworICBpZiAobV9iSXNHbG9iYWwgJiYga2V5LmZpcnN0ICE9IDApIHsKKyAgICBmb3IgKGF1dG8gaXQgPSBtX3BTeW1ib2xEaWN0Q2FjaGUtPmJlZ2luKCk7IGl0ICE9IG1fcFN5bWJvbERpY3RDYWNoZS0+ZW5kKCk7CisgICAgICAgICArK2l0KSB7CisgICAgICBpZiAoaXQtPmZpcnN0ID09IGtleSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX1N5bWJvbERpY3Q+IGNvcHkoaXQtPnNlY29uZC0+RGVlcENvcHkoKSk7CisgICAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5zZCA9IGNvcHkucmVsZWFzZSgpOworICAgICAgICBtX3BTeW1ib2xEaWN0Q2FjaGUtPnB1c2hfZnJvbnQoKml0KTsKKyAgICAgICAgbV9wU3ltYm9sRGljdENhY2hlLT5lcmFzZShpdCk7CisgICAgICAgIGNhY2hlX2hpdCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoIWNhY2hlX2hpdCkgeworICAgIGlmIChiVXNlR2JDb250ZXh0KSB7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0FyaXRoRGVjb2Rlcj4gcEFyaXRoRGVjb2RlcigKKyAgICAgICAgICBuZXcgQ0pCaWcyX0FyaXRoRGVjb2RlcihtX3BTdHJlYW0uZ2V0KCkpKTsKKyAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5zZCA9IHBTeW1ib2xEaWN0RGVjb2Rlci0+ZGVjb2RlX0FyaXRoKAorICAgICAgICAgIHBBcml0aERlY29kZXIuZ2V0KCksICZnYkNvbnRleHQsICZnckNvbnRleHQpOworICAgICAgaWYgKCFwU2VnbWVudC0+bV9SZXN1bHQuc2QpCisgICAgICAgIHJldHVybiBKQklHMl9FUlJPUl9GQVRBTDsKKworICAgICAgbV9wU3RyZWFtLT5hbGlnbkJ5dGUoKTsKKyAgICAgIG1fcFN0cmVhbS0+b2Zmc2V0KDIpOworICAgIH0gZWxzZSB7CisgICAgICBwU2VnbWVudC0+bV9SZXN1bHQuc2QgPSBwU3ltYm9sRGljdERlY29kZXItPmRlY29kZV9IdWZmbWFuKAorICAgICAgICAgIG1fcFN0cmVhbS5nZXQoKSwgJmdiQ29udGV4dCwgJmdyQ29udGV4dCwgcFBhdXNlKTsKKyAgICAgIGlmICghcFNlZ21lbnQtPm1fUmVzdWx0LnNkKQorICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7CisgICAgICBtX3BTdHJlYW0tPmFsaWduQnl0ZSgpOworICAgIH0KKyAgICBpZiAobV9iSXNHbG9iYWwgJiYga1N5bWJvbERpY3RDYWNoZU1heFNpemUgPiAwKSB7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX1N5bWJvbERpY3Q+IHZhbHVlID0KKyAgICAgICAgICBwU2VnbWVudC0+bV9SZXN1bHQuc2QtPkRlZXBDb3B5KCk7CisgICAgICB3aGlsZSAobV9wU3ltYm9sRGljdENhY2hlLT5zaXplKCkgPj0ga1N5bWJvbERpY3RDYWNoZU1heFNpemUpIHsKKyAgICAgICAgZGVsZXRlIG1fcFN5bWJvbERpY3RDYWNoZS0+YmFjaygpLnNlY29uZDsKKyAgICAgICAgbV9wU3ltYm9sRGljdENhY2hlLT5wb3BfYmFjaygpOworICAgICAgfQorICAgICAgbV9wU3ltYm9sRGljdENhY2hlLT5wdXNoX2Zyb250KENKQmlnMl9DYWNoZVBhaXIoa2V5LCB2YWx1ZS5yZWxlYXNlKCkpKTsKKyAgICB9CisgIH0KKyAgaWYgKHdGbGFncyAmIDB4MDIwMCkgeworICAgIGlmIChiVXNlR2JDb250ZXh0KQorICAgICAgcFNlZ21lbnQtPm1fUmVzdWx0LnNkLT5TZXRHYkNvbnRleHQoZ2JDb250ZXh0KTsKKyAgICBpZiAoYlVzZUdyQ29udGV4dCkKKyAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5zZC0+U2V0R3JDb250ZXh0KGdyQ29udGV4dCk7CisgIH0KKyAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7Cit9CisKK2ludDMyX3QgQ0pCaWcyX0NvbnRleHQ6OnBhcnNlVGV4dFJlZ2lvbihDSkJpZzJfU2VnbWVudCogcFNlZ21lbnQpIHsKKyAgRlhfV09SRCB3RmxhZ3M7CisgIEpCaWcyUmVnaW9uSW5mbyByaTsKKyAgaWYgKHBhcnNlUmVnaW9uSW5mbygmcmkpICE9IEpCSUcyX1NVQ0NFU1MgfHwKKyAgICAgIG1fcFN0cmVhbS0+cmVhZFNob3J0SW50ZWdlcigmd0ZsYWdzKSAhPSAwKSB7CisgICAgcmV0dXJuIEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfVFJEUHJvYz4gcFRSRChuZXcgQ0pCaWcyX1RSRFByb2MpOworICBwVFJELT5TQlcgPSByaS53aWR0aDsKKyAgcFRSRC0+U0JIID0gcmkuaGVpZ2h0OworICBwVFJELT5TQkhVRkYgPSB3RmxhZ3MgJiAweDAwMDE7CisgIHBUUkQtPlNCUkVGSU5FID0gKHdGbGFncyA+PiAxKSAmIDB4MDAwMTsKKyAgRlhfRFdPUkQgZHdUZW1wID0gKHdGbGFncyA+PiAyKSAmIDB4MDAwMzsKKyAgcFRSRC0+U0JTVFJJUFMgPSAxIDw8IGR3VGVtcDsKKyAgcFRSRC0+UkVGQ09STkVSID0gKEpCaWcyQ29ybmVyKSgod0ZsYWdzID4+IDQpICYgMHgwMDAzKTsKKyAgcFRSRC0+VFJBTlNQT1NFRCA9ICh3RmxhZ3MgPj4gNikgJiAweDAwMDE7CisgIHBUUkQtPlNCQ09NQk9QID0gKEpCaWcyQ29tcG9zZU9wKSgod0ZsYWdzID4+IDcpICYgMHgwMDAzKTsKKyAgcFRSRC0+U0JERUZQSVhFTCA9ICh3RmxhZ3MgPj4gOSkgJiAweDAwMDE7CisgIHBUUkQtPlNCRFNPRkZTRVQgPSAod0ZsYWdzID4+IDEwKSAmIDB4MDAxZjsKKyAgaWYgKHBUUkQtPlNCRFNPRkZTRVQgPj0gMHgwMDEwKSB7CisgICAgcFRSRC0+U0JEU09GRlNFVCA9IHBUUkQtPlNCRFNPRkZTRVQgLSAweDAwMjA7CisgIH0KKyAgcFRSRC0+U0JSVEVNUExBVEUgPSAod0ZsYWdzID4+IDE1KSAmIDB4MDAwMTsKKworICB1aW50OF90IGNTQkhVRkZGUzsKKyAgdWludDhfdCBjU0JIVUZGRFM7CisgIHVpbnQ4X3QgY1NCSFVGRkRUOworICB1aW50OF90IGNTQkhVRkZSRFc7CisgIHVpbnQ4X3QgY1NCSFVGRlJESDsKKyAgdWludDhfdCBjU0JIVUZGUkRYOworICB1aW50OF90IGNTQkhVRkZSRFk7CisgIHVpbnQ4X3QgY1NCSFVGRlJTSVpFOworICBpZiAocFRSRC0+U0JIVUZGID09IDEpIHsKKyAgICBpZiAobV9wU3RyZWFtLT5yZWFkU2hvcnRJbnRlZ2VyKCZ3RmxhZ3MpICE9IDApCisgICAgICByZXR1cm4gSkJJRzJfRVJST1JfVE9PX1NIT1JUOworCisgICAgY1NCSFVGRkZTID0gd0ZsYWdzICYgMHgwMDAzOworICAgIGNTQkhVRkZEUyA9ICh3RmxhZ3MgPj4gMikgJiAweDAwMDM7CisgICAgY1NCSFVGRkRUID0gKHdGbGFncyA+PiA0KSAmIDB4MDAwMzsKKyAgICBjU0JIVUZGUkRXID0gKHdGbGFncyA+PiA2KSAmIDB4MDAwMzsKKyAgICBjU0JIVUZGUkRIID0gKHdGbGFncyA+PiA4KSAmIDB4MDAwMzsKKyAgICBjU0JIVUZGUkRYID0gKHdGbGFncyA+PiAxMCkgJiAweDAwMDM7CisgICAgY1NCSFVGRlJEWSA9ICh3RmxhZ3MgPj4gMTIpICYgMHgwMDAzOworICAgIGNTQkhVRkZSU0laRSA9ICh3RmxhZ3MgPj4gMTQpICYgMHgwMDAxOworICB9CisgIGlmIChwVFJELT5TQlJFRklORSA9PSAxICYmIHBUUkQtPlNCUlRFTVBMQVRFID09IDApIHsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgIGlmIChtX3BTdHJlYW0tPnJlYWQxQnl0ZSgodWludDhfdCopJnBUUkQtPlNCUkFUW2ldKSAhPSAwKQorICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfVE9PX1NIT1JUOworICAgIH0KKyAgfQorICBpZiAobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigmcFRSRC0+U0JOVU1JTlNUQU5DRVMpICE9IDApCisgICAgcmV0dXJuIEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKKworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudDsgKytpKSB7CisgICAgaWYgKCFmaW5kU2VnbWVudEJ5TnVtYmVyKHBTZWdtZW50LT5tX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnNbaV0pKQorICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOworICB9CisKKyAgcFRSRC0+U0JOVU1TWU1TID0gMDsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQ7ICsraSkgeworICAgIENKQmlnMl9TZWdtZW50KiBwU2VnID0KKyAgICAgICAgZmluZFNlZ21lbnRCeU51bWJlcihwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldKTsKKyAgICBpZiAocFNlZy0+bV9jRmxhZ3Mucy50eXBlID09IDApIHsKKyAgICAgIHBUUkQtPlNCTlVNU1lNUyArPSBwU2VnLT5tX1Jlc3VsdC5zZC0+TnVtSW1hZ2VzKCk7CisgICAgfQorICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZSosIEZ4RnJlZURlbGV0ZXI+IFNCU1lNUzsKKyAgaWYgKHBUUkQtPlNCTlVNU1lNUyA+IDApIHsKKyAgICBTQlNZTVMucmVzZXQoRlhfQWxsb2MoQ0pCaWcyX0ltYWdlKiwgcFRSRC0+U0JOVU1TWU1TKSk7CisgICAgZHdUZW1wID0gMDsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudDsgKytpKSB7CisgICAgICBDSkJpZzJfU2VnbWVudCogcFNlZyA9CisgICAgICAgICAgZmluZFNlZ21lbnRCeU51bWJlcihwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldKTsKKyAgICAgIGlmIChwU2VnLT5tX2NGbGFncy5zLnR5cGUgPT0gMCkgeworICAgICAgICBjb25zdCBDSkJpZzJfU3ltYm9sRGljdCYgZGljdCA9ICpwU2VnLT5tX1Jlc3VsdC5zZDsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBkaWN0Lk51bUltYWdlcygpOyArK2opCisgICAgICAgICAgU0JTWU1TLmdldCgpW2R3VGVtcCArIGpdID0gZGljdC5HZXRJbWFnZShqKTsKKyAgICAgICAgZHdUZW1wICs9IGRpY3QuTnVtSW1hZ2VzKCk7CisgICAgICB9CisgICAgfQorICAgIHBUUkQtPlNCU1lNUyA9IFNCU1lNUy5nZXQoKTsKKyAgfSBlbHNlIHsKKyAgICBwVFJELT5TQlNZTVMgPSBOVUxMOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPEpCaWcySHVmZm1hbkNvZGUsIEZ4RnJlZURlbGV0ZXI+IFNCU1lNQ09ERVM7CisgIGlmIChwVFJELT5TQkhVRkYgPT0gMSkgeworICAgIFNCU1lNQ09ERVMucmVzZXQoCisgICAgICAgIGRlY29kZVN5bWJvbElESHVmZm1hblRhYmxlKG1fcFN0cmVhbS5nZXQoKSwgcFRSRC0+U0JOVU1TWU1TKSk7CisgICAgaWYgKCFTQlNZTUNPREVTKQorICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOworCisgICAgbV9wU3RyZWFtLT5hbGlnbkJ5dGUoKTsKKyAgICBwVFJELT5TQlNZTUNPREVTID0gU0JTWU1DT0RFUy5nZXQoKTsKKyAgfSBlbHNlIHsKKyAgICBkd1RlbXAgPSAwOworICAgIHdoaWxlICgoRlhfRFdPUkQpKDEgPDwgZHdUZW1wKSA8IHBUUkQtPlNCTlVNU1lNUykgeworICAgICAgKytkd1RlbXA7CisgICAgfQorICAgIHBUUkQtPlNCU1lNQ09ERUxFTiA9ICh1aW50OF90KWR3VGVtcDsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSHVmZm1hblRhYmxlPiBUYWJsZV9CMTsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9IdWZmbWFuVGFibGU+IFRhYmxlX0I2OworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4gVGFibGVfQjc7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSHVmZm1hblRhYmxlPiBUYWJsZV9CODsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9IdWZmbWFuVGFibGU+IFRhYmxlX0I5OworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4gVGFibGVfQjEwOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4gVGFibGVfQjExOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4gVGFibGVfQjEyOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4gVGFibGVfQjEzOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4gVGFibGVfQjE0OworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4gVGFibGVfQjE1OworICBpZiAocFRSRC0+U0JIVUZGID09IDEpIHsKKyAgICBpZiAoY1NCSFVGRkZTID09IDIgfHwgY1NCSFVGRlJEVyA9PSAyIHx8IGNTQkhVRkZSREggPT0gMiB8fAorICAgICAgICBjU0JIVUZGUkRYID09IDIgfHwgY1NCSFVGRlJEWSA9PSAyKSB7CisgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7CisgICAgfQorICAgIGludDMyX3QgbkluZGV4ID0gMDsKKyAgICBpZiAoY1NCSFVGRkZTID09IDApIHsKKyAgICAgIFRhYmxlX0I2LnJlc2V0KG5ldyBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShIdWZmbWFuVGFibGVfQjYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0I2KSk7CisgICAgICBwVFJELT5TQkhVRkZGUyA9IFRhYmxlX0I2LmdldCgpOworICAgIH0gZWxzZSBpZiAoY1NCSFVGRkZTID09IDEpIHsKKyAgICAgIFRhYmxlX0I3LnJlc2V0KG5ldyBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShIdWZmbWFuVGFibGVfQjcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0I3KSk7CisgICAgICBwVFJELT5TQkhVRkZGUyA9IFRhYmxlX0I3LmdldCgpOworICAgIH0gZWxzZSB7CisgICAgICBDSkJpZzJfU2VnbWVudCogcFNlZyA9CisgICAgICAgICAgZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOworICAgICAgaWYgKCFwU2VnKQorICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7CisgICAgICBwVFJELT5TQkhVRkZGUyA9IHBTZWctPm1fUmVzdWx0Lmh0OworICAgIH0KKyAgICBpZiAoY1NCSFVGRkRTID09IDApIHsKKyAgICAgIFRhYmxlX0I4LnJlc2V0KG5ldyBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9COCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShIdWZmbWFuVGFibGVfQjgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0I4KSk7CisgICAgICBwVFJELT5TQkhVRkZEUyA9IFRhYmxlX0I4LmdldCgpOworICAgIH0gZWxzZSBpZiAoY1NCSFVGRkRTID09IDEpIHsKKyAgICAgIFRhYmxlX0I5LnJlc2V0KG5ldyBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9COSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShIdWZmbWFuVGFibGVfQjkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0I5KSk7CisgICAgICBwVFJELT5TQkhVRkZEUyA9IFRhYmxlX0I5LmdldCgpOworICAgIH0gZWxzZSBpZiAoY1NCSFVGRkRTID09IDIpIHsKKyAgICAgIFRhYmxlX0IxMC5yZXNldChuZXcgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShIdWZmbWFuVGFibGVfQjEwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjEwKSk7CisgICAgICBwVFJELT5TQkhVRkZEUyA9IFRhYmxlX0IxMC5nZXQoKTsKKyAgICB9IGVsc2UgeworICAgICAgQ0pCaWcyX1NlZ21lbnQqIHBTZWcgPQorICAgICAgICAgIGZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChwU2VnbWVudCwgNTMsIG5JbmRleCsrKTsKKyAgICAgIGlmICghcFNlZykKKyAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOworICAgICAgcFRSRC0+U0JIVUZGRFMgPSBwU2VnLT5tX1Jlc3VsdC5odDsKKyAgICB9CisgICAgaWYgKGNTQkhVRkZEVCA9PSAwKSB7CisgICAgICBUYWJsZV9CMTEucmVzZXQobmV3IENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BcnJheVNpemUoSHVmZm1hblRhYmxlX0IxMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0IxMSkpOworICAgICAgcFRSRC0+U0JIVUZGRFQgPSBUYWJsZV9CMTEuZ2V0KCk7CisgICAgfSBlbHNlIGlmIChjU0JIVUZGRFQgPT0gMSkgeworICAgICAgVGFibGVfQjEyLnJlc2V0KG5ldyBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQXJyYXlTaXplKEh1ZmZtYW5UYWJsZV9CMTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTIpKTsKKyAgICAgIHBUUkQtPlNCSFVGRkRUID0gVGFibGVfQjEyLmdldCgpOworICAgIH0gZWxzZSBpZiAoY1NCSFVGRkRUID09IDIpIHsKKyAgICAgIFRhYmxlX0IxMy5yZXNldChuZXcgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShIdWZmbWFuVGFibGVfQjEzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjEzKSk7CisgICAgICBwVFJELT5TQkhVRkZEVCA9IFRhYmxlX0IxMy5nZXQoKTsKKyAgICB9IGVsc2UgeworICAgICAgQ0pCaWcyX1NlZ21lbnQqIHBTZWcgPQorICAgICAgICAgIGZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChwU2VnbWVudCwgNTMsIG5JbmRleCsrKTsKKyAgICAgIGlmICghcFNlZykKKyAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOworICAgICAgcFRSRC0+U0JIVUZGRFQgPSBwU2VnLT5tX1Jlc3VsdC5odDsKKyAgICB9CisgICAgaWYgKGNTQkhVRkZSRFcgPT0gMCkgeworICAgICAgVGFibGVfQjE0LnJlc2V0KG5ldyBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQXJyYXlTaXplKEh1ZmZtYW5UYWJsZV9CMTQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTQpKTsKKyAgICAgIHBUUkQtPlNCSFVGRlJEVyA9IFRhYmxlX0IxNC5nZXQoKTsKKyAgICB9IGVsc2UgaWYgKGNTQkhVRkZSRFcgPT0gMSkgeworICAgICAgVGFibGVfQjE1LnJlc2V0KG5ldyBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQXJyYXlTaXplKEh1ZmZtYW5UYWJsZV9CMTUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTUpKTsKKyAgICAgIHBUUkQtPlNCSFVGRlJEVyA9IFRhYmxlX0IxNS5nZXQoKTsKKyAgICB9IGVsc2UgeworICAgICAgQ0pCaWcyX1NlZ21lbnQqIHBTZWcgPQorICAgICAgICAgIGZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChwU2VnbWVudCwgNTMsIG5JbmRleCsrKTsKKyAgICAgIGlmICghcFNlZykKKyAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOworICAgICAgcFRSRC0+U0JIVUZGUkRXID0gcFNlZy0+bV9SZXN1bHQuaHQ7CisgICAgfQorICAgIGlmIChjU0JIVUZGUkRIID09IDApIHsKKyAgICAgIGlmICghVGFibGVfQjE0KSB7CisgICAgICAgIFRhYmxlX0IxNC5yZXNldChuZXcgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjE0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQXJyYXlTaXplKEh1ZmZtYW5UYWJsZV9CMTQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0IxNCkpOworICAgICAgfQorICAgICAgcFRSRC0+U0JIVUZGUkRIID0gVGFibGVfQjE0LmdldCgpOworICAgIH0gZWxzZSBpZiAoY1NCSFVGRlJESCA9PSAxKSB7CisgICAgICBpZiAoIVRhYmxlX0IxNSkgeworICAgICAgICBUYWJsZV9CMTUucmVzZXQobmV3IENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShIdWZmbWFuVGFibGVfQjE1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTUpKTsKKyAgICAgIH0KKyAgICAgIHBUUkQtPlNCSFVGRlJESCA9IFRhYmxlX0IxNS5nZXQoKTsKKyAgICB9IGVsc2UgeworICAgICAgQ0pCaWcyX1NlZ21lbnQqIHBTZWcgPQorICAgICAgICAgIGZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChwU2VnbWVudCwgNTMsIG5JbmRleCsrKTsKKyAgICAgIGlmICghcFNlZykKKyAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOworICAgICAgcFRSRC0+U0JIVUZGUkRIID0gcFNlZy0+bV9SZXN1bHQuaHQ7CisgICAgfQorICAgIGlmIChjU0JIVUZGUkRYID09IDApIHsKKyAgICAgIGlmICghVGFibGVfQjE0KSB7CisgICAgICAgIFRhYmxlX0IxNC5yZXNldChuZXcgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjE0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQXJyYXlTaXplKEh1ZmZtYW5UYWJsZV9CMTQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0IxNCkpOworICAgICAgfQorICAgICAgcFRSRC0+U0JIVUZGUkRYID0gVGFibGVfQjE0LmdldCgpOworICAgIH0gZWxzZSBpZiAoY1NCSFVGRlJEWCA9PSAxKSB7CisgICAgICBpZiAoIVRhYmxlX0IxNSkgeworICAgICAgICBUYWJsZV9CMTUucmVzZXQobmV3IENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShIdWZmbWFuVGFibGVfQjE1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTUpKTsKKyAgICAgIH0KKyAgICAgIHBUUkQtPlNCSFVGRlJEWCA9IFRhYmxlX0IxNS5nZXQoKTsKKyAgICB9IGVsc2UgeworICAgICAgQ0pCaWcyX1NlZ21lbnQqIHBTZWcgPQorICAgICAgICAgIGZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChwU2VnbWVudCwgNTMsIG5JbmRleCsrKTsKKyAgICAgIGlmICghcFNlZykKKyAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOworICAgICAgcFRSRC0+U0JIVUZGUkRYID0gcFNlZy0+bV9SZXN1bHQuaHQ7CisgICAgfQorICAgIGlmIChjU0JIVUZGUkRZID09IDApIHsKKyAgICAgIGlmICghVGFibGVfQjE0KSB7CisgICAgICAgIFRhYmxlX0IxNC5yZXNldChuZXcgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjE0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQXJyYXlTaXplKEh1ZmZtYW5UYWJsZV9CMTQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0IxNCkpOworICAgICAgfQorICAgICAgcFRSRC0+U0JIVUZGUkRZID0gVGFibGVfQjE0LmdldCgpOworICAgIH0gZWxzZSBpZiAoY1NCSFVGRlJEWSA9PSAxKSB7CisgICAgICBpZiAoIVRhYmxlX0IxNSkgeworICAgICAgICBUYWJsZV9CMTUucmVzZXQobmV3IENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShIdWZmbWFuVGFibGVfQjE1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTUpKTsKKyAgICAgIH0KKyAgICAgIHBUUkQtPlNCSFVGRlJEWSA9IFRhYmxlX0IxNS5nZXQoKTsKKyAgICB9IGVsc2UgeworICAgICAgQ0pCaWcyX1NlZ21lbnQqIHBTZWcgPQorICAgICAgICAgIGZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChwU2VnbWVudCwgNTMsIG5JbmRleCsrKTsKKyAgICAgIGlmICghcFNlZykKKyAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOworICAgICAgcFRSRC0+U0JIVUZGUkRZID0gcFNlZy0+bV9SZXN1bHQuaHQ7CisgICAgfQorICAgIGlmIChjU0JIVUZGUlNJWkUgPT0gMCkgeworICAgICAgVGFibGVfQjEucmVzZXQobmV3IENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQXJyYXlTaXplKEh1ZmZtYW5UYWJsZV9CMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjEpKTsKKyAgICAgIHBUUkQtPlNCSFVGRlJTSVpFID0gVGFibGVfQjEuZ2V0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIENKQmlnMl9TZWdtZW50KiBwU2VnID0KKyAgICAgICAgICBmaW5kUmVmZXJyZWRTZWdtZW50QnlUeXBlQW5kSW5kZXgocFNlZ21lbnQsIDUzLCBuSW5kZXgrKyk7CisgICAgICBpZiAoIXBTZWcpCisgICAgICAgIHJldHVybiBKQklHMl9FUlJPUl9GQVRBTDsKKyAgICAgIHBUUkQtPlNCSFVGRlJTSVpFID0gcFNlZy0+bV9SZXN1bHQuaHQ7CisgICAgfQorICB9CisgIHN0ZDo6dW5pcXVlX3B0cjxKQmlnMkFyaXRoQ3R4LCBGeEZyZWVEZWxldGVyPiBnckNvbnRleHQ7CisgIGlmIChwVFJELT5TQlJFRklORSA9PSAxKSB7CisgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBHZXRSZWZBZ2dDb250ZXh0U2l6ZShwVFJELT5TQlJURU1QTEFURSk7CisgICAgZ3JDb250ZXh0LnJlc2V0KEZYX0FsbG9jKEpCaWcyQXJpdGhDdHgsIHNpemUpKTsKKyAgICBKQklHMl9tZW1zZXQoZ3JDb250ZXh0LmdldCgpLCAwLCBzaXplb2YoSkJpZzJBcml0aEN0eCkgKiBzaXplKTsKKyAgfQorICBpZiAocFRSRC0+U0JIVUZGID09IDApIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0FyaXRoRGVjb2Rlcj4gcEFyaXRoRGVjb2RlcigKKyAgICAgICAgbmV3IENKQmlnMl9Bcml0aERlY29kZXIobV9wU3RyZWFtLmdldCgpKSk7CisgICAgcFNlZ21lbnQtPm1fblJlc3VsdFR5cGUgPSBKQklHMl9JTUFHRV9QT0lOVEVSOworICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5pbSA9CisgICAgICAgIHBUUkQtPmRlY29kZV9Bcml0aChwQXJpdGhEZWNvZGVyLmdldCgpLCBnckNvbnRleHQuZ2V0KCkpOworICAgIGlmICghcFNlZ21lbnQtPm1fUmVzdWx0LmltKQorICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOworICAgIG1fcFN0cmVhbS0+YWxpZ25CeXRlKCk7CisgICAgbV9wU3RyZWFtLT5vZmZzZXQoMik7CisgIH0gZWxzZSB7CisgICAgcFNlZ21lbnQtPm1fblJlc3VsdFR5cGUgPSBKQklHMl9JTUFHRV9QT0lOVEVSOworICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5pbSA9CisgICAgICAgIHBUUkQtPmRlY29kZV9IdWZmbWFuKG1fcFN0cmVhbS5nZXQoKSwgZ3JDb250ZXh0LmdldCgpKTsKKyAgICBpZiAoIXBTZWdtZW50LT5tX1Jlc3VsdC5pbSkKKyAgICAgIHJldHVybiBKQklHMl9FUlJPUl9GQVRBTDsKKyAgICBtX3BTdHJlYW0tPmFsaWduQnl0ZSgpOworICB9CisgIGlmIChwU2VnbWVudC0+bV9jRmxhZ3Mucy50eXBlICE9IDQpIHsKKyAgICBpZiAoIW1fYkJ1ZlNwZWNpZmllZCkgeworICAgICAgSkJpZzJQYWdlSW5mbyogcFBhZ2VJbmZvID0gbV9QYWdlSW5mb0xpc3QuYmFjaygpOworICAgICAgaWYgKChwUGFnZUluZm8tPm1fYklzU3RyaXBlZCA9PSAxKSAmJgorICAgICAgICAgIChyaS55ICsgcmkuaGVpZ2h0ID4gbV9wUGFnZS0+bV9uSGVpZ2h0KSkgeworICAgICAgICBtX3BQYWdlLT5leHBhbmQocmkueSArIHJpLmhlaWdodCwgKHBQYWdlSW5mby0+bV9jRmxhZ3MgJiA0KSA/IDEgOiAwKTsKKyAgICAgIH0KKyAgICB9CisgICAgbV9wUGFnZS0+Y29tcG9zZUZyb20ocmkueCwgcmkueSwgcFNlZ21lbnQtPm1fUmVzdWx0LmltLAorICAgICAgICAgICAgICAgICAgICAgICAgIChKQmlnMkNvbXBvc2VPcCkocmkuZmxhZ3MgJiAweDAzKSk7CisgICAgZGVsZXRlIHBTZWdtZW50LT5tX1Jlc3VsdC5pbTsKKyAgICBwU2VnbWVudC0+bV9SZXN1bHQuaW0gPSBOVUxMOworICB9CisgIHJldHVybiBKQklHMl9TVUNDRVNTOworfQorCitpbnQzMl90IENKQmlnMl9Db250ZXh0OjpwYXJzZVBhdHRlcm5EaWN0KENKQmlnMl9TZWdtZW50KiBwU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgdWludDhfdCBjRmxhZ3M7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfUEREUHJvYz4gcFBERChuZXcgQ0pCaWcyX1BERFByb2MpOworICBpZiAobV9wU3RyZWFtLT5yZWFkMUJ5dGUoJmNGbGFncykgIT0gMCB8fAorICAgICAgbV9wU3RyZWFtLT5yZWFkMUJ5dGUoJnBQREQtPkhEUFcpICE9IDAgfHwKKyAgICAgIG1fcFN0cmVhbS0+cmVhZDFCeXRlKCZwUERELT5IRFBIKSAhPSAwIHx8CisgICAgICBtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKCZwUERELT5HUkFZTUFYKSAhPSAwKSB7CisgICAgcmV0dXJuIEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKKyAgfQorICBpZiAocFBERC0+R1JBWU1BWCA+IEpCSUcyX01BWF9QQVRURVJOX0lOREVYKQorICAgIHJldHVybiBKQklHMl9FUlJPUl9MSU1JVDsKKworICBwUERELT5IRE1NUiA9IGNGbGFncyAmIDB4MDE7CisgIHBQREQtPkhEVEVNUExBVEUgPSAoY0ZsYWdzID4+IDEpICYgMHgwMzsKKyAgcFNlZ21lbnQtPm1fblJlc3VsdFR5cGUgPSBKQklHMl9QQVRURVJOX0RJQ1RfUE9JTlRFUjsKKyAgaWYgKHBQREQtPkhETU1SID09IDApIHsKKyAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IEdldEh1ZmZDb250ZXh0U2l6ZShwUERELT5IRFRFTVBMQVRFKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SkJpZzJBcml0aEN0eCwgRnhGcmVlRGVsZXRlcj4gZ2JDb250ZXh0KAorICAgICAgICBGWF9BbGxvYyhKQmlnMkFyaXRoQ3R4LCBzaXplKSk7CisgICAgSkJJRzJfbWVtc2V0KGdiQ29udGV4dC5nZXQoKSwgMCwgc2l6ZW9mKEpCaWcyQXJpdGhDdHgpICogc2l6ZSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Bcml0aERlY29kZXI+IHBBcml0aERlY29kZXIoCisgICAgICAgIG5ldyBDSkJpZzJfQXJpdGhEZWNvZGVyKG1fcFN0cmVhbS5nZXQoKSkpOworICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5wZCA9CisgICAgICAgIHBQREQtPmRlY29kZV9Bcml0aChwQXJpdGhEZWNvZGVyLmdldCgpLCBnYkNvbnRleHQuZ2V0KCksIHBQYXVzZSk7CisgICAgaWYgKCFwU2VnbWVudC0+bV9SZXN1bHQucGQpCisgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7CisKKyAgICBtX3BTdHJlYW0tPmFsaWduQnl0ZSgpOworICAgIG1fcFN0cmVhbS0+b2Zmc2V0KDIpOworICB9IGVsc2UgeworICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5wZCA9IHBQREQtPmRlY29kZV9NTVIobV9wU3RyZWFtLmdldCgpLCBwUGF1c2UpOworICAgIGlmICghcFNlZ21lbnQtPm1fUmVzdWx0LnBkKQorICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOworICAgIG1fcFN0cmVhbS0+YWxpZ25CeXRlKCk7CisgIH0KKyAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7Cit9CisKK2ludDMyX3QgQ0pCaWcyX0NvbnRleHQ6OnBhcnNlSGFsZnRvbmVSZWdpb24oQ0pCaWcyX1NlZ21lbnQqIHBTZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICB1aW50OF90IGNGbGFnczsKKyAgSkJpZzJSZWdpb25JbmZvIHJpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0hUUkRQcm9jPiBwSFJEKG5ldyBDSkJpZzJfSFRSRFByb2MpOworICBpZiAocGFyc2VSZWdpb25JbmZvKCZyaSkgIT0gSkJJRzJfU1VDQ0VTUyB8fAorICAgICAgbV9wU3RyZWFtLT5yZWFkMUJ5dGUoJmNGbGFncykgIT0gMCB8fAorICAgICAgbV9wU3RyZWFtLT5yZWFkSW50ZWdlcigmcEhSRC0+SEdXKSAhPSAwIHx8CisgICAgICBtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKCZwSFJELT5IR0gpICE9IDAgfHwKKyAgICAgIG1fcFN0cmVhbS0+cmVhZEludGVnZXIoKEZYX0RXT1JEKikmcEhSRC0+SEdYKSAhPSAwIHx8CisgICAgICBtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKChGWF9EV09SRCopJnBIUkQtPkhHWSkgIT0gMCB8fAorICAgICAgbV9wU3RyZWFtLT5yZWFkU2hvcnRJbnRlZ2VyKCZwSFJELT5IUlgpICE9IDAgfHwKKyAgICAgIG1fcFN0cmVhbS0+cmVhZFNob3J0SW50ZWdlcigmcEhSRC0+SFJZKSAhPSAwKSB7CisgICAgcmV0dXJuIEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKKyAgfQorCisgIGlmIChwSFJELT5IR1cgPT0gMCB8fCBwSFJELT5IR0ggPT0gMCkKKyAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7CisKKyAgcEhSRC0+SEJXID0gcmkud2lkdGg7CisgIHBIUkQtPkhCSCA9IHJpLmhlaWdodDsKKyAgcEhSRC0+SE1NUiA9IGNGbGFncyAmIDB4MDE7CisgIHBIUkQtPkhURU1QTEFURSA9IChjRmxhZ3MgPj4gMSkgJiAweDAzOworICBwSFJELT5IRU5BQkxFU0tJUCA9IChjRmxhZ3MgPj4gMykgJiAweDAxOworICBwSFJELT5IQ09NQk9QID0gKEpCaWcyQ29tcG9zZU9wKSgoY0ZsYWdzID4+IDQpICYgMHgwNyk7CisgIHBIUkQtPkhERUZQSVhFTCA9IChjRmxhZ3MgPj4gNykgJiAweDAxOworICBpZiAocFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQgIT0gMSkKKyAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7CisKKyAgQ0pCaWcyX1NlZ21lbnQqIHBTZWcgPQorICAgICAgZmluZFNlZ21lbnRCeU51bWJlcihwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzWzBdKTsKKyAgaWYgKCFwU2VnIHx8IChwU2VnLT5tX2NGbGFncy5zLnR5cGUgIT0gMTYpKQorICAgIHJldHVybiBKQklHMl9FUlJPUl9GQVRBTDsKKworICBDSkJpZzJfUGF0dGVybkRpY3QqIHBQYXR0ZXJuRGljdCA9IHBTZWctPm1fUmVzdWx0LnBkOworICBpZiAoIXBQYXR0ZXJuRGljdCB8fCAocFBhdHRlcm5EaWN0LT5OVU1QQVRTID09IDApKQorICAgIHJldHVybiBKQklHMl9FUlJPUl9GQVRBTDsKKworICBwSFJELT5ITlVNUEFUUyA9IHBQYXR0ZXJuRGljdC0+TlVNUEFUUzsKKyAgcEhSRC0+SFBBVFMgPSBwUGF0dGVybkRpY3QtPkhEUEFUUzsKKyAgcEhSRC0+SFBXID0gcFBhdHRlcm5EaWN0LT5IRFBBVFNbMF0tPm1fbldpZHRoOworICBwSFJELT5IUEggPSBwUGF0dGVybkRpY3QtPkhEUEFUU1swXS0+bV9uSGVpZ2h0OworICBwU2VnbWVudC0+bV9uUmVzdWx0VHlwZSA9IEpCSUcyX0lNQUdFX1BPSU5URVI7CisgIGlmIChwSFJELT5ITU1SID09IDApIHsKKyAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IEdldEh1ZmZDb250ZXh0U2l6ZShwSFJELT5IVEVNUExBVEUpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxKQmlnMkFyaXRoQ3R4LCBGeEZyZWVEZWxldGVyPiBnYkNvbnRleHQoCisgICAgICAgIEZYX0FsbG9jKEpCaWcyQXJpdGhDdHgsIHNpemUpKTsKKyAgICBKQklHMl9tZW1zZXQoZ2JDb250ZXh0LmdldCgpLCAwLCBzaXplb2YoSkJpZzJBcml0aEN0eCkgKiBzaXplKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0FyaXRoRGVjb2Rlcj4gcEFyaXRoRGVjb2RlcigKKyAgICAgICAgbmV3IENKQmlnMl9Bcml0aERlY29kZXIobV9wU3RyZWFtLmdldCgpKSk7CisgICAgcFNlZ21lbnQtPm1fUmVzdWx0LmltID0KKyAgICAgICAgcEhSRC0+ZGVjb2RlX0FyaXRoKHBBcml0aERlY29kZXIuZ2V0KCksIGdiQ29udGV4dC5nZXQoKSwgcFBhdXNlKTsKKyAgICBpZiAoIXBTZWdtZW50LT5tX1Jlc3VsdC5pbSkKKyAgICAgIHJldHVybiBKQklHMl9FUlJPUl9GQVRBTDsKKworICAgIG1fcFN0cmVhbS0+YWxpZ25CeXRlKCk7CisgICAgbV9wU3RyZWFtLT5vZmZzZXQoMik7CisgIH0gZWxzZSB7CisgICAgcFNlZ21lbnQtPm1fUmVzdWx0LmltID0gcEhSRC0+ZGVjb2RlX01NUihtX3BTdHJlYW0uZ2V0KCksIHBQYXVzZSk7CisgICAgaWYgKCFwU2VnbWVudC0+bV9SZXN1bHQuaW0pCisgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7CisgICAgbV9wU3RyZWFtLT5hbGlnbkJ5dGUoKTsKKyAgfQorICBpZiAocFNlZ21lbnQtPm1fY0ZsYWdzLnMudHlwZSAhPSAyMCkgeworICAgIGlmICghbV9iQnVmU3BlY2lmaWVkKSB7CisgICAgICBKQmlnMlBhZ2VJbmZvKiBwUGFnZUluZm8gPSBtX1BhZ2VJbmZvTGlzdC5iYWNrKCk7CisgICAgICBpZiAocFBhZ2VJbmZvLT5tX2JJc1N0cmlwZWQgPT0gMSAmJgorICAgICAgICAgIHJpLnkgKyByaS5oZWlnaHQgPiBtX3BQYWdlLT5tX25IZWlnaHQpIHsKKyAgICAgICAgbV9wUGFnZS0+ZXhwYW5kKHJpLnkgKyByaS5oZWlnaHQsIChwUGFnZUluZm8tPm1fY0ZsYWdzICYgNCkgPyAxIDogMCk7CisgICAgICB9CisgICAgfQorICAgIG1fcFBhZ2UtPmNvbXBvc2VGcm9tKHJpLngsIHJpLnksIHBTZWdtZW50LT5tX1Jlc3VsdC5pbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoSkJpZzJDb21wb3NlT3ApKHJpLmZsYWdzICYgMHgwMykpOworICAgIGRlbGV0ZSBwU2VnbWVudC0+bV9SZXN1bHQuaW07CisgICAgcFNlZ21lbnQtPm1fUmVzdWx0LmltID0gTlVMTDsKKyAgfQorICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKK30KKworaW50MzJfdCBDSkJpZzJfQ29udGV4dDo6cGFyc2VHZW5lcmljUmVnaW9uKENKQmlnMl9TZWdtZW50KiBwU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpZiAoIW1fcEdSRCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfR1JEUHJvYz4gcEdSRChuZXcgQ0pCaWcyX0dSRFByb2MpOworICAgIHVpbnQ4X3QgY0ZsYWdzOworICAgIGlmIChwYXJzZVJlZ2lvbkluZm8oJm1fcmkpICE9IEpCSUcyX1NVQ0NFU1MgfHwKKyAgICAgICAgbV9wU3RyZWFtLT5yZWFkMUJ5dGUoJmNGbGFncykgIT0gMCkgeworICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKKyAgICB9CisgICAgaWYgKG1fcmkuaGVpZ2h0IDwgMCB8fCBtX3JpLndpZHRoIDwgMCkKKyAgICAgIHJldHVybiBKQklHMl9GQUlMRUQ7CisKKyAgICBwR1JELT5HQlcgPSBtX3JpLndpZHRoOworICAgIHBHUkQtPkdCSCA9IG1fcmkuaGVpZ2h0OworICAgIHBHUkQtPk1NUiA9IGNGbGFncyAmIDB4MDE7CisgICAgcEdSRC0+R0JURU1QTEFURSA9IChjRmxhZ3MgPj4gMSkgJiAweDAzOworICAgIHBHUkQtPlRQR0RPTiA9IChjRmxhZ3MgPj4gMykgJiAweDAxOworICAgIGlmIChwR1JELT5NTVIgPT0gMCkgeworICAgICAgaWYgKHBHUkQtPkdCVEVNUExBVEUgPT0gMCkgeworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA4OyArK2kpIHsKKyAgICAgICAgICBpZiAobV9wU3RyZWFtLT5yZWFkMUJ5dGUoKHVpbnQ4X3QqKSZwR1JELT5HQkFUW2ldKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfVE9PX1NIT1JUOworICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZihydW4gPiAwKSB7Ci0gICAgICAgICAgICBpZiAoaSArIHJ1biA+IChpbnQpU0JOVU1TWU1TKSB7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBydW47IGorKykgewotICAgICAgICAgICAgICAgIGlmKHJ1bmNvZGUgPT0gMzIgJiYgaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU0JTWU1DT0RFU1tpICsgal0uY29kZWxlbiA9IFNCU1lNQ09ERVNbaSAtIDFdLmNvZGVsZW47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU0JTWU1DT0RFU1tpICsgal0uY29kZWxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaSArPSBydW47CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgICAgICBpZiAobV9wU3RyZWFtLT5yZWFkMUJ5dGUoKHVpbnQ4X3QqKSZwR1JELT5HQkFUW2ldKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfVE9PX1NIT1JUOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBwR1JELT5VU0VTS0lQID0gMDsKKyAgICBtX3BHUkQgPSBzdGQ6Om1vdmUocEdSRCk7CisgIH0KKyAgcFNlZ21lbnQtPm1fblJlc3VsdFR5cGUgPSBKQklHMl9JTUFHRV9QT0lOVEVSOworICBpZiAobV9wR1JELT5NTVIgPT0gMCkgeworICAgIGlmICghbV9nYkNvbnRleHQpIHsKKyAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gR2V0SHVmZkNvbnRleHRTaXplKG1fcEdSRC0+R0JURU1QTEFURSk7CisgICAgICBtX2diQ29udGV4dCA9IEZYX0FsbG9jKEpCaWcyQXJpdGhDdHgsIHNpemUpOworICAgICAgSkJJRzJfbWVtc2V0KG1fZ2JDb250ZXh0LCAwLCBzaXplb2YoSkJpZzJBcml0aEN0eCkgKiBzaXplKTsKKyAgICB9CisgICAgaWYgKCFtX3BBcml0aERlY29kZXIpIHsKKyAgICAgIG1fcEFyaXRoRGVjb2Rlci5yZXNldChuZXcgQ0pCaWcyX0FyaXRoRGVjb2RlcihtX3BTdHJlYW0uZ2V0KCkpKTsKKyAgICAgIG1fUHJvY2Vzc2luZ1N0YXR1cyA9IG1fcEdSRC0+U3RhcnRfZGVjb2RlX0FyaXRoKAorICAgICAgICAgICZwU2VnbWVudC0+bV9SZXN1bHQuaW0sIG1fcEFyaXRoRGVjb2Rlci5nZXQoKSwgbV9nYkNvbnRleHQsIHBQYXVzZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fUHJvY2Vzc2luZ1N0YXR1cyA9IG1fcEdSRC0+Q29udGludWVfZGVjb2RlKHBQYXVzZSk7CisgICAgfQorICAgIGlmIChtX1Byb2Nlc3NpbmdTdGF0dXMgPT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRSkgeworICAgICAgaWYgKHBTZWdtZW50LT5tX2NGbGFncy5zLnR5cGUgIT0gMzYpIHsKKyAgICAgICAgaWYgKCFtX2JCdWZTcGVjaWZpZWQpIHsKKyAgICAgICAgICBKQmlnMlBhZ2VJbmZvKiBwUGFnZUluZm8gPSBtX1BhZ2VJbmZvTGlzdC5iYWNrKCk7CisgICAgICAgICAgaWYgKChwUGFnZUluZm8tPm1fYklzU3RyaXBlZCA9PSAxKSAmJgorICAgICAgICAgICAgICAobV9yaS55ICsgbV9yaS5oZWlnaHQgPiBtX3BQYWdlLT5tX25IZWlnaHQpKSB7CisgICAgICAgICAgICBtX3BQYWdlLT5leHBhbmQobV9yaS55ICsgbV9yaS5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBQYWdlSW5mby0+bV9jRmxhZ3MgJiA0KSA/IDEgOiAwKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRlhfUkVDVCBSZWN0ID0gbV9wR1JELT5HZXRSZXBsYWNlUmVjdCgpOworICAgICAgICBtX3BQYWdlLT5jb21wb3NlRnJvbShtX3JpLnggKyBSZWN0LmxlZnQsIG1fcmkueSArIFJlY3QudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnbWVudC0+bV9SZXN1bHQuaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChKQmlnMkNvbXBvc2VPcCkobV9yaS5mbGFncyAmIDB4MDMpLCAmUmVjdCk7CisgICAgICB9CisgICAgICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKKyAgICB9IGVsc2UgeworICAgICAgbV9wQXJpdGhEZWNvZGVyLnJlc2V0KCk7CisgICAgICBGWF9GcmVlKG1fZ2JDb250ZXh0KTsKKyAgICAgIG1fZ2JDb250ZXh0ID0gTlVMTDsKKyAgICAgIGlmICghcFNlZ21lbnQtPm1fUmVzdWx0LmltKSB7CisgICAgICAgIG1fUHJvY2Vzc2luZ1N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOworICAgICAgICBtX3BHUkQucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOworICAgICAgfQorICAgICAgbV9wU3RyZWFtLT5hbGlnbkJ5dGUoKTsKKyAgICAgIG1fcFN0cmVhbS0+b2Zmc2V0KDIpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBGWENPREVDX1NUQVRVUyBzdGF0dXMgPSBtX3BHUkQtPlN0YXJ0X2RlY29kZV9NTVIoJnBTZWdtZW50LT5tX1Jlc3VsdC5pbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RyZWFtLmdldCgpLCBwUGF1c2UpOworICAgIHdoaWxlIChzdGF0dXMgPT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRSkgeworICAgICAgbV9wR1JELT5Db250aW51ZV9kZWNvZGUocFBhdXNlKTsKKyAgICB9CisgICAgaWYgKCFwU2VnbWVudC0+bV9SZXN1bHQuaW0pIHsKKyAgICAgIG1fcEdSRC5yZXNldCgpOworICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOworICAgIH0KKyAgICBtX3BTdHJlYW0tPmFsaWduQnl0ZSgpOworICB9CisgIGlmIChwU2VnbWVudC0+bV9jRmxhZ3Mucy50eXBlICE9IDM2KSB7CisgICAgaWYgKCFtX2JCdWZTcGVjaWZpZWQpIHsKKyAgICAgIEpCaWcyUGFnZUluZm8qIHBQYWdlSW5mbyA9IG1fUGFnZUluZm9MaXN0LmJhY2soKTsKKyAgICAgIGlmICgocFBhZ2VJbmZvLT5tX2JJc1N0cmlwZWQgPT0gMSkgJiYKKyAgICAgICAgICAobV9yaS55ICsgbV9yaS5oZWlnaHQgPiBtX3BQYWdlLT5tX25IZWlnaHQpKSB7CisgICAgICAgIG1fcFBhZ2UtPmV4cGFuZChtX3JpLnkgKyBtX3JpLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChwUGFnZUluZm8tPm1fY0ZsYWdzICYgNCkgPyAxIDogMCk7CisgICAgICB9CisgICAgfQorICAgIEZYX1JFQ1QgUmVjdCA9IG1fcEdSRC0+R2V0UmVwbGFjZVJlY3QoKTsKKyAgICBtX3BQYWdlLT5jb21wb3NlRnJvbShtX3JpLnggKyBSZWN0LmxlZnQsIG1fcmkueSArIFJlY3QudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5pbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoSkJpZzJDb21wb3NlT3ApKG1fcmkuZmxhZ3MgJiAweDAzKSwgJlJlY3QpOworICAgIGRlbGV0ZSBwU2VnbWVudC0+bV9SZXN1bHQuaW07CisgICAgcFNlZ21lbnQtPm1fUmVzdWx0LmltID0gTlVMTDsKKyAgfQorICBtX3BHUkQucmVzZXQoKTsKKyAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7Cit9CisKK2ludDMyX3QgQ0pCaWcyX0NvbnRleHQ6OnBhcnNlR2VuZXJpY1JlZmluZW1lbnRSZWdpb24oQ0pCaWcyX1NlZ21lbnQqIHBTZWdtZW50KSB7CisgIEpCaWcyUmVnaW9uSW5mbyByaTsKKyAgdWludDhfdCBjRmxhZ3M7CisgIGlmIChwYXJzZVJlZ2lvbkluZm8oJnJpKSAhPSBKQklHMl9TVUNDRVNTIHx8CisgICAgICBtX3BTdHJlYW0tPnJlYWQxQnl0ZSgmY0ZsYWdzKSAhPSAwKSB7CisgICAgcmV0dXJuIEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKKyAgfQorICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0dSUkRQcm9jPiBwR1JSRChuZXcgQ0pCaWcyX0dSUkRQcm9jKTsKKyAgcEdSUkQtPkdSVyA9IHJpLndpZHRoOworICBwR1JSRC0+R1JIID0gcmkuaGVpZ2h0OworICBwR1JSRC0+R1JURU1QTEFURSA9IGNGbGFncyAmIDB4MDE7CisgIHBHUlJELT5UUEdST04gPSAoY0ZsYWdzID4+IDEpICYgMHgwMTsKKyAgaWYgKHBHUlJELT5HUlRFTVBMQVRFID09IDApIHsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgIGlmIChtX3BTdHJlYW0tPnJlYWQxQnl0ZSgodWludDhfdCopJnBHUlJELT5HUkFUW2ldKSAhPSAwKQorICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfVE9PX1NIT1JUOworICAgIH0KKyAgfQorICBDSkJpZzJfU2VnbWVudCogcFNlZyA9IG51bGxwdHI7CisgIGlmIChwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudCA+IDApIHsKKyAgICBpbnQzMl90IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50OyArK2kpIHsKKyAgICAgIHBTZWcgPSBmaW5kU2VnbWVudEJ5TnVtYmVyKHBTZWdtZW50LT5tX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnNbMF0pOworICAgICAgaWYgKCFwU2VnKQorICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7CisKKyAgICAgIGlmIChwU2VnLT5tX2NGbGFncy5zLnR5cGUgPT0gNCB8fCBwU2VnLT5tX2NGbGFncy5zLnR5cGUgPT0gMjAgfHwKKyAgICAgICAgICBwU2VnLT5tX2NGbGFncy5zLnR5cGUgPT0gMzYgfHwgcFNlZy0+bV9jRmxhZ3Mucy50eXBlID09IDQwKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaSA+PSBwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudCkKKyAgICAgIHJldHVybiBKQklHMl9FUlJPUl9GQVRBTDsKKworICAgIHBHUlJELT5HUlJFRkVSRU5DRSA9IHBTZWctPm1fUmVzdWx0LmltOworICB9IGVsc2UgeworICAgIHBHUlJELT5HUlJFRkVSRU5DRSA9IG1fcFBhZ2UuZ2V0KCk7CisgIH0KKyAgcEdSUkQtPkdSUkVGRVJFTkNFRFggPSAwOworICBwR1JSRC0+R1JSRUZFUkVOQ0VEWSA9IDA7CisgIGNvbnN0IHNpemVfdCBzaXplID0gR2V0UmVmQWdnQ29udGV4dFNpemUocEdSUkQtPkdSVEVNUExBVEUpOworICBzdGQ6OnVuaXF1ZV9wdHI8SkJpZzJBcml0aEN0eCwgRnhGcmVlRGVsZXRlcj4gZ3JDb250ZXh0KAorICAgICAgRlhfQWxsb2MoSkJpZzJBcml0aEN0eCwgc2l6ZSkpOworICBKQklHMl9tZW1zZXQoZ3JDb250ZXh0LmdldCgpLCAwLCBzaXplb2YoSkJpZzJBcml0aEN0eCkgKiBzaXplKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Bcml0aERlY29kZXI+IHBBcml0aERlY29kZXIoCisgICAgICBuZXcgQ0pCaWcyX0FyaXRoRGVjb2RlcihtX3BTdHJlYW0uZ2V0KCkpKTsKKyAgcFNlZ21lbnQtPm1fblJlc3VsdFR5cGUgPSBKQklHMl9JTUFHRV9QT0lOVEVSOworICBwU2VnbWVudC0+bV9SZXN1bHQuaW0gPSBwR1JSRC0+ZGVjb2RlKHBBcml0aERlY29kZXIuZ2V0KCksIGdyQ29udGV4dC5nZXQoKSk7CisgIGlmICghcFNlZ21lbnQtPm1fUmVzdWx0LmltKQorICAgIHJldHVybiBKQklHMl9FUlJPUl9GQVRBTDsKKworICBtX3BTdHJlYW0tPmFsaWduQnl0ZSgpOworICBtX3BTdHJlYW0tPm9mZnNldCgyKTsKKyAgaWYgKHBTZWdtZW50LT5tX2NGbGFncy5zLnR5cGUgIT0gNDApIHsKKyAgICBpZiAoIW1fYkJ1ZlNwZWNpZmllZCkgeworICAgICAgSkJpZzJQYWdlSW5mbyogcFBhZ2VJbmZvID0gbV9QYWdlSW5mb0xpc3QuYmFjaygpOworICAgICAgaWYgKChwUGFnZUluZm8tPm1fYklzU3RyaXBlZCA9PSAxKSAmJgorICAgICAgICAgIChyaS55ICsgcmkuaGVpZ2h0ID4gbV9wUGFnZS0+bV9uSGVpZ2h0KSkgeworICAgICAgICBtX3BQYWdlLT5leHBhbmQocmkueSArIHJpLmhlaWdodCwgKHBQYWdlSW5mby0+bV9jRmxhZ3MgJiA0KSA/IDEgOiAwKTsKKyAgICAgIH0KKyAgICB9CisgICAgbV9wUGFnZS0+Y29tcG9zZUZyb20ocmkueCwgcmkueSwgcFNlZ21lbnQtPm1fUmVzdWx0LmltLAorICAgICAgICAgICAgICAgICAgICAgICAgIChKQmlnMkNvbXBvc2VPcCkocmkuZmxhZ3MgJiAweDAzKSk7CisgICAgZGVsZXRlIHBTZWdtZW50LT5tX1Jlc3VsdC5pbTsKKyAgICBwU2VnbWVudC0+bV9SZXN1bHQuaW0gPSBOVUxMOworICB9CisgIHJldHVybiBKQklHMl9TVUNDRVNTOworfQorCitpbnQzMl90IENKQmlnMl9Db250ZXh0OjpwYXJzZVRhYmxlKENKQmlnMl9TZWdtZW50KiBwU2VnbWVudCkgeworICBwU2VnbWVudC0+bV9uUmVzdWx0VHlwZSA9IEpCSUcyX0hVRkZNQU5fVEFCTEVfUE9JTlRFUjsKKyAgcFNlZ21lbnQtPm1fUmVzdWx0Lmh0ID0gbnVsbHB0cjsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9IdWZmbWFuVGFibGU+IHBIdWZmKAorICAgICAgbmV3IENKQmlnMl9IdWZmbWFuVGFibGUobV9wU3RyZWFtLmdldCgpKSk7CisgIGlmICghcEh1ZmYtPklzT0soKSkKKyAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7CisKKyAgcFNlZ21lbnQtPm1fUmVzdWx0Lmh0ID0gcEh1ZmYucmVsZWFzZSgpOworICBtX3BTdHJlYW0tPmFsaWduQnl0ZSgpOworICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKK30KKworaW50MzJfdCBDSkJpZzJfQ29udGV4dDo6cGFyc2VSZWdpb25JbmZvKEpCaWcyUmVnaW9uSW5mbyogcFJJKSB7CisgIGlmIChtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKChGWF9EV09SRCopJnBSSS0+d2lkdGgpICE9IDAgfHwKKyAgICAgIG1fcFN0cmVhbS0+cmVhZEludGVnZXIoKEZYX0RXT1JEKikmcFJJLT5oZWlnaHQpICE9IDAgfHwKKyAgICAgIG1fcFN0cmVhbS0+cmVhZEludGVnZXIoKEZYX0RXT1JEKikmcFJJLT54KSAhPSAwIHx8CisgICAgICBtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKChGWF9EV09SRCopJnBSSS0+eSkgIT0gMCB8fAorICAgICAgbV9wU3RyZWFtLT5yZWFkMUJ5dGUoJnBSSS0+ZmxhZ3MpICE9IDApIHsKKyAgICByZXR1cm4gSkJJRzJfRVJST1JfVE9PX1NIT1JUOworICB9CisgIHJldHVybiBKQklHMl9TVUNDRVNTOworfQorCitKQmlnMkh1ZmZtYW5Db2RlKiBDSkJpZzJfQ29udGV4dDo6ZGVjb2RlU3ltYm9sSURIdWZmbWFuVGFibGUoCisgICAgQ0pCaWcyX0JpdFN0cmVhbSogcFN0cmVhbSwKKyAgICBGWF9EV09SRCBTQk5VTVNZTVMpIHsKKyAgY29uc3Qgc2l6ZV90IGtSdW5Db2Rlc1NpemUgPSAzNTsKKyAgaW50MzJfdCBydW5jb2Rlc1trUnVuQ29kZXNTaXplXTsKKyAgaW50MzJfdCBydW5jb2Rlc19sZW5ba1J1bkNvZGVzU2l6ZV07CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtSdW5Db2Rlc1NpemU7ICsraSkgeworICAgIGlmIChwU3RyZWFtLT5yZWFkTkJpdHMoNCwgJnJ1bmNvZGVzX2xlbltpXSkgIT0gMCkKKyAgICAgIHJldHVybiBudWxscHRyOworICB9CisgIGh1ZmZtYW5fYXNzaWduX2NvZGUocnVuY29kZXMsIHJ1bmNvZGVzX2xlbiwga1J1bkNvZGVzU2l6ZSk7CisKKyAgc3RkOjp1bmlxdWVfcHRyPEpCaWcySHVmZm1hbkNvZGUsIEZ4RnJlZURlbGV0ZXI+IFNCU1lNQ09ERVMoCisgICAgICBGWF9BbGxvYyhKQmlnMkh1ZmZtYW5Db2RlLCBTQk5VTVNZTVMpKTsKKyAgaW50MzJfdCBydW47CisgIGludDMyX3QgaSA9IDA7CisgIHdoaWxlIChpIDwgKGludClTQk5VTVNZTVMpIHsKKyAgICBpbnQzMl90IGo7CisgICAgaW50MzJfdCBuVmFsID0gMDsKKyAgICBpbnQzMl90IG5CaXRzID0gMDsKKyAgICBGWF9EV09SRCBuVGVtcDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKHBTdHJlYW0tPnJlYWQxQml0KCZuVGVtcCkgIT0gMCkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgIG5WYWwgPSAoblZhbCA8PCAxKSB8IG5UZW1wOworICAgICAgKytuQml0czsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBrUnVuQ29kZXNTaXplOyArK2opIHsKKyAgICAgICAgaWYgKG5CaXRzID09IHJ1bmNvZGVzX2xlbltqXSAmJiBuVmFsID09IHJ1bmNvZGVzW2pdKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChqIDwga1J1bkNvZGVzU2l6ZSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaW50MzJfdCBydW5jb2RlID0gajsKKyAgICBpZiAocnVuY29kZSA8IDMyKSB7CisgICAgICBTQlNZTUNPREVTLmdldCgpW2ldLmNvZGVsZW4gPSBydW5jb2RlOworICAgICAgcnVuID0gMDsKKyAgICB9IGVsc2UgaWYgKHJ1bmNvZGUgPT0gMzIpIHsKKyAgICAgIGlmIChwU3RyZWFtLT5yZWFkTkJpdHMoMiwgJm5UZW1wKSAhPSAwKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIHJ1biA9IG5UZW1wICsgMzsKKyAgICB9IGVsc2UgaWYgKHJ1bmNvZGUgPT0gMzMpIHsKKyAgICAgIGlmIChwU3RyZWFtLT5yZWFkTkJpdHMoMywgJm5UZW1wKSAhPSAwKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIHJ1biA9IG5UZW1wICsgMzsKKyAgICB9IGVsc2UgaWYgKHJ1bmNvZGUgPT0gMzQpIHsKKyAgICAgIGlmIChwU3RyZWFtLT5yZWFkTkJpdHMoNywgJm5UZW1wKSAhPSAwKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIHJ1biA9IG5UZW1wICsgMTE7CisgICAgfQorICAgIGlmIChydW4gPiAwKSB7CisgICAgICBpZiAoaSArIHJ1biA+IChpbnQpU0JOVU1TWU1TKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBydW47ICsraikgeworICAgICAgICBpZiAocnVuY29kZSA9PSAzMiAmJiBpID4gMCkgeworICAgICAgICAgIFNCU1lNQ09ERVMuZ2V0KClbaSArIGpdLmNvZGVsZW4gPSBTQlNZTUNPREVTLmdldCgpW2kgLSAxXS5jb2RlbGVuOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaSArKzsKKyAgICAgICAgICBTQlNZTUNPREVTLmdldCgpW2kgKyBqXS5jb2RlbGVuID0gMDsKICAgICAgICAgfQorICAgICAgfQorICAgICAgaSArPSBydW47CisgICAgfSBlbHNlIHsKKyAgICAgICsraTsKICAgICB9Ci0gICAgaHVmZm1hbl9hc3NpZ25fY29kZShTQlNZTUNPREVTLCBTQk5VTVNZTVMpOwotICAgIHJldHVybiBTQlNZTUNPREVTOwotZmFpbGVkOgotICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTQlNZTUNPREVTKTsKLSAgICByZXR1cm4gTlVMTDsKKyAgfQorICBodWZmbWFuX2Fzc2lnbl9jb2RlKFNCU1lNQ09ERVMuZ2V0KCksIFNCTlVNU1lNUyk7CisgIHJldHVybiBTQlNZTUNPREVTLnJlbGVhc2UoKTsKIH0KLXZvaWQgQ0pCaWcyX0NvbnRleHQ6Omh1ZmZtYW5fYXNzaWduX2NvZGUoaW50KiBDT0RFUywgaW50KiBQUkVGTEVOLCBpbnQgTlRFTVApCi17Ci0gICAgaW50IENVUkxFTiwgTEVOTUFYLCBDVVJDT0RFLCBDVVJURU1QLCBpOwotICAgIGludCAqTEVOQ09VTlQ7Ci0gICAgaW50ICpGSVJTVENPREU7Ci0gICAgTEVOTUFYID0gMDsKLSAgICBmb3IoaSA9IDA7IGkgPCBOVEVNUDsgaSsrKSB7Ci0gICAgICAgIGlmKFBSRUZMRU5baV0gPiBMRU5NQVgpIHsKLSAgICAgICAgICAgIExFTk1BWCA9IFBSRUZMRU5baV07Ci0gICAgICAgIH0KKwordm9pZCBDSkJpZzJfQ29udGV4dDo6aHVmZm1hbl9hc3NpZ25fY29kZShpbnQqIENPREVTLCBpbnQqIFBSRUZMRU4sIGludCBOVEVNUCkgeworICAvLyBUT0RPKHRoZXN0aWcpIENKQmlnMl9IdWZmbWFuVGFibGU6OnBhcnNlRnJvbUNvZGVkQnVmZmVyKCkgaGFzIHNpbWlsYXIgY29kZS4KKyAgaW50IENVUkxFTiwgTEVOTUFYLCBDVVJDT0RFLCBDVVJURU1QLCBpOworICBpbnQqIExFTkNPVU5UOworICBpbnQqIEZJUlNUQ09ERTsKKyAgTEVOTUFYID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IE5URU1QOyArK2kpIHsKKyAgICBpZiAoUFJFRkxFTltpXSA+IExFTk1BWCkgeworICAgICAgTEVOTUFYID0gUFJFRkxFTltpXTsKICAgICB9Ci0gICAgTEVOQ09VTlQgPSAoaW50KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKGludCksIChMRU5NQVggKyAxKSk7Ci0gICAgSkJJRzJfbWVtc2V0KExFTkNPVU5ULCAwLCBzaXplb2YoaW50KSAqIChMRU5NQVggKyAxKSk7Ci0gICAgRklSU1RDT0RFID0gKGludCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihpbnQpLCAoTEVOTUFYICsgMSkpOwotICAgIGZvcihpID0gMDsgaSA8IE5URU1QOyBpKyspIHsKLSAgICAgICAgTEVOQ09VTlRbUFJFRkxFTltpXV0gKys7CisgIH0KKyAgTEVOQ09VTlQgPSBGWF9BbGxvYyhpbnQsIExFTk1BWCArIDEpOworICBKQklHMl9tZW1zZXQoTEVOQ09VTlQsIDAsIHNpemVvZihpbnQpICogKExFTk1BWCArIDEpKTsKKyAgRklSU1RDT0RFID0gRlhfQWxsb2MoaW50LCBMRU5NQVggKyAxKTsKKyAgZm9yIChpID0gMDsgaSA8IE5URU1QOyArK2kpIHsKKyAgICArK0xFTkNPVU5UW1BSRUZMRU5baV1dOworICB9CisgIENVUkxFTiA9IDE7CisgIEZJUlNUQ09ERVswXSA9IDA7CisgIExFTkNPVU5UWzBdID0gMDsKKyAgd2hpbGUgKENVUkxFTiA8PSBMRU5NQVgpIHsKKyAgICBGSVJTVENPREVbQ1VSTEVOXSA9IChGSVJTVENPREVbQ1VSTEVOIC0gMV0gKyBMRU5DT1VOVFtDVVJMRU4gLSAxXSkgPDwgMTsKKyAgICBDVVJDT0RFID0gRklSU1RDT0RFW0NVUkxFTl07CisgICAgQ1VSVEVNUCA9IDA7CisgICAgd2hpbGUgKENVUlRFTVAgPCBOVEVNUCkgeworICAgICAgaWYgKFBSRUZMRU5bQ1VSVEVNUF0gPT0gQ1VSTEVOKSB7CisgICAgICAgIENPREVTW0NVUlRFTVBdID0gQ1VSQ09ERTsKKyAgICAgICAgQ1VSQ09ERSA9IENVUkNPREUgKyAxOworICAgICAgfQorICAgICAgQ1VSVEVNUCA9IENVUlRFTVAgKyAxOwogICAgIH0KLSAgICBDVVJMRU4gPSAxOwotICAgIEZJUlNUQ09ERVswXSA9IDA7Ci0gICAgTEVOQ09VTlRbMF0gID0gMDsKLSAgICB3aGlsZShDVVJMRU4gPD0gTEVOTUFYKSB7Ci0gICAgICAgIEZJUlNUQ09ERVtDVVJMRU5dID0gKEZJUlNUQ09ERVtDVVJMRU4gLSAxXSArIExFTkNPVU5UW0NVUkxFTiAtIDFdKSA8PCAxOwotICAgICAgICBDVVJDT0RFID0gRklSU1RDT0RFW0NVUkxFTl07Ci0gICAgICAgIENVUlRFTVAgPSAwOwotICAgICAgICB3aGlsZShDVVJURU1QIDwgTlRFTVApIHsKLSAgICAgICAgICAgIGlmKFBSRUZMRU5bQ1VSVEVNUF0gPT0gQ1VSTEVOKSB7Ci0gICAgICAgICAgICAgICAgQ09ERVNbQ1VSVEVNUF0gPSBDVVJDT0RFOwotICAgICAgICAgICAgICAgIENVUkNPREUgPSBDVVJDT0RFICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENVUlRFTVAgPSBDVVJURU1QICsgMTsKLSAgICAgICAgfQotICAgICAgICBDVVJMRU4gPSBDVVJMRU4gKyAxOwotICAgIH0KLSAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoTEVOQ09VTlQpOwotICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShGSVJTVENPREUpOworICAgIENVUkxFTiA9IENVUkxFTiArIDE7CisgIH0KKyAgRlhfRnJlZShMRU5DT1VOVCk7CisgIEZYX0ZyZWUoRklSU1RDT0RFKTsKIH0KLXZvaWQgQ0pCaWcyX0NvbnRleHQ6Omh1ZmZtYW5fYXNzaWduX2NvZGUoSkJpZzJIdWZmbWFuQ29kZSAqU0JTWU1DT0RFUywgaW50IE5URU1QKQotewotICAgIGludCBDVVJMRU4sIExFTk1BWCwgQ1VSQ09ERSwgQ1VSVEVNUCwgaTsKLSAgICBpbnQgKkxFTkNPVU5UOwotICAgIGludCAqRklSU1RDT0RFOwotICAgIExFTk1BWCA9IDA7Ci0gICAgZm9yKGkgPSAwOyBpIDwgTlRFTVA7IGkrKykgewotICAgICAgICBpZihTQlNZTUNPREVTW2ldLmNvZGVsZW4gPiBMRU5NQVgpIHsKLSAgICAgICAgICAgIExFTk1BWCA9IFNCU1lNQ09ERVNbaV0uY29kZWxlbjsKLSAgICAgICAgfQordm9pZCBDSkJpZzJfQ29udGV4dDo6aHVmZm1hbl9hc3NpZ25fY29kZShKQmlnMkh1ZmZtYW5Db2RlKiBTQlNZTUNPREVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTlRFTVApIHsKKyAgaW50IENVUkxFTiwgTEVOTUFYLCBDVVJDT0RFLCBDVVJURU1QLCBpOworICBpbnQqIExFTkNPVU5UOworICBpbnQqIEZJUlNUQ09ERTsKKyAgTEVOTUFYID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IE5URU1QOyArK2kpIHsKKyAgICBpZiAoU0JTWU1DT0RFU1tpXS5jb2RlbGVuID4gTEVOTUFYKSB7CisgICAgICBMRU5NQVggPSBTQlNZTUNPREVTW2ldLmNvZGVsZW47CiAgICAgfQotICAgIExFTkNPVU5UID0gKGludCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihpbnQpLCAoTEVOTUFYICsgMSkpOwotICAgIEpCSUcyX21lbXNldChMRU5DT1VOVCwgMCwgc2l6ZW9mKGludCkgKiAoTEVOTUFYICsgMSkpOwotICAgIEZJUlNUQ09ERSA9IChpbnQqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoaW50KSwgKExFTk1BWCArIDEpKTsKLSAgICBmb3IoaSA9IDA7IGkgPCBOVEVNUDsgaSsrKSB7Ci0gICAgICAgIExFTkNPVU5UW1NCU1lNQ09ERVNbaV0uY29kZWxlbl0gKys7CisgIH0KKyAgTEVOQ09VTlQgPSBGWF9BbGxvYyhpbnQsIChMRU5NQVggKyAxKSk7CisgIEpCSUcyX21lbXNldChMRU5DT1VOVCwgMCwgc2l6ZW9mKGludCkgKiAoTEVOTUFYICsgMSkpOworICBGSVJTVENPREUgPSBGWF9BbGxvYyhpbnQsIChMRU5NQVggKyAxKSk7CisgIGZvciAoaSA9IDA7IGkgPCBOVEVNUDsgKytpKSB7CisgICAgKytMRU5DT1VOVFtTQlNZTUNPREVTW2ldLmNvZGVsZW5dOworICB9CisgIENVUkxFTiA9IDE7CisgIEZJUlNUQ09ERVswXSA9IDA7CisgIExFTkNPVU5UWzBdID0gMDsKKyAgd2hpbGUgKENVUkxFTiA8PSBMRU5NQVgpIHsKKyAgICBGSVJTVENPREVbQ1VSTEVOXSA9IChGSVJTVENPREVbQ1VSTEVOIC0gMV0gKyBMRU5DT1VOVFtDVVJMRU4gLSAxXSkgPDwgMTsKKyAgICBDVVJDT0RFID0gRklSU1RDT0RFW0NVUkxFTl07CisgICAgQ1VSVEVNUCA9IDA7CisgICAgd2hpbGUgKENVUlRFTVAgPCBOVEVNUCkgeworICAgICAgaWYgKFNCU1lNQ09ERVNbQ1VSVEVNUF0uY29kZWxlbiA9PSBDVVJMRU4pIHsKKyAgICAgICAgU0JTWU1DT0RFU1tDVVJURU1QXS5jb2RlID0gQ1VSQ09ERTsKKyAgICAgICAgQ1VSQ09ERSA9IENVUkNPREUgKyAxOworICAgICAgfQorICAgICAgQ1VSVEVNUCA9IENVUlRFTVAgKyAxOwogICAgIH0KLSAgICBDVVJMRU4gPSAxOwotICAgIEZJUlNUQ09ERVswXSA9IDA7Ci0gICAgTEVOQ09VTlRbMF0gID0gMDsKLSAgICB3aGlsZShDVVJMRU4gPD0gTEVOTUFYKSB7Ci0gICAgICAgIEZJUlNUQ09ERVtDVVJMRU5dID0gKEZJUlNUQ09ERVtDVVJMRU4gLSAxXSArIExFTkNPVU5UW0NVUkxFTiAtIDFdKSA8PCAxOwotICAgICAgICBDVVJDT0RFID0gRklSU1RDT0RFW0NVUkxFTl07Ci0gICAgICAgIENVUlRFTVAgPSAwOwotICAgICAgICB3aGlsZShDVVJURU1QIDwgTlRFTVApIHsKLSAgICAgICAgICAgIGlmKFNCU1lNQ09ERVNbQ1VSVEVNUF0uY29kZWxlbiA9PSBDVVJMRU4pIHsKLSAgICAgICAgICAgICAgICBTQlNZTUNPREVTW0NVUlRFTVBdLmNvZGUgPSBDVVJDT0RFOwotICAgICAgICAgICAgICAgIENVUkNPREUgPSBDVVJDT0RFICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENVUlRFTVAgPSBDVVJURU1QICsgMTsKLSAgICAgICAgfQotICAgICAgICBDVVJMRU4gPSBDVVJMRU4gKyAxOwotICAgIH0KLSAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoTEVOQ09VTlQpOwotICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShGSVJTVENPREUpOworICAgIENVUkxFTiA9IENVUkxFTiArIDE7CisgIH0KKyAgRlhfRnJlZShMRU5DT1VOVCk7CisgIEZYX0ZyZWUoRklSU1RDT0RFKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQ29udGV4dC5oIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmgKaW5kZXggZjQ2NTMwZS4uZGQ2M2JjZCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmgKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmgKQEAgLTEsMTM4ICsxLDEzMyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaWZuZGVmIF9KQklHMl9DT05URVhUX0hfCi0jZGVmaW5lIF9KQklHMl9DT05URVhUX0hfCi0jaW5jbHVkZSAiSkJpZzJfTW9kdWxlLmgiCi0jaW5jbHVkZSAiSkJpZzJfTGlzdC5oIgotI2luY2x1ZGUgIkpCaWcyX1NlZ21lbnQuaCIKLSNpbmNsdWRlICJKQmlnMl9QYWdlLmgiCi0jaW5jbHVkZSAiSkJpZzJfR2VuZXJhbERlY29kZXIuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWNfZGVmLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgorI2lmbmRlZiBDT1JFX1NSQ19GWENPREVDX0pCSUcyX0pCSUcyX0NPTlRFWFRfSF8KKyNkZWZpbmUgQ09SRV9TUkNfRlhDT0RFQ19KQklHMl9KQklHMl9DT05URVhUX0hfCisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx1dGlsaXR5PgotdHlwZWRlZiBzdGQ6OnBhaXI8RlhfQllURSosIENKQmlnMl9TeW1ib2xEaWN0Kj4gQ0pCaWcyX0NhY2hlUGFpcjsKLXR5cGVkZWYgZW51bSB7Ci0gICAgSkJJRzJfT1VUX09GX1BBR0UgPSAwLAotICAgIEpCSUcyX0lOX1BBR0UsCi19IEpCaWcyU3RhdGU7Ci0jZGVmaW5lIEpCSUcyX1NVQ0NFU1MJCQkgMAotI2RlZmluZSBKQklHMl9GQUlMRUQJCQktMQotI2RlZmluZSBKQklHMl9FUlJPUl9UT09fU0hPUlQJLTIKLSNkZWZpbmUgSkJJRzJfRVJST1JfRkVUQUwJCS0zCi0jZGVmaW5lIEpCSUcyX0VORF9PRl9QQUdFCQkgMgotI2RlZmluZSBKQklHMl9FTkRfT0ZfRklMRQkJIDMKKworI2luY2x1ZGUgIkpCaWcyX0xpc3QuaCIKKyNpbmNsdWRlICJKQmlnMl9QYWdlLmgiCisjaW5jbHVkZSAiSkJpZzJfU2VnbWVudC5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfb2JqZWN0cy5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjX2RlZi5oIgorCitjbGFzcyBDSkJpZzJfQXJpdGhEZWNvZGVyOworY2xhc3MgQ0pCaWcyX0dSRFByb2M7CitjbGFzcyBJRlhfUGF1c2U7CisKKy8vIENhY2hlIGlzIGtleWVkIGJ5IHRoZSBPYmpOdW0gb2YgYSBzdHJlYW0gYW5kIGFuIGluZGV4IHdpdGhpbiB0aGUgc3RyZWFtLgordXNpbmcgQ0pCaWcyX0NhY2hlS2V5ID0gc3RkOjpwYWlyPEZYX0RXT1JELCBGWF9EV09SRD47CisvLyBOQjogQ0pCaWcyX1N5bWJvbERpY3QqIGlzIG93bmVkLgordXNpbmcgQ0pCaWcyX0NhY2hlUGFpciA9IHN0ZDo6cGFpcjxDSkJpZzJfQ2FjaGVLZXksIENKQmlnMl9TeW1ib2xEaWN0Kj47CisKKyNkZWZpbmUgSkJJRzJfU1VDQ0VTUyAwCisjZGVmaW5lIEpCSUcyX0ZBSUxFRCAtMQorI2RlZmluZSBKQklHMl9FUlJPUl9UT09fU0hPUlQgLTIKKyNkZWZpbmUgSkJJRzJfRVJST1JfRkFUQUwgLTMKKyNkZWZpbmUgSkJJRzJfRU5EX09GX1BBR0UgMgorI2RlZmluZSBKQklHMl9FTkRfT0ZfRklMRSAzCiAjZGVmaW5lIEpCSUcyX0VSUk9SX0ZJTEVfRk9STUFUIC00CiAjZGVmaW5lIEpCSUcyX0VSUk9SX1NUUkVBTV9UWVBFIC01Ci0jZGVmaW5lIEpCSUcyX0VSUk9SX0xJTUlUCQktNgotI2RlZmluZSBKQklHMl9GSUxFX1NUUkVBTQkJCTAKLSNkZWZpbmUgSkJJRzJfU1FVRU5USUFMX1NUUkVBTQkJMQotI2RlZmluZSBKQklHMl9SQU5ET01fU1RSRUFNCQkJMgotI2RlZmluZSBKQklHMl9FTUJFRF9TVFJFQU0JCQkzCi0jZGVmaW5lIEpCSUcyX01JTl9TRUdNRU5UX1NJWkUJCQkJCTExCi1jbGFzcyBDSkJpZzJfQ29udGV4dCA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0Ci17Ci1wdWJsaWM6CisjZGVmaW5lIEpCSUcyX0VSUk9SX0xJTUlUIC02CisjZGVmaW5lIEpCSUcyX01JTl9TRUdNRU5UX1NJWkUgMTEKIAotICAgIHN0YXRpYyBDSkJpZzJfQ29udGV4dCAqQ3JlYXRlQ29udGV4dChDSkJpZzJfTW9kdWxlICpwTW9kdWxlLCBGWF9CWVRFICpwR2xvYmFsRGF0YSwgRlhfRFdPUkQgZHdHbG9iYWxMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgKnBEYXRhLCBGWF9EV09SRCBkd0xlbmd0aCwgRlhfSU5UMzIgblN0cmVhbVR5cGUsIHN0ZDo6bGlzdDxDSkJpZzJfQ2FjaGVQYWlyPiogcFN5bWJvbERpY3RDYWNoZSwgSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKTsKK2NsYXNzIENKQmlnMl9Db250ZXh0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBDSkJpZzJfQ29udGV4dCogQ3JlYXRlQ29udGV4dCgKKyAgICAgIENQREZfU3RyZWFtQWNjKiBwR2xvYmFsU3RyZWFtLAorICAgICAgQ1BERl9TdHJlYW1BY2MqIHBTcmNTdHJlYW0sCisgICAgICBzdGQ6Omxpc3Q8Q0pCaWcyX0NhY2hlUGFpcj4qIHBTeW1ib2xEaWN0Q2FjaGUsCisgICAgICBJRlhfUGF1c2UqIHBQYXVzZSA9IE5VTEwpOwogCi0gICAgc3RhdGljIHZvaWQgRGVzdHJveUNvbnRleHQoQ0pCaWcyX0NvbnRleHQgKnBDb250ZXh0KTsKKyAgc3RhdGljIHZvaWQgRGVzdHJveUNvbnRleHQoQ0pCaWcyX0NvbnRleHQqIHBDb250ZXh0KTsKIAotICAgIEZYX0lOVDMyIGdldEZpcnN0UGFnZShGWF9CWVRFICpwQnVmLCBGWF9JTlQzMiB3aWR0aCwgRlhfSU5UMzIgaGVpZ2h0LCBGWF9JTlQzMiBzdHJpZGUsIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgaW50MzJfdCBnZXRGaXJzdFBhZ2UodWludDhfdCogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7CiAKLSAgICBGWF9JTlQzMiBnZXROZXh0UGFnZShGWF9CWVRFICpwQnVmLCBGWF9JTlQzMiB3aWR0aCwgRlhfSU5UMzIgaGVpZ2h0LCBGWF9JTlQzMiBzdHJpZGUsIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgaW50MzJfdCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CisgIEZYQ09ERUNfU1RBVFVTIEdldFByb2Nlc3NpbmdTdGF0dXMoKSB7IHJldHVybiBtX1Byb2Nlc3NpbmdTdGF0dXM7IH0KIAotICAgIEZYX0lOVDMyIGdldEZpcnN0UGFnZShDSkJpZzJfSW1hZ2UgKippbWFnZSwgSUZYX1BhdXNlKiBwUGF1c2UpOworIHByaXZhdGU6CisgIENKQmlnMl9Db250ZXh0KENQREZfU3RyZWFtQWNjKiBwR2xvYmFsU3RyZWFtLAorICAgICAgICAgICAgICAgICBDUERGX1N0cmVhbUFjYyogcFNyY1N0cmVhbSwKKyAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PENKQmlnMl9DYWNoZVBhaXI+KiBwU3ltYm9sRGljdENhY2hlLAorICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSwKKyAgICAgICAgICAgICAgICAgYm9vbCBiSXNHbG9iYWwpOwogCi0gICAgRlhfSU5UMzIgZ2V0TmV4dFBhZ2UoQ0pCaWcyX0ltYWdlICoqaW1hZ2UsIElGWF9QYXVzZSogcFBhdXNlKTsKLSAgICBGWF9JTlQzMiBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gICAgRlhDT0RFQ19TVEFUVVMgR2V0UHJvY2Vzc2l2ZVN0YXR1cygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9Qcm9jZXNzaXZlU3RhdHVzOwotICAgIH07Ci1wcml2YXRlOgorICB+Q0pCaWcyX0NvbnRleHQoKTsKIAotICAgIENKQmlnMl9Db250ZXh0KEZYX0JZVEUgKnBHbG9iYWxEYXRhLCBGWF9EV09SRCBkd0dsb2JhbExlbmd0aCwKLSAgICAgICAgICAgICAgICAgICBGWF9CWVRFICpwRGF0YSwgRlhfRFdPUkQgZHdMZW5ndGgsIEZYX0lOVDMyIG5TdHJlYW1UeXBlLCBzdGQ6Omxpc3Q8Q0pCaWcyX0NhY2hlUGFpcj4qIHBTeW1ib2xEaWN0Q2FjaGUsIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgaW50MzJfdCBkZWNvZGVfU3F1ZW50aWFsT3JnbmF6YXRpb24oSUZYX1BhdXNlKiBwUGF1c2UpOwogCi0gICAgfkNKQmlnMl9Db250ZXh0KCk7CisgIGludDMyX3QgZGVjb2RlX0VtYmVkT3JnbmF6YXRpb24oSUZYX1BhdXNlKiBwUGF1c2UpOwogCi0gICAgRlhfSU5UMzIgZGVjb2RlRmlsZShJRlhfUGF1c2UqIHBQYXVzZSk7CisgIGludDMyX3QgZGVjb2RlX1JhbmRvbU9yZ25hemF0aW9uX0ZpcnN0UGFnZShJRlhfUGF1c2UqIHBQYXVzZSk7CiAKLSAgICBGWF9JTlQzMiBkZWNvZGVfU3F1ZW50aWFsT3JnbmF6YXRpb24oSUZYX1BhdXNlKiBwUGF1c2UpOworICBpbnQzMl90IGRlY29kZV9SYW5kb21PcmduYXphdGlvbihJRlhfUGF1c2UqIHBQYXVzZSk7CiAKLSAgICBGWF9JTlQzMiBkZWNvZGVfRW1iZWRPcmduYXphdGlvbihJRlhfUGF1c2UqIHBQYXVzZSk7CisgIENKQmlnMl9TZWdtZW50KiBmaW5kU2VnbWVudEJ5TnVtYmVyKEZYX0RXT1JEIGR3TnVtYmVyKTsKIAotICAgIEZYX0lOVDMyIGRlY29kZV9SYW5kb21PcmduYXphdGlvbl9GaXJzdFBhZ2UoSUZYX1BhdXNlKiBwUGF1c2UpOworICBDSkJpZzJfU2VnbWVudCogZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KENKQmlnMl9TZWdtZW50KiBwU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4KTsKIAotICAgIEZYX0lOVDMyIGRlY29kZV9SYW5kb21PcmduYXphdGlvbihJRlhfUGF1c2UqIHBQYXVzZSk7CisgIGludDMyX3QgcGFyc2VTZWdtZW50SGVhZGVyKENKQmlnMl9TZWdtZW50KiBwU2VnbWVudCk7CiAKLSAgICBDSkJpZzJfU2VnbWVudCAqZmluZFNlZ21lbnRCeU51bWJlcihGWF9EV09SRCBkd051bWJlcik7CisgIGludDMyX3QgcGFyc2VTZWdtZW50RGF0YShDSkJpZzJfU2VnbWVudCogcFNlZ21lbnQsIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgaW50MzJfdCBQcm9jZXNzaW5nUGFyc2VTZWdtZW50RGF0YShDSkJpZzJfU2VnbWVudCogcFNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpOwogCi0gICAgQ0pCaWcyX1NlZ21lbnQgKmZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChDSkJpZzJfU2VnbWVudCAqcFNlZ21lbnQsIEZYX0JZVEUgY1R5cGUsIEZYX0lOVDMyIG5JbmRleCk7CisgIGludDMyX3QgcGFyc2VTeW1ib2xEaWN0KENKQmlnMl9TZWdtZW50KiBwU2VnbWVudCwgSUZYX1BhdXNlKiBwUGF1c2UpOwogCi0gICAgRlhfSU5UMzIgcGFyc2VTZWdtZW50SGVhZGVyKENKQmlnMl9TZWdtZW50ICpwU2VnbWVudCk7CisgIGludDMyX3QgcGFyc2VUZXh0UmVnaW9uKENKQmlnMl9TZWdtZW50KiBwU2VnbWVudCk7CiAKLSAgICBGWF9JTlQzMiBwYXJzZVNlZ21lbnREYXRhKENKQmlnMl9TZWdtZW50ICpwU2VnbWVudCwgSUZYX1BhdXNlKiBwUGF1c2UpOwotICAgIEZYX0lOVDMyIFByb2Nlc3NpdmVQYXJzZVNlZ21lbnREYXRhKENKQmlnMl9TZWdtZW50ICpwU2VnbWVudCwgSUZYX1BhdXNlKiBwUGF1c2UpOworICBpbnQzMl90IHBhcnNlUGF0dGVybkRpY3QoQ0pCaWcyX1NlZ21lbnQqIHBTZWdtZW50LCBJRlhfUGF1c2UqIHBQYXVzZSk7CiAKLSAgICBGWF9JTlQzMiBwYXJzZVN5bWJvbERpY3QoQ0pCaWcyX1NlZ21lbnQgKnBTZWdtZW50LCBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIGludDMyX3QgcGFyc2VIYWxmdG9uZVJlZ2lvbihDSkJpZzJfU2VnbWVudCogcFNlZ21lbnQsIElGWF9QYXVzZSogcFBhdXNlKTsKIAotICAgIEZYX0lOVDMyIHBhcnNlVGV4dFJlZ2lvbihDSkJpZzJfU2VnbWVudCAqcFNlZ21lbnQpOworICBpbnQzMl90IHBhcnNlR2VuZXJpY1JlZ2lvbihDSkJpZzJfU2VnbWVudCogcFNlZ21lbnQsIElGWF9QYXVzZSogcFBhdXNlKTsKIAotICAgIEZYX0lOVDMyIHBhcnNlUGF0dGVybkRpY3QoQ0pCaWcyX1NlZ21lbnQgKnBTZWdtZW50LCBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIGludDMyX3QgcGFyc2VHZW5lcmljUmVmaW5lbWVudFJlZ2lvbihDSkJpZzJfU2VnbWVudCogcFNlZ21lbnQpOwogCi0gICAgRlhfSU5UMzIgcGFyc2VIYWxmdG9uZVJlZ2lvbihDSkJpZzJfU2VnbWVudCAqcFNlZ21lbnQsIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgaW50MzJfdCBwYXJzZVRhYmxlKENKQmlnMl9TZWdtZW50KiBwU2VnbWVudCk7CiAKLSAgICBGWF9JTlQzMiBwYXJzZUdlbmVyaWNSZWdpb24oQ0pCaWcyX1NlZ21lbnQgKnBTZWdtZW50LCBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIGludDMyX3QgcGFyc2VSZWdpb25JbmZvKEpCaWcyUmVnaW9uSW5mbyogcFJJKTsKIAotICAgIEZYX0lOVDMyIHBhcnNlR2VuZXJpY1JlZmluZW1lbnRSZWdpb24oQ0pCaWcyX1NlZ21lbnQgKnBTZWdtZW50KTsKKyAgSkJpZzJIdWZmbWFuQ29kZSogZGVjb2RlU3ltYm9sSURIdWZmbWFuVGFibGUoQ0pCaWcyX0JpdFN0cmVhbSogcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgU0JOVU1TWU1TKTsKIAotICAgIEZYX0lOVDMyIHBhcnNlVGFibGUoQ0pCaWcyX1NlZ21lbnQgKnBTZWdtZW50KTsKKyAgdm9pZCBodWZmbWFuX2Fzc2lnbl9jb2RlKGludCogQ09ERVMsIGludCogUFJFRkxFTiwgaW50IE5URU1QKTsKIAotICAgIEZYX0lOVDMyIHBhcnNlUmVnaW9uSW5mbyhKQmlnMlJlZ2lvbkluZm8gKnBSSSk7CisgIHZvaWQgaHVmZm1hbl9hc3NpZ25fY29kZShKQmlnMkh1ZmZtYW5Db2RlKiBTQlNZTUNPREVTLCBpbnQgTlRFTVApOwogCi0KLQotICAgIEpCaWcySHVmZm1hbkNvZGUgKmRlY29kZVN5bWJvbElESHVmZm1hblRhYmxlKENKQmlnMl9CaXRTdHJlYW0gKnBTdHJlYW0sIEZYX0RXT1JEIFNCTlVNU1lNUyk7Ci0KLSAgICB2b2lkIGh1ZmZtYW5fYXNzaWduX2NvZGUoaW50KiBDT0RFUywgaW50KiBQUkVGTEVOLCBpbnQgTlRFTVApOwotCi0gICAgdm9pZCBodWZmbWFuX2Fzc2lnbl9jb2RlKEpCaWcySHVmZm1hbkNvZGUgKlNCU1lNQ09ERVMsIGludCBOVEVNUCk7Ci0KLXByaXZhdGU6Ci0KLSAgICBDSkJpZzJfQ29udGV4dCAqbV9wR2xvYmFsQ29udGV4dDsKLQotICAgIEZYX0lOVDMyIG1fblN0cmVhbVR5cGU7Ci0KLSAgICBDSkJpZzJfQml0U3RyZWFtICptX3BTdHJlYW07Ci0KLSAgICBGWF9JTlQzMiBtX25TdGF0ZTsKLQotICAgIENKQmlnMl9MaXN0PENKQmlnMl9TZWdtZW50PiAqbV9wU2VnbWVudExpc3Q7Ci0KLSAgICBDSkJpZzJfTGlzdDxKQmlnMlBhZ2VJbmZvPiAqbV9wUGFnZUluZm9MaXN0OwotCi0gICAgQ0pCaWcyX0ltYWdlICptX3BQYWdlOwotCi0gICAgRlhfQk9PTCBtX2JCdWZTcGVjaWZpZWQ7Ci0KLSAgICBGWF9JTlQzMiBtX25TZWdtZW50RGVjb2RlZDsKLSAgICBJRlhfUGF1c2UqCW1fcFBhdXNlOwotICAgIEZYX0lOVDMyCW1fUGF1c2VTdGVwOwotICAgIEZYQ09ERUNfU1RBVFVTIG1fUHJvY2Vzc2l2ZVN0YXR1czsKLSAgICBGWF9CT09MCW1fYkZpcnN0UGFnZTsKLSAgICBDSkJpZzJfQXJpdGhEZWNvZGVyICptX3BBcml0aERlY29kZXI7Ci0gICAgQ0pCaWcyX0dSRFByb2MgKm1fcEdSRDsKLSAgICBKQmlnMkFyaXRoQ3R4ICptX2diQ29udGV4dDsKLSAgICBDSkJpZzJfU2VnbWVudCAqbV9wU2VnbWVudDsKLSAgICBGWF9EV09SRCBtX2R3T2Zmc2V0OwotICAgIEpCaWcyUmVnaW9uSW5mbyBtX3JpOwotICAgIHN0ZDo6bGlzdDxDSkJpZzJfQ2FjaGVQYWlyPiogbV9wU3ltYm9sRGljdENhY2hlOworIHByaXZhdGU6CisgIENKQmlnMl9Db250ZXh0KiBtX3BHbG9iYWxDb250ZXh0OworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0JpdFN0cmVhbT4gbV9wU3RyZWFtOworICBDSkJpZzJfTGlzdDxDSkJpZzJfU2VnbWVudD4gbV9TZWdtZW50TGlzdDsKKyAgQ0pCaWcyX0xpc3Q8SkJpZzJQYWdlSW5mbz4gbV9QYWdlSW5mb0xpc3Q7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IG1fcFBhZ2U7CisgIHNpemVfdCBtX25TZWdtZW50RGVjb2RlZDsKKyAgYm9vbCBtX2JJblBhZ2U7CisgIGJvb2wgbV9iQnVmU3BlY2lmaWVkOworICBpbnQzMl90IG1fUGF1c2VTdGVwOworICBJRlhfUGF1c2UqIG1fcFBhdXNlOworICBGWENPREVDX1NUQVRVUyBtX1Byb2Nlc3NpbmdTdGF0dXM7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfQXJpdGhEZWNvZGVyPiBtX3BBcml0aERlY29kZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfR1JEUHJvYz4gbV9wR1JEOworICBKQmlnMkFyaXRoQ3R4KiBtX2diQ29udGV4dDsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9TZWdtZW50PiBtX3BTZWdtZW50OworICBGWF9EV09SRCBtX2R3T2Zmc2V0OworICBKQmlnMlJlZ2lvbkluZm8gbV9yaTsKKyAgc3RkOjpsaXN0PENKQmlnMl9DYWNoZVBhaXI+KiBjb25zdCBtX3BTeW1ib2xEaWN0Q2FjaGU7CisgIGJvb2wgbV9iSXNHbG9iYWw7CiB9OwotI2VuZGlmCisKKyNlbmRpZiAgLy8gQ09SRV9TUkNfRlhDT0RFQ19KQklHMl9KQklHMl9DT05URVhUX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0RlZmluZS5oIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9EZWZpbmUuaAppbmRleCBjY2YxNWQwLi5jY2MzMDk5IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0RlZmluZS5oCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfRGVmaW5lLmgKQEAgLTEsMzQgKzEsMzYgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBfSkJJRzJfREVGSU5FX0hfCiAjZGVmaW5lIF9KQklHMl9ERUZJTkVfSF8KLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotI2RlZmluZSBKQklHMl9tZW1zZXQJRlhTWVNfbWVtc2V0OAotI2RlZmluZSBKQklHMl9tZW1jbXAJRlhTWVNfbWVtY21wMzIKLSNkZWZpbmUgSkJJRzJfbWVtY3B5CUZYU1lTX21lbWNweTMyCi0jaW5jbHVkZSAiSkJpZzJfT2JqZWN0LmgiCi0jZGVmaW5lIEpCSUcyX09PQgkJCTEKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBGWF9JTlQzMiB3aWR0aCwKLSAgICAgICAgICAgICBoZWlnaHQ7Ci0gICAgRlhfSU5UMzIgeCwKLSAgICAgICAgICAgICB5OwotICAgIEZYX0JZVEUgZmxhZ3M7Ci19IEpCaWcyUmVnaW9uSW5mbzsKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBGWF9JTlQzMiBjb2RlbGVuOwotICAgIEZYX0lOVDMyIGNvZGU7Ci19IEpCaWcySHVmZm1hbkNvZGU7Ci1leHRlcm4gIkMiIHsKLSAgICB2b2lkIF9GYXhHNERlY29kZSh2b2lkICpwTW9kdWxlLCBGWF9MUENCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLCBpbnQqIHBiaXRwb3MsIEZYX0xQQllURSBkZXN0X2J1ZiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcGl0Y2ggPSAwKTsKKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaCIKKworI2RlZmluZSBKQklHMl9tZW1zZXQgRlhTWVNfbWVtc2V0CisjZGVmaW5lIEpCSUcyX21lbWNtcCBGWFNZU19tZW1jbXAKKyNkZWZpbmUgSkJJRzJfbWVtY3B5IEZYU1lTX21lbWNweQorI2RlZmluZSBKQklHMl9PT0IgMQorCitzdHJ1Y3QgSkJpZzJSZWdpb25JbmZvIHsKKyAgaW50MzJfdCB3aWR0aDsKKyAgaW50MzJfdCBoZWlnaHQ7CisgIGludDMyX3QgeDsKKyAgaW50MzJfdCB5OworICB1aW50OF90IGZsYWdzOwogfTsKLSNkZWZpbmUgSkJJRzJfTUFYX1JFRkVSUkVEX1NFR01FTlRfQ09VTlQJCTY0Ci0jZGVmaW5lIEpCSUcyX01BWF9FWFBPUlRfU1lTTUJPTFMJCQkJNjU1MzUKLSNkZWZpbmUgSkJJRzJfTUFYX05FV19TWVNNQk9MUwkJCQkJNjU1MzUKLSNkZWZpbmUgSkJJRzJfTUFYX1BBVFRFUk5fSU5ERVgJCQkJCTY1NTM1Ci0jZGVmaW5lIEpCSUcyX01BWF9JTUFHRV9TSVpFCQkJCQk2NTUzNQorCitzdHJ1Y3QgSkJpZzJIdWZmbWFuQ29kZSB7CisgIGludDMyX3QgY29kZWxlbjsKKyAgaW50MzJfdCBjb2RlOworfTsKKworI2RlZmluZSBKQklHMl9NQVhfUkVGRVJSRURfU0VHTUVOVF9DT1VOVCA2NAorI2RlZmluZSBKQklHMl9NQVhfRVhQT1JUX1NZU01CT0xTIDY1NTM1CisjZGVmaW5lIEpCSUcyX01BWF9ORVdfU1lTTUJPTFMgNjU1MzUKKyNkZWZpbmUgSkJJRzJfTUFYX1BBVFRFUk5fSU5ERVggNjU1MzUKKyNkZWZpbmUgSkJJRzJfTUFYX0lNQUdFX1NJWkUgNjU1MzUKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0dlbmVyYWxEZWNvZGVyLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR2VuZXJhbERlY29kZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTkyOGY5Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR2VuZXJhbERlY29kZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDMzNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiSkJpZzJfR2VuZXJhbERlY29kZXIuaCIKLSNpbmNsdWRlICJKQmlnMl9Bcml0aERlY29kZXIuaCIKLSNpbmNsdWRlICJKQmlnMl9Bcml0aEludERlY29kZXIuaCIKLSNpbmNsdWRlICJKQmlnMl9IdWZmbWFuRGVjb2Rlci5oIgotI2luY2x1ZGUgIkpCaWcyX0h1ZmZtYW5UYWJsZS5oIgotI2luY2x1ZGUgIkpCaWcyX1BhdHRlcm5EaWN0LmgiCi0KLWV4dGVybiBjb25zdCBKQmlnMkFyaXRoUWUgUWVUYWJsZVtdID0gewotICAgIHsgMHg1NjAxLCAgMSwgIDEsIDEgfSwKLSAgICB7IDB4MzQwMSwgIDIsICA2LCAwIH0sCi0gICAgeyAweDE4MDEsICAzLCAgOSwgMCB9LAotICAgIHsgMHgwQUMxLCAgNCwgMTIsIDAgfSwKLSAgICB7IDB4MDUyMSwgIDUsIDI5LCAwIH0sCi0gICAgeyAweDAyMjEsIDM4LCAzMywgMCB9LAotICAgIHsgMHg1NjAxLCAgNywgIDYsIDEgfSwKLSAgICB7IDB4NTQwMSwgIDgsIDE0LCAwIH0sCi0gICAgeyAweDQ4MDEsICA5LCAxNCwgMCB9LAotICAgIHsgMHgzODAxLCAxMCwgMTQsIDAgfSwKLSAgICB7IDB4MzAwMSwgMTEsIDE3LCAwIH0sCi0gICAgeyAweDI0MDEsIDEyLCAxOCwgMCB9LAotICAgIHsgMHgxQzAxLCAxMywgMjAsIDAgfSwKLSAgICB7IDB4MTYwMSwgMjksIDIxLCAwIH0sCi0gICAgeyAweDU2MDEsIDE1LCAxNCwgMSB9LAotICAgIHsgMHg1NDAxLCAxNiwgMTQsIDAgfSwKLSAgICB7IDB4NTEwMSwgMTcsIDE1LCAwIH0sCi0gICAgeyAweDQ4MDEsIDE4LCAxNiwgMCB9LAotICAgIHsgMHgzODAxLCAxOSwgMTcsIDAgfSwKLSAgICB7IDB4MzQwMSwgMjAsIDE4LCAwIH0sCi0gICAgeyAweDMwMDEsIDIxLCAxOSwgMCB9LAotICAgIHsgMHgyODAxLCAyMiwgMTksIDAgfSwKLSAgICB7IDB4MjQwMSwgMjMsIDIwLCAwIH0sCi0gICAgeyAweDIyMDEsIDI0LCAyMSwgMCB9LAotICAgIHsgMHgxQzAxLCAyNSwgMjIsIDAgfSwKLSAgICB7IDB4MTgwMSwgMjYsIDIzLCAwIH0sCi0gICAgeyAweDE2MDEsIDI3LCAyNCwgMCB9LAotICAgIHsgMHgxNDAxLCAyOCwgMjUsIDAgfSwKLSAgICB7IDB4MTIwMSwgMjksIDI2LCAwIH0sCi0gICAgeyAweDExMDEsIDMwLCAyNywgMCB9LAotICAgIHsgMHgwQUMxLCAzMSwgMjgsIDAgfSwKLSAgICB7IDB4MDlDMSwgMzIsIDI5LCAwIH0sCi0gICAgeyAweDA4QTEsIDMzLCAzMCwgMCB9LAotICAgIHsgMHgwNTIxLCAzNCwgMzEsIDAgfSwKLSAgICB7IDB4MDQ0MSwgMzUsIDMyLCAwIH0sCi0gICAgeyAweDAyQTEsIDM2LCAzMywgMCB9LAotICAgIHsgMHgwMjIxLCAzNywgMzQsIDAgfSwKLSAgICB7IDB4MDE0MSwgMzgsIDM1LCAwIH0sCi0gICAgeyAweDAxMTEsIDM5LCAzNiwgMCB9LAotICAgIHsgMHgwMDg1LCA0MCwgMzcsIDAgfSwKLSAgICB7IDB4MDA0OSwgNDEsIDM4LCAwIH0sCi0gICAgeyAweDAwMjUsIDQyLCAzOSwgMCB9LAotICAgIHsgMHgwMDE1LCA0MywgNDAsIDAgfSwKLSAgICB7IDB4MDAwOSwgNDQsIDQxLCAwIH0sCi0gICAgeyAweDAwMDUsIDQ1LCA0MiwgMCB9LAotICAgIHsgMHgwMDAxLCA0NSwgNDMsIDAgfSwKLSAgICB7IDB4NTYwMSwgNDYsIDQ2LCAwIH0KLX07Ci0KLWV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgSkJJRzJfUUVfTlVNID0gc2l6ZW9mKFFlVGFibGUpIC8gc2l6ZW9mKEpCaWcyQXJpdGhRZSk7Ci0KLUNKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCi17Ci0gICAgaWYgKEdCVyA9PSAwIHx8IEdCSCA9PSAwKSB7Ci0gICAgICAgIENKQmlnMl9JbWFnZSogcEltYWdlOwotICAgICAgICBKQklHMl9BTExPQyhwSW1hZ2UsIENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOwotICAgICAgICByZXR1cm4gcEltYWdlOwotICAgIH0KLSAgICBpZihHQlRFTVBMQVRFID09IDApIHsKLSAgICAgICAgaWYoKEdCQVRbMF0gPT0gMykgJiYgKEdCQVRbMV0gPT0gKHNpZ25lZCBjaGFyKSAtIDEpCi0gICAgICAgICAgICAgICAgJiYgKEdCQVRbMl0gPT0gKHNpZ25lZCBjaGFyKSAtIDMpICYmIChHQkFUWzNdID09IChzaWduZWQgY2hhcikgLSAxKQotICAgICAgICAgICAgICAgICYmIChHQkFUWzRdID09IDIpICYmIChHQkFUWzVdID09IChzaWduZWQgY2hhcikgLSAyKQotICAgICAgICAgICAgICAgICYmIChHQkFUWzZdID09IChzaWduZWQgY2hhcikgLSAyKSAmJiAoR0JBVFs3XSA9PSAoc2lnbmVkIGNoYXIpIC0gMikpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX29wdDMocEFyaXRoRGVjb2RlciwgZ2JDb250ZXh0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX3Vub3B0KHBBcml0aERlY29kZXIsIGdiQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYoR0JURU1QTEFURSA9PSAxKSB7Ci0gICAgICAgIGlmKChHQkFUWzBdID09IDMpICYmIChHQkFUWzFdID09IChzaWduZWQgY2hhcikgLSAxKSkgewotICAgICAgICAgICAgcmV0dXJuIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfb3B0MyhwQXJpdGhEZWNvZGVyLCBnYkNvbnRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfdW5vcHQocEFyaXRoRGVjb2RlciwgZ2JDb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZihHQlRFTVBMQVRFID09IDIpIHsKLSAgICAgICAgaWYoKEdCQVRbMF0gPT0gMikgJiYgKEdCQVRbMV0gPT0gKHNpZ25lZCBjaGFyKSAtIDEpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl9vcHQzKHBBcml0aERlY29kZXIsIGdiQ29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl91bm9wdChwQXJpdGhEZWNvZGVyLCBnYkNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYoKEdCQVRbMF0gPT0gMikgJiYgKEdCQVRbMV0gPT0gKHNpZ25lZCBjaGFyKSAtIDEpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVjb2RlX0FyaXRoX1RlbXBsYXRlM19vcHQzKHBBcml0aERlY29kZXIsIGdiQ29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVjb2RlX0FyaXRoX1RlbXBsYXRlM191bm9wdChwQXJpdGhEZWNvZGVyLCBnYkNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotfQotQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF9vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQotewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOwotICAgIEZYX0RXT1JEIENPTlRFWFQ7Ci0gICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKLSAgICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzOwotICAgIExUUCA9IDA7Ci0gICAgSkJJRzJfQUxMT0MoR0JSRUcsIENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOwotICAgIEdCUkVHLT5maWxsKDApOwotICAgIGZvcihGWF9EV09SRCBoID0gMDsgaCA8IEdCSDsgaCsrKSB7Ci0gICAgICAgIGlmKFRQR0RPTikgewotICAgICAgICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4OWIyNV0pOwotICAgICAgICAgICAgTFRQID0gTFRQIF4gU0xUUDsKLSAgICAgICAgfQotICAgICAgICBpZihMVFAgPT0gMSkgewotICAgICAgICAgICAgR0JSRUctPmNvcHlMaW5lKGgsIGggLSAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxpbmUxID0gR0JSRUctPmdldFBpeGVsKDIsIGggLSAyKTsKLSAgICAgICAgICAgIGxpbmUxIHw9IEdCUkVHLT5nZXRQaXhlbCgxLCBoIC0gMikgPDwgMTsKLSAgICAgICAgICAgIGxpbmUxIHw9IEdCUkVHLT5nZXRQaXhlbCgwLCBoIC0gMikgPDwgMjsKLSAgICAgICAgICAgIGxpbmUyID0gR0JSRUctPmdldFBpeGVsKDMsIGggLSAxKTsKLSAgICAgICAgICAgIGxpbmUyIHw9IEdCUkVHLT5nZXRQaXhlbCgyLCBoIC0gMSkgPDwgMTsKLSAgICAgICAgICAgIGxpbmUyIHw9IEdCUkVHLT5nZXRQaXhlbCgxLCBoIC0gMSkgPDwgMjsKLSAgICAgICAgICAgIGxpbmUyIHw9IEdCUkVHLT5nZXRQaXhlbCgwLCBoIC0gMSkgPDwgMzsKLSAgICAgICAgICAgIGxpbmUzID0gMDsKLSAgICAgICAgICAgIGZvcihGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdysrKSB7Ci0gICAgICAgICAgICAgICAgaWYoVVNFU0tJUCAmJiBTS0lQLT5nZXRQaXhlbCh3LCBoKSkgewotICAgICAgICAgICAgICAgICAgICBiVmFsID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gbGluZTM7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgNDsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCAxMTsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoYlZhbCkgewotICAgICAgICAgICAgICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgaCwgYlZhbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmUxID0gKChsaW5lMSA8PCAxKSB8IEdCUkVHLT5nZXRQaXhlbCh3ICsgMywgaCAtIDIpKSAmIDB4MWY7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyA0LCBoIC0gMSkpICYgMHg3ZjsKLSAgICAgICAgICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfCBiVmFsKSAmIDB4MGY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEdCUkVHOwotfQotQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF9vcHQyKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKLXsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUOwotICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7Ci0gICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOwotICAgIEZYX0JZVEUgKnBMaW5lLCBjVmFsOwotICAgIEZYX0lOVFBUUiBuU3RyaWRlLCBuU3RyaWRlMjsKLSAgICBGWF9JTlQzMiBuQml0cywgazsKLSAgICBMVFAgPSAwOwotICAgIEpCSUcyX0FMTE9DKEdCUkVHLCBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKLSAgICBpZiAoR0JSRUctPm1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICBkZWxldGUgR0JSRUc7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoIkdlbmVyaWMgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZTogQ3JlYXRlIEltYWdlIEZhaWxlZCB3aXRoIHdpZHRoID0gJWQsIGhlaWdodCA9ICVkXG4iLCBHQlcsIEdCSCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBwTGluZSA9IEdCUkVHLT5tX3BEYXRhOwotICAgIG5TdHJpZGUgPSBHQlJFRy0+bV9uU3RyaWRlOwotICAgIG5TdHJpZGUyID0gblN0cmlkZSA8PCAxOwotICAgIGZvcihGWF9EV09SRCBoID0gMDsgaCA8IEdCSDsgaCsrKSB7Ci0gICAgICAgIGlmKFRQR0RPTikgewotICAgICAgICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4OWIyNV0pOwotICAgICAgICAgICAgTFRQID0gTFRQIF4gU0xUUDsKLSAgICAgICAgfQotICAgICAgICBpZihMVFAgPT0gMSkgewotICAgICAgICAgICAgR0JSRUctPmNvcHlMaW5lKGgsIGggLSAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxpbmUxID0gKGggPiAxKSA/IHBMaW5lWy1uU3RyaWRlMl0gPDwgNiA6IDA7Ci0gICAgICAgICAgICBsaW5lMiA9IChoID4gMCkgPyBwTGluZVstblN0cmlkZV0gOiAwOwotICAgICAgICAgICAgQ09OVEVYVCA9IChsaW5lMSAmIDB4ZjgwMCkgfCAobGluZTIgJiAweDA3ZjApOwotICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3ICs9IDgpIHsKLSAgICAgICAgICAgICAgICBpZih3ICsgOCA8IEdCVykgewotICAgICAgICAgICAgICAgICAgICBuQml0cyA9IDg7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGggPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSA9IChsaW5lMSA8PCA4KSB8IChwTGluZVstblN0cmlkZTIgKyAodyA+PiAzKSArIDFdIDw8IDYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmKGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiA9IChsaW5lMiA8PCA4KSB8IChwTGluZVstblN0cmlkZSArICh3ID4+IDMpICsgMV0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbkJpdHMgPSBHQlcgLSB3OwotICAgICAgICAgICAgICAgICAgICBpZihoID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTEgPDw9IDg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoaCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyIDw8PSA4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IG5CaXRzOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoVVNFU0tJUCAmJiBTS0lQLT5nZXRQaXhlbCh3LCBoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYlZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHg3YmY3KSA8PCAxKSB8IGJWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMSA+PiAoNyAtIGspKSAmIDB4MDgwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMiA+PiAoNyAtIGspKSAmIDB4MDAxMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBMaW5lW3cgPj4gM10gPSBjVmFsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBMaW5lICs9IG5TdHJpZGU7Ci0gICAgfQotICAgIHJldHVybiBHQlJFRzsKLX0KLUNKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfb3B0MyhDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCi17Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7Ci0gICAgRlhfRFdPUkQgQ09OVEVYVDsKLSAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwotICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKLSAgICBGWF9CWVRFICpwTGluZSwgKnBMaW5lMSwgKnBMaW5lMiwgY1ZhbDsKLSAgICBGWF9JTlQzMiBuU3RyaWRlLCBuU3RyaWRlMiwgazsKLSAgICBGWF9JTlQzMiBuTGluZUJ5dGVzLCBuQml0c0xlZnQsIGNjOwotICAgIExUUCA9IDA7Ci0gICAgSkJJRzJfQUxMT0MoR0JSRUcsIENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOwotICAgIGlmIChHQlJFRy0+bV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBHQlJFRzsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiR2VuZXJpYyByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlOiBDcmVhdGUgSW1hZ2UgRmFpbGVkIHdpdGggd2lkdGggPSAlZCwgaGVpZ2h0ID0gJWRcbiIsIEdCVywgR0JIKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHBMaW5lID0gR0JSRUctPm1fcERhdGE7Ci0gICAgblN0cmlkZSA9IEdCUkVHLT5tX25TdHJpZGU7Ci0gICAgblN0cmlkZTIgPSBuU3RyaWRlIDw8IDE7Ci0gICAgbkxpbmVCeXRlcyA9ICgoR0JXICsgNykgPj4gMykgLSAxOwotICAgIG5CaXRzTGVmdCA9IEdCVyAtIChuTGluZUJ5dGVzIDw8IDMpOwotICAgIEZYX0RXT1JEIGhlaWdodCA9IEdCSCAmIDB4N2ZmZmZmZmY7Ci0gICAgZm9yKEZYX0RXT1JEIGggPSAwOyBoIDwgaGVpZ2h0OyBoKyspIHsKLSAgICAgICAgaWYoVFBHRE9OKSB7Ci0gICAgICAgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHg5YjI1XSk7Ci0gICAgICAgICAgICBMVFAgPSBMVFAgXiBTTFRQOwotICAgICAgICB9Ci0gICAgICAgIGlmKExUUCA9PSAxKSB7Ci0gICAgICAgICAgICBHQlJFRy0+Y29weUxpbmUoaCwgaCAtIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYoaCA+IDEpIHsKLSAgICAgICAgICAgICAgICBwTGluZTEgPSBwTGluZSAtIG5TdHJpZGUyOwotICAgICAgICAgICAgICAgIHBMaW5lMiA9IHBMaW5lIC0gblN0cmlkZTsKLSAgICAgICAgICAgICAgICBsaW5lMSA9ICgqcExpbmUxKyspIDw8IDY7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSAqcExpbmUyKys7Ci0gICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgobGluZTEgJiAweGY4MDApIHwgKGxpbmUyICYgMHgwN2YwKSk7Ci0gICAgICAgICAgICAgICAgZm9yKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwgKCgqcExpbmUxKyspIDw8IDYpOwotICAgICAgICAgICAgICAgICAgICBsaW5lMiA9IChsaW5lMiA8PCA4KSB8ICgqcExpbmUyKyspOwotICAgICAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZm9yKGsgPSA3OyBrID49IDA7IGstLSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCBrOwotICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgoKENPTlRFWFQgJiAweDdiZjcpIDw8IDEpIHwgYlZhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTEgPj4gaykgJiAweDA4MDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMiA+PiBrKSAmIDB4MDAxMCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBMaW5lW2NjXSA9IGNWYWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmUxIDw8PSA4OwotICAgICAgICAgICAgICAgIGxpbmUyIDw8PSA4OwotICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKCgoQ09OVEVYVCAmIDB4N2JmNykgPDwgMSkgfCBiVmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUxID4+ICg3IC0gaykpICYgMHgwODAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMiA+PiAoNyAtIGspKSAmIDB4MDAxMCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwTGluZVtuTGluZUJ5dGVzXSA9IGNWYWw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBMaW5lMiA9IHBMaW5lIC0gblN0cmlkZTsKLSAgICAgICAgICAgICAgICBsaW5lMiA9IChoICYgMSkgPyAoKnBMaW5lMisrKSA6IDA7Ci0gICAgICAgICAgICAgICAgQ09OVEVYVCA9IChsaW5lMiAmIDB4MDdmMCk7Ci0gICAgICAgICAgICAgICAgZm9yKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGggJiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiA9IChsaW5lMiA8PCA4KSB8ICgqcExpbmUyKyspOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3IoayA9IDc7IGsgPj0gMDsgay0tKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKCgoQ09OVEVYVCAmIDB4N2JmNykgPDwgMSkgfCBiVmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMiA+PiBrKSAmIDB4MDAxMCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBMaW5lW2NjXSA9IGNWYWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmUyIDw8PSA4OwotICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKCgoQ09OVEVYVCAmIDB4N2JmNykgPDwgMSkgfCBiVmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKChsaW5lMiA+PiAoNyAtIGspKSkgJiAweDAwMTApKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcExpbmVbbkxpbmVCeXRlc10gPSBjVmFsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBMaW5lICs9IG5TdHJpZGU7Ci0gICAgfQotICAgIHJldHVybiBHQlJFRzsKLX0KLUNKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfdW5vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQotewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOwotICAgIEZYX0RXT1JEIENPTlRFWFQ7Ci0gICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKLSAgICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzOwotICAgIExUUCA9IDA7Ci0gICAgSkJJRzJfQUxMT0MoR0JSRUcsIENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOwotICAgIEdCUkVHLT5maWxsKDApOwotICAgIGZvcihGWF9EV09SRCBoID0gMDsgaCA8IEdCSDsgaCsrKSB7Ci0gICAgICAgIGlmKFRQR0RPTikgewotICAgICAgICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4OWIyNV0pOwotICAgICAgICAgICAgTFRQID0gTFRQIF4gU0xUUDsKLSAgICAgICAgfQotICAgICAgICBpZihMVFAgPT0gMSkgewotICAgICAgICAgICAgR0JSRUctPmNvcHlMaW5lKGgsIGggLSAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxpbmUxID0gR0JSRUctPmdldFBpeGVsKDEsIGggLSAyKTsKLSAgICAgICAgICAgIGxpbmUxIHw9IEdCUkVHLT5nZXRQaXhlbCgwLCBoIC0gMikgPDwgMTsKLSAgICAgICAgICAgIGxpbmUyID0gR0JSRUctPmdldFBpeGVsKDIsIGggLSAxKTsKLSAgICAgICAgICAgIGxpbmUyIHw9IEdCUkVHLT5nZXRQaXhlbCgxLCBoIC0gMSkgPDwgMTsKLSAgICAgICAgICAgIGxpbmUyIHw9IEdCUkVHLT5nZXRQaXhlbCgwLCBoIC0gMSkgPDwgMjsKLSAgICAgICAgICAgIGxpbmUzID0gMDsKLSAgICAgICAgICAgIGZvcihGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdysrKSB7Ci0gICAgICAgICAgICAgICAgaWYoVVNFU0tJUCAmJiBTS0lQLT5nZXRQaXhlbCh3LCBoKSkgewotICAgICAgICAgICAgICAgICAgICBiVmFsID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gbGluZTM7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBoICsgR0JBVFsxXSkgPDwgNDsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMiA8PCA1OwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFsyXSwgaCArIEdCQVRbM10pIDw8IDEwOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFs0XSwgaCArIEdCQVRbNV0pIDw8IDExOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDEyOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFs2XSwgaCArIEdCQVRbN10pIDw8IDE1OwotICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihiVmFsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEdCUkVHLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZTEgPSAoKGxpbmUxIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAyLCBoIC0gMikpICYgMHgwNzsKLSAgICAgICAgICAgICAgICBsaW5lMiA9ICgobGluZTIgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDMsIGggLSAxKSkgJiAweDFmOwotICAgICAgICAgICAgICAgIGxpbmUzID0gKChsaW5lMyA8PCAxKSB8IGJWYWwpICYgMHgwZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gR0JSRUc7Ci19Ci1DSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUxX29wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCi17Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7Ci0gICAgRlhfRFdPUkQgQ09OVEVYVDsKLSAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwotICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMiwgbGluZTM7Ci0gICAgTFRQID0gMDsKLSAgICBKQklHMl9BTExPQyhHQlJFRywgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7Ci0gICAgR0JSRUctPmZpbGwoMCk7Ci0gICAgZm9yKEZYX0RXT1JEIGggPSAwOyBoIDwgR0JIOyBoKyspIHsKLSAgICAgICAgaWYoVFBHRE9OKSB7Ci0gICAgICAgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwNzk1XSk7Ci0gICAgICAgICAgICBMVFAgPSBMVFAgXiBTTFRQOwotICAgICAgICB9Ci0gICAgICAgIGlmKExUUCA9PSAxKSB7Ci0gICAgICAgICAgICBHQlJFRy0+Y29weUxpbmUoaCwgaCAtIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGluZTEgPSBHQlJFRy0+Z2V0UGl4ZWwoMiwgaCAtIDIpOwotICAgICAgICAgICAgbGluZTEgfD0gR0JSRUctPmdldFBpeGVsKDEsIGggLSAyKSA8PCAxOwotICAgICAgICAgICAgbGluZTEgfD0gR0JSRUctPmdldFBpeGVsKDAsIGggLSAyKSA8PCAyOwotICAgICAgICAgICAgbGluZTIgPSBHQlJFRy0+Z2V0UGl4ZWwoMywgaCAtIDEpOwotICAgICAgICAgICAgbGluZTIgfD0gR0JSRUctPmdldFBpeGVsKDIsIGggLSAxKSA8PCAxOwotICAgICAgICAgICAgbGluZTIgfD0gR0JSRUctPmdldFBpeGVsKDEsIGggLSAxKSA8PCAyOwotICAgICAgICAgICAgbGluZTIgfD0gR0JSRUctPmdldFBpeGVsKDAsIGggLSAxKSA8PCAzOwotICAgICAgICAgICAgbGluZTMgPSAwOwotICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKLSAgICAgICAgICAgICAgICBpZihVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSBsaW5lMzsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMiA8PCAzOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDk7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKGJWYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgR0JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDMsIGggLSAyKSkgJiAweDBmOwotICAgICAgICAgICAgICAgIGxpbmUyID0gKChsaW5lMiA8PCAxKSB8IEdCUkVHLT5nZXRQaXhlbCh3ICsgNCwgaCAtIDEpKSAmIDB4M2Y7Ci0gICAgICAgICAgICAgICAgbGluZTMgPSAoKGxpbmUzIDw8IDEpIHwgYlZhbCkgJiAweDA3OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBHQlJFRzsKLX0KLUNKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfb3B0MihDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCi17Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7Ci0gICAgRlhfRFdPUkQgQ09OVEVYVDsKLSAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwotICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKLSAgICBGWF9CWVRFICpwTGluZSwgY1ZhbDsKLSAgICBGWF9JTlRQVFIgblN0cmlkZSwgblN0cmlkZTI7Ci0gICAgRlhfSU5UMzIgbkJpdHMsIGs7Ci0gICAgTFRQID0gMDsKLSAgICBKQklHMl9BTExPQyhHQlJFRywgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7Ci0gICAgaWYgKEdCUkVHLT5tX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIEdCUkVHOwotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJHZW5lcmljIHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmU6IENyZWF0ZSBJbWFnZSBGYWlsZWQgd2l0aCB3aWR0aCA9ICVkLCBoZWlnaHQgPSAlZFxuIiwgR0JXLCBHQkgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcExpbmUgPSBHQlJFRy0+bV9wRGF0YTsKLSAgICBuU3RyaWRlID0gR0JSRUctPm1fblN0cmlkZTsKLSAgICBuU3RyaWRlMiA9IG5TdHJpZGUgPDwgMTsKLSAgICBmb3IoRlhfRFdPUkQgaCA9IDA7IGggPCBHQkg7IGgrKykgewotICAgICAgICBpZihUUEdET04pIHsKLSAgICAgICAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDA3OTVdKTsKLSAgICAgICAgICAgIExUUCA9IExUUCBeIFNMVFA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTFRQID09IDEpIHsKLSAgICAgICAgICAgIEdCUkVHLT5jb3B5TGluZShoLCBoIC0gMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaW5lMSA9IChoID4gMSkgPyBwTGluZVstblN0cmlkZTJdIDw8IDQgOiAwOwotICAgICAgICAgICAgbGluZTIgPSAoaCA+IDApID8gcExpbmVbLW5TdHJpZGVdIDogMDsKLSAgICAgICAgICAgIENPTlRFWFQgPSAobGluZTEgJiAweDFlMDApIHwgKChsaW5lMiA+PiAxKSAmIDB4MDFmOCk7Ci0gICAgICAgICAgICBmb3IoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcgKz0gOCkgewotICAgICAgICAgICAgICAgIGlmKHcgKyA4IDwgR0JXKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5CaXRzID0gODsKLSAgICAgICAgICAgICAgICAgICAgaWYoaCA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwgKHBMaW5lWy1uU3RyaWRlMiArICh3ID4+IDMpICsgMV0gPDwgNCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoaCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKHBMaW5lWy1uU3RyaWRlICsgKHcgPj4gMykgKyAxXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBuQml0cyA9IEdCVyAtIHc7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGggPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSA8PD0gODsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZihoID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTIgPDw9IDg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY1ZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yKGsgPSAwOyBrIDwgbkJpdHM7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBpZihVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDBlZmIpIDw8IDEpIHwgYlZhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUxID4+ICg3IC0gaykpICYgMHgwMjAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUyID4+ICg4IC0gaykpICYgMHgwMDA4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcExpbmVbdyA+PiAzXSA9IGNWYWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcExpbmUgKz0gblN0cmlkZTsKLSAgICB9Ci0gICAgcmV0dXJuIEdCUkVHOwotfQotQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV9vcHQzKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKLXsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUOwotICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7Ci0gICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOwotICAgIEZYX0JZVEUgKnBMaW5lLCAqcExpbmUxLCAqcExpbmUyLCBjVmFsOwotICAgIEZYX0lOVDMyIG5TdHJpZGUsIG5TdHJpZGUyLCBrOwotICAgIEZYX0lOVDMyIG5MaW5lQnl0ZXMsIG5CaXRzTGVmdCwgY2M7Ci0gICAgTFRQID0gMDsKLSAgICBKQklHMl9BTExPQyhHQlJFRywgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7Ci0gICAgaWYgKEdCUkVHLT5tX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIEdCUkVHOwotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJHZW5lcmljIHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmU6IENyZWF0ZSBJbWFnZSBGYWlsZWQgd2l0aCB3aWR0aCA9ICVkLCBoZWlnaHQgPSAlZFxuIiwgR0JXLCBHQkgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcExpbmUgPSBHQlJFRy0+bV9wRGF0YTsKLSAgICBuU3RyaWRlID0gR0JSRUctPm1fblN0cmlkZTsKLSAgICBuU3RyaWRlMiA9IG5TdHJpZGUgPDwgMTsKLSAgICBuTGluZUJ5dGVzID0gKChHQlcgKyA3KSA+PiAzKSAtIDE7Ci0gICAgbkJpdHNMZWZ0ID0gR0JXIC0gKG5MaW5lQnl0ZXMgPDwgMyk7Ci0gICAgZm9yKEZYX0RXT1JEIGggPSAwOyBoIDwgR0JIOyBoKyspIHsKLSAgICAgICAgaWYoVFBHRE9OKSB7Ci0gICAgICAgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwNzk1XSk7Ci0gICAgICAgICAgICBMVFAgPSBMVFAgXiBTTFRQOwotICAgICAgICB9Ci0gICAgICAgIGlmKExUUCA9PSAxKSB7Ci0gICAgICAgICAgICBHQlJFRy0+Y29weUxpbmUoaCwgaCAtIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYoaCA+IDEpIHsKLSAgICAgICAgICAgICAgICBwTGluZTEgPSBwTGluZSAtIG5TdHJpZGUyOwotICAgICAgICAgICAgICAgIHBMaW5lMiA9IHBMaW5lIC0gblN0cmlkZTsKLSAgICAgICAgICAgICAgICBsaW5lMSA9ICgqcExpbmUxKyspIDw8IDQ7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSAqcExpbmUyKys7Ci0gICAgICAgICAgICAgICAgQ09OVEVYVCA9IChsaW5lMSAmIDB4MWUwMCkgfCAoKGxpbmUyID4+IDEpICYgMHgwMWY4KTsKLSAgICAgICAgICAgICAgICBmb3IoY2MgPSAwOyBjYyA8IG5MaW5lQnl0ZXM7IGNjKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZTEgPSAobGluZTEgPDwgOCkgfCAoKCpwTGluZTErKykgPDwgNCk7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKCpwTGluZTIrKyk7Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3IoayA9IDc7IGsgPj0gMDsgay0tKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwZWZiKSA8PCAxKSB8IGJWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTEgPj4gaykgJiAweDAyMDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUyID4+IChrICsgMSkpICYgMHgwMDA4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwTGluZVtjY10gPSBjVmFsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lMSA8PD0gODsKLSAgICAgICAgICAgICAgICBsaW5lMiA8PD0gODsKLSAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCBuQml0c0xlZnQ7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MGVmYikgPDwgMSkgfCBiVmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTEgPj4gKDcgLSBrKSkgJiAweDAyMDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTIgPj4gKDggLSBrKSkgJiAweDAwMDgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwTGluZVtuTGluZUJ5dGVzXSA9IGNWYWw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBMaW5lMiA9IHBMaW5lIC0gblN0cmlkZTsKLSAgICAgICAgICAgICAgICBsaW5lMiA9IChoICYgMSkgPyAoKnBMaW5lMisrKSA6IDA7Ci0gICAgICAgICAgICAgICAgQ09OVEVYVCA9IChsaW5lMiA+PiAxKSAmIDB4MDFmODsKLSAgICAgICAgICAgICAgICBmb3IoY2MgPSAwOyBjYyA8IG5MaW5lQnl0ZXM7IGNjKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoaCAmIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKCpwTGluZTIrKyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY1ZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihrID0gNzsgayA+PSAwOyBrLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDBlZmIpIDw8IDEpIHwgYlZhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMiA+PiAoayArIDEpKSAmIDB4MDAwOCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcExpbmVbY2NdID0gY1ZhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZTIgPDw9IDg7Ci0gICAgICAgICAgICAgICAgY1ZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yKGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDBlZmIpIDw8IDEpIHwgYlZhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUyID4+ICg4IC0gaykpICYgMHgwMDA4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcExpbmVbbkxpbmVCeXRlc10gPSBjVmFsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBMaW5lICs9IG5TdHJpZGU7Ci0gICAgfQotICAgIHJldHVybiBHQlJFRzsKLX0KLUNKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfdW5vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQotewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOwotICAgIEZYX0RXT1JEIENPTlRFWFQ7Ci0gICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKLSAgICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzOwotICAgIExUUCA9IDA7Ci0gICAgSkJJRzJfQUxMT0MoR0JSRUcsIENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOwotICAgIEdCUkVHLT5maWxsKDApOwotICAgIGZvcihGWF9EV09SRCBoID0gMDsgaCA8IEdCSDsgaCsrKSB7Ci0gICAgICAgIGlmKFRQR0RPTikgewotICAgICAgICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDc5NV0pOwotICAgICAgICAgICAgTFRQID0gTFRQIF4gU0xUUDsKLSAgICAgICAgfQotICAgICAgICBpZihMVFAgPT0gMSkgewotICAgICAgICAgICAgR0JSRUctPmNvcHlMaW5lKGgsIGggLSAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxpbmUxID0gR0JSRUctPmdldFBpeGVsKDIsIGggLSAyKTsKLSAgICAgICAgICAgIGxpbmUxIHw9IEdCUkVHLT5nZXRQaXhlbCgxLCBoIC0gMikgPDwgMTsKLSAgICAgICAgICAgIGxpbmUxIHw9IEdCUkVHLT5nZXRQaXhlbCgwLCBoIC0gMikgPDwgMjsKLSAgICAgICAgICAgIGxpbmUyID0gR0JSRUctPmdldFBpeGVsKDIsIGggLSAxKTsKLSAgICAgICAgICAgIGxpbmUyIHw9IEdCUkVHLT5nZXRQaXhlbCgxLCBoIC0gMSkgPDwgMTsKLSAgICAgICAgICAgIGxpbmUyIHw9IEdCUkVHLT5nZXRQaXhlbCgwLCBoIC0gMSkgPDwgMjsKLSAgICAgICAgICAgIGxpbmUzID0gMDsKLSAgICAgICAgICAgIGZvcihGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdysrKSB7Ci0gICAgICAgICAgICAgICAgaWYoVVNFU0tJUCAmJiBTS0lQLT5nZXRQaXhlbCh3LCBoKSkgewotICAgICAgICAgICAgICAgICAgICBiVmFsID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gbGluZTM7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBoICsgR0JBVFsxXSkgPDwgMzsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMiA8PCA0OwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDk7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKGJWYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgR0JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDMsIGggLSAyKSkgJiAweDBmOwotICAgICAgICAgICAgICAgIGxpbmUyID0gKChsaW5lMiA8PCAxKSB8IEdCUkVHLT5nZXRQaXhlbCh3ICsgMywgaCAtIDEpKSAmIDB4MWY7Ci0gICAgICAgICAgICAgICAgbGluZTMgPSAoKGxpbmUzIDw8IDEpIHwgYlZhbCkgJiAweDA3OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBHQlJFRzsKLX0KLUNKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfb3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKLXsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUOwotICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7Ci0gICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKLSAgICBMVFAgPSAwOwotICAgIEpCSUcyX0FMTE9DKEdCUkVHLCBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKLSAgICBHQlJFRy0+ZmlsbCgwKTsKLSAgICBmb3IoRlhfRFdPUkQgaCA9IDA7IGggPCBHQkg7IGgrKykgewotICAgICAgICBpZihUUEdET04pIHsKLSAgICAgICAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDAwZTVdKTsKLSAgICAgICAgICAgIExUUCA9IExUUCBeIFNMVFA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTFRQID09IDEpIHsKLSAgICAgICAgICAgIEdCUkVHLT5jb3B5TGluZShoLCBoIC0gMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaW5lMSA9IEdCUkVHLT5nZXRQaXhlbCgxLCBoIC0gMik7Ci0gICAgICAgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDIpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lMiA9IEdCUkVHLT5nZXRQaXhlbCgyLCBoIC0gMSk7Ci0gICAgICAgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDEpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDI7Ci0gICAgICAgICAgICBsaW5lMyA9IDA7Ci0gICAgICAgICAgICBmb3IoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcrKykgewotICAgICAgICAgICAgICAgIGlmKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IGxpbmUzOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDI7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgNzsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoYlZhbCkgewotICAgICAgICAgICAgICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgaCwgYlZhbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmUxID0gKChsaW5lMSA8PCAxKSB8IEdCUkVHLT5nZXRQaXhlbCh3ICsgMiwgaCAtIDIpKSAmIDB4MDc7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAzLCBoIC0gMSkpICYgMHgxZjsKLSAgICAgICAgICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfCBiVmFsKSAmIDB4MDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEdCUkVHOwotfQotQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl9vcHQyKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKLXsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUOwotICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7Ci0gICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOwotICAgIEZYX0JZVEUgKnBMaW5lLCBjVmFsOwotICAgIEZYX0lOVFBUUiBuU3RyaWRlLCBuU3RyaWRlMjsKLSAgICBGWF9JTlQzMiBuQml0cywgazsKLSAgICBMVFAgPSAwOwotICAgIEpCSUcyX0FMTE9DKEdCUkVHLCBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKLSAgICBpZiAoR0JSRUctPm1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICBkZWxldGUgR0JSRUc7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoIkdlbmVyaWMgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZTogQ3JlYXRlIEltYWdlIEZhaWxlZCB3aXRoIHdpZHRoID0gJWQsIGhlaWdodCA9ICVkXG4iLCBHQlcsIEdCSCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBwTGluZSA9IEdCUkVHLT5tX3BEYXRhOwotICAgIG5TdHJpZGUgPSBHQlJFRy0+bV9uU3RyaWRlOwotICAgIG5TdHJpZGUyID0gblN0cmlkZSA8PCAxOwotICAgIGZvcihGWF9EV09SRCBoID0gMDsgaCA8IEdCSDsgaCsrKSB7Ci0gICAgICAgIGlmKFRQR0RPTikgewotICAgICAgICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDBlNV0pOwotICAgICAgICAgICAgTFRQID0gTFRQIF4gU0xUUDsKLSAgICAgICAgfQotICAgICAgICBpZihMVFAgPT0gMSkgewotICAgICAgICAgICAgR0JSRUctPmNvcHlMaW5lKGgsIGggLSAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxpbmUxID0gKGggPiAxKSA/IHBMaW5lWy1uU3RyaWRlMl0gPDwgMSA6IDA7Ci0gICAgICAgICAgICBsaW5lMiA9IChoID4gMCkgPyBwTGluZVstblN0cmlkZV0gOiAwOwotICAgICAgICAgICAgQ09OVEVYVCA9IChsaW5lMSAmIDB4MDM4MCkgfCAoKGxpbmUyID4+IDMpICYgMHgwMDdjKTsKLSAgICAgICAgICAgIGZvcihGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdyArPSA4KSB7Ci0gICAgICAgICAgICAgICAgaWYodyArIDggPCBHQlcpIHsKLSAgICAgICAgICAgICAgICAgICAgbkJpdHMgPSA4OwotICAgICAgICAgICAgICAgICAgICBpZihoID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTEgPSAobGluZTEgPDwgOCkgfCAocExpbmVbLW5TdHJpZGUyICsgKHcgPj4gMykgKyAxXSA8PCAxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZihoID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTIgPSAobGluZTIgPDwgOCkgfCAocExpbmVbLW5TdHJpZGUgKyAodyA+PiAzKSArIDFdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5CaXRzID0gR0JXIC0gdzsKLSAgICAgICAgICAgICAgICAgICAgaWYoaCA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUxIDw8PSA4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmKGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiA8PD0gODsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCBuQml0czsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJWYWwgPSAwOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MDFiZCkgPDwgMSkgfCBiVmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTEgPj4gKDcgLSBrKSkgJiAweDAwODApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTIgPj4gKDEwIC0gaykpICYgMHgwMDA0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcExpbmVbdyA+PiAzXSA9IGNWYWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcExpbmUgKz0gblN0cmlkZTsKLSAgICB9Ci0gICAgcmV0dXJuIEdCUkVHOwotfQotQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl9vcHQzKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKLXsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUOwotICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7Ci0gICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOwotICAgIEZYX0JZVEUgKnBMaW5lLCAqcExpbmUxLCAqcExpbmUyLCBjVmFsOwotICAgIEZYX0lOVDMyIG5TdHJpZGUsIG5TdHJpZGUyLCBrOwotICAgIEZYX0lOVDMyIG5MaW5lQnl0ZXMsIG5CaXRzTGVmdCwgY2M7Ci0gICAgTFRQID0gMDsKLSAgICBKQklHMl9BTExPQyhHQlJFRywgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7Ci0gICAgaWYgKEdCUkVHLT5tX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIEdCUkVHOwotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJHZW5lcmljIHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmU6IENyZWF0ZSBJbWFnZSBGYWlsZWQgd2l0aCB3aWR0aCA9ICVkLCBoZWlnaHQgPSAlZFxuIiwgR0JXLCBHQkgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcExpbmUgPSBHQlJFRy0+bV9wRGF0YTsKLSAgICBuU3RyaWRlID0gR0JSRUctPm1fblN0cmlkZTsKLSAgICBuU3RyaWRlMiA9IG5TdHJpZGUgPDwgMTsKLSAgICBuTGluZUJ5dGVzID0gKChHQlcgKyA3KSA+PiAzKSAtIDE7Ci0gICAgbkJpdHNMZWZ0ID0gR0JXIC0gKG5MaW5lQnl0ZXMgPDwgMyk7Ci0gICAgZm9yKEZYX0RXT1JEIGggPSAwOyBoIDwgR0JIOyBoKyspIHsKLSAgICAgICAgaWYoVFBHRE9OKSB7Ci0gICAgICAgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwMGU1XSk7Ci0gICAgICAgICAgICBMVFAgPSBMVFAgXiBTTFRQOwotICAgICAgICB9Ci0gICAgICAgIGlmKExUUCA9PSAxKSB7Ci0gICAgICAgICAgICBHQlJFRy0+Y29weUxpbmUoaCwgaCAtIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYoaCA+IDEpIHsKLSAgICAgICAgICAgICAgICBwTGluZTEgPSBwTGluZSAtIG5TdHJpZGUyOwotICAgICAgICAgICAgICAgIHBMaW5lMiA9IHBMaW5lIC0gblN0cmlkZTsKLSAgICAgICAgICAgICAgICBsaW5lMSA9ICgqcExpbmUxKyspIDw8IDE7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSAqcExpbmUyKys7Ci0gICAgICAgICAgICAgICAgQ09OVEVYVCA9IChsaW5lMSAmIDB4MDM4MCkgfCAoKGxpbmUyID4+IDMpICYgMHgwMDdjKTsKLSAgICAgICAgICAgICAgICBmb3IoY2MgPSAwOyBjYyA8IG5MaW5lQnl0ZXM7IGNjKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZTEgPSAobGluZTEgPDwgOCkgfCAoKCpwTGluZTErKykgPDwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKCpwTGluZTIrKyk7Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3IoayA9IDc7IGsgPj0gMDsgay0tKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWJkKSA8PCAxKSB8IGJWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTEgPj4gaykgJiAweDAwODApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUyID4+IChrICsgMykpICYgMHgwMDA0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwTGluZVtjY10gPSBjVmFsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lMSA8PD0gODsKLSAgICAgICAgICAgICAgICBsaW5lMiA8PD0gODsKLSAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCBuQml0c0xlZnQ7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MDFiZCkgPDwgMSkgfCBiVmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTEgPj4gKDcgLSBrKSkgJiAweDAwODApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTIgPj4gKDEwIC0gaykpICYgMHgwMDA0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcExpbmVbbkxpbmVCeXRlc10gPSBjVmFsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwTGluZTIgPSBwTGluZSAtIG5TdHJpZGU7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSAoaCAmIDEpID8gKCpwTGluZTIrKykgOiAwOwotICAgICAgICAgICAgICAgIENPTlRFWFQgPSAobGluZTIgPj4gMykgJiAweDAwN2M7Ci0gICAgICAgICAgICAgICAgZm9yKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGggJiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiA9IChsaW5lMiA8PCA4KSB8ICgqcExpbmUyKyspOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3IoayA9IDc7IGsgPj0gMDsgay0tKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWJkKSA8PCAxKSB8IGJWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTIgPj4gKGsgKyAzKSkgJiAweDAwMDQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBMaW5lW2NjXSA9IGNWYWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmUyIDw8PSA4OwotICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWJkKSA8PCAxKSB8IGJWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKCgobGluZTIgPj4gKDEwIC0gaykpKSAmIDB4MDAwNCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBMaW5lW25MaW5lQnl0ZXNdID0gY1ZhbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwTGluZSArPSBuU3RyaWRlOwotICAgIH0KLSAgICByZXR1cm4gR0JSRUc7Ci19Ci1DSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKLXsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUOwotICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7Ci0gICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKLSAgICBMVFAgPSAwOwotICAgIEpCSUcyX0FMTE9DKEdCUkVHLCBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKLSAgICBHQlJFRy0+ZmlsbCgwKTsKLSAgICBmb3IoRlhfRFdPUkQgaCA9IDA7IGggPCBHQkg7IGgrKykgewotICAgICAgICBpZihUUEdET04pIHsKLSAgICAgICAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDAwZTVdKTsKLSAgICAgICAgICAgIExUUCA9IExUUCBeIFNMVFA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTFRQID09IDEpIHsKLSAgICAgICAgICAgIEdCUkVHLT5jb3B5TGluZShoLCBoIC0gMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaW5lMSA9IEdCUkVHLT5nZXRQaXhlbCgxLCBoIC0gMik7Ci0gICAgICAgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDIpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lMiA9IEdCUkVHLT5nZXRQaXhlbCgxLCBoIC0gMSk7Ci0gICAgICAgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lMyA9IDA7Ci0gICAgICAgICAgICBmb3IoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcrKykgewotICAgICAgICAgICAgICAgIGlmKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IGxpbmUzOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgaCArIEdCQVRbMV0pIDw8IDI7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgMzsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA3OwotICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihiVmFsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEdCUkVHLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZTEgPSAoKGxpbmUxIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAyLCBoIC0gMikpICYgMHgwNzsKLSAgICAgICAgICAgICAgICBsaW5lMiA9ICgobGluZTIgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIGggLSAxKSkgJiAweDBmOwotICAgICAgICAgICAgICAgIGxpbmUzID0gKChsaW5lMyA8PCAxKSB8IGJWYWwpICYgMHgwMzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gR0JSRUc7Ci19Ci1DSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX29wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpCi17Ci0gICAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7Ci0gICAgRlhfRFdPUkQgQ09OVEVYVDsKLSAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwotICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKLSAgICBMVFAgPSAwOwotICAgIEpCSUcyX0FMTE9DKEdCUkVHLCBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKLSAgICBHQlJFRy0+ZmlsbCgwKTsKLSAgICBmb3IoRlhfRFdPUkQgaCA9IDA7IGggPCBHQkg7IGgrKykgewotICAgICAgICBpZihUUEdET04pIHsKLSAgICAgICAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDAxOTVdKTsKLSAgICAgICAgICAgIExUUCA9IExUUCBeIFNMVFA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTFRQID09IDEpIHsKLSAgICAgICAgICAgIEdCUkVHLT5jb3B5TGluZShoLCBoIC0gMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaW5lMSA9IEdCUkVHLT5nZXRQaXhlbCgyLCBoIC0gMSk7Ci0gICAgICAgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDEpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDI7Ci0gICAgICAgICAgICBsaW5lMiA9IDA7Ci0gICAgICAgICAgICBmb3IoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcrKykgewotICAgICAgICAgICAgICAgIGlmKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IGxpbmUyOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDQ7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKGJWYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgR0JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDMsIGggLSAxKSkgJiAweDNmOwotICAgICAgICAgICAgICAgIGxpbmUyID0gKChsaW5lMiA8PCAxKSB8IGJWYWwpICYgMHgwZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gR0JSRUc7Ci19Ci1DSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX29wdDIoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQotewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOwotICAgIEZYX0RXT1JEIENPTlRFWFQ7Ci0gICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKLSAgICBGWF9EV09SRCBsaW5lMTsKLSAgICBGWF9CWVRFICpwTGluZSwgY1ZhbDsKLSAgICBGWF9JTlRQVFIgblN0cmlkZTsKLSAgICBGWF9JTlQzMiBuQml0cywgazsKLSAgICBMVFAgPSAwOwotICAgIEpCSUcyX0FMTE9DKEdCUkVHLCBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKLSAgICBpZiAoR0JSRUctPm1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICBkZWxldGUgR0JSRUc7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoIkdlbmVyaWMgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZTogQ3JlYXRlIEltYWdlIEZhaWxlZCB3aXRoIHdpZHRoID0gJWQsIGhlaWdodCA9ICVkXG4iLCBHQlcsIEdCSCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBwTGluZSA9IEdCUkVHLT5tX3BEYXRhOwotICAgIG5TdHJpZGUgPSBHQlJFRy0+bV9uU3RyaWRlOwotICAgIGZvcihGWF9EV09SRCBoID0gMDsgaCA8IEdCSDsgaCsrKSB7Ci0gICAgICAgIGlmKFRQR0RPTikgewotICAgICAgICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDE5NV0pOwotICAgICAgICAgICAgTFRQID0gTFRQIF4gU0xUUDsKLSAgICAgICAgfQotICAgICAgICBpZihMVFAgPT0gMSkgewotICAgICAgICAgICAgR0JSRUctPmNvcHlMaW5lKGgsIGggLSAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxpbmUxID0gKGggPiAwKSA/IHBMaW5lWy1uU3RyaWRlXSA6IDA7Ci0gICAgICAgICAgICBDT05URVhUID0gKGxpbmUxID4+IDEpICYgMHgwM2YwOwotICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3ICs9IDgpIHsKLSAgICAgICAgICAgICAgICBpZih3ICsgOCA8IEdCVykgewotICAgICAgICAgICAgICAgICAgICBuQml0cyA9IDg7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSA9IChsaW5lMSA8PCA4KSB8IChwTGluZVstblN0cmlkZSArICh3ID4+IDMpICsgMV0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbkJpdHMgPSBHQlcgLSB3OwotICAgICAgICAgICAgICAgICAgICBpZihoID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTEgPDw9IDg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY1ZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yKGsgPSAwOyBrIDwgbkJpdHM7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBpZihVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxZjcpIDw8IDEpIHwgYlZhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUxID4+ICg4IC0gaykpICYgMHgwMDEwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcExpbmVbdyA+PiAzXSA9IGNWYWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcExpbmUgKz0gblN0cmlkZTsKLSAgICB9Ci0gICAgcmV0dXJuIEdCUkVHOwotfQotQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlM19vcHQzKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKLXsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUOwotICAgIENKQmlnMl9JbWFnZSAqR0JSRUc7Ci0gICAgRlhfRFdPUkQgbGluZTE7Ci0gICAgRlhfQllURSAqcExpbmUsICpwTGluZTEsIGNWYWw7Ci0gICAgRlhfSU5UMzIgblN0cmlkZSwgazsKLSAgICBGWF9JTlQzMiBuTGluZUJ5dGVzLCBuQml0c0xlZnQsIGNjOwotICAgIExUUCA9IDA7Ci0gICAgSkJJRzJfQUxMT0MoR0JSRUcsIENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOwotICAgIGlmIChHQlJFRy0+bV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBHQlJFRzsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiR2VuZXJpYyByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlOiBDcmVhdGUgSW1hZ2UgRmFpbGVkIHdpdGggd2lkdGggPSAlZCwgaGVpZ2h0ID0gJWRcbiIsIEdCVywgR0JIKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHBMaW5lID0gR0JSRUctPm1fcERhdGE7Ci0gICAgblN0cmlkZSA9IEdCUkVHLT5tX25TdHJpZGU7Ci0gICAgbkxpbmVCeXRlcyA9ICgoR0JXICsgNykgPj4gMykgLSAxOwotICAgIG5CaXRzTGVmdCA9IEdCVyAtIChuTGluZUJ5dGVzIDw8IDMpOwotICAgIGZvcihGWF9EV09SRCBoID0gMDsgaCA8IEdCSDsgaCsrKSB7Ci0gICAgICAgIGlmKFRQR0RPTikgewotICAgICAgICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDE5NV0pOwotICAgICAgICAgICAgTFRQID0gTFRQIF4gU0xUUDsKLSAgICAgICAgfQotICAgICAgICBpZihMVFAgPT0gMSkgewotICAgICAgICAgICAgR0JSRUctPmNvcHlMaW5lKGgsIGggLSAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmKGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgcExpbmUxID0gcExpbmUgLSBuU3RyaWRlOwotICAgICAgICAgICAgICAgIGxpbmUxID0gKnBMaW5lMSsrOwotICAgICAgICAgICAgICAgIENPTlRFWFQgPSAobGluZTEgPj4gMSkgJiAweDAzZjA7Ci0gICAgICAgICAgICAgICAgZm9yKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwgKCpwTGluZTErKyk7Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3IoayA9IDc7IGsgPj0gMDsgay0tKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWY3KSA8PCAxKSB8IGJWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTEgPj4gKGsgKyAxKSkgJiAweDAwMTApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBMaW5lW2NjXSA9IGNWYWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmUxIDw8PSA4OwotICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWY3KSA8PCAxKSB8IGJWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMSA+PiAoOCAtIGspKSAmIDB4MDAxMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBMaW5lW25MaW5lQnl0ZXNdID0gY1ZhbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQ09OVEVYVCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3IoayA9IDc7IGsgPj0gMDsgay0tKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWY3KSA8PCAxKSB8IGJWYWw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcExpbmVbY2NdID0gY1ZhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY1ZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yKGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxZjcpIDw8IDEpIHwgYlZhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcExpbmVbbkxpbmVCeXRlc10gPSBjVmFsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBMaW5lICs9IG5TdHJpZGU7Ci0gICAgfQotICAgIHJldHVybiBHQlJFRzsKLX0KLUNKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfdW5vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQotewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOwotICAgIEZYX0RXT1JEIENPTlRFWFQ7Ci0gICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKLSAgICBGWF9EV09SRCBsaW5lMSwgbGluZTI7Ci0gICAgTFRQID0gMDsKLSAgICBKQklHMl9BTExPQyhHQlJFRywgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7Ci0gICAgR0JSRUctPmZpbGwoMCk7Ci0gICAgZm9yKEZYX0RXT1JEIGggPSAwOyBoIDwgR0JIOyBoKyspIHsKLSAgICAgICAgaWYoVFBHRE9OKSB7Ci0gICAgICAgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwMTk1XSk7Ci0gICAgICAgICAgICBMVFAgPSBMVFAgXiBTTFRQOwotICAgICAgICB9Ci0gICAgICAgIGlmKExUUCA9PSAxKSB7Ci0gICAgICAgICAgICBHQlJFRy0+Y29weUxpbmUoaCwgaCAtIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGluZTEgPSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDEpOwotICAgICAgICAgICAgbGluZTEgfD0gR0JSRUctPmdldFBpeGVsKDAsIGggLSAxKSA8PCAxOwotICAgICAgICAgICAgbGluZTIgPSAwOwotICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKLSAgICAgICAgICAgICAgICBpZihVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSBsaW5lMjsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIGggKyBHQkFUWzFdKSA8PCA0OwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDU7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKGJWYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgR0JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIGggLSAxKSkgJiAweDFmOwotICAgICAgICAgICAgICAgIGxpbmUyID0gKChsaW5lMiA8PCAxKSB8IGJWYWwpICYgMHgwZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gR0JSRUc7Ci19Ci1DSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVjIoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KQotewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOwotICAgIEZYX0RXT1JEIENPTlRFWFQ7Ci0gICAgQ0pCaWcyX0ltYWdlICpHQlJFRzsKLSAgICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzOwotICAgIExUUCA9IDA7Ci0gICAgSkJJRzJfQUxMT0MoR0JSRUcsIENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOwotICAgIEdCUkVHLT5maWxsKDApOwotICAgIGZvcihGWF9EV09SRCBoID0gMDsgaCA8IEdCSDsgaCsrKSB7Ci0gICAgICAgIGlmKFRQR0RPTikgewotICAgICAgICAgICAgc3dpdGNoKEdCVEVNUExBVEUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAweDliMjU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IDB4MDc5NTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gMHgwMGU1OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAweDAxOTU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgIExUUCA9IExUUCBeIFNMVFA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTFRQID09IDEpIHsKLSAgICAgICAgICAgIEdCUkVHLT5jb3B5TGluZShoLCBoIC0gMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzd2l0Y2goR0JURU1QTEFURSkgewotICAgICAgICAgICAgICAgIGNhc2UgMDogewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTEgPSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTEgfD0gR0JSRUctPmdldFBpeGVsKDAsIGggLSAyKSA8PCAxOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTIgPSBHQlJFRy0+Z2V0UGl4ZWwoMiwgaCAtIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTIgfD0gR0JSRUctPmdldFBpeGVsKDEsIGggLSAxKSA8PCAxOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTIgfD0gR0JSRUctPmdldFBpeGVsKDAsIGggLSAxKSA8PCAyOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWYWwgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSBsaW5lMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIGggKyBHQkFUWzFdKSA8PCA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzJdLCBoICsgR0JBVFszXSkgPDwgMTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzRdLCBoICsgR0JBVFs1XSkgPDwgMTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgMTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzZdLCBoICsgR0JBVFs3XSkgPDwgMTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJWYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIGggLSAyKSkgJiAweDA3OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyID0gKChsaW5lMiA8PCAxKSB8IEdCUkVHLT5nZXRQaXhlbCh3ICsgMywgaCAtIDEpKSAmIDB4MWY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTMgPSAoKGxpbmUzIDw8IDEpIHwgYlZhbCkgJiAweDBmOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMTogewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTEgPSBHQlJFRy0+Z2V0UGl4ZWwoMiwgaCAtIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTEgfD0gR0JSRUctPmdldFBpeGVsKDEsIGggLSAyKSA8PCAxOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTEgfD0gR0JSRUctPmdldFBpeGVsKDAsIGggLSAyKSA8PCAyOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTIgPSBHQlJFRy0+Z2V0UGl4ZWwoMiwgaCAtIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTIgfD0gR0JSRUctPmdldFBpeGVsKDEsIGggLSAxKSA8PCAxOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTIgfD0gR0JSRUctPmdldFBpeGVsKDAsIGggLSAxKSA8PCAyOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWYWwgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSBsaW5lMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIGggKyBHQkFUWzFdKSA8PCAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgOTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYlZhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgaCwgYlZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUxID0gKChsaW5lMSA8PCAxKSB8IEdCUkVHLT5nZXRQaXhlbCh3ICsgMywgaCAtIDIpKSAmIDB4MGY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAzLCBoIC0gMSkpICYgMHgxZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfCBiVmFsKSAmIDB4MDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSA9IEdCUkVHLT5nZXRQaXhlbCgxLCBoIC0gMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDIpIDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiA9IEdCUkVHLT5nZXRQaXhlbCgxLCBoIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IGxpbmUzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgaCArIEdCQVRbMV0pIDw8IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA3OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihiVmFsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdCUkVHLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTEgPSAoKGxpbmUxIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAyLCBoIC0gMikpICYgMHgwNzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiA9ICgobGluZTIgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIGggLSAxKSkgJiAweDBmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUzID0gKChsaW5lMyA8PCAxKSB8IGJWYWwpICYgMHgwMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDM6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUxID0gR0JSRUctPmdldFBpeGVsKDEsIGggLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUxIHw9IEdCUkVHLT5nZXRQaXhlbCgwLCBoIC0gMSkgPDwgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoVVNFU0tJUCAmJiBTS0lQLT5nZXRQaXhlbCh3LCBoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gbGluZTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBoICsgR0JBVFsxXSkgPDwgNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihiVmFsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdCUkVHLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTEgPSAoKGxpbmUxIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAyLCBoIC0gMSkpICYgMHgxZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiA9ICgobGluZTIgPDwgMSkgfCBiVmFsKSAmIDB4MGY7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEdCUkVHOwotfQotQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1YxKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCkKLXsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUID0gMDsKLSAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHOwotICAgIExUUCA9IDA7Ci0gICAgSkJJRzJfQUxMT0MoR0JSRUcsIENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOwotICAgIEdCUkVHLT5maWxsKDApOwotICAgIGZvcihGWF9EV09SRCBoID0gMDsgaCA8IEdCSDsgaCsrKSB7Ci0gICAgICAgIGlmKFRQR0RPTikgewotICAgICAgICAgICAgc3dpdGNoKEdCVEVNUExBVEUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAweDliMjU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IDB4MDc5NTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gMHgwMGU1OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAweDAxOTU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgIExUUCA9IExUUCBeIFNMVFA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTFRQID09IDEpIHsKLSAgICAgICAgICAgIGZvcihGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdysrKSB7Ci0gICAgICAgICAgICAgICAgR0JSRUctPnNldFBpeGVsKHcsIGgsIEdCUkVHLT5nZXRQaXhlbCh3LCBoIC0gMSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKLSAgICAgICAgICAgICAgICBpZihVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEdCUkVHLT5zZXRQaXhlbCh3LCBoLCAwKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gMDsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKEdCVEVNUExBVEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMSwgaCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDIsIGgpIDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDMsIGgpIDw8IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDQsIGgpIDw8IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIGggKyBHQkFUWzFdKSA8PCA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyAyLCBoIC0gMSkgPDwgNTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgMSwgaCAtIDEpIDw8IDY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodywgaCAtIDEpIDw8IDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDEsIGggLSAxKSA8PCA4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAyLCBoIC0gMSkgPDwgOTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFsyXSwgaCArIEdCQVRbM10pIDw8IDEwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzRdLCBoICsgR0JBVFs1XSkgPDwgMTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIDEsIGggLSAyKSA8PCAxMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3LCBoIC0gMikgPDwgMTM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDEsIGggLSAyKSA8PCAxNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFs2XSwgaCArIEdCQVRbN10pIDw8IDE1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAxLCBoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMiwgaCkgPDwgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMywgaCkgPDwgMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgaCArIEdCQVRbMV0pIDw8IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIGggLSAxKSA8PCA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyAxLCBoIC0gMSkgPDwgNTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3LCBoIC0gMSkgPDwgNjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMSwgaCAtIDEpIDw8IDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDIsIGggLSAxKSA8PCA4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyAyLCBoIC0gMikgPDwgOTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgMSwgaCAtIDIpIDw8IDEwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcsIGggLSAyKSA8PCAxMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMSwgaCAtIDIpIDw8IDEyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAxLCBoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMiwgaCkgPDwgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgaCArIEdCQVRbMV0pIDw8IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIDEsIGggLSAxKSA8PCAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcsIGggLSAxKSA8PCA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAxLCBoIC0gMSkgPDwgNTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMiwgaCAtIDEpIDw8IDY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIDEsIGggLSAyKSA8PCA3OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcsIGggLSAyKSA8PCA4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAxLCBoIC0gMikgPDwgOTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMSwgaCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDIsIGgpIDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDMsIGgpIDw8IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDQsIGgpIDw8IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIGggKyBHQkFUWzFdKSA8PCA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyAxLCBoIC0gMSkgPDwgNTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3LCBoIC0gMSkgPDwgNjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMSwgaCAtIDEpIDw8IDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDIsIGggLSAxKSA8PCA4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAzLCBoIC0gMSkgPDwgOTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgaCwgYlZhbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBHQlJFRzsKLX0KLUNKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9NTVIoQ0pCaWcyX0JpdFN0cmVhbSAqcFN0cmVhbSkKLXsKLSAgICBpbnQgYml0cG9zLCBpOwotICAgIENKQmlnMl9JbWFnZSAqcEltYWdlOwotICAgIEpCSUcyX0FMTE9DKHBJbWFnZSwgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7Ci0gICAgaWYgKHBJbWFnZS0+bV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBwSW1hZ2U7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoIkdlbmVyaWMgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZTogQ3JlYXRlIEltYWdlIEZhaWxlZCB3aXRoIHdpZHRoID0gJWQsIGhlaWdodCA9ICVkXG4iLCBHQlcsIEdCSCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBiaXRwb3MgPSAoaW50KXBTdHJlYW0tPmdldEJpdFBvcygpOwotICAgIF9GYXhHNERlY29kZShtX3BNb2R1bGUsIHBTdHJlYW0tPmdldEJ1ZigpLCBwU3RyZWFtLT5nZXRMZW5ndGgoKSwgJmJpdHBvcywgcEltYWdlLT5tX3BEYXRhLCBHQlcsIEdCSCwgcEltYWdlLT5tX25TdHJpZGUpOwotICAgIHBTdHJlYW0tPnNldEJpdFBvcyhiaXRwb3MpOwotICAgIGZvcihpID0gMDsgKEZYX0RXT1JEKWkgPCBwSW1hZ2UtPm1fblN0cmlkZSAqIEdCSDsgaSsrKSB7Ci0gICAgICAgIHBJbWFnZS0+bV9wRGF0YVtpXSA9IH5wSW1hZ2UtPm1fcERhdGFbaV07Ci0gICAgfQotICAgIHJldHVybiBwSW1hZ2U7Ci19Ci1DSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUlJEUHJvYzo6ZGVjb2RlKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdyQ29udGV4dCkKLXsKLSAgICBpZiAoR1JXID09IDAgfHwgR1JIID09IDApIHsKLSAgICAgICAgQ0pCaWcyX0ltYWdlKiBwSW1hZ2U7Ci0gICAgICAgIEpCSUcyX0FMTE9DKHBJbWFnZSwgQ0pCaWcyX0ltYWdlKEdSVywgR1JIKSk7Ci0gICAgICAgIHJldHVybiBwSW1hZ2U7Ci0gICAgfQotICAgIGlmKEdSVEVNUExBVEUgPT0gMCkgewotICAgICAgICBpZigoR1JBVFswXSA9PSAoc2lnbmVkIGNoYXIpIC0gMSkgJiYgKEdSQVRbMV0gPT0gKHNpZ25lZCBjaGFyKSAtIDEpCi0gICAgICAgICAgICAgICAgJiYgKEdSQVRbMl0gPT0gKHNpZ25lZCBjaGFyKSAtIDEpICYmIChHUkFUWzNdID09IChzaWduZWQgY2hhcikgLSAxKQotICAgICAgICAgICAgICAgICYmIChHUlJFRkVSRU5DRURYID09IDApICYmIChHUlcgPT0gKEZYX0RXT1JEKUdSUkVGRVJFTkNFLT5tX25XaWR0aCkpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWNvZGVfVGVtcGxhdGUwX29wdChwQXJpdGhEZWNvZGVyLCBnckNvbnRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGRlY29kZV9UZW1wbGF0ZTBfdW5vcHQocEFyaXRoRGVjb2RlciwgZ3JDb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKChHUlJFRkVSRU5DRURYID09IDApICYmIChHUlcgPT0gKEZYX0RXT1JEKUdSUkVGRVJFTkNFLT5tX25XaWR0aCkpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWNvZGVfVGVtcGxhdGUxX29wdChwQXJpdGhEZWNvZGVyLCBnckNvbnRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGRlY29kZV9UZW1wbGF0ZTFfdW5vcHQocEFyaXRoRGVjb2RlciwgZ3JDb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLX0KLUNKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSUkRQcm9jOjpkZWNvZGVfVGVtcGxhdGUwX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdyQ29udGV4dCkKLXsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUOwotICAgIENKQmlnMl9JbWFnZSAqR1JSRUc7Ci0gICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMywgbGluZTQsIGxpbmU1OwotICAgIExUUCA9IDA7Ci0gICAgSkJJRzJfQUxMT0MoR1JSRUcsIENKQmlnMl9JbWFnZShHUlcsIEdSSCkpOwotICAgIEdSUkVHLT5maWxsKDApOwotICAgIGZvcihGWF9EV09SRCBoID0gMDsgaCA8IEdSSDsgaCsrKSB7Ci0gICAgICAgIGlmKFRQR1JPTikgewotICAgICAgICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ3JDb250ZXh0WzB4MDAxMF0pOwotICAgICAgICAgICAgTFRQID0gTFRQIF4gU0xUUDsKLSAgICAgICAgfQotICAgICAgICBpZihMVFAgPT0gMCkgewotICAgICAgICAgICAgbGluZTEgPSBHUlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDEpOwotICAgICAgICAgICAgbGluZTEgfD0gR1JSRUctPmdldFBpeGVsKDAsIGggLSAxKSA8PCAxOwotICAgICAgICAgICAgbGluZTIgPSAwOwotICAgICAgICAgICAgbGluZTMgPSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggKyAxLCBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpOwotICAgICAgICAgICAgbGluZTMgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lNCA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZKTsKLSAgICAgICAgICAgIGxpbmU0IHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lNCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggLSAxLCBoIC0gR1JSRUZFUkVOQ0VEWSkgPDwgMjsKLSAgICAgICAgICAgIGxpbmU1ID0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYICsgMSwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKTsKLSAgICAgICAgICAgIGxpbmU1IHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKSA8PCAxOwotICAgICAgICAgICAgbGluZTUgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYIC0gMSwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKSA8PCAyOwotICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR1JXOyB3KyspIHsKLSAgICAgICAgICAgICAgICBDT05URVhUID0gbGluZTU7Ci0gICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lNCA8PCAzOwotICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTMgPDwgNjsKLSAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIEdSQVRbMl0sIGggLSBHUlJFRkVSRU5DRURZICsgR1JBVFszXSkgPDwgODsKLSAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDk7Ci0gICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCAxMDsKLSAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVHLT5nZXRQaXhlbCh3ICsgR1JBVFswXSwgaCArIEdSQVRbMV0pIDw8IDEyOwotICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgR1JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOwotICAgICAgICAgICAgICAgIGxpbmUxID0gKChsaW5lMSA8PCAxKSB8IEdSUkVHLT5nZXRQaXhlbCh3ICsgMiwgaCAtIDEpKSAmIDB4MDM7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgYlZhbCkgJiAweDAxOwotICAgICAgICAgICAgICAgIGxpbmUzID0gKChsaW5lMyA8PCAxKSB8IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIDIsIGggLSBHUlJFRkVSRU5DRURZIC0gMSkpICYgMHgwMzsKLSAgICAgICAgICAgICAgICBsaW5lNCA9ICgobGluZTQgPDwgMSkgfCBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAyLCBoIC0gR1JSRUZFUkVOQ0VEWSkpICYgMHgwNzsKLSAgICAgICAgICAgICAgICBsaW5lNSA9ICgobGluZTUgPDwgMSkgfCBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAyLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpKSAmIDB4MDc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaW5lMSA9IEdSUkVHLT5nZXRQaXhlbCgxLCBoIC0gMSk7Ci0gICAgICAgICAgICBsaW5lMSB8PSBHUlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lMiA9IDA7Ci0gICAgICAgICAgICBsaW5lMyA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZIC0gMSk7Ci0gICAgICAgICAgICBsaW5lMyB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZIC0gMSkgPDwgMTsKLSAgICAgICAgICAgIGxpbmU0ID0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYICsgMSwgaCAtIEdSUkVGRVJFTkNFRFkpOwotICAgICAgICAgICAgbGluZTQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSkgPDwgMTsKLSAgICAgICAgICAgIGxpbmU0IHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCAtIDEsIGggLSBHUlJFRkVSRU5DRURZKSA8PCAyOwotICAgICAgICAgICAgbGluZTUgPSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggKyAxLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpOwotICAgICAgICAgICAgbGluZTUgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lNSB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggLSAxLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpIDw8IDI7Ci0gICAgICAgICAgICBmb3IoRlhfRFdPUkQgdyA9IDA7IHcgPCBHUlc7IHcrKykgewotICAgICAgICAgICAgICAgIGJWYWwgPSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodywgaCk7Ci0gICAgICAgICAgICAgICAgaWYoIShUUEdST04gJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSAxLCBoIC0gMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodywgaCAtIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyAxLCBoIC0gMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIDEsIGgpKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyAxLCBoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gMSwgaCArIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcsIGggKyAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgMSwgaCArIDEpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IGxpbmU1OwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmU0IDw8IDM7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTMgPDwgNjsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyBHUkFUWzJdLCBoIC0gR1JSRUZFUkVOQ0VEWSArIEdSQVRbM10pIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgOTsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCAxMDsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRy0+Z2V0UGl4ZWwodyArIEdSQVRbMF0sIGggKyBHUkFUWzFdKSA8PCAxMjsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ3JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgR1JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOwotICAgICAgICAgICAgICAgIGxpbmUxID0gKChsaW5lMSA8PCAxKSB8IEdSUkVHLT5nZXRQaXhlbCh3ICsgMiwgaCAtIDEpKSAmIDB4MDM7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgYlZhbCkgJiAweDAxOwotICAgICAgICAgICAgICAgIGxpbmUzID0gKChsaW5lMyA8PCAxKSB8IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIDIsIGggLSBHUlJFRkVSRU5DRURZIC0gMSkpICYgMHgwMzsKLSAgICAgICAgICAgICAgICBsaW5lNCA9ICgobGluZTQgPDwgMSkgfCBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAyLCBoIC0gR1JSRUZFUkVOQ0VEWSkpICYgMHgwNzsKLSAgICAgICAgICAgICAgICBsaW5lNSA9ICgobGluZTUgPDwgMSkgfCBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAyLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpKSAmIDB4MDc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEdSUkVHOwotfQotQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JSRFByb2M6OmRlY29kZV9UZW1wbGF0ZTBfb3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdyQ29udGV4dCkKLXsKLSAgICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUOwotICAgIENKQmlnMl9JbWFnZSAqR1JSRUc7Ci0gICAgRlhfRFdPUkQgbGluZTEsIGxpbmUxX3IsIGxpbmUyX3IsIGxpbmUzX3I7Ci0gICAgRlhfQllURSAqcExpbmUsICpwTGluZVIsIGNWYWw7Ci0gICAgRlhfSU5UUFRSIG5TdHJpZGUsIG5TdHJpZGVSLCBuT2Zmc2V0OwotICAgIEZYX0lOVDMyIGssIG5CaXRzOwotICAgIEZYX0lOVDMyIEdSV1IsIEdSSFI7Ci0gICAgRlhfSU5UMzIgR1JXLCBHUkg7Ci0gICAgR1JXID0gKEZYX0lOVDMyKUNKQmlnMl9HUlJEUHJvYzo6R1JXOwotICAgIEdSSCA9IChGWF9JTlQzMilDSkJpZzJfR1JSRFByb2M6OkdSSDsKLSAgICBMVFAgPSAwOwotICAgIEpCSUcyX0FMTE9DKEdSUkVHLCBDSkJpZzJfSW1hZ2UoR1JXLCBHUkgpKTsKLSAgICBpZiAoR1JSRUctPm1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICBkZWxldGUgR1JSRUc7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoIkdlbmVyaWMgcmVmaW5lbWVudCByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlOiBDcmVhdGUgSW1hZ2UgRmFpbGVkIHdpdGggd2lkdGggPSAlZCwgaGVpZ2h0ID0gJWRcbiIsIEdSVywgR1JIKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHBMaW5lID0gR1JSRUctPm1fcERhdGE7Ci0gICAgcExpbmVSID0gR1JSRUZFUkVOQ0UtPm1fcERhdGE7Ci0gICAgblN0cmlkZSA9IEdSUkVHLT5tX25TdHJpZGU7Ci0gICAgblN0cmlkZVIgPSBHUlJFRkVSRU5DRS0+bV9uU3RyaWRlOwotICAgIEdSV1IgPSAoRlhfSU5UMzIpR1JSRUZFUkVOQ0UtPm1fbldpZHRoOwotICAgIEdSSFIgPSAoRlhfSU5UMzIpR1JSRUZFUkVOQ0UtPm1fbkhlaWdodDsKLSAgICBpZiAoR1JSRUZFUkVOQ0VEWSA8IC1HUkhSICsgMSB8fCBHUlJFRkVSRU5DRURZID4gR1JIUiAtIDEpIHsKLSAgICAgICAgR1JSRUZFUkVOQ0VEWSA9IDA7Ci0gICAgfQotICAgIG5PZmZzZXQgPSAtR1JSRUZFUkVOQ0VEWSAqIG5TdHJpZGVSOwotICAgIGZvciAoRlhfSU5UMzIgaCA9IDA7IGggPCBHUkg7IGgrKykgewotICAgICAgICBpZihUUEdST04pIHsKLSAgICAgICAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFsweDAwMTBdKTsKLSAgICAgICAgICAgIExUUCA9IExUUCBeIFNMVFA7Ci0gICAgICAgIH0KLSAgICAgICAgbGluZTEgPSAoaCA+IDApID8gcExpbmVbLW5TdHJpZGVdIDw8IDQgOiAwOwotICAgICAgICBGWF9JTlQzMiByZWZlcmVuY2VfaCA9IGggLSBHUlJFRkVSRU5DRURZOwotICAgICAgICBGWF9CT09MIGxpbmUxX3Jfb2sgPSAocmVmZXJlbmNlX2ggPiAwICYmIHJlZmVyZW5jZV9oIDwgR1JIUiArIDEpOwotICAgICAgICBGWF9CT09MIGxpbmUyX3Jfb2sgPSAocmVmZXJlbmNlX2ggPiAtMSAmJiByZWZlcmVuY2VfaCA8IEdSSFIpOwotICAgICAgICBGWF9CT09MIGxpbmUzX3Jfb2sgPSAocmVmZXJlbmNlX2ggPiAtMiAmJiByZWZlcmVuY2VfaCA8IEdSSFIgLSAxKTsKLSAgICAgICAgbGluZTFfciA9IGxpbmUxX3Jfb2sgPyBwTGluZVJbbk9mZnNldCAtIG5TdHJpZGVSXSA6IDA7Ci0gICAgICAgIGxpbmUyX3IgPSBsaW5lMl9yX29rID8gcExpbmVSW25PZmZzZXRdIDogMDsKLSAgICAgICAgbGluZTNfciA9IGxpbmUzX3Jfb2sgPyBwTGluZVJbbk9mZnNldCArIG5TdHJpZGVSXSA6IDA7Ci0gICAgICAgIGlmKExUUCA9PSAwKSB7Ci0gICAgICAgICAgICBDT05URVhUID0gKGxpbmUxICYgMHgxYzAwKSB8IChsaW5lMV9yICYgMHgwMWMwKQotICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMl9yID4+IDMpICYgMHgwMDM4KSB8ICgobGluZTNfciA+PiA2KSAmIDB4MDAwNyk7Ci0gICAgICAgICAgICBmb3IgKEZYX0lOVDMyIHcgPSAwOyB3IDwgR1JXOyB3ICs9IDgpIHsKLSAgICAgICAgICAgICAgICBuQml0cyA9IEdSVyAtIHcgPiA4ID8gOCA6IEdSVyAtIHc7Ci0gICAgICAgICAgICAgICAgaWYgKGggPiAwKQotICAgICAgICAgICAgICAgICAgICBsaW5lMSA9IChsaW5lMSA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHcgKyA4IDwgR1JXID8gcExpbmVbLW5TdHJpZGUgKyAodyA+PiAzKSArIDFdIDw8IDQgOiAwKTsKLSAgICAgICAgICAgICAgICBpZiAoaCA+IEdSSFIgKyBHUlJFRkVSRU5DRURZICsgMSkgewotICAgICAgICAgICAgICAgICAgICBsaW5lMV9yID0gMDsKLSAgICAgICAgICAgICAgICAgICAgbGluZTJfciAgPSAwOwotICAgICAgICAgICAgICAgICAgICBsaW5lM19yID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZihsaW5lMV9yX29rKQotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTFfciA9IChsaW5lMV9yIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodyArIDggPCBHUldSID8gcExpbmVSW25PZmZzZXQgLSBuU3RyaWRlUiArICh3ID4+IDMpICsgMV0gOiAwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYobGluZTJfcl9vaykKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyX3IgPSAobGluZTJfciA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHcgKyA4IDwgR1JXUiA/IHBMaW5lUltuT2Zmc2V0ICsgKHcgPj4gMykgKyAxXSA6IDApOwotICAgICAgICAgICAgICAgICAgICBpZihsaW5lM19yX29rKQotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTNfciA9IChsaW5lM19yIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodyArIDggPCBHUldSID8gcExpbmVSW25PZmZzZXQgKyBuU3RyaWRlUiArICh3ID4+IDMpICsgMV0gOiAwKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lM19yID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbkJpdHM7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnckNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MGNkYikgPDwgMSkgfCAoYlZhbCA8PCA5KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGxpbmUxID4+ICg3IC0gaykpICYgMHgwNDAwKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGxpbmUxX3IgPj4gKDcgLSBrKSkgJiAweDAwNDApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobGluZTJfciA+PiAoMTAgLSBrKSkgJiAweDAwMDgpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobGluZTNfciA+PiAoMTMgLSBrKSkgJiAweDAwMDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwTGluZVt3ID4+IDNdID0gY1ZhbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENPTlRFWFQgPSAobGluZTEgJiAweDFjMDApIHwgKGxpbmUxX3IgJiAweDAxYzApCi0gICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUyX3IgPj4gMykgJiAweDAwMzgpIHwgKChsaW5lM19yID4+IDYpICYgMHgwMDA3KTsKLSAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgdyA9IDA7IHcgPCBHUlc7IHcgKz0gOCkgewotICAgICAgICAgICAgICAgIG5CaXRzID0gR1JXIC0gdyA+IDggPyA4IDogR1JXIC0gdzsKLSAgICAgICAgICAgICAgICBpZiAoaCA+IDApCi0gICAgICAgICAgICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodyArIDggPCBHUlcgPyBwTGluZVstblN0cmlkZSArICh3ID4+IDMpICsgMV0gPDwgNCA6IDApOwotICAgICAgICAgICAgICAgIGlmKGxpbmUxX3Jfb2spCi0gICAgICAgICAgICAgICAgICAgIGxpbmUxX3IgPSAobGluZTFfciA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodyArIDggPCBHUldSID8gcExpbmVSW25PZmZzZXQgLSBuU3RyaWRlUiArICh3ID4+IDMpICsgMV0gOiAwKTsKLSAgICAgICAgICAgICAgICBpZihsaW5lMl9yX29rKQotICAgICAgICAgICAgICAgICAgICBsaW5lMl9yID0gKGxpbmUyX3IgPDwgOCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHcgKyA4IDwgR1JXUiA/IHBMaW5lUltuT2Zmc2V0ICsgKHcgPj4gMykgKyAxXSA6IDApOwotICAgICAgICAgICAgICAgIGlmKGxpbmUzX3Jfb2spCi0gICAgICAgICAgICAgICAgICAgIGxpbmUzX3IgPSAobGluZTNfciA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodyArIDggPCBHUldSID8gcExpbmVSW25PZmZzZXQgKyBuU3RyaWRlUiArICh3ID4+IDMpICsgMV0gOiAwKTsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZTNfciA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBuQml0czsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIGssIGgpOwotICAgICAgICAgICAgICAgICAgICBpZighKFRQR1JPTiAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIGsgLSAxLCBoIC0gMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrLCBoIC0gMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrICsgMSwgaCAtIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgayAtIDEsIGgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgayArIDEsIGgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgayAtIDEsIGggKyAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIGssIGggKyAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIGsgKyAxLCBoICsgMSkpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ3JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MGNkYikgPDwgMSkgfCAoYlZhbCA8PCA5KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGxpbmUxID4+ICg3IC0gaykpICYgMHgwNDAwKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGxpbmUxX3IgPj4gKDcgLSBrKSkgJiAweDAwNDApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobGluZTJfciA+PiAoMTAgLSBrKSkgJiAweDAwMDgpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobGluZTNfciA+PiAoMTMgLSBrKSkgJiAweDAwMDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwTGluZVt3ID4+IDNdID0gY1ZhbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwTGluZSArPSBuU3RyaWRlOwotICAgICAgICBpZiAoaCA8IEdSSFIgKyBHUlJFRkVSRU5DRURZKSB7Ci0gICAgICAgICAgICBwTGluZVIgKz0gblN0cmlkZVI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEdSUkVHOwotfQotQ0pCaWcyX0ltYWdlICpDSkJpZzJfR1JSRFByb2M6OmRlY29kZV9UZW1wbGF0ZTFfdW5vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ3JDb250ZXh0KQotewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOwotICAgIEZYX0RXT1JEIENPTlRFWFQ7Ci0gICAgQ0pCaWcyX0ltYWdlICpHUlJFRzsKLSAgICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzLCBsaW5lNCwgbGluZTU7Ci0gICAgTFRQID0gMDsKLSAgICBKQklHMl9BTExPQyhHUlJFRywgQ0pCaWcyX0ltYWdlKEdSVywgR1JIKSk7Ci0gICAgR1JSRUctPmZpbGwoMCk7Ci0gICAgZm9yKEZYX0RXT1JEIGggPSAwOyBoIDwgR1JIOyBoKyspIHsKLSAgICAgICAgaWYoVFBHUk9OKSB7Ci0gICAgICAgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnckNvbnRleHRbMHgwMDA4XSk7Ci0gICAgICAgICAgICBMVFAgPSBMVFAgXiBTTFRQOwotICAgICAgICB9Ci0gICAgICAgIGlmKExUUCA9PSAwKSB7Ci0gICAgICAgICAgICBsaW5lMSA9IEdSUkVHLT5nZXRQaXhlbCgxLCBoIC0gMSk7Ci0gICAgICAgICAgICBsaW5lMSB8PSBHUlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lMSB8PSBHUlJFRy0+Z2V0UGl4ZWwoLTEsIGggLSAxKSA8PCAyOwotICAgICAgICAgICAgbGluZTIgPSAwOwotICAgICAgICAgICAgbGluZTMgPSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZIC0gMSk7Ci0gICAgICAgICAgICBsaW5lNCA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZKTsKLSAgICAgICAgICAgIGxpbmU0IHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lNCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggLSAxLCBoIC0gR1JSRUZFUkVOQ0VEWSkgPDwgMjsKLSAgICAgICAgICAgIGxpbmU1ID0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYICsgMSwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKTsKLSAgICAgICAgICAgIGxpbmU1IHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKSA8PCAxOwotICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR1JXOyB3KyspIHsKLSAgICAgICAgICAgICAgICBDT05URVhUID0gbGluZTU7Ci0gICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lNCA8PCAyOwotICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTMgPDwgNTsKLSAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDY7Ci0gICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA3OwotICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgR1JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOwotICAgICAgICAgICAgICAgIGxpbmUxID0gKChsaW5lMSA8PCAxKSB8IEdSUkVHLT5nZXRQaXhlbCh3ICsgMiwgaCAtIDEpKSAmIDB4MDc7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgYlZhbCkgJiAweDAxOwotICAgICAgICAgICAgICAgIGxpbmUzID0gKChsaW5lMyA8PCAxKSB8IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZIC0gMSkpICYgMHgwMTsKLSAgICAgICAgICAgICAgICBsaW5lNCA9ICgobGluZTQgPDwgMSkgfCBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAyLCBoIC0gR1JSRUZFUkVOQ0VEWSkpICYgMHgwNzsKLSAgICAgICAgICAgICAgICBsaW5lNSA9ICgobGluZTUgPDwgMSkgfCBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAyLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpKSAmIDB4MDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaW5lMSA9IEdSUkVHLT5nZXRQaXhlbCgxLCBoIC0gMSk7Ci0gICAgICAgICAgICBsaW5lMSB8PSBHUlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lMSB8PSBHUlJFRy0+Z2V0UGl4ZWwoLTEsIGggLSAxKSA8PCAyOwotICAgICAgICAgICAgbGluZTIgPSAwOwotICAgICAgICAgICAgbGluZTMgPSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZIC0gMSk7Ci0gICAgICAgICAgICBsaW5lNCA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZKTsKLSAgICAgICAgICAgIGxpbmU0IHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lNCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggLSAxLCBoIC0gR1JSRUZFUkVOQ0VEWSkgPDwgMjsKLSAgICAgICAgICAgIGxpbmU1ID0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYICsgMSwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKTsKLSAgICAgICAgICAgIGxpbmU1IHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKSA8PCAxOwotICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR1JXOyB3KyspIHsKLSAgICAgICAgICAgICAgICBiVmFsID0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcsIGgpOwotICAgICAgICAgICAgICAgIGlmKCEoVFBHUk9OICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gMSwgaCAtIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcsIGggLSAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgMSwgaCAtIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSAxLCBoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgMSwgaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIDEsIGggKyAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3LCBoICsgMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIDEsIGggKyAxKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSBsaW5lNTsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lNCA8PCAyOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUzIDw8IDU7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgNjsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA3OwotICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnckNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBHUlJFRy0+c2V0UGl4ZWwodywgaCwgYlZhbCk7Ci0gICAgICAgICAgICAgICAgbGluZTEgPSAoKGxpbmUxIDw8IDEpIHwgR1JSRUctPmdldFBpeGVsKHcgKyAyLCBoIC0gMSkpICYgMHgwNzsKLSAgICAgICAgICAgICAgICBsaW5lMiA9ICgobGluZTIgPDwgMSkgfCBiVmFsKSAmIDB4MDE7Ci0gICAgICAgICAgICAgICAgbGluZTMgPSAoKGxpbmUzIDw8IDEpIHwgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMSwgaCAtIEdSUkVGRVJFTkNFRFkgLSAxKSkgJiAweDAxOwotICAgICAgICAgICAgICAgIGxpbmU0ID0gKChsaW5lNCA8PCAxKSB8IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIDIsIGggLSBHUlJFRkVSRU5DRURZKSkgJiAweDA3OwotICAgICAgICAgICAgICAgIGxpbmU1ID0gKChsaW5lNSA8PCAxKSB8IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIDIsIGggLSBHUlJFRkVSRU5DRURZICsgMSkpICYgMHgwMzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gR1JSRUc7Ci19Ci1DSkJpZzJfSW1hZ2UgKkNKQmlnMl9HUlJEUHJvYzo6ZGVjb2RlX1RlbXBsYXRlMV9vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ3JDb250ZXh0KQotewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOwotICAgIEZYX0RXT1JEIENPTlRFWFQ7Ci0gICAgQ0pCaWcyX0ltYWdlICpHUlJFRzsKLSAgICBGWF9EV09SRCBsaW5lMSwgbGluZTFfciwgbGluZTJfciwgbGluZTNfcjsKLSAgICBGWF9CWVRFICpwTGluZSwgKnBMaW5lUiwgY1ZhbDsKLSAgICBGWF9JTlRQVFIgblN0cmlkZSwgblN0cmlkZVIsIG5PZmZzZXQ7Ci0gICAgRlhfSU5UMzIgaywgbkJpdHM7Ci0gICAgRlhfSU5UMzIgR1JXUiwgR1JIUjsKLSAgICBGWF9JTlQzMiBHUlcsIEdSSDsKLSAgICBHUlcgPSAoRlhfSU5UMzIpQ0pCaWcyX0dSUkRQcm9jOjpHUlc7Ci0gICAgR1JIID0gKEZYX0lOVDMyKUNKQmlnMl9HUlJEUHJvYzo6R1JIOwotICAgIExUUCA9IDA7Ci0gICAgSkJJRzJfQUxMT0MoR1JSRUcsIENKQmlnMl9JbWFnZShHUlcsIEdSSCkpOwotICAgIGlmIChHUlJFRy0+bV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBHUlJFRzsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiR2VuZXJpYyByZWZpbmVtZW50IHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmU6IENyZWF0ZSBJbWFnZSBGYWlsZWQgd2l0aCB3aWR0aCA9ICVkLCBoZWlnaHQgPSAlZFxuIiwgR1JXLCBHUkgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcExpbmUgPSBHUlJFRy0+bV9wRGF0YTsKLSAgICBwTGluZVIgPSBHUlJFRkVSRU5DRS0+bV9wRGF0YTsKLSAgICBuU3RyaWRlID0gR1JSRUctPm1fblN0cmlkZTsKLSAgICBuU3RyaWRlUiA9IEdSUkVGRVJFTkNFLT5tX25TdHJpZGU7Ci0gICAgR1JXUiA9IChGWF9JTlQzMilHUlJFRkVSRU5DRS0+bV9uV2lkdGg7Ci0gICAgR1JIUiA9IChGWF9JTlQzMilHUlJFRkVSRU5DRS0+bV9uSGVpZ2h0OwotICAgIGlmIChHUlJFRkVSRU5DRURZIDwgLUdSSFIgKyAxIHx8IEdSUkVGRVJFTkNFRFkgPiBHUkhSIC0gMSkgewotICAgICAgICBHUlJFRkVSRU5DRURZID0gMDsKLSAgICB9Ci0gICAgbk9mZnNldCA9IC1HUlJFRkVSRU5DRURZICogblN0cmlkZVI7Ci0gICAgZm9yIChGWF9JTlQzMiBoID0gMDsgaCA8IEdSSDsgaCsrKSB7Ci0gICAgICAgIGlmKFRQR1JPTikgewotICAgICAgICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ3JDb250ZXh0WzB4MDAwOF0pOwotICAgICAgICAgICAgTFRQID0gTFRQIF4gU0xUUDsKLSAgICAgICAgfQotICAgICAgICBsaW5lMSA9IChoID4gMCkgPyBwTGluZVstblN0cmlkZV0gPDwgMSA6IDA7Ci0gICAgICAgIEZYX0lOVDMyIHJlZmVyZW5jZV9oID0gaCAtIEdSUkVGRVJFTkNFRFk7Ci0gICAgICAgIEZYX0JPT0wgbGluZTFfcl9vayA9IChyZWZlcmVuY2VfaCA+IDAgJiYgcmVmZXJlbmNlX2ggPCBHUkhSICsgMSk7Ci0gICAgICAgIEZYX0JPT0wgbGluZTJfcl9vayA9IChyZWZlcmVuY2VfaCA+IC0xICYmIHJlZmVyZW5jZV9oIDwgR1JIUik7Ci0gICAgICAgIEZYX0JPT0wgbGluZTNfcl9vayA9IChyZWZlcmVuY2VfaCA+IC0yICYmIHJlZmVyZW5jZV9oIDwgR1JIUiAtIDEpOwotICAgICAgICBsaW5lMV9yID0gbGluZTFfcl9vayA/IHBMaW5lUltuT2Zmc2V0IC0gblN0cmlkZVJdIDogMDsKLSAgICAgICAgbGluZTJfciA9IGxpbmUyX3Jfb2sgPyBwTGluZVJbbk9mZnNldF0gOiAwOwotICAgICAgICBsaW5lM19yID0gbGluZTNfcl9vayA/IHBMaW5lUltuT2Zmc2V0ICsgblN0cmlkZVJdIDogMDsKLSAgICAgICAgaWYoTFRQID09IDApIHsKLSAgICAgICAgICAgIENPTlRFWFQgPSAobGluZTEgJiAweDAzODApIHwgKChsaW5lMV9yID4+IDIpICYgMHgwMDIwKQotICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMl9yID4+IDQpICYgMHgwMDFjKSB8ICgobGluZTNfciA+PiA2KSAmIDB4MDAwMyk7Ci0gICAgICAgICAgICBmb3IgKEZYX0lOVDMyIHcgPSAwOyB3IDwgR1JXOyB3ICs9IDgpIHsKLSAgICAgICAgICAgICAgICBuQml0cyA9IEdSVyAtIHcgPiA4ID8gOCA6IEdSVyAtIHc7Ci0gICAgICAgICAgICAgICAgaWYgKGggPiAwKQotICAgICAgICAgICAgICAgICAgICBsaW5lMSA9IChsaW5lMSA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHcgKyA4IDwgR1JXID8gcExpbmVbLW5TdHJpZGUgKyAodyA+PiAzKSArIDFdIDw8IDEgOiAwKTsKLSAgICAgICAgICAgICAgICBpZihsaW5lMV9yX29rKQotICAgICAgICAgICAgICAgICAgICBsaW5lMV9yID0gKGxpbmUxX3IgPDwgOCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHcgKyA4IDwgR1JXUiA/IHBMaW5lUltuT2Zmc2V0IC0gblN0cmlkZVIgKyAodyA+PiAzKSArIDFdIDogMCk7Ci0gICAgICAgICAgICAgICAgaWYobGluZTJfcl9vaykKLSAgICAgICAgICAgICAgICAgICAgbGluZTJfciA9IChsaW5lMl9yIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3ICsgOCA8IEdSV1IgPyBwTGluZVJbbk9mZnNldCArICh3ID4+IDMpICsgMV0gOiAwKTsKLSAgICAgICAgICAgICAgICBpZihsaW5lM19yX29rKQotICAgICAgICAgICAgICAgICAgICBsaW5lM19yID0gKGxpbmUzX3IgPDwgOCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHcgKyA4IDwgR1JXUiA/IHBMaW5lUltuT2Zmc2V0ICsgblN0cmlkZVIgKyAodyA+PiAzKSArIDFdIDogMCk7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUzX3IgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbkJpdHM7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnckNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MDE4ZCkgPDwgMSkgfCAoYlZhbCA8PCA2KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGxpbmUxID4+ICg3IC0gaykpICYgMHgwMDgwKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGxpbmUxX3IgPj4gKDkgLSBrKSkgJiAweDAwMjApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobGluZTJfciA+PiAoMTEgLSBrKSkgJiAweDAwMDQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobGluZTNfciA+PiAoMTMgLSBrKSkgJiAweDAwMDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwTGluZVt3ID4+IDNdID0gY1ZhbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENPTlRFWFQgPSAobGluZTEgJiAweDAzODApIHwgKChsaW5lMV9yID4+IDIpICYgMHgwMDIwKQotICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMl9yID4+IDQpICYgMHgwMDFjKSB8ICgobGluZTNfciA+PiA2KSAmIDB4MDAwMyk7Ci0gICAgICAgICAgICBmb3IgKEZYX0lOVDMyIHcgPSAwOyB3IDwgR1JXOyB3ICs9IDgpIHsKLSAgICAgICAgICAgICAgICBuQml0cyA9IEdSVyAtIHcgPiA4ID8gOCA6IEdSVyAtIHc7Ci0gICAgICAgICAgICAgICAgaWYgKGggPiAwKQotICAgICAgICAgICAgICAgICAgICBsaW5lMSA9IChsaW5lMSA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHcgKyA4IDwgR1JXID8gcExpbmVbLW5TdHJpZGUgKyAodyA+PiAzKSArIDFdIDw8IDEgOiAwKTsKLSAgICAgICAgICAgICAgICBpZihsaW5lMV9yX29rKQotICAgICAgICAgICAgICAgICAgICBsaW5lMV9yID0gKGxpbmUxX3IgPDwgOCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHcgKyA4IDwgR1JXUiA/IHBMaW5lUltuT2Zmc2V0IC0gblN0cmlkZVIgKyAodyA+PiAzKSArIDFdIDogMCk7Ci0gICAgICAgICAgICAgICAgaWYobGluZTJfcl9vaykKLSAgICAgICAgICAgICAgICAgICAgbGluZTJfciA9IChsaW5lMl9yIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3ICsgOCA8IEdSV1IgPyBwTGluZVJbbk9mZnNldCArICh3ID4+IDMpICsgMV0gOiAwKTsKLSAgICAgICAgICAgICAgICBpZihsaW5lM19yX29rKQotICAgICAgICAgICAgICAgICAgICBsaW5lM19yID0gKGxpbmUzX3IgPDwgOCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHcgKyA4IDwgR1JXUiA/IHBMaW5lUltuT2Zmc2V0ICsgblN0cmlkZVIgKyAodyA+PiAzKSArIDFdIDogMCk7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUzX3IgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbkJpdHM7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBiVmFsID0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrLCBoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoIShUUEdST04gJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrIC0gMSwgaCAtIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgaywgaCAtIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgayArIDEsIGggLSAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIGsgLSAxLCBoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIGsgKyAxLCBoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIGsgLSAxLCBoICsgMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrLCBoICsgMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrICsgMSwgaCArIDEpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxOGQpIDw8IDEpIHwgKGJWYWwgPDwgNikgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChsaW5lMSA+PiAoNyAtIGspKSAmIDB4MDA4MCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChsaW5lMV9yID4+ICg5IC0gaykpICYgMHgwMDIwKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGxpbmUyX3IgPj4gKDExIC0gaykpICYgMHgwMDA0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGxpbmUzX3IgPj4gKDEzIC0gaykpICYgMHgwMDAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcExpbmVbdyA+PiAzXSA9IGNWYWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcExpbmUgKz0gblN0cmlkZTsKLSAgICAgICAgaWYgKGggPCBHUkhSICsgR1JSRUZFUkVOQ0VEWSkgewotICAgICAgICAgICAgcExpbmVSICs9IG5TdHJpZGVSOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBHUlJFRzsKLX0KLUNKQmlnMl9JbWFnZSAqQ0pCaWcyX0dSUkRQcm9jOjpkZWNvZGVfVjEoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ3JDb250ZXh0KQotewotICAgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOwotICAgIEZYX0JPT0wgVFBHUlBJWCwgVFBHUlZBTDsKLSAgICBGWF9EV09SRCBDT05URVhUOwotICAgIENKQmlnMl9JbWFnZSAqR1JSRUc7Ci0gICAgTFRQID0gMDsKLSAgICBKQklHMl9BTExPQyhHUlJFRywgQ0pCaWcyX0ltYWdlKEdSVywgR1JIKSk7Ci0gICAgR1JSRUctPmZpbGwoMCk7Ci0gICAgZm9yKEZYX0RXT1JEIGggPSAwOyBoIDwgR1JIOyBoKyspIHsKLSAgICAgICAgaWYoVFBHUk9OKSB7Ci0gICAgICAgICAgICBzd2l0Y2goR1JURU1QTEFURSkgewotICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IDB4MDAxMDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gMHgwMDA4OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICBMVFAgPSBMVFAgXiBTTFRQOwotICAgICAgICB9Ci0gICAgICAgIGlmKExUUCA9PSAwKSB7Ci0gICAgICAgICAgICBmb3IoRlhfRFdPUkQgdyA9IDA7IHcgPCBHUlc7IHcrKykgewotICAgICAgICAgICAgICAgIENPTlRFWFQgPSAwOwotICAgICAgICAgICAgICAgIHN3aXRjaChHUlRFTVBMQVRFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMSwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpIDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCAtIDEsIGggLSBHUlJFRkVSRU5DRURZICsgMSkgPDwgMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMSwgaCAtIEdSUkVGRVJFTkNFRFkpIDw8IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkpIDw8IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCAtIDEsIGggLSBHUlJFRkVSRU5DRURZKSA8PCA1OwotICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAxLCBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpIDw8IDY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkgLSAxKSA8PCA3OwotICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyBHUkFUWzJdLCBoIC0gR1JSRUZFUkVOQ0VEWSArIEdSQVRbM10pIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVHLT5nZXRQaXhlbCh3IC0gMSwgaCkgPDwgOTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUctPmdldFBpeGVsKHcgKyAxLCBoIC0gMSkgPDwgMTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVHLT5nZXRQaXhlbCh3LCBoIC0gMSkgPDwgMTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVHLT5nZXRQaXhlbCh3ICsgR1JBVFswXSwgaCArIEdSQVRbMV0pIDw8IDEyOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMSwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpIDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZKSA8PCAyOwotICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZKSA8PCAzOwotICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggLSAxLCBoIC0gR1JSRUZFUkVOQ0VEWSkgPDwgNDsKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpIDw8IDU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVHLT5nZXRQaXhlbCh3IC0gMSwgaCkgPDwgNjsKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUctPmdldFBpeGVsKHcgKyAxLCBoIC0gMSkgPDwgNzsKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUctPmdldFBpeGVsKHcsIGggLSAxKSA8PCA4OwotICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRy0+Z2V0UGl4ZWwodyAtIDEsIGggLSAxKSA8PCA5OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgR1JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR1JXOyB3KyspIHsKLSAgICAgICAgICAgICAgICBiVmFsID0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcsIGgpOwotICAgICAgICAgICAgICAgIGlmKFRQR1JPTiAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIDEsIGggLSAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3LCBoIC0gMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIDEsIGggLSAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gMSwgaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIDEsIGgpKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSAxLCBoICsgMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodywgaCArIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyAxLCBoICsgMSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRQR1JQSVggPSAxOwotICAgICAgICAgICAgICAgICAgICBUUEdSVkFMID0gYlZhbDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBUUEdSUElYID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoVFBHUlBJWCkgewotICAgICAgICAgICAgICAgICAgICBHUlJFRy0+c2V0UGl4ZWwodywgaCwgVFBHUlZBTCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChHUlRFTVBMQVRFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAxLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpIDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggLSAxLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpIDw8IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAxLCBoIC0gR1JSRUZFUkVOQ0VEWSkgPDwgMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkpIDw8IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggLSAxLCBoIC0gR1JSRUZFUkVOQ0VEWSkgPDwgNTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZIC0gMSkgPDwgNjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkgLSAxKSA8PCA3OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgR1JBVFsyXSwgaCAtIEdSUkVGRVJFTkNFRFkgKyBHUkFUWzNdKSA8PCA4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUctPmdldFBpeGVsKHcgLSAxLCBoKSA8PCA5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUctPmdldFBpeGVsKHcgKyAxLCBoIC0gMSkgPDwgMTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRy0+Z2V0UGl4ZWwodywgaCAtIDEpIDw8IDExOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUctPmdldFBpeGVsKHcgKyBHUkFUWzBdLCBoICsgR1JBVFsxXSkgPDwgMTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAxLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpIDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAxLCBoIC0gR1JSRUZFUkVOQ0VEWSkgPDwgMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkpIDw8IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggLSAxLCBoIC0gR1JSRUZFUkVOQ0VEWSkgPDwgNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkgLSAxKSA8PCA1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUctPmdldFBpeGVsKHcgLSAxLCBoKSA8PCA2OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUctPmdldFBpeGVsKHcgKyAxLCBoIC0gMSkgPDwgNzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVHLT5nZXRQaXhlbCh3LCBoIC0gMSkgPDwgODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdSUkVHLT5nZXRQaXhlbCh3IC0gMSwgaCAtIDEpIDw8IDk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ3JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgR1JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gR1JSRUc7Ci19Ci1DSkJpZzJfSW1hZ2UgKkNKQmlnMl9UUkRQcm9jOjpkZWNvZGVfSHVmZm1hbihDSkJpZzJfQml0U3RyZWFtICpwU3RyZWFtLCBKQmlnMkFyaXRoQ3R4ICpnckNvbnRleHQpCi17Ci0gICAgRlhfSU5UMzIgU1RSSVBULCBGSVJTVFM7Ci0gICAgRlhfRFdPUkQgTklOU1RBTkNFUzsKLSAgICBGWF9JTlQzMiBEVCwgREZTLCBDVVJTOwotICAgIEZYX0JZVEUgQ1VSVDsKLSAgICBGWF9JTlQzMiBTSSwgVEk7Ci0gICAgRlhfRFdPUkQgSURJOwotICAgIENKQmlnMl9JbWFnZSAqSUJJOwotICAgIEZYX0RXT1JEIFdJLCBISTsKLSAgICBGWF9JTlQzMiBJRFM7Ci0gICAgRlhfQk9PTCBSSTsKLSAgICBGWF9JTlQzMiBSRFdJLCBSREhJLCBSRFhJLCBSRFlJOwotICAgIENKQmlnMl9JbWFnZSAqSUJPSTsKLSAgICBGWF9EV09SRCBXT0ksIEhPSTsKLSAgICBDSkJpZzJfSW1hZ2UgKlNCUkVHOwotICAgIEZYX0JPT0wgYkZpcnN0OwotICAgIEZYX0RXT1JEIG5UbXA7Ci0gICAgRlhfSU5UMzIgblZhbCwgbkJpdHM7Ci0gICAgQ0pCaWcyX0h1ZmZtYW5EZWNvZGVyICpwSHVmZm1hbkRlY29kZXI7Ci0gICAgQ0pCaWcyX0dSUkRQcm9jICpwR1JSRDsKLSAgICBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyOwotICAgIEpCSUcyX0FMTE9DKHBIdWZmbWFuRGVjb2RlciwgQ0pCaWcyX0h1ZmZtYW5EZWNvZGVyKHBTdHJlYW0pKTsKLSAgICBKQklHMl9BTExPQyhTQlJFRywgQ0pCaWcyX0ltYWdlKFNCVywgU0JIKSk7Ci0gICAgU0JSRUctPmZpbGwoU0JERUZQSVhFTCk7Ci0gICAgaWYocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0JIVUZGRFQsICZTVFJJUFQpICE9IDApIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigidGV4dCByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlIChodWZmbWFuKTogdG9vIHNob3J0LiIpOwotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgU1RSSVBUICo9IFNCU1RSSVBTOwotICAgIFNUUklQVCA9IC1TVFJJUFQ7Ci0gICAgRklSU1RTID0gMDsKLSAgICBOSU5TVEFOQ0VTID0gMDsKLSAgICB3aGlsZShOSU5TVEFOQ0VTIDwgU0JOVU1JTlNUQU5DRVMpIHsKLSAgICAgICAgaWYocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0JIVUZGRFQsICZEVCkgIT0gMCkgewotICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigidGV4dCByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlIChodWZmbWFuKTogdG9vIHNob3J0LiIpOwotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgRFQgKj0gU0JTVFJJUFM7Ci0gICAgICAgIFNUUklQVCA9IFNUUklQVCArIERUOwotICAgICAgICBiRmlyc3QgPSBUUlVFOwotICAgICAgICBmb3IoOzspIHsKLSAgICAgICAgICAgIGlmKGJGaXJzdCkgewotICAgICAgICAgICAgICAgIGlmKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNCSFVGRkZTLCAmREZTKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSAoaHVmZm1hbik6IHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZJUlNUUyA9IEZJUlNUUyArIERGUzsKLSAgICAgICAgICAgICAgICBDVVJTID0gRklSU1RTOwotICAgICAgICAgICAgICAgIGJGaXJzdCA9IEZBTFNFOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuVmFsID0gcEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0JIVUZGRFMsICZJRFMpOwotICAgICAgICAgICAgICAgIGlmKG5WYWwgPT0gSkJJRzJfT09CKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihuVmFsICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigidGV4dCByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlIChodWZmbWFuKTogdG9vIHNob3J0LiIpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBDVVJTID0gQ1VSUyArIElEUyArIFNCRFNPRkZTRVQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoU0JTVFJJUFMgPT0gMSkgewotICAgICAgICAgICAgICAgIENVUlQgPSAwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuVG1wID0gMTsKLSAgICAgICAgICAgICAgICB3aGlsZSgoRlhfRFdPUkQpKDEgPDwgblRtcCkgPCBTQlNUUklQUykgewotICAgICAgICAgICAgICAgICAgICBuVG1wICsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihwU3RyZWFtLT5yZWFkTkJpdHMoblRtcCwgJm5WYWwpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigidGV4dCByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlIChodWZmbWFuKTogdG9vIHNob3J0LiIpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ1VSVCA9IG5WYWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUSSA9IFNUUklQVCArIENVUlQ7Ci0gICAgICAgICAgICBuVmFsID0gMDsKLSAgICAgICAgICAgIG5CaXRzID0gMDsKLSAgICAgICAgICAgIGZvcig7OykgewotICAgICAgICAgICAgICAgIGlmKHBTdHJlYW0tPnJlYWQxQml0KCZuVG1wKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSAoaHVmZm1hbik6IHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5WYWwgPSAoblZhbCA8PCAxKSB8IG5UbXA7Ci0gICAgICAgICAgICAgICAgbkJpdHMgKys7Ci0gICAgICAgICAgICAgICAgZm9yKElESSA9IDA7IElESSA8IFNCTlVNU1lNUzsgSURJKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoKG5CaXRzID09IFNCU1lNQ09ERVNbSURJXS5jb2RlbGVuKSAmJiAoblZhbCA9PSBTQlNZTUNPREVTW0lESV0uY29kZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKElESSA8IFNCTlVNU1lNUykgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihTQlJFRklORSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgUkkgPSAwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZihwU3RyZWFtLT5yZWFkMUJpdCgmUkkpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigidGV4dCByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlIChodWZmbWFuKTogdG9vIHNob3J0LiIpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihSSSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgSUJJID0gU0JTWU1TW0lESV07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmKChwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTQkhVRkZSRFcsICZSRFdJKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNCSFVGRlJESCwgJlJESEkpICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0JIVUZGUkRYLCAmUkRYSSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTQkhVRkZSRFksICZSRFlJKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNCSFVGRlJTSVpFLCAmblZhbCkgIT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigidGV4dCByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlIChodWZmbWFuKTogdG9vIHNob3J0LiIpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcFN0cmVhbS0+YWxpZ25CeXRlKCk7Ci0gICAgICAgICAgICAgICAgblRtcCA9IHBTdHJlYW0tPmdldE9mZnNldCgpOwotICAgICAgICAgICAgICAgIElCT0kgPSBTQlNZTVNbSURJXTsKLSAgICAgICAgICAgICAgICBpZiAoIUlCT0kpIHsKLSAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFdPSSA9IElCT0ktPm1fbldpZHRoOwotICAgICAgICAgICAgICAgIEhPSSA9IElCT0ktPm1fbkhlaWdodDsKLSAgICAgICAgICAgICAgICBpZiAoKGludCkoV09JICsgUkRXSSkgPCAwIHx8IChpbnQpKEhPSSArIFJESEkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmUgKGh1ZmZtYW4pOiBJbnZhbGlkIFJEV0kgb3IgUkRISSB2YWx1ZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEpCSUcyX0FMTE9DKHBHUlJELCBDSkJpZzJfR1JSRFByb2MoKSk7Ci0gICAgICAgICAgICAgICAgcEdSUkQtPkdSVyA9IFdPSSArIFJEV0k7Ci0gICAgICAgICAgICAgICAgcEdSUkQtPkdSSCA9IEhPSSArIFJESEk7Ci0gICAgICAgICAgICAgICAgcEdSUkQtPkdSVEVNUExBVEUgPSBTQlJURU1QTEFURTsKLSAgICAgICAgICAgICAgICBwR1JSRC0+R1JSRUZFUkVOQ0UgPSBJQk9JOwotICAgICAgICAgICAgICAgIHBHUlJELT5HUlJFRkVSRU5DRURYID0gKFJEV0kgPj4gMikgKyBSRFhJOwotICAgICAgICAgICAgICAgIHBHUlJELT5HUlJFRkVSRU5DRURZID0gKFJESEkgPj4gMikgKyBSRFlJOwotICAgICAgICAgICAgICAgIHBHUlJELT5UUEdST04gPSAwOwotICAgICAgICAgICAgICAgIHBHUlJELT5HUkFUWzBdID0gU0JSQVRbMF07Ci0gICAgICAgICAgICAgICAgcEdSUkQtPkdSQVRbMV0gPSBTQlJBVFsxXTsKLSAgICAgICAgICAgICAgICBwR1JSRC0+R1JBVFsyXSA9IFNCUkFUWzJdOwotICAgICAgICAgICAgICAgIHBHUlJELT5HUkFUWzNdID0gU0JSQVRbM107Ci0gICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MocEFyaXRoRGVjb2RlciwgQ0pCaWcyX0FyaXRoRGVjb2RlcihwU3RyZWFtKSk7Ci0gICAgICAgICAgICAgICAgSUJJID0gcEdSUkQtPmRlY29kZShwQXJpdGhEZWNvZGVyLCBnckNvbnRleHQpOwotICAgICAgICAgICAgICAgIGlmKElCSSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwR1JSRDsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBBcml0aERlY29kZXI7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZWxldGUgcEFyaXRoRGVjb2RlcjsKLSAgICAgICAgICAgICAgICBwU3RyZWFtLT5hbGlnbkJ5dGUoKTsKLSAgICAgICAgICAgICAgICBwU3RyZWFtLT5vZmZzZXQoMik7Ci0gICAgICAgICAgICAgICAgaWYoKEZYX0RXT1JEKW5WYWwgIT0gKHBTdHJlYW0tPmdldE9mZnNldCgpIC0gblRtcCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIElCSTsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBHUlJEOwotICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmUgKGh1ZmZtYW4pOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXMgcHJvY2Vzc2VkIGJ5IGdlbmVyaWMgcmVmaW5lbWVudCByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlIGRvZXNuJ3QgZXF1YWwgU0JIVUZGUlNJWkUuIik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZWxldGUgcEdSUkQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIUlCSSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgV0kgPSBJQkktPm1fbldpZHRoOwotICAgICAgICAgICAgSEkgPSBJQkktPm1fbkhlaWdodDsKLSAgICAgICAgICAgIGlmKFRSQU5TUE9TRUQgPT0gMCAmJiAoKFJFRkNPUk5FUiA9PSBKQklHMl9DT1JORVJfVE9QUklHSFQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChSRUZDT1JORVIgPT0gSkJJRzJfQ09STkVSX0JPVFRPTVJJR0hUKSkpIHsKLSAgICAgICAgICAgICAgICBDVVJTID0gQ1VSUyArIFdJIC0gMTsKLSAgICAgICAgICAgIH0gZWxzZSBpZihUUkFOU1BPU0VEID09IDEgJiYgKChSRUZDT1JORVIgPT0gSkJJRzJfQ09STkVSX0JPVFRPTUxFRlQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoUkVGQ09STkVSID09IEpCSUcyX0NPUk5FUl9CT1RUT01SSUdIVCkpKSB7Ci0gICAgICAgICAgICAgICAgQ1VSUyA9IENVUlMgKyBISSAtIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTSSA9IENVUlM7Ci0gICAgICAgICAgICBpZihUUkFOU1BPU0VEID09IDApIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2goUkVGQ09STkVSKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX1RPUExFRlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBTQlJFRy0+Y29tcG9zZUZyb20oU0ksIFRJLCBJQkksIFNCQ09NQk9QKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPUk5FUl9UT1BSSUdIVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShTSSAtIFdJICsgMSwgVEksIElCSSwgU0JDT01CT1ApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX0JPVFRPTUxFRlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBTQlJFRy0+Y29tcG9zZUZyb20oU0ksIFRJIC0gSEkgKyAxLCBJQkksIFNCQ09NQk9QKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPUk5FUl9CT1RUT01SSUdIVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShTSSAtIFdJICsgMSwgVEkgLSBISSArIDEsIElCSSwgU0JDT01CT1ApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2goUkVGQ09STkVSKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX1RPUExFRlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBTQlJFRy0+Y29tcG9zZUZyb20oVEksIFNJLCBJQkksIFNCQ09NQk9QKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPUk5FUl9UT1BSSUdIVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShUSSAtIFdJICsgMSwgU0ksIElCSSwgU0JDT01CT1ApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX0JPVFRPTUxFRlQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBTQlJFRy0+Y29tcG9zZUZyb20oVEksIFNJIC0gSEkgKyAxLCBJQkksIFNCQ09NQk9QKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPUk5FUl9CT1RUT01SSUdIVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShUSSAtIFdJICsgMSwgU0kgLSBISSArIDEsIElCSSwgU0JDT01CT1ApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoUkkgIT0gMCkgewotICAgICAgICAgICAgICAgIGRlbGV0ZSBJQkk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihUUkFOU1BPU0VEID09IDAgJiYgKChSRUZDT1JORVIgPT0gSkJJRzJfQ09STkVSX1RPUExFRlQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChSRUZDT1JORVIgPT0gSkJJRzJfQ09STkVSX0JPVFRPTUxFRlQpKSkgewotICAgICAgICAgICAgICAgIENVUlMgPSBDVVJTICsgV0kgLSAxOwotICAgICAgICAgICAgfSBlbHNlIGlmKFRSQU5TUE9TRUQgPT0gMSAmJiAoKFJFRkNPUk5FUiA9PSBKQklHMl9DT1JORVJfVE9QTEVGVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChSRUZDT1JORVIgPT0gSkJJRzJfQ09STkVSX1RPUFJJR0hUKSkpIHsKLSAgICAgICAgICAgICAgICBDVVJTID0gQ1VSUyArIEhJIC0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE5JTlNUQU5DRVMgPSBOSU5TVEFOQ0VTICsgMTsKLSAgICAgICAgfQotICAgIH0KLSAgICBkZWxldGUgcEh1ZmZtYW5EZWNvZGVyOwotICAgIHJldHVybiBTQlJFRzsKLWZhaWxlZDoKLSAgICBkZWxldGUgcEh1ZmZtYW5EZWNvZGVyOwotICAgIGRlbGV0ZSBTQlJFRzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLUNKQmlnMl9JbWFnZSAqQ0pCaWcyX1RSRFByb2M6OmRlY29kZV9Bcml0aChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnckNvbnRleHQsCi0gICAgICAgIEpCaWcySW50RGVjb2RlclN0YXRlICpwSURTKQotewotICAgIEZYX0lOVDMyIFNUUklQVCwgRklSU1RTOwotICAgIEZYX0RXT1JEIE5JTlNUQU5DRVM7Ci0gICAgRlhfSU5UMzIgRFQsIERGUywgQ1VSUzsKLSAgICBGWF9JTlQzMiBDVVJUOwotICAgIEZYX0lOVDMyIFNJLCBUSTsKLSAgICBGWF9EV09SRCBJREk7Ci0gICAgQ0pCaWcyX0ltYWdlICpJQkk7Ci0gICAgRlhfRFdPUkQgV0ksIEhJOwotICAgIEZYX0lOVDMyIElEUzsKLSAgICBGWF9CT09MIFJJOwotICAgIEZYX0lOVDMyIFJEV0ksIFJESEksIFJEWEksIFJEWUk7Ci0gICAgQ0pCaWcyX0ltYWdlICpJQk9JOwotICAgIEZYX0RXT1JEIFdPSSwgSE9JOwotICAgIENKQmlnMl9JbWFnZSAqU0JSRUc7Ci0gICAgRlhfQk9PTCBiRmlyc3Q7Ci0gICAgRlhfSU5UMzIgblJldCwgblZhbDsKLSAgICBGWF9JTlQzMiBiUmV0YWluZWQ7Ci0gICAgQ0pCaWcyX0FyaXRoSW50RGVjb2RlciAqSUFEVCwgKklBRlMsICpJQURTLCAqSUFJVCwgKklBUkksICpJQVJEVywgKklBUkRILCAqSUFSRFgsICpJQVJEWTsKLSAgICBDSkJpZzJfQXJpdGhJYWlkRGVjb2RlciAqSUFJRDsKLSAgICBDSkJpZzJfR1JSRFByb2MgKnBHUlJEOwotICAgIGlmKHBJRFMpIHsKLSAgICAgICAgSUFEVCA9IHBJRFMtPklBRFQ7Ci0gICAgICAgIElBRlMgPSBwSURTLT5JQUZTOwotICAgICAgICBJQURTID0gcElEUy0+SUFEUzsKLSAgICAgICAgSUFJVCA9IHBJRFMtPklBSVQ7Ci0gICAgICAgIElBUkkgPSBwSURTLT5JQVJJOwotICAgICAgICBJQVJEVyA9IHBJRFMtPklBUkRXOwotICAgICAgICBJQVJESCA9IHBJRFMtPklBUkRIOwotICAgICAgICBJQVJEWCA9IHBJRFMtPklBUkRYOwotICAgICAgICBJQVJEWSA9IHBJRFMtPklBUkRZOwotICAgICAgICBJQUlEID0gcElEUy0+SUFJRDsKLSAgICAgICAgYlJldGFpbmVkID0gVFJVRTsKLSAgICB9IGVsc2UgewotICAgICAgICBKQklHMl9BTExPQyhJQURULCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwotICAgICAgICBKQklHMl9BTExPQyhJQUZTLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwotICAgICAgICBKQklHMl9BTExPQyhJQURTLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwotICAgICAgICBKQklHMl9BTExPQyhJQUlULCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwotICAgICAgICBKQklHMl9BTExPQyhJQVJJLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwotICAgICAgICBKQklHMl9BTExPQyhJQVJEVywgQ0pCaWcyX0FyaXRoSW50RGVjb2RlcigpKTsKLSAgICAgICAgSkJJRzJfQUxMT0MoSUFSREgsIENKQmlnMl9Bcml0aEludERlY29kZXIoKSk7Ci0gICAgICAgIEpCSUcyX0FMTE9DKElBUkRYLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwotICAgICAgICBKQklHMl9BTExPQyhJQVJEWSwgQ0pCaWcyX0FyaXRoSW50RGVjb2RlcigpKTsKLSAgICAgICAgSkJJRzJfQUxMT0MoSUFJRCAsIENKQmlnMl9Bcml0aElhaWREZWNvZGVyKFNCU1lNQ09ERUxFTikpOwotICAgICAgICBiUmV0YWluZWQgPSBGQUxTRTsKLSAgICB9Ci0gICAgSkJJRzJfQUxMT0MoU0JSRUcsIENKQmlnMl9JbWFnZShTQlcsIFNCSCkpOwotICAgIFNCUkVHLT5maWxsKFNCREVGUElYRUwpOwotICAgIGlmKElBRFQtPmRlY29kZShwQXJpdGhEZWNvZGVyLCAmU1RSSVBUKSA9PSAtMSkgewotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmUgKGFyaXRoKTogdG9vIHNob3J0LiIpOwotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgU1RSSVBUICo9IFNCU1RSSVBTOwotICAgIFNUUklQVCA9IC1TVFJJUFQ7Ci0gICAgRklSU1RTID0gMDsKLSAgICBOSU5TVEFOQ0VTID0gMDsKLSAgICB3aGlsZShOSU5TVEFOQ0VTIDwgU0JOVU1JTlNUQU5DRVMpIHsKLSAgICAgICAgaWYoSUFEVC0+ZGVjb2RlKHBBcml0aERlY29kZXIsICZEVCkgPT0gLTEpIHsKLSAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiB0b28gc2hvcnQuIik7Ci0gICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotICAgICAgICBEVCAqPSBTQlNUUklQUzsKLSAgICAgICAgU1RSSVBUID0gU1RSSVBUICsgRFQ7Ci0gICAgICAgIGJGaXJzdCA9IFRSVUU7Ci0gICAgICAgIGZvcig7OykgewotICAgICAgICAgICAgaWYoYkZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgaWYoSUFGUy0+ZGVjb2RlKHBBcml0aERlY29kZXIsICZERlMpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiB0b28gc2hvcnQuIik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGSVJTVFMgPSBGSVJTVFMgKyBERlM7Ci0gICAgICAgICAgICAgICAgQ1VSUyA9IEZJUlNUUzsKLSAgICAgICAgICAgICAgICBiRmlyc3QgPSBGQUxTRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgblJldCA9IElBRFMtPmRlY29kZShwQXJpdGhEZWNvZGVyLCAmSURTKTsKLSAgICAgICAgICAgICAgICBpZihuUmV0ID09IEpCSUcyX09PQikgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYoblJldCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiB0b28gc2hvcnQuIik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIENVUlMgPSBDVVJTICsgSURTICsgU0JEU09GRlNFVDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTklOU1RBTkNFUyA+PSBTQk5VTUlOU1RBTkNFUykgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoU0JTVFJJUFMgPT0gMSkgewotICAgICAgICAgICAgICAgIENVUlQgPSAwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZihJQUlULT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJm5WYWwpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiB0b28gc2hvcnQuIik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDVVJUID0gblZhbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRJID0gU1RSSVBUICsgQ1VSVDsKLSAgICAgICAgICAgIGlmKElBSUQtPmRlY29kZShwQXJpdGhEZWNvZGVyLCAmblZhbCkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmUgKGFyaXRoKTogdG9vIHNob3J0LiIpOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSURJID0gblZhbDsKLSAgICAgICAgICAgIGlmKElESSA+PSBTQk5VTVNZTVMpIHsKLSAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmUgKGFyaXRoKTogc3ltYm9sIGlkIG91dCBvZiByYW5nZS4oJWQvJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElESSwgU0JOVU1TWU1TKTsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKFNCUkVGSU5FID09IDApIHsKLSAgICAgICAgICAgICAgICBSSSA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmKElBUkktPmRlY29kZShwQXJpdGhEZWNvZGVyLCAmUkkpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInRleHQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiB0b28gc2hvcnQuIik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghU0JTWU1TW0lESV0pIHsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKFJJID09IDApIHsKLSAgICAgICAgICAgICAgICBJQkkgPSBTQlNZTVNbSURJXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYoKElBUkRXLT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJlJEV0kpID09IC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKElBUkRILT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJlJESEkpID09IC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKElBUkRYLT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJlJEWEkpID09IC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKElBUkRZLT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJlJEWUkpID09IC0xKSkgewotICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmUgKGFyaXRoKTogdG9vIHNob3J0LiIpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSUJPSSA9IFNCU1lNU1tJREldOwotICAgICAgICAgICAgICAgIFdPSSA9IElCT0ktPm1fbldpZHRoOwotICAgICAgICAgICAgICAgIEhPSSA9IElCT0ktPm1fbkhlaWdodDsKLSAgICAgICAgICAgICAgICBpZiAoKGludCkoV09JICsgUkRXSSkgPCAwIHx8IChpbnQpKEhPSSArIFJESEkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJ0ZXh0IHJlZ2lvbiBkZWNvZGluZyBwcm9jZWR1cmUgKGFyaXRoKTogSW52YWxpZCBSRFdJIG9yIFJESEkgdmFsdWUuIik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhwR1JSRCwgQ0pCaWcyX0dSUkRQcm9jKCkpOwotICAgICAgICAgICAgICAgIHBHUlJELT5HUlcgPSBXT0kgKyBSRFdJOwotICAgICAgICAgICAgICAgIHBHUlJELT5HUkggPSBIT0kgKyBSREhJOwotICAgICAgICAgICAgICAgIHBHUlJELT5HUlRFTVBMQVRFID0gU0JSVEVNUExBVEU7Ci0gICAgICAgICAgICAgICAgcEdSUkQtPkdSUkVGRVJFTkNFID0gSUJPSTsKLSAgICAgICAgICAgICAgICBwR1JSRC0+R1JSRUZFUkVOQ0VEWCA9IChSRFdJID4+IDEpICsgUkRYSTsKLSAgICAgICAgICAgICAgICBwR1JSRC0+R1JSRUZFUkVOQ0VEWSA9IChSREhJID4+IDEpICsgUkRZSTsKLSAgICAgICAgICAgICAgICBwR1JSRC0+VFBHUk9OID0gMDsKLSAgICAgICAgICAgICAgICBwR1JSRC0+R1JBVFswXSA9IFNCUkFUWzBdOwotICAgICAgICAgICAgICAgIHBHUlJELT5HUkFUWzFdID0gU0JSQVRbMV07Ci0gICAgICAgICAgICAgICAgcEdSUkQtPkdSQVRbMl0gPSBTQlJBVFsyXTsKLSAgICAgICAgICAgICAgICBwR1JSRC0+R1JBVFszXSA9IFNCUkFUWzNdOwotICAgICAgICAgICAgICAgIElCSSA9IHBHUlJELT5kZWNvZGUocEFyaXRoRGVjb2RlciwgZ3JDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBpZihJQkkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBkZWxldGUgcEdSUkQ7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZWxldGUgcEdSUkQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBXSSA9IElCSS0+bV9uV2lkdGg7Ci0gICAgICAgICAgICBISSA9IElCSS0+bV9uSGVpZ2h0OwotICAgICAgICAgICAgaWYoVFJBTlNQT1NFRCA9PSAwICYmICgoUkVGQ09STkVSID09IEpCSUcyX0NPUk5FUl9UT1BSSUdIVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKFJFRkNPUk5FUiA9PSBKQklHMl9DT1JORVJfQk9UVE9NUklHSFQpKSkgewotICAgICAgICAgICAgICAgIENVUlMgPSBDVVJTICsgV0kgLSAxOwotICAgICAgICAgICAgfSBlbHNlIGlmKFRSQU5TUE9TRUQgPT0gMSAmJiAoKFJFRkNPUk5FUiA9PSBKQklHMl9DT1JORVJfQk9UVE9NTEVGVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChSRUZDT1JORVIgPT0gSkJJRzJfQ09STkVSX0JPVFRPTVJJR0hUKSkpIHsKLSAgICAgICAgICAgICAgICBDVVJTID0gQ1VSUyArIEhJIC0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNJID0gQ1VSUzsKLSAgICAgICAgICAgIGlmKFRSQU5TUE9TRUQgPT0gMCkgewotICAgICAgICAgICAgICAgIHN3aXRjaChSRUZDT1JORVIpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfVE9QTEVGVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShTSSwgVEksIElCSSwgU0JDT01CT1ApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX1RPUFJJR0hUOgotICAgICAgICAgICAgICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFNJIC0gV0kgKyAxLCBUSSwgSUJJLCBTQkNPTUJPUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfQk9UVE9NTEVGVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShTSSwgVEkgLSBISSArIDEsIElCSSwgU0JDT01CT1ApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX0JPVFRPTVJJR0hUOgotICAgICAgICAgICAgICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFNJIC0gV0kgKyAxLCBUSSAtIEhJICsgMSwgSUJJLCBTQkNPTUJPUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN3aXRjaChSRUZDT1JORVIpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfVE9QTEVGVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShUSSwgU0ksIElCSSwgU0JDT01CT1ApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX1RPUFJJR0hUOgotICAgICAgICAgICAgICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFRJIC0gV0kgKyAxLCBTSSwgSUJJLCBTQkNPTUJPUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfQk9UVE9NTEVGVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShUSSwgU0kgLSBISSArIDEsIElCSSwgU0JDT01CT1ApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX0JPVFRPTVJJR0hUOgotICAgICAgICAgICAgICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFRJIC0gV0kgKyAxLCBTSSAtIEhJICsgMSwgSUJJLCBTQkNPTUJPUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihSSSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIElCSTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKFRSQU5TUE9TRUQgPT0gMCAmJiAoKFJFRkNPUk5FUiA9PSBKQklHMl9DT1JORVJfVE9QTEVGVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKFJFRkNPUk5FUiA9PSBKQklHMl9DT1JORVJfQk9UVE9NTEVGVCkpKSB7Ci0gICAgICAgICAgICAgICAgQ1VSUyA9IENVUlMgKyBXSSAtIDE7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoVFJBTlNQT1NFRCA9PSAxICYmICgoUkVGQ09STkVSID09IEpCSUcyX0NPUk5FUl9UT1BMRUZUKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKFJFRkNPUk5FUiA9PSBKQklHMl9DT1JORVJfVE9QUklHSFQpKSkgewotICAgICAgICAgICAgICAgIENVUlMgPSBDVVJTICsgSEkgLSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTklOU1RBTkNFUyA9IE5JTlNUQU5DRVMgKyAxOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmKGJSZXRhaW5lZCA9PSBGQUxTRSkgewotICAgICAgICBkZWxldGUgSUFEVDsKLSAgICAgICAgZGVsZXRlIElBRlM7Ci0gICAgICAgIGRlbGV0ZSBJQURTOwotICAgICAgICBkZWxldGUgSUFJVDsKLSAgICAgICAgZGVsZXRlIElBUkk7Ci0gICAgICAgIGRlbGV0ZSBJQVJEVzsKLSAgICAgICAgZGVsZXRlIElBUkRIOwotICAgICAgICBkZWxldGUgSUFSRFg7Ci0gICAgICAgIGRlbGV0ZSBJQVJEWTsKLSAgICAgICAgZGVsZXRlIElBSUQ7Ci0gICAgfQotICAgIHJldHVybiBTQlJFRzsKLWZhaWxlZDoKLSAgICBpZihiUmV0YWluZWQgPT0gRkFMU0UpIHsKLSAgICAgICAgZGVsZXRlIElBRFQ7Ci0gICAgICAgIGRlbGV0ZSBJQUZTOwotICAgICAgICBkZWxldGUgSUFEUzsKLSAgICAgICAgZGVsZXRlIElBSVQ7Ci0gICAgICAgIGRlbGV0ZSBJQVJJOwotICAgICAgICBkZWxldGUgSUFSRFc7Ci0gICAgICAgIGRlbGV0ZSBJQVJESDsKLSAgICAgICAgZGVsZXRlIElBUkRYOwotICAgICAgICBkZWxldGUgSUFSRFk7Ci0gICAgICAgIGRlbGV0ZSBJQUlEOwotICAgIH0KLSAgICBkZWxldGUgU0JSRUc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci1DSkJpZzJfU3ltYm9sRGljdCAqQ0pCaWcyX1NERFByb2M6OmRlY29kZV9Bcml0aChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLAotICAgICAgICBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIEpCaWcyQXJpdGhDdHggKmdyQ29udGV4dCkKLXsKLSAgICBDSkJpZzJfSW1hZ2UgKipTRE5FV1NZTVM7Ci0gICAgRlhfRFdPUkQgSENIRUlHSFQsIE5TWU1TREVDT0RFRDsKLSAgICBGWF9JTlQzMiBIQ0RIOwotICAgIEZYX0RXT1JEIFNZTVdJRFRILCBUT1RXSURUSDsKLSAgICBGWF9JTlQzMiBEVzsKLSAgICBDSkJpZzJfSW1hZ2UgKkJTOwotICAgIEZYX0RXT1JEIEksIEosIFJFRkFHR05JTlNUOwotICAgIEZYX0JPT0wgKkVYRkxBR1M7Ci0gICAgRlhfRFdPUkQgRVhJTkRFWDsKLSAgICBGWF9CT09MIENVUkVYRkxBRzsKLSAgICBGWF9EV09SRCBFWFJVTkxFTkdUSDsKLSAgICBGWF9JTlQzMiBuVmFsOwotICAgIEZYX0RXT1JEIG5UbXA7Ci0gICAgRlhfRFdPUkQgU0JOVU1TWU1TOwotICAgIEZYX0JZVEUgU0JTWU1DT0RFTEVOOwotICAgIEZYX0RXT1JEIElESTsKLSAgICBGWF9JTlQzMiBSRFhJLCBSRFlJOwotICAgIENKQmlnMl9JbWFnZSAqKlNCU1lNUzsKLSAgICBDSkJpZzJfSHVmZm1hblRhYmxlICpTQkhVRkZGUywgKlNCSFVGRkRTLCAqU0JIVUZGRFQsICpTQkhVRkZSRFcsICpTQkhVRkZSREgsICpTQkhVRkZSRFgsICpTQkhVRkZSRFksCi0gICAgICAgICAgICAgICAgICAgICAgICAqU0JIVUZGUlNJWkU7Ci0gICAgQ0pCaWcyX0dSUkRQcm9jICpwR1JSRDsKLSAgICBDSkJpZzJfR1JEUHJvYyAqcEdSRDsKLSAgICBDSkJpZzJfQXJpdGhJbnREZWNvZGVyICpJQURILCAqSUFEVywgKklBQUksICpJQVJEWCwgKklBUkRZLCAqSUFFWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpJQURULCAqSUFGUywgKklBRFMsICpJQUlULCAqSUFSSSwgKklBUkRXLCAqSUFSREg7Ci0gICAgQ0pCaWcyX0FyaXRoSWFpZERlY29kZXIgKklBSUQ7Ci0gICAgQ0pCaWcyX1N5bWJvbERpY3QgKnBEaWN0OwotICAgIEpCSUcyX0FMTE9DKElBREgsIENKQmlnMl9Bcml0aEludERlY29kZXIoKSk7Ci0gICAgSkJJRzJfQUxMT0MoSUFEVywgQ0pCaWcyX0FyaXRoSW50RGVjb2RlcigpKTsKLSAgICBKQklHMl9BTExPQyhJQUFJLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwotICAgIEpCSUcyX0FMTE9DKElBUkRYLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwotICAgIEpCSUcyX0FMTE9DKElBUkRZLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwotICAgIEpCSUcyX0FMTE9DKElBRVgsIENKQmlnMl9Bcml0aEludERlY29kZXIoKSk7Ci0gICAgSkJJRzJfQUxMT0MoSUFEVCwgQ0pCaWcyX0FyaXRoSW50RGVjb2RlcigpKTsKLSAgICBKQklHMl9BTExPQyhJQUZTLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwotICAgIEpCSUcyX0FMTE9DKElBRFMsIENKQmlnMl9Bcml0aEludERlY29kZXIoKSk7Ci0gICAgSkJJRzJfQUxMT0MoSUFJVCwgQ0pCaWcyX0FyaXRoSW50RGVjb2RlcigpKTsKLSAgICBKQklHMl9BTExPQyhJQVJJLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwotICAgIEpCSUcyX0FMTE9DKElBUkRXLCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwotICAgIEpCSUcyX0FMTE9DKElBUkRILCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCkpOwotICAgIG5UbXAgPSAwOwotICAgIHdoaWxlKChGWF9EV09SRCkoMSA8PCBuVG1wKSA8IChTRE5VTUlOU1lNUyArIFNETlVNTkVXU1lNUykpIHsKLSAgICAgICAgblRtcCArKzsKLSAgICB9Ci0gICAgSkJJRzJfQUxMT0MoSUFJRCwgQ0pCaWcyX0FyaXRoSWFpZERlY29kZXIoKEZYX0JZVEUpblRtcCkpOwotICAgIFNETkVXU1lNUyA9IChDSkJpZzJfSW1hZ2UqKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoU0ROVU1ORVdTWU1TLCBzaXplb2YoQ0pCaWcyX0ltYWdlKikpOwotICAgIEZYU1lTX21lbXNldDMyKFNETkVXU1lNUywgMCAsIFNETlVNTkVXU1lNUyAqIHNpemVvZihDSkJpZzJfSW1hZ2UqKSk7Ci0gICAgSENIRUlHSFQgPSAwOwotICAgIE5TWU1TREVDT0RFRCA9IDA7Ci0gICAgd2hpbGUoTlNZTVNERUNPREVEIDwgU0ROVU1ORVdTWU1TKSB7Ci0gICAgICAgIEJTID0gTlVMTDsKLSAgICAgICAgaWYoSUFESC0+ZGVjb2RlKHBBcml0aERlY29kZXIsICZIQ0RIKSA9PSAtMSkgewotICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgZGVjb2RpbmcgcHJvY2VkdXJlIChhcml0aCk6IHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICB9Ci0gICAgICAgIEhDSEVJR0hUID0gSENIRUlHSFQgKyBIQ0RIOwotICAgICAgICBpZiAoKGludClIQ0hFSUdIVCA8IDAgfHwgKGludClIQ0hFSUdIVCA+IEpCSUcyX01BWF9JTUFHRV9TSVpFKSB7Ci0gICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzeW1ib2wgZGljdGlvbmFyeSBkZWNvZGluZyBwcm9jZWR1cmUgKGFyaXRoKTogaW52YWxpZCBIQ0hFSUdIVCB2YWx1ZS4iKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICB9Ci0gICAgICAgIFNZTVdJRFRIID0gMDsKLSAgICAgICAgVE9UV0lEVEggPSAwOwotICAgICAgICBmb3IoOzspIHsKLSAgICAgICAgICAgIG5WYWwgPSBJQURXLT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJkRXKTsKLSAgICAgICAgICAgIGlmKG5WYWwgPT0gSkJJRzJfT09CKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoblZhbCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgZGVjb2RpbmcgcHJvY2VkdXJlIChhcml0aCk6IHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKE5TWU1TREVDT0RFRCA+PSBTRE5VTU5FV1NZTVMpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgZGVjb2RpbmcgcHJvY2VkdXJlIChhcml0aCk6IE5TWU1TREVDT0RFRCA+PSBTRE5VTU5FV1NZTVMuIik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTWU1XSURUSCA9IFNZTVdJRFRIICsgRFc7Ci0gICAgICAgICAgICAgICAgaWYgKChpbnQpU1lNV0lEVEggPCAwIHx8IChpbnQpU1lNV0lEVEggPiBKQklHMl9NQVhfSU1BR0VfU0laRSkgewotICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzeW1ib2wgZGljdGlvbmFyeSBkZWNvZGluZyBwcm9jZWR1cmUgKGFyaXRoKTogaW52YWxpZCBTWU1XSURUSCB2YWx1ZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChIQ0hFSUdIVCA9PSAwIHx8IFNZTVdJRFRIID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgVE9UV0lEVEggPSBUT1RXSURUSCArIFNZTVdJRFRIOwotICAgICAgICAgICAgICAgICAgICBTRE5FV1NZTVNbTlNZTVNERUNPREVEXSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIE5TWU1TREVDT0RFRCA9IE5TWU1TREVDT0RFRCArIDE7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBUT1RXSURUSCA9IFRPVFdJRFRIICsgU1lNV0lEVEg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihTRFJFRkFHRyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MocEdSRCwgQ0pCaWcyX0dSRFByb2MoKSk7Ci0gICAgICAgICAgICAgICAgcEdSRC0+TU1SID0gMDsKLSAgICAgICAgICAgICAgICBwR1JELT5HQlcgPSBTWU1XSURUSDsKLSAgICAgICAgICAgICAgICBwR1JELT5HQkggPSBIQ0hFSUdIVDsKLSAgICAgICAgICAgICAgICBwR1JELT5HQlRFTVBMQVRFID0gU0RURU1QTEFURTsKLSAgICAgICAgICAgICAgICBwR1JELT5UUEdET04gPSAwOwotICAgICAgICAgICAgICAgIHBHUkQtPlVTRVNLSVAgPSAwOwotICAgICAgICAgICAgICAgIHBHUkQtPkdCQVRbMF0gPSBTREFUWzBdOwotICAgICAgICAgICAgICAgIHBHUkQtPkdCQVRbMV0gPSBTREFUWzFdOwotICAgICAgICAgICAgICAgIHBHUkQtPkdCQVRbMl0gPSBTREFUWzJdOwotICAgICAgICAgICAgICAgIHBHUkQtPkdCQVRbM10gPSBTREFUWzNdOwotICAgICAgICAgICAgICAgIHBHUkQtPkdCQVRbNF0gPSBTREFUWzRdOwotICAgICAgICAgICAgICAgIHBHUkQtPkdCQVRbNV0gPSBTREFUWzVdOwotICAgICAgICAgICAgICAgIHBHUkQtPkdCQVRbNl0gPSBTREFUWzZdOwotICAgICAgICAgICAgICAgIHBHUkQtPkdCQVRbN10gPSBTREFUWzddOwotICAgICAgICAgICAgICAgIEJTID0gcEdSRC0+ZGVjb2RlX0FyaXRoKHBBcml0aERlY29kZXIsIGdiQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgaWYoQlMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBkZWxldGUgcEdSRDsKLSAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlbGV0ZSBwR1JEOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZihJQUFJLT5kZWNvZGUocEFyaXRoRGVjb2RlciwgKGludCopJlJFRkFHR05JTlNUKSA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzeW1ib2wgZGljdGlvbmFyeSBkZWNvZGluZyBwcm9jZWR1cmUgKGFyaXRoKTogdG9vIHNob3J0LiIpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoUkVGQUdHTklOU1QgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIENKQmlnMl9UUkRQcm9jICpwRGVjb2RlcjsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MocERlY29kZXIsIENKQmlnMl9UUkRQcm9jKCkpOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGID0gU0RIVUZGOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JSRUZJTkUgPSAxOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JXID0gU1lNV0lEVEg7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQkggPSBIQ0hFSUdIVDsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCTlVNSU5TVEFOQ0VTID0gUkVGQUdHTklOU1Q7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQlNUUklQUyA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQk5VTVNZTVMgPSBTRE5VTUlOU1lNUyArIE5TWU1TREVDT0RFRDsKLSAgICAgICAgICAgICAgICAgICAgU0JOVU1TWU1TID0gcERlY29kZXItPlNCTlVNU1lNUzsKLSAgICAgICAgICAgICAgICAgICAgblRtcCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlKChGWF9EV09SRCkoMSA8PCBuVG1wKSA8IFNCTlVNU1lNUykgewotICAgICAgICAgICAgICAgICAgICAgICAgblRtcCArKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTQlNZTUNPREVMRU4gPSAoRlhfQllURSluVG1wOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JTWU1DT0RFTEVOID0gU0JTWU1DT0RFTEVOOwotICAgICAgICAgICAgICAgICAgICBTQlNZTVMgPSAoQ0pCaWcyX0ltYWdlKiopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKFNCTlVNU1lNUywgc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfbWVtY3B5KFNCU1lNUywgU0RJTlNZTVMsIFNETlVNSU5TWU1TICogc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfbWVtY3B5KFNCU1lNUyArIFNETlVNSU5TWU1TLCBTRE5FV1NZTVMsIE5TWU1TREVDT0RFRCAqIHNpemVvZihDSkJpZzJfSW1hZ2UqKSk7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQlNZTVMgPSBTQlNZTVM7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQkRFRlBJWEVMID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCQ09NQk9QID0gSkJJRzJfQ09NUE9TRV9PUjsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlRSQU5TUE9TRUQgPSAwOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+UkVGQ09STkVSID0gSkJJRzJfQ09STkVSX1RPUExFRlQ7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQkRTT0ZGU0VUID0gMDsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGRlMsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0I2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0I2KSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CNikpOwotICAgICAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhTQkhVRkZEUywgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjgpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0I4KSk7Ci0gICAgICAgICAgICAgICAgICAgIEpCSUcyX0FMTE9DKFNCSFVGRkRULCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjExKSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTEpKTsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGUkRXLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE1KSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTUpKTsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGUkRILCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE1KSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTUpKTsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGUkRYLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE1KSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTUpKTsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGUkRZLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE1KSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTUpKTsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGUlNJWkUsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxKSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMSkpOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGRlMgPSBTQkhVRkZGUzsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCSFVGRkRTID0gU0JIVUZGRFM7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZEVCA9IFNCSFVGRkRUOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGUkRXID0gU0JIVUZGUkRXOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGUkRIID0gU0JIVUZGUkRIOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGUkRYID0gU0JIVUZGUkRYOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGUkRZID0gU0JIVUZGUkRZOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGUlNJWkUgPSBTQkhVRkZSU0laRTsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCUlRFTVBMQVRFID0gU0RSVEVNUExBVEU7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQlJBVFswXSA9IFNEUkFUWzBdOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JSQVRbMV0gPSBTRFJBVFsxXTsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCUkFUWzJdID0gU0RSQVRbMl07Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQlJBVFszXSA9IFNEUkFUWzNdOwotICAgICAgICAgICAgICAgICAgICBKQmlnMkludERlY29kZXJTdGF0ZSBpZHM7Ci0gICAgICAgICAgICAgICAgICAgIGlkcy5JQURUID0gSUFEVDsKLSAgICAgICAgICAgICAgICAgICAgaWRzLklBRlMgPSBJQUZTOwotICAgICAgICAgICAgICAgICAgICBpZHMuSUFEUyA9IElBRFM7Ci0gICAgICAgICAgICAgICAgICAgIGlkcy5JQUlUID0gSUFJVDsKLSAgICAgICAgICAgICAgICAgICAgaWRzLklBUkkgPSBJQVJJOwotICAgICAgICAgICAgICAgICAgICBpZHMuSUFSRFcgPSBJQVJEVzsKLSAgICAgICAgICAgICAgICAgICAgaWRzLklBUkRIID0gSUFSREg7Ci0gICAgICAgICAgICAgICAgICAgIGlkcy5JQVJEWCA9IElBUkRYOwotICAgICAgICAgICAgICAgICAgICBpZHMuSUFSRFkgPSBJQVJEWTsKLSAgICAgICAgICAgICAgICAgICAgaWRzLklBSUQgPSBJQUlEOwotICAgICAgICAgICAgICAgICAgICBCUyA9IHBEZWNvZGVyLT5kZWNvZGVfQXJpdGgocEFyaXRoRGVjb2RlciwgZ3JDb250ZXh0LCAmaWRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoQlMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKFNCU1lNUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGRlM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGRFM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGRFQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGUkRXOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFNCSFVGRlJESDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZSRFg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGUkRZOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFNCSFVGRlJTSVpFOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBEZWNvZGVyOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKFNCU1lNUyk7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZGUzsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFNCSFVGRkRTOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGRFQ7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZSRFc7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZSREg7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZSRFg7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZSRFk7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZSU0laRTsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBEZWNvZGVyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZihSRUZBR0dOSU5TVCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNCTlVNU1lNUyA9IFNETlVNSU5TWU1TICsgTlNZTVNERUNPREVEOwotICAgICAgICAgICAgICAgICAgICBpZihJQUlELT5kZWNvZGUocEFyaXRoRGVjb2RlciwgKGludCopJklESSkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiB0b28gc2hvcnQuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZigoSUFSRFgtPmRlY29kZShwQXJpdGhEZWNvZGVyLCAmUkRYSSkgPT0gLTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKElBUkRZLT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJlJEWUkpID09IC0xKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgZGVjb2RpbmcgcHJvY2VkdXJlIChhcml0aCk6IHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChJREkgPj0gU0JOVU1TWU1TKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzeW1ib2wgZGljdGlvbmFyeSBkZWNvZGluZyBwcm9jZWR1cmUgKGFyaXRoKToiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmVmaW5lbWVudCByZWZlcmVuY2VzIHVua25vd24gc3ltYm9sICVkIiwgSURJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFNCU1lNUyA9IChDSkJpZzJfSW1hZ2UqKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoU0JOVU1TWU1TLCBzaXplb2YoQ0pCaWcyX0ltYWdlKikpOwotICAgICAgICAgICAgICAgICAgICBKQklHMl9tZW1jcHkoU0JTWU1TLCBTRElOU1lNUywgU0ROVU1JTlNZTVMgKiBzaXplb2YoQ0pCaWcyX0ltYWdlKikpOwotICAgICAgICAgICAgICAgICAgICBKQklHMl9tZW1jcHkoU0JTWU1TICsgU0ROVU1JTlNZTVMsIFNETkVXU1lNUywgTlNZTVNERUNPREVEICogc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFTQlNZTVNbSURJXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKFNCU1lNUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhwR1JSRCwgQ0pCaWcyX0dSUkRQcm9jKCkpOwotICAgICAgICAgICAgICAgICAgICBwR1JSRC0+R1JXID0gU1lNV0lEVEg7Ci0gICAgICAgICAgICAgICAgICAgIHBHUlJELT5HUkggPSBIQ0hFSUdIVDsKLSAgICAgICAgICAgICAgICAgICAgcEdSUkQtPkdSVEVNUExBVEUgPSBTRFJURU1QTEFURTsKLSAgICAgICAgICAgICAgICAgICAgcEdSUkQtPkdSUkVGRVJFTkNFID0gU0JTWU1TW0lESV07Ci0gICAgICAgICAgICAgICAgICAgIHBHUlJELT5HUlJFRkVSRU5DRURYID0gUkRYSTsKLSAgICAgICAgICAgICAgICAgICAgcEdSUkQtPkdSUkVGRVJFTkNFRFkgPSBSRFlJOwotICAgICAgICAgICAgICAgICAgICBwR1JSRC0+VFBHUk9OID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcEdSUkQtPkdSQVRbMF0gPSBTRFJBVFswXTsKLSAgICAgICAgICAgICAgICAgICAgcEdSUkQtPkdSQVRbMV0gPSBTRFJBVFsxXTsKLSAgICAgICAgICAgICAgICAgICAgcEdSUkQtPkdSQVRbMl0gPSBTRFJBVFsyXTsKLSAgICAgICAgICAgICAgICAgICAgcEdSUkQtPkdSQVRbM10gPSBTRFJBVFszXTsKLSAgICAgICAgICAgICAgICAgICAgQlMgPSBwR1JSRC0+ZGVjb2RlKHBBcml0aERlY29kZXIsIGdyQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKEJTID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTQlNZTVMpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBHUlJEOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKFNCU1lNUyk7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwR1JSRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTRE5FV1NZTVNbTlNZTVNERUNPREVEXSA9IEJTOwotICAgICAgICAgICAgQlMgPSBOVUxMOwotICAgICAgICAgICAgTlNZTVNERUNPREVEID0gTlNZTVNERUNPREVEICsgMTsKLSAgICAgICAgfQotICAgIH0KLSAgICBFWElOREVYID0gMDsKLSAgICBDVVJFWEZMQUcgPSAwOwotICAgIEVYRkxBR1MgPSAoRlhfQk9PTCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihGWF9CT09MKSwgKFNETlVNSU5TWU1TICsgU0ROVU1ORVdTWU1TKSk7Ci0gICAgd2hpbGUoRVhJTkRFWCA8IFNETlVNSU5TWU1TICsgU0ROVU1ORVdTWU1TKSB7Ci0gICAgICAgIGlmKElBRVgtPmRlY29kZShwQXJpdGhEZWNvZGVyLCAoaW50KikmRVhSVU5MRU5HVEgpID09IC0xKSB7Ci0gICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoRVhGTEFHUyk7Ci0gICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzeW1ib2wgZGljdGlvbmFyeSBkZWNvZGluZyBwcm9jZWR1cmUgKGFyaXRoKTogdG9vIHNob3J0LiIpOwotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEVYSU5ERVggKyBFWFJVTkxFTkdUSCA+IFNETlVNSU5TWU1TICsgU0ROVU1ORVdTWU1TKSB7Ci0gICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoRVhGTEFHUyk7Ci0gICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzeW1ib2wgZGljdGlvbmFyeSBkZWNvZGluZyBwcm9jZWR1cmUgKGFyaXRoKTogSW52YWxpZCBFWFJVTkxFTkdUSCB2YWx1ZS4iKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmKEVYUlVOTEVOR1RIICE9IDApIHsKLSAgICAgICAgICAgIGZvcihJID0gRVhJTkRFWDsgSSA8IEVYSU5ERVggKyBFWFJVTkxFTkdUSDsgSSsrKSB7Ci0gICAgICAgICAgICAgICAgRVhGTEFHU1tJXSA9IENVUkVYRkxBRzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFWElOREVYID0gRVhJTkRFWCArIEVYUlVOTEVOR1RIOwotICAgICAgICBDVVJFWEZMQUcgPSAhQ1VSRVhGTEFHOwotICAgIH0KLSAgICBKQklHMl9BTExPQyhwRGljdCwgQ0pCaWcyX1N5bWJvbERpY3QoKSk7Ci0gICAgcERpY3QtPlNETlVNRVhTWU1TID0gU0ROVU1FWFNZTVM7Ci0gICAgcERpY3QtPlNERVhTWU1TID0gKENKQmlnMl9JbWFnZSoqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoQ0pCaWcyX0ltYWdlKiksIFNETlVNRVhTWU1TKTsKLSAgICBJID0gSiA9IDA7Ci0gICAgZm9yKEkgPSAwOyBJIDwgU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVM7IEkrKykgewotICAgICAgICBpZihFWEZMQUdTW0ldICYmIEogPCBTRE5VTUVYU1lNUykgewotICAgICAgICAgICAgaWYoSSA8IFNETlVNSU5TWU1TKSB7Ci0gICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MocERpY3QtPlNERVhTWU1TW0pdLCBDSkJpZzJfSW1hZ2UoKlNESU5TWU1TW0ldKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBEaWN0LT5TREVYU1lNU1tKXSA9IFNETkVXU1lNU1tJIC0gU0ROVU1JTlNZTVNdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSiA9IEogKyAxOwotICAgICAgICB9IGVsc2UgaWYgKCFFWEZMQUdTW0ldICYmIEkgPj0gU0ROVU1JTlNZTVMpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBTRE5FV1NZTVNbSSAtIFNETlVNSU5TWU1TXTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoSiA8IFNETlVNRVhTWU1TKSB7Ci0gICAgICAgIHBEaWN0LT5TRE5VTUVYU1lNUyA9IEo7Ci0gICAgfQotICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShFWEZMQUdTKTsKLSAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0RORVdTWU1TKTsKLSAgICBkZWxldGUgSUFESDsKLSAgICBkZWxldGUgSUFEVzsKLSAgICBkZWxldGUgSUFBSTsKLSAgICBkZWxldGUgSUFSRFg7Ci0gICAgZGVsZXRlIElBUkRZOwotICAgIGRlbGV0ZSBJQUVYOwotICAgIGRlbGV0ZSBJQUlEOwotICAgIGRlbGV0ZSBJQURUOwotICAgIGRlbGV0ZSBJQUZTOwotICAgIGRlbGV0ZSBJQURTOwotICAgIGRlbGV0ZSBJQUlUOwotICAgIGRlbGV0ZSBJQVJJOwotICAgIGRlbGV0ZSBJQVJEVzsKLSAgICBkZWxldGUgSUFSREg7Ci0gICAgcmV0dXJuIHBEaWN0OwotZmFpbGVkOgotICAgIGZvcihJID0gMDsgSSA8IE5TWU1TREVDT0RFRDsgSSsrKSB7Ci0gICAgICAgIGlmIChTRE5FV1NZTVNbSV0pIHsKLSAgICAgICAgICAgIGRlbGV0ZSBTRE5FV1NZTVNbSV07Ci0gICAgICAgICAgICBTRE5FV1NZTVNbSV0gPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTRE5FV1NZTVMpOwotICAgIGRlbGV0ZSBJQURIOwotICAgIGRlbGV0ZSBJQURXOwotICAgIGRlbGV0ZSBJQUFJOwotICAgIGRlbGV0ZSBJQVJEWDsKLSAgICBkZWxldGUgSUFSRFk7Ci0gICAgZGVsZXRlIElBRVg7Ci0gICAgZGVsZXRlIElBSUQ7Ci0gICAgZGVsZXRlIElBRFQ7Ci0gICAgZGVsZXRlIElBRlM7Ci0gICAgZGVsZXRlIElBRFM7Ci0gICAgZGVsZXRlIElBSVQ7Ci0gICAgZGVsZXRlIElBUkk7Ci0gICAgZGVsZXRlIElBUkRXOwotICAgIGRlbGV0ZSBJQVJESDsKLSAgICByZXR1cm4gTlVMTDsKLX0KLUNKQmlnMl9TeW1ib2xEaWN0ICpDSkJpZzJfU0REUHJvYzo6ZGVjb2RlX0h1ZmZtYW4oQ0pCaWcyX0JpdFN0cmVhbSAqcFN0cmVhbSwKLSAgICAgICAgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBKQmlnMkFyaXRoQ3R4ICpnckNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIENKQmlnMl9JbWFnZSAqKlNETkVXU1lNUzsKLSAgICBGWF9EV09SRCAqU0RORVdTWU1XSURUSFM7Ci0gICAgRlhfRFdPUkQgSENIRUlHSFQsIE5TWU1TREVDT0RFRDsKLSAgICBGWF9JTlQzMiBIQ0RIOwotICAgIEZYX0RXT1JEIFNZTVdJRFRILCBUT1RXSURUSCwgSENGSVJTVFNZTTsKLSAgICBGWF9JTlQzMiBEVzsKLSAgICBDSkJpZzJfSW1hZ2UgKkJTLCAqQkhDOwotICAgIEZYX0RXT1JEIEksIEosIFJFRkFHR05JTlNUOwotICAgIEZYX0JPT0wgKkVYRkxBR1M7Ci0gICAgRlhfRFdPUkQgRVhJTkRFWDsKLSAgICBGWF9CT09MIENVUkVYRkxBRzsKLSAgICBGWF9EV09SRCBFWFJVTkxFTkdUSDsKLSAgICBGWF9JTlQzMiBuVmFsLCBuQml0czsKLSAgICBGWF9EV09SRCBuVG1wOwotICAgIEZYX0RXT1JEIFNCTlVNU1lNUzsKLSAgICBGWF9CWVRFIFNCU1lNQ09ERUxFTjsKLSAgICBKQmlnMkh1ZmZtYW5Db2RlICpTQlNZTUNPREVTOwotICAgIEZYX0RXT1JEIElESTsKLSAgICBGWF9JTlQzMiBSRFhJLCBSRFlJOwotICAgIEZYX0RXT1JEIEJNU0laRTsKLSAgICBGWF9EV09SRCBzdHJpZGU7Ci0gICAgQ0pCaWcyX0ltYWdlICoqU0JTWU1TOwotICAgIENKQmlnMl9IdWZmbWFuVGFibGUgKlNCSFVGRkZTLCAqU0JIVUZGRFMsICpTQkhVRkZEVCwgKlNCSFVGRlJEVywgKlNCSFVGRlJESCwgKlNCSFVGRlJEWCwgKlNCSFVGRlJEWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICpTQkhVRkZSU0laRSwgKnBUYWJsZTsKLSAgICBDSkJpZzJfSHVmZm1hbkRlY29kZXIgKnBIdWZmbWFuRGVjb2RlcjsKLSAgICBDSkJpZzJfR1JSRFByb2MgKnBHUlJEOwotICAgIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXI7Ci0gICAgQ0pCaWcyX0dSRFByb2MgKnBHUkQ7Ci0gICAgQ0pCaWcyX1N5bWJvbERpY3QgKnBEaWN0OwotICAgIEpCSUcyX0FMTE9DKHBIdWZmbWFuRGVjb2RlciwgQ0pCaWcyX0h1ZmZtYW5EZWNvZGVyKHBTdHJlYW0pKTsKLSAgICBTRE5FV1NZTVMgPSAoQ0pCaWcyX0ltYWdlKiopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKFNETlVNTkVXU1lNUywgc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKLSAgICBGWFNZU19tZW1zZXQzMihTRE5FV1NZTVMsIDAgLCBTRE5VTU5FV1NZTVMgKiBzaXplb2YoQ0pCaWcyX0ltYWdlKikpOwotICAgIFNETkVXU1lNV0lEVEhTID0gTlVMTDsKLSAgICBCSEMgPSBOVUxMOwotICAgIGlmKFNEUkVGQUdHID09IDApIHsKLSAgICAgICAgU0RORVdTWU1XSURUSFMgPSAoRlhfRFdPUkQgKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoU0ROVU1ORVdTWU1TLCBzaXplb2YoRlhfRFdPUkQpKTsKLSAgICAgICAgRlhTWVNfbWVtc2V0MzIoU0RORVdTWU1XSURUSFMsIDAgLCBTRE5VTU5FV1NZTVMgKiBzaXplb2YoRlhfRFdPUkQpKTsKLSAgICB9Ci0gICAgSENIRUlHSFQgPSAwOwotICAgIE5TWU1TREVDT0RFRCA9IDA7Ci0gICAgQlMgPSBOVUxMOwotICAgIHdoaWxlKE5TWU1TREVDT0RFRCA8IFNETlVNTkVXU1lNUykgewotICAgICAgICBpZihwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTREhVRkZESCwgJkhDREgpICE9IDApIHsKLSAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoaHVmZm1hbik6IHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICB9Ci0gICAgICAgIEhDSEVJR0hUID0gSENIRUlHSFQgKyBIQ0RIOwotICAgICAgICBpZiAoKGludClIQ0hFSUdIVCA8IDAgfHwgKGludClIQ0hFSUdIVCA+IEpCSUcyX01BWF9JTUFHRV9TSVpFKSB7Ci0gICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzeW1ib2wgZGljdGlvbmFyeSBkZWNvZGluZyBwcm9jZWR1cmUgKGh1ZmZtYW4pOiBpbnZhbGlkIEhDSEVJR0hUIHZhbHVlLiIpOwotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgU1lNV0lEVEggPSAwOwotICAgICAgICBUT1RXSURUSCA9IDA7Ci0gICAgICAgIEhDRklSU1RTWU0gPSBOU1lNU0RFQ09ERUQ7Ci0gICAgICAgIGZvcig7OykgewotICAgICAgICAgICAgblZhbCA9IHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNESFVGRkRXLCAmRFcpOwotICAgICAgICAgICAgaWYoblZhbCA9PSBKQklHMl9PT0IpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSBpZihuVmFsICE9IDApIHsKLSAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzeW1ib2wgZGljdGlvbmFyeSBkZWNvZGluZyBwcm9jZWR1cmUgKGh1ZmZtYW4pOiB0b28gc2hvcnQuIik7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChOU1lNU0RFQ09ERUQgPj0gU0ROVU1ORVdTWU1TKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoaHVmZm1hbik6IE5TWU1TREVDT0RFRCA+PSBTRE5VTU5FV1NZTVMuIik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTWU1XSURUSCA9IFNZTVdJRFRIICsgRFc7Ci0gICAgICAgICAgICAgICAgaWYgKChpbnQpU1lNV0lEVEggPCAwIHx8IChpbnQpU1lNV0lEVEggPiBKQklHMl9NQVhfSU1BR0VfU0laRSkgewotICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzeW1ib2wgZGljdGlvbmFyeSBkZWNvZGluZyBwcm9jZWR1cmUgKGh1ZmZtYW4pOiBpbnZhbGlkIFNZTVdJRFRIIHZhbHVlLiIpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEhDSEVJR0hUID09IDAgfHwgU1lNV0lEVEggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBUT1RXSURUSCA9IFRPVFdJRFRIICsgU1lNV0lEVEg7Ci0gICAgICAgICAgICAgICAgICAgIFNETkVXU1lNU1tOU1lNU0RFQ09ERURdID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgTlNZTVNERUNPREVEID0gTlNZTVNERUNPREVEICsgMTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFRPVFdJRFRIID0gVE9UV0lEVEggKyBTWU1XSURUSDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKFNEUkVGQUdHID09IDEpIHsKLSAgICAgICAgICAgICAgICBpZihwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTREhVRkZBR0dJTlNULCAoaW50KikmUkVGQUdHTklOU1QpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgZGVjb2RpbmcgcHJvY2VkdXJlIChodWZmbWFuKTogdG9vIHNob3J0LiIpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQlMgPSBOVUxMOwotICAgICAgICAgICAgICAgIGlmKFJFRkFHR05JTlNUID4gMSkgewotICAgICAgICAgICAgICAgICAgICBDSkJpZzJfVFJEUHJvYyAqcERlY29kZXI7Ci0gICAgICAgICAgICAgICAgICAgIEpCSUcyX0FMTE9DKHBEZWNvZGVyLCBDSkJpZzJfVFJEUHJvYygpKTsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCSFVGRiA9IFNESFVGRjsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCUkVGSU5FID0gMTsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCVyA9IFNZTVdJRFRIOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JIID0gSENIRUlHSFQ7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQk5VTUlOU1RBTkNFUyA9IFJFRkFHR05JTlNUOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JTVFJJUFMgPSAxOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JOVU1TWU1TID0gU0ROVU1JTlNZTVMgKyBOU1lNU0RFQ09ERUQ7Ci0gICAgICAgICAgICAgICAgICAgIFNCTlVNU1lNUyA9IHBEZWNvZGVyLT5TQk5VTVNZTVM7Ci0gICAgICAgICAgICAgICAgICAgIFNCU1lNQ09ERVMgPSAoSkJpZzJIdWZmbWFuQ29kZSopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKFNCTlVNU1lNUywgc2l6ZW9mKEpCaWcySHVmZm1hbkNvZGUpKTsKLSAgICAgICAgICAgICAgICAgICAgblRtcCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlKChGWF9EV09SRCkoMSA8PCBuVG1wKSA8IFNCTlVNU1lNUykgewotICAgICAgICAgICAgICAgICAgICAgICAgblRtcCArKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3IoSSA9IDA7IEkgPCBTQk5VTVNZTVM7IEkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgU0JTWU1DT0RFU1tJXS5jb2RlbGVuID0gblRtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNCU1lNQ09ERVNbSV0uY29kZSA9IEk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCU1lNQ09ERVMgPSBTQlNZTUNPREVTOwotICAgICAgICAgICAgICAgICAgICBTQlNZTVMgPSAoQ0pCaWcyX0ltYWdlKiopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKFNCTlVNU1lNUywgc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfbWVtY3B5KFNCU1lNUywgU0RJTlNZTVMsIFNETlVNSU5TWU1TICogc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfbWVtY3B5KFNCU1lNUyArIFNETlVNSU5TWU1TLCBTRE5FV1NZTVMsIE5TWU1TREVDT0RFRCAqIHNpemVvZihDSkJpZzJfSW1hZ2UqKSk7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQlNZTVMgPSBTQlNZTVM7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQkRFRlBJWEVMID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCQ09NQk9QID0gSkJJRzJfQ09NUE9TRV9PUjsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlRSQU5TUE9TRUQgPSAwOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+UkVGQ09STkVSID0gSkJJRzJfQ09STkVSX1RPUExFRlQ7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQkRTT0ZGU0VUID0gMDsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGRlMsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0I2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0I2KSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CNikpOwotICAgICAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhTQkhVRkZEUywgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjgpIC8gc2l6ZW9mKEpCaWcyVGFibGVMaW5lKSwgSHVmZm1hblRhYmxlX0hUT09CX0I4KSk7Ci0gICAgICAgICAgICAgICAgICAgIEpCSUcyX0FMTE9DKFNCSFVGRkRULCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjExKSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTEpKTsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGUkRXLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE1KSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTUpKTsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGUkRILCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE1KSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTUpKTsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGUkRYLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE1KSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTUpKTsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGUkRZLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE1KSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTUpKTsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGUlNJWkUsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxKSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMSkpOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGRlMgPSBTQkhVRkZGUzsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCSFVGRkRTID0gU0JIVUZGRFM7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZEVCA9IFNCSFVGRkRUOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGUkRXID0gU0JIVUZGUkRXOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGUkRIID0gU0JIVUZGUkRIOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGUkRYID0gU0JIVUZGUkRYOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGUkRZID0gU0JIVUZGUkRZOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGUlNJWkUgPSBTQkhVRkZSU0laRTsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCUlRFTVBMQVRFID0gU0RSVEVNUExBVEU7Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQlJBVFswXSA9IFNEUkFUWzBdOwotICAgICAgICAgICAgICAgICAgICBwRGVjb2Rlci0+U0JSQVRbMV0gPSBTRFJBVFsxXTsKLSAgICAgICAgICAgICAgICAgICAgcERlY29kZXItPlNCUkFUWzJdID0gU0RSQVRbMl07Ci0gICAgICAgICAgICAgICAgICAgIHBEZWNvZGVyLT5TQlJBVFszXSA9IFNEUkFUWzNdOwotICAgICAgICAgICAgICAgICAgICBCUyA9IHBEZWNvZGVyLT5kZWNvZGVfSHVmZm1hbihwU3RyZWFtLCBnckNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICBpZihCUyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1DT0RFUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1TKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZGUzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZEUzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZEVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZSRFc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGUkRIOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFNCSFVGRlJEWDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZSRFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGUlNJWkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcERlY29kZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1DT0RFUyk7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTQlNZTVMpOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGRlM7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZEUzsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFNCSFVGRkRUOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGUkRXOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGUkRIOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGUkRYOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGUkRZOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgU0JIVUZGUlNJWkU7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwRGVjb2RlcjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYoUkVGQUdHTklOU1QgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBTQk5VTVNZTVMgPSBTRE5VTUlOU1lNUyArIFNETlVNTkVXU1lNUzsKLSAgICAgICAgICAgICAgICAgICAgblRtcCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlKChGWF9EV09SRCkoMSA8PCBuVG1wKSA8IFNCTlVNU1lNUykgewotICAgICAgICAgICAgICAgICAgICAgICAgblRtcCArKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTQlNZTUNPREVMRU4gPSAoRlhfQllURSluVG1wOwotICAgICAgICAgICAgICAgICAgICBTQlNZTUNPREVTID0gKEpCaWcySHVmZm1hbkNvZGUqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihTQk5VTVNZTVMsIHNpemVvZihKQmlnMkh1ZmZtYW5Db2RlKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihJID0gMDsgSSA8IFNCTlVNU1lNUzsgSSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTQlNZTUNPREVTW0ldLmNvZGVsZW4gPSBTQlNZTUNPREVMRU47Ci0gICAgICAgICAgICAgICAgICAgICAgICBTQlNZTUNPREVTW0ldLmNvZGUgPSBJOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5WYWwgPSAwOwotICAgICAgICAgICAgICAgICAgICBuQml0cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvcig7OykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYocFN0cmVhbS0+cmVhZDFCaXQoJm5UbXApICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1DT0RFUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigic3ltYm9sIGRpY3Rpb25hcnkgZGVjb2RpbmcgcHJvY2VkdXJlIChodWZmbWFuKTogdG9vIHNob3J0LiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgblZhbCA9IChuVmFsIDw8IDEpIHwgblRtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihJREkgPSAwOyBJREkgPCBTQk5VTVNZTVM7IElESSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKG5WYWwgPT0gU0JTWU1DT0RFU1tJREldLmNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAobkJpdHMgPT0gU0JTWU1DT0RFU1tJREldLmNvZGVsZW4pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKElESSA8IFNCTlVNU1lNUykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTQlNZTUNPREVTKTsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGUkRYLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIdWZmbWFuVGFibGVfQjE1KSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTUpKTsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MoU0JIVUZGUlNJWkUsIENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSHVmZm1hblRhYmxlX0IxKSAvIHNpemVvZihKQmlnMlRhYmxlTGluZSksIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMSkpOwotICAgICAgICAgICAgICAgICAgICBpZigocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0JIVUZGUkRYLCAmUkRYSSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0JIVUZGUkRYLCAmUkRZSSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0JIVUZGUlNJWkUsICZuVmFsKSAhPSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIFNCSFVGRlJEWDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZSU0laRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoaHVmZm1hbik6IHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZSRFg7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBTQkhVRkZSU0laRTsKLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbS0+YWxpZ25CeXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG5UbXAgPSBwU3RyZWFtLT5nZXRPZmZzZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgU0JTWU1TID0gKENKQmlnMl9JbWFnZSoqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihTQk5VTVNZTVMsIHNpemVvZihDSkJpZzJfSW1hZ2UqKSk7Ci0gICAgICAgICAgICAgICAgICAgIEpCSUcyX21lbWNweShTQlNZTVMsIFNESU5TWU1TLCBTRE5VTUlOU1lNUyAqIHNpemVvZihDSkJpZzJfSW1hZ2UqKSk7Ci0gICAgICAgICAgICAgICAgICAgIEpCSUcyX21lbWNweShTQlNZTVMgKyBTRE5VTUlOU1lNUywgU0RORVdTWU1TLCBOU1lNU0RFQ09ERUQgKiBzaXplb2YoQ0pCaWcyX0ltYWdlKikpOwotICAgICAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhwR1JSRCwgQ0pCaWcyX0dSUkRQcm9jKCkpOwotICAgICAgICAgICAgICAgICAgICBwR1JSRC0+R1JXID0gU1lNV0lEVEg7Ci0gICAgICAgICAgICAgICAgICAgIHBHUlJELT5HUkggPSBIQ0hFSUdIVDsKLSAgICAgICAgICAgICAgICAgICAgcEdSUkQtPkdSVEVNUExBVEUgPSBTRFJURU1QTEFURTsKLSAgICAgICAgICAgICAgICAgICAgcEdSUkQtPkdSUkVGRVJFTkNFID0gU0JTWU1TW0lESV07Ci0gICAgICAgICAgICAgICAgICAgIHBHUlJELT5HUlJFRkVSRU5DRURYID0gUkRYSTsKLSAgICAgICAgICAgICAgICAgICAgcEdSUkQtPkdSUkVGRVJFTkNFRFkgPSBSRFlJOwotICAgICAgICAgICAgICAgICAgICBwR1JSRC0+VFBHUk9OID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcEdSUkQtPkdSQVRbMF0gPSBTRFJBVFswXTsKLSAgICAgICAgICAgICAgICAgICAgcEdSUkQtPkdSQVRbMV0gPSBTRFJBVFsxXTsKLSAgICAgICAgICAgICAgICAgICAgcEdSUkQtPkdSQVRbMl0gPSBTRFJBVFsyXTsKLSAgICAgICAgICAgICAgICAgICAgcEdSUkQtPkdSQVRbM10gPSBTRFJBVFszXTsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MocEFyaXRoRGVjb2RlciwgQ0pCaWcyX0FyaXRoRGVjb2RlcihwU3RyZWFtKSk7Ci0gICAgICAgICAgICAgICAgICAgIEJTID0gcEdSUkQtPmRlY29kZShwQXJpdGhEZWNvZGVyLCBnckNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICBpZihCUyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0JTWU1TKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwR1JSRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwQXJpdGhEZWNvZGVyOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcFN0cmVhbS0+YWxpZ25CeXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHBTdHJlYW0tPm9mZnNldCgyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoKEZYX0RXT1JEKW5WYWwgIT0gKHBTdHJlYW0tPmdldE9mZnNldCgpIC0gblRtcCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBCUzsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTQlNZTVMpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBHUlJEOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBBcml0aERlY29kZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0Vycm9yKCJzeW1ib2wgZGljdGlvbmFyeSBkZWNvZGluZyBwcm9jZWR1cmUgKGh1ZmZtYW4pOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVzIHByb2Nlc3NlZCBieSBnZW5lcmljIHJlZmluZW1lbnQgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZSBkb2Vzbid0IGVxdWFsIFNCSFVGRlJTSVpFLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKFNCU1lNUyk7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwR1JSRDsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBBcml0aERlY29kZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNETkVXU1lNU1tOU1lNU0RFQ09ERURdID0gQlM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihTRFJFRkFHRyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgU0RORVdTWU1XSURUSFNbTlNZTVNERUNPREVEXSA9IFNZTVdJRFRIOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTlNZTVNERUNPREVEID0gTlNZTVNERUNPREVEICsgMTsKLSAgICAgICAgfQotICAgICAgICBpZihTRFJFRkFHRyA9PSAwKSB7Ci0gICAgICAgICAgICBpZihwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTREhVRkZCTVNJWkUsIChGWF9JTlQzMiopJkJNU0laRSkgIT0gMCkgewotICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoaHVmZm1hbik6IHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBTdHJlYW0tPmFsaWduQnl0ZSgpOwotICAgICAgICAgICAgaWYoQk1TSVpFID09IDApIHsKLSAgICAgICAgICAgICAgICBzdHJpZGUgPSAoVE9UV0lEVEggKyA3KSA+PiAzOwotICAgICAgICAgICAgICAgIGlmKHBTdHJlYW0tPmdldEJ5dGVMZWZ0KCkgPj0gc3RyaWRlICogSENIRUlHSFQpIHsKLSAgICAgICAgICAgICAgICAgICAgSkJJRzJfQUxMT0MoQkhDLCBDSkJpZzJfSW1hZ2UoVE9UV0lEVEgsIEhDSEVJR0hUKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihJID0gMDsgSSA8IEhDSEVJR0hUOyBJICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBKQklHMl9tZW1jcHkoQkhDLT5tX3BEYXRhICsgSSAqIEJIQy0+bV9uU3RyaWRlLCBwU3RyZWFtLT5nZXRQb2ludGVyKCksIHN0cmlkZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtLT5vZmZzZXQoc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoaHVmZm1hbik6IHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBKQklHMl9BTExPQyhwR1JELCBDSkJpZzJfR1JEUHJvYygpKTsKLSAgICAgICAgICAgICAgICBwR1JELT5NTVIgPSAxOwotICAgICAgICAgICAgICAgIHBHUkQtPkdCVyA9IFRPVFdJRFRIOwotICAgICAgICAgICAgICAgIHBHUkQtPkdCSCA9IEhDSEVJR0hUOwotICAgICAgICAgICAgICAgIEZYQ09ERUNfU1RBVFVTIHN0YXR1cyA9IHBHUkQtPlN0YXJ0X2RlY29kZV9NTVIoJkJIQywgcFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgd2hpbGUoc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgcEdSRC0+Q29udGludWVfZGVjb2RlKHBQYXVzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlbGV0ZSBwR1JEOwotICAgICAgICAgICAgICAgIHBTdHJlYW0tPmFsaWduQnl0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgblRtcCA9IDA7Ci0gICAgICAgICAgICBpZiAoIUJIQykgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yKEkgPSBIQ0ZJUlNUU1lNOyBJIDwgTlNZTVNERUNPREVEOyBJKyspIHsKLSAgICAgICAgICAgICAgICBTRE5FV1NZTVNbSV0gPSBCSEMtPnN1YkltYWdlKG5UbXAsIDAsIFNETkVXU1lNV0lEVEhTW0ldLCBIQ0hFSUdIVCk7Ci0gICAgICAgICAgICAgICAgblRtcCArPSBTRE5FV1NZTVdJRFRIU1tJXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlbGV0ZSBCSEM7Ci0gICAgICAgICAgICBCSEMgPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIEVYSU5ERVggPSAwOwotICAgIENVUkVYRkxBRyA9IDA7Ci0gICAgSkJJRzJfQUxMT0MocFRhYmxlLCBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEh1ZmZtYW5UYWJsZV9CMSkgLyBzaXplb2YoSkJpZzJUYWJsZUxpbmUpLCBIdWZmbWFuVGFibGVfSFRPT0JfQjEpKTsKLSAgICBFWEZMQUdTID0gKEZYX0JPT0wqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoRlhfQk9PTCksIChTRE5VTUlOU1lNUyArIFNETlVNTkVXU1lNUykpOwotICAgIHdoaWxlKEVYSU5ERVggPCBTRE5VTUlOU1lNUyArIFNETlVNTkVXU1lNUykgewotICAgICAgICBpZihwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShwVGFibGUsIChpbnQqKSZFWFJVTkxFTkdUSCkgIT0gMCkgewotICAgICAgICAgICAgZGVsZXRlIHBUYWJsZTsKLSAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShFWEZMQUdTKTsKLSAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoaHVmZm1hbik6IHRvbyBzaG9ydC4iKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChFWElOREVYICsgRVhSVU5MRU5HVEggPiBTRE5VTUlOU1lNUyArIFNETlVNTkVXU1lNUykgewotICAgICAgICAgICAgZGVsZXRlIHBUYWJsZTsKLSAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShFWEZMQUdTKTsKLSAgICAgICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoInN5bWJvbCBkaWN0aW9uYXJ5IGRlY29kaW5nIHByb2NlZHVyZSAoYXJpdGgpOiBJbnZhbGlkIEVYUlVOTEVOR1RIIHZhbHVlLiIpOwotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoRVhSVU5MRU5HVEggIT0gMCkgewotICAgICAgICAgICAgZm9yKEkgPSBFWElOREVYOyBJIDwgRVhJTkRFWCArIEVYUlVOTEVOR1RIOyBJKyspIHsKLSAgICAgICAgICAgICAgICBFWEZMQUdTW0ldID0gQ1VSRVhGTEFHOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEVYSU5ERVggPSBFWElOREVYICsgRVhSVU5MRU5HVEg7Ci0gICAgICAgIENVUkVYRkxBRyA9ICFDVVJFWEZMQUc7Ci0gICAgfQotICAgIGRlbGV0ZSBwVGFibGU7Ci0gICAgSkJJRzJfQUxMT0MocERpY3QsIENKQmlnMl9TeW1ib2xEaWN0KCkpOwotICAgIHBEaWN0LT5TRE5VTUVYU1lNUyA9IFNETlVNRVhTWU1TOwotICAgIHBEaWN0LT5TREVYU1lNUyA9IChDSkJpZzJfSW1hZ2UqKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKENKQmlnMl9JbWFnZSopLCBTRE5VTUVYU1lNUyk7Ci0gICAgSSA9IEogPSAwOwotICAgIGZvcihJID0gMDsgSSA8IFNETlVNSU5TWU1TICsgU0ROVU1ORVdTWU1TOyBJKyspIHsKLSAgICAgICAgaWYoRVhGTEFHU1tJXSAmJiBKIDwgU0ROVU1FWFNZTVMpIHsKLSAgICAgICAgICAgIGlmKEkgPCBTRE5VTUlOU1lNUykgewotICAgICAgICAgICAgICAgIEpCSUcyX0FMTE9DKHBEaWN0LT5TREVYU1lNU1tKXSwgQ0pCaWcyX0ltYWdlKCpTRElOU1lNU1tJXSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwRGljdC0+U0RFWFNZTVNbSl0gPSBTRE5FV1NZTVNbSSAtIFNETlVNSU5TWU1TXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEogPSBKICsgMTsKLSAgICAgICAgfSBlbHNlIGlmICghRVhGTEFHU1tJXSAmJiBJID49IFNETlVNSU5TWU1TKSB7Ci0gICAgICAgICAgICBkZWxldGUgU0RORVdTWU1TW0kgLSBTRE5VTUlOU1lNU107Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKEogPCBTRE5VTUVYU1lNUykgewotICAgICAgICBwRGljdC0+U0ROVU1FWFNZTVMgPSBKOwotICAgIH0KLSAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoRVhGTEFHUyk7Ci0gICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKFNETkVXU1lNUyk7Ci0gICAgaWYoU0RSRUZBR0cgPT0gMCkgewotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoU0RORVdTWU1XSURUSFMpOwotICAgIH0KLSAgICBkZWxldGUgcEh1ZmZtYW5EZWNvZGVyOwotICAgIHJldHVybiBwRGljdDsKLWZhaWxlZDoKLSAgICBmb3IoSSA9IDA7IEkgPCBOU1lNU0RFQ09ERUQ7IEkrKykgewotICAgICAgICBpZiAoU0RORVdTWU1TW0ldKSB7Ci0gICAgICAgICAgICBkZWxldGUgU0RORVdTWU1TW0ldOwotICAgICAgICB9Ci0gICAgfQotICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTRE5FV1NZTVMpOwotICAgIGlmKFNEUkVGQUdHID09IDApIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKFNETkVXU1lNV0lEVEhTKTsKLSAgICB9Ci0gICAgZGVsZXRlIHBIdWZmbWFuRGVjb2RlcjsKLSAgICByZXR1cm4gTlVMTDsKLX0KLUNKQmlnMl9JbWFnZSAqQ0pCaWcyX0hUUkRQcm9jOjpkZWNvZGVfQXJpdGgoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwKLSAgICAgICAgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBGWF9EV09SRCBuZywgbWc7Ci0gICAgRlhfSU5UMzIgeCwgeTsKLSAgICBDSkJpZzJfSW1hZ2UgKkhTS0lQOwotICAgIEZYX0RXT1JEIEhCUFA7Ci0gICAgRlhfRFdPUkQgKkdJOwotICAgIENKQmlnMl9JbWFnZSAqSFRSRUc7Ci0gICAgQ0pCaWcyX0dTSURQcm9jICpwR0lEOwotICAgIEpCSUcyX0FMTE9DKEhUUkVHLCBDSkJpZzJfSW1hZ2UoSEJXLCBIQkgpKTsKLSAgICBIVFJFRy0+ZmlsbChIREVGUElYRUwpOwotICAgIEhTS0lQID0gTlVMTDsKLSAgICBpZihIRU5BQkxFU0tJUCA9PSAxKSB7Ci0gICAgICAgIEpCSUcyX0FMTE9DKEhTS0lQLCBDSkJpZzJfSW1hZ2UoSEdXLCBIR0gpKTsKLSAgICAgICAgZm9yKG1nID0gMDsgbWcgPCBIR0g7IG1nKyspIHsKLSAgICAgICAgICAgIGZvcihuZyA9IDA7IG5nIDwgSEdXOyBuZysrKSB7Ci0gICAgICAgICAgICAgICAgeCA9IChIR1ggKyBtZyAqIEhSWSArIG5nICogSFJYKSA+PiA4OwotICAgICAgICAgICAgICAgIHkgPSAoSEdZICsgbWcgKiBIUlggLSBuZyAqIEhSWSkgPj4gODsKLSAgICAgICAgICAgICAgICBpZigoeCArIEhQVyA8PSAwKSB8ICh4ID49IChGWF9JTlQzMilIQlcpCi0gICAgICAgICAgICAgICAgICAgICAgICB8ICh5ICsgSFBIIDw9IDApIHwgKHkgPj0gKEZYX0lOVDMyKUhQSCkpIHsKLSAgICAgICAgICAgICAgICAgICAgSFNLSVAtPnNldFBpeGVsKG5nLCBtZywgMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgSFNLSVAtPnNldFBpeGVsKG5nLCBtZywgMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIEhCUFAgPSAxOwotICAgIHdoaWxlKChGWF9EV09SRCkoMSA8PCBIQlBQKSA8IEhOVU1QQVRTKSB7Ci0gICAgICAgIEhCUFAgKys7Ci0gICAgfQotICAgIEpCSUcyX0FMTE9DKHBHSUQsIENKQmlnMl9HU0lEUHJvYygpKTsKLSAgICBwR0lELT5HU01NUiA9IEhNTVI7Ci0gICAgcEdJRC0+R1NXID0gSEdXOwotICAgIHBHSUQtPkdTSCA9IEhHSDsKLSAgICBwR0lELT5HU0JQUCA9IChGWF9CWVRFKUhCUFA7Ci0gICAgcEdJRC0+R1NVU0VTS0lQID0gSEVOQUJMRVNLSVA7Ci0gICAgcEdJRC0+R1NLSVAgPSBIU0tJUDsKLSAgICBwR0lELT5HU1RFTVBMQVRFID0gSFRFTVBMQVRFOwotICAgIEdJID0gcEdJRC0+ZGVjb2RlX0FyaXRoKHBBcml0aERlY29kZXIsIGdiQ29udGV4dCwgcFBhdXNlKTsKLSAgICBpZihHSSA9PSBOVUxMKSB7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLSAgICBmb3IobWcgPSAwOyBtZyA8IEhHSDsgbWcrKykgewotICAgICAgICBmb3IobmcgPSAwOyBuZyA8IEhHVzsgbmcrKykgewotICAgICAgICAgICAgeCA9IChIR1ggKyBtZyAqIEhSWSArIG5nICogSFJYKSA+PiA4OwotICAgICAgICAgICAgeSA9IChIR1kgKyBtZyAqIEhSWCAtIG5nICogSFJZKSA+PiA4OwotICAgICAgICAgICAgRlhfRFdPUkQgcGF0X2luZGV4ID0gR0lbbWcgKiBIR1cgKyBuZ107Ci0gICAgICAgICAgICBpZiAocGF0X2luZGV4ID49IEhOVU1QQVRTKSB7Ci0gICAgICAgICAgICAgICAgcGF0X2luZGV4ID0gSE5VTVBBVFMgLSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSFRSRUctPmNvbXBvc2VGcm9tKHgsIHksIEhQQVRTW3BhdF9pbmRleF0sIEhDT01CT1ApOwotICAgICAgICB9Ci0gICAgfQotICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShHSSk7Ci0gICAgaWYoSFNLSVApIHsKLSAgICAgICAgZGVsZXRlIEhTS0lQOwotICAgIH0KLSAgICBkZWxldGUgcEdJRDsKLSAgICByZXR1cm4gSFRSRUc7Ci1mYWlsZWQ6Ci0gICAgaWYoSFNLSVApIHsKLSAgICAgICAgZGVsZXRlIEhTS0lQOwotICAgIH0KLSAgICBkZWxldGUgcEdJRDsKLSAgICBkZWxldGUgSFRSRUc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci1DSkJpZzJfSW1hZ2UgKkNKQmlnMl9IVFJEUHJvYzo6ZGVjb2RlX01NUihDSkJpZzJfQml0U3RyZWFtICpwU3RyZWFtLCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBGWF9EV09SRCBuZywgbWc7Ci0gICAgRlhfSU5UMzIgeCwgeTsKLSAgICBGWF9EV09SRCBIQlBQOwotICAgIEZYX0RXT1JEICpHSTsKLSAgICBDSkJpZzJfSW1hZ2UgKkhUUkVHOwotICAgIENKQmlnMl9HU0lEUHJvYyAqcEdJRDsKLSAgICBKQklHMl9BTExPQyhIVFJFRywgQ0pCaWcyX0ltYWdlKEhCVywgSEJIKSk7Ci0gICAgSFRSRUctPmZpbGwoSERFRlBJWEVMKTsKLSAgICBIQlBQID0gMTsKLSAgICB3aGlsZSgoRlhfRFdPUkQpKDEgPDwgSEJQUCkgPCBITlVNUEFUUykgewotICAgICAgICBIQlBQICsrOwotICAgIH0KLSAgICBKQklHMl9BTExPQyhwR0lELCBDSkJpZzJfR1NJRFByb2MoKSk7Ci0gICAgcEdJRC0+R1NNTVIgPSBITU1SOwotICAgIHBHSUQtPkdTVyA9IEhHVzsKLSAgICBwR0lELT5HU0ggPSBIR0g7Ci0gICAgcEdJRC0+R1NCUFAgPSAoRlhfQllURSlIQlBQOwotICAgIHBHSUQtPkdTVVNFU0tJUCA9IDA7Ci0gICAgR0kgPSBwR0lELT5kZWNvZGVfTU1SKHBTdHJlYW0sIHBQYXVzZSk7Ci0gICAgaWYoR0kgPT0gTlVMTCkgewotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgZm9yKG1nID0gMDsgbWcgPCBIR0g7IG1nKyspIHsKLSAgICAgICAgZm9yKG5nID0gMDsgbmcgPCBIR1c7IG5nKyspIHsKLSAgICAgICAgICAgIHggPSAoSEdYICsgbWcgKiBIUlkgKyBuZyAqIEhSWCkgPj4gODsKLSAgICAgICAgICAgIHkgPSAoSEdZICsgbWcgKiBIUlggLSBuZyAqIEhSWSkgPj4gODsKLSAgICAgICAgICAgIEZYX0RXT1JEIHBhdF9pbmRleCA9IEdJW21nICogSEdXICsgbmddOwotICAgICAgICAgICAgaWYgKHBhdF9pbmRleCA+PSBITlVNUEFUUykgewotICAgICAgICAgICAgICAgIHBhdF9pbmRleCA9IEhOVU1QQVRTIC0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEhUUkVHLT5jb21wb3NlRnJvbSh4LCB5LCBIUEFUU1twYXRfaW5kZXhdLCBIQ09NQk9QKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoR0kpOwotICAgIGRlbGV0ZSBwR0lEOwotICAgIHJldHVybiBIVFJFRzsKLWZhaWxlZDoKLSAgICBkZWxldGUgcEdJRDsKLSAgICBkZWxldGUgSFRSRUc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci1DSkJpZzJfUGF0dGVybkRpY3QgKkNKQmlnMl9QRERQcm9jOjpkZWNvZGVfQXJpdGgoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwKLSAgICAgICAgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBGWF9EV09SRCBHUkFZOwotICAgIENKQmlnMl9JbWFnZSAqQkhEQyA9IE5VTEw7Ci0gICAgQ0pCaWcyX1BhdHRlcm5EaWN0ICpwRGljdDsKLSAgICBDSkJpZzJfR1JEUHJvYyAqcEdSRDsKLSAgICBKQklHMl9BTExPQyhwRGljdCwgQ0pCaWcyX1BhdHRlcm5EaWN0KCkpOwotICAgIHBEaWN0LT5OVU1QQVRTID0gR1JBWU1BWCArIDE7Ci0gICAgcERpY3QtPkhEUEFUUyA9IChDSkJpZzJfSW1hZ2UqKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKENKQmlnMl9JbWFnZSopLCBwRGljdC0+TlVNUEFUUyk7Ci0gICAgSkJJRzJfbWVtc2V0KHBEaWN0LT5IRFBBVFMsIDAsIHNpemVvZihDSkJpZzJfSW1hZ2UqKSpwRGljdC0+TlVNUEFUUyk7Ci0gICAgSkJJRzJfQUxMT0MocEdSRCwgQ0pCaWcyX0dSRFByb2MoKSk7Ci0gICAgcEdSRC0+TU1SID0gSERNTVI7Ci0gICAgcEdSRC0+R0JXID0gKEdSQVlNQVggKyAxKSAqIEhEUFc7Ci0gICAgcEdSRC0+R0JIID0gSERQSDsKLSAgICBwR1JELT5HQlRFTVBMQVRFID0gSERURU1QTEFURTsKLSAgICBwR1JELT5UUEdET04gPSAwOwotICAgIHBHUkQtPlVTRVNLSVAgPSAwOwotICAgIHBHUkQtPkdCQVRbMF0gPSAtKEZYX0lOVDMyKUhEUFc7Ci0gICAgcEdSRC0+R0JBVFsxXSA9IDA7Ci0gICAgaWYocEdSRC0+R0JURU1QTEFURSA9PSAwKSB7Ci0gICAgICAgIHBHUkQtPkdCQVRbMl0gPSAtMzsKLSAgICAgICAgcEdSRC0+R0JBVFszXSA9IC0xOwotICAgICAgICBwR1JELT5HQkFUWzRdID0gMjsKLSAgICAgICAgcEdSRC0+R0JBVFs1XSA9IC0yOwotICAgICAgICBwR1JELT5HQkFUWzZdID0gLTI7Ci0gICAgICAgIHBHUkQtPkdCQVRbN10gPSAtMjsKLSAgICB9Ci0gICAgRlhDT0RFQ19TVEFUVVMgc3RhdHVzID0gcEdSRC0+U3RhcnRfZGVjb2RlX0FyaXRoKCZCSERDLCBwQXJpdGhEZWNvZGVyLCBnYkNvbnRleHQpOwotICAgIHdoaWxlKHN0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7Ci0gICAgICAgIHBHUkQtPkNvbnRpbnVlX2RlY29kZShwUGF1c2UpOwotICAgIH0KLSAgICBpZihCSERDID09IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIHBHUkQ7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLSAgICBkZWxldGUgcEdSRDsKLSAgICBHUkFZID0gMDsKLSAgICB3aGlsZShHUkFZIDw9IEdSQVlNQVgpIHsKLSAgICAgICAgcERpY3QtPkhEUEFUU1tHUkFZXSA9IEJIREMtPnN1YkltYWdlKEhEUFcgKiBHUkFZLCAwLCBIRFBXLCBIRFBIKTsKLSAgICAgICAgR1JBWSA9IEdSQVkgKyAxOwotICAgIH0KLSAgICBkZWxldGUgQkhEQzsKLSAgICByZXR1cm4gcERpY3Q7Ci1mYWlsZWQ6Ci0gICAgZGVsZXRlIHBEaWN0OwotICAgIHJldHVybiBOVUxMOwotfQotCi1DSkJpZzJfUGF0dGVybkRpY3QgKkNKQmlnMl9QRERQcm9jOjpkZWNvZGVfTU1SKENKQmlnMl9CaXRTdHJlYW0gKnBTdHJlYW0sIElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIEZYX0RXT1JEIEdSQVk7Ci0gICAgQ0pCaWcyX0ltYWdlICpCSERDID0gTlVMTDsKLSAgICBDSkJpZzJfUGF0dGVybkRpY3QgKnBEaWN0OwotICAgIENKQmlnMl9HUkRQcm9jICpwR1JEOwotICAgIEpCSUcyX0FMTE9DKHBEaWN0LCBDSkJpZzJfUGF0dGVybkRpY3QoKSk7Ci0gICAgcERpY3QtPk5VTVBBVFMgPSBHUkFZTUFYICsgMTsKLSAgICBwRGljdC0+SERQQVRTID0gKENKQmlnMl9JbWFnZSoqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoQ0pCaWcyX0ltYWdlKiksIHBEaWN0LT5OVU1QQVRTKTsKLSAgICBKQklHMl9tZW1zZXQocERpY3QtPkhEUEFUUywgMCwgc2l6ZW9mKENKQmlnMl9JbWFnZSopKnBEaWN0LT5OVU1QQVRTKTsKLSAgICBKQklHMl9BTExPQyhwR1JELCBDSkJpZzJfR1JEUHJvYygpKTsKLSAgICBwR1JELT5NTVIgPSBIRE1NUjsKLSAgICBwR1JELT5HQlcgPSAoR1JBWU1BWCArIDEpICogSERQVzsKLSAgICBwR1JELT5HQkggPSBIRFBIOwotICAgIEZYQ09ERUNfU1RBVFVTIHN0YXR1cyA9IHBHUkQtPlN0YXJ0X2RlY29kZV9NTVIoJkJIREMsIHBTdHJlYW0pOwotICAgIHdoaWxlKHN0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7Ci0gICAgICAgIHBHUkQtPkNvbnRpbnVlX2RlY29kZShwUGF1c2UpOwotICAgIH0KLSAgICBpZihCSERDID09IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIHBHUkQ7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLSAgICBkZWxldGUgcEdSRDsKLSAgICBHUkFZID0gMDsKLSAgICB3aGlsZShHUkFZIDw9IEdSQVlNQVgpIHsKLSAgICAgICAgcERpY3QtPkhEUEFUU1tHUkFZXSA9IEJIREMtPnN1YkltYWdlKEhEUFcgKiBHUkFZLCAwLCBIRFBXLCBIRFBIKTsKLSAgICAgICAgR1JBWSA9IEdSQVkgKyAxOwotICAgIH0KLSAgICBkZWxldGUgQkhEQzsKLSAgICByZXR1cm4gcERpY3Q7Ci1mYWlsZWQ6Ci0gICAgZGVsZXRlIHBEaWN0OwotICAgIHJldHVybiBOVUxMOwotfQotRlhfRFdPUkQgKkNKQmlnMl9HU0lEUHJvYzo6ZGVjb2RlX0FyaXRoKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBDSkJpZzJfSW1hZ2UgKipHU1BMQU5FUzsKLSAgICBGWF9JTlQzMiBKLCBLOwotICAgIEZYX0RXT1JEIHgsIHk7Ci0gICAgRlhfRFdPUkQgKkdTVkFMUzsKLSAgICBDSkJpZzJfR1JEUHJvYyAqcEdSRDsKLSAgICBHU1BMQU5FUyA9IChDSkJpZzJfSW1hZ2UgKiopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihDSkJpZzJfSW1hZ2UqKSwgR1NCUFApOwotICAgIGlmICghR1NQTEFORVMpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEdTVkFMUyA9IChGWF9EV09SRCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MzKHNpemVvZihGWF9EV09SRCksIEdTVywgR1NIKTsKLSAgICBpZiAoIUdTVkFMUykgewotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoR1NQTEFORVMpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgSkJJRzJfbWVtc2V0KEdTUExBTkVTLCAwLCBzaXplb2YoQ0pCaWcyX0ltYWdlKikqR1NCUFApOwotICAgIEpCSUcyX21lbXNldChHU1ZBTFMsIDAsIHNpemVvZihGWF9EV09SRCkqR1NXICogR1NIKTsKLSAgICBKQklHMl9BTExPQyhwR1JELCBDSkJpZzJfR1JEUHJvYygpKTsKLSAgICBwR1JELT5NTVIgPSBHU01NUjsKLSAgICBwR1JELT5HQlcgPSBHU1c7Ci0gICAgcEdSRC0+R0JIID0gR1NIOwotICAgIHBHUkQtPkdCVEVNUExBVEUgPSBHU1RFTVBMQVRFOwotICAgIHBHUkQtPlRQR0RPTiA9IDA7Ci0gICAgcEdSRC0+VVNFU0tJUCA9IEdTVVNFU0tJUDsKLSAgICBwR1JELT5TS0lQID0gR1NLSVA7Ci0gICAgaWYoR1NURU1QTEFURSA8PSAxKSB7Ci0gICAgICAgIHBHUkQtPkdCQVRbMF0gPSAzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBHUkQtPkdCQVRbMF0gPSAyOwotICAgIH0KLSAgICBwR1JELT5HQkFUWzFdID0gLTE7Ci0gICAgaWYocEdSRC0+R0JURU1QTEFURSA9PSAwKSB7Ci0gICAgICAgIHBHUkQtPkdCQVRbMl0gPSAtMzsKLSAgICAgICAgcEdSRC0+R0JBVFszXSA9IC0xOwotICAgICAgICBwR1JELT5HQkFUWzRdID0gMjsKLSAgICAgICAgcEdSRC0+R0JBVFs1XSA9IC0yOwotICAgICAgICBwR1JELT5HQkFUWzZdID0gLTI7Ci0gICAgICAgIHBHUkQtPkdCQVRbN10gPSAtMjsKLSAgICB9Ci0gICAgRlhDT0RFQ19TVEFUVVMgc3RhdHVzID0gcEdSRC0+U3RhcnRfZGVjb2RlX0FyaXRoKCZHU1BMQU5FU1tHU0JQUCAtIDFdLCBwQXJpdGhEZWNvZGVyLCBnYkNvbnRleHQpOwotICAgIHdoaWxlKHN0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7Ci0gICAgICAgIHBHUkQtPkNvbnRpbnVlX2RlY29kZShwUGF1c2UpOwotICAgIH0KLSAgICBpZihHU1BMQU5FU1tHU0JQUCAtIDFdID09IE5VTEwpIHsKLSAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgIEogPSBHU0JQUCAtIDI7Ci0gICAgd2hpbGUoSiA+PSAwKSB7Ci0gICAgICAgIEZYQ09ERUNfU1RBVFVTIHN0YXR1cyA9IHBHUkQtPlN0YXJ0X2RlY29kZV9Bcml0aCgmR1NQTEFORVNbSl0sIHBBcml0aERlY29kZXIsIGdiQ29udGV4dCk7Ci0gICAgICAgIHdoaWxlKHN0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7Ci0gICAgICAgICAgICBwR1JELT5Db250aW51ZV9kZWNvZGUocFBhdXNlKTsKLSAgICAgICAgfQotICAgICAgICBpZihHU1BMQU5FU1tKXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBmb3IoSyA9IEdTQlBQIC0gMTsgSyA+IEo7IEstLSkgewotICAgICAgICAgICAgICAgIGRlbGV0ZSBHU1BMQU5FU1tLXTsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBHU1BMQU5FU1tKXS0+Y29tcG9zZUZyb20oMCwgMCwgR1NQTEFORVNbSiArIDFdLCBKQklHMl9DT01QT1NFX1hPUik7Ci0gICAgICAgIEogPSBKIC0gMTsKLSAgICB9Ci0gICAgZm9yKHkgPSAwOyB5IDwgR1NIOyB5KyspIHsKLSAgICAgICAgZm9yKHggPSAwOyB4IDwgR1NXOyB4KyspIHsKLSAgICAgICAgICAgIGZvcihKID0gMDsgSiA8IEdTQlBQOyBKKyspIHsKLSAgICAgICAgICAgICAgICBHU1ZBTFNbeSAqIEdTVyArIHhdIHw9IEdTUExBTkVTW0pdLT5nZXRQaXhlbCh4LCB5KSA8PCBKOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGZvcihKID0gMDsgSiA8IEdTQlBQOyBKKyspIHsKLSAgICAgICAgZGVsZXRlIEdTUExBTkVTW0pdOwotICAgIH0KLSAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoR1NQTEFORVMpOwotICAgIGRlbGV0ZSBwR1JEOwotICAgIHJldHVybiBHU1ZBTFM7Ci1mYWlsZWQ6Ci0gICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKEdTUExBTkVTKTsKLSAgICBkZWxldGUgcEdSRDsKLSAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoR1NWQUxTKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLUZYX0RXT1JEICpDSkJpZzJfR1NJRFByb2M6OmRlY29kZV9NTVIoQ0pCaWcyX0JpdFN0cmVhbSAqcFN0cmVhbSwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgQ0pCaWcyX0ltYWdlICoqR1NQTEFORVM7Ci0gICAgRlhfSU5UMzIgSiwgSzsKLSAgICBGWF9EV09SRCB4LCB5OwotICAgIEZYX0RXT1JEICpHU1ZBTFM7Ci0gICAgQ0pCaWcyX0dSRFByb2MgKnBHUkQ7Ci0gICAgR1NQTEFORVMgPSAoQ0pCaWcyX0ltYWdlICoqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoQ0pCaWcyX0ltYWdlKiksIEdTQlBQKTsKLSAgICBpZiAoIUdTUExBTkVTKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBHU1ZBTFMgPSAoRlhfRFdPUkQqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMyhzaXplb2YoRlhfRFdPUkQpLCBHU1csIEdTSCk7Ci0gICAgaWYgKCFHU1ZBTFMpIHsKLSAgICAgICAgaWYgKEdTUExBTkVTKSB7Ci0gICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoR1NQTEFORVMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBKQklHMl9tZW1zZXQoR1NQTEFORVMsIDAsIHNpemVvZihDSkJpZzJfSW1hZ2UqKSpHU0JQUCk7Ci0gICAgSkJJRzJfbWVtc2V0KEdTVkFMUywgMCwgc2l6ZW9mKEZYX0RXT1JEKSpHU1cgKiBHU0gpOwotICAgIEpCSUcyX0FMTE9DKHBHUkQsIENKQmlnMl9HUkRQcm9jKCkpOwotICAgIHBHUkQtPk1NUiA9IEdTTU1SOwotICAgIHBHUkQtPkdCVyA9IEdTVzsKLSAgICBwR1JELT5HQkggPSBHU0g7Ci0gICAgRlhDT0RFQ19TVEFUVVMgc3RhdHVzID0gcEdSRC0+U3RhcnRfZGVjb2RlX01NUigmR1NQTEFORVNbR1NCUFAgLSAxXSwgcFN0cmVhbSk7Ci0gICAgd2hpbGUoc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsKLSAgICAgICAgcEdSRC0+Q29udGludWVfZGVjb2RlKHBQYXVzZSk7Ci0gICAgfQotICAgIGlmKEdTUExBTkVTW0dTQlBQIC0gMV0gPT0gTlVMTCkgewotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgcFN0cmVhbS0+YWxpZ25CeXRlKCk7Ci0gICAgcFN0cmVhbS0+b2Zmc2V0KDMpOwotICAgIEogPSBHU0JQUCAtIDI7Ci0gICAgd2hpbGUoSiA+PSAwKSB7Ci0gICAgICAgIEZYQ09ERUNfU1RBVFVTIHN0YXR1cyA9IHBHUkQtPlN0YXJ0X2RlY29kZV9NTVIoJkdTUExBTkVTW0pdLCBwU3RyZWFtKTsKLSAgICAgICAgd2hpbGUoc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsKLSAgICAgICAgICAgIHBHUkQtPkNvbnRpbnVlX2RlY29kZShwUGF1c2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmKEdTUExBTkVTW0pdID09IE5VTEwpIHsKLSAgICAgICAgICAgIGZvcihLID0gR1NCUFAgLSAxOyBLID4gSjsgSy0tKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIEdTUExBTkVTW0tdOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBTdHJlYW0tPmFsaWduQnl0ZSgpOwotICAgICAgICBwU3RyZWFtLT5vZmZzZXQoMyk7Ci0gICAgICAgIEdTUExBTkVTW0pdLT5jb21wb3NlRnJvbSgwLCAwLCBHU1BMQU5FU1tKICsgMV0sIEpCSUcyX0NPTVBPU0VfWE9SKTsKLSAgICAgICAgSiA9IEogLSAxOwotICAgIH0KLSAgICBmb3IoeSA9IDA7IHkgPCBHU0g7IHkrKykgewotICAgICAgICBmb3IoeCA9IDA7IHggPCBHU1c7IHgrKykgewotICAgICAgICAgICAgZm9yKEogPSAwOyBKIDwgR1NCUFA7IEorKykgewotICAgICAgICAgICAgICAgIEdTVkFMU1t5ICogR1NXICsgeF0gfD0gR1NQTEFORVNbSl0tPmdldFBpeGVsKHgsIHkpIDw8IEo7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9yKEogPSAwOyBKIDwgR1NCUFA7IEorKykgewotICAgICAgICBkZWxldGUgR1NQTEFORVNbSl07Ci0gICAgfQotICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShHU1BMQU5FUyk7Ci0gICAgZGVsZXRlIHBHUkQ7Ci0gICAgcmV0dXJuIEdTVkFMUzsKLWZhaWxlZDoKLSAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoR1NQTEFORVMpOwotICAgIGRlbGV0ZSBwR1JEOwotICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShHU1ZBTFMpOwotICAgIHJldHVybiBOVUxMOwotfQotRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OlN0YXJ0X2RlY29kZV9Bcml0aChDSkJpZzJfSW1hZ2UqKiBwSW1hZ2UsIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgaWYgKEdCVyA9PSAwIHx8IEdCSCA9PSAwKSB7Ci0gICAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwotICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKLSAgICB9Ci0gICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9SRUFEWTsKLSAgICBtX3BQYXVzZSA9IHBQYXVzZTsKLSAgICBpZigqcEltYWdlID09IE5VTEwpIHsKLSAgICAgICAgSkJJRzJfQUxMT0MoKCpwSW1hZ2UpLCBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKLSAgICB9Ci0gICAgaWYgKCgqcEltYWdlKS0+bV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSAqcEltYWdlOwotICAgICAgICAqcEltYWdlID0gTlVMTDsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9FcnJvcigiR2VuZXJpYyByZWdpb24gZGVjb2RpbmcgcHJvY2VkdXJlOiBDcmVhdGUgSW1hZ2UgRmFpbGVkIHdpdGggd2lkdGggPSAlZCwgaGVpZ2h0ID0gJWRcbiIsIEdCVywgR0JIKTsKLSAgICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOwotICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7Ci0gICAgfQotICAgIG1fRGVjb2RlVHlwZSA9IDE7Ci0gICAgbV9wSW1hZ2UgPSBwSW1hZ2U7Ci0gICAgKCptX3BJbWFnZSktPmZpbGwoMCk7Ci0gICAgbV9wQXJpdGhEZWNvZGVyID0gcEFyaXRoRGVjb2RlcjsKLSAgICBtX2diQ29udGV4dCA9IGdiQ29udGV4dDsKLSAgICBMVFAgPSAwOwotICAgIG1fcExpbmUgPSBOVUxMOwotICAgIG1fbG9vcEluZGV4ID0gMDsKLSAgICByZXR1cm4gZGVjb2RlX0FyaXRoKHBQYXVzZSk7Ci19Ci1GWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoKElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIGludCBpbGluZSA9IG1fbG9vcEluZGV4OwotICAgIENKQmlnMl9JbWFnZSogcEltYWdlID0gKm1fcEltYWdlOwotICAgIGlmKEdCVEVNUExBVEUgPT0gMCkgewotICAgICAgICBpZigoR0JBVFswXSA9PSAzKSAmJiAoR0JBVFsxXSA9PSAoc2lnbmVkIGNoYXIpIC0gMSkKLSAgICAgICAgICAgICAgICAmJiAoR0JBVFsyXSA9PSAoc2lnbmVkIGNoYXIpIC0gMykgJiYgKEdCQVRbM10gPT0gKHNpZ25lZCBjaGFyKSAtIDEpCi0gICAgICAgICAgICAgICAgJiYgKEdCQVRbNF0gPT0gMikgJiYgKEdCQVRbNV0gPT0gKHNpZ25lZCBjaGFyKSAtIDIpCi0gICAgICAgICAgICAgICAgJiYgKEdCQVRbNl0gPT0gKHNpZ25lZCBjaGFyKSAtIDIpICYmIChHQkFUWzddID09IChzaWduZWQgY2hhcikgLSAyKSkgewotICAgICAgICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IGRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfb3B0MyhwSW1hZ2UsIG1fcEFyaXRoRGVjb2RlciwgbV9nYkNvbnRleHQsIHBQYXVzZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX1Byb3NzaXZlU3RhdHVzID0gZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF91bm9wdChwSW1hZ2UsIG1fcEFyaXRoRGVjb2RlciwgbV9nYkNvbnRleHQsIHBQYXVzZSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYoR0JURU1QTEFURSA9PSAxKSB7Ci0gICAgICAgIGlmKChHQkFUWzBdID09IDMpICYmIChHQkFUWzFdID09IChzaWduZWQgY2hhcikgLSAxKSkgewotICAgICAgICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IGRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfb3B0MyhwSW1hZ2UsIG1fcEFyaXRoRGVjb2RlciwgbV9nYkNvbnRleHQsIHBQYXVzZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX1Byb3NzaXZlU3RhdHVzID0gZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV91bm9wdChwSW1hZ2UsIG1fcEFyaXRoRGVjb2RlciwgbV9nYkNvbnRleHQsIHBQYXVzZSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYoR0JURU1QTEFURSA9PSAyKSB7Ci0gICAgICAgIGlmKChHQkFUWzBdID09IDIpICYmIChHQkFUWzFdID09IChzaWduZWQgY2hhcikgLSAxKSkgewotICAgICAgICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9ICBkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX29wdDMocEltYWdlLCBtX3BBcml0aERlY29kZXIsIG1fZ2JDb250ZXh0LCBwUGF1c2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9ICBkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX3Vub3B0KHBJbWFnZSwgbV9wQXJpdGhEZWNvZGVyLCBtX2diQ29udGV4dCwgcFBhdXNlKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKChHQkFUWzBdID09IDIpICYmIChHQkFUWzFdID09IChzaWduZWQgY2hhcikgLSAxKSkgewotICAgICAgICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IGRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfb3B0MyhwSW1hZ2UsIG1fcEFyaXRoRGVjb2RlciwgbV9nYkNvbnRleHQsIHBQYXVzZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX1Byb3NzaXZlU3RhdHVzID0gZGVjb2RlX0FyaXRoX1RlbXBsYXRlM191bm9wdChwSW1hZ2UsIG1fcEFyaXRoRGVjb2RlciwgbV9nYkNvbnRleHQsIHBQYXVzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9SZXBsYWNlUmVjdC5sZWZ0ID0gMDsKLSAgICBtX1JlcGxhY2VSZWN0LnJpZ2h0ID0gcEltYWdlLT5tX25XaWR0aDsKLSAgICBtX1JlcGxhY2VSZWN0LnRvcCA9IGlsaW5lOwotICAgIG1fUmVwbGFjZVJlY3QuYm90dG9tID0gbV9sb29wSW5kZXg7Ci0gICAgaWYobV9Qcm9zc2l2ZVN0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIKSB7Ci0gICAgICAgIG1fbG9vcEluZGV4ID0gMDsKLSAgICB9Ci0gICAgcmV0dXJuIG1fUHJvc3NpdmVTdGF0dXM7Ci19Ci1GWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6U3RhcnRfZGVjb2RlX0FyaXRoX1YyKENKQmlnMl9JbWFnZSoqIHBJbWFnZSwgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBpZihHQlcgPT0gMCB8fCBHQkggPT0gMCkgewotICAgICAgICAqIHBJbWFnZSA9IE5VTEw7Ci0gICAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwotICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKLSAgICB9Ci0gICAgaWYoKnBJbWFnZSA9PSBOVUxMKSB7Ci0gICAgICAgIEpCSUcyX0FMTE9DKCgqcEltYWdlKSwgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7Ci0gICAgfQotICAgIGlmICgoKnBJbWFnZSktPm1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICBkZWxldGUgKnBJbWFnZTsKLSAgICAgICAgKnBJbWFnZSA9IE5VTEw7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoIkdlbmVyaWMgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZTogQ3JlYXRlIEltYWdlIEZhaWxlZCB3aXRoIHdpZHRoID0gJWQsIGhlaWdodCA9ICVkXG4iLCBHQlcsIEdCSCk7Ci0gICAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOwotICAgIH0KLSAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1JFQURZOwotICAgIG1fRGVjb2RlVHlwZSA9IDI7Ci0gICAgbV9wUGF1c2UgPSBwUGF1c2U7Ci0gICAgbV9wSW1hZ2UgPSBwSW1hZ2U7Ci0gICAgKCptX3BJbWFnZSktPmZpbGwoMCk7Ci0gICAgTFRQID0gMDsKLSAgICBtX2xvb3BJbmRleCA9IDA7Ci0gICAgbV9wQXJpdGhEZWNvZGVyID0gcEFyaXRoRGVjb2RlcjsKLSAgICBtX2diQ29udGV4dCA9IGdiQ29udGV4dDsKLSAgICByZXR1cm4gZGVjb2RlX0FyaXRoX1YyKHBQYXVzZSk7Ci19Ci1GWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1YyKElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIEZYX0JPT0wgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUOwotICAgIENKQmlnMl9JbWFnZSAqR0JSRUcgPSAqbV9wSW1hZ2U7Ci0gICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKLSAgICBMVFAgPSAwOwotICAgIEpCSUcyX0FMTE9DKEdCUkVHLCBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKLSAgICBHQlJFRy0+ZmlsbCgwKTsKLSAgICBmb3IoOyBtX2xvb3BJbmRleCA8IEdCSDsgbV9sb29wSW5kZXgrKykgewotICAgICAgICBpZihUUEdET04pIHsKLSAgICAgICAgICAgIHN3aXRjaChHQlRFTVBMQVRFKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gMHg5YjI1OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAweDA3OTU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IDB4MDBlNTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gMHgwMTk1OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNMVFAgPSBtX3BBcml0aERlY29kZXItPkRFQ09ERSgmbV9nYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgTFRQID0gTFRQIF4gU0xUUDsKLSAgICAgICAgfQotICAgICAgICBpZihMVFAgPT0gMSkgewotICAgICAgICAgICAgR0JSRUctPmNvcHlMaW5lKG1fbG9vcEluZGV4LCBtX2xvb3BJbmRleCAtIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3dpdGNoKEdCVEVNUExBVEUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDA6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUxID0gR0JSRUctPmdldFBpeGVsKDEsIG1fbG9vcEluZGV4IC0gMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgbV9sb29wSW5kZXggLSAyKSA8PCAxOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTIgPSBHQlJFRy0+Z2V0UGl4ZWwoMiwgbV9sb29wSW5kZXggLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyIHw9IEdCUkVHLT5nZXRQaXhlbCgxLCBtX2xvb3BJbmRleCAtIDEpIDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgbV9sb29wSW5kZXggLSAxKSA8PCAyOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIG1fbG9vcEluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gbGluZTM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBtX2xvb3BJbmRleCArIEdCQVRbMV0pIDw8IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgNTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbMl0sIG1fbG9vcEluZGV4ICsgR0JBVFszXSkgPDwgMTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzRdLCBtX2xvb3BJbmRleCArIEdCQVRbNV0pIDw8IDExOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDEyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFs2XSwgbV9sb29wSW5kZXggKyBHQkFUWzddKSA8PCAxNTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZhbCA9IG1fcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZtX2diQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGJWYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0JSRUctPnNldFBpeGVsKHcsIG1fbG9vcEluZGV4LCBiVmFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTEgPSAoKGxpbmUxIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAyLCBtX2xvb3BJbmRleCAtIDIpKSAmIDB4MDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAzLCBtX2xvb3BJbmRleCAtIDEpKSAmIDB4MWY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZTMgPSAoKGxpbmUzIDw8IDEpIHwgYlZhbCkgJiAweDBmOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMTogewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTEgPSBHQlJFRy0+Z2V0UGl4ZWwoMiwgbV9sb29wSW5kZXggLSAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUxIHw9IEdCUkVHLT5nZXRQaXhlbCgxLCBtX2xvb3BJbmRleCAtIDIpIDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgbV9sb29wSW5kZXggLSAyKSA8PCAyOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTIgPSBHQlJFRy0+Z2V0UGl4ZWwoMiwgbV9sb29wSW5kZXggLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyIHw9IEdCUkVHLT5nZXRQaXhlbCgxLCBtX2xvb3BJbmRleCAtIDEpIDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgbV9sb29wSW5kZXggLSAxKSA8PCAyOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIG1fbG9vcEluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gbGluZTM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBtX2xvb3BJbmRleCArIEdCQVRbMV0pIDw8IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gbV9wQXJpdGhEZWNvZGVyLT5ERUNPREUoJm1fZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYlZhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgbV9sb29wSW5kZXgsIGJWYWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDMsIG1fbG9vcEluZGV4IC0gMikpICYgMHgwZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiA9ICgobGluZTIgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDMsIG1fbG9vcEluZGV4IC0gMSkpICYgMHgxZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfCBiVmFsKSAmIDB4MDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSA9IEdCUkVHLT5nZXRQaXhlbCgxLCBtX2xvb3BJbmRleCAtIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTEgfD0gR0JSRUctPmdldFBpeGVsKDAsIG1fbG9vcEluZGV4IC0gMikgPDwgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyID0gR0JSRUctPmdldFBpeGVsKDEsIG1fbG9vcEluZGV4IC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgbV9sb29wSW5kZXggLSAxKSA8PCAxOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIG1fbG9vcEluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gbGluZTM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBtX2xvb3BJbmRleCArIEdCQVRbMV0pIDw8IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA3OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gbV9wQXJpdGhEZWNvZGVyLT5ERUNPREUoJm1fZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYlZhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgbV9sb29wSW5kZXgsIGJWYWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIG1fbG9vcEluZGV4IC0gMikpICYgMHgwNzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiA9ICgobGluZTIgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIG1fbG9vcEluZGV4IC0gMSkpICYgMHgwZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfCBiVmFsKSAmIDB4MDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMSA9IEdCUkVHLT5nZXRQaXhlbCgxLCBtX2xvb3BJbmRleCAtIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTEgfD0gR0JSRUctPmdldFBpeGVsKDAsIG1fbG9vcEluZGV4IC0gMSkgPDwgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoVVNFU0tJUCAmJiBTS0lQLT5nZXRQaXhlbCh3LCBtX2xvb3BJbmRleCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IGxpbmUyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgbV9sb29wSW5kZXggKyBHQkFUWzFdKSA8PCA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWYWwgPSBtX3BBcml0aERlY29kZXItPkRFQ09ERSgmbV9nYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihiVmFsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdCUkVHLT5zZXRQaXhlbCh3LCBtX2xvb3BJbmRleCwgYlZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUxID0gKChsaW5lMSA8PCAxKSB8IEdCUkVHLT5nZXRQaXhlbCh3ICsgMiwgbV9sb29wSW5kZXggLSAxKSkgJiAweDFmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyID0gKChsaW5lMiA8PCAxKSB8IGJWYWwpICYgMHgwZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7Ci0gICAgICAgICAgICBtX2xvb3BJbmRleCArKzsKLSAgICAgICAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwotICAgICAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7Ci0gICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7Ci19Ci1GWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6U3RhcnRfZGVjb2RlX0FyaXRoX1YxKENKQmlnMl9JbWFnZSoqIHBJbWFnZSwgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBpZihHQlcgPT0gMCB8fCBHQkggPT0gMCkgewotICAgICAgICAqIHBJbWFnZSA9IE5VTEw7Ci0gICAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwotICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKLSAgICB9Ci0gICAgaWYoKnBJbWFnZSA9PSBOVUxMKSB7Ci0gICAgICAgIEpCSUcyX0FMTE9DKCgqcEltYWdlKSwgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7Ci0gICAgfQotICAgIGlmICgoKnBJbWFnZSktPm1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICBkZWxldGUgKnBJbWFnZTsKLSAgICAgICAgKnBJbWFnZSA9IE5VTEw7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoIkdlbmVyaWMgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZTogQ3JlYXRlIEltYWdlIEZhaWxlZCB3aXRoIHdpZHRoID0gJWQsIGhlaWdodCA9ICVkXG4iLCBHQlcsIEdCSCk7Ci0gICAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJPUjsKLSAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOwotICAgIH0KLSAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1JFQURZOwotICAgIG1fcFBhdXNlID0gcFBhdXNlOwotICAgIG1fcEltYWdlID0gcEltYWdlOwotICAgIG1fRGVjb2RlVHlwZSA9IDM7Ci0gICAgKCptX3BJbWFnZSktPmZpbGwoMCk7Ci0gICAgTFRQID0gMDsKLSAgICBtX2xvb3BJbmRleCA9IDA7Ci0gICAgbV9wQXJpdGhEZWNvZGVyID0gcEFyaXRoRGVjb2RlcjsKLSAgICBtX2diQ29udGV4dCA9IGdiQ29udGV4dDsKLSAgICByZXR1cm4gZGVjb2RlX0FyaXRoX1YxKHBQYXVzZSk7Ci19Ci1GWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1YxKElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIEZYX0JPT0wgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUID0gMDsKLSAgICBDSkJpZzJfSW1hZ2UgKkdCUkVHID0gKCptX3BJbWFnZSk7Ci0gICAgZm9yKDsgbV9sb29wSW5kZXggPCBHQkg7IG1fbG9vcEluZGV4KyspIHsKLSAgICAgICAgaWYoVFBHRE9OKSB7Ci0gICAgICAgICAgICBzd2l0Y2goR0JURU1QTEFURSkgewotICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IDB4OWIyNTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gMHgwNzk1OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAweDAwZTU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IDB4MDE5NTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTTFRQID0gbV9wQXJpdGhEZWNvZGVyLT5ERUNPREUoJm1fZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgIExUUCA9IExUUCBeIFNMVFA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTFRQID09IDEpIHsKLSAgICAgICAgICAgIGZvcihGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdysrKSB7Ci0gICAgICAgICAgICAgICAgR0JSRUctPnNldFBpeGVsKHcsIG1fbG9vcEluZGV4LCBHQlJFRy0+Z2V0UGl4ZWwodywgbV9sb29wSW5kZXggLSAxKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcrKykgewotICAgICAgICAgICAgICAgIGlmKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgbV9sb29wSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEdCUkVHLT5zZXRQaXhlbCh3LCBtX2xvb3BJbmRleCwgMCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChHQlRFTVBMQVRFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDEsIG1fbG9vcEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMiwgbV9sb29wSW5kZXgpIDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDMsIG1fbG9vcEluZGV4KSA8PCAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSA0LCBtX2xvb3BJbmRleCkgPDwgMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgbV9sb29wSW5kZXggKyBHQkFUWzFdKSA8PCA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyAyLCBtX2xvb3BJbmRleCAtIDEpIDw8IDU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIDEsIG1fbG9vcEluZGV4IC0gMSkgPDwgNjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3LCBtX2xvb3BJbmRleCAtIDEpIDw8IDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDEsIG1fbG9vcEluZGV4IC0gMSkgPDwgODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMiwgbV9sb29wSW5kZXggLSAxKSA8PCA5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzJdLCBtX2xvb3BJbmRleCArIEdCQVRbM10pIDw8IDEwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzRdLCBtX2xvb3BJbmRleCArIEdCQVRbNV0pIDw8IDExOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyAxLCBtX2xvb3BJbmRleCAtIDIpIDw8IDEyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcsIG1fbG9vcEluZGV4IC0gMikgPDwgMTM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDEsIG1fbG9vcEluZGV4IC0gMikgPDwgMTQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbNl0sIG1fbG9vcEluZGV4ICsgR0JBVFs3XSkgPDwgMTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDEsIG1fbG9vcEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMiwgbV9sb29wSW5kZXgpIDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDMsIG1fbG9vcEluZGV4KSA8PCAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBtX2xvb3BJbmRleCArIEdCQVRbMV0pIDw8IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIG1fbG9vcEluZGV4IC0gMSkgPDwgNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgMSwgbV9sb29wSW5kZXggLSAxKSA8PCA1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcsIG1fbG9vcEluZGV4IC0gMSkgPDwgNjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMSwgbV9sb29wSW5kZXggLSAxKSA8PCA3OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAyLCBtX2xvb3BJbmRleCAtIDEpIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIG1fbG9vcEluZGV4IC0gMikgPDwgOTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgMSwgbV9sb29wSW5kZXggLSAyKSA8PCAxMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3LCBtX2xvb3BJbmRleCAtIDIpIDw8IDExOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAxLCBtX2xvb3BJbmRleCAtIDIpIDw8IDEyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAxLCBtX2xvb3BJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDIsIG1fbG9vcEluZGV4KSA8PCAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBtX2xvb3BJbmRleCArIEdCQVRbMV0pIDw8IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIDEsIG1fbG9vcEluZGV4IC0gMSkgPDwgMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3LCBtX2xvb3BJbmRleCAtIDEpIDw8IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDEsIG1fbG9vcEluZGV4IC0gMSkgPDwgNTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMiwgbV9sb29wSW5kZXggLSAxKSA8PCA2OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyAxLCBtX2xvb3BJbmRleCAtIDIpIDw8IDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodywgbV9sb29wSW5kZXggLSAyKSA8PCA4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAxLCBtX2xvb3BJbmRleCAtIDIpIDw8IDk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDEsIG1fbG9vcEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMiwgbV9sb29wSW5kZXgpIDw8IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDMsIG1fbG9vcEluZGV4KSA8PCAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSA0LCBtX2xvb3BJbmRleCkgPDwgMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgbV9sb29wSW5kZXggKyBHQkFUWzFdKSA8PCA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyAxLCBtX2xvb3BJbmRleCAtIDEpIDw8IDU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodywgbV9sb29wSW5kZXggLSAxKSA8PCA2OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgLSAxLCBtX2xvb3BJbmRleCAtIDEpIDw8IDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyAtIDIsIG1fbG9vcEluZGV4IC0gMSkgPDwgODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3IC0gMywgbV9sb29wSW5kZXggLSAxKSA8PCA5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBtX3BBcml0aERlY29kZXItPkRFQ09ERSgmbV9nYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgbV9sb29wSW5kZXgsIGJWYWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7Ci0gICAgICAgICAgICBtX2xvb3BJbmRleCArKzsKLSAgICAgICAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwotICAgICAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7Ci0gICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7Ci19Ci1GWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6U3RhcnRfZGVjb2RlX01NUihDSkJpZzJfSW1hZ2UqKiBwSW1hZ2UsIENKQmlnMl9CaXRTdHJlYW0gKnBTdHJlYW0sIElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIGludCBiaXRwb3MsIGk7Ci0gICAgSkJJRzJfQUxMT0MoKCogcEltYWdlKSwgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7Ci0gICAgaWYgKCgqIHBJbWFnZSktPm1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICBkZWxldGUgKCogcEltYWdlKTsKLSAgICAgICAgKCogcEltYWdlKSA9IE5VTEw7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRXJyb3IoIkdlbmVyaWMgcmVnaW9uIGRlY29kaW5nIHByb2NlZHVyZTogQ3JlYXRlIEltYWdlIEZhaWxlZCB3aXRoIHdpZHRoID0gJWQsIGhlaWdodCA9ICVkXG4iLCBHQlcsIEdCSCk7Ci0gICAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJPUjsKLSAgICAgICAgcmV0dXJuIG1fUHJvc3NpdmVTdGF0dXM7Ci0gICAgfQotICAgIGJpdHBvcyA9IChpbnQpcFN0cmVhbS0+Z2V0Qml0UG9zKCk7Ci0gICAgX0ZheEc0RGVjb2RlKG1fcE1vZHVsZSwgcFN0cmVhbS0+Z2V0QnVmKCksIHBTdHJlYW0tPmdldExlbmd0aCgpLCAmYml0cG9zLCAoKiBwSW1hZ2UpLT5tX3BEYXRhLCBHQlcsIEdCSCwgKCogcEltYWdlKS0+bV9uU3RyaWRlKTsKLSAgICBwU3RyZWFtLT5zZXRCaXRQb3MoYml0cG9zKTsKLSAgICBmb3IoaSA9IDA7IChGWF9EV09SRClpIDwgKCogcEltYWdlKS0+bV9uU3RyaWRlICogR0JIOyBpKyspIHsKLSAgICAgICAgKCogcEltYWdlKS0+bV9wRGF0YVtpXSA9IH4oKiBwSW1hZ2UpLT5tX3BEYXRhW2ldOwotICAgIH0KLSAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKLSAgICByZXR1cm4gbV9Qcm9zc2l2ZVN0YXR1czsKLX0KLUZYQ09ERUNfU1RBVFVTIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfTU1SKCkKLXsKLSAgICByZXR1cm4gbV9Qcm9zc2l2ZVN0YXR1czsKLX0KLUZYQ09ERUNfU1RBVFVTIENKQmlnMl9HUkRQcm9jOjpDb250aW51ZV9kZWNvZGUoSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgaWYobV9Qcm9zc2l2ZVN0YXR1cyAhPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7Ci0gICAgICAgIHJldHVybiBtX1Byb3NzaXZlU3RhdHVzOwotICAgIH0KLSAgICBzd2l0Y2ggKG1fRGVjb2RlVHlwZSkgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICByZXR1cm4gZGVjb2RlX0FyaXRoKHBQYXVzZSk7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHJldHVybiBkZWNvZGVfQXJpdGhfVjIocFBhdXNlKTsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgcmV0dXJuIGRlY29kZV9Bcml0aF9WMShwUGF1c2UpOwotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICByZXR1cm4gZGVjb2RlX01NUigpOwotICAgIH0KLSAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7Ci0gICAgcmV0dXJuIG1fUHJvc3NpdmVTdGF0dXM7Ci19Ci1GWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF9vcHQzKENKQmlnMl9JbWFnZSAqcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIEZYX0JPT0wgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUOwotICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKLSAgICBGWF9CWVRFICpwTGluZTEsICpwTGluZTIsIGNWYWw7Ci0gICAgRlhfSU5UMzIgblN0cmlkZSwgblN0cmlkZTIsIGs7Ci0gICAgRlhfSU5UMzIgbkxpbmVCeXRlcywgbkJpdHNMZWZ0LCBjYzsKLSAgICBpZihtX3BMaW5lID09IE5VTEwpIHsKLSAgICAgICAgbV9wTGluZSA9IHBJbWFnZS0+bV9wRGF0YTsKLSAgICB9Ci0gICAgblN0cmlkZSA9IHBJbWFnZS0+bV9uU3RyaWRlOwotICAgIG5TdHJpZGUyID0gblN0cmlkZSA8PCAxOwotICAgIG5MaW5lQnl0ZXMgPSAoKEdCVyArIDcpID4+IDMpIC0gMTsKLSAgICBuQml0c0xlZnQgPSBHQlcgLSAobkxpbmVCeXRlcyA8PCAzKTsKLSAgICBGWF9EV09SRCBoZWlnaHQgPSBHQkggJiAweDdmZmZmZmZmOwotICAgIGZvcig7IG1fbG9vcEluZGV4IDwgaGVpZ2h0OyBtX2xvb3BJbmRleCsrKSB7Ci0gICAgICAgIGlmKFRQR0RPTikgewotICAgICAgICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4OWIyNV0pOwotICAgICAgICAgICAgTFRQID0gTFRQIF4gU0xUUDsKLSAgICAgICAgfQotICAgICAgICBpZihMVFAgPT0gMSkgewotICAgICAgICAgICAgcEltYWdlLT5jb3B5TGluZShtX2xvb3BJbmRleCwgbV9sb29wSW5kZXggLSAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmKG1fbG9vcEluZGV4ID4gMSkgewotICAgICAgICAgICAgICAgIHBMaW5lMSA9IG1fcExpbmUgLSBuU3RyaWRlMjsKLSAgICAgICAgICAgICAgICBwTGluZTIgPSBtX3BMaW5lIC0gblN0cmlkZTsKLSAgICAgICAgICAgICAgICBsaW5lMSA9ICgqcExpbmUxKyspIDw8IDY7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSAqcExpbmUyKys7Ci0gICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgobGluZTEgJiAweGY4MDApIHwgKGxpbmUyICYgMHgwN2YwKSk7Ci0gICAgICAgICAgICAgICAgZm9yKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwgKCgqcExpbmUxKyspIDw8IDYpOwotICAgICAgICAgICAgICAgICAgICBsaW5lMiA9IChsaW5lMiA8PCA4KSB8ICgqcExpbmUyKyspOwotICAgICAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZm9yKGsgPSA3OyBrID49IDA7IGstLSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCBrOwotICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgoKENPTlRFWFQgJiAweDdiZjcpIDw8IDEpIHwgYlZhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTEgPj4gaykgJiAweDA4MDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMiA+PiBrKSAmIDB4MDAxMCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1fcExpbmVbY2NdID0gY1ZhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZTEgPDw9IDg7Ci0gICAgICAgICAgICAgICAgbGluZTIgPDw9IDg7Ci0gICAgICAgICAgICAgICAgY1ZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yKGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAoKChDT05URVhUICYgMHg3YmY3KSA8PCAxKSB8IGJWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTEgPj4gKDcgLSBrKSkgJiAweDA4MDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUyID4+ICg3IC0gaykpICYgMHgwMDEwKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fcExpbmVbbkxpbmVCeXRlc10gPSBjVmFsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwTGluZTIgPSBtX3BMaW5lIC0gblN0cmlkZTsKLSAgICAgICAgICAgICAgICBsaW5lMiA9IChtX2xvb3BJbmRleCAmIDEpID8gKCpwTGluZTIrKykgOiAwOwotICAgICAgICAgICAgICAgIENPTlRFWFQgPSAobGluZTIgJiAweDA3ZjApOwotICAgICAgICAgICAgICAgIGZvcihjYyA9IDA7IGNjIDwgbkxpbmVCeXRlczsgY2MrKykgewotICAgICAgICAgICAgICAgICAgICBpZihtX2xvb3BJbmRleCAmIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKCpwTGluZTIrKyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY1ZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihrID0gNzsgayA+PSAwOyBrLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAoKChDT05URVhUICYgMHg3YmY3KSA8PCAxKSB8IGJWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUyID4+IGspICYgMHgwMDEwKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbV9wTGluZVtjY10gPSBjVmFsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lMiA8PD0gODsKLSAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCBuQml0c0xlZnQ7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgoKENPTlRFWFQgJiAweDdiZjcpIDw8IDEpIHwgYlZhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMiA+PiAoNyAtIGspKSAmIDB4MDAxMCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX3BMaW5lW25MaW5lQnl0ZXNdID0gY1ZhbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX3BMaW5lICs9IG5TdHJpZGU7Ci0gICAgICAgIGlmKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgIG1fbG9vcEluZGV4Kys7Ci0gICAgICAgICAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKLSAgICAgICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwotICAgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwotfQotRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfdW5vcHQoQ0pCaWcyX0ltYWdlICogcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIEZYX0JPT0wgU0xUUCwgYlZhbDsKLSAgICBGWF9EV09SRCBDT05URVhUOwotICAgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMiwgbGluZTM7Ci0gICAgZm9yKDsgbV9sb29wSW5kZXggPCBHQkg7IG1fbG9vcEluZGV4KyspIHsKLSAgICAgICAgaWYoVFBHRE9OKSB7Ci0gICAgICAgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHg5YjI1XSk7Ci0gICAgICAgICAgICBMVFAgPSBMVFAgXiBTTFRQOwotICAgICAgICB9Ci0gICAgICAgIGlmKExUUCA9PSAxKSB7Ci0gICAgICAgICAgICBwSW1hZ2UtPmNvcHlMaW5lKG1fbG9vcEluZGV4LCBtX2xvb3BJbmRleCAtIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGluZTEgPSBwSW1hZ2UtPmdldFBpeGVsKDEsIG1fbG9vcEluZGV4IC0gMik7Ci0gICAgICAgICAgICBsaW5lMSB8PSBwSW1hZ2UtPmdldFBpeGVsKDAsIG1fbG9vcEluZGV4IC0gMikgPDwgMTsKLSAgICAgICAgICAgIGxpbmUyID0gcEltYWdlLT5nZXRQaXhlbCgyLCBtX2xvb3BJbmRleCAtIDEpOwotICAgICAgICAgICAgbGluZTIgfD0gcEltYWdlLT5nZXRQaXhlbCgxLCBtX2xvb3BJbmRleCAtIDEpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lMiB8PSBwSW1hZ2UtPmdldFBpeGVsKDAsIG1fbG9vcEluZGV4IC0gMSkgPDwgMjsKLSAgICAgICAgICAgIGxpbmUzID0gMDsKLSAgICAgICAgICAgIGZvcihGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdysrKSB7Ci0gICAgICAgICAgICAgICAgaWYoVVNFU0tJUCAmJiBTS0lQLT5nZXRQaXhlbCh3LCBtX2xvb3BJbmRleCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IGxpbmUzOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IHBJbWFnZS0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIG1fbG9vcEluZGV4ICsgR0JBVFsxXSkgPDwgNDsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMiA8PCA1OwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IHBJbWFnZS0+Z2V0UGl4ZWwodyArIEdCQVRbMl0sIG1fbG9vcEluZGV4ICsgR0JBVFszXSkgPDwgMTA7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgfD0gcEltYWdlLT5nZXRQaXhlbCh3ICsgR0JBVFs0XSwgbV9sb29wSW5kZXggKyBHQkFUWzVdKSA8PCAxMTsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCAxMjsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBwSW1hZ2UtPmdldFBpeGVsKHcgKyBHQkFUWzZdLCBtX2xvb3BJbmRleCArIEdCQVRbN10pIDw8IDE1OwotICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihiVmFsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZS0+c2V0UGl4ZWwodywgbV9sb29wSW5kZXgsIGJWYWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBwSW1hZ2UtPmdldFBpeGVsKHcgKyAyLCBtX2xvb3BJbmRleCAtIDIpKSAmIDB4MDc7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgcEltYWdlLT5nZXRQaXhlbCh3ICsgMywgbV9sb29wSW5kZXggLSAxKSkgJiAweDFmOwotICAgICAgICAgICAgICAgIGxpbmUzID0gKChsaW5lMyA8PCAxKSB8IGJWYWwpICYgMHgwZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7Ci0gICAgICAgICAgICBtX2xvb3BJbmRleCsrOwotICAgICAgICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7Ci0gICAgICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKLSAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKLX0KLUZYQ09ERUNfU1RBVFVTIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUxX29wdDMoQ0pCaWcyX0ltYWdlICpwSW1hZ2UsIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgRlhfQk9PTCBTTFRQLCBiVmFsOwotICAgIEZYX0RXT1JEIENPTlRFWFQ7Ci0gICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOwotICAgIEZYX0JZVEUgKnBMaW5lMSwgKnBMaW5lMiwgY1ZhbDsKLSAgICBGWF9JTlQzMiBuU3RyaWRlLCBuU3RyaWRlMiwgazsKLSAgICBGWF9JTlQzMiBuTGluZUJ5dGVzLCBuQml0c0xlZnQsIGNjOwotICAgIGlmICghbV9wTGluZSkgewotICAgICAgICBtX3BMaW5lID0gcEltYWdlLT5tX3BEYXRhOwotICAgIH0KLSAgICBuU3RyaWRlID0gcEltYWdlLT5tX25TdHJpZGU7Ci0gICAgblN0cmlkZTIgPSBuU3RyaWRlIDw8IDE7Ci0gICAgbkxpbmVCeXRlcyA9ICgoR0JXICsgNykgPj4gMykgLSAxOwotICAgIG5CaXRzTGVmdCA9IEdCVyAtIChuTGluZUJ5dGVzIDw8IDMpOwotICAgIGZvcig7IG1fbG9vcEluZGV4IDwgR0JIOyBtX2xvb3BJbmRleCsrKSB7Ci0gICAgICAgIGlmKFRQR0RPTikgewotICAgICAgICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDc5NV0pOwotICAgICAgICAgICAgTFRQID0gTFRQIF4gU0xUUDsKLSAgICAgICAgfQotICAgICAgICBpZihMVFAgPT0gMSkgewotICAgICAgICAgICAgcEltYWdlLT5jb3B5TGluZShtX2xvb3BJbmRleCwgbV9sb29wSW5kZXggLSAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmKG1fbG9vcEluZGV4ID4gMSkgewotICAgICAgICAgICAgICAgIHBMaW5lMSA9IG1fcExpbmUgLSBuU3RyaWRlMjsKLSAgICAgICAgICAgICAgICBwTGluZTIgPSBtX3BMaW5lIC0gblN0cmlkZTsKLSAgICAgICAgICAgICAgICBsaW5lMSA9ICgqcExpbmUxKyspIDw8IDQ7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSAqcExpbmUyKys7Ci0gICAgICAgICAgICAgICAgQ09OVEVYVCA9IChsaW5lMSAmIDB4MWUwMCkgfCAoKGxpbmUyID4+IDEpICYgMHgwMWY4KTsKLSAgICAgICAgICAgICAgICBmb3IoY2MgPSAwOyBjYyA8IG5MaW5lQnl0ZXM7IGNjKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZTEgPSAobGluZTEgPDwgOCkgfCAoKCpwTGluZTErKykgPDwgNCk7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKCpwTGluZTIrKyk7Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3IoayA9IDc7IGsgPj0gMDsgay0tKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwZWZiKSA8PCAxKSB8IGJWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTEgPj4gaykgJiAweDAyMDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUyID4+IChrICsgMSkpICYgMHgwMDA4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtX3BMaW5lW2NjXSA9IGNWYWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmUxIDw8PSA4OwotICAgICAgICAgICAgICAgIGxpbmUyIDw8PSA4OwotICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwZWZiKSA8PCAxKSB8IGJWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMSA+PiAoNyAtIGspKSAmIDB4MDIwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMiA+PiAoOCAtIGspKSAmIDB4MDAwOCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fcExpbmVbbkxpbmVCeXRlc10gPSBjVmFsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwTGluZTIgPSBtX3BMaW5lIC0gblN0cmlkZTsKLSAgICAgICAgICAgICAgICBsaW5lMiA9IChtX2xvb3BJbmRleCAmIDEpID8gKCpwTGluZTIrKykgOiAwOwotICAgICAgICAgICAgICAgIENPTlRFWFQgPSAobGluZTIgPj4gMSkgJiAweDAxZjg7Ci0gICAgICAgICAgICAgICAgZm9yKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKG1fbG9vcEluZGV4ICYgMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTIgPSAobGluZTIgPDwgOCkgfCAoKnBMaW5lMisrKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZm9yKGsgPSA3OyBrID49IDA7IGstLSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCBrOwotICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MGVmYikgPDwgMSkgfCBiVmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUyID4+IChrICsgMSkpICYgMHgwMDA4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtX3BMaW5lW2NjXSA9IGNWYWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmUyIDw8PSA4OwotICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwZWZiKSA8PCAxKSB8IGJWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMiA+PiAoOCAtIGspKSAmIDB4MDAwOCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fcExpbmVbbkxpbmVCeXRlc10gPSBjVmFsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1fcExpbmUgKz0gblN0cmlkZTsKLSAgICAgICAgaWYocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewotICAgICAgICAgICAgbV9sb29wSW5kZXgrKzsKLSAgICAgICAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwotICAgICAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7Ci0gICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7Ci19Ci1GWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV91bm9wdChDSkJpZzJfSW1hZ2UgKiBwSW1hZ2UsIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgRlhfQk9PTCBTTFRQLCBiVmFsOwotICAgIEZYX0RXT1JEIENPTlRFWFQ7Ci0gICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKLSAgICBmb3IoRlhfRFdPUkQgaCA9IDA7IGggPCBHQkg7IGgrKykgewotICAgICAgICBpZihUUEdET04pIHsKLSAgICAgICAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDA3OTVdKTsKLSAgICAgICAgICAgIExUUCA9IExUUCBeIFNMVFA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTFRQID09IDEpIHsKLSAgICAgICAgICAgIHBJbWFnZS0+Y29weUxpbmUoaCwgaCAtIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGluZTEgPSBwSW1hZ2UtPmdldFBpeGVsKDIsIGggLSAyKTsKLSAgICAgICAgICAgIGxpbmUxIHw9IHBJbWFnZS0+Z2V0UGl4ZWwoMSwgaCAtIDIpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lMSB8PSBwSW1hZ2UtPmdldFBpeGVsKDAsIGggLSAyKSA8PCAyOwotICAgICAgICAgICAgbGluZTIgPSBwSW1hZ2UtPmdldFBpeGVsKDIsIGggLSAxKTsKLSAgICAgICAgICAgIGxpbmUyIHw9IHBJbWFnZS0+Z2V0UGl4ZWwoMSwgaCAtIDEpIDw8IDE7Ci0gICAgICAgICAgICBsaW5lMiB8PSBwSW1hZ2UtPmdldFBpeGVsKDAsIGggLSAxKSA8PCAyOwotICAgICAgICAgICAgbGluZTMgPSAwOwotICAgICAgICAgICAgZm9yKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKLSAgICAgICAgICAgICAgICBpZihVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSBsaW5lMzsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBwSW1hZ2UtPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBoICsgR0JBVFsxXSkgPDwgMzsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMiA8PCA0OwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDk7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKGJWYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZTEgPSAoKGxpbmUxIDw8IDEpIHwgcEltYWdlLT5nZXRQaXhlbCh3ICsgMywgaCAtIDIpKSAmIDB4MGY7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgcEltYWdlLT5nZXRQaXhlbCh3ICsgMywgaCAtIDEpKSAmIDB4MWY7Ci0gICAgICAgICAgICAgICAgbGluZTMgPSAoKGxpbmUzIDw8IDEpIHwgYlZhbCkgJiAweDA3OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgIG1fbG9vcEluZGV4Kys7Ci0gICAgICAgICAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKLSAgICAgICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwotICAgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwotfQotRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfb3B0MyhDSkJpZzJfSW1hZ2UgKnBJbWFnZSwgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBGWF9CT09MIFNMVFAsIGJWYWw7Ci0gICAgRlhfRFdPUkQgQ09OVEVYVDsKLSAgICBGWF9EV09SRCBsaW5lMSwgbGluZTI7Ci0gICAgRlhfQllURSAqcExpbmUxLCAqcExpbmUyLCBjVmFsOwotICAgIEZYX0lOVDMyIG5TdHJpZGUsIG5TdHJpZGUyLCBrOwotICAgIEZYX0lOVDMyIG5MaW5lQnl0ZXMsIG5CaXRzTGVmdCwgY2M7Ci0gICAgaWYoIW1fcExpbmUpIHsKLSAgICAgICAgbV9wTGluZSA9IHBJbWFnZS0+bV9wRGF0YTsKLSAgICB9Ci0gICAgblN0cmlkZSA9IHBJbWFnZS0+bV9uU3RyaWRlOwotICAgIG5TdHJpZGUyID0gblN0cmlkZSA8PCAxOwotICAgIG5MaW5lQnl0ZXMgPSAoKEdCVyArIDcpID4+IDMpIC0gMTsKLSAgICBuQml0c0xlZnQgPSBHQlcgLSAobkxpbmVCeXRlcyA8PCAzKTsKLSAgICBmb3IoOyBtX2xvb3BJbmRleCA8IEdCSDsgbV9sb29wSW5kZXgrKykgewotICAgICAgICBpZihUUEdET04pIHsKLSAgICAgICAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDAwZTVdKTsKLSAgICAgICAgICAgIExUUCA9IExUUCBeIFNMVFA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTFRQID09IDEpIHsKLSAgICAgICAgICAgIHBJbWFnZS0+Y29weUxpbmUobV9sb29wSW5kZXgsIG1fbG9vcEluZGV4IC0gMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZihtX2xvb3BJbmRleCA+IDEpIHsKLSAgICAgICAgICAgICAgICBwTGluZTEgPSBtX3BMaW5lIC0gblN0cmlkZTI7Ci0gICAgICAgICAgICAgICAgcExpbmUyID0gbV9wTGluZSAtIG5TdHJpZGU7Ci0gICAgICAgICAgICAgICAgbGluZTEgPSAoKnBMaW5lMSsrKSA8PCAxOwotICAgICAgICAgICAgICAgIGxpbmUyID0gKnBMaW5lMisrOwotICAgICAgICAgICAgICAgIENPTlRFWFQgPSAobGluZTEgJiAweDAzODApIHwgKChsaW5lMiA+PiAzKSAmIDB4MDA3Yyk7Ci0gICAgICAgICAgICAgICAgZm9yKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwgKCgqcExpbmUxKyspIDw8IDEpOwotICAgICAgICAgICAgICAgICAgICBsaW5lMiA9IChsaW5lMiA8PCA4KSB8ICgqcExpbmUyKyspOwotICAgICAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZm9yKGsgPSA3OyBrID49IDA7IGstLSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCBrOwotICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MDFiZCkgPDwgMSkgfCBiVmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUxID4+IGspICYgMHgwMDgwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChsaW5lMiA+PiAoayArIDMpKSAmIDB4MDAwNCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbV9wTGluZVtjY10gPSBjVmFsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lMSA8PD0gODsKLSAgICAgICAgICAgICAgICBsaW5lMiA8PD0gODsKLSAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCBuQml0c0xlZnQ7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MDFiZCkgPDwgMSkgfCBiVmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTEgPj4gKDcgLSBrKSkgJiAweDAwODApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTIgPj4gKDEwIC0gaykpICYgMHgwMDA0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9wTGluZVtuTGluZUJ5dGVzXSA9IGNWYWw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBMaW5lMiA9IG1fcExpbmUgLSBuU3RyaWRlOwotICAgICAgICAgICAgICAgIGxpbmUyID0gKG1fbG9vcEluZGV4ICYgMSkgPyAoKnBMaW5lMisrKSA6IDA7Ci0gICAgICAgICAgICAgICAgQ09OVEVYVCA9IChsaW5lMiA+PiAzKSAmIDB4MDA3YzsKLSAgICAgICAgICAgICAgICBmb3IoY2MgPSAwOyBjYyA8IG5MaW5lQnl0ZXM7IGNjKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobV9sb29wSW5kZXggJiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiA9IChsaW5lMiA8PCA4KSB8ICgqcExpbmUyKyspOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3IoayA9IDc7IGsgPj0gMDsgay0tKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWJkKSA8PCAxKSB8IGJWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTIgPj4gKGsgKyAzKSkgJiAweDAwMDQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1fcExpbmVbY2NdID0gY1ZhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZTIgPDw9IDg7Ci0gICAgICAgICAgICAgICAgY1ZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yKGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxYmQpIDw8IDEpIHwgYlZhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKChsaW5lMiA+PiAoMTAgLSBrKSkpICYgMHgwMDA0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9wTGluZVtuTGluZUJ5dGVzXSA9IGNWYWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9wTGluZSArPSBuU3RyaWRlOwotICAgICAgICBpZihwUGF1c2UgJiYgbV9sb29wSW5kZXggJSA1MCA9PSAwICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewotICAgICAgICAgICAgbV9sb29wSW5kZXgrKzsKLSAgICAgICAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwotICAgICAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7Ci0gICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7Ci19Ci1GWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl91bm9wdChDSkJpZzJfSW1hZ2UgKiBwSW1hZ2UsIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgRlhfQk9PTCBTTFRQLCBiVmFsOwotICAgIEZYX0RXT1JEIENPTlRFWFQ7Ci0gICAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKLSAgICBmb3IoOyBtX2xvb3BJbmRleCA8IEdCSDsgbV9sb29wSW5kZXgrKykgewotICAgICAgICBpZihUUEdET04pIHsKLSAgICAgICAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDAwZTVdKTsKLSAgICAgICAgICAgIExUUCA9IExUUCBeIFNMVFA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoTFRQID09IDEpIHsKLSAgICAgICAgICAgIHBJbWFnZS0+Y29weUxpbmUobV9sb29wSW5kZXgsIG1fbG9vcEluZGV4IC0gMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaW5lMSA9IHBJbWFnZS0+Z2V0UGl4ZWwoMSwgbV9sb29wSW5kZXggLSAyKTsKLSAgICAgICAgICAgIGxpbmUxIHw9IHBJbWFnZS0+Z2V0UGl4ZWwoMCwgbV9sb29wSW5kZXggLSAyKSA8PCAxOwotICAgICAgICAgICAgbGluZTIgPSBwSW1hZ2UtPmdldFBpeGVsKDEsIG1fbG9vcEluZGV4IC0gMSk7Ci0gICAgICAgICAgICBsaW5lMiB8PSBwSW1hZ2UtPmdldFBpeGVsKDAsIG1fbG9vcEluZGV4IC0gMSkgPDwgMTsKLSAgICAgICAgICAgIGxpbmUzID0gMDsKLSAgICAgICAgICAgIGZvcihGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdysrKSB7Ci0gICAgICAgICAgICAgICAgaWYoVVNFU0tJUCAmJiBTS0lQLT5nZXRQaXhlbCh3LCBtX2xvb3BJbmRleCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IGxpbmUzOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IHBJbWFnZS0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIG1fbG9vcEluZGV4ICsgR0JBVFsxXSkgPDwgMjsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMiA8PCAzOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDc7Ci0gICAgICAgICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKGJWYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgcEltYWdlLT5zZXRQaXhlbCh3LCBtX2xvb3BJbmRleCwgYlZhbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmUxID0gKChsaW5lMSA8PCAxKSB8IHBJbWFnZS0+Z2V0UGl4ZWwodyArIDIsIG1fbG9vcEluZGV4IC0gMikpICYgMHgwNzsKLSAgICAgICAgICAgICAgICBsaW5lMiA9ICgobGluZTIgPDwgMSkgfCBwSW1hZ2UtPmdldFBpeGVsKHcgKyAyLCBtX2xvb3BJbmRleCAtIDEpKSAmIDB4MGY7Ci0gICAgICAgICAgICAgICAgbGluZTMgPSAoKGxpbmUzIDw8IDEpIHwgYlZhbCkgJiAweDAzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgIG1fbG9vcEluZGV4Kys7Ci0gICAgICAgICAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKLSAgICAgICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwotICAgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwotfQotRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfb3B0MyhDSkJpZzJfSW1hZ2UgKnBJbWFnZSwgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBGWF9CT09MIFNMVFAsIGJWYWw7Ci0gICAgRlhfRFdPUkQgQ09OVEVYVDsKLSAgICBGWF9EV09SRCBsaW5lMTsKLSAgICBGWF9CWVRFICpwTGluZTEsIGNWYWw7Ci0gICAgRlhfSU5UMzIgblN0cmlkZSwgazsKLSAgICBGWF9JTlQzMiBuTGluZUJ5dGVzLCBuQml0c0xlZnQsIGNjOwotICAgIGlmICghbV9wTGluZSkgewotICAgICAgICBtX3BMaW5lID0gcEltYWdlLT5tX3BEYXRhOwotICAgIH0KLSAgICBuU3RyaWRlID0gcEltYWdlLT5tX25TdHJpZGU7Ci0gICAgbkxpbmVCeXRlcyA9ICgoR0JXICsgNykgPj4gMykgLSAxOwotICAgIG5CaXRzTGVmdCA9IEdCVyAtIChuTGluZUJ5dGVzIDw8IDMpOwotICAgIGZvcig7IG1fbG9vcEluZGV4IDwgR0JIOyBtX2xvb3BJbmRleCsrKSB7Ci0gICAgICAgIGlmKFRQR0RPTikgewotICAgICAgICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDE5NV0pOwotICAgICAgICAgICAgTFRQID0gTFRQIF4gU0xUUDsKLSAgICAgICAgfQotICAgICAgICBpZihMVFAgPT0gMSkgewotICAgICAgICAgICAgcEltYWdlLT5jb3B5TGluZShtX2xvb3BJbmRleCwgbV9sb29wSW5kZXggLSAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmKG1fbG9vcEluZGV4ID4gMCkgewotICAgICAgICAgICAgICAgIHBMaW5lMSA9IG1fcExpbmUgLSBuU3RyaWRlOwotICAgICAgICAgICAgICAgIGxpbmUxID0gKnBMaW5lMSsrOwotICAgICAgICAgICAgICAgIENPTlRFWFQgPSAobGluZTEgPj4gMSkgJiAweDAzZjA7Ci0gICAgICAgICAgICAgICAgZm9yKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwgKCpwTGluZTErKyk7Ci0gICAgICAgICAgICAgICAgICAgIGNWYWwgPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3IoayA9IDc7IGsgPj0gMDsgay0tKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWY3KSA8PCAxKSB8IGJWYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgobGluZTEgPj4gKGsgKyAxKSkgJiAweDAwMTApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1fcExpbmVbY2NdID0gY1ZhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZTEgPDw9IDg7Ci0gICAgICAgICAgICAgICAgY1ZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yKGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxZjcpIDw8IDEpIHwgYlZhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGxpbmUxID4+ICg4IC0gaykpICYgMHgwMDEwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9wTGluZVtuTGluZUJ5dGVzXSA9IGNWYWw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENPTlRFWFQgPSAwOwotICAgICAgICAgICAgICAgIGZvcihjYyA9IDA7IGNjIDwgbkxpbmVCeXRlczsgY2MrKykgewotICAgICAgICAgICAgICAgICAgICBjVmFsID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZm9yKGsgPSA3OyBrID49IDA7IGstLSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCBrOwotICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MDFmNykgPDwgMSkgfCBiVmFsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1fcExpbmVbY2NdID0gY1ZhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY1ZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yKGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7Ci0gICAgICAgICAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxZjcpIDw8IDEpIHwgYlZhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9wTGluZVtuTGluZUJ5dGVzXSA9IGNWYWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9wTGluZSArPSBuU3RyaWRlOwotICAgICAgICBpZihwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7Ci0gICAgICAgICAgICBtX2xvb3BJbmRleCsrOwotICAgICAgICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7Ci0gICAgICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKLSAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKLX0KLUZYQ09ERUNfU1RBVFVTIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX3Vub3B0KENKQmlnMl9JbWFnZSAqIHBJbWFnZSwgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBGWF9CT09MIFNMVFAsIGJWYWw7Ci0gICAgRlhfRFdPUkQgQ09OVEVYVDsKLSAgICBGWF9EV09SRCBsaW5lMSwgbGluZTI7Ci0gICAgZm9yKDsgbV9sb29wSW5kZXggPCBHQkg7IG1fbG9vcEluZGV4KyspIHsKLSAgICAgICAgaWYoVFBHRE9OKSB7Ci0gICAgICAgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwMTk1XSk7Ci0gICAgICAgICAgICBMVFAgPSBMVFAgXiBTTFRQOwotICAgICAgICB9Ci0gICAgICAgIGlmKExUUCA9PSAxKSB7Ci0gICAgICAgICAgICBwSW1hZ2UtPmNvcHlMaW5lKG1fbG9vcEluZGV4LCBtX2xvb3BJbmRleCAtIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGluZTEgPSBwSW1hZ2UtPmdldFBpeGVsKDEsIG1fbG9vcEluZGV4IC0gMSk7Ci0gICAgICAgICAgICBsaW5lMSB8PSBwSW1hZ2UtPmdldFBpeGVsKDAsIG1fbG9vcEluZGV4IC0gMSkgPDwgMTsKLSAgICAgICAgICAgIGxpbmUyID0gMDsKLSAgICAgICAgICAgIGZvcihGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdysrKSB7Ci0gICAgICAgICAgICAgICAgaWYoVVNFU0tJUCAmJiBTS0lQLT5nZXRQaXhlbCh3LCBtX2xvb3BJbmRleCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYlZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCA9IGxpbmUyOwotICAgICAgICAgICAgICAgICAgICBDT05URVhUIHw9IHBJbWFnZS0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIG1fbG9vcEluZGV4ICsgR0JBVFsxXSkgPDwgNDsKLSAgICAgICAgICAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA1OwotICAgICAgICAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihiVmFsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBJbWFnZS0+c2V0UGl4ZWwodywgbV9sb29wSW5kZXgsIGJWYWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBwSW1hZ2UtPmdldFBpeGVsKHcgKyAyLCBtX2xvb3BJbmRleCAtIDEpKSAmIDB4MWY7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgYlZhbCkgJiAweDBmOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgIG1fbG9vcEluZGV4Kys7Ci0gICAgICAgICAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKLSAgICAgICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwotICAgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HZW5lcmFsRGVjb2Rlci5oIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HZW5lcmFsRGVjb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjQzYzk3Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR2VuZXJhbERlY29kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIF9KQklHMl9HRU5FUkFMX0RFQ09ERVJfSF8KLSNkZWZpbmUgX0pCSUcyX0dFTkVSQUxfREVDT0RFUl9IXwotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlY19kZWYuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0jaW5jbHVkZSAiSkJpZzJfRGVmaW5lLmgiCi0jaW5jbHVkZSAiSkJpZzJfU3ltYm9sRGljdC5oIgotI2luY2x1ZGUgIkpCaWcyX0FyaXRoRGVjb2Rlci5oIgotI2luY2x1ZGUgIkpCaWcyX0FyaXRoSW50RGVjb2Rlci5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKLWNsYXNzIENKQmlnMl9IdWZmbWFuVGFibGU7Ci1jbGFzcyBDSkJpZzJfSW1hZ2U7Ci1jbGFzcyBDSkJpZzJfUGF0dGVybkRpY3Q7Ci10eXBlZGVmIGVudW0gewotICAgIEpCSUcyX0NPUk5FUl9CT1RUT01MRUZUID0gMCwKLSAgICBKQklHMl9DT1JORVJfVE9QTEVGVAk9IDEsCi0gICAgSkJJRzJfQ09STkVSX0JPVFRPTVJJR0hUID0gMiwKLSAgICBKQklHMl9DT1JORVJfVE9QUklHSFQJPSAzCi19IEpCaWcyQ29ybmVyOwotY2xhc3MgQ0pCaWcyX0dSRFByb2MgOiBwdWJsaWMgQ0pCaWcyX09iamVjdAotewotcHVibGljOgotICAgIENKQmlnMl9HUkRQcm9jKCkKLSAgICB7Ci0gICAgICAgIG1fbG9vcEluZGV4ID0gMDsKLSAgICAgICAgbV9wTGluZSA9IE5VTEw7Ci0gICAgICAgIG1fcFBhdXNlID0gTlVMTDsKLSAgICAgICAgbV9EZWNvZGVUeXBlID0gMDsKLSAgICAgICAgTFRQID0gMDsKLSAgICAgICAgbV9SZXBsYWNlUmVjdC5sZWZ0ID0gMDsKLSAgICAgICAgbV9SZXBsYWNlUmVjdC5ib3R0b20gPSAwOwotICAgICAgICBtX1JlcGxhY2VSZWN0LnRvcCA9IDA7Ci0gICAgICAgIG1fUmVwbGFjZVJlY3QucmlnaHQgPSAwOwotICAgIH0KLQotICAgIENKQmlnMl9JbWFnZSAqZGVjb2RlX0FyaXRoKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCk7Ci0KLSAgICBDSkJpZzJfSW1hZ2UgKmRlY29kZV9Bcml0aF9WMihDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpOwotCi0gICAgQ0pCaWcyX0ltYWdlICpkZWNvZGVfQXJpdGhfVjEoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KTsKLQotICAgIENKQmlnMl9JbWFnZSAqZGVjb2RlX01NUihDSkJpZzJfQml0U3RyZWFtICpwU3RyZWFtKTsKLSAgICBGWENPREVDX1NUQVRVUyBTdGFydF9kZWNvZGVfQXJpdGgoQ0pCaWcyX0ltYWdlKiogcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCk7Ci0gICAgRlhDT0RFQ19TVEFUVVMgU3RhcnRfZGVjb2RlX0FyaXRoX1YyKENKQmlnMl9JbWFnZSoqIHBJbWFnZSwgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSA9IE5VTEwpOwotICAgIEZYQ09ERUNfU1RBVFVTIFN0YXJ0X2RlY29kZV9Bcml0aF9WMShDSkJpZzJfSW1hZ2UqKiBwSW1hZ2UsIENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKTsKLSAgICBGWENPREVDX1NUQVRVUyBTdGFydF9kZWNvZGVfTU1SKENKQmlnMl9JbWFnZSoqIHBJbWFnZSwgQ0pCaWcyX0JpdFN0cmVhbSAqcFN0cmVhbSwgSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKTsKLSAgICBGWENPREVDX1NUQVRVUyBDb250aW51ZV9kZWNvZGUoSUZYX1BhdXNlKiBwUGF1c2UpOwotICAgIEZYX1JFQ1QJCSAgIEdldFJlcGxhY2VSZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1JlcGxhY2VSZWN0OwotICAgIH07Ci1wcml2YXRlOgotICAgIEZYQ09ERUNfU1RBVFVTIGRlY29kZV9Bcml0aChJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gICAgRlhDT0RFQ19TVEFUVVMgZGVjb2RlX0FyaXRoX1YyKElGWF9QYXVzZSogcFBhdXNlKTsKLSAgICBGWENPREVDX1NUQVRVUyBkZWNvZGVfQXJpdGhfVjEoSUZYX1BhdXNlKiBwUGF1c2UpOwotICAgIEZYQ09ERUNfU1RBVFVTIGRlY29kZV9NTVIoKTsKLSAgICBGWENPREVDX1NUQVRVUyBkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX29wdDMoQ0pCaWcyX0ltYWdlKnBJbWFnZSwgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gICAgRlhDT0RFQ19TVEFUVVMgZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF91bm9wdChDSkJpZzJfSW1hZ2UgKnBJbWFnZSwgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gICAgRlhDT0RFQ19TVEFUVVMgZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV9vcHQzKENKQmlnMl9JbWFnZSAqcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKTsKLSAgICBGWENPREVDX1NUQVRVUyBkZWNvZGVfQXJpdGhfVGVtcGxhdGUxX3Vub3B0KENKQmlnMl9JbWFnZSAqIHBJbWFnZSwgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gICAgRlhDT0RFQ19TVEFUVVMgZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl9vcHQzKENKQmlnMl9JbWFnZSAqcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKTsKLSAgICBGWENPREVDX1NUQVRVUyBkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX3Vub3B0KENKQmlnMl9JbWFnZSAqIHBJbWFnZSwgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gICAgRlhDT0RFQ19TVEFUVVMgZGVjb2RlX0FyaXRoX1RlbXBsYXRlM19vcHQzKENKQmlnMl9JbWFnZSAqcEltYWdlLCBDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKTsKLSAgICBGWENPREVDX1NUQVRVUyBkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX3Vub3B0KENKQmlnMl9JbWFnZSAqIHBJbWFnZSwgQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0LCBJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gICAgRlhfRFdPUkQJbV9sb29wSW5kZXg7Ci0gICAgRlhfQllURSAqCW1fcExpbmU7Ci0gICAgSUZYX1BhdXNlKgltX3BQYXVzZTsKLSAgICBGWENPREVDX1NUQVRVUwltX1Byb3NzaXZlU3RhdHVzOwotICAgIENKQmlnMl9JbWFnZSoqIG1fcEltYWdlOwotICAgIENKQmlnMl9Bcml0aERlY29kZXIgKm1fcEFyaXRoRGVjb2RlcjsKLSAgICBKQmlnMkFyaXRoQ3R4ICptX2diQ29udGV4dDsKLSAgICBGWF9XT1JECQltX0RlY29kZVR5cGU7Ci0gICAgRlhfQk9PTCBMVFA7Ci0gICAgRlhfUkVDVCBtX1JlcGxhY2VSZWN0OwotcHJpdmF0ZToKLQotICAgIENKQmlnMl9JbWFnZSAqZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF9vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KTsKLQotICAgIENKQmlnMl9JbWFnZSAqZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF9vcHQyKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCk7Ci0KLSAgICBDSkJpZzJfSW1hZ2UgKmRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfb3B0MyhDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpOwotCi0gICAgQ0pCaWcyX0ltYWdlICpkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCk7Ci0KLSAgICBDSkJpZzJfSW1hZ2UgKmRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfb3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCk7Ci0KLSAgICBDSkJpZzJfSW1hZ2UgKmRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfb3B0MihDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpOwotCi0gICAgQ0pCaWcyX0ltYWdlICpkZWNvZGVfQXJpdGhfVGVtcGxhdGUxX29wdDMoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KTsKLQotICAgIENKQmlnMl9JbWFnZSAqZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV91bm9wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpOwotCi0gICAgQ0pCaWcyX0ltYWdlICpkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX29wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpOwotCi0gICAgQ0pCaWcyX0ltYWdlICpkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX29wdDIoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KTsKLQotICAgIENKQmlnMl9JbWFnZSAqZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl9vcHQzKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCk7Ci0KLSAgICBDSkJpZzJfSW1hZ2UgKmRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfdW5vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KTsKLQotICAgIENKQmlnMl9JbWFnZSAqZGVjb2RlX0FyaXRoX1RlbXBsYXRlM19vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ2JDb250ZXh0KTsKLQotICAgIENKQmlnMl9JbWFnZSAqZGVjb2RlX0FyaXRoX1RlbXBsYXRlM19vcHQyKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCk7Ci0KLSAgICBDSkJpZzJfSW1hZ2UgKmRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfb3B0MyhDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQpOwotCi0gICAgQ0pCaWcyX0ltYWdlICpkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCk7Ci1wdWJsaWM6Ci0gICAgRlhfQk9PTCBNTVI7Ci0gICAgRlhfRFdPUkQgR0JXOwotICAgIEZYX0RXT1JEIEdCSDsKLSAgICBGWF9CWVRFIEdCVEVNUExBVEU7Ci0gICAgRlhfQk9PTCBUUEdET047Ci0gICAgRlhfQk9PTCBVU0VTS0lQOwotICAgIENKQmlnMl9JbWFnZSAqIFNLSVA7Ci0gICAgc2lnbmVkIGNoYXIgR0JBVFs4XTsKLX07Ci1jbGFzcyBDSkJpZzJfR1JSRFByb2MgOiBwdWJsaWMgQ0pCaWcyX09iamVjdAotewotcHVibGljOgotCi0gICAgQ0pCaWcyX0ltYWdlICpkZWNvZGUoQ0pCaWcyX0FyaXRoRGVjb2RlciAqcEFyaXRoRGVjb2RlciwgSkJpZzJBcml0aEN0eCAqZ3JDb250ZXh0KTsKLQotICAgIENKQmlnMl9JbWFnZSAqZGVjb2RlX1RlbXBsYXRlMF91bm9wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnckNvbnRleHQpOwotCi0gICAgQ0pCaWcyX0ltYWdlICpkZWNvZGVfVGVtcGxhdGUwX29wdChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnckNvbnRleHQpOwotCi0gICAgQ0pCaWcyX0ltYWdlICpkZWNvZGVfVGVtcGxhdGUxX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdyQ29udGV4dCk7Ci0KLSAgICBDSkJpZzJfSW1hZ2UgKmRlY29kZV9UZW1wbGF0ZTFfb3B0KENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdyQ29udGV4dCk7Ci0KLSAgICBDSkJpZzJfSW1hZ2UgKmRlY29kZV9WMShDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnckNvbnRleHQpOwotcHVibGljOgotICAgIEZYX0RXT1JEIEdSVzsKLSAgICBGWF9EV09SRCBHUkg7Ci0gICAgRlhfQk9PTCBHUlRFTVBMQVRFOwotICAgIENKQmlnMl9JbWFnZSAqR1JSRUZFUkVOQ0U7Ci0gICAgRlhfSU5UMzIgR1JSRUZFUkVOQ0VEWDsKLSAgICBGWF9JTlQzMiBHUlJFRkVSRU5DRURZOwotICAgIEZYX0JPT0wgVFBHUk9OOwotICAgIHNpZ25lZCBjaGFyCUdSQVRbNF07Ci19OwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIENKQmlnMl9Bcml0aEludERlY29kZXIgKklBRFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqSUFGUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpJQURTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKklBSVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqSUFSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpJQVJEVywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpJQVJESCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpJQVJEWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpJQVJEWTsKLSAgICBDSkJpZzJfQXJpdGhJYWlkRGVjb2RlciAqSUFJRDsKLX0gSkJpZzJJbnREZWNvZGVyU3RhdGU7Ci1jbGFzcyBDSkJpZzJfVFJEUHJvYyA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0Ci17Ci1wdWJsaWM6Ci0KLSAgICBDSkJpZzJfSW1hZ2UgKmRlY29kZV9IdWZmbWFuKENKQmlnMl9CaXRTdHJlYW0gKnBTdHJlYW0sIEpCaWcyQXJpdGhDdHggKmdyQ29udGV4dCk7Ci0KLSAgICBDSkJpZzJfSW1hZ2UgKmRlY29kZV9Bcml0aChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJJbnREZWNvZGVyU3RhdGUgKnBJRFMgPSBOVUxMKTsKLXB1YmxpYzoKLSAgICBGWF9CT09MIFNCSFVGRjsKLSAgICBGWF9CT09MIFNCUkVGSU5FOwotICAgIEZYX0RXT1JEIFNCVzsKLSAgICBGWF9EV09SRCBTQkg7Ci0gICAgRlhfRFdPUkQgU0JOVU1JTlNUQU5DRVM7Ci0gICAgRlhfRFdPUkQgU0JTVFJJUFM7Ci0gICAgRlhfRFdPUkQgU0JOVU1TWU1TOwotCi0gICAgSkJpZzJIdWZmbWFuQ29kZSAqU0JTWU1DT0RFUzsKLSAgICBGWF9CWVRFIFNCU1lNQ09ERUxFTjsKLQotICAgIENKQmlnMl9JbWFnZSAqKlNCU1lNUzsKLSAgICBGWF9CT09MIFNCREVGUElYRUw7Ci0KLSAgICBKQmlnMkNvbXBvc2VPcCBTQkNPTUJPUDsKLSAgICBGWF9CT09MIFRSQU5TUE9TRUQ7Ci0KLSAgICBKQmlnMkNvcm5lciBSRUZDT1JORVI7Ci0gICAgc2lnbmVkIGNoYXIgU0JEU09GRlNFVDsKLSAgICBDSkJpZzJfSHVmZm1hblRhYmxlICpTQkhVRkZGUywKLSAgICAgICAgICAgICAgICAgICAgICAgICpTQkhVRkZEUywKLSAgICAgICAgICAgICAgICAgICAgICAgICpTQkhVRkZEVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICpTQkhVRkZSRFcsCi0gICAgICAgICAgICAgICAgICAgICAgICAqU0JIVUZGUkRILAotICAgICAgICAgICAgICAgICAgICAgICAgKlNCSFVGRlJEWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICpTQkhVRkZSRFksCi0gICAgICAgICAgICAgICAgICAgICAgICAqU0JIVUZGUlNJWkU7Ci0gICAgRlhfQk9PTCBTQlJURU1QTEFURTsKLSAgICBzaWduZWQgY2hhciBTQlJBVFs0XTsKLX07Ci1jbGFzcyBDSkJpZzJfU0REUHJvYyA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0Ci17Ci1wdWJsaWM6Ci0KLSAgICBDSkJpZzJfU3ltYm9sRGljdCAqZGVjb2RlX0FyaXRoKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSkJpZzJBcml0aEN0eCAqZ3JDb250ZXh0KTsKLQotICAgIENKQmlnMl9TeW1ib2xEaWN0ICpkZWNvZGVfSHVmZm1hbihDSkJpZzJfQml0U3RyZWFtICpwU3RyZWFtLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIEpCaWcyQXJpdGhDdHggKmdyQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpOwotcHVibGljOgotICAgIEZYX0JPT0wgU0RIVUZGOwotICAgIEZYX0JPT0wgU0RSRUZBR0c7Ci0gICAgRlhfRFdPUkQgU0ROVU1JTlNZTVM7Ci0gICAgQ0pCaWcyX0ltYWdlICoqIFNESU5TWU1TOwotICAgIEZYX0RXT1JEIFNETlVNTkVXU1lNUzsKLSAgICBGWF9EV09SRCBTRE5VTUVYU1lNUzsKLSAgICBDSkJpZzJfSHVmZm1hblRhYmxlICpTREhVRkZESCwKLSAgICAgICAgICAgICAgICAgICAgICAgICpTREhVRkZEVywKLSAgICAgICAgICAgICAgICAgICAgICAgICpTREhVRkZCTVNJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAqU0RIVUZGQUdHSU5TVDsKLSAgICBGWF9CWVRFIFNEVEVNUExBVEU7Ci0gICAgc2lnbmVkIGNoYXIgU0RBVFs4XTsKLSAgICBGWF9CT09MIFNEUlRFTVBMQVRFOwotICAgIHNpZ25lZCBjaGFyIFNEUkFUWzRdOwotfTsKLWNsYXNzIENKQmlnMl9IVFJEUHJvYyA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0Ci17Ci1wdWJsaWM6Ci0KLSAgICBDSkJpZzJfSW1hZ2UgKmRlY29kZV9Bcml0aChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKTsKLQotICAgIENKQmlnMl9JbWFnZSAqZGVjb2RlX01NUihDSkJpZzJfQml0U3RyZWFtICpwU3RyZWFtLCBJRlhfUGF1c2UqIHBQYXVzZSk7Ci1wdWJsaWM6Ci0gICAgRlhfRFdPUkQgSEJXLAotICAgICAgICAgICAgIEhCSDsKLSAgICBGWF9CT09MIEhNTVI7Ci0gICAgRlhfQllURSBIVEVNUExBVEU7Ci0gICAgRlhfRFdPUkQgSE5VTVBBVFM7Ci0gICAgQ0pCaWcyX0ltYWdlICoqSFBBVFM7Ci0gICAgRlhfQk9PTCBIREVGUElYRUw7Ci0gICAgSkJpZzJDb21wb3NlT3AgSENPTUJPUDsKLSAgICBGWF9CT09MIEhFTkFCTEVTS0lQOwotICAgIEZYX0RXT1JEIEhHVywKLSAgICAgICAgICAgICBIR0g7Ci0gICAgRlhfSU5UMzIgSEdYLAotICAgICAgICAgICAgIEhHWTsKLSAgICBGWF9XT1JEIEhSWCwKLSAgICAgICAgICAgIEhSWTsKLSAgICBGWF9CWVRFIEhQVywKLSAgICAgICAgICAgIEhQSDsKLX07Ci1jbGFzcyBDSkJpZzJfUEREUHJvYyA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0Ci17Ci1wdWJsaWM6Ci0KLSAgICBDSkJpZzJfUGF0dGVybkRpY3QgKmRlY29kZV9Bcml0aChDSkJpZzJfQXJpdGhEZWNvZGVyICpwQXJpdGhEZWNvZGVyLCBKQmlnMkFyaXRoQ3R4ICpnYkNvbnRleHQsIElGWF9QYXVzZSogcFBhdXNlKTsKLQotICAgIENKQmlnMl9QYXR0ZXJuRGljdCAqZGVjb2RlX01NUihDSkJpZzJfQml0U3RyZWFtICpwU3RyZWFtLCBJRlhfUGF1c2UqIHBQYXVzZSk7Ci1wdWJsaWM6Ci0gICAgRlhfQk9PTCBIRE1NUjsKLSAgICBGWF9CWVRFIEhEUFcsCi0gICAgICAgICAgICBIRFBIOwotICAgIEZYX0RXT1JEIEdSQVlNQVg7Ci0gICAgRlhfQllURSBIRFRFTVBMQVRFOwotfTsKLWNsYXNzIENKQmlnMl9HU0lEUHJvYyA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0Ci17Ci1wdWJsaWM6Ci0KLSAgICBGWF9EV09SRCAqZGVjb2RlX0FyaXRoKENKQmlnMl9Bcml0aERlY29kZXIgKnBBcml0aERlY29kZXIsIEpCaWcyQXJpdGhDdHggKmdiQ29udGV4dCwgSUZYX1BhdXNlKiBwUGF1c2UpOwotCi0gICAgRlhfRFdPUkQgKmRlY29kZV9NTVIoQ0pCaWcyX0JpdFN0cmVhbSAqcFN0cmVhbSwgSUZYX1BhdXNlKiBwUGF1c2UpOwotcHVibGljOgotICAgIEZYX0JPT0wgR1NNTVI7Ci0gICAgRlhfQk9PTCBHU1VTRVNLSVA7Ci0gICAgRlhfQllURSBHU0JQUDsKLSAgICBGWF9EV09SRCBHU1csCi0gICAgICAgICAgICAgR1NIOwotICAgIEZYX0JZVEUgR1NURU1QTEFURTsKLSAgICBDSkJpZzJfSW1hZ2UgKkdTS0lQOwotfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HcmRQcm9jLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR3JkUHJvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAzZTRhNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR3JkUHJvYy5jcHAKQEAgLTAsMCArMSwxMjU5IEBACisvLyBDb3B5cmlnaHQgMjAxNSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJKQmlnMl9HcmRQcm9jLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJKQmlnMl9Bcml0aERlY29kZXIuaCIKKyNpbmNsdWRlICJKQmlnMl9CaXRTdHJlYW0uaCIKKyNpbmNsdWRlICJKQmlnMl9JbWFnZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCisKK0NKQmlnMl9HUkRQcm9jOjpDSkJpZzJfR1JEUHJvYygpCisgICAgOiBtX2xvb3BJbmRleCgwKSwKKyAgICAgIG1fcExpbmUobnVsbHB0ciksCisgICAgICBtX3BQYXVzZShudWxscHRyKSwKKyAgICAgIG1fRGVjb2RlVHlwZSgwKSwKKyAgICAgIExUUCgwKSB7CisgIG1fUmVwbGFjZVJlY3QubGVmdCA9IDA7CisgIG1fUmVwbGFjZVJlY3QuYm90dG9tID0gMDsKKyAgbV9SZXBsYWNlUmVjdC50b3AgPSAwOworICBtX1JlcGxhY2VSZWN0LnJpZ2h0ID0gMDsKK30KKworYm9vbCBDSkJpZzJfR1JEUHJvYzo6VXNlVGVtcGxhdGUwT3B0MygpIGNvbnN0IHsKKyAgcmV0dXJuIChHQkFUWzBdID09IDMpICYmIChHQkFUWzFdID09IC0xKSAmJiAoR0JBVFsyXSA9PSAtMykgJiYKKyAgICAgICAgIChHQkFUWzNdID09IC0xKSAmJiAoR0JBVFs0XSA9PSAyKSAmJiAoR0JBVFs1XSA9PSAtMikgJiYKKyAgICAgICAgIChHQkFUWzZdID09IC0yKSAmJiAoR0JBVFs3XSA9PSAtMik7Cit9CisKK2Jvb2wgQ0pCaWcyX0dSRFByb2M6OlVzZVRlbXBsYXRlMU9wdDMoKSBjb25zdCB7CisgIHJldHVybiAoR0JBVFswXSA9PSAzKSAmJiAoR0JBVFsxXSA9PSAtMSk7Cit9CisKK2Jvb2wgQ0pCaWcyX0dSRFByb2M6OlVzZVRlbXBsYXRlMjNPcHQzKCkgY29uc3QgeworICByZXR1cm4gKEdCQVRbMF0gPT0gMikgJiYgKEdCQVRbMV0gPT0gLTEpOworfQorCitDSkJpZzJfSW1hZ2UqIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGgoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpIHsKKyAgaWYgKEdCVyA9PSAwIHx8IEdCSCA9PSAwKQorICAgIHJldHVybiBuZXcgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKTsKKworICBpZiAoR0JURU1QTEFURSA9PSAwKSB7CisgICAgaWYgKFVzZVRlbXBsYXRlME9wdDMoKSkKKyAgICAgIHJldHVybiBkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX29wdDMocEFyaXRoRGVjb2RlciwgZ2JDb250ZXh0KTsKKyAgICByZXR1cm4gZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF91bm9wdChwQXJpdGhEZWNvZGVyLCBnYkNvbnRleHQpOworICB9IGVsc2UgaWYgKEdCVEVNUExBVEUgPT0gMSkgeworICAgIGlmIChVc2VUZW1wbGF0ZTFPcHQzKCkpCisgICAgICByZXR1cm4gZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV9vcHQzKHBBcml0aERlY29kZXIsIGdiQ29udGV4dCk7CisgICAgcmV0dXJuIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfdW5vcHQocEFyaXRoRGVjb2RlciwgZ2JDb250ZXh0KTsKKyAgfSBlbHNlIGlmIChHQlRFTVBMQVRFID09IDIpIHsKKyAgICBpZiAoVXNlVGVtcGxhdGUyM09wdDMoKSkKKyAgICAgIHJldHVybiBkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX29wdDMocEFyaXRoRGVjb2RlciwgZ2JDb250ZXh0KTsKKyAgICByZXR1cm4gZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl91bm9wdChwQXJpdGhEZWNvZGVyLCBnYkNvbnRleHQpOworICB9IGVsc2UgeworICAgIGlmIChVc2VUZW1wbGF0ZTIzT3B0MygpKQorICAgICAgcmV0dXJuIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfb3B0MyhwQXJpdGhEZWNvZGVyLCBnYkNvbnRleHQpOworICAgIHJldHVybiBkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX3Vub3B0KHBBcml0aERlY29kZXIsIGdiQ29udGV4dCk7CisgIH0KK30KK0NKQmlnMl9JbWFnZSogQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfb3B0MygKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCkgeworICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgRlhfRFdPUkQgQ09OVEVYVDsKKyAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOworICB1aW50OF90KiBwTGluZSwgKnBMaW5lMSwgKnBMaW5lMiwgY1ZhbDsKKyAgaW50MzJfdCBuU3RyaWRlLCBuU3RyaWRlMiwgazsKKyAgaW50MzJfdCBuTGluZUJ5dGVzLCBuQml0c0xlZnQsIGNjOworICBMVFAgPSAwOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBHQlJFRyhuZXcgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7CisgIGlmICghR0JSRUctPm1fcERhdGEpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgcExpbmUgPSBHQlJFRy0+bV9wRGF0YTsKKyAgblN0cmlkZSA9IEdCUkVHLT5tX25TdHJpZGU7CisgIG5TdHJpZGUyID0gblN0cmlkZSA8PCAxOworICBuTGluZUJ5dGVzID0gKChHQlcgKyA3KSA+PiAzKSAtIDE7CisgIG5CaXRzTGVmdCA9IEdCVyAtIChuTGluZUJ5dGVzIDw8IDMpOworICBGWF9EV09SRCBoZWlnaHQgPSBHQkggJiAweDdmZmZmZmZmOworICBmb3IgKEZYX0RXT1JEIGggPSAwOyBoIDwgaGVpZ2h0OyBoKyspIHsKKyAgICBpZiAoVFBHRE9OKSB7CisgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHg5YjI1XSk7CisgICAgICBMVFAgPSBMVFAgXiBTTFRQOworICAgIH0KKyAgICBpZiAoTFRQID09IDEpIHsKKyAgICAgIEdCUkVHLT5jb3B5TGluZShoLCBoIC0gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChoID4gMSkgeworICAgICAgICBwTGluZTEgPSBwTGluZSAtIG5TdHJpZGUyOworICAgICAgICBwTGluZTIgPSBwTGluZSAtIG5TdHJpZGU7CisgICAgICAgIGxpbmUxID0gKCpwTGluZTErKykgPDwgNjsKKyAgICAgICAgbGluZTIgPSAqcExpbmUyKys7CisgICAgICAgIENPTlRFWFQgPSAoKGxpbmUxICYgMHhmODAwKSB8IChsaW5lMiAmIDB4MDdmMCkpOworICAgICAgICBmb3IgKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7CisgICAgICAgICAgbGluZTEgPSAobGluZTEgPDwgOCkgfCAoKCpwTGluZTErKykgPDwgNik7CisgICAgICAgICAgbGluZTIgPSAobGluZTIgPDwgOCkgfCAoKnBMaW5lMisrKTsKKyAgICAgICAgICBjVmFsID0gMDsKKyAgICAgICAgICBmb3IgKGsgPSA3OyBrID49IDA7IGstLSkgeworICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCBrOworICAgICAgICAgICAgQ09OVEVYVCA9ICgoKENPTlRFWFQgJiAweDdiZjcpIDw8IDEpIHwgYlZhbCB8CisgICAgICAgICAgICAgICAgICAgICAgICgobGluZTEgPj4gaykgJiAweDA4MDApIHwgKChsaW5lMiA+PiBrKSAmIDB4MDAxMCkpOworICAgICAgICAgIH0KKyAgICAgICAgICBwTGluZVtjY10gPSBjVmFsOworICAgICAgICB9CisgICAgICAgIGxpbmUxIDw8PSA4OworICAgICAgICBsaW5lMiA8PD0gODsKKyAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBuQml0c0xlZnQ7IGsrKykgeworICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7CisgICAgICAgICAgQ09OVEVYVCA9CisgICAgICAgICAgICAgICgoKENPTlRFWFQgJiAweDdiZjcpIDw8IDEpIHwgYlZhbCB8CisgICAgICAgICAgICAgICAoKGxpbmUxID4+ICg3IC0gaykpICYgMHgwODAwKSB8ICgobGluZTIgPj4gKDcgLSBrKSkgJiAweDAwMTApKTsKKyAgICAgICAgfQorICAgICAgICBwTGluZVtuTGluZUJ5dGVzXSA9IGNWYWw7CisgICAgICB9IGVsc2UgeworICAgICAgICBwTGluZTIgPSBwTGluZSAtIG5TdHJpZGU7CisgICAgICAgIGxpbmUyID0gKGggJiAxKSA/ICgqcExpbmUyKyspIDogMDsKKyAgICAgICAgQ09OVEVYVCA9IChsaW5lMiAmIDB4MDdmMCk7CisgICAgICAgIGZvciAoY2MgPSAwOyBjYyA8IG5MaW5lQnl0ZXM7IGNjKyspIHsKKyAgICAgICAgICBpZiAoaCAmIDEpIHsKKyAgICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKCpwTGluZTIrKyk7CisgICAgICAgICAgfQorICAgICAgICAgIGNWYWwgPSAwOworICAgICAgICAgIGZvciAoayA9IDc7IGsgPj0gMDsgay0tKSB7CisgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7CisgICAgICAgICAgICBDT05URVhUID0KKyAgICAgICAgICAgICAgICAoKChDT05URVhUICYgMHg3YmY3KSA8PCAxKSB8IGJWYWwgfCAoKGxpbmUyID4+IGspICYgMHgwMDEwKSk7CisgICAgICAgICAgfQorICAgICAgICAgIHBMaW5lW2NjXSA9IGNWYWw7CisgICAgICAgIH0KKyAgICAgICAgbGluZTIgPDw9IDg7CisgICAgICAgIGNWYWwgPSAwOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKKyAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOworICAgICAgICAgIENPTlRFWFQgPSAoKChDT05URVhUICYgMHg3YmY3KSA8PCAxKSB8IGJWYWwgfAorICAgICAgICAgICAgICAgICAgICAgKCgobGluZTIgPj4gKDcgLSBrKSkpICYgMHgwMDEwKSk7CisgICAgICAgIH0KKyAgICAgICAgcExpbmVbbkxpbmVCeXRlc10gPSBjVmFsOworICAgICAgfQorICAgIH0KKyAgICBwTGluZSArPSBuU3RyaWRlOworICB9CisgIHJldHVybiBHQlJFRy5yZWxlYXNlKCk7Cit9CisKK0NKQmlnMl9JbWFnZSogQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfdW5vcHQoCisgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpIHsKKyAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgIEZYX0RXT1JEIENPTlRFWFQ7CisgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMiwgbGluZTM7CisgIExUUCA9IDA7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IEdCUkVHKG5ldyBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKKyAgR0JSRUctPmZpbGwoMCk7CisgIGZvciAoRlhfRFdPUkQgaCA9IDA7IGggPCBHQkg7IGgrKykgeworICAgIGlmIChUUEdET04pIHsKKyAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDliMjVdKTsKKyAgICAgIExUUCA9IExUUCBeIFNMVFA7CisgICAgfQorICAgIGlmIChMVFAgPT0gMSkgeworICAgICAgR0JSRUctPmNvcHlMaW5lKGgsIGggLSAxKTsKKyAgICB9IGVsc2UgeworICAgICAgbGluZTEgPSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDIpOworICAgICAgbGluZTEgfD0gR0JSRUctPmdldFBpeGVsKDAsIGggLSAyKSA8PCAxOworICAgICAgbGluZTIgPSBHQlJFRy0+Z2V0UGl4ZWwoMiwgaCAtIDEpOworICAgICAgbGluZTIgfD0gR0JSRUctPmdldFBpeGVsKDEsIGggLSAxKSA8PCAxOworICAgICAgbGluZTIgfD0gR0JSRUctPmdldFBpeGVsKDAsIGggLSAxKSA8PCAyOworICAgICAgbGluZTMgPSAwOworICAgICAgZm9yIChGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdysrKSB7CisgICAgICAgIGlmIChVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIGgpKSB7CisgICAgICAgICAgYlZhbCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgQ09OVEVYVCA9IGxpbmUzOworICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBoICsgR0JBVFsxXSkgPDwgNDsKKyAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDU7CisgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbMl0sIGggKyBHQkFUWzNdKSA8PCAxMDsKKyAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFs0XSwgaCArIEdCQVRbNV0pIDw8IDExOworICAgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgMTI7CisgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbNl0sIGggKyBHQkFUWzddKSA8PCAxNTsKKyAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICB9CisgICAgICAgIGlmIChiVmFsKSB7CisgICAgICAgICAgR0JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOworICAgICAgICB9CisgICAgICAgIGxpbmUxID0gKChsaW5lMSA8PCAxKSB8IEdCUkVHLT5nZXRQaXhlbCh3ICsgMiwgaCAtIDIpKSAmIDB4MDc7CisgICAgICAgIGxpbmUyID0gKChsaW5lMiA8PCAxKSB8IEdCUkVHLT5nZXRQaXhlbCh3ICsgMywgaCAtIDEpKSAmIDB4MWY7CisgICAgICAgIGxpbmUzID0gKChsaW5lMyA8PCAxKSB8IGJWYWwpICYgMHgwZjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIEdCUkVHLnJlbGVhc2UoKTsKK30KKworQ0pCaWcyX0ltYWdlKiBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV9vcHQzKAorICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0KSB7CisgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOworICBGWF9EV09SRCBDT05URVhUOworICBGWF9EV09SRCBsaW5lMSwgbGluZTI7CisgIHVpbnQ4X3QqIHBMaW5lLCAqcExpbmUxLCAqcExpbmUyLCBjVmFsOworICBpbnQzMl90IG5TdHJpZGUsIG5TdHJpZGUyLCBrOworICBpbnQzMl90IG5MaW5lQnl0ZXMsIG5CaXRzTGVmdCwgY2M7CisgIExUUCA9IDA7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IEdCUkVHKG5ldyBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKKyAgaWYgKCFHQlJFRy0+bV9wRGF0YSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBwTGluZSA9IEdCUkVHLT5tX3BEYXRhOworICBuU3RyaWRlID0gR0JSRUctPm1fblN0cmlkZTsKKyAgblN0cmlkZTIgPSBuU3RyaWRlIDw8IDE7CisgIG5MaW5lQnl0ZXMgPSAoKEdCVyArIDcpID4+IDMpIC0gMTsKKyAgbkJpdHNMZWZ0ID0gR0JXIC0gKG5MaW5lQnl0ZXMgPDwgMyk7CisgIGZvciAoRlhfRFdPUkQgaCA9IDA7IGggPCBHQkg7IGgrKykgeworICAgIGlmIChUUEdET04pIHsKKyAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDA3OTVdKTsKKyAgICAgIExUUCA9IExUUCBeIFNMVFA7CisgICAgfQorICAgIGlmIChMVFAgPT0gMSkgeworICAgICAgR0JSRUctPmNvcHlMaW5lKGgsIGggLSAxKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGggPiAxKSB7CisgICAgICAgIHBMaW5lMSA9IHBMaW5lIC0gblN0cmlkZTI7CisgICAgICAgIHBMaW5lMiA9IHBMaW5lIC0gblN0cmlkZTsKKyAgICAgICAgbGluZTEgPSAoKnBMaW5lMSsrKSA8PCA0OworICAgICAgICBsaW5lMiA9ICpwTGluZTIrKzsKKyAgICAgICAgQ09OVEVYVCA9IChsaW5lMSAmIDB4MWUwMCkgfCAoKGxpbmUyID4+IDEpICYgMHgwMWY4KTsKKyAgICAgICAgZm9yIChjYyA9IDA7IGNjIDwgbkxpbmVCeXRlczsgY2MrKykgeworICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwgKCgqcExpbmUxKyspIDw8IDQpOworICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKCpwTGluZTIrKyk7CisgICAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgICAgZm9yIChrID0gNzsgayA+PSAwOyBrLS0pIHsKKyAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKKyAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDBlZmIpIDw8IDEpIHwgYlZhbCB8CisgICAgICAgICAgICAgICAgICAgICAgKChsaW5lMSA+PiBrKSAmIDB4MDIwMCkgfCAoKGxpbmUyID4+IChrICsgMSkpICYgMHgwMDA4KTsKKyAgICAgICAgICB9CisgICAgICAgICAgcExpbmVbY2NdID0gY1ZhbDsKKyAgICAgICAgfQorICAgICAgICBsaW5lMSA8PD0gODsKKyAgICAgICAgbGluZTIgPDw9IDg7CisgICAgICAgIGNWYWwgPSAwOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKKyAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOworICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDBlZmIpIDw8IDEpIHwgYlZhbCB8CisgICAgICAgICAgICAgICAgICAgICgobGluZTEgPj4gKDcgLSBrKSkgJiAweDAyMDApIHwKKyAgICAgICAgICAgICAgICAgICAgKChsaW5lMiA+PiAoOCAtIGspKSAmIDB4MDAwOCk7CisgICAgICAgIH0KKyAgICAgICAgcExpbmVbbkxpbmVCeXRlc10gPSBjVmFsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcExpbmUyID0gcExpbmUgLSBuU3RyaWRlOworICAgICAgICBsaW5lMiA9IChoICYgMSkgPyAoKnBMaW5lMisrKSA6IDA7CisgICAgICAgIENPTlRFWFQgPSAobGluZTIgPj4gMSkgJiAweDAxZjg7CisgICAgICAgIGZvciAoY2MgPSAwOyBjYyA8IG5MaW5lQnl0ZXM7IGNjKyspIHsKKyAgICAgICAgICBpZiAoaCAmIDEpIHsKKyAgICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKCpwTGluZTIrKyk7CisgICAgICAgICAgfQorICAgICAgICAgIGNWYWwgPSAwOworICAgICAgICAgIGZvciAoayA9IDc7IGsgPj0gMDsgay0tKSB7CisgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7CisgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwZWZiKSA8PCAxKSB8IGJWYWwgfAorICAgICAgICAgICAgICAgICAgICAgICgobGluZTIgPj4gKGsgKyAxKSkgJiAweDAwMDgpOworICAgICAgICAgIH0KKyAgICAgICAgICBwTGluZVtjY10gPSBjVmFsOworICAgICAgICB9CisgICAgICAgIGxpbmUyIDw8PSA4OworICAgICAgICBjVmFsID0gMDsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7CisgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKKyAgICAgICAgICBDT05URVhUID0KKyAgICAgICAgICAgICAgKChDT05URVhUICYgMHgwZWZiKSA8PCAxKSB8IGJWYWwgfCAoKGxpbmUyID4+ICg4IC0gaykpICYgMHgwMDA4KTsKKyAgICAgICAgfQorICAgICAgICBwTGluZVtuTGluZUJ5dGVzXSA9IGNWYWw7CisgICAgICB9CisgICAgfQorICAgIHBMaW5lICs9IG5TdHJpZGU7CisgIH0KKyAgcmV0dXJuIEdCUkVHLnJlbGVhc2UoKTsKK30KKworQ0pCaWcyX0ltYWdlKiBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV91bm9wdCgKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCkgeworICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgRlhfRFdPUkQgQ09OVEVYVDsKKyAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKKyAgTFRQID0gMDsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gR0JSRUcobmV3IENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOworICBHQlJFRy0+ZmlsbCgwKTsKKyAgZm9yIChGWF9EV09SRCBoID0gMDsgaCA8IEdCSDsgaCsrKSB7CisgICAgaWYgKFRQR0RPTikgeworICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDc5NV0pOworICAgICAgTFRQID0gTFRQIF4gU0xUUDsKKyAgICB9CisgICAgaWYgKExUUCA9PSAxKSB7CisgICAgICBHQlJFRy0+Y29weUxpbmUoaCwgaCAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICBsaW5lMSA9IEdCUkVHLT5nZXRQaXhlbCgyLCBoIC0gMik7CisgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDIpIDw8IDE7CisgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDIpIDw8IDI7CisgICAgICBsaW5lMiA9IEdCUkVHLT5nZXRQaXhlbCgyLCBoIC0gMSk7CisgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDEpIDw8IDE7CisgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDI7CisgICAgICBsaW5lMyA9IDA7CisgICAgICBmb3IgKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKKyAgICAgICAgaWYgKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKKyAgICAgICAgICBiVmFsID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBDT05URVhUID0gbGluZTM7CisgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIGggKyBHQkFUWzFdKSA8PCAzOworICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgNDsKKyAgICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDk7CisgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYlZhbCkgeworICAgICAgICAgIEdCUkVHLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKKyAgICAgICAgfQorICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDMsIGggLSAyKSkgJiAweDBmOworICAgICAgICBsaW5lMiA9ICgobGluZTIgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDMsIGggLSAxKSkgJiAweDFmOworICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfCBiVmFsKSAmIDB4MDc7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBHQlJFRy5yZWxlYXNlKCk7Cit9CitDSkJpZzJfSW1hZ2UqIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX29wdDMoCisgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpIHsKKyAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgIEZYX0RXT1JEIENPTlRFWFQ7CisgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKKyAgdWludDhfdCogcExpbmUsICpwTGluZTEsICpwTGluZTIsIGNWYWw7CisgIGludDMyX3QgblN0cmlkZSwgblN0cmlkZTIsIGs7CisgIGludDMyX3QgbkxpbmVCeXRlcywgbkJpdHNMZWZ0LCBjYzsKKyAgTFRQID0gMDsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gR0JSRUcobmV3IENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOworICBpZiAoIUdCUkVHLT5tX3BEYXRhKQorICAgIHJldHVybiBudWxscHRyOworCisgIHBMaW5lID0gR0JSRUctPm1fcERhdGE7CisgIG5TdHJpZGUgPSBHQlJFRy0+bV9uU3RyaWRlOworICBuU3RyaWRlMiA9IG5TdHJpZGUgPDwgMTsKKyAgbkxpbmVCeXRlcyA9ICgoR0JXICsgNykgPj4gMykgLSAxOworICBuQml0c0xlZnQgPSBHQlcgLSAobkxpbmVCeXRlcyA8PCAzKTsKKyAgZm9yIChGWF9EV09SRCBoID0gMDsgaCA8IEdCSDsgaCsrKSB7CisgICAgaWYgKFRQR0RPTikgeworICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDBlNV0pOworICAgICAgTFRQID0gTFRQIF4gU0xUUDsKKyAgICB9CisgICAgaWYgKExUUCA9PSAxKSB7CisgICAgICBHQlJFRy0+Y29weUxpbmUoaCwgaCAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoaCA+IDEpIHsKKyAgICAgICAgcExpbmUxID0gcExpbmUgLSBuU3RyaWRlMjsKKyAgICAgICAgcExpbmUyID0gcExpbmUgLSBuU3RyaWRlOworICAgICAgICBsaW5lMSA9ICgqcExpbmUxKyspIDw8IDE7CisgICAgICAgIGxpbmUyID0gKnBMaW5lMisrOworICAgICAgICBDT05URVhUID0gKGxpbmUxICYgMHgwMzgwKSB8ICgobGluZTIgPj4gMykgJiAweDAwN2MpOworICAgICAgICBmb3IgKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7CisgICAgICAgICAgbGluZTEgPSAobGluZTEgPDwgOCkgfCAoKCpwTGluZTErKykgPDwgMSk7CisgICAgICAgICAgbGluZTIgPSAobGluZTIgPDwgOCkgfCAoKnBMaW5lMisrKTsKKyAgICAgICAgICBjVmFsID0gMDsKKyAgICAgICAgICBmb3IgKGsgPSA3OyBrID49IDA7IGstLSkgeworICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCBrOworICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MDFiZCkgPDwgMSkgfCBiVmFsIHwKKyAgICAgICAgICAgICAgICAgICAgICAoKGxpbmUxID4+IGspICYgMHgwMDgwKSB8ICgobGluZTIgPj4gKGsgKyAzKSkgJiAweDAwMDQpOworICAgICAgICAgIH0KKyAgICAgICAgICBwTGluZVtjY10gPSBjVmFsOworICAgICAgICB9CisgICAgICAgIGxpbmUxIDw8PSA4OworICAgICAgICBsaW5lMiA8PD0gODsKKyAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBuQml0c0xlZnQ7IGsrKykgeworICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7CisgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MDFiZCkgPDwgMSkgfCBiVmFsIHwKKyAgICAgICAgICAgICAgICAgICAgKChsaW5lMSA+PiAoNyAtIGspKSAmIDB4MDA4MCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxpbmUyID4+ICgxMCAtIGspKSAmIDB4MDAwNCk7CisgICAgICAgIH0KKyAgICAgICAgcExpbmVbbkxpbmVCeXRlc10gPSBjVmFsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcExpbmUyID0gcExpbmUgLSBuU3RyaWRlOworICAgICAgICBsaW5lMiA9IChoICYgMSkgPyAoKnBMaW5lMisrKSA6IDA7CisgICAgICAgIENPTlRFWFQgPSAobGluZTIgPj4gMykgJiAweDAwN2M7CisgICAgICAgIGZvciAoY2MgPSAwOyBjYyA8IG5MaW5lQnl0ZXM7IGNjKyspIHsKKyAgICAgICAgICBpZiAoaCAmIDEpIHsKKyAgICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKCpwTGluZTIrKyk7CisgICAgICAgICAgfQorICAgICAgICAgIGNWYWwgPSAwOworICAgICAgICAgIGZvciAoayA9IDc7IGsgPj0gMDsgay0tKSB7CisgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7CisgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWJkKSA8PCAxKSB8IGJWYWwgfAorICAgICAgICAgICAgICAgICAgICAgICgobGluZTIgPj4gKGsgKyAzKSkgJiAweDAwMDQpOworICAgICAgICAgIH0KKyAgICAgICAgICBwTGluZVtjY10gPSBjVmFsOworICAgICAgICB9CisgICAgICAgIGxpbmUyIDw8PSA4OworICAgICAgICBjVmFsID0gMDsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7CisgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKKyAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWJkKSA8PCAxKSB8IGJWYWwgfAorICAgICAgICAgICAgICAgICAgICAoKChsaW5lMiA+PiAoMTAgLSBrKSkpICYgMHgwMDA0KTsKKyAgICAgICAgfQorICAgICAgICBwTGluZVtuTGluZUJ5dGVzXSA9IGNWYWw7CisgICAgICB9CisgICAgfQorICAgIHBMaW5lICs9IG5TdHJpZGU7CisgIH0KKyAgcmV0dXJuIEdCUkVHLnJlbGVhc2UoKTsKK30KKworQ0pCaWcyX0ltYWdlKiBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl91bm9wdCgKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCkgeworICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgRlhfRFdPUkQgQ09OVEVYVDsKKyAgRlhfRFdPUkQgbGluZTEsIGxpbmUyLCBsaW5lMzsKKyAgTFRQID0gMDsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gR0JSRUcobmV3IENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOworICBHQlJFRy0+ZmlsbCgwKTsKKyAgZm9yIChGWF9EV09SRCBoID0gMDsgaCA8IEdCSDsgaCsrKSB7CisgICAgaWYgKFRQR0RPTikgeworICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDBlNV0pOworICAgICAgTFRQID0gTFRQIF4gU0xUUDsKKyAgICB9CisgICAgaWYgKExUUCA9PSAxKSB7CisgICAgICBHQlJFRy0+Y29weUxpbmUoaCwgaCAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICBsaW5lMSA9IEdCUkVHLT5nZXRQaXhlbCgxLCBoIC0gMik7CisgICAgICBsaW5lMSB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDIpIDw8IDE7CisgICAgICBsaW5lMiA9IEdCUkVHLT5nZXRQaXhlbCgxLCBoIC0gMSk7CisgICAgICBsaW5lMiB8PSBHQlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDE7CisgICAgICBsaW5lMyA9IDA7CisgICAgICBmb3IgKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKKyAgICAgICAgaWYgKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKKyAgICAgICAgICBiVmFsID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBDT05URVhUID0gbGluZTM7CisgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIGggKyBHQkFUWzFdKSA8PCAyOworICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgMzsKKyAgICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDc7CisgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYlZhbCkgeworICAgICAgICAgIEdCUkVHLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKKyAgICAgICAgfQorICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIGggLSAyKSkgJiAweDA3OworICAgICAgICBsaW5lMiA9ICgobGluZTIgPDwgMSkgfCBHQlJFRy0+Z2V0UGl4ZWwodyArIDIsIGggLSAxKSkgJiAweDBmOworICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfCBiVmFsKSAmIDB4MDM7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBHQlJFRy5yZWxlYXNlKCk7Cit9CisKK0NKQmlnMl9JbWFnZSogQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfb3B0MygKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCkgeworICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgRlhfRFdPUkQgQ09OVEVYVDsKKyAgRlhfRFdPUkQgbGluZTE7CisgIHVpbnQ4X3QqIHBMaW5lLCAqcExpbmUxLCBjVmFsOworICBpbnQzMl90IG5TdHJpZGUsIGs7CisgIGludDMyX3QgbkxpbmVCeXRlcywgbkJpdHNMZWZ0LCBjYzsKKyAgTFRQID0gMDsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gR0JSRUcobmV3IENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOworICBpZiAoIUdCUkVHLT5tX3BEYXRhKQorICAgIHJldHVybiBudWxscHRyOworCisgIHBMaW5lID0gR0JSRUctPm1fcERhdGE7CisgIG5TdHJpZGUgPSBHQlJFRy0+bV9uU3RyaWRlOworICBuTGluZUJ5dGVzID0gKChHQlcgKyA3KSA+PiAzKSAtIDE7CisgIG5CaXRzTGVmdCA9IEdCVyAtIChuTGluZUJ5dGVzIDw8IDMpOworICBmb3IgKEZYX0RXT1JEIGggPSAwOyBoIDwgR0JIOyBoKyspIHsKKyAgICBpZiAoVFBHRE9OKSB7CisgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwMTk1XSk7CisgICAgICBMVFAgPSBMVFAgXiBTTFRQOworICAgIH0KKyAgICBpZiAoTFRQID09IDEpIHsKKyAgICAgIEdCUkVHLT5jb3B5TGluZShoLCBoIC0gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChoID4gMCkgeworICAgICAgICBwTGluZTEgPSBwTGluZSAtIG5TdHJpZGU7CisgICAgICAgIGxpbmUxID0gKnBMaW5lMSsrOworICAgICAgICBDT05URVhUID0gKGxpbmUxID4+IDEpICYgMHgwM2YwOworICAgICAgICBmb3IgKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7CisgICAgICAgICAgbGluZTEgPSAobGluZTEgPDwgOCkgfCAoKnBMaW5lMSsrKTsKKyAgICAgICAgICBjVmFsID0gMDsKKyAgICAgICAgICBmb3IgKGsgPSA3OyBrID49IDA7IGstLSkgeworICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCBrOworICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MDFmNykgPDwgMSkgfCBiVmFsIHwKKyAgICAgICAgICAgICAgICAgICAgICAoKGxpbmUxID4+IChrICsgMSkpICYgMHgwMDEwKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcExpbmVbY2NdID0gY1ZhbDsKKyAgICAgICAgfQorICAgICAgICBsaW5lMSA8PD0gODsKKyAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBuQml0c0xlZnQ7IGsrKykgeworICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7CisgICAgICAgICAgQ09OVEVYVCA9CisgICAgICAgICAgICAgICgoQ09OVEVYVCAmIDB4MDFmNykgPDwgMSkgfCBiVmFsIHwgKChsaW5lMSA+PiAoOCAtIGspKSAmIDB4MDAxMCk7CisgICAgICAgIH0KKyAgICAgICAgcExpbmVbbkxpbmVCeXRlc10gPSBjVmFsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ09OVEVYVCA9IDA7CisgICAgICAgIGZvciAoY2MgPSAwOyBjYyA8IG5MaW5lQnl0ZXM7IGNjKyspIHsKKyAgICAgICAgICBjVmFsID0gMDsKKyAgICAgICAgICBmb3IgKGsgPSA3OyBrID49IDA7IGstLSkgeworICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCBrOworICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MDFmNykgPDwgMSkgfCBiVmFsOworICAgICAgICAgIH0KKyAgICAgICAgICBwTGluZVtjY10gPSBjVmFsOworICAgICAgICB9CisgICAgICAgIGNWYWwgPSAwOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKKyAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOworICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxZjcpIDw8IDEpIHwgYlZhbDsKKyAgICAgICAgfQorICAgICAgICBwTGluZVtuTGluZUJ5dGVzXSA9IGNWYWw7CisgICAgICB9CisgICAgfQorICAgIHBMaW5lICs9IG5TdHJpZGU7CisgIH0KKyAgcmV0dXJuIEdCUkVHLnJlbGVhc2UoKTsKK30KKworQ0pCaWcyX0ltYWdlKiBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlM191bm9wdCgKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCkgeworICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgRlhfRFdPUkQgQ09OVEVYVDsKKyAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOworICBMVFAgPSAwOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBHQlJFRyhuZXcgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7CisgIEdCUkVHLT5maWxsKDApOworICBmb3IgKEZYX0RXT1JEIGggPSAwOyBoIDwgR0JIOyBoKyspIHsKKyAgICBpZiAoVFBHRE9OKSB7CisgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwMTk1XSk7CisgICAgICBMVFAgPSBMVFAgXiBTTFRQOworICAgIH0KKyAgICBpZiAoTFRQID09IDEpIHsKKyAgICAgIEdCUkVHLT5jb3B5TGluZShoLCBoIC0gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGxpbmUxID0gR0JSRUctPmdldFBpeGVsKDEsIGggLSAxKTsKKyAgICAgIGxpbmUxIHw9IEdCUkVHLT5nZXRQaXhlbCgwLCBoIC0gMSkgPDwgMTsKKyAgICAgIGxpbmUyID0gMDsKKyAgICAgIGZvciAoRlhfRFdPUkQgdyA9IDA7IHcgPCBHQlc7IHcrKykgeworICAgICAgICBpZiAoVVNFU0tJUCAmJiBTS0lQLT5nZXRQaXhlbCh3LCBoKSkgeworICAgICAgICAgIGJWYWwgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIENPTlRFWFQgPSBsaW5lMjsKKyAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgaCArIEdCQVRbMV0pIDw8IDQ7CisgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA1OworICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJWYWwpIHsKKyAgICAgICAgICBHQlJFRy0+c2V0UGl4ZWwodywgaCwgYlZhbCk7CisgICAgICAgIH0KKyAgICAgICAgbGluZTEgPSAoKGxpbmUxIDw8IDEpIHwgR0JSRUctPmdldFBpeGVsKHcgKyAyLCBoIC0gMSkpICYgMHgxZjsKKyAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgYlZhbCkgJiAweDBmOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gR0JSRUcucmVsZWFzZSgpOworfQorCitGWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6U3RhcnRfZGVjb2RlX0FyaXRoKAorICAgIENKQmlnMl9JbWFnZSoqIHBJbWFnZSwKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCwKKyAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpZiAoR0JXID09IDAgfHwgR0JIID09IDApIHsKKyAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKKyAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKKyAgfQorICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1JFQURZOworICBtX3BQYXVzZSA9IHBQYXVzZTsKKyAgaWYgKCEqcEltYWdlKQorICAgICpwSW1hZ2UgPSBuZXcgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKTsKKyAgaWYgKCEoKnBJbWFnZSktPm1fcERhdGEpIHsKKyAgICBkZWxldGUgKnBJbWFnZTsKKyAgICAqcEltYWdlID0gbnVsbHB0cjsKKyAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOworICB9CisgIG1fRGVjb2RlVHlwZSA9IDE7CisgIG1fcEltYWdlID0gcEltYWdlOworICAoKm1fcEltYWdlKS0+ZmlsbCgwKTsKKyAgbV9wQXJpdGhEZWNvZGVyID0gcEFyaXRoRGVjb2RlcjsKKyAgbV9nYkNvbnRleHQgPSBnYkNvbnRleHQ7CisgIExUUCA9IDA7CisgIG1fcExpbmUgPSBudWxscHRyOworICBtX2xvb3BJbmRleCA9IDA7CisgIHJldHVybiBkZWNvZGVfQXJpdGgocFBhdXNlKTsKK30KKworRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aChJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpbnQgaWxpbmUgPSBtX2xvb3BJbmRleDsKKyAgQ0pCaWcyX0ltYWdlKiBwSW1hZ2UgPSAqbV9wSW1hZ2U7CisgIGlmIChHQlRFTVBMQVRFID09IDApIHsKKyAgICBpZiAoVXNlVGVtcGxhdGUwT3B0MygpKSB7CisgICAgICBtX1Byb3NzaXZlU3RhdHVzID0gZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF9vcHQzKHBJbWFnZSwgbV9wQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2diQ29udGV4dCwgcFBhdXNlKTsKKyAgICB9IGVsc2UgeworICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IGRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfdW5vcHQocEltYWdlLCBtX3BBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2diQ29udGV4dCwgcFBhdXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoR0JURU1QTEFURSA9PSAxKSB7CisgICAgaWYgKFVzZVRlbXBsYXRlMU9wdDMoKSkgeworICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IGRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfb3B0MyhwSW1hZ2UsIG1fcEFyaXRoRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9nYkNvbnRleHQsIHBQYXVzZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBkZWNvZGVfQXJpdGhfVGVtcGxhdGUxX3Vub3B0KHBJbWFnZSwgbV9wQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9nYkNvbnRleHQsIHBQYXVzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKEdCVEVNUExBVEUgPT0gMikgeworICAgIGlmIChVc2VUZW1wbGF0ZTIzT3B0MygpKSB7CisgICAgICBtX1Byb3NzaXZlU3RhdHVzID0gZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl9vcHQzKHBJbWFnZSwgbV9wQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2diQ29udGV4dCwgcFBhdXNlKTsKKyAgICB9IGVsc2UgeworICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IGRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfdW5vcHQocEltYWdlLCBtX3BBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2diQ29udGV4dCwgcFBhdXNlKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKFVzZVRlbXBsYXRlMjNPcHQzKCkpIHsKKyAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX29wdDMocEltYWdlLCBtX3BBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZ2JDb250ZXh0LCBwUGF1c2UpOworICAgIH0gZWxzZSB7CisgICAgICBtX1Byb3NzaXZlU3RhdHVzID0gZGVjb2RlX0FyaXRoX1RlbXBsYXRlM191bm9wdChwSW1hZ2UsIG1fcEFyaXRoRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZ2JDb250ZXh0LCBwUGF1c2UpOworICAgIH0KKyAgfQorICBtX1JlcGxhY2VSZWN0LmxlZnQgPSAwOworICBtX1JlcGxhY2VSZWN0LnJpZ2h0ID0gcEltYWdlLT5tX25XaWR0aDsKKyAgbV9SZXBsYWNlUmVjdC50b3AgPSBpbGluZTsKKyAgbV9SZXBsYWNlUmVjdC5ib3R0b20gPSBtX2xvb3BJbmRleDsKKyAgaWYgKG1fUHJvc3NpdmVTdGF0dXMgPT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSCkgeworICAgIG1fbG9vcEluZGV4ID0gMDsKKyAgfQorICByZXR1cm4gbV9Qcm9zc2l2ZVN0YXR1czsKK30KKworRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OlN0YXJ0X2RlY29kZV9NTVIoQ0pCaWcyX0ltYWdlKiogcEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pCaWcyX0JpdFN0cmVhbSogcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIGludCBiaXRwb3MsIGk7CisgICpwSW1hZ2UgPSBuZXcgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKTsKKyAgaWYgKCEoKnBJbWFnZSktPm1fcERhdGEpIHsKKyAgICBkZWxldGUgKCpwSW1hZ2UpOworICAgICgqcEltYWdlKSA9IG51bGxwdHI7CisgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOworICAgIHJldHVybiBtX1Byb3NzaXZlU3RhdHVzOworICB9CisgIGJpdHBvcyA9IChpbnQpcFN0cmVhbS0+Z2V0Qml0UG9zKCk7CisgIEZheEc0RGVjb2RlKHBTdHJlYW0tPmdldEJ1ZigpLCBwU3RyZWFtLT5nZXRMZW5ndGgoKSwgJmJpdHBvcywKKyAgICAgICAgICAgICAgKCpwSW1hZ2UpLT5tX3BEYXRhLCBHQlcsIEdCSCwgKCpwSW1hZ2UpLT5tX25TdHJpZGUpOworICBwU3RyZWFtLT5zZXRCaXRQb3MoYml0cG9zKTsKKyAgZm9yIChpID0gMDsgKEZYX0RXT1JEKWkgPCAoKnBJbWFnZSktPm1fblN0cmlkZSAqIEdCSDsgaSsrKSB7CisgICAgKCpwSW1hZ2UpLT5tX3BEYXRhW2ldID0gfigqcEltYWdlKS0+bV9wRGF0YVtpXTsKKyAgfQorICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKKyAgcmV0dXJuIG1fUHJvc3NpdmVTdGF0dXM7Cit9CisKK0ZYQ09ERUNfU1RBVFVTIENKQmlnMl9HUkRQcm9jOjpDb250aW51ZV9kZWNvZGUoSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgaWYgKG1fUHJvc3NpdmVTdGF0dXMgIT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRSkKKyAgICByZXR1cm4gbV9Qcm9zc2l2ZVN0YXR1czsKKworICBpZiAobV9EZWNvZGVUeXBlICE9IDEpIHsKKyAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisgICAgcmV0dXJuIG1fUHJvc3NpdmVTdGF0dXM7CisgIH0KKworICByZXR1cm4gZGVjb2RlX0FyaXRoKHBQYXVzZSk7Cit9CisKK0ZYQ09ERUNfU1RBVFVTIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX29wdDMoCisgICAgQ0pCaWcyX0ltYWdlKiBwSW1hZ2UsCisgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCisgICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgRlhfQk9PTCBTTFRQLCBiVmFsOworICBGWF9EV09SRCBDT05URVhUOworICBGWF9EV09SRCBsaW5lMSwgbGluZTI7CisgIHVpbnQ4X3QqIHBMaW5lMSwgKnBMaW5lMiwgY1ZhbDsKKyAgaW50MzJfdCBuU3RyaWRlLCBuU3RyaWRlMiwgazsKKyAgaW50MzJfdCBuTGluZUJ5dGVzLCBuQml0c0xlZnQsIGNjOworICBpZiAoIW1fcExpbmUpIHsKKyAgICBtX3BMaW5lID0gcEltYWdlLT5tX3BEYXRhOworICB9CisgIG5TdHJpZGUgPSBwSW1hZ2UtPm1fblN0cmlkZTsKKyAgblN0cmlkZTIgPSBuU3RyaWRlIDw8IDE7CisgIG5MaW5lQnl0ZXMgPSAoKEdCVyArIDcpID4+IDMpIC0gMTsKKyAgbkJpdHNMZWZ0ID0gR0JXIC0gKG5MaW5lQnl0ZXMgPDwgMyk7CisgIEZYX0RXT1JEIGhlaWdodCA9IEdCSCAmIDB4N2ZmZmZmZmY7CisgIGZvciAoOyBtX2xvb3BJbmRleCA8IGhlaWdodDsgbV9sb29wSW5kZXgrKykgeworICAgIGlmIChUUEdET04pIHsKKyAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDliMjVdKTsKKyAgICAgIExUUCA9IExUUCBeIFNMVFA7CisgICAgfQorICAgIGlmIChMVFAgPT0gMSkgeworICAgICAgcEltYWdlLT5jb3B5TGluZShtX2xvb3BJbmRleCwgbV9sb29wSW5kZXggLSAxKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKG1fbG9vcEluZGV4ID4gMSkgeworICAgICAgICBwTGluZTEgPSBtX3BMaW5lIC0gblN0cmlkZTI7CisgICAgICAgIHBMaW5lMiA9IG1fcExpbmUgLSBuU3RyaWRlOworICAgICAgICBsaW5lMSA9ICgqcExpbmUxKyspIDw8IDY7CisgICAgICAgIGxpbmUyID0gKnBMaW5lMisrOworICAgICAgICBDT05URVhUID0gKChsaW5lMSAmIDB4ZjgwMCkgfCAobGluZTIgJiAweDA3ZjApKTsKKyAgICAgICAgZm9yIChjYyA9IDA7IGNjIDwgbkxpbmVCeXRlczsgY2MrKykgeworICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwgKCgqcExpbmUxKyspIDw8IDYpOworICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKCpwTGluZTIrKyk7CisgICAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgICAgZm9yIChrID0gNzsgayA+PSAwOyBrLS0pIHsKKyAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKKyAgICAgICAgICAgIENPTlRFWFQgPSAoKChDT05URVhUICYgMHg3YmY3KSA8PCAxKSB8IGJWYWwgfAorICAgICAgICAgICAgICAgICAgICAgICAoKGxpbmUxID4+IGspICYgMHgwODAwKSB8ICgobGluZTIgPj4gaykgJiAweDAwMTApKTsKKyAgICAgICAgICB9CisgICAgICAgICAgbV9wTGluZVtjY10gPSBjVmFsOworICAgICAgICB9CisgICAgICAgIGxpbmUxIDw8PSA4OworICAgICAgICBsaW5lMiA8PD0gODsKKyAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBuQml0c0xlZnQ7IGsrKykgeworICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7CisgICAgICAgICAgQ09OVEVYVCA9CisgICAgICAgICAgICAgICgoKENPTlRFWFQgJiAweDdiZjcpIDw8IDEpIHwgYlZhbCB8CisgICAgICAgICAgICAgICAoKGxpbmUxID4+ICg3IC0gaykpICYgMHgwODAwKSB8ICgobGluZTIgPj4gKDcgLSBrKSkgJiAweDAwMTApKTsKKyAgICAgICAgfQorICAgICAgICBtX3BMaW5lW25MaW5lQnl0ZXNdID0gY1ZhbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBMaW5lMiA9IG1fcExpbmUgLSBuU3RyaWRlOworICAgICAgICBsaW5lMiA9IChtX2xvb3BJbmRleCAmIDEpID8gKCpwTGluZTIrKykgOiAwOworICAgICAgICBDT05URVhUID0gKGxpbmUyICYgMHgwN2YwKTsKKyAgICAgICAgZm9yIChjYyA9IDA7IGNjIDwgbkxpbmVCeXRlczsgY2MrKykgeworICAgICAgICAgIGlmIChtX2xvb3BJbmRleCAmIDEpIHsKKyAgICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKCpwTGluZTIrKyk7CisgICAgICAgICAgfQorICAgICAgICAgIGNWYWwgPSAwOworICAgICAgICAgIGZvciAoayA9IDc7IGsgPj0gMDsgay0tKSB7CisgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7CisgICAgICAgICAgICBDT05URVhUID0KKyAgICAgICAgICAgICAgICAoKChDT05URVhUICYgMHg3YmY3KSA8PCAxKSB8IGJWYWwgfCAoKGxpbmUyID4+IGspICYgMHgwMDEwKSk7CisgICAgICAgICAgfQorICAgICAgICAgIG1fcExpbmVbY2NdID0gY1ZhbDsKKyAgICAgICAgfQorICAgICAgICBsaW5lMiA8PD0gODsKKyAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBuQml0c0xlZnQ7IGsrKykgeworICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7CisgICAgICAgICAgQ09OVEVYVCA9ICgoKENPTlRFWFQgJiAweDdiZjcpIDw8IDEpIHwgYlZhbCB8CisgICAgICAgICAgICAgICAgICAgICAoKGxpbmUyID4+ICg3IC0gaykpICYgMHgwMDEwKSk7CisgICAgICAgIH0KKyAgICAgICAgbV9wTGluZVtuTGluZUJ5dGVzXSA9IGNWYWw7CisgICAgICB9CisgICAgfQorICAgIG1fcExpbmUgKz0gblN0cmlkZTsKKyAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgeworICAgICAgbV9sb29wSW5kZXgrKzsKKyAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOworICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CisgICAgfQorICB9CisgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKK30KKworRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfdW5vcHQoCisgICAgQ0pCaWcyX0ltYWdlKiBwSW1hZ2UsCisgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCisgICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgRlhfQk9PTCBTTFRQLCBiVmFsOworICBGWF9EV09SRCBDT05URVhUOworICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzOworICBmb3IgKDsgbV9sb29wSW5kZXggPCBHQkg7IG1fbG9vcEluZGV4KyspIHsKKyAgICBpZiAoVFBHRE9OKSB7CisgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHg5YjI1XSk7CisgICAgICBMVFAgPSBMVFAgXiBTTFRQOworICAgIH0KKyAgICBpZiAoTFRQID09IDEpIHsKKyAgICAgIHBJbWFnZS0+Y29weUxpbmUobV9sb29wSW5kZXgsIG1fbG9vcEluZGV4IC0gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGxpbmUxID0gcEltYWdlLT5nZXRQaXhlbCgxLCBtX2xvb3BJbmRleCAtIDIpOworICAgICAgbGluZTEgfD0gcEltYWdlLT5nZXRQaXhlbCgwLCBtX2xvb3BJbmRleCAtIDIpIDw8IDE7CisgICAgICBsaW5lMiA9IHBJbWFnZS0+Z2V0UGl4ZWwoMiwgbV9sb29wSW5kZXggLSAxKTsKKyAgICAgIGxpbmUyIHw9IHBJbWFnZS0+Z2V0UGl4ZWwoMSwgbV9sb29wSW5kZXggLSAxKSA8PCAxOworICAgICAgbGluZTIgfD0gcEltYWdlLT5nZXRQaXhlbCgwLCBtX2xvb3BJbmRleCAtIDEpIDw8IDI7CisgICAgICBsaW5lMyA9IDA7CisgICAgICBmb3IgKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKKyAgICAgICAgaWYgKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgbV9sb29wSW5kZXgpKSB7CisgICAgICAgICAgYlZhbCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgQ09OVEVYVCA9IGxpbmUzOworICAgICAgICAgIENPTlRFWFQgfD0gcEltYWdlLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgbV9sb29wSW5kZXggKyBHQkFUWzFdKSA8PCA0OworICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgNTsKKyAgICAgICAgICBDT05URVhUIHw9IHBJbWFnZS0+Z2V0UGl4ZWwodyArIEdCQVRbMl0sIG1fbG9vcEluZGV4ICsgR0JBVFszXSkgPDwgMTA7CisgICAgICAgICAgQ09OVEVYVCB8PSBwSW1hZ2UtPmdldFBpeGVsKHcgKyBHQkFUWzRdLCBtX2xvb3BJbmRleCArIEdCQVRbNV0pIDw8IDExOworICAgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgMTI7CisgICAgICAgICAgQ09OVEVYVCB8PSBwSW1hZ2UtPmdldFBpeGVsKHcgKyBHQkFUWzZdLCBtX2xvb3BJbmRleCArIEdCQVRbN10pIDw8IDE1OworICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJWYWwpIHsKKyAgICAgICAgICBwSW1hZ2UtPnNldFBpeGVsKHcsIG1fbG9vcEluZGV4LCBiVmFsKTsKKyAgICAgICAgfQorICAgICAgICBsaW5lMSA9CisgICAgICAgICAgICAoKGxpbmUxIDw8IDEpIHwgcEltYWdlLT5nZXRQaXhlbCh3ICsgMiwgbV9sb29wSW5kZXggLSAyKSkgJiAweDA3OworICAgICAgICBsaW5lMiA9CisgICAgICAgICAgICAoKGxpbmUyIDw8IDEpIHwgcEltYWdlLT5nZXRQaXhlbCh3ICsgMywgbV9sb29wSW5kZXggLSAxKSkgJiAweDFmOworICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfCBiVmFsKSAmIDB4MGY7CisgICAgICB9CisgICAgfQorICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7CisgICAgICBtX2xvb3BJbmRleCsrOworICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CisgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKKyAgICB9CisgIH0KKyAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7CisgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworfQorCitGWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV9vcHQzKAorICAgIENKQmlnMl9JbWFnZSogcEltYWdlLAorICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAorICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIEZYX0JPT0wgU0xUUCwgYlZhbDsKKyAgRlhfRFdPUkQgQ09OVEVYVDsKKyAgRlhfRFdPUkQgbGluZTEsIGxpbmUyOworICB1aW50OF90KiBwTGluZTEsICpwTGluZTIsIGNWYWw7CisgIGludDMyX3QgblN0cmlkZSwgblN0cmlkZTIsIGs7CisgIGludDMyX3QgbkxpbmVCeXRlcywgbkJpdHNMZWZ0LCBjYzsKKyAgaWYgKCFtX3BMaW5lKSB7CisgICAgbV9wTGluZSA9IHBJbWFnZS0+bV9wRGF0YTsKKyAgfQorICBuU3RyaWRlID0gcEltYWdlLT5tX25TdHJpZGU7CisgIG5TdHJpZGUyID0gblN0cmlkZSA8PCAxOworICBuTGluZUJ5dGVzID0gKChHQlcgKyA3KSA+PiAzKSAtIDE7CisgIG5CaXRzTGVmdCA9IEdCVyAtIChuTGluZUJ5dGVzIDw8IDMpOworICBmb3IgKDsgbV9sb29wSW5kZXggPCBHQkg7IG1fbG9vcEluZGV4KyspIHsKKyAgICBpZiAoVFBHRE9OKSB7CisgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwNzk1XSk7CisgICAgICBMVFAgPSBMVFAgXiBTTFRQOworICAgIH0KKyAgICBpZiAoTFRQID09IDEpIHsKKyAgICAgIHBJbWFnZS0+Y29weUxpbmUobV9sb29wSW5kZXgsIG1fbG9vcEluZGV4IC0gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtX2xvb3BJbmRleCA+IDEpIHsKKyAgICAgICAgcExpbmUxID0gbV9wTGluZSAtIG5TdHJpZGUyOworICAgICAgICBwTGluZTIgPSBtX3BMaW5lIC0gblN0cmlkZTsKKyAgICAgICAgbGluZTEgPSAoKnBMaW5lMSsrKSA8PCA0OworICAgICAgICBsaW5lMiA9ICpwTGluZTIrKzsKKyAgICAgICAgQ09OVEVYVCA9IChsaW5lMSAmIDB4MWUwMCkgfCAoKGxpbmUyID4+IDEpICYgMHgwMWY4KTsKKyAgICAgICAgZm9yIChjYyA9IDA7IGNjIDwgbkxpbmVCeXRlczsgY2MrKykgeworICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwgKCgqcExpbmUxKyspIDw8IDQpOworICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKCpwTGluZTIrKyk7CisgICAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgICAgZm9yIChrID0gNzsgayA+PSAwOyBrLS0pIHsKKyAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKKyAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDBlZmIpIDw8IDEpIHwgYlZhbCB8CisgICAgICAgICAgICAgICAgICAgICAgKChsaW5lMSA+PiBrKSAmIDB4MDIwMCkgfCAoKGxpbmUyID4+IChrICsgMSkpICYgMHgwMDA4KTsKKyAgICAgICAgICB9CisgICAgICAgICAgbV9wTGluZVtjY10gPSBjVmFsOworICAgICAgICB9CisgICAgICAgIGxpbmUxIDw8PSA4OworICAgICAgICBsaW5lMiA8PD0gODsKKyAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBuQml0c0xlZnQ7IGsrKykgeworICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7CisgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MGVmYikgPDwgMSkgfCBiVmFsIHwKKyAgICAgICAgICAgICAgICAgICAgKChsaW5lMSA+PiAoNyAtIGspKSAmIDB4MDIwMCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxpbmUyID4+ICg4IC0gaykpICYgMHgwMDA4KTsKKyAgICAgICAgfQorICAgICAgICBtX3BMaW5lW25MaW5lQnl0ZXNdID0gY1ZhbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBMaW5lMiA9IG1fcExpbmUgLSBuU3RyaWRlOworICAgICAgICBsaW5lMiA9IChtX2xvb3BJbmRleCAmIDEpID8gKCpwTGluZTIrKykgOiAwOworICAgICAgICBDT05URVhUID0gKGxpbmUyID4+IDEpICYgMHgwMWY4OworICAgICAgICBmb3IgKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7CisgICAgICAgICAgaWYgKG1fbG9vcEluZGV4ICYgMSkgeworICAgICAgICAgICAgbGluZTIgPSAobGluZTIgPDwgOCkgfCAoKnBMaW5lMisrKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgICAgZm9yIChrID0gNzsgayA+PSAwOyBrLS0pIHsKKyAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKKyAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDBlZmIpIDw8IDEpIHwgYlZhbCB8CisgICAgICAgICAgICAgICAgICAgICAgKChsaW5lMiA+PiAoayArIDEpKSAmIDB4MDAwOCk7CisgICAgICAgICAgfQorICAgICAgICAgIG1fcExpbmVbY2NdID0gY1ZhbDsKKyAgICAgICAgfQorICAgICAgICBsaW5lMiA8PD0gODsKKyAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBuQml0c0xlZnQ7IGsrKykgeworICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7CisgICAgICAgICAgQ09OVEVYVCA9CisgICAgICAgICAgICAgICgoQ09OVEVYVCAmIDB4MGVmYikgPDwgMSkgfCBiVmFsIHwgKChsaW5lMiA+PiAoOCAtIGspKSAmIDB4MDAwOCk7CisgICAgICAgIH0KKyAgICAgICAgbV9wTGluZVtuTGluZUJ5dGVzXSA9IGNWYWw7CisgICAgICB9CisgICAgfQorICAgIG1fcExpbmUgKz0gblN0cmlkZTsKKyAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgeworICAgICAgbV9sb29wSW5kZXgrKzsKKyAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOworICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CisgICAgfQorICB9CisgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKK30KKworRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfdW5vcHQoCisgICAgQ0pCaWcyX0ltYWdlKiBwSW1hZ2UsCisgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCisgICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgRlhfQk9PTCBTTFRQLCBiVmFsOworICBGWF9EV09SRCBDT05URVhUOworICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzOworICBmb3IgKEZYX0RXT1JEIGggPSAwOyBoIDwgR0JIOyBoKyspIHsKKyAgICBpZiAoVFBHRE9OKSB7CisgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwNzk1XSk7CisgICAgICBMVFAgPSBMVFAgXiBTTFRQOworICAgIH0KKyAgICBpZiAoTFRQID09IDEpIHsKKyAgICAgIHBJbWFnZS0+Y29weUxpbmUoaCwgaCAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICBsaW5lMSA9IHBJbWFnZS0+Z2V0UGl4ZWwoMiwgaCAtIDIpOworICAgICAgbGluZTEgfD0gcEltYWdlLT5nZXRQaXhlbCgxLCBoIC0gMikgPDwgMTsKKyAgICAgIGxpbmUxIHw9IHBJbWFnZS0+Z2V0UGl4ZWwoMCwgaCAtIDIpIDw8IDI7CisgICAgICBsaW5lMiA9IHBJbWFnZS0+Z2V0UGl4ZWwoMiwgaCAtIDEpOworICAgICAgbGluZTIgfD0gcEltYWdlLT5nZXRQaXhlbCgxLCBoIC0gMSkgPDwgMTsKKyAgICAgIGxpbmUyIHw9IHBJbWFnZS0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDI7CisgICAgICBsaW5lMyA9IDA7CisgICAgICBmb3IgKEZYX0RXT1JEIHcgPSAwOyB3IDwgR0JXOyB3KyspIHsKKyAgICAgICAgaWYgKFVTRVNLSVAgJiYgU0tJUC0+Z2V0UGl4ZWwodywgaCkpIHsKKyAgICAgICAgICBiVmFsID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBDT05URVhUID0gbGluZTM7CisgICAgICAgICAgQ09OVEVYVCB8PSBwSW1hZ2UtPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBoICsgR0JBVFsxXSkgPDwgMzsKKyAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDQ7CisgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA5OworICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJWYWwpIHsKKyAgICAgICAgICBwSW1hZ2UtPnNldFBpeGVsKHcsIGgsIGJWYWwpOworICAgICAgICB9CisgICAgICAgIGxpbmUxID0gKChsaW5lMSA8PCAxKSB8IHBJbWFnZS0+Z2V0UGl4ZWwodyArIDMsIGggLSAyKSkgJiAweDBmOworICAgICAgICBsaW5lMiA9ICgobGluZTIgPDwgMSkgfCBwSW1hZ2UtPmdldFBpeGVsKHcgKyAzLCBoIC0gMSkpICYgMHgxZjsKKyAgICAgICAgbGluZTMgPSAoKGxpbmUzIDw8IDEpIHwgYlZhbCkgJiAweDA3OworICAgICAgfQorICAgIH0KKyAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgeworICAgICAgbV9sb29wSW5kZXgrKzsKKyAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOworICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CisgICAgfQorICB9CisgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKK30KKworRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfb3B0MygKKyAgICBDSkJpZzJfSW1hZ2UqIHBJbWFnZSwKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCwKKyAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICBGWF9CT09MIFNMVFAsIGJWYWw7CisgIEZYX0RXT1JEIENPTlRFWFQ7CisgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKKyAgdWludDhfdCogcExpbmUxLCAqcExpbmUyLCBjVmFsOworICBpbnQzMl90IG5TdHJpZGUsIG5TdHJpZGUyLCBrOworICBpbnQzMl90IG5MaW5lQnl0ZXMsIG5CaXRzTGVmdCwgY2M7CisgIGlmICghbV9wTGluZSkgeworICAgIG1fcExpbmUgPSBwSW1hZ2UtPm1fcERhdGE7CisgIH0KKyAgblN0cmlkZSA9IHBJbWFnZS0+bV9uU3RyaWRlOworICBuU3RyaWRlMiA9IG5TdHJpZGUgPDwgMTsKKyAgbkxpbmVCeXRlcyA9ICgoR0JXICsgNykgPj4gMykgLSAxOworICBuQml0c0xlZnQgPSBHQlcgLSAobkxpbmVCeXRlcyA8PCAzKTsKKyAgZm9yICg7IG1fbG9vcEluZGV4IDwgR0JIOyBtX2xvb3BJbmRleCsrKSB7CisgICAgaWYgKFRQR0RPTikgeworICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDBlNV0pOworICAgICAgTFRQID0gTFRQIF4gU0xUUDsKKyAgICB9CisgICAgaWYgKExUUCA9PSAxKSB7CisgICAgICBwSW1hZ2UtPmNvcHlMaW5lKG1fbG9vcEluZGV4LCBtX2xvb3BJbmRleCAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAobV9sb29wSW5kZXggPiAxKSB7CisgICAgICAgIHBMaW5lMSA9IG1fcExpbmUgLSBuU3RyaWRlMjsKKyAgICAgICAgcExpbmUyID0gbV9wTGluZSAtIG5TdHJpZGU7CisgICAgICAgIGxpbmUxID0gKCpwTGluZTErKykgPDwgMTsKKyAgICAgICAgbGluZTIgPSAqcExpbmUyKys7CisgICAgICAgIENPTlRFWFQgPSAobGluZTEgJiAweDAzODApIHwgKChsaW5lMiA+PiAzKSAmIDB4MDA3Yyk7CisgICAgICAgIGZvciAoY2MgPSAwOyBjYyA8IG5MaW5lQnl0ZXM7IGNjKyspIHsKKyAgICAgICAgICBsaW5lMSA9IChsaW5lMSA8PCA4KSB8ICgoKnBMaW5lMSsrKSA8PCAxKTsKKyAgICAgICAgICBsaW5lMiA9IChsaW5lMiA8PCA4KSB8ICgqcExpbmUyKyspOworICAgICAgICAgIGNWYWwgPSAwOworICAgICAgICAgIGZvciAoayA9IDc7IGsgPj0gMDsgay0tKSB7CisgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7CisgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWJkKSA8PCAxKSB8IGJWYWwgfAorICAgICAgICAgICAgICAgICAgICAgICgobGluZTEgPj4gaykgJiAweDAwODApIHwgKChsaW5lMiA+PiAoayArIDMpKSAmIDB4MDAwNCk7CisgICAgICAgICAgfQorICAgICAgICAgIG1fcExpbmVbY2NdID0gY1ZhbDsKKyAgICAgICAgfQorICAgICAgICBsaW5lMSA8PD0gODsKKyAgICAgICAgbGluZTIgPDw9IDg7CisgICAgICAgIGNWYWwgPSAwOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKKyAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOworICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxYmQpIDw8IDEpIHwgYlZhbCB8CisgICAgICAgICAgICAgICAgICAgICgobGluZTEgPj4gKDcgLSBrKSkgJiAweDAwODApIHwKKyAgICAgICAgICAgICAgICAgICAgKChsaW5lMiA+PiAoMTAgLSBrKSkgJiAweDAwMDQpOworICAgICAgICB9CisgICAgICAgIG1fcExpbmVbbkxpbmVCeXRlc10gPSBjVmFsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcExpbmUyID0gbV9wTGluZSAtIG5TdHJpZGU7CisgICAgICAgIGxpbmUyID0gKG1fbG9vcEluZGV4ICYgMSkgPyAoKnBMaW5lMisrKSA6IDA7CisgICAgICAgIENPTlRFWFQgPSAobGluZTIgPj4gMykgJiAweDAwN2M7CisgICAgICAgIGZvciAoY2MgPSAwOyBjYyA8IG5MaW5lQnl0ZXM7IGNjKyspIHsKKyAgICAgICAgICBpZiAobV9sb29wSW5kZXggJiAxKSB7CisgICAgICAgICAgICBsaW5lMiA9IChsaW5lMiA8PCA4KSB8ICgqcExpbmUyKyspOworICAgICAgICAgIH0KKyAgICAgICAgICBjVmFsID0gMDsKKyAgICAgICAgICBmb3IgKGsgPSA3OyBrID49IDA7IGstLSkgeworICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCBrOworICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MDFiZCkgPDwgMSkgfCBiVmFsIHwKKyAgICAgICAgICAgICAgICAgICAgICAoKGxpbmUyID4+IChrICsgMykpICYgMHgwMDA0KTsKKyAgICAgICAgICB9CisgICAgICAgICAgbV9wTGluZVtjY10gPSBjVmFsOworICAgICAgICB9CisgICAgICAgIGxpbmUyIDw8PSA4OworICAgICAgICBjVmFsID0gMDsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7CisgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKKyAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWJkKSA8PCAxKSB8IGJWYWwgfAorICAgICAgICAgICAgICAgICAgICAoKChsaW5lMiA+PiAoMTAgLSBrKSkpICYgMHgwMDA0KTsKKyAgICAgICAgfQorICAgICAgICBtX3BMaW5lW25MaW5lQnl0ZXNdID0gY1ZhbDsKKyAgICAgIH0KKyAgICB9CisgICAgbV9wTGluZSArPSBuU3RyaWRlOworICAgIGlmIChwUGF1c2UgJiYgbV9sb29wSW5kZXggJSA1MCA9PSAwICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgeworICAgICAgbV9sb29wSW5kZXgrKzsKKyAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOworICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CisgICAgfQorICB9CisgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKK30KKworRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfdW5vcHQoCisgICAgQ0pCaWcyX0ltYWdlKiBwSW1hZ2UsCisgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCisgICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgRlhfQk9PTCBTTFRQLCBiVmFsOworICBGWF9EV09SRCBDT05URVhUOworICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzOworICBmb3IgKDsgbV9sb29wSW5kZXggPCBHQkg7IG1fbG9vcEluZGV4KyspIHsKKyAgICBpZiAoVFBHRE9OKSB7CisgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwMGU1XSk7CisgICAgICBMVFAgPSBMVFAgXiBTTFRQOworICAgIH0KKyAgICBpZiAoTFRQID09IDEpIHsKKyAgICAgIHBJbWFnZS0+Y29weUxpbmUobV9sb29wSW5kZXgsIG1fbG9vcEluZGV4IC0gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGxpbmUxID0gcEltYWdlLT5nZXRQaXhlbCgxLCBtX2xvb3BJbmRleCAtIDIpOworICAgICAgbGluZTEgfD0gcEltYWdlLT5nZXRQaXhlbCgwLCBtX2xvb3BJbmRleCAtIDIpIDw8IDE7CisgICAgICBsaW5lMiA9IHBJbWFnZS0+Z2V0UGl4ZWwoMSwgbV9sb29wSW5kZXggLSAxKTsKKyAgICAgIGxpbmUyIHw9IHBJbWFnZS0+Z2V0UGl4ZWwoMCwgbV9sb29wSW5kZXggLSAxKSA8PCAxOworICAgICAgbGluZTMgPSAwOworICAgICAgZm9yIChGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdysrKSB7CisgICAgICAgIGlmIChVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIG1fbG9vcEluZGV4KSkgeworICAgICAgICAgIGJWYWwgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIENPTlRFWFQgPSBsaW5lMzsKKyAgICAgICAgICBDT05URVhUIHw9IHBJbWFnZS0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIG1fbG9vcEluZGV4ICsgR0JBVFsxXSkgPDwgMjsKKyAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDM7CisgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA3OworICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJWYWwpIHsKKyAgICAgICAgICBwSW1hZ2UtPnNldFBpeGVsKHcsIG1fbG9vcEluZGV4LCBiVmFsKTsKKyAgICAgICAgfQorICAgICAgICBsaW5lMSA9CisgICAgICAgICAgICAoKGxpbmUxIDw8IDEpIHwgcEltYWdlLT5nZXRQaXhlbCh3ICsgMiwgbV9sb29wSW5kZXggLSAyKSkgJiAweDA3OworICAgICAgICBsaW5lMiA9CisgICAgICAgICAgICAoKGxpbmUyIDw8IDEpIHwgcEltYWdlLT5nZXRQaXhlbCh3ICsgMiwgbV9sb29wSW5kZXggLSAxKSkgJiAweDBmOworICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfCBiVmFsKSAmIDB4MDM7CisgICAgICB9CisgICAgfQorICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7CisgICAgICBtX2xvb3BJbmRleCsrOworICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CisgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKKyAgICB9CisgIH0KKyAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7CisgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworfQorCitGWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlM19vcHQzKAorICAgIENKQmlnMl9JbWFnZSogcEltYWdlLAorICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAorICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIEZYX0JPT0wgU0xUUCwgYlZhbDsKKyAgRlhfRFdPUkQgQ09OVEVYVDsKKyAgRlhfRFdPUkQgbGluZTE7CisgIHVpbnQ4X3QqIHBMaW5lMSwgY1ZhbDsKKyAgaW50MzJfdCBuU3RyaWRlLCBrOworICBpbnQzMl90IG5MaW5lQnl0ZXMsIG5CaXRzTGVmdCwgY2M7CisgIGlmICghbV9wTGluZSkgeworICAgIG1fcExpbmUgPSBwSW1hZ2UtPm1fcERhdGE7CisgIH0KKyAgblN0cmlkZSA9IHBJbWFnZS0+bV9uU3RyaWRlOworICBuTGluZUJ5dGVzID0gKChHQlcgKyA3KSA+PiAzKSAtIDE7CisgIG5CaXRzTGVmdCA9IEdCVyAtIChuTGluZUJ5dGVzIDw8IDMpOworICBmb3IgKDsgbV9sb29wSW5kZXggPCBHQkg7IG1fbG9vcEluZGV4KyspIHsKKyAgICBpZiAoVFBHRE9OKSB7CisgICAgICBTTFRQID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwMTk1XSk7CisgICAgICBMVFAgPSBMVFAgXiBTTFRQOworICAgIH0KKyAgICBpZiAoTFRQID09IDEpIHsKKyAgICAgIHBJbWFnZS0+Y29weUxpbmUobV9sb29wSW5kZXgsIG1fbG9vcEluZGV4IC0gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtX2xvb3BJbmRleCA+IDApIHsKKyAgICAgICAgcExpbmUxID0gbV9wTGluZSAtIG5TdHJpZGU7CisgICAgICAgIGxpbmUxID0gKnBMaW5lMSsrOworICAgICAgICBDT05URVhUID0gKGxpbmUxID4+IDEpICYgMHgwM2YwOworICAgICAgICBmb3IgKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7CisgICAgICAgICAgbGluZTEgPSAobGluZTEgPDwgOCkgfCAoKnBMaW5lMSsrKTsKKyAgICAgICAgICBjVmFsID0gMDsKKyAgICAgICAgICBmb3IgKGsgPSA3OyBrID49IDA7IGstLSkgeworICAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCBrOworICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MDFmNykgPDwgMSkgfCBiVmFsIHwKKyAgICAgICAgICAgICAgICAgICAgICAoKGxpbmUxID4+IChrICsgMSkpICYgMHgwMDEwKTsKKyAgICAgICAgICB9CisgICAgICAgICAgbV9wTGluZVtjY10gPSBjVmFsOworICAgICAgICB9CisgICAgICAgIGxpbmUxIDw8PSA4OworICAgICAgICBjVmFsID0gMDsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7CisgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKKyAgICAgICAgICBDT05URVhUID0KKyAgICAgICAgICAgICAgKChDT05URVhUICYgMHgwMWY3KSA8PCAxKSB8IGJWYWwgfCAoKGxpbmUxID4+ICg4IC0gaykpICYgMHgwMDEwKTsKKyAgICAgICAgfQorICAgICAgICBtX3BMaW5lW25MaW5lQnl0ZXNdID0gY1ZhbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENPTlRFWFQgPSAwOworICAgICAgICBmb3IgKGNjID0gMDsgY2MgPCBuTGluZUJ5dGVzOyBjYysrKSB7CisgICAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgICAgZm9yIChrID0gNzsgayA+PSAwOyBrLS0pIHsKKyAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKKyAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxZjcpIDw8IDEpIHwgYlZhbDsKKyAgICAgICAgICB9CisgICAgICAgICAgbV9wTGluZVtjY10gPSBjVmFsOworICAgICAgICB9CisgICAgICAgIGNWYWwgPSAwOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKKyAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOworICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxZjcpIDw8IDEpIHwgYlZhbDsKKyAgICAgICAgfQorICAgICAgICBtX3BMaW5lW25MaW5lQnl0ZXNdID0gY1ZhbDsKKyAgICAgIH0KKyAgICB9CisgICAgbV9wTGluZSArPSBuU3RyaWRlOworICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7CisgICAgICBtX2xvb3BJbmRleCsrOworICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CisgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKKyAgICB9CisgIH0KKyAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7CisgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworfQorCitGWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlM191bm9wdCgKKyAgICBDSkJpZzJfSW1hZ2UqIHBJbWFnZSwKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCwKKyAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICBGWF9CT09MIFNMVFAsIGJWYWw7CisgIEZYX0RXT1JEIENPTlRFWFQ7CisgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMjsKKyAgZm9yICg7IG1fbG9vcEluZGV4IDwgR0JIOyBtX2xvb3BJbmRleCsrKSB7CisgICAgaWYgKFRQR0RPTikgeworICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDE5NV0pOworICAgICAgTFRQID0gTFRQIF4gU0xUUDsKKyAgICB9CisgICAgaWYgKExUUCA9PSAxKSB7CisgICAgICBwSW1hZ2UtPmNvcHlMaW5lKG1fbG9vcEluZGV4LCBtX2xvb3BJbmRleCAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICBsaW5lMSA9IHBJbWFnZS0+Z2V0UGl4ZWwoMSwgbV9sb29wSW5kZXggLSAxKTsKKyAgICAgIGxpbmUxIHw9IHBJbWFnZS0+Z2V0UGl4ZWwoMCwgbV9sb29wSW5kZXggLSAxKSA8PCAxOworICAgICAgbGluZTIgPSAwOworICAgICAgZm9yIChGWF9EV09SRCB3ID0gMDsgdyA8IEdCVzsgdysrKSB7CisgICAgICAgIGlmIChVU0VTS0lQICYmIFNLSVAtPmdldFBpeGVsKHcsIG1fbG9vcEluZGV4KSkgeworICAgICAgICAgIGJWYWwgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIENPTlRFWFQgPSBsaW5lMjsKKyAgICAgICAgICBDT05URVhUIHw9IHBJbWFnZS0+Z2V0UGl4ZWwodyArIEdCQVRbMF0sIG1fbG9vcEluZGV4ICsgR0JBVFsxXSkgPDwgNDsKKyAgICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDU7CisgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYlZhbCkgeworICAgICAgICAgIHBJbWFnZS0+c2V0UGl4ZWwodywgbV9sb29wSW5kZXgsIGJWYWwpOworICAgICAgICB9CisgICAgICAgIGxpbmUxID0KKyAgICAgICAgICAgICgobGluZTEgPDwgMSkgfCBwSW1hZ2UtPmdldFBpeGVsKHcgKyAyLCBtX2xvb3BJbmRleCAtIDEpKSAmIDB4MWY7CisgICAgICAgIGxpbmUyID0gKChsaW5lMiA8PCAxKSB8IGJWYWwpICYgMHgwZjsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKKyAgICAgIG1fbG9vcEluZGV4Kys7CisgICAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKKyAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOworICAgIH0KKyAgfQorICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKKyAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7Cit9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0dyZFByb2MuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR3JkUHJvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZjI4Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0dyZFByb2MuaApAQCAtMCwwICsxLDEyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfU1JDX0ZYQ09ERUNfSkJJRzJfSkJJRzJfR1JEUFJPQ19IXworI2RlZmluZSBDT1JFX1NSQ19GWENPREVDX0pCSUcyX0pCSUcyX0dSRFBST0NfSF8KKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjX2RlZi5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaCIKKworY2xhc3MgQ0pCaWcyX0FyaXRoRGVjb2RlcjsKK2NsYXNzIENKQmlnMl9CaXRTdHJlYW07CitjbGFzcyBDSkJpZzJfSW1hZ2U7CitjbGFzcyBJRlhfUGF1c2U7CitzdHJ1Y3QgSkJpZzJBcml0aEN0eDsKKworY2xhc3MgQ0pCaWcyX0dSRFByb2MgeworIHB1YmxpYzoKKyAgQ0pCaWcyX0dSRFByb2MoKTsKKworICBDSkJpZzJfSW1hZ2UqIGRlY29kZV9Bcml0aChDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpOworCisgIEZYQ09ERUNfU1RBVFVTIFN0YXJ0X2RlY29kZV9Bcml0aChDSkJpZzJfSW1hZ2UqKiBwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpOworICBGWENPREVDX1NUQVRVUyBTdGFydF9kZWNvZGVfTU1SKENKQmlnMl9JbWFnZSoqIHBJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSkJpZzJfQml0U3RyZWFtKiBwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgRlhDT0RFQ19TVEFUVVMgQ29udGludWVfZGVjb2RlKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgRlhfUkVDVCBHZXRSZXBsYWNlUmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fUmVwbGFjZVJlY3Q7IH0KKworICBGWF9CT09MIE1NUjsKKyAgRlhfRFdPUkQgR0JXOworICBGWF9EV09SRCBHQkg7CisgIHVpbnQ4X3QgR0JURU1QTEFURTsKKyAgRlhfQk9PTCBUUEdET047CisgIEZYX0JPT0wgVVNFU0tJUDsKKyAgQ0pCaWcyX0ltYWdlKiBTS0lQOworICBpbnQ4X3QgR0JBVFs4XTsKKworIHByaXZhdGU6CisgIGJvb2wgVXNlVGVtcGxhdGUwT3B0MygpIGNvbnN0OworICBib29sIFVzZVRlbXBsYXRlMU9wdDMoKSBjb25zdDsKKyAgYm9vbCBVc2VUZW1wbGF0ZTIzT3B0MygpIGNvbnN0OworCisgIEZYQ09ERUNfU1RBVFVTIGRlY29kZV9Bcml0aChJRlhfUGF1c2UqIHBQYXVzZSk7CisgIEZYQ09ERUNfU1RBVFVTIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfb3B0MyhDSkJpZzJfSW1hZ2UqIHBJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIEZYQ09ERUNfU1RBVFVTIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfdW5vcHQoCisgICAgICBDSkJpZzJfSW1hZ2UqIHBJbWFnZSwKKyAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCisgICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIEZYQ09ERUNfU1RBVFVTIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfb3B0MyhDSkJpZzJfSW1hZ2UqIHBJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIEZYQ09ERUNfU1RBVFVTIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfdW5vcHQoCisgICAgICBDSkJpZzJfSW1hZ2UqIHBJbWFnZSwKKyAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCisgICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIEZYQ09ERUNfU1RBVFVTIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfb3B0MyhDSkJpZzJfSW1hZ2UqIHBJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIEZYQ09ERUNfU1RBVFVTIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfdW5vcHQoCisgICAgICBDSkJpZzJfSW1hZ2UqIHBJbWFnZSwKKyAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCisgICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIEZYQ09ERUNfU1RBVFVTIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfb3B0MyhDSkJpZzJfSW1hZ2UqIHBJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIEZYQ09ERUNfU1RBVFVTIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfdW5vcHQoCisgICAgICBDSkJpZzJfSW1hZ2UqIHBJbWFnZSwKKyAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCisgICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIENKQmlnMl9JbWFnZSogZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF9vcHQzKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCk7CisKKyAgQ0pCaWcyX0ltYWdlKiBkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpOworCisgIENKQmlnMl9JbWFnZSogZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV9vcHQzKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCk7CisKKyAgQ0pCaWcyX0ltYWdlKiBkZWNvZGVfQXJpdGhfVGVtcGxhdGUxX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpOworCisgIENKQmlnMl9JbWFnZSogZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl9vcHQzKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCk7CisKKyAgQ0pCaWcyX0ltYWdlKiBkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpOworCisgIENKQmlnMl9JbWFnZSogZGVjb2RlX0FyaXRoX1RlbXBsYXRlM19vcHQzKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCk7CisKKyAgQ0pCaWcyX0ltYWdlKiBkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpOworCisgIEZYX0RXT1JEIG1fbG9vcEluZGV4OworICB1aW50OF90KiBtX3BMaW5lOworICBJRlhfUGF1c2UqIG1fcFBhdXNlOworICBGWENPREVDX1NUQVRVUyBtX1Byb3NzaXZlU3RhdHVzOworICBDSkJpZzJfSW1hZ2UqKiBtX3BJbWFnZTsKKyAgQ0pCaWcyX0FyaXRoRGVjb2RlciogbV9wQXJpdGhEZWNvZGVyOworICBKQmlnMkFyaXRoQ3R4KiBtX2diQ29udGV4dDsKKyAgRlhfV09SRCBtX0RlY29kZVR5cGU7CisgIEZYX0JPT0wgTFRQOworICBGWF9SRUNUIG1fUmVwbGFjZVJlY3Q7Cit9OworCisjZW5kaWYgIC8vIENPUkVfU1JDX0ZYQ09ERUNfSkJJRzJfSkJJRzJfR1JEUFJPQ19IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HcnJkUHJvYy5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0dycmRQcm9jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWM1ZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HcnJkUHJvYy5jcHAKQEAgLTAsMCArMSw1MTYgQEAKKy8vIENvcHlyaWdodCAyMDE1IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgIkpCaWcyX0dycmRQcm9jLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJKQmlnMl9Bcml0aERlY29kZXIuaCIKKyNpbmNsdWRlICJKQmlnMl9CaXRTdHJlYW0uaCIKKyNpbmNsdWRlICJKQmlnMl9JbWFnZS5oIgorCitDSkJpZzJfSW1hZ2UqIENKQmlnMl9HUlJEUHJvYzo6ZGVjb2RlKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdyQ29udGV4dCkgeworICBpZiAoR1JXID09IDAgfHwgR1JIID09IDApCisgICAgcmV0dXJuIG5ldyBDSkJpZzJfSW1hZ2UoR1JXLCBHUkgpOworCisgIGlmIChHUlRFTVBMQVRFID09IDApIHsKKyAgICBpZiAoKEdSQVRbMF0gPT0gLTEpICYmIChHUkFUWzFdID09IC0xKSAmJiAoR1JBVFsyXSA9PSAtMSkgJiYKKyAgICAgICAgKEdSQVRbM10gPT0gLTEpICYmIChHUlJFRkVSRU5DRURYID09IDApICYmCisgICAgICAgIChHUlcgPT0gKEZYX0RXT1JEKUdSUkVGRVJFTkNFLT5tX25XaWR0aCkpIHsKKyAgICAgIHJldHVybiBkZWNvZGVfVGVtcGxhdGUwX29wdChwQXJpdGhEZWNvZGVyLCBnckNvbnRleHQpOworICAgIH0KKyAgICByZXR1cm4gZGVjb2RlX1RlbXBsYXRlMF91bm9wdChwQXJpdGhEZWNvZGVyLCBnckNvbnRleHQpOworICB9CisKKyAgaWYgKChHUlJFRkVSRU5DRURYID09IDApICYmIChHUlcgPT0gKEZYX0RXT1JEKUdSUkVGRVJFTkNFLT5tX25XaWR0aCkpCisgICAgcmV0dXJuIGRlY29kZV9UZW1wbGF0ZTFfb3B0KHBBcml0aERlY29kZXIsIGdyQ29udGV4dCk7CisgIHJldHVybiBkZWNvZGVfVGVtcGxhdGUxX3Vub3B0KHBBcml0aERlY29kZXIsIGdyQ29udGV4dCk7Cit9CisKK0NKQmlnMl9JbWFnZSogQ0pCaWcyX0dSUkRQcm9jOjpkZWNvZGVfVGVtcGxhdGUwX3Vub3B0KAorICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgSkJpZzJBcml0aEN0eCogZ3JDb250ZXh0KSB7CisgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOworICBGWF9EV09SRCBDT05URVhUOworICBGWF9EV09SRCBsaW5lMSwgbGluZTIsIGxpbmUzLCBsaW5lNCwgbGluZTU7CisgIExUUCA9IDA7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IEdSUkVHKG5ldyBDSkJpZzJfSW1hZ2UoR1JXLCBHUkgpKTsKKyAgR1JSRUctPmZpbGwoMCk7CisgIGZvciAoRlhfRFdPUkQgaCA9IDA7IGggPCBHUkg7IGgrKykgeworICAgIGlmIChUUEdST04pIHsKKyAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFsweDAwMTBdKTsKKyAgICAgIExUUCA9IExUUCBeIFNMVFA7CisgICAgfQorICAgIGlmIChMVFAgPT0gMCkgeworICAgICAgbGluZTEgPSBHUlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDEpOworICAgICAgbGluZTEgfD0gR1JSRUctPmdldFBpeGVsKDAsIGggLSAxKSA8PCAxOworICAgICAgbGluZTIgPSAwOworICAgICAgbGluZTMgPSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggKyAxLCBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpOworICAgICAgbGluZTMgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpCisgICAgICAgICAgICAgICA8PCAxOworICAgICAgbGluZTQgPSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggKyAxLCBoIC0gR1JSRUZFUkVOQ0VEWSk7CisgICAgICBsaW5lNCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZKSA8PCAxOworICAgICAgbGluZTQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYIC0gMSwgaCAtIEdSUkVGRVJFTkNFRFkpCisgICAgICAgICAgICAgICA8PCAyOworICAgICAgbGluZTUgPSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggKyAxLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpOworICAgICAgbGluZTUgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpCisgICAgICAgICAgICAgICA8PCAxOworICAgICAgbGluZTUgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYIC0gMSwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKQorICAgICAgICAgICAgICAgPDwgMjsKKyAgICAgIGZvciAoRlhfRFdPUkQgdyA9IDA7IHcgPCBHUlc7IHcrKykgeworICAgICAgICBDT05URVhUID0gbGluZTU7CisgICAgICAgIENPTlRFWFQgfD0gbGluZTQgPDwgMzsKKyAgICAgICAgQ09OVEVYVCB8PSBsaW5lMyA8PCA2OworICAgICAgICBDT05URVhUIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIEdSQVRbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggLSBHUlJFRkVSRU5DRURZICsgR1JBVFszXSkKKyAgICAgICAgICAgICAgICAgICA8PCA4OworICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDk7CisgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgMTA7CisgICAgICAgIENPTlRFWFQgfD0gR1JSRUctPmdldFBpeGVsKHcgKyBHUkFUWzBdLCBoICsgR1JBVFsxXSkgPDwgMTI7CisgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgIEdSUkVHLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKKyAgICAgICAgbGluZTEgPSAoKGxpbmUxIDw8IDEpIHwgR1JSRUctPmdldFBpeGVsKHcgKyAyLCBoIC0gMSkpICYgMHgwMzsKKyAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgYlZhbCkgJiAweDAxOworICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfAorICAgICAgICAgICAgICAgICBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtIEdSUkVGRVJFTkNFRFkgLSAxKSkgJgorICAgICAgICAgICAgICAgIDB4MDM7CisgICAgICAgIGxpbmU0ID0KKyAgICAgICAgICAgICgobGluZTQgPDwgMSkgfAorICAgICAgICAgICAgIEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIDIsIGggLSBHUlJFRkVSRU5DRURZKSkgJgorICAgICAgICAgICAgMHgwNzsKKyAgICAgICAgbGluZTUgPSAoKGxpbmU1IDw8IDEpIHwKKyAgICAgICAgICAgICAgICAgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggLSBHUlJFRkVSRU5DRURZICsgMSkpICYKKyAgICAgICAgICAgICAgICAweDA3OworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBsaW5lMSA9IEdSUkVHLT5nZXRQaXhlbCgxLCBoIC0gMSk7CisgICAgICBsaW5lMSB8PSBHUlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDE7CisgICAgICBsaW5lMiA9IDA7CisgICAgICBsaW5lMyA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZIC0gMSk7CisgICAgICBsaW5lMyB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZIC0gMSkKKyAgICAgICAgICAgICAgIDw8IDE7CisgICAgICBsaW5lNCA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZKTsKKyAgICAgIGxpbmU0IHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkpIDw8IDE7CisgICAgICBsaW5lNCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggLSAxLCBoIC0gR1JSRUZFUkVOQ0VEWSkKKyAgICAgICAgICAgICAgIDw8IDI7CisgICAgICBsaW5lNSA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZICsgMSk7CisgICAgICBsaW5lNSB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZICsgMSkKKyAgICAgICAgICAgICAgIDw8IDE7CisgICAgICBsaW5lNSB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggLSAxLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpCisgICAgICAgICAgICAgICA8PCAyOworICAgICAgZm9yIChGWF9EV09SRCB3ID0gMDsgdyA8IEdSVzsgdysrKSB7CisgICAgICAgIGJWYWwgPSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodywgaCk7CisgICAgICAgIGlmICghKFRQR1JPTiAmJiAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIDEsIGggLSAxKSkgJiYKKyAgICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcsIGggLSAxKSkgJiYKKyAgICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyAxLCBoIC0gMSkpICYmCisgICAgICAgICAgICAgIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gMSwgaCkpICYmCisgICAgICAgICAgICAgIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgMSwgaCkpICYmCisgICAgICAgICAgICAgIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gMSwgaCArIDEpKSAmJgorICAgICAgICAgICAgICAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodywgaCArIDEpKSAmJgorICAgICAgICAgICAgICAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIDEsIGggKyAxKSkpKSB7CisgICAgICAgICAgQ09OVEVYVCA9IGxpbmU1OworICAgICAgICAgIENPTlRFWFQgfD0gbGluZTQgPDwgMzsKKyAgICAgICAgICBDT05URVhUIHw9IGxpbmUzIDw8IDY7CisgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyBHUkFUWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggLSBHUlJFRkVSRU5DRURZICsgR1JBVFszXSkKKyAgICAgICAgICAgICAgICAgICAgIDw8IDg7CisgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMiA8PCA5OworICAgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgMTA7CisgICAgICAgICAgQ09OVEVYVCB8PSBHUlJFRy0+Z2V0UGl4ZWwodyArIEdSQVRbMF0sIGggKyBHUkFUWzFdKSA8PCAxMjsKKyAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnckNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICB9CisgICAgICAgIEdSUkVHLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKKyAgICAgICAgbGluZTEgPSAoKGxpbmUxIDw8IDEpIHwgR1JSRUctPmdldFBpeGVsKHcgKyAyLCBoIC0gMSkpICYgMHgwMzsKKyAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgYlZhbCkgJiAweDAxOworICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfAorICAgICAgICAgICAgICAgICBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtIEdSUkVGRVJFTkNFRFkgLSAxKSkgJgorICAgICAgICAgICAgICAgIDB4MDM7CisgICAgICAgIGxpbmU0ID0KKyAgICAgICAgICAgICgobGluZTQgPDwgMSkgfAorICAgICAgICAgICAgIEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIDIsIGggLSBHUlJFRkVSRU5DRURZKSkgJgorICAgICAgICAgICAgMHgwNzsKKyAgICAgICAgbGluZTUgPSAoKGxpbmU1IDw8IDEpIHwKKyAgICAgICAgICAgICAgICAgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggLSBHUlJFRkVSRU5DRURZICsgMSkpICYKKyAgICAgICAgICAgICAgICAweDA3OworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gR1JSRUcucmVsZWFzZSgpOworfQorCitDSkJpZzJfSW1hZ2UqIENKQmlnMl9HUlJEUHJvYzo6ZGVjb2RlX1RlbXBsYXRlMF9vcHQoCisgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICBKQmlnMkFyaXRoQ3R4KiBnckNvbnRleHQpIHsKKyAgaWYgKCFHUlJFRkVSRU5DRS0+bV9wRGF0YSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBGWF9CT09MIExUUCwgU0xUUCwgYlZhbDsKKyAgRlhfRFdPUkQgQ09OVEVYVDsKKyAgRlhfRFdPUkQgbGluZTEsIGxpbmUxX3IsIGxpbmUyX3IsIGxpbmUzX3I7CisgIHVpbnQ4X3QqIHBMaW5lLCAqcExpbmVSLCBjVmFsOworICBpbnRwdHJfdCBuU3RyaWRlLCBuU3RyaWRlUiwgbk9mZnNldDsKKyAgaW50MzJfdCBrLCBuQml0czsKKyAgaW50MzJfdCBHUldSLCBHUkhSOworICBpbnQzMl90IEdSVywgR1JIOworICBHUlcgPSAoaW50MzJfdClDSkJpZzJfR1JSRFByb2M6OkdSVzsKKyAgR1JIID0gKGludDMyX3QpQ0pCaWcyX0dSUkRQcm9jOjpHUkg7CisgIExUUCA9IDA7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IEdSUkVHKG5ldyBDSkJpZzJfSW1hZ2UoR1JXLCBHUkgpKTsKKyAgaWYgKCFHUlJFRy0+bV9wRGF0YSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBwTGluZSA9IEdSUkVHLT5tX3BEYXRhOworICBwTGluZVIgPSBHUlJFRkVSRU5DRS0+bV9wRGF0YTsKKyAgblN0cmlkZSA9IEdSUkVHLT5tX25TdHJpZGU7CisgIG5TdHJpZGVSID0gR1JSRUZFUkVOQ0UtPm1fblN0cmlkZTsKKyAgR1JXUiA9IChpbnQzMl90KUdSUkVGRVJFTkNFLT5tX25XaWR0aDsKKyAgR1JIUiA9IChpbnQzMl90KUdSUkVGRVJFTkNFLT5tX25IZWlnaHQ7CisgIGlmIChHUlJFRkVSRU5DRURZIDwgLUdSSFIgKyAxIHx8IEdSUkVGRVJFTkNFRFkgPiBHUkhSIC0gMSkgeworICAgIEdSUkVGRVJFTkNFRFkgPSAwOworICB9CisgIG5PZmZzZXQgPSAtR1JSRUZFUkVOQ0VEWSAqIG5TdHJpZGVSOworICBmb3IgKGludDMyX3QgaCA9IDA7IGggPCBHUkg7IGgrKykgeworICAgIGlmIChUUEdST04pIHsKKyAgICAgIFNMVFAgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFsweDAwMTBdKTsKKyAgICAgIExUUCA9IExUUCBeIFNMVFA7CisgICAgfQorICAgIGxpbmUxID0gKGggPiAwKSA/IHBMaW5lWy1uU3RyaWRlXSA8PCA0IDogMDsKKyAgICBpbnQzMl90IHJlZmVyZW5jZV9oID0gaCAtIEdSUkVGRVJFTkNFRFk7CisgICAgRlhfQk9PTCBsaW5lMV9yX29rID0gKHJlZmVyZW5jZV9oID4gMCAmJiByZWZlcmVuY2VfaCA8IEdSSFIgKyAxKTsKKyAgICBGWF9CT09MIGxpbmUyX3Jfb2sgPSAocmVmZXJlbmNlX2ggPiAtMSAmJiByZWZlcmVuY2VfaCA8IEdSSFIpOworICAgIEZYX0JPT0wgbGluZTNfcl9vayA9IChyZWZlcmVuY2VfaCA+IC0yICYmIHJlZmVyZW5jZV9oIDwgR1JIUiAtIDEpOworICAgIGxpbmUxX3IgPSBsaW5lMV9yX29rID8gcExpbmVSW25PZmZzZXQgLSBuU3RyaWRlUl0gOiAwOworICAgIGxpbmUyX3IgPSBsaW5lMl9yX29rID8gcExpbmVSW25PZmZzZXRdIDogMDsKKyAgICBsaW5lM19yID0gbGluZTNfcl9vayA/IHBMaW5lUltuT2Zmc2V0ICsgblN0cmlkZVJdIDogMDsKKyAgICBpZiAoTFRQID09IDApIHsKKyAgICAgIENPTlRFWFQgPSAobGluZTEgJiAweDFjMDApIHwgKGxpbmUxX3IgJiAweDAxYzApIHwKKyAgICAgICAgICAgICAgICAoKGxpbmUyX3IgPj4gMykgJiAweDAwMzgpIHwgKChsaW5lM19yID4+IDYpICYgMHgwMDA3KTsKKyAgICAgIGZvciAoaW50MzJfdCB3ID0gMDsgdyA8IEdSVzsgdyArPSA4KSB7CisgICAgICAgIG5CaXRzID0gR1JXIC0gdyA+IDggPyA4IDogR1JXIC0gdzsKKyAgICAgICAgaWYgKGggPiAwKQorICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICh3ICsgOCA8IEdSVyA/IHBMaW5lWy1uU3RyaWRlICsgKHcgPj4gMykgKyAxXSA8PCA0IDogMCk7CisgICAgICAgIGlmIChoID4gR1JIUiArIEdSUkVGRVJFTkNFRFkgKyAxKSB7CisgICAgICAgICAgbGluZTFfciA9IDA7CisgICAgICAgICAgbGluZTJfciA9IDA7CisgICAgICAgICAgbGluZTNfciA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGxpbmUxX3Jfb2spCisgICAgICAgICAgICBsaW5lMV9yID0KKyAgICAgICAgICAgICAgICAobGluZTFfciA8PCA4KSB8CisgICAgICAgICAgICAgICAgKHcgKyA4IDwgR1JXUiA/IHBMaW5lUltuT2Zmc2V0IC0gblN0cmlkZVIgKyAodyA+PiAzKSArIDFdIDogMCk7CisgICAgICAgICAgaWYgKGxpbmUyX3Jfb2spCisgICAgICAgICAgICBsaW5lMl9yID0gKGxpbmUyX3IgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICh3ICsgOCA8IEdSV1IgPyBwTGluZVJbbk9mZnNldCArICh3ID4+IDMpICsgMV0gOiAwKTsKKyAgICAgICAgICBpZiAobGluZTNfcl9vaykgeworICAgICAgICAgICAgbGluZTNfciA9CisgICAgICAgICAgICAgICAgKGxpbmUzX3IgPDwgOCkgfAorICAgICAgICAgICAgICAgICh3ICsgOCA8IEdSV1IgPyBwTGluZVJbbk9mZnNldCArIG5TdHJpZGVSICsgKHcgPj4gMykgKyAxXSA6IDApOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsaW5lM19yID0gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBuQml0czsgaysrKSB7CisgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ3JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKKyAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwY2RiKSA8PCAxKSB8IChiVmFsIDw8IDkpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsaW5lMSA+PiAoNyAtIGspKSAmIDB4MDQwMCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxpbmUxX3IgPj4gKDcgLSBrKSkgJiAweDAwNDApIHwKKyAgICAgICAgICAgICAgICAgICAgKChsaW5lMl9yID4+ICgxMCAtIGspKSAmIDB4MDAwOCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxpbmUzX3IgPj4gKDEzIC0gaykpICYgMHgwMDAxKTsKKyAgICAgICAgfQorICAgICAgICBwTGluZVt3ID4+IDNdID0gY1ZhbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgQ09OVEVYVCA9IChsaW5lMSAmIDB4MWMwMCkgfCAobGluZTFfciAmIDB4MDFjMCkgfAorICAgICAgICAgICAgICAgICgobGluZTJfciA+PiAzKSAmIDB4MDAzOCkgfCAoKGxpbmUzX3IgPj4gNikgJiAweDAwMDcpOworICAgICAgZm9yIChpbnQzMl90IHcgPSAwOyB3IDwgR1JXOyB3ICs9IDgpIHsKKyAgICAgICAgbkJpdHMgPSBHUlcgLSB3ID4gOCA/IDggOiBHUlcgLSB3OworICAgICAgICBpZiAoaCA+IDApCisgICAgICAgICAgbGluZTEgPSAobGluZTEgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgKHcgKyA4IDwgR1JXID8gcExpbmVbLW5TdHJpZGUgKyAodyA+PiAzKSArIDFdIDw8IDQgOiAwKTsKKyAgICAgICAgaWYgKGxpbmUxX3Jfb2spCisgICAgICAgICAgbGluZTFfciA9CisgICAgICAgICAgICAgIChsaW5lMV9yIDw8IDgpIHwKKyAgICAgICAgICAgICAgKHcgKyA4IDwgR1JXUiA/IHBMaW5lUltuT2Zmc2V0IC0gblN0cmlkZVIgKyAodyA+PiAzKSArIDFdIDogMCk7CisgICAgICAgIGlmIChsaW5lMl9yX29rKQorICAgICAgICAgIGxpbmUyX3IgPSAobGluZTJfciA8PCA4KSB8CisgICAgICAgICAgICAgICAgICAgICh3ICsgOCA8IEdSV1IgPyBwTGluZVJbbk9mZnNldCArICh3ID4+IDMpICsgMV0gOiAwKTsKKyAgICAgICAgaWYgKGxpbmUzX3Jfb2spIHsKKyAgICAgICAgICBsaW5lM19yID0KKyAgICAgICAgICAgICAgKGxpbmUzX3IgPDwgOCkgfAorICAgICAgICAgICAgICAodyArIDggPCBHUldSID8gcExpbmVSW25PZmZzZXQgKyBuU3RyaWRlUiArICh3ID4+IDMpICsgMV0gOiAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBsaW5lM19yID0gMDsKKyAgICAgICAgfQorICAgICAgICBjVmFsID0gMDsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IG5CaXRzOyBrKyspIHsKKyAgICAgICAgICBiVmFsID0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrLCBoKTsKKyAgICAgICAgICBpZiAoIShUUEdST04gJiYgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrIC0gMSwgaCAtIDEpKSAmJgorICAgICAgICAgICAgICAgIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgaywgaCAtIDEpKSAmJgorICAgICAgICAgICAgICAgIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgayArIDEsIGggLSAxKSkgJiYKKyAgICAgICAgICAgICAgICAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIGsgLSAxLCBoKSkgJiYKKyAgICAgICAgICAgICAgICAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIGsgKyAxLCBoKSkgJiYKKyAgICAgICAgICAgICAgICAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIGsgLSAxLCBoICsgMSkpICYmCisgICAgICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrLCBoICsgMSkpICYmCisgICAgICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrICsgMSwgaCArIDEpKSkpIHsKKyAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgICAgfQorICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOworICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDBjZGIpIDw8IDEpIHwgKGJWYWwgPDwgOSkgfAorICAgICAgICAgICAgICAgICAgICAoKGxpbmUxID4+ICg3IC0gaykpICYgMHgwNDAwKSB8CisgICAgICAgICAgICAgICAgICAgICgobGluZTFfciA+PiAoNyAtIGspKSAmIDB4MDA0MCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxpbmUyX3IgPj4gKDEwIC0gaykpICYgMHgwMDA4KSB8CisgICAgICAgICAgICAgICAgICAgICgobGluZTNfciA+PiAoMTMgLSBrKSkgJiAweDAwMDEpOworICAgICAgICB9CisgICAgICAgIHBMaW5lW3cgPj4gM10gPSBjVmFsOworICAgICAgfQorICAgIH0KKyAgICBwTGluZSArPSBuU3RyaWRlOworICAgIGlmIChoIDwgR1JIUiArIEdSUkVGRVJFTkNFRFkpIHsKKyAgICAgIHBMaW5lUiArPSBuU3RyaWRlUjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEdSUkVHLnJlbGVhc2UoKTsKK30KKworQ0pCaWcyX0ltYWdlKiBDSkJpZzJfR1JSRFByb2M6OmRlY29kZV9UZW1wbGF0ZTFfdW5vcHQoCisgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICBKQmlnMkFyaXRoQ3R4KiBnckNvbnRleHQpIHsKKyAgRlhfQk9PTCBMVFAsIFNMVFAsIGJWYWw7CisgIEZYX0RXT1JEIENPTlRFWFQ7CisgIEZYX0RXT1JEIGxpbmUxLCBsaW5lMiwgbGluZTMsIGxpbmU0LCBsaW5lNTsKKyAgTFRQID0gMDsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gR1JSRUcobmV3IENKQmlnMl9JbWFnZShHUlcsIEdSSCkpOworICBHUlJFRy0+ZmlsbCgwKTsKKyAgZm9yIChGWF9EV09SRCBoID0gMDsgaCA8IEdSSDsgaCsrKSB7CisgICAgaWYgKFRQR1JPTikgeworICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ3JDb250ZXh0WzB4MDAwOF0pOworICAgICAgTFRQID0gTFRQIF4gU0xUUDsKKyAgICB9CisgICAgaWYgKExUUCA9PSAwKSB7CisgICAgICBsaW5lMSA9IEdSUkVHLT5nZXRQaXhlbCgxLCBoIC0gMSk7CisgICAgICBsaW5lMSB8PSBHUlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDE7CisgICAgICBsaW5lMSB8PSBHUlJFRy0+Z2V0UGl4ZWwoLTEsIGggLSAxKSA8PCAyOworICAgICAgbGluZTIgPSAwOworICAgICAgbGluZTMgPSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZIC0gMSk7CisgICAgICBsaW5lNCA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZKTsKKyAgICAgIGxpbmU0IHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkpIDw8IDE7CisgICAgICBsaW5lNCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggLSAxLCBoIC0gR1JSRUZFUkVOQ0VEWSkKKyAgICAgICAgICAgICAgIDw8IDI7CisgICAgICBsaW5lNSA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZICsgMSk7CisgICAgICBsaW5lNSB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZICsgMSkKKyAgICAgICAgICAgICAgIDw8IDE7CisgICAgICBmb3IgKEZYX0RXT1JEIHcgPSAwOyB3IDwgR1JXOyB3KyspIHsKKyAgICAgICAgQ09OVEVYVCA9IGxpbmU1OworICAgICAgICBDT05URVhUIHw9IGxpbmU0IDw8IDI7CisgICAgICAgIENPTlRFWFQgfD0gbGluZTMgPDwgNTsKKyAgICAgICAgQ09OVEVYVCB8PSBsaW5lMiA8PCA2OworICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDc7CisgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgIEdSUkVHLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKKyAgICAgICAgbGluZTEgPSAoKGxpbmUxIDw8IDEpIHwgR1JSRUctPmdldFBpeGVsKHcgKyAyLCBoIC0gMSkpICYgMHgwNzsKKyAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgYlZhbCkgJiAweDAxOworICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfAorICAgICAgICAgICAgICAgICBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtIEdSUkVGRVJFTkNFRFkgLSAxKSkgJgorICAgICAgICAgICAgICAgIDB4MDE7CisgICAgICAgIGxpbmU0ID0KKyAgICAgICAgICAgICgobGluZTQgPDwgMSkgfAorICAgICAgICAgICAgIEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIDIsIGggLSBHUlJFRkVSRU5DRURZKSkgJgorICAgICAgICAgICAgMHgwNzsKKyAgICAgICAgbGluZTUgPSAoKGxpbmU1IDw8IDEpIHwKKyAgICAgICAgICAgICAgICAgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggLSBHUlJFRkVSRU5DRURZICsgMSkpICYKKyAgICAgICAgICAgICAgICAweDAzOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBsaW5lMSA9IEdSUkVHLT5nZXRQaXhlbCgxLCBoIC0gMSk7CisgICAgICBsaW5lMSB8PSBHUlJFRy0+Z2V0UGl4ZWwoMCwgaCAtIDEpIDw8IDE7CisgICAgICBsaW5lMSB8PSBHUlJFRy0+Z2V0UGl4ZWwoLTEsIGggLSAxKSA8PCAyOworICAgICAgbGluZTIgPSAwOworICAgICAgbGluZTMgPSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZIC0gMSk7CisgICAgICBsaW5lNCA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZKTsKKyAgICAgIGxpbmU0IHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkpIDw8IDE7CisgICAgICBsaW5lNCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggLSAxLCBoIC0gR1JSRUZFUkVOQ0VEWSkKKyAgICAgICAgICAgICAgIDw8IDI7CisgICAgICBsaW5lNSA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZICsgMSk7CisgICAgICBsaW5lNSB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZICsgMSkKKyAgICAgICAgICAgICAgIDw8IDE7CisgICAgICBmb3IgKEZYX0RXT1JEIHcgPSAwOyB3IDwgR1JXOyB3KyspIHsKKyAgICAgICAgYlZhbCA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3LCBoKTsKKyAgICAgICAgaWYgKCEoVFBHUk9OICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gMSwgaCAtIDEpKSAmJgorICAgICAgICAgICAgICAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodywgaCAtIDEpKSAmJgorICAgICAgICAgICAgICAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIDEsIGggLSAxKSkgJiYKKyAgICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSAxLCBoKSkgJiYKKyAgICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyAxLCBoKSkgJiYKKyAgICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSAxLCBoICsgMSkpICYmCisgICAgICAgICAgICAgIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3LCBoICsgMSkpICYmCisgICAgICAgICAgICAgIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgMSwgaCArIDEpKSkpIHsKKyAgICAgICAgICBDT05URVhUID0gbGluZTU7CisgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lNCA8PCAyOworICAgICAgICAgIENPTlRFWFQgfD0gbGluZTMgPDwgNTsKKyAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDY7CisgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA3OworICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFtDT05URVhUXSk7CisgICAgICAgIH0KKyAgICAgICAgR1JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOworICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHUlJFRy0+Z2V0UGl4ZWwodyArIDIsIGggLSAxKSkgJiAweDA3OworICAgICAgICBsaW5lMiA9ICgobGluZTIgPDwgMSkgfCBiVmFsKSAmIDB4MDE7CisgICAgICAgIGxpbmUzID0gKChsaW5lMyA8PCAxKSB8CisgICAgICAgICAgICAgICAgIEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpKSAmCisgICAgICAgICAgICAgICAgMHgwMTsKKyAgICAgICAgbGluZTQgPQorICAgICAgICAgICAgKChsaW5lNCA8PCAxKSB8CisgICAgICAgICAgICAgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMiwgaCAtIEdSUkVGRVJFTkNFRFkpKSAmCisgICAgICAgICAgICAweDA3OworICAgICAgICBsaW5lNSA9ICgobGluZTUgPDwgMSkgfAorICAgICAgICAgICAgICAgICBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKSkgJgorICAgICAgICAgICAgICAgIDB4MDM7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBHUlJFRy5yZWxlYXNlKCk7Cit9CisKK0NKQmlnMl9JbWFnZSogQ0pCaWcyX0dSUkRQcm9jOjpkZWNvZGVfVGVtcGxhdGUxX29wdCgKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdyQ29udGV4dCkgeworICBpZiAoIUdSUkVGRVJFTkNFLT5tX3BEYXRhKQorICAgIHJldHVybiBudWxscHRyOworCisgIEZYX0JPT0wgTFRQLCBTTFRQLCBiVmFsOworICBGWF9EV09SRCBDT05URVhUOworICBGWF9EV09SRCBsaW5lMSwgbGluZTFfciwgbGluZTJfciwgbGluZTNfcjsKKyAgdWludDhfdCogcExpbmUsICpwTGluZVIsIGNWYWw7CisgIGludHB0cl90IG5TdHJpZGUsIG5TdHJpZGVSLCBuT2Zmc2V0OworICBpbnQzMl90IGssIG5CaXRzOworICBpbnQzMl90IEdSV1IsIEdSSFI7CisgIGludDMyX3QgR1JXLCBHUkg7CisgIEdSVyA9IChpbnQzMl90KUNKQmlnMl9HUlJEUHJvYzo6R1JXOworICBHUkggPSAoaW50MzJfdClDSkJpZzJfR1JSRFByb2M6OkdSSDsKKyAgTFRQID0gMDsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gR1JSRUcobmV3IENKQmlnMl9JbWFnZShHUlcsIEdSSCkpOworICBpZiAoIUdSUkVHLT5tX3BEYXRhKQorICAgIHJldHVybiBudWxscHRyOworCisgIHBMaW5lID0gR1JSRUctPm1fcERhdGE7CisgIHBMaW5lUiA9IEdSUkVGRVJFTkNFLT5tX3BEYXRhOworICBuU3RyaWRlID0gR1JSRUctPm1fblN0cmlkZTsKKyAgblN0cmlkZVIgPSBHUlJFRkVSRU5DRS0+bV9uU3RyaWRlOworICBHUldSID0gKGludDMyX3QpR1JSRUZFUkVOQ0UtPm1fbldpZHRoOworICBHUkhSID0gKGludDMyX3QpR1JSRUZFUkVOQ0UtPm1fbkhlaWdodDsKKyAgaWYgKEdSUkVGRVJFTkNFRFkgPCAtR1JIUiArIDEgfHwgR1JSRUZFUkVOQ0VEWSA+IEdSSFIgLSAxKSB7CisgICAgR1JSRUZFUkVOQ0VEWSA9IDA7CisgIH0KKyAgbk9mZnNldCA9IC1HUlJFRkVSRU5DRURZICogblN0cmlkZVI7CisgIGZvciAoaW50MzJfdCBoID0gMDsgaCA8IEdSSDsgaCsrKSB7CisgICAgaWYgKFRQR1JPTikgeworICAgICAgU0xUUCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ3JDb250ZXh0WzB4MDAwOF0pOworICAgICAgTFRQID0gTFRQIF4gU0xUUDsKKyAgICB9CisgICAgbGluZTEgPSAoaCA+IDApID8gcExpbmVbLW5TdHJpZGVdIDw8IDEgOiAwOworICAgIGludDMyX3QgcmVmZXJlbmNlX2ggPSBoIC0gR1JSRUZFUkVOQ0VEWTsKKyAgICBGWF9CT09MIGxpbmUxX3Jfb2sgPSAocmVmZXJlbmNlX2ggPiAwICYmIHJlZmVyZW5jZV9oIDwgR1JIUiArIDEpOworICAgIEZYX0JPT0wgbGluZTJfcl9vayA9IChyZWZlcmVuY2VfaCA+IC0xICYmIHJlZmVyZW5jZV9oIDwgR1JIUik7CisgICAgRlhfQk9PTCBsaW5lM19yX29rID0gKHJlZmVyZW5jZV9oID4gLTIgJiYgcmVmZXJlbmNlX2ggPCBHUkhSIC0gMSk7CisgICAgbGluZTFfciA9IGxpbmUxX3Jfb2sgPyBwTGluZVJbbk9mZnNldCAtIG5TdHJpZGVSXSA6IDA7CisgICAgbGluZTJfciA9IGxpbmUyX3Jfb2sgPyBwTGluZVJbbk9mZnNldF0gOiAwOworICAgIGxpbmUzX3IgPSBsaW5lM19yX29rID8gcExpbmVSW25PZmZzZXQgKyBuU3RyaWRlUl0gOiAwOworICAgIGlmIChMVFAgPT0gMCkgeworICAgICAgQ09OVEVYVCA9IChsaW5lMSAmIDB4MDM4MCkgfCAoKGxpbmUxX3IgPj4gMikgJiAweDAwMjApIHwKKyAgICAgICAgICAgICAgICAoKGxpbmUyX3IgPj4gNCkgJiAweDAwMWMpIHwgKChsaW5lM19yID4+IDYpICYgMHgwMDAzKTsKKyAgICAgIGZvciAoaW50MzJfdCB3ID0gMDsgdyA8IEdSVzsgdyArPSA4KSB7CisgICAgICAgIG5CaXRzID0gR1JXIC0gdyA+IDggPyA4IDogR1JXIC0gdzsKKyAgICAgICAgaWYgKGggPiAwKQorICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICh3ICsgOCA8IEdSVyA/IHBMaW5lWy1uU3RyaWRlICsgKHcgPj4gMykgKyAxXSA8PCAxIDogMCk7CisgICAgICAgIGlmIChsaW5lMV9yX29rKQorICAgICAgICAgIGxpbmUxX3IgPQorICAgICAgICAgICAgICAobGluZTFfciA8PCA4KSB8CisgICAgICAgICAgICAgICh3ICsgOCA8IEdSV1IgPyBwTGluZVJbbk9mZnNldCAtIG5TdHJpZGVSICsgKHcgPj4gMykgKyAxXSA6IDApOworICAgICAgICBpZiAobGluZTJfcl9vaykKKyAgICAgICAgICBsaW5lMl9yID0gKGxpbmUyX3IgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAodyArIDggPCBHUldSID8gcExpbmVSW25PZmZzZXQgKyAodyA+PiAzKSArIDFdIDogMCk7CisgICAgICAgIGlmIChsaW5lM19yX29rKSB7CisgICAgICAgICAgbGluZTNfciA9CisgICAgICAgICAgICAgIChsaW5lM19yIDw8IDgpIHwKKyAgICAgICAgICAgICAgKHcgKyA4IDwgR1JXUiA/IHBMaW5lUltuT2Zmc2V0ICsgblN0cmlkZVIgKyAodyA+PiAzKSArIDFdIDogMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbGluZTNfciA9IDA7CisgICAgICAgIH0KKyAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBuQml0czsgaysrKSB7CisgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ3JDb250ZXh0W0NPTlRFWFRdKTsKKyAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKKyAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMThkKSA8PCAxKSB8IChiVmFsIDw8IDYpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsaW5lMSA+PiAoNyAtIGspKSAmIDB4MDA4MCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxpbmUxX3IgPj4gKDkgLSBrKSkgJiAweDAwMjApIHwKKyAgICAgICAgICAgICAgICAgICAgKChsaW5lMl9yID4+ICgxMSAtIGspKSAmIDB4MDAwNCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxpbmUzX3IgPj4gKDEzIC0gaykpICYgMHgwMDAxKTsKKyAgICAgICAgfQorICAgICAgICBwTGluZVt3ID4+IDNdID0gY1ZhbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgQ09OVEVYVCA9IChsaW5lMSAmIDB4MDM4MCkgfCAoKGxpbmUxX3IgPj4gMikgJiAweDAwMjApIHwKKyAgICAgICAgICAgICAgICAoKGxpbmUyX3IgPj4gNCkgJiAweDAwMWMpIHwgKChsaW5lM19yID4+IDYpICYgMHgwMDAzKTsKKyAgICAgIGZvciAoaW50MzJfdCB3ID0gMDsgdyA8IEdSVzsgdyArPSA4KSB7CisgICAgICAgIG5CaXRzID0gR1JXIC0gdyA+IDggPyA4IDogR1JXIC0gdzsKKyAgICAgICAgaWYgKGggPiAwKQorICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICh3ICsgOCA8IEdSVyA/IHBMaW5lWy1uU3RyaWRlICsgKHcgPj4gMykgKyAxXSA8PCAxIDogMCk7CisgICAgICAgIGlmIChsaW5lMV9yX29rKQorICAgICAgICAgIGxpbmUxX3IgPQorICAgICAgICAgICAgICAobGluZTFfciA8PCA4KSB8CisgICAgICAgICAgICAgICh3ICsgOCA8IEdSV1IgPyBwTGluZVJbbk9mZnNldCAtIG5TdHJpZGVSICsgKHcgPj4gMykgKyAxXSA6IDApOworICAgICAgICBpZiAobGluZTJfcl9vaykKKyAgICAgICAgICBsaW5lMl9yID0gKGxpbmUyX3IgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAodyArIDggPCBHUldSID8gcExpbmVSW25PZmZzZXQgKyAodyA+PiAzKSArIDFdIDogMCk7CisgICAgICAgIGlmIChsaW5lM19yX29rKSB7CisgICAgICAgICAgbGluZTNfciA9CisgICAgICAgICAgICAgIChsaW5lM19yIDw8IDgpIHwKKyAgICAgICAgICAgICAgKHcgKyA4IDwgR1JXUiA/IHBMaW5lUltuT2Zmc2V0ICsgblN0cmlkZVIgKyAodyA+PiAzKSArIDFdIDogMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbGluZTNfciA9IDA7CisgICAgICAgIH0KKyAgICAgICAgY1ZhbCA9IDA7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBuQml0czsgaysrKSB7CisgICAgICAgICAgYlZhbCA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgaywgaCk7CisgICAgICAgICAgaWYgKCEoVFBHUk9OICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgayAtIDEsIGggLSAxKSkgJiYKKyAgICAgICAgICAgICAgICAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIGssIGggLSAxKSkgJiYKKyAgICAgICAgICAgICAgICAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIGsgKyAxLCBoIC0gMSkpICYmCisgICAgICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrIC0gMSwgaCkpICYmCisgICAgICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrICsgMSwgaCkpICYmCisgICAgICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrIC0gMSwgaCArIDEpKSAmJgorICAgICAgICAgICAgICAgIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgaywgaCArIDEpKSAmJgorICAgICAgICAgICAgICAgIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgayArIDEsIGggKyAxKSkpKSB7CisgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnckNvbnRleHRbQ09OVEVYVF0pOworICAgICAgICAgIH0KKyAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKKyAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMThkKSA8PCAxKSB8IChiVmFsIDw8IDYpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsaW5lMSA+PiAoNyAtIGspKSAmIDB4MDA4MCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxpbmUxX3IgPj4gKDkgLSBrKSkgJiAweDAwMjApIHwKKyAgICAgICAgICAgICAgICAgICAgKChsaW5lMl9yID4+ICgxMSAtIGspKSAmIDB4MDAwNCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxpbmUzX3IgPj4gKDEzIC0gaykpICYgMHgwMDAxKTsKKyAgICAgICAgfQorICAgICAgICBwTGluZVt3ID4+IDNdID0gY1ZhbDsKKyAgICAgIH0KKyAgICB9CisgICAgcExpbmUgKz0gblN0cmlkZTsKKyAgICBpZiAoaCA8IEdSSFIgKyBHUlJFRkVSRU5DRURZKSB7CisgICAgICBwTGluZVIgKz0gblN0cmlkZVI7CisgICAgfQorICB9CisgIHJldHVybiBHUlJFRy5yZWxlYXNlKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0dycmRQcm9jLmggYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0dycmRQcm9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJiNGViNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR3JyZFByb2MuaApAQCAtMCwwICsxLDQ0IEBACisvLyBDb3B5cmlnaHQgMjAxNSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9TUkNfRlhDT0RFQ19KQklHMl9KQklHMl9HUlJEUFJPQ19IXworI2RlZmluZSBDT1JFX1NSQ19GWENPREVDX0pCSUcyX0pCSUcyX0dSUkRQUk9DX0hfCisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmgiCisKK2NsYXNzIENKQmlnMl9Bcml0aERlY29kZXI7CitjbGFzcyBDSkJpZzJfSW1hZ2U7CitjbGFzcyBJRlhfUGF1c2U7CitzdHJ1Y3QgSkJpZzJBcml0aEN0eDsKKworY2xhc3MgQ0pCaWcyX0dSUkRQcm9jIHsKKyBwdWJsaWM6CisgIENKQmlnMl9JbWFnZSogZGVjb2RlKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdyQ29udGV4dCk7CisKKyAgQ0pCaWcyX0ltYWdlKiBkZWNvZGVfVGVtcGxhdGUwX3Vub3B0KENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnckNvbnRleHQpOworCisgIENKQmlnMl9JbWFnZSogZGVjb2RlX1RlbXBsYXRlMF9vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnckNvbnRleHQpOworCisgIENKQmlnMl9JbWFnZSogZGVjb2RlX1RlbXBsYXRlMV91bm9wdChDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ3JDb250ZXh0KTsKKworICBDSkJpZzJfSW1hZ2UqIGRlY29kZV9UZW1wbGF0ZTFfb3B0KENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ3JDb250ZXh0KTsKKworICBGWF9EV09SRCBHUlc7CisgIEZYX0RXT1JEIEdSSDsKKyAgRlhfQk9PTCBHUlRFTVBMQVRFOworICBDSkJpZzJfSW1hZ2UqIEdSUkVGRVJFTkNFOworICBpbnQzMl90IEdSUkVGRVJFTkNFRFg7CisgIGludDMyX3QgR1JSRUZFUkVOQ0VEWTsKKyAgRlhfQk9PTCBUUEdST047CisgIGludDhfdCBHUkFUWzRdOworfTsKKworI2VuZGlmICAvLyBDT1JFX1NSQ19GWENPREVDX0pCSUcyX0pCSUcyX0dSUkRQUk9DX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0dzaWRQcm9jLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR3NpZFByb2MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NzFlZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0dzaWRQcm9jLmNwcApAQCAtMCwwICsxLDEyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiSkJpZzJfR3NpZFByb2MuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgIkpCaWcyX0JpdFN0cmVhbS5oIgorI2luY2x1ZGUgIkpCaWcyX0dyZFByb2MuaCIKKyNpbmNsdWRlICJKQmlnMl9JbWFnZS5oIgorI2luY2x1ZGUgIkpCaWcyX0xpc3QuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKKworRlhfRFdPUkQqIENKQmlnMl9HU0lEUHJvYzo6ZGVjb2RlX0FyaXRoKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfR1JEUHJvYz4gcEdSRChuZXcgQ0pCaWcyX0dSRFByb2MoKSk7CisgIHBHUkQtPk1NUiA9IEdTTU1SOworICBwR1JELT5HQlcgPSBHU1c7CisgIHBHUkQtPkdCSCA9IEdTSDsKKyAgcEdSRC0+R0JURU1QTEFURSA9IEdTVEVNUExBVEU7CisgIHBHUkQtPlRQR0RPTiA9IDA7CisgIHBHUkQtPlVTRVNLSVAgPSBHU1VTRVNLSVA7CisgIHBHUkQtPlNLSVAgPSBHU0tJUDsKKyAgaWYgKEdTVEVNUExBVEUgPD0gMSkgeworICAgIHBHUkQtPkdCQVRbMF0gPSAzOworICB9IGVsc2UgeworICAgIHBHUkQtPkdCQVRbMF0gPSAyOworICB9CisgIHBHUkQtPkdCQVRbMV0gPSAtMTsKKyAgaWYgKHBHUkQtPkdCVEVNUExBVEUgPT0gMCkgeworICAgIHBHUkQtPkdCQVRbMl0gPSAtMzsKKyAgICBwR1JELT5HQkFUWzNdID0gLTE7CisgICAgcEdSRC0+R0JBVFs0XSA9IDI7CisgICAgcEdSRC0+R0JBVFs1XSA9IC0yOworICAgIHBHUkQtPkdCQVRbNl0gPSAtMjsKKyAgICBwR1JELT5HQkFUWzddID0gLTI7CisgIH0KKworICBDSkJpZzJfTGlzdDxDSkJpZzJfSW1hZ2U+IEdTUExBTkVTKEdTQlBQKTsKKyAgZm9yIChpbnQzMl90IGkgPSBHU0JQUCAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgQ0pCaWcyX0ltYWdlKiBwSW1hZ2UgPSBudWxscHRyOworICAgIEZYQ09ERUNfU1RBVFVTIHN0YXR1cyA9CisgICAgICAgIHBHUkQtPlN0YXJ0X2RlY29kZV9Bcml0aCgmcEltYWdlLCBwQXJpdGhEZWNvZGVyLCBnYkNvbnRleHQsIG51bGxwdHIpOworICAgIHdoaWxlIChzdGF0dXMgPT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRSkKKyAgICAgIHBHUkQtPkNvbnRpbnVlX2RlY29kZShwUGF1c2UpOworCisgICAgaWYgKCFwSW1hZ2UpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIEdTUExBTkVTLnNldChpLCBwSW1hZ2UpOworCisgICAgaWYgKGkgPCBHU0JQUCAtIDEpCisgICAgICBwSW1hZ2UtPmNvbXBvc2VGcm9tKDAsIDAsIEdTUExBTkVTLmdldChpICsgMSksIEpCSUcyX0NPTVBPU0VfWE9SKTsKKyAgfQorICBzdGQ6OnVuaXF1ZV9wdHI8RlhfRFdPUkQsIEZ4RnJlZURlbGV0ZXI+IEdTVkFMUygKKyAgICAgIEZYX0FsbG9jMkQoRlhfRFdPUkQsIEdTVywgR1NIKSk7CisgIEpCSUcyX21lbXNldChHU1ZBTFMuZ2V0KCksIDAsIHNpemVvZihGWF9EV09SRCkgKiBHU1cgKiBHU0gpOworICBmb3IgKEZYX0RXT1JEIHkgPSAwOyB5IDwgR1NIOyArK3kpIHsKKyAgICBmb3IgKEZYX0RXT1JEIHggPSAwOyB4IDwgR1NXOyArK3gpIHsKKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IEdTQlBQOyArK2kpIHsKKyAgICAgICAgR1NWQUxTLmdldCgpW3kgKiBHU1cgKyB4XSB8PSBHU1BMQU5FUy5nZXQoaSktPmdldFBpeGVsKHgsIHkpIDw8IGk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBHU1ZBTFMucmVsZWFzZSgpOworfQorCitGWF9EV09SRCogQ0pCaWcyX0dTSURQcm9jOjpkZWNvZGVfTU1SKENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfR1JEUHJvYz4gcEdSRChuZXcgQ0pCaWcyX0dSRFByb2MoKSk7CisgIHBHUkQtPk1NUiA9IEdTTU1SOworICBwR1JELT5HQlcgPSBHU1c7CisgIHBHUkQtPkdCSCA9IEdTSDsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlKj4gR1NQTEFORVMoRlhfQWxsb2MoQ0pCaWcyX0ltYWdlKiwgR1NCUFApKTsKKyAgSkJJRzJfbWVtc2V0KEdTUExBTkVTLmdldCgpLCAwLCBzaXplb2YoQ0pCaWcyX0ltYWdlKikgKiBHU0JQUCk7CisgIEZYQ09ERUNfU1RBVFVTIHN0YXR1cyA9CisgICAgICBwR1JELT5TdGFydF9kZWNvZGVfTU1SKCZHU1BMQU5FUy5nZXQoKVtHU0JQUCAtIDFdLCBwU3RyZWFtLCBudWxscHRyKTsKKyAgd2hpbGUgKHN0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7CisgICAgcEdSRC0+Q29udGludWVfZGVjb2RlKHBQYXVzZSk7CisgIH0KKyAgaWYgKCFHU1BMQU5FUy5nZXQoKVtHU0JQUCAtIDFdKQorICAgIHJldHVybiBudWxscHRyOworCisgIHBTdHJlYW0tPmFsaWduQnl0ZSgpOworICBwU3RyZWFtLT5vZmZzZXQoMyk7CisgIGludDMyX3QgSiA9IEdTQlBQIC0gMjsKKyAgd2hpbGUgKEogPj0gMCkgeworICAgIEZYQ09ERUNfU1RBVFVTIHN0YXR1cyA9CisgICAgICAgIHBHUkQtPlN0YXJ0X2RlY29kZV9NTVIoJkdTUExBTkVTLmdldCgpW0pdLCBwU3RyZWFtLCBudWxscHRyKTsKKyAgICB3aGlsZSAoc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsKKyAgICAgIHBHUkQtPkNvbnRpbnVlX2RlY29kZShwUGF1c2UpOworICAgIH0KKyAgICBpZiAoIUdTUExBTkVTLmdldCgpW0pdKSB7CisgICAgICBmb3IgKGludDMyX3QgSyA9IEdTQlBQIC0gMTsgSyA+IEo7IC0tSykgeworICAgICAgICBkZWxldGUgR1NQTEFORVMuZ2V0KClbS107CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgfQorICAgIH0KKyAgICBwU3RyZWFtLT5hbGlnbkJ5dGUoKTsKKyAgICBwU3RyZWFtLT5vZmZzZXQoMyk7CisgICAgR1NQTEFORVMuZ2V0KClbSl0tPmNvbXBvc2VGcm9tKDAsIDAsIEdTUExBTkVTLmdldCgpW0ogKyAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJJRzJfQ09NUE9TRV9YT1IpOworICAgIEogPSBKIC0gMTsKKyAgfQorICBzdGQ6OnVuaXF1ZV9wdHI8RlhfRFdPUkQ+IEdTVkFMUyhGWF9BbGxvYzJEKEZYX0RXT1JELCBHU1csIEdTSCkpOworICBKQklHMl9tZW1zZXQoR1NWQUxTLmdldCgpLCAwLCBzaXplb2YoRlhfRFdPUkQpICogR1NXICogR1NIKTsKKyAgZm9yIChGWF9EV09SRCB5ID0gMDsgeSA8IEdTSDsgKyt5KSB7CisgICAgZm9yIChGWF9EV09SRCB4ID0gMDsgeCA8IEdTVzsgKyt4KSB7CisgICAgICBmb3IgKEogPSAwOyBKIDwgR1NCUFA7ICsrSikgeworICAgICAgICBHU1ZBTFMuZ2V0KClbeSAqIEdTVyArIHhdIHw9IEdTUExBTkVTLmdldCgpW0pdLT5nZXRQaXhlbCh4LCB5KSA8PCBKOworICAgICAgfQorICAgIH0KKyAgfQorICBmb3IgKEogPSAwOyBKIDwgR1NCUFA7ICsrSikgeworICAgIGRlbGV0ZSBHU1BMQU5FUy5nZXQoKVtKXTsKKyAgfQorICByZXR1cm4gR1NWQUxTLnJlbGVhc2UoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR3NpZFByb2MuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR3NpZFByb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmQxNmI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Hc2lkUHJvYy5oCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAyMDE1IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX1NSQ19GWENPREVDX0pCSUcyX0pCSUcyX0dTSURQUk9DX0hfCisjZGVmaW5lIENPUkVfU1JDX0ZYQ09ERUNfSkJJRzJfSkJJRzJfR1NJRFBST0NfSF8KKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaCIKKworY2xhc3MgQ0pCaWcyX0FyaXRoRGVjb2RlcjsKK2NsYXNzIENKQmlnMl9CaXRTdHJlYW07CitjbGFzcyBDSkJpZzJfSW1hZ2U7CitjbGFzcyBJRlhfUGF1c2U7CitzdHJ1Y3QgSkJpZzJBcml0aEN0eDsKKworY2xhc3MgQ0pCaWcyX0dTSURQcm9jIHsKKyBwdWJsaWM6CisgIEZYX0RXT1JEKiBkZWNvZGVfQXJpdGgoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpOworCisgIEZYX0RXT1JEKiBkZWNvZGVfTU1SKENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0sIElGWF9QYXVzZSogcFBhdXNlKTsKKworIHB1YmxpYzoKKyAgRlhfQk9PTCBHU01NUjsKKyAgRlhfQk9PTCBHU1VTRVNLSVA7CisgIHVpbnQ4X3QgR1NCUFA7CisgIEZYX0RXT1JEIEdTVzsKKyAgRlhfRFdPUkQgR1NIOworICB1aW50OF90IEdTVEVNUExBVEU7CisgIENKQmlnMl9JbWFnZSogR1NLSVA7Cit9OworCisjZW5kaWYgIC8vIENPUkVfU1JDX0ZYQ09ERUNfSkJJRzJfSkJJRzJfR1NJRFBST0NfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHRyZFByb2MuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdHJkUHJvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc3YWY1OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHRyZFByb2MuY3BwCkBAIC0wLDAgKzEsMTA0IEBACisvLyBDb3B5cmlnaHQgMjAxNSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJKQmlnMl9IdHJkUHJvYy5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiSkJpZzJfR3NpZFByb2MuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKKworQ0pCaWcyX0ltYWdlKiBDSkJpZzJfSFRSRFByb2M6OmRlY29kZV9Bcml0aChDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIEZYX0RXT1JEIG5nLCBtZzsKKyAgaW50MzJfdCB4LCB5OworICBGWF9EV09SRCBIQlBQOworICBGWF9EV09SRCogR0k7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IEhTS0lQOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBIVFJFRyhuZXcgQ0pCaWcyX0ltYWdlKEhCVywgSEJIKSk7CisgIEhUUkVHLT5maWxsKEhERUZQSVhFTCk7CisgIGlmIChIRU5BQkxFU0tJUCA9PSAxKSB7CisgICAgSFNLSVAucmVzZXQobmV3IENKQmlnMl9JbWFnZShIR1csIEhHSCkpOworICAgIGZvciAobWcgPSAwOyBtZyA8IEhHSDsgbWcrKykgeworICAgICAgZm9yIChuZyA9IDA7IG5nIDwgSEdXOyBuZysrKSB7CisgICAgICAgIHggPSAoSEdYICsgbWcgKiBIUlkgKyBuZyAqIEhSWCkgPj4gODsKKyAgICAgICAgeSA9IChIR1kgKyBtZyAqIEhSWCAtIG5nICogSFJZKSA+PiA4OworICAgICAgICBpZiAoKHggKyBIUFcgPD0gMCkgfCAoeCA+PSAoaW50MzJfdClIQlcpIHwgKHkgKyBIUEggPD0gMCkgfAorICAgICAgICAgICAgKHkgPj0gKGludDMyX3QpSFBIKSkgeworICAgICAgICAgIEhTS0lQLT5zZXRQaXhlbChuZywgbWcsIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEhTS0lQLT5zZXRQaXhlbChuZywgbWcsIDApOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIEhCUFAgPSAxOworICB3aGlsZSAoKEZYX0RXT1JEKSgxIDw8IEhCUFApIDwgSE5VTVBBVFMpIHsKKyAgICBIQlBQKys7CisgIH0KKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9HU0lEUHJvYz4gcEdJRChuZXcgQ0pCaWcyX0dTSURQcm9jKCkpOworICBwR0lELT5HU01NUiA9IEhNTVI7CisgIHBHSUQtPkdTVyA9IEhHVzsKKyAgcEdJRC0+R1NIID0gSEdIOworICBwR0lELT5HU0JQUCA9ICh1aW50OF90KUhCUFA7CisgIHBHSUQtPkdTVVNFU0tJUCA9IEhFTkFCTEVTS0lQOworICBwR0lELT5HU0tJUCA9IEhTS0lQLmdldCgpOworICBwR0lELT5HU1RFTVBMQVRFID0gSFRFTVBMQVRFOworICBHSSA9IHBHSUQtPmRlY29kZV9Bcml0aChwQXJpdGhEZWNvZGVyLCBnYkNvbnRleHQsIHBQYXVzZSk7CisgIGlmICghR0kpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgZm9yIChtZyA9IDA7IG1nIDwgSEdIOyBtZysrKSB7CisgICAgZm9yIChuZyA9IDA7IG5nIDwgSEdXOyBuZysrKSB7CisgICAgICB4ID0gKEhHWCArIG1nICogSFJZICsgbmcgKiBIUlgpID4+IDg7CisgICAgICB5ID0gKEhHWSArIG1nICogSFJYIC0gbmcgKiBIUlkpID4+IDg7CisgICAgICBGWF9EV09SRCBwYXRfaW5kZXggPSBHSVttZyAqIEhHVyArIG5nXTsKKyAgICAgIGlmIChwYXRfaW5kZXggPj0gSE5VTVBBVFMpIHsKKyAgICAgICAgcGF0X2luZGV4ID0gSE5VTVBBVFMgLSAxOworICAgICAgfQorICAgICAgSFRSRUctPmNvbXBvc2VGcm9tKHgsIHksIEhQQVRTW3BhdF9pbmRleF0sIEhDT01CT1ApOworICAgIH0KKyAgfQorICBGWF9GcmVlKEdJKTsKKyAgcmV0dXJuIEhUUkVHLnJlbGVhc2UoKTsKK30KKworQ0pCaWcyX0ltYWdlKiBDSkJpZzJfSFRSRFByb2M6OmRlY29kZV9NTVIoQ0pCaWcyX0JpdFN0cmVhbSogcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgIEZYX0RXT1JEIG5nLCBtZzsKKyAgaW50MzJfdCB4LCB5OworICBGWF9EV09SRCogR0k7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IEhUUkVHKG5ldyBDSkJpZzJfSW1hZ2UoSEJXLCBIQkgpKTsKKyAgSFRSRUctPmZpbGwoSERFRlBJWEVMKTsKKyAgRlhfRFdPUkQgSEJQUCA9IDE7CisgIHdoaWxlICgoRlhfRFdPUkQpKDEgPDwgSEJQUCkgPCBITlVNUEFUUykgeworICAgIEhCUFArKzsKKyAgfQorICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0dTSURQcm9jPiBwR0lEKG5ldyBDSkJpZzJfR1NJRFByb2MoKSk7CisgIHBHSUQtPkdTTU1SID0gSE1NUjsKKyAgcEdJRC0+R1NXID0gSEdXOworICBwR0lELT5HU0ggPSBIR0g7CisgIHBHSUQtPkdTQlBQID0gKHVpbnQ4X3QpSEJQUDsKKyAgcEdJRC0+R1NVU0VTS0lQID0gMDsKKyAgR0kgPSBwR0lELT5kZWNvZGVfTU1SKHBTdHJlYW0sIHBQYXVzZSk7CisgIGlmICghR0kpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgZm9yIChtZyA9IDA7IG1nIDwgSEdIOyBtZysrKSB7CisgICAgZm9yIChuZyA9IDA7IG5nIDwgSEdXOyBuZysrKSB7CisgICAgICB4ID0gKEhHWCArIG1nICogSFJZICsgbmcgKiBIUlgpID4+IDg7CisgICAgICB5ID0gKEhHWSArIG1nICogSFJYIC0gbmcgKiBIUlkpID4+IDg7CisgICAgICBGWF9EV09SRCBwYXRfaW5kZXggPSBHSVttZyAqIEhHVyArIG5nXTsKKyAgICAgIGlmIChwYXRfaW5kZXggPj0gSE5VTVBBVFMpIHsKKyAgICAgICAgcGF0X2luZGV4ID0gSE5VTVBBVFMgLSAxOworICAgICAgfQorICAgICAgSFRSRUctPmNvbXBvc2VGcm9tKHgsIHksIEhQQVRTW3BhdF9pbmRleF0sIEhDT01CT1ApOworICAgIH0KKyAgfQorICBGWF9GcmVlKEdJKTsKKyAgcmV0dXJuIEhUUkVHLnJlbGVhc2UoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHRyZFByb2MuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHRyZFByb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGUwMzgwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdHJkUHJvYy5oCkBAIC0wLDAgKzEsNDcgQEAKKy8vIENvcHlyaWdodCAyMDE1IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX1NSQ19GWENPREVDX0pCSUcyX0pCSUcyX0hUUkRQUk9DX0hfCisjZGVmaW5lIENPUkVfU1JDX0ZYQ09ERUNfSkJJRzJfSkJJRzJfSFRSRFBST0NfSF8KKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaCIKKworI2luY2x1ZGUgIkpCaWcyX0ltYWdlLmgiCisKK2NsYXNzIENKQmlnMl9Bcml0aERlY29kZXI7CitjbGFzcyBDSkJpZzJfQml0U3RyZWFtOworY2xhc3MgSUZYX1BhdXNlOworc3RydWN0IEpCaWcyQXJpdGhDdHg7CisKK2NsYXNzIENKQmlnMl9IVFJEUHJvYyB7CisgcHVibGljOgorICBDSkJpZzJfSW1hZ2UqIGRlY29kZV9Bcml0aChDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKTsKKworICBDSkJpZzJfSW1hZ2UqIGRlY29kZV9NTVIoQ0pCaWcyX0JpdFN0cmVhbSogcFN0cmVhbSwgSUZYX1BhdXNlKiBwUGF1c2UpOworCisgcHVibGljOgorICBGWF9EV09SRCBIQlc7CisgIEZYX0RXT1JEIEhCSDsKKyAgRlhfQk9PTCBITU1SOworICB1aW50OF90IEhURU1QTEFURTsKKyAgRlhfRFdPUkQgSE5VTVBBVFM7CisgIENKQmlnMl9JbWFnZSoqIEhQQVRTOworICBGWF9CT09MIEhERUZQSVhFTDsKKyAgSkJpZzJDb21wb3NlT3AgSENPTUJPUDsKKyAgRlhfQk9PTCBIRU5BQkxFU0tJUDsKKyAgRlhfRFdPUkQgSEdXOworICBGWF9EV09SRCBIR0g7CisgIGludDMyX3QgSEdYOworICBpbnQzMl90IEhHWTsKKyAgRlhfV09SRCBIUlg7CisgIEZYX1dPUkQgSFJZOworICB1aW50OF90IEhQVzsKKyAgdWludDhfdCBIUEg7Cit9OworCisjZW5kaWYgIC8vIENPUkVfU1JDX0ZYQ09ERUNfSkJJRzJfSkJJRzJfSFRSRFBST0NfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hbkRlY29kZXIuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuRGVjb2Rlci5jcHAKaW5kZXggZGQ4MjBhZS4uNGNiZWNkMCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuRGVjb2Rlci5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuRGVjb2Rlci5jcHAKQEAgLTEsNTUgKzEsNDYgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2luY2x1ZGUgIkpCaWcyX0h1ZmZtYW5EZWNvZGVyLmgiCi1DSkJpZzJfSHVmZm1hbkRlY29kZXI6OkNKQmlnMl9IdWZmbWFuRGVjb2RlcihDSkJpZzJfQml0U3RyZWFtICpwU3RyZWFtKQotewotICAgIG1fcFN0cmVhbSA9IHBTdHJlYW07CisKKyNpbmNsdWRlICJKQmlnMl9EZWZpbmUuaCIKKworQ0pCaWcyX0h1ZmZtYW5EZWNvZGVyOjpDSkJpZzJfSHVmZm1hbkRlY29kZXIoQ0pCaWcyX0JpdFN0cmVhbSogcFN0cmVhbSkKKyAgICA6IG1fcFN0cmVhbShwU3RyZWFtKSB7CiB9Ci1DSkJpZzJfSHVmZm1hbkRlY29kZXI6On5DSkJpZzJfSHVmZm1hbkRlY29kZXIoKQotewotfQotaW50IENKQmlnMl9IdWZmbWFuRGVjb2Rlcjo6ZGVjb2RlQVZhbHVlKENKQmlnMl9IdWZmbWFuVGFibGUgKnBUYWJsZSwgaW50ICpuUmVzdWx0KQotewotICAgIGludCBuVmFsLCBuVG1wLCBpLCBuQml0czsKLSAgICBuVmFsID0gMDsKLSAgICBuQml0cyA9IDA7Ci0gICAgd2hpbGUoMSkgewotICAgICAgICBpZihtX3BTdHJlYW0tPnJlYWQxQml0KCZuVG1wKSA9PSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIG5WYWwgPSAoblZhbCA8PCAxKSB8IG5UbXA7Ci0gICAgICAgIG5CaXRzICsrOwotICAgICAgICBmb3IoaSA9IDA7IGkgPCBwVGFibGUtPk5URU1QOyBpKyspIHsKLSAgICAgICAgICAgIGlmKChwVGFibGUtPlBSRUZMRU5baV0gPT0gbkJpdHMpICYmIChwVGFibGUtPkNPREVTW2ldID09IG5WYWwpKSB7Ci0gICAgICAgICAgICAgICAgaWYoKHBUYWJsZS0+SFRPT0IgPT0gMSkgJiYgKGkgPT0gcFRhYmxlLT5OVEVNUCAtIDEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBKQklHMl9PT0I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKG1fcFN0cmVhbS0+cmVhZE5CaXRzKHBUYWJsZS0+UkFOR0VMRU5baV0sICZuVG1wKSA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHBUYWJsZS0+SFRPT0IpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoaSA9PSBwVGFibGUtPk5URU1QIC0gMykgewotICAgICAgICAgICAgICAgICAgICAgICAgKm5SZXN1bHQgPSBwVGFibGUtPlJBTkdFTE9XW2ldIC0gblRtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgKm5SZXN1bHQgPSBwVGFibGUtPlJBTkdFTE9XW2ldICsgblRtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoaSA9PSBwVGFibGUtPk5URU1QIC0gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgKm5SZXN1bHQgPSBwVGFibGUtPlJBTkdFTE9XW2ldIC0gblRtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgKm5SZXN1bHQgPSBwVGFibGUtPlJBTkdFTE9XW2ldICsgblRtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisKK0NKQmlnMl9IdWZmbWFuRGVjb2Rlcjo6fkNKQmlnMl9IdWZmbWFuRGVjb2RlcigpIHt9CisKK2ludCBDSkJpZzJfSHVmZm1hbkRlY29kZXI6OmRlY29kZUFWYWx1ZShDSkJpZzJfSHVmZm1hblRhYmxlKiBwVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBuUmVzdWx0KSB7CisgIGludCBuVmFsID0gMDsKKyAgaW50IG5CaXRzID0gMDsKKyAgd2hpbGUgKDEpIHsKKyAgICBGWF9EV09SRCBuVG1wOworICAgIGlmIChtX3BTdHJlYW0tPnJlYWQxQml0KCZuVG1wKSA9PSAtMSkKKyAgICAgIGJyZWFrOworCisgICAgblZhbCA9IChuVmFsIDw8IDEpIHwgblRtcDsKKyAgICArK25CaXRzOworICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwVGFibGUtPlNpemUoKTsgKytpKSB7CisgICAgICBpZiAocFRhYmxlLT5HZXRQUkVGTEVOKClbaV0gPT0gbkJpdHMgJiYgcFRhYmxlLT5HZXRDT0RFUygpW2ldID09IG5WYWwpIHsKKyAgICAgICAgaWYgKHBUYWJsZS0+SXNIVE9PQigpICYmIGkgPT0gcFRhYmxlLT5TaXplKCkgLSAxKQorICAgICAgICAgIHJldHVybiBKQklHMl9PT0I7CisKKyAgICAgICAgaWYgKG1fcFN0cmVhbS0+cmVhZE5CaXRzKHBUYWJsZS0+R2V0UkFOR0VMRU4oKVtpXSwgJm5UbXApID09IC0xKQorICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBGWF9EV09SRCBvZmZzZXQgPSBwVGFibGUtPklzSFRPT0IoKSA/IDMgOiAyOworICAgICAgICBpZiAoaSA9PSBwVGFibGUtPlNpemUoKSAtIG9mZnNldCkKKyAgICAgICAgICAqblJlc3VsdCA9IHBUYWJsZS0+R2V0UkFOR0VMT1coKVtpXSAtIG5UbXA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAqblJlc3VsdCA9IHBUYWJsZS0+R2V0UkFOR0VMT1coKVtpXSArIG5UbXA7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gLTI7CisgIH0KKyAgcmV0dXJuIC0xOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuRGVjb2Rlci5oIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuRGVjb2Rlci5oCmluZGV4IDYwZWMyOTAuLmUxNWU4OTEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hbkRlY29kZXIuaAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5EZWNvZGVyLmgKQEAgLTEsMjQgKzEsMjIgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBfSkJJRzJfSFVGRk1BTl9ERUNPREVSX0hfCiAjZGVmaW5lIF9KQklHMl9IVUZGTUFOX0RFQ09ERVJfSF8KICNpbmNsdWRlICJKQmlnMl9CaXRTdHJlYW0uaCIKICNpbmNsdWRlICJKQmlnMl9IdWZmbWFuVGFibGUuaCIKLWNsYXNzIENKQmlnMl9IdWZmbWFuRGVjb2RlciA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0Ci17Ci1wdWJsaWM6CitjbGFzcyBDSkJpZzJfSHVmZm1hbkRlY29kZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pCaWcyX0h1ZmZtYW5EZWNvZGVyKENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0pOwogCi0gICAgQ0pCaWcyX0h1ZmZtYW5EZWNvZGVyKENKQmlnMl9CaXRTdHJlYW0gKnBTdHJlYW0pOworICB+Q0pCaWcyX0h1ZmZtYW5EZWNvZGVyKCk7CiAKLSAgICB+Q0pCaWcyX0h1ZmZtYW5EZWNvZGVyKCk7CisgIGludCBkZWNvZGVBVmFsdWUoQ0pCaWcyX0h1ZmZtYW5UYWJsZSogcFRhYmxlLCBpbnQqIG5SZXN1bHQpOwogCi0gICAgaW50IGRlY29kZUFWYWx1ZShDSkJpZzJfSHVmZm1hblRhYmxlICpwVGFibGUsIGludCAqblJlc3VsdCk7Ci1wcml2YXRlOgotCi0gICAgQ0pCaWcyX0JpdFN0cmVhbSAqbV9wU3RyZWFtOworIHByaXZhdGU6CisgIENKQmlnMl9CaXRTdHJlYW0qIGNvbnN0IG1fcFN0cmVhbTsKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlLmNwcAppbmRleCAwNjE2MTIzLi41ODMzZjExIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5UYWJsZS5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGUuY3BwCkBAIC0xLDE5NCArMSwxMzcgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIkpCaWcyX0h1ZmZtYW5UYWJsZS5oIgotI2luY2x1ZGUgIkpCaWcyX0JpdFN0cmVhbS5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlLmgiCiAKLUNKQmlnMl9IdWZmbWFuVGFibGU6OkNKQmlnMl9IdWZmbWFuVGFibGUoY29uc3QgSkJpZzJUYWJsZUxpbmUgKnBUYWJsZSwgaW50IG5MaW5lcywKLSAgICAgICAgRlhfQk9PTCBiSFRPT0IpCi17Ci0gICAgaW5pdCgpOwotICAgIG1fYk9LID0gcGFyc2VGcm9tU3RhbmRhcmRUYWJsZShwVGFibGUsIG5MaW5lcywgYkhUT09CKTsKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X21lbW9yeS5oIgorI2luY2x1ZGUgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQml0U3RyZWFtLmgiCisjaW5jbHVkZSAiY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9EZWZpbmUuaCIKKyNpbmNsdWRlICJjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5UYWJsZV9TdGFuZGFyZC5oIgorCitDSkJpZzJfSHVmZm1hblRhYmxlOjpDSkJpZzJfSHVmZm1hblRhYmxlKGNvbnN0IEpCaWcyVGFibGVMaW5lKiBwVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5MaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSFRPT0IpCisgICAgOiBtX2JPSyh0cnVlKSwgSFRPT0IoYkhUT09CKSwgTlRFTVAobkxpbmVzKSB7CisgIFBhcnNlRnJvbVN0YW5kYXJkVGFibGUocFRhYmxlKTsKIH0KIAotQ0pCaWcyX0h1ZmZtYW5UYWJsZTo6Q0pCaWcyX0h1ZmZtYW5UYWJsZShDSkJpZzJfQml0U3RyZWFtICpwU3RyZWFtKQotewotICAgIGluaXQoKTsKLSAgICBtX2JPSyA9IHBhcnNlRnJvbUNvZGVkQnVmZmVyKHBTdHJlYW0pOworQ0pCaWcyX0h1ZmZtYW5UYWJsZTo6Q0pCaWcyX0h1ZmZtYW5UYWJsZShDSkJpZzJfQml0U3RyZWFtKiBwU3RyZWFtKQorICAgIDogSFRPT0IoZmFsc2UpLCBOVEVNUCgwKSB7CisgIG1fYk9LID0gUGFyc2VGcm9tQ29kZWRCdWZmZXIocFN0cmVhbSk7CiB9CiAKLUNKQmlnMl9IdWZmbWFuVGFibGU6On5DSkJpZzJfSHVmZm1hblRhYmxlKCkKLXsKLSAgICBpZihDT0RFUykgewotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoQ09ERVMpOwotICAgIH0KLSAgICBpZihQUkVGTEVOKSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShQUkVGTEVOKTsKLSAgICB9Ci0gICAgaWYoUkFOR0VMRU4pIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKFJBTkdFTEVOKTsKLSAgICB9Ci0gICAgaWYoUkFOR0VMT1cpIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKFJBTkdFTE9XKTsKLSAgICB9Ci19Ci12b2lkIENKQmlnMl9IdWZmbWFuVGFibGU6OmluaXQoKQotewotICAgIEhUT09CID0gRkFMU0U7Ci0gICAgTlRFTVAgPSAwOwotICAgIENPREVTID0gTlVMTDsKLSAgICBQUkVGTEVOID0gTlVMTDsKLSAgICBSQU5HRUxFTiA9IE5VTEw7Ci0gICAgUkFOR0VMT1cgPSBOVUxMOwotfQotaW50IENKQmlnMl9IdWZmbWFuVGFibGU6OnBhcnNlRnJvbVN0YW5kYXJkVGFibGUoY29uc3QgSkJpZzJUYWJsZUxpbmUgKnBUYWJsZSwgaW50IG5MaW5lcywgRlhfQk9PTCBiSFRPT0IpCi17Ci0gICAgaW50IENVUkxFTiwgTEVOTUFYLCBDVVJDT0RFLCBDVVJURU1QLCBpOwotICAgIGludCAqTEVOQ09VTlQ7Ci0gICAgaW50ICpGSVJTVENPREU7Ci0gICAgSFRPT0IgPSBiSFRPT0I7Ci0gICAgTlRFTVAgPSBuTGluZXM7Ci0gICAgQ09ERVMgPSAoaW50KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKGludCksIE5URU1QKTsKLSAgICBQUkVGTEVOID0gKGludCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihpbnQpLCBOVEVNUCk7Ci0gICAgUkFOR0VMRU4gPSAoaW50KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKGludCksIE5URU1QKTsKLSAgICBSQU5HRUxPVyA9IChpbnQqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoaW50KSwgTlRFTVApOwotICAgIExFTk1BWCA9IDA7Ci0gICAgZm9yKGkgPSAwOyBpIDwgTlRFTVA7IGkrKykgewotICAgICAgICBQUkVGTEVOW2ldID0gcFRhYmxlW2ldLlBSRUZMRU47Ci0gICAgICAgIFJBTkdFTEVOW2ldID0gcFRhYmxlW2ldLlJBTkRFTEVOOwotICAgICAgICBSQU5HRUxPV1tpXSA9IHBUYWJsZVtpXS5SQU5HRUxPVzsKLSAgICAgICAgaWYoUFJFRkxFTltpXSA+IExFTk1BWCkgewotICAgICAgICAgICAgTEVOTUFYID0gUFJFRkxFTltpXTsKLSAgICAgICAgfQotICAgIH0KLSAgICBMRU5DT1VOVCA9IChpbnQqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoaW50KSwgKExFTk1BWCArIDEpKTsKLSAgICBKQklHMl9tZW1zZXQoTEVOQ09VTlQsIDAsIHNpemVvZihpbnQpICogKExFTk1BWCArIDEpKTsKLSAgICBGSVJTVENPREUgPSAoaW50KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKGludCksIChMRU5NQVggKyAxKSk7Ci0gICAgZm9yKGkgPSAwOyBpIDwgTlRFTVA7IGkrKykgewotICAgICAgICBMRU5DT1VOVFtQUkVGTEVOW2ldXSArKzsKLSAgICB9Ci0gICAgQ1VSTEVOID0gMTsKLSAgICBGSVJTVENPREVbMF0gPSAwOwotICAgIExFTkNPVU5UWzBdICA9IDA7Ci0gICAgd2hpbGUoQ1VSTEVOIDw9IExFTk1BWCkgewotICAgICAgICBGSVJTVENPREVbQ1VSTEVOXSA9IChGSVJTVENPREVbQ1VSTEVOIC0gMV0gKyBMRU5DT1VOVFtDVVJMRU4gLSAxXSkgPDwgMTsKLSAgICAgICAgQ1VSQ09ERSA9IEZJUlNUQ09ERVtDVVJMRU5dOwotICAgICAgICBDVVJURU1QID0gMDsKLSAgICAgICAgd2hpbGUoQ1VSVEVNUCA8IE5URU1QKSB7Ci0gICAgICAgICAgICBpZihQUkVGTEVOW0NVUlRFTVBdID09IENVUkxFTikgewotICAgICAgICAgICAgICAgIENPREVTW0NVUlRFTVBdID0gQ1VSQ09ERTsKLSAgICAgICAgICAgICAgICBDVVJDT0RFID0gQ1VSQ09ERSArIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDVVJURU1QID0gQ1VSVEVNUCArIDE7Ci0gICAgICAgIH0KLSAgICAgICAgQ1VSTEVOID0gQ1VSTEVOICsgMTsKLSAgICB9Ci0gICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKExFTkNPVU5UKTsKLSAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoRklSU1RDT0RFKTsKLSAgICByZXR1cm4gMTsKK0NKQmlnMl9IdWZmbWFuVGFibGU6On5DSkJpZzJfSHVmZm1hblRhYmxlKCkgewogfQogCi0jZGVmaW5lIEhUX0NIRUNLX01FTU9SWV9BREpVU1QJCQlcCi0gICAgaWYoTlRFTVAgPj0gblNpemUpCVwKLSAgICB7CVwKLSAgICAgICAgblNpemUgKz0gMTY7CVwKLSAgICAgICAgUFJFRkxFTiAgPSAoaW50KiltX3BNb2R1bGUtPkpCaWcyX1JlYWxsb2MoUFJFRkxFTixzaXplb2YoaW50KSpuU2l6ZSk7CVwKLSAgICAgICAgUkFOR0VMRU4gPSAoaW50KiltX3BNb2R1bGUtPkpCaWcyX1JlYWxsb2MoUkFOR0VMRU4sc2l6ZW9mKGludCkqblNpemUpOwlcCi0gICAgICAgIFJBTkdFTE9XID0gKGludCopbV9wTW9kdWxlLT5KQmlnMl9SZWFsbG9jKFJBTkdFTE9XLHNpemVvZihpbnQpKm5TaXplKTsJXAordm9pZCBDSkJpZzJfSHVmZm1hblRhYmxlOjpQYXJzZUZyb21TdGFuZGFyZFRhYmxlKGNvbnN0IEpCaWcyVGFibGVMaW5lKiBwVGFibGUpIHsKKyAgUFJFRkxFTi5yZXNpemUoTlRFTVApOworICBSQU5HRUxFTi5yZXNpemUoTlRFTVApOworICBSQU5HRUxPVy5yZXNpemUoTlRFTVApOworICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgTlRFTVA7ICsraSkgeworICAgIFBSRUZMRU5baV0gPSBwVGFibGVbaV0uUFJFRkxFTjsKKyAgICBSQU5HRUxFTltpXSA9IHBUYWJsZVtpXS5SQU5ERUxFTjsKKyAgICBSQU5HRUxPV1tpXSA9IHBUYWJsZVtpXS5SQU5HRUxPVzsKKyAgfQorICBJbml0Q29kZXMoKTsKK30KKworYm9vbCBDSkJpZzJfSHVmZm1hblRhYmxlOjpQYXJzZUZyb21Db2RlZEJ1ZmZlcihDSkJpZzJfQml0U3RyZWFtKiBwU3RyZWFtKSB7CisgIHVuc2lnbmVkIGNoYXIgY1RlbXA7CisgIGlmIChwU3RyZWFtLT5yZWFkMUJ5dGUoJmNUZW1wKSA9PSAtMSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgSFRPT0IgPSAhIShjVGVtcCAmIDB4MDEpOworICB1bnNpZ25lZCBjaGFyIEhUUFMgPSAoKGNUZW1wID4+IDEpICYgMHgwNykgKyAxOworICB1bnNpZ25lZCBjaGFyIEhUUlMgPSAoKGNUZW1wID4+IDQpICYgMHgwNykgKyAxOworICBGWF9EV09SRCBIVExPVzsKKyAgRlhfRFdPUkQgSFRISUdIOworICBpZiAocFN0cmVhbS0+cmVhZEludGVnZXIoJkhUTE9XKSA9PSAtMSB8fAorICAgICAgcFN0cmVhbS0+cmVhZEludGVnZXIoJkhUSElHSCkgPT0gLTEpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBjb25zdCBpbnQgbG93ID0gc3RhdGljX2Nhc3Q8aW50PihIVExPVyk7CisgIGNvbnN0IGludCBoaWdoID0gc3RhdGljX2Nhc3Q8aW50PihIVEhJR0gpOworICBpZiAobG93ID4gaGlnaCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgRXh0ZW5kQnVmZmVycyhmYWxzZSk7CisgIGludCBjdXJfbG93ID0gbG93OworICBkbyB7CisgICAgaWYgKChwU3RyZWFtLT5yZWFkTkJpdHMoSFRQUywgJlBSRUZMRU5bTlRFTVBdKSA9PSAtMSkgfHwKKyAgICAgICAgKHBTdHJlYW0tPnJlYWROQml0cyhIVFJTLCAmUkFOR0VMRU5bTlRFTVBdKSA9PSAtMSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci1pbnQgQ0pCaWcyX0h1ZmZtYW5UYWJsZTo6cGFyc2VGcm9tQ29kZWRCdWZmZXIoQ0pCaWcyX0JpdFN0cmVhbSAqcFN0cmVhbSkKLXsKLSAgICB1bnNpZ25lZCBjaGFyIEhUUFMsIEhUUlM7Ci0gICAgRlhfRFdPUkQgSFRMT1csIEhUSElHSDsKLSAgICBGWF9EV09SRCBDVVJSQU5HRUxPVzsKLSAgICBGWF9EV09SRCBuU2l6ZSA9IDE2OwotICAgIGludCBDVVJMRU4sIExFTk1BWCwgQ1VSQ09ERSwgQ1VSVEVNUDsKLSAgICBpbnQgKkxFTkNPVU5UOwotICAgIGludCAqRklSU1RDT0RFOwotICAgIHVuc2lnbmVkIGNoYXIgY1RlbXA7Ci0gICAgaWYocFN0cmVhbS0+cmVhZDFCeXRlKCZjVGVtcCkgPT0gLTEpIHsKLSAgICAgICAgZ290byBmYWlsZWQ7CisgICAgUkFOR0VMT1dbTlRFTVBdID0gY3VyX2xvdzsKKyAgICBjdXJfbG93ICs9ICgxIDw8IFJBTkdFTEVOW05URU1QXSk7CisgICAgRXh0ZW5kQnVmZmVycyh0cnVlKTsKKyAgfSB3aGlsZSAoY3VyX2xvdyA8IGhpZ2gpOworCisgIGlmIChwU3RyZWFtLT5yZWFkTkJpdHMoSFRQUywgJlBSRUZMRU5bTlRFTVBdKSA9PSAtMSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgUkFOR0VMRU5bTlRFTVBdID0gMzI7CisgIFJBTkdFTE9XW05URU1QXSA9IGxvdyAtIDE7CisgIEV4dGVuZEJ1ZmZlcnModHJ1ZSk7CisKKyAgaWYgKHBTdHJlYW0tPnJlYWROQml0cyhIVFBTLCAmUFJFRkxFTltOVEVNUF0pID09IC0xKQorICAgIHJldHVybiBmYWxzZTsKKworICBSQU5HRUxFTltOVEVNUF0gPSAzMjsKKyAgUkFOR0VMT1dbTlRFTVBdID0gaGlnaDsKKyAgRXh0ZW5kQnVmZmVycyh0cnVlKTsKKworICBpZiAoSFRPT0IpIHsKKyAgICBpZiAocFN0cmVhbS0+cmVhZE5CaXRzKEhUUFMsICZQUkVGTEVOW05URU1QXSkgPT0gLTEpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICArK05URU1QOworICB9CisKKyAgSW5pdENvZGVzKCk7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENKQmlnMl9IdWZmbWFuVGFibGU6OkluaXRDb2RlcygpIHsKKyAgaW50IGxlbm1heCA9IDA7CisgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBOVEVNUDsgKytpKQorICAgIGxlbm1heCA9IHN0ZDo6bWF4KFBSRUZMRU5baV0sIGxlbm1heCk7CisKKyAgQ09ERVMucmVzaXplKE5URU1QKTsKKyAgc3RkOjp2ZWN0b3I8aW50PiBMRU5DT1VOVChsZW5tYXggKyAxKTsKKyAgc3RkOjp2ZWN0b3I8aW50PiBGSVJTVENPREUobGVubWF4ICsgMSk7CisgIGZvciAoaW50IGxlbiA6IFBSRUZMRU4pCisgICAgKytMRU5DT1VOVFtsZW5dOworCisgIEZJUlNUQ09ERVswXSA9IDA7CisgIExFTkNPVU5UWzBdID0gMDsKKyAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbGVubWF4OyArK2kpIHsKKyAgICBGSVJTVENPREVbaV0gPSAoRklSU1RDT0RFW2kgLSAxXSArIExFTkNPVU5UW2kgLSAxXSkgPDwgMTsKKyAgICBpbnQgQ1VSQ09ERSA9IEZJUlNUQ09ERVtpXTsKKyAgICBmb3IgKEZYX0RXT1JEIGogPSAwOyBqIDwgTlRFTVA7ICsraikgeworICAgICAgaWYgKFBSRUZMRU5bal0gPT0gaSkKKyAgICAgICAgQ09ERVNbal0gPSBDVVJDT0RFKys7CiAgICAgfQotICAgIEhUT09CID0gY1RlbXAgJiAweDAxOwotICAgIEhUUFMgID0gKChjVGVtcCA+PiAxKSAmIDB4MDcpICsgMTsKLSAgICBIVFJTICA9ICgoY1RlbXAgPj4gNCkgJiAweDA3KSArIDE7Ci0gICAgaWYocFN0cmVhbS0+cmVhZEludGVnZXIoJkhUTE9XKSA9PSAtMSAgfHwKLSAgICAgICBwU3RyZWFtLT5yZWFkSW50ZWdlcigmSFRISUdIKSA9PSAtMSB8fAotICAgICAgIEhUTE9XID4gSFRISUdIKSB7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLSAgICBQUkVGTEVOICA9IChpbnQqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihzaXplb2YoaW50KSwgblNpemUpOwotICAgIFJBTkdFTEVOID0gKGludCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihpbnQpLCBuU2l6ZSk7Ci0gICAgUkFOR0VMT1cgPSAoaW50KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKGludCksIG5TaXplKTsKLSAgICBDVVJSQU5HRUxPVyA9IEhUTE9XOwotICAgIE5URU1QID0gMDsKLSAgICBkbyB7Ci0gICAgICAgIEhUX0NIRUNLX01FTU9SWV9BREpVU1QKLSAgICAgICAgaWYoKHBTdHJlYW0tPnJlYWROQml0cyhIVFBTLCAmUFJFRkxFTltOVEVNUF0pID09IC0xKSB8fAotICAgICAgICAgICAocFN0cmVhbS0+cmVhZE5CaXRzKEhUUlMsICZSQU5HRUxFTltOVEVNUF0pID09IC0xKSkgewotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgUkFOR0VMT1dbTlRFTVBdID0gQ1VSUkFOR0VMT1c7Ci0gICAgICAgIENVUlJBTkdFTE9XID0gQ1VSUkFOR0VMT1cgKyAoMSA8PCBSQU5HRUxFTltOVEVNUF0pOwotICAgICAgICBOVEVNUCA9IE5URU1QICsgMTsKLSAgICB9IHdoaWxlKENVUlJBTkdFTE9XIDwgSFRISUdIKTsKLSAgICBIVF9DSEVDS19NRU1PUllfQURKVVNUCi0gICAgaWYocFN0cmVhbS0+cmVhZE5CaXRzKEhUUFMsICZQUkVGTEVOW05URU1QXSkgPT0gLTEpIHsKLSAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgIFJBTkdFTEVOW05URU1QXSA9IDMyOwotICAgIFJBTkdFTE9XW05URU1QXSA9IEhUTE9XIC0gMTsKLSAgICBOVEVNUCA9IE5URU1QICsgMTsKLSAgICBIVF9DSEVDS19NRU1PUllfQURKVVNUCi0gICAgaWYocFN0cmVhbS0+cmVhZE5CaXRzKEhUUFMsICZQUkVGTEVOW05URU1QXSkgPT0gLTEpIHsKLSAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgIFJBTkdFTEVOW05URU1QXSA9IDMyOwotICAgIFJBTkdFTE9XW05URU1QXSA9IEhUSElHSDsKLSAgICBOVEVNUCA9IE5URU1QICsgMTsKLSAgICBpZihIVE9PQikgewotICAgICAgICBIVF9DSEVDS19NRU1PUllfQURKVVNUCi0gICAgICAgIGlmKHBTdHJlYW0tPnJlYWROQml0cyhIVFBTLCAmUFJFRkxFTltOVEVNUF0pID09IC0xKSB7Ci0gICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotICAgICAgICBOVEVNUCA9IE5URU1QICsgMTsKLSAgICB9Ci0gICAgQ09ERVMgPSAoaW50KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKGludCksIE5URU1QKTsKLSAgICBMRU5NQVggPSAwOwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBOVEVNUDsgaSsrKSB7Ci0gICAgICAgIGlmKFBSRUZMRU5baV0gPiBMRU5NQVgpIHsKLSAgICAgICAgICAgIExFTk1BWCA9IFBSRUZMRU5baV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgTEVOQ09VTlQgPSAoaW50KiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKGludCksIChMRU5NQVggKyAxKSk7Ci0gICAgSkJJRzJfbWVtc2V0KExFTkNPVU5ULCAwLCBzaXplb2YoaW50KSAqIChMRU5NQVggKyAxKSk7Ci0gICAgRklSU1RDT0RFID0gKGludCopbV9wTW9kdWxlLT5KQmlnMl9NYWxsb2MyKHNpemVvZihpbnQpLCAoTEVOTUFYICsgMSkpOwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBOVEVNUDsgaSsrKSB7Ci0gICAgICAgIExFTkNPVU5UW1BSRUZMRU5baV1dICsrOwotICAgIH0KLSAgICBDVVJMRU4gPSAxOwotICAgIEZJUlNUQ09ERVswXSA9IDA7Ci0gICAgTEVOQ09VTlRbMF0gID0gMDsKLSAgICB3aGlsZShDVVJMRU4gPD0gTEVOTUFYKSB7Ci0gICAgICAgIEZJUlNUQ09ERVtDVVJMRU5dID0gKEZJUlNUQ09ERVtDVVJMRU4gLSAxXSArIExFTkNPVU5UW0NVUkxFTiAtIDFdKSA8PCAxOwotICAgICAgICBDVVJDT0RFID0gRklSU1RDT0RFW0NVUkxFTl07Ci0gICAgICAgIENVUlRFTVAgPSAwOwotICAgICAgICB3aGlsZShDVVJURU1QIDwgTlRFTVApIHsKLSAgICAgICAgICAgIGlmKFBSRUZMRU5bQ1VSVEVNUF0gPT0gQ1VSTEVOKSB7Ci0gICAgICAgICAgICAgICAgQ09ERVNbQ1VSVEVNUF0gPSBDVVJDT0RFOwotICAgICAgICAgICAgICAgIENVUkNPREUgPSBDVVJDT0RFICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENVUlRFTVAgPSBDVVJURU1QICsgMTsKLSAgICAgICAgfQotICAgICAgICBDVVJMRU4gPSBDVVJMRU4gKyAxOwotICAgIH0KLSAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoTEVOQ09VTlQpOwotICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShGSVJTVENPREUpOwotICAgIHJldHVybiBUUlVFOwotZmFpbGVkOgotICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCit2b2lkIENKQmlnMl9IdWZmbWFuVGFibGU6OkV4dGVuZEJ1ZmZlcnMoYm9vbCBpbmNyZW1lbnQpIHsKKyAgaWYgKGluY3JlbWVudCkKKyAgICArK05URU1QOworCisgIHNpemVfdCBzaXplID0gUFJFRkxFTi5zaXplKCk7CisgIGlmIChOVEVNUCA8IHNpemUpCisgICAgcmV0dXJuOworCisgIHNpemUgKz0gMTY7CisgIEFTU0VSVChOVEVNUCA8IHNpemUpOworICBQUkVGTEVOLnJlc2l6ZShzaXplKTsKKyAgUkFOR0VMRU4ucmVzaXplKHNpemUpOworICBSQU5HRUxPVy5yZXNpemUoc2l6ZSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5UYWJsZS5oIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGUuaAppbmRleCBkNjhjZWQyLi41NjhjNDk3IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5UYWJsZS5oCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlLmgKQEAgLTEsNDIgKzEsNTAgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2lmbmRlZiBfSkJJRzJfSFVGRk1BTl9UQUJMRV9IXwotI2RlZmluZSBfSkJJRzJfSFVGRk1BTl9UQUJMRV9IXwotI2luY2x1ZGUgIkpCaWcyX01vZHVsZS5oIgotI2luY2x1ZGUgIkpCaWcyX0h1ZmZtYW5UYWJsZV9TdGFuZGFyZC5oIgotI2luY2x1ZGUgIkpCaWcyX0JpdFN0cmVhbS5oIgotY2xhc3MgQ0pCaWcyX0h1ZmZtYW5UYWJsZSA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0Ci17Ci1wdWJsaWM6CisjaWZuZGVmIENPUkVfU1JDX0ZYQ09ERUNfSkJJRzJfSkJJRzJfSFVGRk1BTlRBQkxFX0hfCisjZGVmaW5lIENPUkVfU1JDX0ZYQ09ERUNfSkJJRzJfSkJJRzJfSFVGRk1BTlRBQkxFX0hfCiAKLSAgICBDSkJpZzJfSHVmZm1hblRhYmxlKGNvbnN0IEpCaWcyVGFibGVMaW5lICpwVGFibGUsIGludCBuTGluZXMsIEZYX0JPT0wgYkhUT09CKTsKKyNpbmNsdWRlIDx2ZWN0b3I+CiAKLSAgICBDSkJpZzJfSHVmZm1hblRhYmxlKENKQmlnMl9CaXRTdHJlYW0gKnBTdHJlYW0pOworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaCIKIAotICAgIH5DSkJpZzJfSHVmZm1hblRhYmxlKCk7CitjbGFzcyBDSkJpZzJfQml0U3RyZWFtOworc3RydWN0IEpCaWcyVGFibGVMaW5lOwogCi0gICAgdm9pZCBpbml0KCk7CitjbGFzcyBDSkJpZzJfSHVmZm1hblRhYmxlIHsKKyBwdWJsaWM6CisgIENKQmlnMl9IdWZmbWFuVGFibGUoY29uc3QgSkJpZzJUYWJsZUxpbmUqIHBUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuTGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSFRPT0IpOwogCi0gICAgaW50IHBhcnNlRnJvbVN0YW5kYXJkVGFibGUoY29uc3QgSkJpZzJUYWJsZUxpbmUgKnBUYWJsZSwgaW50IG5MaW5lcywgRlhfQk9PTCBiSFRPT0IpOworICBleHBsaWNpdCBDSkJpZzJfSHVmZm1hblRhYmxlKENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0pOwogCi0gICAgaW50IHBhcnNlRnJvbUNvZGVkQnVmZmVyKENKQmlnMl9CaXRTdHJlYW0gKnBTdHJlYW0pOworICB+Q0pCaWcyX0h1ZmZtYW5UYWJsZSgpOwogCi0gICAgRlhfQk9PTCBpc09LKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2JPSzsKLSAgICB9Ci1wcml2YXRlOgotICAgIEZYX0JPT0wgSFRPT0I7Ci0gICAgaW50IE5URU1QOwotICAgIGludCAqQ09ERVM7Ci0gICAgaW50ICpQUkVGTEVOOwotICAgIGludCAqUkFOR0VMRU47Ci0gICAgaW50ICpSQU5HRUxPVzsKLSAgICBGWF9CT09MIG1fYk9LOwotICAgIGZyaWVuZCBjbGFzcyBDSkJpZzJfSHVmZm1hbkRlY29kZXI7CisgIGJvb2wgSXNIVE9PQigpIGNvbnN0IHsgcmV0dXJuIEhUT09COyB9CisgIEZYX0RXT1JEIFNpemUoKSBjb25zdCB7IHJldHVybiBOVEVNUDsgfQorICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBHZXRDT0RFUygpIGNvbnN0IHsgcmV0dXJuIENPREVTOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIEdldFBSRUZMRU4oKSBjb25zdCB7IHJldHVybiBQUkVGTEVOOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIEdldFJBTkdFTEVOKCkgY29uc3QgeyByZXR1cm4gUkFOR0VMRU47IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgR2V0UkFOR0VMT1coKSBjb25zdCB7IHJldHVybiBSQU5HRUxPVzsgfQorICBib29sIElzT0soKSBjb25zdCB7IHJldHVybiBtX2JPSzsgfQorCisgcHJpdmF0ZToKKyAgdm9pZCBQYXJzZUZyb21TdGFuZGFyZFRhYmxlKGNvbnN0IEpCaWcyVGFibGVMaW5lKiBwVGFibGUpOworICBib29sIFBhcnNlRnJvbUNvZGVkQnVmZmVyKENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0pOworICB2b2lkIEluaXRDb2RlcygpOworICB2b2lkIEV4dGVuZEJ1ZmZlcnMoYm9vbCBpbmNyZW1lbnQpOworCisgIGJvb2wgbV9iT0s7CisgIGJvb2wgSFRPT0I7CisgIEZYX0RXT1JEIE5URU1QOworICBzdGQ6OnZlY3RvcjxpbnQ+IENPREVTOworICBzdGQ6OnZlY3RvcjxpbnQ+IFBSRUZMRU47CisgIHN0ZDo6dmVjdG9yPGludD4gUkFOR0VMRU47CisgIHN0ZDo6dmVjdG9yPGludD4gUkFOR0VMT1c7CiB9OwotI2VuZGlmCisKKyNlbmRpZiAgLy8gQ09SRV9TUkNfRlhDT0RFQ19KQklHMl9KQklHMl9IVUZGTUFOVEFCTEVfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlX1N0YW5kYXJkLmggYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5UYWJsZV9TdGFuZGFyZC5oCmluZGV4IDQyOGIyYzMuLmEyY2UyMzIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlX1N0YW5kYXJkLmgKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGVfU3RhbmRhcmQuaApAQCAtMSwyNTEgKzEsOTggQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2lmbmRlZiBfSkJJRzJfSFVGRk1BTl9UQUJMRV9TVEFOREFSRF9IXwotI2RlZmluZSBfSkJJRzJfSFVGRk1BTl9UQUJMRV9TVEFOREFSRF9IXwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCBQUkVGTEVOOwotICAgIGludCBSQU5ERUxFTjsKLSAgICBpbnQgUkFOR0VMT1c7Ci19IEpCaWcyVGFibGVMaW5lOwotY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjEgPSBGQUxTRTsKLWNvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CMVtdID0gewotICAgIHsgMSwJNCwJCTAgfSwKLSAgICB7IDIsCTgsCSAgIDE2IH0sCi0gICAgeyAzLCAgIDE2LAkgIDI3MiB9LAotICAgIHsgMCwgICAzMiwJICAgLTEgfSwKLSAgICB7IDMsICAgMzIsCTY1ODA4IH0KKyNpZm5kZWYgQ09SRV9TUkNfRlhDT0RFQ19KQklHMl9KQklHMl9IVUZGTUFOVEFCTEVfU1RBTkRBUkRfSF8KKyNkZWZpbmUgQ09SRV9TUkNfRlhDT0RFQ19KQklHMl9KQklHMl9IVUZGTUFOVEFCTEVfU1RBTkRBUkRfSF8KKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaCIKKworc3RydWN0IEpCaWcyVGFibGVMaW5lIHsKKyAgaW50IFBSRUZMRU47CisgIGludCBSQU5ERUxFTjsKKyAgaW50IFJBTkdFTE9XOwogfTsKLWNvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0IyID0gVFJVRTsKLWNvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CMltdID0gewotICAgIHsgMSwJMCwJCTAgfSwKLSAgICB7IDIsCTAsCQkxIH0sCi0gICAgeyAzLAkwLAkJMiB9LAotICAgIHsgNCwJMywJCTMgfSwKLSAgICB7IDUsCTYsCSAgIDExIH0sCi0gICAgeyAwLCAgIDMyLAkgICAtMSB9LAotICAgIHsgNiwgICAzMiwgICAgIDc1IH0sCi0gICAgeyA2LAkwLCAgICAgIDAgfQotfTsKLWNvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0IzID0gVFJVRTsKKworY29uc3QgYm9vbCBIdWZmbWFuVGFibGVfSFRPT0JfQjEgPSBmYWxzZTsKK2NvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CMVtdID0ge3sxLCA0LCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyLCA4LCAxNn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MywgMTYsIDI3Mn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMzIsIC0xfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszLCAzMiwgNjU4MDh9fTsKK2NvbnN0IGJvb2wgSHVmZm1hblRhYmxlX0hUT09CX0IyID0gdHJ1ZTsKK2NvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CMltdID0ge3sxLCAwLCAwfSwgICB7MiwgMCwgMX0sICB7MywgMCwgMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NCwgMywgM30sICAgezUsIDYsIDExfSwgezAsIDMyLCAtMX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NiwgMzIsIDc1fSwgezYsIDAsIDB9fTsKK2NvbnN0IGJvb2wgSHVmZm1hblRhYmxlX0hUT09CX0IzID0gdHJ1ZTsKIGNvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CM1tdID0gewotICAgIHsgOCwJOCwgICAtMjU2IH0sCi0gICAgeyAxLAkwLAkJMCB9LAotICAgIHsgMiwJMCwJCTEgfSwKLSAgICB7IDMsCTAsCQkyIH0sCi0gICAgeyA0LAkzLAkJMyB9LAotICAgIHsgNSwJNiwJICAgMTEgfSwKLSAgICB7IDgsICAgMzIsICAgLTI1NyB9LAotICAgIHsgNywgICAzMiwgICAgIDc1IH0sCi0gICAgeyA2LAkwLAkJMCB9Ci19OwotY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjQgPSBGQUxTRTsKKyAgICB7OCwgOCwgLTI1Nn0sIHsxLCAwLCAwfSwgICAgIHsyLCAwLCAxfSwgICB7MywgMCwgMn0sIHs0LCAzLCAzfSwKKyAgICB7NSwgNiwgMTF9LCAgIHs4LCAzMiwgLTI1N30sIHs3LCAzMiwgNzV9LCB7NiwgMCwgMH19OworY29uc3QgYm9vbCBIdWZmbWFuVGFibGVfSFRPT0JfQjQgPSBmYWxzZTsKIGNvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CNFtdID0gewotICAgIHsgMSwJMCwJCTEgfSwKLSAgICB7IDIsCTAsCQkyIH0sCi0gICAgeyAzLAkwLAkJMyB9LAotICAgIHsgNCwJMywJCTQgfSwKLSAgICB7IDUsCTYsCSAgIDEyIH0sCi0gICAgeyAwLCAgIDMyLCAgICAgLTEgfSwKLSAgICB7IDUsICAgMzIsCSAgIDc2IH0sCisgICAgezEsIDAsIDF9LCAgezIsIDAsIDJ9LCAgIHszLCAwLCAzfSwgICB7NCwgMywgNH0sCisgICAgezUsIDYsIDEyfSwgezAsIDMyLCAtMX0sIHs1LCAzMiwgNzZ9LAogfTsKLWNvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0I1ID0gRkFMU0U7Ci1jb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjVbXSA9IHsKLSAgICB7IDcsCTgsCSAtMjU1IH0sCi0gICAgeyAxLAkwLAkgICAgMSB9LAotICAgIHsgMiwJMCwJICAgIDIgfSwKLSAgICB7IDMsICAgIDAsICAgICAgMyB9LAotICAgIHsgNCwJMywJICAgIDQgfSwKLSAgICB7IDUsCTYsCSAgIDEyIH0sCi0gICAgeyA3LCAgIDMyLCAgIC0yNTYgfSwKLSAgICB7IDYsICAgMzIsICAgICA3NiB9Ci19OwotY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjYgPSBGQUxTRTsKK2NvbnN0IGJvb2wgSHVmZm1hblRhYmxlX0hUT09CX0I1ID0gZmFsc2U7Citjb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjVbXSA9IHt7NywgOCwgLTI1NX0sICB7MSwgMCwgMX0sICB7MiwgMCwgMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MywgMCwgM30sICAgICB7NCwgMywgNH0sICB7NSwgNiwgMTJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezcsIDMyLCAtMjU2fSwgezYsIDMyLCA3Nn19OworY29uc3QgYm9vbCBIdWZmbWFuVGFibGVfSFRPT0JfQjYgPSBmYWxzZTsKIGNvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CNltdID0gewotICAgIHsgNSwgICAxMCwJLTIwNDggfSwKLSAgICB7IDQsICAgIDksCS0xMDI0IH0sCi0gICAgeyA0LAk4LAkgLTUxMiB9LAotICAgIHsgNCwJNywJIC0yNTYgfSwKLSAgICB7IDUsCTYsCSAtMTI4IH0sCi0gICAgeyA1LAk1LAkgIC02NCB9LAotICAgIHsgNCwJNSwJICAtMzIgfSwKLSAgICB7IDIsCTcsCQkwIH0sCi0gICAgeyAzLAk3LAkgIDEyOCB9LAotICAgIHsgMywJOCwJICAyNTYgfSwKLSAgICB7IDQsCTksCSAgNTEyIH0sCi0gICAgeyA0LCAgIDEwLAkgMTAyNCB9LAotICAgIHsgNiwgICAzMiwJLTIwNDkgfSwKLSAgICB7IDYsICAgMzIsCSAyMDQ4IH0KLX07Ci1jb25zdCBGWF9CT09MIEh1ZmZtYW5UYWJsZV9IVE9PQl9CNyA9IEZBTFNFOworICAgIHs1LCAxMCwgLTIwNDh9LCB7NCwgOSwgLTEwMjR9LCB7NCwgOCwgLTUxMn0sICAgezQsIDcsIC0yNTZ9LCB7NSwgNiwgLTEyOH0sCisgICAgezUsIDUsIC02NH0sICAgIHs0LCA1LCAtMzJ9LCAgIHsyLCA3LCAwfSwgICAgICB7MywgNywgMTI4fSwgIHszLCA4LCAyNTZ9LAorICAgIHs0LCA5LCA1MTJ9LCAgICB7NCwgMTAsIDEwMjR9LCB7NiwgMzIsIC0yMDQ5fSwgezYsIDMyLCAyMDQ4fX07Citjb25zdCBib29sIEh1ZmZtYW5UYWJsZV9IVE9PQl9CNyA9IGZhbHNlOwogY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0I3W10gPSB7Ci0gICAgeyA0LAk5LAktMTAyNCB9LAotICAgIHsgMywJOCwJIC01MTIgfSwKLSAgICB7IDQsCTcsCSAtMjU2IH0sCi0gICAgeyA1LAk2LAkgLTEyOCB9LAotICAgIHsgNSwJNSwJICAtNjQgfSwKLSAgICB7IDQsCTUsCSAgLTMyIH0sCi0gICAgeyA0LAk1LAkJMCB9LAotICAgIHsgNSwJNSwJICAgMzIgfSwKLSAgICB7IDUsCTYsCSAgIDY0IH0sCi0gICAgeyA0LAk3LAkgIDEyOCB9LAotICAgIHsgMywJOCwJICAyNTYgfSwKLSAgICB7IDMsCTksCSAgNTEyIH0sCi0gICAgeyAzLCAgIDEwLAkgMTAyNCB9LAotICAgIHsgNSwgICAzMiwJLTEwMjUgfSwKLSAgICB7IDUsICAgMzIsCSAyMDQ4IH0sCisgICAgezQsIDksIC0xMDI0fSwgezMsIDgsIC01MTJ9LCB7NCwgNywgLTI1Nn0sICB7NSwgNiwgLTEyOH0sICAgezUsIDUsIC02NH0sCisgICAgezQsIDUsIC0zMn0sICAgezQsIDUsIDB9LCAgICB7NSwgNSwgMzJ9LCAgICB7NSwgNiwgNjR9LCAgICAgezQsIDcsIDEyOH0sCisgICAgezMsIDgsIDI1Nn0sICAgezMsIDksIDUxMn0sICB7MywgMTAsIDEwMjR9LCB7NSwgMzIsIC0xMDI1fSwgezUsIDMyLCAyMDQ4fSwKIH07Ci1jb25zdCBGWF9CT09MIEh1ZmZtYW5UYWJsZV9IVE9PQl9COCA9IFRSVUU7Citjb25zdCBib29sIEh1ZmZtYW5UYWJsZV9IVE9PQl9COCA9IHRydWU7CiBjb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjhbXSA9IHsKLSAgICB7IDgsCTMsCSAgLTE1IH0sCi0gICAgeyA5LAkxLAkgICAtNyB9LAotICAgIHsgOCwJMSwJICAgLTUgfSwKLSAgICB7IDksCTAsCSAgIC0zIH0sCi0gICAgeyA3LAkwLAkgICAtMiB9LAotICAgIHsgNCwJMCwJICAgLTEgfSwKLSAgICB7IDIsCTEsCQkwIH0sCi0gICAgeyA1LAkwLAkJMiB9LAotICAgIHsgNiwJMCwJCTMgfSwKLSAgICB7IDMsCTQsCQk0IH0sCi0gICAgeyA2LAkxLAkgICAyMCB9LAotICAgIHsgNCwJNCwJICAgMjIgfSwKLSAgICB7IDQsCTUsCSAgIDM4IH0sCi0gICAgeyA1LAk2LAkgICA3MCB9LAotICAgIHsgNSwJNywJICAxMzQgfSwKLSAgICB7IDYsCTcsCSAgMjYyIH0sCi0gICAgeyA3LAk4LAkgIDM5MCB9LAotICAgIHsgNiwgICAxMCwJICA2NDYgfSwKLSAgICB7IDksICAgMzIsCSAgLTE2IH0sCi0gICAgeyA5LCAgIDMyLAkgMTY3MCB9LAotICAgIHsgMiwJMCwJCTAgfQotfTsKLWNvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0I5ID0gVFJVRTsKKyAgICB7OCwgMywgLTE1fSwgezksIDEsIC03fSwgIHs4LCAxLCAtNX0sICAgezksIDAsIC0zfSwgICB7NywgMCwgLTJ9LAorICAgIHs0LCAwLCAtMX0sICB7MiwgMSwgMH0sICAgezUsIDAsIDJ9LCAgICB7NiwgMCwgM30sICAgIHszLCA0LCA0fSwKKyAgICB7NiwgMSwgMjB9LCAgezQsIDQsIDIyfSwgIHs0LCA1LCAzOH0sICAgezUsIDYsIDcwfSwgICB7NSwgNywgMTM0fSwKKyAgICB7NiwgNywgMjYyfSwgezcsIDgsIDM5MH0sIHs2LCAxMCwgNjQ2fSwgezksIDMyLCAtMTZ9LCB7OSwgMzIsIDE2NzB9LAorICAgIHsyLCAwLCAwfX07Citjb25zdCBib29sIEh1ZmZtYW5UYWJsZV9IVE9PQl9COSA9IHRydWU7CiBjb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjlbXSA9IHsKLSAgICB7IDgsCTQsCSAgLTMxIH0sCi0gICAgeyA5LAkyLAkgIC0xNSB9LAotICAgIHsgOCwJMiwJICAtMTEgfSwKLSAgICB7IDksCTEsCSAgIC03IH0sCi0gICAgeyA3LAkxLAkgICAtNSB9LAotICAgIHsgNCwJMSwJICAgLTMgfSwKLSAgICB7IDMsCTEsCSAgIC0xIH0sCi0gICAgeyAzLAkxLAkJMSB9LAotICAgIHsgNSwJMSwJCTMgfSwKLSAgICB7IDYsCTEsCQk1IH0sCi0gICAgeyAzLAk1LAkJNyB9LAotICAgIHsgNiwJMiwJICAgMzkgfSwKLSAgICB7IDQsCTUsCSAgIDQzIH0sCi0gICAgeyA0LAk2LAkgICA3NSB9LAotICAgIHsgNSwJNywJICAxMzkgfSwKLSAgICB7IDUsCTgsCSAgMjY3IH0sCi0gICAgeyA2LAk4LAkgIDUyMyB9LAotICAgIHsgNywJOSwJICA3NzkgfSwKLSAgICB7IDYsICAgMTEsCSAxMjkxIH0sCi0gICAgeyA5LCAgIDMyLAkgIC0zMiB9LAotICAgIHsgOSwgICAzMiwJIDMzMzkgfSwKLSAgICB7IDIsCTAsCQkwIH0KLX07Ci1jb25zdCBGWF9CT09MIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTAgPSBUUlVFOworICAgIHs4LCA0LCAtMzF9LCAgIHs5LCAyLCAtMTV9LCB7OCwgMiwgLTExfSwgezksIDEsIC03fSwgICAgezcsIDEsIC01fSwKKyAgICB7NCwgMSwgLTN9LCAgICB7MywgMSwgLTF9LCAgezMsIDEsIDF9LCAgIHs1LCAxLCAzfSwgICAgIHs2LCAxLCA1fSwKKyAgICB7MywgNSwgN30sICAgICB7NiwgMiwgMzl9LCAgezQsIDUsIDQzfSwgIHs0LCA2LCA3NX0sICAgIHs1LCA3LCAxMzl9LAorICAgIHs1LCA4LCAyNjd9LCAgIHs2LCA4LCA1MjN9LCB7NywgOSwgNzc5fSwgezYsIDExLCAxMjkxfSwgezksIDMyLCAtMzJ9LAorICAgIHs5LCAzMiwgMzMzOX0sIHsyLCAwLCAwfX07Citjb25zdCBib29sIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTAgPSB0cnVlOwogY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0IxMFtdID0gewotICAgIHsgNywJNCwJICAtMjEgfSwKLSAgICB7IDgsCTAsCSAgIC01IH0sCi0gICAgeyA3LAkwLAkgICAtNCB9LAotICAgIHsgNSwJMCwJICAgLTMgfSwKLSAgICB7IDIsCTIsCSAgIC0yIH0sCi0gICAgeyA1LAkwLAkJMiB9LAotICAgIHsgNiwJMCwJCTMgfSwKLSAgICB7IDcsCTAsCQk0IH0sCi0gICAgeyA4LAkwLAkJNSB9LAotICAgIHsgMiwJNiwJCTYgfSwKLSAgICB7IDUsCTUsCSAgIDcwIH0sCi0gICAgeyA2LAk1LAkgIDEwMiB9LAotICAgIHsgNiwJNiwJICAxMzQgfSwKLSAgICB7IDYsCTcsCSAgMTk4IH0sCi0gICAgeyA2LAk4LAkgIDMyNiB9LAotICAgIHsgNiwJOSwJICA1ODIgfSwKLSAgICB7IDYsICAgMTAsCSAxMDk0IH0sCi0gICAgeyA3LCAgIDExLAkgMjExOCB9LAotICAgIHsgOCwgICAzMiwJICAtMjIgfSwKLSAgICB7IDgsICAgMzIsCSA0MTY2IH0sCi0gICAgeyAyLAkwLAkJMCB9Ci19OwotY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjExID0gRkFMU0U7CisgICAgezcsIDQsIC0yMX0sIHs4LCAwLCAtNX0sICAgIHs3LCAwLCAtNH0sICAgIHs1LCAwLCAtM30sICAgezIsIDIsIC0yfSwKKyAgICB7NSwgMCwgMn0sICAgezYsIDAsIDN9LCAgICAgezcsIDAsIDR9LCAgICAgezgsIDAsIDV9LCAgICB7MiwgNiwgNn0sCisgICAgezUsIDUsIDcwfSwgIHs2LCA1LCAxMDJ9LCAgIHs2LCA2LCAxMzR9LCAgIHs2LCA3LCAxOTh9LCAgezYsIDgsIDMyNn0sCisgICAgezYsIDksIDU4Mn0sIHs2LCAxMCwgMTA5NH0sIHs3LCAxMSwgMjExOH0sIHs4LCAzMiwgLTIyfSwgezgsIDMyLCA0MTY2fSwKKyAgICB7MiwgMCwgMH19OworY29uc3QgYm9vbCBIdWZmbWFuVGFibGVfSFRPT0JfQjExID0gZmFsc2U7CiBjb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjExW10gPSB7Ci0gICAgeyAxLAkwLAkJMSB9LAotICAgIHsgMiwJMSwJCTIgfSwKLSAgICB7IDQsCTAsCQk0IH0sCi0gICAgeyA0LAkxLAkJNSB9LAotICAgIHsgNSwJMSwJCTcgfSwKLSAgICB7IDUsCTIsCQk5IH0sCi0gICAgeyA2LAkyLAkgICAxMyB9LAotICAgIHsgNywJMiwJICAgMTcgfSwKLSAgICB7IDcsCTMsCSAgIDIxIH0sCi0gICAgeyA3LAk0LAkgICAyOSB9LAotICAgIHsgNywJNSwJICAgNDUgfSwKLSAgICB7IDcsCTYsCSAgIDc3IH0sCi0gICAgeyAwLCAgIDMyLAkJMCB9LAotICAgIHsgNywgICAzMiwJICAxNDEgfQotfTsKLWNvbnN0IEZYX0JPT0wgSHVmZm1hblRhYmxlX0hUT09CX0IxMiA9IEZBTFNFOworICAgIHsxLCAwLCAxfSwgIHsyLCAxLCAyfSwgIHs0LCAwLCA0fSwgIHs0LCAxLCA1fSwgICB7NSwgMSwgN30sCisgICAgezUsIDIsIDl9LCAgezYsIDIsIDEzfSwgezcsIDIsIDE3fSwgezcsIDMsIDIxfSwgIHs3LCA0LCAyOX0sCisgICAgezcsIDUsIDQ1fSwgezcsIDYsIDc3fSwgezAsIDMyLCAwfSwgezcsIDMyLCAxNDF9fTsKK2NvbnN0IGJvb2wgSHVmZm1hblRhYmxlX0hUT09CX0IxMiA9IGZhbHNlOwogY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0IxMltdID0gewotICAgIHsgMSwJMCwJCTEgfSwKLSAgICB7IDIsCTAsCQkyIH0sCi0gICAgeyAzLAkxLAkJMyB9LAotICAgIHsgNSwJMCwJCTUgfSwKLSAgICB7IDUsCTEsCQk2IH0sCi0gICAgeyA2LAkxLAkJOCB9LAotICAgIHsgNywJMCwJICAgMTAgfSwKLSAgICB7IDcsCTEsCSAgIDExIH0sCi0gICAgeyA3LAkyLAkgICAxMyB9LAotICAgIHsgNywJMywJICAgMTcgfSwKLSAgICB7IDcsCTQsCSAgIDI1IH0sCi0gICAgeyA4LAk1LAkgICA0MSB9LAotICAgIHsgMCwgICAzMiwJCTAgfSwKLSAgICB7IDgsICAgMzIsCSAgIDczIH0KLX07Ci1jb25zdCBGWF9CT09MIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTMgPSBGQUxTRTsKKyAgICB7MSwgMCwgMX0sICB7MiwgMCwgMn0sICB7MywgMSwgM30sICB7NSwgMCwgNX0sICB7NSwgMSwgNn0sCisgICAgezYsIDEsIDh9LCAgezcsIDAsIDEwfSwgezcsIDEsIDExfSwgezcsIDIsIDEzfSwgezcsIDMsIDE3fSwKKyAgICB7NywgNCwgMjV9LCB7OCwgNSwgNDF9LCB7MCwgMzIsIDB9LCB7OCwgMzIsIDczfX07Citjb25zdCBib29sIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTMgPSBmYWxzZTsKIGNvbnN0IEpCaWcyVGFibGVMaW5lIEh1ZmZtYW5UYWJsZV9CMTNbXSA9IHsKLSAgICB7IDEsCTAsCQkxIH0sCi0gICAgeyAzLAkwLAkJMiB9LAotICAgIHsgNCwJMCwJCTMgfSwKLSAgICB7IDUsCTAsCQk0IH0sCi0gICAgeyA0LAkxLAkJNSB9LAotICAgIHsgMywJMywJCTcgfSwKLSAgICB7IDYsCTEsCSAgIDE1IH0sCi0gICAgeyA2LAkyLAkgICAxNyB9LAotICAgIHsgNiwJMywJICAgMjEgfSwKLSAgICB7IDYsCTQsCSAgIDI5IH0sCi0gICAgeyA2LAk1LAkgICA0NSB9LAotICAgIHsgNywJNiwJICAgNzcgfSwKLSAgICB7IDAsICAgMzIsCQkwIH0sCi0gICAgeyA3LCAgIDMyLAkgIDE0MSB9Ci19OwotY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjE0ID0gRkFMU0U7Ci1jb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjE0W10gPSB7Ci0gICAgeyAzLAkwLAkgICAtMiB9LAotICAgIHsgMywJMCwJICAgLTEgfSwKLSAgICB7IDEsCTAsCQkwIH0sCi0gICAgeyAzLAkwLAkJMSB9LAotICAgIHsgMywJMCwJCTIgfSwKLSAgICB7IDAsICAgMzIsCSAgIC0zIH0sCi0gICAgeyAwLCAgIDMyLAkJMyB9Ci19OwotY29uc3QgRlhfQk9PTCBIdWZmbWFuVGFibGVfSFRPT0JfQjE1ID0gRkFMU0U7CisgICAgezEsIDAsIDF9LCAgezMsIDAsIDJ9LCAgezQsIDAsIDN9LCAgezUsIDAsIDR9LCAgIHs0LCAxLCA1fSwKKyAgICB7MywgMywgN30sICB7NiwgMSwgMTV9LCB7NiwgMiwgMTd9LCB7NiwgMywgMjF9LCAgezYsIDQsIDI5fSwKKyAgICB7NiwgNSwgNDV9LCB7NywgNiwgNzd9LCB7MCwgMzIsIDB9LCB7NywgMzIsIDE0MX19OworY29uc3QgYm9vbCBIdWZmbWFuVGFibGVfSFRPT0JfQjE0ID0gZmFsc2U7Citjb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjE0W10gPSB7ezMsIDAsIC0yfSwgezMsIDAsIC0xfSwgezEsIDAsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszLCAwLCAxfSwgIHszLCAwLCAyfSwgIHswLCAzMiwgLTN9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCAzMiwgM319OworY29uc3QgYm9vbCBIdWZmbWFuVGFibGVfSFRPT0JfQjE1ID0gZmFsc2U7CiBjb25zdCBKQmlnMlRhYmxlTGluZSBIdWZmbWFuVGFibGVfQjE1W10gPSB7Ci0gICAgeyA3LAk0LAkgIC0yNCB9LAotICAgIHsgNiwJMiwJICAgLTggfSwKLSAgICB7IDUsCTEsCSAgIC00IH0sCi0gICAgeyA0LAkwLAkgICAtMiB9LAotICAgIHsgMywJMCwJICAgLTEgfSwKLSAgICB7IDEsCTAsCQkwIH0sCi0gICAgeyAzLAkwLAkJMSB9LAotICAgIHsgNCwJMCwJCTIgfSwKLSAgICB7IDUsCTEsCQkzIH0sCi0gICAgeyA2LAkyLAkJNSB9LAotICAgIHsgNywJNCwJCTkgfSwKLSAgICB7IDcsICAgMzIsCSAgLTI1IH0sCi0gICAgeyA3LCAgIDMyLAkgICAyNSB9Ci19OwotI2VuZGlmCisgICAgezcsIDQsIC0yNH0sIHs2LCAyLCAtOH0sICAgezUsIDEsIC00fSwgezQsIDAsIC0yfSwgezMsIDAsIC0xfSwKKyAgICB7MSwgMCwgMH0sICAgezMsIDAsIDF9LCAgICB7NCwgMCwgMn0sICB7NSwgMSwgM30sICB7NiwgMiwgNX0sCisgICAgezcsIDQsIDl9LCAgIHs3LCAzMiwgLTI1fSwgezcsIDMyLCAyNX19OworCisjZW5kaWYgIC8vIENPUkVfU1JDX0ZYQ09ERUNfSkJJRzJfSkJJRzJfSFVGRk1BTlRBQkxFX1NUQU5EQVJEX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0ltYWdlLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuY3BwCmluZGV4IDhlMjdiY2EuLjA3NDQ1ODcgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuY3BwCkBAIC0xLDE2MzAgKzEsMTA5OSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9zcmMvZnhjcnQvZnhfc2FmZV90eXBlcy5oIgorCiAjaW5jbHVkZSAiSkJpZzJfSW1hZ2UuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc2FmZV90eXBlcy5oIgogCi1DSkJpZzJfSW1hZ2U6OkNKQmlnMl9JbWFnZShGWF9JTlQzMiB3LCBGWF9JTlQzMiBoKQotewotICAgIG1fbldpZHRoCT0gdzsKLSAgICBtX25IZWlnaHQJPSBoOwotICAgIGlmIChtX25XaWR0aCA8PSAwIHx8IG1fbkhlaWdodCA8PSAwIHx8IG1fbldpZHRoID4gSU5UX01BWCAtIDMxKSB7Ci0gICAgICAgIG1fcERhdGEgPSBOVUxMOwotICAgICAgICBtX2JOZWVkRnJlZSA9IEZBTFNFOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fblN0cmlkZSAgPSAoKHcgKyAzMSkgPj4gNSkgPDwgMjsKLSAgICBpZiAobV9uU3RyaWRlICogbV9uSGVpZ2h0ID4gMCAmJiAxMDQ4NTc2MDAgLyAoaW50KW1fblN0cmlkZSA+IG1fbkhlaWdodCkgewotICAgICAgICBtX3BEYXRhID0gKEZYX0JZVEUgKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIobV9uU3RyaWRlLCBtX25IZWlnaHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcERhdGEgPSBOVUxMOwotICAgIH0KLSAgICBtX2JOZWVkRnJlZSA9IFRSVUU7Ci19Ci1DSkJpZzJfSW1hZ2U6OkNKQmlnMl9JbWFnZShGWF9JTlQzMiB3LCBGWF9JTlQzMiBoLCBGWF9JTlQzMiBzdHJpZGUsIEZYX0JZVEUqcEJ1ZikKLXsKLSAgICBtX25XaWR0aCA9IHc7Ci0gICAgbV9uSGVpZ2h0ID0gaDsKLSAgICBtX25TdHJpZGUgPSBzdHJpZGU7Ci0gICAgbV9wRGF0YSA9IHBCdWY7CitDSkJpZzJfSW1hZ2U6OkNKQmlnMl9JbWFnZShpbnQzMl90IHcsIGludDMyX3QgaCkgeworICBtX25XaWR0aCA9IHc7CisgIG1fbkhlaWdodCA9IGg7CisgIGlmIChtX25XaWR0aCA8PSAwIHx8IG1fbkhlaWdodCA8PSAwIHx8IG1fbldpZHRoID4gSU5UX01BWCAtIDMxKSB7CisgICAgbV9wRGF0YSA9IE5VTEw7CiAgICAgbV9iTmVlZEZyZWUgPSBGQUxTRTsKKyAgICByZXR1cm47CisgIH0KKyAgbV9uU3RyaWRlID0gKCh3ICsgMzEpID4+IDUpIDw8IDI7CisgIGlmIChtX25TdHJpZGUgKiBtX25IZWlnaHQgPiAwICYmIDEwNDg1NzYwMCAvIChpbnQpbV9uU3RyaWRlID4gbV9uSGVpZ2h0KSB7CisgICAgbV9wRGF0YSA9IEZYX0FsbG9jMkQodWludDhfdCwgbV9uU3RyaWRlLCBtX25IZWlnaHQpOworICB9IGVsc2UgeworICAgIG1fcERhdGEgPSBOVUxMOworICB9CisgIG1fYk5lZWRGcmVlID0gVFJVRTsKIH0KLUNKQmlnMl9JbWFnZTo6Q0pCaWcyX0ltYWdlKENKQmlnMl9JbWFnZSAmaW0pCi17Ci0gICAgbV9wTW9kdWxlID0gaW0ubV9wTW9kdWxlOwotICAgIG1fbldpZHRoCT0gaW0ubV9uV2lkdGg7Ci0gICAgbV9uSGVpZ2h0CT0gaW0ubV9uSGVpZ2h0OwotICAgIG1fblN0cmlkZQk9IGltLm1fblN0cmlkZTsKLSAgICBpZiAoaW0ubV9wRGF0YSkgewotICAgICAgICBtX3BEYXRhID0gKEZYX0JZVEUqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMihtX25TdHJpZGUsIG1fbkhlaWdodCk7Ci0gICAgICAgIEpCSUcyX21lbWNweShtX3BEYXRhLCBpbS5tX3BEYXRhLCBtX25TdHJpZGUgKiBtX25IZWlnaHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcERhdGEgPSBOVUxMOwotICAgIH0KLSAgICBtX2JOZWVkRnJlZSA9IFRSVUU7CitDSkJpZzJfSW1hZ2U6OkNKQmlnMl9JbWFnZShpbnQzMl90IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBCdWYpIHsKKyAgbV9uV2lkdGggPSB3OworICBtX25IZWlnaHQgPSBoOworICBtX25TdHJpZGUgPSBzdHJpZGU7CisgIG1fcERhdGEgPSBwQnVmOworICBtX2JOZWVkRnJlZSA9IEZBTFNFOwogfQotQ0pCaWcyX0ltYWdlOjp+Q0pCaWcyX0ltYWdlKCkKLXsKLSAgICBpZihtX2JOZWVkRnJlZSAmJiBtX3BEYXRhKSB7Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShtX3BEYXRhKTsKLSAgICB9CitDSkJpZzJfSW1hZ2U6OkNKQmlnMl9JbWFnZShjb25zdCBDSkJpZzJfSW1hZ2UmIGltKSB7CisgIG1fbldpZHRoID0gaW0ubV9uV2lkdGg7CisgIG1fbkhlaWdodCA9IGltLm1fbkhlaWdodDsKKyAgbV9uU3RyaWRlID0gaW0ubV9uU3RyaWRlOworICBpZiAoaW0ubV9wRGF0YSkgeworICAgIG1fcERhdGEgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIG1fblN0cmlkZSwgbV9uSGVpZ2h0KTsKKyAgICBKQklHMl9tZW1jcHkobV9wRGF0YSwgaW0ubV9wRGF0YSwgbV9uU3RyaWRlICogbV9uSGVpZ2h0KTsKKyAgfSBlbHNlIHsKKyAgICBtX3BEYXRhID0gTlVMTDsKKyAgfQorICBtX2JOZWVkRnJlZSA9IFRSVUU7CiB9Ci1GWF9CT09MIENKQmlnMl9JbWFnZTo6Z2V0UGl4ZWwoRlhfSU5UMzIgeCwgRlhfSU5UMzIgeSkKLXsKLSAgICBpZiAoIW1fcERhdGEpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIEZYX0lOVDMyIG0sIG47Ci0gICAgaWYoeCA8IDAgfHwgeCA+PSBtX25XaWR0aCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYoeSA8IDAgfHwgeSA+PSBtX25IZWlnaHQpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIG0gPSB5ICogbV9uU3RyaWRlICsgKHggPj4gMyk7Ci0gICAgbiA9IHggJiA3OwotICAgIHJldHVybiAoKG1fcERhdGFbbV0gPj4gKDcgLSBuKSkgJiAxKTsKK0NKQmlnMl9JbWFnZTo6fkNKQmlnMl9JbWFnZSgpIHsKKyAgaWYgKG1fYk5lZWRGcmVlKSB7CisgICAgRlhfRnJlZShtX3BEYXRhKTsKKyAgfQorfQorRlhfQk9PTCBDSkJpZzJfSW1hZ2U6OmdldFBpeGVsKGludDMyX3QgeCwgaW50MzJfdCB5KSB7CisgIGlmICghbV9wRGF0YSkgeworICAgIHJldHVybiAwOworICB9CisgIGludDMyX3QgbSwgbjsKKyAgaWYgKHggPCAwIHx8IHggPj0gbV9uV2lkdGgpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoeSA8IDAgfHwgeSA+PSBtX25IZWlnaHQpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBtID0geSAqIG1fblN0cmlkZSArICh4ID4+IDMpOworICBuID0geCAmIDc7CisgIHJldHVybiAoKG1fcERhdGFbbV0gPj4gKDcgLSBuKSkgJiAxKTsKIH0KIAotRlhfSU5UMzIgQ0pCaWcyX0ltYWdlOjpzZXRQaXhlbChGWF9JTlQzMiB4LCBGWF9JTlQzMiB5LCBGWF9CT09MIHYpCi17Ci0gICAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBGWF9JTlQzMiBtLCBuOwotICAgIGlmKHggPCAwIHx8IHggPj0gbV9uV2lkdGgpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmKHkgPCAwIHx8IHkgPj0gbV9uSGVpZ2h0KSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBtID0geSAqIG1fblN0cmlkZSArICh4ID4+IDMpOwotICAgIG4gPSB4ICYgNzsKLSAgICBpZih2KSB7Ci0gICAgICAgIG1fcERhdGFbbV0gfD0gMSA8PCAoNyAtIG4pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcERhdGFbbV0gJj0gfigxIDw8ICg3IC0gbikpOwotICAgIH0KLSAgICByZXR1cm4gMTsKK2ludDMyX3QgQ0pCaWcyX0ltYWdlOjpzZXRQaXhlbChpbnQzMl90IHgsIGludDMyX3QgeSwgRlhfQk9PTCB2KSB7CisgIGlmICghbV9wRGF0YSkgeworICAgIHJldHVybiAwOworICB9CisgIGludDMyX3QgbSwgbjsKKyAgaWYgKHggPCAwIHx8IHggPj0gbV9uV2lkdGgpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoeSA8IDAgfHwgeSA+PSBtX25IZWlnaHQpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBtID0geSAqIG1fblN0cmlkZSArICh4ID4+IDMpOworICBuID0geCAmIDc7CisgIGlmICh2KSB7CisgICAgbV9wRGF0YVttXSB8PSAxIDw8ICg3IC0gbik7CisgIH0gZWxzZSB7CisgICAgbV9wRGF0YVttXSAmPSB+KDEgPDwgKDcgLSBuKSk7CisgIH0KKyAgcmV0dXJuIDE7CiB9Ci12b2lkIENKQmlnMl9JbWFnZTo6Y29weUxpbmUoRlhfSU5UMzIgaFRvLCBGWF9JTlQzMiBoRnJvbSkKLXsKLSAgICBpZiAoIW1fcERhdGEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZihoRnJvbSA8IDAgfHwgaEZyb20gPj0gbV9uSGVpZ2h0KSB7Ci0gICAgICAgIEpCSUcyX21lbXNldChtX3BEYXRhICsgaFRvICogbV9uU3RyaWRlLCAwLCBtX25TdHJpZGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEpCSUcyX21lbWNweShtX3BEYXRhICsgaFRvICogbV9uU3RyaWRlLCBtX3BEYXRhICsgaEZyb20gKiBtX25TdHJpZGUsIG1fblN0cmlkZSk7Ci0gICAgfQordm9pZCBDSkJpZzJfSW1hZ2U6OmNvcHlMaW5lKGludDMyX3QgaFRvLCBpbnQzMl90IGhGcm9tKSB7CisgIGlmICghbV9wRGF0YSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoaEZyb20gPCAwIHx8IGhGcm9tID49IG1fbkhlaWdodCkgeworICAgIEpCSUcyX21lbXNldChtX3BEYXRhICsgaFRvICogbV9uU3RyaWRlLCAwLCBtX25TdHJpZGUpOworICB9IGVsc2UgeworICAgIEpCSUcyX21lbWNweShtX3BEYXRhICsgaFRvICogbV9uU3RyaWRlLCBtX3BEYXRhICsgaEZyb20gKiBtX25TdHJpZGUsCisgICAgICAgICAgICAgICAgIG1fblN0cmlkZSk7CisgIH0KIH0KLXZvaWQgQ0pCaWcyX0ltYWdlOjpmaWxsKEZYX0JPT0wgdikKLXsKLSAgICBpZiAoIW1fcERhdGEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBKQklHMl9tZW1zZXQobV9wRGF0YSwgdiA/IDB4ZmYgOiAwLCBtX25TdHJpZGUgKiBtX25IZWlnaHQpOwordm9pZCBDSkJpZzJfSW1hZ2U6OmZpbGwoRlhfQk9PTCB2KSB7CisgIGlmICghbV9wRGF0YSkgeworICAgIHJldHVybjsKKyAgfQorICBKQklHMl9tZW1zZXQobV9wRGF0YSwgdiA/IDB4ZmYgOiAwLCBtX25TdHJpZGUgKiBtX25IZWlnaHQpOwogfQotRlhfQk9PTCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VUbyhDSkJpZzJfSW1hZ2UgKnBEc3QsIEZYX0lOVDMyIHgsIEZYX0lOVDMyIHksIEpCaWcyQ29tcG9zZU9wIG9wKQotewotICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQorRlhfQk9PTCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VUbyhDSkJpZzJfSW1hZ2UqIHBEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkNvbXBvc2VPcCBvcCkgeworICBpZiAoIW1fcERhdGEpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIGNvbXBvc2VUb19vcHQyKHBEc3QsIHgsIHksIG9wKTsKK30KK0ZYX0JPT0wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlVG8oQ0pCaWcyX0ltYWdlKiBwRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJDb21wb3NlT3Agb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0KSB7CisgIGlmICghbV9wRGF0YSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoTlVMTCA9PSBwU3JjUmVjdCB8fCAqcFNyY1JlY3QgPT0gRlhfUkVDVCgwLCAwLCBtX25XaWR0aCwgbV9uSGVpZ2h0KSkgewogICAgIHJldHVybiBjb21wb3NlVG9fb3B0MihwRHN0LCB4LCB5LCBvcCk7Ci19Ci1GWF9CT09MIENKQmlnMl9JbWFnZTo6Y29tcG9zZVRvKENKQmlnMl9JbWFnZSAqcERzdCwgRlhfSU5UMzIgeCwgRlhfSU5UMzIgeSwgSkJpZzJDb21wb3NlT3Agb3AsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0KQotewotICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChOVUxMID09IHBTcmNSZWN0IHx8ICpwU3JjUmVjdCA9PSBGWF9SRUNUKDAsIDAsIG1fbldpZHRoLCBtX25IZWlnaHQpKSB7Ci0gICAgICAgIHJldHVybiBjb21wb3NlVG9fb3B0MihwRHN0LCB4LCB5LCBvcCk7Ci0gICAgfQotICAgIHJldHVybiBjb21wb3NlVG9fb3B0MihwRHN0LCB4LCB5LCBvcCwgcFNyY1JlY3QpOwotfQotRlhfQk9PTCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VUb191bm9wdChDSkJpZzJfSW1hZ2UgKnBEc3QsIEZYX0lOVDMyIHgsIEZYX0lOVDMyIHksIEpCaWcyQ29tcG9zZU9wIG9wKQotewotICAgIEZYX0lOVDMyIHcsIGgsIGR4LCBkeTsKLSAgICBGWF9JTlQzMiBpLCBqOwotICAgIHcgPSBtX25XaWR0aDsKLSAgICBoID0gbV9uSGVpZ2h0OwotICAgIGR4ID0gZHkgPSAwOwotICAgIGlmKHggPCAwKSB7Ci0gICAgICAgIGR4ICs9IC14OwotICAgICAgICB3ICAtPSAteDsKLSAgICAgICAgeCA9IDA7Ci0gICAgfQotICAgIGlmKHkgPCAwKSB7Ci0gICAgICAgIGR5ICs9IC15OwotICAgICAgICBoICAtPSAteTsKLSAgICAgICAgeSA9IDA7Ci0gICAgfQotICAgIGlmKHggKyB3ID4gcERzdC0+bV9uV2lkdGgpIHsKLSAgICAgICAgdyA9IHBEc3QtPm1fbldpZHRoIC0geDsKLSAgICB9Ci0gICAgaWYoeSArIGggPiBwRHN0LT5tX25IZWlnaHQpIHsKLSAgICAgICAgaCA9IHBEc3QtPm1fbkhlaWdodCAtIHk7Ci0gICAgfQotICAgIHN3aXRjaChvcCkgewotICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6Ci0gICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCB3OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcERzdC0+c2V0UGl4ZWwoeCArIGksIHkgKyBqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0UGl4ZWwoaSArIGR4LCBqICsgZHkpIHwgcERzdC0+Z2V0UGl4ZWwoeCArIGksIHkgKyBqKSkgJiAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKLSAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IGg7IGorKykgewotICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IHc7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBwRHN0LT5zZXRQaXhlbCh4ICsgaSwgeSArIGosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRQaXhlbChpICsgZHgsIGogKyBkeSkgJiBwRHN0LT5nZXRQaXhlbCh4ICsgaSwgeSArIGopKSAmIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgotICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgaDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgdzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBEc3QtPnNldFBpeGVsKHggKyBpLCB5ICsgaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldFBpeGVsKGkgKyBkeCwgaiArIGR5KSBeIHBEc3QtPmdldFBpeGVsKHggKyBpLCB5ICsgaikpICYgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgotICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgaDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgdzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBEc3QtPnNldFBpeGVsKHggKyBpLCB5ICsgaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKH4oZ2V0UGl4ZWwoaSArIGR4LCBqICsgZHkpIF4gcERzdC0+Z2V0UGl4ZWwoeCArIGksIHkgKyBqKSkpICYgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgotICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgaDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgdzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBEc3QtPnNldFBpeGVsKHggKyBpLCB5ICsgaiwgZ2V0UGl4ZWwoaSArIGR4LCBqICsgZHkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIGNvbXBvc2VUb19vcHQyKHBEc3QsIHgsIHksIG9wLCBwU3JjUmVjdCk7CiB9CiAKLUZYX0JPT0wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlVG9fb3B0KENKQmlnMl9JbWFnZSAqcERzdCwgRlhfSU5UMzIgeCwgRlhfSU5UMzIgeSwgSkJpZzJDb21wb3NlT3Agb3ApCi17Ci0gICAgRlhfSU5UMzIgeDAsIHgxLCB5MCwgeTEsIHh4LCB5eTsKLSAgICBGWF9CWVRFICpwTGluZVNyYywgKnBMaW5lRHN0LCAqc3JjUHRyLCAqZGVzdFB0cjsKLSAgICBGWF9EV09SRCBzcmMwLCBzcmMxLCBzcmMsIGRlc3QsIHMxLCBzMiwgbTEsIG0yLCBtMzsKLSAgICBGWF9CT09MIG9uZUJ5dGU7Ci0gICAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKHkgPCAwKSB7Ci0gICAgICAgIHkwID0gLXk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgeTAgPSAwOwotICAgIH0KLSAgICBpZiAoeSArIG1fbkhlaWdodCA+IHBEc3QtPm1fbkhlaWdodCkgewotICAgICAgICB5MSA9IHBEc3QtPm1fbkhlaWdodCAtIHk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgeTEgPSBtX25IZWlnaHQ7Ci0gICAgfQotICAgIGlmICh5MCA+PSB5MSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmICh4ID49IDApIHsKLSAgICAgICAgeDAgPSB4ICYgfjc7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgeDAgPSAwOwotICAgIH0KLSAgICB4MSA9IHggKyBtX25XaWR0aDsKLSAgICBpZiAoeDEgPiBwRHN0LT5tX25XaWR0aCkgewotICAgICAgICB4MSA9IHBEc3QtPm1fbldpZHRoOwotICAgIH0KLSAgICBpZiAoeDAgPj0geDEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBzMSA9IHggJiA3OwotICAgIHMyID0gOCAtIHMxOwotICAgIG0xID0gMHhmZiA+PiAoeDEgJiA3KTsKLSAgICBtMiA9IDB4ZmYgPDwgKCgoeDEgJiA3KSA9PSAwKSA/IDAgOiA4IC0gKHgxICYgNykpOwotICAgIG0zID0gKDB4ZmYgPj4gczEpICYgbTI7Ci0gICAgb25lQnl0ZSA9IHgwID09ICgoeDEgLSAxKSAmIH43KTsKLSAgICBwTGluZURzdCA9IHBEc3QtPm1fcERhdGEgKyB5ICogcERzdC0+bV9uU3RyaWRlOwotICAgIHBMaW5lU3JjID0gbV9wRGF0YSArIHkwICogbV9uU3RyaWRlOwotICAgIGlmKG9uZUJ5dGUpIHsKLSAgICAgICAgaWYoeCA+PSAwKSB7Ci0gICAgICAgICAgICBzd2l0Y2gob3ApIHsKLSAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoeXkgPSB5MDsgeXkgPCB5MTsgKyt5eSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RQdHIgPSBwTGluZURzdCArICh4ID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1B0ciA9IHBMaW5lU3JjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0IHw9ICgqc3JjUHRyID4+IHMxKSAmIG0yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0UHRyID0gKEZYX0JZVEUpZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoeXkgPSB5MDsgeXkgPCB5MTsgKyt5eSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RQdHIgPSBwTGluZURzdCArICh4ID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1B0ciA9IHBMaW5lU3JjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ICY9ICgoMHhmZjAwIHwgKnNyY1B0cikgPj4gczEpIHwgbTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIgPSAoRlhfQllURSlkZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZVNyYyArPSBtX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjogewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh5eSA9IHkwOyB5eSA8IHkxOyArK3l5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFB0ciA9IHBMaW5lRHN0ICsgKHggPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUHRyID0gcExpbmVTcmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgXj0gKCpzcmNQdHIgPj4gczEpICYgbTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIgPSAoRlhfQllURSlkZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZVNyYyArPSBtX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoeXkgPSB5MDsgeXkgPCB5MTsgKyt5eSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RQdHIgPSBwTGluZURzdCArICh4ID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1B0ciA9IHBMaW5lU3JjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0IF49ICgoKnNyY1B0ciBeIDB4ZmYpID4+IHMxKSAmIG0yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0UHRyID0gKEZYX0JZVEUpZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHl5ID0geTA7IHl5IDwgeTE7ICsreXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0UHRyID0gcExpbmVEc3QgKyAoeCA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQdHIgPSBwTGluZVNyYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9IChkZXN0ICYgfm0zKSB8ICgoKnNyY1B0ciA+PiBzMSkgJiBtMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIgPSAoRlhfQllURSlkZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZVNyYyArPSBtX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzd2l0Y2gob3ApIHsKLSAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcih5eSA9IHkwOyB5eSA8IHkxOyArK3l5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFB0ciA9IHBMaW5lRHN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1B0ciA9IHBMaW5lU3JjICsgKC14ID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0IHw9ICpzcmNQdHIgJiBtMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdFB0ciA9IChGWF9CWVRFKWRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lU3JjICs9IG1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoeXkgPSB5MDsgeXkgPCB5MTsgKyt5eSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RQdHIgPSBwTGluZURzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQdHIgPSBwTGluZVNyYyArICgteCA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCAmPSAqc3JjUHRyIHwgbTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIgPSAoRlhfQllURSlkZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZVNyYyArPSBtX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjogewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHl5ID0geTA7IHl5IDwgeTE7ICsreXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0UHRyID0gcExpbmVEc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUHRyID0gcExpbmVTcmMgKyAoLXggPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgXj0gKnNyY1B0ciAmIG0yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0UHRyID0gKEZYX0JZVEUpZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoeXkgPSB5MDsgeXkgPCB5MTsgKyt5eSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RQdHIgPSBwTGluZURzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQdHIgPSBwTGluZVNyYyArICgteCA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCBePSAoKnNyY1B0ciBeIDB4ZmYpICYgbTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIgPSAoRlhfQllURSlkZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZVNyYyArPSBtX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcih5eSA9IHkwOyB5eSA8IHkxOyArK3l5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFB0ciA9IHBMaW5lRHN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1B0ciA9IHBMaW5lU3JjICsgKC14ID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKCpzcmNQdHIgJiBtMikgfCAoZGVzdCAmIG0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdFB0ciA9IChGWF9CWVRFKWRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lU3JjICs9IG1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKHggPj0gMCkgewotICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoeXkgPSB5MDsgeXkgPCB5MTsgKyt5eSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RQdHIgPSBwTGluZURzdCArICh4ID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1B0ciA9IHBMaW5lU3JjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgfD0gc3JjMSA+PiBzMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdFB0cisrID0gKEZYX0JZVEUpZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4eCA9IHgwICsgODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgeHggPCB4MSAtIDg7IHh4ICs9IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMwID0gc3JjMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSA9ICpzcmNQdHIrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjID0gKCgoc3JjMCA8PCA4KSB8IHNyYzEpID4+IHMxKSAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgfD0gc3JjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdFB0cisrID0gKEZYX0JZVEUpZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzAgPSBzcmMxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNyY1B0ciAtIHBMaW5lU3JjIDwgbV9uU3RyaWRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyA9ICgoKHNyYzAgPDwgOCkgfCBzcmMxKSA+PiBzMSkgJiAweGZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgfD0gc3JjICYgbTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIgPSAoRlhfQllURSlkZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZVNyYyArPSBtX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDogewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHl5ID0geTA7IHl5IDwgeTE7ICsreXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0UHRyID0gcExpbmVEc3QgKyAoeCA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQdHIgPSBwTGluZVNyYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ICY9ICgweGZmMDAgfCBzcmMxKSA+PiBzMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdFB0cisrID0gKEZYX0JZVEUpZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4eCA9IHgwICsgODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgeHggPCB4MSAtIDg7IHh4ICs9IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMwID0gc3JjMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSA9ICpzcmNQdHIrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjID0gKCgoc3JjMCA8PCA4KSB8IHNyYzEpID4+IHMxKSAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgJj0gc3JjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdFB0cisrID0gKEZYX0JZVEUpZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzAgPSBzcmMxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNyY1B0ciAtIHBMaW5lU3JjIDwgbV9uU3RyaWRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyA9ICgoKHNyYzAgPDwgOCkgfCBzcmMxKSA+PiBzMSkgJiAweGZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgJj0gc3JjIHwgbTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIgPSAoRlhfQllURSlkZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZVNyYyArPSBtX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjogewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHl5ID0geTA7IHl5IDwgeTE7ICsreXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0UHRyID0gcExpbmVEc3QgKyAoeCA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQdHIgPSBwTGluZVNyYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0IF49IHNyYzEgPj4gczE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIrKyA9IChGWF9CWVRFKWRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeHggPSB4MCArIDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IHh4IDwgeDEgLSA4OyB4eCArPSA4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMCA9IHNyYzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyA9ICgoKHNyYzAgPDwgOCkgfCBzcmMxKSA+PiBzMSkgJiAweGZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0IF49IHNyYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIrKyA9IChGWF9CWVRFKWRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMwID0gc3JjMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzcmNQdHIgLSBwTGluZVNyYyA8IG1fblN0cmlkZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgPSAoKChzcmMwIDw8IDgpIHwgc3JjMSkgPj4gczEpICYgMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0IF49IHNyYyAmIG0yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0UHRyID0gKEZYX0JZVEUpZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoeXkgPSB5MDsgeXkgPCB5MTsgKyt5eSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RQdHIgPSBwTGluZURzdCArICh4ID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1B0ciA9IHBMaW5lU3JjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgXj0gKHNyYzEgXiAweGZmKSA+PiBzMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdFB0cisrID0gKEZYX0JZVEUpZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4eCA9IHgwICsgODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgeHggPCB4MSAtIDg7IHh4ICs9IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMwID0gc3JjMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSA9ICpzcmNQdHIrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjID0gKCgoc3JjMCA8PCA4KSB8IHNyYzEpID4+IHMxKSAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgXj0gc3JjIF4gMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIrKyA9IChGWF9CWVRFKWRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMwID0gc3JjMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzcmNQdHIgLSBwTGluZVNyYyA8IG1fblN0cmlkZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgPSAoKChzcmMwIDw8IDgpIHwgc3JjMSkgPj4gczEpICYgMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0IF49IChzcmMgXiAweGZmKSAmIG0yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0UHRyID0gKEZYX0JZVEUpZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoeXkgPSB5MDsgeXkgPCB5MTsgKyt5eSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RQdHIgPSBwTGluZURzdCArICh4ID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1B0ciA9IHBMaW5lU3JjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAoZGVzdCAmICgweGZmIDw8IHMyKSkgfCAoc3JjMSA+PiBzMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIrKyA9IChGWF9CWVRFKWRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeHggPSB4MCArIDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IHh4IDwgeDEgLSA4OyB4eCArPSA4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMCA9IHNyYzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyA9ICgoKHNyYzAgPDwgOCkgfCBzcmMxKSA+PiBzMSkgJiAweGZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gc3JjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdFB0cisrID0gKEZYX0JZVEUpZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzAgPSBzcmMxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNyY1B0ciAtIHBMaW5lU3JjIDwgbV9uU3RyaWRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyA9ICgoKHNyYzAgPDwgOCkgfCBzcmMxKSA+PiBzMSkgJiAweGZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAoc3JjICYgbTIpIHwgKGRlc3QgJiBtMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIgPSAoRlhfQllURSlkZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZVNyYyArPSBtX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzd2l0Y2gob3ApIHsKLSAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcih5eSA9IHkwOyB5eSA8IHkxOyArK3l5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFB0ciA9IHBMaW5lRHN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1B0ciA9IHBMaW5lU3JjICsgKC14ID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeHggPSB4MDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgeHggPCB4MSAtIDg7IHh4ICs9IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMwID0gc3JjMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSA9ICpzcmNQdHIrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjID0gKCgoc3JjMCA8PCA4KSB8IHNyYzEpID4+IHMxKSAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgfD0gc3JjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdFB0cisrID0gKEZYX0JZVEUpZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9ICpkZXN0UHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzAgPSBzcmMxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNyY1B0ciAtIHBMaW5lU3JjIDwgbV9uU3RyaWRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyA9ICgoKHNyYzAgPDwgOCkgfCBzcmMxKSA+PiBzMSkgJiAweGZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgfD0gc3JjICYgbTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIgPSAoRlhfQllURSlkZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZVNyYyArPSBtX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDogewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHl5ID0geTA7IHl5IDwgeTE7ICsreXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0UHRyID0gcExpbmVEc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUHRyID0gcExpbmVTcmMgKyAoLXggPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSA9ICpzcmNQdHIrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4eCA9IHgwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyB4eCA8IHgxIC0gODsgeHggKz0gOCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzAgPSBzcmMxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgPSAoKChzcmMwIDw8IDgpIHwgc3JjMSkgPj4gczEpICYgMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCAmPSBzcmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0UHRyKysgPSAoRlhfQllURSlkZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMCA9IHNyYzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3JjUHRyIC0gcExpbmVTcmMgPCBtX25TdHJpZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSA9ICpzcmNQdHIrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjID0gKCgoc3JjMCA8PCA4KSB8IHNyYzEpID4+IHMxKSAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCAmPSBzcmMgfCBtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdFB0ciA9IChGWF9CWVRFKWRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lU3JjICs9IG1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoeXkgPSB5MDsgeXkgPCB5MTsgKyt5eSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RQdHIgPSBwTGluZURzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQdHIgPSBwTGluZVNyYyArICgteCA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh4ID0geDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IHh4IDwgeDEgLSA4OyB4eCArPSA4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMCA9IHNyYzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyA9ICgoKHNyYzAgPDwgOCkgfCBzcmMxKSA+PiBzMSkgJiAweGZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0IF49IHNyYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIrKyA9IChGWF9CWVRFKWRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMwID0gc3JjMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzcmNQdHIgLSBwTGluZVNyYyA8IG1fblN0cmlkZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgPSAoKChzcmMwIDw8IDgpIHwgc3JjMSkgPj4gczEpICYgMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0IF49IHNyYyAmIG0yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0UHRyID0gKEZYX0JZVEUpZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoeXkgPSB5MDsgeXkgPCB5MTsgKyt5eSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RQdHIgPSBwTGluZURzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQdHIgPSBwTGluZVNyYyArICgteCA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh4ID0geDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IHh4IDwgeDEgLSA4OyB4eCArPSA4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMCA9IHNyYzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAqc3JjUHRyKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyA9ICgoKHNyYzAgPDwgOCkgfCBzcmMxKSA+PiBzMSkgJiAweGZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0IF49IHNyYyBeIDB4ZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0UHRyKysgPSAoRlhfQllURSlkZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMCA9IHNyYzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3JjUHRyIC0gcExpbmVTcmMgPCBtX25TdHJpZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSA9ICpzcmNQdHIrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjID0gKCgoc3JjMCA8PCA4KSB8IHNyYzEpID4+IHMxKSAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCBePSAoc3JjIF4gMHhmZikgJiBtMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdFB0ciA9IChGWF9CWVRFKWRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lU3JjICs9IG1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRTogewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHl5ID0geTA7IHl5IDwgeTE7ICsreXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0UHRyID0gcExpbmVEc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUHRyID0gcExpbmVTcmMgKyAoLXggPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSA9ICpzcmNQdHIrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4eCA9IHgwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyB4eCA8IHgxIC0gODsgeHggKz0gOCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKmRlc3RQdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzAgPSBzcmMxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgPSAoKChzcmMwIDw8IDgpIHwgc3JjMSkgPj4gczEpICYgMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9IHNyYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RQdHIrKyA9IChGWF9CWVRFKWRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgPSAqZGVzdFB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMwID0gc3JjMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzcmNQdHIgLSBwTGluZVNyYyA8IG1fblN0cmlkZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxID0gKnNyY1B0cisrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgPSAoKChzcmMwIDw8IDgpIHwgc3JjMSkgPj4gczEpICYgMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ID0gKHNyYyAmIG0yKSB8IChkZXN0ICYgbTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0UHRyID0gKEZYX0JZVEUpZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOworRlhfQk9PTCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VGcm9tKGludDMyX3QgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pCaWcyX0ltYWdlKiBwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQ29tcG9zZU9wIG9wKSB7CisgIGlmICghbV9wRGF0YSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gcFNyYy0+Y29tcG9zZVRvKHRoaXMsIHgsIHksIG9wKTsKIH0KLUZYX0JPT0wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlRnJvbShGWF9JTlQzMiB4LCBGWF9JTlQzMiB5LCBDSkJpZzJfSW1hZ2UgKnBTcmMsIEpCaWcyQ29tcG9zZU9wIG9wKQotewotICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBwU3JjLT5jb21wb3NlVG8odGhpcywgeCwgeSwgb3ApOworRlhfQk9PTCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VGcm9tKGludDMyX3QgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pCaWcyX0ltYWdlKiBwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQ29tcG9zZU9wIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0KSB7CisgIGlmICghbV9wRGF0YSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gcFNyYy0+Y29tcG9zZVRvKHRoaXMsIHgsIHksIG9wLCBwU3JjUmVjdCk7CiB9Ci1GWF9CT09MIENKQmlnMl9JbWFnZTo6Y29tcG9zZUZyb20oRlhfSU5UMzIgeCwgRlhfSU5UMzIgeSwgQ0pCaWcyX0ltYWdlICpwU3JjLCBKQmlnMkNvbXBvc2VPcCBvcCwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QpCi17Ci0gICAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIHBTcmMtPmNvbXBvc2VUbyh0aGlzLCB4LCB5LCBvcCwgcFNyY1JlY3QpOwotfQotQ0pCaWcyX0ltYWdlICpDSkJpZzJfSW1hZ2U6OnN1YkltYWdlX3Vub3B0KEZYX0lOVDMyIHgsIEZYX0lOVDMyIHksIEZYX0lOVDMyIHcsIEZYX0lOVDMyIGgpCi17Ci0gICAgQ0pCaWcyX0ltYWdlICpwSW1hZ2U7Ci0gICAgRlhfSU5UMzIgaSwgajsKLSAgICBKQklHMl9BTExPQyhwSW1hZ2UsIENKQmlnMl9JbWFnZSh3LCBoKSk7Ci0gICAgZm9yKGogPSAwOyBqIDwgaDsgaisrKSB7Ci0gICAgICAgIGZvcihpID0gMDsgaSA8IHc7IGkrKykgewotICAgICAgICAgICAgcEltYWdlLT5zZXRQaXhlbChpLCBqLCBnZXRQaXhlbCh4ICsgaSwgeSArIGopKTsKLSAgICAgICAgfQotICAgIH0KKyNkZWZpbmUgSkJJRzJfR0VURFdPUkQoYnVmKSBcCisgICgoRlhfRFdPUkQpKCgoYnVmKVswXSA8PCAyNCkgfCAoKGJ1ZilbMV0gPDwgMTYpIHwgKChidWYpWzJdIDw8IDgpIHwgKGJ1ZilbM10pKQorQ0pCaWcyX0ltYWdlKiBDSkJpZzJfSW1hZ2U6OnN1YkltYWdlKGludDMyX3QgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaCkgeworICBpbnQzMl90IG0sIG4sIGo7CisgIHVpbnQ4X3QgKnBMaW5lU3JjLCAqcExpbmVEc3Q7CisgIEZYX0RXT1JEIHdUbXA7CisgIHVpbnQ4X3QgKnBTcmMsICpwU3JjRW5kLCAqcERzdCwgKnBEc3RFbmQ7CisgIGlmICh3ID09IDAgfHwgaCA9PSAwKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ0pCaWcyX0ltYWdlKiBwSW1hZ2UgPSBuZXcgQ0pCaWcyX0ltYWdlKHcsIGgpOworICBpZiAoIW1fcERhdGEpIHsKKyAgICBwSW1hZ2UtPmZpbGwoMCk7CiAgICAgcmV0dXJuIHBJbWFnZTsKLX0KLSNkZWZpbmUgSkJJRzJfR0VURFdPUkQoYnVmKQkoKEZYX0RXT1JEKSgoKGJ1ZilbMF0gPDwgMjQpIHwgKChidWYpWzFdIDw8IDE2KSB8ICgoYnVmKVsyXSA8PCA4KSB8IChidWYpWzNdKSkKLUNKQmlnMl9JbWFnZSAqQ0pCaWcyX0ltYWdlOjpzdWJJbWFnZShGWF9JTlQzMiB4LCBGWF9JTlQzMiB5LCBGWF9JTlQzMiB3LCBGWF9JTlQzMiBoKQotewotICAgIENKQmlnMl9JbWFnZSAqcEltYWdlOwotICAgIEZYX0lOVDMyIG0sIG4sIGo7Ci0gICAgRlhfQllURSAqcExpbmVTcmMsICpwTGluZURzdDsKLSAgICBGWF9EV09SRCB3VG1wOwotICAgIEZYX0JZVEUgKnBTcmMsICpwU3JjRW5kLCAqcERzdCwgKnBEc3RFbmQ7Ci0gICAgaWYgKHcgPT0gMCB8fCBoID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEpCSUcyX0FMTE9DKHBJbWFnZSwgQ0pCaWcyX0ltYWdlKHcsIGgpKTsKLSAgICBpZiAoIW1fcERhdGEpIHsKLSAgICAgICAgcEltYWdlLT5maWxsKDApOwotICAgICAgICByZXR1cm4gcEltYWdlOwotICAgIH0KLSAgICBpZiAoIXBJbWFnZS0+bV9wRGF0YSkgewotICAgICAgICByZXR1cm4gcEltYWdlOwotICAgIH0KLSAgICBwTGluZVNyYyA9IG1fcERhdGEgKyBtX25TdHJpZGUgKiB5OwotICAgIHBMaW5lRHN0ID0gcEltYWdlLT5tX3BEYXRhOwotICAgIG0gPSAoeCA+PiA1KSA8PCAyOwotICAgIG4gPSB4ICYgMzE7Ci0gICAgaWYobiA9PSAwKSB7Ci0gICAgICAgIGZvcihqID0gMDsgaiA8IGg7IGorKykgewotICAgICAgICAgICAgcFNyYyA9IHBMaW5lU3JjICsgbTsKLSAgICAgICAgICAgIHBTcmNFbmQgPSBwTGluZVNyYyArIG1fblN0cmlkZTsKLSAgICAgICAgICAgIHBEc3QgPSBwTGluZURzdDsKLSAgICAgICAgICAgIHBEc3RFbmQgPSBwTGluZURzdCArIHBJbWFnZS0+bV9uU3RyaWRlOwotICAgICAgICAgICAgZm9yKDsgcERzdCA8IHBEc3RFbmQ7IHBTcmMgKz0gNCwgcERzdCArPSA0KSB7Ci0gICAgICAgICAgICAgICAgKigoRlhfRFdPUkQgKilwRHN0KSA9ICooKEZYX0RXT1JEICopcFNyYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwTGluZVNyYyArPSBtX25TdHJpZGU7Ci0gICAgICAgICAgICBwTGluZURzdCArPSBwSW1hZ2UtPm1fblN0cmlkZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvcihqID0gMDsgaiA8IGg7IGorKykgewotICAgICAgICAgICAgcFNyYyA9IHBMaW5lU3JjICsgbTsKLSAgICAgICAgICAgIHBTcmNFbmQgPSBwTGluZVNyYyArIG1fblN0cmlkZTsKLSAgICAgICAgICAgIHBEc3QgPSBwTGluZURzdDsKLSAgICAgICAgICAgIHBEc3RFbmQgPSBwTGluZURzdCArIHBJbWFnZS0+bV9uU3RyaWRlOwotICAgICAgICAgICAgZm9yKDsgcERzdCA8IHBEc3RFbmQ7IHBTcmMgKz0gNCwgcERzdCArPSA0KSB7Ci0gICAgICAgICAgICAgICAgaWYocFNyYyArIDQgPCBwU3JjRW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdUbXAgPSAoSkJJRzJfR0VURFdPUkQocFNyYykgPDwgbikgfCAoSkJJRzJfR0VURFdPUkQocFNyYyArIDQpID4+ICgzMiAtIG4pKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB3VG1wID0gSkJJRzJfR0VURFdPUkQocFNyYykgPDwgbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcERzdFswXSA9IChGWF9CWVRFKSh3VG1wID4+IDI0KTsKLSAgICAgICAgICAgICAgICBwRHN0WzFdID0gKEZYX0JZVEUpKHdUbXAgPj4gMTYpOwotICAgICAgICAgICAgICAgIHBEc3RbMl0gPSAoRlhfQllURSkod1RtcCA+PiA4KTsKLSAgICAgICAgICAgICAgICBwRHN0WzNdID0gKEZYX0JZVEUpd1RtcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBMaW5lU3JjICs9IG1fblN0cmlkZTsKLSAgICAgICAgICAgIHBMaW5lRHN0ICs9IHBJbWFnZS0+bV9uU3RyaWRlOwotICAgICAgICB9Ci0gICAgfQorICB9CisgIGlmICghcEltYWdlLT5tX3BEYXRhKSB7CiAgICAgcmV0dXJuIHBJbWFnZTsKKyAgfQorICBwTGluZVNyYyA9IG1fcERhdGEgKyBtX25TdHJpZGUgKiB5OworICBwTGluZURzdCA9IHBJbWFnZS0+bV9wRGF0YTsKKyAgbSA9ICh4ID4+IDUpIDw8IDI7CisgIG4gPSB4ICYgMzE7CisgIGlmIChuID09IDApIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgaDsgaisrKSB7CisgICAgICBwU3JjID0gcExpbmVTcmMgKyBtOworICAgICAgcFNyY0VuZCA9IHBMaW5lU3JjICsgbV9uU3RyaWRlOworICAgICAgcERzdCA9IHBMaW5lRHN0OworICAgICAgcERzdEVuZCA9IHBMaW5lRHN0ICsgcEltYWdlLT5tX25TdHJpZGU7CisgICAgICBmb3IgKDsgcERzdCA8IHBEc3RFbmQ7IHBTcmMgKz0gNCwgcERzdCArPSA0KSB7CisgICAgICAgICooKEZYX0RXT1JEKilwRHN0KSA9ICooKEZYX0RXT1JEKilwU3JjKTsKKyAgICAgIH0KKyAgICAgIHBMaW5lU3JjICs9IG1fblN0cmlkZTsKKyAgICAgIHBMaW5lRHN0ICs9IHBJbWFnZS0+bV9uU3RyaWRlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgaDsgaisrKSB7CisgICAgICBwU3JjID0gcExpbmVTcmMgKyBtOworICAgICAgcFNyY0VuZCA9IHBMaW5lU3JjICsgbV9uU3RyaWRlOworICAgICAgcERzdCA9IHBMaW5lRHN0OworICAgICAgcERzdEVuZCA9IHBMaW5lRHN0ICsgcEltYWdlLT5tX25TdHJpZGU7CisgICAgICBmb3IgKDsgcERzdCA8IHBEc3RFbmQ7IHBTcmMgKz0gNCwgcERzdCArPSA0KSB7CisgICAgICAgIGlmIChwU3JjICsgNCA8IHBTcmNFbmQpIHsKKyAgICAgICAgICB3VG1wID0gKEpCSUcyX0dFVERXT1JEKHBTcmMpIDw8IG4pIHwKKyAgICAgICAgICAgICAgICAgKEpCSUcyX0dFVERXT1JEKHBTcmMgKyA0KSA+PiAoMzIgLSBuKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgd1RtcCA9IEpCSUcyX0dFVERXT1JEKHBTcmMpIDw8IG47CisgICAgICAgIH0KKyAgICAgICAgcERzdFswXSA9ICh1aW50OF90KSh3VG1wID4+IDI0KTsKKyAgICAgICAgcERzdFsxXSA9ICh1aW50OF90KSh3VG1wID4+IDE2KTsKKyAgICAgICAgcERzdFsyXSA9ICh1aW50OF90KSh3VG1wID4+IDgpOworICAgICAgICBwRHN0WzNdID0gKHVpbnQ4X3Qpd1RtcDsKKyAgICAgIH0KKyAgICAgIHBMaW5lU3JjICs9IG1fblN0cmlkZTsKKyAgICAgIHBMaW5lRHN0ICs9IHBJbWFnZS0+bV9uU3RyaWRlOworICAgIH0KKyAgfQorICByZXR1cm4gcEltYWdlOwogfQotdm9pZCBDSkJpZzJfSW1hZ2U6OmV4cGFuZChGWF9JTlQzMiBoLCBGWF9CT09MIHYpCi17Ci0gICAgaWYgKCFtX3BEYXRhIHx8IGggPD0gbV9uSGVpZ2h0KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfRFdPUkQgZHdIID0gcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlhfRFdPUkQ+KGgpOwotICAgIEZYX0RXT1JEIGR3U3RyaWRlID0gcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlhfRFdPUkQ+KG1fblN0cmlkZSk7Ci0gICAgRlhfRFdPUkQgZHdIZWlnaHQgPSBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxGWF9EV09SRD4obV9uSGVpZ2h0KTsKLSAgICBGWF9TQUZFX0RXT1JEIHNhZmVNZW1TaXplID0gZHdIOyAKLSAgICBzYWZlTWVtU2l6ZSAqPSBkd1N0cmlkZTsKLSAgICBpZiAoIXNhZmVNZW1TaXplLklzVmFsaWQoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vVGhlIGd1YXJhbnRlZWQgcmVhbGxvY2F0ZWQgbWVtb3J5IGlzIHRvIGJlIDwgNEdCICh1bnNpZ25lZCBpbnQpLiAKLSAgICBtX3BEYXRhID0gKEZYX0JZVEUqKW1fcE1vZHVsZS0+SkJpZzJfUmVhbGxvYyhtX3BEYXRhLCBzYWZlTWVtU2l6ZS5WYWx1ZU9yRGllKCkpOwotICAgIC8vVGhlIHJlc3VsdCBvZiBkd0hlaWdodCAqIGR3U3RyaWRlIGRvZXNuJ3Qgb3ZlcmZsb3cgYWZ0ZXIgdGhlIAotICAgIC8vY2hlY2tpbmcgb2Ygc2FmZU1lbVNpemUuCi0gICAgLy9UaGUgc2FtZSBhcyB0aGUgcmVzdWx0IG9mIChkd0ggLSBkd0hlaWdodCkgKiBkd1N0cmlkZSkgYmVjYXVzZQotICAgIC8vZHdIIC0gZHdIZWlnaHQgaXMgYWx3YXlzIGxlc3MgdGhhbiBkd0goaCkgd2hpY2ggaXMgY2hlY2tlZCBpbgotICAgIC8vdGhlIGNhbGN1bGF0aW9uIG9mIGR3SCAqIGR3U3RyaWRlLiAKLSAgICBKQklHMl9tZW1zZXQobV9wRGF0YSArIGR3SGVpZ2h0ICogZHdTdHJpZGUsIHYgPyAweGZmIDogMCwgKGR3SCAtIGR3SGVpZ2h0KSAqIGR3U3RyaWRlKTsKLSAgICBtX25IZWlnaHQgPSBoOwordm9pZCBDSkJpZzJfSW1hZ2U6OmV4cGFuZChpbnQzMl90IGgsIEZYX0JPT0wgdikgeworICBpZiAoIW1fcERhdGEgfHwgaCA8PSBtX25IZWlnaHQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfRFdPUkQgZHdIID0gcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlhfRFdPUkQ+KGgpOworICBGWF9EV09SRCBkd1N0cmlkZSA9IHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PEZYX0RXT1JEPihtX25TdHJpZGUpOworICBGWF9EV09SRCBkd0hlaWdodCA9IHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PEZYX0RXT1JEPihtX25IZWlnaHQpOworICBGWF9TQUZFX0RXT1JEIHNhZmVNZW1TaXplID0gZHdIOworICBzYWZlTWVtU2l6ZSAqPSBkd1N0cmlkZTsKKyAgaWYgKCFzYWZlTWVtU2l6ZS5Jc1ZhbGlkKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gVGhlIGd1YXJhbnRlZWQgcmVhbGxvY2F0ZWQgbWVtb3J5IGlzIHRvIGJlIDwgNEdCICh1bnNpZ25lZCBpbnQpLgorICBtX3BEYXRhID0gRlhfUmVhbGxvYyh1aW50OF90LCBtX3BEYXRhLCBzYWZlTWVtU2l6ZS5WYWx1ZU9yRGllKCkpOworCisgIC8vIFRoZSByZXN1bHQgb2YgZHdIZWlnaHQgKiBkd1N0cmlkZSBkb2Vzbid0IG92ZXJmbG93IGFmdGVyIHRoZQorICAvLyBjaGVja2luZyBvZiBzYWZlTWVtU2l6ZS4KKyAgLy8gVGhlIHNhbWUgYXMgdGhlIHJlc3VsdCBvZiAoZHdIIC0gZHdIZWlnaHQpICogZHdTdHJpZGUpIGJlY2F1c2UKKyAgLy8gZHdIIC0gZHdIZWlnaHQgaXMgYWx3YXlzIGxlc3MgdGhhbiBkd0goaCkgd2hpY2ggaXMgY2hlY2tlZCBpbgorICAvLyB0aGUgY2FsY3VsYXRpb24gb2YgZHdIICogZHdTdHJpZGUuCisgIEpCSUcyX21lbXNldChtX3BEYXRhICsgZHdIZWlnaHQgKiBkd1N0cmlkZSwgdiA/IDB4ZmYgOiAwLAorICAgICAgICAgICAgICAgKGR3SCAtIGR3SGVpZ2h0KSAqIGR3U3RyaWRlKTsKKyAgbV9uSGVpZ2h0ID0gaDsKIH0KLUZYX0JPT0wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlVG9fb3B0MihDSkJpZzJfSW1hZ2UgKnBEc3QsIEZYX0lOVDMyIHgsIEZYX0lOVDMyIHksIEpCaWcyQ29tcG9zZU9wIG9wKQotewotICAgIEZYX0lOVDMyIHhzMCA9IDAsIHlzMCAgPSAwLCB4czEgID0gMCwgeXMxICAgPSAwLCB4ZDAgICAgPSAwLCB5ZDAgICAgICAgICAgPSAwLCB4ZDEgICAgICA9IDAsIAotICAgICAgICAgICAgIHlkMSA9IDAsIHh4ICAgPSAwLCB5eSAgID0gMCwgdyAgICAgPSAwLCBoICAgICAgPSAwLCBtaWRkbGVEd29yZHMgPSAwLCBsaW5lTGVmdCA9IDA7CitGWF9CT09MIENKQmlnMl9JbWFnZTo6Y29tcG9zZVRvX29wdDIoQ0pCaWcyX0ltYWdlKiBwRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJDb21wb3NlT3Agb3ApIHsKKyAgaW50MzJfdCB4czAgPSAwLCB5czAgPSAwLCB4czEgPSAwLCB5czEgPSAwLCB4ZDAgPSAwLCB5ZDAgPSAwLCB4ZDEgPSAwLAorICAgICAgICAgIHlkMSA9IDAsIHh4ID0gMCwgeXkgPSAwLCB3ID0gMCwgaCA9IDAsIG1pZGRsZUR3b3JkcyA9IDAsIGxpbmVMZWZ0ID0gMDsKIAotICAgIEZYX0RXT1JEIHMxICA9IDAsIGQxICAgPSAwLCBkMiAgID0gMCwgc2hpZnQgPSAwLCBzaGlmdDEgPSAwLCBzaGlmdDIgICAgICAgPSAwLCAKLSAgICAgICAgICAgICB0bXAgPSAwLCB0bXAxID0gMCwgdG1wMiA9IDAsIG1hc2tMID0gMCwgbWFza1IgID0gMCwgbWFza00gICAgICAgID0gMDsKKyAgRlhfRFdPUkQgczEgPSAwLCBkMSA9IDAsIGQyID0gMCwgc2hpZnQgPSAwLCBzaGlmdDEgPSAwLCBzaGlmdDIgPSAwLCB0bXAgPSAwLAorICAgICAgICAgICB0bXAxID0gMCwgdG1wMiA9IDAsIG1hc2tMID0gMCwgbWFza1IgPSAwLCBtYXNrTSA9IDA7CiAKLSAgICBGWF9CWVRFICpsaW5lU3JjID0gTlVMTCwgKmxpbmVEc3QgPSBOVUxMLCAqc3AgPSBOVUxMLCAqZHAgPSBOVUxMOworICB1aW50OF90ICpsaW5lU3JjID0gTlVMTCwgKmxpbmVEc3QgPSBOVUxMLCAqc3AgPSBOVUxMLCAqZHAgPSBOVUxMOwogCi0gICAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKHggPCAtMTA0ODU3NiB8fCB4ID4gMTA0ODU3NiB8fCB5IDwgLTEwNDg1NzYgfHwgeSA+IDEwNDg1NzYpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZih5IDwgMCkgewotICAgICAgICB5czAgPSAteTsKLSAgICB9Ci0gICAgaWYoeSArIG1fbkhlaWdodCA+IHBEc3QtPm1fbkhlaWdodCkgewotICAgICAgICB5czEgPSBwRHN0LT5tX25IZWlnaHQgLSB5OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHlzMSA9IG1fbkhlaWdodDsKLSAgICB9Ci0gICAgaWYoeCA8IDApIHsKLSAgICAgICAgeHMwID0gLXg7Ci0gICAgfQotICAgIGlmKHggKyBtX25XaWR0aCA+IHBEc3QtPm1fbldpZHRoKSB7Ci0gICAgICAgIHhzMSA9IHBEc3QtPm1fbldpZHRoIC0geDsKLSAgICB9IGVsc2UgewotICAgICAgICB4czEgPSBtX25XaWR0aDsKLSAgICB9Ci0gICAgaWYoKHlzMCA+PSB5czEpIHx8ICh4czAgPj0geHMxKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgdyA9IHhzMSAtIHhzMDsKLSAgICBoID0geXMxIC0geXMwOwotICAgIGlmKHkgPj0gMCkgewotICAgICAgICB5ZDAgPSB5OwotICAgIH0gCi0gICAgaWYoeCA+PSAwKSB7Ci0gICAgICAgIHhkMCA9IHg7Ci0gICAgfQotICAgIHhkMSA9IHhkMCArIHc7Ci0gICAgeWQxID0geWQwICsgaDsKLSAgICBkMSA9IHhkMCAmIDMxOwotICAgIGQyID0geGQxICYgMzE7Ci0gICAgczEgPSB4czAgJiAzMTsKLSAgICBtYXNrTCA9IDB4ZmZmZmZmZmYgPj4gZDE7Ci0gICAgbWFza1IgPSAweGZmZmZmZmZmIDw8ICgoMzIgLSAoeGQxICYgMzEpKSAlIDMyKTsKLSAgICBtYXNrTSA9IG1hc2tMICYgbWFza1I7Ci0gICAgbGluZVNyYyA9IG1fcERhdGEgKyB5czAgKiBtX25TdHJpZGUgKyAoKHhzMCA+PiA1KSA8PCAyKTsKLSAgICBsaW5lTGVmdCA9IG1fblN0cmlkZSAtICgoeHMwID4+IDUpIDw8IDIpOwotICAgIGxpbmVEc3QgPSBwRHN0LT5tX3BEYXRhICsgeWQwICogcERzdC0+bV9uU3RyaWRlICsgKCh4ZDAgPj4gNSkgPDwgMik7Ci0gICAgaWYoKHhkMCAmIH4zMSkgPT0gKCh4ZDEgLSAxKSAmIH4zMSkpIHsKLSAgICAgICAgaWYoKHhzMCAmIH4zMSkgPT0gKCh4czEgLSAxKSAmIH4zMSkpIHsKLSAgICAgICAgICAgIGlmKHMxID4gZDEpIHsKLSAgICAgICAgICAgICAgICBzaGlmdCA9IHMxIC0gZDE7Ci0gICAgICAgICAgICAgICAgZm9yKHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgewotICAgICAgICAgICAgICAgICAgICB0bXAxID0gSkJJRzJfR0VURFdPUkQobGluZVNyYykgPDwgc2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChsaW5lRHN0KTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh0bXAxIHwgdG1wMikgJiBtYXNrTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza00pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tNKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgofih0bXAxIF4gdG1wMikpICYgbWFza00pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKHRtcDEgJiBtYXNrTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbGluZURzdFswXSA9IChGWF9CWVRFKSh0bXAgPj4gMjQpOwotICAgICAgICAgICAgICAgICAgICBsaW5lRHN0WzFdID0gKEZYX0JZVEUpKHRtcCA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVEc3RbMl0gPSAoRlhfQllURSkodG1wID4+IDgpOwotICAgICAgICAgICAgICAgICAgICBsaW5lRHN0WzNdID0gKEZYX0JZVEUpdG1wOwotICAgICAgICAgICAgICAgICAgICBsaW5lU3JjICs9IG1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgbGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzaGlmdCA9IGQxIC0gczE7Ci0gICAgICAgICAgICAgICAgZm9yKHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgewotICAgICAgICAgICAgICAgICAgICB0bXAxID0gSkJJRzJfR0VURFdPUkQobGluZVNyYykgPj4gc2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChsaW5lRHN0KTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh0bXAxIHwgdG1wMikgJiBtYXNrTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza00pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tNKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgofih0bXAxIF4gdG1wMikpICYgbWFza00pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKHRtcDEgJiBtYXNrTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbGluZURzdFswXSA9IChGWF9CWVRFKSh0bXAgPj4gMjQpOwotICAgICAgICAgICAgICAgICAgICBsaW5lRHN0WzFdID0gKEZYX0JZVEUpKHRtcCA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVEc3RbMl0gPSAoRlhfQllURSkodG1wID4+IDgpOwotICAgICAgICAgICAgICAgICAgICBsaW5lRHN0WzNdID0gKEZYX0JZVEUpdG1wOwotICAgICAgICAgICAgICAgICAgICBsaW5lU3JjICs9IG1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgbGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2hpZnQxID0gczEgLSBkMTsKLSAgICAgICAgICAgIHNoaWZ0MiA9IDMyIC0gc2hpZnQxOwotICAgICAgICAgICAgZm9yKHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgewotICAgICAgICAgICAgICAgIHRtcDEgPSAoSkJJRzJfR0VURFdPUkQobGluZVNyYykgPDwgc2hpZnQxKSB8IChKQklHMl9HRVREV09SRChsaW5lU3JjICsgNCkgPj4gc2hpZnQyKTsKLSAgICAgICAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQobGluZURzdCk7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza00pOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKHRtcDEgJiB0bXAyKSAmIG1hc2tNKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh0bXAxIF4gdG1wMikgJiBtYXNrTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKH4odG1wMSBeIHRtcDIpKSAmIG1hc2tNKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICh0bXAxICYgbWFza00pOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmVEc3RbMF0gPSAoRlhfQllURSkodG1wID4+IDI0KTsKLSAgICAgICAgICAgICAgICBsaW5lRHN0WzFdID0gKEZYX0JZVEUpKHRtcCA+PiAxNik7Ci0gICAgICAgICAgICAgICAgbGluZURzdFsyXSA9IChGWF9CWVRFKSh0bXAgPj4gOCk7Ci0gICAgICAgICAgICAgICAgbGluZURzdFszXSA9IChGWF9CWVRFKXRtcDsKLSAgICAgICAgICAgICAgICBsaW5lU3JjICs9IG1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICBsaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKLSAgICAgICAgICAgIH0KKyAgaWYgKCFtX3BEYXRhKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICh4IDwgLTEwNDg1NzYgfHwgeCA+IDEwNDg1NzYgfHwgeSA8IC0xMDQ4NTc2IHx8IHkgPiAxMDQ4NTc2KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICh5IDwgMCkgeworICAgIHlzMCA9IC15OworICB9CisgIGlmICh5ICsgbV9uSGVpZ2h0ID4gcERzdC0+bV9uSGVpZ2h0KSB7CisgICAgeXMxID0gcERzdC0+bV9uSGVpZ2h0IC0geTsKKyAgfSBlbHNlIHsKKyAgICB5czEgPSBtX25IZWlnaHQ7CisgIH0KKyAgaWYgKHggPCAwKSB7CisgICAgeHMwID0gLXg7CisgIH0KKyAgaWYgKHggKyBtX25XaWR0aCA+IHBEc3QtPm1fbldpZHRoKSB7CisgICAgeHMxID0gcERzdC0+bV9uV2lkdGggLSB4OworICB9IGVsc2UgeworICAgIHhzMSA9IG1fbldpZHRoOworICB9CisgIGlmICgoeXMwID49IHlzMSkgfHwgKHhzMCA+PSB4czEpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgdyA9IHhzMSAtIHhzMDsKKyAgaCA9IHlzMSAtIHlzMDsKKyAgaWYgKHkgPj0gMCkgeworICAgIHlkMCA9IHk7CisgIH0KKyAgaWYgKHggPj0gMCkgeworICAgIHhkMCA9IHg7CisgIH0KKyAgeGQxID0geGQwICsgdzsKKyAgeWQxID0geWQwICsgaDsKKyAgZDEgPSB4ZDAgJiAzMTsKKyAgZDIgPSB4ZDEgJiAzMTsKKyAgczEgPSB4czAgJiAzMTsKKyAgbWFza0wgPSAweGZmZmZmZmZmID4+IGQxOworICBtYXNrUiA9IDB4ZmZmZmZmZmYgPDwgKCgzMiAtICh4ZDEgJiAzMSkpICUgMzIpOworICBtYXNrTSA9IG1hc2tMICYgbWFza1I7CisgIGxpbmVTcmMgPSBtX3BEYXRhICsgeXMwICogbV9uU3RyaWRlICsgKCh4czAgPj4gNSkgPDwgMik7CisgIGxpbmVMZWZ0ID0gbV9uU3RyaWRlIC0gKCh4czAgPj4gNSkgPDwgMik7CisgIGxpbmVEc3QgPSBwRHN0LT5tX3BEYXRhICsgeWQwICogcERzdC0+bV9uU3RyaWRlICsgKCh4ZDAgPj4gNSkgPDwgMik7CisgIGlmICgoeGQwICYgfjMxKSA9PSAoKHhkMSAtIDEpICYgfjMxKSkgeworICAgIGlmICgoeHMwICYgfjMxKSA9PSAoKHhzMSAtIDEpICYgfjMxKSkgeworICAgICAgaWYgKHMxID4gZDEpIHsKKyAgICAgICAgc2hpZnQgPSBzMSAtIGQxOworICAgICAgICBmb3IgKHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgeworICAgICAgICAgIHRtcDEgPSBKQklHMl9HRVREV09SRChsaW5lU3JjKSA8PCBzaGlmdDsKKyAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQobGluZURzdCk7CisgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tNKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKHRtcDEgJiB0bXAyKSAmIG1hc2tNKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tNKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh+KHRtcDEgXiB0bXAyKSkgJiBtYXNrTSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICh0bXAxICYgbWFza00pOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgbGluZURzdFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOworICAgICAgICAgIGxpbmVEc3RbMV0gPSAodWludDhfdCkodG1wID4+IDE2KTsKKyAgICAgICAgICBsaW5lRHN0WzJdID0gKHVpbnQ4X3QpKHRtcCA+PiA4KTsKKyAgICAgICAgICBsaW5lRHN0WzNdID0gKHVpbnQ4X3QpdG1wOworICAgICAgICAgIGxpbmVTcmMgKz0gbV9uU3RyaWRlOworICAgICAgICAgIGxpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYoczEgPiBkMSkgewotICAgICAgICAgICAgc2hpZnQxID0gczEgLSBkMTsKLSAgICAgICAgICAgIHNoaWZ0MiA9IDMyIC0gc2hpZnQxOwotICAgICAgICAgICAgbWlkZGxlRHdvcmRzID0gKHhkMSA+PiA1KSAtICgoeGQwICsgMzEpID4+IDUpOwotICAgICAgICAgICAgZm9yKHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgewotICAgICAgICAgICAgICAgIHNwID0gbGluZVNyYzsKLSAgICAgICAgICAgICAgICBkcCA9IGxpbmVEc3Q7Ci0gICAgICAgICAgICAgICAgaWYoZDEgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0bXAxID0gKEpCSUcyX0dFVERXT1JEKHNwKSA8PCBzaGlmdDEpIHwgKEpCSUcyX0dFVERXT1JEKHNwICsgNCkgPj4gc2hpZnQyKTsKLSAgICAgICAgICAgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh0bXAxIHwgdG1wMikgJiBtYXNrTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza0wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgofih0bXAxIF4gdG1wMikpICYgbWFza0wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKHRtcDEgJiBtYXNrTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZHBbMF0gPSAoRlhfQllURSkodG1wID4+IDI0KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbMV0gPSAoRlhfQllURSkodG1wID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbMl0gPSAoRlhfQllURSkodG1wID4+IDgpOwotICAgICAgICAgICAgICAgICAgICBkcFszXSA9IChGWF9CWVRFKXRtcDsKLSAgICAgICAgICAgICAgICAgICAgc3AgKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgZHAgKz0gNDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yKHh4ID0gMDsgeHggPCBtaWRkbGVEd29yZHM7IHh4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wMSA9IChKQklHMl9HRVREV09SRChzcCkgPDwgc2hpZnQxKSB8IChKQklHMl9HRVREV09SRChzcCArIDQpID4+IHNoaWZ0Mik7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChvcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRtcDEgfCB0bXAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0bXAxICYgdG1wMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdG1wMSBeIHRtcDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB+KHRtcDEgXiB0bXAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRtcDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZHBbMF0gPSAoRlhfQllURSkodG1wID4+IDI0KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbMV0gPSAoRlhfQllURSkodG1wID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbMl0gPSAoRlhfQllURSkodG1wID4+IDgpOwotICAgICAgICAgICAgICAgICAgICBkcFszXSA9IChGWF9CWVRFKXRtcDsKLSAgICAgICAgICAgICAgICAgICAgc3AgKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgZHAgKz0gNDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoZDIgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0bXAxID0gKEpCSUcyX0dFVERXT1JEKHNwKSA8PCBzaGlmdDEpIHwgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc3AgKyA0KSA8IGxpbmVTcmMgKyBsaW5lTGVmdCA/IEpCSUcyX0dFVERXT1JEKHNwICsgNCkgOiAwKSA+PiBzaGlmdDIpOwotICAgICAgICAgICAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2gob3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh0bXAxICYgdG1wMikgJiBtYXNrUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSBeIHRtcDIpICYgbWFza1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh+KHRtcDEgXiB0bXAyKSkgJiBtYXNrUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAodG1wMSAmIG1hc2tSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkcFswXSA9IChGWF9CWVRFKSh0bXAgPj4gMjQpOwotICAgICAgICAgICAgICAgICAgICBkcFsxXSA9IChGWF9CWVRFKSh0bXAgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICBkcFsyXSA9IChGWF9CWVRFKSh0bXAgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzNdID0gKEZYX0JZVEUpdG1wOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lU3JjICs9IG1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICBsaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmKHMxID09IGQxKSB7Ci0gICAgICAgICAgICBtaWRkbGVEd29yZHMgPSAoeGQxID4+IDUpIC0gKCh4ZDAgKyAzMSkgPj4gNSk7Ci0gICAgICAgICAgICBmb3IoeXkgPSB5ZDA7IHl5IDwgeWQxOyB5eSsrKSB7Ci0gICAgICAgICAgICAgICAgc3AgPSBsaW5lU3JjOwotICAgICAgICAgICAgICAgIGRwID0gbGluZURzdDsKLSAgICAgICAgICAgICAgICBpZihkMSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDEgPSBKQklHMl9HRVREV09SRChzcCk7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChvcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza0wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgJiB0bXAyKSAmIG1hc2tMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh0bXAxIF4gdG1wMikgJiBtYXNrTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKH4odG1wMSBeIHRtcDIpKSAmIG1hc2tMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICh0bXAxICYgbWFza0wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRwWzBdID0gKEZYX0JZVEUpKHRtcCA+PiAyNCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzFdID0gKEZYX0JZVEUpKHRtcCA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzJdID0gKEZYX0JZVEUpKHRtcCA+PiA4KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbM10gPSAoRlhfQllURSl0bXA7Ci0gICAgICAgICAgICAgICAgICAgIHNwICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIGRwICs9IDQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvcih4eCA9IDA7IHh4IDwgbWlkZGxlRHdvcmRzOyB4eCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDEgPSBKQklHMl9HRVREV09SRChzcCk7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChvcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRtcDEgfCB0bXAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0bXAxICYgdG1wMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdG1wMSBeIHRtcDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB+KHRtcDEgXiB0bXAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRtcDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZHBbMF0gPSAoRlhfQllURSkodG1wID4+IDI0KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbMV0gPSAoRlhfQllURSkodG1wID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbMl0gPSAoRlhfQllURSkodG1wID4+IDgpOwotICAgICAgICAgICAgICAgICAgICBkcFszXSA9IChGWF9CWVRFKXRtcDsKLSAgICAgICAgICAgICAgICAgICAgc3AgKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgZHAgKz0gNDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoZDIgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0bXAxID0gSkJJRzJfR0VURFdPUkQoc3ApOwotICAgICAgICAgICAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2gob3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh0bXAxICYgdG1wMikgJiBtYXNrUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSBeIHRtcDIpICYgbWFza1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh+KHRtcDEgXiB0bXAyKSkgJiBtYXNrUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAodG1wMSAmIG1hc2tSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkcFswXSA9IChGWF9CWVRFKSh0bXAgPj4gMjQpOwotICAgICAgICAgICAgICAgICAgICBkcFsxXSA9IChGWF9CWVRFKSh0bXAgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICBkcFsyXSA9IChGWF9CWVRFKSh0bXAgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzNdID0gKEZYX0JZVEUpdG1wOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lU3JjICs9IG1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICBsaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNoaWZ0MSA9IGQxIC0gczE7Ci0gICAgICAgICAgICBzaGlmdDIgPSAzMiAtIHNoaWZ0MTsKLSAgICAgICAgICAgIG1pZGRsZUR3b3JkcyA9ICh4ZDEgPj4gNSkgLSAoKHhkMCArIDMxKSA+PiA1KTsKLSAgICAgICAgICAgIGZvcih5eSA9IHlkMDsgeXkgPCB5ZDE7IHl5KyspIHsKLSAgICAgICAgICAgICAgICBzcCA9IGxpbmVTcmM7Ci0gICAgICAgICAgICAgICAgZHAgPSBsaW5lRHN0OwotICAgICAgICAgICAgICAgIGlmKGQxICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wMSA9IEpCSUcyX0dFVERXT1JEKHNwKSA+PiBzaGlmdDE7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChvcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza0wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgJiB0bXAyKSAmIG1hc2tMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh0bXAxIF4gdG1wMikgJiBtYXNrTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKH4odG1wMSBeIHRtcDIpKSAmIG1hc2tMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICh0bXAxICYgbWFza0wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRwWzBdID0gKEZYX0JZVEUpKHRtcCA+PiAyNCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzFdID0gKEZYX0JZVEUpKHRtcCA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzJdID0gKEZYX0JZVEUpKHRtcCA+PiA4KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbM10gPSAoRlhfQllURSl0bXA7Ci0gICAgICAgICAgICAgICAgICAgIGRwICs9IDQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvcih4eCA9IDA7IHh4IDwgbWlkZGxlRHdvcmRzOyB4eCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDEgPSAoSkJJRzJfR0VURFdPUkQoc3ApIDw8IHNoaWZ0MikgfCAoKEpCSUcyX0dFVERXT1JEKHNwICsgNCkpID4+IHNoaWZ0MSk7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChvcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRtcDEgfCB0bXAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0bXAxICYgdG1wMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdG1wMSBeIHRtcDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB+KHRtcDEgXiB0bXAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRtcDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZHBbMF0gPSAoRlhfQllURSkodG1wID4+IDI0KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbMV0gPSAoRlhfQllURSkodG1wID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbMl0gPSAoRlhfQllURSkodG1wID4+IDgpOwotICAgICAgICAgICAgICAgICAgICBkcFszXSA9IChGWF9CWVRFKXRtcDsKLSAgICAgICAgICAgICAgICAgICAgc3AgKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgZHAgKz0gNDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoZDIgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0bXAxID0gKEpCSUcyX0dFVERXT1JEKHNwKSA8PCBzaGlmdDIpIHwgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc3AgKyA0KSA8IGxpbmVTcmMgKyBsaW5lTGVmdCA/IEpCSUcyX0dFVERXT1JEKHNwICsgNCkgOiAwKSA+PiBzaGlmdDEpOwotICAgICAgICAgICAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2gob3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh0bXAxICYgdG1wMikgJiBtYXNrUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSBeIHRtcDIpICYgbWFza1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh+KHRtcDEgXiB0bXAyKSkgJiBtYXNrUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAodG1wMSAmIG1hc2tSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkcFswXSA9IChGWF9CWVRFKSh0bXAgPj4gMjQpOwotICAgICAgICAgICAgICAgICAgICBkcFsxXSA9IChGWF9CWVRFKSh0bXAgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICBkcFsyXSA9IChGWF9CWVRFKSh0bXAgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzNdID0gKEZYX0JZVEUpdG1wOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaW5lU3JjICs9IG1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICBsaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKLSAgICAgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNoaWZ0ID0gZDEgLSBzMTsKKyAgICAgICAgZm9yICh5eSA9IHlkMDsgeXkgPCB5ZDE7IHl5KyspIHsKKyAgICAgICAgICB0bXAxID0gSkJJRzJfR0VURFdPUkQobGluZVNyYykgPj4gc2hpZnQ7CisgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGxpbmVEc3QpOworICAgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh0bXAxIHwgdG1wMikgJiBtYXNrTSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh0bXAxICYgdG1wMikgJiBtYXNrTSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh0bXAxIF4gdG1wMikgJiBtYXNrTSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgofih0bXAxIF4gdG1wMikpICYgbWFza00pOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAodG1wMSAmIG1hc2tNKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGxpbmVEc3RbMF0gPSAodWludDhfdCkodG1wID4+IDI0KTsKKyAgICAgICAgICBsaW5lRHN0WzFdID0gKHVpbnQ4X3QpKHRtcCA+PiAxNik7CisgICAgICAgICAgbGluZURzdFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7CisgICAgICAgICAgbGluZURzdFszXSA9ICh1aW50OF90KXRtcDsKKyAgICAgICAgICBsaW5lU3JjICs9IG1fblN0cmlkZTsKKyAgICAgICAgICBsaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKICAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzaGlmdDEgPSBzMSAtIGQxOworICAgICAgc2hpZnQyID0gMzIgLSBzaGlmdDE7CisgICAgICBmb3IgKHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgeworICAgICAgICB0bXAxID0gKEpCSUcyX0dFVERXT1JEKGxpbmVTcmMpIDw8IHNoaWZ0MSkgfAorICAgICAgICAgICAgICAgKEpCSUcyX0dFVERXT1JEKGxpbmVTcmMgKyA0KSA+PiBzaGlmdDIpOworICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQobGluZURzdCk7CisgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6CisgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tNKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6CisgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKHRtcDEgJiB0bXAyKSAmIG1hc2tNKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6CisgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tNKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgorICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh+KHRtcDEgXiB0bXAyKSkgJiBtYXNrTSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKKyAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICh0bXAxICYgbWFza00pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbGluZURzdFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOworICAgICAgICBsaW5lRHN0WzFdID0gKHVpbnQ4X3QpKHRtcCA+PiAxNik7CisgICAgICAgIGxpbmVEc3RbMl0gPSAodWludDhfdCkodG1wID4+IDgpOworICAgICAgICBsaW5lRHN0WzNdID0gKHVpbnQ4X3QpdG1wOworICAgICAgICBsaW5lU3JjICs9IG1fblN0cmlkZTsKKyAgICAgICAgbGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiAxOworICB9IGVsc2UgeworICAgIGlmIChzMSA+IGQxKSB7CisgICAgICBzaGlmdDEgPSBzMSAtIGQxOworICAgICAgc2hpZnQyID0gMzIgLSBzaGlmdDE7CisgICAgICBtaWRkbGVEd29yZHMgPSAoeGQxID4+IDUpIC0gKCh4ZDAgKyAzMSkgPj4gNSk7CisgICAgICBmb3IgKHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgeworICAgICAgICBzcCA9IGxpbmVTcmM7CisgICAgICAgIGRwID0gbGluZURzdDsKKyAgICAgICAgaWYgKGQxICE9IDApIHsKKyAgICAgICAgICB0bXAxID0gKEpCSUcyX0dFVERXT1JEKHNwKSA8PCBzaGlmdDEpIHwKKyAgICAgICAgICAgICAgICAgKEpCSUcyX0dFVERXT1JEKHNwICsgNCkgPj4gc2hpZnQyKTsKKyAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOworICAgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh0bXAxIHwgdG1wMikgJiBtYXNrTCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh0bXAxICYgdG1wMikgJiBtYXNrTCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh0bXAxIF4gdG1wMikgJiBtYXNrTCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgofih0bXAxIF4gdG1wMikpICYgbWFza0wpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAodG1wMSAmIG1hc2tMKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGRwWzBdID0gKHVpbnQ4X3QpKHRtcCA+PiAyNCk7CisgICAgICAgICAgZHBbMV0gPSAodWludDhfdCkodG1wID4+IDE2KTsKKyAgICAgICAgICBkcFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7CisgICAgICAgICAgZHBbM10gPSAodWludDhfdCl0bXA7CisgICAgICAgICAgc3AgKz0gNDsKKyAgICAgICAgICBkcCArPSA0OworICAgICAgICB9CisgICAgICAgIGZvciAoeHggPSAwOyB4eCA8IG1pZGRsZUR3b3JkczsgeHgrKykgeworICAgICAgICAgIHRtcDEgPSAoSkJJRzJfR0VURFdPUkQoc3ApIDw8IHNoaWZ0MSkgfAorICAgICAgICAgICAgICAgICAoSkJJRzJfR0VURFdPUkQoc3AgKyA0KSA+PiBzaGlmdDIpOworICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7CisgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgorICAgICAgICAgICAgICB0bXAgPSB0bXAxIHwgdG1wMjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgorICAgICAgICAgICAgICB0bXAgPSB0bXAxICYgdG1wMjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgorICAgICAgICAgICAgICB0bXAgPSB0bXAxIF4gdG1wMjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKKyAgICAgICAgICAgICAgdG1wID0gfih0bXAxIF4gdG1wMik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6CisgICAgICAgICAgICAgIHRtcCA9IHRtcDE7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBkcFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOworICAgICAgICAgIGRwWzFdID0gKHVpbnQ4X3QpKHRtcCA+PiAxNik7CisgICAgICAgICAgZHBbMl0gPSAodWludDhfdCkodG1wID4+IDgpOworICAgICAgICAgIGRwWzNdID0gKHVpbnQ4X3QpdG1wOworICAgICAgICAgIHNwICs9IDQ7CisgICAgICAgICAgZHAgKz0gNDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZDIgIT0gMCkgeworICAgICAgICAgIHRtcDEgPQorICAgICAgICAgICAgICAoSkJJRzJfR0VURFdPUkQoc3ApIDw8IHNoaWZ0MSkgfAorICAgICAgICAgICAgICAoKChzcCArIDQpIDwgbGluZVNyYyArIGxpbmVMZWZ0ID8gSkJJRzJfR0VURFdPUkQoc3AgKyA0KSA6IDApID4+CisgICAgICAgICAgICAgICBzaGlmdDIpOworICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7CisgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tSKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKHRtcDEgJiB0bXAyKSAmIG1hc2tSKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tSKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh+KHRtcDEgXiB0bXAyKSkgJiBtYXNrUik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICh0bXAxICYgbWFza1IpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZHBbMF0gPSAodWludDhfdCkodG1wID4+IDI0KTsKKyAgICAgICAgICBkcFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOworICAgICAgICAgIGRwWzJdID0gKHVpbnQ4X3QpKHRtcCA+PiA4KTsKKyAgICAgICAgICBkcFszXSA9ICh1aW50OF90KXRtcDsKKyAgICAgICAgfQorICAgICAgICBsaW5lU3JjICs9IG1fblN0cmlkZTsKKyAgICAgICAgbGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChzMSA9PSBkMSkgeworICAgICAgbWlkZGxlRHdvcmRzID0gKHhkMSA+PiA1KSAtICgoeGQwICsgMzEpID4+IDUpOworICAgICAgZm9yICh5eSA9IHlkMDsgeXkgPCB5ZDE7IHl5KyspIHsKKyAgICAgICAgc3AgPSBsaW5lU3JjOworICAgICAgICBkcCA9IGxpbmVEc3Q7CisgICAgICAgIGlmIChkMSAhPSAwKSB7CisgICAgICAgICAgdG1wMSA9IEpCSUcyX0dFVERXT1JEKHNwKTsKKyAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOworICAgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh0bXAxIHwgdG1wMikgJiBtYXNrTCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh0bXAxICYgdG1wMikgJiBtYXNrTCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh0bXAxIF4gdG1wMikgJiBtYXNrTCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgofih0bXAxIF4gdG1wMikpICYgbWFza0wpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAodG1wMSAmIG1hc2tMKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGRwWzBdID0gKHVpbnQ4X3QpKHRtcCA+PiAyNCk7CisgICAgICAgICAgZHBbMV0gPSAodWludDhfdCkodG1wID4+IDE2KTsKKyAgICAgICAgICBkcFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7CisgICAgICAgICAgZHBbM10gPSAodWludDhfdCl0bXA7CisgICAgICAgICAgc3AgKz0gNDsKKyAgICAgICAgICBkcCArPSA0OworICAgICAgICB9CisgICAgICAgIGZvciAoeHggPSAwOyB4eCA8IG1pZGRsZUR3b3JkczsgeHgrKykgeworICAgICAgICAgIHRtcDEgPSBKQklHMl9HRVREV09SRChzcCk7CisgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKKyAgICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6CisgICAgICAgICAgICAgIHRtcCA9IHRtcDEgfCB0bXAyOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6CisgICAgICAgICAgICAgIHRtcCA9IHRtcDEgJiB0bXAyOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6CisgICAgICAgICAgICAgIHRtcCA9IHRtcDEgXiB0bXAyOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgorICAgICAgICAgICAgICB0bXAgPSB+KHRtcDEgXiB0bXAyKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKKyAgICAgICAgICAgICAgdG1wID0gdG1wMTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGRwWzBdID0gKHVpbnQ4X3QpKHRtcCA+PiAyNCk7CisgICAgICAgICAgZHBbMV0gPSAodWludDhfdCkodG1wID4+IDE2KTsKKyAgICAgICAgICBkcFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7CisgICAgICAgICAgZHBbM10gPSAodWludDhfdCl0bXA7CisgICAgICAgICAgc3AgKz0gNDsKKyAgICAgICAgICBkcCArPSA0OworICAgICAgICB9CisgICAgICAgIGlmIChkMiAhPSAwKSB7CisgICAgICAgICAgdG1wMSA9IEpCSUcyX0dFVERXT1JEKHNwKTsKKyAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOworICAgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh0bXAxIHwgdG1wMikgJiBtYXNrUik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh0bXAxICYgdG1wMikgJiBtYXNrUik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh0bXAxIF4gdG1wMikgJiBtYXNrUik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgofih0bXAxIF4gdG1wMikpICYgbWFza1IpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAodG1wMSAmIG1hc2tSKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGRwWzBdID0gKHVpbnQ4X3QpKHRtcCA+PiAyNCk7CisgICAgICAgICAgZHBbMV0gPSAodWludDhfdCkodG1wID4+IDE2KTsKKyAgICAgICAgICBkcFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7CisgICAgICAgICAgZHBbM10gPSAodWludDhfdCl0bXA7CisgICAgICAgIH0KKyAgICAgICAgbGluZVNyYyArPSBtX25TdHJpZGU7CisgICAgICAgIGxpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzaGlmdDEgPSBkMSAtIHMxOworICAgICAgc2hpZnQyID0gMzIgLSBzaGlmdDE7CisgICAgICBtaWRkbGVEd29yZHMgPSAoeGQxID4+IDUpIC0gKCh4ZDAgKyAzMSkgPj4gNSk7CisgICAgICBmb3IgKHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgeworICAgICAgICBzcCA9IGxpbmVTcmM7CisgICAgICAgIGRwID0gbGluZURzdDsKKyAgICAgICAgaWYgKGQxICE9IDApIHsKKyAgICAgICAgICB0bXAxID0gSkJJRzJfR0VURFdPUkQoc3ApID4+IHNoaWZ0MTsKKyAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOworICAgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh0bXAxIHwgdG1wMikgJiBtYXNrTCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh0bXAxICYgdG1wMikgJiBtYXNrTCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh0bXAxIF4gdG1wMikgJiBtYXNrTCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgofih0bXAxIF4gdG1wMikpICYgbWFza0wpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAodG1wMSAmIG1hc2tMKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGRwWzBdID0gKHVpbnQ4X3QpKHRtcCA+PiAyNCk7CisgICAgICAgICAgZHBbMV0gPSAodWludDhfdCkodG1wID4+IDE2KTsKKyAgICAgICAgICBkcFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7CisgICAgICAgICAgZHBbM10gPSAodWludDhfdCl0bXA7CisgICAgICAgICAgZHAgKz0gNDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHh4ID0gMDsgeHggPCBtaWRkbGVEd29yZHM7IHh4KyspIHsKKyAgICAgICAgICB0bXAxID0gKEpCSUcyX0dFVERXT1JEKHNwKSA8PCBzaGlmdDIpIHwKKyAgICAgICAgICAgICAgICAgKChKQklHMl9HRVREV09SRChzcCArIDQpKSA+PiBzaGlmdDEpOworICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7CisgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgorICAgICAgICAgICAgICB0bXAgPSB0bXAxIHwgdG1wMjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgorICAgICAgICAgICAgICB0bXAgPSB0bXAxICYgdG1wMjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgorICAgICAgICAgICAgICB0bXAgPSB0bXAxIF4gdG1wMjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKKyAgICAgICAgICAgICAgdG1wID0gfih0bXAxIF4gdG1wMik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6CisgICAgICAgICAgICAgIHRtcCA9IHRtcDE7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBkcFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOworICAgICAgICAgIGRwWzFdID0gKHVpbnQ4X3QpKHRtcCA+PiAxNik7CisgICAgICAgICAgZHBbMl0gPSAodWludDhfdCkodG1wID4+IDgpOworICAgICAgICAgIGRwWzNdID0gKHVpbnQ4X3QpdG1wOworICAgICAgICAgIHNwICs9IDQ7CisgICAgICAgICAgZHAgKz0gNDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZDIgIT0gMCkgeworICAgICAgICAgIHRtcDEgPQorICAgICAgICAgICAgICAoSkJJRzJfR0VURFdPUkQoc3ApIDw8IHNoaWZ0MikgfAorICAgICAgICAgICAgICAoKChzcCArIDQpIDwgbGluZVNyYyArIGxpbmVMZWZ0ID8gSkJJRzJfR0VURFdPUkQoc3AgKyA0KSA6IDApID4+CisgICAgICAgICAgICAgICBzaGlmdDEpOworICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7CisgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tSKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKHRtcDEgJiB0bXAyKSAmIG1hc2tSKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tSKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh+KHRtcDEgXiB0bXAyKSkgJiBtYXNrUik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICh0bXAxICYgbWFza1IpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZHBbMF0gPSAodWludDhfdCkodG1wID4+IDI0KTsKKyAgICAgICAgICBkcFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOworICAgICAgICAgIGRwWzJdID0gKHVpbnQ4X3QpKHRtcCA+PiA4KTsKKyAgICAgICAgICBkcFszXSA9ICh1aW50OF90KXRtcDsKKyAgICAgICAgfQorICAgICAgICBsaW5lU3JjICs9IG1fblN0cmlkZTsKKyAgICAgICAgbGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAxOwogfQotRlhfQk9PTCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VUb19vcHQyKENKQmlnMl9JbWFnZSAqcERzdCwgRlhfSU5UMzIgeCwgRlhfSU5UMzIgeSwgSkJpZzJDb21wb3NlT3Agb3AsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0KQotewotICAgIEZYX0lOVDMyIHhzMCwgeXMwLCB4czEsIHlzMSwgeGQwLCB5ZDAsIHhkMSwgeWQxLCB4eCwgeXksIHcsIGgsIG1pZGRsZUR3b3JkcywgbGluZUxlZnQ7Ci0gICAgRlhfRFdPUkQgczEsIGQxLCBkMiwgc2hpZnQsIHNoaWZ0MSwgc2hpZnQyLCB0bXAsIHRtcDEsIHRtcDIsIG1hc2tMLCBtYXNrUiwgbWFza007Ci0gICAgRlhfQllURSAqbGluZVNyYywgKmxpbmVEc3QsICpzcCwgKmRwOwotICAgIEZYX0lOVDMyIHN3LCBzaDsKLSAgICBpZiAoIW1fcERhdGEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoeCA8IC0xMDQ4NTc2IHx8IHggPiAxMDQ4NTc2IHx8IHkgPCAtMTA0ODU3NiB8fCB5ID4gMTA0ODU3NikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHN3ID0gcFNyY1JlY3QtPldpZHRoKCk7Ci0gICAgc2ggPSBwU3JjUmVjdC0+SGVpZ2h0KCk7Ci0gICAgaWYoeSA8IDApIHsKLSAgICAgICAgeXMwID0gLXk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgeXMwID0gMDsKLSAgICB9Ci0gICAgaWYoeSArIHNoID4gcERzdC0+bV9uSGVpZ2h0KSB7Ci0gICAgICAgIHlzMSA9IHBEc3QtPm1fbkhlaWdodCAtIHk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgeXMxID0gc2g7Ci0gICAgfQotICAgIGlmKHggPCAwKSB7Ci0gICAgICAgIHhzMCA9IC14OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHhzMCA9IDA7Ci0gICAgfQotICAgIGlmKHggKyBzdyA+IHBEc3QtPm1fbldpZHRoKSB7Ci0gICAgICAgIHhzMSA9IHBEc3QtPm1fbldpZHRoIC0geDsKLSAgICB9IGVsc2UgewotICAgICAgICB4czEgPSBzdzsKLSAgICB9Ci0gICAgaWYoKHlzMCA+PSB5czEpIHx8ICh4czAgPj0geHMxKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgdyA9IHhzMSAtIHhzMDsKLSAgICBoID0geXMxIC0geXMwOwotICAgIGlmKHkgPCAwKSB7Ci0gICAgICAgIHlkMCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgeWQwID0geTsKLSAgICB9Ci0gICAgaWYoeCA8IDApIHsKLSAgICAgICAgeGQwID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICB4ZDAgPSB4OwotICAgIH0KLSAgICB4ZDEgPSB4ZDAgKyB3OwotICAgIHlkMSA9IHlkMCArIGg7Ci0gICAgZDEgPSB4ZDAgJiAzMTsKLSAgICBkMiA9IHhkMSAmIDMxOwotICAgIHMxID0geHMwICYgMzE7Ci0gICAgbWFza0wgPSAweGZmZmZmZmZmID4+IGQxOwotICAgIG1hc2tSID0gMHhmZmZmZmZmZiA8PCAoKDMyIC0gKHhkMSAmIDMxKSkgJSAzMik7Ci0gICAgbWFza00gPSBtYXNrTCAmIG1hc2tSOwotICAgIGxpbmVTcmMgPSBtX3BEYXRhICsgKHBTcmNSZWN0LT50b3AgKyB5czApICogbV9uU3RyaWRlICsgKCgoeHMwICsgcFNyY1JlY3QtPmxlZnQpID4+IDUpIDw8IDIpOwotICAgIGxpbmVMZWZ0ID0gbV9uU3RyaWRlIC0gKCh4czAgPj4gNSkgPDwgMik7Ci0gICAgbGluZURzdCA9IHBEc3QtPm1fcERhdGEgKyB5ZDAgKiBwRHN0LT5tX25TdHJpZGUgKyAoKHhkMCA+PiA1KSA8PCAyKTsKLSAgICBpZigoeGQwICYgfjMxKSA9PSAoKHhkMSAtIDEpICYgfjMxKSkgewotICAgICAgICBpZigoeHMwICYgfjMxKSA9PSAoKHhzMSAtIDEpICYgfjMxKSkgewotICAgICAgICAgICAgaWYoczEgPiBkMSkgewotICAgICAgICAgICAgICAgIHNoaWZ0ID0gczEgLSBkMTsKLSAgICAgICAgICAgICAgICBmb3IoeXkgPSB5ZDA7IHl5IDwgeWQxOyB5eSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDEgPSBKQklHMl9HRVREV09SRChsaW5lU3JjKSA8PCBzaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGxpbmVEc3QpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2gob3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tNKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh0bXAxICYgdG1wMikgJiBtYXNrTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSBeIHRtcDIpICYgbWFza00pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh+KHRtcDEgXiB0bXAyKSkgJiBtYXNrTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAodG1wMSAmIG1hc2tNKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsaW5lRHN0WzBdID0gKEZYX0JZVEUpKHRtcCA+PiAyNCk7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVEc3RbMV0gPSAoRlhfQllURSkodG1wID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgbGluZURzdFsyXSA9IChGWF9CWVRFKSh0bXAgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVEc3RbM10gPSAoRlhfQllURSl0bXA7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICBsaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNoaWZ0ID0gZDEgLSBzMTsKLSAgICAgICAgICAgICAgICBmb3IoeXkgPSB5ZDA7IHl5IDwgeWQxOyB5eSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDEgPSBKQklHMl9HRVREV09SRChsaW5lU3JjKSA+PiBzaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGxpbmVEc3QpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2gob3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tNKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh0bXAxICYgdG1wMikgJiBtYXNrTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSBeIHRtcDIpICYgbWFza00pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh+KHRtcDEgXiB0bXAyKSkgJiBtYXNrTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAodG1wMSAmIG1hc2tNKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsaW5lRHN0WzBdID0gKEZYX0JZVEUpKHRtcCA+PiAyNCk7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVEc3RbMV0gPSAoRlhfQllURSkodG1wID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgbGluZURzdFsyXSA9IChGWF9CWVRFKSh0bXAgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVEc3RbM10gPSAoRlhfQllURSl0bXA7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgICAgICBsaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzaGlmdDEgPSBzMSAtIGQxOwotICAgICAgICAgICAgc2hpZnQyID0gMzIgLSBzaGlmdDE7Ci0gICAgICAgICAgICBmb3IoeXkgPSB5ZDA7IHl5IDwgeWQxOyB5eSsrKSB7Ci0gICAgICAgICAgICAgICAgdG1wMSA9IChKQklHMl9HRVREV09SRChsaW5lU3JjKSA8PCBzaGlmdDEpIHwgKEpCSUcyX0dFVERXT1JEKGxpbmVTcmMgKyA0KSA+PiBzaGlmdDIpOwotICAgICAgICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChsaW5lRHN0KTsKLSAgICAgICAgICAgICAgICBzd2l0Y2gob3ApIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh0bXAxIHwgdG1wMikgJiBtYXNrTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza00pOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tNKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgofih0bXAxIF4gdG1wMikpICYgbWFza00pOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKHRtcDEgJiBtYXNrTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZURzdFswXSA9IChGWF9CWVRFKSh0bXAgPj4gMjQpOwotICAgICAgICAgICAgICAgIGxpbmVEc3RbMV0gPSAoRlhfQllURSkodG1wID4+IDE2KTsKLSAgICAgICAgICAgICAgICBsaW5lRHN0WzJdID0gKEZYX0JZVEUpKHRtcCA+PiA4KTsKLSAgICAgICAgICAgICAgICBsaW5lRHN0WzNdID0gKEZYX0JZVEUpdG1wOwotICAgICAgICAgICAgICAgIGxpbmVTcmMgKz0gbV9uU3RyaWRlOwotICAgICAgICAgICAgICAgIGxpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOwotICAgICAgICAgICAgfQorRlhfQk9PTCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VUb19vcHQyKENKQmlnMl9JbWFnZSogcERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQ29tcG9zZU9wIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0KSB7CisgIGludDMyX3QgeHMwLCB5czAsIHhzMSwgeXMxLCB4ZDAsIHlkMCwgeGQxLCB5ZDEsIHh4LCB5eSwgdywgaCwgbWlkZGxlRHdvcmRzLAorICAgICAgbGluZUxlZnQ7CisgIEZYX0RXT1JEIHMxLCBkMSwgZDIsIHNoaWZ0LCBzaGlmdDEsIHNoaWZ0MiwgdG1wLCB0bXAxLCB0bXAyLCBtYXNrTCwgbWFza1IsCisgICAgICBtYXNrTTsKKyAgdWludDhfdCAqbGluZVNyYywgKmxpbmVEc3QsICpzcCwgKmRwOworICBpbnQzMl90IHN3LCBzaDsKKyAgaWYgKCFtX3BEYXRhKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICh4IDwgLTEwNDg1NzYgfHwgeCA+IDEwNDg1NzYgfHwgeSA8IC0xMDQ4NTc2IHx8IHkgPiAxMDQ4NTc2KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHN3ID0gcFNyY1JlY3QtPldpZHRoKCk7CisgIHNoID0gcFNyY1JlY3QtPkhlaWdodCgpOworICBpZiAoeSA8IDApIHsKKyAgICB5czAgPSAteTsKKyAgfSBlbHNlIHsKKyAgICB5czAgPSAwOworICB9CisgIGlmICh5ICsgc2ggPiBwRHN0LT5tX25IZWlnaHQpIHsKKyAgICB5czEgPSBwRHN0LT5tX25IZWlnaHQgLSB5OworICB9IGVsc2UgeworICAgIHlzMSA9IHNoOworICB9CisgIGlmICh4IDwgMCkgeworICAgIHhzMCA9IC14OworICB9IGVsc2UgeworICAgIHhzMCA9IDA7CisgIH0KKyAgaWYgKHggKyBzdyA+IHBEc3QtPm1fbldpZHRoKSB7CisgICAgeHMxID0gcERzdC0+bV9uV2lkdGggLSB4OworICB9IGVsc2UgeworICAgIHhzMSA9IHN3OworICB9CisgIGlmICgoeXMwID49IHlzMSkgfHwgKHhzMCA+PSB4czEpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgdyA9IHhzMSAtIHhzMDsKKyAgaCA9IHlzMSAtIHlzMDsKKyAgaWYgKHkgPCAwKSB7CisgICAgeWQwID0gMDsKKyAgfSBlbHNlIHsKKyAgICB5ZDAgPSB5OworICB9CisgIGlmICh4IDwgMCkgeworICAgIHhkMCA9IDA7CisgIH0gZWxzZSB7CisgICAgeGQwID0geDsKKyAgfQorICB4ZDEgPSB4ZDAgKyB3OworICB5ZDEgPSB5ZDAgKyBoOworICBkMSA9IHhkMCAmIDMxOworICBkMiA9IHhkMSAmIDMxOworICBzMSA9IHhzMCAmIDMxOworICBtYXNrTCA9IDB4ZmZmZmZmZmYgPj4gZDE7CisgIG1hc2tSID0gMHhmZmZmZmZmZiA8PCAoKDMyIC0gKHhkMSAmIDMxKSkgJSAzMik7CisgIG1hc2tNID0gbWFza0wgJiBtYXNrUjsKKyAgbGluZVNyYyA9IG1fcERhdGEgKyAocFNyY1JlY3QtPnRvcCArIHlzMCkgKiBtX25TdHJpZGUgKworICAgICAgICAgICAgKCgoeHMwICsgcFNyY1JlY3QtPmxlZnQpID4+IDUpIDw8IDIpOworICBsaW5lTGVmdCA9IG1fblN0cmlkZSAtICgoeHMwID4+IDUpIDw8IDIpOworICBsaW5lRHN0ID0gcERzdC0+bV9wRGF0YSArIHlkMCAqIHBEc3QtPm1fblN0cmlkZSArICgoeGQwID4+IDUpIDw8IDIpOworICBpZiAoKHhkMCAmIH4zMSkgPT0gKCh4ZDEgLSAxKSAmIH4zMSkpIHsKKyAgICBpZiAoKHhzMCAmIH4zMSkgPT0gKCh4czEgLSAxKSAmIH4zMSkpIHsKKyAgICAgIGlmIChzMSA+IGQxKSB7CisgICAgICAgIHNoaWZ0ID0gczEgLSBkMTsKKyAgICAgICAgZm9yICh5eSA9IHlkMDsgeXkgPCB5ZDE7IHl5KyspIHsKKyAgICAgICAgICB0bXAxID0gSkJJRzJfR0VURFdPUkQobGluZVNyYykgPDwgc2hpZnQ7CisgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGxpbmVEc3QpOworICAgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh0bXAxIHwgdG1wMikgJiBtYXNrTSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh0bXAxICYgdG1wMikgJiBtYXNrTSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh0bXAxIF4gdG1wMikgJiBtYXNrTSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgofih0bXAxIF4gdG1wMikpICYgbWFza00pOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAodG1wMSAmIG1hc2tNKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGxpbmVEc3RbMF0gPSAodWludDhfdCkodG1wID4+IDI0KTsKKyAgICAgICAgICBsaW5lRHN0WzFdID0gKHVpbnQ4X3QpKHRtcCA+PiAxNik7CisgICAgICAgICAgbGluZURzdFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7CisgICAgICAgICAgbGluZURzdFszXSA9ICh1aW50OF90KXRtcDsKKyAgICAgICAgICBsaW5lU3JjICs9IG1fblN0cmlkZTsKKyAgICAgICAgICBsaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKICAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKHMxID4gZDEpIHsKLSAgICAgICAgICAgIHNoaWZ0MSA9IHMxIC0gZDE7Ci0gICAgICAgICAgICBzaGlmdDIgPSAzMiAtIHNoaWZ0MTsKLSAgICAgICAgICAgIG1pZGRsZUR3b3JkcyA9ICh4ZDEgPj4gNSkgLSAoKHhkMCArIDMxKSA+PiA1KTsKLSAgICAgICAgICAgIGZvcih5eSA9IHlkMDsgeXkgPCB5ZDE7IHl5KyspIHsKLSAgICAgICAgICAgICAgICBzcCA9IGxpbmVTcmM7Ci0gICAgICAgICAgICAgICAgZHAgPSBsaW5lRHN0OwotICAgICAgICAgICAgICAgIGlmKGQxICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wMSA9IChKQklHMl9HRVREV09SRChzcCkgPDwgc2hpZnQxKSB8IChKQklHMl9HRVREV09SRChzcCArIDQpID4+IHNoaWZ0Mik7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChvcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza0wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgJiB0bXAyKSAmIG1hc2tMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh0bXAxIF4gdG1wMikgJiBtYXNrTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKH4odG1wMSBeIHRtcDIpKSAmIG1hc2tMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICh0bXAxICYgbWFza0wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRwWzBdID0gKEZYX0JZVEUpKHRtcCA+PiAyNCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzFdID0gKEZYX0JZVEUpKHRtcCA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzJdID0gKEZYX0JZVEUpKHRtcCA+PiA4KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbM10gPSAoRlhfQllURSl0bXA7Ci0gICAgICAgICAgICAgICAgICAgIHNwICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIGRwICs9IDQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvcih4eCA9IDA7IHh4IDwgbWlkZGxlRHdvcmRzOyB4eCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDEgPSAoSkJJRzJfR0VURFdPUkQoc3ApIDw8IHNoaWZ0MSkgfCAoSkJJRzJfR0VURFdPUkQoc3AgKyA0KSA+PiBzaGlmdDIpOwotICAgICAgICAgICAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2gob3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0bXAxIHwgdG1wMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdG1wMSAmIHRtcDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRtcDEgXiB0bXAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gfih0bXAxIF4gdG1wMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0bXAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRwWzBdID0gKEZYX0JZVEUpKHRtcCA+PiAyNCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzFdID0gKEZYX0JZVEUpKHRtcCA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzJdID0gKEZYX0JZVEUpKHRtcCA+PiA4KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbM10gPSAoRlhfQllURSl0bXA7Ci0gICAgICAgICAgICAgICAgICAgIHNwICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIGRwICs9IDQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKGQyICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wMSA9IChKQklHMl9HRVREV09SRChzcCkgPDwgc2hpZnQxKSB8ICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHNwICsgNCkgPCBsaW5lU3JjICsgbGluZUxlZnQgPyBKQklHMl9HRVREV09SRChzcCArIDQpIDogMCkgPj4gc2hpZnQyKTsKLSAgICAgICAgICAgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh0bXAxIHwgdG1wMikgJiBtYXNrUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgofih0bXAxIF4gdG1wMikpICYgbWFza1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKHRtcDEgJiBtYXNrUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZHBbMF0gPSAoRlhfQllURSkodG1wID4+IDI0KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbMV0gPSAoRlhfQllURSkodG1wID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbMl0gPSAoRlhfQllURSkodG1wID4+IDgpOwotICAgICAgICAgICAgICAgICAgICBkcFszXSA9IChGWF9CWVRFKXRtcDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZVNyYyArPSBtX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgbGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZihzMSA9PSBkMSkgewotICAgICAgICAgICAgbWlkZGxlRHdvcmRzID0gKHhkMSA+PiA1KSAtICgoeGQwICsgMzEpID4+IDUpOwotICAgICAgICAgICAgZm9yKHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgewotICAgICAgICAgICAgICAgIHNwID0gbGluZVNyYzsKLSAgICAgICAgICAgICAgICBkcCA9IGxpbmVEc3Q7Ci0gICAgICAgICAgICAgICAgaWYoZDEgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0bXAxID0gSkJJRzJfR0VURFdPUkQoc3ApOwotICAgICAgICAgICAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2gob3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh0bXAxICYgdG1wMikgJiBtYXNrTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgodG1wMSBeIHRtcDIpICYgbWFza0wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh+KHRtcDEgXiB0bXAyKSkgJiBtYXNrTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAodG1wMSAmIG1hc2tMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkcFswXSA9IChGWF9CWVRFKSh0bXAgPj4gMjQpOwotICAgICAgICAgICAgICAgICAgICBkcFsxXSA9IChGWF9CWVRFKSh0bXAgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICBkcFsyXSA9IChGWF9CWVRFKSh0bXAgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzNdID0gKEZYX0JZVEUpdG1wOwotICAgICAgICAgICAgICAgICAgICBzcCArPSA0OwotICAgICAgICAgICAgICAgICAgICBkcCArPSA0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IoeHggPSAwOyB4eCA8IG1pZGRsZUR3b3JkczsgeHgrKykgewotICAgICAgICAgICAgICAgICAgICB0bXAxID0gSkJJRzJfR0VURFdPUkQoc3ApOwotICAgICAgICAgICAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2gob3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0bXAxIHwgdG1wMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdG1wMSAmIHRtcDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRtcDEgXiB0bXAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gfih0bXAxIF4gdG1wMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0bXAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRwWzBdID0gKEZYX0JZVEUpKHRtcCA+PiAyNCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzFdID0gKEZYX0JZVEUpKHRtcCA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzJdID0gKEZYX0JZVEUpKHRtcCA+PiA4KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbM10gPSAoRlhfQllURSl0bXA7Ci0gICAgICAgICAgICAgICAgICAgIHNwICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIGRwICs9IDQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKGQyICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wMSA9IEpCSUcyX0dFVERXT1JEKHNwKTsKLSAgICAgICAgICAgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh0bXAxIHwgdG1wMikgJiBtYXNrUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgofih0bXAxIF4gdG1wMikpICYgbWFza1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKHRtcDEgJiBtYXNrUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZHBbMF0gPSAoRlhfQllURSkodG1wID4+IDI0KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbMV0gPSAoRlhfQllURSkodG1wID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbMl0gPSAoRlhfQllURSkodG1wID4+IDgpOwotICAgICAgICAgICAgICAgICAgICBkcFszXSA9IChGWF9CWVRFKXRtcDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZVNyYyArPSBtX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgbGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzaGlmdDEgPSBkMSAtIHMxOwotICAgICAgICAgICAgc2hpZnQyID0gMzIgLSBzaGlmdDE7Ci0gICAgICAgICAgICBtaWRkbGVEd29yZHMgPSAoeGQxID4+IDUpIC0gKCh4ZDAgKyAzMSkgPj4gNSk7Ci0gICAgICAgICAgICBmb3IoeXkgPSB5ZDA7IHl5IDwgeWQxOyB5eSsrKSB7Ci0gICAgICAgICAgICAgICAgc3AgPSBsaW5lU3JjOwotICAgICAgICAgICAgICAgIGRwID0gbGluZURzdDsKLSAgICAgICAgICAgICAgICBpZihkMSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcDEgPSBKQklHMl9HRVREV09SRChzcCkgPj4gc2hpZnQxOwotICAgICAgICAgICAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2gob3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh0bXAxICYgdG1wMikgJiBtYXNrTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgodG1wMSBeIHRtcDIpICYgbWFza0wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh+KHRtcDEgXiB0bXAyKSkgJiBtYXNrTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAodG1wMSAmIG1hc2tMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkcFswXSA9IChGWF9CWVRFKSh0bXAgPj4gMjQpOwotICAgICAgICAgICAgICAgICAgICBkcFsxXSA9IChGWF9CWVRFKSh0bXAgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICBkcFsyXSA9IChGWF9CWVRFKSh0bXAgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzNdID0gKEZYX0JZVEUpdG1wOwotICAgICAgICAgICAgICAgICAgICBkcCArPSA0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IoeHggPSAwOyB4eCA8IG1pZGRsZUR3b3JkczsgeHgrKykgewotICAgICAgICAgICAgICAgICAgICB0bXAxID0gKEpCSUcyX0dFVERXT1JEKHNwKSA8PCBzaGlmdDIpIHwgKChKQklHMl9HRVREV09SRChzcCArIDQpKSA+PiBzaGlmdDEpOwotICAgICAgICAgICAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2gob3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0bXAxIHwgdG1wMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdG1wMSAmIHRtcDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRtcDEgXiB0bXAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gfih0bXAxIF4gdG1wMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0bXAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRwWzBdID0gKEZYX0JZVEUpKHRtcCA+PiAyNCk7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzFdID0gKEZYX0JZVEUpKHRtcCA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgIGRwWzJdID0gKEZYX0JZVEUpKHRtcCA+PiA4KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbM10gPSAoRlhfQllURSl0bXA7Ci0gICAgICAgICAgICAgICAgICAgIHNwICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIGRwICs9IDQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKGQyICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wMSA9IChKQklHMl9HRVREV09SRChzcCkgPDwgc2hpZnQyKSB8ICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHNwICsgNCkgPCBsaW5lU3JjICsgbGluZUxlZnQgPyBKQklHMl9HRVREV09SRChzcCArIDQpIDogMCkgPj4gc2hpZnQxKTsKLSAgICAgICAgICAgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh0bXAxIHwgdG1wMikgJiBtYXNrUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKHRtcDEgXiB0bXAyKSAmIG1hc2tSKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgofih0bXAxIF4gdG1wMikpICYgbWFza1IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKHRtcDEgJiBtYXNrUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZHBbMF0gPSAoRlhfQllURSkodG1wID4+IDI0KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbMV0gPSAoRlhfQllURSkodG1wID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgZHBbMl0gPSAoRlhfQllURSkodG1wID4+IDgpOwotICAgICAgICAgICAgICAgICAgICBkcFszXSA9IChGWF9CWVRFKXRtcDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZVNyYyArPSBtX25TdHJpZGU7Ci0gICAgICAgICAgICAgICAgbGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7Ci0gICAgICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBzaGlmdCA9IGQxIC0gczE7CisgICAgICAgIGZvciAoeXkgPSB5ZDA7IHl5IDwgeWQxOyB5eSsrKSB7CisgICAgICAgICAgdG1wMSA9IEpCSUcyX0dFVERXT1JEKGxpbmVTcmMpID4+IHNoaWZ0OworICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChsaW5lRHN0KTsKKyAgICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza00pOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza00pOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSBeIHRtcDIpICYgbWFza00pOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAoKH4odG1wMSBeIHRtcDIpKSAmIG1hc2tNKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKHRtcDEgJiBtYXNrTSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBsaW5lRHN0WzBdID0gKHVpbnQ4X3QpKHRtcCA+PiAyNCk7CisgICAgICAgICAgbGluZURzdFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOworICAgICAgICAgIGxpbmVEc3RbMl0gPSAodWludDhfdCkodG1wID4+IDgpOworICAgICAgICAgIGxpbmVEc3RbM10gPSAodWludDhfdCl0bXA7CisgICAgICAgICAgbGluZVNyYyArPSBtX25TdHJpZGU7CisgICAgICAgICAgbGluZURzdCArPSBwRHN0LT5tX25TdHJpZGU7CiAgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc2hpZnQxID0gczEgLSBkMTsKKyAgICAgIHNoaWZ0MiA9IDMyIC0gc2hpZnQxOworICAgICAgZm9yICh5eSA9IHlkMDsgeXkgPCB5ZDE7IHl5KyspIHsKKyAgICAgICAgdG1wMSA9IChKQklHMl9HRVREV09SRChsaW5lU3JjKSA8PCBzaGlmdDEpIHwKKyAgICAgICAgICAgICAgIChKQklHMl9HRVREV09SRChsaW5lU3JjICsgNCkgPj4gc2hpZnQyKTsKKyAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGxpbmVEc3QpOworICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgorICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh0bXAxIHwgdG1wMikgJiBtYXNrTSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgorICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh0bXAxICYgdG1wMikgJiBtYXNrTSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgorICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza00pIHwgKCh0bXAxIF4gdG1wMikgJiBtYXNrTSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKKyAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgofih0bXAxIF4gdG1wMikpICYgbWFza00pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6CisgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTSkgfCAodG1wMSAmIG1hc2tNKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGxpbmVEc3RbMF0gPSAodWludDhfdCkodG1wID4+IDI0KTsKKyAgICAgICAgbGluZURzdFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOworICAgICAgICBsaW5lRHN0WzJdID0gKHVpbnQ4X3QpKHRtcCA+PiA4KTsKKyAgICAgICAgbGluZURzdFszXSA9ICh1aW50OF90KXRtcDsKKyAgICAgICAgbGluZVNyYyArPSBtX25TdHJpZGU7CisgICAgICAgIGxpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOworICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoczEgPiBkMSkgeworICAgICAgc2hpZnQxID0gczEgLSBkMTsKKyAgICAgIHNoaWZ0MiA9IDMyIC0gc2hpZnQxOworICAgICAgbWlkZGxlRHdvcmRzID0gKHhkMSA+PiA1KSAtICgoeGQwICsgMzEpID4+IDUpOworICAgICAgZm9yICh5eSA9IHlkMDsgeXkgPCB5ZDE7IHl5KyspIHsKKyAgICAgICAgc3AgPSBsaW5lU3JjOworICAgICAgICBkcCA9IGxpbmVEc3Q7CisgICAgICAgIGlmIChkMSAhPSAwKSB7CisgICAgICAgICAgdG1wMSA9IChKQklHMl9HRVREV09SRChzcCkgPDwgc2hpZnQxKSB8CisgICAgICAgICAgICAgICAgIChKQklHMl9HRVREV09SRChzcCArIDQpID4+IHNoaWZ0Mik7CisgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKKyAgICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza0wpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza0wpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgodG1wMSBeIHRtcDIpICYgbWFza0wpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKH4odG1wMSBeIHRtcDIpKSAmIG1hc2tMKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKHRtcDEgJiBtYXNrTCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBkcFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOworICAgICAgICAgIGRwWzFdID0gKHVpbnQ4X3QpKHRtcCA+PiAxNik7CisgICAgICAgICAgZHBbMl0gPSAodWludDhfdCkodG1wID4+IDgpOworICAgICAgICAgIGRwWzNdID0gKHVpbnQ4X3QpdG1wOworICAgICAgICAgIHNwICs9IDQ7CisgICAgICAgICAgZHAgKz0gNDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHh4ID0gMDsgeHggPCBtaWRkbGVEd29yZHM7IHh4KyspIHsKKyAgICAgICAgICB0bXAxID0gKEpCSUcyX0dFVERXT1JEKHNwKSA8PCBzaGlmdDEpIHwKKyAgICAgICAgICAgICAgICAgKEpCSUcyX0dFVERXT1JEKHNwICsgNCkgPj4gc2hpZnQyKTsKKyAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOworICAgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKKyAgICAgICAgICAgICAgdG1wID0gdG1wMSB8IHRtcDI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKKyAgICAgICAgICAgICAgdG1wID0gdG1wMSAmIHRtcDI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKKyAgICAgICAgICAgICAgdG1wID0gdG1wMSBeIHRtcDI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6CisgICAgICAgICAgICAgIHRtcCA9IH4odG1wMSBeIHRtcDIpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgorICAgICAgICAgICAgICB0bXAgPSB0bXAxOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZHBbMF0gPSAodWludDhfdCkodG1wID4+IDI0KTsKKyAgICAgICAgICBkcFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOworICAgICAgICAgIGRwWzJdID0gKHVpbnQ4X3QpKHRtcCA+PiA4KTsKKyAgICAgICAgICBkcFszXSA9ICh1aW50OF90KXRtcDsKKyAgICAgICAgICBzcCArPSA0OworICAgICAgICAgIGRwICs9IDQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGQyICE9IDApIHsKKyAgICAgICAgICB0bXAxID0KKyAgICAgICAgICAgICAgKEpCSUcyX0dFVERXT1JEKHNwKSA8PCBzaGlmdDEpIHwKKyAgICAgICAgICAgICAgKCgoc3AgKyA0KSA8IGxpbmVTcmMgKyBsaW5lTGVmdCA/IEpCSUcyX0dFVERXT1JEKHNwICsgNCkgOiAwKSA+PgorICAgICAgICAgICAgICAgc2hpZnQyKTsKKyAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOworICAgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh0bXAxIHwgdG1wMikgJiBtYXNrUik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh0bXAxICYgdG1wMikgJiBtYXNrUik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh0bXAxIF4gdG1wMikgJiBtYXNrUik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgofih0bXAxIF4gdG1wMikpICYgbWFza1IpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAodG1wMSAmIG1hc2tSKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGRwWzBdID0gKHVpbnQ4X3QpKHRtcCA+PiAyNCk7CisgICAgICAgICAgZHBbMV0gPSAodWludDhfdCkodG1wID4+IDE2KTsKKyAgICAgICAgICBkcFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7CisgICAgICAgICAgZHBbM10gPSAodWludDhfdCl0bXA7CisgICAgICAgIH0KKyAgICAgICAgbGluZVNyYyArPSBtX25TdHJpZGU7CisgICAgICAgIGxpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoczEgPT0gZDEpIHsKKyAgICAgIG1pZGRsZUR3b3JkcyA9ICh4ZDEgPj4gNSkgLSAoKHhkMCArIDMxKSA+PiA1KTsKKyAgICAgIGZvciAoeXkgPSB5ZDA7IHl5IDwgeWQxOyB5eSsrKSB7CisgICAgICAgIHNwID0gbGluZVNyYzsKKyAgICAgICAgZHAgPSBsaW5lRHN0OworICAgICAgICBpZiAoZDEgIT0gMCkgeworICAgICAgICAgIHRtcDEgPSBKQklHMl9HRVREV09SRChzcCk7CisgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKKyAgICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza0wpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza0wpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgodG1wMSBeIHRtcDIpICYgbWFza0wpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKH4odG1wMSBeIHRtcDIpKSAmIG1hc2tMKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKHRtcDEgJiBtYXNrTCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBkcFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOworICAgICAgICAgIGRwWzFdID0gKHVpbnQ4X3QpKHRtcCA+PiAxNik7CisgICAgICAgICAgZHBbMl0gPSAodWludDhfdCkodG1wID4+IDgpOworICAgICAgICAgIGRwWzNdID0gKHVpbnQ4X3QpdG1wOworICAgICAgICAgIHNwICs9IDQ7CisgICAgICAgICAgZHAgKz0gNDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHh4ID0gMDsgeHggPCBtaWRkbGVEd29yZHM7IHh4KyspIHsKKyAgICAgICAgICB0bXAxID0gSkJJRzJfR0VURFdPUkQoc3ApOworICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7CisgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgorICAgICAgICAgICAgICB0bXAgPSB0bXAxIHwgdG1wMjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfQU5EOgorICAgICAgICAgICAgICB0bXAgPSB0bXAxICYgdG1wMjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE9SOgorICAgICAgICAgICAgICB0bXAgPSB0bXAxIF4gdG1wMjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfWE5PUjoKKyAgICAgICAgICAgICAgdG1wID0gfih0bXAxIF4gdG1wMik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1JFUExBQ0U6CisgICAgICAgICAgICAgIHRtcCA9IHRtcDE7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBkcFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOworICAgICAgICAgIGRwWzFdID0gKHVpbnQ4X3QpKHRtcCA+PiAxNik7CisgICAgICAgICAgZHBbMl0gPSAodWludDhfdCkodG1wID4+IDgpOworICAgICAgICAgIGRwWzNdID0gKHVpbnQ4X3QpdG1wOworICAgICAgICAgIHNwICs9IDQ7CisgICAgICAgICAgZHAgKz0gNDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZDIgIT0gMCkgeworICAgICAgICAgIHRtcDEgPSBKQklHMl9HRVREV09SRChzcCk7CisgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKKyAgICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza1IpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza1IpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSBeIHRtcDIpICYgbWFza1IpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKH4odG1wMSBeIHRtcDIpKSAmIG1hc2tSKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKHRtcDEgJiBtYXNrUik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBkcFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOworICAgICAgICAgIGRwWzFdID0gKHVpbnQ4X3QpKHRtcCA+PiAxNik7CisgICAgICAgICAgZHBbMl0gPSAodWludDhfdCkodG1wID4+IDgpOworICAgICAgICAgIGRwWzNdID0gKHVpbnQ4X3QpdG1wOworICAgICAgICB9CisgICAgICAgIGxpbmVTcmMgKz0gbV9uU3RyaWRlOworICAgICAgICBsaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc2hpZnQxID0gZDEgLSBzMTsKKyAgICAgIHNoaWZ0MiA9IDMyIC0gc2hpZnQxOworICAgICAgbWlkZGxlRHdvcmRzID0gKHhkMSA+PiA1KSAtICgoeGQwICsgMzEpID4+IDUpOworICAgICAgZm9yICh5eSA9IHlkMDsgeXkgPCB5ZDE7IHl5KyspIHsKKyAgICAgICAgc3AgPSBsaW5lU3JjOworICAgICAgICBkcCA9IGxpbmVEc3Q7CisgICAgICAgIGlmIChkMSAhPSAwKSB7CisgICAgICAgICAgdG1wMSA9IEpCSUcyX0dFVERXT1JEKHNwKSA+PiBzaGlmdDE7CisgICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKKyAgICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza0wpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9BTkQ6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgodG1wMSAmIHRtcDIpICYgbWFza0wpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgodG1wMSBeIHRtcDIpICYgbWFza0wpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9YTk9SOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrTCkgfCAoKH4odG1wMSBeIHRtcDIpKSAmIG1hc2tMKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfUkVQTEFDRToKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKHRtcDEgJiBtYXNrTCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBkcFswXSA9ICh1aW50OF90KSh0bXAgPj4gMjQpOworICAgICAgICAgIGRwWzFdID0gKHVpbnQ4X3QpKHRtcCA+PiAxNik7CisgICAgICAgICAgZHBbMl0gPSAodWludDhfdCkodG1wID4+IDgpOworICAgICAgICAgIGRwWzNdID0gKHVpbnQ4X3QpdG1wOworICAgICAgICAgIGRwICs9IDQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh4eCA9IDA7IHh4IDwgbWlkZGxlRHdvcmRzOyB4eCsrKSB7CisgICAgICAgICAgdG1wMSA9IChKQklHMl9HRVREV09SRChzcCkgPDwgc2hpZnQyKSB8CisgICAgICAgICAgICAgICAgICgoSkJJRzJfR0VURFdPUkQoc3AgKyA0KSkgPj4gc2hpZnQxKTsKKyAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOworICAgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKKyAgICAgICAgICAgICAgdG1wID0gdG1wMSB8IHRtcDI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKKyAgICAgICAgICAgICAgdG1wID0gdG1wMSAmIHRtcDI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKKyAgICAgICAgICAgICAgdG1wID0gdG1wMSBeIHRtcDI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6CisgICAgICAgICAgICAgIHRtcCA9IH4odG1wMSBeIHRtcDIpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgorICAgICAgICAgICAgICB0bXAgPSB0bXAxOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgZHBbMF0gPSAodWludDhfdCkodG1wID4+IDI0KTsKKyAgICAgICAgICBkcFsxXSA9ICh1aW50OF90KSh0bXAgPj4gMTYpOworICAgICAgICAgIGRwWzJdID0gKHVpbnQ4X3QpKHRtcCA+PiA4KTsKKyAgICAgICAgICBkcFszXSA9ICh1aW50OF90KXRtcDsKKyAgICAgICAgICBzcCArPSA0OworICAgICAgICAgIGRwICs9IDQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGQyICE9IDApIHsKKyAgICAgICAgICB0bXAxID0KKyAgICAgICAgICAgICAgKEpCSUcyX0dFVERXT1JEKHNwKSA8PCBzaGlmdDIpIHwKKyAgICAgICAgICAgICAgKCgoc3AgKyA0KSA8IGxpbmVTcmMgKyBsaW5lTGVmdCA/IEpCSUcyX0dFVERXT1JEKHNwICsgNCkgOiAwKSA+PgorICAgICAgICAgICAgICAgc2hpZnQxKTsKKyAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOworICAgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh0bXAxIHwgdG1wMikgJiBtYXNrUik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX0FORDoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh0bXAxICYgdG1wMikgJiBtYXNrUik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hPUjoKKyAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh0bXAxIF4gdG1wMikgJiBtYXNrUik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX1hOT1I6CisgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgofih0bXAxIF4gdG1wMikpICYgbWFza1IpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9SRVBMQUNFOgorICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAodG1wMSAmIG1hc2tSKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGRwWzBdID0gKHVpbnQ4X3QpKHRtcCA+PiAyNCk7CisgICAgICAgICAgZHBbMV0gPSAodWludDhfdCkodG1wID4+IDE2KTsKKyAgICAgICAgICBkcFsyXSA9ICh1aW50OF90KSh0bXAgPj4gOCk7CisgICAgICAgICAgZHBbM10gPSAodWludDhfdCl0bXA7CisgICAgICAgIH0KKyAgICAgICAgbGluZVNyYyArPSBtX25TdHJpZGU7CisgICAgICAgIGxpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuaAppbmRleCA1ZDA2Njk1Li5jNDdkMjc1IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0ltYWdlLmgKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9JbWFnZS5oCkBAIC0xLDY4ICsxLDg1IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpZm5kZWYgX0pCSUcyX0lNQUdFX0hfCi0jZGVmaW5lIF9KQklHMl9JTUFHRV9IXworI2lmbmRlZiBDT1JFX1NSQ19GWENPREVDX0pCSUcyX0pCSUcyX0lNQUdFX0hfCisjZGVmaW5lIENPUkVfU1JDX0ZYQ09ERUNfSkJJRzJfSkJJRzJfSU1BR0VfSF8KKwogI2luY2x1ZGUgIkpCaWcyX0RlZmluZS5oIgotI2luY2x1ZGUgIkpCaWcyX01vZHVsZS5oIgotdHlwZWRlZiBlbnVtIHsKLSAgICBKQklHMl9DT01QT1NFX09SCQk9IDAsCi0gICAgSkJJRzJfQ09NUE9TRV9BTkQJCT0gMSwKLSAgICBKQklHMl9DT01QT1NFX1hPUgkJPSAyLAotICAgIEpCSUcyX0NPTVBPU0VfWE5PUgkJPSAzLAotICAgIEpCSUcyX0NPTVBPU0VfUkVQTEFDRQk9IDQKLX0gSkJpZzJDb21wb3NlT3A7Ci1zdHJ1Y3QgRlhfUkVDVDsKLWNsYXNzIENKQmlnMl9JbWFnZSA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0Ci17Ci1wdWJsaWM6CiAKLSAgICBDSkJpZzJfSW1hZ2UoRlhfSU5UMzIgdywgRlhfSU5UMzIgaCk7Ci0KLSAgICBDSkJpZzJfSW1hZ2UoRlhfSU5UMzIgdywgRlhfSU5UMzIgaCwgRlhfSU5UMzIgc3RyaWRlLCBGWF9CWVRFKnBCdWYpOwotCi0gICAgQ0pCaWcyX0ltYWdlKENKQmlnMl9JbWFnZSAmaW0pOwotCi0gICAgfkNKQmlnMl9JbWFnZSgpOwotCi0gICAgRlhfQk9PTCBnZXRQaXhlbChGWF9JTlQzMiB4LCBGWF9JTlQzMiB5KTsKLQotICAgIEZYX0lOVDMyIHNldFBpeGVsKEZYX0lOVDMyIHgsIEZYX0lOVDMyIHksIEZYX0JPT0wgdik7Ci0KLSAgICB2b2lkIGNvcHlMaW5lKEZYX0lOVDMyIGhUbywgRlhfSU5UMzIgaEZyb20pOwotCi0gICAgdm9pZCBmaWxsKEZYX0JPT0wgdik7Ci0KLSAgICBGWF9CT09MIGNvbXBvc2VUbyhDSkJpZzJfSW1hZ2UgKnBEc3QsIEZYX0lOVDMyIHgsIEZYX0lOVDMyIHksIEpCaWcyQ29tcG9zZU9wIG9wKTsKLSAgICBGWF9CT09MIGNvbXBvc2VUbyhDSkJpZzJfSW1hZ2UgKnBEc3QsIEZYX0lOVDMyIHgsIEZYX0lOVDMyIHksIEpCaWcyQ29tcG9zZU9wIG9wLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCk7Ci0KLSAgICBGWF9CT09MIGNvbXBvc2VUb191bm9wdChDSkJpZzJfSW1hZ2UgKnBEc3QsIEZYX0lOVDMyIHgsIEZYX0lOVDMyIHksIEpCaWcyQ29tcG9zZU9wIG9wKTsKLQotICAgIEZYX0JPT0wgY29tcG9zZVRvX29wdChDSkJpZzJfSW1hZ2UgKnBEc3QsIEZYX0lOVDMyIHgsIEZYX0lOVDMyIHksIEpCaWcyQ29tcG9zZU9wIG9wKTsKLQotICAgIEZYX0JPT0wgY29tcG9zZVRvX29wdDIoQ0pCaWcyX0ltYWdlICpwRHN0LCBGWF9JTlQzMiB4LCBGWF9JTlQzMiB5LCBKQmlnMkNvbXBvc2VPcCBvcCk7Ci0gICAgRlhfQk9PTCBjb21wb3NlVG9fb3B0MihDSkJpZzJfSW1hZ2UgKnBEc3QsIEZYX0lOVDMyIHgsIEZYX0lOVDMyIHksIEpCaWcyQ29tcG9zZU9wIG9wLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCk7Ci0KLSAgICBGWF9CT09MIGNvbXBvc2VGcm9tKEZYX0lOVDMyIHgsIEZYX0lOVDMyIHksIENKQmlnMl9JbWFnZSAqcFNyYywgSkJpZzJDb21wb3NlT3Agb3ApOwotICAgIEZYX0JPT0wgY29tcG9zZUZyb20oRlhfSU5UMzIgeCwgRlhfSU5UMzIgeSwgQ0pCaWcyX0ltYWdlICpwU3JjLCBKQmlnMkNvbXBvc2VPcCBvcCwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QpOwotICAgIENKQmlnMl9JbWFnZSAqc3ViSW1hZ2VfdW5vcHQoRlhfSU5UMzIgeCwgRlhfSU5UMzIgeSwgRlhfSU5UMzIgdywgRlhfSU5UMzIgaCk7Ci0KLSAgICBDSkJpZzJfSW1hZ2UgKnN1YkltYWdlKEZYX0lOVDMyIHgsIEZYX0lOVDMyIHksIEZYX0lOVDMyIHcsIEZYX0lOVDMyIGgpOwotCi0gICAgdm9pZCBleHBhbmQoRlhfSU5UMzIgaCwgRlhfQk9PTCB2KTsKLXB1YmxpYzoKLQotICAgIEZYX0lOVDMyIG1fbldpZHRoOwotCi0gICAgRlhfSU5UMzIgbV9uSGVpZ2h0OwotCi0gICAgRlhfSU5UMzIgbV9uU3RyaWRlOwotCi0gICAgRlhfQllURSAqbV9wRGF0YTsKLQotICAgIEZYX0JPT0wgbV9iTmVlZEZyZWU7CitlbnVtIEpCaWcyQ29tcG9zZU9wIHsKKyAgSkJJRzJfQ09NUE9TRV9PUiA9IDAsCisgIEpCSUcyX0NPTVBPU0VfQU5EID0gMSwKKyAgSkJJRzJfQ09NUE9TRV9YT1IgPSAyLAorICBKQklHMl9DT01QT1NFX1hOT1IgPSAzLAorICBKQklHMl9DT01QT1NFX1JFUExBQ0UgPSA0CiB9OwotI2VuZGlmCisKK3N0cnVjdCBGWF9SRUNUOworY2xhc3MgQ0pCaWcyX0ltYWdlIHsKKyBwdWJsaWM6CisgIENKQmlnMl9JbWFnZShpbnQzMl90IHcsIGludDMyX3QgaCk7CisKKyAgQ0pCaWcyX0ltYWdlKGludDMyX3QgdywgaW50MzJfdCBoLCBpbnQzMl90IHN0cmlkZSwgdWludDhfdCogcEJ1Zik7CisKKyAgQ0pCaWcyX0ltYWdlKGNvbnN0IENKQmlnMl9JbWFnZSYgaW0pOworCisgIH5DSkJpZzJfSW1hZ2UoKTsKKworICBGWF9CT09MIGdldFBpeGVsKGludDMyX3QgeCwgaW50MzJfdCB5KTsKKworICBpbnQzMl90IHNldFBpeGVsKGludDMyX3QgeCwgaW50MzJfdCB5LCBGWF9CT09MIHYpOworCisgIHZvaWQgY29weUxpbmUoaW50MzJfdCBoVG8sIGludDMyX3QgaEZyb20pOworCisgIHZvaWQgZmlsbChGWF9CT09MIHYpOworCisgIEZYX0JPT0wgY29tcG9zZVRvKENKQmlnMl9JbWFnZSogcERzdCwKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB4LAorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHksCisgICAgICAgICAgICAgICAgICAgIEpCaWcyQ29tcG9zZU9wIG9wKTsKKyAgRlhfQk9PTCBjb21wb3NlVG8oQ0pCaWcyX0ltYWdlKiBwRHN0LAorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHgsCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeSwKKyAgICAgICAgICAgICAgICAgICAgSkJpZzJDb21wb3NlT3Agb3AsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0KTsKKworICBGWF9CT09MIGNvbXBvc2VUb19vcHQyKENKQmlnMl9JbWFnZSogcERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQ29tcG9zZU9wIG9wKTsKKyAgRlhfQk9PTCBjb21wb3NlVG9fb3B0MihDSkJpZzJfSW1hZ2UqIHBEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkNvbXBvc2VPcCBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCk7CisKKyAgRlhfQk9PTCBjb21wb3NlRnJvbShpbnQzMl90IHgsCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5LAorICAgICAgICAgICAgICAgICAgICAgIENKQmlnMl9JbWFnZSogcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICBKQmlnMkNvbXBvc2VPcCBvcCk7CisgIEZYX0JPT0wgY29tcG9zZUZyb20oaW50MzJfdCB4LAorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeSwKKyAgICAgICAgICAgICAgICAgICAgICBDSkJpZzJfSW1hZ2UqIHBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgSkJpZzJDb21wb3NlT3Agb3AsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QpOworCisgIENKQmlnMl9JbWFnZSogc3ViSW1hZ2UoaW50MzJfdCB4LCBpbnQzMl90IHksIGludDMyX3QgdywgaW50MzJfdCBoKTsKKworICB2b2lkIGV4cGFuZChpbnQzMl90IGgsIEZYX0JPT0wgdik7CisKKyBwdWJsaWM6CisgIGludDMyX3QgbV9uV2lkdGg7CisKKyAgaW50MzJfdCBtX25IZWlnaHQ7CisKKyAgaW50MzJfdCBtX25TdHJpZGU7CisKKyAgdWludDhfdCogbV9wRGF0YTsKKworICBGWF9CT09MIG1fYk5lZWRGcmVlOworfTsKKworI2VuZGlmICAvLyBDT1JFX1NSQ19GWENPREVDX0pCSUcyX0pCSUcyX0lNQUdFX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0xpc3QuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfTGlzdC5oCmluZGV4IDkyOTI3MjQuLjZmNjE2OTAgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfTGlzdC5oCisrKyBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfTGlzdC5oCkBAIC0xLDY3ICsxLDU2IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpZm5kZWYgX0pCSUcyX0xJU1RfSF8KLSNkZWZpbmUgX0pCSUcyX0xJU1RfSF8KLSNpbmNsdWRlICJKQmlnMl9EZWZpbmUuaCIKLSNpbmNsdWRlICJKQmlnMl9PYmplY3QuaCIKKyNpZm5kZWYgQ09SRV9TUkNfRlhDT0RFQ19KQklHMl9KQklHMl9MSVNUX0hfCisjZGVmaW5lIENPUkVfU1JDX0ZYQ09ERUNfSkJJRzJfSkJJRzJfTElTVF9IXworCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIEEgcG9vciBtYW4ncyBTY29wZWRWZWN0b3IgZm9yIHBvaW50ZXJzIG9mIFRZUEUuCisvLyBPd25zIGFsbCB0aGUgcG9pbnRlcnMgY29udGFpbmVkIHdpdGhpbiBhbmQgZGVsZXRlcyB0aGVtIG9uIGRlc3RydWN0aW9uLgogdGVtcGxhdGUgPGNsYXNzIFRZUEU+Ci1jbGFzcyBDSkJpZzJfTGlzdCA6IHB1YmxpYyBDSkJpZzJfT2JqZWN0Ci17Ci1wdWJsaWM6CitjbGFzcyBDSkJpZzJfTGlzdCB7CisgcHVibGljOgorICBDSkJpZzJfTGlzdCgpIHt9CisgIGV4cGxpY2l0IENKQmlnMl9MaXN0KHNpemVfdCBjb3VudCkgeyByZXNpemUoY291bnQpOyB9CiAKLSAgICBDSkJpZzJfTGlzdChGWF9JTlQzMiBuU2l6ZSA9IDgpCi0gICAgewotICAgICAgICBtX25TaXplID0gblNpemU7Ci0gICAgICAgIG1fcEFycmF5ID0gKFRZUEUqKiltX3BNb2R1bGUtPkpCaWcyX01hbGxvYzIoc2l6ZW9mKFRZUEUqKSwgblNpemUpOwotICAgICAgICBtX25MZW5ndGggPSAwOwotICAgIH0KKyAgfkNKQmlnMl9MaXN0KCkgeworICAgIGNsZWFyKCk7CisgIH0KIAotICAgIH5DSkJpZzJfTGlzdCgpCi0gICAgewotICAgICAgICBjbGVhcigpOwotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUobV9wQXJyYXkpOwotICAgIH0KKyAgVFlQRSogZ2V0KHNpemVfdCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV92ZWN0b3JbaW5kZXhdOyB9CisgIFRZUEUqIGJhY2soKSBjb25zdCB7IHJldHVybiBtX3ZlY3Rvci5iYWNrKCk7IH0KKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBtX3ZlY3Rvci5zaXplKCk7IH0KIAotICAgIHZvaWQgY2xlYXIoKQotICAgIHsKLSAgICAgICAgRlhfSU5UMzIgaTsKLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgbV9uTGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtX3BBcnJheVtpXTsKLSAgICAgICAgfQotICAgICAgICBtX25MZW5ndGggPSAwOwotICAgIH0KKyAgLy8gRGVsZXRlcyBhbGwgdGhlIHBvaW50ZXJzIGNvbnRhaW5lZCB3aXRoaW4uCisgIHZvaWQgY2xlYXIoKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3ZlY3Rvci5zaXplKCk7ICsraSkKKyAgICAgIGRlbGV0ZSBtX3ZlY3RvcltpXTsKKyAgICBtX3ZlY3Rvci5jbGVhcigpOworICB9CiAKLSAgICB2b2lkIGFkZEl0ZW0oVFlQRSAqcEl0ZW0pCi0gICAgewotICAgICAgICBpZihtX25MZW5ndGggPj0gbV9uU2l6ZSkgewotICAgICAgICAgICAgbV9uU2l6ZSArPSA4OwotICAgICAgICAgICAgbV9wQXJyYXkgPSAoVFlQRSoqKW1fcE1vZHVsZS0+SkJpZzJfUmVhbGxvYyhtX3BBcnJheSwgc2l6ZW9mKFRZUEUqKSptX25TaXplKTsKLSAgICAgICAgfQotICAgICAgICBtX3BBcnJheVttX25MZW5ndGgrK10gPSBwSXRlbTsKLSAgICB9CisgIC8vIFRha2VzIG93bmVyc2hpcCBvZiB8cEl0ZW18LgorICB2b2lkIHB1c2hfYmFjayhUWVBFKiBwSXRlbSkgeyBtX3ZlY3Rvci5wdXNoX2JhY2socEl0ZW0pOyB9CiAKKyAgLy8gVGFrZXMgb3duZXJzaGlwIG9mIHxwSXRlbXwuCisgIHZvaWQgc2V0KHNpemVfdCBpbmRleCwgVFlQRSogcEl0ZW0pIHsKKyAgICBkZWxldGUgbV92ZWN0b3JbaW5kZXhdOworICAgIG1fdmVjdG9yW2luZGV4XSA9IHBJdGVtOworICB9CiAKLSAgICBGWF9JTlQzMiBnZXRMZW5ndGgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbkxlbmd0aDsKLSAgICB9CisgIHZvaWQgcmVzaXplKHNpemVfdCBjb3VudCkgeworICAgIGZvciAoc2l6ZV90IGkgPSBjb3VudDsgaSA8IHNpemUoKTsgKytpKQorICAgICAgZGVsZXRlIG1fdmVjdG9yW2ldOworICAgIG1fdmVjdG9yLnJlc2l6ZShjb3VudCk7CisgIH0KIAotICAgIFRZUEUgKmdldEF0KEZYX0lOVDMyIG5JbmRleCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BBcnJheVtuSW5kZXhdOwotICAgIH0KLQotICAgIFRZUEUgKmdldExhc3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEFycmF5W21fbkxlbmd0aCAtIDFdOwotICAgIH0KLXByaXZhdGU6Ci0gICAgRlhfSU5UMzIgbV9uU2l6ZTsKLSAgICBUWVBFICoqbV9wQXJyYXk7Ci0gICAgRlhfSU5UMzIgbV9uTGVuZ3RoOworIHByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPFRZUEUqPiBtX3ZlY3RvcjsKIH07Ci0jZW5kaWYKKworI2VuZGlmICAvLyBDT1JFX1NSQ19GWENPREVDX0pCSUcyX0pCSUcyX0xJU1RfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfTW9kdWxlLmggYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX01vZHVsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTFjZjQwLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfTW9kdWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIF9KQklHMl9NT0RVTEVfSF8KLSNkZWZpbmUgX0pCSUcyX01PRFVMRV9IXwotI2luY2x1ZGUgIkpCaWcyX0RlZmluZS5oIgotY2xhc3MgQ0pCaWcyX01vZHVsZQotewotcHVibGljOgotICAgIHZpcnR1YWwgfkNKQmlnMl9Nb2R1bGUoKSB7IH0KLQotICAgIHZpcnR1YWwgdm9pZCAqSkJpZzJfTWFsbG9jKEZYX0RXT1JEIGR3U2l6ZSkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkICpKQmlnMl9NYWxsb2MyKEZYX0RXT1JEIG51bSwgRlhfRFdPUkQgZHdTaXplKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgKkpCaWcyX01hbGxvYzMoRlhfRFdPUkQgbnVtLCBGWF9EV09SRCBkd1NpemUsIEZYX0RXT1JEIGR3U2l6ZTIpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCAqSkJpZzJfUmVhbGxvYyhGWF9MUFZPSUQgcE1lbSwgRlhfRFdPUkQgZHdTaXplKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgSkJpZzJfRnJlZShGWF9MUFZPSUQgcE1lbSkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkIEpCaWcyX0Fzc2VydChGWF9JTlQzMiBuRXhwcmVzc2lvbikge307Ci0KLSAgICB2aXJ0dWFsCXZvaWQgSkJpZzJfRXJyb3IoRlhfTFBDU1RSIGZvcm1hdCwgLi4uKSB7fTsKLQotICAgIHZpcnR1YWwgdm9pZCBKQmlnMl9XYXJuKEZYX0xQQ1NUUiBmb3JtYXQsIC4uLikge307Ci0KLSAgICB2aXJ0dWFsIHZvaWQgSkJpZzJfTG9nKEZYX0xQQ1NUUiBmb3JtYXQsIC4uLikge307Ci19OwotI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX09iamVjdC5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX09iamVjdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYjI2N2IuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9PYmplY3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgIkpCaWcyX09iamVjdC5oIgotI2luY2x1ZGUgIkpCaWcyX01vZHVsZS5oIgotdm9pZCAqQ0pCaWcyX09iamVjdDo6b3BlcmF0b3IgbmV3KHNpemVfdCBzaXplLCBDSkJpZzJfTW9kdWxlICpwTW9kdWxlLCBGWF9MUENTVFIgZmlsZW5hbWUsIGludCBsaW5lKQotewotICAgIENKQmlnMl9PYmplY3QgKnA7Ci0gICAgcCA9IChDSkJpZzJfT2JqZWN0ICopcE1vZHVsZS0+SkJpZzJfTWFsbG9jKChGWF9EV09SRClzaXplKTsKLSAgICBwLT5tX3BNb2R1bGUgPSBwTW9kdWxlOwotICAgIHJldHVybiBwOwotfQotdm9pZCBDSkJpZzJfT2JqZWN0OjpvcGVyYXRvciBkZWxldGUodm9pZCAqcCwgQ0pCaWcyX01vZHVsZSAqcE1vZHVsZSwgRlhfTFBDU1RSIGZpbGVuYW1lLCBpbnQgbGluZSkKLXsKLSAgICBwTW9kdWxlLT5KQmlnMl9GcmVlKHApOwotfQotdm9pZCAqQ0pCaWcyX09iamVjdDo6b3BlcmF0b3IgbmV3KHNpemVfdCBzaXplLCBDSkJpZzJfTW9kdWxlICpwTW9kdWxlKQotewotICAgIENKQmlnMl9PYmplY3QgKnA7Ci0gICAgcCA9IChDSkJpZzJfT2JqZWN0ICopcE1vZHVsZS0+SkJpZzJfTWFsbG9jKChGWF9EV09SRClzaXplKTsKLSAgICBwLT5tX3BNb2R1bGUgPSBwTW9kdWxlOwotICAgIHJldHVybiBwOwotfQotdm9pZCBDSkJpZzJfT2JqZWN0OjpvcGVyYXRvciBkZWxldGUodm9pZCAqcCkKLXsKLSAgICAoKENKQmlnMl9PYmplY3QgKilwKS0+bV9wTW9kdWxlLT5KQmlnMl9GcmVlKHApOwotfQotdm9pZCBDSkJpZzJfT2JqZWN0OjpvcGVyYXRvciBkZWxldGUodm9pZCAqcCwgQ0pCaWcyX01vZHVsZSAqcE1vZHVsZSkKLXsKLSAgICBwTW9kdWxlLT5KQmlnMl9GcmVlKHApOwotfQotdm9pZCAqQ0pCaWcyX09iamVjdDo6b3BlcmF0b3IgbmV3W10oc2l6ZV90IHNpemUsIENKQmlnMl9Nb2R1bGUgKnBNb2R1bGUsIHNpemVfdCB1bml0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUENTVFIgZmlsZW5hbWUsIGludCBsaW5lKQotewotICAgIHZvaWQgKnA7Ci0gICAgRlhfQllURSAqcEN1ciwgKnBFbmQ7Ci0gICAgcCA9IChGWF9CWVRFICopcE1vZHVsZS0+SkJpZzJfTWFsbG9jKChGWF9EV09SRClzaXplKTsKLSAgICBwQ3VyID0gKEZYX0JZVEUgKilwOwotICAgIHBFbmQgPSBwQ3VyICsgc2l6ZTsKLSAgICBmb3IoOyBwQ3VyIDwgcEVuZDsgcEN1ciArPSB1bml0X3NpemUpIHsKLSAgICAgICAgKChDSkJpZzJfT2JqZWN0ICopcEN1ciktPm1fcE1vZHVsZSA9IHBNb2R1bGU7Ci0gICAgfQotICAgIHJldHVybiBwOwotfQotdm9pZCBDSkJpZzJfT2JqZWN0OjpvcGVyYXRvciBkZWxldGVbXSh2b2lkICpwLCBDSkJpZzJfTW9kdWxlICpwTW9kdWxlLCBzaXplX3QgdW5pdF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUENTVFIgZmlsZW5hbWUsIGludCBsaW5lKQotewotICAgIHBNb2R1bGUtPkpCaWcyX0ZyZWUocCk7Ci19Ci12b2lkICpDSkJpZzJfT2JqZWN0OjpvcGVyYXRvciBuZXdbXShzaXplX3Qgc2l6ZSwgQ0pCaWcyX01vZHVsZSAqcE1vZHVsZSwgc2l6ZV90IHVuaXRfc2l6ZSkKLXsKLSAgICB2b2lkICpwOwotICAgIEZYX0JZVEUgKnBDdXIsICpwRW5kOwotICAgIHAgPSAoRlhfQllURSAqKXBNb2R1bGUtPkpCaWcyX01hbGxvYygoRlhfRFdPUkQpc2l6ZSk7Ci0gICAgcEN1ciA9IChGWF9CWVRFICopcDsKLSAgICBwRW5kID0gcEN1ciArIHNpemU7Ci0gICAgZm9yKDsgcEN1ciA8IHBFbmQ7IHBDdXIgKz0gdW5pdF9zaXplKSB7Ci0gICAgICAgICgoQ0pCaWcyX09iamVjdCAqKXBDdXIpLT5tX3BNb2R1bGUgPSBwTW9kdWxlOwotICAgIH0KLSAgICByZXR1cm4gcDsKLX0KLXZvaWQgQ0pCaWcyX09iamVjdDo6b3BlcmF0b3IgZGVsZXRlW10odm9pZCogcCkKLXsKLSAgICAoKENKQmlnMl9PYmplY3QgKilwKS0+bV9wTW9kdWxlLT5KQmlnMl9GcmVlKHApOwotfQotdm9pZCBDSkJpZzJfT2JqZWN0OjpvcGVyYXRvciBkZWxldGVbXSh2b2lkICpwLCBDSkJpZzJfTW9kdWxlICpwTW9kdWxlLCBzaXplX3QgdW5pdF9zaXplKQotewotICAgIHBNb2R1bGUtPkpCaWcyX0ZyZWUocCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX09iamVjdC5oIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9PYmplY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNlZWNiZi4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX09iamVjdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBfSkJJRzJfT0JKRUNUX0hfCi0jZGVmaW5lIF9KQklHMl9PQkpFQ1RfSF8KLSNpbmNsdWRlICJKQmlnMl9EZWZpbmUuaCIKLWNsYXNzIENKQmlnMl9Nb2R1bGU7Ci0jZGVmaW5lIF9KQklHMl9OT19FWFBFQ1RJT05fCi1jbGFzcyBDSkJpZzJfT2JqZWN0Ci17Ci1wdWJsaWM6Ci0KLSAgICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUsIENKQmlnMl9Nb2R1bGUgKnBNb2R1bGUsIEZYX0xQQ1NUUiBmaWxlbmFtZSwgaW50IGxpbmUpOwotCi0gICAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqcCwgQ0pCaWcyX01vZHVsZSAqcE1vZHVsZSwgRlhfTFBDU1RSIGZpbGVuYW1lLCBpbnQgbGluZSk7Ci0KLSAgICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUsIENKQmlnMl9Nb2R1bGUgKnBNb2R1bGUpOwotCi0gICAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqcCk7Ci0KLSAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICpwLCBDSkJpZzJfTW9kdWxlICpwTW9kdWxlKTsKLQotICAgIHZvaWQgKm9wZXJhdG9yIG5ld1tdKHNpemVfdCBzaXplLCBDSkJpZzJfTW9kdWxlICpwTW9kdWxlLCBzaXplX3QgdW5pdF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQ1NUUiBmaWxlbmFtZSwgaW50IGxpbmUpOwotCi0gICAgdm9pZCBvcGVyYXRvciBkZWxldGVbXSh2b2lkICpwLCBDSkJpZzJfTW9kdWxlICpwTW9kdWxlLCBzaXplX3QgdW5pdF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBDU1RSIGZpbGVuYW1lLCBpbnQgbGluZSk7Ci0KLSAgICB2b2lkICpvcGVyYXRvciBuZXdbXShzaXplX3Qgc2l6ZSwgQ0pCaWcyX01vZHVsZSAqcE1vZHVsZSwgc2l6ZV90IHVuaXRfc2l6ZSk7Ci0KLSAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqIHApOwotCi0gICAgdm9pZCBvcGVyYXRvciBkZWxldGVbXSh2b2lkICpwLCBDSkJpZzJfTW9kdWxlICpwTW9kdWxlLCBzaXplX3QgdW5pdF9zaXplKTsKLXB1YmxpYzoKLQotICAgIENKQmlnMl9Nb2R1bGUgKm1fcE1vZHVsZTsKLX07Ci0jZGVmaW5lIEpCSUcyX05FVyBuZXcobV9wTW9kdWxlKQotI2RlZmluZSBKQklHMl9BTExPQyhwLCBhKSBwID0gSkJJRzJfTkVXIGE7IHAtPm1fcE1vZHVsZSA9IG1fcE1vZHVsZTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9QYWdlLmggYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1BhZ2UuaAppbmRleCBkNzM5OWJkLi42ZDVlNTVhIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1BhZ2UuaAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1BhZ2UuaApAQCAtMSwxOSArMSwyMiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIF9KQklHMl9QQUdFX0hfCiAjZGVmaW5lIF9KQklHMl9QQUdFX0hfCi0jaW5jbHVkZSAiSkJpZzJfSW1hZ2UuaCIKLXN0cnVjdCBKQmlnMlBhZ2VJbmZvIDogcHVibGljIENKQmlnMl9PYmplY3QgewotICAgIEZYX0RXT1JEIG1fZHdXaWR0aCwKLSAgICAgICAgICAgICBtX2R3SGVpZ2h0OwotICAgIEZYX0RXT1JEIG1fZHdSZXNvbHV0aW9uWCwKLSAgICAgICAgICAgICBtX2R3UmVzb2x1dGlvblk7Ci0gICAgRlhfQllURSBtX2NGbGFnczsKLSAgICBGWF9CT09MIG1fYklzU3RyaXBlZDsKLSAgICBGWF9XT1JEIG1fd01heFN0cmlwZVNpemU7CisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmgiCisKK3N0cnVjdCBKQmlnMlBhZ2VJbmZvIHsKKyAgRlhfRFdPUkQgbV9kd1dpZHRoOworICBGWF9EV09SRCBtX2R3SGVpZ2h0OworICBGWF9EV09SRCBtX2R3UmVzb2x1dGlvblg7CisgIEZYX0RXT1JEIG1fZHdSZXNvbHV0aW9uWTsKKyAgdWludDhfdCBtX2NGbGFnczsKKyAgRlhfQk9PTCBtX2JJc1N0cmlwZWQ7CisgIEZYX1dPUkQgbV93TWF4U3RyaXBlU2l6ZTsKIH07CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9QYXR0ZXJuRGljdC5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1BhdHRlcm5EaWN0LmNwcAppbmRleCAwYzZlNWJlLi5iMzJkYWEwIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1BhdHRlcm5EaWN0LmNwcAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1BhdHRlcm5EaWN0LmNwcApAQCAtMSwyNCArMSwyMyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSAiSkJpZzJfUGF0dGVybkRpY3QuaCIKLUNKQmlnMl9QYXR0ZXJuRGljdDo6Q0pCaWcyX1BhdHRlcm5EaWN0KCkKLXsKLSAgICBOVU1QQVRTID0gMDsKLSAgICBIRFBBVFMgPSBOVUxMOworCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X21lbW9yeS5oIgorCitDSkJpZzJfUGF0dGVybkRpY3Q6OkNKQmlnMl9QYXR0ZXJuRGljdCgpIHsKKyAgTlVNUEFUUyA9IDA7CisgIEhEUEFUUyA9IE5VTEw7CiB9CiAKLUNKQmlnMl9QYXR0ZXJuRGljdDo6fkNKQmlnMl9QYXR0ZXJuRGljdCgpCi17Ci0gICAgaWYoSERQQVRTKSB7Ci0gICAgICAgIGZvcihGWF9EV09SRCBpID0gMDsgaSA8IE5VTVBBVFM7IGkrKykgewotICAgICAgICAgICAgaWYoSERQQVRTW2ldKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIEhEUEFUU1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUoSERQQVRTKTsKK0NKQmlnMl9QYXR0ZXJuRGljdDo6fkNKQmlnMl9QYXR0ZXJuRGljdCgpIHsKKyAgaWYgKEhEUEFUUykgeworICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBOVU1QQVRTOyBpKyspIHsKKyAgICAgIGRlbGV0ZSBIRFBBVFNbaV07CiAgICAgfQorICAgIEZYX0ZyZWUoSERQQVRTKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9QYXR0ZXJuRGljdC5oIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9QYXR0ZXJuRGljdC5oCmluZGV4IGI3NWNiZGUuLjQzMjUwZjkgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfUGF0dGVybkRpY3QuaAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1BhdHRlcm5EaWN0LmgKQEAgLTEsMjIgKzEsMjAgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBfSkJJRzJfUEFUVEVSTl9ESUNUX0hfCiAjZGVmaW5lIF9KQklHMl9QQVRURVJOX0RJQ1RfSF8KICNpbmNsdWRlICJKQmlnMl9EZWZpbmUuaCIKICNpbmNsdWRlICJKQmlnMl9JbWFnZS5oIgotY2xhc3MgQ0pCaWcyX1BhdHRlcm5EaWN0IDogcHVibGljIENKQmlnMl9PYmplY3QKLXsKLXB1YmxpYzoKK2NsYXNzIENKQmlnMl9QYXR0ZXJuRGljdCB7CisgcHVibGljOgorICBDSkJpZzJfUGF0dGVybkRpY3QoKTsKIAotICAgIENKQmlnMl9QYXR0ZXJuRGljdCgpOworICB+Q0pCaWcyX1BhdHRlcm5EaWN0KCk7CiAKLSAgICB+Q0pCaWcyX1BhdHRlcm5EaWN0KCk7Ci1wdWJsaWM6Ci0gICAgRlhfRFdPUkQgTlVNUEFUUzsKLSAgICBDSkJpZzJfSW1hZ2UgKipIRFBBVFM7CisgIEZYX0RXT1JEIE5VTVBBVFM7CisgIENKQmlnMl9JbWFnZSoqIEhEUEFUUzsKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfUGRkUHJvYy5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1BkZFByb2MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OTA3NzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1BkZFByb2MuY3BwCkBAIC0wLDAgKzEsODcgQEAKKy8vIENvcHlyaWdodCAyMDE1IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgIkpCaWcyX1BkZFByb2MuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgIkpCaWcyX0dyZFByb2MuaCIKKyNpbmNsdWRlICJKQmlnMl9JbWFnZS5oIgorI2luY2x1ZGUgIkpCaWcyX1BhdHRlcm5EaWN0LmgiCisKK0NKQmlnMl9QYXR0ZXJuRGljdCogQ0pCaWcyX1BERFByb2M6OmRlY29kZV9Bcml0aCgKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCwKKyAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICBGWF9EV09SRCBHUkFZOworICBDSkJpZzJfSW1hZ2UqIEJIREMgPSBudWxscHRyOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX1BhdHRlcm5EaWN0PiBwRGljdChuZXcgQ0pCaWcyX1BhdHRlcm5EaWN0KCkpOworICBwRGljdC0+TlVNUEFUUyA9IEdSQVlNQVggKyAxOworICBwRGljdC0+SERQQVRTID0gRlhfQWxsb2MoQ0pCaWcyX0ltYWdlKiwgcERpY3QtPk5VTVBBVFMpOworICBKQklHMl9tZW1zZXQocERpY3QtPkhEUEFUUywgMCwgc2l6ZW9mKENKQmlnMl9JbWFnZSopICogcERpY3QtPk5VTVBBVFMpOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfR1JEUHJvYz4gcEdSRChuZXcgQ0pCaWcyX0dSRFByb2MoKSk7CisgIHBHUkQtPk1NUiA9IEhETU1SOworICBwR1JELT5HQlcgPSAoR1JBWU1BWCArIDEpICogSERQVzsKKyAgcEdSRC0+R0JIID0gSERQSDsKKyAgcEdSRC0+R0JURU1QTEFURSA9IEhEVEVNUExBVEU7CisgIHBHUkQtPlRQR0RPTiA9IDA7CisgIHBHUkQtPlVTRVNLSVAgPSAwOworICBwR1JELT5HQkFUWzBdID0gLShpbnQzMl90KUhEUFc7CisgIHBHUkQtPkdCQVRbMV0gPSAwOworICBpZiAocEdSRC0+R0JURU1QTEFURSA9PSAwKSB7CisgICAgcEdSRC0+R0JBVFsyXSA9IC0zOworICAgIHBHUkQtPkdCQVRbM10gPSAtMTsKKyAgICBwR1JELT5HQkFUWzRdID0gMjsKKyAgICBwR1JELT5HQkFUWzVdID0gLTI7CisgICAgcEdSRC0+R0JBVFs2XSA9IC0yOworICAgIHBHUkQtPkdCQVRbN10gPSAtMjsKKyAgfQorICBGWENPREVDX1NUQVRVUyBzdGF0dXMgPQorICAgICAgcEdSRC0+U3RhcnRfZGVjb2RlX0FyaXRoKCZCSERDLCBwQXJpdGhEZWNvZGVyLCBnYkNvbnRleHQsIG51bGxwdHIpOworICB3aGlsZSAoc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsKKyAgICBwR1JELT5Db250aW51ZV9kZWNvZGUocFBhdXNlKTsKKyAgfQorICBpZiAoIUJIREMpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgR1JBWSA9IDA7CisgIHdoaWxlIChHUkFZIDw9IEdSQVlNQVgpIHsKKyAgICBwRGljdC0+SERQQVRTW0dSQVldID0gQkhEQy0+c3ViSW1hZ2UoSERQVyAqIEdSQVksIDAsIEhEUFcsIEhEUEgpOworICAgIEdSQVkgPSBHUkFZICsgMTsKKyAgfQorICBkZWxldGUgQkhEQzsKKyAgcmV0dXJuIHBEaWN0LnJlbGVhc2UoKTsKK30KKworQ0pCaWcyX1BhdHRlcm5EaWN0KiBDSkJpZzJfUEREUHJvYzo6ZGVjb2RlX01NUihDSkJpZzJfQml0U3RyZWFtKiBwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICBGWF9EV09SRCBHUkFZOworICBDSkJpZzJfSW1hZ2UqIEJIREMgPSBudWxscHRyOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX1BhdHRlcm5EaWN0PiBwRGljdChuZXcgQ0pCaWcyX1BhdHRlcm5EaWN0KCkpOworICBwRGljdC0+TlVNUEFUUyA9IEdSQVlNQVggKyAxOworICBwRGljdC0+SERQQVRTID0gRlhfQWxsb2MoQ0pCaWcyX0ltYWdlKiwgcERpY3QtPk5VTVBBVFMpOworICBKQklHMl9tZW1zZXQocERpY3QtPkhEUEFUUywgMCwgc2l6ZW9mKENKQmlnMl9JbWFnZSopICogcERpY3QtPk5VTVBBVFMpOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfR1JEUHJvYz4gcEdSRChuZXcgQ0pCaWcyX0dSRFByb2MoKSk7CisgIHBHUkQtPk1NUiA9IEhETU1SOworICBwR1JELT5HQlcgPSAoR1JBWU1BWCArIDEpICogSERQVzsKKyAgcEdSRC0+R0JIID0gSERQSDsKKyAgRlhDT0RFQ19TVEFUVVMgc3RhdHVzID0gcEdSRC0+U3RhcnRfZGVjb2RlX01NUigmQkhEQywgcFN0cmVhbSwgbnVsbHB0cik7CisgIHdoaWxlIChzdGF0dXMgPT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRSkgeworICAgIHBHUkQtPkNvbnRpbnVlX2RlY29kZShwUGF1c2UpOworICB9CisgIGlmICghQkhEQykKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBHUkFZID0gMDsKKyAgd2hpbGUgKEdSQVkgPD0gR1JBWU1BWCkgeworICAgIHBEaWN0LT5IRFBBVFNbR1JBWV0gPSBCSERDLT5zdWJJbWFnZShIRFBXICogR1JBWSwgMCwgSERQVywgSERQSCk7CisgICAgR1JBWSA9IEdSQVkgKyAxOworICB9CisgIGRlbGV0ZSBCSERDOworICByZXR1cm4gcERpY3QucmVsZWFzZSgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9QZGRQcm9jLmggYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1BkZFByb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjg3NWY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9QZGRQcm9jLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfU1JDX0ZYQ09ERUNfSkJJRzJfSkJJRzJfUEREUFJPQ19IXworI2RlZmluZSBDT1JFX1NSQ19GWENPREVDX0pCSUcyX0pCSUcyX1BERFBST0NfSF8KKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaCIKKworY2xhc3MgQ0pCaWcyX0FyaXRoRGVjb2RlcjsKK2NsYXNzIENKQmlnMl9CaXRTdHJlYW07CitjbGFzcyBDSkJpZzJfUGF0dGVybkRpY3Q7CitjbGFzcyBJRlhfUGF1c2U7CitzdHJ1Y3QgSkJpZzJBcml0aEN0eDsKKworY2xhc3MgQ0pCaWcyX1BERFByb2MgeworIHB1YmxpYzoKKyAgQ0pCaWcyX1BhdHRlcm5EaWN0KiBkZWNvZGVfQXJpdGgoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7CisKKyAgQ0pCaWcyX1BhdHRlcm5EaWN0KiBkZWNvZGVfTU1SKENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0sIElGWF9QYXVzZSogcFBhdXNlKTsKKworIHB1YmxpYzoKKyAgRlhfQk9PTCBIRE1NUjsKKyAgdWludDhfdCBIRFBXOworICB1aW50OF90IEhEUEg7CisgIEZYX0RXT1JEIEdSQVlNQVg7CisgIHVpbnQ4X3QgSERURU1QTEFURTsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9TUkNfRlhDT0RFQ19KQklHMl9KQklHMl9QRERQUk9DX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1NkZFByb2MuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TZGRQcm9jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWE3MDYyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TZGRQcm9jLmNwcApAQCAtMCwwICsxLDYyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TZGRQcm9jLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCisjaW5jbHVkZSAiY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Bcml0aEludERlY29kZXIuaCIKKyNpbmNsdWRlICJjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0dyZFByb2MuaCIKKyNpbmNsdWRlICJjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0dycmRQcm9jLmgiCisjaW5jbHVkZSAiY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuRGVjb2Rlci5oIgorI2luY2x1ZGUgImNvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlLmgiCisjaW5jbHVkZSAiY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGVfU3RhbmRhcmQuaCIKKyNpbmNsdWRlICJjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1N5bWJvbERpY3QuaCIKKyNpbmNsdWRlICJjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1RyZFByb2MuaCIKKworQ0pCaWcyX1N5bWJvbERpY3QqIENKQmlnMl9TRERQcm9jOjpkZWNvZGVfQXJpdGgoCisgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICBzdGQ6OnZlY3RvcjxKQmlnMkFyaXRoQ3R4PiogZ2JDb250ZXh0LAorICAgIHN0ZDo6dmVjdG9yPEpCaWcyQXJpdGhDdHg+KiBnckNvbnRleHQpIHsKKyAgQ0pCaWcyX0ltYWdlKiogU0RORVdTWU1TOworICBGWF9EV09SRCBIQ0hFSUdIVCwgTlNZTVNERUNPREVEOworICBpbnQzMl90IEhDREg7CisgIEZYX0RXT1JEIFNZTVdJRFRILCBUT1RXSURUSDsKKyAgaW50MzJfdCBEVzsKKyAgQ0pCaWcyX0ltYWdlKiBCUzsKKyAgRlhfRFdPUkQgSSwgSiwgUkVGQUdHTklOU1Q7CisgIEZYX0JPT0wqIEVYRkxBR1M7CisgIEZYX0RXT1JEIEVYSU5ERVg7CisgIEZYX0JPT0wgQ1VSRVhGTEFHOworICBGWF9EV09SRCBFWFJVTkxFTkdUSDsKKyAgRlhfRFdPUkQgblRtcDsKKyAgRlhfRFdPUkQgU0JOVU1TWU1TOworICB1aW50OF90IFNCU1lNQ09ERUxFTjsKKyAgaW50MzJfdCBSRFhJLCBSRFlJOworICBDSkJpZzJfSW1hZ2UqKiBTQlNZTVM7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfQXJpdGhJYWlkRGVjb2Rlcj4gSUFJRDsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9TeW1ib2xEaWN0PiBwRGljdDsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Bcml0aEludERlY29kZXI+IElBREgobmV3IENKQmlnMl9Bcml0aEludERlY29kZXIpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0FyaXRoSW50RGVjb2Rlcj4gSUFEVyhuZXcgQ0pCaWcyX0FyaXRoSW50RGVjb2Rlcik7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfQXJpdGhJbnREZWNvZGVyPiBJQUFJKG5ldyBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Bcml0aEludERlY29kZXI+IElBUkRYKG5ldyBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Bcml0aEludERlY29kZXI+IElBUkRZKG5ldyBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Bcml0aEludERlY29kZXI+IElBRVgobmV3IENKQmlnMl9Bcml0aEludERlY29kZXIpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0FyaXRoSW50RGVjb2Rlcj4gSUFEVChuZXcgQ0pCaWcyX0FyaXRoSW50RGVjb2Rlcik7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfQXJpdGhJbnREZWNvZGVyPiBJQUZTKG5ldyBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Bcml0aEludERlY29kZXI+IElBRFMobmV3IENKQmlnMl9Bcml0aEludERlY29kZXIpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0FyaXRoSW50RGVjb2Rlcj4gSUFJVChuZXcgQ0pCaWcyX0FyaXRoSW50RGVjb2Rlcik7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfQXJpdGhJbnREZWNvZGVyPiBJQVJJKG5ldyBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Bcml0aEludERlY29kZXI+IElBUkRXKG5ldyBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Bcml0aEludERlY29kZXI+IElBUkRIKG5ldyBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKTsKKyAgblRtcCA9IDA7CisgIHdoaWxlICgoRlhfRFdPUkQpKDEgPDwgblRtcCkgPCAoU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVMpKSB7CisgICAgblRtcCsrOworICB9CisgIElBSUQucmVzZXQobmV3IENKQmlnMl9Bcml0aElhaWREZWNvZGVyKCh1aW50OF90KW5UbXApKTsKKyAgU0RORVdTWU1TID0gRlhfQWxsb2MoQ0pCaWcyX0ltYWdlKiwgU0ROVU1ORVdTWU1TKTsKKyAgRlhTWVNfbWVtc2V0KFNETkVXU1lNUywgMCwgU0ROVU1ORVdTWU1TICogc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKKworICBIQ0hFSUdIVCA9IDA7CisgIE5TWU1TREVDT0RFRCA9IDA7CisgIHdoaWxlIChOU1lNU0RFQ09ERUQgPCBTRE5VTU5FV1NZTVMpIHsKKyAgICBCUyA9IG51bGxwdHI7CisgICAgSUFESC0+ZGVjb2RlKHBBcml0aERlY29kZXIsICZIQ0RIKTsKKyAgICBIQ0hFSUdIVCA9IEhDSEVJR0hUICsgSENESDsKKyAgICBpZiAoKGludClIQ0hFSUdIVCA8IDAgfHwgKGludClIQ0hFSUdIVCA+IEpCSUcyX01BWF9JTUFHRV9TSVpFKSB7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgICAgU1lNV0lEVEggPSAwOworICAgIFRPVFdJRFRIID0gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICBpZiAoIUlBRFctPmRlY29kZShwQXJpdGhEZWNvZGVyLCAmRFcpKQorICAgICAgICBicmVhazsKKworICAgICAgaWYgKE5TWU1TREVDT0RFRCA+PSBTRE5VTU5FV1NZTVMpCisgICAgICAgIGdvdG8gZmFpbGVkOworCisgICAgICBTWU1XSURUSCA9IFNZTVdJRFRIICsgRFc7CisgICAgICBpZiAoKGludClTWU1XSURUSCA8IDAgfHwgKGludClTWU1XSURUSCA+IEpCSUcyX01BWF9JTUFHRV9TSVpFKQorICAgICAgICBnb3RvIGZhaWxlZDsKKworICAgICAgaWYgKEhDSEVJR0hUID09IDAgfHwgU1lNV0lEVEggPT0gMCkgeworICAgICAgICBUT1RXSURUSCA9IFRPVFdJRFRIICsgU1lNV0lEVEg7CisgICAgICAgIFNETkVXU1lNU1tOU1lNU0RFQ09ERURdID0gbnVsbHB0cjsKKyAgICAgICAgTlNZTVNERUNPREVEID0gTlNZTVNERUNPREVEICsgMTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBUT1RXSURUSCA9IFRPVFdJRFRIICsgU1lNV0lEVEg7CisgICAgICBpZiAoU0RSRUZBR0cgPT0gMCkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0dSRFByb2M+IHBHUkQobmV3IENKQmlnMl9HUkRQcm9jKCkpOworICAgICAgICBwR1JELT5NTVIgPSAwOworICAgICAgICBwR1JELT5HQlcgPSBTWU1XSURUSDsKKyAgICAgICAgcEdSRC0+R0JIID0gSENIRUlHSFQ7CisgICAgICAgIHBHUkQtPkdCVEVNUExBVEUgPSBTRFRFTVBMQVRFOworICAgICAgICBwR1JELT5UUEdET04gPSAwOworICAgICAgICBwR1JELT5VU0VTS0lQID0gMDsKKyAgICAgICAgcEdSRC0+R0JBVFswXSA9IFNEQVRbMF07CisgICAgICAgIHBHUkQtPkdCQVRbMV0gPSBTREFUWzFdOworICAgICAgICBwR1JELT5HQkFUWzJdID0gU0RBVFsyXTsKKyAgICAgICAgcEdSRC0+R0JBVFszXSA9IFNEQVRbM107CisgICAgICAgIHBHUkQtPkdCQVRbNF0gPSBTREFUWzRdOworICAgICAgICBwR1JELT5HQkFUWzVdID0gU0RBVFs1XTsKKyAgICAgICAgcEdSRC0+R0JBVFs2XSA9IFNEQVRbNl07CisgICAgICAgIHBHUkQtPkdCQVRbN10gPSBTREFUWzddOworICAgICAgICBCUyA9IHBHUkQtPmRlY29kZV9Bcml0aChwQXJpdGhEZWNvZGVyLCBnYkNvbnRleHQtPmRhdGEoKSk7CisgICAgICAgIGlmICghQlMpIHsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgSUFBSS0+ZGVjb2RlKHBBcml0aERlY29kZXIsIChpbnQqKSZSRUZBR0dOSU5TVCk7CisgICAgICAgIGlmIChSRUZBR0dOSU5TVCA+IDEpIHsKKyAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX1RSRFByb2M+IHBEZWNvZGVyKG5ldyBDSkJpZzJfVFJEUHJvYygpKTsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGID0gU0RIVUZGOworICAgICAgICAgIHBEZWNvZGVyLT5TQlJFRklORSA9IDE7CisgICAgICAgICAgcERlY29kZXItPlNCVyA9IFNZTVdJRFRIOworICAgICAgICAgIHBEZWNvZGVyLT5TQkggPSBIQ0hFSUdIVDsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JOVU1JTlNUQU5DRVMgPSBSRUZBR0dOSU5TVDsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JTVFJJUFMgPSAxOworICAgICAgICAgIHBEZWNvZGVyLT5TQk5VTVNZTVMgPSBTRE5VTUlOU1lNUyArIE5TWU1TREVDT0RFRDsKKyAgICAgICAgICBTQk5VTVNZTVMgPSBwRGVjb2Rlci0+U0JOVU1TWU1TOworICAgICAgICAgIG5UbXAgPSAwOworICAgICAgICAgIHdoaWxlICgoRlhfRFdPUkQpKDEgPDwgblRtcCkgPCBTQk5VTVNZTVMpIHsKKyAgICAgICAgICAgIG5UbXArKzsKKyAgICAgICAgICB9CisgICAgICAgICAgU0JTWU1DT0RFTEVOID0gKHVpbnQ4X3QpblRtcDsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JTWU1DT0RFTEVOID0gU0JTWU1DT0RFTEVOOworICAgICAgICAgIFNCU1lNUyA9IEZYX0FsbG9jKENKQmlnMl9JbWFnZSosIFNCTlVNU1lNUyk7CisgICAgICAgICAgSkJJRzJfbWVtY3B5KFNCU1lNUywgU0RJTlNZTVMsIFNETlVNSU5TWU1TICogc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKKyAgICAgICAgICBKQklHMl9tZW1jcHkoU0JTWU1TICsgU0ROVU1JTlNZTVMsIFNETkVXU1lNUywKKyAgICAgICAgICAgICAgICAgICAgICAgTlNZTVNERUNPREVEICogc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JTWU1TID0gU0JTWU1TOworICAgICAgICAgIHBEZWNvZGVyLT5TQkRFRlBJWEVMID0gMDsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JDT01CT1AgPSBKQklHMl9DT01QT1NFX09SOworICAgICAgICAgIHBEZWNvZGVyLT5UUkFOU1BPU0VEID0gMDsKKyAgICAgICAgICBwRGVjb2Rlci0+UkVGQ09STkVSID0gSkJJRzJfQ09STkVSX1RPUExFRlQ7CisgICAgICAgICAgcERlY29kZXItPlNCRFNPRkZTRVQgPSAwOworICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSHVmZm1hblRhYmxlPiBTQkhVRkZGUyhuZXcgQ0pCaWcyX0h1ZmZtYW5UYWJsZSgKKyAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0I2LCBGWF9BcnJheVNpemUoSHVmZm1hblRhYmxlX0I2KSwKKyAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0I2KSk7CisgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9IdWZmbWFuVGFibGU+IFNCSFVGRkRTKG5ldyBDSkJpZzJfSHVmZm1hblRhYmxlKAorICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfQjgsIEZYX0FycmF5U2l6ZShIdWZmbWFuVGFibGVfQjgpLAorICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjgpKTsKKyAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4gU0JIVUZGRFQobmV3IENKQmlnMl9IdWZmbWFuVGFibGUoCisgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9CMTEsIEZYX0FycmF5U2l6ZShIdWZmbWFuVGFibGVfQjExKSwKKyAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0IxMSkpOworICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSHVmZm1hblRhYmxlPiBTQkhVRkZSRFcoCisgICAgICAgICAgICAgIG5ldyBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShIdWZmbWFuVGFibGVfQjE1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0IxNSkpOworICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSHVmZm1hblRhYmxlPiBTQkhVRkZSREgoCisgICAgICAgICAgICAgIG5ldyBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShIdWZmbWFuVGFibGVfQjE1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0IxNSkpOworICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSHVmZm1hblRhYmxlPiBTQkhVRkZSRFgoCisgICAgICAgICAgICAgIG5ldyBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShIdWZmbWFuVGFibGVfQjE1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0IxNSkpOworICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSHVmZm1hblRhYmxlPiBTQkhVRkZSRFkoCisgICAgICAgICAgICAgIG5ldyBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShIdWZmbWFuVGFibGVfQjE1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0IxNSkpOworICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSHVmZm1hblRhYmxlPiBTQkhVRkZSU0laRSgKKyAgICAgICAgICAgICAgbmV3IENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BcnJheVNpemUoSHVmZm1hblRhYmxlX0IxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0IxKSk7CisgICAgICAgICAgcERlY29kZXItPlNCSFVGRkZTID0gU0JIVUZGRlMuZ2V0KCk7CisgICAgICAgICAgcERlY29kZXItPlNCSFVGRkRTID0gU0JIVUZGRFMuZ2V0KCk7CisgICAgICAgICAgcERlY29kZXItPlNCSFVGRkRUID0gU0JIVUZGRFQuZ2V0KCk7CisgICAgICAgICAgcERlY29kZXItPlNCSFVGRlJEVyA9IFNCSFVGRlJEVy5nZXQoKTsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGUkRIID0gU0JIVUZGUkRILmdldCgpOworICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZSRFggPSBTQkhVRkZSRFguZ2V0KCk7CisgICAgICAgICAgcERlY29kZXItPlNCSFVGRlJEWSA9IFNCSFVGRlJEWS5nZXQoKTsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGUlNJWkUgPSBTQkhVRkZSU0laRS5nZXQoKTsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JSVEVNUExBVEUgPSBTRFJURU1QTEFURTsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JSQVRbMF0gPSBTRFJBVFswXTsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JSQVRbMV0gPSBTRFJBVFsxXTsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JSQVRbMl0gPSBTRFJBVFsyXTsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JSQVRbM10gPSBTRFJBVFszXTsKKyAgICAgICAgICBKQmlnMkludERlY29kZXJTdGF0ZSBpZHM7CisgICAgICAgICAgaWRzLklBRFQgPSBJQURULmdldCgpOworICAgICAgICAgIGlkcy5JQUZTID0gSUFGUy5nZXQoKTsKKyAgICAgICAgICBpZHMuSUFEUyA9IElBRFMuZ2V0KCk7CisgICAgICAgICAgaWRzLklBSVQgPSBJQUlULmdldCgpOworICAgICAgICAgIGlkcy5JQVJJID0gSUFSSS5nZXQoKTsKKyAgICAgICAgICBpZHMuSUFSRFcgPSBJQVJEVy5nZXQoKTsKKyAgICAgICAgICBpZHMuSUFSREggPSBJQVJESC5nZXQoKTsKKyAgICAgICAgICBpZHMuSUFSRFggPSBJQVJEWC5nZXQoKTsKKyAgICAgICAgICBpZHMuSUFSRFkgPSBJQVJEWS5nZXQoKTsKKyAgICAgICAgICBpZHMuSUFJRCA9IElBSUQuZ2V0KCk7CisgICAgICAgICAgQlMgPSBwRGVjb2Rlci0+ZGVjb2RlX0FyaXRoKHBBcml0aERlY29kZXIsIGdyQ29udGV4dC0+ZGF0YSgpLCAmaWRzKTsKKyAgICAgICAgICBpZiAoIUJTKSB7CisgICAgICAgICAgICBGWF9GcmVlKFNCU1lNUyk7CisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICB9CisgICAgICAgICAgRlhfRnJlZShTQlNZTVMpOworICAgICAgICB9IGVsc2UgaWYgKFJFRkFHR05JTlNUID09IDEpIHsKKyAgICAgICAgICBTQk5VTVNZTVMgPSBTRE5VTUlOU1lNUyArIE5TWU1TREVDT0RFRDsKKyAgICAgICAgICBGWF9EV09SRCBJREk7CisgICAgICAgICAgSUFJRC0+ZGVjb2RlKHBBcml0aERlY29kZXIsICZJREkpOworICAgICAgICAgIElBUkRYLT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJlJEWEkpOworICAgICAgICAgIElBUkRZLT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJlJEWUkpOworICAgICAgICAgIGlmIChJREkgPj0gU0JOVU1TWU1TKSB7CisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICB9CisgICAgICAgICAgU0JTWU1TID0gRlhfQWxsb2MoQ0pCaWcyX0ltYWdlKiwgU0JOVU1TWU1TKTsKKyAgICAgICAgICBKQklHMl9tZW1jcHkoU0JTWU1TLCBTRElOU1lNUywgU0ROVU1JTlNZTVMgKiBzaXplb2YoQ0pCaWcyX0ltYWdlKikpOworICAgICAgICAgIEpCSUcyX21lbWNweShTQlNZTVMgKyBTRE5VTUlOU1lNUywgU0RORVdTWU1TLAorICAgICAgICAgICAgICAgICAgICAgICBOU1lNU0RFQ09ERUQgKiBzaXplb2YoQ0pCaWcyX0ltYWdlKikpOworICAgICAgICAgIGlmICghU0JTWU1TW0lESV0pIHsKKyAgICAgICAgICAgIEZYX0ZyZWUoU0JTWU1TKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgIH0KKyAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0dSUkRQcm9jPiBwR1JSRChuZXcgQ0pCaWcyX0dSUkRQcm9jKCkpOworICAgICAgICAgIHBHUlJELT5HUlcgPSBTWU1XSURUSDsKKyAgICAgICAgICBwR1JSRC0+R1JIID0gSENIRUlHSFQ7CisgICAgICAgICAgcEdSUkQtPkdSVEVNUExBVEUgPSBTRFJURU1QTEFURTsKKyAgICAgICAgICBwR1JSRC0+R1JSRUZFUkVOQ0UgPSBTQlNZTVNbSURJXTsKKyAgICAgICAgICBwR1JSRC0+R1JSRUZFUkVOQ0VEWCA9IFJEWEk7CisgICAgICAgICAgcEdSUkQtPkdSUkVGRVJFTkNFRFkgPSBSRFlJOworICAgICAgICAgIHBHUlJELT5UUEdST04gPSAwOworICAgICAgICAgIHBHUlJELT5HUkFUWzBdID0gU0RSQVRbMF07CisgICAgICAgICAgcEdSUkQtPkdSQVRbMV0gPSBTRFJBVFsxXTsKKyAgICAgICAgICBwR1JSRC0+R1JBVFsyXSA9IFNEUkFUWzJdOworICAgICAgICAgIHBHUlJELT5HUkFUWzNdID0gU0RSQVRbM107CisgICAgICAgICAgQlMgPSBwR1JSRC0+ZGVjb2RlKHBBcml0aERlY29kZXIsIGdyQ29udGV4dC0+ZGF0YSgpKTsKKyAgICAgICAgICBpZiAoIUJTKSB7CisgICAgICAgICAgICBGWF9GcmVlKFNCU1lNUyk7CisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICB9CisgICAgICAgICAgRlhfRnJlZShTQlNZTVMpOworICAgICAgICB9CisgICAgICB9CisgICAgICBTRE5FV1NZTVNbTlNZTVNERUNPREVEXSA9IEJTOworICAgICAgQlMgPSBudWxscHRyOworICAgICAgTlNZTVNERUNPREVEID0gTlNZTVNERUNPREVEICsgMTsKKyAgICB9CisgIH0KKyAgRVhJTkRFWCA9IDA7CisgIENVUkVYRkxBRyA9IDA7CisgIEVYRkxBR1MgPSBGWF9BbGxvYyhGWF9CT09MLCBTRE5VTUlOU1lNUyArIFNETlVNTkVXU1lNUyk7CisgIHdoaWxlIChFWElOREVYIDwgU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVMpIHsKKyAgICBJQUVYLT5kZWNvZGUocEFyaXRoRGVjb2RlciwgKGludCopJkVYUlVOTEVOR1RIKTsKKyAgICBpZiAoRVhJTkRFWCArIEVYUlVOTEVOR1RIID4gU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVMpIHsKKyAgICAgIEZYX0ZyZWUoRVhGTEFHUyk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgICAgaWYgKEVYUlVOTEVOR1RIICE9IDApIHsKKyAgICAgIGZvciAoSSA9IEVYSU5ERVg7IEkgPCBFWElOREVYICsgRVhSVU5MRU5HVEg7IEkrKykgeworICAgICAgICBFWEZMQUdTW0ldID0gQ1VSRVhGTEFHOworICAgICAgfQorICAgIH0KKyAgICBFWElOREVYID0gRVhJTkRFWCArIEVYUlVOTEVOR1RIOworICAgIENVUkVYRkxBRyA9ICFDVVJFWEZMQUc7CisgIH0KKyAgcERpY3QucmVzZXQobmV3IENKQmlnMl9TeW1ib2xEaWN0KTsKKyAgSSA9IEogPSAwOworICBmb3IgKEkgPSAwOyBJIDwgU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVM7IEkrKykgeworICAgIGlmIChFWEZMQUdTW0ldICYmIEogPCBTRE5VTUVYU1lNUykgeworICAgICAgaWYgKEkgPCBTRE5VTUlOU1lNUykgeworICAgICAgICBwRGljdC0+QWRkSW1hZ2UoU0RJTlNZTVNbSV0gPyBuZXcgQ0pCaWcyX0ltYWdlKCpTRElOU1lNU1tJXSkgOiBudWxscHRyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBEaWN0LT5BZGRJbWFnZShTRE5FV1NZTVNbSSAtIFNETlVNSU5TWU1TXSk7CisgICAgICB9CisgICAgICArK0o7CisgICAgfSBlbHNlIGlmICghRVhGTEFHU1tJXSAmJiBJID49IFNETlVNSU5TWU1TKSB7CisgICAgICBkZWxldGUgU0RORVdTWU1TW0kgLSBTRE5VTUlOU1lNU107CisgICAgfQorICB9CisgIEZYX0ZyZWUoRVhGTEFHUyk7CisgIEZYX0ZyZWUoU0RORVdTWU1TKTsKKyAgcmV0dXJuIHBEaWN0LnJlbGVhc2UoKTsKK2ZhaWxlZDoKKyAgZm9yIChJID0gMDsgSSA8IE5TWU1TREVDT0RFRDsgSSsrKSB7CisgICAgaWYgKFNETkVXU1lNU1tJXSkgeworICAgICAgZGVsZXRlIFNETkVXU1lNU1tJXTsKKyAgICAgIFNETkVXU1lNU1tJXSA9IG51bGxwdHI7CisgICAgfQorICB9CisgIEZYX0ZyZWUoU0RORVdTWU1TKTsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK0NKQmlnMl9TeW1ib2xEaWN0KiBDSkJpZzJfU0REUHJvYzo6ZGVjb2RlX0h1ZmZtYW4oCisgICAgQ0pCaWcyX0JpdFN0cmVhbSogcFN0cmVhbSwKKyAgICBzdGQ6OnZlY3RvcjxKQmlnMkFyaXRoQ3R4PiogZ2JDb250ZXh0LAorICAgIHN0ZDo6dmVjdG9yPEpCaWcyQXJpdGhDdHg+KiBnckNvbnRleHQsCisgICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgQ0pCaWcyX0ltYWdlKiogU0RORVdTWU1TOworICBGWF9EV09SRCogU0RORVdTWU1XSURUSFM7CisgIEZYX0RXT1JEIEhDSEVJR0hULCBOU1lNU0RFQ09ERUQ7CisgIGludDMyX3QgSENESDsKKyAgRlhfRFdPUkQgU1lNV0lEVEgsIFRPVFdJRFRILCBIQ0ZJUlNUU1lNOworICBpbnQzMl90IERXOworICBDSkJpZzJfSW1hZ2UqIEJTLCAqQkhDOworICBGWF9EV09SRCBJLCBKLCBSRUZBR0dOSU5TVDsKKyAgRlhfQk9PTCogRVhGTEFHUzsKKyAgRlhfRFdPUkQgRVhJTkRFWDsKKyAgRlhfQk9PTCBDVVJFWEZMQUc7CisgIEZYX0RXT1JEIEVYUlVOTEVOR1RIOworICBpbnQzMl90IG5WYWwsIG5CaXRzOworICBGWF9EV09SRCBuVG1wOworICBGWF9EV09SRCBTQk5VTVNZTVM7CisgIHVpbnQ4X3QgU0JTWU1DT0RFTEVOOworICBKQmlnMkh1ZmZtYW5Db2RlKiBTQlNZTUNPREVTOworICBGWF9EV09SRCBJREk7CisgIGludDMyX3QgUkRYSSwgUkRZSTsKKyAgRlhfRFdPUkQgQk1TSVpFOworICBGWF9EV09SRCBzdHJpZGU7CisgIENKQmlnMl9JbWFnZSoqIFNCU1lNUzsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9IdWZmbWFuRGVjb2Rlcj4gcEh1ZmZtYW5EZWNvZGVyKAorICAgICAgbmV3IENKQmlnMl9IdWZmbWFuRGVjb2RlcihwU3RyZWFtKSk7CisgIFNETkVXU1lNUyA9IEZYX0FsbG9jKENKQmlnMl9JbWFnZSosIFNETlVNTkVXU1lNUyk7CisgIEZYU1lTX21lbXNldChTRE5FV1NZTVMsIDAsIFNETlVNTkVXU1lNUyAqIHNpemVvZihDSkJpZzJfSW1hZ2UqKSk7CisgIFNETkVXU1lNV0lEVEhTID0gbnVsbHB0cjsKKyAgQkhDID0gbnVsbHB0cjsKKyAgaWYgKFNEUkVGQUdHID09IDApIHsKKyAgICBTRE5FV1NZTVdJRFRIUyA9IEZYX0FsbG9jKEZYX0RXT1JELCBTRE5VTU5FV1NZTVMpOworICAgIEZYU1lTX21lbXNldChTRE5FV1NZTVdJRFRIUywgMCwgU0ROVU1ORVdTWU1TICogc2l6ZW9mKEZYX0RXT1JEKSk7CisgIH0KKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9TeW1ib2xEaWN0PiBwRGljdChuZXcgQ0pCaWcyX1N5bWJvbERpY3QoKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSHVmZm1hblRhYmxlPiBwVGFibGU7CisKKyAgSENIRUlHSFQgPSAwOworICBOU1lNU0RFQ09ERUQgPSAwOworICBCUyA9IG51bGxwdHI7CisgIHdoaWxlIChOU1lNU0RFQ09ERUQgPCBTRE5VTU5FV1NZTVMpIHsKKyAgICBpZiAocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0RIVUZGREgsICZIQ0RIKSAhPSAwKSB7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgICAgSENIRUlHSFQgPSBIQ0hFSUdIVCArIEhDREg7CisgICAgaWYgKChpbnQpSENIRUlHSFQgPCAwIHx8IChpbnQpSENIRUlHSFQgPiBKQklHMl9NQVhfSU1BR0VfU0laRSkgeworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICAgIFNZTVdJRFRIID0gMDsKKyAgICBUT1RXSURUSCA9IDA7CisgICAgSENGSVJTVFNZTSA9IE5TWU1TREVDT0RFRDsKKyAgICBmb3IgKDs7KSB7CisgICAgICBuVmFsID0gcEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0RIVUZGRFcsICZEVyk7CisgICAgICBpZiAoblZhbCA9PSBKQklHMl9PT0IpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgaWYgKG5WYWwgIT0gMCkgeworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChOU1lNU0RFQ09ERUQgPj0gU0ROVU1ORVdTWU1TKSB7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgICAgU1lNV0lEVEggPSBTWU1XSURUSCArIERXOworICAgICAgICBpZiAoKGludClTWU1XSURUSCA8IDAgfHwgKGludClTWU1XSURUSCA+IEpCSUcyX01BWF9JTUFHRV9TSVpFKSB7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0gZWxzZSBpZiAoSENIRUlHSFQgPT0gMCB8fCBTWU1XSURUSCA9PSAwKSB7CisgICAgICAgICAgVE9UV0lEVEggPSBUT1RXSURUSCArIFNZTVdJRFRIOworICAgICAgICAgIFNETkVXU1lNU1tOU1lNU0RFQ09ERURdID0gbnVsbHB0cjsKKyAgICAgICAgICBOU1lNU0RFQ09ERUQgPSBOU1lNU0RFQ09ERUQgKyAxOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIFRPVFdJRFRIID0gVE9UV0lEVEggKyBTWU1XSURUSDsKKyAgICAgIH0KKyAgICAgIGlmIChTRFJFRkFHRyA9PSAxKSB7CisgICAgICAgIGlmIChwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTREhVRkZBR0dJTlNULCAoaW50KikmUkVGQUdHTklOU1QpICE9CisgICAgICAgICAgICAwKSB7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgICAgQlMgPSBudWxscHRyOworICAgICAgICBpZiAoUkVGQUdHTklOU1QgPiAxKSB7CisgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9UUkRQcm9jPiBwRGVjb2RlcihuZXcgQ0pCaWcyX1RSRFByb2MoKSk7CisgICAgICAgICAgcERlY29kZXItPlNCSFVGRiA9IFNESFVGRjsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JSRUZJTkUgPSAxOworICAgICAgICAgIHBEZWNvZGVyLT5TQlcgPSBTWU1XSURUSDsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JIID0gSENIRUlHSFQ7CisgICAgICAgICAgcERlY29kZXItPlNCTlVNSU5TVEFOQ0VTID0gUkVGQUdHTklOU1Q7CisgICAgICAgICAgcERlY29kZXItPlNCU1RSSVBTID0gMTsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JOVU1TWU1TID0gU0ROVU1JTlNZTVMgKyBOU1lNU0RFQ09ERUQ7CisgICAgICAgICAgU0JOVU1TWU1TID0gcERlY29kZXItPlNCTlVNU1lNUzsKKyAgICAgICAgICBTQlNZTUNPREVTID0gRlhfQWxsb2MoSkJpZzJIdWZmbWFuQ29kZSwgU0JOVU1TWU1TKTsKKyAgICAgICAgICBuVG1wID0gMTsKKyAgICAgICAgICB3aGlsZSAoKEZYX0RXT1JEKSgxIDw8IG5UbXApIDwgU0JOVU1TWU1TKSB7CisgICAgICAgICAgICBuVG1wKys7CisgICAgICAgICAgfQorICAgICAgICAgIGZvciAoSSA9IDA7IEkgPCBTQk5VTVNZTVM7IEkrKykgeworICAgICAgICAgICAgU0JTWU1DT0RFU1tJXS5jb2RlbGVuID0gblRtcDsKKyAgICAgICAgICAgIFNCU1lNQ09ERVNbSV0uY29kZSA9IEk7CisgICAgICAgICAgfQorICAgICAgICAgIHBEZWNvZGVyLT5TQlNZTUNPREVTID0gU0JTWU1DT0RFUzsKKyAgICAgICAgICBTQlNZTVMgPSBGWF9BbGxvYyhDSkJpZzJfSW1hZ2UqLCBTQk5VTVNZTVMpOworICAgICAgICAgIEpCSUcyX21lbWNweShTQlNZTVMsIFNESU5TWU1TLCBTRE5VTUlOU1lNUyAqIHNpemVvZihDSkJpZzJfSW1hZ2UqKSk7CisgICAgICAgICAgSkJJRzJfbWVtY3B5KFNCU1lNUyArIFNETlVNSU5TWU1TLCBTRE5FV1NZTVMsCisgICAgICAgICAgICAgICAgICAgICAgIE5TWU1TREVDT0RFRCAqIHNpemVvZihDSkJpZzJfSW1hZ2UqKSk7CisgICAgICAgICAgcERlY29kZXItPlNCU1lNUyA9IFNCU1lNUzsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JERUZQSVhFTCA9IDA7CisgICAgICAgICAgcERlY29kZXItPlNCQ09NQk9QID0gSkJJRzJfQ09NUE9TRV9PUjsKKyAgICAgICAgICBwRGVjb2Rlci0+VFJBTlNQT1NFRCA9IDA7CisgICAgICAgICAgcERlY29kZXItPlJFRkNPUk5FUiA9IEpCSUcyX0NPUk5FUl9UT1BMRUZUOworICAgICAgICAgIHBEZWNvZGVyLT5TQkRTT0ZGU0VUID0gMDsKKyAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4gU0JIVUZGRlMobmV3IENKQmlnMl9IdWZmbWFuVGFibGUoCisgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9CNiwgRlhfQXJyYXlTaXplKEh1ZmZtYW5UYWJsZV9CNiksCisgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9CNikpOworICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSHVmZm1hblRhYmxlPiBTQkhVRkZEUyhuZXcgQ0pCaWcyX0h1ZmZtYW5UYWJsZSgKKyAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0I4LCBGWF9BcnJheVNpemUoSHVmZm1hblRhYmxlX0I4KSwKKyAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0I4KSk7CisgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9IdWZmbWFuVGFibGU+IFNCSFVGRkRUKG5ldyBDSkJpZzJfSHVmZm1hblRhYmxlKAorICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfQjExLCBGWF9BcnJheVNpemUoSHVmZm1hblRhYmxlX0IxMSksCisgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTEpKTsKKyAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4gU0JIVUZGUkRXKAorICAgICAgICAgICAgICBuZXcgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BcnJheVNpemUoSHVmZm1hblRhYmxlX0IxNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTUpKTsKKyAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4gU0JIVUZGUkRIKAorICAgICAgICAgICAgICBuZXcgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BcnJheVNpemUoSHVmZm1hblRhYmxlX0IxNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTUpKTsKKyAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4gU0JIVUZGUkRYKAorICAgICAgICAgICAgICBuZXcgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BcnJheVNpemUoSHVmZm1hblRhYmxlX0IxNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTUpKTsKKyAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4gU0JIVUZGUkRZKAorICAgICAgICAgICAgICBuZXcgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BcnJheVNpemUoSHVmZm1hblRhYmxlX0IxNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTUpKTsKKyAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4gU0JIVUZGUlNJWkUoCisgICAgICAgICAgICAgIG5ldyBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQXJyYXlTaXplKEh1ZmZtYW5UYWJsZV9CMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMSkpOworICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZGUyA9IFNCSFVGRkZTLmdldCgpOworICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZEUyA9IFNCSFVGRkRTLmdldCgpOworICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZEVCA9IFNCSFVGRkRULmdldCgpOworICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZSRFcgPSBTQkhVRkZSRFcuZ2V0KCk7CisgICAgICAgICAgcERlY29kZXItPlNCSFVGRlJESCA9IFNCSFVGRlJESC5nZXQoKTsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGUkRYID0gU0JIVUZGUkRYLmdldCgpOworICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZSRFkgPSBTQkhVRkZSRFkuZ2V0KCk7CisgICAgICAgICAgcERlY29kZXItPlNCSFVGRlJTSVpFID0gU0JIVUZGUlNJWkUuZ2V0KCk7CisgICAgICAgICAgcERlY29kZXItPlNCUlRFTVBMQVRFID0gU0RSVEVNUExBVEU7CisgICAgICAgICAgcERlY29kZXItPlNCUkFUWzBdID0gU0RSQVRbMF07CisgICAgICAgICAgcERlY29kZXItPlNCUkFUWzFdID0gU0RSQVRbMV07CisgICAgICAgICAgcERlY29kZXItPlNCUkFUWzJdID0gU0RSQVRbMl07CisgICAgICAgICAgcERlY29kZXItPlNCUkFUWzNdID0gU0RSQVRbM107CisgICAgICAgICAgQlMgPSBwRGVjb2Rlci0+ZGVjb2RlX0h1ZmZtYW4ocFN0cmVhbSwgZ3JDb250ZXh0LT5kYXRhKCkpOworICAgICAgICAgIGlmICghQlMpIHsKKyAgICAgICAgICAgIEZYX0ZyZWUoU0JTWU1DT0RFUyk7CisgICAgICAgICAgICBGWF9GcmVlKFNCU1lNUyk7CisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICB9CisgICAgICAgICAgRlhfRnJlZShTQlNZTUNPREVTKTsKKyAgICAgICAgICBGWF9GcmVlKFNCU1lNUyk7CisgICAgICAgIH0gZWxzZSBpZiAoUkVGQUdHTklOU1QgPT0gMSkgeworICAgICAgICAgIFNCTlVNU1lNUyA9IFNETlVNSU5TWU1TICsgU0ROVU1ORVdTWU1TOworICAgICAgICAgIG5UbXAgPSAxOworICAgICAgICAgIHdoaWxlICgoRlhfRFdPUkQpKDEgPDwgblRtcCkgPCBTQk5VTVNZTVMpIHsKKyAgICAgICAgICAgIG5UbXArKzsKKyAgICAgICAgICB9CisgICAgICAgICAgU0JTWU1DT0RFTEVOID0gKHVpbnQ4X3QpblRtcDsKKyAgICAgICAgICBTQlNZTUNPREVTID0gRlhfQWxsb2MoSkJpZzJIdWZmbWFuQ29kZSwgU0JOVU1TWU1TKTsKKyAgICAgICAgICBmb3IgKEkgPSAwOyBJIDwgU0JOVU1TWU1TOyBJKyspIHsKKyAgICAgICAgICAgIFNCU1lNQ09ERVNbSV0uY29kZWxlbiA9IFNCU1lNQ09ERUxFTjsKKyAgICAgICAgICAgIFNCU1lNQ09ERVNbSV0uY29kZSA9IEk7CisgICAgICAgICAgfQorICAgICAgICAgIG5WYWwgPSAwOworICAgICAgICAgIG5CaXRzID0gMDsKKyAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBpZiAocFN0cmVhbS0+cmVhZDFCaXQoJm5UbXApICE9IDApIHsKKyAgICAgICAgICAgICAgRlhfRnJlZShTQlNZTUNPREVTKTsKKyAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuVmFsID0gKG5WYWwgPDwgMSkgfCBuVG1wOworICAgICAgICAgICAgZm9yIChJREkgPSAwOyBJREkgPCBTQk5VTVNZTVM7IElESSsrKSB7CisgICAgICAgICAgICAgIGlmICgoblZhbCA9PSBTQlNZTUNPREVTW0lESV0uY29kZSkgJiYKKyAgICAgICAgICAgICAgICAgIChuQml0cyA9PSBTQlNZTUNPREVTW0lESV0uY29kZWxlbikpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKElESSA8IFNCTlVNU1lNUykgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgRlhfRnJlZShTQlNZTUNPREVTKTsKKyAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4gU0JIVUZGUkRYKAorICAgICAgICAgICAgICBuZXcgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BcnJheVNpemUoSHVmZm1hblRhYmxlX0IxNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMTUpKTsKKyAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4gU0JIVUZGUlNJWkUoCisgICAgICAgICAgICAgIG5ldyBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQXJyYXlTaXplKEh1ZmZtYW5UYWJsZV9CMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMSkpOworICAgICAgICAgIGlmICgocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0JIVUZGUkRYLmdldCgpLCAmUkRYSSkgIT0gMCkgfHwKKyAgICAgICAgICAgICAgKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNCSFVGRlJEWC5nZXQoKSwgJlJEWUkpICE9IDApIHx8CisgICAgICAgICAgICAgIChwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTQkhVRkZSU0laRS5nZXQoKSwgJm5WYWwpICE9IDApKSB7CisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICB9CisgICAgICAgICAgcFN0cmVhbS0+YWxpZ25CeXRlKCk7CisgICAgICAgICAgblRtcCA9IHBTdHJlYW0tPmdldE9mZnNldCgpOworICAgICAgICAgIFNCU1lNUyA9IEZYX0FsbG9jKENKQmlnMl9JbWFnZSosIFNCTlVNU1lNUyk7CisgICAgICAgICAgSkJJRzJfbWVtY3B5KFNCU1lNUywgU0RJTlNZTVMsIFNETlVNSU5TWU1TICogc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKKyAgICAgICAgICBKQklHMl9tZW1jcHkoU0JTWU1TICsgU0ROVU1JTlNZTVMsIFNETkVXU1lNUywKKyAgICAgICAgICAgICAgICAgICAgICAgTlNZTVNERUNPREVEICogc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKKyAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0dSUkRQcm9jPiBwR1JSRChuZXcgQ0pCaWcyX0dSUkRQcm9jKCkpOworICAgICAgICAgIHBHUlJELT5HUlcgPSBTWU1XSURUSDsKKyAgICAgICAgICBwR1JSRC0+R1JIID0gSENIRUlHSFQ7CisgICAgICAgICAgcEdSUkQtPkdSVEVNUExBVEUgPSBTRFJURU1QTEFURTsKKyAgICAgICAgICBwR1JSRC0+R1JSRUZFUkVOQ0UgPSBTQlNZTVNbSURJXTsKKyAgICAgICAgICBwR1JSRC0+R1JSRUZFUkVOQ0VEWCA9IFJEWEk7CisgICAgICAgICAgcEdSUkQtPkdSUkVGRVJFTkNFRFkgPSBSRFlJOworICAgICAgICAgIHBHUlJELT5UUEdST04gPSAwOworICAgICAgICAgIHBHUlJELT5HUkFUWzBdID0gU0RSQVRbMF07CisgICAgICAgICAgcEdSUkQtPkdSQVRbMV0gPSBTRFJBVFsxXTsKKyAgICAgICAgICBwR1JSRC0+R1JBVFsyXSA9IFNEUkFUWzJdOworICAgICAgICAgIHBHUlJELT5HUkFUWzNdID0gU0RSQVRbM107CisgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Bcml0aERlY29kZXI+IHBBcml0aERlY29kZXIoCisgICAgICAgICAgICAgIG5ldyBDSkJpZzJfQXJpdGhEZWNvZGVyKHBTdHJlYW0pKTsKKyAgICAgICAgICBCUyA9IHBHUlJELT5kZWNvZGUocEFyaXRoRGVjb2Rlci5nZXQoKSwgZ3JDb250ZXh0LT5kYXRhKCkpOworICAgICAgICAgIGlmICghQlMpIHsKKyAgICAgICAgICAgIEZYX0ZyZWUoU0JTWU1TKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgIH0KKyAgICAgICAgICBwU3RyZWFtLT5hbGlnbkJ5dGUoKTsKKyAgICAgICAgICBwU3RyZWFtLT5vZmZzZXQoMik7CisgICAgICAgICAgaWYgKChGWF9EV09SRCluVmFsICE9IChwU3RyZWFtLT5nZXRPZmZzZXQoKSAtIG5UbXApKSB7CisgICAgICAgICAgICBkZWxldGUgQlM7CisgICAgICAgICAgICBGWF9GcmVlKFNCU1lNUyk7CisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICB9CisgICAgICAgICAgRlhfRnJlZShTQlNZTVMpOworICAgICAgICB9CisgICAgICAgIFNETkVXU1lNU1tOU1lNU0RFQ09ERURdID0gQlM7CisgICAgICB9CisgICAgICBpZiAoU0RSRUZBR0cgPT0gMCkgeworICAgICAgICBTRE5FV1NZTVdJRFRIU1tOU1lNU0RFQ09ERURdID0gU1lNV0lEVEg7CisgICAgICB9CisgICAgICBOU1lNU0RFQ09ERUQgPSBOU1lNU0RFQ09ERUQgKyAxOworICAgIH0KKyAgICBpZiAoU0RSRUZBR0cgPT0gMCkgeworICAgICAgaWYgKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNESFVGRkJNU0laRSwgKGludDMyX3QqKSZCTVNJWkUpICE9IDApIHsKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICB9CisgICAgICBwU3RyZWFtLT5hbGlnbkJ5dGUoKTsKKyAgICAgIGlmIChCTVNJWkUgPT0gMCkgeworICAgICAgICBzdHJpZGUgPSAoVE9UV0lEVEggKyA3KSA+PiAzOworICAgICAgICBpZiAocFN0cmVhbS0+Z2V0Qnl0ZUxlZnQoKSA+PSBzdHJpZGUgKiBIQ0hFSUdIVCkgeworICAgICAgICAgIEJIQyA9IG5ldyBDSkJpZzJfSW1hZ2UoVE9UV0lEVEgsIEhDSEVJR0hUKTsKKyAgICAgICAgICBmb3IgKEkgPSAwOyBJIDwgSENIRUlHSFQ7IEkrKykgeworICAgICAgICAgICAgSkJJRzJfbWVtY3B5KEJIQy0+bV9wRGF0YSArIEkgKiBCSEMtPm1fblN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtLT5nZXRQb2ludGVyKCksIHN0cmlkZSk7CisgICAgICAgICAgICBwU3RyZWFtLT5vZmZzZXQoc3RyaWRlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfR1JEUHJvYz4gcEdSRChuZXcgQ0pCaWcyX0dSRFByb2MoKSk7CisgICAgICAgIHBHUkQtPk1NUiA9IDE7CisgICAgICAgIHBHUkQtPkdCVyA9IFRPVFdJRFRIOworICAgICAgICBwR1JELT5HQkggPSBIQ0hFSUdIVDsKKyAgICAgICAgRlhDT0RFQ19TVEFUVVMgc3RhdHVzID0gcEdSRC0+U3RhcnRfZGVjb2RlX01NUigmQkhDLCBwU3RyZWFtLCBudWxscHRyKTsKKyAgICAgICAgd2hpbGUgKHN0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7CisgICAgICAgICAgcEdSRC0+Q29udGludWVfZGVjb2RlKHBQYXVzZSk7CisgICAgICAgIH0KKyAgICAgICAgcFN0cmVhbS0+YWxpZ25CeXRlKCk7CisgICAgICB9CisgICAgICBuVG1wID0gMDsKKyAgICAgIGlmICghQkhDKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgZm9yIChJID0gSENGSVJTVFNZTTsgSSA8IE5TWU1TREVDT0RFRDsgSSsrKSB7CisgICAgICAgIFNETkVXU1lNU1tJXSA9IEJIQy0+c3ViSW1hZ2UoblRtcCwgMCwgU0RORVdTWU1XSURUSFNbSV0sIEhDSEVJR0hUKTsKKyAgICAgICAgblRtcCArPSBTRE5FV1NZTVdJRFRIU1tJXTsKKyAgICAgIH0KKyAgICAgIGRlbGV0ZSBCSEM7CisgICAgICBCSEMgPSBudWxscHRyOworICAgIH0KKyAgfQorICBFWElOREVYID0gMDsKKyAgQ1VSRVhGTEFHID0gMDsKKyAgcFRhYmxlLnJlc2V0KG5ldyBDSkJpZzJfSHVmZm1hblRhYmxlKAorICAgICAgSHVmZm1hblRhYmxlX0IxLCBGWF9BcnJheVNpemUoSHVmZm1hblRhYmxlX0IxKSwgSHVmZm1hblRhYmxlX0hUT09CX0IxKSk7CisgIEVYRkxBR1MgPSBGWF9BbGxvYyhGWF9CT09MLCBTRE5VTUlOU1lNUyArIFNETlVNTkVXU1lNUyk7CisgIHdoaWxlIChFWElOREVYIDwgU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVMpIHsKKyAgICBpZiAocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUocFRhYmxlLmdldCgpLCAoaW50KikmRVhSVU5MRU5HVEgpICE9IDApIHsKKyAgICAgIEZYX0ZyZWUoRVhGTEFHUyk7CisgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisgICAgaWYgKEVYSU5ERVggKyBFWFJVTkxFTkdUSCA+IFNETlVNSU5TWU1TICsgU0ROVU1ORVdTWU1TKSB7CisgICAgICBGWF9GcmVlKEVYRkxBR1MpOworICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorICAgIGlmIChFWFJVTkxFTkdUSCAhPSAwKSB7CisgICAgICBmb3IgKEkgPSBFWElOREVYOyBJIDwgRVhJTkRFWCArIEVYUlVOTEVOR1RIOyBJKyspIHsKKyAgICAgICAgRVhGTEFHU1tJXSA9IENVUkVYRkxBRzsKKyAgICAgIH0KKyAgICB9CisgICAgRVhJTkRFWCA9IEVYSU5ERVggKyBFWFJVTkxFTkdUSDsKKyAgICBDVVJFWEZMQUcgPSAhQ1VSRVhGTEFHOworICB9CisgIEkgPSBKID0gMDsKKyAgZm9yIChJID0gMDsgSSA8IFNETlVNSU5TWU1TICsgU0ROVU1ORVdTWU1TOyBJKyspIHsKKyAgICBpZiAoRVhGTEFHU1tJXSAmJiBKIDwgU0ROVU1FWFNZTVMpIHsKKyAgICAgIGlmIChJIDwgU0ROVU1JTlNZTVMpIHsKKyAgICAgICAgcERpY3QtPkFkZEltYWdlKFNESU5TWU1TW0ldID8gbmV3IENKQmlnMl9JbWFnZSgqU0RJTlNZTVNbSV0pIDogbnVsbHB0cik7CisgICAgICB9IGVsc2UgeworICAgICAgICBwRGljdC0+QWRkSW1hZ2UoU0RORVdTWU1TW0kgLSBTRE5VTUlOU1lNU10pOworICAgICAgfQorICAgICAgKytKOworICAgIH0gZWxzZSBpZiAoIUVYRkxBR1NbSV0gJiYgSSA+PSBTRE5VTUlOU1lNUykgeworICAgICAgZGVsZXRlIFNETkVXU1lNU1tJIC0gU0ROVU1JTlNZTVNdOworICAgIH0KKyAgfQorICBGWF9GcmVlKEVYRkxBR1MpOworICBGWF9GcmVlKFNETkVXU1lNUyk7CisgIGlmIChTRFJFRkFHRyA9PSAwKSB7CisgICAgRlhfRnJlZShTRE5FV1NZTVdJRFRIUyk7CisgIH0KKyAgcmV0dXJuIHBEaWN0LnJlbGVhc2UoKTsKK2ZhaWxlZDoKKyAgZm9yIChJID0gMDsgSSA8IE5TWU1TREVDT0RFRDsgSSsrKSB7CisgICAgZGVsZXRlIFNETkVXU1lNU1tJXTsKKyAgfQorICBGWF9GcmVlKFNETkVXU1lNUyk7CisgIGlmIChTRFJFRkFHRyA9PSAwKSB7CisgICAgRlhfRnJlZShTRE5FV1NZTVdJRFRIUyk7CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1NkZFByb2MuaCBiL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU2RkUHJvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YWMwNDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1NkZFByb2MuaApAQCAtMCwwICsxLDQ5IEBACisvLyBDb3B5cmlnaHQgMjAxNSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9TUkNfRlhDT0RFQ19KQklHMl9KQklHMl9TRERQUk9DX0hfCisjZGVmaW5lIENPUkVfU1JDX0ZYQ09ERUNfSkJJRzJfSkJJRzJfU0REUFJPQ19IXworCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiSkJpZzJfQXJpdGhEZWNvZGVyLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorCitjbGFzcyBDSkJpZzJfQml0U3RyZWFtOworY2xhc3MgQ0pCaWcyX0h1ZmZtYW5UYWJsZTsKK2NsYXNzIENKQmlnMl9JbWFnZTsKK2NsYXNzIENKQmlnMl9TeW1ib2xEaWN0OworY2xhc3MgSUZYX1BhdXNlOworCitjbGFzcyBDSkJpZzJfU0REUHJvYyB7CisgcHVibGljOgorICBDSkJpZzJfU3ltYm9sRGljdCogZGVjb2RlX0FyaXRoKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8SkJpZzJBcml0aEN0eD4qIGdiQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxKQmlnMkFyaXRoQ3R4PiogZ3JDb250ZXh0KTsKKworICBDSkJpZzJfU3ltYm9sRGljdCogZGVjb2RlX0h1ZmZtYW4oQ0pCaWcyX0JpdFN0cmVhbSogcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEpCaWcyQXJpdGhDdHg+KiBnYkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxKQmlnMkFyaXRoQ3R4PiogZ3JDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpOworCisgcHVibGljOgorICBGWF9CT09MIFNESFVGRjsKKyAgRlhfQk9PTCBTRFJFRkFHRzsKKyAgRlhfRFdPUkQgU0ROVU1JTlNZTVM7CisgIENKQmlnMl9JbWFnZSoqIFNESU5TWU1TOworICBGWF9EV09SRCBTRE5VTU5FV1NZTVM7CisgIEZYX0RXT1JEIFNETlVNRVhTWU1TOworICBDSkJpZzJfSHVmZm1hblRhYmxlKiBTREhVRkZESDsKKyAgQ0pCaWcyX0h1ZmZtYW5UYWJsZSogU0RIVUZGRFc7CisgIENKQmlnMl9IdWZmbWFuVGFibGUqIFNESFVGRkJNU0laRTsKKyAgQ0pCaWcyX0h1ZmZtYW5UYWJsZSogU0RIVUZGQUdHSU5TVDsKKyAgdWludDhfdCBTRFRFTVBMQVRFOworICBpbnQ4X3QgU0RBVFs4XTsKKyAgRlhfQk9PTCBTRFJURU1QTEFURTsKKyAgaW50OF90IFNEUkFUWzRdOworfTsKKworI2VuZGlmICAvLyBDT1JFX1NSQ19GWENPREVDX0pCSUcyX0pCSUcyX1NERFBST0NfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU2VnbWVudC5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1NlZ21lbnQuY3BwCmluZGV4IGI3ZWVkMzUuLjQxZWVhZmUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU2VnbWVudC5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TZWdtZW50LmNwcApAQCAtMSw1MyArMSw0NCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSAiSkJpZzJfU2VnbWVudC5oIgotQ0pCaWcyX1NlZ21lbnQ6OkNKQmlnMl9TZWdtZW50KCkKLXsKLSAgICBpbml0KCk7CisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfbWVtb3J5LmgiCisKK0NKQmlnMl9TZWdtZW50OjpDSkJpZzJfU2VnbWVudCgpIHsKKyAgbV9kd051bWJlciA9IDA7CisgIG1fY0ZsYWdzLmMgPSAwOworICBtX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50ID0gMDsKKyAgbV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzID0gTlVMTDsKKyAgbV9kd1BhZ2VfYXNzb2NpYXRpb24gPSAwOworICBtX2R3RGF0YV9sZW5ndGggPSAwOworICBtX2R3SGVhZGVyX0xlbmd0aCA9IDA7CisgIG1fZHdPYmpOdW0gPSAwOworICBtX2R3RGF0YU9mZnNldCA9IDA7CisgIG1fU3RhdGUgPSBKQklHMl9TRUdNRU5UX0hFQURFUl9VTlBBUlNFRDsKKyAgbV9uUmVzdWx0VHlwZSA9IEpCSUcyX1ZPSURfUE9JTlRFUjsKKyAgbV9SZXN1bHQudmQgPSBOVUxMOwogfQotQ0pCaWcyX1NlZ21lbnQ6On5DSkJpZzJfU2VnbWVudCgpCi17Ci0gICAgY2xlYW4oKTsKLX0KLXZvaWQgQ0pCaWcyX1NlZ21lbnQ6OmluaXQoKQotewotICAgIG1fZHdOdW1iZXIgPSAwOwotICAgIG1fY0ZsYWdzLmMgPSAwOwotICAgIG1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQgPSAwOwotICAgIG1fcFJlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVycyA9IE5VTEw7Ci0gICAgbV9kd1BhZ2VfYXNzb2NpYXRpb24gPSAwOwotICAgIG1fZHdEYXRhX2xlbmd0aCA9IDA7Ci0gICAgbV9kd0hlYWRlcl9MZW5ndGggPSAwOwotICAgIG1fcERhdGEgPSBOVUxMOwotICAgIG1fU3RhdGUgPSBKQklHMl9TRUdNRU5UX0hFQURFUl9VTlBBUlNFRDsKLSAgICBtX25SZXN1bHRUeXBlID0gSkJJRzJfVk9JRF9QT0lOVEVSOwotICAgIG1fUmVzdWx0LnZkID0gTlVMTDsKLX0KLXZvaWQgQ0pCaWcyX1NlZ21lbnQ6OmNsZWFuKCkKLXsKLSAgICBpZihtX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnMpIHsKLSAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKG1fcFJlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVycyk7Ci0gICAgfQotICAgIGlmKG1fUmVzdWx0LnZkKSB7Ci0gICAgICAgIHN3aXRjaChtX25SZXN1bHRUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIEpCSUcyX0lNQUdFX1BPSU5URVI6Ci0gICAgICAgICAgICAgICAgZGVsZXRlIG1fUmVzdWx0LmltOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBKQklHMl9TWU1CT0xfRElDVF9QT0lOVEVSOgotICAgICAgICAgICAgICAgIGRlbGV0ZSBtX1Jlc3VsdC5zZDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSkJJRzJfUEFUVEVSTl9ESUNUX1BPSU5URVI6Ci0gICAgICAgICAgICAgICAgZGVsZXRlIG1fUmVzdWx0LnBkOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBKQklHMl9IVUZGTUFOX1RBQkxFX1BPSU5URVI6Ci0gICAgICAgICAgICAgICAgZGVsZXRlIG1fUmVzdWx0Lmh0OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBtX3BNb2R1bGUtPkpCaWcyX0ZyZWUobV9SZXN1bHQudmQpOwotICAgICAgICB9Ci0gICAgfQorQ0pCaWcyX1NlZ21lbnQ6On5DSkJpZzJfU2VnbWVudCgpIHsKKyAgRlhfRnJlZShtX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnMpOworCisgIHN3aXRjaCAobV9uUmVzdWx0VHlwZSkgeworICAgIGNhc2UgSkJJRzJfSU1BR0VfUE9JTlRFUjoKKyAgICAgIGRlbGV0ZSBtX1Jlc3VsdC5pbTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSkJJRzJfU1lNQk9MX0RJQ1RfUE9JTlRFUjoKKyAgICAgIGRlbGV0ZSBtX1Jlc3VsdC5zZDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSkJJRzJfUEFUVEVSTl9ESUNUX1BPSU5URVI6CisgICAgICBkZWxldGUgbV9SZXN1bHQucGQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEpCSUcyX0hVRkZNQU5fVEFCTEVfUE9JTlRFUjoKKyAgICAgIGRlbGV0ZSBtX1Jlc3VsdC5odDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBGWF9GcmVlKG1fUmVzdWx0LnZkKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TZWdtZW50LmggYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1NlZ21lbnQuaAppbmRleCAzM2VlNzIxLi40YWVmMjcyIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1NlZ21lbnQuaAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1NlZ21lbnQuaApAQCAtMSw2OCArMSw2NSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIF9KQklHMl9TRUdNRU5UX0hfCiAjZGVmaW5lIF9KQklHMl9TRUdNRU5UX0hfCisKICNpbmNsdWRlICJKQmlnMl9EZWZpbmUuaCIKLSNpbmNsdWRlICJKQmlnMl9TeW1ib2xEaWN0LmgiCi0jaW5jbHVkZSAiSkJpZzJfUGF0dGVybkRpY3QuaCIKLSNpbmNsdWRlICJKQmlnMl9Nb2R1bGUuaCIKICNpbmNsdWRlICJKQmlnMl9IdWZmbWFuVGFibGUuaCIKLSNkZWZpbmUgSkJJRzJfR0VUX0lOVDMyKGJ1ZikgKCgoYnVmKVswXTw8MjQpIHwgKChidWYpWzFdPDwxNikgfCAoKGJ1ZilbMl08PDgpIHwgKGJ1ZilbM10pCi0jZGVmaW5lIEpCSUcyX0dFVF9JTlQxNihidWYpICgoKGJ1ZilbMF08PDgpIHwgKGJ1ZilbMV0pCisjaW5jbHVkZSAiSkJpZzJfUGF0dGVybkRpY3QuaCIKKyNpbmNsdWRlICJKQmlnMl9TeW1ib2xEaWN0LmgiCisKKyNkZWZpbmUgSkJJRzJfR0VUX0lOVDMyKGJ1ZikgXAorICAoKChidWYpWzBdIDw8IDI0KSB8ICgoYnVmKVsxXSA8PCAxNikgfCAoKGJ1ZilbMl0gPDwgOCkgfCAoYnVmKVszXSkKKyNkZWZpbmUgSkJJRzJfR0VUX0lOVDE2KGJ1ZikgKCgoYnVmKVswXSA8PCA4KSB8IChidWYpWzFdKQogdHlwZWRlZiBlbnVtIHsKLSAgICBKQklHMl9TRUdNRU5UX0hFQURFUl9VTlBBUlNFRCwKLSAgICBKQklHMl9TRUdNRU5UX0RBVEFfVU5QQVJTRUQsCi0gICAgSkJJRzJfU0VHTUVOVF9QQVJTRV9DT01QTEVURSwKLSAgICBKQklHMl9TRUdNRU5UX1BBVVNFRCwKLSAgICBKQklHMl9TRUdNRU5UX0VSUk9SCisgIEpCSUcyX1NFR01FTlRfSEVBREVSX1VOUEFSU0VELAorICBKQklHMl9TRUdNRU5UX0RBVEFfVU5QQVJTRUQsCisgIEpCSUcyX1NFR01FTlRfUEFSU0VfQ09NUExFVEUsCisgIEpCSUcyX1NFR01FTlRfUEFVU0VELAorICBKQklHMl9TRUdNRU5UX0VSUk9SCiB9IEpCaWcyX1NlZ21lbnRTdGF0ZTsKIHR5cGVkZWYgZW51bSB7Ci0gICAgSkJJRzJfVk9JRF9QT0lOVEVSCT0gMCwKLSAgICBKQklHMl9JTUFHRV9QT0lOVEVSLAotICAgIEpCSUcyX1NZTUJPTF9ESUNUX1BPSU5URVIsCi0gICAgSkJJRzJfUEFUVEVSTl9ESUNUX1BPSU5URVIsCi0gICAgSkJJRzJfSFVGRk1BTl9UQUJMRV9QT0lOVEVSCisgIEpCSUcyX1ZPSURfUE9JTlRFUiA9IDAsCisgIEpCSUcyX0lNQUdFX1BPSU5URVIsCisgIEpCSUcyX1NZTUJPTF9ESUNUX1BPSU5URVIsCisgIEpCSUcyX1BBVFRFUk5fRElDVF9QT0lOVEVSLAorICBKQklHMl9IVUZGTUFOX1RBQkxFX1BPSU5URVIKIH0gSkJpZzJfUmVzdWx0VHlwZTsKLWNsYXNzIENKQmlnMl9TZWdtZW50IDogcHVibGljIENKQmlnMl9PYmplY3QKLXsKLXB1YmxpYzoKK2NsYXNzIENKQmlnMl9TZWdtZW50IHsKKyBwdWJsaWM6CisgIENKQmlnMl9TZWdtZW50KCk7CiAKLSAgICBDSkJpZzJfU2VnbWVudCgpOworICB+Q0pCaWcyX1NlZ21lbnQoKTsKIAotICAgIH5DSkJpZzJfU2VnbWVudCgpOworICBGWF9EV09SRCBtX2R3TnVtYmVyOworICB1bmlvbiB7CisgICAgc3RydWN0IHsKKyAgICAgIHVpbnQ4X3QgdHlwZSA6IDY7CisgICAgICB1aW50OF90IHBhZ2VfYXNzb2NpYXRpb25fc2l6ZSA6IDE7CisgICAgICB1aW50OF90IGRlZmVycmVkX25vbl9yZXRhaW4gOiAxOworICAgIH0gczsKKyAgICB1aW50OF90IGM7CisgIH0gbV9jRmxhZ3M7CisgIGludDMyX3QgbV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudDsKKyAgRlhfRFdPUkQqIG1fcFJlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVyczsKKyAgRlhfRFdPUkQgbV9kd1BhZ2VfYXNzb2NpYXRpb247CisgIEZYX0RXT1JEIG1fZHdEYXRhX2xlbmd0aDsKIAotICAgIHZvaWQgaW5pdCgpOwotCi0gICAgdm9pZCBjbGVhbigpOwotcHVibGljOgotICAgIEZYX0RXT1JEIG1fZHdOdW1iZXI7Ci0gICAgdW5pb24gewotICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgRlhfQllURSB0eXBlCQkJCQk6CTY7Ci0gICAgICAgICAgICBGWF9CWVRFIHBhZ2VfYXNzb2NpYXRpb25fc2l6ZQk6CTE7Ci0gICAgICAgICAgICBGWF9CWVRFIGRlZmVycmVkX25vbl9yZXRhaW4JCToJMTsKLSAgICAgICAgfSBzOwotICAgICAgICBGWF9CWVRFIGM7Ci0gICAgfSBtX2NGbGFnczsKLSAgICBGWF9JTlQzMiBtX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50OwotICAgIEZYX0RXT1JEICogbV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzOwotICAgIEZYX0RXT1JEIG1fZHdQYWdlX2Fzc29jaWF0aW9uOwotICAgIEZYX0RXT1JEIG1fZHdEYXRhX2xlbmd0aDsKLQotICAgIEZYX0RXT1JEIG1fZHdIZWFkZXJfTGVuZ3RoOwotICAgIEZYX0JZVEUgICptX3BEYXRhOwotICAgIEpCaWcyX1NlZ21lbnRTdGF0ZSBtX1N0YXRlOwotICAgIEpCaWcyX1Jlc3VsdFR5cGUgbV9uUmVzdWx0VHlwZTsKLSAgICB1bmlvbiB7Ci0gICAgICAgIENKQmlnMl9TeW1ib2xEaWN0CSpzZDsKLSAgICAgICAgQ0pCaWcyX1BhdHRlcm5EaWN0CSpwZDsKLSAgICAgICAgQ0pCaWcyX0ltYWdlCQkqaW07Ci0gICAgICAgIENKQmlnMl9IdWZmbWFuVGFibGUJKmh0OwotICAgICAgICBGWF9MUFZPSUQJCQkgdmQ7Ci0gICAgfSBtX1Jlc3VsdDsKKyAgRlhfRFdPUkQgbV9kd0hlYWRlcl9MZW5ndGg7CisgIEZYX0RXT1JEIG1fZHdPYmpOdW07CisgIEZYX0RXT1JEIG1fZHdEYXRhT2Zmc2V0OworICBKQmlnMl9TZWdtZW50U3RhdGUgbV9TdGF0ZTsKKyAgSkJpZzJfUmVzdWx0VHlwZSBtX25SZXN1bHRUeXBlOworICB1bmlvbiB7CisgICAgQ0pCaWcyX1N5bWJvbERpY3QqIHNkOworICAgIENKQmlnMl9QYXR0ZXJuRGljdCogcGQ7CisgICAgQ0pCaWcyX0ltYWdlKiBpbTsKKyAgICBDSkJpZzJfSHVmZm1hblRhYmxlKiBodDsKKyAgICB2b2lkKiB2ZDsKKyAgfSBtX1Jlc3VsdDsKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU3ltYm9sRGljdC5jcHAgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1N5bWJvbERpY3QuY3BwCmluZGV4IGU5YmI5YzYuLjFlOTQ5YzUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU3ltYm9sRGljdC5jcHAKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TeW1ib2xEaWN0LmNwcApAQCAtMSw1OCArMSwyOCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSAiSkJpZzJfU3ltYm9sRGljdC5oIgotQ0pCaWcyX1N5bWJvbERpY3Q6OkNKQmlnMl9TeW1ib2xEaWN0KCkKLXsKLSAgICBTRE5VTUVYU1lNUyA9IDA7Ci0gICAgU0RFWFNZTVMgPSBOVUxMOwotICAgIG1fYkNvbnRleHRSZXRhaW5lZCA9IEZBTFNFOwotICAgIG1fZ2JDb250ZXh0ID0gbV9nckNvbnRleHQgPSBOVUxMOworCisjaW5jbHVkZSAiSkJpZzJfSW1hZ2UuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfbWVtb3J5LmgiCisKK0NKQmlnMl9TeW1ib2xEaWN0OjpDSkJpZzJfU3ltYm9sRGljdCgpIHsKIH0KIAotQ0pCaWcyX1N5bWJvbERpY3QgKkNKQmlnMl9TeW1ib2xEaWN0OjpEZWVwQ29weSgpCi17Ci0gICAgQ0pCaWcyX1N5bWJvbERpY3QgKmRzdCA9IE5VTEw7Ci0gICAgQ0pCaWcyX1N5bWJvbERpY3QgKnNyYyA9IHRoaXM7Ci0gICAgaWYgKHNyYy0+bV9iQ29udGV4dFJldGFpbmVkIHx8Ci0gICAgICAgIHNyYy0+bV9nYkNvbnRleHQgfHwKLSAgICAgICAgc3JjLT5tX2dyQ29udGV4dCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgSkJJRzJfQUxMT0MoZHN0LCBDSkJpZzJfU3ltYm9sRGljdCgpKTsKLSAgICBkc3QtPlNETlVNRVhTWU1TID0gc3JjLT5TRE5VTUVYU1lNUzsKLSAgICBkc3QtPlNERVhTWU1TID0gKENKQmlnMl9JbWFnZSoqKW1fcE1vZHVsZS0+SkJpZzJfTWFsbG9jMigKLSAgICAgICAgc2l6ZW9mKENKQmlnMl9JbWFnZSopLCBzcmMtPlNETlVNRVhTWU1TKTsKLSAgICBmb3IoRlhfRFdPUkQgaSA9IDA7IGkgPCBzcmMtPlNETlVNRVhTWU1TOyBpKyspIHsKLSAgICAgICAgaWYgKHNyYy0+U0RFWFNZTVNbaV0pIHsKLSAgICAgICAgICAgIEpCSUcyX0FMTE9DKGRzdC0+U0RFWFNZTVNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBDSkJpZzJfSW1hZ2UoKihzcmMtPlNERVhTWU1TW2ldKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZHN0LT5TREVYU1lNU1tpXSA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGRzdDsKK0NKQmlnMl9TeW1ib2xEaWN0Ojp+Q0pCaWcyX1N5bWJvbERpY3QoKSB7CiB9CiAKLUNKQmlnMl9TeW1ib2xEaWN0Ojp+Q0pCaWcyX1N5bWJvbERpY3QoKQotewotICAgIGlmKFNERVhTWU1TKSB7Ci0gICAgICAgIGZvcihGWF9EV09SRCBpID0gMDsgaSA8IFNETlVNRVhTWU1TOyBpKyspIHsKLSAgICAgICAgICAgIGlmKFNERVhTWU1TW2ldKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIFNERVhTWU1TW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1fcE1vZHVsZS0+SkJpZzJfRnJlZShTREVYU1lNUyk7Ci0gICAgfQotICAgIGlmKG1fYkNvbnRleHRSZXRhaW5lZCkgewotICAgICAgICBpZihtX2diQ29udGV4dCkgewotICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKG1fZ2JDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBpZihtX2dyQ29udGV4dCkgewotICAgICAgICAgICAgbV9wTW9kdWxlLT5KQmlnMl9GcmVlKG1fZ3JDb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KK3N0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfU3ltYm9sRGljdD4gQ0pCaWcyX1N5bWJvbERpY3Q6OkRlZXBDb3B5KCkgY29uc3QgeworICBjb25zdCBDSkJpZzJfU3ltYm9sRGljdCogc3JjID0gdGhpczsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9TeW1ib2xEaWN0PiBkc3QobmV3IENKQmlnMl9TeW1ib2xEaWN0KTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzcmMtPm1fU0RFWFNZTVMuc2l6ZSgpOyArK2kpIHsKKyAgICBDSkJpZzJfSW1hZ2UqIGltYWdlID0gc3JjLT5tX1NERVhTWU1TLmdldChpKTsKKyAgICBkc3QtPm1fU0RFWFNZTVMucHVzaF9iYWNrKGltYWdlID8gbmV3IENKQmlnMl9JbWFnZSgqaW1hZ2UpIDogbnVsbHB0cik7CisgIH0KKyAgZHN0LT5tX2diQ29udGV4dCA9IHNyYy0+bV9nYkNvbnRleHQ7CisgIGRzdC0+bV9nckNvbnRleHQgPSBzcmMtPm1fZ3JDb250ZXh0OworICByZXR1cm4gZHN0OwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TeW1ib2xEaWN0LmggYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1N5bWJvbERpY3QuaAppbmRleCA5MTU2ZTMwLi42ZjZiMzAzIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1N5bWJvbERpY3QuaAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1N5bWJvbERpY3QuaApAQCAtMSwyNiArMSw0OCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaWZuZGVmIF9KQklHMl9TWU1CT0xfRElDVF9IXwotI2RlZmluZSBfSkJJRzJfU1lNQk9MX0RJQ1RfSF8KLSNpbmNsdWRlICJKQmlnMl9EZWZpbmUuaCIKLSNpbmNsdWRlICJKQmlnMl9Bcml0aERlY29kZXIuaCIKLSNpbmNsdWRlICJKQmlnMl9JbWFnZS5oIgotY2xhc3MgQ0pCaWcyX1N5bWJvbERpY3QgOiBwdWJsaWMgQ0pCaWcyX09iamVjdAotewotcHVibGljOgorI2lmbmRlZiBDT1JFX1NSQ19GWENPREVDX0pCSUcyX0pCSUcyX1NZTUJPTERJQ1RfSF8KKyNkZWZpbmUgQ09SRV9TUkNfRlhDT0RFQ19KQklHMl9KQklHMl9TWU1CT0xESUNUX0hfCiAKLSAgICBDSkJpZzJfU3ltYm9sRGljdCgpOwotICAgIENKQmlnMl9TeW1ib2xEaWN0ICpEZWVwQ29weSgpOwotICAgIH5DSkJpZzJfU3ltYm9sRGljdCgpOwotcHVibGljOgotICAgIEZYX0RXT1JEIFNETlVNRVhTWU1TOwotICAgIENKQmlnMl9JbWFnZSAqKlNERVhTWU1TOwotICAgIEZYX0JPT0wgbV9iQ29udGV4dFJldGFpbmVkOwotICAgIEpCaWcyQXJpdGhDdHggKm1fZ2JDb250ZXh0LAotICAgICAgICAgICAgICAgICAgKm1fZ3JDb250ZXh0OworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJKQmlnMl9Bcml0aERlY29kZXIuaCIKKyNpbmNsdWRlICJKQmlnMl9MaXN0LmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCisKK2NsYXNzIENKQmlnMl9JbWFnZTsKKworY2xhc3MgQ0pCaWcyX1N5bWJvbERpY3QgeworIHB1YmxpYzoKKyAgQ0pCaWcyX1N5bWJvbERpY3QoKTsKKyAgfkNKQmlnMl9TeW1ib2xEaWN0KCk7CisKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9TeW1ib2xEaWN0PiBEZWVwQ29weSgpIGNvbnN0OworCisgIC8vIFRha2VzIG93bmVyc2hpcCBvZiB8aW1hZ2V8LgorICB2b2lkIEFkZEltYWdlKENKQmlnMl9JbWFnZSogaW1hZ2UpIHsgbV9TREVYU1lNUy5wdXNoX2JhY2soaW1hZ2UpOyB9CisKKyAgc2l6ZV90IE51bUltYWdlcygpIGNvbnN0IHsgcmV0dXJuIG1fU0RFWFNZTVMuc2l6ZSgpOyB9CisgIENKQmlnMl9JbWFnZSogR2V0SW1hZ2Uoc2l6ZV90IGluZGV4KSBjb25zdCB7IHJldHVybiBtX1NERVhTWU1TLmdldChpbmRleCk7IH0KKworICBjb25zdCBzdGQ6OnZlY3RvcjxKQmlnMkFyaXRoQ3R4PiYgR2JDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gbV9nYkNvbnRleHQ7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8SkJpZzJBcml0aEN0eD4mIEdyQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fZ3JDb250ZXh0OyB9CisKKyAgdm9pZCBTZXRHYkNvbnRleHQoY29uc3Qgc3RkOjp2ZWN0b3I8SkJpZzJBcml0aEN0eD4mIGdiQ29udGV4dCkgeworICAgIG1fZ2JDb250ZXh0ID0gZ2JDb250ZXh0OworICB9CisgIHZvaWQgU2V0R3JDb250ZXh0KGNvbnN0IHN0ZDo6dmVjdG9yPEpCaWcyQXJpdGhDdHg+JiBnckNvbnRleHQpIHsKKyAgICBtX2dyQ29udGV4dCA9IGdyQ29udGV4dDsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8SkJpZzJBcml0aEN0eD4gbV9nYkNvbnRleHQ7CisgIHN0ZDo6dmVjdG9yPEpCaWcyQXJpdGhDdHg+IG1fZ3JDb250ZXh0OworICBDSkJpZzJfTGlzdDxDSkJpZzJfSW1hZ2U+IG1fU0RFWFNZTVM7CiB9OwotI2VuZGlmCisKKyNlbmRpZiAgLy8gQ09SRV9TUkNfRlhDT0RFQ19KQklHMl9KQklHMl9TWU1CT0xESUNUX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1RyZFByb2MuY3BwIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9UcmRQcm9jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2ZkNDc4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9UcmRQcm9jLmNwcApAQCAtMCwwICsxLDQxMyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiSkJpZzJfVHJkUHJvYy5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiSkJpZzJfQXJpdGhEZWNvZGVyLmgiCisjaW5jbHVkZSAiSkJpZzJfQXJpdGhJbnREZWNvZGVyLmgiCisjaW5jbHVkZSAiSkJpZzJfR3JyZFByb2MuaCIKKyNpbmNsdWRlICJKQmlnMl9IdWZmbWFuRGVjb2Rlci5oIgorCitDSkJpZzJfSW1hZ2UqIENKQmlnMl9UUkRQcm9jOjpkZWNvZGVfSHVmZm1hbihDSkJpZzJfQml0U3RyZWFtKiBwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ3JDb250ZXh0KSB7CisgIGludDMyX3QgU1RSSVBULCBGSVJTVFM7CisgIEZYX0RXT1JEIE5JTlNUQU5DRVM7CisgIGludDMyX3QgRFQsIERGUywgQ1VSUzsKKyAgaW50MzJfdCBTSSwgVEk7CisgIENKQmlnMl9JbWFnZSogSUJJOworICBGWF9EV09SRCBXSSwgSEk7CisgIGludDMyX3QgSURTOworICBGWF9CT09MIFJJOworICBpbnQzMl90IFJEV0ksIFJESEksIFJEWEksIFJEWUk7CisgIENKQmlnMl9JbWFnZSogSUJPSTsKKyAgRlhfRFdPUkQgV09JLCBIT0k7CisgIEZYX0JPT0wgYkZpcnN0OworICBGWF9EV09SRCBuVG1wOworICBpbnQzMl90IG5WYWwsIG5CaXRzOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0h1ZmZtYW5EZWNvZGVyPiBwSHVmZm1hbkRlY29kZXIoCisgICAgICBuZXcgQ0pCaWcyX0h1ZmZtYW5EZWNvZGVyKHBTdHJlYW0pKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gU0JSRUcobmV3IENKQmlnMl9JbWFnZShTQlcsIFNCSCkpOworICBTQlJFRy0+ZmlsbChTQkRFRlBJWEVMKTsKKyAgaWYgKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNCSFVGRkRULCAmU1RSSVBUKSAhPSAwKQorICAgIHJldHVybiBudWxscHRyOworCisgIFNUUklQVCAqPSBTQlNUUklQUzsKKyAgU1RSSVBUID0gLVNUUklQVDsKKyAgRklSU1RTID0gMDsKKyAgTklOU1RBTkNFUyA9IDA7CisgIHdoaWxlIChOSU5TVEFOQ0VTIDwgU0JOVU1JTlNUQU5DRVMpIHsKKyAgICBpZiAocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0JIVUZGRFQsICZEVCkgIT0gMCkKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgRFQgKj0gU0JTVFJJUFM7CisgICAgU1RSSVBUID0gU1RSSVBUICsgRFQ7CisgICAgYkZpcnN0ID0gVFJVRTsKKyAgICBmb3IgKDs7KSB7CisgICAgICBpZiAoYkZpcnN0KSB7CisgICAgICAgIGlmIChwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTQkhVRkZGUywgJkRGUykgIT0gMCkKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgICAgICBGSVJTVFMgPSBGSVJTVFMgKyBERlM7CisgICAgICAgIENVUlMgPSBGSVJTVFM7CisgICAgICAgIGJGaXJzdCA9IEZBTFNFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgblZhbCA9IHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNCSFVGRkRTLCAmSURTKTsKKyAgICAgICAgaWYgKG5WYWwgPT0gSkJJRzJfT09CKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoblZhbCAhPSAwKSB7CisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgQ1VSUyA9IENVUlMgKyBJRFMgKyBTQkRTT0ZGU0VUOworICAgICAgICB9CisgICAgICB9CisgICAgICB1aW50OF90IENVUlQgPSAwOworICAgICAgaWYgKFNCU1RSSVBTICE9IDEpIHsKKyAgICAgICAgblRtcCA9IDE7CisgICAgICAgIHdoaWxlICgoRlhfRFdPUkQpKDEgPDwgblRtcCkgPCBTQlNUUklQUykgeworICAgICAgICAgIG5UbXArKzsKKyAgICAgICAgfQorICAgICAgICBpZiAocFN0cmVhbS0+cmVhZE5CaXRzKG5UbXAsICZuVmFsKSAhPSAwKQorICAgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICAgIENVUlQgPSBuVmFsOworICAgICAgfQorICAgICAgVEkgPSBTVFJJUFQgKyBDVVJUOworICAgICAgblZhbCA9IDA7CisgICAgICBuQml0cyA9IDA7CisgICAgICBGWF9EV09SRCBJREk7CisgICAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmIChwU3RyZWFtLT5yZWFkMUJpdCgmblRtcCkgIT0gMCkKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgICAgICBuVmFsID0gKG5WYWwgPDwgMSkgfCBuVG1wOworICAgICAgICBuQml0cysrOworICAgICAgICBmb3IgKElESSA9IDA7IElESSA8IFNCTlVNU1lNUzsgSURJKyspIHsKKyAgICAgICAgICBpZiAoKG5CaXRzID09IFNCU1lNQ09ERVNbSURJXS5jb2RlbGVuKSAmJgorICAgICAgICAgICAgICAoblZhbCA9PSBTQlNZTUNPREVTW0lESV0uY29kZSkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoSURJIDwgU0JOVU1TWU1TKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChTQlJFRklORSA9PSAwKSB7CisgICAgICAgIFJJID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwU3RyZWFtLT5yZWFkMUJpdCgmUkkpICE9IDApIHsKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKFJJID09IDApIHsKKyAgICAgICAgSUJJID0gU0JTWU1TW0lESV07CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNCSFVGRlJEVywgJlJEV0kpICE9IDApIHx8CisgICAgICAgICAgICAocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0JIVUZGUkRILCAmUkRISSkgIT0gMCkgfHwKKyAgICAgICAgICAgIChwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTQkhVRkZSRFgsICZSRFhJKSAhPSAwKSB8fAorICAgICAgICAgICAgKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNCSFVGRlJEWSwgJlJEWUkpICE9IDApIHx8CisgICAgICAgICAgICAocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0JIVUZGUlNJWkUsICZuVmFsKSAhPSAwKSkgeworICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHBTdHJlYW0tPmFsaWduQnl0ZSgpOworICAgICAgICBuVG1wID0gcFN0cmVhbS0+Z2V0T2Zmc2V0KCk7CisgICAgICAgIElCT0kgPSBTQlNZTVNbSURJXTsKKyAgICAgICAgaWYgKCFJQk9JKQorICAgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICAgIFdPSSA9IElCT0ktPm1fbldpZHRoOworICAgICAgICBIT0kgPSBJQk9JLT5tX25IZWlnaHQ7CisgICAgICAgIGlmICgoaW50KShXT0kgKyBSRFdJKSA8IDAgfHwgKGludCkoSE9JICsgUkRISSkgPCAwKQorICAgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfR1JSRFByb2M+IHBHUlJEKG5ldyBDSkJpZzJfR1JSRFByb2MoKSk7CisgICAgICAgIHBHUlJELT5HUlcgPSBXT0kgKyBSRFdJOworICAgICAgICBwR1JSRC0+R1JIID0gSE9JICsgUkRISTsKKyAgICAgICAgcEdSUkQtPkdSVEVNUExBVEUgPSBTQlJURU1QTEFURTsKKyAgICAgICAgcEdSUkQtPkdSUkVGRVJFTkNFID0gSUJPSTsKKyAgICAgICAgcEdSUkQtPkdSUkVGRVJFTkNFRFggPSAoUkRXSSA+PiAyKSArIFJEWEk7CisgICAgICAgIHBHUlJELT5HUlJFRkVSRU5DRURZID0gKFJESEkgPj4gMikgKyBSRFlJOworICAgICAgICBwR1JSRC0+VFBHUk9OID0gMDsKKyAgICAgICAgcEdSUkQtPkdSQVRbMF0gPSBTQlJBVFswXTsKKyAgICAgICAgcEdSUkQtPkdSQVRbMV0gPSBTQlJBVFsxXTsKKyAgICAgICAgcEdSUkQtPkdSQVRbMl0gPSBTQlJBVFsyXTsKKyAgICAgICAgcEdSUkQtPkdSQVRbM10gPSBTQlJBVFszXTsKKworICAgICAgICB7CisgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Bcml0aERlY29kZXI+IHBBcml0aERlY29kZXIoCisgICAgICAgICAgICAgIG5ldyBDSkJpZzJfQXJpdGhEZWNvZGVyKHBTdHJlYW0pKTsKKyAgICAgICAgICBJQkkgPSBwR1JSRC0+ZGVjb2RlKHBBcml0aERlY29kZXIuZ2V0KCksIGdyQ29udGV4dCk7CisgICAgICAgICAgaWYgKCFJQkkpCisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorCisgICAgICAgIHBTdHJlYW0tPmFsaWduQnl0ZSgpOworICAgICAgICBwU3RyZWFtLT5vZmZzZXQoMik7CisgICAgICAgIGlmICgoRlhfRFdPUkQpblZhbCAhPSAocFN0cmVhbS0+Z2V0T2Zmc2V0KCkgLSBuVG1wKSkgeworICAgICAgICAgIGRlbGV0ZSBJQkk7CisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICghSUJJKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgV0kgPSBJQkktPm1fbldpZHRoOworICAgICAgSEkgPSBJQkktPm1fbkhlaWdodDsKKyAgICAgIGlmIChUUkFOU1BPU0VEID09IDAgJiYgKChSRUZDT1JORVIgPT0gSkJJRzJfQ09STkVSX1RPUFJJR0hUKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJFRkNPUk5FUiA9PSBKQklHMl9DT1JORVJfQk9UVE9NUklHSFQpKSkgeworICAgICAgICBDVVJTID0gQ1VSUyArIFdJIC0gMTsKKyAgICAgIH0gZWxzZSBpZiAoVFJBTlNQT1NFRCA9PSAxICYmICgoUkVGQ09STkVSID09IEpCSUcyX0NPUk5FUl9CT1RUT01MRUZUKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSRUZDT1JORVIgPT0gSkJJRzJfQ09STkVSX0JPVFRPTVJJR0hUKSkpIHsKKyAgICAgICAgQ1VSUyA9IENVUlMgKyBISSAtIDE7CisgICAgICB9CisgICAgICBTSSA9IENVUlM7CisgICAgICBpZiAoVFJBTlNQT1NFRCA9PSAwKSB7CisgICAgICAgIHN3aXRjaCAoUkVGQ09STkVSKSB7CisgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfVE9QTEVGVDoKKyAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShTSSwgVEksIElCSSwgU0JDT01CT1ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfVE9QUklHSFQ6CisgICAgICAgICAgICBTQlJFRy0+Y29tcG9zZUZyb20oU0kgLSBXSSArIDEsIFRJLCBJQkksIFNCQ09NQk9QKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX0JPVFRPTUxFRlQ6CisgICAgICAgICAgICBTQlJFRy0+Y29tcG9zZUZyb20oU0ksIFRJIC0gSEkgKyAxLCBJQkksIFNCQ09NQk9QKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX0JPVFRPTVJJR0hUOgorICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFNJIC0gV0kgKyAxLCBUSSAtIEhJICsgMSwgSUJJLCBTQkNPTUJPUCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChSRUZDT1JORVIpIHsKKyAgICAgICAgICBjYXNlIEpCSUcyX0NPUk5FUl9UT1BMRUZUOgorICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFRJLCBTSSwgSUJJLCBTQkNPTUJPUCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEpCSUcyX0NPUk5FUl9UT1BSSUdIVDoKKyAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShUSSAtIFdJICsgMSwgU0ksIElCSSwgU0JDT01CT1ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfQk9UVE9NTEVGVDoKKyAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShUSSwgU0kgLSBISSArIDEsIElCSSwgU0JDT01CT1ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfQk9UVE9NUklHSFQ6CisgICAgICAgICAgICBTQlJFRy0+Y29tcG9zZUZyb20oVEkgLSBXSSArIDEsIFNJIC0gSEkgKyAxLCBJQkksIFNCQ09NQk9QKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoUkkgIT0gMCkgeworICAgICAgICBkZWxldGUgSUJJOworICAgICAgfQorICAgICAgaWYgKFRSQU5TUE9TRUQgPT0gMCAmJiAoKFJFRkNPUk5FUiA9PSBKQklHMl9DT1JORVJfVE9QTEVGVCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSRUZDT1JORVIgPT0gSkJJRzJfQ09STkVSX0JPVFRPTUxFRlQpKSkgeworICAgICAgICBDVVJTID0gQ1VSUyArIFdJIC0gMTsKKyAgICAgIH0gZWxzZSBpZiAoVFJBTlNQT1NFRCA9PSAxICYmICgoUkVGQ09STkVSID09IEpCSUcyX0NPUk5FUl9UT1BMRUZUKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSRUZDT1JORVIgPT0gSkJJRzJfQ09STkVSX1RPUFJJR0hUKSkpIHsKKyAgICAgICAgQ1VSUyA9IENVUlMgKyBISSAtIDE7CisgICAgICB9CisgICAgICBOSU5TVEFOQ0VTID0gTklOU1RBTkNFUyArIDE7CisgICAgfQorICB9CisgIHJldHVybiBTQlJFRy5yZWxlYXNlKCk7Cit9CisKK0NKQmlnMl9JbWFnZSogQ0pCaWcyX1RSRFByb2M6OmRlY29kZV9Bcml0aChDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkludERlY29kZXJTdGF0ZSogcElEUykgeworICBpbnQzMl90IFNUUklQVCwgRklSU1RTOworICBGWF9EV09SRCBOSU5TVEFOQ0VTOworICBpbnQzMl90IERULCBERlMsIENVUlM7CisgIGludDMyX3QgU0ksIFRJOworICBDSkJpZzJfSW1hZ2UqIElCSTsKKyAgRlhfRFdPUkQgV0ksIEhJOworICBpbnQzMl90IElEUzsKKyAgaW50IFJJOworICBpbnQzMl90IFJEV0ksIFJESEksIFJEWEksIFJEWUk7CisgIENKQmlnMl9JbWFnZSogSUJPSTsKKyAgRlhfRFdPUkQgV09JLCBIT0k7CisgIEZYX0JPT0wgYkZpcnN0OworICBpbnQzMl90IGJSZXRhaW5lZDsKKyAgQ0pCaWcyX0FyaXRoSW50RGVjb2RlciogSUFEVCwgKklBRlMsICpJQURTLCAqSUFJVCwgKklBUkksICpJQVJEVywgKklBUkRILAorICAgICAgKklBUkRYLCAqSUFSRFk7CisgIENKQmlnMl9Bcml0aElhaWREZWNvZGVyKiBJQUlEOworICBpZiAocElEUykgeworICAgIElBRFQgPSBwSURTLT5JQURUOworICAgIElBRlMgPSBwSURTLT5JQUZTOworICAgIElBRFMgPSBwSURTLT5JQURTOworICAgIElBSVQgPSBwSURTLT5JQUlUOworICAgIElBUkkgPSBwSURTLT5JQVJJOworICAgIElBUkRXID0gcElEUy0+SUFSRFc7CisgICAgSUFSREggPSBwSURTLT5JQVJESDsKKyAgICBJQVJEWCA9IHBJRFMtPklBUkRYOworICAgIElBUkRZID0gcElEUy0+SUFSRFk7CisgICAgSUFJRCA9IHBJRFMtPklBSUQ7CisgICAgYlJldGFpbmVkID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBJQURUID0gbmV3IENKQmlnMl9Bcml0aEludERlY29kZXIoKTsKKyAgICBJQUZTID0gbmV3IENKQmlnMl9Bcml0aEludERlY29kZXIoKTsKKyAgICBJQURTID0gbmV3IENKQmlnMl9Bcml0aEludERlY29kZXIoKTsKKyAgICBJQUlUID0gbmV3IENKQmlnMl9Bcml0aEludERlY29kZXIoKTsKKyAgICBJQVJJID0gbmV3IENKQmlnMl9Bcml0aEludERlY29kZXIoKTsKKyAgICBJQVJEVyA9IG5ldyBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCk7CisgICAgSUFSREggPSBuZXcgQ0pCaWcyX0FyaXRoSW50RGVjb2RlcigpOworICAgIElBUkRYID0gbmV3IENKQmlnMl9Bcml0aEludERlY29kZXIoKTsKKyAgICBJQVJEWSA9IG5ldyBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKCk7CisgICAgSUFJRCA9IG5ldyBDSkJpZzJfQXJpdGhJYWlkRGVjb2RlcihTQlNZTUNPREVMRU4pOworICAgIGJSZXRhaW5lZCA9IEZBTFNFOworICB9CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IFNCUkVHKG5ldyBDSkJpZzJfSW1hZ2UoU0JXLCBTQkgpKTsKKyAgU0JSRUctPmZpbGwoU0JERUZQSVhFTCk7CisgIElBRFQtPmRlY29kZShwQXJpdGhEZWNvZGVyLCAmU1RSSVBUKTsKKyAgU1RSSVBUICo9IFNCU1RSSVBTOworICBTVFJJUFQgPSAtU1RSSVBUOworICBGSVJTVFMgPSAwOworICBOSU5TVEFOQ0VTID0gMDsKKyAgd2hpbGUgKE5JTlNUQU5DRVMgPCBTQk5VTUlOU1RBTkNFUykgeworICAgIElBRFQtPmRlY29kZShwQXJpdGhEZWNvZGVyLCAmRFQpOworICAgIERUICo9IFNCU1RSSVBTOworICAgIFNUUklQVCA9IFNUUklQVCArIERUOworICAgIGJGaXJzdCA9IFRSVUU7CisgICAgZm9yICg7OykgeworICAgICAgaWYgKGJGaXJzdCkgeworICAgICAgICBJQUZTLT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJkRGUyk7CisgICAgICAgIEZJUlNUUyA9IEZJUlNUUyArIERGUzsKKyAgICAgICAgQ1VSUyA9IEZJUlNUUzsKKyAgICAgICAgYkZpcnN0ID0gRkFMU0U7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIUlBRFMtPmRlY29kZShwQXJpdGhEZWNvZGVyLCAmSURTKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgQ1VSUyA9IENVUlMgKyBJRFMgKyBTQkRTT0ZGU0VUOworICAgICAgfQorICAgICAgaWYgKE5JTlNUQU5DRVMgPj0gU0JOVU1JTlNUQU5DRVMpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpbnQgQ1VSVCA9IDA7CisgICAgICBpZiAoU0JTVFJJUFMgIT0gMSkKKyAgICAgICAgSUFJVC0+ZGVjb2RlKHBBcml0aERlY29kZXIsICZDVVJUKTsKKworICAgICAgVEkgPSBTVFJJUFQgKyBDVVJUOworICAgICAgRlhfRFdPUkQgSURJOworICAgICAgSUFJRC0+ZGVjb2RlKHBBcml0aERlY29kZXIsICZJREkpOworICAgICAgaWYgKElESSA+PSBTQk5VTVNZTVMpCisgICAgICAgIGdvdG8gZmFpbGVkOworCisgICAgICBpZiAoU0JSRUZJTkUgPT0gMCkKKyAgICAgICAgUkkgPSAwOworICAgICAgZWxzZQorICAgICAgICBJQVJJLT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJlJJKTsKKworICAgICAgaWYgKCFTQlNZTVNbSURJXSkKKyAgICAgICAgZ290byBmYWlsZWQ7CisKKyAgICAgIGlmIChSSSA9PSAwKSB7CisgICAgICAgIElCSSA9IFNCU1lNU1tJREldOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgSUFSRFctPmRlY29kZShwQXJpdGhEZWNvZGVyLCAmUkRXSSk7CisgICAgICAgIElBUkRILT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJlJESEkpOworICAgICAgICBJQVJEWC0+ZGVjb2RlKHBBcml0aERlY29kZXIsICZSRFhJKTsKKyAgICAgICAgSUFSRFktPmRlY29kZShwQXJpdGhEZWNvZGVyLCAmUkRZSSk7CisgICAgICAgIElCT0kgPSBTQlNZTVNbSURJXTsKKyAgICAgICAgV09JID0gSUJPSS0+bV9uV2lkdGg7CisgICAgICAgIEhPSSA9IElCT0ktPm1fbkhlaWdodDsKKyAgICAgICAgaWYgKChpbnQpKFdPSSArIFJEV0kpIDwgMCB8fCAoaW50KShIT0kgKyBSREhJKSA8IDApIHsKKyAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0dSUkRQcm9jPiBwR1JSRChuZXcgQ0pCaWcyX0dSUkRQcm9jKCkpOworICAgICAgICBwR1JSRC0+R1JXID0gV09JICsgUkRXSTsKKyAgICAgICAgcEdSUkQtPkdSSCA9IEhPSSArIFJESEk7CisgICAgICAgIHBHUlJELT5HUlRFTVBMQVRFID0gU0JSVEVNUExBVEU7CisgICAgICAgIHBHUlJELT5HUlJFRkVSRU5DRSA9IElCT0k7CisgICAgICAgIHBHUlJELT5HUlJFRkVSRU5DRURYID0gKFJEV0kgPj4gMSkgKyBSRFhJOworICAgICAgICBwR1JSRC0+R1JSRUZFUkVOQ0VEWSA9IChSREhJID4+IDEpICsgUkRZSTsKKyAgICAgICAgcEdSUkQtPlRQR1JPTiA9IDA7CisgICAgICAgIHBHUlJELT5HUkFUWzBdID0gU0JSQVRbMF07CisgICAgICAgIHBHUlJELT5HUkFUWzFdID0gU0JSQVRbMV07CisgICAgICAgIHBHUlJELT5HUkFUWzJdID0gU0JSQVRbMl07CisgICAgICAgIHBHUlJELT5HUkFUWzNdID0gU0JSQVRbM107CisgICAgICAgIElCSSA9IHBHUlJELT5kZWNvZGUocEFyaXRoRGVjb2RlciwgZ3JDb250ZXh0KTsKKyAgICAgICAgaWYgKCFJQkkpCisgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICB9CisgICAgICBXSSA9IElCSS0+bV9uV2lkdGg7CisgICAgICBISSA9IElCSS0+bV9uSGVpZ2h0OworICAgICAgaWYgKFRSQU5TUE9TRUQgPT0gMCAmJiAoKFJFRkNPUk5FUiA9PSBKQklHMl9DT1JORVJfVE9QUklHSFQpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUkVGQ09STkVSID09IEpCSUcyX0NPUk5FUl9CT1RUT01SSUdIVCkpKSB7CisgICAgICAgIENVUlMgPSBDVVJTICsgV0kgLSAxOworICAgICAgfSBlbHNlIGlmIChUUkFOU1BPU0VEID09IDEgJiYgKChSRUZDT1JORVIgPT0gSkJJRzJfQ09STkVSX0JPVFRPTUxFRlQpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJFRkNPUk5FUiA9PSBKQklHMl9DT1JORVJfQk9UVE9NUklHSFQpKSkgeworICAgICAgICBDVVJTID0gQ1VSUyArIEhJIC0gMTsKKyAgICAgIH0KKyAgICAgIFNJID0gQ1VSUzsKKyAgICAgIGlmIChUUkFOU1BPU0VEID09IDApIHsKKyAgICAgICAgc3dpdGNoIChSRUZDT1JORVIpIHsKKyAgICAgICAgICBjYXNlIEpCSUcyX0NPUk5FUl9UT1BMRUZUOgorICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFNJLCBUSSwgSUJJLCBTQkNPTUJPUCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEpCSUcyX0NPUk5FUl9UT1BSSUdIVDoKKyAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShTSSAtIFdJICsgMSwgVEksIElCSSwgU0JDT01CT1ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfQk9UVE9NTEVGVDoKKyAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShTSSwgVEkgLSBISSArIDEsIElCSSwgU0JDT01CT1ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfQk9UVE9NUklHSFQ6CisgICAgICAgICAgICBTQlJFRy0+Y29tcG9zZUZyb20oU0kgLSBXSSArIDEsIFRJIC0gSEkgKyAxLCBJQkksIFNCQ09NQk9QKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKFJFRkNPUk5FUikgeworICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX1RPUExFRlQ6CisgICAgICAgICAgICBTQlJFRy0+Y29tcG9zZUZyb20oVEksIFNJLCBJQkksIFNCQ09NQk9QKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX1RPUFJJR0hUOgorICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFRJIC0gV0kgKyAxLCBTSSwgSUJJLCBTQkNPTUJPUCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEpCSUcyX0NPUk5FUl9CT1RUT01MRUZUOgorICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFRJLCBTSSAtIEhJICsgMSwgSUJJLCBTQkNPTUJPUCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEpCSUcyX0NPUk5FUl9CT1RUT01SSUdIVDoKKyAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShUSSAtIFdJICsgMSwgU0kgLSBISSArIDEsIElCSSwgU0JDT01CT1ApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChSSSAhPSAwKSB7CisgICAgICAgIGRlbGV0ZSBJQkk7CisgICAgICB9CisgICAgICBpZiAoVFJBTlNQT1NFRCA9PSAwICYmICgoUkVGQ09STkVSID09IEpCSUcyX0NPUk5FUl9UT1BMRUZUKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJFRkNPUk5FUiA9PSBKQklHMl9DT1JORVJfQk9UVE9NTEVGVCkpKSB7CisgICAgICAgIENVUlMgPSBDVVJTICsgV0kgLSAxOworICAgICAgfSBlbHNlIGlmIChUUkFOU1BPU0VEID09IDEgJiYgKChSRUZDT1JORVIgPT0gSkJJRzJfQ09STkVSX1RPUExFRlQpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJFRkNPUk5FUiA9PSBKQklHMl9DT1JORVJfVE9QUklHSFQpKSkgeworICAgICAgICBDVVJTID0gQ1VSUyArIEhJIC0gMTsKKyAgICAgIH0KKyAgICAgIE5JTlNUQU5DRVMgPSBOSU5TVEFOQ0VTICsgMTsKKyAgICB9CisgIH0KKyAgaWYgKGJSZXRhaW5lZCA9PSBGQUxTRSkgeworICAgIGRlbGV0ZSBJQURUOworICAgIGRlbGV0ZSBJQUZTOworICAgIGRlbGV0ZSBJQURTOworICAgIGRlbGV0ZSBJQUlUOworICAgIGRlbGV0ZSBJQVJJOworICAgIGRlbGV0ZSBJQVJEVzsKKyAgICBkZWxldGUgSUFSREg7CisgICAgZGVsZXRlIElBUkRYOworICAgIGRlbGV0ZSBJQVJEWTsKKyAgICBkZWxldGUgSUFJRDsKKyAgfQorICByZXR1cm4gU0JSRUcucmVsZWFzZSgpOworZmFpbGVkOgorICBpZiAoYlJldGFpbmVkID09IEZBTFNFKSB7CisgICAgZGVsZXRlIElBRFQ7CisgICAgZGVsZXRlIElBRlM7CisgICAgZGVsZXRlIElBRFM7CisgICAgZGVsZXRlIElBSVQ7CisgICAgZGVsZXRlIElBUkk7CisgICAgZGVsZXRlIElBUkRXOworICAgIGRlbGV0ZSBJQVJESDsKKyAgICBkZWxldGUgSUFSRFg7CisgICAgZGVsZXRlIElBUkRZOworICAgIGRlbGV0ZSBJQUlEOworICB9CisgIHJldHVybiBudWxscHRyOworfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9UcmRQcm9jLmggYi9jb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1RyZFByb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTA4MDJjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9UcmRQcm9jLmgKQEAgLTAsMCArMSw4MiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfU1JDX0ZYQ09ERUNfSkJJRzJfSkJJRzJfVFJEUFJPQ19IXworI2RlZmluZSBDT1JFX1NSQ19GWENPREVDX0pCSUcyX0pCSUcyX1RSRFBST0NfSF8KKworI2luY2x1ZGUgIkpCaWcyX0ltYWdlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorCitjbGFzcyBDSkJpZzJfQXJpdGhEZWNvZGVyOworY2xhc3MgQ0pCaWcyX0FyaXRoSWFpZERlY29kZXI7CitjbGFzcyBDSkJpZzJfQXJpdGhJbnREZWNvZGVyOworY2xhc3MgQ0pCaWcyX0JpdFN0cmVhbTsKK2NsYXNzIENKQmlnMl9IdWZmbWFuVGFibGU7CitzdHJ1Y3QgSkJpZzJBcml0aEN0eDsKK3N0cnVjdCBKQmlnMkh1ZmZtYW5Db2RlOworCitzdHJ1Y3QgSkJpZzJJbnREZWNvZGVyU3RhdGUgeworICBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKiBJQURUOworICBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKiBJQUZTOworICBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKiBJQURTOworICBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKiBJQUlUOworICBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKiBJQVJJOworICBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKiBJQVJEVzsKKyAgQ0pCaWcyX0FyaXRoSW50RGVjb2RlciogSUFSREg7CisgIENKQmlnMl9Bcml0aEludERlY29kZXIqIElBUkRYOworICBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKiBJQVJEWTsKKyAgQ0pCaWcyX0FyaXRoSWFpZERlY29kZXIqIElBSUQ7Cit9OworCitlbnVtIEpCaWcyQ29ybmVyIHsKKyAgSkJJRzJfQ09STkVSX0JPVFRPTUxFRlQgPSAwLAorICBKQklHMl9DT1JORVJfVE9QTEVGVCA9IDEsCisgIEpCSUcyX0NPUk5FUl9CT1RUT01SSUdIVCA9IDIsCisgIEpCSUcyX0NPUk5FUl9UT1BSSUdIVCA9IDMKK307CisKK2NsYXNzIENKQmlnMl9UUkRQcm9jIHsKKyBwdWJsaWM6CisgIENKQmlnMl9JbWFnZSogZGVjb2RlX0h1ZmZtYW4oQ0pCaWcyX0JpdFN0cmVhbSogcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnckNvbnRleHQpOworCisgIENKQmlnMl9JbWFnZSogZGVjb2RlX0FyaXRoKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJJbnREZWNvZGVyU3RhdGUqIHBJRFMgPSBOVUxMKTsKKworIHB1YmxpYzoKKyAgRlhfQk9PTCBTQkhVRkY7CisgIEZYX0JPT0wgU0JSRUZJTkU7CisgIEZYX0RXT1JEIFNCVzsKKyAgRlhfRFdPUkQgU0JIOworICBGWF9EV09SRCBTQk5VTUlOU1RBTkNFUzsKKyAgRlhfRFdPUkQgU0JTVFJJUFM7CisgIEZYX0RXT1JEIFNCTlVNU1lNUzsKKworICBKQmlnMkh1ZmZtYW5Db2RlKiBTQlNZTUNPREVTOworICB1aW50OF90IFNCU1lNQ09ERUxFTjsKKworICBDSkJpZzJfSW1hZ2UqKiBTQlNZTVM7CisgIEZYX0JPT0wgU0JERUZQSVhFTDsKKworICBKQmlnMkNvbXBvc2VPcCBTQkNPTUJPUDsKKyAgRlhfQk9PTCBUUkFOU1BPU0VEOworCisgIEpCaWcyQ29ybmVyIFJFRkNPUk5FUjsKKyAgaW50OF90IFNCRFNPRkZTRVQ7CisgIENKQmlnMl9IdWZmbWFuVGFibGUqIFNCSFVGRkZTOworICBDSkJpZzJfSHVmZm1hblRhYmxlKiBTQkhVRkZEUzsKKyAgQ0pCaWcyX0h1ZmZtYW5UYWJsZSogU0JIVUZGRFQ7CisgIENKQmlnMl9IdWZmbWFuVGFibGUqIFNCSFVGRlJEVzsKKyAgQ0pCaWcyX0h1ZmZtYW5UYWJsZSogU0JIVUZGUkRIOworICBDSkJpZzJfSHVmZm1hblRhYmxlKiBTQkhVRkZSRFg7CisgIENKQmlnMl9IdWZmbWFuVGFibGUqIFNCSFVGRlJEWTsKKyAgQ0pCaWcyX0h1ZmZtYW5UYWJsZSogU0JIVUZGUlNJWkU7CisgIEZYX0JPT0wgU0JSVEVNUExBVEU7CisgIGludDhfdCBTQlJBVFs0XTsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9TUkNfRlhDT0RFQ19KQklHMl9KQklHMl9UUkRQUk9DX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xibXAvZnhfYm1wLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvbGJtcC9meF9ibXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNDc3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2xibXAvZnhfYm1wLmNwcApAQCAtMCwwICsxLDk3NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiZnhfYm1wLmgiDQorDQorI2luY2x1ZGUgPGFsZ29yaXRobT4NCisNCituYW1lc3BhY2Ugew0KKw0KK2NvbnN0IHNpemVfdCBrQm1wQ29yZUhlYWRlclNpemUgPSAxMjsNCitjb25zdCBzaXplX3Qga0JtcEluZm9IZWFkZXJTaXplID0gNDA7DQorDQorfSAgLy8gbmFtZXNwYWNlDQorDQorRlhfRFdPUkQgX0dldERXb3JkX0xTQkZpcnN0KHVpbnQ4X3QqIHApIHsNCisgIHJldHVybiBwWzBdIHwgKHBbMV0gPDwgOCkgfCAocFsyXSA8PCAxNikgfCAocFszXSA8PCAyNCk7DQorfQ0KK0ZYX1dPUkQgX0dldFdvcmRfTFNCRmlyc3QodWludDhfdCogcCkgew0KKyAgcmV0dXJuIHBbMF0gfCAocFsxXSA8PCA4KTsNCit9DQordm9pZCBfU2V0RFdvcmRfTFNCRmlyc3QodWludDhfdCogcCwgRlhfRFdPUkQgdikgew0KKyAgcFswXSA9ICh1aW50OF90KXY7DQorICBwWzFdID0gKHVpbnQ4X3QpKHYgPj4gOCk7DQorICBwWzJdID0gKHVpbnQ4X3QpKHYgPj4gMTYpOw0KKyAgcFszXSA9ICh1aW50OF90KSh2ID4+IDI0KTsNCit9DQordm9pZCBfU2V0V29yZF9MU0JGaXJzdCh1aW50OF90KiBwLCBGWF9XT1JEIHYpIHsNCisgIHBbMF0gPSAodWludDhfdCl2Ow0KKyAgcFsxXSA9ICh1aW50OF90KSh2ID4+IDgpOw0KK30NCit2b2lkIF9ibXBfZXJyb3IoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwgY29uc3QgRlhfQ0hBUiogZXJyX21zZykgew0KKyAgaWYgKGJtcF9wdHIgIT0gTlVMTCAmJiBibXBfcHRyLT5fYm1wX2Vycm9yX2ZuICE9IE5VTEwpIHsNCisgICAgYm1wX3B0ci0+X2JtcF9lcnJvcl9mbihibXBfcHRyLCBlcnJfbXNnKTsNCisgIH0NCit9DQorYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgX2JtcF9jcmVhdGVfZGVjb21wcmVzcygpIHsNCisgIGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIgPSBGWF9BbGxvYyhibXBfZGVjb21wcmVzc19zdHJ1Y3QsIDEpOw0KKyAgaWYgKGJtcF9wdHIgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIEZYU1lTX21lbXNldChibXBfcHRyLCAwLCBzaXplb2YoYm1wX2RlY29tcHJlc3Nfc3RydWN0KSk7DQorICBibXBfcHRyLT5kZWNvZGVfc3RhdHVzID0gQk1QX0RfU1RBVFVTX0hFQURFUjsNCisgIGJtcF9wdHItPmJtcF9oZWFkZXJfcHRyID0gRlhfQWxsb2MoQm1wRmlsZUhlYWRlciwgMSk7DQorICByZXR1cm4gYm1wX3B0cjsNCit9DQordm9pZCBfYm1wX2Rlc3Ryb3lfZGVjb21wcmVzcyhibXBfZGVjb21wcmVzc19zdHJ1Y3RfcHAgYm1wX3B0cl9wdHIpIHsNCisgIGlmIChibXBfcHRyX3B0ciA9PSBOVUxMIHx8ICpibXBfcHRyX3B0ciA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIgPSAqYm1wX3B0cl9wdHI7DQorICAqYm1wX3B0cl9wdHIgPSBOVUxMOw0KKyAgaWYgKGJtcF9wdHItPm91dF9yb3dfYnVmZmVyICE9IE5VTEwpIHsNCisgICAgRlhfRnJlZShibXBfcHRyLT5vdXRfcm93X2J1ZmZlcik7DQorICB9DQorICBpZiAoYm1wX3B0ci0+cGFsX3B0ciAhPSBOVUxMKSB7DQorICAgIEZYX0ZyZWUoYm1wX3B0ci0+cGFsX3B0cik7DQorICB9DQorICBpZiAoYm1wX3B0ci0+Ym1wX2hlYWRlcl9wdHIgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKGJtcF9wdHItPmJtcF9oZWFkZXJfcHRyKTsNCisgIH0NCisgIEZYX0ZyZWUoYm1wX3B0cik7DQorfQ0KK2ludDMyX3QgX2JtcF9yZWFkX2hlYWRlcihibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyKSB7DQorICBpZiAoYm1wX3B0ciA9PSBOVUxMKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgRlhfRFdPUkQgc2tpcF9zaXplX29yZyA9IGJtcF9wdHItPnNraXBfc2l6ZTsNCisgIGlmIChibXBfcHRyLT5kZWNvZGVfc3RhdHVzID09IEJNUF9EX1NUQVRVU19IRUFERVIpIHsNCisgICAgQVNTRVJUKHNpemVvZihCbXBGaWxlSGVhZGVyKSA9PSAxNCk7DQorICAgIEJtcEZpbGVIZWFkZXIqIGJtcF9oZWFkZXJfcHRyID0gTlVMTDsNCisgICAgaWYgKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsICh1aW50OF90KiopJmJtcF9oZWFkZXJfcHRyLCAxNCkgPT0gTlVMTCkgew0KKyAgICAgIHJldHVybiAyOw0KKyAgICB9DQorICAgIGJtcF9wdHItPmJtcF9oZWFkZXJfcHRyLT5iZlR5cGUgPQ0KKyAgICAgICAgX0dldFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZibXBfaGVhZGVyX3B0ci0+YmZUeXBlKTsNCisgICAgYm1wX3B0ci0+Ym1wX2hlYWRlcl9wdHItPmJmT2ZmQml0cyA9DQorICAgICAgICBfR2V0RFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZibXBfaGVhZGVyX3B0ci0+YmZPZmZCaXRzKTsNCisgICAgYm1wX3B0ci0+ZGF0YV9zaXplID0gX0dldERXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2hlYWRlcl9wdHItPmJmU2l6ZSk7DQorICAgIGlmIChibXBfcHRyLT5ibXBfaGVhZGVyX3B0ci0+YmZUeXBlICE9IEJNUF9TSUdOQVRVUkUpIHsNCisgICAgICBfYm1wX2Vycm9yKGJtcF9wdHIsICJOb3QgQSBCbXAgSW1hZ2UiKTsNCisgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBpZiAoYm1wX3B0ci0+YXZhaWxfaW4gPCBzaXplb2YoRlhfRFdPUkQpKSB7DQorICAgICAgYm1wX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICByZXR1cm4gMjsNCisgICAgfQ0KKyAgICBibXBfcHRyLT5pbWdfaWZoX3NpemUgPQ0KKyAgICAgICAgX0dldERXb3JkX0xTQkZpcnN0KGJtcF9wdHItPm5leHRfaW4gKyBibXBfcHRyLT5za2lwX3NpemUpOw0KKyAgICBibXBfcHRyLT5wYWxfdHlwZSA9IDA7DQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEJtcENvcmVIZWFkZXIpID09IGtCbXBDb3JlSGVhZGVyU2l6ZSwNCisgICAgICAgICAgICAgICAgICAiQm1wQ29yZUhlYWRlciBoYXMgd3Jvbmcgc2l6ZSIpOw0KKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihCbXBJbmZvSGVhZGVyKSA9PSBrQm1wSW5mb0hlYWRlclNpemUsDQorICAgICAgICAgICAgICAgICAgIkJtcEluZm9IZWFkZXIgaGFzIHdyb25nIHNpemUiKTsNCisgICAgc3dpdGNoIChibXBfcHRyLT5pbWdfaWZoX3NpemUpIHsNCisgICAgICBjYXNlIGtCbXBDb3JlSGVhZGVyU2l6ZTogew0KKyAgICAgICAgYm1wX3B0ci0+cGFsX3R5cGUgPSAxOw0KKyAgICAgICAgQm1wQ29yZUhlYWRlclB0ciBibXBfY29yZV9oZWFkZXJfcHRyID0gTlVMTDsNCisgICAgICAgIGlmIChfYm1wX3JlYWRfZGF0YShibXBfcHRyLCAodWludDhfdCoqKSZibXBfY29yZV9oZWFkZXJfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmltZ19pZmhfc2l6ZSkgPT0gTlVMTCkgew0KKyAgICAgICAgICBibXBfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgIH0NCisgICAgICAgIGJtcF9wdHItPndpZHRoID0gKEZYX0RXT1JEKV9HZXRXb3JkX0xTQkZpcnN0KA0KKyAgICAgICAgICAgICh1aW50OF90KikmYm1wX2NvcmVfaGVhZGVyX3B0ci0+YmNXaWR0aCk7DQorICAgICAgICBibXBfcHRyLT5oZWlnaHQgPSAoRlhfRFdPUkQpX0dldFdvcmRfTFNCRmlyc3QoDQorICAgICAgICAgICAgKHVpbnQ4X3QqKSZibXBfY29yZV9oZWFkZXJfcHRyLT5iY0hlaWdodCk7DQorICAgICAgICBibXBfcHRyLT5iaXRDb3VudHMgPQ0KKyAgICAgICAgICAgIF9HZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2NvcmVfaGVhZGVyX3B0ci0+YmNCaXRDb3VudCk7DQorICAgICAgICBibXBfcHRyLT5jb21wcmVzc19mbGFnID0gQk1QX1JHQjsNCisgICAgICAgIGJtcF9wdHItPmltZ1RCX2ZsYWcgPSBGQUxTRTsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2Uga0JtcEluZm9IZWFkZXJTaXplOiB7DQorICAgICAgICBCbXBJbmZvSGVhZGVyUHRyIGJtcF9pbmZvX2hlYWRlcl9wdHIgPSBOVUxMOw0KKyAgICAgICAgaWYgKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsICh1aW50OF90KiopJmJtcF9pbmZvX2hlYWRlcl9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+aW1nX2lmaF9zaXplKSA9PSBOVUxMKSB7DQorICAgICAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQorICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYm1wX3B0ci0+d2lkdGggPQ0KKyAgICAgICAgICAgIF9HZXREV29yZF9MU0JGaXJzdCgodWludDhfdCopJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpV2lkdGgpOw0KKyAgICAgICAgYm1wX3B0ci0+aGVpZ2h0ID0NCisgICAgICAgICAgICBfR2V0RFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZibXBfaW5mb19oZWFkZXJfcHRyLT5iaUhlaWdodCk7DQorICAgICAgICBibXBfcHRyLT5iaXRDb3VudHMgPQ0KKyAgICAgICAgICAgIF9HZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlCaXRDb3VudCk7DQorICAgICAgICBibXBfcHRyLT5jb21wcmVzc19mbGFnID0NCisgICAgICAgICAgICBfR2V0RFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZibXBfaW5mb19oZWFkZXJfcHRyLT5iaUNvbXByZXNzaW9uKTsNCisgICAgICAgIGJtcF9wdHItPmNvbG9yX3VzZWQgPQ0KKyAgICAgICAgICAgIF9HZXREV29yZF9MU0JGaXJzdCgodWludDhfdCopJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpQ2xyVXNlZCk7DQorICAgICAgICBibXBfcHRyLT5kcGlfeCA9IChpbnQzMl90KV9HZXREV29yZF9MU0JGaXJzdCgNCisgICAgICAgICAgICAodWludDhfdCopJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpWFBlbHNQZXJNZXRlcik7DQorICAgICAgICBibXBfcHRyLT5kcGlfeSA9IChpbnQzMl90KV9HZXREV29yZF9MU0JGaXJzdCgNCisgICAgICAgICAgICAodWludDhfdCopJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpWVBlbHNQZXJNZXRlcik7DQorICAgICAgICBpZiAoYm1wX3B0ci0+aGVpZ2h0IDwgMCkgew0KKyAgICAgICAgICBibXBfcHRyLT5oZWlnaHQgPSAtYm1wX3B0ci0+aGVpZ2h0Ow0KKyAgICAgICAgICBibXBfcHRyLT5pbWdUQl9mbGFnID0gVFJVRTsNCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgIGlmIChibXBfcHRyLT5pbWdfaWZoX3NpemUgPg0KKyAgICAgICAgICAgIHN0ZDo6bWluKGtCbXBJbmZvSGVhZGVyU2l6ZSwgc2l6ZW9mKEJtcEluZm9IZWFkZXIpKSkgew0KKyAgICAgICAgICBCbXBJbmZvSGVhZGVyUHRyIGJtcF9pbmZvX2hlYWRlcl9wdHIgPSBOVUxMOw0KKyAgICAgICAgICBpZiAoX2JtcF9yZWFkX2RhdGEoYm1wX3B0ciwgKHVpbnQ4X3QqKikmYm1wX2luZm9faGVhZGVyX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmltZ19pZmhfc2l6ZSkgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQorICAgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICAgIH0NCisgICAgICAgICAgRlhfV09SRCBiaVBsYW5lczsNCisgICAgICAgICAgYm1wX3B0ci0+d2lkdGggPQ0KKyAgICAgICAgICAgICAgX0dldERXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlXaWR0aCk7DQorICAgICAgICAgIGJtcF9wdHItPmhlaWdodCA9DQorICAgICAgICAgICAgICBfR2V0RFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZibXBfaW5mb19oZWFkZXJfcHRyLT5iaUhlaWdodCk7DQorICAgICAgICAgIGJtcF9wdHItPmJpdENvdW50cyA9DQorICAgICAgICAgICAgICBfR2V0V29yZF9MU0JGaXJzdCgodWludDhfdCopJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpQml0Q291bnQpOw0KKyAgICAgICAgICBibXBfcHRyLT5jb21wcmVzc19mbGFnID0NCisgICAgICAgICAgICAgIF9HZXREV29yZF9MU0JGaXJzdCgodWludDhfdCopJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpQ29tcHJlc3Npb24pOw0KKyAgICAgICAgICBibXBfcHRyLT5jb2xvcl91c2VkID0NCisgICAgICAgICAgICAgIF9HZXREV29yZF9MU0JGaXJzdCgodWludDhfdCopJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpQ2xyVXNlZCk7DQorICAgICAgICAgIGJpUGxhbmVzID0NCisgICAgICAgICAgICAgIF9HZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlQbGFuZXMpOw0KKyAgICAgICAgICBibXBfcHRyLT5kcGlfeCA9IF9HZXREV29yZF9MU0JGaXJzdCgNCisgICAgICAgICAgICAgICh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlYUGVsc1Blck1ldGVyKTsNCisgICAgICAgICAgYm1wX3B0ci0+ZHBpX3kgPSBfR2V0RFdvcmRfTFNCRmlyc3QoDQorICAgICAgICAgICAgICAodWludDhfdCopJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpWVBlbHNQZXJNZXRlcik7DQorICAgICAgICAgIGlmIChibXBfcHRyLT5oZWlnaHQgPCAwKSB7DQorICAgICAgICAgICAgYm1wX3B0ci0+aGVpZ2h0ID0gLWJtcF9wdHItPmhlaWdodDsNCisgICAgICAgICAgICBibXBfcHRyLT5pbWdUQl9mbGFnID0gVFJVRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoYm1wX3B0ci0+Y29tcHJlc3NfZmxhZyA9PSBCTVBfUkdCICYmIGJpUGxhbmVzID09IDEgJiYNCisgICAgICAgICAgICAgIGJtcF9wdHItPmNvbG9yX3VzZWQgPT0gMCkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBfYm1wX2Vycm9yKGJtcF9wdHIsICJVbnN1cHBvcnRlZCBCbXAgRmlsZSIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgICAgfQ0KKyAgICB9DQorICAgIEFTU0VSVChibXBfcHRyLT53aWR0aCA+IDApOw0KKyAgICBBU1NFUlQoYm1wX3B0ci0+Y29tcHJlc3NfZmxhZyA8PSBCTVBfQklURklFTERTKTsNCisgICAgc3dpdGNoIChibXBfcHRyLT5iaXRDb3VudHMpIHsNCisgICAgICBjYXNlIDE6DQorICAgICAgY2FzZSA0Og0KKyAgICAgIGNhc2UgODoNCisgICAgICBjYXNlIDE2Og0KKyAgICAgIGNhc2UgMjQ6IHsNCisgICAgICAgIGlmIChibXBfcHRyLT5jb2xvcl91c2VkID4gKChGWF9EV09SRCkxKSA8PCBibXBfcHRyLT5iaXRDb3VudHMpIHsNCisgICAgICAgICAgX2JtcF9lcnJvcihibXBfcHRyLCAiVGhlIEJtcCBGaWxlIElzIENvcnJ1cHQiKTsNCisgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGNhc2UgMzI6IHsNCisgICAgICAgIGlmIChibXBfcHRyLT53aWR0aCA8PSAwIHx8IGJtcF9wdHItPmNvbXByZXNzX2ZsYWcgPiBCTVBfQklURklFTERTKSB7DQorICAgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCbXAgRmlsZSBJcyBDb3JydXB0Iik7DQorICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCbXAgRmlsZSBJcyBDb3JydXB0Iik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBibXBfcHRyLT5zcmNfcm93X2J5dGVzID0gQk1QX1dJRFRIQllURVMoYm1wX3B0ci0+d2lkdGgsIGJtcF9wdHItPmJpdENvdW50cyk7DQorICAgIHN3aXRjaCAoYm1wX3B0ci0+Yml0Q291bnRzKSB7DQorICAgICAgY2FzZSAxOg0KKyAgICAgIGNhc2UgNDoNCisgICAgICBjYXNlIDg6DQorICAgICAgICBibXBfcHRyLT5vdXRfcm93X2J5dGVzID0gQk1QX1dJRFRIQllURVMoYm1wX3B0ci0+d2lkdGgsIDgpOw0KKyAgICAgICAgYm1wX3B0ci0+Y29tcG9uZW50cyA9IDE7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIDE2Og0KKyAgICAgIGNhc2UgMjQ6DQorICAgICAgICBibXBfcHRyLT5vdXRfcm93X2J5dGVzID0gQk1QX1dJRFRIQllURVMoYm1wX3B0ci0+d2lkdGgsIDI0KTsNCisgICAgICAgIGJtcF9wdHItPmNvbXBvbmVudHMgPSAzOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAzMjoNCisgICAgICAgIGJtcF9wdHItPm91dF9yb3dfYnl0ZXMgPSBibXBfcHRyLT5zcmNfcm93X2J5dGVzOw0KKyAgICAgICAgYm1wX3B0ci0+Y29tcG9uZW50cyA9IDQ7DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIgIT0gTlVMTCkgew0KKyAgICAgIEZYX0ZyZWUoYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIpOw0KKyAgICAgIGJtcF9wdHItPm91dF9yb3dfYnVmZmVyID0gTlVMTDsNCisgICAgfQ0KKyAgICBibXBfcHRyLT5vdXRfcm93X2J1ZmZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIGJtcF9wdHItPm91dF9yb3dfYnl0ZXMpOw0KKyAgICBCTVBfUFRSX05PVF9OVUxMKGJtcF9wdHItPm91dF9yb3dfYnVmZmVyLCBibXBfcHRyKTsNCisgICAgRlhTWVNfbWVtc2V0KGJtcF9wdHItPm91dF9yb3dfYnVmZmVyLCAwLCBibXBfcHRyLT5vdXRfcm93X2J5dGVzKTsNCisgICAgX2JtcF9zYXZlX2RlY29kaW5nX3N0YXR1cyhibXBfcHRyLCBCTVBfRF9TVEFUVVNfUEFMKTsNCisgIH0NCisgIGlmIChibXBfcHRyLT5kZWNvZGVfc3RhdHVzID09IEJNUF9EX1NUQVRVU19QQUwpIHsNCisgICAgc2tpcF9zaXplX29yZyA9IGJtcF9wdHItPnNraXBfc2l6ZTsNCisjaWZkZWYgQk1QX1NVUFBPUlRfQklURklFTEQNCisgICAgaWYgKGJtcF9wdHItPmNvbXByZXNzX2ZsYWcgPT0gQk1QX0JJVEZJRUxEUykgew0KKyAgICAgIGlmIChibXBfcHRyLT5iaXRDb3VudHMgIT0gMTYgJiYgYm1wX3B0ci0+Yml0Q291bnRzICE9IDMyKSB7DQorICAgICAgICBfYm1wX2Vycm9yKGJtcF9wdHIsICJUaGUgQm1wIEZpbGUgSXMgQ29ycnVwdCIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgICAgfQ0KKyAgICAgIEZYX0RXT1JEKiBtYXNrOw0KKyAgICAgIGlmIChfYm1wX3JlYWRfZGF0YShibXBfcHRyLCAodWludDhfdCoqKSZtYXNrLCAzICogc2l6ZW9mKEZYX0RXT1JEKSkgPT0NCisgICAgICAgICAgTlVMTCkgew0KKyAgICAgICAgYm1wX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICAgIHJldHVybiAyOw0KKyAgICAgIH0NCisgICAgICBibXBfcHRyLT5tYXNrX3JlZCA9IF9HZXREV29yZF9MU0JGaXJzdCgodWludDhfdCopJm1hc2tbMF0pOw0KKyAgICAgIGJtcF9wdHItPm1hc2tfZ3JlZW4gPSBfR2V0RFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZtYXNrWzFdKTsNCisgICAgICBibXBfcHRyLT5tYXNrX2JsdWUgPSBfR2V0RFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZtYXNrWzJdKTsNCisgICAgICBpZiAoYm1wX3B0ci0+bWFza19yZWQgJiBibXBfcHRyLT5tYXNrX2dyZWVuIHx8DQorICAgICAgICAgIGJtcF9wdHItPm1hc2tfcmVkICYgYm1wX3B0ci0+bWFza19ibHVlIHx8DQorICAgICAgICAgIGJtcF9wdHItPm1hc2tfZ3JlZW4gJiBibXBfcHRyLT5tYXNrX2JsdWUpIHsNCisgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCaXRmaWVsZCBCbXAgRmlsZSBJcyBDb3JydXB0Iik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgICB9DQorICAgICAgaWYgKGJtcF9wdHItPmJtcF9oZWFkZXJfcHRyLT5iZk9mZkJpdHMgPCAyNiArIGJtcF9wdHItPmltZ19pZmhfc2l6ZSkgew0KKyAgICAgICAgYm1wX3B0ci0+Ym1wX2hlYWRlcl9wdHItPmJmT2ZmQml0cyA9IDI2ICsgYm1wX3B0ci0+aW1nX2lmaF9zaXplOw0KKyAgICAgIH0NCisgICAgICBfYm1wX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGJtcF9wdHIsIEJNUF9EX1NUQVRVU19EQVRBX1BSRSk7DQorICAgICAgcmV0dXJuIDE7DQorICAgIH0gZWxzZSBpZiAoYm1wX3B0ci0+Yml0Q291bnRzID09IDE2KSB7DQorICAgICAgYm1wX3B0ci0+bWFza19yZWQgPSAweDdDMDA7DQorICAgICAgYm1wX3B0ci0+bWFza19ncmVlbiA9IDB4MDNFMDsNCisgICAgICBibXBfcHRyLT5tYXNrX2JsdWUgPSAweDAwMUY7DQorICAgIH0NCisjZWxzZQ0KKyAgICBpZiAoYm1wX3B0ci0+Y29tcHJlc3NfZmxhZyA9PSBCTVBfQklURklFTERTIHx8IGJtcF9wdHItPmJpdENvdW50cyA9PSAxNikgew0KKyAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlVuc3VwcG9ydGVkIEJpdGZpZWxkIEJtcCBGaWxlIik7DQorICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisjZW5kaWYNCisgICAgYm1wX3B0ci0+cGFsX251bSA9IDA7DQorICAgIGlmIChibXBfcHRyLT5iaXRDb3VudHMgPCAxNikgew0KKyAgICAgIGJtcF9wdHItPnBhbF9udW0gPSAxIDw8IGJtcF9wdHItPmJpdENvdW50czsNCisgICAgICBpZiAoYm1wX3B0ci0+Y29sb3JfdXNlZCAhPSAwKSB7DQorICAgICAgICBibXBfcHRyLT5wYWxfbnVtID0gYm1wX3B0ci0+Y29sb3JfdXNlZDsNCisgICAgICB9DQorICAgICAgdWludDhfdCogc3JjX3BhbF9wdHIgPSBOVUxMOw0KKyAgICAgIEZYX0RXT1JEIHNyY19wYWxfc2l6ZSA9IGJtcF9wdHItPnBhbF9udW0gKiAoYm1wX3B0ci0+cGFsX3R5cGUgPyAzIDogNCk7DQorICAgICAgaWYgKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsICh1aW50OF90KiopJnNyY19wYWxfcHRyLCBzcmNfcGFsX3NpemUpID09DQorICAgICAgICAgIE5VTEwpIHsNCisgICAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQorICAgICAgICByZXR1cm4gMjsNCisgICAgICB9DQorICAgICAgaWYgKGJtcF9wdHItPnBhbF9wdHIgIT0gTlVMTCkgew0KKyAgICAgICAgRlhfRnJlZShibXBfcHRyLT5wYWxfcHRyKTsNCisgICAgICAgIGJtcF9wdHItPnBhbF9wdHIgPSBOVUxMOw0KKyAgICAgIH0NCisgICAgICBibXBfcHRyLT5wYWxfcHRyID0gRlhfQWxsb2MoRlhfRFdPUkQsIGJtcF9wdHItPnBhbF9udW0pOw0KKyAgICAgIEJNUF9QVFJfTk9UX05VTEwoYm1wX3B0ci0+cGFsX3B0ciwgYm1wX3B0cik7DQorICAgICAgaW50MzJfdCBzcmNfcGFsX2luZGV4ID0gMDsNCisgICAgICBpZiAoYm1wX3B0ci0+cGFsX3R5cGUgPT0gQk1QX1BBTF9PTEQpIHsNCisgICAgICAgIHdoaWxlIChzcmNfcGFsX2luZGV4IDwgYm1wX3B0ci0+cGFsX251bSkgew0KKyAgICAgICAgICBibXBfcHRyLT5wYWxfcHRyW3NyY19wYWxfaW5kZXgrK10gPSBCTVBfUEFMX0VOQ09ERSgNCisgICAgICAgICAgICAgIDB4MDAsIHNyY19wYWxfcHRyWzJdLCBzcmNfcGFsX3B0clsxXSwgc3JjX3BhbF9wdHJbMF0pOw0KKyAgICAgICAgICBzcmNfcGFsX3B0ciArPSAzOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICB3aGlsZSAoc3JjX3BhbF9pbmRleCA8IGJtcF9wdHItPnBhbF9udW0pIHsNCisgICAgICAgICAgYm1wX3B0ci0+cGFsX3B0cltzcmNfcGFsX2luZGV4KytdID0gQk1QX1BBTF9FTkNPREUoDQorICAgICAgICAgICAgICBzcmNfcGFsX3B0clszXSwgc3JjX3BhbF9wdHJbMl0sIHNyY19wYWxfcHRyWzFdLCBzcmNfcGFsX3B0clswXSk7DQorICAgICAgICAgIHNyY19wYWxfcHRyICs9IDQ7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChibXBfcHRyLT5ibXBfaGVhZGVyX3B0ci0+YmZPZmZCaXRzIDwNCisgICAgICAgIDE0ICsgYm1wX3B0ci0+aW1nX2lmaF9zaXplICsNCisgICAgICAgICAgICBibXBfcHRyLT5wYWxfbnVtICogKGJtcF9wdHItPnBhbF90eXBlID8gMyA6IDQpKSB7DQorICAgICAgYm1wX3B0ci0+Ym1wX2hlYWRlcl9wdHItPmJmT2ZmQml0cyA9DQorICAgICAgICAgIDE0ICsgYm1wX3B0ci0+aW1nX2lmaF9zaXplICsNCisgICAgICAgICAgYm1wX3B0ci0+cGFsX251bSAqIChibXBfcHRyLT5wYWxfdHlwZSA/IDMgOiA0KTsNCisgICAgfQ0KKyAgICBfYm1wX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGJtcF9wdHIsIEJNUF9EX1NUQVRVU19EQVRBX1BSRSk7DQorICB9DQorICByZXR1cm4gMTsNCit9DQoraW50MzJfdCBfYm1wX2RlY29kZV9pbWFnZShibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyKSB7DQorICBpZiAoYm1wX3B0ci0+ZGVjb2RlX3N0YXR1cyA9PSBCTVBfRF9TVEFUVVNfREFUQV9QUkUpIHsNCisgICAgYm1wX3B0ci0+YXZhaWxfaW4gPSAwOw0KKyAgICBpZiAoIWJtcF9wdHItPl9ibXBfZ2V0X2RhdGFfcG9zaXRpb25fZm4oDQorICAgICAgICAgICAgYm1wX3B0ciwgYm1wX3B0ci0+Ym1wX2hlYWRlcl9wdHItPmJmT2ZmQml0cykpIHsNCisgICAgICBibXBfcHRyLT5kZWNvZGVfc3RhdHVzID0gQk1QX0RfU1RBVFVTX1RBSUw7DQorICAgICAgX2JtcF9lcnJvcihibXBfcHRyLCAiVGhlIEJtcCBGaWxlIElzIENvcnJ1cHQsIFVuZXhwZWN0ZWQgU3RyZWFtIE9mZnNldCIpOw0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIGJtcF9wdHItPnJvd19udW0gPSAwOw0KKyAgICBfYm1wX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGJtcF9wdHIsIEJNUF9EX1NUQVRVU19EQVRBKTsNCisgIH0NCisgIGlmIChibXBfcHRyLT5kZWNvZGVfc3RhdHVzID09IEJNUF9EX1NUQVRVU19EQVRBKSB7DQorICAgIHN3aXRjaCAoYm1wX3B0ci0+Y29tcHJlc3NfZmxhZykgew0KKyAgICAgIGNhc2UgQk1QX1JHQjoNCisgICAgICBjYXNlIEJNUF9CSVRGSUVMRFM6DQorICAgICAgICByZXR1cm4gX2JtcF9kZWNvZGVfcmdiKGJtcF9wdHIpOw0KKyAgICAgIGNhc2UgQk1QX1JMRTg6DQorICAgICAgICByZXR1cm4gX2JtcF9kZWNvZGVfcmxlOChibXBfcHRyKTsNCisgICAgICBjYXNlIEJNUF9STEU0Og0KKyAgICAgICAgcmV0dXJuIF9ibXBfZGVjb2RlX3JsZTQoYm1wX3B0cik7DQorICAgIH0NCisgIH0NCisgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIkFueSBVbmNvbnRyb2wgRXJyb3IiKTsNCisgIHJldHVybiAwOw0KK30NCitpbnQzMl90IF9ibXBfZGVjb2RlX3JnYihibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyKSB7DQorICB1aW50OF90KiByb3dfYnVmID0gYm1wX3B0ci0+b3V0X3Jvd19idWZmZXI7DQorICB1aW50OF90KiBkZXNfYnVmID0gTlVMTDsNCisgIHdoaWxlIChibXBfcHRyLT5yb3dfbnVtIDwgYm1wX3B0ci0+aGVpZ2h0KSB7DQorICAgIGlmIChfYm1wX3JlYWRfZGF0YShibXBfcHRyLCAmZGVzX2J1ZiwgYm1wX3B0ci0+c3JjX3Jvd19ieXRlcykgPT0gTlVMTCkgew0KKyAgICAgIHJldHVybiAyOw0KKyAgICB9DQorICAgIF9ibXBfc2F2ZV9kZWNvZGluZ19zdGF0dXMoYm1wX3B0ciwgQk1QX0RfU1RBVFVTX0RBVEEpOw0KKyAgICBzd2l0Y2ggKGJtcF9wdHItPmJpdENvdW50cykgew0KKyAgICAgIGNhc2UgMTogew0KKyAgICAgICAgZm9yIChpbnQzMl90IGNvbCA9IDA7IGNvbCA8IGJtcF9wdHItPndpZHRoOyBjb2wrKykgew0KKyAgICAgICAgICAqcm93X2J1ZisrID0gZGVzX2J1Zltjb2wgPj4gM10gJiAoMHg4MCA+PiAoY29sICUgOCkpID8gMHgwMSA6IDB4MDA7DQorICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIDQ6IHsNCisgICAgICAgIGZvciAoaW50MzJfdCBjb2wgPSAwOyBjb2wgPCBibXBfcHRyLT53aWR0aDsgY29sKyspIHsNCisgICAgICAgICAgKnJvd19idWYrKyA9IChjb2wgJiAweDAxKSA/IChkZXNfYnVmW2NvbCA+PiAxXSAmIDB4MEYpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKGRlc19idWZbY29sID4+IDFdICYgMHhGMCkgPj4gNCk7DQorICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisjaWZkZWYgQk1QX1NVUFBPUlRfQklURklFTEQNCisgICAgICBjYXNlIDE2OiB7DQorICAgICAgICBGWF9XT1JEKiBidWYgPSAoRlhfV09SRCopZGVzX2J1ZjsNCisgICAgICAgIHVpbnQ4X3QgYmx1ZV9iaXRzID0gMDsNCisgICAgICAgIHVpbnQ4X3QgZ3JlZW5fYml0cyA9IDA7DQorICAgICAgICB1aW50OF90IHJlZF9iaXRzID0gMDsNCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDE2OyBpKyspIHsNCisgICAgICAgICAgaWYgKChibXBfcHRyLT5tYXNrX2JsdWUgPj4gaSkgJiAweDAxKSB7DQorICAgICAgICAgICAgYmx1ZV9iaXRzKys7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKChibXBfcHRyLT5tYXNrX2dyZWVuID4+IGkpICYgMHgwMSkgew0KKyAgICAgICAgICAgIGdyZWVuX2JpdHMrKzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoKGJtcF9wdHItPm1hc2tfcmVkID4+IGkpICYgMHgwMSkgew0KKyAgICAgICAgICAgIHJlZF9iaXRzKys7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGdyZWVuX2JpdHMgKz0gYmx1ZV9iaXRzOw0KKyAgICAgICAgcmVkX2JpdHMgKz0gZ3JlZW5fYml0czsNCisgICAgICAgIGJsdWVfYml0cyA9IDggLSBibHVlX2JpdHM7DQorICAgICAgICBncmVlbl9iaXRzIC09IDg7DQorICAgICAgICByZWRfYml0cyAtPSA4Ow0KKyAgICAgICAgZm9yIChpbnQzMl90IGNvbCA9IDA7IGNvbCA8IGJtcF9wdHItPndpZHRoOyBjb2wrKykgew0KKyAgICAgICAgICAqYnVmID0gX0dldFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKWJ1Zik7DQorICAgICAgICAgICpyb3dfYnVmKysgPSAodWludDhfdCkoKCpidWYgJiBibXBfcHRyLT5tYXNrX2JsdWUpIDw8IGJsdWVfYml0cyk7DQorICAgICAgICAgICpyb3dfYnVmKysgPSAodWludDhfdCkoKCpidWYgJiBibXBfcHRyLT5tYXNrX2dyZWVuKSA+PiBncmVlbl9iaXRzKTsNCisgICAgICAgICAgKnJvd19idWYrKyA9ICh1aW50OF90KSgoKmJ1ZisrICYgYm1wX3B0ci0+bWFza19yZWQpID4+IHJlZF9iaXRzKTsNCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyNlbmRpZg0KKyAgICAgIGNhc2UgODoNCisgICAgICBjYXNlIDI0Og0KKyAgICAgIGNhc2UgMzI6DQorICAgICAgICBGWFNZU19tZW1jcHkoYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIsIGRlc19idWYsIGJtcF9wdHItPnNyY19yb3dfYnl0ZXMpOw0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgcm93X2J1ZiA9IGJtcF9wdHItPm91dF9yb3dfYnVmZmVyOw0KKyAgICBibXBfcHRyLT5fYm1wX2dldF9yb3dfZm4oYm1wX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmltZ1RCX2ZsYWcNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJtcF9wdHItPnJvd19udW0rKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGJtcF9wdHItPmhlaWdodCAtIDEgLSBibXBfcHRyLT5yb3dfbnVtKyspLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIpOw0KKyAgfQ0KKyAgX2JtcF9zYXZlX2RlY29kaW5nX3N0YXR1cyhibXBfcHRyLCBCTVBfRF9TVEFUVVNfVEFJTCk7DQorICByZXR1cm4gMTsNCit9DQoraW50MzJfdCBfYm1wX2RlY29kZV9ybGU4KGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIpIHsNCisgIHVpbnQ4X3QqIGZpcnN0X2J5dGVfcHRyID0gTlVMTDsNCisgIHVpbnQ4X3QqIHNlY29uZF9ieXRlX3B0ciA9IE5VTEw7DQorICBibXBfcHRyLT5jb2xfbnVtID0gMDsNCisgIHdoaWxlIChUUlVFKSB7DQorICAgIEZYX0RXT1JEIHNraXBfc2l6ZV9vcmcgPSBibXBfcHRyLT5za2lwX3NpemU7DQorICAgIGlmIChfYm1wX3JlYWRfZGF0YShibXBfcHRyLCAmZmlyc3RfYnl0ZV9wdHIsIDEpID09IE5VTEwpIHsNCisgICAgICByZXR1cm4gMjsNCisgICAgfQ0KKyAgICBzd2l0Y2ggKCpmaXJzdF9ieXRlX3B0cikgew0KKyAgICAgIGNhc2UgUkxFX01BUktFUjogew0KKyAgICAgICAgaWYgKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsICZmaXJzdF9ieXRlX3B0ciwgMSkgPT0gTlVMTCkgew0KKyAgICAgICAgICBibXBfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgIH0NCisgICAgICAgIHN3aXRjaCAoKmZpcnN0X2J5dGVfcHRyKSB7DQorICAgICAgICAgIGNhc2UgUkxFX0VPTDogew0KKyAgICAgICAgICAgIGlmIChibXBfcHRyLT5yb3dfbnVtID49IGJtcF9wdHItPmhlaWdodCkgew0KKyAgICAgICAgICAgICAgX2JtcF9zYXZlX2RlY29kaW5nX3N0YXR1cyhibXBfcHRyLCBCTVBfRF9TVEFUVVNfVEFJTCk7DQorICAgICAgICAgICAgICBfYm1wX2Vycm9yKGJtcF9wdHIsICJUaGUgQm1wIEZpbGUgSXMgQ29ycnVwdCIpOw0KKyAgICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJtcF9wdHItPl9ibXBfZ2V0X3Jvd19mbigNCisgICAgICAgICAgICAgICAgYm1wX3B0ciwgYm1wX3B0ci0+aW1nVEJfZmxhZw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibXBfcHRyLT5yb3dfbnVtKysNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGJtcF9wdHItPmhlaWdodCAtIDEgLSBibXBfcHRyLT5yb3dfbnVtKyspLA0KKyAgICAgICAgICAgICAgICBibXBfcHRyLT5vdXRfcm93X2J1ZmZlcik7DQorICAgICAgICAgICAgYm1wX3B0ci0+Y29sX251bSA9IDA7DQorICAgICAgICAgICAgRlhTWVNfbWVtc2V0KGJtcF9wdHItPm91dF9yb3dfYnVmZmVyLCAwLCBibXBfcHRyLT5vdXRfcm93X2J5dGVzKTsNCisgICAgICAgICAgICBfYm1wX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGJtcF9wdHIsIEJNUF9EX1NUQVRVU19EQVRBKTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjYXNlIFJMRV9FT0k6IHsNCisgICAgICAgICAgICBpZiAoYm1wX3B0ci0+cm93X251bSA8IGJtcF9wdHItPmhlaWdodCkgew0KKyAgICAgICAgICAgICAgYm1wX3B0ci0+X2JtcF9nZXRfcm93X2ZuKA0KKyAgICAgICAgICAgICAgICAgIGJtcF9wdHIsIGJtcF9wdHItPmltZ1RCX2ZsYWcNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibXBfcHRyLT5yb3dfbnVtKysNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoYm1wX3B0ci0+aGVpZ2h0IC0gMSAtIGJtcF9wdHItPnJvd19udW0rKyksDQorICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBfYm1wX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGJtcF9wdHIsIEJNUF9EX1NUQVRVU19UQUlMKTsNCisgICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjYXNlIFJMRV9ERUxUQTogew0KKyAgICAgICAgICAgIHVpbnQ4X3QqIGRlbHRhX3B0cjsNCisgICAgICAgICAgICBpZiAoX2JtcF9yZWFkX2RhdGEoYm1wX3B0ciwgJmRlbHRhX3B0ciwgMikgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgYm1wX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBibXBfcHRyLT5jb2xfbnVtICs9IChpbnQzMl90KWRlbHRhX3B0clswXTsNCisgICAgICAgICAgICBpbnQzMl90IGJtcF9yb3dfbnVtX25leHQgPSBibXBfcHRyLT5yb3dfbnVtICsgKGludDMyX3QpZGVsdGFfcHRyWzFdOw0KKyAgICAgICAgICAgIGlmIChibXBfcHRyLT5jb2xfbnVtID49IGJtcF9wdHItPm91dF9yb3dfYnl0ZXMgfHwNCisgICAgICAgICAgICAgICAgYm1wX3Jvd19udW1fbmV4dCA+PSBibXBfcHRyLT5oZWlnaHQpIHsNCisgICAgICAgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCbXAgRmlsZSBJcyBDb3JydXB0IE9yIE5vdCBTdXBwb3J0ZWQiKTsNCisgICAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB3aGlsZSAoYm1wX3B0ci0+cm93X251bSA8IGJtcF9yb3dfbnVtX25leHQpIHsNCisgICAgICAgICAgICAgIEZYU1lTX21lbXNldChibXBfcHRyLT5vdXRfcm93X2J1ZmZlciwgMCwgYm1wX3B0ci0+b3V0X3Jvd19ieXRlcyk7DQorICAgICAgICAgICAgICBibXBfcHRyLT5fYm1wX2dldF9yb3dfZm4oDQorICAgICAgICAgICAgICAgICAgYm1wX3B0ciwgYm1wX3B0ci0+aW1nVEJfZmxhZw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJtcF9wdHItPnJvd19udW0rKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChibXBfcHRyLT5oZWlnaHQgLSAxIC0gYm1wX3B0ci0+cm93X251bSsrKSwNCisgICAgICAgICAgICAgICAgICBibXBfcHRyLT5vdXRfcm93X2J1ZmZlcik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgaWYgKChpbnQzMl90KSgqZmlyc3RfYnl0ZV9wdHIpID4NCisgICAgICAgICAgICAgICAgYm1wX3B0ci0+c3JjX3Jvd19ieXRlcyAtIGJtcF9wdHItPmNvbF9udW0pIHsNCisgICAgICAgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCbXAgRmlsZSBJcyBDb3JydXB0Iik7DQorICAgICAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsICZzZWNvbmRfYnl0ZV9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmaXJzdF9ieXRlX3B0ciAmIDEgPyAqZmlyc3RfYnl0ZV9wdHIgKyAxDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAqZmlyc3RfYnl0ZV9wdHIpID09IE5VTEwpIHsNCisgICAgICAgICAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQorICAgICAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhTWVNfbWVtY3B5KGJtcF9wdHItPm91dF9yb3dfYnVmZmVyICsgYm1wX3B0ci0+Y29sX251bSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kX2J5dGVfcHRyLCAqZmlyc3RfYnl0ZV9wdHIpOw0KKyAgICAgICAgICAgIGJtcF9wdHItPmNvbF9udW0gKz0gKGludDMyX3QpKCpmaXJzdF9ieXRlX3B0cik7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgIGlmIChfYm1wX3JlYWRfZGF0YShibXBfcHRyLCAmc2Vjb25kX2J5dGVfcHRyLCAxKSA9PSBOVUxMKSB7DQorICAgICAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQorICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKChpbnQzMl90KSgqZmlyc3RfYnl0ZV9wdHIpID4NCisgICAgICAgICAgICBibXBfcHRyLT5zcmNfcm93X2J5dGVzIC0gYm1wX3B0ci0+Y29sX251bSkgew0KKyAgICAgICAgICBfYm1wX2Vycm9yKGJtcF9wdHIsICJUaGUgQm1wIEZpbGUgSXMgQ29ycnVwdCIpOw0KKyAgICAgICAgICByZXR1cm4gMDsNCisgICAgICAgIH0NCisgICAgICAgIEZYU1lTX21lbXNldChibXBfcHRyLT5vdXRfcm93X2J1ZmZlciArIGJtcF9wdHItPmNvbF9udW0sDQorICAgICAgICAgICAgICAgICAgICAgKnNlY29uZF9ieXRlX3B0ciwgKmZpcnN0X2J5dGVfcHRyKTsNCisgICAgICAgIGJtcF9wdHItPmNvbF9udW0gKz0gKGludDMyX3QpKCpmaXJzdF9ieXRlX3B0cik7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBfYm1wX2Vycm9yKGJtcF9wdHIsICJBbnkgVW5jb250cm9sIEVycm9yIik7DQorICByZXR1cm4gMDsNCit9DQoraW50MzJfdCBfYm1wX2RlY29kZV9ybGU0KGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIpIHsNCisgIHVpbnQ4X3QqIGZpcnN0X2J5dGVfcHRyID0gTlVMTDsNCisgIHVpbnQ4X3QqIHNlY29uZF9ieXRlX3B0ciA9IE5VTEw7DQorICBibXBfcHRyLT5jb2xfbnVtID0gMDsNCisgIHdoaWxlIChUUlVFKSB7DQorICAgIEZYX0RXT1JEIHNraXBfc2l6ZV9vcmcgPSBibXBfcHRyLT5za2lwX3NpemU7DQorICAgIGlmIChfYm1wX3JlYWRfZGF0YShibXBfcHRyLCAmZmlyc3RfYnl0ZV9wdHIsIDEpID09IE5VTEwpIHsNCisgICAgICByZXR1cm4gMjsNCisgICAgfQ0KKyAgICBzd2l0Y2ggKCpmaXJzdF9ieXRlX3B0cikgew0KKyAgICAgIGNhc2UgUkxFX01BUktFUjogew0KKyAgICAgICAgaWYgKF9ibXBfcmVhZF9kYXRhKGJtcF9wdHIsICZmaXJzdF9ieXRlX3B0ciwgMSkgPT0gTlVMTCkgew0KKyAgICAgICAgICBibXBfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgIH0NCisgICAgICAgIHN3aXRjaCAoKmZpcnN0X2J5dGVfcHRyKSB7DQorICAgICAgICAgIGNhc2UgUkxFX0VPTDogew0KKyAgICAgICAgICAgIGlmIChibXBfcHRyLT5yb3dfbnVtID49IGJtcF9wdHItPmhlaWdodCkgew0KKyAgICAgICAgICAgICAgX2JtcF9zYXZlX2RlY29kaW5nX3N0YXR1cyhibXBfcHRyLCBCTVBfRF9TVEFUVVNfVEFJTCk7DQorICAgICAgICAgICAgICBfYm1wX2Vycm9yKGJtcF9wdHIsICJUaGUgQm1wIEZpbGUgSXMgQ29ycnVwdCIpOw0KKyAgICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJtcF9wdHItPl9ibXBfZ2V0X3Jvd19mbigNCisgICAgICAgICAgICAgICAgYm1wX3B0ciwgYm1wX3B0ci0+aW1nVEJfZmxhZw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibXBfcHRyLT5yb3dfbnVtKysNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGJtcF9wdHItPmhlaWdodCAtIDEgLSBibXBfcHRyLT5yb3dfbnVtKyspLA0KKyAgICAgICAgICAgICAgICBibXBfcHRyLT5vdXRfcm93X2J1ZmZlcik7DQorICAgICAgICAgICAgYm1wX3B0ci0+Y29sX251bSA9IDA7DQorICAgICAgICAgICAgRlhTWVNfbWVtc2V0KGJtcF9wdHItPm91dF9yb3dfYnVmZmVyLCAwLCBibXBfcHRyLT5vdXRfcm93X2J5dGVzKTsNCisgICAgICAgICAgICBfYm1wX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGJtcF9wdHIsIEJNUF9EX1NUQVRVU19EQVRBKTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjYXNlIFJMRV9FT0k6IHsNCisgICAgICAgICAgICBpZiAoYm1wX3B0ci0+cm93X251bSA8IGJtcF9wdHItPmhlaWdodCkgew0KKyAgICAgICAgICAgICAgYm1wX3B0ci0+X2JtcF9nZXRfcm93X2ZuKA0KKyAgICAgICAgICAgICAgICAgIGJtcF9wdHIsIGJtcF9wdHItPmltZ1RCX2ZsYWcNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibXBfcHRyLT5yb3dfbnVtKysNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoYm1wX3B0ci0+aGVpZ2h0IC0gMSAtIGJtcF9wdHItPnJvd19udW0rKyksDQorICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBfYm1wX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGJtcF9wdHIsIEJNUF9EX1NUQVRVU19UQUlMKTsNCisgICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjYXNlIFJMRV9ERUxUQTogew0KKyAgICAgICAgICAgIHVpbnQ4X3QqIGRlbHRhX3B0cjsNCisgICAgICAgICAgICBpZiAoX2JtcF9yZWFkX2RhdGEoYm1wX3B0ciwgJmRlbHRhX3B0ciwgMikgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgYm1wX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBibXBfcHRyLT5jb2xfbnVtICs9IChpbnQzMl90KWRlbHRhX3B0clswXTsNCisgICAgICAgICAgICBpbnQzMl90IGJtcF9yb3dfbnVtX25leHQgPSBibXBfcHRyLT5yb3dfbnVtICsgKGludDMyX3QpZGVsdGFfcHRyWzFdOw0KKyAgICAgICAgICAgIGlmIChibXBfcHRyLT5jb2xfbnVtID49IGJtcF9wdHItPm91dF9yb3dfYnl0ZXMgfHwNCisgICAgICAgICAgICAgICAgYm1wX3Jvd19udW1fbmV4dCA+PSBibXBfcHRyLT5oZWlnaHQpIHsNCisgICAgICAgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCbXAgRmlsZSBJcyBDb3JydXB0IE9yIE5vdCBTdXBwb3J0ZWQiKTsNCisgICAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB3aGlsZSAoYm1wX3B0ci0+cm93X251bSA8IGJtcF9yb3dfbnVtX25leHQpIHsNCisgICAgICAgICAgICAgIEZYU1lTX21lbXNldChibXBfcHRyLT5vdXRfcm93X2J1ZmZlciwgMCwgYm1wX3B0ci0+b3V0X3Jvd19ieXRlcyk7DQorICAgICAgICAgICAgICBibXBfcHRyLT5fYm1wX2dldF9yb3dfZm4oDQorICAgICAgICAgICAgICAgICAgYm1wX3B0ciwgYm1wX3B0ci0+aW1nVEJfZmxhZw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJtcF9wdHItPnJvd19udW0rKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChibXBfcHRyLT5oZWlnaHQgLSAxIC0gYm1wX3B0ci0+cm93X251bSsrKSwNCisgICAgICAgICAgICAgICAgICBibXBfcHRyLT5vdXRfcm93X2J1ZmZlcik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgdWludDhfdCBzaXplID0gKHVpbnQ4X3QpKCgoRlhfV09SRCkoKmZpcnN0X2J5dGVfcHRyKSArIDEpID4+IDEpOw0KKyAgICAgICAgICAgIGlmICgoaW50MzJfdCkqZmlyc3RfYnl0ZV9wdHIgPj0NCisgICAgICAgICAgICAgICAgYm1wX3B0ci0+b3V0X3Jvd19ieXRlcyAtIGJtcF9wdHItPmNvbF9udW0pIHsNCisgICAgICAgICAgICAgIGlmIChzaXplICsgKGJtcF9wdHItPmNvbF9udW0gPj4gMSkgPiBibXBfcHRyLT5zcmNfcm93X2J5dGVzKSB7DQorICAgICAgICAgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCbXAgRmlsZSBJcyBDb3JydXB0Iik7DQorICAgICAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgKmZpcnN0X2J5dGVfcHRyID0gYm1wX3B0ci0+b3V0X3Jvd19ieXRlcyAtIGJtcF9wdHItPmNvbF9udW0gLSAxOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoX2JtcF9yZWFkX2RhdGEoYm1wX3B0ciwgJnNlY29uZF9ieXRlX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAmIDEgPyBzaXplICsgMSA6IHNpemUpID09IE5VTEwpIHsNCisgICAgICAgICAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQorICAgICAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgKmZpcnN0X2J5dGVfcHRyOyBpKyspIHsNCisgICAgICAgICAgICAgIGlmIChpICYgMHgwMSkgew0KKyAgICAgICAgICAgICAgICAqKGJtcF9wdHItPm91dF9yb3dfYnVmZmVyICsgYm1wX3B0ci0+Y29sX251bSsrKSA9DQorICAgICAgICAgICAgICAgICAgICAoKnNlY29uZF9ieXRlX3B0cisrICYgMHgwRik7DQorICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAqKGJtcF9wdHItPm91dF9yb3dfYnVmZmVyICsgYm1wX3B0ci0+Y29sX251bSsrKSA9DQorICAgICAgICAgICAgICAgICAgICAoKCpzZWNvbmRfYnl0ZV9wdHIgJiAweEYwKSA+PiA0KTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgIGlmIChfYm1wX3JlYWRfZGF0YShibXBfcHRyLCAmc2Vjb25kX2J5dGVfcHRyLCAxKSA9PSBOVUxMKSB7DQorICAgICAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQorICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKChpbnQzMl90KSpmaXJzdF9ieXRlX3B0ciA+DQorICAgICAgICAgICAgYm1wX3B0ci0+b3V0X3Jvd19ieXRlcyAtIGJtcF9wdHItPmNvbF9udW0pIHsNCisgICAgICAgICAgdWludDhfdCBzaXplID0gKHVpbnQ4X3QpKCgoRlhfV09SRCkoKmZpcnN0X2J5dGVfcHRyKSArIDEpID4+IDEpOw0KKyAgICAgICAgICBpZiAoc2l6ZSArIChibXBfcHRyLT5jb2xfbnVtID4+IDEpID4gYm1wX3B0ci0+c3JjX3Jvd19ieXRlcykgew0KKyAgICAgICAgICAgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCbXAgRmlsZSBJcyBDb3JydXB0Iik7DQorICAgICAgICAgICAgcmV0dXJuIDA7DQorICAgICAgICAgIH0NCisgICAgICAgICAgKmZpcnN0X2J5dGVfcHRyID0gYm1wX3B0ci0+b3V0X3Jvd19ieXRlcyAtIGJtcF9wdHItPmNvbF9udW0gLSAxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgKmZpcnN0X2J5dGVfcHRyOyBpKyspIHsNCisgICAgICAgICAgaWYgKGkgJiAweDAxKSB7DQorICAgICAgICAgICAgKihibXBfcHRyLT5vdXRfcm93X2J1ZmZlciArIGJtcF9wdHItPmNvbF9udW0rKykgPQ0KKyAgICAgICAgICAgICAgICAoKnNlY29uZF9ieXRlX3B0ciAmIDB4MEYpOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICooYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIgKyBibXBfcHRyLT5jb2xfbnVtKyspID0NCisgICAgICAgICAgICAgICAgKCgqc2Vjb25kX2J5dGVfcHRyICYgMHhGMCkgPj4gNCk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIF9ibXBfZXJyb3IoYm1wX3B0ciwgIkFueSBVbmNvbnRyb2wgRXJyb3IiKTsNCisgIHJldHVybiAwOw0KK30NCit1aW50OF90KiBfYm1wX3JlYWRfZGF0YShibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBkZXNfYnVmX3BwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRhdGFfc2l6ZSkgew0KKyAgaWYgKGJtcF9wdHIgPT0gTlVMTCB8fCBibXBfcHRyLT5hdmFpbF9pbiA8IGJtcF9wdHItPnNraXBfc2l6ZSArIGRhdGFfc2l6ZSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgICpkZXNfYnVmX3BwID0gYm1wX3B0ci0+bmV4dF9pbiArIGJtcF9wdHItPnNraXBfc2l6ZTsNCisgIGJtcF9wdHItPnNraXBfc2l6ZSArPSBkYXRhX3NpemU7DQorICByZXR1cm4gKmRlc19idWZfcHA7DQorfQ0KK3ZvaWQgX2JtcF9zYXZlX2RlY29kaW5nX3N0YXR1cyhibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXR1cykgew0KKyAgYm1wX3B0ci0+ZGVjb2RlX3N0YXR1cyA9IHN0YXR1czsNCisgIGJtcF9wdHItPm5leHRfaW4gKz0gYm1wX3B0ci0+c2tpcF9zaXplOw0KKyAgYm1wX3B0ci0+YXZhaWxfaW4gLT0gYm1wX3B0ci0+c2tpcF9zaXplOw0KKyAgYm1wX3B0ci0+c2tpcF9zaXplID0gMDsNCit9DQordm9pZCBfYm1wX2lucHV0X2J1ZmZlcihibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogc3JjX2J1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNyY19zaXplKSB7DQorICBibXBfcHRyLT5uZXh0X2luID0gc3JjX2J1ZjsNCisgIGJtcF9wdHItPmF2YWlsX2luID0gc3JjX3NpemU7DQorICBibXBfcHRyLT5za2lwX3NpemUgPSAwOw0KK30NCitGWF9EV09SRCBfYm1wX2dldF9hdmFpbF9pbnB1dChibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBhdmlhbF9idWZfcHRyKSB7DQorICBpZiAoYXZpYWxfYnVmX3B0ciAhPSBOVUxMKSB7DQorICAgICphdmlhbF9idWZfcHRyID0gTlVMTDsNCisgICAgaWYgKGJtcF9wdHItPmF2YWlsX2luID4gMCkgew0KKyAgICAgICphdmlhbF9idWZfcHRyID0gYm1wX3B0ci0+bmV4dF9pbjsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGJtcF9wdHItPmF2YWlsX2luOw0KK30NCitibXBfY29tcHJlc3Nfc3RydWN0X3AgX2JtcF9jcmVhdGVfY29tcHJlc3MoKSB7DQorICBibXBfY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0cjsNCisgIGJtcF9wdHIgPSBGWF9BbGxvYyhibXBfY29tcHJlc3Nfc3RydWN0LCAxKTsNCisgIGlmIChibXBfcHRyKSB7DQorICAgIEZYU1lTX21lbXNldChibXBfcHRyLCAwLCBzaXplb2YoYm1wX2NvbXByZXNzX3N0cnVjdCkpOw0KKyAgfQ0KKyAgcmV0dXJuIGJtcF9wdHI7DQorfQ0KK3ZvaWQgX2JtcF9kZXN0cm95X2NvbXByZXNzKGJtcF9jb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyKSB7DQorICBpZiAoYm1wX3B0cikgew0KKyAgICBpZiAoYm1wX3B0ci0+c3JjX2ZyZWUgJiYgYm1wX3B0ci0+c3JjX2J1Zikgew0KKyAgICAgIEZYX0ZyZWUoYm1wX3B0ci0+c3JjX2J1Zik7DQorICAgIH0NCisgICAgRlhfRnJlZShibXBfcHRyKTsNCisgIH0NCit9DQorc3RhdGljIHZvaWQgV3JpdGVGaWxlSGVhZGVyKEJtcEZpbGVIZWFkZXJQdHIgaGVhZF9wdHIsIHVpbnQ4X3QqIGRzdF9idWYpIHsNCisgIEZYX0RXT1JEIG9mZnNldDsNCisgIG9mZnNldCA9IDA7DQorICBfU2V0V29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCBoZWFkX3B0ci0+YmZUeXBlKTsNCisgIG9mZnNldCArPSAyOw0KKyAgX1NldERXb3JkX0xTQkZpcnN0KCZkc3RfYnVmW29mZnNldF0sIGhlYWRfcHRyLT5iZlNpemUpOw0KKyAgb2Zmc2V0ICs9IDQ7DQorICBfU2V0V29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCBoZWFkX3B0ci0+YmZSZXNlcnZlZDEpOw0KKyAgb2Zmc2V0ICs9IDI7DQorICBfU2V0V29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCBoZWFkX3B0ci0+YmZSZXNlcnZlZDIpOw0KKyAgb2Zmc2V0ICs9IDI7DQorICBfU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaGVhZF9wdHItPmJmT2ZmQml0cyk7DQorICBvZmZzZXQgKz0gNDsNCit9DQorc3RhdGljIHZvaWQgV3JpdGVJbmZvSGVhZGVyKEJtcEluZm9IZWFkZXJQdHIgaW5mb19oZWFkX3B0ciwgdWludDhfdCogZHN0X2J1Zikgew0KKyAgRlhfRFdPUkQgb2Zmc2V0Ow0KKyAgb2Zmc2V0ID0gc2l6ZW9mKEJtcEZpbGVIZWFkZXIpOw0KKyAgX1NldERXb3JkX0xTQkZpcnN0KCZkc3RfYnVmW29mZnNldF0sIGluZm9faGVhZF9wdHItPmJpU2l6ZSk7DQorICBvZmZzZXQgKz0gNDsNCisgIF9TZXREV29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCAoRlhfRFdPUkQpaW5mb19oZWFkX3B0ci0+YmlXaWR0aCk7DQorICBvZmZzZXQgKz0gNDsNCisgIF9TZXREV29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCAoRlhfRFdPUkQpaW5mb19oZWFkX3B0ci0+YmlIZWlnaHQpOw0KKyAgb2Zmc2V0ICs9IDQ7DQorICBfU2V0V29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCBpbmZvX2hlYWRfcHRyLT5iaVBsYW5lcyk7DQorICBvZmZzZXQgKz0gMjsNCisgIF9TZXRXb3JkX0xTQkZpcnN0KCZkc3RfYnVmW29mZnNldF0sIGluZm9faGVhZF9wdHItPmJpQml0Q291bnQpOw0KKyAgb2Zmc2V0ICs9IDI7DQorICBfU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaW5mb19oZWFkX3B0ci0+YmlDb21wcmVzc2lvbik7DQorICBvZmZzZXQgKz0gNDsNCisgIF9TZXREV29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCBpbmZvX2hlYWRfcHRyLT5iaVNpemVJbWFnZSk7DQorICBvZmZzZXQgKz0gNDsNCisgIF9TZXREV29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLA0KKyAgICAgICAgICAgICAgICAgICAgIChGWF9EV09SRClpbmZvX2hlYWRfcHRyLT5iaVhQZWxzUGVyTWV0ZXIpOw0KKyAgb2Zmc2V0ICs9IDQ7DQorICBfU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwNCisgICAgICAgICAgICAgICAgICAgICAoRlhfRFdPUkQpaW5mb19oZWFkX3B0ci0+YmlZUGVsc1Blck1ldGVyKTsNCisgIG9mZnNldCArPSA0Ow0KKyAgX1NldERXb3JkX0xTQkZpcnN0KCZkc3RfYnVmW29mZnNldF0sIGluZm9faGVhZF9wdHItPmJpQ2xyVXNlZCk7DQorICBvZmZzZXQgKz0gNDsNCisgIF9TZXREV29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCBpbmZvX2hlYWRfcHRyLT5iaUNsckltcG9ydGFudCk7DQorICBvZmZzZXQgKz0gNDsNCit9DQorI2lmZGVmIEJNUF9TVVBQT1JUX0JJVEZJRUxEDQorc3RhdGljIHZvaWQgX2JtcF9lbmNvZGVfYml0ZmllbGRzKGJtcF9jb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZHN0X2J1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRzdF9zaXplKSB7DQorICBpZiAoYm1wX3B0ci0+aW5mb19oZWFkZXIuYmlCaXRDb3VudCAhPSAxNiAmJg0KKyAgICAgIGJtcF9wdHItPmluZm9faGVhZGVyLmJpQml0Q291bnQgIT0gMzIpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfRFdPUkQgc2l6ZSwgZHN0X3BvcywgaTsNCisgIHNpemUgPSBibXBfcHRyLT5zcmNfcGl0Y2ggKiBibXBfcHRyLT5zcmNfcm93ICoNCisgICAgICAgICBibXBfcHRyLT5pbmZvX2hlYWRlci5iaUJpdENvdW50IC8gMTY7DQorICBkc3RfcG9zID0gYm1wX3B0ci0+ZmlsZV9oZWFkZXIuYmZPZmZCaXRzOw0KKyAgZHN0X3NpemUgKz0gc2l6ZTsNCisgIGRzdF9idWYgPSBGWF9SZWFsbG9jKHVpbnQ4X3QsIGRzdF9idWYsIGRzdF9zaXplKTsNCisgIGlmIChkc3RfYnVmID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhTWVNfbWVtc2V0KCZkc3RfYnVmW2RzdF9wb3NdLCAwLCBzaXplKTsNCisgIEZYX0RXT1JEIG1hc2tfcmVkOw0KKyAgRlhfRFdPUkQgbWFza19ncmVlbjsNCisgIEZYX0RXT1JEIG1hc2tfYmx1ZTsNCisgIG1hc2tfcmVkID0gMHg3QzAwOw0KKyAgbWFza19ncmVlbiA9IDB4MDNFMDsNCisgIG1hc2tfYmx1ZSA9IDB4MDAxRjsNCisgIGlmIChibXBfcHRyLT5pbmZvX2hlYWRlci5iaUNvbXByZXNzaW9uID09IEJNUF9CSVRGSUVMRFMpIHsNCisgICAgaWYgKGJtcF9wdHItPmJpdF90eXBlID09IEJNUF9CSVRfNTY1KSB7DQorICAgICAgbWFza19yZWQgPSAweEY4MDA7DQorICAgICAgbWFza19ncmVlbiA9IDB4MDdFMDsNCisgICAgICBtYXNrX2JsdWUgPSAweDAwMUY7DQorICAgIH0NCisgICAgaWYgKGJtcF9wdHItPmluZm9faGVhZGVyLmJpQml0Q291bnQgPT0gMzIpIHsNCisgICAgICBtYXNrX3JlZCA9IDB4RkYwMDAwOw0KKyAgICAgIG1hc2tfZ3JlZW4gPSAweDAwRkYwMDsNCisgICAgICBtYXNrX2JsdWUgPSAweDAwMDBGRjsNCisgICAgfQ0KKyAgICBfU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbZHN0X3Bvc10sIG1hc2tfcmVkKTsNCisgICAgZHN0X3BvcyArPSA0Ow0KKyAgICBfU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbZHN0X3Bvc10sIG1hc2tfZ3JlZW4pOw0KKyAgICBkc3RfcG9zICs9IDQ7DQorICAgIF9TZXREV29yZF9MU0JGaXJzdCgmZHN0X2J1Zltkc3RfcG9zXSwgbWFza19ibHVlKTsNCisgICAgZHN0X3BvcyArPSA0Ow0KKyAgICBibXBfcHRyLT5maWxlX2hlYWRlci5iZk9mZkJpdHMgPSBkc3RfcG9zOw0KKyAgfQ0KKyAgdWludDhfdCBibHVlX2JpdHMgPSAwOw0KKyAgdWludDhfdCBncmVlbl9iaXRzID0gMDsNCisgIHVpbnQ4X3QgcmVkX2JpdHMgPSAwOw0KKyAgZm9yIChpID0gMDsgaSA8IGJtcF9wdHItPmluZm9faGVhZGVyLmJpQml0Q291bnQ7IGkrKykgew0KKyAgICBpZiAoKG1hc2tfYmx1ZSA+PiBpKSAmIDB4MDEpIHsNCisgICAgICBibHVlX2JpdHMrKzsNCisgICAgfQ0KKyAgICBpZiAoKG1hc2tfZ3JlZW4gPj4gaSkgJiAweDAxKSB7DQorICAgICAgZ3JlZW5fYml0cysrOw0KKyAgICB9DQorICAgIGlmICgobWFza19yZWQgPj4gaSkgJiAweDAxKSB7DQorICAgICAgcmVkX2JpdHMrKzsNCisgICAgfQ0KKyAgfQ0KKyAgZ3JlZW5fYml0cyArPSBibHVlX2JpdHM7DQorICByZWRfYml0cyArPSBncmVlbl9iaXRzOw0KKyAgYmx1ZV9iaXRzID0gOCAtIGJsdWVfYml0czsNCisgIGdyZWVuX2JpdHMgLT0gODsNCisgIHJlZF9iaXRzIC09IDg7DQorICBpID0gMDsNCisgIGZvciAoaW50MzJfdCByb3dfbnVtID0gYm1wX3B0ci0+c3JjX3JvdyAtIDE7IHJvd19udW0gPiAtMTsgcm93X251bS0tLCBpID0gMCkgew0KKyAgICB3aGlsZSAoaSA8IGJtcF9wdHItPnNyY193aWR0aCAqIGJtcF9wdHItPnNyY19icHAgLyA4KSB7DQorICAgICAgdWludDhfdCBiID0gYm1wX3B0ci0+c3JjX2J1Zltyb3dfbnVtICogYm1wX3B0ci0+c3JjX3BpdGNoICsgaSsrXTsNCisgICAgICB1aW50OF90IGcgPSBibXBfcHRyLT5zcmNfYnVmW3Jvd19udW0gKiBibXBfcHRyLT5zcmNfcGl0Y2ggKyBpKytdOw0KKyAgICAgIHVpbnQ4X3QgciA9IGJtcF9wdHItPnNyY19idWZbcm93X251bSAqIGJtcF9wdHItPnNyY19waXRjaCArIGkrK107DQorICAgICAgaWYgKGJtcF9wdHItPnNyY19icHAgPT0gMzIpIHsNCisgICAgICAgIGkrKzsNCisgICAgICB9DQorICAgICAgRlhfRFdPUkQgcGl4X3ZhbCA9IDA7DQorICAgICAgcGl4X3ZhbCB8PSAoYiA+PiBibHVlX2JpdHMpICYgbWFza19ibHVlOw0KKyAgICAgIHBpeF92YWwgfD0gKGcgPDwgZ3JlZW5fYml0cykgJiBtYXNrX2dyZWVuOw0KKyAgICAgIHBpeF92YWwgfD0gKHIgPDwgcmVkX2JpdHMpICYgbWFza19yZWQ7DQorICAgICAgaWYgKGJtcF9wdHItPmluZm9faGVhZGVyLmJpQml0Q291bnQgPT0gMTYpIHsNCisgICAgICAgIF9TZXRXb3JkX0xTQkZpcnN0KCZkc3RfYnVmW2RzdF9wb3NdLCAoRlhfV09SRClwaXhfdmFsKTsNCisgICAgICAgIGRzdF9wb3MgKz0gMjsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgX1NldERXb3JkX0xTQkZpcnN0KCZkc3RfYnVmW2RzdF9wb3NdLCBwaXhfdmFsKTsNCisgICAgICAgIGRzdF9wb3MgKz0gNDsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGRzdF9zaXplID0gZHN0X3BvczsNCit9DQorI2VuZGlmDQorc3RhdGljIHZvaWQgX2JtcF9lbmNvZGVfcmdiKGJtcF9jb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZHN0X2J1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRzdF9zaXplKSB7DQorICBpZiAoYm1wX3B0ci0+aW5mb19oZWFkZXIuYmlCaXRDb3VudCA9PSAxNikgew0KKyNpZmRlZiBCTVBfU1VQUE9SVF9CSVRGSUVMRA0KKyAgICBfYm1wX2VuY29kZV9iaXRmaWVsZHMoYm1wX3B0ciwgZHN0X2J1ZiwgZHN0X3NpemUpOw0KKyNlbmRpZg0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9EV09SRCBzaXplLCBkc3RfcG9zOw0KKyAgRlhfRFdPUkQgZHN0X3BpdGNoID0NCisgICAgICAoYm1wX3B0ci0+c3JjX3dpZHRoICogYm1wX3B0ci0+aW5mb19oZWFkZXIuYmlCaXRDb3VudCArIDMxKSAvIDMyICogNDsNCisgIHNpemUgPSBkc3RfcGl0Y2ggKiBibXBfcHRyLT5zcmNfcm93Ow0KKyAgZHN0X3BvcyA9IGJtcF9wdHItPmZpbGVfaGVhZGVyLmJmT2ZmQml0czsNCisgIGRzdF9zaXplICs9IHNpemU7DQorICBkc3RfYnVmID0gRlhfUmVhbGxvYyh1aW50OF90LCBkc3RfYnVmLCBkc3Rfc2l6ZSk7DQorICBpZiAoZHN0X2J1ZiA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYU1lTX21lbXNldCgmZHN0X2J1Zltkc3RfcG9zXSwgMCwgc2l6ZSk7DQorICBmb3IgKGludDMyX3Qgcm93X251bSA9IGJtcF9wdHItPnNyY19yb3cgLSAxOyByb3dfbnVtID4gLTE7IHJvd19udW0tLSkgew0KKyAgICBGWFNZU19tZW1jcHkoJmRzdF9idWZbZHN0X3Bvc10sDQorICAgICAgICAgICAgICAgICAmYm1wX3B0ci0+c3JjX2J1Zltyb3dfbnVtICogYm1wX3B0ci0+c3JjX3BpdGNoXSwNCisgICAgICAgICAgICAgICAgIGJtcF9wdHItPnNyY19waXRjaCk7DQorICAgIGRzdF9wb3MgKz0gZHN0X3BpdGNoOw0KKyAgfQ0KKyAgZHN0X3NpemUgPSBkc3RfcG9zOw0KK30NCitzdGF0aWMgdWludDhfdCBfYm1wX3JsZThfc2VhcmNoKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgaW50MzJfdCBsZW4pIHsNCisgIHVpbnQ4X3QgbnVtOw0KKyAgbnVtID0gMTsNCisgIHdoaWxlIChudW0gPCBsZW4pIHsNCisgICAgaWYgKGJ1ZltudW0gLSAxXSAhPSBidWZbbnVtXSB8fCBudW0gPT0gMHhGRikgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIG51bSsrOw0KKyAgfQ0KKyAgcmV0dXJuIG51bTsNCit9DQorc3RhdGljIHZvaWQgX2JtcF9lbmNvZGVfcmxlOChibXBfY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkc3RfYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRzdF9zaXplKSB7DQorICBGWF9EV09SRCBzaXplLCBkc3RfcG9zLCBpbmRleDsNCisgIHVpbnQ4X3QgcmxlWzJdID0gezB9Ow0KKyAgc2l6ZSA9IGJtcF9wdHItPnNyY19waXRjaCAqIGJtcF9wdHItPnNyY19yb3cgKiAyOw0KKyAgZHN0X3BvcyA9IGJtcF9wdHItPmZpbGVfaGVhZGVyLmJmT2ZmQml0czsNCisgIGRzdF9zaXplICs9IHNpemU7DQorICBkc3RfYnVmID0gRlhfUmVhbGxvYyh1aW50OF90LCBkc3RfYnVmLCBkc3Rfc2l6ZSk7DQorICBpZiAoZHN0X2J1ZiA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYU1lTX21lbXNldCgmZHN0X2J1Zltkc3RfcG9zXSwgMCwgc2l6ZSk7DQorICBmb3IgKGludDMyX3Qgcm93X251bSA9IGJtcF9wdHItPnNyY19yb3cgLSAxLCBpID0gMDsgcm93X251bSA+IC0xOykgew0KKyAgICBpbmRleCA9IHJvd19udW0gKiBibXBfcHRyLT5zcmNfcGl0Y2g7DQorICAgIHJsZVswXSA9IF9ibXBfcmxlOF9zZWFyY2goJmJtcF9wdHItPnNyY19idWZbaW5kZXggKyBpXSwgc2l6ZSAtIGluZGV4IC0gaSk7DQorICAgIHJsZVsxXSA9IGJtcF9wdHItPnNyY19idWZbaW5kZXggKyBpXTsNCisgICAgaWYgKGkgKyBybGVbMF0gPj0gKGludDMyX3QpYm1wX3B0ci0+c3JjX3BpdGNoKSB7DQorICAgICAgcmxlWzBdID0gdWludDhfdChibXBfcHRyLT5zcmNfcGl0Y2ggLSBpKTsNCisgICAgICBpZiAocmxlWzBdKSB7DQorICAgICAgICBkc3RfYnVmW2RzdF9wb3MrK10gPSBybGVbMF07DQorICAgICAgICBkc3RfYnVmW2RzdF9wb3MrK10gPSBybGVbMV07DQorICAgICAgfQ0KKyAgICAgIGRzdF9idWZbZHN0X3BvcysrXSA9IFJMRV9NQVJLRVI7DQorICAgICAgZHN0X2J1Zltkc3RfcG9zKytdID0gUkxFX0VPTDsNCisgICAgICBpID0gMDsNCisgICAgICByb3dfbnVtLS07DQorICAgIH0gZWxzZSB7DQorICAgICAgaSArPSBybGVbMF07DQorICAgICAgZHN0X2J1Zltkc3RfcG9zKytdID0gcmxlWzBdOw0KKyAgICAgIGRzdF9idWZbZHN0X3BvcysrXSA9IHJsZVsxXTsNCisgICAgfQ0KKyAgfQ0KKyAgZHN0X2J1Zltkc3RfcG9zKytdID0gUkxFX01BUktFUjsNCisgIGRzdF9idWZbZHN0X3BvcysrXSA9IFJMRV9FT0k7DQorICBkc3Rfc2l6ZSA9IGRzdF9wb3M7DQorfQ0KK3N0YXRpYyB1aW50OF90IF9ibXBfcmxlNF9zZWFyY2goY29uc3QgdWludDhfdCogYnVmLCBpbnQzMl90IGxlbikgew0KKyAgdWludDhfdCBudW07DQorICBudW0gPSAyOw0KKyAgd2hpbGUgKG51bSA8IGxlbikgew0KKyAgICBpZiAoYnVmW251bSAtIDJdICE9IGJ1ZltudW1dIHx8IG51bSA9PSAweEZGKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgbnVtKys7DQorICB9DQorICByZXR1cm4gbnVtOw0KK30NCitzdGF0aWMgdm9pZCBfYm1wX2VuY29kZV9ybGU0KGJtcF9jb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRzdF9idWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZHN0X3NpemUpIHsNCisgIEZYX0RXT1JEIHNpemUsIGRzdF9wb3MsIGluZGV4Ow0KKyAgdWludDhfdCBybGVbMl0gPSB7MH07DQorICBzaXplID0gYm1wX3B0ci0+c3JjX3BpdGNoICogYm1wX3B0ci0+c3JjX3JvdzsNCisgIGRzdF9wb3MgPSBibXBfcHRyLT5maWxlX2hlYWRlci5iZk9mZkJpdHM7DQorICBkc3Rfc2l6ZSArPSBzaXplOw0KKyAgZHN0X2J1ZiA9IEZYX1JlYWxsb2ModWludDhfdCwgZHN0X2J1ZiwgZHN0X3NpemUpOw0KKyAgaWYgKGRzdF9idWYgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWFNZU19tZW1zZXQoJmRzdF9idWZbZHN0X3Bvc10sIDAsIHNpemUpOw0KKyAgZm9yIChpbnQzMl90IHJvd19udW0gPSBibXBfcHRyLT5zcmNfcm93IC0gMSwgaSA9IDA7IHJvd19udW0gPiAtMTsNCisgICAgICAgcmxlWzFdID0gMCkgew0KKyAgICBpbmRleCA9IHJvd19udW0gKiBibXBfcHRyLT5zcmNfcGl0Y2g7DQorICAgIHJsZVswXSA9IF9ibXBfcmxlNF9zZWFyY2goJmJtcF9wdHItPnNyY19idWZbaW5kZXggKyBpXSwgc2l6ZSAtIGluZGV4IC0gaSk7DQorICAgIHJsZVsxXSB8PSAoYm1wX3B0ci0+c3JjX2J1ZltpbmRleCArIGldICYgMHgwZikgPDwgNDsNCisgICAgcmxlWzFdIHw9IGJtcF9wdHItPnNyY19idWZbaW5kZXggKyBpICsgMV0gJiAweDBmOw0KKyAgICBpZiAoaSArIHJsZVswXSA+PSAoaW50MzJfdClibXBfcHRyLT5zcmNfcGl0Y2gpIHsNCisgICAgICBybGVbMF0gPSB1aW50OF90KGJtcF9wdHItPnNyY19waXRjaCAtIGkpOw0KKyAgICAgIGlmIChybGVbMF0pIHsNCisgICAgICAgIGRzdF9idWZbZHN0X3BvcysrXSA9IHJsZVswXTsNCisgICAgICAgIGRzdF9idWZbZHN0X3BvcysrXSA9IHJsZVsxXTsNCisgICAgICB9DQorICAgICAgZHN0X2J1Zltkc3RfcG9zKytdID0gUkxFX01BUktFUjsNCisgICAgICBkc3RfYnVmW2RzdF9wb3MrK10gPSBSTEVfRU9MOw0KKyAgICAgIGkgPSAwOw0KKyAgICAgIHJvd19udW0tLTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpICs9IHJsZVswXTsNCisgICAgICBkc3RfYnVmW2RzdF9wb3MrK10gPSBybGVbMF07DQorICAgICAgZHN0X2J1Zltkc3RfcG9zKytdID0gcmxlWzFdOw0KKyAgICB9DQorICB9DQorICBkc3RfYnVmW2RzdF9wb3MrK10gPSBSTEVfTUFSS0VSOw0KKyAgZHN0X2J1Zltkc3RfcG9zKytdID0gUkxFX0VPSTsNCisgIGRzdF9zaXplID0gZHN0X3BvczsNCit9DQorRlhfQk9PTCBfYm1wX2VuY29kZV9pbWFnZShibXBfY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkc3RfYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRzdF9zaXplKSB7DQorICBGWF9EV09SRCBoZWFkX3NpemUgPSBzaXplb2YoQm1wRmlsZUhlYWRlcikgKyBzaXplb2YoQm1wSW5mb0hlYWRlcik7DQorICBGWF9EV09SRCBwYWxfc2l6ZSA9IHNpemVvZihGWF9EV09SRCkgKiBibXBfcHRyLT5wYWxfbnVtOw0KKyAgaWYgKGJtcF9wdHItPmluZm9faGVhZGVyLmJpQ2xyVXNlZCA+IDAgJiYNCisgICAgICBibXBfcHRyLT5pbmZvX2hlYWRlci5iaUNsclVzZWQgPCBibXBfcHRyLT5wYWxfbnVtKSB7DQorICAgIHBhbF9zaXplID0gc2l6ZW9mKEZYX0RXT1JEKSAqIGJtcF9wdHItPmluZm9faGVhZGVyLmJpQ2xyVXNlZDsNCisgIH0NCisgIGRzdF9zaXplID0gaGVhZF9zaXplICsgc2l6ZW9mKEZYX0RXT1JEKSAqIGJtcF9wdHItPnBhbF9udW07DQorICBkc3RfYnVmID0gRlhfVHJ5QWxsb2ModWludDhfdCwgZHN0X3NpemUpOw0KKyAgaWYgKGRzdF9idWYgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWFNZU19tZW1zZXQoZHN0X2J1ZiwgMCwgZHN0X3NpemUpOw0KKyAgYm1wX3B0ci0+ZmlsZV9oZWFkZXIuYmZPZmZCaXRzID0gaGVhZF9zaXplOw0KKyAgaWYgKGJtcF9wdHItPnBhbF9wdHIgJiYgcGFsX3NpemUpIHsNCisgICAgRlhTWVNfbWVtY3B5KCZkc3RfYnVmW2hlYWRfc2l6ZV0sIGJtcF9wdHItPnBhbF9wdHIsIHBhbF9zaXplKTsNCisgICAgYm1wX3B0ci0+ZmlsZV9oZWFkZXIuYmZPZmZCaXRzICs9IHBhbF9zaXplOw0KKyAgfQ0KKyAgV3JpdGVJbmZvSGVhZGVyKCZibXBfcHRyLT5pbmZvX2hlYWRlciwgZHN0X2J1Zik7DQorICBzd2l0Y2ggKGJtcF9wdHItPmluZm9faGVhZGVyLmJpQ29tcHJlc3Npb24pIHsNCisgICAgY2FzZSBCTVBfUkdCOg0KKyAgICAgIF9ibXBfZW5jb2RlX3JnYihibXBfcHRyLCBkc3RfYnVmLCBkc3Rfc2l6ZSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgQk1QX0JJVEZJRUxEUzoNCisjaWZkZWYgQk1QX1NVUFBPUlRfQklURklFTEQNCisgICAgICBfYm1wX2VuY29kZV9iaXRmaWVsZHMoYm1wX3B0ciwgZHN0X2J1ZiwgZHN0X3NpemUpOw0KKyNlbmRpZg0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEJNUF9STEU4Og0KKyAgICAgIF9ibXBfZW5jb2RlX3JsZTgoYm1wX3B0ciwgZHN0X2J1ZiwgZHN0X3NpemUpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEJNUF9STEU0Og0KKyAgICAgIF9ibXBfZW5jb2RlX3JsZTQoYm1wX3B0ciwgZHN0X2J1ZiwgZHN0X3NpemUpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0OjsNCisgIH0NCisgIGJtcF9wdHItPmZpbGVfaGVhZGVyLmJmU2l6ZSA9IGRzdF9zaXplOw0KKyAgV3JpdGVGaWxlSGVhZGVyKCZibXBfcHRyLT5maWxlX2hlYWRlciwgZHN0X2J1Zik7DQorICByZXR1cm4gVFJVRTsNCit9DQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9sYm1wL2Z4X2JtcC5oIGIvY29yZS9zcmMvZnhjb2RlYy9sYm1wL2Z4X2JtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMjMyZjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2xibXAvZnhfYm1wLmgKQEAgLTAsMCArMSwxNTUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgPHNldGptcC5oPg0KKw0KKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCINCisNCisjZGVmaW5lIEJNUF9TVVBQT1JUX0JJVEZJRUxEDQorI2RlZmluZSBCTVBfV0lEVEhCWVRFUyh3aWR0aCwgYml0Q291bnQpICgod2lkdGggKiBiaXRDb3VudCkgKyAzMSkgLyAzMiAqIDQNCisjZGVmaW5lIEJNUF9QQUxfRU5DT0RFKGEsIHIsIGcsIGIpIFwNCisgICgoKEZYX0RXT1JEKShhKSA8PCAyNCkgfCAoKHIpIDw8IDE2KSB8ICgoZykgPDwgOCkgfCAoYikpDQorI2RlZmluZSBCTVBfRF9TVEFUVVNfSEVBREVSIDB4MDENCisjZGVmaW5lIEJNUF9EX1NUQVRVU19QQUwgMHgwMg0KKyNkZWZpbmUgQk1QX0RfU1RBVFVTX0RBVEFfUFJFIDB4MDMNCisjZGVmaW5lIEJNUF9EX1NUQVRVU19EQVRBIDB4MDQNCisjZGVmaW5lIEJNUF9EX1NUQVRVU19UQUlMIDB4MDANCisjZGVmaW5lIEJNUF9TSUdOQVRVUkUgMHg0RDQyDQorI2RlZmluZSBCTVBfUEFMX05FVyAwDQorI2RlZmluZSBCTVBfUEFMX09MRCAxDQorI2RlZmluZSBSTEVfTUFSS0VSIDANCisjZGVmaW5lIFJMRV9FT0wgMA0KKyNkZWZpbmUgUkxFX0VPSSAxDQorI2RlZmluZSBSTEVfREVMVEEgMg0KKyNkZWZpbmUgQk1QX1JHQiAwTA0KKyNkZWZpbmUgQk1QX1JMRTggMUwNCisjZGVmaW5lIEJNUF9STEU0IDJMDQorI2RlZmluZSBCTVBfQklURklFTERTIDNMDQorI2RlZmluZSBCTVBfQklUXzU1NSAwDQorI2RlZmluZSBCTVBfQklUXzU2NSAxDQorI2RlZmluZSBCTVBfTUFYX0VSUk9SX1NJWkUgMjU2DQorI3ByYWdtYSBwYWNrKDEpDQordHlwZWRlZiBzdHJ1Y3QgdGFnQm1wRmlsZUhlYWRlciB7DQorICBGWF9XT1JEIGJmVHlwZTsNCisgIEZYX0RXT1JEIGJmU2l6ZTsNCisgIEZYX1dPUkQgYmZSZXNlcnZlZDE7DQorICBGWF9XT1JEIGJmUmVzZXJ2ZWQyOw0KKyAgRlhfRFdPUkQgYmZPZmZCaXRzOw0KK30gQm1wRmlsZUhlYWRlciwgKkJtcEZpbGVIZWFkZXJQdHI7DQordHlwZWRlZiBzdHJ1Y3QgdGFnQm1wQ29yZUhlYWRlciB7DQorICBGWF9EV09SRCBiY1NpemU7DQorICBGWF9XT1JEIGJjV2lkdGg7DQorICBGWF9XT1JEIGJjSGVpZ2h0Ow0KKyAgRlhfV09SRCBiY1BsYW5lczsNCisgIEZYX1dPUkQgYmNCaXRDb3VudDsNCit9IEJtcENvcmVIZWFkZXIsICpCbXBDb3JlSGVhZGVyUHRyOw0KK3R5cGVkZWYgc3RydWN0IHRhZ0JtcEluZm9IZWFkZXIgew0KKyAgRlhfRFdPUkQgYmlTaXplOw0KKyAgaW50MzJfdCBiaVdpZHRoOw0KKyAgaW50MzJfdCBiaUhlaWdodDsNCisgIEZYX1dPUkQgYmlQbGFuZXM7DQorICBGWF9XT1JEIGJpQml0Q291bnQ7DQorICBGWF9EV09SRCBiaUNvbXByZXNzaW9uOw0KKyAgRlhfRFdPUkQgYmlTaXplSW1hZ2U7DQorICBpbnQzMl90IGJpWFBlbHNQZXJNZXRlcjsNCisgIGludDMyX3QgYmlZUGVsc1Blck1ldGVyOw0KKyAgRlhfRFdPUkQgYmlDbHJVc2VkOw0KKyAgRlhfRFdPUkQgYmlDbHJJbXBvcnRhbnQ7DQorfSBCbXBJbmZvSGVhZGVyLCAqQm1wSW5mb0hlYWRlclB0cjsNCisjcHJhZ21hIHBhY2soKQ0KK3R5cGVkZWYgc3RydWN0IHRhZ19ibXBfZGVjb21wcmVzc19zdHJ1Y3QgYm1wX2RlY29tcHJlc3Nfc3RydWN0Ow0KK3R5cGVkZWYgYm1wX2RlY29tcHJlc3Nfc3RydWN0KiBibXBfZGVjb21wcmVzc19zdHJ1Y3RfcDsNCit0eXBlZGVmIGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wKiBibXBfZGVjb21wcmVzc19zdHJ1Y3RfcHA7DQorc3RydWN0IHRhZ19ibXBfZGVjb21wcmVzc19zdHJ1Y3Qgew0KKyAgam1wX2J1ZiBqbXBidWY7DQorICBGWF9DSEFSKiBlcnJfcHRyOw0KKyAgdm9pZCAoKl9ibXBfZXJyb3JfZm4pKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogZXJyX21zZyk7DQorDQorICB2b2lkKiBjb250ZXh0X3B0cjsNCisNCisgIEJtcEZpbGVIZWFkZXJQdHIgYm1wX2hlYWRlcl9wdHI7DQorICBCbXBJbmZvSGVhZGVyUHRyIGJtcF9pbmZvaGVhZGVyX3B0cjsNCisgIGludDMyX3Qgd2lkdGg7DQorICBpbnQzMl90IGhlaWdodDsNCisgIEZYX0RXT1JEIGNvbXByZXNzX2ZsYWc7DQorICBpbnQzMl90IGNvbXBvbmVudHM7DQorICBpbnQzMl90IHNyY19yb3dfYnl0ZXM7DQorICBpbnQzMl90IG91dF9yb3dfYnl0ZXM7DQorICB1aW50OF90KiBvdXRfcm93X2J1ZmZlcjsNCisgIEZYX1dPUkQgYml0Q291bnRzOw0KKyAgRlhfRFdPUkQgY29sb3JfdXNlZDsNCisgIEZYX0JPT0wgaW1nVEJfZmxhZzsNCisgIGludDMyX3QgcGFsX251bTsNCisgIGludDMyX3QgcGFsX3R5cGU7DQorICBGWF9EV09SRCogcGFsX3B0cjsNCisgIEZYX0RXT1JEIGRhdGFfc2l6ZTsNCisgIEZYX0RXT1JEIGltZ19kYXRhX29mZnNldDsNCisgIEZYX0RXT1JEIGltZ19pZmhfc2l6ZTsNCisgIGludDMyX3Qgcm93X251bTsNCisgIGludDMyX3QgY29sX251bTsNCisgIGludDMyX3QgZHBpX3g7DQorICBpbnQzMl90IGRwaV95Ow0KKyNpZmRlZiBCTVBfU1VQUE9SVF9CSVRGSUVMRA0KKyAgRlhfRFdPUkQgbWFza19yZWQ7DQorICBGWF9EV09SRCBtYXNrX2dyZWVuOw0KKyAgRlhfRFdPUkQgbWFza19ibHVlOw0KKyNlbmRpZg0KKw0KKyAgRlhfQk9PTAkJCSgqX2JtcF9nZXRfZGF0YV9wb3NpdGlvbl9mbikoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwgRlhfRFdPUkQgY3VyX3Bvcyk7DQorICB2b2lkICgqX2JtcF9nZXRfcm93X2ZuKShibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByb3dfbnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcm93X2J1Zik7DQorICB1aW50OF90KiBuZXh0X2luOw0KKyAgRlhfRFdPUkQgYXZhaWxfaW47DQorICBGWF9EV09SRCBza2lwX3NpemU7DQorICBpbnQzMl90IGRlY29kZV9zdGF0dXM7DQorfTsNCit2b2lkIF9ibXBfZXJyb3IoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwgY29uc3QgRlhfQ0hBUiogZXJyX21zZyk7DQorYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgX2JtcF9jcmVhdGVfZGVjb21wcmVzcygpOw0KK3ZvaWQgX2JtcF9kZXN0cm95X2RlY29tcHJlc3MoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3BwIGJtcF9wdHJfcHRyKTsNCitpbnQzMl90IF9ibXBfcmVhZF9oZWFkZXIoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0cik7DQoraW50MzJfdCBfYm1wX2RlY29kZV9pbWFnZShibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyKTsNCitpbnQzMl90IF9ibXBfZGVjb2RlX3JnYihibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyKTsNCitpbnQzMl90IF9ibXBfZGVjb2RlX3JsZTgoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0cik7DQoraW50MzJfdCBfYm1wX2RlY29kZV9ybGU0KGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIpOw0KK3VpbnQ4X3QqIF9ibXBfcmVhZF9kYXRhKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGRlc19idWZfcHAsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGF0YV9zaXplKTsNCit2b2lkIF9ibXBfc2F2ZV9kZWNvZGluZ19zdGF0dXMoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwgaW50MzJfdCBzdGF0dXMpOw0KK3ZvaWQgX2JtcF9pbnB1dF9idWZmZXIoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19idWYsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSk7DQorRlhfRFdPUkQgX2JtcF9nZXRfYXZhaWxfaW5wdXQoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogYXZpYWxfYnVmX3B0cik7DQorI2RlZmluZSBCTVBfUFRSX05PVF9OVUxMKHB0ciwgYm1wX3B0cikgICAgXA0KKyAgaWYgKHB0ciA9PSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgX2JtcF9lcnJvcihibXBfcHRyLCAiT3V0IE9mIE1lbW9yeSIpOyBcDQorICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgfQ0KK3R5cGVkZWYgc3RydWN0IHRhZ19ibXBfY29tcHJlc3Nfc3RydWN0IGJtcF9jb21wcmVzc19zdHJ1Y3Q7DQordHlwZWRlZiBibXBfY29tcHJlc3Nfc3RydWN0KiBibXBfY29tcHJlc3Nfc3RydWN0X3A7DQordHlwZWRlZiBibXBfY29tcHJlc3Nfc3RydWN0X3AqIGJtcF9jb21wcmVzc19zdHJ1Y3RfcHA7DQorc3RydWN0IHRhZ19ibXBfY29tcHJlc3Nfc3RydWN0IHsNCisgIEJtcEZpbGVIZWFkZXIgZmlsZV9oZWFkZXI7DQorICBCbXBJbmZvSGVhZGVyIGluZm9faGVhZGVyOw0KKyAgdWludDhfdCogc3JjX2J1ZjsNCisgIEZYX0RXT1JEIHNyY19waXRjaDsNCisgIEZYX0RXT1JEIHNyY19yb3c7DQorICB1aW50OF90IHNyY19icHA7DQorICBGWF9EV09SRCBzcmNfd2lkdGg7DQorICBGWF9CT09MIHNyY19mcmVlOw0KKyAgRlhfRFdPUkQqIHBhbF9wdHI7DQorICBGWF9XT1JEIHBhbF9udW07DQorI2lmZGVmIEJNUF9TVVBQT1JUX0JJVEZJRUxEDQorICB1aW50OF90IGJpdF90eXBlOw0KKyNlbmRpZg0KK307DQorYm1wX2NvbXByZXNzX3N0cnVjdF9wIF9ibXBfY3JlYXRlX2NvbXByZXNzKCk7DQordm9pZCBfYm1wX2Rlc3Ryb3lfY29tcHJlc3MoYm1wX2NvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIpOw0KK0ZYX0JPT0wgX2JtcF9lbmNvZGVfaW1hZ2UoYm1wX2NvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZHN0X2J1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkc3Rfc2l6ZSk7DQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9pbmNsdWRlL2Z4X2xjbXMyLmggYi9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL2luY2x1ZGUvZnhfbGNtczIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ExZWQyYS4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL2luY2x1ZGUvZnhfbGNtczIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgQ09SRV9TUkNfRlhDT0RFQ19MQ01TMl9JTkNMVURFX0ZYX0xDTVMyX0hfCi0jZGVmaW5lIENPUkVfU1JDX0ZYQ09ERUNfTENNUzJfSU5DTFVERV9GWF9MQ01TMl9IXwotCi0jaW5jbHVkZSAiLi4vbGNtczItMi42L2luY2x1ZGUvbGNtczIuaCIKLQotI2VuZGlmICAvLyBDT1JFX1NSQ19GWENPREVDX0xDTVMyX0lOQ0xVREVfRlhfTENNUzJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvaW5jbHVkZS9meF9sY21zMl9wbHVnaW4uaCBiL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvaW5jbHVkZS9meF9sY21zMl9wbHVnaW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJmZDhhNi4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL2luY2x1ZGUvZnhfbGNtczJfcGx1Z2luLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfU1JDX0ZYQ09ERUNfTENNUzJfSU5DTFVERV9GWF9MQ01TMl9QTFVHSU5fSF8KLSNkZWZpbmUgQ09SRV9TUkNfRlhDT0RFQ19MQ01TMl9JTkNMVURFX0ZYX0xDTVMyX1BMVUdJTl9IXwotCi0jaW5jbHVkZSAiLi4vbGNtczItMi42L2luY2x1ZGUvbGNtczJfcGx1Z2luLmgiCi0KLSNlbmRpZiAgLy8gQ09SRV9TUkNfRlhDT0RFQ19MQ01TMl9JTkNMVURFX0ZYX0xDTVMyX1BMVUdJTl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9sY21zMi0yLjYvc3JjL2Ntc2Vyci5jIGIvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9sY21zMi0yLjYvc3JjL2Ntc2Vyci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjQxODJhLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvbGNtczItMi42L3NyYy9jbXNlcnIuYworKysgL2Rldi9udWxsCkBAIC0xLDcwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vICBMaXR0bGUgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KLS8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMiBNYXJ0aSBNYXJpYSBTYWd1ZXIKLS8vCi0vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLS8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLS8vIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLS8vIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAotLy8gYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlCi0vLyBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotLy8KLS8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi0vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLS8vCi0vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLS8vIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTwotLy8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLS8vIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKLS8vIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLS8vIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgotLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2luY2x1ZGUgImxjbXMyX2ludGVybmFsLmgiCi0KLS8vIEkgYW0gc28gdGlyZWQgYWJvdXQgaW5jb21wYXRpYmlsaXRpZXMgb24gdGhvc2UgZnVuY3Rpb25zIHRoYXQgaGVyZSBhcmUgc29tZSByZXBsYWNlbWVudHMKLS8vIHRoYXQgaG9wZWZ1bGx5IHdvdWxkIGJlIGZ1bGx5IHBvcnRhYmxlLgotCi0vLyBjb21wYXJlIHR3byBzdHJpbmdzIGlnbm9yaW5nIGNhc2UKLWludCBDTVNFWFBPUlQgY21zc3RyY2FzZWNtcChjb25zdCBjaGFyKiBzMSwgY29uc3QgY2hhciogczIpCi17Ci0gICAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqdXMxID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp1czIgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXMyOwotCi0gICAgd2hpbGUgKHRvdXBwZXIoKnVzMSkgPT0gdG91cHBlcigqdXMyKyspKQotICAgICAgICBpZiAoKnVzMSsrID09ICdcMCcpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiAodG91cHBlcigqdXMxKSAtIHRvdXBwZXIoKi0tdXMyKSk7Ci19Ci0KLS8vIGxvbmcgaW50IGJlY2F1c2UgQzk5IHNwZWNpZmllcyBmdGVsbCBpbiBzdWNoIHdheSAoNy4xOS45LjIpCi1sb25nIGludCBDTVNFWFBPUlQgY21zZmlsZWxlbmd0aChGSUxFKiBmKQotewotICAgIGxvbmcgaW50IHAgLCBuOwotCi0gICAgcCA9IGZ0ZWxsKGYpOyAvLyByZWdpc3RlciBjdXJyZW50IGZpbGUgcG9zaXRpb24KLQotICAgIGlmIChmc2VlayhmLCAwLCBTRUVLX0VORCkgIT0gMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgbiA9IGZ0ZWxsKGYpOwotICAgIGZzZWVrKGYsIHAsIFNFRUtfU0VUKTsgLy8gZmlsZSBwb3NpdGlvbiByZXN0b3JlZAotCi0gICAgcmV0dXJuIG47Ci19Ci0KLSNpZiAwCi0vLyBNZW1vcnkgaGFuZGxpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gVGhpcyBpcyB0aGUgaW50ZXJmYWNlIHRvIGxvdy1sZXZlbCBtZW1vcnkgbWFuYWdlbWVudCByb3V0aW5lcy4gQnkgZGVmYXVsdCBhIHNpbXBsZQotLy8gd3JhcHBpbmcgdG8gbWFsbG9jL2ZyZWUvcmVhbGxvYyBpcyBwcm92aWRlZCwgYWx0aG91Z2ggdGhlcmUgaXMgYSBsaW1pdCBvbiB0aGUgbWF4Ci0vLyBhbW91bnQgb2YgbWVtb3kgdGhhdCBjYW4gYmUgcmVjbGFpbWVkLiBUaGlzIGlzIG1vc3RseSBhcyBhIHNhZmV0eSBmZWF0dXJlIHRvIHByZXZlbnQgCi0vLyBib2d1cyBvciBldmlsIGNvZGUgdG8gYWxsb2NhdGUgaHVnZSBibG9ja3MgdGhhdCBvdGhlcndpc2UgbGNtcyB3b3VsZCBuZXZlciBuZWVkLgotCi0jZGVmaW5lIE1BWF9NRU1PUllfRk9SX0FMTE9DICAoKGNtc1VJbnQzMk51bWJlcikoMTAyNFUqMTAyNFUqNTEyVSkpCi0KLS8vIFVzZXIgbWF5IG92ZXJyaWRlIHRoaXMgYmVoYXZpb3VyIGJ5IHVzaW5nIGEgbWVtb3J5IHBsdWctaW4sIHdoaWNoIGJhc2ljYWxseSByZXBsYWNlcwotLy8gdGhlIGRlZmF1bHQgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zLiBJbiB0aGlzIGNhc2UsIG5vIGNoZWNrIGlzIHBlcmZvcm1lZCBhbmQgaXQKLS8vIGlzIHVwIHRvIHRoZSBwbHVnLWluIHdyaXR0ZXIgdG8ga2VlcCBpbiB0aGUgc2FmZSBzaWRlLiBUaGVyZSBhcmUgb25seSB0aHJlZSBmdW5jdGlvbnMKLS8vIHJlcXVpcmVkIHRvIGJlIGltcGxlbWVudGVkOiBtYWxsb2MsIHJlYWxsb2MgYW5kIGZyZWUsIGFsdGhvdWdoIHRoZSB1c2VyIG1heSB3YW50IHRvCi0vLyByZXBsYWNlIHRoZSBvcHRpb25hbCBtYWxsb2NaZXJvLCBjYWxsb2MgYW5kIGR1cCBhcyB3ZWxsLgotCi1jbXNCb29sICAgX2Ntc1JlZ2lzdGVyTWVtSGFuZGxlclBsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogUGx1Z2luKTsKLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLS8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb24uIEl0IGRvZXMgYSB2ZXJ5IGNvYXJzZQotLy8gY2hlY2sgb2YgYW1vdXQgb2YgbWVtb3J5LCBqdXN0IHRvIHByZXZlbnQgZXhwbG9pdHMKLXN0YXRpYwotdm9pZCogX2Ntc01hbGxvY0RlZmF1bHRGbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIHNpemUpCi17Ci0gICAgaWYgKHNpemUgPiBNQVhfTUVNT1JZX0ZPUl9BTExPQykgcmV0dXJuIE5VTEw7ICAvLyBOZXZlciBhbGxvdyBvdmVyIG1heGltdW0KLQotICAgIHJldHVybiAodm9pZCopIG1hbGxvYyhzaXplKTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoQ29udGV4dElEKTsKLX0KLQotLy8gR2VuZXJpYyBhbGxvY2F0ZSAmIHplcm8KLXN0YXRpYwotdm9pZCogX2Ntc01hbGxvY1plcm9EZWZhdWx0Rm4oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBzaXplKQotewotICAgIHZvaWQgKnB0ID0gX2Ntc01hbGxvYyhDb250ZXh0SUQsIHNpemUpOwotICAgIGlmIChwdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIG1lbXNldChwdCwgMCwgc2l6ZSk7Ci0gICAgcmV0dXJuIHB0OwotfQotCi0KLS8vIFRoZSBkZWZhdWx0IGZyZWUgZnVuY3Rpb24uIFRoZSBvbmx5IGNoZWNrIHByb2Zvcm1lZCBpcyBhZ2FpbnN0IE5VTEwgcG9pbnRlcnMKLXN0YXRpYwotdm9pZCBfY21zRnJlZURlZmF1bHRGbihjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCAqUHRyKQotewotICAgIC8vIGZyZWUoTlVMTCkgaXMgZGVmaW5lZCBhIG5vLW9wIGJ5IEM5OSwgdGhlcmVmb3JlIGl0IGlzIHNhZmUgdG8KLSAgICAvLyBhdm9pZCB0aGUgY2hlY2ssIGJ1dCBpdCBpcyBoZXJlIGp1c3QgaW4gY2FzZS4uLgotCi0gICAgaWYgKFB0cikgZnJlZShQdHIpOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihDb250ZXh0SUQpOwotfQotCi0vLyBUaGUgZGVmYXVsdCByZWFsbG9jIGZ1bmN0aW9uLiBBZ2FpbiBpdCBjaGVja3MgZm9yIGV4cGxvaXRzLiBJZiBQdHIgaXMgTlVMTCwKLS8vIHJlYWxsb2MgYmVoYXZlcyB0aGUgc2FtZSB3YXkgYXMgbWFsbG9jIGFuZCBhbGxvY2F0ZXMgYSBuZXcgYmxvY2sgb2Ygc2l6ZSBieXRlcy4KLXN0YXRpYwotdm9pZCogX2Ntc1JlYWxsb2NEZWZhdWx0Rm4oY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIHNpemUpCi17Ci0KLSAgICBpZiAoc2l6ZSA+IE1BWF9NRU1PUllfRk9SX0FMTE9DKSByZXR1cm4gTlVMTDsgIC8vIE5ldmVyIHJlYWxsb2Mgb3ZlciA1MTJNYgotCi0gICAgcmV0dXJuIHJlYWxsb2MoUHRyLCBzaXplKTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoQ29udGV4dElEKTsKLX0KLQotCi0vLyBUaGUgZGVmYXVsdCBjYWxsb2MgZnVuY3Rpb24uIEFsbG9jYXRlcyBhbiBhcnJheSBvZiBudW0gZWxlbWVudHMsIGVhY2ggb25lIG9mIHNpemUgYnl0ZXMKLS8vIGFsbCBtZW1vcnkgaXMgaW5pdGlhbGl6ZWQgdG8gemVyby4KLXN0YXRpYwotdm9pZCogX2Ntc0NhbGxvY0RlZmF1bHRGbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIG51bSwgY21zVUludDMyTnVtYmVyIHNpemUpCi17Ci0gICAgY21zVUludDMyTnVtYmVyIFRvdGFsID0gbnVtICogc2l6ZTsKLQotICAgIC8vIFByZXNlcnZlIGNhbGxvYyBiZWhhdmlvdXIKLSAgICBpZiAoVG90YWwgPT0gMCkgcmV0dXJuIE5VTEw7Ci0KLSAgICAvLyBTYWZlIGNoZWNrIGZvciBvdmVyZmxvdy4KLSAgICBpZiAobnVtID49IFVJTlRfTUFYIC8gc2l6ZSkgcmV0dXJuIE5VTEw7Ci0KLSAgICAvLyBDaGVjayBmb3Igb3ZlcmZsb3cKLSAgICBpZiAoVG90YWwgPCBudW0gfHwgVG90YWwgPCBzaXplKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmIChUb3RhbCA+IE1BWF9NRU1PUllfRk9SX0FMTE9DKSByZXR1cm4gTlVMTDsgIC8vIE5ldmVyIGFsbG9jIG92ZXIgNTEyTWIKLQotICAgIHJldHVybiBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIFRvdGFsKTsKLX0KLQotLy8gR2VuZXJpYyBibG9jayBkdXBsaWNhdGlvbgotc3RhdGljCi12b2lkKiBfY21zRHVwRGVmYXVsdEZuKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCB2b2lkKiBPcmcsIGNtc1VJbnQzMk51bWJlciBzaXplKQotewotICAgIHZvaWQqIG1lbTsKLQotICAgIGlmIChzaXplID4gTUFYX01FTU9SWV9GT1JfQUxMT0MpIHJldHVybiBOVUxMOyAgLy8gTmV2ZXIgZHVwIG92ZXIgNTEyTWIKLQotICAgIG1lbSA9IF9jbXNNYWxsb2MoQ29udGV4dElELCBzaXplKTsKLQotICAgIGlmIChtZW0gIT0gTlVMTCAmJiBPcmcgIT0gTlVMTCkKLSAgICAgICAgbWVtbW92ZShtZW0sIE9yZywgc2l6ZSk7Ci0KLSAgICByZXR1cm4gbWVtOwotfQotCi0KLS8vIFBvaW50ZXJzIHRvIG1lbW9yeSBtYW5hZ2VyIGZ1bmN0aW9ucyBpbiBDb250ZXh0MAotX2Ntc01lbVBsdWdpbkNodW5rVHlwZSBfY21zTWVtUGx1Z2luQ2h1bmsgPSB7IF9jbXNNYWxsb2NEZWZhdWx0Rm4sIF9jbXNNYWxsb2NaZXJvRGVmYXVsdEZuLCBfY21zRnJlZURlZmF1bHRGbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Ntc1JlYWxsb2NEZWZhdWx0Rm4sIF9jbXNDYWxsb2NEZWZhdWx0Rm4sICAgIF9jbXNEdXBEZWZhdWx0Rm4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotCi0vLyBSZXNldCBhbmQgZHVwbGljYXRlIG1lbW9yeSBtYW5hZ2VyCi12b2lkIF9jbXNBbGxvY01lbVBsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKQotewotICAgIF9jbXNBc3NlcnQoY3R4ICE9IE5VTEwpOwotCi0gICAgaWYgKHNyYyAhPSBOVUxMKSB7ICAgIAotCi0gICAgICAgIC8vIER1cGxpY2F0ZQotICAgICAgICBjdHggLT5jaHVua3NbTWVtUGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCBzcmMgLT5jaHVua3NbTWVtUGx1Z2luXSwgc2l6ZW9mKF9jbXNNZW1QbHVnaW5DaHVua1R5cGUpKTsgIAotICAgIH0KLSAgICBlbHNlIHsKLQotICAgICAgICAvLyBUbyByZXNldCBpdCwgd2UgdXNlIHRoZSBkZWZhdWx0IGFsbG9jYXRvcnMsIHdoaWNoIGNhbm5vdCBiZSBvdmVycmlkZW4KLSAgICAgICAgY3R4IC0+Y2h1bmtzW01lbVBsdWdpbl0gPSAmY3R4IC0+RGVmYXVsdE1lbW9yeU1hbmFnZXI7Ci0gICAgfSAKLX0KLQotLy8gQXV4aWxpYXIgdG8gZmlsbCBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMgZnJvbSBwbHVnaW4gKG9yIGNvbnRleHQgMCBkZWZhdWx0cykKLXZvaWQgX2Ntc0luc3RhbGxBbGxvY0Z1bmN0aW9ucyhjbXNQbHVnaW5NZW1IYW5kbGVyKiBQbHVnaW4sIF9jbXNNZW1QbHVnaW5DaHVua1R5cGUqIHB0cikKLXsKLSAgICBpZiAoUGx1Z2luID09IE5VTEwpIHsKLQotICAgICAgICBtZW1jcHkocHRyLCAmX2Ntc01lbVBsdWdpbkNodW5rLCBzaXplb2YoX2Ntc01lbVBsdWdpbkNodW5rKSk7Ci0gICAgfQotICAgIGVsc2UgewotCi0gICAgICAgIHB0ciAtPk1hbGxvY1B0ciAgPSBQbHVnaW4gLT4gTWFsbG9jUHRyOwotICAgICAgICBwdHIgLT5GcmVlUHRyICAgID0gUGx1Z2luIC0+IEZyZWVQdHI7Ci0gICAgICAgIHB0ciAtPlJlYWxsb2NQdHIgPSBQbHVnaW4gLT4gUmVhbGxvY1B0cjsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgd2UgcmV2ZXJ0IHRvIGRlZmF1bHRzCi0gICAgICAgIHB0ciAtPk1hbGxvY1plcm9QdHI9IF9jbXNNYWxsb2NaZXJvRGVmYXVsdEZuOwotICAgICAgICBwdHIgLT5DYWxsb2NQdHIgICAgPSBfY21zQ2FsbG9jRGVmYXVsdEZuOwotICAgICAgICBwdHIgLT5EdXBQdHIgICAgICAgPSBfY21zRHVwRGVmYXVsdEZuOwotICAgICAgCi0gICAgICAgIGlmIChQbHVnaW4gLT5NYWxsb2NaZXJvUHRyICE9IE5VTEwpIHB0ciAtPk1hbGxvY1plcm9QdHIgPSBQbHVnaW4gLT4gTWFsbG9jWmVyb1B0cjsKLSAgICAgICAgaWYgKFBsdWdpbiAtPkNhbGxvY1B0ciAhPSBOVUxMKSAgICAgcHRyIC0+Q2FsbG9jUHRyICAgICA9IFBsdWdpbiAtPiBDYWxsb2NQdHI7Ci0gICAgICAgIGlmIChQbHVnaW4gLT5EdXBQdHIgIT0gTlVMTCkgICAgICAgIHB0ciAtPkR1cFB0ciAgICAgICAgPSBQbHVnaW4gLT4gRHVwUHRyOwotICAgICAgICAKLSAgICB9Ci19Ci0KLQotLy8gUGx1Zy1pbiByZXBsYWNlbWVudCBlbnRyeQotY21zQm9vbCAgX2Ntc1JlZ2lzdGVyTWVtSGFuZGxlclBsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSAqRGF0YSkKLXsKLSAgICBjbXNQbHVnaW5NZW1IYW5kbGVyKiBQbHVnaW4gPSAoY21zUGx1Z2luTWVtSGFuZGxlciopIERhdGE7ICAgICAKLSAgICBfY21zTWVtUGx1Z2luQ2h1bmtUeXBlKiBwdHI7Ci0KLSAgICAvLyBOVUxMIGZvcmNlcyB0byByZXNldCB0byBkZWZhdWx0cy4gSW4gdGhpcyBzcGVjaWFsIGNhc2UsIHRoZSBkZWZhdWx0cyBhcmUgc3RvcmVkIGluIHRoZSBjb250ZXh0IHN0cnVjdHVyZS4gCi0gICAgLy8gUmVtYWluaW5nIHBsdWctaW5zIGRvZXMgTk9UIGhhdmUgYW55IGNvcHkgaW4gdGhlIGNvbnRleHQgc3RydWN0dXJlLCBidXQgdGhpcyBpcyBzb21laG93IHNwZWNpYWwgYXMgdGhlCi0gICAgLy8gY29udGV4dCBpbnRlcm5hbCBkYXRhIHNob3VsZCBiZSBtYWxsb2NlJ2QgYnkgdXNpbmcgdGhvc2UgZnVuY3Rpb25zLiAKLSAgICBpZiAoRGF0YSA9PSBOVUxMKSB7Ci0KLSAgICAgICBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHggPSAoIHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqKSBDb250ZXh0SUQ7Ci0KLSAgICAgICAvLyBSZXR1cm4gdG8gdGhlIGRlZmF1bHQgYWxsb2NhdG9ycwotICAgICAgICBpZiAoQ29udGV4dElEICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGN0eC0+Y2h1bmtzW01lbVBsdWdpbl0gPSAodm9pZCopICZjdHgtPkRlZmF1bHRNZW1vcnlNYW5hZ2VyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLQotICAgIC8vIENoZWNrIGZvciByZXF1aXJlZCBjYWxsYmFja3MKLSAgICBpZiAoUGx1Z2luIC0+IE1hbGxvY1B0ciA9PSBOVUxMIHx8Ci0gICAgICAgIFBsdWdpbiAtPiBGcmVlUHRyID09IE5VTEwgfHwKLSAgICAgICAgUGx1Z2luIC0+IFJlYWxsb2NQdHIgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCi0gICAgLy8gU2V0IHJlcGxhY2VtZW50IGZ1bmN0aW9ucwotICAgIHB0ciA9IChfY21zTWVtUGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIE1lbVBsdWdpbik7Ci0gICAgaWYgKHB0ciA9PSBOVUxMKSAKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgX2Ntc0luc3RhbGxBbGxvY0Z1bmN0aW9ucyhQbHVnaW4sIHB0cik7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0jZWxzZQotI2luY2x1ZGUgIi4uLy4uLy4uLy4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vLi4vLi4vaW5jbHVkZS9meGNydC9meF9tZW1vcnkuaCIKLQotY21zQm9vbCAgX2Ntc1JlZ2lzdGVyTWVtSGFuZGxlclBsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogUGx1Z2luKQotewotCXJldHVybiBUUlVFOwotfQotCi0vLyBHZW5lcmljIGFsbG9jYXRlCi12b2lkKiBDTVNFWFBPUlQgX2Ntc01hbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIHNpemUpCi17Ci0gICAgcmV0dXJuIEZYTUVNX0RlZmF1bHRBbGxvYyhzaXplLCAxKTsKLX0KLQotLy8gR2VuZXJpYyBhbGxvY2F0ZSAmIHplcm8KLXZvaWQqIENNU0VYUE9SVCBfY21zTWFsbG9jWmVybyhjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIHNpemUpCi17Ci0Jdm9pZCogcCA9IEZYTUVNX0RlZmF1bHRBbGxvYyhzaXplLCAxKTsKLQlpZiAocCkgRlhTWVNfbWVtc2V0MzIocCwgMCwgc2l6ZSk7Ci0JcmV0dXJuIHA7Ci19Ci0KLS8vIEdlbmVyaWMgY2FsbG9jCi12b2lkKiBDTVNFWFBPUlQgX2Ntc0NhbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIG51bSwgY21zVUludDMyTnVtYmVyIHNpemUpCi17Ci0JY21zVUludDMyTnVtYmVyIHRvdGFsID0gbnVtICogc2l6ZTsKLQlpZiAodG90YWwgPT0gMCB8fCB0b3RhbCAvIHNpemUgIT0gbnVtIHx8IHRvdGFsID49IDUxMiAqIDEwMjQgKiAxMDI0KQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybiBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIG51bSAqIHNpemUpOwotfQotCi0vLyBHZW5lcmljIHJlYWxsb2NhdGUKLXZvaWQqIENNU0VYUE9SVCBfY21zUmVhbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgc2l6ZSkKLXsKLQlyZXR1cm4gRlhNRU1fRGVmYXVsdFJlYWxsb2MoUHRyLCBzaXplLCAxKTsKLX0KLQotLy8gR2VuZXJpYyBmcmVlIG1lbW9yeQotdm9pZCBDTVNFWFBPUlQgX2Ntc0ZyZWUoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIFB0cikKLXsKLQlpZiAoUHRyICE9IE5VTEwpIEZYTUVNX0RlZmF1bHRGcmVlKFB0ciwgMCk7Ci19Ci0KLS8vIEdlbmVyaWMgYmxvY2sgZHVwbGljYXRpb24KLXZvaWQqIENNU0VYUE9SVCBfY21zRHVwTWVtKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCB2b2lkKiBPcmcsIGNtc1VJbnQzMk51bWJlciBzaXplKQotewotCXZvaWQqIHAgPSBGWE1FTV9EZWZhdWx0QWxsb2Moc2l6ZSwgMSk7Ci0JRlhTWVNfbWVtbW92ZTMyKHAsIE9yZywgc2l6ZSk7Ci0JcmV0dXJuIHA7Ci19Ci0KLV9jbXNNZW1QbHVnaW5DaHVua1R5cGUgX2Ntc01lbVBsdWdpbkNodW5rID0ge19jbXNNYWxsb2MsIF9jbXNNYWxsb2NaZXJvLCBfY21zRnJlZSwgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY21zUmVhbGxvYywgX2Ntc0NhbGxvYywgICAgX2Ntc0R1cE1lbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi12b2lkIF9jbXNBbGxvY01lbVBsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKQotewotCV9jbXNBc3NlcnQoY3R4ICE9IE5VTEwpOwotCi0JaWYgKHNyYyAhPSBOVUxMKSB7ICAgIAotCi0JCS8vIER1cGxpY2F0ZQotCQljdHggLT5jaHVua3NbTWVtUGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCBzcmMgLT5jaHVua3NbTWVtUGx1Z2luXSwgc2l6ZW9mKF9jbXNNZW1QbHVnaW5DaHVua1R5cGUpKTsgIAotCX0KLQllbHNlIHsKLQotCQkvLyBUbyByZXNldCBpdCwgd2UgdXNlIHRoZSBkZWZhdWx0IGFsbG9jYXRvcnMsIHdoaWNoIGNhbm5vdCBiZSBvdmVycmlkZW4KLQkJY3R4IC0+Y2h1bmtzW01lbVBsdWdpbl0gPSAmY3R4IC0+RGVmYXVsdE1lbW9yeU1hbmFnZXI7Ci0JfSAKLX0KLQotdm9pZCBfY21zSW5zdGFsbEFsbG9jRnVuY3Rpb25zKGNtc1BsdWdpbk1lbUhhbmRsZXIqIFBsdWdpbiwgX2Ntc01lbVBsdWdpbkNodW5rVHlwZSogcHRyKQotewotCWlmIChQbHVnaW4gPT0gTlVMTCkgewotCi0JCW1lbWNweShwdHIsICZfY21zTWVtUGx1Z2luQ2h1bmssIHNpemVvZihfY21zTWVtUGx1Z2luQ2h1bmspKTsKLQl9Ci0JZWxzZSB7Ci0KLQkJcHRyIC0+TWFsbG9jUHRyICA9IFBsdWdpbiAtPiBNYWxsb2NQdHI7Ci0JCXB0ciAtPkZyZWVQdHIgICAgPSBQbHVnaW4gLT4gRnJlZVB0cjsKLQkJcHRyIC0+UmVhbGxvY1B0ciA9IFBsdWdpbiAtPiBSZWFsbG9jUHRyOwotCi0JCS8vIE1ha2Ugc3VyZSB3ZSByZXZlcnQgdG8gZGVmYXVsdHMKLQkJcHRyIC0+TWFsbG9jWmVyb1B0cj0gX2Ntc01hbGxvY1plcm87Ci0JCXB0ciAtPkNhbGxvY1B0ciAgICA9IF9jbXNDYWxsb2M7Ci0JCXB0ciAtPkR1cFB0ciAgICAgICA9IF9jbXNEdXBNZW07Ci0KLQkJaWYgKFBsdWdpbiAtPk1hbGxvY1plcm9QdHIgIT0gTlVMTCkgcHRyIC0+TWFsbG9jWmVyb1B0ciA9IFBsdWdpbiAtPiBNYWxsb2NaZXJvUHRyOwotCQlpZiAoUGx1Z2luIC0+Q2FsbG9jUHRyICE9IE5VTEwpICAgICBwdHIgLT5DYWxsb2NQdHIgICAgID0gUGx1Z2luIC0+IENhbGxvY1B0cjsKLQkJaWYgKFBsdWdpbiAtPkR1cFB0ciAhPSBOVUxMKSAgICAgICAgcHRyIC0+RHVwUHRyICAgICAgICA9IFBsdWdpbiAtPiBEdXBQdHI7Ci0KLQl9Ci19Ci0jZW5kaWYKLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotLy8gU3ViIGFsbG9jYXRpb24gdGFrZXMgY2FyZSBvZiBtYW55IHBvaW50ZXJzIG9mIHNtYWxsIHNpemUuIFRoZSBtZW1vcnkgYWxsb2NhdGVkIGluCi0vLyB0aGlzIHdheSBoYXZlIGJlIGZyZWVkIGF0IG9uY2UuIE5leHQgZnVuY3Rpb24gYWxsb2NhdGVzIGEgc2luZ2xlIGNodW5rIGZvciBsaW5rZWQgbGlzdAotLy8gSSBwcmVmZXIgdGhpcyBtZXRob2Qgb3ZlciByZWFsbG9jIGR1ZSB0byB0aGUgYmlnIGlucGFjdCBvbiB4cHV0IHJlYWxsb2MgbWF5IGhhdmUgaWYKLS8vIG1lbW9yeSBpcyBiZWluZyBzd2FwcGVkIHRvIGRpc2suIFRoaXMgYXBwcm9hY2ggaXMgc2FmZXIgKGFsdGhvdWdoIHRoYXQgbWF5IG5vdCBiZSB0cnVlIG9uIGFsbCBwbGF0Zm9ybXMpCi1zdGF0aWMKLV9jbXNTdWJBbGxvY2F0b3JfY2h1bmsqIF9jbXNDcmVhdGVTdWJBbGxvY0NodW5rKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgSW5pdGlhbCkKLXsKLSAgICBfY21zU3ViQWxsb2NhdG9yX2NodW5rKiBjaHVuazsKLQotICAgIC8vIDIwSyBieSBkZWZhdWx0Ci0gICAgaWYgKEluaXRpYWwgPT0gMCkKLSAgICAgICAgSW5pdGlhbCA9IDIwKjEwMjQ7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIGNvbnRhaW5lcgotICAgIGNodW5rID0gKF9jbXNTdWJBbGxvY2F0b3JfY2h1bmsqKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihfY21zU3ViQWxsb2NhdG9yX2NodW5rKSk7Ci0gICAgaWYgKGNodW5rID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgLy8gSW5pdGlhbGl6ZSB2YWx1ZXMKLSAgICBjaHVuayAtPkJsb2NrICAgICA9IChjbXNVSW50OE51bWJlciopIF9jbXNNYWxsb2MoQ29udGV4dElELCBJbml0aWFsKTsKLSAgICBpZiAoY2h1bmsgLT5CbG9jayA9PSBOVUxMKSB7Ci0KLSAgICAgICAgLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcKLSAgICAgICAgX2Ntc0ZyZWUoQ29udGV4dElELCBjaHVuayk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGNodW5rIC0+QmxvY2tTaXplID0gSW5pdGlhbDsKLSAgICBjaHVuayAtPlVzZWQgICAgICA9IDA7Ci0gICAgY2h1bmsgLT5uZXh0ICAgICAgPSBOVUxMOwotCi0gICAgcmV0dXJuIGNodW5rOwotfQotCi0vLyBUaGUgc3ViYWxsb2NhdGVkIGlzIG5vdGhpbmcgYnV0IGEgcG9pbnRlciB0byB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgbGlzdC4gV2UgYWxzbyBrZWVwCi0vLyB0aGUgdGhyZWFkIElEIGluIHRoaXMgc3RydWN0dXJlLgotX2Ntc1N1YkFsbG9jYXRvciogX2Ntc0NyZWF0ZVN1YkFsbG9jKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgSW5pdGlhbCkKLXsKLSAgICBfY21zU3ViQWxsb2NhdG9yKiBzdWI7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIGNvbnRhaW5lcgotICAgIHN1YiA9IChfY21zU3ViQWxsb2NhdG9yKikgX2Ntc01hbGxvY1plcm8oQ29udGV4dElELCBzaXplb2YoX2Ntc1N1YkFsbG9jYXRvcikpOwotICAgIGlmIChzdWIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBzdWIgLT5Db250ZXh0SUQgPSBDb250ZXh0SUQ7Ci0KLSAgICBzdWIgLT5oID0gX2Ntc0NyZWF0ZVN1YkFsbG9jQ2h1bmsoQ29udGV4dElELCBJbml0aWFsKTsKLSAgICBpZiAoc3ViIC0+aCA9PSBOVUxMKSB7Ci0gICAgICAgIF9jbXNGcmVlKENvbnRleHRJRCwgc3ViKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN1YjsKLX0KLQotCi0vLyBHZXQgcmlkIG9mIHdob2xlIGxpbmtlZCBsaXN0Ci12b2lkIF9jbXNTdWJBbGxvY0Rlc3Ryb3koX2Ntc1N1YkFsbG9jYXRvciogc3ViKQotewotICAgIF9jbXNTdWJBbGxvY2F0b3JfY2h1bmsgKmNodW5rLCAqbjsKLQotICAgIGZvciAoY2h1bmsgPSBzdWIgLT5oOyBjaHVuayAhPSBOVUxMOyBjaHVuayA9IG4pIHsKLQotICAgICAgICBuID0gY2h1bmstPm5leHQ7Ci0gICAgICAgIGlmIChjaHVuay0+QmxvY2sgIT0gTlVMTCkgX2Ntc0ZyZWUoc3ViIC0+Q29udGV4dElELCBjaHVuay0+QmxvY2spOwotICAgICAgICBfY21zRnJlZShzdWIgLT5Db250ZXh0SUQsIGNodW5rKTsKLSAgICB9Ci0KLSAgICAvLyBGcmVlIHRoZSBoZWFkZXIKLSAgICBfY21zRnJlZShzdWIgLT5Db250ZXh0SUQsIHN1Yik7Ci19Ci0KLQotLy8gR2V0IGEgcG9pbnRlciB0byBzbWFsbCBtZW1vcnkgYmxvY2suCi12b2lkKiAgX2Ntc1N1YkFsbG9jKF9jbXNTdWJBbGxvY2F0b3IqIHN1YiwgY21zVUludDMyTnVtYmVyIHNpemUpCi17Ci0gICAgY21zVUludDMyTnVtYmVyIEZyZWUgPSBzdWIgLT4gaCAtPkJsb2NrU2l6ZSAtIHN1YiAtPiBoIC0+IFVzZWQ7Ci0gICAgY21zVUludDhOdW1iZXIqIHB0cjsKLQotICAgIHNpemUgPSBfY21zQUxJR05NRU0oc2l6ZSk7Ci0KLSAgICAvLyBDaGVjayBmb3IgbWVtb3J5LiBJZiB0aGVyZSBpcyBubyByb29tLCBhbGxvY2F0ZSBhIG5ldyBjaHVuayBvZiBkb3VibGUgbWVtb3J5IHNpemUuCi0gICAgaWYgKHNpemUgPiBGcmVlKSB7Ci0KLSAgICAgICAgX2Ntc1N1YkFsbG9jYXRvcl9jaHVuayogY2h1bms7Ci0gICAgICAgIGNtc1VJbnQzMk51bWJlciBuZXdTaXplOwotCi0gICAgICAgIG5ld1NpemUgPSBzdWIgLT4gaCAtPkJsb2NrU2l6ZSAqIDI7Ci0gICAgICAgIGlmIChuZXdTaXplIDwgc2l6ZSkgbmV3U2l6ZSA9IHNpemU7Ci0KLSAgICAgICAgY2h1bmsgPSBfY21zQ3JlYXRlU3ViQWxsb2NDaHVuayhzdWIgLT4gQ29udGV4dElELCBuZXdTaXplKTsKLSAgICAgICAgaWYgKGNodW5rID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgICAgIC8vIExpbmsgbGlzdAotICAgICAgICBjaHVuayAtPm5leHQgPSBzdWIgLT5oOwotICAgICAgICBzdWIgLT5oICAgID0gY2h1bms7Ci0KLSAgICB9Ci0KLSAgICBwdHIgPSAgc3ViIC0+IGggLT5CbG9jayArIHN1YiAtPiBoIC0+VXNlZDsKLSAgICBzdWIgLT4gaCAtPiBVc2VkICs9IHNpemU7Ci0KLSAgICByZXR1cm4gKHZvaWQqKSBwdHI7Ci19Ci0KLS8vIER1cGxpY2F0ZSBpbiBwb29sCi12b2lkKiBfY21zU3ViQWxsb2NEdXAoX2Ntc1N1YkFsbG9jYXRvciogcywgY29uc3Qgdm9pZCAqcHRyLCBjbXNVSW50MzJOdW1iZXIgc2l6ZSkKLXsKLSAgICB2b2lkICpOZXdQdHI7Ci0gICAgCi0gICAgLy8gRHVwIG9mIG51bGwgcG9pbnRlciBpcyBhbHNvIE5VTEwKLSAgICBpZiAocHRyID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgTmV3UHRyID0gX2Ntc1N1YkFsbG9jKHMsIHNpemUpOwotCi0gICAgaWYgKHB0ciAhPSBOVUxMICYmIE5ld1B0ciAhPSBOVUxMKSB7Ci0gICAgICAgIG1lbWNweShOZXdQdHIsIHB0ciwgc2l6ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5ld1B0cjsKLX0KLQotCi0KLS8vIEVycm9yIGxvZ2dpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLS8vIFRoZXJlIGlzIG5vIGVycm9yIGhhbmRsaW5nIGF0IGFsbC4gV2hlbiBhIGZ1bnRpb24gZmFpbHMsIGl0IHJldHVybnMgcHJvcGVyIHZhbHVlLgotLy8gRm9yIGV4YW1wbGUsIGFsbCBjcmVhdGUgZnVuY3Rpb25zIGRvZXMgcmV0dXJuIE5VTEwgb24gZmFpbHVyZS4gT3RoZXIgcmV0dXJuIEZBTFNFCi0vLyBJdCBtYXkgYmUgaW50ZXJlc3RpbmcsIGZvciB0aGUgZGV2ZWxvcGVyLCB0byBrbm93IHdoeSB0aGUgZnVuY3Rpb24gaXMgZmFpbGluZy4KLS8vIGZvciB0aGF0IHJlYXNvbiwgbGNtczIgZG9lcyBvZmZlciBhIGxvZ2dpbmcgZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gZG9lcyByZWNpdmUKLS8vIGEgRU5HTElTSCBzdHJpbmcgd2l0aCBzb21lIGNsdWVzIG9uIHdoYXQgaXMgZ29pbmcgd3JvbmcuIFlvdSBjYW4gc2hvdyB0aGlzCi0vLyBpbmZvIHRvIHRoZSBlbmQgdXNlciwgb3IganVzdCBjcmVhdGUgc29tZSBzb3J0IG9mIGxvZy4KLS8vIFRoZSBsb2dnaW5nIGZ1bmN0aW9uIHNob3VsZCBOT1QgdGVybWluYXRlIHRoZSBwcm9ncmFtLCBhcyB0aGlzIG9idmlvdXNseSBjYW4gbGVhdmUKLS8vIHJlc291cmNlcy4gSXQgaXMgdGhlIHByb2dyYW1tZXIncyByZXNwb25zYWJpbGl0eSB0byBjaGVjayBlYWNoIGZ1bmN0aW9uIHJldHVybiBjb2RlCi0vLyB0byBtYWtlIHN1cmUgaXQgZGlkbid0IGZhaWwuCi0KLS8vIEVycm9yIG1lc3NhZ2VzIGFyZSBsaW1pdGVkIHRvIE1BWF9FUlJPUl9NRVNTQUdFX0xFTgotCi0jZGVmaW5lIE1BWF9FUlJPUl9NRVNTQUdFX0xFTiAgIDEwMjQKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFRoaXMgaXMgb3VyIGRlZmF1bHQgbG9nIGVycm9yCi1zdGF0aWMgdm9pZCBEZWZhdWx0TG9nRXJyb3JIYW5kbGVyRnVuY3Rpb24oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBFcnJvckNvZGUsIGNvbnN0IGNoYXIgKlRleHQpOwotCi0vLyBDb250ZXh0MCBzdG9yYWdlLCB3aGljaCBpcyBnbG9iYWwKLV9jbXNMb2dFcnJvckNodW5rVHlwZSBfY21zTG9nRXJyb3JDaHVuayA9IHsgRGVmYXVsdExvZ0Vycm9ySGFuZGxlckZ1bmN0aW9uIH07Ci0KLS8vIEFsbG9jYXRlcyBhbmQgaW5pdHMgZXJyb3IgbG9nZ2VyIGNvbnRhaW5lciBmb3IgYSBnaXZlbiBjb250ZXh0LiBJZiBzcmMgaXMgTlVMTCwgb25seSBpbml0aWFsaXplcyB0aGUgdmFsdWUKLS8vIHRvIHRoZSBkZWZhdWx0LiBPdGhlcndpc2UsIGl0IGR1cGxpY2F0ZXMgdGhlIHZhbHVlLiBUaGUgaW50ZXJmYWNlIGlzIHN0YW5kYXJkIGFjcm9zcyBhbGwgY29udGV4dCBjbGllbnRzCi12b2lkIF9jbXNBbGxvY0xvZ0Vycm9yQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpCi17ICAgIAotICAgIHN0YXRpYyBfY21zTG9nRXJyb3JDaHVua1R5cGUgTG9nRXJyb3JDaHVuayA9IHsgRGVmYXVsdExvZ0Vycm9ySGFuZGxlckZ1bmN0aW9uIH07Ci0gICAgdm9pZCogZnJvbTsKLSAgICAgCi0gICAgIGlmIChzcmMgIT0gTlVMTCkgewotICAgICAgICBmcm9tID0gc3JjIC0+Y2h1bmtzW0xvZ2dlcl07ICAgICAgIAotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICBmcm9tID0gJkxvZ0Vycm9yQ2h1bms7Ci0gICAgfQotICAgIAotICAgIGN0eCAtPmNodW5rc1tMb2dnZXJdID0gX2Ntc1N1YkFsbG9jRHVwKGN0eCAtPk1lbVBvb2wsIGZyb20sIHNpemVvZihfY21zTG9nRXJyb3JDaHVua1R5cGUpKTsgICAKLX0KLQotLy8gVGhlIGRlZmF1bHQgZXJyb3IgbG9nZ2VyIGRvZXMgbm90aGluZy4KLXN0YXRpYwotdm9pZCBEZWZhdWx0TG9nRXJyb3JIYW5kbGVyRnVuY3Rpb24oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBFcnJvckNvZGUsIGNvbnN0IGNoYXIgKlRleHQpCi17Ci0gICAgLy8gZnByaW50ZihzdGRlcnIsICJbbGNtc106ICVzXG4iLCBUZXh0KTsKLSAgICAvLyBmZmx1c2goc3RkZXJyKTsKLQotICAgICBjbXNVTlVTRURfUEFSQU1FVEVSKENvbnRleHRJRCk7Ci0gICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoRXJyb3JDb2RlKTsKLSAgICAgY21zVU5VU0VEX1BBUkFNRVRFUihUZXh0KTsKLX0KLQotLy8gQ2hhbmdlIGxvZyBlcnJvciwgY29udGV4dCBiYXNlZAotdm9pZCBDTVNFWFBPUlQgY21zU2V0TG9nRXJyb3JIYW5kbGVyVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNMb2dFcnJvckhhbmRsZXJGdW5jdGlvbiBGbikKLXsKLSAgICBfY21zTG9nRXJyb3JDaHVua1R5cGUqIGxoZyA9IChfY21zTG9nRXJyb3JDaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgTG9nZ2VyKTsKLQotICAgIGlmIChsaGcgIT0gTlVMTCkgewotCi0gICAgICAgIGlmIChGbiA9PSBOVUxMKQotICAgICAgICAgICAgbGhnIC0+IExvZ0Vycm9ySGFuZGxlciA9IERlZmF1bHRMb2dFcnJvckhhbmRsZXJGdW5jdGlvbjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbGhnIC0+IExvZ0Vycm9ySGFuZGxlciA9IEZuOwotICAgIH0KLX0KLQotLy8gQ2hhbmdlIGxvZyBlcnJvciwgbGVnYWN5Ci12b2lkIENNU0VYUE9SVCBjbXNTZXRMb2dFcnJvckhhbmRsZXIoY21zTG9nRXJyb3JIYW5kbGVyRnVuY3Rpb24gRm4pCi17Ci0gICAgY21zU2V0TG9nRXJyb3JIYW5kbGVyVEhSKE5VTEwsIEZuKTsgICAgCi19Ci0KLS8vIExvZyBhbiBlcnJvcgotLy8gRXJyb3JUZXh0IGlzIGEgdGV4dCBob2xkaW5nIGFuIGVuZ2xpc2ggZGVzY3JpcHRpb24gb2YgZXJyb3IuCi12b2lkIENNU0VYUE9SVCBjbXNTaWduYWxFcnJvcihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIEVycm9yQ29kZSwgY29uc3QgY2hhciAqRXJyb3JUZXh0LCAuLi4pCi17Ci0gICAgdmFfbGlzdCBhcmdzOwotICAgIGNoYXIgQnVmZmVyW01BWF9FUlJPUl9NRVNTQUdFX0xFTl07Ci0gICAgX2Ntc0xvZ0Vycm9yQ2h1bmtUeXBlKiBsaGc7Ci0KLQotICAgIHZhX3N0YXJ0KGFyZ3MsIEVycm9yVGV4dCk7Ci0gICAgdnNucHJpbnRmKEJ1ZmZlciwgTUFYX0VSUk9SX01FU1NBR0VfTEVOLTEsIEVycm9yVGV4dCwgYXJncyk7Ci0gICAgdmFfZW5kKGFyZ3MpOwotCi0gICAgLy8gQ2hlY2sgZm9yIHRoZSBjb250ZXh0LCBpZiBzcGVjaWZpZWQgZ28gdGhlcmUuIElmIG5vdCwgZ28gZm9yIHRoZSBnbG9iYWwKLSAgICBsaGcgPSAoX2Ntc0xvZ0Vycm9yQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIExvZ2dlcik7Ci0gICAgaWYgKGxoZyAtPkxvZ0Vycm9ySGFuZGxlcikgewotICAgICAgICBsaGcgLT5Mb2dFcnJvckhhbmRsZXIoQ29udGV4dElELCBFcnJvckNvZGUsIEJ1ZmZlcik7Ci0gICAgfSAgIAotfQotCi0vLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIHByaW50IHNpZ25hdHVyZXMKLXZvaWQgX2Ntc1RhZ1NpZ25hdHVyZTJTdHJpbmcoY2hhciBTdHJpbmdbNV0sIGNtc1RhZ1NpZ25hdHVyZSBzaWcpCi17Ci0gICAgY21zVUludDMyTnVtYmVyIGJlOwotCi0gICAgLy8gQ29udmVydCB0byBiaWcgZW5kaWFuCi0gICAgYmUgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoKGNtc1VJbnQzMk51bWJlcikgc2lnKTsKLQotICAgIC8vIE1vdmUgY2hhcnMKLSAgICBtZW1tb3ZlKFN0cmluZywgJmJlLCA0KTsKLQotICAgIC8vIE1ha2Ugc3VyZSBvZiB0ZXJtaW5hdG9yCi0gICAgU3RyaW5nWzRdID0gMDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLXN0YXRpYwotdm9pZCogZGVmTXR4Q3JlYXRlKGNtc0NvbnRleHQgaWQpCi17Ci0gICAgX2Ntc011dGV4KiBwdHJfbXV0ZXggPSAoX2Ntc011dGV4KikgX2Ntc01hbGxvYyhpZCwgc2l6ZW9mKF9jbXNNdXRleCkpOwotICAgIF9jbXNJbml0TXV0ZXhQcmltaXRpdmUocHRyX211dGV4KTsKLSAgICByZXR1cm4gKHZvaWQqKSBwdHJfbXV0ZXg7ICAgCi19Ci0KLXN0YXRpYwotdm9pZCBkZWZNdHhEZXN0cm95KGNtc0NvbnRleHQgaWQsIHZvaWQqIG10eCkKLXsKLSAgICBfY21zRGVzdHJveU11dGV4UHJpbWl0aXZlKChfY21zTXV0ZXggKikgbXR4KTsgCi0gICAgX2Ntc0ZyZWUoaWQsIG10eCk7Ci19Ci0KLXN0YXRpYwotY21zQm9vbCBkZWZNdHhMb2NrKGNtc0NvbnRleHQgaWQsIHZvaWQqIG10eCkKLXsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGlkKTsKLSAgICByZXR1cm4gX2Ntc0xvY2tQcmltaXRpdmUoKF9jbXNNdXRleCAqKSBtdHgpID09IDA7ICAgICAKLX0KLQotc3RhdGljCi12b2lkIGRlZk10eFVubG9jayhjbXNDb250ZXh0IGlkLCB2b2lkKiBtdHgpCi17Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihpZCk7Ci0gICAgX2Ntc1VubG9ja1ByaW1pdGl2ZSgoX2Ntc011dGV4ICopIG10eCk7IAotfQotCi0KLQotLy8gUG9pbnRlcnMgdG8gbWVtb3J5IG1hbmFnZXIgZnVuY3Rpb25zIGluIENvbnRleHQwCi1fY21zTXV0ZXhQbHVnaW5DaHVua1R5cGUgX2Ntc011dGV4UGx1Z2luQ2h1bmsgPSB7IGRlZk10eENyZWF0ZSwgZGVmTXR4RGVzdHJveSwgZGVmTXR4TG9jaywgZGVmTXR4VW5sb2NrIH07Ci0KLS8vIEFsbG9jYXRlIGFuZCBpbml0IG11dGV4IGNvbnRhaW5lci4KLXZvaWQgX2Ntc0FsbG9jTXV0ZXhQbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYykKLXsKLSAgICBzdGF0aWMgX2Ntc011dGV4UGx1Z2luQ2h1bmtUeXBlIE11dGV4Q2h1bmsgPSB7ZGVmTXR4Q3JlYXRlLCBkZWZNdHhEZXN0cm95LCBkZWZNdHhMb2NrLCBkZWZNdHhVbmxvY2sgfTsKLSAgICB2b2lkKiBmcm9tOwotICAgICAKLSAgICAgaWYgKHNyYyAhPSBOVUxMKSB7Ci0gICAgICAgIGZyb20gPSBzcmMgLT5jaHVua3NbTXV0ZXhQbHVnaW5dOyAgICAgICAKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgZnJvbSA9ICZNdXRleENodW5rOwotICAgIH0KLSAgICAKLSAgICBjdHggLT5jaHVua3NbTXV0ZXhQbHVnaW5dID0gX2Ntc1N1YkFsbG9jRHVwKGN0eCAtPk1lbVBvb2wsIGZyb20sIHNpemVvZihfY21zTXV0ZXhQbHVnaW5DaHVua1R5cGUpKTsgICAKLX0KLQotLy8gUmVnaXN0ZXIgbmV3IHdheXMgdG8gdHJhbnNmb3JtCi1jbXNCb29sICBfY21zUmVnaXN0ZXJNdXRleFBsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogRGF0YSkKLXsKLSAgICBjbXNQbHVnaW5NdXRleCogUGx1Z2luID0gKGNtc1BsdWdpbk11dGV4KikgRGF0YTsKLSAgICBfY21zTXV0ZXhQbHVnaW5DaHVua1R5cGUqIGN0eCA9ICggX2Ntc011dGV4UGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIE11dGV4UGx1Z2luKTsKLQotICAgIGlmIChEYXRhID09IE5VTEwpIHsKLQotICAgICAgICAvLyBObyBsb2NrIHJvdXRpbmVzCi0gICAgICAgIGN0eC0+Q3JlYXRlTXV0ZXhQdHIgPSBOVUxMOyAKLSAgICAgICAgY3R4LT5EZXN0cm95TXV0ZXhQdHIgPSBOVUxMOyAKLSAgICAgICAgY3R4LT5Mb2NrTXV0ZXhQdHIgPSBOVUxMOwotICAgICAgICBjdHggLT5VbmxvY2tNdXRleFB0ciA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLQotICAgIC8vIEZhY3RvcnkgY2FsbGJhY2sgaXMgcmVxdWlyZWQKLSAgICBpZiAoUGx1Z2luIC0+Q3JlYXRlTXV0ZXhQdHIgPT0gTlVMTCB8fCBQbHVnaW4gLT5EZXN0cm95TXV0ZXhQdHIgPT0gTlVMTCB8fCAKLSAgICAgICAgUGx1Z2luIC0+TG9ja011dGV4UHRyID09IE5VTEwgfHwgUGx1Z2luIC0+VW5sb2NrTXV0ZXhQdHIgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCi0KLSAgICBjdHgtPkNyZWF0ZU11dGV4UHRyICA9IFBsdWdpbi0+Q3JlYXRlTXV0ZXhQdHI7Ci0gICAgY3R4LT5EZXN0cm95TXV0ZXhQdHIgPSBQbHVnaW4gLT5EZXN0cm95TXV0ZXhQdHI7Ci0gICAgY3R4IC0+TG9ja011dGV4UHRyICAgPSBQbHVnaW4gLT5Mb2NrTXV0ZXhQdHI7Ci0gICAgY3R4IC0+VW5sb2NrTXV0ZXhQdHIgPSBQbHVnaW4gLT5VbmxvY2tNdXRleFB0cjsKLQotICAgIC8vIEFsbCBpcyBvawotICAgIHJldHVybiBUUlVFOwotfQotCi0vLyBHZW5lcmljIE11dGV4IGZucwotdm9pZCogQ01TRVhQT1JUIF9jbXNDcmVhdGVNdXRleChjbXNDb250ZXh0IENvbnRleHRJRCkKLXsKLSAgICBfY21zTXV0ZXhQbHVnaW5DaHVua1R5cGUqIHB0ciA9IChfY21zTXV0ZXhQbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgTXV0ZXhQbHVnaW4pOwotCi0gICAgaWYgKHB0ciAtPkNyZWF0ZU11dGV4UHRyID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgcmV0dXJuIHB0ciAtPkNyZWF0ZU11dGV4UHRyKENvbnRleHRJRCk7Ci19Ci0KLXZvaWQgQ01TRVhQT1JUIF9jbXNEZXN0cm95TXV0ZXgoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIG10eCkKLXsKLSAgICBfY21zTXV0ZXhQbHVnaW5DaHVua1R5cGUqIHB0ciA9IChfY21zTXV0ZXhQbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgTXV0ZXhQbHVnaW4pOwotCi0gICAgaWYgKHB0ciAtPkRlc3Ryb3lNdXRleFB0ciAhPSBOVUxMKSB7Ci0KLSAgICAgICAgcHRyIC0+RGVzdHJveU11dGV4UHRyKENvbnRleHRJRCwgbXR4KTsKLSAgICB9Ci19Ci0KLWNtc0Jvb2wgQ01TRVhQT1JUIF9jbXNMb2NrTXV0ZXgoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIG10eCkKLXsKLSAgICBfY21zTXV0ZXhQbHVnaW5DaHVua1R5cGUqIHB0ciA9IChfY21zTXV0ZXhQbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgTXV0ZXhQbHVnaW4pOwotCi0gICAgaWYgKHB0ciAtPkxvY2tNdXRleFB0ciA9PSBOVUxMKSByZXR1cm4gVFJVRTsKLQotICAgIHJldHVybiBwdHIgLT5Mb2NrTXV0ZXhQdHIoQ29udGV4dElELCBtdHgpOwotfQotCi12b2lkIENNU0VYUE9SVCBfY21zVW5sb2NrTXV0ZXgoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIG10eCkKLXsKLSAgICBfY21zTXV0ZXhQbHVnaW5DaHVua1R5cGUqIHB0ciA9IChfY21zTXV0ZXhQbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgTXV0ZXhQbHVnaW4pOwotCi0gICAgaWYgKHB0ciAtPlVubG9ja011dGV4UHRyICE9IE5VTEwpIHsKLQotICAgICAgICBwdHIgLT5VbmxvY2tNdXRleFB0cihDb250ZXh0SUQsIG10eCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9sY21zMi0yLjYvc3JjL2xjbXMyX2ludGVybmFsLmggYi9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL2xjbXMyLTIuNi9zcmMvbGNtczJfaW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTExOTIxOC4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL2xjbXMyLTIuNi9zcmMvbGNtczJfaW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMzIgKzAsMCBAQAotLy88PDwrKytPUEVOU09VUkNFCi0vLzw8PCsrK09QRU5TT1VSQ0VfTVVTVF9CRUdJTiBDT01NRU5UPT1UUlVFCi0vLwotLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQotLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE0IE1hcnRpIE1hcmlhIFNhZ3VlcgotLy8KLS8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAotLy8gdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotLy8gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCi0vLyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUKLS8vIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0vLwotLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLS8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotLy8KLS8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAotLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPCi0vLyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQotLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgotLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi0vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLS8vCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLQotI2lmbmRlZiBfbGNtc19pbnRlcm5hbF9ICi0KLS8vIEluY2x1ZGUgcGx1Zy1pbiBmb3VuZGF0aW9uCi0jaWZuZGVmIF9sY21zX3BsdWdpbl9ICi0jICAgaW5jbHVkZSAiLi4vaW5jbHVkZS9sY21zMl9wbHVnaW4uaCIKLSNlbmRpZgotCi0vLyBjdHlwZSBpcyBwYXJ0IG9mIEM5OSBhcyBwZXIgNy4xLjIKLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0vLyBhc3NlcnQgbWFjcm8gaXMgcGFydCBvZiBDOTkgYXMgcGVyIDcuMgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0vLyBTb21lIG5lZWRlZCBjb25zdGFudHMKLSNpZm5kZWYgTV9QSQotIyAgICAgICBkZWZpbmUgTV9QSSAgICAgICAgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgotI2VuZGlmCi0KLSNpZm5kZWYgTV9MT0cxMEUKLSMgICAgICAgZGVmaW5lIE1fTE9HMTBFICAgIDAuNDM0Mjk0NDgxOTAzMjUxODI3NjUxCi0jZW5kaWYKLQotLy8gQm9ybGFuZEMgNS41LCBWQzIwMDMgYXJlIGJyb2tlbiBvbiB0aGF0Ci0jaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IChfTVNDX1ZFUiA8IDE0MDApIC8vIDE0MDAgPT0gVkMrKyA4LjAKLSNkZWZpbmUgc2luZih4KSAoZmxvYXQpc2luKChmbG9hdCl4KQotI2RlZmluZSBzcXJ0Zih4KSAoZmxvYXQpc3FydCgoZmxvYXQpeCkKLSNlbmRpZgotCi0KLS8vIEFsaWdubWVudCBvZiBJQ0MgZmlsZSBmb3JtYXQgdXNlcyA0IGJ5dGVzIChjbXNVSW50MzJOdW1iZXIpCi0jZGVmaW5lIF9jbXNBTElHTkxPTkcoeCkgKCgoeCkrKHNpemVvZihjbXNVSW50MzJOdW1iZXIpLTEpKSAmIH4oc2l6ZW9mKGNtc1VJbnQzMk51bWJlciktMSkpCi0KLS8vIEFsaWdubWVudCB0byBtZW1vcnkgcG9pbnRlcgotI2RlZmluZSBfY21zQUxJR05NRU0oeCkgICgoKHgpKyhzaXplb2Yodm9pZCAqKSAtIDEpKSAmIH4oc2l6ZW9mKHZvaWQgKikgLSAxKSkKLQotLy8gTWF4aW11bSBlbmNvZGVhYmxlIHZhbHVlcyBpbiBmbG9hdGluZyBwb2ludAotI2RlZmluZSBNQVhfRU5DT0RFQUJMRV9YWVogICgxLjAgKyAzMjc2Ny4wLzMyNzY4LjApCi0jZGVmaW5lIE1JTl9FTkNPREVBQkxFX2FiMiAgKC0xMjguMCkKLSNkZWZpbmUgTUFYX0VOQ09ERUFCTEVfYWIyICAoKDY1NTM1LjAvMjU2LjApIC0gMTI4LjApCi0jZGVmaW5lIE1JTl9FTkNPREVBQkxFX2FiNCAgKC0xMjguMCkKLSNkZWZpbmUgTUFYX0VOQ09ERUFCTEVfYWI0ICAoMTI3LjApCi0KLS8vIE1heGltdW0gb2YgY2hhbm5lbHMgZm9yIGludGVybmFsIHBpcGVsaW5lIGV2YWx1YXRpb24KLSNkZWZpbmUgTUFYX1NUQUdFX0NIQU5ORUxTICAxMjgKLQotLy8gVW51c2VkIHBhcmFtZXRlciB3YXJuaW5nIHN1cHJlc3Npb24KLSNkZWZpbmUgY21zVU5VU0VEX1BBUkFNRVRFUih4KSAoKHZvaWQpeCkKLQotLy8gVGhlIHNwZWNpZmljYXRpb24gZm9yICJpbmxpbmUiIGlzIHNlY3Rpb24gNi43LjQgb2YgdGhlIEM5OSBzdGFuZGFyZCAoSVNPL0lFQyA5ODk5OjE5OTkpLgotLy8gdW5mb3J0dW5hdGVseSBWaXN1YWxDKysgZG9lcyBub3QgY29uZm9ybSB0aGF0Ci0jaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCi0jICAgZGVmaW5lIGNtc0lOTElORSBfX2lubGluZQotI2Vsc2UKLSMgICBkZWZpbmUgY21zSU5MSU5FIHN0YXRpYyBpbmxpbmUKLSNlbmRpZgotCi0vLyBPdGhlciByZXBsYWNlbWVudCBmdW5jdGlvbnMKLSNpZmRlZiBfTVNDX1ZFUgotIyBpZm5kZWYgc25wcmludGYKLSMgICAgICAgZGVmaW5lIHNucHJpbnRmICBfc25wcmludGYKLSMgZW5kaWYKLSMgaWZuZGVmIHZzbnByaW50ZgotIyAgICAgICBkZWZpbmUgdnNucHJpbnRmICBfdnNucHJpbnRmCi0jIGVuZGlmCi0jZW5kaWYKLQotCi0vLyBBIGZhc3Qgd2F5IHRvIGNvbnZlcnQgZnJvbS90byAxNiA8LT4gOCBiaXRzCi0jZGVmaW5lIEZST01fOF9UT18xNihyZ2IpIChjbXNVSW50MTZOdW1iZXIpICgoKChjbXNVSW50MTZOdW1iZXIpIChyZ2IpKSA8PCA4KXwocmdiKSkKLSNkZWZpbmUgRlJPTV8xNl9UT184KHJnYikgKGNtc1VJbnQ4TnVtYmVyKSAoKCgocmdiKSAqIDY1MjgxICsgODM4ODYwOCkgPj4gMjQpICYgMHhGRikKLQotLy8gQ29kZSBhbmFseXNpcyBpcyBicm9rZW4gb24gYXNzZXJ0cwotI2lmZGVmIF9NU0NfVkVSCi0jICAgIGlmIChfTVNDX1ZFUiA+PSAxNTAwKQotIyAgICAgICAgICAgIGRlZmluZSBfY21zQXNzZXJ0KGEpICB7IGFzc2VydCgoYSkpOyBfX2FuYWx5c2lzX2Fzc3VtZSgoYSkpOyB9Ci0jICAgICBlbHNlCi0jICAgICAgICAgICAgZGVmaW5lIF9jbXNBc3NlcnQoYSkgICBhc3NlcnQoKGEpKQotIyAgICAgZW5kaWYKLSNlbHNlCi0jICAgICAgZGVmaW5lIF9jbXNBc3NlcnQoYSkgICBhc3NlcnQoKGEpKQotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIERldGVybWluYW50IGxvd2VyIHRoYW4gdGhhdCBhcmUgYXNzdW1lZCB6ZXJvICh1c2VkIG9uIG1hdHJpeCBpbnZlcnQpCi0jZGVmaW5lIE1BVFJJWF9ERVRfVE9MRVJBTkNFICAgIDAuMDAwMQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBGaXhlZCBwb2ludAotI2RlZmluZSBGSVhFRF9UT19JTlQoeCkgICAgICAgICAoKHgpPj4xNikKLSNkZWZpbmUgRklYRURfUkVTVF9UT19JTlQoeCkgICAgKCh4KSYweEZGRkZVKQotI2RlZmluZSBST1VORF9GSVhFRF9UT19JTlQoeCkgICAoKCh4KSsweDgwMDApPj4xNikKLQotY21zSU5MSU5FIGNtc1MxNUZpeGVkMTZOdW1iZXIgX2Ntc1RvRml4ZWREb21haW4oaW50IGEpICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGEgKyAoKGEgKyAweDdmZmYpIC8gMHhmZmZmKTsgfQotY21zSU5MSU5FIGludCAgICAgICAgICAgICAgICAgX2Ntc0Zyb21GaXhlZERvbWFpbihjbXNTMTVGaXhlZDE2TnVtYmVyIGEpIHsgcmV0dXJuIGEgLSAoKGEgKyAweDdmZmYpID4+IDE2KTsgfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBGYXN0IGZsb29yIGNvbnZlcnNpb24gbG9naWMuIFRoYW5rcyB0byBTcmVlIEtvdGF5IGFuZCBTdHVhcnQgTml4b24KLS8vIG5vdGUgdGhhbiB0aGlzIG9ubHkgd29ya3MgaW4gdGhlIHJhbmdlIC4uLTMyNzY3Li4uKzMyNzY3IGJlY2F1c2UKLS8vIG1hbnRpc3NhIGlzIGludGVycHJldGVkIGFzIDE1LjE2IGZpeGVkIHBvaW50LgotLy8gVGhlIHVuaW9uIGlzIHRvIGF2b2lkIHBvaW50ZXIgYWxpYXNpbmcgb3Zlcm9wdGltaXphdGlvbi4KLWNtc0lOTElORSBpbnQgX2Ntc1F1aWNrRmxvb3IoY21zRmxvYXQ2NE51bWJlciB2YWwpCi17Ci0jaWZkZWYgQ01TX0RPTlRfVVNFX0ZBU1RfRkxPT1IKLSAgICByZXR1cm4gKGludCkgZmxvb3IodmFsKTsKLSNlbHNlCi0gICAgY29uc3QgY21zRmxvYXQ2NE51bWJlciBfbGNtc19kb3VibGUyZml4bWFnaWMgPSA2ODcxOTQ3NjczNi4wICogMS41OyAgLy8gMl4zNiAqIDEuNSwgKDUyLTE2PTM2KSB1c2VzIGxpbWl0ZWQgcHJlY2lzaW9uIHRvIGZsb29yCi0gICAgdW5pb24gewotICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIHZhbDsKLSAgICAgICAgaW50IGhhbHZlc1syXTsKLSAgICB9IHRlbXA7Ci0KLSAgICB0ZW1wLnZhbCA9IHZhbCArIF9sY21zX2RvdWJsZTJmaXhtYWdpYzsKLQotI2lmZGVmIENNU19VU0VfQklHX0VORElBTgotICAgIHJldHVybiB0ZW1wLmhhbHZlc1sxXSA+PiAxNjsKLSNlbHNlCi0gICAgcmV0dXJuIHRlbXAuaGFsdmVzWzBdID4+IDE2OwotI2VuZGlmCi0jZW5kaWYKLX0KLQotLy8gRmFzdCBmbG9vciByZXN0cmljdGVkIHRvIDAuLjY1NTM1LjAKLWNtc0lOTElORSBjbXNVSW50MTZOdW1iZXIgX2Ntc1F1aWNrRmxvb3JXb3JkKGNtc0Zsb2F0NjROdW1iZXIgZCkKLXsKLSAgICByZXR1cm4gKGNtc1VJbnQxNk51bWJlcikgX2Ntc1F1aWNrRmxvb3IoZCAtIDMyNzY3LjApICsgMzI3NjdVOwotfQotCi0vLyBGbG9vciB0byB3b3JkLCB0YWtpbmcgY2FyZSBvZiBzYXR1cmF0aW9uCi1jbXNJTkxJTkUgY21zVUludDE2TnVtYmVyIF9jbXNRdWlja1NhdHVyYXRlV29yZChjbXNGbG9hdDY0TnVtYmVyIGQpCi17Ci0gICAgZCArPSAwLjU7Ci0gICAgaWYgKGQgPD0gMCkgcmV0dXJuIDA7Ci0gICAgaWYgKGQgPj0gNjU1MzUuMCkgcmV0dXJuIDB4ZmZmZjsKLQotICAgIHJldHVybiBfY21zUXVpY2tGbG9vcldvcmQoZCk7Ci19Ci0KLQotLy8gUHRocmVhZCBzdXBwb3J0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWZuZGVmIENNU19OT19QVEhSRUFEUwotCi0vLyBUaGlzIGlzIHRoZSB0aHJlYWRpbmcgc3VwcG9ydC4gVW5mb3J0dW5hdGVseSwgaXQgaGFzIHRvIGJlIHBsYXRmb3JtLWRlcGVuZGVudCBiZWNhdXNlIAotLy8gd2luZG93cyBkb2VzIG5vdCBzdXBwb3J0IHB0aHJlYWRzLiAKLQotI2lmZGVmIENNU19JU19XSU5ET1dTXwotCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gMQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotCi0vLyBGcm9tOiBodHRwOi8vbG9ja2xlc3NpbmMuY29tL2FydGljbGVzL3B0aHJlYWRzX29uX3dpbmRvd3MvCi0vLyBUaGUgcHRocmVhZHMgQVBJIGhhcyBhbiBpbml0aWFsaXphdGlvbiBtYWNybyB0aGF0IGhhcyBubyBjb3JyZXNwb25kZW5jZSB0byBhbnl0aGluZyBpbiAKLS8vIHRoZSB3aW5kb3dzIEFQSS4gQnkgaW52ZXN0aWdhdGluZyB0aGUgaW50ZXJuYWwgZGVmaW5pdGlvbiBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbiB0eXBlLCAKLS8vIG9uZSBtYXkgd29yayBvdXQgaG93IHRvIGluaXRpYWxpemUgb25lIHdpdGhvdXQgY2FsbGluZyBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCkuIAotLy8gVGhlIHRyaWNrIGhlcmUgaXMgdGhhdCBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCkgaXMgbm90IGFsbG93ZWQgdG8gZmFpbC4gSXQgdHJpZXMgCi0vLyB0byBhbGxvY2F0ZSBhIGNyaXRpY2FsIHNlY3Rpb24gZGVidWcgb2JqZWN0LCBidXQgaWYgbm8gbWVtb3J5IGlzIGF2YWlsYWJsZSwgaXQgc2V0cyAKLS8vIHRoZSBwb2ludGVyIHRvIGEgc3BlY2lmaWMgdmFsdWUuIChPbmUgd291bGQgZXhwZWN0IHRoYXQgdmFsdWUgdG8gYmUgTlVMTCwgYnV0IGl0IGlzIAotLy8gYWN0dWFsbHkgKHZvaWQgKiktMSBmb3Igc29tZSByZWFzb24uKSBUaHVzIHdlIGNhbiB1c2UgdGhpcyBzcGVjaWFsIHZhbHVlIGZvciB0aGF0IAotLy8gcG9pbnRlciwgYW5kIHRoZSBjcml0aWNhbCBzZWN0aW9uIGNvZGUgd2lsbCB3b3JrLgotCi0vLyBUaGUgb3RoZXIgaW1wb3J0YW50IHBhcnQgb2YgdGhlIGNyaXRpY2FsIHNlY3Rpb24gdHlwZSB0byBpbml0aWFsaXplIGlzIHRoZSBudW1iZXIgCi0vLyBvZiB3YWl0ZXJzLiBUaGlzIGNvbnRyb2xzIHdoZXRoZXIgb3Igbm90IHRoZSBtdXRleCBpcyBsb2NrZWQuIEZvcnR1bmF0ZWx5LCB0aGlzIAotLy8gcGFydCBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbiBpcyB1bmxpa2VseSB0byBjaGFuZ2UuIEFwcGFyZW50bHksIG1hbnkgcHJvZ3JhbXMgCi0vLyBhbHJlYWR5IHRlc3QgY3JpdGljYWwgc2VjdGlvbnMgdG8gc2VlIGlmIHRoZXkgYXJlIGxvY2tlZCB1c2luZyB0aGlzIHZhbHVlLCBzbyAKLS8vIE1pY3Jvc29mdCBmZWx0IHRoYXQgaXQgd2FzIG5lY2Vzc2FyeSB0byBrZWVwIGl0IHNldCBhdCAtMSBmb3IgYW4gdW5sb2NrZWQgY3JpdGljYWwKLS8vIHNlY3Rpb24sIGV2ZW4gd2hlbiB0aGV5IGNoYW5nZWQgdGhlIHVuZGVybHlpbmcgYWxnb3JpdGhtIHRvIGJlIG1vcmUgc2NhbGFibGUuIAotLy8gVGhlIGZpbmFsIHBhcnRzIG9mIHRoZSBjcml0aWNhbCBzZWN0aW9uIG9iamVjdCBhcmUgdW5pbXBvcnRhbnQsIGFuZCBjYW4gYmUgc2V0IAotLy8gdG8gemVybyBmb3IgdGhlaXIgZGVmYXVsdHMuIFRoaXMgeWllbGRzIGFuIGluaXRpYWxpemF0aW9uIG1hY3JvOgotCi10eXBlZGVmIENSSVRJQ0FMX1NFQ1RJT04gX2Ntc011dGV4OwotCi0jZGVmaW5lIENNU19NVVRFWF9JTklUSUFMSVpFUiB7KHZvaWQqKSAtMSwtMSwwLDAsMCwwfQotCi1jbXNJTkxJTkUgaW50IF9jbXNMb2NrUHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKLXsKLQlFbnRlckNyaXRpY2FsU2VjdGlvbihtKTsKLQlyZXR1cm4gMDsKLX0KLQotY21zSU5MSU5FIGludCBfY21zVW5sb2NrUHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKLXsKLQlMZWF2ZUNyaXRpY2FsU2VjdGlvbihtKTsKLQlyZXR1cm4gMDsKLX0KLQkKLWNtc0lOTElORSBpbnQgX2Ntc0luaXRNdXRleFByaW1pdGl2ZShfY21zTXV0ZXggKm0pCi17Ci0JSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihtKTsKLQlyZXR1cm4gMDsKLX0KLQotY21zSU5MSU5FIGludCBfY21zRGVzdHJveU11dGV4UHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKLXsKLQlEZWxldGVDcml0aWNhbFNlY3Rpb24obSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWNtc0lOTElORSBpbnQgX2Ntc0VudGVyQ3JpdGljYWxTZWN0aW9uUHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKLXsKLQlFbnRlckNyaXRpY2FsU2VjdGlvbihtKTsKLQlyZXR1cm4gMDsKLX0KLQotY21zSU5MSU5FIGludCBfY21zTGVhdmVDcml0aWNhbFNlY3Rpb25QcmltaXRpdmUoX2Ntc011dGV4ICptKQotewotCUxlYXZlQ3JpdGljYWxTZWN0aW9uKG0pOwotCXJldHVybiAwOwotfQotCi0jZWxzZQotCi0vLyBSZXN0IG9mIHRoZSB3aWRlIHdvcmxkCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotCi0jZGVmaW5lIENNU19NVVRFWF9JTklUSUFMSVpFUiBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSCi10eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCBfY21zTXV0ZXg7Ci0KLQotY21zSU5MSU5FIGludCBfY21zTG9ja1ByaW1pdGl2ZShfY21zTXV0ZXggKm0pCi17Ci0JcmV0dXJuIHB0aHJlYWRfbXV0ZXhfbG9jayhtKTsKLX0KLQotY21zSU5MSU5FIGludCBfY21zVW5sb2NrUHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKLXsKLQlyZXR1cm4gcHRocmVhZF9tdXRleF91bmxvY2sobSk7Ci19Ci0JCi1jbXNJTkxJTkUgaW50IF9jbXNJbml0TXV0ZXhQcmltaXRpdmUoX2Ntc011dGV4ICptKQotewotCXJldHVybiBwdGhyZWFkX211dGV4X2luaXQobSwgTlVMTCk7Ci19Ci0KLWNtc0lOTElORSBpbnQgX2Ntc0Rlc3Ryb3lNdXRleFByaW1pdGl2ZShfY21zTXV0ZXggKm0pCi17Ci0JcmV0dXJuIHB0aHJlYWRfbXV0ZXhfZGVzdHJveShtKTsKLX0KLQotY21zSU5MSU5FIGludCBfY21zRW50ZXJDcml0aWNhbFNlY3Rpb25QcmltaXRpdmUoX2Ntc011dGV4ICptKQotewotCXJldHVybiBwdGhyZWFkX211dGV4X2xvY2sobSk7Ci19Ci0KLWNtc0lOTElORSBpbnQgX2Ntc0xlYXZlQ3JpdGljYWxTZWN0aW9uUHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKLXsKLQlyZXR1cm4gcHRocmVhZF9tdXRleF91bmxvY2sobSk7Ci19Ci0KLSNlbmRpZgotI2Vsc2UKLQotI2RlZmluZSBDTVNfTVVURVhfSU5JVElBTElaRVIgMAotdHlwZWRlZiBpbnQgX2Ntc011dGV4OwotCi0KLWNtc0lOTElORSBpbnQgX2Ntc0xvY2tQcmltaXRpdmUoX2Ntc011dGV4ICptKQotewotCXJldHVybiAwOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobSk7Ci19Ci0KLWNtc0lOTElORSBpbnQgX2Ntc1VubG9ja1ByaW1pdGl2ZShfY21zTXV0ZXggKm0pCi17Ci0JcmV0dXJuIDA7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihtKTsKLX0KLQkKLWNtc0lOTElORSBpbnQgX2Ntc0luaXRNdXRleFByaW1pdGl2ZShfY21zTXV0ZXggKm0pCi17Ci0JcmV0dXJuIDA7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihtKTsKLX0KLQotY21zSU5MSU5FIGludCBfY21zRGVzdHJveU11dGV4UHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKLXsKLQlyZXR1cm4gMDsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG0pOwotfQotCi1jbXNJTkxJTkUgaW50IF9jbXNFbnRlckNyaXRpY2FsU2VjdGlvblByaW1pdGl2ZShfY21zTXV0ZXggKm0pCi17Ci0JcmV0dXJuIDA7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihtKTsKLX0KLQotY21zSU5MSU5FIGludCBfY21zTGVhdmVDcml0aWNhbFNlY3Rpb25QcmltaXRpdmUoX2Ntc011dGV4ICptKQotewotCXJldHVybiAwOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobSk7Ci19Ci0jZW5kaWYKLQotLy8gUGx1Zy1JbiByZWdpc3RyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFNwZWNpYWxpemVkIGZ1bmN0aW9uIGZvciBwbHVnLWluIG1lbW9yeSBtYW5hZ2VtZW50LiBObyBwYWlyaW5nIGZyZWUoKSBzaW5jZSB3aG9sZSBwb29sIGlzIGZyZWVkIGF0IG9uY2UuCi12b2lkKiBfY21zUGx1Z2luTWFsbG9jKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgc2l6ZSk7Ci0KLS8vIE1lbW9yeSBtYW5hZ2VtZW50Ci1jbXNCb29sICAgX2Ntc1JlZ2lzdGVyTWVtSGFuZGxlclBsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogUGx1Z2luKTsKLQotLy8gSW50ZXJwb2xhdGlvbgotY21zQm9vbCAgX2Ntc1JlZ2lzdGVySW50ZXJwUGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOwotCi0vLyBQYXJhbWV0cmljIGN1cnZlcwotY21zQm9vbCAgX2Ntc1JlZ2lzdGVyUGFyYW1ldHJpY0N1cnZlc1BsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogUGx1Z2luKTsKLQotLy8gRm9ybWF0dGVycyBtYW5hZ2VtZW50Ci1jbXNCb29sICBfY21zUmVnaXN0ZXJGb3JtYXR0ZXJzUGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOwotCi0vLyBUYWcgdHlwZSBtYW5hZ2VtZW50Ci1jbXNCb29sICBfY21zUmVnaXN0ZXJUYWdUeXBlUGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOwotCi0vLyBUYWcgbWFuYWdlbWVudAotY21zQm9vbCAgX2Ntc1JlZ2lzdGVyVGFnUGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOwotCi0vLyBJbnRlbnQgbWFuYWdlbWVudAotY21zQm9vbCAgX2Ntc1JlZ2lzdGVyUmVuZGVyaW5nSW50ZW50UGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOwotCi0vLyBNdWx0aSBQcm9jZXNzIGVsZW1lbnRzCi1jbXNCb29sICBfY21zUmVnaXN0ZXJNdWx0aVByb2Nlc3NFbGVtZW50UGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOwotCi0vLyBPcHRpbWl6YXRpb24KLWNtc0Jvb2wgIF9jbXNSZWdpc3Rlck9wdGltaXphdGlvblBsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogUGx1Z2luKTsKLQotLy8gVHJhbnNmb3JtCi1jbXNCb29sICBfY21zUmVnaXN0ZXJUcmFuc2Zvcm1QbHVnaW4oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1BsdWdpbkJhc2UqIFBsdWdpbik7Ci0KLS8vIE11dGV4Ci1jbXNCb29sIF9jbXNSZWdpc3Rlck11dGV4UGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gU3ViYWxsb2NhdG9ycy4gCi10eXBlZGVmIHN0cnVjdCBfY21zU3ViQWxsb2NhdG9yX2NodW5rX3N0IHsKLQotICAgIGNtc1VJbnQ4TnVtYmVyKiBCbG9jazsKLSAgICBjbXNVSW50MzJOdW1iZXIgQmxvY2tTaXplOwotICAgIGNtc1VJbnQzMk51bWJlciBVc2VkOwotCi0gICAgc3RydWN0IF9jbXNTdWJBbGxvY2F0b3JfY2h1bmtfc3QqIG5leHQ7Ci0KLX0gX2Ntc1N1YkFsbG9jYXRvcl9jaHVuazsKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBjbXNDb250ZXh0IENvbnRleHRJRDsKLSAgICBfY21zU3ViQWxsb2NhdG9yX2NodW5rKiBoOwotCi19IF9jbXNTdWJBbGxvY2F0b3I7Ci0KLQotX2Ntc1N1YkFsbG9jYXRvciogX2Ntc0NyZWF0ZVN1YkFsbG9jKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgSW5pdGlhbCk7Ci12b2lkICAgICAgICAgICAgICBfY21zU3ViQWxsb2NEZXN0cm95KF9jbXNTdWJBbGxvY2F0b3IqIHMpOwotdm9pZCogICAgICAgICAgICAgX2Ntc1N1YkFsbG9jKF9jbXNTdWJBbGxvY2F0b3IqIHMsIGNtc1VJbnQzMk51bWJlciBzaXplKTsKLXZvaWQqICAgICAgICAgICAgIF9jbXNTdWJBbGxvY0R1cChfY21zU3ViQWxsb2NhdG9yKiBzLCBjb25zdCB2b2lkICpwdHIsIGNtc1VJbnQzMk51bWJlciBzaXplKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBUaGUgY29udGV4dCBjbGllbnRzLiAKLXR5cGVkZWYgZW51bSB7Ci0KLSAgICBVc2VyUHRyLCAgICAgICAgICAgIC8vIFVzZXItZGVmaW5lZCBwb2ludGVyCi0gICAgTG9nZ2VyLAotICAgIEFsYXJtQ29kZXNDb250ZXh0LAotICAgIEFkYXB0YXRpb25TdGF0ZUNvbnRleHQsIAotICAgIE1lbVBsdWdpbiwKLSAgICBJbnRlcnBQbHVnaW4sCi0gICAgQ3VydmVzUGx1Z2luLAotICAgIEZvcm1hdHRlcnNQbHVnaW4sCi0gICAgVGFnVHlwZVBsdWdpbiwKLSAgICBUYWdQbHVnaW4sCi0gICAgSW50ZW50UGx1Z2luLAotICAgIE1QRVBsdWdpbiwKLSAgICBPcHRpbWl6YXRpb25QbHVnaW4sCi0gICAgVHJhbnNmb3JtUGx1Z2luLAotICAgIE11dGV4UGx1Z2luLAotCi0gICAgLy8gTGFzdCBpbiBsaXN0Ci0gICAgTWVtb3J5Q2xpZW50TWF4Ci0KLX0gX2Ntc01lbW9yeUNsaWVudDsKLQotCi0vLyBDb250YWluZXIgZm9yIG1lbW9yeSBtYW5hZ2VtZW50IHBsdWctaW4uCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBfY21zTWFsbG9jRm5QdHJUeXBlICAgICBNYWxsb2NQdHI7ICAgIAotICAgIF9jbXNNYWxsb1plcm9jRm5QdHJUeXBlIE1hbGxvY1plcm9QdHI7Ci0gICAgX2Ntc0ZyZWVGblB0clR5cGUgICAgICAgRnJlZVB0cjsKLSAgICBfY21zUmVhbGxvY0ZuUHRyVHlwZSAgICBSZWFsbG9jUHRyOwotICAgIF9jbXNDYWxsb2NGblB0clR5cGUgICAgIENhbGxvY1B0cjsKLSAgICBfY21zRHVwRm5QdHJUeXBlICAgICAgICBEdXBQdHI7Ci0KLX0gX2Ntc01lbVBsdWdpbkNodW5rVHlwZTsKLQotLy8gQ29weSBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbiBwb2ludGVycyBmcm9tIHBsdWctaW4gdG8gY2h1bmssIHRha2luZyBjYXJlIG9mIG1pc3Npbmcgcm91dGluZXMKLXZvaWQgIF9jbXNJbnN0YWxsQWxsb2NGdW5jdGlvbnMoY21zUGx1Z2luTWVtSGFuZGxlciogUGx1Z2luLCBfY21zTWVtUGx1Z2luQ2h1bmtUeXBlKiBwdHIpOwotCi0vLyBJbnRlcm5hbCBzdHJ1Y3R1cmUgZm9yIGNvbnRleHQKLXN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QgewotICAgIAotICAgIHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIE5leHQ7ICAvLyBQb2ludHMgdG8gbmV4dCBjb250ZXh0IGluIHRoZSBuZXcgc3R5bGUKLSAgICBfY21zU3ViQWxsb2NhdG9yKiBNZW1Qb29sOyAgICAgICAgLy8gVGhlIG1lbW9yeSBwb29sIHRoYXQgc3RvcmVzIGNvbnRleHQgZGF0YQotICAgIAotICAgIHZvaWQqIGNodW5rc1tNZW1vcnlDbGllbnRNYXhdOyAgICAvLyBhcnJheSBvZiBwb2ludGVycyB0byBjbGllbnQgY2h1bmtzLiBNZW1vcnkgaXRzZWxmIGlzIGhvbGQgaW4gdGhlIHN1YmFsbG9jYXRvci4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIE5VTEwsIHRoZW4gaXQgcmV2ZXJ0cyB0byBnbG9iYWwgQ29udGV4dDAKLQotICAgIF9jbXNNZW1QbHVnaW5DaHVua1R5cGUgRGVmYXVsdE1lbW9yeU1hbmFnZXI7ICAvLyBUaGUgYWxsb2NhdG9ycyB1c2VkIGZvciBjcmVhdGluZyB0aGUgY29udGV4dCBpdHNlbGYuIENhbm5vdCBiZSBvdmVycmlkZW4KLX07Ci0KLS8vIFJldHVybnMgYSBwb2ludGVyIHRvIGEgdmFsaWQgY29udGV4dCBzdHJ1Y3R1cmUsIGluY2x1ZGluZyB0aGUgZ2xvYmFsIG9uZSBpZiBpZCBpcyB6ZXJvLiAKLS8vIFZlcmlmaWVzIHRoZSBtYWdpYyBudW1iZXIuCi1zdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBfY21zR2V0Q29udGV4dChjbXNDb250ZXh0IENvbnRleHRJRCk7Ci0KLS8vIFJldHVybnMgdGhlIGJsb2NrIGFzc2lnbmVkIHRvIHRoZSBzcGVjaWZpYyB6b25lLiAKLXZvaWQqICAgICBfY21zQ29udGV4dEdldENsaWVudENodW5rKGNtc0NvbnRleHQgaWQsIF9jbXNNZW1vcnlDbGllbnQgbWMpOwotCi0KLS8vIENodW5rcyBvZiBjb250ZXh0IG1lbW9yeSBieSBwbHVnLWluIGNsaWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFRob3NlIHN0cnVjdHVyZXMgZW5jYXBzdWxhdGVzIGFsbCB2YXJpYWJsZXMgbmVlZGVkIGJ5IHRoZSBzZXZlcmFsIGNvbnRleHQgY2xpZW50cyAobW9zdGx5IHBsdWctaW5zKQotCi0vLyBDb250YWluZXIgZm9yIGVycm9yIGxvZ2dlciAtLSBub3QgYSBwbHVnLWluCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBjbXNMb2dFcnJvckhhbmRsZXJGdW5jdGlvbiBMb2dFcnJvckhhbmRsZXI7ICAvLyBTZXQgdG8gTlVMTCBmb3IgQ29udGV4dDAgZmFsbGJhY2sKLQotfSBfY21zTG9nRXJyb3JDaHVua1R5cGU7Ci0KLS8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3IgZXJyb3IgbG9nZ2VyCi1leHRlcm4gIF9jbXNMb2dFcnJvckNodW5rVHlwZSAgX2Ntc0xvZ0Vycm9yQ2h1bms7Ci0KLS8vIEFsbG9jYXRlIGFuZCBpbml0IGVycm9yIGxvZ2dlciBjb250YWluZXIuIAotdm9pZCBfY21zQWxsb2NMb2dFcnJvckNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKTsKLQotLy8gQ29udGFpbmVyIGZvciBhbGFybSBjb2RlcyAtLSBub3QgYSBwbHVnLWluCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAKLSAgICBjbXNVSW50MTZOdW1iZXIgQWxhcm1Db2Rlc1tjbXNNQVhDSEFOTkVMU107Ci0KLX0gX2Ntc0FsYXJtQ29kZXNDaHVua1R5cGU7Ci0KLS8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3IgYWxhcm0gY29kZXMKLWV4dGVybiAgX2Ntc0FsYXJtQ29kZXNDaHVua1R5cGUgX2Ntc0FsYXJtQ29kZXNDaHVuazsKLQotLy8gQWxsb2NhdGUgYW5kIGluaXQgYWxhcm0gY29kZXMgY29udGFpbmVyLiAKLXZvaWQgX2Ntc0FsbG9jQWxhcm1Db2Rlc0NodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKTsKLQotLy8gQ29udGFpbmVyIGZvciBhZGFwdGF0aW9uIHN0YXRlIC0tIG5vdCBhIHBsdWctaW4KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAKLSAgICBjbXNGbG9hdDY0TnVtYmVyICBBZGFwdGF0aW9uU3RhdGU7Ci0KLX0gX2Ntc0FkYXB0YXRpb25TdGF0ZUNodW5rVHlwZTsKLQotLy8gVGhlIGdsb2JhbCBDb250ZXh0MCBzdG9yYWdlIGZvciBhZGFwdGF0aW9uIHN0YXRlCi1leHRlcm4gIF9jbXNBZGFwdGF0aW9uU3RhdGVDaHVua1R5cGUgICAgX2Ntc0FkYXB0YXRpb25TdGF0ZUNodW5rOwotCi0vLyBBbGxvY2F0ZSBhbmQgaW5pdCBhZGFwdGF0aW9uIHN0YXRlIGNvbnRhaW5lci4KLXZvaWQgX2Ntc0FsbG9jQWRhcHRhdGlvblN0YXRlQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKTsKLQotCi0vLyBUaGUgZ2xvYmFsIENvbnRleHQwIHN0b3JhZ2UgZm9yIG1lbW9yeSBtYW5hZ2VtZW50Ci1leHRlcm4gIF9jbXNNZW1QbHVnaW5DaHVua1R5cGUgX2Ntc01lbVBsdWdpbkNodW5rOwotCi0vLyBBbGxvY2F0ZSBhbmQgaW5pdCBtZW1vcnkgbWFuYWdlbWVudCBjb250YWluZXIuCi12b2lkIF9jbXNBbGxvY01lbVBsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYyk7Ci0KLS8vIENvbnRhaW5lciBmb3IgaW50ZXJwb2xhdGlvbiBwbHVnLWluCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBjbXNJbnRlcnBGbkZhY3RvcnkgSW50ZXJwb2xhdG9yczsKLQotfSBfY21zSW50ZXJwUGx1Z2luQ2h1bmtUeXBlOwotCi0vLyBUaGUgZ2xvYmFsIENvbnRleHQwIHN0b3JhZ2UgZm9yIGludGVycG9sYXRpb24gcGx1Zy1pbgotZXh0ZXJuICBfY21zSW50ZXJwUGx1Z2luQ2h1bmtUeXBlIF9jbXNJbnRlcnBQbHVnaW5DaHVuazsKLQotLy8gQWxsb2NhdGUgYW5kIGluaXQgaW50ZXJwb2xhdGlvbiBjb250YWluZXIuCi12b2lkIF9jbXNBbGxvY0ludGVycFBsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYyk7Ci0KLS8vIENvbnRhaW5lciBmb3IgcGFyYW1ldHJpYyBjdXJ2ZXMgcGx1Zy1pbgotdHlwZWRlZiBzdHJ1Y3QgewotCi0gICAgc3RydWN0IF9jbXNQYXJhbWV0cmljQ3VydmVzQ29sbGVjdGlvbl9zdCogUGFyYW1ldHJpY0N1cnZlczsKLQotfSBfY21zQ3VydmVzUGx1Z2luQ2h1bmtUeXBlOwotCi0vLyBUaGUgZ2xvYmFsIENvbnRleHQwIHN0b3JhZ2UgZm9yIHRvbmUgY3VydmVzIHBsdWctaW4KLWV4dGVybiAgX2Ntc0N1cnZlc1BsdWdpbkNodW5rVHlwZSBfY21zQ3VydmVzUGx1Z2luQ2h1bms7Ci0KLS8vIEFsbG9jYXRlIGFuZCBpbml0IHBhcmFtZXRyaWMgY3VydmVzIGNvbnRhaW5lci4KLXZvaWQgX2Ntc0FsbG9jQ3VydmVzUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYyk7Ci0KLS8vIENvbnRhaW5lciBmb3IgZm9ybWF0dGVycyBwbHVnLWluCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBzdHJ1Y3QgX2Ntc19mb3JtYXR0ZXJzX2ZhY3RvcnlfbGlzdCogRmFjdG9yeUxpc3Q7Ci0KLX0gX2Ntc0Zvcm1hdHRlcnNQbHVnaW5DaHVua1R5cGU7Ci0KLS8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3IgZm9ybWF0dGVycyBwbHVnLWluCi1leHRlcm4gIF9jbXNGb3JtYXR0ZXJzUGx1Z2luQ2h1bmtUeXBlIF9jbXNGb3JtYXR0ZXJzUGx1Z2luQ2h1bms7Ci0KLS8vIEFsbG9jYXRlIGFuZCBpbml0IGZvcm1hdHRlcnMgY29udGFpbmVyLgotdm9pZCBfY21zQWxsb2NGb3JtYXR0ZXJzUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpOwotCi0vLyBUaGlzIGNodW5rIHR5cGUgaXMgc2hhcmVkIGJ5IFRhZ1R5cGUgcGx1Zy1pbiBhbmQgTVBFIFBsdWctaW4KLXR5cGVkZWYgc3RydWN0IHsKLQotICAgIHN0cnVjdCBfY21zVGFnVHlwZUxpbmtlZExpc3Rfc3QqIFRhZ1R5cGVzOwotCi19IF9jbXNUYWdUeXBlUGx1Z2luQ2h1bmtUeXBlOwotCi0KLS8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3IgdGFnIHR5cGVzIHBsdWctaW4KLWV4dGVybiAgX2Ntc1RhZ1R5cGVQbHVnaW5DaHVua1R5cGUgICAgICBfY21zVGFnVHlwZVBsdWdpbkNodW5rOwotCi0KLS8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3IgbXVsdCBwcm9jZXNzIGVsZW1lbnRzIHBsdWctaW4KLWV4dGVybiAgX2Ntc1RhZ1R5cGVQbHVnaW5DaHVua1R5cGUgICAgICBfY21zTVBFVHlwZVBsdWdpbkNodW5rOwotCi0vLyBBbGxvY2F0ZSBhbmQgaW5pdCBUYWcgdHlwZXMgY29udGFpbmVyLgotdm9pZCBfY21zQWxsb2NUYWdUeXBlUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKTsKLS8vIEFsbG9jYXRlIGFuZCBpbml0IE1QRSBjb250YWluZXIuCi12b2lkIF9jbXNBbGxvY01QRVR5cGVQbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpOwotLy8gQ29udGFpbmVyIGZvciB0YWcgcGx1Zy1pbgotdHlwZWRlZiBzdHJ1Y3QgewotICAgCi0gICAgc3RydWN0IF9jbXNUYWdMaW5rZWRMaXN0X3N0KiBUYWc7Ci0KLX0gX2Ntc1RhZ1BsdWdpbkNodW5rVHlwZTsKLQotCi0vLyBUaGUgZ2xvYmFsIENvbnRleHQwIHN0b3JhZ2UgZm9yIHRhZyBwbHVnLWluCi1leHRlcm4gIF9jbXNUYWdQbHVnaW5DaHVua1R5cGUgX2Ntc1RhZ1BsdWdpbkNodW5rOwotCi0vLyBBbGxvY2F0ZSBhbmQgaW5pdCBUYWcgY29udGFpbmVyLgotdm9pZCBfY21zQWxsb2NUYWdQbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKTsgCi0KLS8vIENvbnRhaW5lciBmb3IgaW50ZW50cyBwbHVnLWluCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBzdHJ1Y3QgX2Ntc19pbnRlbnRzX2xpc3QqIEludGVudHM7Ci0KLX0gX2Ntc0ludGVudHNQbHVnaW5DaHVua1R5cGU7Ci0KLQotLy8gVGhlIGdsb2JhbCBDb250ZXh0MCBzdG9yYWdlIGZvciBpbnRlbnRzIHBsdWctaW4KLWV4dGVybiAgX2Ntc0ludGVudHNQbHVnaW5DaHVua1R5cGUgX2Ntc0ludGVudHNQbHVnaW5DaHVuazsKLQotLy8gQWxsb2NhdGUgYW5kIGluaXQgaW50ZW50cyBjb250YWluZXIuCi12b2lkIF9jbXNBbGxvY0ludGVudHNQbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpOyAKLQotLy8gQ29udGFpbmVyIGZvciBvcHRpbWl6YXRpb24gcGx1Zy1pbgotdHlwZWRlZiBzdHJ1Y3QgewotCi0gICAgc3RydWN0IF9jbXNPcHRpbWl6YXRpb25Db2xsZWN0aW9uX3N0KiBPcHRpbWl6YXRpb25Db2xsZWN0aW9uOwotCi19IF9jbXNPcHRpbWl6YXRpb25QbHVnaW5DaHVua1R5cGU7Ci0KLQotLy8gVGhlIGdsb2JhbCBDb250ZXh0MCBzdG9yYWdlIGZvciBvcHRpbWl6ZXJzIHBsdWctaW4KLWV4dGVybiAgX2Ntc09wdGltaXphdGlvblBsdWdpbkNodW5rVHlwZSBfY21zT3B0aW1pemF0aW9uUGx1Z2luQ2h1bms7Ci0KLS8vIEFsbG9jYXRlIGFuZCBpbml0IG9wdGltaXplcnMgY29udGFpbmVyLgotdm9pZCBfY21zQWxsb2NPcHRpbWl6YXRpb25QbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpOwotCi0vLyBDb250YWluZXIgZm9yIHRyYW5zZm9ybSBwbHVnLWluCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBzdHJ1Y3QgX2Ntc1RyYW5zZm9ybUNvbGxlY3Rpb25fc3QqIFRyYW5zZm9ybUNvbGxlY3Rpb247Ci0KLX0gX2Ntc1RyYW5zZm9ybVBsdWdpbkNodW5rVHlwZTsKLQotLy8gVGhlIGdsb2JhbCBDb250ZXh0MCBzdG9yYWdlIGZvciBmdWxsLXRyYW5zZm9ybSByZXBsYWNlbWVudCBwbHVnLWluCi1leHRlcm4gIF9jbXNUcmFuc2Zvcm1QbHVnaW5DaHVua1R5cGUgX2Ntc1RyYW5zZm9ybVBsdWdpbkNodW5rOwotCi0vLyBBbGxvY2F0ZSBhbmQgaW5pdCB0cmFuc2Zvcm0gY29udGFpbmVyLgotdm9pZCBfY21zQWxsb2NUcmFuc2Zvcm1QbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYyk7Ci0KLS8vIENvbnRhaW5lciBmb3IgbXV0ZXggcGx1Zy1pbgotdHlwZWRlZiBzdHJ1Y3QgewotCi0gICAgX2Ntc0NyZWF0ZU11dGV4Rm5QdHJUeXBlICBDcmVhdGVNdXRleFB0cjsKLSAgICBfY21zRGVzdHJveU11dGV4Rm5QdHJUeXBlIERlc3Ryb3lNdXRleFB0cjsKLSAgICBfY21zTG9ja011dGV4Rm5QdHJUeXBlICAgIExvY2tNdXRleFB0cjsKLSAgICBfY21zVW5sb2NrTXV0ZXhGblB0clR5cGUgIFVubG9ja011dGV4UHRyOwotCi19IF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZTsKLQotLy8gVGhlIGdsb2JhbCBDb250ZXh0MCBzdG9yYWdlIGZvciBtdXRleCBwbHVnLWluCi1leHRlcm4gIF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSBfY21zTXV0ZXhQbHVnaW5DaHVuazsKLQotLy8gQWxsb2NhdGUgYW5kIGluaXQgbXV0ZXggY29udGFpbmVyLgotdm9pZCBfY21zQWxsb2NNdXRleFBsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTUxVIGludGVybmFsIHJlcHJlc2VudGF0aW9uCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBjbXNVSW50MTZOdW1iZXIgTGFuZ3VhZ2U7Ci0gICAgY21zVUludDE2TnVtYmVyIENvdW50cnk7Ci0KLSAgICBjbXNVSW50MzJOdW1iZXIgU3RyVzsgICAgICAgLy8gT2Zmc2V0IHRvIGN1cnJlbnQgdW5pY29kZSBzdHJpbmcKLSAgICBjbXNVSW50MzJOdW1iZXIgTGVuOyAgICAgICAgLy8gTGVuZ3RoIGluIGJ5dGVzCi0KLX0gX2Ntc01MVWVudHJ5OwotCi1zdHJ1Y3QgX2Ntc19NTFVfc3RydWN0IHsKLQotICAgIGNtc0NvbnRleHQgQ29udGV4dElEOwotCi0gICAgLy8gVGhlIGRpcmVjdG9yeQotICAgIGludCBBbGxvY2F0ZWRFbnRyaWVzOwotICAgIGludCBVc2VkRW50cmllczsKLSAgICBfY21zTUxVZW50cnkqIEVudHJpZXM7ICAgICAvLyBBcnJheSBvZiBwb2ludGVycyB0byBzdHJpbmdzIGFsbG9jYXRlZCBpbiBNZW1Qb29sCi0KLSAgICAvLyBUaGUgUG9vbAotICAgIGNtc1VJbnQzMk51bWJlciBQb29sU2l6ZTsgIC8vIFRoZSBtYXhpbXVtIGFsbG9jYXRlZCBzaXplCi0gICAgY21zVUludDMyTnVtYmVyIFBvb2xVc2VkOyAgLy8gVGhlIHVzZWQgc2l6ZQotICAgIHZvaWQqICBNZW1Qb29sOyAgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gYmVnaW4gb2YgbWVtb3J5IHBvb2wKLX07Ci0KLS8vIE5hbWVkIGNvbG9yIGxpc3QgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24KLXR5cGVkZWYgc3RydWN0IHsKLQotICAgIGNoYXIgTmFtZVtjbXNNQVhfUEFUSF07Ci0gICAgY21zVUludDE2TnVtYmVyIFBDU1szXTsKLSAgICBjbXNVSW50MTZOdW1iZXIgRGV2aWNlQ29sb3JhbnRbY21zTUFYQ0hBTk5FTFNdOwotCi19IF9jbXNOQU1FRENPTE9SOwotCi1zdHJ1Y3QgX2Ntc19OQU1FRENPTE9STElTVF9zdHJ1Y3QgewotCi0gICAgY21zVUludDMyTnVtYmVyIG5Db2xvcnM7Ci0gICAgY21zVUludDMyTnVtYmVyIEFsbG9jYXRlZDsKLSAgICBjbXNVSW50MzJOdW1iZXIgQ29sb3JhbnRDb3VudDsKLQotICAgIGNoYXIgUHJlZml4WzMzXTsgICAgICAvLyBQcmVmaXggYW5kIHN1ZmZpeCBhcmUgZGVmaW5lZCB0byBiZSAzMiBjaGFyYWN0ZXJzIGF0IG1vc3QKLSAgICBjaGFyIFN1ZmZpeFszM107Ci0KLSAgICBfY21zTkFNRURDT0xPUiogTGlzdDsKLQotICAgIGNtc0NvbnRleHQgQ29udGV4dElEOwotfTsKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFRoaXMgaXMgdGhlIGludGVybmFsIHN0cnVjdCBob2xkaW5nIHByb2ZpbGUgZGV0YWlscy4KLQotLy8gTWF4aW11bSBzdXBwb3J0ZWQgdGFncyBpbiBhIHByb2ZpbGUKLSNkZWZpbmUgTUFYX1RBQkxFX1RBRyAgICAgICAxMDAKLQotdHlwZWRlZiBzdHJ1Y3QgX2Ntc19pY2Nwcm9maWxlX3N0cnVjdCB7Ci0KLSAgICAvLyBJL08gaGFuZGxlcgotICAgIGNtc0lPSEFORExFUiogICAgICAgICAgICBJT2hhbmRsZXI7Ci0KLSAgICAvLyBUaGUgdGhyZWFkIElECi0gICAgY21zQ29udGV4dCAgICAgICAgICAgICAgIENvbnRleHRJRDsKLQotICAgIC8vIENyZWF0aW9uIHRpbWUKLSAgICBzdHJ1Y3QgdG0gICAgICAgICAgICAgICAgQ3JlYXRlZDsKLQotICAgIC8vIE9ubHkgbW9zdCBpbXBvcnRhbnQgaXRlbXMgZm91bmQgaW4gSUNDIHByb2ZpbGVzCi0gICAgY21zVUludDMyTnVtYmVyICAgICAgICAgIFZlcnNpb247Ci0gICAgY21zUHJvZmlsZUNsYXNzU2lnbmF0dXJlIERldmljZUNsYXNzOwotICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgICBDb2xvclNwYWNlOwotICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgICBQQ1M7Ci0gICAgY21zVUludDMyTnVtYmVyICAgICAgICAgIFJlbmRlcmluZ0ludGVudDsKLQotICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgICBmbGFnczsKLSAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgICAgbWFudWZhY3R1cmVyLCBtb2RlbDsKLSAgICBjbXNVSW50NjROdW1iZXIgICAgICAgICAgYXR0cmlidXRlczsKLSAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgICAgY3JlYXRvcjsKLQotICAgIGNtc1Byb2ZpbGVJRCAgICAgICAgICAgICBQcm9maWxlSUQ7Ci0KLSAgICAvLyBEaWN0aW9uYXJ5Ci0gICAgY21zVUludDMyTnVtYmVyICAgICAgICAgIFRhZ0NvdW50OwotICAgIGNtc1RhZ1NpZ25hdHVyZSAgICAgICAgICBUYWdOYW1lc1tNQVhfVEFCTEVfVEFHXTsKLSAgICBjbXNUYWdTaWduYXR1cmUgICAgICAgICAgVGFnTGlua2VkW01BWF9UQUJMRV9UQUddOyAgICAgICAgICAgLy8gVGhlIHRhZyB0byB3aWNoIGlzIGxpbmtlZCAoMD1ub25lKQotICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgICBUYWdTaXplc1tNQVhfVEFCTEVfVEFHXTsgICAgICAgICAgICAvLyBTaXplIG9uIGRpc2sKLSAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgICAgVGFnT2Zmc2V0c1tNQVhfVEFCTEVfVEFHXTsKLSAgICBjbXNCb29sICAgICAgICAgICAgICAgICAgVGFnU2F2ZUFzUmF3W01BWF9UQUJMRV9UQUddOyAgICAgICAgLy8gVHJ1ZSB0byB3cml0ZSB1bmNvb2tlZAotICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgICBUYWdQdHJzW01BWF9UQUJMRV9UQUddOwotICAgIGNtc1RhZ1R5cGVIYW5kbGVyKiAgICAgICBUYWdUeXBlSGFuZGxlcnNbTUFYX1RBQkxFX1RBR107ICAgICAvLyBTYW1lIHN0cnVjdHVyZSBtYXkgYmUgc2VyaWFsaXplZCBvbiBkaWZmZXJlbnQgdHlwZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVwZW5kaW5nIG9uIHByb2ZpbGUgdmVyc2lvbiwgc28gd2Uga2VlcCB0cmFjayBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSBoYW5kbGVyIGZvciBlYWNoIHRhZyBpbiB0aGUgbGlzdC4KLSAgICAvLyBTcGVjaWFsCi0gICAgY21zQm9vbCAgICAgICAgICAgICAgICAgIElzV3JpdGU7Ci0KLSAgICAvLyBLZWVwIGEgbXV0ZXggZm9yIGNtc1JlYWRUYWcgLS0gTm90ZSB0aGF0IHRoaXMgb25seSB3b3JrcyBpZiB0aGUgdXNlciBpbmNsdWRlcyBhIG11dGV4IHBsdWdpbgotICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgICBVc3JNdXRleDsKLQotfSBfY21zSUNDUFJPRklMRTsKLQotLy8gSU8gaGVscGVycyBmb3IgcHJvZmlsZXMKLWNtc0Jvb2wgICAgICAgICAgICAgIF9jbXNSZWFkSGVhZGVyKF9jbXNJQ0NQUk9GSUxFKiBJY2MpOwotY21zQm9vbCAgICAgICAgICAgICAgX2Ntc1dyaXRlSGVhZGVyKF9jbXNJQ0NQUk9GSUxFKiBJY2MsIGNtc1VJbnQzMk51bWJlciBVc2VkU3BhY2UpOwotaW50ICAgICAgICAgICAgICAgICAgX2Ntc1NlYXJjaFRhZyhfY21zSUNDUFJPRklMRSogSWNjLCBjbXNUYWdTaWduYXR1cmUgc2lnLCBjbXNCb29sIGxGb2xsb3dMaW5rcyk7Ci0KLS8vIFRhZyB0eXBlcwotY21zVGFnVHlwZUhhbmRsZXIqICAgX2Ntc0dldFRhZ1R5cGVIYW5kbGVyKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNUYWdUeXBlU2lnbmF0dXJlIHNpZyk7Ci1jbXNUYWdUeXBlU2lnbmF0dXJlICBfY21zR2V0VGFnVHJ1ZVR5cGUoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1RhZ1NpZ25hdHVyZSBzaWcpOwotY21zVGFnRGVzY3JpcHRvciogICAgX2Ntc0dldFRhZ0Rlc2NyaXB0b3IoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1RhZ1NpZ25hdHVyZSBzaWcpOwotCi0vLyBFcnJvciBsb2dnaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkICAgICAgICAgICAgICAgICBfY21zVGFnU2lnbmF0dXJlMlN0cmluZyhjaGFyIFN0cmluZ1s1XSwgY21zVGFnU2lnbmF0dXJlIHNpZyk7Ci0KLS8vIEludGVycG9sYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNtc0ludGVycFBhcmFtcyogICAgIF9jbXNDb21wdXRlSW50ZXJwUGFyYW1zKGNtc0NvbnRleHQgQ29udGV4dElELCBpbnQgblNhbXBsZXMsIGludCBJbnB1dENoYW4sIGludCBPdXRwdXRDaGFuLCBjb25zdCB2b2lkKiBUYWJsZSwgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOwotY21zSW50ZXJwUGFyYW1zKiAgICAgX2Ntc0NvbXB1dGVJbnRlcnBQYXJhbXNFeChjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3QgY21zVUludDMyTnVtYmVyIG5TYW1wbGVzW10sIGludCBJbnB1dENoYW4sIGludCBPdXRwdXRDaGFuLCBjb25zdCB2b2lkKiBUYWJsZSwgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOwotdm9pZCAgICAgICAgICAgICAgICAgX2Ntc0ZyZWVJbnRlcnBQYXJhbXMoY21zSW50ZXJwUGFyYW1zKiBwKTsKLWNtc0Jvb2wgICAgICAgICAgICAgIF9jbXNTZXRJbnRlcnBvbGF0aW9uUm91dGluZShjbXNDb250ZXh0IENvbnRleHRJRCwgY21zSW50ZXJwUGFyYW1zKiBwKTsKLQotLy8gQ3VydmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gVGhpcyBzdHJ1Y3QgaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgYSBzZWdtZW50LCBwbHVzIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzIHRoZSBldmFsdWF0aW9uLgotLy8gSW4gdGhlIGNhc2Ugb2YgdGFibGUtYmFzZWQsIEV2YWwgcG9pbnRlciBpcyBzZXQgdG8gTlVMTAotCi0vLyBUaGUgZ2FtbWEgZnVuY3Rpb24gbWFpbiBzdHJ1Y3R1cmUKLXN0cnVjdCBfY21zX2N1cnZlX3N0cnVjdCB7Ci0KLSAgICBjbXNJbnRlcnBQYXJhbXMqICBJbnRlcnBQYXJhbXM7ICAvLyBQcml2YXRlIG9wdGltaXphdGlvbnMgZm9yIGludGVycG9sYXRpb24KLQotICAgIGNtc1VJbnQzMk51bWJlciAgIG5TZWdtZW50czsgICAgIC8vIE51bWJlciBvZiBzZWdtZW50cyBpbiB0aGUgY3VydmUuIFplcm8gZm9yIGEgMTYtYml0IGJhc2VkIHRhYmxlcwotICAgIGNtc0N1cnZlU2VnbWVudCogIFNlZ21lbnRzOyAgICAgIC8vIFRoZSBzZWdtZW50cwotICAgIGNtc0ludGVycFBhcmFtcyoqIFNlZ0ludGVycDsgICAgIC8vIEFycmF5IG9mIHByaXZhdGUgb3B0aW1pemF0aW9ucyBmb3IgaW50ZXJwb2xhdGlvbiBpbiB0YWJsZS1iYXNlZCBzZWdtZW50cwotCi0gICAgY21zUGFyYW1ldHJpY0N1cnZlRXZhbHVhdG9yKiBFdmFsczsgIC8vIEV2YWx1YXRvcnMgKG9uZSBwZXIgc2VnbWVudCkKLQotICAgIC8vIDE2IGJpdCBUYWJsZS1iYXNlZCByZXByZXNlbnRhdGlvbiBmb2xsb3dzCi0gICAgY21zVUludDMyTnVtYmVyICAgIG5FbnRyaWVzOyAgICAgIC8vIE51bWJlciBvZiB0YWJsZSBlbGVtZW50cwotICAgIGNtc1VJbnQxNk51bWJlciogICBUYWJsZTE2OyAgICAgICAvLyBUaGUgdGFibGUgaXRzZWxmLgotfTsKLQotCi0vLyAgUGlwZWxpbmVzICYgU3RhZ2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBBIHNpbmdsZSBzdGFnZQotc3RydWN0IF9jbXNTdGFnZV9zdHJ1Y3QgewotCi0gICAgY21zQ29udGV4dCAgICAgICAgICBDb250ZXh0SUQ7Ci0KLSAgICBjbXNTdGFnZVNpZ25hdHVyZSAgIFR5cGU7ICAgICAgICAgICAvLyBJZGVudGlmaWVzIHRoZSBzdGFnZQotICAgIGNtc1N0YWdlU2lnbmF0dXJlICAgSW1wbGVtZW50czsgICAgIC8vIElkZW50aWZpZXMgdGhlICpmdW5jdGlvbiogb2YgdGhlIHN0YWdlIChmb3Igb3B0aW1pemF0aW9ucykKLQotICAgIGNtc1VJbnQzMk51bWJlciAgICAgSW5wdXRDaGFubmVsczsgIC8vIElucHV0IGNoYW5uZWxzIC0tIGZvciBvcHRpbWl6YXRpb24gcHVycG9zZXMKLSAgICBjbXNVSW50MzJOdW1iZXIgICAgIE91dHB1dENoYW5uZWxzOyAvLyBPdXRwdXQgY2hhbm5lbHMgLS0gZm9yIG9wdGltaXphdGlvbiBwdXJwb3NlcwotCi0gICAgX2Ntc1N0YWdlRXZhbEZuICAgICBFdmFsUHRyOyAgICAgICAgLy8gUG9pbnRzIHRvIGZuIHRoYXQgZXZhbHVhdGVzIHRoZSBzdGFnZSAoYWx3YXlzIGluIGZsb2F0aW5nIHBvaW50KQotICAgIF9jbXNTdGFnZUR1cEVsZW1GbiAgRHVwRWxlbVB0cjsgICAgIC8vIFBvaW50cyB0byBhIGZuIHRoYXQgZHVwbGljYXRlcyB0aGUgKmRhdGEqIG9mIHRoZSBzdGFnZQotICAgIF9jbXNTdGFnZUZyZWVFbGVtRm4gRnJlZVB0cjsgICAgICAgIC8vIFBvaW50cyB0byBhIGZuIHRoYXQgc2V0cyB0aGUgKmRhdGEqIG9mIHRoZSBzdGFnZSBmcmVlCi0KLSAgICAvLyBBIGdlbmVyaWMgcG9pbnRlciB0byB3aGF0ZXZlciBtZW1vcnkgbmVlZGVkIGJ5IHRoZSBzdGFnZQotICAgIHZvaWQqICAgICAgICAgICAgICAgRGF0YTsKLQotICAgIC8vIE1haW50YWlucyBsaW5rZWQgbGlzdCAodXNlZCBpbnRlcm5hbGx5KQotICAgIHN0cnVjdCBfY21zU3RhZ2Vfc3RydWN0KiBOZXh0OwotfTsKLQotCi0vLyBTcGVjaWFsIFN0YWdlcyAoY2Fubm90IGJlIHNhdmVkKQotY21zU3RhZ2UqICAgICAgICBfY21zU3RhZ2VBbGxvY0xhYjJYWVooY21zQ29udGV4dCBDb250ZXh0SUQpOwotY21zU3RhZ2UqICAgICAgICBfY21zU3RhZ2VBbGxvY1hZWjJMYWIoY21zQ29udGV4dCBDb250ZXh0SUQpOwotY21zU3RhZ2UqICAgICAgICBfY21zU3RhZ2VBbGxvY0xhYlByZWxpbihjbXNDb250ZXh0IENvbnRleHRJRCk7Ci1jbXNTdGFnZSogICAgICAgIF9jbXNTdGFnZUFsbG9jTGFiVjJUb1Y0KGNtc0NvbnRleHQgQ29udGV4dElEKTsKLWNtc1N0YWdlKiAgICAgICAgX2Ntc1N0YWdlQWxsb2NMYWJWMlRvVjRjdXJ2ZXMoY21zQ29udGV4dCBDb250ZXh0SUQpOwotY21zU3RhZ2UqICAgICAgICBfY21zU3RhZ2VBbGxvY0xhYlY0VG9WMihjbXNDb250ZXh0IENvbnRleHRJRCk7Ci1jbXNTdGFnZSogICAgICAgIF9jbXNTdGFnZUFsbG9jTmFtZWRDb2xvcihjbXNOQU1FRENPTE9STElTVCogTmFtZWRDb2xvckxpc3QsIGNtc0Jvb2wgVXNlUENTKTsKLWNtc1N0YWdlKiAgICAgICAgX2Ntc1N0YWdlQWxsb2NJZGVudGl0eUN1cnZlcyhjbXNDb250ZXh0IENvbnRleHRJRCwgaW50IG5DaGFubmVscyk7Ci1jbXNTdGFnZSogICAgICAgIF9jbXNTdGFnZUFsbG9jSWRlbnRpdHlDTHV0KGNtc0NvbnRleHQgQ29udGV4dElELCBpbnQgbkNoYW4pOwotY21zU3RhZ2UqICAgICAgICBfY21zU3RhZ2VOb3JtYWxpemVGcm9tTGFiRmxvYXQoY21zQ29udGV4dCBDb250ZXh0SUQpOwotY21zU3RhZ2UqICAgICAgICBfY21zU3RhZ2VOb3JtYWxpemVGcm9tWHl6RmxvYXQoY21zQ29udGV4dCBDb250ZXh0SUQpOwotY21zU3RhZ2UqICAgICAgICBfY21zU3RhZ2VOb3JtYWxpemVUb0xhYkZsb2F0KGNtc0NvbnRleHQgQ29udGV4dElEKTsKLWNtc1N0YWdlKiAgICAgICAgX2Ntc1N0YWdlTm9ybWFsaXplVG9YeXpGbG9hdChjbXNDb250ZXh0IENvbnRleHRJRCk7Ci0KLS8vIEZvciBjdXJ2ZSBzZXQgb25seQotY21zVG9uZUN1cnZlKiogICAgIF9jbXNTdGFnZUdldFB0clRvQ3VydmVTZXQoY29uc3QgY21zU3RhZ2UqIG1wZSk7Ci0KLQotLy8gUGlwZWxpbmUgRXZhbHVhdG9yIChpbiBmbG9hdGluZyBwb2ludCkKLXR5cGVkZWYgdm9pZCAoKiBfY21zUGlwZWxpbmVFdmFsRmxvYXRGbikoY29uc3QgY21zRmxvYXQzMk51bWJlciBJbltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIE91dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBEYXRhKTsKLQotc3RydWN0IF9jbXNQaXBlbGluZV9zdHJ1Y3QgewotCi0gICAgY21zU3RhZ2UqIEVsZW1lbnRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUG9pbnRzIHRvIGVsZW1lbnRzIGNoYWluCi0gICAgY21zVUludDMyTnVtYmVyIElucHV0Q2hhbm5lbHMsIE91dHB1dENoYW5uZWxzOwotCi0gICAgLy8gRGF0YSAmIGV2YWx1YXRvcnMKLSAgICB2b2lkICpEYXRhOwotCi0gICBfY21zT1BUZXZhbDE2Rm4gICAgICAgICBFdmFsMTZGbjsKLSAgIF9jbXNQaXBlbGluZUV2YWxGbG9hdEZuIEV2YWxGbG9hdEZuOwotICAgX2Ntc0ZyZWVVc2VyRGF0YUZuICAgICAgRnJlZURhdGFGbjsKLSAgIF9jbXNEdXBVc2VyRGF0YUZuICAgICAgIER1cERhdGFGbjsKLQotICAgIGNtc0NvbnRleHQgQ29udGV4dElEOyAgICAgICAgICAgIC8vIEVudmlyb25tZW50Ci0KLSAgICBjbXNCb29sICBTYXZlQXM4Qml0czsgICAgICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbi1zcGVjaWZpYzogc2F2ZSBhcyA4IGJpdHMgaWYgcG9zc2libGUKLX07Ci0KLS8vIExVVCByZWFkaW5nICYgY3JlYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBSZWFkIHRhZ3MgdXNpbmcgbG93LWxldmVsIGZ1bmN0aW9uLCBwcm92aWRlIG5lY2Vzc2FyeSBnbHVlIGNvZGUgdG8gYWRhcHQgdmVyc2lvbnMsIGV0Yy4gQWxsIHRob3NlIHJldHVybiBhIGJyYW5kIG5ldyBjb3B5Ci0vLyBvZiB0aGUgTFVUUywgc2luY2Ugb3duZXJzaGlwIG9mIG9yaWdpbmFsIGlzIHVwIHRvIHRoZSBwcm9maWxlLiBUaGUgdXNlciBzaG91bGQgZnJlZSBhbGxvY2F0ZWQgcmVzb3VyY2VzLgotCi1jbXNQaXBlbGluZSogICAgICBfY21zUmVhZElucHV0TFVUKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBpbnQgSW50ZW50KTsKLWNtc1BpcGVsaW5lKiAgICAgIF9jbXNSZWFkT3V0cHV0TFVUKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBpbnQgSW50ZW50KTsKLWNtc1BpcGVsaW5lKiAgICAgIF9jbXNSZWFkRGV2aWNlbGlua0xVVChjbXNIUFJPRklMRSBoUHJvZmlsZSwgaW50IEludGVudCk7Ci0KLS8vIFNwZWNpYWwgdmFsdWVzCi1jbXNCb29sICAgICAgICAgICBfY21zUmVhZE1lZGlhV2hpdGVQb2ludChjbXNDSUVYWVoqIERlc3QsIGNtc0hQUk9GSUxFIGhQcm9maWxlKTsKLWNtc0Jvb2wgICAgICAgICAgIF9jbXNSZWFkQ0hBRChjbXNNQVQzKiBEZXN0LCBjbXNIUFJPRklMRSBoUHJvZmlsZSk7Ci0KLS8vIFByb2ZpbGUgbGlua2VyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNtc1BpcGVsaW5lKiBfY21zTGlua1Byb2ZpbGVzKGNtc0NvbnRleHQgICAgICAgICBDb250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgICAgblByb2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgIFRoZUludGVudHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFICAgICAgICBoUHJvZmlsZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Jvb2wgICAgICAgICAgICBCUENbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgICBBZGFwdGF0aW9uU3RhdGVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgICAgZHdGbGFncyk7Ci0KLS8vIFNlcXVlbmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNtc1NFUSogX2Ntc1JlYWRQcm9maWxlU2VxdWVuY2UoY21zSFBST0ZJTEUgaFByb2ZpbGUpOwotY21zQm9vbCBfY21zV3JpdGVQcm9maWxlU2VxdWVuY2UoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNvbnN0IGNtc1NFUSogc2VxKTsKLWNtc1NFUSogX2Ntc0NvbXBpbGVQcm9maWxlU2VxdWVuY2UoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBuUHJvZmlsZXMsIGNtc0hQUk9GSUxFIGhQcm9maWxlc1tdKTsKLQotCi0vLyBMVVQgb3B0aW1pemF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbXNVSW50MTZOdW1iZXIgIF9jbXNRdWFudGl6ZVZhbChjbXNGbG9hdDY0TnVtYmVyIGksIGludCBNYXhTYW1wbGVzKTsKLWludCAgICAgICAgICAgICAgX2Ntc1JlYXNvbmFibGVHcmlkcG9pbnRzQnlDb2xvcnNwYWNlKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgQ29sb3JzcGFjZSwgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOwotCi1jbXNCb29sICAgICAgICAgIF9jbXNFbmRQb2ludHNCeVNwYWNlKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQxNk51bWJlciAqKldoaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MTZOdW1iZXIgKipCbGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICpuT3V0cHV0cyk7Ci0KLWNtc0Jvb2wgICAgICAgICAgX2Ntc09wdGltaXplUGlwZWxpbmUoY21zQ29udGV4dCBDb250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1BpcGVsaW5lKiogICAgTHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIEludGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyKiBJbnB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyKiBPdXRwdXRGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciogZHdGbGFncyApOwotCi0KLS8vIEhpIGxldmVsIExVVCBidWlsZGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNtc1BpcGVsaW5lKiAgICAgX2Ntc0NyZWF0ZUdhbXV0Q2hlY2tQaXBlbGluZShjbXNDb250ZXh0IENvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSBoUHJvZmlsZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNCb29sICBCUENbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW50ZW50c1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgQWRhcHRhdGlvblN0YXRlc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBuR2FtdXRQQ1Nwb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSBoR2FtdXQpOwotCi0KLS8vIEZvcm1hdHRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNkZWZpbmUgY21zRkxBR1NfQ0FOX0NIQU5HRV9GT1JNQVRURVIgICAgIDB4MDIwMDAwMDAgICAvLyBBbGxvdyBjaGFuZ2UgYnVmZmVyIGZvcm1hdAotCi1jbXNCb29sICAgICAgICAgX2Ntc0Zvcm1hdHRlcklzRmxvYXQoY21zVUludDMyTnVtYmVyIFR5cGUpOwotY21zQm9vbCAgICAgICAgIF9jbXNGb3JtYXR0ZXJJczhiaXQoY21zVUludDMyTnVtYmVyIFR5cGUpOwotCi1jbXNGb3JtYXR0ZXIgICAgX2Ntc0dldEZvcm1hdHRlcihjbXNDb250ZXh0IENvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBUeXBlLCAgICAgICAgICAvLyBTcGVjaWZpYyB0eXBlLCBpLmUuIFRZUEVfUkdCXzgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zvcm1hdHRlckRpcmVjdGlvbiBEaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncyk7Ci0KLQotI2lmbmRlZiBDTVNfTk9fSEFMRl9TVVBQT1JUIAotCi0vLyBIYWxmIGZsb2F0Ci1jbXNGbG9hdDMyTnVtYmVyIF9jbXNIYWxmMkZsb2F0KGNtc1VJbnQxNk51bWJlciBoKTsKLWNtc1VJbnQxNk51bWJlciAgX2Ntc0Zsb2F0MkhhbGYoY21zRmxvYXQzMk51bWJlciBmbHQpOwotCi0jZW5kaWYKLQotLy8gVHJhbnNmb3JtIGxvZ2ljIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdHJ1Y3QgX2Ntc3RyYW5zZm9ybV9zdHJ1Y3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQotICAgIC8vIDEtcGl4ZWwgY2FjaGUgKDE2IGJpdHMgb25seSkKLSAgICBjbXNVSW50MTZOdW1iZXIgQ2FjaGVJbltjbXNNQVhDSEFOTkVMU107Ci0gICAgY21zVUludDE2TnVtYmVyIENhY2hlT3V0W2Ntc01BWENIQU5ORUxTXTsKLQotfSBfY21zQ0FDSEU7Ci0KLQotCi0vLyBUcmFuc2Zvcm1hdGlvbgotdHlwZWRlZiBzdHJ1Y3QgX2Ntc3RyYW5zZm9ybV9zdHJ1Y3QgewotCi0gICAgY21zVUludDMyTnVtYmVyIElucHV0Rm9ybWF0LCBPdXRwdXRGb3JtYXQ7IC8vIEtlZXAgZm9ybWF0cyBmb3IgZnVydGhlciByZWZlcmVuY2UKLQotICAgIC8vIFBvaW50cyB0byB0cmFuc2Zvcm0gY29kZQotICAgIF9jbXNUcmFuc2Zvcm1GbiB4Zm9ybTsKLQotICAgIC8vIEZvcm1hdHRlcnMsIGNhbm5vdCBiZSBlbWJlZGRlZCBpbnRvIExVVCBiZWNhdXNlIGNhY2hlCi0gICAgY21zRm9ybWF0dGVyMTYgRnJvbUlucHV0OwotICAgIGNtc0Zvcm1hdHRlcjE2IFRvT3V0cHV0OwotCi0gICAgY21zRm9ybWF0dGVyRmxvYXQgRnJvbUlucHV0RmxvYXQ7Ci0gICAgY21zRm9ybWF0dGVyRmxvYXQgVG9PdXRwdXRGbG9hdDsKLQotICAgIC8vIDEtcGl4ZWwgY2FjaGUgc2VlZCBmb3IgemVybyBhcyBpbnB1dCAoMTYgYml0cywgcmVhZCBvbmx5KQotICAgIF9jbXNDQUNIRSBDYWNoZTsKLQotICAgIC8vIEEgUGlwZWxpbmUgaG9sZGluZyB0aGUgZnVsbCAob3B0aW1pemVkKSB0cmFuc2Zvcm0KLSAgICBjbXNQaXBlbGluZSogTHV0OwotCi0gICAgLy8gQSBQaXBlbGluZSBob2xkaW5nIHRoZSBnYW11dCBjaGVjay4gSXQgZ29lcyBmcm9tIHRoZSBpbnB1dCBzcGFjZSB0byBiaWxldmVsCi0gICAgY21zUGlwZWxpbmUqIEdhbXV0Q2hlY2s7Ci0KLSAgICAvLyBDb2xvcmFudCB0YWJsZXMKLSAgICBjbXNOQU1FRENPTE9STElTVCogSW5wdXRDb2xvcmFudDsgICAgICAgLy8gSW5wdXQgQ29sb3JhbnQgdGFibGUKLSAgICBjbXNOQU1FRENPTE9STElTVCogT3V0cHV0Q29sb3JhbnQ7ICAgICAgLy8gQ29sb3JhbnQgdGFibGUgKGZvciBuIGNoYW5zID4gQ01ZSykKLQotICAgIC8vIEluZm9ybWF0aW9uYWwgb25seQotICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgRW50cnlDb2xvclNwYWNlOwotICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgRXhpdENvbG9yU3BhY2U7Ci0KLSAgICAvLyBXaGl0ZSBwb2ludHMgKGluZm9ybWF0aXZlIG9ubHkpCi0gICAgY21zQ0lFWFlaIEVudHJ5V2hpdGVQb2ludDsKLSAgICBjbXNDSUVYWVogRXhpdFdoaXRlUG9pbnQ7Ci0KLSAgICAvLyBQcm9maWxlcyB1c2VkIHRvIGNyZWF0ZSB0aGUgdHJhbnNmb3JtCi0gICAgY21zU0VRKiBTZXF1ZW5jZTsKLQotICAgIGNtc1VJbnQzMk51bWJlciAgZHdPcmlnaW5hbEZsYWdzOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgQWRhcHRhdGlvblN0YXRlOwotCi0gICAgLy8gVGhlIGludGVudCBvZiB0aGlzIHRyYW5zZm9ybS4gVGhhdCBpcyB1c3VhbGx5IHRoZSBsYXN0IGludGVudCBpbiB0aGUgcHJvZmlsZWNoYWluLCBidXQgbWF5IGRpZmZlcgotICAgIGNtc1VJbnQzMk51bWJlciBSZW5kZXJpbmdJbnRlbnQ7Ci0KLSAgICAvLyBBbiBpZCB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHJ1bm5pbmcgY29udGV4dC4gTWF5IGJlIG51bGwuCi0gICAgY21zQ29udGV4dCBDb250ZXh0SUQ7Ci0KLSAgICAvLyBBIHVzZXItZGVmaW5lZCBwb2ludGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgZGF0YSBmb3IgdHJhbnNmb3JtIHBsdWctaW5zCi0gICAgdm9pZCogVXNlckRhdGE7Ci0gICAgX2Ntc0ZyZWVVc2VyRGF0YUZuIEZyZWVVc2VyRGF0YTsKLQotfSBfY21zVFJBTlNGT1JNOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbXNIVFJBTlNGT1JNIF9jbXNDaGFpbjJMYWIoY21zQ29udGV4dCAgICAgICAgICAgICBDb250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgICAgICBuUHJvZmlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgICAgICBJbnB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgIE91dHB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNVSW50MzJOdW1iZXIgIEludGVudHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNIUFJPRklMRSAgICAgIGhQcm9maWxlc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0Jvb2wgICAgICAgICAgQlBDW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zRmxvYXQ2NE51bWJlciBBZGFwdGF0aW9uU3RhdGVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgICAgICBkd0ZsYWdzKTsKLQotCi1jbXNUb25lQ3VydmUqIF9jbXNCdWlsZEtUb25lQ3VydmUoY21zQ29udGV4dCAgICAgICBDb250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgICAgICBuUG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgblByb2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc1VJbnQzMk51bWJlciAgSW50ZW50c1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0hQUk9GSUxFICAgICAgaFByb2ZpbGVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zQm9vbCAgICAgICAgICBCUENbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNGbG9hdDY0TnVtYmVyIEFkYXB0YXRpb25TdGF0ZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgIGR3RmxhZ3MpOwotCi1jbXNCb29sICAgX2Ntc0FkYXB0YXRpb25NYXRyaXgoY21zTUFUMyogciwgY29uc3QgY21zTUFUMyogQ29uZU1hdHJpeCwgY29uc3QgY21zQ0lFWFlaKiBGcm9tSWxsLCBjb25zdCBjbXNDSUVYWVoqIFRvSWxsKTsKLQotY21zQm9vbCAgIF9jbXNCdWlsZFJHQjJYWVp0cmFuc2Zlck1hdHJpeChjbXNNQVQzKiByLCBjb25zdCBjbXNDSUV4eVkqIFdoaXRlUG9pbnQsIGNvbnN0IGNtc0NJRXh5WVRSSVBMRSogUHJpbWFyaWVzKTsKLQotCi0jZGVmaW5lIF9sY21zX2ludGVybmFsX0gKLSNlbmRpZgotLy88PDwrKytPUEVOU09VUkNFX01VU1RfRU5ECmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNjYW0wMi5jIGIvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zY2FtMDIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI2ODQyNC4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNjYW0wMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiLi4vbGNtczItMi42L3NyYy9jbXNjYW0wMi5jIgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zY2dhdHMuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc2NnYXRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMDBmZTYuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zY2dhdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgIi4uL2xjbXMyLTIuNi9zcmMvY21zY2dhdHMuYyIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc2NudnJ0LmMgYi9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNjbnZydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjllYjk5Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc2NudnJ0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICIuLi9sY21zMi0yLjYvc3JjL2Ntc2NudnJ0LmMiCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNlcnIuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc2Vyci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2QwNjk2Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc2Vyci5jCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiLi4vbGNtczItMi42L3NyYy9jbXNlcnIuYyIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc2dhbW1hLmMgYi9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNnYW1tYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTM2YzYyLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc2dhbW1hLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICIuLi9sY21zMi0yLjYvc3JjL2Ntc2dhbW1hLmMiCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNnbXQuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc2dtdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmU0Y2M4Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc2dtdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiLi4vbGNtczItMi42L3NyYy9jbXNnbXQuYyIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc2hhbGYuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc2hhbGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3ZTA3Yy4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNoYWxmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICIuLi9sY21zMi0yLjYvc3JjL2Ntc2hhbGYuYyIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc2ludHJwLmMgYi9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNpbnRycC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWFjZDU1Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc2ludHJwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICIuLi9sY21zMi0yLjYvc3JjL2Ntc2ludHJwLmMiCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNpbzAuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc2lvMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGFlZDIzLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc2lvMC5jCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiLi4vbGNtczItMi42L3NyYy9jbXNpbzAuYyIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc2lvMS5jIGIvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zaW8xLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0Y2U5MjcuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zaW8xLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICIuLi9sY21zMi0yLjYvc3JjL2Ntc2lvMS5jIgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zbHV0LmMgYi9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNsdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAzMmUzYi4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNsdXQuYworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgIi4uL2xjbXMyLTIuNi9zcmMvY21zbHV0LmMiCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNtZDUuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc21kNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjhkYjRhLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc21kNS5jCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiLi4vbGNtczItMi42L3NyYy9jbXNtZDUuYyIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc210cnguYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc210cnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQwNGRjYy4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNtdHJ4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICIuLi9sY21zMi0yLjYvc3JjL2Ntc210cnguYyIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc25hbWVkLmMgYi9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNuYW1lZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2EwMTMyLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc25hbWVkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICIuLi9sY21zMi0yLjYvc3JjL2Ntc25hbWVkLmMiCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNvcHQuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc29wdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTZjNzM1Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc29wdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiLi4vbGNtczItMi42L3NyYy9jbXNvcHQuYyIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc3BhY2suYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc3BhY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEyNWQzMy4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNwYWNrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICIuLi9sY21zMi0yLjYvc3JjL2Ntc3BhY2suYyIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc3Bjcy5jIGIvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zcGNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOWQ2ZGQuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zcGNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICIuLi9sY21zMi0yLjYvc3JjL2Ntc3Bjcy5jIgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zcGx1Z2luLmMgYi9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNwbHVnaW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI3ZTZjMy4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNwbHVnaW4uYworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgIi4uL2xjbXMyLTIuNi9zcmMvY21zcGx1Z2luLmMiCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNwczIuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc3BzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmExZWE5Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc3BzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiLi4vbGNtczItMi42L3NyYy9jbXNwczIuYyIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc3NhbXAuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc3NhbXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU1YzAzMS4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNzYW1wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICIuLi9sY21zMi0yLjYvc3JjL2Ntc3NhbXAuYyIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc3NtLmMgYi9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNzbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGM3MTYwLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc3NtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICIuLi9sY21zMi0yLjYvc3JjL2Ntc3NtLmMiCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXN0eXBlcy5jIGIvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zdHlwZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y2NGE2MS4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXN0eXBlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiLi4vbGNtczItMi42L3NyYy9jbXN0eXBlcy5jIgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zdmlydC5jIGIvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zdmlydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzYwZDFmLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc3ZpcnQuYworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgIi4uL2xjbXMyLTIuNi9zcmMvY21zdmlydC5jIgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zd3RwbnQuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc3d0cG50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NmM2MGEuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zd3RwbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgIi4uL2xjbXMyLTIuNi9zcmMvY21zd3RwbnQuYyIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc3hmb3JtLmMgYi9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXN4Zm9ybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGNkODNhLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc3hmb3JtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICIuLi9sY21zMi0yLjYvc3JjL2Ntc3hmb3JtLmMiCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xnaWYvZnhfZ2lmLmNwcCBiL2NvcmUvc3JjL2Z4Y29kZWMvbGdpZi9meF9naWYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwN2ViYjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2xnaWYvZnhfZ2lmLmNwcApAQCAtMCwwICsxLDE0MjYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImZ4X2dpZi5oIg0KK3ZvaWQgQ0dpZkxaV0RlY29kZXI6OklucHV0KHVpbnQ4X3QqIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplKSB7DQorICBuZXh0X2luID0gc3JjX2J1ZjsNCisgIGF2YWlsX2luID0gc3JjX3NpemU7DQorfQ0KK0ZYX0RXT1JEIENHaWZMWldEZWNvZGVyOjpHZXRBdmFpbElucHV0KCkgew0KKyAgcmV0dXJuIGF2YWlsX2luOw0KK30NCit2b2lkIENHaWZMWldEZWNvZGVyOjpJbml0VGFibGUodWludDhfdCBjb2RlX2xlbikgew0KKyAgY29kZV9zaXplID0gY29kZV9sZW47DQorICBjb2RlX2NsZWFyID0gMSA8PCBjb2RlX3NpemU7DQorICBjb2RlX2VuZCA9IGNvZGVfY2xlYXIgKyAxOw0KKyAgYml0c19sZWZ0ID0gMDsNCisgIGNvZGVfc3RvcmUgPSAwOw0KKyAgbmV4dF9pbiA9IE5VTEw7DQorICBhdmFpbF9pbiA9IDA7DQorICBzdGFja19zaXplID0gMDsNCisgIGNvZGVfZmlyc3QgPSAwOw0KKyAgQ2xlYXJUYWJsZSgpOw0KK30NCit2b2lkIENHaWZMWldEZWNvZGVyOjpDbGVhclRhYmxlKCkgew0KKyAgY29kZV9zaXplX2N1ciA9IGNvZGVfc2l6ZSArIDE7DQorICBjb2RlX25leHQgPSBjb2RlX2VuZCArIDE7DQorICBjb2RlX29sZCA9IChGWF9XT1JEKS0xOw0KKyAgRlhTWVNfbWVtc2V0KGNvZGVfdGFibGUsIDAsIHNpemVvZih0YWdfVGFibGUpICogR0lGX01BWF9MWldfQ09ERSk7DQorICBGWFNZU19tZW1zZXQoc3RhY2ssIDAsIEdJRl9NQVhfTFpXX0NPREUpOw0KKyAgZm9yIChGWF9XT1JEIGkgPSAwOyBpIDwgY29kZV9jbGVhcjsgaSsrKSB7DQorICAgIGNvZGVfdGFibGVbaV0uc3VmZml4ID0gKHVpbnQ4X3QpaTsNCisgIH0NCit9DQordm9pZCBDR2lmTFpXRGVjb2Rlcjo6RGVjb2RlU3RyaW5nKEZYX1dPUkQgY29kZSkgew0KKyAgc3RhY2tfc2l6ZSA9IDA7DQorICB3aGlsZSAoVFJVRSkgew0KKyAgICBBU1NFUlQoY29kZSA8PSBjb2RlX25leHQpOw0KKyAgICBpZiAoY29kZSA8IGNvZGVfY2xlYXIgfHwgY29kZSA+IGNvZGVfbmV4dCkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHN0YWNrW0dJRl9NQVhfTFpXX0NPREUgLSAxIC0gc3RhY2tfc2l6ZSsrXSA9IGNvZGVfdGFibGVbY29kZV0uc3VmZml4Ow0KKyAgICBjb2RlID0gY29kZV90YWJsZVtjb2RlXS5wcmVmaXg7DQorICB9DQorICBzdGFja1tHSUZfTUFYX0xaV19DT0RFIC0gMSAtIHN0YWNrX3NpemUrK10gPSAodWludDhfdCljb2RlOw0KKyAgY29kZV9maXJzdCA9ICh1aW50OF90KWNvZGU7DQorfQ0KK3ZvaWQgQ0dpZkxaV0RlY29kZXI6OkFkZENvZGUoRlhfV09SRCBwcmVmaXhfY29kZSwgdWludDhfdCBhcHBlbmRfY2hhcikgew0KKyAgaWYgKGNvZGVfbmV4dCA9PSBHSUZfTUFYX0xaV19DT0RFKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGNvZGVfdGFibGVbY29kZV9uZXh0XS5wcmVmaXggPSBwcmVmaXhfY29kZTsNCisgIGNvZGVfdGFibGVbY29kZV9uZXh0XS5zdWZmaXggPSBhcHBlbmRfY2hhcjsNCisgIGlmICgrK2NvZGVfbmV4dCA8IEdJRl9NQVhfTFpXX0NPREUpIHsNCisgICAgaWYgKGNvZGVfbmV4dCA+PiBjb2RlX3NpemVfY3VyKSB7DQorICAgICAgY29kZV9zaXplX2N1cisrOw0KKyAgICB9DQorICB9DQorfQ0KK2ludDMyX3QgQ0dpZkxaV0RlY29kZXI6OkRlY29kZSh1aW50OF90KiBkZXNfYnVmLCBGWF9EV09SRCYgZGVzX3NpemUpIHsNCisgIGlmIChkZXNfc2l6ZSA9PSAwKSB7DQorICAgIHJldHVybiAzOw0KKyAgfQ0KKyAgRlhfRFdPUkQgaSA9IDA7DQorICBpZiAoc3RhY2tfc2l6ZSAhPSAwKSB7DQorICAgIGlmIChkZXNfc2l6ZSA8IHN0YWNrX3NpemUpIHsNCisgICAgICBGWFNZU19tZW1jcHkoZGVzX2J1ZiwgJnN0YWNrW0dJRl9NQVhfTFpXX0NPREUgLSBzdGFja19zaXplXSwgZGVzX3NpemUpOw0KKyAgICAgIHN0YWNrX3NpemUgLT0gKEZYX1dPUkQpZGVzX3NpemU7DQorICAgICAgcmV0dXJuIDM7DQorICAgIH0NCisgICAgRlhTWVNfbWVtY3B5KGRlc19idWYsICZzdGFja1tHSUZfTUFYX0xaV19DT0RFIC0gc3RhY2tfc2l6ZV0sIHN0YWNrX3NpemUpOw0KKyAgICBkZXNfYnVmICs9IHN0YWNrX3NpemU7DQorICAgIGkgKz0gc3RhY2tfc2l6ZTsNCisgICAgc3RhY2tfc2l6ZSA9IDA7DQorICB9DQorICBGWF9XT1JEIGNvZGUgPSAwOw0KKyAgd2hpbGUgKGkgPD0gZGVzX3NpemUgJiYgKGF2YWlsX2luID4gMCB8fCBiaXRzX2xlZnQgPj0gY29kZV9zaXplX2N1cikpIHsNCisgICAgaWYgKGNvZGVfc2l6ZV9jdXIgPiAxMikgew0KKyAgICAgIGlmIChlcnJfbXNnX3B0cikgew0KKyAgICAgICAgRlhTWVNfc3RybmNweShlcnJfbXNnX3B0ciwgIkNvZGUgTGVuZ3RoIE91dCBPZiBSYW5nZSIsDQorICAgICAgICAgICAgICAgICAgICAgIEdJRl9NQVhfRVJST1JfU0laRSAtIDEpOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBpZiAoYXZhaWxfaW4gPiAwKSB7DQorICAgICAgY29kZV9zdG9yZSB8PSAoKm5leHRfaW4rKykgPDwgYml0c19sZWZ0Ow0KKyAgICAgIGF2YWlsX2luLS07DQorICAgICAgYml0c19sZWZ0ICs9IDg7DQorICAgIH0NCisgICAgd2hpbGUgKGJpdHNfbGVmdCA+PSBjb2RlX3NpemVfY3VyKSB7DQorICAgICAgY29kZSA9IChGWF9XT1JEKWNvZGVfc3RvcmUgJiAoKDEgPDwgY29kZV9zaXplX2N1cikgLSAxKTsNCisgICAgICBjb2RlX3N0b3JlID4+PSBjb2RlX3NpemVfY3VyOw0KKyAgICAgIGJpdHNfbGVmdCAtPSBjb2RlX3NpemVfY3VyOw0KKyAgICAgIGlmIChjb2RlID09IGNvZGVfY2xlYXIpIHsNCisgICAgICAgIENsZWFyVGFibGUoKTsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0gZWxzZSBpZiAoY29kZSA9PSBjb2RlX2VuZCkgew0KKyAgICAgICAgZGVzX3NpemUgPSBpOw0KKyAgICAgICAgcmV0dXJuIDE7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChjb2RlX29sZCAhPSAoRlhfV09SRCktMSkgew0KKyAgICAgICAgICBpZiAoY29kZV9uZXh0IDwgR0lGX01BWF9MWldfQ09ERSkgew0KKyAgICAgICAgICAgIGlmIChjb2RlID09IGNvZGVfbmV4dCkgew0KKyAgICAgICAgICAgICAgQWRkQ29kZShjb2RlX29sZCwgY29kZV9maXJzdCk7DQorICAgICAgICAgICAgICBEZWNvZGVTdHJpbmcoY29kZSk7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlID4gY29kZV9uZXh0KSB7DQorICAgICAgICAgICAgICBpZiAoZXJyX21zZ19wdHIpIHsNCisgICAgICAgICAgICAgICAgRlhTWVNfc3RybmNweShlcnJfbXNnX3B0ciwgIkRlY29kZSBFcnJvciwgT3V0IE9mIFJhbmdlIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSUZfTUFYX0VSUk9SX1NJWkUgLSAxKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBEZWNvZGVTdHJpbmcoY29kZSk7DQorICAgICAgICAgICAgICB1aW50OF90IGFwcGVuZF9jaGFyID0gc3RhY2tbR0lGX01BWF9MWldfQ09ERSAtIHN0YWNrX3NpemVdOw0KKyAgICAgICAgICAgICAgQWRkQ29kZShjb2RlX29sZCwgYXBwZW5kX2NoYXIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgRGVjb2RlU3RyaW5nKGNvZGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY29kZV9vbGQgPSBjb2RlOw0KKyAgICAgICAgaWYgKGkgKyBzdGFja19zaXplID4gZGVzX3NpemUpIHsNCisgICAgICAgICAgRlhTWVNfbWVtY3B5KGRlc19idWYsICZzdGFja1tHSUZfTUFYX0xaV19DT0RFIC0gc3RhY2tfc2l6ZV0sDQorICAgICAgICAgICAgICAgICAgICAgICBkZXNfc2l6ZSAtIGkpOw0KKyAgICAgICAgICBzdGFja19zaXplIC09IChGWF9XT1JEKShkZXNfc2l6ZSAtIGkpOw0KKyAgICAgICAgICByZXR1cm4gMzsNCisgICAgICAgIH0NCisgICAgICAgIEZYU1lTX21lbWNweShkZXNfYnVmLCAmc3RhY2tbR0lGX01BWF9MWldfQ09ERSAtIHN0YWNrX3NpemVdLA0KKyAgICAgICAgICAgICAgICAgICAgIHN0YWNrX3NpemUpOw0KKyAgICAgICAgZGVzX2J1ZiArPSBzdGFja19zaXplOw0KKyAgICAgICAgaSArPSBzdGFja19zaXplOw0KKyAgICAgICAgc3RhY2tfc2l6ZSA9IDA7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAoYXZhaWxfaW4gPT0gMCkgew0KKyAgICBkZXNfc2l6ZSA9IGk7DQorICAgIHJldHVybiAyOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KK3N0YXRpYyBGWF9CT09MIF9naWZfZ3Jvd19idWYodWludDhfdComIGRzdF9idWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZHN0X2xlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUpIHsNCisgIGlmIChkc3RfbGVuIDwgc2l6ZSkgew0KKyAgICBGWF9EV09SRCBsZW5fb3JnID0gZHN0X2xlbjsNCisgICAgd2hpbGUgKGRzdF9idWYgJiYgZHN0X2xlbiA8IHNpemUpIHsNCisgICAgICBkc3RfbGVuIDw8PSAxOw0KKyAgICAgIGRzdF9idWYgPSBGWF9SZWFsbG9jKHVpbnQ4X3QsIGRzdF9idWYsIGRzdF9sZW4pOw0KKyAgICB9DQorICAgIGlmIChkc3RfYnVmID09IE5VTEwpIHsNCisgICAgICBkc3RfbGVuID0gc2l6ZTsNCisgICAgICBkc3RfYnVmID0gRlhfUmVhbGxvYyh1aW50OF90LCBkc3RfYnVmLCBkc3RfbGVuKTsNCisgICAgICBpZiAoZHN0X2J1ZiA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICB9DQorICAgIEZYU1lTX21lbXNldChkc3RfYnVmICsgbGVuX29yZywgMCwgZHN0X2xlbiAtIGxlbl9vcmcpOw0KKyAgICByZXR1cm4gZHN0X2J1ZiAhPSBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3N0YXRpYyBpbmxpbmUgdm9pZCBfZ2lmX2N1dF9pbmRleCh1aW50OF90JiB2YWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGluZGV4X2JpdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpbmRleF9iaXRfdXNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGJpdF91c2UpIHsNCisgIEZYX0RXT1JEIGN1dCA9ICgoMSA8PCAoaW5kZXhfYml0IC0gaW5kZXhfYml0X3VzZSkpIC0gMSkgPDwgaW5kZXhfYml0X3VzZTsNCisgIHZhbCB8PSAoKGluZGV4ICYgY3V0KSA+PiBpbmRleF9iaXRfdXNlKSA8PCBiaXRfdXNlOw0KK30NCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgX2dpZl9jdXRfYnVmKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBvZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGJpdF9jdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90JiBiaXRfb2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGJpdF9udW0pIHsNCisgIGlmIChiaXRfY3V0ICE9IDgpIHsNCisgICAgRlhfV09SRCBpbmRleCA9IDA7DQorICAgIGluZGV4IHw9ICgoMSA8PCBiaXRfY3V0KSAtIDEpIDw8ICg3IC0gYml0X29mZnNldCk7DQorICAgIHVpbnQ4X3QgcmV0ID0gKChpbmRleCAmIGJ1ZltvZmZzZXRdKSA+PiAoNyAtIGJpdF9vZmZzZXQpKTsNCisgICAgYml0X29mZnNldCArPSBiaXRfY3V0Ow0KKyAgICBpZiAoYml0X29mZnNldCA+PSA4KSB7DQorICAgICAgaWYgKGJpdF9vZmZzZXQgPiA4KSB7DQorICAgICAgICByZXQgfD0gKChpbmRleCAmIChidWZbb2Zmc2V0ICsgMV0gPDwgOCkpID4+IDgpOw0KKyAgICAgIH0NCisgICAgICBiaXRfb2Zmc2V0IC09IDg7DQorICAgICAgb2Zmc2V0Kys7DQorICAgIH0NCisgICAgYml0X251bSArPSBiaXRfY3V0Ow0KKyAgICByZXR1cm4gcmV0Ow0KKyAgfQ0KKyAgYml0X251bSArPSBiaXRfY3V0Ow0KKyAgcmV0dXJuIGJ1ZltvZmZzZXQrK107DQorfQ0KK0NHaWZMWldFbmNvZGVyOjpDR2lmTFpXRW5jb2RlcigpIHsNCisgIEZYU1lTX21lbXNldCh0aGlzLCAwLCBzaXplb2YoQ0dpZkxaV0VuY29kZXIpKTsNCit9DQorQ0dpZkxaV0VuY29kZXI6On5DR2lmTFpXRW5jb2RlcigpIHt9DQordm9pZCBDR2lmTFpXRW5jb2Rlcjo6Q2xlYXJUYWJsZSgpIHsNCisgIGluZGV4X2JpdF9jdXIgPSBjb2RlX3NpemUgKyAxOw0KKyAgaW5kZXhfbnVtID0gY29kZV9lbmQgKyAxOw0KKyAgdGFibGVfY3VyID0gY29kZV9lbmQgKyAxOw0KKyAgZm9yIChGWF9XT1JEIGkgPSAwOyBpIDwgR0lGX01BWF9MWldfQ09ERTsgaSsrKSB7DQorICAgIGNvZGVfdGFibGVbaV0ucHJlZml4ID0gMDsNCisgICAgY29kZV90YWJsZVtpXS5zdWZmaXggPSAwOw0KKyAgfQ0KK30NCit2b2lkIENHaWZMWldFbmNvZGVyOjpTdGFydCh1aW50OF90IGNvZGVfbGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRzdF9idWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIG9mZnNldCkgew0KKyAgY29kZV9zaXplID0gY29kZV9sZW4gKyAxOw0KKyAgc3JjX2JpdF9jdXQgPSBjb2RlX3NpemU7DQorICBpZiAoY29kZV9sZW4gPT0gMCkgew0KKyAgICBzcmNfYml0X2N1dCA9IDE7DQorICAgIGNvZGVfc2l6ZSA9IDI7DQorICB9DQorICBjb2RlX2NsZWFyID0gMSA8PCBjb2RlX3NpemU7DQorICBjb2RlX2VuZCA9IGNvZGVfY2xlYXIgKyAxOw0KKyAgZHN0X2J1ZltvZmZzZXQrK10gPSBjb2RlX3NpemU7DQorICBiaXRfb2Zmc2V0ID0gMDsNCisgIENsZWFyVGFibGUoKTsNCisgIHNyY19vZmZzZXQgPSAwOw0KKyAgc3JjX2JpdF9vZmZzZXQgPSAwOw0KKyAgc3JjX2JpdF9udW0gPSAwOw0KKyAgY29kZV90YWJsZVtpbmRleF9udW1dLnByZWZpeCA9IF9naWZfY3V0X2J1ZihzcmNfYnVmLCBzcmNfb2Zmc2V0LCBzcmNfYml0X2N1dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2JpdF9vZmZzZXQsIHNyY19iaXRfbnVtKTsNCisgIGNvZGVfdGFibGVbaW5kZXhfbnVtXS5zdWZmaXggPSBfZ2lmX2N1dF9idWYoc3JjX2J1Ziwgc3JjX29mZnNldCwgc3JjX2JpdF9jdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19iaXRfb2Zmc2V0LCBzcmNfYml0X251bSk7DQorfQ0KK3ZvaWQgQ0dpZkxaV0VuY29kZXI6OldyaXRlQmxvY2sodWludDhfdComIGRzdF9idWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZHN0X2xlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBvZmZzZXQpIHsNCisgIGlmICghX2dpZl9ncm93X2J1Zihkc3RfYnVmLCBkc3RfbGVuLCBvZmZzZXQgKyBHSUZfREFUQV9CTE9DSyArIDEpKSB7DQorICAgIGxvbmdqbXAoam1wLCAxKTsNCisgIH0NCisgIGRzdF9idWZbb2Zmc2V0KytdID0gaW5kZXhfYnVmX2xlbjsNCisgIEZYU1lTX21lbWNweSgmZHN0X2J1ZltvZmZzZXRdLCBpbmRleF9idWYsIGluZGV4X2J1Zl9sZW4pOw0KKyAgb2Zmc2V0ICs9IGluZGV4X2J1Zl9sZW47DQorICBGWFNZU19tZW1zZXQoaW5kZXhfYnVmLCAwLCBHSUZfREFUQV9CTE9DSyk7DQorICBpbmRleF9idWZfbGVuID0gMDsNCit9DQordm9pZCBDR2lmTFpXRW5jb2Rlcjo6RW5jb2RlU3RyaW5nKEZYX0RXT1JEIGluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZHN0X2J1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRzdF9sZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBvZmZzZXQpIHsNCisgIHVpbnQ4X3QgaW5kZXhfYml0X3VzZTsNCisgIGluZGV4X2JpdF91c2UgPSAwOw0KKyAgaWYgKGluZGV4X2J1Zl9sZW4gPT0gR0lGX0RBVEFfQkxPQ0spIHsNCisgICAgV3JpdGVCbG9jayhkc3RfYnVmLCBkc3RfbGVuLCBvZmZzZXQpOw0KKyAgfQ0KKyAgX2dpZl9jdXRfaW5kZXgoaW5kZXhfYnVmW2luZGV4X2J1Zl9sZW5dLCBpbmRleCwgaW5kZXhfYml0X2N1ciwgaW5kZXhfYml0X3VzZSwNCisgICAgICAgICAgICAgICAgIGJpdF9vZmZzZXQpOw0KKyAgaWYgKGluZGV4X2JpdF9jdXIgPD0gKDggLSBiaXRfb2Zmc2V0KSkgew0KKyAgICBiaXRfb2Zmc2V0ICs9IGluZGV4X2JpdF9jdXI7DQorICB9IGVsc2UgaWYgKGluZGV4X2JpdF9jdXIgPD0gKDE2IC0gYml0X29mZnNldCkpIHsNCisgICAgaW5kZXhfYml0X3VzZSArPSAoOCAtIGJpdF9vZmZzZXQpOw0KKyAgICBiaXRfb2Zmc2V0ID0gMDsNCisgICAgaW5kZXhfYnVmX2xlbisrOw0KKyAgICBpZiAoaW5kZXhfYnVmX2xlbiA9PSBHSUZfREFUQV9CTE9DSykgew0KKyAgICAgIFdyaXRlQmxvY2soZHN0X2J1ZiwgZHN0X2xlbiwgb2Zmc2V0KTsNCisgICAgfQ0KKyAgICBfZ2lmX2N1dF9pbmRleChpbmRleF9idWZbaW5kZXhfYnVmX2xlbl0sIGluZGV4LCBpbmRleF9iaXRfY3VyLA0KKyAgICAgICAgICAgICAgICAgICBpbmRleF9iaXRfdXNlLCBiaXRfb2Zmc2V0KTsNCisgICAgYml0X29mZnNldCA9IGluZGV4X2JpdF9jdXIgLSBpbmRleF9iaXRfdXNlOw0KKyAgfSBlbHNlIHsNCisgICAgaW5kZXhfYml0X3VzZSArPSAoOCAtIGJpdF9vZmZzZXQpOw0KKyAgICBiaXRfb2Zmc2V0ID0gMDsNCisgICAgaW5kZXhfYnVmX2xlbisrOw0KKyAgICBpZiAoaW5kZXhfYnVmX2xlbiA9PSBHSUZfREFUQV9CTE9DSykgew0KKyAgICAgIFdyaXRlQmxvY2soZHN0X2J1ZiwgZHN0X2xlbiwgb2Zmc2V0KTsNCisgICAgfQ0KKyAgICBfZ2lmX2N1dF9pbmRleChpbmRleF9idWZbaW5kZXhfYnVmX2xlbl0sIGluZGV4LCBpbmRleF9iaXRfY3VyLA0KKyAgICAgICAgICAgICAgICAgICBpbmRleF9iaXRfdXNlLCBiaXRfb2Zmc2V0KTsNCisgICAgaW5kZXhfYml0X3VzZSArPSA4Ow0KKyAgICBiaXRfb2Zmc2V0ID0gMDsNCisgICAgaW5kZXhfYnVmX2xlbisrOw0KKyAgICBpZiAoaW5kZXhfYnVmX2xlbiA9PSBHSUZfREFUQV9CTE9DSykgew0KKyAgICAgIFdyaXRlQmxvY2soZHN0X2J1ZiwgZHN0X2xlbiwgb2Zmc2V0KTsNCisgICAgfQ0KKyAgICBfZ2lmX2N1dF9pbmRleChpbmRleF9idWZbaW5kZXhfYnVmX2xlbl0sIGluZGV4LCBpbmRleF9iaXRfY3VyLA0KKyAgICAgICAgICAgICAgICAgICBpbmRleF9iaXRfdXNlLCBiaXRfb2Zmc2V0KTsNCisgICAgYml0X29mZnNldCA9IGluZGV4X2JpdF9jdXIgLSBpbmRleF9iaXRfdXNlOw0KKyAgfQ0KKyAgaWYgKGJpdF9vZmZzZXQgPT0gOCkgew0KKyAgICBiaXRfb2Zmc2V0ID0gMDsNCisgICAgaW5kZXhfYnVmX2xlbisrOw0KKyAgICBpZiAoaW5kZXhfYnVmX2xlbiA9PSBHSUZfREFUQV9CTE9DSykgew0KKyAgICAgIFdyaXRlQmxvY2soZHN0X2J1ZiwgZHN0X2xlbiwgb2Zmc2V0KTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGluZGV4ID09IGNvZGVfZW5kKSB7DQorICAgIGluZGV4X2J1Zl9sZW4rKzsNCisgICAgV3JpdGVCbG9jayhkc3RfYnVmLCBkc3RfbGVuLCBvZmZzZXQpOw0KKyAgfQ0KKyAgaWYgKGluZGV4X251bSsrID4+IGluZGV4X2JpdF9jdXIpIHsNCisgICAgaW5kZXhfYml0X2N1cisrOw0KKyAgfQ0KK30NCitGWF9CT09MIENHaWZMWldFbmNvZGVyOjpFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX2xlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRzdF9idWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkc3RfbGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgb2Zmc2V0KSB7DQorICB1aW50OF90IHN1ZmZpeDsNCisgIGlmIChzZXRqbXAoam1wKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB3aGlsZSAoc3JjX2JpdF9udW0gPCBzcmNfbGVuKSB7DQorICAgIGlmICghTG9va1VwSW5UYWJsZShzcmNfYnVmLCBzcmNfb2Zmc2V0LCBzcmNfYml0X29mZnNldCkpIHsNCisgICAgICBFbmNvZGVTdHJpbmcoY29kZV90YWJsZVtpbmRleF9udW1dLnByZWZpeCwgZHN0X2J1ZiwgZHN0X2xlbiwgb2Zmc2V0KTsNCisgICAgICBpZiAoaW5kZXhfbnVtID09IEdJRl9NQVhfTFpXX0NPREUpIHsNCisgICAgICAgIHN1ZmZpeCA9IGNvZGVfdGFibGVbaW5kZXhfbnVtIC0gMV0uc3VmZml4Ow0KKyAgICAgICAgRW5jb2RlU3RyaW5nKGNvZGVfY2xlYXIsIGRzdF9idWYsIGRzdF9sZW4sIG9mZnNldCk7DQorICAgICAgICBDbGVhclRhYmxlKCk7DQorICAgICAgICBjb2RlX3RhYmxlW2luZGV4X251bV0ucHJlZml4ID0gc3VmZml4Ow0KKyAgICAgICAgY29kZV90YWJsZVtpbmRleF9udW1dLnN1ZmZpeCA9IF9naWZfY3V0X2J1ZigNCisgICAgICAgICAgICBzcmNfYnVmLCBzcmNfb2Zmc2V0LCBzcmNfYml0X2N1dCwgc3JjX2JpdF9vZmZzZXQsIHNyY19iaXRfbnVtKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgY29kZV90YWJsZVtpbmRleF9udW1dLnByZWZpeCA9IGNvZGVfdGFibGVbaW5kZXhfbnVtIC0gMV0uc3VmZml4Ow0KKyAgICAgICAgY29kZV90YWJsZVtpbmRleF9udW1dLnN1ZmZpeCA9IF9naWZfY3V0X2J1ZigNCisgICAgICAgICAgICBzcmNfYnVmLCBzcmNfb2Zmc2V0LCBzcmNfYml0X2N1dCwgc3JjX2JpdF9vZmZzZXQsIHNyY19iaXRfbnVtKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHNyY19vZmZzZXQgPSAwOw0KKyAgc3JjX2JpdF9vZmZzZXQgPSAwOw0KKyAgc3JjX2JpdF9udW0gPSAwOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0dpZkxaV0VuY29kZXI6Okxvb2tVcEluVGFibGUoY29uc3QgdWludDhfdCogYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIG9mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QmIGJpdF9vZmZzZXQpIHsNCisgIGZvciAoRlhfV09SRCBpID0gdGFibGVfY3VyOyBpIDwgaW5kZXhfbnVtOyBpKyspIHsNCisgICAgaWYgKGNvZGVfdGFibGVbaV0ucHJlZml4ID09IGNvZGVfdGFibGVbaW5kZXhfbnVtXS5wcmVmaXggJiYNCisgICAgICAgIGNvZGVfdGFibGVbaV0uc3VmZml4ID09IGNvZGVfdGFibGVbaW5kZXhfbnVtXS5zdWZmaXgpIHsNCisgICAgICBjb2RlX3RhYmxlW2luZGV4X251bV0ucHJlZml4ID0gaTsNCisgICAgICBjb2RlX3RhYmxlW2luZGV4X251bV0uc3VmZml4ID0NCisgICAgICAgICAgX2dpZl9jdXRfYnVmKGJ1Ziwgb2Zmc2V0LCBzcmNfYml0X2N1dCwgYml0X29mZnNldCwgc3JjX2JpdF9udW0pOw0KKyAgICAgIHRhYmxlX2N1ciA9IGk7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgIH0NCisgIHRhYmxlX2N1ciA9IGNvZGVfZW5kICsgMTsNCisgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDR2lmTFpXRW5jb2Rlcjo6RmluaXNoKHVpbnQ4X3QqJiBkc3RfYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZHN0X2xlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIG9mZnNldCkgew0KKyAgRW5jb2RlU3RyaW5nKGNvZGVfdGFibGVbaW5kZXhfbnVtXS5wcmVmaXgsIGRzdF9idWYsIGRzdF9sZW4sIG9mZnNldCk7DQorICBFbmNvZGVTdHJpbmcoY29kZV9lbmQsIGRzdF9idWYsIGRzdF9sZW4sIG9mZnNldCk7DQorICBiaXRfb2Zmc2V0ID0gMDsNCisgIENsZWFyVGFibGUoKTsNCit9DQorZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgX2dpZl9jcmVhdGVfZGVjb21wcmVzcygpIHsNCisgIGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIgPQ0KKyAgICAgIChnaWZfZGVjb21wcmVzc19zdHJ1Y3QqKUZYX0FsbG9jKHVpbnQ4X3QsIHNpemVvZihnaWZfZGVjb21wcmVzc19zdHJ1Y3QpKTsNCisgIGlmIChnaWZfcHRyID09IE5VTEwpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBGWFNZU19tZW1zZXQoZ2lmX3B0ciwgMCwgc2l6ZW9mKGdpZl9kZWNvbXByZXNzX3N0cnVjdCkpOw0KKyAgZ2lmX3B0ci0+ZGVjb2RlX3N0YXR1cyA9IEdJRl9EX1NUQVRVU19TSUc7DQorICBnaWZfcHRyLT5pbWdfcHRyX2Fycl9wdHIgPSBuZXcgQ0ZYX0FycmF5VGVtcGxhdGU8R2lmSW1hZ2UqPjsNCisjaWZkZWYgR0lGX1NVUFBPUlRfQ09NTUVOVF9FWFRFTlNJT04NCisgIGdpZl9wdHItPmNtdF9kYXRhX3B0ciA9IG5ldyBDRlhfQnl0ZVN0cmluZzsNCisjZW5kaWYNCisjaWZkZWYgR0lGX1NVUFBPUlRfUExBSU5fVEVYVF9FWFRFTlNJT04NCisgIGdpZl9wdHItPnB0X3B0cl9hcnJfcHRyID0gbmV3IENGWF9BcnJheVRlbXBsYXRlPEdpZlBsYWluVGV4dCo+Ow0KKyNlbmRpZg0KKyAgcmV0dXJuIGdpZl9wdHI7DQorfQ0KK3ZvaWQgX2dpZl9kZXN0cm95X2RlY29tcHJlc3MoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3BwIGdpZl9wdHJfcHRyKSB7DQorICBpZiAoZ2lmX3B0cl9wdHIgPT0gTlVMTCB8fCAqZ2lmX3B0cl9wdHIgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyID0gKmdpZl9wdHJfcHRyOw0KKyAgKmdpZl9wdHJfcHRyID0gTlVMTDsNCisgIGlmIChnaWZfcHRyLT5nbG9iYWxfcGFsX3B0ciAhPSBOVUxMKSB7DQorICAgIEZYX0ZyZWUoZ2lmX3B0ci0+Z2xvYmFsX3BhbF9wdHIpOw0KKyAgfQ0KKyAgaWYgKGdpZl9wdHItPmltZ19kZWNvZGVyX3B0ciAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBnaWZfcHRyLT5pbWdfZGVjb2Rlcl9wdHI7DQorICB9DQorICBpZiAoZ2lmX3B0ci0+aW1nX3B0cl9hcnJfcHRyICE9IE5VTEwpIHsNCisgICAgaW50MzJfdCBzaXplX2ltZ19hcnIgPSBnaWZfcHRyLT5pbWdfcHRyX2Fycl9wdHItPkdldFNpemUoKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZV9pbWdfYXJyOyBpKyspIHsNCisgICAgICBHaWZJbWFnZSogcCA9IGdpZl9wdHItPmltZ19wdHJfYXJyX3B0ci0+R2V0QXQoaSk7DQorICAgICAgaWYgKHAtPmltYWdlX2luZm9fcHRyICE9IE5VTEwpIHsNCisgICAgICAgIEZYX0ZyZWUocC0+aW1hZ2VfaW5mb19wdHIpOw0KKyAgICAgIH0NCisgICAgICBpZiAocC0+aW1hZ2VfZ2NlX3B0ciAhPSBOVUxMKSB7DQorICAgICAgICBGWF9GcmVlKHAtPmltYWdlX2djZV9wdHIpOw0KKyAgICAgIH0NCisgICAgICBpZiAocC0+aW1hZ2Vfcm93X2J1ZiAhPSBOVUxMKSB7DQorICAgICAgICBGWF9GcmVlKHAtPmltYWdlX3Jvd19idWYpOw0KKyAgICAgIH0NCisgICAgICBpZiAocC0+bG9jYWxfcGFsX3B0ciAhPSBOVUxMICYmDQorICAgICAgICAgIHAtPmxvY2FsX3BhbF9wdHIgIT0gZ2lmX3B0ci0+Z2xvYmFsX3BhbF9wdHIpIHsNCisgICAgICAgIEZYX0ZyZWUocC0+bG9jYWxfcGFsX3B0cik7DQorICAgICAgfQ0KKyAgICAgIEZYX0ZyZWUocCk7DQorICAgIH0NCisgICAgZ2lmX3B0ci0+aW1nX3B0cl9hcnJfcHRyLT5SZW1vdmVBbGwoKTsNCisgICAgZGVsZXRlIGdpZl9wdHItPmltZ19wdHJfYXJyX3B0cjsNCisgIH0NCisjaWZkZWYgR0lGX1NVUFBPUlRfQVBQTElDQVRJT05fRVhURU5TSU9ODQorICBpZiAoZ2lmX3B0ci0+YXBwX2RhdGEgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKGdpZl9wdHItPmFwcF9kYXRhKTsNCisgIH0NCisjZW5kaWYNCisjaWZkZWYgR0lGX1NVUFBPUlRfQ09NTUVOVF9FWFRFTlNJT04NCisgIGlmIChnaWZfcHRyLT5jbXRfZGF0YV9wdHIgIT0gTlVMTCkgew0KKyAgICBkZWxldGUgZ2lmX3B0ci0+Y210X2RhdGFfcHRyOw0KKyAgfQ0KKyNlbmRpZg0KKyNpZmRlZiBHSUZfU1VQUE9SVF9HUkFQSElDX0NPTlRST0xfRVhURU5TSU9ODQorICBpZiAoZ2lmX3B0ci0+Z2NlX3B0ciAhPSBOVUxMKSB7DQorICAgIEZYX0ZyZWUoZ2lmX3B0ci0+Z2NlX3B0cik7DQorICB9DQorI2VuZGlmDQorI2lmZGVmIEdJRl9TVVBQT1JUX1BMQUlOX1RFWFRfRVhURU5TSU9ODQorICBpZiAoZ2lmX3B0ci0+cHRfcHRyX2Fycl9wdHIgIT0gTlVMTCkgew0KKyAgICBpbnQzMl90IHNpemVfcHRfYXJyID0gZ2lmX3B0ci0+cHRfcHRyX2Fycl9wdHItPkdldFNpemUoKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZV9wdF9hcnI7IGkrKykgew0KKyAgICAgIEdpZlBsYWluVGV4dCogcCA9IGdpZl9wdHItPnB0X3B0cl9hcnJfcHRyLT5HZXRBdChpKTsNCisgICAgICBpZiAocC0+Z2NlX3B0ciAhPSBOVUxMKSB7DQorICAgICAgICBGWF9GcmVlKHAtPmdjZV9wdHIpOw0KKyAgICAgIH0NCisgICAgICBpZiAocC0+cHRlX3B0ciAhPSBOVUxMKSB7DQorICAgICAgICBGWF9GcmVlKHAtPnB0ZV9wdHIpOw0KKyAgICAgIH0NCisgICAgICBpZiAocC0+c3RyaW5nX3B0ciAhPSBOVUxMKSB7DQorICAgICAgICBkZWxldGUgcC0+c3RyaW5nX3B0cjsNCisgICAgICB9DQorICAgIH0NCisgICAgZ2lmX3B0ci0+cHRfcHRyX2Fycl9wdHItPlJlbW92ZUFsbCgpOw0KKyAgICBkZWxldGUgZ2lmX3B0ci0+cHRfcHRyX2Fycl9wdHI7DQorICB9DQorI2VuZGlmDQorICBGWF9GcmVlKGdpZl9wdHIpOw0KK30NCitnaWZfY29tcHJlc3Nfc3RydWN0X3AgX2dpZl9jcmVhdGVfY29tcHJlc3MoKSB7DQorICBnaWZfY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciA9DQorICAgICAgKGdpZl9jb21wcmVzc19zdHJ1Y3QqKUZYX0FsbG9jKHVpbnQ4X3QsIHNpemVvZihnaWZfY29tcHJlc3Nfc3RydWN0KSk7DQorICBpZiAoZ2lmX3B0ciA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgRlhTWVNfbWVtc2V0KGdpZl9wdHIsIDAsIHNpemVvZihnaWZfY29tcHJlc3Nfc3RydWN0KSk7DQorICBnaWZfcHRyLT5pbWdfZW5jb2Rlcl9wdHIgPSBuZXcgQ0dpZkxaV0VuY29kZXI7DQorICBnaWZfcHRyLT5oZWFkZXJfcHRyID0gKEdpZkhlYWRlciopRlhfQWxsb2ModWludDhfdCwgc2l6ZW9mKEdpZkhlYWRlcikpOw0KKyAgaWYgKGdpZl9wdHItPmhlYWRlcl9wdHIgPT0gTlVMTCkgew0KKyAgICBkZWxldGUgKGdpZl9wdHItPmltZ19lbmNvZGVyX3B0cik7DQorICAgIEZYX0ZyZWUoZ2lmX3B0cik7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgRlhTWVNfbWVtY3B5KGdpZl9wdHItPmhlYWRlcl9wdHItPnNpZ25hdHVyZSwgR0lGX1NJR05BVFVSRSwgMyk7DQorICBGWFNZU19tZW1jcHkoZ2lmX3B0ci0+aGVhZGVyX3B0ci0+dmVyc2lvbiwgIjg5YSIsIDMpOw0KKyAgZ2lmX3B0ci0+bHNkX3B0ciA9IChHaWZMU0QqKUZYX0FsbG9jKHVpbnQ4X3QsIHNpemVvZihHaWZMU0QpKTsNCisgIGlmIChnaWZfcHRyLT5sc2RfcHRyID09IE5VTEwpIHsNCisgICAgRlhfRnJlZShnaWZfcHRyLT5oZWFkZXJfcHRyKTsNCisgICAgZGVsZXRlIChnaWZfcHRyLT5pbWdfZW5jb2Rlcl9wdHIpOw0KKyAgICBGWF9GcmVlKGdpZl9wdHIpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIEZYU1lTX21lbXNldChnaWZfcHRyLT5sc2RfcHRyLCAwLCBzaXplb2YoR2lmTFNEKSk7DQorICBnaWZfcHRyLT5pbWFnZV9pbmZvX3B0ciA9DQorICAgICAgKEdpZkltYWdlSW5mbyopRlhfQWxsb2ModWludDhfdCwgc2l6ZW9mKEdpZkltYWdlSW5mbykpOw0KKyAgaWYgKGdpZl9wdHItPmltYWdlX2luZm9fcHRyID09IE5VTEwpIHsNCisgICAgRlhfRnJlZShnaWZfcHRyLT5sc2RfcHRyKTsNCisgICAgRlhfRnJlZShnaWZfcHRyLT5oZWFkZXJfcHRyKTsNCisgICAgZGVsZXRlIChnaWZfcHRyLT5pbWdfZW5jb2Rlcl9wdHIpOw0KKyAgICBGWF9GcmVlKGdpZl9wdHIpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIEZYU1lTX21lbXNldChnaWZfcHRyLT5pbWFnZV9pbmZvX3B0ciwgMCwgc2l6ZW9mKEdpZkltYWdlSW5mbykpOw0KKyNpZmRlZiBHSUZfU1VQUE9SVF9BUFBMSUNBVElPTl9FWFRFTlNJT04NCisgIEZYU1lTX21lbWNweShnaWZfcHRyLT5hcHBfaWRlbnRpZnksICJuZXRzY2FwZSIsIDgpOw0KKyAgRlhTWVNfbWVtY3B5KGdpZl9wdHItPmFwcF9hdXRoZW50aWNhdGlvbiwgIjIuMCIsIDMpOw0KKyNlbmRpZg0KKyNpZmRlZiBHSUZfU1VQUE9SVF9HUkFQSElDX0NPTlRST0xfRVhURU5TSU9ODQorICBnaWZfcHRyLT5nY2VfcHRyID0gKEdpZkdDRSopRlhfQWxsb2ModWludDhfdCwgc2l6ZW9mKEdpZkdDRSkpOw0KKyAgaWYgKGdpZl9wdHItPmdjZV9wdHIgPT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKGdpZl9wdHItPmltYWdlX2luZm9fcHRyKTsNCisgICAgRlhfRnJlZShnaWZfcHRyLT5sc2RfcHRyKTsNCisgICAgRlhfRnJlZShnaWZfcHRyLT5oZWFkZXJfcHRyKTsNCisgICAgZGVsZXRlIChnaWZfcHRyLT5pbWdfZW5jb2Rlcl9wdHIpOw0KKyAgICBGWF9GcmVlKGdpZl9wdHIpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisjZW5kaWYNCisjaWZkZWYgR0lGX1NVUFBPUlRfUExBSU5fVEVYVF9FWFRFTlNJT04NCisgIGdpZl9wdHItPnB0ZV9wdHIgPSAoR2lmUFRFKilGWF9BbGxvYyh1aW50OF90LCBzaXplb2YoR2lmUFRFKSk7DQorICBpZiAoZ2lmX3B0ci0+cHRlX3B0ciA9PSBOVUxMKSB7DQorICAgIEZYX0ZyZWUoZ2lmX3B0ci0+Z2NlX3B0cik7DQorICAgIEZYX0ZyZWUoZ2lmX3B0ci0+aW1hZ2VfaW5mb19wdHIpOw0KKyAgICBGWF9GcmVlKGdpZl9wdHItPmxzZF9wdHIpOw0KKyAgICBGWF9GcmVlKGdpZl9wdHItPmhlYWRlcl9wdHIpOw0KKyAgICBkZWxldGUgKGdpZl9wdHItPmltZ19lbmNvZGVyX3B0cik7DQorICAgIEZYX0ZyZWUoZ2lmX3B0cik7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgRlhTWVNfbWVtc2V0KGdpZl9wdHItPnB0ZV9wdHIsIDAsIHNpemVvZihHaWZQVEUpKTsNCisgIGdpZl9wdHItPnB0ZV9wdHItPmJsb2NrX3NpemUgPSAxMjsNCisjZW5kaWYNCisgIHJldHVybiBnaWZfcHRyOw0KK30NCit2b2lkIF9naWZfZGVzdHJveV9jb21wcmVzcyhnaWZfY29tcHJlc3Nfc3RydWN0X3BwIGdpZl9wdHJfcHRyKSB7DQorICBpZiAoZ2lmX3B0cl9wdHIgPT0gTlVMTCB8fCAqZ2lmX3B0cl9wdHIgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBnaWZfY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciA9ICpnaWZfcHRyX3B0cjsNCisgICpnaWZfcHRyX3B0ciA9IE5VTEw7DQorICBpZiAoZ2lmX3B0ci0+aGVhZGVyX3B0ciAhPSBOVUxMKSB7DQorICAgIEZYX0ZyZWUoZ2lmX3B0ci0+aGVhZGVyX3B0cik7DQorICB9DQorICBpZiAoZ2lmX3B0ci0+bHNkX3B0ciAhPSBOVUxMKSB7DQorICAgIEZYX0ZyZWUoZ2lmX3B0ci0+bHNkX3B0cik7DQorICB9DQorICBpZiAoZ2lmX3B0ci0+Z2xvYmFsX3BhbCAhPSBOVUxMKSB7DQorICAgIEZYX0ZyZWUoZ2lmX3B0ci0+Z2xvYmFsX3BhbCk7DQorICB9DQorICBpZiAoZ2lmX3B0ci0+aW1hZ2VfaW5mb19wdHIgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKGdpZl9wdHItPmltYWdlX2luZm9fcHRyKTsNCisgIH0NCisgIGlmIChnaWZfcHRyLT5sb2NhbF9wYWwgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKGdpZl9wdHItPmxvY2FsX3BhbCk7DQorICB9DQorICBpZiAoZ2lmX3B0ci0+aW1nX2VuY29kZXJfcHRyICE9IE5VTEwpIHsNCisgICAgZGVsZXRlIGdpZl9wdHItPmltZ19lbmNvZGVyX3B0cjsNCisgIH0NCisjaWZkZWYgR0lGX1NVUFBPUlRfQVBQTElDQVRJT05fRVhURU5TSU9ODQorICBpZiAoZ2lmX3B0ci0+YXBwX2RhdGEgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKGdpZl9wdHItPmFwcF9kYXRhKTsNCisgIH0NCisjZW5kaWYNCisjaWZkZWYgR0lGX1NVUFBPUlRfR1JBUEhJQ19DT05UUk9MX0VYVEVOU0lPTg0KKyAgaWYgKGdpZl9wdHItPmdjZV9wdHIgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKGdpZl9wdHItPmdjZV9wdHIpOw0KKyAgfQ0KKyNlbmRpZg0KKyNpZmRlZiBHSUZfU1VQUE9SVF9DT01NRU5UX0VYVEVOU0lPTg0KKyAgaWYgKGdpZl9wdHItPmNtdF9kYXRhX3B0ciAhPSBOVUxMKSB7DQorICAgIEZYX0ZyZWUoZ2lmX3B0ci0+Y210X2RhdGFfcHRyKTsNCisgIH0NCisjZW5kaWYNCisjaWZkZWYgR0lGX1NVUFBPUlRfUExBSU5fVEVYVF9FWFRFTlNJT04NCisgIGlmIChnaWZfcHRyLT5wdGVfcHRyICE9IE5VTEwpIHsNCisgICAgRlhfRnJlZShnaWZfcHRyLT5wdGVfcHRyKTsNCisgIH0NCisjZW5kaWYNCisgIEZYX0ZyZWUoZ2lmX3B0cik7DQorfQ0KK3ZvaWQgX2dpZl9lcnJvcihnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCBjb25zdCBGWF9DSEFSKiBlcnJfbXNnKSB7DQorICBpZiAoZ2lmX3B0ciAhPSBOVUxMICYmIGdpZl9wdHItPl9naWZfZXJyb3JfZm4gIT0gTlVMTCkgew0KKyAgICBnaWZfcHRyLT5fZ2lmX2Vycm9yX2ZuKGdpZl9wdHIsIGVycl9tc2cpOw0KKyAgfQ0KK30NCit2b2lkIF9naWZfd2FybihnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCBjb25zdCBGWF9DSEFSKiBlcnJfbXNnKSB7fQ0KK2ludDMyX3QgX2dpZl9yZWFkX2hlYWRlcihnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyKSB7DQorICBpZiAoZ2lmX3B0ciA9PSBOVUxMKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgRlhfRFdPUkQgc2tpcF9zaXplX29yZyA9IGdpZl9wdHItPnNraXBfc2l6ZTsNCisgIEFTU0VSVChzaXplb2YoR2lmSGVhZGVyKSA9PSA2KTsNCisgIEdpZkhlYWRlciogZ2lmX2hlYWRlcl9wdHIgPSBOVUxMOw0KKyAgaWYgKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICh1aW50OF90KiopJmdpZl9oZWFkZXJfcHRyLCA2KSA9PSBOVUxMKSB7DQorICAgIHJldHVybiAyOw0KKyAgfQ0KKyAgaWYgKEZYU1lTX3N0cm5jbXAoZ2lmX2hlYWRlcl9wdHItPnNpZ25hdHVyZSwgR0lGX1NJR05BVFVSRSwgMykgIT0gMCB8fA0KKyAgICAgIGdpZl9oZWFkZXJfcHRyLT52ZXJzaW9uWzBdICE9ICc4JyB8fCBnaWZfaGVhZGVyX3B0ci0+dmVyc2lvblsyXSAhPSAnYScpIHsNCisgICAgX2dpZl9lcnJvcihnaWZfcHRyLCAiTm90IEEgR2lmIEltYWdlIik7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgQVNTRVJUKHNpemVvZihHaWZMU0QpID09IDcpOw0KKyAgR2lmTFNEKiBnaWZfbHNkX3B0ciA9IE5VTEw7DQorICBpZiAoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgKHVpbnQ4X3QqKikmZ2lmX2xzZF9wdHIsIDcpID09IE5VTEwpIHsNCisgICAgZ2lmX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgcmV0dXJuIDI7DQorICB9DQorICBpZiAoKChHaWZHRiopJmdpZl9sc2RfcHRyLT5nbG9iYWxfZmxhZyktPmdsb2JhbF9wYWwpIHsNCisgICAgZ2lmX3B0ci0+Z2xvYmFsX3BhbF9udW0gPSAyDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKChHaWZHRiopJmdpZl9sc2RfcHRyLT5nbG9iYWxfZmxhZyktPnBhbF9iaXRzOw0KKyAgICBBU1NFUlQoc2l6ZW9mKEdpZlBhbGV0dGUpID09IDMpOw0KKyAgICBpbnQzMl90IGdsb2JhbF9wYWxfc2l6ZSA9IGdpZl9wdHItPmdsb2JhbF9wYWxfbnVtICogMzsNCisgICAgdWludDhfdCogZ2xvYmFsX3BhbF9wdHIgPSBOVUxMOw0KKyAgICBpZiAoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmdsb2JhbF9wYWxfcHRyLCBnbG9iYWxfcGFsX3NpemUpID09IE5VTEwpIHsNCisgICAgICBnaWZfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgIHJldHVybiAyOw0KKyAgICB9DQorICAgIGdpZl9wdHItPmdsb2JhbF9zb3J0X2ZsYWcgPSAoKEdpZkdGKikmZ2lmX2xzZF9wdHItPmdsb2JhbF9mbGFnKS0+c29ydF9mbGFnOw0KKyAgICBnaWZfcHRyLT5nbG9iYWxfY29sb3JfcmVzb2x1dGlvbiA9DQorICAgICAgICAoKEdpZkdGKikmZ2lmX2xzZF9wdHItPmdsb2JhbF9mbGFnKS0+Y29sb3JfcmVzb2x1dGlvbjsNCisgICAgaWYgKGdpZl9wdHItPmdsb2JhbF9wYWxfcHRyICE9IE5VTEwpIHsNCisgICAgICBGWF9GcmVlKGdpZl9wdHItPmdsb2JhbF9wYWxfcHRyKTsNCisgICAgfQ0KKyAgICBnaWZfcHRyLT5nbG9iYWxfcGFsX3B0ciA9IE5VTEw7DQorICAgIGdpZl9wdHItPmdsb2JhbF9wYWxfcHRyID0gKEdpZlBhbGV0dGUqKUZYX0FsbG9jKHVpbnQ4X3QsIGdsb2JhbF9wYWxfc2l6ZSk7DQorICAgIEdJRl9QVFJfTk9UX05VTEwoZ2lmX3B0ci0+Z2xvYmFsX3BhbF9wdHIsIGdpZl9wdHIpOw0KKyAgICBGWFNZU19tZW1jcHkoZ2lmX3B0ci0+Z2xvYmFsX3BhbF9wdHIsIGdsb2JhbF9wYWxfcHRyLCBnbG9iYWxfcGFsX3NpemUpOw0KKyAgfQ0KKyAgZ2lmX3B0ci0+d2lkdGggPSAoaW50KV9HZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmZ2lmX2xzZF9wdHItPndpZHRoKTsNCisgIGdpZl9wdHItPmhlaWdodCA9IChpbnQpX0dldFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZnaWZfbHNkX3B0ci0+aGVpZ2h0KTsNCisgIGdpZl9wdHItPmJjX2luZGV4ID0gZ2lmX2xzZF9wdHItPmJjX2luZGV4Ow0KKyAgZ2lmX3B0ci0+cGl4ZWxfYXNwZWN0ID0gZ2lmX2xzZF9wdHItPnBpeGVsX2FzcGVjdDsNCisgIHJldHVybiAxOw0KK30NCitpbnQzMl90IF9naWZfZ2V0X2ZyYW1lKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIpIHsNCisgIGlmIChnaWZfcHRyID09IE5VTEwpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpbnQzMl90IHJldCA9IDE7DQorICB3aGlsZSAoVFJVRSkgew0KKyAgICBzd2l0Y2ggKGdpZl9wdHItPmRlY29kZV9zdGF0dXMpIHsNCisgICAgICBjYXNlIEdJRl9EX1NUQVRVU19UQUlMOg0KKyAgICAgICAgcmV0dXJuIDE7DQorICAgICAgY2FzZSBHSUZfRF9TVEFUVVNfU0lHOiB7DQorICAgICAgICB1aW50OF90KiBzaWdfcHRyID0gTlVMTDsNCisgICAgICAgIGlmIChfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmc2lnX3B0ciwgMSkgPT0gTlVMTCkgew0KKyAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgIH0NCisgICAgICAgIHN3aXRjaCAoKnNpZ19wdHIpIHsNCisgICAgICAgICAgY2FzZSBHSUZfU0lHX0VYVEVOU0lPTjoNCisgICAgICAgICAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19FWFQpOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICBjYXNlIEdJRl9TSUdfSU1BR0U6DQorICAgICAgICAgICAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfSU1HX0lORk8pOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICBjYXNlIEdJRl9TSUdfVFJBSUxFUjoNCisgICAgICAgICAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19UQUlMKTsNCisgICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBpZiAoZ2lmX3B0ci0+YXZhaWxfaW4pIHsNCisgICAgICAgICAgICAgIF9naWZfd2FybihnaWZfcHRyLCAiVGhlIEdpZiBGaWxlIGhhcyBub25fc3RhbmRhcmQgVGFnISIpOw0KKyAgICAgICAgICAgICAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfU0lHKTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBfZ2lmX3dhcm4oZ2lmX3B0ciwgIlRoZSBHaWYgRmlsZSBEb2Vzbid0IGhhdmUgVHJhaWxlciBUYWchIik7DQorICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGNhc2UgR0lGX0RfU1RBVFVTX0VYVDogew0KKyAgICAgICAgdWludDhfdCogZXh0X3B0ciA9IE5VTEw7DQorICAgICAgICBpZiAoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmV4dF9wdHIsIDEpID09IE5VTEwpIHsNCisgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICB9DQorICAgICAgICBzd2l0Y2ggKCpleHRfcHRyKSB7DQorI2lmZGVmIEdJRl9TVVBQT1JUX0FQUExJQ0FUSU9OX0VYVEVOU0lPTg0KKyAgICAgICAgICBjYXNlIEdJRl9CTE9DS19BRToNCisgICAgICAgICAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19FWFRfQUUpOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyNlbmRpZg0KKyNpZmRlZiBHSUZfU1VQUE9SVF9DT01NRU5UX0VYVEVOU0lPTg0KKyAgICAgICAgICBjYXNlIEdJRl9CTE9DS19DRToNCisgICAgICAgICAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19FWFRfQ0UpOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyNlbmRpZg0KKyNpZmRlZiBHSUZfU1VQUE9SVF9HUkFQSElDX0NPTlRST0xfRVhURU5TSU9ODQorICAgICAgICAgIGNhc2UgR0lGX0JMT0NLX0dDRToNCisgICAgICAgICAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19FWFRfR0NFKTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisjZW5kaWYNCisjaWZkZWYgR0lGX1NVUFBPUlRfUExBSU5fVEVYVF9FWFRFTlNJT04NCisgICAgICAgICAgY2FzZSBHSUZfQkxPQ0tfUFRFOg0KKyAgICAgICAgICAgIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX0VYVF9QVEUpOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyNlbmRpZg0KKyAgICAgICAgICBkZWZhdWx0OiB7DQorICAgICAgICAgICAgaW50MzJfdCBzdGF0dXMgPSBHSUZfRF9TVEFUVVNfRVhUX1VORTsNCisjaWZuZGVmIEdJRl9TVVBQT1JUX1BMQUlOX1RFWFRfRVhURU5TSU9ODQorICAgICAgICAgICAgaWYgKCpleHRfcHRyID09IEdJRl9CTE9DS19QVEUpIHsNCisgICAgICAgICAgICAgIHN0YXR1cyA9IEdJRl9EX1NUQVRVU19FWFRfUFRFOw0KKyAgICAgICAgICAgIH0NCisjZW5kaWYNCisgICAgICAgICAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIHN0YXR1cyk7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgY2FzZSBHSUZfRF9TVEFUVVNfSU1HX0lORk86IHsNCisgICAgICAgIHJldCA9IF9naWZfZGVjb2RlX2ltYWdlX2luZm8oZ2lmX3B0cik7DQorICAgICAgICBpZiAocmV0ICE9IDEpIHsNCisgICAgICAgICAgcmV0dXJuIHJldDsNCisgICAgICAgIH0NCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBjYXNlIEdJRl9EX1NUQVRVU19JTUdfREFUQTogew0KKyAgICAgICAgdWludDhfdCogZGF0YV9zaXplX3B0ciA9IE5VTEw7DQorICAgICAgICB1aW50OF90KiBkYXRhX3B0ciA9IE5VTEw7DQorICAgICAgICBGWF9EV09SRCBza2lwX3NpemVfb3JnID0gZ2lmX3B0ci0+c2tpcF9zaXplOw0KKyAgICAgICAgaWYgKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3NpemVfcHRyLCAxKSA9PSBOVUxMKSB7DQorICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd2hpbGUgKCpkYXRhX3NpemVfcHRyICE9IEdJRl9CTE9DS19URVJNSU5BTCkgew0KKyAgICAgICAgICBpZiAoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfcHRyLCAqZGF0YV9zaXplX3B0cikgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIGdpZl9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQorICAgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICAgIH0NCisgICAgICAgICAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfSU1HX0RBVEEpOw0KKyAgICAgICAgICBza2lwX3NpemVfb3JnID0gZ2lmX3B0ci0+c2tpcF9zaXplOw0KKyAgICAgICAgICBpZiAoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfc2l6ZV9wdHIsIDEpID09IE5VTEwpIHsNCisgICAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfU0lHKTsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBkZWZhdWx0OiB7DQorICAgICAgICByZXQgPSBfZ2lmX2RlY29kZV9leHRlbnNpb24oZ2lmX3B0cik7DQorICAgICAgICBpZiAocmV0ICE9IDEpIHsNCisgICAgICAgICAgcmV0dXJuIHJldDsNCisgICAgICAgIH0NCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIDE7DQorfQ0KK3ZvaWQgX2dpZl90YWtlb3Zlcl9nY2VfcHRyKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgR2lmR0NFKiogZ2NlX3B0cl9wdHIpIHsNCisgICpnY2VfcHRyX3B0ciA9IE5VTEw7DQorI2lmZGVmIEdJRl9TVVBQT1JUX0dSQVBISUNfQ09OVFJPTF9FWFRFTlNJT04NCisgIGlmIChnaWZfcHRyLT5nY2VfcHRyICE9IE5VTEwgJiYgZ2NlX3B0cl9wdHIgIT0gTlVMTCkgew0KKyAgICAqZ2NlX3B0cl9wdHIgPSBnaWZfcHRyLT5nY2VfcHRyOw0KKyAgICBnaWZfcHRyLT5nY2VfcHRyID0gTlVMTDsNCisgIH0NCisjZW5kaWYNCit9DQoraW50MzJfdCBfZ2lmX2RlY29kZV9leHRlbnNpb24oZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0cikgew0KKyAgdWludDhfdCogZGF0YV9zaXplX3B0ciA9IE5VTEw7DQorICB1aW50OF90KiBkYXRhX3B0ciA9IE5VTEw7DQorICBGWF9EV09SRCBza2lwX3NpemVfb3JnID0gZ2lmX3B0ci0+c2tpcF9zaXplOw0KKyAgc3dpdGNoIChnaWZfcHRyLT5kZWNvZGVfc3RhdHVzKSB7DQorI2lmZGVmIEdJRl9TVVBQT1JUX0FQUExJQ0FUSU9OX0VYVEVOU0lPTg0KKyAgICBjYXNlIEdJRl9EX1NUQVRVU19FWFRfQUU6IHsNCisgICAgICBBU1NFUlQoc2l6ZW9mKEdpZkFFKSA9PSAxMik7DQorICAgICAgR2lmQUUqIGdpZl9hZV9wdHIgPSBOVUxMOw0KKyAgICAgIGlmIChfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAodWludDhfdCoqKSZnaWZfYWVfcHRyLCAxMikgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIDI7DQorICAgICAgfQ0KKyAgICAgIENGWF9CeXRlU3RyaW5nIGdpZl9hZV9kYXRhX3N0cjsNCisgICAgICBpZiAoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfc2l6ZV9wdHIsIDEpID09IE5VTEwpIHsNCisgICAgICAgIGdpZl9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQorICAgICAgICByZXR1cm4gMjsNCisgICAgICB9DQorICAgICAgd2hpbGUgKCpkYXRhX3NpemVfcHRyICE9IEdJRl9CTE9DS19URVJNSU5BTCkgew0KKyAgICAgICAgdWludDhfdCBkYXRhX3NpemUgPSAqZGF0YV9zaXplX3B0cjsNCisgICAgICAgIGlmIChfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9wdHIsICpkYXRhX3NpemVfcHRyKSA9PSBOVUxMIHx8DQorICAgICAgICAgICAgX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfc2l6ZV9wdHIsIDEpID09IE5VTEwpIHsNCisgICAgICAgICAgZ2lmX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICB9DQorICAgICAgICBnaWZfYWVfZGF0YV9zdHIgKz0gQ0ZYX0J5dGVTdHJpbmcoKGNvbnN0IHVpbnQ4X3QqKWRhdGFfcHRyLCBkYXRhX3NpemUpOw0KKyAgICAgIH0NCisgICAgICBGWFNZU19tZW1jcHkoZ2lmX3B0ci0+YXBwX2lkZW50aWZ5LCBnaWZfYWVfcHRyLT5hcHBfaWRlbnRpZnksIDgpOw0KKyAgICAgIEZYU1lTX21lbWNweShnaWZfcHRyLT5hcHBfYXV0aGVudGljYXRpb24sIGdpZl9hZV9wdHItPmFwcF9hdXRoZW50aWNhdGlvbiwNCisgICAgICAgICAgICAgICAgICAgMyk7DQorICAgICAgZ2lmX3B0ci0+YXBwX2RhdGFfc2l6ZSA9IGdpZl9hZV9kYXRhX3N0ci5HZXRMZW5ndGgoKTsNCisgICAgICBpZiAoZ2lmX3B0ci0+YXBwX2RhdGEgIT0gTlVMTCkgew0KKyAgICAgICAgRlhfRnJlZShnaWZfcHRyLT5hcHBfZGF0YSk7DQorICAgICAgICBnaWZfcHRyLT5hcHBfZGF0YSA9IE5VTEw7DQorICAgICAgfQ0KKyAgICAgIGdpZl9wdHItPmFwcF9kYXRhID0gRlhfQWxsb2ModWludDhfdCwgZ2lmX3B0ci0+YXBwX2RhdGFfc2l6ZSk7DQorICAgICAgR0lGX1BUUl9OT1RfTlVMTChnaWZfcHRyLT5hcHBfZGF0YSwgZ2lmX3B0cik7DQorICAgICAgRlhTWVNfbWVtY3B5KGdpZl9wdHItPmFwcF9kYXRhLCBjb25zdCB1aW50OF90KihnaWZfYWVfZGF0YV9zdHIpLA0KKyAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5hcHBfZGF0YV9zaXplKTsNCisgICAgfSBicmVhazsNCisjZW5kaWYNCisjaWZkZWYgR0lGX1NVUFBPUlRfQ09NTUVOVF9FWFRFTlNJT04NCisgICAgY2FzZSBHSUZfRF9TVEFUVVNfRVhUX0NFOiB7DQorICAgICAgaWYgKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3NpemVfcHRyLCAxKSA9PSBOVUxMKSB7DQorICAgICAgICBnaWZfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgICAgcmV0dXJuIDI7DQorICAgICAgfQ0KKyAgICAgIGdpZl9wdHItPmNtdF9kYXRhX3B0ci0+RW1wdHkoKTsNCisgICAgICB3aGlsZSAoKmRhdGFfc2l6ZV9wdHIgIT0gR0lGX0JMT0NLX1RFUk1JTkFMKSB7DQorICAgICAgICB1aW50OF90IGRhdGFfc2l6ZSA9ICpkYXRhX3NpemVfcHRyOw0KKyAgICAgICAgaWYgKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3B0ciwgKmRhdGFfc2l6ZV9wdHIpID09IE5VTEwgfHwNCisgICAgICAgICAgICBfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9zaXplX3B0ciwgMSkgPT0gTlVMTCkgew0KKyAgICAgICAgICBnaWZfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgIH0NCisgICAgICAgICooZ2lmX3B0ci0+Y210X2RhdGFfcHRyKSArPQ0KKyAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nKChjb25zdCBGWF9DSEFSKilkYXRhX3B0ciwgZGF0YV9zaXplKTsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorI2VuZGlmDQorI2lmZGVmIEdJRl9TVVBQT1JUX1BMQUlOX1RFWFRfRVhURU5TSU9ODQorICAgIGNhc2UgR0lGX0RfU1RBVFVTX0VYVF9QVEU6IHsNCisgICAgICBBU1NFUlQoc2l6ZW9mKEdpZlBURSkgPT0gMTMpOw0KKyAgICAgIEdpZlBURSogZ2lmX3B0ZV9wdHIgPSBOVUxMOw0KKyAgICAgIGlmIChfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAodWludDhfdCoqKSZnaWZfcHRlX3B0ciwgMTMpID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiAyOw0KKyAgICAgIH0NCisgICAgICBHaWZQbGFpblRleHQqIGdpZl9wdF9wdHIgPSBGWF9BbGxvYyhHaWZQbGFpblRleHQsIDEpOw0KKyAgICAgIEdJRl9QVFJfTk9UX05VTEwoZ2lmX3B0X3B0ciwgZ2lmX3B0cik7DQorICAgICAgRlhTWVNfbWVtc2V0KGdpZl9wdF9wdHIsIDAsIHNpemVvZihHaWZQbGFpblRleHQpKTsNCisgICAgICBfZ2lmX3Rha2VvdmVyX2djZV9wdHIoZ2lmX3B0ciwgJmdpZl9wdF9wdHItPmdjZV9wdHIpOw0KKyAgICAgIGdpZl9wdF9wdHItPnB0ZV9wdHIgPSAoR2lmUFRFKilGWF9BbGxvYyh1aW50OF90LCBzaXplb2YoR2lmUFRFKSk7DQorICAgICAgR0lGX1BUUl9OT1RfTlVMTChnaWZfcHRfcHRyLT5wdGVfcHRyLCBnaWZfcHRyKTsNCisgICAgICBnaWZfcHRfcHRyLT5zdHJpbmdfcHRyID0gbmV3IENGWF9CeXRlU3RyaW5nOw0KKyAgICAgIEdJRl9QVFJfTk9UX05VTEwoZ2lmX3B0X3B0ci0+c3RyaW5nX3B0ciwgZ2lmX3B0cik7DQorICAgICAgZ2lmX3B0X3B0ci0+cHRlX3B0ci0+YmxvY2tfc2l6ZSA9IGdpZl9wdGVfcHRyLT5ibG9ja19zaXplOw0KKyAgICAgIGdpZl9wdF9wdHItPnB0ZV9wdHItPmdyaWRfbGVmdCA9DQorICAgICAgICAgIF9HZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmZ2lmX3B0ZV9wdHItPmdyaWRfbGVmdCk7DQorICAgICAgZ2lmX3B0X3B0ci0+cHRlX3B0ci0+Z3JpZF90b3AgPQ0KKyAgICAgICAgICBfR2V0V29yZF9MU0JGaXJzdCgodWludDhfdCopJmdpZl9wdGVfcHRyLT5ncmlkX3RvcCk7DQorICAgICAgZ2lmX3B0X3B0ci0+cHRlX3B0ci0+Z3JpZF93aWR0aCA9DQorICAgICAgICAgIF9HZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmZ2lmX3B0ZV9wdHItPmdyaWRfd2lkdGgpOw0KKyAgICAgIGdpZl9wdF9wdHItPnB0ZV9wdHItPmdyaWRfaGVpZ2h0ID0NCisgICAgICAgICAgX0dldFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZnaWZfcHRlX3B0ci0+Z3JpZF9oZWlnaHQpOw0KKyAgICAgIGdpZl9wdF9wdHItPnB0ZV9wdHItPmNoYXJfd2lkdGggPSBnaWZfcHRlX3B0ci0+Y2hhcl93aWR0aDsNCisgICAgICBnaWZfcHRfcHRyLT5wdGVfcHRyLT5jaGFyX2hlaWdodCA9IGdpZl9wdGVfcHRyLT5jaGFyX2hlaWdodDsNCisgICAgICBnaWZfcHRfcHRyLT5wdGVfcHRyLT5mY19pbmRleCA9IGdpZl9wdGVfcHRyLT5mY19pbmRleDsNCisgICAgICBnaWZfcHRfcHRyLT5wdGVfcHRyLT5iY19pbmRleCA9IGdpZl9wdGVfcHRyLT5iY19pbmRleDsNCisgICAgICBpZiAoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfc2l6ZV9wdHIsIDEpID09IE5VTEwpIHsNCisgICAgICAgIGdpZl9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQorICAgICAgICBpZiAoZ2lmX3B0X3B0ciAhPSBOVUxMKSB7DQorICAgICAgICAgIGlmIChnaWZfcHRfcHRyLT5nY2VfcHRyICE9IE5VTEwpIHsNCisgICAgICAgICAgICBGWF9GcmVlKGdpZl9wdF9wdHItPmdjZV9wdHIpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChnaWZfcHRfcHRyLT5wdGVfcHRyICE9IE5VTEwpIHsNCisgICAgICAgICAgICBGWF9GcmVlKGdpZl9wdF9wdHItPnB0ZV9wdHIpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChnaWZfcHRfcHRyLT5zdHJpbmdfcHRyICE9IE5VTEwpIHsNCisgICAgICAgICAgICBkZWxldGUgZ2lmX3B0X3B0ci0+c3RyaW5nX3B0cjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBGWF9GcmVlKGdpZl9wdF9wdHIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIDI7DQorICAgICAgfQ0KKyAgICAgIHdoaWxlICgqZGF0YV9zaXplX3B0ciAhPSBHSUZfQkxPQ0tfVEVSTUlOQUwpIHsNCisgICAgICAgIHVpbnQ4X3QgZGF0YV9zaXplID0gKmRhdGFfc2l6ZV9wdHI7DQorICAgICAgICBpZiAoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfcHRyLCAqZGF0YV9zaXplX3B0cikgPT0gTlVMTCB8fA0KKyAgICAgICAgICAgIF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3NpemVfcHRyLCAxKSA9PSBOVUxMKSB7DQorICAgICAgICAgIGdpZl9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQorICAgICAgICAgIGlmIChnaWZfcHRfcHRyICE9IE5VTEwpIHsNCisgICAgICAgICAgICBpZiAoZ2lmX3B0X3B0ci0+Z2NlX3B0ciAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICBGWF9GcmVlKGdpZl9wdF9wdHItPmdjZV9wdHIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoZ2lmX3B0X3B0ci0+cHRlX3B0ciAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICBGWF9GcmVlKGdpZl9wdF9wdHItPnB0ZV9wdHIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoZ2lmX3B0X3B0ci0+c3RyaW5nX3B0ciAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICBkZWxldGUgZ2lmX3B0X3B0ci0+c3RyaW5nX3B0cjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhfRnJlZShnaWZfcHRfcHRyKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICByZXR1cm4gMjsNCisgICAgICAgIH0NCisgICAgICAgICooZ2lmX3B0X3B0ci0+c3RyaW5nX3B0cikgKz0NCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZygoY29uc3QgRlhfQ0hBUiopZGF0YV9wdHIsIGRhdGFfc2l6ZSk7DQorICAgICAgfQ0KKyAgICAgIGdpZl9wdHItPnB0X3B0cl9hcnJfcHRyLT5BZGQoZ2lmX3B0X3B0cik7DQorICAgIH0gYnJlYWs7DQorI2VuZGlmDQorI2lmZGVmIEdJRl9TVVBQT1JUX0dSQVBISUNfQ09OVFJPTF9FWFRFTlNJT04NCisgICAgY2FzZSBHSUZfRF9TVEFUVVNfRVhUX0dDRTogew0KKyAgICAgIEFTU0VSVChzaXplb2YoR2lmR0NFKSA9PSA1KTsNCisgICAgICBHaWZHQ0UqIGdpZl9nY2VfcHRyID0gTlVMTDsNCisgICAgICBpZiAoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgKHVpbnQ4X3QqKikmZ2lmX2djZV9wdHIsIDYpID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiAyOw0KKyAgICAgIH0NCisgICAgICBpZiAoZ2lmX3B0ci0+Z2NlX3B0ciA9PSBOVUxMKSB7DQorICAgICAgICBnaWZfcHRyLT5nY2VfcHRyID0gKEdpZkdDRSopRlhfQWxsb2ModWludDhfdCwgc2l6ZW9mKEdpZkdDRSkpOw0KKyAgICAgICAgR0lGX1BUUl9OT1RfTlVMTChnaWZfcHRyLT5nY2VfcHRyLCBnaWZfcHRyKTsNCisgICAgICB9DQorICAgICAgZ2lmX3B0ci0+Z2NlX3B0ci0+YmxvY2tfc2l6ZSA9IGdpZl9nY2VfcHRyLT5ibG9ja19zaXplOw0KKyAgICAgIGdpZl9wdHItPmdjZV9wdHItPmdjZV9mbGFnID0gZ2lmX2djZV9wdHItPmdjZV9mbGFnOw0KKyAgICAgIGdpZl9wdHItPmdjZV9wdHItPmRlbGF5X3RpbWUgPQ0KKyAgICAgICAgICBfR2V0V29yZF9MU0JGaXJzdCgodWludDhfdCopJmdpZl9nY2VfcHRyLT5kZWxheV90aW1lKTsNCisgICAgICBnaWZfcHRyLT5nY2VfcHRyLT50cmFuc19pbmRleCA9IGdpZl9nY2VfcHRyLT50cmFuc19pbmRleDsNCisgICAgfSBicmVhazsNCisjZW5kaWYNCisgICAgZGVmYXVsdDogew0KKyNpZm5kZWYgR0lGX1NVUFBPUlRfUExBSU5fVEVYVF9FWFRFTlNJT04NCisgICAgICBpZiAoZ2lmX3B0ci0+ZGVjb2RlX3N0YXR1cyA9PSBHSUZfRF9TVEFUVVNfRVhUX1BURSkgew0KKyNpZmRlZiBHSUZfU1VQUE9SVF9HUkFQSElDX0NPTlRST0xfRVhURU5TSU9ODQorICAgICAgICBpZiAoZ2lmX3B0ci0+Z2NlX3B0ciAhPSBOVUxMKSB7DQorICAgICAgICAgIEZYX0ZyZWUoZ2lmX3B0ci0+Z2NlX3B0cik7DQorICAgICAgICAgIGdpZl9wdHItPmdjZV9wdHIgPSBOVUxMOw0KKyAgICAgICAgfQ0KKyNlbmRpZg0KKyAgICAgIH0NCisjZW5kaWYNCisgICAgICBpZiAoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfc2l6ZV9wdHIsIDEpID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiAyOw0KKyAgICAgIH0NCisgICAgICB3aGlsZSAoKmRhdGFfc2l6ZV9wdHIgIT0gR0lGX0JMT0NLX1RFUk1JTkFMKSB7DQorICAgICAgICBpZiAoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfcHRyLCAqZGF0YV9zaXplX3B0cikgPT0gTlVMTCB8fA0KKyAgICAgICAgICAgIF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3NpemVfcHRyLCAxKSA9PSBOVUxMKSB7DQorICAgICAgICAgIGdpZl9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7DQorICAgICAgICAgIHJldHVybiAyOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfU0lHKTsNCisgIHJldHVybiAxOw0KK30NCitpbnQzMl90IF9naWZfZGVjb2RlX2ltYWdlX2luZm8oZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0cikgew0KKyAgaWYgKGdpZl9wdHItPndpZHRoID09IDAgfHwgZ2lmX3B0ci0+aGVpZ2h0ID09IDApIHsNCisgICAgX2dpZl9lcnJvcihnaWZfcHRyLCAiTm8gSW1hZ2UgSGVhZGVyIEluZm8iKTsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBGWF9EV09SRCBza2lwX3NpemVfb3JnID0gZ2lmX3B0ci0+c2tpcF9zaXplOw0KKyAgQVNTRVJUKHNpemVvZihHaWZJbWFnZUluZm8pID09IDkpOw0KKyAgR2lmSW1hZ2VJbmZvKiBnaWZfaW1nX2luZm9fcHRyID0gTlVMTDsNCisgIGlmIChfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAodWludDhfdCoqKSZnaWZfaW1nX2luZm9fcHRyLCA5KSA9PSBOVUxMKSB7DQorICAgIHJldHVybiAyOw0KKyAgfQ0KKyAgR2lmSW1hZ2UqIGdpZl9pbWFnZV9wdHIgPSAoR2lmSW1hZ2UqKUZYX0FsbG9jKHVpbnQ4X3QsIHNpemVvZihHaWZJbWFnZSkpOw0KKyAgR0lGX1BUUl9OT1RfTlVMTChnaWZfaW1hZ2VfcHRyLCBnaWZfcHRyKTsNCisgIEZYU1lTX21lbXNldChnaWZfaW1hZ2VfcHRyLCAwLCBzaXplb2YoR2lmSW1hZ2UpKTsNCisgIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyID0NCisgICAgICAoR2lmSW1hZ2VJbmZvKilGWF9BbGxvYyh1aW50OF90LCBzaXplb2YoR2lmSW1hZ2VJbmZvKSk7DQorICBHSUZfUFRSX05PVF9OVUxMKGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLCBnaWZfcHRyKTsNCisgIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT5sZWZ0ID0NCisgICAgICBfR2V0V29yZF9MU0JGaXJzdCgodWludDhfdCopJmdpZl9pbWdfaW5mb19wdHItPmxlZnQpOw0KKyAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPnRvcCA9DQorICAgICAgX0dldFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZnaWZfaW1nX2luZm9fcHRyLT50b3ApOw0KKyAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPndpZHRoID0NCisgICAgICBfR2V0V29yZF9MU0JGaXJzdCgodWludDhfdCopJmdpZl9pbWdfaW5mb19wdHItPndpZHRoKTsNCisgIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT5oZWlnaHQgPQ0KKyAgICAgIF9HZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmZ2lmX2ltZ19pbmZvX3B0ci0+aGVpZ2h0KTsNCisgIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT5sb2NhbF9mbGFnID0gZ2lmX2ltZ19pbmZvX3B0ci0+bG9jYWxfZmxhZzsNCisgIGlmIChnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bGVmdCArDQorICAgICAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+d2lkdGggPg0KKyAgICAgICAgICBnaWZfcHRyLT53aWR0aCB8fA0KKyAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT50b3AgKw0KKyAgICAgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPmhlaWdodCA+DQorICAgICAgICAgIGdpZl9wdHItPmhlaWdodCkgew0KKyAgICBpZiAoZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHIgIT0gTlVMTCkgew0KKyAgICAgIEZYX0ZyZWUoZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHIpOw0KKyAgICB9DQorICAgIGlmIChnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmICE9IE5VTEwpIHsNCisgICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpOw0KKyAgICB9DQorICAgIEZYX0ZyZWUoZ2lmX2ltYWdlX3B0cik7DQorICAgIF9naWZfZXJyb3IoZ2lmX3B0ciwgIkltYWdlIERhdGEgT3V0IE9mIExTRCwgVGhlIEZpbGUgTWF5IEJlIENvcnJ1cHQiKTsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBHaWZMRiogZ2lmX2ltZ19pbmZvX2xmX3B0ciA9IChHaWZMRiopJmdpZl9pbWdfaW5mb19wdHItPmxvY2FsX2ZsYWc7DQorICBpZiAoZ2lmX2ltZ19pbmZvX2xmX3B0ci0+bG9jYWxfcGFsKSB7DQorICAgIEFTU0VSVChzaXplb2YoR2lmUGFsZXR0ZSkgPT0gMyk7DQorICAgIGludDMyX3QgbG9jX3BhbF9zaXplID0gKDIgPDwgZ2lmX2ltZ19pbmZvX2xmX3B0ci0+cGFsX2JpdHMpICogMzsNCisgICAgdWludDhfdCogbG9jX3BhbF9wdHIgPSBOVUxMOw0KKyAgICBpZiAoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmxvY19wYWxfcHRyLCBsb2NfcGFsX3NpemUpID09IE5VTEwpIHsNCisgICAgICBnaWZfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgIGlmIChnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ciAhPSBOVUxMKSB7DQorICAgICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyKTsNCisgICAgICB9DQorICAgICAgaWYgKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYgIT0gTlVMTCkgew0KKyAgICAgICAgRlhfRnJlZShnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmKTsNCisgICAgICB9DQorICAgICAgRlhfRnJlZShnaWZfaW1hZ2VfcHRyKTsNCisgICAgICByZXR1cm4gMjsNCisgICAgfQ0KKyAgICBnaWZfaW1hZ2VfcHRyLT5sb2NhbF9wYWxfcHRyID0NCisgICAgICAgIChHaWZQYWxldHRlKilnaWZfcHRyLT5fZ2lmX2Fza19idWZfZm9yX3BhbF9mbihnaWZfcHRyLCBsb2NfcGFsX3NpemUpOw0KKyAgICBpZiAoZ2lmX2ltYWdlX3B0ci0+bG9jYWxfcGFsX3B0ciAhPSBOVUxMKSB7DQorICAgICAgRlhTWVNfbWVtY3B5KCh1aW50OF90KilnaWZfaW1hZ2VfcHRyLT5sb2NhbF9wYWxfcHRyLCBsb2NfcGFsX3B0ciwNCisgICAgICAgICAgICAgICAgICAgbG9jX3BhbF9zaXplKTsNCisgICAgfQ0KKyAgfQ0KKyAgdWludDhfdCogY29kZV9zaXplX3B0ciA9IE5VTEw7DQorICBpZiAoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmNvZGVfc2l6ZV9wdHIsIDEpID09IE5VTEwpIHsNCisgICAgZ2lmX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgaWYgKGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyICE9IE5VTEwpIHsNCisgICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyKTsNCisgICAgfQ0KKyAgICBpZiAoZ2lmX2ltYWdlX3B0ci0+bG9jYWxfcGFsX3B0ciAhPSBOVUxMKSB7DQorICAgICAgRlhfRnJlZShnaWZfaW1hZ2VfcHRyLT5sb2NhbF9wYWxfcHRyKTsNCisgICAgfQ0KKyAgICBpZiAoZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1ZiAhPSBOVUxMKSB7DQorICAgICAgRlhfRnJlZShnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmKTsNCisgICAgfQ0KKyAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHIpOw0KKyAgICByZXR1cm4gMjsNCisgIH0NCisgIGdpZl9pbWFnZV9wdHItPmltYWdlX2NvZGVfc2l6ZSA9ICpjb2RlX3NpemVfcHRyOw0KKyAgZ2lmX3B0ci0+X2dpZl9yZWNvcmRfY3VycmVudF9wb3NpdGlvbl9mbihnaWZfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfZGF0YV9wb3MpOw0KKyAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfZGF0YV9wb3MgKz0gZ2lmX3B0ci0+c2tpcF9zaXplOw0KKyAgX2dpZl90YWtlb3Zlcl9nY2VfcHRyKGdpZl9wdHIsICZnaWZfaW1hZ2VfcHRyLT5pbWFnZV9nY2VfcHRyKTsNCisgIGdpZl9wdHItPmltZ19wdHJfYXJyX3B0ci0+QWRkKGdpZl9pbWFnZV9wdHIpOw0KKyAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfSU1HX0RBVEEpOw0KKyAgcmV0dXJuIDE7DQorfQ0KK2ludDMyX3QgX2dpZl9sb2FkX2ZyYW1lKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIGludDMyX3QgZnJhbWVfbnVtKSB7DQorICBpZiAoZ2lmX3B0ciA9PSBOVUxMIHx8IGZyYW1lX251bSA8IDAgfHwNCisgICAgICBmcmFtZV9udW0gPj0gZ2lmX3B0ci0+aW1nX3B0cl9hcnJfcHRyLT5HZXRTaXplKCkpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICB1aW50OF90KiBkYXRhX3NpemVfcHRyID0gTlVMTDsNCisgIHVpbnQ4X3QqIGRhdGFfcHRyID0gTlVMTDsNCisgIEZYX0RXT1JEIHNraXBfc2l6ZV9vcmcgPSBnaWZfcHRyLT5za2lwX3NpemU7DQorICBHaWZJbWFnZSogZ2lmX2ltYWdlX3B0ciA9IGdpZl9wdHItPmltZ19wdHJfYXJyX3B0ci0+R2V0QXQoZnJhbWVfbnVtKTsNCisgIEZYX0RXT1JEIGdpZl9pbWdfcm93X2J5dGVzID0gZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPndpZHRoOw0KKyAgaWYgKGdpZl9wdHItPmRlY29kZV9zdGF0dXMgPT0gR0lGX0RfU1RBVFVTX1RBSUwpIHsNCisgICAgaWYgKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpIHsNCisgICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpOw0KKyAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYgPSBOVUxMOw0KKyAgICB9DQorICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYgPSBGWF9BbGxvYyh1aW50OF90LCBnaWZfaW1nX3Jvd19ieXRlcyk7DQorICAgIEdJRl9QVFJfTk9UX05VTEwoZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1ZiwgZ2lmX3B0cik7DQorICAgIEdpZkdDRSogZ2lmX2ltZ19nY2VfcHRyID0gZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfZ2NlX3B0cjsNCisgICAgaW50MzJfdCBsb2NfcGFsX251bSA9DQorICAgICAgICAoKEdpZkxGKikmZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPmxvY2FsX2ZsYWcpLT5sb2NhbF9wYWwNCisgICAgICAgICAgICA/ICgyIDw8ICgoR2lmTEYqKSZnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bG9jYWxfZmxhZykNCisgICAgICAgICAgICAgICAgICAgICAgICAtPnBhbF9iaXRzKQ0KKyAgICAgICAgICAgIDogMDsNCisgICAgZ2lmX3B0ci0+YXZhaWxfaW4gPSAwOw0KKyAgICBpZiAoZ2lmX2ltZ19nY2VfcHRyID09IE5VTEwpIHsNCisgICAgICBGWF9CT09MIGJSZXMgPSBnaWZfcHRyLT5fZ2lmX2dldF9yZWNvcmRfcG9zaXRpb25fZm4oDQorICAgICAgICAgIGdpZl9wdHIsIGdpZl9pbWFnZV9wdHItPmltYWdlX2RhdGFfcG9zLA0KKyAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bGVmdCwNCisgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPnRvcCwNCisgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPndpZHRoLA0KKyAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+aGVpZ2h0LCBsb2NfcGFsX251bSwNCisgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+bG9jYWxfcGFsX3B0ciwgMCwgMCwgLTEsIDAsDQorICAgICAgICAgIChGWF9CT09MKSgoR2lmTEYqKSZnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bG9jYWxfZmxhZykNCisgICAgICAgICAgICAgIC0+aW50ZXJsYWNlKTsNCisgICAgICBpZiAoIWJSZXMpIHsNCisgICAgICAgIEZYX0ZyZWUoZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1Zik7DQorICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmID0gTlVMTDsNCisgICAgICAgIF9naWZfZXJyb3IoZ2lmX3B0ciwgIkVycm9yIFJlYWQgUmVjb3JkIFBvc2l0aW9uIERhdGEiKTsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBGWF9CT09MIGJSZXMgPSBnaWZfcHRyLT5fZ2lmX2dldF9yZWNvcmRfcG9zaXRpb25fZm4oDQorICAgICAgICAgIGdpZl9wdHIsIGdpZl9pbWFnZV9wdHItPmltYWdlX2RhdGFfcG9zLA0KKyAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bGVmdCwNCisgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPnRvcCwNCisgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPndpZHRoLA0KKyAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+aGVpZ2h0LCBsb2NfcGFsX251bSwNCisgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+bG9jYWxfcGFsX3B0ciwNCisgICAgICAgICAgKGludDMyX3QpZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfZ2NlX3B0ci0+ZGVsYXlfdGltZSwNCisgICAgICAgICAgKEZYX0JPT0wpKChHaWZDRUYqKSZnaWZfaW1hZ2VfcHRyLT5pbWFnZV9nY2VfcHRyLT5nY2VfZmxhZykNCisgICAgICAgICAgICAgIC0+dXNlcl9pbnB1dCwNCisgICAgICAgICAgKChHaWZDRUYqKSZnaWZfaW1hZ2VfcHRyLT5pbWFnZV9nY2VfcHRyLT5nY2VfZmxhZyktPnRyYW5zcGFyZW5jeQ0KKyAgICAgICAgICAgICAgPyAoaW50MzJfdClnaWZfaW1hZ2VfcHRyLT5pbWFnZV9nY2VfcHRyLT50cmFuc19pbmRleA0KKyAgICAgICAgICAgICAgOiAtMSwNCisgICAgICAgICAgKGludDMyX3QpKChHaWZDRUYqKSZnaWZfaW1hZ2VfcHRyLT5pbWFnZV9nY2VfcHRyLT5nY2VfZmxhZykNCisgICAgICAgICAgICAgIC0+ZGlzcG9zYWxfbWV0aG9kLA0KKyAgICAgICAgICAoRlhfQk9PTCkoKEdpZkxGKikmZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPmxvY2FsX2ZsYWcpDQorICAgICAgICAgICAgICAtPmludGVybGFjZSk7DQorICAgICAgaWYgKCFiUmVzKSB7DQorICAgICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpOw0KKyAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1ZiA9IE5VTEw7DQorICAgICAgICBfZ2lmX2Vycm9yKGdpZl9wdHIsICJFcnJvciBSZWFkIFJlY29yZCBQb3NpdGlvbiBEYXRhIik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGdpZl9wdHItPmltZ19kZWNvZGVyX3B0ciA9PSBOVUxMKSB7DQorICAgICAgZ2lmX3B0ci0+aW1nX2RlY29kZXJfcHRyID0gbmV3IENHaWZMWldEZWNvZGVyKGdpZl9wdHItPmVycl9wdHIpOw0KKyAgICAgIEdJRl9QVFJfTk9UX05VTEwoZ2lmX3B0ci0+aW1nX2RlY29kZXJfcHRyLCBnaWZfcHRyKTsNCisgICAgfQ0KKyAgICBnaWZfcHRyLT5pbWdfZGVjb2Rlcl9wdHItPkluaXRUYWJsZShnaWZfaW1hZ2VfcHRyLT5pbWFnZV9jb2RlX3NpemUpOw0KKyAgICBnaWZfcHRyLT5pbWdfcm93X29mZnNldCA9IDA7DQorICAgIGdpZl9wdHItPmltZ19yb3dfYXZhaWxfc2l6ZSA9IDA7DQorICAgIGdpZl9wdHItPmltZ19wYXNzX251bSA9IDA7DQorICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19udW0gPSAwOw0KKyAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19JTUdfREFUQSk7DQorICB9DQorICBDR2lmTFpXRGVjb2RlciogaW1nX2RlY29kZXJfcHRyID0gZ2lmX3B0ci0+aW1nX2RlY29kZXJfcHRyOw0KKyAgaWYgKGdpZl9wdHItPmRlY29kZV9zdGF0dXMgPT0gR0lGX0RfU1RBVFVTX0lNR19EQVRBKSB7DQorICAgIGlmIChfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9zaXplX3B0ciwgMSkgPT0gTlVMTCkgew0KKyAgICAgIHJldHVybiAyOw0KKyAgICB9DQorICAgIGlmICgqZGF0YV9zaXplX3B0ciAhPSBHSUZfQkxPQ0tfVEVSTUlOQUwpIHsNCisgICAgICBpZiAoX2dpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfcHRyLCAqZGF0YV9zaXplX3B0cikgPT0gTlVMTCkgew0KKyAgICAgICAgZ2lmX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsNCisgICAgICAgIHJldHVybiAyOw0KKyAgICAgIH0NCisgICAgICBpbWdfZGVjb2Rlcl9wdHItPklucHV0KGRhdGFfcHRyLCAqZGF0YV9zaXplX3B0cik7DQorICAgICAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfSU1HX0RBVEEpOw0KKyAgICAgIGdpZl9wdHItPmltZ19yb3dfb2Zmc2V0ICs9IGdpZl9wdHItPmltZ19yb3dfYXZhaWxfc2l6ZTsNCisgICAgICBnaWZfcHRyLT5pbWdfcm93X2F2YWlsX3NpemUgPSBnaWZfaW1nX3Jvd19ieXRlcyAtIGdpZl9wdHItPmltZ19yb3dfb2Zmc2V0Ow0KKyAgICAgIGludDMyX3QgcmV0ID0gaW1nX2RlY29kZXJfcHRyLT5EZWNvZGUoDQorICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYgKyBnaWZfcHRyLT5pbWdfcm93X29mZnNldCwNCisgICAgICAgICAgZ2lmX3B0ci0+aW1nX3Jvd19hdmFpbF9zaXplKTsNCisgICAgICBpZiAocmV0ID09IDApIHsNCisgICAgICAgIEZYX0ZyZWUoZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1Zik7DQorICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmID0gTlVMTDsNCisgICAgICAgIF9naWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX1RBSUwpOw0KKyAgICAgICAgX2dpZl9lcnJvcihnaWZfcHRyLCAiRGVjb2RlIEltYWdlIERhdGEgRXJyb3IiKTsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICAgIH0NCisgICAgICB3aGlsZSAocmV0ICE9IDApIHsNCisgICAgICAgIGlmIChyZXQgPT0gMSkgew0KKyAgICAgICAgICBnaWZfcHRyLT5fZ2lmX2dldF9yb3dfZm4oZ2lmX3B0ciwgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X251bSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpOw0KKyAgICAgICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpOw0KKyAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmID0gTlVMTDsNCisgICAgICAgICAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfVEFJTCk7DQorICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHJldCA9PSAyKSB7DQorICAgICAgICAgIEFTU0VSVChpbWdfZGVjb2Rlcl9wdHItPkdldEF2YWlsSW5wdXQoKSA9PSAwKTsNCisgICAgICAgICAgc2tpcF9zaXplX29yZyA9IGdpZl9wdHItPnNraXBfc2l6ZTsNCisgICAgICAgICAgaWYgKF9naWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3NpemVfcHRyLCAxKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKCpkYXRhX3NpemVfcHRyICE9IEdJRl9CTE9DS19URVJNSU5BTCkgew0KKyAgICAgICAgICAgIGlmIChfZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9wdHIsICpkYXRhX3NpemVfcHRyKSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICBnaWZfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOw0KKyAgICAgICAgICAgICAgcmV0dXJuIDI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGltZ19kZWNvZGVyX3B0ci0+SW5wdXQoZGF0YV9wdHIsICpkYXRhX3NpemVfcHRyKTsNCisgICAgICAgICAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19JTUdfREFUQSk7DQorICAgICAgICAgICAgZ2lmX3B0ci0+aW1nX3Jvd19vZmZzZXQgKz0gZ2lmX3B0ci0+aW1nX3Jvd19hdmFpbF9zaXplOw0KKyAgICAgICAgICAgIGdpZl9wdHItPmltZ19yb3dfYXZhaWxfc2l6ZSA9DQorICAgICAgICAgICAgICAgIGdpZl9pbWdfcm93X2J5dGVzIC0gZ2lmX3B0ci0+aW1nX3Jvd19vZmZzZXQ7DQorICAgICAgICAgICAgcmV0ID0gaW1nX2RlY29kZXJfcHRyLT5EZWNvZGUoDQorICAgICAgICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYgKyBnaWZfcHRyLT5pbWdfcm93X29mZnNldCwNCisgICAgICAgICAgICAgICAgZ2lmX3B0ci0+aW1nX3Jvd19hdmFpbF9zaXplKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHJldCA9PSAzKSB7DQorICAgICAgICAgIGlmICgoKEdpZkxGKikmZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPmxvY2FsX2ZsYWcpLT5pbnRlcmxhY2UpIHsNCisgICAgICAgICAgICBnaWZfcHRyLT5fZ2lmX2dldF9yb3dfZm4oZ2lmX3B0ciwgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X251bSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1Zik7DQorICAgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X251bSArPQ0KKyAgICAgICAgICAgICAgICBzX2dpZl9pbnRlcmxhY2Vfc3RlcFtnaWZfcHRyLT5pbWdfcGFzc19udW1dOw0KKyAgICAgICAgICAgIGlmIChnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfbnVtID49DQorICAgICAgICAgICAgICAgIChpbnQzMl90KWdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT5oZWlnaHQpIHsNCisgICAgICAgICAgICAgIGdpZl9wdHItPmltZ19wYXNzX251bSsrOw0KKyAgICAgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X251bSA9DQorICAgICAgICAgICAgICAgICAgc19naWZfaW50ZXJsYWNlX3N0ZXBbZ2lmX3B0ci0+aW1nX3Bhc3NfbnVtXSAvIDI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGdpZl9wdHItPl9naWZfZ2V0X3Jvd19mbihnaWZfcHRyLCBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfbnVtKyssDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGdpZl9wdHItPmltZ19yb3dfb2Zmc2V0ID0gMDsNCisgICAgICAgICAgZ2lmX3B0ci0+aW1nX3Jvd19hdmFpbF9zaXplID0gZ2lmX2ltZ19yb3dfYnl0ZXM7DQorICAgICAgICAgIHJldCA9IGltZ19kZWNvZGVyX3B0ci0+RGVjb2RlKA0KKyAgICAgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1ZiArIGdpZl9wdHItPmltZ19yb3dfb2Zmc2V0LA0KKyAgICAgICAgICAgICAgZ2lmX3B0ci0+aW1nX3Jvd19hdmFpbF9zaXplKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChyZXQgPT0gMCkgew0KKyAgICAgICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpOw0KKyAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmID0gTlVMTDsNCisgICAgICAgICAgX2dpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfVEFJTCk7DQorICAgICAgICAgIF9naWZfZXJyb3IoZ2lmX3B0ciwgIkRlY29kZSBJbWFnZSBEYXRhIEVycm9yIik7DQorICAgICAgICAgIHJldHVybiAwOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19UQUlMKTsNCisgIH0NCisgIF9naWZfZXJyb3IoZ2lmX3B0ciwgIkRlY29kZSBJbWFnZSBEYXRhIEVycm9yIik7DQorICByZXR1cm4gMDsNCit9DQordm9pZCBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhdHVzKSB7DQorICBnaWZfcHRyLT5kZWNvZGVfc3RhdHVzID0gc3RhdHVzOw0KKyAgZ2lmX3B0ci0+bmV4dF9pbiArPSBnaWZfcHRyLT5za2lwX3NpemU7DQorICBnaWZfcHRyLT5hdmFpbF9pbiAtPSBnaWZfcHRyLT5za2lwX3NpemU7DQorICBnaWZfcHRyLT5za2lwX3NpemUgPSAwOw0KK30NCit1aW50OF90KiBfZ2lmX3JlYWRfZGF0YShnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBkZXNfYnVmX3BwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRhdGFfc2l6ZSkgew0KKyAgaWYgKGdpZl9wdHIgPT0gTlVMTCB8fCBnaWZfcHRyLT5hdmFpbF9pbiA8IGdpZl9wdHItPnNraXBfc2l6ZSArIGRhdGFfc2l6ZSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgICpkZXNfYnVmX3BwID0gZ2lmX3B0ci0+bmV4dF9pbiArIGdpZl9wdHItPnNraXBfc2l6ZTsNCisgIGdpZl9wdHItPnNraXBfc2l6ZSArPSBkYXRhX3NpemU7DQorICByZXR1cm4gKmRlc19idWZfcHA7DQorfQ0KK3ZvaWQgX2dpZl9pbnB1dF9idWZmZXIoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19idWYsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSkgew0KKyAgZ2lmX3B0ci0+bmV4dF9pbiA9IHNyY19idWY7DQorICBnaWZfcHRyLT5hdmFpbF9pbiA9IHNyY19zaXplOw0KKyAgZ2lmX3B0ci0+c2tpcF9zaXplID0gMDsNCit9DQorRlhfRFdPUkQgX2dpZl9nZXRfYXZhaWxfaW5wdXQoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogYXZpYWxfYnVmX3B0cikgew0KKyAgaWYgKGF2aWFsX2J1Zl9wdHIgIT0gTlVMTCkgew0KKyAgICAqYXZpYWxfYnVmX3B0ciA9IE5VTEw7DQorICAgIGlmIChnaWZfcHRyLT5hdmFpbF9pbiA+IDApIHsNCisgICAgICAqYXZpYWxfYnVmX3B0ciA9IGdpZl9wdHItPm5leHRfaW47DQorICAgIH0NCisgIH0NCisgIHJldHVybiBnaWZfcHRyLT5hdmFpbF9pbjsNCit9DQoraW50MzJfdCBfZ2lmX2dldF9mcmFtZV9udW0oZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0cikgew0KKyAgcmV0dXJuIGdpZl9wdHItPmltZ19wdHJfYXJyX3B0ci0+R2V0U2l6ZSgpOw0KK30NCitzdGF0aWMgRlhfQk9PTCBfZ2lmX3dyaXRlX2hlYWRlcihnaWZfY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZHN0X2J1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZHN0X2xlbikgew0KKyAgaWYgKGdpZl9wdHItPmN1cl9vZmZzZXQpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBkc3RfbGVuID0gc2l6ZW9mKEdpZkhlYWRlcikgKyBzaXplb2YoR2lmTFNEKSArIHNpemVvZihHaWZHRik7DQorICBkc3RfYnVmID0gRlhfVHJ5QWxsb2ModWludDhfdCwgZHN0X2xlbik7DQorICBpZiAoZHN0X2J1ZiA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZYU1lTX21lbXNldChkc3RfYnVmLCAwLCBkc3RfbGVuKTsNCisgIEZYU1lTX21lbWNweShkc3RfYnVmLCBnaWZfcHRyLT5oZWFkZXJfcHRyLCBzaXplb2YoR2lmSGVhZGVyKSk7DQorICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IHNpemVvZihHaWZIZWFkZXIpOw0KKyAgX1NldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsIGdpZl9wdHItPmxzZF9wdHItPndpZHRoKTsNCisgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsNCisgIF9TZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LCBnaWZfcHRyLT5sc2RfcHRyLT5oZWlnaHQpOw0KKyAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAyOw0KKyAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gZ2lmX3B0ci0+bHNkX3B0ci0+Z2xvYmFsX2ZsYWc7DQorICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBnaWZfcHRyLT5sc2RfcHRyLT5iY19pbmRleDsNCisgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IGdpZl9wdHItPmxzZF9wdHItPnBpeGVsX2FzcGVjdDsNCisgIGlmIChnaWZfcHRyLT5nbG9iYWxfcGFsKSB7DQorICAgIEZYX1dPUkQgc2l6ZSA9IHNpemVvZihHaWZQYWxldHRlKSAqIGdpZl9wdHItPmdwYWxfbnVtOw0KKyAgICBpZiAoIV9naWZfZ3Jvd19idWYoZHN0X2J1ZiwgZHN0X2xlbiwgZ2lmX3B0ci0+Y3VyX29mZnNldCArIHNpemUpKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIEZYU1lTX21lbWNweSgmZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0XSwgZ2lmX3B0ci0+Z2xvYmFsX3BhbCwgc2l6ZSk7DQorICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gc2l6ZTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIGludGVybGFjZV9idWYoY29uc3QgdWludDhfdCogYnVmLCBGWF9EV09SRCBwaXRjaCwgRlhfRFdPUkQgaGVpZ2h0KSB7DQorICBDRlhfQXJyYXlUZW1wbGF0ZTx1aW50OF90Kj4gcGFzc1s0XTsNCisgIGludCBpLCBqOw0KKyAgRlhfRFdPUkQgcm93Ow0KKyAgcm93ID0gMDsNCisgIHVpbnQ4X3QqIHRlbXA7DQorICB3aGlsZSAocm93IDwgaGVpZ2h0KSB7DQorICAgIGlmIChyb3cgJSA4ID09IDApIHsNCisgICAgICBqID0gMDsNCisgICAgfSBlbHNlIGlmIChyb3cgJSA0ID09IDApIHsNCisgICAgICBqID0gMTsNCisgICAgfSBlbHNlIGlmIChyb3cgJSAyID09IDApIHsNCisgICAgICBqID0gMjsNCisgICAgfSBlbHNlIHsNCisgICAgICBqID0gMzsNCisgICAgfQ0KKyAgICB0ZW1wID0gRlhfQWxsb2ModWludDhfdCwgcGl0Y2gpOw0KKyAgICBpZiAodGVtcCA9PSBOVUxMKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIEZYU1lTX21lbWNweSh0ZW1wLCAmYnVmW3BpdGNoICogcm93XSwgcGl0Y2gpOw0KKyAgICBwYXNzW2pdLkFkZCh0ZW1wKTsNCisgICAgcm93Kys7DQorICB9DQorICBmb3IgKGkgPSAwLCByb3cgPSAwOyBpIDwgNDsgaSsrKSB7DQorICAgIGZvciAoaiA9IDA7IGogPCBwYXNzW2ldLkdldFNpemUoKTsgaisrLCByb3crKykgew0KKyAgICAgIEZYU1lTX21lbWNweSgodWludDhfdCopJmJ1ZltwaXRjaCAqIHJvd10sIHBhc3NbaV0uR2V0QXQoaiksIHBpdGNoKTsNCisgICAgICBGWF9GcmVlKHBhc3NbaV0uR2V0QXQoaikpOw0KKyAgICB9DQorICB9DQorfQ0KK3N0YXRpYyB2b2lkIF9naWZfd3JpdGVfYmxvY2tfZGF0YShjb25zdCB1aW50OF90KiBzcmNfYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfbGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZHN0X2J1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRzdF9sZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkc3Rfb2Zmc2V0KSB7DQorICBGWF9EV09SRCBzcmNfb2Zmc2V0ID0gMDsNCisgIHdoaWxlIChzcmNfbGVuID4gR0lGX0RBVEFfQkxPQ0spIHsNCisgICAgZHN0X2J1Zltkc3Rfb2Zmc2V0KytdID0gR0lGX0RBVEFfQkxPQ0s7DQorICAgIEZYU1lTX21lbWNweSgmZHN0X2J1Zltkc3Rfb2Zmc2V0XSwgJnNyY19idWZbc3JjX29mZnNldF0sIEdJRl9EQVRBX0JMT0NLKTsNCisgICAgZHN0X29mZnNldCArPSBHSUZfREFUQV9CTE9DSzsNCisgICAgc3JjX29mZnNldCArPSBHSUZfREFUQV9CTE9DSzsNCisgICAgc3JjX2xlbiAtPSBHSUZfREFUQV9CTE9DSzsNCisgIH0NCisgIGRzdF9idWZbZHN0X29mZnNldCsrXSA9ICh1aW50OF90KXNyY19sZW47DQorICBGWFNZU19tZW1jcHkoJmRzdF9idWZbZHN0X29mZnNldF0sICZzcmNfYnVmW3NyY19vZmZzZXRdLCBzcmNfbGVuKTsNCisgIGRzdF9vZmZzZXQgKz0gc3JjX2xlbjsNCit9DQorc3RhdGljIEZYX0JPT0wgX2dpZl93cml0ZV9kYXRhKGdpZl9jb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZHN0X2J1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRzdF9sZW4pIHsNCisgIGlmICghX2dpZl9ncm93X2J1Zihkc3RfYnVmLCBkc3RfbGVuLCBnaWZfcHRyLT5jdXJfb2Zmc2V0ICsgR0lGX0RBVEFfQkxPQ0spKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisjaWZkZWYgR0lGX1NVUFBPUlRfR1JBUEhJQ19DT05UUk9MX0VYVEVOU0lPTg0KKyAgaWYgKEZYU1lTX21lbWNtcChnaWZfcHRyLT5oZWFkZXJfcHRyLT52ZXJzaW9uLCAiODlhIiwgMykgPT0gMCkgew0KKyAgICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBHSUZfU0lHX0VYVEVOU0lPTjsNCisgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gR0lGX0JMT0NLX0dDRTsNCisgICAgZ2lmX3B0ci0+Z2NlX3B0ci0+YmxvY2tfc2l6ZSA9IDQ7DQorICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IGdpZl9wdHItPmdjZV9wdHItPmJsb2NrX3NpemU7DQorICAgIGdpZl9wdHItPmdjZV9wdHItPmdjZV9mbGFnID0gMDsNCisgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gZ2lmX3B0ci0+Z2NlX3B0ci0+Z2NlX2ZsYWc7DQorICAgIGdpZl9wdHItPmdjZV9wdHItPmRlbGF5X3RpbWUgPSAxMDsNCisgICAgX1NldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPmdjZV9wdHItPmRlbGF5X3RpbWUpOw0KKyAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IDI7DQorICAgIGdpZl9wdHItPmdjZV9wdHItPnRyYW5zX2luZGV4ID0gMDsNCisgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gZ2lmX3B0ci0+Z2NlX3B0ci0+dHJhbnNfaW5kZXg7DQorICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IDA7DQorICB9DQorI2VuZGlmDQorICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBHSUZfU0lHX0lNQUdFOw0KKyAgX1NldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bGVmdCk7DQorICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IDI7DQorICBfU2V0V29yZF9MU0JGaXJzdChkc3RfYnVmICsgZ2lmX3B0ci0+Y3VyX29mZnNldCwNCisgICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPmltYWdlX2luZm9fcHRyLT50b3ApOw0KKyAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAyOw0KKyAgX1NldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5pbWFnZV9pbmZvX3B0ci0+d2lkdGgpOw0KKyAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAyOw0KKyAgX1NldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5pbWFnZV9pbmZvX3B0ci0+aGVpZ2h0KTsNCisgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsNCisgIEdpZkxGJiBsZiA9IChHaWZMRiYpZ2lmX3B0ci0+aW1hZ2VfaW5mb19wdHItPmxvY2FsX2ZsYWc7DQorICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBnaWZfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bG9jYWxfZmxhZzsNCisgIGlmIChnaWZfcHRyLT5sb2NhbF9wYWwpIHsNCisgICAgRlhfRFdPUkQgcGFsX3NpemUgPSBzaXplb2YoR2lmUGFsZXR0ZSkgKiBnaWZfcHRyLT5scGFsX251bTsNCisgICAgaWYgKCFfZ2lmX2dyb3dfYnVmKGRzdF9idWYsIGRzdF9sZW4sIHBhbF9zaXplICsgZ2lmX3B0ci0+Y3VyX29mZnNldCkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhTWVNfbWVtY3B5KCZkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXRdLCBnaWZfcHRyLT5sb2NhbF9wYWwsIHBhbF9zaXplKTsNCisgICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSBwYWxfc2l6ZTsNCisgIH0NCisgIGlmIChsZi5pbnRlcmxhY2UpIHsNCisgICAgaW50ZXJsYWNlX2J1ZihnaWZfcHRyLT5zcmNfYnVmLCBnaWZfcHRyLT5zcmNfcGl0Y2gsDQorICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+aW1hZ2VfaW5mb19wdHItPmhlaWdodCk7DQorICB9DQorICB1aW50OF90IGNvZGVfYml0ID0gbGYucGFsX2JpdHM7DQorICBpZiAobGYubG9jYWxfcGFsID09IDApIHsNCisgICAgR2lmR0YmIGdmID0gKEdpZkdGJilnaWZfcHRyLT5sc2RfcHRyLT5nbG9iYWxfZmxhZzsNCisgICAgY29kZV9iaXQgPSBnZi5wYWxfYml0czsNCisgIH0NCisgIGdpZl9wdHItPmltZ19lbmNvZGVyX3B0ci0+U3RhcnQoY29kZV9iaXQsIGdpZl9wdHItPnNyY19idWYsIGRzdF9idWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPmN1cl9vZmZzZXQpOw0KKyAgRlhfRFdPUkQgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBnaWZfcHRyLT5zcmNfcm93OyBpKyspIHsNCisgICAgaWYgKCFnaWZfcHRyLT5pbWdfZW5jb2Rlcl9wdHItPkVuY29kZSgNCisgICAgICAgICAgICAmZ2lmX3B0ci0+c3JjX2J1ZltpICogZ2lmX3B0ci0+c3JjX3BpdGNoXSwNCisgICAgICAgICAgICBnaWZfcHRyLT5zcmNfd2lkdGggKiAoY29kZV9iaXQgKyAxKSwgZHN0X2J1ZiwgZHN0X2xlbiwNCisgICAgICAgICAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0KSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgfQ0KKyAgZ2lmX3B0ci0+aW1nX2VuY29kZXJfcHRyLT5GaW5pc2goZHN0X2J1ZiwgZHN0X2xlbiwgZ2lmX3B0ci0+Y3VyX29mZnNldCk7DQorICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSAwOw0KKyNpZmRlZiBHSUZfU1VQUE9SVF9DT01NRU5UX0VYVEVOU0lPTg0KKyAgaWYgKEZYU1lTX21lbWNtcChnaWZfcHRyLT5oZWFkZXJfcHRyLT52ZXJzaW9uLCAiODlhIiwgMykgPT0gMCAmJg0KKyAgICAgIGdpZl9wdHItPmNtdF9kYXRhX3B0cikgew0KKyAgICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBHSUZfU0lHX0VYVEVOU0lPTjsNCisgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gR0lGX0JMT0NLX0NFOw0KKyAgICBfZ2lmX3dyaXRlX2Jsb2NrX2RhdGEoZ2lmX3B0ci0+Y210X2RhdGFfcHRyLCBnaWZfcHRyLT5jbXRfZGF0YV9sZW4sIGRzdF9idWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfbGVuLCBnaWZfcHRyLT5jdXJfb2Zmc2V0KTsNCisgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gMDsNCisgIH0NCisjZW5kaWYNCisjaWZkZWYgR0lGX1NVUFBPUlRfUExBSU5fVEVYVF9FWFRFTlNJT04NCisgIGlmIChGWFNZU19tZW1jbXAoZ2lmX3B0ci0+aGVhZGVyX3B0ci0+dmVyc2lvbiwgIjg5YSIsIDMpID09IDAgJiYNCisgICAgICBnaWZfcHRyLT5wdGVfZGF0YV9wdHIpIHsNCisgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gR0lGX1NJR19FWFRFTlNJT047DQorICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IEdJRl9CTE9DS19QVEU7DQorICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IGdpZl9wdHItPnB0ZV9wdHItPmJsb2NrX3NpemU7DQorICAgIF9TZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5wdGVfcHRyLT5ncmlkX2xlZnQpOw0KKyAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IDI7DQorICAgIF9TZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5wdGVfcHRyLT5ncmlkX3RvcCk7DQorICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsNCisgICAgX1NldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPnB0ZV9wdHItPmdyaWRfd2lkdGgpOw0KKyAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IDI7DQorICAgIF9TZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5wdGVfcHRyLT5ncmlkX2hlaWdodCk7DQorICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsNCisgICAgX1NldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPnB0ZV9wdHItPmNoYXJfd2lkdGgpOw0KKyAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IDI7DQorICAgIF9TZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5wdGVfcHRyLT5jaGFyX2hlaWdodCk7DQorICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsNCisgICAgX1NldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPnB0ZV9wdHItPmZjX2luZGV4KTsNCisgICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAyOw0KKyAgICBfU2V0V29yZF9MU0JGaXJzdChkc3RfYnVmICsgZ2lmX3B0ci0+Y3VyX29mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+cHRlX3B0ci0+YmNfaW5kZXgpOw0KKyAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IDI7DQorICAgIF9naWZfd3JpdGVfYmxvY2tfZGF0YShnaWZfcHRyLT5wdGVfZGF0YV9wdHIsIGdpZl9wdHItPnB0ZV9kYXRhX2xlbiwgZHN0X2J1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9sZW4sIGdpZl9wdHItPmN1cl9vZmZzZXQpOw0KKyAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IGdpZl9wdHItPnB0ZV9kYXRhX2xlbjsNCisgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gMDsNCisgIH0NCisjZW5kaWYNCisjaWZkZWYgR0lGX1NVUFBPUlRfQVBQTElDQVRJT05fRVhURU5TSU9ODQorICBpZiAoRlhTWVNfbWVtY21wKGdpZl9wdHItPmhlYWRlcl9wdHItPnZlcnNpb24sICI4OWEiLCAzKSA9PSAwICYmDQorICAgICAgZ2lmX3B0ci0+YXBwX2RhdGEpIHsNCisgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gR0lGX1NJR19FWFRFTlNJT047DQorICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IEdJRl9CTE9DS19BRTsNCisgICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gMTE7DQorICAgIEZYU1lTX21lbWNweSgmZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0XSwgZ2lmX3B0ci0+YXBwX2lkZW50aWZ5LCA4KTsNCisgICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSA4Ow0KKyAgICBGWFNZU19tZW1jcHkoJmRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldF0sIGdpZl9wdHItPmFwcF9hdXRoZW50aWNhdGlvbiwgOCk7DQorICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMzsNCisgICAgRlhTWVNfbWVtY3B5KCZkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXRdLCBnaWZfcHRyLT5hcHBfZGF0YSwNCisgICAgICAgICAgICAgICAgIGdpZl9wdHItPmFwcF9kYXRhX3NpemUpOw0KKyAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IGdpZl9wdHItPmFwcF9kYXRhX3NpemU7DQorICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IDA7DQorICB9DQorI2VuZGlmDQorICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBHSUZfU0lHX1RSQUlMRVI7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBfZ2lmX2VuY29kZShnaWZfY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwNCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkc3RfYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGRzdF9sZW4pIHsNCisgIGlmICghX2dpZl93cml0ZV9oZWFkZXIoZ2lmX3B0ciwgZHN0X2J1ZiwgZHN0X2xlbikpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRlhfRFdPUkQgY3VyX29mZnNldCA9IGdpZl9wdHItPmN1cl9vZmZzZXQ7DQorICBGWF9CT09MIHJlcyA9IFRSVUU7DQorICBpZiAoZ2lmX3B0ci0+ZnJhbWVzKSB7DQorICAgIGdpZl9wdHItPmN1cl9vZmZzZXQtLTsNCisgIH0NCisgIGlmICghX2dpZl93cml0ZV9kYXRhKGdpZl9wdHIsIGRzdF9idWYsIGRzdF9sZW4pKSB7DQorICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgPSBjdXJfb2Zmc2V0Ow0KKyAgICByZXMgPSBGQUxTRTsNCisgIH0NCisgIGRzdF9sZW4gPSBnaWZfcHRyLT5jdXJfb2Zmc2V0Ow0KKyAgZHN0X2J1Zltkc3RfbGVuIC0gMV0gPSBHSUZfU0lHX1RSQUlMRVI7DQorICBpZiAocmVzKSB7DQorICAgIGdpZl9wdHItPmZyYW1lcysrOw0KKyAgfQ0KKyAgcmV0dXJuIHJlczsNCit9DQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9sZ2lmL2Z4X2dpZi5oIGIvY29yZS9zcmMvZnhjb2RlYy9sZ2lmL2Z4X2dpZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMmFjYzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNvZGVjL2xnaWYvZnhfZ2lmLmgKQEAgLTAsMCArMSwzMzIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgPHNldGptcC5oPg0KKw0KKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCINCisNCitleHRlcm4gRlhfV09SRCBfR2V0V29yZF9MU0JGaXJzdCh1aW50OF90KiBwKTsNCitleHRlcm4gdm9pZCBfU2V0V29yZF9MU0JGaXJzdCh1aW50OF90KiBwLCBGWF9XT1JEIHYpOw0KK2V4dGVybiB2b2lkIF9CcGNDb252ZXJ0KGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX2xlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY19icGMsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3RfYnBjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkc3RfYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkc3RfbGVuKTsNCisjZGVmaW5lIEdJRl9TVVBQT1JUX0NPTU1FTlRfRVhURU5TSU9ODQorI2RlZmluZSBHSUZfU1VQUE9SVF9HUkFQSElDX0NPTlRST0xfRVhURU5TSU9ODQorI2RlZmluZSBHSUZfU1VQUE9SVF9QTEFJTl9URVhUX0VYVEVOU0lPTg0KKyNkZWZpbmUgR0lGX1NJR05BVFVSRSAiR0lGIg0KKyNkZWZpbmUgR0lGX1NJR19FWFRFTlNJT04gMHgyMQ0KKyNkZWZpbmUgR0lGX1NJR19JTUFHRSAweDJDDQorI2RlZmluZSBHSUZfU0lHX1RSQUlMRVIgMHgzQg0KKyNkZWZpbmUgR0lGX0JMT0NLX0dDRSAweEY5DQorI2RlZmluZSBHSUZfQkxPQ0tfUFRFIDB4MDENCisjZGVmaW5lIEdJRl9CTE9DS19DRSAweEZFDQorI2RlZmluZSBHSUZfQkxPQ0tfQUUgMHhGRg0KKyNkZWZpbmUgR0lGX0JMT0NLX1RFUk1JTkFMIDB4MDANCisjZGVmaW5lIEdJRl9NQVhfTFpXX0NPREUgNDA5Ng0KKyNkZWZpbmUgR0lGX0RBVEFfQkxPQ0sgMjU1DQorI2RlZmluZSBHSUZfTUFYX0VSUk9SX1NJWkUgMjU2DQorI2RlZmluZSBHSUZfRF9TVEFUVVNfU0lHIDB4MDENCisjZGVmaW5lIEdJRl9EX1NUQVRVU19UQUlMIDB4MDINCisjZGVmaW5lIEdJRl9EX1NUQVRVU19FWFQgMHgwMw0KKyNkZWZpbmUgR0lGX0RfU1RBVFVTX0VYVF9BRSAweDA0DQorI2RlZmluZSBHSUZfRF9TVEFUVVNfRVhUX0NFIDB4MDUNCisjZGVmaW5lIEdJRl9EX1NUQVRVU19FWFRfR0NFIDB4MDYNCisjZGVmaW5lIEdJRl9EX1NUQVRVU19FWFRfUFRFIDB4MDcNCisjZGVmaW5lIEdJRl9EX1NUQVRVU19FWFRfVU5FIDB4MDgNCisjZGVmaW5lIEdJRl9EX1NUQVRVU19JTUdfSU5GTyAweDA5DQorI2RlZmluZSBHSUZfRF9TVEFUVVNfSU1HX0RBVEEgMHgwQQ0KKyNwcmFnbWEgcGFjaygxKQ0KK3R5cGVkZWYgc3RydWN0IHRhZ0dpZkdGIHsNCisgIHVpbnQ4X3QgcGFsX2JpdHMgOiAzOw0KKyAgdWludDhfdCBzb3J0X2ZsYWcgOiAxOw0KKyAgdWludDhfdCBjb2xvcl9yZXNvbHV0aW9uIDogMzsNCisgIHVpbnQ4X3QgZ2xvYmFsX3BhbCA6IDE7DQorfSBHaWZHRjsNCit0eXBlZGVmIHN0cnVjdCB0YWdHaWZMRiB7DQorICB1aW50OF90IHBhbF9iaXRzIDogMzsNCisgIHVpbnQ4X3QgcmVzZXJ2ZWQgOiAyOw0KKyAgdWludDhfdCBzb3J0X2ZsYWcgOiAxOw0KKyAgdWludDhfdCBpbnRlcmxhY2UgOiAxOw0KKyAgdWludDhfdCBsb2NhbF9wYWwgOiAxOw0KK30gR2lmTEY7DQordHlwZWRlZiBzdHJ1Y3QgdGFnR2lmSGVhZGVyIHsNCisgIGNoYXIgc2lnbmF0dXJlWzNdOw0KKyAgY2hhciB2ZXJzaW9uWzNdOw0KK30gR2lmSGVhZGVyOw0KK3R5cGVkZWYgc3RydWN0IHRhZ0dpZkxTRCB7DQorICBGWF9XT1JEIHdpZHRoOw0KKyAgRlhfV09SRCBoZWlnaHQ7DQorICB1aW50OF90IGdsb2JhbF9mbGFnOw0KKyAgdWludDhfdCBiY19pbmRleDsNCisgIHVpbnQ4X3QgcGl4ZWxfYXNwZWN0Ow0KK30gR2lmTFNEOw0KK3R5cGVkZWYgc3RydWN0IHRhZ0dpZkltYWdlSW5mbyB7DQorICBGWF9XT1JEIGxlZnQ7DQorICBGWF9XT1JEIHRvcDsNCisgIEZYX1dPUkQgd2lkdGg7DQorICBGWF9XT1JEIGhlaWdodDsNCisNCisgIHVpbnQ4X3QgbG9jYWxfZmxhZzsNCit9IEdpZkltYWdlSW5mbzsNCit0eXBlZGVmIHN0cnVjdCB0YWdHaWZDRUYgew0KKyAgdWludDhfdCB0cmFuc3BhcmVuY3kgOiAxOw0KKyAgdWludDhfdCB1c2VyX2lucHV0IDogMTsNCisgIHVpbnQ4X3QgZGlzcG9zYWxfbWV0aG9kIDogMzsNCisgIHVpbnQ4X3QgcmVzZXJ2ZWQgOiAzOw0KK30gR2lmQ0VGOw0KK3R5cGVkZWYgc3RydWN0IHRhZ0dpZkdDRSB7DQorICB1aW50OF90IGJsb2NrX3NpemU7DQorICB1aW50OF90IGdjZV9mbGFnOw0KKyAgRlhfV09SRCBkZWxheV90aW1lOw0KKyAgdWludDhfdCB0cmFuc19pbmRleDsNCit9IEdpZkdDRTsNCit0eXBlZGVmIHN0cnVjdCB0YWdHaWZQVEUgew0KKyAgdWludDhfdCBibG9ja19zaXplOw0KKyAgRlhfV09SRCBncmlkX2xlZnQ7DQorICBGWF9XT1JEIGdyaWRfdG9wOw0KKyAgRlhfV09SRCBncmlkX3dpZHRoOw0KKyAgRlhfV09SRCBncmlkX2hlaWdodDsNCisNCisgIHVpbnQ4X3QgY2hhcl93aWR0aDsNCisgIHVpbnQ4X3QgY2hhcl9oZWlnaHQ7DQorDQorICB1aW50OF90IGZjX2luZGV4Ow0KKyAgdWludDhfdCBiY19pbmRleDsNCit9IEdpZlBURTsNCit0eXBlZGVmIHN0cnVjdCB0YWdHaWZBRSB7DQorICB1aW50OF90IGJsb2NrX3NpemU7DQorICB1aW50OF90IGFwcF9pZGVudGlmeVs4XTsNCisgIHVpbnQ4X3QgYXBwX2F1dGhlbnRpY2F0aW9uWzNdOw0KK30gR2lmQUU7DQordHlwZWRlZiBzdHJ1Y3QgdGFnR2lmUGFsZXR0ZSB7IHVpbnQ4X3QgciwgZywgYjsgfSBHaWZQYWxldHRlOw0KKyNwcmFnbWEgcGFjaygpDQordHlwZWRlZiBzdHJ1Y3QgdGFnR2lmSW1hZ2Ugew0KKyAgR2lmR0NFKiBpbWFnZV9nY2VfcHRyOw0KKyAgR2lmUGFsZXR0ZSogbG9jYWxfcGFsX3B0cjsNCisgIEdpZkltYWdlSW5mbyogaW1hZ2VfaW5mb19wdHI7DQorICB1aW50OF90IGltYWdlX2NvZGVfc2l6ZTsNCisgIEZYX0RXT1JEIGltYWdlX2RhdGFfcG9zOw0KKyAgdWludDhfdCogaW1hZ2Vfcm93X2J1ZjsNCisgIGludDMyX3QgaW1hZ2Vfcm93X251bTsNCit9IEdpZkltYWdlOw0KK3R5cGVkZWYgc3RydWN0IHRhZ0dpZlBsYWluVGV4dCB7DQorICBHaWZHQ0UqIGdjZV9wdHI7DQorICBHaWZQVEUqIHB0ZV9wdHI7DQorICBDRlhfQnl0ZVN0cmluZyogc3RyaW5nX3B0cjsNCit9IEdpZlBsYWluVGV4dDsNCitjbGFzcyBDR2lmTFpXRGVjb2RlciB7DQorIHB1YmxpYzoNCisgIHN0cnVjdCB0YWdfVGFibGUgew0KKyAgICBGWF9XT1JEIHByZWZpeDsNCisgICAgdWludDhfdCBzdWZmaXg7DQorICB9Ow0KKyAgQ0dpZkxaV0RlY29kZXIoRlhfQ0hBUiogZXJyb3JfcHRyID0gTlVMTCkgeyBlcnJfbXNnX3B0ciA9IGVycm9yX3B0cjsgfQ0KKyAgdm9pZCBJbml0VGFibGUodWludDhfdCBjb2RlX2xlbik7DQorDQorICBpbnQzMl90IERlY29kZSh1aW50OF90KiBkZXNfYnVmLCBGWF9EV09SRCYgZGVzX3NpemUpOw0KKw0KKyAgdm9pZCBJbnB1dCh1aW50OF90KiBzcmNfYnVmLCBGWF9EV09SRCBzcmNfc2l6ZSk7DQorICBGWF9EV09SRCBHZXRBdmFpbElucHV0KCk7DQorDQorIHByaXZhdGU6DQorICB2b2lkIENsZWFyVGFibGUoKTsNCisgIHZvaWQgQWRkQ29kZShGWF9XT1JEIHByZWZpeF9jb2RlLCB1aW50OF90IGFwcGVuZF9jaGFyKTsNCisgIHZvaWQgRGVjb2RlU3RyaW5nKEZYX1dPUkQgY29kZSk7DQorICB1aW50OF90IGNvZGVfc2l6ZTsNCisgIHVpbnQ4X3QgY29kZV9zaXplX2N1cjsNCisgIEZYX1dPUkQgY29kZV9jbGVhcjsNCisgIEZYX1dPUkQgY29kZV9lbmQ7DQorICBGWF9XT1JEIGNvZGVfbmV4dDsNCisgIHVpbnQ4X3QgY29kZV9maXJzdDsNCisgIHVpbnQ4X3Qgc3RhY2tbR0lGX01BWF9MWldfQ09ERV07DQorICBGWF9XT1JEIHN0YWNrX3NpemU7DQorICB0YWdfVGFibGUgY29kZV90YWJsZVtHSUZfTUFYX0xaV19DT0RFXTsNCisgIEZYX1dPUkQgY29kZV9vbGQ7DQorDQorICB1aW50OF90KiBuZXh0X2luOw0KKyAgRlhfRFdPUkQgYXZhaWxfaW47DQorDQorICB1aW50OF90IGJpdHNfbGVmdDsNCisgIEZYX0RXT1JEIGNvZGVfc3RvcmU7DQorDQorICBGWF9DSEFSKiBlcnJfbXNnX3B0cjsNCit9Ow0KK2NsYXNzIENHaWZMWldFbmNvZGVyIHsNCisgcHVibGljOg0KKyAgc3RydWN0IHRhZ19UYWJsZSB7DQorICAgIEZYX1dPUkQgcHJlZml4Ow0KKyAgICB1aW50OF90IHN1ZmZpeDsNCisgIH07DQorICBDR2lmTFpXRW5jb2RlcigpOw0KKyAgfkNHaWZMWldFbmNvZGVyKCk7DQorICB2b2lkIFN0YXJ0KHVpbnQ4X3QgY29kZV9sZW4sDQorICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsDQorICAgICAgICAgICAgIHVpbnQ4X3QqJiBkc3RfYnVmLA0KKyAgICAgICAgICAgICBGWF9EV09SRCYgb2Zmc2V0KTsNCisgIEZYX0JPT0wgRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsDQorICAgICAgICAgICAgICAgICBGWF9EV09SRCBzcmNfbGVuLA0KKyAgICAgICAgICAgICAgICAgdWludDhfdComIGRzdF9idWYsDQorICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZHN0X2xlbiwNCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBvZmZzZXQpOw0KKyAgdm9pZCBGaW5pc2godWludDhfdComIGRzdF9idWYsIEZYX0RXT1JEJiBkc3RfbGVuLCBGWF9EV09SRCYgb2Zmc2V0KTsNCisNCisgcHJpdmF0ZToNCisgIHZvaWQgQ2xlYXJUYWJsZSgpOw0KKyAgRlhfQk9PTCBMb29rVXBJblRhYmxlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgb2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QmIGJpdF9vZmZzZXQpOw0KKyAgdm9pZCBFbmNvZGVTdHJpbmcoRlhfRFdPUkQgaW5kZXgsDQorICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZHN0X2J1ZiwNCisgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkc3RfbGVuLA0KKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIG9mZnNldCk7DQorICB2b2lkIFdyaXRlQmxvY2sodWludDhfdComIGRzdF9idWYsIEZYX0RXT1JEJiBkc3RfbGVuLCBGWF9EV09SRCYgb2Zmc2V0KTsNCisgIGptcF9idWYgam1wOw0KKyAgRlhfRFdPUkQgc3JjX29mZnNldDsNCisgIHVpbnQ4X3Qgc3JjX2JpdF9vZmZzZXQ7DQorICB1aW50OF90IHNyY19iaXRfY3V0Ow0KKyAgRlhfRFdPUkQgc3JjX2JpdF9udW07DQorICB1aW50OF90IGNvZGVfc2l6ZTsNCisgIEZYX1dPUkQgY29kZV9jbGVhcjsNCisgIEZYX1dPUkQgY29kZV9lbmQ7DQorICBGWF9XT1JEIGluZGV4X251bTsNCisgIHVpbnQ4X3QgYml0X29mZnNldDsNCisgIHVpbnQ4X3QgaW5kZXhfYml0X2N1cjsNCisgIHVpbnQ4X3QgaW5kZXhfYnVmW0dJRl9EQVRBX0JMT0NLXTsNCisgIHVpbnQ4X3QgaW5kZXhfYnVmX2xlbjsNCisgIHRhZ19UYWJsZSBjb2RlX3RhYmxlW0dJRl9NQVhfTFpXX0NPREVdOw0KKyAgRlhfV09SRCB0YWJsZV9jdXI7DQorfTsNCit0eXBlZGVmIHN0cnVjdCB0YWdfZ2lmX2RlY29tcHJlc3Nfc3RydWN0IGdpZl9kZWNvbXByZXNzX3N0cnVjdDsNCit0eXBlZGVmIGdpZl9kZWNvbXByZXNzX3N0cnVjdCogZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3A7DQordHlwZWRlZiBnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCogZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3BwOw0KK3N0YXRpYyBpbnQzMl90IHNfZ2lmX2ludGVybGFjZV9zdGVwWzRdID0gezgsIDgsIDQsIDJ9Ow0KK3N0cnVjdCB0YWdfZ2lmX2RlY29tcHJlc3Nfc3RydWN0IHsNCisgIGptcF9idWYgam1wYnVmOw0KKyAgRlhfQ0hBUiogZXJyX3B0cjsNCisgIHZvaWQgKCpfZ2lmX2Vycm9yX2ZuKShnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGVycl9tc2cpOw0KKyAgdm9pZCogY29udGV4dF9wdHI7DQorICBpbnQgd2lkdGg7DQorICBpbnQgaGVpZ2h0Ow0KKyAgR2lmUGFsZXR0ZSogZ2xvYmFsX3BhbF9wdHI7DQorICBpbnQzMl90IGdsb2JhbF9wYWxfbnVtOw0KKyAgdWludDhfdCBnbG9iYWxfc29ydF9mbGFnOw0KKyAgdWludDhfdCBnbG9iYWxfY29sb3JfcmVzb2x1dGlvbjsNCisNCisgIHVpbnQ4X3QgYmNfaW5kZXg7DQorICB1aW50OF90IHBpeGVsX2FzcGVjdDsNCisgIENHaWZMWldEZWNvZGVyKiBpbWdfZGVjb2Rlcl9wdHI7DQorICBGWF9EV09SRCBpbWdfcm93X29mZnNldDsNCisgIEZYX0RXT1JEIGltZ19yb3dfYXZhaWxfc2l6ZTsNCisgIHVpbnQ4X3QgaW1nX3Bhc3NfbnVtOw0KKyAgQ0ZYX0FycmF5VGVtcGxhdGU8R2lmSW1hZ2UqPiogaW1nX3B0cl9hcnJfcHRyOw0KKyAgdWludDhfdCogKCpfZ2lmX2Fza19idWZfZm9yX3BhbF9mbikoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGFsX3NpemUpOw0KKyAgdWludDhfdCogbmV4dF9pbjsNCisgIEZYX0RXT1JEIGF2YWlsX2luOw0KKyAgaW50MzJfdCBkZWNvZGVfc3RhdHVzOw0KKyAgRlhfRFdPUkQgc2tpcF9zaXplOw0KKyAgdm9pZCAoKl9naWZfcmVjb3JkX2N1cnJlbnRfcG9zaXRpb25fZm4pKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIGN1cl9wb3NfcHRyKTsNCisgIHZvaWQgKCpfZ2lmX2dldF9yb3dfZm4pKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJvd19udW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByb3dfYnVmKTsNCisgIEZYX0JPT0wJCQkoKl9naWZfZ2V0X3JlY29yZF9wb3NpdGlvbl9mbikoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwgRlhfRFdPUkQgY3VyX3BvcywNCisgICAgICAgICAgICBpbnQzMl90IGxlZnQsIGludDMyX3QgdG9wLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwNCisgICAgICAgICAgICBpbnQzMl90IHBhbF9udW0sIHZvaWQqIHBhbF9wdHIsDQorICAgICAgICAgICAgaW50MzJfdCBkZWxheV90aW1lLCBGWF9CT09MIHVzZXJfaW5wdXQsDQorICAgICAgICAgICAgaW50MzJfdCB0cmFuc19pbmRleCwgaW50MzJfdCBkaXNwb3NhbF9tZXRob2QsIEZYX0JPT0wgaW50ZXJsYWNlKTsNCisjaWZkZWYgR0lGX1NVUFBPUlRfQVBQTElDQVRJT05fRVhURU5TSU9ODQorICB1aW50OF90IGFwcF9pZGVudGlmeVs4XTsNCisgIHVpbnQ4X3QgYXBwX2F1dGhlbnRpY2F0aW9uWzNdOw0KKyAgRlhfRFdPUkQgYXBwX2RhdGFfc2l6ZTsNCisgIHVpbnQ4X3QqIGFwcF9kYXRhOw0KKyNlbmRpZg0KKyNpZmRlZiBHSUZfU1VQUE9SVF9DT01NRU5UX0VYVEVOU0lPTg0KKyAgQ0ZYX0J5dGVTdHJpbmcqIGNtdF9kYXRhX3B0cjsNCisjZW5kaWYNCisjaWZkZWYgR0lGX1NVUFBPUlRfR1JBUEhJQ19DT05UUk9MX0VYVEVOU0lPTg0KKyAgR2lmR0NFKiBnY2VfcHRyOw0KKyNlbmRpZg0KKyNpZmRlZiBHSUZfU1VQUE9SVF9QTEFJTl9URVhUX0VYVEVOU0lPTg0KKyAgQ0ZYX0FycmF5VGVtcGxhdGU8R2lmUGxhaW5UZXh0Kj4qIHB0X3B0cl9hcnJfcHRyOw0KKyNlbmRpZg0KK307DQordHlwZWRlZiBzdHJ1Y3QgdGFnX2dpZl9jb21wcmVzc19zdHJ1Y3QgZ2lmX2NvbXByZXNzX3N0cnVjdDsNCit0eXBlZGVmIGdpZl9jb21wcmVzc19zdHJ1Y3QqIGdpZl9jb21wcmVzc19zdHJ1Y3RfcDsNCit0eXBlZGVmIGdpZl9jb21wcmVzc19zdHJ1Y3RfcCogZ2lmX2NvbXByZXNzX3N0cnVjdF9wcDsNCitzdHJ1Y3QgdGFnX2dpZl9jb21wcmVzc19zdHJ1Y3Qgew0KKyAgY29uc3QgdWludDhfdCogc3JjX2J1ZjsNCisgIEZYX0RXT1JEIHNyY19waXRjaDsNCisgIEZYX0RXT1JEIHNyY193aWR0aDsNCisgIEZYX0RXT1JEIHNyY19yb3c7DQorICBGWF9EV09SRCBjdXJfb2Zmc2V0Ow0KKyAgRlhfRFdPUkQgZnJhbWVzOw0KKyAgR2lmSGVhZGVyKiBoZWFkZXJfcHRyOw0KKyAgR2lmTFNEKiBsc2RfcHRyOw0KKyAgR2lmUGFsZXR0ZSogZ2xvYmFsX3BhbDsNCisgIEZYX1dPUkQgZ3BhbF9udW07DQorICBHaWZQYWxldHRlKiBsb2NhbF9wYWw7DQorICBGWF9XT1JEIGxwYWxfbnVtOw0KKyAgR2lmSW1hZ2VJbmZvKiBpbWFnZV9pbmZvX3B0cjsNCisgIENHaWZMWldFbmNvZGVyKiBpbWdfZW5jb2Rlcl9wdHI7DQorI2lmZGVmIEdJRl9TVVBQT1JUX0FQUExJQ0FUSU9OX0VYVEVOU0lPTg0KKyAgdWludDhfdCBhcHBfaWRlbnRpZnlbOF07DQorICB1aW50OF90IGFwcF9hdXRoZW50aWNhdGlvblszXTsNCisgIEZYX0RXT1JEIGFwcF9kYXRhX3NpemU7DQorICB1aW50OF90KiBhcHBfZGF0YTsNCisjZW5kaWYNCisNCisjaWZkZWYgR0lGX1NVUFBPUlRfQ09NTUVOVF9FWFRFTlNJT04NCisgIHVpbnQ4X3QqIGNtdF9kYXRhX3B0cjsNCisgIEZYX0RXT1JEIGNtdF9kYXRhX2xlbjsNCisjZW5kaWYNCisNCisjaWZkZWYgR0lGX1NVUFBPUlRfR1JBUEhJQ19DT05UUk9MX0VYVEVOU0lPTg0KKyAgR2lmR0NFKiBnY2VfcHRyOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBHSUZfU1VQUE9SVF9QTEFJTl9URVhUX0VYVEVOU0lPTg0KKyAgR2lmUFRFKiBwdGVfcHRyOw0KKyAgY29uc3QgdWludDhfdCogcHRlX2RhdGFfcHRyOw0KKyAgRlhfRFdPUkQgcHRlX2RhdGFfbGVuOw0KKyNlbmRpZg0KK307DQordm9pZCBfZ2lmX2Vycm9yKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIGNvbnN0IEZYX0NIQVIqIGVycl9tc2cpOw0KK3ZvaWQgX2dpZl93YXJuKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIGNvbnN0IEZYX0NIQVIqIGVycl9tc2cpOw0KK2dpZl9kZWNvbXByZXNzX3N0cnVjdF9wIF9naWZfY3JlYXRlX2RlY29tcHJlc3MoKTsNCit2b2lkIF9naWZfZGVzdHJveV9kZWNvbXByZXNzKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wcCBnaWZfcHRyX3B0cik7DQorZ2lmX2NvbXByZXNzX3N0cnVjdF9wIF9naWZfY3JlYXRlX2NvbXByZXNzKCk7DQordm9pZCBfZ2lmX2Rlc3Ryb3lfY29tcHJlc3MoZ2lmX2NvbXByZXNzX3N0cnVjdF9wcCBnaWZfcHRyX3B0cik7DQoraW50MzJfdCBfZ2lmX3JlYWRfaGVhZGVyKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIpOw0KK2ludDMyX3QgX2dpZl9nZXRfZnJhbWUoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0cik7DQoraW50MzJfdCBfZ2lmX2dldF9mcmFtZV9udW0oZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0cik7DQoraW50MzJfdCBfZ2lmX2RlY29kZV9leHRlbnNpb24oZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0cik7DQoraW50MzJfdCBfZ2lmX2RlY29kZV9pbWFnZV9pbmZvKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIpOw0KK3ZvaWQgX2dpZl90YWtlb3Zlcl9nY2VfcHRyKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgR2lmR0NFKiogZ2NlX3B0cl9wdHIpOw0KK2ludDMyX3QgX2dpZl9sb2FkX2ZyYW1lKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIGludDMyX3QgZnJhbWVfbnVtKTsNCit1aW50OF90KiBfZ2lmX3JlYWRfZGF0YShnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBkZXNfYnVmX3BwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRhdGFfc2l6ZSk7DQordm9pZCBfZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIGludDMyX3Qgc3RhdHVzKTsNCit2b2lkIF9naWZfaW5wdXRfYnVmZmVyKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUpOw0KK0ZYX0RXT1JEIF9naWZfZ2V0X2F2YWlsX2lucHV0KGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGF2aWFsX2J1Zl9wdHIpOw0KK3ZvaWQgaW50ZXJsYWNlX2J1Zihjb25zdCB1aW50OF90KiBidWYsIEZYX0RXT1JEIHdpZHRoLCBGWF9EV09SRCBoZWlnaHQpOw0KK0ZYX0JPT0wgX2dpZl9lbmNvZGUoZ2lmX2NvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsDQorICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZHN0X2J1ZiwNCisgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkc3RfbGVuKTsNCisjZGVmaW5lIEdJRl9QVFJfTk9UX05VTEwocHRyLCBnaWZfcHRyKSAgICBcDQorICBpZiAocHRyID09IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICBfZ2lmX2Vycm9yKGdpZl9wdHIsICJPdXQgT2YgTWVtb3J5Iik7IFwNCisgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICB9DQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNhcGltaW4uYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjYXBpbWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMDRmZDIuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNhcGltaW4uYworKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi0jaWYgIWRlZmluZWQoX0ZYX0pQRUdfVFVSQk9fKQotLyoKLSAqIGpjYXBpbWluLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgY29kZSBmb3IgdGhlIGNvbXByZXNzaW9uIGhhbGYKLSAqIG9mIHRoZSBKUEVHIGxpYnJhcnkuICBUaGVzZSBhcmUgdGhlICJtaW5pbXVtIiBBUEkgcm91dGluZXMgdGhhdCBtYXkgYmUKLSAqIG5lZWRlZCBpbiBlaXRoZXIgdGhlIG5vcm1hbCBmdWxsLWNvbXByZXNzaW9uIGNhc2Ugb3IgdGhlIHRyYW5zY29kaW5nLW9ubHkKLSAqIGNhc2UuCi0gKgotICogTW9zdCBvZiB0aGUgcm91dGluZXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGFuIGFwcGxpY2F0aW9uCi0gKiBhcmUgaW4gdGhpcyBmaWxlIG9yIGluIGpjYXBpc3RkLmMuICBCdXQgYWxzbyBzZWUgamNwYXJhbS5jIGZvcgotICogcGFyYW1ldGVyLXNldHVwIGhlbHBlciByb3V0aW5lcywgamNvbWFwaS5jIGZvciByb3V0aW5lcyBzaGFyZWQgYnkKLSAqIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uLCBhbmQgamN0cmFucy5jIGZvciB0aGUgdHJhbnNjb2RpbmcgY2FzZS4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyoKLSAqIEluaXRpYWxpemF0aW9uIG9mIGEgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QuCi0gKiBUaGUgZXJyb3IgbWFuYWdlciBtdXN0IGFscmVhZHkgYmUgc2V0IHVwIChpbiBjYXNlIG1lbW9yeSBtYW5hZ2VyIGZhaWxzKS4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfQ3JlYXRlQ29tcHJlc3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgdmVyc2lvbiwgc2l6ZV90IHN0cnVjdHNpemUpCi17Ci0gIGludCBpOwotCi0gIC8qIEd1YXJkIGFnYWluc3QgdmVyc2lvbiBtaXNtYXRjaGVzIGJldHdlZW4gbGlicmFyeSBhbmQgY2FsbGVyLiAqLwotICBjaW5mby0+bWVtID0gTlVMTDsJCS8qIHNvIGpwZWdfZGVzdHJveSBrbm93cyBtZW0gbWdyIG5vdCBjYWxsZWQgKi8KLSAgaWYgKHZlcnNpb24gIT0gSlBFR19MSUJfVkVSU0lPTikKLSAgICBFUlJFWElUMihjaW5mbywgSkVSUl9CQURfTElCX1ZFUlNJT04sIEpQRUdfTElCX1ZFUlNJT04sIHZlcnNpb24pOwotICBpZiAoc3RydWN0c2l6ZSAhPSBTSVpFT0Yoc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0KSkKLSAgICBFUlJFWElUMihjaW5mbywgSkVSUl9CQURfU1RSVUNUX1NJWkUsIAotCSAgICAgKGludCkgU0laRU9GKHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCksIChpbnQpIHN0cnVjdHNpemUpOwotCi0gIC8qIEZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIHdlIHplcm8gdGhlIHdob2xlIG1hc3RlciBzdHJ1Y3R1cmUuCi0gICAqIEJ1dCB0aGUgYXBwbGljYXRpb24gaGFzIGFscmVhZHkgc2V0IHRoZSBlcnIgcG9pbnRlciwgYW5kIG1heSBoYXZlIHNldAotICAgKiBjbGllbnRfZGF0YSwgc28gd2UgaGF2ZSB0byBzYXZlIGFuZCByZXN0b3JlIHRob3NlIGZpZWxkcy4KLSAgICogTm90ZTogaWYgYXBwbGljYXRpb24gaGFzbid0IHNldCBjbGllbnRfZGF0YSwgdG9vbHMgbGlrZSBQdXJpZnkgbWF5Ci0gICAqIGNvbXBsYWluIGhlcmUuCi0gICAqLwotICB7Ci0gICAgc3RydWN0IGpwZWdfZXJyb3JfbWdyICogZXJyID0gY2luZm8tPmVycjsKLSAgICB2b2lkICogY2xpZW50X2RhdGEgPSBjaW5mby0+Y2xpZW50X2RhdGE7IC8qIGlnbm9yZSBQdXJpZnkgY29tcGxhaW50IGhlcmUgKi8KLSAgICBNRU1aRVJPKGNpbmZvLCBTSVpFT0Yoc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0KSk7Ci0gICAgY2luZm8tPmVyciA9IGVycjsKLSAgICBjaW5mby0+Y2xpZW50X2RhdGEgPSBjbGllbnRfZGF0YTsKLSAgfQotICBjaW5mby0+aXNfZGVjb21wcmVzc29yID0gRkFMU0U7Ci0KLSAgLyogSW5pdGlhbGl6ZSBhIG1lbW9yeSBtYW5hZ2VyIGluc3RhbmNlIGZvciB0aGlzIG9iamVjdCAqLwotICBqaW5pdF9tZW1vcnlfbWdyKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLQotICAvKiBaZXJvIG91dCBwb2ludGVycyB0byBwZXJtYW5lbnQgc3RydWN0dXJlcy4gKi8KLSAgY2luZm8tPnByb2dyZXNzID0gTlVMTDsKLSAgY2luZm8tPmRlc3QgPSBOVUxMOwotCi0gIGNpbmZvLT5jb21wX2luZm8gPSBOVUxMOwotCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fUVVBTlRfVEJMUzsgaSsrKQotICAgIGNpbmZvLT5xdWFudF90YmxfcHRyc1tpXSA9IE5VTEw7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgewotICAgIGNpbmZvLT5kY19odWZmX3RibF9wdHJzW2ldID0gTlVMTDsKLSAgICBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1tpXSA9IE5VTEw7Ci0gIH0KLQotICBjaW5mby0+c2NyaXB0X3NwYWNlID0gTlVMTDsKLQotICBjaW5mby0+aW5wdXRfZ2FtbWEgPSAxLjA7CS8qIGluIGNhc2UgYXBwbGljYXRpb24gZm9yZ2V0cyAqLwotCi0gIC8qIE9LLCBJJ20gcmVhZHkgKi8KLSAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IENTVEFURV9TVEFSVDsKLX0KLQotCi0vKgotICogRGVzdHJ1Y3Rpb24gb2YgYSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdAotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19kZXN0cm95X2NvbXByZXNzIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAganBlZ19kZXN0cm95KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsgLyogdXNlIGNvbW1vbiByb3V0aW5lICovCi19Ci0KLQotLyoKLSAqIEFib3J0IHByb2Nlc3Npbmcgb2YgYSBKUEVHIGNvbXByZXNzaW9uIG9wZXJhdGlvbiwKLSAqIGJ1dCBkb24ndCBkZXN0cm95IHRoZSBvYmplY3QgaXRzZWxmLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19hYm9ydF9jb21wcmVzcyAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGpwZWdfYWJvcnQoKGpfY29tbW9uX3B0cikgY2luZm8pOyAvKiB1c2UgY29tbW9uIHJvdXRpbmUgKi8KLX0KLQotCi0vKgotICogRm9yY2libHkgc3VwcHJlc3Mgb3IgdW4tc3VwcHJlc3MgYWxsIHF1YW50aXphdGlvbiBhbmQgSHVmZm1hbiB0YWJsZXMuCi0gKiBNYXJrcyBhbGwgY3VycmVudGx5IGRlZmluZWQgdGFibGVzIGFzIGFscmVhZHkgd3JpdHRlbiAoaWYgc3VwcHJlc3MpCi0gKiBvciBub3Qgd3JpdHRlbiAoaWYgIXN1cHByZXNzKS4gIFRoaXMgd2lsbCBjb250cm9sIHdoZXRoZXIgdGhleSBnZXQgZW1pdHRlZAotICogYnkgYSBzdWJzZXF1ZW50IGpwZWdfc3RhcnRfY29tcHJlc3MgY2FsbC4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgaXMgZXhwb3J0ZWQgZm9yIHVzZSBieSBhcHBsaWNhdGlvbnMgdGhhdCB3YW50IHRvIHByb2R1Y2UKLSAqIGFiYnJldmlhdGVkIEpQRUcgZGF0YXN0cmVhbXMuICBJdCBsb2dpY2FsbHkgYmVsb25ncyBpbiBqY3BhcmFtLmMsIGJ1dAotICogc2luY2UgaXQgaXMgY2FsbGVkIGJ5IGpwZWdfc3RhcnRfY29tcHJlc3MsIHdlIHB1dCBpdCBoZXJlIC0tLSBvdGhlcndpc2UKLSAqIGpjcGFyYW0ubyB3b3VsZCBiZSBsaW5rZWQgd2hldGhlciB0aGUgYXBwbGljYXRpb24gdXNlZCBpdCBvciBub3QuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX3N1cHByZXNzX3RhYmxlcyAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gc3VwcHJlc3MpCi17Ci0gIGludCBpOwotICBKUVVBTlRfVEJMICogcXRibDsKLSAgSkhVRkZfVEJMICogaHRibDsKLQotICBmb3IgKGkgPSAwOyBpIDwgTlVNX1FVQU5UX1RCTFM7IGkrKykgewotICAgIGlmICgocXRibCA9IGNpbmZvLT5xdWFudF90YmxfcHRyc1tpXSkgIT0gTlVMTCkKLSAgICAgIHF0YmwtPnNlbnRfdGFibGUgPSBzdXBwcmVzczsKLSAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fSFVGRl9UQkxTOyBpKyspIHsKLSAgICBpZiAoKGh0YmwgPSBjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1tpXSkgIT0gTlVMTCkKLSAgICAgIGh0YmwtPnNlbnRfdGFibGUgPSBzdXBwcmVzczsKLSAgICBpZiAoKGh0YmwgPSBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1tpXSkgIT0gTlVMTCkKLSAgICAgIGh0YmwtPnNlbnRfdGFibGUgPSBzdXBwcmVzczsKLSAgfQotfQotCi0KLS8qCi0gKiBGaW5pc2ggSlBFRyBjb21wcmVzc2lvbi4KLSAqCi0gKiBJZiBhIG11bHRpcGFzcyBvcGVyYXRpbmcgbW9kZSB3YXMgc2VsZWN0ZWQsIHRoaXMgbWF5IGRvIGEgZ3JlYXQgZGVhbCBvZgotICogd29yayBpbmNsdWRpbmcgbW9zdCBvZiB0aGUgYWN0dWFsIG91dHB1dC4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfZmluaXNoX2NvbXByZXNzIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgSkRJTUVOU0lPTiBpTUNVX3JvdzsKLQotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBDU1RBVEVfU0NBTk5JTkcgfHwKLSAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gQ1NUQVRFX1JBV19PSykgewotICAgIC8qIFRlcm1pbmF0ZSBmaXJzdCBwYXNzICovCi0gICAgaWYgKGNpbmZvLT5uZXh0X3NjYW5saW5lIDwgY2luZm8tPmltYWdlX2hlaWdodCkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVE9PX0xJVFRMRV9EQVRBKTsKLSAgICAoKmNpbmZvLT5tYXN0ZXItPmZpbmlzaF9wYXNzKSAoY2luZm8pOwotICB9IGVsc2UgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1dSQ09FRlMpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLSAgLyogUGVyZm9ybSBhbnkgcmVtYWluaW5nIHBhc3NlcyAqLwotICB3aGlsZSAoISBjaW5mby0+bWFzdGVyLT5pc19sYXN0X3Bhc3MpIHsKLSAgICAoKmNpbmZvLT5tYXN0ZXItPnByZXBhcmVfZm9yX3Bhc3MpIChjaW5mbyk7Ci0gICAgZm9yIChpTUNVX3JvdyA9IDA7IGlNQ1Vfcm93IDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93czsgaU1DVV9yb3crKykgewotICAgICAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7Ci0JY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAobG9uZykgaU1DVV9yb3c7Ci0JY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3M7Ci0JKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gICAgICB9Ci0gICAgICAvKiBXZSBieXBhc3MgdGhlIG1haW4gY29udHJvbGxlciBhbmQgaW52b2tlIGNvZWYgY29udHJvbGxlciBkaXJlY3RseTsKLSAgICAgICAqIGFsbCB3b3JrIGlzIGJlaW5nIGRvbmUgZnJvbSB0aGUgY29lZmZpY2llbnQgYnVmZmVyLgotICAgICAgICovCi0gICAgICBpZiAoISAoKmNpbmZvLT5jb2VmLT5jb21wcmVzc19kYXRhKSAoY2luZm8sIChKU0FNUElNQUdFKSBOVUxMKSkKLQlFUlJFWElUKGNpbmZvLCBKRVJSX0NBTlRfU1VTUEVORCk7Ci0gICAgfQotICAgICgqY2luZm8tPm1hc3Rlci0+ZmluaXNoX3Bhc3MpIChjaW5mbyk7Ci0gIH0KLSAgLyogV3JpdGUgRU9JLCBkbyBmaW5hbCBjbGVhbnVwICovCi0gICgqY2luZm8tPm1hcmtlci0+d3JpdGVfZmlsZV90cmFpbGVyKSAoY2luZm8pOwotICAoKmNpbmZvLT5kZXN0LT50ZXJtX2Rlc3RpbmF0aW9uKSAoY2luZm8pOwotICAvKiBXZSBjYW4gdXNlIGpwZWdfYWJvcnQgdG8gcmVsZWFzZSBtZW1vcnkgYW5kIHJlc2V0IGdsb2JhbF9zdGF0ZSAqLwotICBqcGVnX2Fib3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLX0KLQotCi0vKgotICogV3JpdGUgYSBzcGVjaWFsIG1hcmtlci4KLSAqIFRoaXMgaXMgb25seSByZWNvbW1lbmRlZCBmb3Igd3JpdGluZyBDT00gb3IgQVBQbiBtYXJrZXJzLgotICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIganBlZ19zdGFydF9jb21wcmVzcygpIGFuZCBiZWZvcmUKLSAqIGZpcnN0IGNhbGwgdG8ganBlZ193cml0ZV9zY2FubGluZXMoKSBvciBqcGVnX3dyaXRlX3Jhd19kYXRhKCkuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX3dyaXRlX21hcmtlciAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXIsCi0JCSAgIGNvbnN0IEpPQ1RFVCAqZGF0YXB0ciwgdW5zaWduZWQgaW50IGRhdGFsZW4pCi17Ci0gIEpNRVRIT0Qodm9pZCwgd3JpdGVfbWFya2VyX2J5dGUsIChqX2NvbXByZXNzX3B0ciBpbmZvLCBpbnQgdmFsKSk7Ci0KLSAgaWYgKGNpbmZvLT5uZXh0X3NjYW5saW5lICE9IDAgfHwKLSAgICAgIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TQ0FOTklORyAmJgotICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1JBV19PSyAmJgotICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1dSQ09FRlMpKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0KLSAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9tYXJrZXJfaGVhZGVyKSAoY2luZm8sIG1hcmtlciwgZGF0YWxlbik7Ci0gIHdyaXRlX21hcmtlcl9ieXRlID0gY2luZm8tPm1hcmtlci0+d3JpdGVfbWFya2VyX2J5dGU7CS8qIGNvcHkgZm9yIHNwZWVkICovCi0gIHdoaWxlIChkYXRhbGVuLS0pIHsKLSAgICAoKndyaXRlX21hcmtlcl9ieXRlKSAoY2luZm8sICpkYXRhcHRyKTsKLSAgICBkYXRhcHRyKys7Ci0gIH0KLX0KLQotLyogU2FtZSwgYnV0IHBpZWNlbWVhbC4gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX3dyaXRlX21faGVhZGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlciwgdW5zaWduZWQgaW50IGRhdGFsZW4pCi17Ci0gIGlmIChjaW5mby0+bmV4dF9zY2FubGluZSAhPSAwIHx8Ci0gICAgICAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU0NBTk5JTkcgJiYKLSAgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9SQVdfT0sgJiYKLSAgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9XUkNPRUZTKSkKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotCi0gICgqY2luZm8tPm1hcmtlci0+d3JpdGVfbWFya2VyX2hlYWRlcikgKGNpbmZvLCBtYXJrZXIsIGRhdGFsZW4pOwotfQotCi1HTE9CQUwodm9pZCkKLWpwZWdfd3JpdGVfbV9ieXRlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHZhbCkKLXsKLSAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9tYXJrZXJfYnl0ZSkgKGNpbmZvLCB2YWwpOwotfQotCi0KLS8qCi0gKiBBbHRlcm5hdGUgY29tcHJlc3Npb24gZnVuY3Rpb246IGp1c3Qgd3JpdGUgYW4gYWJicmV2aWF0ZWQgdGFibGUgZmlsZS4KLSAqIEJlZm9yZSBjYWxsaW5nIHRoaXMsIGFsbCBwYXJhbWV0ZXJzIGFuZCBhIGRhdGEgZGVzdGluYXRpb24gbXVzdCBiZSBzZXQgdXAuCi0gKgotICogVG8gcHJvZHVjZSBhIHBhaXIgb2YgZmlsZXMgY29udGFpbmluZyBhYmJyZXZpYXRlZCB0YWJsZXMgYW5kIGFiYnJldmlhdGVkCi0gKiBpbWFnZSBkYXRhLCBvbmUgd291bGQgcHJvY2VlZCBhcyBmb2xsb3dzOgotICoKLSAqCQlpbml0aWFsaXplIEpQRUcgb2JqZWN0Ci0gKgkJc2V0IEpQRUcgcGFyYW1ldGVycwotICoJCXNldCBkZXN0aW5hdGlvbiB0byB0YWJsZSBmaWxlCi0gKgkJanBlZ193cml0ZV90YWJsZXMoY2luZm8pOwotICoJCXNldCBkZXN0aW5hdGlvbiB0byBpbWFnZSBmaWxlCi0gKgkJanBlZ19zdGFydF9jb21wcmVzcyhjaW5mbywgRkFMU0UpOwotICoJCXdyaXRlIGRhdGEuLi4KLSAqCQlqcGVnX2ZpbmlzaF9jb21wcmVzcyhjaW5mbyk7Ci0gKgotICoganBlZ193cml0ZV90YWJsZXMgaGFzIHRoZSBzaWRlIGVmZmVjdCBvZiBtYXJraW5nIGFsbCB0YWJsZXMgd3JpdHRlbgotICogKHNhbWUgYXMganBlZ19zdXBwcmVzc190YWJsZXMoLi4uLCBUUlVFKSkuICBUaHVzIGEgc3Vic2VxdWVudCBzdGFydF9jb21wcmVzcwotICogd2lsbCBub3QgcmUtZW1pdCB0aGUgdGFibGVzIHVubGVzcyBpdCBpcyBwYXNzZWQgd3JpdGVfYWxsX3RhYmxlcz1UUlVFLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ193cml0ZV90YWJsZXMgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLQotICAvKiAoUmUpaW5pdGlhbGl6ZSBlcnJvciBtZ3IgYW5kIGRlc3RpbmF0aW9uIG1vZHVsZXMgKi8KLSAgKCpjaW5mby0+ZXJyLT5yZXNldF9lcnJvcl9tZ3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gICgqY2luZm8tPmRlc3QtPmluaXRfZGVzdGluYXRpb24pIChjaW5mbyk7Ci0gIC8qIEluaXRpYWxpemUgdGhlIG1hcmtlciB3cml0ZXIgLi4uIGJpdCBvZiBhIGNyb2NrIHRvIGRvIGl0IGhlcmUuICovCi0gIGppbml0X21hcmtlcl93cml0ZXIoY2luZm8pOwotICAvKiBXcml0ZSB0aGVtIHRhYmxlcyEgKi8KLSAgKCpjaW5mby0+bWFya2VyLT53cml0ZV90YWJsZXNfb25seSkgKGNpbmZvKTsKLSAgLyogQW5kIGNsZWFuIHVwLiAqLwotICAoKmNpbmZvLT5kZXN0LT50ZXJtX2Rlc3RpbmF0aW9uKSAoY2luZm8pOwotICAvKgotICAgKiBJbiBsaWJyYXJ5IHJlbGVhc2VzIHVwIHRocm91Z2ggdjZhLCB3ZSBjYWxsZWQganBlZ19hYm9ydCgpIGhlcmUgdG8gZnJlZQotICAgKiBhbnkgd29ya2luZyBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoZSBkZXN0aW5hdGlvbiBtYW5hZ2VyIGFuZCBtYXJrZXIKLSAgICogd3JpdGVyLiAgU29tZSBhcHBsaWNhdGlvbnMgaGFkIGEgcHJvYmxlbSB3aXRoIHRoYXQ6IHRoZXkgYWxsb2NhdGVkIHNwYWNlCi0gICAqIG9mIHRoZWlyIG93biBmcm9tIHRoZSBsaWJyYXJ5IG1lbW9yeSBtYW5hZ2VyLCBhbmQgZGlkbid0IHdhbnQgaXQgdG8gZ28KLSAgICogYXdheSBkdXJpbmcgd3JpdGVfdGFibGVzLiAgU28gbm93IHdlIGRvIG5vdGhpbmcuICBUaGlzIHdpbGwgY2F1c2UgYQotICAgKiBtZW1vcnkgbGVhayBpZiBhbiBhcHAgY2FsbHMgd3JpdGVfdGFibGVzIHJlcGVhdGVkbHkgd2l0aG91dCBkb2luZyBhIGZ1bGwKLSAgICogY29tcHJlc3Npb24gY3ljbGUgb3Igb3RoZXJ3aXNlIHJlc2V0dGluZyB0aGUgSlBFRyBvYmplY3QuICBIb3dldmVyLCB0aGF0Ci0gICAqIHNlZW1zIGxlc3MgYmFkIHRoYW4gdW5leHBlY3RlZGx5IGZyZWVpbmcgbWVtb3J5IGluIHRoZSBub3JtYWwgY2FzZS4KLSAgICogQW4gYXBwIHRoYXQgcHJlZmVycyB0aGUgb2xkIGJlaGF2aW9yIGNhbiBjYWxsIGpwZWdfYWJvcnQgZm9yIGl0c2VsZiBhZnRlcgotICAgKiBlYWNoIGNhbGwgdG8ganBlZ193cml0ZV90YWJsZXMoKS4KLSAgICovCi19Ci0KLSNlbmRpZiAvL19GWF9KUEVHX1RVUkJPXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNhcGlzdGQuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjYXBpc3RkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNzY1ZTYuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNhcGlzdGQuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0jaWYgIWRlZmluZWQoX0ZYX0pQRUdfVFVSQk9fKQotLyoKLSAqIGpjYXBpc3RkLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgY29kZSBmb3IgdGhlIGNvbXByZXNzaW9uIGhhbGYKLSAqIG9mIHRoZSBKUEVHIGxpYnJhcnkuICBUaGVzZSBhcmUgdGhlICJzdGFuZGFyZCIgQVBJIHJvdXRpbmVzIHRoYXQgYXJlCi0gKiB1c2VkIGluIHRoZSBub3JtYWwgZnVsbC1jb21wcmVzc2lvbiBjYXNlLiAgVGhleSBhcmUgbm90IHVzZWQgYnkgYQotICogdHJhbnNjb2Rpbmctb25seSBhcHBsaWNhdGlvbi4gIE5vdGUgdGhhdCBpZiBhbiBhcHBsaWNhdGlvbiBsaW5rcyBpbgotICoganBlZ19zdGFydF9jb21wcmVzcywgaXQgd2lsbCBlbmQgdXAgbGlua2luZyBpbiB0aGUgZW50aXJlIGNvbXByZXNzb3IuCi0gKiBXZSB0aHVzIG11c3Qgc2VwYXJhdGUgdGhpcyBmaWxlIGZyb20gamNhcGltaW4uYyB0byBhdm9pZCBsaW5raW5nIHRoZQotICogd2hvbGUgY29tcHJlc3Npb24gbGlicmFyeSBpbnRvIGEgdHJhbnNjb2Rlci4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyoKLSAqIENvbXByZXNzaW9uIGluaXRpYWxpemF0aW9uLgotICogQmVmb3JlIGNhbGxpbmcgdGhpcywgYWxsIHBhcmFtZXRlcnMgYW5kIGEgZGF0YSBkZXN0aW5hdGlvbiBtdXN0IGJlIHNldCB1cC4KLSAqCi0gKiBXZSByZXF1aXJlIGEgd3JpdGVfYWxsX3RhYmxlcyBwYXJhbWV0ZXIgYXMgYSBmYWlsc2FmZSBjaGVjayB3aGVuIHdyaXRpbmcKLSAqIG11bHRpcGxlIGRhdGFzdHJlYW1zIGZyb20gdGhlIHNhbWUgY29tcHJlc3Npb24gb2JqZWN0LiAgU2luY2UgcHJpb3IgcnVucwotICogd2lsbCBoYXZlIGxlZnQgYWxsIHRoZSB0YWJsZXMgbWFya2VkIHNlbnRfdGFibGU9VFJVRSwgYSBzdWJzZXF1ZW50IHJ1bgotICogd291bGQgZW1pdCBhbiBhYmJyZXZpYXRlZCBzdHJlYW0gKG5vIHRhYmxlcykgYnkgZGVmYXVsdC4gIFRoaXMgbWF5IGJlIHdoYXQKLSAqIGlzIHdhbnRlZCwgYnV0IGZvciBzYWZldHkncyBzYWtlIGl0IHNob3VsZCBub3QgYmUgdGhlIGRlZmF1bHQgYmVoYXZpb3I6Ci0gKiBwcm9ncmFtbWVycyBzaG91bGQgaGF2ZSB0byBtYWtlIGEgZGVsaWJlcmF0ZSBjaG9pY2UgdG8gZW1pdCBhYmJyZXZpYXRlZAotICogaW1hZ2VzLiAgVGhlcmVmb3JlIHRoZSBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcyBzaG91bGQgZW5jb3VyYWdlIHBlb3BsZQotICogdG8gcGFzcyB3cml0ZV9hbGxfdGFibGVzPVRSVUU7IHRoZW4gaXQgd2lsbCB0YWtlIGFjdGl2ZSB0aG91Z2h0IHRvIGRvIHRoZQotICogd3JvbmcgdGhpbmcuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX3N0YXJ0X2NvbXByZXNzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiB3cml0ZV9hbGxfdGFibGVzKQotewotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLQotICBpZiAod3JpdGVfYWxsX3RhYmxlcykKLSAgICBqcGVnX3N1cHByZXNzX3RhYmxlcyhjaW5mbywgRkFMU0UpOwkvKiBtYXJrIGFsbCB0YWJsZXMgdG8gYmUgd3JpdHRlbiAqLwotCi0gIC8qIChSZSlpbml0aWFsaXplIGVycm9yIG1nciBhbmQgZGVzdGluYXRpb24gbW9kdWxlcyAqLwotICAoKmNpbmZvLT5lcnItPnJlc2V0X2Vycm9yX21ncikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgKCpjaW5mby0+ZGVzdC0+aW5pdF9kZXN0aW5hdGlvbikgKGNpbmZvKTsKLSAgLyogUGVyZm9ybSBtYXN0ZXIgc2VsZWN0aW9uIG9mIGFjdGl2ZSBtb2R1bGVzICovCi0gIGppbml0X2NvbXByZXNzX21hc3RlcihjaW5mbyk7Ci0gIC8qIFNldCB1cCBmb3IgdGhlIGZpcnN0IHBhc3MgKi8KLSAgKCpjaW5mby0+bWFzdGVyLT5wcmVwYXJlX2Zvcl9wYXNzKSAoY2luZm8pOwotICAvKiBSZWFkeSBmb3IgYXBwbGljYXRpb24gdG8gZHJpdmUgZmlyc3QgcGFzcyB0aHJvdWdoIGpwZWdfd3JpdGVfc2NhbmxpbmVzCi0gICAqIG9yIGpwZWdfd3JpdGVfcmF3X2RhdGEuCi0gICAqLwotICBjaW5mby0+bmV4dF9zY2FubGluZSA9IDA7Ci0gIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSAoY2luZm8tPnJhd19kYXRhX2luID8gQ1NUQVRFX1JBV19PSyA6IENTVEFURV9TQ0FOTklORyk7Ci19Ci0KLQotLyoKLSAqIFdyaXRlIHNvbWUgc2NhbmxpbmVzIG9mIGRhdGEgdG8gdGhlIEpQRUcgY29tcHJlc3Nvci4KLSAqCi0gKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdGhlIG51bWJlciBvZiBsaW5lcyBhY3R1YWxseSB3cml0dGVuLgotICogVGhpcyBzaG91bGQgYmUgbGVzcyB0aGFuIHRoZSBzdXBwbGllZCBudW1fbGluZXMgb25seSBpbiBjYXNlIHRoYXQKLSAqIHRoZSBkYXRhIGRlc3RpbmF0aW9uIG1vZHVsZSBoYXMgcmVxdWVzdGVkIHN1c3BlbnNpb24gb2YgdGhlIGNvbXByZXNzb3IsCi0gKiBvciBpZiBtb3JlIHRoYW4gaW1hZ2VfaGVpZ2h0IHNjYW5saW5lcyBhcmUgcGFzc2VkIGluLgotICoKLSAqIE5vdGU6IHdlIHdhcm4gYWJvdXQgZXhjZXNzIGNhbGxzIHRvIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkgc2luY2UKLSAqIHRoaXMgbGlrZWx5IHNpZ25hbHMgYW4gYXBwbGljYXRpb24gcHJvZ3JhbW1lciBlcnJvci4gIEhvd2V2ZXIsCi0gKiBleGNlc3Mgc2NhbmxpbmVzIHBhc3NlZCBpbiB0aGUgbGFzdCB2YWxpZCBjYWxsIGFyZSAqc2lsZW50bHkqIGlnbm9yZWQsCi0gKiBzbyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBuZWVkIG5vdCBhZGp1c3QgbnVtX2xpbmVzIGZvciBlbmQtb2YtaW1hZ2UKLSAqIHdoZW4gdXNpbmcgYSBtdWx0aXBsZS1zY2FubGluZSBidWZmZXIuCi0gKi8KLQotR0xPQkFMKEpESU1FTlNJT04pCi1qcGVnX3dyaXRlX3NjYW5saW5lcyAoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgc2NhbmxpbmVzLAotCQkgICAgICBKRElNRU5TSU9OIG51bV9saW5lcykKLXsKLSAgSkRJTUVOU0lPTiByb3dfY3RyLCByb3dzX2xlZnQ7Ci0KLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NDQU5OSU5HKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0gIGlmIChjaW5mby0+bmV4dF9zY2FubGluZSA+PSBjaW5mby0+aW1hZ2VfaGVpZ2h0KQotICAgIFdBUk5NUyhjaW5mbywgSldSTl9UT09fTVVDSF9EQVRBKTsKLQotICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCi0gIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gKGxvbmcpIGNpbmZvLT5uZXh0X3NjYW5saW5lOwotICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0OwotICAgICgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICB9Ci0KLSAgLyogR2l2ZSBtYXN0ZXIgY29udHJvbCBtb2R1bGUgYW5vdGhlciBjaGFuY2UgaWYgdGhpcyBpcyBmaXJzdCBjYWxsIHRvCi0gICAqIGpwZWdfd3JpdGVfc2NhbmxpbmVzLiAgVGhpcyBsZXRzIG91dHB1dCBvZiB0aGUgZnJhbWUvc2NhbiBoZWFkZXJzIGJlCi0gICAqIGRlbGF5ZWQgc28gdGhhdCBhcHBsaWNhdGlvbiBjYW4gd3JpdGUgQ09NLCBldGMsIG1hcmtlcnMgYmV0d2VlbgotICAgKiBqcGVnX3N0YXJ0X2NvbXByZXNzIGFuZCBqcGVnX3dyaXRlX3NjYW5saW5lcy4KLSAgICovCi0gIGlmIChjaW5mby0+bWFzdGVyLT5jYWxsX3Bhc3Nfc3RhcnR1cCkKLSAgICAoKmNpbmZvLT5tYXN0ZXItPnBhc3Nfc3RhcnR1cCkgKGNpbmZvKTsKLQotICAvKiBJZ25vcmUgYW55IGV4dHJhIHNjYW5saW5lcyBhdCBib3R0b20gb2YgaW1hZ2UuICovCi0gIHJvd3NfbGVmdCA9IGNpbmZvLT5pbWFnZV9oZWlnaHQgLSBjaW5mby0+bmV4dF9zY2FubGluZTsKLSAgaWYgKG51bV9saW5lcyA+IHJvd3NfbGVmdCkKLSAgICBudW1fbGluZXMgPSByb3dzX2xlZnQ7Ci0KLSAgcm93X2N0ciA9IDA7Ci0gICgqY2luZm8tPm1haW4tPnByb2Nlc3NfZGF0YSkgKGNpbmZvLCBzY2FubGluZXMsICZyb3dfY3RyLCBudW1fbGluZXMpOwotICBjaW5mby0+bmV4dF9zY2FubGluZSArPSByb3dfY3RyOwotICByZXR1cm4gcm93X2N0cjsKLX0KLQotCi0vKgotICogQWx0ZXJuYXRlIGVudHJ5IHBvaW50IHRvIHdyaXRlIHJhdyBkYXRhLgotICogUHJvY2Vzc2VzIGV4YWN0bHkgb25lIGlNQ1Ugcm93IHBlciBjYWxsLCB1bmxlc3Mgc3VzcGVuZGVkLgotICovCi0KLUdMT0JBTChKRElNRU5TSU9OKQotanBlZ193cml0ZV9yYXdfZGF0YSAoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgZGF0YSwKLQkJICAgICBKRElNRU5TSU9OIG51bV9saW5lcykKLXsKLSAgSkRJTUVOU0lPTiBsaW5lc19wZXJfaU1DVV9yb3c7Ci0KLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1JBV19PSykKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotICBpZiAoY2luZm8tPm5leHRfc2NhbmxpbmUgPj0gY2luZm8tPmltYWdlX2hlaWdodCkgewotICAgIFdBUk5NUyhjaW5mbywgSldSTl9UT09fTVVDSF9EQVRBKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KLSAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7Ci0gICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAobG9uZykgY2luZm8tPm5leHRfc2NhbmxpbmU7Ci0gICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQ7Ci0gICAgKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gIH0KLQotICAvKiBHaXZlIG1hc3RlciBjb250cm9sIG1vZHVsZSBhbm90aGVyIGNoYW5jZSBpZiB0aGlzIGlzIGZpcnN0IGNhbGwgdG8KLSAgICoganBlZ193cml0ZV9yYXdfZGF0YS4gIFRoaXMgbGV0cyBvdXRwdXQgb2YgdGhlIGZyYW1lL3NjYW4gaGVhZGVycyBiZQotICAgKiBkZWxheWVkIHNvIHRoYXQgYXBwbGljYXRpb24gY2FuIHdyaXRlIENPTSwgZXRjLCBtYXJrZXJzIGJldHdlZW4KLSAgICoganBlZ19zdGFydF9jb21wcmVzcyBhbmQganBlZ193cml0ZV9yYXdfZGF0YS4KLSAgICovCi0gIGlmIChjaW5mby0+bWFzdGVyLT5jYWxsX3Bhc3Nfc3RhcnR1cCkKLSAgICAoKmNpbmZvLT5tYXN0ZXItPnBhc3Nfc3RhcnR1cCkgKGNpbmZvKTsKLQotICAvKiBWZXJpZnkgdGhhdCBhdCBsZWFzdCBvbmUgaU1DVSByb3cgaGFzIGJlZW4gcGFzc2VkLiAqLwotICBsaW5lc19wZXJfaU1DVV9yb3cgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFOwotICBpZiAobnVtX2xpbmVzIDwgbGluZXNfcGVyX2lNQ1Vfcm93KQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQlVGRkVSX1NJWkUpOwotCi0gIC8qIERpcmVjdGx5IGNvbXByZXNzIHRoZSByb3cuICovCi0gIGlmICghICgqY2luZm8tPmNvZWYtPmNvbXByZXNzX2RhdGEpIChjaW5mbywgZGF0YSkpIHsKLSAgICAvKiBJZiBjb21wcmVzc29yIGRpZCBub3QgY29uc3VtZSB0aGUgd2hvbGUgcm93LCBzdXNwZW5kIHByb2Nlc3NpbmcuICovCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKiBPSywgd2UgcHJvY2Vzc2VkIG9uZSBpTUNVIHJvdy4gKi8KLSAgY2luZm8tPm5leHRfc2NhbmxpbmUgKz0gbGluZXNfcGVyX2lNQ1Vfcm93OwotICByZXR1cm4gbGluZXNfcGVyX2lNQ1Vfcm93OwotfQotCi0jZW5kaWYgLy9fRlhfSlBFR19UVVJCT18KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjY29lZmN0LmMgYi9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY2NvZWZjdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODkxMGVmLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjY29lZmN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTIgKzAsMCBAQAotI2lmICFkZWZpbmVkKF9GWF9KUEVHX1RVUkJPXykKLS8qCi0gKiBqY2NvZWZjdC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sbGVyIGZvciBjb21wcmVzc2lvbi4KLSAqIFRoaXMgY29udHJvbGxlciBpcyB0aGUgdG9wIGxldmVsIG9mIHRoZSBKUEVHIGNvbXByZXNzb3IgcHJvcGVyLgotICogVGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBsaWVzIGJldHdlZW4gZm9yd2FyZC1EQ1QgYW5kIGVudHJvcHkgZW5jb2Rpbmcgc3RlcHMuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLS8qIFdlIHVzZSBhIGZ1bGwtaW1hZ2UgY29lZmZpY2llbnQgYnVmZmVyIHdoZW4gZG9pbmcgSHVmZm1hbiBvcHRpbWl6YXRpb24sCi0gKiBhbmQgYWxzbyBmb3Igd3JpdGluZyBtdWx0aXBsZS1zY2FuIEpQRUcgZmlsZXMuICBJbiBhbGwgY2FzZXMsIHRoZSBEQ1QKLSAqIHN0ZXAgaXMgcnVuIGR1cmluZyB0aGUgZmlyc3QgcGFzcywgYW5kIHN1YnNlcXVlbnQgcGFzc2VzIG5lZWQgb25seSByZWFkCi0gKiB0aGUgYnVmZmVyZWQgY29lZmZpY2llbnRzLgotICovCi0jaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECi0jZGVmaW5lIEZVTExfQ09FRl9CVUZGRVJfU1VQUE9SVEVECi0jZWxzZQotI2lmZGVmIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAotI2RlZmluZSBGVUxMX0NPRUZfQlVGRkVSX1NVUFBPUlRFRAotI2VuZGlmCi0jZW5kaWYKLQotCi0vKiBQcml2YXRlIGJ1ZmZlciBjb250cm9sbGVyIG9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIEpESU1FTlNJT04gaU1DVV9yb3dfbnVtOwkvKiBpTUNVIHJvdyAjIHdpdGhpbiBpbWFnZSAqLwotICBKRElNRU5TSU9OIG1jdV9jdHI7CQkvKiBjb3VudHMgTUNVcyBwcm9jZXNzZWQgaW4gY3VycmVudCByb3cgKi8KLSAgaW50IE1DVV92ZXJ0X29mZnNldDsJCS8qIGNvdW50cyBNQ1Ugcm93cyB3aXRoaW4gaU1DVSByb3cgKi8KLSAgaW50IE1DVV9yb3dzX3Blcl9pTUNVX3JvdzsJLyogbnVtYmVyIG9mIHN1Y2ggcm93cyBuZWVkZWQgKi8KLQotICAvKiBGb3Igc2luZ2xlLXBhc3MgY29tcHJlc3Npb24sIGl0J3Mgc3VmZmljaWVudCB0byBidWZmZXIganVzdCBvbmUgTUNVCi0gICAqIChhbHRob3VnaCB0aGlzIG1heSBwcm92ZSBhIGJpdCBzbG93IGluIHByYWN0aWNlKS4gIFdlIGFsbG9jYXRlIGEKLSAgICogd29ya3NwYWNlIG9mIENfTUFYX0JMT0NLU19JTl9NQ1UgY29lZmZpY2llbnQgYmxvY2tzLCBhbmQgcmV1c2UgaXQgZm9yIGVhY2gKLSAgICogTUNVIGNvbnN0cnVjdGVkIGFuZCBzZW50LiAgKE9uIDgweDg2LCB0aGUgd29ya3NwYWNlIGlzIEZBUiBldmVuIHRob3VnaAotICAgKiBpdCdzIG5vdCByZWFsbHkgdmVyeSBiaWc7IHRoaXMgaXMgdG8ga2VlcCB0aGUgbW9kdWxlIGludGVyZmFjZXMgdW5jaGFuZ2VkCi0gICAqIHdoZW4gYSBsYXJnZSBjb2VmZmljaWVudCBidWZmZXIgaXMgbmVjZXNzYXJ5LikKLSAgICogSW4gbXVsdGktcGFzcyBtb2RlcywgdGhpcyBhcnJheSBwb2ludHMgdG8gdGhlIGN1cnJlbnQgTUNVJ3MgYmxvY2tzCi0gICAqIHdpdGhpbiB0aGUgdmlydHVhbCBhcnJheXMuCi0gICAqLwotICBKQkxPQ0tST1cgTUNVX2J1ZmZlcltDX01BWF9CTE9DS1NfSU5fTUNVXTsKLQotICAvKiBJbiBtdWx0aS1wYXNzIG1vZGVzLCB3ZSBuZWVkIGEgdmlydHVhbCBibG9jayBhcnJheSBmb3IgZWFjaCBjb21wb25lbnQuICovCi0gIGp2aXJ0X2JhcnJheV9wdHIgd2hvbGVfaW1hZ2VbTUFYX0NPTVBPTkVOVFNdOwotfSBteV9jb2VmX2NvbnRyb2xsZXI7Ci0KLXR5cGVkZWYgbXlfY29lZl9jb250cm9sbGVyICogbXlfY29lZl9wdHI7Ci0KLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLU1FVEhPRERFRihib29sZWFuKSBjb21wcmVzc19kYXRhCi0gICAgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpKTsKLSNpZmRlZiBGVUxMX0NPRUZfQlVGRkVSX1NVUFBPUlRFRAotTUVUSE9EREVGKGJvb2xlYW4pIGNvbXByZXNzX2ZpcnN0X3Bhc3MKLSAgICBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGlucHV0X2J1ZikpOwotTUVUSE9EREVGKGJvb2xlYW4pIGNvbXByZXNzX291dHB1dAotICAgIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgaW5wdXRfYnVmKSk7Ci0jZW5kaWYKLQotCi1MT0NBTCh2b2lkKQotc3RhcnRfaU1DVV9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotLyogUmVzZXQgd2l0aGluLWlNQ1Utcm93IGNvdW50ZXJzIGZvciBhIG5ldyByb3cgKi8KLXsKLSAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7Ci0KLSAgLyogSW4gYW4gaW50ZXJsZWF2ZWQgc2NhbiwgYW4gTUNVIHJvdyBpcyB0aGUgc2FtZSBhcyBhbiBpTUNVIHJvdy4KLSAgICogSW4gYSBub25pbnRlcmxlYXZlZCBzY2FuLCBhbiBpTUNVIHJvdyBoYXMgdl9zYW1wX2ZhY3RvciBNQ1Ugcm93cy4KLSAgICogQnV0IGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLCBwcm9jZXNzIG9ubHkgd2hhdCdzIGxlZnQuCi0gICAqLwotICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gPiAxKSB7Ci0gICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gMTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtIDwgKGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MtMSkpCi0gICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+dl9zYW1wX2ZhY3RvcjsKLSAgICBlbHNlCi0gICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+bGFzdF9yb3dfaGVpZ2h0OwotICB9Ci0KLSAgY29lZi0+bWN1X2N0ciA9IDA7Ci0gIGNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IDA7Ci19Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIGEgcHJvY2Vzc2luZyBwYXNzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfcGFzc19jb2VmIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpCi17Ci0gIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOwotCi0gIGNvZWYtPmlNQ1Vfcm93X251bSA9IDA7Ci0gIHN0YXJ0X2lNQ1Vfcm93KGNpbmZvKTsKLQotICBzd2l0Y2ggKHBhc3NfbW9kZSkgewotICBjYXNlIEpCVUZfUEFTU19USFJVOgotICAgIGlmIChjb2VmLT53aG9sZV9pbWFnZVswXSAhPSBOVUxMKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotICAgIGNvZWYtPnB1Yi5jb21wcmVzc19kYXRhID0gY29tcHJlc3NfZGF0YTsKLSAgICBicmVhazsKLSNpZmRlZiBGVUxMX0NPRUZfQlVGRkVSX1NVUFBPUlRFRAotICBjYXNlIEpCVUZfU0FWRV9BTkRfUEFTUzoKLSAgICBpZiAoY29lZi0+d2hvbGVfaW1hZ2VbMF0gPT0gTlVMTCkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKLSAgICBjb2VmLT5wdWIuY29tcHJlc3NfZGF0YSA9IGNvbXByZXNzX2ZpcnN0X3Bhc3M7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSkJVRl9DUkFOS19ERVNUOgotICAgIGlmIChjb2VmLT53aG9sZV9pbWFnZVswXSA9PSBOVUxMKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotICAgIGNvZWYtPnB1Yi5jb21wcmVzc19kYXRhID0gY29tcHJlc3Nfb3V0cHV0OwotICAgIGJyZWFrOwotI2VuZGlmCi0gIGRlZmF1bHQ6Ci0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotICAgIGJyZWFrOwotICB9Ci19Ci0KLQotLyoKLSAqIFByb2Nlc3Mgc29tZSBkYXRhIGluIHRoZSBzaW5nbGUtcGFzcyBjYXNlLgotICogV2UgcHJvY2VzcyB0aGUgZXF1aXZhbGVudCBvZiBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykKLSAqIHBlciBjYWxsLCBpZSwgdl9zYW1wX2ZhY3RvciBibG9jayByb3dzIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgaW1hZ2UuCi0gKiBSZXR1cm5zIFRSVUUgaWYgdGhlIGlNQ1Ugcm93IGlzIGNvbXBsZXRlZCwgRkFMU0UgaWYgc3VzcGVuZGVkLgotICoKLSAqIE5COiBpbnB1dF9idWYgY29udGFpbnMgYSBwbGFuZSBmb3IgZWFjaCBjb21wb25lbnQgaW4gaW1hZ2UsCi0gKiB3aGljaCB3ZSBpbmRleCBhY2NvcmRpbmcgdG8gdGhlIGNvbXBvbmVudCdzIFNPRiBwb3NpdGlvbi4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLWNvbXByZXNzX2RhdGEgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGlucHV0X2J1ZikKLXsKLSAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7Ci0gIEpESU1FTlNJT04gTUNVX2NvbF9udW07CS8qIGluZGV4IG9mIGN1cnJlbnQgTUNVIHdpdGhpbiByb3cgKi8KLSAgSkRJTUVOU0lPTiBsYXN0X01DVV9jb2wgPSBjaW5mby0+TUNVc19wZXJfcm93IC0gMTsKLSAgSkRJTUVOU0lPTiBsYXN0X2lNQ1Vfcm93ID0gY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyAtIDE7Ci0gIGludCBibGtuLCBiaSwgY2ksIHlpbmRleCwgeW9mZnNldCwgYmxvY2tjbnQ7Ci0gIEpESU1FTlNJT04geXBvcywgeHBvczsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICAvKiBMb29wIHRvIHdyaXRlIGFzIG11Y2ggYXMgb25lIHdob2xlIGlNQ1Ugcm93ICovCi0gIGZvciAoeW9mZnNldCA9IGNvZWYtPk1DVV92ZXJ0X29mZnNldDsgeW9mZnNldCA8IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKLSAgICAgICB5b2Zmc2V0KyspIHsKLSAgICBmb3IgKE1DVV9jb2xfbnVtID0gY29lZi0+bWN1X2N0cjsgTUNVX2NvbF9udW0gPD0gbGFzdF9NQ1VfY29sOwotCSBNQ1VfY29sX251bSsrKSB7Ci0gICAgICAvKiBEZXRlcm1pbmUgd2hlcmUgZGF0YSBjb21lcyBmcm9tIGluIGlucHV0X2J1ZiBhbmQgZG8gdGhlIERDVCB0aGluZy4KLSAgICAgICAqIEVhY2ggY2FsbCBvbiBmb3J3YXJkX0RDVCBwcm9jZXNzZXMgYSBob3Jpem9udGFsIHJvdyBvZiBEQ1QgYmxvY2tzCi0gICAgICAgKiBhcyB3aWRlIGFzIGFuIE1DVTsgd2UgcmVseSBvbiBoYXZpbmcgYWxsb2NhdGVkIHRoZSBNQ1VfYnVmZmVyW10gYmxvY2tzCi0gICAgICAgKiBzZXF1ZW50aWFsbHkuICBEdW1teSBibG9ja3MgYXQgdGhlIHJpZ2h0IG9yIGJvdHRvbSBlZGdlIGFyZSBmaWxsZWQgaW4KLSAgICAgICAqIHNwZWNpYWxseS4gIFRoZSBkYXRhIGluIHRoZW0gZG9lcyBub3QgbWF0dGVyIGZvciBpbWFnZSByZWNvbnN0cnVjdGlvbiwKLSAgICAgICAqIHNvIHdlIGZpbGwgdGhlbSB3aXRoIHZhbHVlcyB0aGF0IHdpbGwgZW5jb2RlIHRvIHRoZSBzbWFsbGVzdCBhbW91bnQgb2YKLSAgICAgICAqIGRhdGEsIHZpejogYWxsIHplcm9lcyBpbiB0aGUgQUMgZW50cmllcywgREMgZW50cmllcyBlcXVhbCB0byBwcmV2aW91cwotICAgICAgICogYmxvY2sncyBEQyB2YWx1ZS4gIChUaGFua3MgdG8gVGhvbWFzIEtpbnNtYW4gZm9yIHRoaXMgaWRlYS4pCi0gICAgICAgKi8KLSAgICAgIGJsa24gPSAwOwotICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLQljb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotCWJsb2NrY250ID0gKE1DVV9jb2xfbnVtIDwgbGFzdF9NQ1VfY29sKSA/IGNvbXBwdHItPk1DVV93aWR0aAotCQkJCQkJOiBjb21wcHRyLT5sYXN0X2NvbF93aWR0aDsKLQl4cG9zID0gTUNVX2NvbF9udW0gKiBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoOwotCXlwb3MgPSB5b2Zmc2V0ICogRENUU0laRTsgLyogeXBvcyA9PSAoeW9mZnNldCt5aW5kZXgpICogRENUU0laRSAqLwotCWZvciAoeWluZGV4ID0gMDsgeWluZGV4IDwgY29tcHB0ci0+TUNVX2hlaWdodDsgeWluZGV4KyspIHsKLQkgIGlmIChjb2VmLT5pTUNVX3Jvd19udW0gPCBsYXN0X2lNQ1Vfcm93IHx8Ci0JICAgICAgeW9mZnNldCt5aW5kZXggPCBjb21wcHRyLT5sYXN0X3Jvd19oZWlnaHQpIHsKLQkgICAgKCpjaW5mby0+ZmRjdC0+Zm9yd2FyZF9EQ1QpIChjaW5mbywgY29tcHB0ciwKLQkJCQkJIGlucHV0X2J1Zltjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdLAotCQkJCQkgY29lZi0+TUNVX2J1ZmZlcltibGtuXSwKLQkJCQkJIHlwb3MsIHhwb3MsIChKRElNRU5TSU9OKSBibG9ja2NudCk7Ci0JICAgIGlmIChibG9ja2NudCA8IGNvbXBwdHItPk1DVV93aWR0aCkgewotCSAgICAgIC8qIENyZWF0ZSBzb21lIGR1bW15IGJsb2NrcyBhdCB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgaW1hZ2UuICovCi0JICAgICAganplcm9fZmFyKCh2b2lkIEZBUiAqKSBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24gKyBibG9ja2NudF0sCi0JCQkoY29tcHB0ci0+TUNVX3dpZHRoIC0gYmxvY2tjbnQpICogU0laRU9GKEpCTE9DSykpOwotCSAgICAgIGZvciAoYmkgPSBibG9ja2NudDsgYmkgPCBjb21wcHRyLT5NQ1Vfd2lkdGg7IGJpKyspIHsKLQkJY29lZi0+TUNVX2J1ZmZlcltibGtuK2JpXVswXVswXSA9IGNvZWYtPk1DVV9idWZmZXJbYmxrbitiaS0xXVswXVswXTsKLQkgICAgICB9Ci0JICAgIH0KLQkgIH0gZWxzZSB7Ci0JICAgIC8qIENyZWF0ZSBhIHJvdyBvZiBkdW1teSBibG9ja3MgYXQgdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UuICovCi0JICAgIGp6ZXJvX2Zhcigodm9pZCBGQVIgKikgY29lZi0+TUNVX2J1ZmZlcltibGtuXSwKLQkJICAgICAgY29tcHB0ci0+TUNVX3dpZHRoICogU0laRU9GKEpCTE9DSykpOwotCSAgICBmb3IgKGJpID0gMDsgYmkgPCBjb21wcHRyLT5NQ1Vfd2lkdGg7IGJpKyspIHsKLQkgICAgICBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24rYmldWzBdWzBdID0gY29lZi0+TUNVX2J1ZmZlcltibGtuLTFdWzBdWzBdOwotCSAgICB9Ci0JICB9Ci0JICBibGtuICs9IGNvbXBwdHItPk1DVV93aWR0aDsKLQkgIHlwb3MgKz0gRENUU0laRTsKLQl9Ci0gICAgICB9Ci0gICAgICAvKiBUcnkgdG8gd3JpdGUgdGhlIE1DVS4gIEluIGV2ZW50IG9mIGEgc3VzcGVuc2lvbiBmYWlsdXJlLCB3ZSB3aWxsCi0gICAgICAgKiByZS1EQ1QgdGhlIE1DVSBvbiByZXN0YXJ0IChhIGJpdCBpbmVmZmljaWVudCwgY291bGQgYmUgZml4ZWQuLi4pCi0gICAgICAgKi8KLSAgICAgIGlmICghICgqY2luZm8tPmVudHJvcHktPmVuY29kZV9tY3UpIChjaW5mbywgY29lZi0+TUNVX2J1ZmZlcikpIHsKLQkvKiBTdXNwZW5zaW9uIGZvcmNlZDsgdXBkYXRlIHN0YXRlIGNvdW50ZXJzIGFuZCBleGl0ICovCi0JY29lZi0+TUNVX3ZlcnRfb2Zmc2V0ID0geW9mZnNldDsKLQljb2VmLT5tY3VfY3RyID0gTUNVX2NvbF9udW07Ci0JcmV0dXJuIEZBTFNFOwotICAgICAgfQotICAgIH0KLSAgICAvKiBDb21wbGV0ZWQgYW4gTUNVIHJvdywgYnV0IHBlcmhhcHMgbm90IGFuIGlNQ1Ugcm93ICovCi0gICAgY29lZi0+bWN1X2N0ciA9IDA7Ci0gIH0KLSAgLyogQ29tcGxldGVkIHRoZSBpTUNVIHJvdywgYWR2YW5jZSBjb3VudGVycyBmb3IgbmV4dCBvbmUgKi8KLSAgY29lZi0+aU1DVV9yb3dfbnVtKys7Ci0gIHN0YXJ0X2lNQ1Vfcm93KGNpbmZvKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotI2lmZGVmIEZVTExfQ09FRl9CVUZGRVJfU1VQUE9SVEVECi0KLS8qCi0gKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiB0aGUgZmlyc3QgcGFzcyBvZiBhIG11bHRpLXBhc3MgY2FzZS4KLSAqIFdlIHByb2Nlc3MgdGhlIGVxdWl2YWxlbnQgb2Ygb25lIGZ1bGx5IGludGVybGVhdmVkIE1DVSByb3cgKCJpTUNVIiByb3cpCi0gKiBwZXIgY2FsbCwgaWUsIHZfc2FtcF9mYWN0b3IgYmxvY2sgcm93cyBmb3IgZWFjaCBjb21wb25lbnQgaW4gdGhlIGltYWdlLgotICogVGhpcyBhbW91bnQgb2YgZGF0YSBpcyByZWFkIGZyb20gdGhlIHNvdXJjZSBidWZmZXIsIERDVCdkIGFuZCBxdWFudGl6ZWQsCi0gKiBhbmQgc2F2ZWQgaW50byB0aGUgdmlydHVhbCBhcnJheXMuICBXZSBhbHNvIGdlbmVyYXRlIHN1aXRhYmxlIGR1bW15IGJsb2NrcwotICogYXMgbmVlZGVkIGF0IHRoZSByaWdodCBhbmQgbG93ZXIgZWRnZXMuICAoVGhlIGR1bW15IGJsb2NrcyBhcmUgY29uc3RydWN0ZWQKLSAqIGluIHRoZSB2aXJ0dWFsIGFycmF5cywgd2hpY2ggaGF2ZSBiZWVuIHBhZGRlZCBhcHByb3ByaWF0ZWx5LikgIFRoaXMgbWFrZXMKLSAqIGl0IHBvc3NpYmxlIGZvciBzdWJzZXF1ZW50IHBhc3NlcyBub3QgdG8gd29ycnkgYWJvdXQgcmVhbCB2cy4gZHVtbXkgYmxvY2tzLgotICoKLSAqIFdlIG11c3QgYWxzbyBlbWl0IHRoZSBkYXRhIHRvIHRoZSBlbnRyb3B5IGVuY29kZXIuICBUaGlzIGlzIGNvbnZlbmllbnRseQotICogZG9uZSBieSBjYWxsaW5nIGNvbXByZXNzX291dHB1dCgpIGFmdGVyIHdlJ3ZlIGxvYWRlZCB0aGUgY3VycmVudCBzdHJpcAotICogb2YgdGhlIHZpcnR1YWwgYXJyYXlzLgotICoKLSAqIE5COiBpbnB1dF9idWYgY29udGFpbnMgYSBwbGFuZSBmb3IgZWFjaCBjb21wb25lbnQgaW4gaW1hZ2UuICBBbGwKLSAqIGNvbXBvbmVudHMgYXJlIERDVCdkIGFuZCBsb2FkZWQgaW50byB0aGUgdmlydHVhbCBhcnJheXMgaW4gdGhpcyBwYXNzLgotICogSG93ZXZlciwgaXQgbWF5IGJlIHRoYXQgb25seSBhIHN1YnNldCBvZiB0aGUgY29tcG9uZW50cyBhcmUgZW1pdHRlZCB0bwotICogdGhlIGVudHJvcHkgZW5jb2RlciBkdXJpbmcgdGhpcyBmaXJzdCBwYXNzOyBiZSBjYXJlZnVsIGFib3V0IGxvb2tpbmcKLSAqIGF0IHRoZSBzY2FuLWRlcGVuZGVudCB2YXJpYWJsZXMgKE1DVSBkaW1lbnNpb25zLCBldGMpLgotICovCi0KLU1FVEhPRERFRihib29sZWFuKQotY29tcHJlc3NfZmlyc3RfcGFzcyAoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgaW5wdXRfYnVmKQotewotICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKLSAgSkRJTUVOU0lPTiBsYXN0X2lNQ1Vfcm93ID0gY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyAtIDE7Ci0gIEpESU1FTlNJT04gYmxvY2tzX2Fjcm9zcywgTUNVc19hY3Jvc3MsIE1DVWluZGV4OwotICBpbnQgYmksIGNpLCBoX3NhbXBfZmFjdG9yLCBibG9ja19yb3csIGJsb2NrX3Jvd3MsIG5kdW1teTsKLSAgSkNPRUYgbGFzdERDOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICBKQkxPQ0tBUlJBWSBidWZmZXI7Ci0gIEpCTE9DS1JPVyB0aGlzYmxvY2tyb3csIGxhc3RibG9ja3JvdzsKLQotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIC8qIEFsaWduIHRoZSB2aXJ0dWFsIGJ1ZmZlciBmb3IgdGhpcyBjb21wb25lbnQuICovCi0gICAgYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCi0gICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIGNvZWYtPndob2xlX2ltYWdlW2NpXSwKLSAgICAgICBjb2VmLT5pTUNVX3Jvd19udW0gKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAotICAgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBUUlVFKTsKLSAgICAvKiBDb3VudCBub24tZHVtbXkgRENUIGJsb2NrIHJvd3MgaW4gdGhpcyBpTUNVIHJvdy4gKi8KLSAgICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtIDwgbGFzdF9pTUNVX3JvdykKLSAgICAgIGJsb2NrX3Jvd3MgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwotICAgIGVsc2UgewotICAgICAgLyogTkI6IGNhbid0IHVzZSBsYXN0X3Jvd19oZWlnaHQgaGVyZSwgc2luY2UgbWF5IG5vdCBiZSBzZXQhICovCi0gICAgICBibG9ja19yb3dzID0gKGludCkgKGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MgJSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKLSAgICAgIGlmIChibG9ja19yb3dzID09IDApIGJsb2NrX3Jvd3MgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwotICAgIH0KLSAgICBibG9ja3NfYWNyb3NzID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOwotICAgIGhfc2FtcF9mYWN0b3IgPSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOwotICAgIC8qIENvdW50IG51bWJlciBvZiBkdW1teSBibG9ja3MgdG8gYmUgYWRkZWQgYXQgdGhlIHJpZ2h0IG1hcmdpbi4gKi8KLSAgICBuZHVtbXkgPSAoaW50KSAoYmxvY2tzX2Fjcm9zcyAlIGhfc2FtcF9mYWN0b3IpOwotICAgIGlmIChuZHVtbXkgPiAwKQotICAgICAgbmR1bW15ID0gaF9zYW1wX2ZhY3RvciAtIG5kdW1teTsKLSAgICAvKiBQZXJmb3JtIERDVCBmb3IgYWxsIG5vbi1kdW1teSBibG9ja3MgaW4gdGhpcyBpTUNVIHJvdy4gIEVhY2ggY2FsbAotICAgICAqIG9uIGZvcndhcmRfRENUIHByb2Nlc3NlcyBhIGNvbXBsZXRlIGhvcml6b250YWwgcm93IG9mIERDVCBibG9ja3MuCi0gICAgICovCi0gICAgZm9yIChibG9ja19yb3cgPSAwOyBibG9ja19yb3cgPCBibG9ja19yb3dzOyBibG9ja19yb3crKykgewotICAgICAgdGhpc2Jsb2Nrcm93ID0gYnVmZmVyW2Jsb2NrX3Jvd107Ci0gICAgICAoKmNpbmZvLT5mZGN0LT5mb3J3YXJkX0RDVCkgKGNpbmZvLCBjb21wcHRyLAotCQkJCSAgIGlucHV0X2J1ZltjaV0sIHRoaXNibG9ja3JvdywKLQkJCQkgICAoSkRJTUVOU0lPTikgKGJsb2NrX3JvdyAqIERDVFNJWkUpLAotCQkJCSAgIChKRElNRU5TSU9OKSAwLCBibG9ja3NfYWNyb3NzKTsKLSAgICAgIGlmIChuZHVtbXkgPiAwKSB7Ci0JLyogQ3JlYXRlIGR1bW15IGJsb2NrcyBhdCB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgaW1hZ2UuICovCi0JdGhpc2Jsb2Nrcm93ICs9IGJsb2Nrc19hY3Jvc3M7IC8qID0+IGZpcnN0IGR1bW15IGJsb2NrICovCi0Janplcm9fZmFyKCh2b2lkIEZBUiAqKSB0aGlzYmxvY2tyb3csIG5kdW1teSAqIFNJWkVPRihKQkxPQ0spKTsKLQlsYXN0REMgPSB0aGlzYmxvY2tyb3dbLTFdWzBdOwotCWZvciAoYmkgPSAwOyBiaSA8IG5kdW1teTsgYmkrKykgewotCSAgdGhpc2Jsb2Nrcm93W2JpXVswXSA9IGxhc3REQzsKLQl9Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIElmIGF0IGVuZCBvZiBpbWFnZSwgY3JlYXRlIGR1bW15IGJsb2NrIHJvd3MgYXMgbmVlZGVkLgotICAgICAqIFRoZSB0cmlja3kgcGFydCBoZXJlIGlzIHRoYXQgd2l0aGluIGVhY2ggTUNVLCB3ZSB3YW50IHRoZSBEQyB2YWx1ZXMKLSAgICAgKiBvZiB0aGUgZHVtbXkgYmxvY2tzIHRvIG1hdGNoIHRoZSBsYXN0IHJlYWwgYmxvY2sncyBEQyB2YWx1ZS4KLSAgICAgKiBUaGlzIHNxdWVlemVzIGEgZmV3IG1vcmUgYnl0ZXMgb3V0IG9mIHRoZSByZXN1bHRpbmcgZmlsZS4uLgotICAgICAqLwotICAgIGlmIChjb2VmLT5pTUNVX3Jvd19udW0gPT0gbGFzdF9pTUNVX3JvdykgewotICAgICAgYmxvY2tzX2Fjcm9zcyArPSBuZHVtbXk7CS8qIGluY2x1ZGUgbG93ZXIgcmlnaHQgY29ybmVyICovCi0gICAgICBNQ1VzX2Fjcm9zcyA9IGJsb2Nrc19hY3Jvc3MgLyBoX3NhbXBfZmFjdG9yOwotICAgICAgZm9yIChibG9ja19yb3cgPSBibG9ja19yb3dzOyBibG9ja19yb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwotCSAgIGJsb2NrX3JvdysrKSB7Ci0JdGhpc2Jsb2Nrcm93ID0gYnVmZmVyW2Jsb2NrX3Jvd107Ci0JbGFzdGJsb2Nrcm93ID0gYnVmZmVyW2Jsb2NrX3Jvdy0xXTsKLQlqemVyb19mYXIoKHZvaWQgRkFSICopIHRoaXNibG9ja3JvdywKLQkJICAoc2l6ZV90KSAoYmxvY2tzX2Fjcm9zcyAqIFNJWkVPRihKQkxPQ0spKSk7Ci0JZm9yIChNQ1VpbmRleCA9IDA7IE1DVWluZGV4IDwgTUNVc19hY3Jvc3M7IE1DVWluZGV4KyspIHsKLQkgIGxhc3REQyA9IGxhc3RibG9ja3Jvd1toX3NhbXBfZmFjdG9yLTFdWzBdOwotCSAgZm9yIChiaSA9IDA7IGJpIDwgaF9zYW1wX2ZhY3RvcjsgYmkrKykgewotCSAgICB0aGlzYmxvY2tyb3dbYmldWzBdID0gbGFzdERDOwotCSAgfQotCSAgdGhpc2Jsb2Nrcm93ICs9IGhfc2FtcF9mYWN0b3I7IC8qIGFkdmFuY2UgdG8gbmV4dCBNQ1UgaW4gcm93ICovCi0JICBsYXN0YmxvY2tyb3cgKz0gaF9zYW1wX2ZhY3RvcjsKLQl9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIC8qIE5COiBjb21wcmVzc19vdXRwdXQgd2lsbCBpbmNyZW1lbnQgaU1DVV9yb3dfbnVtIGlmIHN1Y2Nlc3NmdWwuCi0gICAqIEEgc3VzcGVuc2lvbiByZXR1cm4gd2lsbCByZXN1bHQgaW4gcmVkb2luZyBhbGwgdGhlIHdvcmsgYWJvdmUgbmV4dCB0aW1lLgotICAgKi8KLQotICAvKiBFbWl0IGRhdGEgdG8gdGhlIGVudHJvcHkgZW5jb2Rlciwgc2hhcmluZyBjb2RlIHdpdGggc3Vic2VxdWVudCBwYXNzZXMgKi8KLSAgcmV0dXJuIGNvbXByZXNzX291dHB1dChjaW5mbywgaW5wdXRfYnVmKTsKLX0KLQotCi0vKgotICogUHJvY2VzcyBzb21lIGRhdGEgaW4gc3Vic2VxdWVudCBwYXNzZXMgb2YgYSBtdWx0aS1wYXNzIGNhc2UuCi0gKiBXZSBwcm9jZXNzIHRoZSBlcXVpdmFsZW50IG9mIG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93ICgiaU1DVSIgcm93KQotICogcGVyIGNhbGwsIGllLCB2X3NhbXBfZmFjdG9yIGJsb2NrIHJvd3MgZm9yIGVhY2ggY29tcG9uZW50IGluIHRoZSBzY2FuLgotICogVGhlIGRhdGEgaXMgb2J0YWluZWQgZnJvbSB0aGUgdmlydHVhbCBhcnJheXMgYW5kIGZlZCB0byB0aGUgZW50cm9weSBjb2Rlci4KLSAqIFJldHVybnMgVFJVRSBpZiB0aGUgaU1DVSByb3cgaXMgY29tcGxldGVkLCBGQUxTRSBpZiBzdXNwZW5kZWQuCi0gKgotICogTkI6IGlucHV0X2J1ZiBpcyBpZ25vcmVkOyBpdCBpcyBsaWtlbHkgdG8gYmUgYSBOVUxMIHBvaW50ZXIuCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1jb21wcmVzc19vdXRwdXQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGlucHV0X2J1ZikKLXsKLSAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7Ci0gIEpESU1FTlNJT04gTUNVX2NvbF9udW07CS8qIGluZGV4IG9mIGN1cnJlbnQgTUNVIHdpdGhpbiByb3cgKi8KLSAgaW50IGJsa24sIGNpLCB4aW5kZXgsIHlpbmRleCwgeW9mZnNldDsKLSAgSkRJTUVOU0lPTiBzdGFydF9jb2w7Ci0gIEpCTE9DS0FSUkFZIGJ1ZmZlcltNQVhfQ09NUFNfSU5fU0NBTl07Ci0gIEpCTE9DS1JPVyBidWZmZXJfcHRyOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotCi0gIC8qIEFsaWduIHRoZSB2aXJ0dWFsIGJ1ZmZlcnMgZm9yIHRoZSBjb21wb25lbnRzIHVzZWQgaW4gdGhpcyBzY2FuLgotICAgKiBOQjogZHVyaW5nIGZpcnN0IHBhc3MsIHRoaXMgaXMgc2FmZSBvbmx5IGJlY2F1c2UgdGhlIGJ1ZmZlcnMgd2lsbAotICAgKiBhbHJlYWR5IGJlIGFsaWduZWQgcHJvcGVybHksIHNvIGptZW1tZ3IuYyB3b24ndCBuZWVkIHRvIGRvIGFueSBJL08uCi0gICAqLwotICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgewotICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0gICAgYnVmZmVyW2NpXSA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBjb2VmLT53aG9sZV9pbWFnZVtjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdLAotICAgICAgIGNvZWYtPmlNQ1Vfcm93X251bSAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCi0gICAgICAgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIEZBTFNFKTsKLSAgfQotCi0gIC8qIExvb3AgdG8gcHJvY2VzcyBvbmUgd2hvbGUgaU1DVSByb3cgKi8KLSAgZm9yICh5b2Zmc2V0ID0gY29lZi0+TUNVX3ZlcnRfb2Zmc2V0OyB5b2Zmc2V0IDwgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OwotICAgICAgIHlvZmZzZXQrKykgewotICAgIGZvciAoTUNVX2NvbF9udW0gPSBjb2VmLT5tY3VfY3RyOyBNQ1VfY29sX251bSA8IGNpbmZvLT5NQ1VzX3Blcl9yb3c7Ci0JIE1DVV9jb2xfbnVtKyspIHsKLSAgICAgIC8qIENvbnN0cnVjdCBsaXN0IG9mIHBvaW50ZXJzIHRvIERDVCBibG9ja3MgYmVsb25naW5nIHRvIHRoaXMgTUNVICovCi0gICAgICBibGtuID0gMDsJCQkvKiBpbmRleCBvZiBjdXJyZW50IERDVCBibG9jayB3aXRoaW4gTUNVICovCi0gICAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgewotCWNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0Jc3RhcnRfY29sID0gTUNVX2NvbF9udW0gKiBjb21wcHRyLT5NQ1Vfd2lkdGg7Ci0JZm9yICh5aW5kZXggPSAwOyB5aW5kZXggPCBjb21wcHRyLT5NQ1VfaGVpZ2h0OyB5aW5kZXgrKykgewotCSAgYnVmZmVyX3B0ciA9IGJ1ZmZlcltjaV1beWluZGV4K3lvZmZzZXRdICsgc3RhcnRfY29sOwotCSAgZm9yICh4aW5kZXggPSAwOyB4aW5kZXggPCBjb21wcHRyLT5NQ1Vfd2lkdGg7IHhpbmRleCsrKSB7Ci0JICAgIGNvZWYtPk1DVV9idWZmZXJbYmxrbisrXSA9IGJ1ZmZlcl9wdHIrKzsKLQkgIH0KLQl9Ci0gICAgICB9Ci0gICAgICAvKiBUcnkgdG8gd3JpdGUgdGhlIE1DVS4gKi8KLSAgICAgIGlmICghICgqY2luZm8tPmVudHJvcHktPmVuY29kZV9tY3UpIChjaW5mbywgY29lZi0+TUNVX2J1ZmZlcikpIHsKLQkvKiBTdXNwZW5zaW9uIGZvcmNlZDsgdXBkYXRlIHN0YXRlIGNvdW50ZXJzIGFuZCBleGl0ICovCi0JY29lZi0+TUNVX3ZlcnRfb2Zmc2V0ID0geW9mZnNldDsKLQljb2VmLT5tY3VfY3RyID0gTUNVX2NvbF9udW07Ci0JcmV0dXJuIEZBTFNFOwotICAgICAgfQotICAgIH0KLSAgICAvKiBDb21wbGV0ZWQgYW4gTUNVIHJvdywgYnV0IHBlcmhhcHMgbm90IGFuIGlNQ1Ugcm93ICovCi0gICAgY29lZi0+bWN1X2N0ciA9IDA7Ci0gIH0KLSAgLyogQ29tcGxldGVkIHRoZSBpTUNVIHJvdywgYWR2YW5jZSBjb3VudGVycyBmb3IgbmV4dCBvbmUgKi8KLSAgY29lZi0+aU1DVV9yb3dfbnVtKys7Ci0gIHN0YXJ0X2lNQ1Vfcm93KGNpbmZvKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLSNlbmRpZiAvKiBGVUxMX0NPRUZfQlVGRkVSX1NVUFBPUlRFRCAqLwotCi0KLS8qCi0gKiBJbml0aWFsaXplIGNvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sbGVyLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfY19jb2VmX2NvbnRyb2xsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpCi17Ci0gIG15X2NvZWZfcHRyIGNvZWY7Ci0KLSAgY29lZiA9IChteV9jb2VmX3B0cikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCVNJWkVPRihteV9jb2VmX2NvbnRyb2xsZXIpKTsKLSAgY2luZm8tPmNvZWYgPSAoc3RydWN0IGpwZWdfY19jb2VmX2NvbnRyb2xsZXIgKikgY29lZjsKLSAgY29lZi0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX2NvZWY7Ci0KLSAgLyogQ3JlYXRlIHRoZSBjb2VmZmljaWVudCBidWZmZXIuICovCi0gIGlmIChuZWVkX2Z1bGxfYnVmZmVyKSB7Ci0jaWZkZWYgRlVMTF9DT0VGX0JVRkZFUl9TVVBQT1JURUQKLSAgICAvKiBBbGxvY2F0ZSBhIGZ1bGwtaW1hZ2UgdmlydHVhbCBhcnJheSBmb3IgZWFjaCBjb21wb25lbnQsICovCi0gICAgLyogcGFkZGVkIHRvIGEgbXVsdGlwbGUgb2Ygc2FtcF9mYWN0b3IgRENUIGJsb2NrcyBpbiBlYWNoIGRpcmVjdGlvbi4gKi8KLSAgICBpbnQgY2k7Ci0gICAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0JIGNpKyssIGNvbXBwdHIrKykgewotICAgICAgY29lZi0+d2hvbGVfaW1hZ2VbY2ldID0gKCpjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfYmFycmF5KQotCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIEZBTFNFLAotCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MsCi0JCQkJKGxvbmcpIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpLAotCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzLAotCQkJCShsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSwKLQkgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOwotICAgIH0KLSNlbHNlCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotI2VuZGlmCi0gIH0gZWxzZSB7Ci0gICAgLyogV2Ugb25seSBuZWVkIGEgc2luZ2xlLU1DVSBidWZmZXIuICovCi0gICAgSkJMT0NLUk9XIGJ1ZmZlcjsKLSAgICBpbnQgaTsKLQotICAgIGJ1ZmZlciA9IChKQkxPQ0tST1cpCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX2xhcmdlKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgQ19NQVhfQkxPQ0tTX0lOX01DVSAqIFNJWkVPRihKQkxPQ0spKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgQ19NQVhfQkxPQ0tTX0lOX01DVTsgaSsrKSB7Ci0gICAgICBjb2VmLT5NQ1VfYnVmZmVyW2ldID0gYnVmZmVyICsgaTsKLSAgICB9Ci0gICAgY29lZi0+d2hvbGVfaW1hZ2VbMF0gPSBOVUxMOyAvKiBmbGFnIGZvciBubyB2aXJ0dWFsIGFycmF5cyAqLwotICB9Ci19Ci0KLSNlbmRpZiAvL19GWF9KUEVHX1RVUkJPXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNjb2xvci5jIGIvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNjb2xvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDlhMDViLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjY29sb3IuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2MiArMCwwIEBACi0jaWYgIWRlZmluZWQoX0ZYX0pQRUdfVFVSQk9fKQotLyoKLSAqIGpjY29sb3IuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGlucHV0IGNvbG9yc3BhY2UgY29udmVyc2lvbiByb3V0aW5lcy4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyogUHJpdmF0ZSBzdWJvYmplY3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19jb2xvcl9jb252ZXJ0ZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgLyogUHJpdmF0ZSBzdGF0ZSBmb3IgUkdCLT5ZQ0MgY29udmVyc2lvbiAqLwotICBJTlQzMiAqIHJnYl95Y2NfdGFiOwkJLyogPT4gdGFibGUgZm9yIFJHQiB0byBZQ2JDciBjb252ZXJzaW9uICovCi19IG15X2NvbG9yX2NvbnZlcnRlcjsKLQotdHlwZWRlZiBteV9jb2xvcl9jb252ZXJ0ZXIgKiBteV9jY29udmVydF9wdHI7Ci0KLQotLyoqKioqKioqKioqKioqKiogUkdCIC0+IFlDYkNyIGNvbnZlcnNpb246IG1vc3QgY29tbW9uIGNhc2UgKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBZQ2JDciBpcyBkZWZpbmVkIHBlciBDQ0lSIDYwMS0xLCBleGNlcHQgdGhhdCBDYiBhbmQgQ3IgYXJlCi0gKiBub3JtYWxpemVkIHRvIHRoZSByYW5nZSAwLi5NQVhKU0FNUExFIHJhdGhlciB0aGFuIC0wLjUgLi4gMC41LgotICogVGhlIGNvbnZlcnNpb24gZXF1YXRpb25zIHRvIGJlIGltcGxlbWVudGVkIGFyZSB0aGVyZWZvcmUKLSAqCVkgID0gIDAuMjk5MDAgKiBSICsgMC41ODcwMCAqIEcgKyAwLjExNDAwICogQgotICoJQ2IgPSAtMC4xNjg3NCAqIFIgLSAwLjMzMTI2ICogRyArIDAuNTAwMDAgKiBCICArIENFTlRFUkpTQU1QTEUKLSAqCUNyID0gIDAuNTAwMDAgKiBSIC0gMC40MTg2OSAqIEcgLSAwLjA4MTMxICogQiAgKyBDRU5URVJKU0FNUExFCi0gKiAoVGhlc2UgbnVtYmVycyBhcmUgZGVyaXZlZCBmcm9tIFRJRkYgNi4wIHNlY3Rpb24gMjEsIGRhdGVkIDMtSnVuZS05Mi4pCi0gKiBOb3RlOiBvbGRlciB2ZXJzaW9ucyBvZiB0aGUgSUpHIGNvZGUgdXNlZCBhIHplcm8gb2Zmc2V0IG9mIE1BWEpTQU1QTEUvMiwKLSAqIHJhdGhlciB0aGFuIENFTlRFUkpTQU1QTEUsIGZvciBDYiBhbmQgQ3IuICBUaGlzIGdhdmUgZXF1YWwgcG9zaXRpdmUgYW5kCi0gKiBuZWdhdGl2ZSBzd2luZ3MgZm9yIENiL0NyLCBidXQgbWVhbnQgdGhhdCBncmF5c2NhbGUgdmFsdWVzIChDYj1Dcj0wKQotICogd2VyZSBub3QgcmVwcmVzZW50ZWQgZXhhY3RseS4gIE5vdyB3ZSBzYWNyaWZpY2UgZXhhY3QgcmVwcmVzZW50YXRpb24gb2YKLSAqIG1heGltdW0gcmVkIGFuZCBtYXhpbXVtIGJsdWUgaW4gb3JkZXIgdG8gZ2V0IGV4YWN0IGdyYXlzY2FsZXMuCi0gKgotICogVG8gYXZvaWQgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYywgd2UgcmVwcmVzZW50IHRoZSBmcmFjdGlvbmFsIGNvbnN0YW50cwotICogYXMgaW50ZWdlcnMgc2NhbGVkIHVwIGJ5IDJeMTYgKGFib3V0IDQgZGlnaXRzIHByZWNpc2lvbik7IHdlIGhhdmUgdG8gZGl2aWRlCi0gKiB0aGUgcHJvZHVjdHMgYnkgMl4xNiwgd2l0aCBhcHByb3ByaWF0ZSByb3VuZGluZywgdG8gZ2V0IHRoZSBjb3JyZWN0IGFuc3dlci4KLSAqCi0gKiBGb3IgZXZlbiBtb3JlIHNwZWVkLCB3ZSBhdm9pZCBkb2luZyBhbnkgbXVsdGlwbGljYXRpb25zIGluIHRoZSBpbm5lciBsb29wCi0gKiBieSBwcmVjYWxjdWxhdGluZyB0aGUgY29uc3RhbnRzIHRpbWVzIFIsRyxCIGZvciBhbGwgcG9zc2libGUgdmFsdWVzLgotICogRm9yIDgtYml0IEpTQU1QTEVzIHRoaXMgaXMgdmVyeSByZWFzb25hYmxlIChvbmx5IDI1NiBlbnRyaWVzIHBlciB0YWJsZSk7Ci0gKiBmb3IgMTItYml0IHNhbXBsZXMgaXQgaXMgc3RpbGwgYWNjZXB0YWJsZS4gIEl0J3Mgbm90IHZlcnkgcmVhc29uYWJsZSBmb3IKLSAqIDE2LWJpdCBzYW1wbGVzLCBidXQgaWYgeW91IHdhbnQgbG9zc2xlc3Mgc3RvcmFnZSB5b3Ugc2hvdWxkbid0IGJlIGNoYW5naW5nCi0gKiBjb2xvcnNwYWNlIGFueXdheS4KLSAqIFRoZSBDRU5URVJKU0FNUExFIG9mZnNldHMgYW5kIHRoZSByb3VuZGluZyBmdWRnZS1mYWN0b3Igb2YgMC41IGFyZSBpbmNsdWRlZAotICogaW4gdGhlIHRhYmxlcyB0byBzYXZlIGFkZGluZyB0aGVtIHNlcGFyYXRlbHkgaW4gdGhlIGlubmVyIGxvb3AuCi0gKi8KLQotI2RlZmluZSBTQ0FMRUJJVFMJMTYJLyogc3BlZWRpZXN0IHJpZ2h0LXNoaWZ0IG9uIHNvbWUgbWFjaGluZXMgKi8KLSNkZWZpbmUgQ0JDUl9PRkZTRVQJKChJTlQzMikgQ0VOVEVSSlNBTVBMRSA8PCBTQ0FMRUJJVFMpCi0jZGVmaW5lIE9ORV9IQUxGCSgoSU5UMzIpIDEgPDwgKFNDQUxFQklUUy0xKSkKLSNkZWZpbmUgRklYKHgpCQkoKElOVDMyKSAoKHgpICogKDFMPDxTQ0FMRUJJVFMpICsgMC41KSkKLQotLyogV2UgYWxsb2NhdGUgb25lIGJpZyB0YWJsZSBhbmQgZGl2aWRlIGl0IHVwIGludG8gZWlnaHQgcGFydHMsIGluc3RlYWQgb2YKLSAqIGRvaW5nIGVpZ2h0IGFsbG9jX3NtYWxsIHJlcXVlc3RzLiAgVGhpcyBsZXRzIHVzIHVzZSBhIHNpbmdsZSB0YWJsZSBiYXNlCi0gKiBhZGRyZXNzLCB3aGljaCBjYW4gYmUgaGVsZCBpbiBhIHJlZ2lzdGVyIGluIHRoZSBpbm5lciBsb29wcyBvbiBtYW55Ci0gKiBtYWNoaW5lcyAobW9yZSB0aGFuIGNhbiBob2xkIGFsbCBlaWdodCBhZGRyZXNzZXMsIGFueXdheSkuCi0gKi8KLQotI2RlZmluZSBSX1lfT0ZGCQkwCQkJLyogb2Zmc2V0IHRvIFIgPT4gWSBzZWN0aW9uICovCi0jZGVmaW5lIEdfWV9PRkYJCSgxKihNQVhKU0FNUExFKzEpKQkvKiBvZmZzZXQgdG8gRyA9PiBZIHNlY3Rpb24gKi8KLSNkZWZpbmUgQl9ZX09GRgkJKDIqKE1BWEpTQU1QTEUrMSkpCS8qIGV0Yy4gKi8KLSNkZWZpbmUgUl9DQl9PRkYJKDMqKE1BWEpTQU1QTEUrMSkpCi0jZGVmaW5lIEdfQ0JfT0ZGCSg0KihNQVhKU0FNUExFKzEpKQotI2RlZmluZSBCX0NCX09GRgkoNSooTUFYSlNBTVBMRSsxKSkKLSNkZWZpbmUgUl9DUl9PRkYJQl9DQl9PRkYJCS8qIEI9PkNiLCBSPT5DciBhcmUgdGhlIHNhbWUgKi8KLSNkZWZpbmUgR19DUl9PRkYJKDYqKE1BWEpTQU1QTEUrMSkpCi0jZGVmaW5lIEJfQ1JfT0ZGCSg3KihNQVhKU0FNUExFKzEpKQotI2RlZmluZSBUQUJMRV9TSVpFCSg4KihNQVhKU0FNUExFKzEpKQotCi0KLS8qCi0gKiBJbml0aWFsaXplIGZvciBSR0ItPllDQyBjb2xvcnNwYWNlIGNvbnZlcnNpb24uCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1yZ2JfeWNjX3N0YXJ0IChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OwotICBJTlQzMiAqIHJnYl95Y2NfdGFiOwotICBJTlQzMiBpOwotCi0gIC8qIEFsbG9jYXRlIGFuZCBmaWxsIGluIHRoZSBjb252ZXJzaW9uIHRhYmxlcy4gKi8KLSAgY2NvbnZlcnQtPnJnYl95Y2NfdGFiID0gcmdiX3ljY190YWIgPSAoSU5UMzIgKikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCShUQUJMRV9TSVpFICogU0laRU9GKElOVDMyKSkpOwotCi0gIGZvciAoaSA9IDA7IGkgPD0gTUFYSlNBTVBMRTsgaSsrKSB7Ci0gICAgcmdiX3ljY190YWJbaStSX1lfT0ZGXSA9IEZJWCgwLjI5OTAwKSAqIGk7Ci0gICAgcmdiX3ljY190YWJbaStHX1lfT0ZGXSA9IEZJWCgwLjU4NzAwKSAqIGk7Ci0gICAgcmdiX3ljY190YWJbaStCX1lfT0ZGXSA9IEZJWCgwLjExNDAwKSAqIGkgICAgICsgT05FX0hBTEY7Ci0gICAgcmdiX3ljY190YWJbaStSX0NCX09GRl0gPSAoLUZJWCgwLjE2ODc0KSkgKiBpOwotICAgIHJnYl95Y2NfdGFiW2krR19DQl9PRkZdID0gKC1GSVgoMC4zMzEyNikpICogaTsKLSAgICAvKiBXZSB1c2UgYSByb3VuZGluZyBmdWRnZS1mYWN0b3Igb2YgMC41LWVwc2lsb24gZm9yIENiIGFuZCBDci4KLSAgICAgKiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbWF4aW11bSBvdXRwdXQgd2lsbCByb3VuZCB0byBNQVhKU0FNUExFCi0gICAgICogbm90IE1BWEpTQU1QTEUrMSwgYW5kIHRodXMgdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHJhbmdlLWxpbWl0LgotICAgICAqLwotICAgIHJnYl95Y2NfdGFiW2krQl9DQl9PRkZdID0gRklYKDAuNTAwMDApICogaSAgICArIENCQ1JfT0ZGU0VUICsgT05FX0hBTEYtMTsKLS8qICBCPT5DYiBhbmQgUj0+Q3IgdGFibGVzIGFyZSB0aGUgc2FtZQotICAgIHJnYl95Y2NfdGFiW2krUl9DUl9PRkZdID0gRklYKDAuNTAwMDApICogaSAgICArIENCQ1JfT0ZGU0VUICsgT05FX0hBTEYtMTsKLSovCi0gICAgcmdiX3ljY190YWJbaStHX0NSX09GRl0gPSAoLUZJWCgwLjQxODY5KSkgKiBpOwotICAgIHJnYl95Y2NfdGFiW2krQl9DUl9PRkZdID0gKC1GSVgoMC4wODEzMSkpICogaTsKLSAgfQotfQotCi0KLS8qCi0gKiBDb252ZXJ0IHNvbWUgcm93cyBvZiBzYW1wbGVzIHRvIHRoZSBKUEVHIGNvbG9yc3BhY2UuCi0gKgotICogTm90ZSB0aGF0IHdlIGNoYW5nZSBmcm9tIHRoZSBhcHBsaWNhdGlvbidzIGludGVybGVhdmVkLXBpeGVsIGZvcm1hdAotICogdG8gb3VyIGludGVybmFsIG5vbmludGVybGVhdmVkLCBvbmUtcGxhbmUtcGVyLWNvbXBvbmVudCBmb3JtYXQuCi0gKiBUaGUgaW5wdXQgYnVmZmVyIGlzIHRoZXJlZm9yZSB0aHJlZSB0aW1lcyBhcyB3aWRlIGFzIHRoZSBvdXRwdXQgYnVmZmVyLgotICoKLSAqIEEgc3RhcnRpbmcgcm93IG9mZnNldCBpcyBwcm92aWRlZCBvbmx5IGZvciB0aGUgb3V0cHV0IGJ1ZmZlci4gIFRoZSBjYWxsZXIKLSAqIGNhbiBlYXNpbHkgYWRqdXN0IHRoZSBwYXNzZWQgaW5wdXRfYnVmIHZhbHVlIHRvIGFjY29tbW9kYXRlIGFueSByb3cKLSAqIG9mZnNldCByZXF1aXJlZCBvbiB0aGF0IHNpZGUuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1yZ2JfeWNjX2NvbnZlcnQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKLQkJIEpESU1FTlNJT04gb3V0cHV0X3JvdywgaW50IG51bV9yb3dzKQotewotICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7Ci0gIHJlZ2lzdGVyIGludCByLCBnLCBiOwotICByZWdpc3RlciBJTlQzMiAqIGN0YWIgPSBjY29udmVydC0+cmdiX3ljY190YWI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHIwLCBvdXRwdHIxLCBvdXRwdHIyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5pbWFnZV93aWR0aDsKLQotICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7Ci0gICAgaW5wdHIgPSAqaW5wdXRfYnVmKys7Ci0gICAgb3V0cHRyMCA9IG91dHB1dF9idWZbMF1bb3V0cHV0X3Jvd107Ci0gICAgb3V0cHRyMSA9IG91dHB1dF9idWZbMV1bb3V0cHV0X3Jvd107Ci0gICAgb3V0cHRyMiA9IG91dHB1dF9idWZbMl1bb3V0cHV0X3Jvd107Ci0gICAgb3V0cHV0X3JvdysrOwotICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7Ci0gICAgICByID0gR0VUSlNBTVBMRShpbnB0cltSR0JfUkVEXSk7Ci0gICAgICBnID0gR0VUSlNBTVBMRShpbnB0cltSR0JfR1JFRU5dKTsKLSAgICAgIGIgPSBHRVRKU0FNUExFKGlucHRyW1JHQl9CTFVFXSk7Ci0gICAgICBpbnB0ciArPSBSR0JfUElYRUxTSVpFOwotICAgICAgLyogSWYgdGhlIGlucHV0cyBhcmUgMC4uTUFYSlNBTVBMRSwgdGhlIG91dHB1dHMgb2YgdGhlc2UgZXF1YXRpb25zCi0gICAgICAgKiBtdXN0IGJlIHRvbzsgd2UgZG8gbm90IG5lZWQgYW4gZXhwbGljaXQgcmFuZ2UtbGltaXRpbmcgb3BlcmF0aW9uLgotICAgICAgICogSGVuY2UgdGhlIHZhbHVlIGJlaW5nIHNoaWZ0ZWQgaXMgbmV2ZXIgbmVnYXRpdmUsIGFuZCB3ZSBkb24ndAotICAgICAgICogbmVlZCB0aGUgZ2VuZXJhbCBSSUdIVF9TSElGVCBtYWNyby4KLSAgICAgICAqLwotICAgICAgLyogWSAqLwotICAgICAgb3V0cHRyMFtjb2xdID0gKEpTQU1QTEUpCi0JCSgoY3RhYltyK1JfWV9PRkZdICsgY3RhYltnK0dfWV9PRkZdICsgY3RhYltiK0JfWV9PRkZdKQotCQkgPj4gU0NBTEVCSVRTKTsKLSAgICAgIC8qIENiICovCi0gICAgICBvdXRwdHIxW2NvbF0gPSAoSlNBTVBMRSkKLQkJKChjdGFiW3IrUl9DQl9PRkZdICsgY3RhYltnK0dfQ0JfT0ZGXSArIGN0YWJbYitCX0NCX09GRl0pCi0JCSA+PiBTQ0FMRUJJVFMpOwotICAgICAgLyogQ3IgKi8KLSAgICAgIG91dHB0cjJbY29sXSA9IChKU0FNUExFKQotCQkoKGN0YWJbcitSX0NSX09GRl0gKyBjdGFiW2crR19DUl9PRkZdICsgY3RhYltiK0JfQ1JfT0ZGXSkKLQkJID4+IFNDQUxFQklUUyk7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKiogQ2FzZXMgb3RoZXIgdGhhbiBSR0IgLT4gWUNiQ3IgKioqKioqKioqKioqKiovCi0KLQotLyoKLSAqIENvbnZlcnQgc29tZSByb3dzIG9mIHNhbXBsZXMgdG8gdGhlIEpQRUcgY29sb3JzcGFjZS4KLSAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIFJHQi0+Z3JheXNjYWxlIGNvbnZlcnNpb24sIHdoaWNoIGlzIHRoZSBzYW1lCi0gKiBhcyB0aGUgUkdCLT5ZIHBvcnRpb24gb2YgUkdCLT5ZQ2JDci4KLSAqIFdlIGFzc3VtZSByZ2JfeWNjX3N0YXJ0IGhhcyBiZWVuIGNhbGxlZCAod2Ugb25seSB1c2UgdGhlIFkgdGFibGVzKS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXJnYl9ncmF5X2NvbnZlcnQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUElNQUdFIG91dHB1dF9idWYsCi0JCSAgSkRJTUVOU0lPTiBvdXRwdXRfcm93LCBpbnQgbnVtX3Jvd3MpCi17Ci0gIG15X2Njb252ZXJ0X3B0ciBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpIGNpbmZvLT5jY29udmVydDsKLSAgcmVnaXN0ZXIgaW50IHIsIGcsIGI7Ci0gIHJlZ2lzdGVyIElOVDMyICogY3RhYiA9IGNjb252ZXJ0LT5yZ2JfeWNjX3RhYjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0gIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7Ci0KLSAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgewotICAgIGlucHRyID0gKmlucHV0X2J1ZisrOwotICAgIG91dHB0ciA9IG91dHB1dF9idWZbMF1bb3V0cHV0X3Jvd107Ci0gICAgb3V0cHV0X3JvdysrOwotICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7Ci0gICAgICByID0gR0VUSlNBTVBMRShpbnB0cltSR0JfUkVEXSk7Ci0gICAgICBnID0gR0VUSlNBTVBMRShpbnB0cltSR0JfR1JFRU5dKTsKLSAgICAgIGIgPSBHRVRKU0FNUExFKGlucHRyW1JHQl9CTFVFXSk7Ci0gICAgICBpbnB0ciArPSBSR0JfUElYRUxTSVpFOwotICAgICAgLyogWSAqLwotICAgICAgb3V0cHRyW2NvbF0gPSAoSlNBTVBMRSkKLQkJKChjdGFiW3IrUl9ZX09GRl0gKyBjdGFiW2crR19ZX09GRl0gKyBjdGFiW2IrQl9ZX09GRl0pCi0JCSA+PiBTQ0FMRUJJVFMpOwotICAgIH0KLSAgfQotfQotCi0KLS8qCi0gKiBDb252ZXJ0IHNvbWUgcm93cyBvZiBzYW1wbGVzIHRvIHRoZSBKUEVHIGNvbG9yc3BhY2UuCi0gKiBUaGlzIHZlcnNpb24gaGFuZGxlcyBBZG9iZS1zdHlsZSBDTVlLLT5ZQ0NLIGNvbnZlcnNpb24sCi0gKiB3aGVyZSB3ZSBjb252ZXJ0IFI9MS1DLCBHPTEtTSwgYW5kIEI9MS1ZIHRvIFlDYkNyIHVzaW5nIHRoZSBzYW1lCi0gKiBjb252ZXJzaW9uIGFzIGFib3ZlLCB3aGlsZSBwYXNzaW5nIEsgKGJsYWNrKSB1bmNoYW5nZWQuCi0gKiBXZSBhc3N1bWUgcmdiX3ljY19zdGFydCBoYXMgYmVlbiBjYWxsZWQuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1jbXlrX3ljY2tfY29udmVydCAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCSAgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUElNQUdFIG91dHB1dF9idWYsCi0JCSAgIEpESU1FTlNJT04gb3V0cHV0X3JvdywgaW50IG51bV9yb3dzKQotewotICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7Ci0gIHJlZ2lzdGVyIGludCByLCBnLCBiOwotICByZWdpc3RlciBJTlQzMiAqIGN0YWIgPSBjY29udmVydC0+cmdiX3ljY190YWI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHIwLCBvdXRwdHIxLCBvdXRwdHIyLCBvdXRwdHIzOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5pbWFnZV93aWR0aDsKLQotICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7Ci0gICAgaW5wdHIgPSAqaW5wdXRfYnVmKys7Ci0gICAgb3V0cHRyMCA9IG91dHB1dF9idWZbMF1bb3V0cHV0X3Jvd107Ci0gICAgb3V0cHRyMSA9IG91dHB1dF9idWZbMV1bb3V0cHV0X3Jvd107Ci0gICAgb3V0cHRyMiA9IG91dHB1dF9idWZbMl1bb3V0cHV0X3Jvd107Ci0gICAgb3V0cHRyMyA9IG91dHB1dF9idWZbM11bb3V0cHV0X3Jvd107Ci0gICAgb3V0cHV0X3JvdysrOwotICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7Ci0gICAgICByID0gTUFYSlNBTVBMRSAtIEdFVEpTQU1QTEUoaW5wdHJbMF0pOwotICAgICAgZyA9IE1BWEpTQU1QTEUgLSBHRVRKU0FNUExFKGlucHRyWzFdKTsKLSAgICAgIGIgPSBNQVhKU0FNUExFIC0gR0VUSlNBTVBMRShpbnB0clsyXSk7Ci0gICAgICAvKiBLIHBhc3NlcyB0aHJvdWdoIGFzLWlzICovCi0gICAgICBvdXRwdHIzW2NvbF0gPSBpbnB0clszXTsJLyogZG9uJ3QgbmVlZCBHRVRKU0FNUExFIGhlcmUgKi8KLSAgICAgIGlucHRyICs9IDQ7Ci0gICAgICAvKiBJZiB0aGUgaW5wdXRzIGFyZSAwLi5NQVhKU0FNUExFLCB0aGUgb3V0cHV0cyBvZiB0aGVzZSBlcXVhdGlvbnMKLSAgICAgICAqIG11c3QgYmUgdG9vOyB3ZSBkbyBub3QgbmVlZCBhbiBleHBsaWNpdCByYW5nZS1saW1pdGluZyBvcGVyYXRpb24uCi0gICAgICAgKiBIZW5jZSB0aGUgdmFsdWUgYmVpbmcgc2hpZnRlZCBpcyBuZXZlciBuZWdhdGl2ZSwgYW5kIHdlIGRvbid0Ci0gICAgICAgKiBuZWVkIHRoZSBnZW5lcmFsIFJJR0hUX1NISUZUIG1hY3JvLgotICAgICAgICovCi0gICAgICAvKiBZICovCi0gICAgICBvdXRwdHIwW2NvbF0gPSAoSlNBTVBMRSkKLQkJKChjdGFiW3IrUl9ZX09GRl0gKyBjdGFiW2crR19ZX09GRl0gKyBjdGFiW2IrQl9ZX09GRl0pCi0JCSA+PiBTQ0FMRUJJVFMpOwotICAgICAgLyogQ2IgKi8KLSAgICAgIG91dHB0cjFbY29sXSA9IChKU0FNUExFKQotCQkoKGN0YWJbcitSX0NCX09GRl0gKyBjdGFiW2crR19DQl9PRkZdICsgY3RhYltiK0JfQ0JfT0ZGXSkKLQkJID4+IFNDQUxFQklUUyk7Ci0gICAgICAvKiBDciAqLwotICAgICAgb3V0cHRyMltjb2xdID0gKEpTQU1QTEUpCi0JCSgoY3RhYltyK1JfQ1JfT0ZGXSArIGN0YWJbZytHX0NSX09GRl0gKyBjdGFiW2IrQl9DUl9PRkZdKQotCQkgPj4gU0NBTEVCSVRTKTsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKgotICogQ29udmVydCBzb21lIHJvd3Mgb2Ygc2FtcGxlcyB0byB0aGUgSlBFRyBjb2xvcnNwYWNlLgotICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgZ3JheXNjYWxlIG91dHB1dCB3aXRoIG5vIGNvbnZlcnNpb24uCi0gKiBUaGUgc291cmNlIGNhbiBiZSBlaXRoZXIgcGxhaW4gZ3JheXNjYWxlIG9yIFlDYkNyIChzaW5jZSBZID09IGdyYXkpLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZ3JheXNjYWxlX2NvbnZlcnQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkgICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAotCQkgICBKRElNRU5TSU9OIG91dHB1dF9yb3csIGludCBudW1fcm93cykKLXsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0gIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7Ci0gIGludCBpbnN0cmlkZSA9IGNpbmZvLT5pbnB1dF9jb21wb25lbnRzOwotCi0gIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKLSAgICBpbnB0ciA9ICppbnB1dF9idWYrKzsKLSAgICBvdXRwdHIgPSBvdXRwdXRfYnVmWzBdW291dHB1dF9yb3ddOwotICAgIG91dHB1dF9yb3crKzsKLSAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bV9jb2xzOyBjb2wrKykgewotICAgICAgb3V0cHRyW2NvbF0gPSBpbnB0clswXTsJLyogZG9uJ3QgbmVlZCBHRVRKU0FNUExFKCkgaGVyZSAqLwotICAgICAgaW5wdHIgKz0gaW5zdHJpZGU7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoKLSAqIENvbnZlcnQgc29tZSByb3dzIG9mIHNhbXBsZXMgdG8gdGhlIEpQRUcgY29sb3JzcGFjZS4KLSAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIG11bHRpLWNvbXBvbmVudCBjb2xvcnNwYWNlcyB3aXRob3V0IGNvbnZlcnNpb24uCi0gKiBXZSBhc3N1bWUgaW5wdXRfY29tcG9uZW50cyA9PSBudW1fY29tcG9uZW50cy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLW51bGxfY29udmVydCAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JICAgICAgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKLQkgICAgICBKRElNRU5TSU9OIG91dHB1dF9yb3csIGludCBudW1fcm93cykKLXsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0gIHJlZ2lzdGVyIGludCBjaTsKLSAgaW50IG5jID0gY2luZm8tPm51bV9jb21wb25lbnRzOwotICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPmltYWdlX3dpZHRoOwotCi0gIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKLSAgICAvKiBJdCBzZWVtcyBmYXN0ZXN0IHRvIG1ha2UgYSBzZXBhcmF0ZSBwYXNzIGZvciBlYWNoIGNvbXBvbmVudC4gKi8KLSAgICBmb3IgKGNpID0gMDsgY2kgPCBuYzsgY2krKykgewotICAgICAgaW5wdHIgPSAqaW5wdXRfYnVmOwotICAgICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjaV1bb3V0cHV0X3Jvd107Ci0gICAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bV9jb2xzOyBjb2wrKykgewotCW91dHB0cltjb2xdID0gaW5wdHJbY2ldOyAvKiBkb24ndCBuZWVkIEdFVEpTQU1QTEUoKSBoZXJlICovCi0JaW5wdHIgKz0gbmM7Ci0gICAgICB9Ci0gICAgfQotICAgIGlucHV0X2J1ZisrOwotICAgIG91dHB1dF9yb3crKzsKLSAgfQotfQotCi0KLS8qCi0gKiBFbXB0eSBtZXRob2QgZm9yIHN0YXJ0X3Bhc3MuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1udWxsX21ldGhvZCAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIC8qIG5vIHdvcmsgbmVlZGVkICovCi19Ci0KLQotLyoKLSAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciBpbnB1dCBjb2xvcnNwYWNlIGNvbnZlcnNpb24uCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9jb2xvcl9jb252ZXJ0ZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQ7Ci0KLSAgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJU0laRU9GKG15X2NvbG9yX2NvbnZlcnRlcikpOwotICBjaW5mby0+Y2NvbnZlcnQgPSAoc3RydWN0IGpwZWdfY29sb3JfY29udmVydGVyICopIGNjb252ZXJ0OwotICAvKiBzZXQgc3RhcnRfcGFzcyB0byBudWxsIG1ldGhvZCB1bnRpbCB3ZSBmaW5kIG91dCBkaWZmZXJlbnRseSAqLwotICBjY29udmVydC0+cHViLnN0YXJ0X3Bhc3MgPSBudWxsX21ldGhvZDsKLQotICAvKiBNYWtlIHN1cmUgaW5wdXRfY29tcG9uZW50cyBhZ3JlZXMgd2l0aCBpbl9jb2xvcl9zcGFjZSAqLwotICBzd2l0Y2ggKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSkgewotICBjYXNlIEpDU19HUkFZU0NBTEU6Ci0gICAgaWYgKGNpbmZvLT5pbnB1dF9jb21wb25lbnRzICE9IDEpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9JTl9DT0xPUlNQQUNFKTsKLSAgICBicmVhazsKLQotICBjYXNlIEpDU19SR0I6Ci0jaWYgUkdCX1BJWEVMU0laRSAhPSAzCi0gICAgaWYgKGNpbmZvLT5pbnB1dF9jb21wb25lbnRzICE9IFJHQl9QSVhFTFNJWkUpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9JTl9DT0xPUlNQQUNFKTsKLSAgICBicmVhazsKLSNlbmRpZiAvKiBlbHNlIHNoYXJlIGNvZGUgd2l0aCBZQ2JDciAqLwotCi0gIGNhc2UgSkNTX1lDYkNyOgotICAgIGlmIChjaW5mby0+aW5wdXRfY29tcG9uZW50cyAhPSAzKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSU5fQ09MT1JTUEFDRSk7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBKQ1NfQ01ZSzoKLSAgY2FzZSBKQ1NfWUNDSzoKLSAgICBpZiAoY2luZm8tPmlucHV0X2NvbXBvbmVudHMgIT0gNCkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0lOX0NPTE9SU1BBQ0UpOwotICAgIGJyZWFrOwotCi0gIGRlZmF1bHQ6CQkJLyogSkNTX1VOS05PV04gY2FuIGJlIGFueXRoaW5nICovCi0gICAgaWYgKGNpbmZvLT5pbnB1dF9jb21wb25lbnRzIDwgMSkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0lOX0NPTE9SU1BBQ0UpOwotICAgIGJyZWFrOwotICB9Ci0KLSAgLyogQ2hlY2sgbnVtX2NvbXBvbmVudHMsIHNldCBjb252ZXJzaW9uIG1ldGhvZCBiYXNlZCBvbiByZXF1ZXN0ZWQgc3BhY2UgKi8KLSAgc3dpdGNoIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSkgewotICBjYXNlIEpDU19HUkFZU0NBTEU6Ci0gICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyAhPSAxKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKLSAgICBpZiAoY2luZm8tPmluX2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUpCi0gICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBncmF5c2NhbGVfY29udmVydDsKLSAgICBlbHNlIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX1JHQikgewotICAgICAgY2NvbnZlcnQtPnB1Yi5zdGFydF9wYXNzID0gcmdiX3ljY19zdGFydDsKLSAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IHJnYl9ncmF5X2NvbnZlcnQ7Ci0gICAgfSBlbHNlIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyKQotICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gZ3JheXNjYWxlX2NvbnZlcnQ7Ci0gICAgZWxzZQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOwotICAgIGJyZWFrOwotCi0gIGNhc2UgSkNTX1JHQjoKLSAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDMpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOwotICAgIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX1JHQiAmJiBSR0JfUElYRUxTSVpFID09IDMpCi0gICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBudWxsX2NvbnZlcnQ7Ci0gICAgZWxzZQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOwotICAgIGJyZWFrOwotCi0gIGNhc2UgSkNTX1lDYkNyOgotICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gMykKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7Ci0gICAgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7Ci0gICAgICBjY29udmVydC0+cHViLnN0YXJ0X3Bhc3MgPSByZ2JfeWNjX3N0YXJ0OwotICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gcmdiX3ljY19jb252ZXJ0OwotICAgIH0gZWxzZSBpZiAoY2luZm8tPmluX2NvbG9yX3NwYWNlID09IEpDU19ZQ2JDcikKLSAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKLSAgICBlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBKQ1NfQ01ZSzoKLSAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDQpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOwotICAgIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX0NNWUspCi0gICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBudWxsX2NvbnZlcnQ7Ci0gICAgZWxzZQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOwotICAgIGJyZWFrOwotCi0gIGNhc2UgSkNTX1lDQ0s6Ci0gICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyAhPSA0KQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKLSAgICBpZiAoY2luZm8tPmluX2NvbG9yX3NwYWNlID09IEpDU19DTVlLKSB7Ci0gICAgICBjY29udmVydC0+cHViLnN0YXJ0X3Bhc3MgPSByZ2JfeWNjX3N0YXJ0OwotICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gY215a195Y2NrX2NvbnZlcnQ7Ci0gICAgfSBlbHNlIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX1lDQ0spCi0gICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBudWxsX2NvbnZlcnQ7Ci0gICAgZWxzZQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOwotICAgIGJyZWFrOwotCi0gIGRlZmF1bHQ6CQkJLyogYWxsb3cgbnVsbCBjb252ZXJzaW9uIG9mIEpDU19VTktOT1dOICovCi0gICAgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlICE9IGNpbmZvLT5pbl9jb2xvcl9zcGFjZSB8fAotCWNpbmZvLT5udW1fY29tcG9uZW50cyAhPSBjaW5mby0+aW5wdXRfY29tcG9uZW50cykKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKLSAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBudWxsX2NvbnZlcnQ7Ci0gICAgYnJlYWs7Ci0gIH0KLX0KLQotI2VuZGlmIC8vX0ZYX0pQRUdfVFVSQk9fCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY2RjdG1nci5jIGIvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNkY3RtZ3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JkN2QxMS4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY2RjdG1nci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkwICswLDAgQEAKLSNpZiAhZGVmaW5lZChfRlhfSlBFR19UVVJCT18pCi0vKgotICogamNkY3RtZ3IuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBmb3J3YXJkLURDVCBtYW5hZ2VtZW50IGxvZ2ljLgotICogVGhpcyBjb2RlIHNlbGVjdHMgYSBwYXJ0aWN1bGFyIERDVCBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkLAotICogYW5kIGl0IHBlcmZvcm1zIHJlbGF0ZWQgaG91c2VrZWVwaW5nIGNob3JlcyBpbmNsdWRpbmcgY29lZmZpY2llbnQKLSAqIHF1YW50aXphdGlvbi4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiamRjdC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KLQotCi0vKiBQcml2YXRlIHN1Ym9iamVjdCBmb3IgdGhpcyBtb2R1bGUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19mb3J3YXJkX2RjdCBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBQb2ludGVyIHRvIHRoZSBEQ1Qgcm91dGluZSBhY3R1YWxseSBpbiB1c2UgKi8KLSAgZm9yd2FyZF9EQ1RfbWV0aG9kX3B0ciBkb19kY3Q7Ci0KLSAgLyogVGhlIGFjdHVhbCBwb3N0LURDVCBkaXZpc29ycyAtLS0gbm90IGlkZW50aWNhbCB0byB0aGUgcXVhbnQgdGFibGUKLSAgICogZW50cmllcywgYmVjYXVzZSBvZiBzY2FsaW5nIChlc3BlY2lhbGx5IGZvciBhbiB1bm5vcm1hbGl6ZWQgRENUKS4KLSAgICogRWFjaCB0YWJsZSBpcyBnaXZlbiBpbiBub3JtYWwgYXJyYXkgb3JkZXIuCi0gICAqLwotICBEQ1RFTEVNICogZGl2aXNvcnNbTlVNX1FVQU5UX1RCTFNdOwotCi0jaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAotICAvKiBTYW1lIGFzIGFib3ZlIGZvciB0aGUgZmxvYXRpbmctcG9pbnQgY2FzZS4gKi8KLSAgZmxvYXRfRENUX21ldGhvZF9wdHIgZG9fZmxvYXRfZGN0OwotICBGQVNUX0ZMT0FUICogZmxvYXRfZGl2aXNvcnNbTlVNX1FVQU5UX1RCTFNdOwotI2VuZGlmCi19IG15X2ZkY3RfY29udHJvbGxlcjsKLQotdHlwZWRlZiBteV9mZGN0X2NvbnRyb2xsZXIgKiBteV9mZGN0X3B0cjsKLQotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYSBwcm9jZXNzaW5nIHBhc3MuCi0gKiBWZXJpZnkgdGhhdCBhbGwgcmVmZXJlbmNlZCBRLXRhYmxlcyBhcmUgcHJlc2VudCwgYW5kIHNldCB1cAotICogdGhlIGRpdmlzb3IgdGFibGUgZm9yIGVhY2ggb25lLgotICogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIERDVCBvZiBhbGwgY29tcG9uZW50cyBpcyBkb25lIGR1cmluZwotICogdGhlIGZpcnN0IHBhc3MsIGV2ZW4gaWYgb25seSBzb21lIGNvbXBvbmVudHMgd2lsbCBiZSBvdXRwdXQgaW4gdGhlCi0gKiBmaXJzdCBzY2FuLiAgSGVuY2UgYWxsIGNvbXBvbmVudHMgc2hvdWxkIGJlIGV4YW1pbmVkIGhlcmUuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9wYXNzX2ZkY3RtZ3IgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9mZGN0X3B0ciBmZGN0ID0gKG15X2ZkY3RfcHRyKSBjaW5mby0+ZmRjdDsKLSAgaW50IGNpLCBxdGJsbm8sIGk7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIEpRVUFOVF9UQkwgKiBxdGJsOwotICBEQ1RFTEVNICogZHRibDsKLQotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIHF0YmxubyA9IGNvbXBwdHItPnF1YW50X3RibF9ubzsKLSAgICAvKiBNYWtlIHN1cmUgc3BlY2lmaWVkIHF1YW50aXphdGlvbiB0YWJsZSBpcyBwcmVzZW50ICovCi0gICAgaWYgKHF0YmxubyA8IDAgfHwgcXRibG5vID49IE5VTV9RVUFOVF9UQkxTIHx8Ci0JY2luZm8tPnF1YW50X3RibF9wdHJzW3F0Ymxub10gPT0gTlVMTCkKLSAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX1FVQU5UX1RBQkxFLCBxdGJsbm8pOwotICAgIHF0YmwgPSBjaW5mby0+cXVhbnRfdGJsX3B0cnNbcXRibG5vXTsKLSAgICAvKiBDb21wdXRlIGRpdmlzb3JzIGZvciB0aGlzIHF1YW50IHRhYmxlICovCi0gICAgLyogV2UgbWF5IGRvIHRoaXMgbW9yZSB0aGFuIG9uY2UgZm9yIHNhbWUgdGFibGUsIGJ1dCBpdCdzIG5vdCBhIGJpZyBkZWFsICovCi0gICAgc3dpdGNoIChjaW5mby0+ZGN0X21ldGhvZCkgewotI2lmZGVmIERDVF9JU0xPV19TVVBQT1JURUQKLSAgICBjYXNlIEpEQ1RfSVNMT1c6Ci0gICAgICAvKiBGb3IgTEwmTSBJRENUIG1ldGhvZCwgZGl2aXNvcnMgYXJlIGVxdWFsIHRvIHJhdyBxdWFudGl6YXRpb24KLSAgICAgICAqIGNvZWZmaWNpZW50cyBtdWx0aXBsaWVkIGJ5IDggKHRvIGNvdW50ZXJhY3Qgc2NhbGluZykuCi0gICAgICAgKi8KLSAgICAgIGlmIChmZGN0LT5kaXZpc29yc1txdGJsbm9dID09IE5VTEwpIHsKLQlmZGN0LT5kaXZpc29yc1txdGJsbm9dID0gKERDVEVMRU0gKikKLQkgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICAgICAgRENUU0laRTIgKiBTSVpFT0YoRENURUxFTSkpOwotICAgICAgfQotICAgICAgZHRibCA9IGZkY3QtPmRpdmlzb3JzW3F0Ymxub107Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgewotCWR0YmxbaV0gPSAoKERDVEVMRU0pIHF0YmwtPnF1YW50dmFsW2ldKSA8PCAzOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECi0gICAgY2FzZSBKRENUX0lGQVNUOgotICAgICAgewotCS8qIEZvciBBQSZOIElEQ1QgbWV0aG9kLCBkaXZpc29ycyBhcmUgZXF1YWwgdG8gcXVhbnRpemF0aW9uCi0JICogY29lZmZpY2llbnRzIHNjYWxlZCBieSBzY2FsZWZhY3Rvcltyb3ddKnNjYWxlZmFjdG9yW2NvbF0sIHdoZXJlCi0JICogICBzY2FsZWZhY3RvclswXSA9IDEKLQkgKiAgIHNjYWxlZmFjdG9yW2tdID0gY29zKGsqUEkvMTYpICogc3FydCgyKSAgICBmb3Igaz0xLi43Ci0JICogV2UgYXBwbHkgYSBmdXJ0aGVyIHNjYWxlIGZhY3RvciBvZiA4LgotCSAqLwotI2RlZmluZSBDT05TVF9CSVRTIDE0Ci0Jc3RhdGljIGNvbnN0IElOVDE2IGFhbnNjYWxlc1tEQ1RTSVpFMl0gPSB7Ci0JICAvKiBwcmVjb21wdXRlZCB2YWx1ZXMgc2NhbGVkIHVwIGJ5IDE0IGJpdHMgKi8KLQkgIDE2Mzg0LCAyMjcyNSwgMjE0MDcsIDE5MjY2LCAxNjM4NCwgMTI4NzMsICA4ODY3LCAgNDUyMCwKLQkgIDIyNzI1LCAzMTUyMSwgMjk2OTIsIDI2NzIyLCAyMjcyNSwgMTc4NTUsIDEyMjk5LCAgNjI3MCwKLQkgIDIxNDA3LCAyOTY5MiwgMjc5NjksIDI1MTcyLCAyMTQwNywgMTY4MTksIDExNTg1LCAgNTkwNiwKLQkgIDE5MjY2LCAyNjcyMiwgMjUxNzIsIDIyNjU0LCAxOTI2NiwgMTUxMzcsIDEwNDI2LCAgNTMxNSwKLQkgIDE2Mzg0LCAyMjcyNSwgMjE0MDcsIDE5MjY2LCAxNjM4NCwgMTI4NzMsICA4ODY3LCAgNDUyMCwKLQkgIDEyODczLCAxNzg1NSwgMTY4MTksIDE1MTM3LCAxMjg3MywgMTAxMTQsICA2OTY3LCAgMzU1MiwKLQkgICA4ODY3LCAxMjI5OSwgMTE1ODUsIDEwNDI2LCAgODg2NywgIDY5NjcsICA0Nzk5LCAgMjQ0NiwKLQkgICA0NTIwLCAgNjI3MCwgIDU5MDYsICA1MzE1LCAgNDUyMCwgIDM1NTIsICAyNDQ2LCAgMTI0NwotCX07Ci0JU0hJRlRfVEVNUFMKLQotCWlmIChmZGN0LT5kaXZpc29yc1txdGJsbm9dID09IE5VTEwpIHsKLQkgIGZkY3QtPmRpdmlzb3JzW3F0Ymxub10gPSAoRENURUxFTSAqKQotCSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCQlEQ1RTSVpFMiAqIFNJWkVPRihEQ1RFTEVNKSk7Ci0JfQotCWR0YmwgPSBmZGN0LT5kaXZpc29yc1txdGJsbm9dOwotCWZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7Ci0JICBkdGJsW2ldID0gKERDVEVMRU0pCi0JICAgIERFU0NBTEUoTVVMVElQTFkxNlYxNigoSU5UMzIpIHF0YmwtPnF1YW50dmFsW2ldLAotCQkJCSAgKElOVDMyKSBhYW5zY2FsZXNbaV0pLAotCQkgICAgQ09OU1RfQklUUy0zKTsKLQl9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKLSAgICBjYXNlIEpEQ1RfRkxPQVQ6Ci0gICAgICB7Ci0JLyogRm9yIGZsb2F0IEFBJk4gSURDVCBtZXRob2QsIGRpdmlzb3JzIGFyZSBlcXVhbCB0byBxdWFudGl6YXRpb24KLQkgKiBjb2VmZmljaWVudHMgc2NhbGVkIGJ5IHNjYWxlZmFjdG9yW3Jvd10qc2NhbGVmYWN0b3JbY29sXSwgd2hlcmUKLQkgKiAgIHNjYWxlZmFjdG9yWzBdID0gMQotCSAqICAgc2NhbGVmYWN0b3Jba10gPSBjb3MoaypQSS8xNikgKiBzcXJ0KDIpICAgIGZvciBrPTEuLjcKLQkgKiBXZSBhcHBseSBhIGZ1cnRoZXIgc2NhbGUgZmFjdG9yIG9mIDguCi0JICogV2hhdCdzIGFjdHVhbGx5IHN0b3JlZCBpcyAxL2Rpdmlzb3Igc28gdGhhdCB0aGUgaW5uZXIgbG9vcCBjYW4KLQkgKiB1c2UgYSBtdWx0aXBsaWNhdGlvbiByYXRoZXIgdGhhbiBhIGRpdmlzaW9uLgotCSAqLwotCUZBU1RfRkxPQVQgKiBmZHRibDsKLQlpbnQgcm93LCBjb2w7Ci0Jc3RhdGljIGNvbnN0IGRvdWJsZSBhYW5zY2FsZWZhY3RvcltEQ1RTSVpFXSA9IHsKLQkgIDEuMCwgMS4zODcwMzk4NDUsIDEuMzA2NTYyOTY1LCAxLjE3NTg3NTYwMiwKLQkgIDEuMCwgMC43ODU2OTQ5NTgsIDAuNTQxMTk2MTAwLCAwLjI3NTg5OTM3OQotCX07Ci0KLQlpZiAoZmRjdC0+ZmxvYXRfZGl2aXNvcnNbcXRibG5vXSA9PSBOVUxMKSB7Ci0JICBmZGN0LT5mbG9hdF9kaXZpc29yc1txdGJsbm9dID0gKEZBU1RfRkxPQVQgKikKLQkgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkJRENUU0laRTIgKiBTSVpFT0YoRkFTVF9GTE9BVCkpOwotCX0KLQlmZHRibCA9IGZkY3QtPmZsb2F0X2Rpdmlzb3JzW3F0Ymxub107Ci0JaSA9IDA7Ci0JZm9yIChyb3cgPSAwOyByb3cgPCBEQ1RTSVpFOyByb3crKykgewotCSAgZm9yIChjb2wgPSAwOyBjb2wgPCBEQ1RTSVpFOyBjb2wrKykgewotCSAgICBmZHRibFtpXSA9IChGQVNUX0ZMT0FUKQotCSAgICAgICgxLjAgLyAoKChkb3VibGUpIHF0YmwtPnF1YW50dmFsW2ldICoKLQkJICAgICAgIGFhbnNjYWxlZmFjdG9yW3Jvd10gKiBhYW5zY2FsZWZhY3Rvcltjb2xdICogOC4wKSkpOwotCSAgICBpKys7Ci0JICB9Ci0JfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoKLSAqIFBlcmZvcm0gZm9yd2FyZCBEQ1Qgb24gb25lIG9yIG1vcmUgYmxvY2tzIG9mIGEgY29tcG9uZW50LgotICoKLSAqIFRoZSBpbnB1dCBzYW1wbGVzIGFyZSB0YWtlbiBmcm9tIHRoZSBzYW1wbGVfZGF0YVtdIGFycmF5IHN0YXJ0aW5nIGF0Ci0gKiBwb3NpdGlvbiBzdGFydF9yb3cvc3RhcnRfY29sLCBhbmQgbW92aW5nIHRvIHRoZSByaWdodCBmb3IgYW55IGFkZGl0aW9uYWwKLSAqIGJsb2Nrcy4gVGhlIHF1YW50aXplZCBjb2VmZmljaWVudHMgYXJlIHJldHVybmVkIGluIGNvZWZfYmxvY2tzW10uCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1mb3J3YXJkX0RDVCAoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSAgICAgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkJMT0NLUk9XIGNvZWZfYmxvY2tzLAotCSAgICAgSkRJTUVOU0lPTiBzdGFydF9yb3csIEpESU1FTlNJT04gc3RhcnRfY29sLAotCSAgICAgSkRJTUVOU0lPTiBudW1fYmxvY2tzKQotLyogVGhpcyB2ZXJzaW9uIGlzIHVzZWQgZm9yIGludGVnZXIgRENUIGltcGxlbWVudGF0aW9ucy4gKi8KLXsKLSAgLyogVGhpcyByb3V0aW5lIGlzIGhlYXZpbHkgdXNlZCwgc28gaXQncyB3b3J0aCBjb2RpbmcgaXQgdGlnaHRseS4gKi8KLSAgbXlfZmRjdF9wdHIgZmRjdCA9IChteV9mZGN0X3B0cikgY2luZm8tPmZkY3Q7Ci0gIGZvcndhcmRfRENUX21ldGhvZF9wdHIgZG9fZGN0ID0gZmRjdC0+ZG9fZGN0OwotICBEQ1RFTEVNICogZGl2aXNvcnMgPSBmZGN0LT5kaXZpc29yc1tjb21wcHRyLT5xdWFudF90Ymxfbm9dOwotICBEQ1RFTEVNIHdvcmtzcGFjZVtEQ1RTSVpFMl07CS8qIHdvcmsgYXJlYSBmb3IgRkRDVCBzdWJyb3V0aW5lICovCi0gIEpESU1FTlNJT04gYmk7Ci0KLSAgc2FtcGxlX2RhdGEgKz0gc3RhcnRfcm93OwkvKiBmb2xkIGluIHRoZSB2ZXJ0aWNhbCBvZmZzZXQgb25jZSAqLwotCi0gIGZvciAoYmkgPSAwOyBiaSA8IG51bV9ibG9ja3M7IGJpKyssIHN0YXJ0X2NvbCArPSBEQ1RTSVpFKSB7Ci0gICAgLyogTG9hZCBkYXRhIGludG8gd29ya3NwYWNlLCBhcHBseWluZyB1bnNpZ25lZC0+c2lnbmVkIGNvbnZlcnNpb24gKi8KLSAgICB7IHJlZ2lzdGVyIERDVEVMRU0gKndvcmtzcGFjZXB0cjsKLSAgICAgIHJlZ2lzdGVyIEpTQU1QUk9XIGVsZW1wdHI7Ci0gICAgICByZWdpc3RlciBpbnQgZWxlbXI7Ci0KLSAgICAgIHdvcmtzcGFjZXB0ciA9IHdvcmtzcGFjZTsKLSAgICAgIGZvciAoZWxlbXIgPSAwOyBlbGVtciA8IERDVFNJWkU7IGVsZW1yKyspIHsKLQllbGVtcHRyID0gc2FtcGxlX2RhdGFbZWxlbXJdICsgc3RhcnRfY29sOwotI2lmIERDVFNJWkUgPT0gOAkJLyogdW5yb2xsIHRoZSBpbm5lciBsb29wICovCi0JKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7Ci0JKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7Ci0JKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7Ci0JKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7Ci0JKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7Ci0JKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7Ci0JKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7Ci0JKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7Ci0jZWxzZQotCXsgcmVnaXN0ZXIgaW50IGVsZW1jOwotCSAgZm9yIChlbGVtYyA9IERDVFNJWkU7IGVsZW1jID4gMDsgZWxlbWMtLSkgewotCSAgICAqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKLQkgIH0KLQl9Ci0jZW5kaWYKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBQZXJmb3JtIHRoZSBEQ1QgKi8KLSAgICAoKmRvX2RjdCkgKHdvcmtzcGFjZSk7Ci0KLSAgICAvKiBRdWFudGl6ZS9kZXNjYWxlIHRoZSBjb2VmZmljaWVudHMsIGFuZCBzdG9yZSBpbnRvIGNvZWZfYmxvY2tzW10gKi8KLSAgICB7IHJlZ2lzdGVyIERDVEVMRU0gdGVtcCwgcXZhbDsKLSAgICAgIHJlZ2lzdGVyIGludCBpOwotICAgICAgcmVnaXN0ZXIgSkNPRUZQVFIgb3V0cHV0X3B0ciA9IGNvZWZfYmxvY2tzW2JpXTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKLQlxdmFsID0gZGl2aXNvcnNbaV07Ci0JdGVtcCA9IHdvcmtzcGFjZVtpXTsKLQkvKiBEaXZpZGUgdGhlIGNvZWZmaWNpZW50IHZhbHVlIGJ5IHF2YWwsIGVuc3VyaW5nIHByb3BlciByb3VuZGluZy4KLQkgKiBTaW5jZSBDIGRvZXMgbm90IHNwZWNpZnkgdGhlIGRpcmVjdGlvbiBvZiByb3VuZGluZyBmb3IgbmVnYXRpdmUKLQkgKiBxdW90aWVudHMsIHdlIGhhdmUgdG8gZm9yY2UgdGhlIGRpdmlkZW5kIHBvc2l0aXZlIGZvciBwb3J0YWJpbGl0eS4KLQkgKgotCSAqIEluIG1vc3QgZmlsZXMsIGF0IGxlYXN0IGhhbGYgb2YgdGhlIG91dHB1dCB2YWx1ZXMgd2lsbCBiZSB6ZXJvCi0JICogKGF0IGRlZmF1bHQgcXVhbnRpemF0aW9uIHNldHRpbmdzLCBtb3JlIGxpa2UgdGhyZWUtcXVhcnRlcnMuLi4pCi0JICogc28gd2Ugc2hvdWxkIGVuc3VyZSB0aGF0IHRoaXMgY2FzZSBpcyBmYXN0LiAgT24gbWFueSBtYWNoaW5lcywKLQkgKiBhIGNvbXBhcmlzb24gaXMgZW5vdWdoIGNoZWFwZXIgdGhhbiBhIGRpdmlkZSB0byBtYWtlIGEgc3BlY2lhbCB0ZXN0Ci0JICogYSB3aW4uICBTaW5jZSBib3RoIGlucHV0cyB3aWxsIGJlIG5vbm5lZ2F0aXZlLCB3ZSBuZWVkIG9ubHkgdGVzdAotCSAqIGZvciBhIDwgYiB0byBkaXNjb3ZlciB3aGV0aGVyIGEvYiBpcyAwLgotCSAqIElmIHlvdXIgbWFjaGluZSdzIGRpdmlzaW9uIGlzIGZhc3QgZW5vdWdoLCBkZWZpbmUgRkFTVF9ESVZJREUuCi0JICovCi0jaWZkZWYgRkFTVF9ESVZJREUKLSNkZWZpbmUgRElWSURFX0JZKGEsYikJYSAvPSBiCi0jZWxzZQotI2RlZmluZSBESVZJREVfQlkoYSxiKQlpZiAoYSA+PSBiKSBhIC89IGI7IGVsc2UgYSA9IDAKLSNlbmRpZgotCWlmICh0ZW1wIDwgMCkgewotCSAgdGVtcCA9IC10ZW1wOwotCSAgdGVtcCArPSBxdmFsPj4xOwkvKiBmb3Igcm91bmRpbmcgKi8KLQkgIERJVklERV9CWSh0ZW1wLCBxdmFsKTsKLQkgIHRlbXAgPSAtdGVtcDsKLQl9IGVsc2UgewotCSAgdGVtcCArPSBxdmFsPj4xOwkvKiBmb3Igcm91bmRpbmcgKi8KLQkgIERJVklERV9CWSh0ZW1wLCBxdmFsKTsKLQl9Ci0Jb3V0cHV0X3B0cltpXSA9IChKQ09FRikgdGVtcDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotCi0jaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAotCi1NRVRIT0RERUYodm9pZCkKLWZvcndhcmRfRENUX2Zsb2F0IChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JCSAgIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpCTE9DS1JPVyBjb2VmX2Jsb2NrcywKLQkJICAgSkRJTUVOU0lPTiBzdGFydF9yb3csIEpESU1FTlNJT04gc3RhcnRfY29sLAotCQkgICBKRElNRU5TSU9OIG51bV9ibG9ja3MpCi0vKiBUaGlzIHZlcnNpb24gaXMgdXNlZCBmb3IgZmxvYXRpbmctcG9pbnQgRENUIGltcGxlbWVudGF0aW9ucy4gKi8KLXsKLSAgLyogVGhpcyByb3V0aW5lIGlzIGhlYXZpbHkgdXNlZCwgc28gaXQncyB3b3J0aCBjb2RpbmcgaXQgdGlnaHRseS4gKi8KLSAgbXlfZmRjdF9wdHIgZmRjdCA9IChteV9mZGN0X3B0cikgY2luZm8tPmZkY3Q7Ci0gIGZsb2F0X0RDVF9tZXRob2RfcHRyIGRvX2RjdCA9IGZkY3QtPmRvX2Zsb2F0X2RjdDsKLSAgRkFTVF9GTE9BVCAqIGRpdmlzb3JzID0gZmRjdC0+ZmxvYXRfZGl2aXNvcnNbY29tcHB0ci0+cXVhbnRfdGJsX25vXTsKLSAgRkFTVF9GTE9BVCB3b3Jrc3BhY2VbRENUU0laRTJdOyAvKiB3b3JrIGFyZWEgZm9yIEZEQ1Qgc3Vicm91dGluZSAqLwotICBKRElNRU5TSU9OIGJpOwotCi0gIHNhbXBsZV9kYXRhICs9IHN0YXJ0X3JvdzsJLyogZm9sZCBpbiB0aGUgdmVydGljYWwgb2Zmc2V0IG9uY2UgKi8KLQotICBmb3IgKGJpID0gMDsgYmkgPCBudW1fYmxvY2tzOyBiaSsrLCBzdGFydF9jb2wgKz0gRENUU0laRSkgewotICAgIC8qIExvYWQgZGF0YSBpbnRvIHdvcmtzcGFjZSwgYXBwbHlpbmcgdW5zaWduZWQtPnNpZ25lZCBjb252ZXJzaW9uICovCi0gICAgeyByZWdpc3RlciBGQVNUX0ZMT0FUICp3b3Jrc3BhY2VwdHI7Ci0gICAgICByZWdpc3RlciBKU0FNUFJPVyBlbGVtcHRyOwotICAgICAgcmVnaXN0ZXIgaW50IGVsZW1yOwotCi0gICAgICB3b3Jrc3BhY2VwdHIgPSB3b3Jrc3BhY2U7Ci0gICAgICBmb3IgKGVsZW1yID0gMDsgZWxlbXIgPCBEQ1RTSVpFOyBlbGVtcisrKSB7Ci0JZWxlbXB0ciA9IHNhbXBsZV9kYXRhW2VsZW1yXSArIHN0YXJ0X2NvbDsKLSNpZiBEQ1RTSVpFID09IDgJCS8qIHVucm9sbCB0aGUgaW5uZXIgbG9vcCAqLwotCSp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7Ci0JKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKLQkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOwotCSp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7Ci0JKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKLQkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOwotCSp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7Ci0JKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKLSNlbHNlCi0JeyByZWdpc3RlciBpbnQgZWxlbWM7Ci0JICBmb3IgKGVsZW1jID0gRENUU0laRTsgZWxlbWMgPiAwOyBlbGVtYy0tKSB7Ci0JICAgICp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKQotCSAgICAgIChHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7Ci0JICB9Ci0JfQotI2VuZGlmCi0gICAgICB9Ci0gICAgfQotCi0gICAgLyogUGVyZm9ybSB0aGUgRENUICovCi0gICAgKCpkb19kY3QpICh3b3Jrc3BhY2UpOwotCi0gICAgLyogUXVhbnRpemUvZGVzY2FsZSB0aGUgY29lZmZpY2llbnRzLCBhbmQgc3RvcmUgaW50byBjb2VmX2Jsb2Nrc1tdICovCi0gICAgeyByZWdpc3RlciBGQVNUX0ZMT0FUIHRlbXA7Ci0gICAgICByZWdpc3RlciBpbnQgaTsKLSAgICAgIHJlZ2lzdGVyIEpDT0VGUFRSIG91dHB1dF9wdHIgPSBjb2VmX2Jsb2Nrc1tiaV07Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7Ci0JLyogQXBwbHkgdGhlIHF1YW50aXphdGlvbiBhbmQgc2NhbGluZyBmYWN0b3IgKi8KLQl0ZW1wID0gd29ya3NwYWNlW2ldICogZGl2aXNvcnNbaV07Ci0JLyogUm91bmQgdG8gbmVhcmVzdCBpbnRlZ2VyLgotCSAqIFNpbmNlIEMgZG9lcyBub3Qgc3BlY2lmeSB0aGUgZGlyZWN0aW9uIG9mIHJvdW5kaW5nIGZvciBuZWdhdGl2ZQotCSAqIHF1b3RpZW50cywgd2UgaGF2ZSB0byBmb3JjZSB0aGUgZGl2aWRlbmQgcG9zaXRpdmUgZm9yIHBvcnRhYmlsaXR5LgotCSAqIFRoZSBtYXhpbXVtIGNvZWZmaWNpZW50IHNpemUgaXMgKy0xNksgKGZvciAxMi1iaXQgZGF0YSksIHNvIHRoaXMKLQkgKiBjb2RlIHNob3VsZCB3b3JrIGZvciBlaXRoZXIgMTYtYml0IG9yIDMyLWJpdCBpbnRzLgotCSAqLwotCW91dHB1dF9wdHJbaV0gPSAoSkNPRUYpICgoaW50KSAodGVtcCArIChGQVNUX0ZMT0FUKSAxNjM4NC41KSAtIDE2Mzg0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotI2VuZGlmIC8qIERDVF9GTE9BVF9TVVBQT1JURUQgKi8KLQotCi0vKgotICogSW5pdGlhbGl6ZSBGRENUIG1hbmFnZXIuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9mb3J3YXJkX2RjdCAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2ZkY3RfcHRyIGZkY3Q7Ci0gIGludCBpOwotCi0gIGZkY3QgPSAobXlfZmRjdF9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfZmRjdF9jb250cm9sbGVyKSk7Ci0gIGNpbmZvLT5mZGN0ID0gKHN0cnVjdCBqcGVnX2ZvcndhcmRfZGN0ICopIGZkY3Q7Ci0gIGZkY3QtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19mZGN0bWdyOwotCi0gIHN3aXRjaCAoY2luZm8tPmRjdF9tZXRob2QpIHsKLSNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECi0gIGNhc2UgSkRDVF9JU0xPVzoKLSAgICBmZGN0LT5wdWIuZm9yd2FyZF9EQ1QgPSBmb3J3YXJkX0RDVDsKLSAgICBmZGN0LT5kb19kY3QgPSBqcGVnX2ZkY3RfaXNsb3c7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECi0gIGNhc2UgSkRDVF9JRkFTVDoKLSAgICBmZGN0LT5wdWIuZm9yd2FyZF9EQ1QgPSBmb3J3YXJkX0RDVDsKLSAgICBmZGN0LT5kb19kY3QgPSBqcGVnX2ZkY3RfaWZhc3Q7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECi0gIGNhc2UgSkRDVF9GTE9BVDoKLSAgICBmZGN0LT5wdWIuZm9yd2FyZF9EQ1QgPSBmb3J3YXJkX0RDVF9mbG9hdDsKLSAgICBmZGN0LT5kb19mbG9hdF9kY3QgPSBqcGVnX2ZkY3RfZmxvYXQ7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICAvKiBNYXJrIGRpdmlzb3IgdGFibGVzIHVuYWxsb2NhdGVkICovCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fUVVBTlRfVEJMUzsgaSsrKSB7Ci0gICAgZmRjdC0+ZGl2aXNvcnNbaV0gPSBOVUxMOwotI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKLSAgICBmZGN0LT5mbG9hdF9kaXZpc29yc1tpXSA9IE5VTEw7Ci0jZW5kaWYKLSAgfQotfQotCi0jZW5kaWYgLy9fRlhfSlBFR19UVVJCT18KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjaHVmZi5jIGIvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNodWZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNjVhYTIuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNodWZmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MTUgKzAsMCBAQAotI2lmICFkZWZpbmVkKF9GWF9KUEVHX1RVUkJPXykKLS8qCi0gKiBqY2h1ZmYuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIEh1ZmZtYW4gZW50cm9weSBlbmNvZGluZyByb3V0aW5lcy4KLSAqCi0gKiBNdWNoIG9mIHRoZSBjb21wbGV4aXR5IGhlcmUgaGFzIHRvIGRvIHdpdGggc3VwcG9ydGluZyBvdXRwdXQgc3VzcGVuc2lvbi4KLSAqIElmIHRoZSBkYXRhIGRlc3RpbmF0aW9uIG1vZHVsZSBkZW1hbmRzIHN1c3BlbnNpb24sIHdlIHdhbnQgdG8gYmUgYWJsZSB0bwotICogYmFjayB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgTUNVLiAgVG8gZG8gdGhpcywgd2UgY29weSBzdGF0ZQotICogdmFyaWFibGVzIGludG8gbG9jYWwgd29ya2luZyBzdG9yYWdlLCBhbmQgdXBkYXRlIHRoZW0gYmFjayB0byB0aGUKLSAqIHBlcm1hbmVudCBKUEVHIG9iamVjdHMgb25seSB1cG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiBhbiBNQ1UuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImpjaHVmZi5oIgkJLyogRGVjbGFyYXRpb25zIHNoYXJlZCB3aXRoIGpjcGh1ZmYuYyAqLwotCi0jaWZkZWYgX0ZYX01BTkFHRURfQ09ERV8KLSNkZWZpbmUgc2F2YWJsZV9zdGF0ZQlzYXZhYmxlX3N0YXRlX2MKLSNlbmRpZgotCi0vKiBFeHBhbmRlZCBlbnRyb3B5IGVuY29kZXIgb2JqZWN0IGZvciBIdWZmbWFuIGVuY29kaW5nLgotICoKLSAqIFRoZSBzYXZhYmxlX3N0YXRlIHN1YnJlY29yZCBjb250YWlucyBmaWVsZHMgdGhhdCBjaGFuZ2Ugd2l0aGluIGFuIE1DVSwKLSAqIGJ1dCBtdXN0IG5vdCBiZSB1cGRhdGVkIHBlcm1hbmVudGx5IHVudGlsIHdlIGNvbXBsZXRlIHRoZSBNQ1UuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBJTlQzMiBwdXRfYnVmZmVyOwkJLyogY3VycmVudCBiaXQtYWNjdW11bGF0aW9uIGJ1ZmZlciAqLwotICBpbnQgcHV0X2JpdHM7CQkJLyogIyBvZiBiaXRzIG5vdyBpbiBpdCAqLwotICBpbnQgbGFzdF9kY192YWxbTUFYX0NPTVBTX0lOX1NDQU5dOyAvKiBsYXN0IERDIGNvZWYgZm9yIGVhY2ggY29tcG9uZW50ICovCi19IHNhdmFibGVfc3RhdGU7Ci0KLS8qIFRoaXMgbWFjcm8gaXMgdG8gd29yayBhcm91bmQgY29tcGlsZXJzIHdpdGggbWlzc2luZyBvciBicm9rZW4KLSAqIHN0cnVjdHVyZSBhc3NpZ25tZW50LiAgWW91J2xsIG5lZWQgdG8gZml4IHRoaXMgY29kZSBpZiB5b3UgaGF2ZQotICogc3VjaCBhIGNvbXBpbGVyIGFuZCB5b3UgY2hhbmdlIE1BWF9DT01QU19JTl9TQ0FOLgotICovCi0KLSNpZm5kZWYgTk9fU1RSVUNUX0FTU0lHTgotI2RlZmluZSBBU1NJR05fU1RBVEUoZGVzdCxzcmMpICAoKGRlc3QpID0gKHNyYykpCi0jZWxzZQotI2lmIE1BWF9DT01QU19JTl9TQ0FOID09IDQKLSNkZWZpbmUgQVNTSUdOX1NUQVRFKGRlc3Qsc3JjKSAgXAotCSgoZGVzdCkucHV0X2J1ZmZlciA9IChzcmMpLnB1dF9idWZmZXIsIFwKLQkgKGRlc3QpLnB1dF9iaXRzID0gKHNyYykucHV0X2JpdHMsIFwKLQkgKGRlc3QpLmxhc3RfZGNfdmFsWzBdID0gKHNyYykubGFzdF9kY192YWxbMF0sIFwKLQkgKGRlc3QpLmxhc3RfZGNfdmFsWzFdID0gKHNyYykubGFzdF9kY192YWxbMV0sIFwKLQkgKGRlc3QpLmxhc3RfZGNfdmFsWzJdID0gKHNyYykubGFzdF9kY192YWxbMl0sIFwKLQkgKGRlc3QpLmxhc3RfZGNfdmFsWzNdID0gKHNyYykubGFzdF9kY192YWxbM10pCi0jZW5kaWYKLSNlbmRpZgotCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGpwZWdfZW50cm9weV9lbmNvZGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIHNhdmFibGVfc3RhdGUgc2F2ZWQ7CQkvKiBCaXQgYnVmZmVyICYgREMgc3RhdGUgYXQgc3RhcnQgb2YgTUNVICovCi0KLSAgLyogVGhlc2UgZmllbGRzIGFyZSBOT1QgbG9hZGVkIGludG8gbG9jYWwgd29ya2luZyBzdGF0ZS4gKi8KLSAgdW5zaWduZWQgaW50IHJlc3RhcnRzX3RvX2dvOwkvKiBNQ1VzIGxlZnQgaW4gdGhpcyByZXN0YXJ0IGludGVydmFsICovCi0gIGludCBuZXh0X3Jlc3RhcnRfbnVtOwkJLyogbmV4dCByZXN0YXJ0IG51bWJlciB0byB3cml0ZSAoMC03KSAqLwotCi0gIC8qIFBvaW50ZXJzIHRvIGRlcml2ZWQgdGFibGVzICh0aGVzZSB3b3Jrc3BhY2VzIGhhdmUgaW1hZ2UgbGlmZXNwYW4pICovCi0gIGNfZGVyaXZlZF90YmwgKiBkY19kZXJpdmVkX3RibHNbTlVNX0hVRkZfVEJMU107Ci0gIGNfZGVyaXZlZF90YmwgKiBhY19kZXJpdmVkX3RibHNbTlVNX0hVRkZfVEJMU107Ci0KLSNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQJLyogU3RhdGlzdGljcyB0YWJsZXMgZm9yIG9wdGltaXphdGlvbiAqLwotICBsb25nICogZGNfY291bnRfcHRyc1tOVU1fSFVGRl9UQkxTXTsKLSAgbG9uZyAqIGFjX2NvdW50X3B0cnNbTlVNX0hVRkZfVEJMU107Ci0jZW5kaWYKLX0gaHVmZl9lbnRyb3B5X2VuY29kZXI7Ci0KLXR5cGVkZWYgaHVmZl9lbnRyb3B5X2VuY29kZXIgKiBodWZmX2VudHJvcHlfcHRyOwotCi0vKiBXb3JraW5nIHN0YXRlIHdoaWxlIHdyaXRpbmcgYW4gTUNVLgotICogVGhpcyBzdHJ1Y3QgY29udGFpbnMgYWxsIHRoZSBmaWVsZHMgdGhhdCBhcmUgbmVlZGVkIGJ5IHN1YnJvdXRpbmVzLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgSk9DVEVUICogbmV4dF9vdXRwdXRfYnl0ZTsJLyogPT4gbmV4dCBieXRlIHRvIHdyaXRlIGluIGJ1ZmZlciAqLwotICBzaXplX3QgZnJlZV9pbl9idWZmZXI7CS8qICMgb2YgYnl0ZSBzcGFjZXMgcmVtYWluaW5nIGluIGJ1ZmZlciAqLwotICBzYXZhYmxlX3N0YXRlIGN1cjsJCS8qIEN1cnJlbnQgYml0IGJ1ZmZlciAmIERDIHN0YXRlICovCi0gIGpfY29tcHJlc3NfcHRyIGNpbmZvOwkJLyogZHVtcF9idWZmZXIgbmVlZHMgYWNjZXNzIHRvIHRoaXMgKi8KLX0gd29ya2luZ19zdGF0ZTsKLQotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotTUVUSE9EREVGKGJvb2xlYW4pIGVuY29kZV9tY3VfaHVmZiBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQlKQkxPQ0tST1cgKk1DVV9kYXRhKSk7Ci1NRVRIT0RERUYodm9pZCkgZmluaXNoX3Bhc3NfaHVmZiBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0jaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECi1NRVRIT0RERUYoYm9vbGVhbikgZW5jb2RlX21jdV9nYXRoZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7Ci1NRVRIT0RERUYodm9pZCkgZmluaXNoX3Bhc3NfZ2F0aGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLSNlbmRpZgotCi0KLS8qCi0gKiBJbml0aWFsaXplIGZvciBhIEh1ZmZtYW4tY29tcHJlc3NlZCBzY2FuLgotICogSWYgZ2F0aGVyX3N0YXRpc3RpY3MgaXMgVFJVRSwgd2UgZG8gbm90IG91dHB1dCBhbnl0aGluZyBkdXJpbmcgdGhlIHNjYW4sCi0gKiBqdXN0IGNvdW50IHRoZSBIdWZmbWFuIHN5bWJvbHMgdXNlZCBhbmQgZ2VuZXJhdGUgSHVmZm1hbiBjb2RlIHRhYmxlcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfaHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gZ2F0aGVyX3N0YXRpc3RpY3MpCi17Ci0gIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgaW50IGNpLCBkY3RibCwgYWN0Ymw7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotCi0gIGlmIChnYXRoZXJfc3RhdGlzdGljcykgewotI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAotICAgIGVudHJvcHktPnB1Yi5lbmNvZGVfbWN1ID0gZW5jb2RlX21jdV9nYXRoZXI7Ci0gICAgZW50cm9weS0+cHViLmZpbmlzaF9wYXNzID0gZmluaXNoX3Bhc3NfZ2F0aGVyOwotI2Vsc2UKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0jZW5kaWYKLSAgfSBlbHNlIHsKLSAgICBlbnRyb3B5LT5wdWIuZW5jb2RlX21jdSA9IGVuY29kZV9tY3VfaHVmZjsKLSAgICBlbnRyb3B5LT5wdWIuZmluaXNoX3Bhc3MgPSBmaW5pc2hfcGFzc19odWZmOwotICB9Ci0KLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIGRjdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOwotICAgIGFjdGJsID0gY29tcHB0ci0+YWNfdGJsX25vOwotICAgIGlmIChnYXRoZXJfc3RhdGlzdGljcykgewotI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAotICAgICAgLyogQ2hlY2sgZm9yIGludmFsaWQgdGFibGUgaW5kZXhlcyAqLwotICAgICAgLyogKG1ha2VfY19kZXJpdmVkX3RibCBkb2VzIHRoaXMgaW4gdGhlIG90aGVyIHBhdGgpICovCi0gICAgICBpZiAoZGN0YmwgPCAwIHx8IGRjdGJsID49IE5VTV9IVUZGX1RCTFMpCi0JRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fSFVGRl9UQUJMRSwgZGN0YmwpOwotICAgICAgaWYgKGFjdGJsIDwgMCB8fCBhY3RibCA+PSBOVU1fSFVGRl9UQkxTKQotCUVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIGFjdGJsKTsKLSAgICAgIC8qIEFsbG9jYXRlIGFuZCB6ZXJvIHRoZSBzdGF0aXN0aWNzIHRhYmxlcyAqLwotICAgICAgLyogTm90ZSB0aGF0IGpwZWdfZ2VuX29wdGltYWxfdGFibGUgZXhwZWN0cyAyNTcgZW50cmllcyBpbiBlYWNoIHRhYmxlISAqLwotICAgICAgaWYgKGVudHJvcHktPmRjX2NvdW50X3B0cnNbZGN0YmxdID09IE5VTEwpCi0JZW50cm9weS0+ZGNfY291bnRfcHRyc1tkY3RibF0gPSAobG9uZyAqKQotCSAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgICAgICAyNTcgKiBTSVpFT0YobG9uZykpOwotICAgICAgTUVNWkVSTyhlbnRyb3B5LT5kY19jb3VudF9wdHJzW2RjdGJsXSwgMjU3ICogU0laRU9GKGxvbmcpKTsKLSAgICAgIGlmIChlbnRyb3B5LT5hY19jb3VudF9wdHJzW2FjdGJsXSA9PSBOVUxMKQotCWVudHJvcHktPmFjX2NvdW50X3B0cnNbYWN0YmxdID0gKGxvbmcgKikKLQkgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICAgICAgMjU3ICogU0laRU9GKGxvbmcpKTsKLSAgICAgIE1FTVpFUk8oZW50cm9weS0+YWNfY291bnRfcHRyc1thY3RibF0sIDI1NyAqIFNJWkVPRihsb25nKSk7Ci0jZW5kaWYKLSAgICB9IGVsc2UgewotICAgICAgLyogQ29tcHV0ZSBkZXJpdmVkIHZhbHVlcyBmb3IgSHVmZm1hbiB0YWJsZXMgKi8KLSAgICAgIC8qIFdlIG1heSBkbyB0aGlzIG1vcmUgdGhhbiBvbmNlIGZvciBhIHRhYmxlLCBidXQgaXQncyBub3QgZXhwZW5zaXZlICovCi0gICAgICBqcGVnX21ha2VfY19kZXJpdmVkX3RibChjaW5mbywgVFJVRSwgZGN0YmwsCi0JCQkgICAgICAmIGVudHJvcHktPmRjX2Rlcml2ZWRfdGJsc1tkY3RibF0pOwotICAgICAganBlZ19tYWtlX2NfZGVyaXZlZF90YmwoY2luZm8sIEZBTFNFLCBhY3RibCwKLQkJCSAgICAgICYgZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2FjdGJsXSk7Ci0gICAgfQotICAgIC8qIEluaXRpYWxpemUgREMgcHJlZGljdGlvbnMgdG8gMCAqLwotICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IDA7Ci0gIH0KLQotICAvKiBJbml0aWFsaXplIGJpdCBidWZmZXIgdG8gZW1wdHkgKi8KLSAgZW50cm9weS0+c2F2ZWQucHV0X2J1ZmZlciA9IDA7Ci0gIGVudHJvcHktPnNhdmVkLnB1dF9iaXRzID0gMDsKLQotICAvKiBJbml0aWFsaXplIHJlc3RhcnQgc3R1ZmYgKi8KLSAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKLSAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSA9IDA7Ci19Ci0KLQotLyoKLSAqIENvbXB1dGUgdGhlIGRlcml2ZWQgdmFsdWVzIGZvciBhIEh1ZmZtYW4gdGFibGUuCi0gKiBUaGlzIHJvdXRpbmUgYWxzbyBwZXJmb3JtcyBzb21lIHZhbGlkYXRpb24gY2hlY2tzIG9uIHRoZSB0YWJsZS4KLSAqCi0gKiBOb3RlIHRoaXMgaXMgYWxzbyB1c2VkIGJ5IGpjcGh1ZmYuYy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfbWFrZV9jX2Rlcml2ZWRfdGJsIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBpc0RDLCBpbnQgdGJsbm8sCi0JCQkgY19kZXJpdmVkX3RibCAqKiBwZHRibCkKLXsKLSAgSkhVRkZfVEJMICpodGJsOwotICBjX2Rlcml2ZWRfdGJsICpkdGJsOwotICBpbnQgcCwgaSwgbCwgbGFzdHAsIF9zaSwgbWF4c3ltYm9sOwotICBjaGFyIGh1ZmZzaXplWzI1N107Ci0gIHVuc2lnbmVkIGludCBodWZmY29kZVsyNTddOwotICB1bnNpZ25lZCBpbnQgY29kZTsKLQotICAvKiBOb3RlIHRoYXQgaHVmZnNpemVbXSBhbmQgaHVmZmNvZGVbXSBhcmUgZmlsbGVkIGluIGNvZGUtbGVuZ3RoIG9yZGVyLAotICAgKiBwYXJhbGxlbGluZyB0aGUgb3JkZXIgb2YgdGhlIHN5bWJvbHMgdGhlbXNlbHZlcyBpbiBodGJsLT5odWZmdmFsW10uCi0gICAqLwotCi0gIC8qIEZpbmQgdGhlIGlucHV0IEh1ZmZtYW4gdGFibGUgKi8KLSAgaWYgKHRibG5vIDwgMCB8fCB0YmxubyA+PSBOVU1fSFVGRl9UQkxTKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIHRibG5vKTsKLSAgaHRibCA9Ci0gICAgaXNEQyA/IGNpbmZvLT5kY19odWZmX3RibF9wdHJzW3RibG5vXSA6IGNpbmZvLT5hY19odWZmX3RibF9wdHJzW3RibG5vXTsKLSAgaWYgKGh0YmwgPT0gTlVMTCkKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9OT19IVUZGX1RBQkxFLCB0Ymxubyk7Ci0KLSAgLyogQWxsb2NhdGUgYSB3b3Jrc3BhY2UgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGRvbmUgc28uICovCi0gIGlmICgqcGR0YmwgPT0gTlVMTCkKLSAgICAqcGR0YmwgPSAoY19kZXJpdmVkX3RibCAqKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgIFNJWkVPRihjX2Rlcml2ZWRfdGJsKSk7Ci0gIGR0YmwgPSAqcGR0Ymw7Ci0gIAotICAvKiBGaWd1cmUgQy4xOiBtYWtlIHRhYmxlIG9mIEh1ZmZtYW4gY29kZSBsZW5ndGggZm9yIGVhY2ggc3ltYm9sICovCi0KLSAgcCA9IDA7Ci0gIGZvciAobCA9IDE7IGwgPD0gMTY7IGwrKykgewotICAgIGkgPSAoaW50KSBodGJsLT5iaXRzW2xdOwotICAgIGlmIChpIDwgMCB8fCBwICsgaSA+IDI1NikJLyogcHJvdGVjdCBhZ2FpbnN0IHRhYmxlIG92ZXJydW4gKi8KLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0hVRkZfVEFCTEUpOwotICAgIHdoaWxlIChpLS0pCi0gICAgICBodWZmc2l6ZVtwKytdID0gKGNoYXIpIGw7Ci0gIH0KLSAgaHVmZnNpemVbcF0gPSAwOwotICBsYXN0cCA9IHA7Ci0gIAotICAvKiBGaWd1cmUgQy4yOiBnZW5lcmF0ZSB0aGUgY29kZXMgdGhlbXNlbHZlcyAqLwotICAvKiBXZSBhbHNvIHZhbGlkYXRlIHRoYXQgdGhlIGNvdW50cyByZXByZXNlbnQgYSBsZWdhbCBIdWZmbWFuIGNvZGUgdHJlZS4gKi8KLQotICBjb2RlID0gMDsKLSAgX3NpID0gaHVmZnNpemVbMF07Ci0gIHAgPSAwOwotICB3aGlsZSAoaHVmZnNpemVbcF0pIHsKLSAgICB3aGlsZSAoKChpbnQpIGh1ZmZzaXplW3BdKSA9PSBfc2kpIHsKLSAgICAgIGh1ZmZjb2RlW3ArK10gPSBjb2RlOwotICAgICAgY29kZSsrOwotICAgIH0KLSAgICAvKiBjb2RlIGlzIG5vdyAxIG1vcmUgdGhhbiB0aGUgbGFzdCBjb2RlIHVzZWQgZm9yIGNvZGVsZW5ndGggc2k7IGJ1dAotICAgICAqIGl0IG11c3Qgc3RpbGwgZml0IGluIHNpIGJpdHMsIHNpbmNlIG5vIGNvZGUgaXMgYWxsb3dlZCB0byBiZSBhbGwgb25lcy4KLSAgICAgKi8KLSAgICBpZiAoKChJTlQzMikgY29kZSkgPj0gKCgoSU5UMzIpIDEpIDw8IF9zaSkpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKLSAgICBjb2RlIDw8PSAxOwotICAgIF9zaSsrOwotICB9Ci0gIAotICAvKiBGaWd1cmUgQy4zOiBnZW5lcmF0ZSBlbmNvZGluZyB0YWJsZXMgKi8KLSAgLyogVGhlc2UgYXJlIGNvZGUgYW5kIHNpemUgaW5kZXhlZCBieSBzeW1ib2wgdmFsdWUgKi8KLQotICAvKiBTZXQgYWxsIGNvZGVsZXNzIHN5bWJvbHMgdG8gaGF2ZSBjb2RlIGxlbmd0aCAwOwotICAgKiB0aGlzIGxldHMgdXMgZGV0ZWN0IGR1cGxpY2F0ZSBWQUwgZW50cmllcyBoZXJlLCBhbmQgbGF0ZXIKLSAgICogYWxsb3dzIGVtaXRfYml0cyB0byBkZXRlY3QgYW55IGF0dGVtcHQgdG8gZW1pdCBzdWNoIHN5bWJvbHMuCi0gICAqLwotICBNRU1aRVJPKGR0YmwtPmVodWZzaSwgU0laRU9GKGR0YmwtPmVodWZzaSkpOwotCi0gIC8qIFRoaXMgaXMgYWxzbyBhIGNvbnZlbmllbnQgcGxhY2UgdG8gY2hlY2sgZm9yIG91dC1vZi1yYW5nZQotICAgKiBhbmQgZHVwbGljYXRlZCBWQUwgZW50cmllcy4gIFdlIGFsbG93IDAuLjI1NSBmb3IgQUMgc3ltYm9scwotICAgKiBidXQgb25seSAwLi4xNSBmb3IgREMuICAoV2UgY291bGQgY29uc3RyYWluIHRoZW0gZnVydGhlcgotICAgKiBiYXNlZCBvbiBkYXRhIGRlcHRoIGFuZCBtb2RlLCBidXQgdGhpcyBzZWVtcyBlbm91Z2guKQotICAgKi8KLSAgbWF4c3ltYm9sID0gaXNEQyA/IDE1IDogMjU1OwotCi0gIGZvciAocCA9IDA7IHAgPCBsYXN0cDsgcCsrKSB7Ci0gICAgaSA9IGh0YmwtPmh1ZmZ2YWxbcF07Ci0gICAgaWYgKGkgPCAwIHx8IGkgPiBtYXhzeW1ib2wgfHwgZHRibC0+ZWh1ZnNpW2ldKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSFVGRl9UQUJMRSk7Ci0gICAgZHRibC0+ZWh1ZmNvW2ldID0gaHVmZmNvZGVbcF07Ci0gICAgZHRibC0+ZWh1ZnNpW2ldID0gaHVmZnNpemVbcF07Ci0gIH0KLX0KLQotCi0vKiBPdXRwdXR0aW5nIGJ5dGVzIHRvIHRoZSBmaWxlICovCi0KLS8qIEVtaXQgYSBieXRlLCB0YWtpbmcgJ2FjdGlvbicgaWYgbXVzdCBzdXNwZW5kLiAqLwotI2RlZmluZSBlbWl0X2J5dGUoc3RhdGUsdmFsLGFjdGlvbikgIFwKLQl7ICooc3RhdGUpLT5uZXh0X291dHB1dF9ieXRlKysgPSAoSk9DVEVUKSAodmFsKTsgIFwKLQkgIGlmICgtLShzdGF0ZSktPmZyZWVfaW5fYnVmZmVyID09IDApICBcCi0JICAgIGlmICghIGR1bXBfYnVmZmVyKHN0YXRlKSkgIFwKLQkgICAgICB7IGFjdGlvbjsgfSB9Ci0KLQotTE9DQUwoYm9vbGVhbikKLWR1bXBfYnVmZmVyICh3b3JraW5nX3N0YXRlICogc3RhdGUpCi0vKiBFbXB0eSB0aGUgb3V0cHV0IGJ1ZmZlcjsgcmV0dXJuIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgRkFMU0UgaWYgbXVzdCBzdXNwZW5kICovCi17Ci0gIHN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21nciAqIGRlc3QgPSBzdGF0ZS0+Y2luZm8tPmRlc3Q7Ci0KLSAgaWYgKCEgKCpkZXN0LT5lbXB0eV9vdXRwdXRfYnVmZmVyKSAoc3RhdGUtPmNpbmZvKSkKLSAgICByZXR1cm4gRkFMU0U7Ci0gIC8qIEFmdGVyIGEgc3VjY2Vzc2Z1bCBidWZmZXIgZHVtcCwgbXVzdCByZXNldCBidWZmZXIgcG9pbnRlcnMgKi8KLSAgc3RhdGUtPm5leHRfb3V0cHV0X2J5dGUgPSBkZXN0LT5uZXh0X291dHB1dF9ieXRlOwotICBzdGF0ZS0+ZnJlZV9pbl9idWZmZXIgPSBkZXN0LT5mcmVlX2luX2J1ZmZlcjsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyogT3V0cHV0dGluZyBiaXRzIHRvIHRoZSBmaWxlICovCi0KLS8qIE9ubHkgdGhlIHJpZ2h0IDI0IGJpdHMgb2YgcHV0X2J1ZmZlciBhcmUgdXNlZDsgdGhlIHZhbGlkIGJpdHMgYXJlCi0gKiBsZWZ0LWp1c3RpZmllZCBpbiB0aGlzIHBhcnQuICBBdCBtb3N0IDE2IGJpdHMgY2FuIGJlIHBhc3NlZCB0byBlbWl0X2JpdHMKLSAqIGluIG9uZSBjYWxsLCBhbmQgd2UgbmV2ZXIgcmV0YWluIG1vcmUgdGhhbiA3IGJpdHMgaW4gcHV0X2J1ZmZlcgotICogYmV0d2VlbiBjYWxscywgc28gMjQgYml0cyBhcmUgc3VmZmljaWVudC4KLSAqLwotCi1JTkxJTkUKLUxPQ0FMKGJvb2xlYW4pCi1lbWl0X2JpdHMgKHdvcmtpbmdfc3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQgaW50IGNvZGUsIGludCBzaXplKQotLyogRW1pdCBzb21lIGJpdHM7IHJldHVybiBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIGlmIG11c3Qgc3VzcGVuZCAqLwotewotICAvKiBUaGlzIHJvdXRpbmUgaXMgaGVhdmlseSB1c2VkLCBzbyBpdCdzIHdvcnRoIGNvZGluZyB0aWdodGx5LiAqLwotICByZWdpc3RlciBJTlQzMiBwdXRfYnVmZmVyID0gKElOVDMyKSBjb2RlOwotICByZWdpc3RlciBpbnQgcHV0X2JpdHMgPSBzdGF0ZS0+Y3VyLnB1dF9iaXRzOwotCi0gIC8qIGlmIHNpemUgaXMgMCwgY2FsbGVyIHVzZWQgYW4gaW52YWxpZCBIdWZmbWFuIHRhYmxlIGVudHJ5ICovCi0gIGlmIChzaXplID09IDApCi0gICAgRVJSRVhJVChzdGF0ZS0+Y2luZm8sIEpFUlJfSFVGRl9NSVNTSU5HX0NPREUpOwotCi0gIHB1dF9idWZmZXIgJj0gKCgoSU5UMzIpIDEpPDxzaXplKSAtIDE7IC8qIG1hc2sgb2ZmIGFueSBleHRyYSBiaXRzIGluIGNvZGUgKi8KLSAgCi0gIHB1dF9iaXRzICs9IHNpemU7CQkvKiBuZXcgbnVtYmVyIG9mIGJpdHMgaW4gYnVmZmVyICovCi0gIAotICBwdXRfYnVmZmVyIDw8PSAyNCAtIHB1dF9iaXRzOyAvKiBhbGlnbiBpbmNvbWluZyBiaXRzICovCi0KLSAgcHV0X2J1ZmZlciB8PSBzdGF0ZS0+Y3VyLnB1dF9idWZmZXI7IC8qIGFuZCBtZXJnZSB3aXRoIG9sZCBidWZmZXIgY29udGVudHMgKi8KLSAgCi0gIHdoaWxlIChwdXRfYml0cyA+PSA4KSB7Ci0gICAgaW50IGMgPSAoaW50KSAoKHB1dF9idWZmZXIgPj4gMTYpICYgMHhGRik7Ci0gICAgCi0gICAgZW1pdF9ieXRlKHN0YXRlLCBjLCByZXR1cm4gRkFMU0UpOwotICAgIGlmIChjID09IDB4RkYpIHsJCS8qIG5lZWQgdG8gc3R1ZmYgYSB6ZXJvIGJ5dGU/ICovCi0gICAgICBlbWl0X2J5dGUoc3RhdGUsIDAsIHJldHVybiBGQUxTRSk7Ci0gICAgfQotICAgIHB1dF9idWZmZXIgPDw9IDg7Ci0gICAgcHV0X2JpdHMgLT0gODsKLSAgfQotCi0gIHN0YXRlLT5jdXIucHV0X2J1ZmZlciA9IHB1dF9idWZmZXI7IC8qIHVwZGF0ZSBzdGF0ZSB2YXJpYWJsZXMgKi8KLSAgc3RhdGUtPmN1ci5wdXRfYml0cyA9IHB1dF9iaXRzOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLUxPQ0FMKGJvb2xlYW4pCi1mbHVzaF9iaXRzICh3b3JraW5nX3N0YXRlICogc3RhdGUpCi17Ci0gIGlmICghIGVtaXRfYml0cyhzdGF0ZSwgMHg3RiwgNykpIC8qIGZpbGwgYW55IHBhcnRpYWwgYnl0ZSB3aXRoIG9uZXMgKi8KLSAgICByZXR1cm4gRkFMU0U7Ci0gIHN0YXRlLT5jdXIucHV0X2J1ZmZlciA9IDA7CS8qIGFuZCByZXNldCBiaXQtYnVmZmVyIHRvIGVtcHR5ICovCi0gIHN0YXRlLT5jdXIucHV0X2JpdHMgPSAwOwotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKiBFbmNvZGUgYSBzaW5nbGUgYmxvY2sncyB3b3J0aCBvZiBjb2VmZmljaWVudHMgKi8KLQotTE9DQUwoYm9vbGVhbikKLWVuY29kZV9vbmVfYmxvY2sgKHdvcmtpbmdfc3RhdGUgKiBzdGF0ZSwgSkNPRUZQVFIgYmxvY2ssIGludCBsYXN0X2RjX3ZhbCwKLQkJICBjX2Rlcml2ZWRfdGJsICpkY3RibCwgY19kZXJpdmVkX3RibCAqYWN0YmwpCi17Ci0gIHJlZ2lzdGVyIGludCB0ZW1wLCB0ZW1wMjsKLSAgcmVnaXN0ZXIgaW50IG5iaXRzOwotICByZWdpc3RlciBpbnQgaywgciwgaTsKLSAgCi0gIC8qIEVuY29kZSB0aGUgREMgY29lZmZpY2llbnQgZGlmZmVyZW5jZSBwZXIgc2VjdGlvbiBGLjEuMi4xICovCi0gIAotICB0ZW1wID0gdGVtcDIgPSBibG9ja1swXSAtIGxhc3RfZGNfdmFsOwotCi0gIGlmICh0ZW1wIDwgMCkgewotICAgIHRlbXAgPSAtdGVtcDsJCS8qIHRlbXAgaXMgYWJzIHZhbHVlIG9mIGlucHV0ICovCi0gICAgLyogRm9yIGEgbmVnYXRpdmUgaW5wdXQsIHdhbnQgdGVtcDIgPSBiaXR3aXNlIGNvbXBsZW1lbnQgb2YgYWJzKGlucHV0KSAqLwotICAgIC8qIFRoaXMgY29kZSBhc3N1bWVzIHdlIGFyZSBvbiBhIHR3bydzIGNvbXBsZW1lbnQgbWFjaGluZSAqLwotICAgIHRlbXAyLS07Ci0gIH0KLSAgCi0gIC8qIEZpbmQgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCBmb3IgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY29lZmZpY2llbnQgKi8KLSAgbmJpdHMgPSAwOwotICB3aGlsZSAodGVtcCkgewotICAgIG5iaXRzKys7Ci0gICAgdGVtcCA+Pj0gMTsKLSAgfQotICAvKiBDaGVjayBmb3Igb3V0LW9mLXJhbmdlIGNvZWZmaWNpZW50IHZhbHVlcy4KLSAgICogU2luY2Ugd2UncmUgZW5jb2RpbmcgYSBkaWZmZXJlbmNlLCB0aGUgcmFuZ2UgbGltaXQgaXMgdHdpY2UgYXMgbXVjaC4KLSAgICovCi0gIGlmIChuYml0cyA+IE1BWF9DT0VGX0JJVFMrMSkKLSAgICBFUlJFWElUKHN0YXRlLT5jaW5mbywgSkVSUl9CQURfRENUX0NPRUYpOwotICAKLSAgLyogRW1pdCB0aGUgSHVmZm1hbi1jb2RlZCBzeW1ib2wgZm9yIHRoZSBudW1iZXIgb2YgYml0cyAqLwotICBpZiAoISBlbWl0X2JpdHMoc3RhdGUsIGRjdGJsLT5laHVmY29bbmJpdHNdLCBkY3RibC0+ZWh1ZnNpW25iaXRzXSkpCi0gICAgcmV0dXJuIEZBTFNFOwotCi0gIC8qIEVtaXQgdGhhdCBudW1iZXIgb2YgYml0cyBvZiB0aGUgdmFsdWUsIGlmIHBvc2l0aXZlLCAqLwotICAvKiBvciB0aGUgY29tcGxlbWVudCBvZiBpdHMgbWFnbml0dWRlLCBpZiBuZWdhdGl2ZS4gKi8KLSAgaWYgKG5iaXRzKQkJCS8qIGVtaXRfYml0cyByZWplY3RzIGNhbGxzIHdpdGggc2l6ZSAwICovCi0gICAgaWYgKCEgZW1pdF9iaXRzKHN0YXRlLCAodW5zaWduZWQgaW50KSB0ZW1wMiwgbmJpdHMpKQotICAgICAgcmV0dXJuIEZBTFNFOwotCi0gIC8qIEVuY29kZSB0aGUgQUMgY29lZmZpY2llbnRzIHBlciBzZWN0aW9uIEYuMS4yLjIgKi8KLSAgCi0gIHIgPSAwOwkJCS8qIHIgPSBydW4gbGVuZ3RoIG9mIHplcm9zICovCi0gIAotICBmb3IgKGsgPSAxOyBrIDwgRENUU0laRTI7IGsrKykgewotICAgIGlmICgodGVtcCA9IGJsb2NrW2pwZWdfbmF0dXJhbF9vcmRlcltrXV0pID09IDApIHsKLSAgICAgIHIrKzsKLSAgICB9IGVsc2UgewotICAgICAgLyogaWYgcnVuIGxlbmd0aCA+IDE1LCBtdXN0IGVtaXQgc3BlY2lhbCBydW4tbGVuZ3RoLTE2IGNvZGVzICgweEYwKSAqLwotICAgICAgd2hpbGUgKHIgPiAxNSkgewotCWlmICghIGVtaXRfYml0cyhzdGF0ZSwgYWN0YmwtPmVodWZjb1sweEYwXSwgYWN0YmwtPmVodWZzaVsweEYwXSkpCi0JICByZXR1cm4gRkFMU0U7Ci0JciAtPSAxNjsKLSAgICAgIH0KLQotICAgICAgdGVtcDIgPSB0ZW1wOwotICAgICAgaWYgKHRlbXAgPCAwKSB7Ci0JdGVtcCA9IC10ZW1wOwkJLyogdGVtcCBpcyBhYnMgdmFsdWUgb2YgaW5wdXQgKi8KLQkvKiBUaGlzIGNvZGUgYXNzdW1lcyB3ZSBhcmUgb24gYSB0d28ncyBjb21wbGVtZW50IG1hY2hpbmUgKi8KLQl0ZW1wMi0tOwotICAgICAgfQotICAgICAgCi0gICAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvZWZmaWNpZW50ICovCi0gICAgICBuYml0cyA9IDE7CQkvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSAxIGJpdCAqLwotICAgICAgd2hpbGUgKCh0ZW1wID4+PSAxKSkKLQluYml0cysrOwotICAgICAgLyogQ2hlY2sgZm9yIG91dC1vZi1yYW5nZSBjb2VmZmljaWVudCB2YWx1ZXMgKi8KLSAgICAgIGlmIChuYml0cyA+IE1BWF9DT0VGX0JJVFMpCi0JRVJSRVhJVChzdGF0ZS0+Y2luZm8sIEpFUlJfQkFEX0RDVF9DT0VGKTsKLSAgICAgIAotICAgICAgLyogRW1pdCBIdWZmbWFuIHN5bWJvbCBmb3IgcnVuIGxlbmd0aCAvIG51bWJlciBvZiBiaXRzICovCi0gICAgICBpID0gKHIgPDwgNCkgKyBuYml0czsKLSAgICAgIGlmICghIGVtaXRfYml0cyhzdGF0ZSwgYWN0YmwtPmVodWZjb1tpXSwgYWN0YmwtPmVodWZzaVtpXSkpCi0JcmV0dXJuIEZBTFNFOwotCi0gICAgICAvKiBFbWl0IHRoYXQgbnVtYmVyIG9mIGJpdHMgb2YgdGhlIHZhbHVlLCBpZiBwb3NpdGl2ZSwgKi8KLSAgICAgIC8qIG9yIHRoZSBjb21wbGVtZW50IG9mIGl0cyBtYWduaXR1ZGUsIGlmIG5lZ2F0aXZlLiAqLwotICAgICAgaWYgKCEgZW1pdF9iaXRzKHN0YXRlLCAodW5zaWduZWQgaW50KSB0ZW1wMiwgbmJpdHMpKQotCXJldHVybiBGQUxTRTsKLSAgICAgIAotICAgICAgciA9IDA7Ci0gICAgfQotICB9Ci0KLSAgLyogSWYgdGhlIGxhc3QgY29lZihzKSB3ZXJlIHplcm8sIGVtaXQgYW4gZW5kLW9mLWJsb2NrIGNvZGUgKi8KLSAgaWYgKHIgPiAwKQotICAgIGlmICghIGVtaXRfYml0cyhzdGF0ZSwgYWN0YmwtPmVodWZjb1swXSwgYWN0YmwtPmVodWZzaVswXSkpCi0gICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIEVtaXQgYSByZXN0YXJ0IG1hcmtlciAmIHJlc3luY2hyb25pemUgcHJlZGljdGlvbnMuCi0gKi8KLQotTE9DQUwoYm9vbGVhbikKLWVtaXRfcmVzdGFydCAod29ya2luZ19zdGF0ZSAqIHN0YXRlLCBpbnQgcmVzdGFydF9udW0pCi17Ci0gIGludCBjaTsKLQotICBpZiAoISBmbHVzaF9iaXRzKHN0YXRlKSkKLSAgICByZXR1cm4gRkFMU0U7Ci0KLSAgZW1pdF9ieXRlKHN0YXRlLCAweEZGLCByZXR1cm4gRkFMU0UpOwotICBlbWl0X2J5dGUoc3RhdGUsIEpQRUdfUlNUMCArIHJlc3RhcnRfbnVtLCByZXR1cm4gRkFMU0UpOwotCi0gIC8qIFJlLWluaXRpYWxpemUgREMgcHJlZGljdGlvbnMgdG8gMCAqLwotICBmb3IgKGNpID0gMDsgY2kgPCBzdGF0ZS0+Y2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspCi0gICAgc3RhdGUtPmN1ci5sYXN0X2RjX3ZhbFtjaV0gPSAwOwotCi0gIC8qIFRoZSByZXN0YXJ0IGNvdW50ZXIgaXMgbm90IHVwZGF0ZWQgdW50aWwgd2Ugc3VjY2Vzc2Z1bGx5IHdyaXRlIHRoZSBNQ1UuICovCi0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIEVuY29kZSBhbmQgb3V0cHV0IG9uZSBNQ1UncyB3b3J0aCBvZiBIdWZmbWFuLWNvbXByZXNzZWQgY29lZmZpY2llbnRzLgotICovCi0KLU1FVEhPRERFRihib29sZWFuKQotZW5jb2RlX21jdV9odWZmIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKLXsKLSAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICB3b3JraW5nX3N0YXRlIHN0YXRlOwotICBpbnQgYmxrbiwgY2k7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotCi0gIC8qIExvYWQgdXAgd29ya2luZyBzdGF0ZSAqLwotICBzdGF0ZS5uZXh0X291dHB1dF9ieXRlID0gY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGU7Ci0gIHN0YXRlLmZyZWVfaW5fYnVmZmVyID0gY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyOwotICBBU1NJR05fU1RBVEUoc3RhdGUuY3VyLCBlbnRyb3B5LT5zYXZlZCk7Ci0gIHN0YXRlLmNpbmZvID0gY2luZm87Ci0KLSAgLyogRW1pdCByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQgKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7Ci0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCi0gICAgICBpZiAoISBlbWl0X3Jlc3RhcnQoJnN0YXRlLCBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKSkKLQlyZXR1cm4gRkFMU0U7Ci0gIH0KLQotICAvKiBFbmNvZGUgdGhlIE1DVSBkYXRhIGJsb2NrcyAqLwotICBmb3IgKGJsa24gPSAwOyBibGtuIDwgY2luZm8tPmJsb2Nrc19pbl9NQ1U7IGJsa24rKykgewotICAgIGNpID0gY2luZm8tPk1DVV9tZW1iZXJzaGlwW2Jsa25dOwotICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0gICAgaWYgKCEgZW5jb2RlX29uZV9ibG9jaygmc3RhdGUsCi0JCQkgICBNQ1VfZGF0YVtibGtuXVswXSwgc3RhdGUuY3VyLmxhc3RfZGNfdmFsW2NpXSwKLQkJCSAgIGVudHJvcHktPmRjX2Rlcml2ZWRfdGJsc1tjb21wcHRyLT5kY190Ymxfbm9dLAotCQkJICAgZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2NvbXBwdHItPmFjX3RibF9ub10pKQotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIC8qIFVwZGF0ZSBsYXN0X2RjX3ZhbCAqLwotICAgIHN0YXRlLmN1ci5sYXN0X2RjX3ZhbFtjaV0gPSBNQ1VfZGF0YVtibGtuXVswXVswXTsKLSAgfQotCi0gIC8qIENvbXBsZXRlZCBNQ1UsIHNvIHVwZGF0ZSBzdGF0ZSAqLwotICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IHN0YXRlLm5leHRfb3V0cHV0X2J5dGU7Ci0gIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IHN0YXRlLmZyZWVfaW5fYnVmZmVyOwotICBBU1NJR05fU1RBVEUoZW50cm9weS0+c2F2ZWQsIHN0YXRlLmN1cik7Ci0KLSAgLyogVXBkYXRlIHJlc3RhcnQtaW50ZXJ2YWwgc3RhdGUgdG9vICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgewotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKSB7Ci0gICAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOwotICAgICAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSsrOwotICAgICAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSAmPSA3OwotICAgIH0KLSAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOwotICB9Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIGEgSHVmZm1hbi1jb21wcmVzc2VkIHNjYW4uCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1maW5pc2hfcGFzc19odWZmIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICB3b3JraW5nX3N0YXRlIHN0YXRlOwotCi0gIC8qIExvYWQgdXAgd29ya2luZyBzdGF0ZSAuLi4gZmx1c2hfYml0cyBuZWVkcyBpdCAqLwotICBzdGF0ZS5uZXh0X291dHB1dF9ieXRlID0gY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGU7Ci0gIHN0YXRlLmZyZWVfaW5fYnVmZmVyID0gY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyOwotICBBU1NJR05fU1RBVEUoc3RhdGUuY3VyLCBlbnRyb3B5LT5zYXZlZCk7Ci0gIHN0YXRlLmNpbmZvID0gY2luZm87Ci0KLSAgLyogRmx1c2ggb3V0IHRoZSBsYXN0IGRhdGEgKi8KLSAgaWYgKCEgZmx1c2hfYml0cygmc3RhdGUpKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ0FOVF9TVVNQRU5EKTsKLQotICAvKiBVcGRhdGUgc3RhdGUgKi8KLSAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBzdGF0ZS5uZXh0X291dHB1dF9ieXRlOwotICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBzdGF0ZS5mcmVlX2luX2J1ZmZlcjsKLSAgQVNTSUdOX1NUQVRFKGVudHJvcHktPnNhdmVkLCBzdGF0ZS5jdXIpOwotfQotCi0KLS8qCi0gKiBIdWZmbWFuIGNvZGluZyBvcHRpbWl6YXRpb24uCi0gKgotICogV2UgZmlyc3Qgc2NhbiB0aGUgc3VwcGxpZWQgZGF0YSBhbmQgY291bnQgdGhlIG51bWJlciBvZiB1c2VzIG9mIGVhY2ggc3ltYm9sCi0gKiB0aGF0IGlzIHRvIGJlIEh1ZmZtYW4tY29kZWQuIChUaGlzIHByb2Nlc3MgTVVTVCBhZ3JlZSB3aXRoIHRoZSBjb2RlIGFib3ZlLikKLSAqIFRoZW4gd2UgYnVpbGQgYSBIdWZmbWFuIGNvZGluZyB0cmVlIGZvciB0aGUgb2JzZXJ2ZWQgY291bnRzLgotICogU3ltYm9scyB3aGljaCBhcmUgbm90IG5lZWRlZCBhdCBhbGwgZm9yIHRoZSBwYXJ0aWN1bGFyIGltYWdlIGFyZSBub3QKLSAqIGFzc2lnbmVkIGFueSBjb2RlLCB3aGljaCBzYXZlcyBzcGFjZSBpbiB0aGUgREhUIG1hcmtlciBhcyB3ZWxsIGFzIGluCi0gKiB0aGUgY29tcHJlc3NlZCBkYXRhLgotICovCi0KLSNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKLQotCi0vKiBQcm9jZXNzIGEgc2luZ2xlIGJsb2NrJ3Mgd29ydGggb2YgY29lZmZpY2llbnRzICovCi0KLUxPQ0FMKHZvaWQpCi1odGVzdF9vbmVfYmxvY2sgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQ09FRlBUUiBibG9jaywgaW50IGxhc3RfZGNfdmFsLAotCQkgbG9uZyBkY19jb3VudHNbXSwgbG9uZyBhY19jb3VudHNbXSkKLXsKLSAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0gIHJlZ2lzdGVyIGludCBuYml0czsKLSAgcmVnaXN0ZXIgaW50IGssIHI7Ci0gIAotICAvKiBFbmNvZGUgdGhlIERDIGNvZWZmaWNpZW50IGRpZmZlcmVuY2UgcGVyIHNlY3Rpb24gRi4xLjIuMSAqLwotICAKLSAgdGVtcCA9IGJsb2NrWzBdIC0gbGFzdF9kY192YWw7Ci0gIGlmICh0ZW1wIDwgMCkKLSAgICB0ZW1wID0gLXRlbXA7Ci0gIAotICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvZWZmaWNpZW50ICovCi0gIG5iaXRzID0gMDsKLSAgd2hpbGUgKHRlbXApIHsKLSAgICBuYml0cysrOwotICAgIHRlbXAgPj49IDE7Ci0gIH0KLSAgLyogQ2hlY2sgZm9yIG91dC1vZi1yYW5nZSBjb2VmZmljaWVudCB2YWx1ZXMuCi0gICAqIFNpbmNlIHdlJ3JlIGVuY29kaW5nIGEgZGlmZmVyZW5jZSwgdGhlIHJhbmdlIGxpbWl0IGlzIHR3aWNlIGFzIG11Y2guCi0gICAqLwotICBpZiAobmJpdHMgPiBNQVhfQ09FRl9CSVRTKzEpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfRENUX0NPRUYpOwotCi0gIC8qIENvdW50IHRoZSBIdWZmbWFuIHN5bWJvbCBmb3IgdGhlIG51bWJlciBvZiBiaXRzICovCi0gIGRjX2NvdW50c1tuYml0c10rKzsKLSAgCi0gIC8qIEVuY29kZSB0aGUgQUMgY29lZmZpY2llbnRzIHBlciBzZWN0aW9uIEYuMS4yLjIgKi8KLSAgCi0gIHIgPSAwOwkJCS8qIHIgPSBydW4gbGVuZ3RoIG9mIHplcm9zICovCi0gIAotICBmb3IgKGsgPSAxOyBrIDwgRENUU0laRTI7IGsrKykgewotICAgIGlmICgodGVtcCA9IGJsb2NrW2pwZWdfbmF0dXJhbF9vcmRlcltrXV0pID09IDApIHsKLSAgICAgIHIrKzsKLSAgICB9IGVsc2UgewotICAgICAgLyogaWYgcnVuIGxlbmd0aCA+IDE1LCBtdXN0IGVtaXQgc3BlY2lhbCBydW4tbGVuZ3RoLTE2IGNvZGVzICgweEYwKSAqLwotICAgICAgd2hpbGUgKHIgPiAxNSkgewotCWFjX2NvdW50c1sweEYwXSsrOwotCXIgLT0gMTY7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8qIEZpbmQgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCBmb3IgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY29lZmZpY2llbnQgKi8KLSAgICAgIGlmICh0ZW1wIDwgMCkKLQl0ZW1wID0gLXRlbXA7Ci0gICAgICAKLSAgICAgIC8qIEZpbmQgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCBmb3IgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY29lZmZpY2llbnQgKi8KLSAgICAgIG5iaXRzID0gMTsJCS8qIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIDEgYml0ICovCi0gICAgICB3aGlsZSAoKHRlbXAgPj49IDEpKQotCW5iaXRzKys7Ci0gICAgICAvKiBDaGVjayBmb3Igb3V0LW9mLXJhbmdlIGNvZWZmaWNpZW50IHZhbHVlcyAqLwotICAgICAgaWYgKG5iaXRzID4gTUFYX0NPRUZfQklUUykKLQlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9EQ1RfQ09FRik7Ci0gICAgICAKLSAgICAgIC8qIENvdW50IEh1ZmZtYW4gc3ltYm9sIGZvciBydW4gbGVuZ3RoIC8gbnVtYmVyIG9mIGJpdHMgKi8KLSAgICAgIGFjX2NvdW50c1sociA8PCA0KSArIG5iaXRzXSsrOwotICAgICAgCi0gICAgICByID0gMDsKLSAgICB9Ci0gIH0KLQotICAvKiBJZiB0aGUgbGFzdCBjb2VmKHMpIHdlcmUgemVybywgZW1pdCBhbiBlbmQtb2YtYmxvY2sgY29kZSAqLwotICBpZiAociA+IDApCi0gICAgYWNfY291bnRzWzBdKys7Ci19Ci0KLQotLyoKLSAqIFRyaWFsLWVuY29kZSBvbmUgTUNVJ3Mgd29ydGggb2YgSHVmZm1hbi1jb21wcmVzc2VkIGNvZWZmaWNpZW50cy4KLSAqIE5vIGRhdGEgaXMgYWN0dWFsbHkgb3V0cHV0LCBzbyBubyBzdXNwZW5zaW9uIHJldHVybiBpcyBwb3NzaWJsZS4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLWVuY29kZV9tY3VfZ2F0aGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKLXsKLSAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICBpbnQgYmxrbiwgY2k7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotCi0gIC8qIFRha2UgY2FyZSBvZiByZXN0YXJ0IGludGVydmFscyBpZiBuZWVkZWQgKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7Ci0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApIHsKLSAgICAgIC8qIFJlLWluaXRpYWxpemUgREMgcHJlZGljdGlvbnMgdG8gMCAqLwotICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspCi0JZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldID0gMDsKLSAgICAgIC8qIFVwZGF0ZSByZXN0YXJ0IHN0YXRlICovCi0gICAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOwotICAgIH0KLSAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOwotICB9Ci0KLSAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKLSAgICBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIGh0ZXN0X29uZV9ibG9jayhjaW5mbywgTUNVX2RhdGFbYmxrbl1bMF0sIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSwKLQkJICAgIGVudHJvcHktPmRjX2NvdW50X3B0cnNbY29tcHB0ci0+ZGNfdGJsX25vXSwKLQkJICAgIGVudHJvcHktPmFjX2NvdW50X3B0cnNbY29tcHB0ci0+YWNfdGJsX25vXSk7Ci0gICAgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldID0gTUNVX2RhdGFbYmxrbl1bMF1bMF07Ci0gIH0KLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogR2VuZXJhdGUgdGhlIGJlc3QgSHVmZm1hbiBjb2RlIHRhYmxlIGZvciB0aGUgZ2l2ZW4gY291bnRzLCBmaWxsIGh0YmwuCi0gKiBOb3RlIHRoaXMgaXMgYWxzbyB1c2VkIGJ5IGpjcGh1ZmYuYy4KLSAqCi0gKiBUaGUgSlBFRyBzdGFuZGFyZCByZXF1aXJlcyB0aGF0IG5vIHN5bWJvbCBiZSBhc3NpZ25lZCBhIGNvZGV3b3JkIG9mIGFsbAotICogb25lIGJpdHMgKHNvIHRoYXQgcGFkZGluZyBiaXRzIGFkZGVkIGF0IHRoZSBlbmQgb2YgYSBjb21wcmVzc2VkIHNlZ21lbnQKLSAqIGNhbid0IGxvb2sgbGlrZSBhIHZhbGlkIGNvZGUpLiAgQmVjYXVzZSBvZiB0aGUgY2Fub25pY2FsIG9yZGVyaW5nIG9mCi0gKiBjb2Rld29yZHMsIHRoaXMganVzdCBtZWFucyB0aGF0IHRoZXJlIG11c3QgYmUgYW4gdW51c2VkIHNsb3QgaW4gdGhlCi0gKiBsb25nZXN0IGNvZGV3b3JkIGxlbmd0aCBjYXRlZ29yeS4gIFNlY3Rpb24gSy4yIG9mIHRoZSBKUEVHIHNwZWMgc3VnZ2VzdHMKLSAqIHJlc2VydmluZyBzdWNoIGEgc2xvdCBieSBwcmV0ZW5kaW5nIHRoYXQgc3ltYm9sIDI1NiBpcyBhIHZhbGlkIHN5bWJvbAotICogd2l0aCBjb3VudCAxLiAgSW4gdGhlb3J5IHRoYXQncyBub3Qgb3B0aW1hbDsgZ2l2aW5nIGl0IGNvdW50IHplcm8gYnV0Ci0gKiBpbmNsdWRpbmcgaXQgaW4gdGhlIHN5bWJvbCBzZXQgYW55d2F5IHNob3VsZCBnaXZlIGEgYmV0dGVyIEh1ZmZtYW4gY29kZS4KLSAqIEJ1dCB0aGUgdGhlb3JldGljYWxseSBiZXR0ZXIgY29kZSBhY3R1YWxseSBzZWVtcyB0byBjb21lIG91dCB3b3JzZSBpbgotICogcHJhY3RpY2UsIGJlY2F1c2UgaXQgcHJvZHVjZXMgbW9yZSBhbGwtb25lcyBieXRlcyAod2hpY2ggaW5jdXIgc3R1ZmZlZAotICogemVybyBieXRlcyBpbiB0aGUgZmluYWwgZmlsZSkuICBJbiBhbnkgY2FzZSB0aGUgZGlmZmVyZW5jZSBpcyB0aW55LgotICoKLSAqIFRoZSBKUEVHIHN0YW5kYXJkIHJlcXVpcmVzIEh1ZmZtYW4gY29kZXMgdG8gYmUgbm8gbW9yZSB0aGFuIDE2IGJpdHMgbG9uZy4KLSAqIElmIHNvbWUgc3ltYm9scyBoYXZlIGEgdmVyeSBzbWFsbCBidXQgbm9uemVybyBwcm9iYWJpbGl0eSwgdGhlIEh1ZmZtYW4gdHJlZQotICogbXVzdCBiZSBhZGp1c3RlZCB0byBtZWV0IHRoZSBjb2RlIGxlbmd0aCByZXN0cmljdGlvbi4gIFdlIGN1cnJlbnRseSB1c2UKLSAqIHRoZSBhZGp1c3RtZW50IG1ldGhvZCBzdWdnZXN0ZWQgaW4gSlBFRyBzZWN0aW9uIEsuMi4gIFRoaXMgbWV0aG9kIGlzICpub3QqCi0gKiBvcHRpbWFsOyBpdCBtYXkgbm90IGNob29zZSB0aGUgYmVzdCBwb3NzaWJsZSBsaW1pdGVkLWxlbmd0aCBjb2RlLiAgQnV0Ci0gKiB0eXBpY2FsbHkgb25seSB2ZXJ5LWxvdy1mcmVxdWVuY3kgc3ltYm9scyB3aWxsIGJlIGdpdmVuIGxlc3MtdGhhbi1vcHRpbWFsCi0gKiBsZW5ndGhzLCBzbyB0aGUgY29kZSBpcyBhbG1vc3Qgb3B0aW1hbC4gIEV4cGVyaW1lbnRhbCBjb21wYXJpc29ucyBhZ2FpbnN0Ci0gKiBhbiBvcHRpbWFsIGxpbWl0ZWQtbGVuZ3RoLWNvZGUgYWxnb3JpdGhtIGluZGljYXRlIHRoYXQgdGhlIGRpZmZlcmVuY2UgaXMKLSAqIG1pY3Jvc2NvcGljIC0tLSB1c3VhbGx5IGxlc3MgdGhhbiBhIGh1bmRyZWR0aCBvZiBhIHBlcmNlbnQgb2YgdG90YWwgc2l6ZS4KLSAqIFNvIHRoZSBleHRyYSBjb21wbGV4aXR5IG9mIGFuIG9wdGltYWwgYWxnb3JpdGhtIGRvZXNuJ3Qgc2VlbSB3b3J0aHdoaWxlLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19nZW5fb3B0aW1hbF90YWJsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIEpIVUZGX1RCTCAqIGh0YmwsIGxvbmcgZnJlcVtdKQotewotI2RlZmluZSBNQVhfQ0xFTiAzMgkJLyogYXNzdW1lZCBtYXhpbXVtIGluaXRpYWwgY29kZSBsZW5ndGggKi8KLSAgVUlOVDggYml0c1tNQVhfQ0xFTisxXTsJLyogYml0c1trXSA9ICMgb2Ygc3ltYm9scyB3aXRoIGNvZGUgbGVuZ3RoIGsgKi8KLSAgaW50IGNvZGVzaXplWzI1N107CQkvKiBjb2Rlc2l6ZVtrXSA9IGNvZGUgbGVuZ3RoIG9mIHN5bWJvbCBrICovCi0gIGludCBvdGhlcnNbMjU3XTsJCS8qIG5leHQgc3ltYm9sIGluIGN1cnJlbnQgYnJhbmNoIG9mIHRyZWUgKi8KLSAgaW50IGMxLCBjMjsKLSAgaW50IHAsIGksIGo7Ci0gIGxvbmcgdjsKLQotICAvKiBUaGlzIGFsZ29yaXRobSBpcyBleHBsYWluZWQgaW4gc2VjdGlvbiBLLjIgb2YgdGhlIEpQRUcgc3RhbmRhcmQgKi8KLQotICBNRU1aRVJPKGJpdHMsIFNJWkVPRihiaXRzKSk7Ci0gIE1FTVpFUk8oY29kZXNpemUsIFNJWkVPRihjb2Rlc2l6ZSkpOwotICBmb3IgKGkgPSAwOyBpIDwgMjU3OyBpKyspCi0gICAgb3RoZXJzW2ldID0gLTE7CQkvKiBpbml0IGxpbmtzIHRvIGVtcHR5ICovCi0gIAotICBmcmVxWzI1Nl0gPSAxOwkJLyogbWFrZSBzdXJlIDI1NiBoYXMgYSBub256ZXJvIGNvdW50ICovCi0gIC8qIEluY2x1ZGluZyB0aGUgcHNldWRvLXN5bWJvbCAyNTYgaW4gdGhlIEh1ZmZtYW4gcHJvY2VkdXJlIGd1YXJhbnRlZXMKLSAgICogdGhhdCBubyByZWFsIHN5bWJvbCBpcyBnaXZlbiBjb2RlLXZhbHVlIG9mIGFsbCBvbmVzLCBiZWNhdXNlIDI1NgotICAgKiB3aWxsIGJlIHBsYWNlZCBsYXN0IGluIHRoZSBsYXJnZXN0IGNvZGV3b3JkIGNhdGVnb3J5LgotICAgKi8KLQotICAvKiBIdWZmbWFuJ3MgYmFzaWMgYWxnb3JpdGhtIHRvIGFzc2lnbiBvcHRpbWFsIGNvZGUgbGVuZ3RocyB0byBzeW1ib2xzICovCi0KLSAgZm9yICg7OykgewotICAgIC8qIEZpbmQgdGhlIHNtYWxsZXN0IG5vbnplcm8gZnJlcXVlbmN5LCBzZXQgYzEgPSBpdHMgc3ltYm9sICovCi0gICAgLyogSW4gY2FzZSBvZiB0aWVzLCB0YWtlIHRoZSBsYXJnZXIgc3ltYm9sIG51bWJlciAqLwotICAgIGMxID0gLTE7Ci0gICAgdiA9IDEwMDAwMDAwMDBMOwotICAgIGZvciAoaSA9IDA7IGkgPD0gMjU2OyBpKyspIHsKLSAgICAgIGlmIChmcmVxW2ldICYmIGZyZXFbaV0gPD0gdikgewotCXYgPSBmcmVxW2ldOwotCWMxID0gaTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBGaW5kIHRoZSBuZXh0IHNtYWxsZXN0IG5vbnplcm8gZnJlcXVlbmN5LCBzZXQgYzIgPSBpdHMgc3ltYm9sICovCi0gICAgLyogSW4gY2FzZSBvZiB0aWVzLCB0YWtlIHRoZSBsYXJnZXIgc3ltYm9sIG51bWJlciAqLwotICAgIGMyID0gLTE7Ci0gICAgdiA9IDEwMDAwMDAwMDBMOwotICAgIGZvciAoaSA9IDA7IGkgPD0gMjU2OyBpKyspIHsKLSAgICAgIGlmIChmcmVxW2ldICYmIGZyZXFbaV0gPD0gdiAmJiBpICE9IGMxKSB7Ci0JdiA9IGZyZXFbaV07Ci0JYzIgPSBpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIERvbmUgaWYgd2UndmUgbWVyZ2VkIGV2ZXJ5dGhpbmcgaW50byBvbmUgZnJlcXVlbmN5ICovCi0gICAgaWYgKGMyIDwgMCkKLSAgICAgIGJyZWFrOwotICAgIAotICAgIC8qIEVsc2UgbWVyZ2UgdGhlIHR3byBjb3VudHMvdHJlZXMgKi8KLSAgICBmcmVxW2MxXSArPSBmcmVxW2MyXTsKLSAgICBmcmVxW2MyXSA9IDA7Ci0KLSAgICAvKiBJbmNyZW1lbnQgdGhlIGNvZGVzaXplIG9mIGV2ZXJ5dGhpbmcgaW4gYzEncyB0cmVlIGJyYW5jaCAqLwotICAgIGNvZGVzaXplW2MxXSsrOwotICAgIHdoaWxlIChvdGhlcnNbYzFdID49IDApIHsKLSAgICAgIGMxID0gb3RoZXJzW2MxXTsKLSAgICAgIGNvZGVzaXplW2MxXSsrOwotICAgIH0KLSAgICAKLSAgICBvdGhlcnNbYzFdID0gYzI7CQkvKiBjaGFpbiBjMiBvbnRvIGMxJ3MgdHJlZSBicmFuY2ggKi8KLSAgICAKLSAgICAvKiBJbmNyZW1lbnQgdGhlIGNvZGVzaXplIG9mIGV2ZXJ5dGhpbmcgaW4gYzIncyB0cmVlIGJyYW5jaCAqLwotICAgIGNvZGVzaXplW2MyXSsrOwotICAgIHdoaWxlIChvdGhlcnNbYzJdID49IDApIHsKLSAgICAgIGMyID0gb3RoZXJzW2MyXTsKLSAgICAgIGNvZGVzaXplW2MyXSsrOwotICAgIH0KLSAgfQotCi0gIC8qIE5vdyBjb3VudCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgb2YgZWFjaCBjb2RlIGxlbmd0aCAqLwotICBmb3IgKGkgPSAwOyBpIDw9IDI1NjsgaSsrKSB7Ci0gICAgaWYgKGNvZGVzaXplW2ldKSB7Ci0gICAgICAvKiBUaGUgSlBFRyBzdGFuZGFyZCBzZWVtcyB0byB0aGluayB0aGF0IHRoaXMgY2FuJ3QgaGFwcGVuLCAqLwotICAgICAgLyogYnV0IEknbSBwYXJhbm9pZC4uLiAqLwotICAgICAgaWYgKGNvZGVzaXplW2ldID4gTUFYX0NMRU4pCi0JRVJSRVhJVChjaW5mbywgSkVSUl9IVUZGX0NMRU5fT1ZFUkZMT1cpOwotCi0gICAgICBiaXRzW2NvZGVzaXplW2ldXSsrOwotICAgIH0KLSAgfQotCi0gIC8qIEpQRUcgZG9lc24ndCBhbGxvdyBzeW1ib2xzIHdpdGggY29kZSBsZW5ndGhzIG92ZXIgMTYgYml0cywgc28gaWYgdGhlIHB1cmUKLSAgICogSHVmZm1hbiBwcm9jZWR1cmUgYXNzaWduZWQgYW55IHN1Y2ggbGVuZ3Rocywgd2UgbXVzdCBhZGp1c3QgdGhlIGNvZGluZy4KLSAgICogSGVyZSBpcyB3aGF0IHRoZSBKUEVHIHNwZWMgc2F5cyBhYm91dCBob3cgdGhpcyBuZXh0IGJpdCB3b3JrczoKLSAgICogU2luY2Ugc3ltYm9scyBhcmUgcGFpcmVkIGZvciB0aGUgbG9uZ2VzdCBIdWZmbWFuIGNvZGUsIHRoZSBzeW1ib2xzIGFyZQotICAgKiByZW1vdmVkIGZyb20gdGhpcyBsZW5ndGggY2F0ZWdvcnkgdHdvIGF0IGEgdGltZS4gIFRoZSBwcmVmaXggZm9yIHRoZSBwYWlyCi0gICAqICh3aGljaCBpcyBvbmUgYml0IHNob3J0ZXIpIGlzIGFsbG9jYXRlZCB0byBvbmUgb2YgdGhlIHBhaXI7IHRoZW4sCi0gICAqIHNraXBwaW5nIHRoZSBCSVRTIGVudHJ5IGZvciB0aGF0IHByZWZpeCBsZW5ndGgsIGEgY29kZSB3b3JkIGZyb20gdGhlIG5leHQKLSAgICogc2hvcnRlc3Qgbm9uemVybyBCSVRTIGVudHJ5IGlzIGNvbnZlcnRlZCBpbnRvIGEgcHJlZml4IGZvciB0d28gY29kZSB3b3JkcwotICAgKiBvbmUgYml0IGxvbmdlci4KLSAgICovCi0gIAotICBmb3IgKGkgPSBNQVhfQ0xFTjsgaSA+IDE2OyBpLS0pIHsKLSAgICB3aGlsZSAoYml0c1tpXSA+IDApIHsKLSAgICAgIGogPSBpIC0gMjsJCS8qIGZpbmQgbGVuZ3RoIG9mIG5ldyBwcmVmaXggdG8gYmUgdXNlZCAqLwotICAgICAgd2hpbGUgKGJpdHNbal0gPT0gMCkKLQlqLS07Ci0gICAgICAKLSAgICAgIGJpdHNbaV0gLT0gMjsJCS8qIHJlbW92ZSB0d28gc3ltYm9scyAqLwotICAgICAgYml0c1tpLTFdKys7CQkvKiBvbmUgZ29lcyBpbiB0aGlzIGxlbmd0aCAqLwotICAgICAgYml0c1tqKzFdICs9IDI7CQkvKiB0d28gbmV3IHN5bWJvbHMgaW4gdGhpcyBsZW5ndGggKi8KLSAgICAgIGJpdHNbal0tLTsJCS8qIHN5bWJvbCBvZiB0aGlzIGxlbmd0aCBpcyBub3cgYSBwcmVmaXggKi8KLSAgICB9Ci0gIH0KLQotICAvKiBSZW1vdmUgdGhlIGNvdW50IGZvciB0aGUgcHNldWRvLXN5bWJvbCAyNTYgZnJvbSB0aGUgbGFyZ2VzdCBjb2RlbGVuZ3RoICovCi0gIHdoaWxlIChiaXRzW2ldID09IDApCQkvKiBmaW5kIGxhcmdlc3QgY29kZWxlbmd0aCBzdGlsbCBpbiB1c2UgKi8KLSAgICBpLS07Ci0gIGJpdHNbaV0tLTsKLSAgCi0gIC8qIFJldHVybiBmaW5hbCBzeW1ib2wgY291bnRzIChvbmx5IGZvciBsZW5ndGhzIDAuLjE2KSAqLwotICBNRU1DT1BZKGh0YmwtPmJpdHMsIGJpdHMsIFNJWkVPRihodGJsLT5iaXRzKSk7Ci0gIAotICAvKiBSZXR1cm4gYSBsaXN0IG9mIHRoZSBzeW1ib2xzIHNvcnRlZCBieSBjb2RlIGxlbmd0aCAqLwotICAvKiBJdCdzIG5vdCByZWFsIGNsZWFyIHRvIG1lIHdoeSB3ZSBkb24ndCBuZWVkIHRvIGNvbnNpZGVyIHRoZSBjb2RlbGVuZ3RoCi0gICAqIGNoYW5nZXMgbWFkZSBhYm92ZSwgYnV0IHRoZSBKUEVHIHNwZWMgc2VlbXMgdG8gdGhpbmsgdGhpcyB3b3Jrcy4KLSAgICovCi0gIHAgPSAwOwotICBmb3IgKGkgPSAxOyBpIDw9IE1BWF9DTEVOOyBpKyspIHsKLSAgICBmb3IgKGogPSAwOyBqIDw9IDI1NTsgaisrKSB7Ci0gICAgICBpZiAoY29kZXNpemVbal0gPT0gaSkgewotCWh0YmwtPmh1ZmZ2YWxbcF0gPSAoVUlOVDgpIGo7Ci0JcCsrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIFNldCBzZW50X3RhYmxlIEZBTFNFIHNvIHVwZGF0ZWQgdGFibGUgd2lsbCBiZSB3cml0dGVuIHRvIEpQRUcgZmlsZS4gKi8KLSAgaHRibC0+c2VudF90YWJsZSA9IEZBTFNFOwotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYSBzdGF0aXN0aWNzLWdhdGhlcmluZyBwYXNzIGFuZCBjcmVhdGUgdGhlIG5ldyBIdWZmbWFuIHRhYmxlcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZpbmlzaF9wYXNzX2dhdGhlciAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgaW50IGNpLCBkY3RibCwgYWN0Ymw7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotICBKSFVGRl9UQkwgKipodGJscHRyOwotICBib29sZWFuIGRpZF9kY1tOVU1fSFVGRl9UQkxTXTsKLSAgYm9vbGVhbiBkaWRfYWNbTlVNX0hVRkZfVEJMU107Ci0KLSAgLyogSXQncyBpbXBvcnRhbnQgbm90IHRvIGFwcGx5IGpwZWdfZ2VuX29wdGltYWxfdGFibGUgbW9yZSB0aGFuIG9uY2UKLSAgICogcGVyIHRhYmxlLCBiZWNhdXNlIGl0IGNsb2JiZXJzIHRoZSBpbnB1dCBmcmVxdWVuY3kgY291bnRzIQotICAgKi8KLSAgTUVNWkVSTyhkaWRfZGMsIFNJWkVPRihkaWRfZGMpKTsKLSAgTUVNWkVSTyhkaWRfYWMsIFNJWkVPRihkaWRfYWMpKTsKLQotICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgewotICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0gICAgZGN0YmwgPSBjb21wcHRyLT5kY190Ymxfbm87Ci0gICAgYWN0YmwgPSBjb21wcHRyLT5hY190Ymxfbm87Ci0gICAgaWYgKCEgZGlkX2RjW2RjdGJsXSkgewotICAgICAgaHRibHB0ciA9ICYgY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbZGN0YmxdOwotICAgICAgaWYgKCpodGJscHRyID09IE5VTEwpCi0JKmh0YmxwdHIgPSBqcGVnX2FsbG9jX2h1ZmZfdGFibGUoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICAgICAganBlZ19nZW5fb3B0aW1hbF90YWJsZShjaW5mbywgKmh0YmxwdHIsIGVudHJvcHktPmRjX2NvdW50X3B0cnNbZGN0YmxdKTsKLSAgICAgIGRpZF9kY1tkY3RibF0gPSBUUlVFOwotICAgIH0KLSAgICBpZiAoISBkaWRfYWNbYWN0YmxdKSB7Ci0gICAgICBodGJscHRyID0gJiBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1thY3RibF07Ci0gICAgICBpZiAoKmh0YmxwdHIgPT0gTlVMTCkKLQkqaHRibHB0ciA9IGpwZWdfYWxsb2NfaHVmZl90YWJsZSgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gICAgICBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlKGNpbmZvLCAqaHRibHB0ciwgZW50cm9weS0+YWNfY291bnRfcHRyc1thY3RibF0pOwotICAgICAgZGlkX2FjW2FjdGJsXSA9IFRSVUU7Ci0gICAgfQotICB9Ci19Ci0KLQotI2VuZGlmIC8qIEVOVFJPUFlfT1BUX1NVUFBPUlRFRCAqLwotCi0KLS8qCi0gKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgSHVmZm1hbiBlbnRyb3B5IGVuY29kaW5nLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfaHVmZl9lbmNvZGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5OwotICBpbnQgaTsKLQotICBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YoaHVmZl9lbnRyb3B5X2VuY29kZXIpKTsKLSAgY2luZm8tPmVudHJvcHkgPSAoc3RydWN0IGpwZWdfZW50cm9weV9lbmNvZGVyICopIGVudHJvcHk7Ci0gIGVudHJvcHktPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19odWZmOwotCi0gIC8qIE1hcmsgdGFibGVzIHVuYWxsb2NhdGVkICovCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fSFVGRl9UQkxTOyBpKyspIHsKLSAgICBlbnRyb3B5LT5kY19kZXJpdmVkX3RibHNbaV0gPSBlbnRyb3B5LT5hY19kZXJpdmVkX3RibHNbaV0gPSBOVUxMOwotI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAotICAgIGVudHJvcHktPmRjX2NvdW50X3B0cnNbaV0gPSBlbnRyb3B5LT5hY19jb3VudF9wdHJzW2ldID0gTlVMTDsKLSNlbmRpZgotICB9Ci19Ci0KLSNlbmRpZiAvL19GWF9KUEVHX1RVUkJPXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNpbml0LmMgYi9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY2luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThlNWQxOC4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY2luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLSNpZiAhZGVmaW5lZChfRlhfSlBFR19UVVJCT18pCi0vKgotICogamNpbml0LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBpbml0aWFsaXphdGlvbiBsb2dpYyBmb3IgdGhlIEpQRUcgY29tcHJlc3Nvci4KLSAqIFRoaXMgcm91dGluZSBpcyBpbiBjaGFyZ2Ugb2Ygc2VsZWN0aW5nIHRoZSBtb2R1bGVzIHRvIGJlIGV4ZWN1dGVkIGFuZAotICogbWFraW5nIGFuIGluaXRpYWxpemF0aW9uIGNhbGwgdG8gZWFjaCBvbmUuCi0gKgotICogTG9naWNhbGx5LCB0aGlzIGNvZGUgYmVsb25ncyBpbiBqY21hc3Rlci5jLiAgSXQncyBzcGxpdCBvdXQgYmVjYXVzZQotICogbGlua2luZyB0aGlzIHJvdXRpbmUgaW1wbGllcyBsaW5raW5nIHRoZSBlbnRpcmUgY29tcHJlc3Npb24gbGlicmFyeS4KLSAqIEZvciBhIHRyYW5zY29kaW5nLW9ubHkgYXBwbGljYXRpb24sIHdlIHdhbnQgdG8gYmUgYWJsZSB0byB1c2UgamNtYXN0ZXIuYwotICogd2l0aG91dCBsaW5raW5nIGluIHRoZSB3aG9sZSBsaWJyYXJ5LgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKgotICogTWFzdGVyIHNlbGVjdGlvbiBvZiBjb21wcmVzc2lvbiBtb2R1bGVzLgotICogVGhpcyBpcyBkb25lIG9uY2UgYXQgdGhlIHN0YXJ0IG9mIHByb2Nlc3NpbmcgYW4gaW1hZ2UuICBXZSBkZXRlcm1pbmUKLSAqIHdoaWNoIG1vZHVsZXMgd2lsbCBiZSB1c2VkIGFuZCBnaXZlIHRoZW0gYXBwcm9wcmlhdGUgaW5pdGlhbGl6YXRpb24gY2FsbHMuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9jb21wcmVzc19tYXN0ZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICAvKiBJbml0aWFsaXplIG1hc3RlciBjb250cm9sIChpbmNsdWRlcyBwYXJhbWV0ZXIgY2hlY2tpbmcvcHJvY2Vzc2luZykgKi8KLSAgamluaXRfY19tYXN0ZXJfY29udHJvbChjaW5mbywgRkFMU0UgLyogZnVsbCBjb21wcmVzc2lvbiAqLyk7Ci0KLSAgLyogUHJlcHJvY2Vzc2luZyAqLwotICBpZiAoISBjaW5mby0+cmF3X2RhdGFfaW4pIHsKLSAgICBqaW5pdF9jb2xvcl9jb252ZXJ0ZXIoY2luZm8pOwotICAgIGppbml0X2Rvd25zYW1wbGVyKGNpbmZvKTsKLSAgICBqaW5pdF9jX3ByZXBfY29udHJvbGxlcihjaW5mbywgRkFMU0UgLyogbmV2ZXIgbmVlZCBmdWxsIGJ1ZmZlciBoZXJlICovKTsKLSAgfQotICAvKiBGb3J3YXJkIERDVCAqLwotICBqaW5pdF9mb3J3YXJkX2RjdChjaW5mbyk7Ci0gIC8qIEVudHJvcHkgZW5jb2Rpbmc6IGVpdGhlciBIdWZmbWFuIG9yIGFyaXRobWV0aWMgY29kaW5nLiAqLwotICBpZiAoY2luZm8tPmFyaXRoX2NvZGUpIHsKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0FSSVRIX05PVElNUEwpOwotICB9IGVsc2UgewotICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgewotI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECi0gICAgICBqaW5pdF9waHVmZl9lbmNvZGVyKGNpbmZvKTsKLSNlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0jZW5kaWYKLSAgICB9IGVsc2UKLSAgICAgIGppbml0X2h1ZmZfZW5jb2RlcihjaW5mbyk7Ci0gIH0KLQotICAvKiBOZWVkIGEgZnVsbC1pbWFnZSBjb2VmZmljaWVudCBidWZmZXIgaW4gYW55IG11bHRpLXBhc3MgbW9kZS4gKi8KLSAgamluaXRfY19jb2VmX2NvbnRyb2xsZXIoY2luZm8sCi0JCShib29sZWFuKSAoY2luZm8tPm51bV9zY2FucyA+IDEgfHwgY2luZm8tPm9wdGltaXplX2NvZGluZykpOwotICBqaW5pdF9jX21haW5fY29udHJvbGxlcihjaW5mbywgRkFMU0UgLyogbmV2ZXIgbmVlZCBmdWxsIGJ1ZmZlciBoZXJlICovKTsKLQotICBqaW5pdF9tYXJrZXJfd3JpdGVyKGNpbmZvKTsKLQotICAvKiBXZSBjYW4gbm93IHRlbGwgdGhlIG1lbW9yeSBtYW5hZ2VyIHRvIGFsbG9jYXRlIHZpcnR1YWwgYXJyYXlzLiAqLwotICAoKmNpbmZvLT5tZW0tPnJlYWxpemVfdmlydF9hcnJheXMpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0KLSAgLyogV3JpdGUgdGhlIGRhdGFzdHJlYW0gaGVhZGVyIChTT0kpIGltbWVkaWF0ZWx5LgotICAgKiBGcmFtZSBhbmQgc2NhbiBoZWFkZXJzIGFyZSBwb3N0cG9uZWQgdGlsbCBsYXRlci4KLSAgICogVGhpcyBsZXRzIGFwcGxpY2F0aW9uIGluc2VydCBzcGVjaWFsIG1hcmtlcnMgYWZ0ZXIgdGhlIFNPSS4KLSAgICovCi0gICgqY2luZm8tPm1hcmtlci0+d3JpdGVfZmlsZV9oZWFkZXIpIChjaW5mbyk7Ci19Ci0KLSNlbmRpZiAvL19GWF9KUEVHX1RVUkJPXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNtYWluY3QuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjbWFpbmN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZjJjNDAuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNtYWluY3QuYworKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0jaWYgIWRlZmluZWQoX0ZYX0pQRUdfVFVSQk9fKQotLyoKLSAqIGpjbWFpbmN0LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFpbiBidWZmZXIgY29udHJvbGxlciBmb3IgY29tcHJlc3Npb24uCi0gKiBUaGUgbWFpbiBidWZmZXIgbGllcyBiZXR3ZWVuIHRoZSBwcmUtcHJvY2Vzc29yIGFuZCB0aGUgSlBFRwotICogY29tcHJlc3NvciBwcm9wZXI7IGl0IGhvbGRzIGRvd25zYW1wbGVkIGRhdGEgaW4gdGhlIEpQRUcgY29sb3JzcGFjZS4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyogTm90ZTogY3VycmVudGx5LCB0aGVyZSBpcyBubyBvcGVyYXRpbmcgbW9kZSBpbiB3aGljaCBhIGZ1bGwtaW1hZ2UgYnVmZmVyCi0gKiBpcyBuZWVkZWQgYXQgdGhpcyBzdGVwLiAgSWYgdGhlcmUgd2VyZSwgdGhhdCBtb2RlIGNvdWxkIG5vdCBiZSB1c2VkIHdpdGgKLSAqICJyYXcgZGF0YSIgaW5wdXQsIHNpbmNlIHRoaXMgbW9kdWxlIGlzIGJ5cGFzc2VkIGluIHRoYXQgY2FzZS4gIEhvd2V2ZXIsCi0gKiB3ZSd2ZSBsZWZ0IHRoZSBjb2RlIGhlcmUgZm9yIHBvc3NpYmxlIHVzZSBpbiBzcGVjaWFsIGFwcGxpY2F0aW9ucy4KLSAqLwotI3VuZGVmIEZVTExfTUFJTl9CVUZGRVJfU1VQUE9SVEVECi0KLQotLyogUHJpdmF0ZSBidWZmZXIgY29udHJvbGxlciBvYmplY3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19jX21haW5fY29udHJvbGxlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICBKRElNRU5TSU9OIGN1cl9pTUNVX3JvdzsJLyogbnVtYmVyIG9mIGN1cnJlbnQgaU1DVSByb3cgKi8KLSAgSkRJTUVOU0lPTiByb3dncm91cF9jdHI7CS8qIGNvdW50cyByb3cgZ3JvdXBzIHJlY2VpdmVkIGluIGlNQ1Ugcm93ICovCi0gIGJvb2xlYW4gc3VzcGVuZGVkOwkJLyogcmVtZW1iZXIgaWYgd2Ugc3VzcGVuZGVkIG91dHB1dCAqLwotICBKX0JVRl9NT0RFIHBhc3NfbW9kZTsJCS8qIGN1cnJlbnQgb3BlcmF0aW5nIG1vZGUgKi8KLQotICAvKiBJZiB1c2luZyBqdXN0IGEgc3RyaXAgYnVmZmVyLCB0aGlzIHBvaW50cyB0byB0aGUgZW50aXJlIHNldCBvZiBidWZmZXJzCi0gICAqICh3ZSBhbGxvY2F0ZSBvbmUgZm9yIGVhY2ggY29tcG9uZW50KS4gIEluIHRoZSBmdWxsLWltYWdlIGNhc2UsIHRoaXMKLSAgICogcG9pbnRzIHRvIHRoZSBjdXJyZW50bHkgYWNjZXNzaWJsZSBzdHJpcHMgb2YgdGhlIHZpcnR1YWwgYXJyYXlzLgotICAgKi8KLSAgSlNBTVBBUlJBWSBidWZmZXJbTUFYX0NPTVBPTkVOVFNdOwotCi0jaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKLSAgLyogSWYgdXNpbmcgZnVsbC1pbWFnZSBzdG9yYWdlLCB0aGlzIGFycmF5IGhvbGRzIHBvaW50ZXJzIHRvIHZpcnR1YWwtYXJyYXkKLSAgICogY29udHJvbCBibG9ja3MgZm9yIGVhY2ggY29tcG9uZW50LiAgVW51c2VkIGlmIG5vdCBmdWxsLWltYWdlIHN0b3JhZ2UuCi0gICAqLwotICBqdmlydF9zYXJyYXlfcHRyIHdob2xlX2ltYWdlW01BWF9DT01QT05FTlRTXTsKLSNlbmRpZgotfSBteV9tYWluX2NvbnRyb2xsZXI7Ci0KLXR5cGVkZWYgbXlfbWFpbl9jb250cm9sbGVyICogbXlfbWFpbl9wdHI7Ci0KLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLU1FVEhPRERFRih2b2lkKSBwcm9jZXNzX2RhdGFfc2ltcGxlX21haW4KLQlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIGlucHV0X2J1ZiwKLQkgICAgIEpESU1FTlNJT04gKmluX3Jvd19jdHIsIEpESU1FTlNJT04gaW5fcm93c19hdmFpbCkpOwotI2lmZGVmIEZVTExfTUFJTl9CVUZGRVJfU1VQUE9SVEVECi1NRVRIT0RERUYodm9pZCkgcHJvY2Vzc19kYXRhX2J1ZmZlcl9tYWluCi0JSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBpbnB1dF9idWYsCi0JICAgICBKRElNRU5TSU9OICppbl9yb3dfY3RyLCBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwpKTsKLSNlbmRpZgotCi0KLS8qCi0gKiBJbml0aWFsaXplIGZvciBhIHByb2Nlc3NpbmcgcGFzcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfbWFpbiAoal9jb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKQotewotICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKLQotICAvKiBEbyBub3RoaW5nIGluIHJhdy1kYXRhIG1vZGUuICovCi0gIGlmIChjaW5mby0+cmF3X2RhdGFfaW4pCi0gICAgcmV0dXJuOwotCi0gIG1haW4tPmN1cl9pTUNVX3JvdyA9IDA7CS8qIGluaXRpYWxpemUgY291bnRlcnMgKi8KLSAgbWFpbi0+cm93Z3JvdXBfY3RyID0gMDsKLSAgbWFpbi0+c3VzcGVuZGVkID0gRkFMU0U7Ci0gIG1haW4tPnBhc3NfbW9kZSA9IHBhc3NfbW9kZTsJLyogc2F2ZSBtb2RlIGZvciB1c2UgYnkgcHJvY2Vzc19kYXRhICovCi0KLSAgc3dpdGNoIChwYXNzX21vZGUpIHsKLSAgY2FzZSBKQlVGX1BBU1NfVEhSVToKLSNpZmRlZiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRAotICAgIGlmIChtYWluLT53aG9sZV9pbWFnZVswXSAhPSBOVUxMKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotI2VuZGlmCi0gICAgbWFpbi0+cHViLnByb2Nlc3NfZGF0YSA9IHByb2Nlc3NfZGF0YV9zaW1wbGVfbWFpbjsKLSAgICBicmVhazsKLSNpZmRlZiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRAotICBjYXNlIEpCVUZfU0FWRV9TT1VSQ0U6Ci0gIGNhc2UgSkJVRl9DUkFOS19ERVNUOgotICBjYXNlIEpCVUZfU0FWRV9BTkRfUEFTUzoKLSAgICBpZiAobWFpbi0+d2hvbGVfaW1hZ2VbMF0gPT0gTlVMTCkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKLSAgICBtYWluLT5wdWIucHJvY2Vzc19kYXRhID0gcHJvY2Vzc19kYXRhX2J1ZmZlcl9tYWluOwotICAgIGJyZWFrOwotI2VuZGlmCi0gIGRlZmF1bHQ6Ci0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotICAgIGJyZWFrOwotICB9Ci19Ci0KLQotLyoKLSAqIFByb2Nlc3Mgc29tZSBkYXRhLgotICogVGhpcyByb3V0aW5lIGhhbmRsZXMgdGhlIHNpbXBsZSBwYXNzLXRocm91Z2ggbW9kZSwKLSAqIHdoZXJlIHdlIGhhdmUgb25seSBhIHN0cmlwIGJ1ZmZlci4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXByb2Nlc3NfZGF0YV9zaW1wbGVfbWFpbiAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfY3RyLAotCQkJICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwpCi17Ci0gIG15X21haW5fcHRyIG1haW4gPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOwotCi0gIHdoaWxlIChtYWluLT5jdXJfaU1DVV9yb3cgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzKSB7Ci0gICAgLyogUmVhZCBpbnB1dCBkYXRhIGlmIHdlIGhhdmVuJ3QgZmlsbGVkIHRoZSBtYWluIGJ1ZmZlciB5ZXQgKi8KLSAgICBpZiAobWFpbi0+cm93Z3JvdXBfY3RyIDwgRENUU0laRSkKLSAgICAgICgqY2luZm8tPnByZXAtPnByZV9wcm9jZXNzX2RhdGEpIChjaW5mbywKLQkJCQkJaW5wdXRfYnVmLCBpbl9yb3dfY3RyLCBpbl9yb3dzX2F2YWlsLAotCQkJCQltYWluLT5idWZmZXIsICZtYWluLT5yb3dncm91cF9jdHIsCi0JCQkJCShKRElNRU5TSU9OKSBEQ1RTSVpFKTsKLQotICAgIC8qIElmIHdlIGRvbid0IGhhdmUgYSBmdWxsIGlNQ1Ugcm93IGJ1ZmZlcmVkLCByZXR1cm4gdG8gYXBwbGljYXRpb24gZm9yCi0gICAgICogbW9yZSBkYXRhLiAgTm90ZSB0aGF0IHByZXByb2Nlc3NvciB3aWxsIGFsd2F5cyBwYWQgdG8gZmlsbCB0aGUgaU1DVSByb3cKLSAgICAgKiBhdCB0aGUgYm90dG9tIG9mIHRoZSBpbWFnZS4KLSAgICAgKi8KLSAgICBpZiAobWFpbi0+cm93Z3JvdXBfY3RyICE9IERDVFNJWkUpCi0gICAgICByZXR1cm47Ci0KLSAgICAvKiBTZW5kIHRoZSBjb21wbGV0ZWQgcm93IHRvIHRoZSBjb21wcmVzc29yICovCi0gICAgaWYgKCEgKCpjaW5mby0+Y29lZi0+Y29tcHJlc3NfZGF0YSkgKGNpbmZvLCBtYWluLT5idWZmZXIpKSB7Ci0gICAgICAvKiBJZiBjb21wcmVzc29yIGRpZCBub3QgY29uc3VtZSB0aGUgd2hvbGUgcm93LCB0aGVuIHdlIG11c3QgbmVlZCB0bwotICAgICAgICogc3VzcGVuZCBwcm9jZXNzaW5nIGFuZCByZXR1cm4gdG8gdGhlIGFwcGxpY2F0aW9uLiAgSW4gdGhpcyBzaXR1YXRpb24KLSAgICAgICAqIHdlIHByZXRlbmQgd2UgZGlkbid0IHlldCBjb25zdW1lIHRoZSBsYXN0IGlucHV0IHJvdzsgb3RoZXJ3aXNlLCBpZgotICAgICAgICogaXQgaGFwcGVuZWQgdG8gYmUgdGhlIGxhc3Qgcm93IG9mIHRoZSBpbWFnZSwgdGhlIGFwcGxpY2F0aW9uIHdvdWxkCi0gICAgICAgKiB0aGluayB3ZSB3ZXJlIGRvbmUuCi0gICAgICAgKi8KLSAgICAgIGlmICghIG1haW4tPnN1c3BlbmRlZCkgewotCSgqaW5fcm93X2N0ciktLTsKLQltYWluLT5zdXNwZW5kZWQgPSBUUlVFOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvKiBXZSBkaWQgZmluaXNoIHRoZSByb3cuICBVbmRvIG91ciBsaXR0bGUgc3VzcGVuc2lvbiBoYWNrIGlmIGEgcHJldmlvdXMKLSAgICAgKiBjYWxsIHN1c3BlbmRlZDsgdGhlbiBtYXJrIHRoZSBtYWluIGJ1ZmZlciBlbXB0eS4KLSAgICAgKi8KLSAgICBpZiAobWFpbi0+c3VzcGVuZGVkKSB7Ci0gICAgICAoKmluX3Jvd19jdHIpKys7Ci0gICAgICBtYWluLT5zdXNwZW5kZWQgPSBGQUxTRTsKLSAgICB9Ci0gICAgbWFpbi0+cm93Z3JvdXBfY3RyID0gMDsKLSAgICBtYWluLT5jdXJfaU1DVV9yb3crKzsKLSAgfQotfQotCi0KLSNpZmRlZiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRAotCi0vKgotICogUHJvY2VzcyBzb21lIGRhdGEuCi0gKiBUaGlzIHJvdXRpbmUgaGFuZGxlcyBhbGwgb2YgdGhlIG1vZGVzIHRoYXQgdXNlIGEgZnVsbC1zaXplIGJ1ZmZlci4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXByb2Nlc3NfZGF0YV9idWZmZXJfbWFpbiAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfY3RyLAotCQkJICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwpCi17Ci0gIG15X21haW5fcHRyIG1haW4gPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOwotICBpbnQgY2k7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIGJvb2xlYW4gd3JpdGluZyA9IChtYWluLT5wYXNzX21vZGUgIT0gSkJVRl9DUkFOS19ERVNUKTsKLQotICB3aGlsZSAobWFpbi0+Y3VyX2lNQ1Vfcm93IDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cykgewotICAgIC8qIFJlYWxpZ24gdGhlIHZpcnR1YWwgYnVmZmVycyBpZiBhdCB0aGUgc3RhcnQgb2YgYW4gaU1DVSByb3cuICovCi0gICAgaWYgKG1haW4tPnJvd2dyb3VwX2N0ciA9PSAwKSB7Ci0gICAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotCSAgIGNpKyssIGNvbXBwdHIrKykgewotCW1haW4tPmJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLQkgICgoal9jb21tb25fcHRyKSBjaW5mbywgbWFpbi0+d2hvbGVfaW1hZ2VbY2ldLAotCSAgIG1haW4tPmN1cl9pTUNVX3JvdyAqIChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogRENUU0laRSksCi0JICAgKEpESU1FTlNJT04pIChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogRENUU0laRSksIHdyaXRpbmcpOwotICAgICAgfQotICAgICAgLyogSW4gYSByZWFkIHBhc3MsIHByZXRlbmQgd2UganVzdCByZWFkIHNvbWUgc291cmNlIGRhdGEuICovCi0gICAgICBpZiAoISB3cml0aW5nKSB7Ci0JKmluX3Jvd19jdHIgKz0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRTsKLQltYWluLT5yb3dncm91cF9jdHIgPSBEQ1RTSVpFOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIElmIGEgd3JpdGUgcGFzcywgcmVhZCBpbnB1dCBkYXRhIHVudGlsIHRoZSBjdXJyZW50IGlNQ1Ugcm93IGlzIGZ1bGwuICovCi0gICAgLyogTm90ZTogcHJlcHJvY2Vzc29yIHdpbGwgcGFkIGlmIG5lY2Vzc2FyeSB0byBmaWxsIHRoZSBsYXN0IGlNQ1Ugcm93LiAqLwotICAgIGlmICh3cml0aW5nKSB7Ci0gICAgICAoKmNpbmZvLT5wcmVwLT5wcmVfcHJvY2Vzc19kYXRhKSAoY2luZm8sCi0JCQkJCWlucHV0X2J1ZiwgaW5fcm93X2N0ciwgaW5fcm93c19hdmFpbCwKLQkJCQkJbWFpbi0+YnVmZmVyLCAmbWFpbi0+cm93Z3JvdXBfY3RyLAotCQkJCQkoSkRJTUVOU0lPTikgRENUU0laRSk7Ci0gICAgICAvKiBSZXR1cm4gdG8gYXBwbGljYXRpb24gaWYgd2UgbmVlZCBtb3JlIGRhdGEgdG8gZmlsbCB0aGUgaU1DVSByb3cuICovCi0gICAgICBpZiAobWFpbi0+cm93Z3JvdXBfY3RyIDwgRENUU0laRSkKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgLyogRW1pdCBkYXRhLCB1bmxlc3MgdGhpcyBpcyBhIHNpbmstb25seSBwYXNzLiAqLwotICAgIGlmIChtYWluLT5wYXNzX21vZGUgIT0gSkJVRl9TQVZFX1NPVVJDRSkgewotICAgICAgaWYgKCEgKCpjaW5mby0+Y29lZi0+Y29tcHJlc3NfZGF0YSkgKGNpbmZvLCBtYWluLT5idWZmZXIpKSB7Ci0JLyogSWYgY29tcHJlc3NvciBkaWQgbm90IGNvbnN1bWUgdGhlIHdob2xlIHJvdywgdGhlbiB3ZSBtdXN0IG5lZWQgdG8KLQkgKiBzdXNwZW5kIHByb2Nlc3NpbmcgYW5kIHJldHVybiB0byB0aGUgYXBwbGljYXRpb24uICBJbiB0aGlzIHNpdHVhdGlvbgotCSAqIHdlIHByZXRlbmQgd2UgZGlkbid0IHlldCBjb25zdW1lIHRoZSBsYXN0IGlucHV0IHJvdzsgb3RoZXJ3aXNlLCBpZgotCSAqIGl0IGhhcHBlbmVkIHRvIGJlIHRoZSBsYXN0IHJvdyBvZiB0aGUgaW1hZ2UsIHRoZSBhcHBsaWNhdGlvbiB3b3VsZAotCSAqIHRoaW5rIHdlIHdlcmUgZG9uZS4KLQkgKi8KLQlpZiAoISBtYWluLT5zdXNwZW5kZWQpIHsKLQkgICgqaW5fcm93X2N0ciktLTsKLQkgIG1haW4tPnN1c3BlbmRlZCA9IFRSVUU7Ci0JfQotCXJldHVybjsKLSAgICAgIH0KLSAgICAgIC8qIFdlIGRpZCBmaW5pc2ggdGhlIHJvdy4gIFVuZG8gb3VyIGxpdHRsZSBzdXNwZW5zaW9uIGhhY2sgaWYgYSBwcmV2aW91cwotICAgICAgICogY2FsbCBzdXNwZW5kZWQ7IHRoZW4gbWFyayB0aGUgbWFpbiBidWZmZXIgZW1wdHkuCi0gICAgICAgKi8KLSAgICAgIGlmIChtYWluLT5zdXNwZW5kZWQpIHsKLQkoKmluX3Jvd19jdHIpKys7Ci0JbWFpbi0+c3VzcGVuZGVkID0gRkFMU0U7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogSWYgZ2V0IGhlcmUsIHdlIGFyZSBkb25lIHdpdGggdGhpcyBpTUNVIHJvdy4gIE1hcmsgYnVmZmVyIGVtcHR5LiAqLwotICAgIG1haW4tPnJvd2dyb3VwX2N0ciA9IDA7Ci0gICAgbWFpbi0+Y3VyX2lNQ1Vfcm93Kys7Ci0gIH0KLX0KLQotI2VuZGlmIC8qIEZVTExfTUFJTl9CVUZGRVJfU1VQUE9SVEVEICovCi0KLQotLyoKLSAqIEluaXRpYWxpemUgbWFpbiBidWZmZXIgY29udHJvbGxlci4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2NfbWFpbl9jb250cm9sbGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKQotewotICBteV9tYWluX3B0ciBtYWluOwotICBpbnQgY2k7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0KLSAgbWFpbiA9IChteV9tYWluX3B0cikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCVNJWkVPRihteV9tYWluX2NvbnRyb2xsZXIpKTsKLSAgY2luZm8tPm1haW4gPSAoc3RydWN0IGpwZWdfY19tYWluX2NvbnRyb2xsZXIgKikgbWFpbjsKLSAgbWFpbi0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX21haW47Ci0KLSAgLyogV2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgYSBidWZmZXIgaW4gcmF3LWRhdGEgbW9kZS4gKi8KLSAgaWYgKGNpbmZvLT5yYXdfZGF0YV9pbikKLSAgICByZXR1cm47Ci0KLSAgLyogQ3JlYXRlIHRoZSBidWZmZXIuICBJdCBob2xkcyBkb3duc2FtcGxlZCBkYXRhLCBzbyBlYWNoIGNvbXBvbmVudAotICAgKiBtYXkgYmUgb2YgYSBkaWZmZXJlbnQgc2l6ZS4KLSAgICovCi0gIGlmIChuZWVkX2Z1bGxfYnVmZmVyKSB7Ci0jaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKLSAgICAvKiBBbGxvY2F0ZSBhIGZ1bGwtaW1hZ2UgdmlydHVhbCBhcnJheSBmb3IgZWFjaCBjb21wb25lbnQgKi8KLSAgICAvKiBOb3RlIHdlIHBhZCB0aGUgYm90dG9tIHRvIGEgbXVsdGlwbGUgb2YgdGhlIGlNQ1UgaGVpZ2h0ICovCi0gICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLQkgY2krKywgY29tcHB0cisrKSB7Ci0gICAgICBtYWluLT53aG9sZV9pbWFnZVtjaV0gPSAoKmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9zYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgRkFMU0UsCi0JIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUsCi0JIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MsCi0JCQkJKGxvbmcpIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpICogRENUU0laRSwKLQkgKEpESU1FTlNJT04pIChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogRENUU0laRSkpOwotICAgIH0KLSNlbHNlCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotI2VuZGlmCi0gIH0gZWxzZSB7Ci0jaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKLSAgICBtYWluLT53aG9sZV9pbWFnZVswXSA9IE5VTEw7IC8qIGZsYWcgZm9yIG5vIHZpcnR1YWwgYXJyYXlzICovCi0jZW5kaWYKLSAgICAvKiBBbGxvY2F0ZSBhIHN0cmlwIGJ1ZmZlciBmb3IgZWFjaCBjb21wb25lbnQgKi8KLSAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotCSBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAgIG1haW4tPmJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKLQkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFLAotCSAoSkRJTUVOU0lPTikgKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7Ci0gICAgfQotICB9Ci19Ci0KLSNlbmRpZiAvL19GWF9KUEVHX1RVUkJPXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNtYXJrZXIuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjbWFya2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYzg5ZDkuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNtYXJrZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDY2NyArMCwwIEBACi0jaWYgIWRlZmluZWQoX0ZYX0pQRUdfVFVSQk9fKQotLyoKLSAqIGpjbWFya2VyLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byB3cml0ZSBKUEVHIGRhdGFzdHJlYW0gbWFya2Vycy4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotdHlwZWRlZiBlbnVtIHsJCQkvKiBKUEVHIG1hcmtlciBjb2RlcyAqLwotICBNX1NPRjAgID0gMHhjMCwKLSAgTV9TT0YxICA9IDB4YzEsCi0gIE1fU09GMiAgPSAweGMyLAotICBNX1NPRjMgID0gMHhjMywKLSAgCi0gIE1fU09GNSAgPSAweGM1LAotICBNX1NPRjYgID0gMHhjNiwKLSAgTV9TT0Y3ICA9IDB4YzcsCi0gIAotICBNX0pQRyAgID0gMHhjOCwKLSAgTV9TT0Y5ICA9IDB4YzksCi0gIE1fU09GMTAgPSAweGNhLAotICBNX1NPRjExID0gMHhjYiwKLSAgCi0gIE1fU09GMTMgPSAweGNkLAotICBNX1NPRjE0ID0gMHhjZSwKLSAgTV9TT0YxNSA9IDB4Y2YsCi0gIAotICBNX0RIVCAgID0gMHhjNCwKLSAgCi0gIE1fREFDICAgPSAweGNjLAotICAKLSAgTV9SU1QwICA9IDB4ZDAsCi0gIE1fUlNUMSAgPSAweGQxLAotICBNX1JTVDIgID0gMHhkMiwKLSAgTV9SU1QzICA9IDB4ZDMsCi0gIE1fUlNUNCAgPSAweGQ0LAotICBNX1JTVDUgID0gMHhkNSwKLSAgTV9SU1Q2ICA9IDB4ZDYsCi0gIE1fUlNUNyAgPSAweGQ3LAotICAKLSAgTV9TT0kgICA9IDB4ZDgsCi0gIE1fRU9JICAgPSAweGQ5LAotICBNX1NPUyAgID0gMHhkYSwKLSAgTV9EUVQgICA9IDB4ZGIsCi0gIE1fRE5MICAgPSAweGRjLAotICBNX0RSSSAgID0gMHhkZCwKLSAgTV9ESFAgICA9IDB4ZGUsCi0gIE1fRVhQICAgPSAweGRmLAotICAKLSAgTV9BUFAwICA9IDB4ZTAsCi0gIE1fQVBQMSAgPSAweGUxLAotICBNX0FQUDIgID0gMHhlMiwKLSAgTV9BUFAzICA9IDB4ZTMsCi0gIE1fQVBQNCAgPSAweGU0LAotICBNX0FQUDUgID0gMHhlNSwKLSAgTV9BUFA2ICA9IDB4ZTYsCi0gIE1fQVBQNyAgPSAweGU3LAotICBNX0FQUDggID0gMHhlOCwKLSAgTV9BUFA5ICA9IDB4ZTksCi0gIE1fQVBQMTAgPSAweGVhLAotICBNX0FQUDExID0gMHhlYiwKLSAgTV9BUFAxMiA9IDB4ZWMsCi0gIE1fQVBQMTMgPSAweGVkLAotICBNX0FQUDE0ID0gMHhlZSwKLSAgTV9BUFAxNSA9IDB4ZWYsCi0gIAotICBNX0pQRzAgID0gMHhmMCwKLSAgTV9KUEcxMyA9IDB4ZmQsCi0gIE1fQ09NICAgPSAweGZlLAotICAKLSAgTV9URU0gICA9IDB4MDEsCi0gIAotICBNX0VSUk9SID0gMHgxMDAKLX0gSlBFR19NQVJLRVI7Ci0KLQotLyogUHJpdmF0ZSBzdGF0ZSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX21hcmtlcl93cml0ZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgdW5zaWduZWQgaW50IGxhc3RfcmVzdGFydF9pbnRlcnZhbDsgLyogbGFzdCBEUkkgdmFsdWUgZW1pdHRlZDsgMCBhZnRlciBTT0kgKi8KLX0gbXlfbWFya2VyX3dyaXRlcjsKLQotdHlwZWRlZiBteV9tYXJrZXJfd3JpdGVyICogbXlfbWFya2VyX3B0cjsKLQotCi0vKgotICogQmFzaWMgb3V0cHV0IHJvdXRpbmVzLgotICoKLSAqIE5vdGUgdGhhdCB3ZSBkbyBub3Qgc3VwcG9ydCBzdXNwZW5zaW9uIHdoaWxlIHdyaXRpbmcgYSBtYXJrZXIuCi0gKiBUaGVyZWZvcmUsIGFuIGFwcGxpY2F0aW9uIHVzaW5nIHN1c3BlbnNpb24gbXVzdCBlbnN1cmUgdGhhdCB0aGVyZSBpcwotICogZW5vdWdoIGJ1ZmZlciBzcGFjZSBmb3IgdGhlIGluaXRpYWwgbWFya2VycyAodHlwLiA2MDAtNzAwIGJ5dGVzKSBiZWZvcmUKLSAqIGNhbGxpbmcganBlZ19zdGFydF9jb21wcmVzcywgYW5kIGVub3VnaCBzcGFjZSB0byB3cml0ZSB0aGUgdHJhaWxpbmcgRU9JCi0gKiAoYSBmZXcgYnl0ZXMpIGJlZm9yZSBjYWxsaW5nIGpwZWdfZmluaXNoX2NvbXByZXNzLiAgTXVsdGlwYXNzIGNvbXByZXNzaW9uCi0gKiBtb2RlcyBhcmUgbm90IHN1cHBvcnRlZCBhdCBhbGwgd2l0aCBzdXNwZW5zaW9uLCBzbyB0aG9zZSB0d28gYXJlIHRoZSBvbmx5Ci0gKiBwb2ludHMgd2hlcmUgbWFya2VycyB3aWxsIGJlIHdyaXR0ZW4uCi0gKi8KLQotTE9DQUwodm9pZCkKLWVtaXRfYnl0ZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB2YWwpCi0vKiBFbWl0IGEgYnl0ZSAqLwotewotICBzdHJ1Y3QganBlZ19kZXN0aW5hdGlvbl9tZ3IgKiBkZXN0ID0gY2luZm8tPmRlc3Q7Ci0KLSAgKihkZXN0LT5uZXh0X291dHB1dF9ieXRlKSsrID0gKEpPQ1RFVCkgdmFsOwotICBpZiAoLS1kZXN0LT5mcmVlX2luX2J1ZmZlciA9PSAwKSB7Ci0gICAgaWYgKCEgKCpkZXN0LT5lbXB0eV9vdXRwdXRfYnVmZmVyKSAoY2luZm8pKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DQU5UX1NVU1BFTkQpOwotICB9Ci19Ci0KLQotTE9DQUwodm9pZCkKLWVtaXRfbWFya2VyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlBFR19NQVJLRVIgbWFyaykKLS8qIEVtaXQgYSBtYXJrZXIgY29kZSAqLwotewotICBlbWl0X2J5dGUoY2luZm8sIDB4RkYpOwotICBlbWl0X2J5dGUoY2luZm8sIChpbnQpIG1hcmspOwotfQotCi0KLUxPQ0FMKHZvaWQpCi1lbWl0XzJieXRlcyAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB2YWx1ZSkKLS8qIEVtaXQgYSAyLWJ5dGUgaW50ZWdlcjsgdGhlc2UgYXJlIGFsd2F5cyBNU0IgZmlyc3QgaW4gSlBFRyBmaWxlcyAqLwotewotICBlbWl0X2J5dGUoY2luZm8sICh2YWx1ZSA+PiA4KSAmIDB4RkYpOwotICBlbWl0X2J5dGUoY2luZm8sIHZhbHVlICYgMHhGRik7Ci19Ci0KLQotLyoKLSAqIFJvdXRpbmVzIHRvIHdyaXRlIHNwZWNpZmljIG1hcmtlciB0eXBlcy4KLSAqLwotCi1MT0NBTChpbnQpCi1lbWl0X2RxdCAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBpbmRleCkKLS8qIEVtaXQgYSBEUVQgbWFya2VyICovCi0vKiBSZXR1cm5zIHRoZSBwcmVjaXNpb24gdXNlZCAoMCA9IDhiaXRzLCAxID0gMTZiaXRzKSBmb3IgYmFzZWxpbmUgY2hlY2tpbmcgKi8KLXsKLSAgSlFVQU5UX1RCTCAqIHF0YmwgPSBjaW5mby0+cXVhbnRfdGJsX3B0cnNbaW5kZXhdOwotICBpbnQgcHJlYzsKLSAgaW50IGk7Ci0KLSAgaWYgKHF0YmwgPT0gTlVMTCkKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9OT19RVUFOVF9UQUJMRSwgaW5kZXgpOwotCi0gIHByZWMgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgewotICAgIGlmIChxdGJsLT5xdWFudHZhbFtpXSA+IDI1NSkKLSAgICAgIHByZWMgPSAxOwotICB9Ci0KLSAgaWYgKCEgcXRibC0+c2VudF90YWJsZSkgewotICAgIGVtaXRfbWFya2VyKGNpbmZvLCBNX0RRVCk7Ci0KLSAgICBlbWl0XzJieXRlcyhjaW5mbywgcHJlYyA/IERDVFNJWkUyKjIgKyAxICsgMiA6IERDVFNJWkUyICsgMSArIDIpOwotCi0gICAgZW1pdF9ieXRlKGNpbmZvLCBpbmRleCArIChwcmVjPDw0KSk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgewotICAgICAgLyogVGhlIHRhYmxlIGVudHJpZXMgbXVzdCBiZSBlbWl0dGVkIGluIHppZ3phZyBvcmRlci4gKi8KLSAgICAgIHVuc2lnbmVkIGludCBxdmFsID0gcXRibC0+cXVhbnR2YWxbanBlZ19uYXR1cmFsX29yZGVyW2ldXTsKLSAgICAgIGlmIChwcmVjKQotCWVtaXRfYnl0ZShjaW5mbywgKGludCkgKHF2YWwgPj4gOCkpOwotICAgICAgZW1pdF9ieXRlKGNpbmZvLCAoaW50KSAocXZhbCAmIDB4RkYpKTsKLSAgICB9Ci0KLSAgICBxdGJsLT5zZW50X3RhYmxlID0gVFJVRTsKLSAgfQotCi0gIHJldHVybiBwcmVjOwotfQotCi0KLUxPQ0FMKHZvaWQpCi1lbWl0X2RodCAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBpbmRleCwgYm9vbGVhbiBpc19hYykKLS8qIEVtaXQgYSBESFQgbWFya2VyICovCi17Ci0gIEpIVUZGX1RCTCAqIGh0Ymw7Ci0gIGludCBsZW5ndGgsIGk7Ci0gIAotICBpZiAoaXNfYWMpIHsKLSAgICBodGJsID0gY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbaW5kZXhdOwotICAgIGluZGV4ICs9IDB4MTA7CQkvKiBvdXRwdXQgaW5kZXggaGFzIEFDIGJpdCBzZXQgKi8KLSAgfSBlbHNlIHsKLSAgICBodGJsID0gY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbaW5kZXhdOwotICB9Ci0KLSAgaWYgKGh0YmwgPT0gTlVMTCkKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9OT19IVUZGX1RBQkxFLCBpbmRleCk7Ci0gIAotICBpZiAoISBodGJsLT5zZW50X3RhYmxlKSB7Ci0gICAgZW1pdF9tYXJrZXIoY2luZm8sIE1fREhUKTsKLSAgICAKLSAgICBsZW5ndGggPSAwOwotICAgIGZvciAoaSA9IDE7IGkgPD0gMTY7IGkrKykKLSAgICAgIGxlbmd0aCArPSBodGJsLT5iaXRzW2ldOwotICAgIAotICAgIGVtaXRfMmJ5dGVzKGNpbmZvLCBsZW5ndGggKyAyICsgMSArIDE2KTsKLSAgICBlbWl0X2J5dGUoY2luZm8sIGluZGV4KTsKLSAgICAKLSAgICBmb3IgKGkgPSAxOyBpIDw9IDE2OyBpKyspCi0gICAgICBlbWl0X2J5dGUoY2luZm8sIGh0YmwtPmJpdHNbaV0pOwotICAgIAotICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgIGVtaXRfYnl0ZShjaW5mbywgaHRibC0+aHVmZnZhbFtpXSk7Ci0gICAgCi0gICAgaHRibC0+c2VudF90YWJsZSA9IFRSVUU7Ci0gIH0KLX0KLQotCi1MT0NBTCh2b2lkKQotZW1pdF9kYWMgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotLyogRW1pdCBhIERBQyBtYXJrZXIgKi8KLS8qIFNpbmNlIHRoZSB1c2VmdWwgaW5mbyBpcyBzbyBzbWFsbCwgd2Ugd2FudCB0byBlbWl0IGFsbCB0aGUgdGFibGVzIGluICovCi0vKiBvbmUgREFDIG1hcmtlci4gIFRoZXJlZm9yZSB0aGlzIHJvdXRpbmUgZG9lcyBpdHMgb3duIHNjYW4gb2YgdGhlIHRhYmxlLiAqLwotewotI2lmZGVmIENfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRAotICBjaGFyIGRjX2luX3VzZVtOVU1fQVJJVEhfVEJMU107Ci0gIGNoYXIgYWNfaW5fdXNlW05VTV9BUklUSF9UQkxTXTsKLSAgaW50IGxlbmd0aCwgaTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fQVJJVEhfVEJMUzsgaSsrKQotICAgIGRjX2luX3VzZVtpXSA9IGFjX2luX3VzZVtpXSA9IDA7Ci0gIAotICBmb3IgKGkgPSAwOyBpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGkrKykgewotICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tpXTsKLSAgICBkY19pbl91c2VbY29tcHB0ci0+ZGNfdGJsX25vXSA9IDE7Ci0gICAgYWNfaW5fdXNlW2NvbXBwdHItPmFjX3RibF9ub10gPSAxOwotICB9Ci0gIAotICBsZW5ndGggPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0FSSVRIX1RCTFM7IGkrKykKLSAgICBsZW5ndGggKz0gZGNfaW5fdXNlW2ldICsgYWNfaW5fdXNlW2ldOwotICAKLSAgZW1pdF9tYXJrZXIoY2luZm8sIE1fREFDKTsKLSAgCi0gIGVtaXRfMmJ5dGVzKGNpbmZvLCBsZW5ndGgqMiArIDIpOwotICAKLSAgZm9yIChpID0gMDsgaSA8IE5VTV9BUklUSF9UQkxTOyBpKyspIHsKLSAgICBpZiAoZGNfaW5fdXNlW2ldKSB7Ci0gICAgICBlbWl0X2J5dGUoY2luZm8sIGkpOwotICAgICAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+YXJpdGhfZGNfTFtpXSArIChjaW5mby0+YXJpdGhfZGNfVVtpXTw8NCkpOwotICAgIH0KLSAgICBpZiAoYWNfaW5fdXNlW2ldKSB7Ci0gICAgICBlbWl0X2J5dGUoY2luZm8sIGkgKyAweDEwKTsKLSAgICAgIGVtaXRfYnl0ZShjaW5mbywgY2luZm8tPmFyaXRoX2FjX0tbaV0pOwotICAgIH0KLSAgfQotI2VuZGlmIC8qIENfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRCAqLwotfQotCi0KLUxPQ0FMKHZvaWQpCi1lbWl0X2RyaSAoal9jb21wcmVzc19wdHIgY2luZm8pCi0vKiBFbWl0IGEgRFJJIG1hcmtlciAqLwotewotICBlbWl0X21hcmtlcihjaW5mbywgTV9EUkkpOwotICAKLSAgZW1pdF8yYnl0ZXMoY2luZm8sIDQpOwkvKiBmaXhlZCBsZW5ndGggKi8KLQotICBlbWl0XzJieXRlcyhjaW5mbywgKGludCkgY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpOwotfQotCi0KLUxPQ0FMKHZvaWQpCi1lbWl0X3NvZiAoal9jb21wcmVzc19wdHIgY2luZm8sIEpQRUdfTUFSS0VSIGNvZGUpCi0vKiBFbWl0IGEgU09GIG1hcmtlciAqLwotewotICBpbnQgY2k7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIAotICBlbWl0X21hcmtlcihjaW5mbywgY29kZSk7Ci0gIAotICBlbWl0XzJieXRlcyhjaW5mbywgMyAqIGNpbmZvLT5udW1fY29tcG9uZW50cyArIDIgKyA1ICsgMSk7IC8qIGxlbmd0aCAqLwotCi0gIC8qIE1ha2Ugc3VyZSBpbWFnZSBpc24ndCBiaWdnZXIgdGhhbiBTT0YgZmllbGQgY2FuIGhhbmRsZSAqLwotICBpZiAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgPiA2NTUzNUwgfHwKLSAgICAgIChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggPiA2NTUzNUwpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfSU1BR0VfVE9PX0JJRywgKHVuc2lnbmVkIGludCkgNjU1MzUpOwotCi0gIGVtaXRfYnl0ZShjaW5mbywgY2luZm8tPmRhdGFfcHJlY2lzaW9uKTsKLSAgZW1pdF8yYnl0ZXMoY2luZm8sIChpbnQpIGNpbmZvLT5pbWFnZV9oZWlnaHQpOwotICBlbWl0XzJieXRlcyhjaW5mbywgKGludCkgY2luZm8tPmltYWdlX3dpZHRoKTsKLQotICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5udW1fY29tcG9uZW50cyk7Ci0KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICBlbWl0X2J5dGUoY2luZm8sIGNvbXBwdHItPmNvbXBvbmVudF9pZCk7Ci0gICAgZW1pdF9ieXRlKGNpbmZvLCAoY29tcHB0ci0+aF9zYW1wX2ZhY3RvciA8PCA0KSArIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOwotICAgIGVtaXRfYnl0ZShjaW5mbywgY29tcHB0ci0+cXVhbnRfdGJsX25vKTsKLSAgfQotfQotCi0KLUxPQ0FMKHZvaWQpCi1lbWl0X3NvcyAoal9jb21wcmVzc19wdHIgY2luZm8pCi0vKiBFbWl0IGEgU09TIG1hcmtlciAqLwotewotICBpbnQgaSwgdGQsIHRhOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICAKLSAgZW1pdF9tYXJrZXIoY2luZm8sIE1fU09TKTsKLSAgCi0gIGVtaXRfMmJ5dGVzKGNpbmZvLCAyICogY2luZm8tPmNvbXBzX2luX3NjYW4gKyAyICsgMSArIDMpOyAvKiBsZW5ndGggKi8KLSAgCi0gIGVtaXRfYnl0ZShjaW5mbywgY2luZm8tPmNvbXBzX2luX3NjYW4pOwotICAKLSAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBpKyspIHsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9baV07Ci0gICAgZW1pdF9ieXRlKGNpbmZvLCBjb21wcHRyLT5jb21wb25lbnRfaWQpOwotICAgIHRkID0gY29tcHB0ci0+ZGNfdGJsX25vOwotICAgIHRhID0gY29tcHB0ci0+YWNfdGJsX25vOwotICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgewotICAgICAgLyogUHJvZ3Jlc3NpdmUgbW9kZTogb25seSBEQyBvciBvbmx5IEFDIHRhYmxlcyBhcmUgdXNlZCBpbiBvbmUgc2NhbjsKLSAgICAgICAqIGZ1cnRoZXJtb3JlLCBIdWZmbWFuIGNvZGluZyBvZiBEQyByZWZpbmVtZW50IHVzZXMgbm8gdGFibGUgYXQgYWxsLgotICAgICAgICogV2UgZW1pdCAwIGZvciB1bnVzZWQgZmllbGQocyk7IHRoaXMgaXMgcmVjb21tZW5kZWQgYnkgdGhlIFAmTSB0ZXh0Ci0gICAgICAgKiBidXQgZG9lcyBub3Qgc2VlbSB0byBiZSBzcGVjaWZpZWQgaW4gdGhlIHN0YW5kYXJkLgotICAgICAgICovCi0gICAgICBpZiAoY2luZm8tPlNzID09IDApIHsKLQl0YSA9IDA7CQkJLyogREMgc2NhbiAqLwotCWlmIChjaW5mby0+QWggIT0gMCAmJiAhY2luZm8tPmFyaXRoX2NvZGUpCi0JICB0ZCA9IDA7CQkvKiBubyBEQyB0YWJsZSBlaXRoZXIgKi8KLSAgICAgIH0gZWxzZSB7Ci0JdGQgPSAwOwkJCS8qIEFDIHNjYW4gKi8KLSAgICAgIH0KLSAgICB9Ci0gICAgZW1pdF9ieXRlKGNpbmZvLCAodGQgPDwgNCkgKyB0YSk7Ci0gIH0KLQotICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5Tcyk7Ci0gIGVtaXRfYnl0ZShjaW5mbywgY2luZm8tPlNlKTsKLSAgZW1pdF9ieXRlKGNpbmZvLCAoY2luZm8tPkFoIDw8IDQpICsgY2luZm8tPkFsKTsKLX0KLQotCi1MT0NBTCh2b2lkKQotZW1pdF9qZmlmX2FwcDAgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotLyogRW1pdCBhIEpGSUYtY29tcGxpYW50IEFQUDAgbWFya2VyICovCi17Ci0gIC8qCi0gICAqIExlbmd0aCBvZiBBUFAwIGJsb2NrCSgyIGJ5dGVzKQotICAgKiBCbG9jayBJRAkJCSg0IGJ5dGVzIC0gQVNDSUkgIkpGSUYiKQotICAgKiBaZXJvIGJ5dGUJCQkoMSBieXRlIHRvIHRlcm1pbmF0ZSB0aGUgSUQgc3RyaW5nKQotICAgKiBWZXJzaW9uIE1ham9yLCBNaW5vcgkoMiBieXRlcyAtIG1ham9yIGZpcnN0KQotICAgKiBVbml0cwkJCSgxIGJ5dGUgLSAweDAwID0gbm9uZSwgMHgwMSA9IGluY2gsIDB4MDIgPSBjbSkKLSAgICogWGRwdQkJCSgyIGJ5dGVzIC0gZG90cyBwZXIgdW5pdCBob3Jpem9udGFsKQotICAgKiBZZHB1CQkJKDIgYnl0ZXMgLSBkb3RzIHBlciB1bml0IHZlcnRpY2FsKQotICAgKiBUaHVtYm5haWwgWCBzaXplCQkoMSBieXRlKQotICAgKiBUaHVtYm5haWwgWSBzaXplCQkoMSBieXRlKQotICAgKi8KLSAgCi0gIGVtaXRfbWFya2VyKGNpbmZvLCBNX0FQUDApOwotICAKLSAgZW1pdF8yYnl0ZXMoY2luZm8sIDIgKyA0ICsgMSArIDIgKyAxICsgMiArIDIgKyAxICsgMSk7IC8qIGxlbmd0aCAqLwotCi0gIGVtaXRfYnl0ZShjaW5mbywgMHg0QSk7CS8qIElkZW50aWZpZXI6IEFTQ0lJICJKRklGIiAqLwotICBlbWl0X2J5dGUoY2luZm8sIDB4NDYpOwotICBlbWl0X2J5dGUoY2luZm8sIDB4NDkpOwotICBlbWl0X2J5dGUoY2luZm8sIDB4NDYpOwotICBlbWl0X2J5dGUoY2luZm8sIDApOwotICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5KRklGX21ham9yX3ZlcnNpb24pOyAvKiBWZXJzaW9uIGZpZWxkcyAqLwotICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24pOwotICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5kZW5zaXR5X3VuaXQpOyAvKiBQaXhlbCBzaXplIGluZm9ybWF0aW9uICovCi0gIGVtaXRfMmJ5dGVzKGNpbmZvLCAoaW50KSBjaW5mby0+WF9kZW5zaXR5KTsKLSAgZW1pdF8yYnl0ZXMoY2luZm8sIChpbnQpIGNpbmZvLT5ZX2RlbnNpdHkpOwotICBlbWl0X2J5dGUoY2luZm8sIDApOwkJLyogTm8gdGh1bWJuYWlsIGltYWdlICovCi0gIGVtaXRfYnl0ZShjaW5mbywgMCk7Ci19Ci0KLQotTE9DQUwodm9pZCkKLWVtaXRfYWRvYmVfYXBwMTQgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotLyogRW1pdCBhbiBBZG9iZSBBUFAxNCBtYXJrZXIgKi8KLXsKLSAgLyoKLSAgICogTGVuZ3RoIG9mIEFQUDE0IGJsb2NrCSgyIGJ5dGVzKQotICAgKiBCbG9jayBJRAkJCSg1IGJ5dGVzIC0gQVNDSUkgIkFkb2JlIikKLSAgICogVmVyc2lvbiBOdW1iZXIJCSgyIGJ5dGVzIC0gY3VycmVudGx5IDEwMCkKLSAgICogRmxhZ3MwCQkJKDIgYnl0ZXMgLSBjdXJyZW50bHkgMCkKLSAgICogRmxhZ3MxCQkJKDIgYnl0ZXMgLSBjdXJyZW50bHkgMCkKLSAgICogQ29sb3IgdHJhbnNmb3JtCQkoMSBieXRlKQotICAgKgotICAgKiBBbHRob3VnaCBBZG9iZSBUTiA1MTE2IG1lbnRpb25zIFZlcnNpb24gPSAxMDEsIGFsbCB0aGUgQWRvYmUgZmlsZXMKLSAgICogbm93IGluIGNpcmN1bGF0aW9uIHNlZW0gdG8gdXNlIFZlcnNpb24gPSAxMDAsIHNvIHRoYXQncyB3aGF0IHdlIHdyaXRlLgotICAgKgotICAgKiBXZSB3cml0ZSB0aGUgY29sb3IgdHJhbnNmb3JtIGJ5dGUgYXMgMSBpZiB0aGUgSlBFRyBjb2xvciBzcGFjZSBpcwotICAgKiBZQ2JDciwgMiBpZiBpdCdzIFlDQ0ssIDAgb3RoZXJ3aXNlLiAgQWRvYmUncyBkZWZpbml0aW9uIGhhcyB0byBkbyB3aXRoCi0gICAqIHdoZXRoZXIgdGhlIGVuY29kZXIgcGVyZm9ybWVkIGEgdHJhbnNmb3JtYXRpb24sIHdoaWNoIGlzIHByZXR0eSB1c2VsZXNzLgotICAgKi8KLSAgCi0gIGVtaXRfbWFya2VyKGNpbmZvLCBNX0FQUDE0KTsKLSAgCi0gIGVtaXRfMmJ5dGVzKGNpbmZvLCAyICsgNSArIDIgKyAyICsgMiArIDEpOyAvKiBsZW5ndGggKi8KLQotICBlbWl0X2J5dGUoY2luZm8sIDB4NDEpOwkvKiBJZGVudGlmaWVyOiBBU0NJSSAiQWRvYmUiICovCi0gIGVtaXRfYnl0ZShjaW5mbywgMHg2NCk7Ci0gIGVtaXRfYnl0ZShjaW5mbywgMHg2Rik7Ci0gIGVtaXRfYnl0ZShjaW5mbywgMHg2Mik7Ci0gIGVtaXRfYnl0ZShjaW5mbywgMHg2NSk7Ci0gIGVtaXRfMmJ5dGVzKGNpbmZvLCAxMDApOwkvKiBWZXJzaW9uICovCi0gIGVtaXRfMmJ5dGVzKGNpbmZvLCAwKTsJLyogRmxhZ3MwICovCi0gIGVtaXRfMmJ5dGVzKGNpbmZvLCAwKTsJLyogRmxhZ3MxICovCi0gIHN3aXRjaCAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UpIHsKLSAgY2FzZSBKQ1NfWUNiQ3I6Ci0gICAgZW1pdF9ieXRlKGNpbmZvLCAxKTsJLyogQ29sb3IgdHJhbnNmb3JtID0gMSAqLwotICAgIGJyZWFrOwotICBjYXNlIEpDU19ZQ0NLOgotICAgIGVtaXRfYnl0ZShjaW5mbywgMik7CS8qIENvbG9yIHRyYW5zZm9ybSA9IDIgKi8KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBlbWl0X2J5dGUoY2luZm8sIDApOwkvKiBDb2xvciB0cmFuc2Zvcm0gPSAwICovCi0gICAgYnJlYWs7Ci0gIH0KLX0KLQotCi0vKgotICogVGhlc2Ugcm91dGluZXMgYWxsb3cgd3JpdGluZyBhbiBhcmJpdHJhcnkgbWFya2VyIHdpdGggcGFyYW1ldGVycy4KLSAqIFRoZSBvbmx5IGludGVuZGVkIHVzZSBpcyB0byBlbWl0IENPTSBvciBBUFBuIG1hcmtlcnMgYWZ0ZXIgY2FsbGluZwotICogd3JpdGVfZmlsZV9oZWFkZXIgYW5kIGJlZm9yZSBjYWxsaW5nIHdyaXRlX2ZyYW1lX2hlYWRlci4KLSAqIE90aGVyIHVzZXMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIHByb2R1Y2UgZGVzaXJhYmxlIHJlc3VsdHMuCi0gKiBDb3VudGluZyB0aGUgcGFyYW1ldGVyIGJ5dGVzIHByb3Blcmx5IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXdyaXRlX21hcmtlcl9oZWFkZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKLS8qIEVtaXQgYW4gYXJiaXRyYXJ5IG1hcmtlciBoZWFkZXIgKi8KLXsKLSAgaWYgKGRhdGFsZW4gPiAodW5zaWduZWQgaW50KSA2NTUzMykJCS8qIHNhZmV0eSBjaGVjayAqLwotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0xFTkdUSCk7Ci0KLSAgZW1pdF9tYXJrZXIoY2luZm8sIChKUEVHX01BUktFUikgbWFya2VyKTsKLQotICBlbWl0XzJieXRlcyhjaW5mbywgKGludCkgKGRhdGFsZW4gKyAyKSk7CS8qIHRvdGFsIGxlbmd0aCAqLwotfQotCi1NRVRIT0RERUYodm9pZCkKLXdyaXRlX21hcmtlcl9ieXRlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHZhbCkKLS8qIEVtaXQgb25lIGJ5dGUgb2YgbWFya2VyIHBhcmFtZXRlcnMgZm9sbG93aW5nIHdyaXRlX21hcmtlcl9oZWFkZXIgKi8KLXsKLSAgZW1pdF9ieXRlKGNpbmZvLCB2YWwpOwotfQotCi0KLS8qCi0gKiBXcml0ZSBkYXRhc3RyZWFtIGhlYWRlci4KLSAqIFRoaXMgY29uc2lzdHMgb2YgYW4gU09JIGFuZCBvcHRpb25hbCBBUFBuIG1hcmtlcnMuCi0gKiBXZSByZWNvbW1lbmQgdXNlIG9mIHRoZSBKRklGIG1hcmtlciwgYnV0IG5vdCB0aGUgQWRvYmUgbWFya2VyLAotICogd2hlbiB1c2luZyBZQ2JDciBvciBncmF5c2NhbGUgZGF0YS4gIFRoZSBKRklGIG1hcmtlciBzaG91bGQgTk9UCi0gKiBiZSB1c2VkIGZvciBhbnkgb3RoZXIgSlBFRyBjb2xvcnNwYWNlLiAgVGhlIEFkb2JlIG1hcmtlciBpcyBoZWxwZnVsCi0gKiB0byBkaXN0aW5ndWlzaCBSR0IsIENNWUssIGFuZCBZQ0NLIGNvbG9yc3BhY2VzLgotICogTm90ZSB0aGF0IGFuIGFwcGxpY2F0aW9uIGNhbiB3cml0ZSBhZGRpdGlvbmFsIGhlYWRlciBtYXJrZXJzIGFmdGVyCi0gKiBqcGVnX3N0YXJ0X2NvbXByZXNzIHJldHVybnMuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi13cml0ZV9maWxlX2hlYWRlciAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X21hcmtlcl9wdHIgbWFya2VyID0gKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXI7Ci0KLSAgZW1pdF9tYXJrZXIoY2luZm8sIE1fU09JKTsJLyogZmlyc3QgdGhlIFNPSSAqLwotCi0gIC8qIFNPSSBpcyBkZWZpbmVkIHRvIHJlc2V0IHJlc3RhcnQgaW50ZXJ2YWwgdG8gMCAqLwotICBtYXJrZXItPmxhc3RfcmVzdGFydF9pbnRlcnZhbCA9IDA7Ci0KLSAgaWYgKGNpbmZvLT53cml0ZV9KRklGX2hlYWRlcikJLyogbmV4dCBhbiBvcHRpb25hbCBKRklGIEFQUDAgKi8KLSAgICBlbWl0X2pmaWZfYXBwMChjaW5mbyk7Ci0gIGlmIChjaW5mby0+d3JpdGVfQWRvYmVfbWFya2VyKSAvKiBuZXh0IGFuIG9wdGlvbmFsIEFkb2JlIEFQUDE0ICovCi0gICAgZW1pdF9hZG9iZV9hcHAxNChjaW5mbyk7Ci19Ci0KLQotLyoKLSAqIFdyaXRlIGZyYW1lIGhlYWRlci4KLSAqIFRoaXMgY29uc2lzdHMgb2YgRFFUIGFuZCBTT0ZuIG1hcmtlcnMuCi0gKiBOb3RlIHRoYXQgd2UgZG8gbm90IGVtaXQgdGhlIFNPRiB1bnRpbCB3ZSBoYXZlIGVtaXR0ZWQgdGhlIERRVChzKS4KLSAqIFRoaXMgYXZvaWRzIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgd2l0aCBpbmNvcnJlY3QgaW1wbGVtZW50YXRpb25zIHRoYXQKLSAqIHRyeSB0byBlcnJvci1jaGVjayB0aGUgcXVhbnQgdGFibGUgbnVtYmVycyBhcyBzb29uIGFzIHRoZXkgc2VlIHRoZSBTT0YuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi13cml0ZV9mcmFtZV9oZWFkZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBpbnQgY2ksIHByZWM7Ci0gIGJvb2xlYW4gaXNfYmFzZWxpbmU7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIAotICAvKiBFbWl0IERRVCBmb3IgZWFjaCBxdWFudGl6YXRpb24gdGFibGUuCi0gICAqIE5vdGUgdGhhdCBlbWl0X2RxdCgpIHN1cHByZXNzZXMgYW55IGR1cGxpY2F0ZSB0YWJsZXMuCi0gICAqLwotICBwcmVjID0gMDsKLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICBwcmVjICs9IGVtaXRfZHF0KGNpbmZvLCBjb21wcHRyLT5xdWFudF90Ymxfbm8pOwotICB9Ci0gIC8qIG5vdyBwcmVjIGlzIG5vbnplcm8gaWZmIHRoZXJlIGFyZSBhbnkgMTYtYml0IHF1YW50IHRhYmxlcy4gKi8KLQotICAvKiBDaGVjayBmb3IgYSBub24tYmFzZWxpbmUgc3BlY2lmaWNhdGlvbi4KLSAgICogTm90ZSB3ZSBhc3N1bWUgdGhhdCBIdWZmbWFuIHRhYmxlIG51bWJlcnMgd29uJ3QgYmUgY2hhbmdlZCBsYXRlci4KLSAgICovCi0gIGlmIChjaW5mby0+YXJpdGhfY29kZSB8fCBjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSB8fAotICAgICAgY2luZm8tPmRhdGFfcHJlY2lzaW9uICE9IDgpIHsKLSAgICBpc19iYXNlbGluZSA9IEZBTFNFOwotICB9IGVsc2UgewotICAgIGlzX2Jhc2VsaW5lID0gVFJVRTsKLSAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotCSBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAgIGlmIChjb21wcHRyLT5kY190Ymxfbm8gPiAxIHx8IGNvbXBwdHItPmFjX3RibF9ubyA+IDEpCi0JaXNfYmFzZWxpbmUgPSBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKHByZWMgJiYgaXNfYmFzZWxpbmUpIHsKLSAgICAgIGlzX2Jhc2VsaW5lID0gRkFMU0U7Ci0gICAgICAvKiBJZiBpdCdzIGJhc2VsaW5lIGV4Y2VwdCBmb3IgcXVhbnRpemVyIHNpemUsIHdhcm4gdGhlIHVzZXIgKi8KLSAgICAgIFRSQUNFTVMoY2luZm8sIDAsIEpUUkNfMTZCSVRfVEFCTEVTKTsKLSAgICB9Ci0gIH0KLQotICAvKiBFbWl0IHRoZSBwcm9wZXIgU09GIG1hcmtlciAqLwotICBpZiAoY2luZm8tPmFyaXRoX2NvZGUpIHsKLSAgICBlbWl0X3NvZihjaW5mbywgTV9TT0Y5KTsJLyogU09GIGNvZGUgZm9yIGFyaXRobWV0aWMgY29kaW5nICovCi0gIH0gZWxzZSB7Ci0gICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKQotICAgICAgZW1pdF9zb2YoY2luZm8sIE1fU09GMik7CS8qIFNPRiBjb2RlIGZvciBwcm9ncmVzc2l2ZSBIdWZmbWFuICovCi0gICAgZWxzZSBpZiAoaXNfYmFzZWxpbmUpCi0gICAgICBlbWl0X3NvZihjaW5mbywgTV9TT0YwKTsJLyogU09GIGNvZGUgZm9yIGJhc2VsaW5lIGltcGxlbWVudGF0aW9uICovCi0gICAgZWxzZQotICAgICAgZW1pdF9zb2YoY2luZm8sIE1fU09GMSk7CS8qIFNPRiBjb2RlIGZvciBub24tYmFzZWxpbmUgSHVmZm1hbiBmaWxlICovCi0gIH0KLX0KLQotCi0vKgotICogV3JpdGUgc2NhbiBoZWFkZXIuCi0gKiBUaGlzIGNvbnNpc3RzIG9mIERIVCBvciBEQUMgbWFya2Vycywgb3B0aW9uYWwgRFJJLCBhbmQgU09TLgotICogQ29tcHJlc3NlZCBkYXRhIHdpbGwgYmUgd3JpdHRlbiBmb2xsb3dpbmcgdGhlIFNPUy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXdyaXRlX3NjYW5faGVhZGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfbWFya2VyX3B0ciBtYXJrZXIgPSAobXlfbWFya2VyX3B0cikgY2luZm8tPm1hcmtlcjsKLSAgaW50IGk7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0KLSAgaWYgKGNpbmZvLT5hcml0aF9jb2RlKSB7Ci0gICAgLyogRW1pdCBhcml0aCBjb25kaXRpb25pbmcgaW5mby4gIFdlIG1heSBoYXZlIHNvbWUgZHVwbGljYXRpb24KLSAgICAgKiBpZiB0aGUgZmlsZSBoYXMgbXVsdGlwbGUgc2NhbnMsIGJ1dCBpdCdzIHNvIHNtYWxsIGl0J3MgaGFyZGx5Ci0gICAgICogd29ydGggd29ycnlpbmcgYWJvdXQuCi0gICAgICovCi0gICAgZW1pdF9kYWMoY2luZm8pOwotICB9IGVsc2UgewotICAgIC8qIEVtaXQgSHVmZm1hbiB0YWJsZXMuCi0gICAgICogTm90ZSB0aGF0IGVtaXRfZGh0KCkgc3VwcHJlc3NlcyBhbnkgZHVwbGljYXRlIHRhYmxlcy4KLSAgICAgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGkrKykgewotICAgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2ldOwotICAgICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7Ci0JLyogUHJvZ3Jlc3NpdmUgbW9kZTogb25seSBEQyBvciBvbmx5IEFDIHRhYmxlcyBhcmUgdXNlZCBpbiBvbmUgc2NhbiAqLwotCWlmIChjaW5mby0+U3MgPT0gMCkgewotCSAgaWYgKGNpbmZvLT5BaCA9PSAwKQkvKiBEQyBuZWVkcyBubyB0YWJsZSBmb3IgcmVmaW5lbWVudCBzY2FuICovCi0JICAgIGVtaXRfZGh0KGNpbmZvLCBjb21wcHRyLT5kY190Ymxfbm8sIEZBTFNFKTsKLQl9IGVsc2UgewotCSAgZW1pdF9kaHQoY2luZm8sIGNvbXBwdHItPmFjX3RibF9ubywgVFJVRSk7Ci0JfQotICAgICAgfSBlbHNlIHsKLQkvKiBTZXF1ZW50aWFsIG1vZGU6IG5lZWQgYm90aCBEQyBhbmQgQUMgdGFibGVzICovCi0JZW1pdF9kaHQoY2luZm8sIGNvbXBwdHItPmRjX3RibF9ubywgRkFMU0UpOwotCWVtaXRfZGh0KGNpbmZvLCBjb21wcHRyLT5hY190Ymxfbm8sIFRSVUUpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIEVtaXQgRFJJIGlmIHJlcXVpcmVkIC0tLSBub3RlIHRoYXQgRFJJIHZhbHVlIGNvdWxkIGNoYW5nZSBmb3IgZWFjaCBzY2FuLgotICAgKiBXZSBhdm9pZCB3YXN0aW5nIHNwYWNlIHdpdGggdW5uZWNlc3NhcnkgRFJJcywgaG93ZXZlci4KLSAgICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCAhPSBtYXJrZXItPmxhc3RfcmVzdGFydF9pbnRlcnZhbCkgewotICAgIGVtaXRfZHJpKGNpbmZvKTsKLSAgICBtYXJrZXItPmxhc3RfcmVzdGFydF9pbnRlcnZhbCA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOwotICB9Ci0KLSAgZW1pdF9zb3MoY2luZm8pOwotfQotCi0KLS8qCi0gKiBXcml0ZSBkYXRhc3RyZWFtIHRyYWlsZXIuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi13cml0ZV9maWxlX3RyYWlsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBlbWl0X21hcmtlcihjaW5mbywgTV9FT0kpOwotfQotCi0KLS8qCi0gKiBXcml0ZSBhbiBhYmJyZXZpYXRlZCB0YWJsZS1zcGVjaWZpY2F0aW9uIGRhdGFzdHJlYW0uCi0gKiBUaGlzIGNvbnNpc3RzIG9mIFNPSSwgRFFUIGFuZCBESFQgdGFibGVzLCBhbmQgRU9JLgotICogQW55IHRhYmxlIHRoYXQgaXMgZGVmaW5lZCBhbmQgbm90IG1hcmtlZCBzZW50X3RhYmxlID0gVFJVRSB3aWxsIGJlCi0gKiBlbWl0dGVkLiAgTm90ZSB0aGF0IGFsbCB0YWJsZXMgd2lsbCBiZSBtYXJrZWQgc2VudF90YWJsZSA9IFRSVUUgYXQgZXhpdC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXdyaXRlX3RhYmxlc19vbmx5IChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaW50IGk7Ci0KLSAgZW1pdF9tYXJrZXIoY2luZm8sIE1fU09JKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTlVNX1FVQU5UX1RCTFM7IGkrKykgewotICAgIGlmIChjaW5mby0+cXVhbnRfdGJsX3B0cnNbaV0gIT0gTlVMTCkKLSAgICAgICh2b2lkKSBlbWl0X2RxdChjaW5mbywgaSk7Ci0gIH0KLQotICBpZiAoISBjaW5mby0+YXJpdGhfY29kZSkgewotICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fSFVGRl9UQkxTOyBpKyspIHsKLSAgICAgIGlmIChjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1tpXSAhPSBOVUxMKQotCWVtaXRfZGh0KGNpbmZvLCBpLCBGQUxTRSk7Ci0gICAgICBpZiAoY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbaV0gIT0gTlVMTCkKLQllbWl0X2RodChjaW5mbywgaSwgVFJVRSk7Ci0gICAgfQotICB9Ci0KLSAgZW1pdF9tYXJrZXIoY2luZm8sIE1fRU9JKTsKLX0KLQotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgbWFya2VyIHdyaXRlciBtb2R1bGUuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9tYXJrZXJfd3JpdGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfbWFya2VyX3B0ciBtYXJrZXI7Ci0KLSAgLyogQ3JlYXRlIHRoZSBzdWJvYmplY3QgKi8KLSAgbWFya2VyID0gKG15X21hcmtlcl9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfbWFya2VyX3dyaXRlcikpOwotICBjaW5mby0+bWFya2VyID0gKHN0cnVjdCBqcGVnX21hcmtlcl93cml0ZXIgKikgbWFya2VyOwotICAvKiBJbml0aWFsaXplIG1ldGhvZCBwb2ludGVycyAqLwotICBtYXJrZXItPnB1Yi53cml0ZV9maWxlX2hlYWRlciA9IHdyaXRlX2ZpbGVfaGVhZGVyOwotICBtYXJrZXItPnB1Yi53cml0ZV9mcmFtZV9oZWFkZXIgPSB3cml0ZV9mcmFtZV9oZWFkZXI7Ci0gIG1hcmtlci0+cHViLndyaXRlX3NjYW5faGVhZGVyID0gd3JpdGVfc2Nhbl9oZWFkZXI7Ci0gIG1hcmtlci0+cHViLndyaXRlX2ZpbGVfdHJhaWxlciA9IHdyaXRlX2ZpbGVfdHJhaWxlcjsKLSAgbWFya2VyLT5wdWIud3JpdGVfdGFibGVzX29ubHkgPSB3cml0ZV90YWJsZXNfb25seTsKLSAgbWFya2VyLT5wdWIud3JpdGVfbWFya2VyX2hlYWRlciA9IHdyaXRlX21hcmtlcl9oZWFkZXI7Ci0gIG1hcmtlci0+cHViLndyaXRlX21hcmtlcl9ieXRlID0gd3JpdGVfbWFya2VyX2J5dGU7Ci0gIC8qIEluaXRpYWxpemUgcHJpdmF0ZSBzdGF0ZSAqLwotICBtYXJrZXItPmxhc3RfcmVzdGFydF9pbnRlcnZhbCA9IDA7Ci19Ci0KLSNlbmRpZiAvL19GWF9KUEVHX1RVUkJPXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNtYXN0ZXIuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjbWFzdGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MzIyYTUuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNtYXN0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDU5MyArMCwwIEBACi0jaWYgIWRlZmluZWQoX0ZYX0pQRUdfVFVSQk9fKQotLyoKLSAqIGpjbWFzdGVyLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBtYXN0ZXIgY29udHJvbCBsb2dpYyBmb3IgdGhlIEpQRUcgY29tcHJlc3Nvci4KLSAqIFRoZXNlIHJvdXRpbmVzIGFyZSBjb25jZXJuZWQgd2l0aCBwYXJhbWV0ZXIgdmFsaWRhdGlvbiwgaW5pdGlhbCBzZXR1cCwKLSAqIGFuZCBpbnRlci1wYXNzIGNvbnRyb2wgKGRldGVybWluaW5nIHRoZSBudW1iZXIgb2YgcGFzc2VzIGFuZCB0aGUgd29yayAKLSAqIHRvIGJlIGRvbmUgaW4gZWFjaCBwYXNzKS4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyogUHJpdmF0ZSBzdGF0ZSAqLwotCi10eXBlZGVmIGVudW0gewotCW1haW5fcGFzcywJCS8qIGlucHV0IGRhdGEsIGFsc28gZG8gZmlyc3Qgb3V0cHV0IHN0ZXAgKi8KLQlodWZmX29wdF9wYXNzLAkJLyogSHVmZm1hbiBjb2RlIG9wdGltaXphdGlvbiBwYXNzICovCi0Jb3V0cHV0X3Bhc3MJCS8qIGRhdGEgb3V0cHV0IHBhc3MgKi8KLX0gY19wYXNzX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGpwZWdfY29tcF9tYXN0ZXIgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgY19wYXNzX3R5cGUgcGFzc190eXBlOwkvKiB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBwYXNzICovCi0KLSAgaW50IHBhc3NfbnVtYmVyOwkJLyogIyBvZiBwYXNzZXMgY29tcGxldGVkICovCi0gIGludCB0b3RhbF9wYXNzZXM7CQkvKiB0b3RhbCAjIG9mIHBhc3NlcyBuZWVkZWQgKi8KLQotICBpbnQgc2Nhbl9udW1iZXI7CQkvKiBjdXJyZW50IGluZGV4IGluIHNjYW5faW5mb1tdICovCi19IG15X2NvbXBfbWFzdGVyOwotCi10eXBlZGVmIG15X2NvbXBfbWFzdGVyICogbXlfbWFzdGVyX3B0cjsKLQotCi0vKgotICogU3VwcG9ydCByb3V0aW5lcyB0aGF0IGRvIHZhcmlvdXMgZXNzZW50aWFsIGNhbGN1bGF0aW9ucy4KLSAqLwotCi1MT0NBTCh2b2lkKQotaW5pdGlhbF9zZXR1cCAoal9jb21wcmVzc19wdHIgY2luZm8pCi0vKiBEbyBjb21wdXRhdGlvbnMgdGhhdCBhcmUgbmVlZGVkIGJlZm9yZSBtYXN0ZXIgc2VsZWN0aW9uIHBoYXNlICovCi17Ci0gIGludCBjaTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgbG9uZyBzYW1wbGVzcGVycm93OwotICBKRElNRU5TSU9OIGpkX3NhbXBsZXNwZXJyb3c7Ci0KLSAgLyogU2FuaXR5IGNoZWNrIG9uIGltYWdlIGRpbWVuc2lvbnMgKi8KLSAgaWYgKGNpbmZvLT5pbWFnZV9oZWlnaHQgPD0gMCB8fCBjaW5mby0+aW1hZ2Vfd2lkdGggPD0gMAotICAgICAgfHwgY2luZm8tPm51bV9jb21wb25lbnRzIDw9IDAgfHwgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPD0gMCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0VNUFRZX0lNQUdFKTsKLQotICAvKiBNYWtlIHN1cmUgaW1hZ2UgaXNuJ3QgYmlnZ2VyIHRoYW4gSSBjYW4gaGFuZGxlICovCi0gIGlmICgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCA+IChsb25nKSBKUEVHX01BWF9ESU1FTlNJT04gfHwKLSAgICAgIChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggPiAobG9uZykgSlBFR19NQVhfRElNRU5TSU9OKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0lNQUdFX1RPT19CSUcsICh1bnNpZ25lZCBpbnQpIEpQRUdfTUFYX0RJTUVOU0lPTik7Ci0KLSAgLyogV2lkdGggb2YgYW4gaW5wdXQgc2NhbmxpbmUgbXVzdCBiZSByZXByZXNlbnRhYmxlIGFzIEpESU1FTlNJT04uICovCi0gIHNhbXBsZXNwZXJyb3cgPSAobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogKGxvbmcpIGNpbmZvLT5pbnB1dF9jb21wb25lbnRzOwotICBqZF9zYW1wbGVzcGVycm93ID0gKEpESU1FTlNJT04pIHNhbXBsZXNwZXJyb3c7Ci0gIGlmICgobG9uZykgamRfc2FtcGxlc3BlcnJvdyAhPSBzYW1wbGVzcGVycm93KQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfV0lEVEhfT1ZFUkZMT1cpOwotCi0gIC8qIEZvciBub3csIHByZWNpc2lvbiBtdXN0IG1hdGNoIGNvbXBpbGVkLWluIHZhbHVlLi4uICovCi0gIGlmIChjaW5mby0+ZGF0YV9wcmVjaXNpb24gIT0gQklUU19JTl9KU0FNUExFKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QUkVDSVNJT04sIGNpbmZvLT5kYXRhX3ByZWNpc2lvbik7Ci0KLSAgLyogQ2hlY2sgdGhhdCBudW1iZXIgb2YgY29tcG9uZW50cyB3b24ndCBleGNlZWQgaW50ZXJuYWwgYXJyYXkgc2l6ZXMgKi8KLSAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyA+IE1BWF9DT01QT05FTlRTKQotICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0NPTVBPTkVOVF9DT1VOVCwgY2luZm8tPm51bV9jb21wb25lbnRzLAotCSAgICAgTUFYX0NPTVBPTkVOVFMpOwotCi0gIC8qIENvbXB1dGUgbWF4aW11bSBzYW1wbGluZyBmYWN0b3JzOyBjaGVjayBmYWN0b3IgdmFsaWRpdHkgKi8KLSAgY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yID0gMTsKLSAgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yID0gMTsKLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICBpZiAoY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcjw9MCB8fCBjb21wcHRyLT5oX3NhbXBfZmFjdG9yPk1BWF9TQU1QX0ZBQ1RPUiB8fAotCWNvbXBwdHItPnZfc2FtcF9mYWN0b3I8PTAgfHwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcj5NQVhfU0FNUF9GQUNUT1IpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9TQU1QTElORyk7Ci0gICAgY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yID0gTUFYKGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciwKLQkJCQkgICBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKTsKLSAgICBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgPSBNQVgoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yLAotCQkJCSAgIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOwotICB9Ci0KLSAgLyogQ29tcHV0ZSBkaW1lbnNpb25zIG9mIGNvbXBvbmVudHMgKi8KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAvKiBGaWxsIGluIHRoZSBjb3JyZWN0IGNvbXBvbmVudF9pbmRleCB2YWx1ZTsgZG9uJ3QgcmVseSBvbiBhcHBsaWNhdGlvbiAqLwotICAgIGNvbXBwdHItPmNvbXBvbmVudF9pbmRleCA9IGNpOwotICAgIC8qIEZvciBjb21wcmVzc2lvbiwgd2UgbmV2ZXIgZG8gRENUIHNjYWxpbmcuICovCi0gICAgY29tcHB0ci0+RENUX3NjYWxlZF9zaXplID0gRENUU0laRTsKLSAgICAvKiBTaXplIGluIERDVCBibG9ja3MgKi8KLSAgICBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgPSAoSkRJTUVOU0lPTikKLSAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCAqIChsb25nKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yLAotCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7Ci0gICAgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCAqIChsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAotCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7Ci0gICAgLyogU2l6ZSBpbiBzYW1wbGVzICovCi0gICAgY29tcHB0ci0+ZG93bnNhbXBsZWRfd2lkdGggPSAoSkRJTUVOU0lPTikKLSAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCAqIChsb25nKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yLAotCQkgICAgKGxvbmcpIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3Rvcik7Ci0gICAgY29tcHB0ci0+ZG93bnNhbXBsZWRfaGVpZ2h0ID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ICogKGxvbmcpIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCi0JCSAgICAobG9uZykgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKTsKLSAgICAvKiBNYXJrIGNvbXBvbmVudCBuZWVkZWQgKHRoaXMgZmxhZyBpc24ndCBhY3R1YWxseSB1c2VkIGZvciBjb21wcmVzc2lvbikgKi8KLSAgICBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkID0gVFJVRTsKLSAgfQotCi0gIC8qIENvbXB1dGUgbnVtYmVyIG9mIGZ1bGx5IGludGVybGVhdmVkIE1DVSByb3dzIChudW1iZXIgb2YgdGltZXMgdGhhdAotICAgKiBtYWluIGNvbnRyb2xsZXIgd2lsbCBjYWxsIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIpLgotICAgKi8KLSAgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyA9IChKRElNRU5TSU9OKQotICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsCi0JCSAgKGxvbmcpIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IqRENUU0laRSkpOwotfQotCi0KLSNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLQotTE9DQUwodm9pZCkKLXZhbGlkYXRlX3NjcmlwdCAoal9jb21wcmVzc19wdHIgY2luZm8pCi0vKiBWZXJpZnkgdGhhdCB0aGUgc2NhbiBzY3JpcHQgaW4gY2luZm8tPnNjYW5faW5mb1tdIGlzIHZhbGlkOyBhbHNvCi0gKiBkZXRlcm1pbmUgd2hldGhlciBpdCB1c2VzIHByb2dyZXNzaXZlIEpQRUcsIGFuZCBzZXQgY2luZm8tPnByb2dyZXNzaXZlX21vZGUuCi0gKi8KLXsKLSAgY29uc3QganBlZ19zY2FuX2luZm8gKiBzY2FucHRyOwotICBpbnQgc2Nhbm5vLCBuY29tcHMsIGNpLCBjb2VmaSwgdGhpc2k7Ci0gIGludCBTcywgU2UsIEFoLCBBbDsKLSAgYm9vbGVhbiBjb21wb25lbnRfc2VudFtNQVhfQ09NUE9ORU5UU107Ci0jaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKLSAgaW50ICogbGFzdF9iaXRwb3NfcHRyOwotICBpbnQgbGFzdF9iaXRwb3NbTUFYX0NPTVBPTkVOVFNdW0RDVFNJWkUyXTsKLSAgLyogLTEgdW50aWwgdGhhdCBjb2VmZmljaWVudCBoYXMgYmVlbiBzZWVuOyB0aGVuIGxhc3QgQWwgZm9yIGl0ICovCi0jZW5kaWYKLQotICBpZiAoY2luZm8tPm51bV9zY2FucyA8PSAwKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TQ0FOX1NDUklQVCwgMCk7Ci0KLSAgLyogRm9yIHNlcXVlbnRpYWwgSlBFRywgYWxsIHNjYW5zIG11c3QgaGF2ZSBTcz0wLCBTZT1EQ1RTSVpFMi0xOwotICAgKiBmb3IgcHJvZ3Jlc3NpdmUgSlBFRywgbm8gc2NhbiBjYW4gaGF2ZSB0aGlzLgotICAgKi8KLSAgc2NhbnB0ciA9IGNpbmZvLT5zY2FuX2luZm87Ci0gIGlmIChzY2FucHRyLT5TcyAhPSAwIHx8IHNjYW5wdHItPlNlICE9IERDVFNJWkUyLTEpIHsKLSNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAotICAgIGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlID0gVFJVRTsKLSAgICBsYXN0X2JpdHBvc19wdHIgPSAmIGxhc3RfYml0cG9zWzBdWzBdOwotICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgCi0gICAgICBmb3IgKGNvZWZpID0gMDsgY29lZmkgPCBEQ1RTSVpFMjsgY29lZmkrKykKLQkqbGFzdF9iaXRwb3NfcHRyKysgPSAtMTsKLSNlbHNlCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOwotI2VuZGlmCi0gIH0gZWxzZSB7Ci0gICAgY2luZm8tPnByb2dyZXNzaXZlX21vZGUgPSBGQUxTRTsKLSAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIAotICAgICAgY29tcG9uZW50X3NlbnRbY2ldID0gRkFMU0U7Ci0gIH0KLQotICBmb3IgKHNjYW5ubyA9IDE7IHNjYW5ubyA8PSBjaW5mby0+bnVtX3NjYW5zOyBzY2FucHRyKyssIHNjYW5ubysrKSB7Ci0gICAgLyogVmFsaWRhdGUgY29tcG9uZW50IGluZGV4ZXMgKi8KLSAgICBuY29tcHMgPSBzY2FucHRyLT5jb21wc19pbl9zY2FuOwotICAgIGlmIChuY29tcHMgPD0gMCB8fCBuY29tcHMgPiBNQVhfQ09NUFNfSU5fU0NBTikKLSAgICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0NPTVBPTkVOVF9DT1VOVCwgbmNvbXBzLCBNQVhfQ09NUFNfSU5fU0NBTik7Ci0gICAgZm9yIChjaSA9IDA7IGNpIDwgbmNvbXBzOyBjaSsrKSB7Ci0gICAgICB0aGlzaSA9IHNjYW5wdHItPmNvbXBvbmVudF9pbmRleFtjaV07Ci0gICAgICBpZiAodGhpc2kgPCAwIHx8IHRoaXNpID49IGNpbmZvLT5udW1fY29tcG9uZW50cykKLQlFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU0NBTl9TQ1JJUFQsIHNjYW5ubyk7Ci0gICAgICAvKiBDb21wb25lbnRzIG11c3QgYXBwZWFyIGluIFNPRiBvcmRlciB3aXRoaW4gZWFjaCBzY2FuICovCi0gICAgICBpZiAoY2kgPiAwICYmIHRoaXNpIDw9IHNjYW5wdHItPmNvbXBvbmVudF9pbmRleFtjaS0xXSkKLQlFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU0NBTl9TQ1JJUFQsIHNjYW5ubyk7Ci0gICAgfQotICAgIC8qIFZhbGlkYXRlIHByb2dyZXNzaW9uIHBhcmFtZXRlcnMgKi8KLSAgICBTcyA9IHNjYW5wdHItPlNzOwotICAgIFNlID0gc2NhbnB0ci0+U2U7Ci0gICAgQWggPSBzY2FucHRyLT5BaDsKLSAgICBBbCA9IHNjYW5wdHItPkFsOwotICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgewotI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECi0gICAgICAvKiBUaGUgSlBFRyBzcGVjIHNpbXBseSBnaXZlcyB0aGUgcmFuZ2VzIDAuLjEzIGZvciBBaCBhbmQgQWwsIGJ1dCB0aGF0Ci0gICAgICAgKiBzZWVtcyB3cm9uZzogdGhlIHVwcGVyIGJvdW5kIG91Z2h0IHRvIGRlcGVuZCBvbiBkYXRhIHByZWNpc2lvbi4KLSAgICAgICAqIFBlcmhhcHMgdGhleSByZWFsbHkgbWVhbnQgMC4uTisxIGZvciBOLWJpdCBwcmVjaXNpb24uCi0gICAgICAgKiBIZXJlIHdlIGFsbG93IDAuLjEwIGZvciA4LWJpdCBkYXRhOyBBbCBsYXJnZXIgdGhhbiAxMCByZXN1bHRzIGluCi0gICAgICAgKiBvdXQtb2YtcmFuZ2UgcmVjb25zdHJ1Y3RlZCBEQyB2YWx1ZXMgZHVyaW5nIHRoZSBmaXJzdCBEQyBzY2FuLAotICAgICAgICogd2hpY2ggbWlnaHQgY2F1c2UgcHJvYmxlbXMgZm9yIHNvbWUgZGVjb2RlcnMuCi0gICAgICAgKi8KLSNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAotI2RlZmluZSBNQVhfQUhfQUwgMTAKLSNlbHNlCi0jZGVmaW5lIE1BWF9BSF9BTCAxMwotI2VuZGlmCi0gICAgICBpZiAoU3MgPCAwIHx8IFNzID49IERDVFNJWkUyIHx8IFNlIDwgU3MgfHwgU2UgPj0gRENUU0laRTIgfHwKLQkgIEFoIDwgMCB8fCBBaCA+IE1BWF9BSF9BTCB8fCBBbCA8IDAgfHwgQWwgPiBNQVhfQUhfQUwpCi0JRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BST0dfU0NSSVBULCBzY2Fubm8pOwotICAgICAgaWYgKFNzID09IDApIHsKLQlpZiAoU2UgIT0gMCkJCS8qIERDIGFuZCBBQyB0b2dldGhlciBub3QgT0sgKi8KLQkgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QUk9HX1NDUklQVCwgc2Nhbm5vKTsKLSAgICAgIH0gZWxzZSB7Ci0JaWYgKG5jb21wcyAhPSAxKQkvKiBBQyBzY2FucyBtdXN0IGJlIGZvciBvbmx5IG9uZSBjb21wb25lbnQgKi8KLQkgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QUk9HX1NDUklQVCwgc2Nhbm5vKTsKLSAgICAgIH0KLSAgICAgIGZvciAoY2kgPSAwOyBjaSA8IG5jb21wczsgY2krKykgewotCWxhc3RfYml0cG9zX3B0ciA9ICYgbGFzdF9iaXRwb3Nbc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4W2NpXV1bMF07Ci0JaWYgKFNzICE9IDAgJiYgbGFzdF9iaXRwb3NfcHRyWzBdIDwgMCkgLyogQUMgd2l0aG91dCBwcmlvciBEQyBzY2FuICovCi0JICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJPR19TQ1JJUFQsIHNjYW5ubyk7Ci0JZm9yIChjb2VmaSA9IFNzOyBjb2VmaSA8PSBTZTsgY29lZmkrKykgewotCSAgaWYgKGxhc3RfYml0cG9zX3B0cltjb2VmaV0gPCAwKSB7Ci0JICAgIC8qIGZpcnN0IHNjYW4gb2YgdGhpcyBjb2VmZmljaWVudCAqLwotCSAgICBpZiAoQWggIT0gMCkKLQkgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJPR19TQ1JJUFQsIHNjYW5ubyk7Ci0JICB9IGVsc2UgewotCSAgICAvKiBub3QgZmlyc3Qgc2NhbiAqLwotCSAgICBpZiAoQWggIT0gbGFzdF9iaXRwb3NfcHRyW2NvZWZpXSB8fCBBbCAhPSBBaC0xKQotCSAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QUk9HX1NDUklQVCwgc2Nhbm5vKTsKLQkgIH0KLQkgIGxhc3RfYml0cG9zX3B0cltjb2VmaV0gPSBBbDsKLQl9Ci0gICAgICB9Ci0jZW5kaWYKLSAgICB9IGVsc2UgewotICAgICAgLyogRm9yIHNlcXVlbnRpYWwgSlBFRywgYWxsIHByb2dyZXNzaW9uIHBhcmFtZXRlcnMgbXVzdCBiZSB0aGVzZTogKi8KLSAgICAgIGlmIChTcyAhPSAwIHx8IFNlICE9IERDVFNJWkUyLTEgfHwgQWggIT0gMCB8fCBBbCAhPSAwKQotCUVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QUk9HX1NDUklQVCwgc2Nhbm5vKTsKLSAgICAgIC8qIE1ha2Ugc3VyZSBjb21wb25lbnRzIGFyZSBub3Qgc2VudCB0d2ljZSAqLwotICAgICAgZm9yIChjaSA9IDA7IGNpIDwgbmNvbXBzOyBjaSsrKSB7Ci0JdGhpc2kgPSBzY2FucHRyLT5jb21wb25lbnRfaW5kZXhbY2ldOwotCWlmIChjb21wb25lbnRfc2VudFt0aGlzaV0pCi0JICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU0NBTl9TQ1JJUFQsIHNjYW5ubyk7Ci0JY29tcG9uZW50X3NlbnRbdGhpc2ldID0gVFJVRTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBOb3cgdmVyaWZ5IHRoYXQgZXZlcnl0aGluZyBnb3Qgc2VudC4gKi8KLSAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7Ci0jaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKLSAgICAvKiBGb3IgcHJvZ3Jlc3NpdmUgbW9kZSwgd2Ugb25seSBjaGVjayB0aGF0IGF0IGxlYXN0IHNvbWUgREMgZGF0YQotICAgICAqIGdvdCBzZW50IGZvciBlYWNoIGNvbXBvbmVudDsgdGhlIHNwZWMgZG9lcyBub3QgcmVxdWlyZSB0aGF0IGFsbCBiaXRzCi0gICAgICogb2YgYWxsIGNvZWZmaWNpZW50cyBiZSB0cmFuc21pdHRlZC4gIFdvdWxkIGl0IGJlIHdpc2VyIHRvIGVuZm9yY2UKLSAgICAgKiB0cmFuc21pc3Npb24gb2YgYWxsIGNvZWZmaWNpZW50IGJpdHM/PwotICAgICAqLwotICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgewotICAgICAgaWYgKGxhc3RfYml0cG9zW2NpXVswXSA8IDApCi0JRVJSRVhJVChjaW5mbywgSkVSUl9NSVNTSU5HX0RBVEEpOwotICAgIH0KLSNlbmRpZgotICB9IGVsc2UgewotICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgewotICAgICAgaWYgKCEgY29tcG9uZW50X3NlbnRbY2ldKQotCUVSUkVYSVQoY2luZm8sIEpFUlJfTUlTU0lOR19EQVRBKTsKLSAgICB9Ci0gIH0KLX0KLQotI2VuZGlmIC8qIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAqLwotCi0KLUxPQ0FMKHZvaWQpCi1zZWxlY3Rfc2Nhbl9wYXJhbWV0ZXJzIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLS8qIFNldCB1cCB0aGUgc2NhbiBwYXJhbWV0ZXJzIGZvciB0aGUgY3VycmVudCBzY2FuICovCi17Ci0gIGludCBjaTsKLQotI2lmZGVmIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAotICBpZiAoY2luZm8tPnNjYW5faW5mbyAhPSBOVUxMKSB7Ci0gICAgLyogUHJlcGFyZSBmb3IgY3VycmVudCBzY2FuIC0tLSB0aGUgc2NyaXB0IGlzIGFscmVhZHkgdmFsaWRhdGVkICovCi0gICAgbXlfbWFzdGVyX3B0ciBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikgY2luZm8tPm1hc3RlcjsKLSAgICBjb25zdCBqcGVnX3NjYW5faW5mbyAqIHNjYW5wdHIgPSBjaW5mby0+c2Nhbl9pbmZvICsgbWFzdGVyLT5zY2FuX251bWJlcjsKLQotICAgIGNpbmZvLT5jb21wc19pbl9zY2FuID0gc2NhbnB0ci0+Y29tcHNfaW5fc2NhbjsKLSAgICBmb3IgKGNpID0gMDsgY2kgPCBzY2FucHRyLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0gICAgICBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV0gPQotCSZjaW5mby0+Y29tcF9pbmZvW3NjYW5wdHItPmNvbXBvbmVudF9pbmRleFtjaV1dOwotICAgIH0KLSAgICBjaW5mby0+U3MgPSBzY2FucHRyLT5TczsKLSAgICBjaW5mby0+U2UgPSBzY2FucHRyLT5TZTsKLSAgICBjaW5mby0+QWggPSBzY2FucHRyLT5BaDsKLSAgICBjaW5mby0+QWwgPSBzY2FucHRyLT5BbDsKLSAgfQotICBlbHNlCi0jZW5kaWYKLSAgewotICAgIC8qIFByZXBhcmUgZm9yIHNpbmdsZSBzZXF1ZW50aWFsLUpQRUcgc2NhbiBjb250YWluaW5nIGFsbCBjb21wb25lbnRzICovCi0gICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyA+IE1BWF9DT01QU19JTl9TQ0FOKQotICAgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQ09NUE9ORU5UX0NPVU5ULCBjaW5mby0+bnVtX2NvbXBvbmVudHMsCi0JICAgICAgIE1BWF9DT01QU19JTl9TQ0FOKTsKLSAgICBjaW5mby0+Y29tcHNfaW5fc2NhbiA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLSAgICAgIGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXSA9ICZjaW5mby0+Y29tcF9pbmZvW2NpXTsKLSAgICB9Ci0gICAgY2luZm8tPlNzID0gMDsKLSAgICBjaW5mby0+U2UgPSBEQ1RTSVpFMi0xOwotICAgIGNpbmZvLT5BaCA9IDA7Ci0gICAgY2luZm8tPkFsID0gMDsKLSAgfQotfQotCi0KLUxPQ0FMKHZvaWQpCi1wZXJfc2Nhbl9zZXR1cCAoal9jb21wcmVzc19wdHIgY2luZm8pCi0vKiBEbyBjb21wdXRhdGlvbnMgdGhhdCBhcmUgbmVlZGVkIGJlZm9yZSBwcm9jZXNzaW5nIGEgSlBFRyBzY2FuICovCi0vKiBjaW5mby0+Y29tcHNfaW5fc2NhbiBhbmQgY2luZm8tPmN1cl9jb21wX2luZm9bXSBhcmUgYWxyZWFkeSBzZXQgKi8KLXsKLSAgaW50IGNpLCBtY3VibGtzLCB0bXA7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIAotICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gPT0gMSkgewotICAgIAotICAgIC8qIE5vbmludGVybGVhdmVkIChzaW5nbGUtY29tcG9uZW50KSBzY2FuICovCi0gICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvWzBdOwotICAgIAotICAgIC8qIE92ZXJhbGwgaW1hZ2Ugc2l6ZSBpbiBNQ1VzICovCi0gICAgY2luZm8tPk1DVXNfcGVyX3JvdyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrczsKLSAgICBjaW5mby0+TUNVX3Jvd3NfaW5fc2NhbiA9IGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3M7Ci0gICAgCi0gICAgLyogRm9yIG5vbmludGVybGVhdmVkIHNjYW4sIGFsd2F5cyBvbmUgYmxvY2sgcGVyIE1DVSAqLwotICAgIGNvbXBwdHItPk1DVV93aWR0aCA9IDE7Ci0gICAgY29tcHB0ci0+TUNVX2hlaWdodCA9IDE7Ci0gICAgY29tcHB0ci0+TUNVX2Jsb2NrcyA9IDE7Ci0gICAgY29tcHB0ci0+TUNVX3NhbXBsZV93aWR0aCA9IERDVFNJWkU7Ci0gICAgY29tcHB0ci0+bGFzdF9jb2xfd2lkdGggPSAxOwotICAgIC8qIEZvciBub25pbnRlcmxlYXZlZCBzY2FucywgaXQgaXMgY29udmVuaWVudCB0byBkZWZpbmUgbGFzdF9yb3dfaGVpZ2h0Ci0gICAgICogYXMgdGhlIG51bWJlciBvZiBibG9jayByb3dzIHByZXNlbnQgaW4gdGhlIGxhc3QgaU1DVSByb3cuCi0gICAgICovCi0gICAgdG1wID0gKGludCkgKGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MgJSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKLSAgICBpZiAodG1wID09IDApIHRtcCA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7Ci0gICAgY29tcHB0ci0+bGFzdF9yb3dfaGVpZ2h0ID0gdG1wOwotICAgIAotICAgIC8qIFByZXBhcmUgYXJyYXkgZGVzY3JpYmluZyBNQ1UgY29tcG9zaXRpb24gKi8KLSAgICBjaW5mby0+YmxvY2tzX2luX01DVSA9IDE7Ci0gICAgY2luZm8tPk1DVV9tZW1iZXJzaGlwWzBdID0gMDsKLSAgICAKLSAgfSBlbHNlIHsKLSAgICAKLSAgICAvKiBJbnRlcmxlYXZlZCAobXVsdGktY29tcG9uZW50KSBzY2FuICovCi0gICAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuIDw9IDAgfHwgY2luZm8tPmNvbXBzX2luX3NjYW4gPiBNQVhfQ09NUFNfSU5fU0NBTikKLSAgICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0NPTVBPTkVOVF9DT1VOVCwgY2luZm8tPmNvbXBzX2luX3NjYW4sCi0JICAgICAgIE1BWF9DT01QU19JTl9TQ0FOKTsKLSAgICAKLSAgICAvKiBPdmVyYWxsIGltYWdlIHNpemUgaW4gTUNVcyAqLwotICAgIGNpbmZvLT5NQ1VzX3Blcl9yb3cgPSAoSkRJTUVOU0lPTikKLSAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCwKLQkJICAgIChsb25nKSAoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yKkRDVFNJWkUpKTsKLSAgICBjaW5mby0+TUNVX3Jvd3NfaW5fc2NhbiA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCwKLQkJICAgIChsb25nKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKkRDVFNJWkUpKTsKLSAgICAKLSAgICBjaW5mby0+YmxvY2tzX2luX01DVSA9IDA7Ci0gICAgCi0gICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0gICAgICAvKiBTYW1wbGluZyBmYWN0b3JzIGdpdmUgIyBvZiBibG9ja3Mgb2YgY29tcG9uZW50IGluIGVhY2ggTUNVICovCi0gICAgICBjb21wcHRyLT5NQ1Vfd2lkdGggPSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOwotICAgICAgY29tcHB0ci0+TUNVX2hlaWdodCA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7Ci0gICAgICBjb21wcHRyLT5NQ1VfYmxvY2tzID0gY29tcHB0ci0+TUNVX3dpZHRoICogY29tcHB0ci0+TUNVX2hlaWdodDsKLSAgICAgIGNvbXBwdHItPk1DVV9zYW1wbGVfd2lkdGggPSBjb21wcHRyLT5NQ1Vfd2lkdGggKiBEQ1RTSVpFOwotICAgICAgLyogRmlndXJlIG51bWJlciBvZiBub24tZHVtbXkgYmxvY2tzIGluIGxhc3QgTUNVIGNvbHVtbiAmIHJvdyAqLwotICAgICAgdG1wID0gKGludCkgKGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAlIGNvbXBwdHItPk1DVV93aWR0aCk7Ci0gICAgICBpZiAodG1wID09IDApIHRtcCA9IGNvbXBwdHItPk1DVV93aWR0aDsKLSAgICAgIGNvbXBwdHItPmxhc3RfY29sX3dpZHRoID0gdG1wOwotICAgICAgdG1wID0gKGludCkgKGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MgJSBjb21wcHRyLT5NQ1VfaGVpZ2h0KTsKLSAgICAgIGlmICh0bXAgPT0gMCkgdG1wID0gY29tcHB0ci0+TUNVX2hlaWdodDsKLSAgICAgIGNvbXBwdHItPmxhc3Rfcm93X2hlaWdodCA9IHRtcDsKLSAgICAgIC8qIFByZXBhcmUgYXJyYXkgZGVzY3JpYmluZyBNQ1UgY29tcG9zaXRpb24gKi8KLSAgICAgIG1jdWJsa3MgPSBjb21wcHRyLT5NQ1VfYmxvY2tzOwotICAgICAgaWYgKGNpbmZvLT5ibG9ja3NfaW5fTUNVICsgbWN1YmxrcyA+IENfTUFYX0JMT0NLU19JTl9NQ1UpCi0JRVJSRVhJVChjaW5mbywgSkVSUl9CQURfTUNVX1NJWkUpOwotICAgICAgd2hpbGUgKG1jdWJsa3MtLSA+IDApIHsKLQljaW5mby0+TUNVX21lbWJlcnNoaXBbY2luZm8tPmJsb2Nrc19pbl9NQ1UrK10gPSBjaTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gIH0KLQotICAvKiBDb252ZXJ0IHJlc3RhcnQgc3BlY2lmaWVkIGluIHJvd3MgdG8gYWN0dWFsIE1DVSBjb3VudC4gKi8KLSAgLyogTm90ZSB0aGF0IGNvdW50IG11c3QgZml0IGluIDE2IGJpdHMsIHNvIHdlIHByb3ZpZGUgbGltaXRpbmcuICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbl9yb3dzID4gMCkgewotICAgIGxvbmcgbm9taW5hbCA9IChsb25nKSBjaW5mby0+cmVzdGFydF9pbl9yb3dzICogKGxvbmcpIGNpbmZvLT5NQ1VzX3Blcl9yb3c7Ci0gICAgY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwgPSAodW5zaWduZWQgaW50KSBNSU4obm9taW5hbCwgNjU1MzVMKTsKLSAgfQotfQotCi0KLS8qCi0gKiBQZXItcGFzcyBzZXR1cC4KLSAqIFRoaXMgaXMgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBwYXNzLiAgV2UgZGV0ZXJtaW5lIHdoaWNoIG1vZHVsZXMKLSAqIHdpbGwgYmUgYWN0aXZlIGR1cmluZyB0aGlzIHBhc3MgYW5kIGdpdmUgdGhlbSBhcHByb3ByaWF0ZSBzdGFydF9wYXNzIGNhbGxzLgotICogV2UgYWxzbyBzZXQgaXNfbGFzdF9wYXNzIHRvIGluZGljYXRlIHdoZXRoZXIgYW55IG1vcmUgcGFzc2VzIHdpbGwgYmUKLSAqIHJlcXVpcmVkLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcHJlcGFyZV9mb3JfcGFzcyAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X21hc3Rlcl9wdHIgbWFzdGVyID0gKG15X21hc3Rlcl9wdHIpIGNpbmZvLT5tYXN0ZXI7Ci0KLSAgc3dpdGNoIChtYXN0ZXItPnBhc3NfdHlwZSkgewotICBjYXNlIG1haW5fcGFzczoKLSAgICAvKiBJbml0aWFsIHBhc3M6IHdpbGwgY29sbGVjdCBpbnB1dCBkYXRhLCBhbmQgZG8gZWl0aGVyIEh1ZmZtYW4KLSAgICAgKiBvcHRpbWl6YXRpb24gb3IgZGF0YSBvdXRwdXQgZm9yIHRoZSBmaXJzdCBzY2FuLgotICAgICAqLwotICAgIHNlbGVjdF9zY2FuX3BhcmFtZXRlcnMoY2luZm8pOwotICAgIHBlcl9zY2FuX3NldHVwKGNpbmZvKTsKLSAgICBpZiAoISBjaW5mby0+cmF3X2RhdGFfaW4pIHsKLSAgICAgICgqY2luZm8tPmNjb252ZXJ0LT5zdGFydF9wYXNzKSAoY2luZm8pOwotICAgICAgKCpjaW5mby0+ZG93bnNhbXBsZS0+c3RhcnRfcGFzcykgKGNpbmZvKTsKLSAgICAgICgqY2luZm8tPnByZXAtPnN0YXJ0X3Bhc3MpIChjaW5mbywgSkJVRl9QQVNTX1RIUlUpOwotICAgIH0KLSAgICAoKmNpbmZvLT5mZGN0LT5zdGFydF9wYXNzKSAoY2luZm8pOwotICAgICgqY2luZm8tPmVudHJvcHktPnN0YXJ0X3Bhc3MpIChjaW5mbywgY2luZm8tPm9wdGltaXplX2NvZGluZyk7Ci0gICAgKCpjaW5mby0+Y29lZi0+c3RhcnRfcGFzcykgKGNpbmZvLAotCQkJCShtYXN0ZXItPnRvdGFsX3Bhc3NlcyA+IDEgPwotCQkJCSBKQlVGX1NBVkVfQU5EX1BBU1MgOiBKQlVGX1BBU1NfVEhSVSkpOwotICAgICgqY2luZm8tPm1haW4tPnN0YXJ0X3Bhc3MpIChjaW5mbywgSkJVRl9QQVNTX1RIUlUpOwotICAgIGlmIChjaW5mby0+b3B0aW1pemVfY29kaW5nKSB7Ci0gICAgICAvKiBObyBpbW1lZGlhdGUgZGF0YSBvdXRwdXQ7IHBvc3Rwb25lIHdyaXRpbmcgZnJhbWUvc2NhbiBoZWFkZXJzICovCi0gICAgICBtYXN0ZXItPnB1Yi5jYWxsX3Bhc3Nfc3RhcnR1cCA9IEZBTFNFOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBXaWxsIHdyaXRlIGZyYW1lL3NjYW4gaGVhZGVycyBhdCBmaXJzdCBqcGVnX3dyaXRlX3NjYW5saW5lcyBjYWxsICovCi0gICAgICBtYXN0ZXItPnB1Yi5jYWxsX3Bhc3Nfc3RhcnR1cCA9IFRSVUU7Ci0gICAgfQotICAgIGJyZWFrOwotI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAotICBjYXNlIGh1ZmZfb3B0X3Bhc3M6Ci0gICAgLyogRG8gSHVmZm1hbiBvcHRpbWl6YXRpb24gZm9yIGEgc2NhbiBhZnRlciB0aGUgZmlyc3Qgb25lLiAqLwotICAgIHNlbGVjdF9zY2FuX3BhcmFtZXRlcnMoY2luZm8pOwotICAgIHBlcl9zY2FuX3NldHVwKGNpbmZvKTsKLSAgICBpZiAoY2luZm8tPlNzICE9IDAgfHwgY2luZm8tPkFoID09IDAgfHwgY2luZm8tPmFyaXRoX2NvZGUpIHsKLSAgICAgICgqY2luZm8tPmVudHJvcHktPnN0YXJ0X3Bhc3MpIChjaW5mbywgVFJVRSk7Ci0gICAgICAoKmNpbmZvLT5jb2VmLT5zdGFydF9wYXNzKSAoY2luZm8sIEpCVUZfQ1JBTktfREVTVCk7Ci0gICAgICBtYXN0ZXItPnB1Yi5jYWxsX3Bhc3Nfc3RhcnR1cCA9IEZBTFNFOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIC8qIFNwZWNpYWwgY2FzZTogSHVmZm1hbiBEQyByZWZpbmVtZW50IHNjYW5zIG5lZWQgbm8gSHVmZm1hbiB0YWJsZQotICAgICAqIGFuZCB0aGVyZWZvcmUgd2UgY2FuIHNraXAgdGhlIG9wdGltaXphdGlvbiBwYXNzIGZvciB0aGVtLgotICAgICAqLwotICAgIG1hc3Rlci0+cGFzc190eXBlID0gb3V0cHV0X3Bhc3M7Ci0gICAgbWFzdGVyLT5wYXNzX251bWJlcisrOwotICAgIC8qRkFMTFRIUk9VR0gqLwotI2VuZGlmCi0gIGNhc2Ugb3V0cHV0X3Bhc3M6Ci0gICAgLyogRG8gYSBkYXRhLW91dHB1dCBwYXNzLiAqLwotICAgIC8qIFdlIG5lZWQgbm90IHJlcGVhdCBwZXItc2NhbiBzZXR1cCBpZiBwcmlvciBvcHRpbWl6YXRpb24gcGFzcyBkaWQgaXQuICovCi0gICAgaWYgKCEgY2luZm8tPm9wdGltaXplX2NvZGluZykgewotICAgICAgc2VsZWN0X3NjYW5fcGFyYW1ldGVycyhjaW5mbyk7Ci0gICAgICBwZXJfc2Nhbl9zZXR1cChjaW5mbyk7Ci0gICAgfQotICAgICgqY2luZm8tPmVudHJvcHktPnN0YXJ0X3Bhc3MpIChjaW5mbywgRkFMU0UpOwotICAgICgqY2luZm8tPmNvZWYtPnN0YXJ0X3Bhc3MpIChjaW5mbywgSkJVRl9DUkFOS19ERVNUKTsKLSAgICAvKiBXZSBlbWl0IGZyYW1lL3NjYW4gaGVhZGVycyBub3cgKi8KLSAgICBpZiAobWFzdGVyLT5zY2FuX251bWJlciA9PSAwKQotICAgICAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9mcmFtZV9oZWFkZXIpIChjaW5mbyk7Ci0gICAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9zY2FuX2hlYWRlcikgKGNpbmZvKTsKLSAgICBtYXN0ZXItPnB1Yi5jYWxsX3Bhc3Nfc3RhcnR1cCA9IEZBTFNFOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSAgfQotCi0gIG1hc3Rlci0+cHViLmlzX2xhc3RfcGFzcyA9IChtYXN0ZXItPnBhc3NfbnVtYmVyID09IG1hc3Rlci0+dG90YWxfcGFzc2VzLTEpOwotCi0gIC8qIFNldCB1cCBwcm9ncmVzcyBtb25pdG9yJ3MgcGFzcyBpbmZvIGlmIHByZXNlbnQgKi8KLSAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7Ci0gICAgY2luZm8tPnByb2dyZXNzLT5jb21wbGV0ZWRfcGFzc2VzID0gbWFzdGVyLT5wYXNzX251bWJlcjsKLSAgICBjaW5mby0+cHJvZ3Jlc3MtPnRvdGFsX3Bhc3NlcyA9IG1hc3Rlci0+dG90YWxfcGFzc2VzOwotICB9Ci19Ci0KLQotLyoKLSAqIFNwZWNpYWwgc3RhcnQtb2YtcGFzcyBob29rLgotICogVGhpcyBpcyBjYWxsZWQgYnkganBlZ193cml0ZV9zY2FubGluZXMgaWYgY2FsbF9wYXNzX3N0YXJ0dXAgaXMgVFJVRS4KLSAqIEluIHNpbmdsZS1wYXNzIHByb2Nlc3NpbmcsIHdlIG5lZWQgdGhpcyBob29rIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0bwotICogd3JpdGUgZnJhbWUvc2NhbiBoZWFkZXJzIGR1cmluZyBqcGVnX3N0YXJ0X2NvbXByZXNzOyB3ZSB3YW50IHRvIGxldCB0aGUKLSAqIGFwcGxpY2F0aW9uIHdyaXRlIENPTSBtYXJrZXJzIGV0Yy4gYmV0d2VlbiBqcGVnX3N0YXJ0X2NvbXByZXNzIGFuZCB0aGUKLSAqIGpwZWdfd3JpdGVfc2NhbmxpbmVzIGxvb3AuCi0gKiBJbiBtdWx0aS1wYXNzIHByb2Nlc3NpbmcsIHRoaXMgcm91dGluZSBpcyBub3QgdXNlZC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXBhc3Nfc3RhcnR1cCAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGNpbmZvLT5tYXN0ZXItPmNhbGxfcGFzc19zdGFydHVwID0gRkFMU0U7IC8qIHJlc2V0IGZsYWcgc28gY2FsbCBvbmx5IG9uY2UgKi8KLQotICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX2ZyYW1lX2hlYWRlcikgKGNpbmZvKTsKLSAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9zY2FuX2hlYWRlcikgKGNpbmZvKTsKLX0KLQotCi0vKgotICogRmluaXNoIHVwIGF0IGVuZCBvZiBwYXNzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZmluaXNoX3Bhc3NfbWFzdGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfbWFzdGVyX3B0ciBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikgY2luZm8tPm1hc3RlcjsKLQotICAvKiBUaGUgZW50cm9weSBjb2RlciBhbHdheXMgbmVlZHMgYW4gZW5kLW9mLXBhc3MgY2FsbCwKLSAgICogZWl0aGVyIHRvIGFuYWx5emUgc3RhdGlzdGljcyBvciB0byBmbHVzaCBpdHMgb3V0cHV0IGJ1ZmZlci4KLSAgICovCi0gICgqY2luZm8tPmVudHJvcHktPmZpbmlzaF9wYXNzKSAoY2luZm8pOwotCi0gIC8qIFVwZGF0ZSBzdGF0ZSBmb3IgbmV4dCBwYXNzICovCi0gIHN3aXRjaCAobWFzdGVyLT5wYXNzX3R5cGUpIHsKLSAgY2FzZSBtYWluX3Bhc3M6Ci0gICAgLyogbmV4dCBwYXNzIGlzIGVpdGhlciBvdXRwdXQgb2Ygc2NhbiAwIChhZnRlciBvcHRpbWl6YXRpb24pCi0gICAgICogb3Igb3V0cHV0IG9mIHNjYW4gMSAoaWYgbm8gb3B0aW1pemF0aW9uKS4KLSAgICAgKi8KLSAgICBtYXN0ZXItPnBhc3NfdHlwZSA9IG91dHB1dF9wYXNzOwotICAgIGlmICghIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpCi0gICAgICBtYXN0ZXItPnNjYW5fbnVtYmVyKys7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgaHVmZl9vcHRfcGFzczoKLSAgICAvKiBuZXh0IHBhc3MgaXMgYWx3YXlzIG91dHB1dCBvZiBjdXJyZW50IHNjYW4gKi8KLSAgICBtYXN0ZXItPnBhc3NfdHlwZSA9IG91dHB1dF9wYXNzOwotICAgIGJyZWFrOwotICBjYXNlIG91dHB1dF9wYXNzOgotICAgIC8qIG5leHQgcGFzcyBpcyBlaXRoZXIgb3B0aW1pemF0aW9uIG9yIG91dHB1dCBvZiBuZXh0IHNjYW4gKi8KLSAgICBpZiAoY2luZm8tPm9wdGltaXplX2NvZGluZykKLSAgICAgIG1hc3Rlci0+cGFzc190eXBlID0gaHVmZl9vcHRfcGFzczsKLSAgICBtYXN0ZXItPnNjYW5fbnVtYmVyKys7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBtYXN0ZXItPnBhc3NfbnVtYmVyKys7Ci19Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgbWFzdGVyIGNvbXByZXNzaW9uIGNvbnRyb2wuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9jX21hc3Rlcl9jb250cm9sIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiB0cmFuc2NvZGVfb25seSkKLXsKLSAgbXlfbWFzdGVyX3B0ciBtYXN0ZXI7Ci0KLSAgbWFzdGVyID0gKG15X21hc3Rlcl9wdHIpCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgU0laRU9GKG15X2NvbXBfbWFzdGVyKSk7Ci0gIGNpbmZvLT5tYXN0ZXIgPSAoc3RydWN0IGpwZWdfY29tcF9tYXN0ZXIgKikgbWFzdGVyOwotICBtYXN0ZXItPnB1Yi5wcmVwYXJlX2Zvcl9wYXNzID0gcHJlcGFyZV9mb3JfcGFzczsKLSAgbWFzdGVyLT5wdWIucGFzc19zdGFydHVwID0gcGFzc19zdGFydHVwOwotICBtYXN0ZXItPnB1Yi5maW5pc2hfcGFzcyA9IGZpbmlzaF9wYXNzX21hc3RlcjsKLSAgbWFzdGVyLT5wdWIuaXNfbGFzdF9wYXNzID0gRkFMU0U7Ci0KLSAgLyogVmFsaWRhdGUgcGFyYW1ldGVycywgZGV0ZXJtaW5lIGRlcml2ZWQgdmFsdWVzICovCi0gIGluaXRpYWxfc2V0dXAoY2luZm8pOwotCi0gIGlmIChjaW5mby0+c2Nhbl9pbmZvICE9IE5VTEwpIHsKLSNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLSAgICB2YWxpZGF0ZV9zY3JpcHQoY2luZm8pOwotI2Vsc2UKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0jZW5kaWYKLSAgfSBlbHNlIHsKLSAgICBjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSA9IEZBTFNFOwotICAgIGNpbmZvLT5udW1fc2NhbnMgPSAxOwotICB9Ci0KLSAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKQkvKiAgVEVNUE9SQVJZIEhBQ0sgPz8/ICovCi0gICAgY2luZm8tPm9wdGltaXplX2NvZGluZyA9IFRSVUU7IC8qIGFzc3VtZSBkZWZhdWx0IHRhYmxlcyBubyBnb29kIGZvciBwcm9ncmVzc2l2ZSBtb2RlICovCi0KLSAgLyogSW5pdGlhbGl6ZSBteSBwcml2YXRlIHN0YXRlICovCi0gIGlmICh0cmFuc2NvZGVfb25seSkgewotICAgIC8qIG5vIG1haW4gcGFzcyBpbiB0cmFuc2NvZGluZyAqLwotICAgIGlmIChjaW5mby0+b3B0aW1pemVfY29kaW5nKQotICAgICAgbWFzdGVyLT5wYXNzX3R5cGUgPSBodWZmX29wdF9wYXNzOwotICAgIGVsc2UKLSAgICAgIG1hc3Rlci0+cGFzc190eXBlID0gb3V0cHV0X3Bhc3M7Ci0gIH0gZWxzZSB7Ci0gICAgLyogZm9yIG5vcm1hbCBjb21wcmVzc2lvbiwgZmlyc3QgcGFzcyBpcyBhbHdheXMgdGhpcyB0eXBlOiAqLwotICAgIG1hc3Rlci0+cGFzc190eXBlID0gbWFpbl9wYXNzOwotICB9Ci0gIG1hc3Rlci0+c2Nhbl9udW1iZXIgPSAwOwotICBtYXN0ZXItPnBhc3NfbnVtYmVyID0gMDsKLSAgaWYgKGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpCi0gICAgbWFzdGVyLT50b3RhbF9wYXNzZXMgPSBjaW5mby0+bnVtX3NjYW5zICogMjsKLSAgZWxzZQotICAgIG1hc3Rlci0+dG90YWxfcGFzc2VzID0gY2luZm8tPm51bV9zY2FuczsKLX0KLQotI2VuZGlmIC8vX0ZYX0pQRUdfVFVSQk9fCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY29tYXBpLmMgYi9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY29tYXBpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZDM3ZDguLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNvbWFwaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLSNpZiAhZGVmaW5lZChfRlhfSlBFR19UVVJCT18pCi0vKgotICogamNvbWFwaS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgYXBwbGljYXRpb24gaW50ZXJmYWNlIHJvdXRpbmVzIHRoYXQgYXJlIHVzZWQgZm9yIGJvdGgKLSAqIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKgotICogQWJvcnQgcHJvY2Vzc2luZyBvZiBhIEpQRUcgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBvcGVyYXRpb24sCi0gKiBidXQgZG9uJ3QgZGVzdHJveSB0aGUgb2JqZWN0IGl0c2VsZi4KLSAqCi0gKiBGb3IgdGhpcywgd2UgbWVyZWx5IGNsZWFuIHVwIGFsbCB0aGUgbm9ucGVybWFuZW50IG1lbW9yeSBwb29scy4KLSAqIE5vdGUgdGhhdCB0ZW1wIGZpbGVzICh2aXJ0dWFsIGFycmF5cykgYXJlIG5vdCBhbGxvd2VkIHRvIGJlbG9uZyB0bwotICogdGhlIHBlcm1hbmVudCBwb29sLCBzbyB3ZSB3aWxsIGJlIGFibGUgdG8gY2xvc2UgYWxsIHRlbXAgZmlsZXMgaGVyZS4KLSAqIENsb3NpbmcgYSBkYXRhIHNvdXJjZSBvciBkZXN0aW5hdGlvbiwgaWYgbmVjZXNzYXJ5LCBpcyB0aGUgYXBwbGljYXRpb24ncwotICogcmVzcG9uc2liaWxpdHkuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2Fib3J0IChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIGludCBwb29sOwotCi0gIC8qIERvIG5vdGhpbmcgaWYgY2FsbGVkIG9uIGEgbm90LWluaXRpYWxpemVkIG9yIGRlc3Ryb3llZCBKUEVHIG9iamVjdC4gKi8KLSAgaWYgKGNpbmZvLT5tZW0gPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgLyogUmVsZWFzaW5nIHBvb2xzIGluIHJldmVyc2Ugb3JkZXIgbWlnaHQgaGVscCBhdm9pZCBmcmFnbWVudGF0aW9uCi0gICAqIHdpdGggc29tZSAoYnJhaW4tZGFtYWdlZCkgbWFsbG9jIGxpYnJhcmllcy4KLSAgICovCi0gIGZvciAocG9vbCA9IEpQT09MX05VTVBPT0xTLTE7IHBvb2wgPiBKUE9PTF9QRVJNQU5FTlQ7IHBvb2wtLSkgewotICAgICgqY2luZm8tPm1lbS0+ZnJlZV9wb29sKSAoY2luZm8sIHBvb2wpOwotICB9Ci0KLSAgLyogUmVzZXQgb3ZlcmFsbCBzdGF0ZSBmb3IgcG9zc2libGUgcmV1c2Ugb2Ygb2JqZWN0ICovCi0gIGlmIChjaW5mby0+aXNfZGVjb21wcmVzc29yKSB7Ci0gICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9TVEFSVDsKLSAgICAvKiBUcnkgdG8ga2VlcCBhcHBsaWNhdGlvbiBmcm9tIGFjY2Vzc2luZyBub3ctZGVsZXRlZCBtYXJrZXIgbGlzdC4KLSAgICAgKiBBIGJpdCBrbHVkZ3kgdG8gZG8gaXQgaGVyZSwgYnV0IHRoaXMgaXMgdGhlIG1vc3QgY2VudHJhbCBwbGFjZS4KLSAgICAgKi8KLSAgICAoKGpfZGVjb21wcmVzc19wdHIpIGNpbmZvKS0+bWFya2VyX2xpc3QgPSBOVUxMOwotICB9IGVsc2UgewotICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBDU1RBVEVfU1RBUlQ7Ci0gIH0KLX0KLQotCi0vKgotICogRGVzdHJ1Y3Rpb24gb2YgYSBKUEVHIG9iamVjdC4KLSAqCi0gKiBFdmVyeXRoaW5nIGdldHMgZGVhbGxvY2F0ZWQgZXhjZXB0IHRoZSBtYXN0ZXIganBlZ19jb21wcmVzc19zdHJ1Y3QgaXRzZWxmCi0gKiBhbmQgdGhlIGVycm9yIG1hbmFnZXIgc3RydWN0LiAgQm90aCBvZiB0aGVzZSBhcmUgc3VwcGxpZWQgYnkgdGhlIGFwcGxpY2F0aW9uCi0gKiBhbmQgbXVzdCBiZSBmcmVlZCwgaWYgbmVjZXNzYXJ5LCBieSB0aGUgYXBwbGljYXRpb24uICAoT2Z0ZW4gdGhleSBhcmUgb24KLSAqIHRoZSBzdGFjayBhbmQgc28gZG9uJ3QgbmVlZCB0byBiZSBmcmVlZCBhbnl3YXkuKQotICogQ2xvc2luZyBhIGRhdGEgc291cmNlIG9yIGRlc3RpbmF0aW9uLCBpZiBuZWNlc3NhcnksIGlzIHRoZSBhcHBsaWNhdGlvbidzCi0gKiByZXNwb25zaWJpbGl0eS4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfZGVzdHJveSAoal9jb21tb25fcHRyIGNpbmZvKQotewotICAvKiBXZSBuZWVkIG9ubHkgdGVsbCB0aGUgbWVtb3J5IG1hbmFnZXIgdG8gcmVsZWFzZSBldmVyeXRoaW5nLiAqLwotICAvKiBOQjogbWVtIHBvaW50ZXIgaXMgTlVMTCBpZiBtZW1vcnkgbWdyIGZhaWxlZCB0byBpbml0aWFsaXplLiAqLwotICBpZiAoY2luZm8tPm1lbSAhPSBOVUxMKQotICAgICgqY2luZm8tPm1lbS0+c2VsZl9kZXN0cnVjdCkgKGNpbmZvKTsKLSAgY2luZm8tPm1lbSA9IE5VTEw7CQkvKiBiZSBzYWZlIGlmIGpwZWdfZGVzdHJveSBpcyBjYWxsZWQgdHdpY2UgKi8KLSAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IDA7CS8qIG1hcmsgaXQgZGVzdHJveWVkICovCi19Ci0KLQotLyoKLSAqIENvbnZlbmllbmNlIHJvdXRpbmVzIGZvciBhbGxvY2F0aW5nIHF1YW50aXphdGlvbiBhbmQgSHVmZm1hbiB0YWJsZXMuCi0gKiAoV291bGQganV0aWxzLmMgYmUgYSBtb3JlIHJlYXNvbmFibGUgcGxhY2UgdG8gcHV0IHRoZXNlPykKLSAqLwotCi1HTE9CQUwoSlFVQU5UX1RCTCAqKQotanBlZ19hbGxvY19xdWFudF90YWJsZSAoal9jb21tb25fcHRyIGNpbmZvKQotewotICBKUVVBTlRfVEJMICp0Ymw7Ci0KLSAgdGJsID0gKEpRVUFOVF9UQkwgKikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoY2luZm8sIEpQT09MX1BFUk1BTkVOVCwgU0laRU9GKEpRVUFOVF9UQkwpKTsKLSAgdGJsLT5zZW50X3RhYmxlID0gRkFMU0U7CS8qIG1ha2Ugc3VyZSB0aGlzIGlzIGZhbHNlIGluIGFueSBuZXcgdGFibGUgKi8KLSAgcmV0dXJuIHRibDsKLX0KLQotCi1HTE9CQUwoSkhVRkZfVEJMICopCi1qcGVnX2FsbG9jX2h1ZmZfdGFibGUgKGpfY29tbW9uX3B0ciBjaW5mbykKLXsKLSAgSkhVRkZfVEJMICp0Ymw7Ci0KLSAgdGJsID0gKEpIVUZGX1RCTCAqKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpIChjaW5mbywgSlBPT0xfUEVSTUFORU5ULCBTSVpFT0YoSkhVRkZfVEJMKSk7Ci0gIHRibC0+c2VudF90YWJsZSA9IEZBTFNFOwkvKiBtYWtlIHN1cmUgdGhpcyBpcyBmYWxzZSBpbiBhbnkgbmV3IHRhYmxlICovCi0gIHJldHVybiB0Ymw7Ci19Ci0KLSNlbmRpZiAvL19GWF9KUEVHX1RVUkJPXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNwYXJhbS5jIGIvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNwYXJhbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2VhMTA5Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjcGFyYW0uYworKysgL2Rldi9udWxsCkBAIC0xLDYxMyArMCwwIEBACi0jaWYgIWRlZmluZWQoX0ZYX0pQRUdfVFVSQk9fKQotLyoKLSAqIGpjcGFyYW0uYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIG9wdGlvbmFsIGRlZmF1bHQtc2V0dGluZyBjb2RlIGZvciB0aGUgSlBFRyBjb21wcmVzc29yLgotICogQXBwbGljYXRpb25zIGRvIG5vdCBoYXZlIHRvIHVzZSB0aGlzIGZpbGUsIGJ1dCB0aG9zZSB0aGF0IGRvbid0IHVzZSBpdAotICogbXVzdCBrbm93IGEgbG90IG1vcmUgYWJvdXQgdGhlIGlubmFyZHMgb2YgdGhlIEpQRUcgY29kZS4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyoKLSAqIFF1YW50aXphdGlvbiB0YWJsZSBzZXR1cCByb3V0aW5lcwotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19hZGRfcXVhbnRfdGFibGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgd2hpY2hfdGJsLAotCQkgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgKmJhc2ljX3RhYmxlLAotCQkgICAgICBpbnQgc2NhbGVfZmFjdG9yLCBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQotLyogRGVmaW5lIGEgcXVhbnRpemF0aW9uIHRhYmxlIGVxdWFsIHRvIHRoZSBiYXNpY190YWJsZSB0aW1lcwotICogYSBzY2FsZSBmYWN0b3IgKGdpdmVuIGFzIGEgcGVyY2VudGFnZSkuCi0gKiBJZiBmb3JjZV9iYXNlbGluZSBpcyBUUlVFLCB0aGUgY29tcHV0ZWQgcXVhbnRpemF0aW9uIHRhYmxlIGVudHJpZXMKLSAqIGFyZSBsaW1pdGVkIHRvIDEuLjI1NSBmb3IgSlBFRyBiYXNlbGluZSBjb21wYXRpYmlsaXR5LgotICovCi17Ci0gIEpRVUFOVF9UQkwgKiogcXRibHB0cjsKLSAgaW50IGk7Ci0gIGxvbmcgdGVtcDsKLQotICAvKiBTYWZldHkgY2hlY2sgdG8gZW5zdXJlIHN0YXJ0X2NvbXByZXNzIG5vdCBjYWxsZWQgeWV0LiAqLwotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLQotICBpZiAod2hpY2hfdGJsIDwgMCB8fCB3aGljaF90YmwgPj0gTlVNX1FVQU5UX1RCTFMpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfRFFUX0lOREVYLCB3aGljaF90YmwpOwotCi0gIHF0YmxwdHIgPSAmIGNpbmZvLT5xdWFudF90YmxfcHRyc1t3aGljaF90YmxdOwotCi0gIGlmICgqcXRibHB0ciA9PSBOVUxMKQotICAgICpxdGJscHRyID0ganBlZ19hbGxvY19xdWFudF90YWJsZSgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKLSAgICB0ZW1wID0gKChsb25nKSBiYXNpY190YWJsZVtpXSAqIHNjYWxlX2ZhY3RvciArIDUwTCkgLyAxMDBMOwotICAgIC8qIGxpbWl0IHRoZSB2YWx1ZXMgdG8gdGhlIHZhbGlkIHJhbmdlICovCi0gICAgaWYgKHRlbXAgPD0gMEwpIHRlbXAgPSAxTDsKLSAgICBpZiAodGVtcCA+IDMyNzY3TCkgdGVtcCA9IDMyNzY3TDsgLyogbWF4IHF1YW50aXplciBuZWVkZWQgZm9yIDEyIGJpdHMgKi8KLSAgICBpZiAoZm9yY2VfYmFzZWxpbmUgJiYgdGVtcCA+IDI1NUwpCi0gICAgICB0ZW1wID0gMjU1TDsJCS8qIGxpbWl0IHRvIGJhc2VsaW5lIHJhbmdlIGlmIHJlcXVlc3RlZCAqLwotICAgICgqcXRibHB0ciktPnF1YW50dmFsW2ldID0gKFVJTlQxNikgdGVtcDsKLSAgfQotCi0gIC8qIEluaXRpYWxpemUgc2VudF90YWJsZSBGQUxTRSBzbyB0YWJsZSB3aWxsIGJlIHdyaXR0ZW4gdG8gSlBFRyBmaWxlLiAqLwotICAoKnF0YmxwdHIpLT5zZW50X3RhYmxlID0gRkFMU0U7Ci19Ci0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX3NldF9saW5lYXJfcXVhbGl0eSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBzY2FsZV9mYWN0b3IsCi0JCQkgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkKLS8qIFNldCBvciBjaGFuZ2UgdGhlICdxdWFsaXR5JyAocXVhbnRpemF0aW9uKSBzZXR0aW5nLCB1c2luZyBkZWZhdWx0IHRhYmxlcwotICogYW5kIGEgc3RyYWlnaHQgcGVyY2VudGFnZS1zY2FsaW5nIHF1YWxpdHkgc2NhbGUuICBJbiBtb3N0IGNhc2VzIGl0J3MgYmV0dGVyCi0gKiB0byB1c2UganBlZ19zZXRfcXVhbGl0eSAoYmVsb3cpOyB0aGlzIGVudHJ5IHBvaW50IGlzIHByb3ZpZGVkIGZvcgotICogYXBwbGljYXRpb25zIHRoYXQgaW5zaXN0IG9uIGEgbGluZWFyIHBlcmNlbnRhZ2Ugc2NhbGluZy4KLSAqLwotewotICAvKiBUaGVzZSBhcmUgdGhlIHNhbXBsZSBxdWFudGl6YXRpb24gdGFibGVzIGdpdmVuIGluIEpQRUcgc3BlYyBzZWN0aW9uIEsuMS4KLSAgICogVGhlIHNwZWMgc2F5cyB0aGF0IHRoZSB2YWx1ZXMgZ2l2ZW4gcHJvZHVjZSAiZ29vZCIgcXVhbGl0eSwgYW5kCi0gICAqIHdoZW4gZGl2aWRlZCBieSAyLCAidmVyeSBnb29kIiBxdWFsaXR5LgotICAgKi8KLSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzdGRfbHVtaW5hbmNlX3F1YW50X3RibFtEQ1RTSVpFMl0gPSB7Ci0gICAgMTYsICAxMSwgIDEwLCAgMTYsICAyNCwgIDQwLCAgNTEsICA2MSwKLSAgICAxMiwgIDEyLCAgMTQsICAxOSwgIDI2LCAgNTgsICA2MCwgIDU1LAotICAgIDE0LCAgMTMsICAxNiwgIDI0LCAgNDAsICA1NywgIDY5LCAgNTYsCi0gICAgMTQsICAxNywgIDIyLCAgMjksICA1MSwgIDg3LCAgODAsICA2MiwKLSAgICAxOCwgIDIyLCAgMzcsICA1NiwgIDY4LCAxMDksIDEwMywgIDc3LAotICAgIDI0LCAgMzUsICA1NSwgIDY0LCAgODEsIDEwNCwgMTEzLCAgOTIsCi0gICAgNDksICA2NCwgIDc4LCAgODcsIDEwMywgMTIxLCAxMjAsIDEwMSwKLSAgICA3MiwgIDkyLCAgOTUsICA5OCwgMTEyLCAxMDAsIDEwMywgIDk5Ci0gIH07Ci0gIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3RkX2Nocm9taW5hbmNlX3F1YW50X3RibFtEQ1RTSVpFMl0gPSB7Ci0gICAgMTcsICAxOCwgIDI0LCAgNDcsICA5OSwgIDk5LCAgOTksICA5OSwKLSAgICAxOCwgIDIxLCAgMjYsICA2NiwgIDk5LCAgOTksICA5OSwgIDk5LAotICAgIDI0LCAgMjYsICA1NiwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCi0gICAgNDcsICA2NiwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKLSAgICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAotICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCi0gICAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKLSAgICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5Ci0gIH07Ci0KLSAgLyogU2V0IHVwIHR3byBxdWFudGl6YXRpb24gdGFibGVzIHVzaW5nIHRoZSBzcGVjaWZpZWQgc2NhbGluZyAqLwotICBqcGVnX2FkZF9xdWFudF90YWJsZShjaW5mbywgMCwgc3RkX2x1bWluYW5jZV9xdWFudF90YmwsCi0JCSAgICAgICBzY2FsZV9mYWN0b3IsIGZvcmNlX2Jhc2VsaW5lKTsKLSAganBlZ19hZGRfcXVhbnRfdGFibGUoY2luZm8sIDEsIHN0ZF9jaHJvbWluYW5jZV9xdWFudF90YmwsCi0JCSAgICAgICBzY2FsZV9mYWN0b3IsIGZvcmNlX2Jhc2VsaW5lKTsKLX0KLQotCi1HTE9CQUwoaW50KQotanBlZ19xdWFsaXR5X3NjYWxpbmcgKGludCBxdWFsaXR5KQotLyogQ29udmVydCBhIHVzZXItc3BlY2lmaWVkIHF1YWxpdHkgcmF0aW5nIHRvIGEgcGVyY2VudGFnZSBzY2FsaW5nIGZhY3RvcgotICogZm9yIGFuIHVuZGVybHlpbmcgcXVhbnRpemF0aW9uIHRhYmxlLCB1c2luZyBvdXIgcmVjb21tZW5kZWQgc2NhbGluZyBjdXJ2ZS4KLSAqIFRoZSBpbnB1dCAncXVhbGl0eScgZmFjdG9yIHNob3VsZCBiZSAwICh0ZXJyaWJsZSkgdG8gMTAwICh2ZXJ5IGdvb2QpLgotICovCi17Ci0gIC8qIFNhZmV0eSBsaW1pdCBvbiBxdWFsaXR5IGZhY3Rvci4gIENvbnZlcnQgMCB0byAxIHRvIGF2b2lkIHplcm8gZGl2aWRlLiAqLwotICBpZiAocXVhbGl0eSA8PSAwKSBxdWFsaXR5ID0gMTsKLSAgaWYgKHF1YWxpdHkgPiAxMDApIHF1YWxpdHkgPSAxMDA7Ci0KLSAgLyogVGhlIGJhc2ljIHRhYmxlIGlzIHVzZWQgYXMtaXMgKHNjYWxpbmcgMTAwKSBmb3IgYSBxdWFsaXR5IG9mIDUwLgotICAgKiBRdWFsaXRpZXMgNTAuLjEwMCBhcmUgY29udmVydGVkIHRvIHNjYWxpbmcgcGVyY2VudGFnZSAyMDAgLSAyKlE7Ci0gICAqIG5vdGUgdGhhdCBhdCBRPTEwMCB0aGUgc2NhbGluZyBpcyAwLCB3aGljaCB3aWxsIGNhdXNlIGpwZWdfYWRkX3F1YW50X3RhYmxlCi0gICAqIHRvIG1ha2UgYWxsIHRoZSB0YWJsZSBlbnRyaWVzIDEgKGhlbmNlLCBtaW5pbXVtIHF1YW50aXphdGlvbiBsb3NzKS4KLSAgICogUXVhbGl0aWVzIDEuLjUwIGFyZSBjb252ZXJ0ZWQgdG8gc2NhbGluZyBwZXJjZW50YWdlIDUwMDAvUS4KLSAgICovCi0gIGlmIChxdWFsaXR5IDwgNTApCi0gICAgcXVhbGl0eSA9IDUwMDAgLyBxdWFsaXR5OwotICBlbHNlCi0gICAgcXVhbGl0eSA9IDIwMCAtIHF1YWxpdHkqMjsKLQotICByZXR1cm4gcXVhbGl0eTsKLX0KLQotCi1HTE9CQUwodm9pZCkKLWpwZWdfc2V0X3F1YWxpdHkgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgcXVhbGl0eSwgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkKLS8qIFNldCBvciBjaGFuZ2UgdGhlICdxdWFsaXR5JyAocXVhbnRpemF0aW9uKSBzZXR0aW5nLCB1c2luZyBkZWZhdWx0IHRhYmxlcy4KLSAqIFRoaXMgaXMgdGhlIHN0YW5kYXJkIHF1YWxpdHktYWRqdXN0aW5nIGVudHJ5IHBvaW50IGZvciB0eXBpY2FsIHVzZXIKLSAqIGludGVyZmFjZXM7IG9ubHkgdGhvc2Ugd2hvIHdhbnQgZGV0YWlsZWQgY29udHJvbCBvdmVyIHF1YW50aXphdGlvbiB0YWJsZXMKLSAqIHdvdWxkIHVzZSB0aGUgcHJlY2VkaW5nIHRocmVlIHJvdXRpbmVzIGRpcmVjdGx5LgotICovCi17Ci0gIC8qIENvbnZlcnQgdXNlciAwLTEwMCByYXRpbmcgdG8gcGVyY2VudGFnZSBzY2FsaW5nICovCi0gIHF1YWxpdHkgPSBqcGVnX3F1YWxpdHlfc2NhbGluZyhxdWFsaXR5KTsKLQotICAvKiBTZXQgdXAgc3RhbmRhcmQgcXVhbGl0eSB0YWJsZXMgKi8KLSAganBlZ19zZXRfbGluZWFyX3F1YWxpdHkoY2luZm8sIHF1YWxpdHksIGZvcmNlX2Jhc2VsaW5lKTsKLX0KLQotCi0vKgotICogSHVmZm1hbiB0YWJsZSBzZXR1cCByb3V0aW5lcwotICovCi0KLUxPQ0FMKHZvaWQpCi1hZGRfaHVmZl90YWJsZSAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCUpIVUZGX1RCTCAqKmh0YmxwdHIsIGNvbnN0IFVJTlQ4ICpiaXRzLCBjb25zdCBVSU5UOCAqdmFsKQotLyogRGVmaW5lIGEgSHVmZm1hbiB0YWJsZSAqLwotewotICBpbnQgbnN5bWJvbHMsIGxlbjsKLQotICBpZiAoKmh0YmxwdHIgPT0gTlVMTCkKLSAgICAqaHRibHB0ciA9IGpwZWdfYWxsb2NfaHVmZl90YWJsZSgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0KLSAgLyogQ29weSB0aGUgbnVtYmVyLW9mLXN5bWJvbHMtb2YtZWFjaC1jb2RlLWxlbmd0aCBjb3VudHMgKi8KLSAgTUVNQ09QWSgoKmh0YmxwdHIpLT5iaXRzLCBiaXRzLCBTSVpFT0YoKCpodGJscHRyKS0+Yml0cykpOwotCi0gIC8qIFZhbGlkYXRlIHRoZSBjb3VudHMuICBXZSBkbyB0aGlzIGhlcmUgbWFpbmx5IHNvIHdlIGNhbiBjb3B5IHRoZSByaWdodAotICAgKiBudW1iZXIgb2Ygc3ltYm9scyBmcm9tIHRoZSB2YWxbXSBhcnJheSwgd2l0aG91dCByaXNraW5nIG1hcmNoaW5nIG9mZgotICAgKiB0aGUgZW5kIG9mIG1lbW9yeS4gIGpjaHVmZi5jIHdpbGwgZG8gYSBtb3JlIHRob3JvdWdoIHRlc3QgbGF0ZXIuCi0gICAqLwotICBuc3ltYm9scyA9IDA7Ci0gIGZvciAobGVuID0gMTsgbGVuIDw9IDE2OyBsZW4rKykKLSAgICBuc3ltYm9scyArPSBiaXRzW2xlbl07Ci0gIGlmIChuc3ltYm9scyA8IDEgfHwgbnN5bWJvbHMgPiAyNTYpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSFVGRl9UQUJMRSk7Ci0KLSAgTUVNQ09QWSgoKmh0YmxwdHIpLT5odWZmdmFsLCB2YWwsIG5zeW1ib2xzICogU0laRU9GKFVJTlQ4KSk7Ci0KLSAgLyogSW5pdGlhbGl6ZSBzZW50X3RhYmxlIEZBTFNFIHNvIHRhYmxlIHdpbGwgYmUgd3JpdHRlbiB0byBKUEVHIGZpbGUuICovCi0gICgqaHRibHB0ciktPnNlbnRfdGFibGUgPSBGQUxTRTsKLX0KLQotCi1MT0NBTCh2b2lkKQotc3RkX2h1ZmZfdGFibGVzIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLS8qIFNldCB1cCB0aGUgc3RhbmRhcmQgSHVmZm1hbiB0YWJsZXMgKGNmLiBKUEVHIHN0YW5kYXJkIHNlY3Rpb24gSy4zKSAqLwotLyogSU1QT1JUQU5UOiB0aGVzZSBhcmUgb25seSB2YWxpZCBmb3IgOC1iaXQgZGF0YSBwcmVjaXNpb24hICovCi17Ci0gIHN0YXRpYyBjb25zdCBVSU5UOCBiaXRzX2RjX2x1bWluYW5jZVsxN10gPQotICAgIHsgLyogMC1iYXNlICovIDAsIDAsIDEsIDUsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKLSAgc3RhdGljIGNvbnN0IFVJTlQ4IHZhbF9kY19sdW1pbmFuY2VbXSA9Ci0gICAgeyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEgfTsKLSAgCi0gIHN0YXRpYyBjb25zdCBVSU5UOCBiaXRzX2RjX2Nocm9taW5hbmNlWzE3XSA9Ci0gICAgeyAvKiAwLWJhc2UgKi8gMCwgMCwgMywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCB9OwotICBzdGF0aWMgY29uc3QgVUlOVDggdmFsX2RjX2Nocm9taW5hbmNlW10gPQotICAgIHsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExIH07Ci0gIAotICBzdGF0aWMgY29uc3QgVUlOVDggYml0c19hY19sdW1pbmFuY2VbMTddID0KLSAgICB7IC8qIDAtYmFzZSAqLyAwLCAwLCAyLCAxLCAzLCAzLCAyLCA0LCAzLCA1LCA1LCA0LCA0LCAwLCAwLCAxLCAweDdkIH07Ci0gIHN0YXRpYyBjb25zdCBVSU5UOCB2YWxfYWNfbHVtaW5hbmNlW10gPQotICAgIHsgMHgwMSwgMHgwMiwgMHgwMywgMHgwMCwgMHgwNCwgMHgxMSwgMHgwNSwgMHgxMiwKLSAgICAgIDB4MjEsIDB4MzEsIDB4NDEsIDB4MDYsIDB4MTMsIDB4NTEsIDB4NjEsIDB4MDcsCi0gICAgICAweDIyLCAweDcxLCAweDE0LCAweDMyLCAweDgxLCAweDkxLCAweGExLCAweDA4LAotICAgICAgMHgyMywgMHg0MiwgMHhiMSwgMHhjMSwgMHgxNSwgMHg1MiwgMHhkMSwgMHhmMCwKLSAgICAgIDB4MjQsIDB4MzMsIDB4NjIsIDB4NzIsIDB4ODIsIDB4MDksIDB4MGEsIDB4MTYsCi0gICAgICAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDI1LCAweDI2LCAweDI3LCAweDI4LAotICAgICAgMHgyOSwgMHgyYSwgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwKLSAgICAgIDB4M2EsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksCi0gICAgICAweDRhLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LAotICAgICAgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwgMHg2OSwKLSAgICAgIDB4NmEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksCi0gICAgICAweDdhLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LAotICAgICAgMHg4YSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwKLSAgICAgIDB4OTksIDB4OWEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsCi0gICAgICAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LAotICAgICAgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwKLSAgICAgIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksIDB4Y2EsIDB4ZDIsIDB4ZDMsIDB4ZDQsCi0gICAgICAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLCAweGUxLCAweGUyLAotICAgICAgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwKLSAgICAgIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsCi0gICAgICAweGY5LCAweGZhIH07Ci0gIAotICBzdGF0aWMgY29uc3QgVUlOVDggYml0c19hY19jaHJvbWluYW5jZVsxN10gPQotICAgIHsgLyogMC1iYXNlICovIDAsIDAsIDIsIDEsIDIsIDQsIDQsIDMsIDQsIDcsIDUsIDQsIDQsIDAsIDEsIDIsIDB4NzcgfTsKLSAgc3RhdGljIGNvbnN0IFVJTlQ4IHZhbF9hY19jaHJvbWluYW5jZVtdID0KLSAgICB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MTEsIDB4MDQsIDB4MDUsIDB4MjEsCi0gICAgICAweDMxLCAweDA2LCAweDEyLCAweDQxLCAweDUxLCAweDA3LCAweDYxLCAweDcxLAotICAgICAgMHgxMywgMHgyMiwgMHgzMiwgMHg4MSwgMHgwOCwgMHgxNCwgMHg0MiwgMHg5MSwKLSAgICAgIDB4YTEsIDB4YjEsIDB4YzEsIDB4MDksIDB4MjMsIDB4MzMsIDB4NTIsIDB4ZjAsCi0gICAgICAweDE1LCAweDYyLCAweDcyLCAweGQxLCAweDBhLCAweDE2LCAweDI0LCAweDM0LAotICAgICAgMHhlMSwgMHgyNSwgMHhmMSwgMHgxNywgMHgxOCwgMHgxOSwgMHgxYSwgMHgyNiwKLSAgICAgIDB4MjcsIDB4MjgsIDB4MjksIDB4MmEsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsCi0gICAgICAweDM5LCAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LAotICAgICAgMHg0OSwgMHg0YSwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwKLSAgICAgIDB4NTksIDB4NWEsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsCi0gICAgICAweDY5LCAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LAotICAgICAgMHg3OSwgMHg3YSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywKLSAgICAgIDB4ODgsIDB4ODksIDB4OGEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsCi0gICAgICAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweGEyLCAweGEzLCAweGE0LCAweGE1LAotICAgICAgMHhhNiwgMHhhNywgMHhhOCwgMHhhOSwgMHhhYSwgMHhiMiwgMHhiMywgMHhiNCwKLSAgICAgIDB4YjUsIDB4YjYsIDB4YjcsIDB4YjgsIDB4YjksIDB4YmEsIDB4YzIsIDB4YzMsCi0gICAgICAweGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LCAweGM5LCAweGNhLCAweGQyLAotICAgICAgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwKLSAgICAgIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIDB4ZTgsIDB4ZTksCi0gICAgICAweGVhLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LAotICAgICAgMHhmOSwgMHhmYSB9OwotICAKLSAgYWRkX2h1ZmZfdGFibGUoY2luZm8sICZjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1swXSwKLQkJIGJpdHNfZGNfbHVtaW5hbmNlLCB2YWxfZGNfbHVtaW5hbmNlKTsKLSAgYWRkX2h1ZmZfdGFibGUoY2luZm8sICZjaW5mby0+YWNfaHVmZl90YmxfcHRyc1swXSwKLQkJIGJpdHNfYWNfbHVtaW5hbmNlLCB2YWxfYWNfbHVtaW5hbmNlKTsKLSAgYWRkX2h1ZmZfdGFibGUoY2luZm8sICZjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1sxXSwKLQkJIGJpdHNfZGNfY2hyb21pbmFuY2UsIHZhbF9kY19jaHJvbWluYW5jZSk7Ci0gIGFkZF9odWZmX3RhYmxlKGNpbmZvLCAmY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbMV0sCi0JCSBiaXRzX2FjX2Nocm9taW5hbmNlLCB2YWxfYWNfY2hyb21pbmFuY2UpOwotfQotCi0KLS8qCi0gKiBEZWZhdWx0IHBhcmFtZXRlciBzZXR1cCBmb3IgY29tcHJlc3Npb24uCi0gKgotICogQXBwbGljYXRpb25zIHRoYXQgZG9uJ3QgY2hvb3NlIHRvIHVzZSB0aGlzIHJvdXRpbmUgbXVzdCBkbyB0aGVpcgotICogb3duIHNldHVwIG9mIGFsbCB0aGVzZSBwYXJhbWV0ZXJzLiAgQWx0ZXJuYXRlbHksIHlvdSBjYW4gY2FsbCB0aGlzCi0gKiB0byBlc3RhYmxpc2ggZGVmYXVsdHMgYW5kIHRoZW4gYWx0ZXIgcGFyYW1ldGVycyBzZWxlY3RpdmVseS4gIFRoaXMKLSAqIGlzIHRoZSByZWNvbW1lbmRlZCBhcHByb2FjaCBzaW5jZSwgaWYgd2UgYWRkIGFueSBuZXcgcGFyYW1ldGVycywKLSAqIHlvdXIgY29kZSB3aWxsIHN0aWxsIHdvcmsgKHRoZXknbGwgYmUgc2V0IHRvIHJlYXNvbmFibGUgZGVmYXVsdHMpLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19zZXRfZGVmYXVsdHMgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBpbnQgaTsKLQotICAvKiBTYWZldHkgY2hlY2sgdG8gZW5zdXJlIHN0YXJ0X2NvbXByZXNzIG5vdCBjYWxsZWQgeWV0LiAqLwotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLQotICAvKiBBbGxvY2F0ZSBjb21wX2luZm8gYXJyYXkgbGFyZ2UgZW5vdWdoIGZvciBtYXhpbXVtIGNvbXBvbmVudCBjb3VudC4KLSAgICogQXJyYXkgaXMgbWFkZSBwZXJtYW5lbnQgaW4gY2FzZSBhcHBsaWNhdGlvbiB3YW50cyB0byBjb21wcmVzcwotICAgKiBtdWx0aXBsZSBpbWFnZXMgYXQgc2FtZSBwYXJhbSBzZXR0aW5ncy4KLSAgICovCi0gIGlmIChjaW5mby0+Y29tcF9pbmZvID09IE5VTEwpCi0gICAgY2luZm8tPmNvbXBfaW5mbyA9IChqcGVnX2NvbXBvbmVudF9pbmZvICopCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX1BFUk1BTkVOVCwKLQkJCQkgIE1BWF9DT01QT05FTlRTICogU0laRU9GKGpwZWdfY29tcG9uZW50X2luZm8pKTsKLQotICAvKiBJbml0aWFsaXplIGV2ZXJ5dGhpbmcgbm90IGRlcGVuZGVudCBvbiB0aGUgY29sb3Igc3BhY2UgKi8KLQotICBjaW5mby0+ZGF0YV9wcmVjaXNpb24gPSBCSVRTX0lOX0pTQU1QTEU7Ci0gIC8qIFNldCB1cCB0d28gcXVhbnRpemF0aW9uIHRhYmxlcyB1c2luZyBkZWZhdWx0IHF1YWxpdHkgb2YgNzUgKi8KLSAganBlZ19zZXRfcXVhbGl0eShjaW5mbywgNzUsIFRSVUUpOwotICAvKiBTZXQgdXAgdHdvIEh1ZmZtYW4gdGFibGVzICovCi0gIHN0ZF9odWZmX3RhYmxlcyhjaW5mbyk7Ci0KLSAgLyogSW5pdGlhbGl6ZSBkZWZhdWx0IGFyaXRobWV0aWMgY29kaW5nIGNvbmRpdGlvbmluZyAqLwotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0FSSVRIX1RCTFM7IGkrKykgewotICAgIGNpbmZvLT5hcml0aF9kY19MW2ldID0gMDsKLSAgICBjaW5mby0+YXJpdGhfZGNfVVtpXSA9IDE7Ci0gICAgY2luZm8tPmFyaXRoX2FjX0tbaV0gPSA1OwotICB9Ci0KLSAgLyogRGVmYXVsdCBpcyBubyBtdWx0aXBsZS1zY2FuIG91dHB1dCAqLwotICBjaW5mby0+c2Nhbl9pbmZvID0gTlVMTDsKLSAgY2luZm8tPm51bV9zY2FucyA9IDA7Ci0KLSAgLyogRXhwZWN0IG5vcm1hbCBzb3VyY2UgaW1hZ2UsIG5vdCByYXcgZG93bnNhbXBsZWQgZGF0YSAqLwotICBjaW5mby0+cmF3X2RhdGFfaW4gPSBGQUxTRTsKLQotICAvKiBVc2UgSHVmZm1hbiBjb2RpbmcsIG5vdCBhcml0aG1ldGljIGNvZGluZywgYnkgZGVmYXVsdCAqLwotICBjaW5mby0+YXJpdGhfY29kZSA9IEZBTFNFOwotCi0gIC8qIEJ5IGRlZmF1bHQsIGRvbid0IGRvIGV4dHJhIHBhc3NlcyB0byBvcHRpbWl6ZSBlbnRyb3B5IGNvZGluZyAqLwotICBjaW5mby0+b3B0aW1pemVfY29kaW5nID0gRkFMU0U7Ci0gIC8qIFRoZSBzdGFuZGFyZCBIdWZmbWFuIHRhYmxlcyBhcmUgb25seSB2YWxpZCBmb3IgOC1iaXQgZGF0YSBwcmVjaXNpb24uCi0gICAqIElmIHRoZSBwcmVjaXNpb24gaXMgaGlnaGVyLCBmb3JjZSBvcHRpbWl6YXRpb24gb24gc28gdGhhdCB1c2FibGUKLSAgICogdGFibGVzIHdpbGwgYmUgY29tcHV0ZWQuICBUaGlzIHRlc3QgY2FuIGJlIHJlbW92ZWQgaWYgZGVmYXVsdCB0YWJsZXMKLSAgICogYXJlIHN1cHBsaWVkIHRoYXQgYXJlIHZhbGlkIGZvciB0aGUgZGVzaXJlZCBwcmVjaXNpb24uCi0gICAqLwotICBpZiAoY2luZm8tPmRhdGFfcHJlY2lzaW9uID4gOCkKLSAgICBjaW5mby0+b3B0aW1pemVfY29kaW5nID0gVFJVRTsKLQotICAvKiBCeSBkZWZhdWx0LCB1c2UgdGhlIHNpbXBsZXIgbm9uLWNvc2l0ZWQgc2FtcGxpbmcgYWxpZ25tZW50ICovCi0gIGNpbmZvLT5DQ0lSNjAxX3NhbXBsaW5nID0gRkFMU0U7Ci0KLSAgLyogTm8gaW5wdXQgc21vb3RoaW5nICovCi0gIGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yID0gMDsKLQotICAvKiBEQ1QgYWxnb3JpdGhtIHByZWZlcmVuY2UgKi8KLSAgY2luZm8tPmRjdF9tZXRob2QgPSBKRENUX0RFRkFVTFQ7Ci0KLSAgLyogTm8gcmVzdGFydCBtYXJrZXJzICovCi0gIGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsID0gMDsKLSAgY2luZm8tPnJlc3RhcnRfaW5fcm93cyA9IDA7Ci0KLSAgLyogRmlsbCBpbiBkZWZhdWx0IEpGSUYgbWFya2VyIHBhcmFtZXRlcnMuICBOb3RlIHRoYXQgd2hldGhlciB0aGUgbWFya2VyCi0gICAqIHdpbGwgYWN0dWFsbHkgYmUgd3JpdHRlbiBpcyBkZXRlcm1pbmVkIGJ5IGpwZWdfc2V0X2NvbG9yc3BhY2UuCi0gICAqCi0gICAqIEJ5IGRlZmF1bHQsIHRoZSBsaWJyYXJ5IGVtaXRzIEpGSUYgdmVyc2lvbiBjb2RlIDEuMDEuCi0gICAqIEFuIGFwcGxpY2F0aW9uIHRoYXQgd2FudHMgdG8gZW1pdCBKRklGIDEuMDIgZXh0ZW5zaW9uIG1hcmtlcnMgc2hvdWxkIHNldAotICAgKiBKRklGX21pbm9yX3ZlcnNpb24gdG8gMi4gIFdlIGNvdWxkIHByb2JhYmx5IGdldCBhd2F5IHdpdGgganVzdCBkZWZhdWx0aW5nCi0gICAqIHRvIDEuMDIsIGJ1dCB0aGVyZSBtYXkgc3RpbGwgYmUgc29tZSBkZWNvZGVycyBpbiB1c2UgdGhhdCB3aWxsIGNvbXBsYWluCi0gICAqIGFib3V0IHRoYXQ7IHNheWluZyAxLjAxIHNob3VsZCBtaW5pbWl6ZSBjb21wYXRpYmlsaXR5IHByb2JsZW1zLgotICAgKi8KLSAgY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbiA9IDE7IC8qIERlZmF1bHQgSkZJRiB2ZXJzaW9uID0gMS4wMSAqLwotICBjaW5mby0+SkZJRl9taW5vcl92ZXJzaW9uID0gMTsKLSAgY2luZm8tPmRlbnNpdHlfdW5pdCA9IDA7CS8qIFBpeGVsIHNpemUgaXMgdW5rbm93biBieSBkZWZhdWx0ICovCi0gIGNpbmZvLT5YX2RlbnNpdHkgPSAxOwkJLyogUGl4ZWwgYXNwZWN0IHJhdGlvIGlzIHNxdWFyZSBieSBkZWZhdWx0ICovCi0gIGNpbmZvLT5ZX2RlbnNpdHkgPSAxOwotCi0gIC8qIENob29zZSBKUEVHIGNvbG9yc3BhY2UgYmFzZWQgb24gaW5wdXQgc3BhY2UsIHNldCBkZWZhdWx0cyBhY2NvcmRpbmdseSAqLwotCi0gIGpwZWdfZGVmYXVsdF9jb2xvcnNwYWNlKGNpbmZvKTsKLX0KLQotCi0vKgotICogU2VsZWN0IGFuIGFwcHJvcHJpYXRlIEpQRUcgY29sb3JzcGFjZSBmb3IgaW5fY29sb3Jfc3BhY2UuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2RlZmF1bHRfY29sb3JzcGFjZSAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIHN3aXRjaCAoY2luZm8tPmluX2NvbG9yX3NwYWNlKSB7Ci0gIGNhc2UgSkNTX0dSQVlTQ0FMRToKLSAgICBqcGVnX3NldF9jb2xvcnNwYWNlKGNpbmZvLCBKQ1NfR1JBWVNDQUxFKTsKLSAgICBicmVhazsKLSAgY2FzZSBKQ1NfUkdCOgotICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoY2luZm8sIEpDU19ZQ2JDcik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSkNTX1lDYkNyOgotICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoY2luZm8sIEpDU19ZQ2JDcik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSkNTX0NNWUs6Ci0gICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX0NNWUspOyAvKiBCeSBkZWZhdWx0LCBubyB0cmFuc2xhdGlvbiAqLwotICAgIGJyZWFrOwotICBjYXNlIEpDU19ZQ0NLOgotICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoY2luZm8sIEpDU19ZQ0NLKTsKLSAgICBicmVhazsKLSAgY2FzZSBKQ1NfVU5LTk9XTjoKLSAgICBqcGVnX3NldF9jb2xvcnNwYWNlKGNpbmZvLCBKQ1NfVU5LTk9XTik7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSU5fQ09MT1JTUEFDRSk7Ci0gIH0KLX0KLQotCi0vKgotICogU2V0IHRoZSBKUEVHIGNvbG9yc3BhY2UsIGFuZCBjaG9vc2UgY29sb3JzcGFjZS1kZXBlbmRlbnQgZGVmYXVsdCB2YWx1ZXMuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX3NldF9jb2xvcnNwYWNlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9DT0xPUl9TUEFDRSBjb2xvcnNwYWNlKQotewotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLSAgaW50IGNpOwotCi0jZGVmaW5lIFNFVF9DT01QKGluZGV4LGlkLGhzYW1wLHZzYW1wLHF1YW50LGRjdGJsLGFjdGJsKSAgXAotICAoY29tcHB0ciA9ICZjaW5mby0+Y29tcF9pbmZvW2luZGV4XSwgXAotICAgY29tcHB0ci0+Y29tcG9uZW50X2lkID0gKGlkKSwgXAotICAgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciA9IChoc2FtcCksIFwKLSAgIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgPSAodnNhbXApLCBcCi0gICBjb21wcHRyLT5xdWFudF90Ymxfbm8gPSAocXVhbnQpLCBcCi0gICBjb21wcHRyLT5kY190Ymxfbm8gPSAoZGN0YmwpLCBcCi0gICBjb21wcHRyLT5hY190Ymxfbm8gPSAoYWN0YmwpICkKLQotICAvKiBTYWZldHkgY2hlY2sgdG8gZW5zdXJlIHN0YXJ0X2NvbXByZXNzIG5vdCBjYWxsZWQgeWV0LiAqLwotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLQotICAvKiBGb3IgYWxsIGNvbG9yc3BhY2VzLCB3ZSB1c2UgUSBhbmQgSHVmZiB0YWJsZXMgMCBmb3IgbHVtaW5hbmNlIGNvbXBvbmVudHMsCi0gICAqIHRhYmxlcyAxIGZvciBjaHJvbWluYW5jZSBjb21wb25lbnRzLgotICAgKi8KLQotICBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IGNvbG9yc3BhY2U7Ci0KLSAgY2luZm8tPndyaXRlX0pGSUZfaGVhZGVyID0gRkFMU0U7IC8qIE5vIG1hcmtlciBmb3Igbm9uLUpGSUYgY29sb3JzcGFjZXMgKi8KLSAgY2luZm8tPndyaXRlX0Fkb2JlX21hcmtlciA9IEZBTFNFOyAvKiB3cml0ZSBubyBBZG9iZSBtYXJrZXIgYnkgZGVmYXVsdCAqLwotCi0gIHN3aXRjaCAoY29sb3JzcGFjZSkgewotICBjYXNlIEpDU19HUkFZU0NBTEU6Ci0gICAgY2luZm8tPndyaXRlX0pGSUZfaGVhZGVyID0gVFJVRTsgLyogV3JpdGUgYSBKRklGIG1hcmtlciAqLwotICAgIGNpbmZvLT5udW1fY29tcG9uZW50cyA9IDE7Ci0gICAgLyogSkZJRiBzcGVjaWZpZXMgY29tcG9uZW50IElEIDEgKi8KLSAgICBTRVRfQ09NUCgwLCAxLCAxLDEsIDAsIDAsMCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSkNTX1JHQjoKLSAgICBjaW5mby0+d3JpdGVfQWRvYmVfbWFya2VyID0gVFJVRTsgLyogd3JpdGUgQWRvYmUgbWFya2VyIHRvIGZsYWcgUkdCICovCi0gICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gMzsKLSAgICBTRVRfQ09NUCgwLCAweDUyIC8qICdSJyAqLywgMSwxLCAwLCAwLDApOwotICAgIFNFVF9DT01QKDEsIDB4NDcgLyogJ0cnICovLCAxLDEsIDAsIDAsMCk7Ci0gICAgU0VUX0NPTVAoMiwgMHg0MiAvKiAnQicgKi8sIDEsMSwgMCwgMCwwKTsKLSAgICBicmVhazsKLSAgY2FzZSBKQ1NfWUNiQ3I6Ci0gICAgY2luZm8tPndyaXRlX0pGSUZfaGVhZGVyID0gVFJVRTsgLyogV3JpdGUgYSBKRklGIG1hcmtlciAqLwotICAgIGNpbmZvLT5udW1fY29tcG9uZW50cyA9IDM7Ci0gICAgLyogSkZJRiBzcGVjaWZpZXMgY29tcG9uZW50IElEcyAxLDIsMyAqLwotICAgIC8qIFdlIGRlZmF1bHQgdG8gMngyIHN1YnNhbXBsZXMgb2YgY2hyb21pbmFuY2UgKi8KLSAgICBTRVRfQ09NUCgwLCAxLCAyLDIsIDAsIDAsMCk7Ci0gICAgU0VUX0NPTVAoMSwgMiwgMSwxLCAxLCAxLDEpOwotICAgIFNFVF9DT01QKDIsIDMsIDEsMSwgMSwgMSwxKTsKLSAgICBicmVhazsKLSAgY2FzZSBKQ1NfQ01ZSzoKLSAgICBjaW5mby0+d3JpdGVfQWRvYmVfbWFya2VyID0gVFJVRTsgLyogd3JpdGUgQWRvYmUgbWFya2VyIHRvIGZsYWcgQ01ZSyAqLwotICAgIGNpbmZvLT5udW1fY29tcG9uZW50cyA9IDQ7Ci0gICAgU0VUX0NPTVAoMCwgMHg0MyAvKiAnQycgKi8sIDEsMSwgMCwgMCwwKTsKLSAgICBTRVRfQ09NUCgxLCAweDREIC8qICdNJyAqLywgMSwxLCAwLCAwLDApOwotICAgIFNFVF9DT01QKDIsIDB4NTkgLyogJ1knICovLCAxLDEsIDAsIDAsMCk7Ci0gICAgU0VUX0NPTVAoMywgMHg0QiAvKiAnSycgKi8sIDEsMSwgMCwgMCwwKTsKLSAgICBicmVhazsKLSAgY2FzZSBKQ1NfWUNDSzoKLSAgICBjaW5mby0+d3JpdGVfQWRvYmVfbWFya2VyID0gVFJVRTsgLyogd3JpdGUgQWRvYmUgbWFya2VyIHRvIGZsYWcgWUNDSyAqLwotICAgIGNpbmZvLT5udW1fY29tcG9uZW50cyA9IDQ7Ci0gICAgU0VUX0NPTVAoMCwgMSwgMiwyLCAwLCAwLDApOwotICAgIFNFVF9DT01QKDEsIDIsIDEsMSwgMSwgMSwxKTsKLSAgICBTRVRfQ09NUCgyLCAzLCAxLDEsIDEsIDEsMSk7Ci0gICAgU0VUX0NPTVAoMywgNCwgMiwyLCAwLCAwLDApOwotICAgIGJyZWFrOwotICBjYXNlIEpDU19VTktOT1dOOgotICAgIGNpbmZvLT5udW1fY29tcG9uZW50cyA9IGNpbmZvLT5pbnB1dF9jb21wb25lbnRzOwotICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgPCAxIHx8IGNpbmZvLT5udW1fY29tcG9uZW50cyA+IE1BWF9DT01QT05FTlRTKQotICAgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQ09NUE9ORU5UX0NPVU5ULCBjaW5mby0+bnVtX2NvbXBvbmVudHMsCi0JICAgICAgIE1BWF9DT01QT05FTlRTKTsKLSAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLSAgICAgIFNFVF9DT01QKGNpLCBjaSwgMSwxLCAwLCAwLDApOwotICAgIH0KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOwotICB9Ci19Ci0KLQotI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECi0KLUxPQ0FMKGpwZWdfc2Nhbl9pbmZvICopCi1maWxsX2Ffc2NhbiAoanBlZ19zY2FuX2luZm8gKiBzY2FucHRyLCBpbnQgY2ksCi0JICAgICBpbnQgU3MsIGludCBTZSwgaW50IEFoLCBpbnQgQWwpCi0vKiBTdXBwb3J0IHJvdXRpbmU6IGdlbmVyYXRlIG9uZSBzY2FuIGZvciBzcGVjaWZpZWQgY29tcG9uZW50ICovCi17Ci0gIHNjYW5wdHItPmNvbXBzX2luX3NjYW4gPSAxOwotICBzY2FucHRyLT5jb21wb25lbnRfaW5kZXhbMF0gPSBjaTsKLSAgc2NhbnB0ci0+U3MgPSBTczsKLSAgc2NhbnB0ci0+U2UgPSBTZTsKLSAgc2NhbnB0ci0+QWggPSBBaDsKLSAgc2NhbnB0ci0+QWwgPSBBbDsKLSAgc2NhbnB0cisrOwotICByZXR1cm4gc2NhbnB0cjsKLX0KLQotTE9DQUwoanBlZ19zY2FuX2luZm8gKikKLWZpbGxfc2NhbnMgKGpwZWdfc2Nhbl9pbmZvICogc2NhbnB0ciwgaW50IG5jb21wcywKLQkgICAgaW50IFNzLCBpbnQgU2UsIGludCBBaCwgaW50IEFsKQotLyogU3VwcG9ydCByb3V0aW5lOiBnZW5lcmF0ZSBvbmUgc2NhbiBmb3IgZWFjaCBjb21wb25lbnQgKi8KLXsKLSAgaW50IGNpOwotCi0gIGZvciAoY2kgPSAwOyBjaSA8IG5jb21wczsgY2krKykgewotICAgIHNjYW5wdHItPmNvbXBzX2luX3NjYW4gPSAxOwotICAgIHNjYW5wdHItPmNvbXBvbmVudF9pbmRleFswXSA9IGNpOwotICAgIHNjYW5wdHItPlNzID0gU3M7Ci0gICAgc2NhbnB0ci0+U2UgPSBTZTsKLSAgICBzY2FucHRyLT5BaCA9IEFoOwotICAgIHNjYW5wdHItPkFsID0gQWw7Ci0gICAgc2NhbnB0cisrOwotICB9Ci0gIHJldHVybiBzY2FucHRyOwotfQotCi1MT0NBTChqcGVnX3NjYW5faW5mbyAqKQotZmlsbF9kY19zY2FucyAoanBlZ19zY2FuX2luZm8gKiBzY2FucHRyLCBpbnQgbmNvbXBzLCBpbnQgQWgsIGludCBBbCkKLS8qIFN1cHBvcnQgcm91dGluZTogZ2VuZXJhdGUgaW50ZXJsZWF2ZWQgREMgc2NhbiBpZiBwb3NzaWJsZSwgZWxzZSBOIHNjYW5zICovCi17Ci0gIGludCBjaTsKLQotICBpZiAobmNvbXBzIDw9IE1BWF9DT01QU19JTl9TQ0FOKSB7Ci0gICAgLyogU2luZ2xlIGludGVybGVhdmVkIERDIHNjYW4gKi8KLSAgICBzY2FucHRyLT5jb21wc19pbl9zY2FuID0gbmNvbXBzOwotICAgIGZvciAoY2kgPSAwOyBjaSA8IG5jb21wczsgY2krKykKLSAgICAgIHNjYW5wdHItPmNvbXBvbmVudF9pbmRleFtjaV0gPSBjaTsKLSAgICBzY2FucHRyLT5TcyA9IHNjYW5wdHItPlNlID0gMDsKLSAgICBzY2FucHRyLT5BaCA9IEFoOwotICAgIHNjYW5wdHItPkFsID0gQWw7Ci0gICAgc2NhbnB0cisrOwotICB9IGVsc2UgewotICAgIC8qIE5vbmludGVybGVhdmVkIERDIHNjYW4gZm9yIGVhY2ggY29tcG9uZW50ICovCi0gICAgc2NhbnB0ciA9IGZpbGxfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCAwLCAwLCBBaCwgQWwpOwotICB9Ci0gIHJldHVybiBzY2FucHRyOwotfQotCi0KLS8qCi0gKiBDcmVhdGUgYSByZWNvbW1lbmRlZCBwcm9ncmVzc2l2ZS1KUEVHIHNjcmlwdC4KLSAqIGNpbmZvLT5udW1fY29tcG9uZW50cyBhbmQgY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgbXVzdCBiZSBjb3JyZWN0LgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24gKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBpbnQgbmNvbXBzID0gY2luZm8tPm51bV9jb21wb25lbnRzOwotICBpbnQgbnNjYW5zOwotICBqcGVnX3NjYW5faW5mbyAqIHNjYW5wdHI7Ci0KLSAgLyogU2FmZXR5IGNoZWNrIHRvIGVuc3VyZSBzdGFydF9jb21wcmVzcyBub3QgY2FsbGVkIHlldC4gKi8KLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NUQVJUKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0KLSAgLyogRmlndXJlIHNwYWNlIG5lZWRlZCBmb3Igc2NyaXB0LiAgQ2FsY3VsYXRpb24gbXVzdCBtYXRjaCBjb2RlIGJlbG93ISAqLwotICBpZiAobmNvbXBzID09IDMgJiYgY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyKSB7Ci0gICAgLyogQ3VzdG9tIHNjcmlwdCBmb3IgWUNiQ3IgY29sb3IgaW1hZ2VzLiAqLwotICAgIG5zY2FucyA9IDEwOwotICB9IGVsc2UgewotICAgIC8qIEFsbC1wdXJwb3NlIHNjcmlwdCBmb3Igb3RoZXIgY29sb3Igc3BhY2VzLiAqLwotICAgIGlmIChuY29tcHMgPiBNQVhfQ09NUFNfSU5fU0NBTikKLSAgICAgIG5zY2FucyA9IDYgKiBuY29tcHM7CS8qIDIgREMgKyA0IEFDIHNjYW5zIHBlciBjb21wb25lbnQgKi8KLSAgICBlbHNlCi0gICAgICBuc2NhbnMgPSAyICsgNCAqIG5jb21wczsJLyogMiBEQyBzY2FuczsgNCBBQyBzY2FucyBwZXIgY29tcG9uZW50ICovCi0gIH0KLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3Igc2NyaXB0LgotICAgKiBXZSBuZWVkIHRvIHB1dCBpdCBpbiB0aGUgcGVybWFuZW50IHBvb2wgaW4gY2FzZSB0aGUgYXBwbGljYXRpb24gcGVyZm9ybXMKLSAgICogbXVsdGlwbGUgY29tcHJlc3Npb25zIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHNldHRpbmdzLiAgVG8gYXZvaWQgYSBtZW1vcnkKLSAgICogbGVhayBpZiBqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbiBpcyBjYWxsZWQgcmVwZWF0ZWRseSBmb3IgdGhlIHNhbWUgSlBFRwotICAgKiBvYmplY3QsIHdlIHRyeSB0byByZS11c2UgcHJldmlvdXNseSBhbGxvY2F0ZWQgc3BhY2UsIGFuZCB3ZSBhbGxvY2F0ZQotICAgKiBlbm91Z2ggc3BhY2UgdG8gaGFuZGxlIFlDYkNyIGV2ZW4gaWYgaW5pdGlhbGx5IGFza2VkIGZvciBncmF5c2NhbGUuCi0gICAqLwotICBpZiAoY2luZm8tPnNjcmlwdF9zcGFjZSA9PSBOVUxMIHx8IGNpbmZvLT5zY3JpcHRfc3BhY2Vfc2l6ZSA8IG5zY2FucykgewotICAgIGNpbmZvLT5zY3JpcHRfc3BhY2Vfc2l6ZSA9IE1BWChuc2NhbnMsIDEwKTsKLSAgICBjaW5mby0+c2NyaXB0X3NwYWNlID0gKGpwZWdfc2Nhbl9pbmZvICopCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX1BFUk1BTkVOVCwKLQkJCWNpbmZvLT5zY3JpcHRfc3BhY2Vfc2l6ZSAqIFNJWkVPRihqcGVnX3NjYW5faW5mbykpOwotICB9Ci0gIHNjYW5wdHIgPSBjaW5mby0+c2NyaXB0X3NwYWNlOwotICBjaW5mby0+c2Nhbl9pbmZvID0gc2NhbnB0cjsKLSAgY2luZm8tPm51bV9zY2FucyA9IG5zY2FuczsKLQotICBpZiAobmNvbXBzID09IDMgJiYgY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyKSB7Ci0gICAgLyogQ3VzdG9tIHNjcmlwdCBmb3IgWUNiQ3IgY29sb3IgaW1hZ2VzLiAqLwotICAgIC8qIEluaXRpYWwgREMgc2NhbiAqLwotICAgIHNjYW5wdHIgPSBmaWxsX2RjX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMCwgMSk7Ci0gICAgLyogSW5pdGlhbCBBQyBzY2FuOiBnZXQgc29tZSBsdW1hIGRhdGEgb3V0IGluIGEgaHVycnkgKi8KLSAgICBzY2FucHRyID0gZmlsbF9hX3NjYW4oc2NhbnB0ciwgMCwgMSwgNSwgMCwgMik7Ci0gICAgLyogQ2hyb21hIGRhdGEgaXMgdG9vIHNtYWxsIHRvIGJlIHdvcnRoIGV4cGVuZGluZyBtYW55IHNjYW5zIG9uICovCi0gICAgc2NhbnB0ciA9IGZpbGxfYV9zY2FuKHNjYW5wdHIsIDIsIDEsIDYzLCAwLCAxKTsKLSAgICBzY2FucHRyID0gZmlsbF9hX3NjYW4oc2NhbnB0ciwgMSwgMSwgNjMsIDAsIDEpOwotICAgIC8qIENvbXBsZXRlIHNwZWN0cmFsIHNlbGVjdGlvbiBmb3IgbHVtYSBBQyAqLwotICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAwLCA2LCA2MywgMCwgMik7Ci0gICAgLyogUmVmaW5lIG5leHQgYml0IG9mIGx1bWEgQUMgKi8KLSAgICBzY2FucHRyID0gZmlsbF9hX3NjYW4oc2NhbnB0ciwgMCwgMSwgNjMsIDIsIDEpOwotICAgIC8qIEZpbmlzaCBEQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gKi8KLSAgICBzY2FucHRyID0gZmlsbF9kY19zY2FucyhzY2FucHRyLCBuY29tcHMsIDEsIDApOwotICAgIC8qIEZpbmlzaCBBQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gKi8KLSAgICBzY2FucHRyID0gZmlsbF9hX3NjYW4oc2NhbnB0ciwgMiwgMSwgNjMsIDEsIDApOwotICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAxLCAxLCA2MywgMSwgMCk7Ci0gICAgLyogTHVtYSBib3R0b20gYml0IGNvbWVzIGxhc3Qgc2luY2UgaXQncyB1c3VhbGx5IGxhcmdlc3Qgc2NhbiAqLwotICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAwLCAxLCA2MywgMSwgMCk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogQWxsLXB1cnBvc2Ugc2NyaXB0IGZvciBvdGhlciBjb2xvciBzcGFjZXMuICovCi0gICAgLyogU3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIGZpcnN0IHBhc3MgKi8KLSAgICBzY2FucHRyID0gZmlsbF9kY19zY2FucyhzY2FucHRyLCBuY29tcHMsIDAsIDEpOwotICAgIHNjYW5wdHIgPSBmaWxsX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMSwgNSwgMCwgMik7Ci0gICAgc2NhbnB0ciA9IGZpbGxfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCA2LCA2MywgMCwgMik7Ci0gICAgLyogU3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIHNlY29uZCBwYXNzICovCi0gICAgc2NhbnB0ciA9IGZpbGxfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCAxLCA2MywgMiwgMSk7Ci0gICAgLyogU3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIGZpbmFsIHBhc3MgKi8KLSAgICBzY2FucHRyID0gZmlsbF9kY19zY2FucyhzY2FucHRyLCBuY29tcHMsIDEsIDApOwotICAgIHNjYW5wdHIgPSBmaWxsX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMSwgNjMsIDEsIDApOwotICB9Ci19Ci0KLSNlbmRpZiAvKiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRCAqLwotCi0jZW5kaWYgLy9fRlhfSlBFR19UVVJCT18KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjcGh1ZmYuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjcGh1ZmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ4OWI2Yi4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY3BodWZmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MzYgKzAsMCBAQAotI2lmICFkZWZpbmVkKF9GWF9KUEVHX1RVUkJPXykKLS8qCi0gKiBqY3BodWZmLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBIdWZmbWFuIGVudHJvcHkgZW5jb2Rpbmcgcm91dGluZXMgZm9yIHByb2dyZXNzaXZlIEpQRUcuCi0gKgotICogV2UgZG8gbm90IHN1cHBvcnQgb3V0cHV0IHN1c3BlbnNpb24gaW4gdGhpcyBtb2R1bGUsIHNpbmNlIHRoZSBsaWJyYXJ5Ci0gKiBjdXJyZW50bHkgZG9lcyBub3QgYWxsb3cgbXVsdGlwbGUtc2NhbiBmaWxlcyB0byBiZSB3cml0dGVuIHdpdGggb3V0cHV0Ci0gKiBzdXNwZW5zaW9uLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqY2h1ZmYuaCIJCS8qIERlY2xhcmF0aW9ucyBzaGFyZWQgd2l0aCBqY2h1ZmYuYyAqLwotCi0jaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKLQotLyogRXhwYW5kZWQgZW50cm9weSBlbmNvZGVyIG9iamVjdCBmb3IgcHJvZ3Jlc3NpdmUgSHVmZm1hbiBlbmNvZGluZy4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19lbnRyb3B5X2VuY29kZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgLyogTW9kZSBmbGFnOiBUUlVFIGZvciBvcHRpbWl6YXRpb24sIEZBTFNFIGZvciBhY3R1YWwgZGF0YSBvdXRwdXQgKi8KLSAgYm9vbGVhbiBnYXRoZXJfc3RhdGlzdGljczsKLQotICAvKiBCaXQtbGV2ZWwgY29kaW5nIHN0YXR1cy4KLSAgICogbmV4dF9vdXRwdXRfYnl0ZS9mcmVlX2luX2J1ZmZlciBhcmUgbG9jYWwgY29waWVzIG9mIGNpbmZvLT5kZXN0IGZpZWxkcy4KLSAgICovCi0gIEpPQ1RFVCAqIG5leHRfb3V0cHV0X2J5dGU7CS8qID0+IG5leHQgYnl0ZSB0byB3cml0ZSBpbiBidWZmZXIgKi8KLSAgc2l6ZV90IGZyZWVfaW5fYnVmZmVyOwkvKiAjIG9mIGJ5dGUgc3BhY2VzIHJlbWFpbmluZyBpbiBidWZmZXIgKi8KLSAgSU5UMzIgcHV0X2J1ZmZlcjsJCS8qIGN1cnJlbnQgYml0LWFjY3VtdWxhdGlvbiBidWZmZXIgKi8KLSAgaW50IHB1dF9iaXRzOwkJCS8qICMgb2YgYml0cyBub3cgaW4gaXQgKi8KLSAgal9jb21wcmVzc19wdHIgY2luZm87CQkvKiBsaW5rIHRvIGNpbmZvIChuZWVkZWQgZm9yIGR1bXBfYnVmZmVyKSAqLwotCi0gIC8qIENvZGluZyBzdGF0dXMgZm9yIERDIGNvbXBvbmVudHMgKi8KLSAgaW50IGxhc3RfZGNfdmFsW01BWF9DT01QU19JTl9TQ0FOXTsgLyogbGFzdCBEQyBjb2VmIGZvciBlYWNoIGNvbXBvbmVudCAqLwotCi0gIC8qIENvZGluZyBzdGF0dXMgZm9yIEFDIGNvbXBvbmVudHMgKi8KLSAgaW50IGFjX3RibF9ubzsJCS8qIHRoZSB0YWJsZSBudW1iZXIgb2YgdGhlIHNpbmdsZSBjb21wb25lbnQgKi8KLSAgdW5zaWduZWQgaW50IEVPQlJVTjsJCS8qIHJ1biBsZW5ndGggb2YgRU9CcyAqLwotICB1bnNpZ25lZCBpbnQgQkU7CQkvKiAjIG9mIGJ1ZmZlcmVkIGNvcnJlY3Rpb24gYml0cyBiZWZvcmUgTUNVICovCi0gIGNoYXIgKiBiaXRfYnVmZmVyOwkJLyogYnVmZmVyIGZvciBjb3JyZWN0aW9uIGJpdHMgKDEgcGVyIGNoYXIpICovCi0gIC8qIHBhY2tpbmcgY29ycmVjdGlvbiBiaXRzIHRpZ2h0bHkgd291bGQgc2F2ZSBzb21lIHNwYWNlIGJ1dCBjb3N0IHRpbWUuLi4gKi8KLQotICB1bnNpZ25lZCBpbnQgcmVzdGFydHNfdG9fZ287CS8qIE1DVXMgbGVmdCBpbiB0aGlzIHJlc3RhcnQgaW50ZXJ2YWwgKi8KLSAgaW50IG5leHRfcmVzdGFydF9udW07CQkvKiBuZXh0IHJlc3RhcnQgbnVtYmVyIHRvIHdyaXRlICgwLTcpICovCi0KLSAgLyogUG9pbnRlcnMgdG8gZGVyaXZlZCB0YWJsZXMgKHRoZXNlIHdvcmtzcGFjZXMgaGF2ZSBpbWFnZSBsaWZlc3BhbikuCi0gICAqIFNpbmNlIGFueSBvbmUgc2NhbiBjb2RlcyBvbmx5IERDIG9yIG9ubHkgQUMsIHdlIG9ubHkgbmVlZCBvbmUgc2V0Ci0gICAqIG9mIHRhYmxlcywgbm90IG9uZSBmb3IgREMgYW5kIG9uZSBmb3IgQUMuCi0gICAqLwotICBjX2Rlcml2ZWRfdGJsICogZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOwotCi0gIC8qIFN0YXRpc3RpY3MgdGFibGVzIGZvciBvcHRpbWl6YXRpb247IGFnYWluLCBvbmUgc2V0IGlzIGVub3VnaCAqLwotICBsb25nICogY291bnRfcHRyc1tOVU1fSFVGRl9UQkxTXTsKLX0gcGh1ZmZfZW50cm9weV9lbmNvZGVyOwotCi10eXBlZGVmIHBodWZmX2VudHJvcHlfZW5jb2RlciAqIHBodWZmX2VudHJvcHlfcHRyOwotCi0vKiBNQVhfQ09SUl9CSVRTIGlzIHRoZSBudW1iZXIgb2YgYml0cyB0aGUgQUMgcmVmaW5lbWVudCBjb3JyZWN0aW9uLWJpdAotICogYnVmZmVyIGNhbiBob2xkLiAgTGFyZ2VyIHNpemVzIG1heSBzbGlnaHRseSBpbXByb3ZlIGNvbXByZXNzaW9uLCBidXQKLSAqIDEwMDAgaXMgYWxyZWFkeSB3ZWxsIGludG8gdGhlIHJlYWxtIG9mIG92ZXJraWxsLgotICogVGhlIG1pbmltdW0gc2FmZSBzaXplIGlzIDY0IGJpdHMuCi0gKi8KLQotI2RlZmluZSBNQVhfQ09SUl9CSVRTICAxMDAwCS8qIE1heCAjIG9mIGNvcnJlY3Rpb24gYml0cyBJIGNhbiBidWZmZXIgKi8KLQotLyogSVJJR0hUX1NISUZUIGlzIGxpa2UgUklHSFRfU0hJRlQsIGJ1dCB3b3JrcyBvbiBpbnQgcmF0aGVyIHRoYW4gSU5UMzIuCi0gKiBXZSBhc3N1bWUgdGhhdCBpbnQgcmlnaHQgc2hpZnQgaXMgdW5zaWduZWQgaWYgSU5UMzIgcmlnaHQgc2hpZnQgaXMsCi0gKiB3aGljaCBzaG91bGQgYmUgc2FmZS4KLSAqLwotCi0jaWZkZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKLSNkZWZpbmUgSVNISUZUX1RFTVBTCWludCBpc2hpZnRfdGVtcDsKLSNkZWZpbmUgSVJJR0hUX1NISUZUKHgsc2hmdCkgIFwKLQkoKGlzaGlmdF90ZW1wID0gKHgpKSA8IDAgPyBcCi0JIChpc2hpZnRfdGVtcCA+PiAoc2hmdCkpIHwgKCh+MCkgPDwgKDE2LShzaGZ0KSkpIDogXAotCSAoaXNoaWZ0X3RlbXAgPj4gKHNoZnQpKSkKLSNlbHNlCi0jZGVmaW5lIElTSElGVF9URU1QUwotI2RlZmluZSBJUklHSFRfU0hJRlQoeCxzaGZ0KQkoKHgpID4+IChzaGZ0KSkKLSNlbmRpZgotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotTUVUSE9EREVGKGJvb2xlYW4pIGVuY29kZV9tY3VfRENfZmlyc3QgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKLU1FVEhPRERFRihib29sZWFuKSBlbmNvZGVfbWN1X0FDX2ZpcnN0IEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgICBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7Ci1NRVRIT0RERUYoYm9vbGVhbikgZW5jb2RlX21jdV9EQ19yZWZpbmUgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICAgICBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7Ci1NRVRIT0RERUYoYm9vbGVhbikgZW5jb2RlX21jdV9BQ19yZWZpbmUgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICAgICBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7Ci1NRVRIT0RERUYodm9pZCkgZmluaXNoX3Bhc3NfcGh1ZmYgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotTUVUSE9EREVGKHZvaWQpIGZpbmlzaF9wYXNzX2dhdGhlcl9waHVmZiBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIGEgSHVmZm1hbi1jb21wcmVzc2VkIHNjYW4gdXNpbmcgcHJvZ3Jlc3NpdmUgSlBFRy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfcGh1ZmYgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGdhdGhlcl9zdGF0aXN0aWNzKQoteyAgCi0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICBib29sZWFuIGlzX0RDX2JhbmQ7Ci0gIGludCBjaSwgdGJsOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLQotICBlbnRyb3B5LT5jaW5mbyA9IGNpbmZvOwotICBlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcyA9IGdhdGhlcl9zdGF0aXN0aWNzOwotCi0gIGlzX0RDX2JhbmQgPSAoY2luZm8tPlNzID09IDApOwotCi0gIC8qIFdlIGFzc3VtZSBqY21hc3Rlci5jIGFscmVhZHkgdmFsaWRhdGVkIHRoZSBzY2FuIHBhcmFtZXRlcnMuICovCi0KLSAgLyogU2VsZWN0IGV4ZWN1dGlvbiByb3V0aW5lcyAqLwotICBpZiAoY2luZm8tPkFoID09IDApIHsKLSAgICBpZiAoaXNfRENfYmFuZCkKLSAgICAgIGVudHJvcHktPnB1Yi5lbmNvZGVfbWN1ID0gZW5jb2RlX21jdV9EQ19maXJzdDsKLSAgICBlbHNlCi0gICAgICBlbnRyb3B5LT5wdWIuZW5jb2RlX21jdSA9IGVuY29kZV9tY3VfQUNfZmlyc3Q7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGlzX0RDX2JhbmQpCi0gICAgICBlbnRyb3B5LT5wdWIuZW5jb2RlX21jdSA9IGVuY29kZV9tY3VfRENfcmVmaW5lOwotICAgIGVsc2UgewotICAgICAgZW50cm9weS0+cHViLmVuY29kZV9tY3UgPSBlbmNvZGVfbWN1X0FDX3JlZmluZTsKLSAgICAgIC8qIEFDIHJlZmluZW1lbnQgbmVlZHMgYSBjb3JyZWN0aW9uIGJpdCBidWZmZXIgKi8KLSAgICAgIGlmIChlbnRyb3B5LT5iaXRfYnVmZmVyID09IE5VTEwpCi0JZW50cm9weS0+Yml0X2J1ZmZlciA9IChjaGFyICopCi0JICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgICAgIE1BWF9DT1JSX0JJVFMgKiBTSVpFT0YoY2hhcikpOwotICAgIH0KLSAgfQotICBpZiAoZ2F0aGVyX3N0YXRpc3RpY3MpCi0gICAgZW50cm9weS0+cHViLmZpbmlzaF9wYXNzID0gZmluaXNoX3Bhc3NfZ2F0aGVyX3BodWZmOwotICBlbHNlCi0gICAgZW50cm9weS0+cHViLmZpbmlzaF9wYXNzID0gZmluaXNoX3Bhc3NfcGh1ZmY7Ci0KLSAgLyogT25seSBEQyBjb2VmZmljaWVudHMgbWF5IGJlIGludGVybGVhdmVkLCBzbyBjaW5mby0+Y29tcHNfaW5fc2NhbiA9IDEKLSAgICogZm9yIEFDIGNvZWZmaWNpZW50cy4KLSAgICovCi0gIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0gICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLSAgICAvKiBJbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KLSAgICBlbnRyb3B5LT5sYXN0X2RjX3ZhbFtjaV0gPSAwOwotICAgIC8qIEdldCB0YWJsZSBpbmRleCAqLwotICAgIGlmIChpc19EQ19iYW5kKSB7Ci0gICAgICBpZiAoY2luZm8tPkFoICE9IDApCS8qIERDIHJlZmluZW1lbnQgbmVlZHMgbm8gdGFibGUgKi8KLQljb250aW51ZTsKLSAgICAgIHRibCA9IGNvbXBwdHItPmRjX3RibF9ubzsKLSAgICB9IGVsc2UgewotICAgICAgZW50cm9weS0+YWNfdGJsX25vID0gdGJsID0gY29tcHB0ci0+YWNfdGJsX25vOwotICAgIH0KLSAgICBpZiAoZ2F0aGVyX3N0YXRpc3RpY3MpIHsKLSAgICAgIC8qIENoZWNrIGZvciBpbnZhbGlkIHRhYmxlIGluZGV4ICovCi0gICAgICAvKiAobWFrZV9jX2Rlcml2ZWRfdGJsIGRvZXMgdGhpcyBpbiB0aGUgb3RoZXIgcGF0aCkgKi8KLSAgICAgIGlmICh0YmwgPCAwIHx8IHRibCA+PSBOVU1fSFVGRl9UQkxTKQotICAgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9OT19IVUZGX1RBQkxFLCB0YmwpOwotICAgICAgLyogQWxsb2NhdGUgYW5kIHplcm8gdGhlIHN0YXRpc3RpY3MgdGFibGVzICovCi0gICAgICAvKiBOb3RlIHRoYXQganBlZ19nZW5fb3B0aW1hbF90YWJsZSBleHBlY3RzIDI1NyBlbnRyaWVzIGluIGVhY2ggdGFibGUhICovCi0gICAgICBpZiAoZW50cm9weS0+Y291bnRfcHRyc1t0YmxdID09IE5VTEwpCi0JZW50cm9weS0+Y291bnRfcHRyc1t0YmxdID0gKGxvbmcgKikKLQkgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICAgICAgMjU3ICogU0laRU9GKGxvbmcpKTsKLSAgICAgIE1FTVpFUk8oZW50cm9weS0+Y291bnRfcHRyc1t0YmxdLCAyNTcgKiBTSVpFT0YobG9uZykpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBDb21wdXRlIGRlcml2ZWQgdmFsdWVzIGZvciBIdWZmbWFuIHRhYmxlICovCi0gICAgICAvKiBXZSBtYXkgZG8gdGhpcyBtb3JlIHRoYW4gb25jZSBmb3IgYSB0YWJsZSwgYnV0IGl0J3Mgbm90IGV4cGVuc2l2ZSAqLwotICAgICAganBlZ19tYWtlX2NfZGVyaXZlZF90YmwoY2luZm8sIGlzX0RDX2JhbmQsIHRibCwKLQkJCSAgICAgICYgZW50cm9weS0+ZGVyaXZlZF90YmxzW3RibF0pOwotICAgIH0KLSAgfQotCi0gIC8qIEluaXRpYWxpemUgQUMgc3R1ZmYgKi8KLSAgZW50cm9weS0+RU9CUlVOID0gMDsKLSAgZW50cm9weS0+QkUgPSAwOwotCi0gIC8qIEluaXRpYWxpemUgYml0IGJ1ZmZlciB0byBlbXB0eSAqLwotICBlbnRyb3B5LT5wdXRfYnVmZmVyID0gMDsKLSAgZW50cm9weS0+cHV0X2JpdHMgPSAwOwotCi0gIC8qIEluaXRpYWxpemUgcmVzdGFydCBzdHVmZiAqLwotICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOwotICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtID0gMDsKLX0KLQotCi0vKiBPdXRwdXR0aW5nIGJ5dGVzIHRvIHRoZSBmaWxlLgotICogTkI6IHRoZXNlIG11c3QgYmUgY2FsbGVkIG9ubHkgd2hlbiBhY3R1YWxseSBvdXRwdXR0aW5nLAotICogdGhhdCBpcywgZW50cm9weS0+Z2F0aGVyX3N0YXRpc3RpY3MgPT0gRkFMU0UuCi0gKi8KLQotLyogRW1pdCBhIGJ5dGUgKi8KLSNkZWZpbmUgZW1pdF9ieXRlKGVudHJvcHksdmFsKSAgXAotCXsgKihlbnRyb3B5KS0+bmV4dF9vdXRwdXRfYnl0ZSsrID0gKEpPQ1RFVCkgKHZhbCk7ICBcCi0JICBpZiAoLS0oZW50cm9weSktPmZyZWVfaW5fYnVmZmVyID09IDApICBcCi0JICAgIGR1bXBfYnVmZmVyKGVudHJvcHkpOyB9Ci0KLQotTE9DQUwodm9pZCkKLWR1bXBfYnVmZmVyIChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5KQotLyogRW1wdHkgdGhlIG91dHB1dCBidWZmZXI7IHdlIGRvIG5vdCBzdXBwb3J0IHN1c3BlbnNpb24gaW4gdGhpcyBtb2R1bGUuICovCi17Ci0gIHN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21nciAqIGRlc3QgPSBlbnRyb3B5LT5jaW5mby0+ZGVzdDsKLQotICBpZiAoISAoKmRlc3QtPmVtcHR5X291dHB1dF9idWZmZXIpIChlbnRyb3B5LT5jaW5mbykpCi0gICAgRVJSRVhJVChlbnRyb3B5LT5jaW5mbywgSkVSUl9DQU5UX1NVU1BFTkQpOwotICAvKiBBZnRlciBhIHN1Y2Nlc3NmdWwgYnVmZmVyIGR1bXAsIG11c3QgcmVzZXQgYnVmZmVyIHBvaW50ZXJzICovCi0gIGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGUgPSBkZXN0LT5uZXh0X291dHB1dF9ieXRlOwotICBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlciA9IGRlc3QtPmZyZWVfaW5fYnVmZmVyOwotfQotCi0KLS8qIE91dHB1dHRpbmcgYml0cyB0byB0aGUgZmlsZSAqLwotCi0vKiBPbmx5IHRoZSByaWdodCAyNCBiaXRzIG9mIHB1dF9idWZmZXIgYXJlIHVzZWQ7IHRoZSB2YWxpZCBiaXRzIGFyZQotICogbGVmdC1qdXN0aWZpZWQgaW4gdGhpcyBwYXJ0LiAgQXQgbW9zdCAxNiBiaXRzIGNhbiBiZSBwYXNzZWQgdG8gZW1pdF9iaXRzCi0gKiBpbiBvbmUgY2FsbCwgYW5kIHdlIG5ldmVyIHJldGFpbiBtb3JlIHRoYW4gNyBiaXRzIGluIHB1dF9idWZmZXIKLSAqIGJldHdlZW4gY2FsbHMsIHNvIDI0IGJpdHMgYXJlIHN1ZmZpY2llbnQuCi0gKi8KLQotSU5MSU5FCi1MT0NBTCh2b2lkKQotZW1pdF9iaXRzIChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCB1bnNpZ25lZCBpbnQgY29kZSwgaW50IHNpemUpCi0vKiBFbWl0IHNvbWUgYml0cywgdW5sZXNzIHdlIGFyZSBpbiBnYXRoZXIgbW9kZSAqLwotewotICAvKiBUaGlzIHJvdXRpbmUgaXMgaGVhdmlseSB1c2VkLCBzbyBpdCdzIHdvcnRoIGNvZGluZyB0aWdodGx5LiAqLwotICByZWdpc3RlciBJTlQzMiBwdXRfYnVmZmVyID0gKElOVDMyKSBjb2RlOwotICByZWdpc3RlciBpbnQgcHV0X2JpdHMgPSBlbnRyb3B5LT5wdXRfYml0czsKLQotICAvKiBpZiBzaXplIGlzIDAsIGNhbGxlciB1c2VkIGFuIGludmFsaWQgSHVmZm1hbiB0YWJsZSBlbnRyeSAqLwotICBpZiAoc2l6ZSA9PSAwKQotICAgIEVSUkVYSVQoZW50cm9weS0+Y2luZm8sIEpFUlJfSFVGRl9NSVNTSU5HX0NPREUpOwotCi0gIGlmIChlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcykKLSAgICByZXR1cm47CQkJLyogZG8gbm90aGluZyBpZiB3ZSdyZSBvbmx5IGdldHRpbmcgc3RhdHMgKi8KLQotICBwdXRfYnVmZmVyICY9ICgoKElOVDMyKSAxKTw8c2l6ZSkgLSAxOyAvKiBtYXNrIG9mZiBhbnkgZXh0cmEgYml0cyBpbiBjb2RlICovCi0gIAotICBwdXRfYml0cyArPSBzaXplOwkJLyogbmV3IG51bWJlciBvZiBiaXRzIGluIGJ1ZmZlciAqLwotICAKLSAgcHV0X2J1ZmZlciA8PD0gMjQgLSBwdXRfYml0czsgLyogYWxpZ24gaW5jb21pbmcgYml0cyAqLwotCi0gIHB1dF9idWZmZXIgfD0gZW50cm9weS0+cHV0X2J1ZmZlcjsgLyogYW5kIG1lcmdlIHdpdGggb2xkIGJ1ZmZlciBjb250ZW50cyAqLwotCi0gIHdoaWxlIChwdXRfYml0cyA+PSA4KSB7Ci0gICAgaW50IGMgPSAoaW50KSAoKHB1dF9idWZmZXIgPj4gMTYpICYgMHhGRik7Ci0gICAgCi0gICAgZW1pdF9ieXRlKGVudHJvcHksIGMpOwotICAgIGlmIChjID09IDB4RkYpIHsJCS8qIG5lZWQgdG8gc3R1ZmYgYSB6ZXJvIGJ5dGU/ICovCi0gICAgICBlbWl0X2J5dGUoZW50cm9weSwgMCk7Ci0gICAgfQotICAgIHB1dF9idWZmZXIgPDw9IDg7Ci0gICAgcHV0X2JpdHMgLT0gODsKLSAgfQotCi0gIGVudHJvcHktPnB1dF9idWZmZXIgPSBwdXRfYnVmZmVyOyAvKiB1cGRhdGUgdmFyaWFibGVzICovCi0gIGVudHJvcHktPnB1dF9iaXRzID0gcHV0X2JpdHM7Ci19Ci0KLQotTE9DQUwodm9pZCkKLWZsdXNoX2JpdHMgKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkpCi17Ci0gIGVtaXRfYml0cyhlbnRyb3B5LCAweDdGLCA3KTsgLyogZmlsbCBhbnkgcGFydGlhbCBieXRlIHdpdGggb25lcyAqLwotICBlbnRyb3B5LT5wdXRfYnVmZmVyID0gMDsgICAgIC8qIGFuZCByZXNldCBiaXQtYnVmZmVyIHRvIGVtcHR5ICovCi0gIGVudHJvcHktPnB1dF9iaXRzID0gMDsKLX0KLQotCi0vKgotICogRW1pdCAob3IganVzdCBjb3VudCkgYSBIdWZmbWFuIHN5bWJvbC4KLSAqLwotCi1JTkxJTkUKLUxPQ0FMKHZvaWQpCi1lbWl0X3N5bWJvbCAocGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSwgaW50IHRibF9ubywgaW50IHN5bWJvbCkKLXsKLSAgaWYgKGVudHJvcHktPmdhdGhlcl9zdGF0aXN0aWNzKQotICAgIGVudHJvcHktPmNvdW50X3B0cnNbdGJsX25vXVtzeW1ib2xdKys7Ci0gIGVsc2UgewotICAgIGNfZGVyaXZlZF90YmwgKiB0YmwgPSBlbnRyb3B5LT5kZXJpdmVkX3RibHNbdGJsX25vXTsKLSAgICBlbWl0X2JpdHMoZW50cm9weSwgdGJsLT5laHVmY29bc3ltYm9sXSwgdGJsLT5laHVmc2lbc3ltYm9sXSk7Ci0gIH0KLX0KLQotCi0vKgotICogRW1pdCBiaXRzIGZyb20gYSBjb3JyZWN0aW9uIGJpdCBidWZmZXIuCi0gKi8KLQotTE9DQUwodm9pZCkKLWVtaXRfYnVmZmVyZWRfYml0cyAocGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSwgY2hhciAqIGJ1ZnN0YXJ0LAotCQkgICAgdW5zaWduZWQgaW50IG5iaXRzKQotewotICBpZiAoZW50cm9weS0+Z2F0aGVyX3N0YXRpc3RpY3MpCi0gICAgcmV0dXJuOwkJCS8qIG5vIHJlYWwgd29yayAqLwotCi0gIHdoaWxlIChuYml0cyA+IDApIHsKLSAgICBlbWl0X2JpdHMoZW50cm9weSwgKHVuc2lnbmVkIGludCkgKCpidWZzdGFydCksIDEpOwotICAgIGJ1ZnN0YXJ0Kys7Ci0gICAgbmJpdHMtLTsKLSAgfQotfQotCi0KLS8qCi0gKiBFbWl0IGFueSBwZW5kaW5nIEVPQlJVTiBzeW1ib2wuCi0gKi8KLQotTE9DQUwodm9pZCkKLWVtaXRfZW9icnVuIChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5KQotewotICByZWdpc3RlciBpbnQgdGVtcCwgbmJpdHM7Ci0KLSAgaWYgKGVudHJvcHktPkVPQlJVTiA+IDApIHsJLyogaWYgdGhlcmUgaXMgYW55IHBlbmRpbmcgRU9CUlVOICovCi0gICAgdGVtcCA9IGVudHJvcHktPkVPQlJVTjsKLSAgICBuYml0cyA9IDA7Ci0gICAgd2hpbGUgKCh0ZW1wID4+PSAxKSkKLSAgICAgIG5iaXRzKys7Ci0gICAgLyogc2FmZXR5IGNoZWNrOiBzaG91bGRuJ3QgaGFwcGVuIGdpdmVuIGxpbWl0ZWQgY29ycmVjdGlvbi1iaXQgYnVmZmVyICovCi0gICAgaWYgKG5iaXRzID4gMTQpCi0gICAgICBFUlJFWElUKGVudHJvcHktPmNpbmZvLCBKRVJSX0hVRkZfTUlTU0lOR19DT0RFKTsKLQotICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgbmJpdHMgPDwgNCk7Ci0gICAgaWYgKG5iaXRzKQotICAgICAgZW1pdF9iaXRzKGVudHJvcHksIGVudHJvcHktPkVPQlJVTiwgbmJpdHMpOwotCi0gICAgZW50cm9weS0+RU9CUlVOID0gMDsKLQotICAgIC8qIEVtaXQgYW55IGJ1ZmZlcmVkIGNvcnJlY3Rpb24gYml0cyAqLwotICAgIGVtaXRfYnVmZmVyZWRfYml0cyhlbnRyb3B5LCBlbnRyb3B5LT5iaXRfYnVmZmVyLCBlbnRyb3B5LT5CRSk7Ci0gICAgZW50cm9weS0+QkUgPSAwOwotICB9Ci19Ci0KLQotLyoKLSAqIEVtaXQgYSByZXN0YXJ0IG1hcmtlciAmIHJlc3luY2hyb25pemUgcHJlZGljdGlvbnMuCi0gKi8KLQotTE9DQUwodm9pZCkKLWVtaXRfcmVzdGFydCAocGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSwgaW50IHJlc3RhcnRfbnVtKQotewotICBpbnQgY2k7Ci0KLSAgZW1pdF9lb2JydW4oZW50cm9weSk7Ci0KLSAgaWYgKCEgZW50cm9weS0+Z2F0aGVyX3N0YXRpc3RpY3MpIHsKLSAgICBmbHVzaF9iaXRzKGVudHJvcHkpOwotICAgIGVtaXRfYnl0ZShlbnRyb3B5LCAweEZGKTsKLSAgICBlbWl0X2J5dGUoZW50cm9weSwgSlBFR19SU1QwICsgcmVzdGFydF9udW0pOwotICB9Ci0KLSAgaWYgKGVudHJvcHktPmNpbmZvLT5TcyA9PSAwKSB7Ci0gICAgLyogUmUtaW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCi0gICAgZm9yIChjaSA9IDA7IGNpIDwgZW50cm9weS0+Y2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspCi0gICAgICBlbnRyb3B5LT5sYXN0X2RjX3ZhbFtjaV0gPSAwOwotICB9IGVsc2UgewotICAgIC8qIFJlLWluaXRpYWxpemUgYWxsIEFDLXJlbGF0ZWQgZmllbGRzIHRvIDAgKi8KLSAgICBlbnRyb3B5LT5FT0JSVU4gPSAwOwotICAgIGVudHJvcHktPkJFID0gMDsKLSAgfQotfQotCi0KLS8qCi0gKiBNQ1UgZW5jb2RpbmcgZm9yIERDIGluaXRpYWwgc2NhbiAoZWl0aGVyIHNwZWN0cmFsIHNlbGVjdGlvbiwKLSAqIG9yIGZpcnN0IHBhc3Mgb2Ygc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uKS4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLWVuY29kZV9tY3VfRENfZmlyc3QgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQotewotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgcmVnaXN0ZXIgaW50IHRlbXAsIHRlbXAyOwotICByZWdpc3RlciBpbnQgbmJpdHM7Ci0gIGludCBibGtuLCBjaTsKLSAgaW50IEFsID0gY2luZm8tPkFsOwotICBKQkxPQ0tST1cgYmxvY2s7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotICBJU0hJRlRfVEVNUFMKLQotICBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlID0gY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGU7Ci0gIGVudHJvcHktPmZyZWVfaW5fYnVmZmVyID0gY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyOwotCi0gIC8qIEVtaXQgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkKLSAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKLSAgICAgIGVtaXRfcmVzdGFydChlbnRyb3B5LCBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKTsKLQotICAvKiBFbmNvZGUgdGhlIE1DVSBkYXRhIGJsb2NrcyAqLwotICBmb3IgKGJsa24gPSAwOyBibGtuIDwgY2luZm8tPmJsb2Nrc19pbl9NQ1U7IGJsa24rKykgewotICAgIGJsb2NrID0gTUNVX2RhdGFbYmxrbl07Ci0gICAgY2kgPSBjaW5mby0+TUNVX21lbWJlcnNoaXBbYmxrbl07Ci0gICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLQotICAgIC8qIENvbXB1dGUgdGhlIERDIHZhbHVlIGFmdGVyIHRoZSByZXF1aXJlZCBwb2ludCB0cmFuc2Zvcm0gYnkgQWwuCi0gICAgICogVGhpcyBpcyBzaW1wbHkgYW4gYXJpdGhtZXRpYyByaWdodCBzaGlmdC4KLSAgICAgKi8KLSAgICB0ZW1wMiA9IElSSUdIVF9TSElGVCgoaW50KSAoKCpibG9jaylbMF0pLCBBbCk7Ci0KLSAgICAvKiBEQyBkaWZmZXJlbmNlcyBhcmUgZmlndXJlZCBvbiB0aGUgcG9pbnQtdHJhbnNmb3JtZWQgdmFsdWVzLiAqLwotICAgIHRlbXAgPSB0ZW1wMiAtIGVudHJvcHktPmxhc3RfZGNfdmFsW2NpXTsKLSAgICBlbnRyb3B5LT5sYXN0X2RjX3ZhbFtjaV0gPSB0ZW1wMjsKLQotICAgIC8qIEVuY29kZSB0aGUgREMgY29lZmZpY2llbnQgZGlmZmVyZW5jZSBwZXIgc2VjdGlvbiBHLjEuMi4xICovCi0gICAgdGVtcDIgPSB0ZW1wOwotICAgIGlmICh0ZW1wIDwgMCkgewotICAgICAgdGVtcCA9IC10ZW1wOwkJLyogdGVtcCBpcyBhYnMgdmFsdWUgb2YgaW5wdXQgKi8KLSAgICAgIC8qIEZvciBhIG5lZ2F0aXZlIGlucHV0LCB3YW50IHRlbXAyID0gYml0d2lzZSBjb21wbGVtZW50IG9mIGFicyhpbnB1dCkgKi8KLSAgICAgIC8qIFRoaXMgY29kZSBhc3N1bWVzIHdlIGFyZSBvbiBhIHR3bydzIGNvbXBsZW1lbnQgbWFjaGluZSAqLwotICAgICAgdGVtcDItLTsKLSAgICB9Ci0gICAgCi0gICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLwotICAgIG5iaXRzID0gMDsKLSAgICB3aGlsZSAodGVtcCkgewotICAgICAgbmJpdHMrKzsKLSAgICAgIHRlbXAgPj49IDE7Ci0gICAgfQotICAgIC8qIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgY29lZmZpY2llbnQgdmFsdWVzLgotICAgICAqIFNpbmNlIHdlJ3JlIGVuY29kaW5nIGEgZGlmZmVyZW5jZSwgdGhlIHJhbmdlIGxpbWl0IGlzIHR3aWNlIGFzIG11Y2guCi0gICAgICovCi0gICAgaWYgKG5iaXRzID4gTUFYX0NPRUZfQklUUysxKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfRENUX0NPRUYpOwotICAgIAotICAgIC8qIENvdW50L2VtaXQgdGhlIEh1ZmZtYW4tY29kZWQgc3ltYm9sIGZvciB0aGUgbnVtYmVyIG9mIGJpdHMgKi8KLSAgICBlbWl0X3N5bWJvbChlbnRyb3B5LCBjb21wcHRyLT5kY190Ymxfbm8sIG5iaXRzKTsKLSAgICAKLSAgICAvKiBFbWl0IHRoYXQgbnVtYmVyIG9mIGJpdHMgb2YgdGhlIHZhbHVlLCBpZiBwb3NpdGl2ZSwgKi8KLSAgICAvKiBvciB0aGUgY29tcGxlbWVudCBvZiBpdHMgbWFnbml0dWRlLCBpZiBuZWdhdGl2ZS4gKi8KLSAgICBpZiAobmJpdHMpCQkJLyogZW1pdF9iaXRzIHJlamVjdHMgY2FsbHMgd2l0aCBzaXplIDAgKi8KLSAgICAgIGVtaXRfYml0cyhlbnRyb3B5LCAodW5zaWduZWQgaW50KSB0ZW1wMiwgbmJpdHMpOwotICB9Ci0KLSAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlOwotICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlcjsKLQotICAvKiBVcGRhdGUgcmVzdGFydC1pbnRlcnZhbCBzdGF0ZSB0b28gKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7Ci0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApIHsKLSAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7Ci0gICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKys7Ci0gICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtICY9IDc7Ci0gICAgfQotICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07Ci0gIH0KLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogTUNVIGVuY29kaW5nIGZvciBBQyBpbml0aWFsIHNjYW4gKGVpdGhlciBzcGVjdHJhbCBzZWxlY3Rpb24sCi0gKiBvciBmaXJzdCBwYXNzIG9mIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbikuCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1lbmNvZGVfbWN1X0FDX2ZpcnN0IChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKLXsKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIHJlZ2lzdGVyIGludCB0ZW1wLCB0ZW1wMjsKLSAgcmVnaXN0ZXIgaW50IG5iaXRzOwotICByZWdpc3RlciBpbnQgciwgazsKLSAgaW50IFNlID0gY2luZm8tPlNlOwotICBpbnQgQWwgPSBjaW5mby0+QWw7Ci0gIEpCTE9DS1JPVyBibG9jazsKLQotICBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlID0gY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGU7Ci0gIGVudHJvcHktPmZyZWVfaW5fYnVmZmVyID0gY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyOwotCi0gIC8qIEVtaXQgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkKLSAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKLSAgICAgIGVtaXRfcmVzdGFydChlbnRyb3B5LCBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKTsKLQotICAvKiBFbmNvZGUgdGhlIE1DVSBkYXRhIGJsb2NrICovCi0gIGJsb2NrID0gTUNVX2RhdGFbMF07Ci0KLSAgLyogRW5jb2RlIHRoZSBBQyBjb2VmZmljaWVudHMgcGVyIHNlY3Rpb24gRy4xLjIuMiwgZmlnLiBHLjMgKi8KLSAgCi0gIHIgPSAwOwkJCS8qIHIgPSBydW4gbGVuZ3RoIG9mIHplcm9zICovCi0gICAKLSAgZm9yIChrID0gY2luZm8tPlNzOyBrIDw9IFNlOyBrKyspIHsKLSAgICBpZiAoKHRlbXAgPSAoKmJsb2NrKVtqcGVnX25hdHVyYWxfb3JkZXJba11dKSA9PSAwKSB7Ci0gICAgICByKys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgLyogV2UgbXVzdCBhcHBseSB0aGUgcG9pbnQgdHJhbnNmb3JtIGJ5IEFsLiAgRm9yIEFDIGNvZWZmaWNpZW50cyB0aGlzCi0gICAgICogaXMgYW4gaW50ZWdlciBkaXZpc2lvbiB3aXRoIHJvdW5kaW5nIHRvd2FyZHMgMC4gIFRvIGRvIHRoaXMgcG9ydGFibHkKLSAgICAgKiBpbiBDLCB3ZSBzaGlmdCBhZnRlciBvYnRhaW5pbmcgdGhlIGFic29sdXRlIHZhbHVlOyBzbyB0aGUgY29kZSBpcwotICAgICAqIGludGVyd292ZW4gd2l0aCBmaW5kaW5nIHRoZSBhYnMgdmFsdWUgKHRlbXApIGFuZCBvdXRwdXQgYml0cyAodGVtcDIpLgotICAgICAqLwotICAgIGlmICh0ZW1wIDwgMCkgewotICAgICAgdGVtcCA9IC10ZW1wOwkJLyogdGVtcCBpcyBhYnMgdmFsdWUgb2YgaW5wdXQgKi8KLSAgICAgIHRlbXAgPj49IEFsOwkJLyogYXBwbHkgdGhlIHBvaW50IHRyYW5zZm9ybSAqLwotICAgICAgLyogRm9yIGEgbmVnYXRpdmUgY29lZiwgd2FudCB0ZW1wMiA9IGJpdHdpc2UgY29tcGxlbWVudCBvZiBhYnMoY29lZikgKi8KLSAgICAgIHRlbXAyID0gfnRlbXA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRlbXAgPj49IEFsOwkJLyogYXBwbHkgdGhlIHBvaW50IHRyYW5zZm9ybSAqLwotICAgICAgdGVtcDIgPSB0ZW1wOwotICAgIH0KLSAgICAvKiBXYXRjaCBvdXQgZm9yIGNhc2UgdGhhdCBub256ZXJvIGNvZWYgaXMgemVybyBhZnRlciBwb2ludCB0cmFuc2Zvcm0gKi8KLSAgICBpZiAodGVtcCA9PSAwKSB7Ci0gICAgICByKys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvKiBFbWl0IGFueSBwZW5kaW5nIEVPQlJVTiAqLwotICAgIGlmIChlbnRyb3B5LT5FT0JSVU4gPiAwKQotICAgICAgZW1pdF9lb2JydW4oZW50cm9weSk7Ci0gICAgLyogaWYgcnVuIGxlbmd0aCA+IDE1LCBtdXN0IGVtaXQgc3BlY2lhbCBydW4tbGVuZ3RoLTE2IGNvZGVzICgweEYwKSAqLwotICAgIHdoaWxlIChyID4gMTUpIHsKLSAgICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgMHhGMCk7Ci0gICAgICByIC09IDE2OwotICAgIH0KLQotICAgIC8qIEZpbmQgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCBmb3IgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY29lZmZpY2llbnQgKi8KLSAgICBuYml0cyA9IDE7CQkJLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgMSBiaXQgKi8KLSAgICB3aGlsZSAoKHRlbXAgPj49IDEpKQotICAgICAgbmJpdHMrKzsKLSAgICAvKiBDaGVjayBmb3Igb3V0LW9mLXJhbmdlIGNvZWZmaWNpZW50IHZhbHVlcyAqLwotICAgIGlmIChuYml0cyA+IE1BWF9DT0VGX0JJVFMpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9EQ1RfQ09FRik7Ci0KLSAgICAvKiBDb3VudC9lbWl0IEh1ZmZtYW4gc3ltYm9sIGZvciBydW4gbGVuZ3RoIC8gbnVtYmVyIG9mIGJpdHMgKi8KLSAgICBlbWl0X3N5bWJvbChlbnRyb3B5LCBlbnRyb3B5LT5hY190Ymxfbm8sIChyIDw8IDQpICsgbmJpdHMpOwotCi0gICAgLyogRW1pdCB0aGF0IG51bWJlciBvZiBiaXRzIG9mIHRoZSB2YWx1ZSwgaWYgcG9zaXRpdmUsICovCi0gICAgLyogb3IgdGhlIGNvbXBsZW1lbnQgb2YgaXRzIG1hZ25pdHVkZSwgaWYgbmVnYXRpdmUuICovCi0gICAgZW1pdF9iaXRzKGVudHJvcHksICh1bnNpZ25lZCBpbnQpIHRlbXAyLCBuYml0cyk7Ci0KLSAgICByID0gMDsJCQkvKiByZXNldCB6ZXJvIHJ1biBsZW5ndGggKi8KLSAgfQotCi0gIGlmIChyID4gMCkgewkJCS8qIElmIHRoZXJlIGFyZSB0cmFpbGluZyB6ZXJvZXMsICovCi0gICAgZW50cm9weS0+RU9CUlVOKys7CQkvKiBjb3VudCBhbiBFT0IgKi8KLSAgICBpZiAoZW50cm9weS0+RU9CUlVOID09IDB4N0ZGRikKLSAgICAgIGVtaXRfZW9icnVuKGVudHJvcHkpOwkvKiBmb3JjZSBpdCBvdXQgdG8gYXZvaWQgb3ZlcmZsb3cgKi8KLSAgfQotCi0gIGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlID0gZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZTsKLSAgY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyID0gZW50cm9weS0+ZnJlZV9pbl9idWZmZXI7Ci0KLSAgLyogVXBkYXRlIHJlc3RhcnQtaW50ZXJ2YWwgc3RhdGUgdG9vICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgewotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKSB7Ci0gICAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOwotICAgICAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSsrOwotICAgICAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSAmPSA3OwotICAgIH0KLSAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOwotICB9Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIE1DVSBlbmNvZGluZyBmb3IgREMgc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIHJlZmluZW1lbnQgc2Nhbi4KLSAqIE5vdGU6IHdlIGFzc3VtZSBzdWNoIHNjYW5zIGNhbiBiZSBtdWx0aS1jb21wb25lbnQsIGFsdGhvdWdoIHRoZSBzcGVjCi0gKiBpcyBub3QgdmVyeSBjbGVhciBvbiB0aGUgcG9pbnQuCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1lbmNvZGVfbWN1X0RDX3JlZmluZSAoal9jb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCi17Ci0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICByZWdpc3RlciBpbnQgdGVtcDsKLSAgaW50IGJsa247Ci0gIGludCBBbCA9IGNpbmZvLT5BbDsKLSAgSkJMT0NLUk9XIGJsb2NrOwotCi0gIGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKLSAgZW50cm9weS0+ZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7Ci0KLSAgLyogRW1pdCByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQgKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKQotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQotICAgICAgZW1pdF9yZXN0YXJ0KGVudHJvcHksIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0pOwotCi0gIC8qIEVuY29kZSB0aGUgTUNVIGRhdGEgYmxvY2tzICovCi0gIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7Ci0gICAgYmxvY2sgPSBNQ1VfZGF0YVtibGtuXTsKLQotICAgIC8qIFdlIHNpbXBseSBlbWl0IHRoZSBBbCd0aCBiaXQgb2YgdGhlIERDIGNvZWZmaWNpZW50IHZhbHVlLiAqLwotICAgIHRlbXAgPSAoKmJsb2NrKVswXTsKLSAgICBlbWl0X2JpdHMoZW50cm9weSwgKHVuc2lnbmVkIGludCkgKHRlbXAgPj4gQWwpLCAxKTsKLSAgfQotCi0gIGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlID0gZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZTsKLSAgY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyID0gZW50cm9weS0+ZnJlZV9pbl9idWZmZXI7Ci0KLSAgLyogVXBkYXRlIHJlc3RhcnQtaW50ZXJ2YWwgc3RhdGUgdG9vICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgewotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKSB7Ci0gICAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOwotICAgICAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSsrOwotICAgICAgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSAmPSA3OwotICAgIH0KLSAgICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOwotICB9Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIE1DVSBlbmNvZGluZyBmb3IgQUMgc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIHJlZmluZW1lbnQgc2Nhbi4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLWVuY29kZV9tY3VfQUNfcmVmaW5lIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKLXsKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotICByZWdpc3RlciBpbnQgciwgazsKLSAgaW50IEVPQjsKLSAgY2hhciAqQlJfYnVmZmVyOwotICB1bnNpZ25lZCBpbnQgQlI7Ci0gIGludCBTZSA9IGNpbmZvLT5TZTsKLSAgaW50IEFsID0gY2luZm8tPkFsOwotICBKQkxPQ0tST1cgYmxvY2s7Ci0gIGludCBhYnN2YWx1ZXNbRENUU0laRTJdOwotCi0gIGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKLSAgZW50cm9weS0+ZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7Ci0KLSAgLyogRW1pdCByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQgKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKQotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQotICAgICAgZW1pdF9yZXN0YXJ0KGVudHJvcHksIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0pOwotCi0gIC8qIEVuY29kZSB0aGUgTUNVIGRhdGEgYmxvY2sgKi8KLSAgYmxvY2sgPSBNQ1VfZGF0YVswXTsKLQotICAvKiBJdCBpcyBjb252ZW5pZW50IHRvIG1ha2UgYSBwcmUtcGFzcyB0byBkZXRlcm1pbmUgdGhlIHRyYW5zZm9ybWVkCi0gICAqIGNvZWZmaWNpZW50cycgYWJzb2x1dGUgdmFsdWVzIGFuZCB0aGUgRU9CIHBvc2l0aW9uLgotICAgKi8KLSAgRU9CID0gMDsKLSAgZm9yIChrID0gY2luZm8tPlNzOyBrIDw9IFNlOyBrKyspIHsKLSAgICB0ZW1wID0gKCpibG9jaylbanBlZ19uYXR1cmFsX29yZGVyW2tdXTsKLSAgICAvKiBXZSBtdXN0IGFwcGx5IHRoZSBwb2ludCB0cmFuc2Zvcm0gYnkgQWwuICBGb3IgQUMgY29lZmZpY2llbnRzIHRoaXMKLSAgICAgKiBpcyBhbiBpbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG93YXJkcyAwLiAgVG8gZG8gdGhpcyBwb3J0YWJseQotICAgICAqIGluIEMsIHdlIHNoaWZ0IGFmdGVyIG9idGFpbmluZyB0aGUgYWJzb2x1dGUgdmFsdWUuCi0gICAgICovCi0gICAgaWYgKHRlbXAgPCAwKQotICAgICAgdGVtcCA9IC10ZW1wOwkJLyogdGVtcCBpcyBhYnMgdmFsdWUgb2YgaW5wdXQgKi8KLSAgICB0ZW1wID4+PSBBbDsJCS8qIGFwcGx5IHRoZSBwb2ludCB0cmFuc2Zvcm0gKi8KLSAgICBhYnN2YWx1ZXNba10gPSB0ZW1wOwkvKiBzYXZlIGFicyB2YWx1ZSBmb3IgbWFpbiBwYXNzICovCi0gICAgaWYgKHRlbXAgPT0gMSkKLSAgICAgIEVPQiA9IGs7CQkJLyogRU9CID0gaW5kZXggb2YgbGFzdCBuZXdseS1ub256ZXJvIGNvZWYgKi8KLSAgfQotCi0gIC8qIEVuY29kZSB0aGUgQUMgY29lZmZpY2llbnRzIHBlciBzZWN0aW9uIEcuMS4yLjMsIGZpZy4gRy43ICovCi0gIAotICByID0gMDsJCQkvKiByID0gcnVuIGxlbmd0aCBvZiB6ZXJvcyAqLwotICBCUiA9IDA7CQkJLyogQlIgPSBjb3VudCBvZiBidWZmZXJlZCBiaXRzIGFkZGVkIG5vdyAqLwotICBCUl9idWZmZXIgPSBlbnRyb3B5LT5iaXRfYnVmZmVyICsgZW50cm9weS0+QkU7IC8qIEFwcGVuZCBiaXRzIHRvIGJ1ZmZlciAqLwotCi0gIGZvciAoayA9IGNpbmZvLT5TczsgayA8PSBTZTsgaysrKSB7Ci0gICAgaWYgKCh0ZW1wID0gYWJzdmFsdWVzW2tdKSA9PSAwKSB7Ci0gICAgICByKys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvKiBFbWl0IGFueSByZXF1aXJlZCBaUkxzLCBidXQgbm90IGlmIHRoZXkgY2FuIGJlIGZvbGRlZCBpbnRvIEVPQiAqLwotICAgIHdoaWxlIChyID4gMTUgJiYgayA8PSBFT0IpIHsKLSAgICAgIC8qIGVtaXQgYW55IHBlbmRpbmcgRU9CUlVOIGFuZCB0aGUgQkUgY29ycmVjdGlvbiBiaXRzICovCi0gICAgICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKLSAgICAgIC8qIEVtaXQgWlJMICovCi0gICAgICBlbWl0X3N5bWJvbChlbnRyb3B5LCBlbnRyb3B5LT5hY190Ymxfbm8sIDB4RjApOwotICAgICAgciAtPSAxNjsKLSAgICAgIC8qIEVtaXQgYnVmZmVyZWQgY29ycmVjdGlvbiBiaXRzIHRoYXQgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggWlJMICovCi0gICAgICBlbWl0X2J1ZmZlcmVkX2JpdHMoZW50cm9weSwgQlJfYnVmZmVyLCBCUik7Ci0gICAgICBCUl9idWZmZXIgPSBlbnRyb3B5LT5iaXRfYnVmZmVyOyAvKiBCRSBiaXRzIGFyZSBnb25lIG5vdyAqLwotICAgICAgQlIgPSAwOwotICAgIH0KLQotICAgIC8qIElmIHRoZSBjb2VmIHdhcyBwcmV2aW91c2x5IG5vbnplcm8sIGl0IG9ubHkgbmVlZHMgYSBjb3JyZWN0aW9uIGJpdC4KLSAgICAgKiBOT1RFOiBhIHN0cmFpZ2h0IHRyYW5zbGF0aW9uIG9mIHRoZSBzcGVjJ3MgZmlndXJlIEcuNyB3b3VsZCBzdWdnZXN0Ci0gICAgICogdGhhdCB3ZSBhbHNvIG5lZWQgdG8gdGVzdCByID4gMTUuICBCdXQgaWYgciA+IDE1LCB3ZSBjYW4gb25seSBnZXQgaGVyZQotICAgICAqIGlmIGsgPiBFT0IsIHdoaWNoIGltcGxpZXMgdGhhdCB0aGlzIGNvZWZmaWNpZW50IGlzIG5vdCAxLgotICAgICAqLwotICAgIGlmICh0ZW1wID4gMSkgewotICAgICAgLyogVGhlIGNvcnJlY3Rpb24gYml0IGlzIHRoZSBuZXh0IGJpdCBvZiB0aGUgYWJzb2x1dGUgdmFsdWUuICovCi0gICAgICBCUl9idWZmZXJbQlIrK10gPSAoY2hhcikgKHRlbXAgJiAxKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8qIEVtaXQgYW55IHBlbmRpbmcgRU9CUlVOIGFuZCB0aGUgQkUgY29ycmVjdGlvbiBiaXRzICovCi0gICAgZW1pdF9lb2JydW4oZW50cm9weSk7Ci0KLSAgICAvKiBDb3VudC9lbWl0IEh1ZmZtYW4gc3ltYm9sIGZvciBydW4gbGVuZ3RoIC8gbnVtYmVyIG9mIGJpdHMgKi8KLSAgICBlbWl0X3N5bWJvbChlbnRyb3B5LCBlbnRyb3B5LT5hY190Ymxfbm8sIChyIDw8IDQpICsgMSk7Ci0KLSAgICAvKiBFbWl0IG91dHB1dCBiaXQgZm9yIG5ld2x5LW5vbnplcm8gY29lZiAqLwotICAgIHRlbXAgPSAoKCpibG9jaylbanBlZ19uYXR1cmFsX29yZGVyW2tdXSA8IDApID8gMCA6IDE7Ci0gICAgZW1pdF9iaXRzKGVudHJvcHksICh1bnNpZ25lZCBpbnQpIHRlbXAsIDEpOwotCi0gICAgLyogRW1pdCBidWZmZXJlZCBjb3JyZWN0aW9uIGJpdHMgdGhhdCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvZGUgKi8KLSAgICBlbWl0X2J1ZmZlcmVkX2JpdHMoZW50cm9weSwgQlJfYnVmZmVyLCBCUik7Ci0gICAgQlJfYnVmZmVyID0gZW50cm9weS0+Yml0X2J1ZmZlcjsgLyogQkUgYml0cyBhcmUgZ29uZSBub3cgKi8KLSAgICBCUiA9IDA7Ci0gICAgciA9IDA7CQkJLyogcmVzZXQgemVybyBydW4gbGVuZ3RoICovCi0gIH0KLQotICBpZiAociA+IDAgfHwgQlIgPiAwKSB7CS8qIElmIHRoZXJlIGFyZSB0cmFpbGluZyB6ZXJvZXMsICovCi0gICAgZW50cm9weS0+RU9CUlVOKys7CQkvKiBjb3VudCBhbiBFT0IgKi8KLSAgICBlbnRyb3B5LT5CRSArPSBCUjsJCS8qIGNvbmNhdCBteSBjb3JyZWN0aW9uIGJpdHMgdG8gb2xkZXIgb25lcyAqLwotICAgIC8qIFdlIGZvcmNlIG91dCB0aGUgRU9CIGlmIHdlIHJpc2sgZWl0aGVyOgotICAgICAqIDEuIG92ZXJmbG93IG9mIHRoZSBFT0IgY291bnRlcjsKLSAgICAgKiAyLiBvdmVyZmxvdyBvZiB0aGUgY29ycmVjdGlvbiBiaXQgYnVmZmVyIGR1cmluZyB0aGUgbmV4dCBNQ1UuCi0gICAgICovCi0gICAgaWYgKGVudHJvcHktPkVPQlJVTiA9PSAweDdGRkYgfHwgZW50cm9weS0+QkUgPiAoTUFYX0NPUlJfQklUUy1EQ1RTSVpFMisxKSkKLSAgICAgIGVtaXRfZW9icnVuKGVudHJvcHkpOwotICB9Ci0KLSAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlOwotICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlcjsKLQotICAvKiBVcGRhdGUgcmVzdGFydC1pbnRlcnZhbCBzdGF0ZSB0b28gKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7Ci0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApIHsKLSAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7Ci0gICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKys7Ci0gICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtICY9IDc7Ci0gICAgfQotICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07Ci0gIH0KLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgYSBIdWZmbWFuLWNvbXByZXNzZWQgcHJvZ3Jlc3NpdmUgc2Nhbi4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZpbmlzaF9wYXNzX3BodWZmIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsgICAKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0KLSAgZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlOwotICBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlciA9IGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcjsKLQotICAvKiBGbHVzaCBvdXQgYW55IGJ1ZmZlcmVkIGRhdGEgKi8KLSAgZW1pdF9lb2JydW4oZW50cm9weSk7Ci0gIGZsdXNoX2JpdHMoZW50cm9weSk7Ci0KLSAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlOwotICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlcjsKLX0KLQotCi0vKgotICogRmluaXNoIHVwIGEgc3RhdGlzdGljcy1nYXRoZXJpbmcgcGFzcyBhbmQgY3JlYXRlIHRoZSBuZXcgSHVmZm1hbiB0YWJsZXMuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1maW5pc2hfcGFzc19nYXRoZXJfcGh1ZmYgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgYm9vbGVhbiBpc19EQ19iYW5kOwotICBpbnQgY2ksIHRibDsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7Ci0gIEpIVUZGX1RCTCAqKmh0YmxwdHI7Ci0gIGJvb2xlYW4gZGlkW05VTV9IVUZGX1RCTFNdOwotCi0gIC8qIEZsdXNoIG91dCBidWZmZXJlZCBkYXRhIChhbGwgd2UgY2FyZSBhYm91dCBpcyBjb3VudGluZyB0aGUgRU9CIHN5bWJvbCkgKi8KLSAgZW1pdF9lb2JydW4oZW50cm9weSk7Ci0KLSAgaXNfRENfYmFuZCA9IChjaW5mby0+U3MgPT0gMCk7Ci0KLSAgLyogSXQncyBpbXBvcnRhbnQgbm90IHRvIGFwcGx5IGpwZWdfZ2VuX29wdGltYWxfdGFibGUgbW9yZSB0aGFuIG9uY2UKLSAgICogcGVyIHRhYmxlLCBiZWNhdXNlIGl0IGNsb2JiZXJzIHRoZSBpbnB1dCBmcmVxdWVuY3kgY291bnRzIQotICAgKi8KLSAgTUVNWkVSTyhkaWQsIFNJWkVPRihkaWQpKTsKLQotICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgewotICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0gICAgaWYgKGlzX0RDX2JhbmQpIHsKLSAgICAgIGlmIChjaW5mby0+QWggIT0gMCkJLyogREMgcmVmaW5lbWVudCBuZWVkcyBubyB0YWJsZSAqLwotCWNvbnRpbnVlOwotICAgICAgdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOwotICAgIH0gZWxzZSB7Ci0gICAgICB0YmwgPSBjb21wcHRyLT5hY190Ymxfbm87Ci0gICAgfQotICAgIGlmICghIGRpZFt0YmxdKSB7Ci0gICAgICBpZiAoaXNfRENfYmFuZCkKLSAgICAgICAgaHRibHB0ciA9ICYgY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbdGJsXTsKLSAgICAgIGVsc2UKLSAgICAgICAgaHRibHB0ciA9ICYgY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbdGJsXTsKLSAgICAgIGlmICgqaHRibHB0ciA9PSBOVUxMKQotICAgICAgICAqaHRibHB0ciA9IGpwZWdfYWxsb2NfaHVmZl90YWJsZSgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gICAgICBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlKGNpbmZvLCAqaHRibHB0ciwgZW50cm9weS0+Y291bnRfcHRyc1t0YmxdKTsKLSAgICAgIGRpZFt0YmxdID0gVFJVRTsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKgotICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIHByb2dyZXNzaXZlIEh1ZmZtYW4gZW50cm9weSBlbmNvZGluZy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X3BodWZmX2VuY29kZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5OwotICBpbnQgaTsKLQotICBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJU0laRU9GKHBodWZmX2VudHJvcHlfZW5jb2RlcikpOwotICBjaW5mby0+ZW50cm9weSA9IChzdHJ1Y3QganBlZ19lbnRyb3B5X2VuY29kZXIgKikgZW50cm9weTsKLSAgZW50cm9weS0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX3BodWZmOwotCi0gIC8qIE1hcmsgdGFibGVzIHVuYWxsb2NhdGVkICovCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fSFVGRl9UQkxTOyBpKyspIHsKLSAgICBlbnRyb3B5LT5kZXJpdmVkX3RibHNbaV0gPSBOVUxMOwotICAgIGVudHJvcHktPmNvdW50X3B0cnNbaV0gPSBOVUxMOwotICB9Ci0gIGVudHJvcHktPmJpdF9idWZmZXIgPSBOVUxMOwkvKiBuZWVkZWQgb25seSBpbiBBQyByZWZpbmVtZW50IHNjYW4gKi8KLX0KLQotI2VuZGlmIC8qIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVEICovCi0KLSNlbmRpZiAvL19GWF9KUEVHX1RVUkJPXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNwcmVwY3QuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjcHJlcGN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZjNmYzEuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNwcmVwY3QuYworKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0jaWYgIWRlZmluZWQoX0ZYX0pQRUdfVFVSQk9fKQotLyoKLSAqIGpjcHJlcGN0LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29tcHJlc3Npb24gcHJlcHJvY2Vzc2luZyBjb250cm9sbGVyLgotICogVGhpcyBjb250cm9sbGVyIG1hbmFnZXMgdGhlIGNvbG9yIGNvbnZlcnNpb24sIGRvd25zYW1wbGluZywKLSAqIGFuZCBlZGdlIGV4cGFuc2lvbiBzdGVwcy4KLSAqCi0gKiBNb3N0IG9mIHRoZSBjb21wbGV4aXR5IGhlcmUgaXMgYXNzb2NpYXRlZCB3aXRoIGJ1ZmZlcmluZyBpbnB1dCByb3dzCi0gKiBhcyByZXF1aXJlZCBieSB0aGUgZG93bnNhbXBsZXIuICBTZWUgdGhlIGNvbW1lbnRzIGF0IHRoZSBoZWFkIG9mCi0gKiBqY3NhbXBsZS5jIGZvciB0aGUgZG93bnNhbXBsZXIncyBuZWVkcy4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyogQXQgcHJlc2VudCwgamNzYW1wbGUuYyBjYW4gcmVxdWVzdCBjb250ZXh0IHJvd3Mgb25seSBmb3Igc21vb3RoaW5nLgotICogSW4gdGhlIGZ1dHVyZSwgd2UgbWlnaHQgYWxzbyBuZWVkIGNvbnRleHQgcm93cyBmb3IgQ0NJUjYwMSBzYW1wbGluZwotICogb3Igb3RoZXIgbW9yZS1jb21wbGV4IGRvd25zYW1wbGluZyBwcm9jZWR1cmVzLiAgVGhlIGNvZGUgdG8gc3VwcG9ydAotICogY29udGV4dCByb3dzIHNob3VsZCBiZSBjb21waWxlZCBvbmx5IGlmIG5lZWRlZC4KLSAqLwotI2lmZGVmIElOUFVUX1NNT09USElOR19TVVBQT1JURUQKLSNkZWZpbmUgQ09OVEVYVF9ST1dTX1NVUFBPUlRFRAotI2VuZGlmCi0KLQotLyoKLSAqIEZvciB0aGUgc2ltcGxlIChuby1jb250ZXh0LXJvdykgY2FzZSwgd2UganVzdCBuZWVkIHRvIGJ1ZmZlciBvbmUKLSAqIHJvdyBncm91cCdzIHdvcnRoIG9mIHBpeGVscyBmb3IgdGhlIGRvd25zYW1wbGluZyBzdGVwLiAgQXQgdGhlIGJvdHRvbSBvZgotICogdGhlIGltYWdlLCB3ZSBwYWQgdG8gYSBmdWxsIHJvdyBncm91cCBieSByZXBsaWNhdGluZyB0aGUgbGFzdCBwaXhlbCByb3cuCi0gKiBUaGUgZG93bnNhbXBsZXIncyBsYXN0IG91dHB1dCByb3cgaXMgdGhlbiByZXBsaWNhdGVkIGlmIG5lZWRlZCB0byBwYWQKLSAqIG91dCB0byBhIGZ1bGwgaU1DVSByb3cuCi0gKgotICogV2hlbiBwcm92aWRpbmcgY29udGV4dCByb3dzLCB3ZSBtdXN0IGJ1ZmZlciB0aHJlZSByb3cgZ3JvdXBzJyB3b3J0aCBvZgotICogcGl4ZWxzLiAgVGhyZWUgcm93IGdyb3VwcyBhcmUgcGh5c2ljYWxseSBhbGxvY2F0ZWQsIGJ1dCB0aGUgcm93IHBvaW50ZXIKLSAqIGFycmF5cyBhcmUgbWFkZSBmaXZlIHJvdyBncm91cHMgaGlnaCwgd2l0aCB0aGUgZXh0cmEgcG9pbnRlcnMgYWJvdmUgYW5kCi0gKiBiZWxvdyAid3JhcHBpbmcgYXJvdW5kIiB0byBwb2ludCB0byB0aGUgbGFzdCBhbmQgZmlyc3QgcmVhbCByb3cgZ3JvdXBzLgotICogVGhpcyBhbGxvd3MgdGhlIGRvd25zYW1wbGVyIHRvIGFjY2VzcyB0aGUgcHJvcGVyIGNvbnRleHQgcm93cy4KLSAqIEF0IHRoZSB0b3AgYW5kIGJvdHRvbSBvZiB0aGUgaW1hZ2UsIHdlIGNyZWF0ZSBkdW1teSBjb250ZXh0IHJvd3MgYnkKLSAqIGNvcHlpbmcgdGhlIGZpcnN0IG9yIGxhc3QgcmVhbCBwaXhlbCByb3cuICBUaGlzIGNvcHlpbmcgY291bGQgYmUgYXZvaWRlZAotICogYnkgcG9pbnRlciBoYWNraW5nIGFzIGlzIGRvbmUgaW4gamRtYWluY3QuYywgYnV0IGl0IGRvZXNuJ3Qgc2VlbSB3b3J0aCB0aGUKLSAqIHRyb3VibGUgb24gdGhlIGNvbXByZXNzaW9uIHNpZGUuCi0gKi8KLQotCi0vKiBQcml2YXRlIGJ1ZmZlciBjb250cm9sbGVyIG9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2NfcHJlcF9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIERvd25zYW1wbGluZyBpbnB1dCBidWZmZXIuICBUaGlzIGJ1ZmZlciBob2xkcyBjb2xvci1jb252ZXJ0ZWQgZGF0YQotICAgKiB1bnRpbCB3ZSBoYXZlIGVub3VnaCB0byBkbyBhIGRvd25zYW1wbGUgc3RlcC4KLSAgICovCi0gIEpTQU1QQVJSQVkgY29sb3JfYnVmW01BWF9DT01QT05FTlRTXTsKLQotICBKRElNRU5TSU9OIHJvd3NfdG9fZ287CS8qIGNvdW50cyByb3dzIHJlbWFpbmluZyBpbiBzb3VyY2UgaW1hZ2UgKi8KLSAgaW50IG5leHRfYnVmX3JvdzsJCS8qIGluZGV4IG9mIG5leHQgcm93IHRvIHN0b3JlIGluIGNvbG9yX2J1ZiAqLwotCi0jaWZkZWYgQ09OVEVYVF9ST1dTX1NVUFBPUlRFRAkvKiBvbmx5IG5lZWRlZCBmb3IgY29udGV4dCBjYXNlICovCi0gIGludCB0aGlzX3Jvd19ncm91cDsJCS8qIHN0YXJ0aW5nIHJvdyBpbmRleCBvZiBncm91cCB0byBwcm9jZXNzICovCi0gIGludCBuZXh0X2J1Zl9zdG9wOwkJLyogZG93bnNhbXBsZSB3aGVuIHdlIHJlYWNoIHRoaXMgaW5kZXggKi8KLSNlbmRpZgotfSBteV9wcmVwX2NvbnRyb2xsZXI7Ci0KLXR5cGVkZWYgbXlfcHJlcF9jb250cm9sbGVyICogbXlfcHJlcF9wdHI7Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIGEgcHJvY2Vzc2luZyBwYXNzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfcGFzc19wcmVwIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpCi17Ci0gIG15X3ByZXBfcHRyIHByZXAgPSAobXlfcHJlcF9wdHIpIGNpbmZvLT5wcmVwOwotCi0gIGlmIChwYXNzX21vZGUgIT0gSkJVRl9QQVNTX1RIUlUpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotCi0gIC8qIEluaXRpYWxpemUgdG90YWwtaGVpZ2h0IGNvdW50ZXIgZm9yIGRldGVjdGluZyBib3R0b20gb2YgaW1hZ2UgKi8KLSAgcHJlcC0+cm93c190b19nbyA9IGNpbmZvLT5pbWFnZV9oZWlnaHQ7Ci0gIC8qIE1hcmsgdGhlIGNvbnZlcnNpb24gYnVmZmVyIGVtcHR5ICovCi0gIHByZXAtPm5leHRfYnVmX3JvdyA9IDA7Ci0jaWZkZWYgQ09OVEVYVF9ST1dTX1NVUFBPUlRFRAotICAvKiBQcmVzZXQgYWRkaXRpb25hbCBzdGF0ZSB2YXJpYWJsZXMgZm9yIGNvbnRleHQgbW9kZS4KLSAgICogVGhlc2UgYXJlbid0IHVzZWQgaW4gbm9uLWNvbnRleHQgbW9kZSwgc28gd2UgbmVlZG4ndCB0ZXN0IHdoaWNoIG1vZGUuCi0gICAqLwotICBwcmVwLT50aGlzX3Jvd19ncm91cCA9IDA7Ci0gIC8qIFNldCBuZXh0X2J1Zl9zdG9wIHRvIHN0b3AgYWZ0ZXIgdHdvIHJvdyBncm91cHMgaGF2ZSBiZWVuIHJlYWQgaW4uICovCi0gIHByZXAtPm5leHRfYnVmX3N0b3AgPSAyICogY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOwotI2VuZGlmCi19Ci0KLQotLyoKLSAqIEV4cGFuZCBhbiBpbWFnZSB2ZXJ0aWNhbGx5IGZyb20gaGVpZ2h0IGlucHV0X3Jvd3MgdG8gaGVpZ2h0IG91dHB1dF9yb3dzLAotICogYnkgZHVwbGljYXRpbmcgdGhlIGJvdHRvbSByb3cuCi0gKi8KLQotTE9DQUwodm9pZCkKLWV4cGFuZF9ib3R0b21fZWRnZSAoSlNBTVBBUlJBWSBpbWFnZV9kYXRhLCBKRElNRU5TSU9OIG51bV9jb2xzLAotCQkgICAgaW50IGlucHV0X3Jvd3MsIGludCBvdXRwdXRfcm93cykKLXsKLSAgcmVnaXN0ZXIgaW50IHJvdzsKLQotICBmb3IgKHJvdyA9IGlucHV0X3Jvd3M7IHJvdyA8IG91dHB1dF9yb3dzOyByb3crKykgewotICAgIGpjb3B5X3NhbXBsZV9yb3dzKGltYWdlX2RhdGEsIGlucHV0X3Jvd3MtMSwgaW1hZ2VfZGF0YSwgcm93LAotCQkgICAgICAxLCBudW1fY29scyk7Ci0gIH0KLX0KLQotCi0vKgotICogUHJvY2VzcyBzb21lIGRhdGEgaW4gdGhlIHNpbXBsZSBuby1jb250ZXh0IGNhc2UuCi0gKgotICogUHJlcHJvY2Vzc29yIG91dHB1dCBkYXRhIGlzIGNvdW50ZWQgaW4gInJvdyBncm91cHMiLiAgQSByb3cgZ3JvdXAKLSAqIGlzIGRlZmluZWQgdG8gYmUgdl9zYW1wX2ZhY3RvciBzYW1wbGUgcm93cyBvZiBlYWNoIGNvbXBvbmVudC4KLSAqIERvd25zYW1wbGluZyB3aWxsIHByb2R1Y2UgdGhpcyBtdWNoIGRhdGEgZnJvbSBlYWNoIG1heF92X3NhbXBfZmFjdG9yCi0gKiBpbnB1dCByb3dzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcHJlX3Byb2Nlc3NfZGF0YSAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCSAgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19jdHIsCi0JCSAgSkRJTUVOU0lPTiBpbl9yb3dzX2F2YWlsLAotCQkgIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19ncm91cF9jdHIsCi0JCSAgSkRJTUVOU0lPTiBvdXRfcm93X2dyb3Vwc19hdmFpbCkKLXsKLSAgbXlfcHJlcF9wdHIgcHJlcCA9IChteV9wcmVwX3B0cikgY2luZm8tPnByZXA7Ci0gIGludCBudW1yb3dzLCBjaTsKLSAgSkRJTUVOU0lPTiBpbnJvd3M7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotCi0gIHdoaWxlICgqaW5fcm93X2N0ciA8IGluX3Jvd3NfYXZhaWwgJiYKLQkgKm91dF9yb3dfZ3JvdXBfY3RyIDwgb3V0X3Jvd19ncm91cHNfYXZhaWwpIHsKLSAgICAvKiBEbyBjb2xvciBjb252ZXJzaW9uIHRvIGZpbGwgdGhlIGNvbnZlcnNpb24gYnVmZmVyLiAqLwotICAgIGlucm93cyA9IGluX3Jvd3NfYXZhaWwgLSAqaW5fcm93X2N0cjsKLSAgICBudW1yb3dzID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yIC0gcHJlcC0+bmV4dF9idWZfcm93OwotICAgIG51bXJvd3MgPSAoaW50KSBNSU4oKEpESU1FTlNJT04pIG51bXJvd3MsIGlucm93cyk7Ci0gICAgKCpjaW5mby0+Y2NvbnZlcnQtPmNvbG9yX2NvbnZlcnQpIChjaW5mbywgaW5wdXRfYnVmICsgKmluX3Jvd19jdHIsCi0JCQkJICAgICAgIHByZXAtPmNvbG9yX2J1ZiwKLQkJCQkgICAgICAgKEpESU1FTlNJT04pIHByZXAtPm5leHRfYnVmX3JvdywKLQkJCQkgICAgICAgbnVtcm93cyk7Ci0gICAgKmluX3Jvd19jdHIgKz0gbnVtcm93czsKLSAgICBwcmVwLT5uZXh0X2J1Zl9yb3cgKz0gbnVtcm93czsKLSAgICBwcmVwLT5yb3dzX3RvX2dvIC09IG51bXJvd3M7Ci0gICAgLyogSWYgYXQgYm90dG9tIG9mIGltYWdlLCBwYWQgdG8gZmlsbCB0aGUgY29udmVyc2lvbiBidWZmZXIuICovCi0gICAgaWYgKHByZXAtPnJvd3NfdG9fZ28gPT0gMCAmJgotCXByZXAtPm5leHRfYnVmX3JvdyA8IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgewotICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0JZXhwYW5kX2JvdHRvbV9lZGdlKHByZXAtPmNvbG9yX2J1ZltjaV0sIGNpbmZvLT5pbWFnZV93aWR0aCwKLQkJCSAgIHByZXAtPm5leHRfYnVmX3JvdywgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKTsKLSAgICAgIH0KLSAgICAgIHByZXAtPm5leHRfYnVmX3JvdyA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKLSAgICB9Ci0gICAgLyogSWYgd2UndmUgZmlsbGVkIHRoZSBjb252ZXJzaW9uIGJ1ZmZlciwgZW1wdHkgaXQuICovCi0gICAgaWYgKHByZXAtPm5leHRfYnVmX3JvdyA9PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKLSAgICAgICgqY2luZm8tPmRvd25zYW1wbGUtPmRvd25zYW1wbGUpIChjaW5mbywKLQkJCQkJcHJlcC0+Y29sb3JfYnVmLCAoSkRJTUVOU0lPTikgMCwKLQkJCQkJb3V0cHV0X2J1ZiwgKm91dF9yb3dfZ3JvdXBfY3RyKTsKLSAgICAgIHByZXAtPm5leHRfYnVmX3JvdyA9IDA7Ci0gICAgICAoKm91dF9yb3dfZ3JvdXBfY3RyKSsrOwotICAgIH0KLSAgICAvKiBJZiBhdCBib3R0b20gb2YgaW1hZ2UsIHBhZCB0aGUgb3V0cHV0IHRvIGEgZnVsbCBpTUNVIGhlaWdodC4KLSAgICAgKiBOb3RlIHdlIGFzc3VtZSB0aGUgY2FsbGVyIGlzIHByb3ZpZGluZyBhIG9uZS1pTUNVLWhlaWdodCBvdXRwdXQgYnVmZmVyIQotICAgICAqLwotICAgIGlmIChwcmVwLT5yb3dzX3RvX2dvID09IDAgJiYKLQkqb3V0X3Jvd19ncm91cF9jdHIgPCBvdXRfcm93X2dyb3Vwc19hdmFpbCkgewotICAgICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLQkgICBjaSsrLCBjb21wcHRyKyspIHsKLQlleHBhbmRfYm90dG9tX2VkZ2Uob3V0cHV0X2J1ZltjaV0sCi0JCQkgICBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFLAotCQkJICAgKGludCkgKCpvdXRfcm93X2dyb3VwX2N0ciAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpLAotCQkJICAgKGludCkgKG91dF9yb3dfZ3JvdXBzX2F2YWlsICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikpOwotICAgICAgfQotICAgICAgKm91dF9yb3dfZ3JvdXBfY3RyID0gb3V0X3Jvd19ncm91cHNfYXZhaWw7Ci0gICAgICBicmVhazsJCQkvKiBjYW4gZXhpdCBvdXRlciBsb29wIHdpdGhvdXQgdGVzdCAqLwotICAgIH0KLSAgfQotfQotCi0KLSNpZmRlZiBDT05URVhUX1JPV1NfU1VQUE9SVEVECi0KLS8qCi0gKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiB0aGUgY29udGV4dCBjYXNlLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcHJlX3Byb2Nlc3NfY29udGV4dCAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCSAgICAgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19jdHIsCi0JCSAgICAgSkRJTUVOU0lPTiBpbl9yb3dzX2F2YWlsLAotCQkgICAgIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19ncm91cF9jdHIsCi0JCSAgICAgSkRJTUVOU0lPTiBvdXRfcm93X2dyb3Vwc19hdmFpbCkKLXsKLSAgbXlfcHJlcF9wdHIgcHJlcCA9IChteV9wcmVwX3B0cikgY2luZm8tPnByZXA7Ci0gIGludCBudW1yb3dzLCBjaTsKLSAgaW50IGJ1Zl9oZWlnaHQgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiAzOwotICBKRElNRU5TSU9OIGlucm93czsKLQotICB3aGlsZSAoKm91dF9yb3dfZ3JvdXBfY3RyIDwgb3V0X3Jvd19ncm91cHNfYXZhaWwpIHsKLSAgICBpZiAoKmluX3Jvd19jdHIgPCBpbl9yb3dzX2F2YWlsKSB7Ci0gICAgICAvKiBEbyBjb2xvciBjb252ZXJzaW9uIHRvIGZpbGwgdGhlIGNvbnZlcnNpb24gYnVmZmVyLiAqLwotICAgICAgaW5yb3dzID0gaW5fcm93c19hdmFpbCAtICppbl9yb3dfY3RyOwotICAgICAgbnVtcm93cyA9IHByZXAtPm5leHRfYnVmX3N0b3AgLSBwcmVwLT5uZXh0X2J1Zl9yb3c7Ci0gICAgICBudW1yb3dzID0gKGludCkgTUlOKChKRElNRU5TSU9OKSBudW1yb3dzLCBpbnJvd3MpOwotICAgICAgKCpjaW5mby0+Y2NvbnZlcnQtPmNvbG9yX2NvbnZlcnQpIChjaW5mbywgaW5wdXRfYnVmICsgKmluX3Jvd19jdHIsCi0JCQkJCSBwcmVwLT5jb2xvcl9idWYsCi0JCQkJCSAoSkRJTUVOU0lPTikgcHJlcC0+bmV4dF9idWZfcm93LAotCQkJCQkgbnVtcm93cyk7Ci0gICAgICAvKiBQYWQgYXQgdG9wIG9mIGltYWdlLCBpZiBmaXJzdCB0aW1lIHRocm91Z2ggKi8KLSAgICAgIGlmIChwcmVwLT5yb3dzX3RvX2dvID09IGNpbmZvLT5pbWFnZV9oZWlnaHQpIHsKLQlmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLQkgIGludCByb3c7Ci0JICBmb3IgKHJvdyA9IDE7IHJvdyA8PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7IHJvdysrKSB7Ci0JICAgIGpjb3B5X3NhbXBsZV9yb3dzKHByZXAtPmNvbG9yX2J1ZltjaV0sIDAsCi0JCQkgICAgICBwcmVwLT5jb2xvcl9idWZbY2ldLCAtcm93LAotCQkJICAgICAgMSwgY2luZm8tPmltYWdlX3dpZHRoKTsKLQkgIH0KLQl9Ci0gICAgICB9Ci0gICAgICAqaW5fcm93X2N0ciArPSBudW1yb3dzOwotICAgICAgcHJlcC0+bmV4dF9idWZfcm93ICs9IG51bXJvd3M7Ci0gICAgICBwcmVwLT5yb3dzX3RvX2dvIC09IG51bXJvd3M7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIFJldHVybiBmb3IgbW9yZSBkYXRhLCB1bmxlc3Mgd2UgYXJlIGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLiAqLwotICAgICAgaWYgKHByZXAtPnJvd3NfdG9fZ28gIT0gMCkKLQlicmVhazsKLSAgICAgIC8qIFdoZW4gYXQgYm90dG9tIG9mIGltYWdlLCBwYWQgdG8gZmlsbCB0aGUgY29udmVyc2lvbiBidWZmZXIuICovCi0gICAgICBpZiAocHJlcC0+bmV4dF9idWZfcm93IDwgcHJlcC0+bmV4dF9idWZfc3RvcCkgewotCWZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgewotCSAgZXhwYW5kX2JvdHRvbV9lZGdlKHByZXAtPmNvbG9yX2J1ZltjaV0sIGNpbmZvLT5pbWFnZV93aWR0aCwKLQkJCSAgICAgcHJlcC0+bmV4dF9idWZfcm93LCBwcmVwLT5uZXh0X2J1Zl9zdG9wKTsKLQl9Ci0JcHJlcC0+bmV4dF9idWZfcm93ID0gcHJlcC0+bmV4dF9idWZfc3RvcDsKLSAgICAgIH0KLSAgICB9Ci0gICAgLyogSWYgd2UndmUgZ290dGVuIGVub3VnaCBkYXRhLCBkb3duc2FtcGxlIGEgcm93IGdyb3VwLiAqLwotICAgIGlmIChwcmVwLT5uZXh0X2J1Zl9yb3cgPT0gcHJlcC0+bmV4dF9idWZfc3RvcCkgewotICAgICAgKCpjaW5mby0+ZG93bnNhbXBsZS0+ZG93bnNhbXBsZSkgKGNpbmZvLAotCQkJCQlwcmVwLT5jb2xvcl9idWYsCi0JCQkJCShKRElNRU5TSU9OKSBwcmVwLT50aGlzX3Jvd19ncm91cCwKLQkJCQkJb3V0cHV0X2J1ZiwgKm91dF9yb3dfZ3JvdXBfY3RyKTsKLSAgICAgICgqb3V0X3Jvd19ncm91cF9jdHIpKys7Ci0gICAgICAvKiBBZHZhbmNlIHBvaW50ZXJzIHdpdGggd3JhcGFyb3VuZCBhcyBuZWNlc3NhcnkuICovCi0gICAgICBwcmVwLT50aGlzX3Jvd19ncm91cCArPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7Ci0gICAgICBpZiAocHJlcC0+dGhpc19yb3dfZ3JvdXAgPj0gYnVmX2hlaWdodCkKLQlwcmVwLT50aGlzX3Jvd19ncm91cCA9IDA7Ci0gICAgICBpZiAocHJlcC0+bmV4dF9idWZfcm93ID49IGJ1Zl9oZWlnaHQpCi0JcHJlcC0+bmV4dF9idWZfcm93ID0gMDsKLSAgICAgIHByZXAtPm5leHRfYnVmX3N0b3AgPSBwcmVwLT5uZXh0X2J1Zl9yb3cgKyBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoKLSAqIENyZWF0ZSB0aGUgd3JhcHBlZC1hcm91bmQgZG93bnNhbXBsaW5nIGlucHV0IGJ1ZmZlciBuZWVkZWQgZm9yIGNvbnRleHQgbW9kZS4KLSAqLwotCi1MT0NBTCh2b2lkKQotY3JlYXRlX2NvbnRleHRfYnVmZmVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfcHJlcF9wdHIgcHJlcCA9IChteV9wcmVwX3B0cikgY2luZm8tPnByZXA7Ci0gIGludCByZ3JvdXBfaGVpZ2h0ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOwotICBpbnQgY2ksIGk7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotICBKU0FNUEFSUkFZIHRydWVfYnVmZmVyLCBmYWtlX2J1ZmZlcjsKLQotICAvKiBHcmFiIGVub3VnaCBzcGFjZSBmb3IgZmFrZSByb3cgcG9pbnRlcnMgZm9yIGFsbCB0aGUgY29tcG9uZW50czsKLSAgICogd2UgbmVlZCBmaXZlIHJvdyBncm91cHMnIHdvcnRoIG9mIHBvaW50ZXJzIGZvciBlYWNoIGNvbXBvbmVudC4KLSAgICovCi0gIGZha2VfYnVmZmVyID0gKEpTQU1QQVJSQVkpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkoY2luZm8tPm51bV9jb21wb25lbnRzICogNSAqIHJncm91cF9oZWlnaHQpICoKLQkJCQlTSVpFT0YoSlNBTVBST1cpKTsKLQotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIC8qIEFsbG9jYXRlIHRoZSBhY3R1YWwgYnVmZmVyIHNwYWNlICgzIHJvdyBncm91cHMpIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICAgKiBXZSBtYWtlIHRoZSBidWZmZXIgd2lkZSBlbm91Z2ggdG8gYWxsb3cgdGhlIGRvd25zYW1wbGVyIHRvIGVkZ2UtZXhwYW5kCi0gICAgICogaG9yaXpvbnRhbGx5IHdpdGhpbiB0aGUgYnVmZmVyLCBpZiBpdCBzbyBjaG9vc2VzLgotICAgICAqLwotICAgIHRydWVfYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0gICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotICAgICAgIChKRElNRU5TSU9OKSAoKChsb25nKSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFICoKLQkJICAgICAgY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yKSAvIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpLAotICAgICAgIChKRElNRU5TSU9OKSAoMyAqIHJncm91cF9oZWlnaHQpKTsKLSAgICAvKiBDb3B5IHRydWUgYnVmZmVyIHJvdyBwb2ludGVycyBpbnRvIHRoZSBtaWRkbGUgb2YgdGhlIGZha2Ugcm93IGFycmF5ICovCi0gICAgTUVNQ09QWShmYWtlX2J1ZmZlciArIHJncm91cF9oZWlnaHQsIHRydWVfYnVmZmVyLAotCSAgICAzICogcmdyb3VwX2hlaWdodCAqIFNJWkVPRihKU0FNUFJPVykpOwotICAgIC8qIEZpbGwgaW4gdGhlIGFib3ZlIGFuZCBiZWxvdyB3cmFwYXJvdW5kIHBvaW50ZXJzICovCi0gICAgZm9yIChpID0gMDsgaSA8IHJncm91cF9oZWlnaHQ7IGkrKykgewotICAgICAgZmFrZV9idWZmZXJbaV0gPSB0cnVlX2J1ZmZlclsyICogcmdyb3VwX2hlaWdodCArIGldOwotICAgICAgZmFrZV9idWZmZXJbNCAqIHJncm91cF9oZWlnaHQgKyBpXSA9IHRydWVfYnVmZmVyW2ldOwotICAgIH0KLSAgICBwcmVwLT5jb2xvcl9idWZbY2ldID0gZmFrZV9idWZmZXIgKyByZ3JvdXBfaGVpZ2h0OwotICAgIGZha2VfYnVmZmVyICs9IDUgKiByZ3JvdXBfaGVpZ2h0OyAvKiBwb2ludCB0byBzcGFjZSBmb3IgbmV4dCBjb21wb25lbnQgKi8KLSAgfQotfQotCi0jZW5kaWYgLyogQ09OVEVYVF9ST1dTX1NVUFBPUlRFRCAqLwotCi0KLS8qCi0gKiBJbml0aWFsaXplIHByZXByb2Nlc3NpbmcgY29udHJvbGxlci4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2NfcHJlcF9jb250cm9sbGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKQotewotICBteV9wcmVwX3B0ciBwcmVwOwotICBpbnQgY2k7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotCi0gIGlmIChuZWVkX2Z1bGxfYnVmZmVyKQkJLyogc2FmZXR5IGNoZWNrICovCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotCi0gIHByZXAgPSAobXlfcHJlcF9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfcHJlcF9jb250cm9sbGVyKSk7Ci0gIGNpbmZvLT5wcmVwID0gKHN0cnVjdCBqcGVnX2NfcHJlcF9jb250cm9sbGVyICopIHByZXA7Ci0gIHByZXAtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19wcmVwOwotCi0gIC8qIEFsbG9jYXRlIHRoZSBjb2xvciBjb252ZXJzaW9uIGJ1ZmZlci4KLSAgICogV2UgbWFrZSB0aGUgYnVmZmVyIHdpZGUgZW5vdWdoIHRvIGFsbG93IHRoZSBkb3duc2FtcGxlciB0byBlZGdlLWV4cGFuZAotICAgKiBob3Jpem9udGFsbHkgd2l0aGluIHRoZSBidWZmZXIsIGlmIGl0IHNvIGNob29zZXMuCi0gICAqLwotICBpZiAoY2luZm8tPmRvd25zYW1wbGUtPm5lZWRfY29udGV4dF9yb3dzKSB7Ci0gICAgLyogU2V0IHVwIHRvIHByb3ZpZGUgY29udGV4dCByb3dzICovCi0jaWZkZWYgQ09OVEVYVF9ST1dTX1NVUFBPUlRFRAotICAgIHByZXAtPnB1Yi5wcmVfcHJvY2Vzc19kYXRhID0gcHJlX3Byb2Nlc3NfY29udGV4dDsKLSAgICBjcmVhdGVfY29udGV4dF9idWZmZXIoY2luZm8pOwotI2Vsc2UKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0jZW5kaWYKLSAgfSBlbHNlIHsKLSAgICAvKiBObyBjb250ZXh0LCBqdXN0IG1ha2UgaXQgdGFsbCBlbm91Z2ggZm9yIG9uZSByb3cgZ3JvdXAgKi8KLSAgICBwcmVwLT5wdWIucHJlX3Byb2Nlc3NfZGF0YSA9IHByZV9wcm9jZXNzX2RhdGE7Ci0gICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLQkgY2krKywgY29tcHB0cisrKSB7Ci0gICAgICBwcmVwLT5jb2xvcl9idWZbY2ldID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkgKEpESU1FTlNJT04pICgoKGxvbmcpIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUgKgotCQkJY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yKSAvIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpLAotCSAoSkRJTUVOU0lPTikgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKTsKLSAgICB9Ci0gIH0KLX0KLQotI2VuZGlmIC8vX0ZYX0pQRUdfVFVSQk9fCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY3NhbXBsZS5jIGIvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNzYW1wbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUxZTgyOC4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY3NhbXBsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIyICswLDAgQEAKLSNpZiAhZGVmaW5lZChfRlhfSlBFR19UVVJCT18pCi0vKgotICogamNzYW1wbGUuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGRvd25zYW1wbGluZyByb3V0aW5lcy4KLSAqCi0gKiBEb3duc2FtcGxpbmcgaW5wdXQgZGF0YSBpcyBjb3VudGVkIGluICJyb3cgZ3JvdXBzIi4gIEEgcm93IGdyb3VwCi0gKiBpcyBkZWZpbmVkIHRvIGJlIG1heF92X3NhbXBfZmFjdG9yIHBpeGVsIHJvd3Mgb2YgZWFjaCBjb21wb25lbnQsCi0gKiBmcm9tIHdoaWNoIHRoZSBkb3duc2FtcGxlciBwcm9kdWNlcyB2X3NhbXBfZmFjdG9yIHNhbXBsZSByb3dzLgotICogQSBzaW5nbGUgcm93IGdyb3VwIGlzIHByb2Nlc3NlZCBpbiBlYWNoIGNhbGwgdG8gdGhlIGRvd25zYW1wbGVyIG1vZHVsZS4KLSAqCi0gKiBUaGUgZG93bnNhbXBsZXIgaXMgcmVzcG9uc2libGUgZm9yIGVkZ2UtZXhwYW5zaW9uIG9mIGl0cyBvdXRwdXQgZGF0YQotICogdG8gZmlsbCBhbiBpbnRlZ3JhbCBudW1iZXIgb2YgRENUIGJsb2NrcyBob3Jpem9udGFsbHkuICBUaGUgc291cmNlIGJ1ZmZlcgotICogbWF5IGJlIG1vZGlmaWVkIGlmIGl0IGlzIGhlbHBmdWwgZm9yIHRoaXMgcHVycG9zZSAodGhlIHNvdXJjZSBidWZmZXIgaXMKLSAqIGFsbG9jYXRlZCB3aWRlIGVub3VnaCB0byBjb3JyZXNwb25kIHRvIHRoZSBkZXNpcmVkIG91dHB1dCB3aWR0aCkuCi0gKiBUaGUgY2FsbGVyICh0aGUgcHJlcCBjb250cm9sbGVyKSBpcyByZXNwb25zaWJsZSBmb3IgdmVydGljYWwgcGFkZGluZy4KLSAqCi0gKiBUaGUgZG93bnNhbXBsZXIgbWF5IHJlcXVlc3QgImNvbnRleHQgcm93cyIgYnkgc2V0dGluZyBuZWVkX2NvbnRleHRfcm93cwotICogZHVyaW5nIHN0YXJ0dXAuICBJbiB0aGlzIGNhc2UsIHRoZSBpbnB1dCBhcnJheXMgd2lsbCBjb250YWluIGF0IGxlYXN0Ci0gKiBvbmUgcm93IGdyb3VwJ3Mgd29ydGggb2YgcGl4ZWxzIGFib3ZlIGFuZCBiZWxvdyB0aGUgcGFzc2VkLWluIGRhdGE7Ci0gKiB0aGUgY2FsbGVyIHdpbGwgY3JlYXRlIGR1bW15IHJvd3MgYXQgaW1hZ2UgdG9wIGFuZCBib3R0b20gYnkgcmVwbGljYXRpbmcKLSAqIHRoZSBmaXJzdCBvciBsYXN0IHJlYWwgcGl4ZWwgcm93LgotICoKLSAqIEFuIGV4Y2VsbGVudCByZWZlcmVuY2UgZm9yIGltYWdlIHJlc2FtcGxpbmcgaXMKLSAqICAgRGlnaXRhbCBJbWFnZSBXYXJwaW5nLCBHZW9yZ2UgV29sYmVyZywgMTk5MC4KLSAqICAgUHViLiBieSBJRUVFIENvbXB1dGVyIFNvY2lldHkgUHJlc3MsIExvcyBBbGFtaXRvcywgQ0EuIElTQk4gMC04MTg2LTg5NDQtNy4KLSAqCi0gKiBUaGUgZG93bnNhbXBsaW5nIGFsZ29yaXRobSB1c2VkIGhlcmUgaXMgYSBzaW1wbGUgYXZlcmFnZSBvZiB0aGUgc291cmNlCi0gKiBwaXhlbHMgY292ZXJlZCBieSB0aGUgb3V0cHV0IHBpeGVsLiAgVGhlIGhpLWZhbHV0aW4gc2FtcGxpbmcgbGl0ZXJhdHVyZQotICogcmVmZXJzIHRvIHRoaXMgYXMgYSAiYm94IGZpbHRlciIuICBJbiBnZW5lcmFsIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBib3gKLSAqIGZpbHRlciBhcmUgbm90IHZlcnkgZ29vZCwgYnV0IGZvciB0aGUgc3BlY2lmaWMgY2FzZXMgd2Ugbm9ybWFsbHkgdXNlICgxOjEKLSAqIGFuZCAyOjEgcmF0aW9zKSB0aGUgYm94IGlzIGVxdWl2YWxlbnQgdG8gYSAidHJpYW5nbGUgZmlsdGVyIiB3aGljaCBpcyBub3QKLSAqIG5lYXJseSBzbyBiYWQuICBJZiB5b3UgaW50ZW5kIHRvIHVzZSBvdGhlciBzYW1wbGluZyByYXRpb3MsIHlvdSdkIGJlIHdlbGwKLSAqIGFkdmlzZWQgdG8gaW1wcm92ZSB0aGlzIGNvZGUuCi0gKgotICogQSBzaW1wbGUgaW5wdXQtc21vb3RoaW5nIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQuICBUaGlzIGlzIG1haW5seSBpbnRlbmRlZAotICogZm9yIGNsZWFuaW5nIHVwIGNvbG9yLWRpdGhlcmVkIEdJRiBpbnB1dCBmaWxlcyAoaWYgeW91IGZpbmQgaXQgaW5hZGVxdWF0ZSwKLSAqIHdlIHN1Z2dlc3QgdXNpbmcgYW4gZXh0ZXJuYWwgZmlsdGVyaW5nIHByb2dyYW0gc3VjaCBhcyBwbm1jb252b2wpLiAgV2hlbgotICogZW5hYmxlZCwgZWFjaCBpbnB1dCBwaXhlbCBQIGlzIHJlcGxhY2VkIGJ5IGEgd2VpZ2h0ZWQgc3VtIG9mIGl0c2VsZiBhbmQgaXRzCi0gKiBlaWdodCBuZWlnaGJvcnMuICBQJ3Mgd2VpZ2h0IGlzIDEtOCpTRiBhbmQgZWFjaCBuZWlnaGJvcidzIHdlaWdodCBpcyBTRiwKLSAqIHdoZXJlIFNGID0gKHNtb290aGluZ19mYWN0b3IgLyAxMDI0KS4KLSAqIEN1cnJlbnRseSwgc21vb3RoaW5nIGlzIG9ubHkgc3VwcG9ydGVkIGZvciAyaDJ2IHNhbXBsaW5nIGZhY3RvcnMuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLS8qIFBvaW50ZXIgdG8gcm91dGluZSB0byBkb3duc2FtcGxlIGEgc2luZ2xlIGNvbXBvbmVudCAqLwotdHlwZWRlZiBKTUVUSE9EKHZvaWQsIGRvd25zYW1wbGUxX3B0ciwKLQkJKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSkpOwotCi0vKiBQcml2YXRlIHN1Ym9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2Rvd25zYW1wbGVyIHB1YjsJLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIERvd25zYW1wbGluZyBtZXRob2QgcG9pbnRlcnMsIG9uZSBwZXIgY29tcG9uZW50ICovCi0gIGRvd25zYW1wbGUxX3B0ciBtZXRob2RzW01BWF9DT01QT05FTlRTXTsKLX0gbXlfZG93bnNhbXBsZXI7Ci0KLXR5cGVkZWYgbXlfZG93bnNhbXBsZXIgKiBteV9kb3duc2FtcGxlX3B0cjsKLQotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYSBkb3duc2FtcGxpbmcgcGFzcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfZG93bnNhbXBsZSAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIC8qIG5vIHdvcmsgZm9yIG5vdyAqLwotfQotCi0KLS8qCi0gKiBFeHBhbmQgYSBjb21wb25lbnQgaG9yaXpvbnRhbGx5IGZyb20gd2lkdGggaW5wdXRfY29scyB0byB3aWR0aCBvdXRwdXRfY29scywKLSAqIGJ5IGR1cGxpY2F0aW5nIHRoZSByaWdodG1vc3Qgc2FtcGxlcy4KLSAqLwotCi1MT0NBTCh2b2lkKQotZXhwYW5kX3JpZ2h0X2VkZ2UgKEpTQU1QQVJSQVkgaW1hZ2VfZGF0YSwgaW50IG51bV9yb3dzLAotCQkgICBKRElNRU5TSU9OIGlucHV0X2NvbHMsIEpESU1FTlNJT04gb3V0cHV0X2NvbHMpCi17Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBMRSBwaXh2YWw7Ci0gIHJlZ2lzdGVyIGludCBjb3VudDsKLSAgaW50IHJvdzsKLSAgaW50IG51bWNvbHMgPSAoaW50KSAob3V0cHV0X2NvbHMgLSBpbnB1dF9jb2xzKTsKLQotICBpZiAobnVtY29scyA+IDApIHsKLSAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IG51bV9yb3dzOyByb3crKykgewotICAgICAgcHRyID0gaW1hZ2VfZGF0YVtyb3ddICsgaW5wdXRfY29sczsKLSAgICAgIHBpeHZhbCA9IHB0clstMV07CQkvKiBkb24ndCBuZWVkIEdFVEpTQU1QTEUoKSBoZXJlICovCi0gICAgICBmb3IgKGNvdW50ID0gbnVtY29sczsgY291bnQgPiAwOyBjb3VudC0tKQotCSpwdHIrKyA9IHBpeHZhbDsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKgotICogRG8gZG93bnNhbXBsaW5nIGZvciBhIHdob2xlIHJvdyBncm91cCAoYWxsIGNvbXBvbmVudHMpLgotICoKLSAqIEluIHRoaXMgdmVyc2lvbiB3ZSBzaW1wbHkgZG93bnNhbXBsZSBlYWNoIGNvbXBvbmVudCBpbmRlcGVuZGVudGx5LgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc2VwX2Rvd25zYW1wbGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQlKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbl9yb3dfaW5kZXgsCi0JCUpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRfcm93X2dyb3VwX2luZGV4KQotewotICBteV9kb3duc2FtcGxlX3B0ciBkb3duc2FtcGxlID0gKG15X2Rvd25zYW1wbGVfcHRyKSBjaW5mby0+ZG93bnNhbXBsZTsKLSAgaW50IGNpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLSAgSlNBTVBBUlJBWSBpbl9wdHIsIG91dF9wdHI7Ci0KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICBpbl9wdHIgPSBpbnB1dF9idWZbY2ldICsgaW5fcm93X2luZGV4OwotICAgIG91dF9wdHIgPSBvdXRwdXRfYnVmW2NpXSArIChvdXRfcm93X2dyb3VwX2luZGV4ICogY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7Ci0gICAgKCpkb3duc2FtcGxlLT5tZXRob2RzW2NpXSkgKGNpbmZvLCBjb21wcHRyLCBpbl9wdHIsIG91dF9wdHIpOwotICB9Ci19Ci0KLQotLyoKLSAqIERvd25zYW1wbGUgcGl4ZWwgdmFsdWVzIG9mIGEgc2luZ2xlIGNvbXBvbmVudC4KLSAqIE9uZSByb3cgZ3JvdXAgaXMgcHJvY2Vzc2VkIHBlciBjYWxsLgotICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgYXJiaXRyYXJ5IGludGVncmFsIHNhbXBsaW5nIHJhdGlvcywgd2l0aG91dCBzbW9vdGhpbmcuCi0gKiBOb3RlIHRoYXQgdGhpcyB2ZXJzaW9uIGlzIG5vdCBhY3R1YWxseSB1c2VkIGZvciBjdXN0b21hcnkgc2FtcGxpbmcgcmF0aW9zLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotaW50X2Rvd25zYW1wbGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKQotewotICBpbnQgaW5yb3csIG91dHJvdywgaF9leHBhbmQsIHZfZXhwYW5kLCBudW1waXgsIG51bXBpeDIsIGgsIHY7Ci0gIEpESU1FTlNJT04gb3V0Y29sLCBvdXRjb2xfaDsJLyogb3V0Y29sX2ggPT0gb3V0Y29sKmhfZXhwYW5kICovCi0gIEpESU1FTlNJT04gb3V0cHV0X2NvbHMgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFOwotICBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOwotICBJTlQzMiBvdXR2YWx1ZTsKLQotICBoX2V4cGFuZCA9IGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAvIGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7Ci0gIHZfZXhwYW5kID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yIC8gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKLSAgbnVtcGl4ID0gaF9leHBhbmQgKiB2X2V4cGFuZDsKLSAgbnVtcGl4MiA9IG51bXBpeC8yOwotCi0gIC8qIEV4cGFuZCBpbnB1dCBkYXRhIGVub3VnaCB0byBsZXQgYWxsIHRoZSBvdXRwdXQgc2FtcGxlcyBiZSBnZW5lcmF0ZWQKLSAgICogYnkgdGhlIHN0YW5kYXJkIGxvb3AuICBTcGVjaWFsLWNhc2luZyBwYWRkZWQgb3V0cHV0IHdvdWxkIGJlIG1vcmUKLSAgICogZWZmaWNpZW50LgotICAgKi8KLSAgZXhwYW5kX3JpZ2h0X2VkZ2UoaW5wdXRfZGF0YSwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yLAotCQkgICAgY2luZm8tPmltYWdlX3dpZHRoLCBvdXRwdXRfY29scyAqIGhfZXhwYW5kKTsKLQotICBpbnJvdyA9IDA7Ci0gIGZvciAob3V0cm93ID0gMDsgb3V0cm93IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb3V0cm93KyspIHsKLSAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtvdXRyb3ddOwotICAgIGZvciAob3V0Y29sID0gMCwgb3V0Y29sX2ggPSAwOyBvdXRjb2wgPCBvdXRwdXRfY29sczsKLQkgb3V0Y29sKyssIG91dGNvbF9oICs9IGhfZXhwYW5kKSB7Ci0gICAgICBvdXR2YWx1ZSA9IDA7Ci0gICAgICBmb3IgKHYgPSAwOyB2IDwgdl9leHBhbmQ7IHYrKykgewotCWlucHRyID0gaW5wdXRfZGF0YVtpbnJvdyt2XSArIG91dGNvbF9oOwotCWZvciAoaCA9IDA7IGggPCBoX2V4cGFuZDsgaCsrKSB7Ci0JICBvdXR2YWx1ZSArPSAoSU5UMzIpIEdFVEpTQU1QTEUoKmlucHRyKyspOwotCX0KLSAgICAgIH0KLSAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKG91dHZhbHVlICsgbnVtcGl4MikgLyBudW1waXgpOwotICAgIH0KLSAgICBpbnJvdyArPSB2X2V4cGFuZDsKLSAgfQotfQotCi0KLS8qCi0gKiBEb3duc2FtcGxlIHBpeGVsIHZhbHVlcyBvZiBhIHNpbmdsZSBjb21wb25lbnQuCi0gKiBUaGlzIHZlcnNpb24gaGFuZGxlcyB0aGUgc3BlY2lhbCBjYXNlIG9mIGEgZnVsbC1zaXplIGNvbXBvbmVudCwKLSAqIHdpdGhvdXQgc21vb3RoaW5nLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZnVsbHNpemVfZG93bnNhbXBsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCQkgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSkKLXsKLSAgLyogQ29weSB0aGUgZGF0YSAqLwotICBqY29weV9zYW1wbGVfcm93cyhpbnB1dF9kYXRhLCAwLCBvdXRwdXRfZGF0YSwgMCwKLQkJICAgIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciwgY2luZm8tPmltYWdlX3dpZHRoKTsKLSAgLyogRWRnZS1leHBhbmQgKi8KLSAgZXhwYW5kX3JpZ2h0X2VkZ2Uob3V0cHV0X2RhdGEsIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciwKLQkJICAgIGNpbmZvLT5pbWFnZV93aWR0aCwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRSk7Ci19Ci0KLQotLyoKLSAqIERvd25zYW1wbGUgcGl4ZWwgdmFsdWVzIG9mIGEgc2luZ2xlIGNvbXBvbmVudC4KLSAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIHRoZSBjb21tb24gY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMToxIHZlcnRpY2FsLAotICogd2l0aG91dCBzbW9vdGhpbmcuCi0gKgotICogQSBub3RlIGFib3V0IHRoZSAiYmlhcyIgY2FsY3VsYXRpb25zOiB3aGVuIHJvdW5kaW5nIGZyYWN0aW9uYWwgdmFsdWVzIHRvCi0gKiBpbnRlZ2VyLCB3ZSBkbyBub3Qgd2FudCB0byBhbHdheXMgcm91bmQgMC41IHVwIHRvIHRoZSBuZXh0IGludGVnZXIuCi0gKiBJZiB3ZSBkaWQgdGhhdCwgd2UnZCBpbnRyb2R1Y2UgYSBub3RpY2VhYmxlIGJpYXMgdG93YXJkcyBsYXJnZXIgdmFsdWVzLgotICogSW5zdGVhZCwgdGhpcyBjb2RlIGlzIGFycmFuZ2VkIHNvIHRoYXQgMC41IHdpbGwgYmUgcm91bmRlZCB1cCBvciBkb3duIGF0Ci0gKiBhbHRlcm5hdGUgcGl4ZWwgbG9jYXRpb25zIChhIHNpbXBsZSBvcmRlcmVkIGRpdGhlciBwYXR0ZXJuKS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWgydjFfZG93bnNhbXBsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCQkgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKQotewotICBpbnQgb3V0cm93OwotICBKRElNRU5TSU9OIG91dGNvbDsKLSAgSkRJTUVOU0lPTiBvdXRwdXRfY29scyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkU7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7Ci0gIHJlZ2lzdGVyIGludCBiaWFzOwotCi0gIC8qIEV4cGFuZCBpbnB1dCBkYXRhIGVub3VnaCB0byBsZXQgYWxsIHRoZSBvdXRwdXQgc2FtcGxlcyBiZSBnZW5lcmF0ZWQKLSAgICogYnkgdGhlIHN0YW5kYXJkIGxvb3AuICBTcGVjaWFsLWNhc2luZyBwYWRkZWQgb3V0cHV0IHdvdWxkIGJlIG1vcmUKLSAgICogZWZmaWNpZW50LgotICAgKi8KLSAgZXhwYW5kX3JpZ2h0X2VkZ2UoaW5wdXRfZGF0YSwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yLAotCQkgICAgY2luZm8tPmltYWdlX3dpZHRoLCBvdXRwdXRfY29scyAqIDIpOwotCi0gIGZvciAob3V0cm93ID0gMDsgb3V0cm93IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb3V0cm93KyspIHsKLSAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtvdXRyb3ddOwotICAgIGlucHRyID0gaW5wdXRfZGF0YVtvdXRyb3ddOwotICAgIGJpYXMgPSAwOwkJCS8qIGJpYXMgPSAwLDEsMCwxLC4uLiBmb3Igc3VjY2Vzc2l2ZSBzYW1wbGVzICovCi0gICAgZm9yIChvdXRjb2wgPSAwOyBvdXRjb2wgPCBvdXRwdXRfY29sczsgb3V0Y29sKyspIHsKLSAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKEdFVEpTQU1QTEUoKmlucHRyKSArIEdFVEpTQU1QTEUoaW5wdHJbMV0pCi0JCQkgICAgICArIGJpYXMpID4+IDEpOwotICAgICAgYmlhcyBePSAxOwkJLyogMD0+MSwgMT0+MCAqLwotICAgICAgaW5wdHIgKz0gMjsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKgotICogRG93bnNhbXBsZSBwaXhlbCB2YWx1ZXMgb2YgYSBzaW5nbGUgY29tcG9uZW50LgotICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgdGhlIHN0YW5kYXJkIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDI6MSB2ZXJ0aWNhbCwKLSAqIHdpdGhvdXQgc21vb3RoaW5nLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotaDJ2Ml9kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JCSBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpCi17Ci0gIGludCBpbnJvdywgb3V0cm93OwotICBKRElNRU5TSU9OIG91dGNvbDsKLSAgSkRJTUVOU0lPTiBvdXRwdXRfY29scyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkU7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBvdXRwdHI7Ci0gIHJlZ2lzdGVyIGludCBiaWFzOwotCi0gIC8qIEV4cGFuZCBpbnB1dCBkYXRhIGVub3VnaCB0byBsZXQgYWxsIHRoZSBvdXRwdXQgc2FtcGxlcyBiZSBnZW5lcmF0ZWQKLSAgICogYnkgdGhlIHN0YW5kYXJkIGxvb3AuICBTcGVjaWFsLWNhc2luZyBwYWRkZWQgb3V0cHV0IHdvdWxkIGJlIG1vcmUKLSAgICogZWZmaWNpZW50LgotICAgKi8KLSAgZXhwYW5kX3JpZ2h0X2VkZ2UoaW5wdXRfZGF0YSwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yLAotCQkgICAgY2luZm8tPmltYWdlX3dpZHRoLCBvdXRwdXRfY29scyAqIDIpOwotCi0gIGlucm93ID0gMDsKLSAgZm9yIChvdXRyb3cgPSAwOyBvdXRyb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvdXRyb3crKykgewotICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107Ci0gICAgaW5wdHIwID0gaW5wdXRfZGF0YVtpbnJvd107Ci0gICAgaW5wdHIxID0gaW5wdXRfZGF0YVtpbnJvdysxXTsKLSAgICBiaWFzID0gMTsJCQkvKiBiaWFzID0gMSwyLDEsMiwuLi4gZm9yIHN1Y2Nlc3NpdmUgc2FtcGxlcyAqLwotICAgIGZvciAob3V0Y29sID0gMDsgb3V0Y29sIDwgb3V0cHV0X2NvbHM7IG91dGNvbCsrKSB7Ci0gICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChHRVRKU0FNUExFKCppbnB0cjApICsgR0VUSlNBTVBMRShpbnB0cjBbMV0pICsKLQkJCSAgICAgIEdFVEpTQU1QTEUoKmlucHRyMSkgKyBHRVRKU0FNUExFKGlucHRyMVsxXSkKLQkJCSAgICAgICsgYmlhcykgPj4gMik7Ci0gICAgICBiaWFzIF49IDM7CQkvKiAxPT4yLCAyPT4xICovCi0gICAgICBpbnB0cjAgKz0gMjsgaW5wdHIxICs9IDI7Ci0gICAgfQotICAgIGlucm93ICs9IDI7Ci0gIH0KLX0KLQotCi0jaWZkZWYgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRAotCi0vKgotICogRG93bnNhbXBsZSBwaXhlbCB2YWx1ZXMgb2YgYSBzaW5nbGUgY29tcG9uZW50LgotICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgdGhlIHN0YW5kYXJkIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDI6MSB2ZXJ0aWNhbCwKLSAqIHdpdGggc21vb3RoaW5nLiAgT25lIHJvdyBvZiBjb250ZXh0IGlzIHJlcXVpcmVkLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotaDJ2Ml9zbW9vdGhfZG93bnNhbXBsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCQkJSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKQotewotICBpbnQgaW5yb3csIG91dHJvdzsKLSAgSkRJTUVOU0lPTiBjb2xjdHI7Ci0gIEpESU1FTlNJT04gb3V0cHV0X2NvbHMgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgYWJvdmVfcHRyLCBiZWxvd19wdHIsIG91dHB0cjsKLSAgSU5UMzIgbWVtYmVyc3VtLCBuZWlnaHN1bSwgbWVtYmVyc2NhbGUsIG5laWdoc2NhbGU7Ci0KLSAgLyogRXhwYW5kIGlucHV0IGRhdGEgZW5vdWdoIHRvIGxldCBhbGwgdGhlIG91dHB1dCBzYW1wbGVzIGJlIGdlbmVyYXRlZAotICAgKiBieSB0aGUgc3RhbmRhcmQgbG9vcC4gIFNwZWNpYWwtY2FzaW5nIHBhZGRlZCBvdXRwdXQgd291bGQgYmUgbW9yZQotICAgKiBlZmZpY2llbnQuCi0gICAqLwotICBleHBhbmRfcmlnaHRfZWRnZShpbnB1dF9kYXRhIC0gMSwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICsgMiwKLQkJICAgIGNpbmZvLT5pbWFnZV93aWR0aCwgb3V0cHV0X2NvbHMgKiAyKTsKLQotICAvKiBXZSBkb24ndCBib3RoZXIgdG8gZm9ybSB0aGUgaW5kaXZpZHVhbCAic21vb3RoZWQiIGlucHV0IHBpeGVsIHZhbHVlczsKLSAgICogd2UgY2FuIGRpcmVjdGx5IGNvbXB1dGUgdGhlIG91dHB1dCB3aGljaCBpcyB0aGUgYXZlcmFnZSBvZiB0aGUgZm91cgotICAgKiBzbW9vdGhlZCB2YWx1ZXMuICBFYWNoIG9mIHRoZSBmb3VyIG1lbWJlciBwaXhlbHMgY29udHJpYnV0ZXMgYSBmcmFjdGlvbgotICAgKiAoMS04KlNGKSB0byBpdHMgb3duIHNtb290aGVkIGltYWdlIGFuZCBhIGZyYWN0aW9uIFNGIHRvIGVhY2ggb2YgdGhlIHRocmVlCi0gICAqIG90aGVyIHNtb290aGVkIHBpeGVscywgdGhlcmVmb3JlIGEgdG90YWwgZnJhY3Rpb24gKDEtNSpTRikvNCB0byB0aGUgZmluYWwKLSAgICogb3V0cHV0LiAgVGhlIGZvdXIgY29ybmVyLWFkamFjZW50IG5laWdoYm9yIHBpeGVscyBjb250cmlidXRlIGEgZnJhY3Rpb24KLSAgICogU0YgdG8ganVzdCBvbmUgc21vb3RoZWQgcGl4ZWwsIG9yIFNGLzQgdG8gdGhlIGZpbmFsIG91dHB1dDsgd2hpbGUgdGhlCi0gICAqIGVpZ2h0IGVkZ2UtYWRqYWNlbnQgbmVpZ2hib3JzIGNvbnRyaWJ1dGUgU0YgdG8gZWFjaCBvZiB0d28gc21vb3RoZWQKLSAgICogcGl4ZWxzLCBvciBTRi8yIG92ZXJhbGwuICBJbiBvcmRlciB0byB1c2UgaW50ZWdlciBhcml0aG1ldGljLCB0aGVzZQotICAgKiBmYWN0b3JzIGFyZSBzY2FsZWQgYnkgMl4xNiA9IDY1NTM2LgotICAgKiBBbHNvIHJlY2FsbCB0aGF0IFNGID0gc21vb3RoaW5nX2ZhY3RvciAvIDEwMjQuCi0gICAqLwotCi0gIG1lbWJlcnNjYWxlID0gMTYzODQgLSBjaW5mby0+c21vb3RoaW5nX2ZhY3RvciAqIDgwOyAvKiBzY2FsZWQgKDEtNSpTRikvNCAqLwotICBuZWlnaHNjYWxlID0gY2luZm8tPnNtb290aGluZ19mYWN0b3IgKiAxNjsgLyogc2NhbGVkIFNGLzQgKi8KLQotICBpbnJvdyA9IDA7Ci0gIGZvciAob3V0cm93ID0gMDsgb3V0cm93IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb3V0cm93KyspIHsKLSAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtvdXRyb3ddOwotICAgIGlucHRyMCA9IGlucHV0X2RhdGFbaW5yb3ddOwotICAgIGlucHRyMSA9IGlucHV0X2RhdGFbaW5yb3crMV07Ci0gICAgYWJvdmVfcHRyID0gaW5wdXRfZGF0YVtpbnJvdy0xXTsKLSAgICBiZWxvd19wdHIgPSBpbnB1dF9kYXRhW2lucm93KzJdOwotCi0gICAgLyogU3BlY2lhbCBjYXNlIGZvciBmaXJzdCBjb2x1bW46IHByZXRlbmQgY29sdW1uIC0xIGlzIHNhbWUgYXMgY29sdW1uIDAgKi8KLSAgICBtZW1iZXJzdW0gPSBHRVRKU0FNUExFKCppbnB0cjApICsgR0VUSlNBTVBMRShpbnB0cjBbMV0pICsKLQkJR0VUSlNBTVBMRSgqaW5wdHIxKSArIEdFVEpTQU1QTEUoaW5wdHIxWzFdKTsKLSAgICBuZWlnaHN1bSA9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cikgKyBHRVRKU0FNUExFKGFib3ZlX3B0clsxXSkgKwotCSAgICAgICBHRVRKU0FNUExFKCpiZWxvd19wdHIpICsgR0VUSlNBTVBMRShiZWxvd19wdHJbMV0pICsKLQkgICAgICAgR0VUSlNBTVBMRSgqaW5wdHIwKSArIEdFVEpTQU1QTEUoaW5wdHIwWzJdKSArCi0JICAgICAgIEdFVEpTQU1QTEUoKmlucHRyMSkgKyBHRVRKU0FNUExFKGlucHRyMVsyXSk7Ci0gICAgbmVpZ2hzdW0gKz0gbmVpZ2hzdW07Ci0gICAgbmVpZ2hzdW0gKz0gR0VUSlNBTVBMRSgqYWJvdmVfcHRyKSArIEdFVEpTQU1QTEUoYWJvdmVfcHRyWzJdKSArCi0JCUdFVEpTQU1QTEUoKmJlbG93X3B0cikgKyBHRVRKU0FNUExFKGJlbG93X3B0clsyXSk7Ci0gICAgbWVtYmVyc3VtID0gbWVtYmVyc3VtICogbWVtYmVyc2NhbGUgKyBuZWlnaHN1bSAqIG5laWdoc2NhbGU7Ci0gICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgobWVtYmVyc3VtICsgMzI3NjgpID4+IDE2KTsKLSAgICBpbnB0cjAgKz0gMjsgaW5wdHIxICs9IDI7IGFib3ZlX3B0ciArPSAyOyBiZWxvd19wdHIgKz0gMjsKLQotICAgIGZvciAoY29sY3RyID0gb3V0cHV0X2NvbHMgLSAyOyBjb2xjdHIgPiAwOyBjb2xjdHItLSkgewotICAgICAgLyogc3VtIG9mIHBpeGVscyBkaXJlY3RseSBtYXBwZWQgdG8gdGhpcyBvdXRwdXQgZWxlbWVudCAqLwotICAgICAgbWVtYmVyc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIwKSArIEdFVEpTQU1QTEUoaW5wdHIwWzFdKSArCi0JCSAgR0VUSlNBTVBMRSgqaW5wdHIxKSArIEdFVEpTQU1QTEUoaW5wdHIxWzFdKTsKLSAgICAgIC8qIHN1bSBvZiBlZGdlLW5laWdoYm9yIHBpeGVscyAqLwotICAgICAgbmVpZ2hzdW0gPSBHRVRKU0FNUExFKCphYm92ZV9wdHIpICsgR0VUSlNBTVBMRShhYm92ZV9wdHJbMV0pICsKLQkJIEdFVEpTQU1QTEUoKmJlbG93X3B0cikgKyBHRVRKU0FNUExFKGJlbG93X3B0clsxXSkgKwotCQkgR0VUSlNBTVBMRShpbnB0cjBbLTFdKSArIEdFVEpTQU1QTEUoaW5wdHIwWzJdKSArCi0JCSBHRVRKU0FNUExFKGlucHRyMVstMV0pICsgR0VUSlNBTVBMRShpbnB0cjFbMl0pOwotICAgICAgLyogVGhlIGVkZ2UtbmVpZ2hib3JzIGNvdW50IHR3aWNlIGFzIG11Y2ggYXMgY29ybmVyLW5laWdoYm9ycyAqLwotICAgICAgbmVpZ2hzdW0gKz0gbmVpZ2hzdW07Ci0gICAgICAvKiBBZGQgaW4gdGhlIGNvcm5lci1uZWlnaGJvcnMgKi8KLSAgICAgIG5laWdoc3VtICs9IEdFVEpTQU1QTEUoYWJvdmVfcHRyWy0xXSkgKyBHRVRKU0FNUExFKGFib3ZlX3B0clsyXSkgKwotCQkgIEdFVEpTQU1QTEUoYmVsb3dfcHRyWy0xXSkgKyBHRVRKU0FNUExFKGJlbG93X3B0clsyXSk7Ci0gICAgICAvKiBmb3JtIGZpbmFsIG91dHB1dCBzY2FsZWQgdXAgYnkgMl4xNiAqLwotICAgICAgbWVtYmVyc3VtID0gbWVtYmVyc3VtICogbWVtYmVyc2NhbGUgKyBuZWlnaHN1bSAqIG5laWdoc2NhbGU7Ci0gICAgICAvKiByb3VuZCwgZGVzY2FsZSBhbmQgb3V0cHV0IGl0ICovCi0gICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOwotICAgICAgaW5wdHIwICs9IDI7IGlucHRyMSArPSAyOyBhYm92ZV9wdHIgKz0gMjsgYmVsb3dfcHRyICs9IDI7Ci0gICAgfQotCi0gICAgLyogU3BlY2lhbCBjYXNlIGZvciBsYXN0IGNvbHVtbiAqLwotICAgIG1lbWJlcnN1bSA9IEdFVEpTQU1QTEUoKmlucHRyMCkgKyBHRVRKU0FNUExFKGlucHRyMFsxXSkgKwotCQlHRVRKU0FNUExFKCppbnB0cjEpICsgR0VUSlNBTVBMRShpbnB0cjFbMV0pOwotICAgIG5laWdoc3VtID0gR0VUSlNBTVBMRSgqYWJvdmVfcHRyKSArIEdFVEpTQU1QTEUoYWJvdmVfcHRyWzFdKSArCi0JICAgICAgIEdFVEpTQU1QTEUoKmJlbG93X3B0cikgKyBHRVRKU0FNUExFKGJlbG93X3B0clsxXSkgKwotCSAgICAgICBHRVRKU0FNUExFKGlucHRyMFstMV0pICsgR0VUSlNBTVBMRShpbnB0cjBbMV0pICsKLQkgICAgICAgR0VUSlNBTVBMRShpbnB0cjFbLTFdKSArIEdFVEpTQU1QTEUoaW5wdHIxWzFdKTsKLSAgICBuZWlnaHN1bSArPSBuZWlnaHN1bTsKLSAgICBuZWlnaHN1bSArPSBHRVRKU0FNUExFKGFib3ZlX3B0clstMV0pICsgR0VUSlNBTVBMRShhYm92ZV9wdHJbMV0pICsKLQkJR0VUSlNBTVBMRShiZWxvd19wdHJbLTFdKSArIEdFVEpTQU1QTEUoYmVsb3dfcHRyWzFdKTsKLSAgICBtZW1iZXJzdW0gPSBtZW1iZXJzdW0gKiBtZW1iZXJzY2FsZSArIG5laWdoc3VtICogbmVpZ2hzY2FsZTsKLSAgICAqb3V0cHRyID0gKEpTQU1QTEUpICgobWVtYmVyc3VtICsgMzI3NjgpID4+IDE2KTsKLQotICAgIGlucm93ICs9IDI7Ci0gIH0KLX0KLQotCi0vKgotICogRG93bnNhbXBsZSBwaXhlbCB2YWx1ZXMgb2YgYSBzaW5nbGUgY29tcG9uZW50LgotICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgdGhlIHNwZWNpYWwgY2FzZSBvZiBhIGZ1bGwtc2l6ZSBjb21wb25lbnQsCi0gKiB3aXRoIHNtb290aGluZy4gIE9uZSByb3cgb2YgY29udGV4dCBpcyByZXF1aXJlZC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZ1bGxzaXplX3Ntb290aF9kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0ciwKLQkJCSAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpCi17Ci0gIGludCBvdXRyb3c7Ci0gIEpESU1FTlNJT04gY29sY3RyOwotICBKRElNRU5TSU9OIG91dHB1dF9jb2xzID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRTsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIGFib3ZlX3B0ciwgYmVsb3dfcHRyLCBvdXRwdHI7Ci0gIElOVDMyIG1lbWJlcnN1bSwgbmVpZ2hzdW0sIG1lbWJlcnNjYWxlLCBuZWlnaHNjYWxlOwotICBpbnQgY29sc3VtLCBsYXN0Y29sc3VtLCBuZXh0Y29sc3VtOwotCi0gIC8qIEV4cGFuZCBpbnB1dCBkYXRhIGVub3VnaCB0byBsZXQgYWxsIHRoZSBvdXRwdXQgc2FtcGxlcyBiZSBnZW5lcmF0ZWQKLSAgICogYnkgdGhlIHN0YW5kYXJkIGxvb3AuICBTcGVjaWFsLWNhc2luZyBwYWRkZWQgb3V0cHV0IHdvdWxkIGJlIG1vcmUKLSAgICogZWZmaWNpZW50LgotICAgKi8KLSAgZXhwYW5kX3JpZ2h0X2VkZ2UoaW5wdXRfZGF0YSAtIDEsIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciArIDIsCi0JCSAgICBjaW5mby0+aW1hZ2Vfd2lkdGgsIG91dHB1dF9jb2xzKTsKLQotICAvKiBFYWNoIG9mIHRoZSBlaWdodCBuZWlnaGJvciBwaXhlbHMgY29udHJpYnV0ZXMgYSBmcmFjdGlvbiBTRiB0byB0aGUKLSAgICogc21vb3RoZWQgcGl4ZWwsIHdoaWxlIHRoZSBtYWluIHBpeGVsIGNvbnRyaWJ1dGVzICgxLTgqU0YpLiAgSW4gb3JkZXIKLSAgICogdG8gdXNlIGludGVnZXIgYXJpdGhtZXRpYywgdGhlc2UgZmFjdG9ycyBhcmUgbXVsdGlwbGllZCBieSAyXjE2ID0gNjU1MzYuCi0gICAqIEFsc28gcmVjYWxsIHRoYXQgU0YgPSBzbW9vdGhpbmdfZmFjdG9yIC8gMTAyNC4KLSAgICovCi0KLSAgbWVtYmVyc2NhbGUgPSA2NTUzNkwgLSBjaW5mby0+c21vb3RoaW5nX2ZhY3RvciAqIDUxMkw7IC8qIHNjYWxlZCAxLTgqU0YgKi8KLSAgbmVpZ2hzY2FsZSA9IGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yICogNjQ7IC8qIHNjYWxlZCBTRiAqLwotCi0gIGZvciAob3V0cm93ID0gMDsgb3V0cm93IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb3V0cm93KyspIHsKLSAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtvdXRyb3ddOwotICAgIGlucHRyID0gaW5wdXRfZGF0YVtvdXRyb3ddOwotICAgIGFib3ZlX3B0ciA9IGlucHV0X2RhdGFbb3V0cm93LTFdOwotICAgIGJlbG93X3B0ciA9IGlucHV0X2RhdGFbb3V0cm93KzFdOwotCi0gICAgLyogU3BlY2lhbCBjYXNlIGZvciBmaXJzdCBjb2x1bW4gKi8KLSAgICBjb2xzdW0gPSBHRVRKU0FNUExFKCphYm92ZV9wdHIrKykgKyBHRVRKU0FNUExFKCpiZWxvd19wdHIrKykgKwotCSAgICAgR0VUSlNBTVBMRSgqaW5wdHIpOwotICAgIG1lbWJlcnN1bSA9IEdFVEpTQU1QTEUoKmlucHRyKyspOwotICAgIG5leHRjb2xzdW0gPSBHRVRKU0FNUExFKCphYm92ZV9wdHIpICsgR0VUSlNBTVBMRSgqYmVsb3dfcHRyKSArCi0JCSBHRVRKU0FNUExFKCppbnB0cik7Ci0gICAgbmVpZ2hzdW0gPSBjb2xzdW0gKyAoY29sc3VtIC0gbWVtYmVyc3VtKSArIG5leHRjb2xzdW07Ci0gICAgbWVtYmVyc3VtID0gbWVtYmVyc3VtICogbWVtYmVyc2NhbGUgKyBuZWlnaHN1bSAqIG5laWdoc2NhbGU7Ci0gICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgobWVtYmVyc3VtICsgMzI3NjgpID4+IDE2KTsKLSAgICBsYXN0Y29sc3VtID0gY29sc3VtOyBjb2xzdW0gPSBuZXh0Y29sc3VtOwotCi0gICAgZm9yIChjb2xjdHIgPSBvdXRwdXRfY29scyAtIDI7IGNvbGN0ciA+IDA7IGNvbGN0ci0tKSB7Ci0gICAgICBtZW1iZXJzdW0gPSBHRVRKU0FNUExFKCppbnB0cisrKTsKLSAgICAgIGFib3ZlX3B0cisrOyBiZWxvd19wdHIrKzsKLSAgICAgIG5leHRjb2xzdW0gPSBHRVRKU0FNUExFKCphYm92ZV9wdHIpICsgR0VUSlNBTVBMRSgqYmVsb3dfcHRyKSArCi0JCSAgIEdFVEpTQU1QTEUoKmlucHRyKTsKLSAgICAgIG5laWdoc3VtID0gbGFzdGNvbHN1bSArIChjb2xzdW0gLSBtZW1iZXJzdW0pICsgbmV4dGNvbHN1bTsKLSAgICAgIG1lbWJlcnN1bSA9IG1lbWJlcnN1bSAqIG1lbWJlcnNjYWxlICsgbmVpZ2hzdW0gKiBuZWlnaHNjYWxlOwotICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgobWVtYmVyc3VtICsgMzI3NjgpID4+IDE2KTsKLSAgICAgIGxhc3Rjb2xzdW0gPSBjb2xzdW07IGNvbHN1bSA9IG5leHRjb2xzdW07Ci0gICAgfQotCi0gICAgLyogU3BlY2lhbCBjYXNlIGZvciBsYXN0IGNvbHVtbiAqLwotICAgIG1lbWJlcnN1bSA9IEdFVEpTQU1QTEUoKmlucHRyKTsKLSAgICBuZWlnaHN1bSA9IGxhc3Rjb2xzdW0gKyAoY29sc3VtIC0gbWVtYmVyc3VtKSArIGNvbHN1bTsKLSAgICBtZW1iZXJzdW0gPSBtZW1iZXJzdW0gKiBtZW1iZXJzY2FsZSArIG5laWdoc3VtICogbmVpZ2hzY2FsZTsKLSAgICAqb3V0cHRyID0gKEpTQU1QTEUpICgobWVtYmVyc3VtICsgMzI3NjgpID4+IDE2KTsKLQotICB9Ci19Ci0KLSNlbmRpZiAvKiBJTlBVVF9TTU9PVEhJTkdfU1VQUE9SVEVEICovCi0KLQotLyoKLSAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciBkb3duc2FtcGxpbmcuCi0gKiBOb3RlIHRoYXQgd2UgbXVzdCBzZWxlY3QgYSByb3V0aW5lIGZvciBlYWNoIGNvbXBvbmVudC4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2Rvd25zYW1wbGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfZG93bnNhbXBsZV9wdHIgZG93bnNhbXBsZTsKLSAgaW50IGNpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLSAgYm9vbGVhbiBzbW9vdGhvayA9IFRSVUU7Ci0KLSAgZG93bnNhbXBsZSA9IChteV9kb3duc2FtcGxlX3B0cikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCVNJWkVPRihteV9kb3duc2FtcGxlcikpOwotICBjaW5mby0+ZG93bnNhbXBsZSA9IChzdHJ1Y3QganBlZ19kb3duc2FtcGxlciAqKSBkb3duc2FtcGxlOwotICBkb3duc2FtcGxlLT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfZG93bnNhbXBsZTsKLSAgZG93bnNhbXBsZS0+cHViLmRvd25zYW1wbGUgPSBzZXBfZG93bnNhbXBsZTsKLSAgZG93bnNhbXBsZS0+cHViLm5lZWRfY29udGV4dF9yb3dzID0gRkFMU0U7Ci0KLSAgaWYgKGNpbmZvLT5DQ0lSNjAxX3NhbXBsaW5nKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ0NJUjYwMV9OT1RJTVBMKTsKLQotICAvKiBWZXJpZnkgd2UgY2FuIGhhbmRsZSB0aGUgc2FtcGxpbmcgZmFjdG9ycywgYW5kIHNldCB1cCBtZXRob2QgcG9pbnRlcnMgKi8KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICBpZiAoY29tcHB0ci0+aF9zYW1wX2ZhY3RvciA9PSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgJiYKLQljb21wcHRyLT52X3NhbXBfZmFjdG9yID09IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgewotI2lmZGVmIElOUFVUX1NNT09USElOR19TVVBQT1JURUQKLSAgICAgIGlmIChjaW5mby0+c21vb3RoaW5nX2ZhY3RvcikgewotCWRvd25zYW1wbGUtPm1ldGhvZHNbY2ldID0gZnVsbHNpemVfc21vb3RoX2Rvd25zYW1wbGU7Ci0JZG93bnNhbXBsZS0+cHViLm5lZWRfY29udGV4dF9yb3dzID0gVFJVRTsKLSAgICAgIH0gZWxzZQotI2VuZGlmCi0JZG93bnNhbXBsZS0+bWV0aG9kc1tjaV0gPSBmdWxsc2l6ZV9kb3duc2FtcGxlOwotICAgIH0gZWxzZSBpZiAoY29tcHB0ci0+aF9zYW1wX2ZhY3RvciAqIDIgPT0gY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICYmCi0JICAgICAgIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgPT0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7Ci0gICAgICBzbW9vdGhvayA9IEZBTFNFOwotICAgICAgZG93bnNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYxX2Rvd25zYW1wbGU7Ci0gICAgfSBlbHNlIGlmIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yICogMiA9PSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgJiYKLQkgICAgICAgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIDIgPT0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7Ci0jaWZkZWYgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRAotICAgICAgaWYgKGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yKSB7Ci0JZG93bnNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYyX3Ntb290aF9kb3duc2FtcGxlOwotCWRvd25zYW1wbGUtPnB1Yi5uZWVkX2NvbnRleHRfcm93cyA9IFRSVUU7Ci0gICAgICB9IGVsc2UKLSNlbmRpZgotCWRvd25zYW1wbGUtPm1ldGhvZHNbY2ldID0gaDJ2Ml9kb3duc2FtcGxlOwotICAgIH0gZWxzZSBpZiAoKGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAlIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpID09IDAgJiYKLQkgICAgICAgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAlIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpID09IDApIHsKLSAgICAgIHNtb290aG9rID0gRkFMU0U7Ci0gICAgICBkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGludF9kb3duc2FtcGxlOwotICAgIH0gZWxzZQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9GUkFDVF9TQU1QTEVfTk9USU1QTCk7Ci0gIH0KLQotI2lmZGVmIElOUFVUX1NNT09USElOR19TVVBQT1JURUQKLSAgaWYgKGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yICYmICFzbW9vdGhvaykKLSAgICBUUkFDRU1TKGNpbmZvLCAwLCBKVFJDX1NNT09USF9OT1RJTVBMKTsKLSNlbmRpZgotfQotCi0jZW5kaWYgLy9fRlhfSlBFR19UVVJCT18KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjdHJhbnMuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjdHJhbnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBkMTY2Ny4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY3RyYW5zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTEgKzAsMCBAQAotI2lmICFkZWZpbmVkKF9GWF9KUEVHX1RVUkJPXykKLS8qCi0gKiBqY3RyYW5zLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBsaWJyYXJ5IHJvdXRpbmVzIGZvciB0cmFuc2NvZGluZyBjb21wcmVzc2lvbiwKLSAqIHRoYXQgaXMsIHdyaXRpbmcgcmF3IERDVCBjb2VmZmljaWVudCBhcnJheXMgdG8gYW4gb3V0cHV0IEpQRUcgZmlsZS4KLSAqIFRoZSByb3V0aW5lcyBpbiBqY2FwaW1pbi5jIHdpbGwgYWxzbyBiZSBuZWVkZWQgYnkgYSB0cmFuc2NvZGVyLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotTE9DQUwodm9pZCkgdHJhbnNlbmNvZGVfbWFzdGVyX3NlbGVjdGlvbgotCUpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGp2aXJ0X2JhcnJheV9wdHIgKiBjb2VmX2FycmF5cykpOwotTE9DQUwodm9pZCkgdHJhbnNlbmNvZGVfY29lZl9jb250cm9sbGVyCi0JSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywganZpcnRfYmFycmF5X3B0ciAqIGNvZWZfYXJyYXlzKSk7Ci0KLQotLyoKLSAqIENvbXByZXNzaW9uIGluaXRpYWxpemF0aW9uIGZvciB3cml0aW5nIHJhdy1jb2VmZmljaWVudCBkYXRhLgotICogQmVmb3JlIGNhbGxpbmcgdGhpcywgYWxsIHBhcmFtZXRlcnMgYW5kIGEgZGF0YSBkZXN0aW5hdGlvbiBtdXN0IGJlIHNldCB1cC4KLSAqIENhbGwganBlZ19maW5pc2hfY29tcHJlc3MoKSB0byBhY3R1YWxseSB3cml0ZSB0aGUgZGF0YS4KLSAqCi0gKiBUaGUgbnVtYmVyIG9mIHBhc3NlZCB2aXJ0dWFsIGFycmF5cyBtdXN0IG1hdGNoIGNpbmZvLT5udW1fY29tcG9uZW50cy4KLSAqIE5vdGUgdGhhdCB0aGUgdmlydHVhbCBhcnJheXMgbmVlZCBub3QgYmUgZmlsbGVkIG9yIGV2ZW4gcmVhbGl6ZWQgYXQKLSAqIHRoZSB0aW1lIHdyaXRlX2NvZWZmaWNpZW50cyBpcyBjYWxsZWQ7IGluZGVlZCwgaWYgdGhlIHZpcnR1YWwgYXJyYXlzCi0gKiB3ZXJlIHJlcXVlc3RlZCBmcm9tIHRoaXMgY29tcHJlc3Npb24gb2JqZWN0J3MgbWVtb3J5IG1hbmFnZXIsIHRoZXkKLSAqIHR5cGljYWxseSB3aWxsIGJlIHJlYWxpemVkIGR1cmluZyB0aGlzIHJvdXRpbmUgYW5kIGZpbGxlZCBhZnRlcndhcmRzLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ193cml0ZV9jb2VmZmljaWVudHMgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqdmlydF9iYXJyYXlfcHRyICogY29lZl9hcnJheXMpCi17Ci0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TVEFSVCkKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotICAvKiBNYXJrIGFsbCB0YWJsZXMgdG8gYmUgd3JpdHRlbiAqLwotICBqcGVnX3N1cHByZXNzX3RhYmxlcyhjaW5mbywgRkFMU0UpOwotICAvKiAoUmUpaW5pdGlhbGl6ZSBlcnJvciBtZ3IgYW5kIGRlc3RpbmF0aW9uIG1vZHVsZXMgKi8KLSAgKCpjaW5mby0+ZXJyLT5yZXNldF9lcnJvcl9tZ3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gICgqY2luZm8tPmRlc3QtPmluaXRfZGVzdGluYXRpb24pIChjaW5mbyk7Ci0gIC8qIFBlcmZvcm0gbWFzdGVyIHNlbGVjdGlvbiBvZiBhY3RpdmUgbW9kdWxlcyAqLwotICB0cmFuc2VuY29kZV9tYXN0ZXJfc2VsZWN0aW9uKGNpbmZvLCBjb2VmX2FycmF5cyk7Ci0gIC8qIFdhaXQgZm9yIGpwZWdfZmluaXNoX2NvbXByZXNzKCkgY2FsbCAqLwotICBjaW5mby0+bmV4dF9zY2FubGluZSA9IDA7CS8qIHNvIGpwZWdfd3JpdGVfbWFya2VyIHdvcmtzICovCi0gIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBDU1RBVEVfV1JDT0VGUzsKLX0KLQotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgY29tcHJlc3Npb24gb2JqZWN0IHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzLAotICogdGhlbiBjb3B5IGZyb20gdGhlIHNvdXJjZSBvYmplY3QgYWxsIHBhcmFtZXRlcnMgbmVlZGVkIGZvciBsb3NzbGVzcwotICogdHJhbnNjb2RpbmcuICBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHZhcmllZCB3aXRob3V0IGxvc3MgKHN1Y2ggYXMKLSAqIHNjYW4gc2NyaXB0IGFuZCBIdWZmbWFuIG9wdGltaXphdGlvbikgYXJlIGxlZnQgaW4gdGhlaXIgZGVmYXVsdCBzdGF0ZXMuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2NvcHlfY3JpdGljYWxfcGFyYW1ldGVycyAoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLAotCQkJICAgICAgIGpfY29tcHJlc3NfcHRyIGRzdGluZm8pCi17Ci0gIEpRVUFOVF9UQkwgKiogcXRibHB0cjsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqaW5jb21wLCAqb3V0Y29tcDsKLSAgSlFVQU5UX1RCTCAqY19xdWFudCwgKnNsb3RfcXVhbnQ7Ci0gIGludCB0YmxubywgY2ksIGNvZWZpOwotCi0gIC8qIFNhZmV0eSBjaGVjayB0byBlbnN1cmUgc3RhcnRfY29tcHJlc3Mgbm90IGNhbGxlZCB5ZXQuICovCi0gIGlmIChkc3RpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NUQVJUKQotICAgIEVSUkVYSVQxKGRzdGluZm8sIEpFUlJfQkFEX1NUQVRFLCBkc3RpbmZvLT5nbG9iYWxfc3RhdGUpOwotICAvKiBDb3B5IGZ1bmRhbWVudGFsIGltYWdlIGRpbWVuc2lvbnMgKi8KLSAgZHN0aW5mby0+aW1hZ2Vfd2lkdGggPSBzcmNpbmZvLT5pbWFnZV93aWR0aDsKLSAgZHN0aW5mby0+aW1hZ2VfaGVpZ2h0ID0gc3JjaW5mby0+aW1hZ2VfaGVpZ2h0OwotICBkc3RpbmZvLT5pbnB1dF9jb21wb25lbnRzID0gc3JjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gIGRzdGluZm8tPmluX2NvbG9yX3NwYWNlID0gc3JjaW5mby0+anBlZ19jb2xvcl9zcGFjZTsKLSAgLyogSW5pdGlhbGl6ZSBhbGwgcGFyYW1ldGVycyB0byBkZWZhdWx0IHZhbHVlcyAqLwotICBqcGVnX3NldF9kZWZhdWx0cyhkc3RpbmZvKTsKLSAgLyoganBlZ19zZXRfZGVmYXVsdHMgbWF5IGNob29zZSB3cm9uZyBjb2xvcnNwYWNlLCBlZyBZQ2JDciBpZiBpbnB1dCBpcyBSR0IuCi0gICAqIEZpeCBpdCB0byBnZXQgdGhlIHJpZ2h0IGhlYWRlciBtYXJrZXJzIGZvciB0aGUgaW1hZ2UgY29sb3JzcGFjZS4KLSAgICovCi0gIGpwZWdfc2V0X2NvbG9yc3BhY2UoZHN0aW5mbywgc3JjaW5mby0+anBlZ19jb2xvcl9zcGFjZSk7Ci0gIGRzdGluZm8tPmRhdGFfcHJlY2lzaW9uID0gc3JjaW5mby0+ZGF0YV9wcmVjaXNpb247Ci0gIGRzdGluZm8tPkNDSVI2MDFfc2FtcGxpbmcgPSBzcmNpbmZvLT5DQ0lSNjAxX3NhbXBsaW5nOwotICAvKiBDb3B5IHRoZSBzb3VyY2UncyBxdWFudGl6YXRpb24gdGFibGVzLiAqLwotICBmb3IgKHRibG5vID0gMDsgdGJsbm8gPCBOVU1fUVVBTlRfVEJMUzsgdGJsbm8rKykgewotICAgIGlmIChzcmNpbmZvLT5xdWFudF90YmxfcHRyc1t0Ymxub10gIT0gTlVMTCkgewotICAgICAgcXRibHB0ciA9ICYgZHN0aW5mby0+cXVhbnRfdGJsX3B0cnNbdGJsbm9dOwotICAgICAgaWYgKCpxdGJscHRyID09IE5VTEwpCi0JKnF0YmxwdHIgPSBqcGVnX2FsbG9jX3F1YW50X3RhYmxlKChqX2NvbW1vbl9wdHIpIGRzdGluZm8pOwotICAgICAgTUVNQ09QWSgoKnF0YmxwdHIpLT5xdWFudHZhbCwKLQkgICAgICBzcmNpbmZvLT5xdWFudF90YmxfcHRyc1t0Ymxub10tPnF1YW50dmFsLAotCSAgICAgIFNJWkVPRigoKnF0YmxwdHIpLT5xdWFudHZhbCkpOwotICAgICAgKCpxdGJscHRyKS0+c2VudF90YWJsZSA9IEZBTFNFOwotICAgIH0KLSAgfQotICAvKiBDb3B5IHRoZSBzb3VyY2UncyBwZXItY29tcG9uZW50IGluZm8uCi0gICAqIE5vdGUgd2UgYXNzdW1lIGpwZWdfc2V0X2RlZmF1bHRzIGhhcyBhbGxvY2F0ZWQgdGhlIGRlc3QgY29tcF9pbmZvIGFycmF5LgotICAgKi8KLSAgZHN0aW5mby0+bnVtX2NvbXBvbmVudHMgPSBzcmNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgaWYgKGRzdGluZm8tPm51bV9jb21wb25lbnRzIDwgMSB8fCBkc3RpbmZvLT5udW1fY29tcG9uZW50cyA+IE1BWF9DT01QT05FTlRTKQotICAgIEVSUkVYSVQyKGRzdGluZm8sIEpFUlJfQ09NUE9ORU5UX0NPVU5ULCBkc3RpbmZvLT5udW1fY29tcG9uZW50cywKLQkgICAgIE1BWF9DT01QT05FTlRTKTsKLSAgZm9yIChjaSA9IDAsIGluY29tcCA9IHNyY2luZm8tPmNvbXBfaW5mbywgb3V0Y29tcCA9IGRzdGluZm8tPmNvbXBfaW5mbzsKLSAgICAgICBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrLCBpbmNvbXArKywgb3V0Y29tcCsrKSB7Ci0gICAgb3V0Y29tcC0+Y29tcG9uZW50X2lkID0gaW5jb21wLT5jb21wb25lbnRfaWQ7Ci0gICAgb3V0Y29tcC0+aF9zYW1wX2ZhY3RvciA9IGluY29tcC0+aF9zYW1wX2ZhY3RvcjsKLSAgICBvdXRjb21wLT52X3NhbXBfZmFjdG9yID0gaW5jb21wLT52X3NhbXBfZmFjdG9yOwotICAgIG91dGNvbXAtPnF1YW50X3RibF9ubyA9IGluY29tcC0+cXVhbnRfdGJsX25vOwotICAgIC8qIE1ha2Ugc3VyZSBzYXZlZCBxdWFudGl6YXRpb24gdGFibGUgZm9yIGNvbXBvbmVudCBtYXRjaGVzIHRoZSBxdGFibGUKLSAgICAgKiBzbG90LiAgSWYgbm90LCB0aGUgaW5wdXQgZmlsZSByZS11c2VkIHRoaXMgcXRhYmxlIHNsb3QuCi0gICAgICogSUpHIGVuY29kZXIgY3VycmVudGx5IGNhbm5vdCBkdXBsaWNhdGUgdGhpcy4KLSAgICAgKi8KLSAgICB0YmxubyA9IG91dGNvbXAtPnF1YW50X3RibF9ubzsKLSAgICBpZiAodGJsbm8gPCAwIHx8IHRibG5vID49IE5VTV9RVUFOVF9UQkxTIHx8Ci0Jc3JjaW5mby0+cXVhbnRfdGJsX3B0cnNbdGJsbm9dID09IE5VTEwpCi0gICAgICBFUlJFWElUMShkc3RpbmZvLCBKRVJSX05PX1FVQU5UX1RBQkxFLCB0Ymxubyk7Ci0gICAgc2xvdF9xdWFudCA9IHNyY2luZm8tPnF1YW50X3RibF9wdHJzW3RibG5vXTsKLSAgICBjX3F1YW50ID0gaW5jb21wLT5xdWFudF90YWJsZTsKLSAgICBpZiAoY19xdWFudCAhPSBOVUxMKSB7Ci0gICAgICBmb3IgKGNvZWZpID0gMDsgY29lZmkgPCBEQ1RTSVpFMjsgY29lZmkrKykgewotCWlmIChjX3F1YW50LT5xdWFudHZhbFtjb2VmaV0gIT0gc2xvdF9xdWFudC0+cXVhbnR2YWxbY29lZmldKQotCSAgRVJSRVhJVDEoZHN0aW5mbywgSkVSUl9NSVNNQVRDSEVEX1FVQU5UX1RBQkxFLCB0Ymxubyk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIE5vdGU6IHdlIGRvIG5vdCBjb3B5IHRoZSBzb3VyY2UncyBIdWZmbWFuIHRhYmxlIGFzc2lnbm1lbnRzOwotICAgICAqIGluc3RlYWQgd2UgcmVseSBvbiBqcGVnX3NldF9jb2xvcnNwYWNlIHRvIGhhdmUgbWFkZSBhIHN1aXRhYmxlIGNob2ljZS4KLSAgICAgKi8KLSAgfQotICAvKiBBbHNvIGNvcHkgSkZJRiB2ZXJzaW9uIGFuZCByZXNvbHV0aW9uIGluZm9ybWF0aW9uLCBpZiBhdmFpbGFibGUuCi0gICAqIFN0cmljdGx5IHNwZWFraW5nIHRoaXMgaXNuJ3QgImNyaXRpY2FsIiBpbmZvLCBidXQgaXQncyBuZWFybHkKLSAgICogYWx3YXlzIGFwcHJvcHJpYXRlIHRvIGNvcHkgaXQgaWYgYXZhaWxhYmxlLiAgSW4gcGFydGljdWxhciwKLSAgICogaWYgdGhlIGFwcGxpY2F0aW9uIGNob29zZXMgdG8gY29weSBKRklGIDEuMDIgZXh0ZW5zaW9uIG1hcmtlcnMgZnJvbQotICAgKiB0aGUgc291cmNlIGZpbGUsIHdlIG5lZWQgdG8gY29weSB0aGUgdmVyc2lvbiB0byBtYWtlIHN1cmUgd2UgZG9uJ3QKLSAgICogZW1pdCBhIGZpbGUgdGhhdCBoYXMgMS4wMiBleHRlbnNpb25zIGJ1dCBhIGNsYWltZWQgdmVyc2lvbiBvZiAxLjAxLgotICAgKiBXZSB3aWxsICpub3QqLCBob3dldmVyLCBjb3B5IHZlcnNpb24gaW5mbyBmcm9tIG1pc2xhYmVsZWQgIjIuMDEiIGZpbGVzLgotICAgKi8KLSAgaWYgKHNyY2luZm8tPnNhd19KRklGX21hcmtlcikgewotICAgIGlmIChzcmNpbmZvLT5KRklGX21ham9yX3ZlcnNpb24gPT0gMSkgewotICAgICAgZHN0aW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uID0gc3JjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uOwotICAgICAgZHN0aW5mby0+SkZJRl9taW5vcl92ZXJzaW9uID0gc3JjaW5mby0+SkZJRl9taW5vcl92ZXJzaW9uOwotICAgIH0KLSAgICBkc3RpbmZvLT5kZW5zaXR5X3VuaXQgPSBzcmNpbmZvLT5kZW5zaXR5X3VuaXQ7Ci0gICAgZHN0aW5mby0+WF9kZW5zaXR5ID0gc3JjaW5mby0+WF9kZW5zaXR5OwotICAgIGRzdGluZm8tPllfZGVuc2l0eSA9IHNyY2luZm8tPllfZGVuc2l0eTsKLSAgfQotfQotCi0KLS8qCi0gKiBNYXN0ZXIgc2VsZWN0aW9uIG9mIGNvbXByZXNzaW9uIG1vZHVsZXMgZm9yIHRyYW5zY29kaW5nLgotICogVGhpcyBzdWJzdGl0dXRlcyBmb3IgamNpbml0LmMncyBpbml0aWFsaXphdGlvbiBvZiB0aGUgZnVsbCBjb21wcmVzc29yLgotICovCi0KLUxPQ0FMKHZvaWQpCi10cmFuc2VuY29kZV9tYXN0ZXJfc2VsZWN0aW9uIChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCSAgICAgIGp2aXJ0X2JhcnJheV9wdHIgKiBjb2VmX2FycmF5cykKLXsKLSAgLyogQWx0aG91Z2ggd2UgZG9uJ3QgYWN0dWFsbHkgdXNlIGlucHV0X2NvbXBvbmVudHMgZm9yIHRyYW5zY29kaW5nLAotICAgKiBqY21hc3Rlci5jJ3MgaW5pdGlhbF9zZXR1cCB3aWxsIGNvbXBsYWluIGlmIGlucHV0X2NvbXBvbmVudHMgaXMgMC4KLSAgICovCi0gIGNpbmZvLT5pbnB1dF9jb21wb25lbnRzID0gMTsKLSAgLyogSW5pdGlhbGl6ZSBtYXN0ZXIgY29udHJvbCAoaW5jbHVkZXMgcGFyYW1ldGVyIGNoZWNraW5nL3Byb2Nlc3NpbmcpICovCi0gIGppbml0X2NfbWFzdGVyX2NvbnRyb2woY2luZm8sIFRSVUUgLyogdHJhbnNjb2RlIG9ubHkgKi8pOwotCi0gIC8qIEVudHJvcHkgZW5jb2Rpbmc6IGVpdGhlciBIdWZmbWFuIG9yIGFyaXRobWV0aWMgY29kaW5nLiAqLwotICBpZiAoY2luZm8tPmFyaXRoX2NvZGUpIHsKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0FSSVRIX05PVElNUEwpOwotICB9IGVsc2UgewotICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgewotI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECi0gICAgICBqaW5pdF9waHVmZl9lbmNvZGVyKGNpbmZvKTsKLSNlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0jZW5kaWYKLSAgICB9IGVsc2UKLSAgICAgIGppbml0X2h1ZmZfZW5jb2RlcihjaW5mbyk7Ci0gIH0KLQotICAvKiBXZSBuZWVkIGEgc3BlY2lhbCBjb2VmZmljaWVudCBidWZmZXIgY29udHJvbGxlci4gKi8KLSAgdHJhbnNlbmNvZGVfY29lZl9jb250cm9sbGVyKGNpbmZvLCBjb2VmX2FycmF5cyk7Ci0KLSAgamluaXRfbWFya2VyX3dyaXRlcihjaW5mbyk7Ci0KLSAgLyogV2UgY2FuIG5vdyB0ZWxsIHRoZSBtZW1vcnkgbWFuYWdlciB0byBhbGxvY2F0ZSB2aXJ0dWFsIGFycmF5cy4gKi8KLSAgKCpjaW5mby0+bWVtLT5yZWFsaXplX3ZpcnRfYXJyYXlzKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotCi0gIC8qIFdyaXRlIHRoZSBkYXRhc3RyZWFtIGhlYWRlciAoU09JLCBKRklGKSBpbW1lZGlhdGVseS4KLSAgICogRnJhbWUgYW5kIHNjYW4gaGVhZGVycyBhcmUgcG9zdHBvbmVkIHRpbGwgbGF0ZXIuCi0gICAqIFRoaXMgbGV0cyBhcHBsaWNhdGlvbiBpbnNlcnQgc3BlY2lhbCBtYXJrZXJzIGFmdGVyIHRoZSBTT0kuCi0gICAqLwotICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX2ZpbGVfaGVhZGVyKSAoY2luZm8pOwotfQotCi0KLS8qCi0gKiBUaGUgcmVzdCBvZiB0aGlzIGZpbGUgaXMgYSBzcGVjaWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb2VmZmljaWVudAotICogYnVmZmVyIGNvbnRyb2xsZXIuICBUaGlzIGlzIHNpbWlsYXIgdG8gamNjb2VmY3QuYywgYnV0IGl0IGhhbmRsZXMgb25seQotICogb3V0cHV0IGZyb20gcHJlc3VwcGxpZWQgdmlydHVhbCBhcnJheXMuICBGdXJ0aGVybW9yZSwgd2UgZ2VuZXJhdGUgYW55Ci0gKiBkdW1teSBwYWRkaW5nIGJsb2NrcyBvbi10aGUtZmx5IHJhdGhlciB0aGFuIGV4cGVjdGluZyB0aGVtIHRvIGJlIHByZXNlbnQKLSAqIGluIHRoZSBhcnJheXMuCi0gKi8KLQotLyogUHJpdmF0ZSBidWZmZXIgY29udHJvbGxlciBvYmplY3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19jX2NvZWZfY29udHJvbGxlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICBKRElNRU5TSU9OIGlNQ1Vfcm93X251bTsJLyogaU1DVSByb3cgIyB3aXRoaW4gaW1hZ2UgKi8KLSAgSkRJTUVOU0lPTiBtY3VfY3RyOwkJLyogY291bnRzIE1DVXMgcHJvY2Vzc2VkIGluIGN1cnJlbnQgcm93ICovCi0gIGludCBNQ1VfdmVydF9vZmZzZXQ7CQkvKiBjb3VudHMgTUNVIHJvd3Mgd2l0aGluIGlNQ1Ugcm93ICovCi0gIGludCBNQ1Vfcm93c19wZXJfaU1DVV9yb3c7CS8qIG51bWJlciBvZiBzdWNoIHJvd3MgbmVlZGVkICovCi0KLSAgLyogVmlydHVhbCBibG9jayBhcnJheSBmb3IgZWFjaCBjb21wb25lbnQuICovCi0gIGp2aXJ0X2JhcnJheV9wdHIgKiB3aG9sZV9pbWFnZTsKLQotICAvKiBXb3Jrc3BhY2UgZm9yIGNvbnN0cnVjdGluZyBkdW1teSBibG9ja3MgYXQgcmlnaHQvYm90dG9tIGVkZ2VzLiAqLwotICBKQkxPQ0tST1cgZHVtbXlfYnVmZmVyW0NfTUFYX0JMT0NLU19JTl9NQ1VdOwotfSBteV9jb2VmX2NvbnRyb2xsZXI7Ci0KLXR5cGVkZWYgbXlfY29lZl9jb250cm9sbGVyICogbXlfY29lZl9wdHI7Ci0KLQotTE9DQUwodm9pZCkKLXN0YXJ0X2lNQ1Vfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbykKLS8qIFJlc2V0IHdpdGhpbi1pTUNVLXJvdyBjb3VudGVycyBmb3IgYSBuZXcgcm93ICovCi17Ci0gIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOwotCi0gIC8qIEluIGFuIGludGVybGVhdmVkIHNjYW4sIGFuIE1DVSByb3cgaXMgdGhlIHNhbWUgYXMgYW4gaU1DVSByb3cuCi0gICAqIEluIGEgbm9uaW50ZXJsZWF2ZWQgc2NhbiwgYW4gaU1DVSByb3cgaGFzIHZfc2FtcF9mYWN0b3IgTUNVIHJvd3MuCi0gICAqIEJ1dCBhdCB0aGUgYm90dG9tIG9mIHRoZSBpbWFnZSwgcHJvY2VzcyBvbmx5IHdoYXQncyBsZWZ0LgotICAgKi8KLSAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuID4gMSkgewotICAgIGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdyA9IDE7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGNvZWYtPmlNQ1Vfcm93X251bSA8IChjaW5mby0+dG90YWxfaU1DVV9yb3dzLTEpKQotICAgICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPmN1cl9jb21wX2luZm9bMF0tPnZfc2FtcF9mYWN0b3I7Ci0gICAgZWxzZQotICAgICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPmN1cl9jb21wX2luZm9bMF0tPmxhc3Rfcm93X2hlaWdodDsKLSAgfQotCi0gIGNvZWYtPm1jdV9jdHIgPSAwOwotICBjb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSAwOwotfQotCi0KLS8qCi0gKiBJbml0aWFsaXplIGZvciBhIHByb2Nlc3NpbmcgcGFzcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfY29lZiAoal9jb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKQotewotICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKLQotICBpZiAocGFzc19tb2RlICE9IEpCVUZfQ1JBTktfREVTVCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7Ci0KLSAgY29lZi0+aU1DVV9yb3dfbnVtID0gMDsKLSAgc3RhcnRfaU1DVV9yb3coY2luZm8pOwotfQotCi0KLS8qCi0gKiBQcm9jZXNzIHNvbWUgZGF0YS4KLSAqIFdlIHByb2Nlc3MgdGhlIGVxdWl2YWxlbnQgb2Ygb25lIGZ1bGx5IGludGVybGVhdmVkIE1DVSByb3cgKCJpTUNVIiByb3cpCi0gKiBwZXIgY2FsbCwgaWUsIHZfc2FtcF9mYWN0b3IgYmxvY2sgcm93cyBmb3IgZWFjaCBjb21wb25lbnQgaW4gdGhlIHNjYW4uCi0gKiBUaGUgZGF0YSBpcyBvYnRhaW5lZCBmcm9tIHRoZSB2aXJ0dWFsIGFycmF5cyBhbmQgZmVkIHRvIHRoZSBlbnRyb3B5IGNvZGVyLgotICogUmV0dXJucyBUUlVFIGlmIHRoZSBpTUNVIHJvdyBpcyBjb21wbGV0ZWQsIEZBTFNFIGlmIHN1c3BlbmRlZC4KLSAqCi0gKiBOQjogaW5wdXRfYnVmIGlzIGlnbm9yZWQ7IGl0IGlzIGxpa2VseSB0byBiZSBhIE5VTEwgcG9pbnRlci4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLWNvbXByZXNzX291dHB1dCAoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgaW5wdXRfYnVmKQotewotICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKLSAgSkRJTUVOU0lPTiBNQ1VfY29sX251bTsJLyogaW5kZXggb2YgY3VycmVudCBNQ1Ugd2l0aGluIHJvdyAqLwotICBKRElNRU5TSU9OIGxhc3RfTUNVX2NvbCA9IGNpbmZvLT5NQ1VzX3Blcl9yb3cgLSAxOwotICBKRElNRU5TSU9OIGxhc3RfaU1DVV9yb3cgPSBjaW5mby0+dG90YWxfaU1DVV9yb3dzIC0gMTsKLSAgaW50IGJsa24sIGNpLCB4aW5kZXgsIHlpbmRleCwgeW9mZnNldCwgYmxvY2tjbnQ7Ci0gIEpESU1FTlNJT04gc3RhcnRfY29sOwotICBKQkxPQ0tBUlJBWSBidWZmZXJbTUFYX0NPTVBTX0lOX1NDQU5dOwotICBKQkxPQ0tST1cgTUNVX2J1ZmZlcltDX01BWF9CTE9DS1NfSU5fTUNVXTsKLSAgSkJMT0NLUk9XIGJ1ZmZlcl9wdHI7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0KLSAgLyogQWxpZ24gdGhlIHZpcnR1YWwgYnVmZmVycyBmb3IgdGhlIGNvbXBvbmVudHMgdXNlZCBpbiB0aGlzIHNjYW4uICovCi0gIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0gICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLSAgICBidWZmZXJbY2ldID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCi0gICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIGNvZWYtPndob2xlX2ltYWdlW2NvbXBwdHItPmNvbXBvbmVudF9pbmRleF0sCi0gICAgICAgY29lZi0+aU1DVV9yb3dfbnVtICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKLSAgICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgRkFMU0UpOwotICB9Ci0KLSAgLyogTG9vcCB0byBwcm9jZXNzIG9uZSB3aG9sZSBpTUNVIHJvdyAqLwotICBmb3IgKHlvZmZzZXQgPSBjb2VmLT5NQ1VfdmVydF9vZmZzZXQ7IHlvZmZzZXQgPCBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3c7Ci0gICAgICAgeW9mZnNldCsrKSB7Ci0gICAgZm9yIChNQ1VfY29sX251bSA9IGNvZWYtPm1jdV9jdHI7IE1DVV9jb2xfbnVtIDwgY2luZm8tPk1DVXNfcGVyX3JvdzsKLQkgTUNVX2NvbF9udW0rKykgewotICAgICAgLyogQ29uc3RydWN0IGxpc3Qgb2YgcG9pbnRlcnMgdG8gRENUIGJsb2NrcyBiZWxvbmdpbmcgdG8gdGhpcyBNQ1UgKi8KLSAgICAgIGJsa24gPSAwOwkJCS8qIGluZGV4IG9mIGN1cnJlbnQgRENUIGJsb2NrIHdpdGhpbiBNQ1UgKi8KLSAgICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0JY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLQlzdGFydF9jb2wgPSBNQ1VfY29sX251bSAqIGNvbXBwdHItPk1DVV93aWR0aDsKLQlibG9ja2NudCA9IChNQ1VfY29sX251bSA8IGxhc3RfTUNVX2NvbCkgPyBjb21wcHRyLT5NQ1Vfd2lkdGgKLQkJCQkJCTogY29tcHB0ci0+bGFzdF9jb2xfd2lkdGg7Ci0JZm9yICh5aW5kZXggPSAwOyB5aW5kZXggPCBjb21wcHRyLT5NQ1VfaGVpZ2h0OyB5aW5kZXgrKykgewotCSAgaWYgKGNvZWYtPmlNQ1Vfcm93X251bSA8IGxhc3RfaU1DVV9yb3cgfHwKLQkgICAgICB5aW5kZXgreW9mZnNldCA8IGNvbXBwdHItPmxhc3Rfcm93X2hlaWdodCkgewotCSAgICAvKiBGaWxsIGluIHBvaW50ZXJzIHRvIHJlYWwgYmxvY2tzIGluIHRoaXMgcm93ICovCi0JICAgIGJ1ZmZlcl9wdHIgPSBidWZmZXJbY2ldW3lpbmRleCt5b2Zmc2V0XSArIHN0YXJ0X2NvbDsKLQkgICAgZm9yICh4aW5kZXggPSAwOyB4aW5kZXggPCBibG9ja2NudDsgeGluZGV4KyspCi0JICAgICAgTUNVX2J1ZmZlcltibGtuKytdID0gYnVmZmVyX3B0cisrOwotCSAgfSBlbHNlIHsKLQkgICAgLyogQXQgYm90dG9tIG9mIGltYWdlLCBuZWVkIGEgd2hvbGUgcm93IG9mIGR1bW15IGJsb2NrcyAqLwotCSAgICB4aW5kZXggPSAwOwotCSAgfQotCSAgLyogRmlsbCBpbiBhbnkgZHVtbXkgYmxvY2tzIG5lZWRlZCBpbiB0aGlzIHJvdy4KLQkgICAqIER1bW15IGJsb2NrcyBhcmUgZmlsbGVkIGluIHRoZSBzYW1lIHdheSBhcyBpbiBqY2NvZWZjdC5jOgotCSAgICogYWxsIHplcm9lcyBpbiB0aGUgQUMgZW50cmllcywgREMgZW50cmllcyBlcXVhbCB0byBwcmV2aW91cwotCSAgICogYmxvY2sncyBEQyB2YWx1ZS4gIFRoZSBpbml0IHJvdXRpbmUgaGFzIGFscmVhZHkgemVyb2VkIHRoZQotCSAgICogQUMgZW50cmllcywgc28gd2UgbmVlZCBvbmx5IHNldCB0aGUgREMgZW50cmllcyBjb3JyZWN0bHkuCi0JICAgKi8KLQkgIGZvciAoOyB4aW5kZXggPCBjb21wcHRyLT5NQ1Vfd2lkdGg7IHhpbmRleCsrKSB7Ci0JICAgIE1DVV9idWZmZXJbYmxrbl0gPSBjb2VmLT5kdW1teV9idWZmZXJbYmxrbl07Ci0JICAgIE1DVV9idWZmZXJbYmxrbl1bMF1bMF0gPSBNQ1VfYnVmZmVyW2Jsa24tMV1bMF1bMF07Ci0JICAgIGJsa24rKzsKLQkgIH0KLQl9Ci0gICAgICB9Ci0gICAgICAvKiBUcnkgdG8gd3JpdGUgdGhlIE1DVS4gKi8KLSAgICAgIGlmICghICgqY2luZm8tPmVudHJvcHktPmVuY29kZV9tY3UpIChjaW5mbywgTUNVX2J1ZmZlcikpIHsKLQkvKiBTdXNwZW5zaW9uIGZvcmNlZDsgdXBkYXRlIHN0YXRlIGNvdW50ZXJzIGFuZCBleGl0ICovCi0JY29lZi0+TUNVX3ZlcnRfb2Zmc2V0ID0geW9mZnNldDsKLQljb2VmLT5tY3VfY3RyID0gTUNVX2NvbF9udW07Ci0JcmV0dXJuIEZBTFNFOwotICAgICAgfQotICAgIH0KLSAgICAvKiBDb21wbGV0ZWQgYW4gTUNVIHJvdywgYnV0IHBlcmhhcHMgbm90IGFuIGlNQ1Ugcm93ICovCi0gICAgY29lZi0+bWN1X2N0ciA9IDA7Ci0gIH0KLSAgLyogQ29tcGxldGVkIHRoZSBpTUNVIHJvdywgYWR2YW5jZSBjb3VudGVycyBmb3IgbmV4dCBvbmUgKi8KLSAgY29lZi0+aU1DVV9yb3dfbnVtKys7Ci0gIHN0YXJ0X2lNQ1Vfcm93KGNpbmZvKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgY29lZmZpY2llbnQgYnVmZmVyIGNvbnRyb2xsZXIuCi0gKgotICogRWFjaCBwYXNzZWQgY29lZmZpY2llbnQgYXJyYXkgbXVzdCBiZSB0aGUgcmlnaHQgc2l6ZSBmb3IgdGhhdAotICogY29lZmZpY2llbnQ6IHdpZHRoX2luX2Jsb2NrcyB3aWRlIGFuZCBoZWlnaHRfaW5fYmxvY2tzIGhpZ2gsCi0gKiB3aXRoIHVuaXRoZWlnaHQgYXQgbGVhc3Qgdl9zYW1wX2ZhY3Rvci4KLSAqLwotCi1MT0NBTCh2b2lkKQotdHJhbnNlbmNvZGVfY29lZl9jb250cm9sbGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCSAgICAganZpcnRfYmFycmF5X3B0ciAqIGNvZWZfYXJyYXlzKQotewotICBteV9jb2VmX3B0ciBjb2VmOwotICBKQkxPQ0tST1cgYnVmZmVyOwotICBpbnQgaTsKLQotICBjb2VmID0gKG15X2NvZWZfcHRyKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJU0laRU9GKG15X2NvZWZfY29udHJvbGxlcikpOwotICBjaW5mby0+Y29lZiA9IChzdHJ1Y3QganBlZ19jX2NvZWZfY29udHJvbGxlciAqKSBjb2VmOwotICBjb2VmLT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfY29lZjsKLSAgY29lZi0+cHViLmNvbXByZXNzX2RhdGEgPSBjb21wcmVzc19vdXRwdXQ7Ci0KLSAgLyogU2F2ZSBwb2ludGVyIHRvIHZpcnR1YWwgYXJyYXlzICovCi0gIGNvZWYtPndob2xlX2ltYWdlID0gY29lZl9hcnJheXM7Ci0KLSAgLyogQWxsb2NhdGUgYW5kIHByZS16ZXJvIHNwYWNlIGZvciBkdW1teSBEQ1QgYmxvY2tzLiAqLwotICBidWZmZXIgPSAoSkJMT0NLUk9XKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJQ19NQVhfQkxPQ0tTX0lOX01DVSAqIFNJWkVPRihKQkxPQ0spKTsKLSAganplcm9fZmFyKCh2b2lkIEZBUiAqKSBidWZmZXIsIENfTUFYX0JMT0NLU19JTl9NQ1UgKiBTSVpFT0YoSkJMT0NLKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBDX01BWF9CTE9DS1NfSU5fTUNVOyBpKyspIHsKLSAgICBjb2VmLT5kdW1teV9idWZmZXJbaV0gPSBidWZmZXIgKyBpOwotICB9Ci19Ci0KLSNlbmRpZiAvL19GWF9KUEVHX1RVUkJPXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamRhcGltaW4uYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkYXBpbWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYzUyY2QuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamRhcGltaW4uYworKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0jaWYgIWRlZmluZWQoX0ZYX0pQRUdfVFVSQk9fKQotLyoKLSAqIGpkYXBpbWluLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgY29kZSBmb3IgdGhlIGRlY29tcHJlc3Npb24gaGFsZgotICogb2YgdGhlIEpQRUcgbGlicmFyeS4gIFRoZXNlIGFyZSB0aGUgIm1pbmltdW0iIEFQSSByb3V0aW5lcyB0aGF0IG1heSBiZQotICogbmVlZGVkIGluIGVpdGhlciB0aGUgbm9ybWFsIGZ1bGwtZGVjb21wcmVzc2lvbiBjYXNlIG9yIHRoZQotICogdHJhbnNjb2Rpbmctb25seSBjYXNlLgotICoKLSAqIE1vc3Qgb2YgdGhlIHJvdXRpbmVzIGludGVuZGVkIHRvIGJlIGNhbGxlZCBkaXJlY3RseSBieSBhbiBhcHBsaWNhdGlvbgotICogYXJlIGluIHRoaXMgZmlsZSBvciBpbiBqZGFwaXN0ZC5jLiAgQnV0IGFsc28gc2VlIGpjb21hcGkuYyBmb3Igcm91dGluZXMKLSAqIHNoYXJlZCBieSBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiwgYW5kIGpkdHJhbnMuYyBmb3IgdGhlIHRyYW5zY29kaW5nCi0gKiBjYXNlLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKgotICogSW5pdGlhbGl6YXRpb24gb2YgYSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0LgotICogVGhlIGVycm9yIG1hbmFnZXIgbXVzdCBhbHJlYWR5IGJlIHNldCB1cCAoaW4gY2FzZSBtZW1vcnkgbWFuYWdlciBmYWlscykuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX0NyZWF0ZURlY29tcHJlc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCB2ZXJzaW9uLCBzaXplX3Qgc3RydWN0c2l6ZSkKLXsKLSAgaW50IGk7Ci0KLSAgLyogR3VhcmQgYWdhaW5zdCB2ZXJzaW9uIG1pc21hdGNoZXMgYmV0d2VlbiBsaWJyYXJ5IGFuZCBjYWxsZXIuICovCi0gIGNpbmZvLT5tZW0gPSBOVUxMOwkJLyogc28ganBlZ19kZXN0cm95IGtub3dzIG1lbSBtZ3Igbm90IGNhbGxlZCAqLwotICBpZiAodmVyc2lvbiAhPSBKUEVHX0xJQl9WRVJTSU9OKQotICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0JBRF9MSUJfVkVSU0lPTiwgSlBFR19MSUJfVkVSU0lPTiwgdmVyc2lvbik7Ci0gIGlmIChzdHJ1Y3RzaXplICE9IFNJWkVPRihzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCkpCi0gICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQkFEX1NUUlVDVF9TSVpFLCAKLQkgICAgIChpbnQpIFNJWkVPRihzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCksIChpbnQpIHN0cnVjdHNpemUpOwotCi0gIC8qIEZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIHdlIHplcm8gdGhlIHdob2xlIG1hc3RlciBzdHJ1Y3R1cmUuCi0gICAqIEJ1dCB0aGUgYXBwbGljYXRpb24gaGFzIGFscmVhZHkgc2V0IHRoZSBlcnIgcG9pbnRlciwgYW5kIG1heSBoYXZlIHNldAotICAgKiBjbGllbnRfZGF0YSwgc28gd2UgaGF2ZSB0byBzYXZlIGFuZCByZXN0b3JlIHRob3NlIGZpZWxkcy4KLSAgICogTm90ZTogaWYgYXBwbGljYXRpb24gaGFzbid0IHNldCBjbGllbnRfZGF0YSwgdG9vbHMgbGlrZSBQdXJpZnkgbWF5Ci0gICAqIGNvbXBsYWluIGhlcmUuCi0gICAqLwotICB7Ci0gICAgc3RydWN0IGpwZWdfZXJyb3JfbWdyICogZXJyID0gY2luZm8tPmVycjsKLSAgICB2b2lkICogY2xpZW50X2RhdGEgPSBjaW5mby0+Y2xpZW50X2RhdGE7IC8qIGlnbm9yZSBQdXJpZnkgY29tcGxhaW50IGhlcmUgKi8KLSAgICBNRU1aRVJPKGNpbmZvLCBTSVpFT0Yoc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QpKTsKLSAgICBjaW5mby0+ZXJyID0gZXJyOwotICAgIGNpbmZvLT5jbGllbnRfZGF0YSA9IGNsaWVudF9kYXRhOwotICB9Ci0gIGNpbmZvLT5pc19kZWNvbXByZXNzb3IgPSBUUlVFOwotCi0gIC8qIEluaXRpYWxpemUgYSBtZW1vcnkgbWFuYWdlciBpbnN0YW5jZSBmb3IgdGhpcyBvYmplY3QgKi8KLSAgamluaXRfbWVtb3J5X21ncigoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0KLSAgLyogWmVybyBvdXQgcG9pbnRlcnMgdG8gcGVybWFuZW50IHN0cnVjdHVyZXMuICovCi0gIGNpbmZvLT5wcm9ncmVzcyA9IE5VTEw7Ci0gIGNpbmZvLT5zcmMgPSBOVUxMOwotCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fUVVBTlRfVEJMUzsgaSsrKQotICAgIGNpbmZvLT5xdWFudF90YmxfcHRyc1tpXSA9IE5VTEw7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgewotICAgIGNpbmZvLT5kY19odWZmX3RibF9wdHJzW2ldID0gTlVMTDsKLSAgICBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1tpXSA9IE5VTEw7Ci0gIH0KLQotICAvKiBJbml0aWFsaXplIG1hcmtlciBwcm9jZXNzb3Igc28gYXBwbGljYXRpb24gY2FuIG92ZXJyaWRlIG1ldGhvZHMKLSAgICogZm9yIENPTSwgQVBQbiBtYXJrZXJzIGJlZm9yZSBjYWxsaW5nIGpwZWdfcmVhZF9oZWFkZXIuCi0gICAqLwotICBjaW5mby0+bWFya2VyX2xpc3QgPSBOVUxMOwotICBqaW5pdF9tYXJrZXJfcmVhZGVyKGNpbmZvKTsKLQotICAvKiBBbmQgaW5pdGlhbGl6ZSB0aGUgb3ZlcmFsbCBpbnB1dCBjb250cm9sbGVyLiAqLwotICBqaW5pdF9pbnB1dF9jb250cm9sbGVyKGNpbmZvKTsKLQotICAvKiBPSywgSSdtIHJlYWR5ICovCi0gIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfU1RBUlQ7Ci19Ci0KLQotLyoKLSAqIERlc3RydWN0aW9uIG9mIGEgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdAotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19kZXN0cm95X2RlY29tcHJlc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGpwZWdfZGVzdHJveSgoal9jb21tb25fcHRyKSBjaW5mbyk7IC8qIHVzZSBjb21tb24gcm91dGluZSAqLwotfQotCi0KLS8qCi0gKiBBYm9ydCBwcm9jZXNzaW5nIG9mIGEgSlBFRyBkZWNvbXByZXNzaW9uIG9wZXJhdGlvbiwKLSAqIGJ1dCBkb24ndCBkZXN0cm95IHRoZSBvYmplY3QgaXRzZWxmLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19hYm9ydF9kZWNvbXByZXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBqcGVnX2Fib3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsgLyogdXNlIGNvbW1vbiByb3V0aW5lICovCi19Ci0KLQotLyoKLSAqIFNldCBkZWZhdWx0IGRlY29tcHJlc3Npb24gcGFyYW1ldGVycy4KLSAqLwotCi1MT0NBTCh2b2lkKQotZGVmYXVsdF9kZWNvbXByZXNzX3Bhcm1zIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICAvKiBHdWVzcyB0aGUgaW5wdXQgY29sb3JzcGFjZSwgYW5kIHNldCBvdXRwdXQgY29sb3JzcGFjZSBhY2NvcmRpbmdseS4gKi8KLSAgLyogKFdpc2ggSlBFRyBjb21taXR0ZWUgaGFkIHByb3ZpZGVkIGEgcmVhbCB3YXkgdG8gc3BlY2lmeSB0aGlzLi4uKSAqLwotICAvKiBOb3RlIGFwcGxpY2F0aW9uIG1heSBvdmVycmlkZSBvdXIgZ3Vlc3Nlcy4gKi8KLSAgc3dpdGNoIChjaW5mby0+bnVtX2NvbXBvbmVudHMpIHsKLSAgY2FzZSAxOgotICAgIGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX0dSQVlTQ0FMRTsKLSAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlID0gSkNTX0dSQVlTQ0FMRTsKLSAgICBicmVhazsKLSAgICAKLSAgY2FzZSAzOgotICAgIGlmIChjaW5mby0+c2F3X0pGSUZfbWFya2VyKSB7Ci0gICAgICBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19ZQ2JDcjsgLyogSkZJRiBpbXBsaWVzIFlDYkNyICovCi0gICAgfSBlbHNlIGlmIChjaW5mby0+c2F3X0Fkb2JlX21hcmtlcikgewotICAgICAgc3dpdGNoIChjaW5mby0+QWRvYmVfdHJhbnNmb3JtKSB7Ci0gICAgICBjYXNlIDA6Ci0JY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOwotCWJyZWFrOwotICAgICAgY2FzZSAxOgotCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlXQVJOTVMxKGNpbmZvLCBKV1JOX0FET0JFX1hGT1JNLCBjaW5mby0+QWRvYmVfdHJhbnNmb3JtKTsKLQljaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19ZQ2JDcjsgLyogYXNzdW1lIGl0J3MgWUNiQ3IgKi8KLQlicmVhazsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLyogU2F3IG5vIHNwZWNpYWwgbWFya2VycywgdHJ5IHRvIGd1ZXNzIGZyb20gdGhlIGNvbXBvbmVudCBJRHMgKi8KLSAgICAgIGludCBjaWQwID0gY2luZm8tPmNvbXBfaW5mb1swXS5jb21wb25lbnRfaWQ7Ci0gICAgICBpbnQgY2lkMSA9IGNpbmZvLT5jb21wX2luZm9bMV0uY29tcG9uZW50X2lkOwotICAgICAgaW50IGNpZDIgPSBjaW5mby0+Y29tcF9pbmZvWzJdLmNvbXBvbmVudF9pZDsKLQotICAgICAgaWYgKGNpZDAgPT0gMSAmJiBjaWQxID09IDIgJiYgY2lkMiA9PSAzKQotCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOyAvKiBhc3N1bWUgSkZJRiB3L291dCBtYXJrZXIgKi8KLSAgICAgIGVsc2UgaWYgKGNpZDAgPT0gODIgJiYgY2lkMSA9PSA3MSAmJiBjaWQyID09IDY2KQotCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1JHQjsgLyogQVNDSUkgJ1InLCAnRycsICdCJyAqLwotICAgICAgZWxzZSB7Ci0JVFJBQ0VNUzMoY2luZm8sIDEsIEpUUkNfVU5LTk9XTl9JRFMsIGNpZDAsIGNpZDEsIGNpZDIpOwotCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOyAvKiBhc3N1bWUgaXQncyBZQ2JDciAqLwotICAgICAgfQotICAgIH0KLSAgICAvKiBBbHdheXMgZ3Vlc3MgUkdCIGlzIHByb3BlciBvdXRwdXQgY29sb3JzcGFjZS4gKi8KLSAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlID0gSkNTX1JHQjsKLSAgICBicmVhazsKLSAgICAKLSAgY2FzZSA0OgotICAgIGlmIChjaW5mby0+c2F3X0Fkb2JlX21hcmtlcikgewotICAgICAgc3dpdGNoIChjaW5mby0+QWRvYmVfdHJhbnNmb3JtKSB7Ci0gICAgICBjYXNlIDA6Ci0JY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfQ01ZSzsKLQlicmVhazsKLSAgICAgIGNhc2UgMjoKLQljaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19ZQ0NLOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlXQVJOTVMxKGNpbmZvLCBKV1JOX0FET0JFX1hGT1JNLCBjaW5mby0+QWRvYmVfdHJhbnNmb3JtKTsKLQljaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19ZQ0NLOyAvKiBhc3N1bWUgaXQncyBZQ0NLICovCi0JYnJlYWs7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIE5vIHNwZWNpYWwgbWFya2VycywgYXNzdW1lIHN0cmFpZ2h0IENNWUsuICovCi0gICAgICBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19DTVlLOwotICAgIH0KLSAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlID0gSkNTX0NNWUs7Ci0gICAgYnJlYWs7Ci0gICAgCi0gIGRlZmF1bHQ6Ci0gICAgY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfVU5LTk9XTjsKLSAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlID0gSkNTX1VOS05PV047Ci0gICAgYnJlYWs7Ci0gIH0KLQotICAvKiBTZXQgZGVmYXVsdHMgZm9yIG90aGVyIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycy4gKi8KLSAgY2luZm8tPnNjYWxlX251bSA9IDE7CQkvKiAxOjEgc2NhbGluZyAqLwotICBjaW5mby0+c2NhbGVfZGVub20gPSAxOwotICBjaW5mby0+b3V0cHV0X2dhbW1hID0gMS4wOwotICBjaW5mby0+YnVmZmVyZWRfaW1hZ2UgPSBGQUxTRTsKLSAgY2luZm8tPnJhd19kYXRhX291dCA9IEZBTFNFOwotICBjaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfREVGQVVMVDsKLSAgY2luZm8tPmRvX2ZhbmN5X3Vwc2FtcGxpbmcgPSBUUlVFOwotICBjaW5mby0+ZG9fYmxvY2tfc21vb3RoaW5nID0gVFJVRTsKLSAgY2luZm8tPnF1YW50aXplX2NvbG9ycyA9IEZBTFNFOwotICAvKiBXZSBzZXQgdGhlc2UgaW4gY2FzZSBhcHBsaWNhdGlvbiBvbmx5IHNldHMgcXVhbnRpemVfY29sb3JzLiAqLwotICBjaW5mby0+ZGl0aGVyX21vZGUgPSBKRElUSEVSX0ZTOwotI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAotICBjaW5mby0+dHdvX3Bhc3NfcXVhbnRpemUgPSBUUlVFOwotI2Vsc2UKLSAgY2luZm8tPnR3b19wYXNzX3F1YW50aXplID0gRkFMU0U7Ci0jZW5kaWYKLSAgY2luZm8tPmRlc2lyZWRfbnVtYmVyX29mX2NvbG9ycyA9IDI1NjsKLSAgY2luZm8tPmNvbG9ybWFwID0gTlVMTDsKLSAgLyogSW5pdGlhbGl6ZSBmb3Igbm8gbW9kZSBjaGFuZ2UgaW4gYnVmZmVyZWQtaW1hZ2UgbW9kZS4gKi8KLSAgY2luZm8tPmVuYWJsZV8xcGFzc19xdWFudCA9IEZBTFNFOwotICBjaW5mby0+ZW5hYmxlX2V4dGVybmFsX3F1YW50ID0gRkFMU0U7Ci0gIGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQgPSBGQUxTRTsKLX0KLQotCi0vKgotICogRGVjb21wcmVzc2lvbiBzdGFydHVwOiByZWFkIHN0YXJ0IG9mIEpQRUcgZGF0YXN0cmVhbSB0byBzZWUgd2hhdCdzIHRoZXJlLgotICogTmVlZCBvbmx5IGluaXRpYWxpemUgSlBFRyBvYmplY3QgYW5kIHN1cHBseSBhIGRhdGEgc291cmNlIGJlZm9yZSBjYWxsaW5nLgotICoKLSAqIFRoaXMgcm91dGluZSB3aWxsIHJlYWQgYXMgZmFyIGFzIHRoZSBmaXJzdCBTT1MgbWFya2VyIChpZSwgYWN0dWFsIHN0YXJ0IG9mCi0gKiBjb21wcmVzc2VkIGRhdGEpLCBhbmQgd2lsbCBzYXZlIGFsbCB0YWJsZXMgYW5kIHBhcmFtZXRlcnMgaW4gdGhlIEpQRUcKLSAqIG9iamVjdC4gIEl0IHdpbGwgYWxzbyBpbml0aWFsaXplIHRoZSBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgdG8gZGVmYXVsdAotICogdmFsdWVzLCBhbmQgZmluYWxseSByZXR1cm4gSlBFR19IRUFERVJfT0suICBPbiByZXR1cm4sIHRoZSBhcHBsaWNhdGlvbiBtYXkKLSAqIGFkanVzdCB0aGUgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGFuZCB0aGVuIGNhbGwganBlZ19zdGFydF9kZWNvbXByZXNzLgotICogKE9yLCBpZiB0aGUgYXBwbGljYXRpb24gb25seSB3YW50ZWQgdG8gZGV0ZXJtaW5lIHRoZSBpbWFnZSBwYXJhbWV0ZXJzLAotICogdGhlIGRhdGEgbmVlZCBub3QgYmUgZGVjb21wcmVzc2VkLiAgSW4gdGhhdCBjYXNlLCBjYWxsIGpwZWdfYWJvcnQgb3IKLSAqIGpwZWdfZGVzdHJveSB0byByZWxlYXNlIGFueSB0ZW1wb3Jhcnkgc3BhY2UuKQotICogSWYgYW4gYWJicmV2aWF0ZWQgKHRhYmxlcyBvbmx5KSBkYXRhc3RyZWFtIGlzIHByZXNlbnRlZCwgdGhlIHJvdXRpbmUgd2lsbAotICogcmV0dXJuIEpQRUdfSEVBREVSX1RBQkxFU19PTkxZIHVwb24gcmVhY2hpbmcgRU9JLiAgVGhlIGFwcGxpY2F0aW9uIG1heSB0aGVuCi0gKiByZS11c2UgdGhlIEpQRUcgb2JqZWN0IHRvIHJlYWQgdGhlIGFiYnJldmlhdGVkIGltYWdlIGRhdGFzdHJlYW0ocykuCi0gKiBJdCBpcyB1bm5lY2Vzc2FyeSAoYnV0IE9LKSB0byBjYWxsIGpwZWdfYWJvcnQgaW4gdGhpcyBjYXNlLgotICogVGhlIEpQRUdfU1VTUEVOREVEIHJldHVybiBjb2RlIG9ubHkgb2NjdXJzIGlmIHRoZSBkYXRhIHNvdXJjZSBtb2R1bGUKLSAqIHJlcXVlc3RzIHN1c3BlbnNpb24gb2YgdGhlIGRlY29tcHJlc3Nvci4gIEluIHRoaXMgY2FzZSB0aGUgYXBwbGljYXRpb24KLSAqIHNob3VsZCBsb2FkIG1vcmUgc291cmNlIGRhdGEgYW5kIHRoZW4gcmUtY2FsbCBqcGVnX3JlYWRfaGVhZGVyIHRvIHJlc3VtZQotICogcHJvY2Vzc2luZy4KLSAqIElmIGEgbm9uLXN1c3BlbmRpbmcgZGF0YSBzb3VyY2UgaXMgdXNlZCBhbmQgcmVxdWlyZV9pbWFnZSBpcyBUUlVFLCB0aGVuIHRoZQotICogcmV0dXJuIGNvZGUgbmVlZCBub3QgYmUgaW5zcGVjdGVkIHNpbmNlIG9ubHkgSlBFR19IRUFERVJfT0sgaXMgcG9zc2libGUuCi0gKgotICogVGhpcyByb3V0aW5lIGlzIG5vdyBqdXN0IGEgZnJvbnQgZW5kIHRvIGpwZWdfY29uc3VtZV9pbnB1dCwgd2l0aCBzb21lCi0gKiBleHRyYSBlcnJvciBjaGVja2luZy4KLSAqLwotCi1HTE9CQUwoaW50KQotanBlZ19yZWFkX2hlYWRlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiByZXF1aXJlX2ltYWdlKQotewotICBpbnQgcmV0Y29kZTsKLQotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfU1RBUlQgJiYKLSAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX0lOSEVBREVSKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0KLSAgcmV0Y29kZSA9IGpwZWdfY29uc3VtZV9pbnB1dChjaW5mbyk7Ci0KLSAgc3dpdGNoIChyZXRjb2RlKSB7Ci0gIGNhc2UgSlBFR19SRUFDSEVEX1NPUzoKLSAgICByZXRjb2RlID0gSlBFR19IRUFERVJfT0s7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSlBFR19SRUFDSEVEX0VPSToKLSAgICBpZiAocmVxdWlyZV9pbWFnZSkJCS8qIENvbXBsYWluIGlmIGFwcGxpY2F0aW9uIHdhbnRlZCBhbiBpbWFnZSAqLwotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT19JTUFHRSk7Ci0gICAgLyogUmVzZXQgdG8gc3RhcnQgc3RhdGU7IGl0IHdvdWxkIGJlIHNhZmVyIHRvIHJlcXVpcmUgdGhlIGFwcGxpY2F0aW9uIHRvCi0gICAgICogY2FsbCBqcGVnX2Fib3J0LCBidXQgd2UgY2FuJ3QgY2hhbmdlIGl0IG5vdyBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLgotICAgICAqIEEgc2lkZSBlZmZlY3QgaXMgdG8gZnJlZSBhbnkgdGVtcG9yYXJ5IG1lbW9yeSAodGhlcmUgc2hvdWxkbid0IGJlIGFueSkuCi0gICAgICovCi0gICAganBlZ19hYm9ydCgoal9jb21tb25fcHRyKSBjaW5mbyk7IC8qIHNldHMgc3RhdGUgPSBEU1RBVEVfU1RBUlQgKi8KLSAgICByZXRjb2RlID0gSlBFR19IRUFERVJfVEFCTEVTX09OTFk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSlBFR19TVVNQRU5ERUQ6Ci0gICAgLyogbm8gd29yayAqLwotICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIHJldGNvZGU7Ci19Ci0KLQotLyoKLSAqIENvbnN1bWUgZGF0YSBpbiBhZHZhbmNlIG9mIHdoYXQgdGhlIGRlY29tcHJlc3NvciByZXF1aXJlcy4KLSAqIFRoaXMgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZSBvbmNlIHRoZSBkZWNvbXByZXNzb3Igb2JqZWN0IGhhcwotICogYmVlbiBjcmVhdGVkIGFuZCBhIGRhdGEgc291cmNlIGhhcyBiZWVuIHNldCB1cC4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgaXMgZXNzZW50aWFsbHkgYSBzdGF0ZSBtYWNoaW5lIHRoYXQgaGFuZGxlcyBhIGNvdXBsZQotICogb2YgY3JpdGljYWwgc3RhdGUtdHJhbnNpdGlvbiBhY3Rpb25zLCBuYW1lbHkgaW5pdGlhbCBzZXR1cCBhbmQKLSAqIHRyYW5zaXRpb24gZnJvbSBoZWFkZXIgc2Nhbm5pbmcgdG8gcmVhZHktZm9yLXN0YXJ0X2RlY29tcHJlc3MuCi0gKiBBbGwgdGhlIGFjdHVhbCBpbnB1dCBpcyBkb25lIHZpYSB0aGUgaW5wdXQgY29udHJvbGxlcidzIGNvbnN1bWVfaW5wdXQKLSAqIG1ldGhvZC4KLSAqLwotCi1HTE9CQUwoaW50KQotanBlZ19jb25zdW1lX2lucHV0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBpbnQgcmV0Y29kZSA9IEpQRUdfU1VTUEVOREVEOwotCi0gIC8qIE5COiBldmVyeSBwb3NzaWJsZSBEU1RBVEUgdmFsdWUgc2hvdWxkIGJlIGxpc3RlZCBpbiB0aGlzIHN3aXRjaCAqLwotICBzd2l0Y2ggKGNpbmZvLT5nbG9iYWxfc3RhdGUpIHsKLSAgY2FzZSBEU1RBVEVfU1RBUlQ6Ci0gICAgLyogU3RhcnQtb2YtZGF0YXN0cmVhbSBhY3Rpb25zOiByZXNldCBhcHByb3ByaWF0ZSBtb2R1bGVzICovCi0gICAgKCpjaW5mby0+aW5wdXRjdGwtPnJlc2V0X2lucHV0X2NvbnRyb2xsZXIpIChjaW5mbyk7Ci0gICAgLyogSW5pdGlhbGl6ZSBhcHBsaWNhdGlvbidzIGRhdGEgc291cmNlIG1vZHVsZSAqLwotICAgICgqY2luZm8tPnNyYy0+aW5pdF9zb3VyY2UpIChjaW5mbyk7Ci0gICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9JTkhFQURFUjsKLSAgICAvKkZBTExUSFJPVUdIKi8KLSAgY2FzZSBEU1RBVEVfSU5IRUFERVI6Ci0gICAgcmV0Y29kZSA9ICgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KSAoY2luZm8pOwotICAgIGlmIChyZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9TT1MpIHsgLyogRm91bmQgU09TLCBwcmVwYXJlIHRvIGRlY29tcHJlc3MgKi8KLSAgICAgIC8qIFNldCB1cCBkZWZhdWx0IHBhcmFtZXRlcnMgYmFzZWQgb24gaGVhZGVyIGRhdGEgKi8KLSAgICAgIGRlZmF1bHRfZGVjb21wcmVzc19wYXJtcyhjaW5mbyk7Ci0gICAgICAvKiBTZXQgZ2xvYmFsIHN0YXRlOiByZWFkeSBmb3Igc3RhcnRfZGVjb21wcmVzcyAqLwotICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9SRUFEWTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRFNUQVRFX1JFQURZOgotICAgIC8qIENhbid0IGFkdmFuY2UgcGFzdCBmaXJzdCBTT1MgdW50aWwgc3RhcnRfZGVjb21wcmVzcyBpcyBjYWxsZWQgKi8KLSAgICByZXRjb2RlID0gSlBFR19SRUFDSEVEX1NPUzsKLSAgICBicmVhazsKLSAgY2FzZSBEU1RBVEVfUFJFTE9BRDoKLSAgY2FzZSBEU1RBVEVfUFJFU0NBTjoKLSAgY2FzZSBEU1RBVEVfU0NBTk5JTkc6Ci0gIGNhc2UgRFNUQVRFX1JBV19PSzoKLSAgY2FzZSBEU1RBVEVfQlVGSU1BR0U6Ci0gIGNhc2UgRFNUQVRFX0JVRlBPU1Q6Ci0gIGNhc2UgRFNUQVRFX1NUT1BQSU5HOgotICAgIHJldGNvZGUgPSAoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkgKGNpbmZvKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotICB9Ci0gIHJldHVybiByZXRjb2RlOwotfQotCi0KLS8qCi0gKiBIYXZlIHdlIGZpbmlzaGVkIHJlYWRpbmcgdGhlIGlucHV0IGZpbGU/Ci0gKi8KLQotR0xPQkFMKGJvb2xlYW4pCi1qcGVnX2lucHV0X2NvbXBsZXRlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICAvKiBDaGVjayBmb3IgdmFsaWQganBlZyBvYmplY3QgKi8KLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPCBEU1RBVEVfU1RBUlQgfHwKLSAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPiBEU1RBVEVfU1RPUFBJTkcpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLSAgcmV0dXJuIGNpbmZvLT5pbnB1dGN0bC0+ZW9pX3JlYWNoZWQ7Ci19Ci0KLQotLyoKLSAqIElzIHRoZXJlIG1vcmUgdGhhbiBvbmUgc2Nhbj8KLSAqLwotCi1HTE9CQUwoYm9vbGVhbikKLWpwZWdfaGFzX211bHRpcGxlX3NjYW5zIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICAvKiBPbmx5IHZhbGlkIGFmdGVyIGpwZWdfcmVhZF9oZWFkZXIgY29tcGxldGVzICovCi0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlIDwgRFNUQVRFX1JFQURZIHx8Ci0gICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID4gRFNUQVRFX1NUT1BQSU5HKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0gIHJldHVybiBjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FuczsKLX0KLQotCi0vKgotICogRmluaXNoIEpQRUcgZGVjb21wcmVzc2lvbi4KLSAqCi0gKiBUaGlzIHdpbGwgbm9ybWFsbHkganVzdCB2ZXJpZnkgdGhlIGZpbGUgdHJhaWxlciBhbmQgcmVsZWFzZSB0ZW1wIHN0b3JhZ2UuCi0gKgotICogUmV0dXJucyBGQUxTRSBpZiBzdXNwZW5kZWQuICBUaGUgcmV0dXJuIHZhbHVlIG5lZWQgYmUgaW5zcGVjdGVkIG9ubHkgaWYKLSAqIGEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBpcyB1c2VkLgotICovCi0KLUdMT0JBTChib29sZWFuKQotanBlZ19maW5pc2hfZGVjb21wcmVzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaWYgKChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9TQ0FOTklORyB8fAotICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1JBV19PSykgJiYgISBjaW5mby0+YnVmZmVyZWRfaW1hZ2UpIHsKLSAgICAvKiBUZXJtaW5hdGUgZmluYWwgcGFzcyBvZiBub24tYnVmZmVyZWQgbW9kZSAqLwotICAgIGlmIChjaW5mby0+b3V0cHV0X3NjYW5saW5lIDwgY2luZm8tPm91dHB1dF9oZWlnaHQpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RPT19MSVRUTEVfREFUQSk7Ci0gICAgKCpjaW5mby0+bWFzdGVyLT5maW5pc2hfb3V0cHV0X3Bhc3MpIChjaW5mbyk7Ci0gICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9TVE9QUElORzsKLSAgfSBlbHNlIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9CVUZJTUFHRSkgewotICAgIC8qIEZpbmlzaGluZyBhZnRlciBhIGJ1ZmZlcmVkLWltYWdlIG9wZXJhdGlvbiAqLwotICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfU1RPUFBJTkc7Ci0gIH0gZWxzZSBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfU1RPUFBJTkcpIHsKLSAgICAvKiBTVE9QUElORyA9IHJlcGVhdCBjYWxsIGFmdGVyIGEgc3VzcGVuc2lvbiwgYW55dGhpbmcgZWxzZSBpcyBlcnJvciAqLwotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0gIH0KLSAgLyogUmVhZCB1bnRpbCBFT0kgKi8KLSAgd2hpbGUgKCEgY2luZm8tPmlucHV0Y3RsLT5lb2lfcmVhY2hlZCkgewotICAgIGlmICgoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkgKGNpbmZvKSA9PSBKUEVHX1NVU1BFTkRFRCkKLSAgICAgIHJldHVybiBGQUxTRTsJCS8qIFN1c3BlbmQsIGNvbWUgYmFjayBsYXRlciAqLwotICB9Ci0gIC8qIERvIGZpbmFsIGNsZWFudXAgKi8KLSAgKCpjaW5mby0+c3JjLT50ZXJtX3NvdXJjZSkgKGNpbmZvKTsKLSAgLyogV2UgY2FuIHVzZSBqcGVnX2Fib3J0IHRvIHJlbGVhc2UgbWVtb3J5IGFuZCByZXNldCBnbG9iYWxfc3RhdGUgKi8KLSAganBlZ19hYm9ydCgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gIHJldHVybiBUUlVFOwotfQotCi0jZW5kaWYgLy9fRlhfSlBFR19UVVJCT18KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkYXBpc3RkLmMgYi9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZGFwaXN0ZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzMxZjc2Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkYXBpc3RkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotI2lmICFkZWZpbmVkKF9GWF9KUEVHX1RVUkJPXykKLS8qCi0gKiBqZGFwaXN0ZC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgYXBwbGljYXRpb24gaW50ZXJmYWNlIGNvZGUgZm9yIHRoZSBkZWNvbXByZXNzaW9uIGhhbGYKLSAqIG9mIHRoZSBKUEVHIGxpYnJhcnkuICBUaGVzZSBhcmUgdGhlICJzdGFuZGFyZCIgQVBJIHJvdXRpbmVzIHRoYXQgYXJlCi0gKiB1c2VkIGluIHRoZSBub3JtYWwgZnVsbC1kZWNvbXByZXNzaW9uIGNhc2UuICBUaGV5IGFyZSBub3QgdXNlZCBieSBhCi0gKiB0cmFuc2NvZGluZy1vbmx5IGFwcGxpY2F0aW9uLiAgTm90ZSB0aGF0IGlmIGFuIGFwcGxpY2F0aW9uIGxpbmtzIGluCi0gKiBqcGVnX3N0YXJ0X2RlY29tcHJlc3MsIGl0IHdpbGwgZW5kIHVwIGxpbmtpbmcgaW4gdGhlIGVudGlyZSBkZWNvbXByZXNzb3IuCi0gKiBXZSB0aHVzIG11c3Qgc2VwYXJhdGUgdGhpcyBmaWxlIGZyb20gamRhcGltaW4uYyB0byBhdm9pZCBsaW5raW5nIHRoZQotICogd2hvbGUgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IGludG8gYSB0cmFuc2NvZGVyLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotTE9DQUwoYm9vbGVhbikgb3V0cHV0X3Bhc3Nfc2V0dXAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLQotLyoKLSAqIERlY29tcHJlc3Npb24gaW5pdGlhbGl6YXRpb24uCi0gKiBqcGVnX3JlYWRfaGVhZGVyIG11c3QgYmUgY29tcGxldGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMuCi0gKgotICogSWYgYSBtdWx0aXBhc3Mgb3BlcmF0aW5nIG1vZGUgd2FzIHNlbGVjdGVkLCB0aGlzIHdpbGwgZG8gYWxsIGJ1dCB0aGUKLSAqIGxhc3QgcGFzcywgYW5kIHRodXMgbWF5IHRha2UgYSBncmVhdCBkZWFsIG9mIHRpbWUuCi0gKgotICogUmV0dXJucyBGQUxTRSBpZiBzdXNwZW5kZWQuICBUaGUgcmV0dXJuIHZhbHVlIG5lZWQgYmUgaW5zcGVjdGVkIG9ubHkgaWYKLSAqIGEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBpcyB1c2VkLgotICovCi0KLUdMT0JBTChib29sZWFuKQotanBlZ19zdGFydF9kZWNvbXByZXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfUkVBRFkpIHsKLSAgICAvKiBGaXJzdCBjYWxsOiBpbml0aWFsaXplIG1hc3RlciBjb250cm9sLCBzZWxlY3QgYWN0aXZlIG1vZHVsZXMgKi8KLSAgICBqaW5pdF9tYXN0ZXJfZGVjb21wcmVzcyhjaW5mbyk7Ci0gICAgaWYgKGNpbmZvLT5idWZmZXJlZF9pbWFnZSkgewotICAgICAgLyogTm8gbW9yZSB3b3JrIGhlcmU7IGV4cGVjdGluZyBqcGVnX3N0YXJ0X291dHB1dCBuZXh0ICovCi0gICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX0JVRklNQUdFOwotICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfUFJFTE9BRDsKLSAgfQotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfUFJFTE9BRCkgewotICAgIC8qIElmIGZpbGUgaGFzIG11bHRpcGxlIHNjYW5zLCBhYnNvcmIgdGhlbSBhbGwgaW50byB0aGUgY29lZiBidWZmZXIgKi8KLSAgICBpZiAoY2luZm8tPmlucHV0Y3RsLT5oYXNfbXVsdGlwbGVfc2NhbnMpIHsKLSNpZmRlZiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLSAgICAgIGZvciAoOzspIHsKLQlpbnQgcmV0Y29kZTsKLQkvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCi0JaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKQotCSAgKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0JLyogQWJzb3JiIHNvbWUgbW9yZSBpbnB1dCAqLwotCXJldGNvZGUgPSAoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkgKGNpbmZvKTsKLQlpZiAocmV0Y29kZSA9PSBKUEVHX1NVU1BFTkRFRCkKLQkgIHJldHVybiBGQUxTRTsKLQlpZiAocmV0Y29kZSA9PSBKUEVHX1JFQUNIRURfRU9JKQotCSAgYnJlYWs7Ci0JLyogQWR2YW5jZSBwcm9ncmVzcyBjb3VudGVyIGlmIGFwcHJvcHJpYXRlICovCi0JaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMICYmCi0JICAgIChyZXRjb2RlID09IEpQRUdfUk9XX0NPTVBMRVRFRCB8fCByZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9TT1MpKSB7Ci0JICBpZiAoKytjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfY291bnRlciA+PSBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQpIHsKLQkgICAgLyogamRtYXN0ZXIgdW5kZXJlc3RpbWF0ZWQgbnVtYmVyIG9mIHNjYW5zOyByYXRjaGV0IHVwIG9uZSBzY2FuICovCi0JICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCArPSAobG9uZykgY2luZm8tPnRvdGFsX2lNQ1Vfcm93czsKLQkgIH0KLQl9Ci0gICAgICB9Ci0jZWxzZQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOwotI2VuZGlmIC8qIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAqLwotICAgIH0KLSAgICBjaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyID0gY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyOwotICB9IGVsc2UgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX1BSRVNDQU4pCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLSAgLyogUGVyZm9ybSBhbnkgZHVtbXkgb3V0cHV0IHBhc3NlcywgYW5kIHNldCB1cCBmb3IgdGhlIGZpbmFsIHBhc3MgKi8KLSAgcmV0dXJuIG91dHB1dF9wYXNzX3NldHVwKGNpbmZvKTsKLX0KLQotCi0vKgotICogU2V0IHVwIGZvciBhbiBvdXRwdXQgcGFzcywgYW5kIHBlcmZvcm0gYW55IGR1bW15IHBhc3MoZXMpIG5lZWRlZC4KLSAqIENvbW1vbiBzdWJyb3V0aW5lIGZvciBqcGVnX3N0YXJ0X2RlY29tcHJlc3MgYW5kIGpwZWdfc3RhcnRfb3V0cHV0LgotICogRW50cnk6IGdsb2JhbF9zdGF0ZSA9IERTVEFURV9QUkVTQ0FOIG9ubHkgaWYgcHJldmlvdXNseSBzdXNwZW5kZWQuCi0gKiBFeGl0OiBJZiBkb25lLCByZXR1cm5zIFRSVUUgYW5kIHNldHMgZ2xvYmFsX3N0YXRlIGZvciBwcm9wZXIgb3V0cHV0IG1vZGUuCi0gKiAgICAgICBJZiBzdXNwZW5kZWQsIHJldHVybnMgRkFMU0UgYW5kIHNldHMgZ2xvYmFsX3N0YXRlID0gRFNUQVRFX1BSRVNDQU4uCi0gKi8KLQotTE9DQUwoYm9vbGVhbikKLW91dHB1dF9wYXNzX3NldHVwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfUFJFU0NBTikgewotICAgIC8qIEZpcnN0IGNhbGw6IGRvIHBhc3Mgc2V0dXAgKi8KLSAgICAoKmNpbmZvLT5tYXN0ZXItPnByZXBhcmVfZm9yX291dHB1dF9wYXNzKSAoY2luZm8pOwotICAgIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPSAwOwotICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfUFJFU0NBTjsKLSAgfQotICAvKiBMb29wIG92ZXIgYW55IHJlcXVpcmVkIGR1bW15IHBhc3NlcyAqLwotICB3aGlsZSAoY2luZm8tPm1hc3Rlci0+aXNfZHVtbXlfcGFzcykgewotI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAotICAgIC8qIENyYW5rIHRocm91Z2ggdGhlIGR1bW15IHBhc3MgKi8KLSAgICB3aGlsZSAoY2luZm8tPm91dHB1dF9zY2FubGluZSA8IGNpbmZvLT5vdXRwdXRfaGVpZ2h0KSB7Ci0gICAgICBKRElNRU5TSU9OIGxhc3Rfc2NhbmxpbmU7Ci0gICAgICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCi0gICAgICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpIHsKLQljaW5mby0+cHJvZ3Jlc3MtPnBhc3NfY291bnRlciA9IChsb25nKSBjaW5mby0+b3V0cHV0X3NjYW5saW5lOwotCWNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+b3V0cHV0X2hlaWdodDsKLQkoKmNpbmZvLT5wcm9ncmVzcy0+cHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgICAgIH0KLSAgICAgIC8qIFByb2Nlc3Mgc29tZSBkYXRhICovCi0gICAgICBsYXN0X3NjYW5saW5lID0gY2luZm8tPm91dHB1dF9zY2FubGluZTsKLSAgICAgICgqY2luZm8tPm1haW4tPnByb2Nlc3NfZGF0YSkgKGNpbmZvLCAoSlNBTVBBUlJBWSkgTlVMTCwKLQkJCQkgICAgJmNpbmZvLT5vdXRwdXRfc2NhbmxpbmUsIChKRElNRU5TSU9OKSAwKTsKLSAgICAgIGlmIChjaW5mby0+b3V0cHV0X3NjYW5saW5lID09IGxhc3Rfc2NhbmxpbmUpCi0JcmV0dXJuIEZBTFNFOwkJLyogTm8gcHJvZ3Jlc3MgbWFkZSwgbXVzdCBzdXNwZW5kICovCi0gICAgfQotICAgIC8qIEZpbmlzaCB1cCBkdW1teSBwYXNzLCBhbmQgc2V0IHVwIGZvciBhbm90aGVyIG9uZSAqLwotICAgICgqY2luZm8tPm1hc3Rlci0+ZmluaXNoX291dHB1dF9wYXNzKSAoY2luZm8pOwotICAgICgqY2luZm8tPm1hc3Rlci0+cHJlcGFyZV9mb3Jfb3V0cHV0X3Bhc3MpIChjaW5mbyk7Ci0gICAgY2luZm8tPm91dHB1dF9zY2FubGluZSA9IDA7Ci0jZWxzZQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZiAvKiBRVUFOVF8yUEFTU19TVVBQT1JURUQgKi8KLSAgfQotICAvKiBSZWFkeSBmb3IgYXBwbGljYXRpb24gdG8gZHJpdmUgb3V0cHV0IHBhc3MgdGhyb3VnaAotICAgKiBqcGVnX3JlYWRfc2NhbmxpbmVzIG9yIGpwZWdfcmVhZF9yYXdfZGF0YS4KLSAgICovCi0gIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBjaW5mby0+cmF3X2RhdGFfb3V0ID8gRFNUQVRFX1JBV19PSyA6IERTVEFURV9TQ0FOTklORzsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIFJlYWQgc29tZSBzY2FubGluZXMgb2YgZGF0YSBmcm9tIHRoZSBKUEVHIGRlY29tcHJlc3Nvci4KLSAqCi0gKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdGhlIG51bWJlciBvZiBsaW5lcyBhY3R1YWxseSByZWFkLgotICogVGhpcyBtYXkgYmUgbGVzcyB0aGFuIHRoZSBudW1iZXIgcmVxdWVzdGVkIGluIHNldmVyYWwgY2FzZXMsCi0gKiBpbmNsdWRpbmcgYm90dG9tIG9mIGltYWdlLCBkYXRhIHNvdXJjZSBzdXNwZW5zaW9uLCBhbmQgb3BlcmF0aW5nCi0gKiBtb2RlcyB0aGF0IGVtaXQgbXVsdGlwbGUgc2NhbmxpbmVzIGF0IGEgdGltZS4KLSAqCi0gKiBOb3RlOiB3ZSB3YXJuIGFib3V0IGV4Y2VzcyBjYWxscyB0byBqcGVnX3JlYWRfc2NhbmxpbmVzKCkgc2luY2UKLSAqIHRoaXMgbGlrZWx5IHNpZ25hbHMgYW4gYXBwbGljYXRpb24gcHJvZ3JhbW1lciBlcnJvci4gIEhvd2V2ZXIsCi0gKiBhbiBvdmVyc2l6ZSBidWZmZXIgKG1heF9saW5lcyA+IHNjYW5saW5lcyByZW1haW5pbmcpIGlzIG5vdCBhbiBlcnJvci4KLSAqLwotCi1HTE9CQUwoSkRJTUVOU0lPTikKLWpwZWdfcmVhZF9zY2FubGluZXMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgc2NhbmxpbmVzLAotCQkgICAgIEpESU1FTlNJT04gbWF4X2xpbmVzKQotewotICBKRElNRU5TSU9OIHJvd19jdHI7Ci0KLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX1NDQU5OSU5HKQotCSAgcmV0dXJuIDA7IC8qIFhZUSAyMDEwLTYtMjc6IGRvbid0IHRocm93IGV4Y2VwdGlvbiBoZXJlICovCi0vKiAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOyAqLwotICBpZiAoY2luZm8tPm91dHB1dF9zY2FubGluZSA+PSBjaW5mby0+b3V0cHV0X2hlaWdodCkgewotICAgIFdBUk5NUyhjaW5mbywgSldSTl9UT09fTVVDSF9EQVRBKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KLSAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7Ci0gICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAobG9uZykgY2luZm8tPm91dHB1dF9zY2FubGluZTsKLSAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPm91dHB1dF9oZWlnaHQ7Ci0gICAgKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gIH0KLQotICAvKiBQcm9jZXNzIHNvbWUgZGF0YSAqLwotICByb3dfY3RyID0gMDsKLSAgKCpjaW5mby0+bWFpbi0+cHJvY2Vzc19kYXRhKSAoY2luZm8sIHNjYW5saW5lcywgJnJvd19jdHIsIG1heF9saW5lcyk7Ci0gIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgKz0gcm93X2N0cjsKLSAgcmV0dXJuIHJvd19jdHI7Ci19Ci0KLQotLyoKLSAqIEFsdGVybmF0ZSBlbnRyeSBwb2ludCB0byByZWFkIHJhdyBkYXRhLgotICogUHJvY2Vzc2VzIGV4YWN0bHkgb25lIGlNQ1Ugcm93IHBlciBjYWxsLCB1bmxlc3Mgc3VzcGVuZGVkLgotICovCi0KLUdMT0JBTChKRElNRU5TSU9OKQotanBlZ19yZWFkX3Jhd19kYXRhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGRhdGEsCi0JCSAgICBKRElNRU5TSU9OIG1heF9saW5lcykKLXsKLSAgSkRJTUVOU0lPTiBsaW5lc19wZXJfaU1DVV9yb3c7Ci0KLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX1JBV19PSykKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotICBpZiAoY2luZm8tPm91dHB1dF9zY2FubGluZSA+PSBjaW5mby0+b3V0cHV0X2hlaWdodCkgewotICAgIFdBUk5NUyhjaW5mbywgSldSTl9UT09fTVVDSF9EQVRBKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KLSAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7Ci0gICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAobG9uZykgY2luZm8tPm91dHB1dF9zY2FubGluZTsKLSAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPm91dHB1dF9oZWlnaHQ7Ci0gICAgKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gIH0KLQotICAvKiBWZXJpZnkgdGhhdCBhdCBsZWFzdCBvbmUgaU1DVSByb3cgY2FuIGJlIHJldHVybmVkLiAqLwotICBsaW5lc19wZXJfaU1DVV9yb3cgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKLSAgaWYgKG1heF9saW5lcyA8IGxpbmVzX3Blcl9pTUNVX3JvdykKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JVRkZFUl9TSVpFKTsKLQotICAvKiBEZWNvbXByZXNzIGRpcmVjdGx5IGludG8gdXNlcidzIGJ1ZmZlci4gKi8KLSAgaWYgKCEgKCpjaW5mby0+Y29lZi0+ZGVjb21wcmVzc19kYXRhKSAoY2luZm8sIGRhdGEpKQotICAgIHJldHVybiAwOwkJCS8qIHN1c3BlbnNpb24gZm9yY2VkLCBjYW4gZG8gbm90aGluZyBtb3JlICovCi0KLSAgLyogT0ssIHdlIHByb2Nlc3NlZCBvbmUgaU1DVSByb3cuICovCi0gIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgKz0gbGluZXNfcGVyX2lNQ1Vfcm93OwotICByZXR1cm4gbGluZXNfcGVyX2lNQ1Vfcm93OwotfQotCi0KLS8qIEFkZGl0aW9uYWwgZW50cnkgcG9pbnRzIGZvciBidWZmZXJlZC1pbWFnZSBtb2RlLiAqLwotCi0jaWZkZWYgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi0KLS8qCi0gKiBJbml0aWFsaXplIGZvciBhbiBvdXRwdXQgcGFzcyBpbiBidWZmZXJlZC1pbWFnZSBtb2RlLgotICovCi0KLUdMT0JBTChib29sZWFuKQotanBlZ19zdGFydF9vdXRwdXQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBzY2FuX251bWJlcikKLXsKLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX0JVRklNQUdFICYmCi0gICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9QUkVTQ0FOKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0gIC8qIExpbWl0IHNjYW4gbnVtYmVyIHRvIHZhbGlkIHJhbmdlICovCi0gIGlmIChzY2FuX251bWJlciA8PSAwKQotICAgIHNjYW5fbnVtYmVyID0gMTsKLSAgaWYgKGNpbmZvLT5pbnB1dGN0bC0+ZW9pX3JlYWNoZWQgJiYKLSAgICAgIHNjYW5fbnVtYmVyID4gY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyKQotICAgIHNjYW5fbnVtYmVyID0gY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyOwotICBjaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyID0gc2Nhbl9udW1iZXI7Ci0gIC8qIFBlcmZvcm0gYW55IGR1bW15IG91dHB1dCBwYXNzZXMsIGFuZCBzZXQgdXAgZm9yIHRoZSByZWFsIHBhc3MgKi8KLSAgcmV0dXJuIG91dHB1dF9wYXNzX3NldHVwKGNpbmZvKTsKLX0KLQotCi0vKgotICogRmluaXNoIHVwIGFmdGVyIGFuIG91dHB1dCBwYXNzIGluIGJ1ZmZlcmVkLWltYWdlIG1vZGUuCi0gKgotICogUmV0dXJucyBGQUxTRSBpZiBzdXNwZW5kZWQuICBUaGUgcmV0dXJuIHZhbHVlIG5lZWQgYmUgaW5zcGVjdGVkIG9ubHkgaWYKLSAqIGEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBpcyB1c2VkLgotICovCi0KLUdMT0JBTChib29sZWFuKQotanBlZ19maW5pc2hfb3V0cHV0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBpZiAoKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1NDQU5OSU5HIHx8Ci0gICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfUkFXX09LKSAmJiBjaW5mby0+YnVmZmVyZWRfaW1hZ2UpIHsKLSAgICAvKiBUZXJtaW5hdGUgdGhpcyBwYXNzLiAqLwotICAgIC8qIFdlIGRvIG5vdCByZXF1aXJlIHRoZSB3aG9sZSBwYXNzIHRvIGhhdmUgYmVlbiBjb21wbGV0ZWQuICovCi0gICAgKCpjaW5mby0+bWFzdGVyLT5maW5pc2hfb3V0cHV0X3Bhc3MpIChjaW5mbyk7Ci0gICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9CVUZQT1NUOwotICB9IGVsc2UgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX0JVRlBPU1QpIHsKLSAgICAvKiBCVUZQT1NUID0gcmVwZWF0IGNhbGwgYWZ0ZXIgYSBzdXNwZW5zaW9uLCBhbnl0aGluZyBlbHNlIGlzIGVycm9yICovCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLSAgfQotICAvKiBSZWFkIG1hcmtlcnMgbG9va2luZyBmb3IgU09TIG9yIEVPSSAqLwotICB3aGlsZSAoY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyIDw9IGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgJiYKLQkgISBjaW5mby0+aW5wdXRjdGwtPmVvaV9yZWFjaGVkKSB7Ci0gICAgaWYgKCgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KSAoY2luZm8pID09IEpQRUdfU1VTUEVOREVEKQotICAgICAgcmV0dXJuIEZBTFNFOwkJLyogU3VzcGVuZCwgY29tZSBiYWNrIGxhdGVyICovCi0gIH0KLSAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9CVUZJTUFHRTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLSNlbmRpZiAvKiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQgKi8KLQotI2VuZGlmIC8vX0ZYX0pQRUdfVFVSQk9fCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZGNvZWZjdC5jIGIvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamRjb2VmY3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk5ODMzYS4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZGNvZWZjdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzM5ICswLDAgQEAKLSNpZiAhZGVmaW5lZChfRlhfSlBFR19UVVJCT18pCi0vKgotICogamRjb2VmY3QuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCBidWZmZXIgY29udHJvbGxlciBmb3IgZGVjb21wcmVzc2lvbi4KLSAqIFRoaXMgY29udHJvbGxlciBpcyB0aGUgdG9wIGxldmVsIG9mIHRoZSBKUEVHIGRlY29tcHJlc3NvciBwcm9wZXIuCi0gKiBUaGUgY29lZmZpY2llbnQgYnVmZmVyIGxpZXMgYmV0d2VlbiBlbnRyb3B5IGRlY29kaW5nIGFuZCBpbnZlcnNlLURDVCBzdGVwcy4KLSAqCi0gKiBJbiBidWZmZXJlZC1pbWFnZSBtb2RlLCB0aGlzIGNvbnRyb2xsZXIgaXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuCi0gKiBpbnB1dC1vcmllbnRlZCBwcm9jZXNzaW5nIGFuZCBvdXRwdXQtb3JpZW50ZWQgcHJvY2Vzc2luZy4KLSAqIEFsc28sIHRoZSBpbnB1dCBzaWRlIChvbmx5KSBpcyB1c2VkIHdoZW4gcmVhZGluZyBhIGZpbGUgZm9yIHRyYW5zY29kaW5nLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotLyogQmxvY2sgc21vb3RoaW5nIGlzIG9ubHkgYXBwbGljYWJsZSBmb3IgcHJvZ3Jlc3NpdmUgSlBFRywgc286ICovCi0jaWZuZGVmIERfUFJPR1JFU1NJVkVfU1VQUE9SVEVECi0jdW5kZWYgQkxPQ0tfU01PT1RISU5HX1NVUFBPUlRFRAotI2VuZGlmCi0KLS8qIFByaXZhdGUgYnVmZmVyIGNvbnRyb2xsZXIgb2JqZWN0ICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGpwZWdfZF9jb2VmX2NvbnRyb2xsZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgLyogVGhlc2UgdmFyaWFibGVzIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gb2YgdGhlIGlucHV0IHNpZGUuICovCi0gIC8qIGNpbmZvLT5pbnB1dF9pTUNVX3JvdyBpcyBhbHNvIHVzZWQgZm9yIHRoaXMuICovCi0gIEpESU1FTlNJT04gTUNVX2N0cjsJCS8qIGNvdW50cyBNQ1VzIHByb2Nlc3NlZCBpbiBjdXJyZW50IHJvdyAqLwotICBpbnQgTUNVX3ZlcnRfb2Zmc2V0OwkJLyogY291bnRzIE1DVSByb3dzIHdpdGhpbiBpTUNVIHJvdyAqLwotICBpbnQgTUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OwkvKiBudW1iZXIgb2Ygc3VjaCByb3dzIG5lZWRlZCAqLwotCi0gIC8qIFRoZSBvdXRwdXQgc2lkZSdzIGxvY2F0aW9uIGlzIHJlcHJlc2VudGVkIGJ5IGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cuICovCi0KLSAgLyogSW4gc2luZ2xlLXBhc3MgbW9kZXMsIGl0J3Mgc3VmZmljaWVudCB0byBidWZmZXIganVzdCBvbmUgTUNVLgotICAgKiBXZSBhbGxvY2F0ZSBhIHdvcmtzcGFjZSBvZiBEX01BWF9CTE9DS1NfSU5fTUNVIGNvZWZmaWNpZW50IGJsb2NrcywKLSAgICogYW5kIGxldCB0aGUgZW50cm9weSBkZWNvZGVyIHdyaXRlIGludG8gdGhhdCB3b3Jrc3BhY2UgZWFjaCB0aW1lLgotICAgKiAoT24gODB4ODYsIHRoZSB3b3Jrc3BhY2UgaXMgRkFSIGV2ZW4gdGhvdWdoIGl0J3Mgbm90IHJlYWxseSB2ZXJ5IGJpZzsKLSAgICogdGhpcyBpcyB0byBrZWVwIHRoZSBtb2R1bGUgaW50ZXJmYWNlcyB1bmNoYW5nZWQgd2hlbiBhIGxhcmdlIGNvZWZmaWNpZW50Ci0gICAqIGJ1ZmZlciBpcyBuZWNlc3NhcnkuKQotICAgKiBJbiBtdWx0aS1wYXNzIG1vZGVzLCB0aGlzIGFycmF5IHBvaW50cyB0byB0aGUgY3VycmVudCBNQ1UncyBibG9ja3MKLSAgICogd2l0aGluIHRoZSB2aXJ0dWFsIGFycmF5czsgaXQgaXMgdXNlZCBvbmx5IGJ5IHRoZSBpbnB1dCBzaWRlLgotICAgKi8KLSAgSkJMT0NLUk9XIE1DVV9idWZmZXJbRF9NQVhfQkxPQ0tTX0lOX01DVV07Ci0KLSNpZmRlZiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLSAgLyogSW4gbXVsdGktcGFzcyBtb2Rlcywgd2UgbmVlZCBhIHZpcnR1YWwgYmxvY2sgYXJyYXkgZm9yIGVhY2ggY29tcG9uZW50LiAqLwotICBqdmlydF9iYXJyYXlfcHRyIHdob2xlX2ltYWdlW01BWF9DT01QT05FTlRTXTsKLSNlbmRpZgotCi0jaWZkZWYgQkxPQ0tfU01PT1RISU5HX1NVUFBPUlRFRAotICAvKiBXaGVuIGRvaW5nIGJsb2NrIHNtb290aGluZywgd2UgbGF0Y2ggY29lZmZpY2llbnQgQWwgdmFsdWVzIGhlcmUgKi8KLSAgaW50ICogY29lZl9iaXRzX2xhdGNoOwotI2RlZmluZSBTQVZFRF9DT0VGUyAgNgkJLyogd2Ugc2F2ZSBjb2VmX2JpdHNbMC4uNV0gKi8KLSNlbmRpZgotfSBteV9jb2VmX2NvbnRyb2xsZXI7Ci0KLXR5cGVkZWYgbXlfY29lZl9jb250cm9sbGVyICogbXlfY29lZl9wdHI7Ci0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCi1NRVRIT0RERUYoaW50KSBkZWNvbXByZXNzX29uZXBhc3MKLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZikpOwotI2lmZGVmIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAotTUVUSE9EREVGKGludCkgZGVjb21wcmVzc19kYXRhCi0JSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIG91dHB1dF9idWYpKTsKLSNlbmRpZgotI2lmZGVmIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQKLUxPQ0FMKGJvb2xlYW4pIHNtb290aGluZ19vayBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLU1FVEhPRERFRihpbnQpIGRlY29tcHJlc3Nfc21vb3RoX2RhdGEKLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZikpOwotI2VuZGlmCi0KLQotTE9DQUwodm9pZCkKLXN0YXJ0X2lNQ1Vfcm93IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogUmVzZXQgd2l0aGluLWlNQ1Utcm93IGNvdW50ZXJzIGZvciBhIG5ldyByb3cgKGlucHV0IHNpZGUpICovCi17Ci0gIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOwotCi0gIC8qIEluIGFuIGludGVybGVhdmVkIHNjYW4sIGFuIE1DVSByb3cgaXMgdGhlIHNhbWUgYXMgYW4gaU1DVSByb3cuCi0gICAqIEluIGEgbm9uaW50ZXJsZWF2ZWQgc2NhbiwgYW4gaU1DVSByb3cgaGFzIHZfc2FtcF9mYWN0b3IgTUNVIHJvd3MuCi0gICAqIEJ1dCBhdCB0aGUgYm90dG9tIG9mIHRoZSBpbWFnZSwgcHJvY2VzcyBvbmx5IHdoYXQncyBsZWZ0LgotICAgKi8KLSAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuID4gMSkgewotICAgIGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdyA9IDE7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA8IChjaW5mby0+dG90YWxfaU1DVV9yb3dzLTEpKQotICAgICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPmN1cl9jb21wX2luZm9bMF0tPnZfc2FtcF9mYWN0b3I7Ci0gICAgZWxzZQotICAgICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPmN1cl9jb21wX2luZm9bMF0tPmxhc3Rfcm93X2hlaWdodDsKLSAgfQotCi0gIGNvZWYtPk1DVV9jdHIgPSAwOwotICBjb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSAwOwotfQotCi0KLS8qCi0gKiBJbml0aWFsaXplIGZvciBhbiBpbnB1dCBwcm9jZXNzaW5nIHBhc3MuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9pbnB1dF9wYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBjaW5mby0+aW5wdXRfaU1DVV9yb3cgPSAwOwotICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7Ci19Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIGFuIG91dHB1dCBwcm9jZXNzaW5nIHBhc3MuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9vdXRwdXRfcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSNpZmRlZiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVECi0gIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOwotCi0gIC8qIElmIG11bHRpcGFzcywgY2hlY2sgdG8gc2VlIHdoZXRoZXIgdG8gdXNlIGJsb2NrIHNtb290aGluZyBvbiB0aGlzIHBhc3MgKi8KLSAgaWYgKGNvZWYtPnB1Yi5jb2VmX2FycmF5cyAhPSBOVUxMKSB7Ci0gICAgaWYgKGNpbmZvLT5kb19ibG9ja19zbW9vdGhpbmcgJiYgc21vb3RoaW5nX29rKGNpbmZvKSkKLSAgICAgIGNvZWYtPnB1Yi5kZWNvbXByZXNzX2RhdGEgPSBkZWNvbXByZXNzX3Ntb290aF9kYXRhOwotICAgIGVsc2UKLSAgICAgIGNvZWYtPnB1Yi5kZWNvbXByZXNzX2RhdGEgPSBkZWNvbXByZXNzX2RhdGE7Ci0gIH0KLSNlbmRpZgotICBjaW5mby0+b3V0cHV0X2lNQ1Vfcm93ID0gMDsKLX0KLQotCi0vKgotICogRGVjb21wcmVzcyBhbmQgcmV0dXJuIHNvbWUgZGF0YSBpbiB0aGUgc2luZ2xlLXBhc3MgY2FzZS4KLSAqIEFsd2F5cyBhdHRlbXB0cyB0byBlbWl0IG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93ICgiaU1DVSIgcm93KS4KLSAqIElucHV0IGFuZCBvdXRwdXQgbXVzdCBydW4gaW4gbG9ja3N0ZXAgc2luY2Ugd2UgaGF2ZSBvbmx5IGEgb25lLU1DVSBidWZmZXIuCi0gKiBSZXR1cm4gdmFsdWUgaXMgSlBFR19ST1dfQ09NUExFVEVELCBKUEVHX1NDQU5fQ09NUExFVEVELCBvciBKUEVHX1NVU1BFTkRFRC4KLSAqCi0gKiBOQjogb3V0cHV0X2J1ZiBjb250YWlucyBhIHBsYW5lIGZvciBlYWNoIGNvbXBvbmVudCBpbiBpbWFnZSwKLSAqIHdoaWNoIHdlIGluZGV4IGFjY29yZGluZyB0byB0aGUgY29tcG9uZW50J3MgU09GIHBvc2l0aW9uLgotICovCi0KLU1FVEhPRERFRihpbnQpCi1kZWNvbXByZXNzX29uZXBhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZikKLXsKLSAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7Ci0gIEpESU1FTlNJT04gTUNVX2NvbF9udW07CS8qIGluZGV4IG9mIGN1cnJlbnQgTUNVIHdpdGhpbiByb3cgKi8KLSAgSkRJTUVOU0lPTiBsYXN0X01DVV9jb2wgPSBjaW5mby0+TUNVc19wZXJfcm93IC0gMTsKLSAgSkRJTUVOU0lPTiBsYXN0X2lNQ1Vfcm93ID0gY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyAtIDE7Ci0gIGludCBibGtuLCBjaSwgeGluZGV4LCB5aW5kZXgsIHlvZmZzZXQsIHVzZWZ1bF93aWR0aDsKLSAgSlNBTVBBUlJBWSBvdXRwdXRfcHRyOwotICBKRElNRU5TSU9OIHN0YXJ0X2NvbCwgb3V0cHV0X2NvbDsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgaW52ZXJzZV9EQ1RfbWV0aG9kX3B0ciBpbnZlcnNlX0RDVDsKLQotICAvKiBMb29wIHRvIHByb2Nlc3MgYXMgbXVjaCBhcyBvbmUgd2hvbGUgaU1DVSByb3cgKi8KLSAgZm9yICh5b2Zmc2V0ID0gY29lZi0+TUNVX3ZlcnRfb2Zmc2V0OyB5b2Zmc2V0IDwgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OwotICAgICAgIHlvZmZzZXQrKykgewotICAgIGZvciAoTUNVX2NvbF9udW0gPSBjb2VmLT5NQ1VfY3RyOyBNQ1VfY29sX251bSA8PSBsYXN0X01DVV9jb2w7Ci0JIE1DVV9jb2xfbnVtKyspIHsKLSAgICAgIC8qIFRyeSB0byBmZXRjaCBhbiBNQ1UuICBFbnRyb3B5IGRlY29kZXIgZXhwZWN0cyBidWZmZXIgdG8gYmUgemVyb2VkLiAqLwotICAgICAganplcm9fZmFyKCh2b2lkIEZBUiAqKSBjb2VmLT5NQ1VfYnVmZmVyWzBdLAotCQkoc2l6ZV90KSAoY2luZm8tPmJsb2Nrc19pbl9NQ1UgKiBTSVpFT0YoSkJMT0NLKSkpOwotICAgICAgaWYgKCEgKCpjaW5mby0+ZW50cm9weS0+ZGVjb2RlX21jdSkgKGNpbmZvLCBjb2VmLT5NQ1VfYnVmZmVyKSkgewotCS8qIFN1c3BlbnNpb24gZm9yY2VkOyB1cGRhdGUgc3RhdGUgY291bnRlcnMgYW5kIGV4aXQgKi8KLQljb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSB5b2Zmc2V0OwotCWNvZWYtPk1DVV9jdHIgPSBNQ1VfY29sX251bTsKLQlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gICAgICB9Ci0gICAgICAvKiBEZXRlcm1pbmUgd2hlcmUgZGF0YSBzaG91bGQgZ28gaW4gb3V0cHV0X2J1ZiBhbmQgZG8gdGhlIElEQ1QgdGhpbmcuCi0gICAgICAgKiBXZSBza2lwIGR1bW15IGJsb2NrcyBhdCB0aGUgcmlnaHQgYW5kIGJvdHRvbSBlZGdlcyAoYnV0IGJsa24gZ2V0cwotICAgICAgICogaW5jcmVtZW50ZWQgcGFzdCB0aGVtISkuICBOb3RlIHRoZSBpbm5lciBsb29wIHJlbGllcyBvbiBoYXZpbmcKLSAgICAgICAqIGFsbG9jYXRlZCB0aGUgTUNVX2J1ZmZlcltdIGJsb2NrcyBzZXF1ZW50aWFsbHkuCi0gICAgICAgKi8KLSAgICAgIGJsa24gPSAwOwkJCS8qIGluZGV4IG9mIGN1cnJlbnQgRENUIGJsb2NrIHdpdGhpbiBNQ1UgKi8KLSAgICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0JY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLQkvKiBEb24ndCBib3RoZXIgdG8gSURDVCBhbiB1bmludGVyZXN0aW5nIGNvbXBvbmVudC4gKi8KLQlpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKSB7Ci0JICBibGtuICs9IGNvbXBwdHItPk1DVV9ibG9ja3M7Ci0JICBjb250aW51ZTsKLQl9Ci0JaW52ZXJzZV9EQ1QgPSBjaW5mby0+aWRjdC0+aW52ZXJzZV9EQ1RbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XTsKLQl1c2VmdWxfd2lkdGggPSAoTUNVX2NvbF9udW0gPCBsYXN0X01DVV9jb2wpID8gY29tcHB0ci0+TUNVX3dpZHRoCi0JCQkJCQkgICAgOiBjb21wcHRyLT5sYXN0X2NvbF93aWR0aDsKLQlvdXRwdXRfcHRyID0gb3V0cHV0X2J1Zltjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdICsKLQkgIHlvZmZzZXQgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7Ci0Jc3RhcnRfY29sID0gTUNVX2NvbF9udW0gKiBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoOwotCWZvciAoeWluZGV4ID0gMDsgeWluZGV4IDwgY29tcHB0ci0+TUNVX2hlaWdodDsgeWluZGV4KyspIHsKLQkgIGlmIChjaW5mby0+aW5wdXRfaU1DVV9yb3cgPCBsYXN0X2lNQ1Vfcm93IHx8Ci0JICAgICAgeW9mZnNldCt5aW5kZXggPCBjb21wcHRyLT5sYXN0X3Jvd19oZWlnaHQpIHsKLQkgICAgb3V0cHV0X2NvbCA9IHN0YXJ0X2NvbDsKLQkgICAgZm9yICh4aW5kZXggPSAwOyB4aW5kZXggPCB1c2VmdWxfd2lkdGg7IHhpbmRleCsrKSB7Ci0JICAgICAgKCppbnZlcnNlX0RDVCkgKGNpbmZvLCBjb21wcHRyLAotCQkJICAgICAgKEpDT0VGUFRSKSBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24reGluZGV4XSwKLQkJCSAgICAgIG91dHB1dF9wdHIsIG91dHB1dF9jb2wpOwotCSAgICAgIG91dHB1dF9jb2wgKz0gY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOwotCSAgICB9Ci0JICB9Ci0JICBibGtuICs9IGNvbXBwdHItPk1DVV93aWR0aDsKLQkgIG91dHB1dF9wdHIgKz0gY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOwotCX0KLSAgICAgIH0KLSAgICB9Ci0gICAgLyogQ29tcGxldGVkIGFuIE1DVSByb3csIGJ1dCBwZXJoYXBzIG5vdCBhbiBpTUNVIHJvdyAqLwotICAgIGNvZWYtPk1DVV9jdHIgPSAwOwotICB9Ci0gIC8qIENvbXBsZXRlZCB0aGUgaU1DVSByb3csIGFkdmFuY2UgY291bnRlcnMgZm9yIG5leHQgb25lICovCi0gIGNpbmZvLT5vdXRwdXRfaU1DVV9yb3crKzsKLSAgaWYgKCsrKGNpbmZvLT5pbnB1dF9pTUNVX3JvdykgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzKSB7Ci0gICAgc3RhcnRfaU1DVV9yb3coY2luZm8pOwotICAgIHJldHVybiBKUEVHX1JPV19DT01QTEVURUQ7Ci0gIH0KLSAgLyogQ29tcGxldGVkIHRoZSBzY2FuICovCi0gICgqY2luZm8tPmlucHV0Y3RsLT5maW5pc2hfaW5wdXRfcGFzcykgKGNpbmZvKTsKLSAgcmV0dXJuIEpQRUdfU0NBTl9DT01QTEVURUQ7Ci19Ci0KLQotLyoKLSAqIER1bW15IGNvbnN1bWUtaW5wdXQgcm91dGluZSBmb3Igc2luZ2xlLXBhc3Mgb3BlcmF0aW9uLgotICovCi0KLU1FVEhPRERFRihpbnQpCi1kdW1teV9jb25zdW1lX2RhdGEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIHJldHVybiBKUEVHX1NVU1BFTkRFRDsJLyogQWx3YXlzIGluZGljYXRlIG5vdGhpbmcgd2FzIGRvbmUgKi8KLX0KLQotCi0jaWZkZWYgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi0KLS8qCi0gKiBDb25zdW1lIGlucHV0IGRhdGEgYW5kIHN0b3JlIGl0IGluIHRoZSBmdWxsLWltYWdlIGNvZWZmaWNpZW50IGJ1ZmZlci4KLSAqIFdlIHJlYWQgYXMgbXVjaCBhcyBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykgcGVyIGNhbGwsCi0gKiBpZSwgdl9zYW1wX2ZhY3RvciBibG9jayByb3dzIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgc2Nhbi4KLSAqIFJldHVybiB2YWx1ZSBpcyBKUEVHX1JPV19DT01QTEVURUQsIEpQRUdfU0NBTl9DT01QTEVURUQsIG9yIEpQRUdfU1VTUEVOREVELgotICovCi0KLU1FVEhPRERFRihpbnQpCi1jb25zdW1lX2RhdGEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOwotICBKRElNRU5TSU9OIE1DVV9jb2xfbnVtOwkvKiBpbmRleCBvZiBjdXJyZW50IE1DVSB3aXRoaW4gcm93ICovCi0gIGludCBibGtuLCBjaSwgeGluZGV4LCB5aW5kZXgsIHlvZmZzZXQ7Ci0gIEpESU1FTlNJT04gc3RhcnRfY29sOwotICBKQkxPQ0tBUlJBWSBidWZmZXJbTUFYX0NPTVBTX0lOX1NDQU5dOwotICBKQkxPQ0tST1cgYnVmZmVyX3B0cjsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXJzIGZvciB0aGUgY29tcG9uZW50cyB1c2VkIGluIHRoaXMgc2Nhbi4gKi8KLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIGJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XSwKLSAgICAgICBjaW5mby0+aW5wdXRfaU1DVV9yb3cgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAotICAgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBUUlVFKTsKLSAgICAvKiBOb3RlOiBlbnRyb3B5IGRlY29kZXIgZXhwZWN0cyBidWZmZXIgdG8gYmUgemVyb2VkLAotICAgICAqIGJ1dCB0aGlzIGlzIGhhbmRsZWQgYXV0b21hdGljYWxseSBieSB0aGUgbWVtb3J5IG1hbmFnZXIKLSAgICAgKiBiZWNhdXNlIHdlIHJlcXVlc3RlZCBhIHByZS16ZXJvZWQgYXJyYXkuCi0gICAgICovCi0gIH0KLQotICAvKiBMb29wIHRvIHByb2Nlc3Mgb25lIHdob2xlIGlNQ1Ugcm93ICovCi0gIGZvciAoeW9mZnNldCA9IGNvZWYtPk1DVV92ZXJ0X29mZnNldDsgeW9mZnNldCA8IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKLSAgICAgICB5b2Zmc2V0KyspIHsKLSAgICBmb3IgKE1DVV9jb2xfbnVtID0gY29lZi0+TUNVX2N0cjsgTUNVX2NvbF9udW0gPCBjaW5mby0+TUNVc19wZXJfcm93OwotCSBNQ1VfY29sX251bSsrKSB7Ci0gICAgICAvKiBDb25zdHJ1Y3QgbGlzdCBvZiBwb2ludGVycyB0byBEQ1QgYmxvY2tzIGJlbG9uZ2luZyB0byB0aGlzIE1DVSAqLwotICAgICAgYmxrbiA9IDA7CQkJLyogaW5kZXggb2YgY3VycmVudCBEQ1QgYmxvY2sgd2l0aGluIE1DVSAqLwotICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLQljb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotCXN0YXJ0X2NvbCA9IE1DVV9jb2xfbnVtICogY29tcHB0ci0+TUNVX3dpZHRoOwotCWZvciAoeWluZGV4ID0gMDsgeWluZGV4IDwgY29tcHB0ci0+TUNVX2hlaWdodDsgeWluZGV4KyspIHsKLQkgIGJ1ZmZlcl9wdHIgPSBidWZmZXJbY2ldW3lpbmRleCt5b2Zmc2V0XSArIHN0YXJ0X2NvbDsKLQkgIGZvciAoeGluZGV4ID0gMDsgeGluZGV4IDwgY29tcHB0ci0+TUNVX3dpZHRoOyB4aW5kZXgrKykgewotCSAgICBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24rK10gPSBidWZmZXJfcHRyKys7Ci0JICB9Ci0JfQotICAgICAgfQotICAgICAgLyogVHJ5IHRvIGZldGNoIHRoZSBNQ1UuICovCi0gICAgICBpZiAoISAoKmNpbmZvLT5lbnRyb3B5LT5kZWNvZGVfbWN1KSAoY2luZm8sIGNvZWYtPk1DVV9idWZmZXIpKSB7Ci0JLyogU3VzcGVuc2lvbiBmb3JjZWQ7IHVwZGF0ZSBzdGF0ZSBjb3VudGVycyBhbmQgZXhpdCAqLwotCWNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IHlvZmZzZXQ7Ci0JY29lZi0+TUNVX2N0ciA9IE1DVV9jb2xfbnVtOwotCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKLSAgICAgIH0KLSAgICB9Ci0gICAgLyogQ29tcGxldGVkIGFuIE1DVSByb3csIGJ1dCBwZXJoYXBzIG5vdCBhbiBpTUNVIHJvdyAqLwotICAgIGNvZWYtPk1DVV9jdHIgPSAwOwotICB9Ci0gIC8qIENvbXBsZXRlZCB0aGUgaU1DVSByb3csIGFkdmFuY2UgY291bnRlcnMgZm9yIG5leHQgb25lICovCi0gIGlmICgrKyhjaW5mby0+aW5wdXRfaU1DVV9yb3cpIDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cykgewotICAgIHN0YXJ0X2lNQ1Vfcm93KGNpbmZvKTsKLSAgICByZXR1cm4gSlBFR19ST1dfQ09NUExFVEVEOwotICB9Ci0gIC8qIENvbXBsZXRlZCB0aGUgc2NhbiAqLwotICAoKmNpbmZvLT5pbnB1dGN0bC0+ZmluaXNoX2lucHV0X3Bhc3MpIChjaW5mbyk7Ci0gIHJldHVybiBKUEVHX1NDQU5fQ09NUExFVEVEOwotfQotCi0KLS8qCi0gKiBEZWNvbXByZXNzIGFuZCByZXR1cm4gc29tZSBkYXRhIGluIHRoZSBtdWx0aS1wYXNzIGNhc2UuCi0gKiBBbHdheXMgYXR0ZW1wdHMgdG8gZW1pdCBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykuCi0gKiBSZXR1cm4gdmFsdWUgaXMgSlBFR19ST1dfQ09NUExFVEVELCBKUEVHX1NDQU5fQ09NUExFVEVELCBvciBKUEVHX1NVU1BFTkRFRC4KLSAqCi0gKiBOQjogb3V0cHV0X2J1ZiBjb250YWlucyBhIHBsYW5lIGZvciBlYWNoIGNvbXBvbmVudCBpbiBpbWFnZS4KLSAqLwotCi1NRVRIT0RERUYoaW50KQotZGVjb21wcmVzc19kYXRhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIG91dHB1dF9idWYpCi17Ci0gIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOwotICBKRElNRU5TSU9OIGxhc3RfaU1DVV9yb3cgPSBjaW5mby0+dG90YWxfaU1DVV9yb3dzIC0gMTsKLSAgSkRJTUVOU0lPTiBibG9ja19udW07Ci0gIGludCBjaSwgYmxvY2tfcm93LCBibG9ja19yb3dzOwotICBKQkxPQ0tBUlJBWSBidWZmZXI7Ci0gIEpCTE9DS1JPVyBidWZmZXJfcHRyOwotICBKU0FNUEFSUkFZIG91dHB1dF9wdHI7Ci0gIEpESU1FTlNJT04gb3V0cHV0X2NvbDsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgaW52ZXJzZV9EQ1RfbWV0aG9kX3B0ciBpbnZlcnNlX0RDVDsKLQotICAvKiBGb3JjZSBzb21lIGlucHV0IHRvIGJlIGRvbmUgaWYgd2UgYXJlIGdldHRpbmcgYWhlYWQgb2YgdGhlIGlucHV0LiAqLwotICB3aGlsZSAoY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyIDwgY2luZm8tPm91dHB1dF9zY2FuX251bWJlciB8fAotCSAoY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyID09IGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgJiYKLQkgIGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA8PSBjaW5mby0+b3V0cHV0X2lNQ1Vfcm93KSkgewotICAgIGlmICgoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkoY2luZm8pID09IEpQRUdfU1VTUEVOREVEKQotICAgICAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICB9Ci0KLSAgLyogT0ssIG91dHB1dCBmcm9tIHRoZSB2aXJ0dWFsIGFycmF5cy4gKi8KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAvKiBEb24ndCBib3RoZXIgdG8gSURDVCBhbiB1bmludGVyZXN0aW5nIGNvbXBvbmVudC4gKi8KLSAgICBpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKQotICAgICAgY29udGludWU7Ci0gICAgLyogQWxpZ24gdGhlIHZpcnR1YWwgYnVmZmVyIGZvciB0aGlzIGNvbXBvbmVudC4gKi8KLSAgICBidWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY2ldLAotICAgICAgIGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAotICAgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7Ci0gICAgLyogQ291bnQgbm9uLWR1bW15IERDVCBibG9jayByb3dzIGluIHRoaXMgaU1DVSByb3cuICovCi0gICAgaWYgKGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cgPCBsYXN0X2lNQ1Vfcm93KQotICAgICAgYmxvY2tfcm93cyA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7Ci0gICAgZWxzZSB7Ci0gICAgICAvKiBOQjogY2FuJ3QgdXNlIGxhc3Rfcm93X2hlaWdodCBoZXJlOyBpdCBpcyBpbnB1dC1zaWRlLWRlcGVuZGVudCEgKi8KLSAgICAgIGJsb2NrX3Jvd3MgPSAoaW50KSAoY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyAlIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOwotICAgICAgaWYgKGJsb2NrX3Jvd3MgPT0gMCkgYmxvY2tfcm93cyA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7Ci0gICAgfQotICAgIGludmVyc2VfRENUID0gY2luZm8tPmlkY3QtPmludmVyc2VfRENUW2NpXTsKLSAgICBvdXRwdXRfcHRyID0gb3V0cHV0X2J1ZltjaV07Ci0gICAgLyogTG9vcCBvdmVyIGFsbCBEQ1QgYmxvY2tzIHRvIGJlIHByb2Nlc3NlZC4gKi8KLSAgICBmb3IgKGJsb2NrX3JvdyA9IDA7IGJsb2NrX3JvdyA8IGJsb2NrX3Jvd3M7IGJsb2NrX3JvdysrKSB7Ci0gICAgICBidWZmZXJfcHRyID0gYnVmZmVyW2Jsb2NrX3Jvd107Ci0gICAgICBvdXRwdXRfY29sID0gMDsKLSAgICAgIGZvciAoYmxvY2tfbnVtID0gMDsgYmxvY2tfbnVtIDwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOyBibG9ja19udW0rKykgewotCSgqaW52ZXJzZV9EQ1QpIChjaW5mbywgY29tcHB0ciwgKEpDT0VGUFRSKSBidWZmZXJfcHRyLAotCQkJb3V0cHV0X3B0ciwgb3V0cHV0X2NvbCk7Ci0JYnVmZmVyX3B0cisrOwotCW91dHB1dF9jb2wgKz0gY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOwotICAgICAgfQotICAgICAgb3V0cHV0X3B0ciArPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCsrKGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cpIDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cykKLSAgICByZXR1cm4gSlBFR19ST1dfQ09NUExFVEVEOwotICByZXR1cm4gSlBFR19TQ0FOX0NPTVBMRVRFRDsKLX0KLQotI2VuZGlmIC8qIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAqLwotCi0KLSNpZmRlZiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVECi0KLS8qCi0gKiBUaGlzIGNvZGUgYXBwbGllcyBpbnRlcmJsb2NrIHNtb290aGluZyBhcyBkZXNjcmliZWQgYnkgc2VjdGlvbiBLLjgKLSAqIG9mIHRoZSBKUEVHIHN0YW5kYXJkOiB0aGUgZmlyc3QgNSBBQyBjb2VmZmljaWVudHMgYXJlIGVzdGltYXRlZCBmcm9tCi0gKiB0aGUgREMgdmFsdWVzIG9mIGEgRENUIGJsb2NrIGFuZCBpdHMgOCBuZWlnaGJvcmluZyBibG9ja3MuCi0gKiBXZSBhcHBseSBzbW9vdGhpbmcgb25seSBmb3IgcHJvZ3Jlc3NpdmUgSlBFRyBkZWNvZGluZywgYW5kIG9ubHkgaWYKLSAqIHRoZSBjb2VmZmljaWVudHMgaXQgY2FuIGVzdGltYXRlIGFyZSBub3QgeWV0IGtub3duIHRvIGZ1bGwgcHJlY2lzaW9uLgotICovCi0KLS8qIE5hdHVyYWwtb3JkZXIgYXJyYXkgcG9zaXRpb25zIG9mIHRoZSBmaXJzdCA1IHppZ3phZy1vcmRlciBjb2VmZmljaWVudHMgKi8KLSNkZWZpbmUgUTAxX1BPUyAgMQotI2RlZmluZSBRMTBfUE9TICA4Ci0jZGVmaW5lIFEyMF9QT1MgIDE2Ci0jZGVmaW5lIFExMV9QT1MgIDkKLSNkZWZpbmUgUTAyX1BPUyAgMgotCi0vKgotICogRGV0ZXJtaW5lIHdoZXRoZXIgYmxvY2sgc21vb3RoaW5nIGlzIGFwcGxpY2FibGUgYW5kIHNhZmUuCi0gKiBXZSBhbHNvIGxhdGNoIHRoZSBjdXJyZW50IHN0YXRlcyBvZiB0aGUgY29lZl9iaXRzW10gZW50cmllcyBmb3IgdGhlCi0gKiBBQyBjb2VmZmljaWVudHM7IG90aGVyd2lzZSwgaWYgdGhlIGlucHV0IHNpZGUgb2YgdGhlIGRlY29tcHJlc3NvcgotICogYWR2YW5jZXMgaW50byBhIG5ldyBzY2FuLCB3ZSBtaWdodCB0aGluayB0aGUgY29lZmZpY2llbnRzIGFyZSBrbm93bgotICogbW9yZSBhY2N1cmF0ZWx5IHRoYW4gdGhleSByZWFsbHkgYXJlLgotICovCi0KLUxPQ0FMKGJvb2xlYW4pCi1zbW9vdGhpbmdfb2sgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOwotICBib29sZWFuIHNtb290aGluZ191c2VmdWwgPSBGQUxTRTsKLSAgaW50IGNpLCBjb2VmaTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgSlFVQU5UX1RCTCAqIHF0YWJsZTsKLSAgaW50ICogY29lZl9iaXRzOwotICBpbnQgKiBjb2VmX2JpdHNfbGF0Y2g7Ci0KLSAgaWYgKCEgY2luZm8tPnByb2dyZXNzaXZlX21vZGUgfHwgY2luZm8tPmNvZWZfYml0cyA9PSBOVUxMKQotICAgIHJldHVybiBGQUxTRTsKLQotICAvKiBBbGxvY2F0ZSBsYXRjaCBhcmVhIGlmIG5vdCBhbHJlYWR5IGRvbmUgKi8KLSAgaWYgKGNvZWYtPmNvZWZfYml0c19sYXRjaCA9PSBOVUxMKQotICAgIGNvZWYtPmNvZWZfYml0c19sYXRjaCA9IChpbnQgKikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBjaW5mby0+bnVtX2NvbXBvbmVudHMgKgotCQkJCSAgKFNBVkVEX0NPRUZTICogU0laRU9GKGludCkpKTsKLSAgY29lZl9iaXRzX2xhdGNoID0gY29lZi0+Y29lZl9iaXRzX2xhdGNoOwotCi0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgLyogQWxsIGNvbXBvbmVudHMnIHF1YW50aXphdGlvbiB2YWx1ZXMgbXVzdCBhbHJlYWR5IGJlIGxhdGNoZWQuICovCi0gICAgaWYgKChxdGFibGUgPSBjb21wcHRyLT5xdWFudF90YWJsZSkgPT0gTlVMTCkKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICAvKiBWZXJpZnkgREMgJiBmaXJzdCA1IEFDIHF1YW50aXplcnMgYXJlIG5vbnplcm8gdG8gYXZvaWQgemVyby1kaXZpZGUuICovCi0gICAgaWYgKHF0YWJsZS0+cXVhbnR2YWxbMF0gPT0gMCB8fAotCXF0YWJsZS0+cXVhbnR2YWxbUTAxX1BPU10gPT0gMCB8fAotCXF0YWJsZS0+cXVhbnR2YWxbUTEwX1BPU10gPT0gMCB8fAotCXF0YWJsZS0+cXVhbnR2YWxbUTIwX1BPU10gPT0gMCB8fAotCXF0YWJsZS0+cXVhbnR2YWxbUTExX1BPU10gPT0gMCB8fAotCXF0YWJsZS0+cXVhbnR2YWxbUTAyX1BPU10gPT0gMCkKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICAvKiBEQyB2YWx1ZXMgbXVzdCBiZSBhdCBsZWFzdCBwYXJ0bHkga25vd24gZm9yIGFsbCBjb21wb25lbnRzLiAqLwotICAgIGNvZWZfYml0cyA9IGNpbmZvLT5jb2VmX2JpdHNbY2ldOwotICAgIGlmIChjb2VmX2JpdHNbMF0gPCAwKQotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIC8qIEJsb2NrIHNtb290aGluZyBpcyBoZWxwZnVsIGlmIHNvbWUgQUMgY29lZmZpY2llbnRzIHJlbWFpbiBpbmFjY3VyYXRlLiAqLwotICAgIGZvciAoY29lZmkgPSAxOyBjb2VmaSA8PSA1OyBjb2VmaSsrKSB7Ci0gICAgICBjb2VmX2JpdHNfbGF0Y2hbY29lZmldID0gY29lZl9iaXRzW2NvZWZpXTsKLSAgICAgIGlmIChjb2VmX2JpdHNbY29lZmldICE9IDApCi0Jc21vb3RoaW5nX3VzZWZ1bCA9IFRSVUU7Ci0gICAgfQotICAgIGNvZWZfYml0c19sYXRjaCArPSBTQVZFRF9DT0VGUzsKLSAgfQotCi0gIHJldHVybiBzbW9vdGhpbmdfdXNlZnVsOwotfQotCi0KLS8qCi0gKiBWYXJpYW50IG9mIGRlY29tcHJlc3NfZGF0YSBmb3IgdXNlIHdoZW4gZG9pbmcgYmxvY2sgc21vb3RoaW5nLgotICovCi0KLU1FVEhPRERFRihpbnQpCi1kZWNvbXByZXNzX3Ntb290aF9kYXRhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIG91dHB1dF9idWYpCi17Ci0gIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOwotICBKRElNRU5TSU9OIGxhc3RfaU1DVV9yb3cgPSBjaW5mby0+dG90YWxfaU1DVV9yb3dzIC0gMTsKLSAgSkRJTUVOU0lPTiBibG9ja19udW0sIGxhc3RfYmxvY2tfY29sdW1uOwotICBpbnQgY2ksIGJsb2NrX3JvdywgYmxvY2tfcm93cywgYWNjZXNzX3Jvd3M7Ci0gIEpCTE9DS0FSUkFZIGJ1ZmZlcjsKLSAgSkJMT0NLUk9XIGJ1ZmZlcl9wdHIsIHByZXZfYmxvY2tfcm93LCBuZXh0X2Jsb2NrX3JvdzsKLSAgSlNBTVBBUlJBWSBvdXRwdXRfcHRyOwotICBKRElNRU5TSU9OIG91dHB1dF9jb2w7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIGludmVyc2VfRENUX21ldGhvZF9wdHIgaW52ZXJzZV9EQ1Q7Ci0gIGJvb2xlYW4gZmlyc3Rfcm93LCBsYXN0X3JvdzsKLSAgSkJMT0NLIHdvcmtzcGFjZTsKLSAgaW50ICpjb2VmX2JpdHM7Ci0gIEpRVUFOVF9UQkwgKnF1YW50dGJsOwotICBJTlQzMiBRMDAsUTAxLFEwMixRMTAsUTExLFEyMCwgbnVtOwotICBpbnQgREMxLERDMixEQzMsREM0LERDNSxEQzYsREM3LERDOCxEQzk7Ci0gIGludCBBbCwgcHJlZDsKLQotICAvKiBGb3JjZSBzb21lIGlucHV0IHRvIGJlIGRvbmUgaWYgd2UgYXJlIGdldHRpbmcgYWhlYWQgb2YgdGhlIGlucHV0LiAqLwotICB3aGlsZSAoY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyIDw9IGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgJiYKLQkgISBjaW5mby0+aW5wdXRjdGwtPmVvaV9yZWFjaGVkKSB7Ci0gICAgaWYgKGNpbmZvLT5pbnB1dF9zY2FuX251bWJlciA9PSBjaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyKSB7Ci0gICAgICAvKiBJZiBpbnB1dCBpcyB3b3JraW5nIG9uIGN1cnJlbnQgc2Nhbiwgd2Ugb3JkaW5hcmlseSB3YW50IGl0IHRvCi0gICAgICAgKiBoYXZlIGNvbXBsZXRlZCB0aGUgY3VycmVudCByb3cuICBCdXQgaWYgaW5wdXQgc2NhbiBpcyBEQywKLSAgICAgICAqIHdlIHdhbnQgaXQgdG8ga2VlcCBvbmUgcm93IGFoZWFkIHNvIHRoYXQgbmV4dCBibG9jayByb3cncyBEQwotICAgICAgICogdmFsdWVzIGFyZSB1cCB0byBkYXRlLgotICAgICAgICovCi0gICAgICBKRElNRU5TSU9OIGRlbHRhID0gKGNpbmZvLT5TcyA9PSAwKSA/IDEgOiAwOwotICAgICAgaWYgKGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA+IGNpbmZvLT5vdXRwdXRfaU1DVV9yb3crZGVsdGEpCi0JYnJlYWs7Ci0gICAgfQotICAgIGlmICgoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkoY2luZm8pID09IEpQRUdfU1VTUEVOREVEKQotICAgICAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICB9Ci0KLSAgLyogT0ssIG91dHB1dCBmcm9tIHRoZSB2aXJ0dWFsIGFycmF5cy4gKi8KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAvKiBEb24ndCBib3RoZXIgdG8gSURDVCBhbiB1bmludGVyZXN0aW5nIGNvbXBvbmVudC4gKi8KLSAgICBpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKQotICAgICAgY29udGludWU7Ci0gICAgLyogQ291bnQgbm9uLWR1bW15IERDVCBibG9jayByb3dzIGluIHRoaXMgaU1DVSByb3cuICovCi0gICAgaWYgKGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cgPCBsYXN0X2lNQ1Vfcm93KSB7Ci0gICAgICBibG9ja19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKLSAgICAgIGFjY2Vzc19yb3dzID0gYmxvY2tfcm93cyAqIDI7IC8qIHRoaXMgYW5kIG5leHQgaU1DVSByb3cgKi8KLSAgICAgIGxhc3Rfcm93ID0gRkFMU0U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIE5COiBjYW4ndCB1c2UgbGFzdF9yb3dfaGVpZ2h0IGhlcmU7IGl0IGlzIGlucHV0LXNpZGUtZGVwZW5kZW50ISAqLwotICAgICAgYmxvY2tfcm93cyA9IChpbnQpIChjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzICUgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7Ci0gICAgICBpZiAoYmxvY2tfcm93cyA9PSAwKSBibG9ja19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKLSAgICAgIGFjY2Vzc19yb3dzID0gYmxvY2tfcm93czsgLyogdGhpcyBpTUNVIHJvdyBvbmx5ICovCi0gICAgICBsYXN0X3JvdyA9IFRSVUU7Ci0gICAgfQotICAgIC8qIEFsaWduIHRoZSB2aXJ0dWFsIGJ1ZmZlciBmb3IgdGhpcyBjb21wb25lbnQuICovCi0gICAgaWYgKGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cgPiAwKSB7Ci0gICAgICBhY2Nlc3Nfcm93cyArPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyAvKiBwcmlvciBpTUNVIHJvdyB0b28gKi8KLSAgICAgIGJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotCSgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY2ldLAotCSAoY2luZm8tPm91dHB1dF9pTUNVX3JvdyAtIDEpICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKLQkgKEpESU1FTlNJT04pIGFjY2Vzc19yb3dzLCBGQUxTRSk7Ci0gICAgICBidWZmZXIgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsJLyogcG9pbnQgdG8gY3VycmVudCBpTUNVIHJvdyAqLwotICAgICAgZmlyc3Rfcm93ID0gRkFMU0U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotCSgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY2ldLAotCSAoSkRJTUVOU0lPTikgMCwgKEpESU1FTlNJT04pIGFjY2Vzc19yb3dzLCBGQUxTRSk7Ci0gICAgICBmaXJzdF9yb3cgPSBUUlVFOwotICAgIH0KLSAgICAvKiBGZXRjaCBjb21wb25lbnQtZGVwZW5kZW50IGluZm8gKi8KLSAgICBjb2VmX2JpdHMgPSBjb2VmLT5jb2VmX2JpdHNfbGF0Y2ggKyAoY2kgKiBTQVZFRF9DT0VGUyk7Ci0gICAgcXVhbnR0YmwgPSBjb21wcHRyLT5xdWFudF90YWJsZTsKLSAgICBRMDAgPSBxdWFudHRibC0+cXVhbnR2YWxbMF07Ci0gICAgUTAxID0gcXVhbnR0YmwtPnF1YW50dmFsW1EwMV9QT1NdOwotICAgIFExMCA9IHF1YW50dGJsLT5xdWFudHZhbFtRMTBfUE9TXTsKLSAgICBRMjAgPSBxdWFudHRibC0+cXVhbnR2YWxbUTIwX1BPU107Ci0gICAgUTExID0gcXVhbnR0YmwtPnF1YW50dmFsW1ExMV9QT1NdOwotICAgIFEwMiA9IHF1YW50dGJsLT5xdWFudHZhbFtRMDJfUE9TXTsKLSAgICBpbnZlcnNlX0RDVCA9IGNpbmZvLT5pZGN0LT5pbnZlcnNlX0RDVFtjaV07Ci0gICAgb3V0cHV0X3B0ciA9IG91dHB1dF9idWZbY2ldOwotICAgIC8qIExvb3Agb3ZlciBhbGwgRENUIGJsb2NrcyB0byBiZSBwcm9jZXNzZWQuICovCi0gICAgZm9yIChibG9ja19yb3cgPSAwOyBibG9ja19yb3cgPCBibG9ja19yb3dzOyBibG9ja19yb3crKykgewotICAgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcltibG9ja19yb3ddOwotICAgICAgaWYgKGZpcnN0X3JvdyAmJiBibG9ja19yb3cgPT0gMCkKLQlwcmV2X2Jsb2NrX3JvdyA9IGJ1ZmZlcl9wdHI7Ci0gICAgICBlbHNlCi0JcHJldl9ibG9ja19yb3cgPSBidWZmZXJbYmxvY2tfcm93LTFdOwotICAgICAgaWYgKGxhc3Rfcm93ICYmIGJsb2NrX3JvdyA9PSBibG9ja19yb3dzLTEpCi0JbmV4dF9ibG9ja19yb3cgPSBidWZmZXJfcHRyOwotICAgICAgZWxzZQotCW5leHRfYmxvY2tfcm93ID0gYnVmZmVyW2Jsb2NrX3JvdysxXTsKLSAgICAgIC8qIFdlIGZldGNoIHRoZSBzdXJyb3VuZGluZyBEQyB2YWx1ZXMgdXNpbmcgYSBzbGlkaW5nLXJlZ2lzdGVyIGFwcHJvYWNoLgotICAgICAgICogSW5pdGlhbGl6ZSBhbGwgbmluZSBoZXJlIHNvIGFzIHRvIGRvIHRoZSByaWdodCB0aGluZyBvbiBuYXJyb3cgcGljcy4KLSAgICAgICAqLwotICAgICAgREMxID0gREMyID0gREMzID0gKGludCkgcHJldl9ibG9ja19yb3dbMF1bMF07Ci0gICAgICBEQzQgPSBEQzUgPSBEQzYgPSAoaW50KSBidWZmZXJfcHRyWzBdWzBdOwotICAgICAgREM3ID0gREM4ID0gREM5ID0gKGludCkgbmV4dF9ibG9ja19yb3dbMF1bMF07Ci0gICAgICBvdXRwdXRfY29sID0gMDsKLSAgICAgIGxhc3RfYmxvY2tfY29sdW1uID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzIC0gMTsKLSAgICAgIGZvciAoYmxvY2tfbnVtID0gMDsgYmxvY2tfbnVtIDw9IGxhc3RfYmxvY2tfY29sdW1uOyBibG9ja19udW0rKykgewotCS8qIEZldGNoIGN1cnJlbnQgRENUIGJsb2NrIGludG8gd29ya3NwYWNlIHNvIHdlIGNhbiBtb2RpZnkgaXQuICovCi0JamNvcHlfYmxvY2tfcm93KGJ1ZmZlcl9wdHIsIChKQkxPQ0tST1cpIHdvcmtzcGFjZSwgKEpESU1FTlNJT04pIDEpOwotCS8qIFVwZGF0ZSBEQyB2YWx1ZXMgKi8KLQlpZiAoYmxvY2tfbnVtIDwgbGFzdF9ibG9ja19jb2x1bW4pIHsKLQkgIERDMyA9IChpbnQpIHByZXZfYmxvY2tfcm93WzFdWzBdOwotCSAgREM2ID0gKGludCkgYnVmZmVyX3B0clsxXVswXTsKLQkgIERDOSA9IChpbnQpIG5leHRfYmxvY2tfcm93WzFdWzBdOwotCX0KLQkvKiBDb21wdXRlIGNvZWZmaWNpZW50IGVzdGltYXRlcyBwZXIgSy44LgotCSAqIEFuIGVzdGltYXRlIGlzIGFwcGxpZWQgb25seSBpZiBjb2VmZmljaWVudCBpcyBzdGlsbCB6ZXJvLAotCSAqIGFuZCBpcyBub3Qga25vd24gdG8gYmUgZnVsbHkgYWNjdXJhdGUuCi0JICovCi0JLyogQUMwMSAqLwotCWlmICgoQWw9Y29lZl9iaXRzWzFdKSAhPSAwICYmIHdvcmtzcGFjZVsxXSA9PSAwKSB7Ci0JICBudW0gPSAzNiAqIFEwMCAqIChEQzQgLSBEQzYpOwotCSAgaWYgKG51bSA+PSAwKSB7Ci0JICAgIHByZWQgPSAoaW50KSAoKChRMDE8PDcpICsgbnVtKSAvIChRMDE8PDgpKTsKLQkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCi0JICAgICAgcHJlZCA9ICgxPDxBbCktMTsKLQkgIH0gZWxzZSB7Ci0JICAgIHByZWQgPSAoaW50KSAoKChRMDE8PDcpIC0gbnVtKSAvIChRMDE8PDgpKTsKLQkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCi0JICAgICAgcHJlZCA9ICgxPDxBbCktMTsKLQkgICAgcHJlZCA9IC1wcmVkOwotCSAgfQotCSAgd29ya3NwYWNlWzFdID0gKEpDT0VGKSBwcmVkOwotCX0KLQkvKiBBQzEwICovCi0JaWYgKChBbD1jb2VmX2JpdHNbMl0pICE9IDAgJiYgd29ya3NwYWNlWzhdID09IDApIHsKLQkgIG51bSA9IDM2ICogUTAwICogKERDMiAtIERDOCk7Ci0JICBpZiAobnVtID49IDApIHsKLQkgICAgcHJlZCA9IChpbnQpICgoKFExMDw8NykgKyBudW0pIC8gKFExMDw8OCkpOwotCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKLQkgICAgICBwcmVkID0gKDE8PEFsKS0xOwotCSAgfSBlbHNlIHsKLQkgICAgcHJlZCA9IChpbnQpICgoKFExMDw8NykgLSBudW0pIC8gKFExMDw8OCkpOwotCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKLQkgICAgICBwcmVkID0gKDE8PEFsKS0xOwotCSAgICBwcmVkID0gLXByZWQ7Ci0JICB9Ci0JICB3b3Jrc3BhY2VbOF0gPSAoSkNPRUYpIHByZWQ7Ci0JfQotCS8qIEFDMjAgKi8KLQlpZiAoKEFsPWNvZWZfYml0c1szXSkgIT0gMCAmJiB3b3Jrc3BhY2VbMTZdID09IDApIHsKLQkgIG51bSA9IDkgKiBRMDAgKiAoREMyICsgREM4IC0gMipEQzUpOwotCSAgaWYgKG51bSA+PSAwKSB7Ci0JICAgIHByZWQgPSAoaW50KSAoKChRMjA8PDcpICsgbnVtKSAvIChRMjA8PDgpKTsKLQkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCi0JICAgICAgcHJlZCA9ICgxPDxBbCktMTsKLQkgIH0gZWxzZSB7Ci0JICAgIHByZWQgPSAoaW50KSAoKChRMjA8PDcpIC0gbnVtKSAvIChRMjA8PDgpKTsKLQkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCi0JICAgICAgcHJlZCA9ICgxPDxBbCktMTsKLQkgICAgcHJlZCA9IC1wcmVkOwotCSAgfQotCSAgd29ya3NwYWNlWzE2XSA9IChKQ09FRikgcHJlZDsKLQl9Ci0JLyogQUMxMSAqLwotCWlmICgoQWw9Y29lZl9iaXRzWzRdKSAhPSAwICYmIHdvcmtzcGFjZVs5XSA9PSAwKSB7Ci0JICBudW0gPSA1ICogUTAwICogKERDMSAtIERDMyAtIERDNyArIERDOSk7Ci0JICBpZiAobnVtID49IDApIHsKLQkgICAgcHJlZCA9IChpbnQpICgoKFExMTw8NykgKyBudW0pIC8gKFExMTw8OCkpOwotCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKLQkgICAgICBwcmVkID0gKDE8PEFsKS0xOwotCSAgfSBlbHNlIHsKLQkgICAgcHJlZCA9IChpbnQpICgoKFExMTw8NykgLSBudW0pIC8gKFExMTw8OCkpOwotCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKLQkgICAgICBwcmVkID0gKDE8PEFsKS0xOwotCSAgICBwcmVkID0gLXByZWQ7Ci0JICB9Ci0JICB3b3Jrc3BhY2VbOV0gPSAoSkNPRUYpIHByZWQ7Ci0JfQotCS8qIEFDMDIgKi8KLQlpZiAoKEFsPWNvZWZfYml0c1s1XSkgIT0gMCAmJiB3b3Jrc3BhY2VbMl0gPT0gMCkgewotCSAgbnVtID0gOSAqIFEwMCAqIChEQzQgKyBEQzYgLSAyKkRDNSk7Ci0JICBpZiAobnVtID49IDApIHsKLQkgICAgcHJlZCA9IChpbnQpICgoKFEwMjw8NykgKyBudW0pIC8gKFEwMjw8OCkpOwotCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKLQkgICAgICBwcmVkID0gKDE8PEFsKS0xOwotCSAgfSBlbHNlIHsKLQkgICAgcHJlZCA9IChpbnQpICgoKFEwMjw8NykgLSBudW0pIC8gKFEwMjw8OCkpOwotCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKLQkgICAgICBwcmVkID0gKDE8PEFsKS0xOwotCSAgICBwcmVkID0gLXByZWQ7Ci0JICB9Ci0JICB3b3Jrc3BhY2VbMl0gPSAoSkNPRUYpIHByZWQ7Ci0JfQotCS8qIE9LLCBkbyB0aGUgSURDVCAqLwotCSgqaW52ZXJzZV9EQ1QpIChjaW5mbywgY29tcHB0ciwgKEpDT0VGUFRSKSB3b3Jrc3BhY2UsCi0JCQlvdXRwdXRfcHRyLCBvdXRwdXRfY29sKTsKLQkvKiBBZHZhbmNlIGZvciBuZXh0IGNvbHVtbiAqLwotCURDMSA9IERDMjsgREMyID0gREMzOwotCURDNCA9IERDNTsgREM1ID0gREM2OwotCURDNyA9IERDODsgREM4ID0gREM5OwotCWJ1ZmZlcl9wdHIrKywgcHJldl9ibG9ja19yb3crKywgbmV4dF9ibG9ja19yb3crKzsKLQlvdXRwdXRfY29sICs9IGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKLSAgICAgIH0KLSAgICAgIG91dHB1dF9wdHIgKz0gY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOwotICAgIH0KLSAgfQotCi0gIGlmICgrKyhjaW5mby0+b3V0cHV0X2lNQ1Vfcm93KSA8IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MpCi0gICAgcmV0dXJuIEpQRUdfUk9XX0NPTVBMRVRFRDsKLSAgcmV0dXJuIEpQRUdfU0NBTl9DT01QTEVURUQ7Ci19Ci0KLSNlbmRpZiAvKiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVEICovCi0KLQotLyoKLSAqIEluaXRpYWxpemUgY29lZmZpY2llbnQgYnVmZmVyIGNvbnRyb2xsZXIuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9kX2NvZWZfY29udHJvbGxlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKQotewotICBteV9jb2VmX3B0ciBjb2VmOwotCi0gIGNvZWYgPSAobXlfY29lZl9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfY29lZl9jb250cm9sbGVyKSk7Ci0gIGNpbmZvLT5jb2VmID0gKHN0cnVjdCBqcGVnX2RfY29lZl9jb250cm9sbGVyICopIGNvZWY7Ci0gIGNvZWYtPnB1Yi5zdGFydF9pbnB1dF9wYXNzID0gc3RhcnRfaW5wdXRfcGFzczsKLSAgY29lZi0+cHViLnN0YXJ0X291dHB1dF9wYXNzID0gc3RhcnRfb3V0cHV0X3Bhc3M7Ci0jaWZkZWYgQkxPQ0tfU01PT1RISU5HX1NVUFBPUlRFRAotICBjb2VmLT5jb2VmX2JpdHNfbGF0Y2ggPSBOVUxMOwotI2VuZGlmCi0KLSAgLyogQ3JlYXRlIHRoZSBjb2VmZmljaWVudCBidWZmZXIuICovCi0gIGlmIChuZWVkX2Z1bGxfYnVmZmVyKSB7Ci0jaWZkZWYgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi0gICAgLyogQWxsb2NhdGUgYSBmdWxsLWltYWdlIHZpcnR1YWwgYXJyYXkgZm9yIGVhY2ggY29tcG9uZW50LCAqLwotICAgIC8qIHBhZGRlZCB0byBhIG11bHRpcGxlIG9mIHNhbXBfZmFjdG9yIERDVCBibG9ja3MgaW4gZWFjaCBkaXJlY3Rpb24uICovCi0gICAgLyogTm90ZSB3ZSBhc2sgZm9yIGEgcHJlLXplcm9lZCBhcnJheS4gKi8KLSAgICBpbnQgY2ksIGFjY2Vzc19yb3dzOwotICAgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0KLSAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotCSBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAgIGFjY2Vzc19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKLSNpZmRlZiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVECi0gICAgICAvKiBJZiBibG9jayBzbW9vdGhpbmcgY291bGQgYmUgdXNlZCwgbmVlZCBhIGJpZ2dlciB3aW5kb3cgKi8KLSAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkKLQlhY2Nlc3Nfcm93cyAqPSAzOwotI2VuZGlmCi0gICAgICBjb2VmLT53aG9sZV9pbWFnZVtjaV0gPSAoKmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9iYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgVFJVRSwKLQkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzLAotCQkJCShsb25nKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSwKLQkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcywKLQkJCQkobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciksCi0JIChKRElNRU5TSU9OKSBhY2Nlc3Nfcm93cyk7Ci0gICAgfQotICAgIGNvZWYtPnB1Yi5jb25zdW1lX2RhdGEgPSBjb25zdW1lX2RhdGE7Ci0gICAgY29lZi0+cHViLmRlY29tcHJlc3NfZGF0YSA9IGRlY29tcHJlc3NfZGF0YTsKLSAgICBjb2VmLT5wdWIuY29lZl9hcnJheXMgPSBjb2VmLT53aG9sZV9pbWFnZTsgLyogbGluayB0byB2aXJ0dWFsIGFycmF5cyAqLwotI2Vsc2UKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0jZW5kaWYKLSAgfSBlbHNlIHsKLSAgICAvKiBXZSBvbmx5IG5lZWQgYSBzaW5nbGUtTUNVIGJ1ZmZlci4gKi8KLSAgICBKQkxPQ0tST1cgYnVmZmVyOwotICAgIGludCBpOwotCi0gICAgYnVmZmVyID0gKEpCTE9DS1JPVykKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBEX01BWF9CTE9DS1NfSU5fTUNVICogU0laRU9GKEpCTE9DSykpOwotICAgIGZvciAoaSA9IDA7IGkgPCBEX01BWF9CTE9DS1NfSU5fTUNVOyBpKyspIHsKLSAgICAgIGNvZWYtPk1DVV9idWZmZXJbaV0gPSBidWZmZXIgKyBpOwotICAgIH0KLSAgICBjb2VmLT5wdWIuY29uc3VtZV9kYXRhID0gZHVtbXlfY29uc3VtZV9kYXRhOwotICAgIGNvZWYtPnB1Yi5kZWNvbXByZXNzX2RhdGEgPSBkZWNvbXByZXNzX29uZXBhc3M7Ci0gICAgY29lZi0+cHViLmNvZWZfYXJyYXlzID0gTlVMTDsgLyogZmxhZyBmb3Igbm8gdmlydHVhbCBhcnJheXMgKi8KLSAgfQotfQotCi0jZW5kaWYgLy9fRlhfSlBFR19UVVJCT18KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkY29sb3IuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkY29sb3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE3MzI5Yi4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZGNvbG9yLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTkgKzAsMCBAQAotI2lmICFkZWZpbmVkKF9GWF9KUEVHX1RVUkJPXykKLS8qCi0gKiBqZGNvbG9yLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBvdXRwdXQgY29sb3JzcGFjZSBjb252ZXJzaW9uIHJvdXRpbmVzLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKiBQcml2YXRlIHN1Ym9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2NvbG9yX2RlY29udmVydGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIFByaXZhdGUgc3RhdGUgZm9yIFlDQy0+UkdCIGNvbnZlcnNpb24gKi8KLSAgaW50ICogQ3Jfcl90YWI7CQkvKiA9PiB0YWJsZSBmb3IgQ3IgdG8gUiBjb252ZXJzaW9uICovCi0gIGludCAqIENiX2JfdGFiOwkJLyogPT4gdGFibGUgZm9yIENiIHRvIEIgY29udmVyc2lvbiAqLwotICBJTlQzMiAqIENyX2dfdGFiOwkJLyogPT4gdGFibGUgZm9yIENyIHRvIEcgY29udmVyc2lvbiAqLwotICBJTlQzMiAqIENiX2dfdGFiOwkJLyogPT4gdGFibGUgZm9yIENiIHRvIEcgY29udmVyc2lvbiAqLwotfSBteV9jb2xvcl9kZWNvbnZlcnRlcjsKLQotdHlwZWRlZiBteV9jb2xvcl9kZWNvbnZlcnRlciAqIG15X2Njb252ZXJ0X3B0cjsKLQotCi0vKioqKioqKioqKioqKioqKiBZQ2JDciAtPiBSR0IgY29udmVyc2lvbjogbW9zdCBjb21tb24gY2FzZSAqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFlDYkNyIGlzIGRlZmluZWQgcGVyIENDSVIgNjAxLTEsIGV4Y2VwdCB0aGF0IENiIGFuZCBDciBhcmUKLSAqIG5vcm1hbGl6ZWQgdG8gdGhlIHJhbmdlIDAuLk1BWEpTQU1QTEUgcmF0aGVyIHRoYW4gLTAuNSAuLiAwLjUuCi0gKiBUaGUgY29udmVyc2lvbiBlcXVhdGlvbnMgdG8gYmUgaW1wbGVtZW50ZWQgYXJlIHRoZXJlZm9yZQotICoJUiA9IFkgICAgICAgICAgICAgICAgKyAxLjQwMjAwICogQ3IKLSAqCUcgPSBZIC0gMC4zNDQxNCAqIENiIC0gMC43MTQxNCAqIENyCi0gKglCID0gWSArIDEuNzcyMDAgKiBDYgotICogd2hlcmUgQ2IgYW5kIENyIHJlcHJlc2VudCB0aGUgaW5jb21pbmcgdmFsdWVzIGxlc3MgQ0VOVEVSSlNBTVBMRS4KLSAqIChUaGVzZSBudW1iZXJzIGFyZSBkZXJpdmVkIGZyb20gVElGRiA2LjAgc2VjdGlvbiAyMSwgZGF0ZWQgMy1KdW5lLTkyLikKLSAqCi0gKiBUbyBhdm9pZCBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljLCB3ZSByZXByZXNlbnQgdGhlIGZyYWN0aW9uYWwgY29uc3RhbnRzCi0gKiBhcyBpbnRlZ2VycyBzY2FsZWQgdXAgYnkgMl4xNiAoYWJvdXQgNCBkaWdpdHMgcHJlY2lzaW9uKTsgd2UgaGF2ZSB0byBkaXZpZGUKLSAqIHRoZSBwcm9kdWN0cyBieSAyXjE2LCB3aXRoIGFwcHJvcHJpYXRlIHJvdW5kaW5nLCB0byBnZXQgdGhlIGNvcnJlY3QgYW5zd2VyLgotICogTm90aWNlIHRoYXQgWSwgYmVpbmcgYW4gaW50ZWdyYWwgaW5wdXQsIGRvZXMgbm90IGNvbnRyaWJ1dGUgYW55IGZyYWN0aW9uCi0gKiBzbyBpdCBuZWVkIG5vdCBwYXJ0aWNpcGF0ZSBpbiB0aGUgcm91bmRpbmcuCi0gKgotICogRm9yIGV2ZW4gbW9yZSBzcGVlZCwgd2UgYXZvaWQgZG9pbmcgYW55IG11bHRpcGxpY2F0aW9ucyBpbiB0aGUgaW5uZXIgbG9vcAotICogYnkgcHJlY2FsY3VsYXRpbmcgdGhlIGNvbnN0YW50cyB0aW1lcyBDYiBhbmQgQ3IgZm9yIGFsbCBwb3NzaWJsZSB2YWx1ZXMuCi0gKiBGb3IgOC1iaXQgSlNBTVBMRXMgdGhpcyBpcyB2ZXJ5IHJlYXNvbmFibGUgKG9ubHkgMjU2IGVudHJpZXMgcGVyIHRhYmxlKTsKLSAqIGZvciAxMi1iaXQgc2FtcGxlcyBpdCBpcyBzdGlsbCBhY2NlcHRhYmxlLiAgSXQncyBub3QgdmVyeSByZWFzb25hYmxlIGZvcgotICogMTYtYml0IHNhbXBsZXMsIGJ1dCBpZiB5b3Ugd2FudCBsb3NzbGVzcyBzdG9yYWdlIHlvdSBzaG91bGRuJ3QgYmUgY2hhbmdpbmcKLSAqIGNvbG9yc3BhY2UgYW55d2F5LgotICogVGhlIENyPT5SIGFuZCBDYj0+QiB2YWx1ZXMgY2FuIGJlIHJvdW5kZWQgdG8gaW50ZWdlcnMgaW4gYWR2YW5jZTsgdGhlCi0gKiB2YWx1ZXMgZm9yIHRoZSBHIGNhbGN1bGF0aW9uIGFyZSBsZWZ0IHNjYWxlZCB1cCwgc2luY2Ugd2UgbXVzdCBhZGQgdGhlbQotICogdG9nZXRoZXIgYmVmb3JlIHJvdW5kaW5nLgotICovCi0KLSNkZWZpbmUgU0NBTEVCSVRTCTE2CS8qIHNwZWVkaWVzdCByaWdodC1zaGlmdCBvbiBzb21lIG1hY2hpbmVzICovCi0jZGVmaW5lIE9ORV9IQUxGCSgoSU5UMzIpIDEgPDwgKFNDQUxFQklUUy0xKSkKLSNkZWZpbmUgRklYKHgpCQkoKElOVDMyKSAoKHgpICogKDFMPDxTQ0FMRUJJVFMpICsgMC41KSkKLQotCi0vKgotICogSW5pdGlhbGl6ZSB0YWJsZXMgZm9yIFlDQy0+UkdCIGNvbG9yc3BhY2UgY29udmVyc2lvbi4KLSAqLwotCi1MT0NBTCh2b2lkKQotYnVpbGRfeWNjX3JnYl90YWJsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OwotICBpbnQgaTsKLSAgSU5UMzIgeDsKLSAgU0hJRlRfVEVNUFMKLQotICBjY29udmVydC0+Q3Jfcl90YWIgPSAoaW50ICopCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihpbnQpKTsKLSAgY2NvbnZlcnQtPkNiX2JfdGFiID0gKGludCAqKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoaW50KSk7Ci0gIGNjb252ZXJ0LT5Dcl9nX3RhYiA9IChJTlQzMiAqKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoSU5UMzIpKTsKLSAgY2NvbnZlcnQtPkNiX2dfdGFiID0gKElOVDMyICopCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihJTlQzMikpOwotCi0gIGZvciAoaSA9IDAsIHggPSAtQ0VOVEVSSlNBTVBMRTsgaSA8PSBNQVhKU0FNUExFOyBpKyssIHgrKykgewotICAgIC8qIGkgaXMgdGhlIGFjdHVhbCBpbnB1dCBwaXhlbCB2YWx1ZSwgaW4gdGhlIHJhbmdlIDAuLk1BWEpTQU1QTEUgKi8KLSAgICAvKiBUaGUgQ2Igb3IgQ3IgdmFsdWUgd2UgYXJlIHRoaW5raW5nIG9mIGlzIHggPSBpIC0gQ0VOVEVSSlNBTVBMRSAqLwotICAgIC8qIENyPT5SIHZhbHVlIGlzIG5lYXJlc3QgaW50IHRvIDEuNDAyMDAgKiB4ICovCi0gICAgY2NvbnZlcnQtPkNyX3JfdGFiW2ldID0gKGludCkKLQkJICAgIFJJR0hUX1NISUZUKEZJWCgxLjQwMjAwKSAqIHggKyBPTkVfSEFMRiwgU0NBTEVCSVRTKTsKLSAgICAvKiBDYj0+QiB2YWx1ZSBpcyBuZWFyZXN0IGludCB0byAxLjc3MjAwICogeCAqLwotICAgIGNjb252ZXJ0LT5DYl9iX3RhYltpXSA9IChpbnQpCi0JCSAgICBSSUdIVF9TSElGVChGSVgoMS43NzIwMCkgKiB4ICsgT05FX0hBTEYsIFNDQUxFQklUUyk7Ci0gICAgLyogQ3I9PkcgdmFsdWUgaXMgc2NhbGVkLXVwIC0wLjcxNDE0ICogeCAqLwotICAgIGNjb252ZXJ0LT5Dcl9nX3RhYltpXSA9ICgtIEZJWCgwLjcxNDE0KSkgKiB4OwotICAgIC8qIENiPT5HIHZhbHVlIGlzIHNjYWxlZC11cCAtMC4zNDQxNCAqIHggKi8KLSAgICAvKiBXZSBhbHNvIGFkZCBpbiBPTkVfSEFMRiBzbyB0aGF0IG5lZWQgbm90IGRvIGl0IGluIGlubmVyIGxvb3AgKi8KLSAgICBjY29udmVydC0+Q2JfZ190YWJbaV0gPSAoLSBGSVgoMC4zNDQxNCkpICogeCArIE9ORV9IQUxGOwotICB9Ci19Ci0KLQotLyoKLSAqIENvbnZlcnQgc29tZSByb3dzIG9mIHNhbXBsZXMgdG8gdGhlIG91dHB1dCBjb2xvcnNwYWNlLgotICoKLSAqIE5vdGUgdGhhdCB3ZSBjaGFuZ2UgZnJvbSBub25pbnRlcmxlYXZlZCwgb25lLXBsYW5lLXBlci1jb21wb25lbnQgZm9ybWF0Ci0gKiB0byBpbnRlcmxlYXZlZC1waXhlbCBmb3JtYXQuICBUaGUgb3V0cHV0IGJ1ZmZlciBpcyB0aGVyZWZvcmUgdGhyZWUgdGltZXMKLSAqIGFzIHdpZGUgYXMgdGhlIGlucHV0IGJ1ZmZlci4KLSAqIEEgc3RhcnRpbmcgcm93IG9mZnNldCBpcyBwcm92aWRlZCBvbmx5IGZvciB0aGUgaW5wdXQgYnVmZmVyLiAgVGhlIGNhbGxlcgotICogY2FuIGVhc2lseSBhZGp1c3QgdGhlIHBhc3NlZCBvdXRwdXRfYnVmIHZhbHVlIHRvIGFjY29tbW9kYXRlIGFueSByb3cKLSAqIG9mZnNldCByZXF1aXJlZCBvbiB0aGF0IHNpZGUuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi15Y2NfcmdiX2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCSBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCi0JCSBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKLXsKLSAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OwotICByZWdpc3RlciBpbnQgeSwgY2IsIGNyOwotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKLSAgLyogY29weSB0aGVzZSBwb2ludGVycyBpbnRvIHJlZ2lzdGVycyBpZiBwb3NzaWJsZSAqLwotICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OwotICByZWdpc3RlciBpbnQgKiBDcnJ0YWIgPSBjY29udmVydC0+Q3Jfcl90YWI7Ci0gIHJlZ2lzdGVyIGludCAqIENiYnRhYiA9IGNjb252ZXJ0LT5DYl9iX3RhYjsKLSAgcmVnaXN0ZXIgSU5UMzIgKiBDcmd0YWIgPSBjY29udmVydC0+Q3JfZ190YWI7Ci0gIHJlZ2lzdGVyIElOVDMyICogQ2JndGFiID0gY2NvbnZlcnQtPkNiX2dfdGFiOwotICBTSElGVF9URU1QUwotCi0gIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKLSAgICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93XTsKLSAgICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5wdXRfcm93XTsKLSAgICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5wdXRfcm93XTsKLSAgICBpbnB1dF9yb3crKzsKLSAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOwotICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7Ci0gICAgICB5ICA9IEdFVEpTQU1QTEUoaW5wdHIwW2NvbF0pOwotICAgICAgY2IgPSBHRVRKU0FNUExFKGlucHRyMVtjb2xdKTsKLSAgICAgIGNyID0gR0VUSlNBTVBMRShpbnB0cjJbY29sXSk7Ci0gICAgICAvKiBSYW5nZS1saW1pdGluZyBpcyBlc3NlbnRpYWwgZHVlIHRvIG5vaXNlIGludHJvZHVjZWQgYnkgRENUIGxvc3Nlcy4gKi8KLSAgICAgIG91dHB0cltSR0JfUkVEXSA9ICAgcmFuZ2VfbGltaXRbeSArIENycnRhYltjcl1dOwotICAgICAgb3V0cHRyW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsKLQkJCSAgICAgICgoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwKLQkJCQkJCSBTQ0FMRUJJVFMpKV07Ci0gICAgICBvdXRwdHJbUkdCX0JMVUVdID0gIHJhbmdlX2xpbWl0W3kgKyBDYmJ0YWJbY2JdXTsKLSAgICAgIG91dHB0ciArPSBSR0JfUElYRUxTSVpFOwotICAgIH0KLSAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqIENhc2VzIG90aGVyIHRoYW4gWUNiQ3IgLT4gUkdCICoqKioqKioqKioqKioqLwotCi0KLS8qCi0gKiBDb2xvciBjb252ZXJzaW9uIGZvciBubyBjb2xvcnNwYWNlIGNoYW5nZToganVzdCBjb3B5IHRoZSBkYXRhLAotICogY29udmVydGluZyBmcm9tIHNlcGFyYXRlLXBsYW5lcyB0byBpbnRlcmxlYXZlZCByZXByZXNlbnRhdGlvbi4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLW51bGxfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCi0JICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCi17Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY291bnQ7Ci0gIHJlZ2lzdGVyIGludCBudW1fY29tcG9uZW50cyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7Ci0gIGludCBjaTsKLQotICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7Ci0gICAgZm9yIChjaSA9IDA7IGNpIDwgbnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLSAgICAgIGlucHRyID0gaW5wdXRfYnVmW2NpXVtpbnB1dF9yb3ddOwotICAgICAgb3V0cHRyID0gb3V0cHV0X2J1ZlswXSArIGNpOwotICAgICAgZm9yIChjb3VudCA9IG51bV9jb2xzOyBjb3VudCA+IDA7IGNvdW50LS0pIHsKLQkqb3V0cHRyID0gKmlucHRyKys7CS8qIG5lZWRuJ3QgYm90aGVyIHdpdGggR0VUSlNBTVBMRSgpIGhlcmUgKi8KLQlvdXRwdHIgKz0gbnVtX2NvbXBvbmVudHM7Ci0gICAgICB9Ci0gICAgfQotICAgIGlucHV0X3JvdysrOwotICAgIG91dHB1dF9idWYrKzsKLSAgfQotfQotCi0KLS8qCi0gKiBDb2xvciBjb252ZXJzaW9uIGZvciBncmF5c2NhbGU6IGp1c3QgY29weSB0aGUgZGF0YS4KLSAqIFRoaXMgYWxzbyB3b3JrcyBmb3IgWUNiQ3IgLT4gZ3JheXNjYWxlIGNvbnZlcnNpb24sIGluIHdoaWNoCi0gKiB3ZSBqdXN0IGNvcHkgdGhlIFkgKGx1bWluYW5jZSkgY29tcG9uZW50IGFuZCBpZ25vcmUgY2hyb21pbmFuY2UuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1ncmF5c2NhbGVfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAotCQkgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKLXsKLSAgamNvcHlfc2FtcGxlX3Jvd3MoaW5wdXRfYnVmWzBdLCAoaW50KSBpbnB1dF9yb3csIG91dHB1dF9idWYsIDAsCi0JCSAgICBudW1fcm93cywgY2luZm8tPm91dHB1dF93aWR0aCk7Ci19Ci0KLQotLyoKLSAqIENvbnZlcnQgZ3JheXNjYWxlIHRvIFJHQjoganVzdCBkdXBsaWNhdGUgdGhlIGdyYXlsZXZlbCB0aHJlZSB0aW1lcy4KLSAqIFRoaXMgaXMgcHJvdmlkZWQgdG8gc3VwcG9ydCBhcHBsaWNhdGlvbnMgdGhhdCBkb24ndCB3YW50IHRvIGNvcGUKLSAqIHdpdGggZ3JheXNjYWxlIGFzIGEgc2VwYXJhdGUgY2FzZS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWdyYXlfcmdiX2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCSAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAotCQkgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQotewotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7Ci0KLSAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgewotICAgIGlucHRyID0gaW5wdXRfYnVmWzBdW2lucHV0X3JvdysrXTsKLSAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOwotICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7Ci0gICAgICAvKiBXZSBjYW4gZGlzcGVuc2Ugd2l0aCBHRVRKU0FNUExFKCkgaGVyZSAqLwotICAgICAgb3V0cHRyW1JHQl9SRURdID0gb3V0cHRyW1JHQl9HUkVFTl0gPSBvdXRwdHJbUkdCX0JMVUVdID0gaW5wdHJbY29sXTsKLSAgICAgIG91dHB0ciArPSBSR0JfUElYRUxTSVpFOwotICAgIH0KLSAgfQotfQotCi0KLS8qCi0gKiBBZG9iZS1zdHlsZSBZQ0NLLT5DTVlLIGNvbnZlcnNpb24uCi0gKiBXZSBjb252ZXJ0IFlDYkNyIHRvIFI9MS1DLCBHPTEtTSwgYW5kIEI9MS1ZIHVzaW5nIHRoZSBzYW1lCi0gKiBjb252ZXJzaW9uIGFzIGFib3ZlLCB3aGlsZSBwYXNzaW5nIEsgKGJsYWNrKSB1bmNoYW5nZWQuCi0gKiBXZSBhc3N1bWUgYnVpbGRfeWNjX3JnYl90YWJsZSBoYXMgYmVlbiBjYWxsZWQuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi15Y2NrX2NteWtfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAotCQkgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKLXsKLSAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OwotICByZWdpc3RlciBpbnQgeSwgY2IsIGNyOwotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjIsIGlucHRyMzsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0gIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+b3V0cHV0X3dpZHRoOwotICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCi0gIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7Ci0gIHJlZ2lzdGVyIGludCAqIENycnRhYiA9IGNjb252ZXJ0LT5Dcl9yX3RhYjsKLSAgcmVnaXN0ZXIgaW50ICogQ2JidGFiID0gY2NvbnZlcnQtPkNiX2JfdGFiOwotICByZWdpc3RlciBJTlQzMiAqIENyZ3RhYiA9IGNjb252ZXJ0LT5Dcl9nX3RhYjsKLSAgcmVnaXN0ZXIgSU5UMzIgKiBDYmd0YWIgPSBjY29udmVydC0+Q2JfZ190YWI7Ci0gIFNISUZUX1RFTVBTCi0KLSAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgewotICAgIGlucHRyMCA9IGlucHV0X2J1ZlswXVtpbnB1dF9yb3ddOwotICAgIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbnB1dF9yb3ddOwotICAgIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbnB1dF9yb3ddOwotICAgIGlucHRyMyA9IGlucHV0X2J1ZlszXVtpbnB1dF9yb3ddOwotICAgIGlucHV0X3JvdysrOwotICAgIG91dHB0ciA9ICpvdXRwdXRfYnVmKys7Ci0gICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKLSAgICAgIHkgID0gR0VUSlNBTVBMRShpbnB0cjBbY29sXSk7Ci0gICAgICBjYiA9IEdFVEpTQU1QTEUoaW5wdHIxW2NvbF0pOwotICAgICAgY3IgPSBHRVRKU0FNUExFKGlucHRyMltjb2xdKTsKLSAgICAgIC8qIFJhbmdlLWxpbWl0aW5nIGlzIGVzc2VudGlhbCBkdWUgdG8gbm9pc2UgaW50cm9kdWNlZCBieSBEQ1QgbG9zc2VzLiAqLwotICAgICAgb3V0cHRyWzBdID0gcmFuZ2VfbGltaXRbTUFYSlNBTVBMRSAtICh5ICsgQ3JydGFiW2NyXSldOwkvKiByZWQgKi8KLSAgICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0W01BWEpTQU1QTEUgLSAoeSArCQkJLyogZ3JlZW4gKi8KLQkJCSAgICAgICgoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwKLQkJCQkJCSBTQ0FMRUJJVFMpKSldOwotICAgICAgb3V0cHRyWzJdID0gcmFuZ2VfbGltaXRbTUFYSlNBTVBMRSAtICh5ICsgQ2JidGFiW2NiXSldOwkvKiBibHVlICovCi0gICAgICAvKiBLIHBhc3NlcyB0aHJvdWdoIHVuY2hhbmdlZCAqLwotICAgICAgb3V0cHRyWzNdID0gaW5wdHIzW2NvbF07CS8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSBoZXJlICovCi0gICAgICBvdXRwdHIgKz0gNDsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKgotICogRW1wdHkgbWV0aG9kIGZvciBzdGFydF9wYXNzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfcGFzc19kY29sb3IgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIC8qIG5vIHdvcmsgbmVlZGVkICovCi19Ci0KLQotLyoKLSAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciBvdXRwdXQgY29sb3JzcGFjZSBjb252ZXJzaW9uLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfY29sb3JfZGVjb252ZXJ0ZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2Njb252ZXJ0X3B0ciBjY29udmVydDsKLSAgaW50IGNpOwotCi0gIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCVNJWkVPRihteV9jb2xvcl9kZWNvbnZlcnRlcikpOwotICBjaW5mby0+Y2NvbnZlcnQgPSAoc3RydWN0IGpwZWdfY29sb3JfZGVjb252ZXJ0ZXIgKikgY2NvbnZlcnQ7Ci0gIGNjb252ZXJ0LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfZGNvbG9yOwotCi0gIC8qIE1ha2Ugc3VyZSBudW1fY29tcG9uZW50cyBhZ3JlZXMgd2l0aCBqcGVnX2NvbG9yX3NwYWNlICovCi0gIHN3aXRjaCAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UpIHsKLSAgY2FzZSBKQ1NfR1JBWVNDQUxFOgotICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gMSkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBKQ1NfUkdCOgotICBjYXNlIEpDU19ZQ2JDcjoKLSAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDMpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOwotICAgIGJyZWFrOwotCi0gIGNhc2UgSkNTX0NNWUs6Ci0gIGNhc2UgSkNTX1lDQ0s6Ci0gICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyAhPSA0KQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKLSAgICBicmVhazsKLQotICBkZWZhdWx0OgkJCS8qIEpDU19VTktOT1dOIGNhbiBiZSBhbnl0aGluZyAqLwotICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgPCAxKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKLSAgICBicmVhazsKLSAgfQotCi0gIC8qIFNldCBvdXRfY29sb3JfY29tcG9uZW50cyBhbmQgY29udmVyc2lvbiBtZXRob2QgYmFzZWQgb24gcmVxdWVzdGVkIHNwYWNlLgotICAgKiBBbHNvIGNsZWFyIHRoZSBjb21wb25lbnRfbmVlZGVkIGZsYWdzIGZvciBhbnkgdW51c2VkIGNvbXBvbmVudHMsCi0gICAqIHNvIHRoYXQgZWFybGllciBwaXBlbGluZSBzdGFnZXMgY2FuIGF2b2lkIHVzZWxlc3MgY29tcHV0YXRpb24uCi0gICAqLwotCi0gIHN3aXRjaCAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSkgewotICBjYXNlIEpDU19HUkFZU0NBTEU6Ci0gICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gMTsKLSAgICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSB8fAotCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19ZQ2JDcikgewotICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gZ3JheXNjYWxlX2NvbnZlcnQ7Ci0gICAgICAvKiBGb3IgY29sb3ItPmdyYXlzY2FsZSBjb252ZXJzaW9uLCBvbmx5IHRoZSBZICgwKSBjb21wb25lbnQgaXMgbmVlZGVkICovCi0gICAgICBmb3IgKGNpID0gMTsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspCi0JY2luZm8tPmNvbXBfaW5mb1tjaV0uY29tcG9uZW50X25lZWRlZCA9IEZBTFNFOwotICAgIH0gZWxzZQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOwotICAgIGJyZWFrOwotCi0gIGNhc2UgSkNTX1JHQjoKLSAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSBSR0JfUElYRUxTSVpFOwotICAgIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpIHsKLSAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IHljY19yZ2JfY29udmVydDsKLSAgICAgIGJ1aWxkX3ljY19yZ2JfdGFibGUoY2luZm8pOwotICAgIH0gZWxzZSBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSkgewotICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gZ3JheV9yZ2JfY29udmVydDsKLSAgICB9IGVsc2UgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19SR0IgJiYgUkdCX1BJWEVMU0laRSA9PSAzKSB7Ci0gICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBudWxsX2NvbnZlcnQ7Ci0gICAgfSBlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBKQ1NfQ01ZSzoKLSAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSA0OwotICAgIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNDSykgewotICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0geWNja19jbXlrX2NvbnZlcnQ7Ci0gICAgICBidWlsZF95Y2NfcmdiX3RhYmxlKGNpbmZvKTsKLSAgICB9IGVsc2UgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19DTVlLKSB7Ci0gICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBudWxsX2NvbnZlcnQ7Ci0gICAgfSBlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoKLSAgICAvKiBQZXJtaXQgbnVsbCBjb252ZXJzaW9uIHRvIHNhbWUgb3V0cHV0IHNwYWNlICovCi0gICAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UpIHsKLSAgICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKLSAgICB9IGVsc2UJCQkvKiB1bnN1cHBvcnRlZCBub24tbnVsbCBjb252ZXJzaW9uICovCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykKLSAgICBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMgPSAxOyAvKiBzaW5nbGUgY29sb3JtYXBwZWQgb3V0cHV0IGNvbXBvbmVudCAqLwotICBlbHNlCi0gICAgY2luZm8tPm91dHB1dF9jb21wb25lbnRzID0gY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzOwotfQotCi0jZW5kaWYgLy9fRlhfSlBFR19UVVJCT18KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkZGN0bWdyLmMgYi9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZGRjdG1nci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjI2NDU2Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkZGN0bWdyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotI2lmICFkZWZpbmVkKF9GWF9KUEVHX1RVUkJPXykKLS8qCi0gKiBqZGRjdG1nci5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGludmVyc2UtRENUIG1hbmFnZW1lbnQgbG9naWMuCi0gKiBUaGlzIGNvZGUgc2VsZWN0cyBhIHBhcnRpY3VsYXIgSURDVCBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkLAotICogYW5kIGl0IHBlcmZvcm1zIHJlbGF0ZWQgaG91c2VrZWVwaW5nIGNob3Jlcy4gIE5vIGNvZGUgaW4gdGhpcyBmaWxlCi0gKiBpcyBleGVjdXRlZCBwZXIgSURDVCBzdGVwLCBvbmx5IGR1cmluZyBvdXRwdXQgcGFzcyBzZXR1cC4KLSAqCi0gKiBOb3RlIHRoYXQgdGhlIElEQ1Qgcm91dGluZXMgYXJlIHJlc3BvbnNpYmxlIGZvciBwZXJmb3JtaW5nIGNvZWZmaWNpZW50Ci0gKiBkZXF1YW50aXphdGlvbiBhcyB3ZWxsIGFzIHRoZSBJRENUIHByb3Blci4gIFRoaXMgbW9kdWxlIHNldHMgdXAgdGhlCi0gKiBkZXF1YW50aXphdGlvbiBtdWx0aXBsaWVyIHRhYmxlIG5lZWRlZCBieSB0aGUgSURDVCByb3V0aW5lLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLwotCi0KLS8qCi0gKiBUaGUgZGVjb21wcmVzc29yIGlucHV0IHNpZGUgKGpkaW5wdXQuYykgc2F2ZXMgYXdheSB0aGUgYXBwcm9wcmlhdGUKLSAqIHF1YW50aXphdGlvbiB0YWJsZSBmb3IgZWFjaCBjb21wb25lbnQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBzY2FuCi0gKiBpbnZvbHZpbmcgdGhhdCBjb21wb25lbnQuICAoVGhpcyBpcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gY29ycmVjdGx5Ci0gKiBkZWNvZGUgZmlsZXMgdGhhdCByZXVzZSBRLXRhYmxlIHNsb3RzLikKLSAqIFdoZW4gd2UgYXJlIHJlYWR5IHRvIG1ha2UgYW4gb3V0cHV0IHBhc3MsIHRoZSBzYXZlZCBRLXRhYmxlIGlzIGNvbnZlcnRlZAotICogdG8gYSBtdWx0aXBsaWVyIHRhYmxlIHRoYXQgd2lsbCBhY3R1YWxseSBiZSB1c2VkIGJ5IHRoZSBJRENUIHJvdXRpbmUuCi0gKiBUaGUgbXVsdGlwbGllciB0YWJsZSBjb250ZW50cyBhcmUgSURDVC1tZXRob2QtZGVwZW5kZW50LiAgVG8gc3VwcG9ydAotICogYXBwbGljYXRpb24gY2hhbmdlcyBpbiBJRENUIG1ldGhvZCBiZXR3ZWVuIHNjYW5zLCB3ZSBjYW4gcmVtYWtlIHRoZQotICogbXVsdGlwbGllciB0YWJsZXMgaWYgbmVjZXNzYXJ5LgotICogSW4gYnVmZmVyZWQtaW1hZ2UgbW9kZSwgdGhlIGZpcnN0IG91dHB1dCBwYXNzIG1heSBvY2N1ciBiZWZvcmUgYW55IGRhdGEKLSAqIGhhcyBiZWVuIHNlZW4gZm9yIHNvbWUgY29tcG9uZW50cywgYW5kIHRodXMgYmVmb3JlIHRoZWlyIFEtdGFibGVzIGhhdmUKLSAqIGJlZW4gc2F2ZWQgYXdheS4gIFRvIGhhbmRsZSB0aGlzIGNhc2UsIG11bHRpcGxpZXIgdGFibGVzIGFyZSBwcmVzZXQKLSAqIHRvIHplcm9lczsgdGhlIHJlc3VsdCBvZiB0aGUgSURDVCB3aWxsIGJlIGEgbmV1dHJhbCBncmF5IGxldmVsLgotICovCi0KLQotLyogUHJpdmF0ZSBzdWJvYmplY3QgZm9yIHRoaXMgbW9kdWxlICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGpwZWdfaW52ZXJzZV9kY3QgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgLyogVGhpcyBhcnJheSBjb250YWlucyB0aGUgSURDVCBtZXRob2QgY29kZSB0aGF0IGVhY2ggbXVsdGlwbGllciB0YWJsZQotICAgKiBpcyBjdXJyZW50bHkgc2V0IHVwIGZvciwgb3IgLTEgaWYgaXQncyBub3QgeWV0IHNldCB1cC4KLSAgICogVGhlIGFjdHVhbCBtdWx0aXBsaWVyIHRhYmxlcyBhcmUgcG9pbnRlZCB0byBieSBkY3RfdGFibGUgaW4gdGhlCi0gICAqIHBlci1jb21wb25lbnQgY29tcF9pbmZvIHN0cnVjdHVyZXMuCi0gICAqLwotICBpbnQgY3VyX21ldGhvZFtNQVhfQ09NUE9ORU5UU107Ci19IG15X2lkY3RfY29udHJvbGxlcjsKLQotdHlwZWRlZiBteV9pZGN0X2NvbnRyb2xsZXIgKiBteV9pZGN0X3B0cjsKLQotCi0vKiBBbGxvY2F0ZWQgbXVsdGlwbGllciB0YWJsZXM6IGJpZyBlbm91Z2ggZm9yIGFueSBzdXBwb3J0ZWQgdmFyaWFudCAqLwotCi10eXBlZGVmIHVuaW9uIHsKLSAgSVNMT1dfTVVMVF9UWVBFIGlzbG93X2FycmF5W0RDVFNJWkUyXTsKLSNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECi0gIElGQVNUX01VTFRfVFlQRSBpZmFzdF9hcnJheVtEQ1RTSVpFMl07Ci0jZW5kaWYKLSNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECi0gIEZMT0FUX01VTFRfVFlQRSBmbG9hdF9hcnJheVtEQ1RTSVpFMl07Ci0jZW5kaWYKLX0gbXVsdGlwbGllcl90YWJsZTsKLQotCi0vKiBUaGUgY3VycmVudCBzY2FsZWQtSURDVCByb3V0aW5lcyByZXF1aXJlIElTTE9XLXN0eWxlIG11bHRpcGxpZXIgdGFibGVzLAotICogc28gYmUgc3VyZSB0byBjb21waWxlIHRoYXQgY29kZSBpZiBlaXRoZXIgSVNMT1cgb3IgU0NBTElORyBpcyByZXF1ZXN0ZWQuCi0gKi8KLSNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECi0jZGVmaW5lIFBST1ZJREVfSVNMT1dfVEFCTEVTCi0jZWxzZQotI2lmZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURUQKLSNkZWZpbmUgUFJPVklERV9JU0xPV19UQUJMRVMKLSNlbmRpZgotI2VuZGlmCi0KLQotLyoKLSAqIFByZXBhcmUgZm9yIGFuIG91dHB1dCBwYXNzLgotICogSGVyZSB3ZSBzZWxlY3QgdGhlIHByb3BlciBJRENUIHJvdXRpbmUgZm9yIGVhY2ggY29tcG9uZW50IGFuZCBidWlsZAotICogYSBtYXRjaGluZyBtdWx0aXBsaWVyIHRhYmxlLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfaWRjdF9wdHIgaWRjdCA9IChteV9pZGN0X3B0cikgY2luZm8tPmlkY3Q7Ci0gIGludCBjaSwgaTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgaW50IG1ldGhvZCA9IDA7Ci0gIGludmVyc2VfRENUX21ldGhvZF9wdHIgbWV0aG9kX3B0ciA9IE5VTEw7Ci0gIEpRVUFOVF9UQkwgKiBxdGJsOwotCi0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgLyogU2VsZWN0IHRoZSBwcm9wZXIgSURDVCByb3V0aW5lIGZvciB0aGlzIGNvbXBvbmVudCdzIHNjYWxpbmcgKi8KLSAgICBzd2l0Y2ggKGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSkgewotI2lmZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURUQKLSAgICBjYXNlIDE6Ci0gICAgICBtZXRob2RfcHRyID0ganBlZ19pZGN0XzF4MTsKLSAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGppZGN0cmVkIHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfMngyOwotICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamlkY3RyZWQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF80eDQ7Ci0gICAgICBtZXRob2QgPSBKRENUX0lTTE9XOwkvKiBqaWRjdHJlZCB1c2VzIGlzbG93LXN0eWxlIHRhYmxlICovCi0gICAgICBicmVhazsKLSNlbmRpZgotICAgIGNhc2UgRENUU0laRToKLSAgICAgIHN3aXRjaCAoY2luZm8tPmRjdF9tZXRob2QpIHsKLSNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECi0gICAgICBjYXNlIEpEQ1RfSVNMT1c6Ci0JbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF9pc2xvdzsKLQltZXRob2QgPSBKRENUX0lTTE9XOwotCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAotICAgICAgY2FzZSBKRENUX0lGQVNUOgotCW1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfaWZhc3Q7Ci0JbWV0aG9kID0gSkRDVF9JRkFTVDsKLQlicmVhazsKLSNlbmRpZgotI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKLSAgICAgIGNhc2UgSkRDVF9GTE9BVDoKLQltZXRob2RfcHRyID0ganBlZ19pZGN0X2Zsb2F0OwotCW1ldGhvZCA9IEpEQ1RfRkxPQVQ7Ci0JYnJlYWs7Ci0jZW5kaWYKLSAgICAgIGRlZmF1bHQ6Ci0JRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOwotCWJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9EQ1RTSVpFLCBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlkY3QtPnB1Yi5pbnZlcnNlX0RDVFtjaV0gPSBtZXRob2RfcHRyOwotICAgIC8qIENyZWF0ZSBtdWx0aXBsaWVyIHRhYmxlIGZyb20gcXVhbnQgdGFibGUuCi0gICAgICogSG93ZXZlciwgd2UgY2FuIHNraXAgdGhpcyBpZiB0aGUgY29tcG9uZW50IGlzIHVuaW50ZXJlc3RpbmcKLSAgICAgKiBvciBpZiB3ZSBhbHJlYWR5IGJ1aWx0IHRoZSB0YWJsZS4gIEFsc28sIGlmIG5vIHF1YW50IHRhYmxlCi0gICAgICogaGFzIHlldCBiZWVuIHNhdmVkIGZvciB0aGUgY29tcG9uZW50LCB3ZSBsZWF2ZSB0aGUKLSAgICAgKiBtdWx0aXBsaWVyIHRhYmxlIGFsbC16ZXJvOyB3ZSdsbCBiZSByZWFkaW5nIHplcm9lcyBmcm9tIHRoZQotICAgICAqIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIncyBidWZmZXIgYW55d2F5LgotICAgICAqLwotICAgIGlmICghIGNvbXBwdHItPmNvbXBvbmVudF9uZWVkZWQgfHwgaWRjdC0+Y3VyX21ldGhvZFtjaV0gPT0gbWV0aG9kKQotICAgICAgY29udGludWU7Ci0gICAgcXRibCA9IGNvbXBwdHItPnF1YW50X3RhYmxlOwotICAgIGlmIChxdGJsID09IE5VTEwpCQkvKiBoYXBwZW5zIGlmIG5vIGRhdGEgeWV0IGZvciBjb21wb25lbnQgKi8KLSAgICAgIGNvbnRpbnVlOwotICAgIGlkY3QtPmN1cl9tZXRob2RbY2ldID0gbWV0aG9kOwotICAgIHN3aXRjaCAobWV0aG9kKSB7Ci0jaWZkZWYgUFJPVklERV9JU0xPV19UQUJMRVMKLSAgICBjYXNlIEpEQ1RfSVNMT1c6Ci0gICAgICB7Ci0JLyogRm9yIExMJk0gSURDVCBtZXRob2QsIG11bHRpcGxpZXJzIGFyZSBlcXVhbCB0byByYXcgcXVhbnRpemF0aW9uCi0JICogY29lZmZpY2llbnRzLCBidXQgYXJlIHN0b3JlZCBhcyBpbnRzIHRvIGVuc3VyZSBhY2Nlc3MgZWZmaWNpZW5jeS4KLQkgKi8KLQlJU0xPV19NVUxUX1RZUEUgKiBpc210YmwgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKLQlmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgewotCSAgaXNtdGJsW2ldID0gKElTTE9XX01VTFRfVFlQRSkgcXRibC0+cXVhbnR2YWxbaV07Ci0JfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECi0gICAgY2FzZSBKRENUX0lGQVNUOgotICAgICAgewotCS8qIEZvciBBQSZOIElEQ1QgbWV0aG9kLCBtdWx0aXBsaWVycyBhcmUgZXF1YWwgdG8gcXVhbnRpemF0aW9uCi0JICogY29lZmZpY2llbnRzIHNjYWxlZCBieSBzY2FsZWZhY3Rvcltyb3ddKnNjYWxlZmFjdG9yW2NvbF0sIHdoZXJlCi0JICogICBzY2FsZWZhY3RvclswXSA9IDEKLQkgKiAgIHNjYWxlZmFjdG9yW2tdID0gY29zKGsqUEkvMTYpICogc3FydCgyKSAgICBmb3Igaz0xLi43Ci0JICogRm9yIGludGVnZXIgb3BlcmF0aW9uLCB0aGUgbXVsdGlwbGllciB0YWJsZSBpcyB0byBiZSBzY2FsZWQgYnkKLQkgKiBJRkFTVF9TQ0FMRV9CSVRTLgotCSAqLwotCUlGQVNUX01VTFRfVFlQRSAqIGlmbXRibCA9IChJRkFTVF9NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOwotI2RlZmluZSBDT05TVF9CSVRTIDE0Ci0Jc3RhdGljIGNvbnN0IElOVDE2IGFhbnNjYWxlc1tEQ1RTSVpFMl0gPSB7Ci0JICAvKiBwcmVjb21wdXRlZCB2YWx1ZXMgc2NhbGVkIHVwIGJ5IDE0IGJpdHMgKi8KLQkgIDE2Mzg0LCAyMjcyNSwgMjE0MDcsIDE5MjY2LCAxNjM4NCwgMTI4NzMsICA4ODY3LCAgNDUyMCwKLQkgIDIyNzI1LCAzMTUyMSwgMjk2OTIsIDI2NzIyLCAyMjcyNSwgMTc4NTUsIDEyMjk5LCAgNjI3MCwKLQkgIDIxNDA3LCAyOTY5MiwgMjc5NjksIDI1MTcyLCAyMTQwNywgMTY4MTksIDExNTg1LCAgNTkwNiwKLQkgIDE5MjY2LCAyNjcyMiwgMjUxNzIsIDIyNjU0LCAxOTI2NiwgMTUxMzcsIDEwNDI2LCAgNTMxNSwKLQkgIDE2Mzg0LCAyMjcyNSwgMjE0MDcsIDE5MjY2LCAxNjM4NCwgMTI4NzMsICA4ODY3LCAgNDUyMCwKLQkgIDEyODczLCAxNzg1NSwgMTY4MTksIDE1MTM3LCAxMjg3MywgMTAxMTQsICA2OTY3LCAgMzU1MiwKLQkgICA4ODY3LCAxMjI5OSwgMTE1ODUsIDEwNDI2LCAgODg2NywgIDY5NjcsICA0Nzk5LCAgMjQ0NiwKLQkgICA0NTIwLCAgNjI3MCwgIDU5MDYsICA1MzE1LCAgNDUyMCwgIDM1NTIsICAyNDQ2LCAgMTI0NwotCX07Ci0JU0hJRlRfVEVNUFMKLQotCWZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7Ci0JICBpZm10YmxbaV0gPSAoSUZBU1RfTVVMVF9UWVBFKQotCSAgICBERVNDQUxFKE1VTFRJUExZMTZWMTYoKElOVDMyKSBxdGJsLT5xdWFudHZhbFtpXSwKLQkJCQkgIChJTlQzMikgYWFuc2NhbGVzW2ldKSwKLQkJICAgIENPTlNUX0JJVFMtSUZBU1RfU0NBTEVfQklUUyk7Ci0JfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECi0gICAgY2FzZSBKRENUX0ZMT0FUOgotICAgICAgewotCS8qIEZvciBmbG9hdCBBQSZOIElEQ1QgbWV0aG9kLCBtdWx0aXBsaWVycyBhcmUgZXF1YWwgdG8gcXVhbnRpemF0aW9uCi0JICogY29lZmZpY2llbnRzIHNjYWxlZCBieSBzY2FsZWZhY3Rvcltyb3ddKnNjYWxlZmFjdG9yW2NvbF0sIHdoZXJlCi0JICogICBzY2FsZWZhY3RvclswXSA9IDEKLQkgKiAgIHNjYWxlZmFjdG9yW2tdID0gY29zKGsqUEkvMTYpICogc3FydCgyKSAgICBmb3Igaz0xLi43Ci0JICovCi0JRkxPQVRfTVVMVF9UWVBFICogZm10YmwgPSAoRkxPQVRfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKLQlpbnQgcm93LCBjb2w7Ci0Jc3RhdGljIGNvbnN0IGRvdWJsZSBhYW5zY2FsZWZhY3RvcltEQ1RTSVpFXSA9IHsKLQkgIDEuMCwgMS4zODcwMzk4NDUsIDEuMzA2NTYyOTY1LCAxLjE3NTg3NTYwMiwKLQkgIDEuMCwgMC43ODU2OTQ5NTgsIDAuNTQxMTk2MTAwLCAwLjI3NTg5OTM3OQotCX07Ci0KLQlpID0gMDsKLQlmb3IgKHJvdyA9IDA7IHJvdyA8IERDVFNJWkU7IHJvdysrKSB7Ci0JICBmb3IgKGNvbCA9IDA7IGNvbCA8IERDVFNJWkU7IGNvbCsrKSB7Ci0JICAgIGZtdGJsW2ldID0gKEZMT0FUX01VTFRfVFlQRSkKLQkgICAgICAoKGRvdWJsZSkgcXRibC0+cXVhbnR2YWxbaV0gKgotCSAgICAgICBhYW5zY2FsZWZhY3Rvcltyb3ddICogYWFuc2NhbGVmYWN0b3JbY29sXSk7Ci0JICAgIGkrKzsKLQkgIH0KLQl9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKgotICogSW5pdGlhbGl6ZSBJRENUIG1hbmFnZXIuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9pbnZlcnNlX2RjdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfaWRjdF9wdHIgaWRjdDsKLSAgaW50IGNpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotCi0gIGlkY3QgPSAobXlfaWRjdF9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfaWRjdF9jb250cm9sbGVyKSk7Ci0gIGNpbmZvLT5pZGN0ID0gKHN0cnVjdCBqcGVnX2ludmVyc2VfZGN0ICopIGlkY3Q7Ci0gIGlkY3QtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzczsKLQotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIC8qIEFsbG9jYXRlIGFuZCBwcmUtemVybyBhIG11bHRpcGxpZXIgdGFibGUgZm9yIGVhY2ggY29tcG9uZW50ICovCi0gICAgY29tcHB0ci0+ZGN0X3RhYmxlID0KLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBTSVpFT0YobXVsdGlwbGllcl90YWJsZSkpOwotICAgIE1FTVpFUk8oY29tcHB0ci0+ZGN0X3RhYmxlLCBTSVpFT0YobXVsdGlwbGllcl90YWJsZSkpOwotICAgIC8qIE1hcmsgbXVsdGlwbGllciB0YWJsZSBub3QgeWV0IHNldCB1cCBmb3IgYW55IG1ldGhvZCAqLwotICAgIGlkY3QtPmN1cl9tZXRob2RbY2ldID0gLTE7Ci0gIH0KLX0KLQotI2VuZGlmIC8vX0ZYX0pQRUdfVFVSQk9fCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZGh1ZmYuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkaHVmZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzM3ZGI1Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkaHVmZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjU3ICswLDAgQEAKLSNpZiAhZGVmaW5lZChfRlhfSlBFR19UVVJCT18pCi0vKgotICogamRodWZmLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBIdWZmbWFuIGVudHJvcHkgZGVjb2Rpbmcgcm91dGluZXMuCi0gKgotICogTXVjaCBvZiB0aGUgY29tcGxleGl0eSBoZXJlIGhhcyB0byBkbyB3aXRoIHN1cHBvcnRpbmcgaW5wdXQgc3VzcGVuc2lvbi4KLSAqIElmIHRoZSBkYXRhIHNvdXJjZSBtb2R1bGUgZGVtYW5kcyBzdXNwZW5zaW9uLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gYmFjawotICogdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IE1DVS4gIFRvIGRvIHRoaXMsIHdlIGNvcHkgc3RhdGUgdmFyaWFibGVzCi0gKiBpbnRvIGxvY2FsIHdvcmtpbmcgc3RvcmFnZSwgYW5kIHVwZGF0ZSB0aGVtIGJhY2sgdG8gdGhlIHBlcm1hbmVudAotICogc3RvcmFnZSBvbmx5IHVwb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIGFuIE1DVS4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiamRodWZmLmgiCQkvKiBEZWNsYXJhdGlvbnMgc2hhcmVkIHdpdGggamRwaHVmZi5jICovCi0KLSNpZmRlZiBfRlhfTUFOQUdFRF9DT0RFXwotI2RlZmluZSBzYXZhYmxlX3N0YXRlCXNhdmFibGVfc3RhdGVfZAotI2VuZGlmCi0KLS8qCi0gKiBFeHBhbmRlZCBlbnRyb3B5IGRlY29kZXIgb2JqZWN0IGZvciBIdWZmbWFuIGRlY29kaW5nLgotICoKLSAqIFRoZSBzYXZhYmxlX3N0YXRlIHN1YnJlY29yZCBjb250YWlucyBmaWVsZHMgdGhhdCBjaGFuZ2Ugd2l0aGluIGFuIE1DVSwKLSAqIGJ1dCBtdXN0IG5vdCBiZSB1cGRhdGVkIHBlcm1hbmVudGx5IHVudGlsIHdlIGNvbXBsZXRlIHRoZSBNQ1UuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBpbnQgbGFzdF9kY192YWxbTUFYX0NPTVBTX0lOX1NDQU5dOyAvKiBsYXN0IERDIGNvZWYgZm9yIGVhY2ggY29tcG9uZW50ICovCi19IHNhdmFibGVfc3RhdGU7Ci0KLS8qIFRoaXMgbWFjcm8gaXMgdG8gd29yayBhcm91bmQgY29tcGlsZXJzIHdpdGggbWlzc2luZyBvciBicm9rZW4KLSAqIHN0cnVjdHVyZSBhc3NpZ25tZW50LiAgWW91J2xsIG5lZWQgdG8gZml4IHRoaXMgY29kZSBpZiB5b3UgaGF2ZQotICogc3VjaCBhIGNvbXBpbGVyIGFuZCB5b3UgY2hhbmdlIE1BWF9DT01QU19JTl9TQ0FOLgotICovCi0KLSNpZm5kZWYgTk9fU1RSVUNUX0FTU0lHTgotI2RlZmluZSBBU1NJR05fU1RBVEUoZGVzdCxzcmMpICAoKGRlc3QpID0gKHNyYykpCi0jZWxzZQotI2lmIE1BWF9DT01QU19JTl9TQ0FOID09IDQKLSNkZWZpbmUgQVNTSUdOX1NUQVRFKGRlc3Qsc3JjKSAgXAotCSgoZGVzdCkubGFzdF9kY192YWxbMF0gPSAoc3JjKS5sYXN0X2RjX3ZhbFswXSwgXAotCSAoZGVzdCkubGFzdF9kY192YWxbMV0gPSAoc3JjKS5sYXN0X2RjX3ZhbFsxXSwgXAotCSAoZGVzdCkubGFzdF9kY192YWxbMl0gPSAoc3JjKS5sYXN0X2RjX3ZhbFsyXSwgXAotCSAoZGVzdCkubGFzdF9kY192YWxbM10gPSAoc3JjKS5sYXN0X2RjX3ZhbFszXSkKLSNlbmRpZgotI2VuZGlmCi0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19lbnRyb3B5X2RlY29kZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgLyogVGhlc2UgZmllbGRzIGFyZSBsb2FkZWQgaW50byBsb2NhbCB2YXJpYWJsZXMgYXQgc3RhcnQgb2YgZWFjaCBNQ1UuCi0gICAqIEluIGNhc2Ugb2Ygc3VzcGVuc2lvbiwgd2UgZXhpdCBXSVRIT1VUIHVwZGF0aW5nIHRoZW0uCi0gICAqLwotICBiaXRyZWFkX3Blcm1fc3RhdGUgYml0c3RhdGU7CS8qIEJpdCBidWZmZXIgYXQgc3RhcnQgb2YgTUNVICovCi0gIHNhdmFibGVfc3RhdGUgc2F2ZWQ7CQkvKiBPdGhlciBzdGF0ZSBhdCBzdGFydCBvZiBNQ1UgKi8KLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIE5PVCBsb2FkZWQgaW50byBsb2NhbCB3b3JraW5nIHN0YXRlLiAqLwotICB1bnNpZ25lZCBpbnQgcmVzdGFydHNfdG9fZ287CS8qIE1DVXMgbGVmdCBpbiB0aGlzIHJlc3RhcnQgaW50ZXJ2YWwgKi8KLQotICAvKiBQb2ludGVycyB0byBkZXJpdmVkIHRhYmxlcyAodGhlc2Ugd29ya3NwYWNlcyBoYXZlIGltYWdlIGxpZmVzcGFuKSAqLwotICBkX2Rlcml2ZWRfdGJsICogZGNfZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOwotICBkX2Rlcml2ZWRfdGJsICogYWNfZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOwotCi0gIC8qIFByZWNhbGN1bGF0ZWQgaW5mbyBzZXQgdXAgYnkgc3RhcnRfcGFzcyBmb3IgdXNlIGluIGRlY29kZV9tY3U6ICovCi0KLSAgLyogUG9pbnRlcnMgdG8gZGVyaXZlZCB0YWJsZXMgdG8gYmUgdXNlZCBmb3IgZWFjaCBibG9jayB3aXRoaW4gYW4gTUNVICovCi0gIGRfZGVyaXZlZF90YmwgKiBkY19jdXJfdGJsc1tEX01BWF9CTE9DS1NfSU5fTUNVXTsKLSAgZF9kZXJpdmVkX3RibCAqIGFjX2N1cl90YmxzW0RfTUFYX0JMT0NLU19JTl9NQ1VdOwotICAvKiBXaGV0aGVyIHdlIGNhcmUgYWJvdXQgdGhlIERDIGFuZCBBQyBjb2VmZmljaWVudCB2YWx1ZXMgZm9yIGVhY2ggYmxvY2sgKi8KLSAgYm9vbGVhbiBkY19uZWVkZWRbRF9NQVhfQkxPQ0tTX0lOX01DVV07Ci0gIGJvb2xlYW4gYWNfbmVlZGVkW0RfTUFYX0JMT0NLU19JTl9NQ1VdOwotfSBodWZmX2VudHJvcHlfZGVjb2RlcjsKLQotdHlwZWRlZiBodWZmX2VudHJvcHlfZGVjb2RlciAqIGh1ZmZfZW50cm9weV9wdHI7Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIGEgSHVmZm1hbi1jb21wcmVzc2VkIHNjYW4uCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9wYXNzX2h1ZmZfZGVjb2RlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICBpbnQgY2ksIGJsa24sIGRjdGJsLCBhY3RibDsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7Ci0KLSAgLyogQ2hlY2sgdGhhdCB0aGUgc2NhbiBwYXJhbWV0ZXJzIFNzLCBTZSwgQWgvQWwgYXJlIE9LIGZvciBzZXF1ZW50aWFsIEpQRUcuCi0gICAqIFRoaXMgb3VnaHQgdG8gYmUgYW4gZXJyb3IgY29uZGl0aW9uLCBidXQgd2UgbWFrZSBpdCBhIHdhcm5pbmcgYmVjYXVzZQotICAgKiB0aGVyZSBhcmUgc29tZSBiYXNlbGluZSBmaWxlcyBvdXQgdGhlcmUgd2l0aCBhbGwgemVyb2VzIGluIHRoZXNlIGJ5dGVzLgotICAgKi8KLSAgaWYgKGNpbmZvLT5TcyAhPSAwIHx8IGNpbmZvLT5TZSAhPSBEQ1RTSVpFMi0xIHx8Ci0gICAgICBjaW5mby0+QWggIT0gMCB8fCBjaW5mby0+QWwgIT0gMCkKLSAgICBXQVJOTVMoY2luZm8sIEpXUk5fTk9UX1NFUVVFTlRJQUwpOwotCi0gIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0gICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLSAgICBkY3RibCA9IGNvbXBwdHItPmRjX3RibF9ubzsKLSAgICBhY3RibCA9IGNvbXBwdHItPmFjX3RibF9ubzsKLSAgICAvKiBDb21wdXRlIGRlcml2ZWQgdmFsdWVzIGZvciBIdWZmbWFuIHRhYmxlcyAqLwotICAgIC8qIFdlIG1heSBkbyB0aGlzIG1vcmUgdGhhbiBvbmNlIGZvciBhIHRhYmxlLCBidXQgaXQncyBub3QgZXhwZW5zaXZlICovCi0gICAganBlZ19tYWtlX2RfZGVyaXZlZF90YmwoY2luZm8sIFRSVUUsIGRjdGJsLAotCQkJICAgICYgZW50cm9weS0+ZGNfZGVyaXZlZF90YmxzW2RjdGJsXSk7Ci0gICAganBlZ19tYWtlX2RfZGVyaXZlZF90YmwoY2luZm8sIEZBTFNFLCBhY3RibCwKLQkJCSAgICAmIGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsc1thY3RibF0pOwotICAgIC8qIEluaXRpYWxpemUgREMgcHJlZGljdGlvbnMgdG8gMCAqLwotICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IDA7Ci0gIH0KLQotICAvKiBQcmVjYWxjdWxhdGUgZGVjb2RpbmcgaW5mbyBmb3IgZWFjaCBibG9jayBpbiBhbiBNQ1Ugb2YgdGhpcyBzY2FuICovCi0gIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7Ci0gICAgY2kgPSBjaW5mby0+TUNVX21lbWJlcnNoaXBbYmxrbl07Ci0gICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLSAgICAvKiBQcmVjYWxjdWxhdGUgd2hpY2ggdGFibGUgdG8gdXNlIGZvciBlYWNoIGJsb2NrICovCi0gICAgZW50cm9weS0+ZGNfY3VyX3RibHNbYmxrbl0gPSBlbnRyb3B5LT5kY19kZXJpdmVkX3RibHNbY29tcHB0ci0+ZGNfdGJsX25vXTsKLSAgICBlbnRyb3B5LT5hY19jdXJfdGJsc1tibGtuXSA9IGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsc1tjb21wcHRyLT5hY190Ymxfbm9dOwotICAgIC8qIERlY2lkZSB3aGV0aGVyIHdlIHJlYWxseSBjYXJlIGFib3V0IHRoZSBjb2VmZmljaWVudCB2YWx1ZXMgKi8KLSAgICBpZiAoY29tcHB0ci0+Y29tcG9uZW50X25lZWRlZCkgewotICAgICAgZW50cm9weS0+ZGNfbmVlZGVkW2Jsa25dID0gVFJVRTsKLSAgICAgIC8qIHdlIGRvbid0IG5lZWQgdGhlIEFDcyBpZiBwcm9kdWNpbmcgYSAxLzh0aC1zaXplIGltYWdlICovCi0gICAgICBlbnRyb3B5LT5hY19uZWVkZWRbYmxrbl0gPSAoY29tcHB0ci0+RENUX3NjYWxlZF9zaXplID4gMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGVudHJvcHktPmRjX25lZWRlZFtibGtuXSA9IGVudHJvcHktPmFjX25lZWRlZFtibGtuXSA9IEZBTFNFOwotICAgIH0KLSAgfQotCi0gIC8qIEluaXRpYWxpemUgYml0cmVhZCBzdGF0ZSB2YXJpYWJsZXMgKi8KLSAgZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0ID0gMDsKLSAgZW50cm9weS0+Yml0c3RhdGUuZ2V0X2J1ZmZlciA9IDA7IC8qIHVubmVjZXNzYXJ5LCBidXQga2VlcHMgUHVyaWZ5IHF1aWV0ICovCi0gIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSA9IEZBTFNFOwotCi0gIC8qIEluaXRpYWxpemUgcmVzdGFydCBjb3VudGVyICovCi0gIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7Ci19Ci0KLQotLyoKLSAqIENvbXB1dGUgdGhlIGRlcml2ZWQgdmFsdWVzIGZvciBhIEh1ZmZtYW4gdGFibGUuCi0gKiBUaGlzIHJvdXRpbmUgYWxzbyBwZXJmb3JtcyBzb21lIHZhbGlkYXRpb24gY2hlY2tzIG9uIHRoZSB0YWJsZS4KLSAqCi0gKiBOb3RlIHRoaXMgaXMgYWxzbyB1c2VkIGJ5IGpkcGh1ZmYuYy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfbWFrZV9kX2Rlcml2ZWRfdGJsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGlzREMsIGludCB0YmxubywKLQkJCSBkX2Rlcml2ZWRfdGJsICoqIHBkdGJsKQotewotICBKSFVGRl9UQkwgKmh0Ymw7Ci0gIGRfZGVyaXZlZF90YmwgKmR0Ymw7Ci0gIGludCBwLCBpLCBsLCBfc2ksIG51bXN5bWJvbHM7Ci0gIGludCBsb29rYml0cywgY3RyOwotICBjaGFyIGh1ZmZzaXplWzI1N107Ci0gIHVuc2lnbmVkIGludCBodWZmY29kZVsyNTddOwotICB1bnNpZ25lZCBpbnQgY29kZTsKLQotICAvKiBOb3RlIHRoYXQgaHVmZnNpemVbXSBhbmQgaHVmZmNvZGVbXSBhcmUgZmlsbGVkIGluIGNvZGUtbGVuZ3RoIG9yZGVyLAotICAgKiBwYXJhbGxlbGluZyB0aGUgb3JkZXIgb2YgdGhlIHN5bWJvbHMgdGhlbXNlbHZlcyBpbiBodGJsLT5odWZmdmFsW10uCi0gICAqLwotCi0gIC8qIEZpbmQgdGhlIGlucHV0IEh1ZmZtYW4gdGFibGUgKi8KLSAgaWYgKHRibG5vIDwgMCB8fCB0YmxubyA+PSBOVU1fSFVGRl9UQkxTKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIHRibG5vKTsKLSAgaHRibCA9Ci0gICAgaXNEQyA/IGNpbmZvLT5kY19odWZmX3RibF9wdHJzW3RibG5vXSA6IGNpbmZvLT5hY19odWZmX3RibF9wdHJzW3RibG5vXTsKLSAgaWYgKGh0YmwgPT0gTlVMTCkKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9OT19IVUZGX1RBQkxFLCB0Ymxubyk7Ci0KLSAgLyogQWxsb2NhdGUgYSB3b3Jrc3BhY2UgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGRvbmUgc28uICovCi0gIGlmICgqcGR0YmwgPT0gTlVMTCkKLSAgICAqcGR0YmwgPSAoZF9kZXJpdmVkX3RibCAqKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgIFNJWkVPRihkX2Rlcml2ZWRfdGJsKSk7Ci0gIGR0YmwgPSAqcGR0Ymw7Ci0gIGR0YmwtPnB1YiA9IGh0Ymw7CQkvKiBmaWxsIGluIGJhY2sgbGluayAqLwotICAKLSAgLyogRmlndXJlIEMuMTogbWFrZSB0YWJsZSBvZiBIdWZmbWFuIGNvZGUgbGVuZ3RoIGZvciBlYWNoIHN5bWJvbCAqLwotCi0gIHAgPSAwOwotICBmb3IgKGwgPSAxOyBsIDw9IDE2OyBsKyspIHsKLSAgICBpID0gKGludCkgaHRibC0+Yml0c1tsXTsKLSAgICBpZiAoaSA8IDAgfHwgcCArIGkgPiAyNTYpCS8qIHByb3RlY3QgYWdhaW5zdCB0YWJsZSBvdmVycnVuICovCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKLSAgICB3aGlsZSAoaS0tKQotICAgICAgaHVmZnNpemVbcCsrXSA9IChjaGFyKSBsOwotICB9Ci0gIGh1ZmZzaXplW3BdID0gMDsKLSAgbnVtc3ltYm9scyA9IHA7Ci0gIAotICAvKiBGaWd1cmUgQy4yOiBnZW5lcmF0ZSB0aGUgY29kZXMgdGhlbXNlbHZlcyAqLwotICAvKiBXZSBhbHNvIHZhbGlkYXRlIHRoYXQgdGhlIGNvdW50cyByZXByZXNlbnQgYSBsZWdhbCBIdWZmbWFuIGNvZGUgdHJlZS4gKi8KLSAgCi0gIGNvZGUgPSAwOwotICBfc2kgPSBodWZmc2l6ZVswXTsKLSAgcCA9IDA7Ci0gIHdoaWxlIChodWZmc2l6ZVtwXSkgewotICAgIHdoaWxlICgoKGludCkgaHVmZnNpemVbcF0pID09IF9zaSkgewotICAgICAgaHVmZmNvZGVbcCsrXSA9IGNvZGU7Ci0gICAgICBjb2RlKys7Ci0gICAgfQotICAgIC8qIGNvZGUgaXMgbm93IDEgbW9yZSB0aGFuIHRoZSBsYXN0IGNvZGUgdXNlZCBmb3IgY29kZWxlbmd0aCBzaTsgYnV0Ci0gICAgICogaXQgbXVzdCBzdGlsbCBmaXQgaW4gc2kgYml0cywgc2luY2Ugbm8gY29kZSBpcyBhbGxvd2VkIHRvIGJlIGFsbCBvbmVzLgotICAgICAqLwotICAgIGlmICgoKElOVDMyKSBjb2RlKSA+PSAoKChJTlQzMikgMSkgPDwgX3NpKSkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0hVRkZfVEFCTEUpOwotICAgIGNvZGUgPDw9IDE7Ci0gICAgX3NpKys7Ci0gIH0KLQotICAvKiBGaWd1cmUgRi4xNTogZ2VuZXJhdGUgZGVjb2RpbmcgdGFibGVzIGZvciBiaXQtc2VxdWVudGlhbCBkZWNvZGluZyAqLwotCi0gIHAgPSAwOwotICBmb3IgKGwgPSAxOyBsIDw9IDE2OyBsKyspIHsKLSAgICBpZiAoaHRibC0+Yml0c1tsXSkgewotICAgICAgLyogdmFsb2Zmc2V0W2xdID0gaHVmZnZhbFtdIGluZGV4IG9mIDFzdCBzeW1ib2wgb2YgY29kZSBsZW5ndGggbCwKLSAgICAgICAqIG1pbnVzIHRoZSBtaW5pbXVtIGNvZGUgb2YgbGVuZ3RoIGwKLSAgICAgICAqLwotICAgICAgZHRibC0+dmFsb2Zmc2V0W2xdID0gKElOVDMyKSBwIC0gKElOVDMyKSBodWZmY29kZVtwXTsKLSAgICAgIHAgKz0gaHRibC0+Yml0c1tsXTsKLSAgICAgIGR0YmwtPm1heGNvZGVbbF0gPSBodWZmY29kZVtwLTFdOyAvKiBtYXhpbXVtIGNvZGUgb2YgbGVuZ3RoIGwgKi8KLSAgICB9IGVsc2UgewotICAgICAgZHRibC0+bWF4Y29kZVtsXSA9IC0xOwkvKiAtMSBpZiBubyBjb2RlcyBvZiB0aGlzIGxlbmd0aCAqLwotICAgIH0KLSAgfQotICBkdGJsLT5tYXhjb2RlWzE3XSA9IDB4RkZGRkZMOyAvKiBlbnN1cmVzIGpwZWdfaHVmZl9kZWNvZGUgdGVybWluYXRlcyAqLwotCi0gIC8qIENvbXB1dGUgbG9va2FoZWFkIHRhYmxlcyB0byBzcGVlZCB1cCBkZWNvZGluZy4KLSAgICogRmlyc3Qgd2Ugc2V0IGFsbCB0aGUgdGFibGUgZW50cmllcyB0byAwLCBpbmRpY2F0aW5nICJ0b28gbG9uZyI7Ci0gICAqIHRoZW4gd2UgaXRlcmF0ZSB0aHJvdWdoIHRoZSBIdWZmbWFuIGNvZGVzIHRoYXQgYXJlIHNob3J0IGVub3VnaCBhbmQKLSAgICogZmlsbCBpbiBhbGwgdGhlIGVudHJpZXMgdGhhdCBjb3JyZXNwb25kIHRvIGJpdCBzZXF1ZW5jZXMgc3RhcnRpbmcKLSAgICogd2l0aCB0aGF0IGNvZGUuCi0gICAqLwotCi0gIE1FTVpFUk8oZHRibC0+bG9va19uYml0cywgU0laRU9GKGR0YmwtPmxvb2tfbmJpdHMpKTsKLQotICBwID0gMDsKLSAgZm9yIChsID0gMTsgbCA8PSBIVUZGX0xPT0tBSEVBRDsgbCsrKSB7Ci0gICAgZm9yIChpID0gMTsgaSA8PSAoaW50KSBodGJsLT5iaXRzW2xdOyBpKyssIHArKykgewotICAgICAgLyogbCA9IGN1cnJlbnQgY29kZSdzIGxlbmd0aCwgcCA9IGl0cyBpbmRleCBpbiBodWZmY29kZVtdICYgaHVmZnZhbFtdLiAqLwotICAgICAgLyogR2VuZXJhdGUgbGVmdC1qdXN0aWZpZWQgY29kZSBmb2xsb3dlZCBieSBhbGwgcG9zc2libGUgYml0IHNlcXVlbmNlcyAqLwotICAgICAgbG9va2JpdHMgPSBodWZmY29kZVtwXSA8PCAoSFVGRl9MT09LQUhFQUQtbCk7Ci0gICAgICBmb3IgKGN0ciA9IDEgPDwgKEhVRkZfTE9PS0FIRUFELWwpOyBjdHIgPiAwOyBjdHItLSkgewotCWR0YmwtPmxvb2tfbmJpdHNbbG9va2JpdHNdID0gbDsKLQlkdGJsLT5sb29rX3N5bVtsb29rYml0c10gPSBodGJsLT5odWZmdmFsW3BdOwotCWxvb2tiaXRzKys7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogVmFsaWRhdGUgc3ltYm9scyBhcyBiZWluZyByZWFzb25hYmxlLgotICAgKiBGb3IgQUMgdGFibGVzLCB3ZSBtYWtlIG5vIGNoZWNrLCBidXQgYWNjZXB0IGFsbCBieXRlIHZhbHVlcyAwLi4yNTUuCi0gICAqIEZvciBEQyB0YWJsZXMsIHdlIHJlcXVpcmUgdGhlIHN5bWJvbHMgdG8gYmUgaW4gcmFuZ2UgMC4uMTUuCi0gICAqIChUaWdodGVyIGJvdW5kcyBjb3VsZCBiZSBhcHBsaWVkIGRlcGVuZGluZyBvbiB0aGUgZGF0YSBkZXB0aCBhbmQgbW9kZSwKLSAgICogYnV0IHRoaXMgaXMgc3VmZmljaWVudCB0byBlbnN1cmUgc2FmZSBkZWNvZGluZy4pCi0gICAqLwotICBpZiAoaXNEQykgewotICAgIGZvciAoaSA9IDA7IGkgPCBudW1zeW1ib2xzOyBpKyspIHsKLSAgICAgIGludCBzeW0gPSBodGJsLT5odWZmdmFsW2ldOwotICAgICAgaWYgKHN5bSA8IDAgfHwgc3ltID4gMTUpCi0JRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSFVGRl9UQUJMRSk7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoKLSAqIE91dC1vZi1saW5lIGNvZGUgZm9yIGJpdCBmZXRjaGluZyAoc2hhcmVkIHdpdGggamRwaHVmZi5jKS4KLSAqIFNlZSBqZGh1ZmYuaCBmb3IgaW5mbyBhYm91dCB1c2FnZS4KLSAqIE5vdGU6IGN1cnJlbnQgdmFsdWVzIG9mIGdldF9idWZmZXIgYW5kIGJpdHNfbGVmdCBhcmUgcGFzc2VkIGFzIHBhcmFtZXRlcnMsCi0gKiBidXQgYXJlIHJldHVybmVkIGluIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkcyBvZiB0aGUgc3RhdGUgc3RydWN0LgotICoKLSAqIE9uIG1vc3QgbWFjaGluZXMgTUlOX0dFVF9CSVRTIHNob3VsZCBiZSAyNSB0byBhbGxvdyB0aGUgZnVsbCAzMi1iaXQgd2lkdGgKLSAqIG9mIGdldF9idWZmZXIgdG8gYmUgdXNlZC4gIChPbiBtYWNoaW5lcyB3aXRoIHdpZGVyIHdvcmRzLCBhbiBldmVuIGxhcmdlcgotICogYnVmZmVyIGNvdWxkIGJlIHVzZWQuKSAgSG93ZXZlciwgb24gc29tZSBtYWNoaW5lcyAzMi1iaXQgc2hpZnRzIGFyZQotICogcXVpdGUgc2xvdyBhbmQgdGFrZSB0aW1lIHByb3BvcnRpb25hbCB0byB0aGUgbnVtYmVyIG9mIHBsYWNlcyBzaGlmdGVkLgotICogKFRoaXMgaXMgdHJ1ZSB3aXRoIG1vc3QgUEMgY29tcGlsZXJzLCBmb3IgaW5zdGFuY2UuKSAgSW4gdGhpcyBjYXNlIGl0IG1heQotICogYmUgYSB3aW4gdG8gc2V0IE1JTl9HRVRfQklUUyB0byB0aGUgbWluaW11bSB2YWx1ZSBvZiAxNS4gIFRoaXMgcmVkdWNlcyB0aGUKLSAqIGF2ZXJhZ2Ugc2hpZnQgZGlzdGFuY2UgYXQgdGhlIGNvc3Qgb2YgbW9yZSBjYWxscyB0byBqcGVnX2ZpbGxfYml0X2J1ZmZlci4KLSAqLwotCi0jaWZkZWYgU0xPV19TSElGVF8zMgotI2RlZmluZSBNSU5fR0VUX0JJVFMgIDE1CS8qIG1pbmltdW0gYWxsb3dhYmxlIHZhbHVlICovCi0jZWxzZQotI2RlZmluZSBNSU5fR0VUX0JJVFMgIChCSVRfQlVGX1NJWkUtNykKLSNlbmRpZgotCi0KLUdMT0JBTChib29sZWFuKQotanBlZ19maWxsX2JpdF9idWZmZXIgKGJpdHJlYWRfd29ya2luZ19zdGF0ZSAqIHN0YXRlLAotCQkgICAgICByZWdpc3RlciBiaXRfYnVmX3R5cGUgZ2V0X2J1ZmZlciwgcmVnaXN0ZXIgaW50IGJpdHNfbGVmdCwKLQkJICAgICAgaW50IG5iaXRzKQotLyogTG9hZCB1cCB0aGUgYml0IGJ1ZmZlciB0byBhIGRlcHRoIG9mIGF0IGxlYXN0IG5iaXRzICovCi17Ci0gIC8qIENvcHkgaGVhdmlseSB1c2VkIHN0YXRlIGZpZWxkcyBpbnRvIGxvY2FscyAoaG9wZWZ1bGx5IHJlZ2lzdGVycykgKi8KLSAgcmVnaXN0ZXIgY29uc3QgSk9DVEVUICogbmV4dF9pbnB1dF9ieXRlID0gc3RhdGUtPm5leHRfaW5wdXRfYnl0ZTsKLSAgcmVnaXN0ZXIgc2l6ZV90IGJ5dGVzX2luX2J1ZmZlciA9IHN0YXRlLT5ieXRlc19pbl9idWZmZXI7Ci0gIGpfZGVjb21wcmVzc19wdHIgY2luZm8gPSBzdGF0ZS0+Y2luZm87Ci0KLSAgLyogQXR0ZW1wdCB0byBsb2FkIGF0IGxlYXN0IE1JTl9HRVRfQklUUyBiaXRzIGludG8gZ2V0X2J1ZmZlci4gKi8KLSAgLyogKEl0IGlzIGFzc3VtZWQgdGhhdCBubyByZXF1ZXN0IHdpbGwgYmUgZm9yIG1vcmUgdGhhbiB0aGF0IG1hbnkgYml0cy4pICovCi0gIC8qIFdlIGZhaWwgdG8gZG8gc28gb25seSBpZiB3ZSBoaXQgYSBtYXJrZXIgb3IgYXJlIGZvcmNlZCB0byBzdXNwZW5kLiAqLwotCi0gIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PSAwKSB7CS8qIGNhbm5vdCBhZHZhbmNlIHBhc3QgYSBtYXJrZXIgKi8KLSAgICB3aGlsZSAoYml0c19sZWZ0IDwgTUlOX0dFVF9CSVRTKSB7Ci0gICAgICByZWdpc3RlciBpbnQgYzsKLQotICAgICAgLyogQXR0ZW1wdCB0byByZWFkIGEgYnl0ZSAqLwotICAgICAgaWYgKGJ5dGVzX2luX2J1ZmZlciA9PSAwKSB7Ci0JaWYgKCEgKCpjaW5mby0+c3JjLT5maWxsX2lucHV0X2J1ZmZlcikgKGNpbmZvKSkKLQkgIHJldHVybiBGQUxTRTsKLQluZXh0X2lucHV0X2J5dGUgPSBjaW5mby0+c3JjLT5uZXh0X2lucHV0X2J5dGU7Ci0JYnl0ZXNfaW5fYnVmZmVyID0gY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyOwotICAgICAgfQotICAgICAgYnl0ZXNfaW5fYnVmZmVyLS07Ci0gICAgICBjID0gR0VUSk9DVEVUKCpuZXh0X2lucHV0X2J5dGUrKyk7Ci0KLSAgICAgIC8qIElmIGl0J3MgMHhGRiwgY2hlY2sgYW5kIGRpc2NhcmQgc3R1ZmZlZCB6ZXJvIGJ5dGUgKi8KLSAgICAgIGlmIChjID09IDB4RkYpIHsKLQkvKiBMb29wIGhlcmUgdG8gZGlzY2FyZCBhbnkgcGFkZGluZyBGRidzIG9uIHRlcm1pbmF0aW5nIG1hcmtlciwKLQkgKiBzbyB0aGF0IHdlIGNhbiBzYXZlIGEgdmFsaWQgdW5yZWFkX21hcmtlciB2YWx1ZS4gIE5PVEU6IHdlIHdpbGwKLQkgKiBhY2NlcHQgbXVsdGlwbGUgRkYncyBmb2xsb3dlZCBieSBhIDAgYXMgbWVhbmluZyBhIHNpbmdsZSBGRiBkYXRhCi0JICogYnl0ZS4gIFRoaXMgZGF0YSBwYXR0ZXJuIGlzIG5vdCB2YWxpZCBhY2NvcmRpbmcgdG8gdGhlIHN0YW5kYXJkLgotCSAqLwotCWRvIHsKLQkgIGlmIChieXRlc19pbl9idWZmZXIgPT0gMCkgewotCSAgICBpZiAoISAoKmNpbmZvLT5zcmMtPmZpbGxfaW5wdXRfYnVmZmVyKSAoY2luZm8pKQotCSAgICAgIHJldHVybiBGQUxTRTsKLQkgICAgbmV4dF9pbnB1dF9ieXRlID0gY2luZm8tPnNyYy0+bmV4dF9pbnB1dF9ieXRlOwotCSAgICBieXRlc19pbl9idWZmZXIgPSBjaW5mby0+c3JjLT5ieXRlc19pbl9idWZmZXI7Ci0JICB9Ci0JICBieXRlc19pbl9idWZmZXItLTsKLQkgIGMgPSBHRVRKT0NURVQoKm5leHRfaW5wdXRfYnl0ZSsrKTsKLQl9IHdoaWxlIChjID09IDB4RkYpOwotCi0JaWYgKGMgPT0gMCkgewotCSAgLyogRm91bmQgRkYvMDAsIHdoaWNoIHJlcHJlc2VudHMgYW4gRkYgZGF0YSBieXRlICovCi0JICBjID0gMHhGRjsKLQl9IGVsc2UgewotCSAgLyogT29wcywgaXQncyBhY3R1YWxseSBhIG1hcmtlciBpbmRpY2F0aW5nIGVuZCBvZiBjb21wcmVzc2VkIGRhdGEuCi0JICAgKiBTYXZlIHRoZSBtYXJrZXIgY29kZSBmb3IgbGF0ZXIgdXNlLgotCSAgICogRmluZSBwb2ludDogaXQgbWlnaHQgYXBwZWFyIHRoYXQgd2Ugc2hvdWxkIHNhdmUgdGhlIG1hcmtlciBpbnRvCi0JICAgKiBiaXRyZWFkIHdvcmtpbmcgc3RhdGUsIG5vdCBzdHJhaWdodCBpbnRvIHBlcm1hbmVudCBzdGF0ZS4gIEJ1dAotCSAgICogb25jZSB3ZSBoYXZlIGhpdCBhIG1hcmtlciwgd2UgY2Fubm90IG5lZWQgdG8gc3VzcGVuZCB3aXRoaW4gdGhlCi0JICAgKiBjdXJyZW50IE1DVSwgYmVjYXVzZSB3ZSB3aWxsIHJlYWQgbm8gbW9yZSBieXRlcyBmcm9tIHRoZSBkYXRhCi0JICAgKiBzb3VyY2UuICBTbyBpdCBpcyBPSyB0byB1cGRhdGUgcGVybWFuZW50IHN0YXRlIHJpZ2h0IGF3YXkuCi0JICAgKi8KLQkgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gYzsKLQkgIC8qIFNlZSBpZiB3ZSBuZWVkIHRvIGluc2VydCBzb21lIGZha2UgemVybyBiaXRzLiAqLwotCSAgZ290byBub19tb3JlX2J5dGVzOwotCX0KLSAgICAgIH0KLQotICAgICAgLyogT0ssIGxvYWQgYyBpbnRvIGdldF9idWZmZXIgKi8KLSAgICAgIGdldF9idWZmZXIgPSAoZ2V0X2J1ZmZlciA8PCA4KSB8IGM7Ci0gICAgICBiaXRzX2xlZnQgKz0gODsKLSAgICB9IC8qIGVuZCB3aGlsZSAqLwotICB9IGVsc2UgewotICBub19tb3JlX2J5dGVzOgotICAgIC8qIFdlIGdldCBoZXJlIGlmIHdlJ3ZlIHJlYWQgdGhlIG1hcmtlciB0aGF0IHRlcm1pbmF0ZXMgdGhlIGNvbXByZXNzZWQKLSAgICAgKiBkYXRhIHNlZ21lbnQuICBUaGVyZSBzaG91bGQgYmUgZW5vdWdoIGJpdHMgaW4gdGhlIGJ1ZmZlciByZWdpc3RlcgotICAgICAqIHRvIHNhdGlzZnkgdGhlIHJlcXVlc3Q7IGlmIHNvLCBubyBwcm9ibGVtLgotICAgICAqLwotICAgIGlmIChuYml0cyA+IGJpdHNfbGVmdCkgewotICAgICAgLyogVWgtb2guICBSZXBvcnQgY29ycnVwdGVkIGRhdGEgdG8gdXNlciBhbmQgc3R1ZmYgemVyb2VzIGludG8KLSAgICAgICAqIHRoZSBkYXRhIHN0cmVhbSwgc28gdGhhdCB3ZSBjYW4gcHJvZHVjZSBzb21lIGtpbmQgb2YgaW1hZ2UuCi0gICAgICAgKiBXZSB1c2UgYSBub252b2xhdGlsZSBmbGFnIHRvIGVuc3VyZSB0aGF0IG9ubHkgb25lIHdhcm5pbmcgbWVzc2FnZQotICAgICAgICogYXBwZWFycyBwZXIgZGF0YSBzZWdtZW50LgotICAgICAgICovCi0gICAgICBpZiAoISBjaW5mby0+ZW50cm9weS0+aW5zdWZmaWNpZW50X2RhdGEpIHsKLQlXQVJOTVMoY2luZm8sIEpXUk5fSElUX01BUktFUik7Ci0JY2luZm8tPmVudHJvcHktPmluc3VmZmljaWVudF9kYXRhID0gVFJVRTsKLSAgICAgIH0KLSAgICAgIC8qIEZpbGwgdGhlIGJ1ZmZlciB3aXRoIHplcm8gYml0cyAqLwotICAgICAgZ2V0X2J1ZmZlciA8PD0gTUlOX0dFVF9CSVRTIC0gYml0c19sZWZ0OwotICAgICAgYml0c19sZWZ0ID0gTUlOX0dFVF9CSVRTOwotICAgIH0KLSAgfQotCi0gIC8qIFVubG9hZCB0aGUgbG9jYWwgcmVnaXN0ZXJzICovCi0gIHN0YXRlLT5uZXh0X2lucHV0X2J5dGUgPSBuZXh0X2lucHV0X2J5dGU7Ci0gIHN0YXRlLT5ieXRlc19pbl9idWZmZXIgPSBieXRlc19pbl9idWZmZXI7Ci0gIHN0YXRlLT5nZXRfYnVmZmVyID0gZ2V0X2J1ZmZlcjsKLSAgc3RhdGUtPmJpdHNfbGVmdCA9IGJpdHNfbGVmdDsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogT3V0LW9mLWxpbmUgY29kZSBmb3IgSHVmZm1hbiBjb2RlIGRlY29kaW5nLgotICogU2VlIGpkaHVmZi5oIGZvciBpbmZvIGFib3V0IHVzYWdlLgotICovCi0KLUdMT0JBTChpbnQpCi1qcGVnX2h1ZmZfZGVjb2RlIChiaXRyZWFkX3dvcmtpbmdfc3RhdGUgKiBzdGF0ZSwKLQkJICByZWdpc3RlciBiaXRfYnVmX3R5cGUgZ2V0X2J1ZmZlciwgcmVnaXN0ZXIgaW50IGJpdHNfbGVmdCwKLQkJICBkX2Rlcml2ZWRfdGJsICogaHRibCwgaW50IG1pbl9iaXRzKQotewotICByZWdpc3RlciBpbnQgbCA9IG1pbl9iaXRzOwotICByZWdpc3RlciBJTlQzMiBjb2RlOwotCi0gIC8qIEhVRkZfREVDT0RFIGhhcyBkZXRlcm1pbmVkIHRoYXQgdGhlIGNvZGUgaXMgYXQgbGVhc3QgbWluX2JpdHMgKi8KLSAgLyogYml0cyBsb25nLCBzbyBmZXRjaCB0aGF0IG1hbnkgYml0cyBpbiBvbmUgc3dvb3AuICovCi0KLSAgQ0hFQ0tfQklUX0JVRkZFUigqc3RhdGUsIGwsIHJldHVybiAtMSk7Ci0gIGNvZGUgPSBHRVRfQklUUyhsKTsKLQotICAvKiBDb2xsZWN0IHRoZSByZXN0IG9mIHRoZSBIdWZmbWFuIGNvZGUgb25lIGJpdCBhdCBhIHRpbWUuICovCi0gIC8qIFRoaXMgaXMgcGVyIEZpZ3VyZSBGLjE2IGluIHRoZSBKUEVHIHNwZWMuICovCi0KLSAgd2hpbGUgKGNvZGUgPiBodGJsLT5tYXhjb2RlW2xdKSB7Ci0gICAgY29kZSA8PD0gMTsKLSAgICBDSEVDS19CSVRfQlVGRkVSKCpzdGF0ZSwgMSwgcmV0dXJuIC0xKTsKLSAgICBjb2RlIHw9IEdFVF9CSVRTKDEpOwotICAgIGwrKzsKLSAgfQotCi0gIC8qIFVubG9hZCB0aGUgbG9jYWwgcmVnaXN0ZXJzICovCi0gIHN0YXRlLT5nZXRfYnVmZmVyID0gZ2V0X2J1ZmZlcjsKLSAgc3RhdGUtPmJpdHNfbGVmdCA9IGJpdHNfbGVmdDsKLQotICAvKiBXaXRoIGdhcmJhZ2UgaW5wdXQgd2UgbWF5IHJlYWNoIHRoZSBzZW50aW5lbCB2YWx1ZSBsID0gMTcuICovCi0KLSAgaWYgKGwgPiAxNikgewotICAgIFdBUk5NUyhzdGF0ZS0+Y2luZm8sIEpXUk5fSFVGRl9CQURfQ09ERSk7Ci0gICAgcmV0dXJuIDA7CQkJLyogZmFrZSBhIHplcm8gYXMgdGhlIHNhZmVzdCByZXN1bHQgKi8KLSAgfQotCi0gIHJldHVybiBodGJsLT5wdWItPmh1ZmZ2YWxbIChpbnQpIChjb2RlICsgaHRibC0+dmFsb2Zmc2V0W2xdKSBdOwotfQotCi0KLS8qCi0gKiBGaWd1cmUgRi4xMjogZXh0ZW5kIHNpZ24gYml0LgotICogT24gc29tZSBtYWNoaW5lcywgYSBzaGlmdCBhbmQgYWRkIHdpbGwgYmUgZmFzdGVyIHRoYW4gYSB0YWJsZSBsb29rdXAuCi0gKi8KLQotI2lmZGVmIEFWT0lEX1RBQkxFUwotCi0jZGVmaW5lIEhVRkZfRVhURU5EKHgscykgICgoeCkgPCAoMTw8KChzKS0xKSkgPyAoeCkgKyAoKCgtMSk8PChzKSkgKyAxKSA6ICh4KSkKLQotI2Vsc2UKLQotI2RlZmluZSBIVUZGX0VYVEVORCh4LHMpICAoKHgpIDwgZXh0ZW5kX3Rlc3Rbc10gPyAoeCkgKyBleHRlbmRfb2Zmc2V0W3NdIDogKHgpKQotCi1zdGF0aWMgY29uc3QgaW50IGV4dGVuZF90ZXN0WzE2XSA9ICAgLyogZW50cnkgbiBpcyAyKioobi0xKSAqLwotICB7IDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDQsIDB4MDAwOCwgMHgwMDEwLCAweDAwMjAsIDB4MDA0MCwgMHgwMDgwLAotICAgIDB4MDEwMCwgMHgwMjAwLCAweDA0MDAsIDB4MDgwMCwgMHgxMDAwLCAweDIwMDAsIDB4NDAwMCB9OwotCi1zdGF0aWMgY29uc3QgaW50IGV4dGVuZF9vZmZzZXRbMTZdID0gLyogZW50cnkgbiBpcyAoLTEgPDwgbikgKyAxICovCi0gIHsgMCwgKCgtMSk8PDEpICsgMSwgKCgtMSk8PDIpICsgMSwgKCgtMSk8PDMpICsgMSwgKCgtMSk8PDQpICsgMSwKLSAgICAoKC0xKTw8NSkgKyAxLCAoKC0xKTw8NikgKyAxLCAoKC0xKTw8NykgKyAxLCAoKC0xKTw8OCkgKyAxLAotICAgICgoLTEpPDw5KSArIDEsICgoLTEpPDwxMCkgKyAxLCAoKC0xKTw8MTEpICsgMSwgKCgtMSk8PDEyKSArIDEsCi0gICAgKCgtMSk8PDEzKSArIDEsICgoLTEpPDwxNCkgKyAxLCAoKC0xKTw8MTUpICsgMSB9OwotCi0jZW5kaWYgLyogQVZPSURfVEFCTEVTICovCi0KLQotLyoKLSAqIENoZWNrIGZvciBhIHJlc3RhcnQgbWFya2VyICYgcmVzeW5jaHJvbml6ZSBkZWNvZGVyLgotICogUmV0dXJucyBGQUxTRSBpZiBtdXN0IHN1c3BlbmQuCi0gKi8KLQotTE9DQUwoYm9vbGVhbikKLXByb2Nlc3NfcmVzdGFydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICBpbnQgY2k7Ci0KLSAgLyogVGhyb3cgYXdheSBhbnkgdW51c2VkIGJpdHMgcmVtYWluaW5nIGluIGJpdCBidWZmZXI7ICovCi0gIC8qIGluY2x1ZGUgYW55IGZ1bGwgYnl0ZXMgaW4gbmV4dF9tYXJrZXIncyBjb3VudCBvZiBkaXNjYXJkZWQgYnl0ZXMgKi8KLSAgY2luZm8tPm1hcmtlci0+ZGlzY2FyZGVkX2J5dGVzICs9IGVudHJvcHktPmJpdHN0YXRlLmJpdHNfbGVmdCAvIDg7Ci0gIGVudHJvcHktPmJpdHN0YXRlLmJpdHNfbGVmdCA9IDA7Ci0KLSAgLyogQWR2YW5jZSBwYXN0IHRoZSBSU1RuIG1hcmtlciAqLwotICBpZiAoISAoKmNpbmZvLT5tYXJrZXItPnJlYWRfcmVzdGFydF9tYXJrZXIpIChjaW5mbykpCi0gICAgcmV0dXJuIEZBTFNFOwotCi0gIC8qIFJlLWluaXRpYWxpemUgREMgcHJlZGljdGlvbnMgdG8gMCAqLwotICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykKLSAgICBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSAwOwotCi0gIC8qIFJlc2V0IHJlc3RhcnQgY291bnRlciAqLwotICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOwotCi0gIC8qIFJlc2V0IG91dC1vZi1kYXRhIGZsYWcsIHVubGVzcyByZWFkX3Jlc3RhcnRfbWFya2VyIGxlZnQgdXMgc21hY2sgdXAKLSAgICogYWdhaW5zdCBhIG1hcmtlci4gIEluIHRoYXQgY2FzZSB3ZSB3aWxsIGVuZCB1cCB0cmVhdGluZyB0aGUgbmV4dCBkYXRhCi0gICAqIHNlZ21lbnQgYXMgZW1wdHksIGFuZCB3ZSBjYW4gYXZvaWQgcHJvZHVjaW5nIGJvZ3VzIG91dHB1dCBwaXhlbHMgYnkKLSAgICogbGVhdmluZyB0aGUgZmxhZyBzZXQuCi0gICAqLwotICBpZiAoY2luZm8tPnVucmVhZF9tYXJrZXIgPT0gMCkKLSAgICBlbnRyb3B5LT5wdWIuaW5zdWZmaWNpZW50X2RhdGEgPSBGQUxTRTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogRGVjb2RlIGFuZCByZXR1cm4gb25lIE1DVSdzIHdvcnRoIG9mIEh1ZmZtYW4tY29tcHJlc3NlZCBjb2VmZmljaWVudHMuCi0gKiBUaGUgY29lZmZpY2llbnRzIGFyZSByZW9yZGVyZWQgZnJvbSB6aWd6YWcgb3JkZXIgaW50byBuYXR1cmFsIGFycmF5IG9yZGVyLAotICogYnV0IGFyZSBub3QgZGVxdWFudGl6ZWQuCi0gKgotICogVGhlIGkndGggYmxvY2sgb2YgdGhlIE1DVSBpcyBzdG9yZWQgaW50byB0aGUgYmxvY2sgcG9pbnRlZCB0byBieQotICogTUNVX2RhdGFbaV0uICBXRSBBU1NVTUUgVEhJUyBBUkVBIEhBUyBCRUVOIFpFUk9FRCBCWSBUSEUgQ0FMTEVSLgotICogKFdob2xlc2FsZSB6ZXJvaW5nIGlzIHVzdWFsbHkgYSBsaXR0bGUgZmFzdGVyIHRoYW4gcmV0YWlsLi4uKQotICoKLSAqIFJldHVybnMgRkFMU0UgaWYgZGF0YSBzb3VyY2UgcmVxdWVzdGVkIHN1c3BlbnNpb24uICBJbiB0aGF0IGNhc2Ugbm8KLSAqIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gcGVybWFuZW50IHN0YXRlLiAgKEV4Y2VwdGlvbjogc29tZSBvdXRwdXQKLSAqIGNvZWZmaWNpZW50cyBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gYXNzaWduZWQuICBUaGlzIGlzIGhhcm1sZXNzIGZvcgotICogdGhpcyBtb2R1bGUsIHNpbmNlIHdlJ2xsIGp1c3QgcmUtYXNzaWduIHRoZW0gb24gdGhlIG5leHQgY2FsbC4pCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1kZWNvZGVfbWN1IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQotewotICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIGludCBibGtuOwotICBCSVRSRUFEX1NUQVRFX1ZBUlM7Ci0gIHNhdmFibGVfc3RhdGUgc3RhdGU7Ci0KLSAgLyogUHJvY2VzcyByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQ7IG1heSBoYXZlIHRvIHN1c3BlbmQgKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7Ci0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCi0gICAgICBpZiAoISBwcm9jZXNzX3Jlc3RhcnQoY2luZm8pKQotCXJldHVybiBGQUxTRTsKLSAgfQotCi0gIC8qIElmIHdlJ3ZlIHJ1biBvdXQgb2YgZGF0YSwganVzdCBsZWF2ZSB0aGUgTUNVIHNldCB0byB6ZXJvZXMuCi0gICAqIFRoaXMgd2F5LCB3ZSByZXR1cm4gdW5pZm9ybSBncmF5IGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSBzZWdtZW50LgotICAgKi8KLSAgaWYgKCEgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhKSB7Ci0KLSAgICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUgKi8KLSAgICBCSVRSRUFEX0xPQURfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOwotICAgIEFTU0lHTl9TVEFURShzdGF0ZSwgZW50cm9weS0+c2F2ZWQpOwotCi0gICAgLyogT3V0ZXIgbG9vcCBoYW5kbGVzIGVhY2ggYmxvY2sgaW4gdGhlIE1DVSAqLwotCi0gICAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKLSAgICAgIEpCTE9DS1JPVyBibG9jayA9IE1DVV9kYXRhW2Jsa25dOwotICAgICAgZF9kZXJpdmVkX3RibCAqIGRjdGJsID0gZW50cm9weS0+ZGNfY3VyX3RibHNbYmxrbl07Ci0gICAgICBkX2Rlcml2ZWRfdGJsICogYWN0YmwgPSBlbnRyb3B5LT5hY19jdXJfdGJsc1tibGtuXTsKLSAgICAgIHJlZ2lzdGVyIGludCBzLCBrLCByOwotCi0gICAgICAvKiBEZWNvZGUgYSBzaW5nbGUgYmxvY2sncyB3b3J0aCBvZiBjb2VmZmljaWVudHMgKi8KLQotICAgICAgLyogU2VjdGlvbiBGLjIuMi4xOiBkZWNvZGUgdGhlIERDIGNvZWZmaWNpZW50IGRpZmZlcmVuY2UgKi8KLSAgICAgIEhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCBkY3RibCwgcmV0dXJuIEZBTFNFLCBsYWJlbDEpOwotICAgICAgaWYgKHMpIHsKLQlDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOwotCXIgPSBHRVRfQklUUyhzKTsKLQlzID0gSFVGRl9FWFRFTkQociwgcyk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChlbnRyb3B5LT5kY19uZWVkZWRbYmxrbl0pIHsKLQkvKiBDb252ZXJ0IERDIGRpZmZlcmVuY2UgdG8gYWN0dWFsIHZhbHVlLCB1cGRhdGUgbGFzdF9kY192YWwgKi8KLQlpbnQgY2kgPSBjaW5mby0+TUNVX21lbWJlcnNoaXBbYmxrbl07Ci0JcyArPSBzdGF0ZS5sYXN0X2RjX3ZhbFtjaV07Ci0Jc3RhdGUubGFzdF9kY192YWxbY2ldID0gczsKLQkvKiBPdXRwdXQgdGhlIERDIGNvZWZmaWNpZW50IChhc3N1bWVzIGpwZWdfbmF0dXJhbF9vcmRlclswXSA9IDApICovCi0JKCpibG9jaylbMF0gPSAoSkNPRUYpIHM7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChlbnRyb3B5LT5hY19uZWVkZWRbYmxrbl0pIHsKLQotCS8qIFNlY3Rpb24gRi4yLjIuMjogZGVjb2RlIHRoZSBBQyBjb2VmZmljaWVudHMgKi8KLQkvKiBTaW5jZSB6ZXJvZXMgYXJlIHNraXBwZWQsIG91dHB1dCBhcmVhIG11c3QgYmUgY2xlYXJlZCBiZWZvcmVoYW5kICovCi0JZm9yIChrID0gMTsgayA8IERDVFNJWkUyOyBrKyspIHsKLQkgIEhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCBhY3RibCwgcmV0dXJuIEZBTFNFLCBsYWJlbDIpOwotICAgICAgCi0JICByID0gcyA+PiA0OwotCSAgcyAmPSAxNTsKLSAgICAgIAotCSAgaWYgKHMpIHsKLQkgICAgayArPSByOwotCSAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOwotCSAgICByID0gR0VUX0JJVFMocyk7Ci0JICAgIHMgPSBIVUZGX0VYVEVORChyLCBzKTsKLQkgICAgLyogT3V0cHV0IGNvZWZmaWNpZW50IGluIG5hdHVyYWwgKGRlemlnemFnZ2VkKSBvcmRlci4KLQkgICAgICogTm90ZTogdGhlIGV4dHJhIGVudHJpZXMgaW4ganBlZ19uYXR1cmFsX29yZGVyW10gd2lsbCBzYXZlIHVzCi0JICAgICAqIGlmIGsgPj0gRENUU0laRTIsIHdoaWNoIGNvdWxkIGhhcHBlbiBpZiB0aGUgZGF0YSBpcyBjb3JydXB0ZWQuCi0JICAgICAqLwotCSAgICAoKmJsb2NrKVtqcGVnX25hdHVyYWxfb3JkZXJba11dID0gKEpDT0VGKSBzOwotCSAgfSBlbHNlIHsKLQkgICAgaWYgKHIgIT0gMTUpCi0JICAgICAgYnJlYWs7Ci0JICAgIGsgKz0gMTU7Ci0JICB9Ci0JfQotCi0gICAgICB9IGVsc2UgewotCi0JLyogU2VjdGlvbiBGLjIuMi4yOiBkZWNvZGUgdGhlIEFDIGNvZWZmaWNpZW50cyAqLwotCS8qIEluIHRoaXMgcGF0aCB3ZSBqdXN0IGRpc2NhcmQgdGhlIHZhbHVlcyAqLwotCWZvciAoayA9IDE7IGsgPCBEQ1RTSVpFMjsgaysrKSB7Ci0JICBIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgYWN0YmwsIHJldHVybiBGQUxTRSwgbGFiZWwzKTsKLSAgICAgIAotCSAgciA9IHMgPj4gNDsKLQkgIHMgJj0gMTU7Ci0gICAgICAKLQkgIGlmIChzKSB7Ci0JICAgIGsgKz0gcjsKLQkgICAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgcywgcmV0dXJuIEZBTFNFKTsKLQkgICAgRFJPUF9CSVRTKHMpOwotCSAgfSBlbHNlIHsKLQkgICAgaWYgKHIgIT0gMTUpCi0JICAgICAgYnJlYWs7Ci0JICAgIGsgKz0gMTU7Ci0JICB9Ci0JfQotCi0gICAgICB9Ci0gICAgfQotCi0gICAgLyogQ29tcGxldGVkIE1DVSwgc28gdXBkYXRlIHN0YXRlICovCi0gICAgQklUUkVBRF9TQVZFX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKLSAgICBBU1NJR05fU1RBVEUoZW50cm9weS0+c2F2ZWQsIHN0YXRlKTsKLSAgfQotCi0gIC8qIEFjY291bnQgZm9yIHJlc3RhcnQgaW50ZXJ2YWwgKG5vLW9wIGlmIG5vdCB1c2luZyByZXN0YXJ0cykgKi8KLSAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIEh1ZmZtYW4gZW50cm9weSBkZWNvZGluZy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2h1ZmZfZGVjb2RlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5OwotICBpbnQgaTsKLQotICBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YoaHVmZl9lbnRyb3B5X2RlY29kZXIpKTsKLSAgY2luZm8tPmVudHJvcHkgPSAoc3RydWN0IGpwZWdfZW50cm9weV9kZWNvZGVyICopIGVudHJvcHk7Ci0gIGVudHJvcHktPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19odWZmX2RlY29kZXI7Ci0gIGVudHJvcHktPnB1Yi5kZWNvZGVfbWN1ID0gZGVjb2RlX21jdTsKLQotICAvKiBNYXJrIHRhYmxlcyB1bmFsbG9jYXRlZCAqLwotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7Ci0gICAgZW50cm9weS0+ZGNfZGVyaXZlZF90YmxzW2ldID0gZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2ldID0gTlVMTDsKLSAgfQotfQotCi0jZW5kaWYgLy9fRlhfSlBFR19UVVJCT18KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkaW5wdXQuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkaW5wdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU3MTRlOS4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZGlucHV0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODQgKzAsMCBAQAotI2lmICFkZWZpbmVkKF9GWF9KUEVHX1RVUkJPXykKLS8qCi0gKiBqZGlucHV0LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBpbnB1dCBjb250cm9sIGxvZ2ljIGZvciB0aGUgSlBFRyBkZWNvbXByZXNzb3IuCi0gKiBUaGVzZSByb3V0aW5lcyBhcmUgY29uY2VybmVkIHdpdGggY29udHJvbGxpbmcgdGhlIGRlY29tcHJlc3NvcidzIGlucHV0Ci0gKiBwcm9jZXNzaW5nIChtYXJrZXIgcmVhZGluZyBhbmQgY29lZmZpY2llbnQgZGVjb2RpbmcpLiAgVGhlIGFjdHVhbCBpbnB1dAotICogcmVhZGluZyBpcyBkb25lIGluIGpkbWFya2VyLmMsIGpkaHVmZi5jLCBhbmQgamRwaHVmZi5jLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKiBQcml2YXRlIHN0YXRlICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGpwZWdfaW5wdXRfY29udHJvbGxlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICBib29sZWFuIGluaGVhZGVyczsJCS8qIFRSVUUgdW50aWwgZmlyc3QgU09TIGlzIHJlYWNoZWQgKi8KLX0gbXlfaW5wdXRfY29udHJvbGxlcjsKLQotdHlwZWRlZiBteV9pbnB1dF9jb250cm9sbGVyICogbXlfaW5wdXRjdGxfcHRyOwotCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCi1NRVRIT0RERUYoaW50KSBjb25zdW1lX21hcmtlcnMgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLQotLyoKLSAqIFJvdXRpbmVzIHRvIGNhbGN1bGF0ZSB2YXJpb3VzIHF1YW50aXRpZXMgcmVsYXRlZCB0byB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2UuCi0gKi8KLQotTE9DQUwodm9pZCkKLWluaXRpYWxfc2V0dXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBDYWxsZWQgb25jZSwgd2hlbiBmaXJzdCBTT1MgbWFya2VyIGlzIHJlYWNoZWQgKi8KLXsKLSAgaW50IGNpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotCi0gIC8qIE1ha2Ugc3VyZSBpbWFnZSBpc24ndCBiaWdnZXIgdGhhbiBJIGNhbiBoYW5kbGUgKi8KLSAgaWYgKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ID4gKGxvbmcpIEpQRUdfTUFYX0RJTUVOU0lPTiB8fAotICAgICAgKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCA+IChsb25nKSBKUEVHX01BWF9ESU1FTlNJT04pCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfSU1BR0VfVE9PX0JJRywgKHVuc2lnbmVkIGludCkgSlBFR19NQVhfRElNRU5TSU9OKTsKLQotICAvKiBGb3Igbm93LCBwcmVjaXNpb24gbXVzdCBtYXRjaCBjb21waWxlZC1pbiB2YWx1ZS4uLiAqLwotICBpZiAoY2luZm8tPmRhdGFfcHJlY2lzaW9uICE9IEJJVFNfSU5fSlNBTVBMRSkKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJFQ0lTSU9OLCBjaW5mby0+ZGF0YV9wcmVjaXNpb24pOwotCi0gIC8qIENoZWNrIHRoYXQgbnVtYmVyIG9mIGNvbXBvbmVudHMgd29uJ3QgZXhjZWVkIGludGVybmFsIGFycmF5IHNpemVzICovCi0gIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgPiBNQVhfQ09NUE9ORU5UUykKLSAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGNpbmZvLT5udW1fY29tcG9uZW50cywKLQkgICAgIE1BWF9DT01QT05FTlRTKTsKLQotICAvKiBDb21wdXRlIG1heGltdW0gc2FtcGxpbmcgZmFjdG9yczsgY2hlY2sgZmFjdG9yIHZhbGlkaXR5ICovCi0gIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciA9IDE7Ci0gIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciA9IDE7Ci0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgaWYgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3I8PTAgfHwgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcj5NQVhfU0FNUF9GQUNUT1IgfHwKLQljb21wcHRyLT52X3NhbXBfZmFjdG9yPD0wIHx8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I+TUFYX1NBTVBfRkFDVE9SKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfU0FNUExJTkcpOwotICAgIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciA9IE1BWChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IsCi0JCQkJICAgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcik7Ci0gICAgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yID0gTUFYKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciwKLQkJCQkgICBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKLSAgfQotCi0gIC8qIFdlIGluaXRpYWxpemUgRENUX3NjYWxlZF9zaXplIGFuZCBtaW5fRENUX3NjYWxlZF9zaXplIHRvIERDVFNJWkUuCi0gICAqIEluIHRoZSBmdWxsIGRlY29tcHJlc3NvciwgdGhpcyB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgamRtYXN0ZXIuYzsKLSAgICogYnV0IGluIHRoZSB0cmFuc2NvZGVyLCBqZG1hc3Rlci5jIGlzIG5vdCB1c2VkLCBzbyB3ZSBtdXN0IGRvIGl0IGhlcmUuCi0gICAqLwotICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSA9IERDVFNJWkU7Ci0KLSAgLyogQ29tcHV0ZSBkaW1lbnNpb25zIG9mIGNvbXBvbmVudHMgKi8KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUgPSBEQ1RTSVpFOwotICAgIC8qIFNpemUgaW4gRENUIGJsb2NrcyAqLwotICAgIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogKGxvbmcpIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsCi0JCSAgICAobG9uZykgKGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKLSAgICBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ICogKGxvbmcpIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCi0JCSAgICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKLSAgICAvKiBkb3duc2FtcGxlZF93aWR0aCBhbmQgZG93bnNhbXBsZWRfaGVpZ2h0IHdpbGwgYWxzbyBiZSBvdmVycmlkZGVuIGJ5Ci0gICAgICogamRtYXN0ZXIuYyBpZiB3ZSBhcmUgZG9pbmcgZnVsbCBkZWNvbXByZXNzaW9uLiAgVGhlIHRyYW5zY29kZXIgbGlicmFyeQotICAgICAqIGRvZXNuJ3QgdXNlIHRoZXNlIHZhbHVlcywgYnV0IHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uIG1pZ2h0LgotICAgICAqLwotICAgIC8qIFNpemUgaW4gc2FtcGxlcyAqLwotICAgIGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggKiAobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwKLQkJICAgIChsb25nKSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IpOwotICAgIGNvbXBwdHItPmRvd25zYW1wbGVkX2hlaWdodCA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCAqIChsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAotCQkgICAgKGxvbmcpIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3Rvcik7Ci0gICAgLyogTWFyayBjb21wb25lbnQgbmVlZGVkLCB1bnRpbCBjb2xvciBjb252ZXJzaW9uIHNheXMgb3RoZXJ3aXNlICovCi0gICAgY29tcHB0ci0+Y29tcG9uZW50X25lZWRlZCA9IFRSVUU7Ci0gICAgLyogTWFyayBubyBxdWFudGl6YXRpb24gdGFibGUgeWV0IHNhdmVkIGZvciBjb21wb25lbnQgKi8KLSAgICBjb21wcHRyLT5xdWFudF90YWJsZSA9IE5VTEw7Ci0gIH0KLQotICAvKiBDb21wdXRlIG51bWJlciBvZiBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93cy4gKi8KLSAgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyA9IChKRElNRU5TSU9OKQotICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsCi0JCSAgKGxvbmcpIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IqRENUU0laRSkpOwotCi0gIC8qIERlY2lkZSB3aGV0aGVyIGZpbGUgY29udGFpbnMgbXVsdGlwbGUgc2NhbnMgKi8KLSAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuIDwgY2luZm8tPm51bV9jb21wb25lbnRzIHx8IGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKQotICAgIGNpbmZvLT5pbnB1dGN0bC0+aGFzX211bHRpcGxlX3NjYW5zID0gVFJVRTsKLSAgZWxzZQotICAgIGNpbmZvLT5pbnB1dGN0bC0+aGFzX211bHRpcGxlX3NjYW5zID0gRkFMU0U7Ci19Ci0KLQotTE9DQUwodm9pZCkKLXBlcl9zY2FuX3NldHVwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogRG8gY29tcHV0YXRpb25zIHRoYXQgYXJlIG5lZWRlZCBiZWZvcmUgcHJvY2Vzc2luZyBhIEpQRUcgc2NhbiAqLwotLyogY2luZm8tPmNvbXBzX2luX3NjYW4gYW5kIGNpbmZvLT5jdXJfY29tcF9pbmZvW10gd2VyZSBzZXQgZnJvbSBTT1MgbWFya2VyICovCi17Ci0gIGludCBjaSwgbWN1YmxrcywgdG1wOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICAKLSAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuID09IDEpIHsKLSAgICAKLSAgICAvKiBOb25pbnRlcmxlYXZlZCAoc2luZ2xlLWNvbXBvbmVudCkgc2NhbiAqLwotICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXTsKLSAgICAKLSAgICAvKiBPdmVyYWxsIGltYWdlIHNpemUgaW4gTUNVcyAqLwotICAgIGNpbmZvLT5NQ1VzX3Blcl9yb3cgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7Ci0gICAgY2luZm8tPk1DVV9yb3dzX2luX3NjYW4gPSBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOwotICAgIAotICAgIC8qIEZvciBub25pbnRlcmxlYXZlZCBzY2FuLCBhbHdheXMgb25lIGJsb2NrIHBlciBNQ1UgKi8KLSAgICBjb21wcHRyLT5NQ1Vfd2lkdGggPSAxOwotICAgIGNvbXBwdHItPk1DVV9oZWlnaHQgPSAxOwotICAgIGNvbXBwdHItPk1DVV9ibG9ja3MgPSAxOwotICAgIGNvbXBwdHItPk1DVV9zYW1wbGVfd2lkdGggPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7Ci0gICAgY29tcHB0ci0+bGFzdF9jb2xfd2lkdGggPSAxOwotICAgIC8qIEZvciBub25pbnRlcmxlYXZlZCBzY2FucywgaXQgaXMgY29udmVuaWVudCB0byBkZWZpbmUgbGFzdF9yb3dfaGVpZ2h0Ci0gICAgICogYXMgdGhlIG51bWJlciBvZiBibG9jayByb3dzIHByZXNlbnQgaW4gdGhlIGxhc3QgaU1DVSByb3cuCi0gICAgICovCi0gICAgdG1wID0gKGludCkgKGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MgJSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKLSAgICBpZiAodG1wID09IDApIHRtcCA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7Ci0gICAgY29tcHB0ci0+bGFzdF9yb3dfaGVpZ2h0ID0gdG1wOwotICAgIAotICAgIC8qIFByZXBhcmUgYXJyYXkgZGVzY3JpYmluZyBNQ1UgY29tcG9zaXRpb24gKi8KLSAgICBjaW5mby0+YmxvY2tzX2luX01DVSA9IDE7Ci0gICAgY2luZm8tPk1DVV9tZW1iZXJzaGlwWzBdID0gMDsKLSAgICAKLSAgfSBlbHNlIHsKLSAgICAKLSAgICAvKiBJbnRlcmxlYXZlZCAobXVsdGktY29tcG9uZW50KSBzY2FuICovCi0gICAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuIDw9IDAgfHwgY2luZm8tPmNvbXBzX2luX3NjYW4gPiBNQVhfQ09NUFNfSU5fU0NBTikKLSAgICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0NPTVBPTkVOVF9DT1VOVCwgY2luZm8tPmNvbXBzX2luX3NjYW4sCi0JICAgICAgIE1BWF9DT01QU19JTl9TQ0FOKTsKLSAgICAKLSAgICAvKiBPdmVyYWxsIGltYWdlIHNpemUgaW4gTUNVcyAqLwotICAgIGNpbmZvLT5NQ1VzX3Blcl9yb3cgPSAoSkRJTUVOU0lPTikKLSAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCwKLQkJICAgIChsb25nKSAoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yKkRDVFNJWkUpKTsKLSAgICBjaW5mby0+TUNVX3Jvd3NfaW5fc2NhbiA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCwKLQkJICAgIChsb25nKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKkRDVFNJWkUpKTsKLSAgICAKLSAgICBjaW5mby0+YmxvY2tzX2luX01DVSA9IDA7Ci0gICAgCi0gICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0gICAgICAvKiBTYW1wbGluZyBmYWN0b3JzIGdpdmUgIyBvZiBibG9ja3Mgb2YgY29tcG9uZW50IGluIGVhY2ggTUNVICovCi0gICAgICBjb21wcHRyLT5NQ1Vfd2lkdGggPSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOwotICAgICAgY29tcHB0ci0+TUNVX2hlaWdodCA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7Ci0gICAgICBjb21wcHRyLT5NQ1VfYmxvY2tzID0gY29tcHB0ci0+TUNVX3dpZHRoICogY29tcHB0ci0+TUNVX2hlaWdodDsKLSAgICAgIGNvbXBwdHItPk1DVV9zYW1wbGVfd2lkdGggPSBjb21wcHRyLT5NQ1Vfd2lkdGggKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7Ci0gICAgICAvKiBGaWd1cmUgbnVtYmVyIG9mIG5vbi1kdW1teSBibG9ja3MgaW4gbGFzdCBNQ1UgY29sdW1uICYgcm93ICovCi0gICAgICB0bXAgPSAoaW50KSAoY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICUgY29tcHB0ci0+TUNVX3dpZHRoKTsKLSAgICAgIGlmICh0bXAgPT0gMCkgdG1wID0gY29tcHB0ci0+TUNVX3dpZHRoOwotICAgICAgY29tcHB0ci0+bGFzdF9jb2xfd2lkdGggPSB0bXA7Ci0gICAgICB0bXAgPSAoaW50KSAoY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyAlIGNvbXBwdHItPk1DVV9oZWlnaHQpOwotICAgICAgaWYgKHRtcCA9PSAwKSB0bXAgPSBjb21wcHRyLT5NQ1VfaGVpZ2h0OwotICAgICAgY29tcHB0ci0+bGFzdF9yb3dfaGVpZ2h0ID0gdG1wOwotICAgICAgLyogUHJlcGFyZSBhcnJheSBkZXNjcmliaW5nIE1DVSBjb21wb3NpdGlvbiAqLwotICAgICAgbWN1YmxrcyA9IGNvbXBwdHItPk1DVV9ibG9ja3M7Ci0gICAgICBpZiAoY2luZm8tPmJsb2Nrc19pbl9NQ1UgKyBtY3VibGtzID4gRF9NQVhfQkxPQ0tTX0lOX01DVSkKLQlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9NQ1VfU0laRSk7Ci0gICAgICB3aGlsZSAobWN1Ymxrcy0tID4gMCkgewotCWNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtjaW5mby0+YmxvY2tzX2luX01DVSsrXSA9IGNpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgfQotfQotCi0KLS8qCi0gKiBTYXZlIGF3YXkgYSBjb3B5IG9mIHRoZSBRLXRhYmxlIHJlZmVyZW5jZWQgYnkgZWFjaCBjb21wb25lbnQgcHJlc2VudAotICogaW4gdGhlIGN1cnJlbnQgc2NhbiwgdW5sZXNzIGFscmVhZHkgc2F2ZWQgZHVyaW5nIGEgcHJpb3Igc2Nhbi4KLSAqCi0gKiBJbiBhIG11bHRpcGxlLXNjYW4gSlBFRyBmaWxlLCB0aGUgZW5jb2RlciBjb3VsZCBhc3NpZ24gZGlmZmVyZW50IGNvbXBvbmVudHMKLSAqIHRoZSBzYW1lIFEtdGFibGUgc2xvdCBudW1iZXIsIGJ1dCBjaGFuZ2UgdGFibGUgZGVmaW5pdGlvbnMgYmV0d2VlbiBzY2FucwotICogc28gdGhhdCBlYWNoIGNvbXBvbmVudCB1c2VzIGEgZGlmZmVyZW50IFEtdGFibGUuICAoVGhlIElKRyBlbmNvZGVyIGlzIG5vdAotICogY3VycmVudGx5IGNhcGFibGUgb2YgZG9pbmcgdGhpcywgYnV0IG90aGVyIGVuY29kZXJzIG1pZ2h0LikgIFNpbmNlIHdlIHdhbnQKLSAqIHRvIGJlIGFibGUgdG8gZGVxdWFudGl6ZSBhbGwgdGhlIGNvbXBvbmVudHMgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSwgdGhpcwotICogbWVhbnMgdGhhdCB3ZSBoYXZlIHRvIHNhdmUgYXdheSB0aGUgdGFibGUgYWN0dWFsbHkgdXNlZCBmb3IgZWFjaCBjb21wb25lbnQuCi0gKiBXZSBkbyB0aGlzIGJ5IGNvcHlpbmcgdGhlIHRhYmxlIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlyc3Qgc2NhbiBjb250YWluaW5nCi0gKiB0aGUgY29tcG9uZW50LgotICogVGhlIEpQRUcgc3BlYyBwcm9oaWJpdHMgdGhlIGVuY29kZXIgZnJvbSBjaGFuZ2luZyB0aGUgY29udGVudHMgb2YgYSBRLXRhYmxlCi0gKiBzbG90IGJldHdlZW4gc2NhbnMgb2YgYSBjb21wb25lbnQgdXNpbmcgdGhhdCBzbG90LiAgSWYgdGhlIGVuY29kZXIgZG9lcyBzbwotICogYW55d2F5LCB0aGlzIGRlY29kZXIgd2lsbCBzaW1wbHkgdXNlIHRoZSBRLXRhYmxlIHZhbHVlcyB0aGF0IHdlcmUgY3VycmVudAotICogYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBzY2FuIGZvciB0aGUgY29tcG9uZW50LgotICoKLSAqIFRoZSBkZWNvbXByZXNzb3Igb3V0cHV0IHNpZGUgbG9va3Mgb25seSBhdCB0aGUgc2F2ZWQgcXVhbnQgdGFibGVzLAotICogbm90IGF0IHRoZSBjdXJyZW50IFEtdGFibGUgc2xvdHMuCi0gKi8KLQotTE9DQUwodm9pZCkKLWxhdGNoX3F1YW50X3RhYmxlcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaW50IGNpLCBxdGJsbm87Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIEpRVUFOVF9UQkwgKiBxdGJsOwotCi0gIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0gICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLSAgICAvKiBObyB3b3JrIGlmIHdlIGFscmVhZHkgc2F2ZWQgUS10YWJsZSBmb3IgdGhpcyBjb21wb25lbnQgKi8KLSAgICBpZiAoY29tcHB0ci0+cXVhbnRfdGFibGUgIT0gTlVMTCkKLSAgICAgIGNvbnRpbnVlOwotICAgIC8qIE1ha2Ugc3VyZSBzcGVjaWZpZWQgcXVhbnRpemF0aW9uIHRhYmxlIGlzIHByZXNlbnQgKi8KLSAgICBxdGJsbm8gPSBjb21wcHRyLT5xdWFudF90Ymxfbm87Ci0gICAgaWYgKHF0YmxubyA8IDAgfHwgcXRibG5vID49IE5VTV9RVUFOVF9UQkxTIHx8Ci0JY2luZm8tPnF1YW50X3RibF9wdHJzW3F0Ymxub10gPT0gTlVMTCkKLSAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX1FVQU5UX1RBQkxFLCBxdGJsbm8pOwotICAgIC8qIE9LLCBzYXZlIGF3YXkgdGhlIHF1YW50aXphdGlvbiB0YWJsZSAqLwotICAgIHF0YmwgPSAoSlFVQU5UX1RCTCAqKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgIFNJWkVPRihKUVVBTlRfVEJMKSk7Ci0gICAgTUVNQ09QWShxdGJsLCBjaW5mby0+cXVhbnRfdGJsX3B0cnNbcXRibG5vXSwgU0laRU9GKEpRVUFOVF9UQkwpKTsKLSAgICBjb21wcHRyLT5xdWFudF90YWJsZSA9IHF0Ymw7Ci0gIH0KLX0KLQotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgaW5wdXQgbW9kdWxlcyB0byByZWFkIGEgc2NhbiBvZiBjb21wcmVzc2VkIGRhdGEuCi0gKiBUaGUgZmlyc3QgY2FsbCB0byB0aGlzIGlzIGRvbmUgYnkgamRtYXN0ZXIuYyBhZnRlciBpbml0aWFsaXppbmcKLSAqIHRoZSBlbnRpcmUgZGVjb21wcmVzc29yIChkdXJpbmcganBlZ19zdGFydF9kZWNvbXByZXNzKS4KLSAqIFN1YnNlcXVlbnQgY2FsbHMgY29tZSBmcm9tIGNvbnN1bWVfbWFya2VycywgYmVsb3cuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9pbnB1dF9wYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBwZXJfc2Nhbl9zZXR1cChjaW5mbyk7Ci0gIGxhdGNoX3F1YW50X3RhYmxlcyhjaW5mbyk7Ci0gICgqY2luZm8tPmVudHJvcHktPnN0YXJ0X3Bhc3MpIChjaW5mbyk7Ci0gICgqY2luZm8tPmNvZWYtPnN0YXJ0X2lucHV0X3Bhc3MpIChjaW5mbyk7Ci0gIGNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCA9IGNpbmZvLT5jb2VmLT5jb25zdW1lX2RhdGE7Ci19Ci0KLQotLyoKLSAqIEZpbmlzaCB1cCBhZnRlciBpbnB1dHRpbmcgYSBjb21wcmVzc2VkLWRhdGEgc2Nhbi4KLSAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBjb2VmZmljaWVudCBjb250cm9sbGVyIGFmdGVyIGl0J3MgcmVhZCBhbGwKLSAqIHRoZSBleHBlY3RlZCBkYXRhIG9mIHRoZSBzY2FuLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZmluaXNoX2lucHV0X3Bhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCA9IGNvbnN1bWVfbWFya2VyczsKLX0KLQotCi0vKgotICogUmVhZCBKUEVHIG1hcmtlcnMgYmVmb3JlLCBiZXR3ZWVuLCBvciBhZnRlciBjb21wcmVzc2VkLWRhdGEgc2NhbnMuCi0gKiBDaGFuZ2Ugc3RhdGUgYXMgbmVjZXNzYXJ5IHdoZW4gYSBuZXcgc2NhbiBpcyByZWFjaGVkLgotICogUmV0dXJuIHZhbHVlIGlzIEpQRUdfU1VTUEVOREVELCBKUEVHX1JFQUNIRURfU09TLCBvciBKUEVHX1JFQUNIRURfRU9JLgotICoKLSAqIFRoZSBjb25zdW1lX2lucHV0IG1ldGhvZCBwb2ludGVyIHBvaW50cyBlaXRoZXIgaGVyZSBvciB0byB0aGUKLSAqIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIncyBjb25zdW1lX2RhdGEgcm91dGluZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIKLSAqIHdlIGFyZSByZWFkaW5nIGEgY29tcHJlc3NlZCBkYXRhIHNlZ21lbnQgb3IgaW50ZXItc2VnbWVudCBtYXJrZXJzLgotICovCi0KLU1FVEhPRERFRihpbnQpCi1jb25zdW1lX21hcmtlcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2lucHV0Y3RsX3B0ciBpbnB1dGN0bCA9IChteV9pbnB1dGN0bF9wdHIpIGNpbmZvLT5pbnB1dGN0bDsKLSAgaW50IHZhbDsKLQotICBpZiAoaW5wdXRjdGwtPnB1Yi5lb2lfcmVhY2hlZCkgLyogQWZ0ZXIgaGl0dGluZyBFT0ksIHJlYWQgbm8gZnVydGhlciAqLwotICAgIHJldHVybiBKUEVHX1JFQUNIRURfRU9JOwotCi0gIHZhbCA9ICgqY2luZm8tPm1hcmtlci0+cmVhZF9tYXJrZXJzKSAoY2luZm8pOwotCi0gIHN3aXRjaCAodmFsKSB7Ci0gIGNhc2UgSlBFR19SRUFDSEVEX1NPUzoJLyogRm91bmQgU09TICovCi0gICAgaWYgKGlucHV0Y3RsLT5pbmhlYWRlcnMpIHsJLyogMXN0IFNPUyAqLwotICAgICAgaW5pdGlhbF9zZXR1cChjaW5mbyk7Ci0gICAgICBpbnB1dGN0bC0+aW5oZWFkZXJzID0gRkFMU0U7Ci0gICAgICAvKiBOb3RlOiBzdGFydF9pbnB1dF9wYXNzIG11c3QgYmUgY2FsbGVkIGJ5IGpkbWFzdGVyLmMKLSAgICAgICAqIGJlZm9yZSBhbnkgbW9yZSBpbnB1dCBjYW4gYmUgY29uc3VtZWQuICBqZGFwaW1pbi5jIGlzCi0gICAgICAgKiByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIHRoaXMgc2VxdWVuY2luZy4KLSAgICAgICAqLwotICAgIH0gZWxzZSB7CQkJLyogMm5kIG9yIGxhdGVyIFNPUyBtYXJrZXIgKi8KLSAgICAgIGlmICghIGlucHV0Y3RsLT5wdWIuaGFzX211bHRpcGxlX3NjYW5zKQotCUVSUkVYSVQoY2luZm8sIEpFUlJfRU9JX0VYUEVDVEVEKTsgLyogT29wcywgSSB3YXNuJ3QgZXhwZWN0aW5nIHRoaXMhICovCi0gICAgICBzdGFydF9pbnB1dF9wYXNzKGNpbmZvKTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSlBFR19SRUFDSEVEX0VPSToJLyogRm91bmQgRU9JICovCi0gICAgaW5wdXRjdGwtPnB1Yi5lb2lfcmVhY2hlZCA9IFRSVUU7Ci0gICAgaWYgKGlucHV0Y3RsLT5pbmhlYWRlcnMpIHsJLyogVGFibGVzLW9ubHkgZGF0YXN0cmVhbSwgYXBwYXJlbnRseSAqLwotICAgICAgaWYgKGNpbmZvLT5tYXJrZXItPnNhd19TT0YpCi0JRVJSRVhJVChjaW5mbywgSkVSUl9TT0ZfTk9fU09TKTsKLSAgICB9IGVsc2UgewotICAgICAgLyogUHJldmVudCBpbmZpbml0ZSBsb29wIGluIGNvZWYgY3RscidzIGRlY29tcHJlc3NfZGF0YSByb3V0aW5lCi0gICAgICAgKiBpZiB1c2VyIHNldCBvdXRwdXRfc2Nhbl9udW1iZXIgbGFyZ2VyIHRoYW4gbnVtYmVyIG9mIHNjYW5zLgotICAgICAgICovCi0gICAgICBpZiAoY2luZm8tPm91dHB1dF9zY2FuX251bWJlciA+IGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcikKLQljaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyID0gY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBKUEVHX1NVU1BFTkRFRDoKLSAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiB2YWw7Ci19Ci0KLQotLyoKLSAqIFJlc2V0IHN0YXRlIHRvIGJlZ2luIGEgZnJlc2ggZGF0YXN0cmVhbS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXJlc2V0X2lucHV0X2NvbnRyb2xsZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2lucHV0Y3RsX3B0ciBpbnB1dGN0bCA9IChteV9pbnB1dGN0bF9wdHIpIGNpbmZvLT5pbnB1dGN0bDsKLQotICBpbnB1dGN0bC0+cHViLmNvbnN1bWVfaW5wdXQgPSBjb25zdW1lX21hcmtlcnM7Ci0gIGlucHV0Y3RsLT5wdWIuaGFzX211bHRpcGxlX3NjYW5zID0gRkFMU0U7IC8qICJ1bmtub3duIiB3b3VsZCBiZSBiZXR0ZXIgKi8KLSAgaW5wdXRjdGwtPnB1Yi5lb2lfcmVhY2hlZCA9IEZBTFNFOwotICBpbnB1dGN0bC0+aW5oZWFkZXJzID0gVFJVRTsKLSAgLyogUmVzZXQgb3RoZXIgbW9kdWxlcyAqLwotICAoKmNpbmZvLT5lcnItPnJlc2V0X2Vycm9yX21ncikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgKCpjaW5mby0+bWFya2VyLT5yZXNldF9tYXJrZXJfcmVhZGVyKSAoY2luZm8pOwotICAvKiBSZXNldCBwcm9ncmVzc2lvbiBzdGF0ZSAtLSB3b3VsZCBiZSBjbGVhbmVyIGlmIGVudHJvcHkgZGVjb2RlciBkaWQgdGhpcyAqLwotICBjaW5mby0+Y29lZl9iaXRzID0gTlVMTDsKLX0KLQotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgaW5wdXQgY29udHJvbGxlciBtb2R1bGUuCi0gKiBUaGlzIGlzIGNhbGxlZCBvbmx5IG9uY2UsIHdoZW4gdGhlIGRlY29tcHJlc3Npb24gb2JqZWN0IGlzIGNyZWF0ZWQuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9pbnB1dF9jb250cm9sbGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9pbnB1dGN0bF9wdHIgaW5wdXRjdGw7Ci0KLSAgLyogQ3JlYXRlIHN1Ym9iamVjdCBpbiBwZXJtYW5lbnQgcG9vbCAqLwotICBpbnB1dGN0bCA9IChteV9pbnB1dGN0bF9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9QRVJNQU5FTlQsCi0JCQkJU0laRU9GKG15X2lucHV0X2NvbnRyb2xsZXIpKTsKLSAgY2luZm8tPmlucHV0Y3RsID0gKHN0cnVjdCBqcGVnX2lucHV0X2NvbnRyb2xsZXIgKikgaW5wdXRjdGw7Ci0gIC8qIEluaXRpYWxpemUgbWV0aG9kIHBvaW50ZXJzICovCi0gIGlucHV0Y3RsLT5wdWIuY29uc3VtZV9pbnB1dCA9IGNvbnN1bWVfbWFya2VyczsKLSAgaW5wdXRjdGwtPnB1Yi5yZXNldF9pbnB1dF9jb250cm9sbGVyID0gcmVzZXRfaW5wdXRfY29udHJvbGxlcjsKLSAgaW5wdXRjdGwtPnB1Yi5zdGFydF9pbnB1dF9wYXNzID0gc3RhcnRfaW5wdXRfcGFzczsKLSAgaW5wdXRjdGwtPnB1Yi5maW5pc2hfaW5wdXRfcGFzcyA9IGZpbmlzaF9pbnB1dF9wYXNzOwotICAvKiBJbml0aWFsaXplIHN0YXRlOiBjYW4ndCB1c2UgcmVzZXRfaW5wdXRfY29udHJvbGxlciBzaW5jZSB3ZSBkb24ndAotICAgKiB3YW50IHRvIHRyeSB0byByZXNldCBvdGhlciBtb2R1bGVzIHlldC4KLSAgICovCi0gIGlucHV0Y3RsLT5wdWIuaGFzX211bHRpcGxlX3NjYW5zID0gRkFMU0U7IC8qICJ1bmtub3duIiB3b3VsZCBiZSBiZXR0ZXIgKi8KLSAgaW5wdXRjdGwtPnB1Yi5lb2lfcmVhY2hlZCA9IEZBTFNFOwotICBpbnB1dGN0bC0+aW5oZWFkZXJzID0gVFJVRTsKLX0KLQotI2VuZGlmIC8vX0ZYX0pQRUdfVFVSQk9fCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZG1haW5jdC5jIGIvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamRtYWluY3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ4M2U2Zi4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZG1haW5jdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTE1ICswLDAgQEAKLSNpZiAhZGVmaW5lZChfRlhfSlBFR19UVVJCT18pCi0vKgotICogamRtYWluY3QuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtYWluIGJ1ZmZlciBjb250cm9sbGVyIGZvciBkZWNvbXByZXNzaW9uLgotICogVGhlIG1haW4gYnVmZmVyIGxpZXMgYmV0d2VlbiB0aGUgSlBFRyBkZWNvbXByZXNzb3IgcHJvcGVyIGFuZCB0aGUKLSAqIHBvc3QtcHJvY2Vzc29yOyBpdCBob2xkcyBkb3duc2FtcGxlZCBkYXRhIGluIHRoZSBKUEVHIGNvbG9yc3BhY2UuCi0gKgotICogTm90ZSB0aGF0IHRoaXMgY29kZSBpcyBieXBhc3NlZCBpbiByYXctZGF0YSBtb2RlLCBzaW5jZSB0aGUgYXBwbGljYXRpb24KLSAqIHN1cHBsaWVzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBtYWluIGJ1ZmZlciBpbiB0aGF0IGNhc2UuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLS8qCi0gKiBJbiB0aGUgY3VycmVudCBzeXN0ZW0gZGVzaWduLCB0aGUgbWFpbiBidWZmZXIgbmVlZCBuZXZlciBiZSBhIGZ1bGwtaW1hZ2UKLSAqIGJ1ZmZlcjsgYW55IGZ1bGwtaGVpZ2h0IGJ1ZmZlcnMgd2lsbCBiZSBmb3VuZCBpbnNpZGUgdGhlIGNvZWZmaWNpZW50IG9yCi0gKiBwb3N0cHJvY2Vzc2luZyBjb250cm9sbGVycy4gIE5vbmV0aGVsZXNzLCB0aGUgbWFpbiBjb250cm9sbGVyIGlzIG5vdAotICogdHJpdmlhbC4gIEl0cyByZXNwb25zaWJpbGl0eSBpcyB0byBwcm92aWRlIGNvbnRleHQgcm93cyBmb3IgdXBzYW1wbGluZy8KLSAqIHJlc2NhbGluZywgYW5kIGRvaW5nIHRoaXMgaW4gYW4gZWZmaWNpZW50IGZhc2hpb24gaXMgYSBiaXQgdHJpY2t5LgotICoKLSAqIFBvc3Rwcm9jZXNzb3IgaW5wdXQgZGF0YSBpcyBjb3VudGVkIGluICJyb3cgZ3JvdXBzIi4gIEEgcm93IGdyb3VwCi0gKiBpcyBkZWZpbmVkIHRvIGJlICh2X3NhbXBfZmFjdG9yICogRENUX3NjYWxlZF9zaXplIC8gbWluX0RDVF9zY2FsZWRfc2l6ZSkKLSAqIHNhbXBsZSByb3dzIG9mIGVhY2ggY29tcG9uZW50LiAgKFdlIHJlcXVpcmUgRENUX3NjYWxlZF9zaXplIHZhbHVlcyB0byBiZQotICogY2hvc2VuIHN1Y2ggdGhhdCB0aGVzZSBudW1iZXJzIGFyZSBpbnRlZ2Vycy4gIEluIHByYWN0aWNlIERDVF9zY2FsZWRfc2l6ZQotICogdmFsdWVzIHdpbGwgbGlrZWx5IGJlIHBvd2VycyBvZiB0d28sIHNvIHdlIGFjdHVhbGx5IGhhdmUgdGhlIHN0cm9uZ2VyCi0gKiBjb25kaXRpb24gdGhhdCBEQ1Rfc2NhbGVkX3NpemUgLyBtaW5fRENUX3NjYWxlZF9zaXplIGlzIGFuIGludGVnZXIuKQotICogVXBzYW1wbGluZyB3aWxsIHR5cGljYWxseSBwcm9kdWNlIG1heF92X3NhbXBfZmFjdG9yIHBpeGVsIHJvd3MgZnJvbSBlYWNoCi0gKiByb3cgZ3JvdXAgKHRpbWVzIGFueSBhZGRpdGlvbmFsIHNjYWxlIGZhY3RvciB0aGF0IHRoZSB1cHNhbXBsZXIgaXMKLSAqIGFwcGx5aW5nKS4KLSAqCi0gKiBUaGUgY29lZmZpY2llbnQgY29udHJvbGxlciB3aWxsIGRlbGl2ZXIgZGF0YSB0byB1cyBvbmUgaU1DVSByb3cgYXQgYSB0aW1lOwotICogZWFjaCBpTUNVIHJvdyBjb250YWlucyB2X3NhbXBfZmFjdG9yICogRENUX3NjYWxlZF9zaXplIHNhbXBsZSByb3dzLCBvcgotICogZXhhY3RseSBtaW5fRENUX3NjYWxlZF9zaXplIHJvdyBncm91cHMuICAoVGhpcyBhbW91bnQgb2YgZGF0YSBjb3JyZXNwb25kcwotICogdG8gb25lIHJvdyBvZiBNQ1VzIHdoZW4gdGhlIGltYWdlIGlzIGZ1bGx5IGludGVybGVhdmVkLikgIE5vdGUgdGhhdCB0aGUKLSAqIG51bWJlciBvZiBzYW1wbGUgcm93cyB2YXJpZXMgYWNyb3NzIGNvbXBvbmVudHMsIGJ1dCB0aGUgbnVtYmVyIG9mIHJvdwotICogZ3JvdXBzIGRvZXMgbm90LiAgU29tZSBnYXJiYWdlIHNhbXBsZSByb3dzIG1heSBiZSBpbmNsdWRlZCBpbiB0aGUgbGFzdCBpTUNVCi0gKiByb3cgYXQgdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UuCi0gKgotICogRGVwZW5kaW5nIG9uIHRoZSB2ZXJ0aWNhbCBzY2FsaW5nIGFsZ29yaXRobSB1c2VkLCB0aGUgdXBzYW1wbGVyIG1heSBuZWVkCi0gKiBhY2Nlc3MgdG8gdGhlIHNhbXBsZSByb3cocykgYWJvdmUgYW5kIGJlbG93IGl0cyBjdXJyZW50IGlucHV0IHJvdyBncm91cC4KLSAqIFRoZSB1cHNhbXBsZXIgaXMgcmVxdWlyZWQgdG8gc2V0IG5lZWRfY29udGV4dF9yb3dzIFRSVUUgYXQgZ2xvYmFsIHNlbGVjdGlvbgotICogdGltZSBpZiBzby4gIFdoZW4gbmVlZF9jb250ZXh0X3Jvd3MgaXMgRkFMU0UsIHRoaXMgY29udHJvbGxlciBjYW4gc2ltcGx5Ci0gKiBvYnRhaW4gb25lIGlNQ1Ugcm93IGF0IGEgdGltZSBmcm9tIHRoZSBjb2VmZmljaWVudCBjb250cm9sbGVyIGFuZCBkb2xlIGl0Ci0gKiBvdXQgYXMgcm93IGdyb3VwcyB0byB0aGUgcG9zdHByb2Nlc3Nvci4KLSAqCi0gKiBXaGVuIG5lZWRfY29udGV4dF9yb3dzIGlzIFRSVUUsIHRoaXMgY29udHJvbGxlciBndWFyYW50ZWVzIHRoYXQgdGhlIGJ1ZmZlcgotICogcGFzc2VkIHRvIHBvc3Rwcm9jZXNzaW5nIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSByb3cgZ3JvdXAncyB3b3J0aCBvZiBzYW1wbGVzCi0gKiBhYm92ZSBhbmQgYmVsb3cgdGhlIHJvdyBncm91cChzKSBiZWluZyBwcm9jZXNzZWQuICBOb3RlIHRoYXQgdGhlIGNvbnRleHQKLSAqIHJvd3MgImFib3ZlIiB0aGUgZmlyc3QgcGFzc2VkIHJvdyBncm91cCBhcHBlYXIgYXQgbmVnYXRpdmUgcm93IG9mZnNldHMgaW4KLSAqIHRoZSBwYXNzZWQgYnVmZmVyLiAgQXQgdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBpbWFnZSwgdGhlIHJlcXVpcmVkCi0gKiBjb250ZXh0IHJvd3MgYXJlIG1hbnVmYWN0dXJlZCBieSBkdXBsaWNhdGluZyB0aGUgZmlyc3Qgb3IgbGFzdCByZWFsIHNhbXBsZQotICogcm93OyB0aGlzIGF2b2lkcyBoYXZpbmcgc3BlY2lhbCBjYXNlcyBpbiB0aGUgdXBzYW1wbGluZyBpbm5lciBsb29wcy4KLSAqCi0gKiBUaGUgYW1vdW50IG9mIGNvbnRleHQgaXMgZml4ZWQgYXQgb25lIHJvdyBncm91cCBqdXN0IGJlY2F1c2UgdGhhdCdzIGEKLSAqIGNvbnZlbmllbnQgbnVtYmVyIGZvciB0aGlzIGNvbnRyb2xsZXIgdG8gd29yayB3aXRoLiAgVGhlIGV4aXN0aW5nCi0gKiB1cHNhbXBsZXJzIHJlYWxseSBvbmx5IG5lZWQgb25lIHNhbXBsZSByb3cgb2YgY29udGV4dC4gIEFuIHVwc2FtcGxlcgotICogc3VwcG9ydGluZyBhcmJpdHJhcnkgb3V0cHV0IHJlc2NhbGluZyBtaWdodCB3aXNoIGZvciBtb3JlIHRoYW4gb25lIHJvdwotICogZ3JvdXAgb2YgY29udGV4dCB3aGVuIHNocmlua2luZyB0aGUgaW1hZ2U7IHRvdWdoLCB3ZSBkb24ndCBoYW5kbGUgdGhhdC4KLSAqIChUaGlzIGlzIGp1c3RpZmllZCBieSB0aGUgYXNzdW1wdGlvbiB0aGF0IGRvd25zaXppbmcgd2lsbCBiZSBoYW5kbGVkIG1vc3RseQotICogYnkgYWRqdXN0aW5nIHRoZSBEQ1Rfc2NhbGVkX3NpemUgdmFsdWVzLCBzbyB0aGF0IHRoZSBhY3R1YWwgc2NhbGUgZmFjdG9yIGF0Ci0gKiB0aGUgdXBzYW1wbGUgc3RlcCBuZWVkbid0IGJlIG11Y2ggbGVzcyB0aGFuIG9uZS4pCi0gKgotICogVG8gcHJvdmlkZSB0aGUgZGVzaXJlZCBjb250ZXh0LCB3ZSBoYXZlIHRvIHJldGFpbiB0aGUgbGFzdCB0d28gcm93IGdyb3VwcwotICogb2Ygb25lIGlNQ1Ugcm93IHdoaWxlIHJlYWRpbmcgaW4gdGhlIG5leHQgaU1DVSByb3cuICAoVGhlIGxhc3Qgcm93IGdyb3VwCi0gKiBjYW4ndCBiZSBwcm9jZXNzZWQgdW50aWwgd2UgaGF2ZSBhbm90aGVyIHJvdyBncm91cCBmb3IgaXRzIGJlbG93LWNvbnRleHQsCi0gKiBhbmQgc28gd2UgaGF2ZSB0byBzYXZlIHRoZSBuZXh0LXRvLWxhc3QgZ3JvdXAgdG9vIGZvciBpdHMgYWJvdmUtY29udGV4dC4pCi0gKiBXZSBjb3VsZCBkbyB0aGlzIG1vc3Qgc2ltcGx5IGJ5IGNvcHlpbmcgZGF0YSBhcm91bmQgaW4gb3VyIGJ1ZmZlciwgYnV0Ci0gKiB0aGF0J2QgYmUgdmVyeSBzbG93LiAgV2UgY2FuIGF2b2lkIGNvcHlpbmcgYW55IGRhdGEgYnkgY3JlYXRpbmcgYSByYXRoZXIKLSAqIHN0cmFuZ2UgcG9pbnRlciBzdHJ1Y3R1cmUuICBIZXJlJ3MgaG93IGl0IHdvcmtzLiAgV2UgYWxsb2NhdGUgYSB3b3Jrc3BhY2UKLSAqIGNvbnNpc3Rpbmcgb2YgTSsyIHJvdyBncm91cHMgKHdoZXJlIE0gPSBtaW5fRENUX3NjYWxlZF9zaXplIGlzIHRoZSBudW1iZXIKLSAqIG9mIHJvdyBncm91cHMgcGVyIGlNQ1Ugcm93KS4gIFdlIGNyZWF0ZSB0d28gc2V0cyBvZiByZWR1bmRhbnQgcG9pbnRlcnMgdG8KLSAqIHRoZSB3b3Jrc3BhY2UuICBMYWJlbGluZyB0aGUgcGh5c2ljYWwgcm93IGdyb3VwcyAwIHRvIE0rMSwgdGhlIHN5bnRoZXNpemVkCi0gKiBwb2ludGVyIGxpc3RzIGxvb2sgbGlrZSB0aGlzOgotICogICAgICAgICAgICAgICAgICAgTSsxICAgICAgICAgICAgICAgICAgICAgICAgICBNLTEKLSAqIG1hc3RlciBwb2ludGVyIC0tPiAwICAgICAgICAgbWFzdGVyIHBvaW50ZXIgLS0+IDAKLSAqICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSAqICAgICAgICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uCi0gKiAgICAgICAgICAgICAgICAgICBNLTMgICAgICAgICAgICAgICAgICAgICAgICAgIE0tMwotICogICAgICAgICAgICAgICAgICAgTS0yICAgICAgICAgICAgICAgICAgICAgICAgICAgTQotICogICAgICAgICAgICAgICAgICAgTS0xICAgICAgICAgICAgICAgICAgICAgICAgICBNKzEKLSAqICAgICAgICAgICAgICAgICAgICBNICAgICAgICAgICAgICAgICAgICAgICAgICAgTS0yCi0gKiAgICAgICAgICAgICAgICAgICBNKzEgICAgICAgICAgICAgICAgICAgICAgICAgIE0tMQotICogICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotICogV2UgcmVhZCBhbHRlcm5hdGUgaU1DVSByb3dzIHVzaW5nIGVhY2ggbWFzdGVyIHBvaW50ZXI7IHRodXMgdGhlIGxhc3QgdHdvCi0gKiByb3cgZ3JvdXBzIG9mIHRoZSBwcmV2aW91cyBpTUNVIHJvdyByZW1haW4gdW4tb3ZlcndyaXR0ZW4gaW4gdGhlIHdvcmtzcGFjZS4KLSAqIFRoZSBwb2ludGVyIGxpc3RzIGFyZSBzZXQgdXAgc28gdGhhdCB0aGUgcmVxdWlyZWQgY29udGV4dCByb3dzIGFwcGVhciB0bwotICogYmUgYWRqYWNlbnQgdG8gdGhlIHByb3BlciBwbGFjZXMgd2hlbiB3ZSBwYXNzIHRoZSBwb2ludGVyIGxpc3RzIHRvIHRoZQotICogdXBzYW1wbGVyLgotICoKLSAqIFRoZSBhYm92ZSBwaWN0dXJlcyBkZXNjcmliZSB0aGUgbm9ybWFsIHN0YXRlIG9mIHRoZSBwb2ludGVyIGxpc3RzLgotICogQXQgdG9wIGFuZCBib3R0b20gb2YgdGhlIGltYWdlLCB3ZSBkaWRkbGUgdGhlIHBvaW50ZXIgbGlzdHMgdG8gZHVwbGljYXRlCi0gKiB0aGUgZmlyc3Qgb3IgbGFzdCBzYW1wbGUgcm93IGFzIG5lY2Vzc2FyeSAodGhpcyBpcyBjaGVhcGVyIHRoYW4gY29weWluZwotICogc2FtcGxlIHJvd3MgYXJvdW5kKS4KLSAqCi0gKiBUaGlzIHNjaGVtZSBicmVha3MgZG93biBpZiBNIDwgMiwgaWUsIG1pbl9EQ1Rfc2NhbGVkX3NpemUgaXMgMS4gIEluIHRoYXQKLSAqIHNpdHVhdGlvbiBlYWNoIGlNQ1Ugcm93IHByb3ZpZGVzIG9ubHkgb25lIHJvdyBncm91cCBzbyB0aGUgYnVmZmVyaW5nIGxvZ2ljCi0gKiBtdXN0IGJlIGRpZmZlcmVudCAoZWcsIHdlIG11c3QgcmVhZCB0d28gaU1DVSByb3dzIGJlZm9yZSB3ZSBjYW4gZW1pdCB0aGUKLSAqIGZpcnN0IHJvdyBncm91cCkuICBGb3Igbm93LCB3ZSBzaW1wbHkgZG8gbm90IHN1cHBvcnQgcHJvdmlkaW5nIGNvbnRleHQKLSAqIHJvd3Mgd2hlbiBtaW5fRENUX3NjYWxlZF9zaXplIGlzIDEuICBUaGF0IGNvbWJpbmF0aW9uIHNlZW1zIHVubGlrZWx5IHRvCi0gKiBiZSB3b3J0aCBwcm92aWRpbmcgLS0tIGlmIHNvbWVvbmUgd2FudHMgYSAxLzh0aC1zaXplIHByZXZpZXcsIHRoZXkgcHJvYmFibHkKLSAqIHdhbnQgaXQgcXVpY2sgYW5kIGRpcnR5LCBzbyBhIGNvbnRleHQtZnJlZSB1cHNhbXBsZXIgaXMgc3VmZmljaWVudC4KLSAqLwotCi0KLS8qIFByaXZhdGUgYnVmZmVyIGNvbnRyb2xsZXIgb2JqZWN0ICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGpwZWdfZF9tYWluX2NvbnRyb2xsZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgLyogUG9pbnRlciB0byBhbGxvY2F0ZWQgd29ya3NwYWNlIChNIG9yIE0rMiByb3cgZ3JvdXBzKS4gKi8KLSAgSlNBTVBBUlJBWSBidWZmZXJbTUFYX0NPTVBPTkVOVFNdOwotCi0gIGJvb2xlYW4gYnVmZmVyX2Z1bGw7CQkvKiBIYXZlIHdlIGdvdHRlbiBhbiBpTUNVIHJvdyBmcm9tIGRlY29kZXI/ICovCi0gIEpESU1FTlNJT04gcm93Z3JvdXBfY3RyOwkvKiBjb3VudHMgcm93IGdyb3VwcyBvdXRwdXQgdG8gcG9zdHByb2Nlc3NvciAqLwotCi0gIC8qIFJlbWFpbmluZyBmaWVsZHMgYXJlIG9ubHkgdXNlZCBpbiB0aGUgY29udGV4dCBjYXNlLiAqLwotCi0gIC8qIFRoZXNlIGFyZSB0aGUgbWFzdGVyIHBvaW50ZXJzIHRvIHRoZSBmdW5ueS1vcmRlciBwb2ludGVyIGxpc3RzLiAqLwotICBKU0FNUElNQUdFIHhidWZmZXJbMl07CS8qIHBvaW50ZXJzIHRvIHdlaXJkIHBvaW50ZXIgbGlzdHMgKi8KLQotICBpbnQgd2hpY2hwdHI7CQkJLyogaW5kaWNhdGVzIHdoaWNoIHBvaW50ZXIgc2V0IGlzIG5vdyBpbiB1c2UgKi8KLSAgaW50IGNvbnRleHRfc3RhdGU7CQkvKiBwcm9jZXNzX2RhdGEgc3RhdGUgbWFjaGluZSBzdGF0dXMgKi8KLSAgSkRJTUVOU0lPTiByb3dncm91cHNfYXZhaWw7CS8qIHJvdyBncm91cHMgYXZhaWxhYmxlIHRvIHBvc3Rwcm9jZXNzb3IgKi8KLSAgSkRJTUVOU0lPTiBpTUNVX3Jvd19jdHI7CS8qIGNvdW50cyBpTUNVIHJvd3MgdG8gZGV0ZWN0IGltYWdlIHRvcC9ib3QgKi8KLX0gbXlfbWFpbl9jb250cm9sbGVyOwotCi10eXBlZGVmIG15X21haW5fY29udHJvbGxlciAqIG15X21haW5fcHRyOwotCi0vKiBjb250ZXh0X3N0YXRlIHZhbHVlczogKi8KLSNkZWZpbmUgQ1RYX1BSRVBBUkVfRk9SX0lNQ1UJMAkvKiBuZWVkIHRvIHByZXBhcmUgZm9yIE1DVSByb3cgKi8KLSNkZWZpbmUgQ1RYX1BST0NFU1NfSU1DVQkxCS8qIGZlZWRpbmcgaU1DVSB0byBwb3N0cHJvY2Vzc29yICovCi0jZGVmaW5lIENUWF9QT1NUUE9ORURfUk9XCTIJLyogZmVlZGluZyBwb3N0cG9uZWQgcm93IGdyb3VwICovCi0KLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLU1FVEhPRERFRih2b2lkKSBwcm9jZXNzX2RhdGFfc2ltcGxlX21haW4KLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKLQkgICAgIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLCBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7Ci1NRVRIT0RERUYodm9pZCkgcHJvY2Vzc19kYXRhX2NvbnRleHRfbWFpbgotCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLAotCSAgICAgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKLSNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKLU1FVEhPRERFRih2b2lkKSBwcm9jZXNzX2RhdGFfY3JhbmtfcG9zdAotCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLAotCSAgICAgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKLSNlbmRpZgotCi0KLUxPQ0FMKHZvaWQpCi1hbGxvY19mdW5ueV9wb2ludGVycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgZnVubnkgcG9pbnRlciBsaXN0cy4KLSAqIFRoaXMgaXMgZG9uZSBvbmx5IG9uY2UsIG5vdCBvbmNlIHBlciBwYXNzLgotICovCi17Ci0gIG15X21haW5fcHRyIG1haW4gPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOwotICBpbnQgY2ksIHJncm91cDsKLSAgaW50IE0gPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgSlNBTVBBUlJBWSB4YnVmOwotCi0gIC8qIEdldCB0b3AtbGV2ZWwgc3BhY2UgZm9yIGNvbXBvbmVudCBhcnJheSBwb2ludGVycy4KLSAgICogV2UgYWxsb2MgYm90aCBhcnJheXMgd2l0aCBvbmUgY2FsbCB0byBzYXZlIGEgZmV3IGN5Y2xlcy4KLSAgICovCi0gIG1haW4tPnhidWZmZXJbMF0gPSAoSlNBTVBJTUFHRSkKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCWNpbmZvLT5udW1fY29tcG9uZW50cyAqIDIgKiBTSVpFT0YoSlNBTVBBUlJBWSkpOwotICBtYWluLT54YnVmZmVyWzFdID0gbWFpbi0+eGJ1ZmZlclswXSArIGNpbmZvLT5udW1fY29tcG9uZW50czsKLQotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIHJncm91cCA9IChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSAvCi0gICAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsgLyogaGVpZ2h0IG9mIGEgcm93IGdyb3VwIG9mIGNvbXBvbmVudCAqLwotICAgIC8qIEdldCBzcGFjZSBmb3IgcG9pbnRlciBsaXN0cyAtLS0gTSs0IHJvdyBncm91cHMgaW4gZWFjaCBsaXN0LgotICAgICAqIFdlIGFsbG9jIGJvdGggcG9pbnRlciBsaXN0cyB3aXRoIG9uZSBjYWxsIHRvIHNhdmUgYSBmZXcgY3ljbGVzLgotICAgICAqLwotICAgIHhidWYgPSAoSlNBTVBBUlJBWSkKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICAyICogKHJncm91cCAqIChNICsgNCkpICogU0laRU9GKEpTQU1QUk9XKSk7Ci0gICAgeGJ1ZiArPSByZ3JvdXA7CQkvKiB3YW50IG9uZSByb3cgZ3JvdXAgYXQgbmVnYXRpdmUgb2Zmc2V0cyAqLwotICAgIG1haW4tPnhidWZmZXJbMF1bY2ldID0geGJ1ZjsKLSAgICB4YnVmICs9IHJncm91cCAqIChNICsgNCk7Ci0gICAgbWFpbi0+eGJ1ZmZlclsxXVtjaV0gPSB4YnVmOwotICB9Ci19Ci0KLQotTE9DQUwodm9pZCkKLW1ha2VfZnVubnlfcG9pbnRlcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBDcmVhdGUgdGhlIGZ1bm55IHBvaW50ZXIgbGlzdHMgZGlzY3Vzc2VkIGluIHRoZSBjb21tZW50cyBhYm92ZS4KLSAqIFRoZSBhY3R1YWwgd29ya3NwYWNlIGlzIGFscmVhZHkgYWxsb2NhdGVkIChpbiBtYWluLT5idWZmZXIpLAotICogYW5kIHRoZSBzcGFjZSBmb3IgdGhlIHBvaW50ZXIgbGlzdHMgaXMgYWxsb2NhdGVkIHRvby4KLSAqIFRoaXMgcm91dGluZSBqdXN0IGZpbGxzIGluIHRoZSBjdXJpb3VzbHkgb3JkZXJlZCBsaXN0cy4KLSAqIFRoaXMgd2lsbCBiZSByZXBlYXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcGFzcy4KLSAqLwotewotICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKLSAgaW50IGNpLCBpLCByZ3JvdXA7Ci0gIGludCBNID0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIEpTQU1QQVJSQVkgYnVmLCB4YnVmMCwgeGJ1ZjE7Ci0KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICByZ3JvdXAgPSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSkgLwotICAgICAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7IC8qIGhlaWdodCBvZiBhIHJvdyBncm91cCBvZiBjb21wb25lbnQgKi8KLSAgICB4YnVmMCA9IG1haW4tPnhidWZmZXJbMF1bY2ldOwotICAgIHhidWYxID0gbWFpbi0+eGJ1ZmZlclsxXVtjaV07Ci0gICAgLyogRmlyc3QgY29weSB0aGUgd29ya3NwYWNlIHBvaW50ZXJzIGFzLWlzICovCi0gICAgYnVmID0gbWFpbi0+YnVmZmVyW2NpXTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgcmdyb3VwICogKE0gKyAyKTsgaSsrKSB7Ci0gICAgICB4YnVmMFtpXSA9IHhidWYxW2ldID0gYnVmW2ldOwotICAgIH0KLSAgICAvKiBJbiB0aGUgc2Vjb25kIGxpc3QsIHB1dCB0aGUgbGFzdCBmb3VyIHJvdyBncm91cHMgaW4gc3dhcHBlZCBvcmRlciAqLwotICAgIGZvciAoaSA9IDA7IGkgPCByZ3JvdXAgKiAyOyBpKyspIHsKLSAgICAgIHhidWYxW3Jncm91cCooTS0yKSArIGldID0gYnVmW3Jncm91cCpNICsgaV07Ci0gICAgICB4YnVmMVtyZ3JvdXAqTSArIGldID0gYnVmW3Jncm91cCooTS0yKSArIGldOwotICAgIH0KLSAgICAvKiBUaGUgd3JhcGFyb3VuZCBwb2ludGVycyBhdCB0b3AgYW5kIGJvdHRvbSB3aWxsIGJlIGZpbGxlZCBsYXRlcgotICAgICAqIChzZWUgc2V0X3dyYXBhcm91bmRfcG9pbnRlcnMsIGJlbG93KS4gIEluaXRpYWxseSB3ZSB3YW50IHRoZSAiYWJvdmUiCi0gICAgICogcG9pbnRlcnMgdG8gZHVwbGljYXRlIHRoZSBmaXJzdCBhY3R1YWwgZGF0YSBsaW5lLiAgVGhpcyBvbmx5IG5lZWRzCi0gICAgICogdG8gaGFwcGVuIGluIHhidWZmZXJbMF0uCi0gICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8IHJncm91cDsgaSsrKSB7Ci0gICAgICB4YnVmMFtpIC0gcmdyb3VwXSA9IHhidWYwWzBdOwotICAgIH0KLSAgfQotfQotCi0KLUxPQ0FMKHZvaWQpCi1zZXRfd3JhcGFyb3VuZF9wb2ludGVycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIFNldCB1cCB0aGUgIndyYXBhcm91bmQiIHBvaW50ZXJzIGF0IHRvcCBhbmQgYm90dG9tIG9mIHRoZSBwb2ludGVyIGxpc3RzLgotICogVGhpcyBjaGFuZ2VzIHRoZSBwb2ludGVyIGxpc3Qgc3RhdGUgZnJvbSB0b3Atb2YtaW1hZ2UgdG8gdGhlIG5vcm1hbCBzdGF0ZS4KLSAqLwotewotICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKLSAgaW50IGNpLCBpLCByZ3JvdXA7Ci0gIGludCBNID0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIEpTQU1QQVJSQVkgeGJ1ZjAsIHhidWYxOwotCi0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgcmdyb3VwID0gKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIC8KLSAgICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOyAvKiBoZWlnaHQgb2YgYSByb3cgZ3JvdXAgb2YgY29tcG9uZW50ICovCi0gICAgeGJ1ZjAgPSBtYWluLT54YnVmZmVyWzBdW2NpXTsKLSAgICB4YnVmMSA9IG1haW4tPnhidWZmZXJbMV1bY2ldOwotICAgIGZvciAoaSA9IDA7IGkgPCByZ3JvdXA7IGkrKykgewotICAgICAgeGJ1ZjBbaSAtIHJncm91cF0gPSB4YnVmMFtyZ3JvdXAqKE0rMSkgKyBpXTsKLSAgICAgIHhidWYxW2kgLSByZ3JvdXBdID0geGJ1ZjFbcmdyb3VwKihNKzEpICsgaV07Ci0gICAgICB4YnVmMFtyZ3JvdXAqKE0rMikgKyBpXSA9IHhidWYwW2ldOwotICAgICAgeGJ1ZjFbcmdyb3VwKihNKzIpICsgaV0gPSB4YnVmMVtpXTsKLSAgICB9Ci0gIH0KLX0KLQotCi1MT0NBTCh2b2lkKQotc2V0X2JvdHRvbV9wb2ludGVycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIENoYW5nZSB0aGUgcG9pbnRlciBsaXN0cyB0byBkdXBsaWNhdGUgdGhlIGxhc3Qgc2FtcGxlIHJvdyBhdCB0aGUgYm90dG9tCi0gKiBvZiB0aGUgaW1hZ2UuICB3aGljaHB0ciBpbmRpY2F0ZXMgd2hpY2ggeGJ1ZmZlciBob2xkcyB0aGUgZmluYWwgaU1DVSByb3cuCi0gKiBBbHNvIHNldHMgcm93Z3JvdXBzX2F2YWlsIHRvIGluZGljYXRlIG51bWJlciBvZiBub25kdW1teSByb3cgZ3JvdXBzIGluIHJvdy4KLSAqLwotewotICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKLSAgaW50IGNpLCBpLCByZ3JvdXAsIGlNQ1VoZWlnaHQsIHJvd3NfbGVmdDsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgSlNBTVBBUlJBWSB4YnVmOwotCi0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgLyogQ291bnQgc2FtcGxlIHJvd3MgaW4gb25lIGlNQ1Ugcm93IGFuZCBpbiBvbmUgcm93IGdyb3VwICovCi0gICAgaU1DVWhlaWdodCA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7Ci0gICAgcmdyb3VwID0gaU1DVWhlaWdodCAvIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOwotICAgIC8qIENvdW50IG5vbmR1bW15IHNhbXBsZSByb3dzIHJlbWFpbmluZyBmb3IgdGhpcyBjb21wb25lbnQgKi8KLSAgICByb3dzX2xlZnQgPSAoaW50KSAoY29tcHB0ci0+ZG93bnNhbXBsZWRfaGVpZ2h0ICUgKEpESU1FTlNJT04pIGlNQ1VoZWlnaHQpOwotICAgIGlmIChyb3dzX2xlZnQgPT0gMCkgcm93c19sZWZ0ID0gaU1DVWhlaWdodDsKLSAgICAvKiBDb3VudCBub25kdW1teSByb3cgZ3JvdXBzLiAgU2hvdWxkIGdldCBzYW1lIGFuc3dlciBmb3IgZWFjaCBjb21wb25lbnQsCi0gICAgICogc28gd2UgbmVlZCBvbmx5IGRvIGl0IG9uY2UuCi0gICAgICovCi0gICAgaWYgKGNpID09IDApIHsKLSAgICAgIG1haW4tPnJvd2dyb3Vwc19hdmFpbCA9IChKRElNRU5TSU9OKSAoKHJvd3NfbGVmdC0xKSAvIHJncm91cCArIDEpOwotICAgIH0KLSAgICAvKiBEdXBsaWNhdGUgdGhlIGxhc3QgcmVhbCBzYW1wbGUgcm93IHJncm91cCoyIHRpbWVzOyB0aGlzIHBhZHMgb3V0IHRoZQotICAgICAqIGxhc3QgcGFydGlhbCByb3dncm91cCBhbmQgZW5zdXJlcyBhdCBsZWFzdCBvbmUgZnVsbCByb3dncm91cCBvZiBjb250ZXh0LgotICAgICAqLwotICAgIHhidWYgPSBtYWluLT54YnVmZmVyW21haW4tPndoaWNocHRyXVtjaV07Ci0gICAgZm9yIChpID0gMDsgaSA8IHJncm91cCAqIDI7IGkrKykgewotICAgICAgeGJ1Zltyb3dzX2xlZnQgKyBpXSA9IHhidWZbcm93c19sZWZ0LTFdOwotICAgIH0KLSAgfQotfQotCi0KLS8qCi0gKiBJbml0aWFsaXplIGZvciBhIHByb2Nlc3NpbmcgcGFzcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfbWFpbiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpCi17Ci0gIG15X21haW5fcHRyIG1haW4gPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOwotCi0gIHN3aXRjaCAocGFzc19tb2RlKSB7Ci0gIGNhc2UgSkJVRl9QQVNTX1RIUlU6Ci0gICAgaWYgKGNpbmZvLT51cHNhbXBsZS0+bmVlZF9jb250ZXh0X3Jvd3MpIHsKLSAgICAgIG1haW4tPnB1Yi5wcm9jZXNzX2RhdGEgPSBwcm9jZXNzX2RhdGFfY29udGV4dF9tYWluOwotICAgICAgbWFrZV9mdW5ueV9wb2ludGVycyhjaW5mbyk7IC8qIENyZWF0ZSB0aGUgeGJ1ZmZlcltdIGxpc3RzICovCi0gICAgICBtYWluLT53aGljaHB0ciA9IDA7CS8qIFJlYWQgZmlyc3QgaU1DVSByb3cgaW50byB4YnVmZmVyWzBdICovCi0gICAgICBtYWluLT5jb250ZXh0X3N0YXRlID0gQ1RYX1BSRVBBUkVfRk9SX0lNQ1U7Ci0gICAgICBtYWluLT5pTUNVX3Jvd19jdHIgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBTaW1wbGUgY2FzZSB3aXRoIG5vIGNvbnRleHQgbmVlZGVkICovCi0gICAgICBtYWluLT5wdWIucHJvY2Vzc19kYXRhID0gcHJvY2Vzc19kYXRhX3NpbXBsZV9tYWluOwotICAgIH0KLSAgICBtYWluLT5idWZmZXJfZnVsbCA9IEZBTFNFOwkvKiBNYXJrIGJ1ZmZlciBlbXB0eSAqLwotICAgIG1haW4tPnJvd2dyb3VwX2N0ciA9IDA7Ci0gICAgYnJlYWs7Ci0jaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECi0gIGNhc2UgSkJVRl9DUkFOS19ERVNUOgotICAgIC8qIEZvciBsYXN0IHBhc3Mgb2YgMi1wYXNzIHF1YW50aXphdGlvbiwganVzdCBjcmFuayB0aGUgcG9zdHByb2Nlc3NvciAqLwotICAgIG1haW4tPnB1Yi5wcm9jZXNzX2RhdGEgPSBwcm9jZXNzX2RhdGFfY3JhbmtfcG9zdDsKLSAgICBicmVhazsKLSNlbmRpZgotICBkZWZhdWx0OgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKLSAgICBicmVhazsKLSAgfQotfQotCi0KLS8qCi0gKiBQcm9jZXNzIHNvbWUgZGF0YS4KLSAqIFRoaXMgaGFuZGxlcyB0aGUgc2ltcGxlIGNhc2Ugd2hlcmUgbm8gY29udGV4dCBpcyByZXF1aXJlZC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXByb2Nlc3NfZGF0YV9zaW1wbGVfbWFpbiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCSAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKLQkJCSAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkKLXsKLSAgbXlfbWFpbl9wdHIgbWFpbiA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47Ci0gIEpESU1FTlNJT04gcm93Z3JvdXBzX2F2YWlsOwotCi0gIC8qIFJlYWQgaW5wdXQgZGF0YSBpZiB3ZSBoYXZlbid0IGZpbGxlZCB0aGUgbWFpbiBidWZmZXIgeWV0ICovCi0gIGlmICghIG1haW4tPmJ1ZmZlcl9mdWxsKSB7Ci0gICAgaWYgKCEgKCpjaW5mby0+Y29lZi0+ZGVjb21wcmVzc19kYXRhKSAoY2luZm8sIG1haW4tPmJ1ZmZlcikpCi0gICAgICByZXR1cm47CQkJLyogc3VzcGVuc2lvbiBmb3JjZWQsIGNhbiBkbyBub3RoaW5nIG1vcmUgKi8KLSAgICBtYWluLT5idWZmZXJfZnVsbCA9IFRSVUU7CS8qIE9LLCB3ZSBoYXZlIGFuIGlNQ1Ugcm93IHRvIHdvcmsgd2l0aCAqLwotICB9Ci0KLSAgLyogVGhlcmUgYXJlIGFsd2F5cyBtaW5fRENUX3NjYWxlZF9zaXplIHJvdyBncm91cHMgaW4gYW4gaU1DVSByb3cuICovCi0gIHJvd2dyb3Vwc19hdmFpbCA9IChKRElNRU5TSU9OKSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKLSAgLyogTm90ZTogYXQgdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UsIHdlIG1heSBwYXNzIGV4dHJhIGdhcmJhZ2Ugcm93IGdyb3VwcwotICAgKiB0byB0aGUgcG9zdHByb2Nlc3Nvci4gIFRoZSBwb3N0cHJvY2Vzc29yIGhhcyB0byBjaGVjayBmb3IgYm90dG9tCi0gICAqIG9mIGltYWdlIGFueXdheSAoYXQgcm93IHJlc29sdXRpb24pLCBzbyBubyBwb2ludCBpbiB1cyBkb2luZyBpdCB0b28uCi0gICAqLwotCi0gIC8qIEZlZWQgdGhlIHBvc3Rwcm9jZXNzb3IgKi8KLSAgKCpjaW5mby0+cG9zdC0+cG9zdF9wcm9jZXNzX2RhdGEpIChjaW5mbywgbWFpbi0+YnVmZmVyLAotCQkJCSAgICAgJm1haW4tPnJvd2dyb3VwX2N0ciwgcm93Z3JvdXBzX2F2YWlsLAotCQkJCSAgICAgb3V0cHV0X2J1Ziwgb3V0X3Jvd19jdHIsIG91dF9yb3dzX2F2YWlsKTsKLQotICAvKiBIYXMgcG9zdHByb2Nlc3NvciBjb25zdW1lZCBhbGwgdGhlIGRhdGEgeWV0PyBJZiBzbywgbWFyayBidWZmZXIgZW1wdHkgKi8KLSAgaWYgKG1haW4tPnJvd2dyb3VwX2N0ciA+PSByb3dncm91cHNfYXZhaWwpIHsKLSAgICBtYWluLT5idWZmZXJfZnVsbCA9IEZBTFNFOwotICAgIG1haW4tPnJvd2dyb3VwX2N0ciA9IDA7Ci0gIH0KLX0KLQotCi0vKgotICogUHJvY2VzcyBzb21lIGRhdGEuCi0gKiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgY29udGV4dCByb3dzIG11c3QgYmUgcHJvdmlkZWQuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1wcm9jZXNzX2RhdGFfY29udGV4dF9tYWluIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKLQkJCSAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCi17Ci0gIG15X21haW5fcHRyIG1haW4gPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOwotCi0gIC8qIFJlYWQgaW5wdXQgZGF0YSBpZiB3ZSBoYXZlbid0IGZpbGxlZCB0aGUgbWFpbiBidWZmZXIgeWV0ICovCi0gIGlmICghIG1haW4tPmJ1ZmZlcl9mdWxsKSB7Ci0gICAgaWYgKCEgKCpjaW5mby0+Y29lZi0+ZGVjb21wcmVzc19kYXRhKSAoY2luZm8sCi0JCQkJCSAgIG1haW4tPnhidWZmZXJbbWFpbi0+d2hpY2hwdHJdKSkKLSAgICAgIHJldHVybjsJCQkvKiBzdXNwZW5zaW9uIGZvcmNlZCwgY2FuIGRvIG5vdGhpbmcgbW9yZSAqLwotICAgIG1haW4tPmJ1ZmZlcl9mdWxsID0gVFJVRTsJLyogT0ssIHdlIGhhdmUgYW4gaU1DVSByb3cgdG8gd29yayB3aXRoICovCi0gICAgbWFpbi0+aU1DVV9yb3dfY3RyKys7CS8qIGNvdW50IHJvd3MgcmVjZWl2ZWQgKi8KLSAgfQotCi0gIC8qIFBvc3Rwcm9jZXNzb3IgdHlwaWNhbGx5IHdpbGwgbm90IHN3YWxsb3cgYWxsIHRoZSBpbnB1dCBkYXRhIGl0IGlzIGhhbmRlZAotICAgKiBpbiBvbmUgY2FsbCAoZHVlIHRvIGZpbGxpbmcgdGhlIG91dHB1dCBidWZmZXIgZmlyc3QpLiAgTXVzdCBiZSBwcmVwYXJlZAotICAgKiB0byBleGl0IGFuZCByZXN0YXJ0LiAgVGhpcyBzd2l0Y2ggbGV0cyB1cyBrZWVwIHRyYWNrIG9mIGhvdyBmYXIgd2UgZ290LgotICAgKiBOb3RlIHRoYXQgZWFjaCBjYXNlIGZhbGxzIHRocm91Z2ggdG8gdGhlIG5leHQgb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLgotICAgKi8KLSAgc3dpdGNoIChtYWluLT5jb250ZXh0X3N0YXRlKSB7Ci0gIGNhc2UgQ1RYX1BPU1RQT05FRF9ST1c6Ci0gICAgLyogQ2FsbCBwb3N0cHJvY2Vzc29yIHVzaW5nIHByZXZpb3VzbHkgc2V0IHBvaW50ZXJzIGZvciBwb3N0cG9uZWQgcm93ICovCi0gICAgKCpjaW5mby0+cG9zdC0+cG9zdF9wcm9jZXNzX2RhdGEpIChjaW5mbywgbWFpbi0+eGJ1ZmZlclttYWluLT53aGljaHB0cl0sCi0JCQkmbWFpbi0+cm93Z3JvdXBfY3RyLCBtYWluLT5yb3dncm91cHNfYXZhaWwsCi0JCQlvdXRwdXRfYnVmLCBvdXRfcm93X2N0ciwgb3V0X3Jvd3NfYXZhaWwpOwotICAgIGlmIChtYWluLT5yb3dncm91cF9jdHIgPCBtYWluLT5yb3dncm91cHNfYXZhaWwpCi0gICAgICByZXR1cm47CQkJLyogTmVlZCB0byBzdXNwZW5kICovCi0gICAgbWFpbi0+Y29udGV4dF9zdGF0ZSA9IENUWF9QUkVQQVJFX0ZPUl9JTUNVOwotICAgIGlmICgqb3V0X3Jvd19jdHIgPj0gb3V0X3Jvd3NfYXZhaWwpCi0gICAgICByZXR1cm47CQkJLyogUG9zdHByb2Nlc3NvciBleGFjdGx5IGZpbGxlZCBvdXRwdXQgYnVmICovCi0gICAgLypGQUxMVEhST1VHSCovCi0gIGNhc2UgQ1RYX1BSRVBBUkVfRk9SX0lNQ1U6Ci0gICAgLyogUHJlcGFyZSB0byBwcm9jZXNzIGZpcnN0IE0tMSByb3cgZ3JvdXBzIG9mIHRoaXMgaU1DVSByb3cgKi8KLSAgICBtYWluLT5yb3dncm91cF9jdHIgPSAwOwotICAgIG1haW4tPnJvd2dyb3Vwc19hdmFpbCA9IChKRElNRU5TSU9OKSAoY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgLSAxKTsKLSAgICAvKiBDaGVjayBmb3IgYm90dG9tIG9mIGltYWdlOiBpZiBzbywgdHdlYWsgcG9pbnRlcnMgdG8gImR1cGxpY2F0ZSIKLSAgICAgKiB0aGUgbGFzdCBzYW1wbGUgcm93LCBhbmQgYWRqdXN0IHJvd2dyb3Vwc19hdmFpbCB0byBpZ25vcmUgcGFkZGluZyByb3dzLgotICAgICAqLwotICAgIGlmIChtYWluLT5pTUNVX3Jvd19jdHIgPT0gY2luZm8tPnRvdGFsX2lNQ1Vfcm93cykKLSAgICAgIHNldF9ib3R0b21fcG9pbnRlcnMoY2luZm8pOwotICAgIG1haW4tPmNvbnRleHRfc3RhdGUgPSBDVFhfUFJPQ0VTU19JTUNVOwotICAgIC8qRkFMTFRIUk9VR0gqLwotICBjYXNlIENUWF9QUk9DRVNTX0lNQ1U6Ci0gICAgLyogQ2FsbCBwb3N0cHJvY2Vzc29yIHVzaW5nIHByZXZpb3VzbHkgc2V0IHBvaW50ZXJzICovCi0gICAgKCpjaW5mby0+cG9zdC0+cG9zdF9wcm9jZXNzX2RhdGEpIChjaW5mbywgbWFpbi0+eGJ1ZmZlclttYWluLT53aGljaHB0cl0sCi0JCQkmbWFpbi0+cm93Z3JvdXBfY3RyLCBtYWluLT5yb3dncm91cHNfYXZhaWwsCi0JCQlvdXRwdXRfYnVmLCBvdXRfcm93X2N0ciwgb3V0X3Jvd3NfYXZhaWwpOwotICAgIGlmIChtYWluLT5yb3dncm91cF9jdHIgPCBtYWluLT5yb3dncm91cHNfYXZhaWwpCi0gICAgICByZXR1cm47CQkJLyogTmVlZCB0byBzdXNwZW5kICovCi0gICAgLyogQWZ0ZXIgdGhlIGZpcnN0IGlNQ1UsIGNoYW5nZSB3cmFwYXJvdW5kIHBvaW50ZXJzIHRvIG5vcm1hbCBzdGF0ZSAqLwotICAgIGlmIChtYWluLT5pTUNVX3Jvd19jdHIgPT0gMSkKLSAgICAgIHNldF93cmFwYXJvdW5kX3BvaW50ZXJzKGNpbmZvKTsKLSAgICAvKiBQcmVwYXJlIHRvIGxvYWQgbmV3IGlNQ1Ugcm93IHVzaW5nIG90aGVyIHhidWZmZXIgbGlzdCAqLwotICAgIG1haW4tPndoaWNocHRyIF49IDE7CS8qIDA9PjEgb3IgMT0+MCAqLwotICAgIG1haW4tPmJ1ZmZlcl9mdWxsID0gRkFMU0U7Ci0gICAgLyogU3RpbGwgbmVlZCB0byBwcm9jZXNzIGxhc3Qgcm93IGdyb3VwIG9mIHRoaXMgaU1DVSByb3csICovCi0gICAgLyogd2hpY2ggaXMgc2F2ZWQgYXQgaW5kZXggTSsxIG9mIHRoZSBvdGhlciB4YnVmZmVyICovCi0gICAgbWFpbi0+cm93Z3JvdXBfY3RyID0gKEpESU1FTlNJT04pIChjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSArIDEpOwotICAgIG1haW4tPnJvd2dyb3Vwc19hdmFpbCA9IChKRElNRU5TSU9OKSAoY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgKyAyKTsKLSAgICBtYWluLT5jb250ZXh0X3N0YXRlID0gQ1RYX1BPU1RQT05FRF9ST1c7Ci0gIH0KLX0KLQotCi0vKgotICogUHJvY2VzcyBzb21lIGRhdGEuCi0gKiBGaW5hbCBwYXNzIG9mIHR3by1wYXNzIHF1YW50aXphdGlvbjoganVzdCBjYWxsIHRoZSBwb3N0cHJvY2Vzc29yLgotICogU291cmNlIGRhdGEgd2lsbCBiZSB0aGUgcG9zdHByb2Nlc3NvciBjb250cm9sbGVyJ3MgaW50ZXJuYWwgYnVmZmVyLgotICovCi0KLSNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKLQotTUVUSE9EREVGKHZvaWQpCi1wcm9jZXNzX2RhdGFfY3JhbmtfcG9zdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCSBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAotCQkJIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCi17Ci0gICgqY2luZm8tPnBvc3QtPnBvc3RfcHJvY2Vzc19kYXRhKSAoY2luZm8sIChKU0FNUElNQUdFKSBOVUxMLAotCQkJCSAgICAgKEpESU1FTlNJT04gKikgTlVMTCwgKEpESU1FTlNJT04pIDAsCi0JCQkJICAgICBvdXRwdXRfYnVmLCBvdXRfcm93X2N0ciwgb3V0X3Jvd3NfYXZhaWwpOwotfQotCi0jZW5kaWYgLyogUVVBTlRfMlBBU1NfU1VQUE9SVEVEICovCi0KLQotLyoKLSAqIEluaXRpYWxpemUgbWFpbiBidWZmZXIgY29udHJvbGxlci4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2RfbWFpbl9jb250cm9sbGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpCi17Ci0gIG15X21haW5fcHRyIG1haW47Ci0gIGludCBjaSwgcmdyb3VwLCBuZ3JvdXBzOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotCi0gIG1haW4gPSAobXlfbWFpbl9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfbWFpbl9jb250cm9sbGVyKSk7Ci0gIGNpbmZvLT5tYWluID0gKHN0cnVjdCBqcGVnX2RfbWFpbl9jb250cm9sbGVyICopIG1haW47Ci0gIG1haW4tPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19tYWluOwotCi0gIGlmIChuZWVkX2Z1bGxfYnVmZmVyKQkJLyogc2hvdWxkbid0IGhhcHBlbiAqLwotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgd29ya3NwYWNlLgotICAgKiBuZ3JvdXBzIGlzIHRoZSBudW1iZXIgb2Ygcm93IGdyb3VwcyB3ZSBuZWVkLgotICAgKi8KLSAgaWYgKGNpbmZvLT51cHNhbXBsZS0+bmVlZF9jb250ZXh0X3Jvd3MpIHsKLSAgICBpZiAoY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgPCAyKSAvKiB1bnN1cHBvcnRlZCwgc2VlIGNvbW1lbnRzIGFib3ZlICovCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVElNUEwpOwotICAgIGFsbG9jX2Z1bm55X3BvaW50ZXJzKGNpbmZvKTsgLyogQWxsb2Mgc3BhY2UgZm9yIHhidWZmZXJbXSBsaXN0cyAqLwotICAgIG5ncm91cHMgPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSArIDI7Ci0gIH0gZWxzZSB7Ci0gICAgbmdyb3VwcyA9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOwotICB9Ci0KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICByZ3JvdXAgPSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSkgLwotICAgICAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7IC8qIGhlaWdodCBvZiBhIHJvdyBncm91cCBvZiBjb21wb25lbnQgKi8KLSAgICBtYWluLT5idWZmZXJbY2ldID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0JCQkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSwKLQkJCSAoSkRJTUVOU0lPTikgKHJncm91cCAqIG5ncm91cHMpKTsKLSAgfQotfQotCi0jZW5kaWYgLy9fRlhfSlBFR19UVVJCT18KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkbWFya2VyLmMgYi9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZG1hcmtlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2QwMTdmLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkbWFya2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzk2ICswLDAgQEAKLSNpZiAhZGVmaW5lZChfRlhfSlBFR19UVVJCT18pCi0vKgotICogamRtYXJrZXIuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIGRlY29kZSBKUEVHIGRhdGFzdHJlYW0gbWFya2Vycy4KLSAqIE1vc3Qgb2YgdGhlIGNvbXBsZXhpdHkgYXJpc2VzIGZyb20gb3VyIGRlc2lyZSB0byBzdXBwb3J0IGlucHV0Ci0gKiBzdXNwZW5zaW9uOiBpZiBub3QgYWxsIG9mIHRoZSBkYXRhIGZvciBhIG1hcmtlciBpcyBhdmFpbGFibGUsCi0gKiB3ZSBtdXN0IGV4aXQgYmFjayB0byB0aGUgYXBwbGljYXRpb24uICBPbiByZXN1bXB0aW9uLCB3ZSByZXByb2Nlc3MKLSAqIHRoZSBtYXJrZXIuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLXR5cGVkZWYgZW51bSB7CQkJLyogSlBFRyBtYXJrZXIgY29kZXMgKi8KLSAgTV9TT0YwICA9IDB4YzAsCi0gIE1fU09GMSAgPSAweGMxLAotICBNX1NPRjIgID0gMHhjMiwKLSAgTV9TT0YzICA9IDB4YzMsCi0gIAotICBNX1NPRjUgID0gMHhjNSwKLSAgTV9TT0Y2ICA9IDB4YzYsCi0gIE1fU09GNyAgPSAweGM3LAotICAKLSAgTV9KUEcgICA9IDB4YzgsCi0gIE1fU09GOSAgPSAweGM5LAotICBNX1NPRjEwID0gMHhjYSwKLSAgTV9TT0YxMSA9IDB4Y2IsCi0gIAotICBNX1NPRjEzID0gMHhjZCwKLSAgTV9TT0YxNCA9IDB4Y2UsCi0gIE1fU09GMTUgPSAweGNmLAotICAKLSAgTV9ESFQgICA9IDB4YzQsCi0gIAotICBNX0RBQyAgID0gMHhjYywKLSAgCi0gIE1fUlNUMCAgPSAweGQwLAotICBNX1JTVDEgID0gMHhkMSwKLSAgTV9SU1QyICA9IDB4ZDIsCi0gIE1fUlNUMyAgPSAweGQzLAotICBNX1JTVDQgID0gMHhkNCwKLSAgTV9SU1Q1ICA9IDB4ZDUsCi0gIE1fUlNUNiAgPSAweGQ2LAotICBNX1JTVDcgID0gMHhkNywKLSAgCi0gIE1fU09JICAgPSAweGQ4LAotICBNX0VPSSAgID0gMHhkOSwKLSAgTV9TT1MgICA9IDB4ZGEsCi0gIE1fRFFUICAgPSAweGRiLAotICBNX0ROTCAgID0gMHhkYywKLSAgTV9EUkkgICA9IDB4ZGQsCi0gIE1fREhQICAgPSAweGRlLAotICBNX0VYUCAgID0gMHhkZiwKLSAgCi0gIE1fQVBQMCAgPSAweGUwLAotICBNX0FQUDEgID0gMHhlMSwKLSAgTV9BUFAyICA9IDB4ZTIsCi0gIE1fQVBQMyAgPSAweGUzLAotICBNX0FQUDQgID0gMHhlNCwKLSAgTV9BUFA1ICA9IDB4ZTUsCi0gIE1fQVBQNiAgPSAweGU2LAotICBNX0FQUDcgID0gMHhlNywKLSAgTV9BUFA4ICA9IDB4ZTgsCi0gIE1fQVBQOSAgPSAweGU5LAotICBNX0FQUDEwID0gMHhlYSwKLSAgTV9BUFAxMSA9IDB4ZWIsCi0gIE1fQVBQMTIgPSAweGVjLAotICBNX0FQUDEzID0gMHhlZCwKLSAgTV9BUFAxNCA9IDB4ZWUsCi0gIE1fQVBQMTUgPSAweGVmLAotICAKLSAgTV9KUEcwICA9IDB4ZjAsCi0gIE1fSlBHMTMgPSAweGZkLAotICBNX0NPTSAgID0gMHhmZSwKLSAgCi0gIE1fVEVNICAgPSAweDAxLAotICAKLSAgTV9FUlJPUiA9IDB4MTAwCi19IEpQRUdfTUFSS0VSOwotCi0KLS8qIFByaXZhdGUgc3RhdGUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19tYXJrZXJfcmVhZGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIEFwcGxpY2F0aW9uLW92ZXJyaWRhYmxlIG1hcmtlciBwcm9jZXNzaW5nIG1ldGhvZHMgKi8KLSAganBlZ19tYXJrZXJfcGFyc2VyX21ldGhvZCBwcm9jZXNzX0NPTTsKLSAganBlZ19tYXJrZXJfcGFyc2VyX21ldGhvZCBwcm9jZXNzX0FQUG5bMTZdOwotCi0gIC8qIExpbWl0IG9uIG1hcmtlciBkYXRhIGxlbmd0aCB0byBzYXZlIGZvciBlYWNoIG1hcmtlciB0eXBlICovCi0gIHVuc2lnbmVkIGludCBsZW5ndGhfbGltaXRfQ09NOwotICB1bnNpZ25lZCBpbnQgbGVuZ3RoX2xpbWl0X0FQUG5bMTZdOwotCi0gIC8qIFN0YXR1cyBvZiBDT00vQVBQbiBtYXJrZXIgc2F2aW5nICovCi0gIGpwZWdfc2F2ZWRfbWFya2VyX3B0ciBjdXJfbWFya2VyOwkvKiBOVUxMIGlmIG5vdCBwcm9jZXNzaW5nIGEgbWFya2VyICovCi0gIHVuc2lnbmVkIGludCBieXRlc19yZWFkOwkJLyogZGF0YSBieXRlcyByZWFkIHNvIGZhciBpbiBtYXJrZXIgKi8KLSAgLyogTm90ZTogY3VyX21hcmtlciBpcyBub3QgbGlua2VkIGludG8gbWFya2VyX2xpc3QgdW50aWwgaXQncyBhbGwgcmVhZC4gKi8KLX0gbXlfbWFya2VyX3JlYWRlcjsKLQotdHlwZWRlZiBteV9tYXJrZXJfcmVhZGVyICogbXlfbWFya2VyX3B0cjsKLQotCi0vKgotICogTWFjcm9zIGZvciBmZXRjaGluZyBkYXRhIGZyb20gdGhlIGRhdGEgc291cmNlIG1vZHVsZS4KLSAqCi0gKiBBdCBhbGwgdGltZXMsIGNpbmZvLT5zcmMtPm5leHRfaW5wdXRfYnl0ZSBhbmQgLT5ieXRlc19pbl9idWZmZXIgcmVmbGVjdAotICogdGhlIGN1cnJlbnQgcmVzdGFydCBwb2ludDsgd2UgdXBkYXRlIHRoZW0gb25seSB3aGVuIHdlIGhhdmUgcmVhY2hlZCBhCi0gKiBzdWl0YWJsZSBwbGFjZSB0byByZXN0YXJ0IGlmIGEgc3VzcGVuc2lvbiBvY2N1cnMuCi0gKi8KLQotLyogRGVjbGFyZSBhbmQgaW5pdGlhbGl6ZSBsb2NhbCBjb3BpZXMgb2YgaW5wdXQgcG9pbnRlci9jb3VudCAqLwotI2RlZmluZSBJTlBVVF9WQVJTKGNpbmZvKSAgXAotCXN0cnVjdCBqcGVnX3NvdXJjZV9tZ3IgKiBkYXRhc3JjID0gKGNpbmZvKS0+c3JjOyAgXAotCWNvbnN0IEpPQ1RFVCAqIG5leHRfaW5wdXRfYnl0ZSA9IGRhdGFzcmMtPm5leHRfaW5wdXRfYnl0ZTsgIFwKLQlzaXplX3QgYnl0ZXNfaW5fYnVmZmVyID0gZGF0YXNyYy0+Ynl0ZXNfaW5fYnVmZmVyCi0KLS8qIFVubG9hZCB0aGUgbG9jYWwgY29waWVzIC0tLSBkbyB0aGlzIG9ubHkgYXQgYSByZXN0YXJ0IGJvdW5kYXJ5ICovCi0jZGVmaW5lIElOUFVUX1NZTkMoY2luZm8pICBcCi0JKCBkYXRhc3JjLT5uZXh0X2lucHV0X2J5dGUgPSBuZXh0X2lucHV0X2J5dGUsICBcCi0JICBkYXRhc3JjLT5ieXRlc19pbl9idWZmZXIgPSBieXRlc19pbl9idWZmZXIgKQotCi0vKiBSZWxvYWQgdGhlIGxvY2FsIGNvcGllcyAtLS0gdXNlZCBvbmx5IGluIE1BS0VfQllURV9BVkFJTCAqLwotI2RlZmluZSBJTlBVVF9SRUxPQUQoY2luZm8pICBcCi0JKCBuZXh0X2lucHV0X2J5dGUgPSBkYXRhc3JjLT5uZXh0X2lucHV0X2J5dGUsICBcCi0JICBieXRlc19pbl9idWZmZXIgPSBkYXRhc3JjLT5ieXRlc19pbl9idWZmZXIgKQotCi0vKiBJbnRlcm5hbCBtYWNybyBmb3IgSU5QVVRfQllURSBhbmQgSU5QVVRfMkJZVEVTOiBtYWtlIGEgYnl0ZSBhdmFpbGFibGUuCi0gKiBOb3RlIHdlIGRvICpub3QqIGRvIElOUFVUX1NZTkMgYmVmb3JlIGNhbGxpbmcgZmlsbF9pbnB1dF9idWZmZXIsCi0gKiBidXQgd2UgbXVzdCByZWxvYWQgdGhlIGxvY2FsIGNvcGllcyBhZnRlciBhIHN1Y2Nlc3NmdWwgZmlsbC4KLSAqLwotI2RlZmluZSBNQUtFX0JZVEVfQVZBSUwoY2luZm8sYWN0aW9uKSAgXAotCWlmIChieXRlc19pbl9idWZmZXIgPT0gMCkgeyAgXAotCSAgaWYgKCEgKCpkYXRhc3JjLT5maWxsX2lucHV0X2J1ZmZlcikgKGNpbmZvKSkgIFwKLQkgICAgeyBhY3Rpb247IH0gIFwKLQkgIElOUFVUX1JFTE9BRChjaW5mbyk7ICBcCi0JfQotCi0vKiBSZWFkIGEgYnl0ZSBpbnRvIHZhcmlhYmxlIFYuCi0gKiBJZiBtdXN0IHN1c3BlbmQsIHRha2UgdGhlIHNwZWNpZmllZCBhY3Rpb24gKHR5cGljYWxseSAicmV0dXJuIEZBTFNFIikuCi0gKi8KLSNkZWZpbmUgSU5QVVRfQllURShjaW5mbyxWLGFjdGlvbikgIFwKLQlNQUtFU1RNVCggTUFLRV9CWVRFX0FWQUlMKGNpbmZvLGFjdGlvbik7IFwKLQkJICBieXRlc19pbl9idWZmZXItLTsgXAotCQkgIFYgPSBHRVRKT0NURVQoKm5leHRfaW5wdXRfYnl0ZSsrKTsgKQotCi0vKiBBcyBhYm92ZSwgYnV0IHJlYWQgdHdvIGJ5dGVzIGludGVycHJldGVkIGFzIGFuIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyLgotICogViBzaG91bGQgYmUgZGVjbGFyZWQgdW5zaWduZWQgaW50IG9yIHBlcmhhcHMgSU5UMzIuCi0gKi8KLSNkZWZpbmUgSU5QVVRfMkJZVEVTKGNpbmZvLFYsYWN0aW9uKSAgXAotCU1BS0VTVE1UKCBNQUtFX0JZVEVfQVZBSUwoY2luZm8sYWN0aW9uKTsgXAotCQkgIGJ5dGVzX2luX2J1ZmZlci0tOyBcCi0JCSAgViA9ICgodW5zaWduZWQgaW50KSBHRVRKT0NURVQoKm5leHRfaW5wdXRfYnl0ZSsrKSkgPDwgODsgXAotCQkgIE1BS0VfQllURV9BVkFJTChjaW5mbyxhY3Rpb24pOyBcCi0JCSAgYnl0ZXNfaW5fYnVmZmVyLS07IFwKLQkJICBWICs9IEdFVEpPQ1RFVCgqbmV4dF9pbnB1dF9ieXRlKyspOyApCi0KLQotLyoKLSAqIFJvdXRpbmVzIHRvIHByb2Nlc3MgSlBFRyBtYXJrZXJzLgotICoKLSAqIEVudHJ5IGNvbmRpdGlvbjogSlBFRyBtYXJrZXIgaXRzZWxmIGhhcyBiZWVuIHJlYWQgYW5kIGl0cyBjb2RlIHNhdmVkCi0gKiAgIGluIGNpbmZvLT51bnJlYWRfbWFya2VyOyBpbnB1dCByZXN0YXJ0IHBvaW50IGlzIGp1c3QgYWZ0ZXIgdGhlIG1hcmtlci4KLSAqCi0gKiBFeGl0OiBpZiByZXR1cm4gVFJVRSwgaGF2ZSByZWFkIGFuZCBwcm9jZXNzZWQgYW55IHBhcmFtZXRlcnMsIGFuZCBoYXZlCi0gKiAgIHVwZGF0ZWQgdGhlIHJlc3RhcnQgcG9pbnQgdG8gcG9pbnQgYWZ0ZXIgdGhlIHBhcmFtZXRlcnMuCi0gKiAgIElmIHJldHVybiBGQUxTRSwgd2FzIGZvcmNlZCB0byBzdXNwZW5kIGJlZm9yZSByZWFjaGluZyBlbmQgb2YKLSAqICAgbWFya2VyIHBhcmFtZXRlcnM7IHJlc3RhcnQgcG9pbnQgaGFzIG5vdCBiZWVuIG1vdmVkLiAgU2FtZSByb3V0aW5lCi0gKiAgIHdpbGwgYmUgY2FsbGVkIGFnYWluIGFmdGVyIGFwcGxpY2F0aW9uIHN1cHBsaWVzIG1vcmUgaW5wdXQgZGF0YS4KLSAqCi0gKiBUaGlzIGFwcHJvYWNoIHRvIHN1c3BlbnNpb24gYXNzdW1lcyB0aGF0IGFsbCBvZiBhIG1hcmtlcidzIHBhcmFtZXRlcnMKLSAqIGNhbiBmaXQgaW50byBhIHNpbmdsZSBpbnB1dCBidWZmZXJsb2FkLiAgVGhpcyBzaG91bGQgaG9sZCBmb3IgIm5vcm1hbCIKLSAqIG1hcmtlcnMuICBTb21lIENPTS9BUFBuIG1hcmtlcnMgbWlnaHQgaGF2ZSBsYXJnZSBwYXJhbWV0ZXIgc2VnbWVudHMKLSAqIHRoYXQgbWlnaHQgbm90IGZpdC4gIElmIHdlIGFyZSBzaW1wbHkgZHJvcHBpbmcgc3VjaCBhIG1hcmtlciwgd2UgdXNlCi0gKiBza2lwX2lucHV0X2RhdGEgdG8gZ2V0IHBhc3QgaXQsIGFuZCB0aGVyZWJ5IHB1dCB0aGUgcHJvYmxlbSBvbiB0aGUKLSAqIHNvdXJjZSBtYW5hZ2VyJ3Mgc2hvdWxkZXJzLiAgSWYgd2UgYXJlIHNhdmluZyB0aGUgbWFya2VyJ3MgY29udGVudHMKLSAqIGludG8gbWVtb3J5LCB3ZSB1c2UgYSBzbGlnaHRseSBkaWZmZXJlbnQgY29udmVudGlvbjogd2hlbiBmb3JjZWQgdG8KLSAqIHN1c3BlbmQsIHRoZSBtYXJrZXIgcHJvY2Vzc29yIHVwZGF0ZXMgdGhlIHJlc3RhcnQgcG9pbnQgdG8gdGhlIGVuZCBvZgotICogd2hhdCBpdCdzIGNvbnN1bWVkIChpZSwgdGhlIGVuZCBvZiB0aGUgYnVmZmVyKSBiZWZvcmUgcmV0dXJuaW5nIEZBTFNFLgotICogT24gcmVzdW1wdGlvbiwgY2luZm8tPnVucmVhZF9tYXJrZXIgc3RpbGwgY29udGFpbnMgdGhlIG1hcmtlciBjb2RlLAotICogYnV0IHRoZSBkYXRhIHNvdXJjZSB3aWxsIHBvaW50IHRvIHRoZSBuZXh0IGNodW5rIG9mIG1hcmtlciBkYXRhLgotICogVGhlIG1hcmtlciBwcm9jZXNzb3IgbXVzdCByZXRhaW4gaW50ZXJuYWwgc3RhdGUgdG8gZGVhbCB3aXRoIHRoaXMuCi0gKgotICogTm90ZSB0aGF0IHdlIGRvbid0IGJvdGhlciB0byBhdm9pZCBkdXBsaWNhdGUgdHJhY2UgbWVzc2FnZXMgaWYgYQotICogc3VzcGVuc2lvbiBvY2N1cnMgd2l0aGluIG1hcmtlciBwYXJhbWV0ZXJzLiAgT3RoZXIgc2lkZSBlZmZlY3RzCi0gKiByZXF1aXJlIG1vcmUgY2FyZS4KLSAqLwotCi0KLUxPQ0FMKGJvb2xlYW4pCi1nZXRfc29pIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogUHJvY2VzcyBhbiBTT0kgbWFya2VyICovCi17Ci0gIGludCBpOwotICAKLSAgVFJBQ0VNUyhjaW5mbywgMSwgSlRSQ19TT0kpOwotCi0gIGlmIChjaW5mby0+bWFya2VyLT5zYXdfU09JKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfU09JX0RVUExJQ0FURSk7Ci0KLSAgLyogUmVzZXQgYWxsIHBhcmFtZXRlcnMgdGhhdCBhcmUgZGVmaW5lZCB0byBiZSByZXNldCBieSBTT0kgKi8KLQotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0FSSVRIX1RCTFM7IGkrKykgewotICAgIGNpbmZvLT5hcml0aF9kY19MW2ldID0gMDsKLSAgICBjaW5mby0+YXJpdGhfZGNfVVtpXSA9IDE7Ci0gICAgY2luZm8tPmFyaXRoX2FjX0tbaV0gPSA1OwotICB9Ci0gIGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsID0gMDsKLQotICAvKiBTZXQgaW5pdGlhbCBhc3N1bXB0aW9ucyBmb3IgY29sb3JzcGFjZSBldGMgKi8KLQotICBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19VTktOT1dOOwotICBjaW5mby0+Q0NJUjYwMV9zYW1wbGluZyA9IEZBTFNFOyAvKiBBc3N1bWUgbm9uLUNDSVIgc2FtcGxpbmc/Pz8gKi8KLQotICBjaW5mby0+c2F3X0pGSUZfbWFya2VyID0gRkFMU0U7Ci0gIGNpbmZvLT5KRklGX21ham9yX3ZlcnNpb24gPSAxOyAvKiBzZXQgZGVmYXVsdCBKRklGIEFQUDAgdmFsdWVzICovCi0gIGNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24gPSAxOwotICBjaW5mby0+ZGVuc2l0eV91bml0ID0gMDsKLSAgY2luZm8tPlhfZGVuc2l0eSA9IDE7Ci0gIGNpbmZvLT5ZX2RlbnNpdHkgPSAxOwotICBjaW5mby0+c2F3X0Fkb2JlX21hcmtlciA9IEZBTFNFOwotICBjaW5mby0+QWRvYmVfdHJhbnNmb3JtID0gMDsKLQotICBjaW5mby0+bWFya2VyLT5zYXdfU09JID0gVFJVRTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi1MT0NBTChib29sZWFuKQotZ2V0X3NvZiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBpc19wcm9nLCBib29sZWFuIGlzX2FyaXRoKQotLyogUHJvY2VzcyBhIFNPRm4gbWFya2VyICovCi17Ci0gIElOVDMyIGxlbmd0aDsKLSAgaW50IGMsIGNpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLSAgLyogTGl1U3VubGlhbmcgYWRkZWQgMjAxMTEyMDkgKi8KLSAgSkRJTUVOU0lPTiBpbWFnZV93aWR0aCwgaW1hZ2VfaGVpZ2h0OwotICBJTlBVVF9WQVJTKGNpbmZvKTsKLQotICBjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSA9IGlzX3Byb2c7Ci0gIGNpbmZvLT5hcml0aF9jb2RlID0gaXNfYXJpdGg7Ci0KLSAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7Ci0KLSAgSU5QVVRfQllURShjaW5mbywgY2luZm8tPmRhdGFfcHJlY2lzaW9uLCByZXR1cm4gRkFMU0UpOwotICBJTlBVVF8yQllURVMoY2luZm8sIGltYWdlX2hlaWdodCwgcmV0dXJuIEZBTFNFKTsKLSAgSU5QVVRfMkJZVEVTKGNpbmZvLCBpbWFnZV93aWR0aCwgcmV0dXJuIEZBTFNFKTsKLSAgSU5QVVRfQllURShjaW5mbywgY2luZm8tPm51bV9jb21wb25lbnRzLCByZXR1cm4gRkFMU0UpOwotCi0gIGlmIChpbWFnZV93aWR0aCA8PSBKUEVHX01BWF9ESU1FTlNJT04pCi0JICBjaW5mby0+aW1hZ2Vfd2lkdGggPSBpbWFnZV93aWR0aDsKLSAKLSAgaWYgKGltYWdlX2hlaWdodCA8PSBKUEVHX01BWF9ESU1FTlNJT04pCi0JICBjaW5mby0+aW1hZ2VfaGVpZ2h0ID0gaW1hZ2VfaGVpZ2h0OwotCi0gIGxlbmd0aCAtPSA4OwotCi0gIFRSQUNFTVM0KGNpbmZvLCAxLCBKVFJDX1NPRiwgY2luZm8tPnVucmVhZF9tYXJrZXIsCi0JICAgKGludCkgY2luZm8tPmltYWdlX3dpZHRoLCAoaW50KSBjaW5mby0+aW1hZ2VfaGVpZ2h0LAotCSAgIGNpbmZvLT5udW1fY29tcG9uZW50cyk7Ci0KLSAgaWYgKGNpbmZvLT5tYXJrZXItPnNhd19TT0YpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9TT0ZfRFVQTElDQVRFKTsKLQotICAvKiBXZSBkb24ndCBzdXBwb3J0IGZpbGVzIGluIHdoaWNoIHRoZSBpbWFnZSBoZWlnaHQgaXMgaW5pdGlhbGx5IHNwZWNpZmllZCAqLwotICAvKiBhcyAwIGFuZCBpcyBsYXRlciByZWRlZmluZWQgYnkgRE5MLiAgQXMgbG9uZyBhcyB3ZSBoYXZlIHRvIGNoZWNrIHRoYXQsICAqLwotICAvKiBtaWdodCBhcyB3ZWxsIGhhdmUgYSBnZW5lcmFsIHNhbml0eSBjaGVjay4gKi8KLSAgaWYgKGNpbmZvLT5pbWFnZV9oZWlnaHQgPD0gMCB8fCBjaW5mby0+aW1hZ2Vfd2lkdGggPD0gMAotICAgICAgfHwgY2luZm8tPm51bV9jb21wb25lbnRzIDw9IDApCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9FTVBUWV9JTUFHRSk7Ci0KLSAgaWYgKGxlbmd0aCAhPSAoY2luZm8tPm51bV9jb21wb25lbnRzICogMykpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfTEVOR1RIKTsKLQotICBpZiAoY2luZm8tPmNvbXBfaW5mbyA9PSBOVUxMKQkvKiBkbyBvbmx5IG9uY2UsIGV2ZW4gaWYgc3VzcGVuZCAqLwotICAgIGNpbmZvLT5jb21wX2luZm8gPSAoanBlZ19jb21wb25lbnRfaW5mbyAqKSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKQotCQkJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCSBjaW5mby0+bnVtX2NvbXBvbmVudHMgKiBTSVpFT0YoanBlZ19jb21wb25lbnRfaW5mbykpOwotICAKLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICBjb21wcHRyLT5jb21wb25lbnRfaW5kZXggPSBjaTsKLSAgICBJTlBVVF9CWVRFKGNpbmZvLCBjb21wcHRyLT5jb21wb25lbnRfaWQsIHJldHVybiBGQUxTRSk7Ci0JLyogWFlRIDIwMDgtMDMtMjU6IEFkb2JlIENNWUsgSlBFRyBoYXMgc2VyaW91cyBmbGF3OiB0aGUgSyBjaGFubmVsIGhhcyBzYW1lIGNvbXBvbmVudCBpZCBhcyBDIGNoYW5uZWwgKi8KLQl7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgY2k7IGkgKyspCi0JCQlpZiAoY29tcHB0ci0+Y29tcG9uZW50X2lkID09IGNpbmZvLT5jb21wX2luZm9baV0uY29tcG9uZW50X2lkKSBicmVhazsKLQkJaWYgKGkgPCBjaSkKLQkJCS8qIEZvdW5kIHRoZSBlcnJvciEgV2UgcmVwbGFjZSB0aGUgaWQgd2l0aCBzb21ldGhpbmcgdW5saWtlbHkgdXNlZCBlbHNld2hlcmUgKi8KLQkJCWNvbXBwdHItPmNvbXBvbmVudF9pZCArPSAweGYwOwotCX0KLQkvKiBlbmQgb2YgbW9kaWZpY2F0aW9uICovCi0gICAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKLSAgICBjb21wcHRyLT5oX3NhbXBfZmFjdG9yID0gKGMgPj4gNCkgJiAxNTsKLSAgICBjb21wcHRyLT52X3NhbXBfZmFjdG9yID0gKGMgICAgICkgJiAxNTsKLSAgICBJTlBVVF9CWVRFKGNpbmZvLCBjb21wcHRyLT5xdWFudF90Ymxfbm8sIHJldHVybiBGQUxTRSk7Ci0KLSAgICBUUkFDRU1TNChjaW5mbywgMSwgSlRSQ19TT0ZfQ09NUE9ORU5ULAotCSAgICAgY29tcHB0ci0+Y29tcG9uZW50X2lkLCBjb21wcHRyLT5oX3NhbXBfZmFjdG9yLAotCSAgICAgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgY29tcHB0ci0+cXVhbnRfdGJsX25vKTsKLSAgfQotCi0gIGNpbmZvLT5tYXJrZXItPnNhd19TT0YgPSBUUlVFOwotCi0gIElOUFVUX1NZTkMoY2luZm8pOwotICByZXR1cm4gVFJVRTsKLX0KLQotCi1MT0NBTChib29sZWFuKQotZ2V0X3NvcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIFByb2Nlc3MgYSBTT1MgbWFya2VyICovCi17Ci0gIElOVDMyIGxlbmd0aDsKLSAgaW50IGksIGNpLCBuLCBjLCBjYzsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7Ci0gIElOUFVUX1ZBUlMoY2luZm8pOwotCi0gIGlmICghIGNpbmZvLT5tYXJrZXItPnNhd19TT0YpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9TT1NfTk9fU09GKTsKLQotICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKLQotICBJTlBVVF9CWVRFKGNpbmZvLCBuLCByZXR1cm4gRkFMU0UpOyAvKiBOdW1iZXIgb2YgY29tcG9uZW50cyAqLwotCi0gIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1NPUywgbik7Ci0KLSAgaWYgKGxlbmd0aCAhPSAobiAqIDIgKyA2KSB8fCBuIDwgMSB8fCBuID4gTUFYX0NPTVBTX0lOX1NDQU4pCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfTEVOR1RIKTsKLQotICBjaW5mby0+Y29tcHNfaW5fc2NhbiA9IG47Ci0KLSAgLyogQ29sbGVjdCB0aGUgY29tcG9uZW50LXNwZWMgcGFyYW1ldGVycyAqLwotCi0gIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICBJTlBVVF9CWVRFKGNpbmZvLCBjYywgcmV0dXJuIEZBTFNFKTsKLSAgICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOwotICAgIAotCS8qIFhZUSAyMDA4LTAzLTI1OiBBZG9iZSBDTVlLIEpQRUcgaGFzIHNlcmlvdXMgZmxhdzogdGhlIEsgY2hhbm5lbCBoYXMgc2FtZSBjb21wb25lbnQgaWQgYXMgQyBjaGFubmVsICovCi0JewotCQlpbnQgajsKLQkJZm9yIChqID0gMDsgaiA8IGk7IGogKyspCi0JCQlpZiAoY2MgPT0gY2luZm8tPmN1cl9jb21wX2luZm9bal0tPmNvbXBvbmVudF9pZCkgYnJlYWs7Ci0JCWlmIChqIDwgaSkKLQkJCS8qIGZvdW5kIHRoZSBlcnJvciEgKi8KLQkJCWNjICs9IDB4ZjA7Ci0JfQotCS8qIGVuZCBvZiBtb2RpZmljYXRpb24gKi8KLSAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotCSBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAgIGlmIChjYyA9PSBjb21wcHRyLT5jb21wb25lbnRfaWQpCi0JZ290byBpZF9mb3VuZDsKLSAgICB9Ci0KLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfQ09NUE9ORU5UX0lELCBjYyk7Ci0KLSAgaWRfZm91bmQ6Ci0KLSAgICBjaW5mby0+Y3VyX2NvbXBfaW5mb1tpXSA9IGNvbXBwdHI7Ci0gICAgY29tcHB0ci0+ZGNfdGJsX25vID0gKGMgPj4gNCkgJiAxNTsKLSAgICBjb21wcHRyLT5hY190Ymxfbm8gPSAoYyAgICAgKSAmIDE1OwotICAgIAotICAgIFRSQUNFTVMzKGNpbmZvLCAxLCBKVFJDX1NPU19DT01QT05FTlQsIGNjLAotCSAgICAgY29tcHB0ci0+ZGNfdGJsX25vLCBjb21wcHRyLT5hY190Ymxfbm8pOwotCS8qIFRoaXMgQ1NpIChjYykgc2hvdWxkIGRpZmZlciBmcm9tIHRoZSBwcmV2aW91cyBDU2kgKi8KLSAgICBmb3IgKGNpID0gMDsgY2kgPCBpOyBjaSsrKSB7Ci0gICAgICBpZiAoY2luZm8tPmN1cl9jb21wX2luZm9bY2ldID09IGNvbXBwdHIpCi0gICAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9DT01QT05FTlRfSUQsIGNjKTsKLSAgICB9Ci0gIH0KLQotICAvKiBDb2xsZWN0IHRoZSBhZGRpdGlvbmFsIHNjYW4gcGFyYW1ldGVycyBTcywgU2UsIEFoL0FsLiAqLwotICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOwotICBjaW5mby0+U3MgPSBjOwotICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOwotICBjaW5mby0+U2UgPSBjOwotICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOwotICBjaW5mby0+QWggPSAoYyA+PiA0KSAmIDE1OwotICBjaW5mby0+QWwgPSAoYyAgICAgKSAmIDE1OwotCi0gIFRSQUNFTVM0KGNpbmZvLCAxLCBKVFJDX1NPU19QQVJBTVMsIGNpbmZvLT5TcywgY2luZm8tPlNlLAotCSAgIGNpbmZvLT5BaCwgY2luZm8tPkFsKTsKLQotICAvKiBQcmVwYXJlIHRvIHNjYW4gZGF0YSAmIHJlc3RhcnQgbWFya2VycyAqLwotICBjaW5mby0+bWFya2VyLT5uZXh0X3Jlc3RhcnRfbnVtID0gMDsKLQotICAvKiBDb3VudCBhbm90aGVyIFNPUyBtYXJrZXIgKi8KLSAgY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyKys7Ci0KLSAgSU5QVVRfU1lOQyhjaW5mbyk7Ci0gIHJldHVybiBUUlVFOwotfQotCi0KLSNpZmRlZiBEX0FSSVRIX0NPRElOR19TVVBQT1JURUQKLQotTE9DQUwoYm9vbGVhbikKLWdldF9kYWMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBQcm9jZXNzIGEgREFDIG1hcmtlciAqLwotewotICBJTlQzMiBsZW5ndGg7Ci0gIGludCBpbmRleCwgdmFsOwotICBJTlBVVF9WQVJTKGNpbmZvKTsKLQotICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKLSAgbGVuZ3RoIC09IDI7Ci0gIAotICB3aGlsZSAobGVuZ3RoID4gMCkgewotICAgIElOUFVUX0JZVEUoY2luZm8sIGluZGV4LCByZXR1cm4gRkFMU0UpOwotICAgIElOUFVUX0JZVEUoY2luZm8sIHZhbCwgcmV0dXJuIEZBTFNFKTsKLQotICAgIGxlbmd0aCAtPSAyOwotCi0gICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfREFDLCBpbmRleCwgdmFsKTsKLQotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gKDIqTlVNX0FSSVRIX1RCTFMpKQotICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfREFDX0lOREVYLCBpbmRleCk7Ci0KLSAgICBpZiAoaW5kZXggPj0gTlVNX0FSSVRIX1RCTFMpIHsgLyogZGVmaW5lIEFDIHRhYmxlICovCi0gICAgICBjaW5mby0+YXJpdGhfYWNfS1tpbmRleC1OVU1fQVJJVEhfVEJMU10gPSAoVUlOVDgpIHZhbDsKLSAgICB9IGVsc2UgewkJCS8qIGRlZmluZSBEQyB0YWJsZSAqLwotICAgICAgY2luZm8tPmFyaXRoX2RjX0xbaW5kZXhdID0gKFVJTlQ4KSAodmFsICYgMHgwRik7Ci0gICAgICBjaW5mby0+YXJpdGhfZGNfVVtpbmRleF0gPSAoVUlOVDgpICh2YWwgPj4gNCk7Ci0gICAgICBpZiAoY2luZm8tPmFyaXRoX2RjX0xbaW5kZXhdID4gY2luZm8tPmFyaXRoX2RjX1VbaW5kZXhdKQotCUVSUkVYSVQxKGNpbmZvLCBKRVJSX0RBQ19WQUxVRSwgdmFsKTsKLSAgICB9Ci0gIH0KLQotICBpZiAobGVuZ3RoICE9IDApCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfTEVOR1RIKTsKLQotICBJTlBVVF9TWU5DKGNpbmZvKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLSNlbHNlIC8qICEgRF9BUklUSF9DT0RJTkdfU1VQUE9SVEVEICovCi0KLSNkZWZpbmUgZ2V0X2RhYyhjaW5mbykgIHNraXBfdmFyaWFibGUoY2luZm8pCi0KLSNlbmRpZiAvKiBEX0FSSVRIX0NPRElOR19TVVBQT1JURUQgKi8KLQotCi1MT0NBTChib29sZWFuKQotZ2V0X2RodCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIFByb2Nlc3MgYSBESFQgbWFya2VyICovCi17Ci0gIElOVDMyIGxlbmd0aDsKLSAgVUlOVDggYml0c1sxN107Ci0gIFVJTlQ4IGh1ZmZ2YWxbMjU2XTsKLSAgaW50IGksIGluZGV4LCBjb3VudDsKLSAgSkhVRkZfVEJMICoqaHRibHB0cjsKLSAgSU5QVVRfVkFSUyhjaW5mbyk7Ci0KLSAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7Ci0gIGxlbmd0aCAtPSAyOwotICAKLSAgd2hpbGUgKGxlbmd0aCA+IDE2KSB7Ci0gICAgSU5QVVRfQllURShjaW5mbywgaW5kZXgsIHJldHVybiBGQUxTRSk7Ci0KLSAgICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19ESFQsIGluZGV4KTsKLSAgICAgIAotICAgIGJpdHNbMF0gPSAwOwotICAgIGNvdW50ID0gMDsKLSAgICBmb3IgKGkgPSAxOyBpIDw9IDE2OyBpKyspIHsKLSAgICAgIElOUFVUX0JZVEUoY2luZm8sIGJpdHNbaV0sIHJldHVybiBGQUxTRSk7Ci0gICAgICBjb3VudCArPSBiaXRzW2ldOwotICAgIH0KLQotICAgIGxlbmd0aCAtPSAxICsgMTY7Ci0KLSAgICBUUkFDRU1TOChjaW5mbywgMiwgSlRSQ19IVUZGQklUUywKLQkgICAgIGJpdHNbMV0sIGJpdHNbMl0sIGJpdHNbM10sIGJpdHNbNF0sCi0JICAgICBiaXRzWzVdLCBiaXRzWzZdLCBiaXRzWzddLCBiaXRzWzhdKTsKLSAgICBUUkFDRU1TOChjaW5mbywgMiwgSlRSQ19IVUZGQklUUywKLQkgICAgIGJpdHNbOV0sIGJpdHNbMTBdLCBiaXRzWzExXSwgYml0c1sxMl0sCi0JICAgICBiaXRzWzEzXSwgYml0c1sxNF0sIGJpdHNbMTVdLCBiaXRzWzE2XSk7Ci0KLSAgICAvKiBIZXJlIHdlIGp1c3QgZG8gbWluaW1hbCB2YWxpZGF0aW9uIG9mIHRoZSBjb3VudHMgdG8gYXZvaWQgd2Fsa2luZwotICAgICAqIG9mZiB0aGUgZW5kIG9mIG91ciB0YWJsZSBzcGFjZS4gIGpkaHVmZi5jIHdpbGwgY2hlY2sgbW9yZSBjYXJlZnVsbHkuCi0gICAgICovCi0gICAgaWYgKGNvdW50ID4gMjU2IHx8ICgoSU5UMzIpIGNvdW50KSA+IGxlbmd0aCkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0hVRkZfVEFCTEUpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICBJTlBVVF9CWVRFKGNpbmZvLCBodWZmdmFsW2ldLCByZXR1cm4gRkFMU0UpOwotCi0gICAgbGVuZ3RoIC09IGNvdW50OwotCi0gICAgaWYgKGluZGV4ICYgMHgxMCkgewkJLyogQUMgdGFibGUgZGVmaW5pdGlvbiAqLwotICAgICAgaW5kZXggLT0gMHgxMDsKLSAgICAgIGh0YmxwdHIgPSAmY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbaW5kZXhdOwotICAgIH0gZWxzZSB7CQkJLyogREMgdGFibGUgZGVmaW5pdGlvbiAqLwotICAgICAgaHRibHB0ciA9ICZjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1tpbmRleF07Ci0gICAgfQotCi0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBOVU1fSFVGRl9UQkxTKQotICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfREhUX0lOREVYLCBpbmRleCk7Ci0KLSAgICBpZiAoKmh0YmxwdHIgPT0gTlVMTCkKLSAgICAgICpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgCi0gICAgTUVNQ09QWSgoKmh0YmxwdHIpLT5iaXRzLCBiaXRzLCBTSVpFT0YoKCpodGJscHRyKS0+Yml0cykpOwotICAgIE1FTUNPUFkoKCpodGJscHRyKS0+aHVmZnZhbCwgaHVmZnZhbCwgU0laRU9GKCgqaHRibHB0ciktPmh1ZmZ2YWwpKTsKLSAgfQotCi0gIGlmIChsZW5ndGggIT0gMCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9MRU5HVEgpOwotCi0gIElOUFVUX1NZTkMoY2luZm8pOwotICByZXR1cm4gVFJVRTsKLX0KLQotCi1MT0NBTChib29sZWFuKQotZ2V0X2RxdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIFByb2Nlc3MgYSBEUVQgbWFya2VyICovCi17Ci0gIElOVDMyIGxlbmd0aDsKLSAgaW50IG4sIGksIHByZWM7Ci0gIHVuc2lnbmVkIGludCB0bXA7Ci0gIEpRVUFOVF9UQkwgKnF1YW50X3B0cjsKLSAgSU5QVVRfVkFSUyhjaW5mbyk7Ci0KLSAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7Ci0gIGxlbmd0aCAtPSAyOwotCi0gIHdoaWxlIChsZW5ndGggPiAwKSB7Ci0gICAgSU5QVVRfQllURShjaW5mbywgbiwgcmV0dXJuIEZBTFNFKTsKLSAgICBwcmVjID0gbiA+PiA0OwotICAgIG4gJj0gMHgwRjsKLQotICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX0RRVCwgbiwgcHJlYyk7Ci0KLSAgICBpZiAobiA+PSBOVU1fUVVBTlRfVEJMUykKLSAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0RRVF9JTkRFWCwgbik7Ci0gICAgICAKLSAgICBpZiAoY2luZm8tPnF1YW50X3RibF9wdHJzW25dID09IE5VTEwpCi0gICAgICBjaW5mby0+cXVhbnRfdGJsX3B0cnNbbl0gPSBqcGVnX2FsbG9jX3F1YW50X3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgICBxdWFudF9wdHIgPSBjaW5mby0+cXVhbnRfdGJsX3B0cnNbbl07Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgewotICAgICAgaWYgKHByZWMpCi0JSU5QVVRfMkJZVEVTKGNpbmZvLCB0bXAsIHJldHVybiBGQUxTRSk7Ci0gICAgICBlbHNlCi0JSU5QVVRfQllURShjaW5mbywgdG1wLCByZXR1cm4gRkFMU0UpOwotICAgICAgLyogV2UgY29udmVydCB0aGUgemlnemFnLW9yZGVyIHRhYmxlIHRvIG5hdHVyYWwgYXJyYXkgb3JkZXIuICovCi0gICAgICBxdWFudF9wdHItPnF1YW50dmFsW2pwZWdfbmF0dXJhbF9vcmRlcltpXV0gPSAoVUlOVDE2KSB0bXA7Ci0gICAgfQotCi0gICAgaWYgKGNpbmZvLT5lcnItPnRyYWNlX2xldmVsID49IDIpIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSArPSA4KSB7Ci0JVFJBQ0VNUzgoY2luZm8sIDIsIEpUUkNfUVVBTlRWQUxTLAotCQkgcXVhbnRfcHRyLT5xdWFudHZhbFtpXSwgICBxdWFudF9wdHItPnF1YW50dmFsW2krMV0sCi0JCSBxdWFudF9wdHItPnF1YW50dmFsW2krMl0sIHF1YW50X3B0ci0+cXVhbnR2YWxbaSszXSwKLQkJIHF1YW50X3B0ci0+cXVhbnR2YWxbaSs0XSwgcXVhbnRfcHRyLT5xdWFudHZhbFtpKzVdLAotCQkgcXVhbnRfcHRyLT5xdWFudHZhbFtpKzZdLCBxdWFudF9wdHItPnF1YW50dmFsW2krN10pOwotICAgICAgfQotICAgIH0KLQotICAgIGxlbmd0aCAtPSBEQ1RTSVpFMisxOwotICAgIGlmIChwcmVjKSBsZW5ndGggLT0gRENUU0laRTI7Ci0gIH0KLQotICBpZiAobGVuZ3RoICE9IDApCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfTEVOR1RIKTsKLQotICBJTlBVVF9TWU5DKGNpbmZvKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotTE9DQUwoYm9vbGVhbikKLWdldF9kcmkgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBQcm9jZXNzIGEgRFJJIG1hcmtlciAqLwotewotICBJTlQzMiBsZW5ndGg7Ci0gIHVuc2lnbmVkIGludCB0bXA7Ci0gIElOUFVUX1ZBUlMoY2luZm8pOwotCi0gIElOUFVUXzJCWVRFUyhjaW5mbywgbGVuZ3RoLCByZXR1cm4gRkFMU0UpOwotICAKLSAgaWYgKGxlbmd0aCAhPSA0KQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0xFTkdUSCk7Ci0KLSAgSU5QVVRfMkJZVEVTKGNpbmZvLCB0bXAsIHJldHVybiBGQUxTRSk7Ci0KLSAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfRFJJLCB0bXApOwotCi0gIGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsID0gdG1wOwotCi0gIElOUFVUX1NZTkMoY2luZm8pOwotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogUm91dGluZXMgZm9yIHByb2Nlc3NpbmcgQVBQbiBhbmQgQ09NIG1hcmtlcnMuCi0gKiBUaGVzZSBhcmUgZWl0aGVyIHNhdmVkIGluIG1lbW9yeSBvciBkaXNjYXJkZWQsIHBlciBhcHBsaWNhdGlvbiByZXF1ZXN0LgotICogQVBQMCBhbmQgQVBQMTQgYXJlIHNwZWNpYWxseSBjaGVja2VkIHRvIHNlZSBpZiB0aGV5IGFyZQotICogSkZJRiBhbmQgQWRvYmUgbWFya2VycywgcmVzcGVjdGl2ZWx5LgotICovCi0KLSNkZWZpbmUgQVBQMF9EQVRBX0xFTgkxNAkvKiBMZW5ndGggb2YgaW50ZXJlc3RpbmcgZGF0YSBpbiBBUFAwICovCi0jZGVmaW5lIEFQUDE0X0RBVEFfTEVOCTEyCS8qIExlbmd0aCBvZiBpbnRlcmVzdGluZyBkYXRhIGluIEFQUDE0ICovCi0jZGVmaW5lIEFQUE5fREFUQV9MRU4JMTQJLyogTXVzdCBiZSB0aGUgbGFyZ2VzdCBvZiB0aGUgYWJvdmUhISAqLwotCi0KLUxPQ0FMKHZvaWQpCi1leGFtaW5lX2FwcDAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpPQ1RFVCBGQVIgKiBkYXRhLAotCSAgICAgIHVuc2lnbmVkIGludCBkYXRhbGVuLCBJTlQzMiByZW1haW5pbmcpCi0vKiBFeGFtaW5lIGZpcnN0IGZldyBieXRlcyBmcm9tIGFuIEFQUDAuCi0gKiBUYWtlIGFwcHJvcHJpYXRlIGFjdGlvbiBpZiBpdCBpcyBhIEpGSUYgbWFya2VyLgotICogZGF0YWxlbiBpcyAjIG9mIGJ5dGVzIGF0IGRhdGFbXSwgcmVtYWluaW5nIGlzIGxlbmd0aCBvZiByZXN0IG9mIG1hcmtlciBkYXRhLgotICovCi17Ci0gIElOVDMyIHRvdGFsbGVuID0gKElOVDMyKSBkYXRhbGVuICsgcmVtYWluaW5nOwotCi0gIGlmIChkYXRhbGVuID49IEFQUDBfREFUQV9MRU4gJiYKLSAgICAgIEdFVEpPQ1RFVChkYXRhWzBdKSA9PSAweDRBICYmCi0gICAgICBHRVRKT0NURVQoZGF0YVsxXSkgPT0gMHg0NiAmJgotICAgICAgR0VUSk9DVEVUKGRhdGFbMl0pID09IDB4NDkgJiYKLSAgICAgIEdFVEpPQ1RFVChkYXRhWzNdKSA9PSAweDQ2ICYmCi0gICAgICBHRVRKT0NURVQoZGF0YVs0XSkgPT0gMCkgewotICAgIC8qIEZvdW5kIEpGSUYgQVBQMCBtYXJrZXI6IHNhdmUgaW5mbyAqLwotICAgIGNpbmZvLT5zYXdfSkZJRl9tYXJrZXIgPSBUUlVFOwotICAgIGNpbmZvLT5KRklGX21ham9yX3ZlcnNpb24gPSBHRVRKT0NURVQoZGF0YVs1XSk7Ci0gICAgY2luZm8tPkpGSUZfbWlub3JfdmVyc2lvbiA9IEdFVEpPQ1RFVChkYXRhWzZdKTsKLSAgICBjaW5mby0+ZGVuc2l0eV91bml0ID0gR0VUSk9DVEVUKGRhdGFbN10pOwotICAgIGNpbmZvLT5YX2RlbnNpdHkgPSAoR0VUSk9DVEVUKGRhdGFbOF0pIDw8IDgpICsgR0VUSk9DVEVUKGRhdGFbOV0pOwotICAgIGNpbmZvLT5ZX2RlbnNpdHkgPSAoR0VUSk9DVEVUKGRhdGFbMTBdKSA8PCA4KSArIEdFVEpPQ1RFVChkYXRhWzExXSk7Ci0gICAgLyogQ2hlY2sgdmVyc2lvbi4KLSAgICAgKiBNYWpvciB2ZXJzaW9uIG11c3QgYmUgMSwgYW55dGhpbmcgZWxzZSBzaWduYWxzIGFuIGluY29tcGF0aWJsZSBjaGFuZ2UuCi0gICAgICogKFdlIHVzZWQgdG8gdHJlYXQgdGhpcyBhcyBhbiBlcnJvciwgYnV0IG5vdyBpdCdzIGEgbm9uZmF0YWwgd2FybmluZywKLSAgICAgKiBiZWNhdXNlIHNvbWUgYm96byBhdCBIaWphYWsgY291bGRuJ3QgcmVhZCB0aGUgc3BlYy4pCi0gICAgICogTWlub3IgdmVyc2lvbiBzaG91bGQgYmUgMC4uMiwgYnV0IHByb2Nlc3MgYW55d2F5IGlmIG5ld2VyLgotICAgICAqLwotICAgIGlmIChjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uICE9IDEpCi0gICAgICBXQVJOTVMyKGNpbmZvLCBKV1JOX0pGSUZfTUFKT1IsCi0JICAgICAgY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbiwgY2luZm8tPkpGSUZfbWlub3JfdmVyc2lvbik7Ci0gICAgLyogR2VuZXJhdGUgdHJhY2UgbWVzc2FnZXMgKi8KLSAgICBUUkFDRU1TNShjaW5mbywgMSwgSlRSQ19KRklGLAotCSAgICAgY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbiwgY2luZm8tPkpGSUZfbWlub3JfdmVyc2lvbiwKLQkgICAgIGNpbmZvLT5YX2RlbnNpdHksIGNpbmZvLT5ZX2RlbnNpdHksIGNpbmZvLT5kZW5zaXR5X3VuaXQpOwotICAgIC8qIFZhbGlkYXRlIHRodW1ibmFpbCBkaW1lbnNpb25zIGFuZCBpc3N1ZSBhcHByb3ByaWF0ZSBtZXNzYWdlcyAqLwotICAgIGlmIChHRVRKT0NURVQoZGF0YVsxMl0pIHwgR0VUSk9DVEVUKGRhdGFbMTNdKSkKLSAgICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX0pGSUZfVEhVTUJOQUlMLAotCSAgICAgICBHRVRKT0NURVQoZGF0YVsxMl0pLCBHRVRKT0NURVQoZGF0YVsxM10pKTsKLSAgICB0b3RhbGxlbiAtPSBBUFAwX0RBVEFfTEVOOwotICAgIGlmICh0b3RhbGxlbiAhPQotCSgoSU5UMzIpR0VUSk9DVEVUKGRhdGFbMTJdKSAqIChJTlQzMilHRVRKT0NURVQoZGF0YVsxM10pICogKElOVDMyKSAzKSkKLSAgICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX0pGSUZfQkFEVEhVTUJOQUlMU0laRSwgKGludCkgdG90YWxsZW4pOwotICB9IGVsc2UgaWYgKGRhdGFsZW4gPj0gNiAmJgotICAgICAgR0VUSk9DVEVUKGRhdGFbMF0pID09IDB4NEEgJiYKLSAgICAgIEdFVEpPQ1RFVChkYXRhWzFdKSA9PSAweDQ2ICYmCi0gICAgICBHRVRKT0NURVQoZGF0YVsyXSkgPT0gMHg1OCAmJgotICAgICAgR0VUSk9DVEVUKGRhdGFbM10pID09IDB4NTggJiYKLSAgICAgIEdFVEpPQ1RFVChkYXRhWzRdKSA9PSAwKSB7Ci0gICAgLyogRm91bmQgSkZJRiAiSkZYWCIgZXh0ZW5zaW9uIEFQUDAgbWFya2VyICovCi0gICAgLyogVGhlIGxpYnJhcnkgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyB3aXRoIHRoZXNlLAotICAgICAqIGJ1dCB3ZSB0cnkgdG8gcHJvZHVjZSBhIGhlbHBmdWwgdHJhY2UgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBzd2l0Y2ggKEdFVEpPQ1RFVChkYXRhWzVdKSkgewotICAgIGNhc2UgMHgxMDoKLSAgICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1RIVU1CX0pQRUcsIChpbnQpIHRvdGFsbGVuKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgxMToKLSAgICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1RIVU1CX1BBTEVUVEUsIChpbnQpIHRvdGFsbGVuKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgxMzoKLSAgICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1RIVU1CX1JHQiwgKGludCkgdG90YWxsZW4pOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX0pGSUZfRVhURU5TSU9OLAotCSAgICAgICBHRVRKT0NURVQoZGF0YVs1XSksIChpbnQpIHRvdGFsbGVuKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBTdGFydCBvZiBBUFAwIGRvZXMgbm90IG1hdGNoICJKRklGIiBvciAiSkZYWCIsIG9yIHRvbyBzaG9ydCAqLwotICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX0FQUDAsIChpbnQpIHRvdGFsbGVuKTsKLSAgfQotfQotCi0KLUxPQ0FMKHZvaWQpCi1leGFtaW5lX2FwcDE0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKT0NURVQgRkFSICogZGF0YSwKLQkgICAgICAgdW5zaWduZWQgaW50IGRhdGFsZW4sIElOVDMyIHJlbWFpbmluZykKLS8qIEV4YW1pbmUgZmlyc3QgZmV3IGJ5dGVzIGZyb20gYW4gQVBQMTQuCi0gKiBUYWtlIGFwcHJvcHJpYXRlIGFjdGlvbiBpZiBpdCBpcyBhbiBBZG9iZSBtYXJrZXIuCi0gKiBkYXRhbGVuIGlzICMgb2YgYnl0ZXMgYXQgZGF0YVtdLCByZW1haW5pbmcgaXMgbGVuZ3RoIG9mIHJlc3Qgb2YgbWFya2VyIGRhdGEuCi0gKi8KLXsKLSAgdW5zaWduZWQgaW50IHZlcnNpb24sIGZsYWdzMCwgZmxhZ3MxLCB0cmFuc2Zvcm07Ci0KLSAgaWYgKGRhdGFsZW4gPj0gQVBQMTRfREFUQV9MRU4gJiYKLSAgICAgIEdFVEpPQ1RFVChkYXRhWzBdKSA9PSAweDQxICYmCi0gICAgICBHRVRKT0NURVQoZGF0YVsxXSkgPT0gMHg2NCAmJgotICAgICAgR0VUSk9DVEVUKGRhdGFbMl0pID09IDB4NkYgJiYKLSAgICAgIEdFVEpPQ1RFVChkYXRhWzNdKSA9PSAweDYyICYmCi0gICAgICBHRVRKT0NURVQoZGF0YVs0XSkgPT0gMHg2NSkgewotICAgIC8qIEZvdW5kIEFkb2JlIEFQUDE0IG1hcmtlciAqLwotICAgIHZlcnNpb24gPSAoR0VUSk9DVEVUKGRhdGFbNV0pIDw8IDgpICsgR0VUSk9DVEVUKGRhdGFbNl0pOwotICAgIGZsYWdzMCA9IChHRVRKT0NURVQoZGF0YVs3XSkgPDwgOCkgKyBHRVRKT0NURVQoZGF0YVs4XSk7Ci0gICAgZmxhZ3MxID0gKEdFVEpPQ1RFVChkYXRhWzldKSA8PCA4KSArIEdFVEpPQ1RFVChkYXRhWzEwXSk7Ci0gICAgdHJhbnNmb3JtID0gR0VUSk9DVEVUKGRhdGFbMTFdKTsKLSAgICBUUkFDRU1TNChjaW5mbywgMSwgSlRSQ19BRE9CRSwgdmVyc2lvbiwgZmxhZ3MwLCBmbGFnczEsIHRyYW5zZm9ybSk7Ci0gICAgY2luZm8tPnNhd19BZG9iZV9tYXJrZXIgPSBUUlVFOwotICAgIGNpbmZvLT5BZG9iZV90cmFuc2Zvcm0gPSAoVUlOVDgpIHRyYW5zZm9ybTsKLSAgfSBlbHNlIHsKLSAgICAvKiBTdGFydCBvZiBBUFAxNCBkb2VzIG5vdCBtYXRjaCAiQWRvYmUiLCBvciB0b28gc2hvcnQgKi8KLSAgICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19BUFAxNCwgKGludCkgKGRhdGFsZW4gKyByZW1haW5pbmcpKTsKLSAgfQotfQotCi0KLU1FVEhPRERFRihib29sZWFuKQotZ2V0X2ludGVyZXN0aW5nX2FwcG4gKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBQcm9jZXNzIGFuIEFQUDAgb3IgQVBQMTQgbWFya2VyIHdpdGhvdXQgc2F2aW5nIGl0ICovCi17Ci0gIElOVDMyIGxlbmd0aDsKLSAgSk9DVEVUIGJbQVBQTl9EQVRBX0xFTl07Ci0gIHVuc2lnbmVkIGludCBpLCBudW10b3JlYWQ7Ci0gIElOUFVUX1ZBUlMoY2luZm8pOwotCi0gIElOUFVUXzJCWVRFUyhjaW5mbywgbGVuZ3RoLCByZXR1cm4gRkFMU0UpOwotICBsZW5ndGggLT0gMjsKLQotICAvKiBnZXQgdGhlIGludGVyZXN0aW5nIHBhcnQgb2YgdGhlIG1hcmtlciBkYXRhICovCi0gIGlmIChsZW5ndGggPj0gQVBQTl9EQVRBX0xFTikKLSAgICBudW10b3JlYWQgPSBBUFBOX0RBVEFfTEVOOwotICBlbHNlIGlmIChsZW5ndGggPiAwKQotICAgIG51bXRvcmVhZCA9ICh1bnNpZ25lZCBpbnQpIGxlbmd0aDsKLSAgZWxzZQotICAgIG51bXRvcmVhZCA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBudW10b3JlYWQ7IGkrKykKLSAgICBJTlBVVF9CWVRFKGNpbmZvLCBiW2ldLCByZXR1cm4gRkFMU0UpOwotICBsZW5ndGggLT0gbnVtdG9yZWFkOwotCi0gIC8qIHByb2Nlc3MgaXQgKi8KLSAgc3dpdGNoIChjaW5mby0+dW5yZWFkX21hcmtlcikgewotICBjYXNlIE1fQVBQMDoKLSAgICBleGFtaW5lX2FwcDAoY2luZm8sIChKT0NURVQgRkFSICopIGIsIG51bXRvcmVhZCwgbGVuZ3RoKTsKLSAgICBicmVhazsKLSAgY2FzZSBNX0FQUDE0OgotICAgIGV4YW1pbmVfYXBwMTQoY2luZm8sIChKT0NURVQgRkFSICopIGIsIG51bXRvcmVhZCwgbGVuZ3RoKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICAvKiBjYW4ndCBnZXQgaGVyZSB1bmxlc3MganBlZ19zYXZlX21hcmtlcnMgY2hvb3NlcyB3cm9uZyBwcm9jZXNzb3IgKi8KLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9VTktOT1dOX01BUktFUiwgY2luZm8tPnVucmVhZF9tYXJrZXIpOwotICAgIGJyZWFrOwotICB9Ci0KLSAgLyogc2tpcCBhbnkgcmVtYWluaW5nIGRhdGEgLS0gY291bGQgYmUgbG90cyAqLwotICBJTlBVVF9TWU5DKGNpbmZvKTsKLSAgaWYgKGxlbmd0aCA+IDApCi0gICAgKCpjaW5mby0+c3JjLT5za2lwX2lucHV0X2RhdGEpIChjaW5mbywgKGxvbmcpIGxlbmd0aCk7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotI2lmZGVmIFNBVkVfTUFSS0VSU19TVVBQT1JURUQKLQotTUVUSE9EREVGKGJvb2xlYW4pCi1zYXZlX21hcmtlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIFNhdmUgYW4gQVBQbiBvciBDT00gbWFya2VyIGludG8gdGhlIG1hcmtlciBsaXN0ICovCi17Ci0gIG15X21hcmtlcl9wdHIgbWFya2VyID0gKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXI7Ci0gIGpwZWdfc2F2ZWRfbWFya2VyX3B0ciBjdXJfbWFya2VyID0gbWFya2VyLT5jdXJfbWFya2VyOwotICB1bnNpZ25lZCBpbnQgYnl0ZXNfcmVhZCwgZGF0YV9sZW5ndGg7Ci0gIEpPQ1RFVCBGQVIgKiBkYXRhOwotICBJTlQzMiBsZW5ndGggPSAwOwotICBJTlBVVF9WQVJTKGNpbmZvKTsKLQotICBpZiAoY3VyX21hcmtlciA9PSBOVUxMKSB7Ci0gICAgLyogYmVnaW4gcmVhZGluZyBhIG1hcmtlciAqLwotICAgIElOUFVUXzJCWVRFUyhjaW5mbywgbGVuZ3RoLCByZXR1cm4gRkFMU0UpOwotICAgIGxlbmd0aCAtPSAyOwotICAgIGlmIChsZW5ndGggPj0gMCkgewkJLyogd2F0Y2ggb3V0IGZvciBib2d1cyBsZW5ndGggd29yZCAqLwotICAgICAgLyogZmlndXJlIG91dCBob3cgbXVjaCB3ZSB3YW50IHRvIHNhdmUgKi8KLSAgICAgIHVuc2lnbmVkIGludCBsaW1pdDsKLSAgICAgIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PSAoaW50KSBNX0NPTSkKLQlsaW1pdCA9IG1hcmtlci0+bGVuZ3RoX2xpbWl0X0NPTTsKLSAgICAgIGVsc2UKLQlsaW1pdCA9IG1hcmtlci0+bGVuZ3RoX2xpbWl0X0FQUG5bY2luZm8tPnVucmVhZF9tYXJrZXIgLSAoaW50KSBNX0FQUDBdOwotICAgICAgaWYgKCh1bnNpZ25lZCBpbnQpIGxlbmd0aCA8IGxpbWl0KQotCWxpbWl0ID0gKHVuc2lnbmVkIGludCkgbGVuZ3RoOwotICAgICAgLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIG1hcmtlciBpdGVtICovCi0gICAgICBjdXJfbWFya2VyID0gKGpwZWdfc2F2ZWRfbWFya2VyX3B0cikKLQkoKmNpbmZvLT5tZW0tPmFsbG9jX2xhcmdlKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgICBTSVpFT0Yoc3RydWN0IGpwZWdfbWFya2VyX3N0cnVjdCkgKyBsaW1pdCk7Ci0gICAgICBjdXJfbWFya2VyLT5uZXh0ID0gTlVMTDsKLSAgICAgIGN1cl9tYXJrZXItPm1hcmtlciA9IChVSU5UOCkgY2luZm8tPnVucmVhZF9tYXJrZXI7Ci0gICAgICBjdXJfbWFya2VyLT5vcmlnaW5hbF9sZW5ndGggPSAodW5zaWduZWQgaW50KSBsZW5ndGg7Ci0gICAgICBjdXJfbWFya2VyLT5kYXRhX2xlbmd0aCA9IGxpbWl0OwotICAgICAgLyogZGF0YSBhcmVhIGlzIGp1c3QgYmV5b25kIHRoZSBqcGVnX21hcmtlcl9zdHJ1Y3QgKi8KLSAgICAgIGRhdGEgPSBjdXJfbWFya2VyLT5kYXRhID0gKEpPQ1RFVCBGQVIgKikgKGN1cl9tYXJrZXIgKyAxKTsKLSAgICAgIG1hcmtlci0+Y3VyX21hcmtlciA9IGN1cl9tYXJrZXI7Ci0gICAgICBtYXJrZXItPmJ5dGVzX3JlYWQgPSAwOwotICAgICAgYnl0ZXNfcmVhZCA9IDA7Ci0gICAgICBkYXRhX2xlbmd0aCA9IGxpbWl0OwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBkZWFsIHdpdGggYm9ndXMgbGVuZ3RoIHdvcmQgKi8KLSAgICAgIGJ5dGVzX3JlYWQgPSBkYXRhX2xlbmd0aCA9IDA7Ci0gICAgICBkYXRhID0gTlVMTDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLyogcmVzdW1lIHJlYWRpbmcgYSBtYXJrZXIgKi8KLSAgICBieXRlc19yZWFkID0gbWFya2VyLT5ieXRlc19yZWFkOwotICAgIGRhdGFfbGVuZ3RoID0gY3VyX21hcmtlci0+ZGF0YV9sZW5ndGg7Ci0gICAgZGF0YSA9IGN1cl9tYXJrZXItPmRhdGEgKyBieXRlc19yZWFkOwotICB9Ci0KLSAgd2hpbGUgKGJ5dGVzX3JlYWQgPCBkYXRhX2xlbmd0aCkgewotICAgIElOUFVUX1NZTkMoY2luZm8pOwkJLyogbW92ZSB0aGUgcmVzdGFydCBwb2ludCB0byBoZXJlICovCi0gICAgbWFya2VyLT5ieXRlc19yZWFkID0gYnl0ZXNfcmVhZDsKLSAgICAvKiBJZiB0aGVyZSdzIG5vdCBhdCBsZWFzdCBvbmUgYnl0ZSBpbiBidWZmZXIsIHN1c3BlbmQgKi8KLSAgICBNQUtFX0JZVEVfQVZBSUwoY2luZm8sIHJldHVybiBGQUxTRSk7Ci0gICAgLyogQ29weSBieXRlcyB3aXRoIHJlYXNvbmFibGUgcmFwaWRpdHkgKi8KLSAgICB3aGlsZSAoYnl0ZXNfcmVhZCA8IGRhdGFfbGVuZ3RoICYmIGJ5dGVzX2luX2J1ZmZlciA+IDApIHsKLSAgICAgICpkYXRhKysgPSAqbmV4dF9pbnB1dF9ieXRlKys7Ci0gICAgICBieXRlc19pbl9idWZmZXItLTsKLSAgICAgIGJ5dGVzX3JlYWQrKzsKLSAgICB9Ci0gIH0KLQotICAvKiBEb25lIHJlYWRpbmcgd2hhdCB3ZSB3YW50IHRvIHJlYWQgKi8KLSAgaWYgKGN1cl9tYXJrZXIgIT0gTlVMTCkgewkvKiB3aWxsIGJlIE5VTEwgaWYgYm9ndXMgbGVuZ3RoIHdvcmQgKi8KLSAgICAvKiBBZGQgbmV3IG1hcmtlciB0byBlbmQgb2YgbGlzdCAqLwotICAgIGlmIChjaW5mby0+bWFya2VyX2xpc3QgPT0gTlVMTCkgewotICAgICAgY2luZm8tPm1hcmtlcl9saXN0ID0gY3VyX21hcmtlcjsKLSAgICB9IGVsc2UgewotICAgICAganBlZ19zYXZlZF9tYXJrZXJfcHRyIHByZXYgPSBjaW5mby0+bWFya2VyX2xpc3Q7Ci0gICAgICB3aGlsZSAocHJldi0+bmV4dCAhPSBOVUxMKQotCXByZXYgPSBwcmV2LT5uZXh0OwotICAgICAgcHJldi0+bmV4dCA9IGN1cl9tYXJrZXI7Ci0gICAgfQotICAgIC8qIFJlc2V0IHBvaW50ZXIgJiBjYWxjIHJlbWFpbmluZyBkYXRhIGxlbmd0aCAqLwotICAgIGRhdGEgPSBjdXJfbWFya2VyLT5kYXRhOwotICAgIGxlbmd0aCA9IGN1cl9tYXJrZXItPm9yaWdpbmFsX2xlbmd0aCAtIGRhdGFfbGVuZ3RoOwotICB9Ci0gIC8qIFJlc2V0IHRvIGluaXRpYWwgc3RhdGUgZm9yIG5leHQgbWFya2VyICovCi0gIG1hcmtlci0+Y3VyX21hcmtlciA9IE5VTEw7Ci0KLSAgLyogUHJvY2VzcyB0aGUgbWFya2VyIGlmIGludGVyZXN0aW5nOyBlbHNlIGp1c3QgbWFrZSBhIGdlbmVyaWMgdHJhY2UgbXNnICovCi0gIHN3aXRjaCAoY2luZm8tPnVucmVhZF9tYXJrZXIpIHsKLSAgY2FzZSBNX0FQUDA6Ci0gICAgZXhhbWluZV9hcHAwKGNpbmZvLCBkYXRhLCBkYXRhX2xlbmd0aCwgbGVuZ3RoKTsKLSAgICBicmVhazsKLSAgY2FzZSBNX0FQUDE0OgotICAgIGV4YW1pbmVfYXBwMTQoY2luZm8sIGRhdGEsIGRhdGFfbGVuZ3RoLCBsZW5ndGgpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX01JU0NfTUFSS0VSLCBjaW5mby0+dW5yZWFkX21hcmtlciwKLQkgICAgIChpbnQpIChkYXRhX2xlbmd0aCArIGxlbmd0aCkpOwotICAgIGJyZWFrOwotICB9Ci0KLSAgLyogc2tpcCBhbnkgcmVtYWluaW5nIGRhdGEgLS0gY291bGQgYmUgbG90cyAqLwotICBJTlBVVF9TWU5DKGNpbmZvKTsJCS8qIGRvIGJlZm9yZSBza2lwX2lucHV0X2RhdGEgKi8KLSAgaWYgKGxlbmd0aCA+IDApCi0gICAgKCpjaW5mby0+c3JjLT5za2lwX2lucHV0X2RhdGEpIChjaW5mbywgKGxvbmcpIGxlbmd0aCk7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLSNlbmRpZiAvKiBTQVZFX01BUktFUlNfU1VQUE9SVEVEICovCi0KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1za2lwX3ZhcmlhYmxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogU2tpcCBvdmVyIGFuIHVua25vd24gb3IgdW5pbnRlcmVzdGluZyB2YXJpYWJsZS1sZW5ndGggbWFya2VyICovCi17Ci0gIElOVDMyIGxlbmd0aDsKLSAgSU5QVVRfVkFSUyhjaW5mbyk7Ci0KLSAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7Ci0gIGxlbmd0aCAtPSAyOwotICAKLSAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfTUlTQ19NQVJLRVIsIGNpbmZvLT51bnJlYWRfbWFya2VyLCAoaW50KSBsZW5ndGgpOwotCi0gIElOUFVUX1NZTkMoY2luZm8pOwkJLyogZG8gYmVmb3JlIHNraXBfaW5wdXRfZGF0YSAqLwotICBpZiAobGVuZ3RoID4gMCkKLSAgICAoKmNpbmZvLT5zcmMtPnNraXBfaW5wdXRfZGF0YSkgKGNpbmZvLCAobG9uZykgbGVuZ3RoKTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogRmluZCB0aGUgbmV4dCBKUEVHIG1hcmtlciwgc2F2ZSBpdCBpbiBjaW5mby0+dW5yZWFkX21hcmtlci4KLSAqIFJldHVybnMgRkFMU0UgaWYgaGFkIHRvIHN1c3BlbmQgYmVmb3JlIHJlYWNoaW5nIGEgbWFya2VyOwotICogaW4gdGhhdCBjYXNlIGNpbmZvLT51bnJlYWRfbWFya2VyIGlzIHVuY2hhbmdlZC4KLSAqCi0gKiBOb3RlIHRoYXQgdGhlIHJlc3VsdCBtaWdodCBub3QgYmUgYSB2YWxpZCBtYXJrZXIgY29kZSwKLSAqIGJ1dCBpdCB3aWxsIG5ldmVyIGJlIDAgb3IgRkYuCi0gKi8KLQotTE9DQUwoYm9vbGVhbikKLW5leHRfbWFya2VyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBpbnQgYzsKLSAgSU5QVVRfVkFSUyhjaW5mbyk7Ci0KLSAgZm9yICg7OykgewotICAgIElOUFVUX0JZVEUoY2luZm8sIGMsIHJldHVybiBGQUxTRSk7Ci0gICAgLyogU2tpcCBhbnkgbm9uLUZGIGJ5dGVzLgotICAgICAqIFRoaXMgbWF5IGxvb2sgYSBiaXQgaW5lZmZpY2llbnQsIGJ1dCBpdCB3aWxsIG5vdCBvY2N1ciBpbiBhIHZhbGlkIGZpbGUuCi0gICAgICogV2Ugc3luYyBhZnRlciBlYWNoIGRpc2NhcmRlZCBieXRlIHNvIHRoYXQgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlCi0gICAgICogY2FuIGRpc2NhcmQgdGhlIGJ5dGUgZnJvbSBpdHMgYnVmZmVyLgotICAgICAqLwotICAgIHdoaWxlIChjICE9IDB4RkYpIHsKLSAgICAgIGNpbmZvLT5tYXJrZXItPmRpc2NhcmRlZF9ieXRlcysrOwotICAgICAgSU5QVVRfU1lOQyhjaW5mbyk7Ci0gICAgICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOwotICAgIH0KLSAgICAvKiBUaGlzIGxvb3Agc3dhbGxvd3MgYW55IGR1cGxpY2F0ZSBGRiBieXRlcy4gIEV4dHJhIEZGcyBhcmUgbGVnYWwgYXMKLSAgICAgKiBwYWQgYnl0ZXMsIHNvIGRvbid0IGNvdW50IHRoZW0gaW4gZGlzY2FyZGVkX2J5dGVzLiAgV2UgYXNzdW1lIHRoZXJlCi0gICAgICogd2lsbCBub3QgYmUgc28gbWFueSBjb25zZWN1dGl2ZSBGRiBieXRlcyBhcyB0byBvdmVyZmxvdyBhIHN1c3BlbmRpbmcKLSAgICAgKiBkYXRhIHNvdXJjZSdzIGlucHV0IGJ1ZmZlci4KLSAgICAgKi8KLSAgICBkbyB7Ci0gICAgICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOwotICAgIH0gd2hpbGUgKGMgPT0gMHhGRik7Ci0gICAgaWYgKGMgIT0gMCkKLSAgICAgIGJyZWFrOwkJCS8qIGZvdW5kIGEgdmFsaWQgbWFya2VyLCBleGl0IGxvb3AgKi8KLSAgICAvKiBSZWFjaCBoZXJlIGlmIHdlIGZvdW5kIGEgc3R1ZmZlZC16ZXJvIGRhdGEgc2VxdWVuY2UgKEZGLzAwKS4KLSAgICAgKiBEaXNjYXJkIGl0IGFuZCBsb29wIGJhY2sgdG8gdHJ5IGFnYWluLgotICAgICAqLwotICAgIGNpbmZvLT5tYXJrZXItPmRpc2NhcmRlZF9ieXRlcyArPSAyOwotICAgIElOUFVUX1NZTkMoY2luZm8pOwotICB9Ci0KLSAgaWYgKGNpbmZvLT5tYXJrZXItPmRpc2NhcmRlZF9ieXRlcyAhPSAwKSB7Ci0gICAgV0FSTk1TMihjaW5mbywgSldSTl9FWFRSQU5FT1VTX0RBVEEsIGNpbmZvLT5tYXJrZXItPmRpc2NhcmRlZF9ieXRlcywgYyk7Ci0gICAgY2luZm8tPm1hcmtlci0+ZGlzY2FyZGVkX2J5dGVzID0gMDsKLSAgfQotCi0gIGNpbmZvLT51bnJlYWRfbWFya2VyID0gYzsKLQotICBJTlBVVF9TWU5DKGNpbmZvKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotTE9DQUwoYm9vbGVhbikKLWZpcnN0X21hcmtlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIExpa2UgbmV4dF9tYXJrZXIsIGJ1dCB1c2VkIHRvIG9idGFpbiB0aGUgaW5pdGlhbCBTT0kgbWFya2VyLiAqLwotLyogRm9yIHRoaXMgbWFya2VyLCB3ZSBkbyBub3QgYWxsb3cgcHJlY2VkaW5nIGdhcmJhZ2Ugb3IgZmlsbDsgb3RoZXJ3aXNlLAotICogd2UgbWlnaHQgd2VsbCBzY2FuIGFuIGVudGlyZSBpbnB1dCBmaWxlIGJlZm9yZSByZWFsaXppbmcgaXQgYWluJ3QgSlBFRy4KLSAqIElmIGFuIGFwcGxpY2F0aW9uIHdhbnRzIHRvIHByb2Nlc3Mgbm9uLUpGSUYgZmlsZXMsIGl0IG11c3Qgc2VlayB0byB0aGUKLSAqIFNPSSBiZWZvcmUgY2FsbGluZyB0aGUgSlBFRyBsaWJyYXJ5LgotICovCi17Ci0gIGludCBjLCBjMjsKLSAgSU5QVVRfVkFSUyhjaW5mbyk7Ci0KLSAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKLSAgSU5QVVRfQllURShjaW5mbywgYzIsIHJldHVybiBGQUxTRSk7Ci0gIGlmIChjICE9IDB4RkYgfHwgYzIgIT0gKGludCkgTV9TT0kpCi0gICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfTk9fU09JLCBjLCBjMik7Ci0KLSAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSBjMjsKLQotICBJTlBVVF9TWU5DKGNpbmZvKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIFJlYWQgbWFya2VycyB1bnRpbCBTT1Mgb3IgRU9JLgotICoKLSAqIFJldHVybnMgc2FtZSBjb2RlcyBhcyBhcmUgZGVmaW5lZCBmb3IganBlZ19jb25zdW1lX2lucHV0OgotICogSlBFR19TVVNQRU5ERUQsIEpQRUdfUkVBQ0hFRF9TT1MsIG9yIEpQRUdfUkVBQ0hFRF9FT0kuCi0gKi8KLQotTUVUSE9EREVGKGludCkKLXJlYWRfbWFya2VycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgLyogT3V0ZXIgbG9vcCByZXBlYXRzIG9uY2UgZm9yIGVhY2ggbWFya2VyLiAqLwotICBmb3IgKDs7KSB7Ci0gICAgLyogQ29sbGVjdCB0aGUgbWFya2VyIHByb3BlciwgdW5sZXNzIHdlIGFscmVhZHkgZGlkLiAqLwotICAgIC8qIE5COiBmaXJzdF9tYXJrZXIoKSBlbmZvcmNlcyB0aGUgcmVxdWlyZW1lbnQgdGhhdCBTT0kgYXBwZWFyIGZpcnN0LiAqLwotICAgIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PSAwKSB7Ci0gICAgICBpZiAoISBjaW5mby0+bWFya2VyLT5zYXdfU09JKSB7Ci0JaWYgKCEgZmlyc3RfbWFya2VyKGNpbmZvKSkKLQkgIHJldHVybiBKUEVHX1NVU1BFTkRFRDsKLSAgICAgIH0gZWxzZSB7Ci0JaWYgKCEgbmV4dF9tYXJrZXIoY2luZm8pKQotCSAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICAgICAgfQotICAgIH0KLSAgICAvKiBBdCB0aGlzIHBvaW50IGNpbmZvLT51bnJlYWRfbWFya2VyIGNvbnRhaW5zIHRoZSBtYXJrZXIgY29kZSBhbmQgdGhlCi0gICAgICogaW5wdXQgcG9pbnQgaXMganVzdCBwYXN0IHRoZSBtYXJrZXIgcHJvcGVyLCBidXQgYmVmb3JlIGFueSBwYXJhbWV0ZXJzLgotICAgICAqIEEgc3VzcGVuc2lvbiB3aWxsIGNhdXNlIHVzIHRvIHJldHVybiB3aXRoIHRoaXMgc3RhdGUgc3RpbGwgdHJ1ZS4KLSAgICAgKi8KLSAgICBzd2l0Y2ggKGNpbmZvLT51bnJlYWRfbWFya2VyKSB7Ci0gICAgY2FzZSBNX1NPSToKLSAgICAgIGlmICghIGdldF9zb2koY2luZm8pKQotCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1NPRjA6CQkvKiBCYXNlbGluZSAqLwotICAgIGNhc2UgTV9TT0YxOgkJLyogRXh0ZW5kZWQgc2VxdWVudGlhbCwgSHVmZm1hbiAqLwotICAgICAgaWYgKCEgZ2V0X3NvZihjaW5mbywgRkFMU0UsIEZBTFNFKSkKLQlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TT0YyOgkJLyogUHJvZ3Jlc3NpdmUsIEh1ZmZtYW4gKi8KLSAgICAgIGlmICghIGdldF9zb2YoY2luZm8sIFRSVUUsIEZBTFNFKSkKLQlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TT0Y5OgkJLyogRXh0ZW5kZWQgc2VxdWVudGlhbCwgYXJpdGhtZXRpYyAqLwotICAgICAgaWYgKCEgZ2V0X3NvZihjaW5mbywgRkFMU0UsIFRSVUUpKQotCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1NPRjEwOgkJLyogUHJvZ3Jlc3NpdmUsIGFyaXRobWV0aWMgKi8KLSAgICAgIGlmICghIGdldF9zb2YoY2luZm8sIFRSVUUsIFRSVUUpKQotCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogQ3VycmVudGx5IHVuc3VwcG9ydGVkIFNPRm4gdHlwZXMgKi8KLSAgICBjYXNlIE1fU09GMzoJCS8qIExvc3NsZXNzLCBIdWZmbWFuICovCi0gICAgY2FzZSBNX1NPRjU6CQkvKiBEaWZmZXJlbnRpYWwgc2VxdWVudGlhbCwgSHVmZm1hbiAqLwotICAgIGNhc2UgTV9TT0Y2OgkJLyogRGlmZmVyZW50aWFsIHByb2dyZXNzaXZlLCBIdWZmbWFuICovCi0gICAgY2FzZSBNX1NPRjc6CQkvKiBEaWZmZXJlbnRpYWwgbG9zc2xlc3MsIEh1ZmZtYW4gKi8KLSAgICBjYXNlIE1fSlBHOgkJCS8qIFJlc2VydmVkIGZvciBKUEVHIGV4dGVuc2lvbnMgKi8KLSAgICBjYXNlIE1fU09GMTE6CQkvKiBMb3NzbGVzcywgYXJpdGhtZXRpYyAqLwotICAgIGNhc2UgTV9TT0YxMzoJCS8qIERpZmZlcmVudGlhbCBzZXF1ZW50aWFsLCBhcml0aG1ldGljICovCi0gICAgY2FzZSBNX1NPRjE0OgkJLyogRGlmZmVyZW50aWFsIHByb2dyZXNzaXZlLCBhcml0aG1ldGljICovCi0gICAgY2FzZSBNX1NPRjE1OgkJLyogRGlmZmVyZW50aWFsIGxvc3NsZXNzLCBhcml0aG1ldGljICovCi0gICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9TT0ZfVU5TVVBQT1JURUQsIGNpbmZvLT51bnJlYWRfbWFya2VyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1NPUzoKLSAgICAgIGlmICghIGdldF9zb3MoY2luZm8pKQotCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKLSAgICAgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gMDsJLyogcHJvY2Vzc2VkIHRoZSBtYXJrZXIgKi8KLSAgICAgIHJldHVybiBKUEVHX1JFQUNIRURfU09TOwotICAgIAotICAgIGNhc2UgTV9FT0k6Ci0gICAgICBUUkFDRU1TKGNpbmZvLCAxLCBKVFJDX0VPSSk7Ci0gICAgICBjaW5mby0+dW5yZWFkX21hcmtlciA9IDA7CS8qIHByb2Nlc3NlZCB0aGUgbWFya2VyICovCi0gICAgICByZXR1cm4gSlBFR19SRUFDSEVEX0VPSTsKLSAgICAgIAotICAgIGNhc2UgTV9EQUM6Ci0gICAgICBpZiAoISBnZXRfZGFjKGNpbmZvKSkKLQlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgTV9ESFQ6Ci0gICAgICBpZiAoISBnZXRfZGh0KGNpbmZvKSkKLQlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgTV9EUVQ6Ci0gICAgICBpZiAoISBnZXRfZHF0KGNpbmZvKSkKLQlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgTV9EUkk6Ci0gICAgICBpZiAoISBnZXRfZHJpKGNpbmZvKSkKLQlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgTV9BUFAwOgotICAgIGNhc2UgTV9BUFAxOgotICAgIGNhc2UgTV9BUFAyOgotICAgIGNhc2UgTV9BUFAzOgotICAgIGNhc2UgTV9BUFA0OgotICAgIGNhc2UgTV9BUFA1OgotICAgIGNhc2UgTV9BUFA2OgotICAgIGNhc2UgTV9BUFA3OgotICAgIGNhc2UgTV9BUFA4OgotICAgIGNhc2UgTV9BUFA5OgotICAgIGNhc2UgTV9BUFAxMDoKLSAgICBjYXNlIE1fQVBQMTE6Ci0gICAgY2FzZSBNX0FQUDEyOgotICAgIGNhc2UgTV9BUFAxMzoKLSAgICBjYXNlIE1fQVBQMTQ6Ci0gICAgY2FzZSBNX0FQUDE1OgotICAgICAgaWYgKCEgKCooKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXIpLT5wcm9jZXNzX0FQUG5bCi0JCWNpbmZvLT51bnJlYWRfbWFya2VyIC0gKGludCkgTV9BUFAwXSkgKGNpbmZvKSkKLQlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgTV9DT006Ci0gICAgICBpZiAoISAoKigobXlfbWFya2VyX3B0cikgY2luZm8tPm1hcmtlciktPnByb2Nlc3NfQ09NKSAoY2luZm8pKQotCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1JTVDA6CQkvKiB0aGVzZSBhcmUgYWxsIHBhcmFtZXRlcmxlc3MgKi8KLSAgICBjYXNlIE1fUlNUMToKLSAgICBjYXNlIE1fUlNUMjoKLSAgICBjYXNlIE1fUlNUMzoKLSAgICBjYXNlIE1fUlNUNDoKLSAgICBjYXNlIE1fUlNUNToKLSAgICBjYXNlIE1fUlNUNjoKLSAgICBjYXNlIE1fUlNUNzoKLSAgICBjYXNlIE1fVEVNOgotICAgICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfUEFSTUxFU1NfTUFSS0VSLCBjaW5mby0+dW5yZWFkX21hcmtlcik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9ETkw6CQkJLyogSWdub3JlIEROTCAuLi4gcGVyaGFwcyB0aGUgd3JvbmcgdGhpbmcgKi8KLSAgICAgIGlmICghIHNraXBfdmFyaWFibGUoY2luZm8pKQotCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoJCQkvKiBtdXN0IGJlIERIUCwgRVhQLCBKUEduLCBvciBSRVNuICovCi0gICAgICAvKiBGb3Igbm93LCB3ZSB0cmVhdCB0aGUgcmVzZXJ2ZWQgbWFya2VycyBhcyBmYXRhbCBlcnJvcnMgc2luY2UgdGhleSBhcmUKLSAgICAgICAqIGxpa2VseSB0byBiZSB1c2VkIHRvIHNpZ25hbCBpbmNvbXBhdGlibGUgSlBFRyBQYXJ0IDMgZXh0ZW5zaW9ucy4KLSAgICAgICAqIE9uY2UgdGhlIEpQRUcgMyB2ZXJzaW9uLW51bWJlciBtYXJrZXIgaXMgd2VsbCBkZWZpbmVkLCB0aGlzIGNvZGUKLSAgICAgICAqIG91Z2h0IHRvIGNoYW5nZSEKLSAgICAgICAqLwotICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfVU5LTk9XTl9NQVJLRVIsIGNpbmZvLT51bnJlYWRfbWFya2VyKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICAvKiBTdWNjZXNzZnVsbHkgcHJvY2Vzc2VkIG1hcmtlciwgc28gcmVzZXQgc3RhdGUgdmFyaWFibGUgKi8KLSAgICBjaW5mby0+dW5yZWFkX21hcmtlciA9IDA7Ci0gIH0gLyogZW5kIGxvb3AgKi8KLX0KLQotCi0vKgotICogUmVhZCBhIHJlc3RhcnQgbWFya2VyLCB3aGljaCBpcyBleHBlY3RlZCB0byBhcHBlYXIgbmV4dCBpbiB0aGUgZGF0YXN0cmVhbTsKLSAqIGlmIHRoZSBtYXJrZXIgaXMgbm90IHRoZXJlLCB0YWtlIGFwcHJvcHJpYXRlIHJlY292ZXJ5IGFjdGlvbi4KLSAqIFJldHVybnMgRkFMU0UgaWYgc3VzcGVuc2lvbiBpcyByZXF1aXJlZC4KLSAqCi0gKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgZW50cm9weSBkZWNvZGVyIGFmdGVyIGl0IGhhcyByZWFkIGFuIGFwcHJvcHJpYXRlCi0gKiBudW1iZXIgb2YgTUNVcy4gIGNpbmZvLT51bnJlYWRfbWFya2VyIG1heSBiZSBub256ZXJvIGlmIHRoZSBlbnRyb3B5IGRlY29kZXIKLSAqIGhhcyBhbHJlYWR5IHJlYWQgYSBtYXJrZXIgZnJvbSB0aGUgZGF0YSBzb3VyY2UuICBVbmRlciBub3JtYWwgY29uZGl0aW9ucwotICogY2luZm8tPnVucmVhZF9tYXJrZXIgd2lsbCBiZSByZXNldCB0byAwIGJlZm9yZSByZXR1cm5pbmc7IGlmIG5vdCByZXNldCwKLSAqIGl0IGhvbGRzIGEgbWFya2VyIHdoaWNoIHRoZSBkZWNvZGVyIHdpbGwgYmUgdW5hYmxlIHRvIHJlYWQgcGFzdC4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLXJlYWRfcmVzdGFydF9tYXJrZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIC8qIE9idGFpbiBhIG1hcmtlciB1bmxlc3Mgd2UgYWxyZWFkeSBkaWQuICovCi0gIC8qIE5vdGUgdGhhdCBuZXh0X21hcmtlciB3aWxsIGNvbXBsYWluIGlmIGl0IHNraXBzIGFueSBkYXRhLiAqLwotICBpZiAoY2luZm8tPnVucmVhZF9tYXJrZXIgPT0gMCkgewotICAgIGlmICghIG5leHRfbWFya2VyKGNpbmZvKSkKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0gIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PQotICAgICAgKChpbnQpIE1fUlNUMCArIGNpbmZvLT5tYXJrZXItPm5leHRfcmVzdGFydF9udW0pKSB7Ci0gICAgLyogTm9ybWFsIGNhc2UgLS0tIHN3YWxsb3cgdGhlIG1hcmtlciBhbmQgbGV0IGVudHJvcHkgZGVjb2RlciBjb250aW51ZSAqLwotICAgIFRSQUNFTVMxKGNpbmZvLCAzLCBKVFJDX1JTVCwgY2luZm8tPm1hcmtlci0+bmV4dF9yZXN0YXJ0X251bSk7Ci0gICAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSAwOwotICB9IGVsc2UgewotICAgIC8qIFVoLW9oLCB0aGUgcmVzdGFydCBtYXJrZXJzIGhhdmUgYmVlbiBtZXNzZWQgdXAuICovCi0gICAgLyogTGV0IHRoZSBkYXRhIHNvdXJjZSBtYW5hZ2VyIGRldGVybWluZSBob3cgdG8gcmVzeW5jLiAqLwotICAgIGlmICghICgqY2luZm8tPnNyYy0+cmVzeW5jX3RvX3Jlc3RhcnQpIChjaW5mbywKLQkJCQkJICAgIGNpbmZvLT5tYXJrZXItPm5leHRfcmVzdGFydF9udW0pKQotICAgICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgLyogVXBkYXRlIG5leHQtcmVzdGFydCBzdGF0ZSAqLwotICBjaW5mby0+bWFya2VyLT5uZXh0X3Jlc3RhcnRfbnVtID0gKGNpbmZvLT5tYXJrZXItPm5leHRfcmVzdGFydF9udW0gKyAxKSAmIDc7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgcmVzeW5jX3RvX3Jlc3RhcnQgbWV0aG9kIGZvciBkYXRhIHNvdXJjZSBtYW5hZ2VycwotICogdG8gdXNlIGlmIHRoZXkgZG9uJ3QgaGF2ZSBhbnkgYmV0dGVyIGFwcHJvYWNoLiAgU29tZSBkYXRhIHNvdXJjZSBtYW5hZ2VycwotICogbWF5IGJlIGFibGUgdG8gYmFjayB1cCwgb3IgbWF5IGhhdmUgYWRkaXRpb25hbCBrbm93bGVkZ2UgYWJvdXQgdGhlIGRhdGEKLSAqIHdoaWNoIHBlcm1pdHMgYSBtb3JlIGludGVsbGlnZW50IHJlY292ZXJ5IHN0cmF0ZWd5OyBzdWNoIG1hbmFnZXJzIHdvdWxkCi0gKiBwcmVzdW1hYmx5IHN1cHBseSB0aGVpciBvd24gcmVzeW5jIG1ldGhvZC4KLSAqCi0gKiByZWFkX3Jlc3RhcnRfbWFya2VyIGNhbGxzIHJlc3luY190b19yZXN0YXJ0IGlmIGl0IGZpbmRzIGEgbWFya2VyIG90aGVyIHRoYW4KLSAqIHRoZSByZXN0YXJ0IG1hcmtlciBpdCB3YXMgZXhwZWN0aW5nLiAgKFRoaXMgY29kZSBpcyAqbm90KiB1c2VkIHVubGVzcwotICogYSBub256ZXJvIHJlc3RhcnQgaW50ZXJ2YWwgaGFzIGJlZW4gZGVjbGFyZWQuKSAgY2luZm8tPnVucmVhZF9tYXJrZXIgaXMKLSAqIHRoZSBtYXJrZXIgY29kZSBhY3R1YWxseSBmb3VuZCAobWlnaHQgYmUgYW55dGhpbmcsIGV4Y2VwdCAwIG9yIEZGKS4KLSAqIFRoZSBkZXNpcmVkIHJlc3RhcnQgbWFya2VyIG51bWJlciAoMC4uNykgaXMgcGFzc2VkIGFzIGEgcGFyYW1ldGVyLgotICogVGhpcyByb3V0aW5lIGlzIHN1cHBvc2VkIHRvIGFwcGx5IHdoYXRldmVyIGVycm9yIHJlY292ZXJ5IHN0cmF0ZWd5IHNlZW1zCi0gKiBhcHByb3ByaWF0ZSBpbiBvcmRlciB0byBwb3NpdGlvbiB0aGUgaW5wdXQgc3RyZWFtIHRvIHRoZSBuZXh0IGRhdGEgc2VnbWVudC4KLSAqIE5vdGUgdGhhdCBjaW5mby0+dW5yZWFkX21hcmtlciBpcyB0cmVhdGVkIGFzIGEgbWFya2VyIGFwcGVhcmluZyBiZWZvcmUKLSAqIHRoZSBjdXJyZW50IGRhdGEtc291cmNlIGlucHV0IHBvaW50OyB1c3VhbGx5IGl0IHNob3VsZCBiZSByZXNldCB0byB6ZXJvCi0gKiBiZWZvcmUgcmV0dXJuaW5nLgotICogUmV0dXJucyBGQUxTRSBpZiBzdXNwZW5zaW9uIGlzIHJlcXVpcmVkLgotICoKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgc3Vic3RhbnRpYWxseSBjb25zdHJhaW5lZCBieSB3YW50aW5nIHRvIHRyZWF0IHRoZQotICogaW5wdXQgYXMgYSBkYXRhIHN0cmVhbTsgdGhpcyBtZWFucyB3ZSBjYW4ndCBiYWNrIHVwLiAgVGhlcmVmb3JlLCB3ZSBoYXZlCi0gKiBvbmx5IHRoZSBmb2xsb3dpbmcgYWN0aW9ucyB0byB3b3JrIHdpdGg6Ci0gKiAgIDEuIFNpbXBseSBkaXNjYXJkIHRoZSBtYXJrZXIgYW5kIGxldCB0aGUgZW50cm9weSBkZWNvZGVyIHJlc3VtZSBhdCBuZXh0Ci0gKiAgICAgIGJ5dGUgb2YgZmlsZS4KLSAqICAgMi4gUmVhZCBmb3J3YXJkIHVudGlsIHdlIGZpbmQgYW5vdGhlciBtYXJrZXIsIGRpc2NhcmRpbmcgaW50ZXJ2ZW5pbmcKLSAqICAgICAgZGF0YS4gIChJbiB0aGVvcnkgd2UgY291bGQgbG9vayBhaGVhZCB3aXRoaW4gdGhlIGN1cnJlbnQgYnVmZmVybG9hZCwKLSAqICAgICAgd2l0aG91dCBoYXZpbmcgdG8gZGlzY2FyZCBkYXRhIGlmIHdlIGRvbid0IGZpbmQgdGhlIGRlc2lyZWQgbWFya2VyLgotICogICAgICBUaGlzIGlkZWEgaXMgbm90IGltcGxlbWVudGVkIGhlcmUsIGluIHBhcnQgYmVjYXVzZSBpdCBtYWtlcyBiZWhhdmlvcgotICogICAgICBkZXBlbmRlbnQgb24gYnVmZmVyIHNpemUgYW5kIGNoYW5jZSBidWZmZXItYm91bmRhcnkgcG9zaXRpb25zLikKLSAqICAgMy4gTGVhdmUgdGhlIG1hcmtlciB1bnJlYWQgKGJ5IGZhaWxpbmcgdG8gemVybyBjaW5mby0+dW5yZWFkX21hcmtlcikuCi0gKiAgICAgIFRoaXMgd2lsbCBjYXVzZSB0aGUgZW50cm9weSBkZWNvZGVyIHRvIHByb2Nlc3MgYW4gZW1wdHkgZGF0YSBzZWdtZW50LAotICogICAgICBpbnNlcnRpbmcgZHVtbXkgemVyb2VzLCBhbmQgdGhlbiB3ZSB3aWxsIHJlcHJvY2VzcyB0aGUgbWFya2VyLgotICoKLSAqICMyIGlzIGFwcHJvcHJpYXRlIGlmIHdlIHRoaW5rIHRoZSBkZXNpcmVkIG1hcmtlciBsaWVzIGFoZWFkLCB3aGlsZSAjMyBpcwotICogYXBwcm9wcmlhdGUgaWYgdGhlIGZvdW5kIG1hcmtlciBpcyBhIGZ1dHVyZSByZXN0YXJ0IG1hcmtlciAoaW5kaWNhdGluZwotICogdGhhdCB3ZSBoYXZlIG1pc3NlZCB0aGUgZGVzaXJlZCByZXN0YXJ0IG1hcmtlciwgcHJvYmFibHkgYmVjYXVzZSBpdCBnb3QKLSAqIGNvcnJ1cHRlZCkuCi0gKiBXZSBhcHBseSAjMiBvciAjMyBpZiB0aGUgZm91bmQgbWFya2VyIGlzIGEgcmVzdGFydCBtYXJrZXIgbm8gbW9yZSB0aGFuCi0gKiB0d28gY291bnRzIGJlaGluZCBvciBhaGVhZCBvZiB0aGUgZXhwZWN0ZWQgb25lLiAgV2UgYWxzbyBhcHBseSAjMiBpZiB0aGUKLSAqIGZvdW5kIG1hcmtlciBpcyBub3QgYSBsZWdhbCBKUEVHIG1hcmtlciBjb2RlIChpdCdzIGNlcnRhaW5seSBib2d1cyBkYXRhKS4KLSAqIElmIHRoZSBmb3VuZCBtYXJrZXIgaXMgYSByZXN0YXJ0IG1hcmtlciBtb3JlIHRoYW4gMiBjb3VudHMgYXdheSwgd2UgZG8gIzEKLSAqICh0b28gbXVjaCByaXNrIHRoYXQgdGhlIG1hcmtlciBpcyBlcnJvbmVvdXM7IHdpdGggbHVjayB3ZSB3aWxsIGJlIGFibGUgdG8KLSAqIHJlc3luYyBhdCBzb21lIGZ1dHVyZSBwb2ludCkuCi0gKiBGb3IgYW55IHZhbGlkIG5vbi1yZXN0YXJ0IEpQRUcgbWFya2VyLCB3ZSBhcHBseSAjMy4gIFRoaXMga2VlcHMgdXMgZnJvbQotICogb3ZlcnJ1bm5pbmcgdGhlIGVuZCBvZiBhIHNjYW4uICBBbiBpbXBsZW1lbnRhdGlvbiBsaW1pdGVkIHRvIHNpbmdsZS1zY2FuCi0gKiBmaWxlcyBtaWdodCBmaW5kIGl0IGJldHRlciB0byBhcHBseSAjMiBmb3IgbWFya2VycyBvdGhlciB0aGFuIEVPSSwgc2luY2UKLSAqIGFueSBvdGhlciBtYXJrZXIgd291bGQgaGF2ZSB0byBiZSBib2d1cyBkYXRhIGluIHRoYXQgY2FzZS4KLSAqLwotCi1HTE9CQUwoYm9vbGVhbikKLWpwZWdfcmVzeW5jX3RvX3Jlc3RhcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBkZXNpcmVkKQotewotICBpbnQgbWFya2VyID0gY2luZm8tPnVucmVhZF9tYXJrZXI7Ci0gIGludCBhY3Rpb24gPSAxOwotICAKLSAgLyogQWx3YXlzIHB1dCB1cCBhIHdhcm5pbmcuICovCi0gIFdBUk5NUzIoY2luZm8sIEpXUk5fTVVTVF9SRVNZTkMsIG1hcmtlciwgZGVzaXJlZCk7Ci0gIAotICAvKiBPdXRlciBsb29wIGhhbmRsZXMgcmVwZWF0ZWQgZGVjaXNpb24gYWZ0ZXIgc2Nhbm5pbmcgZm9yd2FyZC4gKi8KLSAgZm9yICg7OykgewotICAgIGlmIChtYXJrZXIgPCAoaW50KSBNX1NPRjApCi0gICAgICBhY3Rpb24gPSAyOwkJLyogaW52YWxpZCBtYXJrZXIgKi8KLSAgICBlbHNlIGlmIChtYXJrZXIgPCAoaW50KSBNX1JTVDAgfHwgbWFya2VyID4gKGludCkgTV9SU1Q3KQotICAgICAgYWN0aW9uID0gMzsJCS8qIHZhbGlkIG5vbi1yZXN0YXJ0IG1hcmtlciAqLwotICAgIGVsc2UgewotICAgICAgaWYgKG1hcmtlciA9PSAoKGludCkgTV9SU1QwICsgKChkZXNpcmVkKzEpICYgNykpIHx8Ci0JICBtYXJrZXIgPT0gKChpbnQpIE1fUlNUMCArICgoZGVzaXJlZCsyKSAmIDcpKSkKLQlhY3Rpb24gPSAzOwkJLyogb25lIG9mIHRoZSBuZXh0IHR3byBleHBlY3RlZCByZXN0YXJ0cyAqLwotICAgICAgZWxzZSBpZiAobWFya2VyID09ICgoaW50KSBNX1JTVDAgKyAoKGRlc2lyZWQtMSkgJiA3KSkgfHwKLQkgICAgICAgbWFya2VyID09ICgoaW50KSBNX1JTVDAgKyAoKGRlc2lyZWQtMikgJiA3KSkpCi0JYWN0aW9uID0gMjsJCS8qIGEgcHJpb3IgcmVzdGFydCwgc28gYWR2YW5jZSAqLwotICAgICAgZWxzZQotCWFjdGlvbiA9IDE7CQkvKiBkZXNpcmVkIHJlc3RhcnQgb3IgdG9vIGZhciBhd2F5ICovCi0gICAgfQotICAgIFRSQUNFTVMyKGNpbmZvLCA0LCBKVFJDX1JFQ09WRVJZX0FDVElPTiwgbWFya2VyLCBhY3Rpb24pOwotICAgIHN3aXRjaCAoYWN0aW9uKSB7Ci0gICAgY2FzZSAxOgotICAgICAgLyogRGlzY2FyZCBtYXJrZXIgYW5kIGxldCBlbnRyb3B5IGRlY29kZXIgcmVzdW1lIHByb2Nlc3NpbmcuICovCi0gICAgICBjaW5mby0+dW5yZWFkX21hcmtlciA9IDA7Ci0gICAgICByZXR1cm4gVFJVRTsKLSAgICBjYXNlIDI6Ci0gICAgICAvKiBTY2FuIHRvIHRoZSBuZXh0IG1hcmtlciwgYW5kIHJlcGVhdCB0aGUgZGVjaXNpb24gbG9vcC4gKi8KLSAgICAgIGlmICghIG5leHRfbWFya2VyKGNpbmZvKSkKLQlyZXR1cm4gRkFMU0U7Ci0gICAgICBtYXJrZXIgPSBjaW5mby0+dW5yZWFkX21hcmtlcjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIC8qIFJldHVybiB3aXRob3V0IGFkdmFuY2luZyBwYXN0IHRoaXMgbWFya2VyLiAqLwotICAgICAgLyogRW50cm9weSBkZWNvZGVyIHdpbGwgYmUgZm9yY2VkIHRvIHByb2Nlc3MgYW4gZW1wdHkgc2VnbWVudC4gKi8KLSAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgfSAvKiBlbmQgbG9vcCAqLwotfQotCi0KLS8qCi0gKiBSZXNldCBtYXJrZXIgcHJvY2Vzc2luZyBzdGF0ZSB0byBiZWdpbiBhIGZyZXNoIGRhdGFzdHJlYW0uCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1yZXNldF9tYXJrZXJfcmVhZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9tYXJrZXJfcHRyIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKSBjaW5mby0+bWFya2VyOwotCi0gIGNpbmZvLT5jb21wX2luZm8gPSBOVUxMOwkJLyogdW50aWwgYWxsb2NhdGVkIGJ5IGdldF9zb2YgKi8KLSAgY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyID0gMDsJCS8qIG5vIFNPUyBzZWVuIHlldCAqLwotICBjaW5mby0+dW5yZWFkX21hcmtlciA9IDA7CQkvKiBubyBwZW5kaW5nIG1hcmtlciAqLwotICBtYXJrZXItPnB1Yi5zYXdfU09JID0gRkFMU0U7CQkvKiBzZXQgaW50ZXJuYWwgc3RhdGUgdG9vICovCi0gIG1hcmtlci0+cHViLnNhd19TT0YgPSBGQUxTRTsKLSAgbWFya2VyLT5wdWIuZGlzY2FyZGVkX2J5dGVzID0gMDsKLSAgbWFya2VyLT5jdXJfbWFya2VyID0gTlVMTDsKLX0KLQotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgbWFya2VyIHJlYWRlciBtb2R1bGUuCi0gKiBUaGlzIGlzIGNhbGxlZCBvbmx5IG9uY2UsIHdoZW4gdGhlIGRlY29tcHJlc3Npb24gb2JqZWN0IGlzIGNyZWF0ZWQuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9tYXJrZXJfcmVhZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9tYXJrZXJfcHRyIG1hcmtlcjsKLSAgaW50IGk7Ci0KLSAgLyogQ3JlYXRlIHN1Ym9iamVjdCBpbiBwZXJtYW5lbnQgcG9vbCAqLwotICBtYXJrZXIgPSAobXlfbWFya2VyX3B0cikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX1BFUk1BTkVOVCwKLQkJCQlTSVpFT0YobXlfbWFya2VyX3JlYWRlcikpOwotICBjaW5mby0+bWFya2VyID0gKHN0cnVjdCBqcGVnX21hcmtlcl9yZWFkZXIgKikgbWFya2VyOwotICAvKiBJbml0aWFsaXplIHB1YmxpYyBtZXRob2QgcG9pbnRlcnMgKi8KLSAgbWFya2VyLT5wdWIucmVzZXRfbWFya2VyX3JlYWRlciA9IHJlc2V0X21hcmtlcl9yZWFkZXI7Ci0gIG1hcmtlci0+cHViLnJlYWRfbWFya2VycyA9IHJlYWRfbWFya2VyczsKLSAgbWFya2VyLT5wdWIucmVhZF9yZXN0YXJ0X21hcmtlciA9IHJlYWRfcmVzdGFydF9tYXJrZXI7Ci0gIC8qIEluaXRpYWxpemUgQ09NL0FQUG4gcHJvY2Vzc2luZy4KLSAgICogQnkgZGVmYXVsdCwgd2UgZXhhbWluZSBhbmQgdGhlbiBkaXNjYXJkIEFQUDAgYW5kIEFQUDE0LAotICAgKiBidXQgc2ltcGx5IGRpc2NhcmQgQ09NIGFuZCBhbGwgb3RoZXIgQVBQbi4KLSAgICovCi0gIG1hcmtlci0+cHJvY2Vzc19DT00gPSBza2lwX3ZhcmlhYmxlOwotICBtYXJrZXItPmxlbmd0aF9saW1pdF9DT00gPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgIG1hcmtlci0+cHJvY2Vzc19BUFBuW2ldID0gc2tpcF92YXJpYWJsZTsKLSAgICBtYXJrZXItPmxlbmd0aF9saW1pdF9BUFBuW2ldID0gMDsKLSAgfQotICBtYXJrZXItPnByb2Nlc3NfQVBQblswXSA9IGdldF9pbnRlcmVzdGluZ19hcHBuOwotICBtYXJrZXItPnByb2Nlc3NfQVBQblsxNF0gPSBnZXRfaW50ZXJlc3RpbmdfYXBwbjsKLSAgLyogUmVzZXQgbWFya2VyIHByb2Nlc3Npbmcgc3RhdGUgKi8KLSAgcmVzZXRfbWFya2VyX3JlYWRlcihjaW5mbyk7Ci19Ci0KLQotLyoKLSAqIENvbnRyb2wgc2F2aW5nIG9mIENPTSBhbmQgQVBQbiBtYXJrZXJzIGludG8gbWFya2VyX2xpc3QuCi0gKi8KLQotI2lmZGVmIFNBVkVfTUFSS0VSU19TVVBQT1JURUQKLQotR0xPQkFMKHZvaWQpCi1qcGVnX3NhdmVfbWFya2VycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlcl9jb2RlLAotCQkgICB1bnNpZ25lZCBpbnQgbGVuZ3RoX2xpbWl0KQotewotICBteV9tYXJrZXJfcHRyIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKSBjaW5mby0+bWFya2VyOwotICBsb25nIG1heGxlbmd0aDsKLSAganBlZ19tYXJrZXJfcGFyc2VyX21ldGhvZCBwcm9jZXNzb3I7Ci0KLSAgLyogTGVuZ3RoIGxpbWl0IG11c3RuJ3QgYmUgbGFyZ2VyIHRoYW4gd2hhdCB3ZSBjYW4gYWxsb2NhdGUKLSAgICogKHNob3VsZCBvbmx5IGJlIGEgY29uY2VybiBpbiBhIDE2LWJpdCBlbnZpcm9ubWVudCkuCi0gICAqLwotICBtYXhsZW5ndGggPSBjaW5mby0+bWVtLT5tYXhfYWxsb2NfY2h1bmsgLSBTSVpFT0Yoc3RydWN0IGpwZWdfbWFya2VyX3N0cnVjdCk7Ci0gIGlmICgoKGxvbmcpIGxlbmd0aF9saW1pdCkgPiBtYXhsZW5ndGgpCi0gICAgbGVuZ3RoX2xpbWl0ID0gKHVuc2lnbmVkIGludCkgbWF4bGVuZ3RoOwotCi0gIC8qIENob29zZSBwcm9jZXNzb3Igcm91dGluZSB0byB1c2UuCi0gICAqIEFQUDAvQVBQMTQgaGF2ZSBzcGVjaWFsIHJlcXVpcmVtZW50cy4KLSAgICovCi0gIGlmIChsZW5ndGhfbGltaXQpIHsKLSAgICBwcm9jZXNzb3IgPSBzYXZlX21hcmtlcjsKLSAgICAvKiBJZiBzYXZpbmcgQVBQMC9BUFAxNCwgc2F2ZSBhdCBsZWFzdCBlbm91Z2ggZm9yIG91ciBpbnRlcm5hbCB1c2UuICovCi0gICAgaWYgKG1hcmtlcl9jb2RlID09IChpbnQpIE1fQVBQMCAmJiBsZW5ndGhfbGltaXQgPCBBUFAwX0RBVEFfTEVOKQotICAgICAgbGVuZ3RoX2xpbWl0ID0gQVBQMF9EQVRBX0xFTjsKLSAgICBlbHNlIGlmIChtYXJrZXJfY29kZSA9PSAoaW50KSBNX0FQUDE0ICYmIGxlbmd0aF9saW1pdCA8IEFQUDE0X0RBVEFfTEVOKQotICAgICAgbGVuZ3RoX2xpbWl0ID0gQVBQMTRfREFUQV9MRU47Ci0gIH0gZWxzZSB7Ci0gICAgcHJvY2Vzc29yID0gc2tpcF92YXJpYWJsZTsKLSAgICAvKiBJZiBkaXNjYXJkaW5nIEFQUDAvQVBQMTQsIHVzZSBvdXIgcmVndWxhciBvbi10aGUtZmx5IHByb2Nlc3Nvci4gKi8KLSAgICBpZiAobWFya2VyX2NvZGUgPT0gKGludCkgTV9BUFAwIHx8IG1hcmtlcl9jb2RlID09IChpbnQpIE1fQVBQMTQpCi0gICAgICBwcm9jZXNzb3IgPSBnZXRfaW50ZXJlc3RpbmdfYXBwbjsKLSAgfQotCi0gIGlmIChtYXJrZXJfY29kZSA9PSAoaW50KSBNX0NPTSkgewotICAgIG1hcmtlci0+cHJvY2Vzc19DT00gPSBwcm9jZXNzb3I7Ci0gICAgbWFya2VyLT5sZW5ndGhfbGltaXRfQ09NID0gbGVuZ3RoX2xpbWl0OwotICB9IGVsc2UgaWYgKG1hcmtlcl9jb2RlID49IChpbnQpIE1fQVBQMCAmJiBtYXJrZXJfY29kZSA8PSAoaW50KSBNX0FQUDE1KSB7Ci0gICAgbWFya2VyLT5wcm9jZXNzX0FQUG5bbWFya2VyX2NvZGUgLSAoaW50KSBNX0FQUDBdID0gcHJvY2Vzc29yOwotICAgIG1hcmtlci0+bGVuZ3RoX2xpbWl0X0FQUG5bbWFya2VyX2NvZGUgLSAoaW50KSBNX0FQUDBdID0gbGVuZ3RoX2xpbWl0OwotICB9IGVsc2UKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9VTktOT1dOX01BUktFUiwgbWFya2VyX2NvZGUpOwotfQotCi0jZW5kaWYgLyogU0FWRV9NQVJLRVJTX1NVUFBPUlRFRCAqLwotCi0KLS8qCi0gKiBJbnN0YWxsIGEgc3BlY2lhbCBwcm9jZXNzaW5nIG1ldGhvZCBmb3IgQ09NIG9yIEFQUG4gbWFya2Vycy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfc2V0X21hcmtlcl9wcm9jZXNzb3IgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXJfY29kZSwKLQkJCSAgIGpwZWdfbWFya2VyX3BhcnNlcl9tZXRob2Qgcm91dGluZSkKLXsKLSAgbXlfbWFya2VyX3B0ciBtYXJrZXIgPSAobXlfbWFya2VyX3B0cikgY2luZm8tPm1hcmtlcjsKLQotICBpZiAobWFya2VyX2NvZGUgPT0gKGludCkgTV9DT00pCi0gICAgbWFya2VyLT5wcm9jZXNzX0NPTSA9IHJvdXRpbmU7Ci0gIGVsc2UgaWYgKG1hcmtlcl9jb2RlID49IChpbnQpIE1fQVBQMCAmJiBtYXJrZXJfY29kZSA8PSAoaW50KSBNX0FQUDE1KQotICAgIG1hcmtlci0+cHJvY2Vzc19BUFBuW21hcmtlcl9jb2RlIC0gKGludCkgTV9BUFAwXSA9IHJvdXRpbmU7Ci0gIGVsc2UKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9VTktOT1dOX01BUktFUiwgbWFya2VyX2NvZGUpOwotfQotCi0jZW5kaWYgLy9fRlhfSlBFR19UVVJCT18KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkbWFzdGVyLmMgYi9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZG1hc3Rlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWU1MWUwLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkbWFzdGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjAgKzAsMCBAQAotI2lmICFkZWZpbmVkKF9GWF9KUEVHX1RVUkJPXykKLS8qCi0gKiBqZG1hc3Rlci5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgbWFzdGVyIGNvbnRyb2wgbG9naWMgZm9yIHRoZSBKUEVHIGRlY29tcHJlc3Nvci4KLSAqIFRoZXNlIHJvdXRpbmVzIGFyZSBjb25jZXJuZWQgd2l0aCBzZWxlY3RpbmcgdGhlIG1vZHVsZXMgdG8gYmUgZXhlY3V0ZWQKLSAqIGFuZCB3aXRoIGRldGVybWluaW5nIHRoZSBudW1iZXIgb2YgcGFzc2VzIGFuZCB0aGUgd29yayB0byBiZSBkb25lIGluIGVhY2gKLSAqIHBhc3MuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLS8qIFByaXZhdGUgc3RhdGUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19kZWNvbXBfbWFzdGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIGludCBwYXNzX251bWJlcjsJCS8qICMgb2YgcGFzc2VzIGNvbXBsZXRlZCAqLwotCi0gIGJvb2xlYW4gdXNpbmdfbWVyZ2VkX3Vwc2FtcGxlOyAvKiBUUlVFIGlmIHVzaW5nIG1lcmdlZCB1cHNhbXBsZS9jY29udmVydCAqLwotCi0gIC8qIFNhdmVkIHJlZmVyZW5jZXMgdG8gaW5pdGlhbGl6ZWQgcXVhbnRpemVyIG1vZHVsZXMsCi0gICAqIGluIGNhc2Ugd2UgbmVlZCB0byBzd2l0Y2ggbW9kZXMuCi0gICAqLwotICBzdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgKiBxdWFudGl6ZXJfMXBhc3M7Ci0gIHN0cnVjdCBqcGVnX2NvbG9yX3F1YW50aXplciAqIHF1YW50aXplcl8ycGFzczsKLX0gbXlfZGVjb21wX21hc3RlcjsKLQotdHlwZWRlZiBteV9kZWNvbXBfbWFzdGVyICogbXlfbWFzdGVyX3B0cjsKLQotCi0vKgotICogRGV0ZXJtaW5lIHdoZXRoZXIgbWVyZ2VkIHVwc2FtcGxlL2NvbG9yIGNvbnZlcnNpb24gc2hvdWxkIGJlIHVzZWQuCi0gKiBDUlVDSUFMOiB0aGlzIG11c3QgbWF0Y2ggdGhlIGFjdHVhbCBjYXBhYmlsaXRpZXMgb2YgamRtZXJnZS5jIQotICovCi0KLUxPQ0FMKGJvb2xlYW4pCi11c2VfbWVyZ2VkX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotI2lmZGVmIFVQU0FNUExFX01FUkdJTkdfU1VQUE9SVEVECi0gIC8qIE1lcmdpbmcgaXMgdGhlIGVxdWl2YWxlbnQgb2YgcGxhaW4gYm94LWZpbHRlciB1cHNhbXBsaW5nICovCi0gIGlmIChjaW5mby0+ZG9fZmFuY3lfdXBzYW1wbGluZyB8fCBjaW5mby0+Q0NJUjYwMV9zYW1wbGluZykKLSAgICByZXR1cm4gRkFMU0U7Ci0gIC8qIGpkbWVyZ2UuYyBvbmx5IHN1cHBvcnRzIFlDQz0+UkdCIGNvbG9yIGNvbnZlcnNpb24gKi8KLSAgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlICE9IEpDU19ZQ2JDciB8fCBjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gMyB8fAotICAgICAgY2luZm8tPm91dF9jb2xvcl9zcGFjZSAhPSBKQ1NfUkdCIHx8Ci0gICAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgIT0gUkdCX1BJWEVMU0laRSkKLSAgICByZXR1cm4gRkFMU0U7Ci0gIC8qIGFuZCBpdCBvbmx5IGhhbmRsZXMgMmgxdiBvciAyaDJ2IHNhbXBsaW5nIHJhdGlvcyAqLwotICBpZiAoY2luZm8tPmNvbXBfaW5mb1swXS5oX3NhbXBfZmFjdG9yICE9IDIgfHwKLSAgICAgIGNpbmZvLT5jb21wX2luZm9bMV0uaF9zYW1wX2ZhY3RvciAhPSAxIHx8Ci0gICAgICBjaW5mby0+Y29tcF9pbmZvWzJdLmhfc2FtcF9mYWN0b3IgIT0gMSB8fAotICAgICAgY2luZm8tPmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yID4gIDIgfHwKLSAgICAgIGNpbmZvLT5jb21wX2luZm9bMV0udl9zYW1wX2ZhY3RvciAhPSAxIHx8Ci0gICAgICBjaW5mby0+Y29tcF9pbmZvWzJdLnZfc2FtcF9mYWN0b3IgIT0gMSkKLSAgICByZXR1cm4gRkFMU0U7Ci0gIC8qIGZ1cnRoZXJtb3JlLCBpdCBkb2Vzbid0IHdvcmsgaWYgd2UndmUgc2NhbGVkIHRoZSBJRENUcyBkaWZmZXJlbnRseSAqLwotICBpZiAoY2luZm8tPmNvbXBfaW5mb1swXS5EQ1Rfc2NhbGVkX3NpemUgIT0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgfHwKLSAgICAgIGNpbmZvLT5jb21wX2luZm9bMV0uRENUX3NjYWxlZF9zaXplICE9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplIHx8Ci0gICAgICBjaW5mby0+Y29tcF9pbmZvWzJdLkRDVF9zY2FsZWRfc2l6ZSAhPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSkKLSAgICByZXR1cm4gRkFMU0U7Ci0gIC8qID8/PyBhbHNvIG5lZWQgdG8gdGVzdCBmb3IgdXBzYW1wbGUtdGltZSByZXNjYWxpbmcsIHdoZW4gJiBpZiBzdXBwb3J0ZWQgKi8KLSAgcmV0dXJuIFRSVUU7CQkJLyogYnkgZ29sbHksIGl0J2xsIHdvcmsuLi4gKi8KLSNlbHNlCi0gIHJldHVybiBGQUxTRTsKLSNlbmRpZgotfQotCi0KLS8qCi0gKiBDb21wdXRlIG91dHB1dCBpbWFnZSBkaW1lbnNpb25zIGFuZCByZWxhdGVkIHZhbHVlcy4KLSAqIE5PVEU6IHRoaXMgaXMgZXhwb3J0ZWQgZm9yIHBvc3NpYmxlIHVzZSBieSBhcHBsaWNhdGlvbi4KLSAqIEhlbmNlIGl0IG11c3RuJ3QgZG8gYW55dGhpbmcgdGhhdCBjYW4ndCBiZSBkb25lIHR3aWNlLgotICogQWxzbyBub3RlIHRoYXQgaXQgbWF5IGJlIGNhbGxlZCBiZWZvcmUgdGhlIG1hc3RlciBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQhCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBEbyBjb21wdXRhdGlvbnMgdGhhdCBhcmUgbmVlZGVkIGJlZm9yZSBtYXN0ZXIgc2VsZWN0aW9uIHBoYXNlICovCi17Ci0jaWZkZWYgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAotICBpbnQgY2k7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0jZW5kaWYKLQotICAvKiBQcmV2ZW50IGFwcGxpY2F0aW9uIGZyb20gY2FsbGluZyBtZSBhdCB3cm9uZyB0aW1lcyAqLwotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfUkVBRFkpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLQotI2lmZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURUQKLQotICAvKiBDb21wdXRlIGFjdHVhbCBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucyBhbmQgRENUIHNjYWxpbmcgY2hvaWNlcy4gKi8KLSAgaWYgKGNpbmZvLT5zY2FsZV9udW0gKiA4IDw9IGNpbmZvLT5zY2FsZV9kZW5vbSkgewotICAgIC8qIFByb3ZpZGUgMS84IHNjYWxpbmcgKi8KLSAgICBjaW5mby0+b3V0cHV0X3dpZHRoID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGgsIDhMKTsKLSAgICBjaW5mby0+b3V0cHV0X2hlaWdodCA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCwgOEwpOwotICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplID0gMTsKLSAgfSBlbHNlIGlmIChjaW5mby0+c2NhbGVfbnVtICogNCA8PSBjaW5mby0+c2NhbGVfZGVub20pIHsKLSAgICAvKiBQcm92aWRlIDEvNCBzY2FsaW5nICovCi0gICAgY2luZm8tPm91dHB1dF93aWR0aCA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoLCA0TCk7Ci0gICAgY2luZm8tPm91dHB1dF9oZWlnaHQgPSAoSkRJTUVOU0lPTikKLSAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsIDRMKTsKLSAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSA9IDI7Ci0gIH0gZWxzZSBpZiAoY2luZm8tPnNjYWxlX251bSAqIDIgPD0gY2luZm8tPnNjYWxlX2Rlbm9tKSB7Ci0gICAgLyogUHJvdmlkZSAxLzIgc2NhbGluZyAqLwotICAgIGNpbmZvLT5vdXRwdXRfd2lkdGggPSAoSkRJTUVOU0lPTikKLSAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCwgMkwpOwotICAgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0LCAyTCk7Ci0gICAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgPSA0OwotICB9IGVsc2UgewotICAgIC8qIFByb3ZpZGUgMS8xIHNjYWxpbmcgKi8KLSAgICBjaW5mby0+b3V0cHV0X3dpZHRoID0gY2luZm8tPmltYWdlX3dpZHRoOwotICAgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID0gY2luZm8tPmltYWdlX2hlaWdodDsKLSAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSA9IERDVFNJWkU7Ci0gIH0KLSAgLyogSW4gc2VsZWN0aW5nIHRoZSBhY3R1YWwgRENUIHNjYWxpbmcgZm9yIGVhY2ggY29tcG9uZW50LCB3ZSB0cnkgdG8KLSAgICogc2NhbGUgdXAgdGhlIGNocm9tYSBjb21wb25lbnRzIHZpYSBJRENUIHNjYWxpbmcgcmF0aGVyIHRoYW4gdXBzYW1wbGluZy4KLSAgICogVGhpcyBzYXZlcyB0aW1lIGlmIHRoZSB1cHNhbXBsZXIgZ2V0cyB0byB1c2UgMToxIHNjYWxpbmcuCi0gICAqIE5vdGUgdGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgc3VwcG9ydGVkIERDVCBzY2FsaW5ncyBhcmUgcG93ZXJzIG9mIDIuCi0gICAqLwotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIGludCBzc2l6ZSA9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOwotICAgIHdoaWxlIChzc2l6ZSA8IERDVFNJWkUgJiYKLQkgICAoY29tcHB0ci0+aF9zYW1wX2ZhY3RvciAqIHNzaXplICogMiA8PQotCSAgICBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSkgJiYKLQkgICAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIHNzaXplICogMiA8PQotCSAgICBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSkpIHsKLSAgICAgIHNzaXplID0gc3NpemUgKiAyOwotICAgIH0KLSAgICBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUgPSBzc2l6ZTsKLSAgfQotCi0gIC8qIFJlY29tcHV0ZSBkb3duc2FtcGxlZCBkaW1lbnNpb25zIG9mIGNvbXBvbmVudHM7Ci0gICAqIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGtub3cgdGhlc2UgaWYgdXNpbmcgcmF3IGRvd25zYW1wbGVkIGRhdGEuCi0gICAqLwotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIC8qIFNpemUgaW4gc2FtcGxlcywgYWZ0ZXIgSURDVCBzY2FsaW5nICovCi0gICAgY29tcHB0ci0+ZG93bnNhbXBsZWRfd2lkdGggPSAoSkRJTUVOU0lPTikKLSAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCAqCi0JCSAgICAobG9uZykgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpLAotCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7Ci0gICAgY29tcHB0ci0+ZG93bnNhbXBsZWRfaGVpZ2h0ID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ICoKLQkJICAgIChsb25nKSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSksCi0JCSAgICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKLSAgfQotCi0jZWxzZSAvKiAhSURDVF9TQ0FMSU5HX1NVUFBPUlRFRCAqLwotCi0gIC8qIEhhcmR3aXJlIGl0IHRvICJubyBzY2FsaW5nIiAqLwotICBjaW5mby0+b3V0cHV0X3dpZHRoID0gY2luZm8tPmltYWdlX3dpZHRoOwotICBjaW5mby0+b3V0cHV0X2hlaWdodCA9IGNpbmZvLT5pbWFnZV9oZWlnaHQ7Ci0gIC8qIGpkaW5wdXQuYyBoYXMgYWxyZWFkeSBpbml0aWFsaXplZCBEQ1Rfc2NhbGVkX3NpemUgdG8gRENUU0laRSwKLSAgICogYW5kIGhhcyBjb21wdXRlZCB1bnNjYWxlZCBkb3duc2FtcGxlZF93aWR0aCBhbmQgZG93bnNhbXBsZWRfaGVpZ2h0LgotICAgKi8KLQotI2VuZGlmIC8qIElEQ1RfU0NBTElOR19TVVBQT1JURUQgKi8KLQotICAvKiBSZXBvcnQgbnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gc2VsZWN0ZWQgY29sb3JzcGFjZS4gKi8KLSAgLyogUHJvYmFibHkgdGhpcyBzaG91bGQgYmUgaW4gdGhlIGNvbG9yIGNvbnZlcnNpb24gbW9kdWxlLi4uICovCi0gIHN3aXRjaCAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSkgewotICBjYXNlIEpDU19HUkFZU0NBTEU6Ci0gICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gMTsKLSAgICBicmVhazsKLSAgY2FzZSBKQ1NfUkdCOgotI2lmIFJHQl9QSVhFTFNJWkUgIT0gMwotICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IFJHQl9QSVhFTFNJWkU7Ci0gICAgYnJlYWs7Ci0jZW5kaWYgLyogZWxzZSBzaGFyZSBjb2RlIHdpdGggWUNiQ3IgKi8KLSAgY2FzZSBKQ1NfWUNiQ3I6Ci0gICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gMzsKLSAgICBicmVhazsKLSAgY2FzZSBKQ1NfQ01ZSzoKLSAgY2FzZSBKQ1NfWUNDSzoKLSAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSA0OwotICAgIGJyZWFrOwotICBkZWZhdWx0OgkJCS8qIGVsc2UgbXVzdCBiZSBzYW1lIGNvbG9yc3BhY2UgYXMgaW4gZmlsZSAqLwotICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICBicmVhazsKLSAgfQotICBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMgPSAoY2luZm8tPnF1YW50aXplX2NvbG9ycyA/IDEgOgotCQkJICAgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzKTsKLQotICAvKiBTZWUgaWYgdXBzYW1wbGVyIHdpbGwgd2FudCB0byBlbWl0IG1vcmUgdGhhbiBvbmUgcm93IGF0IGEgdGltZSAqLwotICBpZiAodXNlX21lcmdlZF91cHNhbXBsZShjaW5mbykpCi0gICAgY2luZm8tPnJlY19vdXRidWZfaGVpZ2h0ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOwotICBlbHNlCi0gICAgY2luZm8tPnJlY19vdXRidWZfaGVpZ2h0ID0gMTsKLX0KLQotCi0vKgotICogU2V2ZXJhbCBkZWNvbXByZXNzaW9uIHByb2Nlc3NlcyBuZWVkIHRvIHJhbmdlLWxpbWl0IHZhbHVlcyB0byB0aGUgcmFuZ2UKLSAqIDAuLk1BWEpTQU1QTEU7IHRoZSBpbnB1dCB2YWx1ZSBtYXkgZmFsbCBzb21ld2hhdCBvdXRzaWRlIHRoaXMgcmFuZ2UKLSAqIGR1ZSB0byBub2lzZSBpbnRyb2R1Y2VkIGJ5IHF1YW50aXphdGlvbiwgcm91bmRvZmYgZXJyb3IsIGV0Yy4gIFRoZXNlCi0gKiBwcm9jZXNzZXMgYXJlIGlubmVyIGxvb3BzIGFuZCBuZWVkIHRvIGJlIGFzIGZhc3QgYXMgcG9zc2libGUuICBPbiBtb3N0Ci0gKiBtYWNoaW5lcywgcGFydGljdWxhcmx5IENQVXMgd2l0aCBwaXBlbGluZXMgb3IgaW5zdHJ1Y3Rpb24gcHJlZmV0Y2gsCi0gKiBhIChzdWJzY3JpcHQtY2hlY2stbGVzcykgQyB0YWJsZSBsb29rdXAKLSAqCQl4ID0gc2FtcGxlX3JhbmdlX2xpbWl0W3hdOwotICogaXMgZmFzdGVyIHRoYW4gZXhwbGljaXQgdGVzdHMKLSAqCQlpZiAoeCA8IDApICB4ID0gMDsKLSAqCQllbHNlIGlmICh4ID4gTUFYSlNBTVBMRSkgIHggPSBNQVhKU0FNUExFOwotICogVGhlc2UgcHJvY2Vzc2VzIGFsbCB1c2UgYSBjb21tb24gdGFibGUgcHJlcGFyZWQgYnkgdGhlIHJvdXRpbmUgYmVsb3cuCi0gKgotICogRm9yIG1vc3Qgc3RlcHMgd2UgY2FuIG1hdGhlbWF0aWNhbGx5IGd1YXJhbnRlZSB0aGF0IHRoZSBpbml0aWFsIHZhbHVlCi0gKiBvZiB4IGlzIHdpdGhpbiBNQVhKU0FNUExFKzEgb2YgdGhlIGxlZ2FsIHJhbmdlLCBzbyBhIHRhYmxlIHJ1bm5pbmcgZnJvbQotICogLShNQVhKU0FNUExFKzEpIHRvIDIqTUFYSlNBTVBMRSsxIGlzIHN1ZmZpY2llbnQuICBCdXQgZm9yIHRoZSBpbml0aWFsCi0gKiBsaW1pdGluZyBzdGVwIChqdXN0IGFmdGVyIHRoZSBJRENUKSwgYSB3aWxkbHkgb3V0LW9mLXJhbmdlIHZhbHVlIGlzIAotICogcG9zc2libGUgaWYgdGhlIGlucHV0IGRhdGEgaXMgY29ycnVwdC4gIFRvIGF2b2lkIGFueSBjaGFuY2Ugb2YgaW5kZXhpbmcKLSAqIG9mZiB0aGUgZW5kIG9mIG1lbW9yeSBhbmQgZ2V0dGluZyBhIGJhZC1wb2ludGVyIHRyYXAsIHdlIHBlcmZvcm0gdGhlCi0gKiBwb3N0LUlEQ1QgbGltaXRpbmcgdGh1czoKLSAqCQl4ID0gcmFuZ2VfbGltaXRbeCAmIE1BU0tdOwotICogd2hlcmUgTUFTSyBpcyAyIGJpdHMgd2lkZXIgdGhhbiBsZWdhbCBzYW1wbGUgZGF0YSwgaWUgMTAgYml0cyBmb3IgOC1iaXQKLSAqIHNhbXBsZXMuICBVbmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcyB0aGlzIGlzIG1vcmUgdGhhbiBlbm91Z2ggcmFuZ2UgYW5kCi0gKiBhIGNvcnJlY3Qgb3V0cHV0IHdpbGwgYmUgZ2VuZXJhdGVkOyB3aXRoIGJvZ3VzIGlucHV0IGRhdGEgdGhlIG1hc2sgd2lsbAotICogY2F1c2Ugd3JhcGFyb3VuZCwgYW5kIHdlIHdpbGwgc2FmZWx5IGdlbmVyYXRlIGEgYm9ndXMtYnV0LWluLXJhbmdlIG91dHB1dC4KLSAqIEZvciB0aGUgcG9zdC1JRENUIHN0ZXAsIHdlIHdhbnQgdG8gY29udmVydCB0aGUgZGF0YSBmcm9tIHNpZ25lZCB0byB1bnNpZ25lZAotICogcmVwcmVzZW50YXRpb24gYnkgYWRkaW5nIENFTlRFUkpTQU1QTEUgYXQgdGhlIHNhbWUgdGltZSB0aGF0IHdlIGxpbWl0IGl0LgotICogU28gdGhlIHBvc3QtSURDVCBsaW1pdGluZyB0YWJsZSBlbmRzIHVwIGxvb2tpbmcgbGlrZSB0aGlzOgotICogICBDRU5URVJKU0FNUExFLENFTlRFUkpTQU1QTEUrMSwuLi4sTUFYSlNBTVBMRSwKLSAqICAgTUFYSlNBTVBMRSAocmVwZWF0IDIqKE1BWEpTQU1QTEUrMSktQ0VOVEVSSlNBTVBMRSB0aW1lcyksCi0gKiAgIDAgICAgICAgICAgKHJlcGVhdCAyKihNQVhKU0FNUExFKzEpLUNFTlRFUkpTQU1QTEUgdGltZXMpLAotICogICAwLDEsLi4uLENFTlRFUkpTQU1QTEUtMQotICogTmVnYXRpdmUgaW5wdXRzIHNlbGVjdCB2YWx1ZXMgZnJvbSB0aGUgdXBwZXIgaGFsZiBvZiB0aGUgdGFibGUgYWZ0ZXIKLSAqIG1hc2tpbmcuCi0gKgotICogV2UgY2FuIHNhdmUgc29tZSBzcGFjZSBieSBvdmVybGFwcGluZyB0aGUgc3RhcnQgb2YgdGhlIHBvc3QtSURDVCB0YWJsZQotICogd2l0aCB0aGUgc2ltcGxlciByYW5nZSBsaW1pdGluZyB0YWJsZS4gIFRoZSBwb3N0LUlEQ1QgdGFibGUgYmVnaW5zIGF0Ci0gKiBzYW1wbGVfcmFuZ2VfbGltaXQgKyBDRU5URVJKU0FNUExFLgotICoKLSAqIE5vdGUgdGhhdCB0aGUgdGFibGUgaXMgYWxsb2NhdGVkIGluIG5lYXIgZGF0YSBzcGFjZSBvbiBQQ3M7IGl0J3Mgc21hbGwKLSAqIGVub3VnaCBhbmQgdXNlZCBvZnRlbiBlbm91Z2ggdG8ganVzdGlmeSB0aGlzLgotICovCi0KLUxPQ0FMKHZvaWQpCi1wcmVwYXJlX3JhbmdlX2xpbWl0X3RhYmxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogQWxsb2NhdGUgYW5kIGZpbGwgaW4gdGhlIHNhbXBsZV9yYW5nZV9saW1pdCB0YWJsZSAqLwotewotICBKU0FNUExFICogdGFibGU7Ci0gIGludCBpOwotCi0gIHRhYmxlID0gKEpTQU1QTEUgKikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkoNSAqIChNQVhKU0FNUExFKzEpICsgQ0VOVEVSSlNBTVBMRSkgKiBTSVpFT0YoSlNBTVBMRSkpOwotICB0YWJsZSArPSAoTUFYSlNBTVBMRSsxKTsJLyogYWxsb3cgbmVnYXRpdmUgc3Vic2NyaXB0cyBvZiBzaW1wbGUgdGFibGUgKi8KLSAgY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdCA9IHRhYmxlOwotICAvKiBGaXJzdCBzZWdtZW50IG9mICJzaW1wbGUiIHRhYmxlOiBsaW1pdFt4XSA9IDAgZm9yIHggPCAwICovCi0gIE1FTVpFUk8odGFibGUgLSAoTUFYSlNBTVBMRSsxKSwgKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoSlNBTVBMRSkpOwotICAvKiBNYWluIHBhcnQgb2YgInNpbXBsZSIgdGFibGU6IGxpbWl0W3hdID0geCAqLwotICBmb3IgKGkgPSAwOyBpIDw9IE1BWEpTQU1QTEU7IGkrKykKLSAgICB0YWJsZVtpXSA9IChKU0FNUExFKSBpOwotICB0YWJsZSArPSBDRU5URVJKU0FNUExFOwkvKiBQb2ludCB0byB3aGVyZSBwb3N0LUlEQ1QgdGFibGUgc3RhcnRzICovCi0gIC8qIEVuZCBvZiBzaW1wbGUgdGFibGUsIHJlc3Qgb2YgZmlyc3QgaGFsZiBvZiBwb3N0LUlEQ1QgdGFibGUgKi8KLSAgZm9yIChpID0gQ0VOVEVSSlNBTVBMRTsgaSA8IDIqKE1BWEpTQU1QTEUrMSk7IGkrKykKLSAgICB0YWJsZVtpXSA9IE1BWEpTQU1QTEU7Ci0gIC8qIFNlY29uZCBoYWxmIG9mIHBvc3QtSURDVCB0YWJsZSAqLwotICBNRU1aRVJPKHRhYmxlICsgKDIgKiAoTUFYSlNBTVBMRSsxKSksCi0JICAoMiAqIChNQVhKU0FNUExFKzEpIC0gQ0VOVEVSSlNBTVBMRSkgKiBTSVpFT0YoSlNBTVBMRSkpOwotICBNRU1DT1BZKHRhYmxlICsgKDQgKiAoTUFYSlNBTVBMRSsxKSAtIENFTlRFUkpTQU1QTEUpLAotCSAgY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdCwgQ0VOVEVSSlNBTVBMRSAqIFNJWkVPRihKU0FNUExFKSk7Ci19Ci0KLQotLyoKLSAqIE1hc3RlciBzZWxlY3Rpb24gb2YgZGVjb21wcmVzc2lvbiBtb2R1bGVzLgotICogVGhpcyBpcyBkb25lIG9uY2UgYXQganBlZ19zdGFydF9kZWNvbXByZXNzIHRpbWUuICBXZSBkZXRlcm1pbmUKLSAqIHdoaWNoIG1vZHVsZXMgd2lsbCBiZSB1c2VkIGFuZCBnaXZlIHRoZW0gYXBwcm9wcmlhdGUgaW5pdGlhbGl6YXRpb24gY2FsbHMuCi0gKiBXZSBhbHNvIGluaXRpYWxpemUgdGhlIGRlY29tcHJlc3NvciBpbnB1dCBzaWRlIHRvIGJlZ2luIGNvbnN1bWluZyBkYXRhLgotICoKLSAqIFNpbmNlIGpwZWdfcmVhZF9oZWFkZXIgaGFzIGZpbmlzaGVkLCB3ZSBrbm93IHdoYXQgaXMgaW4gdGhlIFNPRgotICogYW5kIChmaXJzdCkgU09TIG1hcmtlcnMuICBXZSBhbHNvIGhhdmUgYWxsIHRoZSBhcHBsaWNhdGlvbiBwYXJhbWV0ZXIKLSAqIHNldHRpbmdzLgotICovCi0KLUxPQ0FMKHZvaWQpCi1tYXN0ZXJfc2VsZWN0aW9uIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9tYXN0ZXJfcHRyIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKSBjaW5mby0+bWFzdGVyOwotICBib29sZWFuIHVzZV9jX2J1ZmZlcjsKLSAgbG9uZyBzYW1wbGVzcGVycm93OwotICBKRElNRU5TSU9OIGpkX3NhbXBsZXNwZXJyb3c7Ci0KLSAgLyogSW5pdGlhbGl6ZSBkaW1lbnNpb25zIGFuZCBvdGhlciBzdHVmZiAqLwotICBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoY2luZm8pOwotICBwcmVwYXJlX3JhbmdlX2xpbWl0X3RhYmxlKGNpbmZvKTsKLQotICAvKiBXaWR0aCBvZiBhbiBvdXRwdXQgc2NhbmxpbmUgbXVzdCBiZSByZXByZXNlbnRhYmxlIGFzIEpESU1FTlNJT04uICovCi0gIHNhbXBsZXNwZXJyb3cgPSAobG9uZykgY2luZm8tPm91dHB1dF93aWR0aCAqIChsb25nKSBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7Ci0gIGpkX3NhbXBsZXNwZXJyb3cgPSAoSkRJTUVOU0lPTikgc2FtcGxlc3BlcnJvdzsKLSAgaWYgKChsb25nKSBqZF9zYW1wbGVzcGVycm93ICE9IHNhbXBsZXNwZXJyb3cpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9XSURUSF9PVkVSRkxPVyk7Ci0KLSAgLyogSW5pdGlhbGl6ZSBteSBwcml2YXRlIHN0YXRlICovCi0gIG1hc3Rlci0+cGFzc19udW1iZXIgPSAwOwotICBtYXN0ZXItPnVzaW5nX21lcmdlZF91cHNhbXBsZSA9IHVzZV9tZXJnZWRfdXBzYW1wbGUoY2luZm8pOwotCi0gIC8qIENvbG9yIHF1YW50aXplciBzZWxlY3Rpb24gKi8KLSAgbWFzdGVyLT5xdWFudGl6ZXJfMXBhc3MgPSBOVUxMOwotICBtYXN0ZXItPnF1YW50aXplcl8ycGFzcyA9IE5VTEw7Ci0gIC8qIE5vIG1vZGUgY2hhbmdlcyBpZiBub3QgdXNpbmcgYnVmZmVyZWQtaW1hZ2UgbW9kZS4gKi8KLSAgaWYgKCEgY2luZm8tPnF1YW50aXplX2NvbG9ycyB8fCAhIGNpbmZvLT5idWZmZXJlZF9pbWFnZSkgewotICAgIGNpbmZvLT5lbmFibGVfMXBhc3NfcXVhbnQgPSBGQUxTRTsKLSAgICBjaW5mby0+ZW5hYmxlX2V4dGVybmFsX3F1YW50ID0gRkFMU0U7Ci0gICAgY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCA9IEZBTFNFOwotICB9Ci0gIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKSB7Ci0gICAgaWYgKGNpbmZvLT5yYXdfZGF0YV9vdXQpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVElNUEwpOwotICAgIC8qIDItcGFzcyBxdWFudGl6ZXIgb25seSB3b3JrcyBpbiAzLWNvbXBvbmVudCBjb2xvciBzcGFjZS4gKi8KLSAgICBpZiAoY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzICE9IDMpIHsKLSAgICAgIGNpbmZvLT5lbmFibGVfMXBhc3NfcXVhbnQgPSBUUlVFOwotICAgICAgY2luZm8tPmVuYWJsZV9leHRlcm5hbF9xdWFudCA9IEZBTFNFOwotICAgICAgY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCA9IEZBTFNFOwotICAgICAgY2luZm8tPmNvbG9ybWFwID0gTlVMTDsKLSAgICB9IGVsc2UgaWYgKGNpbmZvLT5jb2xvcm1hcCAhPSBOVUxMKSB7Ci0gICAgICBjaW5mby0+ZW5hYmxlX2V4dGVybmFsX3F1YW50ID0gVFJVRTsKLSAgICB9IGVsc2UgaWYgKGNpbmZvLT50d29fcGFzc19xdWFudGl6ZSkgewotICAgICAgY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCA9IFRSVUU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNpbmZvLT5lbmFibGVfMXBhc3NfcXVhbnQgPSBUUlVFOwotICAgIH0KLQotICAgIGlmIChjaW5mby0+ZW5hYmxlXzFwYXNzX3F1YW50KSB7Ci0jaWZkZWYgUVVBTlRfMVBBU1NfU1VQUE9SVEVECi0gICAgICBqaW5pdF8xcGFzc19xdWFudGl6ZXIoY2luZm8pOwotICAgICAgbWFzdGVyLT5xdWFudGl6ZXJfMXBhc3MgPSBjaW5mby0+Y3F1YW50aXplOwotI2Vsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZgotICAgIH0KLQotICAgIC8qIFdlIHVzZSB0aGUgMi1wYXNzIGNvZGUgdG8gbWFwIHRvIGV4dGVybmFsIGNvbG9ybWFwcy4gKi8KLSAgICBpZiAoY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCB8fCBjaW5mby0+ZW5hYmxlX2V4dGVybmFsX3F1YW50KSB7Ci0jaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECi0gICAgICBqaW5pdF8ycGFzc19xdWFudGl6ZXIoY2luZm8pOwotICAgICAgbWFzdGVyLT5xdWFudGl6ZXJfMnBhc3MgPSBjaW5mby0+Y3F1YW50aXplOwotI2Vsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZgotICAgIH0KLSAgICAvKiBJZiBib3RoIHF1YW50aXplcnMgYXJlIGluaXRpYWxpemVkLCB0aGUgMi1wYXNzIG9uZSBpcyBsZWZ0IGFjdGl2ZTsKLSAgICAgKiB0aGlzIGlzIG5lY2Vzc2FyeSBmb3Igc3RhcnRpbmcgd2l0aCBxdWFudGl6YXRpb24gdG8gYW4gZXh0ZXJuYWwgbWFwLgotICAgICAqLwotICB9Ci0KLSAgLyogUG9zdC1wcm9jZXNzaW5nOiBpbiBwYXJ0aWN1bGFyLCBjb2xvciBjb252ZXJzaW9uIGZpcnN0ICovCi0gIGlmICghIGNpbmZvLT5yYXdfZGF0YV9vdXQpIHsKLSAgICBpZiAobWFzdGVyLT51c2luZ19tZXJnZWRfdXBzYW1wbGUpIHsKLSNpZmRlZiBVUFNBTVBMRV9NRVJHSU5HX1NVUFBPUlRFRAotICAgICAgamluaXRfbWVyZ2VkX3Vwc2FtcGxlcihjaW5mbyk7IC8qIGRvZXMgY29sb3IgY29udmVyc2lvbiB0b28gKi8KLSNlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0jZW5kaWYKLSAgICB9IGVsc2UgewotICAgICAgamluaXRfY29sb3JfZGVjb252ZXJ0ZXIoY2luZm8pOwotICAgICAgamluaXRfdXBzYW1wbGVyKGNpbmZvKTsKLSAgICB9Ci0gICAgamluaXRfZF9wb3N0X2NvbnRyb2xsZXIoY2luZm8sIGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQpOwotICB9Ci0gIC8qIEludmVyc2UgRENUICovCi0gIGppbml0X2ludmVyc2VfZGN0KGNpbmZvKTsKLSAgLyogRW50cm9weSBkZWNvZGluZzogZWl0aGVyIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYyBjb2RpbmcuICovCi0gIGlmIChjaW5mby0+YXJpdGhfY29kZSkgewotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQVJJVEhfTk9USU1QTCk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7Ci0jaWZkZWYgRF9QUk9HUkVTU0lWRV9TVVBQT1JURUQKLSAgICAgIGppbml0X3BodWZmX2RlY29kZXIoY2luZm8pOwotI2Vsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZgotICAgIH0gZWxzZQotICAgICAgamluaXRfaHVmZl9kZWNvZGVyKGNpbmZvKTsKLSAgfQotCi0gIC8qIEluaXRpYWxpemUgcHJpbmNpcGFsIGJ1ZmZlciBjb250cm9sbGVycy4gKi8KLSAgdXNlX2NfYnVmZmVyID0gY2luZm8tPmlucHV0Y3RsLT5oYXNfbXVsdGlwbGVfc2NhbnMgfHwgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlOwotICBqaW5pdF9kX2NvZWZfY29udHJvbGxlcihjaW5mbywgdXNlX2NfYnVmZmVyKTsKLQotICBpZiAoISBjaW5mby0+cmF3X2RhdGFfb3V0KQotICAgIGppbml0X2RfbWFpbl9jb250cm9sbGVyKGNpbmZvLCBGQUxTRSAvKiBuZXZlciBuZWVkIGZ1bGwgYnVmZmVyIGhlcmUgKi8pOwotCi0gIC8qIFdlIGNhbiBub3cgdGVsbCB0aGUgbWVtb3J5IG1hbmFnZXIgdG8gYWxsb2NhdGUgdmlydHVhbCBhcnJheXMuICovCi0gICgqY2luZm8tPm1lbS0+cmVhbGl6ZV92aXJ0X2FycmF5cykgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLQotICAvKiBJbml0aWFsaXplIGlucHV0IHNpZGUgb2YgZGVjb21wcmVzc29yIHRvIGNvbnN1bWUgZmlyc3Qgc2Nhbi4gKi8KLSAgKCpjaW5mby0+aW5wdXRjdGwtPnN0YXJ0X2lucHV0X3Bhc3MpIChjaW5mbyk7Ci0KLSNpZmRlZiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLSAgLyogSWYganBlZ19zdGFydF9kZWNvbXByZXNzIHdpbGwgcmVhZCB0aGUgd2hvbGUgZmlsZSwgaW5pdGlhbGl6ZQotICAgKiBwcm9ncmVzcyBtb25pdG9yaW5nIGFwcHJvcHJpYXRlbHkuICBUaGUgaW5wdXQgc3RlcCBpcyBjb3VudGVkCi0gICAqIGFzIG9uZSBwYXNzLgotICAgKi8KLSAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMICYmICEgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlICYmCi0gICAgICBjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FucykgewotICAgIGludCBuc2NhbnM7Ci0gICAgLyogRXN0aW1hdGUgbnVtYmVyIG9mIHNjYW5zIHRvIHNldCBwYXNzX2xpbWl0LiAqLwotICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgewotICAgICAgLyogQXJiaXRyYXJpbHkgZXN0aW1hdGUgMiBpbnRlcmxlYXZlZCBEQyBzY2FucyArIDMgQUMgc2NhbnMvY29tcG9uZW50LiAqLwotICAgICAgbnNjYW5zID0gMiArIDMgKiBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIEZvciBhIG5vbnByb2dyZXNzaXZlIG11bHRpc2NhbiBmaWxlLCBlc3RpbWF0ZSAxIHNjYW4gcGVyIGNvbXBvbmVudC4gKi8KLSAgICAgIG5zY2FucyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICB9Ci0gICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAwTDsKLSAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyAqIG5zY2FuczsKLSAgICBjaW5mby0+cHJvZ3Jlc3MtPmNvbXBsZXRlZF9wYXNzZXMgPSAwOwotICAgIGNpbmZvLT5wcm9ncmVzcy0+dG90YWxfcGFzc2VzID0gKGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQgPyAzIDogMik7Ci0gICAgLyogQ291bnQgdGhlIGlucHV0IHBhc3MgYXMgZG9uZSAqLwotICAgIG1hc3Rlci0+cGFzc19udW1iZXIrKzsKLSAgfQotI2VuZGlmIC8qIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAqLwotfQotCi0KLS8qCi0gKiBQZXItcGFzcyBzZXR1cC4KLSAqIFRoaXMgaXMgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBvdXRwdXQgcGFzcy4gIFdlIGRldGVybWluZSB3aGljaAotICogbW9kdWxlcyB3aWxsIGJlIGFjdGl2ZSBkdXJpbmcgdGhpcyBwYXNzIGFuZCBnaXZlIHRoZW0gYXBwcm9wcmlhdGUKLSAqIHN0YXJ0X3Bhc3MgY2FsbHMuICBXZSBhbHNvIHNldCBpc19kdW1teV9wYXNzIHRvIGluZGljYXRlIHdoZXRoZXIgdGhpcwotICogaXMgYSAicmVhbCIgb3V0cHV0IHBhc3Mgb3IgYSBkdW1teSBwYXNzIGZvciBjb2xvciBxdWFudGl6YXRpb24uCi0gKiAoSW4gdGhlIGxhdHRlciBjYXNlLCBqZGFwaXN0ZC5jIHdpbGwgY3JhbmsgdGhlIHBhc3MgdG8gY29tcGxldGlvbi4pCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1wcmVwYXJlX2Zvcl9vdXRwdXRfcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfbWFzdGVyX3B0ciBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikgY2luZm8tPm1hc3RlcjsKLQotICBpZiAobWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcykgewotI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAotICAgIC8qIEZpbmFsIHBhc3Mgb2YgMi1wYXNzIHF1YW50aXphdGlvbiAqLwotICAgIG1hc3Rlci0+cHViLmlzX2R1bW15X3Bhc3MgPSBGQUxTRTsKLSAgICAoKmNpbmZvLT5jcXVhbnRpemUtPnN0YXJ0X3Bhc3MpIChjaW5mbywgRkFMU0UpOwotICAgICgqY2luZm8tPnBvc3QtPnN0YXJ0X3Bhc3MpIChjaW5mbywgSkJVRl9DUkFOS19ERVNUKTsKLSAgICAoKmNpbmZvLT5tYWluLT5zdGFydF9wYXNzKSAoY2luZm8sIEpCVUZfQ1JBTktfREVTVCk7Ci0jZWxzZQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZiAvKiBRVUFOVF8yUEFTU19TVVBQT1JURUQgKi8KLSAgfSBlbHNlIHsKLSAgICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycyAmJiBjaW5mby0+Y29sb3JtYXAgPT0gTlVMTCkgewotICAgICAgLyogU2VsZWN0IG5ldyBxdWFudGl6YXRpb24gbWV0aG9kICovCi0gICAgICBpZiAoY2luZm8tPnR3b19wYXNzX3F1YW50aXplICYmIGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQpIHsKLQljaW5mby0+Y3F1YW50aXplID0gbWFzdGVyLT5xdWFudGl6ZXJfMnBhc3M7Ci0JbWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyA9IFRSVUU7Ci0gICAgICB9IGVsc2UgaWYgKGNpbmZvLT5lbmFibGVfMXBhc3NfcXVhbnQpIHsKLQljaW5mby0+Y3F1YW50aXplID0gbWFzdGVyLT5xdWFudGl6ZXJfMXBhc3M7Ci0gICAgICB9IGVsc2UgewotCUVSUkVYSVQoY2luZm8sIEpFUlJfTU9ERV9DSEFOR0UpOwotICAgICAgfQotICAgIH0KLSAgICAoKmNpbmZvLT5pZGN0LT5zdGFydF9wYXNzKSAoY2luZm8pOwotICAgICgqY2luZm8tPmNvZWYtPnN0YXJ0X291dHB1dF9wYXNzKSAoY2luZm8pOwotICAgIGlmICghIGNpbmZvLT5yYXdfZGF0YV9vdXQpIHsKLSAgICAgIGlmICghIG1hc3Rlci0+dXNpbmdfbWVyZ2VkX3Vwc2FtcGxlKQotCSgqY2luZm8tPmNjb252ZXJ0LT5zdGFydF9wYXNzKSAoY2luZm8pOwotICAgICAgKCpjaW5mby0+dXBzYW1wbGUtPnN0YXJ0X3Bhc3MpIChjaW5mbyk7Ci0gICAgICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykKLQkoKmNpbmZvLT5jcXVhbnRpemUtPnN0YXJ0X3Bhc3MpIChjaW5mbywgbWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyk7Ci0gICAgICAoKmNpbmZvLT5wb3N0LT5zdGFydF9wYXNzKSAoY2luZm8sCi0JICAgIChtYXN0ZXItPnB1Yi5pc19kdW1teV9wYXNzID8gSkJVRl9TQVZFX0FORF9QQVNTIDogSkJVRl9QQVNTX1RIUlUpKTsKLSAgICAgICgqY2luZm8tPm1haW4tPnN0YXJ0X3Bhc3MpIChjaW5mbywgSkJVRl9QQVNTX1RIUlUpOwotICAgIH0KLSAgfQotCi0gIC8qIFNldCB1cCBwcm9ncmVzcyBtb25pdG9yJ3MgcGFzcyBpbmZvIGlmIHByZXNlbnQgKi8KLSAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7Ci0gICAgY2luZm8tPnByb2dyZXNzLT5jb21wbGV0ZWRfcGFzc2VzID0gbWFzdGVyLT5wYXNzX251bWJlcjsKLSAgICBjaW5mby0+cHJvZ3Jlc3MtPnRvdGFsX3Bhc3NlcyA9IG1hc3Rlci0+cGFzc19udW1iZXIgKwotCQkJCSAgICAobWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyA/IDIgOiAxKTsKLSAgICAvKiBJbiBidWZmZXJlZC1pbWFnZSBtb2RlLCB3ZSBhc3N1bWUgb25lIG1vcmUgb3V0cHV0IHBhc3MgaWYgRU9JIG5vdAotICAgICAqIHlldCByZWFjaGVkLCBidXQgbm8gbW9yZSBwYXNzZXMgaWYgRU9JIGhhcyBiZWVuIHJlYWNoZWQuCi0gICAgICovCi0gICAgaWYgKGNpbmZvLT5idWZmZXJlZF9pbWFnZSAmJiAhIGNpbmZvLT5pbnB1dGN0bC0+ZW9pX3JlYWNoZWQpIHsKLSAgICAgIGNpbmZvLT5wcm9ncmVzcy0+dG90YWxfcGFzc2VzICs9IChjaW5mby0+ZW5hYmxlXzJwYXNzX3F1YW50ID8gMiA6IDEpOwotICAgIH0KLSAgfQotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYXQgZW5kIG9mIGFuIG91dHB1dCBwYXNzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZmluaXNoX291dHB1dF9wYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9tYXN0ZXJfcHRyIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKSBjaW5mby0+bWFzdGVyOwotCi0gIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKQotICAgICgqY2luZm8tPmNxdWFudGl6ZS0+ZmluaXNoX3Bhc3MpIChjaW5mbyk7Ci0gIG1hc3Rlci0+cGFzc19udW1iZXIrKzsKLX0KLQotCi0jaWZkZWYgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi0KLS8qCi0gKiBTd2l0Y2ggdG8gYSBuZXcgZXh0ZXJuYWwgY29sb3JtYXAgYmV0d2VlbiBvdXRwdXQgcGFzc2VzLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19uZXdfY29sb3JtYXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X21hc3Rlcl9wdHIgbWFzdGVyID0gKG15X21hc3Rlcl9wdHIpIGNpbmZvLT5tYXN0ZXI7Ci0KLSAgLyogUHJldmVudCBhcHBsaWNhdGlvbiBmcm9tIGNhbGxpbmcgbWUgYXQgd3JvbmcgdGltZXMgKi8KLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX0JVRklNQUdFKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0KLSAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMgJiYgY2luZm8tPmVuYWJsZV9leHRlcm5hbF9xdWFudCAmJgotICAgICAgY2luZm8tPmNvbG9ybWFwICE9IE5VTEwpIHsKLSAgICAvKiBTZWxlY3QgMi1wYXNzIHF1YW50aXplciBmb3IgZXh0ZXJuYWwgY29sb3JtYXAgdXNlICovCi0gICAgY2luZm8tPmNxdWFudGl6ZSA9IG1hc3Rlci0+cXVhbnRpemVyXzJwYXNzOwotICAgIC8qIE5vdGlmeSBxdWFudGl6ZXIgb2YgY29sb3JtYXAgY2hhbmdlICovCi0gICAgKCpjaW5mby0+Y3F1YW50aXplLT5uZXdfY29sb3JfbWFwKSAoY2luZm8pOwotICAgIG1hc3Rlci0+cHViLmlzX2R1bW15X3Bhc3MgPSBGQUxTRTsgLyoganVzdCBpbiBjYXNlICovCi0gIH0gZWxzZQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTU9ERV9DSEFOR0UpOwotfQotCi0jZW5kaWYgLyogRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCi0KLQotLyoKLSAqIEluaXRpYWxpemUgbWFzdGVyIGRlY29tcHJlc3Npb24gY29udHJvbCBhbmQgc2VsZWN0IGFjdGl2ZSBtb2R1bGVzLgotICogVGhpcyBpcyBwZXJmb3JtZWQgYXQgdGhlIHN0YXJ0IG9mIGpwZWdfc3RhcnRfZGVjb21wcmVzcy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X21hc3Rlcl9kZWNvbXByZXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9tYXN0ZXJfcHRyIG1hc3RlcjsKLQotICBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBTSVpFT0YobXlfZGVjb21wX21hc3RlcikpOwotICBjaW5mby0+bWFzdGVyID0gKHN0cnVjdCBqcGVnX2RlY29tcF9tYXN0ZXIgKikgbWFzdGVyOwotICBtYXN0ZXItPnB1Yi5wcmVwYXJlX2Zvcl9vdXRwdXRfcGFzcyA9IHByZXBhcmVfZm9yX291dHB1dF9wYXNzOwotICBtYXN0ZXItPnB1Yi5maW5pc2hfb3V0cHV0X3Bhc3MgPSBmaW5pc2hfb3V0cHV0X3Bhc3M7Ci0KLSAgbWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyA9IEZBTFNFOwotCi0gIG1hc3Rlcl9zZWxlY3Rpb24oY2luZm8pOwotfQotCi0jZW5kaWYgLy9fRlhfSlBFR19UVVJCT18KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkbWVyZ2UuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkbWVyZ2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIyOWY4Ni4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZG1lcmdlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDYgKzAsMCBAQAotI2lmICFkZWZpbmVkKF9GWF9KUEVHX1RVUkJPXykKLS8qCi0gKiBqZG1lcmdlLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIGZvciBtZXJnZWQgdXBzYW1wbGluZy9jb2xvciBjb252ZXJzaW9uLgotICoKLSAqIFRoaXMgZmlsZSBjb21iaW5lcyBmdW5jdGlvbnMgZnJvbSBqZHNhbXBsZS5jIGFuZCBqZGNvbG9yLmM7Ci0gKiByZWFkIHRob3NlIGZpbGVzIGZpcnN0IHRvIHVuZGVyc3RhbmQgd2hhdCdzIGdvaW5nIG9uLgotICoKLSAqIFdoZW4gdGhlIGNocm9tYSBjb21wb25lbnRzIGFyZSB0byBiZSB1cHNhbXBsZWQgYnkgc2ltcGxlIHJlcGxpY2F0aW9uCi0gKiAoaWUsIGJveCBmaWx0ZXJpbmcpLCB3ZSBjYW4gc2F2ZSBzb21lIHdvcmsgaW4gY29sb3IgY29udmVyc2lvbiBieQotICogY2FsY3VsYXRpbmcgYWxsIHRoZSBvdXRwdXQgcGl4ZWxzIGNvcnJlc3BvbmRpbmcgdG8gYSBwYWlyIG9mIGNocm9tYQotICogc2FtcGxlcyBhdCBvbmUgdGltZS4gIEluIHRoZSBjb252ZXJzaW9uIGVxdWF0aW9ucwotICoJUiA9IFkgICAgICAgICAgICsgSzEgKiBDcgotICoJRyA9IFkgKyBLMiAqIENiICsgSzMgKiBDcgotICoJQiA9IFkgKyBLNCAqIENiCi0gKiBvbmx5IHRoZSBZIHRlcm0gdmFyaWVzIGFtb25nIHRoZSBncm91cCBvZiBwaXhlbHMgY29ycmVzcG9uZGluZyB0byBhIHBhaXIKLSAqIG9mIGNocm9tYSBzYW1wbGVzLCBzbyB0aGUgcmVzdCBvZiB0aGUgdGVybXMgY2FuIGJlIGNhbGN1bGF0ZWQganVzdCBvbmNlLgotICogQXQgdHlwaWNhbCBzYW1wbGluZyByYXRpb3MsIHRoaXMgZWxpbWluYXRlcyBoYWxmIG9yIHRocmVlLXF1YXJ0ZXJzIG9mIHRoZQotICogbXVsdGlwbGljYXRpb25zIG5lZWRlZCBmb3IgY29sb3IgY29udmVyc2lvbi4KLSAqCi0gKiBUaGlzIGZpbGUgY3VycmVudGx5IHByb3ZpZGVzIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIGZvbGxvd2luZyBjYXNlczoKLSAqCVlDYkNyID0+IFJHQiBjb2xvciBjb252ZXJzaW9uIG9ubHkuCi0gKglTYW1wbGluZyByYXRpb3Mgb2YgMmgxdiBvciAyaDJ2LgotICoJTm8gc2NhbGluZyBuZWVkZWQgYXQgdXBzYW1wbGUgdGltZS4KLSAqCUNvcm5lci1hbGlnbmVkIChub24tQ0NJUjYwMSkgc2FtcGxpbmcgYWxpZ25tZW50LgotICogT3RoZXIgc3BlY2lhbCBjYXNlcyBjb3VsZCBiZSBhZGRlZCwgYnV0IGluIG1vc3QgYXBwbGljYXRpb25zIHRoZXNlIGFyZQotICogdGhlIG9ubHkgY29tbW9uIGNhc2VzLiAgKEZvciB1bmNvbW1vbiBjYXNlcyB3ZSBmYWxsIGJhY2sgb24gdGhlIG1vcmUKLSAqIGdlbmVyYWwgY29kZSBpbiBqZHNhbXBsZS5jIGFuZCBqZGNvbG9yLmMuKQotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotI2lmZGVmIFVQU0FNUExFX01FUkdJTkdfU1VQUE9SVEVECi0KLSNpZmRlZiBfRlhfTUFOQUdFRF9DT0RFXwotI2RlZmluZSBteV91cHNhbXBsZXIJbXlfdXBzYW1wbGVyX20KLSNlbmRpZgotCi0vKiBQcml2YXRlIHN1Ym9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX3Vwc2FtcGxlciBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBQb2ludGVyIHRvIHJvdXRpbmUgdG8gZG8gYWN0dWFsIHVwc2FtcGxpbmcvY29udmVyc2lvbiBvZiBvbmUgcm93IGdyb3VwICovCi0gIEpNRVRIT0Qodm9pZCwgdXBtZXRob2QsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5fcm93X2dyb3VwX2N0ciwKLQkJCSAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZikpOwotCi0gIC8qIFByaXZhdGUgc3RhdGUgZm9yIFlDQy0+UkdCIGNvbnZlcnNpb24gKi8KLSAgaW50ICogQ3Jfcl90YWI7CQkvKiA9PiB0YWJsZSBmb3IgQ3IgdG8gUiBjb252ZXJzaW9uICovCi0gIGludCAqIENiX2JfdGFiOwkJLyogPT4gdGFibGUgZm9yIENiIHRvIEIgY29udmVyc2lvbiAqLwotICBJTlQzMiAqIENyX2dfdGFiOwkJLyogPT4gdGFibGUgZm9yIENyIHRvIEcgY29udmVyc2lvbiAqLwotICBJTlQzMiAqIENiX2dfdGFiOwkJLyogPT4gdGFibGUgZm9yIENiIHRvIEcgY29udmVyc2lvbiAqLwotCi0gIC8qIEZvciAyOjEgdmVydGljYWwgc2FtcGxpbmcsIHdlIHByb2R1Y2UgdHdvIG91dHB1dCByb3dzIGF0IGEgdGltZS4KLSAgICogV2UgbmVlZCBhICJzcGFyZSIgcm93IGJ1ZmZlciB0byBob2xkIHRoZSBzZWNvbmQgb3V0cHV0IHJvdyBpZiB0aGUKLSAgICogYXBwbGljYXRpb24gcHJvdmlkZXMganVzdCBhIG9uZS1yb3cgYnVmZmVyOyB3ZSBhbHNvIHVzZSB0aGUgc3BhcmUKLSAgICogdG8gZGlzY2FyZCB0aGUgZHVtbXkgbGFzdCByb3cgaWYgdGhlIGltYWdlIGhlaWdodCBpcyBvZGQuCi0gICAqLwotICBKU0FNUFJPVyBzcGFyZV9yb3c7Ci0gIGJvb2xlYW4gc3BhcmVfZnVsbDsJCS8qIFQgaWYgc3BhcmUgYnVmZmVyIGlzIG9jY3VwaWVkICovCi0KLSAgSkRJTUVOU0lPTiBvdXRfcm93X3dpZHRoOwkvKiBzYW1wbGVzIHBlciBvdXRwdXQgcm93ICovCi0gIEpESU1FTlNJT04gcm93c190b19nbzsJLyogY291bnRzIHJvd3MgcmVtYWluaW5nIGluIGltYWdlICovCi19IG15X3Vwc2FtcGxlcjsKLQotdHlwZWRlZiBteV91cHNhbXBsZXIgKiBteV91cHNhbXBsZV9wdHI7Ci0KLSNkZWZpbmUgU0NBTEVCSVRTCTE2CS8qIHNwZWVkaWVzdCByaWdodC1zaGlmdCBvbiBzb21lIG1hY2hpbmVzICovCi0jZGVmaW5lIE9ORV9IQUxGCSgoSU5UMzIpIDEgPDwgKFNDQUxFQklUUy0xKSkKLSNkZWZpbmUgRklYKHgpCQkoKElOVDMyKSAoKHgpICogKDFMPDxTQ0FMRUJJVFMpICsgMC41KSkKLQotCi0vKgotICogSW5pdGlhbGl6ZSB0YWJsZXMgZm9yIFlDQy0+UkdCIGNvbG9yc3BhY2UgY29udmVyc2lvbi4KLSAqIFRoaXMgaXMgdGFrZW4gZGlyZWN0bHkgZnJvbSBqZGNvbG9yLmM7IHNlZSB0aGF0IGZpbGUgZm9yIG1vcmUgaW5mby4KLSAqLwotCi1MT0NBTCh2b2lkKQotYnVpbGRfeWNjX3JnYl90YWJsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOwotICBpbnQgaTsKLSAgSU5UMzIgeDsKLSAgU0hJRlRfVEVNUFMKLQotICB1cHNhbXBsZS0+Q3Jfcl90YWIgPSAoaW50ICopCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihpbnQpKTsKLSAgdXBzYW1wbGUtPkNiX2JfdGFiID0gKGludCAqKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoaW50KSk7Ci0gIHVwc2FtcGxlLT5Dcl9nX3RhYiA9IChJTlQzMiAqKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoSU5UMzIpKTsKLSAgdXBzYW1wbGUtPkNiX2dfdGFiID0gKElOVDMyICopCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihJTlQzMikpOwotCi0gIGZvciAoaSA9IDAsIHggPSAtQ0VOVEVSSlNBTVBMRTsgaSA8PSBNQVhKU0FNUExFOyBpKyssIHgrKykgewotICAgIC8qIGkgaXMgdGhlIGFjdHVhbCBpbnB1dCBwaXhlbCB2YWx1ZSwgaW4gdGhlIHJhbmdlIDAuLk1BWEpTQU1QTEUgKi8KLSAgICAvKiBUaGUgQ2Igb3IgQ3IgdmFsdWUgd2UgYXJlIHRoaW5raW5nIG9mIGlzIHggPSBpIC0gQ0VOVEVSSlNBTVBMRSAqLwotICAgIC8qIENyPT5SIHZhbHVlIGlzIG5lYXJlc3QgaW50IHRvIDEuNDAyMDAgKiB4ICovCi0gICAgdXBzYW1wbGUtPkNyX3JfdGFiW2ldID0gKGludCkKLQkJICAgIFJJR0hUX1NISUZUKEZJWCgxLjQwMjAwKSAqIHggKyBPTkVfSEFMRiwgU0NBTEVCSVRTKTsKLSAgICAvKiBDYj0+QiB2YWx1ZSBpcyBuZWFyZXN0IGludCB0byAxLjc3MjAwICogeCAqLwotICAgIHVwc2FtcGxlLT5DYl9iX3RhYltpXSA9IChpbnQpCi0JCSAgICBSSUdIVF9TSElGVChGSVgoMS43NzIwMCkgKiB4ICsgT05FX0hBTEYsIFNDQUxFQklUUyk7Ci0gICAgLyogQ3I9PkcgdmFsdWUgaXMgc2NhbGVkLXVwIC0wLjcxNDE0ICogeCAqLwotICAgIHVwc2FtcGxlLT5Dcl9nX3RhYltpXSA9ICgtIEZJWCgwLjcxNDE0KSkgKiB4OwotICAgIC8qIENiPT5HIHZhbHVlIGlzIHNjYWxlZC11cCAtMC4zNDQxNCAqIHggKi8KLSAgICAvKiBXZSBhbHNvIGFkZCBpbiBPTkVfSEFMRiBzbyB0aGF0IG5lZWQgbm90IGRvIGl0IGluIGlubmVyIGxvb3AgKi8KLSAgICB1cHNhbXBsZS0+Q2JfZ190YWJbaV0gPSAoLSBGSVgoMC4zNDQxNCkpICogeCArIE9ORV9IQUxGOwotICB9Ci19Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIGFuIHVwc2FtcGxpbmcgcGFzcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfbWVyZ2VkX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7Ci0KLSAgLyogTWFyayB0aGUgc3BhcmUgYnVmZmVyIGVtcHR5ICovCi0gIHVwc2FtcGxlLT5zcGFyZV9mdWxsID0gRkFMU0U7Ci0gIC8qIEluaXRpYWxpemUgdG90YWwtaGVpZ2h0IGNvdW50ZXIgZm9yIGRldGVjdGluZyBib3R0b20gb2YgaW1hZ2UgKi8KLSAgdXBzYW1wbGUtPnJvd3NfdG9fZ28gPSBjaW5mby0+b3V0cHV0X2hlaWdodDsKLX0KLQotCi0vKgotICogQ29udHJvbCByb3V0aW5lIHRvIGRvIHVwc2FtcGxpbmcgKGFuZCBjb2xvciBjb252ZXJzaW9uKS4KLSAqCi0gKiBUaGUgY29udHJvbCByb3V0aW5lIGp1c3QgaGFuZGxlcyB0aGUgcm93IGJ1ZmZlcmluZyBjb25zaWRlcmF0aW9ucy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLW1lcmdlZF8ydl91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAotCQkgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAotCQkgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKLQkJICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCi0vKiAyOjEgdmVydGljYWwgc2FtcGxpbmcgY2FzZTogbWF5IG5lZWQgYSBzcGFyZSByb3cuICovCi17Ci0gIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKLSAgSlNBTVBST1cgd29ya19wdHJzWzJdOwotICBKRElNRU5TSU9OIG51bV9yb3dzOwkJLyogbnVtYmVyIG9mIHJvd3MgcmV0dXJuZWQgdG8gY2FsbGVyICovCi0KLSAgaWYgKHVwc2FtcGxlLT5zcGFyZV9mdWxsKSB7Ci0gICAgLyogSWYgd2UgaGF2ZSBhIHNwYXJlIHJvdyBzYXZlZCBmcm9tIGEgcHJldmlvdXMgY3ljbGUsIGp1c3QgcmV0dXJuIGl0LiAqLwotICAgIGpjb3B5X3NhbXBsZV9yb3dzKCYgdXBzYW1wbGUtPnNwYXJlX3JvdywgMCwgb3V0cHV0X2J1ZiArICpvdXRfcm93X2N0ciwgMCwKLQkJICAgICAgMSwgdXBzYW1wbGUtPm91dF9yb3dfd2lkdGgpOwotICAgIG51bV9yb3dzID0gMTsKLSAgICB1cHNhbXBsZS0+c3BhcmVfZnVsbCA9IEZBTFNFOwotICB9IGVsc2UgewotICAgIC8qIEZpZ3VyZSBudW1iZXIgb2Ygcm93cyB0byByZXR1cm4gdG8gY2FsbGVyLiAqLwotICAgIG51bV9yb3dzID0gMjsKLSAgICAvKiBOb3QgbW9yZSB0aGFuIHRoZSBkaXN0YW5jZSB0byB0aGUgZW5kIG9mIHRoZSBpbWFnZS4gKi8KLSAgICBpZiAobnVtX3Jvd3MgPiB1cHNhbXBsZS0+cm93c190b19nbykKLSAgICAgIG51bV9yb3dzID0gdXBzYW1wbGUtPnJvd3NfdG9fZ287Ci0gICAgLyogQW5kIG5vdCBtb3JlIHRoYW4gd2hhdCB0aGUgY2xpZW50IGNhbiBhY2NlcHQ6ICovCi0gICAgb3V0X3Jvd3NfYXZhaWwgLT0gKm91dF9yb3dfY3RyOwotICAgIGlmIChudW1fcm93cyA+IG91dF9yb3dzX2F2YWlsKQotICAgICAgbnVtX3Jvd3MgPSBvdXRfcm93c19hdmFpbDsKLSAgICAvKiBDcmVhdGUgb3V0cHV0IHBvaW50ZXIgYXJyYXkgZm9yIHVwc2FtcGxlci4gKi8KLSAgICB3b3JrX3B0cnNbMF0gPSBvdXRwdXRfYnVmWypvdXRfcm93X2N0cl07Ci0gICAgaWYgKG51bV9yb3dzID4gMSkgewotICAgICAgd29ya19wdHJzWzFdID0gb3V0cHV0X2J1Zlsqb3V0X3Jvd19jdHIgKyAxXTsKLSAgICB9IGVsc2UgewotICAgICAgd29ya19wdHJzWzFdID0gdXBzYW1wbGUtPnNwYXJlX3JvdzsKLSAgICAgIHVwc2FtcGxlLT5zcGFyZV9mdWxsID0gVFJVRTsKLSAgICB9Ci0gICAgLyogTm93IGRvIHRoZSB1cHNhbXBsaW5nLiAqLwotICAgICgqdXBzYW1wbGUtPnVwbWV0aG9kKSAoY2luZm8sIGlucHV0X2J1ZiwgKmluX3Jvd19ncm91cF9jdHIsIHdvcmtfcHRycyk7Ci0gIH0KLQotICAvKiBBZGp1c3QgY291bnRzICovCi0gICpvdXRfcm93X2N0ciArPSBudW1fcm93czsKLSAgdXBzYW1wbGUtPnJvd3NfdG9fZ28gLT0gbnVtX3Jvd3M7Ci0gIC8qIFdoZW4gdGhlIGJ1ZmZlciBpcyBlbXB0aWVkLCBkZWNsYXJlIHRoaXMgaW5wdXQgcm93IGdyb3VwIGNvbnN1bWVkICovCi0gIGlmICghIHVwc2FtcGxlLT5zcGFyZV9mdWxsKQotICAgICgqaW5fcm93X2dyb3VwX2N0cikrKzsKLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLW1lcmdlZF8xdl91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAotCQkgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAotCQkgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKLQkJICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCi0vKiAxOjEgdmVydGljYWwgc2FtcGxpbmcgY2FzZTogbXVjaCBlYXNpZXIsIG5ldmVyIG5lZWQgYSBzcGFyZSByb3cuICovCi17Ci0gIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKLQotICAvKiBKdXN0IGRvIHRoZSB1cHNhbXBsaW5nLiAqLwotICAoKnVwc2FtcGxlLT51cG1ldGhvZCkgKGNpbmZvLCBpbnB1dF9idWYsICppbl9yb3dfZ3JvdXBfY3RyLAotCQkJIG91dHB1dF9idWYgKyAqb3V0X3Jvd19jdHIpOwotICAvKiBBZGp1c3QgY291bnRzICovCi0gICgqb3V0X3Jvd19jdHIpKys7Ci0gICgqaW5fcm93X2dyb3VwX2N0cikrKzsKLX0KLQotCi0vKgotICogVGhlc2UgYXJlIHRoZSByb3V0aW5lcyBpbnZva2VkIGJ5IHRoZSBjb250cm9sIHJvdXRpbmVzIHRvIGRvCi0gKiB0aGUgYWN0dWFsIHVwc2FtcGxpbmcvY29udmVyc2lvbi4gIE9uZSByb3cgZ3JvdXAgaXMgcHJvY2Vzc2VkIHBlciBjYWxsLgotICoKLSAqIE5vdGU6IHNpbmNlIHdlIG1heSBiZSB3cml0aW5nIGRpcmVjdGx5IGludG8gYXBwbGljYXRpb24tc3VwcGxpZWQgYnVmZmVycywKLSAqIHdlIGhhdmUgdG8gYmUgaG9uZXN0IGFib3V0IHRoZSBvdXRwdXQgd2lkdGg7IHdlIGNhbid0IGFzc3VtZSB0aGUgYnVmZmVyCi0gKiBoYXMgYmVlbiByb3VuZGVkIHVwIHRvIGFuIGV2ZW4gd2lkdGguCi0gKi8KLQotCi0vKgotICogVXBzYW1wbGUgYW5kIGNvbG9yIGNvbnZlcnQgZm9yIHRoZSBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAxOjEgdmVydGljYWwuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1oMnYxX21lcmdlZF91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5fcm93X2dyb3VwX2N0ciwKLQkJICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmKQotewotICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7Ci0gIHJlZ2lzdGVyIGludCB5LCBjcmVkLCBjZ3JlZW4sIGNibHVlOwotICBpbnQgY2IsIGNyOwotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7Ci0gIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7Ci0gIEpESU1FTlNJT04gY29sOwotICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCi0gIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7Ci0gIGludCAqIENycnRhYiA9IHVwc2FtcGxlLT5Dcl9yX3RhYjsKLSAgaW50ICogQ2JidGFiID0gdXBzYW1wbGUtPkNiX2JfdGFiOwotICBJTlQzMiAqIENyZ3RhYiA9IHVwc2FtcGxlLT5Dcl9nX3RhYjsKLSAgSU5UMzIgKiBDYmd0YWIgPSB1cHNhbXBsZS0+Q2JfZ190YWI7Ci0gIFNISUZUX1RFTVBTCi0KLSAgaW5wdHIwID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHJdOwotICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5fcm93X2dyb3VwX2N0cl07Ci0gIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbl9yb3dfZ3JvdXBfY3RyXTsKLSAgb3V0cHRyID0gb3V0cHV0X2J1ZlswXTsKLSAgLyogTG9vcCBmb3IgZWFjaCBwYWlyIG9mIG91dHB1dCBwaXhlbHMgKi8KLSAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoID4+IDE7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgLyogRG8gdGhlIGNocm9tYSBwYXJ0IG9mIHRoZSBjYWxjdWxhdGlvbiAqLwotICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOwotICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOwotICAgIGNyZWQgPSBDcnJ0YWJbY3JdOwotICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOwotICAgIGNibHVlID0gQ2JidGFiW2NiXTsKLSAgICAvKiBGZXRjaCAyIFkgdmFsdWVzIGFuZCBlbWl0IDIgcGl4ZWxzICovCi0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7Ci0gICAgb3V0cHRyW1JHQl9SRURdID0gICByYW5nZV9saW1pdFt5ICsgY3JlZF07Ci0gICAgb3V0cHRyW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKLSAgICBvdXRwdHJbUkdCX0JMVUVdID0gIHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07Ci0gICAgb3V0cHRyICs9IFJHQl9QSVhFTFNJWkU7Ci0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7Ci0gICAgb3V0cHRyW1JHQl9SRURdID0gICByYW5nZV9saW1pdFt5ICsgY3JlZF07Ci0gICAgb3V0cHRyW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKLSAgICBvdXRwdHJbUkdCX0JMVUVdID0gIHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07Ci0gICAgb3V0cHRyICs9IFJHQl9QSVhFTFNJWkU7Ci0gIH0KLSAgLyogSWYgaW1hZ2Ugd2lkdGggaXMgb2RkLCBkbyB0aGUgbGFzdCBvdXRwdXQgY29sdW1uIHNlcGFyYXRlbHkgKi8KLSAgaWYgKGNpbmZvLT5vdXRwdXRfd2lkdGggJiAxKSB7Ci0gICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjEpOwotICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKTsKLSAgICBjcmVkID0gQ3JydGFiW2NyXTsKLSAgICBjZ3JlZW4gPSAoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwgU0NBTEVCSVRTKTsKLSAgICBjYmx1ZSA9IENiYnRhYltjYl07Ci0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjApOwotICAgIG91dHB0cltSR0JfUkVEXSA9ICAgcmFuZ2VfbGltaXRbeSArIGNyZWRdOwotICAgIG91dHB0cltSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07Ci0gICAgb3V0cHRyW1JHQl9CTFVFXSA9ICByYW5nZV9saW1pdFt5ICsgY2JsdWVdOwotICB9Ci19Ci0KLQotLyoKLSAqIFVwc2FtcGxlIGFuZCBjb2xvciBjb252ZXJ0IGZvciB0aGUgY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMjoxIHZlcnRpY2FsLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotaDJ2Ml9tZXJnZWRfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCSAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGluX3Jvd19ncm91cF9jdHIsCi0JCSAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZikKLXsKLSAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOwotICByZWdpc3RlciBpbnQgeSwgY3JlZCwgY2dyZWVuLCBjYmx1ZTsKLSAgaW50IGNiLCBjcjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyMCwgb3V0cHRyMTsKLSAgSlNBTVBST1cgaW5wdHIwMCwgaW5wdHIwMSwgaW5wdHIxLCBpbnB0cjI7Ci0gIEpESU1FTlNJT04gY29sOwotICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCi0gIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7Ci0gIGludCAqIENycnRhYiA9IHVwc2FtcGxlLT5Dcl9yX3RhYjsKLSAgaW50ICogQ2JidGFiID0gdXBzYW1wbGUtPkNiX2JfdGFiOwotICBJTlQzMiAqIENyZ3RhYiA9IHVwc2FtcGxlLT5Dcl9nX3RhYjsKLSAgSU5UMzIgKiBDYmd0YWIgPSB1cHNhbXBsZS0+Q2JfZ190YWI7Ci0gIFNISUZUX1RFTVBTCi0KLSAgaW5wdHIwMCA9IGlucHV0X2J1ZlswXVtpbl9yb3dfZ3JvdXBfY3RyKjJdOwotICBpbnB0cjAxID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHIqMiArIDFdOwotICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5fcm93X2dyb3VwX2N0cl07Ci0gIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbl9yb3dfZ3JvdXBfY3RyXTsKLSAgb3V0cHRyMCA9IG91dHB1dF9idWZbMF07Ci0gIG91dHB0cjEgPSBvdXRwdXRfYnVmWzFdOwotICAvKiBMb29wIGZvciBlYWNoIGdyb3VwIG9mIG91dHB1dCBwaXhlbHMgKi8KLSAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoID4+IDE7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgLyogRG8gdGhlIGNocm9tYSBwYXJ0IG9mIHRoZSBjYWxjdWxhdGlvbiAqLwotICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOwotICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOwotICAgIGNyZWQgPSBDcnJ0YWJbY3JdOwotICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOwotICAgIGNibHVlID0gQ2JidGFiW2NiXTsKLSAgICAvKiBGZXRjaCA0IFkgdmFsdWVzIGFuZCBlbWl0IDQgcGl4ZWxzICovCi0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAwKyspOwotICAgIG91dHB0cjBbUkdCX1JFRF0gPSAgIHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKLSAgICBvdXRwdHIwW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKLSAgICBvdXRwdHIwW1JHQl9CTFVFXSA9ICByYW5nZV9saW1pdFt5ICsgY2JsdWVdOwotICAgIG91dHB0cjAgKz0gUkdCX1BJWEVMU0laRTsKLSAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDArKyk7Ci0gICAgb3V0cHRyMFtSR0JfUkVEXSA9ICAgcmFuZ2VfbGltaXRbeSArIGNyZWRdOwotICAgIG91dHB0cjBbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOwotICAgIG91dHB0cjBbUkdCX0JMVUVdID0gIHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07Ci0gICAgb3V0cHRyMCArPSBSR0JfUElYRUxTSVpFOwotICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMSsrKTsKLSAgICBvdXRwdHIxW1JHQl9SRURdID0gICByYW5nZV9saW1pdFt5ICsgY3JlZF07Ci0gICAgb3V0cHRyMVtSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07Ci0gICAgb3V0cHRyMVtSR0JfQkxVRV0gPSAgcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKLSAgICBvdXRwdHIxICs9IFJHQl9QSVhFTFNJWkU7Ci0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAxKyspOwotICAgIG91dHB0cjFbUkdCX1JFRF0gPSAgIHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKLSAgICBvdXRwdHIxW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKLSAgICBvdXRwdHIxW1JHQl9CTFVFXSA9ICByYW5nZV9saW1pdFt5ICsgY2JsdWVdOwotICAgIG91dHB0cjEgKz0gUkdCX1BJWEVMU0laRTsKLSAgfQotICAvKiBJZiBpbWFnZSB3aWR0aCBpcyBvZGQsIGRvIHRoZSBsYXN0IG91dHB1dCBjb2x1bW4gc2VwYXJhdGVseSAqLwotICBpZiAoY2luZm8tPm91dHB1dF93aWR0aCAmIDEpIHsKLSAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSk7Ci0gICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIpOwotICAgIGNyZWQgPSBDcnJ0YWJbY3JdOwotICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOwotICAgIGNibHVlID0gQ2JidGFiW2NiXTsKLSAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDApOwotICAgIG91dHB0cjBbUkdCX1JFRF0gPSAgIHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKLSAgICBvdXRwdHIwW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKLSAgICBvdXRwdHIwW1JHQl9CTFVFXSA9ICByYW5nZV9saW1pdFt5ICsgY2JsdWVdOwotICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMSk7Ci0gICAgb3V0cHRyMVtSR0JfUkVEXSA9ICAgcmFuZ2VfbGltaXRbeSArIGNyZWRdOwotICAgIG91dHB0cjFbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOwotICAgIG91dHB0cjFbUkdCX0JMVUVdID0gIHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07Ci0gIH0KLX0KLQotCi0vKgotICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIG1lcmdlZCB1cHNhbXBsaW5nL2NvbG9yIGNvbnZlcnNpb24uCi0gKgotICogTkI6IHRoaXMgaXMgY2FsbGVkIHVuZGVyIHRoZSBjb25kaXRpb25zIGRldGVybWluZWQgYnkgdXNlX21lcmdlZF91cHNhbXBsZSgpCi0gKiBpbiBqZG1hc3Rlci5jLiAgVGhhdCByb3V0aW5lIE1VU1QgY29ycmVzcG9uZCB0byB0aGUgYWN0dWFsIGNhcGFiaWxpdGllcwotICogb2YgdGhpcyBtb2R1bGU7IG5vIHNhZmV0eSBjaGVja3MgYXJlIG1hZGUgaGVyZS4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X21lcmdlZF91cHNhbXBsZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZTsKLQotICB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfdXBzYW1wbGVyKSk7Ci0gIGNpbmZvLT51cHNhbXBsZSA9IChzdHJ1Y3QganBlZ191cHNhbXBsZXIgKikgdXBzYW1wbGU7Ci0gIHVwc2FtcGxlLT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfbWVyZ2VkX3Vwc2FtcGxlOwotICB1cHNhbXBsZS0+cHViLm5lZWRfY29udGV4dF9yb3dzID0gRkFMU0U7Ci0KLSAgdXBzYW1wbGUtPm91dF9yb3dfd2lkdGggPSBjaW5mby0+b3V0cHV0X3dpZHRoICogY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzOwotCi0gIGlmIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgPT0gMikgewotICAgIHVwc2FtcGxlLT5wdWIudXBzYW1wbGUgPSBtZXJnZWRfMnZfdXBzYW1wbGU7Ci0gICAgdXBzYW1wbGUtPnVwbWV0aG9kID0gaDJ2Ml9tZXJnZWRfdXBzYW1wbGU7Ci0gICAgLyogQWxsb2NhdGUgYSBzcGFyZSByb3cgYnVmZmVyICovCi0gICAgdXBzYW1wbGUtPnNwYXJlX3JvdyA9IChKU0FNUFJPVykKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCShzaXplX3QpICh1cHNhbXBsZS0+b3V0X3Jvd193aWR0aCAqIFNJWkVPRihKU0FNUExFKSkpOwotICB9IGVsc2UgewotICAgIHVwc2FtcGxlLT5wdWIudXBzYW1wbGUgPSBtZXJnZWRfMXZfdXBzYW1wbGU7Ci0gICAgdXBzYW1wbGUtPnVwbWV0aG9kID0gaDJ2MV9tZXJnZWRfdXBzYW1wbGU7Ci0gICAgLyogTm8gc3BhcmUgcm93IG5lZWRlZCAqLwotICAgIHVwc2FtcGxlLT5zcGFyZV9yb3cgPSBOVUxMOwotICB9Ci0KLSAgYnVpbGRfeWNjX3JnYl90YWJsZShjaW5mbyk7Ci19Ci0KLSNlbmRpZiAvKiBVUFNBTVBMRV9NRVJHSU5HX1NVUFBPUlRFRCAqLwotCi0jZW5kaWYgLy9fRlhfSlBFR19UVVJCT18KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkcGh1ZmYuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkcGh1ZmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI4ZTQxMi4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZHBodWZmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NzEgKzAsMCBAQAotI2lmICFkZWZpbmVkKF9GWF9KUEVHX1RVUkJPXykKLS8qCi0gKiBqZHBodWZmLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBIdWZmbWFuIGVudHJvcHkgZGVjb2Rpbmcgcm91dGluZXMgZm9yIHByb2dyZXNzaXZlIEpQRUcuCi0gKgotICogTXVjaCBvZiB0aGUgY29tcGxleGl0eSBoZXJlIGhhcyB0byBkbyB3aXRoIHN1cHBvcnRpbmcgaW5wdXQgc3VzcGVuc2lvbi4KLSAqIElmIHRoZSBkYXRhIHNvdXJjZSBtb2R1bGUgZGVtYW5kcyBzdXNwZW5zaW9uLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gYmFjawotICogdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IE1DVS4gIFRvIGRvIHRoaXMsIHdlIGNvcHkgc3RhdGUgdmFyaWFibGVzCi0gKiBpbnRvIGxvY2FsIHdvcmtpbmcgc3RvcmFnZSwgYW5kIHVwZGF0ZSB0aGVtIGJhY2sgdG8gdGhlIHBlcm1hbmVudAotICogc3RvcmFnZSBvbmx5IHVwb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIGFuIE1DVS4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiamRodWZmLmgiCQkvKiBEZWNsYXJhdGlvbnMgc2hhcmVkIHdpdGggamRodWZmLmMgKi8KLQotCi0jaWZkZWYgRF9QUk9HUkVTU0lWRV9TVVBQT1JURUQKLQotLyoKLSAqIEV4cGFuZGVkIGVudHJvcHkgZGVjb2RlciBvYmplY3QgZm9yIHByb2dyZXNzaXZlIEh1ZmZtYW4gZGVjb2RpbmcuCi0gKgotICogVGhlIHNhdmFibGVfc3RhdGUgc3VicmVjb3JkIGNvbnRhaW5zIGZpZWxkcyB0aGF0IGNoYW5nZSB3aXRoaW4gYW4gTUNVLAotICogYnV0IG11c3Qgbm90IGJlIHVwZGF0ZWQgcGVybWFuZW50bHkgdW50aWwgd2UgY29tcGxldGUgdGhlIE1DVS4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGludCBFT0JSVU47CQkJLyogcmVtYWluaW5nIEVPQnMgaW4gRU9CUlVOICovCi0gIGludCBsYXN0X2RjX3ZhbFtNQVhfQ09NUFNfSU5fU0NBTl07CS8qIGxhc3QgREMgY29lZiBmb3IgZWFjaCBjb21wb25lbnQgKi8KLX0gc2F2YWJsZV9zdGF0ZTsKLQotLyogVGhpcyBtYWNybyBpcyB0byB3b3JrIGFyb3VuZCBjb21waWxlcnMgd2l0aCBtaXNzaW5nIG9yIGJyb2tlbgotICogc3RydWN0dXJlIGFzc2lnbm1lbnQuICBZb3UnbGwgbmVlZCB0byBmaXggdGhpcyBjb2RlIGlmIHlvdSBoYXZlCi0gKiBzdWNoIGEgY29tcGlsZXIgYW5kIHlvdSBjaGFuZ2UgTUFYX0NPTVBTX0lOX1NDQU4uCi0gKi8KLQotI2lmbmRlZiBOT19TVFJVQ1RfQVNTSUdOCi0jZGVmaW5lIEFTU0lHTl9TVEFURShkZXN0LHNyYykgICgoZGVzdCkgPSAoc3JjKSkKLSNlbHNlCi0jaWYgTUFYX0NPTVBTX0lOX1NDQU4gPT0gNAotI2RlZmluZSBBU1NJR05fU1RBVEUoZGVzdCxzcmMpICBcCi0JKChkZXN0KS5FT0JSVU4gPSAoc3JjKS5FT0JSVU4sIFwKLQkgKGRlc3QpLmxhc3RfZGNfdmFsWzBdID0gKHNyYykubGFzdF9kY192YWxbMF0sIFwKLQkgKGRlc3QpLmxhc3RfZGNfdmFsWzFdID0gKHNyYykubGFzdF9kY192YWxbMV0sIFwKLQkgKGRlc3QpLmxhc3RfZGNfdmFsWzJdID0gKHNyYykubGFzdF9kY192YWxbMl0sIFwKLQkgKGRlc3QpLmxhc3RfZGNfdmFsWzNdID0gKHNyYykubGFzdF9kY192YWxbM10pCi0jZW5kaWYKLSNlbmRpZgotCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGpwZWdfZW50cm9weV9kZWNvZGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIFRoZXNlIGZpZWxkcyBhcmUgbG9hZGVkIGludG8gbG9jYWwgdmFyaWFibGVzIGF0IHN0YXJ0IG9mIGVhY2ggTUNVLgotICAgKiBJbiBjYXNlIG9mIHN1c3BlbnNpb24sIHdlIGV4aXQgV0lUSE9VVCB1cGRhdGluZyB0aGVtLgotICAgKi8KLSAgYml0cmVhZF9wZXJtX3N0YXRlIGJpdHN0YXRlOwkvKiBCaXQgYnVmZmVyIGF0IHN0YXJ0IG9mIE1DVSAqLwotICBzYXZhYmxlX3N0YXRlIHNhdmVkOwkJLyogT3RoZXIgc3RhdGUgYXQgc3RhcnQgb2YgTUNVICovCi0KLSAgLyogVGhlc2UgZmllbGRzIGFyZSBOT1QgbG9hZGVkIGludG8gbG9jYWwgd29ya2luZyBzdGF0ZS4gKi8KLSAgdW5zaWduZWQgaW50IHJlc3RhcnRzX3RvX2dvOwkvKiBNQ1VzIGxlZnQgaW4gdGhpcyByZXN0YXJ0IGludGVydmFsICovCi0KLSAgLyogUG9pbnRlcnMgdG8gZGVyaXZlZCB0YWJsZXMgKHRoZXNlIHdvcmtzcGFjZXMgaGF2ZSBpbWFnZSBsaWZlc3BhbikgKi8KLSAgZF9kZXJpdmVkX3RibCAqIGRlcml2ZWRfdGJsc1tOVU1fSFVGRl9UQkxTXTsKLQotICBkX2Rlcml2ZWRfdGJsICogYWNfZGVyaXZlZF90Ymw7IC8qIGFjdGl2ZSB0YWJsZSBkdXJpbmcgYW4gQUMgc2NhbiAqLwotfSBwaHVmZl9lbnRyb3B5X2RlY29kZXI7Ci0KLXR5cGVkZWYgcGh1ZmZfZW50cm9weV9kZWNvZGVyICogcGh1ZmZfZW50cm9weV9wdHI7Ci0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCi1NRVRIT0RERUYoYm9vbGVhbikgZGVjb2RlX21jdV9EQ19maXJzdCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgICBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7Ci1NRVRIT0RERUYoYm9vbGVhbikgZGVjb2RlX21jdV9BQ19maXJzdCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgICBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7Ci1NRVRIT0RERUYoYm9vbGVhbikgZGVjb2RlX21jdV9EQ19yZWZpbmUgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKLU1FVEhPRERFRihib29sZWFuKSBkZWNvZGVfbWN1X0FDX3JlZmluZSBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgICAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOwotCi0KLS8qCi0gKiBJbml0aWFsaXplIGZvciBhIEh1ZmZtYW4tY29tcHJlc3NlZCBzY2FuLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfcGFzc19waHVmZl9kZWNvZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgYm9vbGVhbiBpc19EQ19iYW5kLCBiYWQ7Ci0gIGludCBjaSwgY29lZmksIHRibDsKLSAgaW50ICpjb2VmX2JpdF9wdHI7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotCi0gIGlzX0RDX2JhbmQgPSAoY2luZm8tPlNzID09IDApOwotCi0gIC8qIFZhbGlkYXRlIHNjYW4gcGFyYW1ldGVycyAqLwotICBiYWQgPSBGQUxTRTsKLSAgaWYgKGlzX0RDX2JhbmQpIHsKLSAgICBpZiAoY2luZm8tPlNlICE9IDApCi0gICAgICBiYWQgPSBUUlVFOwotICB9IGVsc2UgewotICAgIC8qIG5lZWQgbm90IGNoZWNrIFNzL1NlIDwgMCBzaW5jZSB0aGV5IGNhbWUgZnJvbSB1bnNpZ25lZCBieXRlcyAqLwotICAgIGlmIChjaW5mby0+U3MgPiBjaW5mby0+U2UgfHwgY2luZm8tPlNlID49IERDVFNJWkUyKQotICAgICAgYmFkID0gVFJVRTsKLSAgICAvKiBBQyBzY2FucyBtYXkgaGF2ZSBvbmx5IG9uZSBjb21wb25lbnQgKi8KLSAgICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gIT0gMSkKLSAgICAgIGJhZCA9IFRSVUU7Ci0gIH0KLSAgaWYgKGNpbmZvLT5BaCAhPSAwKSB7Ci0gICAgLyogU3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIHJlZmluZW1lbnQgc2NhbjogbXVzdCBoYXZlIEFsID0gQWgtMS4gKi8KLSAgICBpZiAoY2luZm8tPkFsICE9IGNpbmZvLT5BaC0xKQotICAgICAgYmFkID0gVFJVRTsKLSAgfQotICBpZiAoY2luZm8tPkFsID4gMTMpCQkvKiBuZWVkIG5vdCBjaGVjayBmb3IgPCAwICovCi0gICAgYmFkID0gVFJVRTsKLSAgLyogQXJndWFibHkgdGhlIG1heGltdW0gQWwgdmFsdWUgc2hvdWxkIGJlIGxlc3MgdGhhbiAxMyBmb3IgOC1iaXQgcHJlY2lzaW9uLAotICAgKiBidXQgdGhlIHNwZWMgZG9lc24ndCBzYXkgc28sIGFuZCB3ZSB0cnkgdG8gYmUgbGliZXJhbCBhYm91dCB3aGF0IHdlCi0gICAqIGFjY2VwdC4gIE5vdGU6IGxhcmdlIEFsIHZhbHVlcyBjb3VsZCByZXN1bHQgaW4gb3V0LW9mLXJhbmdlIERDCi0gICAqIGNvZWZmaWNpZW50cyBkdXJpbmcgZWFybHkgc2NhbnMsIGxlYWRpbmcgdG8gYml6YXJyZSBkaXNwbGF5cyBkdWUgdG8KLSAgICogb3ZlcmZsb3dzIGluIHRoZSBJRENUIG1hdGguICBCdXQgd2Ugd29uJ3QgY3Jhc2guCi0gICAqLwotICBpZiAoYmFkKQotICAgIEVSUkVYSVQ0KGNpbmZvLCBKRVJSX0JBRF9QUk9HUkVTU0lPTiwKLQkgICAgIGNpbmZvLT5TcywgY2luZm8tPlNlLCBjaW5mby0+QWgsIGNpbmZvLT5BbCk7Ci0gIC8qIFVwZGF0ZSBwcm9ncmVzc2lvbiBzdGF0dXMsIGFuZCB2ZXJpZnkgdGhhdCBzY2FuIG9yZGVyIGlzIGxlZ2FsLgotICAgKiBOb3RlIHRoYXQgaW50ZXItc2NhbiBpbmNvbnNpc3RlbmNpZXMgYXJlIHRyZWF0ZWQgYXMgd2FybmluZ3MKLSAgICogbm90IGZhdGFsIGVycm9ycyAuLi4gbm90IGNsZWFyIGlmIHRoaXMgaXMgcmlnaHQgd2F5IHRvIGJlaGF2ZS4KLSAgICovCi0gIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0gICAgaW50IGNpbmRleCA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXS0+Y29tcG9uZW50X2luZGV4OwotICAgIGNvZWZfYml0X3B0ciA9ICYgY2luZm8tPmNvZWZfYml0c1tjaW5kZXhdWzBdOwotICAgIGlmICghaXNfRENfYmFuZCAmJiBjb2VmX2JpdF9wdHJbMF0gPCAwKSAvKiBBQyB3aXRob3V0IHByaW9yIERDIHNjYW4gKi8KLSAgICAgIFdBUk5NUzIoY2luZm8sIEpXUk5fQk9HVVNfUFJPR1JFU1NJT04sIGNpbmRleCwgMCk7Ci0gICAgZm9yIChjb2VmaSA9IGNpbmZvLT5TczsgY29lZmkgPD0gY2luZm8tPlNlOyBjb2VmaSsrKSB7Ci0gICAgICBpbnQgZXhwZWN0ZWQgPSAoY29lZl9iaXRfcHRyW2NvZWZpXSA8IDApID8gMCA6IGNvZWZfYml0X3B0cltjb2VmaV07Ci0gICAgICBpZiAoY2luZm8tPkFoICE9IGV4cGVjdGVkKQotCVdBUk5NUzIoY2luZm8sIEpXUk5fQk9HVVNfUFJPR1JFU1NJT04sIGNpbmRleCwgY29lZmkpOwotICAgICAgY29lZl9iaXRfcHRyW2NvZWZpXSA9IGNpbmZvLT5BbDsKLSAgICB9Ci0gIH0KLQotICAvKiBTZWxlY3QgTUNVIGRlY29kaW5nIHJvdXRpbmUgKi8KLSAgaWYgKGNpbmZvLT5BaCA9PSAwKSB7Ci0gICAgaWYgKGlzX0RDX2JhbmQpCi0gICAgICBlbnRyb3B5LT5wdWIuZGVjb2RlX21jdSA9IGRlY29kZV9tY3VfRENfZmlyc3Q7Ci0gICAgZWxzZQotICAgICAgZW50cm9weS0+cHViLmRlY29kZV9tY3UgPSBkZWNvZGVfbWN1X0FDX2ZpcnN0OwotICB9IGVsc2UgewotICAgIGlmIChpc19EQ19iYW5kKQotICAgICAgZW50cm9weS0+cHViLmRlY29kZV9tY3UgPSBkZWNvZGVfbWN1X0RDX3JlZmluZTsKLSAgICBlbHNlCi0gICAgICBlbnRyb3B5LT5wdWIuZGVjb2RlX21jdSA9IGRlY29kZV9tY3VfQUNfcmVmaW5lOwotICB9Ci0KLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIC8qIE1ha2Ugc3VyZSByZXF1ZXN0ZWQgdGFibGVzIGFyZSBwcmVzZW50LCBhbmQgY29tcHV0ZSBkZXJpdmVkIHRhYmxlcy4KLSAgICAgKiBXZSBtYXkgYnVpbGQgc2FtZSBkZXJpdmVkIHRhYmxlIG1vcmUgdGhhbiBvbmNlLCBidXQgaXQncyBub3QgZXhwZW5zaXZlLgotICAgICAqLwotICAgIGlmIChpc19EQ19iYW5kKSB7Ci0gICAgICBpZiAoY2luZm8tPkFoID09IDApIHsJLyogREMgcmVmaW5lbWVudCBuZWVkcyBubyB0YWJsZSAqLwotCXRibCA9IGNvbXBwdHItPmRjX3RibF9ubzsKLQlqcGVnX21ha2VfZF9kZXJpdmVkX3RibChjaW5mbywgVFJVRSwgdGJsLAotCQkJCSYgZW50cm9weS0+ZGVyaXZlZF90YmxzW3RibF0pOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICB0YmwgPSBjb21wcHRyLT5hY190Ymxfbm87Ci0gICAgICBqcGVnX21ha2VfZF9kZXJpdmVkX3RibChjaW5mbywgRkFMU0UsIHRibCwKLQkJCSAgICAgICYgZW50cm9weS0+ZGVyaXZlZF90YmxzW3RibF0pOwotICAgICAgLyogcmVtZW1iZXIgdGhlIHNpbmdsZSBhY3RpdmUgdGFibGUgKi8KLSAgICAgIGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsID0gZW50cm9weS0+ZGVyaXZlZF90YmxzW3RibF07Ci0gICAgfQotICAgIC8qIEluaXRpYWxpemUgREMgcHJlZGljdGlvbnMgdG8gMCAqLwotICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IDA7Ci0gIH0KLQotICAvKiBJbml0aWFsaXplIGJpdHJlYWQgc3RhdGUgdmFyaWFibGVzICovCi0gIGVudHJvcHktPmJpdHN0YXRlLmJpdHNfbGVmdCA9IDA7Ci0gIGVudHJvcHktPmJpdHN0YXRlLmdldF9idWZmZXIgPSAwOyAvKiB1bm5lY2Vzc2FyeSwgYnV0IGtlZXBzIFB1cmlmeSBxdWlldCAqLwotICBlbnRyb3B5LT5wdWIuaW5zdWZmaWNpZW50X2RhdGEgPSBGQUxTRTsKLQotICAvKiBJbml0aWFsaXplIHByaXZhdGUgc3RhdGUgdmFyaWFibGVzICovCi0gIGVudHJvcHktPnNhdmVkLkVPQlJVTiA9IDA7Ci0KLSAgLyogSW5pdGlhbGl6ZSByZXN0YXJ0IGNvdW50ZXIgKi8KLSAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKLX0KLQotCi0vKgotICogRmlndXJlIEYuMTI6IGV4dGVuZCBzaWduIGJpdC4KLSAqIE9uIHNvbWUgbWFjaGluZXMsIGEgc2hpZnQgYW5kIGFkZCB3aWxsIGJlIGZhc3RlciB0aGFuIGEgdGFibGUgbG9va3VwLgotICovCi0KLSNpZmRlZiBBVk9JRF9UQUJMRVMKLQotI2RlZmluZSBIVUZGX0VYVEVORCh4LHMpICAoKHgpIDwgKDE8PCgocyktMSkpID8gKHgpICsgKCgoLTEpPDwocykpICsgMSkgOiAoeCkpCi0KLSNlbHNlCi0KLSNkZWZpbmUgSFVGRl9FWFRFTkQoeCxzKSAgKCh4KSA8IGV4dGVuZF90ZXN0W3NdID8gKHgpICsgZXh0ZW5kX29mZnNldFtzXSA6ICh4KSkKLQotc3RhdGljIGNvbnN0IGludCBleHRlbmRfdGVzdFsxNl0gPSAgIC8qIGVudHJ5IG4gaXMgMioqKG4tMSkgKi8KLSAgeyAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDA0LCAweDAwMDgsIDB4MDAxMCwgMHgwMDIwLCAweDAwNDAsIDB4MDA4MCwKLSAgICAweDAxMDAsIDB4MDIwMCwgMHgwNDAwLCAweDA4MDAsIDB4MTAwMCwgMHgyMDAwLCAweDQwMDAgfTsKLQotc3RhdGljIGNvbnN0IGludCBleHRlbmRfb2Zmc2V0WzE2XSA9IC8qIGVudHJ5IG4gaXMgKC0xIDw8IG4pICsgMSAqLwotICB7IDAsICgoLTEpPDwxKSArIDEsICgoLTEpPDwyKSArIDEsICgoLTEpPDwzKSArIDEsICgoLTEpPDw0KSArIDEsCi0gICAgKCgtMSk8PDUpICsgMSwgKCgtMSk8PDYpICsgMSwgKCgtMSk8PDcpICsgMSwgKCgtMSk8PDgpICsgMSwKLSAgICAoKC0xKTw8OSkgKyAxLCAoKC0xKTw8MTApICsgMSwgKCgtMSk8PDExKSArIDEsICgoLTEpPDwxMikgKyAxLAotICAgICgoLTEpPDwxMykgKyAxLCAoKC0xKTw8MTQpICsgMSwgKCgtMSk8PDE1KSArIDEgfTsKLQotI2VuZGlmIC8qIEFWT0lEX1RBQkxFUyAqLwotCi0KLS8qCi0gKiBDaGVjayBmb3IgYSByZXN0YXJ0IG1hcmtlciAmIHJlc3luY2hyb25pemUgZGVjb2Rlci4KLSAqIFJldHVybnMgRkFMU0UgaWYgbXVzdCBzdXNwZW5kLgotICovCi0KLUxPQ0FMKGJvb2xlYW4pCi1wcm9jZXNzX3Jlc3RhcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICBpbnQgY2k7Ci0KLSAgLyogVGhyb3cgYXdheSBhbnkgdW51c2VkIGJpdHMgcmVtYWluaW5nIGluIGJpdCBidWZmZXI7ICovCi0gIC8qIGluY2x1ZGUgYW55IGZ1bGwgYnl0ZXMgaW4gbmV4dF9tYXJrZXIncyBjb3VudCBvZiBkaXNjYXJkZWQgYnl0ZXMgKi8KLSAgY2luZm8tPm1hcmtlci0+ZGlzY2FyZGVkX2J5dGVzICs9IGVudHJvcHktPmJpdHN0YXRlLmJpdHNfbGVmdCAvIDg7Ci0gIGVudHJvcHktPmJpdHN0YXRlLmJpdHNfbGVmdCA9IDA7Ci0KLSAgLyogQWR2YW5jZSBwYXN0IHRoZSBSU1RuIG1hcmtlciAqLwotICBpZiAoISAoKmNpbmZvLT5tYXJrZXItPnJlYWRfcmVzdGFydF9tYXJrZXIpIChjaW5mbykpCi0gICAgcmV0dXJuIEZBTFNFOwotCi0gIC8qIFJlLWluaXRpYWxpemUgREMgcHJlZGljdGlvbnMgdG8gMCAqLwotICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykKLSAgICBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSAwOwotICAvKiBSZS1pbml0IEVPQiBydW4gY291bnQsIHRvbyAqLwotICBlbnRyb3B5LT5zYXZlZC5FT0JSVU4gPSAwOwotCi0gIC8qIFJlc2V0IHJlc3RhcnQgY291bnRlciAqLwotICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOwotCi0gIC8qIFJlc2V0IG91dC1vZi1kYXRhIGZsYWcsIHVubGVzcyByZWFkX3Jlc3RhcnRfbWFya2VyIGxlZnQgdXMgc21hY2sgdXAKLSAgICogYWdhaW5zdCBhIG1hcmtlci4gIEluIHRoYXQgY2FzZSB3ZSB3aWxsIGVuZCB1cCB0cmVhdGluZyB0aGUgbmV4dCBkYXRhCi0gICAqIHNlZ21lbnQgYXMgZW1wdHksIGFuZCB3ZSBjYW4gYXZvaWQgcHJvZHVjaW5nIGJvZ3VzIG91dHB1dCBwaXhlbHMgYnkKLSAgICogbGVhdmluZyB0aGUgZmxhZyBzZXQuCi0gICAqLwotICBpZiAoY2luZm8tPnVucmVhZF9tYXJrZXIgPT0gMCkKLSAgICBlbnRyb3B5LT5wdWIuaW5zdWZmaWNpZW50X2RhdGEgPSBGQUxTRTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogSHVmZm1hbiBNQ1UgZGVjb2RpbmcuCi0gKiBFYWNoIG9mIHRoZXNlIHJvdXRpbmVzIGRlY29kZXMgYW5kIHJldHVybnMgb25lIE1DVSdzIHdvcnRoIG9mCi0gKiBIdWZmbWFuLWNvbXByZXNzZWQgY29lZmZpY2llbnRzLiAKLSAqIFRoZSBjb2VmZmljaWVudHMgYXJlIHJlb3JkZXJlZCBmcm9tIHppZ3phZyBvcmRlciBpbnRvIG5hdHVyYWwgYXJyYXkgb3JkZXIsCi0gKiBidXQgYXJlIG5vdCBkZXF1YW50aXplZC4KLSAqCi0gKiBUaGUgaSd0aCBibG9jayBvZiB0aGUgTUNVIGlzIHN0b3JlZCBpbnRvIHRoZSBibG9jayBwb2ludGVkIHRvIGJ5Ci0gKiBNQ1VfZGF0YVtpXS4gIFdFIEFTU1VNRSBUSElTIEFSRUEgSVMgSU5JVElBTExZIFpFUk9FRCBCWSBUSEUgQ0FMTEVSLgotICoKLSAqIFdlIHJldHVybiBGQUxTRSBpZiBkYXRhIHNvdXJjZSByZXF1ZXN0ZWQgc3VzcGVuc2lvbi4gIEluIHRoYXQgY2FzZSBubwotICogY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0byBwZXJtYW5lbnQgc3RhdGUuICAoRXhjZXB0aW9uOiBzb21lIG91dHB1dAotICogY29lZmZpY2llbnRzIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBhc3NpZ25lZC4gIFRoaXMgaXMgaGFybWxlc3MgZm9yCi0gKiBzcGVjdHJhbCBzZWxlY3Rpb24sIHNpbmNlIHdlJ2xsIGp1c3QgcmUtYXNzaWduIHRoZW0gb24gdGhlIG5leHQgY2FsbC4KLSAqIFN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiBBQyByZWZpbmVtZW50IGhhcyB0byBiZSBtb3JlIGNhcmVmdWwsIGhvd2V2ZXIuKQotICovCi0KLS8qCi0gKiBNQ1UgZGVjb2RpbmcgZm9yIERDIGluaXRpYWwgc2NhbiAoZWl0aGVyIHNwZWN0cmFsIHNlbGVjdGlvbiwKLSAqIG9yIGZpcnN0IHBhc3Mgb2Ygc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uKS4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLWRlY29kZV9tY3VfRENfZmlyc3QgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCi17ICAgCi0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICBpbnQgQWwgPSBjaW5mby0+QWw7Ci0gIHJlZ2lzdGVyIGludCBzLCByOwotICBpbnQgYmxrbiwgY2k7Ci0gIEpCTE9DS1JPVyBibG9jazsKLSAgQklUUkVBRF9TVEFURV9WQVJTOwotICBzYXZhYmxlX3N0YXRlIHN0YXRlOwotICBkX2Rlcml2ZWRfdGJsICogdGJsOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLQotICAvKiBQcm9jZXNzIHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZDsgbWF5IGhhdmUgdG8gc3VzcGVuZCAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKLSAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKLSAgICAgIGlmICghIHByb2Nlc3NfcmVzdGFydChjaW5mbykpCi0JcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgLyogSWYgd2UndmUgcnVuIG91dCBvZiBkYXRhLCBqdXN0IGxlYXZlIHRoZSBNQ1Ugc2V0IHRvIHplcm9lcy4KLSAgICogVGhpcyB3YXksIHdlIHJldHVybiB1bmlmb3JtIGdyYXkgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHNlZ21lbnQuCi0gICAqLwotICBpZiAoISBlbnRyb3B5LT5wdWIuaW5zdWZmaWNpZW50X2RhdGEpIHsKLQotICAgIC8qIExvYWQgdXAgd29ya2luZyBzdGF0ZSAqLwotICAgIEJJVFJFQURfTE9BRF9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7Ci0gICAgQVNTSUdOX1NUQVRFKHN0YXRlLCBlbnRyb3B5LT5zYXZlZCk7Ci0KLSAgICAvKiBPdXRlciBsb29wIGhhbmRsZXMgZWFjaCBibG9jayBpbiB0aGUgTUNVICovCi0KLSAgICBmb3IgKGJsa24gPSAwOyBibGtuIDwgY2luZm8tPmJsb2Nrc19pbl9NQ1U7IGJsa24rKykgewotICAgICAgYmxvY2sgPSBNQ1VfZGF0YVtibGtuXTsKLSAgICAgIGNpID0gY2luZm8tPk1DVV9tZW1iZXJzaGlwW2Jsa25dOwotICAgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLSAgICAgIHRibCA9IGVudHJvcHktPmRlcml2ZWRfdGJsc1tjb21wcHRyLT5kY190Ymxfbm9dOwotCi0gICAgICAvKiBEZWNvZGUgYSBzaW5nbGUgYmxvY2sncyB3b3J0aCBvZiBjb2VmZmljaWVudHMgKi8KLQotICAgICAgLyogU2VjdGlvbiBGLjIuMi4xOiBkZWNvZGUgdGhlIERDIGNvZWZmaWNpZW50IGRpZmZlcmVuY2UgKi8KLSAgICAgIEhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCB0YmwsIHJldHVybiBGQUxTRSwgbGFiZWwxKTsKLSAgICAgIGlmIChzKSB7Ci0JQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgcywgcmV0dXJuIEZBTFNFKTsKLQlyID0gR0VUX0JJVFMocyk7Ci0JcyA9IEhVRkZfRVhURU5EKHIsIHMpOwotICAgICAgfQotCi0gICAgICAvKiBDb252ZXJ0IERDIGRpZmZlcmVuY2UgdG8gYWN0dWFsIHZhbHVlLCB1cGRhdGUgbGFzdF9kY192YWwgKi8KLSAgICAgIHMgKz0gc3RhdGUubGFzdF9kY192YWxbY2ldOwotICAgICAgc3RhdGUubGFzdF9kY192YWxbY2ldID0gczsKLSAgICAgIC8qIFNjYWxlIGFuZCBvdXRwdXQgdGhlIGNvZWZmaWNpZW50IChhc3N1bWVzIGpwZWdfbmF0dXJhbF9vcmRlclswXT0wKSAqLwotICAgICAgKCpibG9jaylbMF0gPSAoSkNPRUYpIChzIDw8IEFsKTsKLSAgICB9Ci0KLSAgICAvKiBDb21wbGV0ZWQgTUNVLCBzbyB1cGRhdGUgc3RhdGUgKi8KLSAgICBCSVRSRUFEX1NBVkVfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOwotICAgIEFTU0lHTl9TVEFURShlbnRyb3B5LT5zYXZlZCwgc3RhdGUpOwotICB9Ci0KLSAgLyogQWNjb3VudCBmb3IgcmVzdGFydCBpbnRlcnZhbCAobm8tb3AgaWYgbm90IHVzaW5nIHJlc3RhcnRzKSAqLwotICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBNQ1UgZGVjb2RpbmcgZm9yIEFDIGluaXRpYWwgc2NhbiAoZWl0aGVyIHNwZWN0cmFsIHNlbGVjdGlvbiwKLSAqIG9yIGZpcnN0IHBhc3Mgb2Ygc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uKS4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLWRlY29kZV9tY3VfQUNfZmlyc3QgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCi17ICAgCi0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICBpbnQgU2UgPSBjaW5mby0+U2U7Ci0gIGludCBBbCA9IGNpbmZvLT5BbDsKLSAgcmVnaXN0ZXIgaW50IHMsIGssIHI7Ci0gIHVuc2lnbmVkIGludCBFT0JSVU47Ci0gIEpCTE9DS1JPVyBibG9jazsKLSAgQklUUkVBRF9TVEFURV9WQVJTOwotICBkX2Rlcml2ZWRfdGJsICogdGJsOwotCi0gIC8qIFByb2Nlc3MgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkOyBtYXkgaGF2ZSB0byBzdXNwZW5kICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgewotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQotICAgICAgaWYgKCEgcHJvY2Vzc19yZXN0YXJ0KGNpbmZvKSkKLQlyZXR1cm4gRkFMU0U7Ci0gIH0KLQotICAvKiBJZiB3ZSd2ZSBydW4gb3V0IG9mIGRhdGEsIGp1c3QgbGVhdmUgdGhlIE1DVSBzZXQgdG8gemVyb2VzLgotICAgKiBUaGlzIHdheSwgd2UgcmV0dXJuIHVuaWZvcm0gZ3JheSBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgc2VnbWVudC4KLSAgICovCi0gIGlmICghIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSkgewotCi0gICAgLyogTG9hZCB1cCB3b3JraW5nIHN0YXRlLgotICAgICAqIFdlIGNhbiBhdm9pZCBsb2FkaW5nL3NhdmluZyBiaXRyZWFkIHN0YXRlIGlmIGluIGFuIEVPQiBydW4uCi0gICAgICovCi0gICAgRU9CUlVOID0gZW50cm9weS0+c2F2ZWQuRU9CUlVOOwkvKiBvbmx5IHBhcnQgb2Ygc2F2ZWQgc3RhdGUgd2UgbmVlZCAqLwotCi0gICAgLyogVGhlcmUgaXMgYWx3YXlzIG9ubHkgb25lIGJsb2NrIHBlciBNQ1UgKi8KLQotICAgIGlmIChFT0JSVU4gPiAwKQkJLyogaWYgaXQncyBhIGJhbmQgb2YgemVyb2VzLi4uICovCi0gICAgICBFT0JSVU4tLTsJCQkvKiAuLi5wcm9jZXNzIGl0IG5vdyAod2UgZG8gbm90aGluZykgKi8KLSAgICBlbHNlIHsKLSAgICAgIEJJVFJFQURfTE9BRF9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7Ci0gICAgICBibG9jayA9IE1DVV9kYXRhWzBdOwotICAgICAgdGJsID0gZW50cm9weS0+YWNfZGVyaXZlZF90Ymw7Ci0KLSAgICAgIGZvciAoayA9IGNpbmZvLT5TczsgayA8PSBTZTsgaysrKSB7Ci0JSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIHRibCwgcmV0dXJuIEZBTFNFLCBsYWJlbDIpOwotCXIgPSBzID4+IDQ7Ci0JcyAmPSAxNTsKLQlpZiAocykgewotCSAgayArPSByOwotCSAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgcywgcmV0dXJuIEZBTFNFKTsKLQkgIHIgPSBHRVRfQklUUyhzKTsKLQkgIHMgPSBIVUZGX0VYVEVORChyLCBzKTsKLQkgIC8qIFNjYWxlIGFuZCBvdXRwdXQgY29lZmZpY2llbnQgaW4gbmF0dXJhbCAoZGV6aWd6YWdnZWQpIG9yZGVyICovCi0JICAoKmJsb2NrKVtqcGVnX25hdHVyYWxfb3JkZXJba11dID0gKEpDT0VGKSAocyA8PCBBbCk7Ci0JfSBlbHNlIHsKLQkgIGlmIChyID09IDE1KSB7CS8qIFpSTCAqLwotCSAgICBrICs9IDE1OwkJLyogc2tpcCAxNSB6ZXJvZXMgaW4gYmFuZCAqLwotCSAgfSBlbHNlIHsJCS8qIEVPQnIsIHJ1biBsZW5ndGggaXMgMl5yICsgYXBwZW5kZWQgYml0cyAqLwotCSAgICBFT0JSVU4gPSAxIDw8IHI7Ci0JICAgIGlmIChyKSB7CQkvKiBFT0JyLCByID4gMCAqLwotCSAgICAgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHIsIHJldHVybiBGQUxTRSk7Ci0JICAgICAgciA9IEdFVF9CSVRTKHIpOwotCSAgICAgIEVPQlJVTiArPSByOwotCSAgICB9Ci0JICAgIEVPQlJVTi0tOwkJLyogdGhpcyBiYW5kIGlzIHByb2Nlc3NlZCBhdCB0aGlzIG1vbWVudCAqLwotCSAgICBicmVhazsJCS8qIGZvcmNlIGVuZC1vZi1iYW5kICovCi0JICB9Ci0JfQotICAgICAgfQotCi0gICAgICBCSVRSRUFEX1NBVkVfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOwotICAgIH0KLQotICAgIC8qIENvbXBsZXRlZCBNQ1UsIHNvIHVwZGF0ZSBzdGF0ZSAqLwotICAgIGVudHJvcHktPnNhdmVkLkVPQlJVTiA9IEVPQlJVTjsJLyogb25seSBwYXJ0IG9mIHNhdmVkIHN0YXRlIHdlIG5lZWQgKi8KLSAgfQotCi0gIC8qIEFjY291bnQgZm9yIHJlc3RhcnQgaW50ZXJ2YWwgKG5vLW9wIGlmIG5vdCB1c2luZyByZXN0YXJ0cykgKi8KLSAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogTUNVIGRlY29kaW5nIGZvciBEQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuLgotICogTm90ZTogd2UgYXNzdW1lIHN1Y2ggc2NhbnMgY2FuIGJlIG11bHRpLWNvbXBvbmVudCwgYWx0aG91Z2ggdGhlIHNwZWMKLSAqIGlzIG5vdCB2ZXJ5IGNsZWFyIG9uIHRoZSBwb2ludC4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLWRlY29kZV9tY3VfRENfcmVmaW5lIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoteyAgIAotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgaW50IHAxID0gMSA8PCBjaW5mby0+QWw7CS8qIDEgaW4gdGhlIGJpdCBwb3NpdGlvbiBiZWluZyBjb2RlZCAqLwotICBpbnQgYmxrbjsKLSAgSkJMT0NLUk9XIGJsb2NrOwotICBCSVRSRUFEX1NUQVRFX1ZBUlM7Ci0KLSAgLyogUHJvY2VzcyByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQ7IG1heSBoYXZlIHRvIHN1c3BlbmQgKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7Ci0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCi0gICAgICBpZiAoISBwcm9jZXNzX3Jlc3RhcnQoY2luZm8pKQotCXJldHVybiBGQUxTRTsKLSAgfQotCi0gIC8qIE5vdCB3b3J0aCB0aGUgY3ljbGVzIHRvIGNoZWNrIGluc3VmZmljaWVudF9kYXRhIGhlcmUsCi0gICAqIHNpbmNlIHdlIHdpbGwgbm90IGNoYW5nZSB0aGUgZGF0YSBhbnl3YXkgaWYgd2UgcmVhZCB6ZXJvZXMuCi0gICAqLwotCi0gIC8qIExvYWQgdXAgd29ya2luZyBzdGF0ZSAqLwotICBCSVRSRUFEX0xPQURfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOwotCi0gIC8qIE91dGVyIGxvb3AgaGFuZGxlcyBlYWNoIGJsb2NrIGluIHRoZSBNQ1UgKi8KLQotICBmb3IgKGJsa24gPSAwOyBibGtuIDwgY2luZm8tPmJsb2Nrc19pbl9NQ1U7IGJsa24rKykgewotICAgIGJsb2NrID0gTUNVX2RhdGFbYmxrbl07Ci0KLSAgICAvKiBFbmNvZGVkIGRhdGEgaXMgc2ltcGx5IHRoZSBuZXh0IGJpdCBvZiB0aGUgdHdvJ3MtY29tcGxlbWVudCBEQyB2YWx1ZSAqLwotICAgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIDEsIHJldHVybiBGQUxTRSk7Ci0gICAgaWYgKEdFVF9CSVRTKDEpKQotICAgICAgKCpibG9jaylbMF0gfD0gcDE7Ci0gICAgLyogTm90ZTogc2luY2Ugd2UgdXNlIHw9LCByZXBlYXRpbmcgdGhlIGFzc2lnbm1lbnQgbGF0ZXIgaXMgc2FmZSAqLwotICB9Ci0KLSAgLyogQ29tcGxldGVkIE1DVSwgc28gdXBkYXRlIHN0YXRlICovCi0gIEJJVFJFQURfU0FWRV9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7Ci0KLSAgLyogQWNjb3VudCBmb3IgcmVzdGFydCBpbnRlcnZhbCAobm8tb3AgaWYgbm90IHVzaW5nIHJlc3RhcnRzKSAqLwotICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBNQ1UgZGVjb2RpbmcgZm9yIEFDIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiByZWZpbmVtZW50IHNjYW4uCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1kZWNvZGVfbWN1X0FDX3JlZmluZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKLXsgICAKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIGludCBTZSA9IGNpbmZvLT5TZTsKLSAgaW50IHAxID0gMSA8PCBjaW5mby0+QWw7CS8qIDEgaW4gdGhlIGJpdCBwb3NpdGlvbiBiZWluZyBjb2RlZCAqLwotICBpbnQgbTEgPSAoLTEpIDw8IGNpbmZvLT5BbDsJLyogLTEgaW4gdGhlIGJpdCBwb3NpdGlvbiBiZWluZyBjb2RlZCAqLwotICByZWdpc3RlciBpbnQgcywgaywgcjsKLSAgdW5zaWduZWQgaW50IEVPQlJVTjsKLSAgSkJMT0NLUk9XIGJsb2NrOwotICBKQ09FRlBUUiB0aGlzY29lZjsKLSAgQklUUkVBRF9TVEFURV9WQVJTOwotICBkX2Rlcml2ZWRfdGJsICogdGJsOwotICBpbnQgbnVtX25ld256OwotICBpbnQgbmV3bnpfcG9zW0RDVFNJWkUyXTsKLQotICAvKiBQcm9jZXNzIHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZDsgbWF5IGhhdmUgdG8gc3VzcGVuZCAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKLSAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKLSAgICAgIGlmICghIHByb2Nlc3NfcmVzdGFydChjaW5mbykpCi0JcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgLyogSWYgd2UndmUgcnVuIG91dCBvZiBkYXRhLCBkb24ndCBtb2RpZnkgdGhlIE1DVS4KLSAgICovCi0gIGlmICghIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSkgewotCi0gICAgLyogTG9hZCB1cCB3b3JraW5nIHN0YXRlICovCi0gICAgQklUUkVBRF9MT0FEX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKLSAgICBFT0JSVU4gPSBlbnRyb3B5LT5zYXZlZC5FT0JSVU47IC8qIG9ubHkgcGFydCBvZiBzYXZlZCBzdGF0ZSB3ZSBuZWVkICovCi0KLSAgICAvKiBUaGVyZSBpcyBhbHdheXMgb25seSBvbmUgYmxvY2sgcGVyIE1DVSAqLwotICAgIGJsb2NrID0gTUNVX2RhdGFbMF07Ci0gICAgdGJsID0gZW50cm9weS0+YWNfZGVyaXZlZF90Ymw7Ci0KLSAgICAvKiBJZiB3ZSBhcmUgZm9yY2VkIHRvIHN1c3BlbmQsIHdlIG11c3QgdW5kbyB0aGUgYXNzaWdubWVudHMgdG8gYW55IG5ld2x5Ci0gICAgICogbm9uemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGJsb2NrLCBiZWNhdXNlIG90aGVyd2lzZSB3ZSdkIGdldCBjb25mdXNlZAotICAgICAqIG5leHQgdGltZSBhYm91dCB3aGljaCBjb2VmZmljaWVudHMgd2VyZSBhbHJlYWR5IG5vbnplcm8uCi0gICAgICogQnV0IHdlIG5lZWQgbm90IHVuZG8gYWRkaXRpb24gb2YgYml0cyB0byBhbHJlYWR5LW5vbnplcm8gY29lZmZpY2llbnRzOwotICAgICAqIGluc3RlYWQsIHdlIGNhbiB0ZXN0IHRoZSBjdXJyZW50IGJpdCB0byBzZWUgaWYgd2UgYWxyZWFkeSBkaWQgaXQuCi0gICAgICovCi0gICAgbnVtX25ld256ID0gMDsKLQotICAgIC8qIGluaXRpYWxpemUgY29lZmZpY2llbnQgbG9vcCBjb3VudGVyIHRvIHN0YXJ0IG9mIGJhbmQgKi8KLSAgICBrID0gY2luZm8tPlNzOwotCi0gICAgaWYgKEVPQlJVTiA9PSAwKSB7Ci0gICAgICBmb3IgKDsgayA8PSBTZTsgaysrKSB7Ci0JSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIHRibCwgZ290byB1bmRvaXQsIGxhYmVsMyk7Ci0JciA9IHMgPj4gNDsKLQlzICY9IDE1OwotCWlmIChzKSB7Ci0JICBpZiAocyAhPSAxKQkJLyogc2l6ZSBvZiBuZXcgY29lZiBzaG91bGQgYWx3YXlzIGJlIDEgKi8KLQkgICAgV0FSTk1TKGNpbmZvLCBKV1JOX0hVRkZfQkFEX0NPREUpOwotCSAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgMSwgZ290byB1bmRvaXQpOwotCSAgaWYgKEdFVF9CSVRTKDEpKQotCSAgICBzID0gcDE7CQkvKiBuZXdseSBub256ZXJvIGNvZWYgaXMgcG9zaXRpdmUgKi8KLQkgIGVsc2UKLQkgICAgcyA9IG0xOwkJLyogbmV3bHkgbm9uemVybyBjb2VmIGlzIG5lZ2F0aXZlICovCi0JfSBlbHNlIHsKLQkgIGlmIChyICE9IDE1KSB7Ci0JICAgIEVPQlJVTiA9IDEgPDwgcjsJLyogRU9CciwgcnVuIGxlbmd0aCBpcyAyXnIgKyBhcHBlbmRlZCBiaXRzICovCi0JICAgIGlmIChyKSB7Ci0JICAgICAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgciwgZ290byB1bmRvaXQpOwotCSAgICAgIHIgPSBHRVRfQklUUyhyKTsKLQkgICAgICBFT0JSVU4gKz0gcjsKLQkgICAgfQotCSAgICBicmVhazsJCS8qIHJlc3Qgb2YgYmxvY2sgaXMgaGFuZGxlZCBieSBFT0IgbG9naWMgKi8KLQkgIH0KLQkgIC8qIG5vdGUgcyA9IDAgZm9yIHByb2Nlc3NpbmcgWlJMICovCi0JfQotCS8qIEFkdmFuY2Ugb3ZlciBhbHJlYWR5LW5vbnplcm8gY29lZnMgYW5kIHIgc3RpbGwtemVybyBjb2VmcywKLQkgKiBhcHBlbmRpbmcgY29ycmVjdGlvbiBiaXRzIHRvIHRoZSBub256ZXJvZXMuICBBIGNvcnJlY3Rpb24gYml0IGlzIDEKLQkgKiBpZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGNvZWZmaWNpZW50IG11c3QgYmUgaW5jcmVhc2VkLgotCSAqLwotCWRvIHsKLQkgIHRoaXNjb2VmID0gKmJsb2NrICsganBlZ19uYXR1cmFsX29yZGVyW2tdOwotCSAgaWYgKCp0aGlzY29lZiAhPSAwKSB7Ci0JICAgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIDEsIGdvdG8gdW5kb2l0KTsKLQkgICAgaWYgKEdFVF9CSVRTKDEpKSB7Ci0JICAgICAgaWYgKCgqdGhpc2NvZWYgJiBwMSkgPT0gMCkgeyAvKiBkbyBub3RoaW5nIGlmIGFscmVhZHkgc2V0IGl0ICovCi0JCWlmICgqdGhpc2NvZWYgPj0gMCkKLQkJICAqdGhpc2NvZWYgKz0gcDE7Ci0JCWVsc2UKLQkJICAqdGhpc2NvZWYgKz0gbTE7Ci0JICAgICAgfQotCSAgICB9Ci0JICB9IGVsc2UgewotCSAgICBpZiAoLS1yIDwgMCkKLQkgICAgICBicmVhazsJCS8qIHJlYWNoZWQgdGFyZ2V0IHplcm8gY29lZmZpY2llbnQgKi8KLQkgIH0KLQkgIGsrKzsKLQl9IHdoaWxlIChrIDw9IFNlKTsKLQlpZiAocykgewotCSAgaW50IHBvcyA9IGpwZWdfbmF0dXJhbF9vcmRlcltrXTsKLQkgIC8qIE91dHB1dCBuZXdseSBub256ZXJvIGNvZWZmaWNpZW50ICovCi0JICAoKmJsb2NrKVtwb3NdID0gKEpDT0VGKSBzOwotCSAgLyogUmVtZW1iZXIgaXRzIHBvc2l0aW9uIGluIGNhc2Ugd2UgaGF2ZSB0byBzdXNwZW5kICovCi0JICBuZXduel9wb3NbbnVtX25ld256KytdID0gcG9zOwotCX0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoRU9CUlVOID4gMCkgewotICAgICAgLyogU2NhbiBhbnkgcmVtYWluaW5nIGNvZWZmaWNpZW50IHBvc2l0aW9ucyBhZnRlciB0aGUgZW5kLW9mLWJhbmQKLSAgICAgICAqICh0aGUgbGFzdCBuZXdseSBub256ZXJvIGNvZWZmaWNpZW50LCBpZiBhbnkpLiAgQXBwZW5kIGEgY29ycmVjdGlvbgotICAgICAgICogYml0IHRvIGVhY2ggYWxyZWFkeS1ub256ZXJvIGNvZWZmaWNpZW50LiAgQSBjb3JyZWN0aW9uIGJpdCBpcyAxCi0gICAgICAgKiBpZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGNvZWZmaWNpZW50IG11c3QgYmUgaW5jcmVhc2VkLgotICAgICAgICovCi0gICAgICBmb3IgKDsgayA8PSBTZTsgaysrKSB7Ci0JdGhpc2NvZWYgPSAqYmxvY2sgKyBqcGVnX25hdHVyYWxfb3JkZXJba107Ci0JaWYgKCp0aGlzY29lZiAhPSAwKSB7Ci0JICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCAxLCBnb3RvIHVuZG9pdCk7Ci0JICBpZiAoR0VUX0JJVFMoMSkpIHsKLQkgICAgaWYgKCgqdGhpc2NvZWYgJiBwMSkgPT0gMCkgeyAvKiBkbyBub3RoaW5nIGlmIGFscmVhZHkgY2hhbmdlZCBpdCAqLwotCSAgICAgIGlmICgqdGhpc2NvZWYgPj0gMCkKLQkJKnRoaXNjb2VmICs9IHAxOwotCSAgICAgIGVsc2UKLQkJKnRoaXNjb2VmICs9IG0xOwotCSAgICB9Ci0JICB9Ci0JfQotICAgICAgfQotICAgICAgLyogQ291bnQgb25lIGJsb2NrIGNvbXBsZXRlZCBpbiBFT0IgcnVuICovCi0gICAgICBFT0JSVU4tLTsKLSAgICB9Ci0KLSAgICAvKiBDb21wbGV0ZWQgTUNVLCBzbyB1cGRhdGUgc3RhdGUgKi8KLSAgICBCSVRSRUFEX1NBVkVfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOwotICAgIGVudHJvcHktPnNhdmVkLkVPQlJVTiA9IEVPQlJVTjsgLyogb25seSBwYXJ0IG9mIHNhdmVkIHN0YXRlIHdlIG5lZWQgKi8KLSAgfQotCi0gIC8qIEFjY291bnQgZm9yIHJlc3RhcnQgaW50ZXJ2YWwgKG5vLW9wIGlmIG5vdCB1c2luZyByZXN0YXJ0cykgKi8KLSAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKLQotICByZXR1cm4gVFJVRTsKLQotdW5kb2l0OgotICAvKiBSZS16ZXJvIGFueSBvdXRwdXQgY29lZmZpY2llbnRzIHRoYXQgd2UgbWFkZSBuZXdseSBub256ZXJvICovCi0gIHdoaWxlIChudW1fbmV3bnogPiAwKQotICAgICgqYmxvY2spW25ld256X3Bvc1stLW51bV9uZXduel1dID0gMDsKLQotICByZXR1cm4gRkFMU0U7Ci19Ci0KLQotLyoKLSAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciBwcm9ncmVzc2l2ZSBIdWZmbWFuIGVudHJvcHkgZGVjb2RpbmcuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9waHVmZl9kZWNvZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5OwotICBpbnQgKmNvZWZfYml0X3B0cjsKLSAgaW50IGNpLCBpOwotCi0gIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YocGh1ZmZfZW50cm9weV9kZWNvZGVyKSk7Ci0gIGNpbmZvLT5lbnRyb3B5ID0gKHN0cnVjdCBqcGVnX2VudHJvcHlfZGVjb2RlciAqKSBlbnRyb3B5OwotICBlbnRyb3B5LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfcGh1ZmZfZGVjb2RlcjsKLQotICAvKiBNYXJrIGRlcml2ZWQgdGFibGVzIHVuYWxsb2NhdGVkICovCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fSFVGRl9UQkxTOyBpKyspIHsKLSAgICBlbnRyb3B5LT5kZXJpdmVkX3RibHNbaV0gPSBOVUxMOwotICB9Ci0KLSAgLyogQ3JlYXRlIHByb2dyZXNzaW9uIHN0YXR1cyB0YWJsZSAqLwotICBjaW5mby0+Y29lZl9iaXRzID0gKGludCAoKilbRENUU0laRTJdKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJY2luZm8tPm51bV9jb21wb25lbnRzKkRDVFNJWkUyKlNJWkVPRihpbnQpKTsKLSAgY29lZl9iaXRfcHRyID0gJiBjaW5mby0+Y29lZl9iaXRzWzBdWzBdOwotICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIAotICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKQotICAgICAgKmNvZWZfYml0X3B0cisrID0gLTE7Ci19Ci0KLSNlbmRpZiAvKiBEX1BST0dSRVNTSVZFX1NVUFBPUlRFRCAqLwotCi0jZW5kaWYgLy9fRlhfSlBFR19UVVJCT18KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkcG9zdGN0LmMgYi9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZHBvc3RjdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2IxYjFiLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkcG9zdGN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotI2lmICFkZWZpbmVkKF9GWF9KUEVHX1RVUkJPXykKLS8qCi0gKiBqZHBvc3RjdC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY29tcHJlc3Npb24gcG9zdHByb2Nlc3NpbmcgY29udHJvbGxlci4KLSAqIFRoaXMgY29udHJvbGxlciBtYW5hZ2VzIHRoZSB1cHNhbXBsaW5nLCBjb2xvciBjb252ZXJzaW9uLCBhbmQgY29sb3IKLSAqIHF1YW50aXphdGlvbi9yZWR1Y3Rpb24gc3RlcHM7IHNwZWNpZmljYWxseSwgaXQgY29udHJvbHMgdGhlIGJ1ZmZlcmluZwotICogYmV0d2VlbiB1cHNhbXBsZS9jb2xvciBjb252ZXJzaW9uIGFuZCBjb2xvciBxdWFudGl6YXRpb24vcmVkdWN0aW9uLgotICoKLSAqIElmIG5vIGNvbG9yIHF1YW50aXphdGlvbi9yZWR1Y3Rpb24gaXMgcmVxdWlyZWQsIHRoZW4gdGhpcyBtb2R1bGUgaGFzIG5vCi0gKiB3b3JrIHRvIGRvLCBhbmQgaXQganVzdCBoYW5kcyBvZmYgdG8gdGhlIHVwc2FtcGxlL2NvbG9yIGNvbnZlcnNpb24gY29kZS4KLSAqIEFuIGludGVncmF0ZWQgdXBzYW1wbGUvY29udmVydC9xdWFudGl6ZSBwcm9jZXNzIHdvdWxkIHJlcGxhY2UgdGhpcyBtb2R1bGUKLSAqIGVudGlyZWx5LgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKiBQcml2YXRlIGJ1ZmZlciBjb250cm9sbGVyIG9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2RfcG9zdF9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIENvbG9yIHF1YW50aXphdGlvbiBzb3VyY2UgYnVmZmVyOiB0aGlzIGhvbGRzIG91dHB1dCBkYXRhIGZyb20KLSAgICogdGhlIHVwc2FtcGxlL2NvbG9yIGNvbnZlcnNpb24gc3RlcCB0byBiZSBwYXNzZWQgdG8gdGhlIHF1YW50aXplci4KLSAgICogRm9yIHR3by1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiwgd2UgbmVlZCBhIGZ1bGwtaW1hZ2UgYnVmZmVyOwotICAgKiBmb3Igb25lLXBhc3Mgb3BlcmF0aW9uLCBhIHN0cmlwIGJ1ZmZlciBpcyBzdWZmaWNpZW50LgotICAgKi8KLSAganZpcnRfc2FycmF5X3B0ciB3aG9sZV9pbWFnZTsJLyogdmlydHVhbCBhcnJheSwgb3IgTlVMTCBpZiBvbmUtcGFzcyAqLwotICBKU0FNUEFSUkFZIGJ1ZmZlcjsJCS8qIHN0cmlwIGJ1ZmZlciwgb3IgY3VycmVudCBzdHJpcCBvZiB2aXJ0dWFsICovCi0gIEpESU1FTlNJT04gc3RyaXBfaGVpZ2h0OwkvKiBidWZmZXIgc2l6ZSBpbiByb3dzICovCi0gIC8qIGZvciB0d28tcGFzcyBtb2RlIG9ubHk6ICovCi0gIEpESU1FTlNJT04gc3RhcnRpbmdfcm93OwkvKiByb3cgIyBvZiBmaXJzdCByb3cgaW4gY3VycmVudCBzdHJpcCAqLwotICBKRElNRU5TSU9OIG5leHRfcm93OwkJLyogaW5kZXggb2YgbmV4dCByb3cgdG8gZmlsbC9lbXB0eSBpbiBzdHJpcCAqLwotfSBteV9wb3N0X2NvbnRyb2xsZXI7Ci0KLXR5cGVkZWYgbXlfcG9zdF9jb250cm9sbGVyICogbXlfcG9zdF9wdHI7Ci0KLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLU1FVEhPRERFRih2b2lkKSBwb3N0X3Byb2Nlc3NfMXBhc3MKLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKLQkgICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKLQkgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCi0JICAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7Ci0jaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECi1NRVRIT0RERUYodm9pZCkgcG9zdF9wcm9jZXNzX3ByZXBhc3MKLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKLQkgICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKLQkgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCi0JICAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7Ci1NRVRIT0RERUYodm9pZCkgcG9zdF9wcm9jZXNzXzJwYXNzCi0JSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCSAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCi0JICAgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCi0JICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAotCSAgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOwotI2VuZGlmCi0KLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIGEgcHJvY2Vzc2luZyBwYXNzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfcGFzc19kcG9zdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpCi17Ci0gIG15X3Bvc3RfcHRyIHBvc3QgPSAobXlfcG9zdF9wdHIpIGNpbmZvLT5wb3N0OwotCi0gIHN3aXRjaCAocGFzc19tb2RlKSB7Ci0gIGNhc2UgSkJVRl9QQVNTX1RIUlU6Ci0gICAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpIHsKLSAgICAgIC8qIFNpbmdsZS1wYXNzIHByb2Nlc3Npbmcgd2l0aCBjb2xvciBxdWFudGl6YXRpb24uICovCi0gICAgICBwb3N0LT5wdWIucG9zdF9wcm9jZXNzX2RhdGEgPSBwb3N0X3Byb2Nlc3NfMXBhc3M7Ci0gICAgICAvKiBXZSBjb3VsZCBiZSBkb2luZyBidWZmZXJlZC1pbWFnZSBvdXRwdXQgYmVmb3JlIHN0YXJ0aW5nIGEgMi1wYXNzCi0gICAgICAgKiBjb2xvciBxdWFudGl6YXRpb247IGluIHRoYXQgY2FzZSwgamluaXRfZF9wb3N0X2NvbnRyb2xsZXIgZGlkIG5vdAotICAgICAgICogYWxsb2NhdGUgYSBzdHJpcCBidWZmZXIuICBVc2UgdGhlIHZpcnR1YWwtYXJyYXkgYnVmZmVyIGFzIHdvcmtzcGFjZS4KLSAgICAgICAqLwotICAgICAgaWYgKHBvc3QtPmJ1ZmZlciA9PSBOVUxMKSB7Ci0JcG9zdC0+YnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCi0JICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHBvc3QtPndob2xlX2ltYWdlLAotCSAgIChKRElNRU5TSU9OKSAwLCBwb3N0LT5zdHJpcF9oZWlnaHQsIFRSVUUpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBGb3Igc2luZ2xlLXBhc3MgcHJvY2Vzc2luZyB3aXRob3V0IGNvbG9yIHF1YW50aXphdGlvbiwKLSAgICAgICAqIEkgaGF2ZSBubyB3b3JrIHRvIGRvOyBqdXN0IGNhbGwgdGhlIHVwc2FtcGxlciBkaXJlY3RseS4KLSAgICAgICAqLwotICAgICAgcG9zdC0+cHViLnBvc3RfcHJvY2Vzc19kYXRhID0gY2luZm8tPnVwc2FtcGxlLT51cHNhbXBsZTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0jaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECi0gIGNhc2UgSkJVRl9TQVZFX0FORF9QQVNTOgotICAgIC8qIEZpcnN0IHBhc3Mgb2YgMi1wYXNzIHF1YW50aXphdGlvbiAqLwotICAgIGlmIChwb3N0LT53aG9sZV9pbWFnZSA9PSBOVUxMKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotICAgIHBvc3QtPnB1Yi5wb3N0X3Byb2Nlc3NfZGF0YSA9IHBvc3RfcHJvY2Vzc19wcmVwYXNzOwotICAgIGJyZWFrOwotICBjYXNlIEpCVUZfQ1JBTktfREVTVDoKLSAgICAvKiBTZWNvbmQgcGFzcyBvZiAyLXBhc3MgcXVhbnRpemF0aW9uICovCi0gICAgaWYgKHBvc3QtPndob2xlX2ltYWdlID09IE5VTEwpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7Ci0gICAgcG9zdC0+cHViLnBvc3RfcHJvY2Vzc19kYXRhID0gcG9zdF9wcm9jZXNzXzJwYXNzOwotICAgIGJyZWFrOwotI2VuZGlmIC8qIFFVQU5UXzJQQVNTX1NVUFBPUlRFRCAqLwotICBkZWZhdWx0OgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKLSAgICBicmVhazsKLSAgfQotICBwb3N0LT5zdGFydGluZ19yb3cgPSBwb3N0LT5uZXh0X3JvdyA9IDA7Ci19Ci0KLQotLyoKLSAqIFByb2Nlc3Mgc29tZSBkYXRhIGluIHRoZSBvbmUtcGFzcyAoc3RyaXAgYnVmZmVyKSBjYXNlLgotICogVGhpcyBpcyB1c2VkIGZvciBjb2xvciBwcmVjaXNpb24gcmVkdWN0aW9uIGFzIHdlbGwgYXMgb25lLXBhc3MgcXVhbnRpemF0aW9uLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcG9zdF9wcm9jZXNzXzFwYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCi0JCSAgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCi0JCSAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAotCQkgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkKLXsKLSAgbXlfcG9zdF9wdHIgcG9zdCA9IChteV9wb3N0X3B0cikgY2luZm8tPnBvc3Q7Ci0gIEpESU1FTlNJT04gbnVtX3Jvd3MsIG1heF9yb3dzOwotCi0gIC8qIEZpbGwgdGhlIGJ1ZmZlciwgYnV0IG5vdCBtb3JlIHRoYW4gd2hhdCB3ZSBjYW4gZHVtcCBvdXQgaW4gb25lIGdvLiAqLwotICAvKiBOb3RlIHdlIHJlbHkgb24gdGhlIHVwc2FtcGxlciB0byBkZXRlY3QgYm90dG9tIG9mIGltYWdlLiAqLwotICBtYXhfcm93cyA9IG91dF9yb3dzX2F2YWlsIC0gKm91dF9yb3dfY3RyOwotICBpZiAobWF4X3Jvd3MgPiBwb3N0LT5zdHJpcF9oZWlnaHQpCi0gICAgbWF4X3Jvd3MgPSBwb3N0LT5zdHJpcF9oZWlnaHQ7Ci0gIG51bV9yb3dzID0gMDsKLSAgKCpjaW5mby0+dXBzYW1wbGUtPnVwc2FtcGxlKSAoY2luZm8sCi0JCWlucHV0X2J1ZiwgaW5fcm93X2dyb3VwX2N0ciwgaW5fcm93X2dyb3Vwc19hdmFpbCwKLQkJcG9zdC0+YnVmZmVyLCAmbnVtX3Jvd3MsIG1heF9yb3dzKTsKLSAgLyogUXVhbnRpemUgYW5kIGVtaXQgZGF0YS4gKi8KLSAgKCpjaW5mby0+Y3F1YW50aXplLT5jb2xvcl9xdWFudGl6ZSkgKGNpbmZvLAotCQlwb3N0LT5idWZmZXIsIG91dHB1dF9idWYgKyAqb3V0X3Jvd19jdHIsIChpbnQpIG51bV9yb3dzKTsKLSAgKm91dF9yb3dfY3RyICs9IG51bV9yb3dzOwotfQotCi0KLSNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKLQotLyoKLSAqIFByb2Nlc3Mgc29tZSBkYXRhIGluIHRoZSBmaXJzdCBwYXNzIG9mIDItcGFzcyBxdWFudGl6YXRpb24uCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1wb3N0X3Byb2Nlc3NfcHJlcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCi0JCSAgICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKLQkJICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKLQkJICAgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkKLXsKLSAgbXlfcG9zdF9wdHIgcG9zdCA9IChteV9wb3N0X3B0cikgY2luZm8tPnBvc3Q7Ci0gIEpESU1FTlNJT04gb2xkX25leHRfcm93LCBudW1fcm93czsKLQotICAvKiBSZXBvc2l0aW9uIHZpcnR1YWwgYnVmZmVyIGlmIGF0IHN0YXJ0IG9mIHN0cmlwLiAqLwotICBpZiAocG9zdC0+bmV4dF9yb3cgPT0gMCkgewotICAgIHBvc3QtPmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQotCSgoal9jb21tb25fcHRyKSBjaW5mbywgcG9zdC0+d2hvbGVfaW1hZ2UsCi0JIHBvc3QtPnN0YXJ0aW5nX3JvdywgcG9zdC0+c3RyaXBfaGVpZ2h0LCBUUlVFKTsKLSAgfQotCi0gIC8qIFVwc2FtcGxlIHNvbWUgZGF0YSAodXAgdG8gYSBzdHJpcCBoZWlnaHQncyB3b3J0aCkuICovCi0gIG9sZF9uZXh0X3JvdyA9IHBvc3QtPm5leHRfcm93OwotICAoKmNpbmZvLT51cHNhbXBsZS0+dXBzYW1wbGUpIChjaW5mbywKLQkJaW5wdXRfYnVmLCBpbl9yb3dfZ3JvdXBfY3RyLCBpbl9yb3dfZ3JvdXBzX2F2YWlsLAotCQlwb3N0LT5idWZmZXIsICZwb3N0LT5uZXh0X3JvdywgcG9zdC0+c3RyaXBfaGVpZ2h0KTsKLQotICAvKiBBbGxvdyBxdWFudGl6ZXIgdG8gc2NhbiBuZXcgZGF0YS4gIE5vIGRhdGEgaXMgZW1pdHRlZCwgKi8KLSAgLyogYnV0IHdlIGFkdmFuY2Ugb3V0X3Jvd19jdHIgc28gb3V0ZXIgbG9vcCBjYW4gdGVsbCB3aGVuIHdlJ3JlIGRvbmUuICovCi0gIGlmIChwb3N0LT5uZXh0X3JvdyA+IG9sZF9uZXh0X3JvdykgewotICAgIG51bV9yb3dzID0gcG9zdC0+bmV4dF9yb3cgLSBvbGRfbmV4dF9yb3c7Ci0gICAgKCpjaW5mby0+Y3F1YW50aXplLT5jb2xvcl9xdWFudGl6ZSkgKGNpbmZvLCBwb3N0LT5idWZmZXIgKyBvbGRfbmV4dF9yb3csCi0JCQkJCSAoSlNBTVBBUlJBWSkgTlVMTCwgKGludCkgbnVtX3Jvd3MpOwotICAgICpvdXRfcm93X2N0ciArPSBudW1fcm93czsKLSAgfQotCi0gIC8qIEFkdmFuY2UgaWYgd2UgZmlsbGVkIHRoZSBzdHJpcC4gKi8KLSAgaWYgKHBvc3QtPm5leHRfcm93ID49IHBvc3QtPnN0cmlwX2hlaWdodCkgewotICAgIHBvc3QtPnN0YXJ0aW5nX3JvdyArPSBwb3N0LT5zdHJpcF9oZWlnaHQ7Ci0gICAgcG9zdC0+bmV4dF9yb3cgPSAwOwotICB9Ci19Ci0KLQotLyoKLSAqIFByb2Nlc3Mgc29tZSBkYXRhIGluIHRoZSBzZWNvbmQgcGFzcyBvZiAyLXBhc3MgcXVhbnRpemF0aW9uLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcG9zdF9wcm9jZXNzXzJwYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCi0JCSAgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCi0JCSAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAotCQkgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkKLXsKLSAgbXlfcG9zdF9wdHIgcG9zdCA9IChteV9wb3N0X3B0cikgY2luZm8tPnBvc3Q7Ci0gIEpESU1FTlNJT04gbnVtX3Jvd3MsIG1heF9yb3dzOwotCi0gIC8qIFJlcG9zaXRpb24gdmlydHVhbCBidWZmZXIgaWYgYXQgc3RhcnQgb2Ygc3RyaXAuICovCi0gIGlmIChwb3N0LT5uZXh0X3JvdyA9PSAwKSB7Ci0gICAgcG9zdC0+YnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBwb3N0LT53aG9sZV9pbWFnZSwKLQkgcG9zdC0+c3RhcnRpbmdfcm93LCBwb3N0LT5zdHJpcF9oZWlnaHQsIEZBTFNFKTsKLSAgfQotCi0gIC8qIERldGVybWluZSBudW1iZXIgb2Ygcm93cyB0byBlbWl0LiAqLwotICBudW1fcm93cyA9IHBvc3QtPnN0cmlwX2hlaWdodCAtIHBvc3QtPm5leHRfcm93OyAvKiBhdmFpbGFibGUgaW4gc3RyaXAgKi8KLSAgbWF4X3Jvd3MgPSBvdXRfcm93c19hdmFpbCAtICpvdXRfcm93X2N0cjsgLyogYXZhaWxhYmxlIGluIG91dHB1dCBhcmVhICovCi0gIGlmIChudW1fcm93cyA+IG1heF9yb3dzKQotICAgIG51bV9yb3dzID0gbWF4X3Jvd3M7Ci0gIC8qIFdlIGhhdmUgdG8gY2hlY2sgYm90dG9tIG9mIGltYWdlIGhlcmUsIGNhbid0IGRlcGVuZCBvbiB1cHNhbXBsZXIuICovCi0gIG1heF9yb3dzID0gY2luZm8tPm91dHB1dF9oZWlnaHQgLSBwb3N0LT5zdGFydGluZ19yb3c7Ci0gIGlmIChudW1fcm93cyA+IG1heF9yb3dzKQotICAgIG51bV9yb3dzID0gbWF4X3Jvd3M7Ci0KLSAgLyogUXVhbnRpemUgYW5kIGVtaXQgZGF0YS4gKi8KLSAgKCpjaW5mby0+Y3F1YW50aXplLT5jb2xvcl9xdWFudGl6ZSkgKGNpbmZvLAotCQlwb3N0LT5idWZmZXIgKyBwb3N0LT5uZXh0X3Jvdywgb3V0cHV0X2J1ZiArICpvdXRfcm93X2N0ciwKLQkJKGludCkgbnVtX3Jvd3MpOwotICAqb3V0X3Jvd19jdHIgKz0gbnVtX3Jvd3M7Ci0KLSAgLyogQWR2YW5jZSBpZiB3ZSBmaWxsZWQgdGhlIHN0cmlwLiAqLwotICBwb3N0LT5uZXh0X3JvdyArPSBudW1fcm93czsKLSAgaWYgKHBvc3QtPm5leHRfcm93ID49IHBvc3QtPnN0cmlwX2hlaWdodCkgewotICAgIHBvc3QtPnN0YXJ0aW5nX3JvdyArPSBwb3N0LT5zdHJpcF9oZWlnaHQ7Ci0gICAgcG9zdC0+bmV4dF9yb3cgPSAwOwotICB9Ci19Ci0KLSNlbmRpZiAvKiBRVUFOVF8yUEFTU19TVVBQT1JURUQgKi8KLQotCi0vKgotICogSW5pdGlhbGl6ZSBwb3N0cHJvY2Vzc2luZyBjb250cm9sbGVyLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfZF9wb3N0X2NvbnRyb2xsZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikKLXsKLSAgbXlfcG9zdF9wdHIgcG9zdDsKLQotICBwb3N0ID0gKG15X3Bvc3RfcHRyKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJU0laRU9GKG15X3Bvc3RfY29udHJvbGxlcikpOwotICBjaW5mby0+cG9zdCA9IChzdHJ1Y3QganBlZ19kX3Bvc3RfY29udHJvbGxlciAqKSBwb3N0OwotICBwb3N0LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfZHBvc3Q7Ci0gIHBvc3QtPndob2xlX2ltYWdlID0gTlVMTDsJLyogZmxhZyBmb3Igbm8gdmlydHVhbCBhcnJheXMgKi8KLSAgcG9zdC0+YnVmZmVyID0gTlVMTDsJCS8qIGZsYWcgZm9yIG5vIHN0cmlwIGJ1ZmZlciAqLwotCi0gIC8qIENyZWF0ZSB0aGUgcXVhbnRpemF0aW9uIGJ1ZmZlciwgaWYgbmVlZGVkICovCi0gIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKSB7Ci0gICAgLyogVGhlIGJ1ZmZlciBzdHJpcCBoZWlnaHQgaXMgbWF4X3Zfc2FtcF9mYWN0b3IsIHdoaWNoIGlzIHR5cGljYWxseQotICAgICAqIGFuIGVmZmljaWVudCBudW1iZXIgb2Ygcm93cyBmb3IgdXBzYW1wbGluZyB0byByZXR1cm4uCi0gICAgICogKEluIHRoZSBwcmVzZW5jZSBvZiBvdXRwdXQgcmVzY2FsaW5nLCB3ZSBtaWdodCB3YW50IHRvIGJlIHNtYXJ0ZXI/KQotICAgICAqLwotICAgIHBvc3QtPnN0cmlwX2hlaWdodCA9IChKRElNRU5TSU9OKSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7Ci0gICAgaWYgKG5lZWRfZnVsbF9idWZmZXIpIHsKLSAgICAgIC8qIFR3by1wYXNzIGNvbG9yIHF1YW50aXphdGlvbjogbmVlZCBmdWxsLWltYWdlIHN0b3JhZ2UuICovCi0gICAgICAvKiBXZSByb3VuZCB1cCB0aGUgbnVtYmVyIG9mIHJvd3MgdG8gYSBtdWx0aXBsZSBvZiB0aGUgc3RyaXAgaGVpZ2h0LiAqLwotI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAotICAgICAgcG9zdC0+d2hvbGVfaW1hZ2UgPSAoKmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9zYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgRkFMU0UsCi0JIGNpbmZvLT5vdXRwdXRfd2lkdGggKiBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMsCi0JIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0LAotCQkJCShsb25nKSBwb3N0LT5zdHJpcF9oZWlnaHQpLAotCSBwb3N0LT5zdHJpcF9oZWlnaHQpOwotI2Vsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKLSNlbmRpZiAvKiBRVUFOVF8yUEFTU19TVVBQT1JURUQgKi8KLSAgICB9IGVsc2UgewotICAgICAgLyogT25lLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uOiBqdXN0IG1ha2UgYSBzdHJpcCBidWZmZXIuICovCi0gICAgICBwb3N0LT5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKLQkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCSBjaW5mby0+b3V0cHV0X3dpZHRoICogY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzLAotCSBwb3N0LT5zdHJpcF9oZWlnaHQpOwotICAgIH0KLSAgfQotfQotCi0jZW5kaWYgLy9fRlhfSlBFR19UVVJCT18KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkc2FtcGxlLmMgYi9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZHNhbXBsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTljMzhjLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkc2FtcGxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODEgKzAsMCBAQAotI2lmICFkZWZpbmVkKF9GWF9KUEVHX1RVUkJPXykKLS8qCi0gKiBqZHNhbXBsZS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdXBzYW1wbGluZyByb3V0aW5lcy4KLSAqCi0gKiBVcHNhbXBsaW5nIGlucHV0IGRhdGEgaXMgY291bnRlZCBpbiAicm93IGdyb3VwcyIuICBBIHJvdyBncm91cAotICogaXMgZGVmaW5lZCB0byBiZSAodl9zYW1wX2ZhY3RvciAqIERDVF9zY2FsZWRfc2l6ZSAvIG1pbl9EQ1Rfc2NhbGVkX3NpemUpCi0gKiBzYW1wbGUgcm93cyBvZiBlYWNoIGNvbXBvbmVudC4gIFVwc2FtcGxpbmcgd2lsbCBub3JtYWxseSBwcm9kdWNlCi0gKiBtYXhfdl9zYW1wX2ZhY3RvciBwaXhlbCByb3dzIGZyb20gZWFjaCByb3cgZ3JvdXAgKGJ1dCB0aGlzIGNvdWxkIHZhcnkKLSAqIGlmIHRoZSB1cHNhbXBsZXIgaXMgYXBwbHlpbmcgYSBzY2FsZSBmYWN0b3Igb2YgaXRzIG93bikuCi0gKgotICogQW4gZXhjZWxsZW50IHJlZmVyZW5jZSBmb3IgaW1hZ2UgcmVzYW1wbGluZyBpcwotICogICBEaWdpdGFsIEltYWdlIFdhcnBpbmcsIEdlb3JnZSBXb2xiZXJnLCAxOTkwLgotICogICBQdWIuIGJ5IElFRUUgQ29tcHV0ZXIgU29jaWV0eSBQcmVzcywgTG9zIEFsYW1pdG9zLCBDQS4gSVNCTiAwLTgxODYtODk0NC03LgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKiBQb2ludGVyIHRvIHJvdXRpbmUgdG8gdXBzYW1wbGUgYSBzaW5nbGUgY29tcG9uZW50ICovCi10eXBlZGVmIEpNRVRIT0Qodm9pZCwgdXBzYW1wbGUxX3B0ciwKLQkJKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCQkgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKSk7Ci0KLS8qIFByaXZhdGUgc3Vib2JqZWN0ICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGpwZWdfdXBzYW1wbGVyIHB1YjsJLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIENvbG9yIGNvbnZlcnNpb24gYnVmZmVyLiAgV2hlbiB1c2luZyBzZXBhcmF0ZSB1cHNhbXBsaW5nIGFuZCBjb2xvcgotICAgKiBjb252ZXJzaW9uIHN0ZXBzLCB0aGlzIGJ1ZmZlciBob2xkcyBvbmUgdXBzYW1wbGVkIHJvdyBncm91cCB1bnRpbCBpdAotICAgKiBoYXMgYmVlbiBjb2xvciBjb252ZXJ0ZWQgYW5kIG91dHB1dC4KLSAgICogTm90ZTogd2UgZG8gbm90IGFsbG9jYXRlIGFueSBzdG9yYWdlIGZvciBjb21wb25lbnQocykgd2hpY2ggYXJlIGZ1bGwtc2l6ZSwKLSAgICogaWUgZG8gbm90IG5lZWQgcmVzY2FsaW5nLiAgVGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgb2YgY29sb3JfYnVmW10gaXMKLSAgICogc2ltcGx5IHNldCB0byBwb2ludCB0byB0aGUgaW5wdXQgZGF0YSBhcnJheSwgdGhlcmVieSBhdm9pZGluZyBjb3B5aW5nLgotICAgKi8KLSAgSlNBTVBBUlJBWSBjb2xvcl9idWZbTUFYX0NPTVBPTkVOVFNdOwotCi0gIC8qIFBlci1jb21wb25lbnQgdXBzYW1wbGluZyBtZXRob2QgcG9pbnRlcnMgKi8KLSAgdXBzYW1wbGUxX3B0ciBtZXRob2RzW01BWF9DT01QT05FTlRTXTsKLQotICBpbnQgbmV4dF9yb3dfb3V0OwkJLyogY291bnRzIHJvd3MgZW1pdHRlZCBmcm9tIGNvbG9yX2J1ZiAqLwotICBKRElNRU5TSU9OIHJvd3NfdG9fZ287CS8qIGNvdW50cyByb3dzIHJlbWFpbmluZyBpbiBpbWFnZSAqLwotCi0gIC8qIEhlaWdodCBvZiBhbiBpbnB1dCByb3cgZ3JvdXAgZm9yIGVhY2ggY29tcG9uZW50LiAqLwotICBpbnQgcm93Z3JvdXBfaGVpZ2h0W01BWF9DT01QT05FTlRTXTsKLQotICAvKiBUaGVzZSBhcnJheXMgc2F2ZSBwaXhlbCBleHBhbnNpb24gZmFjdG9ycyBzbyB0aGF0IGludF9leHBhbmQgbmVlZCBub3QKLSAgICogcmVjb21wdXRlIHRoZW0gZWFjaCB0aW1lLiAgVGhleSBhcmUgdW51c2VkIGZvciBvdGhlciB1cHNhbXBsaW5nIG1ldGhvZHMuCi0gICAqLwotICBVSU5UOCBoX2V4cGFuZFtNQVhfQ09NUE9ORU5UU107Ci0gIFVJTlQ4IHZfZXhwYW5kW01BWF9DT01QT05FTlRTXTsKLX0gbXlfdXBzYW1wbGVyOwotCi10eXBlZGVmIG15X3Vwc2FtcGxlciAqIG15X3Vwc2FtcGxlX3B0cjsKLQotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYW4gdXBzYW1wbGluZyBwYXNzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfcGFzc191cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOwotCi0gIC8qIE1hcmsgdGhlIGNvbnZlcnNpb24gYnVmZmVyIGVtcHR5ICovCi0gIHVwc2FtcGxlLT5uZXh0X3Jvd19vdXQgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7Ci0gIC8qIEluaXRpYWxpemUgdG90YWwtaGVpZ2h0IGNvdW50ZXIgZm9yIGRldGVjdGluZyBib3R0b20gb2YgaW1hZ2UgKi8KLSAgdXBzYW1wbGUtPnJvd3NfdG9fZ28gPSBjaW5mby0+b3V0cHV0X2hlaWdodDsKLX0KLQotCi0vKgotICogQ29udHJvbCByb3V0aW5lIHRvIGRvIHVwc2FtcGxpbmcgKGFuZCBjb2xvciBjb252ZXJzaW9uKS4KLSAqCi0gKiBJbiB0aGlzIHZlcnNpb24gd2UgdXBzYW1wbGUgZWFjaCBjb21wb25lbnQgaW5kZXBlbmRlbnRseS4KLSAqIFdlIHVwc2FtcGxlIG9uZSByb3cgZ3JvdXAgaW50byB0aGUgY29udmVyc2lvbiBidWZmZXIsIHRoZW4gYXBwbHkKLSAqIGNvbG9yIGNvbnZlcnNpb24gYSByb3cgYXQgYSB0aW1lLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc2VwX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCSAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAotCSAgICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKLQkgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAotCSAgICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCi17Ci0gIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKLSAgaW50IGNpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLSAgSkRJTUVOU0lPTiBudW1fcm93czsKLQotICAvKiBGaWxsIHRoZSBjb252ZXJzaW9uIGJ1ZmZlciwgaWYgaXQncyBlbXB0eSAqLwotICBpZiAodXBzYW1wbGUtPm5leHRfcm93X291dCA+PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKLSAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotCSBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAgIC8qIEludm9rZSBwZXItY29tcG9uZW50IHVwc2FtcGxlIG1ldGhvZC4gIE5vdGljZSB3ZSBwYXNzIGEgUE9JTlRFUgotICAgICAgICogdG8gY29sb3JfYnVmW2NpXSwgc28gdGhhdCBmdWxsc2l6ZV91cHNhbXBsZSBjYW4gY2hhbmdlIGl0LgotICAgICAgICovCi0gICAgICAoKnVwc2FtcGxlLT5tZXRob2RzW2NpXSkgKGNpbmZvLCBjb21wcHRyLAotCWlucHV0X2J1ZltjaV0gKyAoKmluX3Jvd19ncm91cF9jdHIgKiB1cHNhbXBsZS0+cm93Z3JvdXBfaGVpZ2h0W2NpXSksCi0JdXBzYW1wbGUtPmNvbG9yX2J1ZiArIGNpKTsKLSAgICB9Ci0gICAgdXBzYW1wbGUtPm5leHRfcm93X291dCA9IDA7Ci0gIH0KLQotICAvKiBDb2xvci1jb252ZXJ0IGFuZCBlbWl0IHJvd3MgKi8KLQotICAvKiBIb3cgbWFueSB3ZSBoYXZlIGluIHRoZSBidWZmZXI6ICovCi0gIG51bV9yb3dzID0gKEpESU1FTlNJT04pIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgLSB1cHNhbXBsZS0+bmV4dF9yb3dfb3V0KTsKLSAgLyogTm90IG1vcmUgdGhhbiB0aGUgZGlzdGFuY2UgdG8gdGhlIGVuZCBvZiB0aGUgaW1hZ2UuICBOZWVkIHRoaXMgdGVzdAotICAgKiBpbiBjYXNlIHRoZSBpbWFnZSBoZWlnaHQgaXMgbm90IGEgbXVsdGlwbGUgb2YgbWF4X3Zfc2FtcF9mYWN0b3I6Ci0gICAqLwotICBpZiAobnVtX3Jvd3MgPiB1cHNhbXBsZS0+cm93c190b19nbykgCi0gICAgbnVtX3Jvd3MgPSB1cHNhbXBsZS0+cm93c190b19nbzsKLSAgLyogQW5kIG5vdCBtb3JlIHRoYW4gd2hhdCB0aGUgY2xpZW50IGNhbiBhY2NlcHQ6ICovCi0gIG91dF9yb3dzX2F2YWlsIC09ICpvdXRfcm93X2N0cjsKLSAgaWYgKG51bV9yb3dzID4gb3V0X3Jvd3NfYXZhaWwpCi0gICAgbnVtX3Jvd3MgPSBvdXRfcm93c19hdmFpbDsKLQotICAoKmNpbmZvLT5jY29udmVydC0+Y29sb3JfY29udmVydCkgKGNpbmZvLCB1cHNhbXBsZS0+Y29sb3JfYnVmLAotCQkJCSAgICAgKEpESU1FTlNJT04pIHVwc2FtcGxlLT5uZXh0X3Jvd19vdXQsCi0JCQkJICAgICBvdXRwdXRfYnVmICsgKm91dF9yb3dfY3RyLAotCQkJCSAgICAgKGludCkgbnVtX3Jvd3MpOwotCi0gIC8qIEFkanVzdCBjb3VudHMgKi8KLSAgKm91dF9yb3dfY3RyICs9IG51bV9yb3dzOwotICB1cHNhbXBsZS0+cm93c190b19nbyAtPSBudW1fcm93czsKLSAgdXBzYW1wbGUtPm5leHRfcm93X291dCArPSBudW1fcm93czsKLSAgLyogV2hlbiB0aGUgYnVmZmVyIGlzIGVtcHRpZWQsIGRlY2xhcmUgdGhpcyBpbnB1dCByb3cgZ3JvdXAgY29uc3VtZWQgKi8KLSAgaWYgKHVwc2FtcGxlLT5uZXh0X3Jvd19vdXQgPj0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKQotICAgICgqaW5fcm93X2dyb3VwX2N0cikrKzsKLX0KLQotCi0vKgotICogVGhlc2UgYXJlIHRoZSByb3V0aW5lcyBpbnZva2VkIGJ5IHNlcF91cHNhbXBsZSB0byB1cHNhbXBsZSBwaXhlbCB2YWx1ZXMKLSAqIG9mIGEgc2luZ2xlIGNvbXBvbmVudC4gIE9uZSByb3cgZ3JvdXAgaXMgcHJvY2Vzc2VkIHBlciBjYWxsLgotICovCi0KLQotLyoKLSAqIEZvciBmdWxsLXNpemUgY29tcG9uZW50cywgd2UganVzdCBtYWtlIGNvbG9yX2J1ZltjaV0gcG9pbnQgYXQgdGhlCi0gKiBpbnB1dCBidWZmZXIsIGFuZCB0aHVzIGF2b2lkIGNvcHlpbmcgYW55IGRhdGEuICBOb3RlIHRoYXQgdGhpcyBpcwotICogc2FmZSBvbmx5IGJlY2F1c2Ugc2VwX3Vwc2FtcGxlIGRvZXNuJ3QgZGVjbGFyZSB0aGUgaW5wdXQgcm93IGdyb3VwCi0gKiAiY29uc3VtZWQiIHVudGlsIHdlIGFyZSBkb25lIGNvbG9yIGNvbnZlcnRpbmcgYW5kIGVtaXR0aW5nIGl0LgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZnVsbHNpemVfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCQkgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpCi17Ci0gICpvdXRwdXRfZGF0YV9wdHIgPSBpbnB1dF9kYXRhOwotfQotCi0KLS8qCi0gKiBUaGlzIGlzIGEgbm8tb3AgdmVyc2lvbiB1c2VkIGZvciAidW5pbnRlcmVzdGluZyIgY29tcG9uZW50cy4KLSAqIFRoZXNlIGNvbXBvbmVudHMgd2lsbCBub3QgYmUgcmVmZXJlbmNlZCBieSBjb2xvciBjb252ZXJzaW9uLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotbm9vcF91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JICAgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikKLXsKLSAgKm91dHB1dF9kYXRhX3B0ciA9IE5VTEw7CS8qIHNhZmV0eSBjaGVjayAqLwotfQotCi0KLS8qCi0gKiBUaGlzIHZlcnNpb24gaGFuZGxlcyBhbnkgaW50ZWdyYWwgc2FtcGxpbmcgcmF0aW9zLgotICogVGhpcyBpcyBub3QgdXNlZCBmb3IgdHlwaWNhbCBKUEVHIGZpbGVzLCBzbyBpdCBuZWVkIG5vdCBiZSBmYXN0LgotICogTm9yLCBmb3IgdGhhdCBtYXR0ZXIsIGlzIGl0IHBhcnRpY3VsYXJseSBhY2N1cmF0ZTogdGhlIGFsZ29yaXRobSBpcwotICogc2ltcGxlIHJlcGxpY2F0aW9uIG9mIHRoZSBpbnB1dCBwaXhlbCBvbnRvIHRoZSBjb3JyZXNwb25kaW5nIG91dHB1dAotICogcGl4ZWxzLiAgVGhlIGhpLWZhbHV0aW4gc2FtcGxpbmcgbGl0ZXJhdHVyZSByZWZlcnMgdG8gdGhpcyBhcyBhCi0gKiAiYm94IGZpbHRlciIuICBBIGJveCBmaWx0ZXIgdGVuZHMgdG8gaW50cm9kdWNlIHZpc2libGUgYXJ0aWZhY3RzLAotICogc28gaWYgeW91IGFyZSBhY3R1YWxseSBnb2luZyB0byB1c2UgMzoxIG9yIDQ6MSBzYW1wbGluZyByYXRpb3MKLSAqIHlvdSB3b3VsZCBiZSB3ZWxsIGFkdmlzZWQgdG8gaW1wcm92ZSB0aGlzIGNvZGUuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1pbnRfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSAgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikKLXsKLSAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOwotICBKU0FNUEFSUkFZIG91dHB1dF9kYXRhID0gKm91dHB1dF9kYXRhX3B0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBMRSBpbnZhbHVlOwotICByZWdpc3RlciBpbnQgaDsKLSAgSlNBTVBST1cgb3V0ZW5kOwotICBpbnQgaF9leHBhbmQsIHZfZXhwYW5kOwotICBpbnQgaW5yb3csIG91dHJvdzsKLQotICBoX2V4cGFuZCA9IHVwc2FtcGxlLT5oX2V4cGFuZFtjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdOwotICB2X2V4cGFuZCA9IHVwc2FtcGxlLT52X2V4cGFuZFtjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdOwotCi0gIGlucm93ID0gb3V0cm93ID0gMDsKLSAgd2hpbGUgKG91dHJvdyA8IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgewotICAgIC8qIEdlbmVyYXRlIG9uZSBvdXRwdXQgcm93IHdpdGggcHJvcGVyIGhvcml6b250YWwgZXhwYW5zaW9uICovCi0gICAgaW5wdHIgPSBpbnB1dF9kYXRhW2lucm93XTsKLSAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtvdXRyb3ddOwotICAgIG91dGVuZCA9IG91dHB0ciArIGNpbmZvLT5vdXRwdXRfd2lkdGg7Ci0gICAgd2hpbGUgKG91dHB0ciA8IG91dGVuZCkgewotICAgICAgaW52YWx1ZSA9ICppbnB0cisrOwkvKiBkb24ndCBuZWVkIEdFVEpTQU1QTEUoKSBoZXJlICovCi0gICAgICBmb3IgKGggPSBoX2V4cGFuZDsgaCA+IDA7IGgtLSkgewotCSpvdXRwdHIrKyA9IGludmFsdWU7Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIEdlbmVyYXRlIGFueSBhZGRpdGlvbmFsIG91dHB1dCByb3dzIGJ5IGR1cGxpY2F0aW5nIHRoZSBmaXJzdCBvbmUgKi8KLSAgICBpZiAodl9leHBhbmQgPiAxKSB7Ci0gICAgICBqY29weV9zYW1wbGVfcm93cyhvdXRwdXRfZGF0YSwgb3V0cm93LCBvdXRwdXRfZGF0YSwgb3V0cm93KzEsCi0JCQl2X2V4cGFuZC0xLCBjaW5mby0+b3V0cHV0X3dpZHRoKTsKLSAgICB9Ci0gICAgaW5yb3crKzsKLSAgICBvdXRyb3cgKz0gdl9leHBhbmQ7Ci0gIH0KLX0KLQotCi0vKgotICogRmFzdCBwcm9jZXNzaW5nIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDE6MSB2ZXJ0aWNhbC4KLSAqIEl0J3Mgc3RpbGwgYSBib3ggZmlsdGVyLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotaDJ2MV91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JICAgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikKLXsKLSAgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSA9ICpvdXRwdXRfZGF0YV9wdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QTEUgaW52YWx1ZTsKLSAgSlNBTVBST1cgb3V0ZW5kOwotICBpbnQgaW5yb3c7Ci0KLSAgZm9yIChpbnJvdyA9IDA7IGlucm93IDwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOyBpbnJvdysrKSB7Ci0gICAgaW5wdHIgPSBpbnB1dF9kYXRhW2lucm93XTsKLSAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtpbnJvd107Ci0gICAgb3V0ZW5kID0gb3V0cHRyICsgY2luZm8tPm91dHB1dF93aWR0aDsKLSAgICB3aGlsZSAob3V0cHRyIDwgb3V0ZW5kKSB7Ci0gICAgICBpbnZhbHVlID0gKmlucHRyKys7CS8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSgpIGhlcmUgKi8KLSAgICAgICpvdXRwdHIrKyA9IGludmFsdWU7Ci0gICAgICAqb3V0cHRyKysgPSBpbnZhbHVlOwotICAgIH0KLSAgfQotfQotCi0KLS8qCi0gKiBGYXN0IHByb2Nlc3NpbmcgZm9yIHRoZSBjb21tb24gY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMjoxIHZlcnRpY2FsLgotICogSXQncyBzdGlsbCBhIGJveCBmaWx0ZXIuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1oMnYyX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQotewotICBKU0FNUEFSUkFZIG91dHB1dF9kYXRhID0gKm91dHB1dF9kYXRhX3B0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBMRSBpbnZhbHVlOwotICBKU0FNUFJPVyBvdXRlbmQ7Ci0gIGludCBpbnJvdywgb3V0cm93OwotCi0gIGlucm93ID0gb3V0cm93ID0gMDsKLSAgd2hpbGUgKG91dHJvdyA8IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgewotICAgIGlucHRyID0gaW5wdXRfZGF0YVtpbnJvd107Ci0gICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbb3V0cm93XTsKLSAgICBvdXRlbmQgPSBvdXRwdHIgKyBjaW5mby0+b3V0cHV0X3dpZHRoOwotICAgIHdoaWxlIChvdXRwdHIgPCBvdXRlbmQpIHsKLSAgICAgIGludmFsdWUgPSAqaW5wdHIrKzsJLyogZG9uJ3QgbmVlZCBHRVRKU0FNUExFKCkgaGVyZSAqLwotICAgICAgKm91dHB0cisrID0gaW52YWx1ZTsKLSAgICAgICpvdXRwdHIrKyA9IGludmFsdWU7Ci0gICAgfQotICAgIGpjb3B5X3NhbXBsZV9yb3dzKG91dHB1dF9kYXRhLCBvdXRyb3csIG91dHB1dF9kYXRhLCBvdXRyb3crMSwKLQkJICAgICAgMSwgY2luZm8tPm91dHB1dF93aWR0aCk7Ci0gICAgaW5yb3crKzsKLSAgICBvdXRyb3cgKz0gMjsKLSAgfQotfQotCi0KLS8qCi0gKiBGYW5jeSBwcm9jZXNzaW5nIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDE6MSB2ZXJ0aWNhbC4KLSAqCi0gKiBUaGUgdXBzYW1wbGluZyBhbGdvcml0aG0gaXMgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiBwaXhlbCBjZW50ZXJzLAotICogYWxzbyBrbm93biBhcyBhICJ0cmlhbmdsZSBmaWx0ZXIiLiAgVGhpcyBpcyBhIGdvb2QgY29tcHJvbWlzZSBiZXR3ZWVuCi0gKiBzcGVlZCBhbmQgdmlzdWFsIHF1YWxpdHkuICBUaGUgY2VudGVycyBvZiB0aGUgb3V0cHV0IHBpeGVscyBhcmUgMS80IGFuZCAzLzQKLSAqIG9mIHRoZSB3YXkgYmV0d2VlbiBpbnB1dCBwaXhlbCBjZW50ZXJzLgotICoKLSAqIEEgbm90ZSBhYm91dCB0aGUgImJpYXMiIGNhbGN1bGF0aW9uczogd2hlbiByb3VuZGluZyBmcmFjdGlvbmFsIHZhbHVlcyB0bwotICogaW50ZWdlciwgd2UgZG8gbm90IHdhbnQgdG8gYWx3YXlzIHJvdW5kIDAuNSB1cCB0byB0aGUgbmV4dCBpbnRlZ2VyLgotICogSWYgd2UgZGlkIHRoYXQsIHdlJ2QgaW50cm9kdWNlIGEgbm90aWNlYWJsZSBiaWFzIHRvd2FyZHMgbGFyZ2VyIHZhbHVlcy4KLSAqIEluc3RlYWQsIHRoaXMgY29kZSBpcyBhcnJhbmdlZCBzbyB0aGF0IDAuNSB3aWxsIGJlIHJvdW5kZWQgdXAgb3IgZG93biBhdAotICogYWx0ZXJuYXRlIHBpeGVsIGxvY2F0aW9ucyAoYSBzaW1wbGUgb3JkZXJlZCBkaXRoZXIgcGF0dGVybikuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1oMnYxX2ZhbmN5X3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpCi17Ci0gIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEgPSAqb3V0cHV0X2RhdGFfcHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOwotICByZWdpc3RlciBpbnQgaW52YWx1ZTsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2xjdHI7Ci0gIGludCBpbnJvdzsKLQotICBmb3IgKGlucm93ID0gMDsgaW5yb3cgPCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7IGlucm93KyspIHsKLSAgICBpbnB0ciA9IGlucHV0X2RhdGFbaW5yb3ddOwotICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW2lucm93XTsKLSAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGZpcnN0IGNvbHVtbiAqLwotICAgIGludmFsdWUgPSBHRVRKU0FNUExFKCppbnB0cisrKTsKLSAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgaW52YWx1ZTsKLSAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChpbnZhbHVlICogMyArIEdFVEpTQU1QTEUoKmlucHRyKSArIDIpID4+IDIpOwotCi0gICAgZm9yIChjb2xjdHIgPSBjb21wcHRyLT5kb3duc2FtcGxlZF93aWR0aCAtIDI7IGNvbGN0ciA+IDA7IGNvbGN0ci0tKSB7Ci0gICAgICAvKiBHZW5lcmFsIGNhc2U6IDMvNCAqIG5lYXJlciBwaXhlbCArIDEvNCAqIGZ1cnRoZXIgcGl4ZWwgKi8KLSAgICAgIGludmFsdWUgPSBHRVRKU0FNUExFKCppbnB0cisrKSAqIDM7Ci0gICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChpbnZhbHVlICsgR0VUSlNBTVBMRShpbnB0clstMl0pICsgMSkgPj4gMik7Ci0gICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChpbnZhbHVlICsgR0VUSlNBTVBMRSgqaW5wdHIpICsgMikgPj4gMik7Ci0gICAgfQotCi0gICAgLyogU3BlY2lhbCBjYXNlIGZvciBsYXN0IGNvbHVtbiAqLwotICAgIGludmFsdWUgPSBHRVRKU0FNUExFKCppbnB0cik7Ci0gICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgoaW52YWx1ZSAqIDMgKyBHRVRKU0FNUExFKGlucHRyWy0xXSkgKyAxKSA+PiAyKTsKLSAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgaW52YWx1ZTsKLSAgfQotfQotCi0KLS8qCi0gKiBGYW5jeSBwcm9jZXNzaW5nIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDI6MSB2ZXJ0aWNhbC4KLSAqIEFnYWluIGEgdHJpYW5nbGUgZmlsdGVyOyBzZWUgY29tbWVudHMgZm9yIGgydjEgY2FzZSwgYWJvdmUuCi0gKgotICogSXQgaXMgT0sgZm9yIHVzIHRvIHJlZmVyZW5jZSB0aGUgYWRqYWNlbnQgaW5wdXQgcm93cyBiZWNhdXNlIHdlIGRlbWFuZGVkCi0gKiBjb250ZXh0IGZyb20gdGhlIG1haW4gYnVmZmVyIGNvbnRyb2xsZXIgKHNlZSBpbml0aWFsaXphdGlvbiBjb2RlKS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWgydjJfZmFuY3lfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCQkgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikKLXsKLSAgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSA9ICpvdXRwdXRfZGF0YV9wdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBvdXRwdHI7Ci0jaWYgQklUU19JTl9KU0FNUExFID09IDgKLSAgcmVnaXN0ZXIgaW50IHRoaXNjb2xzdW0sIGxhc3Rjb2xzdW0sIG5leHRjb2xzdW07Ci0jZWxzZQotICByZWdpc3RlciBJTlQzMiB0aGlzY29sc3VtLCBsYXN0Y29sc3VtLCBuZXh0Y29sc3VtOwotI2VuZGlmCi0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sY3RyOwotICBpbnQgaW5yb3csIG91dHJvdywgdjsKLQotICBpbnJvdyA9IG91dHJvdyA9IDA7Ci0gIHdoaWxlIChvdXRyb3cgPCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKLSAgICBmb3IgKHYgPSAwOyB2IDwgMjsgdisrKSB7Ci0gICAgICAvKiBpbnB0cjAgcG9pbnRzIHRvIG5lYXJlc3QgaW5wdXQgcm93LCBpbnB0cjEgcG9pbnRzIHRvIG5leHQgbmVhcmVzdCAqLwotICAgICAgaW5wdHIwID0gaW5wdXRfZGF0YVtpbnJvd107Ci0gICAgICBpZiAodiA9PSAwKQkJLyogbmV4dCBuZWFyZXN0IGlzIHJvdyBhYm92ZSAqLwotCWlucHRyMSA9IGlucHV0X2RhdGFbaW5yb3ctMV07Ci0gICAgICBlbHNlCQkJLyogbmV4dCBuZWFyZXN0IGlzIHJvdyBiZWxvdyAqLwotCWlucHRyMSA9IGlucHV0X2RhdGFbaW5yb3crMV07Ci0gICAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtvdXRyb3crK107Ci0KLSAgICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgZmlyc3QgY29sdW1uICovCi0gICAgICB0aGlzY29sc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspICogMyArIEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKLSAgICAgIG5leHRjb2xzdW0gPSBHRVRKU0FNUExFKCppbnB0cjArKykgKiAzICsgR0VUSlNBTVBMRSgqaW5wdHIxKyspOwotICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgodGhpc2NvbHN1bSAqIDQgKyA4KSA+PiA0KTsKLSAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKHRoaXNjb2xzdW0gKiAzICsgbmV4dGNvbHN1bSArIDcpID4+IDQpOwotICAgICAgbGFzdGNvbHN1bSA9IHRoaXNjb2xzdW07IHRoaXNjb2xzdW0gPSBuZXh0Y29sc3VtOwotCi0gICAgICBmb3IgKGNvbGN0ciA9IGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoIC0gMjsgY29sY3RyID4gMDsgY29sY3RyLS0pIHsKLQkvKiBHZW5lcmFsIGNhc2U6IDMvNCAqIG5lYXJlciBwaXhlbCArIDEvNCAqIGZ1cnRoZXIgcGl4ZWwgaW4gZWFjaCAqLwotCS8qIGRpbWVuc2lvbiwgdGh1cyA5LzE2LCAzLzE2LCAzLzE2LCAxLzE2IG92ZXJhbGwgKi8KLQluZXh0Y29sc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspICogMyArIEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKLQkqb3V0cHRyKysgPSAoSlNBTVBMRSkgKCh0aGlzY29sc3VtICogMyArIGxhc3Rjb2xzdW0gKyA4KSA+PiA0KTsKLQkqb3V0cHRyKysgPSAoSlNBTVBMRSkgKCh0aGlzY29sc3VtICogMyArIG5leHRjb2xzdW0gKyA3KSA+PiA0KTsKLQlsYXN0Y29sc3VtID0gdGhpc2NvbHN1bTsgdGhpc2NvbHN1bSA9IG5leHRjb2xzdW07Ci0gICAgICB9Ci0KLSAgICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgbGFzdCBjb2x1bW4gKi8KLSAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKHRoaXNjb2xzdW0gKiAzICsgbGFzdGNvbHN1bSArIDgpID4+IDQpOwotICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgodGhpc2NvbHN1bSAqIDQgKyA3KSA+PiA0KTsKLSAgICB9Ci0gICAgaW5yb3crKzsKLSAgfQotfQotCi0KLS8qCi0gKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgdXBzYW1wbGluZy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X3Vwc2FtcGxlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlOwotICBpbnQgY2k7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotICBib29sZWFuIG5lZWRfYnVmZmVyLCBkb19mYW5jeTsKLSAgaW50IGhfaW5fZ3JvdXAsIHZfaW5fZ3JvdXAsIGhfb3V0X2dyb3VwLCB2X291dF9ncm91cDsKLQotICB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfdXBzYW1wbGVyKSk7Ci0gIGNpbmZvLT51cHNhbXBsZSA9IChzdHJ1Y3QganBlZ191cHNhbXBsZXIgKikgdXBzYW1wbGU7Ci0gIHVwc2FtcGxlLT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfdXBzYW1wbGU7Ci0gIHVwc2FtcGxlLT5wdWIudXBzYW1wbGUgPSBzZXBfdXBzYW1wbGU7Ci0gIHVwc2FtcGxlLT5wdWIubmVlZF9jb250ZXh0X3Jvd3MgPSBGQUxTRTsgLyogdW50aWwgd2UgZmluZCBvdXQgZGlmZmVyZW50bHkgKi8KLQotICBpZiAoY2luZm8tPkNDSVI2MDFfc2FtcGxpbmcpCS8qIHRoaXMgaXNuJ3Qgc3VwcG9ydGVkICovCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9DQ0lSNjAxX05PVElNUEwpOwotCi0gIC8qIGpkbWFpbmN0LmMgZG9lc24ndCBzdXBwb3J0IGNvbnRleHQgcm93cyB3aGVuIG1pbl9EQ1Rfc2NhbGVkX3NpemUgPSAxLAotICAgKiBzbyBkb24ndCBhc2sgZm9yIGl0LgotICAgKi8KLSAgZG9fZmFuY3kgPSBjaW5mby0+ZG9fZmFuY3lfdXBzYW1wbGluZyAmJiBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSA+IDE7Ci0KLSAgLyogVmVyaWZ5IHdlIGNhbiBoYW5kbGUgdGhlIHNhbXBsaW5nIGZhY3RvcnMsIHNlbGVjdCBwZXItY29tcG9uZW50IG1ldGhvZHMsCi0gICAqIGFuZCBjcmVhdGUgc3RvcmFnZSBhcyBuZWVkZWQuCi0gICAqLwotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIC8qIENvbXB1dGUgc2l6ZSBvZiBhbiAiaW5wdXQgZ3JvdXAiIGFmdGVyIElEQ1Qgc2NhbGluZy4gIFRoaXMgbWFueSBzYW1wbGVzCi0gICAgICogYXJlIHRvIGJlIGNvbnZlcnRlZCB0byBtYXhfaF9zYW1wX2ZhY3RvciAqIG1heF92X3NhbXBfZmFjdG9yIHBpeGVscy4KLSAgICAgKi8KLSAgICBoX2luX2dyb3VwID0gKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIC8KLQkJIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOwotICAgIHZfaW5fZ3JvdXAgPSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSkgLwotCQkgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7Ci0gICAgaF9vdXRfZ3JvdXAgPSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3I7Ci0gICAgdl9vdXRfZ3JvdXAgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7Ci0gICAgdXBzYW1wbGUtPnJvd2dyb3VwX2hlaWdodFtjaV0gPSB2X2luX2dyb3VwOyAvKiBzYXZlIGZvciB1c2UgbGF0ZXIgKi8KLSAgICBuZWVkX2J1ZmZlciA9IFRSVUU7Ci0gICAgaWYgKCEgY29tcHB0ci0+Y29tcG9uZW50X25lZWRlZCkgewotICAgICAgLyogRG9uJ3QgYm90aGVyIHRvIHVwc2FtcGxlIGFuIHVuaW50ZXJlc3RpbmcgY29tcG9uZW50LiAqLwotICAgICAgdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0gbm9vcF91cHNhbXBsZTsKLSAgICAgIG5lZWRfYnVmZmVyID0gRkFMU0U7Ci0gICAgfSBlbHNlIGlmIChoX2luX2dyb3VwID09IGhfb3V0X2dyb3VwICYmIHZfaW5fZ3JvdXAgPT0gdl9vdXRfZ3JvdXApIHsKLSAgICAgIC8qIEZ1bGxzaXplIGNvbXBvbmVudHMgY2FuIGJlIHByb2Nlc3NlZCB3aXRob3V0IGFueSB3b3JrLiAqLwotICAgICAgdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0gZnVsbHNpemVfdXBzYW1wbGU7Ci0gICAgICBuZWVkX2J1ZmZlciA9IEZBTFNFOwotICAgIH0gZWxzZSBpZiAoaF9pbl9ncm91cCAqIDIgPT0gaF9vdXRfZ3JvdXAgJiYKLQkgICAgICAgdl9pbl9ncm91cCA9PSB2X291dF9ncm91cCkgewotICAgICAgLyogU3BlY2lhbCBjYXNlcyBmb3IgMmgxdiB1cHNhbXBsaW5nICovCi0gICAgICBpZiAoZG9fZmFuY3kgJiYgY29tcHB0ci0+ZG93bnNhbXBsZWRfd2lkdGggPiAyKQotCXVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjFfZmFuY3lfdXBzYW1wbGU7Ci0gICAgICBlbHNlCi0JdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0gaDJ2MV91cHNhbXBsZTsKLSAgICB9IGVsc2UgaWYgKGhfaW5fZ3JvdXAgKiAyID09IGhfb3V0X2dyb3VwICYmCi0JICAgICAgIHZfaW5fZ3JvdXAgKiAyID09IHZfb3V0X2dyb3VwKSB7Ci0gICAgICAvKiBTcGVjaWFsIGNhc2VzIGZvciAyaDJ2IHVwc2FtcGxpbmcgKi8KLSAgICAgIGlmIChkb19mYW5jeSAmJiBjb21wcHRyLT5kb3duc2FtcGxlZF93aWR0aCA+IDIpIHsKLQl1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYyX2ZhbmN5X3Vwc2FtcGxlOwotCXVwc2FtcGxlLT5wdWIubmVlZF9jb250ZXh0X3Jvd3MgPSBUUlVFOwotICAgICAgfSBlbHNlCi0JdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0gaDJ2Ml91cHNhbXBsZTsKLSAgICB9IGVsc2UgaWYgKChoX291dF9ncm91cCAlIGhfaW5fZ3JvdXApID09IDAgJiYKLQkgICAgICAgKHZfb3V0X2dyb3VwICUgdl9pbl9ncm91cCkgPT0gMCkgewotICAgICAgLyogR2VuZXJpYyBpbnRlZ3JhbC1mYWN0b3JzIHVwc2FtcGxpbmcgbWV0aG9kICovCi0gICAgICB1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBpbnRfdXBzYW1wbGU7Ci0gICAgICB1cHNhbXBsZS0+aF9leHBhbmRbY2ldID0gKFVJTlQ4KSAoaF9vdXRfZ3JvdXAgLyBoX2luX2dyb3VwKTsKLSAgICAgIHVwc2FtcGxlLT52X2V4cGFuZFtjaV0gPSAoVUlOVDgpICh2X291dF9ncm91cCAvIHZfaW5fZ3JvdXApOwotICAgIH0gZWxzZQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9GUkFDVF9TQU1QTEVfTk9USU1QTCk7Ci0gICAgaWYgKG5lZWRfYnVmZmVyKSB7Ci0gICAgICB1cHNhbXBsZS0+Y29sb3JfYnVmW2NpXSA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQotCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5vdXRwdXRfd2lkdGgsCi0JCQkJKGxvbmcpIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciksCi0JIChKRElNRU5TSU9OKSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpOwotICAgIH0KLSAgfQotfQotCi0jZW5kaWYgLy9fRlhfSlBFR19UVVJCT18KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkdHJhbnMuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkdHJhbnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU0NGYzNi4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZHRyYW5zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotI2lmICFkZWZpbmVkKF9GWF9KUEVHX1RVUkJPXykKLS8qCi0gKiBqZHRyYW5zLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBsaWJyYXJ5IHJvdXRpbmVzIGZvciB0cmFuc2NvZGluZyBkZWNvbXByZXNzaW9uLAotICogdGhhdCBpcywgcmVhZGluZyByYXcgRENUIGNvZWZmaWNpZW50IGFycmF5cyBmcm9tIGFuIGlucHV0IEpQRUcgZmlsZS4KLSAqIFRoZSByb3V0aW5lcyBpbiBqZGFwaW1pbi5jIHdpbGwgYWxzbyBiZSBuZWVkZWQgYnkgYSB0cmFuc2NvZGVyLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotTE9DQUwodm9pZCkgdHJhbnNkZWNvZGVfbWFzdGVyX3NlbGVjdGlvbiBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLQotCi0vKgotICogUmVhZCB0aGUgY29lZmZpY2llbnQgYXJyYXlzIGZyb20gYSBKUEVHIGZpbGUuCi0gKiBqcGVnX3JlYWRfaGVhZGVyIG11c3QgYmUgY29tcGxldGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMuCi0gKgotICogVGhlIGVudGlyZSBpbWFnZSBpcyByZWFkIGludG8gYSBzZXQgb2YgdmlydHVhbCBjb2VmZmljaWVudC1ibG9jayBhcnJheXMsCi0gKiBvbmUgcGVyIGNvbXBvbmVudC4gIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBwb2ludGVyIHRvIHRoZSBhcnJheSBvZgotICogdmlydHVhbC1hcnJheSBkZXNjcmlwdG9ycy4gIFRoZXNlIGNhbiBiZSBtYW5pcHVsYXRlZCBkaXJlY3RseSB2aWEgdGhlCi0gKiBKUEVHIG1lbW9yeSBtYW5hZ2VyLCBvciBoYW5kZWQgb2ZmIHRvIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkuCi0gKiBUbyByZWxlYXNlIHRoZSBtZW1vcnkgb2NjdXBpZWQgYnkgdGhlIHZpcnR1YWwgYXJyYXlzLCBjYWxsCi0gKiBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkgd2hlbiBkb25lIHdpdGggdGhlIGRhdGEuCi0gKgotICogQW4gYWx0ZXJuYXRpdmUgdXNhZ2UgaXMgdG8gc2ltcGx5IG9idGFpbiBhY2Nlc3MgdG8gdGhlIGNvZWZmaWNpZW50IGFycmF5cwotICogZHVyaW5nIGEgYnVmZmVyZWQtaW1hZ2UtbW9kZSBkZWNvbXByZXNzaW9uIG9wZXJhdGlvbi4gIFRoaXMgaXMgYWxsb3dlZAotICogYWZ0ZXIgYW55IGpwZWdfZmluaXNoX291dHB1dCgpIGNhbGwuICBUaGUgYXJyYXlzIGNhbiBiZSBhY2Nlc3NlZCB1bnRpbAotICoganBlZ19maW5pc2hfZGVjb21wcmVzcygpIGlzIGNhbGxlZC4gIChOb3RlIHRoYXQgYW55IGNhbGwgdG8gdGhlIGxpYnJhcnkKLSAqIG1heSByZXBvc2l0aW9uIHRoZSBhcnJheXMsIHNvIGRvbid0IHJlbHkgb24gYWNjZXNzX3ZpcnRfYmFycmF5KCkgcmVzdWx0cwotICogdG8gc3RheSB2YWxpZCBhY3Jvc3MgbGlicmFyeSBjYWxscy4pCi0gKgotICogUmV0dXJucyBOVUxMIGlmIHN1c3BlbmRlZC4gIFRoaXMgY2FzZSBuZWVkIGJlIGNoZWNrZWQgb25seSBpZgotICogYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlIGlzIHVzZWQuCi0gKi8KLQotR0xPQkFMKGp2aXJ0X2JhcnJheV9wdHIgKikKLWpwZWdfcmVhZF9jb2VmZmljaWVudHMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9SRUFEWSkgewotICAgIC8qIEZpcnN0IGNhbGw6IGluaXRpYWxpemUgYWN0aXZlIG1vZHVsZXMgKi8KLSAgICB0cmFuc2RlY29kZV9tYXN0ZXJfc2VsZWN0aW9uKGNpbmZvKTsKLSAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1JEQ09FRlM7Ci0gIH0KLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1JEQ09FRlMpIHsKLSAgICAvKiBBYnNvcmIgd2hvbGUgZmlsZSBpbnRvIHRoZSBjb2VmIGJ1ZmZlciAqLwotICAgIGZvciAoOzspIHsKLSAgICAgIGludCByZXRjb2RlOwotICAgICAgLyogQ2FsbCBwcm9ncmVzcyBtb25pdG9yIGhvb2sgaWYgcHJlc2VudCAqLwotICAgICAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKQotCSgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICAgICAgLyogQWJzb3JiIHNvbWUgbW9yZSBpbnB1dCAqLwotICAgICAgcmV0Y29kZSA9ICgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KSAoY2luZm8pOwotICAgICAgaWYgKHJldGNvZGUgPT0gSlBFR19TVVNQRU5ERUQpCi0JcmV0dXJuIE5VTEw7Ci0gICAgICBpZiAocmV0Y29kZSA9PSBKUEVHX1JFQUNIRURfRU9JKQotCWJyZWFrOwotICAgICAgLyogQWR2YW5jZSBwcm9ncmVzcyBjb3VudGVyIGlmIGFwcHJvcHJpYXRlICovCi0gICAgICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwgJiYKLQkgIChyZXRjb2RlID09IEpQRUdfUk9XX0NPTVBMRVRFRCB8fCByZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9TT1MpKSB7Ci0JaWYgKCsrY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPj0gY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0KSB7Ci0JICAvKiBzdGFydHVwIHVuZGVyZXN0aW1hdGVkIG51bWJlciBvZiBzY2FuczsgcmF0Y2hldCB1cCBvbmUgc2NhbiAqLwotCSAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ICs9IChsb25nKSBjaW5mby0+dG90YWxfaU1DVV9yb3dzOwotCX0KLSAgICAgIH0KLSAgICB9Ci0gICAgLyogU2V0IHN0YXRlIHNvIHRoYXQganBlZ19maW5pc2hfZGVjb21wcmVzcyBkb2VzIHRoZSByaWdodCB0aGluZyAqLwotICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfU1RPUFBJTkc7Ci0gIH0KLSAgLyogQXQgdGhpcyBwb2ludCB3ZSBzaG91bGQgYmUgaW4gc3RhdGUgRFNUQVRFX1NUT1BQSU5HIGlmIGJlaW5nIHVzZWQKLSAgICogc3RhbmRhbG9uZSwgb3IgaW4gc3RhdGUgRFNUQVRFX0JVRklNQUdFIGlmIGJlaW5nIGludm9rZWQgdG8gZ2V0IGFjY2VzcwotICAgKiB0byB0aGUgY29lZmZpY2llbnRzIGR1cmluZyBhIGZ1bGwgYnVmZmVyZWQtaW1hZ2UtbW9kZSBkZWNvbXByZXNzaW9uLgotICAgKi8KLSAgaWYgKChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9TVE9QUElORyB8fAotICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX0JVRklNQUdFKSAmJiBjaW5mby0+YnVmZmVyZWRfaW1hZ2UpIHsKLSAgICByZXR1cm4gY2luZm8tPmNvZWYtPmNvZWZfYXJyYXlzOwotICB9Ci0gIC8qIE9vcHMsIGltcHJvcGVyIHVzYWdlICovCi0gIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0gIHJldHVybiBOVUxMOwkJCS8qIGtlZXAgY29tcGlsZXIgaGFwcHkgKi8KLX0KLQotCi0vKgotICogTWFzdGVyIHNlbGVjdGlvbiBvZiBkZWNvbXByZXNzaW9uIG1vZHVsZXMgZm9yIHRyYW5zY29kaW5nLgotICogVGhpcyBzdWJzdGl0dXRlcyBmb3IgamRtYXN0ZXIuYydzIGluaXRpYWxpemF0aW9uIG9mIHRoZSBmdWxsIGRlY29tcHJlc3Nvci4KLSAqLwotCi1MT0NBTCh2b2lkKQotdHJhbnNkZWNvZGVfbWFzdGVyX3NlbGVjdGlvbiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgLyogVGhpcyBpcyBlZmZlY3RpdmVseSBhIGJ1ZmZlcmVkLWltYWdlIG9wZXJhdGlvbi4gKi8KLSAgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlID0gVFJVRTsKLQotICAvKiBFbnRyb3B5IGRlY29kaW5nOiBlaXRoZXIgSHVmZm1hbiBvciBhcml0aG1ldGljIGNvZGluZy4gKi8KLSAgaWYgKGNpbmZvLT5hcml0aF9jb2RlKSB7Ci0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9BUklUSF9OT1RJTVBMKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKLSNpZmRlZiBEX1BST0dSRVNTSVZFX1NVUFBPUlRFRAotICAgICAgamluaXRfcGh1ZmZfZGVjb2RlcihjaW5mbyk7Ci0jZWxzZQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOwotI2VuZGlmCi0gICAgfSBlbHNlCi0gICAgICBqaW5pdF9odWZmX2RlY29kZXIoY2luZm8pOwotICB9Ci0KLSAgLyogQWx3YXlzIGdldCBhIGZ1bGwtaW1hZ2UgY29lZmZpY2llbnQgYnVmZmVyLiAqLwotICBqaW5pdF9kX2NvZWZfY29udHJvbGxlcihjaW5mbywgVFJVRSk7Ci0KLSAgLyogV2UgY2FuIG5vdyB0ZWxsIHRoZSBtZW1vcnkgbWFuYWdlciB0byBhbGxvY2F0ZSB2aXJ0dWFsIGFycmF5cy4gKi8KLSAgKCpjaW5mby0+bWVtLT5yZWFsaXplX3ZpcnRfYXJyYXlzKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotCi0gIC8qIEluaXRpYWxpemUgaW5wdXQgc2lkZSBvZiBkZWNvbXByZXNzb3IgdG8gY29uc3VtZSBmaXJzdCBzY2FuLiAqLwotICAoKmNpbmZvLT5pbnB1dGN0bC0+c3RhcnRfaW5wdXRfcGFzcykgKGNpbmZvKTsKLQotICAvKiBJbml0aWFsaXplIHByb2dyZXNzIG1vbml0b3JpbmcuICovCi0gIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgIGludCBuc2NhbnM7Ci0gICAgLyogRXN0aW1hdGUgbnVtYmVyIG9mIHNjYW5zIHRvIHNldCBwYXNzX2xpbWl0LiAqLwotICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgewotICAgICAgLyogQXJiaXRyYXJpbHkgZXN0aW1hdGUgMiBpbnRlcmxlYXZlZCBEQyBzY2FucyArIDMgQUMgc2NhbnMvY29tcG9uZW50LiAqLwotICAgICAgbnNjYW5zID0gMiArIDMgKiBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgfSBlbHNlIGlmIChjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FucykgewotICAgICAgLyogRm9yIGEgbm9ucHJvZ3Jlc3NpdmUgbXVsdGlzY2FuIGZpbGUsIGVzdGltYXRlIDEgc2NhbiBwZXIgY29tcG9uZW50LiAqLwotICAgICAgbnNjYW5zID0gY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgIH0gZWxzZSB7Ci0gICAgICBuc2NhbnMgPSAxOwotICAgIH0KLSAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfY291bnRlciA9IDBMOwotICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+dG90YWxfaU1DVV9yb3dzICogbnNjYW5zOwotICAgIGNpbmZvLT5wcm9ncmVzcy0+Y29tcGxldGVkX3Bhc3NlcyA9IDA7Ci0gICAgY2luZm8tPnByb2dyZXNzLT50b3RhbF9wYXNzZXMgPSAxOwotICB9Ci19Ci0KLSNlbmRpZiAvL19GWF9KUEVHX1RVUkJPXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamVycm9yLmMgYi9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZXJyb3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgyZjg4OS4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZXJyb3IuYworKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0jaWYgIWRlZmluZWQoX0ZYX0pQRUdfVFVSQk9fKQotLyoKLSAqIGplcnJvci5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgc2ltcGxlIGVycm9yLXJlcG9ydGluZyBhbmQgdHJhY2UtbWVzc2FnZSByb3V0aW5lcy4KLSAqIFRoZXNlIGFyZSBzdWl0YWJsZSBmb3IgVW5peC1saWtlIHN5c3RlbXMgYW5kIG90aGVycyB3aGVyZSB3cml0aW5nIHRvCi0gKiBzdGRlcnIgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLiAgTWFueSBhcHBsaWNhdGlvbnMgd2lsbCB3YW50IHRvIHJlcGxhY2UKLSAqIHNvbWUgb3IgYWxsIG9mIHRoZXNlIHJvdXRpbmVzLgotICoKLSAqIFRoZXNlIHJvdXRpbmVzIGFyZSB1c2VkIGJ5IGJvdGggdGhlIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIGNvZGUuCi0gKi8KLQotLyogdGhpcyBpcyBub3QgYSBjb3JlIGxpYnJhcnkgbW9kdWxlLCBzbyBpdCBkb2Vzbid0IGRlZmluZSBKUEVHX0lOVEVSTkFMUyAqLwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImp2ZXJzaW9uLmgiCi0jaW5jbHVkZSAiamVycm9yLmgiCi0KLSNpZm5kZWYgRVhJVF9GQUlMVVJFCQkvKiBkZWZpbmUgZXhpdCgpIGNvZGVzIGlmIG5vdCBwcm92aWRlZCAqLwotI2RlZmluZSBFWElUX0ZBSUxVUkUgIDEKLSNlbmRpZgotCi0KLS8qCi0gKiBDcmVhdGUgdGhlIG1lc3NhZ2Ugc3RyaW5nIHRhYmxlLgotICogV2UgZG8gdGhpcyBmcm9tIHRoZSBtYXN0ZXIgbWVzc2FnZSBsaXN0IGluIGplcnJvci5oIGJ5IHJlLXJlYWRpbmcKLSAqIGplcnJvci5oIHdpdGggYSBzdWl0YWJsZSBkZWZpbml0aW9uIGZvciBtYWNybyBKTUVTU0FHRS4KLSAqIFRoZSBtZXNzYWdlIHRhYmxlIGlzIG1hZGUgYW4gZXh0ZXJuYWwgc3ltYm9sIGp1c3QgaW4gY2FzZSBhbnkgYXBwbGljYXRpb25zCi0gKiB3YW50IHRvIHJlZmVyIHRvIGl0IGRpcmVjdGx5LgotICovCi0KLSNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jZGVmaW5lIGpwZWdfc3RkX21lc3NhZ2VfdGFibGUJak1zZ1RhYmxlCi0jZW5kaWYKLQotI2RlZmluZSBKTUVTU0FHRShjb2RlLHN0cmluZykJc3RyaW5nICwKLQotY29uc3QgY2hhciAqIGNvbnN0IGpwZWdfc3RkX21lc3NhZ2VfdGFibGVbXSA9IHsKLSNpbmNsdWRlICJqZXJyb3IuaCIKLSAgTlVMTAotfTsKLQotCi0vKgotICogRXJyb3IgZXhpdCBoYW5kbGVyOiBtdXN0IG5vdCByZXR1cm4gdG8gY2FsbGVyLgotICoKLSAqIEFwcGxpY2F0aW9ucyBtYXkgb3ZlcnJpZGUgdGhpcyBpZiB0aGV5IHdhbnQgdG8gZ2V0IGNvbnRyb2wgYmFjayBhZnRlcgotICogYW4gZXJyb3IuICBUeXBpY2FsbHkgb25lIHdvdWxkIGxvbmdqbXAgc29tZXdoZXJlIGluc3RlYWQgb2YgZXhpdGluZy4KLSAqIFRoZSBzZXRqbXAgYnVmZmVyIGNhbiBiZSBtYWRlIGEgcHJpdmF0ZSBmaWVsZCB3aXRoaW4gYW4gZXhwYW5kZWQgZXJyb3IKLSAqIGhhbmRsZXIgb2JqZWN0LiAgTm90ZSB0aGF0IHRoZSBpbmZvIG5lZWRlZCB0byBnZW5lcmF0ZSBhbiBlcnJvciBtZXNzYWdlCi0gKiBpcyBzdG9yZWQgaW4gdGhlIGVycm9yIG9iamVjdCwgc28geW91IGNhbiBnZW5lcmF0ZSB0aGUgbWVzc2FnZSBub3cgb3IKLSAqIGxhdGVyLCBhdCB5b3VyIGNvbnZlbmllbmNlLgotICogWW91IHNob3VsZCBtYWtlIHN1cmUgdGhhdCB0aGUgSlBFRyBvYmplY3QgaXMgY2xlYW5lZCB1cCAod2l0aCBqcGVnX2Fib3J0Ci0gKiBvciBqcGVnX2Rlc3Ryb3kpIGF0IHNvbWUgcG9pbnQuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1lcnJvcl9leGl0IChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIC8qIEFsd2F5cyBkaXNwbGF5IHRoZSBtZXNzYWdlICovCi0gICgqY2luZm8tPmVyci0+b3V0cHV0X21lc3NhZ2UpIChjaW5mbyk7Ci0KLSAgLyogTGV0IHRoZSBtZW1vcnkgbWFuYWdlciBkZWxldGUgYW55IHRlbXAgZmlsZXMgYmVmb3JlIHdlIGRpZSAqLwotICBqcGVnX2Rlc3Ryb3koY2luZm8pOwotCi0vLyAgZXhpdChFWElUX0ZBSUxVUkUpOwotfQotCi0KLS8qCi0gKiBBY3R1YWwgb3V0cHV0IG9mIGFuIGVycm9yIG9yIHRyYWNlIG1lc3NhZ2UuCi0gKiBBcHBsaWNhdGlvbnMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHNlbmQgSlBFRyBtZXNzYWdlcyBzb21ld2hlcmUKLSAqIG90aGVyIHRoYW4gc3RkZXJyLgotICoKLSAqIE9uIFdpbmRvd3MsIHByaW50aW5nIHRvIHN0ZGVyciBpcyBnZW5lcmFsbHkgY29tcGxldGVseSB1c2VsZXNzLAotICogc28gd2UgcHJvdmlkZSBvcHRpb25hbCBjb2RlIHRvIHByb2R1Y2UgYW4gZXJyb3ItZGlhbG9nIHBvcHVwLgotICogTW9zdCBXaW5kb3dzIGFwcGxpY2F0aW9ucyB3aWxsIHN0aWxsIHByZWZlciB0byBvdmVycmlkZSB0aGlzIHJvdXRpbmUsCi0gKiBidXQgaWYgdGhleSBkb24ndCwgaXQnbGwgZG8gc29tZXRoaW5nIGF0IGxlYXN0IG1hcmdpbmFsbHkgdXNlZnVsLgotICoKLSAqIE5PVEU6IHRvIHVzZSB0aGUgbGlicmFyeSBpbiBhbiBlbnZpcm9ubWVudCB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUKLSAqIEMgc3RkaW8gbGlicmFyeSwgeW91IG1heSBoYXZlIHRvIGRlbGV0ZSB0aGUgY2FsbCB0byBmcHJpbnRmKCkgZW50aXJlbHksCi0gKiBub3QganVzdCBub3QgdXNlIHRoaXMgcm91dGluZS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLW91dHB1dF9tZXNzYWdlIChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIGNoYXIgYnVmZmVyW0pNU0dfTEVOR1RIX01BWF07Ci0KLSAgLyogQ3JlYXRlIHRoZSBtZXNzYWdlICovCi0gICgqY2luZm8tPmVyci0+Zm9ybWF0X21lc3NhZ2UpIChjaW5mbywgYnVmZmVyKTsKLQotICAvKiBTZW5kIGl0IHRvIHN0ZGVyciwgYWRkaW5nIGEgbmV3bGluZSAqLwotICBGWFNZU19mcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBidWZmZXIpOwotfQotCi0KLS8qCi0gKiBEZWNpZGUgd2hldGhlciB0byBlbWl0IGEgdHJhY2Ugb3Igd2FybmluZyBtZXNzYWdlLgotICogbXNnX2xldmVsIGlzIG9uZSBvZjoKLSAqICAgLTE6IHJlY292ZXJhYmxlIGNvcnJ1cHQtZGF0YSB3YXJuaW5nLCBtYXkgd2FudCB0byBhYm9ydC4KLSAqICAgIDA6IGltcG9ydGFudCBhZHZpc29yeSBtZXNzYWdlcyAoYWx3YXlzIGRpc3BsYXkgdG8gdXNlcikuCi0gKiAgICAxOiBmaXJzdCBsZXZlbCBvZiB0cmFjaW5nIGRldGFpbC4KLSAqICAgIDIsMywuLi46IHN1Y2Nlc3NpdmVseSBtb3JlIGRldGFpbGVkIHRyYWNpbmcgbWVzc2FnZXMuCi0gKiBBbiBhcHBsaWNhdGlvbiBtaWdodCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiBpdCB3YW50ZWQgdG8gYWJvcnQgb24gd2FybmluZ3MKLSAqIG9yIGNoYW5nZSB0aGUgcG9saWN5IGFib3V0IHdoaWNoIG1lc3NhZ2VzIHRvIGRpc3BsYXkuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1lbWl0X21lc3NhZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IG1zZ19sZXZlbCkKLXsKLSAgc3RydWN0IGpwZWdfZXJyb3JfbWdyICogZXJyID0gY2luZm8tPmVycjsKLQotICBpZiAobXNnX2xldmVsIDwgMCkgewotICAgIC8qIEl0J3MgYSB3YXJuaW5nIG1lc3NhZ2UuICBTaW5jZSBjb3JydXB0IGZpbGVzIG1heSBnZW5lcmF0ZSBtYW55IHdhcm5pbmdzLAotICAgICAqIHRoZSBwb2xpY3kgaW1wbGVtZW50ZWQgaGVyZSBpcyB0byBzaG93IG9ubHkgdGhlIGZpcnN0IHdhcm5pbmcsCi0gICAgICogdW5sZXNzIHRyYWNlX2xldmVsID49IDMuCi0gICAgICovCi0gICAgaWYgKGVyci0+bnVtX3dhcm5pbmdzID09IDAgfHwgZXJyLT50cmFjZV9sZXZlbCA+PSAzKQotICAgICAgKCplcnItPm91dHB1dF9tZXNzYWdlKSAoY2luZm8pOwotICAgIC8qIEFsd2F5cyBjb3VudCB3YXJuaW5ncyBpbiBudW1fd2FybmluZ3MuICovCi0gICAgZXJyLT5udW1fd2FybmluZ3MrKzsKLSAgfSBlbHNlIHsKLSAgICAvKiBJdCdzIGEgdHJhY2UgbWVzc2FnZS4gIFNob3cgaXQgaWYgdHJhY2VfbGV2ZWwgPj0gbXNnX2xldmVsLiAqLwotICAgIGlmIChlcnItPnRyYWNlX2xldmVsID49IG1zZ19sZXZlbCkKLSAgICAgICgqZXJyLT5vdXRwdXRfbWVzc2FnZSkgKGNpbmZvKTsKLSAgfQotfQotCi0KLS8qCi0gKiBGb3JtYXQgYSBtZXNzYWdlIHN0cmluZyBmb3IgdGhlIG1vc3QgcmVjZW50IEpQRUcgZXJyb3Igb3IgbWVzc2FnZS4KLSAqIFRoZSBtZXNzYWdlIGlzIHN0b3JlZCBpbnRvIGJ1ZmZlciwgd2hpY2ggc2hvdWxkIGJlIGF0IGxlYXN0IEpNU0dfTEVOR1RIX01BWAotICogY2hhcmFjdGVycy4gIE5vdGUgdGhhdCBubyAnXG4nIGNoYXJhY3RlciBpcyBhZGRlZCB0byB0aGUgc3RyaW5nLgotICogRmV3IGFwcGxpY2F0aW9ucyBzaG91bGQgbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZvcm1hdF9tZXNzYWdlIChqX2NvbW1vbl9wdHIgY2luZm8sIGNoYXIgKiBidWZmZXIpCi17Ci0jaWYgMAkvKiBYWVEgKi8KLSAgc3RydWN0IGpwZWdfZXJyb3JfbWdyICogZXJyID0gY2luZm8tPmVycjsKLSAgaW50IG1zZ19jb2RlID0gZXJyLT5tc2dfY29kZTsKLSAgY29uc3QgY2hhciAqIG1zZ3RleHQgPSBOVUxMOwotICBjb25zdCBjaGFyICogbXNncHRyOwotICBjaGFyIGNoOwotICBib29sZWFuIGlzc3RyaW5nOwotCi0gIC8qIExvb2sgdXAgbWVzc2FnZSBzdHJpbmcgaW4gcHJvcGVyIHRhYmxlICovCi0gIGlmIChtc2dfY29kZSA+IDAgJiYgbXNnX2NvZGUgPD0gZXJyLT5sYXN0X2pwZWdfbWVzc2FnZSkgewotICAgIG1zZ3RleHQgPSBlcnItPmpwZWdfbWVzc2FnZV90YWJsZVttc2dfY29kZV07Ci0gIH0gZWxzZSBpZiAoZXJyLT5hZGRvbl9tZXNzYWdlX3RhYmxlICE9IE5VTEwgJiYKLQkgICAgIG1zZ19jb2RlID49IGVyci0+Zmlyc3RfYWRkb25fbWVzc2FnZSAmJgotCSAgICAgbXNnX2NvZGUgPD0gZXJyLT5sYXN0X2FkZG9uX21lc3NhZ2UpIHsKLSAgICBtc2d0ZXh0ID0gZXJyLT5hZGRvbl9tZXNzYWdlX3RhYmxlW21zZ19jb2RlIC0gZXJyLT5maXJzdF9hZGRvbl9tZXNzYWdlXTsKLSAgfQotCi0gIC8qIERlZmVuZCBhZ2FpbnN0IGJvZ3VzIG1lc3NhZ2UgbnVtYmVyICovCi0gIGlmIChtc2d0ZXh0ID09IE5VTEwpIHsKLSAgICBlcnItPm1zZ19wYXJtLmlbMF0gPSBtc2dfY29kZTsKLSAgICBtc2d0ZXh0ID0gZXJyLT5qcGVnX21lc3NhZ2VfdGFibGVbMF07Ci0gIH0KLQotICAvKiBDaGVjayBmb3Igc3RyaW5nIHBhcmFtZXRlciwgYXMgaW5kaWNhdGVkIGJ5ICVzIGluIHRoZSBtZXNzYWdlIHRleHQgKi8KLSAgaXNzdHJpbmcgPSBGQUxTRTsKLSAgbXNncHRyID0gbXNndGV4dDsKLSAgd2hpbGUgKChjaCA9ICptc2dwdHIrKykgIT0gJ1wwJykgewotICAgIGlmIChjaCA9PSAnJScpIHsKLSAgICAgIGlmICgqbXNncHRyID09ICdzJykgaXNzdHJpbmcgPSBUUlVFOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLyogRm9ybWF0IHRoZSBtZXNzYWdlIGludG8gdGhlIHBhc3NlZCBidWZmZXIgKi8KLSAgaWYgKGlzc3RyaW5nKQotICAgIHNwcmludGYoYnVmZmVyLCBtc2d0ZXh0LCBlcnItPm1zZ19wYXJtLnMpOwotICBlbHNlCi0gICAgc3ByaW50ZihidWZmZXIsIG1zZ3RleHQsCi0JICAgIGVyci0+bXNnX3Bhcm0uaVswXSwgZXJyLT5tc2dfcGFybS5pWzFdLAotCSAgICBlcnItPm1zZ19wYXJtLmlbMl0sIGVyci0+bXNnX3Bhcm0uaVszXSwKLQkgICAgZXJyLT5tc2dfcGFybS5pWzRdLCBlcnItPm1zZ19wYXJtLmlbNV0sCi0JICAgIGVyci0+bXNnX3Bhcm0uaVs2XSwgZXJyLT5tc2dfcGFybS5pWzddKTsKLSNlbmRpZgotfQotCi0KLS8qCi0gKiBSZXNldCBlcnJvciBzdGF0ZSB2YXJpYWJsZXMgYXQgc3RhcnQgb2YgYSBuZXcgaW1hZ2UuCi0gKiBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgY29tcHJlc3Npb24gc3RhcnR1cCB0byByZXNldCB0cmFjZS9lcnJvcgotICogcHJvY2Vzc2luZyB0byBkZWZhdWx0IHN0YXRlLCB3aXRob3V0IGxvc2luZyBhbnkgYXBwbGljYXRpb24tc3BlY2lmaWMKLSAqIG1ldGhvZCBwb2ludGVycy4gIEFuIGFwcGxpY2F0aW9uIG1pZ2h0IHBvc3NpYmx5IHdhbnQgdG8gb3ZlcnJpZGUKLSAqIHRoaXMgbWV0aG9kIGlmIGl0IGhhcyBhZGRpdGlvbmFsIGVycm9yIHByb2Nlc3Npbmcgc3RhdGUuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1yZXNldF9lcnJvcl9tZ3IgKGpfY29tbW9uX3B0ciBjaW5mbykKLXsKLSAgY2luZm8tPmVyci0+bnVtX3dhcm5pbmdzID0gMDsKLSAgLyogdHJhY2VfbGV2ZWwgaXMgbm90IHJlc2V0IHNpbmNlIGl0IGlzIGFuIGFwcGxpY2F0aW9uLXN1cHBsaWVkIHBhcmFtZXRlciAqLwotICBjaW5mby0+ZXJyLT5tc2dfY29kZSA9IDA7CS8qIG1heSBiZSB1c2VmdWwgYXMgYSBmbGFnIGZvciAibm8gZXJyb3IiICovCi19Ci0KLQotLyoKLSAqIEZpbGwgaW4gdGhlIHN0YW5kYXJkIGVycm9yLWhhbmRsaW5nIG1ldGhvZHMgaW4gYSBqcGVnX2Vycm9yX21nciBvYmplY3QuCi0gKiBUeXBpY2FsIGNhbGwgaXM6Ci0gKglzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgY2luZm87Ci0gKglzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgZXJyOwotICoKLSAqCWNpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yKCZlcnIpOwotICogYWZ0ZXIgd2hpY2ggdGhlIGFwcGxpY2F0aW9uIG1heSBvdmVycmlkZSBzb21lIG9mIHRoZSBtZXRob2RzLgotICovCi0KLUdMT0JBTChzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKikKLWpwZWdfc3RkX2Vycm9yIChzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKiBlcnIpCi17Ci0gIGVyci0+ZXJyb3JfZXhpdCA9IGVycm9yX2V4aXQ7Ci0gIGVyci0+ZW1pdF9tZXNzYWdlID0gZW1pdF9tZXNzYWdlOwotICBlcnItPm91dHB1dF9tZXNzYWdlID0gb3V0cHV0X21lc3NhZ2U7Ci0gIGVyci0+Zm9ybWF0X21lc3NhZ2UgPSBmb3JtYXRfbWVzc2FnZTsKLSAgZXJyLT5yZXNldF9lcnJvcl9tZ3IgPSByZXNldF9lcnJvcl9tZ3I7Ci0KLSAgZXJyLT50cmFjZV9sZXZlbCA9IDA7CQkvKiBkZWZhdWx0ID0gbm8gdHJhY2luZyAqLwotICBlcnItPm51bV93YXJuaW5ncyA9IDA7CS8qIG5vIHdhcm5pbmdzIGVtaXR0ZWQgeWV0ICovCi0gIGVyci0+bXNnX2NvZGUgPSAwOwkJLyogbWF5IGJlIHVzZWZ1bCBhcyBhIGZsYWcgZm9yICJubyBlcnJvciIgKi8KLQotICAvKiBJbml0aWFsaXplIG1lc3NhZ2UgdGFibGUgcG9pbnRlcnMgKi8KLSAgZXJyLT5qcGVnX21lc3NhZ2VfdGFibGUgPSBqcGVnX3N0ZF9tZXNzYWdlX3RhYmxlOwotICBlcnItPmxhc3RfanBlZ19tZXNzYWdlID0gKGludCkgSk1TR19MQVNUTVNHQ09ERSAtIDE7Ci0KLSAgZXJyLT5hZGRvbl9tZXNzYWdlX3RhYmxlID0gTlVMTDsKLSAgZXJyLT5maXJzdF9hZGRvbl9tZXNzYWdlID0gMDsJLyogZm9yIHNhZmV0eSAqLwotICBlcnItPmxhc3RfYWRkb25fbWVzc2FnZSA9IDA7Ci0KLSAgcmV0dXJuIGVycjsKLX0KLQotI2VuZGlmIC8vX0ZYX0pQRUdfVFVSQk9fCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZmRjdGZzdC5jIGIvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamZkY3Rmc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk3OGI0Ni4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZmRjdGZzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLSNpZiAhZGVmaW5lZChfRlhfSlBFR19UVVJCT18pCi0vKgotICogamZkY3Rmc3QuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgZmFzdCwgbm90IHNvIGFjY3VyYXRlIGludGVnZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0gKiBmb3J3YXJkIERDVCAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuCi0gKgotICogQSAyLUQgRENUIGNhbiBiZSBkb25lIGJ5IDEtRCBEQ1Qgb24gZWFjaCByb3cgZm9sbG93ZWQgYnkgMS1EIERDVAotICogb24gZWFjaCBjb2x1bW4uICBEaXJlY3QgYWxnb3JpdGhtcyBhcmUgYWxzbyBhdmFpbGFibGUsIGJ1dCB0aGV5IGFyZQotICogbXVjaCBtb3JlIGNvbXBsZXggYW5kIHNlZW0gbm90IHRvIGJlIGFueSBmYXN0ZXIgd2hlbiByZWR1Y2VkIHRvIGNvZGUuCi0gKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBBcmFpLCBBZ3VpLCBhbmQgTmFrYWppbWEncyBhbGdvcml0aG0gZm9yCi0gKiBzY2FsZWQgRENULiAgVGhlaXIgb3JpZ2luYWwgcGFwZXIgKFRyYW5zLiBJRUlDRSBFLTcxKDExKToxMDk1KSBpcyBpbgotICogSmFwYW5lc2UsIGJ1dCB0aGUgYWxnb3JpdGhtIGlzIGRlc2NyaWJlZCBpbiB0aGUgUGVubmViYWtlciAmIE1pdGNoZWxsCi0gKiBKUEVHIHRleHRib29rIChzZWUgUkVGRVJFTkNFUyBzZWN0aW9uIGluIGZpbGUgUkVBRE1FKS4gIFRoZSBmb2xsb3dpbmcgY29kZQotICogaXMgYmFzZWQgZGlyZWN0bHkgb24gZmlndXJlIDQtOCBpbiBQJk0uCi0gKiBXaGlsZSBhbiA4LXBvaW50IERDVCBjYW5ub3QgYmUgZG9uZSBpbiBsZXNzIHRoYW4gMTEgbXVsdGlwbGllcywgaXQgaXMKLSAqIHBvc3NpYmxlIHRvIGFycmFuZ2UgdGhlIGNvbXB1dGF0aW9uIHNvIHRoYXQgbWFueSBvZiB0aGUgbXVsdGlwbGllcyBhcmUKLSAqIHNpbXBsZSBzY2FsaW5ncyBvZiB0aGUgZmluYWwgb3V0cHV0cy4gIFRoZXNlIG11bHRpcGxpZXMgY2FuIHRoZW4gYmUKLSAqIGZvbGRlZCBpbnRvIHRoZSBtdWx0aXBsaWNhdGlvbnMgb3IgZGl2aXNpb25zIGJ5IHRoZSBKUEVHIHF1YW50aXphdGlvbgotICogdGFibGUgZW50cmllcy4gIFRoZSBBQSZOIG1ldGhvZCBsZWF2ZXMgb25seSA1IG11bHRpcGxpZXMgYW5kIDI5IGFkZHMKLSAqIHRvIGJlIGRvbmUgaW4gdGhlIERDVCBpdHNlbGYuCi0gKiBUaGUgcHJpbWFyeSBkaXNhZHZhbnRhZ2Ugb2YgdGhpcyBtZXRob2QgaXMgdGhhdCB3aXRoIGZpeGVkLXBvaW50IG1hdGgsCi0gKiBhY2N1cmFjeSBpcyBsb3N0IGR1ZSB0byBpbXByZWNpc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNjYWxlZAotICogcXVhbnRpemF0aW9uIHZhbHVlcy4gIFRoZSBzbWFsbGVyIHRoZSBxdWFudGl6YXRpb24gdGFibGUgZW50cnksIHRoZSBsZXNzCi0gKiBwcmVjaXNlIHRoZSBzY2FsZWQgdmFsdWUsIHNvIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyB3b3JzZSB3aXRoIGhpZ2gtCi0gKiBxdWFsaXR5LXNldHRpbmcgZmlsZXMgdGhhbiB3aXRoIGxvdy1xdWFsaXR5IG9uZXMuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImpkY3QuaCIJCS8qIFByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBEQ1Qgc3Vic3lzdGVtICovCi0KLSNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECi0KLQotLyoKLSAqIFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgotICovCi0KLSNpZiBEQ1RTSVpFICE9IDgKLSAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLwotI2VuZGlmCi0KLQotLyogU2NhbGluZyBkZWNpc2lvbnMgYXJlIGdlbmVyYWxseSB0aGUgc2FtZSBhcyBpbiB0aGUgTEwmTSBhbGdvcml0aG07Ci0gKiBzZWUgamZkY3RpbnQuYyBmb3IgbW9yZSBkZXRhaWxzLiAgSG93ZXZlciwgd2UgY2hvb3NlIHRvIGRlc2NhbGUKLSAqIChyaWdodCBzaGlmdCkgbXVsdGlwbGljYXRpb24gcHJvZHVjdHMgYXMgc29vbiBhcyB0aGV5IGFyZSBmb3JtZWQsCi0gKiByYXRoZXIgdGhhbiBjYXJyeWluZyBhZGRpdGlvbmFsIGZyYWN0aW9uYWwgYml0cyBpbnRvIHN1YnNlcXVlbnQgYWRkaXRpb25zLgotICogVGhpcyBjb21wcm9taXNlcyBhY2N1cmFjeSBzbGlnaHRseSwgYnV0IGl0IGxldHMgdXMgc2F2ZSBhIGZldyBzaGlmdHMuCi0gKiBNb3JlIGltcG9ydGFudGx5LCAxNi1iaXQgYXJpdGhtZXRpYyBpcyB0aGVuIGFkZXF1YXRlIChmb3IgOC1iaXQgc2FtcGxlcykKLSAqIGV2ZXJ5d2hlcmUgZXhjZXB0IGluIHRoZSBtdWx0aXBsaWNhdGlvbnMgcHJvcGVyOyB0aGlzIHNhdmVzIGEgZ29vZCBkZWFsCi0gKiBvZiB3b3JrIG9uIDE2LWJpdC1pbnQgbWFjaGluZXMuCi0gKgotICogQWdhaW4gdG8gc2F2ZSBhIGZldyBzaGlmdHMsIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBiZXR3ZWVuIHBhc3MgMSBhbmQKLSAqIHBhc3MgMiBhcmUgbm90IHVwc2NhbGVkLCBidXQgYXJlIHJlcHJlc2VudGVkIG9ubHkgdG8gaW50ZWdyYWwgcHJlY2lzaW9uLgotICoKLSAqIEEgZmluYWwgY29tcHJvbWlzZSBpcyB0byByZXByZXNlbnQgdGhlIG11bHRpcGxpY2F0aXZlIGNvbnN0YW50cyB0byBvbmx5Ci0gKiA4IGZyYWN0aW9uYWwgYml0cywgcmF0aGVyIHRoYW4gMTMuICBUaGlzIHNhdmVzIHNvbWUgc2hpZnRpbmcgd29yayBvbiBzb21lCi0gKiBtYWNoaW5lcywgYW5kIG1heSBhbHNvIHJlZHVjZSB0aGUgY29zdCBvZiBtdWx0aXBsaWNhdGlvbiAoc2luY2UgdGhlcmUKLSAqIGFyZSBmZXdlciBvbmUtYml0cyBpbiB0aGUgY29uc3RhbnRzKS4KLSAqLwotCi0jZGVmaW5lIENPTlNUX0JJVFMgIDgKLQotCi0vKiBTb21lIEMgY29tcGlsZXJzIGZhaWwgdG8gcmVkdWNlICJGSVgoY29uc3RhbnQpIiBhdCBjb21waWxlIHRpbWUsIHRodXMKLSAqIGNhdXNpbmcgYSBsb3Qgb2YgdXNlbGVzcyBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zIGF0IHJ1biB0aW1lLgotICogVG8gZ2V0IGFyb3VuZCB0aGlzIHdlIHVzZSB0aGUgZm9sbG93aW5nIHByZS1jYWxjdWxhdGVkIGNvbnN0YW50cy4KLSAqIElmIHlvdSBjaGFuZ2UgQ09OU1RfQklUUyB5b3UgbWF5IHdhbnQgdG8gYWRkIGFwcHJvcHJpYXRlIHZhbHVlcy4KLSAqIChXaXRoIGEgcmVhc29uYWJsZSBDIGNvbXBpbGVyLCB5b3UgY2FuIGp1c3QgcmVseSBvbiB0aGUgRklYKCkgbWFjcm8uLi4pCi0gKi8KLQotI2lmIENPTlNUX0JJVFMgPT0gOAotI2RlZmluZSBGSVhfMF8zODI2ODM0MzMgICgoSU5UMzIpICAgOTgpCQkvKiBGSVgoMC4zODI2ODM0MzMpICovCi0jZGVmaW5lIEZJWF8wXzU0MTE5NjEwMCAgKChJTlQzMikgIDEzOSkJCS8qIEZJWCgwLjU0MTE5NjEwMCkgKi8KLSNkZWZpbmUgRklYXzBfNzA3MTA2NzgxICAoKElOVDMyKSAgMTgxKQkJLyogRklYKDAuNzA3MTA2NzgxKSAqLwotI2RlZmluZSBGSVhfMV8zMDY1NjI5NjUgICgoSU5UMzIpICAzMzQpCQkvKiBGSVgoMS4zMDY1NjI5NjUpICovCi0jZWxzZQotI2RlZmluZSBGSVhfMF8zODI2ODM0MzMgIEZJWCgwLjM4MjY4MzQzMykKLSNkZWZpbmUgRklYXzBfNTQxMTk2MTAwICBGSVgoMC41NDExOTYxMDApCi0jZGVmaW5lIEZJWF8wXzcwNzEwNjc4MSAgRklYKDAuNzA3MTA2NzgxKQotI2RlZmluZSBGSVhfMV8zMDY1NjI5NjUgIEZJWCgxLjMwNjU2Mjk2NSkKLSNlbmRpZgotCi0KLS8qIFdlIGNhbiBnYWluIGEgbGl0dGxlIG1vcmUgc3BlZWQsIHdpdGggYSBmdXJ0aGVyIGNvbXByb21pc2UgaW4gYWNjdXJhY3ksCi0gKiBieSBvbWl0dGluZyB0aGUgYWRkaXRpb24gaW4gYSBkZXNjYWxpbmcgc2hpZnQuICBUaGlzIHlpZWxkcyBhbiBpbmNvcnJlY3RseQotICogcm91bmRlZCByZXN1bHQgaGFsZiB0aGUgdGltZS4uLgotICovCi0KLSNpZm5kZWYgVVNFX0FDQ1VSQVRFX1JPVU5ESU5HCi0jdW5kZWYgREVTQ0FMRQotI2RlZmluZSBERVNDQUxFKHgsbikgIFJJR0hUX1NISUZUKHgsIG4pCi0jZW5kaWYKLQotCi0vKiBNdWx0aXBseSBhIERDVEVMRU0gdmFyaWFibGUgYnkgYW4gSU5UMzIgY29uc3RhbnQsIGFuZCBpbW1lZGlhdGVseQotICogZGVzY2FsZSB0byB5aWVsZCBhIERDVEVMRU0gcmVzdWx0LgotICovCi0KLSNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgKChEQ1RFTEVNKSBERVNDQUxFKCh2YXIpICogKGNvbnN0KSwgQ09OU1RfQklUUykpCi0KLQotLyoKLSAqIFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIG9uZSBibG9jayBvZiBzYW1wbGVzLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19mZGN0X2lmYXN0IChEQ1RFTEVNICogZGF0YSkKLXsKLSAgRENURUxFTSB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OwotICBEQ1RFTEVNIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOwotICBEQ1RFTEVNIHoxLCB6MiwgejMsIHo0LCB6NSwgejExLCB6MTM7Ci0gIERDVEVMRU0gKmRhdGFwdHI7Ci0gIGludCBjdHI7Ci0gIFNISUZUX1RFTVBTCi0KLSAgLyogUGFzcyAxOiBwcm9jZXNzIHJvd3MuICovCi0KLSAgZGF0YXB0ciA9IGRhdGE7Ci0gIGZvciAoY3RyID0gRENUU0laRS0xOyBjdHIgPj0gMDsgY3RyLS0pIHsKLSAgICB0bXAwID0gZGF0YXB0clswXSArIGRhdGFwdHJbN107Ci0gICAgdG1wNyA9IGRhdGFwdHJbMF0gLSBkYXRhcHRyWzddOwotICAgIHRtcDEgPSBkYXRhcHRyWzFdICsgZGF0YXB0cls2XTsKLSAgICB0bXA2ID0gZGF0YXB0clsxXSAtIGRhdGFwdHJbNl07Ci0gICAgdG1wMiA9IGRhdGFwdHJbMl0gKyBkYXRhcHRyWzVdOwotICAgIHRtcDUgPSBkYXRhcHRyWzJdIC0gZGF0YXB0cls1XTsKLSAgICB0bXAzID0gZGF0YXB0clszXSArIGRhdGFwdHJbNF07Ci0gICAgdG1wNCA9IGRhdGFwdHJbM10gLSBkYXRhcHRyWzRdOwotICAgIAotICAgIC8qIEV2ZW4gcGFydCAqLwotICAgIAotICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CS8qIHBoYXNlIDIgKi8KLSAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOwotICAgIHRtcDExID0gdG1wMSArIHRtcDI7Ci0gICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKLSAgICAKLSAgICBkYXRhcHRyWzBdID0gdG1wMTAgKyB0bXAxMTsgLyogcGhhc2UgMyAqLwotICAgIGRhdGFwdHJbNF0gPSB0bXAxMCAtIHRtcDExOwotICAgIAotICAgIHoxID0gTVVMVElQTFkodG1wMTIgKyB0bXAxMywgRklYXzBfNzA3MTA2NzgxKTsgLyogYzQgKi8KLSAgICBkYXRhcHRyWzJdID0gdG1wMTMgKyB6MTsJLyogcGhhc2UgNSAqLwotICAgIGRhdGFwdHJbNl0gPSB0bXAxMyAtIHoxOwotICAgIAotICAgIC8qIE9kZCBwYXJ0ICovCi0KLSAgICB0bXAxMCA9IHRtcDQgKyB0bXA1OwkvKiBwaGFzZSAyICovCi0gICAgdG1wMTEgPSB0bXA1ICsgdG1wNjsKLSAgICB0bXAxMiA9IHRtcDYgKyB0bXA3OwotCi0gICAgLyogVGhlIHJvdGF0b3IgaXMgbW9kaWZpZWQgZnJvbSBmaWcgNC04IHRvIGF2b2lkIGV4dHJhIG5lZ2F0aW9ucy4gKi8KLSAgICB6NSA9IE1VTFRJUExZKHRtcDEwIC0gdG1wMTIsIEZJWF8wXzM4MjY4MzQzMyk7IC8qIGM2ICovCi0gICAgejIgPSBNVUxUSVBMWSh0bXAxMCwgRklYXzBfNTQxMTk2MTAwKSArIHo1OyAvKiBjMi1jNiAqLwotICAgIHo0ID0gTVVMVElQTFkodG1wMTIsIEZJWF8xXzMwNjU2Mjk2NSkgKyB6NTsgLyogYzIrYzYgKi8KLSAgICB6MyA9IE1VTFRJUExZKHRtcDExLCBGSVhfMF83MDcxMDY3ODEpOyAvKiBjNCAqLwotCi0gICAgejExID0gdG1wNyArIHozOwkJLyogcGhhc2UgNSAqLwotICAgIHoxMyA9IHRtcDcgLSB6MzsKLQotICAgIGRhdGFwdHJbNV0gPSB6MTMgKyB6MjsJLyogcGhhc2UgNiAqLwotICAgIGRhdGFwdHJbM10gPSB6MTMgLSB6MjsKLSAgICBkYXRhcHRyWzFdID0gejExICsgejQ7Ci0gICAgZGF0YXB0cls3XSA9IHoxMSAtIHo0OwotCi0gICAgZGF0YXB0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCi0gIH0KLQotICAvKiBQYXNzIDI6IHByb2Nlc3MgY29sdW1ucy4gKi8KLQotICBkYXRhcHRyID0gZGF0YTsKLSAgZm9yIChjdHIgPSBEQ1RTSVpFLTE7IGN0ciA+PSAwOyBjdHItLSkgewotICAgIHRtcDAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gKyBkYXRhcHRyW0RDVFNJWkUqN107Ci0gICAgdG1wNyA9IGRhdGFwdHJbRENUU0laRSowXSAtIGRhdGFwdHJbRENUU0laRSo3XTsKLSAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdICsgZGF0YXB0cltEQ1RTSVpFKjZdOwotICAgIHRtcDYgPSBkYXRhcHRyW0RDVFNJWkUqMV0gLSBkYXRhcHRyW0RDVFNJWkUqNl07Ci0gICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXSArIGRhdGFwdHJbRENUU0laRSo1XTsKLSAgICB0bXA1ID0gZGF0YXB0cltEQ1RTSVpFKjJdIC0gZGF0YXB0cltEQ1RTSVpFKjVdOwotICAgIHRtcDMgPSBkYXRhcHRyW0RDVFNJWkUqM10gKyBkYXRhcHRyW0RDVFNJWkUqNF07Ci0gICAgdG1wNCA9IGRhdGFwdHJbRENUU0laRSozXSAtIGRhdGFwdHJbRENUU0laRSo0XTsKLSAgICAKLSAgICAvKiBFdmVuIHBhcnQgKi8KLSAgICAKLSAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOwkvKiBwaGFzZSAyICovCi0gICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKLSAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOwotICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7Ci0gICAgCi0gICAgZGF0YXB0cltEQ1RTSVpFKjBdID0gdG1wMTAgKyB0bXAxMTsgLyogcGhhc2UgMyAqLwotICAgIGRhdGFwdHJbRENUU0laRSo0XSA9IHRtcDEwIC0gdG1wMTE7Ci0gICAgCi0gICAgejEgPSBNVUxUSVBMWSh0bXAxMiArIHRtcDEzLCBGSVhfMF83MDcxMDY3ODEpOyAvKiBjNCAqLwotICAgIGRhdGFwdHJbRENUU0laRSoyXSA9IHRtcDEzICsgejE7IC8qIHBoYXNlIDUgKi8KLSAgICBkYXRhcHRyW0RDVFNJWkUqNl0gPSB0bXAxMyAtIHoxOwotICAgIAotICAgIC8qIE9kZCBwYXJ0ICovCi0KLSAgICB0bXAxMCA9IHRtcDQgKyB0bXA1OwkvKiBwaGFzZSAyICovCi0gICAgdG1wMTEgPSB0bXA1ICsgdG1wNjsKLSAgICB0bXAxMiA9IHRtcDYgKyB0bXA3OwotCi0gICAgLyogVGhlIHJvdGF0b3IgaXMgbW9kaWZpZWQgZnJvbSBmaWcgNC04IHRvIGF2b2lkIGV4dHJhIG5lZ2F0aW9ucy4gKi8KLSAgICB6NSA9IE1VTFRJUExZKHRtcDEwIC0gdG1wMTIsIEZJWF8wXzM4MjY4MzQzMyk7IC8qIGM2ICovCi0gICAgejIgPSBNVUxUSVBMWSh0bXAxMCwgRklYXzBfNTQxMTk2MTAwKSArIHo1OyAvKiBjMi1jNiAqLwotICAgIHo0ID0gTVVMVElQTFkodG1wMTIsIEZJWF8xXzMwNjU2Mjk2NSkgKyB6NTsgLyogYzIrYzYgKi8KLSAgICB6MyA9IE1VTFRJUExZKHRtcDExLCBGSVhfMF83MDcxMDY3ODEpOyAvKiBjNCAqLwotCi0gICAgejExID0gdG1wNyArIHozOwkJLyogcGhhc2UgNSAqLwotICAgIHoxMyA9IHRtcDcgLSB6MzsKLQotICAgIGRhdGFwdHJbRENUU0laRSo1XSA9IHoxMyArIHoyOyAvKiBwaGFzZSA2ICovCi0gICAgZGF0YXB0cltEQ1RTSVpFKjNdID0gejEzIC0gejI7Ci0gICAgZGF0YXB0cltEQ1RTSVpFKjFdID0gejExICsgejQ7Ci0gICAgZGF0YXB0cltEQ1RTSVpFKjddID0gejExIC0gejQ7Ci0KLSAgICBkYXRhcHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgY29sdW1uICovCi0gIH0KLX0KLQotI2VuZGlmIC8qIERDVF9JRkFTVF9TVVBQT1JURUQgKi8KLQotI2VuZGlmIC8vX0ZYX0pQRUdfVFVSQk9fCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZmRjdGludC5jIGIvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamZkY3RpbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg4NTA1Yi4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZmRjdGludC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLSNpZiAhZGVmaW5lZChfRlhfSlBFR19UVVJCT18pCi0vKgotICogamZkY3RpbnQuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgc2xvdy1idXQtYWNjdXJhdGUgaW50ZWdlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLSAqIGZvcndhcmQgRENUIChEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtKS4KLSAqCi0gKiBBIDItRCBEQ1QgY2FuIGJlIGRvbmUgYnkgMS1EIERDVCBvbiBlYWNoIHJvdyBmb2xsb3dlZCBieSAxLUQgRENUCi0gKiBvbiBlYWNoIGNvbHVtbi4gIERpcmVjdCBhbGdvcml0aG1zIGFyZSBhbHNvIGF2YWlsYWJsZSwgYnV0IHRoZXkgYXJlCi0gKiBtdWNoIG1vcmUgY29tcGxleCBhbmQgc2VlbSBub3QgdG8gYmUgYW55IGZhc3RlciB3aGVuIHJlZHVjZWQgdG8gY29kZS4KLSAqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIGFuIGFsZ29yaXRobSBkZXNjcmliZWQgaW4KLSAqICAgQy4gTG9lZmZsZXIsIEEuIExpZ3RlbmJlcmcgYW5kIEcuIE1vc2NoeXR6LCAiUHJhY3RpY2FsIEZhc3QgMS1EIERDVAotICogICBBbGdvcml0aG1zIHdpdGggMTEgTXVsdGlwbGljYXRpb25zIiwgUHJvYy4gSW50J2wuIENvbmYuIG9uIEFjb3VzdGljcywKLSAqICAgU3BlZWNoLCBhbmQgU2lnbmFsIFByb2Nlc3NpbmcgMTk4OSAoSUNBU1NQICc4OSksIHBwLiA5ODgtOTkxLgotICogVGhlIHByaW1hcnkgYWxnb3JpdGhtIGRlc2NyaWJlZCB0aGVyZSB1c2VzIDExIG11bHRpcGxpZXMgYW5kIDI5IGFkZHMuCi0gKiBXZSB1c2UgdGhlaXIgYWx0ZXJuYXRlIG1ldGhvZCB3aXRoIDEyIG11bHRpcGxpZXMgYW5kIDMyIGFkZHMuCi0gKiBUaGUgYWR2YW50YWdlIG9mIHRoaXMgbWV0aG9kIGlzIHRoYXQgbm8gZGF0YSBwYXRoIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUKLSAqIG11bHRpcGxpY2F0aW9uOyB0aGlzIGFsbG93cyBhIHZlcnkgc2ltcGxlIGFuZCBhY2N1cmF0ZSBpbXBsZW1lbnRhdGlvbiBpbgotICogc2NhbGVkIGZpeGVkLXBvaW50IGFyaXRobWV0aWMsIHdpdGggYSBtaW5pbWFsIG51bWJlciBvZiBzaGlmdHMuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImpkY3QuaCIJCS8qIFByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBEQ1Qgc3Vic3lzdGVtICovCi0KLSNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECi0KLQotLyoKLSAqIFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgotICovCi0KLSNpZiBEQ1RTSVpFICE9IDgKLSAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLwotI2VuZGlmCi0KLQotLyoKLSAqIFRoZSBwb29wIG9uIHRoaXMgc2NhbGluZyBzdHVmZiBpcyBhcyBmb2xsb3dzOgotICoKLSAqIEVhY2ggMS1EIERDVCBzdGVwIHByb2R1Y2VzIG91dHB1dHMgd2hpY2ggYXJlIGEgZmFjdG9yIG9mIHNxcnQoTikKLSAqIGxhcmdlciB0aGFuIHRoZSB0cnVlIERDVCBvdXRwdXRzLiAgVGhlIGZpbmFsIG91dHB1dHMgYXJlIHRoZXJlZm9yZQotICogYSBmYWN0b3Igb2YgTiBsYXJnZXIgdGhhbiBkZXNpcmVkOyBzaW5jZSBOPTggdGhpcyBjYW4gYmUgY3VyZWQgYnkKLSAqIGEgc2ltcGxlIHJpZ2h0IHNoaWZ0IGF0IHRoZSBlbmQgb2YgdGhlIGFsZ29yaXRobS4gIFRoZSBhZHZhbnRhZ2Ugb2YKLSAqIHRoaXMgYXJyYW5nZW1lbnQgaXMgdGhhdCB3ZSBzYXZlIHR3byBtdWx0aXBsaWNhdGlvbnMgcGVyIDEtRCBEQ1QsCi0gKiBiZWNhdXNlIHRoZSB5MCBhbmQgeTQgb3V0cHV0cyBuZWVkIG5vdCBiZSBkaXZpZGVkIGJ5IHNxcnQoTikuCi0gKiBJbiB0aGUgSUpHIGNvZGUsIHRoaXMgZmFjdG9yIG9mIDggaXMgcmVtb3ZlZCBieSB0aGUgcXVhbnRpemF0aW9uIHN0ZXAKLSAqIChpbiBqY2RjdG1nci5jKSwgTk9UIGluIHRoaXMgbW9kdWxlLgotICoKLSAqIFdlIGhhdmUgdG8gZG8gYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uIG9mIHRoZSBpbnRlZ2VyIGlucHV0cywgd2hpY2gKLSAqIGlzIG5vIHByb2JsZW0sIGFuZCBtdWx0aXBsaWNhdGlvbiBieSBmcmFjdGlvbmFsIGNvbnN0YW50cywgd2hpY2ggaXMKLSAqIGEgcHJvYmxlbSB0byBkbyBpbiBpbnRlZ2VyIGFyaXRobWV0aWMuICBXZSBtdWx0aXBseSBhbGwgdGhlIGNvbnN0YW50cwotICogYnkgQ09OU1RfU0NBTEUgYW5kIGNvbnZlcnQgdGhlbSB0byBpbnRlZ2VyIGNvbnN0YW50cyAodGh1cyByZXRhaW5pbmcKLSAqIENPTlNUX0JJVFMgYml0cyBvZiBwcmVjaXNpb24gaW4gdGhlIGNvbnN0YW50cykuICBBZnRlciBkb2luZyBhCi0gKiBtdWx0aXBsaWNhdGlvbiB3ZSBoYXZlIHRvIGRpdmlkZSB0aGUgcHJvZHVjdCBieSBDT05TVF9TQ0FMRSwgd2l0aCBwcm9wZXIKLSAqIHJvdW5kaW5nLCB0byBwcm9kdWNlIHRoZSBjb3JyZWN0IG91dHB1dC4gIFRoaXMgZGl2aXNpb24gY2FuIGJlIGRvbmUKLSAqIGNoZWFwbHkgYXMgYSByaWdodCBzaGlmdCBvZiBDT05TVF9CSVRTIGJpdHMuICBXZSBwb3N0cG9uZSBzaGlmdGluZwotICogYXMgbG9uZyBhcyBwb3NzaWJsZSBzbyB0aGF0IHBhcnRpYWwgc3VtcyBjYW4gYmUgYWRkZWQgdG9nZXRoZXIgd2l0aAotICogZnVsbCBmcmFjdGlvbmFsIHByZWNpc2lvbi4KLSAqCi0gKiBUaGUgb3V0cHV0cyBvZiB0aGUgZmlyc3QgcGFzcyBhcmUgc2NhbGVkIHVwIGJ5IFBBU1MxX0JJVFMgYml0cyBzbyB0aGF0Ci0gKiB0aGV5IGFyZSByZXByZXNlbnRlZCB0byBiZXR0ZXItdGhhbi1pbnRlZ3JhbCBwcmVjaXNpb24uICBUaGVzZSBvdXRwdXRzCi0gKiByZXF1aXJlIEJJVFNfSU5fSlNBTVBMRSArIFBBU1MxX0JJVFMgKyAzIGJpdHM7IHRoaXMgZml0cyBpbiBhIDE2LWJpdCB3b3JkCi0gKiB3aXRoIHRoZSByZWNvbW1lbmRlZCBzY2FsaW5nLiAgKEZvciAxMi1iaXQgc2FtcGxlIGRhdGEsIHRoZSBpbnRlcm1lZGlhdGUKLSAqIGFycmF5IGlzIElOVDMyIGFueXdheS4pCi0gKgotICogVG8gYXZvaWQgb3ZlcmZsb3cgb2YgdGhlIDMyLWJpdCBpbnRlcm1lZGlhdGUgcmVzdWx0cyBpbiBwYXNzIDIsIHdlIG11c3QKLSAqIGhhdmUgQklUU19JTl9KU0FNUExFICsgQ09OU1RfQklUUyArIFBBU1MxX0JJVFMgPD0gMjYuICBFcnJvciBhbmFseXNpcwotICogc2hvd3MgdGhhdCB0aGUgdmFsdWVzIGdpdmVuIGJlbG93IGFyZSB0aGUgbW9zdCBlZmZlY3RpdmUuCi0gKi8KLQotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci0jZGVmaW5lIENPTlNUX0JJVFMgIDEzCi0jZGVmaW5lIFBBU1MxX0JJVFMgIDIKLSNlbHNlCi0jZGVmaW5lIENPTlNUX0JJVFMgIDEzCi0jZGVmaW5lIFBBU1MxX0JJVFMgIDEJCS8qIGxvc2UgYSBsaXR0bGUgcHJlY2lzaW9uIHRvIGF2b2lkIG92ZXJmbG93ICovCi0jZW5kaWYKLQotLyogU29tZSBDIGNvbXBpbGVycyBmYWlsIHRvIHJlZHVjZSAiRklYKGNvbnN0YW50KSIgYXQgY29tcGlsZSB0aW1lLCB0aHVzCi0gKiBjYXVzaW5nIGEgbG90IG9mIHVzZWxlc3MgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyBhdCBydW4gdGltZS4KLSAqIFRvIGdldCBhcm91bmQgdGhpcyB3ZSB1c2UgdGhlIGZvbGxvd2luZyBwcmUtY2FsY3VsYXRlZCBjb25zdGFudHMuCi0gKiBJZiB5b3UgY2hhbmdlIENPTlNUX0JJVFMgeW91IG1heSB3YW50IHRvIGFkZCBhcHByb3ByaWF0ZSB2YWx1ZXMuCi0gKiAoV2l0aCBhIHJlYXNvbmFibGUgQyBjb21waWxlciwgeW91IGNhbiBqdXN0IHJlbHkgb24gdGhlIEZJWCgpIG1hY3JvLi4uKQotICovCi0KLSNpZiBDT05TVF9CSVRTID09IDEzCi0jZGVmaW5lIEZJWF8wXzI5ODYzMTMzNiAgKChJTlQzMikgIDI0NDYpCS8qIEZJWCgwLjI5ODYzMTMzNikgKi8KLSNkZWZpbmUgRklYXzBfMzkwMTgwNjQ0ICAoKElOVDMyKSAgMzE5NikJLyogRklYKDAuMzkwMTgwNjQ0KSAqLwotI2RlZmluZSBGSVhfMF81NDExOTYxMDAgICgoSU5UMzIpICA0NDMzKQkvKiBGSVgoMC41NDExOTYxMDApICovCi0jZGVmaW5lIEZJWF8wXzc2NTM2Njg2NSAgKChJTlQzMikgIDYyNzApCS8qIEZJWCgwLjc2NTM2Njg2NSkgKi8KLSNkZWZpbmUgRklYXzBfODk5OTc2MjIzICAoKElOVDMyKSAgNzM3MykJLyogRklYKDAuODk5OTc2MjIzKSAqLwotI2RlZmluZSBGSVhfMV8xNzU4NzU2MDIgICgoSU5UMzIpICA5NjMzKQkvKiBGSVgoMS4xNzU4NzU2MDIpICovCi0jZGVmaW5lIEZJWF8xXzUwMTMyMTExMCAgKChJTlQzMikgIDEyMjk5KQkvKiBGSVgoMS41MDEzMjExMTApICovCi0jZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAgKChJTlQzMikgIDE1MTM3KQkvKiBGSVgoMS44NDc3NTkwNjUpICovCi0jZGVmaW5lIEZJWF8xXzk2MTU3MDU2MCAgKChJTlQzMikgIDE2MDY5KQkvKiBGSVgoMS45NjE1NzA1NjApICovCi0jZGVmaW5lIEZJWF8yXzA1MzExOTg2OSAgKChJTlQzMikgIDE2ODE5KQkvKiBGSVgoMi4wNTMxMTk4NjkpICovCi0jZGVmaW5lIEZJWF8yXzU2MjkxNTQ0NyAgKChJTlQzMikgIDIwOTk1KQkvKiBGSVgoMi41NjI5MTU0NDcpICovCi0jZGVmaW5lIEZJWF8zXzA3MjcxMTAyNiAgKChJTlQzMikgIDI1MTcyKQkvKiBGSVgoMy4wNzI3MTEwMjYpICovCi0jZWxzZQotI2RlZmluZSBGSVhfMF8yOTg2MzEzMzYgIEZJWCgwLjI5ODYzMTMzNikKLSNkZWZpbmUgRklYXzBfMzkwMTgwNjQ0ICBGSVgoMC4zOTAxODA2NDQpCi0jZGVmaW5lIEZJWF8wXzU0MTE5NjEwMCAgRklYKDAuNTQxMTk2MTAwKQotI2RlZmluZSBGSVhfMF83NjUzNjY4NjUgIEZJWCgwLjc2NTM2Njg2NSkKLSNkZWZpbmUgRklYXzBfODk5OTc2MjIzICBGSVgoMC44OTk5NzYyMjMpCi0jZGVmaW5lIEZJWF8xXzE3NTg3NTYwMiAgRklYKDEuMTc1ODc1NjAyKQotI2RlZmluZSBGSVhfMV81MDEzMjExMTAgIEZJWCgxLjUwMTMyMTExMCkKLSNkZWZpbmUgRklYXzFfODQ3NzU5MDY1ICBGSVgoMS44NDc3NTkwNjUpCi0jZGVmaW5lIEZJWF8xXzk2MTU3MDU2MCAgRklYKDEuOTYxNTcwNTYwKQotI2RlZmluZSBGSVhfMl8wNTMxMTk4NjkgIEZJWCgyLjA1MzExOTg2OSkKLSNkZWZpbmUgRklYXzJfNTYyOTE1NDQ3ICBGSVgoMi41NjI5MTU0NDcpCi0jZGVmaW5lIEZJWF8zXzA3MjcxMTAyNiAgRklYKDMuMDcyNzExMDI2KQotI2VuZGlmCi0KLQotLyogTXVsdGlwbHkgYW4gSU5UMzIgdmFyaWFibGUgYnkgYW4gSU5UMzIgY29uc3RhbnQgdG8geWllbGQgYW4gSU5UMzIgcmVzdWx0LgotICogRm9yIDgtYml0IHNhbXBsZXMgd2l0aCB0aGUgcmVjb21tZW5kZWQgc2NhbGluZywgYWxsIHRoZSB2YXJpYWJsZQotICogYW5kIGNvbnN0YW50IHZhbHVlcyBpbnZvbHZlZCBhcmUgbm8gbW9yZSB0aGFuIDE2IGJpdHMgd2lkZSwgc28gYQotICogMTZ4MTYtPjMyIGJpdCBtdWx0aXBseSBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGEgZnVsbCAzMngzMiBtdWx0aXBseS4KLSAqIEZvciAxMi1iaXQgc2FtcGxlcywgYSBmdWxsIDMyLWJpdCBtdWx0aXBsaWNhdGlvbiB3aWxsIGJlIG5lZWRlZC4KLSAqLwotCi0jaWYgQklUU19JTl9KU0FNUExFID09IDgKLSNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgTVVMVElQTFkxNkMxNih2YXIsY29uc3QpCi0jZWxzZQotI2RlZmluZSBNVUxUSVBMWSh2YXIsY29uc3QpICAoKHZhcikgKiAoY29uc3QpKQotI2VuZGlmCi0KLQotLyoKLSAqIFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIG9uZSBibG9jayBvZiBzYW1wbGVzLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19mZGN0X2lzbG93IChEQ1RFTEVNICogZGF0YSkKLXsKLSAgSU5UMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKLSAgSU5UMzIgdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTM7Ci0gIElOVDMyIHoxLCB6MiwgejMsIHo0LCB6NTsKLSAgRENURUxFTSAqZGF0YXB0cjsKLSAgaW50IGN0cjsKLSAgU0hJRlRfVEVNUFMKLQotICAvKiBQYXNzIDE6IHByb2Nlc3Mgcm93cy4gKi8KLSAgLyogTm90ZSByZXN1bHRzIGFyZSBzY2FsZWQgdXAgYnkgc3FydCg4KSBjb21wYXJlZCB0byBhIHRydWUgRENUOyAqLwotICAvKiBmdXJ0aGVybW9yZSwgd2Ugc2NhbGUgdGhlIHJlc3VsdHMgYnkgMioqUEFTUzFfQklUUy4gKi8KLQotICBkYXRhcHRyID0gZGF0YTsKLSAgZm9yIChjdHIgPSBEQ1RTSVpFLTE7IGN0ciA+PSAwOyBjdHItLSkgewotICAgIHRtcDAgPSBkYXRhcHRyWzBdICsgZGF0YXB0cls3XTsKLSAgICB0bXA3ID0gZGF0YXB0clswXSAtIGRhdGFwdHJbN107Ci0gICAgdG1wMSA9IGRhdGFwdHJbMV0gKyBkYXRhcHRyWzZdOwotICAgIHRtcDYgPSBkYXRhcHRyWzFdIC0gZGF0YXB0cls2XTsKLSAgICB0bXAyID0gZGF0YXB0clsyXSArIGRhdGFwdHJbNV07Ci0gICAgdG1wNSA9IGRhdGFwdHJbMl0gLSBkYXRhcHRyWzVdOwotICAgIHRtcDMgPSBkYXRhcHRyWzNdICsgZGF0YXB0cls0XTsKLSAgICB0bXA0ID0gZGF0YXB0clszXSAtIGRhdGFwdHJbNF07Ci0gICAgCi0gICAgLyogRXZlbiBwYXJ0IHBlciBMTCZNIGZpZ3VyZSAxIC0tLSBub3RlIHRoYXQgcHVibGlzaGVkIGZpZ3VyZSBpcyBmYXVsdHk7Ci0gICAgICogcm90YXRvciAic3FydCgyKSpjMSIgc2hvdWxkIGJlICJzcXJ0KDIpKmM2Ii4KLSAgICAgKi8KLSAgICAKLSAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOwotICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7Ci0gICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKLSAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOwotICAgIAotICAgIGRhdGFwdHJbMF0gPSAoRENURUxFTSkgKCh0bXAxMCArIHRtcDExKSA8PCBQQVNTMV9CSVRTKTsKLSAgICBkYXRhcHRyWzRdID0gKERDVEVMRU0pICgodG1wMTAgLSB0bXAxMSkgPDwgUEFTUzFfQklUUyk7Ci0gICAgCi0gICAgejEgPSBNVUxUSVBMWSh0bXAxMiArIHRtcDEzLCBGSVhfMF81NDExOTYxMDApOwotICAgIGRhdGFwdHJbMl0gPSAoRENURUxFTSkgREVTQ0FMRSh6MSArIE1VTFRJUExZKHRtcDEzLCBGSVhfMF83NjUzNjY4NjUpLAotCQkJCSAgIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7Ci0gICAgZGF0YXB0cls2XSA9IChEQ1RFTEVNKSBERVNDQUxFKHoxICsgTVVMVElQTFkodG1wMTIsIC0gRklYXzFfODQ3NzU5MDY1KSwKLQkJCQkgICBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOwotICAgIAotICAgIC8qIE9kZCBwYXJ0IHBlciBmaWd1cmUgOCAtLS0gbm90ZSBwYXBlciBvbWl0cyBmYWN0b3Igb2Ygc3FydCgyKS4KLSAgICAgKiBjSyByZXByZXNlbnRzIGNvcyhLKnBpLzE2KS4KLSAgICAgKiBpMC4uaTMgaW4gdGhlIHBhcGVyIGFyZSB0bXA0Li50bXA3IGhlcmUuCi0gICAgICovCi0gICAgCi0gICAgejEgPSB0bXA0ICsgdG1wNzsKLSAgICB6MiA9IHRtcDUgKyB0bXA2OwotICAgIHozID0gdG1wNCArIHRtcDY7Ci0gICAgejQgPSB0bXA1ICsgdG1wNzsKLSAgICB6NSA9IE1VTFRJUExZKHozICsgejQsIEZJWF8xXzE3NTg3NTYwMik7IC8qIHNxcnQoMikgKiBjMyAqLwotICAgIAotICAgIHRtcDQgPSBNVUxUSVBMWSh0bXA0LCBGSVhfMF8yOTg2MzEzMzYpOyAvKiBzcXJ0KDIpICogKC1jMStjMytjNS1jNykgKi8KLSAgICB0bXA1ID0gTVVMVElQTFkodG1wNSwgRklYXzJfMDUzMTE5ODY5KTsgLyogc3FydCgyKSAqICggYzErYzMtYzUrYzcpICovCi0gICAgdG1wNiA9IE1VTFRJUExZKHRtcDYsIEZJWF8zXzA3MjcxMTAyNik7IC8qIHNxcnQoMikgKiAoIGMxK2MzK2M1LWM3KSAqLwotICAgIHRtcDcgPSBNVUxUSVBMWSh0bXA3LCBGSVhfMV81MDEzMjExMTApOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNS1jNykgKi8KLSAgICB6MSA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzg5OTk3NjIyMyk7IC8qIHNxcnQoMikgKiAoYzctYzMpICovCi0gICAgejIgPSBNVUxUSVBMWSh6MiwgLSBGSVhfMl81NjI5MTU0NDcpOyAvKiBzcXJ0KDIpICogKC1jMS1jMykgKi8KLSAgICB6MyA9IE1VTFRJUExZKHozLCAtIEZJWF8xXzk2MTU3MDU2MCk7IC8qIHNxcnQoMikgKiAoLWMzLWM1KSAqLwotICAgIHo0ID0gTVVMVElQTFkoejQsIC0gRklYXzBfMzkwMTgwNjQ0KTsgLyogc3FydCgyKSAqIChjNS1jMykgKi8KLSAgICAKLSAgICB6MyArPSB6NTsKLSAgICB6NCArPSB6NTsKLSAgICAKLSAgICBkYXRhcHRyWzddID0gKERDVEVMRU0pIERFU0NBTEUodG1wNCArIHoxICsgejMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7Ci0gICAgZGF0YXB0cls1XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDUgKyB6MiArIHo0LCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOwotICAgIGRhdGFwdHJbM10gPSAoRENURUxFTSkgREVTQ0FMRSh0bXA2ICsgejIgKyB6MywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKLSAgICBkYXRhcHRyWzFdID0gKERDVEVMRU0pIERFU0NBTEUodG1wNyArIHoxICsgejQsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7Ci0gICAgCi0gICAgZGF0YXB0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCi0gIH0KLQotICAvKiBQYXNzIDI6IHByb2Nlc3MgY29sdW1ucy4KLSAgICogV2UgcmVtb3ZlIHRoZSBQQVNTMV9CSVRTIHNjYWxpbmcsIGJ1dCBsZWF2ZSB0aGUgcmVzdWx0cyBzY2FsZWQgdXAKLSAgICogYnkgYW4gb3ZlcmFsbCBmYWN0b3Igb2YgOC4KLSAgICovCi0KLSAgZGF0YXB0ciA9IGRhdGE7Ci0gIGZvciAoY3RyID0gRENUU0laRS0xOyBjdHIgPj0gMDsgY3RyLS0pIHsKLSAgICB0bXAwID0gZGF0YXB0cltEQ1RTSVpFKjBdICsgZGF0YXB0cltEQ1RTSVpFKjddOwotICAgIHRtcDcgPSBkYXRhcHRyW0RDVFNJWkUqMF0gLSBkYXRhcHRyW0RDVFNJWkUqN107Ci0gICAgdG1wMSA9IGRhdGFwdHJbRENUU0laRSoxXSArIGRhdGFwdHJbRENUU0laRSo2XTsKLSAgICB0bXA2ID0gZGF0YXB0cltEQ1RTSVpFKjFdIC0gZGF0YXB0cltEQ1RTSVpFKjZdOwotICAgIHRtcDIgPSBkYXRhcHRyW0RDVFNJWkUqMl0gKyBkYXRhcHRyW0RDVFNJWkUqNV07Ci0gICAgdG1wNSA9IGRhdGFwdHJbRENUU0laRSoyXSAtIGRhdGFwdHJbRENUU0laRSo1XTsKLSAgICB0bXAzID0gZGF0YXB0cltEQ1RTSVpFKjNdICsgZGF0YXB0cltEQ1RTSVpFKjRdOwotICAgIHRtcDQgPSBkYXRhcHRyW0RDVFNJWkUqM10gLSBkYXRhcHRyW0RDVFNJWkUqNF07Ci0gICAgCi0gICAgLyogRXZlbiBwYXJ0IHBlciBMTCZNIGZpZ3VyZSAxIC0tLSBub3RlIHRoYXQgcHVibGlzaGVkIGZpZ3VyZSBpcyBmYXVsdHk7Ci0gICAgICogcm90YXRvciAic3FydCgyKSpjMSIgc2hvdWxkIGJlICJzcXJ0KDIpKmM2Ii4KLSAgICAgKi8KLSAgICAKLSAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOwotICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7Ci0gICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKLSAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOwotICAgIAotICAgIGRhdGFwdHJbRENUU0laRSowXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEwICsgdG1wMTEsIFBBU1MxX0JJVFMpOwotICAgIGRhdGFwdHJbRENUU0laRSo0XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDEwIC0gdG1wMTEsIFBBU1MxX0JJVFMpOwotICAgIAotICAgIHoxID0gTVVMVElQTFkodG1wMTIgKyB0bXAxMywgRklYXzBfNTQxMTk2MTAwKTsKLSAgICBkYXRhcHRyW0RDVFNJWkUqMl0gPSAoRENURUxFTSkgREVTQ0FMRSh6MSArIE1VTFRJUExZKHRtcDEzLCBGSVhfMF83NjUzNjY4NjUpLAotCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOwotICAgIGRhdGFwdHJbRENUU0laRSo2XSA9IChEQ1RFTEVNKSBERVNDQUxFKHoxICsgTVVMVElQTFkodG1wMTIsIC0gRklYXzFfODQ3NzU5MDY1KSwKLQkJCQkJICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKLSAgICAKLSAgICAvKiBPZGQgcGFydCBwZXIgZmlndXJlIDggLS0tIG5vdGUgcGFwZXIgb21pdHMgZmFjdG9yIG9mIHNxcnQoMikuCi0gICAgICogY0sgcmVwcmVzZW50cyBjb3MoSypwaS8xNikuCi0gICAgICogaTAuLmkzIGluIHRoZSBwYXBlciBhcmUgdG1wNC4udG1wNyBoZXJlLgotICAgICAqLwotICAgIAotICAgIHoxID0gdG1wNCArIHRtcDc7Ci0gICAgejIgPSB0bXA1ICsgdG1wNjsKLSAgICB6MyA9IHRtcDQgKyB0bXA2OwotICAgIHo0ID0gdG1wNSArIHRtcDc7Ci0gICAgejUgPSBNVUxUSVBMWSh6MyArIHo0LCBGSVhfMV8xNzU4NzU2MDIpOyAvKiBzcXJ0KDIpICogYzMgKi8KLSAgICAKLSAgICB0bXA0ID0gTVVMVElQTFkodG1wNCwgRklYXzBfMjk4NjMxMzM2KTsgLyogc3FydCgyKSAqICgtYzErYzMrYzUtYzcpICovCi0gICAgdG1wNSA9IE1VTFRJUExZKHRtcDUsIEZJWF8yXzA1MzExOTg2OSk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1K2M3KSAqLwotICAgIHRtcDYgPSBNVUxUSVBMWSh0bXA2LCBGSVhfM18wNzI3MTEwMjYpOyAvKiBzcXJ0KDIpICogKCBjMStjMytjNS1jNykgKi8KLSAgICB0bXA3ID0gTVVMVElQTFkodG1wNywgRklYXzFfNTAxMzIxMTEwKTsgLyogc3FydCgyKSAqICggYzErYzMtYzUtYzcpICovCi0gICAgejEgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF84OTk5NzYyMjMpOyAvKiBzcXJ0KDIpICogKGM3LWMzKSAqLwotICAgIHoyID0gTVVMVElQTFkoejIsIC0gRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqICgtYzEtYzMpICovCi0gICAgejMgPSBNVUxUSVBMWSh6MywgLSBGSVhfMV85NjE1NzA1NjApOyAvKiBzcXJ0KDIpICogKC1jMy1jNSkgKi8KLSAgICB6NCA9IE1VTFRJUExZKHo0LCAtIEZJWF8wXzM5MDE4MDY0NCk7IC8qIHNxcnQoMikgKiAoYzUtYzMpICovCi0gICAgCi0gICAgejMgKz0gejU7Ci0gICAgejQgKz0gejU7Ci0gICAgCi0gICAgZGF0YXB0cltEQ1RTSVpFKjddID0gKERDVEVMRU0pIERFU0NBTEUodG1wNCArIHoxICsgejMsCi0JCQkJCSAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7Ci0gICAgZGF0YXB0cltEQ1RTSVpFKjVdID0gKERDVEVMRU0pIERFU0NBTEUodG1wNSArIHoyICsgejQsCi0JCQkJCSAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7Ci0gICAgZGF0YXB0cltEQ1RTSVpFKjNdID0gKERDVEVMRU0pIERFU0NBTEUodG1wNiArIHoyICsgejMsCi0JCQkJCSAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7Ci0gICAgZGF0YXB0cltEQ1RTSVpFKjFdID0gKERDVEVMRU0pIERFU0NBTEUodG1wNyArIHoxICsgejQsCi0JCQkJCSAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7Ci0gICAgCi0gICAgZGF0YXB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IGNvbHVtbiAqLwotICB9Ci19Ci0KLSNlbmRpZiAvKiBEQ1RfSVNMT1dfU1VQUE9SVEVEICovCi0KLSNlbmRpZiAvL19GWF9KUEVHX1RVUkJPXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamlkY3Rmc3QuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2ppZGN0ZnN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YThmNjguLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamlkY3Rmc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDM3MSArMCwwIEBACi0jaWYgIWRlZmluZWQoX0ZYX0pQRUdfVFVSQk9fKQotLyoKLSAqIGppZGN0ZnN0LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhIGZhc3QsIG5vdCBzbyBhY2N1cmF0ZSBpbnRlZ2VyIGltcGxlbWVudGF0aW9uIG9mIHRoZQotICogaW52ZXJzZSBEQ1QgKERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm0pLiAgSW4gdGhlIElKRyBjb2RlLCB0aGlzIHJvdXRpbmUKLSAqIG11c3QgYWxzbyBwZXJmb3JtIGRlcXVhbnRpemF0aW9uIG9mIHRoZSBpbnB1dCBjb2VmZmljaWVudHMuCi0gKgotICogQSAyLUQgSURDVCBjYW4gYmUgZG9uZSBieSAxLUQgSURDVCBvbiBlYWNoIGNvbHVtbiBmb2xsb3dlZCBieSAxLUQgSURDVAotICogb24gZWFjaCByb3cgKG9yIHZpY2UgdmVyc2EsIGJ1dCBpdCdzIG1vcmUgY29udmVuaWVudCB0byBlbWl0IGEgcm93IGF0Ci0gKiBhIHRpbWUpLiAgRGlyZWN0IGFsZ29yaXRobXMgYXJlIGFsc28gYXZhaWxhYmxlLCBidXQgdGhleSBhcmUgbXVjaCBtb3JlCi0gKiBjb21wbGV4IGFuZCBzZWVtIG5vdCB0byBiZSBhbnkgZmFzdGVyIHdoZW4gcmVkdWNlZCB0byBjb2RlLgotICoKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gQXJhaSwgQWd1aSwgYW5kIE5ha2FqaW1hJ3MgYWxnb3JpdGhtIGZvcgotICogc2NhbGVkIERDVC4gIFRoZWlyIG9yaWdpbmFsIHBhcGVyIChUcmFucy4gSUVJQ0UgRS03MSgxMSk6MTA5NSkgaXMgaW4KLSAqIEphcGFuZXNlLCBidXQgdGhlIGFsZ29yaXRobSBpcyBkZXNjcmliZWQgaW4gdGhlIFBlbm5lYmFrZXIgJiBNaXRjaGVsbAotICogSlBFRyB0ZXh0Ym9vayAoc2VlIFJFRkVSRU5DRVMgc2VjdGlvbiBpbiBmaWxlIFJFQURNRSkuICBUaGUgZm9sbG93aW5nIGNvZGUKLSAqIGlzIGJhc2VkIGRpcmVjdGx5IG9uIGZpZ3VyZSA0LTggaW4gUCZNLgotICogV2hpbGUgYW4gOC1wb2ludCBEQ1QgY2Fubm90IGJlIGRvbmUgaW4gbGVzcyB0aGFuIDExIG11bHRpcGxpZXMsIGl0IGlzCi0gKiBwb3NzaWJsZSB0byBhcnJhbmdlIHRoZSBjb21wdXRhdGlvbiBzbyB0aGF0IG1hbnkgb2YgdGhlIG11bHRpcGxpZXMgYXJlCi0gKiBzaW1wbGUgc2NhbGluZ3Mgb2YgdGhlIGZpbmFsIG91dHB1dHMuICBUaGVzZSBtdWx0aXBsaWVzIGNhbiB0aGVuIGJlCi0gKiBmb2xkZWQgaW50byB0aGUgbXVsdGlwbGljYXRpb25zIG9yIGRpdmlzaW9ucyBieSB0aGUgSlBFRyBxdWFudGl6YXRpb24KLSAqIHRhYmxlIGVudHJpZXMuICBUaGUgQUEmTiBtZXRob2QgbGVhdmVzIG9ubHkgNSBtdWx0aXBsaWVzIGFuZCAyOSBhZGRzCi0gKiB0byBiZSBkb25lIGluIHRoZSBEQ1QgaXRzZWxmLgotICogVGhlIHByaW1hcnkgZGlzYWR2YW50YWdlIG9mIHRoaXMgbWV0aG9kIGlzIHRoYXQgd2l0aCBmaXhlZC1wb2ludCBtYXRoLAotICogYWNjdXJhY3kgaXMgbG9zdCBkdWUgdG8gaW1wcmVjaXNlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzY2FsZWQKLSAqIHF1YW50aXphdGlvbiB2YWx1ZXMuICBUaGUgc21hbGxlciB0aGUgcXVhbnRpemF0aW9uIHRhYmxlIGVudHJ5LCB0aGUgbGVzcwotICogcHJlY2lzZSB0aGUgc2NhbGVkIHZhbHVlLCBzbyB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXMgd29yc2Ugd2l0aCBoaWdoLQotICogcXVhbGl0eS1zZXR0aW5nIGZpbGVzIHRoYW4gd2l0aCBsb3ctcXVhbGl0eSBvbmVzLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLwotCi0jaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAotCi0KLS8qCi0gKiBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KLSAqLwotCi0jaWYgRENUU0laRSAhPSA4Ci0gIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KLSNlbmRpZgotCi0KLS8qIFNjYWxpbmcgZGVjaXNpb25zIGFyZSBnZW5lcmFsbHkgdGhlIHNhbWUgYXMgaW4gdGhlIExMJk0gYWxnb3JpdGhtOwotICogc2VlIGppZGN0aW50LmMgZm9yIG1vcmUgZGV0YWlscy4gIEhvd2V2ZXIsIHdlIGNob29zZSB0byBkZXNjYWxlCi0gKiAocmlnaHQgc2hpZnQpIG11bHRpcGxpY2F0aW9uIHByb2R1Y3RzIGFzIHNvb24gYXMgdGhleSBhcmUgZm9ybWVkLAotICogcmF0aGVyIHRoYW4gY2FycnlpbmcgYWRkaXRpb25hbCBmcmFjdGlvbmFsIGJpdHMgaW50byBzdWJzZXF1ZW50IGFkZGl0aW9ucy4KLSAqIFRoaXMgY29tcHJvbWlzZXMgYWNjdXJhY3kgc2xpZ2h0bHksIGJ1dCBpdCBsZXRzIHVzIHNhdmUgYSBmZXcgc2hpZnRzLgotICogTW9yZSBpbXBvcnRhbnRseSwgMTYtYml0IGFyaXRobWV0aWMgaXMgdGhlbiBhZGVxdWF0ZSAoZm9yIDgtYml0IHNhbXBsZXMpCi0gKiBldmVyeXdoZXJlIGV4Y2VwdCBpbiB0aGUgbXVsdGlwbGljYXRpb25zIHByb3BlcjsgdGhpcyBzYXZlcyBhIGdvb2QgZGVhbAotICogb2Ygd29yayBvbiAxNi1iaXQtaW50IG1hY2hpbmVzLgotICoKLSAqIFRoZSBkZXF1YW50aXplZCBjb2VmZmljaWVudHMgYXJlIG5vdCBpbnRlZ2VycyBiZWNhdXNlIHRoZSBBQSZOIHNjYWxpbmcKLSAqIGZhY3RvcnMgaGF2ZSBiZWVuIGluY29ycG9yYXRlZC4gIFdlIHJlcHJlc2VudCB0aGVtIHNjYWxlZCB1cCBieSBQQVNTMV9CSVRTLAotICogc28gdGhhdCB0aGUgZmlyc3QgYW5kIHNlY29uZCBJRENUIHJvdW5kcyBoYXZlIHRoZSBzYW1lIGlucHV0IHNjYWxpbmcuCi0gKiBGb3IgOC1iaXQgSlNBTVBMRXMsIHdlIGNob29zZSBJRkFTVF9TQ0FMRV9CSVRTID0gUEFTUzFfQklUUyBzbyBhcyB0bwotICogYXZvaWQgYSBkZXNjYWxpbmcgc2hpZnQ7IHRoaXMgY29tcHJvbWlzZXMgYWNjdXJhY3kgcmF0aGVyIGRyYXN0aWNhbGx5Ci0gKiBmb3Igc21hbGwgcXVhbnRpemF0aW9uIHRhYmxlIGVudHJpZXMsIGJ1dCBpdCBzYXZlcyBhIGxvdCBvZiBzaGlmdHMuCi0gKiBGb3IgMTItYml0IEpTQU1QTEVzLCB0aGVyZSdzIG5vIGhvcGUgb2YgdXNpbmcgMTZ4MTYgbXVsdGlwbGllcyBhbnl3YXksCi0gKiBzbyB3ZSB1c2UgYSBtdWNoIGxhcmdlciBzY2FsaW5nIGZhY3RvciB0byBwcmVzZXJ2ZSBhY2N1cmFjeS4KLSAqCi0gKiBBIGZpbmFsIGNvbXByb21pc2UgaXMgdG8gcmVwcmVzZW50IHRoZSBtdWx0aXBsaWNhdGl2ZSBjb25zdGFudHMgdG8gb25seQotICogOCBmcmFjdGlvbmFsIGJpdHMsIHJhdGhlciB0aGFuIDEzLiAgVGhpcyBzYXZlcyBzb21lIHNoaWZ0aW5nIHdvcmsgb24gc29tZQotICogbWFjaGluZXMsIGFuZCBtYXkgYWxzbyByZWR1Y2UgdGhlIGNvc3Qgb2YgbXVsdGlwbGljYXRpb24gKHNpbmNlIHRoZXJlCi0gKiBhcmUgZmV3ZXIgb25lLWJpdHMgaW4gdGhlIGNvbnN0YW50cykuCi0gKi8KLQotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci0jZGVmaW5lIENPTlNUX0JJVFMgIDgKLSNkZWZpbmUgUEFTUzFfQklUUyAgMgotI2Vsc2UKLSNkZWZpbmUgQ09OU1RfQklUUyAgOAotI2RlZmluZSBQQVNTMV9CSVRTICAxCQkvKiBsb3NlIGEgbGl0dGxlIHByZWNpc2lvbiB0byBhdm9pZCBvdmVyZmxvdyAqLwotI2VuZGlmCi0KLS8qIFNvbWUgQyBjb21waWxlcnMgZmFpbCB0byByZWR1Y2UgIkZJWChjb25zdGFudCkiIGF0IGNvbXBpbGUgdGltZSwgdGh1cwotICogY2F1c2luZyBhIGxvdCBvZiB1c2VsZXNzIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgYXQgcnVuIHRpbWUuCi0gKiBUbyBnZXQgYXJvdW5kIHRoaXMgd2UgdXNlIHRoZSBmb2xsb3dpbmcgcHJlLWNhbGN1bGF0ZWQgY29uc3RhbnRzLgotICogSWYgeW91IGNoYW5nZSBDT05TVF9CSVRTIHlvdSBtYXkgd2FudCB0byBhZGQgYXBwcm9wcmlhdGUgdmFsdWVzLgotICogKFdpdGggYSByZWFzb25hYmxlIEMgY29tcGlsZXIsIHlvdSBjYW4ganVzdCByZWx5IG9uIHRoZSBGSVgoKSBtYWNyby4uLikKLSAqLwotCi0jaWYgQ09OU1RfQklUUyA9PSA4Ci0jZGVmaW5lIEZJWF8xXzA4MjM5MjIwMCAgKChJTlQzMikgIDI3NykJCS8qIEZJWCgxLjA4MjM5MjIwMCkgKi8KLSNkZWZpbmUgRklYXzFfNDE0MjEzNTYyICAoKElOVDMyKSAgMzYyKQkJLyogRklYKDEuNDE0MjEzNTYyKSAqLwotI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgICgoSU5UMzIpICA0NzMpCQkvKiBGSVgoMS44NDc3NTkwNjUpICovCi0jZGVmaW5lIEZJWF8yXzYxMzEyNTkzMCAgKChJTlQzMikgIDY2OSkJCS8qIEZJWCgyLjYxMzEyNTkzMCkgKi8KLSNlbHNlCi0jZGVmaW5lIEZJWF8xXzA4MjM5MjIwMCAgRklYKDEuMDgyMzkyMjAwKQotI2RlZmluZSBGSVhfMV80MTQyMTM1NjIgIEZJWCgxLjQxNDIxMzU2MikKLSNkZWZpbmUgRklYXzFfODQ3NzU5MDY1ICBGSVgoMS44NDc3NTkwNjUpCi0jZGVmaW5lIEZJWF8yXzYxMzEyNTkzMCAgRklYKDIuNjEzMTI1OTMwKQotI2VuZGlmCi0KLQotLyogV2UgY2FuIGdhaW4gYSBsaXR0bGUgbW9yZSBzcGVlZCwgd2l0aCBhIGZ1cnRoZXIgY29tcHJvbWlzZSBpbiBhY2N1cmFjeSwKLSAqIGJ5IG9taXR0aW5nIHRoZSBhZGRpdGlvbiBpbiBhIGRlc2NhbGluZyBzaGlmdC4gIFRoaXMgeWllbGRzIGFuIGluY29ycmVjdGx5Ci0gKiByb3VuZGVkIHJlc3VsdCBoYWxmIHRoZSB0aW1lLi4uCi0gKi8KLQotI2lmbmRlZiBVU0VfQUNDVVJBVEVfUk9VTkRJTkcKLSN1bmRlZiBERVNDQUxFCi0jZGVmaW5lIERFU0NBTEUoeCxuKSAgUklHSFRfU0hJRlQoeCwgbikKLSNlbmRpZgotCi0KLS8qIE11bHRpcGx5IGEgRENURUxFTSB2YXJpYWJsZSBieSBhbiBJTlQzMiBjb25zdGFudCwgYW5kIGltbWVkaWF0ZWx5Ci0gKiBkZXNjYWxlIHRvIHlpZWxkIGEgRENURUxFTSByZXN1bHQuCi0gKi8KLQotI2RlZmluZSBNVUxUSVBMWSh2YXIsY29uc3QpICAoKERDVEVMRU0pIERFU0NBTEUoKHZhcikgKiAoY29uc3QpLCBDT05TVF9CSVRTKSkKLQotCi0vKiBEZXF1YW50aXplIGEgY29lZmZpY2llbnQgYnkgbXVsdGlwbHlpbmcgaXQgYnkgdGhlIG11bHRpcGxpZXItdGFibGUKLSAqIGVudHJ5OyBwcm9kdWNlIGEgRENURUxFTSByZXN1bHQuICBGb3IgOC1iaXQgZGF0YSBhIDE2eDE2LT4xNgotICogbXVsdGlwbGljYXRpb24gd2lsbCBkby4gIEZvciAxMi1iaXQgZGF0YSwgdGhlIG11bHRpcGxpZXIgdGFibGUgaXMKLSAqIGRlY2xhcmVkIElOVDMyLCBzbyBhIDMyLWJpdCBtdWx0aXBseSB3aWxsIGJlIHVzZWQuCi0gKi8KLQotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci0jZGVmaW5lIERFUVVBTlRJWkUoY29lZixxdWFudHZhbCkgICgoKElGQVNUX01VTFRfVFlQRSkgKGNvZWYpKSAqIChxdWFudHZhbCkpCi0jZWxzZQotI2RlZmluZSBERVFVQU5USVpFKGNvZWYscXVhbnR2YWwpICBcCi0JREVTQ0FMRSgoY29lZikqKHF1YW50dmFsKSwgSUZBU1RfU0NBTEVfQklUUy1QQVNTMV9CSVRTKQotI2VuZGlmCi0KLQotLyogTGlrZSBERVNDQUxFLCBidXQgYXBwbGllcyB0byBhIERDVEVMRU0gYW5kIHByb2R1Y2VzIGFuIGludC4KLSAqIFdlIGFzc3VtZSB0aGF0IGludCByaWdodCBzaGlmdCBpcyB1bnNpZ25lZCBpZiBJTlQzMiByaWdodCBzaGlmdCBpcy4KLSAqLwotCi0jaWZkZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKLSNkZWZpbmUgSVNISUZUX1RFTVBTCURDVEVMRU0gaXNoaWZ0X3RlbXA7Ci0jaWYgQklUU19JTl9KU0FNUExFID09IDgKLSNkZWZpbmUgRENURUxFTUJJVFMgIDE2CQkvKiBEQ1RFTEVNIG1heSBiZSAxNiBvciAzMiBiaXRzICovCi0jZWxzZQotI2RlZmluZSBEQ1RFTEVNQklUUyAgMzIJCS8qIERDVEVMRU0gbXVzdCBiZSAzMiBiaXRzICovCi0jZW5kaWYKLSNkZWZpbmUgSVJJR0hUX1NISUZUKHgsc2hmdCkgIFwKLSAgICAoKGlzaGlmdF90ZW1wID0gKHgpKSA8IDAgPyBcCi0gICAgIChpc2hpZnRfdGVtcCA+PiAoc2hmdCkpIHwgKCh+KChEQ1RFTEVNKSAwKSkgPDwgKERDVEVMRU1CSVRTLShzaGZ0KSkpIDogXAotICAgICAoaXNoaWZ0X3RlbXAgPj4gKHNoZnQpKSkKLSNlbHNlCi0jZGVmaW5lIElTSElGVF9URU1QUwotI2RlZmluZSBJUklHSFRfU0hJRlQoeCxzaGZ0KQkoKHgpID4+IChzaGZ0KSkKLSNlbmRpZgotCi0jaWZkZWYgVVNFX0FDQ1VSQVRFX1JPVU5ESU5HCi0jZGVmaW5lIElERVNDQUxFKHgsbikgICgoaW50KSBJUklHSFRfU0hJRlQoKHgpICsgKDEgPDwgKChuKS0xKSksIG4pKQotI2Vsc2UKLSNkZWZpbmUgSURFU0NBTEUoeCxuKSAgKChpbnQpIElSSUdIVF9TSElGVCh4LCBuKSkKLSNlbmRpZgotCi0KLS8qCi0gKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19pZGN0X2lmYXN0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJIEpDT0VGUFRSIGNvZWZfYmxvY2ssCi0JCSBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKLXsKLSAgRENURUxFTSB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OwotICBEQ1RFTEVNIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOwotICBEQ1RFTEVNIHo1LCB6MTAsIHoxMSwgejEyLCB6MTM7Ci0gIEpDT0VGUFRSIGlucHRyOwotICBJRkFTVF9NVUxUX1RZUEUgKiBxdWFudHB0cjsKLSAgaW50ICogd3NwdHI7Ci0gIEpTQU1QUk9XIG91dHB0cjsKLSAgSlNBTVBMRSAqcmFuZ2VfbGltaXQgPSBJRENUX3JhbmdlX2xpbWl0KGNpbmZvKTsKLSAgaW50IGN0cjsKLSAgaW50IHdvcmtzcGFjZVtEQ1RTSVpFMl07CS8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLwotICBTSElGVF9URU1QUwkJCS8qIGZvciBERVNDQUxFICovCi0gIElTSElGVF9URU1QUwkJCS8qIGZvciBJREVTQ0FMRSAqLwotCi0gIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4gKi8KLQotICBpbnB0ciA9IGNvZWZfYmxvY2s7Ci0gIHF1YW50cHRyID0gKElGQVNUX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7Ci0gIHdzcHRyID0gd29ya3NwYWNlOwotICBmb3IgKGN0ciA9IERDVFNJWkU7IGN0ciA+IDA7IGN0ci0tKSB7Ci0gICAgLyogRHVlIHRvIHF1YW50aXphdGlvbiwgd2Ugd2lsbCB1c3VhbGx5IGZpbmQgdGhhdCBtYW55IG9mIHRoZSBpbnB1dAotICAgICAqIGNvZWZmaWNpZW50cyBhcmUgemVybywgZXNwZWNpYWxseSB0aGUgQUMgdGVybXMuICBXZSBjYW4gZXhwbG9pdCB0aGlzCi0gICAgICogYnkgc2hvcnQtY2lyY3VpdGluZyB0aGUgSURDVCBjYWxjdWxhdGlvbiBmb3IgYW55IGNvbHVtbiBpbiB3aGljaCBhbGwKLSAgICAgKiB0aGUgQUMgdGVybXMgYXJlIHplcm8uICBJbiB0aGF0IGNhc2UgZWFjaCBvdXRwdXQgaXMgZXF1YWwgdG8gdGhlCi0gICAgICogREMgY29lZmZpY2llbnQgKHdpdGggc2NhbGUgZmFjdG9yIGFzIG5lZWRlZCkuCi0gICAgICogV2l0aCB0eXBpY2FsIGltYWdlcyBhbmQgcXVhbnRpemF0aW9uIHRhYmxlcywgaGFsZiBvciBtb3JlIG9mIHRoZQotICAgICAqIGNvbHVtbiBEQ1QgY2FsY3VsYXRpb25zIGNhbiBiZSBzaW1wbGlmaWVkIHRoaXMgd2F5LgotICAgICAqLwotICAgIAotICAgIGlmIChpbnB0cltEQ1RTSVpFKjFdID09IDAgJiYgaW5wdHJbRENUU0laRSoyXSA9PSAwICYmCi0JaW5wdHJbRENUU0laRSozXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqNF0gPT0gMCAmJgotCWlucHRyW0RDVFNJWkUqNV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjZdID09IDAgJiYKLQlpbnB0cltEQ1RTSVpFKjddID09IDApIHsKLSAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCi0gICAgICBpbnQgZGN2YWwgPSAoaW50KSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pOwotCi0gICAgICB3c3B0cltEQ1RTSVpFKjBdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjFdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjJdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjNdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjRdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjVdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjZdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjddID0gZGN2YWw7Ci0gICAgICAKLSAgICAgIGlucHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVycyB0byBuZXh0IGNvbHVtbiAqLwotICAgICAgcXVhbnRwdHIrKzsKLSAgICAgIHdzcHRyKys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgCi0gICAgLyogRXZlbiBwYXJ0ICovCi0KLSAgICB0bXAwID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKLSAgICB0bXAxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjJdLCBxdWFudHB0cltEQ1RTSVpFKjJdKTsKLSAgICB0bXAyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjRdLCBxdWFudHB0cltEQ1RTSVpFKjRdKTsKLSAgICB0bXAzID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjZdLCBxdWFudHB0cltEQ1RTSVpFKjZdKTsKLQotICAgIHRtcDEwID0gdG1wMCArIHRtcDI7CS8qIHBoYXNlIDMgKi8KLSAgICB0bXAxMSA9IHRtcDAgLSB0bXAyOwotCi0gICAgdG1wMTMgPSB0bXAxICsgdG1wMzsJLyogcGhhc2VzIDUtMyAqLwotICAgIHRtcDEyID0gTVVMVElQTFkodG1wMSAtIHRtcDMsIEZJWF8xXzQxNDIxMzU2MikgLSB0bXAxMzsgLyogMipjNCAqLwotCi0gICAgdG1wMCA9IHRtcDEwICsgdG1wMTM7CS8qIHBoYXNlIDIgKi8KLSAgICB0bXAzID0gdG1wMTAgLSB0bXAxMzsKLSAgICB0bXAxID0gdG1wMTEgKyB0bXAxMjsKLSAgICB0bXAyID0gdG1wMTEgLSB0bXAxMjsKLSAgICAKLSAgICAvKiBPZGQgcGFydCAqLwotCi0gICAgdG1wNCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7Ci0gICAgdG1wNSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7Ci0gICAgdG1wNiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo1XSwgcXVhbnRwdHJbRENUU0laRSo1XSk7Ci0gICAgdG1wNyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo3XSwgcXVhbnRwdHJbRENUU0laRSo3XSk7Ci0KLSAgICB6MTMgPSB0bXA2ICsgdG1wNTsJCS8qIHBoYXNlIDYgKi8KLSAgICB6MTAgPSB0bXA2IC0gdG1wNTsKLSAgICB6MTEgPSB0bXA0ICsgdG1wNzsKLSAgICB6MTIgPSB0bXA0IC0gdG1wNzsKLQotICAgIHRtcDcgPSB6MTEgKyB6MTM7CQkvKiBwaGFzZSA1ICovCi0gICAgdG1wMTEgPSBNVUxUSVBMWSh6MTEgLSB6MTMsIEZJWF8xXzQxNDIxMzU2Mik7IC8qIDIqYzQgKi8KLQotICAgIHo1ID0gTVVMVElQTFkoejEwICsgejEyLCBGSVhfMV84NDc3NTkwNjUpOyAvKiAyKmMyICovCi0gICAgdG1wMTAgPSBNVUxUSVBMWSh6MTIsIEZJWF8xXzA4MjM5MjIwMCkgLSB6NTsgLyogMiooYzItYzYpICovCi0gICAgdG1wMTIgPSBNVUxUSVBMWSh6MTAsIC0gRklYXzJfNjEzMTI1OTMwKSArIHo1OyAvKiAtMiooYzIrYzYpICovCi0KLSAgICB0bXA2ID0gdG1wMTIgLSB0bXA3OwkvKiBwaGFzZSAyICovCi0gICAgdG1wNSA9IHRtcDExIC0gdG1wNjsKLSAgICB0bXA0ID0gdG1wMTAgKyB0bXA1OwotCi0gICAgd3NwdHJbRENUU0laRSowXSA9IChpbnQpICh0bXAwICsgdG1wNyk7Ci0gICAgd3NwdHJbRENUU0laRSo3XSA9IChpbnQpICh0bXAwIC0gdG1wNyk7Ci0gICAgd3NwdHJbRENUU0laRSoxXSA9IChpbnQpICh0bXAxICsgdG1wNik7Ci0gICAgd3NwdHJbRENUU0laRSo2XSA9IChpbnQpICh0bXAxIC0gdG1wNik7Ci0gICAgd3NwdHJbRENUU0laRSoyXSA9IChpbnQpICh0bXAyICsgdG1wNSk7Ci0gICAgd3NwdHJbRENUU0laRSo1XSA9IChpbnQpICh0bXAyIC0gdG1wNSk7Ci0gICAgd3NwdHJbRENUU0laRSo0XSA9IChpbnQpICh0bXAzICsgdG1wNCk7Ci0gICAgd3NwdHJbRENUU0laRSozXSA9IChpbnQpICh0bXAzIC0gdG1wNCk7Ci0KLSAgICBpbnB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlcnMgdG8gbmV4dCBjb2x1bW4gKi8KLSAgICBxdWFudHB0cisrOwotICAgIHdzcHRyKys7Ci0gIH0KLSAgCi0gIC8qIFBhc3MgMjogcHJvY2VzcyByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuICovCi0gIC8qIE5vdGUgdGhhdCB3ZSBtdXN0IGRlc2NhbGUgdGhlIHJlc3VsdHMgYnkgYSBmYWN0b3Igb2YgOCA9PSAyKiozLCAqLwotICAvKiBhbmQgYWxzbyB1bmRvIHRoZSBQQVNTMV9CSVRTIHNjYWxpbmcuICovCi0KLSAgd3NwdHIgPSB3b3Jrc3BhY2U7Ci0gIGZvciAoY3RyID0gMDsgY3RyIDwgRENUU0laRTsgY3RyKyspIHsKLSAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOwotICAgIC8qIFJvd3Mgb2YgemVyb2VzIGNhbiBiZSBleHBsb2l0ZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHdlIGRpZCB3aXRoIGNvbHVtbnMuCi0gICAgICogSG93ZXZlciwgdGhlIGNvbHVtbiBjYWxjdWxhdGlvbiBoYXMgY3JlYXRlZCBtYW55IG5vbnplcm8gQUMgdGVybXMsIHNvCi0gICAgICogdGhlIHNpbXBsaWZpY2F0aW9uIGFwcGxpZXMgbGVzcyBvZnRlbiAodHlwaWNhbGx5IDUlIHRvIDEwJSBvZiB0aGUgdGltZSkuCi0gICAgICogT24gbWFjaGluZXMgd2l0aCB2ZXJ5IGZhc3QgbXVsdGlwbGljYXRpb24sIGl0J3MgcG9zc2libGUgdGhhdCB0aGUKLSAgICAgKiB0ZXN0IHRha2VzIG1vcmUgdGltZSB0aGFuIGl0J3Mgd29ydGguICBJbiB0aGF0IGNhc2UgdGhpcyBzZWN0aW9uCi0gICAgICogbWF5IGJlIGNvbW1lbnRlZCBvdXQuCi0gICAgICovCi0gICAgCi0jaWZuZGVmIE5PX1pFUk9fUk9XX1RFU1QKLSAgICBpZiAod3NwdHJbMV0gPT0gMCAmJiB3c3B0clsyXSA9PSAwICYmIHdzcHRyWzNdID09IDAgJiYgd3NwdHJbNF0gPT0gMCAmJgotCXdzcHRyWzVdID09IDAgJiYgd3NwdHJbNl0gPT0gMCAmJiB3c3B0cls3XSA9PSAwKSB7Ci0gICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybyAqLwotICAgICAgSlNBTVBMRSBkY3ZhbCA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHdzcHRyWzBdLCBQQVNTMV9CSVRTKzMpCi0JCQkJICAmIFJBTkdFX01BU0tdOwotICAgICAgCi0gICAgICBvdXRwdHJbMF0gPSBkY3ZhbDsKLSAgICAgIG91dHB0clsxXSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzJdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbM10gPSBkY3ZhbDsKLSAgICAgIG91dHB0cls0XSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzVdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbNl0gPSBkY3ZhbDsKLSAgICAgIG91dHB0cls3XSA9IGRjdmFsOwotCi0gICAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCi0gICAgICBjb250aW51ZTsKLSAgICB9Ci0jZW5kaWYKLSAgICAKLSAgICAvKiBFdmVuIHBhcnQgKi8KLQotICAgIHRtcDEwID0gKChEQ1RFTEVNKSB3c3B0clswXSArIChEQ1RFTEVNKSB3c3B0cls0XSk7Ci0gICAgdG1wMTEgPSAoKERDVEVMRU0pIHdzcHRyWzBdIC0gKERDVEVMRU0pIHdzcHRyWzRdKTsKLQotICAgIHRtcDEzID0gKChEQ1RFTEVNKSB3c3B0clsyXSArIChEQ1RFTEVNKSB3c3B0cls2XSk7Ci0gICAgdG1wMTIgPSBNVUxUSVBMWSgoRENURUxFTSkgd3NwdHJbMl0gLSAoRENURUxFTSkgd3NwdHJbNl0sIEZJWF8xXzQxNDIxMzU2MikKLQkgICAgLSB0bXAxMzsKLQotICAgIHRtcDAgPSB0bXAxMCArIHRtcDEzOwotICAgIHRtcDMgPSB0bXAxMCAtIHRtcDEzOwotICAgIHRtcDEgPSB0bXAxMSArIHRtcDEyOwotICAgIHRtcDIgPSB0bXAxMSAtIHRtcDEyOwotCi0gICAgLyogT2RkIHBhcnQgKi8KLQotICAgIHoxMyA9IChEQ1RFTEVNKSB3c3B0cls1XSArIChEQ1RFTEVNKSB3c3B0clszXTsKLSAgICB6MTAgPSAoRENURUxFTSkgd3NwdHJbNV0gLSAoRENURUxFTSkgd3NwdHJbM107Ci0gICAgejExID0gKERDVEVMRU0pIHdzcHRyWzFdICsgKERDVEVMRU0pIHdzcHRyWzddOwotICAgIHoxMiA9IChEQ1RFTEVNKSB3c3B0clsxXSAtIChEQ1RFTEVNKSB3c3B0cls3XTsKLQotICAgIHRtcDcgPSB6MTEgKyB6MTM7CQkvKiBwaGFzZSA1ICovCi0gICAgdG1wMTEgPSBNVUxUSVBMWSh6MTEgLSB6MTMsIEZJWF8xXzQxNDIxMzU2Mik7IC8qIDIqYzQgKi8KLQotICAgIHo1ID0gTVVMVElQTFkoejEwICsgejEyLCBGSVhfMV84NDc3NTkwNjUpOyAvKiAyKmMyICovCi0gICAgdG1wMTAgPSBNVUxUSVBMWSh6MTIsIEZJWF8xXzA4MjM5MjIwMCkgLSB6NTsgLyogMiooYzItYzYpICovCi0gICAgdG1wMTIgPSBNVUxUSVBMWSh6MTAsIC0gRklYXzJfNjEzMTI1OTMwKSArIHo1OyAvKiAtMiooYzIrYzYpICovCi0KLSAgICB0bXA2ID0gdG1wMTIgLSB0bXA3OwkvKiBwaGFzZSAyICovCi0gICAgdG1wNSA9IHRtcDExIC0gdG1wNjsKLSAgICB0bXA0ID0gdG1wMTAgKyB0bXA1OwotCi0gICAgLyogRmluYWwgb3V0cHV0IHN0YWdlOiBzY2FsZSBkb3duIGJ5IGEgZmFjdG9yIG9mIDggYW5kIHJhbmdlLWxpbWl0ICovCi0KLSAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAwICsgdG1wNywgUEFTUzFfQklUUyszKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzddID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMCAtIHRtcDcsIFBBU1MxX0JJVFMrMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDEgKyB0bXA2LCBQQVNTMV9CSVRTKzMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbNl0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAxIC0gdG1wNiwgUEFTUzFfQklUUyszKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzJdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMiArIHRtcDUsIFBBU1MxX0JJVFMrMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0cls1XSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDIgLSB0bXA1LCBQQVNTMV9CSVRTKzMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbNF0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAzICsgdG1wNCwgUEFTUzFfQklUUyszKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzNdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMyAtIHRtcDQsIFBBU1MxX0JJVFMrMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotCi0gICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLwotICB9Ci19Ci0KLSNlbmRpZiAvKiBEQ1RfSUZBU1RfU1VQUE9SVEVEICovCi0KLSNlbmRpZiAvL19GWF9KUEVHX1RVUkJPXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamlkY3RpbnQuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2ppZGN0aW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YThkNjYuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamlkY3RpbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0jaWYgIWRlZmluZWQoX0ZYX0pQRUdfVFVSQk9fKQotLyoKLSAqIGppZGN0aW50LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhIHNsb3ctYnV0LWFjY3VyYXRlIGludGVnZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0gKiBpbnZlcnNlIERDVCAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuICBJbiB0aGUgSUpHIGNvZGUsIHRoaXMgcm91dGluZQotICogbXVzdCBhbHNvIHBlcmZvcm0gZGVxdWFudGl6YXRpb24gb2YgdGhlIGlucHV0IGNvZWZmaWNpZW50cy4KLSAqCi0gKiBBIDItRCBJRENUIGNhbiBiZSBkb25lIGJ5IDEtRCBJRENUIG9uIGVhY2ggY29sdW1uIGZvbGxvd2VkIGJ5IDEtRCBJRENUCi0gKiBvbiBlYWNoIHJvdyAob3IgdmljZSB2ZXJzYSwgYnV0IGl0J3MgbW9yZSBjb252ZW5pZW50IHRvIGVtaXQgYSByb3cgYXQKLSAqIGEgdGltZSkuICBEaXJlY3QgYWxnb3JpdGhtcyBhcmUgYWxzbyBhdmFpbGFibGUsIGJ1dCB0aGV5IGFyZSBtdWNoIG1vcmUKLSAqIGNvbXBsZXggYW5kIHNlZW0gbm90IHRvIGJlIGFueSBmYXN0ZXIgd2hlbiByZWR1Y2VkIHRvIGNvZGUuCi0gKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBhbiBhbGdvcml0aG0gZGVzY3JpYmVkIGluCi0gKiAgIEMuIExvZWZmbGVyLCBBLiBMaWd0ZW5iZXJnIGFuZCBHLiBNb3NjaHl0eiwgIlByYWN0aWNhbCBGYXN0IDEtRCBEQ1QKLSAqICAgQWxnb3JpdGhtcyB3aXRoIDExIE11bHRpcGxpY2F0aW9ucyIsIFByb2MuIEludCdsLiBDb25mLiBvbiBBY291c3RpY3MsCi0gKiAgIFNwZWVjaCwgYW5kIFNpZ25hbCBQcm9jZXNzaW5nIDE5ODkgKElDQVNTUCAnODkpLCBwcC4gOTg4LTk5MS4KLSAqIFRoZSBwcmltYXJ5IGFsZ29yaXRobSBkZXNjcmliZWQgdGhlcmUgdXNlcyAxMSBtdWx0aXBsaWVzIGFuZCAyOSBhZGRzLgotICogV2UgdXNlIHRoZWlyIGFsdGVybmF0ZSBtZXRob2Qgd2l0aCAxMiBtdWx0aXBsaWVzIGFuZCAzMiBhZGRzLgotICogVGhlIGFkdmFudGFnZSBvZiB0aGlzIG1ldGhvZCBpcyB0aGF0IG5vIGRhdGEgcGF0aCBjb250YWlucyBtb3JlIHRoYW4gb25lCi0gKiBtdWx0aXBsaWNhdGlvbjsgdGhpcyBhbGxvd3MgYSB2ZXJ5IHNpbXBsZSBhbmQgYWNjdXJhdGUgaW1wbGVtZW50YXRpb24gaW4KLSAqIHNjYWxlZCBmaXhlZC1wb2ludCBhcml0aG1ldGljLCB3aXRoIGEgbWluaW1hbCBudW1iZXIgb2Ygc2hpZnRzLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLwotCi0jaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAotCi0KLS8qCi0gKiBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KLSAqLwotCi0jaWYgRENUU0laRSAhPSA4Ci0gIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KLSNlbmRpZgotCi0KLS8qCi0gKiBUaGUgcG9vcCBvbiB0aGlzIHNjYWxpbmcgc3R1ZmYgaXMgYXMgZm9sbG93czoKLSAqCi0gKiBFYWNoIDEtRCBJRENUIHN0ZXAgcHJvZHVjZXMgb3V0cHV0cyB3aGljaCBhcmUgYSBmYWN0b3Igb2Ygc3FydChOKQotICogbGFyZ2VyIHRoYW4gdGhlIHRydWUgSURDVCBvdXRwdXRzLiAgVGhlIGZpbmFsIG91dHB1dHMgYXJlIHRoZXJlZm9yZQotICogYSBmYWN0b3Igb2YgTiBsYXJnZXIgdGhhbiBkZXNpcmVkOyBzaW5jZSBOPTggdGhpcyBjYW4gYmUgY3VyZWQgYnkKLSAqIGEgc2ltcGxlIHJpZ2h0IHNoaWZ0IGF0IHRoZSBlbmQgb2YgdGhlIGFsZ29yaXRobS4gIFRoZSBhZHZhbnRhZ2Ugb2YKLSAqIHRoaXMgYXJyYW5nZW1lbnQgaXMgdGhhdCB3ZSBzYXZlIHR3byBtdWx0aXBsaWNhdGlvbnMgcGVyIDEtRCBJRENULAotICogYmVjYXVzZSB0aGUgeTAgYW5kIHk0IGlucHV0cyBuZWVkIG5vdCBiZSBkaXZpZGVkIGJ5IHNxcnQoTikuCi0gKgotICogV2UgaGF2ZSB0byBkbyBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24gb2YgdGhlIGludGVnZXIgaW5wdXRzLCB3aGljaAotICogaXMgbm8gcHJvYmxlbSwgYW5kIG11bHRpcGxpY2F0aW9uIGJ5IGZyYWN0aW9uYWwgY29uc3RhbnRzLCB3aGljaCBpcwotICogYSBwcm9ibGVtIHRvIGRvIGluIGludGVnZXIgYXJpdGhtZXRpYy4gIFdlIG11bHRpcGx5IGFsbCB0aGUgY29uc3RhbnRzCi0gKiBieSBDT05TVF9TQ0FMRSBhbmQgY29udmVydCB0aGVtIHRvIGludGVnZXIgY29uc3RhbnRzICh0aHVzIHJldGFpbmluZwotICogQ09OU1RfQklUUyBiaXRzIG9mIHByZWNpc2lvbiBpbiB0aGUgY29uc3RhbnRzKS4gIEFmdGVyIGRvaW5nIGEKLSAqIG11bHRpcGxpY2F0aW9uIHdlIGhhdmUgdG8gZGl2aWRlIHRoZSBwcm9kdWN0IGJ5IENPTlNUX1NDQUxFLCB3aXRoIHByb3BlcgotICogcm91bmRpbmcsIHRvIHByb2R1Y2UgdGhlIGNvcnJlY3Qgb3V0cHV0LiAgVGhpcyBkaXZpc2lvbiBjYW4gYmUgZG9uZQotICogY2hlYXBseSBhcyBhIHJpZ2h0IHNoaWZ0IG9mIENPTlNUX0JJVFMgYml0cy4gIFdlIHBvc3Rwb25lIHNoaWZ0aW5nCi0gKiBhcyBsb25nIGFzIHBvc3NpYmxlIHNvIHRoYXQgcGFydGlhbCBzdW1zIGNhbiBiZSBhZGRlZCB0b2dldGhlciB3aXRoCi0gKiBmdWxsIGZyYWN0aW9uYWwgcHJlY2lzaW9uLgotICoKLSAqIFRoZSBvdXRwdXRzIG9mIHRoZSBmaXJzdCBwYXNzIGFyZSBzY2FsZWQgdXAgYnkgUEFTUzFfQklUUyBiaXRzIHNvIHRoYXQKLSAqIHRoZXkgYXJlIHJlcHJlc2VudGVkIHRvIGJldHRlci10aGFuLWludGVncmFsIHByZWNpc2lvbi4gIFRoZXNlIG91dHB1dHMKLSAqIHJlcXVpcmUgQklUU19JTl9KU0FNUExFICsgUEFTUzFfQklUUyArIDMgYml0czsgdGhpcyBmaXRzIGluIGEgMTYtYml0IHdvcmQKLSAqIHdpdGggdGhlIHJlY29tbWVuZGVkIHNjYWxpbmcuICAoVG8gc2NhbGUgdXAgMTItYml0IHNhbXBsZSBkYXRhIGZ1cnRoZXIsIGFuCi0gKiBpbnRlcm1lZGlhdGUgSU5UMzIgYXJyYXkgd291bGQgYmUgbmVlZGVkLikKLSAqCi0gKiBUbyBhdm9pZCBvdmVyZmxvdyBvZiB0aGUgMzItYml0IGludGVybWVkaWF0ZSByZXN1bHRzIGluIHBhc3MgMiwgd2UgbXVzdAotICogaGF2ZSBCSVRTX0lOX0pTQU1QTEUgKyBDT05TVF9CSVRTICsgUEFTUzFfQklUUyA8PSAyNi4gIEVycm9yIGFuYWx5c2lzCi0gKiBzaG93cyB0aGF0IHRoZSB2YWx1ZXMgZ2l2ZW4gYmVsb3cgYXJlIHRoZSBtb3N0IGVmZmVjdGl2ZS4KLSAqLwotCi0jaWYgQklUU19JTl9KU0FNUExFID09IDgKLSNkZWZpbmUgQ09OU1RfQklUUyAgMTMKLSNkZWZpbmUgUEFTUzFfQklUUyAgMgotI2Vsc2UKLSNkZWZpbmUgQ09OU1RfQklUUyAgMTMKLSNkZWZpbmUgUEFTUzFfQklUUyAgMQkJLyogbG9zZSBhIGxpdHRsZSBwcmVjaXNpb24gdG8gYXZvaWQgb3ZlcmZsb3cgKi8KLSNlbmRpZgotCi0vKiBTb21lIEMgY29tcGlsZXJzIGZhaWwgdG8gcmVkdWNlICJGSVgoY29uc3RhbnQpIiBhdCBjb21waWxlIHRpbWUsIHRodXMKLSAqIGNhdXNpbmcgYSBsb3Qgb2YgdXNlbGVzcyBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zIGF0IHJ1biB0aW1lLgotICogVG8gZ2V0IGFyb3VuZCB0aGlzIHdlIHVzZSB0aGUgZm9sbG93aW5nIHByZS1jYWxjdWxhdGVkIGNvbnN0YW50cy4KLSAqIElmIHlvdSBjaGFuZ2UgQ09OU1RfQklUUyB5b3UgbWF5IHdhbnQgdG8gYWRkIGFwcHJvcHJpYXRlIHZhbHVlcy4KLSAqIChXaXRoIGEgcmVhc29uYWJsZSBDIGNvbXBpbGVyLCB5b3UgY2FuIGp1c3QgcmVseSBvbiB0aGUgRklYKCkgbWFjcm8uLi4pCi0gKi8KLQotI2lmIENPTlNUX0JJVFMgPT0gMTMKLSNkZWZpbmUgRklYXzBfMjk4NjMxMzM2ICAoKElOVDMyKSAgMjQ0NikJLyogRklYKDAuMjk4NjMxMzM2KSAqLwotI2RlZmluZSBGSVhfMF8zOTAxODA2NDQgICgoSU5UMzIpICAzMTk2KQkvKiBGSVgoMC4zOTAxODA2NDQpICovCi0jZGVmaW5lIEZJWF8wXzU0MTE5NjEwMCAgKChJTlQzMikgIDQ0MzMpCS8qIEZJWCgwLjU0MTE5NjEwMCkgKi8KLSNkZWZpbmUgRklYXzBfNzY1MzY2ODY1ICAoKElOVDMyKSAgNjI3MCkJLyogRklYKDAuNzY1MzY2ODY1KSAqLwotI2RlZmluZSBGSVhfMF84OTk5NzYyMjMgICgoSU5UMzIpICA3MzczKQkvKiBGSVgoMC44OTk5NzYyMjMpICovCi0jZGVmaW5lIEZJWF8xXzE3NTg3NTYwMiAgKChJTlQzMikgIDk2MzMpCS8qIEZJWCgxLjE3NTg3NTYwMikgKi8KLSNkZWZpbmUgRklYXzFfNTAxMzIxMTEwICAoKElOVDMyKSAgMTIyOTkpCS8qIEZJWCgxLjUwMTMyMTExMCkgKi8KLSNkZWZpbmUgRklYXzFfODQ3NzU5MDY1ICAoKElOVDMyKSAgMTUxMzcpCS8qIEZJWCgxLjg0Nzc1OTA2NSkgKi8KLSNkZWZpbmUgRklYXzFfOTYxNTcwNTYwICAoKElOVDMyKSAgMTYwNjkpCS8qIEZJWCgxLjk2MTU3MDU2MCkgKi8KLSNkZWZpbmUgRklYXzJfMDUzMTE5ODY5ICAoKElOVDMyKSAgMTY4MTkpCS8qIEZJWCgyLjA1MzExOTg2OSkgKi8KLSNkZWZpbmUgRklYXzJfNTYyOTE1NDQ3ICAoKElOVDMyKSAgMjA5OTUpCS8qIEZJWCgyLjU2MjkxNTQ0NykgKi8KLSNkZWZpbmUgRklYXzNfMDcyNzExMDI2ICAoKElOVDMyKSAgMjUxNzIpCS8qIEZJWCgzLjA3MjcxMTAyNikgKi8KLSNlbHNlCi0jZGVmaW5lIEZJWF8wXzI5ODYzMTMzNiAgRklYKDAuMjk4NjMxMzM2KQotI2RlZmluZSBGSVhfMF8zOTAxODA2NDQgIEZJWCgwLjM5MDE4MDY0NCkKLSNkZWZpbmUgRklYXzBfNTQxMTk2MTAwICBGSVgoMC41NDExOTYxMDApCi0jZGVmaW5lIEZJWF8wXzc2NTM2Njg2NSAgRklYKDAuNzY1MzY2ODY1KQotI2RlZmluZSBGSVhfMF84OTk5NzYyMjMgIEZJWCgwLjg5OTk3NjIyMykKLSNkZWZpbmUgRklYXzFfMTc1ODc1NjAyICBGSVgoMS4xNzU4NzU2MDIpCi0jZGVmaW5lIEZJWF8xXzUwMTMyMTExMCAgRklYKDEuNTAxMzIxMTEwKQotI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgIEZJWCgxLjg0Nzc1OTA2NSkKLSNkZWZpbmUgRklYXzFfOTYxNTcwNTYwICBGSVgoMS45NjE1NzA1NjApCi0jZGVmaW5lIEZJWF8yXzA1MzExOTg2OSAgRklYKDIuMDUzMTE5ODY5KQotI2RlZmluZSBGSVhfMl81NjI5MTU0NDcgIEZJWCgyLjU2MjkxNTQ0NykKLSNkZWZpbmUgRklYXzNfMDcyNzExMDI2ICBGSVgoMy4wNzI3MTEwMjYpCi0jZW5kaWYKLQotCi0vKiBNdWx0aXBseSBhbiBJTlQzMiB2YXJpYWJsZSBieSBhbiBJTlQzMiBjb25zdGFudCB0byB5aWVsZCBhbiBJTlQzMiByZXN1bHQuCi0gKiBGb3IgOC1iaXQgc2FtcGxlcyB3aXRoIHRoZSByZWNvbW1lbmRlZCBzY2FsaW5nLCBhbGwgdGhlIHZhcmlhYmxlCi0gKiBhbmQgY29uc3RhbnQgdmFsdWVzIGludm9sdmVkIGFyZSBubyBtb3JlIHRoYW4gMTYgYml0cyB3aWRlLCBzbyBhCi0gKiAxNngxNi0+MzIgYml0IG11bHRpcGx5IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYSBmdWxsIDMyeDMyIG11bHRpcGx5LgotICogRm9yIDEyLWJpdCBzYW1wbGVzLCBhIGZ1bGwgMzItYml0IG11bHRpcGxpY2F0aW9uIHdpbGwgYmUgbmVlZGVkLgotICovCi0KLSNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAotI2RlZmluZSBNVUxUSVBMWSh2YXIsY29uc3QpICBNVUxUSVBMWTE2QzE2KHZhcixjb25zdCkKLSNlbHNlCi0jZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgICgodmFyKSAqIChjb25zdCkpCi0jZW5kaWYKLQotCi0vKiBEZXF1YW50aXplIGEgY29lZmZpY2llbnQgYnkgbXVsdGlwbHlpbmcgaXQgYnkgdGhlIG11bHRpcGxpZXItdGFibGUKLSAqIGVudHJ5OyBwcm9kdWNlIGFuIGludCByZXN1bHQuICBJbiB0aGlzIG1vZHVsZSwgYm90aCBpbnB1dHMgYW5kIHJlc3VsdAotICogYXJlIDE2IGJpdHMgb3IgbGVzcywgc28gZWl0aGVyIGludCBvciBzaG9ydCBtdWx0aXBseSB3aWxsIHdvcmsuCi0gKi8KLQotI2RlZmluZSBERVFVQU5USVpFKGNvZWYscXVhbnR2YWwpICAoKChJU0xPV19NVUxUX1RZUEUpIChjb2VmKSkgKiAocXVhbnR2YWwpKQotCi0KLS8qCi0gKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19pZGN0X2lzbG93IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJIEpDT0VGUFRSIGNvZWZfYmxvY2ssCi0JCSBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKLXsKLSAgSU5UMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKLSAgSU5UMzIgdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTM7Ci0gIElOVDMyIHoxLCB6MiwgejMsIHo0LCB6NTsKLSAgSkNPRUZQVFIgaW5wdHI7Ci0gIElTTE9XX01VTFRfVFlQRSAqIHF1YW50cHRyOwotICBpbnQgKiB3c3B0cjsKLSAgSlNBTVBST1cgb3V0cHRyOwotICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOwotICBpbnQgY3RyOwotICBpbnQgd29ya3NwYWNlW0RDVFNJWkUyXTsJLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCi0gIFNISUZUX1RFTVBTCi0KLSAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LiAqLwotICAvKiBOb3RlIHJlc3VsdHMgYXJlIHNjYWxlZCB1cCBieSBzcXJ0KDgpIGNvbXBhcmVkIHRvIGEgdHJ1ZSBJRENUOyAqLwotICAvKiBmdXJ0aGVybW9yZSwgd2Ugc2NhbGUgdGhlIHJlc3VsdHMgYnkgMioqUEFTUzFfQklUUy4gKi8KLQotICBpbnB0ciA9IGNvZWZfYmxvY2s7Ci0gIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7Ci0gIHdzcHRyID0gd29ya3NwYWNlOwotICBmb3IgKGN0ciA9IERDVFNJWkU7IGN0ciA+IDA7IGN0ci0tKSB7Ci0gICAgLyogRHVlIHRvIHF1YW50aXphdGlvbiwgd2Ugd2lsbCB1c3VhbGx5IGZpbmQgdGhhdCBtYW55IG9mIHRoZSBpbnB1dAotICAgICAqIGNvZWZmaWNpZW50cyBhcmUgemVybywgZXNwZWNpYWxseSB0aGUgQUMgdGVybXMuICBXZSBjYW4gZXhwbG9pdCB0aGlzCi0gICAgICogYnkgc2hvcnQtY2lyY3VpdGluZyB0aGUgSURDVCBjYWxjdWxhdGlvbiBmb3IgYW55IGNvbHVtbiBpbiB3aGljaCBhbGwKLSAgICAgKiB0aGUgQUMgdGVybXMgYXJlIHplcm8uICBJbiB0aGF0IGNhc2UgZWFjaCBvdXRwdXQgaXMgZXF1YWwgdG8gdGhlCi0gICAgICogREMgY29lZmZpY2llbnQgKHdpdGggc2NhbGUgZmFjdG9yIGFzIG5lZWRlZCkuCi0gICAgICogV2l0aCB0eXBpY2FsIGltYWdlcyBhbmQgcXVhbnRpemF0aW9uIHRhYmxlcywgaGFsZiBvciBtb3JlIG9mIHRoZQotICAgICAqIGNvbHVtbiBEQ1QgY2FsY3VsYXRpb25zIGNhbiBiZSBzaW1wbGlmaWVkIHRoaXMgd2F5LgotICAgICAqLwotICAgIAotICAgIGlmIChpbnB0cltEQ1RTSVpFKjFdID09IDAgJiYgaW5wdHJbRENUU0laRSoyXSA9PSAwICYmCi0JaW5wdHJbRENUU0laRSozXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqNF0gPT0gMCAmJgotCWlucHRyW0RDVFNJWkUqNV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjZdID09IDAgJiYKLQlpbnB0cltEQ1RTSVpFKjddID09IDApIHsKLSAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCi0gICAgICBpbnQgZGN2YWwgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pIDw8IFBBU1MxX0JJVFM7Ci0gICAgICAKLSAgICAgIHdzcHRyW0RDVFNJWkUqMF0gPSBkY3ZhbDsKLSAgICAgIHdzcHRyW0RDVFNJWkUqMV0gPSBkY3ZhbDsKLSAgICAgIHdzcHRyW0RDVFNJWkUqMl0gPSBkY3ZhbDsKLSAgICAgIHdzcHRyW0RDVFNJWkUqM10gPSBkY3ZhbDsKLSAgICAgIHdzcHRyW0RDVFNJWkUqNF0gPSBkY3ZhbDsKLSAgICAgIHdzcHRyW0RDVFNJWkUqNV0gPSBkY3ZhbDsKLSAgICAgIHdzcHRyW0RDVFNJWkUqNl0gPSBkY3ZhbDsKLSAgICAgIHdzcHRyW0RDVFNJWkUqN10gPSBkY3ZhbDsKLSAgICAgIAotICAgICAgaW5wdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCi0gICAgICBxdWFudHB0cisrOwotICAgICAgd3NwdHIrKzsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICAKLSAgICAvKiBFdmVuIHBhcnQ6IHJldmVyc2UgdGhlIGV2ZW4gcGFydCBvZiB0aGUgZm9yd2FyZCBEQ1QuICovCi0gICAgLyogVGhlIHJvdGF0b3IgaXMgc3FydCgyKSpjKC02KS4gKi8KLSAgICAKLSAgICB6MiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoyXSwgcXVhbnRwdHJbRENUU0laRSoyXSk7Ci0gICAgejMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNl0sIHF1YW50cHRyW0RDVFNJWkUqNl0pOwotICAgIAotICAgIHoxID0gTVVMVElQTFkoejIgKyB6MywgRklYXzBfNTQxMTk2MTAwKTsKLSAgICB0bXAyID0gejEgKyBNVUxUSVBMWSh6MywgLSBGSVhfMV84NDc3NTkwNjUpOwotICAgIHRtcDMgPSB6MSArIE1VTFRJUExZKHoyLCBGSVhfMF83NjUzNjY4NjUpOwotICAgIAotICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKLSAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo0XSwgcXVhbnRwdHJbRENUU0laRSo0XSk7Ci0KLSAgICB0bXAwID0gKHoyICsgejMpIDw8IENPTlNUX0JJVFM7Ci0gICAgdG1wMSA9ICh6MiAtIHozKSA8PCBDT05TVF9CSVRTOwotICAgIAotICAgIHRtcDEwID0gdG1wMCArIHRtcDM7Ci0gICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKLSAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOwotICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7Ci0gICAgCi0gICAgLyogT2RkIHBhcnQgcGVyIGZpZ3VyZSA4OyB0aGUgbWF0cml4IGlzIHVuaXRhcnkgYW5kIGhlbmNlIGl0cwotICAgICAqIHRyYW5zcG9zZSBpcyBpdHMgaW52ZXJzZS4gIGkwLi5pMyBhcmUgeTcseTUseTMseTEgcmVzcGVjdGl2ZWx5LgotICAgICAqLwotICAgIAotICAgIHRtcDAgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqN10sIHF1YW50cHRyW0RDVFNJWkUqN10pOwotICAgIHRtcDEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNV0sIHF1YW50cHRyW0RDVFNJWkUqNV0pOwotICAgIHRtcDIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqM10sIHF1YW50cHRyW0RDVFNJWkUqM10pOwotICAgIHRtcDMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMV0sIHF1YW50cHRyW0RDVFNJWkUqMV0pOwotICAgIAotICAgIHoxID0gdG1wMCArIHRtcDM7Ci0gICAgejIgPSB0bXAxICsgdG1wMjsKLSAgICB6MyA9IHRtcDAgKyB0bXAyOwotICAgIHo0ID0gdG1wMSArIHRtcDM7Ci0gICAgejUgPSBNVUxUSVBMWSh6MyArIHo0LCBGSVhfMV8xNzU4NzU2MDIpOyAvKiBzcXJ0KDIpICogYzMgKi8KLSAgICAKLSAgICB0bXAwID0gTVVMVElQTFkodG1wMCwgRklYXzBfMjk4NjMxMzM2KTsgLyogc3FydCgyKSAqICgtYzErYzMrYzUtYzcpICovCi0gICAgdG1wMSA9IE1VTFRJUExZKHRtcDEsIEZJWF8yXzA1MzExOTg2OSk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1K2M3KSAqLwotICAgIHRtcDIgPSBNVUxUSVBMWSh0bXAyLCBGSVhfM18wNzI3MTEwMjYpOyAvKiBzcXJ0KDIpICogKCBjMStjMytjNS1jNykgKi8KLSAgICB0bXAzID0gTVVMVElQTFkodG1wMywgRklYXzFfNTAxMzIxMTEwKTsgLyogc3FydCgyKSAqICggYzErYzMtYzUtYzcpICovCi0gICAgejEgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF84OTk5NzYyMjMpOyAvKiBzcXJ0KDIpICogKGM3LWMzKSAqLwotICAgIHoyID0gTVVMVElQTFkoejIsIC0gRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqICgtYzEtYzMpICovCi0gICAgejMgPSBNVUxUSVBMWSh6MywgLSBGSVhfMV85NjE1NzA1NjApOyAvKiBzcXJ0KDIpICogKC1jMy1jNSkgKi8KLSAgICB6NCA9IE1VTFRJUExZKHo0LCAtIEZJWF8wXzM5MDE4MDY0NCk7IC8qIHNxcnQoMikgKiAoYzUtYzMpICovCi0gICAgCi0gICAgejMgKz0gejU7Ci0gICAgejQgKz0gejU7Ci0gICAgCi0gICAgdG1wMCArPSB6MSArIHozOwotICAgIHRtcDEgKz0gejIgKyB6NDsKLSAgICB0bXAyICs9IHoyICsgejM7Ci0gICAgdG1wMyArPSB6MSArIHo0OwotICAgIAotICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZTogaW5wdXRzIGFyZSB0bXAxMC4udG1wMTMsIHRtcDAuLnRtcDMgKi8KLSAgICAKLSAgICB3c3B0cltEQ1RTSVpFKjBdID0gKGludCkgREVTQ0FMRSh0bXAxMCArIHRtcDMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7Ci0gICAgd3NwdHJbRENUU0laRSo3XSA9IChpbnQpIERFU0NBTEUodG1wMTAgLSB0bXAzLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOwotICAgIHdzcHRyW0RDVFNJWkUqMV0gPSAoaW50KSBERVNDQUxFKHRtcDExICsgdG1wMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKLSAgICB3c3B0cltEQ1RTSVpFKjZdID0gKGludCkgREVTQ0FMRSh0bXAxMSAtIHRtcDIsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7Ci0gICAgd3NwdHJbRENUU0laRSoyXSA9IChpbnQpIERFU0NBTEUodG1wMTIgKyB0bXAxLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOwotICAgIHdzcHRyW0RDVFNJWkUqNV0gPSAoaW50KSBERVNDQUxFKHRtcDEyIC0gdG1wMSwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKLSAgICB3c3B0cltEQ1RTSVpFKjNdID0gKGludCkgREVTQ0FMRSh0bXAxMyArIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7Ci0gICAgd3NwdHJbRENUU0laRSo0XSA9IChpbnQpIERFU0NBTEUodG1wMTMgLSB0bXAwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOwotICAgIAotICAgIGlucHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVycyB0byBuZXh0IGNvbHVtbiAqLwotICAgIHF1YW50cHRyKys7Ci0gICAgd3NwdHIrKzsKLSAgfQotICAKLSAgLyogUGFzcyAyOiBwcm9jZXNzIHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4gKi8KLSAgLyogTm90ZSB0aGF0IHdlIG11c3QgZGVzY2FsZSB0aGUgcmVzdWx0cyBieSBhIGZhY3RvciBvZiA4ID09IDIqKjMsICovCi0gIC8qIGFuZCBhbHNvIHVuZG8gdGhlIFBBU1MxX0JJVFMgc2NhbGluZy4gKi8KLQotICB3c3B0ciA9IHdvcmtzcGFjZTsKLSAgZm9yIChjdHIgPSAwOyBjdHIgPCBEQ1RTSVpFOyBjdHIrKykgewotICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7Ci0gICAgLyogUm93cyBvZiB6ZXJvZXMgY2FuIGJlIGV4cGxvaXRlZCBpbiB0aGUgc2FtZSB3YXkgYXMgd2UgZGlkIHdpdGggY29sdW1ucy4KLSAgICAgKiBIb3dldmVyLCB0aGUgY29sdW1uIGNhbGN1bGF0aW9uIGhhcyBjcmVhdGVkIG1hbnkgbm9uemVybyBBQyB0ZXJtcywgc28KLSAgICAgKiB0aGUgc2ltcGxpZmljYXRpb24gYXBwbGllcyBsZXNzIG9mdGVuICh0eXBpY2FsbHkgNSUgdG8gMTAlIG9mIHRoZSB0aW1lKS4KLSAgICAgKiBPbiBtYWNoaW5lcyB3aXRoIHZlcnkgZmFzdCBtdWx0aXBsaWNhdGlvbiwgaXQncyBwb3NzaWJsZSB0aGF0IHRoZQotICAgICAqIHRlc3QgdGFrZXMgbW9yZSB0aW1lIHRoYW4gaXQncyB3b3J0aC4gIEluIHRoYXQgY2FzZSB0aGlzIHNlY3Rpb24KLSAgICAgKiBtYXkgYmUgY29tbWVudGVkIG91dC4KLSAgICAgKi8KLSAgICAKLSNpZm5kZWYgTk9fWkVST19ST1dfVEVTVAotICAgIGlmICh3c3B0clsxXSA9PSAwICYmIHdzcHRyWzJdID09IDAgJiYgd3NwdHJbM10gPT0gMCAmJiB3c3B0cls0XSA9PSAwICYmCi0Jd3NwdHJbNV0gPT0gMCAmJiB3c3B0cls2XSA9PSAwICYmIHdzcHRyWzddID09IDApIHsKLSAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCi0gICAgICBKU0FNUExFIGRjdmFsID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpIHdzcHRyWzBdLCBQQVNTMV9CSVRTKzMpCi0JCQkJICAmIFJBTkdFX01BU0tdOwotICAgICAgCi0gICAgICBvdXRwdHJbMF0gPSBkY3ZhbDsKLSAgICAgIG91dHB0clsxXSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzJdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbM10gPSBkY3ZhbDsKLSAgICAgIG91dHB0cls0XSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzVdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbNl0gPSBkY3ZhbDsKLSAgICAgIG91dHB0cls3XSA9IGRjdmFsOwotCi0gICAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCi0gICAgICBjb250aW51ZTsKLSAgICB9Ci0jZW5kaWYKLSAgICAKLSAgICAvKiBFdmVuIHBhcnQ6IHJldmVyc2UgdGhlIGV2ZW4gcGFydCBvZiB0aGUgZm9yd2FyZCBEQ1QuICovCi0gICAgLyogVGhlIHJvdGF0b3IgaXMgc3FydCgyKSpjKC02KS4gKi8KLSAgICAKLSAgICB6MiA9IChJTlQzMikgd3NwdHJbMl07Ci0gICAgejMgPSAoSU5UMzIpIHdzcHRyWzZdOwotICAgIAotICAgIHoxID0gTVVMVElQTFkoejIgKyB6MywgRklYXzBfNTQxMTk2MTAwKTsKLSAgICB0bXAyID0gejEgKyBNVUxUSVBMWSh6MywgLSBGSVhfMV84NDc3NTkwNjUpOwotICAgIHRtcDMgPSB6MSArIE1VTFRJUExZKHoyLCBGSVhfMF83NjUzNjY4NjUpOwotICAgIAotICAgIHRtcDAgPSAoKElOVDMyKSB3c3B0clswXSArIChJTlQzMikgd3NwdHJbNF0pIDw8IENPTlNUX0JJVFM7Ci0gICAgdG1wMSA9ICgoSU5UMzIpIHdzcHRyWzBdIC0gKElOVDMyKSB3c3B0cls0XSkgPDwgQ09OU1RfQklUUzsKLSAgICAKLSAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOwotICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7Ci0gICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKLSAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOwotICAgIAotICAgIC8qIE9kZCBwYXJ0IHBlciBmaWd1cmUgODsgdGhlIG1hdHJpeCBpcyB1bml0YXJ5IGFuZCBoZW5jZSBpdHMKLSAgICAgKiB0cmFuc3Bvc2UgaXMgaXRzIGludmVyc2UuICBpMC4uaTMgYXJlIHk3LHk1LHkzLHkxIHJlc3BlY3RpdmVseS4KLSAgICAgKi8KLSAgICAKLSAgICB0bXAwID0gKElOVDMyKSB3c3B0cls3XTsKLSAgICB0bXAxID0gKElOVDMyKSB3c3B0cls1XTsKLSAgICB0bXAyID0gKElOVDMyKSB3c3B0clszXTsKLSAgICB0bXAzID0gKElOVDMyKSB3c3B0clsxXTsKLSAgICAKLSAgICB6MSA9IHRtcDAgKyB0bXAzOwotICAgIHoyID0gdG1wMSArIHRtcDI7Ci0gICAgejMgPSB0bXAwICsgdG1wMjsKLSAgICB6NCA9IHRtcDEgKyB0bXAzOwotICAgIHo1ID0gTVVMVElQTFkoejMgKyB6NCwgRklYXzFfMTc1ODc1NjAyKTsgLyogc3FydCgyKSAqIGMzICovCi0gICAgCi0gICAgdG1wMCA9IE1VTFRJUExZKHRtcDAsIEZJWF8wXzI5ODYzMTMzNik7IC8qIHNxcnQoMikgKiAoLWMxK2MzK2M1LWM3KSAqLwotICAgIHRtcDEgPSBNVUxUSVBMWSh0bXAxLCBGSVhfMl8wNTMxMTk4NjkpOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNStjNykgKi8KLSAgICB0bXAyID0gTVVMVElQTFkodG1wMiwgRklYXzNfMDcyNzExMDI2KTsgLyogc3FydCgyKSAqICggYzErYzMrYzUtYzcpICovCi0gICAgdG1wMyA9IE1VTFRJUExZKHRtcDMsIEZJWF8xXzUwMTMyMTExMCk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1LWM3KSAqLwotICAgIHoxID0gTVVMVElQTFkoejEsIC0gRklYXzBfODk5OTc2MjIzKTsgLyogc3FydCgyKSAqIChjNy1jMykgKi8KLSAgICB6MiA9IE1VTFRJUExZKHoyLCAtIEZJWF8yXzU2MjkxNTQ0Nyk7IC8qIHNxcnQoMikgKiAoLWMxLWMzKSAqLwotICAgIHozID0gTVVMVElQTFkoejMsIC0gRklYXzFfOTYxNTcwNTYwKTsgLyogc3FydCgyKSAqICgtYzMtYzUpICovCi0gICAgejQgPSBNVUxUSVBMWSh6NCwgLSBGSVhfMF8zOTAxODA2NDQpOyAvKiBzcXJ0KDIpICogKGM1LWMzKSAqLwotICAgIAotICAgIHozICs9IHo1OwotICAgIHo0ICs9IHo1OwotICAgIAotICAgIHRtcDAgKz0gejEgKyB6MzsKLSAgICB0bXAxICs9IHoyICsgejQ7Ci0gICAgdG1wMiArPSB6MiArIHozOwotICAgIHRtcDMgKz0gejEgKyB6NDsKLSAgICAKLSAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2U6IGlucHV0cyBhcmUgdG1wMTAuLnRtcDEzLCB0bXAwLi50bXAzICovCi0gICAgCi0gICAgb3V0cHRyWzBdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMCArIHRtcDMsCi0JCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbN10gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEwIC0gdG1wMywKLQkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTEgKyB0bXAyLAotCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzZdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMSAtIHRtcDIsCi0JCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbMl0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEyICsgdG1wMSwKLQkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0cls1XSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTIgLSB0bXAxLAotCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzNdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMyArIHRtcDAsCi0JCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbNF0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEzIC0gdG1wMCwKLQkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIAotICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KLSAgfQotfQotCi0jZW5kaWYgLyogRENUX0lTTE9XX1NVUFBPUlRFRCAqLwotCi0jZW5kaWYgLy9fRlhfSlBFR19UVVJCT18KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2ppZGN0cmVkLmMgYi9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qaWRjdHJlZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjRiODA3Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2ppZGN0cmVkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDEgKzAsMCBAQAotI2lmICFkZWZpbmVkKF9GWF9KUEVHX1RVUkJPXykKLS8qCi0gKiBqaWRjdHJlZC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgaW52ZXJzZS1EQ1Qgcm91dGluZXMgdGhhdCBwcm9kdWNlIHJlZHVjZWQtc2l6ZSBvdXRwdXQ6Ci0gKiBlaXRoZXIgNHg0LCAyeDIsIG9yIDF4MSBwaXhlbHMgZnJvbSBhbiA4eDggRENUIGJsb2NrLgotICoKLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgTG9lZmZsZXIsIExpZ3RlbmJlcmcgYW5kIE1vc2NoeXR6IChMTCZNKQotICogYWxnb3JpdGhtIHVzZWQgaW4gamlkY3RpbnQuYy4gIFdlIHNpbXBseSByZXBsYWNlIGVhY2ggOC10by04IDEtRCBJRENUIHN0ZXAKLSAqIHdpdGggYW4gOC10by00IHN0ZXAgdGhhdCBwcm9kdWNlcyB0aGUgZm91ciBhdmVyYWdlcyBvZiB0d28gYWRqYWNlbnQgb3V0cHV0cwotICogKG9yIGFuIDgtdG8tMiBzdGVwIHByb2R1Y2luZyB0d28gYXZlcmFnZXMgb2YgZm91ciBvdXRwdXRzLCBmb3IgMngyIG91dHB1dCkuCi0gKiBUaGVzZSBzdGVwcyB3ZXJlIGRlcml2ZWQgYnkgY29tcHV0aW5nIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBhdCB0aGUgZW5kCi0gKiBvZiB0aGUgbm9ybWFsIExMJk0gY29kZSwgdGhlbiBzaW1wbGlmeWluZyBhcyBtdWNoIGFzIHBvc3NpYmxlLgotICoKLSAqIDF4MSBpcyB0cml2aWFsOiBqdXN0IHRha2UgdGhlIERDIGNvZWZmaWNpZW50IGRpdmlkZWQgYnkgOC4KLSAqCi0gKiBTZWUgamlkY3RpbnQuYyBmb3IgYWRkaXRpb25hbCBjb21tZW50cy4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiamRjdC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KLQotI2lmZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURUQKLQotCi0vKgotICogVGhpcyBtb2R1bGUgaXMgc3BlY2lhbGl6ZWQgdG8gdGhlIGNhc2UgRENUU0laRSA9IDguCi0gKi8KLQotI2lmIERDVFNJWkUgIT0gOAotICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCi0jZW5kaWYKLQotCi0vKiBTY2FsaW5nIGlzIHRoZSBzYW1lIGFzIGluIGppZGN0aW50LmMuICovCi0KLSNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAotI2RlZmluZSBDT05TVF9CSVRTICAxMwotI2RlZmluZSBQQVNTMV9CSVRTICAyCi0jZWxzZQotI2RlZmluZSBDT05TVF9CSVRTICAxMwotI2RlZmluZSBQQVNTMV9CSVRTICAxCQkvKiBsb3NlIGEgbGl0dGxlIHByZWNpc2lvbiB0byBhdm9pZCBvdmVyZmxvdyAqLwotI2VuZGlmCi0KLS8qIFNvbWUgQyBjb21waWxlcnMgZmFpbCB0byByZWR1Y2UgIkZJWChjb25zdGFudCkiIGF0IGNvbXBpbGUgdGltZSwgdGh1cwotICogY2F1c2luZyBhIGxvdCBvZiB1c2VsZXNzIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgYXQgcnVuIHRpbWUuCi0gKiBUbyBnZXQgYXJvdW5kIHRoaXMgd2UgdXNlIHRoZSBmb2xsb3dpbmcgcHJlLWNhbGN1bGF0ZWQgY29uc3RhbnRzLgotICogSWYgeW91IGNoYW5nZSBDT05TVF9CSVRTIHlvdSBtYXkgd2FudCB0byBhZGQgYXBwcm9wcmlhdGUgdmFsdWVzLgotICogKFdpdGggYSByZWFzb25hYmxlIEMgY29tcGlsZXIsIHlvdSBjYW4ganVzdCByZWx5IG9uIHRoZSBGSVgoKSBtYWNyby4uLikKLSAqLwotCi0jaWYgQ09OU1RfQklUUyA9PSAxMwotI2RlZmluZSBGSVhfMF8yMTExNjQyNDMgICgoSU5UMzIpICAxNzMwKQkvKiBGSVgoMC4yMTExNjQyNDMpICovCi0jZGVmaW5lIEZJWF8wXzUwOTc5NTU3OSAgKChJTlQzMikgIDQxNzYpCS8qIEZJWCgwLjUwOTc5NTU3OSkgKi8KLSNkZWZpbmUgRklYXzBfNjAxMzQ0ODg3ICAoKElOVDMyKSAgNDkyNikJLyogRklYKDAuNjAxMzQ0ODg3KSAqLwotI2RlZmluZSBGSVhfMF83MjA5NTk4MjIgICgoSU5UMzIpICA1OTA2KQkvKiBGSVgoMC43MjA5NTk4MjIpICovCi0jZGVmaW5lIEZJWF8wXzc2NTM2Njg2NSAgKChJTlQzMikgIDYyNzApCS8qIEZJWCgwLjc2NTM2Njg2NSkgKi8KLSNkZWZpbmUgRklYXzBfODUwNDMwMDk1ICAoKElOVDMyKSAgNjk2NykJLyogRklYKDAuODUwNDMwMDk1KSAqLwotI2RlZmluZSBGSVhfMF84OTk5NzYyMjMgICgoSU5UMzIpICA3MzczKQkvKiBGSVgoMC44OTk5NzYyMjMpICovCi0jZGVmaW5lIEZJWF8xXzA2MTU5NDMzNyAgKChJTlQzMikgIDg2OTcpCS8qIEZJWCgxLjA2MTU5NDMzNykgKi8KLSNkZWZpbmUgRklYXzFfMjcyNzU4NTgwICAoKElOVDMyKSAgMTA0MjYpCS8qIEZJWCgxLjI3Mjc1ODU4MCkgKi8KLSNkZWZpbmUgRklYXzFfNDUxNzc0OTgxICAoKElOVDMyKSAgMTE4OTMpCS8qIEZJWCgxLjQ1MTc3NDk4MSkgKi8KLSNkZWZpbmUgRklYXzFfODQ3NzU5MDY1ICAoKElOVDMyKSAgMTUxMzcpCS8qIEZJWCgxLjg0Nzc1OTA2NSkgKi8KLSNkZWZpbmUgRklYXzJfMTcyNzM0ODAzICAoKElOVDMyKSAgMTc3OTkpCS8qIEZJWCgyLjE3MjczNDgwMykgKi8KLSNkZWZpbmUgRklYXzJfNTYyOTE1NDQ3ICAoKElOVDMyKSAgMjA5OTUpCS8qIEZJWCgyLjU2MjkxNTQ0NykgKi8KLSNkZWZpbmUgRklYXzNfNjI0NTA5Nzg1ICAoKElOVDMyKSAgMjk2OTIpCS8qIEZJWCgzLjYyNDUwOTc4NSkgKi8KLSNlbHNlCi0jZGVmaW5lIEZJWF8wXzIxMTE2NDI0MyAgRklYKDAuMjExMTY0MjQzKQotI2RlZmluZSBGSVhfMF81MDk3OTU1NzkgIEZJWCgwLjUwOTc5NTU3OSkKLSNkZWZpbmUgRklYXzBfNjAxMzQ0ODg3ICBGSVgoMC42MDEzNDQ4ODcpCi0jZGVmaW5lIEZJWF8wXzcyMDk1OTgyMiAgRklYKDAuNzIwOTU5ODIyKQotI2RlZmluZSBGSVhfMF83NjUzNjY4NjUgIEZJWCgwLjc2NTM2Njg2NSkKLSNkZWZpbmUgRklYXzBfODUwNDMwMDk1ICBGSVgoMC44NTA0MzAwOTUpCi0jZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgRklYKDAuODk5OTc2MjIzKQotI2RlZmluZSBGSVhfMV8wNjE1OTQzMzcgIEZJWCgxLjA2MTU5NDMzNykKLSNkZWZpbmUgRklYXzFfMjcyNzU4NTgwICBGSVgoMS4yNzI3NTg1ODApCi0jZGVmaW5lIEZJWF8xXzQ1MTc3NDk4MSAgRklYKDEuNDUxNzc0OTgxKQotI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgIEZJWCgxLjg0Nzc1OTA2NSkKLSNkZWZpbmUgRklYXzJfMTcyNzM0ODAzICBGSVgoMi4xNzI3MzQ4MDMpCi0jZGVmaW5lIEZJWF8yXzU2MjkxNTQ0NyAgRklYKDIuNTYyOTE1NDQ3KQotI2RlZmluZSBGSVhfM182MjQ1MDk3ODUgIEZJWCgzLjYyNDUwOTc4NSkKLSNlbmRpZgotCi0KLS8qIE11bHRpcGx5IGFuIElOVDMyIHZhcmlhYmxlIGJ5IGFuIElOVDMyIGNvbnN0YW50IHRvIHlpZWxkIGFuIElOVDMyIHJlc3VsdC4KLSAqIEZvciA4LWJpdCBzYW1wbGVzIHdpdGggdGhlIHJlY29tbWVuZGVkIHNjYWxpbmcsIGFsbCB0aGUgdmFyaWFibGUKLSAqIGFuZCBjb25zdGFudCB2YWx1ZXMgaW52b2x2ZWQgYXJlIG5vIG1vcmUgdGhhbiAxNiBiaXRzIHdpZGUsIHNvIGEKLSAqIDE2eDE2LT4zMiBiaXQgbXVsdGlwbHkgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIGZ1bGwgMzJ4MzIgbXVsdGlwbHkuCi0gKiBGb3IgMTItYml0IHNhbXBsZXMsIGEgZnVsbCAzMi1iaXQgbXVsdGlwbGljYXRpb24gd2lsbCBiZSBuZWVkZWQuCi0gKi8KLQotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci0jZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgIE1VTFRJUExZMTZDMTYodmFyLGNvbnN0KQotI2Vsc2UKLSNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgKCh2YXIpICogKGNvbnN0KSkKLSNlbmRpZgotCi0KLS8qIERlcXVhbnRpemUgYSBjb2VmZmljaWVudCBieSBtdWx0aXBseWluZyBpdCBieSB0aGUgbXVsdGlwbGllci10YWJsZQotICogZW50cnk7IHByb2R1Y2UgYW4gaW50IHJlc3VsdC4gIEluIHRoaXMgbW9kdWxlLCBib3RoIGlucHV0cyBhbmQgcmVzdWx0Ci0gKiBhcmUgMTYgYml0cyBvciBsZXNzLCBzbyBlaXRoZXIgaW50IG9yIHNob3J0IG11bHRpcGx5IHdpbGwgd29yay4KLSAqLwotCi0jZGVmaW5lIERFUVVBTlRJWkUoY29lZixxdWFudHZhbCkgICgoKElTTE9XX01VTFRfVFlQRSkgKGNvZWYpKSAqIChxdWFudHZhbCkpCi0KLQotLyoKLSAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMsCi0gKiBwcm9kdWNpbmcgYSByZWR1Y2VkLXNpemUgNHg0IG91dHB1dCBibG9jay4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfaWRjdF80eDQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAotCSAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKLXsKLSAgSU5UMzIgdG1wMCwgdG1wMiwgdG1wMTAsIHRtcDEyOwotICBJTlQzMiB6MSwgejIsIHozLCB6NDsKLSAgSkNPRUZQVFIgaW5wdHI7Ci0gIElTTE9XX01VTFRfVFlQRSAqIHF1YW50cHRyOwotICBpbnQgKiB3c3B0cjsKLSAgSlNBTVBST1cgb3V0cHRyOwotICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOwotICBpbnQgY3RyOwotICBpbnQgd29ya3NwYWNlW0RDVFNJWkUqNF07CS8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLwotICBTSElGVF9URU1QUwotCi0gIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4gKi8KLQotICBpbnB0ciA9IGNvZWZfYmxvY2s7Ci0gIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7Ci0gIHdzcHRyID0gd29ya3NwYWNlOwotICBmb3IgKGN0ciA9IERDVFNJWkU7IGN0ciA+IDA7IGlucHRyKyssIHF1YW50cHRyKyssIHdzcHRyKyssIGN0ci0tKSB7Ci0gICAgLyogRG9uJ3QgYm90aGVyIHRvIHByb2Nlc3MgY29sdW1uIDQsIGJlY2F1c2Ugc2Vjb25kIHBhc3Mgd29uJ3QgdXNlIGl0ICovCi0gICAgaWYgKGN0ciA9PSBEQ1RTSVpFLTQpCi0gICAgICBjb250aW51ZTsKLSAgICBpZiAoaW5wdHJbRENUU0laRSoxXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqMl0gPT0gMCAmJgotCWlucHRyW0RDVFNJWkUqM10gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjVdID09IDAgJiYKLQlpbnB0cltEQ1RTSVpFKjZdID09IDAgJiYgaW5wdHJbRENUU0laRSo3XSA9PSAwKSB7Ci0gICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybzsgd2UgbmVlZCBub3QgZXhhbWluZSB0ZXJtIDQgZm9yIDR4NCBvdXRwdXQgKi8KLSAgICAgIGludCBkY3ZhbCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSkgPDwgUEFTUzFfQklUUzsKLSAgICAgIAotICAgICAgd3NwdHJbRENUU0laRSowXSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSoxXSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSoyXSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSozXSA9IGRjdmFsOwotICAgICAgCi0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgCi0gICAgLyogRXZlbiBwYXJ0ICovCi0gICAgCi0gICAgdG1wMCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7Ci0gICAgdG1wMCA8PD0gKENPTlNUX0JJVFMrMSk7Ci0gICAgCi0gICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOwotICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjZdLCBxdWFudHB0cltEQ1RTSVpFKjZdKTsKLQotICAgIHRtcDIgPSBNVUxUSVBMWSh6MiwgRklYXzFfODQ3NzU5MDY1KSArIE1VTFRJUExZKHozLCAtIEZJWF8wXzc2NTM2Njg2NSk7Ci0gICAgCi0gICAgdG1wMTAgPSB0bXAwICsgdG1wMjsKLSAgICB0bXAxMiA9IHRtcDAgLSB0bXAyOwotICAgIAotICAgIC8qIE9kZCBwYXJ0ICovCi0gICAgCi0gICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqN10sIHF1YW50cHRyW0RDVFNJWkUqN10pOwotICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKLSAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7Ci0gICAgejQgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMV0sIHF1YW50cHRyW0RDVFNJWkUqMV0pOwotICAgIAotICAgIHRtcDAgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF8yMTExNjQyNDMpIC8qIHNxcnQoMikgKiAoYzMtYzEpICovCi0JICsgTVVMVElQTFkoejIsIEZJWF8xXzQ1MTc3NDk4MSkgLyogc3FydCgyKSAqIChjMytjNykgKi8KLQkgKyBNVUxUSVBMWSh6MywgLSBGSVhfMl8xNzI3MzQ4MDMpIC8qIHNxcnQoMikgKiAoLWMxLWM1KSAqLwotCSArIE1VTFRJUExZKHo0LCBGSVhfMV8wNjE1OTQzMzcpOyAvKiBzcXJ0KDIpICogKGM1K2M3KSAqLwotICAgIAotICAgIHRtcDIgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF81MDk3OTU1NzkpIC8qIHNxcnQoMikgKiAoYzctYzUpICovCi0JICsgTVVMVElQTFkoejIsIC0gRklYXzBfNjAxMzQ0ODg3KSAvKiBzcXJ0KDIpICogKGM1LWMxKSAqLwotCSArIE1VTFRJUExZKHozLCBGSVhfMF84OTk5NzYyMjMpIC8qIHNxcnQoMikgKiAoYzMtYzcpICovCi0JICsgTVVMVElQTFkoejQsIEZJWF8yXzU2MjkxNTQ0Nyk7IC8qIHNxcnQoMikgKiAoYzErYzMpICovCi0KLSAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KLSAgICAKLSAgICB3c3B0cltEQ1RTSVpFKjBdID0gKGludCkgREVTQ0FMRSh0bXAxMCArIHRtcDIsIENPTlNUX0JJVFMtUEFTUzFfQklUUysxKTsKLSAgICB3c3B0cltEQ1RTSVpFKjNdID0gKGludCkgREVTQ0FMRSh0bXAxMCAtIHRtcDIsIENPTlNUX0JJVFMtUEFTUzFfQklUUysxKTsKLSAgICB3c3B0cltEQ1RTSVpFKjFdID0gKGludCkgREVTQ0FMRSh0bXAxMiArIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUysxKTsKLSAgICB3c3B0cltEQ1RTSVpFKjJdID0gKGludCkgREVTQ0FMRSh0bXAxMiAtIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUysxKTsKLSAgfQotICAKLSAgLyogUGFzcyAyOiBwcm9jZXNzIDQgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LiAqLwotCi0gIHdzcHRyID0gd29ya3NwYWNlOwotICBmb3IgKGN0ciA9IDA7IGN0ciA8IDQ7IGN0cisrKSB7Ci0gICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKLSAgICAvKiBJdCdzIG5vdCBjbGVhciB3aGV0aGVyIGEgemVybyByb3cgdGVzdCBpcyB3b3J0aHdoaWxlIGhlcmUgLi4uICovCi0KLSNpZm5kZWYgTk9fWkVST19ST1dfVEVTVAotICAgIGlmICh3c3B0clsxXSA9PSAwICYmIHdzcHRyWzJdID09IDAgJiYgd3NwdHJbM10gPT0gMCAmJgotCXdzcHRyWzVdID09IDAgJiYgd3NwdHJbNl0gPT0gMCAmJiB3c3B0cls3XSA9PSAwKSB7Ci0gICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybyAqLwotICAgICAgSlNBTVBMRSBkY3ZhbCA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUoKElOVDMyKSB3c3B0clswXSwgUEFTUzFfQklUUyszKQotCQkJCSAgJiBSQU5HRV9NQVNLXTsKLSAgICAgIAotICAgICAgb3V0cHRyWzBdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbMV0gPSBkY3ZhbDsKLSAgICAgIG91dHB0clsyXSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzNdID0gZGN2YWw7Ci0gICAgICAKLSAgICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSNlbmRpZgotICAgIAotICAgIC8qIEV2ZW4gcGFydCAqLwotICAgIAotICAgIHRtcDAgPSAoKElOVDMyKSB3c3B0clswXSkgPDwgKENPTlNUX0JJVFMrMSk7Ci0gICAgCi0gICAgdG1wMiA9IE1VTFRJUExZKChJTlQzMikgd3NwdHJbMl0sIEZJWF8xXzg0Nzc1OTA2NSkKLQkgKyBNVUxUSVBMWSgoSU5UMzIpIHdzcHRyWzZdLCAtIEZJWF8wXzc2NTM2Njg2NSk7Ci0gICAgCi0gICAgdG1wMTAgPSB0bXAwICsgdG1wMjsKLSAgICB0bXAxMiA9IHRtcDAgLSB0bXAyOwotICAgIAotICAgIC8qIE9kZCBwYXJ0ICovCi0gICAgCi0gICAgejEgPSAoSU5UMzIpIHdzcHRyWzddOwotICAgIHoyID0gKElOVDMyKSB3c3B0cls1XTsKLSAgICB6MyA9IChJTlQzMikgd3NwdHJbM107Ci0gICAgejQgPSAoSU5UMzIpIHdzcHRyWzFdOwotICAgIAotICAgIHRtcDAgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF8yMTExNjQyNDMpIC8qIHNxcnQoMikgKiAoYzMtYzEpICovCi0JICsgTVVMVElQTFkoejIsIEZJWF8xXzQ1MTc3NDk4MSkgLyogc3FydCgyKSAqIChjMytjNykgKi8KLQkgKyBNVUxUSVBMWSh6MywgLSBGSVhfMl8xNzI3MzQ4MDMpIC8qIHNxcnQoMikgKiAoLWMxLWM1KSAqLwotCSArIE1VTFRJUExZKHo0LCBGSVhfMV8wNjE1OTQzMzcpOyAvKiBzcXJ0KDIpICogKGM1K2M3KSAqLwotICAgIAotICAgIHRtcDIgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF81MDk3OTU1NzkpIC8qIHNxcnQoMikgKiAoYzctYzUpICovCi0JICsgTVVMVElQTFkoejIsIC0gRklYXzBfNjAxMzQ0ODg3KSAvKiBzcXJ0KDIpICogKGM1LWMxKSAqLwotCSArIE1VTFRJUExZKHozLCBGSVhfMF84OTk5NzYyMjMpIC8qIHNxcnQoMikgKiAoYzMtYzcpICovCi0JICsgTVVMVElQTFkoejQsIEZJWF8yXzU2MjkxNTQ0Nyk7IC8qIHNxcnQoMikgKiAoYzErYzMpICovCi0KLSAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KLSAgICAKLSAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMiwKLQkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysxKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzNdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMCAtIHRtcDIsCi0JCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMrMSkKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTIgKyB0bXAwLAotCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKzEpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbMl0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEyIC0gdG1wMCwKLQkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysxKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgCi0gICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLwotICB9Ci19Ci0KLQotLyoKLSAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMsCi0gKiBwcm9kdWNpbmcgYSByZWR1Y2VkLXNpemUgMngyIG91dHB1dCBibG9jay4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfaWRjdF8yeDIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAotCSAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKLXsKLSAgSU5UMzIgdG1wMCwgdG1wMTAsIHoxOwotICBKQ09FRlBUUiBpbnB0cjsKLSAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7Ci0gIGludCAqIHdzcHRyOwotICBKU0FNUFJPVyBvdXRwdHI7Ci0gIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7Ci0gIGludCBjdHI7Ci0gIGludCB3b3Jrc3BhY2VbRENUU0laRSoyXTsJLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCi0gIFNISUZUX1RFTVBTCi0KLSAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LiAqLwotCi0gIGlucHRyID0gY29lZl9ibG9jazsKLSAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKLSAgd3NwdHIgPSB3b3Jrc3BhY2U7Ci0gIGZvciAoY3RyID0gRENUU0laRTsgY3RyID4gMDsgaW5wdHIrKywgcXVhbnRwdHIrKywgd3NwdHIrKywgY3RyLS0pIHsKLSAgICAvKiBEb24ndCBib3RoZXIgdG8gcHJvY2VzcyBjb2x1bW5zIDIsNCw2ICovCi0gICAgaWYgKGN0ciA9PSBEQ1RTSVpFLTIgfHwgY3RyID09IERDVFNJWkUtNCB8fCBjdHIgPT0gRENUU0laRS02KQotICAgICAgY29udGludWU7Ci0gICAgaWYgKGlucHRyW0RDVFNJWkUqMV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjNdID09IDAgJiYKLQlpbnB0cltEQ1RTSVpFKjVdID09IDAgJiYgaW5wdHJbRENUU0laRSo3XSA9PSAwKSB7Ci0gICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybzsgd2UgbmVlZCBub3QgZXhhbWluZSB0ZXJtcyAyLDQsNiBmb3IgMngyIG91dHB1dCAqLwotICAgICAgaW50IGRjdmFsID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKSA8PCBQQVNTMV9CSVRTOwotICAgICAgCi0gICAgICB3c3B0cltEQ1RTSVpFKjBdID0gZGN2YWw7Ci0gICAgICB3c3B0cltEQ1RTSVpFKjFdID0gZGN2YWw7Ci0gICAgICAKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICAKLSAgICAvKiBFdmVuIHBhcnQgKi8KLSAgICAKLSAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7Ci0gICAgdG1wMTAgPSB6MSA8PCAoQ09OU1RfQklUUysyKTsKLSAgICAKLSAgICAvKiBPZGQgcGFydCAqLwotCi0gICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqN10sIHF1YW50cHRyW0RDVFNJWkUqN10pOwotICAgIHRtcDAgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF83MjA5NTk4MjIpOyAvKiBzcXJ0KDIpICogKGM3LWM1K2MzLWMxKSAqLwotICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKLSAgICB0bXAwICs9IE1VTFRJUExZKHoxLCBGSVhfMF84NTA0MzAwOTUpOyAvKiBzcXJ0KDIpICogKC1jMStjMytjNStjNykgKi8KLSAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7Ci0gICAgdG1wMCArPSBNVUxUSVBMWSh6MSwgLSBGSVhfMV8yNzI3NTg1ODApOyAvKiBzcXJ0KDIpICogKC1jMStjMy1jNS1jNykgKi8KLSAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7Ci0gICAgdG1wMCArPSBNVUxUSVBMWSh6MSwgRklYXzNfNjI0NTA5Nzg1KTsgLyogc3FydCgyKSAqIChjMStjMytjNStjNykgKi8KLQotICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLwotICAgIAotICAgIHdzcHRyW0RDVFNJWkUqMF0gPSAoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzIpOwotICAgIHdzcHRyW0RDVFNJWkUqMV0gPSAoaW50KSBERVNDQUxFKHRtcDEwIC0gdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzIpOwotICB9Ci0gIAotICAvKiBQYXNzIDI6IHByb2Nlc3MgMiByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuICovCi0KLSAgd3NwdHIgPSB3b3Jrc3BhY2U7Ci0gIGZvciAoY3RyID0gMDsgY3RyIDwgMjsgY3RyKyspIHsKLSAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOwotICAgIC8qIEl0J3Mgbm90IGNsZWFyIHdoZXRoZXIgYSB6ZXJvIHJvdyB0ZXN0IGlzIHdvcnRod2hpbGUgaGVyZSAuLi4gKi8KLQotI2lmbmRlZiBOT19aRVJPX1JPV19URVNUCi0gICAgaWYgKHdzcHRyWzFdID09IDAgJiYgd3NwdHJbM10gPT0gMCAmJiB3c3B0cls1XSA9PSAwICYmIHdzcHRyWzddID09IDApIHsKLSAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCi0gICAgICBKU0FNUExFIGRjdmFsID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpIHdzcHRyWzBdLCBQQVNTMV9CSVRTKzMpCi0JCQkJICAmIFJBTkdFX01BU0tdOwotICAgICAgCi0gICAgICBvdXRwdHJbMF0gPSBkY3ZhbDsKLSAgICAgIG91dHB0clsxXSA9IGRjdmFsOwotICAgICAgCi0gICAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCi0gICAgICBjb250aW51ZTsKLSAgICB9Ci0jZW5kaWYKLSAgICAKLSAgICAvKiBFdmVuIHBhcnQgKi8KLSAgICAKLSAgICB0bXAxMCA9ICgoSU5UMzIpIHdzcHRyWzBdKSA8PCAoQ09OU1RfQklUUysyKTsKLSAgICAKLSAgICAvKiBPZGQgcGFydCAqLwotCi0gICAgdG1wMCA9IE1VTFRJUExZKChJTlQzMikgd3NwdHJbN10sIC0gRklYXzBfNzIwOTU5ODIyKSAvKiBzcXJ0KDIpICogKGM3LWM1K2MzLWMxKSAqLwotCSArIE1VTFRJUExZKChJTlQzMikgd3NwdHJbNV0sIEZJWF8wXzg1MDQzMDA5NSkgLyogc3FydCgyKSAqICgtYzErYzMrYzUrYzcpICovCi0JICsgTVVMVElQTFkoKElOVDMyKSB3c3B0clszXSwgLSBGSVhfMV8yNzI3NTg1ODApIC8qIHNxcnQoMikgKiAoLWMxK2MzLWM1LWM3KSAqLwotCSArIE1VTFRJUExZKChJTlQzMikgd3NwdHJbMV0sIEZJWF8zXzYyNDUwOTc4NSk7IC8qIHNxcnQoMikgKiAoYzErYzMrYzUrYzcpICovCi0KLSAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KLSAgICAKLSAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMCwKLQkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysyKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMCAtIHRtcDAsCi0JCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMrMikKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIAotICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KLSAgfQotfQotCi0KLS8qCi0gKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLAotICogcHJvZHVjaW5nIGEgcmVkdWNlZC1zaXplIDF4MSBvdXRwdXQgYmxvY2suCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2lkY3RfMXgxIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywKLQkgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCi17Ci0gIGludCBkY3ZhbDsKLSAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7Ci0gIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7Ci0gIFNISUZUX1RFTVBTCi0KLSAgLyogV2UgaGFyZGx5IG5lZWQgYW4gaW52ZXJzZSBEQ1Qgcm91dGluZSBmb3IgdGhpczoganVzdCB0YWtlIHRoZQotICAgKiBhdmVyYWdlIHBpeGVsIHZhbHVlLCB3aGljaCBpcyBvbmUtZWlnaHRoIG9mIHRoZSBEQyBjb2VmZmljaWVudC4KLSAgICovCi0gIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7Ci0gIGRjdmFsID0gREVRVUFOVElaRShjb2VmX2Jsb2NrWzBdLCBxdWFudHB0clswXSk7Ci0gIGRjdmFsID0gKGludCkgREVTQ0FMRSgoSU5UMzIpIGRjdmFsLCAzKTsKLQotICBvdXRwdXRfYnVmWzBdW291dHB1dF9jb2xdID0gcmFuZ2VfbGltaXRbZGN2YWwgJiBSQU5HRV9NQVNLXTsKLX0KLQotI2VuZGlmIC8qIElEQ1RfU0NBTElOR19TVVBQT1JURUQgKi8KLQotI2VuZGlmIC8vX0ZYX0pQRUdfVFVSQk9fCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qbWVtbWdyLmMgYi9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qbWVtbWdyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMDEwMmYuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfam1lbW1nci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEyMyArMCwwIEBACi0jaWYgIWRlZmluZWQoX0ZYX0pQRUdfVFVSQk9fKQotLyoKLSAqIGptZW1tZ3IuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBKUEVHIHN5c3RlbS1pbmRlcGVuZGVudCBtZW1vcnkgbWFuYWdlbWVudAotICogcm91dGluZXMuICBUaGlzIGNvZGUgaXMgdXNhYmxlIGFjcm9zcyBhIHdpZGUgdmFyaWV0eSBvZiBtYWNoaW5lczsgbW9zdAotICogb2YgdGhlIHN5c3RlbSBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIGlzb2xhdGVkIGluIGEgc2VwYXJhdGUgZmlsZS4KLSAqIFRoZSBtYWpvciBmdW5jdGlvbnMgcHJvdmlkZWQgaGVyZSBhcmU6Ci0gKiAgICogcG9vbC1iYXNlZCBhbGxvY2F0aW9uIGFuZCBmcmVlaW5nIG9mIG1lbW9yeTsKLSAqICAgKiBwb2xpY3kgZGVjaXNpb25zIGFib3V0IGhvdyB0byBkaXZpZGUgYXZhaWxhYmxlIG1lbW9yeSBhbW9uZyB0aGUKLSAqICAgICB2aXJ0dWFsIGFycmF5czsKLSAqICAgKiBjb250cm9sIGxvZ2ljIGZvciBzd2FwcGluZyB2aXJ0dWFsIGFycmF5cyBiZXR3ZWVuIG1haW4gbWVtb3J5IGFuZAotICogICAgIGJhY2tpbmcgc3RvcmFnZS4KLSAqIFRoZSBzZXBhcmF0ZSBzeXN0ZW0tZGVwZW5kZW50IGZpbGUgcHJvdmlkZXMgdGhlIGFjdHVhbCBiYWNraW5nLXN0b3JhZ2UKLSAqIGFjY2VzcyBjb2RlLCBhbmQgaXQgY29udGFpbnMgdGhlIHBvbGljeSBkZWNpc2lvbiBhYm91dCBob3cgbXVjaCB0b3RhbAotICogbWFpbiBtZW1vcnkgdG8gdXNlLgotICogVGhpcyBmaWxlIGlzIHN5c3RlbS1kZXBlbmRlbnQgaW4gdGhlIHNlbnNlIHRoYXQgc29tZSBvZiBpdHMgZnVuY3Rpb25zCi0gKiBhcmUgdW5uZWNlc3NhcnkgaW4gc29tZSBzeXN0ZW1zLiAgRm9yIGV4YW1wbGUsIGlmIHRoZXJlIGlzIGVub3VnaCB2aXJ0dWFsCi0gKiBtZW1vcnkgc28gdGhhdCBiYWNraW5nIHN0b3JhZ2Ugd2lsbCBuZXZlciBiZSB1c2VkLCBtdWNoIG9mIHRoZSB2aXJ0dWFsCi0gKiBhcnJheSBjb250cm9sIGxvZ2ljIGNvdWxkIGJlIHJlbW92ZWQuICAoT2YgY291cnNlLCBpZiB5b3UgaGF2ZSB0aGF0IG11Y2gKLSAqIG1lbW9yeSB0aGVuIHlvdSBzaG91bGRuJ3QgY2FyZSBhYm91dCBhIGxpdHRsZSBiaXQgb2YgdW51c2VkIGNvZGUuLi4pCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2RlZmluZSBBTV9NRU1PUllfTUFOQUdFUgkvKiB3ZSBkZWZpbmUganZpcnRfWGFycmF5X2NvbnRyb2wgc3RydWN0cyAqLwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImptZW1zeXMuaCIJCS8qIGltcG9ydCB0aGUgc3lzdGVtLWRlcGVuZGVudCBkZWNsYXJhdGlvbnMgKi8KLQotI2RlZmluZSBOT19HRVRFTlYJLyogWFlROiAyMDA3LTUtMjIgRG9uJ3QgdXNlIGl0ICovCi0KLSNpZm5kZWYgTk9fR0VURU5WCi0jaWZuZGVmIEhBVkVfU1RETElCX0gJCS8qIDxzdGRsaWIuaD4gc2hvdWxkIGRlY2xhcmUgZ2V0ZW52KCkgKi8KLWV4dGVybiBjaGFyICogZ2V0ZW52IEpQUCgoY29uc3QgY2hhciAqIG5hbWUpKTsKLSNlbmRpZgotI2VuZGlmCi0KLQotLyoKLSAqIFNvbWUgaW1wb3J0YW50IG5vdGVzOgotICogICBUaGUgYWxsb2NhdGlvbiByb3V0aW5lcyBwcm92aWRlZCBoZXJlIG11c3QgbmV2ZXIgcmV0dXJuIE5VTEwuCi0gKiAgIFRoZXkgc2hvdWxkIGV4aXQgdG8gZXJyb3JfZXhpdCBpZiB1bnN1Y2Nlc3NmdWwuCi0gKgotICogICBJdCdzIG5vdCBhIGdvb2QgaWRlYSB0byB0cnkgdG8gbWVyZ2UgdGhlIHNhcnJheSBhbmQgYmFycmF5IHJvdXRpbmVzLAotICogICBldmVuIHRob3VnaCB0aGV5IGFyZSB0ZXh0dWFsbHkgYWxtb3N0IHRoZSBzYW1lLCBiZWNhdXNlIHNhbXBsZXMgYXJlCi0gKiAgIHVzdWFsbHkgc3RvcmVkIGFzIGJ5dGVzIHdoaWxlIGNvZWZmaWNpZW50cyBhcmUgc2hvcnRzIG9yIGludHMuICBUaHVzLAotICogICBpbiBtYWNoaW5lcyB3aGVyZSBieXRlIHBvaW50ZXJzIGhhdmUgYSBkaWZmZXJlbnQgcmVwcmVzZW50YXRpb24gZnJvbQotICogICB3b3JkIHBvaW50ZXJzLCB0aGUgcmVzdWx0aW5nIG1hY2hpbmUgY29kZSBjb3VsZCBub3QgYmUgdGhlIHNhbWUuCi0gKi8KLQotCi0vKgotICogTWFueSBtYWNoaW5lcyByZXF1aXJlIHN0b3JhZ2UgYWxpZ25tZW50OiBsb25ncyBtdXN0IHN0YXJ0IG9uIDQtYnl0ZQotICogYm91bmRhcmllcywgZG91YmxlcyBvbiA4LWJ5dGUgYm91bmRhcmllcywgZXRjLiAgT24gc3VjaCBtYWNoaW5lcywgbWFsbG9jKCkKLSAqIGFsd2F5cyByZXR1cm5zIHBvaW50ZXJzIHRoYXQgYXJlIG11bHRpcGxlcyBvZiB0aGUgd29yc3QtY2FzZSBhbGlnbm1lbnQKLSAqIHJlcXVpcmVtZW50LCBhbmQgd2UgaGFkIGJldHRlciBkbyBzbyB0b28uCi0gKiBUaGVyZSBpc24ndCBhbnkgcmVhbGx5IHBvcnRhYmxlIHdheSB0byBkZXRlcm1pbmUgdGhlIHdvcnN0LWNhc2UgYWxpZ25tZW50Ci0gKiByZXF1aXJlbWVudC4gIFRoaXMgbW9kdWxlIGFzc3VtZXMgdGhhdCB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50IGlzCi0gKiBtdWx0aXBsZXMgb2Ygc2l6ZW9mKEFMSUdOX1RZUEUpLgotICogQnkgZGVmYXVsdCwgd2UgZGVmaW5lIEFMSUdOX1RZUEUgYXMgZG91YmxlLiAgVGhpcyBpcyBuZWNlc3Nhcnkgb24gc29tZQotICogd29ya3N0YXRpb25zICh3aGVyZSBkb3VibGVzIHJlYWxseSBkbyBuZWVkIDgtYnl0ZSBhbGlnbm1lbnQpIGFuZCB3aWxsIHdvcmsKLSAqIGZpbmUgb24gbmVhcmx5IGV2ZXJ5dGhpbmcuICBJZiB5b3VyIG1hY2hpbmUgaGFzIGxlc3NlciBhbGlnbm1lbnQgbmVlZHMsCi0gKiB5b3UgY2FuIHNhdmUgYSBmZXcgYnl0ZXMgYnkgbWFraW5nIEFMSUdOX1RZUEUgc21hbGxlci4KLSAqIFRoZSBvbmx5IHBsYWNlIEkga25vdyBvZiB3aGVyZSB0aGlzIHdpbGwgTk9UIHdvcmsgaXMgY2VydGFpbiBNYWNpbnRvc2gKLSAqIDY4MHgwIGNvbXBpbGVycyB0aGF0IGRlZmluZSBkb3VibGUgYXMgYSAxMC1ieXRlIElFRUUgZXh0ZW5kZWQgZmxvYXQuCi0gKiBEb2luZyAxMC1ieXRlIGFsaWdubWVudCBpcyBjb3VudGVycHJvZHVjdGl2ZSBiZWNhdXNlIGxvbmd3b3JkcyB3b24ndCBiZQotICogYWxpZ25lZCB3ZWxsLiAgUHV0ICIjZGVmaW5lIEFMSUdOX1RZUEUgbG9uZyIgaW4gamNvbmZpZy5oIGlmIHlvdSBoYXZlCi0gKiBzdWNoIGEgY29tcGlsZXIuCi0gKi8KLQotI2lmbmRlZiBBTElHTl9UWVBFCQkvKiBzbyBjYW4gb3ZlcnJpZGUgZnJvbSBqY29uZmlnLmggKi8KLSNkZWZpbmUgQUxJR05fVFlQRSAgZG91YmxlCi0jZW5kaWYKLQotCi0vKgotICogV2UgYWxsb2NhdGUgb2JqZWN0cyBmcm9tICJwb29scyIsIHdoZXJlIGVhY2ggcG9vbCBpcyBnb3R0ZW4gd2l0aCBhIHNpbmdsZQotICogcmVxdWVzdCB0byBqcGVnX2dldF9zbWFsbCgpIG9yIGpwZWdfZ2V0X2xhcmdlKCkuICBUaGVyZSBpcyBubyBwZXItb2JqZWN0Ci0gKiBvdmVyaGVhZCB3aXRoaW4gYSBwb29sLCBleGNlcHQgZm9yIGFsaWdubWVudCBwYWRkaW5nLiAgRWFjaCBwb29sIGhhcyBhCi0gKiBoZWFkZXIgd2l0aCBhIGxpbmsgdG8gdGhlIG5leHQgcG9vbCBvZiB0aGUgc2FtZSBjbGFzcy4KLSAqIFNtYWxsIGFuZCBsYXJnZSBwb29sIGhlYWRlcnMgYXJlIGlkZW50aWNhbCBleGNlcHQgdGhhdCB0aGUgbGF0dGVyJ3MKLSAqIGxpbmsgcG9pbnRlciBtdXN0IGJlIEZBUiBvbiA4MHg4NiBtYWNoaW5lcy4KLSAqIE5vdGljZSB0aGF0IHRoZSAicmVhbCIgaGVhZGVyIGZpZWxkcyBhcmUgdW5pb24nZWQgd2l0aCBhIGR1bW15IEFMSUdOX1RZUEUKLSAqIGZpZWxkLiAgVGhpcyBmb3JjZXMgdGhlIGNvbXBpbGVyIHRvIG1ha2UgU0laRU9GKHNtYWxsX3Bvb2xfaGRyKSBhIG11bHRpcGxlCi0gKiBvZiB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50IG9mIEFMSUdOX1RZUEUuCi0gKi8KLQotdHlwZWRlZiB1bmlvbiBzbWFsbF9wb29sX3N0cnVjdCAqIHNtYWxsX3Bvb2xfcHRyOwotCi10eXBlZGVmIHVuaW9uIHNtYWxsX3Bvb2xfc3RydWN0IHsKLSAgc3RydWN0IHsKLSAgICBzbWFsbF9wb29sX3B0ciBuZXh0OwkvKiBuZXh0IGluIGxpc3Qgb2YgcG9vbHMgKi8KLSAgICBzaXplX3QgYnl0ZXNfdXNlZDsJCS8qIGhvdyBtYW55IGJ5dGVzIGFscmVhZHkgdXNlZCB3aXRoaW4gcG9vbCAqLwotICAgIHNpemVfdCBieXRlc19sZWZ0OwkJLyogYnl0ZXMgc3RpbGwgYXZhaWxhYmxlIGluIHRoaXMgcG9vbCAqLwotICB9IGhkcjsKLSAgQUxJR05fVFlQRSBkdW1teTsJCS8qIGluY2x1ZGVkIGluIHVuaW9uIHRvIGVuc3VyZSBhbGlnbm1lbnQgKi8KLX0gc21hbGxfcG9vbF9oZHI7Ci0KLXR5cGVkZWYgdW5pb24gbGFyZ2VfcG9vbF9zdHJ1Y3QgRkFSICogbGFyZ2VfcG9vbF9wdHI7Ci0KLXR5cGVkZWYgdW5pb24gbGFyZ2VfcG9vbF9zdHJ1Y3QgewotICBzdHJ1Y3QgewotICAgIGxhcmdlX3Bvb2xfcHRyIG5leHQ7CS8qIG5leHQgaW4gbGlzdCBvZiBwb29scyAqLwotICAgIHNpemVfdCBieXRlc191c2VkOwkJLyogaG93IG1hbnkgYnl0ZXMgYWxyZWFkeSB1c2VkIHdpdGhpbiBwb29sICovCi0gICAgc2l6ZV90IGJ5dGVzX2xlZnQ7CQkvKiBieXRlcyBzdGlsbCBhdmFpbGFibGUgaW4gdGhpcyBwb29sICovCi0gIH0gaGRyOwotICBBTElHTl9UWVBFIGR1bW15OwkJLyogaW5jbHVkZWQgaW4gdW5pb24gdG8gZW5zdXJlIGFsaWdubWVudCAqLwotfSBsYXJnZV9wb29sX2hkcjsKLQotCi0vKgotICogSGVyZSBpcyB0aGUgZnVsbCBkZWZpbml0aW9uIG9mIGEgbWVtb3J5IG1hbmFnZXIgb2JqZWN0LgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGpwZWdfbWVtb3J5X21nciBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBFYWNoIHBvb2wgaWRlbnRpZmllciAobGlmZXRpbWUgY2xhc3MpIG5hbWVzIGEgbGlua2VkIGxpc3Qgb2YgcG9vbHMuICovCi0gIHNtYWxsX3Bvb2xfcHRyIHNtYWxsX2xpc3RbSlBPT0xfTlVNUE9PTFNdOwotICBsYXJnZV9wb29sX3B0ciBsYXJnZV9saXN0W0pQT09MX05VTVBPT0xTXTsKLQotICAvKiBTaW5jZSB3ZSBvbmx5IGhhdmUgb25lIGxpZmV0aW1lIGNsYXNzIG9mIHZpcnR1YWwgYXJyYXlzLCBvbmx5IG9uZQotICAgKiBsaW5rZWQgbGlzdCBpcyBuZWNlc3NhcnkgKGZvciBlYWNoIGRhdGF0eXBlKS4gIE5vdGUgdGhhdCB0aGUgdmlydHVhbAotICAgKiBhcnJheSBjb250cm9sIGJsb2NrcyBiZWluZyBsaW5rZWQgdG9nZXRoZXIgYXJlIGFjdHVhbGx5IHN0b3JlZCBzb21ld2hlcmUKLSAgICogaW4gdGhlIHNtYWxsLXBvb2wgbGlzdC4KLSAgICovCi0gIGp2aXJ0X3NhcnJheV9wdHIgdmlydF9zYXJyYXlfbGlzdDsKLSAganZpcnRfYmFycmF5X3B0ciB2aXJ0X2JhcnJheV9saXN0OwotCi0gIC8qIFRoaXMgY291bnRzIHRvdGFsIHNwYWNlIG9idGFpbmVkIGZyb20ganBlZ19nZXRfc21hbGwvbGFyZ2UgKi8KLSAgbG9uZyB0b3RhbF9zcGFjZV9hbGxvY2F0ZWQ7Ci0KLSAgLyogYWxsb2Nfc2FycmF5IGFuZCBhbGxvY19iYXJyYXkgc2V0IHRoaXMgdmFsdWUgZm9yIHVzZSBieSB2aXJ0dWFsCi0gICAqIGFycmF5IHJvdXRpbmVzLgotICAgKi8KLSAgSkRJTUVOU0lPTiBsYXN0X3Jvd3NwZXJjaHVuazsJLyogZnJvbSBtb3N0IHJlY2VudCBhbGxvY19zYXJyYXkvYmFycmF5ICovCi19IG15X21lbW9yeV9tZ3I7Ci0KLXR5cGVkZWYgbXlfbWVtb3J5X21nciAqIG15X21lbV9wdHI7Ci0KLQotLyoKLSAqIFRoZSBjb250cm9sIGJsb2NrcyBmb3IgdmlydHVhbCBhcnJheXMuCi0gKiBOb3RlIHRoYXQgdGhlc2UgYmxvY2tzIGFyZSBhbGxvY2F0ZWQgaW4gdGhlICJzbWFsbCIgcG9vbCBhcmVhLgotICogU3lzdGVtLWRlcGVuZGVudCBpbmZvIGZvciB0aGUgYXNzb2NpYXRlZCBiYWNraW5nIHN0b3JlIChpZiBhbnkpIGlzIGhpZGRlbgotICogaW5zaWRlIHRoZSBiYWNraW5nX3N0b3JlX2luZm8gc3RydWN0LgotICovCi0KLXN0cnVjdCBqdmlydF9zYXJyYXlfY29udHJvbCB7Ci0gIEpTQU1QQVJSQVkgbWVtX2J1ZmZlcjsJLyogPT4gdGhlIGluLW1lbW9yeSBidWZmZXIgKi8KLSAgSkRJTUVOU0lPTiByb3dzX2luX2FycmF5OwkvKiB0b3RhbCB2aXJ0dWFsIGFycmF5IGhlaWdodCAqLwotICBKRElNRU5TSU9OIHNhbXBsZXNwZXJyb3c7CS8qIHdpZHRoIG9mIGFycmF5IChhbmQgb2YgbWVtb3J5IGJ1ZmZlcikgKi8KLSAgSkRJTUVOU0lPTiBtYXhhY2Nlc3M7CQkvKiBtYXggcm93cyBhY2Nlc3NlZCBieSBhY2Nlc3NfdmlydF9zYXJyYXkgKi8KLSAgSkRJTUVOU0lPTiByb3dzX2luX21lbTsJLyogaGVpZ2h0IG9mIG1lbW9yeSBidWZmZXIgKi8KLSAgSkRJTUVOU0lPTiByb3dzcGVyY2h1bms7CS8qIGFsbG9jYXRpb24gY2h1bmsgc2l6ZSBpbiBtZW1fYnVmZmVyICovCi0gIEpESU1FTlNJT04gY3VyX3N0YXJ0X3JvdzsJLyogZmlyc3QgbG9naWNhbCByb3cgIyBpbiB0aGUgYnVmZmVyICovCi0gIEpESU1FTlNJT04gZmlyc3RfdW5kZWZfcm93OwkvKiByb3cgIyBvZiBmaXJzdCB1bmluaXRpYWxpemVkIHJvdyAqLwotICBib29sZWFuIHByZV96ZXJvOwkJLyogcHJlLXplcm8gbW9kZSByZXF1ZXN0ZWQ/ICovCi0gIGJvb2xlYW4gZGlydHk7CQkvKiBkbyBjdXJyZW50IGJ1ZmZlciBjb250ZW50cyBuZWVkIHdyaXR0ZW4/ICovCi0gIGJvb2xlYW4gYl9zX29wZW47CQkvKiBpcyBiYWNraW5nLXN0b3JlIGRhdGEgdmFsaWQ/ICovCi0gIGp2aXJ0X3NhcnJheV9wdHIgbmV4dDsJLyogbGluayB0byBuZXh0IHZpcnR1YWwgc2FycmF5IGNvbnRyb2wgYmxvY2sgKi8KLSAgYmFja2luZ19zdG9yZV9pbmZvIGJfc19pbmZvOwkvKiBTeXN0ZW0tZGVwZW5kZW50IGNvbnRyb2wgaW5mbyAqLwotfTsKLQotc3RydWN0IGp2aXJ0X2JhcnJheV9jb250cm9sIHsKLSAgSkJMT0NLQVJSQVkgbWVtX2J1ZmZlcjsJLyogPT4gdGhlIGluLW1lbW9yeSBidWZmZXIgKi8KLSAgSkRJTUVOU0lPTiByb3dzX2luX2FycmF5OwkvKiB0b3RhbCB2aXJ0dWFsIGFycmF5IGhlaWdodCAqLwotICBKRElNRU5TSU9OIGJsb2Nrc3BlcnJvdzsJLyogd2lkdGggb2YgYXJyYXkgKGFuZCBvZiBtZW1vcnkgYnVmZmVyKSAqLwotICBKRElNRU5TSU9OIG1heGFjY2VzczsJCS8qIG1heCByb3dzIGFjY2Vzc2VkIGJ5IGFjY2Vzc192aXJ0X2JhcnJheSAqLwotICBKRElNRU5TSU9OIHJvd3NfaW5fbWVtOwkvKiBoZWlnaHQgb2YgbWVtb3J5IGJ1ZmZlciAqLwotICBKRElNRU5TSU9OIHJvd3NwZXJjaHVuazsJLyogYWxsb2NhdGlvbiBjaHVuayBzaXplIGluIG1lbV9idWZmZXIgKi8KLSAgSkRJTUVOU0lPTiBjdXJfc3RhcnRfcm93OwkvKiBmaXJzdCBsb2dpY2FsIHJvdyAjIGluIHRoZSBidWZmZXIgKi8KLSAgSkRJTUVOU0lPTiBmaXJzdF91bmRlZl9yb3c7CS8qIHJvdyAjIG9mIGZpcnN0IHVuaW5pdGlhbGl6ZWQgcm93ICovCi0gIGJvb2xlYW4gcHJlX3plcm87CQkvKiBwcmUtemVybyBtb2RlIHJlcXVlc3RlZD8gKi8KLSAgYm9vbGVhbiBkaXJ0eTsJCS8qIGRvIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIG5lZWQgd3JpdHRlbj8gKi8KLSAgYm9vbGVhbiBiX3Nfb3BlbjsJCS8qIGlzIGJhY2tpbmctc3RvcmUgZGF0YSB2YWxpZD8gKi8KLSAganZpcnRfYmFycmF5X3B0ciBuZXh0OwkvKiBsaW5rIHRvIG5leHQgdmlydHVhbCBiYXJyYXkgY29udHJvbCBibG9jayAqLwotICBiYWNraW5nX3N0b3JlX2luZm8gYl9zX2luZm87CS8qIFN5c3RlbS1kZXBlbmRlbnQgY29udHJvbCBpbmZvICovCi19OwotCi0KLSNpZmRlZiBNRU1fU1RBVFMJCS8qIG9wdGlvbmFsIGV4dHJhIHN0dWZmIGZvciBzdGF0aXN0aWNzICovCi0KLUxPQ0FMKHZvaWQpCi1wcmludF9tZW1fc3RhdHMgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQpCi17Ci0gIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07Ci0gIHNtYWxsX3Bvb2xfcHRyIHNoZHJfcHRyOwotICBsYXJnZV9wb29sX3B0ciBsaGRyX3B0cjsKLQotICAvKiBTaW5jZSB0aGlzIGlzIG9ubHkgYSBkZWJ1Z2dpbmcgc3R1Yiwgd2UgY2FuIGNoZWF0IGEgbGl0dGxlIGJ5IHVzaW5nCi0gICAqIGZwcmludGYgZGlyZWN0bHkgcmF0aGVyIHRoYW4gZ29pbmcgdGhyb3VnaCB0aGUgdHJhY2UgbWVzc2FnZSBjb2RlLgotICAgKiBUaGlzIGlzIGhlbHBmdWwgYmVjYXVzZSBtZXNzYWdlIHBhcm0gYXJyYXkgY2FuJ3QgaGFuZGxlIGxvbmdzLgotICAgKi8KLSAgRlhTWVNfZnByaW50ZihzdGRlcnIsICJGcmVlaW5nIHBvb2wgJWQsIHRvdGFsIHNwYWNlID0gJWxkXG4iLAotCSAgcG9vbF9pZCwgbWVtLT50b3RhbF9zcGFjZV9hbGxvY2F0ZWQpOwotCi0gIGZvciAobGhkcl9wdHIgPSBtZW0tPmxhcmdlX2xpc3RbcG9vbF9pZF07IGxoZHJfcHRyICE9IE5VTEw7Ci0gICAgICAgbGhkcl9wdHIgPSBsaGRyX3B0ci0+aGRyLm5leHQpIHsKLSAgICBGWFNZU19mcHJpbnRmKHN0ZGVyciwgIiAgTGFyZ2UgY2h1bmsgdXNlZCAlbGRcbiIsCi0JICAgIChsb25nKSBsaGRyX3B0ci0+aGRyLmJ5dGVzX3VzZWQpOwotICB9Ci0KLSAgZm9yIChzaGRyX3B0ciA9IG1lbS0+c21hbGxfbGlzdFtwb29sX2lkXTsgc2hkcl9wdHIgIT0gTlVMTDsKLSAgICAgICBzaGRyX3B0ciA9IHNoZHJfcHRyLT5oZHIubmV4dCkgewotICAgIEZYU1lTX2ZwcmludGYoc3RkZXJyLCAiICBTbWFsbCBjaHVuayB1c2VkICVsZCBmcmVlICVsZFxuIiwKLQkgICAgKGxvbmcpIHNoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCwKLQkgICAgKGxvbmcpIHNoZHJfcHRyLT5oZHIuYnl0ZXNfbGVmdCk7Ci0gIH0KLX0KLQotI2VuZGlmIC8qIE1FTV9TVEFUUyAqLwotCi0KLUxPQ0FMKHZvaWQpCi1vdXRfb2ZfbWVtb3J5IChqX2NvbW1vbl9wdHIgY2luZm8sIGludCB3aGljaCkKLS8qIFJlcG9ydCBhbiBvdXQtb2YtbWVtb3J5IGVycm9yIGFuZCBzdG9wIGV4ZWN1dGlvbiAqLwotLyogSWYgd2UgY29tcGlsZWQgTUVNX1NUQVRTIHN1cHBvcnQsIHJlcG9ydCBhbGxvYyByZXF1ZXN0cyBiZWZvcmUgZHlpbmcgKi8KLXsKLSNpZmRlZiBNRU1fU1RBVFMKLSAgY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPSAyOwkvKiBmb3JjZSBzZWxmX2Rlc3RydWN0IHRvIHJlcG9ydCBzdGF0cyAqLwotI2VuZGlmCi0gIEVSUkVYSVQxKGNpbmZvLCBKRVJSX09VVF9PRl9NRU1PUlksIHdoaWNoKTsKLX0KLQotCi0vKgotICogQWxsb2NhdGlvbiBvZiAic21hbGwiIG9iamVjdHMuCi0gKgotICogRm9yIHRoZXNlLCB3ZSB1c2UgcG9vbGVkIHN0b3JhZ2UuICBXaGVuIGEgbmV3IHBvb2wgbXVzdCBiZSBjcmVhdGVkLAotICogd2UgdHJ5IHRvIGdldCBlbm91Z2ggc3BhY2UgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QgcGx1cyBhICJzbG9wIiBmYWN0b3IsCi0gKiB3aGVyZSB0aGUgc2xvcCB3aWxsIGJlIHRoZSBhbW91bnQgb2YgbGVmdG92ZXIgc3BhY2UgaW4gdGhlIG5ldyBwb29sLgotICogVGhlIHNwZWVkIHZzLiBzcGFjZSB0cmFkZW9mZiBpcyBsYXJnZWx5IGRldGVybWluZWQgYnkgdGhlIHNsb3AgdmFsdWVzLgotICogQSBkaWZmZXJlbnQgc2xvcCB2YWx1ZSBpcyBwcm92aWRlZCBmb3IgZWFjaCBwb29sIGNsYXNzIChsaWZldGltZSksCi0gKiBhbmQgd2UgYWxzbyBkaXN0aW5ndWlzaCB0aGUgZmlyc3QgcG9vbCBvZiBhIGNsYXNzIGZyb20gbGF0ZXIgb25lcy4KLSAqIE5PVEU6IHRoZSB2YWx1ZXMgZ2l2ZW4gd29yayBmYWlybHkgd2VsbCBvbiBib3RoIDE2LSBhbmQgMzItYml0LWludAotICogbWFjaGluZXMsIGJ1dCBtYXkgYmUgdG9vIHNtYWxsIGlmIGxvbmdzIGFyZSA2NCBiaXRzIG9yIG1vcmUuCi0gKi8KLQotc3RhdGljIGNvbnN0IHNpemVfdCBmaXJzdF9wb29sX3Nsb3BbSlBPT0xfTlVNUE9PTFNdID0gCi17Ci0JMTYwMCwJCQkvKiBmaXJzdCBQRVJNQU5FTlQgcG9vbCAqLwotCTE2MDAwCQkJLyogZmlyc3QgSU1BR0UgcG9vbCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHNpemVfdCBleHRyYV9wb29sX3Nsb3BbSlBPT0xfTlVNUE9PTFNdID0gCi17Ci0JMCwJCQkvKiBhZGRpdGlvbmFsIFBFUk1BTkVOVCBwb29scyAqLwotCTUwMDAJCQkvKiBhZGRpdGlvbmFsIElNQUdFIHBvb2xzICovCi19OwotCi0jZGVmaW5lIE1JTl9TTE9QICA1MAkJLyogZ3JlYXRlciB0aGFuIDAgdG8gYXZvaWQgZnV0aWxlIGxvb3BpbmcgKi8KLQotCi1NRVRIT0RERUYodm9pZCAqKQotYWxsb2Nfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsIHNpemVfdCBzaXplb2ZvYmplY3QpCi0vKiBBbGxvY2F0ZSBhICJzbWFsbCIgb2JqZWN0ICovCi17Ci0gIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07Ci0gIHNtYWxsX3Bvb2xfcHRyIGhkcl9wdHIsIHByZXZfaGRyX3B0cjsKLSAgY2hhciAqIGRhdGFfcHRyOwotICBzaXplX3Qgb2RkX2J5dGVzLCBtaW5fcmVxdWVzdCwgc2xvcDsKLQotICAvKiBDaGVjayBmb3IgdW5zYXRpc2ZpYWJsZSByZXF1ZXN0IChkbyBub3cgdG8gZW5zdXJlIG5vIG92ZXJmbG93IGJlbG93KSAqLwotICBpZiAoc2l6ZW9mb2JqZWN0ID4gKHNpemVfdCkgKE1BWF9BTExPQ19DSFVOSy1TSVpFT0Yoc21hbGxfcG9vbF9oZHIpKSkKLSAgICBvdXRfb2ZfbWVtb3J5KGNpbmZvLCAxKTsJLyogcmVxdWVzdCBleGNlZWRzIG1hbGxvYydzIGFiaWxpdHkgKi8KLQotICAvKiBSb3VuZCB1cCB0aGUgcmVxdWVzdGVkIHNpemUgdG8gYSBtdWx0aXBsZSBvZiBTSVpFT0YoQUxJR05fVFlQRSkgKi8KLSAgb2RkX2J5dGVzID0gc2l6ZW9mb2JqZWN0ICUgU0laRU9GKEFMSUdOX1RZUEUpOwotICBpZiAob2RkX2J5dGVzID4gMCkKLSAgICBzaXplb2ZvYmplY3QgKz0gU0laRU9GKEFMSUdOX1RZUEUpIC0gb2RkX2J5dGVzOwotCi0gIC8qIFNlZSBpZiBzcGFjZSBpcyBhdmFpbGFibGUgaW4gYW55IGV4aXN0aW5nIHBvb2wgKi8KLSAgaWYgKHBvb2xfaWQgPCAwIHx8IHBvb2xfaWQgPj0gSlBPT0xfTlVNUE9PTFMpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BPT0xfSUQsIHBvb2xfaWQpOwkvKiBzYWZldHkgY2hlY2sgKi8KLSAgcHJldl9oZHJfcHRyID0gTlVMTDsKLSAgaGRyX3B0ciA9IG1lbS0+c21hbGxfbGlzdFtwb29sX2lkXTsKLSAgd2hpbGUgKGhkcl9wdHIgIT0gTlVMTCkgewotICAgIGlmIChoZHJfcHRyLT5oZHIuYnl0ZXNfbGVmdCA+PSBzaXplb2ZvYmplY3QpCi0gICAgICBicmVhazsJCQkvKiBmb3VuZCBwb29sIHdpdGggZW5vdWdoIHNwYWNlICovCi0gICAgcHJldl9oZHJfcHRyID0gaGRyX3B0cjsKLSAgICBoZHJfcHRyID0gaGRyX3B0ci0+aGRyLm5leHQ7Ci0gIH0KLQotICAvKiBUaW1lIHRvIG1ha2UgYSBuZXcgcG9vbD8gKi8KLSAgaWYgKGhkcl9wdHIgPT0gTlVMTCkgewotICAgIC8qIG1pbl9yZXF1ZXN0IGlzIHdoYXQgd2UgbmVlZCBub3csIHNsb3AgaXMgd2hhdCB3aWxsIGJlIGxlZnRvdmVyICovCi0gICAgbWluX3JlcXVlc3QgPSBzaXplb2ZvYmplY3QgKyBTSVpFT0Yoc21hbGxfcG9vbF9oZHIpOwotICAgIGlmIChwcmV2X2hkcl9wdHIgPT0gTlVMTCkJLyogZmlyc3QgcG9vbCBpbiBjbGFzcz8gKi8KLSAgICAgIHNsb3AgPSBmaXJzdF9wb29sX3Nsb3BbcG9vbF9pZF07Ci0gICAgZWxzZQotICAgICAgc2xvcCA9IGV4dHJhX3Bvb2xfc2xvcFtwb29sX2lkXTsKLSAgICAvKiBEb24ndCBhc2sgZm9yIG1vcmUgdGhhbiBNQVhfQUxMT0NfQ0hVTksgKi8KLSAgICBpZiAoc2xvcCA+IChzaXplX3QpIChNQVhfQUxMT0NfQ0hVTkstbWluX3JlcXVlc3QpKQotICAgICAgc2xvcCA9IChzaXplX3QpIChNQVhfQUxMT0NfQ0hVTkstbWluX3JlcXVlc3QpOwotICAgIC8qIFRyeSB0byBnZXQgc3BhY2UsIGlmIGZhaWwgcmVkdWNlIHNsb3AgYW5kIHRyeSBhZ2FpbiAqLwotICAgIGZvciAoOzspIHsKLSAgICAgIGhkcl9wdHIgPSAoc21hbGxfcG9vbF9wdHIpIGpwZWdfZ2V0X3NtYWxsKGNpbmZvLCBtaW5fcmVxdWVzdCArIHNsb3ApOwotICAgICAgaWYgKGhkcl9wdHIgIT0gTlVMTCkKLQlicmVhazsKLSAgICAgIHNsb3AgLz0gMjsKLSAgICAgIGlmIChzbG9wIDwgTUlOX1NMT1ApCS8qIGdpdmUgdXAgd2hlbiBpdCBnZXRzIHJlYWwgc21hbGwgKi8KLQlvdXRfb2ZfbWVtb3J5KGNpbmZvLCAyKTsgLyoganBlZ19nZXRfc21hbGwgZmFpbGVkICovCi0gICAgfQotICAgIG1lbS0+dG90YWxfc3BhY2VfYWxsb2NhdGVkICs9IG1pbl9yZXF1ZXN0ICsgc2xvcDsKLSAgICAvKiBTdWNjZXNzLCBpbml0aWFsaXplIHRoZSBuZXcgcG9vbCBoZWFkZXIgYW5kIGFkZCB0byBlbmQgb2YgbGlzdCAqLwotICAgIGhkcl9wdHItPmhkci5uZXh0ID0gTlVMTDsKLSAgICBoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCA9IDA7Ci0gICAgaGRyX3B0ci0+aGRyLmJ5dGVzX2xlZnQgPSBzaXplb2ZvYmplY3QgKyBzbG9wOwotICAgIGlmIChwcmV2X2hkcl9wdHIgPT0gTlVMTCkJLyogZmlyc3QgcG9vbCBpbiBjbGFzcz8gKi8KLSAgICAgIG1lbS0+c21hbGxfbGlzdFtwb29sX2lkXSA9IGhkcl9wdHI7Ci0gICAgZWxzZQotICAgICAgcHJldl9oZHJfcHRyLT5oZHIubmV4dCA9IGhkcl9wdHI7Ci0gIH0KLQotICAvKiBPSywgYWxsb2NhdGUgdGhlIG9iamVjdCBmcm9tIHRoZSBjdXJyZW50IHBvb2wgKi8KLSAgZGF0YV9wdHIgPSAoY2hhciAqKSAoaGRyX3B0ciArIDEpOyAvKiBwb2ludCB0byBmaXJzdCBkYXRhIGJ5dGUgaW4gcG9vbCAqLwotICBkYXRhX3B0ciArPSBoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZDsgLyogcG9pbnQgdG8gcGxhY2UgZm9yIG9iamVjdCAqLwotICBoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCArPSBzaXplb2ZvYmplY3Q7Ci0gIGhkcl9wdHItPmhkci5ieXRlc19sZWZ0IC09IHNpemVvZm9iamVjdDsKLQotICByZXR1cm4gKHZvaWQgKikgZGF0YV9wdHI7Ci19Ci0KLQotLyoKLSAqIEFsbG9jYXRpb24gb2YgImxhcmdlIiBvYmplY3RzLgotICoKLSAqIFRoZSBleHRlcm5hbCBzZW1hbnRpY3Mgb2YgdGhlc2UgYXJlIHRoZSBzYW1lIGFzICJzbWFsbCIgb2JqZWN0cywKLSAqIGV4Y2VwdCB0aGF0IEZBUiBwb2ludGVycyBhcmUgdXNlZCBvbiA4MHg4Ni4gIEhvd2V2ZXIgdGhlIHBvb2wKLSAqIG1hbmFnZW1lbnQgaGV1cmlzdGljcyBhcmUgcXVpdGUgZGlmZmVyZW50LiAgV2UgYXNzdW1lIHRoYXQgZWFjaAotICogcmVxdWVzdCBpcyBsYXJnZSBlbm91Z2ggdGhhdCBpdCBtYXkgYXMgd2VsbCBiZSBwYXNzZWQgZGlyZWN0bHkgdG8KLSAqIGpwZWdfZ2V0X2xhcmdlOyB0aGUgcG9vbCBtYW5hZ2VtZW50IGp1c3QgbGlua3MgZXZlcnl0aGluZyB0b2dldGhlcgotICogc28gdGhhdCB3ZSBjYW4gZnJlZSBpdCBhbGwgb24gZGVtYW5kLgotICogTm90ZTogdGhlIG1ham9yIHVzZSBvZiAibGFyZ2UiIG9iamVjdHMgaXMgaW4gSlNBTVBBUlJBWSBhbmQgSkJMT0NLQVJSQVkKLSAqIHN0cnVjdHVyZXMuICBUaGUgcm91dGluZXMgdGhhdCBjcmVhdGUgdGhlc2Ugc3RydWN0dXJlcyAoc2VlIGJlbG93KQotICogZGVsaWJlcmF0ZWx5IGJ1bmNoIHJvd3MgdG9nZXRoZXIgdG8gZW5zdXJlIGEgbGFyZ2UgcmVxdWVzdCBzaXplLgotICovCi0KLU1FVEhPRERFRih2b2lkIEZBUiAqKQotYWxsb2NfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsIHNpemVfdCBzaXplb2ZvYmplY3QpCi0vKiBBbGxvY2F0ZSBhICJsYXJnZSIgb2JqZWN0ICovCi17Ci0gIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07Ci0gIGxhcmdlX3Bvb2xfcHRyIGhkcl9wdHI7Ci0gIHNpemVfdCBvZGRfYnl0ZXM7Ci0KLSAgLyogQ2hlY2sgZm9yIHVuc2F0aXNmaWFibGUgcmVxdWVzdCAoZG8gbm93IHRvIGVuc3VyZSBubyBvdmVyZmxvdyBiZWxvdykgKi8KLSAgaWYgKHNpemVvZm9iamVjdCA+IChzaXplX3QpIChNQVhfQUxMT0NfQ0hVTkstU0laRU9GKGxhcmdlX3Bvb2xfaGRyKSkpCi0gICAgb3V0X29mX21lbW9yeShjaW5mbywgMyk7CS8qIHJlcXVlc3QgZXhjZWVkcyBtYWxsb2MncyBhYmlsaXR5ICovCi0KLSAgLyogUm91bmQgdXAgdGhlIHJlcXVlc3RlZCBzaXplIHRvIGEgbXVsdGlwbGUgb2YgU0laRU9GKEFMSUdOX1RZUEUpICovCi0gIG9kZF9ieXRlcyA9IHNpemVvZm9iamVjdCAlIFNJWkVPRihBTElHTl9UWVBFKTsKLSAgaWYgKG9kZF9ieXRlcyA+IDApCi0gICAgc2l6ZW9mb2JqZWN0ICs9IFNJWkVPRihBTElHTl9UWVBFKSAtIG9kZF9ieXRlczsKLQotICAvKiBBbHdheXMgbWFrZSBhIG5ldyBwb29sICovCi0gIGlmIChwb29sX2lkIDwgMCB8fCBwb29sX2lkID49IEpQT09MX05VTVBPT0xTKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QT09MX0lELCBwb29sX2lkKTsJLyogc2FmZXR5IGNoZWNrICovCi0KLSAgaGRyX3B0ciA9IChsYXJnZV9wb29sX3B0cikganBlZ19nZXRfbGFyZ2UoY2luZm8sIHNpemVvZm9iamVjdCArCi0JCQkJCSAgICBTSVpFT0YobGFyZ2VfcG9vbF9oZHIpKTsKLSAgaWYgKGhkcl9wdHIgPT0gTlVMTCkKLSAgICBvdXRfb2ZfbWVtb3J5KGNpbmZvLCA0KTsJLyoganBlZ19nZXRfbGFyZ2UgZmFpbGVkICovCi0gIG1lbS0+dG90YWxfc3BhY2VfYWxsb2NhdGVkICs9IHNpemVvZm9iamVjdCArIFNJWkVPRihsYXJnZV9wb29sX2hkcik7Ci0KLSAgLyogU3VjY2VzcywgaW5pdGlhbGl6ZSB0aGUgbmV3IHBvb2wgaGVhZGVyIGFuZCBhZGQgdG8gbGlzdCAqLwotICBoZHJfcHRyLT5oZHIubmV4dCA9IG1lbS0+bGFyZ2VfbGlzdFtwb29sX2lkXTsKLSAgLyogV2UgbWFpbnRhaW4gc3BhY2UgY291bnRzIGluIGVhY2ggcG9vbCBoZWFkZXIgZm9yIHN0YXRpc3RpY2FsIHB1cnBvc2VzLAotICAgKiBldmVuIHRob3VnaCB0aGV5IGFyZSBub3QgbmVlZGVkIGZvciBhbGxvY2F0aW9uLgotICAgKi8KLSAgaGRyX3B0ci0+aGRyLmJ5dGVzX3VzZWQgPSBzaXplb2ZvYmplY3Q7Ci0gIGhkcl9wdHItPmhkci5ieXRlc19sZWZ0ID0gMDsKLSAgbWVtLT5sYXJnZV9saXN0W3Bvb2xfaWRdID0gaGRyX3B0cjsKLQotICByZXR1cm4gKHZvaWQgRkFSICopIChoZHJfcHRyICsgMSk7IC8qIHBvaW50IHRvIGZpcnN0IGRhdGEgYnl0ZSBpbiBwb29sICovCi19Ci0KLQotLyoKLSAqIENyZWF0aW9uIG9mIDItRCBzYW1wbGUgYXJyYXlzLgotICogVGhlIHBvaW50ZXJzIGFyZSBpbiBuZWFyIGhlYXAsIHRoZSBzYW1wbGVzIHRoZW1zZWx2ZXMgaW4gRkFSIGhlYXAuCi0gKgotICogVG8gbWluaW1pemUgYWxsb2NhdGlvbiBvdmVyaGVhZCBhbmQgdG8gYWxsb3cgSS9PIG9mIGxhcmdlIGNvbnRpZ3VvdXMKLSAqIGJsb2Nrcywgd2UgYWxsb2NhdGUgdGhlIHNhbXBsZSByb3dzIGluIGdyb3VwcyBvZiBhcyBtYW55IHJvd3MgYXMgcG9zc2libGUKLSAqIHdpdGhvdXQgZXhjZWVkaW5nIE1BWF9BTExPQ19DSFVOSyB0b3RhbCBieXRlcyBwZXIgYWxsb2NhdGlvbiByZXF1ZXN0LgotICogTkI6IHRoZSB2aXJ0dWFsIGFycmF5IGNvbnRyb2wgcm91dGluZXMsIGxhdGVyIGluIHRoaXMgZmlsZSwga25vdyBhYm91dAotICogdGhpcyBjaHVua2luZyBvZiByb3dzLiAgVGhlIHJvd3NwZXJjaHVuayB2YWx1ZSBpcyBsZWZ0IGluIHRoZSBtZW0gbWFuYWdlcgotICogb2JqZWN0IHNvIHRoYXQgaXQgY2FuIGJlIHNhdmVkIGF3YXkgaWYgdGhpcyBzYXJyYXkgaXMgdGhlIHdvcmtzcGFjZSBmb3IKLSAqIGEgdmlydHVhbCBhcnJheS4KLSAqLwotCi1NRVRIT0RERUYoSlNBTVBBUlJBWSkKLWFsbG9jX3NhcnJheSAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwKLQkgICAgICBKRElNRU5TSU9OIHNhbXBsZXNwZXJyb3csIEpESU1FTlNJT04gbnVtcm93cykKLS8qIEFsbG9jYXRlIGEgMi1EIHNhbXBsZSBhcnJheSAqLwotewotICBteV9tZW1fcHRyIG1lbSA9IChteV9tZW1fcHRyKSBjaW5mby0+bWVtOwotICBKU0FNUEFSUkFZIHJlc3VsdDsKLSAgSlNBTVBST1cgd29ya3NwYWNlOwotICBKRElNRU5TSU9OIHJvd3NwZXJjaHVuaywgY3Vycm93LCBpOwotICBsb25nIGx0ZW1wOwotCi0gIC8qIENhbGN1bGF0ZSBtYXggIyBvZiByb3dzIGFsbG93ZWQgaW4gb25lIGFsbG9jYXRpb24gY2h1bmsgKi8KLSAgbHRlbXAgPSAoTUFYX0FMTE9DX0NIVU5LLVNJWkVPRihsYXJnZV9wb29sX2hkcikpIC8KLQkgICgobG9uZykgc2FtcGxlc3BlcnJvdyAqIFNJWkVPRihKU0FNUExFKSk7Ci0gIGlmIChsdGVtcCA8PSAwKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfV0lEVEhfT1ZFUkZMT1cpOwotICBpZiAobHRlbXAgPCAobG9uZykgbnVtcm93cykKLSAgICByb3dzcGVyY2h1bmsgPSAoSkRJTUVOU0lPTikgbHRlbXA7Ci0gIGVsc2UKLSAgICByb3dzcGVyY2h1bmsgPSBudW1yb3dzOwotICBtZW0tPmxhc3Rfcm93c3BlcmNodW5rID0gcm93c3BlcmNodW5rOwotCi0gIC8qIEdldCBzcGFjZSBmb3Igcm93IHBvaW50ZXJzIChzbWFsbCBvYmplY3QpICovCi0gIHJlc3VsdCA9IChKU0FNUEFSUkFZKSBhbGxvY19zbWFsbChjaW5mbywgcG9vbF9pZCwKLQkJCQkgICAgKHNpemVfdCkgKG51bXJvd3MgKiBTSVpFT0YoSlNBTVBST1cpKSk7Ci0KLSAgLyogR2V0IHRoZSByb3dzIHRoZW1zZWx2ZXMgKGxhcmdlIG9iamVjdHMpICovCi0gIGN1cnJvdyA9IDA7Ci0gIHdoaWxlIChjdXJyb3cgPCBudW1yb3dzKSB7Ci0gICAgcm93c3BlcmNodW5rID0gTUlOKHJvd3NwZXJjaHVuaywgbnVtcm93cyAtIGN1cnJvdyk7Ci0gICAgd29ya3NwYWNlID0gKEpTQU1QUk9XKSBhbGxvY19sYXJnZShjaW5mbywgcG9vbF9pZCwKLQkoc2l6ZV90KSAoKHNpemVfdCkgcm93c3BlcmNodW5rICogKHNpemVfdCkgc2FtcGxlc3BlcnJvdwotCQkgICogU0laRU9GKEpTQU1QTEUpKSk7Ci0gICAgZm9yIChpID0gcm93c3BlcmNodW5rOyBpID4gMDsgaS0tKSB7Ci0gICAgICByZXN1bHRbY3Vycm93KytdID0gd29ya3NwYWNlOwotICAgICAgd29ya3NwYWNlICs9IHNhbXBsZXNwZXJyb3c7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKgotICogQ3JlYXRpb24gb2YgMi1EIGNvZWZmaWNpZW50LWJsb2NrIGFycmF5cy4KLSAqIFRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgdGhlIGNvZGUgZm9yIHNhbXBsZSBhcnJheXMsIGFib3ZlLgotICovCi0KLU1FVEhPRERFRihKQkxPQ0tBUlJBWSkKLWFsbG9jX2JhcnJheSAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwKLQkgICAgICBKRElNRU5TSU9OIGJsb2Nrc3BlcnJvdywgSkRJTUVOU0lPTiBudW1yb3dzKQotLyogQWxsb2NhdGUgYSAyLUQgY29lZmZpY2llbnQtYmxvY2sgYXJyYXkgKi8KLXsKLSAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKLSAgSkJMT0NLQVJSQVkgcmVzdWx0OwotICBKQkxPQ0tST1cgd29ya3NwYWNlOwotICBKRElNRU5TSU9OIHJvd3NwZXJjaHVuaywgY3Vycm93LCBpOwotICBsb25nIGx0ZW1wOwotCi0gIC8qIENhbGN1bGF0ZSBtYXggIyBvZiByb3dzIGFsbG93ZWQgaW4gb25lIGFsbG9jYXRpb24gY2h1bmsgKi8KLSAgbHRlbXAgPSAoTUFYX0FMTE9DX0NIVU5LLVNJWkVPRihsYXJnZV9wb29sX2hkcikpIC8KLQkgICgobG9uZykgYmxvY2tzcGVycm93ICogU0laRU9GKEpCTE9DSykpOwotICBpZiAobHRlbXAgPD0gMCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1dJRFRIX09WRVJGTE9XKTsKLSAgaWYgKGx0ZW1wIDwgKGxvbmcpIG51bXJvd3MpCi0gICAgcm93c3BlcmNodW5rID0gKEpESU1FTlNJT04pIGx0ZW1wOwotICBlbHNlCi0gICAgcm93c3BlcmNodW5rID0gbnVtcm93czsKLSAgbWVtLT5sYXN0X3Jvd3NwZXJjaHVuayA9IHJvd3NwZXJjaHVuazsKLQotICAvKiBHZXQgc3BhY2UgZm9yIHJvdyBwb2ludGVycyAoc21hbGwgb2JqZWN0KSAqLwotICByZXN1bHQgPSAoSkJMT0NLQVJSQVkpIGFsbG9jX3NtYWxsKGNpbmZvLCBwb29sX2lkLAotCQkJCSAgICAgKHNpemVfdCkgKG51bXJvd3MgKiBTSVpFT0YoSkJMT0NLUk9XKSkpOwotCi0gIC8qIEdldCB0aGUgcm93cyB0aGVtc2VsdmVzIChsYXJnZSBvYmplY3RzKSAqLwotICBjdXJyb3cgPSAwOwotICB3aGlsZSAoY3Vycm93IDwgbnVtcm93cykgewotICAgIHJvd3NwZXJjaHVuayA9IE1JTihyb3dzcGVyY2h1bmssIG51bXJvd3MgLSBjdXJyb3cpOwotICAgIHdvcmtzcGFjZSA9IChKQkxPQ0tST1cpIGFsbG9jX2xhcmdlKGNpbmZvLCBwb29sX2lkLAotCShzaXplX3QpICgoc2l6ZV90KSByb3dzcGVyY2h1bmsgKiAoc2l6ZV90KSBibG9ja3NwZXJyb3cKLQkJICAqIFNJWkVPRihKQkxPQ0spKSk7Ci0gICAgZm9yIChpID0gcm93c3BlcmNodW5rOyBpID4gMDsgaS0tKSB7Ci0gICAgICByZXN1bHRbY3Vycm93KytdID0gd29ya3NwYWNlOwotICAgICAgd29ya3NwYWNlICs9IGJsb2Nrc3BlcnJvdzsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qCi0gKiBBYm91dCB2aXJ0dWFsIGFycmF5IG1hbmFnZW1lbnQ6Ci0gKgotICogVGhlIGFib3ZlICJub3JtYWwiIGFycmF5IHJvdXRpbmVzIGFyZSBvbmx5IHVzZWQgdG8gYWxsb2NhdGUgc3RyaXAgYnVmZmVycwotICogKGFzIHdpZGUgYXMgdGhlIGltYWdlLCBidXQganVzdCBhIGZldyByb3dzIGhpZ2gpLiAgRnVsbC1pbWFnZS1zaXplZCBidWZmZXJzCi0gKiBhcmUgaGFuZGxlZCBhcyAidmlydHVhbCIgYXJyYXlzLiAgVGhlIGFycmF5IGlzIHN0aWxsIGFjY2Vzc2VkIGEgc3RyaXAgYXQgYQotICogdGltZSwgYnV0IHRoZSBtZW1vcnkgbWFuYWdlciBtdXN0IHNhdmUgdGhlIHdob2xlIGFycmF5IGZvciByZXBlYXRlZAotICogYWNjZXNzZXMuICBUaGUgaW50ZW5kZWQgaW1wbGVtZW50YXRpb24gaXMgdGhhdCB0aGVyZSBpcyBhIHN0cmlwIGJ1ZmZlciBpbgotICogbWVtb3J5IChhcyBoaWdoIGFzIGlzIHBvc3NpYmxlIGdpdmVuIHRoZSBkZXNpcmVkIG1lbW9yeSBsaW1pdCksIHBsdXMgYQotICogYmFja2luZyBmaWxlIHRoYXQgaG9sZHMgdGhlIHJlc3Qgb2YgdGhlIGFycmF5LgotICoKLSAqIFRoZSByZXF1ZXN0X3ZpcnRfYXJyYXkgcm91dGluZXMgYXJlIHRvbGQgdGhlIHRvdGFsIHNpemUgb2YgdGhlIGltYWdlIGFuZAotICogdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdGhhdCB3aWxsIGJlIGFjY2Vzc2VkIGF0IG9uY2UuICBUaGUgaW4tbWVtb3J5Ci0gKiBidWZmZXIgbXVzdCBiZSBhdCBsZWFzdCBhcyBsYXJnZSBhcyB0aGUgbWF4YWNjZXNzIHZhbHVlLgotICoKLSAqIFRoZSByZXF1ZXN0IHJvdXRpbmVzIGNyZWF0ZSBjb250cm9sIGJsb2NrcyBidXQgbm90IHRoZSBpbi1tZW1vcnkgYnVmZmVycy4KLSAqIFRoYXQgaXMgcG9zdHBvbmVkIHVudGlsIHJlYWxpemVfdmlydF9hcnJheXMgaXMgY2FsbGVkLiAgQXQgdGhhdCB0aW1lIHRoZQotICogdG90YWwgYW1vdW50IG9mIHNwYWNlIG5lZWRlZCBpcyBrbm93biAoYXBwcm94aW1hdGVseSwgYW55d2F5KSwgc28gZnJlZQotICogbWVtb3J5IGNhbiBiZSBkaXZpZGVkIHVwIGZhaXJseS4KLSAqCi0gKiBUaGUgYWNjZXNzX3ZpcnRfYXJyYXkgcm91dGluZXMgYXJlIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgYSBzcGVjaWZpYyBzdHJpcAotICogYXJlYSBhY2Nlc3NpYmxlIChhZnRlciByZWFkaW5nIG9yIHdyaXRpbmcgdGhlIGJhY2tpbmcgZmlsZSwgaWYgbmVjZXNzYXJ5KS4KLSAqIE5vdGUgdGhhdCB0aGUgYWNjZXNzIHJvdXRpbmVzIGFyZSB0b2xkIHdoZXRoZXIgdGhlIGNhbGxlciBpbnRlbmRzIHRvIG1vZGlmeQotICogdGhlIGFjY2Vzc2VkIHN0cmlwOyBkdXJpbmcgYSByZWFkLW9ubHkgcGFzcyB0aGlzIHNhdmVzIGhhdmluZyB0byByZXdyaXRlCi0gKiBkYXRhIHRvIGRpc2suICBUaGUgYWNjZXNzIHJvdXRpbmVzIGFyZSBhbHNvIHJlc3BvbnNpYmxlIGZvciBwcmUtemVyb2luZwotICogYW55IG5ld2x5IGFjY2Vzc2VkIHJvd3MsIGlmIHByZS16ZXJvaW5nIHdhcyByZXF1ZXN0ZWQuCi0gKgotICogSW4gY3VycmVudCB1c2FnZSwgdGhlIGFjY2VzcyByZXF1ZXN0cyBhcmUgdXN1YWxseSBmb3Igbm9ub3ZlcmxhcHBpbmcKLSAqIHN0cmlwczsgdGhhdCBpcywgc3VjY2Vzc2l2ZSBhY2Nlc3Mgc3RhcnRfcm93IG51bWJlcnMgZGlmZmVyIGJ5IGV4YWN0bHkKLSAqIG51bV9yb3dzID0gbWF4YWNjZXNzLiAgVGhpcyBtZWFucyB3ZSBjYW4gZ2V0IGdvb2QgcGVyZm9ybWFuY2Ugd2l0aCBzaW1wbGUKLSAqIGJ1ZmZlciBkdW1wL3JlbG9hZCBsb2dpYywgYnkgbWFraW5nIHRoZSBpbi1tZW1vcnkgYnVmZmVyIGJlIGEgbXVsdGlwbGUKLSAqIG9mIHRoZSBhY2Nlc3MgaGVpZ2h0OyB0aGVuIHRoZXJlIHdpbGwgbmV2ZXIgYmUgYWNjZXNzZXMgYWNyb3NzIGJ1ZmZlcmxvYWQKLSAqIGJvdW5kYXJpZXMuICBUaGUgY29kZSB3aWxsIHN0aWxsIHdvcmsgd2l0aCBvdmVybGFwcGluZyBhY2Nlc3MgcmVxdWVzdHMsCi0gKiBidXQgaXQgZG9lc24ndCBoYW5kbGUgYnVmZmVybG9hZCBvdmVybGFwcyB2ZXJ5IGVmZmljaWVudGx5LgotICovCi0KLQotTUVUSE9EREVGKGp2aXJ0X3NhcnJheV9wdHIpCi1yZXF1ZXN0X3ZpcnRfc2FycmF5IChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLCBib29sZWFuIHByZV96ZXJvLAotCQkgICAgIEpESU1FTlNJT04gc2FtcGxlc3BlcnJvdywgSkRJTUVOU0lPTiBudW1yb3dzLAotCQkgICAgIEpESU1FTlNJT04gbWF4YWNjZXNzKQotLyogUmVxdWVzdCBhIHZpcnR1YWwgMi1EIHNhbXBsZSBhcnJheSAqLwotewotICBteV9tZW1fcHRyIG1lbSA9IChteV9tZW1fcHRyKSBjaW5mby0+bWVtOwotICBqdmlydF9zYXJyYXlfcHRyIHJlc3VsdDsKLQotICAvKiBPbmx5IElNQUdFLWxpZmV0aW1lIHZpcnR1YWwgYXJyYXlzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkICovCi0gIGlmIChwb29sX2lkICE9IEpQT09MX0lNQUdFKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QT09MX0lELCBwb29sX2lkKTsJLyogc2FmZXR5IGNoZWNrICovCi0KLSAgLyogZ2V0IGNvbnRyb2wgYmxvY2sgKi8KLSAgcmVzdWx0ID0gKGp2aXJ0X3NhcnJheV9wdHIpIGFsbG9jX3NtYWxsKGNpbmZvLCBwb29sX2lkLAotCQkJCQkgIFNJWkVPRihzdHJ1Y3QganZpcnRfc2FycmF5X2NvbnRyb2wpKTsKLQotICByZXN1bHQtPm1lbV9idWZmZXIgPSBOVUxMOwkvKiBtYXJrcyBhcnJheSBub3QgeWV0IHJlYWxpemVkICovCi0gIHJlc3VsdC0+cm93c19pbl9hcnJheSA9IG51bXJvd3M7Ci0gIHJlc3VsdC0+c2FtcGxlc3BlcnJvdyA9IHNhbXBsZXNwZXJyb3c7Ci0gIHJlc3VsdC0+bWF4YWNjZXNzID0gbWF4YWNjZXNzOwotICByZXN1bHQtPnByZV96ZXJvID0gcHJlX3plcm87Ci0gIHJlc3VsdC0+Yl9zX29wZW4gPSBGQUxTRTsJLyogbm8gYXNzb2NpYXRlZCBiYWNraW5nLXN0b3JlIG9iamVjdCAqLwotICByZXN1bHQtPm5leHQgPSBtZW0tPnZpcnRfc2FycmF5X2xpc3Q7IC8qIGFkZCB0byBsaXN0IG9mIHZpcnR1YWwgYXJyYXlzICovCi0gIG1lbS0+dmlydF9zYXJyYXlfbGlzdCA9IHJlc3VsdDsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLU1FVEhPRERFRihqdmlydF9iYXJyYXlfcHRyKQotcmVxdWVzdF92aXJ0X2JhcnJheSAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwgYm9vbGVhbiBwcmVfemVybywKLQkJICAgICBKRElNRU5TSU9OIGJsb2Nrc3BlcnJvdywgSkRJTUVOU0lPTiBudW1yb3dzLAotCQkgICAgIEpESU1FTlNJT04gbWF4YWNjZXNzKQotLyogUmVxdWVzdCBhIHZpcnR1YWwgMi1EIGNvZWZmaWNpZW50LWJsb2NrIGFycmF5ICovCi17Ci0gIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07Ci0gIGp2aXJ0X2JhcnJheV9wdHIgcmVzdWx0OwotCi0gIC8qIE9ubHkgSU1BR0UtbGlmZXRpbWUgdmlydHVhbCBhcnJheXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQgKi8KLSAgaWYgKHBvb2xfaWQgIT0gSlBPT0xfSU1BR0UpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BPT0xfSUQsIHBvb2xfaWQpOwkvKiBzYWZldHkgY2hlY2sgKi8KLQotICAvKiBnZXQgY29udHJvbCBibG9jayAqLwotICByZXN1bHQgPSAoanZpcnRfYmFycmF5X3B0cikgYWxsb2Nfc21hbGwoY2luZm8sIHBvb2xfaWQsCi0JCQkJCSAgU0laRU9GKHN0cnVjdCBqdmlydF9iYXJyYXlfY29udHJvbCkpOwotCi0gIHJlc3VsdC0+bWVtX2J1ZmZlciA9IE5VTEw7CS8qIG1hcmtzIGFycmF5IG5vdCB5ZXQgcmVhbGl6ZWQgKi8KLSAgcmVzdWx0LT5yb3dzX2luX2FycmF5ID0gbnVtcm93czsKLSAgcmVzdWx0LT5ibG9ja3NwZXJyb3cgPSBibG9ja3NwZXJyb3c7Ci0gIHJlc3VsdC0+bWF4YWNjZXNzID0gbWF4YWNjZXNzOwotICByZXN1bHQtPnByZV96ZXJvID0gcHJlX3plcm87Ci0gIHJlc3VsdC0+Yl9zX29wZW4gPSBGQUxTRTsJLyogbm8gYXNzb2NpYXRlZCBiYWNraW5nLXN0b3JlIG9iamVjdCAqLwotICByZXN1bHQtPm5leHQgPSBtZW0tPnZpcnRfYmFycmF5X2xpc3Q7IC8qIGFkZCB0byBsaXN0IG9mIHZpcnR1YWwgYXJyYXlzICovCi0gIG1lbS0+dmlydF9iYXJyYXlfbGlzdCA9IHJlc3VsdDsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLU1FVEhPRERFRih2b2lkKQotcmVhbGl6ZV92aXJ0X2FycmF5cyAoal9jb21tb25fcHRyIGNpbmZvKQotLyogQWxsb2NhdGUgdGhlIGluLW1lbW9yeSBidWZmZXJzIGZvciBhbnkgdW5yZWFsaXplZCB2aXJ0dWFsIGFycmF5cyAqLwotewotICBteV9tZW1fcHRyIG1lbSA9IChteV9tZW1fcHRyKSBjaW5mby0+bWVtOwotICBsb25nIHNwYWNlX3Blcl9taW5oZWlnaHQsIG1heGltdW1fc3BhY2UsIGF2YWlsX21lbTsKLSAgbG9uZyBtaW5oZWlnaHRzLCBtYXhfbWluaGVpZ2h0czsKLSAganZpcnRfc2FycmF5X3B0ciBzcHRyOwotICBqdmlydF9iYXJyYXlfcHRyIGJwdHI7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgbWluaW11bSBzcGFjZSBuZWVkZWQgKG1heGFjY2VzcyByb3dzIGluIGVhY2ggYnVmZmVyKQotICAgKiBhbmQgdGhlIG1heGltdW0gc3BhY2UgbmVlZGVkIChmdWxsIGltYWdlIGhlaWdodCBpbiBlYWNoIGJ1ZmZlcikuCi0gICAqIFRoZXNlIG1heSBiZSBvZiB1c2UgdG8gdGhlIHN5c3RlbS1kZXBlbmRlbnQganBlZ19tZW1fYXZhaWxhYmxlIHJvdXRpbmUuCi0gICAqLwotICBzcGFjZV9wZXJfbWluaGVpZ2h0ID0gMDsKLSAgbWF4aW11bV9zcGFjZSA9IDA7Ci0gIGZvciAoc3B0ciA9IG1lbS0+dmlydF9zYXJyYXlfbGlzdDsgc3B0ciAhPSBOVUxMOyBzcHRyID0gc3B0ci0+bmV4dCkgewotICAgIGlmIChzcHRyLT5tZW1fYnVmZmVyID09IE5VTEwpIHsgLyogaWYgbm90IHJlYWxpemVkIHlldCAqLwotICAgICAgc3BhY2VfcGVyX21pbmhlaWdodCArPSAobG9uZykgc3B0ci0+bWF4YWNjZXNzICoKLQkJCSAgICAgKGxvbmcpIHNwdHItPnNhbXBsZXNwZXJyb3cgKiBTSVpFT0YoSlNBTVBMRSk7Ci0gICAgICBtYXhpbXVtX3NwYWNlICs9IChsb25nKSBzcHRyLT5yb3dzX2luX2FycmF5ICoKLQkJICAgICAgIChsb25nKSBzcHRyLT5zYW1wbGVzcGVycm93ICogU0laRU9GKEpTQU1QTEUpOwotICAgIH0KLSAgfQotICBmb3IgKGJwdHIgPSBtZW0tPnZpcnRfYmFycmF5X2xpc3Q7IGJwdHIgIT0gTlVMTDsgYnB0ciA9IGJwdHItPm5leHQpIHsKLSAgICBpZiAoYnB0ci0+bWVtX2J1ZmZlciA9PSBOVUxMKSB7IC8qIGlmIG5vdCByZWFsaXplZCB5ZXQgKi8KLSAgICAgIHNwYWNlX3Blcl9taW5oZWlnaHQgKz0gKGxvbmcpIGJwdHItPm1heGFjY2VzcyAqCi0JCQkgICAgIChsb25nKSBicHRyLT5ibG9ja3NwZXJyb3cgKiBTSVpFT0YoSkJMT0NLKTsKLSAgICAgIG1heGltdW1fc3BhY2UgKz0gKGxvbmcpIGJwdHItPnJvd3NfaW5fYXJyYXkgKgotCQkgICAgICAgKGxvbmcpIGJwdHItPmJsb2Nrc3BlcnJvdyAqIFNJWkVPRihKQkxPQ0spOwotICAgIH0KLSAgfQotCi0gIGlmIChzcGFjZV9wZXJfbWluaGVpZ2h0IDw9IDApCi0gICAgcmV0dXJuOwkJCS8qIG5vIHVucmVhbGl6ZWQgYXJyYXlzLCBubyB3b3JrICovCi0KLSAgLyogRGV0ZXJtaW5lIGFtb3VudCBvZiBtZW1vcnkgdG8gYWN0dWFsbHkgdXNlOyB0aGlzIGlzIHN5c3RlbS1kZXBlbmRlbnQuICovCi0gIGF2YWlsX21lbSA9IGpwZWdfbWVtX2F2YWlsYWJsZShjaW5mbywgc3BhY2VfcGVyX21pbmhlaWdodCwgbWF4aW11bV9zcGFjZSwKLQkJCQkgbWVtLT50b3RhbF9zcGFjZV9hbGxvY2F0ZWQpOwotCi0gIC8qIElmIHRoZSBtYXhpbXVtIHNwYWNlIG5lZWRlZCBpcyBhdmFpbGFibGUsIG1ha2UgYWxsIHRoZSBidWZmZXJzIGZ1bGwKLSAgICogaGVpZ2h0OyBvdGhlcndpc2UgcGFyY2VsIGl0IG91dCB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBtaW5oZWlnaHRzCi0gICAqIGluIGVhY2ggYnVmZmVyLgotICAgKi8KLSAgaWYgKGF2YWlsX21lbSA+PSBtYXhpbXVtX3NwYWNlKQotICAgIG1heF9taW5oZWlnaHRzID0gMTAwMDAwMDAwMEw7Ci0gIGVsc2UgewotICAgIG1heF9taW5oZWlnaHRzID0gYXZhaWxfbWVtIC8gc3BhY2VfcGVyX21pbmhlaWdodDsKLSAgICAvKiBJZiB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgZW5vdWdoIHNwYWNlLCB0cnkgdG8gZ2V0IHRoZSBtaW5pbXVtCi0gICAgICogYW55d2F5LiAgVGhpcyBhbGxvd3MgYSAic3R1YiIgaW1wbGVtZW50YXRpb24gb2YganBlZ19tZW1fYXZhaWxhYmxlKCkuCi0gICAgICovCi0gICAgaWYgKG1heF9taW5oZWlnaHRzIDw9IDApCi0gICAgICBtYXhfbWluaGVpZ2h0cyA9IDE7Ci0gIH0KLQotICAvKiBBbGxvY2F0ZSB0aGUgaW4tbWVtb3J5IGJ1ZmZlcnMgYW5kIGluaXRpYWxpemUgYmFja2luZyBzdG9yZSBhcyBuZWVkZWQuICovCi0KLSAgZm9yIChzcHRyID0gbWVtLT52aXJ0X3NhcnJheV9saXN0OyBzcHRyICE9IE5VTEw7IHNwdHIgPSBzcHRyLT5uZXh0KSB7Ci0gICAgaWYgKHNwdHItPm1lbV9idWZmZXIgPT0gTlVMTCkgeyAvKiBpZiBub3QgcmVhbGl6ZWQgeWV0ICovCi0gICAgICBtaW5oZWlnaHRzID0gKChsb25nKSBzcHRyLT5yb3dzX2luX2FycmF5IC0gMUwpIC8gc3B0ci0+bWF4YWNjZXNzICsgMUw7Ci0gICAgICBpZiAobWluaGVpZ2h0cyA8PSBtYXhfbWluaGVpZ2h0cykgewotCS8qIFRoaXMgYnVmZmVyIGZpdHMgaW4gbWVtb3J5ICovCi0Jc3B0ci0+cm93c19pbl9tZW0gPSBzcHRyLT5yb3dzX2luX2FycmF5OwotICAgICAgfSBlbHNlIHsKLQkvKiBJdCBkb2Vzbid0IGZpdCBpbiBtZW1vcnksIGNyZWF0ZSBiYWNraW5nIHN0b3JlLiAqLwotCXNwdHItPnJvd3NfaW5fbWVtID0gKEpESU1FTlNJT04pIChtYXhfbWluaGVpZ2h0cyAqIHNwdHItPm1heGFjY2Vzcyk7Ci0JanBlZ19vcGVuX2JhY2tpbmdfc3RvcmUoY2luZm8sICYgc3B0ci0+Yl9zX2luZm8sCi0JCQkJKGxvbmcpIHNwdHItPnJvd3NfaW5fYXJyYXkgKgotCQkJCShsb25nKSBzcHRyLT5zYW1wbGVzcGVycm93ICoKLQkJCQkobG9uZykgU0laRU9GKEpTQU1QTEUpKTsKLQlzcHRyLT5iX3Nfb3BlbiA9IFRSVUU7Ci0gICAgICB9Ci0gICAgICBzcHRyLT5tZW1fYnVmZmVyID0gYWxsb2Nfc2FycmF5KGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgICAgICBzcHRyLT5zYW1wbGVzcGVycm93LCBzcHRyLT5yb3dzX2luX21lbSk7Ci0gICAgICBzcHRyLT5yb3dzcGVyY2h1bmsgPSBtZW0tPmxhc3Rfcm93c3BlcmNodW5rOwotICAgICAgc3B0ci0+Y3VyX3N0YXJ0X3JvdyA9IDA7Ci0gICAgICBzcHRyLT5maXJzdF91bmRlZl9yb3cgPSAwOwotICAgICAgc3B0ci0+ZGlydHkgPSBGQUxTRTsKLSAgICB9Ci0gIH0KLQotICBmb3IgKGJwdHIgPSBtZW0tPnZpcnRfYmFycmF5X2xpc3Q7IGJwdHIgIT0gTlVMTDsgYnB0ciA9IGJwdHItPm5leHQpIHsKLSAgICBpZiAoYnB0ci0+bWVtX2J1ZmZlciA9PSBOVUxMKSB7IC8qIGlmIG5vdCByZWFsaXplZCB5ZXQgKi8KLSAgICAgIG1pbmhlaWdodHMgPSAoKGxvbmcpIGJwdHItPnJvd3NfaW5fYXJyYXkgLSAxTCkgLyBicHRyLT5tYXhhY2Nlc3MgKyAxTDsKLSAgICAgIGlmIChtaW5oZWlnaHRzIDw9IG1heF9taW5oZWlnaHRzKSB7Ci0JLyogVGhpcyBidWZmZXIgZml0cyBpbiBtZW1vcnkgKi8KLQlicHRyLT5yb3dzX2luX21lbSA9IGJwdHItPnJvd3NfaW5fYXJyYXk7Ci0gICAgICB9IGVsc2UgewotCS8qIEl0IGRvZXNuJ3QgZml0IGluIG1lbW9yeSwgY3JlYXRlIGJhY2tpbmcgc3RvcmUuICovCi0JYnB0ci0+cm93c19pbl9tZW0gPSAoSkRJTUVOU0lPTikgKG1heF9taW5oZWlnaHRzICogYnB0ci0+bWF4YWNjZXNzKTsKLQlqcGVnX29wZW5fYmFja2luZ19zdG9yZShjaW5mbywgJiBicHRyLT5iX3NfaW5mbywKLQkJCQkobG9uZykgYnB0ci0+cm93c19pbl9hcnJheSAqCi0JCQkJKGxvbmcpIGJwdHItPmJsb2Nrc3BlcnJvdyAqCi0JCQkJKGxvbmcpIFNJWkVPRihKQkxPQ0spKTsKLQlicHRyLT5iX3Nfb3BlbiA9IFRSVUU7Ci0gICAgICB9Ci0gICAgICBicHRyLT5tZW1fYnVmZmVyID0gYWxsb2NfYmFycmF5KGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgICAgICBicHRyLT5ibG9ja3NwZXJyb3csIGJwdHItPnJvd3NfaW5fbWVtKTsKLSAgICAgIGJwdHItPnJvd3NwZXJjaHVuayA9IG1lbS0+bGFzdF9yb3dzcGVyY2h1bms7Ci0gICAgICBicHRyLT5jdXJfc3RhcnRfcm93ID0gMDsKLSAgICAgIGJwdHItPmZpcnN0X3VuZGVmX3JvdyA9IDA7Ci0gICAgICBicHRyLT5kaXJ0eSA9IEZBTFNFOwotICAgIH0KLSAgfQotfQotCi0KLUxPQ0FMKHZvaWQpCi1kb19zYXJyYXlfaW8gKGpfY29tbW9uX3B0ciBjaW5mbywganZpcnRfc2FycmF5X3B0ciBwdHIsIGJvb2xlYW4gd3JpdGluZykKLS8qIERvIGJhY2tpbmcgc3RvcmUgcmVhZCBvciB3cml0ZSBvZiBhIHZpcnR1YWwgc2FtcGxlIGFycmF5ICovCi17Ci0gIGxvbmcgYnl0ZXNwZXJyb3csIGZpbGVfb2Zmc2V0LCBieXRlX2NvdW50LCByb3dzLCB0aGlzcm93LCBpOwotCi0gIGJ5dGVzcGVycm93ID0gKGxvbmcpIHB0ci0+c2FtcGxlc3BlcnJvdyAqIFNJWkVPRihKU0FNUExFKTsKLSAgZmlsZV9vZmZzZXQgPSBwdHItPmN1cl9zdGFydF9yb3cgKiBieXRlc3BlcnJvdzsKLSAgLyogTG9vcCB0byByZWFkIG9yIHdyaXRlIGVhY2ggYWxsb2NhdGlvbiBjaHVuayBpbiBtZW1fYnVmZmVyICovCi0gIGZvciAoaSA9IDA7IGkgPCAobG9uZykgcHRyLT5yb3dzX2luX21lbTsgaSArPSBwdHItPnJvd3NwZXJjaHVuaykgewotICAgIC8qIE9uZSBjaHVuaywgYnV0IGNoZWNrIGZvciBzaG9ydCBjaHVuayBhdCBlbmQgb2YgYnVmZmVyICovCi0gICAgcm93cyA9IE1JTigobG9uZykgcHRyLT5yb3dzcGVyY2h1bmssIChsb25nKSBwdHItPnJvd3NfaW5fbWVtIC0gaSk7Ci0gICAgLyogVHJhbnNmZXIgbm8gbW9yZSB0aGFuIGlzIGN1cnJlbnRseSBkZWZpbmVkICovCi0gICAgdGhpc3JvdyA9IChsb25nKSBwdHItPmN1cl9zdGFydF9yb3cgKyBpOwotICAgIHJvd3MgPSBNSU4ocm93cywgKGxvbmcpIHB0ci0+Zmlyc3RfdW5kZWZfcm93IC0gdGhpc3Jvdyk7Ci0gICAgLyogVHJhbnNmZXIgbm8gbW9yZSB0aGFuIGZpdHMgaW4gZmlsZSAqLwotICAgIHJvd3MgPSBNSU4ocm93cywgKGxvbmcpIHB0ci0+cm93c19pbl9hcnJheSAtIHRoaXNyb3cpOwotICAgIGlmIChyb3dzIDw9IDApCQkvKiB0aGlzIGNodW5rIG1pZ2h0IGJlIHBhc3QgZW5kIG9mIGZpbGUhICovCi0gICAgICBicmVhazsKLSAgICBieXRlX2NvdW50ID0gcm93cyAqIGJ5dGVzcGVycm93OwotICAgIGlmICh3cml0aW5nKQotICAgICAgKCpwdHItPmJfc19pbmZvLndyaXRlX2JhY2tpbmdfc3RvcmUpIChjaW5mbywgJiBwdHItPmJfc19pbmZvLAotCQkJCQkgICAgKHZvaWQgRkFSICopIHB0ci0+bWVtX2J1ZmZlcltpXSwKLQkJCQkJICAgIGZpbGVfb2Zmc2V0LCBieXRlX2NvdW50KTsKLSAgICBlbHNlCi0gICAgICAoKnB0ci0+Yl9zX2luZm8ucmVhZF9iYWNraW5nX3N0b3JlKSAoY2luZm8sICYgcHRyLT5iX3NfaW5mbywKLQkJCQkJICAgKHZvaWQgRkFSICopIHB0ci0+bWVtX2J1ZmZlcltpXSwKLQkJCQkJICAgZmlsZV9vZmZzZXQsIGJ5dGVfY291bnQpOwotICAgIGZpbGVfb2Zmc2V0ICs9IGJ5dGVfY291bnQ7Ci0gIH0KLX0KLQotCi1MT0NBTCh2b2lkKQotZG9fYmFycmF5X2lvIChqX2NvbW1vbl9wdHIgY2luZm8sIGp2aXJ0X2JhcnJheV9wdHIgcHRyLCBib29sZWFuIHdyaXRpbmcpCi0vKiBEbyBiYWNraW5nIHN0b3JlIHJlYWQgb3Igd3JpdGUgb2YgYSB2aXJ0dWFsIGNvZWZmaWNpZW50LWJsb2NrIGFycmF5ICovCi17Ci0gIGxvbmcgYnl0ZXNwZXJyb3csIGZpbGVfb2Zmc2V0LCBieXRlX2NvdW50LCByb3dzLCB0aGlzcm93LCBpOwotCi0gIGJ5dGVzcGVycm93ID0gKGxvbmcpIHB0ci0+YmxvY2tzcGVycm93ICogU0laRU9GKEpCTE9DSyk7Ci0gIGZpbGVfb2Zmc2V0ID0gcHRyLT5jdXJfc3RhcnRfcm93ICogYnl0ZXNwZXJyb3c7Ci0gIC8qIExvb3AgdG8gcmVhZCBvciB3cml0ZSBlYWNoIGFsbG9jYXRpb24gY2h1bmsgaW4gbWVtX2J1ZmZlciAqLwotICBmb3IgKGkgPSAwOyBpIDwgKGxvbmcpIHB0ci0+cm93c19pbl9tZW07IGkgKz0gcHRyLT5yb3dzcGVyY2h1bmspIHsKLSAgICAvKiBPbmUgY2h1bmssIGJ1dCBjaGVjayBmb3Igc2hvcnQgY2h1bmsgYXQgZW5kIG9mIGJ1ZmZlciAqLwotICAgIHJvd3MgPSBNSU4oKGxvbmcpIHB0ci0+cm93c3BlcmNodW5rLCAobG9uZykgcHRyLT5yb3dzX2luX21lbSAtIGkpOwotICAgIC8qIFRyYW5zZmVyIG5vIG1vcmUgdGhhbiBpcyBjdXJyZW50bHkgZGVmaW5lZCAqLwotICAgIHRoaXNyb3cgPSAobG9uZykgcHRyLT5jdXJfc3RhcnRfcm93ICsgaTsKLSAgICByb3dzID0gTUlOKHJvd3MsIChsb25nKSBwdHItPmZpcnN0X3VuZGVmX3JvdyAtIHRoaXNyb3cpOwotICAgIC8qIFRyYW5zZmVyIG5vIG1vcmUgdGhhbiBmaXRzIGluIGZpbGUgKi8KLSAgICByb3dzID0gTUlOKHJvd3MsIChsb25nKSBwdHItPnJvd3NfaW5fYXJyYXkgLSB0aGlzcm93KTsKLSAgICBpZiAocm93cyA8PSAwKQkJLyogdGhpcyBjaHVuayBtaWdodCBiZSBwYXN0IGVuZCBvZiBmaWxlISAqLwotICAgICAgYnJlYWs7Ci0gICAgYnl0ZV9jb3VudCA9IHJvd3MgKiBieXRlc3BlcnJvdzsKLSAgICBpZiAod3JpdGluZykKLSAgICAgICgqcHRyLT5iX3NfaW5mby53cml0ZV9iYWNraW5nX3N0b3JlKSAoY2luZm8sICYgcHRyLT5iX3NfaW5mbywKLQkJCQkJICAgICh2b2lkIEZBUiAqKSBwdHItPm1lbV9idWZmZXJbaV0sCi0JCQkJCSAgICBmaWxlX29mZnNldCwgYnl0ZV9jb3VudCk7Ci0gICAgZWxzZQotICAgICAgKCpwdHItPmJfc19pbmZvLnJlYWRfYmFja2luZ19zdG9yZSkgKGNpbmZvLCAmIHB0ci0+Yl9zX2luZm8sCi0JCQkJCSAgICh2b2lkIEZBUiAqKSBwdHItPm1lbV9idWZmZXJbaV0sCi0JCQkJCSAgIGZpbGVfb2Zmc2V0LCBieXRlX2NvdW50KTsKLSAgICBmaWxlX29mZnNldCArPSBieXRlX2NvdW50OwotICB9Ci19Ci0KLQotTUVUSE9EREVGKEpTQU1QQVJSQVkpCi1hY2Nlc3NfdmlydF9zYXJyYXkgKGpfY29tbW9uX3B0ciBjaW5mbywganZpcnRfc2FycmF5X3B0ciBwdHIsCi0JCSAgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywgSkRJTUVOU0lPTiBudW1fcm93cywKLQkJICAgIGJvb2xlYW4gd3JpdGFibGUpCi0vKiBBY2Nlc3MgdGhlIHBhcnQgb2YgYSB2aXJ0dWFsIHNhbXBsZSBhcnJheSBzdGFydGluZyBhdCBzdGFydF9yb3cgKi8KLS8qIGFuZCBleHRlbmRpbmcgZm9yIG51bV9yb3dzIHJvd3MuICB3cml0YWJsZSBpcyB0cnVlIGlmICAqLwotLyogY2FsbGVyIGludGVuZHMgdG8gbW9kaWZ5IHRoZSBhY2Nlc3NlZCBhcmVhLiAqLwotewotICBKRElNRU5TSU9OIGVuZF9yb3cgPSBzdGFydF9yb3cgKyBudW1fcm93czsKLSAgSkRJTUVOU0lPTiB1bmRlZl9yb3c7Ci0KLSAgLyogZGVidWdnaW5nIGNoZWNrICovCi0gIGlmIChlbmRfcm93ID4gcHRyLT5yb3dzX2luX2FycmF5IHx8IG51bV9yb3dzID4gcHRyLT5tYXhhY2Nlc3MgfHwKLSAgICAgIHB0ci0+bWVtX2J1ZmZlciA9PSBOVUxMKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1ZJUlRVQUxfQUNDRVNTKTsKLQotICAvKiBNYWtlIHRoZSBkZXNpcmVkIHBhcnQgb2YgdGhlIHZpcnR1YWwgYXJyYXkgYWNjZXNzaWJsZSAqLwotICBpZiAoc3RhcnRfcm93IDwgcHRyLT5jdXJfc3RhcnRfcm93IHx8Ci0gICAgICBlbmRfcm93ID4gcHRyLT5jdXJfc3RhcnRfcm93K3B0ci0+cm93c19pbl9tZW0pIHsKLSAgICBpZiAoISBwdHItPmJfc19vcGVuKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9WSVJUVUFMX0JVRyk7Ci0gICAgLyogRmx1c2ggb2xkIGJ1ZmZlciBjb250ZW50cyBpZiBuZWNlc3NhcnkgKi8KLSAgICBpZiAocHRyLT5kaXJ0eSkgewotICAgICAgZG9fc2FycmF5X2lvKGNpbmZvLCBwdHIsIFRSVUUpOwotICAgICAgcHRyLT5kaXJ0eSA9IEZBTFNFOwotICAgIH0KLSAgICAvKiBEZWNpZGUgd2hhdCBwYXJ0IG9mIHZpcnR1YWwgYXJyYXkgdG8gYWNjZXNzLgotICAgICAqIEFsZ29yaXRobTogaWYgdGFyZ2V0IGFkZHJlc3MgPiBjdXJyZW50IHdpbmRvdywgYXNzdW1lIGZvcndhcmQgc2NhbiwKLSAgICAgKiBsb2FkIHN0YXJ0aW5nIGF0IHRhcmdldCBhZGRyZXNzLiAgSWYgdGFyZ2V0IGFkZHJlc3MgPCBjdXJyZW50IHdpbmRvdywKLSAgICAgKiBhc3N1bWUgYmFja3dhcmQgc2NhbiwgbG9hZCBzbyB0aGF0IHRhcmdldCBhcmVhIGlzIHRvcCBvZiB3aW5kb3cuCi0gICAgICogTm90ZSB0aGF0IHdoZW4gc3dpdGNoaW5nIGZyb20gZm9yd2FyZCB3cml0ZSB0byBmb3J3YXJkIHJlYWQsIHdpbGwgaGF2ZQotICAgICAqIHN0YXJ0X3JvdyA9IDAsIHNvIHRoZSBsaW1pdGluZyBjYXNlIGFwcGxpZXMgYW5kIHdlIGxvYWQgZnJvbSAwIGFueXdheS4KLSAgICAgKi8KLSAgICBpZiAoc3RhcnRfcm93ID4gcHRyLT5jdXJfc3RhcnRfcm93KSB7Ci0gICAgICBwdHItPmN1cl9zdGFydF9yb3cgPSBzdGFydF9yb3c7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIHVzZSBsb25nIGFyaXRobWV0aWMgaGVyZSB0byBhdm9pZCBvdmVyZmxvdyAmIHVuc2lnbmVkIHByb2JsZW1zICovCi0gICAgICBsb25nIGx0ZW1wOwotCi0gICAgICBsdGVtcCA9IChsb25nKSBlbmRfcm93IC0gKGxvbmcpIHB0ci0+cm93c19pbl9tZW07Ci0gICAgICBpZiAobHRlbXAgPCAwKQotCWx0ZW1wID0gMDsJCS8qIGRvbid0IGZhbGwgb2ZmIGZyb250IGVuZCBvZiBmaWxlICovCi0gICAgICBwdHItPmN1cl9zdGFydF9yb3cgPSAoSkRJTUVOU0lPTikgbHRlbXA7Ci0gICAgfQotICAgIC8qIFJlYWQgaW4gdGhlIHNlbGVjdGVkIHBhcnQgb2YgdGhlIGFycmF5LgotICAgICAqIER1cmluZyB0aGUgaW5pdGlhbCB3cml0ZSBwYXNzLCB3ZSB3aWxsIGRvIG5vIGFjdHVhbCByZWFkCi0gICAgICogYmVjYXVzZSB0aGUgc2VsZWN0ZWQgcGFydCBpcyBhbGwgdW5kZWZpbmVkLgotICAgICAqLwotICAgIGRvX3NhcnJheV9pbyhjaW5mbywgcHRyLCBGQUxTRSk7Ci0gIH0KLSAgLyogRW5zdXJlIHRoZSBhY2Nlc3NlZCBwYXJ0IG9mIHRoZSBhcnJheSBpcyBkZWZpbmVkOyBwcmV6ZXJvIGlmIG5lZWRlZC4KLSAgICogVG8gaW1wcm92ZSBsb2NhbGl0eSBvZiBhY2Nlc3MsIHdlIG9ubHkgcHJlemVybyB0aGUgcGFydCBvZiB0aGUgYXJyYXkKLSAgICogdGhhdCB0aGUgY2FsbGVyIGlzIGFib3V0IHRvIGFjY2Vzcywgbm90IHRoZSBlbnRpcmUgaW4tbWVtb3J5IGFycmF5LgotICAgKi8KLSAgaWYgKHB0ci0+Zmlyc3RfdW5kZWZfcm93IDwgZW5kX3JvdykgewotICAgIGlmIChwdHItPmZpcnN0X3VuZGVmX3JvdyA8IHN0YXJ0X3JvdykgewotICAgICAgaWYgKHdyaXRhYmxlKQkJLyogd3JpdGVyIHNraXBwZWQgb3ZlciBhIHNlY3Rpb24gb2YgYXJyYXkgKi8KLQlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9WSVJUVUFMX0FDQ0VTUyk7Ci0gICAgICB1bmRlZl9yb3cgPSBzdGFydF9yb3c7CS8qIGJ1dCByZWFkZXIgaXMgYWxsb3dlZCB0byByZWFkIGFoZWFkICovCi0gICAgfSBlbHNlIHsKLSAgICAgIHVuZGVmX3JvdyA9IHB0ci0+Zmlyc3RfdW5kZWZfcm93OwotICAgIH0KLSAgICBpZiAod3JpdGFibGUpCi0gICAgICBwdHItPmZpcnN0X3VuZGVmX3JvdyA9IGVuZF9yb3c7Ci0gICAgaWYgKHB0ci0+cHJlX3plcm8pIHsKLSAgICAgIHNpemVfdCBieXRlc3BlcnJvdyA9IChzaXplX3QpIHB0ci0+c2FtcGxlc3BlcnJvdyAqIFNJWkVPRihKU0FNUExFKTsKLSAgICAgIHVuZGVmX3JvdyAtPSBwdHItPmN1cl9zdGFydF9yb3c7IC8qIG1ha2UgaW5kZXhlcyByZWxhdGl2ZSB0byBidWZmZXIgKi8KLSAgICAgIGVuZF9yb3cgLT0gcHRyLT5jdXJfc3RhcnRfcm93OwotICAgICAgd2hpbGUgKHVuZGVmX3JvdyA8IGVuZF9yb3cpIHsKLQlqemVyb19mYXIoKHZvaWQgRkFSICopIHB0ci0+bWVtX2J1ZmZlclt1bmRlZl9yb3ddLCBieXRlc3BlcnJvdyk7Ci0JdW5kZWZfcm93Kys7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICghIHdyaXRhYmxlKQkJLyogcmVhZGVyIGxvb2tpbmcgYXQgdW5kZWZpbmVkIGRhdGEgKi8KLQlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9WSVJUVUFMX0FDQ0VTUyk7Ci0gICAgfQotICB9Ci0gIC8qIEZsYWcgdGhlIGJ1ZmZlciBkaXJ0eSBpZiBjYWxsZXIgd2lsbCB3cml0ZSBpbiBpdCAqLwotICBpZiAod3JpdGFibGUpCi0gICAgcHRyLT5kaXJ0eSA9IFRSVUU7Ci0gIC8qIFJldHVybiBhZGRyZXNzIG9mIHByb3BlciBwYXJ0IG9mIHRoZSBidWZmZXIgKi8KLSAgcmV0dXJuIHB0ci0+bWVtX2J1ZmZlciArIChzdGFydF9yb3cgLSBwdHItPmN1cl9zdGFydF9yb3cpOwotfQotCi0KLU1FVEhPRERFRihKQkxPQ0tBUlJBWSkKLWFjY2Vzc192aXJ0X2JhcnJheSAoal9jb21tb25fcHRyIGNpbmZvLCBqdmlydF9iYXJyYXlfcHRyIHB0ciwKLQkJICAgIEpESU1FTlNJT04gc3RhcnRfcm93LCBKRElNRU5TSU9OIG51bV9yb3dzLAotCQkgICAgYm9vbGVhbiB3cml0YWJsZSkKLS8qIEFjY2VzcyB0aGUgcGFydCBvZiBhIHZpcnR1YWwgYmxvY2sgYXJyYXkgc3RhcnRpbmcgYXQgc3RhcnRfcm93ICovCi0vKiBhbmQgZXh0ZW5kaW5nIGZvciBudW1fcm93cyByb3dzLiAgd3JpdGFibGUgaXMgdHJ1ZSBpZiAgKi8KLS8qIGNhbGxlciBpbnRlbmRzIHRvIG1vZGlmeSB0aGUgYWNjZXNzZWQgYXJlYS4gKi8KLXsKLSAgSkRJTUVOU0lPTiBlbmRfcm93ID0gc3RhcnRfcm93ICsgbnVtX3Jvd3M7Ci0gIEpESU1FTlNJT04gdW5kZWZfcm93OwotCi0gIC8qIGRlYnVnZ2luZyBjaGVjayAqLwotICBpZiAoZW5kX3JvdyA+IHB0ci0+cm93c19pbl9hcnJheSB8fCBudW1fcm93cyA+IHB0ci0+bWF4YWNjZXNzIHx8Ci0gICAgICBwdHItPm1lbV9idWZmZXIgPT0gTlVMTCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9WSVJUVUFMX0FDQ0VTUyk7Ci0KLSAgLyogTWFrZSB0aGUgZGVzaXJlZCBwYXJ0IG9mIHRoZSB2aXJ0dWFsIGFycmF5IGFjY2Vzc2libGUgKi8KLSAgaWYgKHN0YXJ0X3JvdyA8IHB0ci0+Y3VyX3N0YXJ0X3JvdyB8fAotICAgICAgZW5kX3JvdyA+IHB0ci0+Y3VyX3N0YXJ0X3JvdytwdHItPnJvd3NfaW5fbWVtKSB7Ci0gICAgaWYgKCEgcHRyLT5iX3Nfb3BlbikKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVklSVFVBTF9CVUcpOwotICAgIC8qIEZsdXNoIG9sZCBidWZmZXIgY29udGVudHMgaWYgbmVjZXNzYXJ5ICovCi0gICAgaWYgKHB0ci0+ZGlydHkpIHsKLSAgICAgIGRvX2JhcnJheV9pbyhjaW5mbywgcHRyLCBUUlVFKTsKLSAgICAgIHB0ci0+ZGlydHkgPSBGQUxTRTsKLSAgICB9Ci0gICAgLyogRGVjaWRlIHdoYXQgcGFydCBvZiB2aXJ0dWFsIGFycmF5IHRvIGFjY2Vzcy4KLSAgICAgKiBBbGdvcml0aG06IGlmIHRhcmdldCBhZGRyZXNzID4gY3VycmVudCB3aW5kb3csIGFzc3VtZSBmb3J3YXJkIHNjYW4sCi0gICAgICogbG9hZCBzdGFydGluZyBhdCB0YXJnZXQgYWRkcmVzcy4gIElmIHRhcmdldCBhZGRyZXNzIDwgY3VycmVudCB3aW5kb3csCi0gICAgICogYXNzdW1lIGJhY2t3YXJkIHNjYW4sIGxvYWQgc28gdGhhdCB0YXJnZXQgYXJlYSBpcyB0b3Agb2Ygd2luZG93LgotICAgICAqIE5vdGUgdGhhdCB3aGVuIHN3aXRjaGluZyBmcm9tIGZvcndhcmQgd3JpdGUgdG8gZm9yd2FyZCByZWFkLCB3aWxsIGhhdmUKLSAgICAgKiBzdGFydF9yb3cgPSAwLCBzbyB0aGUgbGltaXRpbmcgY2FzZSBhcHBsaWVzIGFuZCB3ZSBsb2FkIGZyb20gMCBhbnl3YXkuCi0gICAgICovCi0gICAgaWYgKHN0YXJ0X3JvdyA+IHB0ci0+Y3VyX3N0YXJ0X3JvdykgewotICAgICAgcHRyLT5jdXJfc3RhcnRfcm93ID0gc3RhcnRfcm93OwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiB1c2UgbG9uZyBhcml0aG1ldGljIGhlcmUgdG8gYXZvaWQgb3ZlcmZsb3cgJiB1bnNpZ25lZCBwcm9ibGVtcyAqLwotICAgICAgbG9uZyBsdGVtcDsKLQotICAgICAgbHRlbXAgPSAobG9uZykgZW5kX3JvdyAtIChsb25nKSBwdHItPnJvd3NfaW5fbWVtOwotICAgICAgaWYgKGx0ZW1wIDwgMCkKLQlsdGVtcCA9IDA7CQkvKiBkb24ndCBmYWxsIG9mZiBmcm9udCBlbmQgb2YgZmlsZSAqLwotICAgICAgcHRyLT5jdXJfc3RhcnRfcm93ID0gKEpESU1FTlNJT04pIGx0ZW1wOwotICAgIH0KLSAgICAvKiBSZWFkIGluIHRoZSBzZWxlY3RlZCBwYXJ0IG9mIHRoZSBhcnJheS4KLSAgICAgKiBEdXJpbmcgdGhlIGluaXRpYWwgd3JpdGUgcGFzcywgd2Ugd2lsbCBkbyBubyBhY3R1YWwgcmVhZAotICAgICAqIGJlY2F1c2UgdGhlIHNlbGVjdGVkIHBhcnQgaXMgYWxsIHVuZGVmaW5lZC4KLSAgICAgKi8KLSAgICBkb19iYXJyYXlfaW8oY2luZm8sIHB0ciwgRkFMU0UpOwotICB9Ci0gIC8qIEVuc3VyZSB0aGUgYWNjZXNzZWQgcGFydCBvZiB0aGUgYXJyYXkgaXMgZGVmaW5lZDsgcHJlemVybyBpZiBuZWVkZWQuCi0gICAqIFRvIGltcHJvdmUgbG9jYWxpdHkgb2YgYWNjZXNzLCB3ZSBvbmx5IHByZXplcm8gdGhlIHBhcnQgb2YgdGhlIGFycmF5Ci0gICAqIHRoYXQgdGhlIGNhbGxlciBpcyBhYm91dCB0byBhY2Nlc3MsIG5vdCB0aGUgZW50aXJlIGluLW1lbW9yeSBhcnJheS4KLSAgICovCi0gIGlmIChwdHItPmZpcnN0X3VuZGVmX3JvdyA8IGVuZF9yb3cpIHsKLSAgICBpZiAocHRyLT5maXJzdF91bmRlZl9yb3cgPCBzdGFydF9yb3cpIHsKLSAgICAgIGlmICh3cml0YWJsZSkJCS8qIHdyaXRlciBza2lwcGVkIG92ZXIgYSBzZWN0aW9uIG9mIGFycmF5ICovCi0JRVJSRVhJVChjaW5mbywgSkVSUl9CQURfVklSVFVBTF9BQ0NFU1MpOwotICAgICAgdW5kZWZfcm93ID0gc3RhcnRfcm93OwkvKiBidXQgcmVhZGVyIGlzIGFsbG93ZWQgdG8gcmVhZCBhaGVhZCAqLwotICAgIH0gZWxzZSB7Ci0gICAgICB1bmRlZl9yb3cgPSBwdHItPmZpcnN0X3VuZGVmX3JvdzsKLSAgICB9Ci0gICAgaWYgKHdyaXRhYmxlKQotICAgICAgcHRyLT5maXJzdF91bmRlZl9yb3cgPSBlbmRfcm93OwotICAgIGlmIChwdHItPnByZV96ZXJvKSB7Ci0gICAgICBzaXplX3QgYnl0ZXNwZXJyb3cgPSAoc2l6ZV90KSBwdHItPmJsb2Nrc3BlcnJvdyAqIFNJWkVPRihKQkxPQ0spOwotICAgICAgdW5kZWZfcm93IC09IHB0ci0+Y3VyX3N0YXJ0X3JvdzsgLyogbWFrZSBpbmRleGVzIHJlbGF0aXZlIHRvIGJ1ZmZlciAqLwotICAgICAgZW5kX3JvdyAtPSBwdHItPmN1cl9zdGFydF9yb3c7Ci0gICAgICB3aGlsZSAodW5kZWZfcm93IDwgZW5kX3JvdykgewotCWp6ZXJvX2Zhcigodm9pZCBGQVIgKikgcHRyLT5tZW1fYnVmZmVyW3VuZGVmX3Jvd10sIGJ5dGVzcGVycm93KTsKLQl1bmRlZl9yb3crKzsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKCEgd3JpdGFibGUpCQkvKiByZWFkZXIgbG9va2luZyBhdCB1bmRlZmluZWQgZGF0YSAqLwotCUVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1ZJUlRVQUxfQUNDRVNTKTsKLSAgICB9Ci0gIH0KLSAgLyogRmxhZyB0aGUgYnVmZmVyIGRpcnR5IGlmIGNhbGxlciB3aWxsIHdyaXRlIGluIGl0ICovCi0gIGlmICh3cml0YWJsZSkKLSAgICBwdHItPmRpcnR5ID0gVFJVRTsKLSAgLyogUmV0dXJuIGFkZHJlc3Mgb2YgcHJvcGVyIHBhcnQgb2YgdGhlIGJ1ZmZlciAqLwotICByZXR1cm4gcHRyLT5tZW1fYnVmZmVyICsgKHN0YXJ0X3JvdyAtIHB0ci0+Y3VyX3N0YXJ0X3Jvdyk7Ci19Ci0KLQotLyoKLSAqIFJlbGVhc2UgYWxsIG9iamVjdHMgYmVsb25naW5nIHRvIGEgc3BlY2lmaWVkIHBvb2wuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1mcmVlX3Bvb2wgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQpCi17Ci0gIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07Ci0gIHNtYWxsX3Bvb2xfcHRyIHNoZHJfcHRyOwotICBsYXJnZV9wb29sX3B0ciBsaGRyX3B0cjsKLSAgc2l6ZV90IHNwYWNlX2ZyZWVkOwotCi0gIGlmIChwb29sX2lkIDwgMCB8fCBwb29sX2lkID49IEpQT09MX05VTVBPT0xTKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QT09MX0lELCBwb29sX2lkKTsJLyogc2FmZXR5IGNoZWNrICovCi0KLSNpZmRlZiBNRU1fU1RBVFMKLSAgaWYgKGNpbmZvLT5lcnItPnRyYWNlX2xldmVsID4gMSkKLSAgICBwcmludF9tZW1fc3RhdHMoY2luZm8sIHBvb2xfaWQpOyAvKiBwcmludCBwb29sJ3MgbWVtb3J5IHVzYWdlIHN0YXRpc3RpY3MgKi8KLSNlbmRpZgotCi0gIC8qIElmIGZyZWVpbmcgSU1BR0UgcG9vbCwgY2xvc2UgYW55IHZpcnR1YWwgYXJyYXlzIGZpcnN0ICovCi0gIGlmIChwb29sX2lkID09IEpQT09MX0lNQUdFKSB7Ci0gICAganZpcnRfc2FycmF5X3B0ciBzcHRyOwotICAgIGp2aXJ0X2JhcnJheV9wdHIgYnB0cjsKLQotICAgIGZvciAoc3B0ciA9IG1lbS0+dmlydF9zYXJyYXlfbGlzdDsgc3B0ciAhPSBOVUxMOyBzcHRyID0gc3B0ci0+bmV4dCkgewotICAgICAgaWYgKHNwdHItPmJfc19vcGVuKSB7CS8qIHRoZXJlIG1heSBiZSBubyBiYWNraW5nIHN0b3JlICovCi0Jc3B0ci0+Yl9zX29wZW4gPSBGQUxTRTsJLyogcHJldmVudCByZWN1cnNpdmUgY2xvc2UgaWYgZXJyb3IgKi8KLQkoKnNwdHItPmJfc19pbmZvLmNsb3NlX2JhY2tpbmdfc3RvcmUpIChjaW5mbywgJiBzcHRyLT5iX3NfaW5mbyk7Ci0gICAgICB9Ci0gICAgfQotICAgIG1lbS0+dmlydF9zYXJyYXlfbGlzdCA9IE5VTEw7Ci0gICAgZm9yIChicHRyID0gbWVtLT52aXJ0X2JhcnJheV9saXN0OyBicHRyICE9IE5VTEw7IGJwdHIgPSBicHRyLT5uZXh0KSB7Ci0gICAgICBpZiAoYnB0ci0+Yl9zX29wZW4pIHsJLyogdGhlcmUgbWF5IGJlIG5vIGJhY2tpbmcgc3RvcmUgKi8KLQlicHRyLT5iX3Nfb3BlbiA9IEZBTFNFOwkvKiBwcmV2ZW50IHJlY3Vyc2l2ZSBjbG9zZSBpZiBlcnJvciAqLwotCSgqYnB0ci0+Yl9zX2luZm8uY2xvc2VfYmFja2luZ19zdG9yZSkgKGNpbmZvLCAmIGJwdHItPmJfc19pbmZvKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgbWVtLT52aXJ0X2JhcnJheV9saXN0ID0gTlVMTDsKLSAgfQotCi0gIC8qIFJlbGVhc2UgbGFyZ2Ugb2JqZWN0cyAqLwotICBsaGRyX3B0ciA9IG1lbS0+bGFyZ2VfbGlzdFtwb29sX2lkXTsKLSAgbWVtLT5sYXJnZV9saXN0W3Bvb2xfaWRdID0gTlVMTDsKLQotICB3aGlsZSAobGhkcl9wdHIgIT0gTlVMTCkgewotICAgIGxhcmdlX3Bvb2xfcHRyIG5leHRfbGhkcl9wdHIgPSBsaGRyX3B0ci0+aGRyLm5leHQ7Ci0gICAgc3BhY2VfZnJlZWQgPSBsaGRyX3B0ci0+aGRyLmJ5dGVzX3VzZWQgKwotCQkgIGxoZHJfcHRyLT5oZHIuYnl0ZXNfbGVmdCArCi0JCSAgU0laRU9GKGxhcmdlX3Bvb2xfaGRyKTsKLSAgICBqcGVnX2ZyZWVfbGFyZ2UoY2luZm8sICh2b2lkIEZBUiAqKSBsaGRyX3B0ciwgc3BhY2VfZnJlZWQpOwotICAgIG1lbS0+dG90YWxfc3BhY2VfYWxsb2NhdGVkIC09IHNwYWNlX2ZyZWVkOwotICAgIGxoZHJfcHRyID0gbmV4dF9saGRyX3B0cjsKLSAgfQotCi0gIC8qIFJlbGVhc2Ugc21hbGwgb2JqZWN0cyAqLwotICBzaGRyX3B0ciA9IG1lbS0+c21hbGxfbGlzdFtwb29sX2lkXTsKLSAgbWVtLT5zbWFsbF9saXN0W3Bvb2xfaWRdID0gTlVMTDsKLQotICB3aGlsZSAoc2hkcl9wdHIgIT0gTlVMTCkgewotICAgIHNtYWxsX3Bvb2xfcHRyIG5leHRfc2hkcl9wdHIgPSBzaGRyX3B0ci0+aGRyLm5leHQ7Ci0gICAgc3BhY2VfZnJlZWQgPSBzaGRyX3B0ci0+aGRyLmJ5dGVzX3VzZWQgKwotCQkgIHNoZHJfcHRyLT5oZHIuYnl0ZXNfbGVmdCArCi0JCSAgU0laRU9GKHNtYWxsX3Bvb2xfaGRyKTsKLSAgICBqcGVnX2ZyZWVfc21hbGwoY2luZm8sICh2b2lkICopIHNoZHJfcHRyLCBzcGFjZV9mcmVlZCk7Ci0gICAgbWVtLT50b3RhbF9zcGFjZV9hbGxvY2F0ZWQgLT0gc3BhY2VfZnJlZWQ7Ci0gICAgc2hkcl9wdHIgPSBuZXh0X3NoZHJfcHRyOwotICB9Ci19Ci0KLQotLyoKLSAqIENsb3NlIHVwIHNob3AgZW50aXJlbHkuCi0gKiBOb3RlIHRoYXQgdGhpcyBjYW5ub3QgYmUgY2FsbGVkIHVubGVzcyBjaW5mby0+bWVtIGlzIG5vbi1OVUxMLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc2VsZl9kZXN0cnVjdCAoal9jb21tb25fcHRyIGNpbmZvKQotewotICBpbnQgcG9vbDsKLQotICAvKiBDbG9zZSBhbGwgYmFja2luZyBzdG9yZSwgcmVsZWFzZSBhbGwgbWVtb3J5LgotICAgKiBSZWxlYXNpbmcgcG9vbHMgaW4gcmV2ZXJzZSBvcmRlciBtaWdodCBoZWxwIGF2b2lkIGZyYWdtZW50YXRpb24KLSAgICogd2l0aCBzb21lIChicmFpbi1kYW1hZ2VkKSBtYWxsb2MgbGlicmFyaWVzLgotICAgKi8KLSAgZm9yIChwb29sID0gSlBPT0xfTlVNUE9PTFMtMTsgcG9vbCA+PSBKUE9PTF9QRVJNQU5FTlQ7IHBvb2wtLSkgewotICAgIGZyZWVfcG9vbChjaW5mbywgcG9vbCk7Ci0gIH0KLQotICAvKiBSZWxlYXNlIHRoZSBtZW1vcnkgbWFuYWdlciBjb250cm9sIGJsb2NrIHRvby4gKi8KLSAganBlZ19mcmVlX3NtYWxsKGNpbmZvLCAodm9pZCAqKSBjaW5mby0+bWVtLCBTSVpFT0YobXlfbWVtb3J5X21ncikpOwotICBjaW5mby0+bWVtID0gTlVMTDsJCS8qIGVuc3VyZXMgSSB3aWxsIGJlIGNhbGxlZCBvbmx5IG9uY2UgKi8KLQotICBqcGVnX21lbV90ZXJtKGNpbmZvKTsJCS8qIHN5c3RlbS1kZXBlbmRlbnQgY2xlYW51cCAqLwotfQotCi0KLS8qCi0gKiBNZW1vcnkgbWFuYWdlciBpbml0aWFsaXphdGlvbi4KLSAqIFdoZW4gdGhpcyBpcyBjYWxsZWQsIG9ubHkgdGhlIGVycm9yIG1hbmFnZXIgcG9pbnRlciBpcyB2YWxpZCBpbiBjaW5mbyEKLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X21lbW9yeV9tZ3IgKGpfY29tbW9uX3B0ciBjaW5mbykKLXsKLSAgbXlfbWVtX3B0ciBtZW07Ci0gIGxvbmcgbWF4X3RvX3VzZTsKLSAgaW50IHBvb2w7Ci0gIHNpemVfdCB0ZXN0X21hYzsKLQotICBjaW5mby0+bWVtID0gTlVMTDsJCS8qIGZvciBzYWZldHkgaWYgaW5pdCBmYWlscyAqLwotCi0gIC8qIENoZWNrIGZvciBjb25maWd1cmF0aW9uIGVycm9ycy4KLSAgICogU0laRU9GKEFMSUdOX1RZUEUpIHNob3VsZCBiZSBhIHBvd2VyIG9mIDI7IG90aGVyd2lzZSwgaXQgcHJvYmFibHkKLSAgICogZG9lc24ndCByZWZsZWN0IGFueSByZWFsIGhhcmR3YXJlIGFsaWdubWVudCByZXF1aXJlbWVudC4KLSAgICogVGhlIHRlc3QgaXMgYSBsaXR0bGUgdHJpY2t5OiBmb3IgWD4wLCBYIGFuZCBYLTEgaGF2ZSBubyBvbmUtYml0cwotICAgKiBpbiBjb21tb24gaWYgYW5kIG9ubHkgaWYgWCBpcyBhIHBvd2VyIG9mIDIsIGllIGhhcyBvbmx5IG9uZSBvbmUtYml0LgotICAgKiBTb21lIGNvbXBpbGVycyBtYXkgZ2l2ZSBhbiAidW5yZWFjaGFibGUgY29kZSIgd2FybmluZyBoZXJlOyBpZ25vcmUgaXQuCi0gICAqLwotICBpZiAoKFNJWkVPRihBTElHTl9UWVBFKSAmIChTSVpFT0YoQUxJR05fVFlQRSktMSkpICE9IDApCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQUxJR05fVFlQRSk7Ci0gIC8qIE1BWF9BTExPQ19DSFVOSyBtdXN0IGJlIHJlcHJlc2VudGFibGUgYXMgdHlwZSBzaXplX3QsIGFuZCBtdXN0IGJlCi0gICAqIGEgbXVsdGlwbGUgb2YgU0laRU9GKEFMSUdOX1RZUEUpLgotICAgKiBBZ2FpbiwgYW4gInVucmVhY2hhYmxlIGNvZGUiIHdhcm5pbmcgbWF5IGJlIGlnbm9yZWQgaGVyZS4KLSAgICogQnV0IGEgImNvbnN0YW50IHRvbyBsYXJnZSIgd2FybmluZyBtZWFucyB5b3UgbmVlZCB0byBmaXggTUFYX0FMTE9DX0NIVU5LLgotICAgKi8KLSAgdGVzdF9tYWMgPSAoc2l6ZV90KSBNQVhfQUxMT0NfQ0hVTks7Ci0gIGlmICgobG9uZykgdGVzdF9tYWMgIT0gTUFYX0FMTE9DX0NIVU5LIHx8Ci0gICAgICAoTUFYX0FMTE9DX0NIVU5LICUgU0laRU9GKEFMSUdOX1RZUEUpKSAhPSAwKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0FMTE9DX0NIVU5LKTsKLQotICBtYXhfdG9fdXNlID0ganBlZ19tZW1faW5pdChjaW5mbyk7IC8qIHN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gKi8KLQotICAvKiBBdHRlbXB0IHRvIGFsbG9jYXRlIG1lbW9yeSBtYW5hZ2VyJ3MgY29udHJvbCBibG9jayAqLwotICBtZW0gPSAobXlfbWVtX3B0cikganBlZ19nZXRfc21hbGwoY2luZm8sIFNJWkVPRihteV9tZW1vcnlfbWdyKSk7Ci0KLSAgaWYgKG1lbSA9PSBOVUxMKSB7Ci0gICAganBlZ19tZW1fdGVybShjaW5mbyk7CS8qIHN5c3RlbS1kZXBlbmRlbnQgY2xlYW51cCAqLwotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX09VVF9PRl9NRU1PUlksIDApOwotICB9Ci0KLSAgLyogT0ssIGZpbGwgaW4gdGhlIG1ldGhvZCBwb2ludGVycyAqLwotICBtZW0tPnB1Yi5hbGxvY19zbWFsbCA9IGFsbG9jX3NtYWxsOwotICBtZW0tPnB1Yi5hbGxvY19sYXJnZSA9IGFsbG9jX2xhcmdlOwotICBtZW0tPnB1Yi5hbGxvY19zYXJyYXkgPSBhbGxvY19zYXJyYXk7Ci0gIG1lbS0+cHViLmFsbG9jX2JhcnJheSA9IGFsbG9jX2JhcnJheTsKLSAgbWVtLT5wdWIucmVxdWVzdF92aXJ0X3NhcnJheSA9IHJlcXVlc3RfdmlydF9zYXJyYXk7Ci0gIG1lbS0+cHViLnJlcXVlc3RfdmlydF9iYXJyYXkgPSByZXF1ZXN0X3ZpcnRfYmFycmF5OwotICBtZW0tPnB1Yi5yZWFsaXplX3ZpcnRfYXJyYXlzID0gcmVhbGl6ZV92aXJ0X2FycmF5czsKLSAgbWVtLT5wdWIuYWNjZXNzX3ZpcnRfc2FycmF5ID0gYWNjZXNzX3ZpcnRfc2FycmF5OwotICBtZW0tPnB1Yi5hY2Nlc3NfdmlydF9iYXJyYXkgPSBhY2Nlc3NfdmlydF9iYXJyYXk7Ci0gIG1lbS0+cHViLmZyZWVfcG9vbCA9IGZyZWVfcG9vbDsKLSAgbWVtLT5wdWIuc2VsZl9kZXN0cnVjdCA9IHNlbGZfZGVzdHJ1Y3Q7Ci0KLSAgLyogTWFrZSBNQVhfQUxMT0NfQ0hVTksgYWNjZXNzaWJsZSB0byBvdGhlciBtb2R1bGVzICovCi0gIG1lbS0+cHViLm1heF9hbGxvY19jaHVuayA9IE1BWF9BTExPQ19DSFVOSzsKLQotICAvKiBJbml0aWFsaXplIHdvcmtpbmcgc3RhdGUgKi8KLSAgbWVtLT5wdWIubWF4X21lbW9yeV90b191c2UgPSBtYXhfdG9fdXNlOwotCi0gIGZvciAocG9vbCA9IEpQT09MX05VTVBPT0xTLTE7IHBvb2wgPj0gSlBPT0xfUEVSTUFORU5UOyBwb29sLS0pIHsKLSAgICBtZW0tPnNtYWxsX2xpc3RbcG9vbF0gPSBOVUxMOwotICAgIG1lbS0+bGFyZ2VfbGlzdFtwb29sXSA9IE5VTEw7Ci0gIH0KLSAgbWVtLT52aXJ0X3NhcnJheV9saXN0ID0gTlVMTDsKLSAgbWVtLT52aXJ0X2JhcnJheV9saXN0ID0gTlVMTDsKLQotICBtZW0tPnRvdGFsX3NwYWNlX2FsbG9jYXRlZCA9IFNJWkVPRihteV9tZW1vcnlfbWdyKTsKLQotICAvKiBEZWNsYXJlIG91cnNlbHZlcyBvcGVuIGZvciBidXNpbmVzcyAqLwotICBjaW5mby0+bWVtID0gJiBtZW0tPnB1YjsKLQotICAvKiBDaGVjayBmb3IgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgSlBFR01FTTsgaWYgZm91bmQsIG92ZXJyaWRlIHRoZQotICAgKiBkZWZhdWx0IG1heF9tZW1vcnkgc2V0dGluZyBmcm9tIGpwZWdfbWVtX2luaXQuICBOb3RlIHRoYXQgdGhlCi0gICAqIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIG1heSBhZ2FpbiBvdmVycmlkZSB0aGlzIHZhbHVlLgotICAgKiBJZiB5b3VyIHN5c3RlbSBkb2Vzbid0IHN1cHBvcnQgZ2V0ZW52KCksIGRlZmluZSBOT19HRVRFTlYgdG8gZGlzYWJsZQotICAgKiB0aGlzIGZlYXR1cmUuCi0gICAqLwotI2lmbmRlZiBOT19HRVRFTlYKLSAgeyBjaGFyICogbWVtZW52OwotCi0gICAgaWYgKChtZW1lbnYgPSBnZXRlbnYoIkpQRUdNRU0iKSkgIT0gTlVMTCkgewotICAgICAgY2hhciBjaCA9ICd4JzsKLQotICAgICAgaWYgKHNzY2FuZihtZW1lbnYsICIlbGQlYyIsICZtYXhfdG9fdXNlLCAmY2gpID4gMCkgewotCWlmIChjaCA9PSAnbScgfHwgY2ggPT0gJ00nKQotCSAgbWF4X3RvX3VzZSAqPSAxMDAwTDsKLQltZW0tPnB1Yi5tYXhfbWVtb3J5X3RvX3VzZSA9IG1heF90b191c2UgKiAxMDAwTDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSNlbmRpZgotCi19Ci0KLSNlbmRpZiAvL19GWF9KUEVHX1RVUkJPXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfam1lbW5vYnMuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2ptZW1ub2JzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZjc4OWEuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfam1lbW5vYnMuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0jaWYgIWRlZmluZWQoX0ZYX0pQRUdfVFVSQk9fKQotLyoKLSAqIGptZW1ub2JzLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBwcm92aWRlcyBhIHJlYWxseSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN5c3RlbS0KLSAqIGRlcGVuZGVudCBwb3J0aW9uIG9mIHRoZSBKUEVHIG1lbW9yeSBtYW5hZ2VyLiAgVGhpcyBpbXBsZW1lbnRhdGlvbgotICogYXNzdW1lcyB0aGF0IG5vIGJhY2tpbmctc3RvcmUgZmlsZXMgYXJlIG5lZWRlZDogYWxsIHJlcXVpcmVkIHNwYWNlCi0gKiBjYW4gYmUgb2J0YWluZWQgZnJvbSBtYWxsb2MoKS4KLSAqIFRoaXMgaXMgdmVyeSBwb3J0YWJsZSBpbiB0aGUgc2Vuc2UgdGhhdCBpdCdsbCBjb21waWxlIG9uIGFsbW9zdCBhbnl0aGluZywKLSAqIGJ1dCB5b3UnZCBiZXR0ZXIgaGF2ZSBsb3RzIG9mIG1haW4gbWVtb3J5IChvciB2aXJ0dWFsIG1lbW9yeSkgaWYgeW91IHdhbnQKLSAqIHRvIHByb2Nlc3MgYmlnIGltYWdlcy4KLSAqIE5vdGUgdGhhdCB0aGUgbWF4X21lbW9yeV90b191c2Ugb3B0aW9uIGlzIGlnbm9yZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbi4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiam1lbXN5cy5oIgkJLyogaW1wb3J0IHRoZSBzeXN0ZW0tZGVwZW5kZW50IGRlY2xhcmF0aW9ucyAqLwotCi0jaWZuZGVmIEhBVkVfU1RETElCX0gJCS8qIDxzdGRsaWIuaD4gc2hvdWxkIGRlY2xhcmUgbWFsbG9jKCksZnJlZSgpICovCi1leHRlcm4gdm9pZCAqIG1hbGxvYyBKUFAoKHNpemVfdCBzaXplKSk7Ci1leHRlcm4gdm9pZCBmcmVlIEpQUCgodm9pZCAqcHRyKSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoX0ZYX01BTkFHRURfQ09ERV8pICYmIGRlZmluZWQoX19jcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi12b2lkKglGWE1FTV9EZWZhdWx0QWxsb2MoaW50IGJ5dGVfc2l6ZSwgaW50KTsKLXZvaWQJRlhNRU1fRGVmYXVsdEZyZWUodm9pZCogcG9pbnRlciwgaW50KTsKLQotI2lmIGRlZmluZWQoX0ZYX01BTkFHRURfQ09ERV8pICYmIGRlZmluZWQoX19jcGx1c3BsdXMpCi19Ci0jZW5kaWYKLQotLyoKLSAqIE1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlaW5nIGFyZSBjb250cm9sbGVkIGJ5IHRoZSByZWd1bGFyIGxpYnJhcnkKLSAqIHJvdXRpbmVzIG1hbGxvYygpIGFuZCBmcmVlKCkuCi0gKi8KLQotR0xPQkFMKHZvaWQgKikKLWpwZWdfZ2V0X3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0vLyAgcmV0dXJuICh2b2lkICopIG1hbGxvYyhzaXplb2ZvYmplY3QpOwotCXJldHVybiBGWE1FTV9EZWZhdWx0QWxsb2Moc2l6ZW9mb2JqZWN0LCAwKTsKLX0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2ZyZWVfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKLXsKLS8vICBmcmVlKG9iamVjdCk7Ci0JRlhNRU1fRGVmYXVsdEZyZWUob2JqZWN0LCAwKTsKLX0KLQotCi0vKgotICogIkxhcmdlIiBvYmplY3RzIGFyZSB0cmVhdGVkIHRoZSBzYW1lIGFzICJzbWFsbCIgb25lcy4KLSAqIE5COiBhbHRob3VnaCB3ZSBpbmNsdWRlIEZBUiBrZXl3b3JkcyBpbiB0aGUgcm91dGluZSBkZWNsYXJhdGlvbnMsCi0gKiB0aGlzIGZpbGUgd29uJ3QgYWN0dWFsbHkgd29yayBpbiA4MHg4NiBzbWFsbC9tZWRpdW0gbW9kZWw7IGF0IGxlYXN0LAotICogeW91IHByb2JhYmx5IHdvbid0IGJlIGFibGUgdG8gcHJvY2VzcyB1c2VmdWwtc2l6ZSBpbWFnZXMgaW4gb25seSA2NEtCLgotICovCi0KLUdMT0JBTCh2b2lkIEZBUiAqKQotanBlZ19nZXRfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgc2l6ZV90IHNpemVvZm9iamVjdCkKLXsKLS8vICByZXR1cm4gKHZvaWQgRkFSICopIG1hbGxvYyhzaXplb2ZvYmplY3QpOwotCXJldHVybiBGWE1FTV9EZWZhdWx0QWxsb2Moc2l6ZW9mb2JqZWN0LCAwKTsKLX0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2ZyZWVfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCBGQVIgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0vLyAgZnJlZShvYmplY3QpOwotCUZYTUVNX0RlZmF1bHRGcmVlKG9iamVjdCwgMCk7Ci19Ci0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBjb21wdXRlcyB0aGUgdG90YWwgbWVtb3J5IHNwYWNlIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbi4KLSAqIEhlcmUgd2UgYWx3YXlzIHNheSwgIndlIGdvdCBhbGwgeW91IHdhbnQgYnVkISIKLSAqLwotCi1HTE9CQUwobG9uZykKLWpwZWdfbWVtX2F2YWlsYWJsZSAoal9jb21tb25fcHRyIGNpbmZvLCBsb25nIG1pbl9ieXRlc19uZWVkZWQsCi0JCSAgICBsb25nIG1heF9ieXRlc19uZWVkZWQsIGxvbmcgYWxyZWFkeV9hbGxvY2F0ZWQpCi17Ci0gIHJldHVybiBtYXhfYnl0ZXNfbmVlZGVkOwotfQotCi0KLS8qCi0gKiBCYWNraW5nIHN0b3JlICh0ZW1wb3JhcnkgZmlsZSkgbWFuYWdlbWVudC4KLSAqIFNpbmNlIGpwZWdfbWVtX2F2YWlsYWJsZSBhbHdheXMgcHJvbWlzZWQgdGhlIG1vb24sCi0gKiB0aGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgYW5kIHdlIGNhbiBqdXN0IGVycm9yIG91dC4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfb3Blbl9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCi0JCQkgbG9uZyB0b3RhbF9ieXRlc19uZWVkZWQpCi17Ci0gIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9fQkFDS0lOR19TVE9SRSk7Ci19Ci0KLQotLyoKLSAqIFRoZXNlIHJvdXRpbmVzIHRha2UgY2FyZSBvZiBhbnkgc3lzdGVtLWRlcGVuZGVudCBpbml0aWFsaXphdGlvbiBhbmQKLSAqIGNsZWFudXAgcmVxdWlyZWQuICBIZXJlLCB0aGVyZSBpc24ndCBhbnkuCi0gKi8KLQotR0xPQkFMKGxvbmcpCi1qcGVnX21lbV9pbml0IChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIHJldHVybiAwOwkJCS8qIGp1c3Qgc2V0IG1heF9tZW1vcnlfdG9fdXNlIHRvIDAgKi8KLX0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX21lbV90ZXJtIChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIC8qIG5vIHdvcmsgKi8KLX0KLQotI2VuZGlmIC8vX0ZYX0pQRUdfVFVSQk9fCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qdXRpbHMuYyBiL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2p1dGlscy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmY3MjQ4Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2p1dGlscy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLSNpZiAhZGVmaW5lZChfRlhfSlBFR19UVVJCT18pCi0vKgotICoganV0aWxzLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0YWJsZXMgYW5kIG1pc2NlbGxhbmVvdXMgdXRpbGl0eSByb3V0aW5lcyBuZWVkZWQKLSAqIGZvciBib3RoIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uLgotICogTm90ZSB3ZSBwcmVmaXggYWxsIGdsb2JhbCBuYW1lcyB3aXRoICJqIiB0byBtaW5pbWl6ZSBjb25mbGljdHMgd2l0aAotICogYSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbi4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyoKLSAqIGpwZWdfemlnemFnX29yZGVyW2ldIGlzIHRoZSB6aWd6YWctb3JkZXIgcG9zaXRpb24gb2YgdGhlIGkndGggZWxlbWVudAotICogb2YgYSBEQ1QgYmxvY2sgcmVhZCBpbiBuYXR1cmFsIG9yZGVyIChsZWZ0IHRvIHJpZ2h0LCB0b3AgdG8gYm90dG9tKS4KLSAqLwotCi0jaWYgMAkJCQkvKiBUaGlzIHRhYmxlIGlzIG5vdCBhY3R1YWxseSBuZWVkZWQgaW4gdjZhICovCi0KLWNvbnN0IGludCBqcGVnX3ppZ3phZ19vcmRlcltEQ1RTSVpFMl0gPSB7Ci0gICAwLCAgMSwgIDUsICA2LCAxNCwgMTUsIDI3LCAyOCwKLSAgIDIsICA0LCAgNywgMTMsIDE2LCAyNiwgMjksIDQyLAotICAgMywgIDgsIDEyLCAxNywgMjUsIDMwLCA0MSwgNDMsCi0gICA5LCAxMSwgMTgsIDI0LCAzMSwgNDAsIDQ0LCA1MywKLSAgMTAsIDE5LCAyMywgMzIsIDM5LCA0NSwgNTIsIDU0LAotICAyMCwgMjIsIDMzLCAzOCwgNDYsIDUxLCA1NSwgNjAsCi0gIDIxLCAzNCwgMzcsIDQ3LCA1MCwgNTYsIDU5LCA2MSwKLSAgMzUsIDM2LCA0OCwgNDksIDU3LCA1OCwgNjIsIDYzCi19OwotCi0jZW5kaWYKLQotLyoKLSAqIGpwZWdfbmF0dXJhbF9vcmRlcltpXSBpcyB0aGUgbmF0dXJhbC1vcmRlciBwb3NpdGlvbiBvZiB0aGUgaSd0aCBlbGVtZW50Ci0gKiBvZiB6aWd6YWcgb3JkZXIuCi0gKgotICogV2hlbiByZWFkaW5nIGNvcnJ1cHRlZCBkYXRhLCB0aGUgSHVmZm1hbiBkZWNvZGVycyBjb3VsZCBhdHRlbXB0Ci0gKiB0byByZWZlcmVuY2UgYW4gZW50cnkgYmV5b25kIHRoZSBlbmQgb2YgdGhpcyBhcnJheSAoaWYgdGhlIGRlY29kZWQKLSAqIHplcm8gcnVuIGxlbmd0aCByZWFjaGVzIHBhc3QgdGhlIGVuZCBvZiB0aGUgYmxvY2spLiAgVG8gcHJldmVudAotICogd2lsZCBzdG9yZXMgd2l0aG91dCBhZGRpbmcgYW4gaW5uZXItbG9vcCB0ZXN0LCB3ZSBwdXQgc29tZSBleHRyYQotICogIjYzInMgYWZ0ZXIgdGhlIHJlYWwgZW50cmllcy4gIFRoaXMgd2lsbCBjYXVzZSB0aGUgZXh0cmEgY29lZmZpY2llbnQKLSAqIHRvIGJlIHN0b3JlZCBpbiBsb2NhdGlvbiA2MyBvZiB0aGUgYmxvY2ssIG5vdCBzb21ld2hlcmUgcmFuZG9tLgotICogVGhlIHdvcnN0IGNhc2Ugd291bGQgYmUgYSBydW4tbGVuZ3RoIG9mIDE1LCB3aGljaCBtZWFucyB3ZSBuZWVkIDE2Ci0gKiBmYWtlIGVudHJpZXMuCi0gKi8KLQotY29uc3QgaW50IGpwZWdfbmF0dXJhbF9vcmRlcltEQ1RTSVpFMisxNl0gPSB7Ci0gIDAsICAxLCAgOCwgMTYsICA5LCAgMiwgIDMsIDEwLAotIDE3LCAyNCwgMzIsIDI1LCAxOCwgMTEsICA0LCAgNSwKLSAxMiwgMTksIDI2LCAzMywgNDAsIDQ4LCA0MSwgMzQsCi0gMjcsIDIwLCAxMywgIDYsICA3LCAxNCwgMjEsIDI4LAotIDM1LCA0MiwgNDksIDU2LCA1NywgNTAsIDQzLCAzNiwKLSAyOSwgMjIsIDE1LCAyMywgMzAsIDM3LCA0NCwgNTEsCi0gNTgsIDU5LCA1MiwgNDUsIDM4LCAzMSwgMzksIDQ2LAotIDUzLCA2MCwgNjEsIDU0LCA0NywgNTUsIDYyLCA2MywKLSA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIC8qIGV4dHJhIGVudHJpZXMgZm9yIHNhZmV0eSBpbiBkZWNvZGVyICovCi0gNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzCi19OwotCi0KLS8qCi0gKiBBcml0aG1ldGljIHV0aWxpdGllcwotICovCi0KLUdMT0JBTChsb25nKQotamRpdl9yb3VuZF91cCAobG9uZyBhLCBsb25nIGIpCi0vKiBDb21wdXRlIGEvYiByb3VuZGVkIHVwIHRvIG5leHQgaW50ZWdlciwgaWUsIGNlaWwoYS9iKSAqLwotLyogQXNzdW1lcyBhID49IDAsIGIgPiAwICovCi17Ci0gIHJldHVybiAoYSArIGIgLSAxTCkgLyBiOwotfQotCi0KLUdMT0JBTChsb25nKQotanJvdW5kX3VwIChsb25nIGEsIGxvbmcgYikKLS8qIENvbXB1dGUgYSByb3VuZGVkIHVwIHRvIG5leHQgbXVsdGlwbGUgb2YgYiwgaWUsIGNlaWwoYS9iKSpiICovCi0vKiBBc3N1bWVzIGEgPj0gMCwgYiA+IDAgKi8KLXsKLSAgYSArPSBiIC0gMUw7Ci0gIHJldHVybiBhIC0gKGEgJSBiKTsKLX0KLQotCi0vKiBPbiBub3JtYWwgbWFjaGluZXMgd2UgY2FuIGFwcGx5IE1FTUNPUFkoKSBhbmQgTUVNWkVSTygpIHRvIHNhbXBsZSBhcnJheXMKLSAqIGFuZCBjb2VmZmljaWVudC1ibG9jayBhcnJheXMuICBUaGlzIHdvbid0IHdvcmsgb24gODB4ODYgYmVjYXVzZSB0aGUgYXJyYXlzCi0gKiBhcmUgRkFSIGFuZCB3ZSdyZSBhc3N1bWluZyBhIHNtYWxsLXBvaW50ZXIgbWVtb3J5IG1vZGVsLiAgSG93ZXZlciwgc29tZQotICogRE9TIGNvbXBpbGVycyBwcm92aWRlIGZhci1wb2ludGVyIHZlcnNpb25zIG9mIG1lbWNweSgpIGFuZCBtZW1zZXQoKSBldmVuCi0gKiBpbiB0aGUgc21hbGwtbW9kZWwgbGlicmFyaWVzLiAgVGhlc2Ugd2lsbCBiZSB1c2VkIGlmIFVTRV9GTUVNIGlzIGRlZmluZWQuCi0gKiBPdGhlcndpc2UsIHRoZSByb3V0aW5lcyBiZWxvdyBkbyBpdCB0aGUgaGFyZCB3YXkuICAoVGhlIHBlcmZvcm1hbmNlIGNvc3QKLSAqIGlzIG5vdCBhbGwgdGhhdCBncmVhdCwgYmVjYXVzZSB0aGVzZSByb3V0aW5lcyBhcmVuJ3QgdmVyeSBoZWF2aWx5IHVzZWQuKQotICovCi0KLSNpZm5kZWYgTkVFRF9GQVJfUE9JTlRFUlMJLyogbm9ybWFsIGNhc2UsIHNhbWUgYXMgcmVndWxhciBtYWNyb3MgKi8KLSNkZWZpbmUgRk1FTUNPUFkoZGVzdCxzcmMsc2l6ZSkJTUVNQ09QWShkZXN0LHNyYyxzaXplKQotI2RlZmluZSBGTUVNWkVSTyh0YXJnZXQsc2l6ZSkJTUVNWkVSTyh0YXJnZXQsc2l6ZSkKLSNlbHNlCQkJCS8qIDgweDg2IGNhc2UsIGRlZmluZSBpZiB3ZSBjYW4gKi8KLSNpZmRlZiBVU0VfRk1FTQotI2RlZmluZSBGTUVNQ09QWShkZXN0LHNyYyxzaXplKQlfZm1lbWNweSgodm9pZCBGQVIgKikoZGVzdCksIChjb25zdCB2b2lkIEZBUiAqKShzcmMpLCAoc2l6ZV90KShzaXplKSkKLSNkZWZpbmUgRk1FTVpFUk8odGFyZ2V0LHNpemUpCV9mbWVtc2V0KCh2b2lkIEZBUiAqKSh0YXJnZXQpLCAwLCAoc2l6ZV90KShzaXplKSkKLSNlbmRpZgotI2VuZGlmCi0KLQotR0xPQkFMKHZvaWQpCi1qY29weV9zYW1wbGVfcm93cyAoSlNBTVBBUlJBWSBpbnB1dF9hcnJheSwgaW50IHNvdXJjZV9yb3csCi0JCSAgIEpTQU1QQVJSQVkgb3V0cHV0X2FycmF5LCBpbnQgZGVzdF9yb3csCi0JCSAgIGludCBudW1fcm93cywgSkRJTUVOU0lPTiBudW1fY29scykKLS8qIENvcHkgc29tZSByb3dzIG9mIHNhbXBsZXMgZnJvbSBvbmUgcGxhY2UgdG8gYW5vdGhlci4KLSAqIG51bV9yb3dzIHJvd3MgYXJlIGNvcGllZCBmcm9tIGlucHV0X2FycmF5W3NvdXJjZV9yb3crK10KLSAqIHRvIG91dHB1dF9hcnJheVtkZXN0X3JvdysrXTsgdGhlc2UgYXJlYXMgbWF5IG92ZXJsYXAgZm9yIGR1cGxpY2F0aW9uLgotICogVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJyYXlzIG11c3QgYmUgYXQgbGVhc3QgYXMgd2lkZSBhcyBudW1fY29scy4KLSAqLwotewotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOwotI2lmZGVmIEZNRU1DT1BZCi0gIHJlZ2lzdGVyIHNpemVfdCBjb3VudCA9IChzaXplX3QpIChudW1fY29scyAqIFNJWkVPRihKU0FNUExFKSk7Ci0jZWxzZQotICByZWdpc3RlciBKRElNRU5TSU9OIGNvdW50OwotI2VuZGlmCi0gIHJlZ2lzdGVyIGludCByb3c7Ci0KLSAgaW5wdXRfYXJyYXkgKz0gc291cmNlX3JvdzsKLSAgb3V0cHV0X2FycmF5ICs9IGRlc3Rfcm93OwotCi0gIGZvciAocm93ID0gbnVtX3Jvd3M7IHJvdyA+IDA7IHJvdy0tKSB7Ci0gICAgaW5wdHIgPSAqaW5wdXRfYXJyYXkrKzsKLSAgICBvdXRwdHIgPSAqb3V0cHV0X2FycmF5Kys7Ci0jaWZkZWYgRk1FTUNPUFkKLSAgICBGTUVNQ09QWShvdXRwdHIsIGlucHRyLCBjb3VudCk7Ci0jZWxzZQotICAgIGZvciAoY291bnQgPSBudW1fY29sczsgY291bnQgPiAwOyBjb3VudC0tKQotICAgICAgKm91dHB0cisrID0gKmlucHRyKys7CS8qIG5lZWRuJ3QgYm90aGVyIHdpdGggR0VUSlNBTVBMRSgpIGhlcmUgKi8KLSNlbmRpZgotICB9Ci19Ci0KLQotR0xPQkFMKHZvaWQpCi1qY29weV9ibG9ja19yb3cgKEpCTE9DS1JPVyBpbnB1dF9yb3csIEpCTE9DS1JPVyBvdXRwdXRfcm93LAotCQkgSkRJTUVOU0lPTiBudW1fYmxvY2tzKQotLyogQ29weSBhIHJvdyBvZiBjb2VmZmljaWVudCBibG9ja3MgZnJvbSBvbmUgcGxhY2UgdG8gYW5vdGhlci4gKi8KLXsKLSNpZmRlZiBGTUVNQ09QWQotICBGTUVNQ09QWShvdXRwdXRfcm93LCBpbnB1dF9yb3csIG51bV9ibG9ja3MgKiAoRENUU0laRTIgKiBTSVpFT0YoSkNPRUYpKSk7Ci0jZWxzZQotICByZWdpc3RlciBKQ09FRlBUUiBpbnB0ciwgb3V0cHRyOwotICByZWdpc3RlciBsb25nIGNvdW50OwotCi0gIGlucHRyID0gKEpDT0VGUFRSKSBpbnB1dF9yb3c7Ci0gIG91dHB0ciA9IChKQ09FRlBUUikgb3V0cHV0X3JvdzsKLSAgZm9yIChjb3VudCA9IChsb25nKSBudW1fYmxvY2tzICogRENUU0laRTI7IGNvdW50ID4gMDsgY291bnQtLSkgewotICAgICpvdXRwdHIrKyA9ICppbnB0cisrOwotICB9Ci0jZW5kaWYKLX0KLQotCi1HTE9CQUwodm9pZCkKLWp6ZXJvX2ZhciAodm9pZCBGQVIgKiB0YXJnZXQsIHNpemVfdCBieXRlc3RvemVybykKLS8qIFplcm8gb3V0IGEgY2h1bmsgb2YgRkFSIG1lbW9yeS4gKi8KLS8qIFRoaXMgbWlnaHQgYmUgc2FtcGxlLWFycmF5IGRhdGEsIGJsb2NrLWFycmF5IGRhdGEsIG9yIGFsbG9jX2xhcmdlIGRhdGEuICovCi17Ci0jaWZkZWYgRk1FTVpFUk8KLSAgRk1FTVpFUk8odGFyZ2V0LCBieXRlc3RvemVybyk7Ci0jZWxzZQotICByZWdpc3RlciBjaGFyIEZBUiAqIHB0ciA9IChjaGFyIEZBUiAqKSB0YXJnZXQ7Ci0gIHJlZ2lzdGVyIHNpemVfdCBjb3VudDsKLQotICBmb3IgKGNvdW50ID0gYnl0ZXN0b3plcm87IGNvdW50ID4gMDsgY291bnQtLSkgewotICAgICpwdHIrKyA9IDA7Ci0gIH0KLSNlbmRpZgotfQotCi0jZW5kaWYgLy9fRlhfSlBFR19UVVJCT18KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9qaW5jbHVkZS5oIGIvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ppbmNsdWRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjN2FhNjguLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ppbmNsdWRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIGppbmNsdWRlLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NCwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBleGlzdHMgdG8gcHJvdmlkZSBhIHNpbmdsZSBwbGFjZSB0byBmaXggYW55IHByb2JsZW1zIHdpdGgKLSAqIGluY2x1ZGluZyB0aGUgd3Jvbmcgc3lzdGVtIGluY2x1ZGUgZmlsZXMuICAoQ29tbW9uIHByb2JsZW1zIGFyZSB0YWtlbgotICogY2FyZSBvZiBieSB0aGUgc3RhbmRhcmQgamNvbmZpZyBzeW1ib2xzLCBidXQgb24gcmVhbGx5IHdlaXJkIHN5c3RlbXMKLSAqIHlvdSBtYXkgaGF2ZSB0byBlZGl0IHRoaXMgZmlsZS4pCi0gKgotICogTk9URTogdGhpcyBmaWxlIGlzIE5PVCBpbnRlbmRlZCB0byBiZSBpbmNsdWRlZCBieSBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlCi0gKiBKUEVHIGxpYnJhcnkuICBNb3N0IGFwcGxpY2F0aW9ucyBuZWVkIG9ubHkgaW5jbHVkZSBqcGVnbGliLmguCi0gKi8KLQotCi0vKiBJbmNsdWRlIGF1dG8tY29uZmlnIGZpbGUgdG8gZmluZCBvdXQgd2hpY2ggc3lzdGVtIGluY2x1ZGUgZmlsZXMgd2UgbmVlZC4gKi8KLQotI2luY2x1ZGUgImpjb25maWcuaCIJCS8qIGF1dG8gY29uZmlndXJhdGlvbiBvcHRpb25zICovCi0jZGVmaW5lIEpDT05GSUdfSU5DTFVERUQJLyogc28gdGhhdCBqcGVnbGliLmggZG9lc24ndCBkbyBpdCBhZ2FpbiAqLwotCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaCIKLS8qCi0gKiBXZSBuZWVkIHRoZSBOVUxMIG1hY3JvIGFuZCBzaXplX3QgdHlwZWRlZi4KLSAqIE9uIGFuIEFOU0ktY29uZm9ybWluZyBzeXN0ZW0gaXQgaXMgc3VmZmljaWVudCB0byBpbmNsdWRlIDxzdGRkZWYuaD4uCi0gKiBPdGhlcndpc2UsIHdlIGdldCB0aGVtIGZyb20gPHN0ZGxpYi5oPiBvciA8c3RkaW8uaD47IHdlIG1heSBoYXZlIHRvCi0gKiBwdWxsIGluIDxzeXMvdHlwZXMuaD4gYXMgd2VsbC4KLSAqIE5vdGUgdGhhdCB0aGUgY29yZSBKUEVHIGxpYnJhcnkgZG9lcyBub3QgcmVxdWlyZSA8c3RkaW8uaD47Ci0gKiBvbmx5IHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsZXIgYW5kIGRhdGEgc291cmNlL2Rlc3RpbmF0aW9uIG1vZHVsZXMgZG8uCi0gKiBCdXQgd2UgbXVzdCBwdWxsIGl0IGluIGJlY2F1c2Ugb2YgdGhlIHJlZmVyZW5jZXMgdG8gRklMRSBpbiBqcGVnbGliLmguCi0gKiBZb3UgY2FuIHJlbW92ZSB0aG9zZSByZWZlcmVuY2VzIGlmIHlvdSB3YW50IHRvIGNvbXBpbGUgd2l0aG91dCA8c3RkaW8uaD4uCi0gKi8KLQotI2lmZGVmIF9ERUJVRwotI2RlZmluZSBDUlREQkdfTUFQX0FMTE9DCi0vLyNpbmNsdWRlIDxzdGRsaWIuaD4KLS8vI2luY2x1ZGUgPGNydGRiZy5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NURERFRl9ICi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLS8vI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZmRlZiBORUVEX1NZU19UWVBFU19ICi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBGQVIKLSNkZWZpbmUgRkFSCi0jZW5kaWYKLQotLy8jaW5jbHVkZSA8c3RkaW8uaD4KLQotLyoKLSAqIFdlIG5lZWQgbWVtb3J5IGNvcHlpbmcgYW5kIHplcm9pbmcgZnVuY3Rpb25zLCBwbHVzIHN0cm5jcHkoKS4KLSAqIEFOU0kgYW5kIFN5c3RlbSBWIGltcGxlbWVudGF0aW9ucyBkZWNsYXJlIHRoZXNlIGluIDxzdHJpbmcuaD4uCi0gKiBCU0QgZG9lc24ndCBoYXZlIHRoZSBtZW0oKSBmdW5jdGlvbnMsIGJ1dCBpdCBkb2VzIGhhdmUgYmNvcHkoKS9iemVybygpLgotICogU29tZSBzeXN0ZW1zIG1heSBkZWNsYXJlIG1lbXNldCBhbmQgbWVtY3B5IGluIDxtZW1vcnkuaD4uCi0gKgotICogTk9URTogd2UgYXNzdW1lIHRoZSBzaXplIHBhcmFtZXRlcnMgdG8gdGhlc2UgZnVuY3Rpb25zIGFyZSBvZiB0eXBlIHNpemVfdC4KLSAqIENoYW5nZSB0aGUgY2FzdHMgaW4gdGhlc2UgbWFjcm9zIGlmIG5vdCEKLSAqLwotCi0jaWZkZWYgTkVFRF9CU0RfU1RSSU5HUwotCi0vLyNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZGVmaW5lIE1FTVpFUk8odGFyZ2V0LHNpemUpCWJ6ZXJvKCh2b2lkICopKHRhcmdldCksIChzaXplX3QpKHNpemUpKQotI2RlZmluZSBNRU1DT1BZKGRlc3Qsc3JjLHNpemUpCWJjb3B5KChjb25zdCB2b2lkICopKHNyYyksICh2b2lkICopKGRlc3QpLCAoc2l6ZV90KShzaXplKSkKLQotI2Vsc2UgLyogbm90IEJTRCwgYXNzdW1lIEFOU0kvU3lzViBzdHJpbmcgbGliICovCi0KLS8vI2luY2x1ZGUgPHN0cmluZy5oPgotI2RlZmluZSBNRU1aRVJPKHRhcmdldCxzaXplKQlGWFNZU19tZW1zZXQzMigodm9pZCAqKSh0YXJnZXQpLCAwLCAoc2l6ZV90KShzaXplKSkKLSNkZWZpbmUgTUVNQ09QWShkZXN0LHNyYyxzaXplKQlGWFNZU19tZW1jcHkzMigodm9pZCAqKShkZXN0KSwgKGNvbnN0IHZvaWQgKikoc3JjKSwgKHNpemVfdCkoc2l6ZSkpCi0KLSNlbmRpZgotCi0vKgotICogSW4gQU5TSSBDLCBhbmQgaW5kZWVkIGFueSByYXRpb25hbCBpbXBsZW1lbnRhdGlvbiwgc2l6ZV90IGlzIGFsc28gdGhlCi0gKiB0eXBlIHJldHVybmVkIGJ5IHNpemVvZigpLiAgSG93ZXZlciwgaXQgc2VlbXMgdGhlcmUgYXJlIHNvbWUgaXJyYXRpb25hbAotICogaW1wbGVtZW50YXRpb25zIG91dCB0aGVyZSwgaW4gd2hpY2ggc2l6ZW9mKCkgcmV0dXJucyBhbiBpbnQgZXZlbiB0aG91Z2gKLSAqIHNpemVfdCBpcyBkZWZpbmVkIGFzIGxvbmcgb3IgdW5zaWduZWQgbG9uZy4gIFRvIGVuc3VyZSBjb25zaXN0ZW50IHJlc3VsdHMKLSAqIHdlIGFsd2F5cyB1c2UgdGhpcyBTSVpFT0YoKSBtYWNybyBpbiBwbGFjZSBvZiB1c2luZyBzaXplb2YoKSBkaXJlY3RseS4KLSAqLwotCi0jZGVmaW5lIFNJWkVPRihvYmplY3QpCSgoc2l6ZV90KSBzaXplb2Yob2JqZWN0KSkKLQotLyoKLSAqIFRoZSBtb2R1bGVzIHRoYXQgdXNlIGZyZWFkKCkgYW5kIGZ3cml0ZSgpIGFsd2F5cyBpbnZva2UgdGhlbSB0aHJvdWdoCi0gKiB0aGVzZSBtYWNyb3MuICBPbiBzb21lIHN5c3RlbXMgeW91IG1heSBuZWVkIHRvIHR3aWRkbGUgdGhlIGFyZ3VtZW50IGNhc3RzLgotICogQ0FVVElPTjogYXJndW1lbnQgb3JkZXIgaXMgZGlmZmVyZW50IGZyb20gdW5kZXJseWluZyBmdW5jdGlvbnMhCi0gKi8KLQotI2RlZmluZSBKRlJFQUQoZmlsZSxidWYsc2l6ZW9mYnVmKSAgXAotICAoKHNpemVfdCkgRlhTWVNfZnJlYWQoKHZvaWQgKikgKGJ1ZiksIChzaXplX3QpIDEsIChzaXplX3QpIChzaXplb2ZidWYpLCAoZmlsZSkpKQotI2RlZmluZSBKRldSSVRFKGZpbGUsYnVmLHNpemVvZmJ1ZikgIFwKLSAgKChzaXplX3QpIEZYU1lTX2Z3cml0ZSgoY29uc3Qgdm9pZCAqKSAoYnVmKSwgKHNpemVfdCkgMSwgKHNpemVfdCkgKHNpemVvZmJ1ZiksIChmaWxlKSkpCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvanBlZ2xpYi5oIGIvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2pwZWdsaWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RlNWFiNy4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvanBlZ2xpYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE2NSArMCwwIEBACi0vKgotICoganBlZ2xpYi5oCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgYXBwbGljYXRpb24gaW50ZXJmYWNlIGZvciB0aGUgSlBFRyBsaWJyYXJ5LgotICogTW9zdCBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxpYnJhcnkgbmVlZCBvbmx5IGluY2x1ZGUgdGhpcyBmaWxlLAotICogYW5kIHBlcmhhcHMgamVycm9yLmggaWYgdGhleSB3YW50IHRvIGtub3cgdGhlIGV4YWN0IGVycm9yIGNvZGVzLgotICovCi0KLSNpZm5kZWYgSlBFR0xJQl9ICi0jZGVmaW5lIEpQRUdMSUJfSAotCi0jZGVmaW5lIEZPWElUX1BSRUZJWChvcmlnTmFtZSkgIEZQREZBUElKUEVHXyMjb3JpZ05hbWUKLQotI2RlZmluZSBqY29weV9ibG9ja19yb3cgRk9YSVRfUFJFRklYKGpjb3B5X2Jsb2NrX3JvdykKLSNkZWZpbmUgamNvcHlfc2FtcGxlX3Jvd3MgRk9YSVRfUFJFRklYKGpjb3B5X3NhbXBsZV9yb3dzKQotI2RlZmluZSBqZGl2X3JvdW5kX3VwIEZPWElUX1BSRUZJWChqZGl2X3JvdW5kX3VwKQotI2RlZmluZSBqaW5pdF8xcGFzc19xdWFudGl6ZXIgRk9YSVRfUFJFRklYKGppbml0XzFwYXNzX3F1YW50aXplcikKLSNkZWZpbmUgamluaXRfMnBhc3NfcXVhbnRpemVyIEZPWElUX1BSRUZJWChqaW5pdF8ycGFzc19xdWFudGl6ZXIpCi0jZGVmaW5lIGppbml0X2NvbG9yX2RlY29udmVydGVyIEZPWElUX1BSRUZJWChqaW5pdF9jb2xvcl9kZWNvbnZlcnRlcikKLSNkZWZpbmUgamluaXRfZF9jb2VmX2NvbnRyb2xsZXIgRk9YSVRfUFJFRklYKGppbml0X2RfY29lZl9jb250cm9sbGVyKQotI2RlZmluZSBqaW5pdF9kX21haW5fY29udHJvbGxlciBGT1hJVF9QUkVGSVgoamluaXRfZF9tYWluX2NvbnRyb2xsZXIpCi0jZGVmaW5lIGppbml0X2RfcG9zdF9jb250cm9sbGVyIEZPWElUX1BSRUZJWChqaW5pdF9kX3Bvc3RfY29udHJvbGxlcikKLSNkZWZpbmUgamluaXRfaHVmZl9kZWNvZGVyIEZPWElUX1BSRUZJWChqaW5pdF9odWZmX2RlY29kZXIpCi0jZGVmaW5lIGppbml0X2lucHV0X2NvbnRyb2xsZXIgRk9YSVRfUFJFRklYKGppbml0X2lucHV0X2NvbnRyb2xsZXIpCi0jZGVmaW5lIGppbml0X2ludmVyc2VfZGN0IEZPWElUX1BSRUZJWChqaW5pdF9pbnZlcnNlX2RjdCkKLSNkZWZpbmUgamluaXRfbWFya2VyX3JlYWRlciBGT1hJVF9QUkVGSVgoamluaXRfbWFya2VyX3JlYWRlcikKLSNkZWZpbmUgamluaXRfbWFzdGVyX2RlY29tcHJlc3MgRk9YSVRfUFJFRklYKGppbml0X21hc3Rlcl9kZWNvbXByZXNzKQotI2RlZmluZSBqaW5pdF9tZW1vcnlfbWdyIEZPWElUX1BSRUZJWChqaW5pdF9tZW1vcnlfbWdyKQotI2RlZmluZSBqaW5pdF9tZXJnZWRfdXBzYW1wbGVyIEZPWElUX1BSRUZJWChqaW5pdF9tZXJnZWRfdXBzYW1wbGVyKQotI2RlZmluZSBqaW5pdF9waHVmZl9kZWNvZGVyIEZPWElUX1BSRUZJWChqaW5pdF9waHVmZl9kZWNvZGVyKQotI2RlZmluZSBqaW5pdF91cHNhbXBsZXIgRk9YSVRfUFJFRklYKGppbml0X3Vwc2FtcGxlcikKLSNkZWZpbmUganBlZ19DcmVhdGVEZWNvbXByZXNzIEZPWElUX1BSRUZJWChqcGVnX0NyZWF0ZURlY29tcHJlc3MpCi0jZGVmaW5lIGpwZWdfYWJvcnQgRk9YSVRfUFJFRklYKGpwZWdfYWJvcnQpCi0jZGVmaW5lIGpwZWdfYWJvcnRfZGVjb21wcmVzcyBGT1hJVF9QUkVGSVgoanBlZ19hYm9ydF9kZWNvbXByZXNzKQotI2RlZmluZSBqcGVnX2FsbG9jX2h1ZmZfdGFibGUgRk9YSVRfUFJFRklYKGpwZWdfYWxsb2NfaHVmZl90YWJsZSkKLSNkZWZpbmUganBlZ19hbGxvY19xdWFudF90YWJsZSBGT1hJVF9QUkVGSVgoanBlZ19hbGxvY19xdWFudF90YWJsZSkKLSNkZWZpbmUganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zIEZPWElUX1BSRUZJWChqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMpCi0jZGVmaW5lIGpwZWdfY29uc3VtZV9pbnB1dCBGT1hJVF9QUkVGSVgoanBlZ19jb25zdW1lX2lucHV0KQotI2RlZmluZSBqcGVnX2Rlc3Ryb3kgRk9YSVRfUFJFRklYKGpwZWdfZGVzdHJveSkKLSNkZWZpbmUganBlZ19kZXN0cm95X2RlY29tcHJlc3MgRk9YSVRfUFJFRklYKGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKQotI2RlZmluZSBqcGVnX2ZpbGxfYml0X2J1ZmZlciBGT1hJVF9QUkVGSVgoanBlZ19maWxsX2JpdF9idWZmZXIpCi0jZGVmaW5lIGpwZWdfZmluaXNoX2RlY29tcHJlc3MgRk9YSVRfUFJFRklYKGpwZWdfZmluaXNoX2RlY29tcHJlc3MpCi0jZGVmaW5lIGpwZWdfZmluaXNoX291dHB1dCBGT1hJVF9QUkVGSVgoanBlZ19maW5pc2hfb3V0cHV0KQotI2RlZmluZSBqcGVnX2ZyZWVfbGFyZ2UgRk9YSVRfUFJFRklYKGpwZWdfZnJlZV9sYXJnZSkKLSNkZWZpbmUganBlZ19mcmVlX3NtYWxsIEZPWElUX1BSRUZJWChqcGVnX2ZyZWVfc21hbGwpCi0jZGVmaW5lIGpwZWdfZ2V0X2xhcmdlIEZPWElUX1BSRUZJWChqcGVnX2dldF9sYXJnZSkKLSNkZWZpbmUganBlZ19nZXRfc21hbGwgRk9YSVRfUFJFRklYKGpwZWdfZ2V0X3NtYWxsKQotI2RlZmluZSBqcGVnX2hhc19tdWx0aXBsZV9zY2FucyBGT1hJVF9QUkVGSVgoanBlZ19oYXNfbXVsdGlwbGVfc2NhbnMpCi0jZGVmaW5lIGpwZWdfaHVmZl9kZWNvZGUgRk9YSVRfUFJFRklYKGpwZWdfaHVmZl9kZWNvZGUpCi0jZGVmaW5lIGpwZWdfaWRjdF8xeDEgRk9YSVRfUFJFRklYKGpwZWdfaWRjdF8xeDEpCi0jZGVmaW5lIGpwZWdfaWRjdF8yeDIgRk9YSVRfUFJFRklYKGpwZWdfaWRjdF8yeDIpCi0jZGVmaW5lIGpwZWdfaWRjdF80eDQgRk9YSVRfUFJFRklYKGpwZWdfaWRjdF80eDQpCi0jZGVmaW5lIGpwZWdfaWRjdF9mbG9hdCBGT1hJVF9QUkVGSVgoanBlZ19pZGN0X2Zsb2F0KQotI2RlZmluZSBqcGVnX2lkY3RfaWZhc3QgRk9YSVRfUFJFRklYKGpwZWdfaWRjdF9pZmFzdCkKLSNkZWZpbmUganBlZ19pZGN0X2lzbG93IEZPWElUX1BSRUZJWChqcGVnX2lkY3RfaXNsb3cpCi0jZGVmaW5lIGpwZWdfaW5wdXRfY29tcGxldGUgRk9YSVRfUFJFRklYKGpwZWdfaW5wdXRfY29tcGxldGUpCi0jZGVmaW5lIGpwZWdfbWFrZV9kX2Rlcml2ZWRfdGJsIEZPWElUX1BSRUZJWChqcGVnX21ha2VfZF9kZXJpdmVkX3RibCkKLSNkZWZpbmUganBlZ19tZW1fYXZhaWxhYmxlIEZPWElUX1BSRUZJWChqcGVnX21lbV9hdmFpbGFibGUpCi0jZGVmaW5lIGpwZWdfbWVtX2luaXQgRk9YSVRfUFJFRklYKGpwZWdfbWVtX2luaXQpCi0jZGVmaW5lIGpwZWdfbWVtX3Rlcm0gRk9YSVRfUFJFRklYKGpwZWdfbWVtX3Rlcm0pCi0jZGVmaW5lIGpwZWdfbmF0dXJhbF9vcmRlciBGT1hJVF9QUkVGSVgoanBlZ19uYXR1cmFsX29yZGVyKQotI2RlZmluZSBqcGVnX25ld19jb2xvcm1hcCBGT1hJVF9QUkVGSVgoanBlZ19uZXdfY29sb3JtYXApCi0jZGVmaW5lIGpwZWdfb3Blbl9iYWNraW5nX3N0b3JlIEZPWElUX1BSRUZJWChqcGVnX29wZW5fYmFja2luZ19zdG9yZSkKLSNkZWZpbmUganBlZ19yZWFkX2NvZWZmaWNpZW50cyBGT1hJVF9QUkVGSVgoanBlZ19yZWFkX2NvZWZmaWNpZW50cykKLSNkZWZpbmUganBlZ19yZWFkX2hlYWRlciBGT1hJVF9QUkVGSVgoanBlZ19yZWFkX2hlYWRlcikKLSNkZWZpbmUganBlZ19yZWFkX3Jhd19kYXRhIEZPWElUX1BSRUZJWChqcGVnX3JlYWRfcmF3X2RhdGEpCi0jZGVmaW5lIGpwZWdfcmVhZF9zY2FubGluZXMgRk9YSVRfUFJFRklYKGpwZWdfcmVhZF9zY2FubGluZXMpCi0jZGVmaW5lIGpwZWdfcmVzeW5jX3RvX3Jlc3RhcnQgRk9YSVRfUFJFRklYKGpwZWdfcmVzeW5jX3RvX3Jlc3RhcnQpCi0jZGVmaW5lIGpwZWdfc2F2ZV9tYXJrZXJzIEZPWElUX1BSRUZJWChqcGVnX3NhdmVfbWFya2VycykKLSNkZWZpbmUganBlZ19zZXRfbWFya2VyX3Byb2Nlc3NvciBGT1hJVF9QUkVGSVgoanBlZ19zZXRfbWFya2VyX3Byb2Nlc3NvcikKLSNkZWZpbmUganBlZ19zdGFydF9kZWNvbXByZXNzIEZPWElUX1BSRUZJWChqcGVnX3N0YXJ0X2RlY29tcHJlc3MpCi0jZGVmaW5lIGpwZWdfc3RhcnRfb3V0cHV0IEZPWElUX1BSRUZJWChqcGVnX3N0YXJ0X291dHB1dCkKLSNkZWZpbmUganBlZ19zdGRfZXJyb3IgRk9YSVRfUFJFRklYKGpwZWdfc3RkX2Vycm9yKQotI2RlZmluZSBqcGVnX3N0ZF9tZXNzYWdlX3RhYmxlIEZPWElUX1BSRUZJWChqcGVnX3N0ZF9tZXNzYWdlX3RhYmxlKQotI2RlZmluZSBqcGVnX3N0ZGlvX3NyYyBGT1hJVF9QUkVGSVgoanBlZ19zdGRpb19zcmMpCi0jZGVmaW5lIGpyb3VuZF91cCBGT1hJVF9QUkVGSVgoanJvdW5kX3VwKQotI2RlZmluZSBqemVyb19mYXIgRk9YSVRfUFJFRklYKGp6ZXJvX2ZhcikKLQotIC8qCi0gKiBGaXJzdCB3ZSBpbmNsdWRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIHRoYXQgcmVjb3JkIGhvdyB0aGlzCi0gKiBpbnN0YWxsYXRpb24gb2YgdGhlIEpQRUcgbGlicmFyeSBpcyBzZXQgdXAuICBqY29uZmlnLmggY2FuIGJlCi0gKiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmb3IgbWFueSBzeXN0ZW1zLiAgam1vcmVjZmcuaCBjb250YWlucwotICogbWFudWFsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IG1vc3QgcGVvcGxlIG5lZWQgbm90IHdvcnJ5IGFib3V0LgotICovCi0KLSNpZm5kZWYgSkNPTkZJR19JTkNMVURFRAkvKiBpbiBjYXNlIGppbmNsdWRlLmggYWxyZWFkeSBkaWQgKi8KLSNpbmNsdWRlICJqY29uZmlnLmgiCQkvKiB3aWRlbHkgdXNlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KLSNlbmRpZgotI2luY2x1ZGUgImptb3JlY2ZnLmgiCQkvKiBzZWxkb20gY2hhbmdlZCBvcHRpb25zICovCi0KLQotLyogVmVyc2lvbiBJRCBmb3IgdGhlIEpQRUcgbGlicmFyeS4KLSAqIE1pZ2h0IGJlIHVzZWZ1bCBmb3IgdGVzdHMgbGlrZSAiI2lmIEpQRUdfTElCX1ZFUlNJT04gPj0gNjAiLgotICovCi0KLSNkZWZpbmUgSlBFR19MSUJfVkVSU0lPTiAgNjIJLyogVmVyc2lvbiA2YiAqLwotCi0KLS8qIFZhcmlvdXMgY29uc3RhbnRzIGRldGVybWluaW5nIHRoZSBzaXplcyBvZiB0aGluZ3MuCi0gKiBBbGwgb2YgdGhlc2UgYXJlIHNwZWNpZmllZCBieSB0aGUgSlBFRyBzdGFuZGFyZCwgc28gZG9uJ3QgY2hhbmdlIHRoZW0KLSAqIGlmIHlvdSB3YW50IHRvIGJlIGNvbXBhdGlibGUuCi0gKi8KLQotI2RlZmluZSBEQ1RTSVpFCQkgICAgOAkvKiBUaGUgYmFzaWMgRENUIGJsb2NrIGlzIDh4OCBzYW1wbGVzICovCi0jZGVmaW5lIERDVFNJWkUyCSAgICA2NAkvKiBEQ1RTSVpFIHNxdWFyZWQ7ICMgb2YgZWxlbWVudHMgaW4gYSBibG9jayAqLwotI2RlZmluZSBOVU1fUVVBTlRfVEJMUyAgICAgIDQJLyogUXVhbnRpemF0aW9uIHRhYmxlcyBhcmUgbnVtYmVyZWQgMC4uMyAqLwotI2RlZmluZSBOVU1fSFVGRl9UQkxTICAgICAgIDQJLyogSHVmZm1hbiB0YWJsZXMgYXJlIG51bWJlcmVkIDAuLjMgKi8KLSNkZWZpbmUgTlVNX0FSSVRIX1RCTFMgICAgICAxNgkvKiBBcml0aC1jb2RpbmcgdGFibGVzIGFyZSBudW1iZXJlZCAwLi4xNSAqLwotI2RlZmluZSBNQVhfQ09NUFNfSU5fU0NBTiAgIDQJLyogSlBFRyBsaW1pdCBvbiAjIG9mIGNvbXBvbmVudHMgaW4gb25lIHNjYW4gKi8KLSNkZWZpbmUgTUFYX1NBTVBfRkFDVE9SICAgICA0CS8qIEpQRUcgbGltaXQgb24gc2FtcGxpbmcgZmFjdG9ycyAqLwotLyogVW5mb3J0dW5hdGVseSwgc29tZSBib3pvIGF0IEFkb2JlIHNhdyBubyByZWFzb24gdG8gYmUgYm91bmQgYnkgdGhlIHN0YW5kYXJkOwotICogdGhlIFBvc3RTY3JpcHQgRENUIGZpbHRlciBjYW4gZW1pdCBmaWxlcyB3aXRoIG1hbnkgbW9yZSB0aGFuIDEwIGJsb2Nrcy9NQ1UuCi0gKiBJZiB5b3UgaGFwcGVuIHRvIHJ1biBhY3Jvc3Mgc3VjaCBhIGZpbGUsIHlvdSBjYW4gdXAgRF9NQVhfQkxPQ0tTX0lOX01DVQotICogdG8gaGFuZGxlIGl0LiAgV2UgZXZlbiBsZXQgeW91IGRvIHRoaXMgZnJvbSB0aGUgamNvbmZpZy5oIGZpbGUuICBIb3dldmVyLAotICogd2Ugc3Ryb25nbHkgZGlzY291cmFnZSBjaGFuZ2luZyBDX01BWF9CTE9DS1NfSU5fTUNVOyBqdXN0IGJlY2F1c2UgQWRvYmUKLSAqIHNvbWV0aW1lcyBlbWl0cyBub25jb21wbGlhbnQgZmlsZXMgZG9lc24ndCBtZWFuIHlvdSBzaG91bGQgdG9vLgotICovCi0jZGVmaW5lIENfTUFYX0JMT0NLU19JTl9NQ1UgICAxMCAvKiBjb21wcmVzc29yJ3MgbGltaXQgb24gYmxvY2tzIHBlciBNQ1UgKi8KLSNpZm5kZWYgRF9NQVhfQkxPQ0tTX0lOX01DVQotI2RlZmluZSBEX01BWF9CTE9DS1NfSU5fTUNVICAgMTAgLyogZGVjb21wcmVzc29yJ3MgbGltaXQgb24gYmxvY2tzIHBlciBNQ1UgKi8KLSNlbmRpZgotCi0KLS8qIERhdGEgc3RydWN0dXJlcyBmb3IgaW1hZ2VzIChhcnJheXMgb2Ygc2FtcGxlcyBhbmQgb2YgRENUIGNvZWZmaWNpZW50cykuCi0gKiBPbiA4MHg4NiBtYWNoaW5lcywgdGhlIGltYWdlIGFycmF5cyBhcmUgdG9vIGJpZyBmb3IgbmVhciBwb2ludGVycywKLSAqIGJ1dCB0aGUgcG9pbnRlciBhcnJheXMgY2FuIGZpdCBpbiBuZWFyIG1lbW9yeS4KLSAqLwotCi10eXBlZGVmIEpTQU1QTEUgICpKU0FNUFJPVzsJLyogcHRyIHRvIG9uZSBpbWFnZSByb3cgb2YgcGl4ZWwgc2FtcGxlcy4gKi8KLXR5cGVkZWYgSlNBTVBST1cgKkpTQU1QQVJSQVk7CS8qIHB0ciB0byBzb21lIHJvd3MgKGEgMi1EIHNhbXBsZSBhcnJheSkgKi8KLXR5cGVkZWYgSlNBTVBBUlJBWSAqSlNBTVBJTUFHRTsJLyogYSAzLUQgc2FtcGxlIGFycmF5OiB0b3AgaW5kZXggaXMgY29sb3IgKi8KLQotdHlwZWRlZiBKQ09FRiBKQkxPQ0tbRENUU0laRTJdOwkvKiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzICovCi10eXBlZGVmIEpCTE9DSyAgKkpCTE9DS1JPVzsJLyogcG9pbnRlciB0byBvbmUgcm93IG9mIGNvZWZmaWNpZW50IGJsb2NrcyAqLwotdHlwZWRlZiBKQkxPQ0tST1cgKkpCTE9DS0FSUkFZOwkJLyogYSAyLUQgYXJyYXkgb2YgY29lZmZpY2llbnQgYmxvY2tzICovCi10eXBlZGVmIEpCTE9DS0FSUkFZICpKQkxPQ0tJTUFHRTsJLyogYSAzLUQgYXJyYXkgb2YgY29lZmZpY2llbnQgYmxvY2tzICovCi0KLXR5cGVkZWYgSkNPRUYgICpKQ09FRlBUUjsJLyogdXNlZnVsIGluIGEgY291cGxlIG9mIHBsYWNlcyAqLwotCi0KLS8qIFR5cGVzIGZvciBKUEVHIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYW5kIHdvcmtpbmcgdGFibGVzLiAqLwotCi0KLS8qIERDVCBjb2VmZmljaWVudCBxdWFudGl6YXRpb24gdGFibGVzLiAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qIFRoaXMgYXJyYXkgZ2l2ZXMgdGhlIGNvZWZmaWNpZW50IHF1YW50aXplcnMgaW4gbmF0dXJhbCBhcnJheSBvcmRlcgotICAgKiAobm90IHRoZSB6aWd6YWcgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgc3RvcmVkIGluIGEgSlBFRyBEUVQgbWFya2VyKS4KLSAgICogQ0FVVElPTjogSUpHIHZlcnNpb25zIHByaW9yIHRvIHY2YSBrZXB0IHRoaXMgYXJyYXkgaW4gemlnemFnIG9yZGVyLgotICAgKi8KLSAgVUlOVDE2IHF1YW50dmFsW0RDVFNJWkUyXTsJLyogcXVhbnRpemF0aW9uIHN0ZXAgZm9yIGVhY2ggY29lZmZpY2llbnQgKi8KLSAgLyogVGhpcyBmaWVsZCBpcyB1c2VkIG9ubHkgZHVyaW5nIGNvbXByZXNzaW9uLiAgSXQncyBpbml0aWFsaXplZCBGQUxTRSB3aGVuCi0gICAqIHRoZSB0YWJsZSBpcyBjcmVhdGVkLCBhbmQgc2V0IFRSVUUgd2hlbiBpdCdzIGJlZW4gb3V0cHV0IHRvIHRoZSBmaWxlLgotICAgKiBZb3UgY291bGQgc3VwcHJlc3Mgb3V0cHV0IG9mIGEgdGFibGUgYnkgc2V0dGluZyB0aGlzIHRvIFRSVUUuCi0gICAqIChTZWUganBlZ19zdXBwcmVzc190YWJsZXMgZm9yIGFuIGV4YW1wbGUuKQotICAgKi8KLSAgYm9vbGVhbiBzZW50X3RhYmxlOwkJLyogVFJVRSB3aGVuIHRhYmxlIGhhcyBiZWVuIG91dHB1dCAqLwotfSBKUVVBTlRfVEJMOwotCi0KLS8qIEh1ZmZtYW4gY29kaW5nIHRhYmxlcy4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBUaGVzZSB0d28gZmllbGRzIGRpcmVjdGx5IHJlcHJlc2VudCB0aGUgY29udGVudHMgb2YgYSBKUEVHIERIVCBtYXJrZXIgKi8KLSAgVUlOVDggYml0c1sxN107CQkvKiBiaXRzW2tdID0gIyBvZiBzeW1ib2xzIHdpdGggY29kZXMgb2YgKi8KLQkJCQkvKiBsZW5ndGggayBiaXRzOyBiaXRzWzBdIGlzIHVudXNlZCAqLwotICBVSU5UOCBodWZmdmFsWzI1Nl07CQkvKiBUaGUgc3ltYm9scywgaW4gb3JkZXIgb2YgaW5jciBjb2RlIGxlbmd0aCAqLwotICAvKiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBkdXJpbmcgY29tcHJlc3Npb24uICBJdCdzIGluaXRpYWxpemVkIEZBTFNFIHdoZW4KLSAgICogdGhlIHRhYmxlIGlzIGNyZWF0ZWQsIGFuZCBzZXQgVFJVRSB3aGVuIGl0J3MgYmVlbiBvdXRwdXQgdG8gdGhlIGZpbGUuCi0gICAqIFlvdSBjb3VsZCBzdXBwcmVzcyBvdXRwdXQgb2YgYSB0YWJsZSBieSBzZXR0aW5nIHRoaXMgdG8gVFJVRS4KLSAgICogKFNlZSBqcGVnX3N1cHByZXNzX3RhYmxlcyBmb3IgYW4gZXhhbXBsZS4pCi0gICAqLwotICBib29sZWFuIHNlbnRfdGFibGU7CQkvKiBUUlVFIHdoZW4gdGFibGUgaGFzIGJlZW4gb3V0cHV0ICovCi19IEpIVUZGX1RCTDsKLQotCi0vKiBCYXNpYyBpbmZvIGFib3V0IG9uZSBjb21wb25lbnQgKGNvbG9yIGNoYW5uZWwpLiAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qIFRoZXNlIHZhbHVlcyBhcmUgZml4ZWQgb3ZlciB0aGUgd2hvbGUgaW1hZ2UuICovCi0gIC8qIEZvciBjb21wcmVzc2lvbiwgdGhleSBtdXN0IGJlIHN1cHBsaWVkIGJ5IHBhcmFtZXRlciBzZXR1cDsgKi8KLSAgLyogZm9yIGRlY29tcHJlc3Npb24sIHRoZXkgYXJlIHJlYWQgZnJvbSB0aGUgU09GIG1hcmtlci4gKi8KLSAgaW50IGNvbXBvbmVudF9pZDsJCS8qIGlkZW50aWZpZXIgZm9yIHRoaXMgY29tcG9uZW50ICgwLi4yNTUpICovCi0gIGludCBjb21wb25lbnRfaW5kZXg7CQkvKiBpdHMgaW5kZXggaW4gU09GIG9yIGNpbmZvLT5jb21wX2luZm9bXSAqLwotICBpbnQgaF9zYW1wX2ZhY3RvcjsJCS8qIGhvcml6b250YWwgc2FtcGxpbmcgZmFjdG9yICgxLi40KSAqLwotICBpbnQgdl9zYW1wX2ZhY3RvcjsJCS8qIHZlcnRpY2FsIHNhbXBsaW5nIGZhY3RvciAoMS4uNCkgKi8KLSAgaW50IHF1YW50X3RibF9ubzsJCS8qIHF1YW50aXphdGlvbiB0YWJsZSBzZWxlY3RvciAoMC4uMykgKi8KLSAgLyogVGhlc2UgdmFsdWVzIG1heSB2YXJ5IGJldHdlZW4gc2NhbnMuICovCi0gIC8qIEZvciBjb21wcmVzc2lvbiwgdGhleSBtdXN0IGJlIHN1cHBsaWVkIGJ5IHBhcmFtZXRlciBzZXR1cDsgKi8KLSAgLyogZm9yIGRlY29tcHJlc3Npb24sIHRoZXkgYXJlIHJlYWQgZnJvbSB0aGUgU09TIG1hcmtlci4gKi8KLSAgLyogVGhlIGRlY29tcHJlc3NvciBvdXRwdXQgc2lkZSBtYXkgbm90IHVzZSB0aGVzZSB2YXJpYWJsZXMuICovCi0gIGludCBkY190Ymxfbm87CQkvKiBEQyBlbnRyb3B5IHRhYmxlIHNlbGVjdG9yICgwLi4zKSAqLwotICBpbnQgYWNfdGJsX25vOwkJLyogQUMgZW50cm9weSB0YWJsZSBzZWxlY3RvciAoMC4uMykgKi8KLSAgCi0gIC8qIFJlbWFpbmluZyBmaWVsZHMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgcHJpdmF0ZSBieSBhcHBsaWNhdGlvbnMuICovCi0gIAotICAvKiBUaGVzZSB2YWx1ZXMgYXJlIGNvbXB1dGVkIGR1cmluZyBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIHN0YXJ0dXA6ICovCi0gIC8qIENvbXBvbmVudCdzIHNpemUgaW4gRENUIGJsb2Nrcy4KLSAgICogQW55IGR1bW15IGJsb2NrcyBhZGRlZCB0byBjb21wbGV0ZSBhbiBNQ1UgYXJlIG5vdCBjb3VudGVkOyB0aGVyZWZvcmUKLSAgICogdGhlc2UgdmFsdWVzIGRvIG5vdCBkZXBlbmQgb24gd2hldGhlciBhIHNjYW4gaXMgaW50ZXJsZWF2ZWQgb3Igbm90LgotICAgKi8KLSAgSkRJTUVOU0lPTiB3aWR0aF9pbl9ibG9ja3M7Ci0gIEpESU1FTlNJT04gaGVpZ2h0X2luX2Jsb2NrczsKLSAgLyogU2l6ZSBvZiBhIERDVCBibG9jayBpbiBzYW1wbGVzLiAgQWx3YXlzIERDVFNJWkUgZm9yIGNvbXByZXNzaW9uLgotICAgKiBGb3IgZGVjb21wcmVzc2lvbiB0aGlzIGlzIHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgZnJvbSBvbmUgRENUIGJsb2NrLAotICAgKiByZWZsZWN0aW5nIGFueSBzY2FsaW5nIHdlIGNob29zZSB0byBhcHBseSBkdXJpbmcgdGhlIElEQ1Qgc3RlcC4KLSAgICogVmFsdWVzIG9mIDEsMiw0LDggYXJlIGxpa2VseSB0byBiZSBzdXBwb3J0ZWQuICBOb3RlIHRoYXQgZGlmZmVyZW50Ci0gICAqIGNvbXBvbmVudHMgbWF5IHJlY2VpdmUgZGlmZmVyZW50IElEQ1Qgc2NhbGluZ3MuCi0gICAqLwotICBpbnQgRENUX3NjYWxlZF9zaXplOwotICAvKiBUaGUgZG93bnNhbXBsZWQgZGltZW5zaW9ucyBhcmUgdGhlIGNvbXBvbmVudCdzIGFjdHVhbCwgdW5wYWRkZWQgbnVtYmVyCi0gICAqIG9mIHNhbXBsZXMgYXQgdGhlIG1haW4gYnVmZmVyIChwcmVwcm9jZXNzaW5nL2NvbXByZXNzaW9uIGludGVyZmFjZSksIHRodXMKLSAgICogZG93bnNhbXBsZWRfd2lkdGggPSBjZWlsKGltYWdlX3dpZHRoICogSGkvSG1heCkKLSAgICogYW5kIHNpbWlsYXJseSBmb3IgaGVpZ2h0LiAgRm9yIGRlY29tcHJlc3Npb24sIElEQ1Qgc2NhbGluZyBpcyBpbmNsdWRlZCwgc28KLSAgICogZG93bnNhbXBsZWRfd2lkdGggPSBjZWlsKGltYWdlX3dpZHRoICogSGkvSG1heCAqIERDVF9zY2FsZWRfc2l6ZS9EQ1RTSVpFKQotICAgKi8KLSAgSkRJTUVOU0lPTiBkb3duc2FtcGxlZF93aWR0aDsJIC8qIGFjdHVhbCB3aWR0aCBpbiBzYW1wbGVzICovCi0gIEpESU1FTlNJT04gZG93bnNhbXBsZWRfaGVpZ2h0OyAvKiBhY3R1YWwgaGVpZ2h0IGluIHNhbXBsZXMgKi8KLSAgLyogVGhpcyBmbGFnIGlzIHVzZWQgb25seSBmb3IgZGVjb21wcmVzc2lvbi4gIEluIGNhc2VzIHdoZXJlIHNvbWUgb2YgdGhlCi0gICAqIGNvbXBvbmVudHMgd2lsbCBiZSBpZ25vcmVkIChlZyBncmF5c2NhbGUgb3V0cHV0IGZyb20gWUNiQ3IgaW1hZ2UpLAotICAgKiB3ZSBjYW4gc2tpcCBtb3N0IGNvbXB1dGF0aW9ucyBmb3IgdGhlIHVudXNlZCBjb21wb25lbnRzLgotICAgKi8KLSAgYm9vbGVhbiBjb21wb25lbnRfbmVlZGVkOwkvKiBkbyB3ZSBuZWVkIHRoZSB2YWx1ZSBvZiB0aGlzIGNvbXBvbmVudD8gKi8KLQotICAvKiBUaGVzZSB2YWx1ZXMgYXJlIGNvbXB1dGVkIGJlZm9yZSBzdGFydGluZyBhIHNjYW4gb2YgdGhlIGNvbXBvbmVudC4gKi8KLSAgLyogVGhlIGRlY29tcHJlc3NvciBvdXRwdXQgc2lkZSBtYXkgbm90IHVzZSB0aGVzZSB2YXJpYWJsZXMuICovCi0gIGludCBNQ1Vfd2lkdGg7CQkvKiBudW1iZXIgb2YgYmxvY2tzIHBlciBNQ1UsIGhvcml6b250YWxseSAqLwotICBpbnQgTUNVX2hlaWdodDsJCS8qIG51bWJlciBvZiBibG9ja3MgcGVyIE1DVSwgdmVydGljYWxseSAqLwotICBpbnQgTUNVX2Jsb2NrczsJCS8qIE1DVV93aWR0aCAqIE1DVV9oZWlnaHQgKi8KLSAgaW50IE1DVV9zYW1wbGVfd2lkdGg7CQkvKiBNQ1Ugd2lkdGggaW4gc2FtcGxlcywgTUNVX3dpZHRoKkRDVF9zY2FsZWRfc2l6ZSAqLwotICBpbnQgbGFzdF9jb2xfd2lkdGg7CQkvKiAjIG9mIG5vbi1kdW1teSBibG9ja3MgYWNyb3NzIGluIGxhc3QgTUNVICovCi0gIGludCBsYXN0X3Jvd19oZWlnaHQ7CQkvKiAjIG9mIG5vbi1kdW1teSBibG9ja3MgZG93biBpbiBsYXN0IE1DVSAqLwotCi0gIC8qIFNhdmVkIHF1YW50aXphdGlvbiB0YWJsZSBmb3IgY29tcG9uZW50OyBOVUxMIGlmIG5vbmUgeWV0IHNhdmVkLgotICAgKiBTZWUgamRpbnB1dC5jIGNvbW1lbnRzIGFib3V0IHRoZSBuZWVkIGZvciB0aGlzIGluZm9ybWF0aW9uLgotICAgKiBUaGlzIGZpZWxkIGlzIGN1cnJlbnRseSB1c2VkIG9ubHkgZm9yIGRlY29tcHJlc3Npb24uCi0gICAqLwotICBKUVVBTlRfVEJMICogcXVhbnRfdGFibGU7Ci0KLSAgLyogUHJpdmF0ZSBwZXItY29tcG9uZW50IHN0b3JhZ2UgZm9yIERDVCBvciBJRENUIHN1YnN5c3RlbS4gKi8KLSAgdm9pZCAqIGRjdF90YWJsZTsKLX0ganBlZ19jb21wb25lbnRfaW5mbzsKLQotCi0vKiBUaGUgc2NyaXB0IGZvciBlbmNvZGluZyBhIG11bHRpcGxlLXNjYW4gZmlsZSBpcyBhbiBhcnJheSBvZiB0aGVzZTogKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBpbnQgY29tcHNfaW5fc2NhbjsJCS8qIG51bWJlciBvZiBjb21wb25lbnRzIGVuY29kZWQgaW4gdGhpcyBzY2FuICovCi0gIGludCBjb21wb25lbnRfaW5kZXhbTUFYX0NPTVBTX0lOX1NDQU5dOyAvKiB0aGVpciBTT0YvY29tcF9pbmZvW10gaW5kZXhlcyAqLwotICBpbnQgU3MsIFNlOwkJCS8qIHByb2dyZXNzaXZlIEpQRUcgc3BlY3RyYWwgc2VsZWN0aW9uIHBhcm1zICovCi0gIGludCBBaCwgQWw7CQkJLyogcHJvZ3Jlc3NpdmUgSlBFRyBzdWNjZXNzaXZlIGFwcHJveC4gcGFybXMgKi8KLX0ganBlZ19zY2FuX2luZm87Ci0KLS8qIFRoZSBkZWNvbXByZXNzb3IgY2FuIHNhdmUgQVBQbiBhbmQgQ09NIG1hcmtlcnMgaW4gYSBsaXN0IG9mIHRoZXNlOiAqLwotCi10eXBlZGVmIHN0cnVjdCBqcGVnX21hcmtlcl9zdHJ1Y3QgICoganBlZ19zYXZlZF9tYXJrZXJfcHRyOwotCi1zdHJ1Y3QganBlZ19tYXJrZXJfc3RydWN0IHsKLSAganBlZ19zYXZlZF9tYXJrZXJfcHRyIG5leHQ7CS8qIG5leHQgaW4gbGlzdCwgb3IgTlVMTCAqLwotICBVSU5UOCBtYXJrZXI7CQkJLyogbWFya2VyIGNvZGU6IEpQRUdfQ09NLCBvciBKUEVHX0FQUDArbiAqLwotICB1bnNpZ25lZCBpbnQgb3JpZ2luYWxfbGVuZ3RoOwkvKiAjIGJ5dGVzIG9mIGRhdGEgaW4gdGhlIGZpbGUgKi8KLSAgdW5zaWduZWQgaW50IGRhdGFfbGVuZ3RoOwkvKiAjIGJ5dGVzIG9mIGRhdGEgc2F2ZWQgYXQgZGF0YVtdICovCi0gIEpPQ1RFVCAgKiBkYXRhOwkJLyogdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBtYXJrZXIgKi8KLSAgLyogdGhlIG1hcmtlciBsZW5ndGggd29yZCBpcyBub3QgY291bnRlZCBpbiBkYXRhX2xlbmd0aCBvciBvcmlnaW5hbF9sZW5ndGggKi8KLX07Ci0KLS8qIEtub3duIGNvbG9yIHNwYWNlcy4gKi8KLQotdHlwZWRlZiBlbnVtIHsKLQlKQ1NfVU5LTk9XTiwJCS8qIGVycm9yL3Vuc3BlY2lmaWVkICovCi0JSkNTX0dSQVlTQ0FMRSwJCS8qIG1vbm9jaHJvbWUgKi8KLQlKQ1NfUkdCLAkJLyogcmVkL2dyZWVuL2JsdWUgKi8KLQlKQ1NfWUNiQ3IsCQkvKiBZL0NiL0NyIChhbHNvIGtub3duIGFzIFlVVikgKi8KLQlKQ1NfQ01ZSywJCS8qIEMvTS9ZL0sgKi8KLQlKQ1NfWUNDSwkJLyogWS9DYi9Dci9LICovCi19IEpfQ09MT1JfU1BBQ0U7Ci0KLS8qIERDVC9JRENUIGFsZ29yaXRobSBvcHRpb25zLiAqLwotCi10eXBlZGVmIGVudW0gewotCUpEQ1RfSVNMT1csCQkvKiBzbG93IGJ1dCBhY2N1cmF0ZSBpbnRlZ2VyIGFsZ29yaXRobSAqLwotCUpEQ1RfSUZBU1QsCQkvKiBmYXN0ZXIsIGxlc3MgYWNjdXJhdGUgaW50ZWdlciBtZXRob2QgKi8KLQlKRENUX0ZMT0FUCQkvKiBmbG9hdGluZy1wb2ludDogYWNjdXJhdGUsIGZhc3Qgb24gZmFzdCBIVyAqLwotfSBKX0RDVF9NRVRIT0Q7Ci0KLSNpZm5kZWYgSkRDVF9ERUZBVUxUCQkvKiBtYXkgYmUgb3ZlcnJpZGRlbiBpbiBqY29uZmlnLmggKi8KLSNkZWZpbmUgSkRDVF9ERUZBVUxUICBKRENUX0lTTE9XCi0jZW5kaWYKLSNpZm5kZWYgSkRDVF9GQVNURVNUCQkvKiBtYXkgYmUgb3ZlcnJpZGRlbiBpbiBqY29uZmlnLmggKi8KLSNkZWZpbmUgSkRDVF9GQVNURVNUICBKRENUX0lGQVNUCi0jZW5kaWYKLQotLyogRGl0aGVyaW5nIG9wdGlvbnMgZm9yIGRlY29tcHJlc3Npb24uICovCi0KLXR5cGVkZWYgZW51bSB7Ci0JSkRJVEhFUl9OT05FLAkJLyogbm8gZGl0aGVyaW5nICovCi0JSkRJVEhFUl9PUkRFUkVELAkvKiBzaW1wbGUgb3JkZXJlZCBkaXRoZXIgKi8KLQlKRElUSEVSX0ZTCQkvKiBGbG95ZC1TdGVpbmJlcmcgZXJyb3IgZGlmZnVzaW9uIGRpdGhlciAqLwotfSBKX0RJVEhFUl9NT0RFOwotCi0KLS8qIENvbW1vbiBmaWVsZHMgYmV0d2VlbiBKUEVHIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIG1hc3RlciBzdHJ1Y3RzLiAqLwotCi0jZGVmaW5lIGpwZWdfY29tbW9uX2ZpZWxkcyBcCi0gIHN0cnVjdCBqcGVnX2Vycm9yX21nciAqIGVycjsJLyogRXJyb3IgaGFuZGxlciBtb2R1bGUgKi9cCi0gIHN0cnVjdCBqcGVnX21lbW9yeV9tZ3IgKiBtZW07CS8qIE1lbW9yeSBtYW5hZ2VyIG1vZHVsZSAqL1wKLSAgc3RydWN0IGpwZWdfcHJvZ3Jlc3NfbWdyICogcHJvZ3Jlc3M7IC8qIFByb2dyZXNzIG1vbml0b3IsIG9yIE5VTEwgaWYgbm9uZSAqL1wKLSAgdm9pZCAqIGNsaWVudF9kYXRhOwkJLyogQXZhaWxhYmxlIGZvciB1c2UgYnkgYXBwbGljYXRpb24gKi9cCi0gIGJvb2xlYW4gaXNfZGVjb21wcmVzc29yOwkvKiBTbyBjb21tb24gY29kZSBjYW4gdGVsbCB3aGljaCBpcyB3aGljaCAqL1wKLSAgaW50IGdsb2JhbF9zdGF0ZQkJLyogRm9yIGNoZWNraW5nIGNhbGwgc2VxdWVuY2UgdmFsaWRpdHkgKi8KLQotLyogUm91dGluZXMgdGhhdCBhcmUgdG8gYmUgdXNlZCBieSBib3RoIGhhbHZlcyBvZiB0aGUgbGlicmFyeSBhcmUgZGVjbGFyZWQKLSAqIHRvIHJlY2VpdmUgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlLiAgVGhlcmUgYXJlIG5vIGFjdHVhbCBpbnN0YW5jZXMgb2YKLSAqIGpwZWdfY29tbW9uX3N0cnVjdCwgb25seSBvZiBqcGVnX2NvbXByZXNzX3N0cnVjdCBhbmQganBlZ19kZWNvbXByZXNzX3N0cnVjdC4KLSAqLwotc3RydWN0IGpwZWdfY29tbW9uX3N0cnVjdCB7Ci0gIGpwZWdfY29tbW9uX2ZpZWxkczsJCS8qIEZpZWxkcyBjb21tb24gdG8gYm90aCBtYXN0ZXIgc3RydWN0IHR5cGVzICovCi0gIC8qIEFkZGl0aW9uYWwgZmllbGRzIGZvbGxvdyBpbiBhbiBhY3R1YWwganBlZ19jb21wcmVzc19zdHJ1Y3Qgb3IKLSAgICoganBlZ19kZWNvbXByZXNzX3N0cnVjdC4gIEFsbCB0aHJlZSBzdHJ1Y3RzIG11c3QgYWdyZWUgb24gdGhlc2UKLSAgICogaW5pdGlhbCBmaWVsZHMhICAoVGhpcyB3b3VsZCBiZSBhIGxvdCBjbGVhbmVyIGluIEMrKy4pCi0gICAqLwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QganBlZ19jb21tb25fc3RydWN0ICogal9jb21tb25fcHRyOwotdHlwZWRlZiBzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgKiBqX2NvbXByZXNzX3B0cjsKLXR5cGVkZWYgc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QgKiBqX2RlY29tcHJlc3NfcHRyOwotCi0KLS8qIE1hc3RlciByZWNvcmQgZm9yIGEgY29tcHJlc3Npb24gaW5zdGFuY2UgKi8KLQotc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0IHsKLSAganBlZ19jb21tb25fZmllbGRzOwkJLyogRmllbGRzIHNoYXJlZCB3aXRoIGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QgKi8KLQotICAvKiBEZXN0aW5hdGlvbiBmb3IgY29tcHJlc3NlZCBkYXRhICovCi0gIHN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21nciAqIGRlc3Q7Ci0KLSAgLyogRGVzY3JpcHRpb24gb2Ygc291cmNlIGltYWdlIC0tLSB0aGVzZSBmaWVsZHMgbXVzdCBiZSBmaWxsZWQgaW4gYnkKLSAgICogb3V0ZXIgYXBwbGljYXRpb24gYmVmb3JlIHN0YXJ0aW5nIGNvbXByZXNzaW9uLiAgaW5fY29sb3Jfc3BhY2UgbXVzdAotICAgKiBiZSBjb3JyZWN0IGJlZm9yZSB5b3UgY2FuIGV2ZW4gY2FsbCBqcGVnX3NldF9kZWZhdWx0cygpLgotICAgKi8KLQotICBKRElNRU5TSU9OIGltYWdlX3dpZHRoOwkvKiBpbnB1dCBpbWFnZSB3aWR0aCAqLwotICBKRElNRU5TSU9OIGltYWdlX2hlaWdodDsJLyogaW5wdXQgaW1hZ2UgaGVpZ2h0ICovCi0gIGludCBpbnB1dF9jb21wb25lbnRzOwkJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIGluIGlucHV0IGltYWdlICovCi0gIEpfQ09MT1JfU1BBQ0UgaW5fY29sb3Jfc3BhY2U7CS8qIGNvbG9yc3BhY2Ugb2YgaW5wdXQgaW1hZ2UgKi8KLQotICBkb3VibGUgaW5wdXRfZ2FtbWE7CQkvKiBpbWFnZSBnYW1tYSBvZiBpbnB1dCBpbWFnZSAqLwotCi0gIC8qIENvbXByZXNzaW9uIHBhcmFtZXRlcnMgLS0tIHRoZXNlIGZpZWxkcyBtdXN0IGJlIHNldCBiZWZvcmUgY2FsbGluZwotICAgKiBqcGVnX3N0YXJ0X2NvbXByZXNzKCkuICBXZSByZWNvbW1lbmQgY2FsbGluZyBqcGVnX3NldF9kZWZhdWx0cygpIHRvCi0gICAqIGluaXRpYWxpemUgZXZlcnl0aGluZyB0byByZWFzb25hYmxlIGRlZmF1bHRzLCB0aGVuIGNoYW5naW5nIGFueXRoaW5nCi0gICAqIHRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpY2FsbHkgd2FudHMgdG8gY2hhbmdlLiAgVGhhdCB3YXkgeW91IHdvbid0IGdldAotICAgKiBidXJudCB3aGVuIG5ldyBwYXJhbWV0ZXJzIGFyZSBhZGRlZC4gIEFsc28gbm90ZSB0aGF0IHRoZXJlIGFyZSBzZXZlcmFsCi0gICAqIGhlbHBlciByb3V0aW5lcyB0byBzaW1wbGlmeSBjaGFuZ2luZyBwYXJhbWV0ZXJzLgotICAgKi8KLQotICBpbnQgZGF0YV9wcmVjaXNpb247CQkvKiBiaXRzIG9mIHByZWNpc2lvbiBpbiBpbWFnZSBkYXRhICovCi0KLSAgaW50IG51bV9jb21wb25lbnRzOwkJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIGluIEpQRUcgaW1hZ2UgKi8KLSAgSl9DT0xPUl9TUEFDRSBqcGVnX2NvbG9yX3NwYWNlOyAvKiBjb2xvcnNwYWNlIG9mIEpQRUcgaW1hZ2UgKi8KLQotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcF9pbmZvOwotICAvKiBjb21wX2luZm9baV0gZGVzY3JpYmVzIGNvbXBvbmVudCB0aGF0IGFwcGVhcnMgaSd0aCBpbiBTT0YgKi8KLSAgCi0gIEpRVUFOVF9UQkwgKiBxdWFudF90YmxfcHRyc1tOVU1fUVVBTlRfVEJMU107Ci0gIC8qIHB0cnMgdG8gY29lZmZpY2llbnQgcXVhbnRpemF0aW9uIHRhYmxlcywgb3IgTlVMTCBpZiBub3QgZGVmaW5lZCAqLwotICAKLSAgSkhVRkZfVEJMICogZGNfaHVmZl90YmxfcHRyc1tOVU1fSFVGRl9UQkxTXTsKLSAgSkhVRkZfVEJMICogYWNfaHVmZl90YmxfcHRyc1tOVU1fSFVGRl9UQkxTXTsKLSAgLyogcHRycyB0byBIdWZmbWFuIGNvZGluZyB0YWJsZXMsIG9yIE5VTEwgaWYgbm90IGRlZmluZWQgKi8KLSAgCi0gIFVJTlQ4IGFyaXRoX2RjX0xbTlVNX0FSSVRIX1RCTFNdOyAvKiBMIHZhbHVlcyBmb3IgREMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLwotICBVSU5UOCBhcml0aF9kY19VW05VTV9BUklUSF9UQkxTXTsgLyogVSB2YWx1ZXMgZm9yIERDIGFyaXRoLWNvZGluZyB0YWJsZXMgKi8KLSAgVUlOVDggYXJpdGhfYWNfS1tOVU1fQVJJVEhfVEJMU107IC8qIEt4IHZhbHVlcyBmb3IgQUMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLwotCi0gIGludCBudW1fc2NhbnM7CQkvKiAjIG9mIGVudHJpZXMgaW4gc2Nhbl9pbmZvIGFycmF5ICovCi0gIGNvbnN0IGpwZWdfc2Nhbl9pbmZvICogc2Nhbl9pbmZvOyAvKiBzY3JpcHQgZm9yIG11bHRpLXNjYW4gZmlsZSwgb3IgTlVMTCAqLwotICAvKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBzY2FuX2luZm8gaXMgTlVMTCwgd2hpY2ggY2F1c2VzIGEgc2luZ2xlLXNjYW4KLSAgICogc2VxdWVudGlhbCBKUEVHIGZpbGUgdG8gYmUgZW1pdHRlZC4gIFRvIGNyZWF0ZSBhIG11bHRpLXNjYW4gZmlsZSwKLSAgICogc2V0IG51bV9zY2FucyBhbmQgc2Nhbl9pbmZvIHRvIHBvaW50IHRvIGFuIGFycmF5IG9mIHNjYW4gZGVmaW5pdGlvbnMuCi0gICAqLwotCi0gIGJvb2xlYW4gcmF3X2RhdGFfaW47CQkvKiBUUlVFPWNhbGxlciBzdXBwbGllcyBkb3duc2FtcGxlZCBkYXRhICovCi0gIGJvb2xlYW4gYXJpdGhfY29kZTsJCS8qIFRSVUU9YXJpdGhtZXRpYyBjb2RpbmcsIEZBTFNFPUh1ZmZtYW4gKi8KLSAgYm9vbGVhbiBvcHRpbWl6ZV9jb2Rpbmc7CS8qIFRSVUU9b3B0aW1pemUgZW50cm9weSBlbmNvZGluZyBwYXJtcyAqLwotICBib29sZWFuIENDSVI2MDFfc2FtcGxpbmc7CS8qIFRSVUU9Zmlyc3Qgc2FtcGxlcyBhcmUgY29zaXRlZCAqLwotICBpbnQgc21vb3RoaW5nX2ZhY3RvcjsJCS8qIDEuLjEwMCwgb3IgMCBmb3Igbm8gaW5wdXQgc21vb3RoaW5nICovCi0gIEpfRENUX01FVEhPRCBkY3RfbWV0aG9kOwkvKiBEQ1QgYWxnb3JpdGhtIHNlbGVjdG9yICovCi0KLSAgLyogVGhlIHJlc3RhcnQgaW50ZXJ2YWwgY2FuIGJlIHNwZWNpZmllZCBpbiBhYnNvbHV0ZSBNQ1VzIGJ5IHNldHRpbmcKLSAgICogcmVzdGFydF9pbnRlcnZhbCwgb3IgaW4gTUNVIHJvd3MgYnkgc2V0dGluZyByZXN0YXJ0X2luX3Jvd3MKLSAgICogKGluIHdoaWNoIGNhc2UgdGhlIGNvcnJlY3QgcmVzdGFydF9pbnRlcnZhbCB3aWxsIGJlIGZpZ3VyZWQKLSAgICogZm9yIGVhY2ggc2NhbikuCi0gICAqLwotICB1bnNpZ25lZCBpbnQgcmVzdGFydF9pbnRlcnZhbDsgLyogTUNVcyBwZXIgcmVzdGFydCwgb3IgMCBmb3Igbm8gcmVzdGFydCAqLwotICBpbnQgcmVzdGFydF9pbl9yb3dzOwkJLyogaWYgPiAwLCBNQ1Ugcm93cyBwZXIgcmVzdGFydCBpbnRlcnZhbCAqLwotCi0gIC8qIFBhcmFtZXRlcnMgY29udHJvbGxpbmcgZW1pc3Npb24gb2Ygc3BlY2lhbCBtYXJrZXJzLiAqLwotCi0gIGJvb2xlYW4gd3JpdGVfSkZJRl9oZWFkZXI7CS8qIHNob3VsZCBhIEpGSUYgbWFya2VyIGJlIHdyaXR0ZW4/ICovCi0gIFVJTlQ4IEpGSUZfbWFqb3JfdmVyc2lvbjsJLyogV2hhdCB0byB3cml0ZSBmb3IgdGhlIEpGSUYgdmVyc2lvbiBudW1iZXIgKi8KLSAgVUlOVDggSkZJRl9taW5vcl92ZXJzaW9uOwotICAvKiBUaGVzZSB0aHJlZSB2YWx1ZXMgYXJlIG5vdCB1c2VkIGJ5IHRoZSBKUEVHIGNvZGUsIG1lcmVseSBjb3BpZWQgKi8KLSAgLyogaW50byB0aGUgSkZJRiBBUFAwIG1hcmtlci4gIGRlbnNpdHlfdW5pdCBjYW4gYmUgMCBmb3IgdW5rbm93biwgKi8KLSAgLyogMSBmb3IgZG90cy9pbmNoLCBvciAyIGZvciBkb3RzL2NtLiAgTm90ZSB0aGF0IHRoZSBwaXhlbCBhc3BlY3QgKi8KLSAgLyogcmF0aW8gaXMgZGVmaW5lZCBieSBYX2RlbnNpdHkvWV9kZW5zaXR5IGV2ZW4gd2hlbiBkZW5zaXR5X3VuaXQ9MC4gKi8KLSAgVUlOVDggZGVuc2l0eV91bml0OwkJLyogSkZJRiBjb2RlIGZvciBwaXhlbCBzaXplIHVuaXRzICovCi0gIFVJTlQxNiBYX2RlbnNpdHk7CQkvKiBIb3Jpem9udGFsIHBpeGVsIGRlbnNpdHkgKi8KLSAgVUlOVDE2IFlfZGVuc2l0eTsJCS8qIFZlcnRpY2FsIHBpeGVsIGRlbnNpdHkgKi8KLSAgYm9vbGVhbiB3cml0ZV9BZG9iZV9tYXJrZXI7CS8qIHNob3VsZCBhbiBBZG9iZSBtYXJrZXIgYmUgd3JpdHRlbj8gKi8KLSAgCi0gIC8qIFN0YXRlIHZhcmlhYmxlOiBpbmRleCBvZiBuZXh0IHNjYW5saW5lIHRvIGJlIHdyaXR0ZW4gdG8KLSAgICoganBlZ193cml0ZV9zY2FubGluZXMoKS4gIEFwcGxpY2F0aW9uIG1heSB1c2UgdGhpcyB0byBjb250cm9sIGl0cwotICAgKiBwcm9jZXNzaW5nIGxvb3AsIGUuZy4sICJ3aGlsZSAobmV4dF9zY2FubGluZSA8IGltYWdlX2hlaWdodCkiLgotICAgKi8KLQotICBKRElNRU5TSU9OIG5leHRfc2NhbmxpbmU7CS8qIDAgLi4gaW1hZ2VfaGVpZ2h0LTEgICovCi0KLSAgLyogUmVtYWluaW5nIGZpZWxkcyBhcmUga25vd24gdGhyb3VnaG91dCBjb21wcmVzc29yLCBidXQgZ2VuZXJhbGx5Ci0gICAqIHNob3VsZCBub3QgYmUgdG91Y2hlZCBieSBhIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uLgotICAgKi8KLQotICAvKgotICAgKiBUaGVzZSBmaWVsZHMgYXJlIGNvbXB1dGVkIGR1cmluZyBjb21wcmVzc2lvbiBzdGFydHVwCi0gICAqLwotICBib29sZWFuIHByb2dyZXNzaXZlX21vZGU7CS8qIFRSVUUgaWYgc2NhbiBzY3JpcHQgdXNlcyBwcm9ncmVzc2l2ZSBtb2RlICovCi0gIGludCBtYXhfaF9zYW1wX2ZhY3RvcjsJLyogbGFyZ2VzdCBoX3NhbXBfZmFjdG9yICovCi0gIGludCBtYXhfdl9zYW1wX2ZhY3RvcjsJLyogbGFyZ2VzdCB2X3NhbXBfZmFjdG9yICovCi0KLSAgSkRJTUVOU0lPTiB0b3RhbF9pTUNVX3Jvd3M7CS8qICMgb2YgaU1DVSByb3dzIHRvIGJlIGlucHV0IHRvIGNvZWYgY3RsciAqLwotICAvKiBUaGUgY29lZmZpY2llbnQgY29udHJvbGxlciByZWNlaXZlcyBkYXRhIGluIHVuaXRzIG9mIE1DVSByb3dzIGFzIGRlZmluZWQKLSAgICogZm9yIGZ1bGx5IGludGVybGVhdmVkIHNjYW5zICh3aGV0aGVyIHRoZSBKUEVHIGZpbGUgaXMgaW50ZXJsZWF2ZWQgb3Igbm90KS4KLSAgICogVGhlcmUgYXJlIHZfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFIHNhbXBsZSByb3dzIG9mIGVhY2ggY29tcG9uZW50IGluIGFuCi0gICAqICJpTUNVIiAoaW50ZXJsZWF2ZWQgTUNVKSByb3cuCi0gICAqLwotICAKLSAgLyoKLSAgICogVGhlc2UgZmllbGRzIGFyZSB2YWxpZCBkdXJpbmcgYW55IG9uZSBzY2FuLgotICAgKiBUaGV5IGRlc2NyaWJlIHRoZSBjb21wb25lbnRzIGFuZCBNQ1VzIGFjdHVhbGx5IGFwcGVhcmluZyBpbiB0aGUgc2Nhbi4KLSAgICovCi0gIGludCBjb21wc19pbl9zY2FuOwkJLyogIyBvZiBKUEVHIGNvbXBvbmVudHMgaW4gdGhpcyBzY2FuICovCi0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjdXJfY29tcF9pbmZvW01BWF9DT01QU19JTl9TQ0FOXTsKLSAgLyogKmN1cl9jb21wX2luZm9baV0gZGVzY3JpYmVzIGNvbXBvbmVudCB0aGF0IGFwcGVhcnMgaSd0aCBpbiBTT1MgKi8KLSAgCi0gIEpESU1FTlNJT04gTUNVc19wZXJfcm93OwkvKiAjIG9mIE1DVXMgYWNyb3NzIHRoZSBpbWFnZSAqLwotICBKRElNRU5TSU9OIE1DVV9yb3dzX2luX3NjYW47CS8qICMgb2YgTUNVIHJvd3MgaW4gdGhlIGltYWdlICovCi0gIAotICBpbnQgYmxvY2tzX2luX01DVTsJCS8qICMgb2YgRENUIGJsb2NrcyBwZXIgTUNVICovCi0gIGludCBNQ1VfbWVtYmVyc2hpcFtDX01BWF9CTE9DS1NfSU5fTUNVXTsKLSAgLyogTUNVX21lbWJlcnNoaXBbaV0gaXMgaW5kZXggaW4gY3VyX2NvbXBfaW5mbyBvZiBjb21wb25lbnQgb3duaW5nICovCi0gIC8qIGkndGggYmxvY2sgaW4gYW4gTUNVICovCi0KLSAgaW50IFNzLCBTZSwgQWgsIEFsOwkJLyogcHJvZ3Jlc3NpdmUgSlBFRyBwYXJhbWV0ZXJzIGZvciBzY2FuICovCi0KLSAgLyoKLSAgICogTGlua3MgdG8gY29tcHJlc3Npb24gc3Vib2JqZWN0cyAobWV0aG9kcyBhbmQgcHJpdmF0ZSB2YXJpYWJsZXMgb2YgbW9kdWxlcykKLSAgICovCi0gIHN0cnVjdCBqcGVnX2NvbXBfbWFzdGVyICogbWFzdGVyOwotICBzdHJ1Y3QganBlZ19jX21haW5fY29udHJvbGxlciAqIG1haW47Ci0gIHN0cnVjdCBqcGVnX2NfcHJlcF9jb250cm9sbGVyICogcHJlcDsKLSAgc3RydWN0IGpwZWdfY19jb2VmX2NvbnRyb2xsZXIgKiBjb2VmOwotICBzdHJ1Y3QganBlZ19tYXJrZXJfd3JpdGVyICogbWFya2VyOwotICBzdHJ1Y3QganBlZ19jb2xvcl9jb252ZXJ0ZXIgKiBjY29udmVydDsKLSAgc3RydWN0IGpwZWdfZG93bnNhbXBsZXIgKiBkb3duc2FtcGxlOwotICBzdHJ1Y3QganBlZ19mb3J3YXJkX2RjdCAqIGZkY3Q7Ci0gIHN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciAqIGVudHJvcHk7Ci0gIGpwZWdfc2Nhbl9pbmZvICogc2NyaXB0X3NwYWNlOyAvKiB3b3Jrc3BhY2UgZm9yIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uICovCi0gIGludCBzY3JpcHRfc3BhY2Vfc2l6ZTsKLX07Ci0KLQotLyogTWFzdGVyIHJlY29yZCBmb3IgYSBkZWNvbXByZXNzaW9uIGluc3RhbmNlICovCi0KLXN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0IHsKLSAganBlZ19jb21tb25fZmllbGRzOwkJLyogRmllbGRzIHNoYXJlZCB3aXRoIGpwZWdfY29tcHJlc3Nfc3RydWN0ICovCi0KLSAgLyogU291cmNlIG9mIGNvbXByZXNzZWQgZGF0YSAqLwotICBzdHJ1Y3QganBlZ19zb3VyY2VfbWdyICogc3JjOwotCi0gIC8qIEJhc2ljIGRlc2NyaXB0aW9uIG9mIGltYWdlIC0tLSBmaWxsZWQgaW4gYnkganBlZ19yZWFkX2hlYWRlcigpLiAqLwotICAvKiBBcHBsaWNhdGlvbiBtYXkgaW5zcGVjdCB0aGVzZSB2YWx1ZXMgdG8gZGVjaWRlIGhvdyB0byBwcm9jZXNzIGltYWdlLiAqLwotCi0gIEpESU1FTlNJT04gaW1hZ2Vfd2lkdGg7CS8qIG5vbWluYWwgaW1hZ2Ugd2lkdGggKGZyb20gU09GIG1hcmtlcikgKi8KLSAgSkRJTUVOU0lPTiBpbWFnZV9oZWlnaHQ7CS8qIG5vbWluYWwgaW1hZ2UgaGVpZ2h0ICovCi0gIGludCBudW1fY29tcG9uZW50czsJCS8qICMgb2YgY29sb3IgY29tcG9uZW50cyBpbiBKUEVHIGltYWdlICovCi0gIEpfQ09MT1JfU1BBQ0UganBlZ19jb2xvcl9zcGFjZTsgLyogY29sb3JzcGFjZSBvZiBKUEVHIGltYWdlICovCi0KLSAgLyogRGVjb21wcmVzc2lvbiBwcm9jZXNzaW5nIHBhcmFtZXRlcnMgLS0tIHRoZXNlIGZpZWxkcyBtdXN0IGJlIHNldCBiZWZvcmUKLSAgICogY2FsbGluZyBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4gIE5vdGUgdGhhdCBqcGVnX3JlYWRfaGVhZGVyKCkgaW5pdGlhbGl6ZXMKLSAgICogdGhlbSB0byBkZWZhdWx0IHZhbHVlcy4KLSAgICovCi0KLSAgSl9DT0xPUl9TUEFDRSBvdXRfY29sb3Jfc3BhY2U7IC8qIGNvbG9yc3BhY2UgZm9yIG91dHB1dCAqLwotCi0gIHVuc2lnbmVkIGludCBzY2FsZV9udW0sIHNjYWxlX2Rlbm9tOyAvKiBmcmFjdGlvbiBieSB3aGljaCB0byBzY2FsZSBpbWFnZSAqLwotCi0gIGRvdWJsZSBvdXRwdXRfZ2FtbWE7CQkvKiBpbWFnZSBnYW1tYSB3YW50ZWQgaW4gb3V0cHV0ICovCi0KLSAgYm9vbGVhbiBidWZmZXJlZF9pbWFnZTsJLyogVFJVRT1tdWx0aXBsZSBvdXRwdXQgcGFzc2VzICovCi0gIGJvb2xlYW4gcmF3X2RhdGFfb3V0OwkJLyogVFJVRT1kb3duc2FtcGxlZCBkYXRhIHdhbnRlZCAqLwotCi0gIEpfRENUX01FVEhPRCBkY3RfbWV0aG9kOwkvKiBJRENUIGFsZ29yaXRobSBzZWxlY3RvciAqLwotICBib29sZWFuIGRvX2ZhbmN5X3Vwc2FtcGxpbmc7CS8qIFRSVUU9YXBwbHkgZmFuY3kgdXBzYW1wbGluZyAqLwotICBib29sZWFuIGRvX2Jsb2NrX3Ntb290aGluZzsJLyogVFJVRT1hcHBseSBpbnRlcmJsb2NrIHNtb290aGluZyAqLwotCi0gIGJvb2xlYW4gcXVhbnRpemVfY29sb3JzOwkvKiBUUlVFPWNvbG9ybWFwcGVkIG91dHB1dCB3YW50ZWQgKi8KLSAgLyogdGhlIGZvbGxvd2luZyBhcmUgaWdub3JlZCBpZiBub3QgcXVhbnRpemVfY29sb3JzOiAqLwotICBKX0RJVEhFUl9NT0RFIGRpdGhlcl9tb2RlOwkvKiB0eXBlIG9mIGNvbG9yIGRpdGhlcmluZyB0byB1c2UgKi8KLSAgYm9vbGVhbiB0d29fcGFzc19xdWFudGl6ZTsJLyogVFJVRT11c2UgdHdvLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uICovCi0gIGludCBkZXNpcmVkX251bWJlcl9vZl9jb2xvcnM7CS8qIG1heCAjIGNvbG9ycyB0byB1c2UgaW4gY3JlYXRlZCBjb2xvcm1hcCAqLwotICAvKiB0aGVzZSBhcmUgc2lnbmlmaWNhbnQgb25seSBpbiBidWZmZXJlZC1pbWFnZSBtb2RlOiAqLwotICBib29sZWFuIGVuYWJsZV8xcGFzc19xdWFudDsJLyogZW5hYmxlIGZ1dHVyZSB1c2Ugb2YgMS1wYXNzIHF1YW50aXplciAqLwotICBib29sZWFuIGVuYWJsZV9leHRlcm5hbF9xdWFudDsvKiBlbmFibGUgZnV0dXJlIHVzZSBvZiBleHRlcm5hbCBjb2xvcm1hcCAqLwotICBib29sZWFuIGVuYWJsZV8ycGFzc19xdWFudDsJLyogZW5hYmxlIGZ1dHVyZSB1c2Ugb2YgMi1wYXNzIHF1YW50aXplciAqLwotCi0gIC8qIERlc2NyaXB0aW9uIG9mIGFjdHVhbCBvdXRwdXQgaW1hZ2UgdGhhdCB3aWxsIGJlIHJldHVybmVkIHRvIGFwcGxpY2F0aW9uLgotICAgKiBUaGVzZSBmaWVsZHMgYXJlIGNvbXB1dGVkIGJ5IGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLgotICAgKiBZb3UgY2FuIGFsc28gdXNlIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucygpIHRvIGRldGVybWluZSB0aGVzZSB2YWx1ZXMKLSAgICogaW4gYWR2YW5jZSBvZiBjYWxsaW5nIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLgotICAgKi8KLQotICBKRElNRU5TSU9OIG91dHB1dF93aWR0aDsJLyogc2NhbGVkIGltYWdlIHdpZHRoICovCi0gIEpESU1FTlNJT04gb3V0cHV0X2hlaWdodDsJLyogc2NhbGVkIGltYWdlIGhlaWdodCAqLwotICBpbnQgb3V0X2NvbG9yX2NvbXBvbmVudHM7CS8qICMgb2YgY29sb3IgY29tcG9uZW50cyBpbiBvdXRfY29sb3Jfc3BhY2UgKi8KLSAgaW50IG91dHB1dF9jb21wb25lbnRzOwkvKiAjIG9mIGNvbG9yIGNvbXBvbmVudHMgcmV0dXJuZWQgKi8KLSAgLyogb3V0cHV0X2NvbXBvbmVudHMgaXMgMSAoYSBjb2xvcm1hcCBpbmRleCkgd2hlbiBxdWFudGl6aW5nIGNvbG9yczsKLSAgICogb3RoZXJ3aXNlIGl0IGVxdWFscyBvdXRfY29sb3JfY29tcG9uZW50cy4KLSAgICovCi0gIGludCByZWNfb3V0YnVmX2hlaWdodDsJLyogbWluIHJlY29tbWVuZGVkIGhlaWdodCBvZiBzY2FubGluZSBidWZmZXIgKi8KLSAgLyogSWYgdGhlIGJ1ZmZlciBwYXNzZWQgdG8ganBlZ19yZWFkX3NjYW5saW5lcygpIGlzIGxlc3MgdGhhbiB0aGlzIG1hbnkgcm93cwotICAgKiBoaWdoLCBzcGFjZSBhbmQgdGltZSB3aWxsIGJlIHdhc3RlZCBkdWUgdG8gdW5uZWNlc3NhcnkgZGF0YSBjb3B5aW5nLgotICAgKiBVc3VhbGx5IHJlY19vdXRidWZfaGVpZ2h0IHdpbGwgYmUgMSBvciAyLCBhdCBtb3N0IDQuCi0gICAqLwotCi0gIC8qIFdoZW4gcXVhbnRpemluZyBjb2xvcnMsIHRoZSBvdXRwdXQgY29sb3JtYXAgaXMgZGVzY3JpYmVkIGJ5IHRoZXNlIGZpZWxkcy4KLSAgICogVGhlIGFwcGxpY2F0aW9uIGNhbiBzdXBwbHkgYSBjb2xvcm1hcCBieSBzZXR0aW5nIGNvbG9ybWFwIG5vbi1OVUxMIGJlZm9yZQotICAgKiBjYWxsaW5nIGpwZWdfc3RhcnRfZGVjb21wcmVzczsgb3RoZXJ3aXNlIGEgY29sb3JtYXAgaXMgY3JlYXRlZCBkdXJpbmcKLSAgICoganBlZ19zdGFydF9kZWNvbXByZXNzIG9yIGpwZWdfc3RhcnRfb3V0cHV0LgotICAgKiBUaGUgbWFwIGhhcyBvdXRfY29sb3JfY29tcG9uZW50cyByb3dzIGFuZCBhY3R1YWxfbnVtYmVyX29mX2NvbG9ycyBjb2x1bW5zLgotICAgKi8KLSAgaW50IGFjdHVhbF9udW1iZXJfb2ZfY29sb3JzOwkvKiBudW1iZXIgb2YgZW50cmllcyBpbiB1c2UgKi8KLSAgSlNBTVBBUlJBWSBjb2xvcm1hcDsJCS8qIFRoZSBjb2xvciBtYXAgYXMgYSAyLUQgcGl4ZWwgYXJyYXkgKi8KLQotICAvKiBTdGF0ZSB2YXJpYWJsZXM6IHRoZXNlIHZhcmlhYmxlcyBpbmRpY2F0ZSB0aGUgcHJvZ3Jlc3Mgb2YgZGVjb21wcmVzc2lvbi4KLSAgICogVGhlIGFwcGxpY2F0aW9uIG1heSBleGFtaW5lIHRoZXNlIGJ1dCBtdXN0IG5vdCBtb2RpZnkgdGhlbS4KLSAgICovCi0KLSAgLyogUm93IGluZGV4IG9mIG5leHQgc2NhbmxpbmUgdG8gYmUgcmVhZCBmcm9tIGpwZWdfcmVhZF9zY2FubGluZXMoKS4KLSAgICogQXBwbGljYXRpb24gbWF5IHVzZSB0aGlzIHRvIGNvbnRyb2wgaXRzIHByb2Nlc3NpbmcgbG9vcCwgZS5nLiwKLSAgICogIndoaWxlIChvdXRwdXRfc2NhbmxpbmUgPCBvdXRwdXRfaGVpZ2h0KSIuCi0gICAqLwotICBKRElNRU5TSU9OIG91dHB1dF9zY2FubGluZTsJLyogMCAuLiBvdXRwdXRfaGVpZ2h0LTEgICovCi0KLSAgLyogQ3VycmVudCBpbnB1dCBzY2FuIG51bWJlciBhbmQgbnVtYmVyIG9mIGlNQ1Ugcm93cyBjb21wbGV0ZWQgaW4gc2Nhbi4KLSAgICogVGhlc2UgaW5kaWNhdGUgdGhlIHByb2dyZXNzIG9mIHRoZSBkZWNvbXByZXNzb3IgaW5wdXQgc2lkZS4KLSAgICovCi0gIGludCBpbnB1dF9zY2FuX251bWJlcjsJLyogTnVtYmVyIG9mIFNPUyBtYXJrZXJzIHNlZW4gc28gZmFyICovCi0gIEpESU1FTlNJT04gaW5wdXRfaU1DVV9yb3c7CS8qIE51bWJlciBvZiBpTUNVIHJvd3MgY29tcGxldGVkICovCi0KLSAgLyogVGhlICJvdXRwdXQgc2NhbiBudW1iZXIiIGlzIHRoZSBub3Rpb25hbCBzY2FuIGJlaW5nIGRpc3BsYXllZCBieSB0aGUKLSAgICogb3V0cHV0IHNpZGUuICBUaGUgZGVjb21wcmVzc29yIHdpbGwgbm90IGFsbG93IG91dHB1dCBzY2FuL3JvdyBudW1iZXIKLSAgICogdG8gZ2V0IGFoZWFkIG9mIGlucHV0IHNjYW4vcm93LCBidXQgaXQgY2FuIGZhbGwgYXJiaXRyYXJpbHkgZmFyIGJlaGluZC4KLSAgICovCi0gIGludCBvdXRwdXRfc2Nhbl9udW1iZXI7CS8qIE5vbWluYWwgc2NhbiBudW1iZXIgYmVpbmcgZGlzcGxheWVkICovCi0gIEpESU1FTlNJT04gb3V0cHV0X2lNQ1Vfcm93OwkvKiBOdW1iZXIgb2YgaU1DVSByb3dzIHJlYWQgKi8KLQotICAvKiBDdXJyZW50IHByb2dyZXNzaW9uIHN0YXR1cy4gIGNvZWZfYml0c1tjXVtpXSBpbmRpY2F0ZXMgdGhlIHByZWNpc2lvbgotICAgKiB3aXRoIHdoaWNoIGNvbXBvbmVudCBjJ3MgRENUIGNvZWZmaWNpZW50IGkgKGluIHppZ3phZyBvcmRlcikgaXMga25vd24uCi0gICAqIEl0IGlzIC0xIHdoZW4gbm8gZGF0YSBoYXMgeWV0IGJlZW4gcmVjZWl2ZWQsIG90aGVyd2lzZSBpdCBpcyB0aGUgcG9pbnQKLSAgICogdHJhbnNmb3JtIChzaGlmdCkgdmFsdWUgZm9yIHRoZSBtb3N0IHJlY2VudCBzY2FuIG9mIHRoZSBjb2VmZmljaWVudAotICAgKiAodGh1cywgMCBhdCBjb21wbGV0aW9uIG9mIHRoZSBwcm9ncmVzc2lvbikuCi0gICAqIFRoaXMgcG9pbnRlciBpcyBOVUxMIHdoZW4gcmVhZGluZyBhIG5vbi1wcm9ncmVzc2l2ZSBmaWxlLgotICAgKi8KLSAgaW50ICgqY29lZl9iaXRzKVtEQ1RTSVpFMl07CS8qIC0xIG9yIGN1cnJlbnQgQWwgdmFsdWUgZm9yIGVhY2ggY29lZiAqLwotCi0gIC8qIEludGVybmFsIEpQRUcgcGFyYW1ldGVycyAtLS0gdGhlIGFwcGxpY2F0aW9uIHVzdWFsbHkgbmVlZCBub3QgbG9vayBhdAotICAgKiB0aGVzZSBmaWVsZHMuICBOb3RlIHRoYXQgdGhlIGRlY29tcHJlc3NvciBvdXRwdXQgc2lkZSBtYXkgbm90IHVzZQotICAgKiBhbnkgcGFyYW1ldGVycyB0aGF0IGNhbiBjaGFuZ2UgYmV0d2VlbiBzY2Fucy4KLSAgICovCi0KLSAgLyogUXVhbnRpemF0aW9uIGFuZCBIdWZmbWFuIHRhYmxlcyBhcmUgY2FycmllZCBmb3J3YXJkIGFjcm9zcyBpbnB1dAotICAgKiBkYXRhc3RyZWFtcyB3aGVuIHByb2Nlc3NpbmcgYWJicmV2aWF0ZWQgSlBFRyBkYXRhc3RyZWFtcy4KLSAgICovCi0KLSAgSlFVQU5UX1RCTCAqIHF1YW50X3RibF9wdHJzW05VTV9RVUFOVF9UQkxTXTsKLSAgLyogcHRycyB0byBjb2VmZmljaWVudCBxdWFudGl6YXRpb24gdGFibGVzLCBvciBOVUxMIGlmIG5vdCBkZWZpbmVkICovCi0KLSAgSkhVRkZfVEJMICogZGNfaHVmZl90YmxfcHRyc1tOVU1fSFVGRl9UQkxTXTsKLSAgSkhVRkZfVEJMICogYWNfaHVmZl90YmxfcHRyc1tOVU1fSFVGRl9UQkxTXTsKLSAgLyogcHRycyB0byBIdWZmbWFuIGNvZGluZyB0YWJsZXMsIG9yIE5VTEwgaWYgbm90IGRlZmluZWQgKi8KLQotICAvKiBUaGVzZSBwYXJhbWV0ZXJzIGFyZSBuZXZlciBjYXJyaWVkIGFjcm9zcyBkYXRhc3RyZWFtcywgc2luY2UgdGhleQotICAgKiBhcmUgZ2l2ZW4gaW4gU09GL1NPUyBtYXJrZXJzIG9yIGRlZmluZWQgdG8gYmUgcmVzZXQgYnkgU09JLgotICAgKi8KLQotICBpbnQgZGF0YV9wcmVjaXNpb247CQkvKiBiaXRzIG9mIHByZWNpc2lvbiBpbiBpbWFnZSBkYXRhICovCi0KLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBfaW5mbzsKLSAgLyogY29tcF9pbmZvW2ldIGRlc2NyaWJlcyBjb21wb25lbnQgdGhhdCBhcHBlYXJzIGkndGggaW4gU09GICovCi0KLSAgYm9vbGVhbiBwcm9ncmVzc2l2ZV9tb2RlOwkvKiBUUlVFIGlmIFNPRm4gc3BlY2lmaWVzIHByb2dyZXNzaXZlIG1vZGUgKi8KLSAgYm9vbGVhbiBhcml0aF9jb2RlOwkJLyogVFJVRT1hcml0aG1ldGljIGNvZGluZywgRkFMU0U9SHVmZm1hbiAqLwotCi0gIFVJTlQ4IGFyaXRoX2RjX0xbTlVNX0FSSVRIX1RCTFNdOyAvKiBMIHZhbHVlcyBmb3IgREMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLwotICBVSU5UOCBhcml0aF9kY19VW05VTV9BUklUSF9UQkxTXTsgLyogVSB2YWx1ZXMgZm9yIERDIGFyaXRoLWNvZGluZyB0YWJsZXMgKi8KLSAgVUlOVDggYXJpdGhfYWNfS1tOVU1fQVJJVEhfVEJMU107IC8qIEt4IHZhbHVlcyBmb3IgQUMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLwotCi0gIHVuc2lnbmVkIGludCByZXN0YXJ0X2ludGVydmFsOyAvKiBNQ1VzIHBlciByZXN0YXJ0IGludGVydmFsLCBvciAwIGZvciBubyByZXN0YXJ0ICovCi0KLSAgLyogVGhlc2UgZmllbGRzIHJlY29yZCBkYXRhIG9idGFpbmVkIGZyb20gb3B0aW9uYWwgbWFya2VycyByZWNvZ25pemVkIGJ5Ci0gICAqIHRoZSBKUEVHIGxpYnJhcnkuCi0gICAqLwotICBib29sZWFuIHNhd19KRklGX21hcmtlcjsJLyogVFJVRSBpZmYgYSBKRklGIEFQUDAgbWFya2VyIHdhcyBmb3VuZCAqLwotICAvKiBEYXRhIGNvcGllZCBmcm9tIEpGSUYgbWFya2VyOyBvbmx5IHZhbGlkIGlmIHNhd19KRklGX21hcmtlciBpcyBUUlVFOiAqLwotICBVSU5UOCBKRklGX21ham9yX3ZlcnNpb247CS8qIEpGSUYgdmVyc2lvbiBudW1iZXIgKi8KLSAgVUlOVDggSkZJRl9taW5vcl92ZXJzaW9uOwotICBVSU5UOCBkZW5zaXR5X3VuaXQ7CQkvKiBKRklGIGNvZGUgZm9yIHBpeGVsIHNpemUgdW5pdHMgKi8KLSAgVUlOVDE2IFhfZGVuc2l0eTsJCS8qIEhvcml6b250YWwgcGl4ZWwgZGVuc2l0eSAqLwotICBVSU5UMTYgWV9kZW5zaXR5OwkJLyogVmVydGljYWwgcGl4ZWwgZGVuc2l0eSAqLwotICBib29sZWFuIHNhd19BZG9iZV9tYXJrZXI7CS8qIFRSVUUgaWZmIGFuIEFkb2JlIEFQUDE0IG1hcmtlciB3YXMgZm91bmQgKi8KLSAgVUlOVDggQWRvYmVfdHJhbnNmb3JtOwkvKiBDb2xvciB0cmFuc2Zvcm0gY29kZSBmcm9tIEFkb2JlIG1hcmtlciAqLwotCi0gIGJvb2xlYW4gQ0NJUjYwMV9zYW1wbGluZzsJLyogVFJVRT1maXJzdCBzYW1wbGVzIGFyZSBjb3NpdGVkICovCi0KLSAgLyogQXNpZGUgZnJvbSB0aGUgc3BlY2lmaWMgZGF0YSByZXRhaW5lZCBmcm9tIEFQUG4gbWFya2VycyBrbm93biB0byB0aGUKLSAgICogbGlicmFyeSwgdGhlIHVuaW50ZXJwcmV0ZWQgY29udGVudHMgb2YgYW55IG9yIGFsbCBBUFBuIGFuZCBDT00gbWFya2VycwotICAgKiBjYW4gYmUgc2F2ZWQgaW4gYSBsaXN0IGZvciBleGFtaW5hdGlvbiBieSB0aGUgYXBwbGljYXRpb24uCi0gICAqLwotICBqcGVnX3NhdmVkX21hcmtlcl9wdHIgbWFya2VyX2xpc3Q7IC8qIEhlYWQgb2YgbGlzdCBvZiBzYXZlZCBtYXJrZXJzICovCi0KLSAgLyogUmVtYWluaW5nIGZpZWxkcyBhcmUga25vd24gdGhyb3VnaG91dCBkZWNvbXByZXNzb3IsIGJ1dCBnZW5lcmFsbHkKLSAgICogc2hvdWxkIG5vdCBiZSB0b3VjaGVkIGJ5IGEgc3Vycm91bmRpbmcgYXBwbGljYXRpb24uCi0gICAqLwotCi0gIC8qCi0gICAqIFRoZXNlIGZpZWxkcyBhcmUgY29tcHV0ZWQgZHVyaW5nIGRlY29tcHJlc3Npb24gc3RhcnR1cAotICAgKi8KLSAgaW50IG1heF9oX3NhbXBfZmFjdG9yOwkvKiBsYXJnZXN0IGhfc2FtcF9mYWN0b3IgKi8KLSAgaW50IG1heF92X3NhbXBfZmFjdG9yOwkvKiBsYXJnZXN0IHZfc2FtcF9mYWN0b3IgKi8KLQotICBpbnQgbWluX0RDVF9zY2FsZWRfc2l6ZTsJLyogc21hbGxlc3QgRENUX3NjYWxlZF9zaXplIG9mIGFueSBjb21wb25lbnQgKi8KLQotICBKRElNRU5TSU9OIHRvdGFsX2lNQ1Vfcm93czsJLyogIyBvZiBpTUNVIHJvd3MgaW4gaW1hZ2UgKi8KLSAgLyogVGhlIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIncyBpbnB1dCBhbmQgb3V0cHV0IHByb2dyZXNzIGlzIG1lYXN1cmVkIGluCi0gICAqIHVuaXRzIG9mICJpTUNVIiAoaW50ZXJsZWF2ZWQgTUNVKSByb3dzLiAgVGhlc2UgYXJlIHRoZSBzYW1lIGFzIE1DVSByb3dzCi0gICAqIGluIGZ1bGx5IGludGVybGVhdmVkIEpQRUcgc2NhbnMsIGJ1dCBhcmUgdXNlZCB3aGV0aGVyIHRoZSBzY2FuIGlzCi0gICAqIGludGVybGVhdmVkIG9yIG5vdC4gIFdlIGRlZmluZSBhbiBpTUNVIHJvdyBhcyB2X3NhbXBfZmFjdG9yIERDVCBibG9jawotICAgKiByb3dzIG9mIGVhY2ggY29tcG9uZW50LiAgVGhlcmVmb3JlLCB0aGUgSURDVCBvdXRwdXQgY29udGFpbnMKLSAgICogdl9zYW1wX2ZhY3RvcipEQ1Rfc2NhbGVkX3NpemUgc2FtcGxlIHJvd3Mgb2YgYSBjb21wb25lbnQgcGVyIGlNQ1Ugcm93LgotICAgKi8KLQotICBKU0FNUExFICogc2FtcGxlX3JhbmdlX2xpbWl0OyAvKiB0YWJsZSBmb3IgZmFzdCByYW5nZS1saW1pdGluZyAqLwotCi0gIC8qCi0gICAqIFRoZXNlIGZpZWxkcyBhcmUgdmFsaWQgZHVyaW5nIGFueSBvbmUgc2Nhbi4KLSAgICogVGhleSBkZXNjcmliZSB0aGUgY29tcG9uZW50cyBhbmQgTUNVcyBhY3R1YWxseSBhcHBlYXJpbmcgaW4gdGhlIHNjYW4uCi0gICAqIE5vdGUgdGhhdCB0aGUgZGVjb21wcmVzc29yIG91dHB1dCBzaWRlIG11c3Qgbm90IHVzZSB0aGVzZSBmaWVsZHMuCi0gICAqLwotICBpbnQgY29tcHNfaW5fc2NhbjsJCS8qICMgb2YgSlBFRyBjb21wb25lbnRzIGluIHRoaXMgc2NhbiAqLwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY3VyX2NvbXBfaW5mb1tNQVhfQ09NUFNfSU5fU0NBTl07Ci0gIC8qICpjdXJfY29tcF9pbmZvW2ldIGRlc2NyaWJlcyBjb21wb25lbnQgdGhhdCBhcHBlYXJzIGkndGggaW4gU09TICovCi0KLSAgSkRJTUVOU0lPTiBNQ1VzX3Blcl9yb3c7CS8qICMgb2YgTUNVcyBhY3Jvc3MgdGhlIGltYWdlICovCi0gIEpESU1FTlNJT04gTUNVX3Jvd3NfaW5fc2NhbjsJLyogIyBvZiBNQ1Ugcm93cyBpbiB0aGUgaW1hZ2UgKi8KLQotICBpbnQgYmxvY2tzX2luX01DVTsJCS8qICMgb2YgRENUIGJsb2NrcyBwZXIgTUNVICovCi0gIGludCBNQ1VfbWVtYmVyc2hpcFtEX01BWF9CTE9DS1NfSU5fTUNVXTsKLSAgLyogTUNVX21lbWJlcnNoaXBbaV0gaXMgaW5kZXggaW4gY3VyX2NvbXBfaW5mbyBvZiBjb21wb25lbnQgb3duaW5nICovCi0gIC8qIGkndGggYmxvY2sgaW4gYW4gTUNVICovCi0KLSAgaW50IFNzLCBTZSwgQWgsIEFsOwkJLyogcHJvZ3Jlc3NpdmUgSlBFRyBwYXJhbWV0ZXJzIGZvciBzY2FuICovCi0KLSAgLyogVGhpcyBmaWVsZCBpcyBzaGFyZWQgYmV0d2VlbiBlbnRyb3B5IGRlY29kZXIgYW5kIG1hcmtlciBwYXJzZXIuCi0gICAqIEl0IGlzIGVpdGhlciB6ZXJvIG9yIHRoZSBjb2RlIG9mIGEgSlBFRyBtYXJrZXIgdGhhdCBoYXMgYmVlbgotICAgKiByZWFkIGZyb20gdGhlIGRhdGEgc291cmNlLCBidXQgaGFzIG5vdCB5ZXQgYmVlbiBwcm9jZXNzZWQuCi0gICAqLwotICBpbnQgdW5yZWFkX21hcmtlcjsKLQotICAvKgotICAgKiBMaW5rcyB0byBkZWNvbXByZXNzaW9uIHN1Ym9iamVjdHMgKG1ldGhvZHMsIHByaXZhdGUgdmFyaWFibGVzIG9mIG1vZHVsZXMpCi0gICAqLwotICBzdHJ1Y3QganBlZ19kZWNvbXBfbWFzdGVyICogbWFzdGVyOwotICBzdHJ1Y3QganBlZ19kX21haW5fY29udHJvbGxlciAqIG1haW47Ci0gIHN0cnVjdCBqcGVnX2RfY29lZl9jb250cm9sbGVyICogY29lZjsKLSAgc3RydWN0IGpwZWdfZF9wb3N0X2NvbnRyb2xsZXIgKiBwb3N0OwotICBzdHJ1Y3QganBlZ19pbnB1dF9jb250cm9sbGVyICogaW5wdXRjdGw7Ci0gIHN0cnVjdCBqcGVnX21hcmtlcl9yZWFkZXIgKiBtYXJrZXI7Ci0gIHN0cnVjdCBqcGVnX2VudHJvcHlfZGVjb2RlciAqIGVudHJvcHk7Ci0gIHN0cnVjdCBqcGVnX2ludmVyc2VfZGN0ICogaWRjdDsKLSAgc3RydWN0IGpwZWdfdXBzYW1wbGVyICogdXBzYW1wbGU7Ci0gIHN0cnVjdCBqcGVnX2NvbG9yX2RlY29udmVydGVyICogY2NvbnZlcnQ7Ci0gIHN0cnVjdCBqcGVnX2NvbG9yX3F1YW50aXplciAqIGNxdWFudGl6ZTsKLX07Ci0KLQotLyogIk9iamVjdCIgZGVjbGFyYXRpb25zIGZvciBKUEVHIG1vZHVsZXMgdGhhdCBtYXkgYmUgc3VwcGxpZWQgb3IgY2FsbGVkCi0gKiBkaXJlY3RseSBieSB0aGUgc3Vycm91bmRpbmcgYXBwbGljYXRpb24uCi0gKiBBcyB3aXRoIGFsbCBvYmplY3RzIGluIHRoZSBKUEVHIGxpYnJhcnksIHRoZXNlIHN0cnVjdHMgb25seSBkZWZpbmUgdGhlCi0gKiBwdWJsaWNseSB2aXNpYmxlIG1ldGhvZHMgYW5kIHN0YXRlIHZhcmlhYmxlcyBvZiBhIG1vZHVsZS4gIEFkZGl0aW9uYWwKLSAqIHByaXZhdGUgZmllbGRzIG1heSBleGlzdCBhZnRlciB0aGUgcHVibGljIG9uZXMuCi0gKi8KLQotCi0vKiBFcnJvciBoYW5kbGVyIG9iamVjdCAqLwotCi1zdHJ1Y3QganBlZ19lcnJvcl9tZ3IgewotICAvKiBFcnJvciBleGl0IGhhbmRsZXI6IGRvZXMgbm90IHJldHVybiB0byBjYWxsZXIgKi8KLSAgSk1FVEhPRCh2b2lkLCBlcnJvcl9leGl0LCAoal9jb21tb25fcHRyIGNpbmZvKSk7Ci0gIC8qIENvbmRpdGlvbmFsbHkgZW1pdCBhIHRyYWNlIG9yIHdhcm5pbmcgbWVzc2FnZSAqLwotICBKTUVUSE9EKHZvaWQsIGVtaXRfbWVzc2FnZSwgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IG1zZ19sZXZlbCkpOwotICAvKiBSb3V0aW5lIHRoYXQgYWN0dWFsbHkgb3V0cHV0cyBhIHRyYWNlIG9yIGVycm9yIG1lc3NhZ2UgKi8KLSAgSk1FVEhPRCh2b2lkLCBvdXRwdXRfbWVzc2FnZSwgKGpfY29tbW9uX3B0ciBjaW5mbykpOwotICAvKiBGb3JtYXQgYSBtZXNzYWdlIHN0cmluZyBmb3IgdGhlIG1vc3QgcmVjZW50IEpQRUcgZXJyb3Igb3IgbWVzc2FnZSAqLwotICBKTUVUSE9EKHZvaWQsIGZvcm1hdF9tZXNzYWdlLCAoal9jb21tb25fcHRyIGNpbmZvLCBjaGFyICogYnVmZmVyKSk7Ci0jZGVmaW5lIEpNU0dfTEVOR1RIX01BWCAgMjAwCS8qIHJlY29tbWVuZGVkIHNpemUgb2YgZm9ybWF0X21lc3NhZ2UgYnVmZmVyICovCi0gIC8qIFJlc2V0IGVycm9yIHN0YXRlIHZhcmlhYmxlcyBhdCBzdGFydCBvZiBhIG5ldyBpbWFnZSAqLwotICBKTUVUSE9EKHZvaWQsIHJlc2V0X2Vycm9yX21nciwgKGpfY29tbW9uX3B0ciBjaW5mbykpOwotICAKLSAgLyogVGhlIG1lc3NhZ2UgSUQgY29kZSBhbmQgYW55IHBhcmFtZXRlcnMgYXJlIHNhdmVkIGhlcmUuCi0gICAqIEEgbWVzc2FnZSBjYW4gaGF2ZSBvbmUgc3RyaW5nIHBhcmFtZXRlciBvciB1cCB0byA4IGludCBwYXJhbWV0ZXJzLgotICAgKi8KLSAgaW50IG1zZ19jb2RlOwotI2RlZmluZSBKTVNHX1NUUl9QQVJNX01BWCAgODAKLSAgdW5pb24gewotICAgIGludCBpWzhdOwotICAgIGNoYXIgc1tKTVNHX1NUUl9QQVJNX01BWF07Ci0gIH0gbXNnX3Bhcm07Ci0gIAotICAvKiBTdGFuZGFyZCBzdGF0ZSB2YXJpYWJsZXMgZm9yIGVycm9yIGZhY2lsaXR5ICovCi0gIAotICBpbnQgdHJhY2VfbGV2ZWw7CQkvKiBtYXggbXNnX2xldmVsIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgKi8KLSAgCi0gIC8qIEZvciByZWNvdmVyYWJsZSBjb3JydXB0LWRhdGEgZXJyb3JzLCB3ZSBlbWl0IGEgd2FybmluZyBtZXNzYWdlLAotICAgKiBidXQga2VlcCBnb2luZyB1bmxlc3MgZW1pdF9tZXNzYWdlIGNob29zZXMgdG8gYWJvcnQuICBlbWl0X21lc3NhZ2UKLSAgICogc2hvdWxkIGNvdW50IHdhcm5pbmdzIGluIG51bV93YXJuaW5ncy4gIFRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbgotICAgKiBjYW4gY2hlY2sgZm9yIGJhZCBkYXRhIGJ5IHNlZWluZyBpZiBudW1fd2FybmluZ3MgaXMgbm9uemVybyBhdCB0aGUKLSAgICogZW5kIG9mIHByb2Nlc3NpbmcuCi0gICAqLwotICBsb25nIG51bV93YXJuaW5nczsJCS8qIG51bWJlciBvZiBjb3JydXB0LWRhdGEgd2FybmluZ3MgKi8KLQotICAvKiBUaGVzZSBmaWVsZHMgcG9pbnQgdG8gdGhlIHRhYmxlKHMpIG9mIGVycm9yIG1lc3NhZ2Ugc3RyaW5ncy4KLSAgICogQW4gYXBwbGljYXRpb24gY2FuIGNoYW5nZSB0aGUgdGFibGUgcG9pbnRlciB0byBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQKLSAgICogbWVzc2FnZSBsaXN0ICh0eXBpY2FsbHksIHRvIGNoYW5nZSB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggZXJyb3JzIGFyZQotICAgKiByZXBvcnRlZCkuICBTb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBhZGQgYWRkaXRpb25hbCBlcnJvciBjb2RlcwotICAgKiB0aGF0IHdpbGwgYmUgaGFuZGxlZCBieSB0aGUgSlBFRyBsaWJyYXJ5IGVycm9yIG1lY2hhbmlzbTsgdGhlIHNlY29uZAotICAgKiB0YWJsZSBwb2ludGVyIGlzIHVzZWQgZm9yIHRoaXMgcHVycG9zZS4KLSAgICoKLSAgICogRmlyc3QgdGFibGUgaW5jbHVkZXMgYWxsIGVycm9ycyBnZW5lcmF0ZWQgYnkgSlBFRyBsaWJyYXJ5IGl0c2VsZi4KLSAgICogRXJyb3IgY29kZSAwIGlzIHJlc2VydmVkIGZvciBhICJubyBzdWNoIGVycm9yIHN0cmluZyIgbWVzc2FnZS4KLSAgICovCi0gIGNvbnN0IGNoYXIgKiBjb25zdCAqIGpwZWdfbWVzc2FnZV90YWJsZTsgLyogTGlicmFyeSBlcnJvcnMgKi8KLSAgaW50IGxhc3RfanBlZ19tZXNzYWdlOyAgICAvKiBUYWJsZSBjb250YWlucyBzdHJpbmdzIDAuLmxhc3RfanBlZ19tZXNzYWdlICovCi0gIC8qIFNlY29uZCB0YWJsZSBjYW4gYmUgYWRkZWQgYnkgYXBwbGljYXRpb24gKHNlZSBjanBlZy9kanBlZyBmb3IgZXhhbXBsZSkuCi0gICAqIEl0IGNvbnRhaW5zIHN0cmluZ3MgbnVtYmVyZWQgZmlyc3RfYWRkb25fbWVzc2FnZS4ubGFzdF9hZGRvbl9tZXNzYWdlLgotICAgKi8KLSAgY29uc3QgY2hhciAqIGNvbnN0ICogYWRkb25fbWVzc2FnZV90YWJsZTsgLyogTm9uLWxpYnJhcnkgZXJyb3JzICovCi0gIGludCBmaXJzdF9hZGRvbl9tZXNzYWdlOwkvKiBjb2RlIGZvciBmaXJzdCBzdHJpbmcgaW4gYWRkb24gdGFibGUgKi8KLSAgaW50IGxhc3RfYWRkb25fbWVzc2FnZTsJLyogY29kZSBmb3IgbGFzdCBzdHJpbmcgaW4gYWRkb24gdGFibGUgKi8KLX07Ci0KLQotLyogUHJvZ3Jlc3MgbW9uaXRvciBvYmplY3QgKi8KLQotc3RydWN0IGpwZWdfcHJvZ3Jlc3NfbWdyIHsKLSAgSk1FVEhPRCh2b2lkLCBwcm9ncmVzc19tb25pdG9yLCAoal9jb21tb25fcHRyIGNpbmZvKSk7Ci0KLSAgbG9uZyBwYXNzX2NvdW50ZXI7CQkvKiB3b3JrIHVuaXRzIGNvbXBsZXRlZCBpbiB0aGlzIHBhc3MgKi8KLSAgbG9uZyBwYXNzX2xpbWl0OwkJLyogdG90YWwgbnVtYmVyIG9mIHdvcmsgdW5pdHMgaW4gdGhpcyBwYXNzICovCi0gIGludCBjb21wbGV0ZWRfcGFzc2VzOwkJLyogcGFzc2VzIGNvbXBsZXRlZCBzbyBmYXIgKi8KLSAgaW50IHRvdGFsX3Bhc3NlczsJCS8qIHRvdGFsIG51bWJlciBvZiBwYXNzZXMgZXhwZWN0ZWQgKi8KLX07Ci0KLQotLyogRGF0YSBkZXN0aW5hdGlvbiBvYmplY3QgZm9yIGNvbXByZXNzaW9uICovCi0KLXN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21nciB7Ci0gIEpPQ1RFVCAqIG5leHRfb3V0cHV0X2J5dGU7CS8qID0+IG5leHQgYnl0ZSB0byB3cml0ZSBpbiBidWZmZXIgKi8KLSAgc2l6ZV90IGZyZWVfaW5fYnVmZmVyOwkvKiAjIG9mIGJ5dGUgc3BhY2VzIHJlbWFpbmluZyBpbiBidWZmZXIgKi8KLQotICBKTUVUSE9EKHZvaWQsIGluaXRfZGVzdGluYXRpb24sIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKGJvb2xlYW4sIGVtcHR5X291dHB1dF9idWZmZXIsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIHRlcm1fZGVzdGluYXRpb24sIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotfTsKLQotCi0vKiBEYXRhIHNvdXJjZSBvYmplY3QgZm9yIGRlY29tcHJlc3Npb24gKi8KLQotc3RydWN0IGpwZWdfc291cmNlX21nciB7Ci0gIGNvbnN0IEpPQ1RFVCAqIG5leHRfaW5wdXRfYnl0ZTsgLyogPT4gbmV4dCBieXRlIHRvIHJlYWQgZnJvbSBidWZmZXIgKi8KLSAgc2l6ZV90IGJ5dGVzX2luX2J1ZmZlcjsJLyogIyBvZiBieXRlcyByZW1haW5pbmcgaW4gYnVmZmVyICovCi0KLSAgSk1FVEhPRCh2b2lkLCBpbml0X3NvdXJjZSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRChib29sZWFuLCBmaWxsX2lucHV0X2J1ZmZlciwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRCh2b2lkLCBza2lwX2lucHV0X2RhdGEsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBsb25nIG51bV9ieXRlcykpOwotICBKTUVUSE9EKGJvb2xlYW4sIHJlc3luY190b19yZXN0YXJ0LCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGRlc2lyZWQpKTsKLSAgSk1FVEhPRCh2b2lkLCB0ZXJtX3NvdXJjZSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLX07Ci0KLQotLyogTWVtb3J5IG1hbmFnZXIgb2JqZWN0LgotICogQWxsb2NhdGVzICJzbWFsbCIgb2JqZWN0cyAoYSBmZXcgSyB0b3RhbCksICJsYXJnZSIgb2JqZWN0cyAodGVucyBvZiBLKSwKLSAqIGFuZCAicmVhbGx5IGJpZyIgb2JqZWN0cyAodmlydHVhbCBhcnJheXMgd2l0aCBiYWNraW5nIHN0b3JlIGlmIG5lZWRlZCkuCi0gKiBUaGUgbWVtb3J5IG1hbmFnZXIgZG9lcyBub3QgYWxsb3cgaW5kaXZpZHVhbCBvYmplY3RzIHRvIGJlIGZyZWVkOyByYXRoZXIsCi0gKiBlYWNoIGNyZWF0ZWQgb2JqZWN0IGlzIGFzc2lnbmVkIHRvIGEgcG9vbCwgYW5kIHdob2xlIHBvb2xzIGNhbiBiZSBmcmVlZAotICogYXQgb25jZS4gIFRoaXMgaXMgZmFzdGVyIGFuZCBtb3JlIGNvbnZlbmllbnQgdGhhbiByZW1lbWJlcmluZyBleGFjdGx5IHdoYXQKLSAqIHRvIGZyZWUsIGVzcGVjaWFsbHkgd2hlcmUgbWFsbG9jKCkvZnJlZSgpIGFyZSBub3QgdG9vIHNwZWVkeS4KLSAqIE5COiBhbGxvYyByb3V0aW5lcyBuZXZlciByZXR1cm4gTlVMTC4gIFRoZXkgZXhpdCB0byBlcnJvcl9leGl0IGlmIG5vdAotICogc3VjY2Vzc2Z1bC4KLSAqLwotCi0jZGVmaW5lIEpQT09MX1BFUk1BTkVOVAkwCS8qIGxhc3RzIHVudGlsIG1hc3RlciByZWNvcmQgaXMgZGVzdHJveWVkICovCi0jZGVmaW5lIEpQT09MX0lNQUdFCTEJLyogbGFzdHMgdW50aWwgZG9uZSB3aXRoIGltYWdlL2RhdGFzdHJlYW0gKi8KLSNkZWZpbmUgSlBPT0xfTlVNUE9PTFMJMgotCi10eXBlZGVmIHN0cnVjdCBqdmlydF9zYXJyYXlfY29udHJvbCAqIGp2aXJ0X3NhcnJheV9wdHI7Ci10eXBlZGVmIHN0cnVjdCBqdmlydF9iYXJyYXlfY29udHJvbCAqIGp2aXJ0X2JhcnJheV9wdHI7Ci0KLQotc3RydWN0IGpwZWdfbWVtb3J5X21nciB7Ci0gIC8qIE1ldGhvZCBwb2ludGVycyAqLwotICBKTUVUSE9EKHZvaWQgKiwgYWxsb2Nfc21hbGwsIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLAotCQkJCXNpemVfdCBzaXplb2ZvYmplY3QpKTsKLSAgSk1FVEhPRCh2b2lkICAqLCBhbGxvY19sYXJnZSwgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsCi0JCQkJICAgICBzaXplX3Qgc2l6ZW9mb2JqZWN0KSk7Ci0gIEpNRVRIT0QoSlNBTVBBUlJBWSwgYWxsb2Nfc2FycmF5LCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwKLQkJCQkgICAgIEpESU1FTlNJT04gc2FtcGxlc3BlcnJvdywKLQkJCQkgICAgIEpESU1FTlNJT04gbnVtcm93cykpOwotICBKTUVUSE9EKEpCTE9DS0FSUkFZLCBhbGxvY19iYXJyYXksIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLAotCQkJCSAgICAgIEpESU1FTlNJT04gYmxvY2tzcGVycm93LAotCQkJCSAgICAgIEpESU1FTlNJT04gbnVtcm93cykpOwotICBKTUVUSE9EKGp2aXJ0X3NhcnJheV9wdHIsIHJlcXVlc3RfdmlydF9zYXJyYXksIChqX2NvbW1vbl9wdHIgY2luZm8sCi0JCQkJCQkgIGludCBwb29sX2lkLAotCQkJCQkJICBib29sZWFuIHByZV96ZXJvLAotCQkJCQkJICBKRElNRU5TSU9OIHNhbXBsZXNwZXJyb3csCi0JCQkJCQkgIEpESU1FTlNJT04gbnVtcm93cywKLQkJCQkJCSAgSkRJTUVOU0lPTiBtYXhhY2Nlc3MpKTsKLSAgSk1FVEhPRChqdmlydF9iYXJyYXlfcHRyLCByZXF1ZXN0X3ZpcnRfYmFycmF5LCAoal9jb21tb25fcHRyIGNpbmZvLAotCQkJCQkJICBpbnQgcG9vbF9pZCwKLQkJCQkJCSAgYm9vbGVhbiBwcmVfemVybywKLQkJCQkJCSAgSkRJTUVOU0lPTiBibG9ja3NwZXJyb3csCi0JCQkJCQkgIEpESU1FTlNJT04gbnVtcm93cywKLQkJCQkJCSAgSkRJTUVOU0lPTiBtYXhhY2Nlc3MpKTsKLSAgSk1FVEhPRCh2b2lkLCByZWFsaXplX3ZpcnRfYXJyYXlzLCAoal9jb21tb25fcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0QoSlNBTVBBUlJBWSwgYWNjZXNzX3ZpcnRfc2FycmF5LCAoal9jb21tb25fcHRyIGNpbmZvLAotCQkJCQkgICBqdmlydF9zYXJyYXlfcHRyIHB0ciwKLQkJCQkJICAgSkRJTUVOU0lPTiBzdGFydF9yb3csCi0JCQkJCSAgIEpESU1FTlNJT04gbnVtX3Jvd3MsCi0JCQkJCSAgIGJvb2xlYW4gd3JpdGFibGUpKTsKLSAgSk1FVEhPRChKQkxPQ0tBUlJBWSwgYWNjZXNzX3ZpcnRfYmFycmF5LCAoal9jb21tb25fcHRyIGNpbmZvLAotCQkJCQkgICAganZpcnRfYmFycmF5X3B0ciBwdHIsCi0JCQkJCSAgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywKLQkJCQkJICAgIEpESU1FTlNJT04gbnVtX3Jvd3MsCi0JCQkJCSAgICBib29sZWFuIHdyaXRhYmxlKSk7Ci0gIEpNRVRIT0Qodm9pZCwgZnJlZV9wb29sLCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCkpOwotICBKTUVUSE9EKHZvaWQsIHNlbGZfZGVzdHJ1Y3QsIChqX2NvbW1vbl9wdHIgY2luZm8pKTsKLQotICAvKiBMaW1pdCBvbiBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgdGhpcyBKUEVHIG9iamVjdC4gIChOb3RlIHRoYXQgdGhpcyBpcwotICAgKiBtZXJlbHkgYWR2aXNvcnksIG5vdCBhIGd1YXJhbnRlZWQgbWF4aW11bTsgaXQgb25seSBhZmZlY3RzIHRoZSBzcGFjZQotICAgKiB1c2VkIGZvciB2aXJ0dWFsLWFycmF5IGJ1ZmZlcnMuKSAgTWF5IGJlIGNoYW5nZWQgYnkgb3V0ZXIgYXBwbGljYXRpb24KLSAgICogYWZ0ZXIgY3JlYXRpbmcgdGhlIEpQRUcgb2JqZWN0LgotICAgKi8KLSAgbG9uZyBtYXhfbWVtb3J5X3RvX3VzZTsKLQotICAvKiBNYXhpbXVtIGFsbG9jYXRpb24gcmVxdWVzdCBhY2NlcHRlZCBieSBhbGxvY19sYXJnZS4gKi8KLSAgbG9uZyBtYXhfYWxsb2NfY2h1bms7Ci19OwotCi0KLS8qIFJvdXRpbmUgc2lnbmF0dXJlIGZvciBhcHBsaWNhdGlvbi1zdXBwbGllZCBtYXJrZXIgcHJvY2Vzc2luZyBtZXRob2RzLgotICogTmVlZCBub3QgcGFzcyBtYXJrZXIgY29kZSBzaW5jZSBpdCBpcyBzdG9yZWQgaW4gY2luZm8tPnVucmVhZF9tYXJrZXIuCi0gKi8KLXR5cGVkZWYgSk1FVEhPRChib29sZWFuLCBqcGVnX21hcmtlcl9wYXJzZXJfbWV0aG9kLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotCi0KLS8qIERlY2xhcmF0aW9ucyBmb3Igcm91dGluZXMgY2FsbGVkIGJ5IGFwcGxpY2F0aW9uLgotICogVGhlIEpQUCBtYWNybyBoaWRlcyBwcm90b3R5cGUgcGFyYW1ldGVycyBmcm9tIGNvbXBpbGVycyB0aGF0IGNhbid0IGNvcGUuCi0gKiBOb3RlIEpQUCByZXF1aXJlcyBkb3VibGUgcGFyZW50aGVzZXMuCi0gKi8KLQotI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwotI2RlZmluZSBKUFAoYXJnbGlzdCkJYXJnbGlzdAotI2Vsc2UKLSNkZWZpbmUgSlBQKGFyZ2xpc3QpCSgpCi0jZW5kaWYKLQotCi0vKiBTaG9ydCBmb3JtcyBvZiBleHRlcm5hbCBuYW1lcyBmb3Igc3lzdGVtcyB3aXRoIGJyYWluLWRhbWFnZWQgbGlua2Vycy4KLSAqIFdlIHNob3J0ZW4gZXh0ZXJuYWwgbmFtZXMgdG8gYmUgdW5pcXVlIGluIHRoZSBmaXJzdCBzaXggbGV0dGVycywgd2hpY2gKLSAqIGlzIGdvb2QgZW5vdWdoIGZvciBhbGwga25vd24gc3lzdGVtcy4KLSAqIChJZiB5b3VyIGNvbXBpbGVyIGl0c2VsZiBuZWVkcyBuYW1lcyB0byBiZSB1bmlxdWUgaW4gbGVzcyB0aGFuIDE1IAotICogY2hhcmFjdGVycywgeW91IGFyZSBvdXQgb2YgbHVjay4gIEdldCBhIGJldHRlciBjb21waWxlci4pCi0gKi8KLQotI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLSNkZWZpbmUganBlZ19zdGRfZXJyb3IJCWpTdGRFcnJvcgotI2RlZmluZSBqcGVnX0NyZWF0ZUNvbXByZXNzCWpDcmVhQ29tcHJlc3MKLSNkZWZpbmUganBlZ19DcmVhdGVEZWNvbXByZXNzCWpDcmVhRGVjb21wcmVzcwotI2RlZmluZSBqcGVnX2Rlc3Ryb3lfY29tcHJlc3MJakRlc3RDb21wcmVzcwotI2RlZmluZSBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcwlqRGVzdERlY29tcHJlc3MKLSNkZWZpbmUganBlZ19zdGRpb19kZXN0CQlqU3RkRGVzdAotI2RlZmluZSBqcGVnX3N0ZGlvX3NyYwkJalN0ZFNyYwotI2RlZmluZSBqcGVnX3NldF9kZWZhdWx0cwlqU2V0RGVmYXVsdHMKLSNkZWZpbmUganBlZ19zZXRfY29sb3JzcGFjZQlqU2V0Q29sb3JzcGFjZQotI2RlZmluZSBqcGVnX2RlZmF1bHRfY29sb3JzcGFjZQlqRGVmQ29sb3JzcGFjZQotI2RlZmluZSBqcGVnX3NldF9xdWFsaXR5CWpTZXRRdWFsaXR5Ci0jZGVmaW5lIGpwZWdfc2V0X2xpbmVhcl9xdWFsaXR5CWpTZXRMUXVhbGl0eQotI2RlZmluZSBqcGVnX2FkZF9xdWFudF90YWJsZQlqQWRkUXVhbnRUYWJsZQotI2RlZmluZSBqcGVnX3F1YWxpdHlfc2NhbGluZwlqUXVhbGl0eVNjYWxpbmcKLSNkZWZpbmUganBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24JalNpbVByb2dyZXNzCi0jZGVmaW5lIGpwZWdfc3VwcHJlc3NfdGFibGVzCWpTdXBwcmVzc1RhYmxlcwotI2RlZmluZSBqcGVnX2FsbG9jX3F1YW50X3RhYmxlCWpBbGNRVGFibGUKLSNkZWZpbmUganBlZ19hbGxvY19odWZmX3RhYmxlCWpBbGNIVGFibGUKLSNkZWZpbmUganBlZ19zdGFydF9jb21wcmVzcwlqU3RydENvbXByZXNzCi0jZGVmaW5lIGpwZWdfd3JpdGVfc2NhbmxpbmVzCWpXcnRTY2FubGluZXMKLSNkZWZpbmUganBlZ19maW5pc2hfY29tcHJlc3MJakZpbkNvbXByZXNzCi0jZGVmaW5lIGpwZWdfd3JpdGVfcmF3X2RhdGEJaldydFJhd0RhdGEKLSNkZWZpbmUganBlZ193cml0ZV9tYXJrZXIJaldydE1hcmtlcgotI2RlZmluZSBqcGVnX3dyaXRlX21faGVhZGVyCWpXcnRNSGVhZGVyCi0jZGVmaW5lIGpwZWdfd3JpdGVfbV9ieXRlCWpXcnRNQnl0ZQotI2RlZmluZSBqcGVnX3dyaXRlX3RhYmxlcwlqV3J0VGFibGVzCi0jZGVmaW5lIGpwZWdfcmVhZF9oZWFkZXIJalJlYWRIZWFkZXIKLSNkZWZpbmUganBlZ19zdGFydF9kZWNvbXByZXNzCWpTdHJ0RGVjb21wcmVzcwotI2RlZmluZSBqcGVnX3JlYWRfc2NhbmxpbmVzCWpSZWFkU2NhbmxpbmVzCi0jZGVmaW5lIGpwZWdfZmluaXNoX2RlY29tcHJlc3MJakZpbkRlY29tcHJlc3MKLSNkZWZpbmUganBlZ19yZWFkX3Jhd19kYXRhCWpSZWFkUmF3RGF0YQotI2RlZmluZSBqcGVnX2hhc19tdWx0aXBsZV9zY2FucwlqSGFzTXVsdFNjbgotI2RlZmluZSBqcGVnX3N0YXJ0X291dHB1dAlqU3RydE91dHB1dAotI2RlZmluZSBqcGVnX2ZpbmlzaF9vdXRwdXQJakZpbk91dHB1dAotI2RlZmluZSBqcGVnX2lucHV0X2NvbXBsZXRlCWpJbkNvbXBsZXRlCi0jZGVmaW5lIGpwZWdfbmV3X2NvbG9ybWFwCWpOZXdDTWFwCi0jZGVmaW5lIGpwZWdfY29uc3VtZV9pbnB1dAlqQ29uc3VtZUlucHV0Ci0jZGVmaW5lIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucwlqQ2FsY0RpbWVuc2lvbnMKLSNkZWZpbmUganBlZ19zYXZlX21hcmtlcnMJalNhdmVNYXJrZXJzCi0jZGVmaW5lIGpwZWdfc2V0X21hcmtlcl9wcm9jZXNzb3IJalNldE1hcmtlcgotI2RlZmluZSBqcGVnX3JlYWRfY29lZmZpY2llbnRzCWpSZWFkQ29lZnMKLSNkZWZpbmUganBlZ193cml0ZV9jb2VmZmljaWVudHMJaldydENvZWZzCi0jZGVmaW5lIGpwZWdfY29weV9jcml0aWNhbF9wYXJhbWV0ZXJzCWpDb3B5Q3JpdAotI2RlZmluZSBqcGVnX2Fib3J0X2NvbXByZXNzCWpBYnJ0Q29tcHJlc3MKLSNkZWZpbmUganBlZ19hYm9ydF9kZWNvbXByZXNzCWpBYnJ0RGVjb21wcmVzcwotI2RlZmluZSBqcGVnX2Fib3J0CQlqQWJvcnQKLSNkZWZpbmUganBlZ19kZXN0cm95CQlqRGVzdHJveQotI2RlZmluZSBqcGVnX3Jlc3luY190b19yZXN0YXJ0CWpSZXN5bmNSZXN0YXJ0Ci0jZW5kaWYgLyogTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyAqLwotCi0KLS8qIERlZmF1bHQgZXJyb3ItbWFuYWdlbWVudCBzZXR1cCAqLwotRVhURVJOKHN0cnVjdCBqcGVnX2Vycm9yX21nciAqKSBqcGVnX3N0ZF9lcnJvcgotCUpQUCgoc3RydWN0IGpwZWdfZXJyb3JfbWdyICogZXJyKSk7Ci0KLS8qIEluaXRpYWxpemF0aW9uIG9mIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0cy4KLSAqIGpwZWdfY3JlYXRlX2NvbXByZXNzKCkgYW5kIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoKSBhcmUgdGhlIGV4cG9ydGVkCi0gKiBuYW1lcyB0aGF0IGFwcGxpY2F0aW9ucyBzaG91bGQgY2FsbC4gIFRoZXNlIGV4cGFuZCB0byBjYWxscyBvbgotICoganBlZ19DcmVhdGVDb21wcmVzcyBhbmQganBlZ19DcmVhdGVEZWNvbXByZXNzIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcGFzc2VkIGZvciB2ZXJzaW9uIG1pc21hdGNoIGNoZWNraW5nLgotICogTkI6IHlvdSBtdXN0IHNldCB1cCB0aGUgZXJyb3ItbWFuYWdlciBCRUZPUkUgY2FsbGluZyBqcGVnX2NyZWF0ZV94eHguCi0gKi8KLSNkZWZpbmUganBlZ19jcmVhdGVfY29tcHJlc3MoY2luZm8pIFwKLSAgICBqcGVnX0NyZWF0ZUNvbXByZXNzKChjaW5mbyksIEpQRUdfTElCX1ZFUlNJT04sIFwKLQkJCShzaXplX3QpIHNpemVvZihzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QpKQotI2RlZmluZSBqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKGNpbmZvKSBcCi0gICAganBlZ19DcmVhdGVEZWNvbXByZXNzKChjaW5mbyksIEpQRUdfTElCX1ZFUlNJT04sIFwKLQkJCSAgKHNpemVfdCkgc2l6ZW9mKHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KSkKLUVYVEVSTih2b2lkKSBqcGVnX0NyZWF0ZUNvbXByZXNzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJICAgICAgaW50IHZlcnNpb24sIHNpemVfdCBzdHJ1Y3RzaXplKSk7Ci1FWFRFUk4odm9pZCkganBlZ19DcmVhdGVEZWNvbXByZXNzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJaW50IHZlcnNpb24sIHNpemVfdCBzdHJ1Y3RzaXplKSk7Ci0vKiBEZXN0cnVjdGlvbiBvZiBKUEVHIGNvbXByZXNzaW9uIG9iamVjdHMgKi8KLUVYVEVSTih2b2lkKSBqcGVnX2Rlc3Ryb3lfY29tcHJlc3MgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotCi0jaWYgMAotLyogU3RhbmRhcmQgZGF0YSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG1hbmFnZXJzOiBzdGRpbyBzdHJlYW1zLiAqLwotLyogQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBvcGVuaW5nIHRoZSBmaWxlIGJlZm9yZSBhbmQgY2xvc2luZyBhZnRlci4gKi8KLUVYVEVSTih2b2lkKSBqcGVnX3N0ZGlvX2Rlc3QgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgRlhTWVNfRklMRSAqIG91dGZpbGUpKTsKLUVYVEVSTih2b2lkKSBqcGVnX3N0ZGlvX3NyYyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEZYU1lTX0ZJTEUgKiBpbmZpbGUpKTsKLSNlbmRpZgotCi0vKiBEZWZhdWx0IHBhcmFtZXRlciBzZXR1cCBmb3IgY29tcHJlc3Npb24gKi8KLUVYVEVSTih2b2lkKSBqcGVnX3NldF9kZWZhdWx0cyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0vKiBDb21wcmVzc2lvbiBwYXJhbWV0ZXIgc2V0dXAgYWlkcyAqLwotRVhURVJOKHZvaWQpIGpwZWdfc2V0X2NvbG9yc3BhY2UgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkgICAgICBKX0NPTE9SX1NQQUNFIGNvbG9yc3BhY2UpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2RlZmF1bHRfY29sb3JzcGFjZSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkganBlZ19zZXRfcXVhbGl0eSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgcXVhbGl0eSwKLQkJCQkgICBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKSk7Ci1FWFRFUk4odm9pZCkganBlZ19zZXRfbGluZWFyX3F1YWxpdHkgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICBpbnQgc2NhbGVfZmFjdG9yLAotCQkJCQkgIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2FkZF9xdWFudF90YWJsZSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgd2hpY2hfdGJsLAotCQkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgKmJhc2ljX3RhYmxlLAotCQkJCSAgICAgICBpbnQgc2NhbGVfZmFjdG9yLAotCQkJCSAgICAgICBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKSk7Ci1FWFRFUk4oaW50KSBqcGVnX3F1YWxpdHlfc2NhbGluZyBKUFAoKGludCBxdWFsaXR5KSk7Ci1FWFRFUk4odm9pZCkganBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24gSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGpwZWdfc3VwcHJlc3NfdGFibGVzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJICAgICAgIGJvb2xlYW4gc3VwcHJlc3MpKTsKLUVYVEVSTihKUVVBTlRfVEJMICopIGpwZWdfYWxsb2NfcXVhbnRfdGFibGUgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKLUVYVEVSTihKSFVGRl9UQkwgKikganBlZ19hbGxvY19odWZmX3RhYmxlIEpQUCgoal9jb21tb25fcHRyIGNpbmZvKSk7Ci0KLS8qIE1haW4gZW50cnkgcG9pbnRzIGZvciBjb21wcmVzc2lvbiAqLwotRVhURVJOKHZvaWQpIGpwZWdfc3RhcnRfY29tcHJlc3MgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkgICAgICBib29sZWFuIHdyaXRlX2FsbF90YWJsZXMpKTsKLUVYVEVSTihKRElNRU5TSU9OKSBqcGVnX3dyaXRlX3NjYW5saW5lcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgICAgIEpTQU1QQVJSQVkgc2NhbmxpbmVzLAotCQkJCQkgICAgIEpESU1FTlNJT04gbnVtX2xpbmVzKSk7Ci1FWFRFUk4odm9pZCkganBlZ19maW5pc2hfY29tcHJlc3MgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotCi0vKiBSZXBsYWNlcyBqcGVnX3dyaXRlX3NjYW5saW5lcyB3aGVuIHdyaXRpbmcgcmF3IGRvd25zYW1wbGVkIGRhdGEuICovCi1FWFRFUk4oSkRJTUVOU0lPTikganBlZ193cml0ZV9yYXdfZGF0YSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgICAgSlNBTVBJTUFHRSBkYXRhLAotCQkJCQkgICAgSkRJTUVOU0lPTiBudW1fbGluZXMpKTsKLQotLyogV3JpdGUgYSBzcGVjaWFsIG1hcmtlci4gIFNlZSBsaWJqcGVnLmRvYyBjb25jZXJuaW5nIHNhZmUgdXNhZ2UuICovCi1FWFRFUk4odm9pZCkganBlZ193cml0ZV9tYXJrZXIKLQlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyLAotCSAgICAgY29uc3QgSk9DVEVUICogZGF0YXB0ciwgdW5zaWduZWQgaW50IGRhdGFsZW4pKTsKLS8qIFNhbWUsIGJ1dCBwaWVjZW1lYWwuICovCi1FWFRFUk4odm9pZCkganBlZ193cml0ZV9tX2hlYWRlcgotCUpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXIsIHVuc2lnbmVkIGludCBkYXRhbGVuKSk7Ci1FWFRFUk4odm9pZCkganBlZ193cml0ZV9tX2J5dGUKLQlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgdmFsKSk7Ci0KLS8qIEFsdGVybmF0ZSBjb21wcmVzc2lvbiBmdW5jdGlvbjoganVzdCB3cml0ZSBhbiBhYmJyZXZpYXRlZCB0YWJsZSBmaWxlICovCi1FWFRFUk4odm9pZCkganBlZ193cml0ZV90YWJsZXMgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotCi0vKiBEZWNvbXByZXNzaW9uIHN0YXJ0dXA6IHJlYWQgc3RhcnQgb2YgSlBFRyBkYXRhc3RyZWFtIHRvIHNlZSB3aGF0J3MgdGhlcmUgKi8KLUVYVEVSTihpbnQpIGpwZWdfcmVhZF9oZWFkZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCSAgYm9vbGVhbiByZXF1aXJlX2ltYWdlKSk7Ci0vKiBSZXR1cm4gdmFsdWUgaXMgb25lIG9mOiAqLwotI2RlZmluZSBKUEVHX1NVU1BFTkRFRAkJMCAvKiBTdXNwZW5kZWQgZHVlIHRvIGxhY2sgb2YgaW5wdXQgZGF0YSAqLwotI2RlZmluZSBKUEVHX0hFQURFUl9PSwkJMSAvKiBGb3VuZCB2YWxpZCBpbWFnZSBkYXRhc3RyZWFtICovCi0jZGVmaW5lIEpQRUdfSEVBREVSX1RBQkxFU19PTkxZCTIgLyogRm91bmQgdmFsaWQgdGFibGUtc3BlY3Mtb25seSBkYXRhc3RyZWFtICovCi0vKiBJZiB5b3UgcGFzcyByZXF1aXJlX2ltYWdlID0gVFJVRSAobm9ybWFsIGNhc2UpLCB5b3UgbmVlZCBub3QgY2hlY2sgZm9yCi0gKiBhIFRBQkxFU19PTkxZIHJldHVybiBjb2RlOyBhbiBhYmJyZXZpYXRlZCBmaWxlIHdpbGwgY2F1c2UgYW4gZXJyb3IgZXhpdC4KLSAqIEpQRUdfU1VTUEVOREVEIGlzIG9ubHkgcG9zc2libGUgaWYgeW91IHVzZSBhIGRhdGEgc291cmNlIG1vZHVsZSB0aGF0IGNhbgotICogZ2l2ZSBhIHN1c3BlbnNpb24gcmV0dXJuICh0aGUgc3RkaW8gc291cmNlIG1vZHVsZSBkb2Vzbid0KS4KLSAqLwotCi0vKiBNYWluIGVudHJ5IHBvaW50cyBmb3IgZGVjb21wcmVzc2lvbiAqLwotRVhURVJOKGJvb2xlYW4pIGpwZWdfc3RhcnRfZGVjb21wcmVzcyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTihKRElNRU5TSU9OKSBqcGVnX3JlYWRfc2NhbmxpbmVzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICAgIEpTQU1QQVJSQVkgc2NhbmxpbmVzLAotCQkJCQkgICAgSkRJTUVOU0lPTiBtYXhfbGluZXMpKTsKLUVYVEVSTihib29sZWFuKSBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotCi0vKiBSZXBsYWNlcyBqcGVnX3JlYWRfc2NhbmxpbmVzIHdoZW4gcmVhZGluZyByYXcgZG93bnNhbXBsZWQgZGF0YS4gKi8KLUVYVEVSTihKRElNRU5TSU9OKSBqcGVnX3JlYWRfcmF3X2RhdGEgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgICBKU0FNUElNQUdFIGRhdGEsCi0JCQkJCSAgIEpESU1FTlNJT04gbWF4X2xpbmVzKSk7Ci0KLS8qIEFkZGl0aW9uYWwgZW50cnkgcG9pbnRzIGZvciBidWZmZXJlZC1pbWFnZSBtb2RlLiAqLwotRVhURVJOKGJvb2xlYW4pIGpwZWdfaGFzX211bHRpcGxlX3NjYW5zIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKGJvb2xlYW4pIGpwZWdfc3RhcnRfb3V0cHV0IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkgICAgICAgaW50IHNjYW5fbnVtYmVyKSk7Ci1FWFRFUk4oYm9vbGVhbikganBlZ19maW5pc2hfb3V0cHV0IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKGJvb2xlYW4pIGpwZWdfaW5wdXRfY29tcGxldGUgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkganBlZ19uZXdfY29sb3JtYXAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4oaW50KSBqcGVnX2NvbnN1bWVfaW5wdXQgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0vKiBSZXR1cm4gdmFsdWUgaXMgb25lIG9mOiAqLwotLyogI2RlZmluZSBKUEVHX1NVU1BFTkRFRAkwICAgIFN1c3BlbmRlZCBkdWUgdG8gbGFjayBvZiBpbnB1dCBkYXRhICovCi0jZGVmaW5lIEpQRUdfUkVBQ0hFRF9TT1MJMSAvKiBSZWFjaGVkIHN0YXJ0IG9mIG5ldyBzY2FuICovCi0jZGVmaW5lIEpQRUdfUkVBQ0hFRF9FT0kJMiAvKiBSZWFjaGVkIGVuZCBvZiBpbWFnZSAqLwotI2RlZmluZSBKUEVHX1JPV19DT01QTEVURUQJMyAvKiBDb21wbGV0ZWQgb25lIGlNQ1Ugcm93ICovCi0jZGVmaW5lIEpQRUdfU0NBTl9DT01QTEVURUQJNCAvKiBDb21wbGV0ZWQgbGFzdCBpTUNVIHJvdyBvZiBhIHNjYW4gKi8KLQotLyogUHJlY2FsY3VsYXRlIG91dHB1dCBkaW1lbnNpb25zIGZvciBjdXJyZW50IGRlY29tcHJlc3Npb24gcGFyYW1ldGVycy4gKi8KLUVYVEVSTih2b2lkKSBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLS8qIENvbnRyb2wgc2F2aW5nIG9mIENPTSBhbmQgQVBQbiBtYXJrZXJzIGludG8gbWFya2VyX2xpc3QuICovCi1FWFRFUk4odm9pZCkganBlZ19zYXZlX21hcmtlcnMKLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXJfY29kZSwKLQkgICAgIHVuc2lnbmVkIGludCBsZW5ndGhfbGltaXQpKTsKLQotLyogSW5zdGFsbCBhIHNwZWNpYWwgcHJvY2Vzc2luZyBtZXRob2QgZm9yIENPTSBvciBBUFBuIG1hcmtlcnMuICovCi1FWFRFUk4odm9pZCkganBlZ19zZXRfbWFya2VyX3Byb2Nlc3NvcgotCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlcl9jb2RlLAotCSAgICAganBlZ19tYXJrZXJfcGFyc2VyX21ldGhvZCByb3V0aW5lKSk7Ci0KLS8qIFJlYWQgb3Igd3JpdGUgcmF3IERDVCBjb2VmZmljaWVudHMgLS0tIHVzZWZ1bCBmb3IgbG9zc2xlc3MgdHJhbnNjb2RpbmcuICovCi1FWFRFUk4oanZpcnRfYmFycmF5X3B0ciAqKSBqcGVnX3JlYWRfY29lZmZpY2llbnRzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAganZpcnRfYmFycmF5X3B0ciAqIGNvZWZfYXJyYXlzKSk7Ci1FWFRFUk4odm9pZCkganBlZ19jb3B5X2NyaXRpY2FsX3BhcmFtZXRlcnMgSlBQKChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sCi0JCQkJCQlqX2NvbXByZXNzX3B0ciBkc3RpbmZvKSk7Ci0KLS8qIElmIHlvdSBjaG9vc2UgdG8gYWJvcnQgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBiZWZvcmUgY29tcGxldGluZwotICoganBlZ19maW5pc2hfKGRlKWNvbXByZXNzLCB0aGVuIHlvdSBuZWVkIHRvIGNsZWFuIHVwIHRvIHJlbGVhc2UgbWVtb3J5LAotICogdGVtcG9yYXJ5IGZpbGVzLCBldGMuICBZb3UgY2FuIGp1c3QgY2FsbCBqcGVnX2Rlc3Ryb3lfKGRlKWNvbXByZXNzCi0gKiBpZiB5b3UncmUgZG9uZSB3aXRoIHRoZSBKUEVHIG9iamVjdCwgYnV0IGlmIHlvdSB3YW50IHRvIGNsZWFuIGl0IHVwIGFuZAotICogcmV1c2UgaXQsIGNhbGwgdGhpczoKLSAqLwotRVhURVJOKHZvaWQpIGpwZWdfYWJvcnRfY29tcHJlc3MgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGpwZWdfYWJvcnRfZGVjb21wcmVzcyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLQotLyogR2VuZXJpYyB2ZXJzaW9ucyBvZiBqcGVnX2Fib3J0IGFuZCBqcGVnX2Rlc3Ryb3kgdGhhdCB3b3JrIG9uIGVpdGhlcgotICogZmxhdm9yIG9mIEpQRUcgb2JqZWN0LiAgVGhlc2UgbWF5IGJlIG1vcmUgY29udmVuaWVudCBpbiBzb21lIHBsYWNlcy4KLSAqLwotRVhURVJOKHZvaWQpIGpwZWdfYWJvcnQgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqcGVnX2Rlc3Ryb3kgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKLQotLyogRGVmYXVsdCByZXN0YXJ0LW1hcmtlci1yZXN5bmMgcHJvY2VkdXJlIGZvciB1c2UgYnkgZGF0YSBzb3VyY2UgbW9kdWxlcyAqLwotRVhURVJOKGJvb2xlYW4pIGpwZWdfcmVzeW5jX3RvX3Jlc3RhcnQgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgICAgaW50IGRlc2lyZWQpKTsKLQotCi0vKiBUaGVzZSBtYXJrZXIgY29kZXMgYXJlIGV4cG9ydGVkIHNpbmNlIGFwcGxpY2F0aW9ucyBhbmQgZGF0YSBzb3VyY2UgbW9kdWxlcwotICogYXJlIGxpa2VseSB0byB3YW50IHRvIHVzZSB0aGVtLgotICovCi0KLSNkZWZpbmUgSlBFR19SU1QwCTB4RDAJLyogUlNUMCBtYXJrZXIgY29kZSAqLwotI2RlZmluZSBKUEVHX0VPSQkweEQ5CS8qIEVPSSBtYXJrZXIgY29kZSAqLwotI2RlZmluZSBKUEVHX0FQUDAJMHhFMAkvKiBBUFAwIG1hcmtlciBjb2RlICovCi0jZGVmaW5lIEpQRUdfQ09NCTB4RkUJLyogQ09NIG1hcmtlciBjb2RlICovCi0KLQotLyogSWYgd2UgaGF2ZSBhIGJyYWluLWRhbWFnZWQgY29tcGlsZXIgdGhhdCBlbWl0cyB3YXJuaW5ncyAob3Igd29yc2UsIGVycm9ycykKLSAqIGZvciBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgdGhhdCBhcmUgbmV2ZXIgZmlsbGVkIGluLCBrZWVwIGl0IHF1aWV0IGJ5Ci0gKiBzdXBwbHlpbmcgZHVtbXkgZGVmaW5pdGlvbnMgZm9yIHRoZSB2YXJpb3VzIHN1YnN0cnVjdHVyZXMuCi0gKi8KLQotI2lmZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCi0jaWZuZGVmIEpQRUdfSU5URVJOQUxTCQkvKiB3aWxsIGJlIGRlZmluZWQgaW4ganBlZ2ludC5oICovCi1zdHJ1Y3QganZpcnRfc2FycmF5X2NvbnRyb2wgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGp2aXJ0X2JhcnJheV9jb250cm9sIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2NvbXBfbWFzdGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2NfbWFpbl9jb250cm9sbGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2NfcHJlcF9jb250cm9sbGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX21hcmtlcl93cml0ZXIgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfY29sb3JfY29udmVydGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2Rvd25zYW1wbGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2ZvcndhcmRfZGN0IHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19kZWNvbXBfbWFzdGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2RfbWFpbl9jb250cm9sbGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2RfY29lZl9jb250cm9sbGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2RfcG9zdF9jb250cm9sbGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2lucHV0X2NvbnRyb2xsZXIgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfbWFya2VyX3JlYWRlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19lbnRyb3B5X2RlY29kZXIgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfaW52ZXJzZV9kY3QgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfdXBzYW1wbGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2NvbG9yX2RlY29udmVydGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2NvbG9yX3F1YW50aXplciB7IGxvbmcgZHVtbXk7IH07Ci0jZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KLSNlbmRpZiAvKiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTiAqLwotCi0KLS8qCi0gKiBUaGUgSlBFRyBsaWJyYXJ5IG1vZHVsZXMgZGVmaW5lIEpQRUdfSU5URVJOQUxTIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmaWxlLgotICogVGhlIGludGVybmFsIHN0cnVjdHVyZSBkZWNsYXJhdGlvbnMgYXJlIHJlYWQgb25seSB3aGVuIHRoYXQgaXMgdHJ1ZS4KLSAqIEFwcGxpY2F0aW9ucyB1c2luZyB0aGUgbGlicmFyeSBzaG91bGQgbm90IGluY2x1ZGUganBlZ2ludC5oLCBidXQgbWF5IHdpc2gKLSAqIHRvIGluY2x1ZGUgamVycm9yLmguCi0gKi8KLQotI2lmZGVmIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAianBlZ2ludC5oIgkJLyogZmV0Y2ggcHJpdmF0ZSBkZWNsYXJhdGlvbnMgKi8KLSNpbmNsdWRlICJqZXJyb3IuaCIJCS8qIGZldGNoIGVycm9yIGNvZGVzIHRvbyAqLwotI2VuZGlmCi0KLSNlbmRpZiAvKiBKUEVHTElCX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9tYWtlZmlsZSBiL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9tYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc3ZDgzYi4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvbWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZXMgPSBmcGRmYXBpX2pjYXBpbWluLmMgZnBkZmFwaV9qY2FwaXN0ZC5jIGZwZGZhcGlfamNjb2VmY3QuYyBmcGRmYXBpX2pjY29sb3IuYyBmcGRmYXBpX2pjZGN0bWdyLmMgZnBkZmFwaV9qY2h1ZmYuYyBmcGRmYXBpX2pjaW5pdC5jIGZwZGZhcGlfamNtYWluY3QuYyBmcGRmYXBpX2pjbWFya2VyLmMgZnBkZmFwaV9qY21hc3Rlci5jIFwKLQlmcGRmYXBpX2pjb21hcGkuYyBmcGRmYXBpX2pjcGFyYW0uYyBmcGRmYXBpX2pjcGh1ZmYuYyBmcGRmYXBpX2pjcHJlcGN0LmMgZnBkZmFwaV9qY3NhbXBsZS5jIGZwZGZhcGlfamN0cmFucy5jIGZwZGZhcGlfamRhcGltaW4uYyBmcGRmYXBpX2pkYXBpc3RkLmMgZnBkZmFwaV9qZGNvZWZjdC5jIFwKLQkgZnBkZmFwaV9qZGNvbG9yLmMgZnBkZmFwaV9qZGRjdG1nci5jIGZwZGZhcGlfamRodWZmLmMgZnBkZmFwaV9qZGlucHV0LmMgZnBkZmFwaV9qZG1haW5jdC5jIGZwZGZhcGlfamRtYXJrZXIuYyBmcGRmYXBpX2pkbWFzdGVyLmMgZnBkZmFwaV9qZG1lcmdlLmMgZnBkZmFwaV9qZHBodWZmLmMgZnBkZmFwaV9qZHBvc3RjdC5jIGZwZGZhcGlfamRzYW1wbGUuYyBcCi0JIGZwZGZhcGlfamR0cmFucy5jIGZwZGZhcGlfamVycm9yLmMgZnBkZmFwaV9qZmRjdGZzdC5jIGZwZGZhcGlfamZkY3RpbnQuYyBmcGRmYXBpX2pjYXBpbWluLmMgZnBkZmFwaV9qaWRjdGZzdC5jIGZwZGZhcGlfamlkY3RpbnQuYyBmcGRmYXBpX2ppZGN0cmVkLmMgZnBkZmFwaV9qbWVtbWdyLmMgXAotCSBmcGRmYXBpX2ptZW1ub2JzLmMgZnBkZmFwaV9qdXRpbHMuYwotYXJtc291cmNlcz0kKHNvdXJjZXMpCi1hcm1zb3VyY2VzYz0kKHNvdXJjZXMpCi1pbmNsdWRlIC4uLy4uL3NyYy9tYWtlZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZXh0ZW5zaW9uLmggYi9jb3JlL3NyYy9meGNydC9leHRlbnNpb24uaAppbmRleCBlNjc4Y2JiLi42ZTc5OWViIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9leHRlbnNpb24uaAorKysgYi9jb3JlL3NyYy9meGNydC9leHRlbnNpb24uaApAQCAtNyw0MzEgKzcsMzI2IEBACiAjaWZuZGVmIENPUkVfU1JDX0ZYQ1JUX0VYVEVOU0lPTl9IXwogI2RlZmluZSBDT1JFX1NSQ19GWENSVF9FWFRFTlNJT05fSF8KIAotI2luY2x1ZGUgImZ4X3NhZmVfdHlwZXMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CiAKLWNsYXNzIElGWENSVF9GaWxlQWNjZXNzCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+SUZYQ1JUX0ZpbGVBY2Nlc3MoKSB7fQotICAgIHZpcnR1YWwgRlhfQk9PTAkJT3BlbihGWF9CU1RSIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpID0gMDsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9wZW4oRlhfV1NUUiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkCQlDbG9zZSgpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKSA9IDA7Ci0gICAgdmlydHVhbCBGWF9GSUxFU0laRQlHZXRTaXplKCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJR2V0UG9zaXRpb24oKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBGWF9GSUxFU0laRQlTZXRQb3NpdGlvbihGWF9GSUxFU0laRSBwb3MpID0gMDsKLSAgICB2aXJ0dWFsIHNpemVfdAkJUmVhZCh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpID0gMDsKLSAgICB2aXJ0dWFsIHNpemVfdAkJV3JpdGUoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKSA9IDA7Ci0gICAgdmlydHVhbCBzaXplX3QJCVJlYWRQb3Modm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpID0gMDsKLSAgICB2aXJ0dWFsIHNpemVfdAkJV3JpdGVQb3MoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpID0gMDsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUZsdXNoKCkgPSAwOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJVHJ1bmNhdGUoRlhfRklMRVNJWkUgc3pGaWxlKSA9IDA7CisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCIKKworY2xhc3MgSUZYQ1JUX0ZpbGVBY2Nlc3MgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SUZYQ1JUX0ZpbGVBY2Nlc3MoKSB7fQorICB2aXJ0dWFsIEZYX0JPT0wgT3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIE9wZW4oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBDbG9zZSgpID0gMDsKKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7CisgIHZpcnR1YWwgRlhfRklMRVNJWkUgR2V0U2l6ZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBGWF9GSUxFU0laRSBHZXRQb3NpdGlvbigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBGWF9GSUxFU0laRSBTZXRQb3NpdGlvbihGWF9GSUxFU0laRSBwb3MpID0gMDsKKyAgdmlydHVhbCBzaXplX3QgUmVhZCh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpID0gMDsKKyAgdmlydHVhbCBzaXplX3QgV3JpdGUoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKSA9IDA7CisgIHZpcnR1YWwgc2l6ZV90IFJlYWRQb3Modm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpID0gMDsKKyAgdmlydHVhbCBzaXplX3QgV3JpdGVQb3MoY29uc3Qgdm9pZCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHN6QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBwb3MpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIEZsdXNoKCkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgVHJ1bmNhdGUoRlhfRklMRVNJWkUgc3pGaWxlKSA9IDA7CiB9OwotSUZYQ1JUX0ZpbGVBY2Nlc3MqCUZYQ1JUX0ZpbGVBY2Nlc3NfQ3JlYXRlKCk7Ci1jbGFzcyBDRlhfQ1JURmlsZVN0cmVhbSBGWF9GSU5BTCA6IHB1YmxpYyBJRlhfRmlsZVN0cmVhbQotewotcHVibGljOgotICAgIENGWF9DUlRGaWxlU3RyZWFtKElGWENSVF9GaWxlQWNjZXNzKiBwRkEpIDogbV9wRmlsZShwRkEpLCBtX2R3Q291bnQoMSksIG1fYlVzZVJhbmdlKEZBTFNFKSwgbV9uT2Zmc2V0KDApLCBtX25TaXplKDApIHt9Ci0gICAgfkNGWF9DUlRGaWxlU3RyZWFtKCkKLSAgICB7Ci0gICAgICAgIGlmIChtX3BGaWxlKSB7Ci0gICAgICAgICAgICBtX3BGaWxlLT5SZWxlYXNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdmlydHVhbCBJRlhfRmlsZVN0cmVhbSoJCVJldGFpbigpIEZYX09WRVJSSURFCi0gICAgewotICAgICAgICBtX2R3Q291bnQgKys7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJUmVsZWFzZSgpIEZYX09WRVJSSURFCi0gICAgewotICAgICAgICBGWF9EV09SRCBuQ291bnQgPSAtLSBtX2R3Q291bnQ7Ci0gICAgICAgIGlmICghbkNvdW50KSB7Ci0gICAgICAgICAgICBkZWxldGUgdGhpczsKLSAgICAgICAgfQotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCQkJR2V0U2l6ZSgpIEZYX09WRVJSSURFCi0gICAgewotICAgICAgICByZXR1cm4gbV9iVXNlUmFuZ2UgPyBtX25TaXplIDogbV9wRmlsZS0+R2V0U2l6ZSgpOwotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQkJSXNFT0YoKSBGWF9PVkVSUklERQotICAgIHsKLSAgICAgICAgcmV0dXJuIEdldFBvc2l0aW9uKCkgPj0gR2V0U2l6ZSgpOwotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCQkJR2V0UG9zaXRpb24oKSBGWF9PVkVSUklERQotICAgIHsKLSAgICAgICAgRlhfRklMRVNJWkUgcG9zID0gbV9wRmlsZS0+R2V0UG9zaXRpb24oKTsKLSAgICAgICAgaWYgKG1fYlVzZVJhbmdlKSB7Ci0gICAgICAgICAgICBwb3MgLT0gbV9uT2Zmc2V0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwb3M7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlTZXRSYW5nZShGWF9GSUxFU0laRSBvZmZzZXQsIEZYX0ZJTEVTSVpFIHNpemUpIEZYX09WRVJSSURFCi0gICAgewotICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBzaXplIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgIAotICAgICAgICBGWF9TQUZFX0ZJTEVTSVpFIHBvcyA9IHNpemU7Ci0gICAgICAgIHBvcyArPSBvZmZzZXQ7CitJRlhDUlRfRmlsZUFjY2VzcyogRlhDUlRfRmlsZUFjY2Vzc19DcmVhdGUoKTsKIAotICAgICAgICBpZiAoIXBvcy5Jc1ZhbGlkKCkgfHwgcG9zLlZhbHVlT3JEaWUoKSA+IG1fcEZpbGUtPkdldFNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK2NsYXNzIENGWF9DUlRGaWxlQWNjZXNzIDogcHVibGljIElGWF9GaWxlQWNjZXNzIHsKKyBwdWJsaWM6CisgIENGWF9DUlRGaWxlQWNjZXNzKCkgOiBtX1JlZkNvdW50KDApIHt9CiAKLSAgICAgICAgbV9uT2Zmc2V0ID0gb2Zmc2V0LCBtX25TaXplID0gc2l6ZTsKLSAgICAgICAgbV9iVXNlUmFuZ2UgPSBUUlVFOwotICAgICAgICBtX3BGaWxlLT5TZXRQb3NpdGlvbihtX25PZmZzZXQpOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgdmlydHVhbCB2b2lkCQkJCUNsZWFyUmFuZ2UoKSBGWF9PVkVSUklERQotICAgIHsKLSAgICAgICAgbV9iVXNlUmFuZ2UgPSBGQUxTRTsKLSAgICB9Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJCVJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpIEZYX09WRVJSSURFCi0gICAgewotICAgICAgICBpZiAobV9iVXNlUmFuZ2UgJiYgb2Zmc2V0IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIEZYX1NBRkVfRklMRVNJWkUgcG9zID0gb2Zmc2V0OworICAvLyBJRlhfRmlsZUFjY2VzcworICB2b2lkIFJlbGVhc2UoKSBvdmVycmlkZSB7CisgICAgaWYgKC0tbV9SZWZDb3VudCA9PSAwKQorICAgICAgZGVsZXRlIHRoaXM7CisgIH0KIAotICAgICAgICBpZiAobV9iVXNlUmFuZ2UpIHsKLSAgICAgICAgICAgIHBvcyArPSBtX25PZmZzZXQ7Ci0gICAgICAgICAgICBpZiAoIXBvcy5Jc1ZhbGlkKCkgfHwgcG9zLlZhbHVlT3JEaWUoKSA+IChzaXplX3QpR2V0U2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoRlhfQk9PTCltX3BGaWxlLT5SZWFkUG9zKGJ1ZmZlciwgc2l6ZSwgcG9zLlZhbHVlT3JEaWUoKSk7Ci0gICAgfQotICAgIHZpcnR1YWwgc2l6ZV90CQkJCVJlYWRCbG9jayh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSBGWF9PVkVSUklERQotICAgIHsKLSAgICAgICAgaWYgKG1fYlVzZVJhbmdlKSB7Ci0gICAgICAgICAgICBGWF9GSUxFU0laRSBhdmFpbFNpemUgPSBtX25PZmZzZXQgKyBtX25TaXplIC0gbV9wRmlsZS0+R2V0UG9zaXRpb24oKTsKLSAgICAgICAgICAgIGlmICgoc2l6ZV90KWF2YWlsU2l6ZSA8IHNpemUpIHsKLSAgICAgICAgICAgICAgICBzaXplIC09IHNpemUgLSAoc2l6ZV90KWF2YWlsU2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbV9wRmlsZS0+UmVhZChidWZmZXIsIHNpemUpOwotICAgIH0KLSAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJV3JpdGVCbG9jayhjb25zdCB2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpIEZYX09WRVJSSURFCi0gICAgewotICAgICAgICBpZiAobV9iVXNlUmFuZ2UpIHsKLSAgICAgICAgICAgIG9mZnNldCArPSBtX25PZmZzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChGWF9CT09MKW1fcEZpbGUtPldyaXRlUG9zKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KTsKLSAgICB9Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJCUZsdXNoKCkgIEZYX09WRVJSSURFCi0gICAgewotICAgICAgICByZXR1cm4gbV9wRmlsZS0+Rmx1c2goKTsKLSAgICB9Ci0gICAgSUZYQ1JUX0ZpbGVBY2Nlc3MqCW1fcEZpbGU7Ci0gICAgRlhfRFdPUkQJCQltX2R3Q291bnQ7Ci0gICAgRlhfQk9PTAkJCQltX2JVc2VSYW5nZTsKLSAgICBGWF9GSUxFU0laRQkJCW1fbk9mZnNldDsKLSAgICBGWF9GSUxFU0laRQkJCW1fblNpemU7CisgIElGWF9GaWxlQWNjZXNzKiBSZXRhaW4oKSBvdmVycmlkZSB7CisgICAgbV9SZWZDb3VudCsrOworICAgIHJldHVybiAoSUZYX0ZpbGVBY2Nlc3MqKXRoaXM7CisgIH0KKworICB2b2lkIEdldFBhdGgoQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0aCkgb3ZlcnJpZGUgeyB3c1BhdGggPSBtX3BhdGg7IH0KKworICBJRlhfRmlsZVN0cmVhbSogQ3JlYXRlRmlsZVN0cmVhbShGWF9EV09SRCBkd01vZGVzKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEZYX0NyZWF0ZUZpbGVTdHJlYW0obV9wYXRoLCBkd01vZGVzKTsKKyAgfQorCisgIEZYX0JPT0wgSW5pdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzUGF0aCkgeworICAgIG1fcGF0aCA9IHdzUGF0aDsKKyAgICBtX1JlZkNvdW50ID0gMTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgcHJvdGVjdGVkOgorICBDRlhfV2lkZVN0cmluZyBtX3BhdGg7CisgIEZYX0RXT1JEIG1fUmVmQ291bnQ7CiB9OwotI2RlZmluZSBGWF9NRU1TVFJFQU1fQmxvY2tTaXplCQkoNjQgKiAxMDI0KQotI2RlZmluZSBGWF9NRU1TVFJFQU1fQ29uc2VjdXRpdmUJMHgwMQotI2RlZmluZSBGWF9NRU1TVFJFQU1fVGFrZU92ZXIJCTB4MDIKLWNsYXNzIENGWF9NZW1vcnlTdHJlYW0gRlhfRklOQUwgOiBwdWJsaWMgSUZYX01lbW9yeVN0cmVhbQotewotcHVibGljOgotICAgIENGWF9NZW1vcnlTdHJlYW0oRlhfQk9PTCBiQ29uc2VjdXRpdmUpCi0gICAgICAgIDogbV9kd0NvdW50KDEpCi0gICAgICAgICwgbV9uVG90YWxTaXplKDApCi0gICAgICAgICwgbV9uQ3VyU2l6ZSgwKQotICAgICAgICAsIG1fbkN1clBvcygwKQotICAgICAgICAsIG1fbkdyb3dTaXplKEZYX01FTVNUUkVBTV9CbG9ja1NpemUpCi0gICAgICAgICwgbV9iVXNlUmFuZ2UoRkFMU0UpCi0gICAgewotICAgICAgICBtX2R3RmxhZ3MgPSBGWF9NRU1TVFJFQU1fVGFrZU92ZXIgfCAoYkNvbnNlY3V0aXZlID8gRlhfTUVNU1RSRUFNX0NvbnNlY3V0aXZlIDogMCk7Ci0gICAgfQotICAgIENGWF9NZW1vcnlTdHJlYW0oRlhfTFBCWVRFIHBCdWZmZXIsIHNpemVfdCBuU2l6ZSwgRlhfQk9PTCBiVGFrZU92ZXIpCi0gICAgICAgIDogbV9kd0NvdW50KDEpCi0gICAgICAgICwgbV9uVG90YWxTaXplKG5TaXplKQotICAgICAgICAsIG1fbkN1clNpemUoblNpemUpCi0gICAgICAgICwgbV9uQ3VyUG9zKDApCi0gICAgICAgICwgbV9uR3Jvd1NpemUoRlhfTUVNU1RSRUFNX0Jsb2NrU2l6ZSkKLSAgICAgICAgLCBtX2JVc2VSYW5nZShGQUxTRSkKLSAgICB7Ci0gICAgICAgIG1fQmxvY2tzLkFkZChwQnVmZmVyKTsKLSAgICAgICAgbV9kd0ZsYWdzID0gRlhfTUVNU1RSRUFNX0NvbnNlY3V0aXZlIHwgKGJUYWtlT3ZlciA/IEZYX01FTVNUUkVBTV9UYWtlT3ZlciA6IDApOwotICAgIH0KLSAgICB+Q0ZYX01lbW9yeVN0cmVhbSgpCi0gICAgewotICAgICAgICBpZiAobV9kd0ZsYWdzICYgRlhfTUVNU1RSRUFNX1Rha2VPdmVyKSB7Ci0gICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgbV9CbG9ja3MuR2V0U2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBGWF9GcmVlKChGWF9MUEJZVEUpbV9CbG9ja3NbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1fQmxvY2tzLlJlbW92ZUFsbCgpOwotICAgIH0KLSAgICB2aXJ0dWFsIElGWF9GaWxlU3RyZWFtKgkJUmV0YWluKCkgIEZYX09WRVJSSURFCi0gICAgewotICAgICAgICBtX2R3Q291bnQgKys7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJUmVsZWFzZSgpICBGWF9PVkVSUklERQotICAgIHsKLSAgICAgICAgRlhfRFdPUkQgbkNvdW50ID0gLS0gbV9kd0NvdW50OwotICAgICAgICBpZiAobkNvdW50KSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCQlHZXRTaXplKCkgIEZYX09WRVJSSURFCi0gICAgewotICAgICAgICByZXR1cm4gbV9iVXNlUmFuZ2UgPyAoRlhfRklMRVNJWkUpIG1fblNpemUgOiAoRlhfRklMRVNJWkUpbV9uQ3VyU2l6ZTsKLSAgICB9Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJCUlzRU9GKCkgIEZYX09WRVJSSURFCi0gICAgewotICAgICAgICByZXR1cm4gbV9uQ3VyUG9zID49IChzaXplX3QpR2V0U2l6ZSgpOwotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCQkJR2V0UG9zaXRpb24oKSAgRlhfT1ZFUlJJREUKLSAgICB7Ci0gICAgICAgIEZYX0ZJTEVTSVpFIHBvcyA9IChGWF9GSUxFU0laRSltX25DdXJQb3M7Ci0gICAgICAgIGlmIChtX2JVc2VSYW5nZSkgewotICAgICAgICAgICAgcG9zIC09IChGWF9GSUxFU0laRSltX25PZmZzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBvczsKLSAgICB9Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJCVNldFJhbmdlKEZYX0ZJTEVTSVpFIG9mZnNldCwgRlhfRklMRVNJWkUgc2l6ZSkgIEZYX09WRVJSSURFCi0gICAgewotICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBzaXplIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIEZYX1NBRkVfRklMRVNJWkUgcmFuZ2UgPSBzaXplOwotICAgICAgICByYW5nZSArPSBvZmZzZXQ7Ci0gICAgICAgIGlmICghcmFuZ2UuSXNWYWxpZCgpIHx8IHJhbmdlLlZhbHVlT3JEaWUoKSA+IG1fbkN1clNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbV9uT2Zmc2V0ID0gKHNpemVfdClvZmZzZXQsIG1fblNpemUgPSAoc2l6ZV90KXNpemU7Ci0gICAgICAgIG1fYlVzZVJhbmdlID0gVFJVRTsKLSAgICAgICAgbV9uQ3VyUG9zID0gbV9uT2Zmc2V0OwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgdmlydHVhbCB2b2lkCQkJCUNsZWFyUmFuZ2UoKSAgRlhfT1ZFUlJJREUKLSAgICB7Ci0gICAgICAgIG1fYlVzZVJhbmdlID0gRkFMU0U7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSAgRlhfT1ZFUlJJREUKLSAgICB7Ci0gICAgICAgIGlmICghYnVmZmVyIHx8ICFzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAotICAgICAgICBGWF9TQUZFX0ZJTEVTSVpFIHNhZmVPZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgIGlmIChtX2JVc2VSYW5nZSkgewotICAgICAgICAgICAgc2FmZU9mZnNldCArPSBtX25PZmZzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgIAotICAgICAgICBpZiAoIXNhZmVPZmZzZXQuSXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KK2NsYXNzIENGWF9DUlRGaWxlU3RyZWFtIGZpbmFsIDogcHVibGljIElGWF9GaWxlU3RyZWFtIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENGWF9DUlRGaWxlU3RyZWFtKElGWENSVF9GaWxlQWNjZXNzKiBwRkEpOworICB+Q0ZYX0NSVEZpbGVTdHJlYW0oKSBvdmVycmlkZTsKIAotICAgICAgICBvZmZzZXQgPSBzYWZlT2Zmc2V0LlZhbHVlT3JEaWUoKTsKKyAgLy8gSUZYX0ZpbGVTdHJlYW06CisgIElGWF9GaWxlU3RyZWFtKiBSZXRhaW4oKSBvdmVycmlkZTsKKyAgdm9pZCBSZWxlYXNlKCkgb3ZlcnJpZGU7CisgIEZYX0ZJTEVTSVpFIEdldFNpemUoKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBJc0VPRigpIG92ZXJyaWRlOworICBGWF9GSUxFU0laRSBHZXRQb3NpdGlvbigpIG92ZXJyaWRlOworICBGWF9CT09MIFJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICBzaXplX3QgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICBGWF9CT09MIFdyaXRlQmxvY2soY29uc3Qgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICBGWF9CT09MIEZsdXNoKCkgb3ZlcnJpZGU7CiAKLSAgICAgICAgRlhfU0FGRV9TSVpFX1QgbmV3UG9zID0gc2l6ZTsKLSAgICAgICAgbmV3UG9zICs9IG9mZnNldDsKLSAgICAgICAgaWYgKCFuZXdQb3MuSXNWYWxpZCgpIHx8IG5ld1Bvcy5WYWx1ZU9yRGVmYXVsdCgwKSA9PSAwIHx8IG5ld1Bvcy5WYWx1ZU9yRGllKCkgPiBtX25DdXJTaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBtX25DdXJQb3MgPSBuZXdQb3MuVmFsdWVPckRpZSgpOwotICAgICAgICBpZiAobV9kd0ZsYWdzICYgRlhfTUVNU1RSRUFNX0NvbnNlY3V0aXZlKSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkzMihidWZmZXIsIChGWF9MUEJZVEUpbV9CbG9ja3NbMF0gKyAoc2l6ZV90KW9mZnNldCwgc2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBzaXplX3QgblN0YXJ0QmxvY2sgPSAoc2l6ZV90KW9mZnNldCAvIG1fbkdyb3dTaXplOwotICAgICAgICBvZmZzZXQgLT0gKEZYX0ZJTEVTSVpFKShuU3RhcnRCbG9jayAqIG1fbkdyb3dTaXplKTsKLSAgICAgICAgd2hpbGUgKHNpemUpIHsKLSAgICAgICAgICAgIHNpemVfdCBuUmVhZCA9IG1fbkdyb3dTaXplIC0gKHNpemVfdClvZmZzZXQ7Ci0gICAgICAgICAgICBpZiAoblJlYWQgPiBzaXplKSB7Ci0gICAgICAgICAgICAgICAgblJlYWQgPSBzaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIoYnVmZmVyLCAoRlhfTFBCWVRFKW1fQmxvY2tzWyhpbnQpblN0YXJ0QmxvY2tdICsgKHNpemVfdClvZmZzZXQsIG5SZWFkKTsKLSAgICAgICAgICAgIGJ1ZmZlciA9ICgoRlhfTFBCWVRFKWJ1ZmZlcikgKyBuUmVhZDsKLSAgICAgICAgICAgIHNpemUgLT0gblJlYWQ7Ci0gICAgICAgICAgICBuU3RhcnRCbG9jayArKzsKLSAgICAgICAgICAgIG9mZnNldCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHZpcnR1YWwgc2l6ZV90CQkJCVJlYWRCbG9jayh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSAgRlhfT1ZFUlJJREUKLSAgICB7Ci0gICAgICAgIGlmIChtX25DdXJQb3MgPj0gbV9uQ3VyU2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fYlVzZVJhbmdlKSB7Ci0gICAgICAgICAgICBzaXplX3QgYXZhaWxTaXplID0gbV9uT2Zmc2V0ICsgbV9uU2l6ZSAtIG1fbkN1clBvczsKLSAgICAgICAgICAgIGlmIChhdmFpbFNpemUgPCBzaXplKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZSAtPSBzaXplIC0gKHNpemVfdClhdmFpbFNpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2l6ZV90IG5SZWFkID0gRlhfTUlOKHNpemUsIG1fbkN1clNpemUgLSBtX25DdXJQb3MpOwotICAgICAgICBpZiAoIVJlYWRCbG9jayhidWZmZXIsIChGWF9JTlQzMiltX25DdXJQb3MsIG5SZWFkKSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5SZWFkOwotICAgIH0KLSAgICB2aXJ0dWFsCUZYX0JPT0wJCQkJV3JpdGVCbG9jayhjb25zdCB2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpICBGWF9PVkVSUklERQotICAgIHsKLSAgICAgICAgaWYgKCFidWZmZXIgfHwgIXNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9iVXNlUmFuZ2UpIHsKLSAgICAgICAgICAgIG9mZnNldCArPSAoRlhfRklMRVNJWkUpbV9uT2Zmc2V0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX2R3RmxhZ3MgJiBGWF9NRU1TVFJFQU1fQ29uc2VjdXRpdmUpIHsKLSAgICAgICAgICAgIEZYX1NBRkVfU0laRV9UIG5ld1BvcyA9IHNpemU7IAotICAgICAgICAgICAgbmV3UG9zICs9IG9mZnNldDsKLSAgICAgICAgICAgIGlmICghbmV3UG9zLklzVmFsaWQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgICAgIG1fbkN1clBvcyA9IG5ld1Bvcy5WYWx1ZU9yRGllKCk7Ci0gICAgICAgICAgICBpZiAobV9uQ3VyUG9zID4gbV9uVG90YWxTaXplKSB7Ci0gICAgICAgICAgICAgICAgbV9uVG90YWxTaXplID0gKG1fbkN1clBvcyArIG1fbkdyb3dTaXplIC0gMSkgLyBtX25Hcm93U2l6ZSAqIG1fbkdyb3dTaXplOwotICAgICAgICAgICAgICAgIGlmIChtX0Jsb2Nrcy5HZXRTaXplKCkgPCAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQqIGJsb2NrID0gRlhfQWxsb2MoRlhfQllURSwgbV9uVG90YWxTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgbV9CbG9ja3MuQWRkKGJsb2NrKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtX0Jsb2Nrc1swXSA9IEZYX1JlYWxsb2MoRlhfQllURSwgbV9CbG9ja3NbMF0sIG1fblRvdGFsU2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghbV9CbG9ja3NbMF0pIHsKLSAgICAgICAgICAgICAgICAgICAgbV9CbG9ja3MuUmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkzMigoRlhfTFBCWVRFKW1fQmxvY2tzWzBdICsgKHNpemVfdClvZmZzZXQsIGJ1ZmZlciwgc2l6ZSk7Ci0gICAgICAgICAgICBpZiAobV9uQ3VyU2l6ZSA8IG1fbkN1clBvcykgewotICAgICAgICAgICAgICAgIG1fbkN1clNpemUgPSBtX25DdXJQb3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotCi0gICAgICAgIEZYX1NBRkVfU0laRV9UIG5ld1BvcyA9IHNpemU7Ci0gICAgICAgIG5ld1BvcyArPSBvZmZzZXQ7Ci0gICAgICAgIGlmICghbmV3UG9zLklzVmFsaWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFFeHBhbmRCbG9ja3MobmV3UG9zLlZhbHVlT3JEaWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBtX25DdXJQb3MgPSBuZXdQb3MuVmFsdWVPckRpZSgpOwotICAgICAgICBzaXplX3QgblN0YXJ0QmxvY2sgPSAoc2l6ZV90KW9mZnNldCAvIG1fbkdyb3dTaXplOwotICAgICAgICBvZmZzZXQgLT0gKEZYX0ZJTEVTSVpFKShuU3RhcnRCbG9jayAqIG1fbkdyb3dTaXplKTsKLSAgICAgICAgd2hpbGUgKHNpemUpIHsKLSAgICAgICAgICAgIHNpemVfdCBuV3JpdGUgPSBtX25Hcm93U2l6ZSAtIChzaXplX3Qpb2Zmc2V0OwotICAgICAgICAgICAgaWYgKG5Xcml0ZSA+IHNpemUpIHsKLSAgICAgICAgICAgICAgICBuV3JpdGUgPSBzaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIoKEZYX0xQQllURSltX0Jsb2Nrc1soaW50KW5TdGFydEJsb2NrXSArIChzaXplX3Qpb2Zmc2V0LCBidWZmZXIsIG5Xcml0ZSk7Ci0gICAgICAgICAgICBidWZmZXIgPSAoKEZYX0xQQllURSlidWZmZXIpICsgbldyaXRlOwotICAgICAgICAgICAgc2l6ZSAtPSBuV3JpdGU7Ci0gICAgICAgICAgICBuU3RhcnRCbG9jayArKzsKLSAgICAgICAgICAgIG9mZnNldCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlGbHVzaCgpICBGWF9PVkVSUklERQotICAgIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCQlJc0NvbnNlY3V0aXZlKCkgY29uc3QgIEZYX09WRVJSSURFCi0gICAgewotICAgICAgICByZXR1cm4gbV9kd0ZsYWdzICYgRlhfTUVNU1RSRUFNX0NvbnNlY3V0aXZlOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQJCQkJRXN0aW1hdGVTaXplKHNpemVfdCBuSW5pdFNpemUsIHNpemVfdCBuR3Jvd1NpemUpICBGWF9PVkVSUklERQotICAgIHsKLSAgICAgICAgaWYgKG1fZHdGbGFncyAmIEZYX01FTVNUUkVBTV9Db25zZWN1dGl2ZSkgewotICAgICAgICAgICAgaWYgKG1fQmxvY2tzLkdldFNpemUoKSA8IDEpIHsKLSAgICAgICAgICAgICAgICBGWF9MUEJZVEUgcEJsb2NrID0gRlhfQWxsb2MoRlhfQllURSwgRlhfTUFYKG5Jbml0U2l6ZSwgNDA5NikpOwotICAgICAgICAgICAgICAgIG1fQmxvY2tzLkFkZChwQmxvY2spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9uR3Jvd1NpemUgPSBGWF9NQVgobkdyb3dTaXplLCA0MDk2KTsKLSAgICAgICAgfSBlbHNlIGlmIChtX0Jsb2Nrcy5HZXRTaXplKCkgPCAxKSB7Ci0gICAgICAgICAgICBtX25Hcm93U2l6ZSA9IEZYX01BWChuR3Jvd1NpemUsIDQwOTYpOwotICAgICAgICB9Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfTFBCWVRFCQkJR2V0QnVmZmVyKCkgY29uc3QgIEZYX09WRVJSSURFCi0gICAgewotICAgICAgICByZXR1cm4gbV9CbG9ja3MuR2V0U2l6ZSgpID8gKEZYX0xQQllURSltX0Jsb2Nrc1swXSA6IE5VTEw7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZAkJCQlBdHRhY2hCdWZmZXIoRlhfTFBCWVRFIHBCdWZmZXIsIHNpemVfdCBuU2l6ZSwgRlhfQk9PTCBiVGFrZU92ZXIgPSBGQUxTRSkgIEZYX09WRVJSSURFCi0gICAgewotICAgICAgICBpZiAoIShtX2R3RmxhZ3MgJiBGWF9NRU1TVFJFQU1fQ29uc2VjdXRpdmUpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbV9CbG9ja3MuUmVtb3ZlQWxsKCk7Ci0gICAgICAgIG1fQmxvY2tzLkFkZChwQnVmZmVyKTsKLSAgICAgICAgbV9uVG90YWxTaXplID0gbV9uQ3VyU2l6ZSA9IG5TaXplOwotICAgICAgICBtX25DdXJQb3MgPSAwOwotICAgICAgICBtX2R3RmxhZ3MgPSBGWF9NRU1TVFJFQU1fQ29uc2VjdXRpdmUgfCAoYlRha2VPdmVyID8gRlhfTUVNU1RSRUFNX1Rha2VPdmVyIDogMCk7Ci0gICAgICAgIENsZWFyUmFuZ2UoKTsKLSAgICB9Ci0gICAgdmlydHVhbCB2b2lkCQkJCURldGFjaEJ1ZmZlcigpICBGWF9PVkVSUklERQotICAgIHsKLSAgICAgICAgaWYgKCEobV9kd0ZsYWdzICYgRlhfTUVNU1RSRUFNX0NvbnNlY3V0aXZlKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1fQmxvY2tzLlJlbW92ZUFsbCgpOwotICAgICAgICBtX25Ub3RhbFNpemUgPSBtX25DdXJTaXplID0gbV9uQ3VyUG9zID0gMDsKLSAgICAgICAgbV9kd0ZsYWdzID0gRlhfTUVNU1RSRUFNX1Rha2VPdmVyOwotICAgICAgICBDbGVhclJhbmdlKCk7Ci0gICAgfQotcHJvdGVjdGVkOgotICAgIENGWF9QdHJBcnJheQltX0Jsb2NrczsKLSAgICBGWF9EV09SRAkJbV9kd0NvdW50OwotICAgIHNpemVfdAkJCW1fblRvdGFsU2l6ZTsKLSAgICBzaXplX3QJCQltX25DdXJTaXplOwotICAgIHNpemVfdAkJCW1fbkN1clBvczsKLSAgICBzaXplX3QJCQltX25Hcm93U2l6ZTsKLSAgICBGWF9EV09SRAkJbV9kd0ZsYWdzOwotICAgIEZYX0JPT0wJCQltX2JVc2VSYW5nZTsKLSAgICBzaXplX3QJCQltX25PZmZzZXQ7Ci0gICAgc2l6ZV90CQkJbV9uU2l6ZTsKLSAgICBGWF9CT09MCUV4cGFuZEJsb2NrcyhzaXplX3Qgc2l6ZSkKLSAgICB7Ci0gICAgICAgIGlmIChtX25DdXJTaXplIDwgc2l6ZSkgewotICAgICAgICAgICAgbV9uQ3VyU2l6ZSA9IHNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNpemUgPD0gbV9uVG90YWxTaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBGWF9JTlQzMiBpQ291bnQgPSBtX0Jsb2Nrcy5HZXRTaXplKCk7Ci0gICAgICAgIHNpemUgPSAoc2l6ZSAtIG1fblRvdGFsU2l6ZSArIG1fbkdyb3dTaXplIC0gMSkgLyBtX25Hcm93U2l6ZTsKLSAgICAgICAgbV9CbG9ja3MuU2V0U2l6ZShtX0Jsb2Nrcy5HZXRTaXplKCkgKyAoRlhfSU5UMzIpc2l6ZSk7Ci0gICAgICAgIHdoaWxlIChzaXplIC0tKSB7Ci0gICAgICAgICAgICBGWF9MUEJZVEUgcEJsb2NrID0gRlhfQWxsb2MoRlhfQllURSwgbV9uR3Jvd1NpemUpOwotICAgICAgICAgICAgbV9CbG9ja3MuU2V0QXQoaUNvdW50ICsrLCBwQmxvY2spOwotICAgICAgICAgICAgbV9uVG90YWxTaXplICs9IG1fbkdyb3dTaXplOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KKyBwcm90ZWN0ZWQ6CisgIElGWENSVF9GaWxlQWNjZXNzKiBtX3BGaWxlOworICBGWF9EV09SRCBtX2R3Q291bnQ7CiB9OworCisjZGVmaW5lIEZYX01FTVNUUkVBTV9CbG9ja1NpemUgKDY0ICogMTAyNCkKKyNkZWZpbmUgRlhfTUVNU1RSRUFNX0NvbnNlY3V0aXZlIDB4MDEKKyNkZWZpbmUgRlhfTUVNU1RSRUFNX1Rha2VPdmVyIDB4MDIKK2NsYXNzIENGWF9NZW1vcnlTdHJlYW0gZmluYWwgOiBwdWJsaWMgSUZYX01lbW9yeVN0cmVhbSB7CisgcHVibGljOgorICBleHBsaWNpdCBDRlhfTWVtb3J5U3RyZWFtKEZYX0JPT0wgYkNvbnNlY3V0aXZlKQorICAgICAgOiBtX2R3Q291bnQoMSksCisgICAgICAgIG1fblRvdGFsU2l6ZSgwKSwKKyAgICAgICAgbV9uQ3VyU2l6ZSgwKSwKKyAgICAgICAgbV9uQ3VyUG9zKDApLAorICAgICAgICBtX25Hcm93U2l6ZShGWF9NRU1TVFJFQU1fQmxvY2tTaXplKSB7CisgICAgbV9kd0ZsYWdzID0KKyAgICAgICAgRlhfTUVNU1RSRUFNX1Rha2VPdmVyIHwgKGJDb25zZWN1dGl2ZSA/IEZYX01FTVNUUkVBTV9Db25zZWN1dGl2ZSA6IDApOworICB9CisgIENGWF9NZW1vcnlTdHJlYW0odWludDhfdCogcEJ1ZmZlciwgc2l6ZV90IG5TaXplLCBGWF9CT09MIGJUYWtlT3ZlcikKKyAgICAgIDogbV9kd0NvdW50KDEpLAorICAgICAgICBtX25Ub3RhbFNpemUoblNpemUpLAorICAgICAgICBtX25DdXJTaXplKG5TaXplKSwKKyAgICAgICAgbV9uQ3VyUG9zKDApLAorICAgICAgICBtX25Hcm93U2l6ZShGWF9NRU1TVFJFQU1fQmxvY2tTaXplKSB7CisgICAgbV9CbG9ja3MuQWRkKHBCdWZmZXIpOworICAgIG1fZHdGbGFncyA9CisgICAgICAgIEZYX01FTVNUUkVBTV9Db25zZWN1dGl2ZSB8IChiVGFrZU92ZXIgPyBGWF9NRU1TVFJFQU1fVGFrZU92ZXIgOiAwKTsKKyAgfQorICB+Q0ZYX01lbW9yeVN0cmVhbSgpIG92ZXJyaWRlIHsKKyAgICBpZiAobV9kd0ZsYWdzICYgRlhfTUVNU1RSRUFNX1Rha2VPdmVyKSB7CisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX0Jsb2Nrcy5HZXRTaXplKCk7IGkrKykgeworICAgICAgICBGWF9GcmVlKG1fQmxvY2tzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgICAgbV9CbG9ja3MuUmVtb3ZlQWxsKCk7CisgIH0KKworICAvLyBJRlhfTWVtb3J5U3RyZWFtOgorICBJRlhfRmlsZVN0cmVhbSogUmV0YWluKCkgb3ZlcnJpZGUgeworICAgIG1fZHdDb3VudCsrOworICAgIHJldHVybiB0aGlzOworICB9CisgIHZvaWQgUmVsZWFzZSgpIG92ZXJyaWRlIHsKKyAgICBGWF9EV09SRCBuQ291bnQgPSAtLW1fZHdDb3VudDsKKyAgICBpZiAobkNvdW50KSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGRlbGV0ZSB0aGlzOworICB9CisgIEZYX0ZJTEVTSVpFIEdldFNpemUoKSBvdmVycmlkZSB7IHJldHVybiAoRlhfRklMRVNJWkUpbV9uQ3VyU2l6ZTsgfQorICBGWF9CT09MIElzRU9GKCkgb3ZlcnJpZGUgeyByZXR1cm4gbV9uQ3VyUG9zID49IChzaXplX3QpR2V0U2l6ZSgpOyB9CisgIEZYX0ZJTEVTSVpFIEdldFBvc2l0aW9uKCkgb3ZlcnJpZGUgeyByZXR1cm4gKEZYX0ZJTEVTSVpFKW1fbkN1clBvczsgfQorICBGWF9CT09MIFJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlIHsKKyAgICBpZiAoIWJ1ZmZlciB8fCAhc2l6ZSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIEZYX1NBRkVfU0laRV9UIG5ld1BvcyA9IHNpemU7CisgICAgbmV3UG9zICs9IG9mZnNldDsKKyAgICBpZiAoIW5ld1Bvcy5Jc1ZhbGlkKCkgfHwgbmV3UG9zLlZhbHVlT3JEZWZhdWx0KDApID09IDAgfHwKKyAgICAgICAgbmV3UG9zLlZhbHVlT3JEaWUoKSA+IG1fbkN1clNpemUpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBtX25DdXJQb3MgPSBuZXdQb3MuVmFsdWVPckRpZSgpOworICAgIGlmIChtX2R3RmxhZ3MgJiBGWF9NRU1TVFJFQU1fQ29uc2VjdXRpdmUpIHsKKyAgICAgIEZYU1lTX21lbWNweShidWZmZXIsIG1fQmxvY2tzWzBdICsgKHNpemVfdClvZmZzZXQsIHNpemUpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHNpemVfdCBuU3RhcnRCbG9jayA9IChzaXplX3Qpb2Zmc2V0IC8gbV9uR3Jvd1NpemU7CisgICAgb2Zmc2V0IC09IChGWF9GSUxFU0laRSkoblN0YXJ0QmxvY2sgKiBtX25Hcm93U2l6ZSk7CisgICAgd2hpbGUgKHNpemUpIHsKKyAgICAgIHNpemVfdCBuUmVhZCA9IG1fbkdyb3dTaXplIC0gKHNpemVfdClvZmZzZXQ7CisgICAgICBpZiAoblJlYWQgPiBzaXplKSB7CisgICAgICAgIG5SZWFkID0gc2l6ZTsKKyAgICAgIH0KKyAgICAgIEZYU1lTX21lbWNweShidWZmZXIsIG1fQmxvY2tzWyhpbnQpblN0YXJ0QmxvY2tdICsgKHNpemVfdClvZmZzZXQsIG5SZWFkKTsKKyAgICAgIGJ1ZmZlciA9ICgodWludDhfdCopYnVmZmVyKSArIG5SZWFkOworICAgICAgc2l6ZSAtPSBuUmVhZDsKKyAgICAgIG5TdGFydEJsb2NrKys7CisgICAgICBvZmZzZXQgPSAwOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBzaXplX3QgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIG92ZXJyaWRlIHsKKyAgICBpZiAobV9uQ3VyUG9zID49IG1fbkN1clNpemUpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzaXplX3QgblJlYWQgPSBzdGQ6Om1pbihzaXplLCBtX25DdXJTaXplIC0gbV9uQ3VyUG9zKTsKKyAgICBpZiAoIVJlYWRCbG9jayhidWZmZXIsIChpbnQzMl90KW1fbkN1clBvcywgblJlYWQpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIG5SZWFkOworICB9CisgIEZYX0JPT0wgV3JpdGVCbG9jayhjb25zdCB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGUgeworICAgIGlmICghYnVmZmVyIHx8ICFzaXplKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGlmIChtX2R3RmxhZ3MgJiBGWF9NRU1TVFJFQU1fQ29uc2VjdXRpdmUpIHsKKyAgICAgIEZYX1NBRkVfU0laRV9UIG5ld1BvcyA9IHNpemU7CisgICAgICBuZXdQb3MgKz0gb2Zmc2V0OworICAgICAgaWYgKCFuZXdQb3MuSXNWYWxpZCgpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIG1fbkN1clBvcyA9IG5ld1Bvcy5WYWx1ZU9yRGllKCk7CisgICAgICBpZiAobV9uQ3VyUG9zID4gbV9uVG90YWxTaXplKSB7CisgICAgICAgIG1fblRvdGFsU2l6ZSA9CisgICAgICAgICAgICAobV9uQ3VyUG9zICsgbV9uR3Jvd1NpemUgLSAxKSAvIG1fbkdyb3dTaXplICogbV9uR3Jvd1NpemU7CisgICAgICAgIGlmIChtX0Jsb2Nrcy5HZXRTaXplKCkgPCAxKSB7CisgICAgICAgICAgdWludDhfdCogYmxvY2sgPSBGWF9BbGxvYyh1aW50OF90LCBtX25Ub3RhbFNpemUpOworICAgICAgICAgIG1fQmxvY2tzLkFkZChibG9jayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbV9CbG9ja3NbMF0gPSBGWF9SZWFsbG9jKHVpbnQ4X3QsIG1fQmxvY2tzWzBdLCBtX25Ub3RhbFNpemUpOworICAgICAgICB9CisgICAgICAgIGlmICghbV9CbG9ja3NbMF0pIHsKKyAgICAgICAgICBtX0Jsb2Nrcy5SZW1vdmVBbGwoKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEZYU1lTX21lbWNweShtX0Jsb2Nrc1swXSArIChzaXplX3Qpb2Zmc2V0LCBidWZmZXIsIHNpemUpOworICAgICAgaWYgKG1fbkN1clNpemUgPCBtX25DdXJQb3MpIHsKKyAgICAgICAgbV9uQ3VyU2l6ZSA9IG1fbkN1clBvczsKKyAgICAgIH0KKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIEZYX1NBRkVfU0laRV9UIG5ld1BvcyA9IHNpemU7CisgICAgbmV3UG9zICs9IG9mZnNldDsKKyAgICBpZiAoIW5ld1Bvcy5Jc1ZhbGlkKCkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIUV4cGFuZEJsb2NrcyhuZXdQb3MuVmFsdWVPckRpZSgpKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBtX25DdXJQb3MgPSBuZXdQb3MuVmFsdWVPckRpZSgpOworICAgIHNpemVfdCBuU3RhcnRCbG9jayA9IChzaXplX3Qpb2Zmc2V0IC8gbV9uR3Jvd1NpemU7CisgICAgb2Zmc2V0IC09IChGWF9GSUxFU0laRSkoblN0YXJ0QmxvY2sgKiBtX25Hcm93U2l6ZSk7CisgICAgd2hpbGUgKHNpemUpIHsKKyAgICAgIHNpemVfdCBuV3JpdGUgPSBtX25Hcm93U2l6ZSAtIChzaXplX3Qpb2Zmc2V0OworICAgICAgaWYgKG5Xcml0ZSA+IHNpemUpIHsKKyAgICAgICAgbldyaXRlID0gc2l6ZTsKKyAgICAgIH0KKyAgICAgIEZYU1lTX21lbWNweShtX0Jsb2Nrc1soaW50KW5TdGFydEJsb2NrXSArIChzaXplX3Qpb2Zmc2V0LCBidWZmZXIsIG5Xcml0ZSk7CisgICAgICBidWZmZXIgPSAoKHVpbnQ4X3QqKWJ1ZmZlcikgKyBuV3JpdGU7CisgICAgICBzaXplIC09IG5Xcml0ZTsKKyAgICAgIG5TdGFydEJsb2NrKys7CisgICAgICBvZmZzZXQgPSAwOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBGWF9CT09MIEZsdXNoKCkgb3ZlcnJpZGUgeyByZXR1cm4gVFJVRTsgfQorICBGWF9CT09MIElzQ29uc2VjdXRpdmUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIG1fZHdGbGFncyAmIEZYX01FTVNUUkVBTV9Db25zZWN1dGl2ZTsKKyAgfQorICB2b2lkIEVzdGltYXRlU2l6ZShzaXplX3QgbkluaXRTaXplLCBzaXplX3Qgbkdyb3dTaXplKSBvdmVycmlkZSB7CisgICAgaWYgKG1fZHdGbGFncyAmIEZYX01FTVNUUkVBTV9Db25zZWN1dGl2ZSkgeworICAgICAgaWYgKG1fQmxvY2tzLkdldFNpemUoKSA8IDEpIHsKKyAgICAgICAgdWludDhfdCogcEJsb2NrID0KKyAgICAgICAgICAgIEZYX0FsbG9jKHVpbnQ4X3QsIHN0ZDo6bWF4KG5Jbml0U2l6ZSwgc3RhdGljX2Nhc3Q8c2l6ZV90Pig0MDk2KSkpOworICAgICAgICBtX0Jsb2Nrcy5BZGQocEJsb2NrKTsKKyAgICAgIH0KKyAgICAgIG1fbkdyb3dTaXplID0gc3RkOjptYXgobkdyb3dTaXplLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDQwOTYpKTsKKyAgICB9IGVsc2UgaWYgKG1fQmxvY2tzLkdldFNpemUoKSA8IDEpIHsKKyAgICAgIG1fbkdyb3dTaXplID0gc3RkOjptYXgobkdyb3dTaXplLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDQwOTYpKTsKKyAgICB9CisgIH0KKyAgdWludDhfdCogR2V0QnVmZmVyKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBtX0Jsb2Nrcy5HZXRTaXplKCkgPyBtX0Jsb2Nrc1swXSA6IG51bGxwdHI7CisgIH0KKyAgdm9pZCBBdHRhY2hCdWZmZXIodWludDhfdCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5TaXplLAorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUYWtlT3ZlciA9IEZBTFNFKSBvdmVycmlkZSB7CisgICAgaWYgKCEobV9kd0ZsYWdzICYgRlhfTUVNU1RSRUFNX0NvbnNlY3V0aXZlKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtX0Jsb2Nrcy5SZW1vdmVBbGwoKTsKKyAgICBtX0Jsb2Nrcy5BZGQocEJ1ZmZlcik7CisgICAgbV9uVG90YWxTaXplID0gbV9uQ3VyU2l6ZSA9IG5TaXplOworICAgIG1fbkN1clBvcyA9IDA7CisgICAgbV9kd0ZsYWdzID0KKyAgICAgICAgRlhfTUVNU1RSRUFNX0NvbnNlY3V0aXZlIHwgKGJUYWtlT3ZlciA/IEZYX01FTVNUUkVBTV9UYWtlT3ZlciA6IDApOworICB9CisgIHZvaWQgRGV0YWNoQnVmZmVyKCkgb3ZlcnJpZGUgeworICAgIGlmICghKG1fZHdGbGFncyAmIEZYX01FTVNUUkVBTV9Db25zZWN1dGl2ZSkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgbV9CbG9ja3MuUmVtb3ZlQWxsKCk7CisgICAgbV9uVG90YWxTaXplID0gbV9uQ3VyU2l6ZSA9IG1fbkN1clBvcyA9IDA7CisgICAgbV9kd0ZsYWdzID0gRlhfTUVNU1RSRUFNX1Rha2VPdmVyOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIENGWF9BcnJheVRlbXBsYXRlPHVpbnQ4X3QqPiBtX0Jsb2NrczsKKyAgRlhfRFdPUkQgbV9kd0NvdW50OworICBzaXplX3QgbV9uVG90YWxTaXplOworICBzaXplX3QgbV9uQ3VyU2l6ZTsKKyAgc2l6ZV90IG1fbkN1clBvczsKKyAgc2l6ZV90IG1fbkdyb3dTaXplOworICBGWF9EV09SRCBtX2R3RmxhZ3M7CisgIEZYX0JPT0wgRXhwYW5kQmxvY2tzKHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1fbkN1clNpemUgPCBzaXplKSB7CisgICAgICBtX25DdXJTaXplID0gc2l6ZTsKKyAgICB9CisgICAgaWYgKHNpemUgPD0gbV9uVG90YWxTaXplKSB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgaW50MzJfdCBpQ291bnQgPSBtX0Jsb2Nrcy5HZXRTaXplKCk7CisgICAgc2l6ZSA9IChzaXplIC0gbV9uVG90YWxTaXplICsgbV9uR3Jvd1NpemUgLSAxKSAvIG1fbkdyb3dTaXplOworICAgIG1fQmxvY2tzLlNldFNpemUobV9CbG9ja3MuR2V0U2l6ZSgpICsgKGludDMyX3Qpc2l6ZSk7CisgICAgd2hpbGUgKHNpemUtLSkgeworICAgICAgdWludDhfdCogcEJsb2NrID0gRlhfQWxsb2ModWludDhfdCwgbV9uR3Jvd1NpemUpOworICAgICAgbV9CbG9ja3MuU2V0QXQoaUNvdW50KyssIHBCbG9jayk7CisgICAgICBtX25Ub3RhbFNpemUgKz0gbV9uR3Jvd1NpemU7CisgICAgfQorICAgIHJldHVybiBUUlVFOworICB9Cit9OworCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCi0jZGVmaW5lIE1UX04JCQk4NDgKLSNkZWZpbmUgTVRfTQkJCTQ1NgotI2RlZmluZSBNVF9NYXRyaXhfQQkJMHg5OTA4YjBkZgotI2RlZmluZSBNVF9VcHBlcl9NYXNrCTB4ODAwMDAwMDAKLSNkZWZpbmUgTVRfTG93ZXJfTWFzawkweDdmZmZmZmZmCisjZGVmaW5lIE1UX04gODQ4CisjZGVmaW5lIE1UX00gNDU2CisjZGVmaW5lIE1UX01hdHJpeF9BIDB4OTkwOGIwZGYKKyNkZWZpbmUgTVRfVXBwZXJfTWFzayAweDgwMDAwMDAwCisjZGVmaW5lIE1UX0xvd2VyX01hc2sgMHg3ZmZmZmZmZgogdHlwZWRlZiBzdHJ1Y3QgX0ZYX01UUkFORE9NQ09OVEVYVCB7Ci0gICAgX0ZYX01UUkFORE9NQ09OVEVYVCgpCi0gICAgewotICAgICAgICBtdGkgPSBNVF9OICsgMTsKLSAgICAgICAgYkhhdmVTZWVkID0gRkFMU0U7Ci0gICAgfQotICAgIEZYX0RXT1JEIG10aTsKLSAgICBGWF9CT09MCSBiSGF2ZVNlZWQ7Ci0gICAgRlhfRFdPUkQgbXRbTVRfTl07Ci19IEZYX01UUkFORE9NQ09OVEVYVCwgKiBGWF9MUE1UUkFORE9NQ09OVEVYVDsKLXR5cGVkZWYgRlhfTVRSQU5ET01DT05URVhUIGNvbnN0ICogRlhfTFBDTVRSQU5ET01DT05URVhUOworICBfRlhfTVRSQU5ET01DT05URVhUKCkgeworICAgIG10aSA9IE1UX04gKyAxOworICAgIGJIYXZlU2VlZCA9IEZBTFNFOworICB9CisgIEZYX0RXT1JEIG10aTsKKyAgRlhfQk9PTCBiSGF2ZVNlZWQ7CisgIEZYX0RXT1JEIG10W01UX05dOworfSBGWF9NVFJBTkRPTUNPTlRFWFQsICpGWF9MUE1UUkFORE9NQ09OVEVYVDsKK3R5cGVkZWYgRlhfTVRSQU5ET01DT05URVhUIGNvbnN0KiBGWF9MUENNVFJBTkRPTUNPTlRFWFQ7CiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotRlhfQk9PTCBGWF9HZW5lcmF0ZUNyeXB0b1JhbmRvbShGWF9MUERXT1JEIHBCdWZmZXIsIEZYX0lOVDMyIGlDb3VudCk7CitGWF9CT09MIEZYX0dlbmVyYXRlQ3J5cHRvUmFuZG9tKEZYX0RXT1JEKiBwQnVmZmVyLCBpbnQzMl90IGlDb3VudCk7CiAjZW5kaWYKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2FyYWJpYy5jcHAKaW5kZXggMDRjZTE3Mi4uN2ZiOTNjZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF9hcmFiaWMuY3BwCkBAIC0xLDg2ICsxLDExNTAgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfZXh0LmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3VjZC5oIgogI2luY2x1ZGUgImZ4X2FyYWJpYy5oIgotZXh0ZXJuIGNvbnN0IEZYX0RXT1JEIGdzX0ZYX1RleHRMYXlvdXRfQ29kZVByb3BlcnRpZXNbNjU1MzZdOwotSUZYX0JpZGlDaGFyKiBJRlhfQmlkaUNoYXI6OkNyZWF0ZSgpCi17Ci0gICAgcmV0dXJuIG5ldyBDRlhfQmlkaUNoYXI7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0IEZYX0FSQkZPUk1UQUJMRSBnX0ZYX0FyYWJpY0Zvcm1UYWJsZXNbXSA9IHsKKyAgICB7MHhGRTgxLCAweEZFODIsIDB4RkU4MSwgMHhGRTgyfSwKKyAgICB7MHhGRTgzLCAweEZFODQsIDB4RkU4MywgMHhGRTg0fSwKKyAgICB7MHhGRTg1LCAweEZFODYsIDB4RkU4NSwgMHhGRTg2fSwKKyAgICB7MHhGRTg3LCAweEZFODgsIDB4RkU4NywgMHhGRTg4fSwKKyAgICB7MHhGRTg5LCAweEZFOEEsIDB4RkU4QiwgMHhGRThDfSwKKyAgICB7MHhGRThELCAweEZFOEUsIDB4RkU4RCwgMHhGRThFfSwKKyAgICB7MHhGRThGLCAweEZFOTAsIDB4RkU5MSwgMHhGRTkyfSwKKyAgICB7MHhGRTkzLCAweEZFOTQsIDB4RkU5MywgMHhGRTk0fSwKKyAgICB7MHhGRTk1LCAweEZFOTYsIDB4RkU5NywgMHhGRTk4fSwKKyAgICB7MHhGRTk5LCAweEZFOUEsIDB4RkU5QiwgMHhGRTlDfSwKKyAgICB7MHhGRTlELCAweEZFOUUsIDB4RkU5RiwgMHhGRUEwfSwKKyAgICB7MHhGRUExLCAweEZFQTIsIDB4RkVBMywgMHhGRUE0fSwKKyAgICB7MHhGRUE1LCAweEZFQTYsIDB4RkVBNywgMHhGRUE4fSwKKyAgICB7MHhGRUE5LCAweEZFQUEsIDB4RkVBOSwgMHhGRUFBfSwKKyAgICB7MHhGRUFCLCAweEZFQUMsIDB4RkVBQiwgMHhGRUFDfSwKKyAgICB7MHhGRUFELCAweEZFQUUsIDB4RkVBRCwgMHhGRUFFfSwKKyAgICB7MHhGRUFGLCAweEZFQjAsIDB4RkVBRiwgMHhGRUIwfSwKKyAgICB7MHhGRUIxLCAweEZFQjIsIDB4RkVCMywgMHhGRUI0fSwKKyAgICB7MHhGRUI1LCAweEZFQjYsIDB4RkVCNywgMHhGRUI4fSwKKyAgICB7MHhGRUI5LCAweEZFQkEsIDB4RkVCQiwgMHhGRUJDfSwKKyAgICB7MHhGRUJELCAweEZFQkUsIDB4RkVCRiwgMHhGRUMwfSwKKyAgICB7MHhGRUMxLCAweEZFQzIsIDB4RkVDMywgMHhGRUM0fSwKKyAgICB7MHhGRUM1LCAweEZFQzYsIDB4RkVDNywgMHhGRUM4fSwKKyAgICB7MHhGRUM5LCAweEZFQ0EsIDB4RkVDQiwgMHhGRUNDfSwKKyAgICB7MHhGRUNELCAweEZFQ0UsIDB4RkVDRiwgMHhGRUQwfSwKKyAgICB7MHgwNjNCLCAweDA2M0IsIDB4MDYzQiwgMHgwNjNCfSwKKyAgICB7MHgwNjNDLCAweDA2M0MsIDB4MDYzQywgMHgwNjNDfSwKKyAgICB7MHgwNjNELCAweDA2M0QsIDB4MDYzRCwgMHgwNjNEfSwKKyAgICB7MHgwNjNFLCAweDA2M0UsIDB4MDYzRSwgMHgwNjNFfSwKKyAgICB7MHgwNjNGLCAweDA2M0YsIDB4MDYzRiwgMHgwNjNGfSwKKyAgICB7MHgwNjQwLCAweDA2NDAsIDB4MDY0MCwgMHgwNjQwfSwKKyAgICB7MHhGRUQxLCAweEZFRDIsIDB4RkVEMywgMHhGRUQ0fSwKKyAgICB7MHhGRUQ1LCAweEZFRDYsIDB4RkVENywgMHhGRUQ4fSwKKyAgICB7MHhGRUQ5LCAweEZFREEsIDB4RkVEQiwgMHhGRURDfSwKKyAgICB7MHhGRURELCAweEZFREUsIDB4RkVERiwgMHhGRUUwfSwKKyAgICB7MHhGRUUxLCAweEZFRTIsIDB4RkVFMywgMHhGRUU0fSwKKyAgICB7MHhGRUU1LCAweEZFRTYsIDB4RkVFNywgMHhGRUU4fSwKKyAgICB7MHhGRUU5LCAweEZFRUEsIDB4RkVFQiwgMHhGRUVDfSwKKyAgICB7MHhGRUVELCAweEZFRUUsIDB4RkVFRCwgMHhGRUVFfSwKKyAgICB7MHhGRUVGLCAweEZFRjAsIDB4RkJGRSwgMHhGQkZGfSwKKyAgICB7MHhGRUYxLCAweEZFRjIsIDB4RkVGMywgMHhGRUY0fSwKKyAgICB7MHgwNjRCLCAweDA2NEIsIDB4MDY0QiwgMHgwNjRCfSwKKyAgICB7MHgwNjRDLCAweDA2NEMsIDB4MDY0QywgMHgwNjRDfSwKKyAgICB7MHgwNjRELCAweDA2NEQsIDB4MDY0RCwgMHgwNjREfSwKKyAgICB7MHgwNjRFLCAweDA2NEUsIDB4MDY0RSwgMHgwNjRFfSwKKyAgICB7MHgwNjRGLCAweDA2NEYsIDB4MDY0RiwgMHgwNjRGfSwKKyAgICB7MHgwNjUwLCAweDA2NTAsIDB4MDY1MCwgMHgwNjUwfSwKKyAgICB7MHgwNjUxLCAweDA2NTEsIDB4MDY1MSwgMHgwNjUxfSwKKyAgICB7MHgwNjUyLCAweDA2NTIsIDB4MDY1MiwgMHgwNjUyfSwKKyAgICB7MHgwNjUzLCAweDA2NTMsIDB4MDY1MywgMHgwNjUzfSwKKyAgICB7MHgwNjU0LCAweDA2NTQsIDB4MDY1NCwgMHgwNjU0fSwKKyAgICB7MHgwNjU1LCAweDA2NTUsIDB4MDY1NSwgMHgwNjU1fSwKKyAgICB7MHgwNjU2LCAweDA2NTYsIDB4MDY1NiwgMHgwNjU2fSwKKyAgICB7MHgwNjU3LCAweDA2NTcsIDB4MDY1NywgMHgwNjU3fSwKKyAgICB7MHgwNjU4LCAweDA2NTgsIDB4MDY1OCwgMHgwNjU4fSwKKyAgICB7MHgwNjU5LCAweDA2NTksIDB4MDY1OSwgMHgwNjU5fSwKKyAgICB7MHgwNjVBLCAweDA2NUEsIDB4MDY1QSwgMHgwNjVBfSwKKyAgICB7MHgwNjVCLCAweDA2NUIsIDB4MDY1QiwgMHgwNjVCfSwKKyAgICB7MHgwNjVDLCAweDA2NUMsIDB4MDY1QywgMHgwNjVDfSwKKyAgICB7MHgwNjVELCAweDA2NUQsIDB4MDY1RCwgMHgwNjVEfSwKKyAgICB7MHgwNjVFLCAweDA2NUUsIDB4MDY1RSwgMHgwNjVFfSwKKyAgICB7MHgwNjVGLCAweDA2NUYsIDB4MDY1RiwgMHgwNjVGfSwKKyAgICB7MHgwNjYwLCAweDA2NjAsIDB4MDY2MCwgMHgwNjYwfSwKKyAgICB7MHgwNjYxLCAweDA2NjEsIDB4MDY2MSwgMHgwNjYxfSwKKyAgICB7MHgwNjYyLCAweDA2NjIsIDB4MDY2MiwgMHgwNjYyfSwKKyAgICB7MHgwNjYzLCAweDA2NjMsIDB4MDY2MywgMHgwNjYzfSwKKyAgICB7MHgwNjY0LCAweDA2NjQsIDB4MDY2NCwgMHgwNjY0fSwKKyAgICB7MHgwNjY1LCAweDA2NjUsIDB4MDY2NSwgMHgwNjY1fSwKKyAgICB7MHgwNjY2LCAweDA2NjYsIDB4MDY2NiwgMHgwNjY2fSwKKyAgICB7MHgwNjY3LCAweDA2NjcsIDB4MDY2NywgMHgwNjY3fSwKKyAgICB7MHgwNjY4LCAweDA2NjgsIDB4MDY2OCwgMHgwNjY4fSwKKyAgICB7MHgwNjY5LCAweDA2NjksIDB4MDY2OSwgMHgwNjY5fSwKKyAgICB7MHgwNjZBLCAweDA2NkEsIDB4MDY2QSwgMHgwNjZBfSwKKyAgICB7MHgwNjZCLCAweDA2NkIsIDB4MDY2QiwgMHgwNjZCfSwKKyAgICB7MHgwNjZDLCAweDA2NkMsIDB4MDY2QywgMHgwNjZDfSwKKyAgICB7MHgwNjZELCAweDA2NkQsIDB4MDY2RCwgMHgwNjZEfSwKKyAgICB7MHgwNjZFLCAweDA2NkUsIDB4MDY2RSwgMHgwNjZFfSwKKyAgICB7MHgwNjZGLCAweDA2NkYsIDB4MDY2RiwgMHgwNjZGfSwKKyAgICB7MHgwNjcwLCAweDA2NzAsIDB4MDY3MCwgMHgwNjcwfSwKKyAgICB7MHhGQjUwLCAweEZCNTEsIDB4RkI1MCwgMHhGQjUxfSwKKyAgICB7MHgwNjcyLCAweDA2NzIsIDB4MDY3MiwgMHgwNjcyfSwKKyAgICB7MHgwNjczLCAweDA2NzMsIDB4MDY3MywgMHgwNjczfSwKKyAgICB7MHgwNjc0LCAweDA2NzQsIDB4MDY3NCwgMHgwNjc0fSwKKyAgICB7MHgwNjc1LCAweDA2NzUsIDB4MDY3NSwgMHgwNjc1fSwKKyAgICB7MHgwNjc2LCAweDA2NzYsIDB4MDY3NiwgMHgwNjc2fSwKKyAgICB7MHgwNjc3LCAweDA2NzcsIDB4MDY3NywgMHgwNjc3fSwKKyAgICB7MHgwNjc4LCAweDA2NzgsIDB4MDY3OCwgMHgwNjc4fSwKKyAgICB7MHhGQjY2LCAweEZCNjcsIDB4RkI2OCwgMHhGQjY5fSwKKyAgICB7MHhGQjVFLCAweEZCNUYsIDB4RkI2MCwgMHhGQjYxfSwKKyAgICB7MHhGQjUyLCAweEZCNTMsIDB4RkI1NCwgMHhGQjU1fSwKKyAgICB7MHgwNjdDLCAweDA2N0MsIDB4MDY3QywgMHgwNjdDfSwKKyAgICB7MHgwNjdELCAweDA2N0QsIDB4MDY3RCwgMHgwNjdEfSwKKyAgICB7MHhGQjU2LCAweEZCNTcsIDB4RkI1OCwgMHhGQjU5fSwKKyAgICB7MHhGQjYyLCAweEZCNjMsIDB4RkI2NCwgMHhGQjY1fSwKKyAgICB7MHhGQjVBLCAweEZCNUIsIDB4RkI1QywgMHhGQjVEfSwKKyAgICB7MHgwNjgxLCAweDA2ODEsIDB4MDY4MSwgMHgwNjgxfSwKKyAgICB7MHgwNjgyLCAweDA2ODIsIDB4MDY4MiwgMHgwNjgyfSwKKyAgICB7MHhGQjc2LCAweEZCNzcsIDB4RkI3OCwgMHhGQjc5fSwKKyAgICB7MHhGQjcyLCAweEZCNzMsIDB4RkI3NCwgMHhGQjc1fSwKKyAgICB7MHgwNjg1LCAweDA2ODUsIDB4MDY4NSwgMHgwNjg1fSwKKyAgICB7MHhGQjdBLCAweEZCN0IsIDB4RkI3QywgMHhGQjdEfSwKKyAgICB7MHhGQjdFLCAweEZCN0YsIDB4RkI4MCwgMHhGQjgxfSwKKyAgICB7MHhGQjg4LCAweEZCODksIDB4RkI4OCwgMHhGQjg5fSwKKyAgICB7MHgwNjg5LCAweDA2ODksIDB4MDY4OSwgMHgwNjg5fSwKKyAgICB7MHgwNjhBLCAweDA2OEEsIDB4MDY4QSwgMHgwNjhBfSwKKyAgICB7MHgwNjhCLCAweDA2OEIsIDB4MDY4QiwgMHgwNjhCfSwKKyAgICB7MHhGQjg0LCAweEZCODUsIDB4RkI4NCwgMHhGQjg1fSwKKyAgICB7MHhGQjgyLCAweEZCODMsIDB4RkI4MiwgMHhGQjgzfSwKKyAgICB7MHhGQjg2LCAweEZCODcsIDB4RkI4NiwgMHhGQjg3fSwKKyAgICB7MHgwNjhGLCAweDA2OEYsIDB4MDY4RiwgMHgwNjhGfSwKKyAgICB7MHgwNjkwLCAweDA2OTAsIDB4MDY5MCwgMHgwNjkwfSwKKyAgICB7MHhGQjhDLCAweEZCOEQsIDB4RkI4QywgMHhGQjhEfSwKKyAgICB7MHgwNjkyLCAweDA2OTIsIDB4MDY5MiwgMHgwNjkyfSwKKyAgICB7MHgwNjkzLCAweDA2OTMsIDB4MDY5MywgMHgwNjkzfSwKKyAgICB7MHgwNjk0LCAweDA2OTQsIDB4MDY5NCwgMHgwNjk0fSwKKyAgICB7MHgwNjk1LCAweDA2OTUsIDB4MDY5NSwgMHgwNjk1fSwKKyAgICB7MHgwNjk2LCAweDA2OTYsIDB4MDY5NiwgMHgwNjk2fSwKKyAgICB7MHgwNjk3LCAweDA2OTcsIDB4MDY5NywgMHgwNjk3fSwKKyAgICB7MHhGQjhBLCAweEZCOEIsIDB4RkI4QSwgMHhGQjhCfSwKKyAgICB7MHgwNjk5LCAweDA2OTksIDB4MDY5OSwgMHgwNjk5fSwKKyAgICB7MHgwNjlBLCAweDA2OUEsIDB4MDY5QSwgMHgwNjlBfSwKKyAgICB7MHgwNjlCLCAweDA2OUIsIDB4MDY5QiwgMHgwNjlCfSwKKyAgICB7MHgwNjlDLCAweDA2OUMsIDB4MDY5QywgMHgwNjlDfSwKKyAgICB7MHgwNjlELCAweDA2OUQsIDB4MDY5RCwgMHgwNjlEfSwKKyAgICB7MHgwNjlFLCAweDA2OUUsIDB4MDY5RSwgMHgwNjlFfSwKKyAgICB7MHgwNjlGLCAweDA2OUYsIDB4MDY5RiwgMHgwNjlGfSwKKyAgICB7MHgwNkEwLCAweDA2QTAsIDB4MDZBMCwgMHgwNkEwfSwKKyAgICB7MHgwNkExLCAweDA2QTEsIDB4MDZBMSwgMHgwNkExfSwKKyAgICB7MHgwNkEyLCAweDA2QTIsIDB4MDZBMiwgMHgwNkEyfSwKKyAgICB7MHgwNkEzLCAweDA2QTMsIDB4MDZBMywgMHgwNkEzfSwKKyAgICB7MHhGQjZBLCAweEZCNkIsIDB4RkI2QywgMHhGQjZEfSwKKyAgICB7MHgwNkE1LCAweDA2QTUsIDB4MDZBNSwgMHgwNkE1fSwKKyAgICB7MHhGQjZFLCAweEZCNkYsIDB4RkI3MCwgMHhGQjcxfSwKKyAgICB7MHgwNkE3LCAweDA2QTcsIDB4MDZBNywgMHgwNkE3fSwKKyAgICB7MHgwNkE4LCAweDA2QTgsIDB4MDZBOCwgMHgwNkE4fSwKKyAgICB7MHhGQjhFLCAweEZCOEYsIDB4RkI5MCwgMHhGQjkxfSwKKyAgICB7MHgwNkFBLCAweDA2QUEsIDB4MDZBQSwgMHgwNkFBfSwKKyAgICB7MHgwNkFCLCAweDA2QUIsIDB4MDZBQiwgMHgwNkFCfSwKKyAgICB7MHgwNkFDLCAweDA2QUMsIDB4MDZBQywgMHgwNkFDfSwKKyAgICB7MHhGQkQzLCAweEZCRDQsIDB4RkJENSwgMHhGQkQ2fSwKKyAgICB7MHgwNkFFLCAweDA2QUUsIDB4MDZBRSwgMHgwNkFFfSwKKyAgICB7MHhGQjkyLCAweEZCOTMsIDB4RkI5NCwgMHhGQjk1fSwKKyAgICB7MHgwNkIwLCAweDA2QjAsIDB4MDZCMCwgMHgwNkIwfSwKKyAgICB7MHhGQjlBLCAweEZCOUIsIDB4RkI5QywgMHhGQjlEfSwKKyAgICB7MHgwNkIyLCAweDA2QjIsIDB4MDZCMiwgMHgwNkIyfSwKKyAgICB7MHhGQjk2LCAweEZCOTcsIDB4RkI5OCwgMHhGQjk5fSwKKyAgICB7MHgwNkI0LCAweDA2QjQsIDB4MDZCNCwgMHgwNkI0fSwKKyAgICB7MHgwNkI1LCAweDA2QjUsIDB4MDZCNSwgMHgwNkI1fSwKKyAgICB7MHgwNkI2LCAweDA2QjYsIDB4MDZCNiwgMHgwNkI2fSwKKyAgICB7MHgwNkI3LCAweDA2QjcsIDB4MDZCNywgMHgwNkI3fSwKKyAgICB7MHgwNkI4LCAweDA2QjgsIDB4MDZCOCwgMHgwNkI4fSwKKyAgICB7MHgwNkI5LCAweDA2QjksIDB4MDZCOSwgMHgwNkI5fSwKKyAgICB7MHhGQjlFLCAweEZCOUYsIDB4RkJFOCwgMHhGQkU5fSwKKyAgICB7MHhGQkEwLCAweEZCQTEsIDB4RkJBMiwgMHhGQkEzfSwKKyAgICB7MHgwNkJDLCAweDA2QkMsIDB4MDZCQywgMHgwNkJDfSwKKyAgICB7MHgwNkJELCAweDA2QkQsIDB4MDZCRCwgMHgwNkJEfSwKKyAgICB7MHhGQkFBLCAweEZCQUIsIDB4RkJBQywgMHhGQkFEfSwKKyAgICB7MHgwNkJGLCAweDA2QkYsIDB4MDZCRiwgMHgwNkJGfSwKKyAgICB7MHhGQkE0LCAweEZCQTUsIDB4RkJBNCwgMHhGQkE1fSwKKyAgICB7MHhGQkE2LCAweEZCQTcsIDB4RkJBOCwgMHhGQkE5fSwKKyAgICB7MHgwNkMyLCAweDA2QzIsIDB4MDZDMiwgMHgwNkMyfSwKKyAgICB7MHgwNkMzLCAweDA2QzMsIDB4MDZDMywgMHgwNkMzfSwKKyAgICB7MHgwNkM0LCAweDA2QzQsIDB4MDZDNCwgMHgwNkM0fSwKKyAgICB7MHhGQkUwLCAweEZCRTEsIDB4RkJFMCwgMHhGQkUxfSwKKyAgICB7MHhGQkQ5LCAweEZCREEsIDB4RkJEOSwgMHhGQkRBfSwKKyAgICB7MHhGQkQ3LCAweEZCRDgsIDB4RkJENywgMHhGQkQ4fSwKKyAgICB7MHhGQkRCLCAweEZCREMsIDB4RkJEQiwgMHhGQkRDfSwKKyAgICB7MHhGQkUyLCAweEZCRTMsIDB4RkJFMiwgMHhGQkUzfSwKKyAgICB7MHgwNkNBLCAweDA2Q0EsIDB4MDZDQSwgMHgwNkNBfSwKKyAgICB7MHhGQkRFLCAweEZCREYsIDB4RkJERSwgMHhGQkRGfSwKKyAgICB7MHhGQkZDLCAweEZCRkQsIDB4RkJGRSwgMHhGQkZGfSwKKyAgICB7MHgwNkNELCAweDA2Q0QsIDB4MDZDRCwgMHgwNkNEfSwKKyAgICB7MHgwNkNFLCAweDA2Q0UsIDB4MDZDRSwgMHgwNkNFfSwKKyAgICB7MHgwNkNGLCAweDA2Q0YsIDB4MDZDRiwgMHgwNkNGfSwKKyAgICB7MHhGQkU0LCAweEZCRTUsIDB4RkJFNiwgMHhGQkU3fSwKKyAgICB7MHgwNkQxLCAweDA2RDEsIDB4MDZEMSwgMHgwNkQxfSwKKyAgICB7MHhGQkFFLCAweEZCQUYsIDB4RkJBRSwgMHhGQkFGfSwKKyAgICB7MHhGQkIwLCAweEZCQjEsIDB4RkJCMCwgMHhGQkIxfSwKKyAgICB7MHgwNkQ0LCAweDA2RDQsIDB4MDZENCwgMHgwNkQ0fSwKKyAgICB7MHgwNkQ1LCAweDA2RDUsIDB4MDZENSwgMHgwNkQ1fSwKK307CisKK2NvbnN0IEZYX0FSQUFMRUYgZ3NfRlhfQWxlZlRhYmxlW10gPSB7CisgICAgezB4MDYyMiwgMHhGRUY1fSwKKyAgICB7MHgwNjIzLCAweEZFRjd9LAorICAgIHsweDA2MjUsIDB4RkVGOX0sCisgICAgezB4MDYyNywgMHhGRUZCfSwKK307CisKK2NvbnN0IEZYX0FSQVNIQUREQSBnc19GWF9TaGFkZGFUYWJsZVtdID0geworICAgIHsweDA2NEMsIDB4RkM1RX0sCisgICAgezB4MDY0RCwgMHhGQzVGfSwKKyAgICB7MHgwNjRFLCAweEZDNjB9LAorICAgIHsweDA2NEYsIDB4RkM2MX0sCisgICAgezB4MDY1MCwgMHhGQzYyfSwKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitjb25zdCBGWF9BUkJGT1JNVEFCTEUqIEZYX0dldEFyYWJpY0Zvcm1UYWJsZShGWF9XQ0hBUiB1bmljb2RlKSB7CisgIGlmICh1bmljb2RlIDwgMHg2MjIgfHwgdW5pY29kZSA+IDB4NmQ1KSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIGdfRlhfQXJhYmljRm9ybVRhYmxlcyArIHVuaWNvZGUgLSAweDYyMjsKIH0KLUNGWF9CaWRpQ2hhcjo6Q0ZYX0JpZGlDaGFyKCkKLSAgICA6IG1fYlNlcGFyYXRlTmV1dHJhbChUUlVFKQotICAgICwgbV9pQ3VyU3RhcnQoMCkKLSAgICAsIG1faUN1ckNvdW50KDApCi0gICAgLCBtX2lDdXJCaWRpKDApCi0gICAgLCBtX2lMYXN0QmlkaSgwKQotICAgICwgbV9pTGFzdFN0YXJ0KDApCi0gICAgLCBtX2lMYXN0Q291bnQoMCkKLXsKLX0KLUZYX0JPT0wgQ0ZYX0JpZGlDaGFyOjpBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCkKLXsKLSAgICBGWF9EV09SRCBkd1Byb3BzID0gZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdOwotICAgIEZYX0lOVDMyIGlCaWRpQ2xzID0gKGR3UHJvcHMgJiBGWF9CSURJQ0xBU1NCSVRTTUFTSykgPj4gRlhfQklESUNMQVNTQklUUzsKLSAgICBGWF9JTlQzMiBpQ29udGV4dCA9IDA7Ci0gICAgc3dpdGNoIChpQmlkaUNscykgewotICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19MOgotICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19BTjoKLSAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfRU46Ci0gICAgICAgICAgICBpQ29udGV4dCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfUjoKLSAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfQUw6Ci0gICAgICAgICAgICBpQ29udGV4dCA9IDI7Ci0gICAgICAgICAgICBicmVhazsKK0ZYX1dDSEFSIEZYX0dldEFyYWJpY0Zyb21BbGVmVGFibGUoRlhfV0NIQVIgYWxlZikgeworICBzdGF0aWMgY29uc3QgaW50MzJfdCBzX2lBbGVmQ291bnQgPQorICAgICAgc2l6ZW9mKGdzX0ZYX0FsZWZUYWJsZSkgLyBzaXplb2YoRlhfQVJBQUxFRik7CisgIGZvciAoaW50MzJfdCBpU3RhcnQgPSAwOyBpU3RhcnQgPCBzX2lBbGVmQ291bnQ7IGlTdGFydCsrKSB7CisgICAgY29uc3QgRlhfQVJBQUxFRiYgdiA9IGdzX0ZYX0FsZWZUYWJsZVtpU3RhcnRdOworICAgIGlmICh2LndBbGVmID09IGFsZWYpIHsKKyAgICAgIHJldHVybiB2LndJc29sYXRlZDsKICAgICB9Ci0gICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7Ci0gICAgaWYgKGlDb250ZXh0ICE9IG1faUN1ckJpZGkpIHsKLSAgICAgICAgaWYgKG1fYlNlcGFyYXRlTmV1dHJhbCkgewotICAgICAgICAgICAgYlJldCA9IFRSVUU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobV9pQ3VyQmlkaSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgYlJldCA9IChtX2lDdXJDb3VudCA+IDApOworICB9CisgIHJldHVybiBhbGVmOworfQorRlhfV0NIQVIgRlhfR2V0QXJhYmljRnJvbVNoYWRkYVRhYmxlKEZYX1dDSEFSIHNoYWRkYSkgeworICBzdGF0aWMgY29uc3QgaW50MzJfdCBzX2lTaGFkZGFDb3VudCA9CisgICAgICBzaXplb2YoZ3NfRlhfU2hhZGRhVGFibGUpIC8gc2l6ZW9mKEZYX0FSQVNIQUREQSk7CisgIGZvciAoaW50MzJfdCBpU3RhcnQgPSAwOyBpU3RhcnQgPCBzX2lTaGFkZGFDb3VudDsgaVN0YXJ0KyspIHsKKyAgICBjb25zdCBGWF9BUkFTSEFEREEmIHYgPSBnc19GWF9TaGFkZGFUYWJsZVtpU3RhcnRdOworICAgIGlmICh2LndTaGFkZGEgPT0gc2hhZGRhKSB7CisgICAgICByZXR1cm4gdi53SXNvbGF0ZWQ7CisgICAgfQorICB9CisgIHJldHVybiBzaGFkZGE7Cit9CisKK0lGWF9BcmFiaWNDaGFyKiBJRlhfQXJhYmljQ2hhcjo6Q3JlYXRlKCkgeworICByZXR1cm4gbmV3IENGWF9BcmFiaWNDaGFyOworfQorRlhfQk9PTCBDRlhfQXJhYmljQ2hhcjo6SXNBcmFiaWNDaGFyKEZYX1dDSEFSIHdjaCkgY29uc3QgeworICBGWF9EV09SRCBkd1JldCA9CisgICAgICBrVGV4dExheW91dENvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF0gJiBGWF9DSEFSVFlQRUJJVFNNQVNLOworICByZXR1cm4gZHdSZXQgPj0gRlhfQ0hBUlRZUEVfQXJhYmljQWxlZjsKK30KK0ZYX0JPT0wgQ0ZYX0FyYWJpY0NoYXI6OklzQXJhYmljRm9ybUNoYXIoRlhfV0NIQVIgd2NoKSBjb25zdCB7CisgIHJldHVybiAoa1RleHRMYXlvdXRDb2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdICYgRlhfQ0hBUlRZUEVCSVRTTUFTSykgPT0KKyAgICAgICAgIEZYX0NIQVJUWVBFX0FyYWJpY0Zvcm07Cit9CitGWF9XQ0hBUiBDRlhfQXJhYmljQ2hhcjo6R2V0Rm9ybUNoYXIoRlhfV0NIQVIgd2NoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIHByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgbmV4dCkgY29uc3QgeworICBDRlhfQ2hhciBjKHdjaCwga1RleHRMYXlvdXRDb2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdKTsKKyAgQ0ZYX0NoYXIgcChwcmV2LCBrVGV4dExheW91dENvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXByZXZdKTsKKyAgQ0ZYX0NoYXIgbihuZXh0LCBrVGV4dExheW91dENvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKW5leHRdKTsKKyAgcmV0dXJuIEdldEZvcm1DaGFyKCZjLCAmcCwgJm4pOworfQorRlhfV0NIQVIgQ0ZYX0FyYWJpY0NoYXI6OkdldEZvcm1DaGFyKGNvbnN0IENGWF9DaGFyKiBjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NoYXIqIHByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NoYXIqIG5leHQpIGNvbnN0IHsKKyAgRlhfQ0hBUlRZUEUgZUN1cjsKKyAgRlhfV0NIQVIgd0N1cjsKKyAgY29uc3QgRlhfQVJCRk9STVRBQkxFKiBmdCA9IFBhcnNlQ2hhcihjdXIsIHdDdXIsIGVDdXIpOworICBpZiAoZUN1ciA8IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYgfHwgZUN1ciA+PSBGWF9DSEFSVFlQRV9BcmFiaWNOb3JtYWwpIHsKKyAgICByZXR1cm4gd0N1cjsKKyAgfQorICBGWF9DSEFSVFlQRSBlUHJldjsKKyAgRlhfV0NIQVIgd1ByZXY7CisgIFBhcnNlQ2hhcihwcmV2LCB3UHJldiwgZVByZXYpOworICBpZiAod1ByZXYgPT0gMHgwNjQ0ICYmIGVDdXIgPT0gRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikgeworICAgIHJldHVybiAweEZFRkY7CisgIH0KKyAgRlhfQ0hBUlRZUEUgZU5leHQ7CisgIEZYX1dDSEFSIHdOZXh0OworICBQYXJzZUNoYXIobmV4dCwgd05leHQsIGVOZXh0KTsKKyAgRlhfQk9PTCBiQWxlZiA9IChlTmV4dCA9PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmICYmIHdDdXIgPT0gMHg2NDQpOworICBpZiAoZVByZXYgPCBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmKSB7CisgICAgaWYgKGJBbGVmKSB7CisgICAgICByZXR1cm4gRlhfR2V0QXJhYmljRnJvbUFsZWZUYWJsZSh3TmV4dCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAoZU5leHQgPCBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmKSA/IGZ0LT53SXNvbGF0ZWQgOiBmdC0+d0luaXRpYWw7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChiQWxlZikgeworICAgICAgd0N1ciA9IEZYX0dldEFyYWJpY0Zyb21BbGVmVGFibGUod05leHQpOworICAgICAgcmV0dXJuIChlUHJldiAhPSBGWF9DSEFSVFlQRV9BcmFiaWNEaXN0b3J0aW9uKSA/IHdDdXIgOiArK3dDdXI7CisgICAgfSBlbHNlIGlmIChlUHJldiA9PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmIHx8CisgICAgICAgICAgICAgICBlUHJldiA9PSBGWF9DSEFSVFlQRV9BcmFiaWNTcGVjaWFsKSB7CisgICAgICByZXR1cm4gKGVOZXh0IDwgRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikgPyBmdC0+d0lzb2xhdGVkIDogZnQtPndJbml0aWFsOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gKGVOZXh0IDwgRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikgPyBmdC0+d0ZpbmFsIDogZnQtPndNZWRpYWw7CisgICAgfQorICB9Cit9Citjb25zdCBGWF9BUkJGT1JNVEFCTEUqIENGWF9BcmFiaWNDaGFyOjpQYXJzZUNoYXIoY29uc3QgQ0ZYX0NoYXIqIHBUQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiYgd0NoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ0hBUlRZUEUmIGVUeXBlKSBjb25zdCB7CisgIGlmIChwVEMgPT0gTlVMTCkgeworICAgIGVUeXBlID0gRlhfQ0hBUlRZUEVfVW5rbm93bjsKKyAgICB3Q2hhciA9IDB4RkVGRjsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBlVHlwZSA9IChGWF9DSEFSVFlQRSlwVEMtPkdldENoYXJUeXBlKCk7CisgIHdDaGFyID0gKEZYX1dDSEFSKXBUQy0+bV93Q2hhckNvZGU7CisgIGNvbnN0IEZYX0FSQkZPUk1UQUJMRSogcEZUID0gRlhfR2V0QXJhYmljRm9ybVRhYmxlKHdDaGFyKTsKKyAgaWYgKHBGVCA9PSBOVUxMIHx8IGVUeXBlID49IEZYX0NIQVJUWVBFX0FyYWJpY05vcm1hbCkgeworICAgIGVUeXBlID0gRlhfQ0hBUlRZUEVfVW5rbm93bjsKKyAgfQorICByZXR1cm4gcEZUOworfQordm9pZCBGWF9CaWRpUmV2ZXJzZVN0cmluZyhDRlhfV2lkZVN0cmluZyYgd3NUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQpIHsKKyAgRlhTWVNfYXNzZXJ0KGlTdGFydCA+IC0xICYmIGlTdGFydCA8IHdzVGV4dC5HZXRMZW5ndGgoKSk7CisgIEZYU1lTX2Fzc2VydChpQ291bnQgPj0gMCAmJiBpU3RhcnQgKyBpQ291bnQgPD0gd3NUZXh0LkdldExlbmd0aCgpKTsKKyAgRlhfV0NIQVIgd2NoOworICBGWF9XQ0hBUiogcFN0YXJ0ID0gKEZYX1dDSEFSKikoY29uc3QgRlhfV0NIQVIqKXdzVGV4dDsKKyAgcFN0YXJ0ICs9IGlTdGFydDsKKyAgRlhfV0NIQVIqIHBFbmQgPSBwU3RhcnQgKyBpQ291bnQgLSAxOworICB3aGlsZSAocFN0YXJ0IDwgcEVuZCkgeworICAgIHdjaCA9ICpwU3RhcnQ7CisgICAgKnBTdGFydCsrID0gKnBFbmQ7CisgICAgKnBFbmQtLSA9IHdjaDsKKyAgfQorfQordm9pZCBGWF9CaWRpU2V0RGVmZXJyZWRSdW4oQ0ZYX0ludDMyQXJyYXkmIHZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZSkgeworICBGWFNZU19hc3NlcnQoaVN0YXJ0ID4gLTEgJiYgaVN0YXJ0IDw9IHZhbHVlcy5HZXRTaXplKCkpOworICBGWFNZU19hc3NlcnQoaVN0YXJ0IC0gaUNvdW50ID4gLTEpOworICBmb3IgKGludDMyX3QgaSA9IGlTdGFydCAtIDE7IGkgPj0gaVN0YXJ0IC0gaUNvdW50OyBpLS0pIHsKKyAgICB2YWx1ZXMuU2V0QXQoaSwgaVZhbHVlKTsKKyAgfQorfQorY29uc3QgaW50MzJfdCBnY19GWF9CaWRpTlR5cGVzW10gPSB7CisgICAgRlhfQklESUNMQVNTX04sICAgRlhfQklESUNMQVNTX0wsICAgRlhfQklESUNMQVNTX1IsICAgRlhfQklESUNMQVNTX0FOLAorICAgIEZYX0JJRElDTEFTU19FTiwgIEZYX0JJRElDTEFTU19BTCwgIEZYX0JJRElDTEFTU19OU00sIEZYX0JJRElDTEFTU19DUywKKyAgICBGWF9CSURJQ0xBU1NfRVMsICBGWF9CSURJQ0xBU1NfRVQsICBGWF9CSURJQ0xBU1NfQk4sICBGWF9CSURJQ0xBU1NfQk4sCisgICAgRlhfQklESUNMQVNTX04sICAgRlhfQklESUNMQVNTX0IsICAgRlhfQklESUNMQVNTX1JMTywgRlhfQklESUNMQVNTX1JMRSwKKyAgICBGWF9CSURJQ0xBU1NfTFJPLCBGWF9CSURJQ0xBU1NfTFJFLCBGWF9CSURJQ0xBU1NfUERGLCBGWF9CSURJQ0xBU1NfT04sCit9Owordm9pZCBGWF9CaWRpQ2xhc3NpZnkoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5JiBjbGFzc2VzLAorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiV1MpIHsKKyAgRlhTWVNfYXNzZXJ0KHdzVGV4dC5HZXRMZW5ndGgoKSA9PSBjbGFzc2VzLkdldFNpemUoKSk7CisgIGludDMyX3QgaUNvdW50ID0gd3NUZXh0LkdldExlbmd0aCgpOworICBjb25zdCBGWF9XQ0hBUiogcHdzU3RhcnQgPSAoY29uc3QgRlhfV0NIQVIqKXdzVGV4dDsKKyAgRlhfV0NIQVIgd2NoOworICBpbnQzMl90IGlDbHM7CisgIGlmIChiV1MpIHsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgICAgd2NoID0gKnB3c1N0YXJ0Kys7CisgICAgICBpQ2xzID0KKyAgICAgICAgICAoKGtUZXh0TGF5b3V0Q29kZVByb3BlcnRpZXNbKEZYX1dPUkQpd2NoXSAmIEZYX0JJRElDTEFTU0JJVFNNQVNLKSA+PgorICAgICAgICAgICBGWF9CSURJQ0xBU1NCSVRTKTsKKyAgICAgIGNsYXNzZXMuU2V0QXQoaSwgaUNscyk7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7CisgICAgICB3Y2ggPSAqcHdzU3RhcnQrKzsKKyAgICAgIGlDbHMgPQorICAgICAgICAgICgoa1RleHRMYXlvdXRDb2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdICYgRlhfQklESUNMQVNTQklUU01BU0spID4+CisgICAgICAgICAgIEZYX0JJRElDTEFTU0JJVFMpOworICAgICAgY2xhc3Nlcy5TZXRBdChpLCBnY19GWF9CaWRpTlR5cGVzW2lDbHNdKTsKKyAgICB9CisgIH0KK30KK2ludDMyX3QgRlhfQmlkaVJlc29sdmVFeHBsaWNpdChpbnQzMl90IGlCYXNlTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5JiBjbGFzc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5JiBsZXZlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTmVzdCkgeworICBGWFNZU19hc3NlcnQoaUJhc2VMZXZlbCA+PSAwICYmIGlCYXNlTGV2ZWwgPD0gRlhfQklESU1BWExFVkVMICYmIGlOZXN0ID49IDApOworICBGWFNZU19hc3NlcnQoY2xhc3Nlcy5HZXRTaXplKCkgPT0gbGV2ZWxzLkdldFNpemUoKSk7CisgIEZYU1lTX2Fzc2VydChpU3RhcnQgPj0gMCAmJiBpU3RhcnQgPCBjbGFzc2VzLkdldFNpemUoKSk7CisgIEZYU1lTX2Fzc2VydChpQ291bnQgPj0gMCAmJiBpU3RhcnQgKyBpQ291bnQgPD0gY2xhc3Nlcy5HZXRTaXplKCkpOworICBpZiAoaUNvdW50IDwgMSkgeworICAgIHJldHVybiAwOworICB9CisjaWYgMAorICAgIGludDMyX3QgaUxhc3ROZXN0ID0gaU5lc3Q7CisjZW5kaWYKKyAgaW50MzJfdCBpU2l6ZSA9IGNsYXNzZXMuR2V0U2l6ZSgpOworICBpbnQzMl90IGkgPSBpU3RhcnQsIGlDdXIsIGlDbHM7CisgIGZvciAoOyBpIDwgaVNpemUgJiYgaUNvdW50ID4gMDsgaSsrLCBpQ291bnQtLSkgeworICAgIGlDdXIgPSBpQ2xzID0gY2xhc3Nlcy5HZXRBdChpKTsKKyNpZiAwCisgICAgICAgIHN3aXRjaCAoaUNscykgeworICAgICAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfTFJPOgorICAgICAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfTFJFOgorICAgICAgICAgICAgICAgIGNsYXNzZXMuU2V0QXQoaSwgRlhfQklESUNMQVNTX0JOKTsKKyAgICAgICAgICAgICAgICBpQ2xzID0gRlhfQklESUNMQVNTX0JOOworICAgICAgICAgICAgICAgIGlOZXN0ICsrOworICAgICAgICAgICAgICAgIGlmIChGWF9CaWRpR3JlYXRlckV2ZW4oaUJhc2VMZXZlbCkgPD0gTUFYX0xFVkVMKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxldmVsID0gRlhfQmlkaUdyZWF0ZXJFdmVuKGlCYXNlTGV2ZWwpOworICAgICAgICAgICAgICAgICAgICBsZXZlbHMuU2V0QXQoaSwgaUxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgaSArPSBGWF9CaWRpUmVzb2x2ZUV4cGxpY2l0KGlMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpQ2xzID09IEZYX0JJRElDTEFTU19MUkUgPyBGWF9CSURJQ0xBU1NfTiA6IEZYX0JJRElDTEFTU19MKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDb3VudCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTmVzdCk7CisgICAgICAgICAgICAgICAgICAgIGlOZXN0IC0tOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19STE86CisgICAgICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19STEU6CisgICAgICAgICAgICAgICAgY2xhc3Nlcy5TZXRBdChpLCBGWF9CSURJQ0xBU1NfQk4pOworICAgICAgICAgICAgICAgIGlDbHMgPSBGWF9CSURJQ0xBU1NfQk47CisgICAgICAgICAgICAgICAgaU5lc3QgKys7CisgICAgICAgICAgICAgICAgaWYgKEZYX0JpZGlHcmVhdGVyT2RkKGlCYXNlTGV2ZWwpIDw9IE1BWF9MRVZFTCkgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZXZlbCA9IEZYX0JpZGlHcmVhdGVyT2RkKGlCYXNlTGV2ZWwpOworICAgICAgICAgICAgICAgICAgICBsZXZlbHMuU2V0QXQoaSwgaUxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgaSArPSBGWF9CaWRpUmVzb2x2ZUV4cGxpY2l0KGlMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpQ2xzID09IEZYX0JJRElDTEFTU19STEUgPyBGWF9CSURJQ0xBU1NfTiA6IEZYX0JJRElDTEFTU19SKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDb3VudCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTmVzdCk7CisgICAgICAgICAgICAgICAgICAgIGlOZXN0IC0tOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19QREY6CisgICAgICAgICAgICAgICAgY2xhc3Nlcy5TZXRBdChpLCBGWF9CSURJQ0xBU1NfQk4pOworICAgICAgICAgICAgICAgIGlDbHMgPSBGWF9CSURJQ0xBU1NfQk47CisgICAgICAgICAgICAgICAgaWYgKGlOZXN0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpTGFzdE5lc3QgPCBpTmVzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaU5lc3QgLS07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpU2l6ZSA9IGk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaUN1ciA9IGlDbHM7CisjZW5kaWYKKyAgICBpZiAoaURpcmVjdGlvbiAhPSBGWF9CSURJQ0xBU1NfTikgeworICAgICAgaUNscyA9IGlEaXJlY3Rpb247CisgICAgfQorICAgIGlmIChpQ3VyICE9IEZYX0JJRElDTEFTU19CTikgeworICAgICAgY2xhc3Nlcy5TZXRBdChpLCBpQ2xzKTsKKyAgICB9CisgICAgbGV2ZWxzLlNldEF0KGksIGlCYXNlTGV2ZWwpOworICB9CisgIHJldHVybiBpIC0gaVN0YXJ0OworfQorY29uc3QgaW50MzJfdCBnY19GWF9CaWRpV2Vha1N0YXRlc1tdWzEwXSA9IHsKKyAgICB7RlhfQldTYW8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTY24sIEZYX0JXU2NuLCBGWF9CV1N4YSwgRlhfQldTeGEsCisgICAgIEZYX0JXU2FvLCBGWF9CV1NhbywgRlhfQldTYW99LAorICAgIHtGWF9CV1NybywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NyYSwgRlhfQldTcmUsIEZYX0JXU3hhLCBGWF9CV1N4ciwKKyAgICAgRlhfQldTcm8sIEZYX0JXU3JvLCBGWF9CV1NydH0sCisgICAge0ZYX0JXU2xvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU2xhLCBGWF9CV1NsZSwgRlhfQldTeGEsIEZYX0JXU3hsLAorICAgICBGWF9CV1NsbywgRlhfQldTbG8sIEZYX0JXU2x0fSwKKyAgICB7RlhfQldTYW8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTY24sIEZYX0JXU2NuLCBGWF9CV1N4YSwgRlhfQldTYW8sCisgICAgIEZYX0JXU2FvLCBGWF9CV1NhbywgRlhfQldTYW99LAorICAgIHtGWF9CV1NybywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NyYSwgRlhfQldTcmUsIEZYX0JXU3hhLCBGWF9CV1NybywKKyAgICAgRlhfQldTcm8sIEZYX0JXU3JvLCBGWF9CV1NydH0sCisgICAge0ZYX0JXU2xvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU2xhLCBGWF9CV1NsZSwgRlhfQldTeGEsIEZYX0JXU2xvLAorICAgICBGWF9CV1NsbywgRlhfQldTbG8sIEZYX0JXU2x0fSwKKyAgICB7RlhfQldTcm8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTcmEsIEZYX0JXU3JlLCBGWF9CV1N4YSwgRlhfQldTcnQsCisgICAgIEZYX0JXU3JvLCBGWF9CV1NybywgRlhfQldTcnR9LAorICAgIHtGWF9CV1NsbywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NsYSwgRlhfQldTbGUsIEZYX0JXU3hhLCBGWF9CV1NsdCwKKyAgICAgRlhfQldTbG8sIEZYX0JXU2xvLCBGWF9CV1NsdH0sCisgICAge0ZYX0JXU2FvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU2NuLCBGWF9CV1NjbiwgRlhfQldTeGEsIEZYX0JXU2NuLAorICAgICBGWF9CV1NhYywgRlhfQldTYW8sIEZYX0JXU2FvfSwKKyAgICB7RlhfQldTcm8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTcmEsIEZYX0JXU3JlLCBGWF9CV1N4YSwgRlhfQldTcmEsCisgICAgIEZYX0JXU3JjLCBGWF9CV1NybywgRlhfQldTcnR9LAorICAgIHtGWF9CV1NybywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NyYSwgRlhfQldTcmUsIEZYX0JXU3hhLCBGWF9CV1NyZSwKKyAgICAgRlhfQldTcnMsIEZYX0JXU3JzLCBGWF9CV1NyZXR9LAorICAgIHtGWF9CV1NsbywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NsYSwgRlhfQldTbGUsIEZYX0JXU3hhLCBGWF9CV1NsYSwKKyAgICAgRlhfQldTbGMsIEZYX0JXU2xvLCBGWF9CV1NsdH0sCisgICAge0ZYX0JXU2xvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU2xhLCBGWF9CV1NsZSwgRlhfQldTeGEsIEZYX0JXU2xlLAorICAgICBGWF9CV1NscywgRlhfQldTbHMsIEZYX0JXU2xldH0sCisgICAge0ZYX0JXU2FvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU2NuLCBGWF9CV1NjbiwgRlhfQldTeGEsIEZYX0JXU2FvLAorICAgICBGWF9CV1NhbywgRlhfQldTYW8sIEZYX0JXU2FvfSwKKyAgICB7RlhfQldTcm8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTcmEsIEZYX0JXU3JlLCBGWF9CV1N4YSwgRlhfQldTcm8sCisgICAgIEZYX0JXU3JvLCBGWF9CV1NybywgRlhfQldTcnR9LAorICAgIHtGWF9CV1NybywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NyYSwgRlhfQldTcmUsIEZYX0JXU3hhLCBGWF9CV1NybywKKyAgICAgRlhfQldTcm8sIEZYX0JXU3JvLCBGWF9CV1NydH0sCisgICAge0ZYX0JXU2xvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU2xhLCBGWF9CV1NsZSwgRlhfQldTeGEsIEZYX0JXU2xvLAorICAgICBGWF9CV1NsbywgRlhfQldTbG8sIEZYX0JXU2x0fSwKKyAgICB7RlhfQldTbG8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTbGEsIEZYX0JXU2xlLCBGWF9CV1N4YSwgRlhfQldTbG8sCisgICAgIEZYX0JXU2xvLCBGWF9CV1NsbywgRlhfQldTbHR9LAorICAgIHtGWF9CV1NybywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NyYSwgRlhfQldTcmUsIEZYX0JXU3hhLCBGWF9CV1NyZXQsCisgICAgIEZYX0JXU3JvLCBGWF9CV1NybywgRlhfQldTcmV0fSwKKyAgICB7RlhfQldTbG8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTbGEsIEZYX0JXU2xlLCBGWF9CV1N4YSwgRlhfQldTbGV0LAorICAgICBGWF9CV1NsbywgRlhfQldTbG8sIEZYX0JXU2xldH0sCit9OworY29uc3QgaW50MzJfdCBnY19GWF9CaWRpV2Vha0FjdGlvbnNbXVsxMF0gPSB7CisgICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhBLCBGWF9CV0F4eFIsCisgICAgIEZYX0JXQXh4UiwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXh4Tn0sCisgICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhFLCBGWF9CV0F4eFIsCisgICAgIEZYX0JXQXh4UiwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXhJeH0sCisgICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhMLCBGWF9CV0F4eFIsCisgICAgIEZYX0JXQXh4TCwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXhJeH0sCisgICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhBLCBGWF9CV0F4eFIsCisgICAgIEZYX0JXQXh4TiwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXh4Tn0sCisgICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhFLCBGWF9CV0F4eFIsCisgICAgIEZYX0JXQXh4TiwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXhJeH0sCisgICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhMLCBGWF9CV0F4eFIsCisgICAgIEZYX0JXQXh4TiwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXhJeH0sCisgICAge0ZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBRXhFLCBGWF9CV0FOeFIsCisgICAgIEZYX0JXQXhJeCwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQXhJeH0sCisgICAge0ZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBTHhMLCBGWF9CV0FOeFIsCisgICAgIEZYX0JXQXhJeCwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQXhJeH0sCisgICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhBLCBGWF9CV0F4eFIsCisgICAgIEZYX0JXQXh4QSwgRlhfQldBeEl4LCBGWF9CV0F4eE4sIEZYX0JXQXh4Tn0sCisgICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhFLCBGWF9CV0F4eFIsCisgICAgIEZYX0JXQXh4QSwgRlhfQldBeEl4LCBGWF9CV0F4eE4sIEZYX0JXQXhJeH0sCisgICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhFLCBGWF9CV0F4eFIsCisgICAgIEZYX0JXQXh4RSwgRlhfQldBeEl4LCBGWF9CV0F4SXgsIEZYX0JXQXh4RX0sCisgICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhMLCBGWF9CV0F4eFIsCisgICAgIEZYX0JXQXh4QSwgRlhfQldBeEl4LCBGWF9CV0F4eE4sIEZYX0JXQXhJeH0sCisgICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhMLCBGWF9CV0F4eFIsCisgICAgIEZYX0JXQXh4TCwgRlhfQldBeEl4LCBGWF9CV0F4SXgsIEZYX0JXQXh4TH0sCisgICAge0ZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQUF4eCwgRlhfQldBQXhBLCBGWF9CV0FOeFIsCisgICAgIEZYX0JXQU54TiwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQU54Tn0sCisgICAge0ZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQUF4eCwgRlhfQldBTnhFLCBGWF9CV0FOeFIsCisgICAgIEZYX0JXQU54TiwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQU5JeH0sCisgICAge0ZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBRXhFLCBGWF9CV0FOeFIsCisgICAgIEZYX0JXQU54TiwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQU5JeH0sCisgICAge0ZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQUF4eCwgRlhfQldBTnhMLCBGWF9CV0FOeFIsCisgICAgIEZYX0JXQU54TiwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQU5JeH0sCisgICAge0ZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBTHhMLCBGWF9CV0FOeFIsCisgICAgIEZYX0JXQU54TiwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQU5JeH0sCisgICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhFLCBGWF9CV0F4eFIsCisgICAgIEZYX0JXQXh4RSwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXh4RX0sCisgICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhMLCBGWF9CV0F4eFIsCisgICAgIEZYX0JXQXh4TCwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXh4TH0sCit9Owordm9pZCBGWF9CaWRpUmVzb2x2ZVdlYWsoaW50MzJfdCBpQmFzZUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkmIGNsYXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSYgbGV2ZWxzKSB7CisgIEZYU1lTX2Fzc2VydChpQmFzZUxldmVsID49IDAgJiYgaUJhc2VMZXZlbCA8PSBGWF9CSURJTUFYTEVWRUwpOworICBGWFNZU19hc3NlcnQoY2xhc3Nlcy5HZXRTaXplKCkgPT0gbGV2ZWxzLkdldFNpemUoKSk7CisgIGludDMyX3QgaVNpemUgPSBjbGFzc2VzLkdldFNpemUoKTsKKyAgaWYgKGlTaXplIDwgMSkgeworICAgIHJldHVybjsKKyAgfQorICBpU2l6ZS0tOworICBpbnQzMl90IGlMZXZlbEN1ciA9IGlCYXNlTGV2ZWw7CisgIGludDMyX3QgaVN0YXRlID0gRlhfSXNPZGQoaUJhc2VMZXZlbCkgPyBGWF9CV1N4ciA6IEZYX0JXU3hsOworICBpbnQzMl90IGkgPSAwLCBpQ291bnQgPSAwLCBpQ2xzQ3VyLCBpQ2xzUnVuLCBpQ2xzTmV3LCBpQWN0aW9uOworICBmb3IgKDsgaSA8PSBpU2l6ZTsgaSsrKSB7CisgICAgaUNsc0N1ciA9IGNsYXNzZXMuR2V0QXQoaSk7CisjaWYgMAorICAgICAgICBpZiAoaUNsc0N1ciA9PSBGWF9CSURJQ0xBU1NfQk4pIHsKKyAgICAgICAgICAgIGxldmVscy5TZXRBdChpLCBpTGV2ZWxDdXIpOworICAgICAgICAgICAgaWYgKGkgPT0gaVNpemUgJiYgaUxldmVsQ3VyICE9IGlCYXNlTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBpQ2xzQ3VyID0gRlhfQmlkaURpcmVjdGlvbihpTGV2ZWxDdXIpOworICAgICAgICAgICAgICAgIGNsYXNzZXMuU2V0QXQoaSwgaUNsc0N1cik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPCBpU2l6ZSkgeworICAgICAgICAgICAgICAgIGludDMyX3QgaUxldmVsTmV4dCwgaUxldmVsTmV3OworICAgICAgICAgICAgICAgIGlDbHNOZXcgPSBjbGFzc2VzLkdldEF0KGkgKyAxKTsKKyAgICAgICAgICAgICAgICBpTGV2ZWxOZXh0ID0gbGV2ZWxzLkdldEF0KGkgKyAxKTsKKyAgICAgICAgICAgICAgICBpZiAoaUNsc05ldyAhPSBGWF9CSURJQ0xBU1NfQk4gJiYgaUxldmVsQ3VyICE9IGlMZXZlbE5leHQpIHsKKyAgICAgICAgICAgICAgICAgICAgaUxldmVsTmV3ID0gaUxldmVsTmV4dDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlMZXZlbEN1ciA+IGlMZXZlbE5ldykgeworICAgICAgICAgICAgICAgICAgICAgICAgaUxldmVsTmV3ID0gaUxldmVsQ3VyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxldmVscy5TZXRBdChpLCBpTGV2ZWxOZXcpOworICAgICAgICAgICAgICAgICAgICBpQ2xzQ3VyID0gRlhfQmlkaURpcmVjdGlvbihpTGV2ZWxOZXcpOworICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLlNldEF0KGksIGlDbHNDdXIpOworICAgICAgICAgICAgICAgICAgICBpTGV2ZWxDdXIgPSBpTGV2ZWxOZXh0OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlDb3VudCArKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJSZXQgPSAoaUNvbnRleHQgIT0gMCk7CisgICAgICAgICAgICAgICAgaWYgKGlDb3VudCkgeworICAgICAgICAgICAgICAgICAgICBpQ291bnQgKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChiUmV0KSB7Ci0gICAgICAgICAgICBtX2lMYXN0QmlkaSA9IG1faUN1ckJpZGk7Ci0gICAgICAgICAgICBtX2lMYXN0U3RhcnQgPSBtX2lDdXJTdGFydDsKLSAgICAgICAgICAgIG1faUN1clN0YXJ0ID0gbV9pQ3VyQ291bnQ7Ci0gICAgICAgICAgICBtX2lMYXN0Q291bnQgPSBtX2lDdXJDb3VudCAtIG1faUxhc3RTdGFydDsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9iU2VwYXJhdGVOZXV0cmFsIHx8IGlDb250ZXh0ICE9IDApIHsKLSAgICAgICAgICAgIG1faUN1ckJpZGkgPSBpQ29udGV4dDsKLSAgICAgICAgfQorI2VuZGlmCisgICAgRlhTWVNfYXNzZXJ0KGlDbHNDdXIgPD0gRlhfQklESUNMQVNTX0JOKTsKKyAgICBpQWN0aW9uID0gZ2NfRlhfQmlkaVdlYWtBY3Rpb25zW2lTdGF0ZV1baUNsc0N1cl07CisgICAgaUNsc1J1biA9IEZYX0JpZGlHZXREZWZlcnJlZFR5cGUoaUFjdGlvbik7CisgICAgaWYgKGlDbHNSdW4gIT0gRlhfQklESVdFQUtBQ1RJT05fWFggJiYgaUNvdW50ID4gMCkgeworICAgICAgRlhfQmlkaVNldERlZmVycmVkUnVuKGNsYXNzZXMsIGksIGlDb3VudCwgaUNsc1J1bik7CisgICAgICBpQ291bnQgPSAwOwogICAgIH0KLSAgICBtX2lDdXJDb3VudCArKzsKLSAgICByZXR1cm4gYlJldDsKKyAgICBpQ2xzTmV3ID0gRlhfQmlkaUdldFJlc29sdmVkVHlwZShpQWN0aW9uKTsKKyAgICBpZiAoaUNsc05ldyAhPSBGWF9CSURJV0VBS0FDVElPTl9YWCkgeworICAgICAgY2xhc3Nlcy5TZXRBdChpLCBpQ2xzTmV3KTsKKyAgICB9CisgICAgaWYgKEZYX0JJRElXRUFLQUNUSU9OX0lYICYgaUFjdGlvbikgeworICAgICAgaUNvdW50Kys7CisgICAgfQorICAgIGlTdGF0ZSA9IGdjX0ZYX0JpZGlXZWFrU3RhdGVzW2lTdGF0ZV1baUNsc0N1cl07CisgIH0KKyAgaUNsc0N1ciA9IEZYX0JpZGlEaXJlY3Rpb24oaUxldmVsQ3VyKTsKKyAgaUNsc1J1biA9IEZYX0JpZGlHZXREZWZlcnJlZFR5cGUoZ2NfRlhfQmlkaVdlYWtBY3Rpb25zW2lTdGF0ZV1baUNsc0N1cl0pOworICBpZiAoaUNsc1J1biAhPSBGWF9CSURJV0VBS0FDVElPTl9YWCAmJiBpQ291bnQgPiAwKSB7CisgICAgRlhfQmlkaVNldERlZmVycmVkUnVuKGNsYXNzZXMsIGksIGlDb3VudCwgaUNsc1J1bik7CisgIH0KIH0KLUZYX0JPT0wgQ0ZYX0JpZGlDaGFyOjpFbmRDaGFyKCkKLXsKLSAgICBtX2lMYXN0QmlkaSA9IG1faUN1ckJpZGk7Ci0gICAgbV9pTGFzdFN0YXJ0ID0gbV9pQ3VyU3RhcnQ7Ci0gICAgbV9pQ3VyU3RhcnQgPSBtX2lDdXJDb3VudDsKLSAgICBtX2lMYXN0Q291bnQgPSBtX2lDdXJDb3VudCAtIG1faUxhc3RTdGFydDsKLSAgICByZXR1cm4gbV9pTGFzdENvdW50ID4gMDsKK2NvbnN0IGludDMyX3QgZ2NfRlhfQmlkaU5ldXRyYWxTdGF0ZXNbXVs1XSA9IHsKKyAgICB7RlhfQk5Tcm4sIEZYX0JOU2wsIEZYX0JOU3IsIEZYX0JOU3IsIEZYX0JOU3J9LAorICAgIHtGWF9CTlNsbiwgRlhfQk5TbCwgRlhfQk5TciwgRlhfQk5TYSwgRlhfQk5TbH0sCisgICAge0ZYX0JOU3JuLCBGWF9CTlNsLCBGWF9CTlNyLCBGWF9CTlNyLCBGWF9CTlNyfSwKKyAgICB7RlhfQk5TbG4sIEZYX0JOU2wsIEZYX0JOU3IsIEZYX0JOU2EsIEZYX0JOU2x9LAorICAgIHtGWF9CTlNuYSwgRlhfQk5TbCwgRlhfQk5TciwgRlhfQk5TYSwgRlhfQk5TbH0sCisgICAge0ZYX0JOU25hLCBGWF9CTlNsLCBGWF9CTlNyLCBGWF9CTlNhLCBGWF9CTlNsfSwKK307Citjb25zdCBpbnQzMl90IGdjX0ZYX0JpZGlOZXV0cmFsQWN0aW9uc1tdWzVdID0geworICAgIHtGWF9CTkFJbiwgMCwgMCwgMCwgMH0sCisgICAge0ZYX0JOQUluLCAwLCAwLCAwLCBGWF9CQ0x9LAorICAgIHtGWF9CTkFJbiwgRlhfQk5BRW4sIEZYX0JOQVJuLCBGWF9CTkFSbiwgRlhfQk5BUm59LAorICAgIHtGWF9CTkFJbiwgRlhfQk5BTG4sIEZYX0JOQUVuLCBGWF9CTkFFbiwgRlhfQk5BTG5MfSwKKyAgICB7RlhfQk5BSW4sIDAsIDAsIDAsIEZYX0JDTH0sCisgICAge0ZYX0JOQUluLCBGWF9CTkFFbiwgRlhfQk5BUm4sIEZYX0JOQVJuLCBGWF9CTkFFbn0sCit9OworaW50MzJfdCBGWF9CaWRpR2V0RGVmZXJyZWROZXV0cmFscyhpbnQzMl90IGlBY3Rpb24sIGludDMyX3QgaUxldmVsKSB7CisgIGlBY3Rpb24gPSAoaUFjdGlvbiA+PiA0KSAmIDB4RjsKKyAgaWYgKGlBY3Rpb24gPT0gKEZYX0JJRElORVVUUkFMQUNUSU9OX0VuID4+IDQpKSB7CisgICAgcmV0dXJuIEZYX0JpZGlEaXJlY3Rpb24oaUxldmVsKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gaUFjdGlvbjsKKyAgfQogfQotRlhfSU5UMzIgQ0ZYX0JpZGlDaGFyOjpHZXRCaWRpSW5mbyhGWF9JTlQzMiAmaVN0YXJ0LCBGWF9JTlQzMiAmaUNvdW50KQotewotICAgIGlTdGFydCA9IG1faUxhc3RTdGFydDsKLSAgICBpQ291bnQgPSBtX2lMYXN0Q291bnQ7Ci0gICAgcmV0dXJuIG1faUxhc3RCaWRpOworaW50MzJfdCBGWF9CaWRpR2V0UmVzb2x2ZWROZXV0cmFscyhpbnQzMl90IGlBY3Rpb24pIHsKKyAgaUFjdGlvbiA9IChpQWN0aW9uICYgMHhGKTsKKyAgaWYgKGlBY3Rpb24gPT0gRlhfQklESU5FVVRSQUxBQ1RJT05fSW4pIHsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gaUFjdGlvbjsKKyAgfQogfQotdm9pZCBDRlhfQmlkaUNoYXI6OlJlc2V0KCkKLXsKLSAgICBtX2lDdXJTdGFydCA9IDA7Ci0gICAgbV9pQ3VyQ291bnQgPSAwOwotICAgIG1faUN1ckJpZGkgPSAwOwotICAgIG1faUxhc3RCaWRpID0gMDsKLSAgICBtX2lMYXN0U3RhcnQgPSAwOwotICAgIG1faUxhc3RDb3VudCA9IDA7Cit2b2lkIEZYX0JpZGlSZXNvbHZlTmV1dHJhbHMoaW50MzJfdCBpQmFzZUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5JiBjbGFzc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9JbnQzMkFycmF5JiBsZXZlbHMpIHsKKyAgRlhTWVNfYXNzZXJ0KGlCYXNlTGV2ZWwgPj0gMCAmJiBpQmFzZUxldmVsIDw9IEZYX0JJRElNQVhMRVZFTCk7CisgIEZYU1lTX2Fzc2VydChjbGFzc2VzLkdldFNpemUoKSA9PSBsZXZlbHMuR2V0U2l6ZSgpKTsKKyAgaW50MzJfdCBpU2l6ZSA9IGNsYXNzZXMuR2V0U2l6ZSgpOworICBpZiAoaVNpemUgPCAxKSB7CisgICAgcmV0dXJuOworICB9CisgIGlTaXplLS07CisgIGludDMyX3QgaUxldmVsID0gaUJhc2VMZXZlbDsKKyAgaW50MzJfdCBpU3RhdGUgPSBGWF9Jc09kZChpQmFzZUxldmVsKSA/IEZYX0JOU3IgOiBGWF9CTlNsOworICBpbnQzMl90IGkgPSAwLCBpQ291bnQgPSAwLCBpQ2xzQ3VyLCBpQ2xzUnVuLCBpQ2xzTmV3LCBpQWN0aW9uOworICBmb3IgKDsgaSA8PSBpU2l6ZTsgaSsrKSB7CisgICAgaUNsc0N1ciA9IGNsYXNzZXMuR2V0QXQoaSk7CisgICAgaWYgKGlDbHNDdXIgPT0gRlhfQklESUNMQVNTX0JOKSB7CisgICAgICBpZiAoaUNvdW50KSB7CisgICAgICAgIGlDb3VudCsrOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorICAgIEZYU1lTX2Fzc2VydChpQ2xzQ3VyIDwgRlhfQklESUNMQVNTX0FMKTsKKyAgICBpQWN0aW9uID0gZ2NfRlhfQmlkaU5ldXRyYWxBY3Rpb25zW2lTdGF0ZV1baUNsc0N1cl07CisgICAgaUNsc1J1biA9IEZYX0JpZGlHZXREZWZlcnJlZE5ldXRyYWxzKGlBY3Rpb24sIGlMZXZlbCk7CisgICAgaWYgKGlDbHNSdW4gIT0gRlhfQklESUNMQVNTX04gJiYgaUNvdW50ID4gMCkgeworICAgICAgRlhfQmlkaVNldERlZmVycmVkUnVuKGNsYXNzZXMsIGksIGlDb3VudCwgaUNsc1J1bik7CisgICAgICBpQ291bnQgPSAwOworICAgIH0KKyAgICBpQ2xzTmV3ID0gRlhfQmlkaUdldFJlc29sdmVkTmV1dHJhbHMoaUFjdGlvbik7CisgICAgaWYgKGlDbHNOZXcgIT0gRlhfQklESUNMQVNTX04pIHsKKyAgICAgIGNsYXNzZXMuU2V0QXQoaSwgaUNsc05ldyk7CisgICAgfQorICAgIGlmIChGWF9CSURJTkVVVFJBTEFDVElPTl9JbiAmIGlBY3Rpb24pIHsKKyAgICAgIGlDb3VudCsrOworICAgIH0KKyAgICBpU3RhdGUgPSBnY19GWF9CaWRpTmV1dHJhbFN0YXRlc1tpU3RhdGVdW2lDbHNDdXJdOworICAgIGlMZXZlbCA9IGxldmVscy5HZXRBdChpKTsKKyAgfQorICBpQ2xzQ3VyID0gRlhfQmlkaURpcmVjdGlvbihpTGV2ZWwpOworICBpQ2xzUnVuID0gRlhfQmlkaUdldERlZmVycmVkTmV1dHJhbHMoCisgICAgICBnY19GWF9CaWRpTmV1dHJhbEFjdGlvbnNbaVN0YXRlXVtpQ2xzQ3VyXSwgaUxldmVsKTsKKyAgaWYgKGlDbHNSdW4gIT0gRlhfQklESUNMQVNTX04gJiYgaUNvdW50ID4gMCkgeworICAgIEZYX0JpZGlTZXREZWZlcnJlZFJ1bihjbGFzc2VzLCBpLCBpQ291bnQsIGlDbHNSdW4pOworICB9Cit9Citjb25zdCBpbnQzMl90IGdjX0ZYX0JpZGlBZGRMZXZlbFtdWzRdID0geworICAgIHswLCAxLCAyLCAyfSwKKyAgICB7MSwgMCwgMSwgMX0sCit9Owordm9pZCBGWF9CaWRpUmVzb2x2ZUltcGxpY2l0KGNvbnN0IENGWF9JbnQzMkFycmF5JiBjbGFzc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5JiBsZXZlbHMpIHsKKyAgRlhTWVNfYXNzZXJ0KGNsYXNzZXMuR2V0U2l6ZSgpID09IGxldmVscy5HZXRTaXplKCkpOworICBpbnQzMl90IGlTaXplID0gY2xhc3Nlcy5HZXRTaXplKCk7CisgIGlmIChpU2l6ZSA8IDEpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaVNpemUtLTsKKyAgaW50MzJfdCBpQ2xzLCBpTGV2ZWw7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8PSBpU2l6ZTsgaSsrKSB7CisgICAgaUNscyA9IGNsYXNzZXMuR2V0QXQoaSk7CisgICAgaWYgKGlDbHMgPT0gRlhfQklESUNMQVNTX0JOKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgRlhTWVNfYXNzZXJ0KGlDbHMgPiBGWF9CSURJQ0xBU1NfT04gJiYgaUNscyA8IEZYX0JJRElDTEFTU19BTCk7CisgICAgaUxldmVsID0gbGV2ZWxzLkdldEF0KGkpOworICAgIGlMZXZlbCArPSBnY19GWF9CaWRpQWRkTGV2ZWxbRlhfSXNPZGQoaUxldmVsKV1baUNscyAtIDFdOworICAgIGxldmVscy5TZXRBdChpLCBpTGV2ZWwpOworICB9Cit9Cit2b2lkIEZYX0JpZGlSZXNvbHZlV2hpdGVzcGFjZShpbnQzMl90IGlCYXNlTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfSW50MzJBcnJheSYgY2xhc3NlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5JiBsZXZlbHMpIHsKKyAgRlhTWVNfYXNzZXJ0KGlCYXNlTGV2ZWwgPj0gMCAmJiBpQmFzZUxldmVsIDw9IEZYX0JJRElNQVhMRVZFTCk7CisgIEZYU1lTX2Fzc2VydChjbGFzc2VzLkdldFNpemUoKSA9PSBsZXZlbHMuR2V0U2l6ZSgpKTsKKyAgaW50MzJfdCBpU2l6ZSA9IGNsYXNzZXMuR2V0U2l6ZSgpOworICBpZiAoaVNpemUgPCAxKSB7CisgICAgcmV0dXJuOworICB9CisgIGlTaXplLS07CisgIGludDMyX3QgaUxldmVsID0gaUJhc2VMZXZlbDsKKyAgaW50MzJfdCBpID0gMCwgaUNvdW50ID0gMDsKKyAgZm9yICg7IGkgPD0gaVNpemU7IGkrKykgeworICAgIHN3aXRjaCAoY2xhc3Nlcy5HZXRBdChpKSkgeworICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfV1M6CisgICAgICAgIGlDb3VudCsrOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRlhfQklESUNMQVNTX1JMRToKKyAgICAgIGNhc2UgRlhfQklESUNMQVNTX0xSRToKKyAgICAgIGNhc2UgRlhfQklESUNMQVNTX0xSTzoKKyAgICAgIGNhc2UgRlhfQklESUNMQVNTX1JMTzoKKyAgICAgIGNhc2UgRlhfQklESUNMQVNTX1BERjoKKyAgICAgIGNhc2UgRlhfQklESUNMQVNTX0JOOgorICAgICAgICBsZXZlbHMuU2V0QXQoaSwgaUxldmVsKTsKKyAgICAgICAgaUNvdW50Kys7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfUzoKKyAgICAgIGNhc2UgRlhfQklESUNMQVNTX0I6CisgICAgICAgIGlmIChpQ291bnQgPiAwKSB7CisgICAgICAgICAgRlhfQmlkaVNldERlZmVycmVkUnVuKGxldmVscywgaSwgaUNvdW50LCBpQmFzZUxldmVsKTsKKyAgICAgICAgfQorICAgICAgICBsZXZlbHMuU2V0QXQoaSwgaUJhc2VMZXZlbCk7CisgICAgICAgIGlDb3VudCA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaUNvdW50ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlMZXZlbCA9IGxldmVscy5HZXRBdChpKTsKKyAgfQorICBpZiAoaUNvdW50ID4gMCkgeworICAgIEZYX0JpZGlTZXREZWZlcnJlZFJ1bihsZXZlbHMsIGksIGlDb3VudCwgaUJhc2VMZXZlbCk7CisgIH0KK30KK2ludDMyX3QgRlhfQmlkaVJlb3JkZXJMZXZlbChpbnQzMl90IGlCYXNlTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfSW50MzJBcnJheSYgbGV2ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJldmVyc2UpIHsKKyAgRlhTWVNfYXNzZXJ0KGlCYXNlTGV2ZWwgPj0gMCAmJiBpQmFzZUxldmVsIDw9IEZYX0JJRElNQVhMRVZFTCk7CisgIEZYU1lTX2Fzc2VydCh3c1RleHQuR2V0TGVuZ3RoKCkgPT0gbGV2ZWxzLkdldFNpemUoKSk7CisgIEZYU1lTX2Fzc2VydChpU3RhcnQgPj0gMCAmJiBpU3RhcnQgPCB3c1RleHQuR2V0TGVuZ3RoKCkpOworICBpbnQzMl90IGlTaXplID0gd3NUZXh0LkdldExlbmd0aCgpOworICBpZiAoaVNpemUgPCAxKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgYlJldmVyc2UgPSBiUmV2ZXJzZSB8fCBGWF9Jc09kZChpQmFzZUxldmVsKTsKKyAgaW50MzJfdCBpID0gaVN0YXJ0LCBpTGV2ZWw7CisgIGZvciAoOyBpIDwgaVNpemU7IGkrKykgeworICAgIGlmICgoaUxldmVsID0gbGV2ZWxzLkdldEF0KGkpKSA9PSBpQmFzZUxldmVsKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGlMZXZlbCA8IGlCYXNlTGV2ZWwpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpICs9IEZYX0JpZGlSZW9yZGVyTGV2ZWwoaUJhc2VMZXZlbCArIDEsIHdzVGV4dCwgbGV2ZWxzLCBpLCBiUmV2ZXJzZSkgLSAxOworICB9CisgIGludDMyX3QgaUNvdW50ID0gaSAtIGlTdGFydDsKKyAgaWYgKGJSZXZlcnNlICYmIGlDb3VudCA+IDEpIHsKKyAgICBGWF9CaWRpUmV2ZXJzZVN0cmluZyh3c1RleHQsIGlTdGFydCwgaUNvdW50KTsKKyAgfQorICByZXR1cm4gaUNvdW50OworfQordm9pZCBGWF9CaWRpUmVvcmRlcihpbnQzMl90IGlCYXNlTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RleHQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9JbnQzMkFycmF5JiBsZXZlbHMpIHsKKyAgRlhTWVNfYXNzZXJ0KGlCYXNlTGV2ZWwgPj0gMCAmJiBpQmFzZUxldmVsIDw9IEZYX0JJRElNQVhMRVZFTCk7CisgIEZYU1lTX2Fzc2VydCh3c1RleHQuR2V0TGVuZ3RoKCkgPT0gbGV2ZWxzLkdldFNpemUoKSk7CisgIGludDMyX3QgaVNpemUgPSB3c1RleHQuR2V0TGVuZ3RoKCk7CisgIGlmIChpU2l6ZSA8IDEpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW50MzJfdCBpID0gMDsKKyAgd2hpbGUgKGkgPCBpU2l6ZSkgeworICAgIGkgKz0gRlhfQmlkaVJlb3JkZXJMZXZlbChpQmFzZUxldmVsLCB3c1RleHQsIGxldmVscywgaSwgRkFMU0UpOworICB9Cit9Cit2b2lkIEZYX0JpZGlMaW5lKENGWF9XaWRlU3RyaW5nJiB3c1RleHQsIGludDMyX3QgaUJhc2VMZXZlbCkgeworICBpbnQzMl90IGlMZW5ndGggPSB3c1RleHQuR2V0TGVuZ3RoKCk7CisgIGlmIChpTGVuZ3RoIDwgMikgeworICAgIHJldHVybjsKKyAgfQorICBDRlhfSW50MzJBcnJheSBjbGFzc2VzLCBsZXZlbHM7CisgIGNsYXNzZXMuU2V0QXRHcm93KGlMZW5ndGggLSAxLCAwKTsKKyAgbGV2ZWxzLlNldEF0R3JvdyhpTGVuZ3RoIC0gMSwgMCk7CisgIEZYX0JpZGlDbGFzc2lmeSh3c1RleHQsIGNsYXNzZXMsIEZBTFNFKTsKKyAgRlhfQmlkaVJlc29sdmVFeHBsaWNpdChpQmFzZUxldmVsLCBGWF9CSURJQ0xBU1NfTiwgY2xhc3NlcywgbGV2ZWxzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlMZW5ndGgsIDApOworICBGWF9CaWRpUmVzb2x2ZVdlYWsoaUJhc2VMZXZlbCwgY2xhc3NlcywgbGV2ZWxzKTsKKyAgRlhfQmlkaVJlc29sdmVOZXV0cmFscyhpQmFzZUxldmVsLCBjbGFzc2VzLCBsZXZlbHMpOworICBGWF9CaWRpUmVzb2x2ZUltcGxpY2l0KGNsYXNzZXMsIGxldmVscyk7CisgIEZYX0JpZGlDbGFzc2lmeSh3c1RleHQsIGNsYXNzZXMsIFRSVUUpOworICBGWF9CaWRpUmVzb2x2ZVdoaXRlc3BhY2UoaUJhc2VMZXZlbCwgY2xhc3NlcywgbGV2ZWxzKTsKKyAgRlhfQmlkaVJlb3JkZXIoaUJhc2VMZXZlbCwgd3NUZXh0LCBsZXZlbHMpOworICBjbGFzc2VzLlJlbW92ZUFsbCgpOworICBsZXZlbHMuUmVtb3ZlQWxsKCk7Cit9Cit0ZW1wbGF0ZSA8Y2xhc3MgYmFzZVR5cGU+CitjbGFzcyBDRlhfQmlkaUxpbmVUZW1wbGF0ZSB7CisgcHVibGljOgorICB2b2lkIEZYX0JpZGlSZXZlcnNlU3RyaW5nKENGWF9BcnJheVRlbXBsYXRlPGJhc2VUeXBlPiYgY2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQpIHsKKyAgICBGWFNZU19hc3NlcnQoaVN0YXJ0ID4gLTEgJiYgaVN0YXJ0IDwgY2hhcnMuR2V0U2l6ZSgpKTsKKyAgICBGWFNZU19hc3NlcnQoaUNvdW50ID49IDAgJiYgaVN0YXJ0ICsgaUNvdW50IDw9IGNoYXJzLkdldFNpemUoKSk7CisgICAgYmFzZVR5cGUgKnBTdGFydCwgKnBFbmQ7CisgICAgaW50MzJfdCBpRW5kID0gaVN0YXJ0ICsgaUNvdW50IC0gMSwgaVRlbXA7CisgICAgd2hpbGUgKGlTdGFydCA8IGlFbmQpIHsKKyAgICAgIHBTdGFydCA9IGNoYXJzLkdldERhdGFQdHIoaVN0YXJ0KyspOworICAgICAgcEVuZCA9IGNoYXJzLkdldERhdGFQdHIoaUVuZC0tKTsKKyAgICAgIGlUZW1wID0gcFN0YXJ0LT5tX2lCaWRpUG9zOworICAgICAgcFN0YXJ0LT5tX2lCaWRpUG9zID0gcEVuZC0+bV9pQmlkaVBvczsKKyAgICAgIHBFbmQtPm1faUJpZGlQb3MgPSBpVGVtcDsKKyAgICB9CisgIH0KKyAgdm9pZCBGWF9CaWRpU2V0RGVmZXJyZWRSdW4oQ0ZYX0FycmF5VGVtcGxhdGU8YmFzZVR5cGU+JiBjaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWUpIHsKKyAgICBGWFNZU19hc3NlcnQoaVN0YXJ0ID4gLTEgJiYgaVN0YXJ0IDw9IGNoYXJzLkdldFNpemUoKSk7CisgICAgRlhTWVNfYXNzZXJ0KGlTdGFydCAtIGlDb3VudCA+IC0xKTsKKyAgICBiYXNlVHlwZSogcFRDOworICAgIGludDMyX3QgaUxhc3QgPSBpU3RhcnQgLSBpQ291bnQ7CisgICAgaWYgKGJDbGFzcykgeworICAgICAgZm9yIChpbnQzMl90IGkgPSBpU3RhcnQgLSAxOyBpID49IGlMYXN0OyBpLS0pIHsKKyAgICAgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cihpKTsKKyAgICAgICAgcFRDLT5tX2lCaWRpQ2xhc3MgPSAoaW50MTZfdClpVmFsdWU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaW50MzJfdCBpID0gaVN0YXJ0IC0gMTsgaSA+PSBpTGFzdDsgaS0tKSB7CisgICAgICAgIHBUQyA9IGNoYXJzLkdldERhdGFQdHIoaSk7CisgICAgICAgIHBUQy0+bV9pQmlkaUxldmVsID0gKGludDE2X3QpaVZhbHVlOworICAgICAgfQorICAgIH0KKyAgfQorICB2b2lkIEZYX0JpZGlDbGFzc2lmeShDRlhfQXJyYXlUZW1wbGF0ZTxiYXNlVHlwZT4mIGNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiV1MpIHsKKyAgICBGWFNZU19hc3NlcnQoaUNvdW50ID4gLTEgJiYgaUNvdW50IDw9IGNoYXJzLkdldFNpemUoKSk7CisgICAgYmFzZVR5cGUqIHBUQzsKKyAgICBpZiAoYldTKSB7CisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgICAgICBwVEMgPSBjaGFycy5HZXREYXRhUHRyKGkpOworICAgICAgICBwVEMtPm1faUJpZGlDbGFzcyA9CisgICAgICAgICAgICAoaW50MTZfdCkocFRDLT5tX2R3Q2hhclByb3BzICYgRlhfQklESUNMQVNTQklUU01BU0spID4+CisgICAgICAgICAgICBGWF9CSURJQ0xBU1NCSVRTOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgICAgICBwVEMgPSBjaGFycy5HZXREYXRhUHRyKGkpOworICAgICAgICBwVEMtPm1faUJpZGlDbGFzcyA9IChpbnQxNl90KQorICAgICAgICAgICAgZ2NfRlhfQmlkaU5UeXBlc1socFRDLT5tX2R3Q2hhclByb3BzICYgRlhfQklESUNMQVNTQklUU01BU0spID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JJRElDTEFTU0JJVFNdOworICAgICAgfQorICAgIH0KKyAgfQorICB2b2lkIEZYX0JpZGlSZXNvbHZlRXhwbGljaXQoQ0ZYX0FycmF5VGVtcGxhdGU8YmFzZVR5cGU+JiBjaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQmFzZUxldmVsKSB7CisgICAgRlhTWVNfYXNzZXJ0KGlDb3VudCA+IC0xICYmIGlDb3VudCA8PSBjaGFycy5HZXRTaXplKCkpOworICAgIEZYU1lTX2Fzc2VydChpQmFzZUxldmVsID49IDAgJiYgaUJhc2VMZXZlbCA8PSBGWF9CSURJTUFYTEVWRUwpOworICAgIGlmIChpQ291bnQgPCAxKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGJhc2VUeXBlKiBwVEM7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKKyAgICAgIHBUQyA9IGNoYXJzLkdldERhdGFQdHIoaSk7CisgICAgICBwVEMtPm1faUJpZGlMZXZlbCA9IChpbnQxNl90KWlCYXNlTGV2ZWw7CisgICAgfQorICB9CisgIHZvaWQgRlhfQmlkaVJlc29sdmVXZWFrKENGWF9BcnJheVRlbXBsYXRlPGJhc2VUeXBlPiYgY2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCYXNlTGV2ZWwpIHsKKyAgICBGWFNZU19hc3NlcnQoaUNvdW50ID4gLTEgJiYgaUNvdW50IDw9IGNoYXJzLkdldFNpemUoKSk7CisgICAgaUNvdW50LS07CisgICAgaWYgKGlDb3VudCA8IDEpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgYmFzZVR5cGUgKnBUQywgKnBUQ05leHQ7CisgICAgaW50MzJfdCBpTGV2ZWxDdXIgPSBpQmFzZUxldmVsOworICAgIGludDMyX3QgaVN0YXRlID0gRlhfSXNPZGQoaUJhc2VMZXZlbCkgPyBGWF9CV1N4ciA6IEZYX0JXU3hsOworICAgIGludDMyX3QgaSA9IDAsIGlOdW0gPSAwLCBpQ2xzQ3VyLCBpQ2xzUnVuLCBpQ2xzTmV3LCBpQWN0aW9uOworICAgIGZvciAoOyBpIDw9IGlDb3VudDsgaSsrKSB7CisgICAgICBwVEMgPSBjaGFycy5HZXREYXRhUHRyKGkpOworICAgICAgaUNsc0N1ciA9IHBUQy0+bV9pQmlkaUNsYXNzOworICAgICAgaWYgKGlDbHNDdXIgPT0gRlhfQklESUNMQVNTX0JOKSB7CisgICAgICAgIHBUQy0+bV9pQmlkaUxldmVsID0gKGludDE2X3QpaUxldmVsQ3VyOworICAgICAgICBpZiAoaSA9PSBpQ291bnQgJiYgaUxldmVsQ3VyICE9IGlCYXNlTGV2ZWwpIHsKKyAgICAgICAgICBpQ2xzQ3VyID0gRlhfQmlkaURpcmVjdGlvbihpTGV2ZWxDdXIpOworICAgICAgICAgIHBUQy0+bV9pQmlkaUNsYXNzID0gKGludDE2X3QpaUNsc0N1cjsKKyAgICAgICAgfSBlbHNlIGlmIChpIDwgaUNvdW50KSB7CisgICAgICAgICAgcFRDTmV4dCA9IGNoYXJzLkdldERhdGFQdHIoaSArIDEpOworICAgICAgICAgIGludDMyX3QgaUxldmVsTmV4dCwgaUxldmVsTmV3OworICAgICAgICAgIGlDbHNOZXcgPSBwVENOZXh0LT5tX2lCaWRpQ2xhc3M7CisgICAgICAgICAgaUxldmVsTmV4dCA9IHBUQ05leHQtPm1faUJpZGlMZXZlbDsKKyAgICAgICAgICBpZiAoaUNsc05ldyAhPSBGWF9CSURJQ0xBU1NfQk4gJiYgaUxldmVsQ3VyICE9IGlMZXZlbE5leHQpIHsKKyAgICAgICAgICAgIGlMZXZlbE5ldyA9IGlMZXZlbE5leHQ7CisgICAgICAgICAgICBpZiAoaUxldmVsQ3VyID4gaUxldmVsTmV3KSB7CisgICAgICAgICAgICAgIGlMZXZlbE5ldyA9IGlMZXZlbEN1cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBUQy0+bV9pQmlkaUxldmVsID0gKGludDE2X3QpaUxldmVsTmV3OworICAgICAgICAgICAgaUNsc0N1ciA9IEZYX0JpZGlEaXJlY3Rpb24oaUxldmVsTmV3KTsKKyAgICAgICAgICAgIHBUQy0+bV9pQmlkaUNsYXNzID0gKGludDE2X3QpaUNsc0N1cjsKKyAgICAgICAgICAgIGlMZXZlbEN1ciA9IGlMZXZlbE5leHQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpTnVtID4gMCkgeworICAgICAgICAgICAgICBpTnVtKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGlOdW0gPiAwKSB7CisgICAgICAgICAgICBpTnVtKys7CisgICAgICAgICAgfQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBGWFNZU19hc3NlcnQoaUNsc0N1ciA8PSBGWF9CSURJQ0xBU1NfQk4pOworICAgICAgaUFjdGlvbiA9IGdjX0ZYX0JpZGlXZWFrQWN0aW9uc1tpU3RhdGVdW2lDbHNDdXJdOworICAgICAgaUNsc1J1biA9IEZYX0JpZGlHZXREZWZlcnJlZFR5cGUoaUFjdGlvbik7CisgICAgICBpZiAoaUNsc1J1biAhPSBGWF9CSURJV0VBS0FDVElPTl9YWCAmJiBpTnVtID4gMCkgeworICAgICAgICBGWF9CaWRpU2V0RGVmZXJyZWRSdW4oY2hhcnMsIFRSVUUsIGksIGlOdW0sIGlDbHNSdW4pOworICAgICAgICBpTnVtID0gMDsKKyAgICAgIH0KKyAgICAgIGlDbHNOZXcgPSBGWF9CaWRpR2V0UmVzb2x2ZWRUeXBlKGlBY3Rpb24pOworICAgICAgaWYgKGlDbHNOZXcgIT0gRlhfQklESVdFQUtBQ1RJT05fWFgpIHsKKyAgICAgICAgcFRDLT5tX2lCaWRpQ2xhc3MgPSAoaW50MTZfdClpQ2xzTmV3OworICAgICAgfQorICAgICAgaWYgKEZYX0JJRElXRUFLQUNUSU9OX0lYICYgaUFjdGlvbikgeworICAgICAgICBpTnVtKys7CisgICAgICB9CisgICAgICBpU3RhdGUgPSBnY19GWF9CaWRpV2Vha1N0YXRlc1tpU3RhdGVdW2lDbHNDdXJdOworICAgIH0KKyAgICBpZiAoaU51bSA+IDApIHsKKyAgICAgIGlDbHNDdXIgPSBGWF9CaWRpRGlyZWN0aW9uKGlCYXNlTGV2ZWwpOworICAgICAgaUNsc1J1biA9IEZYX0JpZGlHZXREZWZlcnJlZFR5cGUoZ2NfRlhfQmlkaVdlYWtBY3Rpb25zW2lTdGF0ZV1baUNsc0N1cl0pOworICAgICAgaWYgKGlDbHNSdW4gIT0gRlhfQklESVdFQUtBQ1RJT05fWFgpIHsKKyAgICAgICAgRlhfQmlkaVNldERlZmVycmVkUnVuKGNoYXJzLCBUUlVFLCBpLCBpTnVtLCBpQ2xzUnVuKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgdm9pZCBGWF9CaWRpUmVzb2x2ZU5ldXRyYWxzKENGWF9BcnJheVRlbXBsYXRlPGJhc2VUeXBlPiYgY2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJhc2VMZXZlbCkgeworICAgIEZYU1lTX2Fzc2VydChpQ291bnQgPiAtMSAmJiBpQ291bnQgPD0gY2hhcnMuR2V0U2l6ZSgpKTsKKyAgICBGWFNZU19hc3NlcnQoaUJhc2VMZXZlbCA+PSAwICYmIGlCYXNlTGV2ZWwgPD0gRlhfQklESU1BWExFVkVMKTsKKyAgICBpQ291bnQtLTsKKyAgICBpZiAoaUNvdW50IDwgMSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBiYXNlVHlwZSogcFRDOworICAgIGludDMyX3QgaUxldmVsID0gaUJhc2VMZXZlbDsKKyAgICBpbnQzMl90IGlTdGF0ZSA9IEZYX0lzT2RkKGlCYXNlTGV2ZWwpID8gRlhfQk5TciA6IEZYX0JOU2w7CisgICAgaW50MzJfdCBpID0gMCwgaU51bSA9IDAsIGlDbHNDdXIsIGlDbHNSdW4sIGlDbHNOZXcsIGlBY3Rpb247CisgICAgZm9yICg7IGkgPD0gaUNvdW50OyBpKyspIHsKKyAgICAgIHBUQyA9IGNoYXJzLkdldERhdGFQdHIoaSk7CisgICAgICBpQ2xzQ3VyID0gcFRDLT5tX2lCaWRpQ2xhc3M7CisgICAgICBpZiAoaUNsc0N1ciA9PSBGWF9CSURJQ0xBU1NfQk4pIHsKKyAgICAgICAgaWYgKGlOdW0pIHsKKyAgICAgICAgICBpTnVtKys7CisgICAgICAgIH0KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBGWFNZU19hc3NlcnQoaUNsc0N1ciA8IEZYX0JJRElDTEFTU19BTCk7CisgICAgICBpQWN0aW9uID0gZ2NfRlhfQmlkaU5ldXRyYWxBY3Rpb25zW2lTdGF0ZV1baUNsc0N1cl07CisgICAgICBpQ2xzUnVuID0gRlhfQmlkaUdldERlZmVycmVkTmV1dHJhbHMoaUFjdGlvbiwgaUxldmVsKTsKKyAgICAgIGlmIChpQ2xzUnVuICE9IEZYX0JJRElDTEFTU19OICYmIGlOdW0gPiAwKSB7CisgICAgICAgIEZYX0JpZGlTZXREZWZlcnJlZFJ1bihjaGFycywgVFJVRSwgaSwgaU51bSwgaUNsc1J1bik7CisgICAgICAgIGlOdW0gPSAwOworICAgICAgfQorICAgICAgaUNsc05ldyA9IEZYX0JpZGlHZXRSZXNvbHZlZE5ldXRyYWxzKGlBY3Rpb24pOworICAgICAgaWYgKGlDbHNOZXcgIT0gRlhfQklESUNMQVNTX04pIHsKKyAgICAgICAgcFRDLT5tX2lCaWRpQ2xhc3MgPSAoaW50MTZfdClpQ2xzTmV3OworICAgICAgfQorICAgICAgaWYgKEZYX0JJRElORVVUUkFMQUNUSU9OX0luICYgaUFjdGlvbikgeworICAgICAgICBpTnVtKys7CisgICAgICB9CisgICAgICBpU3RhdGUgPSBnY19GWF9CaWRpTmV1dHJhbFN0YXRlc1tpU3RhdGVdW2lDbHNDdXJdOworICAgICAgaUxldmVsID0gcFRDLT5tX2lCaWRpTGV2ZWw7CisgICAgfQorICAgIGlmIChpTnVtID4gMCkgeworICAgICAgaUNsc0N1ciA9IEZYX0JpZGlEaXJlY3Rpb24oaUxldmVsKTsKKyAgICAgIGlDbHNSdW4gPSBGWF9CaWRpR2V0RGVmZXJyZWROZXV0cmFscygKKyAgICAgICAgICBnY19GWF9CaWRpTmV1dHJhbEFjdGlvbnNbaVN0YXRlXVtpQ2xzQ3VyXSwgaUxldmVsKTsKKyAgICAgIGlmIChpQ2xzUnVuICE9IEZYX0JJRElDTEFTU19OKSB7CisgICAgICAgIEZYX0JpZGlTZXREZWZlcnJlZFJ1bihjaGFycywgVFJVRSwgaSwgaU51bSwgaUNsc1J1bik7CisgICAgICB9CisgICAgfQorICB9CisgIHZvaWQgRlhfQmlkaVJlc29sdmVJbXBsaWNpdChDRlhfQXJyYXlUZW1wbGF0ZTxiYXNlVHlwZT4mIGNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQpIHsKKyAgICBGWFNZU19hc3NlcnQoaUNvdW50ID4gLTEgJiYgaUNvdW50IDw9IGNoYXJzLkdldFNpemUoKSk7CisgICAgYmFzZVR5cGUqIHBUQzsKKyAgICBpbnQzMl90IGlDbHMsIGlMZXZlbDsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cihpKTsKKyAgICAgIGlDbHMgPSBwVEMtPm1faUJpZGlDbGFzczsKKyAgICAgIGlmIChpQ2xzID09IEZYX0JJRElDTEFTU19CTikgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIEZYU1lTX2Fzc2VydChpQ2xzID4gRlhfQklESUNMQVNTX09OICYmIGlDbHMgPCBGWF9CSURJQ0xBU1NfQUwpOworICAgICAgaUxldmVsID0gcFRDLT5tX2lCaWRpTGV2ZWw7CisgICAgICBpTGV2ZWwgKz0gZ2NfRlhfQmlkaUFkZExldmVsW0ZYX0lzT2RkKGlMZXZlbCldW2lDbHMgLSAxXTsKKyAgICAgIHBUQy0+bV9pQmlkaUxldmVsID0gKGludDE2X3QpaUxldmVsOworICAgIH0KKyAgfQorICB2b2lkIEZYX0JpZGlSZXNvbHZlV2hpdGVzcGFjZShDRlhfQXJyYXlUZW1wbGF0ZTxiYXNlVHlwZT4mIGNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQmFzZUxldmVsKSB7CisgICAgRlhTWVNfYXNzZXJ0KGlDb3VudCA+IC0xICYmIGlDb3VudCA8PSBjaGFycy5HZXRTaXplKCkpOworICAgIEZYU1lTX2Fzc2VydChpQmFzZUxldmVsID49IDAgJiYgaUJhc2VMZXZlbCA8PSBGWF9CSURJTUFYTEVWRUwpOworICAgIGlmIChpQ291bnQgPCAxKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlDb3VudC0tOworICAgIGludDMyX3QgaUxldmVsID0gaUJhc2VMZXZlbDsKKyAgICBpbnQzMl90IGkgPSAwLCBpTnVtID0gMDsKKyAgICBiYXNlVHlwZSogcFRDOworICAgIGZvciAoOyBpIDw9IGlDb3VudDsgaSsrKSB7CisgICAgICBwVEMgPSBjaGFycy5HZXREYXRhUHRyKGkpOworICAgICAgc3dpdGNoIChwVEMtPm1faUJpZGlDbGFzcykgeworICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19XUzoKKyAgICAgICAgICBpTnVtKys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX1JMRToKKyAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfTFJFOgorICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19MUk86CisgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX1JMTzoKKyAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfUERGOgorICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19CTjoKKyAgICAgICAgICBwVEMtPm1faUJpZGlMZXZlbCA9IChpbnQxNl90KWlMZXZlbDsKKyAgICAgICAgICBpTnVtKys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX1M6CisgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX0I6CisgICAgICAgICAgaWYgKGlOdW0gPiAwKSB7CisgICAgICAgICAgICBGWF9CaWRpU2V0RGVmZXJyZWRSdW4oY2hhcnMsIEZBTFNFLCBpLCBpTnVtLCBpQmFzZUxldmVsKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcFRDLT5tX2lCaWRpTGV2ZWwgPSAoaW50MTZfdClpQmFzZUxldmVsOworICAgICAgICAgIGlOdW0gPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGlOdW0gPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaUxldmVsID0gcFRDLT5tX2lCaWRpTGV2ZWw7CisgICAgfQorICAgIGlmIChpTnVtID4gMCkgeworICAgICAgRlhfQmlkaVNldERlZmVycmVkUnVuKGNoYXJzLCBGQUxTRSwgaSwgaU51bSwgaUJhc2VMZXZlbCk7CisgICAgfQorICB9CisgIGludDMyX3QgRlhfQmlkaVJlb3JkZXJMZXZlbChDRlhfQXJyYXlUZW1wbGF0ZTxiYXNlVHlwZT4mIGNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCYXNlTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJldmVyc2UpIHsKKyAgICBGWFNZU19hc3NlcnQoaUNvdW50ID4gLTEgJiYgaUNvdW50IDw9IGNoYXJzLkdldFNpemUoKSk7CisgICAgRlhTWVNfYXNzZXJ0KGlCYXNlTGV2ZWwgPj0gMCAmJiBpQmFzZUxldmVsIDw9IEZYX0JJRElNQVhMRVZFTCk7CisgICAgRlhTWVNfYXNzZXJ0KGlTdGFydCA+PSAwICYmIGlTdGFydCA8IGlDb3VudCk7CisgICAgaWYgKGlDb3VudCA8IDEpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBiYXNlVHlwZSogcFRDOworICAgIGJSZXZlcnNlID0gYlJldmVyc2UgfHwgRlhfSXNPZGQoaUJhc2VMZXZlbCk7CisgICAgaW50MzJfdCBpID0gaVN0YXJ0LCBpTGV2ZWw7CisgICAgZm9yICg7IGkgPCBpQ291bnQ7IGkrKykgeworICAgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cihpKTsKKyAgICAgIGlmICgoaUxldmVsID0gcFRDLT5tX2lCaWRpTGV2ZWwpID09IGlCYXNlTGV2ZWwpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoaUxldmVsIDwgaUJhc2VMZXZlbCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGkgKz0gRlhfQmlkaVJlb3JkZXJMZXZlbChjaGFycywgaUNvdW50LCBpQmFzZUxldmVsICsgMSwgaSwgYlJldmVyc2UpIC0gMTsKKyAgICB9CisgICAgaW50MzJfdCBpTnVtID0gaSAtIGlTdGFydDsKKyAgICBpZiAoYlJldmVyc2UgJiYgaU51bSA+IDEpIHsKKyAgICAgIEZYX0JpZGlSZXZlcnNlU3RyaW5nKGNoYXJzLCBpU3RhcnQsIGlOdW0pOworICAgIH0KKyAgICByZXR1cm4gaU51bTsKKyAgfQorICB2b2lkIEZYX0JpZGlSZW9yZGVyKENGWF9BcnJheVRlbXBsYXRlPGJhc2VUeXBlPiYgY2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQmFzZUxldmVsKSB7CisgICAgRlhTWVNfYXNzZXJ0KGlDb3VudCA+IC0xICYmIGlDb3VudCA8PSBjaGFycy5HZXRTaXplKCkpOworICAgIEZYU1lTX2Fzc2VydChpQmFzZUxldmVsID49IDAgJiYgaUJhc2VMZXZlbCA8PSBGWF9CSURJTUFYTEVWRUwpOworICAgIGludDMyX3QgaSA9IDA7CisgICAgd2hpbGUgKGkgPCBpQ291bnQpIHsKKyAgICAgIGkgKz0gRlhfQmlkaVJlb3JkZXJMZXZlbChjaGFycywgaUNvdW50LCBpQmFzZUxldmVsLCBpLCBGQUxTRSk7CisgICAgfQorICB9CisgIHZvaWQgRlhfQmlkaVBvc2l0aW9uKENGWF9BcnJheVRlbXBsYXRlPGJhc2VUeXBlPiYgY2hhcnMsIGludDMyX3QgaUNvdW50KSB7CisgICAgRlhTWVNfYXNzZXJ0KGlDb3VudCA+IC0xICYmIGlDb3VudCA8PSBjaGFycy5HZXRTaXplKCkpOworICAgIGJhc2VUeXBlKiBwVEM7CisgICAgaW50MzJfdCBpID0gMDsKKyAgICB3aGlsZSAoaSA8IGlDb3VudCkgeworICAgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cihpKTsKKyAgICAgIHBUQyA9IGNoYXJzLkdldERhdGFQdHIocFRDLT5tX2lCaWRpUG9zKTsKKyAgICAgIHBUQy0+bV9pQmlkaU9yZGVyID0gaSsrOworICAgIH0KKyAgfQorCisgIHZvaWQgRlhfQmlkaUxpbmUoQ0ZYX0FycmF5VGVtcGxhdGU8YmFzZVR5cGU+JiBjaGFycywKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCwKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCYXNlTGV2ZWwpIHsKKyAgICBGWFNZU19hc3NlcnQoaUNvdW50ID4gLTEgJiYgaUNvdW50IDw9IGNoYXJzLkdldFNpemUoKSk7CisgICAgaWYgKGlDb3VudCA8IDIpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgRlhfQmlkaUNsYXNzaWZ5KGNoYXJzLCBpQ291bnQsIEZBTFNFKTsKKyAgICBGWF9CaWRpUmVzb2x2ZUV4cGxpY2l0KGNoYXJzLCBpQ291bnQsIGlCYXNlTGV2ZWwpOworICAgIEZYX0JpZGlSZXNvbHZlV2VhayhjaGFycywgaUNvdW50LCBpQmFzZUxldmVsKTsKKyAgICBGWF9CaWRpUmVzb2x2ZU5ldXRyYWxzKGNoYXJzLCBpQ291bnQsIGlCYXNlTGV2ZWwpOworICAgIEZYX0JpZGlSZXNvbHZlSW1wbGljaXQoY2hhcnMsIGlDb3VudCk7CisgICAgRlhfQmlkaUNsYXNzaWZ5KGNoYXJzLCBpQ291bnQsIFRSVUUpOworICAgIEZYX0JpZGlSZXNvbHZlV2hpdGVzcGFjZShjaGFycywgaUNvdW50LCBpQmFzZUxldmVsKTsKKyAgICBGWF9CaWRpUmVvcmRlcihjaGFycywgaUNvdW50LCBpQmFzZUxldmVsKTsKKyAgICBGWF9CaWRpUG9zaXRpb24oY2hhcnMsIGlDb3VudCk7CisgIH0KK307Cit2b2lkIEZYX0JpZGlMaW5lKENGWF9UeHRDaGFyQXJyYXkmIGNoYXJzLCBpbnQzMl90IGlDb3VudCwgaW50MzJfdCBpQmFzZUxldmVsKSB7CisgIENGWF9CaWRpTGluZVRlbXBsYXRlPENGWF9UeHRDaGFyPiBibHQ7CisgIGJsdC5GWF9CaWRpTGluZShjaGFycywgaUNvdW50LCBpQmFzZUxldmVsKTsKK30KK3ZvaWQgRlhfQmlkaUxpbmUoQ0ZYX1JURkNoYXJBcnJheSYgY2hhcnMsIGludDMyX3QgaUNvdW50LCBpbnQzMl90IGlCYXNlTGV2ZWwpIHsKKyAgQ0ZYX0JpZGlMaW5lVGVtcGxhdGU8Q0ZYX1JURkNoYXI+IGJsdDsKKyAgYmx0LkZYX0JpZGlMaW5lKGNoYXJzLCBpQ291bnQsIGlCYXNlTGV2ZWwpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmggYi9jb3JlL3NyYy9meGNydC9meF9hcmFiaWMuaAppbmRleCBkZGEyNmU2Li45YTE3NTg2IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF9hcmFiaWMuaAorKysgYi9jb3JlL3NyYy9meGNydC9meF9hcmFiaWMuaApAQCAtMSwzOCArMSwyMTEgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBDT1JFX1NSQ19GWENSVF9GWF9BUkFCSUNfSF8KICNkZWZpbmUgQ09SRV9TUkNfRlhDUlRfRlhfQVJBQklDX0hfCiAKLWNsYXNzIENGWF9CaWRpQ2hhciBGWF9GSU5BTCA6IHB1YmxpYyBJRlhfQmlkaUNoYXIKLXsKLXB1YmxpYzoKLSAgICBDRlhfQmlkaUNoYXIoKTsKLSAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKSBGWF9PVkVSUklERQotICAgIHsKLSAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZAkJU2V0UG9saWN5KEZYX0JPT0wgYlNlcGFyYXRlTmV1dHJhbCA9IFRSVUUpIEZYX09WRVJSSURFCi0gICAgewotICAgICAgICBtX2JTZXBhcmF0ZU5ldXRyYWwgPSBiU2VwYXJhdGVOZXV0cmFsOwotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUFwcGVuZENoYXIoRlhfV0NIQVIgd2NoKSBGWF9PVkVSUklERTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUVuZENoYXIoKSBGWF9PVkVSUklERTsKLSAgICB2aXJ0dWFsIEZYX0lOVDMyCUdldEJpZGlJbmZvKEZYX0lOVDMyICZpU3RhcnQsIEZYX0lOVDMyICZpQ291bnQpIEZYX09WRVJSSURFOwotICAgIHZpcnR1YWwgdm9pZAkJUmVzZXQoKSBGWF9PVkVSUklERTsKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYXJiLmgiCiAKLXByaXZhdGU6Ci0gICAgfkNGWF9CaWRpQ2hhcigpIHsgfQotICAgIEZYX0JPT0wJCW1fYlNlcGFyYXRlTmV1dHJhbDsKLSAgICBGWF9JTlQzMgltX2lDdXJTdGFydDsKLSAgICBGWF9JTlQzMgltX2lDdXJDb3VudDsKLSAgICBGWF9JTlQzMgltX2lDdXJCaWRpOwotICAgIEZYX0lOVDMyCW1faUxhc3RCaWRpOwotICAgIEZYX0lOVDMyCW1faUxhc3RTdGFydDsKLSAgICBGWF9JTlQzMgltX2lMYXN0Q291bnQ7CitjbGFzcyBDRlhfQXJhYmljQ2hhciA6IHB1YmxpYyBJRlhfQXJhYmljQ2hhciB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0KKyAgdmlydHVhbCBGWF9CT09MIElzQXJhYmljQ2hhcihGWF9XQ0hBUiB3Y2gpIGNvbnN0OworICB2aXJ0dWFsIEZYX0JPT0wgSXNBcmFiaWNGb3JtQ2hhcihGWF9XQ0hBUiB3Y2gpIGNvbnN0OworCisgIHZpcnR1YWwgRlhfV0NIQVIgR2V0Rm9ybUNoYXIoRlhfV0NIQVIgd2NoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIHByZXYgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIG5leHQgPSAwKSBjb25zdDsKKyAgdmlydHVhbCBGWF9XQ0hBUiBHZXRGb3JtQ2hhcihjb25zdCBDRlhfQ2hhciogY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9DaGFyKiBwcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9DaGFyKiBuZXh0KSBjb25zdDsKKworIHByb3RlY3RlZDoKKyAgY29uc3QgRlhfQVJCRk9STVRBQkxFKiBQYXJzZUNoYXIoY29uc3QgQ0ZYX0NoYXIqIHBUQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVImIHdDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DSEFSVFlQRSYgZVR5cGUpIGNvbnN0OwogfTsKK3ZvaWQgRlhfQmlkaVJldmVyc2VTdHJpbmcoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50KTsKK3ZvaWQgRlhfQmlkaVNldERlZmVycmVkUnVuKENGWF9JbnQzMkFycmF5JiB2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWUpOworI2RlZmluZSBGWF9CQ09OIEZYX0JJRElDTEFTU19PTgorI2RlZmluZSBGWF9CQ0wgRlhfQklESUNMQVNTX0wKKyNkZWZpbmUgRlhfQkNSIEZYX0JJRElDTEFTU19SCisjZGVmaW5lIEZYX0JDQU4gRlhfQklESUNMQVNTX0FOCisjZGVmaW5lIEZYX0JDRU4gRlhfQklESUNMQVNTX0VOCisjZGVmaW5lIEZYX0JDQUwgRlhfQklESUNMQVNTX0FMCisjZGVmaW5lIEZYX0JDTlNNIEZYX0JJRElDTEFTU19OU00KKyNkZWZpbmUgRlhfQkNDUyBGWF9CSURJQ0xBU1NfQ1MKKyNkZWZpbmUgRlhfQkNFUyBGWF9CSURJQ0xBU1NfRVMKKyNkZWZpbmUgRlhfQkNFVCBGWF9CSURJQ0xBU1NfRVQKKyNkZWZpbmUgRlhfQkNCTiBGWF9CSURJQ0xBU1NfQk4KKyNkZWZpbmUgRlhfQkNTIEZYX0JJRElDTEFTU19TCisjZGVmaW5lIEZYX0JDV1MgRlhfQklESUNMQVNTX1dTCisjZGVmaW5lIEZYX0JDQiBGWF9CSURJQ0xBU1NfQgorI2RlZmluZSBGWF9CQ1JMTyBGWF9CSURJQ0xBU1NfUkxPCisjZGVmaW5lIEZYX0JDUkxFIEZYX0JJRElDTEFTU19STEUKKyNkZWZpbmUgRlhfQkNMUk8gRlhfQklESUNMQVNTX0xSTworI2RlZmluZSBGWF9CQ0xSRSBGWF9CSURJQ0xBU1NfTFJFCisjZGVmaW5lIEZYX0JDUERGIEZYX0JJRElDTEFTU19QREYKKyNkZWZpbmUgRlhfQkNOIEZYX0JJRElDTEFTU19OCit2b2lkIEZYX0JpZGlDbGFzc2lmeShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0LAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkmIGNsYXNzZXMsCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJXUyA9IEZBTFNFKTsKKyNkZWZpbmUgRlhfQklESU1BWExFVkVMIDYxCisjZGVmaW5lIEZYX0JpZGlHcmVhdGVyRXZlbihhKSAoRlhfSXNPZGQoYSkgPyAoKGEpICsgMSkgOiAoKGEpICsgMikpCisjZGVmaW5lIEZYX0JpZGlHcmVhdGVyT2RkKGEpIChGWF9Jc09kZChhKSA/ICgoYSkgKyAyKSA6ICgoYSkgKyAxKSkKK2ludDMyX3QgRlhfQmlkaVJlc29sdmVFeHBsaWNpdChpbnQzMl90IGlCYXNlTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5JiBjbGFzc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5JiBsZXZlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTmVzdCA9IDApOworI2RlZmluZSBGWF9CaWRpRGlyZWN0aW9uKGEpIChGWF9Jc09kZChhKSA/IEZYX0JJRElDTEFTU19SIDogRlhfQklESUNMQVNTX0wpCitlbnVtIEZYX0JJRElXRUFLU1RBVEUgeworICBGWF9CSURJV0VBS1NUQVRFX3hhID0gMCwKKyAgRlhfQklESVdFQUtTVEFURV94ciwKKyAgRlhfQklESVdFQUtTVEFURV94bCwKKyAgRlhfQklESVdFQUtTVEFURV9hbywKKyAgRlhfQklESVdFQUtTVEFURV9ybywKKyAgRlhfQklESVdFQUtTVEFURV9sbywKKyAgRlhfQklESVdFQUtTVEFURV9ydCwKKyAgRlhfQklESVdFQUtTVEFURV9sdCwKKyAgRlhfQklESVdFQUtTVEFURV9jbiwKKyAgRlhfQklESVdFQUtTVEFURV9yYSwKKyAgRlhfQklESVdFQUtTVEFURV9yZSwKKyAgRlhfQklESVdFQUtTVEFURV9sYSwKKyAgRlhfQklESVdFQUtTVEFURV9sZSwKKyAgRlhfQklESVdFQUtTVEFURV9hYywKKyAgRlhfQklESVdFQUtTVEFURV9yYywKKyAgRlhfQklESVdFQUtTVEFURV9ycywKKyAgRlhfQklESVdFQUtTVEFURV9sYywKKyAgRlhfQklESVdFQUtTVEFURV9scywKKyAgRlhfQklESVdFQUtTVEFURV9yZXQsCisgIEZYX0JJRElXRUFLU1RBVEVfbGV0LAorfTsKKyNkZWZpbmUgRlhfQldTeGEgRlhfQklESVdFQUtTVEFURV94YQorI2RlZmluZSBGWF9CV1N4ciBGWF9CSURJV0VBS1NUQVRFX3hyCisjZGVmaW5lIEZYX0JXU3hsIEZYX0JJRElXRUFLU1RBVEVfeGwKKyNkZWZpbmUgRlhfQldTYW8gRlhfQklESVdFQUtTVEFURV9hbworI2RlZmluZSBGWF9CV1NybyBGWF9CSURJV0VBS1NUQVRFX3JvCisjZGVmaW5lIEZYX0JXU2xvIEZYX0JJRElXRUFLU1RBVEVfbG8KKyNkZWZpbmUgRlhfQldTcnQgRlhfQklESVdFQUtTVEFURV9ydAorI2RlZmluZSBGWF9CV1NsdCBGWF9CSURJV0VBS1NUQVRFX2x0CisjZGVmaW5lIEZYX0JXU2NuIEZYX0JJRElXRUFLU1RBVEVfY24KKyNkZWZpbmUgRlhfQldTcmEgRlhfQklESVdFQUtTVEFURV9yYQorI2RlZmluZSBGWF9CV1NyZSBGWF9CSURJV0VBS1NUQVRFX3JlCisjZGVmaW5lIEZYX0JXU2xhIEZYX0JJRElXRUFLU1RBVEVfbGEKKyNkZWZpbmUgRlhfQldTbGUgRlhfQklESVdFQUtTVEFURV9sZQorI2RlZmluZSBGWF9CV1NhYyBGWF9CSURJV0VBS1NUQVRFX2FjCisjZGVmaW5lIEZYX0JXU3JjIEZYX0JJRElXRUFLU1RBVEVfcmMKKyNkZWZpbmUgRlhfQldTcnMgRlhfQklESVdFQUtTVEFURV9ycworI2RlZmluZSBGWF9CV1NsYyBGWF9CSURJV0VBS1NUQVRFX2xjCisjZGVmaW5lIEZYX0JXU2xzIEZYX0JJRElXRUFLU1RBVEVfbHMKKyNkZWZpbmUgRlhfQldTcmV0IEZYX0JJRElXRUFLU1RBVEVfcmV0CisjZGVmaW5lIEZYX0JXU2xldCBGWF9CSURJV0VBS1NUQVRFX2xldAorZW51bSBGWF9CSURJV0VBS0FDVElPTiB7CisgIEZYX0JJRElXRUFLQUNUSU9OX0lYID0gMHgxMDAsCisgIEZYX0JJRElXRUFLQUNUSU9OX1hYID0gMHgwRiwKKyAgRlhfQklESVdFQUtBQ1RJT05feHh4ID0gKDB4MEYgPDwgNCkgKyAweDBGLAorICBGWF9CSURJV0VBS0FDVElPTl94SXggPSAweDEwMCArIEZYX0JJRElXRUFLQUNUSU9OX3h4eCwKKyAgRlhfQklESVdFQUtBQ1RJT05feHhOID0gKDB4MEYgPDwgNCkgKyBGWF9CSURJQ0xBU1NfT04sCisgIEZYX0JJRElXRUFLQUNUSU9OX3h4RSA9ICgweDBGIDw8IDQpICsgRlhfQklESUNMQVNTX0VOLAorICBGWF9CSURJV0VBS0FDVElPTl94eEEgPSAoMHgwRiA8PCA0KSArIEZYX0JJRElDTEFTU19BTiwKKyAgRlhfQklESVdFQUtBQ1RJT05feHhSID0gKDB4MEYgPDwgNCkgKyBGWF9CSURJQ0xBU1NfUiwKKyAgRlhfQklESVdFQUtBQ1RJT05feHhMID0gKDB4MEYgPDwgNCkgKyBGWF9CSURJQ0xBU1NfTCwKKyAgRlhfQklESVdFQUtBQ1RJT05fTnh4ID0gKEZYX0JJRElDTEFTU19PTiA8PCA0KSArIDB4MEYsCisgIEZYX0JJRElXRUFLQUNUSU9OX0F4eCA9IChGWF9CSURJQ0xBU1NfQU4gPDwgNCkgKyAweDBGLAorICBGWF9CSURJV0VBS0FDVElPTl9FeEUgPSAoRlhfQklESUNMQVNTX0VOIDw8IDQpICsgRlhfQklESUNMQVNTX0VOLAorICBGWF9CSURJV0VBS0FDVElPTl9OSXggPSAoRlhfQklESUNMQVNTX09OIDw8IDQpICsgMHgwRiArIDB4MTAwLAorICBGWF9CSURJV0VBS0FDVElPTl9OeE4gPSAoRlhfQklESUNMQVNTX09OIDw8IDQpICsgRlhfQklESUNMQVNTX09OLAorICBGWF9CSURJV0VBS0FDVElPTl9OeFIgPSAoRlhfQklESUNMQVNTX09OIDw8IDQpICsgRlhfQklESUNMQVNTX1IsCisgIEZYX0JJRElXRUFLQUNUSU9OX054RSA9IChGWF9CSURJQ0xBU1NfT04gPDwgNCkgKyBGWF9CSURJQ0xBU1NfRU4sCisgIEZYX0JJRElXRUFLQUNUSU9OX0F4QSA9IChGWF9CSURJQ0xBU1NfQU4gPDwgNCkgKyBGWF9CSURJQ0xBU1NfQU4sCisgIEZYX0JJRElXRUFLQUNUSU9OX054TCA9IChGWF9CSURJQ0xBU1NfT04gPDwgNCkgKyBGWF9CSURJQ0xBU1NfTCwKKyAgRlhfQklESVdFQUtBQ1RJT05fTHhMID0gKEZYX0JJRElDTEFTU19MIDw8IDQpICsgRlhfQklESUNMQVNTX0wsCisgIEZYX0JJRElXRUFLQUNUSU9OX3hJTCA9ICgweDBGIDw8IDQpICsgRlhfQklESUNMQVNTX0wgKyAweDEwMCwKKyAgRlhfQklESVdFQUtBQ1RJT05fQXhSID0gKEZYX0JJRElDTEFTU19BTiA8PCA0KSArIEZYX0JJRElDTEFTU19SLAorICBGWF9CSURJV0VBS0FDVElPTl9MeHggPSAoRlhfQklESUNMQVNTX0wgPDwgNCkgKyAweDBGLAorfTsKKyNkZWZpbmUgRlhfQldBSVggRlhfQklESVdFQUtBQ1RJT05fSVgKKyNkZWZpbmUgRlhfQldBWFggRlhfQklESVdFQUtBQ1RJT05fWFgKKyNkZWZpbmUgRlhfQldBeHh4IEZYX0JJRElXRUFLQUNUSU9OX3h4eAorI2RlZmluZSBGWF9CV0F4SXggRlhfQklESVdFQUtBQ1RJT05feEl4CisjZGVmaW5lIEZYX0JXQXh4TiBGWF9CSURJV0VBS0FDVElPTl94eE4KKyNkZWZpbmUgRlhfQldBeHhFIEZYX0JJRElXRUFLQUNUSU9OX3h4RQorI2RlZmluZSBGWF9CV0F4eEEgRlhfQklESVdFQUtBQ1RJT05feHhBCisjZGVmaW5lIEZYX0JXQXh4UiBGWF9CSURJV0VBS0FDVElPTl94eFIKKyNkZWZpbmUgRlhfQldBeHhMIEZYX0JJRElXRUFLQUNUSU9OX3h4TAorI2RlZmluZSBGWF9CV0FOeHggRlhfQklESVdFQUtBQ1RJT05fTnh4CisjZGVmaW5lIEZYX0JXQUF4eCBGWF9CSURJV0VBS0FDVElPTl9BeHgKKyNkZWZpbmUgRlhfQldBRXhFIEZYX0JJRElXRUFLQUNUSU9OX0V4RQorI2RlZmluZSBGWF9CV0FOSXggRlhfQklESVdFQUtBQ1RJT05fTkl4CisjZGVmaW5lIEZYX0JXQU54TiBGWF9CSURJV0VBS0FDVElPTl9OeE4KKyNkZWZpbmUgRlhfQldBTnhSIEZYX0JJRElXRUFLQUNUSU9OX054UgorI2RlZmluZSBGWF9CV0FOeEUgRlhfQklESVdFQUtBQ1RJT05fTnhFCisjZGVmaW5lIEZYX0JXQUF4QSBGWF9CSURJV0VBS0FDVElPTl9BeEEKKyNkZWZpbmUgRlhfQldBTnhMIEZYX0JJRElXRUFLQUNUSU9OX054TAorI2RlZmluZSBGWF9CV0FMeEwgRlhfQklESVdFQUtBQ1RJT05fTHhMCisjZGVmaW5lIEZYX0JXQXhJTCBGWF9CSURJV0VBS0FDVElPTl94SUwKKyNkZWZpbmUgRlhfQldBQXhSIEZYX0JJRElXRUFLQUNUSU9OX0F4UgorI2RlZmluZSBGWF9CV0FMeHggRlhfQklESVdFQUtBQ1RJT05fTHh4CisjZGVmaW5lIEZYX0JpZGlHZXREZWZlcnJlZFR5cGUoYSkgKCgoYSkgPj4gNCkgJiAweDBGKQorI2RlZmluZSBGWF9CaWRpR2V0UmVzb2x2ZWRUeXBlKGEpICgoYSkmMHgwRikKK3ZvaWQgRlhfQmlkaVJlc29sdmVXZWFrKGludDMyX3QgaUJhc2VMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5JiBjbGFzc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkmIGxldmVscyk7CitlbnVtIEZYX0JJRElORVVUUkFMU1RBVEUgeworICBGWF9CSURJTkVVVFJBTFNUQVRFX3IgPSAwLAorICBGWF9CSURJTkVVVFJBTFNUQVRFX2wsCisgIEZYX0JJRElORVVUUkFMU1RBVEVfcm4sCisgIEZYX0JJRElORVVUUkFMU1RBVEVfbG4sCisgIEZYX0JJRElORVVUUkFMU1RBVEVfYSwKKyAgRlhfQklESU5FVVRSQUxTVEFURV9uYSwKK307CisjZGVmaW5lIEZYX0JOU3IgRlhfQklESU5FVVRSQUxTVEFURV9yCisjZGVmaW5lIEZYX0JOU2wgRlhfQklESU5FVVRSQUxTVEFURV9sCisjZGVmaW5lIEZYX0JOU3JuIEZYX0JJRElORVVUUkFMU1RBVEVfcm4KKyNkZWZpbmUgRlhfQk5TbG4gRlhfQklESU5FVVRSQUxTVEFURV9sbgorI2RlZmluZSBGWF9CTlNhIEZYX0JJRElORVVUUkFMU1RBVEVfYQorI2RlZmluZSBGWF9CTlNuYSBGWF9CSURJTkVVVFJBTFNUQVRFX25hCitlbnVtIEZYX0JJRElORVVUUkFMQUNUSU9OIHsKKyAgRlhfQklESU5FVVRSQUxBQ1RJT05fbkwgPSBGWF9CSURJQ0xBU1NfTCwKKyAgRlhfQklESU5FVVRSQUxBQ1RJT05fRW4gPSAoRlhfQklESUNMQVNTX0FOIDw8IDQpLAorICBGWF9CSURJTkVVVFJBTEFDVElPTl9SbiA9IChGWF9CSURJQ0xBU1NfUiA8PCA0KSwKKyAgRlhfQklESU5FVVRSQUxBQ1RJT05fTG4gPSAoRlhfQklESUNMQVNTX0wgPDwgNCksCisgIEZYX0JJRElORVVUUkFMQUNUSU9OX0luID0gRlhfQklESVdFQUtBQ1RJT05fSVgsCisgIEZYX0JJRElORVVUUkFMQUNUSU9OX0xuTCA9IChGWF9CSURJQ0xBU1NfTCA8PCA0KSArIEZYX0JJRElDTEFTU19MLAorfTsKKyNkZWZpbmUgRlhfQk5BbkwgRlhfQklESU5FVVRSQUxBQ1RJT05fbkwKKyNkZWZpbmUgRlhfQk5BRW4gRlhfQklESU5FVVRSQUxBQ1RJT05fRW4KKyNkZWZpbmUgRlhfQk5BUm4gRlhfQklESU5FVVRSQUxBQ1RJT05fUm4KKyNkZWZpbmUgRlhfQk5BTG4gRlhfQklESU5FVVRSQUxBQ1RJT05fTG4KKyNkZWZpbmUgRlhfQk5BSW4gRlhfQklESU5FVVRSQUxBQ1RJT05fSW4KKyNkZWZpbmUgRlhfQk5BTG5MIEZYX0JJRElORVVUUkFMQUNUSU9OX0xuTAoraW50MzJfdCBGWF9CaWRpR2V0RGVmZXJyZWROZXV0cmFscyhpbnQzMl90IGlBY3Rpb24sIGludDMyX3QgaUxldmVsKTsKK2ludDMyX3QgRlhfQmlkaUdldFJlc29sdmVkTmV1dHJhbHMoaW50MzJfdCBpQWN0aW9uKTsKK3ZvaWQgRlhfQmlkaVJlc29sdmVOZXV0cmFscyhpbnQzMl90IGlCYXNlTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkmIGNsYXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0ludDMyQXJyYXkmIGxldmVscyk7Cit2b2lkIEZYX0JpZGlSZXNvbHZlSW1wbGljaXQoY29uc3QgQ0ZYX0ludDMyQXJyYXkmIGNsYXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkmIGxldmVscyk7Cit2b2lkIEZYX0JpZGlSZXNvbHZlV2hpdGVzcGFjZShpbnQzMl90IGlCYXNlTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfSW50MzJBcnJheSYgY2xhc3NlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5JiBsZXZlbHMpOworaW50MzJfdCBGWF9CaWRpUmVvcmRlckxldmVsKGludDMyX3QgaUJhc2VMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9JbnQzMkFycmF5JiBsZXZlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmV2ZXJzZSA9IEZBTFNFKTsKK3ZvaWQgRlhfQmlkaVJlb3JkZXIoaW50MzJfdCBpQmFzZUxldmVsLAorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NUZXh0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfSW50MzJBcnJheSYgbGV2ZWxzKTsKIAogI2VuZGlmICAvLyBDT1JFX1NSQ19GWENSVF9GWF9BUkFCSUNfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2FycmF5LmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2FycmF5LmNwcAppbmRleCA0M2E1NDE3Li45YzRhYTBmIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19hcnJheS5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfYXJyYXkuY3BwCkBAIC00LDMzNiArNCwzMzcgQEAKIAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi90aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfbWF0aC5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9tYXRoLmgiCiAKIENGWF9CYXNpY0FycmF5OjpDRlhfQmFzaWNBcnJheShpbnQgdW5pdF9zaXplKQotICAgIDogbV9wRGF0YShOVUxMKQotICAgICwgbV9uU2l6ZSgwKQotICAgICwgbV9uTWF4U2l6ZSgwKQotewotICAgIGlmICh1bml0X3NpemUgPCAwIHx8IHVuaXRfc2l6ZSA+ICgxIDw8IDI4KSkgewotICAgICAgICBtX25Vbml0U2l6ZSA9IDQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9uVW5pdFNpemUgPSB1bml0X3NpemU7Ci0gICAgfQorICAgIDogbV9wRGF0YShOVUxMKSwgbV9uU2l6ZSgwKSwgbV9uTWF4U2l6ZSgwKSB7CisgIGlmICh1bml0X3NpemUgPCAwIHx8IHVuaXRfc2l6ZSA+ICgxIDw8IDI4KSkgeworICAgIG1fblVuaXRTaXplID0gNDsKKyAgfSBlbHNlIHsKKyAgICBtX25Vbml0U2l6ZSA9IHVuaXRfc2l6ZTsKKyAgfQogfQotQ0ZYX0Jhc2ljQXJyYXk6On5DRlhfQmFzaWNBcnJheSgpCi17CitDRlhfQmFzaWNBcnJheTo6fkNGWF9CYXNpY0FycmF5KCkgeworICBGWF9GcmVlKG1fcERhdGEpOworfQorRlhfQk9PTCBDRlhfQmFzaWNBcnJheTo6U2V0U2l6ZShpbnQgbk5ld1NpemUpIHsKKyAgaWYgKG5OZXdTaXplIDw9IDApIHsKICAgICBGWF9GcmVlKG1fcERhdGEpOwotfQotRlhfQk9PTCBDRlhfQmFzaWNBcnJheTo6U2V0U2l6ZShpbnQgbk5ld1NpemUpCi17Ci0gICAgaWYgKG5OZXdTaXplIDw9IDApIHsKLSAgICAgICAgRlhfRnJlZShtX3BEYXRhKTsKLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7Ci0gICAgICAgIG1fblNpemUgPSBtX25NYXhTaXplID0gMDsKLSAgICAgICAgcmV0dXJuIDAgPT0gbk5ld1NpemU7Ci0gICAgfQorICAgIG1fcERhdGEgPSBOVUxMOworICAgIG1fblNpemUgPSBtX25NYXhTaXplID0gMDsKKyAgICByZXR1cm4gMCA9PSBuTmV3U2l6ZTsKKyAgfQogCi0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPGludD4gdG90YWxTaXplID0gbk5ld1NpemU7Ci0gICAgICAgIHRvdGFsU2l6ZSAqPSBtX25Vbml0U2l6ZTsKLSAgICAgICAgaWYgKCF0b3RhbFNpemUuSXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICBtX25TaXplID0gbV9uTWF4U2l6ZSA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wRGF0YSA9IEZYX0FsbG9jKEZYX0JZVEUsIHRvdGFsU2l6ZS5WYWx1ZU9yRGllKCkpOwotICAgICAgICBtX25TaXplID0gbV9uTWF4U2l6ZSA9IG5OZXdTaXplOwotICAgIH0gZWxzZSBpZiAobk5ld1NpemUgPD0gbV9uTWF4U2l6ZSkgewotICAgICAgICBpZiAobk5ld1NpemUgPiBtX25TaXplKSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1zZXQzMihtX3BEYXRhICsgbV9uU2l6ZSAqIG1fblVuaXRTaXplLCAwLCAobk5ld1NpemUgLSBtX25TaXplKSAqIG1fblVuaXRTaXplKTsKLSAgICAgICAgfQotICAgICAgICBtX25TaXplID0gbk5ld1NpemU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IG5OZXdNYXggPSBuTmV3U2l6ZSA8IG1fbk1heFNpemUgPyBtX25NYXhTaXplIDogbk5ld1NpemU7Ci0gICAgICAgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8aW50PiB0b3RhbFNpemUgPSBuTmV3TWF4OwotICAgICAgICB0b3RhbFNpemUgKj0gbV9uVW5pdFNpemU7Ci0gICAgICAgIGlmICghdG90YWxTaXplLklzVmFsaWQoKSB8fCBuTmV3TWF4IDwgbV9uU2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIEZYX0xQQllURSBwTmV3RGF0YSA9IEZYX1JlYWxsb2MoRlhfQllURSwgbV9wRGF0YSwgdG90YWxTaXplLlZhbHVlT3JEaWUoKSk7Ci0gICAgICAgIGlmIChwTmV3RGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgRlhTWVNfbWVtc2V0MzIocE5ld0RhdGEgKyBtX25TaXplICogbV9uVW5pdFNpemUsIDAsIChuTmV3TWF4IC0gbV9uU2l6ZSkgKiBtX25Vbml0U2l6ZSk7Ci0gICAgICAgIG1fcERhdGEgPSBwTmV3RGF0YTsKLSAgICAgICAgbV9uU2l6ZSA9IG5OZXdTaXplOwotICAgICAgICBtX25NYXhTaXplID0gbk5ld01heDsKKyAgaWYgKCFtX3BEYXRhKSB7CisgICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxpbnQ+IHRvdGFsU2l6ZSA9IG5OZXdTaXplOworICAgIHRvdGFsU2l6ZSAqPSBtX25Vbml0U2l6ZTsKKyAgICBpZiAoIXRvdGFsU2l6ZS5Jc1ZhbGlkKCkpIHsKKyAgICAgIG1fblNpemUgPSBtX25NYXhTaXplID0gMDsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgbV9wRGF0YSA9IEZYX0FsbG9jKHVpbnQ4X3QsIHRvdGFsU2l6ZS5WYWx1ZU9yRGllKCkpOworICAgIG1fblNpemUgPSBtX25NYXhTaXplID0gbk5ld1NpemU7CisgIH0gZWxzZSBpZiAobk5ld1NpemUgPD0gbV9uTWF4U2l6ZSkgeworICAgIGlmIChuTmV3U2l6ZSA+IG1fblNpemUpIHsKKyAgICAgIEZYU1lTX21lbXNldChtX3BEYXRhICsgbV9uU2l6ZSAqIG1fblVuaXRTaXplLCAwLAorICAgICAgICAgICAgICAgICAgIChuTmV3U2l6ZSAtIG1fblNpemUpICogbV9uVW5pdFNpemUpOworICAgIH0KKyAgICBtX25TaXplID0gbk5ld1NpemU7CisgIH0gZWxzZSB7CisgICAgaW50IG5OZXdNYXggPSBuTmV3U2l6ZSA8IG1fbk1heFNpemUgPyBtX25NYXhTaXplIDogbk5ld1NpemU7CisgICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxpbnQ+IHRvdGFsU2l6ZSA9IG5OZXdNYXg7CisgICAgdG90YWxTaXplICo9IG1fblVuaXRTaXplOworICAgIGlmICghdG90YWxTaXplLklzVmFsaWQoKSB8fCBuTmV3TWF4IDwgbV9uU2l6ZSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICB1aW50OF90KiBwTmV3RGF0YSA9IEZYX1JlYWxsb2ModWludDhfdCwgbV9wRGF0YSwgdG90YWxTaXplLlZhbHVlT3JEaWUoKSk7CisgICAgaWYgKCFwTmV3RGF0YSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBGWFNZU19tZW1zZXQocE5ld0RhdGEgKyBtX25TaXplICogbV9uVW5pdFNpemUsIDAsCisgICAgICAgICAgICAgICAgIChuTmV3TWF4IC0gbV9uU2l6ZSkgKiBtX25Vbml0U2l6ZSk7CisgICAgbV9wRGF0YSA9IHBOZXdEYXRhOworICAgIG1fblNpemUgPSBuTmV3U2l6ZTsKKyAgICBtX25NYXhTaXplID0gbk5ld01heDsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ0ZYX0Jhc2ljQXJyYXk6OkFwcGVuZChjb25zdCBDRlhfQmFzaWNBcnJheSYgc3JjKQoteworRlhfQk9PTCBDRlhfQmFzaWNBcnJheTo6QXBwZW5kKGNvbnN0IENGWF9CYXNpY0FycmF5JiBzcmMpIHsKKyAgaW50IG5PbGRTaXplID0gbV9uU2l6ZTsKKyAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxpbnQ+IG5ld1NpemUgPSBtX25TaXplOworICBuZXdTaXplICs9IHNyYy5tX25TaXplOworICBpZiAobV9uVW5pdFNpemUgIT0gc3JjLm1fblVuaXRTaXplIHx8ICFuZXdTaXplLklzVmFsaWQoKSB8fAorICAgICAgIVNldFNpemUobmV3U2l6ZS5WYWx1ZU9yRGllKCkpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgRlhTWVNfbWVtY3B5KG1fcERhdGEgKyBuT2xkU2l6ZSAqIG1fblVuaXRTaXplLCBzcmMubV9wRGF0YSwKKyAgICAgICAgICAgICAgIHNyYy5tX25TaXplICogbV9uVW5pdFNpemUpOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0ZYX0Jhc2ljQXJyYXk6OkNvcHkoY29uc3QgQ0ZYX0Jhc2ljQXJyYXkmIHNyYykgeworICBpZiAoIVNldFNpemUoc3JjLm1fblNpemUpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYU1lTX21lbWNweShtX3BEYXRhLCBzcmMubV9wRGF0YSwgc3JjLm1fblNpemUgKiBtX25Vbml0U2l6ZSk7CisgIHJldHVybiBUUlVFOworfQordWludDhfdCogQ0ZYX0Jhc2ljQXJyYXk6Okluc2VydFNwYWNlQXQoaW50IG5JbmRleCwgaW50IG5Db3VudCkgeworICBpZiAobkluZGV4IDwgMCB8fCBuQ291bnQgPD0gMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChuSW5kZXggPj0gbV9uU2l6ZSkgeworICAgIGlmICghU2V0U2l6ZShuSW5kZXggKyBuQ291bnQpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0gZWxzZSB7CiAgICAgaW50IG5PbGRTaXplID0gbV9uU2l6ZTsKLSAgICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPGludD4gbmV3U2l6ZSA9IG1fblNpemU7Ci0gICAgbmV3U2l6ZSArPSBzcmMubV9uU2l6ZTsKLSAgICBpZiAobV9uVW5pdFNpemUgIT0gc3JjLm1fblVuaXRTaXplIHx8ICFuZXdTaXplLklzVmFsaWQoKSB8fCAhU2V0U2l6ZShuZXdTaXplLlZhbHVlT3JEaWUoKSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmICghU2V0U2l6ZShtX25TaXplICsgbkNvdW50KSkgeworICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotCi0gICAgRlhTWVNfbWVtY3B5MzIobV9wRGF0YSArIG5PbGRTaXplICogbV9uVW5pdFNpemUsIHNyYy5tX3BEYXRhLCBzcmMubV9uU2l6ZSAqIG1fblVuaXRTaXplKTsKKyAgICBGWFNZU19tZW1tb3ZlKG1fcERhdGEgKyAobkluZGV4ICsgbkNvdW50KSAqIG1fblVuaXRTaXplLAorICAgICAgICAgICAgICAgICAgbV9wRGF0YSArIG5JbmRleCAqIG1fblVuaXRTaXplLAorICAgICAgICAgICAgICAgICAgKG5PbGRTaXplIC0gbkluZGV4KSAqIG1fblVuaXRTaXplKTsKKyAgICBGWFNZU19tZW1zZXQobV9wRGF0YSArIG5JbmRleCAqIG1fblVuaXRTaXplLCAwLCBuQ291bnQgKiBtX25Vbml0U2l6ZSk7CisgIH0KKyAgcmV0dXJuIG1fcERhdGEgKyBuSW5kZXggKiBtX25Vbml0U2l6ZTsKK30KK0ZYX0JPT0wgQ0ZYX0Jhc2ljQXJyYXk6OlJlbW92ZUF0KGludCBuSW5kZXgsIGludCBuQ291bnQpIHsKKyAgaWYgKG5JbmRleCA8IDAgfHwgbkNvdW50IDw9IDAgfHwgbV9uU2l6ZSA8IG5JbmRleCArIG5Db3VudCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpbnQgbk1vdmVDb3VudCA9IG1fblNpemUgLSAobkluZGV4ICsgbkNvdW50KTsKKyAgaWYgKG5Nb3ZlQ291bnQpIHsKKyAgICBGWFNZU19tZW1tb3ZlKG1fcERhdGEgKyBuSW5kZXggKiBtX25Vbml0U2l6ZSwKKyAgICAgICAgICAgICAgICAgIG1fcERhdGEgKyAobkluZGV4ICsgbkNvdW50KSAqIG1fblVuaXRTaXplLAorICAgICAgICAgICAgICAgICAgbk1vdmVDb3VudCAqIG1fblVuaXRTaXplKTsKKyAgfQorICBtX25TaXplIC09IG5Db3VudDsKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENGWF9CYXNpY0FycmF5OjpJbnNlcnRBdChpbnQgblN0YXJ0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQmFzaWNBcnJheSogcE5ld0FycmF5KSB7CisgIGlmICghcE5ld0FycmF5KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChwTmV3QXJyYXktPm1fblNpemUgPT0gMCkgewogICAgIHJldHVybiBUUlVFOworICB9CisgIGlmICghSW5zZXJ0U3BhY2VBdChuU3RhcnRJbmRleCwgcE5ld0FycmF5LT5tX25TaXplKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWFNZU19tZW1jcHkobV9wRGF0YSArIG5TdGFydEluZGV4ICogbV9uVW5pdFNpemUsIHBOZXdBcnJheS0+bV9wRGF0YSwKKyAgICAgICAgICAgICAgIHBOZXdBcnJheS0+bV9uU2l6ZSAqIG1fblVuaXRTaXplKTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENGWF9CYXNpY0FycmF5OjpDb3B5KGNvbnN0IENGWF9CYXNpY0FycmF5JiBzcmMpCi17Ci0gICAgaWYgKCFTZXRTaXplKHNyYy5tX25TaXplKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYU1lTX21lbWNweTMyKG1fcERhdGEsIHNyYy5tX3BEYXRhLCBzcmMubV9uU2l6ZSAqIG1fblVuaXRTaXplKTsKLSAgICByZXR1cm4gVFJVRTsKK2NvbnN0IHZvaWQqIENGWF9CYXNpY0FycmF5OjpHZXREYXRhUHRyKGludCBpbmRleCkgY29uc3QgeworICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG1fblNpemUgfHwgIW1fcERhdGEpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gbV9wRGF0YSArIGluZGV4ICogbV9uVW5pdFNpemU7CiB9Ci1GWF9MUEJZVEUgQ0ZYX0Jhc2ljQXJyYXk6Okluc2VydFNwYWNlQXQoaW50IG5JbmRleCwgaW50IG5Db3VudCkKLXsKLSAgICBpZiAobkluZGV4IDwgMCB8fCBuQ291bnQgPD0gMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKG5JbmRleCA+PSBtX25TaXplKSB7Ci0gICAgICAgIGlmICghU2V0U2l6ZShuSW5kZXggKyBuQ291bnQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBuT2xkU2l6ZSA9IG1fblNpemU7Ci0gICAgICAgIGlmICghU2V0U2l6ZShtX25TaXplICsgbkNvdW50KSkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgRlhTWVNfbWVtbW92ZTMyKG1fcERhdGEgKyAobkluZGV4ICsgbkNvdW50KSptX25Vbml0U2l6ZSwgbV9wRGF0YSArIG5JbmRleCAqIG1fblVuaXRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgKG5PbGRTaXplIC0gbkluZGV4KSAqIG1fblVuaXRTaXplKTsKLSAgICAgICAgRlhTWVNfbWVtc2V0MzIobV9wRGF0YSArIG5JbmRleCAqIG1fblVuaXRTaXplLCAwLCBuQ291bnQgKiBtX25Vbml0U2l6ZSk7Ci0gICAgfQotICAgIHJldHVybiBtX3BEYXRhICsgbkluZGV4ICogbV9uVW5pdFNpemU7CitDRlhfQmFzZVNlZ21lbnRlZEFycmF5OjpDRlhfQmFzZVNlZ21lbnRlZEFycmF5KGludCB1bml0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWdtZW50X3VuaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhfc2l6ZSkKKyAgICA6IG1fVW5pdFNpemUodW5pdF9zaXplKSwKKyAgICAgIG1fU2VnbWVudFNpemUoc2VnbWVudF91bml0cyksCisgICAgICBtX0luZGV4U2l6ZShpbmRleF9zaXplKSwKKyAgICAgIG1fSW5kZXhEZXB0aCgwKSwKKyAgICAgIG1fRGF0YVNpemUoMCksCisgICAgICBtX3BJbmRleChOVUxMKSB7fQordm9pZCBDRlhfQmFzZVNlZ21lbnRlZEFycmF5OjpTZXRVbml0U2l6ZShpbnQgdW5pdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VnbWVudF91bml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4X3NpemUpIHsKKyAgQVNTRVJUKG1fRGF0YVNpemUgPT0gMCk7CisgIG1fVW5pdFNpemUgPSB1bml0X3NpemU7CisgIG1fU2VnbWVudFNpemUgPSBzZWdtZW50X3VuaXRzOworICBtX0luZGV4U2l6ZSA9IGluZGV4X3NpemU7CiB9Ci1GWF9CT09MIENGWF9CYXNpY0FycmF5OjpSZW1vdmVBdChpbnQgbkluZGV4LCBpbnQgbkNvdW50KQotewotICAgIGlmIChuSW5kZXggPCAwIHx8IG5Db3VudCA8PSAwIHx8IG1fblNpemUgPCBuSW5kZXggKyBuQ291bnQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpbnQgbk1vdmVDb3VudCA9IG1fblNpemUgLSAobkluZGV4ICsgbkNvdW50KTsKLSAgICBpZiAobk1vdmVDb3VudCkgewotICAgICAgICBGWFNZU19tZW1tb3ZlMzIobV9wRGF0YSArIG5JbmRleCAqIG1fblVuaXRTaXplLCBtX3BEYXRhICsgKG5JbmRleCArIG5Db3VudCkgKiBtX25Vbml0U2l6ZSwgbk1vdmVDb3VudCAqIG1fblVuaXRTaXplKTsKLSAgICB9Ci0gICAgbV9uU2l6ZSAtPSBuQ291bnQ7Ci0gICAgcmV0dXJuIFRSVUU7CitDRlhfQmFzZVNlZ21lbnRlZEFycmF5Ojp+Q0ZYX0Jhc2VTZWdtZW50ZWRBcnJheSgpIHsKKyAgUmVtb3ZlQWxsKCk7CiB9Ci1GWF9CT09MIENGWF9CYXNpY0FycmF5OjpJbnNlcnRBdChpbnQgblN0YXJ0SW5kZXgsIGNvbnN0IENGWF9CYXNpY0FycmF5KiBwTmV3QXJyYXkpCi17Ci0gICAgaWYgKHBOZXdBcnJheSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKHBOZXdBcnJheS0+bV9uU2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAoIUluc2VydFNwYWNlQXQoblN0YXJ0SW5kZXgsIHBOZXdBcnJheS0+bV9uU2l6ZSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWFNZU19tZW1jcHkzMihtX3BEYXRhICsgblN0YXJ0SW5kZXggKiBtX25Vbml0U2l6ZSwgcE5ld0FycmF5LT5tX3BEYXRhLCBwTmV3QXJyYXktPm1fblNpemUgKiBtX25Vbml0U2l6ZSk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1jb25zdCB2b2lkKiBDRlhfQmFzaWNBcnJheTo6R2V0RGF0YVB0cihpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBtX25TaXplIHx8IG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIG1fcERhdGEgKyBpbmRleCAqIG1fblVuaXRTaXplOwotfQotQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheTo6Q0ZYX0Jhc2VTZWdtZW50ZWRBcnJheShpbnQgdW5pdF9zaXplLCBpbnQgc2VnbWVudF91bml0cywgaW50IGluZGV4X3NpemUpCi0gICAgOiBtX1VuaXRTaXplKHVuaXRfc2l6ZSkKLSAgICAsIG1fU2VnbWVudFNpemUoc2VnbWVudF91bml0cykKLSAgICAsIG1fSW5kZXhTaXplKGluZGV4X3NpemUpCi0gICAgLCBtX0luZGV4RGVwdGgoMCkKLSAgICAsIG1fRGF0YVNpemUoMCkKLSAgICAsIG1fcEluZGV4KE5VTEwpCi17Ci19Ci12b2lkIENGWF9CYXNlU2VnbWVudGVkQXJyYXk6OlNldFVuaXRTaXplKGludCB1bml0X3NpemUsIGludCBzZWdtZW50X3VuaXRzLCBpbnQgaW5kZXhfc2l6ZSkKLXsKLSAgICBBU1NFUlQobV9EYXRhU2l6ZSA9PSAwKTsKLSAgICBtX1VuaXRTaXplID0gdW5pdF9zaXplOwotICAgIG1fU2VnbWVudFNpemUgPSBzZWdtZW50X3VuaXRzOwotICAgIG1fSW5kZXhTaXplID0gaW5kZXhfc2l6ZTsKLX0KLUNGWF9CYXNlU2VnbWVudGVkQXJyYXk6On5DRlhfQmFzZVNlZ21lbnRlZEFycmF5KCkKLXsKLSAgICBSZW1vdmVBbGwoKTsKLX0KLXN0YXRpYyB2b2lkIF9DbGVhckluZGV4KGludCBsZXZlbCwgaW50IHNpemUsIHZvaWQqKiBwSW5kZXgpCi17Ci0gICAgaWYgKGxldmVsID09IDApIHsKLSAgICAgICAgRlhfRnJlZShwSW5kZXgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIGlmIChwSW5kZXhbaV0gPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgX0NsZWFySW5kZXgobGV2ZWwgLSAxLCBzaXplLCAodm9pZCoqKXBJbmRleFtpXSk7Ci0gICAgfQorc3RhdGljIHZvaWQgX0NsZWFySW5kZXgoaW50IGxldmVsLCBpbnQgc2l6ZSwgdm9pZCoqIHBJbmRleCkgeworICBpZiAobGV2ZWwgPT0gMCkgewogICAgIEZYX0ZyZWUocEluZGV4KTsKKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICBpZiAocEluZGV4W2ldKQorICAgICAgX0NsZWFySW5kZXgobGV2ZWwgLSAxLCBzaXplLCAodm9pZCoqKXBJbmRleFtpXSk7CisgIH0KKyAgRlhfRnJlZShwSW5kZXgpOwogfQotdm9pZCBDRlhfQmFzZVNlZ21lbnRlZEFycmF5OjpSZW1vdmVBbGwoKQotewotICAgIGlmIChtX3BJbmRleCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgX0NsZWFySW5kZXgobV9JbmRleERlcHRoLCBtX0luZGV4U2l6ZSwgKHZvaWQqKiltX3BJbmRleCk7Ci0gICAgbV9wSW5kZXggPSBOVUxMOwotICAgIG1fSW5kZXhEZXB0aCA9IDA7Ci0gICAgbV9EYXRhU2l6ZSA9IDA7Cit2b2lkIENGWF9CYXNlU2VnbWVudGVkQXJyYXk6OlJlbW92ZUFsbCgpIHsKKyAgaWYgKCFtX3BJbmRleCkgeworICAgIHJldHVybjsKKyAgfQorICBfQ2xlYXJJbmRleChtX0luZGV4RGVwdGgsIG1fSW5kZXhTaXplLCAodm9pZCoqKW1fcEluZGV4KTsKKyAgbV9wSW5kZXggPSBOVUxMOworICBtX0luZGV4RGVwdGggPSAwOworICBtX0RhdGFTaXplID0gMDsKIH0KLXZvaWQqIENGWF9CYXNlU2VnbWVudGVkQXJyYXk6OkFkZCgpCi17Ci0gICAgaWYgKG1fRGF0YVNpemUgJSBtX1NlZ21lbnRTaXplKSB7Ci0gICAgICAgIHJldHVybiBHZXRBdChtX0RhdGFTaXplICsrKTsKLSAgICB9Ci0gICAgdm9pZCogcFNlZ21lbnQgPSBGWF9BbGxvYzJEKEZYX0JZVEUsIG1fVW5pdFNpemUsIG1fU2VnbWVudFNpemUpOwotICAgIGlmIChtX3BJbmRleCA9PSBOVUxMKSB7Ci0gICAgICAgIG1fcEluZGV4ID0gcFNlZ21lbnQ7Ci0gICAgICAgIG1fRGF0YVNpemUgKys7Ci0gICAgICAgIHJldHVybiBwU2VnbWVudDsKLSAgICB9Ci0gICAgaWYgKG1fSW5kZXhEZXB0aCA9PSAwKSB7Ci0gICAgICAgIHZvaWQqKiBwSW5kZXggPSAodm9pZCoqKUZYX0FsbG9jKHZvaWQqLCBtX0luZGV4U2l6ZSk7Ci0gICAgICAgIHBJbmRleFswXSA9IG1fcEluZGV4OwotICAgICAgICBwSW5kZXhbMV0gPSBwU2VnbWVudDsKLSAgICAgICAgbV9wSW5kZXggPSBwSW5kZXg7Ci0gICAgICAgIG1fRGF0YVNpemUgKys7Ci0gICAgICAgIG1fSW5kZXhEZXB0aCArKzsKLSAgICAgICAgcmV0dXJuIHBTZWdtZW50OwotICAgIH0KLSAgICBpbnQgc2VnX2luZGV4ID0gbV9EYXRhU2l6ZSAvIG1fU2VnbWVudFNpemU7Ci0gICAgaWYgKHNlZ19pbmRleCAlIG1fSW5kZXhTaXplKSB7Ci0gICAgICAgIHZvaWQqKiBwSW5kZXggPSBHZXRJbmRleChzZWdfaW5kZXgpOwotICAgICAgICBwSW5kZXhbc2VnX2luZGV4ICUgbV9JbmRleFNpemVdID0gcFNlZ21lbnQ7Ci0gICAgICAgIG1fRGF0YVNpemUgKys7Ci0gICAgICAgIHJldHVybiBwU2VnbWVudDsKLSAgICB9Ci0gICAgaW50IHRyZWVfc2l6ZSA9IDE7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG1fSW5kZXhEZXB0aDsgaSArKykgewotICAgICAgICB0cmVlX3NpemUgKj0gbV9JbmRleFNpemU7Ci0gICAgfQotICAgIGlmIChtX0RhdGFTaXplID09IHRyZWVfc2l6ZSAqIG1fU2VnbWVudFNpemUpIHsKLSAgICAgICAgdm9pZCoqIHBJbmRleCA9ICh2b2lkKiopRlhfQWxsb2Modm9pZCosIG1fSW5kZXhTaXplKTsKLSAgICAgICAgcEluZGV4WzBdID0gbV9wSW5kZXg7Ci0gICAgICAgIG1fcEluZGV4ID0gcEluZGV4OwotICAgICAgICBtX0luZGV4RGVwdGggKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdHJlZV9zaXplIC89IG1fSW5kZXhTaXplOwotICAgIH0KLSAgICB2b2lkKiogcFNwb3QgPSAodm9pZCoqKW1fcEluZGV4OwotICAgIGZvciAoaSA9IDE7IGkgPCBtX0luZGV4RGVwdGg7IGkgKyspIHsKLSAgICAgICAgaWYgKHBTcG90W3NlZ19pbmRleCAvIHRyZWVfc2l6ZV0gPT0gTlVMTCkgewotICAgICAgICAgICAgcFNwb3Rbc2VnX2luZGV4IC8gdHJlZV9zaXplXSA9ICh2b2lkKilGWF9BbGxvYyh2b2lkKiwgbV9JbmRleFNpemUpOwotICAgICAgICB9Ci0gICAgICAgIHBTcG90ID0gKHZvaWQqKilwU3BvdFtzZWdfaW5kZXggLyB0cmVlX3NpemVdOwotICAgICAgICBzZWdfaW5kZXggPSBzZWdfaW5kZXggJSB0cmVlX3NpemU7Ci0gICAgICAgIHRyZWVfc2l6ZSAvPSBtX0luZGV4U2l6ZTsKLSAgICB9Ci0gICAgaWYgKGkgPCBtX0luZGV4RGVwdGgpIHsKLSAgICAgICAgRlhfRnJlZShwU2VnbWVudCk7Ci0gICAgICAgIFJlbW92ZUFsbCgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcFNwb3Rbc2VnX2luZGV4ICUgbV9JbmRleFNpemVdID0gcFNlZ21lbnQ7Ci0gICAgbV9EYXRhU2l6ZSArKzsKK3ZvaWQqIENGWF9CYXNlU2VnbWVudGVkQXJyYXk6OkFkZCgpIHsKKyAgaWYgKG1fRGF0YVNpemUgJSBtX1NlZ21lbnRTaXplKSB7CisgICAgcmV0dXJuIEdldEF0KG1fRGF0YVNpemUrKyk7CisgIH0KKyAgdm9pZCogcFNlZ21lbnQgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIG1fVW5pdFNpemUsIG1fU2VnbWVudFNpemUpOworICBpZiAoIW1fcEluZGV4KSB7CisgICAgbV9wSW5kZXggPSBwU2VnbWVudDsKKyAgICBtX0RhdGFTaXplKys7CiAgICAgcmV0dXJuIHBTZWdtZW50OwotfQotdm9pZCoqIENGWF9CYXNlU2VnbWVudGVkQXJyYXk6OkdldEluZGV4KGludCBzZWdfaW5kZXgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1fSW5kZXhEZXB0aCAhPSAwKTsKLSAgICBpZiAobV9JbmRleERlcHRoID09IDEpIHsKLSAgICAgICAgcmV0dXJuICh2b2lkKiopbV9wSW5kZXg7Ci0gICAgfSBlbHNlIGlmIChtX0luZGV4RGVwdGggPT0gMikgewotICAgICAgICByZXR1cm4gKHZvaWQqKikoKHZvaWQqKiltX3BJbmRleClbc2VnX2luZGV4IC8gbV9JbmRleFNpemVdOworICB9CisgIGlmIChtX0luZGV4RGVwdGggPT0gMCkgeworICAgIHZvaWQqKiBwSW5kZXggPSBGWF9BbGxvYyh2b2lkKiwgbV9JbmRleFNpemUpOworICAgIHBJbmRleFswXSA9IG1fcEluZGV4OworICAgIHBJbmRleFsxXSA9IHBTZWdtZW50OworICAgIG1fcEluZGV4ID0gcEluZGV4OworICAgIG1fRGF0YVNpemUrKzsKKyAgICBtX0luZGV4RGVwdGgrKzsKKyAgICByZXR1cm4gcFNlZ21lbnQ7CisgIH0KKyAgaW50IHNlZ19pbmRleCA9IG1fRGF0YVNpemUgLyBtX1NlZ21lbnRTaXplOworICBpZiAoc2VnX2luZGV4ICUgbV9JbmRleFNpemUpIHsKKyAgICB2b2lkKiogcEluZGV4ID0gR2V0SW5kZXgoc2VnX2luZGV4KTsKKyAgICBwSW5kZXhbc2VnX2luZGV4ICUgbV9JbmRleFNpemVdID0gcFNlZ21lbnQ7CisgICAgbV9EYXRhU2l6ZSsrOworICAgIHJldHVybiBwU2VnbWVudDsKKyAgfQorICBpbnQgdHJlZV9zaXplID0gMTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBtX0luZGV4RGVwdGg7IGkrKykgeworICAgIHRyZWVfc2l6ZSAqPSBtX0luZGV4U2l6ZTsKKyAgfQorICBpZiAobV9EYXRhU2l6ZSA9PSB0cmVlX3NpemUgKiBtX1NlZ21lbnRTaXplKSB7CisgICAgdm9pZCoqIHBJbmRleCA9IEZYX0FsbG9jKHZvaWQqLCBtX0luZGV4U2l6ZSk7CisgICAgcEluZGV4WzBdID0gbV9wSW5kZXg7CisgICAgbV9wSW5kZXggPSBwSW5kZXg7CisgICAgbV9JbmRleERlcHRoKys7CisgIH0gZWxzZSB7CisgICAgdHJlZV9zaXplIC89IG1fSW5kZXhTaXplOworICB9CisgIHZvaWQqKiBwU3BvdCA9ICh2b2lkKiopbV9wSW5kZXg7CisgIGZvciAoaSA9IDE7IGkgPCBtX0luZGV4RGVwdGg7IGkrKykgeworICAgIGlmICghcFNwb3Rbc2VnX2luZGV4IC8gdHJlZV9zaXplXSkgeworICAgICAgcFNwb3Rbc2VnX2luZGV4IC8gdHJlZV9zaXplXSA9IEZYX0FsbG9jKHZvaWQqLCBtX0luZGV4U2l6ZSk7CiAgICAgfQotICAgIGludCB0cmVlX3NpemUgPSAxOwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDE7IGkgPCBtX0luZGV4RGVwdGg7IGkgKyspIHsKLSAgICAgICAgdHJlZV9zaXplICo9IG1fSW5kZXhTaXplOwotICAgIH0KLSAgICB2b2lkKiogcFNwb3QgPSAodm9pZCoqKW1fcEluZGV4OwotICAgIGZvciAoaSA9IDE7IGkgPCBtX0luZGV4RGVwdGg7IGkgKyspIHsKLSAgICAgICAgcFNwb3QgPSAodm9pZCoqKXBTcG90W3NlZ19pbmRleCAvIHRyZWVfc2l6ZV07Ci0gICAgICAgIHNlZ19pbmRleCA9IHNlZ19pbmRleCAlIHRyZWVfc2l6ZTsKLSAgICAgICAgdHJlZV9zaXplIC89IG1fSW5kZXhTaXplOwotICAgIH0KLSAgICByZXR1cm4gcFNwb3Q7Ci19Ci12b2lkKiBDRlhfQmFzZVNlZ21lbnRlZEFycmF5OjpJdGVyYXRlU2VnbWVudChGWF9MUENCWVRFIHBTZWdtZW50LCBpbnQgY291bnQsIEZYX0JPT0wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKSwgdm9pZCogcGFyYW0pIGNvbnN0Ci17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgewotICAgICAgICBpZiAoIWNhbGxiYWNrKHBhcmFtLCAodm9pZCopKHBTZWdtZW50ICsgaSAqIG1fVW5pdFNpemUpKSkgewotICAgICAgICAgICAgcmV0dXJuICh2b2lkKikocFNlZ21lbnQgKyBpICogbV9Vbml0U2l6ZSk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgcFNwb3QgPSAodm9pZCoqKXBTcG90W3NlZ19pbmRleCAvIHRyZWVfc2l6ZV07CisgICAgc2VnX2luZGV4ID0gc2VnX2luZGV4ICUgdHJlZV9zaXplOworICAgIHRyZWVfc2l6ZSAvPSBtX0luZGV4U2l6ZTsKKyAgfQorICBpZiAoaSA8IG1fSW5kZXhEZXB0aCkgeworICAgIEZYX0ZyZWUocFNlZ21lbnQpOworICAgIFJlbW92ZUFsbCgpOwogICAgIHJldHVybiBOVUxMOworICB9CisgIHBTcG90W3NlZ19pbmRleCAlIG1fSW5kZXhTaXplXSA9IHBTZWdtZW50OworICBtX0RhdGFTaXplKys7CisgIHJldHVybiBwU2VnbWVudDsKIH0KLXZvaWQqIENGWF9CYXNlU2VnbWVudGVkQXJyYXk6Okl0ZXJhdGVJbmRleChpbnQgbGV2ZWwsIGludCYgc3RhcnQsIHZvaWQqKiBwSW5kZXgsIEZYX0JPT0wgKCpjYWxsYmFjaykodm9pZCogcGFyYW0sIHZvaWQqIHBEYXRhKSwgdm9pZCogcGFyYW0pIGNvbnN0Ci17Ci0gICAgaWYgKGxldmVsID09IDApIHsKLSAgICAgICAgaW50IGNvdW50ID0gbV9EYXRhU2l6ZSAtIHN0YXJ0OwotICAgICAgICBpZiAoY291bnQgPiBtX1NlZ21lbnRTaXplKSB7Ci0gICAgICAgICAgICBjb3VudCA9IG1fU2VnbWVudFNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhcnQgKz0gY291bnQ7Ci0gICAgICAgIHJldHVybiBJdGVyYXRlU2VnbWVudCgoRlhfTFBDQllURSlwSW5kZXgsIGNvdW50LCBjYWxsYmFjaywgcGFyYW0pOwordm9pZCoqIENGWF9CYXNlU2VnbWVudGVkQXJyYXk6OkdldEluZGV4KGludCBzZWdfaW5kZXgpIGNvbnN0IHsKKyAgQVNTRVJUKG1fSW5kZXhEZXB0aCAhPSAwKTsKKyAgaWYgKG1fSW5kZXhEZXB0aCA9PSAxKSB7CisgICAgcmV0dXJuICh2b2lkKiopbV9wSW5kZXg7CisgIH0KKyAgaWYgKG1fSW5kZXhEZXB0aCA9PSAyKSB7CisgICAgcmV0dXJuICh2b2lkKiopKCh2b2lkKiopbV9wSW5kZXgpW3NlZ19pbmRleCAvIG1fSW5kZXhTaXplXTsKKyAgfQorICBpbnQgdHJlZV9zaXplID0gMTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDE7IGkgPCBtX0luZGV4RGVwdGg7IGkrKykgeworICAgIHRyZWVfc2l6ZSAqPSBtX0luZGV4U2l6ZTsKKyAgfQorICB2b2lkKiogcFNwb3QgPSAodm9pZCoqKW1fcEluZGV4OworICBmb3IgKGkgPSAxOyBpIDwgbV9JbmRleERlcHRoOyBpKyspIHsKKyAgICBwU3BvdCA9ICh2b2lkKiopcFNwb3Rbc2VnX2luZGV4IC8gdHJlZV9zaXplXTsKKyAgICBzZWdfaW5kZXggPSBzZWdfaW5kZXggJSB0cmVlX3NpemU7CisgICAgdHJlZV9zaXplIC89IG1fSW5kZXhTaXplOworICB9CisgIHJldHVybiBwU3BvdDsKK30KK3ZvaWQqIENGWF9CYXNlU2VnbWVudGVkQXJyYXk6Okl0ZXJhdGVTZWdtZW50KGNvbnN0IHVpbnQ4X3QqIHBTZWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCAoKmNhbGxiYWNrKSh2b2lkKiBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0pIGNvbnN0IHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgaWYgKCFjYWxsYmFjayhwYXJhbSwgKHZvaWQqKShwU2VnbWVudCArIGkgKiBtX1VuaXRTaXplKSkpIHsKKyAgICAgIHJldHVybiAodm9pZCopKHBTZWdtZW50ICsgaSAqIG1fVW5pdFNpemUpOwogICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fSW5kZXhTaXplOyBpICsrKSB7Ci0gICAgICAgIGlmIChwSW5kZXhbaV0gPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgdm9pZCogcCA9IEl0ZXJhdGVJbmRleChsZXZlbCAtIDEsIHN0YXJ0LCAodm9pZCoqKXBJbmRleFtpXSwgY2FsbGJhY2ssIHBhcmFtKTsKLSAgICAgICAgaWYgKHApIHsKLSAgICAgICAgICAgIHJldHVybiBwOwotICAgICAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9Cit2b2lkKiBDRlhfQmFzZVNlZ21lbnRlZEFycmF5OjpJdGVyYXRlSW5kZXgoaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIHBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MICgqY2FsbGJhY2spKHZvaWQqIHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcERhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtKSBjb25zdCB7CisgIGlmIChsZXZlbCA9PSAwKSB7CisgICAgaW50IGNvdW50ID0gbV9EYXRhU2l6ZSAtIHN0YXJ0OworICAgIGlmIChjb3VudCA+IG1fU2VnbWVudFNpemUpIHsKKyAgICAgIGNvdW50ID0gbV9TZWdtZW50U2l6ZTsKICAgICB9CisgICAgc3RhcnQgKz0gY291bnQ7CisgICAgcmV0dXJuIEl0ZXJhdGVTZWdtZW50KChjb25zdCB1aW50OF90KilwSW5kZXgsIGNvdW50LCBjYWxsYmFjaywgcGFyYW0pOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9JbmRleFNpemU7IGkrKykgeworICAgIGlmICghcEluZGV4W2ldKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgdm9pZCogcCA9CisgICAgICAgIEl0ZXJhdGVJbmRleChsZXZlbCAtIDEsIHN0YXJ0LCAodm9pZCoqKXBJbmRleFtpXSwgY2FsbGJhY2ssIHBhcmFtKTsKKyAgICBpZiAocCkgeworICAgICAgcmV0dXJuIHA7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQordm9pZCogQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheTo6SXRlcmF0ZShGWF9CT09MICgqY2FsbGJhY2spKHZvaWQqIHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBEYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0pIGNvbnN0IHsKKyAgaWYgKCFtX3BJbmRleCkgewogICAgIHJldHVybiBOVUxMOworICB9CisgIGludCBzdGFydCA9IDA7CisgIHJldHVybiBJdGVyYXRlSW5kZXgobV9JbmRleERlcHRoLCBzdGFydCwgKHZvaWQqKiltX3BJbmRleCwgY2FsbGJhY2ssIHBhcmFtKTsKIH0KLXZvaWQqIENGWF9CYXNlU2VnbWVudGVkQXJyYXk6Okl0ZXJhdGUoRlhfQk9PTCAoKmNhbGxiYWNrKSh2b2lkKiBwYXJhbSwgdm9pZCogcERhdGEpLCB2b2lkKiBwYXJhbSkgY29uc3QKLXsKLSAgICBpZiAobV9wSW5kZXggPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaW50IHN0YXJ0ID0gMDsKLSAgICByZXR1cm4gSXRlcmF0ZUluZGV4KG1fSW5kZXhEZXB0aCwgc3RhcnQsICh2b2lkKiopbV9wSW5kZXgsIGNhbGxiYWNrLCBwYXJhbSk7Cit2b2lkKiBDRlhfQmFzZVNlZ21lbnRlZEFycmF5OjpHZXRBdChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBtX0RhdGFTaXplKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKG1fSW5kZXhEZXB0aCA9PSAwKSB7CisgICAgcmV0dXJuICh1aW50OF90KiltX3BJbmRleCArIG1fVW5pdFNpemUgKiBpbmRleDsKKyAgfQorICBpbnQgc2VnX2luZGV4ID0gaW5kZXggLyBtX1NlZ21lbnRTaXplOworICByZXR1cm4gKHVpbnQ4X3QqKUdldEluZGV4KHNlZ19pbmRleClbc2VnX2luZGV4ICUgbV9JbmRleFNpemVdICsKKyAgICAgICAgIChpbmRleCAlIG1fU2VnbWVudFNpemUpICogbV9Vbml0U2l6ZTsKIH0KLXZvaWQqIENGWF9CYXNlU2VnbWVudGVkQXJyYXk6OkdldEF0KGludCBpbmRleCkgY29uc3QKLXsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG1fRGF0YVNpemUpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Cit2b2lkIENGWF9CYXNlU2VnbWVudGVkQXJyYXk6OkRlbGV0ZShpbnQgaW5kZXgsIGludCBjb3VudCkgeworICBpZiAoaW5kZXggPCAwIHx8IGNvdW50IDwgMSB8fCBpbmRleCArIGNvdW50ID4gbV9EYXRhU2l6ZSkgeworICAgIHJldHVybjsKKyAgfQorICBpbnQgaTsKKyAgZm9yIChpID0gaW5kZXg7IGkgPCBtX0RhdGFTaXplIC0gY291bnQ7IGkrKykgeworICAgIHVpbnQ4X3QqIHBTcmMgPSAodWludDhfdCopR2V0QXQoaSArIGNvdW50KTsKKyAgICB1aW50OF90KiBwRGVzdCA9ICh1aW50OF90KilHZXRBdChpKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IG1fVW5pdFNpemU7IGorKykgeworICAgICAgcERlc3Rbal0gPSBwU3JjW2pdOwogICAgIH0KLSAgICBpZiAobV9JbmRleERlcHRoID09IDApIHsKLSAgICAgICAgcmV0dXJuIChGWF9MUEJZVEUpbV9wSW5kZXggKyBtX1VuaXRTaXplICogaW5kZXg7CisgIH0KKyAgaW50IG5ld19zZWdzID0gKG1fRGF0YVNpemUgLSBjb3VudCArIG1fU2VnbWVudFNpemUgLSAxKSAvIG1fU2VnbWVudFNpemU7CisgIGludCBvbGRfc2VncyA9IChtX0RhdGFTaXplICsgbV9TZWdtZW50U2l6ZSAtIDEpIC8gbV9TZWdtZW50U2l6ZTsKKyAgaWYgKG5ld19zZWdzIDwgb2xkX3NlZ3MpIHsKKyAgICBpZiAobV9JbmRleERlcHRoKSB7CisgICAgICBmb3IgKGkgPSBuZXdfc2VnczsgaSA8IG9sZF9zZWdzOyBpKyspIHsKKyAgICAgICAgdm9pZCoqIHBJbmRleCA9IEdldEluZGV4KGkpOworICAgICAgICBGWF9GcmVlKHBJbmRleFtpICUgbV9JbmRleFNpemVdKTsKKyAgICAgICAgcEluZGV4W2kgJSBtX0luZGV4U2l6ZV0gPSBOVUxMOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBGWF9GcmVlKG1fcEluZGV4KTsKKyAgICAgIG1fcEluZGV4ID0gTlVMTDsKICAgICB9Ci0gICAgaW50IHNlZ19pbmRleCA9IGluZGV4IC8gbV9TZWdtZW50U2l6ZTsKLSAgICByZXR1cm4gKEZYX0xQQllURSlHZXRJbmRleChzZWdfaW5kZXgpW3NlZ19pbmRleCAlIG1fSW5kZXhTaXplXSArIChpbmRleCAlIG1fU2VnbWVudFNpemUpICogbV9Vbml0U2l6ZTsKLX0KLXZvaWQgQ0ZYX0Jhc2VTZWdtZW50ZWRBcnJheTo6RGVsZXRlKGludCBpbmRleCwgaW50IGNvdW50KQotewotICAgIGlmKGluZGV4IDwgMCB8fCBjb3VudCA8IDEgfHwgaW5kZXggKyBjb3VudCA+IG1fRGF0YVNpemUpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSBpbmRleDsgaSA8IG1fRGF0YVNpemUgLSBjb3VudDsgaSArKykgewotICAgICAgICBGWF9CWVRFKiBwU3JjID0gKEZYX0JZVEUqKUdldEF0KGkgKyBjb3VudCk7Ci0gICAgICAgIEZYX0JZVEUqIHBEZXN0ID0gKEZYX0JZVEUqKUdldEF0KGkpOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG1fVW5pdFNpemU7IGogKyspIHsKLSAgICAgICAgICAgIHBEZXN0W2pdID0gcFNyY1tqXTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpbnQgbmV3X3NlZ3MgPSAobV9EYXRhU2l6ZSAtIGNvdW50ICsgbV9TZWdtZW50U2l6ZSAtIDEpIC8gbV9TZWdtZW50U2l6ZTsKLSAgICBpbnQgb2xkX3NlZ3MgPSAobV9EYXRhU2l6ZSArIG1fU2VnbWVudFNpemUgLSAxKSAvIG1fU2VnbWVudFNpemU7Ci0gICAgaWYgKG5ld19zZWdzIDwgb2xkX3NlZ3MpIHsKLSAgICAgICAgaWYobV9JbmRleERlcHRoKSB7Ci0gICAgICAgICAgICBmb3IgKGkgPSBuZXdfc2VnczsgaSA8IG9sZF9zZWdzOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgdm9pZCoqIHBJbmRleCA9IEdldEluZGV4KGkpOwotICAgICAgICAgICAgICAgIEZYX0ZyZWUocEluZGV4W2kgJSBtX0luZGV4U2l6ZV0pOwotICAgICAgICAgICAgICAgIHBJbmRleFtpICUgbV9JbmRleFNpemVdID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZYX0ZyZWUobV9wSW5kZXgpOwotICAgICAgICAgICAgbV9wSW5kZXggPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIG1fRGF0YVNpemUgLT0gY291bnQ7CisgIH0KKyAgbV9EYXRhU2l6ZSAtPSBjb3VudDsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2JzdHJpbmcuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfYnN0cmluZy5jcHAKaW5kZXggMjM3N2E2ZC4uZTBkMTE0NiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfYnN0cmluZy5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfYnN0cmluZy5jcHAKQEAgLTUsMTEyOSArNSwxMDkyIEBACiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSA8c3RkZGVmLmg+ICAvLyBGb3Igb2Zmc2V0b2YoKS4KKyNpbmNsdWRlIDxjY3R5cGU+CiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vdGhpcmRfcGFydHkvYmFzZS9udW1lcmljcy9zYWZlX21hdGguaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfbWF0aC5oIgogCi1zdGF0aWMgaW50IF9CdWZmZXJfaXRvYShjaGFyKiBidWYsIGludCBpLCBGWF9EV09SRCBmbGFncykKLXsKLSAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICAgIGJ1ZlswXSA9ICcwJzsKLSAgICAgICAgcmV0dXJuIDE7CitzdGF0aWMgaW50IF9CdWZmZXJfaXRvYShjaGFyKiBidWYsIGludCBpLCBGWF9EV09SRCBmbGFncykgeworICBpZiAoaSA9PSAwKSB7CisgICAgYnVmWzBdID0gJzAnOworICAgIHJldHVybiAxOworICB9CisgIGNoYXIgYnVmMVszMl07CisgIGludCBidWZfcG9zID0gMzE7CisgIEZYX0RXT1JEIHUgPSBpOworICBpZiAoKGZsYWdzICYgRlhGT1JNQVRfU0lHTkVEKSAmJiBpIDwgMCkgeworICAgIHUgPSAtaTsKKyAgfQorICBpbnQgYmFzZSA9IDEwOworICBjb25zdCBGWF9DSEFSKiBzdHJpbmcgPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisgIGlmIChmbGFncyAmIEZYRk9STUFUX0hFWCkgeworICAgIGJhc2UgPSAxNjsKKyAgICBpZiAoZmxhZ3MgJiBGWEZPUk1BVF9DQVBJVEFMKSB7CisgICAgICBzdHJpbmcgPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CiAgICAgfQotICAgIGNoYXIgYnVmMVszMl07Ci0gICAgaW50IGJ1Zl9wb3MgPSAzMTsKLSAgICBGWF9EV09SRCB1ID0gaTsKLSAgICBpZiAoKGZsYWdzICYgRlhGT1JNQVRfU0lHTkVEKSAmJiBpIDwgMCkgewotICAgICAgICB1ID0gLWk7Ci0gICAgfQotICAgIGludCBiYXNlID0gMTA7Ci0gICAgRlhfTFBDU1RSIHN0cmluZyA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKLSAgICBpZiAoZmxhZ3MgJiBGWEZPUk1BVF9IRVgpIHsKLSAgICAgICAgYmFzZSA9IDE2OwotICAgICAgICBpZiAoZmxhZ3MgJiBGWEZPUk1BVF9DQVBJVEFMKSB7Ci0gICAgICAgICAgICBzdHJpbmcgPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgd2hpbGUgKHUgIT0gMCkgewotICAgICAgICBidWYxW2J1Zl9wb3MtLV0gPSBzdHJpbmdbdSAlIGJhc2VdOwotICAgICAgICB1ID0gdSAvIGJhc2U7Ci0gICAgfQotICAgIGlmICgoZmxhZ3MgJiBGWEZPUk1BVF9TSUdORUQpICYmIGkgPCAwKSB7Ci0gICAgICAgIGJ1ZjFbYnVmX3Bvcy0tXSA9ICctJzsKLSAgICB9Ci0gICAgaW50IGxlbiA9IDMxIC0gYnVmX3BvczsKLSAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgbGVuOyBpaSArKykgewotICAgICAgICBidWZbaWldID0gYnVmMVtpaSArIGJ1Zl9wb3MgKyAxXTsKLSAgICB9Ci0gICAgcmV0dXJuIGxlbjsKKyAgfQorICB3aGlsZSAodSAhPSAwKSB7CisgICAgYnVmMVtidWZfcG9zLS1dID0gc3RyaW5nW3UgJSBiYXNlXTsKKyAgICB1ID0gdSAvIGJhc2U7CisgIH0KKyAgaWYgKChmbGFncyAmIEZYRk9STUFUX1NJR05FRCkgJiYgaSA8IDApIHsKKyAgICBidWYxW2J1Zl9wb3MtLV0gPSAnLSc7CisgIH0KKyAgaW50IGxlbiA9IDMxIC0gYnVmX3BvczsKKyAgZm9yIChpbnQgaWkgPSAwOyBpaSA8IGxlbjsgaWkrKykgeworICAgIGJ1ZltpaV0gPSBidWYxW2lpICsgYnVmX3BvcyArIDFdOworICB9CisgIHJldHVybiBsZW47CiB9Ci1DRlhfQnl0ZVN0cmluZyBDRlhfQnl0ZVN0cmluZzo6Rm9ybWF0SW50ZWdlcihpbnQgaSwgRlhfRFdPUkQgZmxhZ3MpCi17Ci0gICAgY2hhciBidWZbMzJdOwotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MoYnVmLCBfQnVmZmVyX2l0b2EoYnVmLCBpLCBmbGFncykpOworQ0ZYX0J5dGVTdHJpbmcgQ0ZYX0J5dGVTdHJpbmc6OkZvcm1hdEludGVnZXIoaW50IGksIEZYX0RXT1JEIGZsYWdzKSB7CisgIGNoYXIgYnVmWzMyXTsKKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQyhidWYsIF9CdWZmZXJfaXRvYShidWYsIGksIGZsYWdzKSk7CiB9CiAKIC8vIHN0YXRpYwotQ0ZYX0J5dGVTdHJpbmc6OlN0cmluZ0RhdGEqIENGWF9CeXRlU3RyaW5nOjpTdHJpbmdEYXRhOjpDcmVhdGUoaW50IG5MZW4pCi17Ci0gICAgLy8gfG5MZW58IGlzIGN1cnJlbnRseSBkZWNsYXJlZCBhcyBpbiB8aW50fC4gVE9ETyhwYWxtZXIpOiBJdCBzaG91bGQgYmUKLSAgICAvLyBhIHxzaXplX3R8LCBvciBhdCBsZWFzdCB1bnNpZ25lZC4KLSAgICBpZiAobkxlbiA9PSAwIHx8IG5MZW4gPCAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KK0NGWF9CeXRlU3RyaW5nOjpTdHJpbmdEYXRhKiBDRlhfQnl0ZVN0cmluZzo6U3RyaW5nRGF0YTo6Q3JlYXRlKGludCBuTGVuKSB7CisgIC8vIHxuTGVufCBpcyBjdXJyZW50bHkgZGVjbGFyZWQgYXMgaW4gfGludHwuIFRPRE8ocGFsbWVyKTogSXQgc2hvdWxkIGJlCisgIC8vIGEgfHNpemVfdHwsIG9yIGF0IGxlYXN0IHVuc2lnbmVkLgorICBpZiAobkxlbiA9PSAwIHx8IG5MZW4gPCAwKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KIAotICAgIC8vIEZpeGVkIHBvcnRpb24gb2YgaGVhZGVyIHBsdXMgYSBOVUwgY2hhciBub3QgaW5jbHVkZWQgaW4gbV9uQWxsb2NMZW5ndGguCi0gICAgLy8gc2l6ZW9mKEZYX0NIQVIpIGlzIGFsd2F5cyAxLCB1c2VkIGZvciBjb25zaXN0ZW5jeSB3aXRoIENGWF9XaWRlc3RyaW5nLgotICAgIGludCBvdmVyaGVhZCA9IG9mZnNldG9mKFN0cmluZ0RhdGEsIG1fU3RyaW5nKSArIHNpemVvZihGWF9DSEFSKTsKLSAgICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPGludD4gblNpemUgPSBuTGVuOwotICAgIG5TaXplICs9IG92ZXJoZWFkOworICAvLyBGaXhlZCBwb3J0aW9uIG9mIGhlYWRlciBwbHVzIGEgTlVMIGNoYXIgbm90IGluY2x1ZGVkIGluIG1fbkFsbG9jTGVuZ3RoLgorICAvLyBzaXplb2YoRlhfQ0hBUikgaXMgYWx3YXlzIDEsIHVzZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggQ0ZYX1dpZGVzdHJpbmcuCisgIGludCBvdmVyaGVhZCA9IG9mZnNldG9mKFN0cmluZ0RhdGEsIG1fU3RyaW5nKSArIHNpemVvZihGWF9DSEFSKTsKKyAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxpbnQ+IG5TaXplID0gbkxlbjsKKyAgblNpemUgKz0gb3ZlcmhlYWQ7CiAKLSAgICAvLyBOb3cgcm91bmQgdG8gYW4gOC1ieXRlIGJvdW5kYXJ5LiBXZSdkIGV4cGVjdCB0aGF0IHRoaXMgaXMgdGhlIG1pbmltdW0KLSAgICAvLyBncmFudWxhcml0eSBvZiBhbnkgb2YgdGhlIHVuZGVybHlpbmcgYWxsb2NhdG9ycywgc28gdGhlcmUgbWF5IGJlIGNhc2VzCi0gICAgLy8gd2hlcmUgd2UgY2FuIHNhdmUgYSByZS1hbGxvYyB3aGVuIGFkZGluZyBhIGZldyBjaGFyYWN0ZXJzIHRvIGEgc3RyaW5nCi0gICAgLy8gYnkgdXNpbmcgdGhpcyBvdGhlcndpc2Ugd2FzdGVkIHNwYWNlLgotICAgIG5TaXplICs9IDc7Ci0gICAgaW50IHRvdGFsU2l6ZSA9IG5TaXplLlZhbHVlT3JEaWUoKSAmIH43OwotICAgIGludCB1c2FibGVTaXplID0gdG90YWxTaXplIC0gb3ZlcmhlYWQ7Ci0gICAgRlhTWVNfYXNzZXJ0KHVzYWJsZVNpemUgPj0gbkxlbik7CisgIC8vIE5vdyByb3VuZCB0byBhbiA4LWJ5dGUgYm91bmRhcnkuIFdlJ2QgZXhwZWN0IHRoYXQgdGhpcyBpcyB0aGUgbWluaW11bQorICAvLyBncmFudWxhcml0eSBvZiBhbnkgb2YgdGhlIHVuZGVybHlpbmcgYWxsb2NhdG9ycywgc28gdGhlcmUgbWF5IGJlIGNhc2VzCisgIC8vIHdoZXJlIHdlIGNhbiBzYXZlIGEgcmUtYWxsb2Mgd2hlbiBhZGRpbmcgYSBmZXcgY2hhcmFjdGVycyB0byBhIHN0cmluZworICAvLyBieSB1c2luZyB0aGlzIG90aGVyd2lzZSB3YXN0ZWQgc3BhY2UuCisgIG5TaXplICs9IDc7CisgIGludCB0b3RhbFNpemUgPSBuU2l6ZS5WYWx1ZU9yRGllKCkgJiB+NzsKKyAgaW50IHVzYWJsZVNpemUgPSB0b3RhbFNpemUgLSBvdmVyaGVhZDsKKyAgRlhTWVNfYXNzZXJ0KHVzYWJsZVNpemUgPj0gbkxlbik7CiAKLSAgICB2b2lkKiBwRGF0YSA9IEZYX0FsbG9jKEZYX0JZVEUsIHRvdGFsU2l6ZSk7Ci0gICAgcmV0dXJuIG5ldyAocERhdGEpIFN0cmluZ0RhdGEobkxlbiwgdXNhYmxlU2l6ZSk7CisgIHZvaWQqIHBEYXRhID0gRlhfQWxsb2ModWludDhfdCwgdG90YWxTaXplKTsKKyAgcmV0dXJuIG5ldyAocERhdGEpIFN0cmluZ0RhdGEobkxlbiwgdXNhYmxlU2l6ZSk7CiB9Ci1DRlhfQnl0ZVN0cmluZzo6fkNGWF9CeXRlU3RyaW5nKCkKLXsKLSAgICBpZiAobV9wRGF0YSkgewotICAgICAgICBtX3BEYXRhLT5SZWxlYXNlKCk7Ci0gICAgfQotfQotQ0ZYX0J5dGVTdHJpbmc6OkNGWF9CeXRlU3RyaW5nKEZYX0xQQ1NUUiBscHN6LCBGWF9TVFJTSVpFIG5MZW4pCi17Ci0gICAgaWYgKG5MZW4gPCAwKSB7Ci0gICAgICAgIG5MZW4gPSBscHN6ID8gRlhTWVNfc3RybGVuKGxwc3opIDogMDsKLSAgICB9Ci0gICAgaWYgKG5MZW4pIHsKLSAgICAgICAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuTGVuKTsKLSAgICAgICAgaWYgKG1fcERhdGEpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKG1fcERhdGEtPm1fU3RyaW5nLCBscHN6LCBuTGVuKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcERhdGEgPSBOVUxMOwotICAgIH0KLX0KLUNGWF9CeXRlU3RyaW5nOjpDRlhfQnl0ZVN0cmluZyhGWF9MUENCWVRFIGxwc3osIEZYX1NUUlNJWkUgbkxlbikKLXsKLSAgICBpZiAobkxlbiA+IDApIHsKLSAgICAgICAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuTGVuKTsKLSAgICAgICAgaWYgKG1fcERhdGEpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKG1fcERhdGEtPm1fU3RyaW5nLCBscHN6LCBuTGVuKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcERhdGEgPSBOVUxMOwotICAgIH0KLX0KLUNGWF9CeXRlU3RyaW5nOjpDRlhfQnl0ZVN0cmluZyhjaGFyIGNoKQotewotICAgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUoMSk7Ci0gICAgaWYgKG1fcERhdGEpIHsKLSAgICAgICAgbV9wRGF0YS0+bV9TdHJpbmdbMF0gPSBjaDsKLSAgICB9Ci19Ci1DRlhfQnl0ZVN0cmluZzo6Q0ZYX0J5dGVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZ1NyYykKLXsKLSAgICBpZiAoc3RyaW5nU3JjLm1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICBtX3BEYXRhID0gTlVMTDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoc3RyaW5nU3JjLm1fcERhdGEtPm1fblJlZnMgPj0gMCkgewotICAgICAgICBtX3BEYXRhID0gc3RyaW5nU3JjLm1fcERhdGE7Ci0gICAgICAgIG1fcERhdGEtPlJldGFpbigpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcERhdGEgPSBOVUxMOwotICAgICAgICAqdGhpcyA9IHN0cmluZ1NyYzsKLSAgICB9Ci19Ci1DRlhfQnl0ZVN0cmluZzo6Q0ZYX0J5dGVTdHJpbmcoRlhfQlNUUiBzdHJpbmdTcmMpCi17Ci0gICAgaWYgKHN0cmluZ1NyYy5Jc0VtcHR5KCkpIHsKLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgewotICAgICAgICBtX3BEYXRhID0gTlVMTDsKLSAgICAgICAgKnRoaXMgPSBzdHJpbmdTcmM7Ci0gICAgfQotfQotQ0ZYX0J5dGVTdHJpbmc6OkNGWF9CeXRlU3RyaW5nKEZYX0JTVFIgc3RyMSwgRlhfQlNUUiBzdHIyKQotewotICAgIG1fcERhdGEgPSBOVUxMOwotICAgIGludCBuTmV3TGVuID0gc3RyMS5HZXRMZW5ndGgoKSArIHN0cjIuR2V0TGVuZ3RoKCk7Ci0gICAgaWYgKG5OZXdMZW4gPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobk5ld0xlbik7Ci0gICAgaWYgKG1fcERhdGEpIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5MzIobV9wRGF0YS0+bV9TdHJpbmcsIHN0cjEuR2V0Q1N0cigpLCBzdHIxLkdldExlbmd0aCgpKTsKLSAgICAgICAgRlhTWVNfbWVtY3B5MzIobV9wRGF0YS0+bV9TdHJpbmcgKyBzdHIxLkdldExlbmd0aCgpLCBzdHIyLkdldENTdHIoKSwgc3RyMi5HZXRMZW5ndGgoKSk7Ci0gICAgfQotfQotY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIENGWF9CeXRlU3RyaW5nOjpvcGVyYXRvcj0oRlhfTFBDU1RSIGxwc3opCi17Ci0gICAgaWYgKGxwc3ogPT0gTlVMTCB8fCBscHN6WzBdID09IDApIHsKLSAgICAgICAgRW1wdHkoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBc3NpZ25Db3B5KEZYU1lTX3N0cmxlbihscHN6KSwgbHBzeik7Ci0gICAgfQotICAgIHJldHVybiAqdGhpczsKLX0KLWNvbnN0IENGWF9CeXRlU3RyaW5nJiBDRlhfQnl0ZVN0cmluZzo6b3BlcmF0b3I9KEZYX0JTVFIgc3RyKQotewotICAgIGlmIChzdHIuSXNFbXB0eSgpKSB7Ci0gICAgICAgIEVtcHR5KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQXNzaWduQ29weShzdHIuR2V0TGVuZ3RoKCksIHN0ci5HZXRDU3RyKCkpOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci19Ci1jb25zdCBDRlhfQnl0ZVN0cmluZyYgQ0ZYX0J5dGVTdHJpbmc6Om9wZXJhdG9yPShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nU3JjKQotewotICAgIGlmIChtX3BEYXRhID09IHN0cmluZ1NyYy5tX3BEYXRhKSB7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0gICAgaWYgKHN0cmluZ1NyYy5Jc0VtcHR5KCkpIHsKLSAgICAgICAgRW1wdHkoKTsKLSAgICB9IGVsc2UgaWYgKChtX3BEYXRhICYmIG1fcERhdGEtPm1fblJlZnMgPCAwKSB8fAotICAgICAgICAgICAgICAgKHN0cmluZ1NyYy5tX3BEYXRhICYmIHN0cmluZ1NyYy5tX3BEYXRhLT5tX25SZWZzIDwgMCkpIHsKLSAgICAgICAgQXNzaWduQ29weShzdHJpbmdTcmMubV9wRGF0YS0+bV9uRGF0YUxlbmd0aCwgc3RyaW5nU3JjLm1fcERhdGEtPm1fU3RyaW5nKTsKLSAgICB9IGVsc2UgewotICAgICAgICBFbXB0eSgpOwotICAgICAgICBtX3BEYXRhID0gc3RyaW5nU3JjLm1fcERhdGE7Ci0gICAgICAgIGlmIChtX3BEYXRhKSB7Ci0gICAgICAgICAgICBtX3BEYXRhLT5SZXRhaW4oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci19Ci1jb25zdCBDRlhfQnl0ZVN0cmluZyYgQ0ZYX0J5dGVTdHJpbmc6Om9wZXJhdG9yPShjb25zdCBDRlhfQmluYXJ5QnVmJiBidWYpCi17Ci0gICAgTG9hZChidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRTaXplKCkpOwotICAgIHJldHVybiAqdGhpczsKLX0KLXZvaWQgQ0ZYX0J5dGVTdHJpbmc6OkxvYWQoRlhfTFBDQllURSBidWYsIEZYX1NUUlNJWkUgbGVuKQotewotICAgIEVtcHR5KCk7Ci0gICAgaWYgKGxlbikgewotICAgICAgICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKGxlbik7Ci0gICAgICAgIGlmIChtX3BEYXRhKSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkzMihtX3BEYXRhLT5tX1N0cmluZywgYnVmLCBsZW4pOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7Ci0gICAgfQotfQotY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIENGWF9CeXRlU3RyaW5nOjpvcGVyYXRvcis9KEZYX0xQQ1NUUiBscHN6KQotewotICAgIGlmIChscHN6KSB7Ci0gICAgICAgIENvbmNhdEluUGxhY2UoRlhTWVNfc3RybGVuKGxwc3opLCBscHN6KTsKLSAgICB9Ci0gICAgcmV0dXJuICp0aGlzOwotfQotY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIENGWF9CeXRlU3RyaW5nOjpvcGVyYXRvcis9KGNoYXIgY2gpCi17Ci0gICAgQ29uY2F0SW5QbGFjZSgxLCAmY2gpOwotICAgIHJldHVybiAqdGhpczsKLX0KLWNvbnN0IENGWF9CeXRlU3RyaW5nJiBDRlhfQnl0ZVN0cmluZzo6b3BlcmF0b3IrPShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKQotewotICAgIGlmIChzdHJpbmcubV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0gICAgQ29uY2F0SW5QbGFjZShzdHJpbmcubV9wRGF0YS0+bV9uRGF0YUxlbmd0aCwgc3RyaW5nLm1fcERhdGEtPm1fU3RyaW5nKTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci1jb25zdCBDRlhfQnl0ZVN0cmluZyYgQ0ZYX0J5dGVTdHJpbmc6Om9wZXJhdG9yKz0oRlhfQlNUUiBzdHJpbmcpCi17Ci0gICAgaWYgKHN0cmluZy5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgICBDb25jYXRJblBsYWNlKHN0cmluZy5HZXRMZW5ndGgoKSwgc3RyaW5nLkdldENTdHIoKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotYm9vbCBDRlhfQnl0ZVN0cmluZzo6RXF1YWwoY29uc3QgY2hhciogcHRyKSBjb25zdAotewotICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICByZXR1cm4gIXB0ciB8fCBwdHJbMF0gPT0gJ1wwJzsKLSAgICB9Ci0gICAgaWYgKCFwdHIpIHsKLSAgICAgICAgcmV0dXJuIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPT0gMDsKLSAgICB9Ci0gICAgcmV0dXJuIEZYU1lTX3N0cmxlbihwdHIpID09IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggJiYKLSAgICAgICAgRlhTWVNfbWVtY21wMzIocHRyLCBtX3BEYXRhLT5tX1N0cmluZywgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgPT0gMDsKLX0KLWJvb2wgQ0ZYX0J5dGVTdHJpbmc6OkVxdWFsKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSBjb25zdAotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIHN0ci5Jc0VtcHR5KCk7Ci0gICAgfQotICAgIHJldHVybiBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID09IHN0ci5HZXRMZW5ndGgoKSAmJgotICAgICAgICBGWFNZU19tZW1jbXAzMihtX3BEYXRhLT5tX1N0cmluZywgc3RyLkdldENTdHIoKSwgc3RyLkdldExlbmd0aCgpKSA9PSAwOwotfQotYm9vbCBDRlhfQnl0ZVN0cmluZzo6RXF1YWwoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG90aGVyKSBjb25zdAotewotICAgIGlmIChJc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIG90aGVyLklzRW1wdHkoKTsKLSAgICB9Ci0gICAgaWYgKG90aGVyLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBvdGhlci5tX3BEYXRhLT5tX25EYXRhTGVuZ3RoID09IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggJiYKLSAgICAgICAgRlhTWVNfbWVtY21wMzIob3RoZXIubV9wRGF0YS0+bV9TdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgIG1fcERhdGEtPm1fU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKSA9PSAwOwotfQotdm9pZCBDRlhfQnl0ZVN0cmluZzo6RW1wdHkoKQotewotICAgIGlmIChtX3BEYXRhKSB7Ci0gICAgICAgIG1fcERhdGEtPlJlbGVhc2UoKTsKLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7Ci0gICAgfQotfQotYm9vbCBDRlhfQnl0ZVN0cmluZzo6RXF1YWxOb0Nhc2UoRlhfQlNUUiBzdHIpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gc3RyLklzRW1wdHkoKTsKLSAgICB9Ci0gICAgRlhfU1RSU0laRSBsZW4gPSBzdHIuR2V0TGVuZ3RoKCk7Ci0gICAgaWYgKG1fcERhdGEtPm1fbkRhdGFMZW5ndGggIT0gbGVuKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgRlhfTFBDQllURSBwVGhpcyA9IChGWF9MUENCWVRFKW1fcERhdGEtPm1fU3RyaW5nOwotICAgIEZYX0xQQ0JZVEUgcFRoYXQgPSBzdHIuR2V0UHRyKCk7Ci0gICAgZm9yIChGWF9TVFJTSVpFIGkgPSAwOyBpIDwgbGVuOyBpICsrKSB7Ci0gICAgICAgIGlmICgoKnBUaGlzKSAhPSAoKnBUaGF0KSkgewotICAgICAgICAgICAgRlhfQllURSBiVGhpcyA9ICpwVGhpczsKLSAgICAgICAgICAgIGlmIChiVGhpcyA+PSAnQScgJiYgYlRoaXMgPD0gJ1onKSB7Ci0gICAgICAgICAgICAgICAgYlRoaXMgKz0gJ2EnIC0gJ0EnOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfQllURSBiVGhhdCA9ICpwVGhhdDsKLSAgICAgICAgICAgIGlmIChiVGhhdCA+PSAnQScgJiYgYlRoYXQgPD0gJ1onKSB7Ci0gICAgICAgICAgICAgICAgYlRoYXQgKz0gJ2EnIC0gJ0EnOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJUaGlzICE9IGJUaGF0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBUaGlzICsrOwotICAgICAgICBwVGhhdCArKzsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci12b2lkIENGWF9CeXRlU3RyaW5nOjpBc3NpZ25Db3B5KEZYX1NUUlNJWkUgblNyY0xlbiwgRlhfTFBDU1RSIGxwc3pTcmNEYXRhKQotewotICAgIEFsbG9jQmVmb3JlV3JpdGUoblNyY0xlbik7Ci0gICAgRlhTWVNfbWVtY3B5MzIobV9wRGF0YS0+bV9TdHJpbmcsIGxwc3pTcmNEYXRhLCBuU3JjTGVuKTsKLSAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gblNyY0xlbjsKLSAgICBtX3BEYXRhLT5tX1N0cmluZ1tuU3JjTGVuXSA9IDA7Ci19Ci12b2lkIENGWF9CeXRlU3RyaW5nOjpDb3B5QmVmb3JlV3JpdGUoKQotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwgfHwgbV9wRGF0YS0+bV9uUmVmcyA8PSAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgU3RyaW5nRGF0YSogcERhdGEgPSBtX3BEYXRhOworQ0ZYX0J5dGVTdHJpbmc6On5DRlhfQnl0ZVN0cmluZygpIHsKKyAgaWYgKG1fcERhdGEpIHsKICAgICBtX3BEYXRhLT5SZWxlYXNlKCk7Ci0gICAgRlhfU1RSU0laRSBuRGF0YUxlbmd0aCA9IHBEYXRhLT5tX25EYXRhTGVuZ3RoOwotICAgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobkRhdGFMZW5ndGgpOwotICAgIGlmIChtX3BEYXRhICE9IE5VTEwpIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5MzIobV9wRGF0YS0+bV9TdHJpbmcsIHBEYXRhLT5tX1N0cmluZywgbkRhdGFMZW5ndGggKyAxKTsKLSAgICB9CisgIH0KIH0KLXZvaWQgQ0ZYX0J5dGVTdHJpbmc6OkFsbG9jQmVmb3JlV3JpdGUoRlhfU1RSU0laRSBuTGVuKQotewotICAgIGlmIChtX3BEYXRhICYmIG1fcERhdGEtPm1fblJlZnMgPD0gMSAmJiBtX3BEYXRhLT5tX25BbGxvY0xlbmd0aCA+PSBuTGVuKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRW1wdHkoKTsKK0NGWF9CeXRlU3RyaW5nOjpDRlhfQnl0ZVN0cmluZyhjb25zdCBGWF9DSEFSKiBscHN6LCBGWF9TVFJTSVpFIG5MZW4pIHsKKyAgaWYgKG5MZW4gPCAwKSB7CisgICAgbkxlbiA9IGxwc3ogPyBGWFNZU19zdHJsZW4obHBzeikgOiAwOworICB9CisgIGlmIChuTGVuKSB7CiAgICAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuTGVuKTsKKyAgICBpZiAobV9wRGF0YSkgeworICAgICAgRlhTWVNfbWVtY3B5KG1fcERhdGEtPm1fU3RyaW5nLCBscHN6LCBuTGVuKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbV9wRGF0YSA9IE5VTEw7CisgIH0KIH0KLXZvaWQgQ0ZYX0J5dGVTdHJpbmc6OlJlbGVhc2VCdWZmZXIoRlhfU1RSU0laRSBuTmV3TGVuZ3RoKQotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOworQ0ZYX0J5dGVTdHJpbmc6OkNGWF9CeXRlU3RyaW5nKGNvbnN0IHVpbnQ4X3QqIGxwc3osIEZYX1NUUlNJWkUgbkxlbikgeworICBpZiAobkxlbiA+IDApIHsKKyAgICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5MZW4pOworICAgIGlmIChtX3BEYXRhKSB7CisgICAgICBGWFNZU19tZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcsIGxwc3osIG5MZW4pOwogICAgIH0KLSAgICBDb3B5QmVmb3JlV3JpdGUoKTsKLSAgICBpZiAobk5ld0xlbmd0aCA9PSAtMSkgewotICAgICAgICBuTmV3TGVuZ3RoID0gRlhTWVNfc3RybGVuKChGWF9MUENTVFIpbV9wRGF0YS0+bV9TdHJpbmcpOwotICAgIH0KLSAgICBpZiAobk5ld0xlbmd0aCA9PSAwKSB7Ci0gICAgICAgIEVtcHR5KCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhTWVNfYXNzZXJ0KG5OZXdMZW5ndGggPD0gbV9wRGF0YS0+bV9uQWxsb2NMZW5ndGgpOwotICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuTmV3TGVuZ3RoOwotICAgIG1fcERhdGEtPm1fU3RyaW5nW25OZXdMZW5ndGhdID0gMDsKKyAgfSBlbHNlIHsKKyAgICBtX3BEYXRhID0gTlVMTDsKKyAgfQogfQotdm9pZCBDRlhfQnl0ZVN0cmluZzo6UmVzZXJ2ZShGWF9TVFJTSVpFIGxlbikKLXsKLSAgICBHZXRCdWZmZXIobGVuKTsKLSAgICBSZWxlYXNlQnVmZmVyKEdldExlbmd0aCgpKTsKK0NGWF9CeXRlU3RyaW5nOjpDRlhfQnl0ZVN0cmluZyhjaGFyIGNoKSB7CisgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUoMSk7CisgIGlmIChtX3BEYXRhKSB7CisgICAgbV9wRGF0YS0+bV9TdHJpbmdbMF0gPSBjaDsKKyAgfQogfQotRlhfTFBTVFIgQ0ZYX0J5dGVTdHJpbmc6OkdldEJ1ZmZlcihGWF9TVFJTSVpFIG5NaW5CdWZMZW5ndGgpCi17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCAmJiBuTWluQnVmTGVuZ3RoID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CitDRlhfQnl0ZVN0cmluZzo6Q0ZYX0J5dGVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZ1NyYykgeworICBpZiAoIXN0cmluZ1NyYy5tX3BEYXRhKSB7CisgICAgbV9wRGF0YSA9IE5VTEw7CisgICAgcmV0dXJuOworICB9CisgIGlmIChzdHJpbmdTcmMubV9wRGF0YS0+bV9uUmVmcyA+PSAwKSB7CisgICAgbV9wRGF0YSA9IHN0cmluZ1NyYy5tX3BEYXRhOworICAgIG1fcERhdGEtPlJldGFpbigpOworICB9IGVsc2UgeworICAgIG1fcERhdGEgPSBOVUxMOworICAgICp0aGlzID0gc3RyaW5nU3JjOworICB9Cit9CitDRlhfQnl0ZVN0cmluZzo6Q0ZYX0J5dGVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHJpbmdTcmMpIHsKKyAgaWYgKHN0cmluZ1NyYy5Jc0VtcHR5KCkpIHsKKyAgICBtX3BEYXRhID0gTlVMTDsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wRGF0YSA9IE5VTEw7CisgICp0aGlzID0gc3RyaW5nU3JjOworfQorQ0ZYX0J5dGVTdHJpbmc6OkNGWF9CeXRlU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cjIpIHsKKyAgbV9wRGF0YSA9IE5VTEw7CisgIGludCBuTmV3TGVuID0gc3RyMS5HZXRMZW5ndGgoKSArIHN0cjIuR2V0TGVuZ3RoKCk7CisgIGlmIChuTmV3TGVuID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuTmV3TGVuKTsKKyAgaWYgKG1fcERhdGEpIHsKKyAgICBGWFNZU19tZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcsIHN0cjEuR2V0Q1N0cigpLCBzdHIxLkdldExlbmd0aCgpKTsKKyAgICBGWFNZU19tZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcgKyBzdHIxLkdldExlbmd0aCgpLCBzdHIyLkdldENTdHIoKSwKKyAgICAgICAgICAgICAgICAgc3RyMi5HZXRMZW5ndGgoKSk7CisgIH0KK30KK2NvbnN0IENGWF9CeXRlU3RyaW5nJiBDRlhfQnl0ZVN0cmluZzo6b3BlcmF0b3I9KGNvbnN0IEZYX0NIQVIqIGxwc3opIHsKKyAgaWYgKCFscHN6IHx8IGxwc3pbMF0gPT0gMCkgeworICAgIEVtcHR5KCk7CisgIH0gZWxzZSB7CisgICAgQXNzaWduQ29weShGWFNZU19zdHJsZW4obHBzeiksIGxwc3opOworICB9CisgIHJldHVybiAqdGhpczsKK30KK2NvbnN0IENGWF9CeXRlU3RyaW5nJiBDRlhfQnl0ZVN0cmluZzo6b3BlcmF0b3I9KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSB7CisgIGlmIChzdHIuSXNFbXB0eSgpKSB7CisgICAgRW1wdHkoKTsKKyAgfSBlbHNlIHsKKyAgICBBc3NpZ25Db3B5KHN0ci5HZXRMZW5ndGgoKSwgc3RyLkdldENTdHIoKSk7CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIENGWF9CeXRlU3RyaW5nOjpvcGVyYXRvcj0oCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZ1NyYykgeworICBpZiAobV9wRGF0YSA9PSBzdHJpbmdTcmMubV9wRGF0YSkgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpZiAoc3RyaW5nU3JjLklzRW1wdHkoKSkgeworICAgIEVtcHR5KCk7CisgIH0gZWxzZSBpZiAoKG1fcERhdGEgJiYgbV9wRGF0YS0+bV9uUmVmcyA8IDApIHx8CisgICAgICAgICAgICAgKHN0cmluZ1NyYy5tX3BEYXRhICYmIHN0cmluZ1NyYy5tX3BEYXRhLT5tX25SZWZzIDwgMCkpIHsKKyAgICBBc3NpZ25Db3B5KHN0cmluZ1NyYy5tX3BEYXRhLT5tX25EYXRhTGVuZ3RoLCBzdHJpbmdTcmMubV9wRGF0YS0+bV9TdHJpbmcpOworICB9IGVsc2UgeworICAgIEVtcHR5KCk7CisgICAgbV9wRGF0YSA9IHN0cmluZ1NyYy5tX3BEYXRhOworICAgIGlmIChtX3BEYXRhKSB7CisgICAgICBtX3BEYXRhLT5SZXRhaW4oKTsKICAgICB9Ci0gICAgaWYgKG1fcERhdGEgJiYgbV9wRGF0YS0+bV9uUmVmcyA8PSAxICYmIG1fcERhdGEtPm1fbkFsbG9jTGVuZ3RoID49IG5NaW5CdWZMZW5ndGgpIHsKLSAgICAgICAgcmV0dXJuIG1fcERhdGEtPm1fU3RyaW5nOworICB9CisgIHJldHVybiAqdGhpczsKK30KK2NvbnN0IENGWF9CeXRlU3RyaW5nJiBDRlhfQnl0ZVN0cmluZzo6b3BlcmF0b3I9KGNvbnN0IENGWF9CaW5hcnlCdWYmIGJ1ZikgeworICBMb2FkKGJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldFNpemUoKSk7CisgIHJldHVybiAqdGhpczsKK30KK3ZvaWQgQ0ZYX0J5dGVTdHJpbmc6OkxvYWQoY29uc3QgdWludDhfdCogYnVmLCBGWF9TVFJTSVpFIGxlbikgeworICBFbXB0eSgpOworICBpZiAobGVuKSB7CisgICAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShsZW4pOworICAgIGlmIChtX3BEYXRhKSB7CisgICAgICBGWFNZU19tZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcsIGJ1ZiwgbGVuKTsKICAgICB9Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5NaW5CdWZMZW5ndGgpOwotICAgICAgICBpZiAoIW1fcERhdGEpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSAwOwotICAgICAgICBtX3BEYXRhLT5tX1N0cmluZ1swXSA9IDA7Ci0gICAgICAgIHJldHVybiBtX3BEYXRhLT5tX1N0cmluZzsKKyAgfSBlbHNlIHsKKyAgICBtX3BEYXRhID0gTlVMTDsKKyAgfQorfQorY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIENGWF9CeXRlU3RyaW5nOjpvcGVyYXRvcis9KGNvbnN0IEZYX0NIQVIqIGxwc3opIHsKKyAgaWYgKGxwc3opIHsKKyAgICBDb25jYXRJblBsYWNlKEZYU1lTX3N0cmxlbihscHN6KSwgbHBzeik7CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIENGWF9CeXRlU3RyaW5nOjpvcGVyYXRvcis9KGNoYXIgY2gpIHsKKyAgQ29uY2F0SW5QbGFjZSgxLCAmY2gpOworICByZXR1cm4gKnRoaXM7Cit9Citjb25zdCBDRlhfQnl0ZVN0cmluZyYgQ0ZYX0J5dGVTdHJpbmc6Om9wZXJhdG9yKz0oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZykgeworICBpZiAoIXN0cmluZy5tX3BEYXRhKSB7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIENvbmNhdEluUGxhY2Uoc3RyaW5nLm1fcERhdGEtPm1fbkRhdGFMZW5ndGgsIHN0cmluZy5tX3BEYXRhLT5tX1N0cmluZyk7CisgIHJldHVybiAqdGhpczsKK30KK2NvbnN0IENGWF9CeXRlU3RyaW5nJiBDRlhfQnl0ZVN0cmluZzo6b3BlcmF0b3IrPSgKKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cmluZykgeworICBpZiAoc3RyaW5nLklzRW1wdHkoKSkgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBDb25jYXRJblBsYWNlKHN0cmluZy5HZXRMZW5ndGgoKSwgc3RyaW5nLkdldENTdHIoKSk7CisgIHJldHVybiAqdGhpczsKK30KK2Jvb2wgQ0ZYX0J5dGVTdHJpbmc6OkVxdWFsKGNvbnN0IGNoYXIqIHB0cikgY29uc3QgeworICBpZiAoIW1fcERhdGEpIHsKKyAgICByZXR1cm4gIXB0ciB8fCBwdHJbMF0gPT0gJ1wwJzsKKyAgfQorICBpZiAoIXB0cikgeworICAgIHJldHVybiBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID09IDA7CisgIH0KKyAgcmV0dXJuIEZYU1lTX3N0cmxlbihwdHIpID09IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggJiYKKyAgICAgICAgIEZYU1lTX21lbWNtcChwdHIsIG1fcERhdGEtPm1fU3RyaW5nLCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKSA9PSAwOworfQorYm9vbCBDRlhfQnl0ZVN0cmluZzo6RXF1YWwoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpIGNvbnN0IHsKKyAgaWYgKCFtX3BEYXRhKSB7CisgICAgcmV0dXJuIHN0ci5Jc0VtcHR5KCk7CisgIH0KKyAgcmV0dXJuIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPT0gc3RyLkdldExlbmd0aCgpICYmCisgICAgICAgICBGWFNZU19tZW1jbXAobV9wRGF0YS0+bV9TdHJpbmcsIHN0ci5HZXRDU3RyKCksIHN0ci5HZXRMZW5ndGgoKSkgPT0gMDsKK30KK2Jvb2wgQ0ZYX0J5dGVTdHJpbmc6OkVxdWFsKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvdGhlcikgY29uc3QgeworICBpZiAoSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIG90aGVyLklzRW1wdHkoKTsKKyAgfQorICBpZiAob3RoZXIuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiBvdGhlci5tX3BEYXRhLT5tX25EYXRhTGVuZ3RoID09IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggJiYKKyAgICAgICAgIEZYU1lTX21lbWNtcChvdGhlci5tX3BEYXRhLT5tX1N0cmluZywgbV9wRGF0YS0+bV9TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgPT0gMDsKK30KK3ZvaWQgQ0ZYX0J5dGVTdHJpbmc6OkVtcHR5KCkgeworICBpZiAobV9wRGF0YSkgeworICAgIG1fcERhdGEtPlJlbGVhc2UoKTsKKyAgICBtX3BEYXRhID0gTlVMTDsKKyAgfQorfQorYm9vbCBDRlhfQnl0ZVN0cmluZzo6RXF1YWxOb0Nhc2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpIGNvbnN0IHsKKyAgaWYgKCFtX3BEYXRhKSB7CisgICAgcmV0dXJuIHN0ci5Jc0VtcHR5KCk7CisgIH0KKyAgRlhfU1RSU0laRSBsZW4gPSBzdHIuR2V0TGVuZ3RoKCk7CisgIGlmIChtX3BEYXRhLT5tX25EYXRhTGVuZ3RoICE9IGxlbikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCB1aW50OF90KiBwVGhpcyA9IChjb25zdCB1aW50OF90KiltX3BEYXRhLT5tX1N0cmluZzsKKyAgY29uc3QgdWludDhfdCogcFRoYXQgPSBzdHIuR2V0UHRyKCk7CisgIGZvciAoRlhfU1RSU0laRSBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgaWYgKCgqcFRoaXMpICE9ICgqcFRoYXQpKSB7CisgICAgICB1aW50OF90IGJUaGlzID0gKnBUaGlzOworICAgICAgaWYgKGJUaGlzID49ICdBJyAmJiBiVGhpcyA8PSAnWicpIHsKKyAgICAgICAgYlRoaXMgKz0gJ2EnIC0gJ0EnOworICAgICAgfQorICAgICAgdWludDhfdCBiVGhhdCA9ICpwVGhhdDsKKyAgICAgIGlmIChiVGhhdCA+PSAnQScgJiYgYlRoYXQgPD0gJ1onKSB7CisgICAgICAgIGJUaGF0ICs9ICdhJyAtICdBJzsKKyAgICAgIH0KKyAgICAgIGlmIChiVGhpcyAhPSBiVGhhdCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CiAgICAgfQotICAgIFN0cmluZ0RhdGEqIHBPbGREYXRhID0gbV9wRGF0YTsKLSAgICBGWF9TVFJTSVpFIG5PbGRMZW4gPSBwT2xkRGF0YS0+bV9uRGF0YUxlbmd0aDsKLSAgICBpZiAobk1pbkJ1Zkxlbmd0aCA8IG5PbGRMZW4pIHsKLSAgICAgICAgbk1pbkJ1Zkxlbmd0aCA9IG5PbGRMZW47Ci0gICAgfQorICAgIHBUaGlzKys7CisgICAgcFRoYXQrKzsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KK3ZvaWQgQ0ZYX0J5dGVTdHJpbmc6OkFzc2lnbkNvcHkoRlhfU1RSU0laRSBuU3JjTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBscHN6U3JjRGF0YSkgeworICBBbGxvY0JlZm9yZVdyaXRlKG5TcmNMZW4pOworICBGWFNZU19tZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcsIGxwc3pTcmNEYXRhLCBuU3JjTGVuKTsKKyAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IG5TcmNMZW47CisgIG1fcERhdGEtPm1fU3RyaW5nW25TcmNMZW5dID0gMDsKK30KK3ZvaWQgQ0ZYX0J5dGVTdHJpbmc6OkNvcHlCZWZvcmVXcml0ZSgpIHsKKyAgaWYgKCFtX3BEYXRhIHx8IG1fcERhdGEtPm1fblJlZnMgPD0gMSkgeworICAgIHJldHVybjsKKyAgfQorICBTdHJpbmdEYXRhKiBwRGF0YSA9IG1fcERhdGE7CisgIG1fcERhdGEtPlJlbGVhc2UoKTsKKyAgRlhfU1RSU0laRSBuRGF0YUxlbmd0aCA9IHBEYXRhLT5tX25EYXRhTGVuZ3RoOworICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5EYXRhTGVuZ3RoKTsKKyAgaWYgKG1fcERhdGEpIHsKKyAgICBGWFNZU19tZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcsIHBEYXRhLT5tX1N0cmluZywgbkRhdGFMZW5ndGggKyAxKTsKKyAgfQorfQordm9pZCBDRlhfQnl0ZVN0cmluZzo6QWxsb2NCZWZvcmVXcml0ZShGWF9TVFJTSVpFIG5MZW4pIHsKKyAgaWYgKG1fcERhdGEgJiYgbV9wRGF0YS0+bV9uUmVmcyA8PSAxICYmIG1fcERhdGEtPm1fbkFsbG9jTGVuZ3RoID49IG5MZW4pIHsKKyAgICByZXR1cm47CisgIH0KKyAgRW1wdHkoKTsKKyAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuTGVuKTsKK30KK3ZvaWQgQ0ZYX0J5dGVTdHJpbmc6OlJlbGVhc2VCdWZmZXIoRlhfU1RSU0laRSBuTmV3TGVuZ3RoKSB7CisgIGlmICghbV9wRGF0YSkgeworICAgIHJldHVybjsKKyAgfQorICBDb3B5QmVmb3JlV3JpdGUoKTsKKyAgaWYgKG5OZXdMZW5ndGggPT0gLTEpIHsKKyAgICBuTmV3TGVuZ3RoID0gRlhTWVNfc3RybGVuKChjb25zdCBGWF9DSEFSKiltX3BEYXRhLT5tX1N0cmluZyk7CisgIH0KKyAgaWYgKG5OZXdMZW5ndGggPT0gMCkgeworICAgIEVtcHR5KCk7CisgICAgcmV0dXJuOworICB9CisgIEZYU1lTX2Fzc2VydChuTmV3TGVuZ3RoIDw9IG1fcERhdGEtPm1fbkFsbG9jTGVuZ3RoKTsKKyAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IG5OZXdMZW5ndGg7CisgIG1fcERhdGEtPm1fU3RyaW5nW25OZXdMZW5ndGhdID0gMDsKK30KK3ZvaWQgQ0ZYX0J5dGVTdHJpbmc6OlJlc2VydmUoRlhfU1RSU0laRSBsZW4pIHsKKyAgR2V0QnVmZmVyKGxlbik7CisgIFJlbGVhc2VCdWZmZXIoR2V0TGVuZ3RoKCkpOworfQorRlhfQ0hBUiogQ0ZYX0J5dGVTdHJpbmc6OkdldEJ1ZmZlcihGWF9TVFJTSVpFIG5NaW5CdWZMZW5ndGgpIHsKKyAgaWYgKCFtX3BEYXRhICYmIG5NaW5CdWZMZW5ndGggPT0gMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChtX3BEYXRhICYmIG1fcERhdGEtPm1fblJlZnMgPD0gMSAmJgorICAgICAgbV9wRGF0YS0+bV9uQWxsb2NMZW5ndGggPj0gbk1pbkJ1Zkxlbmd0aCkgeworICAgIHJldHVybiBtX3BEYXRhLT5tX1N0cmluZzsKKyAgfQorICBpZiAoIW1fcERhdGEpIHsKICAgICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5NaW5CdWZMZW5ndGgpOwogICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBGWFNZU19tZW1jcHkzMihtX3BEYXRhLT5tX1N0cmluZywgcE9sZERhdGEtPm1fU3RyaW5nLCAobk9sZExlbiArIDEpKTsKLSAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gbk9sZExlbjsKLSAgICBwT2xkRGF0YS0+UmVsZWFzZSgpOworICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSAwOworICAgIG1fcERhdGEtPm1fU3RyaW5nWzBdID0gMDsKICAgICByZXR1cm4gbV9wRGF0YS0+bV9TdHJpbmc7Ci19Ci1GWF9TVFJTSVpFIENGWF9CeXRlU3RyaW5nOjpEZWxldGUoRlhfU1RSU0laRSBuSW5kZXgsIEZYX1NUUlNJWkUgbkNvdW50KQotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChuSW5kZXggPCAwKSB7Ci0gICAgICAgIG5JbmRleCA9IDA7Ci0gICAgfQotICAgIEZYX1NUUlNJWkUgbk9sZExlbmd0aCA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7Ci0gICAgaWYgKG5Db3VudCA+IDAgJiYgbkluZGV4IDwgbk9sZExlbmd0aCkgewotICAgICAgICBGWF9TVFJTSVpFIG1MZW5ndGggPSBuSW5kZXggKyBuQ291bnQ7Ci0gICAgICAgIGlmIChtTGVuZ3RoID49IG5PbGRMZW5ndGgpIHsKLSAgICAgICAgICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuSW5kZXg7Ci0gICAgICAgICAgICByZXR1cm4gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKLSAgICAgICAgfQotICAgICAgICBDb3B5QmVmb3JlV3JpdGUoKTsKLSAgICAgICAgaW50IG5CeXRlc1RvQ29weSA9IG5PbGRMZW5ndGggLSBtTGVuZ3RoICsgMTsKLSAgICAgICAgRlhTWVNfbWVtbW92ZTMyKG1fcERhdGEtPm1fU3RyaW5nICsgbkluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgbV9wRGF0YS0+bV9TdHJpbmcgKyBtTGVuZ3RoLCBuQnl0ZXNUb0NvcHkpOwotICAgICAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gbk9sZExlbmd0aCAtIG5Db3VudDsKLSAgICB9Ci0gICAgcmV0dXJuIG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7Ci19Ci12b2lkIENGWF9CeXRlU3RyaW5nOjpDb25jYXRJblBsYWNlKEZYX1NUUlNJWkUgblNyY0xlbiwgRlhfTFBDU1RSIGxwc3pTcmNEYXRhKQotewotICAgIGlmIChuU3JjTGVuID09IDAgfHwgbHBzelNyY0RhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuU3JjTGVuKTsKLSAgICAgICAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgRlhTWVNfbWVtY3B5MzIobV9wRGF0YS0+bV9TdHJpbmcsIGxwc3pTcmNEYXRhLCBuU3JjTGVuKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobV9wRGF0YS0+bV9uUmVmcyA+IDEgfHwgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCArIG5TcmNMZW4gPiBtX3BEYXRhLT5tX25BbGxvY0xlbmd0aCkgewotICAgICAgICBDb25jYXRDb3B5KG1fcERhdGEtPm1fbkRhdGFMZW5ndGgsIG1fcERhdGEtPm1fU3RyaW5nLCBuU3JjTGVuLCBscHN6U3JjRGF0YSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5MzIobV9wRGF0YS0+bV9TdHJpbmcgKyBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoLCBscHN6U3JjRGF0YSwgblNyY0xlbik7Ci0gICAgICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggKz0gblNyY0xlbjsKLSAgICAgICAgbV9wRGF0YS0+bV9TdHJpbmdbbV9wRGF0YS0+bV9uRGF0YUxlbmd0aF0gPSAwOwotICAgIH0KLX0KLXZvaWQgQ0ZYX0J5dGVTdHJpbmc6OkNvbmNhdENvcHkoRlhfU1RSU0laRSBuU3JjMUxlbiwgRlhfTFBDU1RSIGxwc3pTcmMxRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSBuU3JjMkxlbiwgRlhfTFBDU1RSIGxwc3pTcmMyRGF0YSkKLXsKLSAgICBpbnQgbk5ld0xlbiA9IG5TcmMxTGVuICsgblNyYzJMZW47Ci0gICAgaWYgKG5OZXdMZW4gPD0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIERvbid0IHJlbGVhc2UgdW50aWwgZG9uZSBjb3B5aW5nLCBtaWdodCBiZSBvbmUgb2YgdGhlIGFyZ3VtZW50cy4KLSAgICBTdHJpbmdEYXRhKiBwT2xkRGF0YSA9IG1fcERhdGE7Ci0gICAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuTmV3TGVuKTsKLSAgICBpZiAobV9wRGF0YSkgewotICAgICAgICBtZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcsIGxwc3pTcmMxRGF0YSwgblNyYzFMZW4pOwotICAgICAgICBtZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcgKyBuU3JjMUxlbiwgbHBzelNyYzJEYXRhLCBuU3JjMkxlbik7Ci0gICAgfQotICAgIHBPbGREYXRhLT5SZWxlYXNlKCk7Ci19Ci1DRlhfQnl0ZVN0cmluZyBDRlhfQnl0ZVN0cmluZzo6TWlkKEZYX1NUUlNJWkUgbkZpcnN0KSBjb25zdAotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBNaWQobkZpcnN0LCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIC0gbkZpcnN0KTsKLX0KLUNGWF9CeXRlU3RyaW5nIENGWF9CeXRlU3RyaW5nOjpNaWQoRlhfU1RSU0laRSBuRmlyc3QsIEZYX1NUUlNJWkUgbkNvdW50KSBjb25zdAotewotICAgIGlmIChuRmlyc3QgPCAwKSB7Ci0gICAgICAgIG5GaXJzdCA9IDA7Ci0gICAgfQotICAgIGlmIChuQ291bnQgPCAwKSB7Ci0gICAgICAgIG5Db3VudCA9IDA7Ci0gICAgfQotICAgIGlmIChuRmlyc3QgKyBuQ291bnQgPiBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKSB7Ci0gICAgICAgIG5Db3VudCA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggLSBuRmlyc3Q7Ci0gICAgfQotICAgIGlmIChuRmlyc3QgPiBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKSB7Ci0gICAgICAgIG5Db3VudCA9IDA7Ci0gICAgfQotICAgIGlmIChuRmlyc3QgPT0gMCAmJiBuRmlyc3QgKyBuQ291bnQgPT0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgewotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGRlc3Q7Ci0gICAgQWxsb2NDb3B5KGRlc3QsIG5Db3VudCwgbkZpcnN0KTsKLSAgICByZXR1cm4gZGVzdDsKLX0KLXZvaWQgQ0ZYX0J5dGVTdHJpbmc6OkFsbG9jQ29weShDRlhfQnl0ZVN0cmluZyYgZGVzdCwgRlhfU1RSU0laRSBuQ29weUxlbiwgRlhfU1RSU0laRSBuQ29weUluZGV4KSBjb25zdAotewotICAgIC8vIHxGWF9TVFJTSVpFfCBpcyBjdXJyZW50bHkgdHlwZWRlZidkIGFzIGluIHxpbnR8LiBUT0RPKHBhbG1lcik6IEl0Ci0gICAgLy8gc2hvdWxkIGJlIGEgfHNpemVfdHwsIG9yIGF0IGxlYXN0IHVuc2lnbmVkLgotICAgIGlmIChuQ29weUxlbiA9PSAwIHx8IG5Db3B5TGVuIDwgMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEFTU0VSVChkZXN0Lm1fcERhdGEgPT0gTlVMTCk7Ci0gICAgZGVzdC5tX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5Db3B5TGVuKTsKLSAgICBpZiAoZGVzdC5tX3BEYXRhKSB7Ci0gICAgICAgIEZYU1lTX21lbWNweTMyKGRlc3QubV9wRGF0YS0+bV9TdHJpbmcsIG1fcERhdGEtPm1fU3RyaW5nICsgbkNvcHlJbmRleCwgbkNvcHlMZW4pOwotICAgIH0KLX0KLSNkZWZpbmUgRk9SQ0VfQU5TSSAgICAgIDB4MTAwMDAKLSNkZWZpbmUgRk9SQ0VfVU5JQ09ERSAgIDB4MjAwMDAKLSNkZWZpbmUgRk9SQ0VfSU5UNjQgICAgIDB4NDAwMDAKLXZvaWQgQ0ZYX0J5dGVTdHJpbmc6OkZvcm1hdFYoRlhfTFBDU1RSIGxwc3pGb3JtYXQsIHZhX2xpc3QgYXJnTGlzdCkKLXsKLSAgICB2YV9saXN0IGFyZ0xpc3RTYXZlOwotI2lmIGRlZmluZWQoX19BUk1DQ19WRVJTSU9OKSB8fCAoIWRlZmluZWQoX01TQ19WRVIpICYmIChfRlhfQ1BVXyA9PSBfRlhfWDY0XyB8fCBfRlhfQ1BVXyA9PSBfRlhfSUE2NF8gfHwgX0ZYX0NQVV8gPT0gX0ZYX0FSTTY0XykpIHx8IGRlZmluZWQoX19uYXRpdmVfY2xpZW50X18pCi0gICAgdmFfY29weShhcmdMaXN0U2F2ZSwgYXJnTGlzdCk7Ci0jZWxzZQotICAgIGFyZ0xpc3RTYXZlID0gYXJnTGlzdDsKLSNlbmRpZgotICAgIGludCBuTWF4TGVuID0gMDsKLSAgICBmb3IgKEZYX0xQQ1NUUiBscHN6ID0gbHBzekZvcm1hdDsgKmxwc3ogIT0gMDsgbHBzeiArKykgewotICAgICAgICBpZiAoKmxwc3ogIT0gJyUnIHx8ICoobHBzeiA9IGxwc3ogKyAxKSA9PSAnJScpIHsKLSAgICAgICAgICAgIG5NYXhMZW4gKz0gRlhTWVNfc3RybGVuKGxwc3opOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IG5JdGVtTGVuID0gMDsKLSAgICAgICAgaW50IG5XaWR0aCA9IDA7Ci0gICAgICAgIGZvciAoOyAqbHBzeiAhPSAwOyBscHN6ICsrKSB7Ci0gICAgICAgICAgICBpZiAoKmxwc3ogPT0gJyMnKSB7Ci0gICAgICAgICAgICAgICAgbk1heExlbiArPSAyOwotICAgICAgICAgICAgfSBlbHNlIGlmICgqbHBzeiA9PSAnKicpIHsKLSAgICAgICAgICAgICAgICBuV2lkdGggPSB2YV9hcmcoYXJnTGlzdCwgaW50KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKmxwc3ogPT0gJy0nIHx8ICpscHN6ID09ICcrJyB8fCAqbHBzeiA9PSAnMCcgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgKmxwc3ogPT0gJyAnKQotICAgICAgICAgICAgICAgIDsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChuV2lkdGggPT0gMCkgewotICAgICAgICAgICAgbldpZHRoID0gRlhTWVNfYXRvaShscHN6KTsKLSAgICAgICAgICAgIGZvciAoOyAoKmxwc3opID49ICcwJyAmJiAoKmxwc3opIDw9ICc5JzsgbHBzeiArKykKLSAgICAgICAgICAgICAgICA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5XaWR0aCA8IDAgfHwgbldpZHRoID4gMTI4ICogMTAyNCkgewotICAgICAgICAgICAgbHBzekZvcm1hdCA9ICJCYWQgd2lkdGgiOwotICAgICAgICAgICAgbk1heExlbiA9IDEwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IG5QcmVjaXNpb24gPSAwOwotICAgICAgICBpZiAoKmxwc3ogPT0gJy4nKSB7Ci0gICAgICAgICAgICBscHN6ICsrOwotICAgICAgICAgICAgaWYgKCpscHN6ID09ICcqJykgewotICAgICAgICAgICAgICAgIG5QcmVjaXNpb24gPSB2YV9hcmcoYXJnTGlzdCwgaW50KTsKLSAgICAgICAgICAgICAgICBscHN6ICsrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuUHJlY2lzaW9uID0gRlhTWVNfYXRvaShscHN6KTsKLSAgICAgICAgICAgICAgICBmb3IgKDsgKCpscHN6KSA+PSAnMCcgJiYgKCpscHN6KSA8PSAnOSc7IGxwc3ogKyspCi0gICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoblByZWNpc2lvbiA8IDAgfHwgblByZWNpc2lvbiA+IDEyOCAqIDEwMjQpIHsKLSAgICAgICAgICAgIGxwc3pGb3JtYXQgPSAiQmFkIHByZWNpc2lvbiI7Ci0gICAgICAgICAgICBuTWF4TGVuID0gMTQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpbnQgbk1vZGlmaWVyID0gMDsKLSAgICAgICAgaWYgKEZYU1lTX3N0cm5jbXAobHBzeiwgIkk2NCIsIDMpID09IDApIHsKLSAgICAgICAgICAgIGxwc3ogKz0gMzsKLSAgICAgICAgICAgIG5Nb2RpZmllciA9IEZPUkNFX0lOVDY0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3dpdGNoICgqbHBzeikgewotICAgICAgICAgICAgICAgIGNhc2UgJ2gnOgotICAgICAgICAgICAgICAgICAgICBuTW9kaWZpZXIgPSBGT1JDRV9BTlNJOwotICAgICAgICAgICAgICAgICAgICBscHN6ICsrOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdsJzoKLSAgICAgICAgICAgICAgICAgICAgbk1vZGlmaWVyID0gRk9SQ0VfVU5JQ09ERTsKLSAgICAgICAgICAgICAgICAgICAgbHBzeiArKzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnRic6Ci0gICAgICAgICAgICAgICAgY2FzZSAnTic6Ci0gICAgICAgICAgICAgICAgY2FzZSAnTCc6Ci0gICAgICAgICAgICAgICAgICAgIGxwc3ogKys7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoKmxwc3ogfCBuTW9kaWZpZXIpIHsKLSAgICAgICAgICAgIGNhc2UgJ2MnOgotICAgICAgICAgICAgY2FzZSAnQyc6Ci0gICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSAyOwotICAgICAgICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnYyd8Rk9SQ0VfQU5TSToKLSAgICAgICAgICAgIGNhc2UgJ0MnfEZPUkNFX0FOU0k6Ci0gICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSAyOwotICAgICAgICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnYyd8Rk9SQ0VfVU5JQ09ERToKLSAgICAgICAgICAgIGNhc2UgJ0MnfEZPUkNFX1VOSUNPREU6Ci0gICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSAyOwotICAgICAgICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAncyc6IHsKLSAgICAgICAgICAgICAgICAgICAgRlhfTFBDU1RSIHBzdHJOZXh0QXJnID0gdmFfYXJnKGFyZ0xpc3QsIEZYX0xQQ1NUUik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwc3RyTmV4dEFyZyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IDY7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IEZYU1lTX3N0cmxlbihwc3RyTmV4dEFyZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobkl0ZW1MZW4gPCAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnUyc6IHsKLSAgICAgICAgICAgICAgICAgICAgRlhfTFBXU1RSIHBzdHJOZXh0QXJnID0gdmFfYXJnKGFyZ0xpc3QsIEZYX0xQV1NUUik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwc3RyTmV4dEFyZyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IDY7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IEZYU1lTX3djc2xlbihwc3RyTmV4dEFyZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobkl0ZW1MZW4gPCAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAncyd8Rk9SQ0VfQU5TSToKLSAgICAgICAgICAgIGNhc2UgJ1MnfEZPUkNFX0FOU0k6IHsKLSAgICAgICAgICAgICAgICAgICAgRlhfTFBDU1RSIHBzdHJOZXh0QXJnID0gdmFfYXJnKGFyZ0xpc3QsIEZYX0xQQ1NUUik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwc3RyTmV4dEFyZyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IDY7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IEZYU1lTX3N0cmxlbihwc3RyTmV4dEFyZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobkl0ZW1MZW4gPCAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAncyd8Rk9SQ0VfVU5JQ09ERToKLSAgICAgICAgICAgIGNhc2UgJ1MnfEZPUkNFX1VOSUNPREU6IHsKLSAgICAgICAgICAgICAgICAgICAgRlhfTFBXU1RSIHBzdHJOZXh0QXJnID0gdmFfYXJnKGFyZ0xpc3QsIEZYX0xQV1NUUik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwc3RyTmV4dEFyZyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IDY7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IEZYU1lTX3djc2xlbihwc3RyTmV4dEFyZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobkl0ZW1MZW4gPCAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuSXRlbUxlbiAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoblByZWNpc2lvbiAhPSAwICYmIG5JdGVtTGVuID4gblByZWNpc2lvbikgewotICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gblByZWNpc2lvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuSXRlbUxlbiA8IG5XaWR0aCkgewotICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gbldpZHRoOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3dpdGNoICgqbHBzeikgewotICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgotICAgICAgICAgICAgICAgIGNhc2UgJ2knOgotICAgICAgICAgICAgICAgIGNhc2UgJ3UnOgotICAgICAgICAgICAgICAgIGNhc2UgJ3gnOgotICAgICAgICAgICAgICAgIGNhc2UgJ1gnOgotICAgICAgICAgICAgICAgIGNhc2UgJ28nOgotICAgICAgICAgICAgICAgICAgICBpZiAobk1vZGlmaWVyICYgRk9SQ0VfSU5UNjQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBGWF9JTlQ2NCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YV9hcmcoYXJnTGlzdCwgaW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IDMyOwotICAgICAgICAgICAgICAgICAgICBpZiAobkl0ZW1MZW4gPCBuV2lkdGggKyBuUHJlY2lzaW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IG5XaWR0aCArIG5QcmVjaXNpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnYSc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnQSc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnZSc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnRSc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnZyc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnRyc6Ci0gICAgICAgICAgICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBkb3VibGUpOwotICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IDEyODsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5JdGVtTGVuIDwgbldpZHRoICsgblByZWNpc2lvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSBuV2lkdGggKyBuUHJlY2lzaW9uOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ2YnOgotICAgICAgICAgICAgICAgICAgICBpZiAobldpZHRoICsgblByZWNpc2lvbiA+IDEwMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSBuUHJlY2lzaW9uICsgbldpZHRoICsgMTI4OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBwc3pUZW1wWzI1Nl07Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZiA9IHZhX2FyZyhhcmdMaXN0LCBkb3VibGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHBzelRlbXAsIDAsIHNpemVvZihwc3pUZW1wKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19zbnByaW50Zihwc3pUZW1wLCBzaXplb2YocHN6VGVtcCkgLSAxLCAiJSouKmYiLCBuV2lkdGgsIG5QcmVjaXNpb24gKyA2LCBmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gRlhTWVNfc3RybGVuKHBzelRlbXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ3AnOgotICAgICAgICAgICAgICAgICAgICB2YV9hcmcoYXJnTGlzdCwgdm9pZCopOwotICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IDMyOwotICAgICAgICAgICAgICAgICAgICBpZiAobkl0ZW1MZW4gPCBuV2lkdGggKyBuUHJlY2lzaW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IG5XaWR0aCArIG5QcmVjaXNpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnbic6Ci0gICAgICAgICAgICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQqKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbk1heExlbiArPSBuSXRlbUxlbjsKLSAgICB9Ci0gICAgbk1heExlbiArPSAzMjsgIC8vIEZ1ZGdlIGZhY3Rvci4KLSAgICBHZXRCdWZmZXIobk1heExlbik7Ci0gICAgaWYgKG1fcERhdGEpIHsKLSAgICAgICAgbWVtc2V0KG1fcERhdGEtPm1fU3RyaW5nLCAwLCBuTWF4TGVuKTsKLSAgICAgICAgRlhTWVNfdnNucHJpbnRmKG1fcERhdGEtPm1fU3RyaW5nLCBuTWF4TGVuIC0gMSwgbHBzekZvcm1hdCwgYXJnTGlzdFNhdmUpOwotICAgICAgICBSZWxlYXNlQnVmZmVyKCk7Ci0gICAgfQotICAgIHZhX2VuZChhcmdMaXN0U2F2ZSk7Ci19Ci12b2lkIENGWF9CeXRlU3RyaW5nOjpGb3JtYXQoRlhfTFBDU1RSIGxwc3pGb3JtYXQsIC4uLikKLXsKLSAgICB2YV9saXN0IGFyZ0xpc3Q7Ci0gICAgdmFfc3RhcnQoYXJnTGlzdCwgbHBzekZvcm1hdCk7Ci0gICAgRm9ybWF0VihscHN6Rm9ybWF0LCBhcmdMaXN0KTsKLSAgICB2YV9lbmQoYXJnTGlzdCk7Ci19Ci1GWF9TVFJTSVpFIENGWF9CeXRlU3RyaW5nOjpJbnNlcnQoRlhfU1RSU0laRSBuSW5kZXgsIEZYX0NIQVIgY2gpCi17Ci0gICAgQ29weUJlZm9yZVdyaXRlKCk7Ci0gICAgaWYgKG5JbmRleCA8IDApIHsKLSAgICAgICAgbkluZGV4ID0gMDsKLSAgICB9Ci0gICAgRlhfU1RSU0laRSBuTmV3TGVuZ3RoID0gbV9wRGF0YSA/IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggOiAwOwotICAgIGlmIChuSW5kZXggPiBuTmV3TGVuZ3RoKSB7Ci0gICAgICAgIG5JbmRleCA9IG5OZXdMZW5ndGg7Ci0gICAgfQotICAgIG5OZXdMZW5ndGgrKzsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMIHx8IG1fcERhdGEtPm1fbkFsbG9jTGVuZ3RoIDwgbk5ld0xlbmd0aCkgewotICAgICAgICBTdHJpbmdEYXRhKiBwT2xkRGF0YSA9IG1fcERhdGE7Ci0gICAgICAgIEZYX0xQQ1NUUiBwc3RyID0gbV9wRGF0YS0+bV9TdHJpbmc7Ci0gICAgICAgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobk5ld0xlbmd0aCk7Ci0gICAgICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYocE9sZERhdGEgIT0gTlVMTCkgewotICAgICAgICAgICAgRlhTWVNfbWVtbW92ZTMyKG1fcERhdGEtPm1fU3RyaW5nLCBwc3RyLCAocE9sZERhdGEtPm1fbkRhdGFMZW5ndGggKyAxKSk7Ci0gICAgICAgICAgICBwT2xkRGF0YS0+UmVsZWFzZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9wRGF0YS0+bV9TdHJpbmdbMF0gPSAwOwotICAgICAgICB9Ci0gICAgfQotICAgIEZYU1lTX21lbW1vdmUzMihtX3BEYXRhLT5tX1N0cmluZyArIG5JbmRleCArIDEsCi0gICAgICAgICAgICAgICAgICAgIG1fcERhdGEtPm1fU3RyaW5nICsgbkluZGV4LCAobk5ld0xlbmd0aCAtIG5JbmRleCkpOwotICAgIG1fcERhdGEtPm1fU3RyaW5nW25JbmRleF0gPSBjaDsKLSAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gbk5ld0xlbmd0aDsKLSAgICByZXR1cm4gbk5ld0xlbmd0aDsKLX0KLUNGWF9CeXRlU3RyaW5nIENGWF9CeXRlU3RyaW5nOjpSaWdodChGWF9TVFJTSVpFIG5Db3VudCkgY29uc3QKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwotICAgIH0KLSAgICBpZiAobkNvdW50IDwgMCkgewotICAgICAgICBuQ291bnQgPSAwOwotICAgIH0KLSAgICBpZiAobkNvdW50ID49IG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpIHsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBkZXN0OwotICAgIEFsbG9jQ29weShkZXN0LCBuQ291bnQsIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggLSBuQ291bnQpOwotICAgIHJldHVybiBkZXN0OwotfQotQ0ZYX0J5dGVTdHJpbmcgQ0ZYX0J5dGVTdHJpbmc6OkxlZnQoRlhfU1RSU0laRSBuQ291bnQpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKLSAgICB9Ci0gICAgaWYgKG5Db3VudCA8IDApIHsKLSAgICAgICAgbkNvdW50ID0gMDsKLSAgICB9Ci0gICAgaWYgKG5Db3VudCA+PSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKSB7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgZGVzdDsKLSAgICBBbGxvY0NvcHkoZGVzdCwgbkNvdW50LCAwKTsKLSAgICByZXR1cm4gZGVzdDsKLX0KLUZYX1NUUlNJWkUgQ0ZYX0J5dGVTdHJpbmc6OkZpbmQoRlhfQ0hBUiBjaCwgRlhfU1RSU0laRSBuU3RhcnQpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIEZYX1NUUlNJWkUgbkxlbmd0aCA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7Ci0gICAgaWYgKG5TdGFydCA+PSBuTGVuZ3RoKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgRlhfTFBDU1RSIGxwc3ogPSBGWFNZU19zdHJjaHIobV9wRGF0YS0+bV9TdHJpbmcgKyBuU3RhcnQsIGNoKTsKLSAgICByZXR1cm4gKGxwc3ogPT0gTlVMTCkgPyAtMSA6IChpbnQpKGxwc3ogLSBtX3BEYXRhLT5tX1N0cmluZyk7Ci19Ci1GWF9TVFJTSVpFIENGWF9CeXRlU3RyaW5nOjpSZXZlcnNlRmluZChGWF9DSEFSIGNoKSBjb25zdAotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBGWF9TVFJTSVpFIG5MZW5ndGggPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOwotICAgIHdoaWxlIChuTGVuZ3RoKSB7Ci0gICAgICAgIGlmIChtX3BEYXRhLT5tX1N0cmluZ1tuTGVuZ3RoIC0gMV0gPT0gY2gpIHsKLSAgICAgICAgICAgIHJldHVybiBuTGVuZ3RoIC0gMTsKLSAgICAgICAgfQotICAgICAgICBuTGVuZ3RoIC0tOwotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci1GWF9MUENTVFIgRlhfc3Ryc3RyKEZYX0xQQ1NUUiBzdHIxLCBpbnQgbGVuMSwgRlhfTFBDU1RSIHN0cjIsIGludCBsZW4yKQotewotICAgIGlmIChsZW4yID4gbGVuMSB8fCBsZW4yID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYX0xQQ1NUUiBlbmRfcHRyID0gc3RyMSArIGxlbjEgLSBsZW4yOwotICAgIHdoaWxlIChzdHIxIDw9IGVuZF9wdHIpIHsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgaWYgKHN0cjFbaV0gIT0gc3RyMltpXSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaSArKzsKLSAgICAgICAgICAgIGlmIChpID09IGxlbjIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RyMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzdHIxICsrOwotICAgIH0KKyAgfQorICBTdHJpbmdEYXRhKiBwT2xkRGF0YSA9IG1fcERhdGE7CisgIEZYX1NUUlNJWkUgbk9sZExlbiA9IHBPbGREYXRhLT5tX25EYXRhTGVuZ3RoOworICBpZiAobk1pbkJ1Zkxlbmd0aCA8IG5PbGRMZW4pIHsKKyAgICBuTWluQnVmTGVuZ3RoID0gbk9sZExlbjsKKyAgfQorICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5NaW5CdWZMZW5ndGgpOworICBpZiAoIW1fcERhdGEpIHsKICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBGWFNZU19tZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcsIHBPbGREYXRhLT5tX1N0cmluZywgKG5PbGRMZW4gKyAxKSk7CisgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuT2xkTGVuOworICBwT2xkRGF0YS0+UmVsZWFzZSgpOworICByZXR1cm4gbV9wRGF0YS0+bV9TdHJpbmc7CiB9Ci1GWF9TVFJTSVpFIENGWF9CeXRlU3RyaW5nOjpGaW5kKEZYX0JTVFIgbHBzelN1YiwgRlhfU1RSU0laRSBuU3RhcnQpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIEZYX1NUUlNJWkUgbkxlbmd0aCA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7Ci0gICAgaWYgKG5TdGFydCA+IG5MZW5ndGgpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBGWF9MUENTVFIgbHBzeiA9IEZYX3N0cnN0cihtX3BEYXRhLT5tX1N0cmluZyArIG5TdGFydCwgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAtIG5TdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscHN6U3ViLkdldENTdHIoKSwgbHBzelN1Yi5HZXRMZW5ndGgoKSk7Ci0gICAgcmV0dXJuIChscHN6ID09IE5VTEwpID8gLTEgOiAoaW50KShscHN6IC0gbV9wRGF0YS0+bV9TdHJpbmcpOwotfQotdm9pZCBDRlhfQnl0ZVN0cmluZzo6TWFrZUxvd2VyKCkKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ29weUJlZm9yZVdyaXRlKCk7Ci0gICAgaWYgKEdldExlbmd0aCgpIDwgMSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYU1lTX3N0cmx3cihtX3BEYXRhLT5tX1N0cmluZyk7Ci19Ci12b2lkIENGWF9CeXRlU3RyaW5nOjpNYWtlVXBwZXIoKQotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDb3B5QmVmb3JlV3JpdGUoKTsKLSAgICBpZiAoR2V0TGVuZ3RoKCkgPCAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhTWVNfc3RydXByKG1fcERhdGEtPm1fU3RyaW5nKTsKLX0KLUZYX1NUUlNJWkUgQ0ZYX0J5dGVTdHJpbmc6OlJlbW92ZShGWF9DSEFSIGNoUmVtb3ZlKQotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENvcHlCZWZvcmVXcml0ZSgpOwotICAgIGlmIChHZXRMZW5ndGgoKSA8IDEpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIEZYX0xQU1RSIHBzdHJTb3VyY2UgPSBtX3BEYXRhLT5tX1N0cmluZzsKLSAgICBGWF9MUFNUUiBwc3RyRGVzdCA9IG1fcERhdGEtPm1fU3RyaW5nOwotICAgIEZYX0xQU1RSIHBzdHJFbmQgPSBtX3BEYXRhLT5tX1N0cmluZyArIG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7Ci0gICAgd2hpbGUgKHBzdHJTb3VyY2UgPCBwc3RyRW5kKSB7Ci0gICAgICAgIGlmICgqcHN0clNvdXJjZSAhPSBjaFJlbW92ZSkgewotICAgICAgICAgICAgKnBzdHJEZXN0ID0gKnBzdHJTb3VyY2U7Ci0gICAgICAgICAgICBwc3RyRGVzdCArKzsKLSAgICAgICAgfQotICAgICAgICBwc3RyU291cmNlICsrOwotICAgIH0KLSAgICAqcHN0ckRlc3QgPSAwOwotICAgIEZYX1NUUlNJWkUgbkNvdW50ID0gKEZYX1NUUlNJWkUpKHBzdHJTb3VyY2UgLSBwc3RyRGVzdCk7Ci0gICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAtPSBuQ291bnQ7Ci0gICAgcmV0dXJuIG5Db3VudDsKLX0KLUZYX1NUUlNJWkUgQ0ZYX0J5dGVTdHJpbmc6OlJlcGxhY2UoRlhfQlNUUiBscHN6T2xkLCBGWF9CU1RSIGxwc3pOZXcpCi17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGxwc3pPbGQuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBGWF9TVFJTSVpFIG5Tb3VyY2VMZW4gPSBscHN6T2xkLkdldExlbmd0aCgpOwotICAgIEZYX1NUUlNJWkUgblJlcGxhY2VtZW50TGVuID0gbHBzek5ldy5HZXRMZW5ndGgoKTsKLSAgICBGWF9TVFJTSVpFIG5Db3VudCA9IDA7Ci0gICAgRlhfTFBDU1RSIHBTdGFydCA9IG1fcERhdGEtPm1fU3RyaW5nOwotICAgIEZYX0xQU1RSIHBFbmQgPSBtX3BEYXRhLT5tX1N0cmluZyArIG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgRlhfTFBDU1RSIHBUYXJnZXQgPSBGWF9zdHJzdHIocFN0YXJ0LCAoRlhfU1RSU0laRSkocEVuZCAtIHBTdGFydCksIGxwc3pPbGQuR2V0Q1N0cigpLCBuU291cmNlTGVuKTsKLSAgICAgICAgaWYgKHBUYXJnZXQgPT0gTlVMTCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbkNvdW50Kys7Ci0gICAgICAgIHBTdGFydCA9IHBUYXJnZXQgKyBuU291cmNlTGVuOwotICAgIH0KLSAgICBpZiAobkNvdW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIEZYX1NUUlNJWkUgbk5ld0xlbmd0aCA9ICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoICsgKG5SZXBsYWNlbWVudExlbiAtIG5Tb3VyY2VMZW4pICogbkNvdW50OwotICAgIGlmIChuTmV3TGVuZ3RoID09IDApIHsKLSAgICAgICAgRW1wdHkoKTsKLSAgICAgICAgcmV0dXJuIG5Db3VudDsKLSAgICB9Ci0gICAgU3RyaW5nRGF0YSogcE5ld0RhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobk5ld0xlbmd0aCk7Ci0gICAgaWYgKCFwTmV3RGF0YSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcFN0YXJ0ID0gbV9wRGF0YS0+bV9TdHJpbmc7Ci0gICAgRlhfTFBTVFIgcERlc3QgPSBwTmV3RGF0YS0+bV9TdHJpbmc7Ci0gICAgZm9yIChGWF9TVFJTSVpFIGkgPSAwOyBpIDwgbkNvdW50OyBpICsrKSB7Ci0gICAgICAgIEZYX0xQQ1NUUiBwVGFyZ2V0ID0gRlhfc3Ryc3RyKHBTdGFydCwgKEZYX1NUUlNJWkUpKHBFbmQgLSBwU3RhcnQpLCBscHN6T2xkLkdldENTdHIoKSwgblNvdXJjZUxlbik7Ci0gICAgICAgIEZYU1lTX21lbWNweTMyKHBEZXN0LCBwU3RhcnQsIHBUYXJnZXQgLSBwU3RhcnQpOwotICAgICAgICBwRGVzdCArPSBwVGFyZ2V0IC0gcFN0YXJ0OwotICAgICAgICBGWFNZU19tZW1jcHkzMihwRGVzdCwgbHBzek5ldy5HZXRDU3RyKCksIGxwc3pOZXcuR2V0TGVuZ3RoKCkpOwotICAgICAgICBwRGVzdCArPSBscHN6TmV3LkdldExlbmd0aCgpOwotICAgICAgICBwU3RhcnQgPSBwVGFyZ2V0ICsgblNvdXJjZUxlbjsKLSAgICB9Ci0gICAgRlhTWVNfbWVtY3B5MzIocERlc3QsIHBTdGFydCwgcEVuZCAtIHBTdGFydCk7Ci0gICAgbV9wRGF0YS0+UmVsZWFzZSgpOwotICAgIG1fcERhdGEgPSBwTmV3RGF0YTsKLSAgICByZXR1cm4gbkNvdW50OwotfQotdm9pZCBDRlhfQnl0ZVN0cmluZzo6U2V0QXQoRlhfU1RSU0laRSBuSW5kZXgsIEZYX0NIQVIgY2gpCi17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYU1lTX2Fzc2VydChuSW5kZXggPj0gMCk7Ci0gICAgRlhTWVNfYXNzZXJ0KG5JbmRleCA8IG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpOwotICAgIENvcHlCZWZvcmVXcml0ZSgpOwotICAgIG1fcERhdGEtPm1fU3RyaW5nW25JbmRleF0gPSBjaDsKLX0KLUNGWF9XaWRlU3RyaW5nIENGWF9CeXRlU3RyaW5nOjpVVEY4RGVjb2RlKCkgY29uc3QKLXsKLSAgICBDRlhfVVRGOERlY29kZXIgZGVjb2RlcjsKLSAgICBmb3IgKEZYX1NUUlNJWkUgaSA9IDA7IGkgPCBHZXRMZW5ndGgoKTsgaSArKykgewotICAgICAgICBkZWNvZGVyLklucHV0KChGWF9CWVRFKW1fcERhdGEtPm1fU3RyaW5nW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuIGRlY29kZXIuR2V0UmVzdWx0KCk7Ci19Ci1DRlhfQnl0ZVN0cmluZyBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoRlhfTFBDV1NUUiBzdHIsIEZYX1NUUlNJWkUgbGVuKQotewotICAgIGlmIChsZW4gPCAwKSB7Ci0gICAgICAgIGxlbiA9IEZYU1lTX3djc2xlbihzdHIpOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBic3RyOwotICAgIGJzdHIuQ29udmVydEZyb20oQ0ZYX1dpZGVTdHJpbmcoc3RyLCBsZW4pKTsKLSAgICByZXR1cm4gYnN0cjsKLX0KLUNGWF9CeXRlU3RyaW5nIENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKQotewotICAgIHJldHVybiBGcm9tVW5pY29kZShzdHIuY19zdHIoKSwgc3RyLkdldExlbmd0aCgpKTsKLX0KLXZvaWQgQ0ZYX0J5dGVTdHJpbmc6OkNvbnZlcnRGcm9tKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIsIENGWF9DaGFyTWFwKiBwQ2hhck1hcCkKLXsKLSAgICBpZiAocENoYXJNYXAgPT0gTlVMTCkgewotICAgICAgICBwQ2hhck1hcCA9IENGWF9DaGFyTWFwOjpHZXREZWZhdWx0TWFwcGVyKCk7Ci0gICAgfQotICAgICp0aGlzID0gKCpwQ2hhck1hcC0+bV9HZXRCeXRlU3RyaW5nKShwQ2hhck1hcCwgc3RyKTsKLX0KLWludCBDRlhfQnl0ZVN0cmluZzo6Q29tcGFyZShGWF9CU1RSIHN0cikgY29uc3QKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBzdHIuSXNFbXB0eSgpID8gMCA6IC0xOwotICAgIH0KLSAgICBpbnQgdGhpc19sZW4gPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOwotICAgIGludCB0aGF0X2xlbiA9IHN0ci5HZXRMZW5ndGgoKTsKLSAgICBpbnQgbWluX2xlbiA9IHRoaXNfbGVuIDwgdGhhdF9sZW4gPyB0aGlzX2xlbiA6IHRoYXRfbGVuOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWluX2xlbjsgaSArKykgewotICAgICAgICBpZiAoKEZYX0JZVEUpbV9wRGF0YS0+bV9TdHJpbmdbaV0gPCBzdHIuR2V0QXQoaSkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfSBlbHNlIGlmICgoRlhfQllURSltX3BEYXRhLT5tX1N0cmluZ1tpXSA+IHN0ci5HZXRBdChpKSkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHRoaXNfbGVuIDwgdGhhdF9sZW4pIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0gZWxzZSBpZiAodGhpc19sZW4gPiB0aGF0X2xlbikgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9CitGWF9TVFJTSVpFIENGWF9CeXRlU3RyaW5nOjpEZWxldGUoRlhfU1RSU0laRSBuSW5kZXgsIEZYX1NUUlNJWkUgbkNvdW50KSB7CisgIGlmICghbV9wRGF0YSkgewogICAgIHJldHVybiAwOwotfQotdm9pZCBDRlhfQnl0ZVN0cmluZzo6VHJpbVJpZ2h0KEZYX0JTVFIgbHBzelRhcmdldHMpCi17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCB8fCBscHN6VGFyZ2V0cy5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuOworICB9CisgIGlmIChuSW5kZXggPCAwKSB7CisgICAgbkluZGV4ID0gMDsKKyAgfQorICBGWF9TVFJTSVpFIG5PbGRMZW5ndGggPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOworICBpZiAobkNvdW50ID4gMCAmJiBuSW5kZXggPCBuT2xkTGVuZ3RoKSB7CisgICAgRlhfU1RSU0laRSBtTGVuZ3RoID0gbkluZGV4ICsgbkNvdW50OworICAgIGlmIChtTGVuZ3RoID49IG5PbGRMZW5ndGgpIHsKKyAgICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuSW5kZXg7CisgICAgICByZXR1cm4gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKICAgICB9CiAgICAgQ29weUJlZm9yZVdyaXRlKCk7Ci0gICAgRlhfU1RSU0laRSBwb3MgPSBHZXRMZW5ndGgoKTsKLSAgICBpZiAocG9zIDwgMSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgRlhfU1RSU0laRSBpID0gMDsKLSAgICAgICAgd2hpbGUgKGkgPCBscHN6VGFyZ2V0cy5HZXRMZW5ndGgoKSAmJiBscHN6VGFyZ2V0c1tpXSAhPSBtX3BEYXRhLT5tX1N0cmluZ1twb3MgLSAxXSkgewotICAgICAgICAgICAgaSArKzsKLSAgICAgICAgfQotICAgICAgICBpZiAoaSA9PSBscHN6VGFyZ2V0cy5HZXRMZW5ndGgoKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcG9zIC0tOwotICAgIH0KLSAgICBpZiAocG9zIDwgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgewotICAgICAgICBtX3BEYXRhLT5tX1N0cmluZ1twb3NdID0gMDsKLSAgICAgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IHBvczsKLSAgICB9CisgICAgaW50IG5CeXRlc1RvQ29weSA9IG5PbGRMZW5ndGggLSBtTGVuZ3RoICsgMTsKKyAgICBGWFNZU19tZW1tb3ZlKG1fcERhdGEtPm1fU3RyaW5nICsgbkluZGV4LCBtX3BEYXRhLT5tX1N0cmluZyArIG1MZW5ndGgsCisgICAgICAgICAgICAgICAgICBuQnl0ZXNUb0NvcHkpOworICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuT2xkTGVuZ3RoIC0gbkNvdW50OworICB9CisgIHJldHVybiBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOwogfQotdm9pZCBDRlhfQnl0ZVN0cmluZzo6VHJpbVJpZ2h0KEZYX0NIQVIgY2hUYXJnZXQpCi17Ci0gICAgVHJpbVJpZ2h0KENGWF9CeXRlU3RyaW5nQyhjaFRhcmdldCkpOwordm9pZCBDRlhfQnl0ZVN0cmluZzo6Q29uY2F0SW5QbGFjZShGWF9TVFJTSVpFIG5TcmNMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGxwc3pTcmNEYXRhKSB7CisgIGlmIChuU3JjTGVuID09IDAgfHwgIWxwc3pTcmNEYXRhKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmICghbV9wRGF0YSkgeworICAgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUoblNyY0xlbik7CisgICAgaWYgKCFtX3BEYXRhKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIEZYU1lTX21lbWNweShtX3BEYXRhLT5tX1N0cmluZywgbHBzelNyY0RhdGEsIG5TcmNMZW4pOworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9wRGF0YS0+bV9uUmVmcyA+IDEgfHwKKyAgICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggKyBuU3JjTGVuID4gbV9wRGF0YS0+bV9uQWxsb2NMZW5ndGgpIHsKKyAgICBDb25jYXRDb3B5KG1fcERhdGEtPm1fbkRhdGFMZW5ndGgsIG1fcERhdGEtPm1fU3RyaW5nLCBuU3JjTGVuLCBscHN6U3JjRGF0YSk7CisgIH0gZWxzZSB7CisgICAgRlhTWVNfbWVtY3B5KG1fcERhdGEtPm1fU3RyaW5nICsgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCwgbHBzelNyY0RhdGEsCisgICAgICAgICAgICAgICAgIG5TcmNMZW4pOworICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggKz0gblNyY0xlbjsKKyAgICBtX3BEYXRhLT5tX1N0cmluZ1ttX3BEYXRhLT5tX25EYXRhTGVuZ3RoXSA9IDA7CisgIH0KIH0KLXZvaWQgQ0ZYX0J5dGVTdHJpbmc6OlRyaW1SaWdodCgpCi17Ci0gICAgVHJpbVJpZ2h0KEZYX0JTVFJDKCJceDA5XHgwYVx4MGJceDBjXHgwZFx4MjAiKSk7Cit2b2lkIENGWF9CeXRlU3RyaW5nOjpDb25jYXRDb3B5KEZYX1NUUlNJWkUgblNyYzFMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGxwc3pTcmMxRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSBuU3JjMkxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogbHBzelNyYzJEYXRhKSB7CisgIGludCBuTmV3TGVuID0gblNyYzFMZW4gKyBuU3JjMkxlbjsKKyAgaWYgKG5OZXdMZW4gPD0gMCkgeworICAgIHJldHVybjsKKyAgfQorICAvLyBEb24ndCByZWxlYXNlIHVudGlsIGRvbmUgY29weWluZywgbWlnaHQgYmUgb25lIG9mIHRoZSBhcmd1bWVudHMuCisgIFN0cmluZ0RhdGEqIHBPbGREYXRhID0gbV9wRGF0YTsKKyAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuTmV3TGVuKTsKKyAgaWYgKG1fcERhdGEpIHsKKyAgICBtZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcsIGxwc3pTcmMxRGF0YSwgblNyYzFMZW4pOworICAgIG1lbWNweShtX3BEYXRhLT5tX1N0cmluZyArIG5TcmMxTGVuLCBscHN6U3JjMkRhdGEsIG5TcmMyTGVuKTsKKyAgfQorICBwT2xkRGF0YS0+UmVsZWFzZSgpOwogfQotdm9pZCBDRlhfQnl0ZVN0cmluZzo6VHJpbUxlZnQoRlhfQlNUUiBscHN6VGFyZ2V0cykKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGxwc3pUYXJnZXRzLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENvcHlCZWZvcmVXcml0ZSgpOwotICAgIEZYX1NUUlNJWkUgbGVuID0gR2V0TGVuZ3RoKCk7Ci0gICAgaWYgKGxlbiA8IDEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9TVFJTSVpFIHBvcyA9IDA7Ci0gICAgd2hpbGUgKHBvcyA8IGxlbikgewotICAgICAgICBGWF9TVFJTSVpFIGkgPSAwOwotICAgICAgICB3aGlsZSAoaSA8IGxwc3pUYXJnZXRzLkdldExlbmd0aCgpICYmIGxwc3pUYXJnZXRzW2ldICE9IG1fcERhdGEtPm1fU3RyaW5nW3Bvc10pIHsKLSAgICAgICAgICAgIGkgKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGkgPT0gbHBzelRhcmdldHMuR2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHBvcyArKzsKLSAgICB9Ci0gICAgaWYgKHBvcykgewotICAgICAgICBGWF9TVFJTSVpFIG5EYXRhTGVuZ3RoID0gbGVuIC0gcG9zOwotICAgICAgICBGWFNZU19tZW1tb3ZlMzIobV9wRGF0YS0+bV9TdHJpbmcsIG1fcERhdGEtPm1fU3RyaW5nICsgcG9zLCAobkRhdGFMZW5ndGggKyAxKSpzaXplb2YoRlhfQ0hBUikpOwotICAgICAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gbkRhdGFMZW5ndGg7Ci0gICAgfQorQ0ZYX0J5dGVTdHJpbmcgQ0ZYX0J5dGVTdHJpbmc6Ok1pZChGWF9TVFJTSVpFIG5GaXJzdCkgY29uc3QgeworICBpZiAoIW1fcERhdGEpIHsKKyAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKKyAgfQorICByZXR1cm4gTWlkKG5GaXJzdCwgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAtIG5GaXJzdCk7CiB9Ci12b2lkIENGWF9CeXRlU3RyaW5nOjpUcmltTGVmdChGWF9DSEFSIGNoVGFyZ2V0KQotewotICAgIFRyaW1MZWZ0KENGWF9CeXRlU3RyaW5nQyhjaFRhcmdldCkpOworQ0ZYX0J5dGVTdHJpbmcgQ0ZYX0J5dGVTdHJpbmc6Ok1pZChGWF9TVFJTSVpFIG5GaXJzdCwgRlhfU1RSU0laRSBuQ291bnQpIGNvbnN0IHsKKyAgaWYgKG5GaXJzdCA8IDApIHsKKyAgICBuRmlyc3QgPSAwOworICB9CisgIGlmIChuQ291bnQgPCAwKSB7CisgICAgbkNvdW50ID0gMDsKKyAgfQorICBpZiAobkZpcnN0ICsgbkNvdW50ID4gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgeworICAgIG5Db3VudCA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggLSBuRmlyc3Q7CisgIH0KKyAgaWYgKG5GaXJzdCA+IG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpIHsKKyAgICBuQ291bnQgPSAwOworICB9CisgIGlmIChuRmlyc3QgPT0gMCAmJiBuRmlyc3QgKyBuQ291bnQgPT0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBkZXN0OworICBBbGxvY0NvcHkoZGVzdCwgbkNvdW50LCBuRmlyc3QpOworICByZXR1cm4gZGVzdDsKIH0KLXZvaWQgQ0ZYX0J5dGVTdHJpbmc6OlRyaW1MZWZ0KCkKLXsKLSAgICBUcmltTGVmdChGWF9CU1RSQygiXHgwOVx4MGFceDBiXHgwY1x4MGRceDIwIikpOwordm9pZCBDRlhfQnl0ZVN0cmluZzo6QWxsb2NDb3B5KENGWF9CeXRlU3RyaW5nJiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1NUUlNJWkUgbkNvcHlMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSBuQ29weUluZGV4KSBjb25zdCB7CisgIC8vIHxGWF9TVFJTSVpFfCBpcyBjdXJyZW50bHkgdHlwZWRlZidkIGFzIGluIHxpbnR8LiBUT0RPKHBhbG1lcik6IEl0CisgIC8vIHNob3VsZCBiZSBhIHxzaXplX3R8LCBvciBhdCBsZWFzdCB1bnNpZ25lZC4KKyAgaWYgKG5Db3B5TGVuID09IDAgfHwgbkNvcHlMZW4gPCAwKSB7CisgICAgcmV0dXJuOworICB9CisgIEFTU0VSVCghZGVzdC5tX3BEYXRhKTsKKyAgZGVzdC5tX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5Db3B5TGVuKTsKKyAgaWYgKGRlc3QubV9wRGF0YSkgeworICAgIEZYU1lTX21lbWNweShkZXN0Lm1fcERhdGEtPm1fU3RyaW5nLCBtX3BEYXRhLT5tX1N0cmluZyArIG5Db3B5SW5kZXgsCisgICAgICAgICAgICAgICAgIG5Db3B5TGVuKTsKKyAgfQogfQotRlhfRFdPUkQgQ0ZYX0J5dGVTdHJpbmc6OkdldElEKEZYX1NUUlNJWkUgc3RhcnRfcG9zKSBjb25zdAotewotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MoKnRoaXMpLkdldElEKHN0YXJ0X3Bvcyk7Ci19Ci1GWF9EV09SRCBDRlhfQnl0ZVN0cmluZ0M6OkdldElEKEZYX1NUUlNJWkUgc3RhcnRfcG9zKSBjb25zdAotewotICAgIGlmIChtX0xlbmd0aCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwOworI2RlZmluZSBGT1JDRV9BTlNJIDB4MTAwMDAKKyNkZWZpbmUgRk9SQ0VfVU5JQ09ERSAweDIwMDAwCisjZGVmaW5lIEZPUkNFX0lOVDY0IDB4NDAwMDAKK3ZvaWQgQ0ZYX0J5dGVTdHJpbmc6OkZvcm1hdFYoY29uc3QgRlhfQ0hBUiogbHBzekZvcm1hdCwgdmFfbGlzdCBhcmdMaXN0KSB7CisgIHZhX2xpc3QgYXJnTGlzdFNhdmU7CisjaWYgZGVmaW5lZChfX0FSTUNDX1ZFUlNJT04pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoIWRlZmluZWQoX01TQ19WRVIpICYmIChfRlhfQ1BVXyA9PSBfRlhfWDY0XyB8fCBfRlhfQ1BVXyA9PSBfRlhfSUE2NF8gfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9GWF9DUFVfID09IF9GWF9BUk02NF8pKSB8fCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGVmaW5lZChfX25hdGl2ZV9jbGllbnRfXykKKyAgdmFfY29weShhcmdMaXN0U2F2ZSwgYXJnTGlzdCk7CisjZWxzZQorICBhcmdMaXN0U2F2ZSA9IGFyZ0xpc3Q7CisjZW5kaWYKKyAgaW50IG5NYXhMZW4gPSAwOworICBmb3IgKGNvbnN0IEZYX0NIQVIqIGxwc3ogPSBscHN6Rm9ybWF0OyAqbHBzeiAhPSAwOyBscHN6KyspIHsKKyAgICBpZiAoKmxwc3ogIT0gJyUnIHx8ICoobHBzeiA9IGxwc3ogKyAxKSA9PSAnJScpIHsKKyAgICAgIG5NYXhMZW4gKz0gRlhTWVNfc3RybGVuKGxwc3opOworICAgICAgY29udGludWU7CiAgICAgfQotICAgIGlmIChzdGFydF9wb3MgPCAwIHx8IHN0YXJ0X3BvcyA+PSBtX0xlbmd0aCkgewotICAgICAgICByZXR1cm4gMDsKKyAgICBpbnQgbkl0ZW1MZW4gPSAwOworICAgIGludCBuV2lkdGggPSAwOworICAgIGZvciAoOyAqbHBzeiAhPSAwOyBscHN6KyspIHsKKyAgICAgIGlmICgqbHBzeiA9PSAnIycpIHsKKyAgICAgICAgbk1heExlbiArPSAyOworICAgICAgfSBlbHNlIGlmICgqbHBzeiA9PSAnKicpIHsKKyAgICAgICAgbldpZHRoID0gdmFfYXJnKGFyZ0xpc3QsIGludCk7CisgICAgICB9IGVsc2UgaWYgKCpscHN6ID09ICctJyB8fCAqbHBzeiA9PSAnKycgfHwgKmxwc3ogPT0gJzAnIHx8ICpscHN6ID09ICcgJykKKyAgICAgICAgOworICAgICAgZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQogICAgIH0KLSAgICBGWF9EV09SRCBzdHJpZCA9IDA7Ci0gICAgaWYgKHN0YXJ0X3BvcyArIDQgPiBtX0xlbmd0aCkgewotICAgICAgICBmb3IgKEZYX1NUUlNJWkUgaSA9IDA7IGkgPCBtX0xlbmd0aCAtIHN0YXJ0X3BvczsgaSArKykgewotICAgICAgICAgICAgc3RyaWQgPSBzdHJpZCAqIDI1NiArIG1fUHRyW3N0YXJ0X3BvcyArIGldOwotICAgICAgICB9Ci0gICAgICAgIHN0cmlkID0gc3RyaWQgPDwgKCg0IC0gbV9MZW5ndGggKyBzdGFydF9wb3MpICogOCk7CisgICAgaWYgKG5XaWR0aCA9PSAwKSB7CisgICAgICBuV2lkdGggPSBGWFNZU19hdG9pKGxwc3opOworICAgICAgd2hpbGUgKHN0ZDo6aXNkaWdpdCgqbHBzeikpCisgICAgICAgIGxwc3orKzsKKyAgICB9CisgICAgaWYgKG5XaWR0aCA8IDAgfHwgbldpZHRoID4gMTI4ICogMTAyNCkgeworICAgICAgbHBzekZvcm1hdCA9ICJCYWQgd2lkdGgiOworICAgICAgbk1heExlbiA9IDEwOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGludCBuUHJlY2lzaW9uID0gMDsKKyAgICBpZiAoKmxwc3ogPT0gJy4nKSB7CisgICAgICBscHN6Kys7CisgICAgICBpZiAoKmxwc3ogPT0gJyonKSB7CisgICAgICAgIG5QcmVjaXNpb24gPSB2YV9hcmcoYXJnTGlzdCwgaW50KTsKKyAgICAgICAgbHBzeisrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgblByZWNpc2lvbiA9IEZYU1lTX2F0b2kobHBzeik7CisgICAgICAgIHdoaWxlIChzdGQ6OmlzZGlnaXQoKmxwc3opKQorICAgICAgICAgIGxwc3orKzsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG5QcmVjaXNpb24gPCAwIHx8IG5QcmVjaXNpb24gPiAxMjggKiAxMDI0KSB7CisgICAgICBscHN6Rm9ybWF0ID0gIkJhZCBwcmVjaXNpb24iOworICAgICAgbk1heExlbiA9IDE0OworICAgICAgYnJlYWs7CisgICAgfQorICAgIGludCBuTW9kaWZpZXIgPSAwOworICAgIGlmIChGWFNZU19zdHJuY21wKGxwc3osICJJNjQiLCAzKSA9PSAwKSB7CisgICAgICBscHN6ICs9IDM7CisgICAgICBuTW9kaWZpZXIgPSBGT1JDRV9JTlQ2NDsKICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkgKyspIHsKLSAgICAgICAgICAgIHN0cmlkID0gc3RyaWQgKiAyNTYgKyBtX1B0cltzdGFydF9wb3MgKyBpXTsKLSAgICAgICAgfQorICAgICAgc3dpdGNoICgqbHBzeikgeworICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICBuTW9kaWZpZXIgPSBGT1JDRV9BTlNJOworICAgICAgICAgIGxwc3orKzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnbCc6CisgICAgICAgICAgbk1vZGlmaWVyID0gRk9SQ0VfVU5JQ09ERTsKKyAgICAgICAgICBscHN6Kys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ0YnOgorICAgICAgICBjYXNlICdOJzoKKyAgICAgICAgY2FzZSAnTCc6CisgICAgICAgICAgbHBzeisrOworICAgICAgICAgIGJyZWFrOworICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gc3RyaWQ7CisgICAgc3dpdGNoICgqbHBzeiB8IG5Nb2RpZmllcikgeworICAgICAgY2FzZSAnYyc6CisgICAgICBjYXNlICdDJzoKKyAgICAgICAgbkl0ZW1MZW4gPSAyOworICAgICAgICB2YV9hcmcoYXJnTGlzdCwgaW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdjJyB8IEZPUkNFX0FOU0k6CisgICAgICBjYXNlICdDJyB8IEZPUkNFX0FOU0k6CisgICAgICAgIG5JdGVtTGVuID0gMjsKKyAgICAgICAgdmFfYXJnKGFyZ0xpc3QsIGludCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnYycgfCBGT1JDRV9VTklDT0RFOgorICAgICAgY2FzZSAnQycgfCBGT1JDRV9VTklDT0RFOgorICAgICAgICBuSXRlbUxlbiA9IDI7CisgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3MnOiB7CisgICAgICAgIGNvbnN0IEZYX0NIQVIqIHBzdHJOZXh0QXJnID0gdmFfYXJnKGFyZ0xpc3QsIGNvbnN0IEZYX0NIQVIqKTsKKyAgICAgICAgaWYgKHBzdHJOZXh0QXJnKSB7CisgICAgICAgICAgbkl0ZW1MZW4gPSBGWFNZU19zdHJsZW4ocHN0ck5leHRBcmcpOworICAgICAgICAgIGlmIChuSXRlbUxlbiA8IDEpIHsKKyAgICAgICAgICAgIG5JdGVtTGVuID0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbkl0ZW1MZW4gPSA2OworICAgICAgICB9CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSAnUyc6IHsKKyAgICAgICAgRlhfV0NIQVIqIHBzdHJOZXh0QXJnID0gdmFfYXJnKGFyZ0xpc3QsIEZYX1dDSEFSKik7CisgICAgICAgIGlmIChwc3RyTmV4dEFyZykgeworICAgICAgICAgIG5JdGVtTGVuID0gRlhTWVNfd2NzbGVuKHBzdHJOZXh0QXJnKTsKKyAgICAgICAgICBpZiAobkl0ZW1MZW4gPCAxKSB7CisgICAgICAgICAgICBuSXRlbUxlbiA9IDE7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5JdGVtTGVuID0gNjsKKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgJ3MnIHwgRk9SQ0VfQU5TSToKKyAgICAgIGNhc2UgJ1MnIHwgRk9SQ0VfQU5TSTogeworICAgICAgICBjb25zdCBGWF9DSEFSKiBwc3RyTmV4dEFyZyA9IHZhX2FyZyhhcmdMaXN0LCBjb25zdCBGWF9DSEFSKik7CisgICAgICAgIGlmIChwc3RyTmV4dEFyZykgeworICAgICAgICAgIG5JdGVtTGVuID0gRlhTWVNfc3RybGVuKHBzdHJOZXh0QXJnKTsKKyAgICAgICAgICBpZiAobkl0ZW1MZW4gPCAxKSB7CisgICAgICAgICAgICBuSXRlbUxlbiA9IDE7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5JdGVtTGVuID0gNjsKKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgJ3MnIHwgRk9SQ0VfVU5JQ09ERToKKyAgICAgIGNhc2UgJ1MnIHwgRk9SQ0VfVU5JQ09ERTogeworICAgICAgICBGWF9XQ0hBUiogcHN0ck5leHRBcmcgPSB2YV9hcmcoYXJnTGlzdCwgRlhfV0NIQVIqKTsKKyAgICAgICAgaWYgKHBzdHJOZXh0QXJnKSB7CisgICAgICAgICAgbkl0ZW1MZW4gPSBGWFNZU193Y3NsZW4ocHN0ck5leHRBcmcpOworICAgICAgICAgIGlmIChuSXRlbUxlbiA8IDEpIHsKKyAgICAgICAgICAgIG5JdGVtTGVuID0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbkl0ZW1MZW4gPSA2OworICAgICAgICB9CisgICAgICB9IGJyZWFrOworICAgIH0KKyAgICBpZiAobkl0ZW1MZW4gIT0gMCkgeworICAgICAgaWYgKG5QcmVjaXNpb24gIT0gMCAmJiBuSXRlbUxlbiA+IG5QcmVjaXNpb24pIHsKKyAgICAgICAgbkl0ZW1MZW4gPSBuUHJlY2lzaW9uOworICAgICAgfQorICAgICAgaWYgKG5JdGVtTGVuIDwgbldpZHRoKSB7CisgICAgICAgIG5JdGVtTGVuID0gbldpZHRoOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKCpscHN6KSB7CisgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgY2FzZSAndSc6CisgICAgICAgIGNhc2UgJ3gnOgorICAgICAgICBjYXNlICdYJzoKKyAgICAgICAgY2FzZSAnbyc6CisgICAgICAgICAgaWYgKG5Nb2RpZmllciAmIEZPUkNFX0lOVDY0KSB7CisgICAgICAgICAgICB2YV9hcmcoYXJnTGlzdCwgaW50NjRfdCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQpOworICAgICAgICAgIH0KKyAgICAgICAgICBuSXRlbUxlbiA9IDMyOworICAgICAgICAgIGlmIChuSXRlbUxlbiA8IG5XaWR0aCArIG5QcmVjaXNpb24pIHsKKyAgICAgICAgICAgIG5JdGVtTGVuID0gbldpZHRoICsgblByZWNpc2lvbjsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2EnOgorICAgICAgICBjYXNlICdBJzoKKyAgICAgICAgY2FzZSAnZSc6CisgICAgICAgIGNhc2UgJ0UnOgorICAgICAgICBjYXNlICdnJzoKKyAgICAgICAgY2FzZSAnRyc6CisgICAgICAgICAgdmFfYXJnKGFyZ0xpc3QsIGRvdWJsZSk7CisgICAgICAgICAgbkl0ZW1MZW4gPSAxMjg7CisgICAgICAgICAgaWYgKG5JdGVtTGVuIDwgbldpZHRoICsgblByZWNpc2lvbikgeworICAgICAgICAgICAgbkl0ZW1MZW4gPSBuV2lkdGggKyBuUHJlY2lzaW9uOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgaWYgKG5XaWR0aCArIG5QcmVjaXNpb24gPiAxMDApIHsKKyAgICAgICAgICAgIG5JdGVtTGVuID0gblByZWNpc2lvbiArIG5XaWR0aCArIDEyODsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhciBwc3pUZW1wWzI1Nl07CisgICAgICAgICAgICBkb3VibGUgZiA9IHZhX2FyZyhhcmdMaXN0LCBkb3VibGUpOworICAgICAgICAgICAgbWVtc2V0KHBzelRlbXAsIDAsIHNpemVvZihwc3pUZW1wKSk7CisgICAgICAgICAgICBGWFNZU19zbnByaW50Zihwc3pUZW1wLCBzaXplb2YocHN6VGVtcCkgLSAxLCAiJSouKmYiLCBuV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuUHJlY2lzaW9uICsgNiwgZik7CisgICAgICAgICAgICBuSXRlbUxlbiA9IEZYU1lTX3N0cmxlbihwc3pUZW1wKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCB2b2lkKik7CisgICAgICAgICAgbkl0ZW1MZW4gPSAzMjsKKyAgICAgICAgICBpZiAobkl0ZW1MZW4gPCBuV2lkdGggKyBuUHJlY2lzaW9uKSB7CisgICAgICAgICAgICBuSXRlbUxlbiA9IG5XaWR0aCArIG5QcmVjaXNpb247CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICduJzoKKyAgICAgICAgICB2YV9hcmcoYXJnTGlzdCwgaW50Kik7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIG5NYXhMZW4gKz0gbkl0ZW1MZW47CisgIH0KKyAgbk1heExlbiArPSAzMjsgIC8vIEZ1ZGdlIGZhY3Rvci4KKyAgR2V0QnVmZmVyKG5NYXhMZW4pOworICBpZiAobV9wRGF0YSkgeworICAgIG1lbXNldChtX3BEYXRhLT5tX1N0cmluZywgMCwgbk1heExlbik7CisgICAgRlhTWVNfdnNucHJpbnRmKG1fcERhdGEtPm1fU3RyaW5nLCBuTWF4TGVuIC0gMSwgbHBzekZvcm1hdCwgYXJnTGlzdFNhdmUpOworICAgIFJlbGVhc2VCdWZmZXIoKTsKKyAgfQorICB2YV9lbmQoYXJnTGlzdFNhdmUpOwogfQotRlhfU1RSU0laRSBGWF9mdG9hKEZYX0ZMT0FUIGQsIEZYX0xQU1RSIGJ1ZikKLXsKLSAgICBidWZbMF0gPSAnMCc7Ci0gICAgYnVmWzFdID0gJ1wwJzsKLSAgICBpZiAoZCA9PSAwLjBmKSB7Ci0gICAgICAgIHJldHVybiAxOwordm9pZCBDRlhfQnl0ZVN0cmluZzo6Rm9ybWF0KGNvbnN0IEZYX0NIQVIqIGxwc3pGb3JtYXQsIC4uLikgeworICB2YV9saXN0IGFyZ0xpc3Q7CisgIHZhX3N0YXJ0KGFyZ0xpc3QsIGxwc3pGb3JtYXQpOworICBGb3JtYXRWKGxwc3pGb3JtYXQsIGFyZ0xpc3QpOworICB2YV9lbmQoYXJnTGlzdCk7Cit9CitGWF9TVFJTSVpFIENGWF9CeXRlU3RyaW5nOjpJbnNlcnQoRlhfU1RSU0laRSBuSW5kZXgsIEZYX0NIQVIgY2gpIHsKKyAgQ29weUJlZm9yZVdyaXRlKCk7CisgIGlmIChuSW5kZXggPCAwKSB7CisgICAgbkluZGV4ID0gMDsKKyAgfQorICBGWF9TVFJTSVpFIG5OZXdMZW5ndGggPSBtX3BEYXRhID8gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA6IDA7CisgIGlmIChuSW5kZXggPiBuTmV3TGVuZ3RoKSB7CisgICAgbkluZGV4ID0gbk5ld0xlbmd0aDsKKyAgfQorICBuTmV3TGVuZ3RoKys7CisgIGlmICghbV9wRGF0YSB8fCBtX3BEYXRhLT5tX25BbGxvY0xlbmd0aCA8IG5OZXdMZW5ndGgpIHsKKyAgICBTdHJpbmdEYXRhKiBwT2xkRGF0YSA9IG1fcERhdGE7CisgICAgY29uc3QgRlhfQ0hBUiogcHN0ciA9IG1fcERhdGEtPm1fU3RyaW5nOworICAgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobk5ld0xlbmd0aCk7CisgICAgaWYgKCFtX3BEYXRhKSB7CisgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgRlhfQk9PTCBiTmVnYXRpdmUgPSBGQUxTRTsKLSAgICBpZiAoZCA8IDApIHsKLSAgICAgICAgYk5lZ2F0aXZlID0gVFJVRTsKLSAgICAgICAgZCA9IC1kOworICAgIGlmIChwT2xkRGF0YSkgeworICAgICAgRlhTWVNfbWVtbW92ZShtX3BEYXRhLT5tX1N0cmluZywgcHN0ciwgKHBPbGREYXRhLT5tX25EYXRhTGVuZ3RoICsgMSkpOworICAgICAgcE9sZERhdGEtPlJlbGVhc2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgbV9wRGF0YS0+bV9TdHJpbmdbMF0gPSAwOwogICAgIH0KLSAgICBpbnQgc2NhbGUgPSAxOwotICAgIGludCBzY2FsZWQgPSBGWFNZU19yb3VuZChkKTsKLSAgICB3aGlsZSAoc2NhbGVkIDwgMTAwMDAwKSB7Ci0gICAgICAgIGlmIChzY2FsZSA9PSAxMDAwMDAwKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBzY2FsZSAqPSAxMDsKLSAgICAgICAgc2NhbGVkID0gRlhTWVNfcm91bmQoZCAqIHNjYWxlKTsKKyAgfQorICBGWFNZU19tZW1tb3ZlKG1fcERhdGEtPm1fU3RyaW5nICsgbkluZGV4ICsgMSwgbV9wRGF0YS0+bV9TdHJpbmcgKyBuSW5kZXgsCisgICAgICAgICAgICAgICAgKG5OZXdMZW5ndGggLSBuSW5kZXgpKTsKKyAgbV9wRGF0YS0+bV9TdHJpbmdbbkluZGV4XSA9IGNoOworICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gbk5ld0xlbmd0aDsKKyAgcmV0dXJuIG5OZXdMZW5ndGg7Cit9CitDRlhfQnl0ZVN0cmluZyBDRlhfQnl0ZVN0cmluZzo6UmlnaHQoRlhfU1RSU0laRSBuQ291bnQpIGNvbnN0IHsKKyAgaWYgKCFtX3BEYXRhKSB7CisgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7CisgIH0KKyAgaWYgKG5Db3VudCA8IDApIHsKKyAgICBuQ291bnQgPSAwOworICB9CisgIGlmIChuQ291bnQgPj0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBkZXN0OworICBBbGxvY0NvcHkoZGVzdCwgbkNvdW50LCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIC0gbkNvdW50KTsKKyAgcmV0dXJuIGRlc3Q7Cit9CitDRlhfQnl0ZVN0cmluZyBDRlhfQnl0ZVN0cmluZzo6TGVmdChGWF9TVFJTSVpFIG5Db3VudCkgY29uc3QgeworICBpZiAoIW1fcERhdGEpIHsKKyAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKKyAgfQorICBpZiAobkNvdW50IDwgMCkgeworICAgIG5Db3VudCA9IDA7CisgIH0KKyAgaWYgKG5Db3VudCA+PSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKSB7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIENGWF9CeXRlU3RyaW5nIGRlc3Q7CisgIEFsbG9jQ29weShkZXN0LCBuQ291bnQsIDApOworICByZXR1cm4gZGVzdDsKK30KK0ZYX1NUUlNJWkUgQ0ZYX0J5dGVTdHJpbmc6OkZpbmQoRlhfQ0hBUiBjaCwgRlhfU1RSU0laRSBuU3RhcnQpIGNvbnN0IHsKKyAgaWYgKCFtX3BEYXRhKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIEZYX1NUUlNJWkUgbkxlbmd0aCA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7CisgIGlmIChuU3RhcnQgPj0gbkxlbmd0aCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBjb25zdCBGWF9DSEFSKiBscHN6ID0gRlhTWVNfc3RyY2hyKG1fcERhdGEtPm1fU3RyaW5nICsgblN0YXJ0LCBjaCk7CisgIHJldHVybiBscHN6ID8gKGludCkobHBzeiAtIG1fcERhdGEtPm1fU3RyaW5nKSA6IC0xOworfQorRlhfU1RSU0laRSBDRlhfQnl0ZVN0cmluZzo6UmV2ZXJzZUZpbmQoRlhfQ0hBUiBjaCkgY29uc3QgeworICBpZiAoIW1fcERhdGEpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgRlhfU1RSU0laRSBuTGVuZ3RoID0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKKyAgd2hpbGUgKG5MZW5ndGgpIHsKKyAgICBpZiAobV9wRGF0YS0+bV9TdHJpbmdbbkxlbmd0aCAtIDFdID09IGNoKSB7CisgICAgICByZXR1cm4gbkxlbmd0aCAtIDE7CiAgICAgfQotICAgIGlmIChzY2FsZWQgPT0gMCkgewotICAgICAgICByZXR1cm4gMTsKKyAgICBuTGVuZ3RoLS07CisgIH0KKyAgcmV0dXJuIC0xOworfQorY29uc3QgRlhfQ0hBUiogRlhfc3Ryc3RyKGNvbnN0IEZYX0NIQVIqIHN0cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogc3RyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuMikgeworICBpZiAobGVuMiA+IGxlbjEgfHwgbGVuMiA9PSAwKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgY29uc3QgRlhfQ0hBUiogZW5kX3B0ciA9IHN0cjEgKyBsZW4xIC0gbGVuMjsKKyAgd2hpbGUgKHN0cjEgPD0gZW5kX3B0cikgeworICAgIGludCBpID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgaWYgKHN0cjFbaV0gIT0gc3RyMltpXSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGkrKzsKKyAgICAgIGlmIChpID09IGxlbjIpIHsKKyAgICAgICAgcmV0dXJuIHN0cjE7CisgICAgICB9CiAgICAgfQotICAgIGNoYXIgYnVmMlszMl07Ci0gICAgaW50IGJ1Zl9zaXplID0gMDsKLSAgICBpZiAoYk5lZ2F0aXZlKSB7Ci0gICAgICAgIGJ1ZltidWZfc2l6ZSsrXSA9ICctJzsKKyAgICBzdHIxKys7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CitGWF9TVFJTSVpFIENGWF9CeXRlU3RyaW5nOjpGaW5kKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbHBzelN1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSBuU3RhcnQpIGNvbnN0IHsKKyAgaWYgKCFtX3BEYXRhKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIEZYX1NUUlNJWkUgbkxlbmd0aCA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7CisgIGlmIChuU3RhcnQgPiBuTGVuZ3RoKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGNvbnN0IEZYX0NIQVIqIGxwc3ogPQorICAgICAgRlhfc3Ryc3RyKG1fcERhdGEtPm1fU3RyaW5nICsgblN0YXJ0LCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIC0gblN0YXJ0LAorICAgICAgICAgICAgICAgIGxwc3pTdWIuR2V0Q1N0cigpLCBscHN6U3ViLkdldExlbmd0aCgpKTsKKyAgcmV0dXJuIGxwc3ogPyAoaW50KShscHN6IC0gbV9wRGF0YS0+bV9TdHJpbmcpIDogLTE7Cit9Cit2b2lkIENGWF9CeXRlU3RyaW5nOjpNYWtlTG93ZXIoKSB7CisgIGlmICghbV9wRGF0YSkgeworICAgIHJldHVybjsKKyAgfQorICBDb3B5QmVmb3JlV3JpdGUoKTsKKyAgaWYgKEdldExlbmd0aCgpIDwgMSkgeworICAgIHJldHVybjsKKyAgfQorICBGWFNZU19zdHJsd3IobV9wRGF0YS0+bV9TdHJpbmcpOworfQordm9pZCBDRlhfQnl0ZVN0cmluZzo6TWFrZVVwcGVyKCkgeworICBpZiAoIW1fcERhdGEpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ29weUJlZm9yZVdyaXRlKCk7CisgIGlmIChHZXRMZW5ndGgoKSA8IDEpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhTWVNfc3RydXByKG1fcERhdGEtPm1fU3RyaW5nKTsKK30KK0ZYX1NUUlNJWkUgQ0ZYX0J5dGVTdHJpbmc6OlJlbW92ZShGWF9DSEFSIGNoUmVtb3ZlKSB7CisgIGlmICghbV9wRGF0YSkgeworICAgIHJldHVybiAwOworICB9CisgIENvcHlCZWZvcmVXcml0ZSgpOworICBpZiAoR2V0TGVuZ3RoKCkgPCAxKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgRlhfQ0hBUiogcHN0clNvdXJjZSA9IG1fcERhdGEtPm1fU3RyaW5nOworICBGWF9DSEFSKiBwc3RyRGVzdCA9IG1fcERhdGEtPm1fU3RyaW5nOworICBGWF9DSEFSKiBwc3RyRW5kID0gbV9wRGF0YS0+bV9TdHJpbmcgKyBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOworICB3aGlsZSAocHN0clNvdXJjZSA8IHBzdHJFbmQpIHsKKyAgICBpZiAoKnBzdHJTb3VyY2UgIT0gY2hSZW1vdmUpIHsKKyAgICAgICpwc3RyRGVzdCA9ICpwc3RyU291cmNlOworICAgICAgcHN0ckRlc3QrKzsKICAgICB9Ci0gICAgaW50IGkgPSBzY2FsZWQgLyBzY2FsZTsKLSAgICBGWFNZU19pdG9hKGksIGJ1ZjIsIDEwKTsKLSAgICBGWF9TVFJTSVpFIGxlbiA9IEZYU1lTX3N0cmxlbihidWYyKTsKLSAgICBGWFNZU19tZW1jcHkzMihidWYgKyBidWZfc2l6ZSwgYnVmMiwgbGVuKTsKLSAgICBidWZfc2l6ZSArPSBsZW47Ci0gICAgaW50IGZyYWN0aW9uID0gc2NhbGVkICUgc2NhbGU7Ci0gICAgaWYgKGZyYWN0aW9uID09IDApIHsKLSAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgIHBzdHJTb3VyY2UrKzsKKyAgfQorICAqcHN0ckRlc3QgPSAwOworICBGWF9TVFJTSVpFIG5Db3VudCA9IChGWF9TVFJTSVpFKShwc3RyU291cmNlIC0gcHN0ckRlc3QpOworICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIC09IG5Db3VudDsKKyAgcmV0dXJuIG5Db3VudDsKK30KK0ZYX1NUUlNJWkUgQ0ZYX0J5dGVTdHJpbmc6OlJlcGxhY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBscHN6T2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGxwc3pOZXcpIHsKKyAgaWYgKCFtX3BEYXRhKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGxwc3pPbGQuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgRlhfU1RSU0laRSBuU291cmNlTGVuID0gbHBzek9sZC5HZXRMZW5ndGgoKTsKKyAgRlhfU1RSU0laRSBuUmVwbGFjZW1lbnRMZW4gPSBscHN6TmV3LkdldExlbmd0aCgpOworICBGWF9TVFJTSVpFIG5Db3VudCA9IDA7CisgIGNvbnN0IEZYX0NIQVIqIHBTdGFydCA9IG1fcERhdGEtPm1fU3RyaW5nOworICBGWF9DSEFSKiBwRW5kID0gbV9wRGF0YS0+bV9TdHJpbmcgKyBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOworICB3aGlsZSAoMSkgeworICAgIGNvbnN0IEZYX0NIQVIqIHBUYXJnZXQgPSBGWF9zdHJzdHIocFN0YXJ0LCAoRlhfU1RSU0laRSkocEVuZCAtIHBTdGFydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscHN6T2xkLkdldENTdHIoKSwgblNvdXJjZUxlbik7CisgICAgaWYgKCFwVGFyZ2V0KSB7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgYnVmW2J1Zl9zaXplKytdID0gJy4nOwotICAgIHNjYWxlIC89IDEwOwotICAgIHdoaWxlIChmcmFjdGlvbikgewotICAgICAgICBidWZbYnVmX3NpemUrK10gPSAnMCcgKyBmcmFjdGlvbiAvIHNjYWxlOwotICAgICAgICBmcmFjdGlvbiAlPSBzY2FsZTsKLSAgICAgICAgc2NhbGUgLz0gMTA7CisgICAgbkNvdW50Kys7CisgICAgcFN0YXJ0ID0gcFRhcmdldCArIG5Tb3VyY2VMZW47CisgIH0KKyAgaWYgKG5Db3VudCA9PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgRlhfU1RSU0laRSBuTmV3TGVuZ3RoID0KKyAgICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggKyAoblJlcGxhY2VtZW50TGVuIC0gblNvdXJjZUxlbikgKiBuQ291bnQ7CisgIGlmIChuTmV3TGVuZ3RoID09IDApIHsKKyAgICBFbXB0eSgpOworICAgIHJldHVybiBuQ291bnQ7CisgIH0KKyAgU3RyaW5nRGF0YSogcE5ld0RhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobk5ld0xlbmd0aCk7CisgIGlmICghcE5ld0RhdGEpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBwU3RhcnQgPSBtX3BEYXRhLT5tX1N0cmluZzsKKyAgRlhfQ0hBUiogcERlc3QgPSBwTmV3RGF0YS0+bV9TdHJpbmc7CisgIGZvciAoRlhfU1RSU0laRSBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7CisgICAgY29uc3QgRlhfQ0hBUiogcFRhcmdldCA9IEZYX3N0cnN0cihwU3RhcnQsIChGWF9TVFJTSVpFKShwRW5kIC0gcFN0YXJ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwc3pPbGQuR2V0Q1N0cigpLCBuU291cmNlTGVuKTsKKyAgICBGWFNZU19tZW1jcHkocERlc3QsIHBTdGFydCwgcFRhcmdldCAtIHBTdGFydCk7CisgICAgcERlc3QgKz0gcFRhcmdldCAtIHBTdGFydDsKKyAgICBGWFNZU19tZW1jcHkocERlc3QsIGxwc3pOZXcuR2V0Q1N0cigpLCBscHN6TmV3LkdldExlbmd0aCgpKTsKKyAgICBwRGVzdCArPSBscHN6TmV3LkdldExlbmd0aCgpOworICAgIHBTdGFydCA9IHBUYXJnZXQgKyBuU291cmNlTGVuOworICB9CisgIEZYU1lTX21lbWNweShwRGVzdCwgcFN0YXJ0LCBwRW5kIC0gcFN0YXJ0KTsKKyAgbV9wRGF0YS0+UmVsZWFzZSgpOworICBtX3BEYXRhID0gcE5ld0RhdGE7CisgIHJldHVybiBuQ291bnQ7Cit9Cit2b2lkIENGWF9CeXRlU3RyaW5nOjpTZXRBdChGWF9TVFJTSVpFIG5JbmRleCwgRlhfQ0hBUiBjaCkgeworICBpZiAoIW1fcERhdGEpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhTWVNfYXNzZXJ0KG5JbmRleCA+PSAwKTsKKyAgRlhTWVNfYXNzZXJ0KG5JbmRleCA8IG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpOworICBDb3B5QmVmb3JlV3JpdGUoKTsKKyAgbV9wRGF0YS0+bV9TdHJpbmdbbkluZGV4XSA9IGNoOworfQorQ0ZYX1dpZGVTdHJpbmcgQ0ZYX0J5dGVTdHJpbmc6OlVURjhEZWNvZGUoKSBjb25zdCB7CisgIENGWF9VVEY4RGVjb2RlciBkZWNvZGVyOworICBmb3IgKEZYX1NUUlNJWkUgaSA9IDA7IGkgPCBHZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgZGVjb2Rlci5JbnB1dCgodWludDhfdCltX3BEYXRhLT5tX1N0cmluZ1tpXSk7CisgIH0KKyAgcmV0dXJuIGRlY29kZXIuR2V0UmVzdWx0KCk7Cit9CitDRlhfQnl0ZVN0cmluZyBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoY29uc3QgRlhfV0NIQVIqIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFIGxlbikgeworICBpZiAobGVuIDwgMCkgeworICAgIGxlbiA9IEZYU1lTX3djc2xlbihzdHIpOworICB9CisgIENGWF9CeXRlU3RyaW5nIGJzdHI7CisgIGJzdHIuQ29udmVydEZyb20oQ0ZYX1dpZGVTdHJpbmcoc3RyLCBsZW4pKTsKKyAgcmV0dXJuIGJzdHI7Cit9CitDRlhfQnl0ZVN0cmluZyBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikgeworICByZXR1cm4gRnJvbVVuaWNvZGUoc3RyLmNfc3RyKCksIHN0ci5HZXRMZW5ndGgoKSk7Cit9Cit2b2lkIENGWF9CeXRlU3RyaW5nOjpDb252ZXJ0RnJvbShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0NoYXJNYXAqIHBDaGFyTWFwKSB7CisgIGlmICghcENoYXJNYXApIHsKKyAgICBwQ2hhck1hcCA9IENGWF9DaGFyTWFwOjpHZXREZWZhdWx0TWFwcGVyKCk7CisgIH0KKyAgKnRoaXMgPSAoKnBDaGFyTWFwLT5tX0dldEJ5dGVTdHJpbmcpKHBDaGFyTWFwLCBzdHIpOworfQoraW50IENGWF9CeXRlU3RyaW5nOjpDb21wYXJlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSBjb25zdCB7CisgIGlmICghbV9wRGF0YSkgeworICAgIHJldHVybiBzdHIuSXNFbXB0eSgpID8gMCA6IC0xOworICB9CisgIGludCB0aGlzX2xlbiA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7CisgIGludCB0aGF0X2xlbiA9IHN0ci5HZXRMZW5ndGgoKTsKKyAgaW50IG1pbl9sZW4gPSB0aGlzX2xlbiA8IHRoYXRfbGVuID8gdGhpc19sZW4gOiB0aGF0X2xlbjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaW5fbGVuOyBpKyspIHsKKyAgICBpZiAoKHVpbnQ4X3QpbV9wRGF0YS0+bV9TdHJpbmdbaV0gPCBzdHIuR2V0QXQoaSkpIHsKKyAgICAgIHJldHVybiAtMTsKICAgICB9CisgICAgaWYgKCh1aW50OF90KW1fcERhdGEtPm1fU3RyaW5nW2ldID4gc3RyLkdldEF0KGkpKSB7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgaWYgKHRoaXNfbGVuIDwgdGhhdF9sZW4pIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKHRoaXNfbGVuID4gdGhhdF9sZW4pIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KK3ZvaWQgQ0ZYX0J5dGVTdHJpbmc6OlRyaW1SaWdodChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGxwc3pUYXJnZXRzKSB7CisgIGlmICghbV9wRGF0YSB8fCBscHN6VGFyZ2V0cy5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ29weUJlZm9yZVdyaXRlKCk7CisgIEZYX1NUUlNJWkUgcG9zID0gR2V0TGVuZ3RoKCk7CisgIGlmIChwb3MgPCAxKSB7CisgICAgcmV0dXJuOworICB9CisgIHdoaWxlIChwb3MpIHsKKyAgICBGWF9TVFJTSVpFIGkgPSAwOworICAgIHdoaWxlIChpIDwgbHBzelRhcmdldHMuR2V0TGVuZ3RoKCkgJiYKKyAgICAgICAgICAgbHBzelRhcmdldHNbaV0gIT0gbV9wRGF0YS0+bV9TdHJpbmdbcG9zIC0gMV0pIHsKKyAgICAgIGkrKzsKKyAgICB9CisgICAgaWYgKGkgPT0gbHBzelRhcmdldHMuR2V0TGVuZ3RoKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBwb3MtLTsKKyAgfQorICBpZiAocG9zIDwgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgeworICAgIG1fcERhdGEtPm1fU3RyaW5nW3Bvc10gPSAwOworICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBwb3M7CisgIH0KK30KK3ZvaWQgQ0ZYX0J5dGVTdHJpbmc6OlRyaW1SaWdodChGWF9DSEFSIGNoVGFyZ2V0KSB7CisgIFRyaW1SaWdodChDRlhfQnl0ZVN0cmluZ0MoY2hUYXJnZXQpKTsKK30KK3ZvaWQgQ0ZYX0J5dGVTdHJpbmc6OlRyaW1SaWdodCgpIHsKKyAgVHJpbVJpZ2h0KCJceDA5XHgwYVx4MGJceDBjXHgwZFx4MjAiKTsKK30KK3ZvaWQgQ0ZYX0J5dGVTdHJpbmc6OlRyaW1MZWZ0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbHBzelRhcmdldHMpIHsKKyAgaWYgKCFtX3BEYXRhKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChscHN6VGFyZ2V0cy5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ29weUJlZm9yZVdyaXRlKCk7CisgIEZYX1NUUlNJWkUgbGVuID0gR2V0TGVuZ3RoKCk7CisgIGlmIChsZW4gPCAxKSB7CisgICAgcmV0dXJuOworICB9CisgIEZYX1NUUlNJWkUgcG9zID0gMDsKKyAgd2hpbGUgKHBvcyA8IGxlbikgeworICAgIEZYX1NUUlNJWkUgaSA9IDA7CisgICAgd2hpbGUgKGkgPCBscHN6VGFyZ2V0cy5HZXRMZW5ndGgoKSAmJgorICAgICAgICAgICBscHN6VGFyZ2V0c1tpXSAhPSBtX3BEYXRhLT5tX1N0cmluZ1twb3NdKSB7CisgICAgICBpKys7CisgICAgfQorICAgIGlmIChpID09IGxwc3pUYXJnZXRzLkdldExlbmd0aCgpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgcG9zKys7CisgIH0KKyAgaWYgKHBvcykgeworICAgIEZYX1NUUlNJWkUgbkRhdGFMZW5ndGggPSBsZW4gLSBwb3M7CisgICAgRlhTWVNfbWVtbW92ZShtX3BEYXRhLT5tX1N0cmluZywgbV9wRGF0YS0+bV9TdHJpbmcgKyBwb3MsCisgICAgICAgICAgICAgICAgICAobkRhdGFMZW5ndGggKyAxKSAqIHNpemVvZihGWF9DSEFSKSk7CisgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IG5EYXRhTGVuZ3RoOworICB9Cit9Cit2b2lkIENGWF9CeXRlU3RyaW5nOjpUcmltTGVmdChGWF9DSEFSIGNoVGFyZ2V0KSB7CisgIFRyaW1MZWZ0KENGWF9CeXRlU3RyaW5nQyhjaFRhcmdldCkpOworfQordm9pZCBDRlhfQnl0ZVN0cmluZzo6VHJpbUxlZnQoKSB7CisgIFRyaW1MZWZ0KCJceDA5XHgwYVx4MGJceDBjXHgwZFx4MjAiKTsKK30KK0ZYX0RXT1JEIENGWF9CeXRlU3RyaW5nOjpHZXRJRChGWF9TVFJTSVpFIHN0YXJ0X3BvcykgY29uc3QgeworICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKCp0aGlzKS5HZXRJRChzdGFydF9wb3MpOworfQorRlhfRFdPUkQgQ0ZYX0J5dGVTdHJpbmdDOjpHZXRJRChGWF9TVFJTSVpFIHN0YXJ0X3BvcykgY29uc3QgeworICBpZiAobV9MZW5ndGggPT0gMCkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChzdGFydF9wb3MgPCAwIHx8IHN0YXJ0X3BvcyA+PSBtX0xlbmd0aCkgeworICAgIHJldHVybiAwOworICB9CisgIEZYX0RXT1JEIHN0cmlkID0gMDsKKyAgaWYgKHN0YXJ0X3BvcyArIDQgPiBtX0xlbmd0aCkgeworICAgIGZvciAoRlhfU1RSU0laRSBpID0gMDsgaSA8IG1fTGVuZ3RoIC0gc3RhcnRfcG9zOyBpKyspIHsKKyAgICAgIHN0cmlkID0gc3RyaWQgKiAyNTYgKyBtX1B0cltzdGFydF9wb3MgKyBpXTsKKyAgICB9CisgICAgc3RyaWQgPSBzdHJpZCA8PCAoKDQgLSBtX0xlbmd0aCArIHN0YXJ0X3BvcykgKiA4KTsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgc3RyaWQgPSBzdHJpZCAqIDI1NiArIG1fUHRyW3N0YXJ0X3BvcyArIGldOworICAgIH0KKyAgfQorICByZXR1cm4gc3RyaWQ7Cit9CitGWF9TVFJTSVpFIEZYX2Z0b2EoRlhfRkxPQVQgZCwgRlhfQ0hBUiogYnVmKSB7CisgIGJ1ZlswXSA9ICcwJzsKKyAgYnVmWzFdID0gJ1wwJzsKKyAgaWYgKGQgPT0gMC4wZikgeworICAgIHJldHVybiAxOworICB9CisgIEZYX0JPT0wgYk5lZ2F0aXZlID0gRkFMU0U7CisgIGlmIChkIDwgMCkgeworICAgIGJOZWdhdGl2ZSA9IFRSVUU7CisgICAgZCA9IC1kOworICB9CisgIGludCBzY2FsZSA9IDE7CisgIGludCBzY2FsZWQgPSBGWFNZU19yb3VuZChkKTsKKyAgd2hpbGUgKHNjYWxlZCA8IDEwMDAwMCkgeworICAgIGlmIChzY2FsZSA9PSAxMDAwMDAwKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgc2NhbGUgKj0gMTA7CisgICAgc2NhbGVkID0gRlhTWVNfcm91bmQoZCAqIHNjYWxlKTsKKyAgfQorICBpZiAoc2NhbGVkID09IDApIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICBjaGFyIGJ1ZjJbMzJdOworICBpbnQgYnVmX3NpemUgPSAwOworICBpZiAoYk5lZ2F0aXZlKSB7CisgICAgYnVmW2J1Zl9zaXplKytdID0gJy0nOworICB9CisgIGludCBpID0gc2NhbGVkIC8gc2NhbGU7CisgIEZYU1lTX2l0b2EoaSwgYnVmMiwgMTApOworICBGWF9TVFJTSVpFIGxlbiA9IEZYU1lTX3N0cmxlbihidWYyKTsKKyAgRlhTWVNfbWVtY3B5KGJ1ZiArIGJ1Zl9zaXplLCBidWYyLCBsZW4pOworICBidWZfc2l6ZSArPSBsZW47CisgIGludCBmcmFjdGlvbiA9IHNjYWxlZCAlIHNjYWxlOworICBpZiAoZnJhY3Rpb24gPT0gMCkgewogICAgIHJldHVybiBidWZfc2l6ZTsKKyAgfQorICBidWZbYnVmX3NpemUrK10gPSAnLic7CisgIHNjYWxlIC89IDEwOworICB3aGlsZSAoZnJhY3Rpb24pIHsKKyAgICBidWZbYnVmX3NpemUrK10gPSAnMCcgKyBmcmFjdGlvbiAvIHNjYWxlOworICAgIGZyYWN0aW9uICU9IHNjYWxlOworICAgIHNjYWxlIC89IDEwOworICB9CisgIHJldHVybiBidWZfc2l6ZTsKIH0KLUNGWF9CeXRlU3RyaW5nIENGWF9CeXRlU3RyaW5nOjpGb3JtYXRGbG9hdChGWF9GTE9BVCBkLCBpbnQgcHJlY2lzaW9uKQotewotICAgIEZYX0NIQVIgYnVmWzMyXTsKLSAgICBGWF9TVFJTSVpFIGxlbiA9IEZYX2Z0b2EoZCwgYnVmKTsKLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoYnVmLCBsZW4pOworQ0ZYX0J5dGVTdHJpbmcgQ0ZYX0J5dGVTdHJpbmc6OkZvcm1hdEZsb2F0KEZYX0ZMT0FUIGQsIGludCBwcmVjaXNpb24pIHsKKyAgRlhfQ0hBUiBidWZbMzJdOworICBGWF9TVFJTSVpFIGxlbiA9IEZYX2Z0b2EoZCwgYnVmKTsKKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKGJ1ZiwgbGVuKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2JzdHJpbmdfdW5pdHRlc3QuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfYnN0cmluZ191bml0dGVzdC5jcHAKaW5kZXggYmNkZDMzYi4uMzM3Nzc1ZCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfYnN0cmluZ191bml0dGVzdC5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfYnN0cmluZ191bml0dGVzdC5jcHAKQEAgLTIsMjUxICsyLDI1MSBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2Z4X3N0cmluZ190ZXN0aGVscGVycy5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL3Rlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgogCiBURVNUKGZ4Y3J0LCBCeXRlU3RyaW5nT3BlcmF0b3JTdWJzY3JpcHQpIHsKLSAgICAvLyBDRlhfQnl0ZVN0cmluZyBpbmNsdWRlcyB0aGUgTlVMIHRlcm1pbmF0b3IgZm9yIG5vbi1lbXB0eSBzdHJpbmdzLgotICAgIENGWF9CeXRlU3RyaW5nIGFiYygiYWJjIik7Ci0gICAgRVhQRUNUX0VRKCdhJywgYWJjWzBdKTsKLSAgICBFWFBFQ1RfRVEoJ2InLCBhYmNbMV0pOwotICAgIEVYUEVDVF9FUSgnYycsIGFiY1syXSk7Ci0gICAgRVhQRUNUX0VRKDAsIGFiY1szXSk7CisgIC8vIENGWF9CeXRlU3RyaW5nIGluY2x1ZGVzIHRoZSBOVUwgdGVybWluYXRvciBmb3Igbm9uLWVtcHR5IHN0cmluZ3MuCisgIENGWF9CeXRlU3RyaW5nIGFiYygiYWJjIik7CisgIEVYUEVDVF9FUSgnYScsIGFiY1swXSk7CisgIEVYUEVDVF9FUSgnYicsIGFiY1sxXSk7CisgIEVYUEVDVF9FUSgnYycsIGFiY1syXSk7CisgIEVYUEVDVF9FUSgwLCBhYmNbM10pOwogfQogCiBURVNUKGZ4Y3J0LCBCeXRlU3RyaW5nT3BlcmF0b3JMVCkgewotICAgIENGWF9CeXRlU3RyaW5nIGVtcHR5OwotICAgIENGWF9CeXRlU3RyaW5nIGEoImEiKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBhYmMoImFiYyIpOwotICAgIENGWF9CeXRlU3RyaW5nIGRlZigiZGVmIik7CisgIENGWF9CeXRlU3RyaW5nIGVtcHR5OworICBDRlhfQnl0ZVN0cmluZyBhKCJhIik7CisgIENGWF9CeXRlU3RyaW5nIGFiYygiYWJjIik7CisgIENGWF9CeXRlU3RyaW5nIGRlZigiZGVmIik7CiAKLSAgICBFWFBFQ1RfRkFMU0UoZW1wdHkgPCBlbXB0eSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGEgPCBhKTsKLSAgICBFWFBFQ1RfRkFMU0UoYWJjIDwgYWJjKTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVmIDwgZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5IDwgZW1wdHkpOworICBFWFBFQ1RfRkFMU0UoYSA8IGEpOworICBFWFBFQ1RfRkFMU0UoYWJjIDwgYWJjKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGRlZik7CiAKLSAgICBFWFBFQ1RfVFJVRShlbXB0eSA8IGEpOwotICAgIEVYUEVDVF9GQUxTRShhIDwgZW1wdHkpOworICBFWFBFQ1RfVFJVRShlbXB0eSA8IGEpOworICBFWFBFQ1RfRkFMU0UoYSA8IGVtcHR5KTsKIAotICAgIEVYUEVDVF9UUlVFKGVtcHR5IDwgYWJjKTsKLSAgICBFWFBFQ1RfRkFMU0UoYWJjIDwgZW1wdHkpOworICBFWFBFQ1RfVFJVRShlbXB0eSA8IGFiYyk7CisgIEVYUEVDVF9GQUxTRShhYmMgPCBlbXB0eSk7CiAKLSAgICBFWFBFQ1RfVFJVRShlbXB0eSA8IGRlZik7Ci0gICAgRVhQRUNUX0ZBTFNFKGRlZiA8IGVtcHR5KTsKKyAgRVhQRUNUX1RSVUUoZW1wdHkgPCBkZWYpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgZW1wdHkpOwogCi0gICAgRVhQRUNUX1RSVUUoYSA8IGFiYyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGFiYyA8IGEpOworICBFWFBFQ1RfVFJVRShhIDwgYWJjKTsKKyAgRVhQRUNUX0ZBTFNFKGFiYyA8IGEpOwogCi0gICAgRVhQRUNUX1RSVUUoYSA8IGRlZik7Ci0gICAgRVhQRUNUX0ZBTFNFKGRlZiA8IGEpOworICBFWFBFQ1RfVFJVRShhIDwgZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGEpOwogCi0gICAgRVhQRUNUX1RSVUUoYWJjIDwgZGVmKTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVmIDwgYWJjKTsKKyAgRVhQRUNUX1RSVUUoYWJjIDwgZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGFiYyk7CiB9CiAKIFRFU1QoZnhjcnQsIEJ5dGVTdHJpbmdPcGVyYXRvckVRKSB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgbnVsbF9zdHJpbmc7Ci0gICAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gbnVsbF9zdHJpbmcpOworICBDRlhfQnl0ZVN0cmluZyBudWxsX3N0cmluZzsKKyAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gbnVsbF9zdHJpbmcpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcgZW1wdHlfc3RyaW5nKCIiKTsKLSAgICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gbnVsbF9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7CisgIENGWF9CeXRlU3RyaW5nIGVtcHR5X3N0cmluZygiIik7CisgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcgZGVsZXRlZF9zdHJpbmcoImhlbGxvIik7Ci0gICAgZGVsZXRlZF9zdHJpbmcuRGVsZXRlKDAsIDUpOwotICAgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IGRlbGV0ZWRfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBudWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBkZWxldGVkX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IGRlbGV0ZWRfc3RyaW5nKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgZGVsZXRlZF9zdHJpbmcoImhlbGxvIik7CisgIGRlbGV0ZWRfc3RyaW5nLkRlbGV0ZSgwLCA1KTsKKyAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gZGVsZXRlZF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IGRlbGV0ZWRfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IGRlbGV0ZWRfc3RyaW5nKTsKIAotICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nKCJoZWxsbyIpOwotICAgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nID09IGJ5dGVfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgPT0gbnVsbF9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBkZWxldGVkX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nID09IGJ5dGVfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nID09IGJ5dGVfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgPT0gYnl0ZV9zdHJpbmcpOworICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZygiaGVsbG8iKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgPT0gYnl0ZV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgPT0gbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nID09IGRlbGV0ZWRfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nID09IGJ5dGVfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyA9PSBieXRlX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyA9PSBieXRlX3N0cmluZyk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZ19zYW1lMSgiaGVsbG8iKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyA9PSBieXRlX3N0cmluZ19zYW1lMSk7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfc2FtZTEgPT0gYnl0ZV9zdHJpbmcpOworICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZ19zYW1lMSgiaGVsbG8iKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgPT0gYnl0ZV9zdHJpbmdfc2FtZTEpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19zYW1lMSA9PSBieXRlX3N0cmluZyk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZ19zYW1lMihieXRlX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgPT0gYnl0ZV9zdHJpbmdfc2FtZTIpOwotICAgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX3NhbWUyID09IGJ5dGVfc3RyaW5nKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmdfc2FtZTIoYnl0ZV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyA9PSBieXRlX3N0cmluZ19zYW1lMik7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX3NhbWUyID09IGJ5dGVfc3RyaW5nKTsKIAotICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nMSgiaGUiKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZzIoImhlbGxwIik7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmczKCJoZWxsb2QiKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgPT0gYnl0ZV9zdHJpbmcxKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgPT0gYnl0ZV9zdHJpbmcyKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgPT0gYnl0ZV9zdHJpbmczKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcxID09IGJ5dGVfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcyID09IGJ5dGVfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmczID09IGJ5dGVfc3RyaW5nKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmcxKCJoZSIpOworICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZzIoImhlbGxwIik7CisgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nMygiaGVsbG9kIik7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBieXRlX3N0cmluZzEpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgPT0gYnl0ZV9zdHJpbmcyKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nID09IGJ5dGVfc3RyaW5nMyk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZzEgPT0gYnl0ZV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcyID09IGJ5dGVfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nMyA9PSBieXRlX3N0cmluZyk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZ0MgbnVsbF9zdHJpbmdfYzsKLSAgICBDRlhfQnl0ZVN0cmluZ0MgZW1wdHlfc3RyaW5nX2MoIiIpOwotICAgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IG51bGxfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IGVtcHR5X3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gbnVsbF9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IGVtcHR5X3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBudWxsX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBlbXB0eV9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmdfYyA9PSBudWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nX2MgPT0gbnVsbF9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nX2MgPT0gZW1wdHlfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmdfYyA9PSBlbXB0eV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nX2MgPT0gZGVsZXRlZF9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZ19jID09IGRlbGV0ZWRfc3RyaW5nKTsKKyAgQ0ZYX0J5dGVTdHJpbmdDIG51bGxfc3RyaW5nX2M7CisgIENGWF9CeXRlU3RyaW5nQyBlbXB0eV9zdHJpbmdfYygiIik7CisgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IG51bGxfc3RyaW5nX2MpOworICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBlbXB0eV9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyA9PSBudWxsX3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IGVtcHR5X3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gbnVsbF9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IGVtcHR5X3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmdfYyA9PSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZ19jID09IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmdfYyA9PSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmdfYyA9PSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZ19jID09IGRlbGV0ZWRfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nX2MgPT0gZGVsZXRlZF9zdHJpbmcpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2Nfc2FtZTEoImhlbGxvIik7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgPT0gYnl0ZV9zdHJpbmdfY19zYW1lMSk7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfY19zYW1lMSA9PSBieXRlX3N0cmluZyk7CisgIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jX3NhbWUxKCJoZWxsbyIpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyA9PSBieXRlX3N0cmluZ19jX3NhbWUxKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfY19zYW1lMSA9PSBieXRlX3N0cmluZyk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfYzEoImhlIik7Ci0gICAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2MyKCJoZWxscCIpOwotICAgIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jMygiaGVsbG9kIik7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nID09IGJ5dGVfc3RyaW5nX2MxKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgPT0gYnl0ZV9zdHJpbmdfYzIpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBieXRlX3N0cmluZ19jMyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MxID09IGJ5dGVfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYzIgPT0gYnl0ZV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jMyA9PSBieXRlX3N0cmluZyk7CisgIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jMSgiaGUiKTsKKyAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2MyKCJoZWxscCIpOworICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfYzMoImhlbGxvZCIpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgPT0gYnl0ZV9zdHJpbmdfYzEpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgPT0gYnl0ZV9zdHJpbmdfYzIpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgPT0gYnl0ZV9zdHJpbmdfYzMpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYzEgPT0gYnl0ZV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYzIgPT0gYnl0ZV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYzMgPT0gYnl0ZV9zdHJpbmcpOwogCi0gICAgY29uc3QgY2hhciogY19udWxsX3N0cmluZyA9IG51bGxwdHI7Ci0gICAgY29uc3QgY2hhciogY19lbXB0eV9zdHJpbmcgPSAiIjsKLSAgICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBjX251bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBjX2VtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IGNfbnVsbF9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyA9PSBjX2VtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gY19udWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gY19lbXB0eV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGNfbnVsbF9zdHJpbmcgPT0gbnVsbF9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGNfZW1wdHlfc3RyaW5nID09IG51bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShjX251bGxfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoY19lbXB0eV9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShjX251bGxfc3RyaW5nID09IGRlbGV0ZWRfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShjX2VtcHR5X3N0cmluZyA9PSBkZWxldGVkX3N0cmluZyk7CisgIGNvbnN0IGNoYXIqIGNfbnVsbF9zdHJpbmcgPSBudWxscHRyOworICBjb25zdCBjaGFyKiBjX2VtcHR5X3N0cmluZyA9ICIiOworICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBjX251bGxfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gY19lbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gY19udWxsX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyA9PSBjX2VtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IGNfbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBjX2VtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGNfbnVsbF9zdHJpbmcgPT0gbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShjX2VtcHR5X3N0cmluZyA9PSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGNfbnVsbF9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoY19lbXB0eV9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoY19udWxsX3N0cmluZyA9PSBkZWxldGVkX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGNfZW1wdHlfc3RyaW5nID09IGRlbGV0ZWRfc3RyaW5nKTsKIAotICAgIGNvbnN0IGNoYXIqIGNfc3RyaW5nX3NhbWUxID0gImhlbGxvIjsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyA9PSBjX3N0cmluZ19zYW1lMSk7Ci0gICAgRVhQRUNUX1RSVUUoY19zdHJpbmdfc2FtZTEgPT0gYnl0ZV9zdHJpbmcpOworICBjb25zdCBjaGFyKiBjX3N0cmluZ19zYW1lMSA9ICJoZWxsbyI7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nID09IGNfc3RyaW5nX3NhbWUxKTsKKyAgRVhQRUNUX1RSVUUoY19zdHJpbmdfc2FtZTEgPT0gYnl0ZV9zdHJpbmcpOwogCi0gICAgY29uc3QgY2hhciogY19zdHJpbmcxID0gImhlIjsKLSAgICBjb25zdCBjaGFyKiBjX3N0cmluZzIgPSAiaGVsbHAiOwotICAgIGNvbnN0IGNoYXIqIGNfc3RyaW5nMyA9ICJoZWxsb2QiOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBjX3N0cmluZzEpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBjX3N0cmluZzIpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBjX3N0cmluZzMpOwotICAgIEVYUEVDVF9GQUxTRShjX3N0cmluZzEgPT0gYnl0ZV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShjX3N0cmluZzIgPT0gYnl0ZV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShjX3N0cmluZzMgPT0gYnl0ZV9zdHJpbmcpOworICBjb25zdCBjaGFyKiBjX3N0cmluZzEgPSAiaGUiOworICBjb25zdCBjaGFyKiBjX3N0cmluZzIgPSAiaGVsbHAiOworICBjb25zdCBjaGFyKiBjX3N0cmluZzMgPSAiaGVsbG9kIjsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nID09IGNfc3RyaW5nMSk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBjX3N0cmluZzIpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgPT0gY19zdHJpbmczKTsKKyAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMSA9PSBieXRlX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShjX3N0cmluZzIgPT0gYnl0ZV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoY19zdHJpbmczID09IGJ5dGVfc3RyaW5nKTsKIH0KIAogVEVTVChmeGNydCwgQnl0ZVN0cmluZ09wZXJhdG9yTkUpIHsKLSAgICBDRlhfQnl0ZVN0cmluZyBudWxsX3N0cmluZzsKLSAgICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gbnVsbF9zdHJpbmcpOworICBDRlhfQnl0ZVN0cmluZyBudWxsX3N0cmluZzsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IG51bGxfc3RyaW5nKTsKIAotICAgIENGWF9CeXRlU3RyaW5nIGVtcHR5X3N0cmluZygiIik7Ci0gICAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyAhPSBlbXB0eV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gbnVsbF9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBlbXB0eV9zdHJpbmcpOworICBDRlhfQnl0ZVN0cmluZyBlbXB0eV9zdHJpbmcoIiIpOworICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nKTsKIAotICAgIENGWF9CeXRlU3RyaW5nIGRlbGV0ZWRfc3RyaW5nKCJoZWxsbyIpOwotICAgIGRlbGV0ZWRfc3RyaW5nLkRlbGV0ZSgwLCA1KTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBudWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IGRlbGV0ZWRfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7CisgIENGWF9CeXRlU3RyaW5nIGRlbGV0ZWRfc3RyaW5nKCJoZWxsbyIpOworICBkZWxldGVkX3N0cmluZy5EZWxldGUoMCwgNSk7CisgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IGRlbGV0ZWRfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IGRlbGV0ZWRfc3RyaW5nKTsKIAotICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nKCJoZWxsbyIpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyAhPSBieXRlX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgIT0gbnVsbF9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nICE9IGJ5dGVfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgIT0gYnl0ZV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nICE9IGJ5dGVfc3RyaW5nKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmcoImhlbGxvIik7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyAhPSBieXRlX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nICE9IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyAhPSBieXRlX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyAhPSBieXRlX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nICE9IGJ5dGVfc3RyaW5nKTsKIAotICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nX3NhbWUxKCJoZWxsbyIpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyAhPSBieXRlX3N0cmluZ19zYW1lMSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX3NhbWUxICE9IGJ5dGVfc3RyaW5nKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmdfc2FtZTEoImhlbGxvIik7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyAhPSBieXRlX3N0cmluZ19zYW1lMSk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19zYW1lMSAhPSBieXRlX3N0cmluZyk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZ19zYW1lMihieXRlX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nICE9IGJ5dGVfc3RyaW5nX3NhbWUyKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfc2FtZTIgIT0gYnl0ZV9zdHJpbmcpOworICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZ19zYW1lMihieXRlX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyAhPSBieXRlX3N0cmluZ19zYW1lMik7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19zYW1lMiAhPSBieXRlX3N0cmluZyk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZzEoImhlIik7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmcyKCJoZWxscCIpOwotICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nMygiaGVsbG9kIik7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgIT0gYnl0ZV9zdHJpbmcxKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBieXRlX3N0cmluZzIpOwotICAgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nICE9IGJ5dGVfc3RyaW5nMyk7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcxICE9IGJ5dGVfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZzIgIT0gYnl0ZV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nMyAhPSBieXRlX3N0cmluZyk7CisgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nMSgiaGUiKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmcyKCJoZWxscCIpOworICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZzMoImhlbGxvZCIpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBieXRlX3N0cmluZzEpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBieXRlX3N0cmluZzIpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBieXRlX3N0cmluZzMpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZzEgIT0gYnl0ZV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZzIgIT0gYnl0ZV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZzMgIT0gYnl0ZV9zdHJpbmcpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmdDIG51bGxfc3RyaW5nX2M7Ci0gICAgQ0ZYX0J5dGVTdHJpbmdDIGVtcHR5X3N0cmluZ19jKCIiKTsKLSAgICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gbnVsbF9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGVtcHR5X3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IG51bGxfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZ19jICE9IG51bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nX2MgIT0gbnVsbF9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZ19jICE9IGVtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZ19jICE9IGVtcHR5X3N0cmluZyk7CisgIENGWF9CeXRlU3RyaW5nQyBudWxsX3N0cmluZ19jOworICBDRlhfQnl0ZVN0cmluZ0MgZW1wdHlfc3RyaW5nX2MoIiIpOworICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gbnVsbF9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBlbXB0eV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gbnVsbF9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nX2MpOworICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmdfYyAhPSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmdfYyAhPSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZ19jICE9IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmdfYyAhPSBlbXB0eV9zdHJpbmcpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2Nfc2FtZTEoImhlbGxvIik7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nICE9IGJ5dGVfc3RyaW5nX2Nfc2FtZTEpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jX3NhbWUxICE9IGJ5dGVfc3RyaW5nKTsKKyAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2Nfc2FtZTEoImhlbGxvIik7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyAhPSBieXRlX3N0cmluZ19jX3NhbWUxKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2Nfc2FtZTEgIT0gYnl0ZV9zdHJpbmcpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2MxKCJoZSIpOwotICAgIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jMigiaGVsbHAiKTsKLSAgICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfYzMoImhlbGxvZCIpOwotICAgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nICE9IGJ5dGVfc3RyaW5nX2MxKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBieXRlX3N0cmluZ19jMik7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgIT0gYnl0ZV9zdHJpbmdfYzMpOwotICAgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MxICE9IGJ5dGVfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jMiAhPSBieXRlX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYzMgIT0gYnl0ZV9zdHJpbmcpOworICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfYzEoImhlIik7CisgIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jMigiaGVsbHAiKTsKKyAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2MzKCJoZWxsb2QiKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgIT0gYnl0ZV9zdHJpbmdfYzEpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBieXRlX3N0cmluZ19jMik7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nICE9IGJ5dGVfc3RyaW5nX2MzKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYzEgIT0gYnl0ZV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jMiAhPSBieXRlX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MzICE9IGJ5dGVfc3RyaW5nKTsKIAotICAgIGNvbnN0IGNoYXIqIGNfbnVsbF9zdHJpbmcgPSBudWxscHRyOwotICAgIGNvbnN0IGNoYXIqIGNfZW1wdHlfc3RyaW5nID0gIiI7Ci0gICAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGNfbnVsbF9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBjX2VtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyAhPSBjX251bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IGNfZW1wdHlfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gY19udWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IGNfZW1wdHlfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoY19udWxsX3N0cmluZyAhPSBudWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGNfZW1wdHlfc3RyaW5nICE9IG51bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoY19udWxsX3N0cmluZyAhPSBlbXB0eV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShjX2VtcHR5X3N0cmluZyAhPSBlbXB0eV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShjX251bGxfc3RyaW5nICE9IGRlbGV0ZWRfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoY19lbXB0eV9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOworICBjb25zdCBjaGFyKiBjX251bGxfc3RyaW5nID0gbnVsbHB0cjsKKyAgY29uc3QgY2hhciogY19lbXB0eV9zdHJpbmcgPSAiIjsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGNfbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gY19lbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IGNfbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IGNfZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IGNfbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gY19lbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoY19udWxsX3N0cmluZyAhPSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShjX2VtcHR5X3N0cmluZyAhPSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShjX251bGxfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShjX2VtcHR5X3N0cmluZyAhPSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoY19udWxsX3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShjX2VtcHR5X3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7CiAKLSAgICBjb25zdCBjaGFyKiBjX3N0cmluZ19zYW1lMSA9ICJoZWxsbyI7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nICE9IGNfc3RyaW5nX3NhbWUxKTsKLSAgICBFWFBFQ1RfRkFMU0UoY19zdHJpbmdfc2FtZTEgIT0gYnl0ZV9zdHJpbmcpOworICBjb25zdCBjaGFyKiBjX3N0cmluZ19zYW1lMSA9ICJoZWxsbyI7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyAhPSBjX3N0cmluZ19zYW1lMSk7CisgIEVYUEVDVF9GQUxTRShjX3N0cmluZ19zYW1lMSAhPSBieXRlX3N0cmluZyk7CiAKLSAgICBjb25zdCBjaGFyKiBjX3N0cmluZzEgPSAiaGUiOwotICAgIGNvbnN0IGNoYXIqIGNfc3RyaW5nMiA9ICJoZWxscCI7Ci0gICAgY29uc3QgY2hhciogY19zdHJpbmczID0gImhlbGxvZCI7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgIT0gY19zdHJpbmcxKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBjX3N0cmluZzIpOwotICAgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nICE9IGNfc3RyaW5nMyk7Ci0gICAgRVhQRUNUX1RSVUUoY19zdHJpbmcxICE9IGJ5dGVfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShjX3N0cmluZzIgIT0gYnl0ZV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGNfc3RyaW5nMyAhPSBieXRlX3N0cmluZyk7CisgIGNvbnN0IGNoYXIqIGNfc3RyaW5nMSA9ICJoZSI7CisgIGNvbnN0IGNoYXIqIGNfc3RyaW5nMiA9ICJoZWxscCI7CisgIGNvbnN0IGNoYXIqIGNfc3RyaW5nMyA9ICJoZWxsb2QiOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBjX3N0cmluZzEpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBjX3N0cmluZzIpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBjX3N0cmluZzMpOworICBFWFBFQ1RfVFJVRShjX3N0cmluZzEgIT0gYnl0ZV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShjX3N0cmluZzIgIT0gYnl0ZV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShjX3N0cmluZzMgIT0gYnl0ZV9zdHJpbmcpOwogfQogCiBURVNUKGZ4Y3J0LCBCeXRlU3RyaW5nQ051bGwpIHsKQEAgLTI3OCw3ICsyNzgsNyBAQAogICBFWFBFQ1RfRVEobnVsbF9zdHJpbmcsIGFzc2lnbmVkX251bGxfc3RyaW5nKTsKIAogICBDRlhfQnl0ZVN0cmluZ0MgYXNzaWduZWRfbnVsbHB0cl9zdHJpbmcoImluaXRpYWxseSBub3QgTlVMTCIpOwotICBhc3NpZ25lZF9udWxscHRyX3N0cmluZyA9IChGWF9MUENTVFIpbnVsbHB0cjsKKyAgYXNzaWduZWRfbnVsbHB0cl9zdHJpbmcgPSAoY29uc3QgRlhfQ0hBUiopbnVsbHB0cjsKICAgRVhQRUNUX0VRKGFzc2lnbmVkX251bGxwdHJfc3RyaW5nLkdldFB0cigpLCBudWxscHRyKTsKICAgRVhQRUNUX0VRKGFzc2lnbmVkX251bGxwdHJfc3RyaW5nLkdldExlbmd0aCgpLCAwKTsKICAgRVhQRUNUX1RSVUUoYXNzaWduZWRfbnVsbHB0cl9zdHJpbmcuSXNFbXB0eSgpKTsKQEAgLTI4OSwzMCArMjg5LDMwIEBACiB9CiAKIFRFU1QoZnhjcnQsIEJ5dGVTdHJpbmdDb25jYXRJblBsYWNlKSB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgZnJlZDsKLSAgICBmcmVkLkNvbmNhdEluUGxhY2UoNCwgIkZSRUQiKTsKLSAgICBFWFBFQ1RfRVEoIkZSRUQiLCBmcmVkKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgZnJlZDsKKyAgZnJlZC5Db25jYXRJblBsYWNlKDQsICJGUkVEIik7CisgIEVYUEVDVF9FUSgiRlJFRCIsIGZyZWQpOwogCi0gICAgZnJlZC5Db25jYXRJblBsYWNlKDIsICJEWSIpOwotICAgIEVYUEVDVF9FUSgiRlJFRERZIiwgZnJlZCk7CisgIGZyZWQuQ29uY2F0SW5QbGFjZSgyLCAiRFkiKTsKKyAgRVhQRUNUX0VRKCJGUkVERFkiLCBmcmVkKTsKIAotICAgIGZyZWQuRGVsZXRlKDMsIDMpOwotICAgIEVYUEVDVF9FUSgiRlJFIiwgZnJlZCk7CisgIGZyZWQuRGVsZXRlKDMsIDMpOworICBFWFBFQ1RfRVEoIkZSRSIsIGZyZWQpOwogCi0gICAgZnJlZC5Db25jYXRJblBsYWNlKDEsICJEIik7Ci0gICAgRVhQRUNUX0VRKCJGUkVEIiwgZnJlZCk7CisgIGZyZWQuQ29uY2F0SW5QbGFjZSgxLCAiRCIpOworICBFWFBFQ1RfRVEoIkZSRUQiLCBmcmVkKTsKIAotICAgIENGWF9CeXRlU3RyaW5nIGNvcHkgPSBmcmVkOwotICAgIGZyZWQuQ29uY2F0SW5QbGFjZSgyLCAiRFkiKTsKLSAgICBFWFBFQ1RfRVEoIkZSRUREWSIsIGZyZWQpOwotICAgIEVYUEVDVF9FUSgiRlJFRCIsIGNvcHkpOworICBDRlhfQnl0ZVN0cmluZyBjb3B5ID0gZnJlZDsKKyAgZnJlZC5Db25jYXRJblBsYWNlKDIsICJEWSIpOworICBFWFBFQ1RfRVEoIkZSRUREWSIsIGZyZWQpOworICBFWFBFQ1RfRVEoIkZSRUQiLCBjb3B5KTsKIAotICAgIC8vIFRlc3QgaW52YWxpZCBhcmd1bWVudHMuCi0gICAgY29weSA9IGZyZWQ7Ci0gICAgZnJlZC5Db25jYXRJblBsYWNlKC02LCAiZnJlZGR5Iik7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgbm90X2FsaWFzZWQoInh4eHh4eCIpOwotICAgIEVYUEVDVF9FUSgiRlJFRERZIiwgZnJlZCk7Ci0gICAgRVhQRUNUX0VRKCJ4eHh4eHgiLCBub3RfYWxpYXNlZCk7CisgIC8vIFRlc3QgaW52YWxpZCBhcmd1bWVudHMuCisgIGNvcHkgPSBmcmVkOworICBmcmVkLkNvbmNhdEluUGxhY2UoLTYsICJmcmVkZHkiKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgbm90X2FsaWFzZWQoInh4eHh4eCIpOworICBFWFBFQ1RfRVEoIkZSRUREWSIsIGZyZWQpOworICBFWFBFQ1RfRVEoInh4eHh4eCIsIG5vdF9hbGlhc2VkKTsKIH0KIAogVEVTVChmeGNydCwgQnl0ZVN0cmluZ0NOb3ROdWxsKSB7CkBAIC00MDksOCArNDA5LDggQEAKICAgRVhQRUNUX0VRKEZYQlNUUl9JRCgnYicsICdjJywgJ2QnLCAnZScpLCBsb25nZXJfc3RyaW5nLkdldElEKDEpKTsKICAgRVhQRUNUX0VRKEZYQlNUUl9JRCgnYycsICdkJywgJ2UnLCAnZicpLCBsb25nZXJfc3RyaW5nLkdldElEKDIpKTsKICAgRVhQRUNUX0VRKEZYQlNUUl9JRCgnZCcsICdlJywgJ2YnLCAwKSwgbG9uZ2VyX3N0cmluZy5HZXRJRCgzKSk7Ci0gIEVYUEVDVF9FUShGWEJTVFJfSUQoJ2UnLCAnZicsIDAgLCAwKSwgbG9uZ2VyX3N0cmluZy5HZXRJRCg0KSk7Ci0gIEVYUEVDVF9FUShGWEJTVFJfSUQoJ2YnLCAwICwgMCwgMCksIGxvbmdlcl9zdHJpbmcuR2V0SUQoNSkpOworICBFWFBFQ1RfRVEoRlhCU1RSX0lEKCdlJywgJ2YnLCAwLCAwKSwgbG9uZ2VyX3N0cmluZy5HZXRJRCg0KSk7CisgIEVYUEVDVF9FUShGWEJTVFJfSUQoJ2YnLCAwLCAwLCAwKSwgbG9uZ2VyX3N0cmluZy5HZXRJRCg1KSk7CiAgIEVYUEVDVF9FUSgwdSwgbG9uZ2VyX3N0cmluZy5HZXRJRCg2KSk7CiAgIEVYUEVDVF9FUSgwdSwgbG9uZ2VyX3N0cmluZy5HZXRJRCgtMSkpOwogICBFWFBFQ1RfRVEoMHUsIGxvbmdlcl9zdHJpbmcuR2V0SUQoLTEwMDAwMDApKTsKQEAgLTQ2MiwxNDQgKzQ2MiwyMjggQEAKIH0KIAogVEVTVChmeGNydCwgQnl0ZVN0cmluZ0NPcGVyYXRvclN1YnNjcmlwdCkgewotICAgIC8vIENGWF9CeXRlU3RyaW5nQyBpbmNsdWRlcyB0aGUgTlVMIHRlcm1pbmF0b3IgZm9yIG5vbi1lbXB0eSBzdHJpbmdzLgotICAgIENGWF9CeXRlU3RyaW5nQyBhYmMoImFiYyIpOwotICAgIEVYUEVDVF9FUSgnYScsIGFiY1swXSk7Ci0gICAgRVhQRUNUX0VRKCdiJywgYWJjWzFdKTsKLSAgICBFWFBFQ1RfRVEoJ2MnLCBhYmNbMl0pOwotICAgIEVYUEVDVF9FUSgwLCBhYmNbM10pOworICAvLyBDRlhfQnl0ZVN0cmluZ0MgaW5jbHVkZXMgdGhlIE5VTCB0ZXJtaW5hdG9yIGZvciBub24tZW1wdHkgc3RyaW5ncy4KKyAgQ0ZYX0J5dGVTdHJpbmdDIGFiYygiYWJjIik7CisgIEVYUEVDVF9FUSgnYScsIGFiY1swXSk7CisgIEVYUEVDVF9FUSgnYicsIGFiY1sxXSk7CisgIEVYUEVDVF9FUSgnYycsIGFiY1syXSk7CisgIEVYUEVDVF9FUSgwLCBhYmNbM10pOwogfQogCiBURVNUKGZ4Y3J0LCBCeXRlU3RyaW5nQ09wZXJhdG9yTFQpIHsKLSAgICBDRlhfQnl0ZVN0cmluZ0MgZW1wdHk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmdDIGEoImEiKTsKLSAgICBDRlhfQnl0ZVN0cmluZ0MgYWJjKCJhYmMiKTsKLSAgICBDRlhfQnl0ZVN0cmluZ0MgZGVmKCJkZWYiKTsKKyAgQ0ZYX0J5dGVTdHJpbmdDIGVtcHR5OworICBDRlhfQnl0ZVN0cmluZ0MgYSgiYSIpOworICBDRlhfQnl0ZVN0cmluZ0MgYWJjKCJhYmMiKTsKKyAgQ0ZYX0J5dGVTdHJpbmdDIGRlZigiZGVmIik7CiAKLSAgICBFWFBFQ1RfRkFMU0UoZW1wdHkgPCBlbXB0eSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGEgPCBhKTsKLSAgICBFWFBFQ1RfRkFMU0UoYWJjIDwgYWJjKTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVmIDwgZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5IDwgZW1wdHkpOworICBFWFBFQ1RfRkFMU0UoYSA8IGEpOworICBFWFBFQ1RfRkFMU0UoYWJjIDwgYWJjKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGRlZik7CiAKLSAgICBFWFBFQ1RfVFJVRShlbXB0eSA8IGEpOwotICAgIEVYUEVDVF9GQUxTRShhIDwgZW1wdHkpOworICBFWFBFQ1RfVFJVRShlbXB0eSA8IGEpOworICBFWFBFQ1RfRkFMU0UoYSA8IGVtcHR5KTsKIAotICAgIEVYUEVDVF9UUlVFKGVtcHR5IDwgYWJjKTsKLSAgICBFWFBFQ1RfRkFMU0UoYWJjIDwgZW1wdHkpOworICBFWFBFQ1RfVFJVRShlbXB0eSA8IGFiYyk7CisgIEVYUEVDVF9GQUxTRShhYmMgPCBlbXB0eSk7CiAKLSAgICBFWFBFQ1RfVFJVRShlbXB0eSA8IGRlZik7Ci0gICAgRVhQRUNUX0ZBTFNFKGRlZiA8IGVtcHR5KTsKKyAgRVhQRUNUX1RSVUUoZW1wdHkgPCBkZWYpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgZW1wdHkpOwogCi0gICAgRVhQRUNUX1RSVUUoYSA8IGFiYyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGFiYyA8IGEpOworICBFWFBFQ1RfVFJVRShhIDwgYWJjKTsKKyAgRVhQRUNUX0ZBTFNFKGFiYyA8IGEpOwogCi0gICAgRVhQRUNUX1RSVUUoYSA8IGRlZik7Ci0gICAgRVhQRUNUX0ZBTFNFKGRlZiA8IGEpOworICBFWFBFQ1RfVFJVRShhIDwgZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGEpOwogCi0gICAgRVhQRUNUX1RSVUUoYWJjIDwgZGVmKTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVmIDwgYWJjKTsKKyAgRVhQRUNUX1RSVUUoYWJjIDwgZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGFiYyk7CiB9CiAKIFRFU1QoZnhjcnQsIEJ5dGVTdHJpbmdDT3BlcmF0b3JFUSkgewotICAgIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jKCJoZWxsbyIpOwotICAgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MgPT0gYnl0ZV9zdHJpbmdfYyk7CisgIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jKCJoZWxsbyIpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jID09IGJ5dGVfc3RyaW5nX2MpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2Nfc2FtZTEoImhlbGxvIik7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyA9PSBieXRlX3N0cmluZ19jX3NhbWUxKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jX3NhbWUxID09IGJ5dGVfc3RyaW5nX2MpOworICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfY19zYW1lMSgiaGVsbG8iKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyA9PSBieXRlX3N0cmluZ19jX3NhbWUxKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfY19zYW1lMSA9PSBieXRlX3N0cmluZ19jKTsKIAotICAgIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jX3NhbWUyKGJ5dGVfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MgPT0gYnl0ZV9zdHJpbmdfY19zYW1lMik7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfY19zYW1lMiA9PSBieXRlX3N0cmluZ19jKTsKKyAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2Nfc2FtZTIoYnl0ZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MgPT0gYnl0ZV9zdHJpbmdfY19zYW1lMik7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2Nfc2FtZTIgPT0gYnl0ZV9zdHJpbmdfYyk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfYzEoImhlIik7Ci0gICAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2MyKCJoZWxscCIpOwotICAgIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jMygiaGVsbG9kIik7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MgPT0gYnl0ZV9zdHJpbmdfYzEpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jID09IGJ5dGVfc3RyaW5nX2MyKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyA9PSBieXRlX3N0cmluZ19jMyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MxID09IGJ5dGVfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jMiA9PSBieXRlX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYzMgPT0gYnl0ZV9zdHJpbmdfYyk7CisgIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jMSgiaGUiKTsKKyAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2MyKCJoZWxscCIpOworICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfYzMoImhlbGxvZCIpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyA9PSBieXRlX3N0cmluZ19jMSk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jID09IGJ5dGVfc3RyaW5nX2MyKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MgPT0gYnl0ZV9zdHJpbmdfYzMpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYzEgPT0gYnl0ZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jMiA9PSBieXRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MzID09IGJ5dGVfc3RyaW5nX2MpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmdfc2FtZTEoImhlbGxvIik7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyA9PSBieXRlX3N0cmluZ19zYW1lMSk7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfc2FtZTEgPT0gYnl0ZV9zdHJpbmdfYyk7CisgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nX3NhbWUxKCJoZWxsbyIpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jID09IGJ5dGVfc3RyaW5nX3NhbWUxKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfc2FtZTEgPT0gYnl0ZV9zdHJpbmdfYyk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZzEoImhlIik7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmcyKCJoZWxscCIpOwotICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nMygiaGVsbG9kIik7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MgPT0gYnl0ZV9zdHJpbmcxKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyA9PSBieXRlX3N0cmluZzIpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jID09IGJ5dGVfc3RyaW5nMyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nMSA9PSBieXRlX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcyID09IGJ5dGVfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZzMgPT0gYnl0ZV9zdHJpbmdfYyk7CisgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nMSgiaGUiKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmcyKCJoZWxscCIpOworICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZzMoImhlbGxvZCIpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyA9PSBieXRlX3N0cmluZzEpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyA9PSBieXRlX3N0cmluZzIpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyA9PSBieXRlX3N0cmluZzMpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcxID09IGJ5dGVfc3RyaW5nX2MpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcyID09IGJ5dGVfc3RyaW5nX2MpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmczID09IGJ5dGVfc3RyaW5nX2MpOwogCi0gICAgY29uc3QgY2hhciogY19zdHJpbmdfc2FtZTEgPSAiaGVsbG8iOwotICAgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MgPT0gY19zdHJpbmdfc2FtZTEpOwotICAgIEVYUEVDVF9UUlVFKGNfc3RyaW5nX3NhbWUxID09IGJ5dGVfc3RyaW5nX2MpOworICBjb25zdCBjaGFyKiBjX3N0cmluZ19zYW1lMSA9ICJoZWxsbyI7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MgPT0gY19zdHJpbmdfc2FtZTEpOworICBFWFBFQ1RfVFJVRShjX3N0cmluZ19zYW1lMSA9PSBieXRlX3N0cmluZ19jKTsKIAotICAgIGNvbnN0IGNoYXIqIGNfc3RyaW5nMSA9ICJoZSI7Ci0gICAgY29uc3QgY2hhciogY19zdHJpbmcyID0gImhlbGxwIjsKLSAgICBjb25zdCBjaGFyKiBjX3N0cmluZzMgPSAiaGVsbG9kIjsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyA9PSBjX3N0cmluZzEpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jID09IGNfc3RyaW5nMik7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MgPT0gY19zdHJpbmczKTsKKyAgY29uc3QgY2hhciogY19zdHJpbmcxID0gImhlIjsKKyAgY29uc3QgY2hhciogY19zdHJpbmcyID0gImhlbGxwIjsKKyAgY29uc3QgY2hhciogY19zdHJpbmczID0gImhlbGxvZCI7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jID09IGNfc3RyaW5nMSk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jID09IGNfc3RyaW5nMik7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jID09IGNfc3RyaW5nMyk7CiAKLSAgICBFWFBFQ1RfRkFMU0UoY19zdHJpbmcxID09IGJ5dGVfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9GQUxTRShjX3N0cmluZzIgPT0gYnl0ZV9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMyA9PSBieXRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMSA9PSBieXRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMiA9PSBieXRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMyA9PSBieXRlX3N0cmluZ19jKTsKIH0KIAogVEVTVChmeGNydCwgQnl0ZVN0cmluZ0NPcGVyYXRvck5FKSB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2MoImhlbGxvIik7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MgIT0gYnl0ZV9zdHJpbmdfYyk7CisgIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jKCJoZWxsbyIpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyAhPSBieXRlX3N0cmluZ19jKTsKIAotICAgIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jX3NhbWUxKCJoZWxsbyIpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jICE9IGJ5dGVfc3RyaW5nX2Nfc2FtZTEpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jX3NhbWUxICE9IGJ5dGVfc3RyaW5nX2MpOworICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfY19zYW1lMSgiaGVsbG8iKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MgIT0gYnl0ZV9zdHJpbmdfY19zYW1lMSk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jX3NhbWUxICE9IGJ5dGVfc3RyaW5nX2MpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2Nfc2FtZTIoYnl0ZV9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MgIT0gYnl0ZV9zdHJpbmdfY19zYW1lMik7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2Nfc2FtZTIgIT0gYnl0ZV9zdHJpbmdfYyk7CisgIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jX3NhbWUyKGJ5dGVfc3RyaW5nX2MpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyAhPSBieXRlX3N0cmluZ19jX3NhbWUyKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2Nfc2FtZTIgIT0gYnl0ZV9zdHJpbmdfYyk7CiAKLSAgICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfYzEoImhlIik7Ci0gICAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2MyKCJoZWxscCIpOwotICAgIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jMygiaGVsbG9kIik7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyAhPSBieXRlX3N0cmluZ19jMSk7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyAhPSBieXRlX3N0cmluZ19jMik7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyAhPSBieXRlX3N0cmluZ19jMyk7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYzEgIT0gYnl0ZV9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYzIgIT0gYnl0ZV9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYzMgIT0gYnl0ZV9zdHJpbmdfYyk7CisgIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jMSgiaGUiKTsKKyAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2MyKCJoZWxscCIpOworICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfYzMoImhlbGxvZCIpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jICE9IGJ5dGVfc3RyaW5nX2MxKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyAhPSBieXRlX3N0cmluZ19jMik7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MgIT0gYnl0ZV9zdHJpbmdfYzMpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jMSAhPSBieXRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYzIgIT0gYnl0ZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MzICE9IGJ5dGVfc3RyaW5nX2MpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmdfc2FtZTEoImhlbGxvIik7Ci0gICAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MgIT0gYnl0ZV9zdHJpbmdfc2FtZTEpOwotICAgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19zYW1lMSAhPSBieXRlX3N0cmluZ19jKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmdfc2FtZTEoImhlbGxvIik7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jICE9IGJ5dGVfc3RyaW5nX3NhbWUxKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX3NhbWUxICE9IGJ5dGVfc3RyaW5nX2MpOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmcxKCJoZSIpOwotICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nMigiaGVsbHAiKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZzMoImhlbGxvZCIpOwotICAgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MgIT0gYnl0ZV9zdHJpbmcxKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jICE9IGJ5dGVfc3RyaW5nMik7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyAhPSBieXRlX3N0cmluZzMpOwotICAgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nMSAhPSBieXRlX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZzIgIT0gYnl0ZV9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmczICE9IGJ5dGVfc3RyaW5nX2MpOworICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZzEoImhlIik7CisgIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nMigiaGVsbHAiKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmczKCJoZWxsb2QiKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyAhPSBieXRlX3N0cmluZzEpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jICE9IGJ5dGVfc3RyaW5nMik7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MgIT0gYnl0ZV9zdHJpbmczKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcxICE9IGJ5dGVfc3RyaW5nX2MpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZzIgIT0gYnl0ZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nMyAhPSBieXRlX3N0cmluZ19jKTsKIAotICAgIGNvbnN0IGNoYXIqIGNfc3RyaW5nX3NhbWUxID0gImhlbGxvIjsKLSAgICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyAhPSBjX3N0cmluZ19zYW1lMSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nX3NhbWUxICE9IGJ5dGVfc3RyaW5nX2MpOworICBjb25zdCBjaGFyKiBjX3N0cmluZ19zYW1lMSA9ICJoZWxsbyI7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jICE9IGNfc3RyaW5nX3NhbWUxKTsKKyAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nX3NhbWUxICE9IGJ5dGVfc3RyaW5nX2MpOwogCi0gICAgY29uc3QgY2hhciogY19zdHJpbmcxID0gImhlIjsKLSAgICBjb25zdCBjaGFyKiBjX3N0cmluZzIgPSAiaGVsbHAiOwotICAgIGNvbnN0IGNoYXIqIGNfc3RyaW5nMyA9ICJoZWxsb2QiOwotICAgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MgIT0gY19zdHJpbmcxKTsKLSAgICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jICE9IGNfc3RyaW5nMik7Ci0gICAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyAhPSBjX3N0cmluZzMpOworICBjb25zdCBjaGFyKiBjX3N0cmluZzEgPSAiaGUiOworICBjb25zdCBjaGFyKiBjX3N0cmluZzIgPSAiaGVsbHAiOworICBjb25zdCBjaGFyKiBjX3N0cmluZzMgPSAiaGVsbG9kIjsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyAhPSBjX3N0cmluZzEpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jICE9IGNfc3RyaW5nMik7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MgIT0gY19zdHJpbmczKTsKIAotICAgIEVYUEVDVF9UUlVFKGNfc3RyaW5nMSAhPSBieXRlX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfVFJVRShjX3N0cmluZzIgIT0gYnl0ZV9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX1RSVUUoY19zdHJpbmczICE9IGJ5dGVfc3RyaW5nX2MpOworICBFWFBFQ1RfVFJVRShjX3N0cmluZzEgIT0gYnl0ZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKGNfc3RyaW5nMiAhPSBieXRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUoY19zdHJpbmczICE9IGJ5dGVfc3RyaW5nX2MpOworfQorCitURVNUKGZ4Y3J0LCBCeXRlU3RyaW5nRm9ybWF0V2lkdGgpIHsKKyAgeworICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKKyAgICBzdHIuRm9ybWF0KCIlNWQiLCAxKTsKKyAgICBFWFBFQ1RfRVEoIiAgICAxIiwgc3RyKTsKKyAgfQorCisgIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBzdHI7CisgICAgc3RyLkZvcm1hdCgiJWQiLCAxKTsKKyAgICBFWFBFQ1RfRVEoIjEiLCBzdHIpOworICB9CisKKyAgeworICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKKyAgICBzdHIuRm9ybWF0KCIlKmQiLCA1LCAxKTsKKyAgICBFWFBFQ1RfRVEoIiAgICAxIiwgc3RyKTsKKyAgfQorCisgIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBzdHI7CisgICAgc3RyLkZvcm1hdCgiJS0xZCIsIDEpOworICAgIEVYUEVDVF9FUSgiMSIsIHN0cik7CisgIH0KKworICB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyOworICAgIHN0ci5Gb3JtYXQoIiUwZCIsIDEpOworICAgIEVYUEVDVF9FUSgiMSIsIHN0cik7CisgIH0KKworICB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyOworICAgIHN0ci5Gb3JtYXQoIiUxMDQ4NTc2ZCIsIDEpOworICAgIEVYUEVDVF9FUSgiQmFkIHdpZHRoIiwgc3RyKTsKKyAgfQorfQorCitURVNUKGZ4Y3J0LCBCeXRlU3RyaW5nRm9ybWF0UHJlY2lzaW9uKSB7CisgIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBzdHI7CisgICAgc3RyLkZvcm1hdCgiJS4yZiIsIDEuMTIzNDUpOworICAgIEVYUEVDVF9FUSgiMS4xMiIsIHN0cik7CisgIH0KKworICB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyOworICAgIHN0ci5Gb3JtYXQoIiUuKmYiLCAzLCAxLjEyMzQ1KTsKKyAgICBFWFBFQ1RfRVEoIjEuMTIzIiwgc3RyKTsKKyAgfQorCisgIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBzdHI7CisgICAgc3RyLkZvcm1hdCgiJWYiLCAxLjEyMzQ1KTsKKyAgICBFWFBFQ1RfRVEoIjEuMTIzNDUwIiwgc3RyKTsKKyAgfQorCisgIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBzdHI7CisgICAgc3RyLkZvcm1hdCgiJS0xZiIsIDEuMTIzNDUpOworICAgIEVYUEVDVF9FUSgiMS4xMjM0NTAiLCBzdHIpOworICB9CisKKyAgeworICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKKyAgICBzdHIuRm9ybWF0KCIlMGYiLCAxLjEyMzQ1KTsKKyAgICBFWFBFQ1RfRVEoIjEuMTIzNDUwIiwgc3RyKTsKKyAgfQorCisgIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBzdHI7CisgICAgc3RyLkZvcm1hdCgiJS4xMDQ4NTc2ZiIsIDEuMik7CisgICAgRVhQRUNUX0VRKCJCYWQgcHJlY2lzaW9uIiwgc3RyKTsKKyAgfQorfQorCitURVNUKGZ4Y3J0LCBFbXB0eUJ5dGVTdHJpbmcpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgZW1wdHlfc3RyOworICBFWFBFQ1RfVFJVRShlbXB0eV9zdHIuSXNFbXB0eSgpKTsKKyAgRVhQRUNUX0VRKDAsIGVtcHR5X3N0ci5HZXRMZW5ndGgoKSk7CisgIGNvbnN0IEZYX0NIQVIqIGNzdHIgPSBlbXB0eV9zdHIuY19zdHIoKTsKKyAgRVhQRUNUX0VRKDAsIEZYU1lTX3N0cmxlbihjc3RyKSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19idWZmZXIuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfYnVmZmVyLmNwcAppbmRleCAwNmJhOTQxLi40ZWY4NmJiIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19idWZmZXIuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2J1ZmZlci5jcHAKQEAgLTQsNTU1ICs0LDQ2MCBAQAogCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgotRlhfU1RSU0laRSBGWF9mdG9hKEZYX0ZMT0FUIGYsIEZYX0xQU1RSIGJ1Zik7CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCisKK0ZYX1NUUlNJWkUgRlhfZnRvYShGWF9GTE9BVCBmLCBGWF9DSEFSKiBidWYpOwogQ0ZYX0JpbmFyeUJ1Zjo6Q0ZYX0JpbmFyeUJ1ZigpCi0gICAgOiBtX0FsbG9jU3RlcCgwKQotICAgICwgbV9wQnVmZmVyKE5VTEwpCi0gICAgLCBtX0RhdGFTaXplKDApCi0gICAgLCBtX0FsbG9jU2l6ZSgwKQotewotfQorICAgIDogbV9BbGxvY1N0ZXAoMCksIG1fcEJ1ZmZlcihOVUxMKSwgbV9EYXRhU2l6ZSgwKSwgbV9BbGxvY1NpemUoMCkge30KIENGWF9CaW5hcnlCdWY6OkNGWF9CaW5hcnlCdWYoRlhfU1RSU0laRSBzaXplKQotICAgIDogbV9BbGxvY1N0ZXAoMCkKLSAgICAsIG1fRGF0YVNpemUoc2l6ZSkKLSAgICAsIG1fQWxsb2NTaXplKHNpemUpCi17Ci0gICAgbV9wQnVmZmVyID0gRlhfQWxsb2MoRlhfQllURSwgc2l6ZSk7CisgICAgOiBtX0FsbG9jU3RlcCgwKSwgbV9EYXRhU2l6ZShzaXplKSwgbV9BbGxvY1NpemUoc2l6ZSkgeworICBtX3BCdWZmZXIgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsKIH0KLUNGWF9CaW5hcnlCdWY6On5DRlhfQmluYXJ5QnVmKCkKLXsKLSAgICBpZiAobV9wQnVmZmVyKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wQnVmZmVyKTsKK0NGWF9CaW5hcnlCdWY6On5DRlhfQmluYXJ5QnVmKCkgeworICBGWF9GcmVlKG1fcEJ1ZmZlcik7Cit9Cit2b2lkIENGWF9CaW5hcnlCdWY6OkRlbGV0ZShpbnQgc3RhcnRfaW5kZXgsIGludCBjb3VudCkgeworICBpZiAoIW1fcEJ1ZmZlciB8fCBzdGFydF9pbmRleCA8IDAgfHwgc3RhcnRfaW5kZXggKyBjb3VudCA+IG1fRGF0YVNpemUpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhTWVNfbWVtbW92ZShtX3BCdWZmZXIgKyBzdGFydF9pbmRleCwgbV9wQnVmZmVyICsgc3RhcnRfaW5kZXggKyBjb3VudCwKKyAgICAgICAgICAgICAgICBtX0RhdGFTaXplIC0gc3RhcnRfaW5kZXggLSBjb3VudCk7CisgIG1fRGF0YVNpemUgLT0gY291bnQ7Cit9Cit2b2lkIENGWF9CaW5hcnlCdWY6OkNsZWFyKCkgeworICBtX0RhdGFTaXplID0gMDsKK30KK3ZvaWQgQ0ZYX0JpbmFyeUJ1Zjo6RGV0YWNoQnVmZmVyKCkgeworICBtX0RhdGFTaXplID0gMDsKKyAgbV9wQnVmZmVyID0gTlVMTDsKKyAgbV9BbGxvY1NpemUgPSAwOworfQordm9pZCBDRlhfQmluYXJ5QnVmOjpBdHRhY2hEYXRhKHZvaWQqIGJ1ZmZlciwgRlhfU1RSU0laRSBzaXplKSB7CisgIEZYX0ZyZWUobV9wQnVmZmVyKTsKKyAgbV9EYXRhU2l6ZSA9IHNpemU7CisgIG1fcEJ1ZmZlciA9ICh1aW50OF90KilidWZmZXI7CisgIG1fQWxsb2NTaXplID0gc2l6ZTsKK30KK3ZvaWQgQ0ZYX0JpbmFyeUJ1Zjo6VGFrZU92ZXIoQ0ZYX0JpbmFyeUJ1ZiYgb3RoZXIpIHsKKyAgQXR0YWNoRGF0YShvdGhlci5HZXRCdWZmZXIoKSwgb3RoZXIuR2V0U2l6ZSgpKTsKKyAgb3RoZXIuRGV0YWNoQnVmZmVyKCk7Cit9Cit2b2lkIENGWF9CaW5hcnlCdWY6OkVzdGltYXRlU2l6ZShGWF9TVFJTSVpFIHNpemUsIEZYX1NUUlNJWkUgc3RlcCkgeworICBtX0FsbG9jU3RlcCA9IHN0ZXA7CisgIGlmIChtX0FsbG9jU2l6ZSA+PSBzaXplKSB7CisgICAgcmV0dXJuOworICB9CisgIEV4cGFuZEJ1ZihzaXplIC0gbV9EYXRhU2l6ZSk7Cit9Cit2b2lkIENGWF9CaW5hcnlCdWY6OkV4cGFuZEJ1ZihGWF9TVFJTSVpFIGFkZF9zaXplKSB7CisgIEZYX1NUUlNJWkUgbmV3X3NpemUgPSBhZGRfc2l6ZSArIG1fRGF0YVNpemU7CisgIGlmIChtX0FsbG9jU2l6ZSA+PSBuZXdfc2l6ZSkgeworICAgIHJldHVybjsKKyAgfQorICBpbnQgYWxsb2Nfc3RlcDsKKyAgaWYgKG1fQWxsb2NTdGVwID09IDApIHsKKyAgICBhbGxvY19zdGVwID0gbV9BbGxvY1NpemUgLyA0OworICAgIGlmIChhbGxvY19zdGVwIDwgMTI4KSB7CisgICAgICBhbGxvY19zdGVwID0gMTI4OwogICAgIH0KKyAgfSBlbHNlIHsKKyAgICBhbGxvY19zdGVwID0gbV9BbGxvY1N0ZXA7CisgIH0KKyAgbmV3X3NpemUgPSAobmV3X3NpemUgKyBhbGxvY19zdGVwIC0gMSkgLyBhbGxvY19zdGVwICogYWxsb2Nfc3RlcDsKKyAgdWludDhfdCogcE5ld0J1ZmZlciA9IG1fcEJ1ZmZlcjsKKyAgaWYgKHBOZXdCdWZmZXIpIHsKKyAgICBwTmV3QnVmZmVyID0gRlhfUmVhbGxvYyh1aW50OF90LCBtX3BCdWZmZXIsIG5ld19zaXplKTsKKyAgfSBlbHNlIHsKKyAgICBwTmV3QnVmZmVyID0gRlhfQWxsb2ModWludDhfdCwgbmV3X3NpemUpOworICB9CisgIG1fcEJ1ZmZlciA9IHBOZXdCdWZmZXI7CisgIG1fQWxsb2NTaXplID0gbmV3X3NpemU7CiB9Ci12b2lkIENGWF9CaW5hcnlCdWY6OkRlbGV0ZShpbnQgc3RhcnRfaW5kZXgsIGludCBjb3VudCkKLXsKLSAgICBpZiAoIW1fcEJ1ZmZlciB8fCBzdGFydF9pbmRleCA8IDAgfHwgc3RhcnRfaW5kZXggKyBjb3VudCA+IG1fRGF0YVNpemUpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWFNZU19tZW1tb3ZlMzIobV9wQnVmZmVyICsgc3RhcnRfaW5kZXgsIG1fcEJ1ZmZlciArIHN0YXJ0X2luZGV4ICsgY291bnQsIG1fRGF0YVNpemUgLSBzdGFydF9pbmRleCAtIGNvdW50KTsKLSAgICBtX0RhdGFTaXplIC09IGNvdW50OwotfQotdm9pZCBDRlhfQmluYXJ5QnVmOjpDbGVhcigpCi17Cit2b2lkIENGWF9CaW5hcnlCdWY6OkNvcHlEYXRhKGNvbnN0IHZvaWQqIHBTdHIsIEZYX1NUUlNJWkUgc2l6ZSkgeworICBpZiAoc2l6ZSA9PSAwKSB7CiAgICAgbV9EYXRhU2l6ZSA9IDA7Ci19Ci12b2lkIENGWF9CaW5hcnlCdWY6OkRldGFjaEJ1ZmZlcigpCi17Ci0gICAgbV9EYXRhU2l6ZSA9IDA7Ci0gICAgbV9wQnVmZmVyID0gTlVMTDsKLSAgICBtX0FsbG9jU2l6ZSA9IDA7Ci19Ci12b2lkIENGWF9CaW5hcnlCdWY6OkF0dGFjaERhdGEodm9pZCogYnVmZmVyLCBGWF9TVFJTSVpFIHNpemUpCi17Ci0gICAgaWYgKG1fcEJ1ZmZlcikgewotICAgICAgICBGWF9GcmVlKG1fcEJ1ZmZlcik7Ci0gICAgfQotICAgIG1fRGF0YVNpemUgPSBzaXplOwotICAgIG1fcEJ1ZmZlciA9IChGWF9MUEJZVEUpYnVmZmVyOwotICAgIG1fQWxsb2NTaXplID0gc2l6ZTsKLX0KLXZvaWQgQ0ZYX0JpbmFyeUJ1Zjo6VGFrZU92ZXIoQ0ZYX0JpbmFyeUJ1ZiYgb3RoZXIpCi17Ci0gICAgQXR0YWNoRGF0YShvdGhlci5HZXRCdWZmZXIoKSwgb3RoZXIuR2V0U2l6ZSgpKTsKLSAgICBvdGhlci5EZXRhY2hCdWZmZXIoKTsKLX0KLXZvaWQgQ0ZYX0JpbmFyeUJ1Zjo6RXN0aW1hdGVTaXplKEZYX1NUUlNJWkUgc2l6ZSwgRlhfU1RSU0laRSBzdGVwKQotewotICAgIG1fQWxsb2NTdGVwID0gc3RlcDsKLSAgICBpZiAobV9BbGxvY1NpemUgPj0gc2l6ZSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQorICAgIHJldHVybjsKKyAgfQorICBpZiAobV9BbGxvY1NpemUgPCBzaXplKSB7CiAgICAgRXhwYW5kQnVmKHNpemUgLSBtX0RhdGFTaXplKTsKKyAgfQorICBpZiAoIW1fcEJ1ZmZlcikgeworICAgIHJldHVybjsKKyAgfQorICBGWFNZU19tZW1jcHkobV9wQnVmZmVyLCBwU3RyLCBzaXplKTsKKyAgbV9EYXRhU2l6ZSA9IHNpemU7CiB9Ci12b2lkIENGWF9CaW5hcnlCdWY6OkV4cGFuZEJ1ZihGWF9TVFJTSVpFIGFkZF9zaXplKQotewotICAgIEZYX1NUUlNJWkUgbmV3X3NpemUgPSBhZGRfc2l6ZSArIG1fRGF0YVNpemU7Ci0gICAgaWYgKG1fQWxsb2NTaXplID49IG5ld19zaXplKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IGFsbG9jX3N0ZXA7Ci0gICAgaWYgKG1fQWxsb2NTdGVwID09IDApIHsKLSAgICAgICAgYWxsb2Nfc3RlcCA9IG1fQWxsb2NTaXplIC8gNDsKLSAgICAgICAgaWYgKGFsbG9jX3N0ZXAgPCAxMjggKSB7Ci0gICAgICAgICAgICBhbGxvY19zdGVwID0gMTI4OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYWxsb2Nfc3RlcCA9IG1fQWxsb2NTdGVwOwotICAgIH0KLSAgICBuZXdfc2l6ZSA9IChuZXdfc2l6ZSArIGFsbG9jX3N0ZXAgLSAxKSAvIGFsbG9jX3N0ZXAgKiBhbGxvY19zdGVwOwotICAgIEZYX0xQQllURSBwTmV3QnVmZmVyID0gbV9wQnVmZmVyOwotICAgIGlmIChwTmV3QnVmZmVyKSB7Ci0gICAgICAgIHBOZXdCdWZmZXIgPSBGWF9SZWFsbG9jKEZYX0JZVEUsIG1fcEJ1ZmZlciwgbmV3X3NpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBOZXdCdWZmZXIgPSBGWF9BbGxvYyhGWF9CWVRFLCBuZXdfc2l6ZSk7Ci0gICAgfQotICAgIG1fcEJ1ZmZlciA9IHBOZXdCdWZmZXI7Ci0gICAgbV9BbGxvY1NpemUgPSBuZXdfc2l6ZTsKK3ZvaWQgQ0ZYX0JpbmFyeUJ1Zjo6QXBwZW5kQmxvY2soY29uc3Qgdm9pZCogcEJ1ZiwgRlhfU1RSU0laRSBzaXplKSB7CisgIEV4cGFuZEJ1ZihzaXplKTsKKyAgaWYgKHBCdWYgJiYgbV9wQnVmZmVyKSB7CisgICAgRlhTWVNfbWVtY3B5KG1fcEJ1ZmZlciArIG1fRGF0YVNpemUsIHBCdWYsIHNpemUpOworICB9CisgIG1fRGF0YVNpemUgKz0gc2l6ZTsKIH0KLXZvaWQgQ0ZYX0JpbmFyeUJ1Zjo6Q29weURhdGEoY29uc3Qgdm9pZCogcFN0ciwgRlhfU1RSU0laRSBzaXplKQotewotICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgbV9EYXRhU2l6ZSA9IDA7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1fQWxsb2NTaXplIDwgc2l6ZSkgewotICAgICAgICBFeHBhbmRCdWYoc2l6ZSAtIG1fRGF0YVNpemUpOwotICAgIH0KLSAgICBpZiAoIW1fcEJ1ZmZlcikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYU1lTX21lbWNweTMyKG1fcEJ1ZmZlciwgcFN0ciwgc2l6ZSk7Ci0gICAgbV9EYXRhU2l6ZSA9IHNpemU7Cit2b2lkIENGWF9CaW5hcnlCdWY6Okluc2VydEJsb2NrKEZYX1NUUlNJWkUgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFIHNpemUpIHsKKyAgRXhwYW5kQnVmKHNpemUpOworICBpZiAoIW1fcEJ1ZmZlcikgeworICAgIHJldHVybjsKKyAgfQorICBGWFNZU19tZW1tb3ZlKG1fcEJ1ZmZlciArIHBvcyArIHNpemUsIG1fcEJ1ZmZlciArIHBvcywgbV9EYXRhU2l6ZSAtIHBvcyk7CisgIGlmIChwQnVmKSB7CisgICAgRlhTWVNfbWVtY3B5KG1fcEJ1ZmZlciArIHBvcywgcEJ1Ziwgc2l6ZSk7CisgIH0KKyAgbV9EYXRhU2l6ZSArPSBzaXplOwogfQotdm9pZCBDRlhfQmluYXJ5QnVmOjpBcHBlbmRCbG9jayhjb25zdCB2b2lkKiBwQnVmLCBGWF9TVFJTSVpFIHNpemUpCi17Ci0gICAgRXhwYW5kQnVmKHNpemUpOwotICAgIGlmIChwQnVmICYmIG1fcEJ1ZmZlcikgewotICAgICAgICBGWFNZU19tZW1jcHkzMihtX3BCdWZmZXIgKyBtX0RhdGFTaXplLCBwQnVmLCBzaXplKTsKLSAgICB9Ci0gICAgbV9EYXRhU2l6ZSArPSBzaXplOwordm9pZCBDRlhfQmluYXJ5QnVmOjpBcHBlbmRGaWxsKHVpbnQ4X3QgYnl0ZSwgRlhfU1RSU0laRSBjb3VudCkgeworICBFeHBhbmRCdWYoY291bnQpOworICBpZiAoIW1fcEJ1ZmZlcikgeworICAgIHJldHVybjsKKyAgfQorICBGWFNZU19tZW1zZXQobV9wQnVmZmVyICsgbV9EYXRhU2l6ZSwgYnl0ZSwgY291bnQpOworICBtX0RhdGFTaXplICs9IGNvdW50OwogfQotdm9pZCBDRlhfQmluYXJ5QnVmOjpJbnNlcnRCbG9jayhGWF9TVFJTSVpFIHBvcywgY29uc3Qgdm9pZCogcEJ1ZiwgRlhfU1RSU0laRSBzaXplKQotewotICAgIEV4cGFuZEJ1ZihzaXplKTsKLSAgICBpZiAoIW1fcEJ1ZmZlcikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYU1lTX21lbW1vdmUzMihtX3BCdWZmZXIgKyBwb3MgKyBzaXplLCBtX3BCdWZmZXIgKyBwb3MsIG1fRGF0YVNpemUgLSBwb3MpOwotICAgIGlmIChwQnVmKSB7Ci0gICAgICAgIEZYU1lTX21lbWNweTMyKG1fcEJ1ZmZlciArIHBvcywgcEJ1Ziwgc2l6ZSk7Ci0gICAgfQotICAgIG1fRGF0YVNpemUgKz0gc2l6ZTsKK0NGWF9CeXRlU3RyaW5nQyBDRlhfQmluYXJ5QnVmOjpHZXRCeXRlU3RyaW5nKCkgY29uc3QgeworICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKG1fcEJ1ZmZlciwgbV9EYXRhU2l6ZSk7CiB9Ci12b2lkIENGWF9CaW5hcnlCdWY6OkFwcGVuZEZpbGwoRlhfQllURSBieXRlLCBGWF9TVFJTSVpFIGNvdW50KQotewotICAgIEV4cGFuZEJ1Zihjb3VudCk7Ci0gICAgaWYgKCFtX3BCdWZmZXIpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWFNZU19tZW1zZXQ4KG1fcEJ1ZmZlciArIG1fRGF0YVNpemUsIGJ5dGUsIGNvdW50KTsKLSAgICBtX0RhdGFTaXplICs9IGNvdW50OworQ0ZYX0J5dGVUZXh0QnVmJiBDRlhfQnl0ZVRleHRCdWY6Om9wZXJhdG9yPDwoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBscHN6KSB7CisgIEFwcGVuZEJsb2NrKGxwc3ouR2V0UHRyKCksIGxwc3ouR2V0TGVuZ3RoKCkpOworICByZXR1cm4gKnRoaXM7CiB9Ci1DRlhfQnl0ZVN0cmluZ0MgQ0ZYX0JpbmFyeUJ1Zjo6R2V0Qnl0ZVN0cmluZygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQyhtX3BCdWZmZXIsIG1fRGF0YVNpemUpOworQ0ZYX0J5dGVUZXh0QnVmJiBDRlhfQnl0ZVRleHRCdWY6Om9wZXJhdG9yPDwoaW50IGkpIHsKKyAgY2hhciBidWZbMzJdOworICBGWFNZU19pdG9hKGksIGJ1ZiwgMTApOworICBBcHBlbmRCbG9jayhidWYsIEZYU1lTX3N0cmxlbihidWYpKTsKKyAgcmV0dXJuICp0aGlzOwogfQotQ0ZYX0J5dGVUZXh0QnVmJiBDRlhfQnl0ZVRleHRCdWY6Om9wZXJhdG9yIDw8IChGWF9CU1RSIGxwc3opCi17Ci0gICAgQXBwZW5kQmxvY2sobHBzei5HZXRQdHIoKSwgbHBzei5HZXRMZW5ndGgoKSk7CitDRlhfQnl0ZVRleHRCdWYmIENGWF9CeXRlVGV4dEJ1Zjo6b3BlcmF0b3I8PChGWF9EV09SRCBpKSB7CisgIGNoYXIgYnVmWzMyXTsKKyAgRlhTWVNfaXRvYShpLCBidWYsIDEwKTsKKyAgQXBwZW5kQmxvY2soYnVmLCBGWFNZU19zdHJsZW4oYnVmKSk7CisgIHJldHVybiAqdGhpczsKK30KK0NGWF9CeXRlVGV4dEJ1ZiYgQ0ZYX0J5dGVUZXh0QnVmOjpvcGVyYXRvcjw8KGRvdWJsZSBmKSB7CisgIGNoYXIgYnVmWzMyXTsKKyAgRlhfU1RSU0laRSBsZW4gPSBGWF9mdG9hKChGWF9GTE9BVClmLCBidWYpOworICBBcHBlbmRCbG9jayhidWYsIGxlbik7CisgIHJldHVybiAqdGhpczsKK30KK0NGWF9CeXRlVGV4dEJ1ZiYgQ0ZYX0J5dGVUZXh0QnVmOjpvcGVyYXRvcjw8KGNvbnN0IENGWF9CeXRlVGV4dEJ1ZiYgYnVmKSB7CisgIEFwcGVuZEJsb2NrKGJ1Zi5tX3BCdWZmZXIsIGJ1Zi5tX0RhdGFTaXplKTsKKyAgcmV0dXJuICp0aGlzOworfQordm9pZCBDRlhfQnl0ZVRleHRCdWY6Om9wZXJhdG9yPShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgeworICBDb3B5RGF0YShzdHIuR2V0UHRyKCksIHN0ci5HZXRMZW5ndGgoKSk7Cit9Cit2b2lkIENGWF9XaWRlVGV4dEJ1Zjo6QXBwZW5kQ2hhcihGWF9XQ0hBUiBjaCkgeworICBpZiAobV9BbGxvY1NpemUgPCBtX0RhdGFTaXplICsgKEZYX1NUUlNJWkUpc2l6ZW9mKEZYX1dDSEFSKSkgeworICAgIEV4cGFuZEJ1ZihzaXplb2YoRlhfV0NIQVIpKTsKKyAgfQorICBBU1NFUlQobV9wQnVmZmVyKTsKKyAgKihGWF9XQ0hBUiopKG1fcEJ1ZmZlciArIG1fRGF0YVNpemUpID0gY2g7CisgIG1fRGF0YVNpemUgKz0gc2l6ZW9mKEZYX1dDSEFSKTsKK30KK0NGWF9XaWRlVGV4dEJ1ZiYgQ0ZYX1dpZGVUZXh0QnVmOjpvcGVyYXRvcjw8KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKSB7CisgIEFwcGVuZEJsb2NrKHN0ci5HZXRQdHIoKSwgc3RyLkdldExlbmd0aCgpICogc2l6ZW9mKEZYX1dDSEFSKSk7CisgIHJldHVybiAqdGhpczsKK30KK0NGWF9XaWRlVGV4dEJ1ZiYgQ0ZYX1dpZGVUZXh0QnVmOjpvcGVyYXRvcjw8KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIHsKKyAgQXBwZW5kQmxvY2soc3RyLmNfc3RyKCksIHN0ci5HZXRMZW5ndGgoKSAqIHNpemVvZihGWF9XQ0hBUikpOworICByZXR1cm4gKnRoaXM7Cit9CitDRlhfV2lkZVRleHRCdWYmIENGWF9XaWRlVGV4dEJ1Zjo6b3BlcmF0b3I8PChpbnQgaSkgeworICBjaGFyIGJ1ZlszMl07CisgIEZYU1lTX2l0b2EoaSwgYnVmLCAxMCk7CisgIEZYX1NUUlNJWkUgbGVuID0gRlhTWVNfc3RybGVuKGJ1Zik7CisgIGlmIChtX0FsbG9jU2l6ZSA8IG1fRGF0YVNpemUgKyAoRlhfU1RSU0laRSkobGVuICogc2l6ZW9mKEZYX1dDSEFSKSkpIHsKKyAgICBFeHBhbmRCdWYobGVuICogc2l6ZW9mKEZYX1dDSEFSKSk7CisgIH0KKyAgQVNTRVJUKG1fcEJ1ZmZlcik7CisgIEZYX1dDSEFSKiBzdHIgPSAoRlhfV0NIQVIqKShtX3BCdWZmZXIgKyBtX0RhdGFTaXplKTsKKyAgZm9yIChGWF9TVFJTSVpFIGogPSAwOyBqIDwgbGVuOyBqKyspIHsKKyAgICAqc3RyKysgPSBidWZbal07CisgIH0KKyAgbV9EYXRhU2l6ZSArPSBsZW4gKiBzaXplb2YoRlhfV0NIQVIpOworICByZXR1cm4gKnRoaXM7Cit9CitDRlhfV2lkZVRleHRCdWYmIENGWF9XaWRlVGV4dEJ1Zjo6b3BlcmF0b3I8PChkb3VibGUgZikgeworICBjaGFyIGJ1ZlszMl07CisgIEZYX1NUUlNJWkUgbGVuID0gRlhfZnRvYSgoRlhfRkxPQVQpZiwgYnVmKTsKKyAgaWYgKG1fQWxsb2NTaXplIDwgbV9EYXRhU2l6ZSArIChGWF9TVFJTSVpFKShsZW4gKiBzaXplb2YoRlhfV0NIQVIpKSkgeworICAgIEV4cGFuZEJ1ZihsZW4gKiBzaXplb2YoRlhfV0NIQVIpKTsKKyAgfQorICBBU1NFUlQobV9wQnVmZmVyKTsKKyAgRlhfV0NIQVIqIHN0ciA9IChGWF9XQ0hBUiopKG1fcEJ1ZmZlciArIG1fRGF0YVNpemUpOworICBmb3IgKEZYX1NUUlNJWkUgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICpzdHIrKyA9IGJ1ZltpXTsKKyAgfQorICBtX0RhdGFTaXplICs9IGxlbiAqIHNpemVvZihGWF9XQ0hBUik7CisgIHJldHVybiAqdGhpczsKK30KK0NGWF9XaWRlVGV4dEJ1ZiYgQ0ZYX1dpZGVUZXh0QnVmOjpvcGVyYXRvcjw8KGNvbnN0IEZYX1dDSEFSKiBscHN6KSB7CisgIEFwcGVuZEJsb2NrKGxwc3osIEZYU1lTX3djc2xlbihscHN6KSAqIHNpemVvZihGWF9XQ0hBUikpOworICByZXR1cm4gKnRoaXM7Cit9CitDRlhfV2lkZVRleHRCdWYmIENGWF9XaWRlVGV4dEJ1Zjo6b3BlcmF0b3I8PChjb25zdCBDRlhfV2lkZVRleHRCdWYmIGJ1ZikgeworICBBcHBlbmRCbG9jayhidWYubV9wQnVmZmVyLCBidWYubV9EYXRhU2l6ZSk7CisgIHJldHVybiAqdGhpczsKK30KK3ZvaWQgQ0ZYX1dpZGVUZXh0QnVmOjpvcGVyYXRvcj0oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIpIHsKKyAgQ29weURhdGEoc3RyLkdldFB0cigpLCBzdHIuR2V0TGVuZ3RoKCkgKiBzaXplb2YoRlhfV0NIQVIpKTsKK30KK0NGWF9XaWRlU3RyaW5nQyBDRlhfV2lkZVRleHRCdWY6OkdldFdpZGVTdHJpbmcoKSBjb25zdCB7CisgIHJldHVybiBDRlhfV2lkZVN0cmluZ0MoKGNvbnN0IEZYX1dDSEFSKiltX3BCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbV9EYXRhU2l6ZSAvIHNpemVvZihGWF9XQ0hBUikpOworfQorCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK0NGWF9BcmNoaXZlU2F2ZXImIENGWF9BcmNoaXZlU2F2ZXI6Om9wZXJhdG9yPDwodWludDhfdCBpKSB7CisgIGlmIChtX3BTdHJlYW0pIHsKKyAgICBtX3BTdHJlYW0tPldyaXRlQmxvY2soJmksIDEpOworICB9IGVsc2UgeworICAgIG1fU2F2aW5nQnVmLkFwcGVuZEJ5dGUoaSk7CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorQ0ZYX0FyY2hpdmVTYXZlciYgQ0ZYX0FyY2hpdmVTYXZlcjo6b3BlcmF0b3I8PChpbnQgaSkgeworICBpZiAobV9wU3RyZWFtKSB7CisgICAgbV9wU3RyZWFtLT5Xcml0ZUJsb2NrKCZpLCBzaXplb2YoaW50KSk7CisgIH0gZWxzZSB7CisgICAgbV9TYXZpbmdCdWYuQXBwZW5kQmxvY2soJmksIHNpemVvZihpbnQpKTsKKyAgfQorICByZXR1cm4gKnRoaXM7Cit9CitDRlhfQXJjaGl2ZVNhdmVyJiBDRlhfQXJjaGl2ZVNhdmVyOjpvcGVyYXRvcjw8KEZYX0RXT1JEIGkpIHsKKyAgaWYgKG1fcFN0cmVhbSkgeworICAgIG1fcFN0cmVhbS0+V3JpdGVCbG9jaygmaSwgc2l6ZW9mKEZYX0RXT1JEKSk7CisgIH0gZWxzZSB7CisgICAgbV9TYXZpbmdCdWYuQXBwZW5kQmxvY2soJmksIHNpemVvZihGWF9EV09SRCkpOworICB9CisgIHJldHVybiAqdGhpczsKK30KK0NGWF9BcmNoaXZlU2F2ZXImIENGWF9BcmNoaXZlU2F2ZXI6Om9wZXJhdG9yPDwoRlhfRkxPQVQgZikgeworICBpZiAobV9wU3RyZWFtKSB7CisgICAgbV9wU3RyZWFtLT5Xcml0ZUJsb2NrKCZmLCBzaXplb2YoRlhfRkxPQVQpKTsKKyAgfSBlbHNlIHsKKyAgICBtX1NhdmluZ0J1Zi5BcHBlbmRCbG9jaygmZiwgc2l6ZW9mKEZYX0ZMT0FUKSk7CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorQ0ZYX0FyY2hpdmVTYXZlciYgQ0ZYX0FyY2hpdmVTYXZlcjo6b3BlcmF0b3I8PChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzdHIpIHsKKyAgaW50IGxlbiA9IGJzdHIuR2V0TGVuZ3RoKCk7CisgIGlmIChtX3BTdHJlYW0pIHsKKyAgICBtX3BTdHJlYW0tPldyaXRlQmxvY2soJmxlbiwgc2l6ZW9mKGludCkpOworICAgIG1fcFN0cmVhbS0+V3JpdGVCbG9jayhic3RyLkdldFB0cigpLCBsZW4pOworICB9IGVsc2UgeworICAgIG1fU2F2aW5nQnVmLkFwcGVuZEJsb2NrKCZsZW4sIHNpemVvZihpbnQpKTsKKyAgICBtX1NhdmluZ0J1Zi5BcHBlbmRCbG9jayhic3RyLkdldFB0cigpLCBsZW4pOworICB9CisgIHJldHVybiAqdGhpczsKK30KK0NGWF9BcmNoaXZlU2F2ZXImIENGWF9BcmNoaXZlU2F2ZXI6Om9wZXJhdG9yPDwoY29uc3QgRlhfV0NIQVIqIHdzdHIpIHsKKyAgRlhfU1RSU0laRSBsZW4gPSBGWFNZU193Y3NsZW4od3N0cik7CisgIGlmIChtX3BTdHJlYW0pIHsKKyAgICBtX3BTdHJlYW0tPldyaXRlQmxvY2soJmxlbiwgc2l6ZW9mKGludCkpOworICAgIG1fcFN0cmVhbS0+V3JpdGVCbG9jayh3c3RyLCBsZW4pOworICB9IGVsc2UgeworICAgIG1fU2F2aW5nQnVmLkFwcGVuZEJsb2NrKCZsZW4sIHNpemVvZihpbnQpKTsKKyAgICBtX1NhdmluZ0J1Zi5BcHBlbmRCbG9jayh3c3RyLCBsZW4pOworICB9CisgIHJldHVybiAqdGhpczsKK30KK0NGWF9BcmNoaXZlU2F2ZXImIENGWF9BcmNoaXZlU2F2ZXI6Om9wZXJhdG9yPDwoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzdHIpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RlZCA9IHdzdHIuVVRGMTZMRV9FbmNvZGUoKTsKKyAgcmV0dXJuIG9wZXJhdG9yPDwoZW5jb2RlZCk7Cit9Cit2b2lkIENGWF9BcmNoaXZlU2F2ZXI6OldyaXRlKGNvbnN0IHZvaWQqIHBEYXRhLCBGWF9TVFJTSVpFIGR3U2l6ZSkgeworICBpZiAobV9wU3RyZWFtKSB7CisgICAgbV9wU3RyZWFtLT5Xcml0ZUJsb2NrKHBEYXRhLCBkd1NpemUpOworICB9IGVsc2UgeworICAgIG1fU2F2aW5nQnVmLkFwcGVuZEJsb2NrKHBEYXRhLCBkd1NpemUpOworICB9Cit9CitDRlhfQXJjaGl2ZUxvYWRlcjo6Q0ZYX0FyY2hpdmVMb2FkZXIoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3U2l6ZSkgeworICBtX3BMb2FkaW5nQnVmID0gcERhdGE7CisgIG1fTG9hZGluZ1BvcyA9IDA7CisgIG1fTG9hZGluZ1NpemUgPSBkd1NpemU7Cit9CitGWF9CT09MIENGWF9BcmNoaXZlTG9hZGVyOjpJc0VPRigpIHsKKyAgcmV0dXJuIG1fTG9hZGluZ1BvcyA+PSBtX0xvYWRpbmdTaXplOworfQorQ0ZYX0FyY2hpdmVMb2FkZXImIENGWF9BcmNoaXZlTG9hZGVyOjpvcGVyYXRvcj4+KHVpbnQ4X3QmIGkpIHsKKyAgaWYgKG1fTG9hZGluZ1BvcyA+PSBtX0xvYWRpbmdTaXplKSB7CiAgICAgcmV0dXJuICp0aGlzOworICB9CisgIGkgPSBtX3BMb2FkaW5nQnVmW21fTG9hZGluZ1BvcysrXTsKKyAgcmV0dXJuICp0aGlzOwogfQotQ0ZYX0J5dGVUZXh0QnVmJiBDRlhfQnl0ZVRleHRCdWY6Om9wZXJhdG9yIDw8IChpbnQgaSkKLXsKLSAgICBjaGFyIGJ1ZlszMl07Ci0gICAgRlhTWVNfaXRvYShpLCBidWYsIDEwKTsKLSAgICBBcHBlbmRCbG9jayhidWYsIEZYU1lTX3N0cmxlbihidWYpKTsKK0NGWF9BcmNoaXZlTG9hZGVyJiBDRlhfQXJjaGl2ZUxvYWRlcjo6b3BlcmF0b3I+PihpbnQmIGkpIHsKKyAgUmVhZCgmaSwgc2l6ZW9mKGludCkpOworICByZXR1cm4gKnRoaXM7Cit9CitDRlhfQXJjaGl2ZUxvYWRlciYgQ0ZYX0FyY2hpdmVMb2FkZXI6Om9wZXJhdG9yPj4oRlhfRFdPUkQmIGkpIHsKKyAgUmVhZCgmaSwgc2l6ZW9mKEZYX0RXT1JEKSk7CisgIHJldHVybiAqdGhpczsKK30KK0NGWF9BcmNoaXZlTG9hZGVyJiBDRlhfQXJjaGl2ZUxvYWRlcjo6b3BlcmF0b3I+PihGWF9GTE9BVCYgaSkgeworICBSZWFkKCZpLCBzaXplb2YoRlhfRkxPQVQpKTsKKyAgcmV0dXJuICp0aGlzOworfQorQ0ZYX0FyY2hpdmVMb2FkZXImIENGWF9BcmNoaXZlTG9hZGVyOjpvcGVyYXRvcj4+KENGWF9CeXRlU3RyaW5nJiBzdHIpIHsKKyAgaWYgKG1fTG9hZGluZ1BvcyArIDQgPiBtX0xvYWRpbmdTaXplKSB7CiAgICAgcmV0dXJuICp0aGlzOwotfQotQ0ZYX0J5dGVUZXh0QnVmJiBDRlhfQnl0ZVRleHRCdWY6Om9wZXJhdG9yIDw8IChGWF9EV09SRCBpKQotewotICAgIGNoYXIgYnVmWzMyXTsKLSAgICBGWFNZU19pdG9hKGksIGJ1ZiwgMTApOwotICAgIEFwcGVuZEJsb2NrKGJ1ZiwgRlhTWVNfc3RybGVuKGJ1ZikpOworICB9CisgIGludCBsZW47CisgIG9wZXJhdG9yPj4obGVuKTsKKyAgc3RyLkVtcHR5KCk7CisgIGlmIChsZW4gPD0gMCB8fCBtX0xvYWRpbmdQb3MgKyBsZW4gPiBtX0xvYWRpbmdTaXplKSB7CiAgICAgcmV0dXJuICp0aGlzOworICB9CisgIEZYX0NIQVIqIGJ1ZmZlciA9IHN0ci5HZXRCdWZmZXIobGVuKTsKKyAgRlhTWVNfbWVtY3B5KGJ1ZmZlciwgbV9wTG9hZGluZ0J1ZiArIG1fTG9hZGluZ1BvcywgbGVuKTsKKyAgc3RyLlJlbGVhc2VCdWZmZXIobGVuKTsKKyAgbV9Mb2FkaW5nUG9zICs9IGxlbjsKKyAgcmV0dXJuICp0aGlzOwogfQotQ0ZYX0J5dGVUZXh0QnVmJiBDRlhfQnl0ZVRleHRCdWY6Om9wZXJhdG9yIDw8IChkb3VibGUgZikKLXsKLSAgICBjaGFyIGJ1ZlszMl07Ci0gICAgRlhfU1RSU0laRSBsZW4gPSBGWF9mdG9hKChGWF9GTE9BVClmLCBidWYpOwotICAgIEFwcGVuZEJsb2NrKGJ1ZiwgbGVuKTsKLSAgICByZXR1cm4gKnRoaXM7CitDRlhfQXJjaGl2ZUxvYWRlciYgQ0ZYX0FyY2hpdmVMb2FkZXI6Om9wZXJhdG9yPj4oQ0ZYX1dpZGVTdHJpbmcmIHN0cikgeworICBDRlhfQnl0ZVN0cmluZyBlbmNvZGVkOworICBvcGVyYXRvcj4+KGVuY29kZWQpOworICBzdHIgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoCisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIHNob3J0Kj4oZW5jb2RlZC5jX3N0cigpKSwKKyAgICAgIGVuY29kZWQuR2V0TGVuZ3RoKCkgLyBzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKKyAgcmV0dXJuICp0aGlzOwogfQotQ0ZYX0J5dGVUZXh0QnVmJiBDRlhfQnl0ZVRleHRCdWY6Om9wZXJhdG9yIDw8IChjb25zdCBDRlhfQnl0ZVRleHRCdWYmIGJ1ZikKLXsKLSAgICBBcHBlbmRCbG9jayhidWYubV9wQnVmZmVyLCBidWYubV9EYXRhU2l6ZSk7Ci0gICAgcmV0dXJuICp0aGlzOworRlhfQk9PTCBDRlhfQXJjaGl2ZUxvYWRlcjo6UmVhZCh2b2lkKiBwQnVmLCBGWF9EV09SRCBkd1NpemUpIHsKKyAgaWYgKG1fTG9hZGluZ1BvcyArIGR3U2l6ZSA+IG1fTG9hZGluZ1NpemUpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhTWVNfbWVtY3B5KHBCdWYsIG1fcExvYWRpbmdCdWYgKyBtX0xvYWRpbmdQb3MsIGR3U2l6ZSk7CisgIG1fTG9hZGluZ1BvcyArPSBkd1NpemU7CisgIHJldHVybiBUUlVFOwogfQotdm9pZCBDRlhfQnl0ZVRleHRCdWY6Om9wZXJhdG9yID0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpCi17Ci0gICAgQ29weURhdGEoc3RyLkdldFB0cigpLCBzdHIuR2V0TGVuZ3RoKCkpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCit2b2lkIENGWF9CaXRTdHJlYW06OkluaXQoY29uc3QgdWludDhfdCogcERhdGEsIEZYX0RXT1JEIGR3U2l6ZSkgeworICBtX3BEYXRhID0gcERhdGE7CisgIG1fQml0U2l6ZSA9IGR3U2l6ZSAqIDg7CisgIG1fQml0UG9zID0gMDsKIH0KLXZvaWQgQ0ZYX1dpZGVUZXh0QnVmOjpBcHBlbmRDaGFyKEZYX1dDSEFSIGNoKQotewotICAgIGlmIChtX0FsbG9jU2l6ZSA8IG1fRGF0YVNpemUgKyAoRlhfU1RSU0laRSlzaXplb2YoRlhfV0NIQVIpKSB7Ci0gICAgICAgIEV4cGFuZEJ1ZihzaXplb2YoRlhfV0NIQVIpKTsKK3ZvaWQgQ0ZYX0JpdFN0cmVhbTo6Qnl0ZUFsaWduKCkgeworICBpbnQgbW9kID0gbV9CaXRQb3MgJSA4OworICBpZiAobW9kID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9CaXRQb3MgKz0gOCAtIG1vZDsKK30KK0ZYX0RXT1JEIENGWF9CaXRTdHJlYW06OkdldEJpdHMoRlhfRFdPUkQgbkJpdHMpIHsKKyAgaWYgKG5CaXRzID4gbV9CaXRTaXplIHx8IG1fQml0UG9zICsgbkJpdHMgPiBtX0JpdFNpemUpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAobkJpdHMgPT0gMSkgeworICAgIGludCBiaXQgPSAobV9wRGF0YVttX0JpdFBvcyAvIDhdICYgKDEgPDwgKDcgLSBtX0JpdFBvcyAlIDgpKSkgPyAxIDogMDsKKyAgICBtX0JpdFBvcysrOworICAgIHJldHVybiBiaXQ7CisgIH0KKyAgRlhfRFdPUkQgYnl0ZV9wb3MgPSBtX0JpdFBvcyAvIDg7CisgIEZYX0RXT1JEIGJpdF9wb3MgPSBtX0JpdFBvcyAlIDgsIGJpdF9sZWZ0ID0gbkJpdHM7CisgIEZYX0RXT1JEIHJlc3VsdCA9IDA7CisgIGlmIChiaXRfcG9zKSB7CisgICAgaWYgKDggLSBiaXRfcG9zID49IGJpdF9sZWZ0KSB7CisgICAgICByZXN1bHQgPQorICAgICAgICAgIChtX3BEYXRhW2J5dGVfcG9zXSAmICgweGZmID4+IGJpdF9wb3MpKSA+PiAoOCAtIGJpdF9wb3MgLSBiaXRfbGVmdCk7CisgICAgICBtX0JpdFBvcyArPSBiaXRfbGVmdDsKKyAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQotICAgIEFTU0VSVChtX3BCdWZmZXIgIT0gTlVMTCk7Ci0gICAgKihGWF9XQ0hBUiopKG1fcEJ1ZmZlciArIG1fRGF0YVNpemUpID0gY2g7Ci0gICAgbV9EYXRhU2l6ZSArPSBzaXplb2YoRlhfV0NIQVIpOwotfQotQ0ZYX1dpZGVUZXh0QnVmJiBDRlhfV2lkZVRleHRCdWY6Om9wZXJhdG9yIDw8IChGWF9XU1RSIHN0cikKLXsKLSAgICBBcHBlbmRCbG9jayhzdHIuR2V0UHRyKCksIHN0ci5HZXRMZW5ndGgoKSAqIHNpemVvZihGWF9XQ0hBUikpOwotICAgIHJldHVybiAqdGhpczsKLX0KLUNGWF9XaWRlVGV4dEJ1ZiYgQ0ZYX1dpZGVUZXh0QnVmOjpvcGVyYXRvciA8PCAoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJnN0cikKLXsKLSAgICBBcHBlbmRCbG9jayhzdHIuY19zdHIoKSwgc3RyLkdldExlbmd0aCgpICogc2l6ZW9mKEZYX1dDSEFSKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotQ0ZYX1dpZGVUZXh0QnVmJiBDRlhfV2lkZVRleHRCdWY6Om9wZXJhdG9yIDw8IChpbnQgaSkKLXsKLSAgICBjaGFyIGJ1ZlszMl07Ci0gICAgRlhTWVNfaXRvYShpLCBidWYsIDEwKTsKLSAgICBGWF9TVFJTSVpFIGxlbiA9IEZYU1lTX3N0cmxlbihidWYpOwotICAgIGlmIChtX0FsbG9jU2l6ZSA8IG1fRGF0YVNpemUgKyAoRlhfU1RSU0laRSkobGVuICogc2l6ZW9mKEZYX1dDSEFSKSkpIHsKLSAgICAgICAgRXhwYW5kQnVmKGxlbiAqIHNpemVvZihGWF9XQ0hBUikpOwotICAgIH0KLSAgICBBU1NFUlQobV9wQnVmZmVyICE9IE5VTEwpOwotICAgIEZYX0xQV1NUUiBzdHIgPSAoRlhfV0NIQVIqKShtX3BCdWZmZXIgKyBtX0RhdGFTaXplKTsKLSAgICBmb3IgKEZYX1NUUlNJWkUgaiA9IDA7IGogPCBsZW47IGogKyspIHsKLSAgICAgICAgKnN0ciArKyA9IGJ1ZltqXTsKLSAgICB9Ci0gICAgbV9EYXRhU2l6ZSArPSBsZW4gKiBzaXplb2YoRlhfV0NIQVIpOwotICAgIHJldHVybiAqdGhpczsKLX0KLUNGWF9XaWRlVGV4dEJ1ZiYgQ0ZYX1dpZGVUZXh0QnVmOjpvcGVyYXRvciA8PCAoZG91YmxlIGYpCi17Ci0gICAgY2hhciBidWZbMzJdOwotICAgIEZYX1NUUlNJWkUgbGVuID0gRlhfZnRvYSgoRlhfRkxPQVQpZiwgYnVmKTsKLSAgICBpZiAobV9BbGxvY1NpemUgPCBtX0RhdGFTaXplICsgKEZYX1NUUlNJWkUpKGxlbiAqIHNpemVvZihGWF9XQ0hBUikpKSB7Ci0gICAgICAgIEV4cGFuZEJ1ZihsZW4gKiBzaXplb2YoRlhfV0NIQVIpKTsKLSAgICB9Ci0gICAgQVNTRVJUKG1fcEJ1ZmZlciAhPSBOVUxMKTsKLSAgICBGWF9MUFdTVFIgc3RyID0gKEZYX1dDSEFSKikobV9wQnVmZmVyICsgbV9EYXRhU2l6ZSk7Ci0gICAgZm9yIChGWF9TVFJTSVpFIGkgPSAwOyBpIDwgbGVuOyBpICsrKSB7Ci0gICAgICAgICpzdHIgKysgPSBidWZbaV07Ci0gICAgfQotICAgIG1fRGF0YVNpemUgKz0gbGVuICogc2l6ZW9mKEZYX1dDSEFSKTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci1DRlhfV2lkZVRleHRCdWYmIENGWF9XaWRlVGV4dEJ1Zjo6b3BlcmF0b3IgPDwgKEZYX0xQQ1dTVFIgbHBzeikKLXsKLSAgICBBcHBlbmRCbG9jayhscHN6LCBGWFNZU193Y3NsZW4obHBzeikqc2l6ZW9mKEZYX1dDSEFSKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotQ0ZYX1dpZGVUZXh0QnVmJiBDRlhfV2lkZVRleHRCdWY6Om9wZXJhdG9yIDw8IChjb25zdCBDRlhfV2lkZVRleHRCdWYmIGJ1ZikKLXsKLSAgICBBcHBlbmRCbG9jayhidWYubV9wQnVmZmVyLCBidWYubV9EYXRhU2l6ZSk7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotdm9pZCBDRlhfV2lkZVRleHRCdWY6Om9wZXJhdG9yID0oRlhfV1NUUiBzdHIpCi17Ci0gICAgQ29weURhdGEoc3RyLkdldFB0cigpLCBzdHIuR2V0TGVuZ3RoKCkgKiBzaXplb2YoRlhfV0NIQVIpKTsKLX0KLUNGWF9XaWRlU3RyaW5nQyBDRlhfV2lkZVRleHRCdWY6OkdldFdpZGVTdHJpbmcoKSBjb25zdAotewotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZ0MoKEZYX0xQQ1dTVFIpbV9wQnVmZmVyLCBtX0RhdGFTaXplIC8gc2l6ZW9mKEZYX1dDSEFSKSk7Ci19Ci1DRlhfQXJjaGl2ZVNhdmVyJiBDRlhfQXJjaGl2ZVNhdmVyOjpvcGVyYXRvciA8PCAoRlhfQllURSBpKQotewotICAgIGlmIChtX3BTdHJlYW0pIHsKLSAgICAgICAgbV9wU3RyZWFtLT5Xcml0ZUJsb2NrKCZpLCAxKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX1NhdmluZ0J1Zi5BcHBlbmRCeXRlKGkpOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci19Ci1DRlhfQXJjaGl2ZVNhdmVyJiBDRlhfQXJjaGl2ZVNhdmVyOjpvcGVyYXRvciA8PCAoaW50IGkpCi17Ci0gICAgaWYgKG1fcFN0cmVhbSkgewotICAgICAgICBtX3BTdHJlYW0tPldyaXRlQmxvY2soJmksIHNpemVvZihpbnQpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX1NhdmluZ0J1Zi5BcHBlbmRCbG9jaygmaSwgc2l6ZW9mKGludCkpOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci19Ci1DRlhfQXJjaGl2ZVNhdmVyJiBDRlhfQXJjaGl2ZVNhdmVyOjpvcGVyYXRvciA8PCAoRlhfRFdPUkQgaSkKLXsKLSAgICBpZiAobV9wU3RyZWFtKSB7Ci0gICAgICAgIG1fcFN0cmVhbS0+V3JpdGVCbG9jaygmaSwgc2l6ZW9mKEZYX0RXT1JEKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9TYXZpbmdCdWYuQXBwZW5kQmxvY2soJmksIHNpemVvZihGWF9EV09SRCkpOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci19Ci1DRlhfQXJjaGl2ZVNhdmVyJiBDRlhfQXJjaGl2ZVNhdmVyOjpvcGVyYXRvciA8PCAoRlhfRkxPQVQgZikKLXsKLSAgICBpZiAobV9wU3RyZWFtKSB7Ci0gICAgICAgIG1fcFN0cmVhbS0+V3JpdGVCbG9jaygmZiwgc2l6ZW9mKEZYX0ZMT0FUKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9TYXZpbmdCdWYuQXBwZW5kQmxvY2soJmYsIHNpemVvZihGWF9GTE9BVCkpOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci19Ci1DRlhfQXJjaGl2ZVNhdmVyJiBDRlhfQXJjaGl2ZVNhdmVyOjpvcGVyYXRvciA8PCAoRlhfQlNUUiBic3RyKQotewotICAgIGludCBsZW4gPSBic3RyLkdldExlbmd0aCgpOwotICAgIGlmIChtX3BTdHJlYW0pIHsKLSAgICAgICAgbV9wU3RyZWFtLT5Xcml0ZUJsb2NrKCZsZW4sIHNpemVvZihpbnQpKTsKLSAgICAgICAgbV9wU3RyZWFtLT5Xcml0ZUJsb2NrKGJzdHIuR2V0UHRyKCksIGxlbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9TYXZpbmdCdWYuQXBwZW5kQmxvY2soJmxlbiwgc2l6ZW9mKGludCkpOwotICAgICAgICBtX1NhdmluZ0J1Zi5BcHBlbmRCbG9jayhic3RyLkdldFB0cigpLCBsZW4pOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci19Ci1DRlhfQXJjaGl2ZVNhdmVyJiBDRlhfQXJjaGl2ZVNhdmVyOjpvcGVyYXRvciA8PCAoRlhfTFBDV1NUUiB3c3RyKQotewotICAgIEZYX1NUUlNJWkUgbGVuID0gRlhTWVNfd2NzbGVuKHdzdHIpOwotICAgIGlmIChtX3BTdHJlYW0pIHsKLSAgICAgICAgbV9wU3RyZWFtLT5Xcml0ZUJsb2NrKCZsZW4sIHNpemVvZihpbnQpKTsKLSAgICAgICAgbV9wU3RyZWFtLT5Xcml0ZUJsb2NrKHdzdHIsIGxlbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9TYXZpbmdCdWYuQXBwZW5kQmxvY2soJmxlbiwgc2l6ZW9mKGludCkpOwotICAgICAgICBtX1NhdmluZ0J1Zi5BcHBlbmRCbG9jayh3c3RyLCBsZW4pOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci19Ci1DRlhfQXJjaGl2ZVNhdmVyJiBDRlhfQXJjaGl2ZVNhdmVyOjpvcGVyYXRvciA8PCAoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzdHIpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RlZCA9IHdzdHIuVVRGMTZMRV9FbmNvZGUoKTsKLSAgICByZXR1cm4gb3BlcmF0b3IgPDwgKGVuY29kZWQpOwotfQotdm9pZCBDRlhfQXJjaGl2ZVNhdmVyOjpXcml0ZShjb25zdCB2b2lkKiBwRGF0YSwgRlhfU1RSU0laRSBkd1NpemUpCi17Ci0gICAgaWYgKG1fcFN0cmVhbSkgewotICAgICAgICBtX3BTdHJlYW0tPldyaXRlQmxvY2socERhdGEsIGR3U2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9TYXZpbmdCdWYuQXBwZW5kQmxvY2socERhdGEsIGR3U2l6ZSk7Ci0gICAgfQotfQotQ0ZYX0FyY2hpdmVMb2FkZXI6OkNGWF9BcmNoaXZlTG9hZGVyKEZYX0xQQ0JZVEUgcERhdGEsIEZYX0RXT1JEIGR3U2l6ZSkKLXsKLSAgICBtX3BMb2FkaW5nQnVmID0gcERhdGE7Ci0gICAgbV9Mb2FkaW5nUG9zID0gMDsKLSAgICBtX0xvYWRpbmdTaXplID0gZHdTaXplOwotfQotRlhfQk9PTCBDRlhfQXJjaGl2ZUxvYWRlcjo6SXNFT0YoKQotewotICAgIHJldHVybiBtX0xvYWRpbmdQb3MgPj0gbV9Mb2FkaW5nU2l6ZTsKLX0KLUNGWF9BcmNoaXZlTG9hZGVyJiBDRlhfQXJjaGl2ZUxvYWRlcjo6b3BlcmF0b3IgPj4gKEZYX0JZVEUmIGkpCi17Ci0gICAgaWYgKG1fTG9hZGluZ1BvcyA+PSBtX0xvYWRpbmdTaXplKSB7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0gICAgaSA9IG1fcExvYWRpbmdCdWZbbV9Mb2FkaW5nUG9zKytdOwotICAgIHJldHVybiAqdGhpczsKLX0KLUNGWF9BcmNoaXZlTG9hZGVyJiBDRlhfQXJjaGl2ZUxvYWRlcjo6b3BlcmF0b3IgPj4gKGludCYgaSkKLXsKLSAgICBSZWFkKCZpLCBzaXplb2YoaW50KSk7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotQ0ZYX0FyY2hpdmVMb2FkZXImIENGWF9BcmNoaXZlTG9hZGVyOjpvcGVyYXRvciA+PiAoRlhfRFdPUkQmIGkpCi17Ci0gICAgUmVhZCgmaSwgc2l6ZW9mKEZYX0RXT1JEKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotQ0ZYX0FyY2hpdmVMb2FkZXImIENGWF9BcmNoaXZlTG9hZGVyOjpvcGVyYXRvciA+PiAoRlhfRkxPQVQmIGkpCi17Ci0gICAgUmVhZCgmaSwgc2l6ZW9mKEZYX0ZMT0FUKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotQ0ZYX0FyY2hpdmVMb2FkZXImIENGWF9BcmNoaXZlTG9hZGVyOjpvcGVyYXRvciA+PiAoQ0ZYX0J5dGVTdHJpbmcmIHN0cikKLXsKLSAgICBpZiAobV9Mb2FkaW5nUG9zICsgNCA+IG1fTG9hZGluZ1NpemUpIHsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgICBpbnQgbGVuOwotICAgIG9wZXJhdG9yID4+IChsZW4pOwotICAgIHN0ci5FbXB0eSgpOwotICAgIGlmIChsZW4gPD0gMCB8fCBtX0xvYWRpbmdQb3MgKyBsZW4gPiBtX0xvYWRpbmdTaXplKSB7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0gICAgRlhfTFBTVFIgYnVmZmVyID0gc3RyLkdldEJ1ZmZlcihsZW4pOwotICAgIEZYU1lTX21lbWNweTMyKGJ1ZmZlciwgbV9wTG9hZGluZ0J1ZiArIG1fTG9hZGluZ1BvcywgbGVuKTsKLSAgICBzdHIuUmVsZWFzZUJ1ZmZlcihsZW4pOwotICAgIG1fTG9hZGluZ1BvcyArPSBsZW47Ci0gICAgcmV0dXJuICp0aGlzOwotfQotQ0ZYX0FyY2hpdmVMb2FkZXImIENGWF9BcmNoaXZlTG9hZGVyOjpvcGVyYXRvciA+PiAoQ0ZYX1dpZGVTdHJpbmcmIHN0cikKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBlbmNvZGVkOwotICAgIG9wZXJhdG9yID4+IChlbmNvZGVkKTsKLSAgICBzdHIgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoKGNvbnN0IHVuc2lnbmVkIHNob3J0KillbmNvZGVkLmNfc3RyKCksIGVuY29kZWQuR2V0TGVuZ3RoKCkpOwotICAgIHJldHVybiAqdGhpczsKLX0KLUZYX0JPT0wgQ0ZYX0FyY2hpdmVMb2FkZXI6OlJlYWQodm9pZCogcEJ1ZiwgRlhfRFdPUkQgZHdTaXplKQotewotICAgIGlmIChtX0xvYWRpbmdQb3MgKyBkd1NpemUgPiBtX0xvYWRpbmdTaXplKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhTWVNfbWVtY3B5MzIocEJ1ZiwgbV9wTG9hZGluZ0J1ZiArIG1fTG9hZGluZ1BvcywgZHdTaXplKTsKLSAgICBtX0xvYWRpbmdQb3MgKz0gZHdTaXplOwotICAgIHJldHVybiBUUlVFOwotfQotdm9pZCBDRlhfQml0U3RyZWFtOjpJbml0KEZYX0xQQ0JZVEUgcERhdGEsIEZYX0RXT1JEIGR3U2l6ZSkKLXsKLSAgICBtX3BEYXRhID0gcERhdGE7Ci0gICAgbV9CaXRTaXplID0gZHdTaXplICogODsKLSAgICBtX0JpdFBvcyA9IDA7Ci19Ci12b2lkIENGWF9CaXRTdHJlYW06OkJ5dGVBbGlnbigpCi17Ci0gICAgaW50IG1vZCA9IG1fQml0UG9zICUgODsKLSAgICBpZiAobW9kID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX0JpdFBvcyArPSA4IC0gbW9kOwotfQotRlhfRFdPUkQgQ0ZYX0JpdFN0cmVhbTo6R2V0Qml0cyhGWF9EV09SRCBuQml0cykKLXsKLSAgICBpZiAobkJpdHMgPiBtX0JpdFNpemUgfHwgbV9CaXRQb3MgKyBuQml0cyA+IG1fQml0U2l6ZSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKG5CaXRzID09IDEpIHsKLSAgICAgICAgaW50IGJpdCA9IChtX3BEYXRhW21fQml0UG9zIC8gOF0gJiAoMSA8PCAoNyAtIG1fQml0UG9zICUgOCkpKSA/IDEgOiAwOwotICAgICAgICBtX0JpdFBvcyArKzsKLSAgICAgICAgcmV0dXJuIGJpdDsKLSAgICB9Ci0gICAgRlhfRFdPUkQgYnl0ZV9wb3MgPSBtX0JpdFBvcyAvIDg7Ci0gICAgRlhfRFdPUkQgYml0X3BvcyA9IG1fQml0UG9zICUgOCwgYml0X2xlZnQgPSBuQml0czsKLSAgICBGWF9EV09SRCByZXN1bHQgPSAwOwotICAgIGlmIChiaXRfcG9zKSB7Ci0gICAgICAgIGlmICg4IC0gYml0X3BvcyA+PSBiaXRfbGVmdCkgewotICAgICAgICAgICAgcmVzdWx0ID0gKG1fcERhdGFbYnl0ZV9wb3NdICYgKDB4ZmYgPj4gYml0X3BvcykpID4+ICg4IC0gYml0X3BvcyAtIGJpdF9sZWZ0KTsKLSAgICAgICAgICAgIG1fQml0UG9zICs9IGJpdF9sZWZ0OwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBiaXRfbGVmdCAtPSA4IC0gYml0X3BvczsKLSAgICAgICAgcmVzdWx0ID0gKG1fcERhdGFbYnl0ZV9wb3MrK10gJiAoKDEgPDwgKDggLSBiaXRfcG9zKSkgLSAxKSkgPDwgYml0X2xlZnQ7Ci0gICAgfQotICAgIHdoaWxlIChiaXRfbGVmdCA+PSA4KSB7Ci0gICAgICAgIGJpdF9sZWZ0IC09IDg7Ci0gICAgICAgIHJlc3VsdCB8PSBtX3BEYXRhW2J5dGVfcG9zKytdIDw8IGJpdF9sZWZ0OwotICAgIH0KLSAgICBpZiAoYml0X2xlZnQpIHsKLSAgICAgICAgcmVzdWx0IHw9IG1fcERhdGFbYnl0ZV9wb3NdID4+ICg4IC0gYml0X2xlZnQpOwotICAgIH0KLSAgICBtX0JpdFBvcyArPSBuQml0czsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIGJpdF9sZWZ0IC09IDggLSBiaXRfcG9zOworICAgIHJlc3VsdCA9IChtX3BEYXRhW2J5dGVfcG9zKytdICYgKCgxIDw8ICg4IC0gYml0X3BvcykpIC0gMSkpIDw8IGJpdF9sZWZ0OworICB9CisgIHdoaWxlIChiaXRfbGVmdCA+PSA4KSB7CisgICAgYml0X2xlZnQgLT0gODsKKyAgICByZXN1bHQgfD0gbV9wRGF0YVtieXRlX3BvcysrXSA8PCBiaXRfbGVmdDsKKyAgfQorICBpZiAoYml0X2xlZnQpIHsKKyAgICByZXN1bHQgfD0gbV9wRGF0YVtieXRlX3Bvc10gPj4gKDggLSBiaXRfbGVmdCk7CisgIH0KKyAgbV9CaXRQb3MgKz0gbkJpdHM7CisgIHJldHVybiByZXN1bHQ7CiB9CiBJRlhfQnVmZmVyQXJjaGl2ZTo6SUZYX0J1ZmZlckFyY2hpdmUoRlhfU1RSU0laRSBzaXplKQotICAgIDogbV9CdWZTaXplKHNpemUpCi0gICAgLCBtX3BCdWZmZXIoTlVMTCkKLSAgICAsIG1fTGVuZ3RoKDApCi17CisgICAgOiBtX0J1ZlNpemUoc2l6ZSksIG1fcEJ1ZmZlcihOVUxMKSwgbV9MZW5ndGgoMCkge30KK3ZvaWQgSUZYX0J1ZmZlckFyY2hpdmU6OkNsZWFyKCkgeworICBtX0xlbmd0aCA9IDA7CisgIEZYX0ZyZWUobV9wQnVmZmVyKTsKKyAgbV9wQnVmZmVyID0gTlVMTDsKIH0KLXZvaWQgSUZYX0J1ZmZlckFyY2hpdmU6OkNsZWFyKCkKLXsKLSAgICBtX0xlbmd0aCA9IDA7Ci0gICAgaWYgKG1fcEJ1ZmZlcikgewotICAgICAgICBGWF9GcmVlKG1fcEJ1ZmZlcik7Ci0gICAgICAgIG1fcEJ1ZmZlciA9IE5VTEw7CitGWF9CT09MIElGWF9CdWZmZXJBcmNoaXZlOjpGbHVzaCgpIHsKKyAgRlhfQk9PTCBiUmV0ID0gRG9Xb3JrKG1fcEJ1ZmZlciwgbV9MZW5ndGgpOworICBtX0xlbmd0aCA9IDA7CisgIHJldHVybiBiUmV0OworfQoraW50MzJfdCBJRlhfQnVmZmVyQXJjaGl2ZTo6QXBwZW5kQmxvY2soY29uc3Qgdm9pZCogcEJ1Ziwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCFwQnVmIHx8IHNpemUgPCAxKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFtX3BCdWZmZXIpIHsKKyAgICBtX3BCdWZmZXIgPSBGWF9BbGxvYyh1aW50OF90LCBtX0J1ZlNpemUpOworICB9CisgIHVpbnQ4X3QqIGJ1ZmZlciA9ICh1aW50OF90KilwQnVmOworICBGWF9TVFJTSVpFIHRlbXBfc2l6ZSA9IChGWF9TVFJTSVpFKXNpemU7CisgIHdoaWxlICh0ZW1wX3NpemUgPiAwKSB7CisgICAgRlhfU1RSU0laRSBidWZfc2l6ZSA9IHN0ZDo6bWluKG1fQnVmU2l6ZSAtIG1fTGVuZ3RoLCAoRlhfU1RSU0laRSl0ZW1wX3NpemUpOworICAgIEZYU1lTX21lbWNweShtX3BCdWZmZXIgKyBtX0xlbmd0aCwgYnVmZmVyLCBidWZfc2l6ZSk7CisgICAgbV9MZW5ndGggKz0gYnVmX3NpemU7CisgICAgaWYgKG1fTGVuZ3RoID09IG1fQnVmU2l6ZSkgeworICAgICAgaWYgKCFGbHVzaCgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KICAgICB9CisgICAgdGVtcF9zaXplIC09IGJ1Zl9zaXplOworICAgIGJ1ZmZlciArPSBidWZfc2l6ZTsKKyAgfQorICByZXR1cm4gKGludDMyX3Qpc2l6ZTsKIH0KLUZYX0JPT0wgSUZYX0J1ZmZlckFyY2hpdmU6OkZsdXNoKCkKLXsKLSAgICBGWF9CT09MIGJSZXQgPSBEb1dvcmsobV9wQnVmZmVyLCBtX0xlbmd0aCk7Ci0gICAgbV9MZW5ndGggPSAwOwotICAgIHJldHVybiBiUmV0OworaW50MzJfdCBJRlhfQnVmZmVyQXJjaGl2ZTo6QXBwZW5kQnl0ZSh1aW50OF90IGJ5dGUpIHsKKyAgcmV0dXJuIEFwcGVuZEJsb2NrKCZieXRlLCAxKTsKIH0KLUZYX0lOVDMyIElGWF9CdWZmZXJBcmNoaXZlOjpBcHBlbmRCbG9jayhjb25zdCB2b2lkKiBwQnVmLCBzaXplX3Qgc2l6ZSkKLXsKLSAgICBpZiAoIXBCdWYgfHwgc2l6ZSA8IDEpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmICghbV9wQnVmZmVyKSB7Ci0gICAgICAgIG1fcEJ1ZmZlciA9IEZYX0FsbG9jKEZYX0JZVEUsIG1fQnVmU2l6ZSk7Ci0gICAgfQotICAgIEZYX0xQQllURSBidWZmZXIgPSAoRlhfTFBCWVRFKXBCdWY7Ci0gICAgRlhfU1RSU0laRSB0ZW1wX3NpemUgPSAoRlhfU1RSU0laRSlzaXplOwotICAgIHdoaWxlICh0ZW1wX3NpemUgPiAwKSB7Ci0gICAgICAgIEZYX1NUUlNJWkUgYnVmX3NpemUgPSBGWF9NSU4obV9CdWZTaXplIC0gbV9MZW5ndGgsIChGWF9TVFJTSVpFKXRlbXBfc2l6ZSk7Ci0gICAgICAgIEZYU1lTX21lbWNweTMyKG1fcEJ1ZmZlciArIG1fTGVuZ3RoLCBidWZmZXIsIGJ1Zl9zaXplKTsKLSAgICAgICAgbV9MZW5ndGggKz0gYnVmX3NpemU7Ci0gICAgICAgIGlmIChtX0xlbmd0aCA9PSBtX0J1ZlNpemUpIHsKLSAgICAgICAgICAgIGlmICghRmx1c2goKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0ZW1wX3NpemUgLT0gYnVmX3NpemU7Ci0gICAgICAgIGJ1ZmZlciArPSBidWZfc2l6ZTsKLSAgICB9Ci0gICAgcmV0dXJuIChGWF9JTlQzMilzaXplOworaW50MzJfdCBJRlhfQnVmZmVyQXJjaGl2ZTo6QXBwZW5kRFdvcmQoRlhfRFdPUkQgaSkgeworICBjaGFyIGJ1ZlszMl07CisgIEZYU1lTX2l0b2EoaSwgYnVmLCAxMCk7CisgIHJldHVybiBBcHBlbmRCbG9jayhidWYsIChzaXplX3QpRlhTWVNfc3RybGVuKGJ1ZikpOwogfQotRlhfSU5UMzIgSUZYX0J1ZmZlckFyY2hpdmU6OkFwcGVuZEJ5dGUoRlhfQllURSBieXRlKQotewotICAgIHJldHVybiBBcHBlbmRCbG9jaygmYnl0ZSwgMSk7Ci19Ci1GWF9JTlQzMiBJRlhfQnVmZmVyQXJjaGl2ZTo6QXBwZW5kRFdvcmQoRlhfRFdPUkQgaSkKLXsKLSAgICBjaGFyIGJ1ZlszMl07Ci0gICAgRlhTWVNfaXRvYShpLCBidWYsIDEwKTsKLSAgICByZXR1cm4gQXBwZW5kQmxvY2soYnVmLCAoc2l6ZV90KUZYU1lTX3N0cmxlbihidWYpKTsKLX0KLUZYX0lOVDMyIElGWF9CdWZmZXJBcmNoaXZlOjpBcHBlbmRTdHJpbmcoRlhfQlNUUiBscHN6KQotewotICAgIHJldHVybiBBcHBlbmRCbG9jayhscHN6LkdldFB0cigpLCBscHN6LkdldExlbmd0aCgpKTsKK2ludDMyX3QgSUZYX0J1ZmZlckFyY2hpdmU6OkFwcGVuZFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGxwc3opIHsKKyAgcmV0dXJuIEFwcGVuZEJsb2NrKGxwc3ouR2V0UHRyKCksIGxwc3ouR2V0TGVuZ3RoKCkpOwogfQogQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjpDRlhfRmlsZUJ1ZmZlckFyY2hpdmUoRlhfU1RSU0laRSBzaXplKQotICAgIDogSUZYX0J1ZmZlckFyY2hpdmUoc2l6ZSkKLSAgICAsIG1fcEZpbGUoTlVMTCkKLSAgICAsIG1fYlRha2VvdmVyKEZBTFNFKQoteworICAgIDogSUZYX0J1ZmZlckFyY2hpdmUoc2l6ZSksIG1fcEZpbGUoTlVMTCksIG1fYlRha2VvdmVyKEZBTFNFKSB7fQorQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjp+Q0ZYX0ZpbGVCdWZmZXJBcmNoaXZlKCkgeworICBDbGVhcigpOwogfQotQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjp+Q0ZYX0ZpbGVCdWZmZXJBcmNoaXZlKCkKLXsKLSAgICBDbGVhcigpOwordm9pZCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6OkNsZWFyKCkgeworICBpZiAobV9wRmlsZSAmJiBtX2JUYWtlb3ZlcikgeworICAgIG1fcEZpbGUtPlJlbGVhc2UoKTsKKyAgfQorICBtX3BGaWxlID0gTlVMTDsKKyAgbV9iVGFrZW92ZXIgPSBGQUxTRTsKKyAgSUZYX0J1ZmZlckFyY2hpdmU6OkNsZWFyKCk7CiB9Ci12b2lkIENGWF9GaWxlQnVmZmVyQXJjaGl2ZTo6Q2xlYXIoKQotewotICAgIGlmIChtX3BGaWxlICYmIG1fYlRha2VvdmVyKSB7Ci0gICAgICAgIG1fcEZpbGUtPlJlbGVhc2UoKTsKLSAgICB9Ci0gICAgbV9wRmlsZSA9IE5VTEw7Ci0gICAgbV9iVGFrZW92ZXIgPSBGQUxTRTsKLSAgICBJRlhfQnVmZmVyQXJjaGl2ZTo6Q2xlYXIoKTsKK0ZYX0JPT0wgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjpBdHRhY2hGaWxlKElGWF9TdHJlYW1Xcml0ZSogcEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUYWtlb3ZlcikgeworICBpZiAoIXBGaWxlKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX3BGaWxlICYmIG1fYlRha2VvdmVyKSB7CisgICAgbV9wRmlsZS0+UmVsZWFzZSgpOworICB9CisgIG1fcEZpbGUgPSBwRmlsZTsKKyAgbV9iVGFrZW92ZXIgPSBiVGFrZW92ZXI7CisgIHJldHVybiBUUlVFOwogfQotRlhfQk9PTCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6OkF0dGFjaEZpbGUoSUZYX1N0cmVhbVdyaXRlICpwRmlsZSwgRlhfQk9PTCBiVGFrZW92ZXIgKQotewotICAgIGlmICghcEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9wRmlsZSAmJiBtX2JUYWtlb3ZlcikgewotICAgICAgICBtX3BGaWxlLT5SZWxlYXNlKCk7Ci0gICAgfQotICAgIG1fcEZpbGUgPSBwRmlsZTsKLSAgICBtX2JUYWtlb3ZlciA9IGJUYWtlb3ZlcjsKK0ZYX0JPT0wgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjpEb1dvcmsoY29uc3Qgdm9pZCogcEJ1Ziwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCFtX3BGaWxlKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICghcEJ1ZiB8fCBzaXplIDwgMSkgewogICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6OkF0dGFjaEZpbGUoRlhfTFBDV1NUUiBmaWxlbmFtZSkKLXsKLSAgICBpZiAoIWZpbGVuYW1lKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG1fcEZpbGUgJiYgbV9iVGFrZW92ZXIpIHsKLSAgICAgICAgbV9wRmlsZS0+UmVsZWFzZSgpOwotICAgIH0KLSAgICBtX3BGaWxlID0gRlhfQ3JlYXRlRmlsZVdyaXRlKGZpbGVuYW1lKTsKLSAgICBpZiAoIW1fcEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX2JUYWtlb3ZlciA9IFRSVUU7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENGWF9GaWxlQnVmZmVyQXJjaGl2ZTo6QXR0YWNoRmlsZShGWF9MUENTVFIgZmlsZW5hbWUpCi17Ci0gICAgaWYgKCFmaWxlbmFtZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX3BGaWxlICYmIG1fYlRha2VvdmVyKSB7Ci0gICAgICAgIG1fcEZpbGUtPlJlbGVhc2UoKTsKLSAgICB9Ci0gICAgbV9wRmlsZSA9IEZYX0NyZWF0ZUZpbGVXcml0ZShmaWxlbmFtZSk7Ci0gICAgaWYgKCFtX3BGaWxlKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9iVGFrZW92ZXIgPSBUUlVFOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6OkRvV29yayhjb25zdCB2b2lkKiBwQnVmLCBzaXplX3Qgc2l6ZSkKLXsKLSAgICBpZiAoIW1fcEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoIXBCdWYgfHwgc2l6ZSA8IDEpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHJldHVybiBtX3BGaWxlLT5Xcml0ZUJsb2NrKHBCdWYsIHNpemUpOworICB9CisgIHJldHVybiBtX3BGaWxlLT5Xcml0ZUJsb2NrKHBCdWYsIHNpemUpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfY29vcmRzLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2Nvb3Jkcy5jcHAKaW5kZXggOGU3YmIzZS4uODE0ZmEzNiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfY29vcmRzLmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19jb29yZHMuY3BwCkBAIC0xLDU2MSArMSw1MzkgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfZXh0LmgiCi12b2lkIEZYX1JFQ1Q6Ok5vcm1hbGl6ZSgpCi17Ci0gICAgaWYgKGxlZnQgPiByaWdodCkgewotICAgICAgICBpbnQgdGVtcCA9IGxlZnQ7Ci0gICAgICAgIGxlZnQgPSByaWdodDsKLSAgICAgICAgcmlnaHQgPSB0ZW1wOwotICAgIH0KLSAgICBpZiAodG9wID4gYm90dG9tKSB7Ci0gICAgICAgIGludCB0ZW1wID0gdG9wOwotICAgICAgICB0b3AgPSBib3R0b207Ci0gICAgICAgIGJvdHRvbSA9IHRlbXA7Ci0gICAgfQotfQotdm9pZCBGWF9SRUNUOjpJbnRlcnNlY3QoY29uc3QgRlhfUkVDVCYgc3JjKQotewotICAgIEZYX1JFQ1Qgc3JjX24gPSBzcmM7Ci0gICAgc3JjX24uTm9ybWFsaXplKCk7Ci0gICAgTm9ybWFsaXplKCk7Ci0gICAgbGVmdCA9IGxlZnQgPiBzcmNfbi5sZWZ0ID8gbGVmdCA6IHNyY19uLmxlZnQ7Ci0gICAgdG9wID0gdG9wID4gc3JjX24udG9wID8gdG9wIDogc3JjX24udG9wOwotICAgIHJpZ2h0ID0gcmlnaHQgPCBzcmNfbi5yaWdodCA/IHJpZ2h0IDogc3JjX24ucmlnaHQ7Ci0gICAgYm90dG9tID0gYm90dG9tIDwgc3JjX24uYm90dG9tID8gYm90dG9tIDogc3JjX24uYm90dG9tOwotICAgIGlmIChsZWZ0ID4gcmlnaHQgfHwgdG9wID4gYm90dG9tKSB7Ci0gICAgICAgIGxlZnQgPSB0b3AgPSByaWdodCA9IGJvdHRvbSA9IDA7Ci0gICAgfQotfQotdm9pZCBGWF9SRUNUOjpVbmlvbihjb25zdCBGWF9SRUNUJiBvdGhlcl9yZWN0KQotewotICAgIE5vcm1hbGl6ZSgpOwotICAgIEZYX1JFQ1Qgb3RoZXIgPSBvdGhlcl9yZWN0OwotICAgIG90aGVyLk5vcm1hbGl6ZSgpOwotICAgIGxlZnQgPSBsZWZ0IDwgb3RoZXIubGVmdCA/IGxlZnQgOiBvdGhlci5sZWZ0OwotICAgIHJpZ2h0ID0gcmlnaHQgPiBvdGhlci5yaWdodCA/IHJpZ2h0IDogb3RoZXIucmlnaHQ7Ci0gICAgYm90dG9tID0gYm90dG9tID4gb3RoZXIuYm90dG9tID8gYm90dG9tIDogb3RoZXIuYm90dG9tOwotICAgIHRvcCA9IHRvcCA8IG90aGVyLnRvcCA/IHRvcCA6IG90aGVyLnRvcDsKLX0KLUZYX0JPT0wgR2V0SW50ZXJzZWN0aW9uKEZYX0ZMT0FUIGxvdzEsIEZYX0ZMT0FUIGhpZ2gxLCBGWF9GTE9BVCBsb3cyLCBGWF9GTE9BVCBoaWdoMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBpbnRlcmxvdywgRlhfRkxPQVQmIGludGVyaGlnaCkKLXsKLSAgICBpZiAobG93MSA+PSBoaWdoMiB8fCBsb3cyID49IGhpZ2gxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaW50ZXJsb3cgPSBsb3cxID4gbG93MiA/IGxvdzEgOiBsb3cyOwotICAgIGludGVyaGlnaCA9IGhpZ2gxID4gaGlnaDIgPyBoaWdoMiA6IGhpZ2gxOwotICAgIHJldHVybiBUUlVFOwotfQotZXh0ZXJuICJDIiBpbnQgRlhTWVNfcm91bmQoRlhfRkxPQVQgZCkKLXsKLSAgICBpZiAoZCA8IChGWF9GTE9BVClJTlRfTUlOKSB7Ci0gICAgICAgIHJldHVybiBJTlRfTUlOOwotICAgIH0KLSAgICBpZiAoZCA+IChGWF9GTE9BVClJTlRfTUFYKSB7Ci0gICAgICAgIHJldHVybiBJTlRfTUFYOwotICAgIH0KIAotICAgIHJldHVybiAoaW50KXJvdW5kKGQpOworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9leHQuaCIKKwordm9pZCBGWF9SRUNUOjpOb3JtYWxpemUoKSB7CisgIGlmIChsZWZ0ID4gcmlnaHQpIHsKKyAgICBpbnQgdGVtcCA9IGxlZnQ7CisgICAgbGVmdCA9IHJpZ2h0OworICAgIHJpZ2h0ID0gdGVtcDsKKyAgfQorICBpZiAodG9wID4gYm90dG9tKSB7CisgICAgaW50IHRlbXAgPSB0b3A7CisgICAgdG9wID0gYm90dG9tOworICAgIGJvdHRvbSA9IHRlbXA7CisgIH0KIH0KLUNGWF9GbG9hdFJlY3Q6OkNGWF9GbG9hdFJlY3QoY29uc3QgRlhfUkVDVCYgcmVjdCkKLXsKLSAgICBsZWZ0ID0gKEZYX0ZMT0FUKShyZWN0LmxlZnQpOwotICAgIHJpZ2h0ID0gKEZYX0ZMT0FUKShyZWN0LnJpZ2h0KTsKLSAgICBib3R0b20gPSAoRlhfRkxPQVQpKHJlY3QudG9wKTsKLSAgICB0b3AgPSAoRlhfRkxPQVQpKHJlY3QuYm90dG9tKTsKK3ZvaWQgRlhfUkVDVDo6SW50ZXJzZWN0KGNvbnN0IEZYX1JFQ1QmIHNyYykgeworICBGWF9SRUNUIHNyY19uID0gc3JjOworICBzcmNfbi5Ob3JtYWxpemUoKTsKKyAgTm9ybWFsaXplKCk7CisgIGxlZnQgPSBsZWZ0ID4gc3JjX24ubGVmdCA/IGxlZnQgOiBzcmNfbi5sZWZ0OworICB0b3AgPSB0b3AgPiBzcmNfbi50b3AgPyB0b3AgOiBzcmNfbi50b3A7CisgIHJpZ2h0ID0gcmlnaHQgPCBzcmNfbi5yaWdodCA/IHJpZ2h0IDogc3JjX24ucmlnaHQ7CisgIGJvdHRvbSA9IGJvdHRvbSA8IHNyY19uLmJvdHRvbSA/IGJvdHRvbSA6IHNyY19uLmJvdHRvbTsKKyAgaWYgKGxlZnQgPiByaWdodCB8fCB0b3AgPiBib3R0b20pIHsKKyAgICBsZWZ0ID0gdG9wID0gcmlnaHQgPSBib3R0b20gPSAwOworICB9CiB9Ci12b2lkIENGWF9GbG9hdFJlY3Q6Ok5vcm1hbGl6ZSgpCi17Ci0gICAgRlhfRkxPQVQgdGVtcDsKLSAgICBpZiAobGVmdCA+IHJpZ2h0KSB7Ci0gICAgICAgIHRlbXAgPSBsZWZ0OwotICAgICAgICBsZWZ0ID0gcmlnaHQ7Ci0gICAgICAgIHJpZ2h0ID0gdGVtcDsKLSAgICB9Ci0gICAgaWYgKGJvdHRvbSA+IHRvcCkgewotICAgICAgICB0ZW1wID0gdG9wOwotICAgICAgICB0b3AgPSBib3R0b207Ci0gICAgICAgIGJvdHRvbSA9IHRlbXA7Ci0gICAgfQordm9pZCBGWF9SRUNUOjpVbmlvbihjb25zdCBGWF9SRUNUJiBvdGhlcl9yZWN0KSB7CisgIE5vcm1hbGl6ZSgpOworICBGWF9SRUNUIG90aGVyID0gb3RoZXJfcmVjdDsKKyAgb3RoZXIuTm9ybWFsaXplKCk7CisgIGxlZnQgPSBsZWZ0IDwgb3RoZXIubGVmdCA/IGxlZnQgOiBvdGhlci5sZWZ0OworICByaWdodCA9IHJpZ2h0ID4gb3RoZXIucmlnaHQgPyByaWdodCA6IG90aGVyLnJpZ2h0OworICBib3R0b20gPSBib3R0b20gPiBvdGhlci5ib3R0b20gPyBib3R0b20gOiBvdGhlci5ib3R0b207CisgIHRvcCA9IHRvcCA8IG90aGVyLnRvcCA/IHRvcCA6IG90aGVyLnRvcDsKIH0KLXZvaWQgQ0ZYX0Zsb2F0UmVjdDo6SW50ZXJzZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIG90aGVyX3JlY3QpCi17Ci0gICAgTm9ybWFsaXplKCk7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCBvdGhlciA9IG90aGVyX3JlY3Q7Ci0gICAgb3RoZXIuTm9ybWFsaXplKCk7Ci0gICAgbGVmdCA9IGxlZnQgPiBvdGhlci5sZWZ0ID8gbGVmdCA6IG90aGVyLmxlZnQ7Ci0gICAgcmlnaHQgPSByaWdodCA8IG90aGVyLnJpZ2h0ID8gcmlnaHQgOiBvdGhlci5yaWdodDsKLSAgICBib3R0b20gPSBib3R0b20gPiBvdGhlci5ib3R0b20gPyBib3R0b20gOiBvdGhlci5ib3R0b207Ci0gICAgdG9wID0gdG9wIDwgb3RoZXIudG9wID8gdG9wIDogb3RoZXIudG9wOwotICAgIGlmIChsZWZ0ID4gcmlnaHQgfHwgYm90dG9tID4gdG9wKSB7Ci0gICAgICAgIGxlZnQgPSByaWdodCA9IGJvdHRvbSA9IHRvcCA9IDA7Ci0gICAgfQotfQotdm9pZCBDRlhfRmxvYXRSZWN0OjpVbmlvbihjb25zdCBDRlhfRmxvYXRSZWN0JiBvdGhlcl9yZWN0KQotewotICAgIE5vcm1hbGl6ZSgpOwotICAgIENGWF9GbG9hdFJlY3Qgb3RoZXIgPSBvdGhlcl9yZWN0OwotICAgIG90aGVyLk5vcm1hbGl6ZSgpOwotICAgIGxlZnQgPSBsZWZ0IDwgb3RoZXIubGVmdCA/IGxlZnQgOiBvdGhlci5sZWZ0OwotICAgIHJpZ2h0ID0gcmlnaHQgPiBvdGhlci5yaWdodCA/IHJpZ2h0IDogb3RoZXIucmlnaHQ7Ci0gICAgYm90dG9tID0gYm90dG9tIDwgb3RoZXIuYm90dG9tID8gYm90dG9tIDogb3RoZXIuYm90dG9tOwotICAgIHRvcCA9IHRvcCA+IG90aGVyLnRvcCA/IHRvcCA6IG90aGVyLnRvcDsKLX0KLXZvaWQgQ0ZYX0Zsb2F0UmVjdDo6VHJhbnNmb3JtKGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpCi17Ci0gICAgcE1hdHJpeC0+VHJhbnNmb3JtUmVjdChsZWZ0LCByaWdodCwgdG9wLCBib3R0b20pOwotfQotaW50IENGWF9GbG9hdFJlY3Q6OlN1YnN0cmFjdDQoQ0ZYX0Zsb2F0UmVjdCYgcywgQ0ZYX0Zsb2F0UmVjdCogcFJlY3RzKQotewotICAgIE5vcm1hbGl6ZSgpOwotICAgIHMuTm9ybWFsaXplKCk7Ci0gICAgaW50IG5SZWN0cyA9IDA7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByZWN0c1s0XTsKLSAgICBpZiAobGVmdCA8IHMubGVmdCkgewotICAgICAgICByZWN0c1tuUmVjdHNdLmxlZnQgPSBsZWZ0OwotICAgICAgICByZWN0c1tuUmVjdHNdLnJpZ2h0ID0gcy5sZWZ0OwotICAgICAgICByZWN0c1tuUmVjdHNdLmJvdHRvbSA9IGJvdHRvbTsKLSAgICAgICAgcmVjdHNbblJlY3RzXS50b3AgPSB0b3A7Ci0gICAgICAgIG5SZWN0cyArKzsKLSAgICB9Ci0gICAgaWYgKHMubGVmdCA8IHJpZ2h0ICYmIHMudG9wIDwgdG9wKSB7Ci0gICAgICAgIHJlY3RzW25SZWN0c10ubGVmdCA9IHMubGVmdDsKLSAgICAgICAgcmVjdHNbblJlY3RzXS5yaWdodCA9IHJpZ2h0OwotICAgICAgICByZWN0c1tuUmVjdHNdLmJvdHRvbSA9IHMudG9wOwotICAgICAgICByZWN0c1tuUmVjdHNdLnRvcCA9IHRvcDsKLSAgICAgICAgblJlY3RzICsrOwotICAgIH0KLSAgICBpZiAocy50b3AgPiBib3R0b20gJiYgcy5yaWdodCA8IHJpZ2h0KSB7Ci0gICAgICAgIHJlY3RzW25SZWN0c10ubGVmdCA9IHMucmlnaHQ7Ci0gICAgICAgIHJlY3RzW25SZWN0c10ucmlnaHQgPSByaWdodDsKLSAgICAgICAgcmVjdHNbblJlY3RzXS5ib3R0b20gPSBib3R0b207Ci0gICAgICAgIHJlY3RzW25SZWN0c10udG9wID0gcy50b3A7Ci0gICAgICAgIG5SZWN0cyArKzsKLSAgICB9Ci0gICAgaWYgKHMuYm90dG9tID4gYm90dG9tKSB7Ci0gICAgICAgIHJlY3RzW25SZWN0c10ubGVmdCA9IHMubGVmdDsKLSAgICAgICAgcmVjdHNbblJlY3RzXS5yaWdodCA9IHMucmlnaHQ7Ci0gICAgICAgIHJlY3RzW25SZWN0c10uYm90dG9tID0gYm90dG9tOwotICAgICAgICByZWN0c1tuUmVjdHNdLnRvcCA9IHMuYm90dG9tOwotICAgICAgICBuUmVjdHMgKys7Ci0gICAgfQotICAgIGlmIChuUmVjdHMgPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuUmVjdHM7IGkgKyspIHsKLSAgICAgICAgcFJlY3RzW2ldID0gcmVjdHNbaV07Ci0gICAgICAgIHBSZWN0c1tpXS5JbnRlcnNlY3QoKnRoaXMpOwotICAgIH0KLSAgICByZXR1cm4gblJlY3RzOwotfQotRlhfUkVDVCBDRlhfRmxvYXRSZWN0OjpHZXRPdXR0ZXJSZWN0KCkgY29uc3QKLXsKLSAgICBDRlhfRmxvYXRSZWN0IHJlY3QxID0gKnRoaXM7Ci0gICAgRlhfUkVDVCByZWN0OwotICAgIHJlY3QubGVmdCA9IChpbnQpRlhTWVNfZmxvb3IocmVjdDEubGVmdCk7Ci0gICAgcmVjdC5yaWdodCA9IChpbnQpRlhTWVNfY2VpbChyZWN0MS5yaWdodCk7Ci0gICAgcmVjdC50b3AgPSAoaW50KUZYU1lTX2Zsb29yKHJlY3QxLmJvdHRvbSk7Ci0gICAgcmVjdC5ib3R0b20gPSAoaW50KUZYU1lTX2NlaWwocmVjdDEudG9wKTsKLSAgICByZWN0Lk5vcm1hbGl6ZSgpOwotICAgIHJldHVybiByZWN0OwotfQotRlhfUkVDVCBDRlhfRmxvYXRSZWN0OjpHZXRJbm5lclJlY3QoKSBjb25zdAotewotICAgIENGWF9GbG9hdFJlY3QgcmVjdDEgPSAqdGhpczsKLSAgICBGWF9SRUNUIHJlY3Q7Ci0gICAgcmVjdC5sZWZ0ID0gKGludClGWFNZU19jZWlsKHJlY3QxLmxlZnQpOwotICAgIHJlY3QucmlnaHQgPSAoaW50KUZYU1lTX2Zsb29yKHJlY3QxLnJpZ2h0KTsKLSAgICByZWN0LnRvcCA9IChpbnQpRlhTWVNfY2VpbChyZWN0MS5ib3R0b20pOwotICAgIHJlY3QuYm90dG9tID0gKGludClGWFNZU19mbG9vcihyZWN0MS50b3ApOwotICAgIHJlY3QuTm9ybWFsaXplKCk7Ci0gICAgcmV0dXJuIHJlY3Q7Ci19Ci1zdGF0aWMgdm9pZCBfTWF0Y2hGbG9hdFJhbmdlKEZYX0ZMT0FUIGYxLCBGWF9GTE9BVCBmMiwgaW50JiBpMSwgaW50JiBpMikKLXsKLSAgICBpbnQgbGVuZ3RoID0gKGludClGWFNZU19jZWlsKGYyIC0gZjEpOwotICAgIGludCBpMV8xID0gKGludClGWFNZU19mbG9vcihmMSk7Ci0gICAgaW50IGkxXzIgPSAoaW50KUZYU1lTX2NlaWwoZjEpOwotICAgIEZYX0ZMT0FUIGVycm9yMSA9IGYxIC0gaTFfMSArIChGWF9GTE9BVClGWFNZU19mYWJzKGYyIC0gaTFfMSAtIGxlbmd0aCk7Ci0gICAgRlhfRkxPQVQgZXJyb3IyID0gaTFfMiAtIGYxICsgKEZYX0ZMT0FUKUZYU1lTX2ZhYnMoZjIgLSBpMV8yIC0gbGVuZ3RoKTsKLSAgICBpMSA9IChlcnJvcjEgPiBlcnJvcjIpID8gaTFfMiA6IGkxXzE7Ci0gICAgaTIgPSBpMSArIGxlbmd0aDsKLX0KLUZYX1JFQ1QgQ0ZYX0Zsb2F0UmVjdDo6R2V0Q2xvc2VzdFJlY3QoKSBjb25zdAotewotICAgIENGWF9GbG9hdFJlY3QgcmVjdDEgPSAqdGhpczsKLSAgICBGWF9SRUNUIHJlY3Q7Ci0gICAgX01hdGNoRmxvYXRSYW5nZShyZWN0MS5sZWZ0LCByZWN0MS5yaWdodCwgcmVjdC5sZWZ0LCByZWN0LnJpZ2h0KTsKLSAgICBfTWF0Y2hGbG9hdFJhbmdlKHJlY3QxLmJvdHRvbSwgcmVjdDEudG9wLCByZWN0LnRvcCwgcmVjdC5ib3R0b20pOwotICAgIHJlY3QuTm9ybWFsaXplKCk7Ci0gICAgcmV0dXJuIHJlY3Q7Ci19Ci1GWF9CT09MIENGWF9GbG9hdFJlY3Q6OkNvbnRhaW5zKGNvbnN0IENGWF9GbG9hdFJlY3QmIG90aGVyX3JlY3QpIGNvbnN0Ci17Ci0gICAgQ0ZYX0Zsb2F0UmVjdCBuMSA9ICp0aGlzOwotICAgIG4xLk5vcm1hbGl6ZSgpOwotICAgIENGWF9GbG9hdFJlY3QgbjIgPSBvdGhlcl9yZWN0OwotICAgIG4yLk5vcm1hbGl6ZSgpOwotICAgIGlmIChuMi5sZWZ0ID49IG4xLmxlZnQgJiYgbjIucmlnaHQgPD0gbjEucmlnaHQgJiYgbjIuYm90dG9tID49IG4xLmJvdHRvbSAmJiBuMi50b3AgPD0gbjEudG9wKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KK0ZYX0JPT0wgR2V0SW50ZXJzZWN0aW9uKEZYX0ZMT0FUIGxvdzEsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoaWdoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGxvdzIsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoaWdoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBpbnRlcmxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBpbnRlcmhpZ2gpIHsKKyAgaWYgKGxvdzEgPj0gaGlnaDIgfHwgbG93MiA+PSBoaWdoMSkgewogICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpbnRlcmxvdyA9IGxvdzEgPiBsb3cyID8gbG93MSA6IGxvdzI7CisgIGludGVyaGlnaCA9IGhpZ2gxID4gaGlnaDIgPyBoaWdoMiA6IGhpZ2gxOworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ0ZYX0Zsb2F0UmVjdDo6Q29udGFpbnMoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkgY29uc3QKLXsKLSAgICBDRlhfRmxvYXRSZWN0IG4xID0gKnRoaXM7Ci0gICAgbjEuTm9ybWFsaXplKCk7Ci0gICAgcmV0dXJuIHggPD0gbjEucmlnaHQgJiYgeCA+PSBuMS5sZWZ0ICYmIHkgPD0gbjEudG9wICYmIHkgPj0gbjEuYm90dG9tOworZXh0ZXJuICJDIiBpbnQgRlhTWVNfcm91bmQoRlhfRkxPQVQgZCkgeworICBpZiAoZCA8IChGWF9GTE9BVClJTlRfTUlOKSB7CisgICAgcmV0dXJuIElOVF9NSU47CisgIH0KKyAgaWYgKGQgPiAoRlhfRkxPQVQpSU5UX01BWCkgeworICAgIHJldHVybiBJTlRfTUFYOworICB9CisKKyAgcmV0dXJuIChpbnQpcm91bmQoZCk7CiB9Ci12b2lkIENGWF9GbG9hdFJlY3Q6OlVwZGF0ZVJlY3QoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkKLXsKLSAgICBpZiAobGVmdCA+IHgpIHsKLSAgICAgICAgbGVmdCA9IHg7CitDRlhfRmxvYXRSZWN0OjpDRlhfRmxvYXRSZWN0KGNvbnN0IEZYX1JFQ1QmIHJlY3QpIHsKKyAgbGVmdCA9IChGWF9GTE9BVCkocmVjdC5sZWZ0KTsKKyAgcmlnaHQgPSAoRlhfRkxPQVQpKHJlY3QucmlnaHQpOworICBib3R0b20gPSAoRlhfRkxPQVQpKHJlY3QudG9wKTsKKyAgdG9wID0gKEZYX0ZMT0FUKShyZWN0LmJvdHRvbSk7Cit9Cit2b2lkIENGWF9GbG9hdFJlY3Q6Ok5vcm1hbGl6ZSgpIHsKKyAgRlhfRkxPQVQgdGVtcDsKKyAgaWYgKGxlZnQgPiByaWdodCkgeworICAgIHRlbXAgPSBsZWZ0OworICAgIGxlZnQgPSByaWdodDsKKyAgICByaWdodCA9IHRlbXA7CisgIH0KKyAgaWYgKGJvdHRvbSA+IHRvcCkgeworICAgIHRlbXAgPSB0b3A7CisgICAgdG9wID0gYm90dG9tOworICAgIGJvdHRvbSA9IHRlbXA7CisgIH0KK30KK3ZvaWQgQ0ZYX0Zsb2F0UmVjdDo6SW50ZXJzZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIG90aGVyX3JlY3QpIHsKKyAgTm9ybWFsaXplKCk7CisgIENGWF9GbG9hdFJlY3Qgb3RoZXIgPSBvdGhlcl9yZWN0OworICBvdGhlci5Ob3JtYWxpemUoKTsKKyAgbGVmdCA9IGxlZnQgPiBvdGhlci5sZWZ0ID8gbGVmdCA6IG90aGVyLmxlZnQ7CisgIHJpZ2h0ID0gcmlnaHQgPCBvdGhlci5yaWdodCA/IHJpZ2h0IDogb3RoZXIucmlnaHQ7CisgIGJvdHRvbSA9IGJvdHRvbSA+IG90aGVyLmJvdHRvbSA/IGJvdHRvbSA6IG90aGVyLmJvdHRvbTsKKyAgdG9wID0gdG9wIDwgb3RoZXIudG9wID8gdG9wIDogb3RoZXIudG9wOworICBpZiAobGVmdCA+IHJpZ2h0IHx8IGJvdHRvbSA+IHRvcCkgeworICAgIGxlZnQgPSByaWdodCA9IGJvdHRvbSA9IHRvcCA9IDA7CisgIH0KK30KK3ZvaWQgQ0ZYX0Zsb2F0UmVjdDo6VW5pb24oY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgb3RoZXJfcmVjdCkgeworICBOb3JtYWxpemUoKTsKKyAgQ0ZYX0Zsb2F0UmVjdCBvdGhlciA9IG90aGVyX3JlY3Q7CisgIG90aGVyLk5vcm1hbGl6ZSgpOworICBsZWZ0ID0gbGVmdCA8IG90aGVyLmxlZnQgPyBsZWZ0IDogb3RoZXIubGVmdDsKKyAgcmlnaHQgPSByaWdodCA+IG90aGVyLnJpZ2h0ID8gcmlnaHQgOiBvdGhlci5yaWdodDsKKyAgYm90dG9tID0gYm90dG9tIDwgb3RoZXIuYm90dG9tID8gYm90dG9tIDogb3RoZXIuYm90dG9tOworICB0b3AgPSB0b3AgPiBvdGhlci50b3AgPyB0b3AgOiBvdGhlci50b3A7Cit9Cit2b2lkIENGWF9GbG9hdFJlY3Q6OlRyYW5zZm9ybShjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7CisgIHBNYXRyaXgtPlRyYW5zZm9ybVJlY3QobGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tKTsKK30KK2ludCBDRlhfRmxvYXRSZWN0OjpTdWJzdHJhY3Q0KENGWF9GbG9hdFJlY3QmIHMsIENGWF9GbG9hdFJlY3QqIHBSZWN0cykgeworICBOb3JtYWxpemUoKTsKKyAgcy5Ob3JtYWxpemUoKTsKKyAgaW50IG5SZWN0cyA9IDA7CisgIENGWF9GbG9hdFJlY3QgcmVjdHNbNF07CisgIGlmIChsZWZ0IDwgcy5sZWZ0KSB7CisgICAgcmVjdHNbblJlY3RzXS5sZWZ0ID0gbGVmdDsKKyAgICByZWN0c1tuUmVjdHNdLnJpZ2h0ID0gcy5sZWZ0OworICAgIHJlY3RzW25SZWN0c10uYm90dG9tID0gYm90dG9tOworICAgIHJlY3RzW25SZWN0c10udG9wID0gdG9wOworICAgIG5SZWN0cysrOworICB9CisgIGlmIChzLmxlZnQgPCByaWdodCAmJiBzLnRvcCA8IHRvcCkgeworICAgIHJlY3RzW25SZWN0c10ubGVmdCA9IHMubGVmdDsKKyAgICByZWN0c1tuUmVjdHNdLnJpZ2h0ID0gcmlnaHQ7CisgICAgcmVjdHNbblJlY3RzXS5ib3R0b20gPSBzLnRvcDsKKyAgICByZWN0c1tuUmVjdHNdLnRvcCA9IHRvcDsKKyAgICBuUmVjdHMrKzsKKyAgfQorICBpZiAocy50b3AgPiBib3R0b20gJiYgcy5yaWdodCA8IHJpZ2h0KSB7CisgICAgcmVjdHNbblJlY3RzXS5sZWZ0ID0gcy5yaWdodDsKKyAgICByZWN0c1tuUmVjdHNdLnJpZ2h0ID0gcmlnaHQ7CisgICAgcmVjdHNbblJlY3RzXS5ib3R0b20gPSBib3R0b207CisgICAgcmVjdHNbblJlY3RzXS50b3AgPSBzLnRvcDsKKyAgICBuUmVjdHMrKzsKKyAgfQorICBpZiAocy5ib3R0b20gPiBib3R0b20pIHsKKyAgICByZWN0c1tuUmVjdHNdLmxlZnQgPSBzLmxlZnQ7CisgICAgcmVjdHNbblJlY3RzXS5yaWdodCA9IHMucmlnaHQ7CisgICAgcmVjdHNbblJlY3RzXS5ib3R0b20gPSBib3R0b207CisgICAgcmVjdHNbblJlY3RzXS50b3AgPSBzLmJvdHRvbTsKKyAgICBuUmVjdHMrKzsKKyAgfQorICBpZiAoblJlY3RzID09IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IG5SZWN0czsgaSsrKSB7CisgICAgcFJlY3RzW2ldID0gcmVjdHNbaV07CisgICAgcFJlY3RzW2ldLkludGVyc2VjdCgqdGhpcyk7CisgIH0KKyAgcmV0dXJuIG5SZWN0czsKK30KK0ZYX1JFQ1QgQ0ZYX0Zsb2F0UmVjdDo6R2V0T3V0dGVyUmVjdCgpIGNvbnN0IHsKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0MSA9ICp0aGlzOworICBGWF9SRUNUIHJlY3Q7CisgIHJlY3QubGVmdCA9IChpbnQpRlhTWVNfZmxvb3IocmVjdDEubGVmdCk7CisgIHJlY3QucmlnaHQgPSAoaW50KUZYU1lTX2NlaWwocmVjdDEucmlnaHQpOworICByZWN0LnRvcCA9IChpbnQpRlhTWVNfZmxvb3IocmVjdDEuYm90dG9tKTsKKyAgcmVjdC5ib3R0b20gPSAoaW50KUZYU1lTX2NlaWwocmVjdDEudG9wKTsKKyAgcmVjdC5Ob3JtYWxpemUoKTsKKyAgcmV0dXJuIHJlY3Q7Cit9CitGWF9SRUNUIENGWF9GbG9hdFJlY3Q6OkdldElubmVyUmVjdCgpIGNvbnN0IHsKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0MSA9ICp0aGlzOworICBGWF9SRUNUIHJlY3Q7CisgIHJlY3QubGVmdCA9IChpbnQpRlhTWVNfY2VpbChyZWN0MS5sZWZ0KTsKKyAgcmVjdC5yaWdodCA9IChpbnQpRlhTWVNfZmxvb3IocmVjdDEucmlnaHQpOworICByZWN0LnRvcCA9IChpbnQpRlhTWVNfY2VpbChyZWN0MS5ib3R0b20pOworICByZWN0LmJvdHRvbSA9IChpbnQpRlhTWVNfZmxvb3IocmVjdDEudG9wKTsKKyAgcmVjdC5Ob3JtYWxpemUoKTsKKyAgcmV0dXJuIHJlY3Q7Cit9CitzdGF0aWMgdm9pZCBfTWF0Y2hGbG9hdFJhbmdlKEZYX0ZMT0FUIGYxLCBGWF9GTE9BVCBmMiwgaW50JiBpMSwgaW50JiBpMikgeworICBpbnQgbGVuZ3RoID0gKGludClGWFNZU19jZWlsKGYyIC0gZjEpOworICBpbnQgaTFfMSA9IChpbnQpRlhTWVNfZmxvb3IoZjEpOworICBpbnQgaTFfMiA9IChpbnQpRlhTWVNfY2VpbChmMSk7CisgIEZYX0ZMT0FUIGVycm9yMSA9IGYxIC0gaTFfMSArIChGWF9GTE9BVClGWFNZU19mYWJzKGYyIC0gaTFfMSAtIGxlbmd0aCk7CisgIEZYX0ZMT0FUIGVycm9yMiA9IGkxXzIgLSBmMSArIChGWF9GTE9BVClGWFNZU19mYWJzKGYyIC0gaTFfMiAtIGxlbmd0aCk7CisgIGkxID0gKGVycm9yMSA+IGVycm9yMikgPyBpMV8yIDogaTFfMTsKKyAgaTIgPSBpMSArIGxlbmd0aDsKK30KK0ZYX1JFQ1QgQ0ZYX0Zsb2F0UmVjdDo6R2V0Q2xvc2VzdFJlY3QoKSBjb25zdCB7CisgIENGWF9GbG9hdFJlY3QgcmVjdDEgPSAqdGhpczsKKyAgRlhfUkVDVCByZWN0OworICBfTWF0Y2hGbG9hdFJhbmdlKHJlY3QxLmxlZnQsIHJlY3QxLnJpZ2h0LCByZWN0LmxlZnQsIHJlY3QucmlnaHQpOworICBfTWF0Y2hGbG9hdFJhbmdlKHJlY3QxLmJvdHRvbSwgcmVjdDEudG9wLCByZWN0LnRvcCwgcmVjdC5ib3R0b20pOworICByZWN0Lk5vcm1hbGl6ZSgpOworICByZXR1cm4gcmVjdDsKK30KK0ZYX0JPT0wgQ0ZYX0Zsb2F0UmVjdDo6Q29udGFpbnMoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgb3RoZXJfcmVjdCkgY29uc3QgeworICBDRlhfRmxvYXRSZWN0IG4xID0gKnRoaXM7CisgIG4xLk5vcm1hbGl6ZSgpOworICBDRlhfRmxvYXRSZWN0IG4yID0gb3RoZXJfcmVjdDsKKyAgbjIuTm9ybWFsaXplKCk7CisgIGlmIChuMi5sZWZ0ID49IG4xLmxlZnQgJiYgbjIucmlnaHQgPD0gbjEucmlnaHQgJiYgbjIuYm90dG9tID49IG4xLmJvdHRvbSAmJgorICAgICAgbjIudG9wIDw9IG4xLnRvcCkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKK30KK0ZYX0JPT0wgQ0ZYX0Zsb2F0UmVjdDo6Q29udGFpbnMoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkgY29uc3QgeworICBDRlhfRmxvYXRSZWN0IG4xID0gKnRoaXM7CisgIG4xLk5vcm1hbGl6ZSgpOworICByZXR1cm4geCA8PSBuMS5yaWdodCAmJiB4ID49IG4xLmxlZnQgJiYgeSA8PSBuMS50b3AgJiYgeSA+PSBuMS5ib3R0b207Cit9Cit2b2lkIENGWF9GbG9hdFJlY3Q6OlVwZGF0ZVJlY3QoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkgeworICBpZiAobGVmdCA+IHgpIHsKKyAgICBsZWZ0ID0geDsKKyAgfQorICBpZiAocmlnaHQgPCB4KSB7CisgICAgcmlnaHQgPSB4OworICB9CisgIGlmIChib3R0b20gPiB5KSB7CisgICAgYm90dG9tID0geTsKKyAgfQorICBpZiAodG9wIDwgeSkgeworICAgIHRvcCA9IHk7CisgIH0KK30KK0NGWF9GbG9hdFJlY3QgQ0ZYX0Zsb2F0UmVjdDo6R2V0QkJveChjb25zdCBDRlhfRmxvYXRQb2ludCogcFBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblBvaW50cykgeworICBpZiAoblBvaW50cyA9PSAwKSB7CisgICAgcmV0dXJuIENGWF9GbG9hdFJlY3QoKTsKKyAgfQorICBGWF9GTE9BVCBtaW5feCA9IHBQb2ludHMtPngsIG1heF94ID0gcFBvaW50cy0+eCwgbWluX3kgPSBwUG9pbnRzLT55LAorICAgICAgICAgICBtYXhfeSA9IHBQb2ludHMtPnk7CisgIGZvciAoaW50IGkgPSAxOyBpIDwgblBvaW50czsgaSsrKSB7CisgICAgaWYgKG1pbl94ID4gcFBvaW50c1tpXS54KSB7CisgICAgICBtaW5feCA9IHBQb2ludHNbaV0ueDsKICAgICB9Ci0gICAgaWYgKHJpZ2h0IDwgeCkgewotICAgICAgICByaWdodCA9IHg7CisgICAgaWYgKG1heF94IDwgcFBvaW50c1tpXS54KSB7CisgICAgICBtYXhfeCA9IHBQb2ludHNbaV0ueDsKICAgICB9Ci0gICAgaWYgKGJvdHRvbSA+IHkpIHsKLSAgICAgICAgYm90dG9tID0geTsKKyAgICBpZiAobWluX3kgPiBwUG9pbnRzW2ldLnkpIHsKKyAgICAgIG1pbl95ID0gcFBvaW50c1tpXS55OwogICAgIH0KLSAgICBpZiAodG9wIDwgeSkgewotICAgICAgICB0b3AgPSB5OworICAgIGlmIChtYXhfeSA8IHBQb2ludHNbaV0ueSkgeworICAgICAgbWF4X3kgPSBwUG9pbnRzW2ldLnk7CiAgICAgfQorICB9CisgIHJldHVybiBDRlhfRmxvYXRSZWN0KG1pbl94LCBtaW5feSwgbWF4X3gsIG1heF95KTsKIH0KLUNGWF9GbG9hdFJlY3QgQ0ZYX0Zsb2F0UmVjdDo6R2V0QkJveChjb25zdCBDRlhfRmxvYXRQb2ludCogcFBvaW50cywgaW50IG5Qb2ludHMpCi17Ci0gICAgaWYgKG5Qb2ludHMgPT0gMCkgewotICAgICAgICByZXR1cm4gQ0ZYX0Zsb2F0UmVjdCgpOwordm9pZCBDRlhfTWF0cml4OjpTZXQoRlhfRkxPQVQgb3RoZXJfYSwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG90aGVyX2IsCisgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBvdGhlcl9jLAorICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgb3RoZXJfZCwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG90aGVyX2UsCisgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBvdGhlcl9mKSB7CisgIGEgPSBvdGhlcl9hOworICBiID0gb3RoZXJfYjsKKyAgYyA9IG90aGVyX2M7CisgIGQgPSBvdGhlcl9kOworICBlID0gb3RoZXJfZTsKKyAgZiA9IG90aGVyX2Y7Cit9Cit2b2lkIENGWF9NYXRyaXg6OlNldChjb25zdCBGWF9GTE9BVCBuWzZdKSB7CisgIGEgPSBuWzBdOworICBiID0gblsxXTsKKyAgYyA9IG5bMl07CisgIGQgPSBuWzNdOworICBlID0gbls0XTsKKyAgZiA9IG5bNV07Cit9Cit2b2lkIENGWF9NYXRyaXg6OlNldFJldmVyc2UoY29uc3QgQ0ZYX01hdHJpeCYgbSkgeworICBGWF9GTE9BVCBpID0gbS5hICogbS5kIC0gbS5iICogbS5jOworICBpZiAoRlhTWVNfZmFicyhpKSA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIEZYX0ZMT0FUIGogPSAtaTsKKyAgYSA9IG0uZCAvIGk7CisgIGIgPSBtLmIgLyBqOworICBjID0gbS5jIC8gajsKKyAgZCA9IG0uYSAvIGk7CisgIGUgPSAobS5jICogbS5mIC0gbS5kICogbS5lKSAvIGk7CisgIGYgPSAobS5hICogbS5mIC0gbS5iICogbS5lKSAvIGo7Cit9CitzdGF0aWMgdm9pZCBGWENSVF9NYXRyaXhfQ29uY2F0KENGWF9NYXRyaXgmIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtMikgeworICBGWF9GTE9BVCBhYSA9IG0xLmEgKiBtMi5hICsgbTEuYiAqIG0yLmM7CisgIEZYX0ZMT0FUIGJiID0gbTEuYSAqIG0yLmIgKyBtMS5iICogbTIuZDsKKyAgRlhfRkxPQVQgY2MgPSBtMS5jICogbTIuYSArIG0xLmQgKiBtMi5jOworICBGWF9GTE9BVCBkZCA9IG0xLmMgKiBtMi5iICsgbTEuZCAqIG0yLmQ7CisgIEZYX0ZMT0FUIGVlID0gbTEuZSAqIG0yLmEgKyBtMS5mICogbTIuYyArIG0yLmU7CisgIEZYX0ZMT0FUIGZmID0gbTEuZSAqIG0yLmIgKyBtMS5mICogbTIuZCArIG0yLmY7CisgIG0uYSA9IGFhLCBtLmIgPSBiYiwgbS5jID0gY2MsIG0uZCA9IGRkLCBtLmUgPSBlZSwgbS5mID0gZmY7Cit9Cit2b2lkIENGWF9NYXRyaXg6OkNvbmNhdChGWF9GTE9BVCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGMsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGYsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcmVwZW5kZWQpIHsKKyAgQ0ZYX01hdHJpeCBtOworICBtLlNldChhLCBiLCBjLCBkLCBlLCBmKTsKKyAgQ29uY2F0KG0sIGJQcmVwZW5kZWQpOworfQordm9pZCBDRlhfTWF0cml4OjpDb25jYXQoY29uc3QgQ0ZYX01hdHJpeCYgbSwgRlhfQk9PTCBiUHJlcGVuZGVkKSB7CisgIGlmIChiUHJlcGVuZGVkKSB7CisgICAgRlhDUlRfTWF0cml4X0NvbmNhdCgqdGhpcywgbSwgKnRoaXMpOworICB9IGVsc2UgeworICAgIEZYQ1JUX01hdHJpeF9Db25jYXQoKnRoaXMsICp0aGlzLCBtKTsKKyAgfQorfQordm9pZCBDRlhfTWF0cml4OjpDb25jYXRJbnZlcnNlKGNvbnN0IENGWF9NYXRyaXgmIHNyYywgRlhfQk9PTCBiUHJlcGVuZGVkKSB7CisgIENGWF9NYXRyaXggbTsKKyAgbS5TZXRSZXZlcnNlKHNyYyk7CisgIENvbmNhdChtLCBiUHJlcGVuZGVkKTsKK30KK0ZYX0JPT0wgQ0ZYX01hdHJpeDo6SXNJbnZlcnRpYmxlKCkgY29uc3QgeworICByZXR1cm4gRlhTWVNfZmFicyhhICogZCAtIGIgKiBjKSA+PSAwLjAwMDFmOworfQorRlhfQk9PTCBDRlhfTWF0cml4OjpJczkwUm90YXRlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIEZYU1lTX2ZhYnMoYSAqIDEwMDApIDwgRlhTWVNfZmFicyhiKSAmJgorICAgICAgICAgRlhTWVNfZmFicyhkICogMTAwMCkgPCBGWFNZU19mYWJzKGMpOworfQorRlhfQk9PTCBDRlhfTWF0cml4OjpJc1NjYWxlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIEZYU1lTX2ZhYnMoYiAqIDEwMDApIDwgRlhTWVNfZmFicyhhKSAmJgorICAgICAgICAgRlhTWVNfZmFicyhjICogMTAwMCkgPCBGWFNZU19mYWJzKGQpOworfQordm9pZCBDRlhfTWF0cml4OjpUcmFuc2xhdGUoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgRlhfQk9PTCBiUHJlcGVuZGVkKSB7CisgIGlmIChiUHJlcGVuZGVkKSB7CisgICAgZSArPSB4ICogYSArIHkgKiBjOworICAgIGYgKz0geSAqIGQgKyB4ICogYjsKKyAgfSBlbHNlIHsKKyAgICBlICs9IHgsIGYgKz0geTsKKyAgfQorfQordm9pZCBDRlhfTWF0cml4OjpTY2FsZShGWF9GTE9BVCBzeCwgRlhfRkxPQVQgc3ksIEZYX0JPT0wgYlByZXBlbmRlZCkgeworICBhICo9IHN4LCBkICo9IHN5OworICBpZiAoYlByZXBlbmRlZCkgeworICAgIGIgKj0gc3g7CisgICAgYyAqPSBzeTsKKyAgfSBlbHNlIHsKKyAgICBiICo9IHN5OworICAgIGMgKj0gc3g7CisgICAgZSAqPSBzeDsKKyAgICBmICo9IHN5OworICB9Cit9Cit2b2lkIENGWF9NYXRyaXg6OlJvdGF0ZShGWF9GTE9BVCBmUmFkaWFuLCBGWF9CT09MIGJQcmVwZW5kZWQpIHsKKyAgRlhfRkxPQVQgY29zVmFsdWUgPSBGWFNZU19jb3MoZlJhZGlhbik7CisgIEZYX0ZMT0FUIHNpblZhbHVlID0gRlhTWVNfc2luKGZSYWRpYW4pOworICBDRlhfTWF0cml4IG07CisgIG0uU2V0KGNvc1ZhbHVlLCBzaW5WYWx1ZSwgLXNpblZhbHVlLCBjb3NWYWx1ZSwgMCwgMCk7CisgIGlmIChiUHJlcGVuZGVkKSB7CisgICAgRlhDUlRfTWF0cml4X0NvbmNhdCgqdGhpcywgbSwgKnRoaXMpOworICB9IGVsc2UgeworICAgIEZYQ1JUX01hdHJpeF9Db25jYXQoKnRoaXMsICp0aGlzLCBtKTsKKyAgfQorfQordm9pZCBDRlhfTWF0cml4OjpSb3RhdGVBdChGWF9GTE9BVCBmUmFkaWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlByZXBlbmRlZCkgeworICBUcmFuc2xhdGUoZHgsIGR5LCBiUHJlcGVuZGVkKTsKKyAgUm90YXRlKGZSYWRpYW4sIGJQcmVwZW5kZWQpOworICBUcmFuc2xhdGUoLWR4LCAtZHksIGJQcmVwZW5kZWQpOworfQordm9pZCBDRlhfTWF0cml4OjpTaGVhcihGWF9GTE9BVCBmQWxwaGFSYWRpYW4sCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZCZXRhUmFkaWFuLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcmVwZW5kZWQpIHsKKyAgQ0ZYX01hdHJpeCBtOworICBtLlNldCgxLCBGWFNZU190YW4oZkFscGhhUmFkaWFuKSwgRlhTWVNfdGFuKGZCZXRhUmFkaWFuKSwgMSwgMCwgMCk7CisgIGlmIChiUHJlcGVuZGVkKSB7CisgICAgRlhDUlRfTWF0cml4X0NvbmNhdCgqdGhpcywgbSwgKnRoaXMpOworICB9IGVsc2UgeworICAgIEZYQ1JUX01hdHJpeF9Db25jYXQoKnRoaXMsICp0aGlzLCBtKTsKKyAgfQorfQordm9pZCBDRlhfTWF0cml4OjpNYXRjaFJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9GbG9hdFJlY3QmIHNyYykgeworICBGWF9GTE9BVCBmRGlmZiA9IHNyYy5sZWZ0IC0gc3JjLnJpZ2h0OworICBhID0gRlhTWVNfZmFicyhmRGlmZikgPCAwLjAwMWYgPyAxIDogKGRlc3QubGVmdCAtIGRlc3QucmlnaHQpIC8gZkRpZmY7CisgIGZEaWZmID0gc3JjLmJvdHRvbSAtIHNyYy50b3A7CisgIGQgPSBGWFNZU19mYWJzKGZEaWZmKSA8IDAuMDAxZiA/IDEgOiAoZGVzdC5ib3R0b20gLSBkZXN0LnRvcCkgLyBmRGlmZjsKKyAgZSA9IGRlc3QubGVmdCAtIHNyYy5sZWZ0ICogYTsKKyAgZiA9IGRlc3QuYm90dG9tIC0gc3JjLmJvdHRvbSAqIGQ7CisgIGIgPSAwOworICBjID0gMDsKK30KK0ZYX0ZMT0FUIENGWF9NYXRyaXg6OkdldFhVbml0KCkgY29uc3QgeworICBpZiAoYiA9PSAwKSB7CisgICAgcmV0dXJuIChhID4gMCA/IGEgOiAtYSk7CisgIH0KKyAgaWYgKGEgPT0gMCkgeworICAgIHJldHVybiAoYiA+IDAgPyBiIDogLWIpOworICB9CisgIHJldHVybiBGWFNZU19zcXJ0KGEgKiBhICsgYiAqIGIpOworfQorRlhfRkxPQVQgQ0ZYX01hdHJpeDo6R2V0WVVuaXQoKSBjb25zdCB7CisgIGlmIChjID09IDApIHsKKyAgICByZXR1cm4gKGQgPiAwID8gZCA6IC1kKTsKKyAgfQorICBpZiAoZCA9PSAwKSB7CisgICAgcmV0dXJuIChjID4gMCA/IGMgOiAtYyk7CisgIH0KKyAgcmV0dXJuIEZYU1lTX3NxcnQoYyAqIGMgKyBkICogZCk7Cit9Cit2b2lkIENGWF9NYXRyaXg6OkdldFVuaXRSZWN0KENGWF9SZWN0RiYgcmVjdCkgY29uc3QgeworICByZWN0LmxlZnQgPSByZWN0LnRvcCA9IDA7CisgIHJlY3Qud2lkdGggPSByZWN0LmhlaWdodCA9IDE7CisgIFRyYW5zZm9ybVJlY3QocmVjdCk7Cit9CitDRlhfRmxvYXRSZWN0IENGWF9NYXRyaXg6OkdldFVuaXRSZWN0KCkgY29uc3QgeworICBDRlhfRmxvYXRSZWN0IHJlY3QoMCwgMCwgMSwgMSk7CisgIHJlY3QuVHJhbnNmb3JtKChjb25zdCBDRlhfTWF0cml4Kil0aGlzKTsKKyAgcmV0dXJuIHJlY3Q7Cit9CitGWF9GTE9BVCBDRlhfTWF0cml4OjpHZXRVbml0QXJlYSgpIGNvbnN0IHsKKyAgRlhfRkxPQVQgQSA9IEZYU1lTX3NxcnQoYSAqIGEgKyBiICogYik7CisgIEZYX0ZMT0FUIEIgPSBGWFNZU19zcXJ0KGMgKiBjICsgZCAqIGQpOworICBGWF9GTE9BVCBhYyA9IGEgKyBjLCBiZCA9IGIgKyBkOworICBGWF9GTE9BVCBDID0gRlhTWVNfc3FydChhYyAqIGFjICsgYmQgKiBiZCk7CisgIEZYX0ZMT0FUIFAgPSAoQSArIEIgKyBDKSAvIDI7CisgIHJldHVybiBGWFNZU19zcXJ0KFAgKiAoUCAtIEEpICogKFAgLSBCKSAqIChQIC0gQykpICogMjsKK30KK0ZYX0ZMT0FUIENGWF9NYXRyaXg6OlRyYW5zZm9ybVhEaXN0YW5jZShGWF9GTE9BVCBkeCkgY29uc3QgeworICBGWF9GTE9BVCBmeCA9IGEgKiBkeCwgZnkgPSBiICogZHg7CisgIHJldHVybiBGWFNZU19zcXJ0KGZ4ICogZnggKyBmeSAqIGZ5KTsKK30KK2ludDMyX3QgQ0ZYX01hdHJpeDo6VHJhbnNmb3JtWERpc3RhbmNlKGludDMyX3QgZHgpIGNvbnN0IHsKKyAgRlhfRkxPQVQgZnggPSBhICogZHgsIGZ5ID0gYiAqIGR4OworICByZXR1cm4gRlhTWVNfcm91bmQoRlhTWVNfc3FydChmeCAqIGZ4ICsgZnkgKiBmeSkpOworfQorRlhfRkxPQVQgQ0ZYX01hdHJpeDo6VHJhbnNmb3JtWURpc3RhbmNlKEZYX0ZMT0FUIGR5KSBjb25zdCB7CisgIEZYX0ZMT0FUIGZ4ID0gYyAqIGR5LCBmeSA9IGQgKiBkeTsKKyAgcmV0dXJuIEZYU1lTX3NxcnQoZnggKiBmeCArIGZ5ICogZnkpOworfQoraW50MzJfdCBDRlhfTWF0cml4OjpUcmFuc2Zvcm1ZRGlzdGFuY2UoaW50MzJfdCBkeSkgY29uc3QgeworICBGWF9GTE9BVCBmeCA9IGMgKiBkeSwgZnkgPSBkICogZHk7CisgIHJldHVybiBGWFNZU19yb3VuZChGWFNZU19zcXJ0KGZ4ICogZnggKyBmeSAqIGZ5KSk7Cit9CitGWF9GTE9BVCBDRlhfTWF0cml4OjpUcmFuc2Zvcm1EaXN0YW5jZShGWF9GTE9BVCBkeCwgRlhfRkxPQVQgZHkpIGNvbnN0IHsKKyAgRlhfRkxPQVQgZnggPSBhICogZHggKyBjICogZHksIGZ5ID0gYiAqIGR4ICsgZCAqIGR5OworICByZXR1cm4gRlhTWVNfc3FydChmeCAqIGZ4ICsgZnkgKiBmeSk7Cit9CitpbnQzMl90IENGWF9NYXRyaXg6OlRyYW5zZm9ybURpc3RhbmNlKGludDMyX3QgZHgsIGludDMyX3QgZHkpIGNvbnN0IHsKKyAgRlhfRkxPQVQgZnggPSBhICogZHggKyBjICogZHksIGZ5ID0gYiAqIGR4ICsgZCAqIGR5OworICByZXR1cm4gRlhTWVNfcm91bmQoRlhTWVNfc3FydChmeCAqIGZ4ICsgZnkgKiBmeSkpOworfQorRlhfRkxPQVQgQ0ZYX01hdHJpeDo6VHJhbnNmb3JtRGlzdGFuY2UoRlhfRkxPQVQgZGlzdGFuY2UpIGNvbnN0IHsKKyAgcmV0dXJuIGRpc3RhbmNlICogKEdldFhVbml0KCkgKyBHZXRZVW5pdCgpKSAvIDI7Cit9Cit2b2lkIENGWF9NYXRyaXg6OlRyYW5zZm9ybVZlY3RvcihDRlhfVmVjdG9yRiYgdikgY29uc3QgeworICBGWF9GTE9BVCBmeCA9IGEgKiB2LnggKyBjICogdi55OworICBGWF9GTE9BVCBmeSA9IGIgKiB2LnggKyBkICogdi55OworICB2LnggPSBmeCwgdi55ID0gZnk7Cit9Cit2b2lkIENGWF9NYXRyaXg6OlRyYW5zZm9ybVZlY3RvcihDRlhfVmVjdG9yJiB2KSBjb25zdCB7CisgIEZYX0ZMT0FUIGZ4ID0gYSAqIHYueCArIGMgKiB2Lnk7CisgIEZYX0ZMT0FUIGZ5ID0gYiAqIHYueCArIGQgKiB2Lnk7CisgIHYueCA9IEZYU1lTX3JvdW5kKGZ4KTsKKyAgdi55ID0gRlhTWVNfcm91bmQoZnkpOworfQordm9pZCBDRlhfTWF0cml4OjpUcmFuc2Zvcm1Qb2ludHMoQ0ZYX1BvaW50KiBwb2ludHMsIGludDMyX3QgaUNvdW50KSBjb25zdCB7CisgIEZYU1lTX2Fzc2VydChpQ291bnQgPiAwKTsKKyAgRlhfRkxPQVQgZngsIGZ5OworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgIGZ4ID0gYSAqIHBvaW50cy0+eCArIGMgKiBwb2ludHMtPnkgKyBlOworICAgIGZ5ID0gYiAqIHBvaW50cy0+eCArIGQgKiBwb2ludHMtPnkgKyBmOworICAgIHBvaW50cy0+eCA9IEZYU1lTX3JvdW5kKGZ4KTsKKyAgICBwb2ludHMtPnkgPSBGWFNZU19yb3VuZChmeSk7CisgICAgcG9pbnRzKys7CisgIH0KK30KK3ZvaWQgQ0ZYX01hdHJpeDo6VHJhbnNmb3JtUG9pbnRzKENGWF9Qb2ludEYqIHBvaW50cywgaW50MzJfdCBpQ291bnQpIGNvbnN0IHsKKyAgRlhTWVNfYXNzZXJ0KGlDb3VudCA+IDApOworICBGWF9GTE9BVCBmeCwgZnk7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7CisgICAgZnggPSBhICogcG9pbnRzLT54ICsgYyAqIHBvaW50cy0+eSArIGU7CisgICAgZnkgPSBiICogcG9pbnRzLT54ICsgZCAqIHBvaW50cy0+eSArIGY7CisgICAgcG9pbnRzLT54ID0gZngsIHBvaW50cy0+eSA9IGZ5OworICAgIHBvaW50cysrOworICB9Cit9Cit2b2lkIENGWF9NYXRyaXg6OlRyYW5zZm9ybVBvaW50KEZYX0ZMT0FUJiB4LCBGWF9GTE9BVCYgeSkgY29uc3QgeworICBGWF9GTE9BVCBmeCA9IGEgKiB4ICsgYyAqIHkgKyBlOworICBGWF9GTE9BVCBmeSA9IGIgKiB4ICsgZCAqIHkgKyBmOworICB4ID0gZngsIHkgPSBmeTsKK30KK3ZvaWQgQ0ZYX01hdHJpeDo6VHJhbnNmb3JtUG9pbnQoaW50MzJfdCYgeCwgaW50MzJfdCYgeSkgY29uc3QgeworICBGWF9GTE9BVCBmeCA9IGEgKiB4ICsgYyAqIHkgKyBlOworICBGWF9GTE9BVCBmeSA9IGIgKiB4ICsgZCAqIHkgKyBmOworICB4ID0gRlhTWVNfcm91bmQoZngpOworICB5ID0gRlhTWVNfcm91bmQoZnkpOworfQordm9pZCBDRlhfTWF0cml4OjpUcmFuc2Zvcm1SZWN0KENGWF9SZWN0RiYgcmVjdCkgY29uc3QgeworICBGWF9GTE9BVCByaWdodCA9IHJlY3QucmlnaHQoKSwgYm90dG9tID0gcmVjdC5ib3R0b20oKTsKKyAgVHJhbnNmb3JtUmVjdChyZWN0LmxlZnQsIHJpZ2h0LCBib3R0b20sIHJlY3QudG9wKTsKKyAgcmVjdC53aWR0aCA9IHJpZ2h0IC0gcmVjdC5sZWZ0OworICByZWN0LmhlaWdodCA9IGJvdHRvbSAtIHJlY3QudG9wOworfQordm9pZCBDRlhfTWF0cml4OjpUcmFuc2Zvcm1SZWN0KENGWF9SZWN0JiByZWN0KSBjb25zdCB7CisgIEZYX0ZMT0FUIGxlZnQgPSAoRlhfRkxPQVQpcmVjdC5sZWZ0OworICBGWF9GTE9BVCB0b3AgPSAoRlhfRkxPQVQpcmVjdC5ib3R0b20oKTsKKyAgRlhfRkxPQVQgcmlnaHQgPSAoRlhfRkxPQVQpcmVjdC5yaWdodCgpOworICBGWF9GTE9BVCBib3R0b20gPSAoRlhfRkxPQVQpcmVjdC50b3A7CisgIFRyYW5zZm9ybVJlY3QobGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tKTsKKyAgcmVjdC5sZWZ0ID0gRlhTWVNfcm91bmQobGVmdCk7CisgIHJlY3QudG9wID0gRlhTWVNfcm91bmQoYm90dG9tKTsKKyAgcmVjdC53aWR0aCA9IEZYU1lTX3JvdW5kKHJpZ2h0IC0gbGVmdCk7CisgIHJlY3QuaGVpZ2h0ID0gRlhTWVNfcm91bmQodG9wIC0gYm90dG9tKTsKK30KK3ZvaWQgQ0ZYX01hdHJpeDo6VHJhbnNmb3JtUmVjdChGWF9GTE9BVCYgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgYm90dG9tKSBjb25zdCB7CisgIEZYX0ZMT0FUIHhbNF0sIHlbNF07CisgIHhbMF0gPSBsZWZ0OworICB5WzBdID0gdG9wOworICB4WzFdID0gbGVmdDsKKyAgeVsxXSA9IGJvdHRvbTsKKyAgeFsyXSA9IHJpZ2h0OworICB5WzJdID0gdG9wOworICB4WzNdID0gcmlnaHQ7CisgIHlbM10gPSBib3R0b207CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgVHJhbnNmb3JtKHhbaV0sIHlbaV0sIHhbaV0sIHlbaV0pOworICB9CisgIHJpZ2h0ID0gbGVmdCA9IHhbMF07CisgIHRvcCA9IGJvdHRvbSA9IHlbMF07CisgIGZvciAoaSA9IDE7IGkgPCA0OyBpKyspIHsKKyAgICBpZiAocmlnaHQgPCB4W2ldKSB7CisgICAgICByaWdodCA9IHhbaV07CiAgICAgfQotICAgIEZYX0ZMT0FUIG1pbl94ID0gcFBvaW50cy0+eCwgbWF4X3ggPSBwUG9pbnRzLT54LCBtaW5feSA9IHBQb2ludHMtPnksIG1heF95ID0gcFBvaW50cy0+eTsKLSAgICBmb3IgKGludCBpID0gMTsgaSA8IG5Qb2ludHM7IGkgKyspIHsKLSAgICAgICAgaWYgKG1pbl94ID4gcFBvaW50c1tpXS54KSB7Ci0gICAgICAgICAgICBtaW5feCA9IHBQb2ludHNbaV0ueDsKLSAgICAgICAgfQotICAgICAgICBpZiAobWF4X3ggPCBwUG9pbnRzW2ldLngpIHsKLSAgICAgICAgICAgIG1heF94ID0gcFBvaW50c1tpXS54OwotICAgICAgICB9Ci0gICAgICAgIGlmIChtaW5feSA+IHBQb2ludHNbaV0ueSkgewotICAgICAgICAgICAgbWluX3kgPSBwUG9pbnRzW2ldLnk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1heF95IDwgcFBvaW50c1tpXS55KSB7Ci0gICAgICAgICAgICBtYXhfeSA9IHBQb2ludHNbaV0ueTsKLSAgICAgICAgfQorICAgIGlmIChsZWZ0ID4geFtpXSkgeworICAgICAgbGVmdCA9IHhbaV07CiAgICAgfQotICAgIHJldHVybiBDRlhfRmxvYXRSZWN0KG1pbl94LCBtaW5feSwgbWF4X3gsIG1heF95KTsKLX0KLXZvaWQgQ0ZYX01hdHJpeDo6U2V0KEZYX0ZMT0FUIGEsIEZYX0ZMT0FUIGIsIEZYX0ZMT0FUIGMsIEZYX0ZMT0FUIGQsIEZYX0ZMT0FUIGUsIEZYX0ZMT0FUIGYpCi17Ci0gICAgdGhpcy0+YSA9IGE7Ci0gICAgdGhpcy0+YiA9IGI7Ci0gICAgdGhpcy0+YyA9IGM7Ci0gICAgdGhpcy0+ZCA9IGQ7Ci0gICAgdGhpcy0+ZSA9IGU7Ci0gICAgdGhpcy0+ZiA9IGY7Ci19Ci12b2lkIENGWF9NYXRyaXg6OlNldChjb25zdCBGWF9GTE9BVCBuWzZdKQotewotICAgIHRoaXMtPmEgPSBuWzBdOwotICAgIHRoaXMtPmIgPSBuWzFdOwotICAgIHRoaXMtPmMgPSBuWzJdOwotICAgIHRoaXMtPmQgPSBuWzNdOwotICAgIHRoaXMtPmUgPSBuWzRdOwotICAgIHRoaXMtPmYgPSBuWzVdOwotfQotdm9pZCBDRlhfTWF0cml4OjpTZXRSZXZlcnNlKGNvbnN0IENGWF9NYXRyaXggJm0pCi17Ci0gICAgRlhfRkxPQVQgaSA9IG0uYSAqIG0uZCAtIG0uYiAqIG0uYzsKLSAgICBpZiAoRlhTWVNfZmFicyhpKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAodG9wIDwgeVtpXSkgeworICAgICAgdG9wID0geVtpXTsKICAgICB9Ci0gICAgRlhfRkxPQVQgaiA9IC1pOwotICAgIGEgPSBtLmQgLyBpOwotICAgIGIgPSBtLmIgLyBqOwotICAgIGMgPSBtLmMgLyBqOwotICAgIGQgPSBtLmEgLyBpOwotICAgIGUgPSAobS5jICogbS5mIC0gbS5kICogbS5lKSAvIGk7Ci0gICAgZiA9IChtLmEgKiBtLmYgLSBtLmIgKiBtLmUpIC8gajsKLX0KLXN0YXRpYyB2b2lkIEZYQ1JUX01hdHJpeF9Db25jYXQoQ0ZYX01hdHJpeCAmbSwgY29uc3QgQ0ZYX01hdHJpeCAmbTEsIGNvbnN0IENGWF9NYXRyaXggJm0yKQotewotICAgIEZYX0ZMT0FUIGFhID0gbTEuYSAqIG0yLmEgKyBtMS5iICogbTIuYzsKLSAgICBGWF9GTE9BVCBiYiA9IG0xLmEgKiBtMi5iICsgbTEuYiAqIG0yLmQ7Ci0gICAgRlhfRkxPQVQgY2MgPSBtMS5jICogbTIuYSArIG0xLmQgKiBtMi5jOwotICAgIEZYX0ZMT0FUIGRkID0gbTEuYyAqIG0yLmIgKyBtMS5kICogbTIuZDsKLSAgICBGWF9GTE9BVCBlZSA9IG0xLmUgKiBtMi5hICsgbTEuZiAqIG0yLmMgKyBtMi5lOwotICAgIEZYX0ZMT0FUIGZmID0gbTEuZSAqIG0yLmIgKyBtMS5mICogbTIuZCArIG0yLmY7Ci0gICAgbS5hID0gYWEsIG0uYiA9IGJiLCBtLmMgPSBjYywgbS5kID0gZGQsIG0uZSA9IGVlLCBtLmYgPSBmZjsKLX0KLXZvaWQgQ0ZYX01hdHJpeDo6Q29uY2F0KEZYX0ZMT0FUIGEsIEZYX0ZMT0FUIGIsIEZYX0ZMT0FUIGMsIEZYX0ZMT0FUIGQsIEZYX0ZMT0FUIGUsIEZYX0ZMT0FUIGYsIEZYX0JPT0wgYlByZXBlbmRlZCkKLXsKLSAgICBDRlhfTWF0cml4IG07Ci0gICAgbS5TZXQoYSwgYiwgYywgZCwgZSwgZik7Ci0gICAgQ29uY2F0KG0sIGJQcmVwZW5kZWQpOwotfQotdm9pZCBDRlhfTWF0cml4OjpDb25jYXQoY29uc3QgQ0ZYX01hdHJpeCAmbSwgRlhfQk9PTCBiUHJlcGVuZGVkKQotewotICAgIGlmIChiUHJlcGVuZGVkKSB7Ci0gICAgICAgIEZYQ1JUX01hdHJpeF9Db25jYXQoKnRoaXMsIG0sICp0aGlzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBGWENSVF9NYXRyaXhfQ29uY2F0KCp0aGlzLCAqdGhpcywgbSk7CisgICAgaWYgKGJvdHRvbSA+IHlbaV0pIHsKKyAgICAgIGJvdHRvbSA9IHlbaV07CiAgICAgfQotfQotdm9pZCBDRlhfTWF0cml4OjpDb25jYXRJbnZlcnNlKGNvbnN0IENGWF9NYXRyaXgmIHNyYywgRlhfQk9PTCBiUHJlcGVuZGVkKQotewotICAgIENGWF9NYXRyaXggbTsKLSAgICBtLlNldFJldmVyc2Uoc3JjKTsKLSAgICBDb25jYXQobSwgYlByZXBlbmRlZCk7Ci19Ci1GWF9CT09MIENGWF9NYXRyaXg6OklzSW52ZXJ0aWJsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIEZYU1lTX2ZhYnMoYSAqIGQgLSBiICogYykgPj0gMC4wMDAxZjsKLX0KLUZYX0JPT0wgQ0ZYX01hdHJpeDo6SXM5MFJvdGF0ZWQoKSBjb25zdAotewotICAgIHJldHVybiBGWFNZU19mYWJzKGEgKiAxMDAwKSA8IEZYU1lTX2ZhYnMoYikgJiYgRlhTWVNfZmFicyhkICogMTAwMCkgPCBGWFNZU19mYWJzKGMpOwotfQotRlhfQk9PTCBDRlhfTWF0cml4OjpJc1NjYWxlZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIEZYU1lTX2ZhYnMoYiAqIDEwMDApIDwgRlhTWVNfZmFicyhhKSAmJiBGWFNZU19mYWJzKGMgKiAxMDAwKSA8IEZYU1lTX2ZhYnMoZCk7Ci19Ci12b2lkIENGWF9NYXRyaXg6OlRyYW5zbGF0ZShGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBGWF9CT09MIGJQcmVwZW5kZWQpCi17Ci0gICAgaWYgKGJQcmVwZW5kZWQpIHsKLSAgICAgICAgZSArPSB4ICogYSArIHkgKiBjOwotICAgICAgICBmICs9IHkgKiBkICsgeCAqIGI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZSArPSB4LCBmICs9IHk7Ci0gICAgfQotfQotdm9pZCBDRlhfTWF0cml4OjpTY2FsZShGWF9GTE9BVCBzeCwgRlhfRkxPQVQgc3ksIEZYX0JPT0wgYlByZXBlbmRlZCkKLXsKLSAgICBhICo9IHN4LCBkICo9IHN5OwotICAgIGlmIChiUHJlcGVuZGVkKSB7Ci0gICAgICAgIGIgKj0gc3g7Ci0gICAgICAgIGMgKj0gc3k7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYiAqPSBzeTsKLSAgICAgICAgYyAqPSBzeDsKLSAgICAgICAgZSAqPSBzeDsKLSAgICAgICAgZiAqPSBzeTsKLSAgICB9Ci19Ci12b2lkIENGWF9NYXRyaXg6OlJvdGF0ZShGWF9GTE9BVCBmUmFkaWFuLCBGWF9CT09MIGJQcmVwZW5kZWQpCi17Ci0gICAgRlhfRkxPQVQgY29zVmFsdWUgPSBGWFNZU19jb3MoZlJhZGlhbik7Ci0gICAgRlhfRkxPQVQgc2luVmFsdWUgPSBGWFNZU19zaW4oZlJhZGlhbik7Ci0gICAgQ0ZYX01hdHJpeCBtOwotICAgIG0uU2V0KGNvc1ZhbHVlLCBzaW5WYWx1ZSwgLXNpblZhbHVlLCBjb3NWYWx1ZSwgMCwgMCk7Ci0gICAgaWYgKGJQcmVwZW5kZWQpIHsKLSAgICAgICAgRlhDUlRfTWF0cml4X0NvbmNhdCgqdGhpcywgbSwgKnRoaXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYQ1JUX01hdHJpeF9Db25jYXQoKnRoaXMsICp0aGlzLCBtKTsKLSAgICB9Ci19Ci12b2lkIENGWF9NYXRyaXg6OlJvdGF0ZUF0KEZYX0ZMT0FUIGZSYWRpYW4sIEZYX0ZMT0FUIGR4LCBGWF9GTE9BVCBkeSwgRlhfQk9PTCBiUHJlcGVuZGVkKQotewotICAgIFRyYW5zbGF0ZShkeCwgZHksIGJQcmVwZW5kZWQpOwotICAgIFJvdGF0ZShmUmFkaWFuLCBiUHJlcGVuZGVkKTsKLSAgICBUcmFuc2xhdGUoLWR4LCAtZHksIGJQcmVwZW5kZWQpOwotfQotdm9pZCBDRlhfTWF0cml4OjpTaGVhcihGWF9GTE9BVCBmQWxwaGFSYWRpYW4sIEZYX0ZMT0FUIGZCZXRhUmFkaWFuLCBGWF9CT09MIGJQcmVwZW5kZWQpCi17Ci0gICAgQ0ZYX01hdHJpeCBtOwotICAgIG0uU2V0KDEsIEZYU1lTX3RhbihmQWxwaGFSYWRpYW4pLCBGWFNZU190YW4oZkJldGFSYWRpYW4pLCAxLCAwLCAwKTsKLSAgICBpZiAoYlByZXBlbmRlZCkgewotICAgICAgICBGWENSVF9NYXRyaXhfQ29uY2F0KCp0aGlzLCBtLCAqdGhpcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRlhDUlRfTWF0cml4X0NvbmNhdCgqdGhpcywgKnRoaXMsIG0pOwotICAgIH0KLX0KLXZvaWQgQ0ZYX01hdHJpeDo6TWF0Y2hSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIGRlc3QsIGNvbnN0IENGWF9GbG9hdFJlY3QmIHNyYykKLXsKLSAgICBGWF9GTE9BVCBmRGlmZiA9IHNyYy5sZWZ0IC0gc3JjLnJpZ2h0OwotICAgIGEgPSBGWFNZU19mYWJzKGZEaWZmKSA8IDAuMDAxZiA/IDEgOiAoZGVzdC5sZWZ0IC0gZGVzdC5yaWdodCkgLyBmRGlmZjsKLSAgICBmRGlmZiA9IHNyYy5ib3R0b20gLSBzcmMudG9wOwotICAgIGQgPSBGWFNZU19mYWJzKGZEaWZmKSA8IDAuMDAxZiA/IDEgOiAoZGVzdC5ib3R0b20gLSBkZXN0LnRvcCkgLyBmRGlmZjsKLSAgICBlID0gZGVzdC5sZWZ0IC0gc3JjLmxlZnQgKiBhOwotICAgIGYgPSBkZXN0LmJvdHRvbSAtIHNyYy5ib3R0b20gKiBkOwotICAgIGIgPSAwOwotICAgIGMgPSAwOwotfQotRlhfRkxPQVQgQ0ZYX01hdHJpeDo6R2V0WFVuaXQoKSBjb25zdAotewotICAgIGlmIChiID09IDApIHsKLSAgICAgICAgcmV0dXJuIChhID4gMCA/IGEgOiAtYSk7Ci0gICAgfQotICAgIGlmIChhID09IDApIHsKLSAgICAgICAgcmV0dXJuIChiID4gMCA/IGIgOiAtYik7Ci0gICAgfQotICAgIHJldHVybiBGWFNZU19zcXJ0KGEgKiBhICsgYiAqIGIpOwotfQotRlhfRkxPQVQgQ0ZYX01hdHJpeDo6R2V0WVVuaXQoKSBjb25zdAotewotICAgIGlmIChjID09IDApIHsKLSAgICAgICAgcmV0dXJuIChkID4gMCA/IGQgOiAtZCk7Ci0gICAgfQotICAgIGlmIChkID09IDApIHsKLSAgICAgICAgcmV0dXJuIChjID4gMCA/IGMgOiAtYyk7Ci0gICAgfQotICAgIHJldHVybiBGWFNZU19zcXJ0KGMgKiBjICsgZCAqIGQpOwotfQotdm9pZCBDRlhfTWF0cml4OjpHZXRVbml0UmVjdChDRlhfUmVjdEYgJnJlY3QpIGNvbnN0Ci17Ci0gICAgcmVjdC5sZWZ0ID0gcmVjdC50b3AgPSAwOwotICAgIHJlY3Qud2lkdGggPSByZWN0LmhlaWdodCA9IDE7Ci0gICAgVHJhbnNmb3JtUmVjdChyZWN0KTsKLX0KLUNGWF9GbG9hdFJlY3QgQ0ZYX01hdHJpeDo6R2V0VW5pdFJlY3QoKSBjb25zdAotewotICAgIENGWF9GbG9hdFJlY3QgcmVjdCgwLCAwLCAxLCAxKTsKLSAgICByZWN0LlRyYW5zZm9ybSgoY29uc3QgQ0ZYX01hdHJpeCopdGhpcyk7Ci0gICAgcmV0dXJuIHJlY3Q7Ci19Ci1GWF9GTE9BVCBDRlhfTWF0cml4OjpHZXRVbml0QXJlYSgpIGNvbnN0Ci17Ci0gICAgRlhfRkxPQVQgQSA9IEZYU1lTX3NxcnQoYSAqIGEgKyBiICogYik7Ci0gICAgRlhfRkxPQVQgQiA9IEZYU1lTX3NxcnQoYyAqIGMgKyBkICogZCk7Ci0gICAgRlhfRkxPQVQgYWMgPSBhICsgYywgYmQgPSBiICsgZDsKLSAgICBGWF9GTE9BVCBDID0gRlhTWVNfc3FydChhYyAqIGFjICsgYmQgKiBiZCk7Ci0gICAgRlhfRkxPQVQgUCA9IChBICsgQiArIEMgKSAvIDI7Ci0gICAgcmV0dXJuIEZYU1lTX3NxcnQoUCAqIChQIC0gQSkgKiAoUCAtIEIpICogKFAgLSBDKSkgKiAyOwotfQotRlhfRkxPQVQgQ0ZYX01hdHJpeDo6VHJhbnNmb3JtWERpc3RhbmNlKEZYX0ZMT0FUIGR4KSBjb25zdAotewotICAgIEZYX0ZMT0FUIGZ4ID0gYSAqIGR4LCBmeSA9IGIgKiBkeDsKLSAgICByZXR1cm4gRlhTWVNfc3FydChmeCAqIGZ4ICsgZnkgKiBmeSk7Ci19Ci1GWF9JTlQzMiBDRlhfTWF0cml4OjpUcmFuc2Zvcm1YRGlzdGFuY2UoRlhfSU5UMzIgZHgpIGNvbnN0Ci17Ci0gICAgRlhfRkxPQVQgZnggPSBhICogZHgsIGZ5ID0gYiAqIGR4OwotICAgIHJldHVybiBGWFNZU19yb3VuZChGWFNZU19zcXJ0KGZ4ICogZnggKyBmeSAqIGZ5KSk7Ci19Ci1GWF9GTE9BVCBDRlhfTWF0cml4OjpUcmFuc2Zvcm1ZRGlzdGFuY2UoRlhfRkxPQVQgZHkpIGNvbnN0Ci17Ci0gICAgRlhfRkxPQVQgZnggPSBjICogZHksIGZ5ID0gZCAqIGR5OwotICAgIHJldHVybiBGWFNZU19zcXJ0KGZ4ICogZnggKyBmeSAqIGZ5KTsKLX0KLUZYX0lOVDMyIENGWF9NYXRyaXg6OlRyYW5zZm9ybVlEaXN0YW5jZShGWF9JTlQzMiBkeSkgY29uc3QKLXsKLSAgICBGWF9GTE9BVCBmeCA9IGMgKiBkeSwgZnkgPSBkICogZHk7Ci0gICAgcmV0dXJuIEZYU1lTX3JvdW5kKEZYU1lTX3NxcnQoZnggKiBmeCArIGZ5ICogZnkpKTsKLX0KLUZYX0ZMT0FUIENGWF9NYXRyaXg6OlRyYW5zZm9ybURpc3RhbmNlKEZYX0ZMT0FUIGR4LCBGWF9GTE9BVCBkeSkgY29uc3QKLXsKLSAgICBGWF9GTE9BVCBmeCA9IGEgKiBkeCArIGMgKiBkeSwgZnkgPSBiICogZHggKyBkICogZHk7Ci0gICAgcmV0dXJuIEZYU1lTX3NxcnQoZnggKiBmeCArIGZ5ICogZnkpOwotfQotRlhfSU5UMzIgQ0ZYX01hdHJpeDo6VHJhbnNmb3JtRGlzdGFuY2UoRlhfSU5UMzIgZHgsIEZYX0lOVDMyIGR5KSBjb25zdAotewotICAgIEZYX0ZMT0FUIGZ4ID0gYSAqIGR4ICsgYyAqIGR5LCBmeSA9IGIgKiBkeCArIGQgKiBkeTsKLSAgICByZXR1cm4gRlhTWVNfcm91bmQoRlhTWVNfc3FydChmeCAqIGZ4ICsgZnkgKiBmeSkpOwotfQotRlhfRkxPQVQgQ0ZYX01hdHJpeDo6VHJhbnNmb3JtRGlzdGFuY2UoRlhfRkxPQVQgZGlzdGFuY2UpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGRpc3RhbmNlICogKEdldFhVbml0KCkgKyBHZXRZVW5pdCgpKSAvIDI7Ci19Ci12b2lkIENGWF9NYXRyaXg6OlRyYW5zZm9ybVZlY3RvcihDRlhfVmVjdG9yRiAmdikgY29uc3QKLXsKLSAgICBGWF9GTE9BVCBmeCA9IGEgKiB2LnggKyBjICogdi55OwotICAgIEZYX0ZMT0FUIGZ5ID0gYiAqIHYueCArIGQgKiB2Lnk7Ci0gICAgdi54ID0gZngsIHYueSA9IGZ5OwotfQotdm9pZCBDRlhfTWF0cml4OjpUcmFuc2Zvcm1WZWN0b3IoQ0ZYX1ZlY3RvciAmdikgY29uc3QKLXsKLSAgICBGWF9GTE9BVCBmeCA9IGEgKiB2LnggKyBjICogdi55OwotICAgIEZYX0ZMT0FUIGZ5ID0gYiAqIHYueCArIGQgKiB2Lnk7Ci0gICAgdi54ID0gRlhTWVNfcm91bmQoZngpOwotICAgIHYueSA9IEZYU1lTX3JvdW5kKGZ5KTsKLX0KLXZvaWQgQ0ZYX01hdHJpeDo6VHJhbnNmb3JtUG9pbnRzKENGWF9Qb2ludCAqcG9pbnRzLCBGWF9JTlQzMiBpQ291bnQpIGNvbnN0Ci17Ci0gICAgRlhTWVNfYXNzZXJ0KGlDb3VudCA+IDApOwotICAgIEZYX0ZMT0FUIGZ4LCBmeTsKLSAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUNvdW50OyBpICsrKSB7Ci0gICAgICAgIGZ4ID0gYSAqIHBvaW50cy0+eCArIGMgKiBwb2ludHMtPnkgKyBlOwotICAgICAgICBmeSA9IGIgKiBwb2ludHMtPnggKyBkICogcG9pbnRzLT55ICsgZjsKLSAgICAgICAgcG9pbnRzLT54ID0gRlhTWVNfcm91bmQoZngpOwotICAgICAgICBwb2ludHMtPnkgPSBGWFNZU19yb3VuZChmeSk7Ci0gICAgICAgIHBvaW50cyArKzsKLSAgICB9Ci19Ci12b2lkIENGWF9NYXRyaXg6OlRyYW5zZm9ybVBvaW50cyhDRlhfUG9pbnRGICpwb2ludHMsIEZYX0lOVDMyIGlDb3VudCkgY29uc3QKLXsKLSAgICBGWFNZU19hc3NlcnQoaUNvdW50ID4gMCk7Ci0gICAgRlhfRkxPQVQgZngsIGZ5OwotICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspIHsKLSAgICAgICAgZnggPSBhICogcG9pbnRzLT54ICsgYyAqIHBvaW50cy0+eSArIGU7Ci0gICAgICAgIGZ5ID0gYiAqIHBvaW50cy0+eCArIGQgKiBwb2ludHMtPnkgKyBmOwotICAgICAgICBwb2ludHMtPnggPSBmeCwgcG9pbnRzLT55ID0gZnk7Ci0gICAgICAgIHBvaW50cyArKzsKLSAgICB9Ci19Ci12b2lkIENGWF9NYXRyaXg6OlRyYW5zZm9ybVBvaW50KEZYX0ZMT0FUICZ4LCBGWF9GTE9BVCAmeSkgY29uc3QKLXsKLSAgICBGWF9GTE9BVCBmeCA9IGEgKiB4ICsgYyAqIHkgKyBlOwotICAgIEZYX0ZMT0FUIGZ5ID0gYiAqIHggKyBkICogeSArIGY7Ci0gICAgeCA9IGZ4LCB5ID0gZnk7Ci19Ci12b2lkIENGWF9NYXRyaXg6OlRyYW5zZm9ybVBvaW50KEZYX0lOVDMyICZ4LCBGWF9JTlQzMiAmeSkgY29uc3QKLXsKLSAgICBGWF9GTE9BVCBmeCA9IGEgKiB4ICsgYyAqIHkgKyBlOwotICAgIEZYX0ZMT0FUIGZ5ID0gYiAqIHggKyBkICogeSArIGY7Ci0gICAgeCA9IEZYU1lTX3JvdW5kKGZ4KTsKLSAgICB5ID0gRlhTWVNfcm91bmQoZnkpOwotfQotdm9pZCBDRlhfTWF0cml4OjpUcmFuc2Zvcm1SZWN0KENGWF9SZWN0RiAmcmVjdCkgY29uc3QKLXsKLSAgICBGWF9GTE9BVCByaWdodCA9IHJlY3QucmlnaHQoKSwgYm90dG9tID0gcmVjdC5ib3R0b20oKTsKLSAgICBUcmFuc2Zvcm1SZWN0KHJlY3QubGVmdCwgcmlnaHQsIGJvdHRvbSwgcmVjdC50b3ApOwotICAgIHJlY3Qud2lkdGggPSByaWdodCAtIHJlY3QubGVmdDsKLSAgICByZWN0LmhlaWdodCA9IGJvdHRvbSAtIHJlY3QudG9wOwotfQotdm9pZCBDRlhfTWF0cml4OjpUcmFuc2Zvcm1SZWN0KENGWF9SZWN0ICZyZWN0KSBjb25zdAotewotICAgIEZYX0ZMT0FUIGxlZnQgPSAoRlhfRkxPQVQpcmVjdC5sZWZ0OwotICAgIEZYX0ZMT0FUIHRvcCA9IChGWF9GTE9BVClyZWN0LmJvdHRvbSgpOwotICAgIEZYX0ZMT0FUIHJpZ2h0ID0gKEZYX0ZMT0FUKXJlY3QucmlnaHQoKTsKLSAgICBGWF9GTE9BVCBib3R0b20gPSAoRlhfRkxPQVQpcmVjdC50b3A7Ci0gICAgVHJhbnNmb3JtUmVjdChsZWZ0LCByaWdodCwgdG9wLCBib3R0b20pOwotICAgIHJlY3QubGVmdCA9IEZYU1lTX3JvdW5kKGxlZnQpOwotICAgIHJlY3QudG9wID0gRlhTWVNfcm91bmQoYm90dG9tKTsKLSAgICByZWN0LndpZHRoID0gRlhTWVNfcm91bmQocmlnaHQgLSBsZWZ0KTsKLSAgICByZWN0LmhlaWdodCA9IEZYU1lTX3JvdW5kKHRvcCAtIGJvdHRvbSk7Ci19Ci12b2lkIENGWF9NYXRyaXg6OlRyYW5zZm9ybVJlY3QoRlhfRkxPQVQmIGxlZnQsIEZYX0ZMT0FUJiByaWdodCwgRlhfRkxPQVQmIHRvcCwgRlhfRkxPQVQmIGJvdHRvbSkgY29uc3QKLXsKLSAgICBGWF9GTE9BVCB4WzRdLCB5WzRdOwotICAgIHhbMF0gPSBsZWZ0OwotICAgIHlbMF0gPSB0b3A7Ci0gICAgeFsxXSA9IGxlZnQ7Ci0gICAgeVsxXSA9IGJvdHRvbTsKLSAgICB4WzJdID0gcmlnaHQ7Ci0gICAgeVsyXSA9IHRvcDsKLSAgICB4WzNdID0gcmlnaHQ7Ci0gICAgeVszXSA9IGJvdHRvbTsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSArKykgewotICAgICAgICBUcmFuc2Zvcm0oeFtpXSwgeVtpXSwgeFtpXSwgeVtpXSk7Ci0gICAgfQotICAgIHJpZ2h0ID0gbGVmdCA9IHhbMF07Ci0gICAgdG9wID0gYm90dG9tID0geVswXTsKLSAgICBmb3IgKGkgPSAxOyBpIDwgNDsgaSArKykgewotICAgICAgICBpZiAocmlnaHQgPCB4W2ldKSB7Ci0gICAgICAgICAgICByaWdodCA9IHhbaV07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxlZnQgPiB4W2ldKSB7Ci0gICAgICAgICAgICBsZWZ0ID0geFtpXTsKLSAgICAgICAgfQotICAgICAgICBpZiAodG9wIDwgeVtpXSkgewotICAgICAgICAgICAgdG9wID0geVtpXTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYm90dG9tID4geVtpXSkgewotICAgICAgICAgICAgYm90dG9tID0geVtpXTsKLSAgICAgICAgfQotICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfZ2NjLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2djYy5jcHAKaW5kZXggOTNjNzFjZS4uNTA0OTlhOCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfZ2NjLmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19nY2MuY3BwCkBAIC0xLDExMCArMSwxMzMgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2luY2x1ZGUgPGxpbWl0cz4KLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X2V4dC5oIgotdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFNUUl9UPgotVCBGWFNZU19TdHJUb0ludChTVFJfVCBzdHIpCi17Ci0gICAgRlhfQk9PTCBuZWcgPSBGQUxTRTsKLSAgICBpZiAoc3RyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmICgqc3RyID09ICctJykgewotICAgICAgICBuZWcgPSBUUlVFOwotICAgICAgICBzdHIgKys7Ci0gICAgfQotICAgIFQgbnVtID0gMDsKLSAgICB3aGlsZSAoKnN0cikgewotICAgICAgICBpZiAoKCpzdHIpIDwgJzAnIHx8ICgqc3RyKSA+ICc5JykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG51bSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKSAtIDkpIC8gMTApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG51bSA9IG51bSAqIDEwICsgKCpzdHIpIC0gJzAnOwotICAgICAgICBzdHIgKys7Ci0gICAgfQotICAgIHJldHVybiBuZWcgPyAtbnVtIDogbnVtOwotfQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFNUUl9UPgotU1RSX1QgRlhTWVNfSW50VG9TdHIoVCB2YWx1ZSwgU1RSX1Qgc3RyaW5nLCBpbnQgcmFkaXgpCi17Ci0gICAgaW50IGkgPSAwOwotICAgIGlmICh2YWx1ZSA8IDApIHsKLSAgICAgICAgc3RyaW5nW2krK10gPSAnLSc7Ci0gICAgICAgIHZhbHVlID0gLXZhbHVlOwotICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gMCkgewotICAgICAgICBzdHJpbmdbMF0gPSAnMCc7Ci0gICAgICAgIHN0cmluZ1sxXSA9IDA7Ci0gICAgICAgIHJldHVybiBzdHJpbmc7Ci0gICAgfQotICAgIGludCBkaWdpdHMgPSAxOwotICAgIFQgb3JkZXIgPSB2YWx1ZSAvIDEwOwotICAgIHdoaWxlKG9yZGVyID4gMCkgewotICAgICAgICBkaWdpdHMrKzsKLSAgICAgICAgb3JkZXIgPSBvcmRlciAvIDEwOwotICAgIH0KLSAgICBmb3IgKGludCBkID0gZGlnaXRzIC0gMTsgZCA+IC0xOyBkLS0pIHsKLSAgICAgICAgc3RyaW5nW2QgKyBpXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIlt2YWx1ZSAlIDEwXTsKLSAgICAgICAgdmFsdWUgLz0gMTA7Ci0gICAgfQotICAgIHN0cmluZ1tkaWdpdHMgKyBpXSA9IDA7Ci0gICAgcmV0dXJuIHN0cmluZzsKLX0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLUZYX0lOVDMyIEZYU1lTX2F0b2koRlhfTFBDU1RSIHN0cikKLXsKLSAgICByZXR1cm4gRlhTWVNfU3RyVG9JbnQ8RlhfSU5UMzIsIEZYX0xQQ1NUUj4oc3RyKTsKLX0KLUZYX0lOVDMyIEZYU1lTX3d0b2koRlhfTFBDV1NUUiBzdHIpCi17Ci0gICAgcmV0dXJuIEZYU1lTX1N0clRvSW50PEZYX0lOVDMyLCBGWF9MUENXU1RSPihzdHIpOwotfQotRlhfSU5UNjQgRlhTWVNfYXRvaTY0KEZYX0xQQ1NUUiBzdHIpCi17Ci0gICAgcmV0dXJuIEZYU1lTX1N0clRvSW50PEZYX0lOVDY0LCBGWF9MUENTVFI+KHN0cik7Ci19Ci1GWF9JTlQ2NCBGWFNZU193dG9pNjQoRlhfTFBDV1NUUiBzdHIpCi17Ci0gICAgcmV0dXJuIEZYU1lTX1N0clRvSW50PEZYX0lOVDY0LCBGWF9MUENXU1RSPihzdHIpOwotfQotRlhfTFBDU1RSIEZYU1lTX2k2NHRvYShGWF9JTlQ2NCB2YWx1ZSwgRlhfTFBTVFIgc3RyLCBpbnQgcmFkaXgpCi17Ci0gICAgcmV0dXJuIEZYU1lTX0ludFRvU3RyPEZYX0lOVDY0LCBGWF9MUFNUUj4odmFsdWUsIHN0ciwgcmFkaXgpOwotfQotRlhfTFBDV1NUUiBGWFNZU19pNjR0b3coRlhfSU5UNjQgdmFsdWUsIEZYX0xQV1NUUiBzdHIsIGludCByYWRpeCkKLXsKLSAgICByZXR1cm4gRlhTWVNfSW50VG9TdHI8RlhfSU5UNjQsIEZYX0xQV1NUUj4odmFsdWUsIHN0ciwgcmFkaXgpOwotfQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLSNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1pbnQgRlhTWVNfR2V0QUNQKCkKLXsKKyNpbmNsdWRlIDxjY3R5cGU+CisjaW5jbHVkZSA8Y3djdHlwZT4KKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9leHQuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyaW5nLmgiCisKK3RlbXBsYXRlIDxjbGFzcyBUPgorVCBGWFNZU19TdHJUb0ludChjb25zdCBGWF9DSEFSKiBzdHIpIHsKKyAgRlhfQk9PTCBuZWcgPSBGQUxTRTsKKyAgaWYgKCFzdHIpCiAgICAgcmV0dXJuIDA7CisKKyAgaWYgKCpzdHIgPT0gJy0nKSB7CisgICAgbmVnID0gVFJVRTsKKyAgICBzdHIrKzsKKyAgfQorICBUIG51bSA9IDA7CisgIHdoaWxlICgqc3RyICYmIHN0ZDo6aXNkaWdpdCgqc3RyKSkgeworICAgIGlmIChudW0gPiAoc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCkgLSA5KSAvIDEwKQorICAgICAgYnJlYWs7CisKKyAgICBudW0gPSBudW0gKiAxMCArIEZYU1lTX3RvRGVjaW1hbERpZ2l0KCpzdHIpOworICAgIHN0cisrOworICB9CisgIHJldHVybiBuZWcgPyAtbnVtIDogbnVtOwogfQotRlhfRFdPUkQgRlhTWVNfR2V0RnVsbFBhdGhOYW1lKEZYX0xQQ1NUUiBmaWxlbmFtZSwgRlhfRFdPUkQgYnVmbGVuLCBGWF9MUFNUUiBidWYsIEZYX0xQU1RSKiBmaWxlcGFydCkKLXsKLSAgICBpbnQgc3JjbGVuID0gRlhTWVNfc3RybGVuKGZpbGVuYW1lKTsKLSAgICBpZiAoYnVmID09IE5VTEwgfHwgKGludClidWZsZW4gPCBzcmNsZW4gKyAxKSB7Ci0gICAgICAgIHJldHVybiBzcmNsZW4gKyAxOwotICAgIH0KLSAgICBGWFNZU19zdHJjcHkoYnVmLCBmaWxlbmFtZSk7Ci0gICAgcmV0dXJuIHNyY2xlbjsKKwordGVtcGxhdGUgPGNsYXNzIFQ+CitUIEZYU1lTX1N0clRvSW50KGNvbnN0IEZYX1dDSEFSKiBzdHIpIHsKKyAgRlhfQk9PTCBuZWcgPSBGQUxTRTsKKyAgaWYgKCFzdHIpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCpzdHIgPT0gJy0nKSB7CisgICAgbmVnID0gVFJVRTsKKyAgICBzdHIrKzsKKyAgfQorICBUIG51bSA9IDA7CisgIHdoaWxlICgqc3RyICYmIHN0ZDo6aXN3ZGlnaXQoKnN0cikpIHsKKyAgICBpZiAobnVtID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1heCgpIC0gOSkgLyAxMCkKKyAgICAgIGJyZWFrOworCisgICAgbnVtID0gbnVtICogMTAgKyBGWFNZU190b0RlY2ltYWxEaWdpdFdpZGUoKnN0cik7CisgICAgc3RyKys7CisgIH0KKyAgcmV0dXJuIG5lZyA/IC1udW0gOiBudW07CiB9Ci1GWF9EV09SRCBGWFNZU19HZXRNb2R1bGVGaWxlTmFtZShGWF9MUFZPSUQgaE1vZHVsZSwgY2hhciogYnVmLCBGWF9EV09SRCBidWZzaXplKQotewotICAgIHJldHVybiAoRlhfRFdPUkQpIC0gMTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFVULCB0eXBlbmFtZSBTVFJfVD4KK1NUUl9UIEZYU1lTX0ludFRvU3RyKFQgdmFsdWUsIFNUUl9UIHN0cmluZywgaW50IHJhZGl4KSB7CisgIGlmIChyYWRpeCA8IDIgfHwgcmFkaXggPiAxNikgeworICAgIHN0cmluZ1swXSA9IDA7CisgICAgcmV0dXJuIHN0cmluZzsKKyAgfQorICBpZiAodmFsdWUgPT0gMCkgeworICAgIHN0cmluZ1swXSA9ICcwJzsKKyAgICBzdHJpbmdbMV0gPSAwOworICAgIHJldHVybiBzdHJpbmc7CisgIH0KKyAgaW50IGkgPSAwOworICBVVCB1dmFsdWU7CisgIGlmICh2YWx1ZSA8IDApIHsKKyAgICBzdHJpbmdbaSsrXSA9ICctJzsKKyAgICAvLyBTdGFuZGFyZCB0cmljayB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyIHdoZW4gbmVnYXRpbmcgSU5UX01JTi4KKyAgICB1dmFsdWUgPSBzdGF0aWNfY2FzdDxVVD4oLSh2YWx1ZSArIDEpKSArIDE7CisgIH0gZWxzZSB7CisgICAgdXZhbHVlID0gdmFsdWU7CisgIH0KKyAgaW50IGRpZ2l0cyA9IDE7CisgIFQgb3JkZXIgPSB1dmFsdWUgLyByYWRpeDsKKyAgd2hpbGUgKG9yZGVyID4gMCkgeworICAgIGRpZ2l0cysrOworICAgIG9yZGVyID0gb3JkZXIgLyByYWRpeDsKKyAgfQorICBmb3IgKGludCBkID0gZGlnaXRzIC0gMTsgZCA+IC0xOyBkLS0pIHsKKyAgICBzdHJpbmdbZCArIGldID0gIjAxMjM0NTY3ODlhYmNkZWYiW3V2YWx1ZSAlIHJhZGl4XTsKKyAgICB1dmFsdWUgLz0gcmFkaXg7CisgIH0KKyAgc3RyaW5nW2RpZ2l0cyArIGldID0gMDsKKyAgcmV0dXJuIHN0cmluZzsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgoraW50MzJfdCBGWFNZU19hdG9pKGNvbnN0IEZYX0NIQVIqIHN0cikgeworICByZXR1cm4gRlhTWVNfU3RyVG9JbnQ8aW50MzJfdD4oc3RyKTsKK30KK2ludDMyX3QgRlhTWVNfd3RvaShjb25zdCBGWF9XQ0hBUiogc3RyKSB7CisgIHJldHVybiBGWFNZU19TdHJUb0ludDxpbnQzMl90PihzdHIpOworfQoraW50NjRfdCBGWFNZU19hdG9pNjQoY29uc3QgRlhfQ0hBUiogc3RyKSB7CisgIHJldHVybiBGWFNZU19TdHJUb0ludDxpbnQ2NF90PihzdHIpOworfQoraW50NjRfdCBGWFNZU193dG9pNjQoY29uc3QgRlhfV0NIQVIqIHN0cikgeworICByZXR1cm4gRlhTWVNfU3RyVG9JbnQ8aW50NjRfdD4oc3RyKTsKK30KK2NvbnN0IEZYX0NIQVIqIEZYU1lTX2k2NHRvYShpbnQ2NF90IHZhbHVlLCBGWF9DSEFSKiBzdHIsIGludCByYWRpeCkgeworICByZXR1cm4gRlhTWVNfSW50VG9TdHI8aW50NjRfdCwgdWludDY0X3QsIEZYX0NIQVIqPih2YWx1ZSwgc3RyLCByYWRpeCk7Cit9CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2ludCBGWFNZU19HZXRBQ1AoKSB7CisgIHJldHVybiAwOworfQorRlhfRFdPUkQgRlhTWVNfR2V0RnVsbFBhdGhOYW1lKGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGJ1ZmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DSEFSKiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ0hBUioqIGZpbGVwYXJ0KSB7CisgIGludCBzcmNsZW4gPSBGWFNZU19zdHJsZW4oZmlsZW5hbWUpOworICBpZiAoIWJ1ZiB8fCAoaW50KWJ1ZmxlbiA8IHNyY2xlbiArIDEpIHsKKyAgICByZXR1cm4gc3JjbGVuICsgMTsKKyAgfQorICBGWFNZU19zdHJjcHkoYnVmLCBmaWxlbmFtZSk7CisgIHJldHVybiBzcmNsZW47Cit9CitGWF9EV09SRCBGWFNZU19HZXRNb2R1bGVGaWxlTmFtZSh2b2lkKiBoTW9kdWxlLCBjaGFyKiBidWYsIEZYX0RXT1JEIGJ1ZnNpemUpIHsKKyAgcmV0dXJuIChGWF9EV09SRCktMTsKIH0KICNpZmRlZiBfX2NwbHVzcGx1cwogfQpAQCAtMTE0LDg3ICsxMzcsODAgQEAKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKLUZYU1lTX0ZJTEUqIEZYU1lTX3dmb3BlbihGWF9MUENXU1RSIGZpbGVuYW1lLCBGWF9MUENXU1RSIG1vZGUpCi17Ci0gICAgcmV0dXJuIEZYU1lTX2ZvcGVuKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShmaWxlbmFtZSksIENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShtb2RlKSk7CitGWFNZU19GSUxFKiBGWFNZU193Zm9wZW4oY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lLCBjb25zdCBGWF9XQ0hBUiogbW9kZSkgeworICByZXR1cm4gRlhTWVNfZm9wZW4oQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKGZpbGVuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShtb2RlKSk7CiB9Ci1jaGFyKiBGWFNZU19zdHJsd3IoY2hhciogc3RyKQotewotICAgIGlmIChzdHIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgY2hhciogcyA9IHN0cjsKLSAgICB3aGlsZSAoKnN0cikgewotICAgICAgICAqc3RyID0gRlhTWVNfdG9sb3dlcigqc3RyKTsKLSAgICAgICAgc3RyICsrOwotICAgIH0KLSAgICByZXR1cm4gczsKK2NoYXIqIEZYU1lTX3N0cmx3cihjaGFyKiBzdHIpIHsKKyAgaWYgKCFzdHIpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBjaGFyKiBzID0gc3RyOworICB3aGlsZSAoKnN0cikgeworICAgICpzdHIgPSBGWFNZU190b2xvd2VyKCpzdHIpOworICAgIHN0cisrOworICB9CisgIHJldHVybiBzOwogfQotY2hhciogRlhTWVNfc3RydXByKGNoYXIqIHN0cikKLXsKLSAgICBpZiAoc3RyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGNoYXIqIHMgPSBzdHI7Ci0gICAgd2hpbGUgKCpzdHIpIHsKLSAgICAgICAgKnN0ciA9IEZYU1lTX3RvdXBwZXIoKnN0cik7Ci0gICAgICAgIHN0ciArKzsKLSAgICB9Ci0gICAgcmV0dXJuIHM7CitjaGFyKiBGWFNZU19zdHJ1cHIoY2hhciogc3RyKSB7CisgIGlmICghc3RyKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgY2hhciogcyA9IHN0cjsKKyAgd2hpbGUgKCpzdHIpIHsKKyAgICAqc3RyID0gRlhTWVNfdG91cHBlcigqc3RyKTsKKyAgICBzdHIrKzsKKyAgfQorICByZXR1cm4gczsKIH0KLUZYX1dDSEFSKiBGWFNZU193Y3Nsd3IoRlhfV0NIQVIqIHN0cikKLXsKLSAgICBpZiAoc3RyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYX1dDSEFSKiBzID0gc3RyOwotICAgIHdoaWxlICgqc3RyKSB7Ci0gICAgICAgICpzdHIgPSBGWFNZU190b2xvd2VyKCpzdHIpOwotICAgICAgICBzdHIgKys7Ci0gICAgfQotICAgIHJldHVybiBzOworRlhfV0NIQVIqIEZYU1lTX3djc2x3cihGWF9XQ0hBUiogc3RyKSB7CisgIGlmICghc3RyKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgRlhfV0NIQVIqIHMgPSBzdHI7CisgIHdoaWxlICgqc3RyKSB7CisgICAgKnN0ciA9IEZYU1lTX3RvbG93ZXIoKnN0cik7CisgICAgc3RyKys7CisgIH0KKyAgcmV0dXJuIHM7CiB9Ci1GWF9XQ0hBUiogRlhTWVNfd2NzdXByKEZYX1dDSEFSKiBzdHIpCi17Ci0gICAgaWYgKHN0ciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworRlhfV0NIQVIqIEZYU1lTX3djc3VwcihGWF9XQ0hBUiogc3RyKSB7CisgIGlmICghc3RyKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgRlhfV0NIQVIqIHMgPSBzdHI7CisgIHdoaWxlICgqc3RyKSB7CisgICAgKnN0ciA9IEZYU1lTX3RvdXBwZXIoKnN0cik7CisgICAgc3RyKys7CisgIH0KKyAgcmV0dXJuIHM7Cit9CitpbnQgRlhTWVNfc3RyaWNtcChjb25zdCBjaGFyKiBkc3QsIGNvbnN0IGNoYXIqIHNyYykgeworICBpbnQgZiwgbDsKKyAgZG8geworICAgIGlmICgoKGYgPSAodW5zaWduZWQgY2hhcikoKihkc3QrKykpKSA+PSAnQScpICYmIChmIDw9ICdaJykpIHsKKyAgICAgIGYgLT0gKCdBJyAtICdhJyk7CiAgICAgfQotICAgIEZYX1dDSEFSKiBzID0gc3RyOwotICAgIHdoaWxlICgqc3RyKSB7Ci0gICAgICAgICpzdHIgPSBGWFNZU190b3VwcGVyKCpzdHIpOwotICAgICAgICBzdHIgKys7CisgICAgaWYgKCgobCA9ICh1bnNpZ25lZCBjaGFyKSgqKHNyYysrKSkpID49ICdBJykgJiYgKGwgPD0gJ1onKSkgeworICAgICAgbCAtPSAoJ0EnIC0gJ2EnKTsKICAgICB9Ci0gICAgcmV0dXJuIHM7CisgIH0gd2hpbGUgKGYgJiYgKGYgPT0gbCkpOworICByZXR1cm4gKGYgLSBsKTsKIH0KLWludCBGWFNZU19zdHJpY21wKGNvbnN0IGNoYXIqZHN0LCBjb25zdCBjaGFyKnNyYykKLXsKLSAgICBpbnQgZiwgbDsKLSAgICBkbyB7Ci0gICAgICAgIGlmICggKChmID0gKHVuc2lnbmVkIGNoYXIpKCooZHN0KyspKSkgPj0gJ0EnKSAmJiAoZiA8PSAnWicpICkgewotICAgICAgICAgICAgZiAtPSAoJ0EnIC0gJ2EnKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoICgobCA9ICh1bnNpZ25lZCBjaGFyKSgqKHNyYysrKSkpID49ICdBJykgJiYgKGwgPD0gJ1onKSApIHsKLSAgICAgICAgICAgIGwgLT0gKCdBJyAtICdhJyk7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlICggZiAmJiAoZiA9PSBsKSApOwotICAgIHJldHVybihmIC0gbCk7CitpbnQgRlhTWVNfd2NzaWNtcChjb25zdCBGWF9XQ0hBUiogZHN0LCBjb25zdCBGWF9XQ0hBUiogc3JjKSB7CisgIEZYX1dDSEFSIGYsIGw7CisgIGRvIHsKKyAgICBpZiAoKChmID0gKEZYX1dDSEFSKSgqKGRzdCsrKSkpID49ICdBJykgJiYgKGYgPD0gJ1onKSkgeworICAgICAgZiAtPSAoJ0EnIC0gJ2EnKTsKKyAgICB9CisgICAgaWYgKCgobCA9IChGWF9XQ0hBUikoKihzcmMrKykpKSA+PSAnQScpICYmIChsIDw9ICdaJykpIHsKKyAgICAgIGwgLT0gKCdBJyAtICdhJyk7CisgICAgfQorICB9IHdoaWxlIChmICYmIChmID09IGwpKTsKKyAgcmV0dXJuIChmIC0gbCk7CiB9Ci1pbnQgRlhTWVNfd2NzaWNtcChjb25zdCBGWF9XQ0hBUiAqZHN0LCBjb25zdCBGWF9XQ0hBUiAqc3JjKQotewotICAgIEZYX1dDSEFSIGYsIGw7Ci0gICAgZG8gewotICAgICAgICBpZiAoICgoZiA9IChGWF9XQ0hBUikoKihkc3QrKykpKSA+PSAnQScpICYmIChmIDw9ICdaJykgKSB7Ci0gICAgICAgICAgICBmIC09ICgnQScgLSAnYScpOwotICAgICAgICB9Ci0gICAgICAgIGlmICggKChsID0gKEZYX1dDSEFSKSgqKHNyYysrKSkpID49ICdBJykgJiYgKGwgPD0gJ1onKSApIHsKLSAgICAgICAgICAgIGwgLT0gKCdBJyAtICdhJyk7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlICggZiAmJiAoZiA9PSBsKSApOwotICAgIHJldHVybihmIC0gbCk7Ci19Ci1jaGFyKiBGWFNZU19pdG9hKGludCB2YWx1ZSwgY2hhciogc3RyaW5nLCBpbnQgcmFkaXgpCi17Ci0gICAgcmV0dXJuIEZYU1lTX0ludFRvU3RyPEZYX0lOVDMyLCBGWF9MUFNUUj4odmFsdWUsIHN0cmluZywgcmFkaXgpOworY2hhciogRlhTWVNfaXRvYShpbnQgdmFsdWUsIGNoYXIqIHN0cmluZywgaW50IHJhZGl4KSB7CisgIHJldHVybiBGWFNZU19JbnRUb1N0cjxpbnQzMl90LCB1aW50MzJfdCwgRlhfQ0hBUio+KHZhbHVlLCBzdHJpbmcsIHJhZGl4KTsKIH0KICNpZmRlZiBfX2NwbHVzcGx1cwogfQpAQCAtMjA0LDMxICsyMjAsMzkgQEAKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKLWludCBGWFNZU19XaWRlQ2hhclRvTXVsdGlCeXRlKEZYX0RXT1JEIGNvZGVwYWdlLCBGWF9EV09SRCBkd0ZsYWdzLCBGWF9MUENXU1RSIHdzdHIsIGludCB3bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBTVFIgYnVmLCBpbnQgYnVmbGVuLCBGWF9MUENTVFIgZGVmYXVsdF9zdHIsIEZYX0JPT0wqIHBVc2VEZWZhdWx0KQotewotICAgIGludCBsZW4gPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2xlbjsgaSArKykgewotICAgICAgICBpZiAod3N0cltpXSA8IDB4MTAwKSB7Ci0gICAgICAgICAgICBpZiAoYnVmICYmIGxlbiA8IGJ1ZmxlbikgewotICAgICAgICAgICAgICAgIGJ1ZltsZW5dID0gKEZYX0NIQVIpd3N0cltpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxlbiArKzsKLSAgICAgICAgfQoraW50IEZYU1lTX1dpZGVDaGFyVG9NdWx0aUJ5dGUoRlhfRFdPUkQgY29kZXBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHdzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NIQVIqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBkZWZhdWx0X3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcFVzZURlZmF1bHQpIHsKKyAgaW50IGxlbiA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgd2xlbjsgaSsrKSB7CisgICAgaWYgKHdzdHJbaV0gPCAweDEwMCkgeworICAgICAgaWYgKGJ1ZiAmJiBsZW4gPCBidWZsZW4pIHsKKyAgICAgICAgYnVmW2xlbl0gPSAoRlhfQ0hBUil3c3RyW2ldOworICAgICAgfQorICAgICAgbGVuKys7CiAgICAgfQotICAgIHJldHVybiBsZW47CisgIH0KKyAgcmV0dXJuIGxlbjsKIH0KLWludCBGWFNZU19NdWx0aUJ5dGVUb1dpZGVDaGFyKEZYX0RXT1JEIGNvZGVwYWdlLCBGWF9EV09SRCBkd0ZsYWdzLCBGWF9MUENTVFIgYnN0ciwgaW50IGJsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUFdTVFIgYnVmLCBpbnQgYnVmbGVuKQotewotICAgIGludCB3bGVuID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGJsZW47IGkgKyspIHsKLSAgICAgICAgaWYgKGJ1ZiAmJiB3bGVuIDwgYnVmbGVuKSB7Ci0gICAgICAgICAgICBidWZbd2xlbl0gPSBic3RyW2ldOwotICAgICAgICB9Ci0gICAgICAgIHdsZW4gKys7CitpbnQgRlhTWVNfTXVsdGlCeXRlVG9XaWRlQ2hhcihGWF9EV09SRCBjb2RlcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBic3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiogYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmxlbikgeworICBpbnQgd2xlbiA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgYmxlbjsgaSsrKSB7CisgICAgaWYgKGJ1ZiAmJiB3bGVuIDwgYnVmbGVuKSB7CisgICAgICBidWZbd2xlbl0gPSBic3RyW2ldOwogICAgIH0KLSAgICByZXR1cm4gd2xlbjsKKyAgICB3bGVuKys7CisgIH0KKyAgcmV0dXJuIHdsZW47CiB9CiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2xpc3QuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfbGlzdC5jcHAKaW5kZXggYzk2MTlmOS4uODExNzNkNiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfbGlzdC5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfbGlzdC5jcHAKQEAgLTQsMTM3ICs0LDEyMiBAQAogCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgogI2luY2x1ZGUgInBsZXguaCIKKwogQ0ZYX1B0ckxpc3Q6OkNGWF9QdHJMaXN0KGludCBuQmxvY2tTaXplKQotICAgIDogbV9wTm9kZUhlYWQoTlVMTCkKLSAgICAsIG1fcE5vZGVUYWlsKE5VTEwpCi0gICAgLCBtX25Db3VudCgwKQotICAgICwgbV9wTm9kZUZyZWUoTlVMTCkKLSAgICAsIG1fcEJsb2NrcyhOVUxMKQotICAgICwgbV9uQmxvY2tTaXplKG5CbG9ja1NpemUpCi17Ci19Ci1GWF9QT1NJVElPTiBDRlhfUHRyTGlzdDo6QWRkVGFpbCh2b2lkKiBuZXdFbGVtZW50KQotewotICAgIENOb2RlKiBwTmV3Tm9kZSA9IE5ld05vZGUobV9wTm9kZVRhaWwsIE5VTEwpOwotICAgIHBOZXdOb2RlLT5kYXRhID0gbmV3RWxlbWVudDsKLSAgICBpZiAobV9wTm9kZVRhaWwgIT0gTlVMTCkgewotICAgICAgICBtX3BOb2RlVGFpbC0+cE5leHQgPSBwTmV3Tm9kZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX3BOb2RlSGVhZCA9IHBOZXdOb2RlOwotICAgIH0KLSAgICBtX3BOb2RlVGFpbCA9IHBOZXdOb2RlOwotICAgIHJldHVybiAoRlhfUE9TSVRJT04pIHBOZXdOb2RlOwotfQotRlhfUE9TSVRJT04gQ0ZYX1B0ckxpc3Q6OkFkZEhlYWQodm9pZCogbmV3RWxlbWVudCkKLXsKLSAgICBDTm9kZSogcE5ld05vZGUgPSBOZXdOb2RlKE5VTEwsIG1fcE5vZGVIZWFkKTsKLSAgICBwTmV3Tm9kZS0+ZGF0YSA9IG5ld0VsZW1lbnQ7Ci0gICAgaWYgKG1fcE5vZGVIZWFkICE9IE5VTEwpIHsKLSAgICAgICAgbV9wTm9kZUhlYWQtPnBQcmV2ID0gcE5ld05vZGU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wTm9kZVRhaWwgPSBwTmV3Tm9kZTsKLSAgICB9CisgICAgOiBtX3BOb2RlSGVhZChOVUxMKSwKKyAgICAgIG1fcE5vZGVUYWlsKE5VTEwpLAorICAgICAgbV9uQ291bnQoMCksCisgICAgICBtX3BOb2RlRnJlZShOVUxMKSwKKyAgICAgIG1fcEJsb2NrcyhOVUxMKSwKKyAgICAgIG1fbkJsb2NrU2l6ZShuQmxvY2tTaXplKSB7fQorRlhfUE9TSVRJT04gQ0ZYX1B0ckxpc3Q6OkFkZFRhaWwodm9pZCogbmV3RWxlbWVudCkgeworICBDTm9kZSogcE5ld05vZGUgPSBOZXdOb2RlKG1fcE5vZGVUYWlsLCBOVUxMKTsKKyAgcE5ld05vZGUtPmRhdGEgPSBuZXdFbGVtZW50OworICBpZiAobV9wTm9kZVRhaWwpIHsKKyAgICBtX3BOb2RlVGFpbC0+cE5leHQgPSBwTmV3Tm9kZTsKKyAgfSBlbHNlIHsKICAgICBtX3BOb2RlSGVhZCA9IHBOZXdOb2RlOwotICAgIHJldHVybiAoRlhfUE9TSVRJT04pIHBOZXdOb2RlOworICB9CisgIG1fcE5vZGVUYWlsID0gcE5ld05vZGU7CisgIHJldHVybiAoRlhfUE9TSVRJT04pcE5ld05vZGU7CiB9Ci1GWF9QT1NJVElPTiBDRlhfUHRyTGlzdDo6SW5zZXJ0QWZ0ZXIoRlhfUE9TSVRJT04gcG9zaXRpb24sIHZvaWQqIG5ld0VsZW1lbnQpCi17Ci0gICAgaWYgKHBvc2l0aW9uID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEFkZFRhaWwobmV3RWxlbWVudCk7Ci0gICAgfQotICAgIENOb2RlKiBwT2xkTm9kZSA9IChDTm9kZSopIHBvc2l0aW9uOwotICAgIENOb2RlKiBwTmV3Tm9kZSA9IE5ld05vZGUocE9sZE5vZGUsIHBPbGROb2RlLT5wTmV4dCk7Ci0gICAgcE5ld05vZGUtPmRhdGEgPSBuZXdFbGVtZW50OwotICAgIGlmIChwT2xkTm9kZS0+cE5leHQgIT0gTlVMTCkgewotICAgICAgICBwT2xkTm9kZS0+cE5leHQtPnBQcmV2ID0gcE5ld05vZGU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wTm9kZVRhaWwgPSBwTmV3Tm9kZTsKLSAgICB9Ci0gICAgcE9sZE5vZGUtPnBOZXh0ID0gcE5ld05vZGU7Ci0gICAgcmV0dXJuIChGWF9QT1NJVElPTikgcE5ld05vZGU7CitGWF9QT1NJVElPTiBDRlhfUHRyTGlzdDo6QWRkSGVhZCh2b2lkKiBuZXdFbGVtZW50KSB7CisgIENOb2RlKiBwTmV3Tm9kZSA9IE5ld05vZGUoTlVMTCwgbV9wTm9kZUhlYWQpOworICBwTmV3Tm9kZS0+ZGF0YSA9IG5ld0VsZW1lbnQ7CisgIGlmIChtX3BOb2RlSGVhZCkgeworICAgIG1fcE5vZGVIZWFkLT5wUHJldiA9IHBOZXdOb2RlOworICB9IGVsc2UgeworICAgIG1fcE5vZGVUYWlsID0gcE5ld05vZGU7CisgIH0KKyAgbV9wTm9kZUhlYWQgPSBwTmV3Tm9kZTsKKyAgcmV0dXJuIChGWF9QT1NJVElPTilwTmV3Tm9kZTsKIH0KLXZvaWQgQ0ZYX1B0ckxpc3Q6OlJlbW92ZUF0KEZYX1BPU0lUSU9OIHBvc2l0aW9uKQotewotICAgIENOb2RlKiBwT2xkTm9kZSA9IChDTm9kZSopIHBvc2l0aW9uOwotICAgIGlmIChwT2xkTm9kZSA9PSBtX3BOb2RlSGVhZCkgewotICAgICAgICBtX3BOb2RlSGVhZCA9IHBPbGROb2RlLT5wTmV4dDsKLSAgICB9IGVsc2UgewotICAgICAgICBwT2xkTm9kZS0+cFByZXYtPnBOZXh0ID0gcE9sZE5vZGUtPnBOZXh0OwotICAgIH0KLSAgICBpZiAocE9sZE5vZGUgPT0gbV9wTm9kZVRhaWwpIHsKLSAgICAgICAgbV9wTm9kZVRhaWwgPSBwT2xkTm9kZS0+cFByZXY7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcE9sZE5vZGUtPnBOZXh0LT5wUHJldiA9IHBPbGROb2RlLT5wUHJldjsKLSAgICB9Ci0gICAgRnJlZU5vZGUocE9sZE5vZGUpOworRlhfUE9TSVRJT04gQ0ZYX1B0ckxpc3Q6Okluc2VydEFmdGVyKEZYX1BPU0lUSU9OIHBvc2l0aW9uLCB2b2lkKiBuZXdFbGVtZW50KSB7CisgIGlmICghcG9zaXRpb24pIHsKKyAgICByZXR1cm4gQWRkVGFpbChuZXdFbGVtZW50KTsKKyAgfQorICBDTm9kZSogcE9sZE5vZGUgPSAoQ05vZGUqKXBvc2l0aW9uOworICBDTm9kZSogcE5ld05vZGUgPSBOZXdOb2RlKHBPbGROb2RlLCBwT2xkTm9kZS0+cE5leHQpOworICBwTmV3Tm9kZS0+ZGF0YSA9IG5ld0VsZW1lbnQ7CisgIGlmIChwT2xkTm9kZS0+cE5leHQpIHsKKyAgICBwT2xkTm9kZS0+cE5leHQtPnBQcmV2ID0gcE5ld05vZGU7CisgIH0gZWxzZSB7CisgICAgbV9wTm9kZVRhaWwgPSBwTmV3Tm9kZTsKKyAgfQorICBwT2xkTm9kZS0+cE5leHQgPSBwTmV3Tm9kZTsKKyAgcmV0dXJuIChGWF9QT1NJVElPTilwTmV3Tm9kZTsKIH0KLXZvaWQgQ0ZYX1B0ckxpc3Q6OkZyZWVOb2RlKENGWF9QdHJMaXN0OjpDTm9kZSogcE5vZGUpCi17Ci0gICAgcE5vZGUtPnBOZXh0ID0gbV9wTm9kZUZyZWU7Ci0gICAgbV9wTm9kZUZyZWUgPSBwTm9kZTsKLSAgICBtX25Db3VudC0tOwotICAgIGlmIChtX25Db3VudCA9PSAwKSB7Ci0gICAgICAgIFJlbW92ZUFsbCgpOwotICAgIH0KK3ZvaWQgQ0ZYX1B0ckxpc3Q6OlJlbW92ZUF0KEZYX1BPU0lUSU9OIHBvc2l0aW9uKSB7CisgIENOb2RlKiBwT2xkTm9kZSA9IChDTm9kZSopcG9zaXRpb247CisgIGlmIChwT2xkTm9kZSA9PSBtX3BOb2RlSGVhZCkgeworICAgIG1fcE5vZGVIZWFkID0gcE9sZE5vZGUtPnBOZXh0OworICB9IGVsc2UgeworICAgIHBPbGROb2RlLT5wUHJldi0+cE5leHQgPSBwT2xkTm9kZS0+cE5leHQ7CisgIH0KKyAgaWYgKHBPbGROb2RlID09IG1fcE5vZGVUYWlsKSB7CisgICAgbV9wTm9kZVRhaWwgPSBwT2xkTm9kZS0+cFByZXY7CisgIH0gZWxzZSB7CisgICAgcE9sZE5vZGUtPnBOZXh0LT5wUHJldiA9IHBPbGROb2RlLT5wUHJldjsKKyAgfQorICBGcmVlTm9kZShwT2xkTm9kZSk7CiB9Ci12b2lkIENGWF9QdHJMaXN0OjpSZW1vdmVBbGwoKQotewotICAgIG1fbkNvdW50ID0gMDsKLSAgICBtX3BOb2RlSGVhZCA9IG1fcE5vZGVUYWlsID0gbV9wTm9kZUZyZWUgPSBOVUxMOwotICAgIG1fcEJsb2Nrcy0+RnJlZURhdGFDaGFpbigpOwotICAgIG1fcEJsb2NrcyA9IE5VTEw7Ci19Ci1DRlhfUHRyTGlzdDo6Q05vZGUqCi1DRlhfUHRyTGlzdDo6TmV3Tm9kZShDRlhfUHRyTGlzdDo6Q05vZGUqIHBQcmV2LCBDRlhfUHRyTGlzdDo6Q05vZGUqIHBOZXh0KQotewotICAgIGlmIChtX3BOb2RlRnJlZSA9PSBOVUxMKSB7Ci0gICAgICAgIENGWF9QbGV4KiBwTmV3QmxvY2sgPSBDRlhfUGxleDo6Q3JlYXRlKG1fcEJsb2NrcywgbV9uQmxvY2tTaXplLCBzaXplb2YoQ05vZGUpKTsKLSAgICAgICAgQ05vZGUqIHBOb2RlID0gKENOb2RlKilwTmV3QmxvY2stPmRhdGEoKTsKLSAgICAgICAgcE5vZGUgKz0gbV9uQmxvY2tTaXplIC0gMTsKLSAgICAgICAgZm9yIChpbnQgaSA9IG1fbkJsb2NrU2l6ZSAtIDE7IGkgPj0gMDsgaS0tLCBwTm9kZS0tKSB7Ci0gICAgICAgICAgICBwTm9kZS0+cE5leHQgPSBtX3BOb2RlRnJlZTsKLSAgICAgICAgICAgIG1fcE5vZGVGcmVlID0gcE5vZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQVNTRVJUKG1fcE5vZGVGcmVlICE9IE5VTEwpOwotICAgIENGWF9QdHJMaXN0OjpDTm9kZSogcE5vZGUgPSBtX3BOb2RlRnJlZTsKLSAgICBtX3BOb2RlRnJlZSA9IG1fcE5vZGVGcmVlLT5wTmV4dDsKLSAgICBwTm9kZS0+cFByZXYgPSBwUHJldjsKLSAgICBwTm9kZS0+cE5leHQgPSBwTmV4dDsKLSAgICBtX25Db3VudCsrOwotICAgIEFTU0VSVChtX25Db3VudCA+IDApOwotICAgIHBOb2RlLT5kYXRhID0gMDsKLSAgICByZXR1cm4gcE5vZGU7Ci19Ci1DRlhfUHRyTGlzdDo6fkNGWF9QdHJMaXN0KCkKLXsKK3ZvaWQgQ0ZYX1B0ckxpc3Q6OkZyZWVOb2RlKENGWF9QdHJMaXN0OjpDTm9kZSogcE5vZGUpIHsKKyAgcE5vZGUtPnBOZXh0ID0gbV9wTm9kZUZyZWU7CisgIG1fcE5vZGVGcmVlID0gcE5vZGU7CisgIG1fbkNvdW50LS07CisgIGlmIChtX25Db3VudCA9PSAwKSB7CiAgICAgUmVtb3ZlQWxsKCk7Ci0gICAgQVNTRVJUKG1fbkNvdW50ID09IDApOworICB9CiB9Ci1GWF9QT1NJVElPTiBDRlhfUHRyTGlzdDo6RmluZEluZGV4KGludCBuSW5kZXgpIGNvbnN0Ci17Ci0gICAgaWYgKG5JbmRleCA+PSBtX25Db3VudCB8fCBuSW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDTm9kZSogcE5vZGUgPSBtX3BOb2RlSGVhZDsKLSAgICB3aGlsZSAobkluZGV4LS0pIHsKLSAgICAgICAgcE5vZGUgPSBwTm9kZS0+cE5leHQ7Ci0gICAgfQotICAgIHJldHVybiAoRlhfUE9TSVRJT04pIHBOb2RlOwordm9pZCBDRlhfUHRyTGlzdDo6UmVtb3ZlQWxsKCkgeworICBtX25Db3VudCA9IDA7CisgIG1fcE5vZGVIZWFkID0gbV9wTm9kZVRhaWwgPSBtX3BOb2RlRnJlZSA9IE5VTEw7CisgIG1fcEJsb2Nrcy0+RnJlZURhdGFDaGFpbigpOworICBtX3BCbG9ja3MgPSBOVUxMOwogfQotRlhfUE9TSVRJT04gQ0ZYX1B0ckxpc3Q6OkZpbmQodm9pZCogc2VhcmNoVmFsdWUsIEZYX1BPU0lUSU9OIHN0YXJ0QWZ0ZXIpIGNvbnN0Ci17Ci0gICAgQ05vZGUqIHBOb2RlID0gKENOb2RlKikgc3RhcnRBZnRlcjsKLSAgICBpZiAocE5vZGUgPT0gTlVMTCkgewotICAgICAgICBwTm9kZSA9IG1fcE5vZGVIZWFkOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBOb2RlID0gcE5vZGUtPnBOZXh0OworQ0ZYX1B0ckxpc3Q6OkNOb2RlKiBDRlhfUHRyTGlzdDo6TmV3Tm9kZShDRlhfUHRyTGlzdDo6Q05vZGUqIHBQcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyTGlzdDo6Q05vZGUqIHBOZXh0KSB7CisgIGlmICghbV9wTm9kZUZyZWUpIHsKKyAgICBDRlhfUGxleCogcE5ld0Jsb2NrID0KKyAgICAgICAgQ0ZYX1BsZXg6OkNyZWF0ZShtX3BCbG9ja3MsIG1fbkJsb2NrU2l6ZSwgc2l6ZW9mKENOb2RlKSk7CisgICAgQ05vZGUqIHBOb2RlID0gKENOb2RlKilwTmV3QmxvY2stPmRhdGEoKTsKKyAgICBwTm9kZSArPSBtX25CbG9ja1NpemUgLSAxOworICAgIGZvciAoaW50IGkgPSBtX25CbG9ja1NpemUgLSAxOyBpID49IDA7IGktLSwgcE5vZGUtLSkgeworICAgICAgcE5vZGUtPnBOZXh0ID0gbV9wTm9kZUZyZWU7CisgICAgICBtX3BOb2RlRnJlZSA9IHBOb2RlOwogICAgIH0KLSAgICBmb3IgKDsgcE5vZGUgIT0gTlVMTDsgcE5vZGUgPSBwTm9kZS0+cE5leHQpCi0gICAgICAgIGlmIChwTm9kZS0+ZGF0YSA9PSBzZWFyY2hWYWx1ZSkgewotICAgICAgICAgICAgcmV0dXJuIChGWF9QT1NJVElPTikgcE5vZGU7Ci0gICAgICAgIH0KKyAgfQorICBDRlhfUHRyTGlzdDo6Q05vZGUqIHBOb2RlID0gbV9wTm9kZUZyZWU7CisgIG1fcE5vZGVGcmVlID0gbV9wTm9kZUZyZWUtPnBOZXh0OworICBwTm9kZS0+cFByZXYgPSBwUHJldjsKKyAgcE5vZGUtPnBOZXh0ID0gcE5leHQ7CisgIG1fbkNvdW50Kys7CisgIEFTU0VSVChtX25Db3VudCA+IDApOworICBwTm9kZS0+ZGF0YSA9IDA7CisgIHJldHVybiBwTm9kZTsKK30KK0NGWF9QdHJMaXN0Ojp+Q0ZYX1B0ckxpc3QoKSB7CisgIFJlbW92ZUFsbCgpOworICBBU1NFUlQobV9uQ291bnQgPT0gMCk7Cit9CitGWF9QT1NJVElPTiBDRlhfUHRyTGlzdDo6RmluZEluZGV4KGludCBuSW5kZXgpIGNvbnN0IHsKKyAgaWYgKG5JbmRleCA+PSBtX25Db3VudCB8fCBuSW5kZXggPCAwKSB7CiAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ05vZGUqIHBOb2RlID0gbV9wTm9kZUhlYWQ7CisgIHdoaWxlIChuSW5kZXgtLSkgeworICAgIHBOb2RlID0gcE5vZGUtPnBOZXh0OworICB9CisgIHJldHVybiAoRlhfUE9TSVRJT04pcE5vZGU7Cit9CitGWF9QT1NJVElPTiBDRlhfUHRyTGlzdDo6RmluZCh2b2lkKiBzZWFyY2hWYWx1ZSwgRlhfUE9TSVRJT04gc3RhcnRBZnRlcikgY29uc3QgeworICBDTm9kZSogcE5vZGUgPSAoQ05vZGUqKXN0YXJ0QWZ0ZXI7CisgIHBOb2RlID0gcE5vZGUgPyBwTm9kZS0+cE5leHQgOiBtX3BOb2RlSGVhZDsKKyAgZm9yICg7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5wTmV4dCkgeworICAgIGlmIChwTm9kZS0+ZGF0YSA9PSBzZWFyY2hWYWx1ZSkKKyAgICAgIHJldHVybiAoRlhfUE9TSVRJT04pcE5vZGU7CisgIH0KKyAgcmV0dXJuIE5VTEw7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19tYXBzLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX21hcHMuY3BwCmluZGV4IDdmY2E0MmEuLmY3ZDEyN2YgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX21hcHMuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX21hcHMuY3BwCkBAIC00LDYzOCArNCwzNTIgQEAKIAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfZXh0LmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCiAjaW5jbHVkZSAicGxleC5oIgotc3RhdGljIHZvaWQgQ29uc3RydWN0RWxlbWVudChDRlhfQnl0ZVN0cmluZyogcE5ld0RhdGEpCi17Ci0gICAgbmV3IChwTmV3RGF0YSkgQ0ZYX0J5dGVTdHJpbmcoKTsKLX0KLXN0YXRpYyB2b2lkIERlc3RydWN0RWxlbWVudChDRlhfQnl0ZVN0cmluZyogcE9sZERhdGEpCi17Ci0gICAgcE9sZERhdGEtPn5DRlhfQnl0ZVN0cmluZygpOwotfQorCituYW1lc3BhY2UgeworCitjb25zdCB1aW50OF90IGtGcmVlTGVuZ3RoID0gMHhmZTsKK2NvbnN0IHVpbnQ4X3Qga0hhc0FsbG9jYXRlZEJ1ZmZlckxlbmd0aCA9IDB4ZmY7CisKK30gIC8vIG5hbWVzcGFjZQorCiBDRlhfTWFwUHRyVG9QdHI6OkNGWF9NYXBQdHJUb1B0cihpbnQgbkJsb2NrU2l6ZSkKLSAgICA6IG1fcEhhc2hUYWJsZShOVUxMKQotICAgICwgbV9uSGFzaFRhYmxlU2l6ZSgxNykKLSAgICAsIG1fbkNvdW50KDApCi0gICAgLCBtX3BGcmVlTGlzdChOVUxMKQotICAgICwgbV9wQmxvY2tzKE5VTEwpCi0gICAgLCBtX25CbG9ja1NpemUobkJsb2NrU2l6ZSkKLXsKLSAgICBBU1NFUlQobV9uQmxvY2tTaXplID4gMCk7CisgICAgOiBtX3BIYXNoVGFibGUoTlVMTCksCisgICAgICBtX25IYXNoVGFibGVTaXplKDE3KSwKKyAgICAgIG1fbkNvdW50KDApLAorICAgICAgbV9wRnJlZUxpc3QoTlVMTCksCisgICAgICBtX3BCbG9ja3MoTlVMTCksCisgICAgICBtX25CbG9ja1NpemUobkJsb2NrU2l6ZSkgeworICBBU1NFUlQobV9uQmxvY2tTaXplID4gMCk7CiB9Ci12b2lkIENGWF9NYXBQdHJUb1B0cjo6UmVtb3ZlQWxsKCkKLXsKLSAgICBpZiAobV9wSGFzaFRhYmxlKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wSGFzaFRhYmxlKTsKLSAgICAgICAgbV9wSGFzaFRhYmxlID0gTlVMTDsKLSAgICB9Ci0gICAgbV9uQ291bnQgPSAwOwotICAgIG1fcEZyZWVMaXN0ID0gTlVMTDsKLSAgICBtX3BCbG9ja3MtPkZyZWVEYXRhQ2hhaW4oKTsKLSAgICBtX3BCbG9ja3MgPSBOVUxMOwordm9pZCBDRlhfTWFwUHRyVG9QdHI6OlJlbW92ZUFsbCgpIHsKKyAgRlhfRnJlZShtX3BIYXNoVGFibGUpOworICBtX3BIYXNoVGFibGUgPSBOVUxMOworICBtX25Db3VudCA9IDA7CisgIG1fcEZyZWVMaXN0ID0gTlVMTDsKKyAgbV9wQmxvY2tzLT5GcmVlRGF0YUNoYWluKCk7CisgIG1fcEJsb2NrcyA9IE5VTEw7CiB9Ci1DRlhfTWFwUHRyVG9QdHI6On5DRlhfTWFwUHRyVG9QdHIoKQotewotICAgIFJlbW92ZUFsbCgpOwotICAgIEFTU0VSVChtX25Db3VudCA9PSAwKTsKK0NGWF9NYXBQdHJUb1B0cjo6fkNGWF9NYXBQdHJUb1B0cigpIHsKKyAgUmVtb3ZlQWxsKCk7CisgIEFTU0VSVChtX25Db3VudCA9PSAwKTsKIH0KLUZYX0RXT1JEIENGWF9NYXBQdHJUb1B0cjo6SGFzaEtleSh2b2lkKiBrZXkpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICgoRlhfRFdPUkQpKEZYX1VJTlRQVFIpa2V5KSA+PiA0OworRlhfRFdPUkQgQ0ZYX01hcFB0clRvUHRyOjpIYXNoS2V5KHZvaWQqIGtleSkgY29uc3QgeworICByZXR1cm4gKChGWF9EV09SRCkodWludHB0cl90KWtleSkgPj4gNDsKIH0KLXZvaWQgQ0ZYX01hcFB0clRvUHRyOjpHZXROZXh0QXNzb2MoRlhfUE9TSVRJT04mIHJOZXh0UG9zaXRpb24sIHZvaWQqJiByS2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdAotewotICAgIEFTU0VSVChtX3BIYXNoVGFibGUgIT0gTlVMTCk7Ci0gICAgQ0Fzc29jKiBwQXNzb2NSZXQgPSAoQ0Fzc29jKilyTmV4dFBvc2l0aW9uOwotICAgIEFTU0VSVChwQXNzb2NSZXQgIT0gTlVMTCk7Ci0gICAgaWYgKHBBc3NvY1JldCA9PSAoQ0Fzc29jKikgLSAxKSB7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgbkJ1Y2tldCA9IDA7IG5CdWNrZXQgPCBtX25IYXNoVGFibGVTaXplOyBuQnVja2V0KyspCi0gICAgICAgICAgICBpZiAoKHBBc3NvY1JldCA9IG1fcEhhc2hUYWJsZVtuQnVja2V0XSkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBBU1NFUlQocEFzc29jUmV0ICE9IE5VTEwpOwordm9pZCBDRlhfTWFwUHRyVG9QdHI6OkdldE5leHRBc3NvYyhGWF9QT1NJVElPTiYgck5leHRQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIHJLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiByVmFsdWUpIGNvbnN0IHsKKyAgQVNTRVJUKG1fcEhhc2hUYWJsZSk7CisgIENBc3NvYyogcEFzc29jUmV0ID0gKENBc3NvYyopck5leHRQb3NpdGlvbjsKKyAgQVNTRVJUKHBBc3NvY1JldCk7CisgIGlmIChwQXNzb2NSZXQgPT0gKENBc3NvYyopLTEpIHsKKyAgICBmb3IgKEZYX0RXT1JEIG5CdWNrZXQgPSAwOyBuQnVja2V0IDwgbV9uSGFzaFRhYmxlU2l6ZTsgbkJ1Y2tldCsrKSB7CisgICAgICBpZiAoKHBBc3NvY1JldCA9IG1fcEhhc2hUYWJsZVtuQnVja2V0XSkgIT0gTlVMTCkKKyAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIENBc3NvYyogcEFzc29jTmV4dDsKLSAgICBpZiAoKHBBc3NvY05leHQgPSBwQXNzb2NSZXQtPnBOZXh0KSA9PSBOVUxMKSB7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgbkJ1Y2tldCA9IChIYXNoS2V5KHBBc3NvY1JldC0+a2V5KSAlIG1fbkhhc2hUYWJsZVNpemUpICsgMTsgbkJ1Y2tldCA8IG1fbkhhc2hUYWJsZVNpemU7IG5CdWNrZXQgKyspIHsKLSAgICAgICAgICAgIGlmICgocEFzc29jTmV4dCA9IG1fcEhhc2hUYWJsZVtuQnVja2V0XSkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgQVNTRVJUKHBBc3NvY1JldCk7CisgIH0KKyAgQ0Fzc29jKiBwQXNzb2NOZXh0OworICBpZiAoKHBBc3NvY05leHQgPSBwQXNzb2NSZXQtPnBOZXh0KSA9PSBOVUxMKSB7CisgICAgZm9yIChGWF9EV09SRCBuQnVja2V0ID0gKEhhc2hLZXkocEFzc29jUmV0LT5rZXkpICUgbV9uSGFzaFRhYmxlU2l6ZSkgKyAxOworICAgICAgICAgbkJ1Y2tldCA8IG1fbkhhc2hUYWJsZVNpemU7IG5CdWNrZXQrKykgeworICAgICAgaWYgKChwQXNzb2NOZXh0ID0gbV9wSGFzaFRhYmxlW25CdWNrZXRdKSAhPSBOVUxMKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQogICAgIH0KLSAgICByTmV4dFBvc2l0aW9uID0gKEZYX1BPU0lUSU9OKSBwQXNzb2NOZXh0OwotICAgIHJLZXkgPSBwQXNzb2NSZXQtPmtleTsKLSAgICByVmFsdWUgPSBwQXNzb2NSZXQtPnZhbHVlOworICB9CisgIHJOZXh0UG9zaXRpb24gPSAoRlhfUE9TSVRJT04pcEFzc29jTmV4dDsKKyAgcktleSA9IHBBc3NvY1JldC0+a2V5OworICByVmFsdWUgPSBwQXNzb2NSZXQtPnZhbHVlOwogfQotRlhfQk9PTCBDRlhfTWFwUHRyVG9QdHI6Okxvb2t1cCh2b2lkKiBrZXksIHZvaWQqJiByVmFsdWUpIGNvbnN0Ci17Ci0gICAgRlhfRFdPUkQgbkhhc2g7Ci0gICAgQ0Fzc29jKiBwQXNzb2MgPSBHZXRBc3NvY0F0KGtleSwgbkhhc2gpOwotICAgIGlmIChwQXNzb2MgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJWYWx1ZSA9IHBBc3NvYy0+dmFsdWU7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci12b2lkKiBDRlhfTWFwUHRyVG9QdHI6OkdldFZhbHVlQXQodm9pZCoga2V5KSBjb25zdAotewotICAgIEZYX0RXT1JEIG5IYXNoOwotICAgIENBc3NvYyogcEFzc29jID0gR2V0QXNzb2NBdChrZXksIG5IYXNoKTsKLSAgICBpZiAocEFzc29jID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBwQXNzb2MtPnZhbHVlOwotfQotdm9pZComIENGWF9NYXBQdHJUb1B0cjo6b3BlcmF0b3JbXSh2b2lkKiBrZXkpCi17Ci0gICAgRlhfRFdPUkQgbkhhc2g7Ci0gICAgQ0Fzc29jKiBwQXNzb2M7Ci0gICAgaWYgKChwQXNzb2MgPSBHZXRBc3NvY0F0KGtleSwgbkhhc2gpKSA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChtX3BIYXNoVGFibGUgPT0gTlVMTCkgewotICAgICAgICAgICAgSW5pdEhhc2hUYWJsZShtX25IYXNoVGFibGVTaXplKTsKLSAgICAgICAgfQotICAgICAgICBwQXNzb2MgPSBOZXdBc3NvYygpOwotICAgICAgICBwQXNzb2MtPmtleSA9IGtleTsKLSAgICAgICAgcEFzc29jLT5wTmV4dCA9IG1fcEhhc2hUYWJsZVtuSGFzaF07Ci0gICAgICAgIG1fcEhhc2hUYWJsZVtuSGFzaF0gPSBwQXNzb2M7Ci0gICAgfQotICAgIHJldHVybiBwQXNzb2MtPnZhbHVlOwotfQotQ0ZYX01hcFB0clRvUHRyOjpDQXNzb2MqCi1DRlhfTWFwUHRyVG9QdHI6OkdldEFzc29jQXQodm9pZCoga2V5LCBGWF9EV09SRCYgbkhhc2gpIGNvbnN0Ci17Ci0gICAgbkhhc2ggPSBIYXNoS2V5KGtleSkgJSBtX25IYXNoVGFibGVTaXplOwotICAgIGlmIChtX3BIYXNoVGFibGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ0Fzc29jKiBwQXNzb2M7Ci0gICAgZm9yIChwQXNzb2MgPSBtX3BIYXNoVGFibGVbbkhhc2hdOyBwQXNzb2MgIT0gTlVMTDsgcEFzc29jID0gcEFzc29jLT5wTmV4dCkgewotICAgICAgICBpZiAocEFzc29jLT5rZXkgPT0ga2V5KSB7Ci0gICAgICAgICAgICByZXR1cm4gcEFzc29jOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotQ0ZYX01hcFB0clRvUHRyOjpDQXNzb2MqCi1DRlhfTWFwUHRyVG9QdHI6Ok5ld0Fzc29jKCkKLXsKLSAgICBpZiAobV9wRnJlZUxpc3QgPT0gTlVMTCkgewotICAgICAgICBDRlhfUGxleCogbmV3QmxvY2sgPSBDRlhfUGxleDo6Q3JlYXRlKG1fcEJsb2NrcywgbV9uQmxvY2tTaXplLCBzaXplb2YoQ0ZYX01hcFB0clRvUHRyOjpDQXNzb2MpKTsKLSAgICAgICAgQ0ZYX01hcFB0clRvUHRyOjpDQXNzb2MqIHBBc3NvYyA9IChDRlhfTWFwUHRyVG9QdHI6OkNBc3NvYyopbmV3QmxvY2stPmRhdGEoKTsKLSAgICAgICAgcEFzc29jICs9IG1fbkJsb2NrU2l6ZSAtIDE7Ci0gICAgICAgIGZvciAoaW50IGkgPSBtX25CbG9ja1NpemUgLSAxOyBpID49IDA7IGktLSwgcEFzc29jLS0pIHsKLSAgICAgICAgICAgIHBBc3NvYy0+cE5leHQgPSBtX3BGcmVlTGlzdDsKLSAgICAgICAgICAgIG1fcEZyZWVMaXN0ID0gcEFzc29jOwotICAgICAgICB9Ci0gICAgfQotICAgIEFTU0VSVChtX3BGcmVlTGlzdCAhPSBOVUxMKTsKLSAgICBDRlhfTWFwUHRyVG9QdHI6OkNBc3NvYyogcEFzc29jID0gbV9wRnJlZUxpc3Q7Ci0gICAgbV9wRnJlZUxpc3QgPSBtX3BGcmVlTGlzdC0+cE5leHQ7Ci0gICAgbV9uQ291bnQrKzsKLSAgICBBU1NFUlQobV9uQ291bnQgPiAwKTsKLSAgICBwQXNzb2MtPmtleSA9IDA7Ci0gICAgcEFzc29jLT52YWx1ZSA9IDA7Ci0gICAgcmV0dXJuIHBBc3NvYzsKLX0KLXZvaWQgQ0ZYX01hcFB0clRvUHRyOjpJbml0SGFzaFRhYmxlKAotICAgIEZYX0RXT1JEIG5IYXNoU2l6ZSwgRlhfQk9PTCBiQWxsb2NOb3cpCi17Ci0gICAgQVNTRVJUKG1fbkNvdW50ID09IDApOwotICAgIEFTU0VSVChuSGFzaFNpemUgPiAwKTsKLSAgICBpZiAobV9wSGFzaFRhYmxlICE9IE5VTEwpIHsKLSAgICAgICAgRlhfRnJlZShtX3BIYXNoVGFibGUpOwotICAgICAgICBtX3BIYXNoVGFibGUgPSBOVUxMOwotICAgIH0KLSAgICBpZiAoYkFsbG9jTm93KSB7Ci0gICAgICAgIG1fcEhhc2hUYWJsZSA9IEZYX0FsbG9jKENBc3NvYyosIG5IYXNoU2l6ZSk7Ci0gICAgfQotICAgIG1fbkhhc2hUYWJsZVNpemUgPSBuSGFzaFNpemU7Ci19Ci1GWF9CT09MIENGWF9NYXBQdHJUb1B0cjo6UmVtb3ZlS2V5KHZvaWQqIGtleSkKLXsKLSAgICBpZiAobV9wSGFzaFRhYmxlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDQXNzb2MqKiBwcEFzc29jUHJldjsKLSAgICBwcEFzc29jUHJldiA9ICZtX3BIYXNoVGFibGVbSGFzaEtleShrZXkpICUgbV9uSGFzaFRhYmxlU2l6ZV07Ci0gICAgQ0Fzc29jKiBwQXNzb2M7Ci0gICAgZm9yIChwQXNzb2MgPSAqcHBBc3NvY1ByZXY7IHBBc3NvYyAhPSBOVUxMOyBwQXNzb2MgPSBwQXNzb2MtPnBOZXh0KSB7Ci0gICAgICAgIGlmIChwQXNzb2MtPmtleSA9PSBrZXkpIHsKLSAgICAgICAgICAgICpwcEFzc29jUHJldiA9IHBBc3NvYy0+cE5leHQ7Ci0gICAgICAgICAgICBGcmVlQXNzb2MocEFzc29jKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIHBwQXNzb2NQcmV2ID0gJnBBc3NvYy0+cE5leHQ7Ci0gICAgfQorRlhfQk9PTCBDRlhfTWFwUHRyVG9QdHI6Okxvb2t1cCh2b2lkKiBrZXksIHZvaWQqJiByVmFsdWUpIGNvbnN0IHsKKyAgRlhfRFdPUkQgbkhhc2g7CisgIENBc3NvYyogcEFzc29jID0gR2V0QXNzb2NBdChrZXksIG5IYXNoKTsKKyAgaWYgKCFwQXNzb2MpIHsKICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgclZhbHVlID0gcEFzc29jLT52YWx1ZTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci12b2lkIENGWF9NYXBQdHJUb1B0cjo6RnJlZUFzc29jKENGWF9NYXBQdHJUb1B0cjo6Q0Fzc29jKiBwQXNzb2MpCi17Ci0gICAgcEFzc29jLT5wTmV4dCA9IG1fcEZyZWVMaXN0OwotICAgIG1fcEZyZWVMaXN0ID0gcEFzc29jOwotICAgIG1fbkNvdW50LS07Ci0gICAgQVNTRVJUKG1fbkNvdW50ID49IDApOwotICAgIGlmIChtX25Db3VudCA9PSAwKSB7Ci0gICAgICAgIFJlbW92ZUFsbCgpOwotICAgIH0KLX0KLUNGWF9NYXBCeXRlU3RyaW5nVG9QdHI6OkNGWF9NYXBCeXRlU3RyaW5nVG9QdHIoaW50IG5CbG9ja1NpemUpCi0gICAgOiBtX3BIYXNoVGFibGUoTlVMTCkKLSAgICAsIG1fbkhhc2hUYWJsZVNpemUoMTcpCi0gICAgLCBtX25Db3VudCgwKQotICAgICwgbV9wRnJlZUxpc3QoTlVMTCkKLSAgICAsIG1fcEJsb2NrcyhOVUxMKQotICAgICwgbV9uQmxvY2tTaXplKG5CbG9ja1NpemUpCi17Ci0gICAgQVNTRVJUKG1fbkJsb2NrU2l6ZSA+IDApOwotfQotdm9pZCBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyOjpSZW1vdmVBbGwoKQotewotICAgIGlmIChtX3BIYXNoVGFibGUgIT0gTlVMTCkgewotICAgICAgICBmb3IgKEZYX0RXT1JEIG5IYXNoID0gMDsgbkhhc2ggPCBtX25IYXNoVGFibGVTaXplOyBuSGFzaCsrKSB7Ci0gICAgICAgICAgICBDQXNzb2MqIHBBc3NvYzsKLSAgICAgICAgICAgIGZvciAocEFzc29jID0gbV9wSGFzaFRhYmxlW25IYXNoXTsgcEFzc29jICE9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHBBc3NvYyA9IHBBc3NvYy0+cE5leHQpIHsKLSAgICAgICAgICAgICAgICBEZXN0cnVjdEVsZW1lbnQoJnBBc3NvYy0+a2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBGWF9GcmVlKG1fcEhhc2hUYWJsZSk7Ci0gICAgICAgIG1fcEhhc2hUYWJsZSA9IE5VTEw7Ci0gICAgfQotICAgIG1fbkNvdW50ID0gMDsKLSAgICBtX3BGcmVlTGlzdCA9IE5VTEw7Ci0gICAgbV9wQmxvY2tzLT5GcmVlRGF0YUNoYWluKCk7Ci0gICAgbV9wQmxvY2tzID0gTlVMTDsKLX0KLUNGWF9NYXBCeXRlU3RyaW5nVG9QdHI6On5DRlhfTWFwQnl0ZVN0cmluZ1RvUHRyKCkKLXsKLSAgICBSZW1vdmVBbGwoKTsKLSAgICBBU1NFUlQobV9uQ291bnQgPT0gMCk7Ci19Ci12b2lkIENGWF9NYXBCeXRlU3RyaW5nVG9QdHI6OkdldE5leHRBc3NvYyhGWF9QT1NJVElPTiYgck5leHRQb3NpdGlvbiwKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHJLZXksIHZvaWQqJiByVmFsdWUpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1fcEhhc2hUYWJsZSAhPSBOVUxMKTsKLSAgICBDQXNzb2MqIHBBc3NvY1JldCA9IChDQXNzb2MqKXJOZXh0UG9zaXRpb247Ci0gICAgQVNTRVJUKHBBc3NvY1JldCAhPSBOVUxMKTsKLSAgICBpZiAocEFzc29jUmV0ID09IChDQXNzb2MqKSAtIDEpIHsKLSAgICAgICAgZm9yIChGWF9EV09SRCBuQnVja2V0ID0gMDsgbkJ1Y2tldCA8IG1fbkhhc2hUYWJsZVNpemU7IG5CdWNrZXQrKykKLSAgICAgICAgICAgIGlmICgocEFzc29jUmV0ID0gbV9wSGFzaFRhYmxlW25CdWNrZXRdKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIEFTU0VSVChwQXNzb2NSZXQgIT0gTlVMTCk7Ci0gICAgfQotICAgIENBc3NvYyogcEFzc29jTmV4dDsKLSAgICBpZiAoKHBBc3NvY05leHQgPSBwQXNzb2NSZXQtPnBOZXh0KSA9PSBOVUxMKSB7Ci0gICAgICAgIGZvciAoRlhfRFdPUkQgbkJ1Y2tldCA9IHBBc3NvY1JldC0+bkhhc2hWYWx1ZSArIDE7Ci0gICAgICAgICAgICAgICAgbkJ1Y2tldCA8IG1fbkhhc2hUYWJsZVNpemU7IG5CdWNrZXQrKykKLSAgICAgICAgICAgIGlmICgocEFzc29jTmV4dCA9IG1fcEhhc2hUYWJsZVtuQnVja2V0XSkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgIH0KLSAgICByTmV4dFBvc2l0aW9uID0gKEZYX1BPU0lUSU9OKSBwQXNzb2NOZXh0OwotICAgIHJLZXkgPSBwQXNzb2NSZXQtPmtleTsKLSAgICByVmFsdWUgPSBwQXNzb2NSZXQtPnZhbHVlOwotfQotRlhfTFBWT0lEIENGWF9NYXBCeXRlU3RyaW5nVG9QdHI6OkdldE5leHRWYWx1ZShGWF9QT1NJVElPTiYgck5leHRQb3NpdGlvbikgY29uc3QKLXsKLSAgICBBU1NFUlQobV9wSGFzaFRhYmxlICE9IE5VTEwpOwotICAgIENBc3NvYyogcEFzc29jUmV0ID0gKENBc3NvYyopck5leHRQb3NpdGlvbjsKLSAgICBBU1NFUlQocEFzc29jUmV0ICE9IE5VTEwpOwotICAgIGlmIChwQXNzb2NSZXQgPT0gKENBc3NvYyopIC0gMSkgewotICAgICAgICBmb3IgKEZYX0RXT1JEIG5CdWNrZXQgPSAwOyBuQnVja2V0IDwgbV9uSGFzaFRhYmxlU2l6ZTsgbkJ1Y2tldCsrKQotICAgICAgICAgICAgaWYgKChwQXNzb2NSZXQgPSBtX3BIYXNoVGFibGVbbkJ1Y2tldF0pICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgQVNTRVJUKHBBc3NvY1JldCAhPSBOVUxMKTsKLSAgICB9Ci0gICAgQ0Fzc29jKiBwQXNzb2NOZXh0OwotICAgIGlmICgocEFzc29jTmV4dCA9IHBBc3NvY1JldC0+cE5leHQpID09IE5VTEwpIHsKLSAgICAgICAgZm9yIChGWF9EV09SRCBuQnVja2V0ID0gcEFzc29jUmV0LT5uSGFzaFZhbHVlICsgMTsKLSAgICAgICAgICAgICAgICBuQnVja2V0IDwgbV9uSGFzaFRhYmxlU2l6ZTsgbkJ1Y2tldCsrKQotICAgICAgICAgICAgaWYgKChwQXNzb2NOZXh0ID0gbV9wSGFzaFRhYmxlW25CdWNrZXRdKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgfQotICAgIHJOZXh0UG9zaXRpb24gPSAoRlhfUE9TSVRJT04pIHBBc3NvY05leHQ7Ci0gICAgcmV0dXJuIHBBc3NvY1JldC0+dmFsdWU7Ci19Ci12b2lkKiYgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cjo6b3BlcmF0b3JbXShGWF9CU1RSIGtleSkKLXsKLSAgICBGWF9EV09SRCBuSGFzaDsKLSAgICBDQXNzb2MqIHBBc3NvYzsKLSAgICBpZiAoKHBBc3NvYyA9IEdldEFzc29jQXQoa2V5LCBuSGFzaCkpID09IE5VTEwpIHsKLSAgICAgICAgaWYgKG1fcEhhc2hUYWJsZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBJbml0SGFzaFRhYmxlKG1fbkhhc2hUYWJsZVNpemUpOwotICAgICAgICB9Ci0gICAgICAgIHBBc3NvYyA9IE5ld0Fzc29jKCk7Ci0gICAgICAgIHBBc3NvYy0+bkhhc2hWYWx1ZSA9IG5IYXNoOwotICAgICAgICBwQXNzb2MtPmtleSA9IGtleTsKLSAgICAgICAgcEFzc29jLT5wTmV4dCA9IG1fcEhhc2hUYWJsZVtuSGFzaF07Ci0gICAgICAgIG1fcEhhc2hUYWJsZVtuSGFzaF0gPSBwQXNzb2M7Ci0gICAgfQotICAgIHJldHVybiBwQXNzb2MtPnZhbHVlOwotfQotQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cjo6Q0Fzc29jKgotQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cjo6TmV3QXNzb2MoKQotewotICAgIGlmIChtX3BGcmVlTGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgIENGWF9QbGV4KiBuZXdCbG9jayA9IENGWF9QbGV4OjpDcmVhdGUobV9wQmxvY2tzLCBtX25CbG9ja1NpemUsIHNpemVvZihDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyOjpDQXNzb2MpKTsKLSAgICAgICAgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cjo6Q0Fzc29jKiBwQXNzb2MgPSAoQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cjo6Q0Fzc29jKiluZXdCbG9jay0+ZGF0YSgpOwotICAgICAgICBwQXNzb2MgKz0gbV9uQmxvY2tTaXplIC0gMTsKLSAgICAgICAgZm9yIChpbnQgaSA9IG1fbkJsb2NrU2l6ZSAtIDE7IGkgPj0gMDsgaS0tLCBwQXNzb2MtLSkgewotICAgICAgICAgICAgcEFzc29jLT5wTmV4dCA9IG1fcEZyZWVMaXN0OwotICAgICAgICAgICAgbV9wRnJlZUxpc3QgPSBwQXNzb2M7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQVNTRVJUKG1fcEZyZWVMaXN0ICE9IE5VTEwpOwotICAgIENGWF9NYXBCeXRlU3RyaW5nVG9QdHI6OkNBc3NvYyogcEFzc29jID0gbV9wRnJlZUxpc3Q7Ci0gICAgbV9wRnJlZUxpc3QgPSBtX3BGcmVlTGlzdC0+cE5leHQ7Ci0gICAgbV9uQ291bnQrKzsKLSAgICBBU1NFUlQobV9uQ291bnQgPiAwKTsKLSAgICBDb25zdHJ1Y3RFbGVtZW50KCZwQXNzb2MtPmtleSk7Ci0gICAgcEFzc29jLT52YWx1ZSA9IDA7Ci0gICAgcmV0dXJuIHBBc3NvYzsKLX0KLXZvaWQgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cjo6RnJlZUFzc29jKENGWF9NYXBCeXRlU3RyaW5nVG9QdHI6OkNBc3NvYyogcEFzc29jKQotewotICAgIERlc3RydWN0RWxlbWVudCgmcEFzc29jLT5rZXkpOwotICAgIHBBc3NvYy0+cE5leHQgPSBtX3BGcmVlTGlzdDsKLSAgICBtX3BGcmVlTGlzdCA9IHBBc3NvYzsKLSAgICBtX25Db3VudC0tOwotICAgIEFTU0VSVChtX25Db3VudCA+PSAwKTsKLSAgICBpZiAobV9uQ291bnQgPT0gMCkgewotICAgICAgICBSZW1vdmVBbGwoKTsKLSAgICB9Ci19Ci1DRlhfTWFwQnl0ZVN0cmluZ1RvUHRyOjpDQXNzb2MqCi1DRlhfTWFwQnl0ZVN0cmluZ1RvUHRyOjpHZXRBc3NvY0F0KEZYX0JTVFIga2V5LCBGWF9EV09SRCYgbkhhc2gpIGNvbnN0Ci17Ci0gICAgbkhhc2ggPSBIYXNoS2V5KGtleSkgJSBtX25IYXNoVGFibGVTaXplOwotICAgIGlmIChtX3BIYXNoVGFibGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ0Fzc29jKiBwQXNzb2M7Ci0gICAgZm9yIChwQXNzb2MgPSBtX3BIYXNoVGFibGVbbkhhc2hdOyBwQXNzb2MgIT0gTlVMTDsgcEFzc29jID0gcEFzc29jLT5wTmV4dCkgewotICAgICAgICBpZiAocEFzc29jLT5rZXkgPT0ga2V5KSB7Ci0gICAgICAgICAgICByZXR1cm4gcEFzc29jOwotICAgICAgICB9Ci0gICAgfQordm9pZCogQ0ZYX01hcFB0clRvUHRyOjpHZXRWYWx1ZUF0KHZvaWQqIGtleSkgY29uc3QgeworICBGWF9EV09SRCBuSGFzaDsKKyAgQ0Fzc29jKiBwQXNzb2MgPSBHZXRBc3NvY0F0KGtleSwgbkhhc2gpOworICBpZiAoIXBBc3NvYykgewogICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBwQXNzb2MtPnZhbHVlOwogfQotRlhfQk9PTCBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyOjpMb29rdXAoRlhfQlNUUiBrZXksIHZvaWQqJiByVmFsdWUpIGNvbnN0Ci17Ci0gICAgRlhfRFdPUkQgbkhhc2g7Ci0gICAgQ0Fzc29jKiBwQXNzb2MgPSBHZXRBc3NvY0F0KGtleSwgbkhhc2gpOwotICAgIGlmIChwQXNzb2MgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Cit2b2lkKiYgQ0ZYX01hcFB0clRvUHRyOjpvcGVyYXRvcltdKHZvaWQqIGtleSkgeworICBGWF9EV09SRCBuSGFzaDsKKyAgQ0Fzc29jKiBwQXNzb2M7CisgIGlmICgocEFzc29jID0gR2V0QXNzb2NBdChrZXksIG5IYXNoKSkgPT0gTlVMTCkgeworICAgIGlmICghbV9wSGFzaFRhYmxlKSB7CisgICAgICBJbml0SGFzaFRhYmxlKG1fbkhhc2hUYWJsZVNpemUpOwogICAgIH0KLSAgICByVmFsdWUgPSBwQXNzb2MtPnZhbHVlOwotICAgIHJldHVybiBUUlVFOworICAgIHBBc3NvYyA9IE5ld0Fzc29jKCk7CisgICAgcEFzc29jLT5rZXkgPSBrZXk7CisgICAgcEFzc29jLT5wTmV4dCA9IG1fcEhhc2hUYWJsZVtuSGFzaF07CisgICAgbV9wSGFzaFRhYmxlW25IYXNoXSA9IHBBc3NvYzsKKyAgfQorICByZXR1cm4gcEFzc29jLT52YWx1ZTsKIH0KLXZvaWQgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cjo6SW5pdEhhc2hUYWJsZSgKLSAgICBGWF9EV09SRCBuSGFzaFNpemUsIEZYX0JPT0wgYkFsbG9jTm93KQotewotICAgIEFTU0VSVChtX25Db3VudCA9PSAwKTsKLSAgICBBU1NFUlQobkhhc2hTaXplID4gMCk7Ci0gICAgaWYgKG1fcEhhc2hUYWJsZSAhPSBOVUxMKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wSGFzaFRhYmxlKTsKLSAgICAgICAgbV9wSGFzaFRhYmxlID0gTlVMTDsKLSAgICB9Ci0gICAgaWYgKGJBbGxvY05vdykgewotICAgICAgICBtX3BIYXNoVGFibGUgPSBGWF9BbGxvYyhDQXNzb2MqLCBuSGFzaFNpemUpOwotICAgIH0KLSAgICBtX25IYXNoVGFibGVTaXplID0gbkhhc2hTaXplOworQ0ZYX01hcFB0clRvUHRyOjpDQXNzb2MqIENGWF9NYXBQdHJUb1B0cjo6R2V0QXNzb2NBdCh2b2lkKiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBuSGFzaCkgY29uc3QgeworICBuSGFzaCA9IEhhc2hLZXkoa2V5KSAlIG1fbkhhc2hUYWJsZVNpemU7CisgIGlmICghbV9wSGFzaFRhYmxlKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ0Fzc29jKiBwQXNzb2M7CisgIGZvciAocEFzc29jID0gbV9wSGFzaFRhYmxlW25IYXNoXTsgcEFzc29jOyBwQXNzb2MgPSBwQXNzb2MtPnBOZXh0KSB7CisgICAgaWYgKHBBc3NvYy0+a2V5ID09IGtleSkKKyAgICAgIHJldHVybiBwQXNzb2M7CisgIH0KKyAgcmV0dXJuIE5VTEw7CiB9Ci1pbmxpbmUgRlhfRFdPUkQgQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cjo6SGFzaEtleShGWF9CU1RSIGtleSkgY29uc3QKLXsKLSAgICBGWF9EV09SRCBuSGFzaCA9IDA7Ci0gICAgaW50IGxlbiA9IGtleS5HZXRMZW5ndGgoKTsKLSAgICBGWF9MUENCWVRFIGJ1ZiA9IGtleS5HZXRQdHIoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSArKykgewotICAgICAgICBuSGFzaCA9IChuSGFzaCA8PCA1KSArIG5IYXNoICsgYnVmW2ldOworQ0ZYX01hcFB0clRvUHRyOjpDQXNzb2MqIENGWF9NYXBQdHJUb1B0cjo6TmV3QXNzb2MoKSB7CisgIGlmICghbV9wRnJlZUxpc3QpIHsKKyAgICBDRlhfUGxleCogbmV3QmxvY2sgPSBDRlhfUGxleDo6Q3JlYXRlKG1fcEJsb2NrcywgbV9uQmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKENGWF9NYXBQdHJUb1B0cjo6Q0Fzc29jKSk7CisgICAgQ0ZYX01hcFB0clRvUHRyOjpDQXNzb2MqIHBBc3NvYyA9CisgICAgICAgIChDRlhfTWFwUHRyVG9QdHI6OkNBc3NvYyopbmV3QmxvY2stPmRhdGEoKTsKKyAgICBwQXNzb2MgKz0gbV9uQmxvY2tTaXplIC0gMTsKKyAgICBmb3IgKGludCBpID0gbV9uQmxvY2tTaXplIC0gMTsgaSA+PSAwOyBpLS0sIHBBc3NvYy0tKSB7CisgICAgICBwQXNzb2MtPnBOZXh0ID0gbV9wRnJlZUxpc3Q7CisgICAgICBtX3BGcmVlTGlzdCA9IHBBc3NvYzsKICAgICB9Ci0gICAgcmV0dXJuIG5IYXNoOworICB9CisgIENGWF9NYXBQdHJUb1B0cjo6Q0Fzc29jKiBwQXNzb2MgPSBtX3BGcmVlTGlzdDsKKyAgbV9wRnJlZUxpc3QgPSBtX3BGcmVlTGlzdC0+cE5leHQ7CisgIG1fbkNvdW50Kys7CisgIEFTU0VSVChtX25Db3VudCA+IDApOworICBwQXNzb2MtPmtleSA9IDA7CisgIHBBc3NvYy0+dmFsdWUgPSAwOworICByZXR1cm4gcEFzc29jOwogfQotRlhfQk9PTCBDRlhfTWFwQnl0ZVN0cmluZ1RvUHRyOjpSZW1vdmVLZXkoRlhfQlNUUiBrZXkpCi17Ci0gICAgaWYgKG1fcEhhc2hUYWJsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ0Fzc29jKiogcHBBc3NvY1ByZXY7Ci0gICAgcHBBc3NvY1ByZXYgPSAmbV9wSGFzaFRhYmxlW0hhc2hLZXkoa2V5KSAlIG1fbkhhc2hUYWJsZVNpemVdOwotICAgIENBc3NvYyogcEFzc29jOwotICAgIGZvciAocEFzc29jID0gKnBwQXNzb2NQcmV2OyBwQXNzb2MgIT0gTlVMTDsgcEFzc29jID0gcEFzc29jLT5wTmV4dCkgewotICAgICAgICBpZiAocEFzc29jLT5rZXkgPT0ga2V5KSB7Ci0gICAgICAgICAgICAqcHBBc3NvY1ByZXYgPSBwQXNzb2MtPnBOZXh0OwotICAgICAgICAgICAgRnJlZUFzc29jKHBBc3NvYyk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBwcEFzc29jUHJldiA9ICZwQXNzb2MtPnBOZXh0OwotICAgIH0KK3ZvaWQgQ0ZYX01hcFB0clRvUHRyOjpJbml0SGFzaFRhYmxlKEZYX0RXT1JEIG5IYXNoU2l6ZSwgRlhfQk9PTCBiQWxsb2NOb3cpIHsKKyAgQVNTRVJUKG1fbkNvdW50ID09IDApOworICBBU1NFUlQobkhhc2hTaXplID4gMCk7CisgIEZYX0ZyZWUobV9wSGFzaFRhYmxlKTsKKyAgbV9wSGFzaFRhYmxlID0gTlVMTDsKKyAgaWYgKGJBbGxvY05vdykgeworICAgIG1fcEhhc2hUYWJsZSA9IEZYX0FsbG9jKENBc3NvYyosIG5IYXNoU2l6ZSk7CisgIH0KKyAgbV9uSGFzaFRhYmxlU2l6ZSA9IG5IYXNoU2l6ZTsKK30KK0ZYX0JPT0wgQ0ZYX01hcFB0clRvUHRyOjpSZW1vdmVLZXkodm9pZCoga2V5KSB7CisgIGlmICghbV9wSGFzaFRhYmxlKSB7CiAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENBc3NvYyoqIHBwQXNzb2NQcmV2OworICBwcEFzc29jUHJldiA9ICZtX3BIYXNoVGFibGVbSGFzaEtleShrZXkpICUgbV9uSGFzaFRhYmxlU2l6ZV07CisgIENBc3NvYyogcEFzc29jOworICBmb3IgKHBBc3NvYyA9ICpwcEFzc29jUHJldjsgcEFzc29jOyBwQXNzb2MgPSBwQXNzb2MtPnBOZXh0KSB7CisgICAgaWYgKHBBc3NvYy0+a2V5ID09IGtleSkgeworICAgICAgKnBwQXNzb2NQcmV2ID0gcEFzc29jLT5wTmV4dDsKKyAgICAgIEZyZWVBc3NvYyhwQXNzb2MpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHBwQXNzb2NQcmV2ID0gJnBBc3NvYy0+cE5leHQ7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQordm9pZCBDRlhfTWFwUHRyVG9QdHI6OkZyZWVBc3NvYyhDRlhfTWFwUHRyVG9QdHI6OkNBc3NvYyogcEFzc29jKSB7CisgIHBBc3NvYy0+cE5leHQgPSBtX3BGcmVlTGlzdDsKKyAgbV9wRnJlZUxpc3QgPSBwQXNzb2M7CisgIG1fbkNvdW50LS07CisgIEFTU0VSVChtX25Db3VudCA+PSAwKTsKKyAgaWYgKG1fbkNvdW50ID09IDApIHsKKyAgICBSZW1vdmVBbGwoKTsKKyAgfQogfQogc3RydWN0IF9Db21wYWN0U3RyaW5nIHsKLSAgICBGWF9CWVRFCQltX0NvbXBhY3RMZW47Ci0gICAgRlhfQllURQkJbV9MZW5IaWdoOwotICAgIEZYX0JZVEUJCW1fTGVuTG93OwotICAgIEZYX0JZVEUJCW1fVW51c2VkOwotICAgIEZYX0xQQllURQltX3BCdWZmZXI7CisgIHVpbnQ4X3QgbV9Db21wYWN0TGVuOworICB1aW50OF90IG1fTGVuSGlnaDsKKyAgdWludDhfdCBtX0xlbkxvdzsKKyAgdWludDhfdCBtX1VudXNlZDsKKyAgdWludDhfdCogbV9wQnVmZmVyOwogfTsKLXN0YXRpYyB2b2lkIF9Db21wYWN0U3RyaW5nUmVsZWFzZShfQ29tcGFjdFN0cmluZyogcENvbXBhY3QpCi17Ci0gICAgaWYgKHBDb21wYWN0LT5tX0NvbXBhY3RMZW4gPT0gMHhmZikgewotICAgICAgICBGWF9GcmVlKHBDb21wYWN0LT5tX3BCdWZmZXIpOwotICAgIH0KK3N0YXRpYyB2b2lkIF9Db21wYWN0U3RyaW5nUmVsZWFzZShfQ29tcGFjdFN0cmluZyogcENvbXBhY3QpIHsKKyAgaWYgKHBDb21wYWN0LT5tX0NvbXBhY3RMZW4gPT0ga0hhc0FsbG9jYXRlZEJ1ZmZlckxlbmd0aCkgeworICAgIEZYX0ZyZWUocENvbXBhY3QtPm1fcEJ1ZmZlcik7CisgIH0KIH0KLXN0YXRpYyBGWF9CT09MIF9Db21wYWN0U3RyaW5nU2FtZShfQ29tcGFjdFN0cmluZyogcENvbXBhY3QsIEZYX0xQQ0JZVEUgcFN0ciwgaW50IGxlbikKLXsKLSAgICBpZiAobGVuIDwgc2l6ZW9mKF9Db21wYWN0U3RyaW5nKSkgewotICAgICAgICBpZiAocENvbXBhY3QtPm1fQ29tcGFjdExlbiAhPSBsZW4pIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRlhTWVNfbWVtY21wMzIoJnBDb21wYWN0LT5tX0xlbkhpZ2gsIHBTdHIsIGxlbikgPT0gMDsKK3N0YXRpYyBGWF9CT09MIF9Db21wYWN0U3RyaW5nU2FtZShfQ29tcGFjdFN0cmluZyogcENvbXBhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKSB7CisgIGlmIChsZW4gPCBzaXplb2YoX0NvbXBhY3RTdHJpbmcpKSB7CisgICAgaWYgKHBDb21wYWN0LT5tX0NvbXBhY3RMZW4gIT0gbGVuKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIGlmIChwQ29tcGFjdC0+bV9Db21wYWN0TGVuICE9IDB4ZmYgfHwgcENvbXBhY3QtPm1fTGVuSGlnaCAqIDI1NiArIHBDb21wYWN0LT5tX0xlbkxvdyAhPSBsZW4pIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gRlhTWVNfbWVtY21wMzIocENvbXBhY3QtPm1fcEJ1ZmZlciwgcFN0ciwgbGVuKSA9PSAwOworICAgIHJldHVybiBGWFNZU19tZW1jbXAoJnBDb21wYWN0LT5tX0xlbkhpZ2gsIHBTdHIsIGxlbikgPT0gMDsKKyAgfQorICBpZiAocENvbXBhY3QtPm1fQ29tcGFjdExlbiAhPSBrSGFzQWxsb2NhdGVkQnVmZmVyTGVuZ3RoIHx8CisgICAgICBwQ29tcGFjdC0+bV9MZW5IaWdoICogMjU2ICsgcENvbXBhY3QtPm1fTGVuTG93ICE9IGxlbikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gRlhTWVNfbWVtY21wKHBDb21wYWN0LT5tX3BCdWZmZXIsIHBTdHIsIGxlbikgPT0gMDsKIH0KLXN0YXRpYyB2b2lkIF9Db21wYWN0U3RyaW5nU3RvcmUoX0NvbXBhY3RTdHJpbmcqIHBDb21wYWN0LCBGWF9MUENCWVRFIHBTdHIsIGludCBsZW4pCi17Ci0gICAgaWYgKGxlbiA8IChpbnQpc2l6ZW9mKF9Db21wYWN0U3RyaW5nKSkgewotICAgICAgICBwQ29tcGFjdC0+bV9Db21wYWN0TGVuID0gKEZYX0JZVEUpbGVuOwotICAgICAgICBGWFNZU19tZW1jcHkzMigmcENvbXBhY3QtPm1fTGVuSGlnaCwgcFN0ciwgbGVuKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwQ29tcGFjdC0+bV9Db21wYWN0TGVuID0gMHhmZjsKLSAgICBwQ29tcGFjdC0+bV9MZW5IaWdoID0gbGVuIC8gMjU2OwotICAgIHBDb21wYWN0LT5tX0xlbkxvdyA9IGxlbiAlIDI1NjsKLSAgICBwQ29tcGFjdC0+bV9wQnVmZmVyID0gRlhfQWxsb2MoRlhfQllURSwgbGVuKTsKLSAgICBGWFNZU19tZW1jcHkzMihwQ29tcGFjdC0+bV9wQnVmZmVyLCBwU3RyLCBsZW4pOworc3RhdGljIHZvaWQgX0NvbXBhY3RTdHJpbmdTdG9yZShfQ29tcGFjdFN0cmluZyogcENvbXBhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pIHsKKyAgaWYgKGxlbiA8IChpbnQpc2l6ZW9mKF9Db21wYWN0U3RyaW5nKSkgeworICAgIHBDb21wYWN0LT5tX0NvbXBhY3RMZW4gPSAodWludDhfdClsZW47CisgICAgRlhTWVNfbWVtY3B5KCZwQ29tcGFjdC0+bV9MZW5IaWdoLCBwU3RyLCBsZW4pOworICAgIHJldHVybjsKKyAgfQorICBwQ29tcGFjdC0+bV9Db21wYWN0TGVuID0ga0hhc0FsbG9jYXRlZEJ1ZmZlckxlbmd0aDsKKyAgcENvbXBhY3QtPm1fTGVuSGlnaCA9IGxlbiAvIDI1NjsKKyAgcENvbXBhY3QtPm1fTGVuTG93ID0gbGVuICUgMjU2OworICBwQ29tcGFjdC0+bV9wQnVmZmVyID0gRlhfQWxsb2ModWludDhfdCwgbGVuKTsKKyAgRlhTWVNfbWVtY3B5KHBDb21wYWN0LT5tX3BCdWZmZXIsIHBTdHIsIGxlbik7CiB9Ci1zdGF0aWMgQ0ZYX0J5dGVTdHJpbmdDIF9Db21wYWN0U3RyaW5nR2V0KF9Db21wYWN0U3RyaW5nKiBwQ29tcGFjdCkKLXsKLSAgICBpZiAocENvbXBhY3QtPm1fQ29tcGFjdExlbiA9PSAweGZmKSB7Ci0gICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MocENvbXBhY3QtPm1fcEJ1ZmZlciwgcENvbXBhY3QtPm1fTGVuSGlnaCAqIDI1NiArIHBDb21wYWN0LT5tX0xlbkxvdyk7Ci0gICAgfQotICAgIGlmIChwQ29tcGFjdC0+bV9Db21wYWN0TGVuID09IDB4ZmUpIHsKLSAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQygpOwotICAgIH0KLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKCZwQ29tcGFjdC0+bV9MZW5IaWdoLCBwQ29tcGFjdC0+bV9Db21wYWN0TGVuKTsKK3N0YXRpYyBDRlhfQnl0ZVN0cmluZ0MgX0NvbXBhY3RTdHJpbmdHZXQoX0NvbXBhY3RTdHJpbmcqIHBDb21wYWN0KSB7CisgIGlmIChwQ29tcGFjdC0+bV9Db21wYWN0TGVuID09IGtIYXNBbGxvY2F0ZWRCdWZmZXJMZW5ndGgpIHsKKyAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKHBDb21wYWN0LT5tX3BCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tcGFjdC0+bV9MZW5IaWdoICogMjU2ICsgcENvbXBhY3QtPm1fTGVuTG93KTsKKyAgfQorICBpZiAocENvbXBhY3QtPm1fQ29tcGFjdExlbiA9PSBrRnJlZUxlbmd0aCkgeworICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZ0MoKTsKKyAgfQorICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKCZwQ29tcGFjdC0+bV9MZW5IaWdoLCBwQ29tcGFjdC0+bV9Db21wYWN0TGVuKTsKIH0KLSNkZWZpbmUgQ01BUF9BTExPQ19TVEVQCQk4Ci0jZGVmaW5lIENNQVBfSU5ERVhfU0laRQkJOAorI2RlZmluZSBDTUFQX0FMTE9DX1NURVAgOAorI2RlZmluZSBDTUFQX0lOREVYX1NJWkUgOAogQ0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHI6OkNGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyKCkKLSAgICA6IG1fQnVmZmVyKHNpemVvZihfQ29tcGFjdFN0cmluZykgKyBzaXplb2Yodm9pZCopLCBDTUFQX0FMTE9DX1NURVAsIENNQVBfSU5ERVhfU0laRSkKLXsKKyAgICA6IG1fQnVmZmVyKHNpemVvZihfQ29tcGFjdFN0cmluZykgKyBzaXplb2Yodm9pZCopLAorICAgICAgICAgICAgICAgQ01BUF9BTExPQ19TVEVQLAorICAgICAgICAgICAgICAgQ01BUF9JTkRFWF9TSVpFKSB7fQorQ0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHI6On5DRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cigpIHsKKyAgUmVtb3ZlQWxsKCk7CiB9Ci1DRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cjo6fkNGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyKCkKLXsKLSAgICBSZW1vdmVBbGwoKTsKK3ZvaWQgQ0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHI6OlJlbW92ZUFsbCgpIHsKKyAgaW50IHNpemUgPSBtX0J1ZmZlci5HZXRTaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgX0NvbXBhY3RTdHJpbmdSZWxlYXNlKChfQ29tcGFjdFN0cmluZyopbV9CdWZmZXIuR2V0QXQoaSkpOworICB9CisgIG1fQnVmZmVyLlJlbW92ZUFsbCgpOwogfQotdm9pZCBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cjo6UmVtb3ZlQWxsKCkKLXsKLSAgICBpbnQgc2l6ZSA9IG1fQnVmZmVyLkdldFNpemUoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBfQ29tcGFjdFN0cmluZ1JlbGVhc2UoKF9Db21wYWN0U3RyaW5nKiltX0J1ZmZlci5HZXRBdChpKSk7CitGWF9QT1NJVElPTiBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cjo6R2V0U3RhcnRQb3NpdGlvbigpIGNvbnN0IHsKKyAgaW50IHNpemUgPSBtX0J1ZmZlci5HZXRTaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgX0NvbXBhY3RTdHJpbmcqIHBLZXkgPSAoX0NvbXBhY3RTdHJpbmcqKW1fQnVmZmVyLkdldEF0KGkpOworICAgIGlmIChwS2V5LT5tX0NvbXBhY3RMZW4gIT0ga0ZyZWVMZW5ndGgpIHsKKyAgICAgIHJldHVybiAoRlhfUE9TSVRJT04pKHVpbnRwdHJfdCkoaSArIDEpOwogICAgIH0KLSAgICBtX0J1ZmZlci5SZW1vdmVBbGwoKTsKKyAgfQorICByZXR1cm4gTlVMTDsKIH0KLUZYX1BPU0lUSU9OIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyOjpHZXRTdGFydFBvc2l0aW9uKCkgY29uc3QKLXsKLSAgICBpbnQgc2l6ZSA9IG1fQnVmZmVyLkdldFNpemUoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkgKyspIHsKLSAgICAgICAgX0NvbXBhY3RTdHJpbmcqIHBLZXkgPSAoX0NvbXBhY3RTdHJpbmcqKW1fQnVmZmVyLkdldEF0KGkpOwotICAgICAgICBpZiAocEtleS0+bV9Db21wYWN0TGVuICE9IDB4ZmUpIHsKLSAgICAgICAgICAgIHJldHVybiAoRlhfUE9TSVRJT04pKEZYX1VJTlRQVFIpKGkgKyAxKTsKLSAgICAgICAgfQordm9pZCBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cjo6R2V0TmV4dEFzc29jKEZYX1BPU0lUSU9OJiByTmV4dFBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiByVmFsdWUpIGNvbnN0IHsKKyAgaWYgKCFyTmV4dFBvc2l0aW9uKSB7CisgICAgcmV0dXJuOworICB9CisgIGludCBpbmRleCA9IChpbnQpKHVpbnRwdHJfdClyTmV4dFBvc2l0aW9uIC0gMTsKKyAgX0NvbXBhY3RTdHJpbmcqIHBLZXkgPSAoX0NvbXBhY3RTdHJpbmcqKW1fQnVmZmVyLkdldEF0KGluZGV4KTsKKyAgcktleSA9IF9Db21wYWN0U3RyaW5nR2V0KHBLZXkpOworICByVmFsdWUgPSAqKHZvaWQqKikocEtleSArIDEpOworICBpbmRleCsrOworICBpbnQgc2l6ZSA9IG1fQnVmZmVyLkdldFNpemUoKTsKKyAgd2hpbGUgKGluZGV4IDwgc2l6ZSkgeworICAgIHBLZXkgPSAoX0NvbXBhY3RTdHJpbmcqKW1fQnVmZmVyLkdldEF0KGluZGV4KTsKKyAgICBpZiAocEtleS0+bV9Db21wYWN0TGVuICE9IGtGcmVlTGVuZ3RoKSB7CisgICAgICByTmV4dFBvc2l0aW9uID0gKEZYX1BPU0lUSU9OKSh1aW50cHRyX3QpKGluZGV4ICsgMSk7CisgICAgICByZXR1cm47CiAgICAgfQorICAgIGluZGV4Kys7CisgIH0KKyAgck5leHRQb3NpdGlvbiA9IE5VTEw7Cit9Cit2b2lkKiBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cjo6R2V0TmV4dFZhbHVlKEZYX1BPU0lUSU9OJiByTmV4dFBvc2l0aW9uKSBjb25zdCB7CisgIGlmICghck5leHRQb3NpdGlvbikgewogICAgIHJldHVybiBOVUxMOwotfQotdm9pZCBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cjo6R2V0TmV4dEFzc29jKEZYX1BPU0lUSU9OJiByTmV4dFBvc2l0aW9uLCBDRlhfQnl0ZVN0cmluZyYgcktleSwgdm9pZComIHJWYWx1ZSkgY29uc3QKLXsKLSAgICBpZiAock5leHRQb3NpdGlvbiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKKyAgfQorICBpbnQgaW5kZXggPSAoaW50KSh1aW50cHRyX3Qpck5leHRQb3NpdGlvbiAtIDE7CisgIF9Db21wYWN0U3RyaW5nKiBwS2V5ID0gKF9Db21wYWN0U3RyaW5nKiltX0J1ZmZlci5HZXRBdChpbmRleCk7CisgIHZvaWQqIHJWYWx1ZSA9ICoodm9pZCoqKShwS2V5ICsgMSk7CisgIGluZGV4Kys7CisgIGludCBzaXplID0gbV9CdWZmZXIuR2V0U2l6ZSgpOworICB3aGlsZSAoaW5kZXggPCBzaXplKSB7CisgICAgcEtleSA9IChfQ29tcGFjdFN0cmluZyopbV9CdWZmZXIuR2V0QXQoaW5kZXgpOworICAgIGlmIChwS2V5LT5tX0NvbXBhY3RMZW4gIT0ga0ZyZWVMZW5ndGgpIHsKKyAgICAgIHJOZXh0UG9zaXRpb24gPSAoRlhfUE9TSVRJT04pKHVpbnRwdHJfdCkoaW5kZXggKyAxKTsKKyAgICAgIHJldHVybiByVmFsdWU7CiAgICAgfQotICAgIGludCBpbmRleCA9IChpbnQpKEZYX1VJTlRQVFIpck5leHRQb3NpdGlvbiAtIDE7CisgICAgaW5kZXgrKzsKKyAgfQorICByTmV4dFBvc2l0aW9uID0gTlVMTDsKKyAgcmV0dXJuIHJWYWx1ZTsKK30KK0ZYX0JPT0wgX0NNYXBMb29rdXBDYWxsYmFjayh2b2lkKiBwYXJhbSwgdm9pZCogcERhdGEpIHsKKyAgcmV0dXJuICFfQ29tcGFjdFN0cmluZ1NhbWUoKF9Db21wYWN0U3RyaW5nKilwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDRlhfQnl0ZVN0cmluZ0MqKXBhcmFtKS0+R2V0UHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0ZYX0J5dGVTdHJpbmdDKilwYXJhbSktPkdldExlbmd0aCgpKTsKK30KK0ZYX0JPT0wgQ0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHI6Okxvb2t1cChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgclZhbHVlKSBjb25zdCB7CisgIHZvaWQqIHAgPSBtX0J1ZmZlci5JdGVyYXRlKF9DTWFwTG9va3VwQ2FsbGJhY2ssICh2b2lkKikma2V5KTsKKyAgaWYgKCFwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJWYWx1ZSA9ICoodm9pZCoqKSgoX0NvbXBhY3RTdHJpbmcqKXAgKyAxKTsKKyAgcmV0dXJuIFRSVUU7Cit9Cit2b2lkIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyOjpTZXRBdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwgdm9pZCogdmFsdWUpIHsKKyAgQVNTRVJUKHZhbHVlKTsKKyAgaW50IGtleV9sZW4gPSBrZXkuR2V0TGVuZ3RoKCk7CisgIGludCBzaXplID0gbV9CdWZmZXIuR2V0U2l6ZSgpOworICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc2l6ZTsgaW5kZXgrKykgewogICAgIF9Db21wYWN0U3RyaW5nKiBwS2V5ID0gKF9Db21wYWN0U3RyaW5nKiltX0J1ZmZlci5HZXRBdChpbmRleCk7Ci0gICAgcktleSA9IF9Db21wYWN0U3RyaW5nR2V0KHBLZXkpOwotICAgIHJWYWx1ZSA9ICoodm9pZCoqKShwS2V5ICsgMSk7Ci0gICAgaW5kZXggKys7Ci0gICAgaW50IHNpemUgPSBtX0J1ZmZlci5HZXRTaXplKCk7Ci0gICAgd2hpbGUgKGluZGV4IDwgc2l6ZSkgewotICAgICAgICBwS2V5ID0gKF9Db21wYWN0U3RyaW5nKiltX0J1ZmZlci5HZXRBdChpbmRleCk7Ci0gICAgICAgIGlmIChwS2V5LT5tX0NvbXBhY3RMZW4gIT0gMHhmZSkgewotICAgICAgICAgICAgck5leHRQb3NpdGlvbiA9IChGWF9QT1NJVElPTikoRlhfVUlOVFBUUikoaW5kZXggKyAxKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpbmRleCArKzsKKyAgICBpZiAoIV9Db21wYWN0U3RyaW5nU2FtZShwS2V5LCBrZXkuR2V0UHRyKCksIGtleV9sZW4pKSB7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgck5leHRQb3NpdGlvbiA9IE5VTEw7Ci19Ci1GWF9MUFZPSUQgQ0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHI6OkdldE5leHRWYWx1ZShGWF9QT1NJVElPTiYgck5leHRQb3NpdGlvbikgY29uc3QKLXsKLSAgICBpZiAock5leHRQb3NpdGlvbiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpbnQgaW5kZXggPSAoaW50KShGWF9VSU5UUFRSKXJOZXh0UG9zaXRpb24gLSAxOworICAgICoodm9pZCoqKShwS2V5ICsgMSkgPSB2YWx1ZTsKKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHNpemU7IGluZGV4KyspIHsKICAgICBfQ29tcGFjdFN0cmluZyogcEtleSA9IChfQ29tcGFjdFN0cmluZyopbV9CdWZmZXIuR2V0QXQoaW5kZXgpOwotICAgIEZYX0xQVk9JRCByVmFsdWUgPSAqKHZvaWQqKikocEtleSArIDEpOwotICAgIGluZGV4ICsrOwotICAgIGludCBzaXplID0gbV9CdWZmZXIuR2V0U2l6ZSgpOwotICAgIHdoaWxlIChpbmRleCA8IHNpemUpIHsKLSAgICAgICAgcEtleSA9IChfQ29tcGFjdFN0cmluZyopbV9CdWZmZXIuR2V0QXQoaW5kZXgpOwotICAgICAgICBpZiAocEtleS0+bV9Db21wYWN0TGVuICE9IDB4ZmUpIHsKLSAgICAgICAgICAgIHJOZXh0UG9zaXRpb24gPSAoRlhfUE9TSVRJT04pKEZYX1VJTlRQVFIpKGluZGV4ICsgMSk7Ci0gICAgICAgICAgICByZXR1cm4gclZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIGluZGV4ICsrOworICAgIGlmIChwS2V5LT5tX0NvbXBhY3RMZW4gIT0ga0ZyZWVMZW5ndGgpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICByTmV4dFBvc2l0aW9uID0gTlVMTDsKLSAgICByZXR1cm4gclZhbHVlOwotfQotRlhfQk9PTCBfQ01hcExvb2t1cENhbGxiYWNrKHZvaWQqIHBhcmFtLCB2b2lkKiBwRGF0YSkKLXsKLSAgICByZXR1cm4gIV9Db21wYWN0U3RyaW5nU2FtZSgoX0NvbXBhY3RTdHJpbmcqKXBEYXRhLCAoKENGWF9CeXRlU3RyaW5nQyopcGFyYW0pLT5HZXRQdHIoKSwgKChDRlhfQnl0ZVN0cmluZ0MqKXBhcmFtKS0+R2V0TGVuZ3RoKCkpOwotfQotRlhfQk9PTCBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0cjo6TG9va3VwKEZYX0JTVFIga2V5LCB2b2lkKiYgclZhbHVlKSBjb25zdAotewotICAgIHZvaWQqIHAgPSBtX0J1ZmZlci5JdGVyYXRlKF9DTWFwTG9va3VwQ2FsbGJhY2ssICh2b2lkKikma2V5KTsKLSAgICBpZiAoIXApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByVmFsdWUgPSAqKHZvaWQqKikoKF9Db21wYWN0U3RyaW5nKilwICsgMSk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci12b2lkIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyOjpTZXRBdChGWF9CU1RSIGtleSwgdm9pZCogdmFsdWUpCi17Ci0gICAgQVNTRVJUKHZhbHVlICE9IE5VTEwpOwotICAgIGludCBpbmRleCwga2V5X2xlbiA9IGtleS5HZXRMZW5ndGgoKTsKLSAgICBpbnQgc2l6ZSA9IG1fQnVmZmVyLkdldFNpemUoKTsKLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzaXplOyBpbmRleCArKykgewotICAgICAgICBfQ29tcGFjdFN0cmluZyogcEtleSA9IChfQ29tcGFjdFN0cmluZyopbV9CdWZmZXIuR2V0QXQoaW5kZXgpOwotICAgICAgICBpZiAoIV9Db21wYWN0U3RyaW5nU2FtZShwS2V5LCBrZXkuR2V0UHRyKCksIGtleV9sZW4pKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAqKHZvaWQqKikocEtleSArIDEpID0gdmFsdWU7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc2l6ZTsgaW5kZXggKyspIHsKLSAgICAgICAgX0NvbXBhY3RTdHJpbmcqIHBLZXkgPSAoX0NvbXBhY3RTdHJpbmcqKW1fQnVmZmVyLkdldEF0KGluZGV4KTsKLSAgICAgICAgaWYgKHBLZXktPm1fQ29tcGFjdExlbikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgX0NvbXBhY3RTdHJpbmdTdG9yZShwS2V5LCBrZXkuR2V0UHRyKCksIGtleV9sZW4pOwotICAgICAgICAqKHZvaWQqKikocEtleSArIDEpID0gdmFsdWU7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgX0NvbXBhY3RTdHJpbmcqIHBLZXkgPSAoX0NvbXBhY3RTdHJpbmcqKW1fQnVmZmVyLkFkZCgpOwogICAgIF9Db21wYWN0U3RyaW5nU3RvcmUocEtleSwga2V5LkdldFB0cigpLCBrZXlfbGVuKTsKICAgICAqKHZvaWQqKikocEtleSArIDEpID0gdmFsdWU7CisgICAgcmV0dXJuOworICB9CisgIF9Db21wYWN0U3RyaW5nKiBwS2V5ID0gKF9Db21wYWN0U3RyaW5nKiltX0J1ZmZlci5BZGQoKTsKKyAgX0NvbXBhY3RTdHJpbmdTdG9yZShwS2V5LCBrZXkuR2V0UHRyKCksIGtleV9sZW4pOworICAqKHZvaWQqKikocEtleSArIDEpID0gdmFsdWU7CiB9Ci12b2lkIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyOjpBZGRWYWx1ZShGWF9CU1RSIGtleSwgdm9pZCogdmFsdWUpCi17Ci0gICAgQVNTRVJUKHZhbHVlICE9IE5VTEwpOwotICAgIF9Db21wYWN0U3RyaW5nKiBwS2V5ID0gKF9Db21wYWN0U3RyaW5nKiltX0J1ZmZlci5BZGQoKTsKLSAgICBfQ29tcGFjdFN0cmluZ1N0b3JlKHBLZXksIGtleS5HZXRQdHIoKSwga2V5LkdldExlbmd0aCgpKTsKLSAgICAqKHZvaWQqKikocEtleSArIDEpID0gdmFsdWU7Cit2b2lkIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyOjpBZGRWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHZhbHVlKSB7CisgIEFTU0VSVCh2YWx1ZSk7CisgIF9Db21wYWN0U3RyaW5nKiBwS2V5ID0gKF9Db21wYWN0U3RyaW5nKiltX0J1ZmZlci5BZGQoKTsKKyAgX0NvbXBhY3RTdHJpbmdTdG9yZShwS2V5LCBrZXkuR2V0UHRyKCksIGtleS5HZXRMZW5ndGgoKSk7CisgICoodm9pZCoqKShwS2V5ICsgMSkgPSB2YWx1ZTsKIH0KLXZvaWQgQ0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHI6OlJlbW92ZUtleShGWF9CU1RSIGtleSkKLXsKLSAgICBpbnQga2V5X2xlbiA9IGtleS5HZXRMZW5ndGgoKTsKLSAgICBpbnQgc2l6ZSA9IG1fQnVmZmVyLkdldFNpemUoKTsKLSAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc2l6ZTsgaW5kZXgrKykgewotICAgICAgICBfQ29tcGFjdFN0cmluZyogcEtleSA9IChfQ29tcGFjdFN0cmluZyopbV9CdWZmZXIuR2V0QXQoaW5kZXgpOwotICAgICAgICBpZiAoIV9Db21wYWN0U3RyaW5nU2FtZShwS2V5LCBrZXkuR2V0UHRyKCksIGtleV9sZW4pKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBfQ29tcGFjdFN0cmluZ1JlbGVhc2UocEtleSk7Ci0gICAgICAgIHBLZXktPm1fQ29tcGFjdExlbiA9IDB4ZmU7Ci0gICAgICAgIHJldHVybjsKK3ZvaWQgQ0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHI6OlJlbW92ZUtleShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSkgeworICBpbnQga2V5X2xlbiA9IGtleS5HZXRMZW5ndGgoKTsKKyAgaW50IHNpemUgPSBtX0J1ZmZlci5HZXRTaXplKCk7CisgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzaXplOyBpbmRleCsrKSB7CisgICAgX0NvbXBhY3RTdHJpbmcqIHBLZXkgPSAoX0NvbXBhY3RTdHJpbmcqKW1fQnVmZmVyLkdldEF0KGluZGV4KTsKKyAgICBpZiAoIV9Db21wYWN0U3RyaW5nU2FtZShwS2V5LCBrZXkuR2V0UHRyKCksIGtleV9sZW4pKSB7CisgICAgICBjb250aW51ZTsKICAgICB9CisgICAgX0NvbXBhY3RTdHJpbmdSZWxlYXNlKHBLZXkpOworICAgIHBLZXktPm1fQ29tcGFjdExlbiA9IGtGcmVlTGVuZ3RoOworICAgIHJldHVybjsKKyAgfQogfQotaW50IENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyOjpHZXRDb3VudCgpIGNvbnN0Ci17Ci0gICAgaW50IGNvdW50ID0gMDsKLSAgICBpbnQgc2l6ZSA9IG1fQnVmZmVyLkdldFNpemUoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkgKyspIHsKLSAgICAgICAgX0NvbXBhY3RTdHJpbmcqIHBLZXkgPSAoX0NvbXBhY3RTdHJpbmcqKW1fQnVmZmVyLkdldEF0KGkpOwotICAgICAgICBpZiAocEtleS0+bV9Db21wYWN0TGVuICE9IDB4ZmUpIHsKLSAgICAgICAgICAgIGNvdW50ICsrOwotICAgICAgICB9CitpbnQgQ0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHI6OkdldENvdW50KCkgY29uc3QgeworICBpbnQgY291bnQgPSAwOworICBpbnQgc2l6ZSA9IG1fQnVmZmVyLkdldFNpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBfQ29tcGFjdFN0cmluZyogcEtleSA9IChfQ29tcGFjdFN0cmluZyopbV9CdWZmZXIuR2V0QXQoaSk7CisgICAgaWYgKHBLZXktPm1fQ29tcGFjdExlbiAhPSBrRnJlZUxlbmd0aCkgeworICAgICAgY291bnQrKzsKICAgICB9Ci0gICAgcmV0dXJuIGNvdW50OwotfQotZXh0ZXJuICJDIiB7Ci0gICAgc3RhdGljIGludCBfQ29tcGFyZURXb3JkKGNvbnN0IHZvaWQqIHAxLCBjb25zdCB2b2lkKiBwMikKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKihGWF9EV09SRCopcDEpIC0gKCooRlhfRFdPUkQqKXAyKTsKLSAgICB9Ci19Owotc3RydWN0IF9EV29yZFBhaXIgewotICAgIEZYX0RXT1JEIGtleTsKLSAgICBGWF9EV09SRCB2YWx1ZTsKLX07Ci1GWF9CT09MIENGWF9DTWFwRFdvcmRUb0RXb3JkOjpMb29rdXAoRlhfRFdPUkQga2V5LCBGWF9EV09SRCYgdmFsdWUpIGNvbnN0Ci17Ci0gICAgRlhfTFBWT0lEIHBSZXN1bHQgPSBGWFNZU19ic2VhcmNoKCZrZXksIG1fQnVmZmVyLkdldEJ1ZmZlcigpLCBtX0J1ZmZlci5HZXRTaXplKCkgLyBzaXplb2YoX0RXb3JkUGFpciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihfRFdvcmRQYWlyKSwgX0NvbXBhcmVEV29yZCk7Ci0gICAgaWYgKHBSZXN1bHQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHZhbHVlID0gKChGWF9EV09SRCopcFJlc3VsdClbMV07Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9QT1NJVElPTiBDRlhfQ01hcERXb3JkVG9EV29yZDo6R2V0U3RhcnRQb3NpdGlvbigpIGNvbnN0Ci17Ci0gICAgRlhfRFdPUkQgY291bnQgPSBtX0J1ZmZlci5HZXRTaXplKCkgLyBzaXplb2YoX0RXb3JkUGFpcik7Ci0gICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiAoRlhfUE9TSVRJT04pMTsKLX0KLXZvaWQgQ0ZYX0NNYXBEV29yZFRvRFdvcmQ6OkdldE5leHRBc3NvYyhGWF9QT1NJVElPTiYgcG9zLCBGWF9EV09SRCYga2V5LCBGWF9EV09SRCYgdmFsdWUpIGNvbnN0Ci17Ci0gICAgaWYgKHBvcyA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfRFdPUkQgaW5kZXggPSAoKEZYX0RXT1JEKShGWF9VSU5UUFRSKXBvcykgLSAxOwotICAgIEZYX0RXT1JEIGNvdW50ID0gbV9CdWZmZXIuR2V0U2l6ZSgpIC8gc2l6ZW9mKF9EV29yZFBhaXIpOwotICAgIF9EV29yZFBhaXIqIGJ1ZiA9IChfRFdvcmRQYWlyKiltX0J1ZmZlci5HZXRCdWZmZXIoKTsKLSAgICBrZXkgPSBidWZbaW5kZXhdLmtleTsKLSAgICB2YWx1ZSA9IGJ1ZltpbmRleF0udmFsdWU7Ci0gICAgaWYgKGluZGV4ID09IGNvdW50IC0gMSkgewotICAgICAgICBwb3MgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBvcyA9IChGWF9QT1NJVElPTikoKEZYX1VJTlRQVFIpcG9zICsgMSk7Ci0gICAgfQotfQotdm9pZCBDRlhfQ01hcERXb3JkVG9EV29yZDo6U2V0QXQoRlhfRFdPUkQga2V5LCBGWF9EV09SRCB2YWx1ZSkKLXsKLSAgICBGWF9EV09SRCBjb3VudCA9IG1fQnVmZmVyLkdldFNpemUoKSAvIHNpemVvZihfRFdvcmRQYWlyKTsKLSAgICBfRFdvcmRQYWlyKiBidWYgPSAoX0RXb3JkUGFpciopbV9CdWZmZXIuR2V0QnVmZmVyKCk7Ci0gICAgX0RXb3JkUGFpciBwYWlyID0ge2tleSwgdmFsdWV9OwotICAgIGlmIChjb3VudCA9PSAwIHx8IGtleSA+IGJ1Zltjb3VudCAtIDFdLmtleSkgewotICAgICAgICBtX0J1ZmZlci5BcHBlbmRCbG9jaygmcGFpciwgc2l6ZW9mKF9EV29yZFBhaXIpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgbG93ID0gMCwgaGlnaCA9IGNvdW50IC0gMTsKLSAgICB3aGlsZSAobG93IDw9IGhpZ2gpIHsKLSAgICAgICAgaW50IG1pZCA9IChsb3cgKyBoaWdoKSAvIDI7Ci0gICAgICAgIGlmIChidWZbbWlkXS5rZXkgPCBrZXkpIHsKLSAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7Ci0gICAgICAgIH0gZWxzZSBpZiAoYnVmW21pZF0ua2V5ID4ga2V5KSB7Ci0gICAgICAgICAgICBoaWdoID0gbWlkIC0gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1ZlttaWRdLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9CdWZmZXIuSW5zZXJ0QmxvY2sobG93ICogc2l6ZW9mKF9EV29yZFBhaXIpLCAmcGFpciwgc2l6ZW9mKF9EV29yZFBhaXIpKTsKLX0KLXZvaWQgQ0ZYX0NNYXBEV29yZFRvRFdvcmQ6OkVzdGltYXRlU2l6ZShGWF9EV09SRCBzaXplLCBGWF9EV09SRCBncm93X2J5KQotewotICAgIG1fQnVmZmVyLkVzdGltYXRlU2l6ZShzaXplLCBncm93X2J5KTsKKyAgfQorICByZXR1cm4gY291bnQ7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19tZW1tZ3IuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfbWVtbWdyLmNwcAppbmRleCA2M2M2MDlkLi42NjY1ZGY2IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY19tZW1tZ3IuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX21lbW1nci5jcHAKQEAgLTUsNjggKzUsNjMgQEAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpbmNsdWRlIDxzdGRsaWIuaD4gIC8vIEZvciBhYm9ydCgpLgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfbWVtb3J5LmgiCiAKLXZvaWQqCUZYTUVNX0RlZmF1bHRBbGxvYyhzaXplX3QgYnl0ZV9zaXplLCBpbnQgZmxhZ3MpCi17Ci0gICAgcmV0dXJuICh2b2lkKiltYWxsb2MoYnl0ZV9zaXplKTsKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfbWVtb3J5LmgiCisKK3ZvaWQqIEZYTUVNX0RlZmF1bHRBbGxvYyhzaXplX3QgYnl0ZV9zaXplLCBpbnQgZmxhZ3MpIHsKKyAgcmV0dXJuICh2b2lkKiltYWxsb2MoYnl0ZV9zaXplKTsKIH0KLXZvaWQqCUZYTUVNX0RlZmF1bHRSZWFsbG9jKHZvaWQqIHBvaW50ZXIsIHNpemVfdCBuZXdfc2l6ZSwgaW50IGZsYWdzKQotewotICAgIHJldHVybiByZWFsbG9jKHBvaW50ZXIsIG5ld19zaXplKTsKK3ZvaWQqIEZYTUVNX0RlZmF1bHRSZWFsbG9jKHZvaWQqIHBvaW50ZXIsIHNpemVfdCBuZXdfc2l6ZSwgaW50IGZsYWdzKSB7CisgIHJldHVybiByZWFsbG9jKHBvaW50ZXIsIG5ld19zaXplKTsKIH0KLXZvaWQJRlhNRU1fRGVmYXVsdEZyZWUodm9pZCogcG9pbnRlciwgaW50IGZsYWdzKQotewotICAgIGZyZWUocG9pbnRlcik7Cit2b2lkIEZYTUVNX0RlZmF1bHRGcmVlKHZvaWQqIHBvaW50ZXIsIGludCBmbGFncykgeworICBmcmVlKHBvaW50ZXIpOwogfQogCiBORVZFUl9JTkxJTkUgdm9pZCBGWF9PdXRPZk1lbW9yeVRlcm1pbmF0ZSgpIHsKLSAgICAvLyBUZXJtaW1hdGUgY2xlYW5seSBpZiB3ZSBjYW4sIGVsc2UgY3Jhc2ggYXQgYSBzcGVjaWZpYyBhZGRyZXNzICgweGJkKS4KLSAgICBhYm9ydCgpOwotICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCgqKSgpPigweGJkKSgpOworICAvLyBUZXJtaW1hdGUgY2xlYW5seSBpZiB3ZSBjYW4sIGVsc2UgY3Jhc2ggYXQgYSBzcGVjaWZpYyBhZGRyZXNzICgweGJkKS4KKyAgYWJvcnQoKTsKKyAgcmVpbnRlcnByZXRfY2FzdDx2b2lkICgqKSgpPigweGJkKSgpOwogfQogCi1DRlhfR3Jvd09ubHlQb29sOjpDRlhfR3Jvd09ubHlQb29sKHNpemVfdCB0cnVua19zaXplKQotewotICAgIG1fVHJ1bmtTaXplID0gdHJ1bmtfc2l6ZTsKLSAgICBtX3BGaXJzdFRydW5rID0gTlVMTDsKK0NGWF9Hcm93T25seVBvb2w6OkNGWF9Hcm93T25seVBvb2woc2l6ZV90IHRydW5rX3NpemUpIHsKKyAgbV9UcnVua1NpemUgPSB0cnVua19zaXplOworICBtX3BGaXJzdFRydW5rID0gTlVMTDsKIH0KLUNGWF9Hcm93T25seVBvb2w6On5DRlhfR3Jvd09ubHlQb29sKCkKLXsKLSAgICBGcmVlQWxsKCk7CitDRlhfR3Jvd09ubHlQb29sOjp+Q0ZYX0dyb3dPbmx5UG9vbCgpIHsKKyAgRnJlZUFsbCgpOwogfQogc3RydWN0IF9GWF9Hcm93T25seVRydW5rIHsKLSAgICBzaXplX3QJbV9TaXplOwotICAgIHNpemVfdAltX0FsbG9jYXRlZDsKLSAgICBfRlhfR3Jvd09ubHlUcnVuayoJbV9wTmV4dDsKKyAgc2l6ZV90IG1fU2l6ZTsKKyAgc2l6ZV90IG1fQWxsb2NhdGVkOworICBfRlhfR3Jvd09ubHlUcnVuayogbV9wTmV4dDsKIH07Ci12b2lkIENGWF9Hcm93T25seVBvb2w6OkZyZWVBbGwoKQotewotICAgIF9GWF9Hcm93T25seVRydW5rKiBwVHJ1bmsgPSAoX0ZYX0dyb3dPbmx5VHJ1bmsqKW1fcEZpcnN0VHJ1bms7Ci0gICAgd2hpbGUgKHBUcnVuaykgewotICAgICAgICBfRlhfR3Jvd09ubHlUcnVuayogcE5leHQgPSBwVHJ1bmstPm1fcE5leHQ7Ci0gICAgICAgIEZYX0ZyZWUocFRydW5rKTsKLSAgICAgICAgcFRydW5rID0gcE5leHQ7Ci0gICAgfQotICAgIG1fcEZpcnN0VHJ1bmsgPSBOVUxMOwordm9pZCBDRlhfR3Jvd09ubHlQb29sOjpGcmVlQWxsKCkgeworICBfRlhfR3Jvd09ubHlUcnVuayogcFRydW5rID0gKF9GWF9Hcm93T25seVRydW5rKiltX3BGaXJzdFRydW5rOworICB3aGlsZSAocFRydW5rKSB7CisgICAgX0ZYX0dyb3dPbmx5VHJ1bmsqIHBOZXh0ID0gcFRydW5rLT5tX3BOZXh0OworICAgIEZYX0ZyZWUocFRydW5rKTsKKyAgICBwVHJ1bmsgPSBwTmV4dDsKKyAgfQorICBtX3BGaXJzdFRydW5rID0gTlVMTDsKIH0KLXZvaWQqIENGWF9Hcm93T25seVBvb2w6OkFsbG9jKHNpemVfdCBzaXplKQotewotICAgIHNpemUgPSAoc2l6ZSArIDMpIC8gNCAqIDQ7Ci0gICAgX0ZYX0dyb3dPbmx5VHJ1bmsqIHBUcnVuayA9IChfRlhfR3Jvd09ubHlUcnVuayopbV9wRmlyc3RUcnVuazsKLSAgICB3aGlsZSAocFRydW5rKSB7Ci0gICAgICAgIGlmIChwVHJ1bmstPm1fU2l6ZSAtIHBUcnVuay0+bV9BbGxvY2F0ZWQgPj0gc2l6ZSkgewotICAgICAgICAgICAgdm9pZCogcCA9IChGWF9MUEJZVEUpKHBUcnVuayArIDEpICsgcFRydW5rLT5tX0FsbG9jYXRlZDsKLSAgICAgICAgICAgIHBUcnVuay0+bV9BbGxvY2F0ZWQgKz0gc2l6ZTsKLSAgICAgICAgICAgIHJldHVybiBwOwotICAgICAgICB9Ci0gICAgICAgIHBUcnVuayA9IHBUcnVuay0+bV9wTmV4dDsKK3ZvaWQqIENGWF9Hcm93T25seVBvb2w6OkFsbG9jKHNpemVfdCBzaXplKSB7CisgIHNpemUgPSAoc2l6ZSArIDMpIC8gNCAqIDQ7CisgIF9GWF9Hcm93T25seVRydW5rKiBwVHJ1bmsgPSAoX0ZYX0dyb3dPbmx5VHJ1bmsqKW1fcEZpcnN0VHJ1bms7CisgIHdoaWxlIChwVHJ1bmspIHsKKyAgICBpZiAocFRydW5rLT5tX1NpemUgLSBwVHJ1bmstPm1fQWxsb2NhdGVkID49IHNpemUpIHsKKyAgICAgIHZvaWQqIHAgPSAodWludDhfdCopKHBUcnVuayArIDEpICsgcFRydW5rLT5tX0FsbG9jYXRlZDsKKyAgICAgIHBUcnVuay0+bV9BbGxvY2F0ZWQgKz0gc2l6ZTsKKyAgICAgIHJldHVybiBwOwogICAgIH0KLSAgICBzaXplX3QgYWxsb2Nfc2l6ZSA9IHNpemUgPiBtX1RydW5rU2l6ZSA/IHNpemUgOiBtX1RydW5rU2l6ZTsKLSAgICBwVHJ1bmsgPSAoX0ZYX0dyb3dPbmx5VHJ1bmsqKUZYX0FsbG9jKEZYX0JZVEUsIHNpemVvZihfRlhfR3Jvd09ubHlUcnVuaykgKyBhbGxvY19zaXplKTsKLSAgICBwVHJ1bmstPm1fU2l6ZSA9IGFsbG9jX3NpemU7Ci0gICAgcFRydW5rLT5tX0FsbG9jYXRlZCA9IHNpemU7Ci0gICAgcFRydW5rLT5tX3BOZXh0ID0gKF9GWF9Hcm93T25seVRydW5rKiltX3BGaXJzdFRydW5rOwotICAgIG1fcEZpcnN0VHJ1bmsgPSBwVHJ1bms7Ci0gICAgcmV0dXJuIHBUcnVuayArIDE7CisgICAgcFRydW5rID0gcFRydW5rLT5tX3BOZXh0OworICB9CisgIHNpemVfdCBhbGxvY19zaXplID0gc2l6ZSA+IG1fVHJ1bmtTaXplID8gc2l6ZSA6IG1fVHJ1bmtTaXplOworICBwVHJ1bmsgPSAoX0ZYX0dyb3dPbmx5VHJ1bmsqKUZYX0FsbG9jKHVpbnQ4X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKF9GWF9Hcm93T25seVRydW5rKSArIGFsbG9jX3NpemUpOworICBwVHJ1bmstPm1fU2l6ZSA9IGFsbG9jX3NpemU7CisgIHBUcnVuay0+bV9BbGxvY2F0ZWQgPSBzaXplOworICBwVHJ1bmstPm1fcE5leHQgPSAoX0ZYX0dyb3dPbmx5VHJ1bmsqKW1fcEZpcnN0VHJ1bms7CisgIG1fcEZpcnN0VHJ1bmsgPSBwVHJ1bms7CisgIHJldHVybiBwVHJ1bmsgKyAxOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfbWVtbWdyX3VuaXR0ZXN0LmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX21lbW1ncl91bml0dGVzdC5jcHAKaW5kZXggOTRlMjZjOC4uOTgyMWNhOSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfbWVtbWdyX3VuaXR0ZXN0LmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY19tZW1tZ3JfdW5pdHRlc3QuY3BwCkBAIC00LDggKzQsOCBAQAogCiAjaW5jbHVkZSA8bGltaXRzPgogCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X21lbW9yeS5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfbWVtb3J5LmgiCiAKIG5hbWVzcGFjZSB7CiAKQEAgLTIwLDUyICsyMCw1MSBAQAogLy8gVE9ETyh0c2VwZXopOiByZS1lbmFibGUgT09NIHRlc3RzIGlmIHdlIGNhbiBmaW5kIGEgd2F5IHRvCiAvLyBwcmV2ZW50IGl0IGZyb20gaG9zaW5nIHRoZSBib3RzLgogVEVTVChmeGNydCwgRElTQUJMRURfRlhfQWxsb2NPT00pIHsKLSAgICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKCh2b2lkKSBGWF9BbGxvYyhpbnQsIGtNYXhJbnRBbGxvYyksICIiKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgodm9pZClGWF9BbGxvYyhpbnQsIGtNYXhJbnRBbGxvYyksICIiKTsKIAotICAgIGludCogcHRyID0gRlhfQWxsb2MoaW50LCAxKTsKLSAgICBFWFBFQ1RfVFJVRShwdHIpOwotICAgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoKHZvaWQpIEZYX1JlYWxsb2MoaW50LCBwdHIsIGtNYXhJbnRBbGxvYyksICIiKTsKLSAgICBGWF9GcmVlKHB0cik7CisgIGludCogcHRyID0gRlhfQWxsb2MoaW50LCAxKTsKKyAgRVhQRUNUX1RSVUUocHRyKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgodm9pZClGWF9SZWFsbG9jKGludCwgcHRyLCBrTWF4SW50QWxsb2MpLCAiIik7CisgIEZYX0ZyZWUocHRyKTsKIH0KIAogVEVTVChmeGNydCwgRlhfQWxsb2NPdmVyZmxvdykgewotICAgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoKHZvaWQpIEZYX0FsbG9jKGludCwga092ZXJmbG93SW50QWxsb2MpLCAiIik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoKHZvaWQpRlhfQWxsb2MoaW50LCBrT3ZlcmZsb3dJbnRBbGxvYyksICIiKTsKIAotICAgIGludCogcHRyID0gRlhfQWxsb2MoaW50LCAxKTsKLSAgICBFWFBFQ1RfVFJVRShwdHIpOwotICAgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoCi0gICAgICAgICh2b2lkKSBGWF9SZWFsbG9jKGludCwgcHRyLCBrT3ZlcmZsb3dJbnRBbGxvYyksICIiKTsKLSAgICBGWF9GcmVlKHB0cik7CisgIGludCogcHRyID0gRlhfQWxsb2MoaW50LCAxKTsKKyAgRVhQRUNUX1RSVUUocHRyKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgodm9pZClGWF9SZWFsbG9jKGludCwgcHRyLCBrT3ZlcmZsb3dJbnRBbGxvYyksICIiKTsKKyAgRlhfRnJlZShwdHIpOwogfQogCiBURVNUKGZ4Y3J0LCBGWF9BbGxvY092ZXJmbG93MkQpIHsKLSAgICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKAotICAgICAgICAodm9pZCkgRlhfQWxsb2MyRChpbnQsIGtXaWR0aCwga092ZXJmbG93SW50QWxsb2MyRCksICIiKTsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgodm9pZClGWF9BbGxvYzJEKGludCwga1dpZHRoLCBrT3ZlcmZsb3dJbnRBbGxvYzJEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIik7CiB9CiAKIFRFU1QoZnhjcnQsIERJU0FCTEVEX0ZYX1RyeUFsbG9jT09NKSB7Ci0gICAgRVhQRUNUX0ZBTFNFKEZYX1RyeUFsbG9jKGludCwga01heEludEFsbG9jKSk7CisgIEVYUEVDVF9GQUxTRShGWF9UcnlBbGxvYyhpbnQsIGtNYXhJbnRBbGxvYykpOwogCi0gICAgaW50KiBwdHIgPSBGWF9BbGxvYyhpbnQsIDEpOwotICAgIEVYUEVDVF9UUlVFKHB0cik7Ci0gICAgRVhQRUNUX0ZBTFNFKEZYX1RyeVJlYWxsb2MoaW50LCBwdHIsIGtNYXhJbnRBbGxvYykpOwotICAgIEZYX0ZyZWUocHRyKTsKKyAgaW50KiBwdHIgPSBGWF9BbGxvYyhpbnQsIDEpOworICBFWFBFQ1RfVFJVRShwdHIpOworICBFWFBFQ1RfRkFMU0UoRlhfVHJ5UmVhbGxvYyhpbnQsIHB0ciwga01heEludEFsbG9jKSk7CisgIEZYX0ZyZWUocHRyKTsKIH0KIAogVEVTVChmeGNydCwgRlhfVHJ5QWxsb2NPdmVyZmxvdykgewotICAgIEVYUEVDVF9GQUxTRShGWF9UcnlBbGxvYyhpbnQsIGtPdmVyZmxvd0ludEFsbG9jKSk7CisgIEVYUEVDVF9GQUxTRShGWF9UcnlBbGxvYyhpbnQsIGtPdmVyZmxvd0ludEFsbG9jKSk7CiAKLSAgICBpbnQqIHB0ciA9IEZYX0FsbG9jKGludCwgMSk7Ci0gICAgRVhQRUNUX1RSVUUocHRyKTsKLSAgICBFWFBFQ1RfRkFMU0UoRlhfVHJ5UmVhbGxvYyhpbnQsIHB0ciwga092ZXJmbG93SW50QWxsb2MpKTsKLSAgICBGWF9GcmVlKHB0cik7CisgIGludCogcHRyID0gRlhfQWxsb2MoaW50LCAxKTsKKyAgRVhQRUNUX1RSVUUocHRyKTsKKyAgRVhQRUNUX0ZBTFNFKEZYX1RyeVJlYWxsb2MoaW50LCBwdHIsIGtPdmVyZmxvd0ludEFsbG9jKSk7CisgIEZYX0ZyZWUocHRyKTsKIH0KIAogVEVTVChmeGNydCwgRElTQUJMRURfRlhNRU1fRGVmYXVsdE9PTSkgewotICAgIEVYUEVDVF9GQUxTRShGWE1FTV9EZWZhdWx0QWxsb2Moa01heEJ5dGVBbGxvYywgMCkpOworICBFWFBFQ1RfRkFMU0UoRlhNRU1fRGVmYXVsdEFsbG9jKGtNYXhCeXRlQWxsb2MsIDApKTsKIAotICAgIHZvaWQqIHB0ciA9IEZYTUVNX0RlZmF1bHRBbGxvYygxLCAwKTsKLSAgICBFWFBFQ1RfVFJVRShwdHIpOwotICAgIEVYUEVDVF9GQUxTRShGWE1FTV9EZWZhdWx0UmVhbGxvYyhwdHIsIGtNYXhCeXRlQWxsb2MsIDApKTsKLSAgICBGWE1FTV9EZWZhdWx0RnJlZShwdHIsIDApOworICB2b2lkKiBwdHIgPSBGWE1FTV9EZWZhdWx0QWxsb2MoMSwgMCk7CisgIEVYUEVDVF9UUlVFKHB0cik7CisgIEVYUEVDVF9GQUxTRShGWE1FTV9EZWZhdWx0UmVhbGxvYyhwdHIsIGtNYXhCeXRlQWxsb2MsIDApKTsKKyAgRlhNRU1fRGVmYXVsdEZyZWUocHRyLCAwKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3BsZXguY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfcGxleC5jcHAKaW5kZXggNzgzMTliZC4uOTFjYzEzMSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfcGxleC5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfcGxleC5jcHAKQEAgLTQsMjIgKzQsMjMgQEAKIAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfbWVtb3J5LmgiCiAjaW5jbHVkZSAicGxleC5oIgotQ0ZYX1BsZXgqIENGWF9QbGV4OjpDcmVhdGUoQ0ZYX1BsZXgqJiBwSGVhZCwgRlhfRFdPUkQgbk1heCwgRlhfRFdPUkQgY2JFbGVtZW50KQotewotICAgIENGWF9QbGV4KiBwID0gKENGWF9QbGV4KilGWF9BbGxvYyhGWF9CWVRFLCBzaXplb2YoQ0ZYX1BsZXgpICsgbk1heCAqIGNiRWxlbWVudCk7Ci0gICAgcC0+cE5leHQgPSBwSGVhZDsKLSAgICBwSGVhZCA9IHA7Ci0gICAgcmV0dXJuIHA7CisKK0NGWF9QbGV4KiBDRlhfUGxleDo6Q3JlYXRlKENGWF9QbGV4KiYgcEhlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuTWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY2JFbGVtZW50KSB7CisgIENGWF9QbGV4KiBwID0KKyAgICAgIChDRlhfUGxleCopRlhfQWxsb2ModWludDhfdCwgc2l6ZW9mKENGWF9QbGV4KSArIG5NYXggKiBjYkVsZW1lbnQpOworICBwLT5wTmV4dCA9IHBIZWFkOworICBwSGVhZCA9IHA7CisgIHJldHVybiBwOwogfQotdm9pZCBDRlhfUGxleDo6RnJlZURhdGFDaGFpbigpCi17Ci0gICAgQ0ZYX1BsZXgqIHAgPSB0aGlzOwotICAgIHdoaWxlIChwICE9IE5VTEwpIHsKLSAgICAgICAgRlhfQllURSogYnl0ZXMgPSAoRlhfQllURSopcDsKLSAgICAgICAgQ0ZYX1BsZXgqIHBOZXh0ID0gcC0+cE5leHQ7Ci0gICAgICAgIEZYX0ZyZWUoYnl0ZXMpOwotICAgICAgICBwID0gcE5leHQ7Ci0gICAgfQordm9pZCBDRlhfUGxleDo6RnJlZURhdGFDaGFpbigpIHsKKyAgQ0ZYX1BsZXgqIHAgPSB0aGlzOworICB3aGlsZSAocCkgeworICAgIENGWF9QbGV4KiBvbGQgPSBwOworICAgIHAgPSBwLT5wTmV4dDsKKyAgICBGWF9GcmVlKG9sZCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3V0Zi5jcHAgYi9jb3JlL3NyYy9meGNydC9meF9iYXNpY191dGYuY3BwCmluZGV4IGY1MmI4M2UuLjM2MjVmZWIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3V0Zi5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfdXRmLmNwcApAQCAtNCw4NyArNCw4MyBAQAogCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgotdm9pZCBDRlhfVVRGOERlY29kZXI6OkNsZWFyKCkKLXsKLSAgICBtX0J1ZmZlci5DbGVhcigpOworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgorCit2b2lkIENGWF9VVEY4RGVjb2Rlcjo6Q2xlYXIoKSB7CisgIG1fQnVmZmVyLkNsZWFyKCk7CisgIG1fUGVuZGluZ0J5dGVzID0gMDsKK30KK3ZvaWQgQ0ZYX1VURjhEZWNvZGVyOjpBcHBlbmRDaGFyKEZYX0RXT1JEIGNoKSB7CisgIG1fQnVmZmVyLkFwcGVuZENoYXIoKEZYX1dDSEFSKWNoKTsKK30KK3ZvaWQgQ0ZYX1VURjhEZWNvZGVyOjpJbnB1dCh1aW50OF90IGJ5dGUpIHsKKyAgaWYgKGJ5dGUgPCAweDgwKSB7CiAgICAgbV9QZW5kaW5nQnl0ZXMgPSAwOwotfQotdm9pZCBDRlhfVVRGOERlY29kZXI6OkFwcGVuZENoYXIoRlhfRFdPUkQgY2gpCi17Ci0gICAgbV9CdWZmZXIuQXBwZW5kQ2hhcigoRlhfV0NIQVIpY2gpOwotfQotdm9pZCBDRlhfVVRGOERlY29kZXI6OklucHV0KEZYX0JZVEUgYnl0ZSkKLXsKLSAgICBpZiAoYnl0ZSA8IDB4ODApIHsKLSAgICAgICAgbV9QZW5kaW5nQnl0ZXMgPSAwOwotICAgICAgICBtX0J1ZmZlci5BcHBlbmRDaGFyKGJ5dGUpOwotICAgIH0gZWxzZSBpZiAoYnl0ZSA8IDB4YzApIHsKLSAgICAgICAgaWYgKG1fUGVuZGluZ0J5dGVzID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtX1BlbmRpbmdCeXRlcyAtLTsKLSAgICAgICAgbV9QZW5kaW5nQ2hhciB8PSAoYnl0ZSAmIDB4M2YpIDw8IChtX1BlbmRpbmdCeXRlcyAqIDYpOwotICAgICAgICBpZiAobV9QZW5kaW5nQnl0ZXMgPT0gMCkgewotICAgICAgICAgICAgQXBwZW5kQ2hhcihtX1BlbmRpbmdDaGFyKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoYnl0ZSA8IDB4ZTApIHsKLSAgICAgICAgbV9QZW5kaW5nQnl0ZXMgPSAxOwotICAgICAgICBtX1BlbmRpbmdDaGFyID0gKGJ5dGUgJiAweDFmKSA8PCA2OwotICAgIH0gZWxzZSBpZiAoYnl0ZSA8IDB4ZjApIHsKLSAgICAgICAgbV9QZW5kaW5nQnl0ZXMgPSAyOwotICAgICAgICBtX1BlbmRpbmdDaGFyID0gKGJ5dGUgJiAweDBmKSA8PCAxMjsKLSAgICB9IGVsc2UgaWYgKGJ5dGUgPCAweGY4KSB7Ci0gICAgICAgIG1fUGVuZGluZ0J5dGVzID0gMzsKLSAgICAgICAgbV9QZW5kaW5nQ2hhciA9IChieXRlICYgMHgwNykgPDwgMTg7Ci0gICAgfSBlbHNlIGlmIChieXRlIDwgMHhmYykgewotICAgICAgICBtX1BlbmRpbmdCeXRlcyA9IDQ7Ci0gICAgICAgIG1fUGVuZGluZ0NoYXIgPSAoYnl0ZSAmIDB4MDMpIDw8IDI0OwotICAgIH0gZWxzZSBpZiAoYnl0ZSA8IDB4ZmUpIHsKLSAgICAgICAgbV9QZW5kaW5nQnl0ZXMgPSA1OwotICAgICAgICBtX1BlbmRpbmdDaGFyID0gKGJ5dGUgJiAweDAxKSA8PCAzMDsKKyAgICBtX0J1ZmZlci5BcHBlbmRDaGFyKGJ5dGUpOworICB9IGVsc2UgaWYgKGJ5dGUgPCAweGMwKSB7CisgICAgaWYgKG1fUGVuZGluZ0J5dGVzID09IDApIHsKKyAgICAgIHJldHVybjsKICAgICB9CisgICAgbV9QZW5kaW5nQnl0ZXMtLTsKKyAgICBtX1BlbmRpbmdDaGFyIHw9IChieXRlICYgMHgzZikgPDwgKG1fUGVuZGluZ0J5dGVzICogNik7CisgICAgaWYgKG1fUGVuZGluZ0J5dGVzID09IDApIHsKKyAgICAgIEFwcGVuZENoYXIobV9QZW5kaW5nQ2hhcik7CisgICAgfQorICB9IGVsc2UgaWYgKGJ5dGUgPCAweGUwKSB7CisgICAgbV9QZW5kaW5nQnl0ZXMgPSAxOworICAgIG1fUGVuZGluZ0NoYXIgPSAoYnl0ZSAmIDB4MWYpIDw8IDY7CisgIH0gZWxzZSBpZiAoYnl0ZSA8IDB4ZjApIHsKKyAgICBtX1BlbmRpbmdCeXRlcyA9IDI7CisgICAgbV9QZW5kaW5nQ2hhciA9IChieXRlICYgMHgwZikgPDwgMTI7CisgIH0gZWxzZSBpZiAoYnl0ZSA8IDB4ZjgpIHsKKyAgICBtX1BlbmRpbmdCeXRlcyA9IDM7CisgICAgbV9QZW5kaW5nQ2hhciA9IChieXRlICYgMHgwNykgPDwgMTg7CisgIH0gZWxzZSBpZiAoYnl0ZSA8IDB4ZmMpIHsKKyAgICBtX1BlbmRpbmdCeXRlcyA9IDQ7CisgICAgbV9QZW5kaW5nQ2hhciA9IChieXRlICYgMHgwMykgPDwgMjQ7CisgIH0gZWxzZSBpZiAoYnl0ZSA8IDB4ZmUpIHsKKyAgICBtX1BlbmRpbmdCeXRlcyA9IDU7CisgICAgbV9QZW5kaW5nQ2hhciA9IChieXRlICYgMHgwMSkgPDwgMzA7CisgIH0KIH0KLXZvaWQgQ0ZYX1VURjhFbmNvZGVyOjpJbnB1dChGWF9XQ0hBUiB1bmljb2RlKQotewotICAgIGlmICgoRlhfRFdPUkQpdW5pY29kZSA8IDB4ODApIHsKLSAgICAgICAgbV9CdWZmZXIuQXBwZW5kQ2hhcih1bmljb2RlKTsKK3ZvaWQgQ0ZYX1VURjhFbmNvZGVyOjpJbnB1dChGWF9XQ0hBUiB1bmljb2RlKSB7CisgIGlmICgoRlhfRFdPUkQpdW5pY29kZSA8IDB4ODApIHsKKyAgICBtX0J1ZmZlci5BcHBlbmRDaGFyKHVuaWNvZGUpOworICB9IGVsc2UgeworICAgIGlmICgoRlhfRFdPUkQpdW5pY29kZSA+PSAweDgwMDAwMDAwKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGludCBuYnl0ZXMgPSAwOworICAgIGlmICgoRlhfRFdPUkQpdW5pY29kZSA8IDB4ODAwKSB7CisgICAgICBuYnl0ZXMgPSAyOworICAgIH0gZWxzZSBpZiAoKEZYX0RXT1JEKXVuaWNvZGUgPCAweDEwMDAwKSB7CisgICAgICBuYnl0ZXMgPSAzOworICAgIH0gZWxzZSBpZiAoKEZYX0RXT1JEKXVuaWNvZGUgPCAweDIwMDAwMCkgeworICAgICAgbmJ5dGVzID0gNDsKKyAgICB9IGVsc2UgaWYgKChGWF9EV09SRCl1bmljb2RlIDwgMHg0MDAwMDAwKSB7CisgICAgICBuYnl0ZXMgPSA1OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICgoRlhfRFdPUkQpdW5pY29kZSA+PSAweDgwMDAwMDAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW50IG5ieXRlcyA9IDA7Ci0gICAgICAgIGlmICgoRlhfRFdPUkQpdW5pY29kZSA8IDB4ODAwKSB7Ci0gICAgICAgICAgICBuYnl0ZXMgPSAyOwotICAgICAgICB9IGVsc2UgaWYgKChGWF9EV09SRCl1bmljb2RlIDwgMHgxMDAwMCkgewotICAgICAgICAgICAgbmJ5dGVzID0gMzsKLSAgICAgICAgfSBlbHNlIGlmICgoRlhfRFdPUkQpdW5pY29kZSA8IDB4MjAwMDAwKSB7Ci0gICAgICAgICAgICBuYnl0ZXMgPSA0OwotICAgICAgICB9IGVsc2UgaWYgKChGWF9EV09SRCl1bmljb2RlIDwgMHg0MDAwMDAwKSB7Ci0gICAgICAgICAgICBuYnl0ZXMgPSA1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmJ5dGVzID0gNjsKLSAgICAgICAgfQotICAgICAgICBzdGF0aWMgRlhfQllURSBwcmVmaXhbXSA9IHsweGMwLCAweGUwLCAweGYwLCAweGY4LCAweGZjfTsKLSAgICAgICAgaW50IG9yZGVyID0gMSA8PCAoKG5ieXRlcyAtIDEpICogNik7Ci0gICAgICAgIGludCBjb2RlID0gdW5pY29kZTsKLSAgICAgICAgbV9CdWZmZXIuQXBwZW5kQ2hhcihwcmVmaXhbbmJ5dGVzIC0gMl0gfCAoY29kZSAvIG9yZGVyKSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmJ5dGVzIC0gMTsgaSArKykgewotICAgICAgICAgICAgY29kZSA9IGNvZGUgJSBvcmRlcjsKLSAgICAgICAgICAgIG9yZGVyID4+PSA2OwotICAgICAgICAgICAgbV9CdWZmZXIuQXBwZW5kQ2hhcigweDgwIHwgKGNvZGUgLyBvcmRlcikpOwotICAgICAgICB9CisgICAgICBuYnl0ZXMgPSA2OwogICAgIH0KKyAgICBzdGF0aWMgdWludDhfdCBwcmVmaXhbXSA9IHsweGMwLCAweGUwLCAweGYwLCAweGY4LCAweGZjfTsKKyAgICBpbnQgb3JkZXIgPSAxIDw8ICgobmJ5dGVzIC0gMSkgKiA2KTsKKyAgICBpbnQgY29kZSA9IHVuaWNvZGU7CisgICAgbV9CdWZmZXIuQXBwZW5kQ2hhcihwcmVmaXhbbmJ5dGVzIC0gMl0gfCAoY29kZSAvIG9yZGVyKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYnl0ZXMgLSAxOyBpKyspIHsKKyAgICAgIGNvZGUgPSBjb2RlICUgb3JkZXI7CisgICAgICBvcmRlciA+Pj0gNjsKKyAgICAgIG1fQnVmZmVyLkFwcGVuZENoYXIoMHg4MCB8IChjb2RlIC8gb3JkZXIpKTsKKyAgICB9CisgIH0KIH0KLUNGWF9CeXRlU3RyaW5nIEZYX1VURjhFbmNvZGUoRlhfTFBDV1NUUiBwd3NTdHIsIEZYX1NUUlNJWkUgbGVuKQotewotICAgIEZYU1lTX2Fzc2VydChwd3NTdHIgIT0gTlVMTCk7Ci0gICAgaWYgKGxlbiA8IDApIHsKLSAgICAgICAgbGVuID0gRlhTWVNfd2NzbGVuKHB3c1N0cik7Ci0gICAgfQotICAgIENGWF9VVEY4RW5jb2RlciBlbmNvZGVyOwotICAgIHdoaWxlIChsZW4gLS0gPiAwKSB7Ci0gICAgICAgIGVuY29kZXIuSW5wdXQoKnB3c1N0ciArKyk7Ci0gICAgfQotICAgIHJldHVybiBlbmNvZGVyLkdldFJlc3VsdCgpOworQ0ZYX0J5dGVTdHJpbmcgRlhfVVRGOEVuY29kZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBGWF9TVFJTSVpFIGxlbikgeworICBGWFNZU19hc3NlcnQocHdzU3RyKTsKKyAgaWYgKGxlbiA8IDApIHsKKyAgICBsZW4gPSBGWFNZU193Y3NsZW4ocHdzU3RyKTsKKyAgfQorICBDRlhfVVRGOEVuY29kZXIgZW5jb2RlcjsKKyAgd2hpbGUgKGxlbi0tID4gMCkgeworICAgIGVuY29kZXIuSW5wdXQoKnB3c1N0cisrKTsKKyAgfQorICByZXR1cm4gZW5jb2Rlci5HZXRSZXN1bHQoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3V0aWwuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfdXRpbC5jcHAKaW5kZXggZmQ0MTE5MS4uOWYzMmViZSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfdXRpbC5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfdXRpbC5jcHAKQEAgLTEsNDk2ICsxLDM3NSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9leHQuaCIKKworI2luY2x1ZGUgPGNjdHlwZT4KKwogI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxkaXJlbnQuaD4KICNlbHNlCiAjaW5jbHVkZSA8ZGlyZWN0Lmg+CiAjZW5kaWYKLUNGWF9Qcml2YXRlRGF0YTo6fkNGWF9Qcml2YXRlRGF0YSgpCi17Ci0gICAgQ2xlYXJBbGwoKTsKKworQ0ZYX1ByaXZhdGVEYXRhOjp+Q0ZYX1ByaXZhdGVEYXRhKCkgeworICBDbGVhckFsbCgpOwogfQotdm9pZCBGWF9QUklWQVRFREFUQTo6RnJlZURhdGEoKQotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobV9iU2VsZkRlc3RydWN0KSB7Ci0gICAgICAgIGRlbGV0ZSAoQ0ZYX0Rlc3RydWN0T2JqZWN0KiltX3BEYXRhOwotICAgIH0gZWxzZSBpZiAobV9wQ2FsbGJhY2spIHsKLSAgICAgICAgbV9wQ2FsbGJhY2sobV9wRGF0YSk7Ci0gICAgfQordm9pZCBGWF9QUklWQVRFREFUQTo6RnJlZURhdGEoKSB7CisgIGlmICghbV9wRGF0YSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9iU2VsZkRlc3RydWN0KSB7CisgICAgZGVsZXRlIChDRlhfRGVzdHJ1Y3RPYmplY3QqKW1fcERhdGE7CisgIH0gZWxzZSBpZiAobV9wQ2FsbGJhY2spIHsKKyAgICBtX3BDYWxsYmFjayhtX3BEYXRhKTsKKyAgfQogfQotdm9pZCBDRlhfUHJpdmF0ZURhdGE6OkFkZERhdGEoRlhfTFBWT0lEIHBNb2R1bGVJZCwgRlhfTFBWT0lEIHBEYXRhLCBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjaywgRlhfQk9PTCBiU2VsZkRlc3RydWN0KQotewotICAgIGlmIChwTW9kdWxlSWQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Cit2b2lkIENGWF9Qcml2YXRlRGF0YTo6QWRkRGF0YSh2b2lkKiBwTW9kdWxlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBEX0NBTExCQUNLX0ZSRUVEQVRBIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2VsZkRlc3RydWN0KSB7CisgIGlmICghcE1vZHVsZUlkKSB7CisgICAgcmV0dXJuOworICB9CisgIEZYX1BSSVZBVEVEQVRBKiBwTGlzdCA9IG1fRGF0YUxpc3QuR2V0RGF0YSgpOworICBpbnQgY291bnQgPSBtX0RhdGFMaXN0LkdldFNpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgaWYgKHBMaXN0W2ldLm1fcE1vZHVsZUlkID09IHBNb2R1bGVJZCkgeworICAgICAgcExpc3RbaV0uRnJlZURhdGEoKTsKKyAgICAgIHBMaXN0W2ldLm1fcERhdGEgPSBwRGF0YTsKKyAgICAgIHBMaXN0W2ldLm1fcENhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIEZYX1BSSVZBVEVEQVRBKiBwTGlzdCA9IG1fRGF0YUxpc3QuR2V0RGF0YSgpOwotICAgIGludCBjb3VudCA9IG1fRGF0YUxpc3QuR2V0U2l6ZSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkgKyspIHsKLSAgICAgICAgaWYgKHBMaXN0W2ldLm1fcE1vZHVsZUlkID09IHBNb2R1bGVJZCkgewotICAgICAgICAgICAgcExpc3RbaV0uRnJlZURhdGEoKTsKLSAgICAgICAgICAgIHBMaXN0W2ldLm1fcERhdGEgPSBwRGF0YTsKLSAgICAgICAgICAgIHBMaXN0W2ldLm1fcENhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlhfUFJJVkFURURBVEEgZGF0YSA9IHtwTW9kdWxlSWQsIHBEYXRhLCBjYWxsYmFjaywgYlNlbGZEZXN0cnVjdH07Ci0gICAgbV9EYXRhTGlzdC5BZGQoZGF0YSk7CisgIH0KKyAgRlhfUFJJVkFURURBVEEgZGF0YSA9IHtwTW9kdWxlSWQsIHBEYXRhLCBjYWxsYmFjaywgYlNlbGZEZXN0cnVjdH07CisgIG1fRGF0YUxpc3QuQWRkKGRhdGEpOwogfQotdm9pZCBDRlhfUHJpdmF0ZURhdGE6OlNldFByaXZhdGVEYXRhKEZYX0xQVk9JRCBwTW9kdWxlSWQsIEZYX0xQVk9JRCBwRGF0YSwgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2spCi17Ci0gICAgQWRkRGF0YShwTW9kdWxlSWQsIHBEYXRhLCBjYWxsYmFjaywgRkFMU0UpOwordm9pZCBDRlhfUHJpdmF0ZURhdGE6OlNldFByaXZhdGVEYXRhKHZvaWQqIHBNb2R1bGVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjaykgeworICBBZGREYXRhKHBNb2R1bGVJZCwgcERhdGEsIGNhbGxiYWNrLCBGQUxTRSk7CiB9Ci12b2lkIENGWF9Qcml2YXRlRGF0YTo6U2V0UHJpdmF0ZU9iaihGWF9MUFZPSUQgcE1vZHVsZUlkLCBDRlhfRGVzdHJ1Y3RPYmplY3QqIHBPYmopCi17Ci0gICAgQWRkRGF0YShwTW9kdWxlSWQsIHBPYmosIE5VTEwsIFRSVUUpOwordm9pZCBDRlhfUHJpdmF0ZURhdGE6OlNldFByaXZhdGVPYmoodm9pZCogcE1vZHVsZUlkLCBDRlhfRGVzdHJ1Y3RPYmplY3QqIHBPYmopIHsKKyAgQWRkRGF0YShwTW9kdWxlSWQsIHBPYmosIE5VTEwsIFRSVUUpOwogfQotRlhfQk9PTCBDRlhfUHJpdmF0ZURhdGE6OlJlbW92ZVByaXZhdGVEYXRhKEZYX0xQVk9JRCBwTW9kdWxlSWQpCi17Ci0gICAgaWYgKHBNb2R1bGVJZCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfUFJJVkFURURBVEEqIHBMaXN0ID0gbV9EYXRhTGlzdC5HZXREYXRhKCk7Ci0gICAgaW50IGNvdW50ID0gbV9EYXRhTGlzdC5HZXRTaXplKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgewotICAgICAgICBpZiAocExpc3RbaV0ubV9wTW9kdWxlSWQgPT0gcE1vZHVsZUlkKSB7Ci0gICAgICAgICAgICBtX0RhdGFMaXN0LlJlbW92ZUF0KGkpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICB9CitGWF9CT09MIENGWF9Qcml2YXRlRGF0YTo6UmVtb3ZlUHJpdmF0ZURhdGEodm9pZCogcE1vZHVsZUlkKSB7CisgIGlmICghcE1vZHVsZUlkKSB7CiAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX1BSSVZBVEVEQVRBKiBwTGlzdCA9IG1fRGF0YUxpc3QuR2V0RGF0YSgpOworICBpbnQgY291bnQgPSBtX0RhdGFMaXN0LkdldFNpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgaWYgKHBMaXN0W2ldLm1fcE1vZHVsZUlkID09IHBNb2R1bGVJZCkgeworICAgICAgbV9EYXRhTGlzdC5SZW1vdmVBdChpKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1GWF9MUFZPSUQgQ0ZYX1ByaXZhdGVEYXRhOjpHZXRQcml2YXRlRGF0YShGWF9MUFZPSUQgcE1vZHVsZUlkKQotewotICAgIGlmIChwTW9kdWxlSWQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgRlhfUFJJVkFURURBVEEqIHBMaXN0ID0gbV9EYXRhTGlzdC5HZXREYXRhKCk7Ci0gICAgaW50IGNvdW50ID0gbV9EYXRhTGlzdC5HZXRTaXplKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgewotICAgICAgICBpZiAocExpc3RbaV0ubV9wTW9kdWxlSWQgPT0gcE1vZHVsZUlkKSB7Ci0gICAgICAgICAgICByZXR1cm4gcExpc3RbaV0ubV9wRGF0YTsKLSAgICAgICAgfQotICAgIH0KK3ZvaWQqIENGWF9Qcml2YXRlRGF0YTo6R2V0UHJpdmF0ZURhdGEodm9pZCogcE1vZHVsZUlkKSB7CisgIGlmICghcE1vZHVsZUlkKSB7CiAgICAgcmV0dXJuIE5VTEw7Ci19Ci12b2lkIENGWF9Qcml2YXRlRGF0YTo6Q2xlYXJBbGwoKQotewotICAgIEZYX1BSSVZBVEVEQVRBKiBwTGlzdCA9IG1fRGF0YUxpc3QuR2V0RGF0YSgpOwotICAgIGludCBjb3VudCA9IG1fRGF0YUxpc3QuR2V0U2l6ZSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkgKyspIHsKLSAgICAgICAgcExpc3RbaV0uRnJlZURhdGEoKTsKKyAgfQorICBGWF9QUklWQVRFREFUQSogcExpc3QgPSBtX0RhdGFMaXN0LkdldERhdGEoKTsKKyAgaW50IGNvdW50ID0gbV9EYXRhTGlzdC5HZXRTaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgIGlmIChwTGlzdFtpXS5tX3BNb2R1bGVJZCA9PSBwTW9kdWxlSWQpIHsKKyAgICAgIHJldHVybiBwTGlzdFtpXS5tX3BEYXRhOwogICAgIH0KLSAgICBtX0RhdGFMaXN0LlJlbW92ZUFsbCgpOworICB9CisgIHJldHVybiBOVUxMOwogfQotdm9pZCBGWF9hdG9udW0oRlhfQlNUUiBzdHJjLCBGWF9CT09MJiBiSW50ZWdlciwgdm9pZCogcERhdGEpCi17Ci0gICAgaWYgKEZYU1lTX21lbWNocihzdHJjLkdldFB0cigpLCAnLicsIHN0cmMuR2V0TGVuZ3RoKCkpID09IE5VTEwpIHsKLSAgICAgICAgYkludGVnZXIgPSBUUlVFOwotICAgICAgICBpbnQgY2MgPSAwLCBpbnRlZ2VyID0gMDsKLSAgICAgICAgRlhfTFBDU1RSIHN0ciA9IHN0cmMuR2V0Q1N0cigpOwotICAgICAgICBpbnQgbGVuID0gc3RyYy5HZXRMZW5ndGgoKTsKLSAgICAgICAgRlhfQk9PTCBiTmVnYXRpdmUgPSBGQUxTRTsKLSAgICAgICAgaWYgKHN0clswXSA9PSAnKycpIHsKLSAgICAgICAgICAgIGNjKys7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyWzBdID09ICctJykgewotICAgICAgICAgICAgYk5lZ2F0aXZlID0gVFJVRTsKLSAgICAgICAgICAgIGNjKys7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKGNjIDwgbGVuKSB7Ci0gICAgICAgICAgICBpZiAoc3RyW2NjXSA8ICcwJyB8fCBzdHJbY2NdID4gJzknKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlZ2VyID0gaW50ZWdlciAqIDEwICsgc3RyW2NjXSAtICcwJzsKLSAgICAgICAgICAgIGlmIChpbnRlZ2VyIDwgMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2MgKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJOZWdhdGl2ZSkgewotICAgICAgICAgICAgaW50ZWdlciA9IC1pbnRlZ2VyOwotICAgICAgICB9Ci0gICAgICAgICooaW50KilwRGF0YSA9IGludGVnZXI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYkludGVnZXIgPSBGQUxTRTsKLSAgICAgICAgKihGWF9GTE9BVCopcERhdGEgPSBGWF9hdG9mKHN0cmMpOwotICAgIH0KK3ZvaWQgQ0ZYX1ByaXZhdGVEYXRhOjpDbGVhckFsbCgpIHsKKyAgRlhfUFJJVkFURURBVEEqIHBMaXN0ID0gbV9EYXRhTGlzdC5HZXREYXRhKCk7CisgIGludCBjb3VudCA9IG1fRGF0YUxpc3QuR2V0U2l6ZSgpOworICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBwTGlzdFtpXS5GcmVlRGF0YSgpOworICB9CisgIG1fRGF0YUxpc3QuUmVtb3ZlQWxsKCk7CiB9Ci1GWF9GTE9BVCBGWF9hdG9mKEZYX0JTVFIgc3RyYykKLXsKLSAgICBpZiAoc3RyYy5HZXRMZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwLjA7Ci0gICAgfQotICAgIGludCBjYyA9IDA7Ci0gICAgRlhfQk9PTCBiTmVnYXRpdmUgPSBGQUxTRTsKLSAgICBGWF9MUENTVFIgc3RyID0gc3RyYy5HZXRDU3RyKCk7Cit2b2lkIEZYX2F0b251bShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cmMsIEZYX0JPT0wmIGJJbnRlZ2VyLCB2b2lkKiBwRGF0YSkgeworICBpZiAoIUZYU1lTX21lbWNocihzdHJjLkdldFB0cigpLCAnLicsIHN0cmMuR2V0TGVuZ3RoKCkpKSB7CisgICAgYkludGVnZXIgPSBUUlVFOworICAgIGludCBjYyA9IDAsIGludGVnZXIgPSAwOworICAgIGNvbnN0IEZYX0NIQVIqIHN0ciA9IHN0cmMuR2V0Q1N0cigpOwogICAgIGludCBsZW4gPSBzdHJjLkdldExlbmd0aCgpOworICAgIEZYX0JPT0wgYk5lZ2F0aXZlID0gRkFMU0U7CiAgICAgaWYgKHN0clswXSA9PSAnKycpIHsKLSAgICAgICAgY2MrKzsKKyAgICAgIGNjKys7CiAgICAgfSBlbHNlIGlmIChzdHJbMF0gPT0gJy0nKSB7Ci0gICAgICAgIGJOZWdhdGl2ZSA9IFRSVUU7Ci0gICAgICAgIGNjKys7CisgICAgICBiTmVnYXRpdmUgPSBUUlVFOworICAgICAgY2MrKzsKICAgICB9CisgICAgd2hpbGUgKGNjIDwgbGVuICYmIHN0ZDo6aXNkaWdpdChzdHJbY2NdKSkgeworICAgICAgLy8gVE9ETyhkc2luY2xhaXIpOiBUaGlzIGlzIG5vdCB0aGUgcmlnaHQgd2F5IHRvIGhhbmRsZSBvdmVyZmxvdy4KKyAgICAgIGludGVnZXIgPSBpbnRlZ2VyICogMTAgKyBGWFNZU190b0RlY2ltYWxEaWdpdChzdHJbY2NdKTsKKyAgICAgIGlmIChpbnRlZ2VyIDwgMCkKKyAgICAgICAgYnJlYWs7CisgICAgICBjYysrOworICAgIH0KKyAgICBpZiAoYk5lZ2F0aXZlKSB7CisgICAgICBpbnRlZ2VyID0gLWludGVnZXI7CisgICAgfQorICAgICooaW50KilwRGF0YSA9IGludGVnZXI7CisgIH0gZWxzZSB7CisgICAgYkludGVnZXIgPSBGQUxTRTsKKyAgICAqKEZYX0ZMT0FUKilwRGF0YSA9IEZYX2F0b2Yoc3RyYyk7CisgIH0KK30KK0ZYX0ZMT0FUIEZYX2F0b2YoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHJjKSB7CisgIGlmIChzdHJjLkdldExlbmd0aCgpID09IDApIHsKKyAgICByZXR1cm4gMC4wOworICB9CisgIGludCBjYyA9IDA7CisgIEZYX0JPT0wgYk5lZ2F0aXZlID0gRkFMU0U7CisgIGNvbnN0IEZYX0NIQVIqIHN0ciA9IHN0cmMuR2V0Q1N0cigpOworICBpbnQgbGVuID0gc3RyYy5HZXRMZW5ndGgoKTsKKyAgaWYgKHN0clswXSA9PSAnKycpIHsKKyAgICBjYysrOworICB9IGVsc2UgaWYgKHN0clswXSA9PSAnLScpIHsKKyAgICBiTmVnYXRpdmUgPSBUUlVFOworICAgIGNjKys7CisgIH0KKyAgd2hpbGUgKGNjIDwgbGVuKSB7CisgICAgaWYgKHN0cltjY10gIT0gJysnICYmIHN0cltjY10gIT0gJy0nKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2MrKzsKKyAgfQorICBGWF9GTE9BVCB2YWx1ZSA9IDA7CisgIHdoaWxlIChjYyA8IGxlbikgeworICAgIGlmIChzdHJbY2NdID09ICcuJykgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIHZhbHVlID0gdmFsdWUgKiAxMCArIEZYU1lTX3RvRGVjaW1hbERpZ2l0KHN0cltjY10pOworICAgIGNjKys7CisgIH0KKyAgc3RhdGljIGNvbnN0IEZYX0ZMT0FUIGZyYWN0aW9uX3NjYWxlc1tdID0geworICAgICAgMC4xZiwgICAgICAgICAwLjAxZiwgICAgICAgICAwLjAwMWYsICAgICAgICAwLjAwMDFmLAorICAgICAgMC4wMDAwMWYsICAgICAwLjAwMDAwMWYsICAgICAwLjAwMDAwMDFmLCAgICAwLjAwMDAwMDAxZiwKKyAgICAgIDAuMDAwMDAwMDAxZiwgMC4wMDAwMDAwMDAxZiwgMC4wMDAwMDAwMDAwMWZ9OworICBpbnQgc2NhbGUgPSAwOworICBpZiAoY2MgPCBsZW4gJiYgc3RyW2NjXSA9PSAnLicpIHsKKyAgICBjYysrOwogICAgIHdoaWxlIChjYyA8IGxlbikgewotICAgICAgICBpZiAoc3RyW2NjXSAhPSAnKycgJiYgc3RyW2NjXSAhPSAnLScpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNjICsrOworICAgICAgdmFsdWUgKz0gZnJhY3Rpb25fc2NhbGVzW3NjYWxlXSAqIEZYU1lTX3RvRGVjaW1hbERpZ2l0KHN0cltjY10pOworICAgICAgc2NhbGUrKzsKKyAgICAgIGlmIChzY2FsZSA9PSBzaXplb2YgZnJhY3Rpb25fc2NhbGVzIC8gc2l6ZW9mKEZYX0ZMT0FUKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNjKys7CiAgICAgfQotICAgIEZYX0ZMT0FUIHZhbHVlID0gMDsKLSAgICB3aGlsZSAoY2MgPCBsZW4pIHsKLSAgICAgICAgaWYgKHN0cltjY10gPT0gJy4nKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB2YWx1ZSA9IHZhbHVlICogMTAgKyBzdHJbY2NdIC0gJzAnOwotICAgICAgICBjYyArKzsKLSAgICB9Ci0gICAgc3RhdGljIGNvbnN0IEZYX0ZMT0FUIGZyYWN0aW9uX3NjYWxlc1tdID0gezAuMWYsIDAuMDFmLCAwLjAwMWYsIDAuMDAwMWYsIDAuMDAwMDFmLCAwLjAwMDAwMWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMWYsIDAuMDAwMDAwMDFmLCAwLjAwMDAwMDAwMWYsIDAuMDAwMDAwMDAwMWYsIDAuMDAwMDAwMDAwMDFmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICBpbnQgc2NhbGUgPSAwOwotICAgIGlmIChjYyA8IGxlbiAmJiBzdHJbY2NdID09ICcuJykgewotICAgICAgICBjYyArKzsKLSAgICAgICAgd2hpbGUgKGNjIDwgbGVuKSB7Ci0gICAgICAgICAgICB2YWx1ZSArPSBmcmFjdGlvbl9zY2FsZXNbc2NhbGVdICogKHN0cltjY10gLSAnMCcpOwotICAgICAgICAgICAgc2NhbGUgKys7Ci0gICAgICAgICAgICBpZiAoc2NhbGUgPT0gc2l6ZW9mIGZyYWN0aW9uX3NjYWxlcyAvIHNpemVvZihGWF9GTE9BVCkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNjICsrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBiTmVnYXRpdmUgPyAtdmFsdWUgOiB2YWx1ZTsKKyAgfQorICByZXR1cm4gYk5lZ2F0aXZlID8gLXZhbHVlIDogdmFsdWU7CiB9CiAKICNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfICYmIF9NU0NfVkVSIDwgMTkwMAotdm9pZCBGWFNZU19zbnByaW50ZihjaGFyICpzdHIsIHNpemVfdCBzaXplLCBfUHJpbnRmX2Zvcm1hdF9zdHJpbmdfIGNvbnN0IGNoYXIqIGZtdCwgLi4uKQotewotICAgIHZhX2xpc3QgYXA7Ci0gICAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gICAgRlhTWVNfdnNucHJpbnRmKHN0ciwgc2l6ZSwgZm10LCBhcCk7Ci0gICAgdmFfZW5kKGFwKTsKK3ZvaWQgRlhTWVNfc25wcmludGYoY2hhciogc3RyLAorICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgX1ByaW50Zl9mb3JtYXRfc3RyaW5nXyBjb25zdCBjaGFyKiBmbXQsCisgICAgICAgICAgICAgICAgICAgIC4uLikgeworICB2YV9saXN0IGFwOworICB2YV9zdGFydChhcCwgZm10KTsKKyAgRlhTWVNfdnNucHJpbnRmKHN0ciwgc2l6ZSwgZm10LCBhcCk7CisgIHZhX2VuZChhcCk7CiB9Ci12b2lkIEZYU1lTX3ZzbnByaW50ZihjaGFyICpzdHIsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyKiBmbXQsIHZhX2xpc3QgYXApCi17Ci0gICAgKHZvaWQpIF92c25wcmludGYoc3RyLCBzaXplLCBmbXQsIGFwKTsKLSAgICBpZiAoc2l6ZSkgewotICAgICAgICBzdHJbc2l6ZSAtIDFdID0gMDsKLSAgICB9Cit2b2lkIEZYU1lTX3ZzbnByaW50ZihjaGFyKiBzdHIsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyKiBmbXQsIHZhX2xpc3QgYXApIHsKKyAgKHZvaWQpX3ZzbnByaW50ZihzdHIsIHNpemUsIGZtdCwgYXApOworICBpZiAoc2l6ZSkgeworICAgIHN0cltzaXplIC0gMV0gPSAwOworICB9CiB9CiAjZW5kaWYgIC8vIF9GWE1fUExBVEZPUk1fV0lORE9XU18gJiYgX01TQ19WRVIgPCAxOTAwCiAKLXN0YXRpYyBGWF9CT09MIEZYX0lzRGlnaXQoRlhfQllURSBjaCkKLXsKLSAgICByZXR1cm4gKGNoID49ICcwJyAmJiBjaCA8PSAnOScpID8gVFJVRSA6IEZBTFNFOwotfQotc3RhdGljIEZYX0JPT0wgRlhfSXNYRGlnaXQoRlhfQllURSBjaCkKLXsKLSAgICByZXR1cm4gKEZYX0lzRGlnaXQoY2gpIHx8IChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKSB8fCAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykpID8gVFJVRSA6IEZBTFNFOwotfQotc3RhdGljIEZYX0JZVEUgRlhfTWFrZVVwcGVyKEZYX0JZVEUgY2gpCi17Ci0gICAgaWYgKGNoIDwgJ2EnIHx8IGNoID4gJ3onKSB7Ci0gICAgICAgIHJldHVybiBjaDsKLSAgICB9Ci0gICAgcmV0dXJuIGNoIC0gMzI7Ci19Ci1zdGF0aWMgaW50IEZYX0hleFRvSShGWF9CWVRFIGNoKQotewotICAgIGNoID0gRlhfTWFrZVVwcGVyKGNoKTsKLSAgICByZXR1cm4gRlhfSXNEaWdpdChjaCkgPyAoY2ggLSAnMCcpIDogKGNoIC0gNTUpOwotfQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdXJsX2VuY29kZVRhYmxlWzEyOF0gPSB7Ci0gICAgMSwgIDEsICAxLCAgMSwJCTEsICAxLCAgMSwgIDEsCi0gICAgMSwgIDEsICAxLCAgMSwJCTEsICAxLCAgMSwgIDEsCi0gICAgMSwgIDEsICAxLCAgMSwJCTEsICAxLCAgMSwgIDEsCi0gICAgMSwgIDEsICAxLCAgMSwJCTEsICAxLCAgMSwgIDEsCi0gICAgMSwgIDAsICAxLCAgMSwJCTAsICAxLCAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgMCwJCTAsICAwLCAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgMCwJCTAsICAwLCAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgMCwJCTEsICAwLCAgMSwgIDAsCi0gICAgMCwgIDAsICAwLCAgMCwJCTAsICAwLCAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgMCwJCTAsICAwLCAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgMCwJCTAsICAwLCAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgMSwJCTEsICAxLCAgMSwgIDAsCi0gICAgMSwgIDAsICAwLCAgMCwJCTAsICAwLCAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgMCwJCTAsICAwLCAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgMCwJCTAsICAwLCAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgMSwJCTEsICAxLCAgMSwgIDEsCi19OwotQ0ZYX0J5dGVTdHJpbmcgRlhfVXJsRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1VybCkKLXsKLSAgICBjb25zdCBjaGFyIGFyRGlnaXRzW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgclVybDsKLSAgICBpbnQgbkxlbmd0aCA9IHdzVXJsLkdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIEZYX0RXT1JEIHdvcmQgPSB3c1VybC5HZXRBdChpKTsKLSAgICAgICAgaWYgKHdvcmQgPiAweDdGIHx8IHVybF9lbmNvZGVUYWJsZVt3b3JkXSA9PSAxKSB7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic1VyaSA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSgoRlhfV09SRCl3b3JkKTsKLSAgICAgICAgICAgIGludCBuQnl0ZSA9IGJzVXJpLkdldExlbmd0aCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuQnl0ZTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgclVybCArPSAnJSc7Ci0gICAgICAgICAgICAgICAgRlhfQllURSBjb2RlID0gYnNVcmkuR2V0QXQoaik7Ci0gICAgICAgICAgICAgICAgclVybCArPSBhckRpZ2l0c1tjb2RlID4+IDRdOwotICAgICAgICAgICAgICAgIHJVcmwgKz0gYXJEaWdpdHNbY29kZSAmIDB4MEZdOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgclVybCArPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoKEZYX1dPUkQpd29yZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJVcmw7Ci19Ci1DRlhfV2lkZVN0cmluZyBGWF9VcmxEZWNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJzVXJsKQotewotICAgIENGWF9CeXRlU3RyaW5nIHJVcmw7Ci0gICAgaW50IG5MZW5ndGggPSBic1VybC5HZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5MZW5ndGg7IGkrKykgewotICAgICAgICBpZiAoaSA8IG5MZW5ndGggLSAyICYmIGJzVXJsW2ldID09ICclJyAmJiBGWF9Jc1hEaWdpdChic1VybFtpICsgMV0pICYmIEZYX0lzWERpZ2l0KGJzVXJsW2kgKyAyXSkpIHsKLSAgICAgICAgICAgIHJVcmwgKz0gKEZYX0hleFRvSShic1VybFtpICsgMV0pIDw8IDQgfCBGWF9IZXhUb0koYnNVcmxbaSArIDJdKSk7Ci0gICAgICAgICAgICBpICs9IDI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByVXJsICs9IGJzVXJsW2ldOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHJVcmwpOwotfQotQ0ZYX0J5dGVTdHJpbmcgRlhfRW5jb2RlVVJJKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1VSSSkKLXsKLSAgICBjb25zdCBjaGFyIGFyRGlnaXRzW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgclVSSTsKLSAgICBDRlhfQnl0ZVN0cmluZyBic1VyaSA9IHdzVVJJLlVURjhFbmNvZGUoKTsKLSAgICBpbnQgbkxlbmd0aCA9IGJzVXJpLkdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIEZYX0JZVEUgY29kZSA9IGJzVXJpLkdldEF0KGkpOwotICAgICAgICBpZiAoY29kZSA+IDB4N0YgfHwgdXJsX2VuY29kZVRhYmxlW2NvZGVdID09IDEpIHsKLSAgICAgICAgICAgIHJVUkkgKz0gJyUnOwotICAgICAgICAgICAgclVSSSArPSBhckRpZ2l0c1tjb2RlID4+IDRdOwotICAgICAgICAgICAgclVSSSArPSBhckRpZ2l0c1tjb2RlICYgMHgwRl07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByVVJJICs9IGNvZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJVUkk7Ci19Ci1DRlhfV2lkZVN0cmluZyBGWF9EZWNvZGVVUkkoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJzVVJJKQotewotICAgIENGWF9CeXRlU3RyaW5nIHJVUkk7Ci0gICAgaW50IG5MZW5ndGggPSBic1VSSS5HZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5MZW5ndGg7IGkrKykgewotICAgICAgICBpZiAoaSA8IG5MZW5ndGggLSAyICYmIGJzVVJJW2ldID09ICclJyAmJiBGWF9Jc1hEaWdpdChic1VSSVtpICsgMV0pICYmIEZYX0lzWERpZ2l0KGJzVVJJW2kgKyAyXSkpIHsKLSAgICAgICAgICAgIHJVUkkgKz0gKEZYX0hleFRvSShic1VSSVtpICsgMV0pIDw8IDQgfCBGWF9IZXhUb0koYnNVUklbaSArIDJdKSk7Ci0gICAgICAgICAgICBpICs9IDI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByVVJJICs9IGJzVVJJW2ldOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoclVSSSwgclVSSS5HZXRMZW5ndGgoKSk7Ci19CiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotY2xhc3MgQ0ZpbmRGaWxlRGF0YSAKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5DRmluZEZpbGVEYXRhKCkge30KLSAgICBIQU5ETEUJCQkJbV9IYW5kbGU7Ci0gICAgRlhfQk9PTAkJCQltX2JFbmQ7CitjbGFzcyBDRmluZEZpbGVEYXRhIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfkNGaW5kRmlsZURhdGEoKSB7fQorICBIQU5ETEUgbV9IYW5kbGU7CisgIEZYX0JPT0wgbV9iRW5kOwogfTsKLWNsYXNzIENGaW5kRmlsZURhdGFBIDogcHVibGljIENGaW5kRmlsZURhdGEKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5DRmluZEZpbGVEYXRhQSgpIHt9Ci0gICAgV0lOMzJfRklORF9EQVRBQQltX0ZpbmREYXRhOworY2xhc3MgQ0ZpbmRGaWxlRGF0YUEgOiBwdWJsaWMgQ0ZpbmRGaWxlRGF0YSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5DRmluZEZpbGVEYXRhQSgpIHt9CisgIFdJTjMyX0ZJTkRfREFUQUEgbV9GaW5kRGF0YTsKIH07Ci1jbGFzcyBDRmluZEZpbGVEYXRhVyA6IHB1YmxpYyBDRmluZEZpbGVEYXRhCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+Q0ZpbmRGaWxlRGF0YVcoKSB7fQotICAgIFdJTjMyX0ZJTkRfREFUQVcJbV9GaW5kRGF0YTsKK2NsYXNzIENGaW5kRmlsZURhdGFXIDogcHVibGljIENGaW5kRmlsZURhdGEgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+Q0ZpbmRGaWxlRGF0YVcoKSB7fQorICBXSU4zMl9GSU5EX0RBVEFXIG1fRmluZERhdGE7CiB9OwogI2VuZGlmCi12b2lkKiBGWF9PcGVuRm9sZGVyKEZYX0xQQ1NUUiBwYXRoKQotewordm9pZCogRlhfT3BlbkZvbGRlcihjb25zdCBGWF9DSEFSKiBwYXRoKSB7CiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwogI2lmbmRlZiBfV0lOMzJfV0NFCi0gICAgQ0ZpbmRGaWxlRGF0YUEqIHBEYXRhID0gbmV3IENGaW5kRmlsZURhdGFBOworICBDRmluZEZpbGVEYXRhQSogcERhdGEgPSBuZXcgQ0ZpbmRGaWxlRGF0YUE7CiAjaWZkZWYgX0ZYX1dJTkFQSV9QQVJUSVRJT05fREVTS1RPUF8KLSAgICBwRGF0YS0+bV9IYW5kbGUgPSBGaW5kRmlyc3RGaWxlQShDRlhfQnl0ZVN0cmluZyhwYXRoKSArICIvKi4qIiwgJnBEYXRhLT5tX0ZpbmREYXRhKTsKKyAgcERhdGEtPm1fSGFuZGxlID0KKyAgICAgIEZpbmRGaXJzdEZpbGVBKENGWF9CeXRlU3RyaW5nKHBhdGgpICsgIi8qLioiLCAmcERhdGEtPm1fRmluZERhdGEpOwogI2Vsc2UKLSAgICBwRGF0YS0+bV9IYW5kbGUgPSBGaW5kRmlyc3RGaWxlRXhBKENGWF9CeXRlU3RyaW5nKHBhdGgpICsgIi8qLioiLCBGaW5kRXhJbmZvU3RhbmRhcmQsICZwRGF0YS0+bV9GaW5kRGF0YSwgRmluZEV4U2VhcmNoTmFtZU1hdGNoLCBOVUxMLCAwKTsKKyAgcERhdGEtPm1fSGFuZGxlID0KKyAgICAgIEZpbmRGaXJzdEZpbGVFeEEoQ0ZYX0J5dGVTdHJpbmcocGF0aCkgKyAiLyouKiIsIEZpbmRFeEluZm9TdGFuZGFyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5tX0ZpbmREYXRhLCBGaW5kRXhTZWFyY2hOYW1lTWF0Y2gsIE5VTEwsIDApOwogI2VuZGlmCiAjZWxzZQotICAgIENGaW5kRmlsZURhdGFXKiBwRGF0YSA9IG5ldyBDRmluZEZpbGVEYXRhVzsKLSAgICBwRGF0YS0+bV9IYW5kbGUgPSBGaW5kRmlyc3RGaWxlVyhDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBhdGgpICsgTCIvKi4qIiwgJnBEYXRhLT5tX0ZpbmREYXRhKTsKKyAgQ0ZpbmRGaWxlRGF0YVcqIHBEYXRhID0gbmV3IENGaW5kRmlsZURhdGFXOworICBwRGF0YS0+bV9IYW5kbGUgPSBGaW5kRmlyc3RGaWxlVyhDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBhdGgpICsgTCIvKi4qIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5tX0ZpbmREYXRhKTsKICNlbmRpZgotICAgIGlmIChwRGF0YS0+bV9IYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLSAgICAgICAgZGVsZXRlIHBEYXRhOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcERhdGEtPm1fYkVuZCA9IEZBTFNFOwotICAgIHJldHVybiBwRGF0YTsKLSNlbHNlCi0gICAgRElSKiBkaXIgPSBvcGVuZGlyKHBhdGgpOwotICAgIHJldHVybiBkaXI7Ci0jZW5kaWYKLX0KLXZvaWQqIEZYX09wZW5Gb2xkZXIoRlhfTFBDV1NUUiBwYXRoKQotewotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgICBDRmluZEZpbGVEYXRhVyogcERhdGEgPSBuZXcgQ0ZpbmRGaWxlRGF0YVc7Ci0jaWZkZWYgX0ZYX1dJTkFQSV9QQVJUSVRJT05fREVTS1RPUF8KLSAgICBwRGF0YS0+bV9IYW5kbGUgPSBGaW5kRmlyc3RGaWxlVygoQ0ZYX1dpZGVTdHJpbmcocGF0aCkgKyBMIi8qLioiKS5jX3N0cigpLCAmcERhdGEtPm1fRmluZERhdGEpOwotI2Vsc2UKLSAgICBwRGF0YS0+bV9IYW5kbGUgPSBGaW5kRmlyc3RGaWxlRXhXKChDRlhfV2lkZVN0cmluZyhwYXRoKSArIEwiLyouKiIpLmNfc3RyKCksIEZpbmRFeEluZm9TdGFuZGFyZCwgJnBEYXRhLT5tX0ZpbmREYXRhLCBGaW5kRXhTZWFyY2hOYW1lTWF0Y2gsIE5VTEwsIDApOwotI2VuZGlmCi0gICAgaWYgKHBEYXRhLT5tX0hhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotICAgICAgICBkZWxldGUgcERhdGE7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBwRGF0YS0+bV9iRW5kID0gRkFMU0U7Ci0gICAgcmV0dXJuIHBEYXRhOwotI2Vsc2UKLSAgICBESVIqIGRpciA9IG9wZW5kaXIoQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHBhdGgpKTsKLSAgICByZXR1cm4gZGlyOwotI2VuZGlmCi19Ci1GWF9CT09MIEZYX0dldE5leHRGaWxlKHZvaWQqIGhhbmRsZSwgQ0ZYX0J5dGVTdHJpbmcmIGZpbGVuYW1lLCBGWF9CT09MJiBiRm9sZGVyKQotewotICAgIGlmIChoYW5kbGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSNpZm5kZWYgX1dJTjMyX1dDRQotICAgIENGaW5kRmlsZURhdGFBKiBwRGF0YSA9IChDRmluZEZpbGVEYXRhQSopaGFuZGxlOwotICAgIGlmIChwRGF0YS0+bV9iRW5kKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgZmlsZW5hbWUgPSBwRGF0YS0+bV9GaW5kRGF0YS5jRmlsZU5hbWU7Ci0gICAgYkZvbGRlciA9IHBEYXRhLT5tX0ZpbmREYXRhLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlk7Ci0gICAgaWYgKCFGaW5kTmV4dEZpbGVBKHBEYXRhLT5tX0hhbmRsZSwgJnBEYXRhLT5tX0ZpbmREYXRhKSkgewotICAgICAgICBwRGF0YS0+bV9iRW5kID0gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci0jZWxzZQotICAgIENGaW5kRmlsZURhdGFXKiBwRGF0YSA9IChDRmluZEZpbGVEYXRhVyopaGFuZGxlOwotICAgIGlmIChwRGF0YS0+bV9iRW5kKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgZmlsZW5hbWUgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocERhdGEtPm1fRmluZERhdGEuY0ZpbGVOYW1lKTsKLSAgICBiRm9sZGVyID0gcERhdGEtPm1fRmluZERhdGEuZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWTsKLSAgICBpZiAoIUZpbmROZXh0RmlsZVcocERhdGEtPm1fSGFuZGxlLCAmcERhdGEtPm1fRmluZERhdGEpKSB7Ci0gICAgICAgIHBEYXRhLT5tX2JFbmQgPSBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLSNlbmRpZgotI2VsaWYgZGVmaW5lZChfX25hdGl2ZV9jbGllbnRfXykKLSAgICBhYm9ydCgpOwotICAgIHJldHVybiBGQUxTRTsKLSNlbHNlCi0gICAgc3RydWN0IGRpcmVudCAqZGUgPSByZWFkZGlyKChESVIqKWhhbmRsZSk7Ci0gICAgaWYgKGRlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBmaWxlbmFtZSA9IGRlLT5kX25hbWU7Ci0gICAgYkZvbGRlciA9IGRlLT5kX3R5cGUgPT0gRFRfRElSOwotICAgIHJldHVybiBUUlVFOwotI2VuZGlmCi19Ci1GWF9CT09MIEZYX0dldE5leHRGaWxlKHZvaWQqIGhhbmRsZSwgQ0ZYX1dpZGVTdHJpbmcmIGZpbGVuYW1lLCBGWF9CT09MJiBiRm9sZGVyKQotewotICAgIGlmIChoYW5kbGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgICBDRmluZEZpbGVEYXRhVyogcERhdGEgPSAoQ0ZpbmRGaWxlRGF0YVcqKWhhbmRsZTsKLSAgICBpZiAocERhdGEtPm1fYkVuZCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGZpbGVuYW1lID0gcERhdGEtPm1fRmluZERhdGEuY0ZpbGVOYW1lOwotICAgIGJGb2xkZXIgPSBwRGF0YS0+bV9GaW5kRGF0YS5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZOwotICAgIGlmICghRmluZE5leHRGaWxlVyhwRGF0YS0+bV9IYW5kbGUsICZwRGF0YS0+bV9GaW5kRGF0YSkpIHsKLSAgICAgICAgcERhdGEtPm1fYkVuZCA9IFRSVUU7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotI2VsaWYgZGVmaW5lZChfX25hdGl2ZV9jbGllbnRfXykKLSAgICBhYm9ydCgpOwotICAgIHJldHVybiBGQUxTRTsKLSNlbHNlCi0gICAgc3RydWN0IGRpcmVudCAqZGUgPSByZWFkZGlyKChESVIqKWhhbmRsZSk7Ci0gICAgaWYgKGRlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBmaWxlbmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoZGUtPmRfbmFtZSk7Ci0gICAgYkZvbGRlciA9IGRlLT5kX3R5cGUgPT0gRFRfRElSOwotICAgIHJldHVybiBUUlVFOwotI2VuZGlmCi19Ci12b2lkIEZYX0Nsb3NlRm9sZGVyKHZvaWQqIGhhbmRsZSkKLXsKLSAgICBpZiAoaGFuZGxlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0gICAgQ0ZpbmRGaWxlRGF0YSogcERhdGEgPSAoQ0ZpbmRGaWxlRGF0YSopaGFuZGxlOwotICAgIEZpbmRDbG9zZShwRGF0YS0+bV9IYW5kbGUpOworICBpZiAocERhdGEtPm1fSGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CiAgICAgZGVsZXRlIHBEYXRhOworICAgIHJldHVybiBOVUxMOworICB9CisgIHBEYXRhLT5tX2JFbmQgPSBGQUxTRTsKKyAgcmV0dXJuIHBEYXRhOwogI2Vsc2UKLSAgICBjbG9zZWRpcigoRElSKiloYW5kbGUpOworICBESVIqIGRpciA9IG9wZW5kaXIocGF0aCk7CisgIHJldHVybiBkaXI7CiAjZW5kaWYKIH0KLUZYX1dDSEFSIEZYX0dldEZvbGRlclNlcGFyYXRvcigpCi17Cit2b2lkKiBGWF9PcGVuRm9sZGVyKGNvbnN0IEZYX1dDSEFSKiBwYXRoKSB7CiAjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotICAgIHJldHVybiAnXFwnOworICBDRmluZEZpbGVEYXRhVyogcERhdGEgPSBuZXcgQ0ZpbmRGaWxlRGF0YVc7CisjaWZkZWYgX0ZYX1dJTkFQSV9QQVJUSVRJT05fREVTS1RPUF8KKyAgcERhdGEtPm1fSGFuZGxlID0gRmluZEZpcnN0RmlsZVcoKENGWF9XaWRlU3RyaW5nKHBhdGgpICsgTCIvKi4qIikuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5tX0ZpbmREYXRhKTsKICNlbHNlCi0gICAgcmV0dXJuICcvJzsKKyAgcERhdGEtPm1fSGFuZGxlID0gRmluZEZpcnN0RmlsZUV4VygoQ0ZYX1dpZGVTdHJpbmcocGF0aCkgKyBMIi8qLioiKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmRFeEluZm9TdGFuZGFyZCwgJnBEYXRhLT5tX0ZpbmREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmRFeFNlYXJjaE5hbWVNYXRjaCwgTlVMTCwgMCk7CisjZW5kaWYKKyAgaWYgKHBEYXRhLT5tX0hhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgIGRlbGV0ZSBwRGF0YTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwRGF0YS0+bV9iRW5kID0gRkFMU0U7CisgIHJldHVybiBwRGF0YTsKKyNlbHNlCisgIERJUiogZGlyID0gb3BlbmRpcihDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocGF0aCkpOworICByZXR1cm4gZGlyOworI2VuZGlmCit9CitGWF9CT09MIEZYX0dldE5leHRGaWxlKHZvaWQqIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRm9sZGVyKSB7CisgIGlmICghaGFuZGxlKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXworI2lmbmRlZiBfV0lOMzJfV0NFCisgIENGaW5kRmlsZURhdGFBKiBwRGF0YSA9IChDRmluZEZpbGVEYXRhQSopaGFuZGxlOworICBpZiAocERhdGEtPm1fYkVuZCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBmaWxlbmFtZSA9IHBEYXRhLT5tX0ZpbmREYXRhLmNGaWxlTmFtZTsKKyAgYkZvbGRlciA9IHBEYXRhLT5tX0ZpbmREYXRhLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlk7CisgIGlmICghRmluZE5leHRGaWxlQShwRGF0YS0+bV9IYW5kbGUsICZwRGF0YS0+bV9GaW5kRGF0YSkpIHsKKyAgICBwRGF0YS0+bV9iRW5kID0gVFJVRTsKKyAgfQorICByZXR1cm4gVFJVRTsKKyNlbHNlCisgIENGaW5kRmlsZURhdGFXKiBwRGF0YSA9IChDRmluZEZpbGVEYXRhVyopaGFuZGxlOworICBpZiAocERhdGEtPm1fYkVuZCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBmaWxlbmFtZSA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwRGF0YS0+bV9GaW5kRGF0YS5jRmlsZU5hbWUpOworICBiRm9sZGVyID0gcERhdGEtPm1fRmluZERhdGEuZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWTsKKyAgaWYgKCFGaW5kTmV4dEZpbGVXKHBEYXRhLT5tX0hhbmRsZSwgJnBEYXRhLT5tX0ZpbmREYXRhKSkgeworICAgIHBEYXRhLT5tX2JFbmQgPSBUUlVFOworICB9CisgIHJldHVybiBUUlVFOworI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9fbmF0aXZlX2NsaWVudF9fKQorICBhYm9ydCgpOworICByZXR1cm4gRkFMU0U7CisjZWxzZQorICBzdHJ1Y3QgZGlyZW50KiBkZSA9IHJlYWRkaXIoKERJUiopaGFuZGxlKTsKKyAgaWYgKCFkZSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBmaWxlbmFtZSA9IGRlLT5kX25hbWU7CisgIGJGb2xkZXIgPSBkZS0+ZF90eXBlID09IERUX0RJUjsKKyAgcmV0dXJuIFRSVUU7CisjZW5kaWYKK30KK0ZYX0JPT0wgRlhfR2V0TmV4dEZpbGUodm9pZCogaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJGb2xkZXIpIHsKKyAgaWYgKCFoYW5kbGUpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisgIENGaW5kRmlsZURhdGFXKiBwRGF0YSA9IChDRmluZEZpbGVEYXRhVyopaGFuZGxlOworICBpZiAocERhdGEtPm1fYkVuZCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBmaWxlbmFtZSA9IHBEYXRhLT5tX0ZpbmREYXRhLmNGaWxlTmFtZTsKKyAgYkZvbGRlciA9IHBEYXRhLT5tX0ZpbmREYXRhLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlk7CisgIGlmICghRmluZE5leHRGaWxlVyhwRGF0YS0+bV9IYW5kbGUsICZwRGF0YS0+bV9GaW5kRGF0YSkpIHsKKyAgICBwRGF0YS0+bV9iRW5kID0gVFJVRTsKKyAgfQorICByZXR1cm4gVFJVRTsKKyNlbGlmIGRlZmluZWQoX19uYXRpdmVfY2xpZW50X18pCisgIGFib3J0KCk7CisgIHJldHVybiBGQUxTRTsKKyNlbHNlCisgIHN0cnVjdCBkaXJlbnQqIGRlID0gcmVhZGRpcigoRElSKiloYW5kbGUpOworICBpZiAoIWRlKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGZpbGVuYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChkZS0+ZF9uYW1lKTsKKyAgYkZvbGRlciA9IGRlLT5kX3R5cGUgPT0gRFRfRElSOworICByZXR1cm4gVFJVRTsKKyNlbmRpZgorfQordm9pZCBGWF9DbG9zZUZvbGRlcih2b2lkKiBoYW5kbGUpIHsKKyAgaWYgKCFoYW5kbGUpIHsKKyAgICByZXR1cm47CisgIH0KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisgIENGaW5kRmlsZURhdGEqIHBEYXRhID0gKENGaW5kRmlsZURhdGEqKWhhbmRsZTsKKyAgRmluZENsb3NlKHBEYXRhLT5tX0hhbmRsZSk7CisgIGRlbGV0ZSBwRGF0YTsKKyNlbHNlCisgIGNsb3NlZGlyKChESVIqKWhhbmRsZSk7CisjZW5kaWYKK30KK0ZYX1dDSEFSIEZYX0dldEZvbGRlclNlcGFyYXRvcigpIHsKKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisgIHJldHVybiAnXFwnOworI2Vsc2UKKyAgcmV0dXJuICcvJzsKICNlbmRpZgogfQogCi1DRlhfTWF0cml4XzNieTMgQ0ZYX01hdHJpeF8zYnkzOjpJbnZlcnNlKCkKLXsKLSAgICBGWF9GTE9BVCBkZXQgPSBhKihlKmkgLSBmKmgpIC0gYiooaSpkIC0gZipnKSArIGMqKGQqaCAtIGUqZyk7Ci0gICAgaWYgKEZYU1lTX2ZhYnMoZGV0KSA8IDAuMDAwMDAwMSkKLSAgICAgICAgcmV0dXJuIENGWF9NYXRyaXhfM2J5MygpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIENGWF9NYXRyaXhfM2J5MygKLSAgICAgICAgICAgIChlKmkgLSBmKmgpIC8gZGV0LAotICAgICAgICAgICAgLShiKmkgLSBjKmgpIC8gZGV0LAotICAgICAgICAgICAgKGIqZiAtIGMqZSkgLyBkZXQsCi0gICAgICAgICAgICAtKGQqaSAtIGYqZykgLyBkZXQsCi0gICAgICAgICAgICAoYSppIC0gYypnKSAvIGRldCwKLSAgICAgICAgICAgIC0oYSpmIC0gYypkKSAvIGRldCwKLSAgICAgICAgICAgIChkKmggLSBlKmcpIC8gZGV0LAotICAgICAgICAgICAgLShhKmggLSBiKmcpIC8gZGV0LAotICAgICAgICAgICAgKGEqZSAtIGIqZCkgLyBkZXQKLSAgICAgICAgKTsKK0NGWF9NYXRyaXhfM2J5MyBDRlhfTWF0cml4XzNieTM6OkludmVyc2UoKSB7CisgIEZYX0ZMT0FUIGRldCA9CisgICAgICBhICogKGUgKiBpIC0gZiAqIGgpIC0gYiAqIChpICogZCAtIGYgKiBnKSArIGMgKiAoZCAqIGggLSBlICogZyk7CisgIGlmIChGWFNZU19mYWJzKGRldCkgPCAwLjAwMDAwMDEpCisgICAgcmV0dXJuIENGWF9NYXRyaXhfM2J5MygpOworCisgIHJldHVybiBDRlhfTWF0cml4XzNieTMoCisgICAgICAoZSAqIGkgLSBmICogaCkgLyBkZXQsIC0oYiAqIGkgLSBjICogaCkgLyBkZXQsIChiICogZiAtIGMgKiBlKSAvIGRldCwKKyAgICAgIC0oZCAqIGkgLSBmICogZykgLyBkZXQsIChhICogaSAtIGMgKiBnKSAvIGRldCwgLShhICogZiAtIGMgKiBkKSAvIGRldCwKKyAgICAgIChkICogaCAtIGUgKiBnKSAvIGRldCwgLShhICogaCAtIGIgKiBnKSAvIGRldCwgKGEgKiBlIC0gYiAqIGQpIC8gZGV0KTsKIH0KIAotQ0ZYX01hdHJpeF8zYnkzIENGWF9NYXRyaXhfM2J5Mzo6TXVsdGlwbHkoY29uc3QgQ0ZYX01hdHJpeF8zYnkzICZtKQotewotICAgIHJldHVybiBDRlhfTWF0cml4XzNieTMoCi0gICAgICAgIGEqbS5hICsgYiptLmQgKyBjKm0uZywKLSAgICAgICAgYSptLmIgKyBiKm0uZSArIGMqbS5oLAotICAgICAgICBhKm0uYyArIGIqbS5mICsgYyptLmksCi0gICAgICAgIGQqbS5hICsgZSptLmQgKyBmKm0uZywKLSAgICAgICAgZCptLmIgKyBlKm0uZSArIGYqbS5oLAotICAgICAgICBkKm0uYyArIGUqbS5mICsgZiptLmksCi0gICAgICAgIGcqbS5hICsgaCptLmQgKyBpKm0uZywKLSAgICAgICAgZyptLmIgKyBoKm0uZSArIGkqbS5oLAotICAgICAgICBnKm0uYyArIGgqbS5mICsgaSptLmkKLSAgICAgICk7CitDRlhfTWF0cml4XzNieTMgQ0ZYX01hdHJpeF8zYnkzOjpNdWx0aXBseShjb25zdCBDRlhfTWF0cml4XzNieTMmIG0pIHsKKyAgcmV0dXJuIENGWF9NYXRyaXhfM2J5MygKKyAgICAgIGEgKiBtLmEgKyBiICogbS5kICsgYyAqIG0uZywgYSAqIG0uYiArIGIgKiBtLmUgKyBjICogbS5oLAorICAgICAgYSAqIG0uYyArIGIgKiBtLmYgKyBjICogbS5pLCBkICogbS5hICsgZSAqIG0uZCArIGYgKiBtLmcsCisgICAgICBkICogbS5iICsgZSAqIG0uZSArIGYgKiBtLmgsIGQgKiBtLmMgKyBlICogbS5mICsgZiAqIG0uaSwKKyAgICAgIGcgKiBtLmEgKyBoICogbS5kICsgaSAqIG0uZywgZyAqIG0uYiArIGggKiBtLmUgKyBpICogbS5oLAorICAgICAgZyAqIG0uYyArIGggKiBtLmYgKyBpICogbS5pKTsKIH0KIAotQ0ZYX1ZlY3Rvcl8zYnkxIENGWF9NYXRyaXhfM2J5Mzo6VHJhbnNmb3JtVmVjdG9yKGNvbnN0IENGWF9WZWN0b3JfM2J5MSAmdikKLXsKLSAgICByZXR1cm4gQ0ZYX1ZlY3Rvcl8zYnkxKAotICAgICAgICBhICogdi5hICsgYiAqIHYuYiArIGMgKiB2LmMsCi0gICAgICAgIGQgKiB2LmEgKyBlICogdi5iICsgZiAqIHYuYywKLSAgICAgICAgZyAqIHYuYSArIGggKiB2LmIgKyBpICogdi5jCi0gICAgKTsKK0NGWF9WZWN0b3JfM2J5MSBDRlhfTWF0cml4XzNieTM6OlRyYW5zZm9ybVZlY3Rvcihjb25zdCBDRlhfVmVjdG9yXzNieTEmIHYpIHsKKyAgcmV0dXJuIENGWF9WZWN0b3JfM2J5MShhICogdi5hICsgYiAqIHYuYiArIGMgKiB2LmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgZCAqIHYuYSArIGUgKiB2LmIgKyBmICogdi5jLAorICAgICAgICAgICAgICAgICAgICAgICAgIGcgKiB2LmEgKyBoICogdi5iICsgaSAqIHYuYyk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY193c3RyaW5nLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3dzdHJpbmcuY3BwCmluZGV4IDA5ZTY0ZTAuLjIzNzBjODcgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3dzdHJpbmcuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3dzdHJpbmcuY3BwCkBAIC02LDEwODEgKzYsMTA1NiBAQAogCiAjaW5jbHVkZSA8c3RkZGVmLmg+ICAvLyBGb3Igb2Zmc2V0b2YoKS4KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi90aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfbWF0aC5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfZXh0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9udW1lcmljcy9zYWZlX21hdGguaCIKIAogLy8gc3RhdGljCi1DRlhfV2lkZVN0cmluZzo6U3RyaW5nRGF0YSogQ0ZYX1dpZGVTdHJpbmc6OlN0cmluZ0RhdGE6OkNyZWF0ZShpbnQgbkxlbikKLXsKLSAgICAvLyBUT0RPKHBhbG1lcik6IHxuTGVufCBzaG91bGQgcmVhbGx5IGJlIGRlY2xhcmVkIGFzIHxzaXplX3R8LCBvcgotICAgIC8vIGF0IGxlYXN0IHVuc2lnbmVkLgotICAgIGlmIChuTGVuID09IDAgfHwgbkxlbiA8IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQorQ0ZYX1dpZGVTdHJpbmc6OlN0cmluZ0RhdGEqIENGWF9XaWRlU3RyaW5nOjpTdHJpbmdEYXRhOjpDcmVhdGUoaW50IG5MZW4pIHsKKyAgLy8gVE9ETyhwYWxtZXIpOiB8bkxlbnwgc2hvdWxkIHJlYWxseSBiZSBkZWNsYXJlZCBhcyB8c2l6ZV90fCwgb3IKKyAgLy8gYXQgbGVhc3QgdW5zaWduZWQuCisgIGlmIChuTGVuID09IDAgfHwgbkxlbiA8IDApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQogCi0gICAgLy8gRml4ZWQgcG9ydGlvbiBvZiBoZWFkZXIgcGx1cyBhIE5VTCB3aWRlIGNoYXIgbm90IGluIG1fbkFsbG9jTGVuZ3RoLgotICAgIGludCBvdmVyaGVhZCA9IG9mZnNldG9mKFN0cmluZ0RhdGEsIG1fU3RyaW5nKSArIHNpemVvZihGWF9XQ0hBUik7Ci0gICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxpbnQ+IGlTaXplID0gbkxlbjsKLSAgICBpU2l6ZSAqPSBzaXplb2YoRlhfV0NIQVIpOwotICAgIGlTaXplICs9IG92ZXJoZWFkOworICAvLyBGaXhlZCBwb3J0aW9uIG9mIGhlYWRlciBwbHVzIGEgTlVMIHdpZGUgY2hhciBub3QgaW4gbV9uQWxsb2NMZW5ndGguCisgIGludCBvdmVyaGVhZCA9IG9mZnNldG9mKFN0cmluZ0RhdGEsIG1fU3RyaW5nKSArIHNpemVvZihGWF9XQ0hBUik7CisgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8aW50PiBpU2l6ZSA9IG5MZW47CisgIGlTaXplICo9IHNpemVvZihGWF9XQ0hBUik7CisgIGlTaXplICs9IG92ZXJoZWFkOwogCi0gICAgLy8gTm93IHJvdW5kIHRvIGFuIDgtYnl0ZSBib3VuZGFyeS4gV2UnZCBleHBlY3QgdGhhdCB0aGlzIGlzIHRoZSBtaW5pbXVtCi0gICAgLy8gZ3JhbnVsYXJpdHkgb2YgYW55IG9mIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRvcnMsIHNvIHRoZXJlIG1heSBiZSBjYXNlcwotICAgIC8vIHdoZXJlIHdlIGNhbiBzYXZlIGEgcmUtYWxsb2Mgd2hlbiBhZGRpbmcgYSBmZXcgY2hhcmFjdGVycyB0byBhIHN0cmluZwotICAgIC8vIGJ5IHVzaW5nIHRoaXMgb3RoZXJ3aXNlIHdhc3RlZCBzcGFjZS4KLSAgICBpU2l6ZSArPSA3OwotICAgIGludCB0b3RhbFNpemUgPSBpU2l6ZS5WYWx1ZU9yRGllKCkgJiB+NzsKLSAgICBpbnQgdXNhYmxlTGVuID0gKHRvdGFsU2l6ZSAtIG92ZXJoZWFkKSAvIHNpemVvZihGWF9XQ0hBUik7Ci0gICAgRlhTWVNfYXNzZXJ0KHVzYWJsZUxlbiA+PSBuTGVuKTsKKyAgLy8gTm93IHJvdW5kIHRvIGFuIDgtYnl0ZSBib3VuZGFyeS4gV2UnZCBleHBlY3QgdGhhdCB0aGlzIGlzIHRoZSBtaW5pbXVtCisgIC8vIGdyYW51bGFyaXR5IG9mIGFueSBvZiB0aGUgdW5kZXJseWluZyBhbGxvY2F0b3JzLCBzbyB0aGVyZSBtYXkgYmUgY2FzZXMKKyAgLy8gd2hlcmUgd2UgY2FuIHNhdmUgYSByZS1hbGxvYyB3aGVuIGFkZGluZyBhIGZldyBjaGFyYWN0ZXJzIHRvIGEgc3RyaW5nCisgIC8vIGJ5IHVzaW5nIHRoaXMgb3RoZXJ3aXNlIHdhc3RlZCBzcGFjZS4KKyAgaVNpemUgKz0gNzsKKyAgaW50IHRvdGFsU2l6ZSA9IGlTaXplLlZhbHVlT3JEaWUoKSAmIH43OworICBpbnQgdXNhYmxlTGVuID0gKHRvdGFsU2l6ZSAtIG92ZXJoZWFkKSAvIHNpemVvZihGWF9XQ0hBUik7CisgIEZYU1lTX2Fzc2VydCh1c2FibGVMZW4gPj0gbkxlbik7CiAKLSAgICB2b2lkKiBwRGF0YSA9IEZYX0FsbG9jKEZYX0JZVEUsIGlTaXplLlZhbHVlT3JEaWUoKSk7Ci0gICAgcmV0dXJuIG5ldyAocERhdGEpIFN0cmluZ0RhdGEobkxlbiwgdXNhYmxlTGVuKTsKKyAgdm9pZCogcERhdGEgPSBGWF9BbGxvYyh1aW50OF90LCB0b3RhbFNpemUpOworICByZXR1cm4gbmV3IChwRGF0YSkgU3RyaW5nRGF0YShuTGVuLCB1c2FibGVMZW4pOwogfQotQ0ZYX1dpZGVTdHJpbmc6On5DRlhfV2lkZVN0cmluZygpCi17Ci0gICAgaWYgKG1fcERhdGEpIHsKLSAgICAgICAgbV9wRGF0YS0+UmVsZWFzZSgpOwotICAgIH0KLX0KLUNGWF9XaWRlU3RyaW5nOjpDRlhfV2lkZVN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nU3JjKQotewotICAgIGlmIChzdHJpbmdTcmMubV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIG1fcERhdGEgPSBOVUxMOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChzdHJpbmdTcmMubV9wRGF0YS0+bV9uUmVmcyA+PSAwKSB7Ci0gICAgICAgIG1fcERhdGEgPSBzdHJpbmdTcmMubV9wRGF0YTsKLSAgICAgICAgbV9wRGF0YS0+UmV0YWluKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7Ci0gICAgICAgICp0aGlzID0gc3RyaW5nU3JjOwotICAgIH0KLX0KLUNGWF9XaWRlU3RyaW5nOjpDRlhfV2lkZVN0cmluZyhGWF9MUENXU1RSIGxwc3osIEZYX1NUUlNJWkUgbkxlbikgewotICAgIGlmIChuTGVuIDwgMCkgewotICAgICAgICBuTGVuID0gbHBzeiA/IEZYU1lTX3djc2xlbihscHN6KSA6IDA7Ci0gICAgfQotICAgIGlmIChuTGVuKSB7Ci0gICAgICAgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobkxlbik7Ci0gICAgICAgIGlmIChtX3BEYXRhKSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkzMihtX3BEYXRhLT5tX1N0cmluZywgbHBzeiwgbkxlbiAqIHNpemVvZihGWF9XQ0hBUikpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7Ci0gICAgfQotfQotQ0ZYX1dpZGVTdHJpbmc6OkNGWF9XaWRlU3RyaW5nKEZYX1dDSEFSIGNoKQotewotICAgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUoMSk7Ci0gICAgaWYgKG1fcERhdGEpIHsKLSAgICAgICAgbV9wRGF0YS0+bV9TdHJpbmdbMF0gPSBjaDsKLSAgICB9Ci19Ci1DRlhfV2lkZVN0cmluZzo6Q0ZYX1dpZGVTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIpCi17Ci0gICAgaWYgKHN0ci5Jc0VtcHR5KCkpIHsKLSAgICAgICAgbV9wRGF0YSA9IE5VTEw7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShzdHIuR2V0TGVuZ3RoKCkpOwotICAgIGlmIChtX3BEYXRhKSB7Ci0gICAgICAgIEZYU1lTX21lbWNweTMyKG1fcERhdGEtPm1fU3RyaW5nLCBzdHIuR2V0UHRyKCksIHN0ci5HZXRMZW5ndGgoKSpzaXplb2YoRlhfV0NIQVIpKTsKLSAgICB9Ci19Ci1DRlhfV2lkZVN0cmluZzo6Q0ZYX1dpZGVTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIxLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cjIpCi17Ci0gICAgbV9wRGF0YSA9IE5VTEw7Ci0gICAgaW50IG5OZXdMZW4gPSBzdHIxLkdldExlbmd0aCgpICsgc3RyMi5HZXRMZW5ndGgoKTsKLSAgICBpZiAobk5ld0xlbiA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuTmV3TGVuKTsKLSAgICBpZiAobV9wRGF0YSkgewotICAgICAgICBGWFNZU19tZW1jcHkzMihtX3BEYXRhLT5tX1N0cmluZywgc3RyMS5HZXRQdHIoKSwgc3RyMS5HZXRMZW5ndGgoKSpzaXplb2YoRlhfV0NIQVIpKTsKLSAgICAgICAgRlhTWVNfbWVtY3B5MzIobV9wRGF0YS0+bV9TdHJpbmcgKyBzdHIxLkdldExlbmd0aCgpLCBzdHIyLkdldFB0cigpLCBzdHIyLkdldExlbmd0aCgpKnNpemVvZihGWF9XQ0hBUikpOwotICAgIH0KLX0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6OlJlbGVhc2VCdWZmZXIoRlhfU1RSU0laRSBuTmV3TGVuZ3RoKQotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDb3B5QmVmb3JlV3JpdGUoKTsKLSAgICBpZiAobk5ld0xlbmd0aCA9PSAtMSkgewotICAgICAgICBuTmV3TGVuZ3RoID0gbV9wRGF0YSA/IEZYU1lTX3djc2xlbihtX3BEYXRhLT5tX1N0cmluZykgOiAwOwotICAgIH0KLSAgICBpZiAobk5ld0xlbmd0aCA9PSAwKSB7Ci0gICAgICAgIEVtcHR5KCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhTWVNfYXNzZXJ0KG5OZXdMZW5ndGggPD0gbV9wRGF0YS0+bV9uQWxsb2NMZW5ndGgpOwotICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuTmV3TGVuZ3RoOwotICAgIG1fcERhdGEtPm1fU3RyaW5nW25OZXdMZW5ndGhdID0gMDsKLX0KLWNvbnN0IENGWF9XaWRlU3RyaW5nJiBDRlhfV2lkZVN0cmluZzo6b3BlcmF0b3I9KEZYX0xQQ1dTVFIgbHBzeikKLXsKLSAgICBpZiAobHBzeiA9PSBOVUxMIHx8IGxwc3pbMF0gPT0gMCkgewotICAgICAgICBFbXB0eSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFzc2lnbkNvcHkoRlhTWVNfd2NzbGVuKGxwc3opLCBscHN6KTsKLSAgICB9Ci0gICAgcmV0dXJuICp0aGlzOwotfQotY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIENGWF9XaWRlU3RyaW5nOjpvcGVyYXRvcj0oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHJpbmdTcmMpCi17Ci0gICAgaWYgKHN0cmluZ1NyYy5Jc0VtcHR5KCkpIHsKLSAgICAgICAgRW1wdHkoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBc3NpZ25Db3B5KHN0cmluZ1NyYy5HZXRMZW5ndGgoKSwgc3RyaW5nU3JjLkdldFB0cigpKTsKLSAgICB9Ci0gICAgcmV0dXJuICp0aGlzOwotfQotY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIENGWF9XaWRlU3RyaW5nOjpvcGVyYXRvcj0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZ1NyYykKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBzdHJpbmdTcmMubV9wRGF0YSkgewotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotICAgIGlmIChzdHJpbmdTcmMuSXNFbXB0eSgpKSB7Ci0gICAgICAgIEVtcHR5KCk7Ci0gICAgfSBlbHNlIGlmICgobV9wRGF0YSAmJiBtX3BEYXRhLT5tX25SZWZzIDwgMCkgfHwKLSAgICAgICAgICAgICAgIChzdHJpbmdTcmMubV9wRGF0YSAmJiBzdHJpbmdTcmMubV9wRGF0YS0+bV9uUmVmcyA8IDApKSB7Ci0gICAgICAgIEFzc2lnbkNvcHkoc3RyaW5nU3JjLm1fcERhdGEtPm1fbkRhdGFMZW5ndGgsIHN0cmluZ1NyYy5tX3BEYXRhLT5tX1N0cmluZyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRW1wdHkoKTsKLSAgICAgICAgbV9wRGF0YSA9IHN0cmluZ1NyYy5tX3BEYXRhOwotICAgICAgICBpZiAobV9wRGF0YSkgewotICAgICAgICAgICAgbV9wRGF0YS0+UmV0YWluKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICp0aGlzOwotfQotY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIENGWF9XaWRlU3RyaW5nOjpvcGVyYXRvcis9KEZYX1dDSEFSIGNoKQotewotICAgIENvbmNhdEluUGxhY2UoMSwgJmNoKTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci1jb25zdCBDRlhfV2lkZVN0cmluZyYgQ0ZYX1dpZGVTdHJpbmc6Om9wZXJhdG9yKz0oRlhfTFBDV1NUUiBscHN6KQotewotICAgIGlmIChscHN6KSB7Ci0gICAgICAgIENvbmNhdEluUGxhY2UoRlhTWVNfd2NzbGVuKGxwc3opLCBscHN6KTsKLSAgICB9Ci0gICAgcmV0dXJuICp0aGlzOwotfQotY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIENGWF9XaWRlU3RyaW5nOjpvcGVyYXRvcis9KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcpCi17Ci0gICAgaWYgKHN0cmluZy5tX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgICBDb25jYXRJblBsYWNlKHN0cmluZy5tX3BEYXRhLT5tX25EYXRhTGVuZ3RoLCBzdHJpbmcubV9wRGF0YS0+bV9TdHJpbmcpOwotICAgIHJldHVybiAqdGhpczsKLX0KLWNvbnN0IENGWF9XaWRlU3RyaW5nJiBDRlhfV2lkZVN0cmluZzo6b3BlcmF0b3IrPShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cmluZykKLXsKLSAgICBpZiAoc3RyaW5nLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotICAgIENvbmNhdEluUGxhY2Uoc3RyaW5nLkdldExlbmd0aCgpLCBzdHJpbmcuR2V0UHRyKCkpOwotICAgIHJldHVybiAqdGhpczsKLX0KLWJvb2wgQ0ZYX1dpZGVTdHJpbmc6OkVxdWFsKGNvbnN0IHdjaGFyX3QqIHB0cikgY29uc3QKLXsKLSAgICBpZiAoIW1fcERhdGEpIHsKLSAgICAgICAgcmV0dXJuICFwdHIgfHwgcHRyWzBdID09IEwnXDAnOwotICAgIH0KLSAgICBpZiAoIXB0cikgewotICAgICAgICByZXR1cm4gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9PSAwOwotICAgIH0KLSAgICByZXR1cm4gd2NzbGVuKHB0cikgPT0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAmJgotICAgICAgICAgICAgd21lbWNtcChwdHIsIG1fcERhdGEtPm1fU3RyaW5nLCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKSA9PSAwOwotfQotYm9vbCBDRlhfV2lkZVN0cmluZzo6RXF1YWwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gc3RyLklzRW1wdHkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0ci5HZXRMZW5ndGgoKSA9PSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoICYmCi0gICAgICAgIHdtZW1jbXAoc3RyLkdldFB0cigpLCBtX3BEYXRhLT5tX1N0cmluZywgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgPT0gMDsKLX0KLWJvb2wgQ0ZYX1dpZGVTdHJpbmc6OkVxdWFsKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBvdGhlcikgY29uc3QKLXsKLSAgICBpZiAoSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBvdGhlci5Jc0VtcHR5KCk7Ci0gICAgfQotICAgIGlmIChvdGhlci5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gb3RoZXIubV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9PSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoICYmCi0gICAgICAgIHdtZW1jbXAob3RoZXIubV9wRGF0YS0+bV9TdHJpbmcsCi0gICAgICAgICAgICAgICAgbV9wRGF0YS0+bV9TdHJpbmcsCi0gICAgICAgICAgICAgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgPT0gMDsKLX0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6OkVtcHR5KCkKLXsKLSAgICBpZiAobV9wRGF0YSkgewotICAgICAgICBtX3BEYXRhLT5SZWxlYXNlKCk7Ci0gICAgICAgIG1fcERhdGEgPSBOVUxMOwotICAgIH0KLX0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6OkNvbmNhdEluUGxhY2UoRlhfU1RSU0laRSBuU3JjTGVuLCBGWF9MUENXU1RSIGxwc3pTcmNEYXRhKQotewotICAgIGlmIChuU3JjTGVuID09IDAgfHwgbHBzelNyY0RhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuU3JjTGVuKTsKLSAgICAgICAgaWYgKG1fcERhdGEpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKG1fcERhdGEtPm1fU3RyaW5nLCBscHN6U3JjRGF0YSwgblNyY0xlbiAqIHNpemVvZihGWF9XQ0hBUikpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1fcERhdGEtPm1fblJlZnMgPiAxIHx8IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggKyBuU3JjTGVuID4gbV9wRGF0YS0+bV9uQWxsb2NMZW5ndGgpIHsKLSAgICAgICAgQ29uY2F0Q29weShtX3BEYXRhLT5tX25EYXRhTGVuZ3RoLCBtX3BEYXRhLT5tX1N0cmluZywgblNyY0xlbiwgbHBzelNyY0RhdGEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYU1lTX21lbWNweTMyKG1fcERhdGEtPm1fU3RyaW5nICsgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCwgbHBzelNyY0RhdGEsIG5TcmNMZW4gKiBzaXplb2YoRlhfV0NIQVIpKTsKLSAgICAgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCArPSBuU3JjTGVuOwotICAgICAgICBtX3BEYXRhLT5tX1N0cmluZ1ttX3BEYXRhLT5tX25EYXRhTGVuZ3RoXSA9IDA7Ci0gICAgfQotfQotdm9pZCBDRlhfV2lkZVN0cmluZzo6Q29uY2F0Q29weShGWF9TVFJTSVpFIG5TcmMxTGVuLCBGWF9MUENXU1RSIGxwc3pTcmMxRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSBuU3JjMkxlbiwgRlhfTFBDV1NUUiBscHN6U3JjMkRhdGEpCi17Ci0gICAgRlhfU1RSU0laRSBuTmV3TGVuID0gblNyYzFMZW4gKyBuU3JjMkxlbjsKLSAgICBpZiAobk5ld0xlbiA8PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gRG9uJ3QgcmVsZWFzZSB1bnRpbCBkb25lIGNvcHlpbmcsIG1pZ2h0IGJlIG9uZSBvZiB0aGUgYXJndW1lbnRzLgotICAgIFN0cmluZ0RhdGEqIHBPbGREYXRhID0gbV9wRGF0YTsKLSAgICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5OZXdMZW4pOwotICAgIGlmIChtX3BEYXRhKSB7Ci0gICAgICAgIHdtZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcsIGxwc3pTcmMxRGF0YSwgblNyYzFMZW4pOwotICAgICAgICB3bWVtY3B5KG1fcERhdGEtPm1fU3RyaW5nICsgblNyYzFMZW4sIGxwc3pTcmMyRGF0YSwgblNyYzJMZW4pOwotICAgIH0KLSAgICBwT2xkRGF0YS0+UmVsZWFzZSgpOwotfQotdm9pZCBDRlhfV2lkZVN0cmluZzo6Q29weUJlZm9yZVdyaXRlKCkKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMIHx8IG1fcERhdGEtPm1fblJlZnMgPD0gMSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIFN0cmluZ0RhdGEqIHBEYXRhID0gbV9wRGF0YTsKK0NGWF9XaWRlU3RyaW5nOjp+Q0ZYX1dpZGVTdHJpbmcoKSB7CisgIGlmIChtX3BEYXRhKSB7CiAgICAgbV9wRGF0YS0+UmVsZWFzZSgpOwotICAgIEZYX1NUUlNJWkUgbkRhdGFMZW5ndGggPSBwRGF0YS0+bV9uRGF0YUxlbmd0aDsKLSAgICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5EYXRhTGVuZ3RoKTsKLSAgICBpZiAobV9wRGF0YSAhPSBOVUxMKSB7Ci0gICAgICAgIEZYU1lTX21lbWNweTMyKG1fcERhdGEtPm1fU3RyaW5nLCBwRGF0YS0+bV9TdHJpbmcsIChuRGF0YUxlbmd0aCArIDEpICogc2l6ZW9mKEZYX1dDSEFSKSk7Ci0gICAgfQorICB9CiB9Ci12b2lkIENGWF9XaWRlU3RyaW5nOjpBbGxvY0JlZm9yZVdyaXRlKEZYX1NUUlNJWkUgbkxlbikKLXsKLSAgICBpZiAobV9wRGF0YSAmJiBtX3BEYXRhLT5tX25SZWZzIDw9IDEgJiYgbV9wRGF0YS0+bV9uQWxsb2NMZW5ndGggPj0gbkxlbikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEVtcHR5KCk7CitDRlhfV2lkZVN0cmluZzo6Q0ZYX1dpZGVTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZ1NyYykgeworICBpZiAoIXN0cmluZ1NyYy5tX3BEYXRhKSB7CisgICAgbV9wRGF0YSA9IE5VTEw7CisgICAgcmV0dXJuOworICB9CisgIGlmIChzdHJpbmdTcmMubV9wRGF0YS0+bV9uUmVmcyA+PSAwKSB7CisgICAgbV9wRGF0YSA9IHN0cmluZ1NyYy5tX3BEYXRhOworICAgIG1fcERhdGEtPlJldGFpbigpOworICB9IGVsc2UgeworICAgIG1fcERhdGEgPSBOVUxMOworICAgICp0aGlzID0gc3RyaW5nU3JjOworICB9Cit9CitDRlhfV2lkZVN0cmluZzo6Q0ZYX1dpZGVTdHJpbmcoY29uc3QgRlhfV0NIQVIqIGxwc3osIEZYX1NUUlNJWkUgbkxlbikgeworICBpZiAobkxlbiA8IDApIHsKKyAgICBuTGVuID0gbHBzeiA/IEZYU1lTX3djc2xlbihscHN6KSA6IDA7CisgIH0KKyAgaWYgKG5MZW4pIHsKICAgICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5MZW4pOwotfQotdm9pZCBDRlhfV2lkZVN0cmluZzo6QXNzaWduQ29weShGWF9TVFJTSVpFIG5TcmNMZW4sIEZYX0xQQ1dTVFIgbHBzelNyY0RhdGEpCi17Ci0gICAgQWxsb2NCZWZvcmVXcml0ZShuU3JjTGVuKTsKLSAgICBGWFNZU19tZW1jcHkzMihtX3BEYXRhLT5tX1N0cmluZywgbHBzelNyY0RhdGEsIG5TcmNMZW4gKiBzaXplb2YoRlhfV0NIQVIpKTsKLSAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gblNyY0xlbjsKLSAgICBtX3BEYXRhLT5tX1N0cmluZ1tuU3JjTGVuXSA9IDA7Ci19Ci1pbnQgQ0ZYX1dpZGVTdHJpbmc6OkNvbXBhcmUoRlhfTFBDV1NUUiBscHN6KSBjb25zdAotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIChscHN6ID09IE5VTEwgfHwgbHBzelswXSA9PSAwKSA/IDAgOiAtMTsKKyAgICBpZiAobV9wRGF0YSkgeworICAgICAgRlhTWVNfbWVtY3B5KG1fcERhdGEtPm1fU3RyaW5nLCBscHN6LCBuTGVuICogc2l6ZW9mKEZYX1dDSEFSKSk7CiAgICAgfQorICB9IGVsc2UgeworICAgIG1fcERhdGEgPSBOVUxMOworICB9Cit9CitDRlhfV2lkZVN0cmluZzo6Q0ZYX1dpZGVTdHJpbmcoRlhfV0NIQVIgY2gpIHsKKyAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZSgxKTsKKyAgaWYgKG1fcERhdGEpIHsKKyAgICBtX3BEYXRhLT5tX1N0cmluZ1swXSA9IGNoOworICB9Cit9CitDRlhfV2lkZVN0cmluZzo6Q0ZYX1dpZGVTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIpIHsKKyAgaWYgKHN0ci5Jc0VtcHR5KCkpIHsKKyAgICBtX3BEYXRhID0gTlVMTDsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShzdHIuR2V0TGVuZ3RoKCkpOworICBpZiAobV9wRGF0YSkgeworICAgIEZYU1lTX21lbWNweShtX3BEYXRhLT5tX1N0cmluZywgc3RyLkdldFB0cigpLAorICAgICAgICAgICAgICAgICBzdHIuR2V0TGVuZ3RoKCkgKiBzaXplb2YoRlhfV0NIQVIpKTsKKyAgfQorfQorQ0ZYX1dpZGVTdHJpbmc6OkNGWF9XaWRlU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cjIpIHsKKyAgbV9wRGF0YSA9IE5VTEw7CisgIGludCBuTmV3TGVuID0gc3RyMS5HZXRMZW5ndGgoKSArIHN0cjIuR2V0TGVuZ3RoKCk7CisgIGlmIChuTmV3TGVuID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuTmV3TGVuKTsKKyAgaWYgKG1fcERhdGEpIHsKKyAgICBGWFNZU19tZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcsIHN0cjEuR2V0UHRyKCksCisgICAgICAgICAgICAgICAgIHN0cjEuR2V0TGVuZ3RoKCkgKiBzaXplb2YoRlhfV0NIQVIpKTsKKyAgICBGWFNZU19tZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcgKyBzdHIxLkdldExlbmd0aCgpLCBzdHIyLkdldFB0cigpLAorICAgICAgICAgICAgICAgICBzdHIyLkdldExlbmd0aCgpICogc2l6ZW9mKEZYX1dDSEFSKSk7CisgIH0KK30KK3ZvaWQgQ0ZYX1dpZGVTdHJpbmc6OlJlbGVhc2VCdWZmZXIoRlhfU1RSU0laRSBuTmV3TGVuZ3RoKSB7CisgIGlmICghbV9wRGF0YSkgeworICAgIHJldHVybjsKKyAgfQorICBDb3B5QmVmb3JlV3JpdGUoKTsKKyAgaWYgKG5OZXdMZW5ndGggPT0gLTEpIHsKKyAgICBuTmV3TGVuZ3RoID0gbV9wRGF0YSA/IEZYU1lTX3djc2xlbihtX3BEYXRhLT5tX1N0cmluZykgOiAwOworICB9CisgIGlmIChuTmV3TGVuZ3RoID09IDApIHsKKyAgICBFbXB0eSgpOworICAgIHJldHVybjsKKyAgfQorICBGWFNZU19hc3NlcnQobk5ld0xlbmd0aCA8PSBtX3BEYXRhLT5tX25BbGxvY0xlbmd0aCk7CisgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuTmV3TGVuZ3RoOworICBtX3BEYXRhLT5tX1N0cmluZ1tuTmV3TGVuZ3RoXSA9IDA7Cit9Citjb25zdCBDRlhfV2lkZVN0cmluZyYgQ0ZYX1dpZGVTdHJpbmc6Om9wZXJhdG9yPShjb25zdCBGWF9XQ0hBUiogbHBzeikgeworICBpZiAoIWxwc3ogfHwgbHBzelswXSA9PSAwKSB7CisgICAgRW1wdHkoKTsKKyAgfSBlbHNlIHsKKyAgICBBc3NpZ25Db3B5KEZYU1lTX3djc2xlbihscHN6KSwgbHBzeik7CisgIH0KKyAgcmV0dXJuICp0aGlzOworfQorY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIENGWF9XaWRlU3RyaW5nOjpvcGVyYXRvcj0oCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHJpbmdTcmMpIHsKKyAgaWYgKHN0cmluZ1NyYy5Jc0VtcHR5KCkpIHsKKyAgICBFbXB0eSgpOworICB9IGVsc2UgeworICAgIEFzc2lnbkNvcHkoc3RyaW5nU3JjLkdldExlbmd0aCgpLCBzdHJpbmdTcmMuR2V0UHRyKCkpOworICB9CisgIHJldHVybiAqdGhpczsKK30KK2NvbnN0IENGWF9XaWRlU3RyaW5nJiBDRlhfV2lkZVN0cmluZzo6b3BlcmF0b3I9KAorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmdTcmMpIHsKKyAgaWYgKG1fcERhdGEgPT0gc3RyaW5nU3JjLm1fcERhdGEpIHsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaWYgKHN0cmluZ1NyYy5Jc0VtcHR5KCkpIHsKKyAgICBFbXB0eSgpOworICB9IGVsc2UgaWYgKChtX3BEYXRhICYmIG1fcERhdGEtPm1fblJlZnMgPCAwKSB8fAorICAgICAgICAgICAgIChzdHJpbmdTcmMubV9wRGF0YSAmJiBzdHJpbmdTcmMubV9wRGF0YS0+bV9uUmVmcyA8IDApKSB7CisgICAgQXNzaWduQ29weShzdHJpbmdTcmMubV9wRGF0YS0+bV9uRGF0YUxlbmd0aCwgc3RyaW5nU3JjLm1fcERhdGEtPm1fU3RyaW5nKTsKKyAgfSBlbHNlIHsKKyAgICBFbXB0eSgpOworICAgIG1fcERhdGEgPSBzdHJpbmdTcmMubV9wRGF0YTsKKyAgICBpZiAobV9wRGF0YSkgeworICAgICAgbV9wRGF0YS0+UmV0YWluKCk7CisgICAgfQorICB9CisgIHJldHVybiAqdGhpczsKK30KK2NvbnN0IENGWF9XaWRlU3RyaW5nJiBDRlhfV2lkZVN0cmluZzo6b3BlcmF0b3IrPShGWF9XQ0hBUiBjaCkgeworICBDb25jYXRJblBsYWNlKDEsICZjaCk7CisgIHJldHVybiAqdGhpczsKK30KK2NvbnN0IENGWF9XaWRlU3RyaW5nJiBDRlhfV2lkZVN0cmluZzo6b3BlcmF0b3IrPShjb25zdCBGWF9XQ0hBUiogbHBzeikgeworICBpZiAobHBzeikgeworICAgIENvbmNhdEluUGxhY2UoRlhTWVNfd2NzbGVuKGxwc3opLCBscHN6KTsKKyAgfQorICByZXR1cm4gKnRoaXM7Cit9Citjb25zdCBDRlhfV2lkZVN0cmluZyYgQ0ZYX1dpZGVTdHJpbmc6Om9wZXJhdG9yKz0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZykgeworICBpZiAoIXN0cmluZy5tX3BEYXRhKSB7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIENvbmNhdEluUGxhY2Uoc3RyaW5nLm1fcERhdGEtPm1fbkRhdGFMZW5ndGgsIHN0cmluZy5tX3BEYXRhLT5tX1N0cmluZyk7CisgIHJldHVybiAqdGhpczsKK30KK2NvbnN0IENGWF9XaWRlU3RyaW5nJiBDRlhfV2lkZVN0cmluZzo6b3BlcmF0b3IrPSgKKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cmluZykgeworICBpZiAoc3RyaW5nLklzRW1wdHkoKSkgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBDb25jYXRJblBsYWNlKHN0cmluZy5HZXRMZW5ndGgoKSwgc3RyaW5nLkdldFB0cigpKTsKKyAgcmV0dXJuICp0aGlzOworfQorYm9vbCBDRlhfV2lkZVN0cmluZzo6RXF1YWwoY29uc3Qgd2NoYXJfdCogcHRyKSBjb25zdCB7CisgIGlmICghbV9wRGF0YSkgeworICAgIHJldHVybiAhcHRyIHx8IHB0clswXSA9PSBMJ1wwJzsKKyAgfQorICBpZiAoIXB0cikgeworICAgIHJldHVybiBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID09IDA7CisgIH0KKyAgcmV0dXJuIHdjc2xlbihwdHIpID09IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggJiYKKyAgICAgICAgIHdtZW1jbXAocHRyLCBtX3BEYXRhLT5tX1N0cmluZywgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgPT0gMDsKK30KK2Jvb2wgQ0ZYX1dpZGVTdHJpbmc6OkVxdWFsKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKSBjb25zdCB7CisgIGlmICghbV9wRGF0YSkgeworICAgIHJldHVybiBzdHIuSXNFbXB0eSgpOworICB9CisgIHJldHVybiBzdHIuR2V0TGVuZ3RoKCkgPT0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAmJgorICAgICAgICAgd21lbWNtcChzdHIuR2V0UHRyKCksIG1fcERhdGEtPm1fU3RyaW5nLCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKSA9PSAwOworfQorYm9vbCBDRlhfV2lkZVN0cmluZzo6RXF1YWwoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG90aGVyKSBjb25zdCB7CisgIGlmIChJc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gb3RoZXIuSXNFbXB0eSgpOworICB9CisgIGlmIChvdGhlci5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIG90aGVyLm1fcERhdGEtPm1fbkRhdGFMZW5ndGggPT0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAmJgorICAgICAgICAgd21lbWNtcChvdGhlci5tX3BEYXRhLT5tX1N0cmluZywgbV9wRGF0YS0+bV9TdHJpbmcsCisgICAgICAgICAgICAgICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpID09IDA7Cit9Cit2b2lkIENGWF9XaWRlU3RyaW5nOjpFbXB0eSgpIHsKKyAgaWYgKG1fcERhdGEpIHsKKyAgICBtX3BEYXRhLT5SZWxlYXNlKCk7CisgICAgbV9wRGF0YSA9IE5VTEw7CisgIH0KK30KK3ZvaWQgQ0ZYX1dpZGVTdHJpbmc6OkNvbmNhdEluUGxhY2UoRlhfU1RSU0laRSBuU3JjTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBzelNyY0RhdGEpIHsKKyAgaWYgKG5TcmNMZW4gPT0gMCB8fCAhbHBzelNyY0RhdGEpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFtX3BEYXRhKSB7CisgICAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuU3JjTGVuKTsKKyAgICBpZiAobV9wRGF0YSkgeworICAgICAgRlhTWVNfbWVtY3B5KG1fcERhdGEtPm1fU3RyaW5nLCBscHN6U3JjRGF0YSwgblNyY0xlbiAqIHNpemVvZihGWF9XQ0hBUikpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fcERhdGEtPm1fblJlZnMgPiAxIHx8CisgICAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoICsgblNyY0xlbiA+IG1fcERhdGEtPm1fbkFsbG9jTGVuZ3RoKSB7CisgICAgQ29uY2F0Q29weShtX3BEYXRhLT5tX25EYXRhTGVuZ3RoLCBtX3BEYXRhLT5tX1N0cmluZywgblNyY0xlbiwgbHBzelNyY0RhdGEpOworICB9IGVsc2UgeworICAgIEZYU1lTX21lbWNweShtX3BEYXRhLT5tX1N0cmluZyArIG1fcERhdGEtPm1fbkRhdGFMZW5ndGgsIGxwc3pTcmNEYXRhLAorICAgICAgICAgICAgICAgICBuU3JjTGVuICogc2l6ZW9mKEZYX1dDSEFSKSk7CisgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCArPSBuU3JjTGVuOworICAgIG1fcERhdGEtPm1fU3RyaW5nW21fcERhdGEtPm1fbkRhdGFMZW5ndGhdID0gMDsKKyAgfQorfQordm9pZCBDRlhfV2lkZVN0cmluZzo6Q29uY2F0Q29weShGWF9TVFJTSVpFIG5TcmMxTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBzelNyYzFEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFIG5TcmMyTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBzelNyYzJEYXRhKSB7CisgIEZYX1NUUlNJWkUgbk5ld0xlbiA9IG5TcmMxTGVuICsgblNyYzJMZW47CisgIGlmIChuTmV3TGVuIDw9IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gRG9uJ3QgcmVsZWFzZSB1bnRpbCBkb25lIGNvcHlpbmcsIG1pZ2h0IGJlIG9uZSBvZiB0aGUgYXJndW1lbnRzLgorICBTdHJpbmdEYXRhKiBwT2xkRGF0YSA9IG1fcERhdGE7CisgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobk5ld0xlbik7CisgIGlmIChtX3BEYXRhKSB7CisgICAgd21lbWNweShtX3BEYXRhLT5tX1N0cmluZywgbHBzelNyYzFEYXRhLCBuU3JjMUxlbik7CisgICAgd21lbWNweShtX3BEYXRhLT5tX1N0cmluZyArIG5TcmMxTGVuLCBscHN6U3JjMkRhdGEsIG5TcmMyTGVuKTsKKyAgfQorICBwT2xkRGF0YS0+UmVsZWFzZSgpOworfQordm9pZCBDRlhfV2lkZVN0cmluZzo6Q29weUJlZm9yZVdyaXRlKCkgeworICBpZiAoIW1fcERhdGEgfHwgbV9wRGF0YS0+bV9uUmVmcyA8PSAxKSB7CisgICAgcmV0dXJuOworICB9CisgIFN0cmluZ0RhdGEqIHBEYXRhID0gbV9wRGF0YTsKKyAgbV9wRGF0YS0+UmVsZWFzZSgpOworICBGWF9TVFJTSVpFIG5EYXRhTGVuZ3RoID0gcERhdGEtPm1fbkRhdGFMZW5ndGg7CisgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobkRhdGFMZW5ndGgpOworICBpZiAobV9wRGF0YSkgeworICAgIEZYU1lTX21lbWNweShtX3BEYXRhLT5tX1N0cmluZywgcERhdGEtPm1fU3RyaW5nLAorICAgICAgICAgICAgICAgICAobkRhdGFMZW5ndGggKyAxKSAqIHNpemVvZihGWF9XQ0hBUikpOworICB9Cit9Cit2b2lkIENGWF9XaWRlU3RyaW5nOjpBbGxvY0JlZm9yZVdyaXRlKEZYX1NUUlNJWkUgbkxlbikgeworICBpZiAobV9wRGF0YSAmJiBtX3BEYXRhLT5tX25SZWZzIDw9IDEgJiYgbV9wRGF0YS0+bV9uQWxsb2NMZW5ndGggPj0gbkxlbikgeworICAgIHJldHVybjsKKyAgfQorICBFbXB0eSgpOworICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5MZW4pOworfQordm9pZCBDRlhfV2lkZVN0cmluZzo6QXNzaWduQ29weShGWF9TVFJTSVpFIG5TcmNMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBscHN6U3JjRGF0YSkgeworICBBbGxvY0JlZm9yZVdyaXRlKG5TcmNMZW4pOworICBGWFNZU19tZW1jcHkobV9wRGF0YS0+bV9TdHJpbmcsIGxwc3pTcmNEYXRhLCBuU3JjTGVuICogc2l6ZW9mKEZYX1dDSEFSKSk7CisgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuU3JjTGVuOworICBtX3BEYXRhLT5tX1N0cmluZ1tuU3JjTGVuXSA9IDA7Cit9CitpbnQgQ0ZYX1dpZGVTdHJpbmc6OkNvbXBhcmUoY29uc3QgRlhfV0NIQVIqIGxwc3opIGNvbnN0IHsKKyAgaWYgKG1fcERhdGEpCiAgICAgcmV0dXJuIEZYU1lTX3djc2NtcChtX3BEYXRhLT5tX1N0cmluZywgbHBzeik7CisgIHJldHVybiAoIWxwc3ogfHwgbHBzelswXSA9PSAwKSA/IDAgOiAtMTsKIH0KLUNGWF9CeXRlU3RyaW5nIENGWF9XaWRlU3RyaW5nOjpVVEY4RW5jb2RlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gRlhfVVRGOEVuY29kZSgqdGhpcyk7CitDRlhfQnl0ZVN0cmluZyBDRlhfV2lkZVN0cmluZzo6VVRGOEVuY29kZSgpIGNvbnN0IHsKKyAgcmV0dXJuIEZYX1VURjhFbmNvZGUoKnRoaXMpOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ0ZYX1dpZGVTdHJpbmc6OlVURjE2TEVfRW5jb2RlKCkgY29uc3QKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhGWF9CU1RSQygiXDBcMCIpKTsKLSAgICB9Ci0gICAgaW50IGxlbiA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0OwotICAgIEZYX0xQU1RSIGJ1ZmZlciA9IHJlc3VsdC5HZXRCdWZmZXIobGVuICogMiArIDIpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpICsrKSB7Ci0gICAgICAgIGJ1ZmZlcltpICogMl0gPSBtX3BEYXRhLT5tX1N0cmluZ1tpXSAmIDB4ZmY7Ci0gICAgICAgIGJ1ZmZlcltpICogMiArIDFdID0gbV9wRGF0YS0+bV9TdHJpbmdbaV0gPj4gODsKLSAgICB9Ci0gICAgYnVmZmVyW2xlbiAqIDJdID0gMDsKLSAgICBidWZmZXJbbGVuICogMiArIDFdID0gMDsKLSAgICByZXN1bHQuUmVsZWFzZUJ1ZmZlcihsZW4gKiAyICsgMik7Ci0gICAgcmV0dXJuIHJlc3VsdDsKK0NGWF9CeXRlU3RyaW5nIENGWF9XaWRlU3RyaW5nOjpVVEYxNkxFX0VuY29kZSgpIGNvbnN0IHsKKyAgaWYgKCFtX3BEYXRhKSB7CisgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCJcMFwwIiwgMik7CisgIH0KKyAgaW50IGxlbiA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7CisgIENGWF9CeXRlU3RyaW5nIHJlc3VsdDsKKyAgRlhfQ0hBUiogYnVmZmVyID0gcmVzdWx0LkdldEJ1ZmZlcihsZW4gKiAyICsgMik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBidWZmZXJbaSAqIDJdID0gbV9wRGF0YS0+bV9TdHJpbmdbaV0gJiAweGZmOworICAgIGJ1ZmZlcltpICogMiArIDFdID0gbV9wRGF0YS0+bV9TdHJpbmdbaV0gPj4gODsKKyAgfQorICBidWZmZXJbbGVuICogMl0gPSAwOworICBidWZmZXJbbGVuICogMiArIDFdID0gMDsKKyAgcmVzdWx0LlJlbGVhc2VCdWZmZXIobGVuICogMiArIDIpOworICByZXR1cm4gcmVzdWx0OwogfQotdm9pZCBDRlhfV2lkZVN0cmluZzo6Q29udmVydEZyb20oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0ciwgQ0ZYX0NoYXJNYXAqIHBDaGFyTWFwKQotewotICAgIGlmIChwQ2hhck1hcCA9PSBOVUxMKSB7Ci0gICAgICAgIHBDaGFyTWFwID0gQ0ZYX0NoYXJNYXA6OkdldERlZmF1bHRNYXBwZXIoKTsKLSAgICB9Ci0gICAgKnRoaXMgPSBwQ2hhck1hcC0+bV9HZXRXaWRlU3RyaW5nKHBDaGFyTWFwLCBzdHIpOwordm9pZCBDRlhfV2lkZVN0cmluZzo6Q29udmVydEZyb20oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9DaGFyTWFwKiBwQ2hhck1hcCkgeworICBpZiAoIXBDaGFyTWFwKSB7CisgICAgcENoYXJNYXAgPSBDRlhfQ2hhck1hcDo6R2V0RGVmYXVsdE1hcHBlcigpOworICB9CisgICp0aGlzID0gcENoYXJNYXAtPm1fR2V0V2lkZVN0cmluZyhwQ2hhck1hcCwgc3RyKTsKIH0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6OlJlc2VydmUoRlhfU1RSU0laRSBsZW4pCi17Ci0gICAgR2V0QnVmZmVyKGxlbik7Ci0gICAgUmVsZWFzZUJ1ZmZlcihHZXRMZW5ndGgoKSk7Cit2b2lkIENGWF9XaWRlU3RyaW5nOjpSZXNlcnZlKEZYX1NUUlNJWkUgbGVuKSB7CisgIEdldEJ1ZmZlcihsZW4pOworICBSZWxlYXNlQnVmZmVyKEdldExlbmd0aCgpKTsKIH0KLUZYX0xQV1NUUiBDRlhfV2lkZVN0cmluZzo6R2V0QnVmZmVyKEZYX1NUUlNJWkUgbk1pbkJ1Zkxlbmd0aCkKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMICYmIG5NaW5CdWZMZW5ndGggPT0gMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKG1fcERhdGEgJiYgbV9wRGF0YS0+bV9uUmVmcyA8PSAxICYmIG1fcERhdGEtPm1fbkFsbG9jTGVuZ3RoID49IG5NaW5CdWZMZW5ndGgpIHsKLSAgICAgICAgcmV0dXJuIG1fcERhdGEtPm1fU3RyaW5nOwotICAgIH0KLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobk1pbkJ1Zkxlbmd0aCk7Ci0gICAgICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IDA7Ci0gICAgICAgIG1fcERhdGEtPm1fU3RyaW5nWzBdID0gMDsKLSAgICAgICAgcmV0dXJuIG1fcERhdGEtPm1fU3RyaW5nOwotICAgIH0KLSAgICBTdHJpbmdEYXRhKiBwT2xkRGF0YSA9IG1fcERhdGE7Ci0gICAgRlhfU1RSU0laRSBuT2xkTGVuID0gcE9sZERhdGEtPm1fbkRhdGFMZW5ndGg7Ci0gICAgaWYgKG5NaW5CdWZMZW5ndGggPCBuT2xkTGVuKSB7Ci0gICAgICAgIG5NaW5CdWZMZW5ndGggPSBuT2xkTGVuOwotICAgIH0KK0ZYX1dDSEFSKiBDRlhfV2lkZVN0cmluZzo6R2V0QnVmZmVyKEZYX1NUUlNJWkUgbk1pbkJ1Zkxlbmd0aCkgeworICBpZiAoIW1fcERhdGEgJiYgbk1pbkJ1Zkxlbmd0aCA9PSAwKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKG1fcERhdGEgJiYgbV9wRGF0YS0+bV9uUmVmcyA8PSAxICYmCisgICAgICBtX3BEYXRhLT5tX25BbGxvY0xlbmd0aCA+PSBuTWluQnVmTGVuZ3RoKSB7CisgICAgcmV0dXJuIG1fcERhdGEtPm1fU3RyaW5nOworICB9CisgIGlmICghbV9wRGF0YSkgewogICAgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobk1pbkJ1Zkxlbmd0aCk7CiAgICAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIEZYU1lTX21lbWNweTMyKG1fcERhdGEtPm1fU3RyaW5nLCBwT2xkRGF0YS0+bV9TdHJpbmcsIChuT2xkTGVuICsgMSkqc2l6ZW9mKEZYX1dDSEFSKSk7Ci0gICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IG5PbGRMZW47Ci0gICAgcE9sZERhdGEtPlJlbGVhc2UoKTsKKyAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gMDsKKyAgICBtX3BEYXRhLT5tX1N0cmluZ1swXSA9IDA7CiAgICAgcmV0dXJuIG1fcERhdGEtPm1fU3RyaW5nOwotfQotQ0ZYX1dpZGVTdHJpbmcgQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChjb25zdCBjaGFyKiBzdHIsIEZYX1NUUlNJWkUgbGVuKQotewotICAgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKLSAgICByZXN1bHQuQ29udmVydEZyb20oQ0ZYX0J5dGVTdHJpbmcoc3RyLCBsZW4pKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotQ0ZYX1dpZGVTdHJpbmcgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGNvbnN0IGNoYXIqIHN0ciwgRlhfU1RSU0laRSBsZW4pCi17Ci0gICAgaWYgKCFzdHIgfHwgMCA9PSBsZW4pIHsKLSAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQ0ZYX1VURjhEZWNvZGVyIGRlY29kZXI7Ci0gICAgZm9yIChGWF9TVFJTSVpFIGkgPSAwOyBpIDwgbGVuOyBpICsrKSB7Ci0gICAgICAgIGRlY29kZXIuSW5wdXQoc3RyW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuIGRlY29kZXIuR2V0UmVzdWx0KCk7Ci19Ci1DRlhfV2lkZVN0cmluZyBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoY29uc3QgdW5zaWduZWQgc2hvcnQqIHdzdHIsIEZYX1NUUlNJWkUgd2xlbikKLXsKLSAgICBpZiAoIXdzdHIgfHwgMCA9PSB3bGVuKSB7Ci0gICAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotICAgIH0KLQotICAgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKLSAgICBGWF9XQ0hBUiogYnVmID0gcmVzdWx0LkdldEJ1ZmZlcih3bGVuKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHdsZW47IGkgKyspIHsKLSAgICAgICAgYnVmW2ldID0gd3N0cltpXTsKLSAgICB9Ci0gICAgcmVzdWx0LlJlbGVhc2VCdWZmZXIod2xlbik7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLUZYX1NUUlNJWkUgQ0ZYX1dpZGVTdHJpbmc6OldTdHJpbmdMZW5ndGgoY29uc3QgdW5zaWduZWQgc2hvcnQqIHN0cikKLXsKLSAgICBGWF9TVFJTSVpFIGxlbiA9IDA7Ci0gICAgaWYgKHN0cikKLSAgICAgICAgd2hpbGUgKHN0cltsZW5dKSBsZW4rKzsKLSAgICByZXR1cm4gbGVuOwotfQotCi0KLQotdm9pZCBDRlhfV2lkZVN0cmluZzo6QWxsb2NDb3B5KENGWF9XaWRlU3RyaW5nJiBkZXN0LCBGWF9TVFJTSVpFIG5Db3B5TGVuLCBGWF9TVFJTSVpFIG5Db3B5SW5kZXgpIGNvbnN0Ci17Ci0gICAgLy8gfEZYX1NUUlNJWkV8IGlzIGN1cnJlbnRseSB0eXBlZGVmJ2QgYXMgaW4gfGludHwuIFRPRE8ocGFsbWVyKTogSXQKLSAgICAvLyBzaG91bGQgYmUgYSB8c2l6ZV90fCwgb3IgYXQgbGVhc3QgdW5zaWduZWQuCi0gICAgaWYgKG5Db3B5TGVuID09IDAgfHwgbkNvcHlMZW4gPCAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxGWF9TVFJTSVpFPiBpU2l6ZSA9IHN0YXRpY19jYXN0PEZYX1NUUlNJWkU+KHNpemVvZihGWF9XQ0hBUikpOwotICAgIGlTaXplICo9IG5Db3B5TGVuOwotICAgIEFTU0VSVChkZXN0Lm1fcERhdGEgPT0gTlVMTCk7Ci0gICAgZGVzdC5tX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5Db3B5TGVuKTsKLSAgICBpZiAoZGVzdC5tX3BEYXRhKSB7Ci0gICAgICAgIEZYU1lTX21lbWNweTMyKGRlc3QubV9wRGF0YS0+bV9TdHJpbmcsIG1fcERhdGEtPm1fU3RyaW5nICsgbkNvcHlJbmRleCwgaVNpemUuVmFsdWVPckRpZSgpKTsKLSAgICB9Ci19Ci1DRlhfV2lkZVN0cmluZyBDRlhfV2lkZVN0cmluZzo6TGVmdChGWF9TVFJTSVpFIG5Db3VudCkgY29uc3QKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotICAgIH0KLSAgICBpZiAobkNvdW50IDwgMCkgewotICAgICAgICBuQ291bnQgPSAwOwotICAgIH0KLSAgICBpZiAobkNvdW50ID49IG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpIHsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgICBDRlhfV2lkZVN0cmluZyBkZXN0OwotICAgIEFsbG9jQ29weShkZXN0LCBuQ291bnQsIDApOwotICAgIHJldHVybiBkZXN0OwotfQotQ0ZYX1dpZGVTdHJpbmcgQ0ZYX1dpZGVTdHJpbmc6Ok1pZChGWF9TVFJTSVpFIG5GaXJzdCkgY29uc3QKLXsKLSAgICByZXR1cm4gTWlkKG5GaXJzdCwgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAtIG5GaXJzdCk7Ci19Ci1DRlhfV2lkZVN0cmluZyBDRlhfV2lkZVN0cmluZzo6TWlkKEZYX1NUUlNJWkUgbkZpcnN0LCBGWF9TVFJTSVpFIG5Db3VudCkgY29uc3QKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotICAgIH0KLSAgICBpZiAobkZpcnN0IDwgMCkgewotICAgICAgICBuRmlyc3QgPSAwOwotICAgIH0KLSAgICBpZiAobkNvdW50IDwgMCkgewotICAgICAgICBuQ291bnQgPSAwOwotICAgIH0KLSAgICBpZiAobkZpcnN0ICsgbkNvdW50ID4gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgewotICAgICAgICBuQ291bnQgPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIC0gbkZpcnN0OwotICAgIH0KLSAgICBpZiAobkZpcnN0ID4gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgewotICAgICAgICBuQ291bnQgPSAwOwotICAgIH0KLSAgICBpZiAobkZpcnN0ID09IDAgJiYgbkZpcnN0ICsgbkNvdW50ID09IG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpIHsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgICBDRlhfV2lkZVN0cmluZyBkZXN0OwotICAgIEFsbG9jQ29weShkZXN0LCBuQ291bnQsIG5GaXJzdCk7Ci0gICAgcmV0dXJuIGRlc3Q7Ci19Ci1DRlhfV2lkZVN0cmluZyBDRlhfV2lkZVN0cmluZzo6UmlnaHQoRlhfU1RSU0laRSBuQ291bnQpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgICB9Ci0gICAgaWYgKG5Db3VudCA8IDApIHsKLSAgICAgICAgbkNvdW50ID0gMDsKLSAgICB9Ci0gICAgaWYgKG5Db3VudCA+PSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKSB7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgZGVzdDsKLSAgICBBbGxvY0NvcHkoZGVzdCwgbkNvdW50LCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIC0gbkNvdW50KTsKLSAgICByZXR1cm4gZGVzdDsKLX0KLWludCBDRlhfV2lkZVN0cmluZzo6Q29tcGFyZU5vQ2FzZShGWF9MUENXU1RSIGxwc3opIGNvbnN0Ci17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gKGxwc3ogPT0gTlVMTCB8fCBscHN6WzBdID09IDApID8gMCA6IC0xOwotICAgIH0KLSAgICByZXR1cm4gRlhTWVNfd2NzaWNtcChtX3BEYXRhLT5tX1N0cmluZywgbHBzeik7Ci19Ci1pbnQgQ0ZYX1dpZGVTdHJpbmc6OkNvbXBhcmUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikgY29uc3QKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChzdHIubV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmIChzdHIubV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpbnQgdGhpc19sZW4gPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOwotICAgIGludCB0aGF0X2xlbiA9IHN0ci5tX3BEYXRhLT5tX25EYXRhTGVuZ3RoOwotICAgIGludCBtaW5fbGVuID0gdGhpc19sZW4gPCB0aGF0X2xlbiA/IHRoaXNfbGVuIDogdGhhdF9sZW47Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaW5fbGVuOyBpICsrKSB7Ci0gICAgICAgIGlmIChtX3BEYXRhLT5tX1N0cmluZ1tpXSA8IHN0ci5tX3BEYXRhLT5tX1N0cmluZ1tpXSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9IGVsc2UgaWYgKG1fcERhdGEtPm1fU3RyaW5nW2ldID4gc3RyLm1fcERhdGEtPm1fU3RyaW5nW2ldKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAodGhpc19sZW4gPCB0aGF0X2xlbikgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmICh0aGlzX2xlbiA+IHRoYXRfbGVuKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6OlNldEF0KEZYX1NUUlNJWkUgbkluZGV4LCBGWF9XQ0hBUiBjaCkKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQVNTRVJUKG5JbmRleCA+PSAwKTsKLSAgICBBU1NFUlQobkluZGV4IDwgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCk7Ci0gICAgQ29weUJlZm9yZVdyaXRlKCk7Ci0gICAgbV9wRGF0YS0+bV9TdHJpbmdbbkluZGV4XSA9IGNoOwotfQotdm9pZCBDRlhfV2lkZVN0cmluZzo6TWFrZUxvd2VyKCkKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ29weUJlZm9yZVdyaXRlKCk7Ci0gICAgaWYgKEdldExlbmd0aCgpIDwgMSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYU1lTX3djc2x3cihtX3BEYXRhLT5tX1N0cmluZyk7Ci19Ci12b2lkIENGWF9XaWRlU3RyaW5nOjpNYWtlVXBwZXIoKQotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDb3B5QmVmb3JlV3JpdGUoKTsKLSAgICBpZiAoR2V0TGVuZ3RoKCkgPCAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhTWVNfd2NzdXByKG1fcERhdGEtPm1fU3RyaW5nKTsKLX0KLUZYX1NUUlNJWkUgQ0ZYX1dpZGVTdHJpbmc6OkZpbmQoRlhfTFBDV1NUUiBscHN6U3ViLCBGWF9TVFJTSVpFIG5TdGFydCkgY29uc3QKLXsKLSAgICBGWF9TVFJTSVpFIG5MZW5ndGggPSBHZXRMZW5ndGgoKTsKLSAgICBpZiAobkxlbmd0aCA8IDEgfHwgblN0YXJ0ID4gbkxlbmd0aCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIEZYX0xQQ1dTVFIgbHBzeiA9IEZYU1lTX3djc3N0cihtX3BEYXRhLT5tX1N0cmluZyArIG5TdGFydCwgbHBzelN1Yik7Ci0gICAgcmV0dXJuIChscHN6ID09IE5VTEwpID8gLTEgOiAoaW50KShscHN6IC0gbV9wRGF0YS0+bV9TdHJpbmcpOwotfQotRlhfU1RSU0laRSBDRlhfV2lkZVN0cmluZzo6RmluZChGWF9XQ0hBUiBjaCwgRlhfU1RSU0laRSBuU3RhcnQpIGNvbnN0Ci17Ci0gICAgaWYgKG1fcERhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIEZYX1NUUlNJWkUgbkxlbmd0aCA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7Ci0gICAgaWYgKG5TdGFydCA+PSBuTGVuZ3RoKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgRlhfTFBDV1NUUiBscHN6ID0gRlhTWVNfd2NzY2hyKG1fcERhdGEtPm1fU3RyaW5nICsgblN0YXJ0LCBjaCk7Ci0gICAgcmV0dXJuIChscHN6ID09IE5VTEwpID8gLTEgOiAoaW50KShscHN6IC0gbV9wRGF0YS0+bV9TdHJpbmcpOwotfQotdm9pZCBDRlhfV2lkZVN0cmluZzo6VHJpbVJpZ2h0KEZYX0xQQ1dTVFIgbHBzelRhcmdldExpc3QpCi17Ci0gICAgRlhTWVNfYXNzZXJ0KGxwc3pUYXJnZXRMaXN0ICE9IE5VTEwpOwotICAgIGlmIChtX3BEYXRhID09IE5VTEwgfHwgKmxwc3pUYXJnZXRMaXN0ID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDb3B5QmVmb3JlV3JpdGUoKTsKLSAgICBGWF9TVFJTSVpFIGxlbiA9IEdldExlbmd0aCgpOwotICAgIGlmIChsZW4gPCAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfU1RSU0laRSBwb3MgPSBsZW47Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBpZiAoRlhTWVNfd2NzY2hyKGxwc3pUYXJnZXRMaXN0LCBtX3BEYXRhLT5tX1N0cmluZ1twb3MgLSAxXSkgPT0gTlVMTCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcG9zIC0tOwotICAgIH0KLSAgICBpZiAocG9zIDwgbGVuKSB7Ci0gICAgICAgIG1fcERhdGEtPm1fU3RyaW5nW3Bvc10gPSAwOwotICAgICAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gcG9zOwotICAgIH0KLX0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6OlRyaW1SaWdodChGWF9XQ0hBUiBjaFRhcmdldCkKLXsKLSAgICBGWF9XQ0hBUiBzdHJbMl0gPSB7Y2hUYXJnZXQsIDB9OwotICAgIFRyaW1SaWdodChzdHIpOwotfQotdm9pZCBDRlhfV2lkZVN0cmluZzo6VHJpbVJpZ2h0KCkKLXsKLSAgICBUcmltUmlnaHQoTCJceDA5XHgwYVx4MGJceDBjXHgwZFx4MjAiKTsKLX0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6OlRyaW1MZWZ0KEZYX0xQQ1dTVFIgbHBzelRhcmdldHMpCi17Ci0gICAgRlhTWVNfYXNzZXJ0KGxwc3pUYXJnZXRzICE9IE5VTEwpOwotICAgIGlmIChtX3BEYXRhID09IE5VTEwgfHwgKmxwc3pUYXJnZXRzID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDb3B5QmVmb3JlV3JpdGUoKTsKLSAgICBpZiAoR2V0TGVuZ3RoKCkgPCAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfTFBDV1NUUiBscHN6ID0gbV9wRGF0YS0+bV9TdHJpbmc7Ci0gICAgd2hpbGUgKCpscHN6ICE9IDApIHsKLSAgICAgICAgaWYgKEZYU1lTX3djc2NocihscHN6VGFyZ2V0cywgKmxwc3opID09IE5VTEwpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGxwc3ogKys7Ci0gICAgfQotICAgIGlmIChscHN6ICE9IG1fcERhdGEtPm1fU3RyaW5nKSB7Ci0gICAgICAgIGludCBuRGF0YUxlbmd0aCA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggLSAoRlhfU1RSU0laRSkobHBzeiAtIG1fcERhdGEtPm1fU3RyaW5nKTsKLSAgICAgICAgRlhTWVNfbWVtbW92ZTMyKG1fcERhdGEtPm1fU3RyaW5nLCBscHN6LCAobkRhdGFMZW5ndGggKyAxKSpzaXplb2YoRlhfV0NIQVIpKTsKLSAgICAgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IG5EYXRhTGVuZ3RoOwotICAgIH0KLX0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6OlRyaW1MZWZ0KEZYX1dDSEFSIGNoVGFyZ2V0KQotewotICAgIEZYX1dDSEFSIHN0clsyXSA9IHtjaFRhcmdldCwgMH07Ci0gICAgVHJpbUxlZnQoc3RyKTsKLX0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6OlRyaW1MZWZ0KCkKLXsKLSAgICBUcmltTGVmdChMIlx4MDlceDBhXHgwYlx4MGNceDBkXHgyMCIpOwotfQotRlhfU1RSU0laRSBDRlhfV2lkZVN0cmluZzo6UmVwbGFjZShGWF9MUENXU1RSIGxwc3pPbGQsIEZYX0xQQ1dTVFIgbHBzek5ldykKLXsKLSAgICBpZiAoR2V0TGVuZ3RoKCkgPCAxKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAobHBzek9sZCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBGWF9TVFJTSVpFIG5Tb3VyY2VMZW4gPSBGWFNZU193Y3NsZW4obHBzek9sZCk7Ci0gICAgaWYgKG5Tb3VyY2VMZW4gPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgRlhfU1RSU0laRSBuUmVwbGFjZW1lbnRMZW4gPSBscHN6TmV3ID8gRlhTWVNfd2NzbGVuKGxwc3pOZXcpIDogMDsKLSAgICBGWF9TVFJTSVpFIG5Db3VudCA9IDA7Ci0gICAgRlhfTFBXU1RSIGxwc3pTdGFydCA9IG1fcERhdGEtPm1fU3RyaW5nOwotICAgIEZYX0xQV1NUUiBscHN6RW5kID0gbV9wRGF0YS0+bV9TdHJpbmcgKyBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOwotICAgIEZYX0xQV1NUUiBscHN6VGFyZ2V0OwotICAgIHsKLSAgICAgICAgd2hpbGUgKChscHN6VGFyZ2V0ID0gKEZYX0xQV1NUUilGWFNZU193Y3NzdHIobHBzelN0YXJ0LCBscHN6T2xkKSkgIT0gTlVMTCAmJiBscHN6U3RhcnQgPCBscHN6RW5kKSB7Ci0gICAgICAgICAgICBuQ291bnQrKzsKLSAgICAgICAgICAgIGxwc3pTdGFydCA9IGxwc3pUYXJnZXQgKyBuU291cmNlTGVuOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChuQ291bnQgPiAwKSB7Ci0gICAgICAgIENvcHlCZWZvcmVXcml0ZSgpOwotICAgICAgICBGWF9TVFJTSVpFIG5PbGRMZW5ndGggPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOwotICAgICAgICBGWF9TVFJTSVpFIG5OZXdMZW5ndGggPSAgbk9sZExlbmd0aCArIChuUmVwbGFjZW1lbnRMZW4gLSBuU291cmNlTGVuKSAqIG5Db3VudDsKLSAgICAgICAgaWYgKG1fcERhdGEtPm1fbkFsbG9jTGVuZ3RoIDwgbk5ld0xlbmd0aCB8fCBtX3BEYXRhLT5tX25SZWZzID4gMSkgewotICAgICAgICAgICAgU3RyaW5nRGF0YSogcE9sZERhdGEgPSBtX3BEYXRhOwotICAgICAgICAgICAgRlhfTFBDV1NUUiBwc3RyID0gbV9wRGF0YS0+bV9TdHJpbmc7Ci0gICAgICAgICAgICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5OZXdMZW5ndGgpOwotICAgICAgICAgICAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkzMihtX3BEYXRhLT5tX1N0cmluZywgcHN0ciwgcE9sZERhdGEtPm1fbkRhdGFMZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsKLSAgICAgICAgICAgIHBPbGREYXRhLT5SZWxlYXNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbHBzelN0YXJ0ID0gbV9wRGF0YS0+bV9TdHJpbmc7Ci0gICAgICAgIGxwc3pFbmQgPSBtX3BEYXRhLT5tX1N0cmluZyArIEZYX01BWChtX3BEYXRhLT5tX25EYXRhTGVuZ3RoLCBuTmV3TGVuZ3RoKTsKLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUgKChscHN6VGFyZ2V0ID0gKEZYX0xQV1NUUilGWFNZU193Y3NzdHIobHBzelN0YXJ0LCBscHN6T2xkKSkgIT0gTlVMTCAmJiBscHN6U3RhcnQgPCBscHN6RW5kKSB7Ci0gICAgICAgICAgICAgICAgRlhfU1RSU0laRSBuQmFsYW5jZSA9IG5PbGRMZW5ndGggLSAoRlhfU1RSU0laRSkobHBzelRhcmdldCAtIG1fcERhdGEtPm1fU3RyaW5nICsgblNvdXJjZUxlbik7Ci0gICAgICAgICAgICAgICAgRlhTWVNfbWVtbW92ZTMyKGxwc3pUYXJnZXQgKyBuUmVwbGFjZW1lbnRMZW4sIGxwc3pUYXJnZXQgKyBuU291cmNlTGVuLCBuQmFsYW5jZSAqIHNpemVvZihGWF9XQ0hBUikpOwotICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKGxwc3pUYXJnZXQsIGxwc3pOZXcsIG5SZXBsYWNlbWVudExlbiAqIHNpemVvZihGWF9XQ0hBUikpOwotICAgICAgICAgICAgICAgIGxwc3pTdGFydCA9IGxwc3pUYXJnZXQgKyBuUmVwbGFjZW1lbnRMZW47Ci0gICAgICAgICAgICAgICAgbHBzelN0YXJ0W25CYWxhbmNlXSA9IDA7Ci0gICAgICAgICAgICAgICAgbk9sZExlbmd0aCArPSAoblJlcGxhY2VtZW50TGVuIC0gblNvdXJjZUxlbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQVNTRVJUKG1fcERhdGEtPm1fU3RyaW5nW25OZXdMZW5ndGhdID09IDApOwotICAgICAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gbk5ld0xlbmd0aDsKLSAgICB9Ci0gICAgcmV0dXJuIG5Db3VudDsKLX0KLUZYX1NUUlNJWkUgQ0ZYX1dpZGVTdHJpbmc6Okluc2VydChGWF9TVFJTSVpFIG5JbmRleCwgRlhfV0NIQVIgY2gpCi17Ci0gICAgQ29weUJlZm9yZVdyaXRlKCk7Ci0gICAgaWYgKG5JbmRleCA8IDApIHsKLSAgICAgICAgbkluZGV4ID0gMDsKLSAgICB9Ci0gICAgRlhfU1RSU0laRSBuTmV3TGVuZ3RoID0gR2V0TGVuZ3RoKCk7Ci0gICAgaWYgKG5JbmRleCA+IG5OZXdMZW5ndGgpIHsKLSAgICAgICAgbkluZGV4ID0gbk5ld0xlbmd0aDsKLSAgICB9Ci0gICAgbk5ld0xlbmd0aCsrOwotICAgIGlmIChtX3BEYXRhID09IE5VTEwgfHwgbV9wRGF0YS0+bV9uQWxsb2NMZW5ndGggPCBuTmV3TGVuZ3RoKSB7Ci0gICAgICAgIFN0cmluZ0RhdGEqIHBPbGREYXRhID0gbV9wRGF0YTsKLSAgICAgICAgRlhfTFBDV1NUUiBwc3RyID0gbV9wRGF0YS0+bV9TdHJpbmc7Ci0gICAgICAgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobk5ld0xlbmd0aCk7Ci0gICAgICAgIGlmICghbV9wRGF0YSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYocE9sZERhdGEgIT0gTlVMTCkgewotICAgICAgICAgICAgRlhTWVNfbWVtbW92ZTMyKG1fcERhdGEtPm1fU3RyaW5nLCBwc3RyLCAocE9sZERhdGEtPm1fbkRhdGFMZW5ndGggKyAxKSpzaXplb2YoRlhfV0NIQVIpKTsKLSAgICAgICAgICAgIHBPbGREYXRhLT5SZWxlYXNlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX3BEYXRhLT5tX1N0cmluZ1swXSA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlhTWVNfbWVtbW92ZTMyKG1fcERhdGEtPm1fU3RyaW5nICsgbkluZGV4ICsgMSwKLSAgICAgICAgICAgICAgICAgICAgbV9wRGF0YS0+bV9TdHJpbmcgKyBuSW5kZXgsIChuTmV3TGVuZ3RoIC0gbkluZGV4KSpzaXplb2YoRlhfV0NIQVIpKTsKLSAgICBtX3BEYXRhLT5tX1N0cmluZ1tuSW5kZXhdID0gY2g7Ci0gICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IG5OZXdMZW5ndGg7Ci0gICAgcmV0dXJuIG5OZXdMZW5ndGg7Ci19Ci1GWF9TVFJTSVpFIENGWF9XaWRlU3RyaW5nOjpEZWxldGUoRlhfU1RSU0laRSBuSW5kZXgsIEZYX1NUUlNJWkUgbkNvdW50KQotewotICAgIGlmIChHZXRMZW5ndGgoKSA8IDEpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChuSW5kZXggPCAwKSB7Ci0gICAgICAgIG5JbmRleCA9IDA7Ci0gICAgfQotICAgIEZYX1NUUlNJWkUgbk9sZExlbmd0aCA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7Ci0gICAgaWYgKG5Db3VudCA+IDAgJiYgbkluZGV4IDwgbk9sZExlbmd0aCkgewotICAgICAgICBDb3B5QmVmb3JlV3JpdGUoKTsKLSAgICAgICAgaW50IG5CeXRlc1RvQ29weSA9IG5PbGRMZW5ndGggLSAobkluZGV4ICsgbkNvdW50KSArIDE7Ci0gICAgICAgIEZYU1lTX21lbW1vdmUzMihtX3BEYXRhLT5tX1N0cmluZyArIG5JbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcERhdGEtPm1fU3RyaW5nICsgbkluZGV4ICsgbkNvdW50LCBuQnl0ZXNUb0NvcHkgKiBzaXplb2YoRlhfV0NIQVIpKTsKLSAgICAgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IG5PbGRMZW5ndGggLSBuQ291bnQ7Ci0gICAgfQotICAgIHJldHVybiBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOwotfQotRlhfU1RSU0laRSBDRlhfV2lkZVN0cmluZzo6UmVtb3ZlKEZYX1dDSEFSIGNoUmVtb3ZlKQotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENvcHlCZWZvcmVXcml0ZSgpOwotICAgIGlmIChHZXRMZW5ndGgoKSA8IDEpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIEZYX0xQV1NUUiBwc3RyU291cmNlID0gbV9wRGF0YS0+bV9TdHJpbmc7Ci0gICAgRlhfTFBXU1RSIHBzdHJEZXN0ID0gbV9wRGF0YS0+bV9TdHJpbmc7Ci0gICAgRlhfTFBXU1RSIHBzdHJFbmQgPSBtX3BEYXRhLT5tX1N0cmluZyArIG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7Ci0gICAgd2hpbGUgKHBzdHJTb3VyY2UgPCBwc3RyRW5kKSB7Ci0gICAgICAgIGlmICgqcHN0clNvdXJjZSAhPSBjaFJlbW92ZSkgewotICAgICAgICAgICAgKnBzdHJEZXN0ID0gKnBzdHJTb3VyY2U7Ci0gICAgICAgICAgICBwc3RyRGVzdCArKzsKLSAgICAgICAgfQotICAgICAgICBwc3RyU291cmNlICsrOwotICAgIH0KLSAgICAqcHN0ckRlc3QgPSAwOwotICAgIEZYX1NUUlNJWkUgbkNvdW50ID0gKEZYX1NUUlNJWkUpKHBzdHJTb3VyY2UgLSBwc3RyRGVzdCk7Ci0gICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAtPSBuQ291bnQ7Ci0gICAgcmV0dXJuIG5Db3VudDsKLX0KLSNkZWZpbmUgRk9SQ0VfQU5TSSAgICAgIDB4MTAwMDAKLSNkZWZpbmUgRk9SQ0VfVU5JQ09ERSAgIDB4MjAwMDAKLSNkZWZpbmUgRk9SQ0VfSU5UNjQgICAgIDB4NDAwMDAKLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6OkZvcm1hdFYoRlhfTFBDV1NUUiBscHN6Rm9ybWF0LCB2YV9saXN0IGFyZ0xpc3QpCi17Ci0gICAgdmFfbGlzdCBhcmdMaXN0U2F2ZTsKLSNpZiBkZWZpbmVkKF9fQVJNQ0NfVkVSU0lPTikgfHwgKCFkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX0ZYX0NQVV8gPT0gX0ZYX1g2NF8gfHwgX0ZYX0NQVV8gPT0gX0ZYX0lBNjRfIHx8IF9GWF9DUFVfID09IF9GWF9BUk02NF8pKSB8fCBkZWZpbmVkKF9fbmF0aXZlX2NsaWVudF9fKQotICAgIHZhX2NvcHkoYXJnTGlzdFNhdmUsIGFyZ0xpc3QpOwotI2Vsc2UKLSAgICBhcmdMaXN0U2F2ZSA9IGFyZ0xpc3Q7Ci0jZW5kaWYKLSAgICBpbnQgbk1heExlbiA9IDA7Ci0gICAgZm9yIChGWF9MUENXU1RSIGxwc3ogPSBscHN6Rm9ybWF0OyAqbHBzeiAhPSAwOyBscHN6ICsrKSB7Ci0gICAgICAgIGlmICgqbHBzeiAhPSAnJScgfHwgKihscHN6ID0gbHBzeiArIDEpID09ICclJykgewotICAgICAgICAgICAgbk1heExlbiArPSBGWFNZU193Y3NsZW4obHBzeik7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgbkl0ZW1MZW4gPSAwOwotICAgICAgICBpbnQgbldpZHRoID0gMDsKLSAgICAgICAgZm9yICg7ICpscHN6ICE9IDA7IGxwc3ogKyspIHsKLSAgICAgICAgICAgIGlmICgqbHBzeiA9PSAnIycpIHsKLSAgICAgICAgICAgICAgICBuTWF4TGVuICs9IDI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCpscHN6ID09ICcqJykgewotICAgICAgICAgICAgICAgIG5XaWR0aCA9IHZhX2FyZyhhcmdMaXN0LCBpbnQpOwotICAgICAgICAgICAgfSBlbHNlIGlmICgqbHBzeiA9PSAnLScgfHwgKmxwc3ogPT0gJysnIHx8ICpscHN6ID09ICcwJyB8fAotICAgICAgICAgICAgICAgICAgICAgICAqbHBzeiA9PSAnICcpCi0gICAgICAgICAgICAgICAgOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5XaWR0aCA9PSAwKSB7Ci0gICAgICAgICAgICBuV2lkdGggPSBGWFNZU193dG9pKGxwc3opOwotICAgICAgICAgICAgZm9yICg7ICpscHN6ICE9IDAgJiYgKCpscHN6KSA8PSAnOScgJiYgKCpscHN6KSA+PSAnMCc7IGxwc3ogKyspCi0gICAgICAgICAgICAgICAgOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuV2lkdGggPCAwIHx8IG5XaWR0aCA+IDEyOCAqIDEwMjQpIHsKLSAgICAgICAgICAgIGxwc3pGb3JtYXQgPSBMIkJhZCB3aWR0aCI7Ci0gICAgICAgICAgICBuTWF4TGVuID0gMTA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpbnQgblByZWNpc2lvbiA9IDA7Ci0gICAgICAgIGlmICgqbHBzeiA9PSAnLicpIHsKLSAgICAgICAgICAgIGxwc3ogKys7Ci0gICAgICAgICAgICBpZiAoKmxwc3ogPT0gJyonKSB7Ci0gICAgICAgICAgICAgICAgblByZWNpc2lvbiA9IHZhX2FyZyhhcmdMaXN0LCBpbnQpOwotICAgICAgICAgICAgICAgIGxwc3ogKys7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5QcmVjaXNpb24gPSBGWFNZU193dG9pKGxwc3opOwotICAgICAgICAgICAgICAgIGZvciAoOyAqbHBzeiAhPSAwICYmICgqbHBzeikgPj0gJzAnICYmICgqbHBzeikgPD0gJzknOyBscHN6ICsrKQotICAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5QcmVjaXNpb24gPCAwIHx8IG5QcmVjaXNpb24gPiAxMjggKiAxMDI0KSB7Ci0gICAgICAgICAgICBscHN6Rm9ybWF0ID0gTCJCYWQgcHJlY2lzaW9uIjsKLSAgICAgICAgICAgIG5NYXhMZW4gPSAxNDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGludCBuTW9kaWZpZXIgPSAwOwotICAgICAgICBpZiAoKmxwc3ogPT0gTCdJJyAmJiAqKGxwc3ogKyAxKSA9PSBMJzYnICYmICoobHBzeiArIDIpID09IEwnNCcpIHsKLSAgICAgICAgICAgIGxwc3ogKz0gMzsKLSAgICAgICAgICAgIG5Nb2RpZmllciA9IEZPUkNFX0lOVDY0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3dpdGNoICgqbHBzeikgewotICAgICAgICAgICAgICAgIGNhc2UgJ2gnOgotICAgICAgICAgICAgICAgICAgICBuTW9kaWZpZXIgPSBGT1JDRV9BTlNJOwotICAgICAgICAgICAgICAgICAgICBscHN6ICsrOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdsJzoKLSAgICAgICAgICAgICAgICAgICAgbk1vZGlmaWVyID0gRk9SQ0VfVU5JQ09ERTsKLSAgICAgICAgICAgICAgICAgICAgbHBzeiArKzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnRic6Ci0gICAgICAgICAgICAgICAgY2FzZSAnTic6Ci0gICAgICAgICAgICAgICAgY2FzZSAnTCc6Ci0gICAgICAgICAgICAgICAgICAgIGxwc3ogKys7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoKmxwc3ogfCBuTW9kaWZpZXIpIHsKLSAgICAgICAgICAgIGNhc2UgJ2MnOgotICAgICAgICAgICAgY2FzZSAnQyc6Ci0gICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSAyOwotICAgICAgICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnYyd8Rk9SQ0VfQU5TSToKLSAgICAgICAgICAgIGNhc2UgJ0MnfEZPUkNFX0FOU0k6Ci0gICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSAyOwotICAgICAgICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnYyd8Rk9SQ0VfVU5JQ09ERToKLSAgICAgICAgICAgIGNhc2UgJ0MnfEZPUkNFX1VOSUNPREU6Ci0gICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSAyOwotICAgICAgICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAncyc6IHsKLSAgICAgICAgICAgICAgICAgICAgRlhfTFBDV1NUUiBwc3RyTmV4dEFyZyA9IHZhX2FyZyhhcmdMaXN0LCBGWF9MUENXU1RSKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBzdHJOZXh0QXJnID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gNjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gRlhTWVNfd2NzbGVuKHBzdHJOZXh0QXJnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuSXRlbUxlbiA8IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdTJzogewotICAgICAgICAgICAgICAgICAgICBGWF9MUENTVFIgcHN0ck5leHRBcmcgPSB2YV9hcmcoYXJnTGlzdCwgRlhfTFBDU1RSKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBzdHJOZXh0QXJnID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gNjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gRlhTWVNfc3RybGVuKHBzdHJOZXh0QXJnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuSXRlbUxlbiA8IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdzJ3xGT1JDRV9BTlNJOgotICAgICAgICAgICAgY2FzZSAnUyd8Rk9SQ0VfQU5TSTogewotICAgICAgICAgICAgICAgICAgICBGWF9MUENTVFIgcHN0ck5leHRBcmcgPSB2YV9hcmcoYXJnTGlzdCwgRlhfTFBDU1RSKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBzdHJOZXh0QXJnID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gNjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gRlhTWVNfc3RybGVuKHBzdHJOZXh0QXJnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuSXRlbUxlbiA8IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdzJ3xGT1JDRV9VTklDT0RFOgotICAgICAgICAgICAgY2FzZSAnUyd8Rk9SQ0VfVU5JQ09ERTogewotICAgICAgICAgICAgICAgICAgICBGWF9MUFdTVFIgcHN0ck5leHRBcmcgPSB2YV9hcmcoYXJnTGlzdCwgRlhfTFBXU1RSKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBzdHJOZXh0QXJnID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gNjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gRlhTWVNfd2NzbGVuKHBzdHJOZXh0QXJnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuSXRlbUxlbiA8IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5JdGVtTGVuICE9IDApIHsKLSAgICAgICAgICAgIGlmIChuUHJlY2lzaW9uICE9IDAgJiYgbkl0ZW1MZW4gPiBuUHJlY2lzaW9uKSB7Ci0gICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSBuUHJlY2lzaW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5JdGVtTGVuIDwgbldpZHRoKSB7Ci0gICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSBuV2lkdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCpscHN6KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnaSc6Ci0gICAgICAgICAgICAgICAgY2FzZSAndSc6Ci0gICAgICAgICAgICAgICAgY2FzZSAneCc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnWCc6Ci0gICAgICAgICAgICAgICAgY2FzZSAnbyc6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuTW9kaWZpZXIgJiBGT1JDRV9JTlQ2NCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKGFyZ0xpc3QsIEZYX0lOVDY0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gMzI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuSXRlbUxlbiA8IG5XaWR0aCArIG5QcmVjaXNpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gbldpZHRoICsgblByZWNpc2lvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdhJzoKLSAgICAgICAgICAgICAgICBjYXNlICdBJzoKLSAgICAgICAgICAgICAgICBjYXNlICdlJzoKLSAgICAgICAgICAgICAgICBjYXNlICdFJzoKLSAgICAgICAgICAgICAgICBjYXNlICdnJzoKLSAgICAgICAgICAgICAgICBjYXNlICdHJzoKLSAgICAgICAgICAgICAgICAgICAgdmFfYXJnKGFyZ0xpc3QsIGRvdWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgIG5JdGVtTGVuID0gMTI4OwotICAgICAgICAgICAgICAgICAgICBpZiAobkl0ZW1MZW4gPCBuV2lkdGggKyBuUHJlY2lzaW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IG5XaWR0aCArIG5QcmVjaXNpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnZic6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuV2lkdGggKyBuUHJlY2lzaW9uID4gMTAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IG5QcmVjaXNpb24gKyBuV2lkdGggKyAxMjg7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgcHN6VGVtcFsyNTZdOwotICAgICAgICAgICAgICAgICAgICAgICAgZiA9IHZhX2FyZyhhcmdMaXN0LCBkb3VibGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfc25wcmludGYocHN6VGVtcCwgc2l6ZW9mKHBzelRlbXApLCAiJSouKmYiLCBuV2lkdGgsIG5QcmVjaXNpb24gKyA2LCBmICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuSXRlbUxlbiA9IEZYU1lTX3N0cmxlbihwc3pUZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdwJzoKLSAgICAgICAgICAgICAgICAgICAgdmFfYXJnKGFyZ0xpc3QsIHZvaWQqKTsKLSAgICAgICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSAzMjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5JdGVtTGVuIDwgbldpZHRoICsgblByZWNpc2lvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgbkl0ZW1MZW4gPSBuV2lkdGggKyBuUHJlY2lzaW9uOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ24nOgotICAgICAgICAgICAgICAgICAgICB2YV9hcmcoYXJnTGlzdCwgaW50Kik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG5NYXhMZW4gKz0gbkl0ZW1MZW47Ci0gICAgfQotICAgIEdldEJ1ZmZlcihuTWF4TGVuKTsKLSAgICBpZiAobV9wRGF0YSkgewotICAgICAgICBGWFNZU192c3dwcmludGYoKHdjaGFyX3QqKW1fcERhdGEtPm1fU3RyaW5nLCBuTWF4TGVuICsgMSwgKGNvbnN0IHdjaGFyX3QqKWxwc3pGb3JtYXQsIGFyZ0xpc3RTYXZlKTsKLSAgICAgICAgUmVsZWFzZUJ1ZmZlcigpOwotICAgIH0KLSAgICB2YV9lbmQoYXJnTGlzdFNhdmUpOwotfQotdm9pZCBDRlhfV2lkZVN0cmluZzo6Rm9ybWF0KEZYX0xQQ1dTVFIgbHBzekZvcm1hdCwgLi4uKQotewotICAgIHZhX2xpc3QgYXJnTGlzdDsKLSAgICB2YV9zdGFydChhcmdMaXN0LCBscHN6Rm9ybWF0KTsKLSAgICBGb3JtYXRWKGxwc3pGb3JtYXQsIGFyZ0xpc3QpOwotICAgIHZhX2VuZChhcmdMaXN0KTsKLX0KLUZYX0ZMT0FUIEZYX3d0b2YoRlhfTFBDV1NUUiBzdHIsIGludCBsZW4pCi17Ci0gICAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwLjA7Ci0gICAgfQotICAgIGludCBjYyA9IDA7Ci0gICAgRlhfQk9PTCBiTmVnYXRpdmUgPSBGQUxTRTsKLSAgICBpZiAoc3RyWzBdID09ICcrJykgewotICAgICAgICBjYysrOwotICAgIH0gZWxzZSBpZiAoc3RyWzBdID09ICctJykgewotICAgICAgICBiTmVnYXRpdmUgPSBUUlVFOwotICAgICAgICBjYysrOwotICAgIH0KLSAgICBpbnQgaW50ZWdlciA9IDA7Ci0gICAgd2hpbGUgKGNjIDwgbGVuKSB7Ci0gICAgICAgIGlmIChzdHJbY2NdID09ICcuJykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZWdlciA9IGludGVnZXIgKiAxMCArIHN0cltjY10gLSAnMCc7Ci0gICAgICAgIGNjICsrOwotICAgIH0KLSAgICBGWF9GTE9BVCBmcmFjdGlvbiA9IDA7Ci0gICAgaWYgKHN0cltjY10gPT0gJy4nKSB7Ci0gICAgICAgIGNjICsrOwotICAgICAgICBGWF9GTE9BVCBzY2FsZSA9IDAuMWY7Ci0gICAgICAgIHdoaWxlIChjYyA8IGxlbikgewotICAgICAgICAgICAgZnJhY3Rpb24gKz0gc2NhbGUgKiAoc3RyW2NjXSAtICcwJyk7Ci0gICAgICAgICAgICBzY2FsZSAqPSAwLjFmOwotICAgICAgICAgICAgY2MgKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZnJhY3Rpb24gKz0gKEZYX0ZMT0FUKWludGVnZXI7Ci0gICAgcmV0dXJuIGJOZWdhdGl2ZSA/IC1mcmFjdGlvbiA6IGZyYWN0aW9uOwotfQotaW50IENGWF9XaWRlU3RyaW5nOjpHZXRJbnRlZ2VyKCkgY29uc3QKLXsKLSAgICBpZiAobV9wRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gRlhTWVNfd3RvaShtX3BEYXRhLT5tX1N0cmluZyk7Ci19Ci1GWF9GTE9BVCBDRlhfV2lkZVN0cmluZzo6R2V0RmxvYXQoKSBjb25zdAotewotICAgIGlmIChtX3BEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDAuMDsKLSAgICB9Ci0gICAgcmV0dXJuIEZYX3d0b2YobV9wRGF0YS0+bV9TdHJpbmcsIG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpOwotfQotc3RhdGljIENGWF9CeXRlU3RyaW5nIF9EZWZNYXBfR2V0Qnl0ZVN0cmluZyhDRlhfQ2hhck1hcCogcENoYXJNYXAsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3aWRlc3RyKQotewotICAgIGludCBzcmNfbGVuID0gd2lkZXN0ci5HZXRMZW5ndGgoKTsKLSAgICBpbnQgY29kZXBhZ2UgPSBwQ2hhck1hcC0+bV9HZXRDb2RlUGFnZSA/IHBDaGFyTWFwLT5tX0dldENvZGVQYWdlKCkgOiAwOwotICAgIGludCBkZXN0X2xlbiA9IEZYU1lTX1dpZGVDaGFyVG9NdWx0aUJ5dGUoY29kZXBhZ2UsIDAsIHdpZGVzdHIuY19zdHIoKSwgc3JjX2xlbiwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7Ci0gICAgaWYgKGRlc3RfbGVuID09IDApIHsKLSAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVzdHI7Ci0gICAgRlhfTFBTVFIgZGVzdF9idWYgPSBieXRlc3RyLkdldEJ1ZmZlcihkZXN0X2xlbik7Ci0gICAgRlhTWVNfV2lkZUNoYXJUb011bHRpQnl0ZShjb2RlcGFnZSwgMCwgd2lkZXN0ci5jX3N0cigpLCBzcmNfbGVuLCBkZXN0X2J1ZiwgZGVzdF9sZW4sIE5VTEwsIE5VTEwpOwotICAgIGJ5dGVzdHIuUmVsZWFzZUJ1ZmZlcihkZXN0X2xlbik7Ci0gICAgcmV0dXJuIGJ5dGVzdHI7Ci19Ci1zdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgX0RlZk1hcF9HZXRXaWRlU3RyaW5nKENGWF9DaGFyTWFwKiBwQ2hhck1hcCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJ5dGVzdHIpCi17Ci0gICAgaW50IHNyY19sZW4gPSBieXRlc3RyLkdldExlbmd0aCgpOwotICAgIGludCBjb2RlcGFnZSA9IHBDaGFyTWFwLT5tX0dldENvZGVQYWdlID8gcENoYXJNYXAtPm1fR2V0Q29kZVBhZ2UoKSA6IDA7Ci0gICAgaW50IGRlc3RfbGVuID0gRlhTWVNfTXVsdGlCeXRlVG9XaWRlQ2hhcihjb2RlcGFnZSwgMCwgYnl0ZXN0ciwgc3JjX2xlbiwgTlVMTCwgMCk7Ci0gICAgaWYgKGRlc3RfbGVuID09IDApIHsKLSAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgfQotICAgIENGWF9XaWRlU3RyaW5nIHdpZGVzdHI7Ci0gICAgRlhfTFBXU1RSIGRlc3RfYnVmID0gd2lkZXN0ci5HZXRCdWZmZXIoZGVzdF9sZW4pOwotICAgIEZYU1lTX011bHRpQnl0ZVRvV2lkZUNoYXIoY29kZXBhZ2UsIDAsIGJ5dGVzdHIsIHNyY19sZW4sIGRlc3RfYnVmLCBkZXN0X2xlbik7Ci0gICAgd2lkZXN0ci5SZWxlYXNlQnVmZmVyKGRlc3RfbGVuKTsKLSAgICByZXR1cm4gd2lkZXN0cjsKLX0KLXN0YXRpYyBpbnQgX0RlZk1hcF9HZXRHQktDb2RlUGFnZSgpCi17Ci0gICAgcmV0dXJuIDkzNjsKLX0KLXN0YXRpYyBpbnQgX0RlZk1hcF9HZXRVSENDb2RlUGFnZSgpCi17Ci0gICAgcmV0dXJuIDk0OTsKLX0KLXN0YXRpYyBpbnQgX0RlZk1hcF9HZXRKSVNDb2RlUGFnZSgpCi17Ci0gICAgcmV0dXJuIDkzMjsKLX0KLXN0YXRpYyBpbnQgX0RlZk1hcF9HZXRCaWc1Q29kZVBhZ2UoKQotewotICAgIHJldHVybiA5NTA7Ci19Ci1zdGF0aWMgY29uc3QgQ0ZYX0NoYXJNYXAgZ19EZWZhdWx0TWFwcGVyID0geyZfRGVmTWFwX0dldFdpZGVTdHJpbmcsICZfRGVmTWFwX0dldEJ5dGVTdHJpbmcsIE5VTEx9Owotc3RhdGljIGNvbnN0IENGWF9DaGFyTWFwIGdfRGVmYXVsdEdCS01hcHBlciA9IHsmX0RlZk1hcF9HZXRXaWRlU3RyaW5nLCAmX0RlZk1hcF9HZXRCeXRlU3RyaW5nLCAmX0RlZk1hcF9HZXRHQktDb2RlUGFnZX07Ci1zdGF0aWMgY29uc3QgQ0ZYX0NoYXJNYXAgZ19EZWZhdWx0SklTTWFwcGVyID0geyZfRGVmTWFwX0dldFdpZGVTdHJpbmcsICZfRGVmTWFwX0dldEJ5dGVTdHJpbmcsICZfRGVmTWFwX0dldEpJU0NvZGVQYWdlfTsKLXN0YXRpYyBjb25zdCBDRlhfQ2hhck1hcCBnX0RlZmF1bHRVSENNYXBwZXIgPSB7Jl9EZWZNYXBfR2V0V2lkZVN0cmluZywgJl9EZWZNYXBfR2V0Qnl0ZVN0cmluZywgJl9EZWZNYXBfR2V0VUhDQ29kZVBhZ2V9Owotc3RhdGljIGNvbnN0IENGWF9DaGFyTWFwIGdfRGVmYXVsdEJpZzVNYXBwZXIgPSB7Jl9EZWZNYXBfR2V0V2lkZVN0cmluZywgJl9EZWZNYXBfR2V0Qnl0ZVN0cmluZywgJl9EZWZNYXBfR2V0QmlnNUNvZGVQYWdlfTsKLUNGWF9DaGFyTWFwKiBDRlhfQ2hhck1hcDo6R2V0RGVmYXVsdE1hcHBlcihGWF9JTlQzMiBjb2RlcGFnZSkKLXsKLSAgICBzd2l0Y2ggKGNvZGVwYWdlKSB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHJldHVybiAoQ0ZYX0NoYXJNYXAqKSZnX0RlZmF1bHRNYXBwZXI7Ci0gICAgICAgIGNhc2UgOTMyOgotICAgICAgICAgICAgcmV0dXJuIChDRlhfQ2hhck1hcCopJmdfRGVmYXVsdEpJU01hcHBlcjsKLSAgICAgICAgY2FzZSA5MzY6Ci0gICAgICAgICAgICByZXR1cm4gKENGWF9DaGFyTWFwKikmZ19EZWZhdWx0R0JLTWFwcGVyOwotICAgICAgICBjYXNlIDk0OToKLSAgICAgICAgICAgIHJldHVybiAoQ0ZYX0NoYXJNYXAqKSZnX0RlZmF1bHRVSENNYXBwZXI7Ci0gICAgICAgIGNhc2UgOTUwOgotICAgICAgICAgICAgcmV0dXJuIChDRlhfQ2hhck1hcCopJmdfRGVmYXVsdEJpZzVNYXBwZXI7Ci0gICAgfQorICB9CisgIFN0cmluZ0RhdGEqIHBPbGREYXRhID0gbV9wRGF0YTsKKyAgRlhfU1RSU0laRSBuT2xkTGVuID0gcE9sZERhdGEtPm1fbkRhdGFMZW5ndGg7CisgIGlmIChuTWluQnVmTGVuZ3RoIDwgbk9sZExlbikgeworICAgIG5NaW5CdWZMZW5ndGggPSBuT2xkTGVuOworICB9CisgIG1fcERhdGEgPSBTdHJpbmdEYXRhOjpDcmVhdGUobk1pbkJ1Zkxlbmd0aCk7CisgIGlmICghbV9wRGF0YSkgewogICAgIHJldHVybiBOVUxMOworICB9CisgIEZYU1lTX21lbWNweShtX3BEYXRhLT5tX1N0cmluZywgcE9sZERhdGEtPm1fU3RyaW5nLAorICAgICAgICAgICAgICAgKG5PbGRMZW4gKyAxKSAqIHNpemVvZihGWF9XQ0hBUikpOworICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gbk9sZExlbjsKKyAgcE9sZERhdGEtPlJlbGVhc2UoKTsKKyAgcmV0dXJuIG1fcERhdGEtPm1fU3RyaW5nOworfQorQ0ZYX1dpZGVTdHJpbmcgQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChjb25zdCBjaGFyKiBzdHIsIEZYX1NUUlNJWkUgbGVuKSB7CisgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKKyAgcmVzdWx0LkNvbnZlcnRGcm9tKENGWF9CeXRlU3RyaW5nKHN0ciwgbGVuKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CitDRlhfV2lkZVN0cmluZyBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoY29uc3QgY2hhciogc3RyLCBGWF9TVFJTSVpFIGxlbikgeworICBpZiAoIXN0ciB8fCAwID09IGxlbikgeworICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICB9CisKKyAgQ0ZYX1VURjhEZWNvZGVyIGRlY29kZXI7CisgIGZvciAoRlhfU1RSU0laRSBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgZGVjb2Rlci5JbnB1dChzdHJbaV0pOworICB9CisgIHJldHVybiBkZWNvZGVyLkdldFJlc3VsdCgpOworfQorQ0ZYX1dpZGVTdHJpbmcgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEYxNkxFKGNvbnN0IHVuc2lnbmVkIHNob3J0KiB3c3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1NUUlNJWkUgd2xlbikgeworICBpZiAoIXdzdHIgfHwgMCA9PSB3bGVuKSB7CisgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7CisgIH0KKworICBDRlhfV2lkZVN0cmluZyByZXN1bHQ7CisgIEZYX1dDSEFSKiBidWYgPSByZXN1bHQuR2V0QnVmZmVyKHdsZW4pOworICBmb3IgKGludCBpID0gMDsgaSA8IHdsZW47IGkrKykgeworICAgIGJ1ZltpXSA9IHdzdHJbaV07CisgIH0KKyAgcmVzdWx0LlJlbGVhc2VCdWZmZXIod2xlbik7CisgIHJldHVybiByZXN1bHQ7Cit9CitGWF9TVFJTSVpFIENGWF9XaWRlU3RyaW5nOjpXU3RyaW5nTGVuZ3RoKGNvbnN0IHVuc2lnbmVkIHNob3J0KiBzdHIpIHsKKyAgRlhfU1RSU0laRSBsZW4gPSAwOworICBpZiAoc3RyKQorICAgIHdoaWxlIChzdHJbbGVuXSkKKyAgICAgIGxlbisrOworICByZXR1cm4gbGVuOworfQorCit2b2lkIENGWF9XaWRlU3RyaW5nOjpBbGxvY0NvcHkoQ0ZYX1dpZGVTdHJpbmcmIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSBuQ29weUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFIG5Db3B5SW5kZXgpIGNvbnN0IHsKKyAgLy8gfEZYX1NUUlNJWkV8IGlzIGN1cnJlbnRseSB0eXBlZGVmJ2QgYXMgaW4gfGludHwuIFRPRE8ocGFsbWVyKTogSXQKKyAgLy8gc2hvdWxkIGJlIGEgfHNpemVfdHwsIG9yIGF0IGxlYXN0IHVuc2lnbmVkLgorICBpZiAobkNvcHlMZW4gPT0gMCB8fCBuQ29weUxlbiA8IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxGWF9TVFJTSVpFPiBpU2l6ZSA9CisgICAgICBzdGF0aWNfY2FzdDxGWF9TVFJTSVpFPihzaXplb2YoRlhfV0NIQVIpKTsKKyAgaVNpemUgKj0gbkNvcHlMZW47CisgIEFTU0VSVCghZGVzdC5tX3BEYXRhKTsKKyAgZGVzdC5tX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5Db3B5TGVuKTsKKyAgaWYgKGRlc3QubV9wRGF0YSkgeworICAgIEZYU1lTX21lbWNweShkZXN0Lm1fcERhdGEtPm1fU3RyaW5nLCBtX3BEYXRhLT5tX1N0cmluZyArIG5Db3B5SW5kZXgsCisgICAgICAgICAgICAgICAgIGlTaXplLlZhbHVlT3JEaWUoKSk7CisgIH0KK30KK0NGWF9XaWRlU3RyaW5nIENGWF9XaWRlU3RyaW5nOjpMZWZ0KEZYX1NUUlNJWkUgbkNvdW50KSBjb25zdCB7CisgIGlmICghbV9wRGF0YSkgeworICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICB9CisgIGlmIChuQ291bnQgPCAwKSB7CisgICAgbkNvdW50ID0gMDsKKyAgfQorICBpZiAobkNvdW50ID49IG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpIHsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgQ0ZYX1dpZGVTdHJpbmcgZGVzdDsKKyAgQWxsb2NDb3B5KGRlc3QsIG5Db3VudCwgMCk7CisgIHJldHVybiBkZXN0OworfQorQ0ZYX1dpZGVTdHJpbmcgQ0ZYX1dpZGVTdHJpbmc6Ok1pZChGWF9TVFJTSVpFIG5GaXJzdCkgY29uc3QgeworICByZXR1cm4gTWlkKG5GaXJzdCwgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAtIG5GaXJzdCk7Cit9CitDRlhfV2lkZVN0cmluZyBDRlhfV2lkZVN0cmluZzo6TWlkKEZYX1NUUlNJWkUgbkZpcnN0LCBGWF9TVFJTSVpFIG5Db3VudCkgY29uc3QgeworICBpZiAoIW1fcERhdGEpIHsKKyAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgfQorICBpZiAobkZpcnN0IDwgMCkgeworICAgIG5GaXJzdCA9IDA7CisgIH0KKyAgaWYgKG5Db3VudCA8IDApIHsKKyAgICBuQ291bnQgPSAwOworICB9CisgIGlmIChuRmlyc3QgKyBuQ291bnQgPiBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKSB7CisgICAgbkNvdW50ID0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAtIG5GaXJzdDsKKyAgfQorICBpZiAobkZpcnN0ID4gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgeworICAgIG5Db3VudCA9IDA7CisgIH0KKyAgaWYgKG5GaXJzdCA9PSAwICYmIG5GaXJzdCArIG5Db3VudCA9PSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKSB7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIENGWF9XaWRlU3RyaW5nIGRlc3Q7CisgIEFsbG9jQ29weShkZXN0LCBuQ291bnQsIG5GaXJzdCk7CisgIHJldHVybiBkZXN0OworfQorQ0ZYX1dpZGVTdHJpbmcgQ0ZYX1dpZGVTdHJpbmc6OlJpZ2h0KEZYX1NUUlNJWkUgbkNvdW50KSBjb25zdCB7CisgIGlmICghbV9wRGF0YSkgeworICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICB9CisgIGlmIChuQ291bnQgPCAwKSB7CisgICAgbkNvdW50ID0gMDsKKyAgfQorICBpZiAobkNvdW50ID49IG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpIHsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgQ0ZYX1dpZGVTdHJpbmcgZGVzdDsKKyAgQWxsb2NDb3B5KGRlc3QsIG5Db3VudCwgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAtIG5Db3VudCk7CisgIHJldHVybiBkZXN0OworfQoraW50IENGWF9XaWRlU3RyaW5nOjpDb21wYXJlTm9DYXNlKGNvbnN0IEZYX1dDSEFSKiBscHN6KSBjb25zdCB7CisgIGlmICghbV9wRGF0YSkgeworICAgIHJldHVybiAoIWxwc3ogfHwgbHBzelswXSA9PSAwKSA/IDAgOiAtMTsKKyAgfQorICByZXR1cm4gRlhTWVNfd2NzaWNtcChtX3BEYXRhLT5tX1N0cmluZywgbHBzeik7Cit9CitpbnQgQ0ZYX1dpZGVTdHJpbmc6OkNvbXBhcmUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikgY29uc3QgeworICBpZiAoIW1fcERhdGEpIHsKKyAgICBpZiAoIXN0ci5tX3BEYXRhKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmICghc3RyLm1fcERhdGEpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpbnQgdGhpc19sZW4gPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOworICBpbnQgdGhhdF9sZW4gPSBzdHIubV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKKyAgaW50IG1pbl9sZW4gPSB0aGlzX2xlbiA8IHRoYXRfbGVuID8gdGhpc19sZW4gOiB0aGF0X2xlbjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaW5fbGVuOyBpKyspIHsKKyAgICBpZiAobV9wRGF0YS0+bV9TdHJpbmdbaV0gPCBzdHIubV9wRGF0YS0+bV9TdHJpbmdbaV0pIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKG1fcERhdGEtPm1fU3RyaW5nW2ldID4gc3RyLm1fcERhdGEtPm1fU3RyaW5nW2ldKSB7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgaWYgKHRoaXNfbGVuIDwgdGhhdF9sZW4pIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKHRoaXNfbGVuID4gdGhhdF9sZW4pIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KK3ZvaWQgQ0ZYX1dpZGVTdHJpbmc6OlNldEF0KEZYX1NUUlNJWkUgbkluZGV4LCBGWF9XQ0hBUiBjaCkgeworICBpZiAoIW1fcERhdGEpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQVNTRVJUKG5JbmRleCA+PSAwKTsKKyAgQVNTRVJUKG5JbmRleCA8IG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpOworICBDb3B5QmVmb3JlV3JpdGUoKTsKKyAgbV9wRGF0YS0+bV9TdHJpbmdbbkluZGV4XSA9IGNoOworfQordm9pZCBDRlhfV2lkZVN0cmluZzo6TWFrZUxvd2VyKCkgeworICBpZiAoIW1fcERhdGEpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ29weUJlZm9yZVdyaXRlKCk7CisgIGlmIChHZXRMZW5ndGgoKSA8IDEpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhTWVNfd2NzbHdyKG1fcERhdGEtPm1fU3RyaW5nKTsKK30KK3ZvaWQgQ0ZYX1dpZGVTdHJpbmc6Ok1ha2VVcHBlcigpIHsKKyAgaWYgKCFtX3BEYXRhKSB7CisgICAgcmV0dXJuOworICB9CisgIENvcHlCZWZvcmVXcml0ZSgpOworICBpZiAoR2V0TGVuZ3RoKCkgPCAxKSB7CisgICAgcmV0dXJuOworICB9CisgIEZYU1lTX3djc3VwcihtX3BEYXRhLT5tX1N0cmluZyk7Cit9CitGWF9TVFJTSVpFIENGWF9XaWRlU3RyaW5nOjpGaW5kKGNvbnN0IEZYX1dDSEFSKiBscHN6U3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFIG5TdGFydCkgY29uc3QgeworICBGWF9TVFJTSVpFIG5MZW5ndGggPSBHZXRMZW5ndGgoKTsKKyAgaWYgKG5MZW5ndGggPCAxIHx8IG5TdGFydCA+IG5MZW5ndGgpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgY29uc3QgRlhfV0NIQVIqIGxwc3ogPSBGWFNZU193Y3NzdHIobV9wRGF0YS0+bV9TdHJpbmcgKyBuU3RhcnQsIGxwc3pTdWIpOworICByZXR1cm4gbHBzeiA/IChpbnQpKGxwc3ogLSBtX3BEYXRhLT5tX1N0cmluZykgOiAtMTsKK30KK0ZYX1NUUlNJWkUgQ0ZYX1dpZGVTdHJpbmc6OkZpbmQoRlhfV0NIQVIgY2gsIEZYX1NUUlNJWkUgblN0YXJ0KSBjb25zdCB7CisgIGlmICghbV9wRGF0YSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBGWF9TVFJTSVpFIG5MZW5ndGggPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOworICBpZiAoblN0YXJ0ID49IG5MZW5ndGgpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgY29uc3QgRlhfV0NIQVIqIGxwc3ogPSBGWFNZU193Y3NjaHIobV9wRGF0YS0+bV9TdHJpbmcgKyBuU3RhcnQsIGNoKTsKKyAgcmV0dXJuIChscHN6KSA/IChpbnQpKGxwc3ogLSBtX3BEYXRhLT5tX1N0cmluZykgOiAtMTsKK30KK3ZvaWQgQ0ZYX1dpZGVTdHJpbmc6OlRyaW1SaWdodChjb25zdCBGWF9XQ0hBUiogbHBzelRhcmdldExpc3QpIHsKKyAgRlhTWVNfYXNzZXJ0KGxwc3pUYXJnZXRMaXN0KTsKKyAgaWYgKCFtX3BEYXRhIHx8ICpscHN6VGFyZ2V0TGlzdCA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIENvcHlCZWZvcmVXcml0ZSgpOworICBGWF9TVFJTSVpFIGxlbiA9IEdldExlbmd0aCgpOworICBpZiAobGVuIDwgMSkgeworICAgIHJldHVybjsKKyAgfQorICBGWF9TVFJTSVpFIHBvcyA9IGxlbjsKKyAgd2hpbGUgKHBvcykgeworICAgIGlmICghRlhTWVNfd2NzY2hyKGxwc3pUYXJnZXRMaXN0LCBtX3BEYXRhLT5tX1N0cmluZ1twb3MgLSAxXSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBwb3MtLTsKKyAgfQorICBpZiAocG9zIDwgbGVuKSB7CisgICAgbV9wRGF0YS0+bV9TdHJpbmdbcG9zXSA9IDA7CisgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IHBvczsKKyAgfQorfQordm9pZCBDRlhfV2lkZVN0cmluZzo6VHJpbVJpZ2h0KEZYX1dDSEFSIGNoVGFyZ2V0KSB7CisgIEZYX1dDSEFSIHN0clsyXSA9IHtjaFRhcmdldCwgMH07CisgIFRyaW1SaWdodChzdHIpOworfQordm9pZCBDRlhfV2lkZVN0cmluZzo6VHJpbVJpZ2h0KCkgeworICBUcmltUmlnaHQoTCJceDA5XHgwYVx4MGJceDBjXHgwZFx4MjAiKTsKK30KK3ZvaWQgQ0ZYX1dpZGVTdHJpbmc6OlRyaW1MZWZ0KGNvbnN0IEZYX1dDSEFSKiBscHN6VGFyZ2V0cykgeworICBGWFNZU19hc3NlcnQobHBzelRhcmdldHMpOworICBpZiAoIW1fcERhdGEgfHwgKmxwc3pUYXJnZXRzID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ29weUJlZm9yZVdyaXRlKCk7CisgIGlmIChHZXRMZW5ndGgoKSA8IDEpIHsKKyAgICByZXR1cm47CisgIH0KKyAgY29uc3QgRlhfV0NIQVIqIGxwc3ogPSBtX3BEYXRhLT5tX1N0cmluZzsKKyAgd2hpbGUgKCpscHN6ICE9IDApIHsKKyAgICBpZiAoIUZYU1lTX3djc2NocihscHN6VGFyZ2V0cywgKmxwc3opKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgbHBzeisrOworICB9CisgIGlmIChscHN6ICE9IG1fcERhdGEtPm1fU3RyaW5nKSB7CisgICAgaW50IG5EYXRhTGVuZ3RoID0KKyAgICAgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAtIChGWF9TVFJTSVpFKShscHN6IC0gbV9wRGF0YS0+bV9TdHJpbmcpOworICAgIEZYU1lTX21lbW1vdmUobV9wRGF0YS0+bV9TdHJpbmcsIGxwc3osCisgICAgICAgICAgICAgICAgICAobkRhdGFMZW5ndGggKyAxKSAqIHNpemVvZihGWF9XQ0hBUikpOworICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuRGF0YUxlbmd0aDsKKyAgfQorfQordm9pZCBDRlhfV2lkZVN0cmluZzo6VHJpbUxlZnQoRlhfV0NIQVIgY2hUYXJnZXQpIHsKKyAgRlhfV0NIQVIgc3RyWzJdID0ge2NoVGFyZ2V0LCAwfTsKKyAgVHJpbUxlZnQoc3RyKTsKK30KK3ZvaWQgQ0ZYX1dpZGVTdHJpbmc6OlRyaW1MZWZ0KCkgeworICBUcmltTGVmdChMIlx4MDlceDBhXHgwYlx4MGNceDBkXHgyMCIpOworfQorRlhfU1RSU0laRSBDRlhfV2lkZVN0cmluZzo6UmVwbGFjZShjb25zdCBGWF9XQ0hBUiogbHBzek9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIGxwc3pOZXcpIHsKKyAgaWYgKEdldExlbmd0aCgpIDwgMSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmICghbHBzek9sZCkgeworICAgIHJldHVybiAwOworICB9CisgIEZYX1NUUlNJWkUgblNvdXJjZUxlbiA9IEZYU1lTX3djc2xlbihscHN6T2xkKTsKKyAgaWYgKG5Tb3VyY2VMZW4gPT0gMCkgeworICAgIHJldHVybiAwOworICB9CisgIEZYX1NUUlNJWkUgblJlcGxhY2VtZW50TGVuID0gbHBzek5ldyA/IEZYU1lTX3djc2xlbihscHN6TmV3KSA6IDA7CisgIEZYX1NUUlNJWkUgbkNvdW50ID0gMDsKKyAgRlhfV0NIQVIqIGxwc3pTdGFydCA9IG1fcERhdGEtPm1fU3RyaW5nOworICBGWF9XQ0hBUiogbHBzekVuZCA9IG1fcERhdGEtPm1fU3RyaW5nICsgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKKyAgRlhfV0NIQVIqIGxwc3pUYXJnZXQ7CisgIHsKKyAgICB3aGlsZSAoKGxwc3pUYXJnZXQgPSAoRlhfV0NIQVIqKUZYU1lTX3djc3N0cihscHN6U3RhcnQsIGxwc3pPbGQpKSAmJgorICAgICAgICAgICBscHN6U3RhcnQgPCBscHN6RW5kKSB7CisgICAgICBuQ291bnQrKzsKKyAgICAgIGxwc3pTdGFydCA9IGxwc3pUYXJnZXQgKyBuU291cmNlTGVuOworICAgIH0KKyAgfQorICBpZiAobkNvdW50ID4gMCkgeworICAgIENvcHlCZWZvcmVXcml0ZSgpOworICAgIEZYX1NUUlNJWkUgbk9sZExlbmd0aCA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7CisgICAgRlhfU1RSU0laRSBuTmV3TGVuZ3RoID0KKyAgICAgICAgbk9sZExlbmd0aCArIChuUmVwbGFjZW1lbnRMZW4gLSBuU291cmNlTGVuKSAqIG5Db3VudDsKKyAgICBpZiAobV9wRGF0YS0+bV9uQWxsb2NMZW5ndGggPCBuTmV3TGVuZ3RoIHx8IG1fcERhdGEtPm1fblJlZnMgPiAxKSB7CisgICAgICBTdHJpbmdEYXRhKiBwT2xkRGF0YSA9IG1fcERhdGE7CisgICAgICBjb25zdCBGWF9XQ0hBUiogcHN0ciA9IG1fcERhdGEtPm1fU3RyaW5nOworICAgICAgbV9wRGF0YSA9IFN0cmluZ0RhdGE6OkNyZWF0ZShuTmV3TGVuZ3RoKTsKKyAgICAgIGlmICghbV9wRGF0YSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIEZYU1lTX21lbWNweShtX3BEYXRhLT5tX1N0cmluZywgcHN0ciwKKyAgICAgICAgICAgICAgICAgICBwT2xkRGF0YS0+bV9uRGF0YUxlbmd0aCAqIHNpemVvZihGWF9XQ0hBUikpOworICAgICAgcE9sZERhdGEtPlJlbGVhc2UoKTsKKyAgICB9CisgICAgbHBzelN0YXJ0ID0gbV9wRGF0YS0+bV9TdHJpbmc7CisgICAgbHBzekVuZCA9IG1fcERhdGEtPm1fU3RyaW5nICsgc3RkOjptYXgobV9wRGF0YS0+bV9uRGF0YUxlbmd0aCwgbk5ld0xlbmd0aCk7CisgICAgeworICAgICAgd2hpbGUgKChscHN6VGFyZ2V0ID0gKEZYX1dDSEFSKilGWFNZU193Y3NzdHIobHBzelN0YXJ0LCBscHN6T2xkKSkgIT0KKyAgICAgICAgICAgICAgICAgTlVMTCAmJgorICAgICAgICAgICAgIGxwc3pTdGFydCA8IGxwc3pFbmQpIHsKKyAgICAgICAgRlhfU1RSU0laRSBuQmFsYW5jZSA9CisgICAgICAgICAgICBuT2xkTGVuZ3RoIC0KKyAgICAgICAgICAgIChGWF9TVFJTSVpFKShscHN6VGFyZ2V0IC0gbV9wRGF0YS0+bV9TdHJpbmcgKyBuU291cmNlTGVuKTsKKyAgICAgICAgRlhTWVNfbWVtbW92ZShscHN6VGFyZ2V0ICsgblJlcGxhY2VtZW50TGVuLCBscHN6VGFyZ2V0ICsgblNvdXJjZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBuQmFsYW5jZSAqIHNpemVvZihGWF9XQ0hBUikpOworICAgICAgICBGWFNZU19tZW1jcHkobHBzelRhcmdldCwgbHBzek5ldywgblJlcGxhY2VtZW50TGVuICogc2l6ZW9mKEZYX1dDSEFSKSk7CisgICAgICAgIGxwc3pTdGFydCA9IGxwc3pUYXJnZXQgKyBuUmVwbGFjZW1lbnRMZW47CisgICAgICAgIGxwc3pTdGFydFtuQmFsYW5jZV0gPSAwOworICAgICAgICBuT2xkTGVuZ3RoICs9IChuUmVwbGFjZW1lbnRMZW4gLSBuU291cmNlTGVuKTsKKyAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUKG1fcERhdGEtPm1fU3RyaW5nW25OZXdMZW5ndGhdID09IDApOworICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuTmV3TGVuZ3RoOworICB9CisgIHJldHVybiBuQ291bnQ7Cit9CitGWF9TVFJTSVpFIENGWF9XaWRlU3RyaW5nOjpJbnNlcnQoRlhfU1RSU0laRSBuSW5kZXgsIEZYX1dDSEFSIGNoKSB7CisgIENvcHlCZWZvcmVXcml0ZSgpOworICBpZiAobkluZGV4IDwgMCkgeworICAgIG5JbmRleCA9IDA7CisgIH0KKyAgRlhfU1RSU0laRSBuTmV3TGVuZ3RoID0gR2V0TGVuZ3RoKCk7CisgIGlmIChuSW5kZXggPiBuTmV3TGVuZ3RoKSB7CisgICAgbkluZGV4ID0gbk5ld0xlbmd0aDsKKyAgfQorICBuTmV3TGVuZ3RoKys7CisgIGlmICghbV9wRGF0YSB8fCBtX3BEYXRhLT5tX25BbGxvY0xlbmd0aCA8IG5OZXdMZW5ndGgpIHsKKyAgICBTdHJpbmdEYXRhKiBwT2xkRGF0YSA9IG1fcERhdGE7CisgICAgY29uc3QgRlhfV0NIQVIqIHBzdHIgPSBtX3BEYXRhLT5tX1N0cmluZzsKKyAgICBtX3BEYXRhID0gU3RyaW5nRGF0YTo6Q3JlYXRlKG5OZXdMZW5ndGgpOworICAgIGlmICghbV9wRGF0YSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChwT2xkRGF0YSkgeworICAgICAgRlhTWVNfbWVtbW92ZShtX3BEYXRhLT5tX1N0cmluZywgcHN0ciwKKyAgICAgICAgICAgICAgICAgICAgKHBPbGREYXRhLT5tX25EYXRhTGVuZ3RoICsgMSkgKiBzaXplb2YoRlhfV0NIQVIpKTsKKyAgICAgIHBPbGREYXRhLT5SZWxlYXNlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fcERhdGEtPm1fU3RyaW5nWzBdID0gMDsKKyAgICB9CisgIH0KKyAgRlhTWVNfbWVtbW92ZShtX3BEYXRhLT5tX1N0cmluZyArIG5JbmRleCArIDEsIG1fcERhdGEtPm1fU3RyaW5nICsgbkluZGV4LAorICAgICAgICAgICAgICAgIChuTmV3TGVuZ3RoIC0gbkluZGV4KSAqIHNpemVvZihGWF9XQ0hBUikpOworICBtX3BEYXRhLT5tX1N0cmluZ1tuSW5kZXhdID0gY2g7CisgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuTmV3TGVuZ3RoOworICByZXR1cm4gbk5ld0xlbmd0aDsKK30KK0ZYX1NUUlNJWkUgQ0ZYX1dpZGVTdHJpbmc6OkRlbGV0ZShGWF9TVFJTSVpFIG5JbmRleCwgRlhfU1RSU0laRSBuQ291bnQpIHsKKyAgaWYgKEdldExlbmd0aCgpIDwgMSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChuSW5kZXggPCAwKSB7CisgICAgbkluZGV4ID0gMDsKKyAgfQorICBGWF9TVFJTSVpFIG5PbGRMZW5ndGggPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOworICBpZiAobkNvdW50ID4gMCAmJiBuSW5kZXggPCBuT2xkTGVuZ3RoKSB7CisgICAgQ29weUJlZm9yZVdyaXRlKCk7CisgICAgaW50IG5CeXRlc1RvQ29weSA9IG5PbGRMZW5ndGggLSAobkluZGV4ICsgbkNvdW50KSArIDE7CisgICAgRlhTWVNfbWVtbW92ZShtX3BEYXRhLT5tX1N0cmluZyArIG5JbmRleCwKKyAgICAgICAgICAgICAgICAgIG1fcERhdGEtPm1fU3RyaW5nICsgbkluZGV4ICsgbkNvdW50LAorICAgICAgICAgICAgICAgICAgbkJ5dGVzVG9Db3B5ICogc2l6ZW9mKEZYX1dDSEFSKSk7CisgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IG5PbGRMZW5ndGggLSBuQ291bnQ7CisgIH0KKyAgcmV0dXJuIG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7Cit9CitGWF9TVFJTSVpFIENGWF9XaWRlU3RyaW5nOjpSZW1vdmUoRlhfV0NIQVIgY2hSZW1vdmUpIHsKKyAgaWYgKCFtX3BEYXRhKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgQ29weUJlZm9yZVdyaXRlKCk7CisgIGlmIChHZXRMZW5ndGgoKSA8IDEpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBGWF9XQ0hBUiogcHN0clNvdXJjZSA9IG1fcERhdGEtPm1fU3RyaW5nOworICBGWF9XQ0hBUiogcHN0ckRlc3QgPSBtX3BEYXRhLT5tX1N0cmluZzsKKyAgRlhfV0NIQVIqIHBzdHJFbmQgPSBtX3BEYXRhLT5tX1N0cmluZyArIG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7CisgIHdoaWxlIChwc3RyU291cmNlIDwgcHN0ckVuZCkgeworICAgIGlmICgqcHN0clNvdXJjZSAhPSBjaFJlbW92ZSkgeworICAgICAgKnBzdHJEZXN0ID0gKnBzdHJTb3VyY2U7CisgICAgICBwc3RyRGVzdCsrOworICAgIH0KKyAgICBwc3RyU291cmNlKys7CisgIH0KKyAgKnBzdHJEZXN0ID0gMDsKKyAgRlhfU1RSU0laRSBuQ291bnQgPSAoRlhfU1RSU0laRSkocHN0clNvdXJjZSAtIHBzdHJEZXN0KTsKKyAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAtPSBuQ291bnQ7CisgIHJldHVybiBuQ291bnQ7Cit9CisjZGVmaW5lIEZPUkNFX0FOU0kgMHgxMDAwMAorI2RlZmluZSBGT1JDRV9VTklDT0RFIDB4MjAwMDAKKyNkZWZpbmUgRk9SQ0VfSU5UNjQgMHg0MDAwMAordm9pZCBDRlhfV2lkZVN0cmluZzo6Rm9ybWF0Vihjb25zdCBGWF9XQ0hBUiogbHBzekZvcm1hdCwgdmFfbGlzdCBhcmdMaXN0KSB7CisgIHZhX2xpc3QgYXJnTGlzdFNhdmU7CisjaWYgZGVmaW5lZChfX0FSTUNDX1ZFUlNJT04pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoIWRlZmluZWQoX01TQ19WRVIpICYmIChfRlhfQ1BVXyA9PSBfRlhfWDY0XyB8fCBfRlhfQ1BVXyA9PSBfRlhfSUE2NF8gfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9GWF9DUFVfID09IF9GWF9BUk02NF8pKSB8fCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGVmaW5lZChfX25hdGl2ZV9jbGllbnRfXykKKyAgdmFfY29weShhcmdMaXN0U2F2ZSwgYXJnTGlzdCk7CisjZWxzZQorICBhcmdMaXN0U2F2ZSA9IGFyZ0xpc3Q7CisjZW5kaWYKKyAgaW50IG5NYXhMZW4gPSAwOworICBmb3IgKGNvbnN0IEZYX1dDSEFSKiBscHN6ID0gbHBzekZvcm1hdDsgKmxwc3ogIT0gMDsgbHBzeisrKSB7CisgICAgaWYgKCpscHN6ICE9ICclJyB8fCAqKGxwc3ogPSBscHN6ICsgMSkgPT0gJyUnKSB7CisgICAgICBuTWF4TGVuICs9IEZYU1lTX3djc2xlbihscHN6KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgbkl0ZW1MZW4gPSAwOworICAgIGludCBuV2lkdGggPSAwOworICAgIGZvciAoOyAqbHBzeiAhPSAwOyBscHN6KyspIHsKKyAgICAgIGlmICgqbHBzeiA9PSAnIycpIHsKKyAgICAgICAgbk1heExlbiArPSAyOworICAgICAgfSBlbHNlIGlmICgqbHBzeiA9PSAnKicpIHsKKyAgICAgICAgbldpZHRoID0gdmFfYXJnKGFyZ0xpc3QsIGludCk7CisgICAgICB9IGVsc2UgaWYgKCpscHN6ICE9ICctJyAmJiAqbHBzeiAhPSAnKycgJiYgKmxwc3ogIT0gJzAnICYmICpscHN6ICE9ICcgJykgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG5XaWR0aCA9PSAwKSB7CisgICAgICBuV2lkdGggPSBGWFNZU193dG9pKGxwc3opOworICAgICAgd2hpbGUgKHN0ZDo6aXN3ZGlnaXQoKmxwc3opKQorICAgICAgICArK2xwc3o7CisgICAgfQorICAgIGlmIChuV2lkdGggPCAwIHx8IG5XaWR0aCA+IDEyOCAqIDEwMjQpIHsKKyAgICAgIGxwc3pGb3JtYXQgPSBMIkJhZCB3aWR0aCI7CisgICAgICBuTWF4TGVuID0gMTA7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaW50IG5QcmVjaXNpb24gPSAwOworICAgIGlmICgqbHBzeiA9PSAnLicpIHsKKyAgICAgIGxwc3orKzsKKyAgICAgIGlmICgqbHBzeiA9PSAnKicpIHsKKyAgICAgICAgblByZWNpc2lvbiA9IHZhX2FyZyhhcmdMaXN0LCBpbnQpOworICAgICAgICBscHN6Kys7CisgICAgICB9IGVsc2UgeworICAgICAgICBuUHJlY2lzaW9uID0gRlhTWVNfd3RvaShscHN6KTsKKyAgICAgICAgd2hpbGUgKHN0ZDo6aXN3ZGlnaXQoKmxwc3opKQorICAgICAgICAgICsrbHBzejsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG5QcmVjaXNpb24gPCAwIHx8IG5QcmVjaXNpb24gPiAxMjggKiAxMDI0KSB7CisgICAgICBscHN6Rm9ybWF0ID0gTCJCYWQgcHJlY2lzaW9uIjsKKyAgICAgIG5NYXhMZW4gPSAxNDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpbnQgbk1vZGlmaWVyID0gMDsKKyAgICBpZiAoKmxwc3ogPT0gTCdJJyAmJiAqKGxwc3ogKyAxKSA9PSBMJzYnICYmICoobHBzeiArIDIpID09IEwnNCcpIHsKKyAgICAgIGxwc3ogKz0gMzsKKyAgICAgIG5Nb2RpZmllciA9IEZPUkNFX0lOVDY0OworICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKCpscHN6KSB7CisgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgIG5Nb2RpZmllciA9IEZPUkNFX0FOU0k7CisgICAgICAgICAgbHBzeisrOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdsJzoKKyAgICAgICAgICBuTW9kaWZpZXIgPSBGT1JDRV9VTklDT0RFOworICAgICAgICAgIGxwc3orKzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnRic6CisgICAgICAgIGNhc2UgJ04nOgorICAgICAgICBjYXNlICdMJzoKKyAgICAgICAgICBscHN6Kys7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHN3aXRjaCAoKmxwc3ogfCBuTW9kaWZpZXIpIHsKKyAgICAgIGNhc2UgJ2MnOgorICAgICAgY2FzZSAnQyc6CisgICAgICAgIG5JdGVtTGVuID0gMjsKKyAgICAgICAgdmFfYXJnKGFyZ0xpc3QsIGludCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnYycgfCBGT1JDRV9BTlNJOgorICAgICAgY2FzZSAnQycgfCBGT1JDRV9BTlNJOgorICAgICAgICBuSXRlbUxlbiA9IDI7CisgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ2MnIHwgRk9SQ0VfVU5JQ09ERToKKyAgICAgIGNhc2UgJ0MnIHwgRk9SQ0VfVU5JQ09ERToKKyAgICAgICAgbkl0ZW1MZW4gPSAyOworICAgICAgICB2YV9hcmcoYXJnTGlzdCwgaW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdzJzogeworICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN0ck5leHRBcmcgPSB2YV9hcmcoYXJnTGlzdCwgY29uc3QgRlhfV0NIQVIqKTsKKyAgICAgICAgaWYgKHBzdHJOZXh0QXJnKSB7CisgICAgICAgICAgbkl0ZW1MZW4gPSBGWFNZU193Y3NsZW4ocHN0ck5leHRBcmcpOworICAgICAgICAgIGlmIChuSXRlbUxlbiA8IDEpIHsKKyAgICAgICAgICAgIG5JdGVtTGVuID0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbkl0ZW1MZW4gPSA2OworICAgICAgICB9CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSAnUyc6IHsKKyAgICAgICAgY29uc3QgRlhfQ0hBUiogcHN0ck5leHRBcmcgPSB2YV9hcmcoYXJnTGlzdCwgY29uc3QgRlhfQ0hBUiopOworICAgICAgICBpZiAocHN0ck5leHRBcmcpIHsKKyAgICAgICAgICBuSXRlbUxlbiA9IEZYU1lTX3N0cmxlbihwc3RyTmV4dEFyZyk7CisgICAgICAgICAgaWYgKG5JdGVtTGVuIDwgMSkgeworICAgICAgICAgICAgbkl0ZW1MZW4gPSAxOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuSXRlbUxlbiA9IDY7CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlICdzJyB8IEZPUkNFX0FOU0k6CisgICAgICBjYXNlICdTJyB8IEZPUkNFX0FOU0k6IHsKKyAgICAgICAgY29uc3QgRlhfQ0hBUiogcHN0ck5leHRBcmcgPSB2YV9hcmcoYXJnTGlzdCwgY29uc3QgRlhfQ0hBUiopOworICAgICAgICBpZiAocHN0ck5leHRBcmcpIHsKKyAgICAgICAgICBuSXRlbUxlbiA9IEZYU1lTX3N0cmxlbihwc3RyTmV4dEFyZyk7CisgICAgICAgICAgaWYgKG5JdGVtTGVuIDwgMSkgeworICAgICAgICAgICAgbkl0ZW1MZW4gPSAxOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuSXRlbUxlbiA9IDY7CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlICdzJyB8IEZPUkNFX1VOSUNPREU6CisgICAgICBjYXNlICdTJyB8IEZPUkNFX1VOSUNPREU6IHsKKyAgICAgICAgRlhfV0NIQVIqIHBzdHJOZXh0QXJnID0gdmFfYXJnKGFyZ0xpc3QsIEZYX1dDSEFSKik7CisgICAgICAgIGlmIChwc3RyTmV4dEFyZykgeworICAgICAgICAgIG5JdGVtTGVuID0gRlhTWVNfd2NzbGVuKHBzdHJOZXh0QXJnKTsKKyAgICAgICAgICBpZiAobkl0ZW1MZW4gPCAxKSB7CisgICAgICAgICAgICBuSXRlbUxlbiA9IDE7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5JdGVtTGVuID0gNjsKKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKyAgICB9CisgICAgaWYgKG5JdGVtTGVuICE9IDApIHsKKyAgICAgIGlmIChuUHJlY2lzaW9uICE9IDAgJiYgbkl0ZW1MZW4gPiBuUHJlY2lzaW9uKSB7CisgICAgICAgIG5JdGVtTGVuID0gblByZWNpc2lvbjsKKyAgICAgIH0KKyAgICAgIGlmIChuSXRlbUxlbiA8IG5XaWR0aCkgeworICAgICAgICBuSXRlbUxlbiA9IG5XaWR0aDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoICgqbHBzeikgeworICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgY2FzZSAnaSc6CisgICAgICAgIGNhc2UgJ3UnOgorICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgY2FzZSAnWCc6CisgICAgICAgIGNhc2UgJ28nOgorICAgICAgICAgIGlmIChuTW9kaWZpZXIgJiBGT1JDRV9JTlQ2NCkgeworICAgICAgICAgICAgdmFfYXJnKGFyZ0xpc3QsIGludDY0X3QpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YV9hcmcoYXJnTGlzdCwgaW50KTsKKyAgICAgICAgICB9CisgICAgICAgICAgbkl0ZW1MZW4gPSAzMjsKKyAgICAgICAgICBpZiAobkl0ZW1MZW4gPCBuV2lkdGggKyBuUHJlY2lzaW9uKSB7CisgICAgICAgICAgICBuSXRlbUxlbiA9IG5XaWR0aCArIG5QcmVjaXNpb247CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdhJzoKKyAgICAgICAgY2FzZSAnQSc6CisgICAgICAgIGNhc2UgJ2UnOgorICAgICAgICBjYXNlICdFJzoKKyAgICAgICAgY2FzZSAnZyc6CisgICAgICAgIGNhc2UgJ0cnOgorICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBkb3VibGUpOworICAgICAgICAgIG5JdGVtTGVuID0gMTI4OworICAgICAgICAgIGlmIChuSXRlbUxlbiA8IG5XaWR0aCArIG5QcmVjaXNpb24pIHsKKyAgICAgICAgICAgIG5JdGVtTGVuID0gbldpZHRoICsgblByZWNpc2lvbjsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgIGlmIChuV2lkdGggKyBuUHJlY2lzaW9uID4gMTAwKSB7CisgICAgICAgICAgICBuSXRlbUxlbiA9IG5QcmVjaXNpb24gKyBuV2lkdGggKyAxMjg7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRvdWJsZSBmOworICAgICAgICAgICAgY2hhciBwc3pUZW1wWzI1Nl07CisgICAgICAgICAgICBmID0gdmFfYXJnKGFyZ0xpc3QsIGRvdWJsZSk7CisgICAgICAgICAgICBGWFNZU19zbnByaW50Zihwc3pUZW1wLCBzaXplb2YocHN6VGVtcCksICIlKi4qZiIsIG5XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QcmVjaXNpb24gKyA2LCBmKTsKKyAgICAgICAgICAgIG5JdGVtTGVuID0gRlhTWVNfc3RybGVuKHBzelRlbXApOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAncCc6CisgICAgICAgICAgdmFfYXJnKGFyZ0xpc3QsIHZvaWQqKTsKKyAgICAgICAgICBuSXRlbUxlbiA9IDMyOworICAgICAgICAgIGlmIChuSXRlbUxlbiA8IG5XaWR0aCArIG5QcmVjaXNpb24pIHsKKyAgICAgICAgICAgIG5JdGVtTGVuID0gbldpZHRoICsgblByZWNpc2lvbjsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ24nOgorICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQqKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgbk1heExlbiArPSBuSXRlbUxlbjsKKyAgfQorICBHZXRCdWZmZXIobk1heExlbik7CisgIGlmIChtX3BEYXRhKSB7CisgICAgRlhTWVNfdnN3cHJpbnRmKCh3Y2hhcl90KiltX3BEYXRhLT5tX1N0cmluZywgbk1heExlbiArIDEsCisgICAgICAgICAgICAgICAgICAgIChjb25zdCB3Y2hhcl90KilscHN6Rm9ybWF0LCBhcmdMaXN0U2F2ZSk7CisgICAgUmVsZWFzZUJ1ZmZlcigpOworICB9CisgIHZhX2VuZChhcmdMaXN0U2F2ZSk7Cit9Cit2b2lkIENGWF9XaWRlU3RyaW5nOjpGb3JtYXQoY29uc3QgRlhfV0NIQVIqIGxwc3pGb3JtYXQsIC4uLikgeworICB2YV9saXN0IGFyZ0xpc3Q7CisgIHZhX3N0YXJ0KGFyZ0xpc3QsIGxwc3pGb3JtYXQpOworICBGb3JtYXRWKGxwc3pGb3JtYXQsIGFyZ0xpc3QpOworICB2YV9lbmQoYXJnTGlzdCk7Cit9CitGWF9GTE9BVCBGWF93dG9mKGNvbnN0IEZYX1dDSEFSKiBzdHIsIGludCBsZW4pIHsKKyAgaWYgKGxlbiA9PSAwKSB7CisgICAgcmV0dXJuIDAuMDsKKyAgfQorICBpbnQgY2MgPSAwOworICBGWF9CT09MIGJOZWdhdGl2ZSA9IEZBTFNFOworICBpZiAoc3RyWzBdID09ICcrJykgeworICAgIGNjKys7CisgIH0gZWxzZSBpZiAoc3RyWzBdID09ICctJykgeworICAgIGJOZWdhdGl2ZSA9IFRSVUU7CisgICAgY2MrKzsKKyAgfQorICBpbnQgaW50ZWdlciA9IDA7CisgIHdoaWxlIChjYyA8IGxlbikgeworICAgIGlmIChzdHJbY2NdID09ICcuJykgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGludGVnZXIgPSBpbnRlZ2VyICogMTAgKyBGWFNZU190b0RlY2ltYWxEaWdpdFdpZGUoc3RyW2NjXSk7CisgICAgY2MrKzsKKyAgfQorICBGWF9GTE9BVCBmcmFjdGlvbiA9IDA7CisgIGlmIChzdHJbY2NdID09ICcuJykgeworICAgIGNjKys7CisgICAgRlhfRkxPQVQgc2NhbGUgPSAwLjFmOworICAgIHdoaWxlIChjYyA8IGxlbikgeworICAgICAgZnJhY3Rpb24gKz0gc2NhbGUgKiBGWFNZU190b0RlY2ltYWxEaWdpdFdpZGUoc3RyW2NjXSk7CisgICAgICBzY2FsZSAqPSAwLjFmOworICAgICAgY2MrKzsKKyAgICB9CisgIH0KKyAgZnJhY3Rpb24gKz0gKEZYX0ZMT0FUKWludGVnZXI7CisgIHJldHVybiBiTmVnYXRpdmUgPyAtZnJhY3Rpb24gOiBmcmFjdGlvbjsKK30KK2ludCBDRlhfV2lkZVN0cmluZzo6R2V0SW50ZWdlcigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcERhdGEgPyBGWFNZU193dG9pKG1fcERhdGEtPm1fU3RyaW5nKSA6IDA7Cit9CitGWF9GTE9BVCBDRlhfV2lkZVN0cmluZzo6R2V0RmxvYXQoKSBjb25zdCB7CisgIHJldHVybiBtX3BEYXRhID8gRlhfd3RvZihtX3BEYXRhLT5tX1N0cmluZywgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgOiAwLjBmOworfQorc3RhdGljIENGWF9CeXRlU3RyaW5nIF9EZWZNYXBfR2V0Qnl0ZVN0cmluZyhDRlhfQ2hhck1hcCogcENoYXJNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3aWRlc3RyKSB7CisgIGludCBzcmNfbGVuID0gd2lkZXN0ci5HZXRMZW5ndGgoKTsKKyAgaW50IGNvZGVwYWdlID0gcENoYXJNYXAtPm1fR2V0Q29kZVBhZ2UgPyBwQ2hhck1hcC0+bV9HZXRDb2RlUGFnZSgpIDogMDsKKyAgaW50IGRlc3RfbGVuID0gRlhTWVNfV2lkZUNoYXJUb011bHRpQnl0ZShjb2RlcGFnZSwgMCwgd2lkZXN0ci5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19sZW4sIE5VTEwsIDAsIE5VTEwsIE5VTEwpOworICBpZiAoZGVzdF9sZW4gPT0gMCkgeworICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOworICB9CisgIENGWF9CeXRlU3RyaW5nIGJ5dGVzdHI7CisgIEZYX0NIQVIqIGRlc3RfYnVmID0gYnl0ZXN0ci5HZXRCdWZmZXIoZGVzdF9sZW4pOworICBGWFNZU19XaWRlQ2hhclRvTXVsdGlCeXRlKGNvZGVwYWdlLCAwLCB3aWRlc3RyLmNfc3RyKCksIHNyY19sZW4sIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfbGVuLCBOVUxMLCBOVUxMKTsKKyAgYnl0ZXN0ci5SZWxlYXNlQnVmZmVyKGRlc3RfbGVuKTsKKyAgcmV0dXJuIGJ5dGVzdHI7Cit9CitzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgX0RlZk1hcF9HZXRXaWRlU3RyaW5nKENGWF9DaGFyTWFwKiBwQ2hhck1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJ5dGVzdHIpIHsKKyAgaW50IHNyY19sZW4gPSBieXRlc3RyLkdldExlbmd0aCgpOworICBpbnQgY29kZXBhZ2UgPSBwQ2hhck1hcC0+bV9HZXRDb2RlUGFnZSA/IHBDaGFyTWFwLT5tX0dldENvZGVQYWdlKCkgOiAwOworICBpbnQgZGVzdF9sZW4gPQorICAgICAgRlhTWVNfTXVsdGlCeXRlVG9XaWRlQ2hhcihjb2RlcGFnZSwgMCwgYnl0ZXN0ciwgc3JjX2xlbiwgTlVMTCwgMCk7CisgIGlmIChkZXN0X2xlbiA9PSAwKSB7CisgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7CisgIH0KKyAgQ0ZYX1dpZGVTdHJpbmcgd2lkZXN0cjsKKyAgRlhfV0NIQVIqIGRlc3RfYnVmID0gd2lkZXN0ci5HZXRCdWZmZXIoZGVzdF9sZW4pOworICBGWFNZU19NdWx0aUJ5dGVUb1dpZGVDaGFyKGNvZGVwYWdlLCAwLCBieXRlc3RyLCBzcmNfbGVuLCBkZXN0X2J1ZiwgZGVzdF9sZW4pOworICB3aWRlc3RyLlJlbGVhc2VCdWZmZXIoZGVzdF9sZW4pOworICByZXR1cm4gd2lkZXN0cjsKK30KK3N0YXRpYyBpbnQgX0RlZk1hcF9HZXRHQktDb2RlUGFnZSgpIHsKKyAgcmV0dXJuIDkzNjsKK30KK3N0YXRpYyBpbnQgX0RlZk1hcF9HZXRVSENDb2RlUGFnZSgpIHsKKyAgcmV0dXJuIDk0OTsKK30KK3N0YXRpYyBpbnQgX0RlZk1hcF9HZXRKSVNDb2RlUGFnZSgpIHsKKyAgcmV0dXJuIDkzMjsKK30KK3N0YXRpYyBpbnQgX0RlZk1hcF9HZXRCaWc1Q29kZVBhZ2UoKSB7CisgIHJldHVybiA5NTA7Cit9CitzdGF0aWMgY29uc3QgQ0ZYX0NoYXJNYXAgZ19EZWZhdWx0TWFwcGVyID0geyZfRGVmTWFwX0dldFdpZGVTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfRGVmTWFwX0dldEJ5dGVTdHJpbmcsIE5VTEx9Oworc3RhdGljIGNvbnN0IENGWF9DaGFyTWFwIGdfRGVmYXVsdEdCS01hcHBlciA9IHsKKyAgICAmX0RlZk1hcF9HZXRXaWRlU3RyaW5nLCAmX0RlZk1hcF9HZXRCeXRlU3RyaW5nLCAmX0RlZk1hcF9HZXRHQktDb2RlUGFnZX07CitzdGF0aWMgY29uc3QgQ0ZYX0NoYXJNYXAgZ19EZWZhdWx0SklTTWFwcGVyID0geworICAgICZfRGVmTWFwX0dldFdpZGVTdHJpbmcsICZfRGVmTWFwX0dldEJ5dGVTdHJpbmcsICZfRGVmTWFwX0dldEpJU0NvZGVQYWdlfTsKK3N0YXRpYyBjb25zdCBDRlhfQ2hhck1hcCBnX0RlZmF1bHRVSENNYXBwZXIgPSB7CisgICAgJl9EZWZNYXBfR2V0V2lkZVN0cmluZywgJl9EZWZNYXBfR2V0Qnl0ZVN0cmluZywgJl9EZWZNYXBfR2V0VUhDQ29kZVBhZ2V9Oworc3RhdGljIGNvbnN0IENGWF9DaGFyTWFwIGdfRGVmYXVsdEJpZzVNYXBwZXIgPSB7CisgICAgJl9EZWZNYXBfR2V0V2lkZVN0cmluZywgJl9EZWZNYXBfR2V0Qnl0ZVN0cmluZywgJl9EZWZNYXBfR2V0QmlnNUNvZGVQYWdlfTsKK0NGWF9DaGFyTWFwKiBDRlhfQ2hhck1hcDo6R2V0RGVmYXVsdE1hcHBlcihpbnQzMl90IGNvZGVwYWdlKSB7CisgIHN3aXRjaCAoY29kZXBhZ2UpIHsKKyAgICBjYXNlIDA6CisgICAgICByZXR1cm4gKENGWF9DaGFyTWFwKikmZ19EZWZhdWx0TWFwcGVyOworICAgIGNhc2UgOTMyOgorICAgICAgcmV0dXJuIChDRlhfQ2hhck1hcCopJmdfRGVmYXVsdEpJU01hcHBlcjsKKyAgICBjYXNlIDkzNjoKKyAgICAgIHJldHVybiAoQ0ZYX0NoYXJNYXAqKSZnX0RlZmF1bHRHQktNYXBwZXI7CisgICAgY2FzZSA5NDk6CisgICAgICByZXR1cm4gKENGWF9DaGFyTWFwKikmZ19EZWZhdWx0VUhDTWFwcGVyOworICAgIGNhc2UgOTUwOgorICAgICAgcmV0dXJuIChDRlhfQ2hhck1hcCopJmdfRGVmYXVsdEJpZzVNYXBwZXI7CisgIH0KKyAgcmV0dXJuIE5VTEw7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9iYXNpY193c3RyaW5nX3VuaXR0ZXN0LmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3dzdHJpbmdfdW5pdHRlc3QuY3BwCmluZGV4IDg0N2U1ZTguLjY0ZDY5NGMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3dzdHJpbmdfdW5pdHRlc3QuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3dzdHJpbmdfdW5pdHRlc3QuY3BwCkBAIC0yLDQ0MSArMiw1MjMgQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2Z4X3N0cmluZ190ZXN0aGVscGVycy5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL3Rlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgogCiBURVNUKGZ4Y3J0LCBXaWRlU3RyaW5nT3BlcmF0b3JTdWJzY3JpcHQpIHsKLSAgICAvLyBDRlhfV2lkZVN0cmluZyBpbmNsdWRlcyB0aGUgTlVMIHRlcm1pbmF0b3IgZm9yIG5vbi1lbXB0eSBzdHJpbmdzLgotICAgIENGWF9XaWRlU3RyaW5nIGFiYyhMImFiYyIpOwotICAgIEVYUEVDVF9FUShMJ2EnLCBhYmNbMF0pOwotICAgIEVYUEVDVF9FUShMJ2InLCBhYmNbMV0pOwotICAgIEVYUEVDVF9FUShMJ2MnLCBhYmNbMl0pOwotICAgIEVYUEVDVF9FUShMJ1wwJywgYWJjWzNdKTsKKyAgLy8gQ0ZYX1dpZGVTdHJpbmcgaW5jbHVkZXMgdGhlIE5VTCB0ZXJtaW5hdG9yIGZvciBub24tZW1wdHkgc3RyaW5ncy4KKyAgQ0ZYX1dpZGVTdHJpbmcgYWJjKEwiYWJjIik7CisgIEVYUEVDVF9FUShMJ2EnLCBhYmNbMF0pOworICBFWFBFQ1RfRVEoTCdiJywgYWJjWzFdKTsKKyAgRVhQRUNUX0VRKEwnYycsIGFiY1syXSk7CisgIEVYUEVDVF9FUShMJ1wwJywgYWJjWzNdKTsKIH0KIAogVEVTVChmeGNydCwgV2lkZVN0cmluZ09wZXJhdG9yTFQpIHsKLSAgICBDRlhfV2lkZVN0cmluZyBlbXB0eTsKLSAgICBDRlhfV2lkZVN0cmluZyBhKEwiYSIpOwotICAgIENGWF9XaWRlU3RyaW5nIGFiYyhMIlx4MDExMHFxIik7ICAvLyBDb21lcyBiZWZvcmUgZGVzcGl0ZSBlbmRpYW5uZXNzLgotICAgIENGWF9XaWRlU3RyaW5nIGRlZihMIlx4MTAwMXFxIik7ICAvLyBDb21lcyBhZnRlciBkZXNwaXRlIGVuZGlhbm5lc3MuCisgIENGWF9XaWRlU3RyaW5nIGVtcHR5OworICBDRlhfV2lkZVN0cmluZyBhKEwiYSIpOworICBDRlhfV2lkZVN0cmluZyBhYmMoTCJceDAxMTBxcSIpOyAgLy8gQ29tZXMgYmVmb3JlIGRlc3BpdGUgZW5kaWFubmVzcy4KKyAgQ0ZYX1dpZGVTdHJpbmcgZGVmKEwiXHgxMDAxcXEiKTsgIC8vIENvbWVzIGFmdGVyIGRlc3BpdGUgZW5kaWFubmVzcy4KIAotICAgIEVYUEVDVF9GQUxTRShlbXB0eSA8IGVtcHR5KTsKLSAgICBFWFBFQ1RfRkFMU0UoYSA8IGEpOwotICAgIEVYUEVDVF9GQUxTRShhYmMgPCBhYmMpOwotICAgIEVYUEVDVF9GQUxTRShkZWYgPCBkZWYpOworICBFWFBFQ1RfRkFMU0UoZW1wdHkgPCBlbXB0eSk7CisgIEVYUEVDVF9GQUxTRShhIDwgYSk7CisgIEVYUEVDVF9GQUxTRShhYmMgPCBhYmMpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgZGVmKTsKIAotICAgIEVYUEVDVF9UUlVFKGVtcHR5IDwgYSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGEgPCBlbXB0eSk7CisgIEVYUEVDVF9UUlVFKGVtcHR5IDwgYSk7CisgIEVYUEVDVF9GQUxTRShhIDwgZW1wdHkpOwogCi0gICAgRVhQRUNUX1RSVUUoZW1wdHkgPCBhYmMpOwotICAgIEVYUEVDVF9GQUxTRShhYmMgPCBlbXB0eSk7CisgIEVYUEVDVF9UUlVFKGVtcHR5IDwgYWJjKTsKKyAgRVhQRUNUX0ZBTFNFKGFiYyA8IGVtcHR5KTsKIAotICAgIEVYUEVDVF9UUlVFKGVtcHR5IDwgZGVmKTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVmIDwgZW1wdHkpOworICBFWFBFQ1RfVFJVRShlbXB0eSA8IGRlZik7CisgIEVYUEVDVF9GQUxTRShkZWYgPCBlbXB0eSk7CiAKLSAgICBFWFBFQ1RfVFJVRShhIDwgYWJjKTsKLSAgICBFWFBFQ1RfRkFMU0UoYWJjIDwgYSk7CisgIEVYUEVDVF9UUlVFKGEgPCBhYmMpOworICBFWFBFQ1RfRkFMU0UoYWJjIDwgYSk7CiAKLSAgICBFWFBFQ1RfVFJVRShhIDwgZGVmKTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVmIDwgYSk7CisgIEVYUEVDVF9UUlVFKGEgPCBkZWYpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgYSk7CiAKLSAgICBFWFBFQ1RfVFJVRShhYmMgPCBkZWYpOwotICAgIEVYUEVDVF9GQUxTRShkZWYgPCBhYmMpOworICBFWFBFQ1RfVFJVRShhYmMgPCBkZWYpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgYWJjKTsKIH0KIAogVEVTVChmeGNydCwgV2lkZVN0cmluZ09wZXJhdG9yRVEpIHsKLSAgICBDRlhfV2lkZVN0cmluZyBudWxsX3N0cmluZzsKLSAgICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBudWxsX3N0cmluZyk7CisgIENGWF9XaWRlU3RyaW5nIG51bGxfc3RyaW5nOworICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBudWxsX3N0cmluZyk7CiAKLSAgICBDRlhfV2lkZVN0cmluZyBlbXB0eV9zdHJpbmcoTCIiKTsKLSAgICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gbnVsbF9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7CisgIENGWF9XaWRlU3RyaW5nIGVtcHR5X3N0cmluZyhMIiIpOworICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKIAotICAgIENGWF9XaWRlU3RyaW5nIGRlbGV0ZWRfc3RyaW5nKEwiaGVsbG8iKTsKLSAgICBkZWxldGVkX3N0cmluZy5EZWxldGUoMCwgNSk7Ci0gICAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gZGVsZXRlZF9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IG51bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IGRlbGV0ZWRfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOworICBDRlhfV2lkZVN0cmluZyBkZWxldGVkX3N0cmluZyhMImhlbGxvIik7CisgIGRlbGV0ZWRfc3RyaW5nLkRlbGV0ZSgwLCA1KTsKKyAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gZGVsZXRlZF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IGRlbGV0ZWRfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKIAotICAgIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nKEwiaGVsbG8iKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyA9PSB3aWRlX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nID09IG51bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgPT0gZGVsZXRlZF9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyA9PSB3aWRlX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyA9PSB3aWRlX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nID09IHdpZGVfc3RyaW5nKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmcoTCJoZWxsbyIpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyA9PSB3aWRlX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgPT0gZGVsZXRlZF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgPT0gd2lkZV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nID09IHdpZGVfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nID09IHdpZGVfc3RyaW5nKTsKIAotICAgIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nX3NhbWUxKEwiaGVsbG8iKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyA9PSB3aWRlX3N0cmluZ19zYW1lMSk7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfc2FtZTEgPT0gd2lkZV9zdHJpbmcpOworICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZ19zYW1lMShMImhlbGxvIik7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nID09IHdpZGVfc3RyaW5nX3NhbWUxKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfc2FtZTEgPT0gd2lkZV9zdHJpbmcpOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmdfc2FtZTIod2lkZV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nID09IHdpZGVfc3RyaW5nX3NhbWUyKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19zYW1lMiA9PSB3aWRlX3N0cmluZyk7CisgIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nX3NhbWUyKHdpZGVfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgPT0gd2lkZV9zdHJpbmdfc2FtZTIpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19zYW1lMiA9PSB3aWRlX3N0cmluZyk7CiAKLSAgICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzEoTCJoZSIpOwotICAgIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nMihMImhlbGxwIik7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmczKEwiaGVsbG9kIik7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nID09IHdpZGVfc3RyaW5nMSk7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nID09IHdpZGVfc3RyaW5nMik7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nID09IHdpZGVfc3RyaW5nMyk7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nMSA9PSB3aWRlX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nMiA9PSB3aWRlX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nMyA9PSB3aWRlX3N0cmluZyk7CisgIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nMShMImhlIik7CisgIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nMihMImhlbGxwIik7CisgIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nMyhMImhlbGxvZCIpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgPT0gd2lkZV9zdHJpbmcxKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nID09IHdpZGVfc3RyaW5nMik7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSB3aWRlX3N0cmluZzMpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcxID09IHdpZGVfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nMiA9PSB3aWRlX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZzMgPT0gd2lkZV9zdHJpbmcpOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmdDIG51bGxfc3RyaW5nX2M7Ci0gICAgQ0ZYX1dpZGVTdHJpbmdDIGVtcHR5X3N0cmluZ19jKEwiIik7Ci0gICAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gbnVsbF9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyA9PSBudWxsX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IG51bGxfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IGVtcHR5X3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZ19jID09IG51bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmdfYyA9PSBudWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmdfYyA9PSBlbXB0eV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZ19jID09IGVtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmdfYyA9PSBkZWxldGVkX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nX2MgPT0gZGVsZXRlZF9zdHJpbmcpOworICBDRlhfV2lkZVN0cmluZ0MgbnVsbF9zdHJpbmdfYzsKKyAgQ0ZYX1dpZGVTdHJpbmdDIGVtcHR5X3N0cmluZ19jKEwiIik7CisgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IG51bGxfc3RyaW5nX2MpOworICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBlbXB0eV9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyA9PSBudWxsX3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IGVtcHR5X3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gbnVsbF9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IGVtcHR5X3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmdfYyA9PSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZ19jID09IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmdfYyA9PSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmdfYyA9PSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZ19jID09IGRlbGV0ZWRfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nX2MgPT0gZGVsZXRlZF9zdHJpbmcpOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2Nfc2FtZTEoTCJoZWxsbyIpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nID09IHdpZGVfc3RyaW5nX2Nfc2FtZTEpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2Nfc2FtZTEgPT0gd2lkZV9zdHJpbmcpOworICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfY19zYW1lMShMImhlbGxvIik7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nID09IHdpZGVfc3RyaW5nX2Nfc2FtZTEpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jX3NhbWUxID09IHdpZGVfc3RyaW5nKTsKIAotICAgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jMShMImhlIik7Ci0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MyKEwiaGVsbHAiKTsKLSAgICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfYzMoTCJoZWxsb2QiKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgPT0gd2lkZV9zdHJpbmdfYzEpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSB3aWRlX3N0cmluZ19jMik7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nID09IHdpZGVfc3RyaW5nX2MzKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYzEgPT0gd2lkZV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jMiA9PSB3aWRlX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MzID09IHdpZGVfc3RyaW5nKTsKKyAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MxKEwiaGUiKTsKKyAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MyKEwiaGVsbHAiKTsKKyAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MzKEwiaGVsbG9kIik7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSB3aWRlX3N0cmluZ19jMSk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSB3aWRlX3N0cmluZ19jMik7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSB3aWRlX3N0cmluZ19jMyk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jMSA9PSB3aWRlX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jMiA9PSB3aWRlX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jMyA9PSB3aWRlX3N0cmluZyk7CiAKLSAgICBjb25zdCB3Y2hhcl90KiBjX251bGxfc3RyaW5nID0gbnVsbHB0cjsKLSAgICBjb25zdCB3Y2hhcl90KiBjX2VtcHR5X3N0cmluZyA9IEwiIjsKLSAgICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBjX251bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBjX2VtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IGNfbnVsbF9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyA9PSBjX2VtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gY19udWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gY19lbXB0eV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGNfbnVsbF9zdHJpbmcgPT0gbnVsbF9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGNfZW1wdHlfc3RyaW5nID09IG51bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShjX251bGxfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoY19lbXB0eV9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShjX251bGxfc3RyaW5nID09IGRlbGV0ZWRfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShjX2VtcHR5X3N0cmluZyA9PSBkZWxldGVkX3N0cmluZyk7CisgIGNvbnN0IHdjaGFyX3QqIGNfbnVsbF9zdHJpbmcgPSBudWxscHRyOworICBjb25zdCB3Y2hhcl90KiBjX2VtcHR5X3N0cmluZyA9IEwiIjsKKyAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gY19udWxsX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IGNfZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IGNfbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gY19lbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBjX251bGxfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gY19lbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShjX251bGxfc3RyaW5nID09IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoY19lbXB0eV9zdHJpbmcgPT0gbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShjX251bGxfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGNfZW1wdHlfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGNfbnVsbF9zdHJpbmcgPT0gZGVsZXRlZF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShjX2VtcHR5X3N0cmluZyA9PSBkZWxldGVkX3N0cmluZyk7CiAKLSAgICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZ19zYW1lMSA9IEwiaGVsbG8iOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nID09IGNfc3RyaW5nX3NhbWUxKTsKLSAgICBFWFBFQ1RfVFJVRShjX3N0cmluZ19zYW1lMSA9PSB3aWRlX3N0cmluZyk7CisgIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nX3NhbWUxID0gTCJoZWxsbyI7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nID09IGNfc3RyaW5nX3NhbWUxKTsKKyAgRVhQRUNUX1RSVUUoY19zdHJpbmdfc2FtZTEgPT0gd2lkZV9zdHJpbmcpOwogCi0gICAgY29uc3Qgd2NoYXJfdCogY19zdHJpbmcxID0gTCJoZSI7Ci0gICAgY29uc3Qgd2NoYXJfdCogY19zdHJpbmcyID0gTCJoZWxscCI7Ci0gICAgY29uc3Qgd2NoYXJfdCogY19zdHJpbmczID0gTCJoZWxsb2QiOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSBjX3N0cmluZzEpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSBjX3N0cmluZzIpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSBjX3N0cmluZzMpOwotICAgIEVYUEVDVF9GQUxTRShjX3N0cmluZzEgPT0gd2lkZV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShjX3N0cmluZzIgPT0gd2lkZV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShjX3N0cmluZzMgPT0gd2lkZV9zdHJpbmcpOworICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZzEgPSBMImhlIjsKKyAgY29uc3Qgd2NoYXJfdCogY19zdHJpbmcyID0gTCJoZWxscCI7CisgIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nMyA9IEwiaGVsbG9kIjsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nID09IGNfc3RyaW5nMSk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSBjX3N0cmluZzIpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgPT0gY19zdHJpbmczKTsKKyAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMSA9PSB3aWRlX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShjX3N0cmluZzIgPT0gd2lkZV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoY19zdHJpbmczID09IHdpZGVfc3RyaW5nKTsKIH0KIAogVEVTVChmeGNydCwgV2lkZVN0cmluZ09wZXJhdG9yTkUpIHsKLSAgICBDRlhfV2lkZVN0cmluZyBudWxsX3N0cmluZzsKLSAgICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gbnVsbF9zdHJpbmcpOworICBDRlhfV2lkZVN0cmluZyBudWxsX3N0cmluZzsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IG51bGxfc3RyaW5nKTsKIAotICAgIENGWF9XaWRlU3RyaW5nIGVtcHR5X3N0cmluZyhMIiIpOwotICAgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IG51bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgZW1wdHlfc3RyaW5nKEwiIik7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyAhPSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBlbXB0eV9zdHJpbmcpOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmcgZGVsZXRlZF9zdHJpbmcoTCJoZWxsbyIpOwotICAgIGRlbGV0ZWRfc3RyaW5nLkRlbGV0ZSgwLCA1KTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBudWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGRlbGV0ZWRfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgZGVsZXRlZF9zdHJpbmcoTCJoZWxsbyIpOworICBkZWxldGVkX3N0cmluZy5EZWxldGUoMCwgNSk7CisgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nKTsKIAotICAgIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nKEwiaGVsbG8iKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgIT0gd2lkZV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nICE9IG51bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyAhPSBlbXB0eV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nICE9IGRlbGV0ZWRfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyAhPSB3aWRlX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nICE9IHdpZGVfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyAhPSB3aWRlX3N0cmluZyk7CisgIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nKEwiaGVsbG8iKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nICE9IHdpZGVfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyAhPSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nICE9IHdpZGVfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nICE9IHdpZGVfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgIT0gd2lkZV9zdHJpbmcpOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmdfc2FtZTEoTCJoZWxsbyIpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyAhPSB3aWRlX3N0cmluZ19zYW1lMSk7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX3NhbWUxICE9IHdpZGVfc3RyaW5nKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmdfc2FtZTEoTCJoZWxsbyIpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgIT0gd2lkZV9zdHJpbmdfc2FtZTEpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfc2FtZTEgIT0gd2lkZV9zdHJpbmcpOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmdfc2FtZTIod2lkZV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyAhPSB3aWRlX3N0cmluZ19zYW1lMik7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX3NhbWUyICE9IHdpZGVfc3RyaW5nKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmdfc2FtZTIod2lkZV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgIT0gd2lkZV9zdHJpbmdfc2FtZTIpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfc2FtZTIgIT0gd2lkZV9zdHJpbmcpOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmcxKEwiaGUiKTsKLSAgICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzIoTCJoZWxscCIpOwotICAgIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nMyhMImhlbGxvZCIpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nICE9IHdpZGVfc3RyaW5nMSk7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gd2lkZV9zdHJpbmcyKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyAhPSB3aWRlX3N0cmluZzMpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nMSAhPSB3aWRlX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcyICE9IHdpZGVfc3RyaW5nKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZzMgIT0gd2lkZV9zdHJpbmcpOworICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzEoTCJoZSIpOworICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzIoTCJoZWxscCIpOworICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzMoTCJoZWxsb2QiKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gd2lkZV9zdHJpbmcxKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gd2lkZV9zdHJpbmcyKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gd2lkZV9zdHJpbmczKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcxICE9IHdpZGVfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcyICE9IHdpZGVfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmczICE9IHdpZGVfc3RyaW5nKTsKIAotICAgIENGWF9XaWRlU3RyaW5nQyBudWxsX3N0cmluZ19jOwotICAgIENGWF9XaWRlU3RyaW5nQyBlbXB0eV9zdHJpbmdfYyhMIiIpOwotICAgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBudWxsX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gbnVsbF9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyAhPSBlbXB0eV9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IG51bGxfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBlbXB0eV9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nX2MgIT0gbnVsbF9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmdfYyAhPSBudWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nX2MgIT0gZW1wdHlfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nX2MgIT0gZW1wdHlfc3RyaW5nKTsKKyAgQ0ZYX1dpZGVTdHJpbmdDIG51bGxfc3RyaW5nX2M7CisgIENGWF9XaWRlU3RyaW5nQyBlbXB0eV9zdHJpbmdfYyhMIiIpOworICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gbnVsbF9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBlbXB0eV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gbnVsbF9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nX2MpOworICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gbnVsbF9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBlbXB0eV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZ19jICE9IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZ19jICE9IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nX2MgIT0gZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZ19jICE9IGVtcHR5X3N0cmluZyk7CiAKLSAgICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfY19zYW1lMShMImhlbGxvIik7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nICE9IHdpZGVfc3RyaW5nX2Nfc2FtZTEpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jX3NhbWUxICE9IHdpZGVfc3RyaW5nKTsKKyAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2Nfc2FtZTEoTCJoZWxsbyIpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgIT0gd2lkZV9zdHJpbmdfY19zYW1lMSk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jX3NhbWUxICE9IHdpZGVfc3RyaW5nKTsKIAotICAgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jMShMImhlIik7Ci0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MyKEwiaGVsbHAiKTsKLSAgICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfYzMoTCJoZWxsb2QiKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyAhPSB3aWRlX3N0cmluZ19jMSk7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gd2lkZV9zdHJpbmdfYzIpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nICE9IHdpZGVfc3RyaW5nX2MzKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jMSAhPSB3aWRlX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYzIgIT0gd2lkZV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MzICE9IHdpZGVfc3RyaW5nKTsKKyAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MxKEwiaGUiKTsKKyAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MyKEwiaGVsbHAiKTsKKyAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MzKEwiaGVsbG9kIik7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nICE9IHdpZGVfc3RyaW5nX2MxKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gd2lkZV9zdHJpbmdfYzIpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyAhPSB3aWRlX3N0cmluZ19jMyk7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MxICE9IHdpZGVfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYzIgIT0gd2lkZV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jMyAhPSB3aWRlX3N0cmluZyk7CiAKLSAgICBjb25zdCB3Y2hhcl90KiBjX251bGxfc3RyaW5nID0gbnVsbHB0cjsKLSAgICBjb25zdCB3Y2hhcl90KiBjX2VtcHR5X3N0cmluZyA9IEwiIjsKLSAgICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gY19udWxsX3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGNfZW1wdHlfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IGNfbnVsbF9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gY19lbXB0eV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBjX251bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gY19lbXB0eV9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShjX251bGxfc3RyaW5nICE9IG51bGxfc3RyaW5nKTsKLSAgICBFWFBFQ1RfRkFMU0UoY19lbXB0eV9zdHJpbmcgIT0gbnVsbF9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShjX251bGxfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGNfZW1wdHlfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7Ci0gICAgRVhQRUNUX0ZBTFNFKGNfbnVsbF9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOwotICAgIEVYUEVDVF9GQUxTRShjX2VtcHR5X3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7CisgIGNvbnN0IHdjaGFyX3QqIGNfbnVsbF9zdHJpbmcgPSBudWxscHRyOworICBjb25zdCB3Y2hhcl90KiBjX2VtcHR5X3N0cmluZyA9IEwiIjsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGNfbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gY19lbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IGNfbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IGNfZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IGNfbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gY19lbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoY19udWxsX3N0cmluZyAhPSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShjX2VtcHR5X3N0cmluZyAhPSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShjX251bGxfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShjX2VtcHR5X3N0cmluZyAhPSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoY19udWxsX3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShjX2VtcHR5X3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7CiAKLSAgICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZ19zYW1lMSA9IEwiaGVsbG8iOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyAhPSBjX3N0cmluZ19zYW1lMSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nX3NhbWUxICE9IHdpZGVfc3RyaW5nKTsKKyAgY29uc3Qgd2NoYXJfdCogY19zdHJpbmdfc2FtZTEgPSBMImhlbGxvIjsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nICE9IGNfc3RyaW5nX3NhbWUxKTsKKyAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nX3NhbWUxICE9IHdpZGVfc3RyaW5nKTsKIAotICAgIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nMSA9IEwiaGUiOwotICAgIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nMiA9IEwiaGVsbHAiOwotICAgIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nMyA9IEwiaGVsbG9kIjsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyAhPSBjX3N0cmluZzEpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nICE9IGNfc3RyaW5nMik7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gY19zdHJpbmczKTsKLSAgICBFWFBFQ1RfVFJVRShjX3N0cmluZzEgIT0gd2lkZV9zdHJpbmcpOwotICAgIEVYUEVDVF9UUlVFKGNfc3RyaW5nMiAhPSB3aWRlX3N0cmluZyk7Ci0gICAgRVhQRUNUX1RSVUUoY19zdHJpbmczICE9IHdpZGVfc3RyaW5nKTsKKyAgY29uc3Qgd2NoYXJfdCogY19zdHJpbmcxID0gTCJoZSI7CisgIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nMiA9IEwiaGVsbHAiOworICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZzMgPSBMImhlbGxvZCI7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nICE9IGNfc3RyaW5nMSk7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nICE9IGNfc3RyaW5nMik7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nICE9IGNfc3RyaW5nMyk7CisgIEVYUEVDVF9UUlVFKGNfc3RyaW5nMSAhPSB3aWRlX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGNfc3RyaW5nMiAhPSB3aWRlX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGNfc3RyaW5nMyAhPSB3aWRlX3N0cmluZyk7CiB9CiAKIFRFU1QoZnhjcnQsIFdpZGVTdHJpbmdDb25jYXRJblBsYWNlKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgZnJlZDsKLSAgICBmcmVkLkNvbmNhdEluUGxhY2UoNCwgTCJGUkVEIik7Ci0gICAgRVhQRUNUX0VRKEwiRlJFRCIsIGZyZWQpOworICBDRlhfV2lkZVN0cmluZyBmcmVkOworICBmcmVkLkNvbmNhdEluUGxhY2UoNCwgTCJGUkVEIik7CisgIEVYUEVDVF9FUShMIkZSRUQiLCBmcmVkKTsKIAotICAgIGZyZWQuQ29uY2F0SW5QbGFjZSgyLCBMIkRZIik7Ci0gICAgRVhQRUNUX0VRKEwiRlJFRERZIiwgZnJlZCk7CisgIGZyZWQuQ29uY2F0SW5QbGFjZSgyLCBMIkRZIik7CisgIEVYUEVDVF9FUShMIkZSRUREWSIsIGZyZWQpOwogCi0gICAgZnJlZC5EZWxldGUoMywgMyk7Ci0gICAgRVhQRUNUX0VRKEwiRlJFIiwgZnJlZCk7CisgIGZyZWQuRGVsZXRlKDMsIDMpOworICBFWFBFQ1RfRVEoTCJGUkUiLCBmcmVkKTsKIAotICAgIGZyZWQuQ29uY2F0SW5QbGFjZSgxLCBMIkQiKTsKLSAgICBFWFBFQ1RfRVEoTCJGUkVEIiwgZnJlZCk7CisgIGZyZWQuQ29uY2F0SW5QbGFjZSgxLCBMIkQiKTsKKyAgRVhQRUNUX0VRKEwiRlJFRCIsIGZyZWQpOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmcgY29weSA9IGZyZWQ7Ci0gICAgZnJlZC5Db25jYXRJblBsYWNlKDIsIEwiRFkiKTsKLSAgICBFWFBFQ1RfRVEoTCJGUkVERFkiLCBmcmVkKTsKLSAgICBFWFBFQ1RfRVEoTCJGUkVEIiwgY29weSk7CisgIENGWF9XaWRlU3RyaW5nIGNvcHkgPSBmcmVkOworICBmcmVkLkNvbmNhdEluUGxhY2UoMiwgTCJEWSIpOworICBFWFBFQ1RfRVEoTCJGUkVERFkiLCBmcmVkKTsKKyAgRVhQRUNUX0VRKEwiRlJFRCIsIGNvcHkpOwogCi0gICAgLy8gVGVzdCBpbnZhbGlkIGFyZ3VtZW50cy4KLSAgICBjb3B5ID0gZnJlZDsKLSAgICBmcmVkLkNvbmNhdEluUGxhY2UoLTYsIEwiZnJlZGR5Iik7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgbm90X2FsaWFzZWQoTCJ4eHh4eHgiKTsKLSAgICBFWFBFQ1RfRVEoTCJGUkVERFkiLCBmcmVkKTsKLSAgICBFWFBFQ1RfRVEoTCJ4eHh4eHgiLCBub3RfYWxpYXNlZCk7CisgIC8vIFRlc3QgaW52YWxpZCBhcmd1bWVudHMuCisgIGNvcHkgPSBmcmVkOworICBmcmVkLkNvbmNhdEluUGxhY2UoLTYsIEwiZnJlZGR5Iik7CisgIENGWF9XaWRlU3RyaW5nIG5vdF9hbGlhc2VkKEwieHh4eHh4Iik7CisgIEVYUEVDVF9FUShMIkZSRUREWSIsIGZyZWQpOworICBFWFBFQ1RfRVEoTCJ4eHh4eHgiLCBub3RfYWxpYXNlZCk7CiB9CiAKLSNkZWZpbmUgQnl0ZVN0cmluZ0xpdGVyYWwoc3RyKSBDRlhfQnl0ZVN0cmluZyhGWF9CU1RSQyhzdHIpKQotCiBURVNUKGZ4Y3J0LCBXaWRlU3RyaW5nVVRGMTZMRV9FbmNvZGUpIHsKICAgc3RydWN0IFVURjE2TEVFbmNvZGVDYXNlIHsKICAgICBDRlhfV2lkZVN0cmluZyB3czsKICAgICBDRlhfQnl0ZVN0cmluZyBiczsKICAgfSB1dGYxNmxlX2VuY29kZV9jYXNlc1tdID0gewotICAgIHsgTCIiLCBCeXRlU3RyaW5nTGl0ZXJhbCgiXDBcMCIpIH0sCi0gICAgeyBMImFiYyIsIEJ5dGVTdHJpbmdMaXRlcmFsKCJhXDBiXDBjXDBcMFwwIikgfSwKLSAgICB7IEwiYWJjZGVmIiwgQnl0ZVN0cmluZ0xpdGVyYWwoImFcMGJcMGNcMGRcMGVcMGZcMFwwXDAiKSB9LAotICAgIHsgTCJhYmNcMGRlZiIsIEJ5dGVTdHJpbmdMaXRlcmFsKCJhXDBiXDBjXDBcMFwwIikgfSwKLSAgICB7IEwiXHhhYWJiXHhjY2RkIiwgQnl0ZVN0cmluZ0xpdGVyYWwoIlx4YmJceGFhXHhkZFx4Y2NcMFwwIikgfSwKLSAgICB7IEwiXHgzMTMyXHg2MTYyIiwgQnl0ZVN0cmluZ0xpdGVyYWwoIlx4MzJceDMxXHg2Mlx4NjFcMFwwIikgfSwKKyAgICAgIHtMIiIsIENGWF9CeXRlU3RyaW5nKCJcMFwwIiwgMil9LAorICAgICAge0wiYWJjIiwgQ0ZYX0J5dGVTdHJpbmcoImFcMGJcMGNcMFwwXDAiLCA4KX0sCisgICAgICB7TCJhYmNkZWYiLCBDRlhfQnl0ZVN0cmluZygiYVwwYlwwY1wwZFwwZVwwZlwwXDBcMCIsIDE0KX0sCisgICAgICB7TCJhYmNcMGRlZiIsIENGWF9CeXRlU3RyaW5nKCJhXDBiXDBjXDBcMFwwIiwgOCl9LAorICAgICAge0wiXHhhYWJiXHhjY2RkIiwgQ0ZYX0J5dGVTdHJpbmcoIlx4YmJceGFhXHhkZFx4Y2NcMFwwIiwgNil9LAorICAgICAge0wiXHgzMTMyXHg2MTYyIiwgQ0ZYX0J5dGVTdHJpbmcoIlx4MzJceDMxXHg2Mlx4NjFcMFwwIiwgNil9LAogICB9OwogCiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHV0ZjE2bGVfZW5jb2RlX2Nhc2VzKTsgKytpKSB7CiAgICAgRVhQRUNUX0VRKHV0ZjE2bGVfZW5jb2RlX2Nhc2VzW2ldLmJzLAotICAgICAgICB1dGYxNmxlX2VuY29kZV9jYXNlc1tpXS53cy5VVEYxNkxFX0VuY29kZSgpKQorICAgICAgICAgICAgICB1dGYxNmxlX2VuY29kZV9jYXNlc1tpXS53cy5VVEYxNkxFX0VuY29kZSgpKQogICAgICAgICA8PCAiIGZvciBjYXNlIG51bWJlciAiIDw8IGk7CiAgIH0KIH0KIAogVEVTVChmeGNydCwgV2lkZVN0cmluZ0NPcGVyYXRvclN1YnNjcmlwdCkgewotICAgIC8vIENGWF9XaWRlU3RyaW5nQyBpbmNsdWRlcyB0aGUgTlVMIHRlcm1pbmF0b3IgZm9yIG5vbi1lbXB0eSBzdHJpbmdzLgotICAgIENGWF9XaWRlU3RyaW5nQyBhYmMoTCJhYmMiKTsKLSAgICBFWFBFQ1RfRVEoTCdhJywgYWJjWzBdKTsKLSAgICBFWFBFQ1RfRVEoTCdiJywgYWJjWzFdKTsKLSAgICBFWFBFQ1RfRVEoTCdjJywgYWJjWzJdKTsKLSAgICBFWFBFQ1RfRVEoTCdcMCcsIGFiY1szXSk7CisgIC8vIENGWF9XaWRlU3RyaW5nQyBpbmNsdWRlcyB0aGUgTlVMIHRlcm1pbmF0b3IgZm9yIG5vbi1lbXB0eSBzdHJpbmdzLgorICBDRlhfV2lkZVN0cmluZ0MgYWJjKEwiYWJjIik7CisgIEVYUEVDVF9FUShMJ2EnLCBhYmNbMF0pOworICBFWFBFQ1RfRVEoTCdiJywgYWJjWzFdKTsKKyAgRVhQRUNUX0VRKEwnYycsIGFiY1syXSk7CisgIEVYUEVDVF9FUShMJ1wwJywgYWJjWzNdKTsKIH0KIAogVEVTVChmeGNydCwgV2lkZVN0cmluZ0NPcGVyYXRvckxUKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmdDIGVtcHR5OwotICAgIENGWF9XaWRlU3RyaW5nQyBhKEwiYSIpOwotICAgIENGWF9XaWRlU3RyaW5nQyBhYmMoTCJceDAxMTBxcSIpOyAgLy8gQ29tZXMgYmVmb3JlIGRlc3BpdGUgZW5kaWFubmVzcy4KLSAgICBDRlhfV2lkZVN0cmluZ0MgZGVmKEwiXHgxMDAxcXEiKTsgIC8vIENvbWVzIGFmdGVyIGRlc3BpdGUgZW5kaWFubmVzcy4KKyAgQ0ZYX1dpZGVTdHJpbmdDIGVtcHR5OworICBDRlhfV2lkZVN0cmluZ0MgYShMImEiKTsKKyAgQ0ZYX1dpZGVTdHJpbmdDIGFiYyhMIlx4MDExMHFxIik7ICAvLyBDb21lcyBiZWZvcmUgZGVzcGl0ZSBlbmRpYW5uZXNzLgorICBDRlhfV2lkZVN0cmluZ0MgZGVmKEwiXHgxMDAxcXEiKTsgIC8vIENvbWVzIGFmdGVyIGRlc3BpdGUgZW5kaWFubmVzcy4KIAotICAgIEVYUEVDVF9GQUxTRShlbXB0eSA8IGVtcHR5KTsKLSAgICBFWFBFQ1RfRkFMU0UoYSA8IGEpOwotICAgIEVYUEVDVF9GQUxTRShhYmMgPCBhYmMpOwotICAgIEVYUEVDVF9GQUxTRShkZWYgPCBkZWYpOworICBFWFBFQ1RfRkFMU0UoZW1wdHkgPCBlbXB0eSk7CisgIEVYUEVDVF9GQUxTRShhIDwgYSk7CisgIEVYUEVDVF9GQUxTRShhYmMgPCBhYmMpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgZGVmKTsKIAotICAgIEVYUEVDVF9UUlVFKGVtcHR5IDwgYSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGEgPCBlbXB0eSk7CisgIEVYUEVDVF9UUlVFKGVtcHR5IDwgYSk7CisgIEVYUEVDVF9GQUxTRShhIDwgZW1wdHkpOwogCi0gICAgRVhQRUNUX1RSVUUoZW1wdHkgPCBhYmMpOwotICAgIEVYUEVDVF9GQUxTRShhYmMgPCBlbXB0eSk7CisgIEVYUEVDVF9UUlVFKGVtcHR5IDwgYWJjKTsKKyAgRVhQRUNUX0ZBTFNFKGFiYyA8IGVtcHR5KTsKIAotICAgIEVYUEVDVF9UUlVFKGVtcHR5IDwgZGVmKTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVmIDwgZW1wdHkpOworICBFWFBFQ1RfVFJVRShlbXB0eSA8IGRlZik7CisgIEVYUEVDVF9GQUxTRShkZWYgPCBlbXB0eSk7CiAKLSAgICBFWFBFQ1RfVFJVRShhIDwgYWJjKTsKLSAgICBFWFBFQ1RfRkFMU0UoYWJjIDwgYSk7CisgIEVYUEVDVF9UUlVFKGEgPCBhYmMpOworICBFWFBFQ1RfRkFMU0UoYWJjIDwgYSk7CiAKLSAgICBFWFBFQ1RfVFJVRShhIDwgZGVmKTsKLSAgICBFWFBFQ1RfRkFMU0UoZGVmIDwgYSk7CisgIEVYUEVDVF9UUlVFKGEgPCBkZWYpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgYSk7CiAKLSAgICBFWFBFQ1RfVFJVRShhYmMgPCBkZWYpOwotICAgIEVYUEVDVF9GQUxTRShkZWYgPCBhYmMpOworICBFWFBFQ1RfVFJVRShhYmMgPCBkZWYpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgYWJjKTsKIH0KIAogVEVTVChmeGNydCwgV2lkZVN0cmluZ0NPcGVyYXRvckVRKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MoTCJoZWxsbyIpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgPT0gd2lkZV9zdHJpbmdfYyk7CisgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jKEwiaGVsbG8iKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyA9PSB3aWRlX3N0cmluZ19jKTsKIAotICAgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jX3NhbWUxKEwiaGVsbG8iKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jID09IHdpZGVfc3RyaW5nX2Nfc2FtZTEpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2Nfc2FtZTEgPT0gd2lkZV9zdHJpbmdfYyk7CisgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jX3NhbWUxKEwiaGVsbG8iKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyA9PSB3aWRlX3N0cmluZ19jX3NhbWUxKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfY19zYW1lMSA9PSB3aWRlX3N0cmluZ19jKTsKIAotICAgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jX3NhbWUyKHdpZGVfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgPT0gd2lkZV9zdHJpbmdfY19zYW1lMik7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfY19zYW1lMiA9PSB3aWRlX3N0cmluZ19jKTsKKyAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2Nfc2FtZTIod2lkZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgPT0gd2lkZV9zdHJpbmdfY19zYW1lMik7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2Nfc2FtZTIgPT0gd2lkZV9zdHJpbmdfYyk7CiAKLSAgICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfYzEoTCJoZSIpOwotICAgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jMihMImhlbGxwIik7Ci0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MzKEwiaGVsbG9kIik7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MgPT0gd2lkZV9zdHJpbmdfYzEpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jID09IHdpZGVfc3RyaW5nX2MyKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyA9PSB3aWRlX3N0cmluZ19jMyk7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MxID09IHdpZGVfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jMiA9PSB3aWRlX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYzMgPT0gd2lkZV9zdHJpbmdfYyk7CisgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jMShMImhlIik7CisgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jMihMImhlbGxwIik7CisgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jMyhMImhlbGxvZCIpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyA9PSB3aWRlX3N0cmluZ19jMSk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jID09IHdpZGVfc3RyaW5nX2MyKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MgPT0gd2lkZV9zdHJpbmdfYzMpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYzEgPT0gd2lkZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jMiA9PSB3aWRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MzID09IHdpZGVfc3RyaW5nX2MpOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmdfc2FtZTEoTCJoZWxsbyIpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgPT0gd2lkZV9zdHJpbmdfc2FtZTEpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX3NhbWUxID09IHdpZGVfc3RyaW5nX2MpOworICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZ19zYW1lMShMImhlbGxvIik7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgPT0gd2lkZV9zdHJpbmdfc2FtZTEpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19zYW1lMSA9PSB3aWRlX3N0cmluZ19jKTsKIAotICAgIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nMShMImhlIik7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmcyKEwiaGVsbHAiKTsKLSAgICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzMoTCJoZWxsb2QiKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyA9PSB3aWRlX3N0cmluZzEpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jID09IHdpZGVfc3RyaW5nMik7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MgPT0gd2lkZV9zdHJpbmczKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcxID09IHdpZGVfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZzIgPT0gd2lkZV9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nMyA9PSB3aWRlX3N0cmluZ19jKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmcxKEwiaGUiKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmcyKEwiaGVsbHAiKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmczKEwiaGVsbG9kIik7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jID09IHdpZGVfc3RyaW5nMSk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jID09IHdpZGVfc3RyaW5nMik7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jID09IHdpZGVfc3RyaW5nMyk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZzEgPT0gd2lkZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZzIgPT0gd2lkZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZzMgPT0gd2lkZV9zdHJpbmdfYyk7CiAKLSAgICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZ19zYW1lMSA9IEwiaGVsbG8iOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgPT0gY19zdHJpbmdfc2FtZTEpOwotICAgIEVYUEVDVF9UUlVFKGNfc3RyaW5nX3NhbWUxID09IHdpZGVfc3RyaW5nX2MpOworICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZ19zYW1lMSA9IEwiaGVsbG8iOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jID09IGNfc3RyaW5nX3NhbWUxKTsKKyAgRVhQRUNUX1RSVUUoY19zdHJpbmdfc2FtZTEgPT0gd2lkZV9zdHJpbmdfYyk7CiAKLSAgICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZzEgPSBMImhlIjsKLSAgICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZzIgPSBMImhlbGxwIjsKLSAgICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZzMgPSBMImhlbGxvZCI7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MgPT0gY19zdHJpbmcxKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyA9PSBjX3N0cmluZzIpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jID09IGNfc3RyaW5nMyk7CisgIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nMSA9IEwiaGUiOworICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZzIgPSBMImhlbGxwIjsKKyAgY29uc3Qgd2NoYXJfdCogY19zdHJpbmczID0gTCJoZWxsb2QiOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyA9PSBjX3N0cmluZzEpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyA9PSBjX3N0cmluZzIpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyA9PSBjX3N0cmluZzMpOwogCi0gICAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMSA9PSB3aWRlX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfRkFMU0UoY19zdHJpbmcyID09IHdpZGVfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9GQUxTRShjX3N0cmluZzMgPT0gd2lkZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShjX3N0cmluZzEgPT0gd2lkZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShjX3N0cmluZzIgPT0gd2lkZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShjX3N0cmluZzMgPT0gd2lkZV9zdHJpbmdfYyk7CiB9CiAKIFRFU1QoZnhjcnQsIFdpZGVTdHJpbmdDT3BlcmF0b3JORSkgewotICAgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jKEwiaGVsbG8iKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyAhPSB3aWRlX3N0cmluZ19jKTsKKyAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MoTCJoZWxsbyIpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyAhPSB3aWRlX3N0cmluZ19jKTsKIAotICAgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jX3NhbWUxKEwiaGVsbG8iKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyAhPSB3aWRlX3N0cmluZ19jX3NhbWUxKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfY19zYW1lMSAhPSB3aWRlX3N0cmluZ19jKTsKKyAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2Nfc2FtZTEoTCJoZWxsbyIpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyAhPSB3aWRlX3N0cmluZ19jX3NhbWUxKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2Nfc2FtZTEgIT0gd2lkZV9zdHJpbmdfYyk7CiAKLSAgICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfY19zYW1lMih3aWRlX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyAhPSB3aWRlX3N0cmluZ19jX3NhbWUyKTsKLSAgICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfY19zYW1lMiAhPSB3aWRlX3N0cmluZ19jKTsKKyAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2Nfc2FtZTIod2lkZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jICE9IHdpZGVfc3RyaW5nX2Nfc2FtZTIpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfY19zYW1lMiAhPSB3aWRlX3N0cmluZ19jKTsKIAotICAgIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jMShMImhlIik7Ci0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MyKEwiaGVsbHAiKTsKLSAgICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfYzMoTCJoZWxsb2QiKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jICE9IHdpZGVfc3RyaW5nX2MxKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jICE9IHdpZGVfc3RyaW5nX2MyKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jICE9IHdpZGVfc3RyaW5nX2MzKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jMSAhPSB3aWRlX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jMiAhPSB3aWRlX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jMyAhPSB3aWRlX3N0cmluZ19jKTsKKyAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MxKEwiaGUiKTsKKyAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MyKEwiaGVsbHAiKTsKKyAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MzKEwiaGVsbG9kIik7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgIT0gd2lkZV9zdHJpbmdfYzEpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jICE9IHdpZGVfc3RyaW5nX2MyKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyAhPSB3aWRlX3N0cmluZ19jMyk7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MxICE9IHdpZGVfc3RyaW5nX2MpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jMiAhPSB3aWRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYzMgIT0gd2lkZV9zdHJpbmdfYyk7CiAKLSAgICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZ19zYW1lMShMImhlbGxvIik7Ci0gICAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MgIT0gd2lkZV9zdHJpbmdfc2FtZTEpOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19zYW1lMSAhPSB3aWRlX3N0cmluZ19jKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmdfc2FtZTEoTCJoZWxsbyIpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyAhPSB3aWRlX3N0cmluZ19zYW1lMSk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19zYW1lMSAhPSB3aWRlX3N0cmluZ19jKTsKIAotICAgIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nMShMImhlIik7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmcyKEwiaGVsbHAiKTsKLSAgICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzMoTCJoZWxsb2QiKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jICE9IHdpZGVfc3RyaW5nMSk7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyAhPSB3aWRlX3N0cmluZzIpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgIT0gd2lkZV9zdHJpbmczKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZzEgIT0gd2lkZV9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcyICE9IHdpZGVfc3RyaW5nX2MpOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nMyAhPSB3aWRlX3N0cmluZ19jKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmcxKEwiaGUiKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmcyKEwiaGVsbHAiKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmczKEwiaGVsbG9kIik7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgIT0gd2lkZV9zdHJpbmcxKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyAhPSB3aWRlX3N0cmluZzIpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jICE9IHdpZGVfc3RyaW5nMyk7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nMSAhPSB3aWRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcyICE9IHdpZGVfc3RyaW5nX2MpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZzMgIT0gd2lkZV9zdHJpbmdfYyk7CiAKLSAgICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZ19zYW1lMSA9IEwiaGVsbG8iOwotICAgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jICE9IGNfc3RyaW5nX3NhbWUxKTsKLSAgICBFWFBFQ1RfRkFMU0UoY19zdHJpbmdfc2FtZTEgIT0gd2lkZV9zdHJpbmdfYyk7CisgIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nX3NhbWUxID0gTCJoZWxsbyI7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jICE9IGNfc3RyaW5nX3NhbWUxKTsKKyAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nX3NhbWUxICE9IHdpZGVfc3RyaW5nX2MpOwogCi0gICAgY29uc3Qgd2NoYXJfdCogY19zdHJpbmcxID0gTCJoZSI7Ci0gICAgY29uc3Qgd2NoYXJfdCogY19zdHJpbmcyID0gTCJoZWxscCI7Ci0gICAgY29uc3Qgd2NoYXJfdCogY19zdHJpbmczID0gTCJoZWxsb2QiOwotICAgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgIT0gY19zdHJpbmcxKTsKLSAgICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jICE9IGNfc3RyaW5nMik7Ci0gICAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyAhPSBjX3N0cmluZzMpOworICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZzEgPSBMImhlIjsKKyAgY29uc3Qgd2NoYXJfdCogY19zdHJpbmcyID0gTCJoZWxscCI7CisgIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nMyA9IEwiaGVsbG9kIjsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyAhPSBjX3N0cmluZzEpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jICE9IGNfc3RyaW5nMik7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgIT0gY19zdHJpbmczKTsKIAotICAgIEVYUEVDVF9UUlVFKGNfc3RyaW5nMSAhPSB3aWRlX3N0cmluZ19jKTsKLSAgICBFWFBFQ1RfVFJVRShjX3N0cmluZzIgIT0gd2lkZV9zdHJpbmdfYyk7Ci0gICAgRVhQRUNUX1RSVUUoY19zdHJpbmczICE9IHdpZGVfc3RyaW5nX2MpOworICBFWFBFQ1RfVFJVRShjX3N0cmluZzEgIT0gd2lkZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKGNfc3RyaW5nMiAhPSB3aWRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUoY19zdHJpbmczICE9IHdpZGVfc3RyaW5nX2MpOworfQorCitURVNUKGZ4Y3J0LCBXaWRlU3RyaW5nRm9ybWF0V2lkdGgpIHsKKyAgeworICAgIENGWF9XaWRlU3RyaW5nIHN0cjsKKyAgICBzdHIuRm9ybWF0KEwiJTVkIiwgMSk7CisgICAgRVhQRUNUX0VRKEwiICAgIDEiLCBzdHIpOworICB9CisKKyAgeworICAgIENGWF9XaWRlU3RyaW5nIHN0cjsKKyAgICBzdHIuRm9ybWF0KEwiJWQiLCAxKTsKKyAgICBFWFBFQ1RfRVEoTCIxIiwgc3RyKTsKKyAgfQorCisgIHsKKyAgICBDRlhfV2lkZVN0cmluZyBzdHI7CisgICAgc3RyLkZvcm1hdChMIiUqZCIsIDUsIDEpOworICAgIEVYUEVDVF9FUShMIiAgICAxIiwgc3RyKTsKKyAgfQorCisgIHsKKyAgICBDRlhfV2lkZVN0cmluZyBzdHI7CisgICAgc3RyLkZvcm1hdChMIiUtMWQiLCAxKTsKKyAgICBFWFBFQ1RfRVEoTCIxIiwgc3RyKTsKKyAgfQorCisgIHsKKyAgICBDRlhfV2lkZVN0cmluZyBzdHI7CisgICAgc3RyLkZvcm1hdChMIiUwZCIsIDEpOworICAgIEVYUEVDVF9FUShMIjEiLCBzdHIpOworICB9CisKKyAgeworICAgIENGWF9XaWRlU3RyaW5nIHN0cjsKKyAgICBzdHIuRm9ybWF0KEwiJTEwNDg1NzZkIiwgMSk7CisgICAgRVhQRUNUX0VRKEwiQmFkIHdpZHRoIiwgc3RyKTsKKyAgfQorfQorCitURVNUKGZ4Y3J0LCBXaWRlU3RyaW5nRm9ybWF0UHJlY2lzaW9uKSB7CisgIHsKKyAgICBDRlhfV2lkZVN0cmluZyBzdHI7CisgICAgc3RyLkZvcm1hdChMIiUuMmYiLCAxLjEyMzQ1KTsKKyAgICBFWFBFQ1RfRVEoTCIxLjEyIiwgc3RyKTsKKyAgfQorCisgIHsKKyAgICBDRlhfV2lkZVN0cmluZyBzdHI7CisgICAgc3RyLkZvcm1hdChMIiUuKmYiLCAzLCAxLjEyMzQ1KTsKKyAgICBFWFBFQ1RfRVEoTCIxLjEyMyIsIHN0cik7CisgIH0KKworICB7CisgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyOworICAgIHN0ci5Gb3JtYXQoTCIlZiIsIDEuMTIzNDUpOworICAgIEVYUEVDVF9FUShMIjEuMTIzNDUwIiwgc3RyKTsKKyAgfQorCisgIHsKKyAgICBDRlhfV2lkZVN0cmluZyBzdHI7CisgICAgc3RyLkZvcm1hdChMIiUtMWYiLCAxLjEyMzQ1KTsKKyAgICBFWFBFQ1RfRVEoTCIxLjEyMzQ1MCIsIHN0cik7CisgIH0KKworICB7CisgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyOworICAgIHN0ci5Gb3JtYXQoTCIlMGYiLCAxLjEyMzQ1KTsKKyAgICBFWFBFQ1RfRVEoTCIxLjEyMzQ1MCIsIHN0cik7CisgIH0KKworICB7CisgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyOworICAgIHN0ci5Gb3JtYXQoTCIlLjEwNDg1NzZmIiwgMS4yKTsKKyAgICBFWFBFQ1RfRVEoTCJCYWQgcHJlY2lzaW9uIiwgc3RyKTsKKyAgfQorfQorCitURVNUKGZ4Y3J0LCBFbXB0eVdpZGVTdHJpbmcpIHsKKyAgQ0ZYX1dpZGVTdHJpbmcgZW1wdHlfc3RyOworICBFWFBFQ1RfVFJVRShlbXB0eV9zdHIuSXNFbXB0eSgpKTsKKyAgRVhQRUNUX0VRKDAsIGVtcHR5X3N0ci5HZXRMZW5ndGgoKSk7CisgIGNvbnN0IEZYX1dDSEFSKiBjc3RyID0gZW1wdHlfc3RyLmNfc3RyKCk7CisgIEVYUEVDVF9FUSgwLCBGWFNZU193Y3NsZW4oY3N0cikpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfYmlkaS5jcHAgYi9jb3JlL3NyYy9meGNydC9meF9iaWRpLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWQ4N2EzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfYmlkaS5jcHAKQEAgLTAsMCArMSw2NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2JpZGkuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfdWNkLmgiCisKK0NGWF9CaWRpQ2hhcjo6Q0ZYX0JpZGlDaGFyKCkKKyAgICA6IG1faUN1clN0YXJ0KDApLAorICAgICAgbV9pQ3VyQ291bnQoMCksCisgICAgICBtX0N1ckJpZGkoTkVVVFJBTCksCisgICAgICBtX2lMYXN0U3RhcnQoMCksCisgICAgICBtX2lMYXN0Q291bnQoMCksCisgICAgICBtX0xhc3RCaWRpKE5FVVRSQUwpIHsKK30KKworQ0ZYX0JpZGlDaGFyOjp+Q0ZYX0JpZGlDaGFyKCkgeworfQorCitib29sIENGWF9CaWRpQ2hhcjo6QXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpIHsKKyAgRlhfRFdPUkQgZHdQcm9wcyA9IEZYX0dldFVuaWNvZGVQcm9wZXJ0aWVzKHdjaCk7CisgIGludDMyX3QgaUJpZGlDbHMgPSAoZHdQcm9wcyAmIEZYX0JJRElDTEFTU0JJVFNNQVNLKSA+PiBGWF9CSURJQ0xBU1NCSVRTOworICBEaXJlY3Rpb24gYmlkaSA9IE5FVVRSQUw7CisgIHN3aXRjaCAoaUJpZGlDbHMpIHsKKyAgICBjYXNlIEZYX0JJRElDTEFTU19MOgorICAgIGNhc2UgRlhfQklESUNMQVNTX0FOOgorICAgIGNhc2UgRlhfQklESUNMQVNTX0VOOgorICAgICAgYmlkaSA9IExFRlQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYX0JJRElDTEFTU19SOgorICAgIGNhc2UgRlhfQklESUNMQVNTX0FMOgorICAgICAgYmlkaSA9IFJJR0hUOworICAgICAgYnJlYWs7CisgIH0KKworICBib29sIGJSZXQgPSAoYmlkaSAhPSBtX0N1ckJpZGkpOworICBpZiAoYlJldCkgeworICAgIFNhdmVDdXJyZW50U3RhdGVUb0xhc3RTdGF0ZSgpOworICAgIG1fQ3VyQmlkaSA9IGJpZGk7CisgIH0KKyAgbV9pQ3VyQ291bnQrKzsKKyAgcmV0dXJuIGJSZXQ7Cit9CisKK2Jvb2wgQ0ZYX0JpZGlDaGFyOjpFbmRDaGFyKCkgeworICBTYXZlQ3VycmVudFN0YXRlVG9MYXN0U3RhdGUoKTsKKyAgcmV0dXJuIG1faUxhc3RDb3VudCA+IDA7Cit9CisKK0NGWF9CaWRpQ2hhcjo6RGlyZWN0aW9uIENGWF9CaWRpQ2hhcjo6R2V0QmlkaUluZm8oaW50MzJfdCogaVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBpQ291bnQpIGNvbnN0IHsKKyAgaWYgKGlTdGFydCkKKyAgICAqaVN0YXJ0ID0gbV9pTGFzdFN0YXJ0OworICBpZiAoaUNvdW50KQorICAgICppQ291bnQgPSBtX2lMYXN0Q291bnQ7CisgIHJldHVybiBtX0xhc3RCaWRpOworfQorCit2b2lkIENGWF9CaWRpQ2hhcjo6U2F2ZUN1cnJlbnRTdGF0ZVRvTGFzdFN0YXRlKCkgeworICBtX0xhc3RCaWRpID0gbV9DdXJCaWRpOworICBtX2lMYXN0U3RhcnQgPSBtX2lDdXJTdGFydDsKKyAgbV9pQ3VyU3RhcnQgPSBtX2lDdXJDb3VudDsKKyAgbV9pTGFzdENvdW50ID0gbV9pQ3VyQ291bnQgLSBtX2lMYXN0U3RhcnQ7Cit9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9iaWRpX3VuaXR0ZXN0LmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2JpZGlfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNWI2ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGNydC9meF9iaWRpX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDEzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2JpZGkuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgRlhfV0NIQVIga05ldXRyYWxDaGFyID0gMzI7Citjb25zdCBGWF9XQ0hBUiBrTGVmdENoYXIgPSA2NTsKK2NvbnN0IEZYX1dDSEFSIGtSaWdodENoYXIgPSAxNDI0OworCit9ICAvLyBuYW1lc3BhY2UKKworVEVTVChmeGNydCwgQmlkaUNoYXJFbXB0eSkgeworICBpbnQzMl90IHN0YXJ0ID0gLTE7CisgIGludDMyX3QgY291bnQgPSAtMTsKKyAgQ0ZYX0JpZGlDaGFyIGJpZGk7CisgIENGWF9CaWRpQ2hhcjo6RGlyZWN0aW9uIGRpciA9IGJpZGkuR2V0QmlkaUluZm8obnVsbHB0ciwgbnVsbHB0cik7CisgIEVYUEVDVF9FUShDRlhfQmlkaUNoYXI6Ok5FVVRSQUwsIGRpcik7CisKKyAgZGlyID0gYmlkaS5HZXRCaWRpSW5mbygmc3RhcnQsIG51bGxwdHIpOworICBFWFBFQ1RfRVEoQ0ZYX0JpZGlDaGFyOjpORVVUUkFMLCBkaXIpOworICBFWFBFQ1RfRVEoMCwgc3RhcnQpOworCisgIGRpciA9IGJpZGkuR2V0QmlkaUluZm8obnVsbHB0ciwgJmNvdW50KTsKKyAgRVhQRUNUX0VRKENGWF9CaWRpQ2hhcjo6TkVVVFJBTCwgZGlyKTsKKyAgRVhQRUNUX0VRKDAsIGNvdW50KTsKKworICBzdGFydCA9IC0xOworICBjb3VudCA9IC0xOworICBkaXIgPSBiaWRpLkdldEJpZGlJbmZvKCZzdGFydCwgJmNvdW50KTsKKyAgRVhQRUNUX0VRKENGWF9CaWRpQ2hhcjo6TkVVVFJBTCwgZGlyKTsKKyAgRVhQRUNUX0VRKDAsIHN0YXJ0KTsKKyAgRVhQRUNUX0VRKDAsIGNvdW50KTsKKworICBFWFBFQ1RfRkFMU0UoYmlkaS5FbmRDaGFyKCkpOworfQorCitURVNUKGZ4Y3J0LCBCaWRpQ2hhckxlZnQpIHsKKyAgaW50MzJfdCBzdGFydCA9IC0xOworICBpbnQzMl90IGNvdW50ID0gLTE7CisgIENGWF9CaWRpQ2hhciBiaWRpOworCisgIEVYUEVDVF9UUlVFKGJpZGkuQXBwZW5kQ2hhcihrTGVmdENoYXIpKTsKKyAgQ0ZYX0JpZGlDaGFyOjpEaXJlY3Rpb24gZGlyID0gYmlkaS5HZXRCaWRpSW5mbygmc3RhcnQsICZjb3VudCk7CisgIEVYUEVDVF9FUSgwLCBzdGFydCk7CisgIEVYUEVDVF9FUSgwLCBjb3VudCk7CisKKyAgRVhQRUNUX0ZBTFNFKGJpZGkuQXBwZW5kQ2hhcihrTGVmdENoYXIpKTsKKyAgRVhQRUNUX0ZBTFNFKGJpZGkuQXBwZW5kQ2hhcihrTGVmdENoYXIpKTsKKworICBkaXIgPSBiaWRpLkdldEJpZGlJbmZvKCZzdGFydCwgJmNvdW50KTsKKyAgRVhQRUNUX0VRKENGWF9CaWRpQ2hhcjo6TkVVVFJBTCwgZGlyKTsKKyAgRVhQRUNUX0VRKDAsIHN0YXJ0KTsKKyAgRVhQRUNUX0VRKDAsIGNvdW50KTsKKworICBFWFBFQ1RfVFJVRShiaWRpLkVuZENoYXIoKSk7CisgIGRpciA9IGJpZGkuR2V0QmlkaUluZm8oJnN0YXJ0LCAmY291bnQpOworICBFWFBFQ1RfRVEoQ0ZYX0JpZGlDaGFyOjpMRUZULCBkaXIpOworICBFWFBFQ1RfRVEoMCwgc3RhcnQpOworICBFWFBFQ1RfRVEoMywgY291bnQpOworCisgIEVYUEVDVF9GQUxTRShiaWRpLkVuZENoYXIoKSk7Cit9CisKK1RFU1QoZnhjcnQsIEJpZGlDaGFyTGVmdE5ldXRyYWxSaWdodCkgeworICBpbnQzMl90IHN0YXJ0ID0gLTE7CisgIGludDMyX3QgY291bnQgPSAtMTsKKyAgQ0ZYX0JpZGlDaGFyIGJpZGk7CisKKyAgRVhQRUNUX1RSVUUoYmlkaS5BcHBlbmRDaGFyKGtMZWZ0Q2hhcikpOworICBDRlhfQmlkaUNoYXI6OkRpcmVjdGlvbiBkaXIgPSBiaWRpLkdldEJpZGlJbmZvKCZzdGFydCwgJmNvdW50KTsKKyAgRVhQRUNUX0VRKDAsIHN0YXJ0KTsKKyAgRVhQRUNUX0VRKDAsIGNvdW50KTsKKworICBFWFBFQ1RfRkFMU0UoYmlkaS5BcHBlbmRDaGFyKGtMZWZ0Q2hhcikpOworICBFWFBFQ1RfRkFMU0UoYmlkaS5BcHBlbmRDaGFyKGtMZWZ0Q2hhcikpOworICBFWFBFQ1RfVFJVRShiaWRpLkFwcGVuZENoYXIoa05ldXRyYWxDaGFyKSk7CisgIGRpciA9IGJpZGkuR2V0QmlkaUluZm8oJnN0YXJ0LCAmY291bnQpOworICBFWFBFQ1RfRVEoMCwgc3RhcnQpOworICBFWFBFQ1RfRVEoMywgY291bnQpOworCisgIEVYUEVDVF9GQUxTRShiaWRpLkFwcGVuZENoYXIoa05ldXRyYWxDaGFyKSk7CisgIEVYUEVDVF9GQUxTRShiaWRpLkFwcGVuZENoYXIoa05ldXRyYWxDaGFyKSk7CisgIEVYUEVDVF9GQUxTRShiaWRpLkFwcGVuZENoYXIoa05ldXRyYWxDaGFyKSk7CisgIEVYUEVDVF9UUlVFKGJpZGkuQXBwZW5kQ2hhcihrUmlnaHRDaGFyKSk7CisgIGRpciA9IGJpZGkuR2V0QmlkaUluZm8oJnN0YXJ0LCAmY291bnQpOworICBFWFBFQ1RfRVEoQ0ZYX0JpZGlDaGFyOjpORVVUUkFMLCBkaXIpOworICBFWFBFQ1RfRVEoMywgc3RhcnQpOworICBFWFBFQ1RfRVEoNCwgY291bnQpOworCisgIEVYUEVDVF9UUlVFKGJpZGkuRW5kQ2hhcigpKTsKKyAgZGlyID0gYmlkaS5HZXRCaWRpSW5mbygmc3RhcnQsICZjb3VudCk7CisgIEVYUEVDVF9FUShDRlhfQmlkaUNoYXI6OlJJR0hULCBkaXIpOworICBFWFBFQ1RfRVEoNywgc3RhcnQpOworICBFWFBFQ1RfRVEoMSwgY291bnQpOworCisgIEVYUEVDVF9GQUxTRShiaWRpLkVuZENoYXIoKSk7Cit9CisKK1RFU1QoZnhjcnQsIEJpZGlDaGFyTGVmdFJpZ2h0TGVmdCkgeworICBpbnQzMl90IHN0YXJ0ID0gLTE7CisgIGludDMyX3QgY291bnQgPSAtMTsKKyAgQ0ZYX0JpZGlDaGFyIGJpZGk7CisKKyAgRVhQRUNUX1RSVUUoYmlkaS5BcHBlbmRDaGFyKGtMZWZ0Q2hhcikpOworICBDRlhfQmlkaUNoYXI6OkRpcmVjdGlvbiBkaXIgPSBiaWRpLkdldEJpZGlJbmZvKCZzdGFydCwgJmNvdW50KTsKKyAgRVhQRUNUX0VRKDAsIHN0YXJ0KTsKKyAgRVhQRUNUX0VRKDAsIGNvdW50KTsKKworICBFWFBFQ1RfRkFMU0UoYmlkaS5BcHBlbmRDaGFyKGtMZWZ0Q2hhcikpOworICBFWFBFQ1RfRkFMU0UoYmlkaS5BcHBlbmRDaGFyKGtMZWZ0Q2hhcikpOworICBFWFBFQ1RfVFJVRShiaWRpLkFwcGVuZENoYXIoa1JpZ2h0Q2hhcikpOworICBkaXIgPSBiaWRpLkdldEJpZGlJbmZvKCZzdGFydCwgJmNvdW50KTsKKyAgRVhQRUNUX0VRKDAsIHN0YXJ0KTsKKyAgRVhQRUNUX0VRKDMsIGNvdW50KTsKKworICBFWFBFQ1RfRkFMU0UoYmlkaS5BcHBlbmRDaGFyKGtSaWdodENoYXIpKTsKKyAgRVhQRUNUX0ZBTFNFKGJpZGkuQXBwZW5kQ2hhcihrUmlnaHRDaGFyKSk7CisgIEVYUEVDVF9GQUxTRShiaWRpLkFwcGVuZENoYXIoa1JpZ2h0Q2hhcikpOworICBFWFBFQ1RfVFJVRShiaWRpLkFwcGVuZENoYXIoa0xlZnRDaGFyKSk7CisgIGRpciA9IGJpZGkuR2V0QmlkaUluZm8oJnN0YXJ0LCAmY291bnQpOworICBFWFBFQ1RfRVEoQ0ZYX0JpZGlDaGFyOjpSSUdIVCwgZGlyKTsKKyAgRVhQRUNUX0VRKDMsIHN0YXJ0KTsKKyAgRVhQRUNUX0VRKDQsIGNvdW50KTsKKworICBFWFBFQ1RfVFJVRShiaWRpLkVuZENoYXIoKSk7CisgIGRpciA9IGJpZGkuR2V0QmlkaUluZm8oJnN0YXJ0LCAmY291bnQpOworICBFWFBFQ1RfRVEoQ0ZYX0JpZGlDaGFyOjpMRUZULCBkaXIpOworICBFWFBFQ1RfRVEoNywgc3RhcnQpOworICBFWFBFQ1RfRVEoMSwgY291bnQpOworCisgIEVYUEVDVF9GQUxTRShiaWRpLkVuZENoYXIoKSk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9leHRlbnNpb24uY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfZXh0ZW5zaW9uLmNwcAppbmRleCAyMGUyZTFhLi44YTY5ODdiIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF9leHRlbnNpb24uY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5jcHAKQEAgLTQsMzc5ICs0LDM5MiBAQAogCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGNydC9meF9leHQuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfZXh0LmgiCiAjaW5jbHVkZSAiZXh0ZW5zaW9uLmgiCisKICNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCiAjaW5jbHVkZSA8d2luY3J5cHQuaD4KICNlbHNlCiAjaW5jbHVkZSA8Y3RpbWU+CiAjZW5kaWYKLUZYX0hGSUxFIEZYX0ZpbGVfT3BlbihGWF9CU1RSIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpCi17Ci0gICAgSUZYQ1JUX0ZpbGVBY2Nlc3MqIHBGQSA9IEZYQ1JUX0ZpbGVBY2Nlc3NfQ3JlYXRlKCk7Ci0gICAgaWYgKHBGQSAmJiAhcEZBLT5PcGVuKGZpbGVOYW1lLCBkd01vZGUpKSB7Ci0gICAgICAgIHBGQS0+UmVsZWFzZSgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIChGWF9IRklMRSlwRkE7CisKK0NGWF9DUlRGaWxlU3RyZWFtOjpDRlhfQ1JURmlsZVN0cmVhbShJRlhDUlRfRmlsZUFjY2VzcyogcEZBKQorICAgIDogbV9wRmlsZShwRkEpLCBtX2R3Q291bnQoMSkge30KKworQ0ZYX0NSVEZpbGVTdHJlYW06On5DRlhfQ1JURmlsZVN0cmVhbSgpIHsKKyAgaWYgKG1fcEZpbGUpIHsKKyAgICBtX3BGaWxlLT5SZWxlYXNlKCk7CisgIH0KIH0KLUZYX0hGSUxFIEZYX0ZpbGVfT3BlbihGWF9XU1RSIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpCi17Ci0gICAgSUZYQ1JUX0ZpbGVBY2Nlc3MqIHBGQSA9IEZYQ1JUX0ZpbGVBY2Nlc3NfQ3JlYXRlKCk7Ci0gICAgaWYgKHBGQSAmJiAhcEZBLT5PcGVuKGZpbGVOYW1lLCBkd01vZGUpKSB7Ci0gICAgICAgIHBGQS0+UmVsZWFzZSgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIChGWF9IRklMRSlwRkE7CisKK0lGWF9GaWxlU3RyZWFtKiBDRlhfQ1JURmlsZVN0cmVhbTo6UmV0YWluKCkgeworICBtX2R3Q291bnQrKzsKKyAgcmV0dXJuIHRoaXM7CiB9Ci12b2lkIEZYX0ZpbGVfQ2xvc2UoRlhfSEZJTEUgaEZpbGUpCi17Ci0gICAgRlhTWVNfYXNzZXJ0KGhGaWxlICE9IE5VTEwpOwotICAgICgoSUZYQ1JUX0ZpbGVBY2Nlc3MqKWhGaWxlKS0+Q2xvc2UoKTsKLSAgICAoKElGWENSVF9GaWxlQWNjZXNzKiloRmlsZSktPlJlbGVhc2UoKTsKKwordm9pZCBDRlhfQ1JURmlsZVN0cmVhbTo6UmVsZWFzZSgpIHsKKyAgRlhfRFdPUkQgbkNvdW50ID0gLS1tX2R3Q291bnQ7CisgIGlmICghbkNvdW50KSB7CisgICAgZGVsZXRlIHRoaXM7CisgIH0KIH0KLUZYX0ZJTEVTSVpFIEZYX0ZpbGVfR2V0U2l6ZShGWF9IRklMRSBoRmlsZSkKLXsKLSAgICBGWFNZU19hc3NlcnQoaEZpbGUgIT0gTlVMTCk7Ci0gICAgcmV0dXJuICgoSUZYQ1JUX0ZpbGVBY2Nlc3MqKWhGaWxlKS0+R2V0U2l6ZSgpOworCitGWF9GSUxFU0laRSBDRlhfQ1JURmlsZVN0cmVhbTo6R2V0U2l6ZSgpIHsKKyAgcmV0dXJuIG1fcEZpbGUtPkdldFNpemUoKTsKIH0KLUZYX0ZJTEVTSVpFIEZYX0ZpbGVfR2V0UG9zaXRpb24oRlhfSEZJTEUgaEZpbGUpCi17Ci0gICAgRlhTWVNfYXNzZXJ0KGhGaWxlICE9IE5VTEwpOwotICAgIHJldHVybiAoKElGWENSVF9GaWxlQWNjZXNzKiloRmlsZSktPkdldFBvc2l0aW9uKCk7CisKK0ZYX0JPT0wgQ0ZYX0NSVEZpbGVTdHJlYW06OklzRU9GKCkgeworICByZXR1cm4gR2V0UG9zaXRpb24oKSA+PSBHZXRTaXplKCk7CiB9Ci1GWF9GSUxFU0laRSBGWF9GaWxlX1NldFBvc2l0aW9uKEZYX0hGSUxFIGhGaWxlLCBGWF9GSUxFU0laRSBwb3MpCi17Ci0gICAgRlhTWVNfYXNzZXJ0KGhGaWxlICE9IE5VTEwpOwotICAgIHJldHVybiAoKElGWENSVF9GaWxlQWNjZXNzKiloRmlsZSktPlNldFBvc2l0aW9uKHBvcyk7CisKK0ZYX0ZJTEVTSVpFIENGWF9DUlRGaWxlU3RyZWFtOjpHZXRQb3NpdGlvbigpIHsKKyAgcmV0dXJuIG1fcEZpbGUtPkdldFBvc2l0aW9uKCk7CiB9Ci1zaXplX3QgRlhfRmlsZV9SZWFkKEZYX0hGSUxFIGhGaWxlLCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpCi17Ci0gICAgRlhTWVNfYXNzZXJ0KGhGaWxlICE9IE5VTEwpOwotICAgIHJldHVybiAoKElGWENSVF9GaWxlQWNjZXNzKiloRmlsZSktPlJlYWQocEJ1ZmZlciwgc3pCdWZmZXIpOworCitGWF9CT09MIENGWF9DUlRGaWxlU3RyZWFtOjpSZWFkQmxvY2sodm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgeworICByZXR1cm4gKEZYX0JPT0wpbV9wRmlsZS0+UmVhZFBvcyhidWZmZXIsIHNpemUsIG9mZnNldCk7CiB9Ci1zaXplX3QgRlhfRmlsZV9SZWFkUG9zKEZYX0hGSUxFIGhGaWxlLCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIsIEZYX0ZJTEVTSVpFIHBvcykKLXsKLSAgICBGWFNZU19hc3NlcnQoaEZpbGUgIT0gTlVMTCk7Ci0gICAgcmV0dXJuICgoSUZYQ1JUX0ZpbGVBY2Nlc3MqKWhGaWxlKS0+UmVhZFBvcyhwQnVmZmVyLCBzekJ1ZmZlciwgcG9zKTsKKworc2l6ZV90IENGWF9DUlRGaWxlU3RyZWFtOjpSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgeworICByZXR1cm4gbV9wRmlsZS0+UmVhZChidWZmZXIsIHNpemUpOwogfQotc2l6ZV90IEZYX0ZpbGVfV3JpdGUoRlhfSEZJTEUgaEZpbGUsIGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikKLXsKLSAgICBGWFNZU19hc3NlcnQoaEZpbGUgIT0gTlVMTCk7Ci0gICAgcmV0dXJuICgoSUZYQ1JUX0ZpbGVBY2Nlc3MqKWhGaWxlKS0+V3JpdGUocEJ1ZmZlciwgc3pCdWZmZXIpOworCitGWF9CT09MIENGWF9DUlRGaWxlU3RyZWFtOjpXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgeworICByZXR1cm4gKEZYX0JPT0wpbV9wRmlsZS0+V3JpdGVQb3MoYnVmZmVyLCBzaXplLCBvZmZzZXQpOwogfQotc2l6ZV90IEZYX0ZpbGVfV3JpdGVQb3MoRlhfSEZJTEUgaEZpbGUsIGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKQotewotICAgIEZYU1lTX2Fzc2VydChoRmlsZSAhPSBOVUxMKTsKLSAgICByZXR1cm4gKChJRlhDUlRfRmlsZUFjY2VzcyopaEZpbGUpLT5Xcml0ZVBvcyhwQnVmZmVyLCBzekJ1ZmZlciwgcG9zKTsKKworRlhfQk9PTCBDRlhfQ1JURmlsZVN0cmVhbTo6Rmx1c2goKSB7CisgIHJldHVybiBtX3BGaWxlLT5GbHVzaCgpOwogfQotRlhfQk9PTCBGWF9GaWxlX0ZsdXNoKEZYX0hGSUxFIGhGaWxlKQotewotICAgIEZYU1lTX2Fzc2VydChoRmlsZSAhPSBOVUxMKTsKLSAgICByZXR1cm4gKChJRlhDUlRfRmlsZUFjY2VzcyopaEZpbGUpLT5GbHVzaCgpOworCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK0lGWF9GaWxlQWNjZXNzKiBGWF9DcmVhdGVEZWZhdWx0RmlsZUFjY2Vzcyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzUGF0aCkgeworICBpZiAod3NQYXRoLkdldExlbmd0aCgpID09IDApCisgICAgcmV0dXJuIE5VTEw7CisKKyAgQ0ZYX0NSVEZpbGVBY2Nlc3MqIHBGQSA9IE5VTEw7CisgIHBGQSA9IG5ldyBDRlhfQ1JURmlsZUFjY2VzczsKKyAgaWYgKE5VTEwgPT0gcEZBKQorICAgIHJldHVybiBOVUxMOworCisgIHBGQS0+SW5pdCh3c1BhdGgpOworICByZXR1cm4gcEZBOwogfQotRlhfQk9PTCBGWF9GaWxlX1RydW5jYXRlKEZYX0hGSUxFIGhGaWxlLCBGWF9GSUxFU0laRSBzekZpbGUpCi17Ci0gICAgRlhTWVNfYXNzZXJ0KGhGaWxlICE9IE5VTEwpOwotICAgIHJldHVybiAoKElGWENSVF9GaWxlQWNjZXNzKiloRmlsZSktPlRydW5jYXRlKHN6RmlsZSk7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKK0lGWF9GaWxlU3RyZWFtKiBGWF9DcmVhdGVGaWxlU3RyZWFtKGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLCBGWF9EV09SRCBkd01vZGVzKSB7CisgIElGWENSVF9GaWxlQWNjZXNzKiBwRkEgPSBGWENSVF9GaWxlQWNjZXNzX0NyZWF0ZSgpOworICBpZiAoIXBGQSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmICghcEZBLT5PcGVuKGZpbGVuYW1lLCBkd01vZGVzKSkgeworICAgIHBGQS0+UmVsZWFzZSgpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBuZXcgQ0ZYX0NSVEZpbGVTdHJlYW0ocEZBKTsKIH0KLUlGWF9GaWxlU3RyZWFtKiBGWF9DcmVhdGVGaWxlU3RyZWFtKEZYX0xQQ1NUUiBmaWxlbmFtZSwgRlhfRFdPUkQgZHdNb2RlcykKLXsKLSAgICBJRlhDUlRfRmlsZUFjY2VzcyogcEZBID0gRlhDUlRfRmlsZUFjY2Vzc19DcmVhdGUoKTsKLSAgICBpZiAoIXBGQSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKCFwRkEtPk9wZW4oZmlsZW5hbWUsIGR3TW9kZXMpKSB7Ci0gICAgICAgIHBGQS0+UmVsZWFzZSgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBDRlhfQ1JURmlsZVN0cmVhbShwRkEpOworSUZYX0ZpbGVTdHJlYW0qIEZYX0NyZWF0ZUZpbGVTdHJlYW0oY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdNb2RlcykgeworICBJRlhDUlRfRmlsZUFjY2VzcyogcEZBID0gRlhDUlRfRmlsZUFjY2Vzc19DcmVhdGUoKTsKKyAgaWYgKCFwRkEpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoIXBGQS0+T3BlbihmaWxlbmFtZSwgZHdNb2RlcykpIHsKKyAgICBwRkEtPlJlbGVhc2UoKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gbmV3IENGWF9DUlRGaWxlU3RyZWFtKHBGQSk7CiB9Ci1JRlhfRmlsZVN0cmVhbSogRlhfQ3JlYXRlRmlsZVN0cmVhbShGWF9MUENXU1RSIGZpbGVuYW1lLCBGWF9EV09SRCBkd01vZGVzKQotewotICAgIElGWENSVF9GaWxlQWNjZXNzKiBwRkEgPSBGWENSVF9GaWxlQWNjZXNzX0NyZWF0ZSgpOwotICAgIGlmICghcEZBKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoIXBGQS0+T3BlbihmaWxlbmFtZSwgZHdNb2RlcykpIHsKLSAgICAgICAgcEZBLT5SZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbmV3IENGWF9DUlRGaWxlU3RyZWFtKHBGQSk7CitJRlhfRmlsZVJlYWQqIEZYX0NyZWF0ZUZpbGVSZWFkKGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lKSB7CisgIHJldHVybiBGWF9DcmVhdGVGaWxlU3RyZWFtKGZpbGVuYW1lLCBGWF9GSUxFTU9ERV9SZWFkT25seSk7CiB9Ci1JRlhfRmlsZVdyaXRlKiBGWF9DcmVhdGVGaWxlV3JpdGUoRlhfTFBDU1RSIGZpbGVuYW1lKQotewotICAgIHJldHVybiBGWF9DcmVhdGVGaWxlU3RyZWFtKGZpbGVuYW1lLCBGWF9GSUxFTU9ERV9UcnVuY2F0ZSk7CitJRlhfRmlsZVJlYWQqIEZYX0NyZWF0ZUZpbGVSZWFkKGNvbnN0IEZYX1dDSEFSKiBmaWxlbmFtZSkgeworICByZXR1cm4gRlhfQ3JlYXRlRmlsZVN0cmVhbShmaWxlbmFtZSwgRlhfRklMRU1PREVfUmVhZE9ubHkpOwogfQotSUZYX0ZpbGVXcml0ZSogRlhfQ3JlYXRlRmlsZVdyaXRlKEZYX0xQQ1dTVFIgZmlsZW5hbWUpCi17Ci0gICAgcmV0dXJuIEZYX0NyZWF0ZUZpbGVTdHJlYW0oZmlsZW5hbWUsIEZYX0ZJTEVNT0RFX1RydW5jYXRlKTsKK0lGWF9NZW1vcnlTdHJlYW0qIEZYX0NyZWF0ZU1lbW9yeVN0cmVhbSh1aW50OF90KiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkd1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVGFrZU92ZXIpIHsKKyAgcmV0dXJuIG5ldyBDRlhfTWVtb3J5U3RyZWFtKHBCdWZmZXIsIGR3U2l6ZSwgYlRha2VPdmVyKTsKIH0KLUlGWF9GaWxlUmVhZCogRlhfQ3JlYXRlRmlsZVJlYWQoRlhfTFBDU1RSIGZpbGVuYW1lKQotewotICAgIHJldHVybiBGWF9DcmVhdGVGaWxlU3RyZWFtKGZpbGVuYW1lLCBGWF9GSUxFTU9ERV9SZWFkT25seSk7CitJRlhfTWVtb3J5U3RyZWFtKiBGWF9DcmVhdGVNZW1vcnlTdHJlYW0oRlhfQk9PTCBiQ29uc2VjdXRpdmUpIHsKKyAgcmV0dXJuIG5ldyBDRlhfTWVtb3J5U3RyZWFtKGJDb25zZWN1dGl2ZSk7CiB9Ci1JRlhfRmlsZVJlYWQqIEZYX0NyZWF0ZUZpbGVSZWFkKEZYX0xQQ1dTVFIgZmlsZW5hbWUpCi17Ci0gICAgcmV0dXJuIEZYX0NyZWF0ZUZpbGVTdHJlYW0oZmlsZW5hbWUsIEZYX0ZJTEVNT0RFX1JlYWRPbmx5KTsKKworRlhfRkxPQVQgRlhTWVNfdGFuKEZYX0ZMT0FUIGEpIHsKKyAgcmV0dXJuIChGWF9GTE9BVCl0YW4oYSk7CiB9Ci1JRlhfTWVtb3J5U3RyZWFtKiBGWF9DcmVhdGVNZW1vcnlTdHJlYW0oRlhfTFBCWVRFIHBCdWZmZXIsIHNpemVfdCBkd1NpemUsIEZYX0JPT0wgYlRha2VPdmVyKQotewotICAgIHJldHVybiBuZXcgQ0ZYX01lbW9yeVN0cmVhbShwQnVmZmVyLCBkd1NpemUsIGJUYWtlT3Zlcik7CitGWF9GTE9BVCBGWFNZU19sb2diKEZYX0ZMT0FUIGIsIEZYX0ZMT0FUIHgpIHsKKyAgcmV0dXJuIEZYU1lTX2xvZyh4KSAvIEZYU1lTX2xvZyhiKTsKIH0KLUlGWF9NZW1vcnlTdHJlYW0qIEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShGWF9CT09MIGJDb25zZWN1dGl2ZSkKLXsKLSAgICByZXR1cm4gbmV3IENGWF9NZW1vcnlTdHJlYW0oYkNvbnNlY3V0aXZlKTsKK0ZYX0ZMT0FUIEZYU1lTX3N0cnRvZihjb25zdCBGWF9DSEFSKiBwY3NTdHIsCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBVc2VkTGVuKSB7CisgIEZYU1lTX2Fzc2VydChwY3NTdHIpOworICBpZiAoaUxlbmd0aCA8IDApIHsKKyAgICBpTGVuZ3RoID0gKGludDMyX3QpRlhTWVNfc3RybGVuKHBjc1N0cik7CisgIH0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3MgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBjc1N0ciwgaUxlbmd0aCk7CisgIHJldHVybiBGWFNZU193Y3N0b2Yod3MuY19zdHIoKSwgaUxlbmd0aCwgcFVzZWRMZW4pOwogfQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotRlhfRkxPQVQgRlhTWVNfdGFuKEZYX0ZMT0FUIGEpCi17Ci0gICAgcmV0dXJuIChGWF9GTE9BVCl0YW4oYSk7Ci19Ci1GWF9GTE9BVCBGWFNZU19sb2diKEZYX0ZMT0FUIGIsIEZYX0ZMT0FUIHgpCi17Ci0gICAgcmV0dXJuIEZYU1lTX2xvZyh4KSAvIEZYU1lTX2xvZyhiKTsKLX0KLUZYX0ZMT0FUIEZYU1lTX3N0cnRvZihGWF9MUENTVFIgcGNzU3RyLCBGWF9JTlQzMiBpTGVuZ3RoLCBGWF9JTlQzMiAqcFVzZWRMZW4pCi17Ci0gICAgRlhTWVNfYXNzZXJ0KHBjc1N0ciAhPSBOVUxMKTsKLSAgICBpZiAoaUxlbmd0aCA8IDApIHsKLSAgICAgICAgaUxlbmd0aCA9IChGWF9JTlQzMilGWFNZU19zdHJsZW4ocGNzU3RyKTsKLSAgICB9Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3MgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBjc1N0ciwgaUxlbmd0aCk7Ci0gICAgcmV0dXJuIEZYU1lTX3djc3RvZih3cy5jX3N0cigpLCBpTGVuZ3RoLCBwVXNlZExlbik7Ci19Ci1GWF9GTE9BVCBGWFNZU193Y3N0b2YoRlhfTFBDV1NUUiBwd3NTdHIsIEZYX0lOVDMyIGlMZW5ndGgsIEZYX0lOVDMyICpwVXNlZExlbikKLXsKLSAgICBGWFNZU19hc3NlcnQocHdzU3RyICE9IE5VTEwpOwotICAgIGlmIChpTGVuZ3RoIDwgMCkgewotICAgICAgICBpTGVuZ3RoID0gKEZYX0lOVDMyKUZYU1lTX3djc2xlbihwd3NTdHIpOwotICAgIH0KLSAgICBpZiAoaUxlbmd0aCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwLjBmOwotICAgIH0KLSAgICBGWF9JTlQzMiBpVXNlZExlbiA9IDA7Ci0gICAgRlhfQk9PTCBiTmVndGl2ZSA9IEZBTFNFOwotICAgIHN3aXRjaCAocHdzU3RyW2lVc2VkTGVuXSkgewotICAgICAgICBjYXNlICctJzoKLSAgICAgICAgICAgIGJOZWd0aXZlID0gVFJVRTsKLSAgICAgICAgY2FzZSAnKyc6Ci0gICAgICAgICAgICBpVXNlZExlbisrOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIEZYX0ZMT0FUIGZWYWx1ZSA9IDAuMGY7Ci0gICAgd2hpbGUgKGlVc2VkTGVuIDwgaUxlbmd0aCkgewotICAgICAgICBGWF9XQ0hBUiB3Y2ggPSBwd3NTdHJbaVVzZWRMZW5dOwotICAgICAgICBpZiAod2NoID49IEwnMCcgJiYgd2NoIDw9IEwnOScpIHsKLSAgICAgICAgICAgIGZWYWx1ZSA9IGZWYWx1ZSAqIDEwLjBmICsgKHdjaCAtIEwnMCcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaVVzZWRMZW4rKzsKLSAgICB9Ci0gICAgaWYgKGlVc2VkTGVuIDwgaUxlbmd0aCAmJiBwd3NTdHJbaVVzZWRMZW5dID09IEwnLicpIHsKLSAgICAgICAgRlhfRkxPQVQgZlByZWNpc2UgPSAwLjFmOwotICAgICAgICB3aGlsZSAoKytpVXNlZExlbiA8IGlMZW5ndGgpIHsKLSAgICAgICAgICAgIEZYX1dDSEFSIHdjaCA9IHB3c1N0cltpVXNlZExlbl07Ci0gICAgICAgICAgICBpZiAod2NoID49IEwnMCcgJiYgd2NoIDw9IEwnOScpIHsKLSAgICAgICAgICAgICAgICBmVmFsdWUgKz0gKHdjaCAtIEwnMCcpICogZlByZWNpc2U7Ci0gICAgICAgICAgICAgICAgZlByZWNpc2UgKj0gMC4xZjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBVc2VkTGVuKSB7Ci0gICAgICAgICpwVXNlZExlbiA9IGlVc2VkTGVuOwotICAgIH0KLSAgICByZXR1cm4gYk5lZ3RpdmUgPyAtZlZhbHVlIDogZlZhbHVlOwotfQotRlhfTFBXU1RSIEZYU1lTX3djc25jcHkoRlhfTFBXU1RSIGRzdFN0ciwgRlhfTFBDV1NUUiBzcmNTdHIsIHNpemVfdCBjb3VudCkKLXsKLSAgICBGWFNZU19hc3NlcnQoZHN0U3RyICE9IE5VTEwgJiYgc3JjU3RyICE9IE5VTEwgJiYgY291bnQgPiAwKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpCi0gICAgICAgIGlmICgoZHN0U3RyW2ldID0gc3JjU3RyW2ldKSA9PSBMJ1wwJykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICByZXR1cm4gZHN0U3RyOwotfQotRlhfSU5UMzIgRlhTWVNfd2NzbmljbXAoRlhfTFBDV1NUUiBzMSwgRlhfTFBDV1NUUiBzMiwgc2l6ZV90IGNvdW50KQotewotICAgIEZYU1lTX2Fzc2VydChzMSAhPSBOVUxMICYmIHMyICE9IE5VTEwgJiYgY291bnQgPiAwKTsKLSAgICBGWF9XQ0hBUiB3Y2gxID0gMCwgd2NoMiA9IDA7Ci0gICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7Ci0gICAgICAgIHdjaDEgPSAoRlhfV0NIQVIpRlhTWVNfdG9sb3dlcigqczErKyk7Ci0gICAgICAgIHdjaDIgPSAoRlhfV0NIQVIpRlhTWVNfdG9sb3dlcigqczIrKyk7Ci0gICAgICAgIGlmICh3Y2gxICE9IHdjaDIpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB3Y2gxIC0gd2NoMjsKLX0KLUZYX0lOVDMyIEZYU1lTX3N0cm5pY21wKEZYX0xQQ1NUUiBzMSwgRlhfTFBDU1RSIHMyLCBzaXplX3QgY291bnQpCi17Ci0gICAgRlhTWVNfYXNzZXJ0KHMxICE9IE5VTEwgJiYgczIgIT0gTlVMTCAmJiBjb3VudCA+IDApOwotICAgIEZYX0NIQVIgY2gxID0gMCwgY2gyID0gMDsKLSAgICB3aGlsZSAoY291bnQtLSA+IDApIHsKLSAgICAgICAgY2gxID0gKEZYX0NIQVIpRlhTWVNfdG9sb3dlcigqczErKyk7Ci0gICAgICAgIGNoMiA9IChGWF9DSEFSKUZYU1lTX3RvbG93ZXIoKnMyKyspOwotICAgICAgICBpZiAoY2gxICE9IGNoMikgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGNoMSAtIGNoMjsKLX0KLUZYX0RXT1JEIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRBKEZYX0xQQ1NUUiBwU3RyLCBGWF9JTlQzMiBpTGVuZ3RoLCBGWF9CT09MIGJJZ25vcmVDYXNlKQotewotICAgIEZYU1lTX2Fzc2VydChwU3RyICE9IE5VTEwpOwotICAgIGlmIChpTGVuZ3RoIDwgMCkgewotICAgICAgICBpTGVuZ3RoID0gKEZYX0lOVDMyKUZYU1lTX3N0cmxlbihwU3RyKTsKLSAgICB9Ci0gICAgRlhfTFBDU1RSIHBTdHJFbmQgPSBwU3RyICsgaUxlbmd0aDsKLSAgICBGWF9EV09SRCBkd0hhc2hDb2RlID0gMDsKLSAgICBpZiAoYklnbm9yZUNhc2UpIHsKLSAgICAgICAgd2hpbGUgKHBTdHIgPCBwU3RyRW5kKSB7Ci0gICAgICAgICAgICBkd0hhc2hDb2RlID0gMzEgKiBkd0hhc2hDb2RlICsgRlhTWVNfdG9sb3dlcigqcFN0cisrKTsKLSAgICAgICAgfQorRlhfRkxPQVQgRlhTWVNfd2NzdG9mKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBVc2VkTGVuKSB7CisgIEZYU1lTX2Fzc2VydChwd3NTdHIpOworICBpZiAoaUxlbmd0aCA8IDApIHsKKyAgICBpTGVuZ3RoID0gKGludDMyX3QpRlhTWVNfd2NzbGVuKHB3c1N0cik7CisgIH0KKyAgaWYgKGlMZW5ndGggPT0gMCkgeworICAgIHJldHVybiAwLjBmOworICB9CisgIGludDMyX3QgaVVzZWRMZW4gPSAwOworICBGWF9CT09MIGJOZWd0aXZlID0gRkFMU0U7CisgIHN3aXRjaCAocHdzU3RyW2lVc2VkTGVuXSkgeworICAgIGNhc2UgJy0nOgorICAgICAgYk5lZ3RpdmUgPSBUUlVFOworICAgIGNhc2UgJysnOgorICAgICAgaVVzZWRMZW4rKzsKKyAgICAgIGJyZWFrOworICB9CisgIEZYX0ZMT0FUIGZWYWx1ZSA9IDAuMGY7CisgIHdoaWxlIChpVXNlZExlbiA8IGlMZW5ndGgpIHsKKyAgICBGWF9XQ0hBUiB3Y2ggPSBwd3NTdHJbaVVzZWRMZW5dOworICAgIGlmICh3Y2ggPj0gTCcwJyAmJiB3Y2ggPD0gTCc5JykgeworICAgICAgZlZhbHVlID0gZlZhbHVlICogMTAuMGYgKyAod2NoIC0gTCcwJyk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgd2hpbGUgKHBTdHIgPCBwU3RyRW5kKSB7Ci0gICAgICAgICAgICBkd0hhc2hDb2RlID0gMzEgKiBkd0hhc2hDb2RlICsgKnBTdHIgKys7Ci0gICAgICAgIH0KKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICByZXR1cm4gZHdIYXNoQ29kZTsKLX0KLUZYX0RXT1JEIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKEZYX0xQQ1dTVFIgcFN0ciwgRlhfSU5UMzIgaUxlbmd0aCwgRlhfQk9PTCBiSWdub3JlQ2FzZSkKLXsKLSAgICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMKTsKLSAgICBpZiAoaUxlbmd0aCA8IDApIHsKLSAgICAgICAgaUxlbmd0aCA9IChGWF9JTlQzMilGWFNZU193Y3NsZW4ocFN0cik7CisgICAgaVVzZWRMZW4rKzsKKyAgfQorICBpZiAoaVVzZWRMZW4gPCBpTGVuZ3RoICYmIHB3c1N0cltpVXNlZExlbl0gPT0gTCcuJykgeworICAgIEZYX0ZMT0FUIGZQcmVjaXNlID0gMC4xZjsKKyAgICB3aGlsZSAoKytpVXNlZExlbiA8IGlMZW5ndGgpIHsKKyAgICAgIEZYX1dDSEFSIHdjaCA9IHB3c1N0cltpVXNlZExlbl07CisgICAgICBpZiAod2NoID49IEwnMCcgJiYgd2NoIDw9IEwnOScpIHsKKyAgICAgICAgZlZhbHVlICs9ICh3Y2ggLSBMJzAnKSAqIGZQcmVjaXNlOworICAgICAgICBmUHJlY2lzZSAqPSAwLjFmOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CiAgICAgfQotICAgIEZYX0xQQ1dTVFIgcFN0ckVuZCA9IHBTdHIgKyBpTGVuZ3RoOwotICAgIEZYX0RXT1JEIGR3SGFzaENvZGUgPSAwOwotICAgIGlmIChiSWdub3JlQ2FzZSkgewotICAgICAgICB3aGlsZSAocFN0ciA8IHBTdHJFbmQpIHsKLSAgICAgICAgICAgIGR3SGFzaENvZGUgPSAxMzEzICogZHdIYXNoQ29kZSArIEZYU1lTX3RvbG93ZXIoKnBTdHIrKyk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICB3aGlsZSAocFN0ciA8IHBTdHJFbmQpIHsKLSAgICAgICAgICAgIGR3SGFzaENvZGUgPSAxMzEzICogZHdIYXNoQ29kZSArICpwU3RyICsrOwotICAgICAgICB9CisgIH0KKyAgaWYgKHBVc2VkTGVuKSB7CisgICAgKnBVc2VkTGVuID0gaVVzZWRMZW47CisgIH0KKyAgcmV0dXJuIGJOZWd0aXZlID8gLWZWYWx1ZSA6IGZWYWx1ZTsKK30KK0ZYX1dDSEFSKiBGWFNZU193Y3NuY3B5KEZYX1dDSEFSKiBkc3RTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogc3JjU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50KSB7CisgIEZYU1lTX2Fzc2VydChkc3RTdHIgJiYgc3JjU3RyICYmIGNvdW50ID4gMCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKyAgICBpZiAoKGRzdFN0cltpXSA9IHNyY1N0cltpXSkgPT0gTCdcMCcpIHsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICByZXR1cm4gZHdIYXNoQ29kZTsKKyAgcmV0dXJuIGRzdFN0cjsKIH0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1GWF9MUFZPSUQgRlhfUmFuZG9tX01UX1N0YXJ0KEZYX0RXT1JEIGR3U2VlZCkKLXsKLSAgICBGWF9MUE1UUkFORE9NQ09OVEVYVCBwQ29udGV4dCA9IEZYX0FsbG9jKEZYX01UUkFORE9NQ09OVEVYVCwgMSk7Ci0gICAgcENvbnRleHQtPm10WzBdID0gZHdTZWVkOwotICAgIEZYX0RXT1JEICZpID0gcENvbnRleHQtPm10aTsKLSAgICBGWF9MUERXT1JEIHBCdWYgPSBwQ29udGV4dC0+bXQ7Ci0gICAgZm9yIChpID0gMTsgaSA8IE1UX047IGkgKyspIHsKLSAgICAgICAgcEJ1ZltpXSA9ICgxODEyNDMzMjUzVUwgKiAocEJ1ZltpIC0gMV0gXiAocEJ1ZltpIC0gMV0gPj4gMzApKSArIGkpOworaW50MzJfdCBGWFNZU193Y3NuaWNtcChjb25zdCBGWF9XQ0hBUiogczEsIGNvbnN0IEZYX1dDSEFSKiBzMiwgc2l6ZV90IGNvdW50KSB7CisgIEZYU1lTX2Fzc2VydChzMSAmJiBzMiAmJiBjb3VudCA+IDApOworICBGWF9XQ0hBUiB3Y2gxID0gMCwgd2NoMiA9IDA7CisgIHdoaWxlIChjb3VudC0tID4gMCkgeworICAgIHdjaDEgPSAoRlhfV0NIQVIpRlhTWVNfdG9sb3dlcigqczErKyk7CisgICAgd2NoMiA9IChGWF9XQ0hBUilGWFNZU190b2xvd2VyKCpzMisrKTsKKyAgICBpZiAod2NoMSAhPSB3Y2gyKSB7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgcENvbnRleHQtPmJIYXZlU2VlZCA9IFRSVUU7Ci0gICAgcmV0dXJuIHBDb250ZXh0OworICB9CisgIHJldHVybiB3Y2gxIC0gd2NoMjsKIH0KLUZYX0RXT1JEIEZYX1JhbmRvbV9NVF9HZW5lcmF0ZShGWF9MUFZPSUQgcENvbnRleHQpCi17Ci0gICAgRlhTWVNfYXNzZXJ0KHBDb250ZXh0ICE9IE5VTEwpOwotICAgIEZYX0xQTVRSQU5ET01DT05URVhUIHBNVEMgPSAoRlhfTFBNVFJBTkRPTUNPTlRFWFQpcENvbnRleHQ7Ci0gICAgRlhfRFdPUkQgdjsKLSAgICBzdGF0aWMgRlhfRFdPUkQgbWFnWzJdID0gezAsIE1UX01hdHJpeF9BfTsKLSAgICBGWF9EV09SRCAmbXRpID0gcE1UQy0+bXRpOwotICAgIEZYX0xQRFdPUkQgcEJ1ZiA9IHBNVEMtPm10OwotICAgIGlmICgoaW50KW10aSA8IDAgfHwgbXRpID49IE1UX04pIHsKLSAgICAgICAgaWYgKG10aSA+IE1UX04gJiYgIXBNVEMtPmJIYXZlU2VlZCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRFdPUkQga2s7Ci0gICAgICAgIGZvciAoa2sgPSAwOyBrayA8IE1UX04gLSBNVF9NOyBrayArKykgewotICAgICAgICAgICAgdiA9IChwQnVmW2trXSAmIE1UX1VwcGVyX01hc2spIHwgKHBCdWZba2sgKyAxXSAmIE1UX0xvd2VyX01hc2spOwotICAgICAgICAgICAgcEJ1Zltra10gPSBwQnVmW2trICsgTVRfTV0gXiAodiA+PiAxKSBeIG1hZ1t2ICYgMV07Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICg7IGtrIDwgTVRfTiAtIDE7IGtrICsrKSB7Ci0gICAgICAgICAgICB2ID0gKHBCdWZba2tdICYgTVRfVXBwZXJfTWFzaykgfCAocEJ1ZltrayArIDFdICYgTVRfTG93ZXJfTWFzayk7Ci0gICAgICAgICAgICBwQnVmW2trXSA9IHBCdWZba2sgKyAoTVRfTSAtIE1UX04pXSBeICh2ID4+IDEpIF4gbWFnW3YgJiAxXTsKLSAgICAgICAgfQotICAgICAgICB2ID0gKHBCdWZbTVRfTiAtIDFdICYgTVRfVXBwZXJfTWFzaykgfCAocEJ1ZlswXSAmIE1UX0xvd2VyX01hc2spOwotICAgICAgICBwQnVmW01UX04gLSAxXSA9IHBCdWZbTVRfTSAtIDFdIF4gKHYgPj4gMSkgXiBtYWdbdiAmIDFdOwotICAgICAgICBtdGkgPSAwOworaW50MzJfdCBGWFNZU19zdHJuaWNtcChjb25zdCBGWF9DSEFSKiBzMSwgY29uc3QgRlhfQ0hBUiogczIsIHNpemVfdCBjb3VudCkgeworICBGWFNZU19hc3NlcnQoczEgJiYgczIgJiYgY291bnQgPiAwKTsKKyAgRlhfQ0hBUiBjaDEgPSAwLCBjaDIgPSAwOworICB3aGlsZSAoY291bnQtLSA+IDApIHsKKyAgICBjaDEgPSAoRlhfQ0hBUilGWFNZU190b2xvd2VyKCpzMSsrKTsKKyAgICBjaDIgPSAoRlhfQ0hBUilGWFNZU190b2xvd2VyKCpzMisrKTsKKyAgICBpZiAoY2gxICE9IGNoMikgeworICAgICAgYnJlYWs7CiAgICAgfQotICAgIHYgPSBwQnVmW210aSArK107Ci0gICAgdiBePSAodiA+PiAxMSk7Ci0gICAgdiBePSAodiA8PCA3KSAmIDB4OWQyYzU2ODBVTDsKLSAgICB2IF49ICh2IDw8IDE1KSAmIDB4ZWZjNjAwMDBVTDsKLSAgICB2IF49ICh2ID4+IDE4KTsKLSAgICByZXR1cm4gdjsKKyAgfQorICByZXR1cm4gY2gxIC0gY2gyOwogfQotdm9pZCBGWF9SYW5kb21fTVRfQ2xvc2UoRlhfTFBWT0lEIHBDb250ZXh0KQotewotICAgIEZYU1lTX2Fzc2VydChwQ29udGV4dCAhPSBOVUxMKTsKLSAgICBGWF9GcmVlKHBDb250ZXh0KTsKK0ZYX0RXT1JEIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRBKGNvbnN0IEZYX0NIQVIqIHBTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJZ25vcmVDYXNlKSB7CisgIEZYU1lTX2Fzc2VydChwU3RyKTsKKyAgaWYgKGlMZW5ndGggPCAwKSB7CisgICAgaUxlbmd0aCA9IChpbnQzMl90KUZYU1lTX3N0cmxlbihwU3RyKTsKKyAgfQorICBjb25zdCBGWF9DSEFSKiBwU3RyRW5kID0gcFN0ciArIGlMZW5ndGg7CisgIEZYX0RXT1JEIGR3SGFzaENvZGUgPSAwOworICBpZiAoYklnbm9yZUNhc2UpIHsKKyAgICB3aGlsZSAocFN0ciA8IHBTdHJFbmQpIHsKKyAgICAgIGR3SGFzaENvZGUgPSAzMSAqIGR3SGFzaENvZGUgKyBGWFNZU190b2xvd2VyKCpwU3RyKyspOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB3aGlsZSAocFN0ciA8IHBTdHJFbmQpIHsKKyAgICAgIGR3SGFzaENvZGUgPSAzMSAqIGR3SGFzaENvZGUgKyAqcFN0cisrOworICAgIH0KKyAgfQorICByZXR1cm4gZHdIYXNoQ29kZTsKIH0KLXZvaWQgRlhfUmFuZG9tX0dlbmVyYXRlTVQoRlhfTFBEV09SRCBwQnVmZmVyLCBGWF9JTlQzMiBpQ291bnQpCi17Ci0gICAgRlhfRFdPUkQgZHdTZWVkOworRlhfRFdPUkQgRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoY29uc3QgRlhfV0NIQVIqIHBTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJZ25vcmVDYXNlKSB7CisgIEZYU1lTX2Fzc2VydChwU3RyKTsKKyAgaWYgKGlMZW5ndGggPCAwKSB7CisgICAgaUxlbmd0aCA9IChpbnQzMl90KUZYU1lTX3djc2xlbihwU3RyKTsKKyAgfQorICBjb25zdCBGWF9XQ0hBUiogcFN0ckVuZCA9IHBTdHIgKyBpTGVuZ3RoOworICBGWF9EV09SRCBkd0hhc2hDb2RlID0gMDsKKyAgaWYgKGJJZ25vcmVDYXNlKSB7CisgICAgd2hpbGUgKHBTdHIgPCBwU3RyRW5kKSB7CisgICAgICBkd0hhc2hDb2RlID0gMTMxMyAqIGR3SGFzaENvZGUgKyBGWFNZU190b2xvd2VyKCpwU3RyKyspOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB3aGlsZSAocFN0ciA8IHBTdHJFbmQpIHsKKyAgICAgIGR3SGFzaENvZGUgPSAxMzEzICogZHdIYXNoQ29kZSArICpwU3RyKys7CisgICAgfQorICB9CisgIHJldHVybiBkd0hhc2hDb2RlOworfQorCit2b2lkKiBGWF9SYW5kb21fTVRfU3RhcnQoRlhfRFdPUkQgZHdTZWVkKSB7CisgIEZYX0xQTVRSQU5ET01DT05URVhUIHBDb250ZXh0ID0gRlhfQWxsb2MoRlhfTVRSQU5ET01DT05URVhULCAxKTsKKyAgcENvbnRleHQtPm10WzBdID0gZHdTZWVkOworICBGWF9EV09SRCYgaSA9IHBDb250ZXh0LT5tdGk7CisgIEZYX0RXT1JEKiBwQnVmID0gcENvbnRleHQtPm10OworICBmb3IgKGkgPSAxOyBpIDwgTVRfTjsgaSsrKSB7CisgICAgcEJ1ZltpXSA9ICgxODEyNDMzMjUzVUwgKiAocEJ1ZltpIC0gMV0gXiAocEJ1ZltpIC0gMV0gPj4gMzApKSArIGkpOworICB9CisgIHBDb250ZXh0LT5iSGF2ZVNlZWQgPSBUUlVFOworICByZXR1cm4gcENvbnRleHQ7Cit9CitGWF9EV09SRCBGWF9SYW5kb21fTVRfR2VuZXJhdGUodm9pZCogcENvbnRleHQpIHsKKyAgRlhTWVNfYXNzZXJ0KHBDb250ZXh0KTsKKyAgRlhfTFBNVFJBTkRPTUNPTlRFWFQgcE1UQyA9IChGWF9MUE1UUkFORE9NQ09OVEVYVClwQ29udGV4dDsKKyAgRlhfRFdPUkQgdjsKKyAgc3RhdGljIEZYX0RXT1JEIG1hZ1syXSA9IHswLCBNVF9NYXRyaXhfQX07CisgIEZYX0RXT1JEJiBtdGkgPSBwTVRDLT5tdGk7CisgIEZYX0RXT1JEKiBwQnVmID0gcE1UQy0+bXQ7CisgIGlmICgoaW50KW10aSA8IDAgfHwgbXRpID49IE1UX04pIHsKKyAgICBpZiAobXRpID4gTVRfTiAmJiAhcE1UQy0+YkhhdmVTZWVkKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgRlhfRFdPUkQga2s7CisgICAgZm9yIChrayA9IDA7IGtrIDwgTVRfTiAtIE1UX007IGtrKyspIHsKKyAgICAgIHYgPSAocEJ1Zltra10gJiBNVF9VcHBlcl9NYXNrKSB8IChwQnVmW2trICsgMV0gJiBNVF9Mb3dlcl9NYXNrKTsKKyAgICAgIHBCdWZba2tdID0gcEJ1ZltrayArIE1UX01dIF4gKHYgPj4gMSkgXiBtYWdbdiAmIDFdOworICAgIH0KKyAgICBmb3IgKDsga2sgPCBNVF9OIC0gMTsga2srKykgeworICAgICAgdiA9IChwQnVmW2trXSAmIE1UX1VwcGVyX01hc2spIHwgKHBCdWZba2sgKyAxXSAmIE1UX0xvd2VyX01hc2spOworICAgICAgcEJ1Zltra10gPSBwQnVmW2trICsgKE1UX00gLSBNVF9OKV0gXiAodiA+PiAxKSBeIG1hZ1t2ICYgMV07CisgICAgfQorICAgIHYgPSAocEJ1ZltNVF9OIC0gMV0gJiBNVF9VcHBlcl9NYXNrKSB8IChwQnVmWzBdICYgTVRfTG93ZXJfTWFzayk7CisgICAgcEJ1ZltNVF9OIC0gMV0gPSBwQnVmW01UX00gLSAxXSBeICh2ID4+IDEpIF4gbWFnW3YgJiAxXTsKKyAgICBtdGkgPSAwOworICB9CisgIHYgPSBwQnVmW210aSsrXTsKKyAgdiBePSAodiA+PiAxMSk7CisgIHYgXj0gKHYgPDwgNykgJiAweDlkMmM1NjgwVUw7CisgIHYgXj0gKHYgPDwgMTUpICYgMHhlZmM2MDAwMFVMOworICB2IF49ICh2ID4+IDE4KTsKKyAgcmV0dXJuIHY7Cit9Cit2b2lkIEZYX1JhbmRvbV9NVF9DbG9zZSh2b2lkKiBwQ29udGV4dCkgeworICBGWFNZU19hc3NlcnQocENvbnRleHQpOworICBGWF9GcmVlKHBDb250ZXh0KTsKK30KK3ZvaWQgRlhfUmFuZG9tX0dlbmVyYXRlTVQoRlhfRFdPUkQqIHBCdWZmZXIsIGludDMyX3QgaUNvdW50KSB7CisgIEZYX0RXT1JEIGR3U2VlZDsKICNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0gICAgaWYgKCFGWF9HZW5lcmF0ZUNyeXB0b1JhbmRvbSgmZHdTZWVkLCAxKSkgewotICAgICAgICBGWF9SYW5kb21fR2VuZXJhdGVCYXNlKCZkd1NlZWQsIDEpOwotICAgIH0KLSNlbHNlCisgIGlmICghRlhfR2VuZXJhdGVDcnlwdG9SYW5kb20oJmR3U2VlZCwgMSkpIHsKICAgICBGWF9SYW5kb21fR2VuZXJhdGVCYXNlKCZkd1NlZWQsIDEpOwotI2VuZGlmCi0gICAgRlhfTFBWT0lEIHBDb250ZXh0ID0gRlhfUmFuZG9tX01UX1N0YXJ0KGR3U2VlZCk7Ci0gICAgd2hpbGUgKGlDb3VudCAtLSA+IDApIHsKLSAgICAgICAgKnBCdWZmZXIgKysgPSBGWF9SYW5kb21fTVRfR2VuZXJhdGUocENvbnRleHQpOwotICAgIH0KLSAgICBGWF9SYW5kb21fTVRfQ2xvc2UocENvbnRleHQpOwotfQotdm9pZCBGWF9SYW5kb21fR2VuZXJhdGVCYXNlKEZYX0xQRFdPUkQgcEJ1ZmZlciwgRlhfSU5UMzIgaUNvdW50KQotewotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgICBTWVNURU1USU1FIHN0MSwgc3QyOwotICAgIDo6R2V0U3lzdGVtVGltZSgmc3QxKTsKLSAgICBkbyB7Ci0gICAgICAgIDo6R2V0U3lzdGVtVGltZSgmc3QyKTsKLSAgICB9IHdoaWxlIChGWFNZU19tZW1jbXAzMigmc3QxLCAmc3QyLCBzaXplb2YoU1lTVEVNVElNRSkpID09IDApOwotICAgIEZYX0RXT1JEIGR3SGFzaDEgPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0QSgoRlhfTFBDU1RSKSZzdDEsIHNpemVvZihzdDEpLCBUUlVFKTsKLSAgICBGWF9EV09SRCBkd0hhc2gyID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldEEoKEZYX0xQQ1NUUikmc3QyLCBzaXplb2Yoc3QyKSwgVFJVRSk7Ci0gICAgOjpzcmFuZCgoZHdIYXNoMSA8PCAxNikgfCAoRlhfRFdPUkQpZHdIYXNoMik7CisgIH0KICNlbHNlCi0gICAgdGltZV90IHRtTGFzdCA9IHRpbWUoTlVMTCksIHRtQ3VyOwotICAgIHdoaWxlICgodG1DdXIgPSB0aW1lKE5VTEwpKSA9PSB0bUxhc3QpOwotICAgIDo6c3JhbmQoKHRtQ3VyIDw8IDE2KSB8ICh0bUxhc3QgJiAweEZGRkYpKTsKKyAgRlhfUmFuZG9tX0dlbmVyYXRlQmFzZSgmZHdTZWVkLCAxKTsKICNlbmRpZgotICAgIHdoaWxlIChpQ291bnQgLS0gPiAwKSB7Ci0gICAgICAgICpwQnVmZmVyICsrID0gKEZYX0RXT1JEKSgoOjpyYW5kKCkgPDwgMTYpIHwgKDo6cmFuZCgpICYgMHhGRkZGKSk7Ci0gICAgfQorICB2b2lkKiBwQ29udGV4dCA9IEZYX1JhbmRvbV9NVF9TdGFydChkd1NlZWQpOworICB3aGlsZSAoaUNvdW50LS0gPiAwKSB7CisgICAgKnBCdWZmZXIrKyA9IEZYX1JhbmRvbV9NVF9HZW5lcmF0ZShwQ29udGV4dCk7CisgIH0KKyAgRlhfUmFuZG9tX01UX0Nsb3NlKHBDb250ZXh0KTsKIH0KK3ZvaWQgRlhfUmFuZG9tX0dlbmVyYXRlQmFzZShGWF9EV09SRCogcEJ1ZmZlciwgaW50MzJfdCBpQ291bnQpIHsKICNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi1GWF9CT09MIEZYX0dlbmVyYXRlQ3J5cHRvUmFuZG9tKEZYX0xQRFdPUkQgcEJ1ZmZlciwgRlhfSU5UMzIgaUNvdW50KQotewotICAgIEhDUllQVFBST1YgaENQID0gTlVMTDsKLSAgICBpZiAoITo6Q3J5cHRBY3F1aXJlQ29udGV4dCgmaENQLCBOVUxMLCBOVUxMLCBQUk9WX1JTQV9GVUxMLCAwKSB8fCBoQ1AgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIDo6Q3J5cHRHZW5SYW5kb20oaENQLCBpQ291bnQgKiBzaXplb2YoRlhfRFdPUkQpLCAoRlhfTFBCWVRFKXBCdWZmZXIpOwotICAgIDo6Q3J5cHRSZWxlYXNlQ29udGV4dChoQ1AsIDApOwotICAgIHJldHVybiBUUlVFOwotfQotI2VuZGlmCi12b2lkIEZYX1JhbmRvbV9HZW5lcmF0ZUNyeXB0byhGWF9MUERXT1JEIHBCdWZmZXIsIEZYX0lOVDMyIGlDb3VudCkKLXsKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0gICAgRlhfR2VuZXJhdGVDcnlwdG9SYW5kb20ocEJ1ZmZlciwgaUNvdW50KTsKKyAgU1lTVEVNVElNRSBzdDEsIHN0MjsKKyAgOjpHZXRTeXN0ZW1UaW1lKCZzdDEpOworICBkbyB7CisgICAgOjpHZXRTeXN0ZW1UaW1lKCZzdDIpOworICB9IHdoaWxlIChGWFNZU19tZW1jbXAoJnN0MSwgJnN0Miwgc2l6ZW9mKFNZU1RFTVRJTUUpKSA9PSAwKTsKKyAgRlhfRFdPUkQgZHdIYXNoMSA9CisgICAgICBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0QSgoY29uc3QgRlhfQ0hBUiopJnN0MSwgc2l6ZW9mKHN0MSksIFRSVUUpOworICBGWF9EV09SRCBkd0hhc2gyID0KKyAgICAgIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRBKChjb25zdCBGWF9DSEFSKikmc3QyLCBzaXplb2Yoc3QyKSwgVFJVRSk7CisgIDo6c3JhbmQoKGR3SGFzaDEgPDwgMTYpIHwgKEZYX0RXT1JEKWR3SGFzaDIpOwogI2Vsc2UKLSAgICBGWF9SYW5kb21fR2VuZXJhdGVCYXNlKHBCdWZmZXIsIGlDb3VudCk7CisgIHRpbWVfdCB0bUxhc3QgPSB0aW1lKE5VTEwpLCB0bUN1cjsKKyAgd2hpbGUgKCh0bUN1ciA9IHRpbWUoTlVMTCkpID09IHRtTGFzdCkKKyAgICA7CisgIDo6c3JhbmQoKHRtQ3VyIDw8IDE2KSB8ICh0bUxhc3QgJiAweEZGRkYpKTsKICNlbmRpZgorICB3aGlsZSAoaUNvdW50LS0gPiAwKSB7CisgICAgKnBCdWZmZXIrKyA9IChGWF9EV09SRCkoKDo6cmFuZCgpIDw8IDE2KSB8ICg6OnJhbmQoKSAmIDB4RkZGRikpOworICB9CiB9Ci0jaWZkZWYgX19jcGx1c3BsdXMKKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCitGWF9CT09MIEZYX0dlbmVyYXRlQ3J5cHRvUmFuZG9tKEZYX0RXT1JEKiBwQnVmZmVyLCBpbnQzMl90IGlDb3VudCkgeworICBIQ1JZUFRQUk9WIGhDUCA9IE5VTEw7CisgIGlmICghOjpDcnlwdEFjcXVpcmVDb250ZXh0KCZoQ1AsIE5VTEwsIE5VTEwsIFBST1ZfUlNBX0ZVTEwsIDApIHx8ICFoQ1ApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgOjpDcnlwdEdlblJhbmRvbShoQ1AsIGlDb3VudCAqIHNpemVvZihGWF9EV09SRCksICh1aW50OF90KilwQnVmZmVyKTsKKyAgOjpDcnlwdFJlbGVhc2VDb250ZXh0KGhDUCwgMCk7CisgIHJldHVybiBUUlVFOwogfQogI2VuZGlmCit2b2lkIEZYX1JhbmRvbV9HZW5lcmF0ZUNyeXB0byhGWF9EV09SRCogcEJ1ZmZlciwgaW50MzJfdCBpQ291bnQpIHsKKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisgIEZYX0dlbmVyYXRlQ3J5cHRvUmFuZG9tKHBCdWZmZXIsIGlDb3VudCk7CisjZWxzZQorICBGWF9SYW5kb21fR2VuZXJhdGVCYXNlKHBCdWZmZXIsIGlDb3VudCk7CisjZW5kaWYKK30KKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCit2b2lkIEZYX0dVSURfQ3JlYXRlVjQoRlhfTFBHVUlEIHBHVUlEKSB7CisjaWYgKF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjMyX01PQklMRV8gfHwgXAorICAgICBfRlhfT1NfID09IF9GWF9XSU42NF8pCisjaWZkZWYgX0ZYX1dJTkFQSV9QQVJUSVRJT05fREVTS1RPUF8KKyAgaWYgKCFGWF9HZW5lcmF0ZUNyeXB0b1JhbmRvbSgoRlhfRFdPUkQqKXBHVUlELCA0KSkgeworICAgIEZYX1JhbmRvbV9HZW5lcmF0ZU1UKChGWF9EV09SRCopcEdVSUQsIDQpOworICB9CisjZWxzZQorICBGWF9SYW5kb21fR2VuZXJhdGVNVCgoRlhfRFdPUkQqKXBHVUlELCA0KTsKKyNlbmRpZgorI2Vsc2UKKyAgRlhfUmFuZG9tX0dlbmVyYXRlTVQoKEZYX0RXT1JEKilwR1VJRCwgNCk7CisjZW5kaWYKKyAgdWludDhfdCYgYiA9ICgodWludDhfdCopcEdVSUQpWzZdOworICBiID0gKGIgJiAweDBGKSB8IDB4NDA7Cit9Citjb25zdCBGWF9DSEFSKiBnc19GWF9wSGV4Q2hhcnMgPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7Cit2b2lkIEZYX0dVSURfVG9TdHJpbmcoRlhfTFBDR1VJRCBwR1VJRCwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgYnNTdHIsCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2VwYXJhdG9yKSB7CisgIEZYX0NIQVIqIHBCdWYgPSBic1N0ci5HZXRCdWZmZXIoNDApOworICB1aW50OF90IGI7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICBiID0gKChjb25zdCB1aW50OF90KilwR1VJRClbaV07CisgICAgKnBCdWYrKyA9IGdzX0ZYX3BIZXhDaGFyc1tiID4+IDRdOworICAgICpwQnVmKysgPSBnc19GWF9wSGV4Q2hhcnNbYiAmIDB4MEZdOworICAgIGlmIChiU2VwYXJhdG9yICYmIChpID09IDMgfHwgaSA9PSA1IHx8IGkgPT0gNyB8fCBpID09IDkpKSB7CisgICAgICAqcEJ1ZisrID0gTCctJzsKKyAgICB9CisgIH0KKyAgYnNTdHIuUmVsZWFzZUJ1ZmZlcihiU2VwYXJhdG9yID8gMzYgOiAzMik7Cit9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9leHRlbnNpb25fdW5pdHRlc3QuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfZXh0ZW5zaW9uX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTJkY2JlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfZXh0ZW5zaW9uX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9leHQuaCIKKworVEVTVChmeGNydCwgRlhTWVNfdG9IZXhEaWdpdCkgeworICBFWFBFQ1RfRVEoMTAsIEZYU1lTX3RvSGV4RGlnaXQoJ2EnKSk7CisgIEVYUEVDVF9FUSgxMCwgRlhTWVNfdG9IZXhEaWdpdCgnQScpKTsKKyAgRVhQRUNUX0VRKDcsIEZYU1lTX3RvSGV4RGlnaXQoJzcnKSk7CisgIEVYUEVDVF9FUSgwLCBGWFNZU190b0hleERpZ2l0KCdpJykpOworfQorCitURVNUKGZ4Y3J0LCBGWFNZU190b0RlY2ltYWxEaWdpdCkgeworICBFWFBFQ1RfRVEoNywgRlhTWVNfdG9EZWNpbWFsRGlnaXQoJzcnKSk7CisgIEVYUEVDVF9FUSgwLCBGWFNZU190b0RlY2ltYWxEaWdpdCgnYScpKTsKK30KKworVEVTVChmeGNydCwgRlhTWVNfdG9EZWNpbWFsRGlnaXRXaWRlKSB7CisgIEVYUEVDVF9FUSg3LCBGWFNZU190b0RlY2ltYWxEaWdpdFdpZGUoTCc3JykpOworICBFWFBFQ1RfRVEoMCwgRlhTWVNfdG9EZWNpbWFsRGlnaXRXaWRlKEwnYScpKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVhOTA2Yy4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGNydC9meF9zYWZlX3R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpZm5kZWYgQ09SRV9TUkNfRlhDUlRfRlhfU0FGRV9UWVBFU19IXwotI2RlZmluZSBDT1JFX1NSQ19GWENSVF9GWF9TQUZFX1RZUEVTX0hfCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4gIC8vIEZvciBzaXplX3QuCi0KLSNpbmNsdWRlICIuLi8uLi8uLi90aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfbWF0aC5oIgotCi10eXBlZGVmIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8RlhfRFdPUkQ+IEZYX1NBRkVfRFdPUkQ7Ci10eXBlZGVmIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8RlhfSU5UMzI+IEZYX1NBRkVfSU5UMzI7Ci10eXBlZGVmIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8c2l6ZV90PiBGWF9TQUZFX1NJWkVfVDsKLXR5cGVkZWYgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxGWF9GSUxFU0laRT4gRlhfU0FGRV9GSUxFU0laRTsKLQotI2VuZGlmICAvLyBDT1JFX1NSQ19GWENSVF9GWF9TQUZFX1RZUEVTX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF9zeXN0ZW1fdW5pdHRlc3QuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfc3lzdGVtX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWY0Y2M2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfc3lzdGVtX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDE2MSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgInRlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKKy8vIFVuaXQgdGVzdCBjb3ZlcmluZyBjYXNlcyB3aGVyZSBQREZpdW0gcmVwbGFjZXMgd2VsbC1rbm93biBsaWJyYXJ5CisvLyBmdW5jdGlvbmFsaXR5IG9uIGFueSBnaXZlbiBwbGF0Zm9ybW4uCisKKyNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IEZYX0NIQVIga1NlbnRpbmVsID0gMHg3ZjsKKwordm9pZCBDaGVjazMyQml0QmFzZTE2SXRvYShpbnQzMl90IGlucHV0LCBjb25zdCBjaGFyKiBleHBlY3RlZF9vdXRwdXQpIHsKKyAgY29uc3Qgc2l6ZV90IGtCdWZMZW4gPSAxMTsgIC8vICItIiArIDggZGlnaXRzICsgTlVMICsgc2VudGluZWwuCisgIEZYX0NIQVIgYnVmW2tCdWZMZW5dOworICBidWZba0J1ZkxlbiAtIDFdID0ga1NlbnRpbmVsOworICBGWFNZU19pdG9hKGlucHV0LCBidWYsIDE2KTsKKyAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKGV4cGVjdGVkX291dHB1dCksIGJ1Zik7CisgIEVYUEVDVF9FUShrU2VudGluZWwsIGJ1ZltrQnVmTGVuIC0gMV0pOworfQorCit2b2lkIENoZWNrMzJCaXRCYXNlMTBJdG9hKGludDMyX3QgaW5wdXQsIGNvbnN0IGNoYXIqIGV4cGVjdGVkX291dHB1dCkgeworICBjb25zdCBzaXplX3Qga0J1ZkxlbiA9IDEzOyAgLy8gIi0iICsgMTAgZGlnaXRzICsgTlVMICsgc2VudGluZWwuCisgIEZYX0NIQVIgYnVmW2tCdWZMZW5dOworICBidWZba0J1ZkxlbiAtIDFdID0ga1NlbnRpbmVsOworICBGWFNZU19pdG9hKGlucHV0LCBidWYsIDEwKTsKKyAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKGV4cGVjdGVkX291dHB1dCksIGJ1Zik7CisgIEVYUEVDVF9FUShrU2VudGluZWwsIGJ1ZltrQnVmTGVuIC0gMV0pOworfQorCit2b2lkIENoZWNrMzJCaXRCYXNlMkl0b2EoaW50MzJfdCBpbnB1dCwgY29uc3QgY2hhciogZXhwZWN0ZWRfb3V0cHV0KSB7CisgIGNvbnN0IHNpemVfdCBrQnVmTGVuID0gMzU7ICAvLyAiLSIgKyAzMiBkaWdpdHMgKyBOVUwgKyBzZW50aW5lbC4KKyAgRlhfQ0hBUiBidWZba0J1Zkxlbl07CisgIGJ1ZltrQnVmTGVuIC0gMV0gPSBrU2VudGluZWw7CisgIEZYU1lTX2l0b2EoaW5wdXQsIGJ1ZiwgMik7CisgIEVYUEVDVF9FUShzdGQ6OnN0cmluZyhleHBlY3RlZF9vdXRwdXQpLCBidWYpOworICBFWFBFQ1RfRVEoa1NlbnRpbmVsLCBidWZba0J1ZkxlbiAtIDFdKTsKK30KKwordm9pZCBDaGVjazY0Qml0QmFzZTE2SXRvYShpbnQ2NF90IGlucHV0LCBjb25zdCBjaGFyKiBleHBlY3RlZF9vdXRwdXQpIHsKKyAgY29uc3Qgc2l6ZV90IGtCdWZMZW4gPSAxOTsgIC8vICItIiArIDE2IGRpZ2l0cyArIE5VTCArIHNlbnRpbmVsLgorICBGWF9DSEFSIGJ1ZltrQnVmTGVuXTsKKyAgYnVmW2tCdWZMZW4gLSAxXSA9IGtTZW50aW5lbDsKKyAgRlhTWVNfaTY0dG9hKGlucHV0LCBidWYsIDE2KTsKKyAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKGV4cGVjdGVkX291dHB1dCksIGJ1Zik7CisgIEVYUEVDVF9FUShrU2VudGluZWwsIGJ1ZltrQnVmTGVuIC0gMV0pOworfQorCit2b2lkIENoZWNrNjRCaXRCYXNlMTBJdG9hKGludDY0X3QgaW5wdXQsIGNvbnN0IGNoYXIqIGV4cGVjdGVkX291dHB1dCkgeworICBjb25zdCBzaXplX3Qga0J1ZkxlbiA9IDIyOyAgLy8gIi0iICsgMTkgZGlnaXRzICsgTlVMICsgc2VudGluZWwuCisgIEZYX0NIQVIgYnVmW2tCdWZMZW5dOworICBidWZba0J1ZkxlbiAtIDFdID0ga1NlbnRpbmVsOworICBGWFNZU19pNjR0b2EoaW5wdXQsIGJ1ZiwgMTApOworICBFWFBFQ1RfRVEoc3RkOjpzdHJpbmcoZXhwZWN0ZWRfb3V0cHV0KSwgYnVmKTsKKyAgRVhQRUNUX0VRKGtTZW50aW5lbCwgYnVmW2tCdWZMZW4gLSAxXSk7Cit9CisKK3ZvaWQgQ2hlY2s2NEJpdEJhc2UySXRvYShpbnQ2NF90IGlucHV0LCBjb25zdCBjaGFyKiBleHBlY3RlZF9vdXRwdXQpIHsKKyAgY29uc3Qgc2l6ZV90IGtCdWZMZW4gPSA2NzsgIC8vICItIiArIDY0IGRpZ2l0cyArIE5VTCArIHNlbnRpbmVsLgorICBGWF9DSEFSIGJ1ZltrQnVmTGVuXTsKKyAgYnVmW2tCdWZMZW4gLSAxXSA9IGtTZW50aW5lbDsKKyAgRlhTWVNfaTY0dG9hKGlucHV0LCBidWYsIDIpOworICBFWFBFQ1RfRVEoc3RkOjpzdHJpbmcoZXhwZWN0ZWRfb3V0cHV0KSwgYnVmKTsKKyAgRVhQRUNUX0VRKGtTZW50aW5lbCwgYnVmW2tCdWZMZW4gLSAxXSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitURVNUKGZ4Y3J0LCBGWFNZU19pdG9hX0ludmFsaWRSYWRpeCkgeworICBGWF9DSEFSIGJ1ZlszMl07CisKKyAgRlhTWVNfaXRvYSg0MiwgYnVmLCAxNyk7ICAvLyBPdXJzIHN0b3BzIGF0IDE2LgorICBFWFBFQ1RfRVEoc3RkOjpzdHJpbmcoIiIpLCBidWYpOworCisgIEZYU1lTX2l0b2EoNDIsIGJ1ZiwgMSk7CisgIEVYUEVDVF9FUShzdGQ6OnN0cmluZygiIiksIGJ1Zik7CisKKyAgRlhTWVNfaXRvYSg0MiwgYnVmLCAwKTsKKyAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKCIiKSwgYnVmKTsKKworICBGWFNZU19pdG9hKDQyLCBidWYsIC0xKTsKKyAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKCIiKSwgYnVmKTsKK30KKworVEVTVChmeGNydCwgRlhTWVNfaXRvYSkgeworICBDaGVjazMyQml0QmFzZTE2SXRvYShzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptaW4oKSwgIi04MDAwMDAwMCIpOworICBDaGVjazMyQml0QmFzZTEwSXRvYShzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptaW4oKSwgIi0yMTQ3NDgzNjQ4Iik7CisgIENoZWNrMzJCaXRCYXNlMkl0b2Eoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKCksCisgICAgICAgICAgICAgICAgICAgICAgIi0xMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIpOworCisgIENoZWNrMzJCaXRCYXNlMTZJdG9hKC0xLCAiLTEiKTsKKyAgQ2hlY2szMkJpdEJhc2UxMEl0b2EoLTEsICItMSIpOworICBDaGVjazMyQml0QmFzZTJJdG9hKC0xLCAiLTEiKTsKKworICBDaGVjazMyQml0QmFzZTE2SXRvYSgwLCAiMCIpOworICBDaGVjazMyQml0QmFzZTEwSXRvYSgwLCAiMCIpOworICBDaGVjazMyQml0QmFzZTJJdG9hKDAsICIwIik7CisKKyAgQ2hlY2szMkJpdEJhc2UxNkl0b2EoNDIsICIyYSIpOworICBDaGVjazMyQml0QmFzZTEwSXRvYSg0MiwgIjQyIik7CisgIENoZWNrMzJCaXRCYXNlMkl0b2EoNDIsICIxMDEwMTAiKTsKKworICBDaGVjazMyQml0QmFzZTE2SXRvYShzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgoKSwgIjdmZmZmZmZmIik7CisgIENoZWNrMzJCaXRCYXNlMTBJdG9hKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCgpLCAiMjE0NzQ4MzY0NyIpOworICBDaGVjazMyQml0QmFzZTJJdG9hKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCgpLAorICAgICAgICAgICAgICAgICAgICAgICIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIik7Cit9CisKK1RFU1QoZnhjcnQsIEZYU1lTX2k2NHRvYV9JbnZhbGlkUmFkaXgpIHsKKyAgRlhfQ0hBUiBidWZbMzJdOworCisgIEZYU1lTX2k2NHRvYSg0MiwgYnVmLCAxNyk7ICAvLyBPdXJzIHN0b3BzIGF0IDE2LgorICBFWFBFQ1RfRVEoc3RkOjpzdHJpbmcoIiIpLCBidWYpOworCisgIEZYU1lTX2k2NHRvYSg0MiwgYnVmLCAxKTsKKyAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKCIiKSwgYnVmKTsKKworICBGWFNZU19pNjR0b2EoNDIsIGJ1ZiwgMCk7CisgIEVYUEVDVF9FUShzdGQ6OnN0cmluZygiIiksIGJ1Zik7CisKKyAgRlhTWVNfaTY0dG9hKDQyLCBidWYsIC0xKTsKKyAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKCIiKSwgYnVmKTsKK307CisKK1RFU1QoZnhjcnQsIEZYU1lTX2k2NHRvYSkgeworICBDaGVjazY0Qml0QmFzZTE2SXRvYShzdGQ6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIi04MDAwMDAwMDAwMDAwMDAwIik7CisgIENoZWNrNjRCaXRCYXNlMTBJdG9hKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbigpLAorICAgICAgICAgICAgICAgICAgICAgICAiLTkyMjMzNzIwMzY4NTQ3NzU4MDgiKTsKKyAgQ2hlY2s2NEJpdEJhc2UySXRvYSgKKyAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbigpLAorICAgICAgIi0xMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIik7CisKKyAgQ2hlY2s2NEJpdEJhc2UxNkl0b2EoLTEsICItMSIpOworICBDaGVjazY0Qml0QmFzZTEwSXRvYSgtMSwgIi0xIik7CisgIENoZWNrNjRCaXRCYXNlMkl0b2EoLTEsICItMSIpOworCisgIENoZWNrNjRCaXRCYXNlMTZJdG9hKDAsICIwIik7CisgIENoZWNrNjRCaXRCYXNlMTBJdG9hKDAsICIwIik7CisgIENoZWNrNjRCaXRCYXNlMkl0b2EoMCwgIjAiKTsKKworICBDaGVjazY0Qml0QmFzZTE2SXRvYSg0MiwgIjJhIik7CisgIENoZWNrNjRCaXRCYXNlMTBJdG9hKDQyLCAiNDIiKTsKKyAgQ2hlY2s2NEJpdEJhc2UySXRvYSg0MiwgIjEwMTAxMCIpOworCisgIENoZWNrNjRCaXRCYXNlMTZJdG9hKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCgpLCAiN2ZmZmZmZmZmZmZmZmZmZiIpOworICBDaGVjazY0Qml0QmFzZTEwSXRvYShzdGQ6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptYXgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIjkyMjMzNzIwMzY4NTQ3NzU4MDciKTsKKyAgQ2hlY2s2NEJpdEJhc2UySXRvYSgKKyAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCgpLAorICAgICAgIjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSIpOworfQorCisjZW5kaWYgIC8vIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X3VjZGRhdGEuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhfdWNkZGF0YS5jcHAKaW5kZXggOGVhMzQzZi4uYzM3M2Q2ZSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhfdWNkZGF0YS5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfdWNkZGF0YS5jcHAKQEAgLTEsNDE0NSArMSwxMTAxMyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGNydC9meF9leHQuaCIKLWV4dGVybiBjb25zdCBGWF9EV09SRCBnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWzY1NTM2XSA9IHsKLSAgICAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU4YWU1LCAweGZmZmU5YjVjLCAweGZmZmU5YWRhLCAweGZmZmU5YjFhLCAweGZmZmU5YjViLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLAotICAgIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTliNTMsIDB4ZmZmZTliNTMsIDB4ZmZmZTliNTMsIDB4ZmZmZTlhZDMsCi0gICAgMHhmZmZlOTMyMywgMHhmZmZlYjAwNSwgMHhmZmZlYjAwMiwgMHhmZmZlYjI0YiwgMHhmZmZlYjI0OCwgMHhmZmZlYjI0OSwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwMiwgMHgwMDdlYjAwMCwgMHgwMGZlYjAwMSwgMHhmZmZlYjAwYiwgMHhmZmZlYjIwOCwgMHhmZmZlYjFjNywgMHhmZmZlYjIwZSwgMHhmZmZlYjFjNywgMHhmZmZlYjFjNiwKLSAgICAweGZmZmVhOTBhLCAweGZmZmVhOTBhLCAweGZmZmVhOTBhLCAweGZmZmVhOTBhLCAweGZmZmVhOTBhLCAweGZmZmVhOTBhLCAweGZmZmVhOTBhLCAweGZmZmVhOTBhLCAweGZmZmVhOTBhLCAweGZmZmVhOTBhLCAweGZmZmViMWM3LCAweGZmZmViMDA3LCAweDAxN2ViMDAwLCAweGZmZmViMDBiLCAweDAxZmViMDAxLCAweGZmZmViMDA1LAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHgwMjdlYjAwMCwgMHhmZmZlYjAwOCwgMHgwMmZlYjAwMSwgMHhmZmZlYjAwYiwgMHhmZjgwYjAwYiwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4MDM3ZWIwMDAsIDB4ZmZmZWIwMGYsIDB4MDNmZWIwMDEsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIyOTMsCi0gICAgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjM1ZCwgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywKLSAgICAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLAotICAgIDB4ZmZmZTkxYzMsIDB4ZmZmZWIwMDAsIDB4ZmZmZWIyNDksIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDgsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNjIsIDB4MDQ3ZWIwMDAsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIyOGYsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjI0OSwgMHhmZmZlYjI0OCwgMHhmZmZlYjEyMiwgMHhmZmZlYjEyMiwgMHhmZmZlYjAxMCwgMHhmZmZlYjA0YiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjEyMiwgMHhmZmZlYjA2MiwgMHgwNGZlYjAwMSwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwMCwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDIyLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAxMCwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAxMCwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDYyLCAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDEwLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExODMsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE4MywgMHhmZmZlYTE4MywgMHhmZmZlYTE4MywgMHhmZmZlYTE4MywKLSAgICAweGZmZmVhMTgzLCAweGZmZmVhMTgzLCAweGZmZmVhMTgzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMDcsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMTkzLCAweGZmZmViMTkzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNDcsIDB4ZmZmZWIwMGYsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODBhNCwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwOGYsIDB4ZmZmZWExOTMsCi0gICAgMHhmZmZlYjA4YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA4YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA4NSwgMHhmZmZlYTE5MywgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKLSAgICAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLAotICAgIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCi0gICAgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKLSAgICAweGZmZmVkMGNiLCAweGZmZmVkMGNiLCAweGZmZmVkMGNiLCAweGZmZmVkMGNiLCAweGZmZmVkMTY0LCAweGZmZmVkMTY0LCAweGZmZmVkMDBiLCAweGZmZmVkMDBiLCAweGZmZmVkMTRiLCAweGZmZmVkMjQ5LCAweGZmZmVkMjQ5LCAweGZmZmVkMTQ5LCAweGZmZmVkMWM3LCAweGZmZmVkMTQ3LCAweGZmZmVkMDBiLCAweGZmZmVkMDBiLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWQxNDUsIDB4ZmZmZWQxNjQsIDB4ZmZmZWQxNjQsIDB4ZmZmZWQxNDUsIDB4ZmZmZWQxNDUsCi0gICAgMHhmZmZlZDE2NCwgMHhmZmZlZDE0YiwgMHhmZmZlYjk0YiwgMHhmZmZlYjk0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYjk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYjk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzE0YiwKLSAgICAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLAotICAgIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlZDE2NCwKLSAgICAweGZmZmVkMGNhLCAweGZmZmVkMGNhLCAweGZmZmVkMGNhLCAweGZmZmVkMGNhLCAweGZmZmVkMGNhLCAweGZmZmVkMGNhLCAweGZmZmVkMGNhLCAweGZmZmVkMGNhLCAweGZmZmVkMGNhLCAweGZmZmVkMGNhLCAweGZmZmVkMjQ5LCAweGZmZmVkMGNhLCAweGZmZmVkMGNhLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWExNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsCi0gICAgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwKLSAgICAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLAotICAgIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsCi0gICAgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwKLSAgICAweGZmZmVjMTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjOTRiLCAweGZmZmVjMTRiLCAweGZmZmVjOTRiLCAweGZmZmVjMTRiLAotICAgIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWM5NDUsIDB4ZmZmZWMxNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWQwY2IsIDB4ZmZmZWQxOTMsIDB4ZmZmZWExOTMsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlZDAwYiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwKLSAgICAweGZmZmVkMTBhLCAweGZmZmVkMTBhLCAweGZmZmVkMTBhLCAweGZmZmVkMTBhLCAweGZmZmVkMTBhLCAweGZmZmVkMTBhLCAweGZmZmVkMTBhLCAweGZmZmVkMTBhLCAweGZmZmVkMTBhLCAweGZmZmVkMTBhLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLAotICAgIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZTgxNjQsIDB4ZmZmZWIyOGIsCi0gICAgMHhmZmZlYjE0YiwgMHhmZmZlYTE5MywgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwKLSAgICAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODE2NCwgMHhmZmZlODE2NCwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwKLSAgICAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLAotICAgIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsCi0gICAgMHhmZmZlZDE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwKLSAgICAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLAotICAgIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsCi0gICAgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKLSAgICAweGZmZmVhMTkzLCAweGZmZmViMTRiLCAweGZmZmU4MTY0LCAweGZmZmU4MTY0LCAweGZmZmU4MTY0LCAweGZmZmU4MTY0LCAweGZmZmU4MTY0LCAweGZmZmU4MTY0LCAweGZmZmU4MTY0LCAweGZmZmU4MTY0LCAweGZmZmU4MTY0LCAweGZmZmU4MTY0LCAweGZmZmU4MTY0LCAweGZmZmU4MTY0LCAweGZmZmU4MTY0LCAweGZmZmU4MTY0LAotICAgIDB4ZmZmZWIwOGEsIDB4ZmZmZWIwOGEsIDB4ZmZmZWIwOGEsIDB4ZmZmZWIwOGEsIDB4ZmZmZWIwOGEsIDB4ZmZmZWIwOGEsIDB4ZmZmZWIwOGEsIDB4ZmZmZWIwOGEsIDB4ZmZmZWIwOGEsIDB4ZmZmZWIwOGEsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsCi0gICAgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwKLSAgICAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMDcsIDB4ZmZmZWIwMDUsIDB4ZmZmZWIwOGIsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCi0gICAgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwKLSAgICAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDhiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwOGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwOGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCi0gICAgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlODBhNCwKLSAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAotICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCi0gICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKLSAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAotICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCi0gICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKLSAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAotICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCi0gICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKLSAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAotICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCi0gICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmViMDUzLCAweGZmZmViMDUzLAotICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywKLSAgICAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMjQ5LCAweGZmZmViMjQ5LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDQ5LCAweGZmZmViMDRiLCAweGZmZmViMjQ4LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsCi0gICAgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmViMDUzLCAweGZmZmViMDUzLAotICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIyNDgsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywKLSAgICAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjI0OCwgMHhmZmZlYjAwYiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA1MywgMHhmZmZlYTA1MywKLSAgICAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmVhMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKLSAgICAweGZmZmU4MDI0LCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsCi0gICAgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0OSwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsCi0gICAgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKLSAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAotICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjI0OCwKLSAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlODAyNCwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKLSAgICAweGZmZmU4MDI0LCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmU4MDI0LCAweGZmZmViMDVlLCAweGZmZmU4MDI0LCAweGZmZmViMDVlLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmU4MDI0LCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAotICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlODAyNCwgMHhmZmZlYjA1ZSwgMHhmZmZlODAyNCwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDUwLCAweGZmZmViMDUwLCAweGZmZmViMDUwLCAweGZmZmViMDUwLCAweGZmZmViMDRiLCAweGZmZmViMDUwLCAweGZmZmViMDUwLCAweGZmZmViMDQzLCAweGZmZmViMDUwLCAweGZmZmViMDUwLCAweGZmZmViMDRmLCAweGZmZmViMDQzLCAweGZmZmViMDQ1LCAweGZmZmViMDQ1LCAweGZmZmViMDQ1LAotICAgIDB4ZmZmZWIwNDUsIDB4ZmZmZWIwNDUsIDB4ZmZmZWIwNDMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNDUsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRmLCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweDA1N2ViMDAwLCAweDA1ZmViMDAxLCAweDA2N2ViMDAwLCAweDA2ZmViMDAxLCAweGZmZmViMDUzLCAweGZmZmViMDUzLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGYsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA0ZiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNTAsIDB4ZmZmZWIwNTAsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNTAsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKLSAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLAotICAgIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsCi0gICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmVhMTllLAotICAgIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKLSAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAotICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywKLSAgICAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LAotICAgIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsCi0gICAgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywKLSAgICAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LAotICAgIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsCi0gICAgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwKLSAgICAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LAotICAgIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsCi0gICAgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwKLSAgICAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LAotICAgIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksCi0gICAgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwKLSAgICAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LAotICAgIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksCi0gICAgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjAwZiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMzBmLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4MDc3ZWIwMDAsIDB4MDdmZWIwMDEsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKLSAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAotICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwKLSAgICAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmViMDQ0LCAweGZmZmViMDVlLCAweGZmZmViMDRmLCAweGZmZmViMDRiLCAweGZmZmViMDRmLCAweGZmZmViMjQ4LCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDA1LCAweGZmZmViMDA1LCAweGZmZmViMDBmLCAweGZmZmViMDBmLCAweGZmZmViMDEwLCAweGZmZmViMDBiLCAweGZmZmViMDA1LCAweGZmZmViMDA1LCAweGZmZmViMDBiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMzAzLCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjAwNSwgMHhmZmZlYjAwNSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKLSAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAotICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAotICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAotICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjAxZSwgMHhmZmZlYjAxZSwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKLSAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAotICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYTE5ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKLSAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLAotICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLAotICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwKLSAgICAweGZmZmViMDRmLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsCi0gICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKLSAgICAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMTAsIDB4ZmZmZWIwMGIsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjMwZiwgMHhmZmZlYjMwZiwgMHhmZmZlYjMwZiwgMHhmZmZlYjMwZiwgMHhmZmZlYjMwZiwgMHhmZmZlYjMwZiwgMHhmZmZlYjMwZiwgMHhmZmZlYjMwMywgMHhmZmZlYjMwZiwgMHhmZmZlYjMwZiwgMHhmZmZlYjMwZiwgMHhmZmZlYjI5MiwgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywgMHhmZmZlOTg1MywgMHhmZmZlOTg5MywKLSAgICAweGZmZmViMDBmLCAweGZmZmViMDAzLCAweGZmZmViMDBmLCAweGZmODJiMDBmLCAweGZmODRiMDExLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweDA4MDZiMDAwLCAweDA4ODhiMDAyLCAweGZmZmViMDAwLCAweGZmZmViMDAyLCAweDA5MGFiMDAwLCAweDA5OGNiMDAxLCAweGZmZmViMDAwLCAweGZmZmViMDAyLAotICAgIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGQsIDB4ZmZmZWIwMGQsIDB4ZmZmZWIwMGQsIDB4ZmZmZWIwMGYsIDB4ZmZmZTliMWEsIDB4ZmZmZTliNWEsIDB4ZmZmZTljNTMsIDB4ZmZmZTliZDMsIDB4ZmZmZTljOTMsIDB4ZmZmZTljMTMsIDB4ZmZmZTliOTMsIDB4ZmZmZWIxYzMsCi0gICAgMHhmZmZlYjI0OSwgMHhmZmZlYjI0OSwgMHhmZmZlYjI0OSwgMHhmZmZlYjI0OSwgMHhmZmZlYjI0OSwgMHhmZmZlYjAwOSwgMHhmZmZlYjAwOSwgMHhmZmZlYjAwOSwgMHhmZmZlYjAwYiwgMHgwYTdlYjAwMCwgMHgwYWZlYjAwMSwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwNCwgMHhmZmZlYjAwNCwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMWM3LCAweDBiN2ViMDAwLCAweDBiZmViMDAxLCAweGZmZmViMDA0LCAweGZmZmViMDA0LCAweGZmZmViMDA0LCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIzMGYsCi0gICAgMHhmZmZlYjI5NCwgMHhmZmZlYjI4YiwgMHhmZmZlYjI4YiwgMHhmZmZlYjI4YiwgMHhmZmZlYjI4YiwgMHhmZmZlODJhNCwgMHhmZmZlODJhNCwgMHhmZmZlODJhNCwgMHhmZmZlODJhNCwgMHhmZmZlODJhNCwgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywKLSAgICAweGZmZmViMTBiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMTIyLCAweGZmZmViMTBiLCAweGZmZmViMTBiLCAweGZmZmViMTBiLCAweGZmZmViMTBiLCAweGZmZmViMTBiLCAweGZmZmViMjBiLCAweGZmZmViMjBiLCAweGZmZmViMDBiLCAweDBjN2ViMDAwLCAweDBjZmViMDAxLCAweGZmZmViMDYyLAotICAgIDB4ZmZmZWIxMGIsIDB4ZmZmZWIxMjIsIDB4ZmZmZWIxMjIsIDB4ZmZmZWIxMjIsIDB4ZmZmZWIxMjIsIDB4ZmZmZWIxMGIsIDB4ZmZmZWIxMGIsIDB4ZmZmZWIxMGIsIDB4ZmZmZWIxMGIsIDB4ZmZmZWIxMGIsIDB4ZmZmZWIyMGIsIDB4ZmZmZWIyMGIsIDB4ZmZmZWIwMGIsIDB4MGQ3ZWIwMDAsIDB4MGRmZWIwMDEsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ5LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LAotICAgIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDksIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDgsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMTkzLCAweGZmZmViMTkzLCAweGZmZmViMTkzLAotICAgIDB4ZmZmZWIxOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIxOTMsIDB4ZmZmZWIxOTMsIDB4ZmZmZWIxOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDA5LCAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDA5LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMDgsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA2MiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjI0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNjIsIDB4ZmZmZWIwNjIsIDB4ZmZmZWIwNjIsIDB4ZmZmZWIwNjIsIDB4ZmZmZWIwNjIsIDB4ZmZmZWIwNjIsIDB4ZmZmZWIwNjIsIDB4ZmZmZWIwNjIsIDB4ZmZmZWIwNjIsIDB4ZmZmZWIwNjIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAyMiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4MGU3ZWIwMjIsIDB4MGVmZWIwMGIsIDB4MGY3ZWIwMGIsIDB4MGZmZWIwMjIsIDB4MTA3ZWIwMGIsIDB4MTBmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjIwOCwgMHhmZmZlYjI0OCwgMHhmZmZlYjAwYiwgMHgxMTdlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwKLSAgICAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4MTFmZWIwMjIsIDB4MTI3ZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHgxMmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweDEzN2ViMDIyLCAweDEzZmViMDBiLCAweDE0N2ViMDBiLCAweDE0ZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4MTU3ZWIwMjIsIDB4MTVmZWIwMjIsIDB4MTY3ZWIwMjIsIDB4MTZmZWIwMjIsIDB4MTc3ZWIwMGIsIDB4MTdmZWIwMGIsIDB4MTg3ZWIwMjIsIDB4MThmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4MTk3ZWIwMjIsIDB4MTlmZWIwMjIsCi0gICAgMHgxYTdlYjAwYiwgMHgxYWZlYjAwYiwgMHgxYjdlYjAwYiwgMHgxYmZlYjAwYiwgMHgxYzdlYjAwYiwgMHgxY2ZlYjAwYiwgMHgxZDdlYjAwYiwgMHgxZGZlYjAwYiwgMHgxZTdlYjAwYiwgMHgxZWZlYjAwYiwgMHgxZjdlYjAwYiwgMHgxZmZlYjAwYiwgMHgyMDdlYjAwYiwgMHgyMGZlYjAwYiwgMHgyMTdlYjAwYiwgMHgyMWZlYjAwYiwKLSAgICAweDIyN2ViMDBiLCAweDIyZmViMDBiLCAweDIzN2ViMDIyLCAweDIzZmViMDIyLCAweDI0N2ViMDBiLCAweDI0ZmViMDBiLCAweDI1N2ViMDIyLCAweDI1ZmViMDIyLCAweDI2N2ViMDBiLCAweDI2ZmViMDBiLCAweDI3N2ViMDBiLCAweDI3ZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweDI4N2ViMDBiLAotICAgIDB4MjhmZWIwMGIsIDB4Mjk3ZWIwMGIsIDB4MjlmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4MmE3ZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHgyYWZlYjAwYiwgMHgyYjdlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHgyYmZlYjAwYiwgMHhmZmZlYjAwYiwgMHgyYzdlYjAwYiwgMHgyY2ZlYjAwYiwgMHhmZmZlYjAwYiwgMHgyZDdlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweDJkZmViMDBiLCAweDJlN2ViMDBiLCAweDJlZmViMDBiLCAweDJmN2ViMDBiLCAweDJmZmViMDBiLCAweDMwN2ViMDBiLCAweDMwZmViMDBiLCAweDMxN2ViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDIyLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4MzFmZWIwMGIsIDB4MzI3ZWIwMGIsIDB4MzJmZWIwMGIsIDB4MzM3ZWIwMGIsIDB4MzNmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHgzNDdlYjAwYiwgMHgzNGZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHgzNTdlYjAwYiwgMHgzNWZlYjAwYiwgMHgzNjdlYjAwYiwgMHgzNmZlYjAwYiwgMHgzNzdlYjAwYiwgMHgzN2ZlYjAwYiwgMHgzODdlYjAwYiwgMHgzOGZlYjAwYiwgMHgzOTdlYjAwYiwgMHgzOWZlYjAwYiwKLSAgICAweDNhN2ViMDBiLCAweDNhZmViMDBiLCAweDNiN2ViMDBiLCAweDNiZmViMDBiLCAweDNjN2ViMDBiLCAweDNjZmViMDBiLCAweDNkN2ViMDBiLCAweDNkZmViMDBiLCAweDNlN2ViMDBiLCAweDNlZmViMDBiLCAweDNmN2ViMDBiLCAweDNmZmViMDBiLCAweDQwN2ViMDBiLCAweDQwZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4NDE3ZWIwMGIsIDB4NDFmZWIwMGIsIDB4NDI3ZWIwMGIsIDB4NDJmZWIwMGIsIDB4NDM3ZWIwMGIsIDB4ZmZmZWIwMGIsIDB4NDNmZWIwMGIsIDB4NDQ3ZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4NDRmZWIwMGIsIDB4NDU3ZWIwMGIsIDB4NDVmZWIwMGIsIDB4NDY3ZWIwMGIsIDB4NDZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHg0NzdlYjAwYiwgMHg0N2ZlYjAwYiwgMHg0ODdlYjAwYiwgMHg0OGZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4NDk3ZWIwMDAsIDB4NDlmZWIwMDEsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAotICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCi0gICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwKLSAgICAweGZmZmUzMTIyLCAweGZmZmUzMTIyLCAweGZmZmUzMTIyLCAweGZmZmUzMTIyLCAweGZmZmUzMTIyLCAweGZmZmUzMTIyLCAweGZmZmUzMTIyLCAweGZmZmUzMTIyLCAweGZmZmUzMTIyLCAweGZmZmUzMTIyLCAweGZmZmUzMTIyLCAweGZmZmUzMTIyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLAotICAgIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsCi0gICAgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwKLSAgICAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLAotICAgIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsCi0gICAgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKLSAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCi0gICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKLSAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAotICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCi0gICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAotICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCi0gICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCi0gICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDRiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMDAyNCwgMHhmZmZlMzAyMiwKLSAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAotICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwMjIsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCi0gICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKLSAgICAweGZmZmUwMDI0LCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUwMDI0LCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMDAyNCwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwMGIsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwMiwgMHhmZmZlMzAwMiwgMHhmZmZlMzAwMiwgMHhmZmZlMzAwMiwgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUwMDI0LCAweGZmZmUzMDBiLCAweGZmZmUzMDA1LCAweGZmZmUzMDA1LCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDRhN2UzMDAwLCAweDRhZmUzMDAxLCAweDRiN2UzMDAwLCAweDRiZmUzMDAxLCAweDRjN2UzMDAwLCAweDRjZmUzMDAxLCAweDRkN2UzMDAwLCAweDRkZmUzMDAxLAotICAgIDB4NGU3ZTMwMDAsIDB4NGVmZTMwMDEsIDB4NGY3ZTMwMDAsIDB4NGZmZTMwMDEsIDB4NTA3ZTMwMDAsIDB4NTBmZTMwMDEsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCi0gICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKLSAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMDAyNCwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDUxN2UzMDBiLCAweDUxZmUzMDBiLCAweDUyN2UzMDAwLCAweDUyZmUzMDAxLCAweGZmZmUzMDBiLCAweDUzN2UzMDBiLCAweDUzZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUwMDI0LCAweGZmZmUzMDBiLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4NTQ3ZTMwMGIsIDB4NTRmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4NTU3ZTMwMGIsIDB4NTVmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg1NjdlMzAwYiwgMHg1NmZlMzAwYiwgMHg1NzdlMzAwYiwgMHg1N2ZlMzAwYiwgMHg1ODdlMzAwMCwgMHg1OGZlMzAwMSwgMHg1OTdlMzAwMCwgMHg1OWZlMzAwMSwgMHg1YTdlMzAwMCwgMHg1YWZlMzAwMSwgMHg1YjdlMzAwMCwgMHg1YmZlMzAwMSwgMHg1YzdlMzAwMCwgMHg1Y2ZlMzAwMSwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4NWQ3ZTMwMDAsIDB4NWRmZTMwMDEsIDB4NWU3ZTMwMDAsIDB4NWVmZTMwMDEsIDB4NWY3ZTMwMDAsIDB4NWZmZTMwMDEsIDB4NjA3ZTMwMDAsIDB4NjBmZTMwMDEsIDB4NjE3ZTMwMDAsIDB4NjFmZTMwMDEsIDB4NjI3ZTMwMDAsIDB4NjJmZTMwMDEsIDB4NjM3ZTMwMDAsCi0gICAgMHg2M2ZlMzAwMSwgMHg2NDdlMzAwMCwgMHg2NGZlMzAwMSwgMHg2NTdlMzAwMCwgMHg2NWZlMzAwMSwgMHg2NjdlMzAwMCwgMHg2NmZlMzAwMSwgMHg2NzdlMzAwMCwgMHg2N2ZlMzAwMSwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4Njg3ZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHg2OGZlMzAwYiwgMHg2OTdlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg2OWZlMzAwYiwgMHg2YTdlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg2YWZlMzAwYiwKLSAgICAweDZiN2UzMDBiLCAweDZiZmUzMDBiLCAweDZjN2UzMDBiLCAweGZmZmUzMDBiLCAweDZjZmUzMDBiLCAweDZkN2UzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDZkZmUzMDAwLCAweDZlN2UzMDAxLCAweDZlZmUzMDAwLCAweDZmN2UzMDAxLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg2ZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg3MDdlMzAwYiwgMHg3MGZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg3MTdlMzAwMCwgMHg3MWZlMzAwMSwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg3MjdlMzAwYiwgMHg3MmZlMzAwYiwgMHg3MzdlMzAwYiwgMHg3M2ZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDc0N2UzMDBiLCAweDc0ZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDc1N2UzMDBiLCAweDc1ZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDc2N2UzMDBiLCAweDc2ZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4Nzc3ZTMwMGIsIDB4NzdmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4Nzg3ZTMwMGIsIDB4NzhmZTMwMGIsIDB4Nzk3ZTMwMGIsCi0gICAgMHg3OWZlMzAwYiwgMHg3YTdlMzAwYiwgMHg3YWZlMzAwYiwgMHg3YjdlMzAwYiwgMHg3YmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg3YzdlMzAwYiwgMHg3Y2ZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweDdkN2UzMDBiLCAweDdkZmUzMDBiLCAweDdlN2UzMDBiLCAweDdlZmUzMDBiLCAweDdmN2UzMDBiLCAweDdmZmUzMDBiLCAweDgwN2UzMDBiLCAweDgwZmUzMDBiLCAweDgxN2UzMDBiLCAweDgxZmUzMDBiLCAweDgyN2UzMDBiLCAweDgyZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ODM3ZTMwMGIsIDB4ODNmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ODQ3ZTMwMGIsIDB4ODRmZTMwMGIsIDB4ODU3ZTMwMGIsIDB4ODVmZTMwMGIsIDB4ODY3ZTMwMGIsIDB4ODZmZTMwMGIsIDB4ODc3ZTMwMGIsIDB4ODdmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ODg3ZTMwMGIsCi0gICAgMHg4OGZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg4OTdlMzAwYiwgMHg4OWZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg4YTdlMzAwYiwgMHg4YWZlMzAwYiwgMHg4YjdlMzAwYiwgMHg4YmZlMzAwYiwgMHg4YzdlMzAwYiwKLSAgICAweDhjZmUzMDBiLCAweDhkN2UzMDBiLCAweDhkZmUzMDBiLCAweDhlN2UzMDBiLCAweDhlZmUzMDBiLCAweDhmN2UzMDBiLCAweDhmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDkwN2UzMDBiLCAweDkwZmUzMDBiLCAweDkxN2UzMDBiLAotICAgIDB4OTFmZTMwMGIsIDB4OTI3ZTMwMGIsIDB4OTJmZTMwMGIsIDB4OTM3ZTMwMGIsIDB4OTNmZTMwMGIsIDB4OTQ3ZTMwMGIsIDB4OTRmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4OTU3ZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg5NWZlMzAwYiwgMHg5NjdlMzAwYiwgMHg5NmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg5NzdlMzAwYiwgMHg5N2ZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDk4N2UzMDBiLCAweDk4ZmUzMDBiLCAweDk5N2UzMDBiLCAweDk5ZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjAwNSwgMHhmZmZlYjAwZiwgMHhmZmZlYjAwZiwgMHhmZmZlYjAwZiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwNSwgMHhmZmZlYjAwZiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAotICAgIDB4ZmZmZWIwMDEsIDB4ZmZmZWIwMDEsIDB4OWE3ZWIwMDAsIDB4OWFmZWIwMDEsIDB4OWI3ZWIwMDAsIDB4OWJmZWIwMDEsIDB4ZmZmZWIwMDIsIDB4ZmZmZWIwMDIsIDB4ZmZmZWIwMDIsIDB4OWM3ZWIwMDAsIDB4OWNmZWIwMDEsIDB4ZmZmZWIwMDIsIDB4OWQ3ZWIwMDAsIDB4OWRmZWIwMDEsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGYsCi0gICAgMHhmZmZlYjAwZiwgMHhmZmZlYjAwZiwgMHhmZmZlYjAwZiwgMHhmZmZlYjAwZiwgMHhmZmZlYjAwZiwgMHhmZmZlYjAwZiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwZiwgMHhmZmZlYjAwMCwgMHhmZmZlYjAwZiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHg5ZTdlYjAwMCwgMHg5ZWZlYjAwMSwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweDlmN2ViMDAwLCAweDlmZmViMDAxLCAweGEwN2ViMDAwLCAweGEwZmViMDAxLCAweGExN2ViMDAwLCAweGExZmViMDAxLCAweGEyN2ViMDAwLCAweGEyZmViMDAxLCAweGEzN2ViMDAwLCAweGEzZmViMDAxLCAweGZmZmViMDBmLCAweGZmZmViMDBmLCAweGZmZmViMDBmLCAweGZmZmViMDBmLCAweGZmZmViMDA1LCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGYsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUzMzBjLCAweGZmZmYzMDAxLCAweGZmZmYzMDAxLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDQ0LCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGE0MGViMDAwLCAweGE0OTBiMDAxLCAweGE1MTJiMDAwLCAweGE1OTRiMDAxLCAweGE2MTZiMDAwLCAweGE2OThiMDAxLCAweGE3MWFiMDAwLCAweGE3OWNiMDAxLAotICAgIDB4YTgxZWIwMDAsIDB4YThhMGIwMDEsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4YTkyMmIwMDAsIDB4YTlhNGIwMDEsIDB4YWE3ZWIwMDAsIDB4YWFmZWIwMDEsIDB4YWI3ZWIwMDAsIDB4YWJmZWIwMDEsIDB4YWM3ZWIwMDAsIDB4YWNmZWIwMDEsIDB4ZmZmZTMwMDQsIDB4ZmZmZTMwMDAsIDB4ZmZmZTMwMDEsIDB4ZmZmZTMwMDEsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMjE5MywgMHhmZmZlMjE5MywgMHhmZmZlMjE5MywgMHhmZmZlMjE5MywgMHhmZmZlMjE5MywgMHhmZmZlMjE5MywKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAotICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmYzMDQ0LCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZmMzA0NCwgMHhmZmZlMzA0YywgMHhmZmZmMzA0NCwgMHhmZmZlMzA0YywgMHhmZmZmMzA0NCwgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUyMTkzLCAweGZmZmUyMTkzLCAweGZmZmUzMDA0LCAweGZmZmUzMDA0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwMDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDQ0LCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YywgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YywgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDA0LCAweGZmZmViMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmViMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDBjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAotICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCi0gICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUwMDY0LCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0ZiwgMHhmZmZlMzA0ZiwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwMGYsIDB4ZmZmZTMwMDUsIDB4ZmZmZTMwMGYsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKLSAgICAweGZmZmUzMDRhLCAweGZmZmUzMDRhLCAweGZmZmUzMDRhLCAweGZmZmUzMDRhLCAweGZmZmUzMDRhLCAweGZmZmUzMDRhLCAweGZmZmUzMDRhLCAweGZmZmUzMDRhLCAweGZmZmUzMDRhLCAweGZmZmUzMDRhLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsCi0gICAgMHhmZmZlYjE5MywgMHhmZmZlYjE5MywgMHhmZmZlYjE5MywgMHhmZmZlYjAwYiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKLSAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAotICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMjQ5LCAweGZmZmViMjRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMTAsIDB4ZmZmZWIwMTAsIDB4ZmZmZWIwMDUsIDB4ZmZmZWIwMDUsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywKLSAgICAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRmLCAweGZmZmViMDRmLAotICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDRmLCAweGZmZmViMDRmLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsCi0gICAgMHhmZmZlYjA1NywgMHhmZmZlYjA1NywgMHhmZmZlYjA1NywgMHhmZmZlYjA1NywgMHhmZmZlYjA1NywgMHhmZmZlYjA1NywgMHhmZmZlYjA1NywgMHhmZmZlYjA1NywgMHhmZmZlYjA1NywgMHhmZmZlYjA1NywgMHhmZmZlYjA1NywgMHhmZmZlYjA1NywgMHhmZmZlYjA1NywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLAotICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsCi0gICAgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKLSAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKLSAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAotICAgIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsCi0gICAgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAotICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA0ZiwgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCi0gICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAotICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAotICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCi0gICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKLSAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsCi0gICAgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwKLSAgICAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LAotICAgIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksCi0gICAgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCi0gICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKLSAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAotICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKLSAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAotICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCi0gICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMDA2NCwKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDBjLCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAotICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKLSAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKLSAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDhiLCAweGZmZmVhMTkzLCAweGZmZmViMDhiLAotICAgIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIyMGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsCi0gICAgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlODBhNCwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlODBhNCwgMHhmZmZlYjA4YiwgMHhmZmZlODBhNCwKLSAgICAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmU4MGE0LCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmU4MGE0LCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsCi0gICAgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwKLSAgICAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ4MDAsIDB4ZmZmZWQ4MDEsCi0gICAgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsCi0gICAgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwKLSAgICAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NDksIDB4ZmZmZWQ4MGIsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsCi0gICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKLSAgICAweGZmZmUzMDA3LCAweGZmZmUzMDAxLCAweGZmZmUzMDAxLCAweGZmZmUzMDA3LCAweGZmZmUzMDA3LCAweGZmZmUzMDA1LCAweGZmZmUzMDA1LCAweGZmZmUzMDAwLCAweGZmZmUzMDAxLCAweGZmZmUzMDBkLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAotICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwMCwgMHhmZmZlMzAwMSwgMHhmZmZlMzAwMCwgMHhmZmZlMzAwMSwgMHhmZmZlMzAwMCwgMHhmZmZlMzAwMSwgMHhmZmZlMzAwMCwgMHhmZmZlMzAwMSwgMHhmZmZlMzAwMCwgMHhmZmZlMzAwMSwgMHhmZmZlMzAwMCwKLSAgICAweGZmZmUzMDAxLCAweGZmZmUzMDAwLCAweGZmZmUzMDAxLCAweGZmZmUzMDAwLCAweGZmZmUzMDAxLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDAwLCAweGZmZmUzMDAxLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmYTYzMDBjLAotICAgIDB4ZmZmZTMxYzEsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMxYzEsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwMDQsIDB4ZmZmZTMxYzQsIDB4ZmZmZTMwMDUsIDB4ZmZmZTMwMDUsIDB4ZmZmZTMwMGMsIDB4YWQ3ZTMwMDAsIDB4YWRmZTMwMDEsIDB4YWU3ZTMwMDAsIDB4YWVmZTMwMDEsIDB4YWY3ZTMwMDAsIDB4YWZmZTMwMDEsIDB4ZmZmZTMyNGMsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzIwYywgMHhmZmZlMzIwYywgMHhiMDdlMzAwYywgMHhiMGZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMDAyNCwgMHhmZmZlMzAwYywgMHhmZmZlMzI0OCwgMHhmZmZlMzI0OSwgMHhmZmZlMzAwYywgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTY0LCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKLSAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAotICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCi0gICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlOWE5NCwKLSAgICAweGZmZmUwMDI0LCAweGZmZmYzMDA1LCAweGZmZmUzMDBjLCAweGZmZmUzMjRjLCAweGZmZmUzMjQ4LCAweGZmZmUzMjQ5LCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGIxMjgzMDAwLCAweGIxYWEzMDAxLCAweGZmZmUzMDBjLCAweGZmZmUzMjBjLCAweGZmZmYzMWMxLCAweGZmZmViMjBjLCAweGZmZmYzMWMxLCAweGZmZmUzMWNjLAotICAgIDB4ZmZmZTMxMGMsIDB4ZmZmZTMxMGMsIDB4ZmZmZTMxMGMsIDB4ZmZmZTMxMGMsIDB4ZmZmZTMxMGMsIDB4ZmZmZTMxMGMsIDB4ZmZmZTMxMGMsIDB4ZmZmZTMxMGMsIDB4ZmZmZTMxMGMsIDB4ZmZmZTMxMGMsIDB4ZmZmZjMxYzQsIDB4ZmZmZjMwMDQsIDB4YjI3ZTMwMGMsIDB4ZmZmZTMwMGMsIDB4YjJmZTMwMGMsIDB4ZmZmZjMwMDUsCi0gICAgMHhmZmZlMzAwYywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKLSAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGIzN2ViMDAwLCAweGZmZmUzMDBjLCAweGIzZmViMDAxLCAweGZmZmUzMDBjLCAweGZmZmViMDBjLAotICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCi0gICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhiNDJjMzAwMCwgMHhmZmZlMzAwYywgMHhiNGFlMzAwMSwgMHhmZmZlYjAwYywgMHhiNTdlMzAwMCwKLSAgICAweGI1ZmUzMDAxLCAweGZmZmViMDAxLCAweGI2N2ViMDAwLCAweGI2ZmViMDAxLCAweGZmZmViMDAxLCAweGZmZmUzMDA0LCAweGZmZmUzMDRiLCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LAotICAgIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKLSAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LAotICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCi0gICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAotICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCi0gICAgMHhmZmZlMzI0OSwgMHhmZmZlMzI0OCwgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzI0OCwgMHhmZmZlMzI0OCwgMHhmZmZlMDAyNCwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMDAyNCwKLSAgICAweGZmZmUwMmE0LCAweGZmZmUwMmE0LCAweGZmZmUwMmE0LCAweGZmZmUwMmE0LCAweGZmZmUwMmE0LCAweGZmZmUwMmE0LCAweGZmZmUwMmE0LCAweGZmZmUwMmE0LCAweGZmZmUwMmE0LCAweGZmZmUzMDEzLCAweGZmZmUzMDEzLCAweGZmZmUzMDEzLCAweGZmZmUzMDExLCAweGZmZmUzMDIyLCAweGZmZmUxYWE0LCAweGZmZmUxYWE0LAorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF91Y2QuaCIKKworY29uc3QgRlhfRFdPUkQga1RleHRMYXlvdXRDb2RlUHJvcGVydGllc1tdID0geworICAgIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsCisgICAgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywgMHhmZmZlOGFlNSwgMHhmZmZlOWI1YywgMHhmZmZlOWFkYSwKKyAgICAweGZmZmU5YjFhLCAweGZmZmU5YjViLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLAorICAgIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsCisgICAgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywgMHhmZmZlOWI1MywgMHhmZmZlOWI1MywKKyAgICAweGZmZmU5YjUzLCAweGZmZmU5YWQzLCAweGZmZmU5MzIzLCAweGZmZmViMDA1LCAweGZmZmViMDAyLCAweGZmZmViMjRiLAorICAgIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDksIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMDIsIDB4MDA3ZWIwMDAsIDB4MDBmZWIwMDEsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjIwOCwgMHhmZmZlYjFjNywgMHhmZmZlYjIwZSwgMHhmZmZlYjFjNywgMHhmZmZlYjFjNiwKKyAgICAweGZmZmVhOTBhLCAweGZmZmVhOTBhLCAweGZmZmVhOTBhLCAweGZmZmVhOTBhLCAweGZmZmVhOTBhLCAweGZmZmVhOTBhLAorICAgIDB4ZmZmZWE5MGEsIDB4ZmZmZWE5MGEsIDB4ZmZmZWE5MGEsIDB4ZmZmZWE5MGEsIDB4ZmZmZWIxYzcsIDB4ZmZmZWIwMDcsCisgICAgMHgwMTdlYjAwMCwgMHhmZmZlYjAwYiwgMHgwMWZlYjAwMSwgMHhmZmZlYjAwNSwgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4MDI3ZWIwMDAsIDB4ZmZmZWIwMDgsIDB4MDJmZWIwMDEsIDB4ZmZmZWIwMGIsIDB4ZmY4MGIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweDAzN2ViMDAwLCAweGZmZmViMDBmLCAweDAzZmViMDAxLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsCisgICAgMHhmZmZlYjI5MywgMHhmZmZlYjM1ZCwgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywKKyAgICAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLAorICAgIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsIDB4ZmZmZWIyOTMsCisgICAgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywgMHhmZmZlYjI5MywKKyAgICAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmViMjkzLCAweGZmZmU5MWMzLCAweGZmZmViMDAwLAorICAgIDB4ZmZmZWIyNDksIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDgsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsCisgICAgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjA2MiwgMHgwNDdlYjAwMCwgMHhmZmZlYjAwYiwgMHhmZmZlYjI4ZiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMjQ5LCAweGZmZmViMjQ4LCAweGZmZmViMTIyLCAweGZmZmViMTIyLAorICAgIDB4ZmZmZWIwMTAsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIxMjIsCisgICAgMHhmZmZlYjA2MiwgMHgwNGZlYjAwMSwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwMCwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDIyLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDIyLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAxMCwgMHhmZmZlYjAyMiwKKyAgICAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDEwLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwNjIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDEwLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExODMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTgzLCAweGZmZmVhMTgzLCAweGZmZmVhMTgzLCAweGZmZmVhMTgzLAorICAgIDB4ZmZmZWExODMsIDB4ZmZmZWExODMsIDB4ZmZmZWExODMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDA3LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjE5MywgMHhmZmZlYjE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmU4MDI0LCAweGZmZmViMDQ3LCAweGZmZmViMDBmLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwYTQsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmViMDhmLCAweGZmZmVhMTkzLCAweGZmZmViMDhiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDhiLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwODUsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKKyAgICAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLAorICAgIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsCisgICAgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwKKyAgICAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLAorICAgIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwKKyAgICAweGZmZmViMDhiLCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlZDBjYiwgMHhmZmZlZDBjYiwgMHhmZmZlZDBjYiwgMHhmZmZlZDBjYiwgMHhmZmZlZDE2NCwgMHhmZmZlZDE2NCwKKyAgICAweGZmZmVkMDBiLCAweGZmZmVkMDBiLCAweGZmZmVkMTRiLCAweGZmZmVkMjQ5LCAweGZmZmVkMjQ5LCAweGZmZmVkMTQ5LAorICAgIDB4ZmZmZWQxYzcsIDB4ZmZmZWQxNDcsIDB4ZmZmZWQwMGIsIDB4ZmZmZWQwMGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVkMTQ1LCAweGZmZmVkMTY0LCAweGZmZmVkMTY0LAorICAgIDB4ZmZmZWQxNDUsIDB4ZmZmZWQxNDUsIDB4ZmZmZWQxNjQsIDB4ZmZmZWQxNGIsIDB4ZmZmZWI5NGIsIDB4ZmZmZWI5NGIsCisgICAgMHhmZmZlYzE0YiwgMHhmZmZlYjk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYjk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzE0YiwKKyAgICAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjMTRiLAorICAgIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsCisgICAgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlZDE0YiwKKyAgICAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLAorICAgIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsCisgICAgMHhmZmZlYzE0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlZDE2NCwKKyAgICAweGZmZmVkMGNhLCAweGZmZmVkMGNhLCAweGZmZmVkMGNhLCAweGZmZmVkMGNhLCAweGZmZmVkMGNhLCAweGZmZmVkMGNhLAorICAgIDB4ZmZmZWQwY2EsIDB4ZmZmZWQwY2EsIDB4ZmZmZWQwY2EsIDB4ZmZmZWQwY2EsIDB4ZmZmZWQyNDksIDB4ZmZmZWQwY2EsCisgICAgMHhmZmZlZDBjYSwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlYTE5MywgMHhmZmZlYzE0YiwKKyAgICAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVhMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLAorICAgIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsCisgICAgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwKKyAgICAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLAorICAgIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsCisgICAgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwKKyAgICAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjMTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLAorICAgIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsCisgICAgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwKKyAgICAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLAorICAgIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsCisgICAgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlYzk0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwKKyAgICAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLAorICAgIDB4ZmZmZWMxNGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWM5NGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsCisgICAgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwKKyAgICAweGZmZmVjOTRiLCAweGZmZmVjMTRiLCAweGZmZmVjOTRiLCAweGZmZmVjMTRiLCAweGZmZmVjOTRiLCAweGZmZmVjOTRiLAorICAgIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWM5NDUsIDB4ZmZmZWMxNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlZDBjYiwKKyAgICAweGZmZmVkMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWQwMGIsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwKKyAgICAweGZmZmVkMTBhLCAweGZmZmVkMTBhLCAweGZmZmVkMTBhLCAweGZmZmVkMTBhLCAweGZmZmVkMTBhLCAweGZmZmVkMTBhLAorICAgIDB4ZmZmZWQxMGEsIDB4ZmZmZWQxMGEsIDB4ZmZmZWQxMGEsIDB4ZmZmZWQxMGEsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsCisgICAgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwKKyAgICAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLAorICAgIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsCisgICAgMHhmZmZlODE2NCwgMHhmZmZlYjI4YiwgMHhmZmZlYjE0YiwgMHhmZmZlYTE5MywgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwKKyAgICAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLAorICAgIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsCisgICAgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwKKyAgICAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLAorICAgIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmU4MTY0LCAweGZmZmU4MTY0LCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLAorICAgIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsCisgICAgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwKKyAgICAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLAorICAgIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsCisgICAgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlYzE0YiwgMHhmZmZlZDE0YiwKKyAgICAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVkMTRiLCAweGZmZmVjMTRiLCAweGZmZmVkMTRiLCAweGZmZmVjMTRiLAorICAgIDB4ZmZmZWMxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWQxNGIsIDB4ZmZmZWMxNGIsIDB4ZmZmZWMxNGIsCisgICAgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwgMHhmZmZlZDE0YiwKKyAgICAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLAorICAgIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsCisgICAgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwKKyAgICAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmViMTRiLAorICAgIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsIDB4ZmZmZWIxNGIsCisgICAgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwgMHhmZmZlYjE0YiwKKyAgICAweGZmZmViMTRiLCAweGZmZmViMTRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYjE0YiwgMHhmZmZlODE2NCwgMHhmZmZlODE2NCwgMHhmZmZlODE2NCwgMHhmZmZlODE2NCwKKyAgICAweGZmZmU4MTY0LCAweGZmZmU4MTY0LCAweGZmZmU4MTY0LCAweGZmZmU4MTY0LCAweGZmZmU4MTY0LCAweGZmZmU4MTY0LAorICAgIDB4ZmZmZTgxNjQsIDB4ZmZmZTgxNjQsIDB4ZmZmZTgxNjQsIDB4ZmZmZTgxNjQsIDB4ZmZmZWIwOGEsIDB4ZmZmZWIwOGEsCisgICAgMHhmZmZlYjA4YSwgMHhmZmZlYjA4YSwgMHhmZmZlYjA4YSwgMHhmZmZlYjA4YSwgMHhmZmZlYjA4YSwgMHhmZmZlYjA4YSwKKyAgICAweGZmZmViMDhhLCAweGZmZmViMDhhLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLAorICAgIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsCisgICAgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwKKyAgICAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLAorICAgIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsCisgICAgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwNywgMHhmZmZlYjAwNSwgMHhmZmZlYjA4YiwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKKyAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLAorICAgIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsCisgICAgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwKKyAgICAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwOGIsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDhiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWIwOGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwKKyAgICAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLAorICAgIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKKyAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKKyAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKKyAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKKyAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKKyAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKKyAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKKyAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKKyAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKKyAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKKyAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwgMHhmZmZlODBhNCwKKyAgICAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LCAweGZmZmU4MGE0LAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywKKyAgICAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsCisgICAgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDUzLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjI0OSwgMHhmZmZlYjI0OSwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDQ5LCAweGZmZmViMDRiLCAweGZmZmViMjQ4LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlODAyNCwgMHhmZmZlYjI0OCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywKKyAgICAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywKKyAgICAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIyNDgsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsCisgICAgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDUzLCAweGZmZmViMDUzLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNTMsIDB4ZmZmZWEwNTMsCisgICAgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwKKyAgICAweGZmZmVhMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmViMDUzLCAweGZmZmViMDUzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0OSwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmViMDUzLCAweGZmZmViMDUzLAorICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsCisgICAgMHhmZmZlYTE5ZSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjI0OCwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsCisgICAgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlODAyNCwgMHhmZmZlYjA1ZSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmU4MDI0LCAweGZmZmViMDVlLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDVlLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlODAyNCwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlYjA1ZSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmU4MDI0LCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsCisgICAgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlODAyNCwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsCisgICAgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA1MCwgMHhmZmZlYjA1MCwgMHhmZmZlYjA1MCwgMHhmZmZlYjA1MCwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDUwLCAweGZmZmViMDUwLCAweGZmZmViMDQzLCAweGZmZmViMDUwLCAweGZmZmViMDUwLCAweGZmZmViMDRmLAorICAgIDB4ZmZmZWIwNDMsIDB4ZmZmZWIwNDUsIDB4ZmZmZWIwNDUsIDB4ZmZmZWIwNDUsIDB4ZmZmZWIwNDUsIDB4ZmZmZWIwNDUsCisgICAgMHhmZmZlYjA0MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0NSwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGYsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHgwNTdlYjAwMCwgMHgwNWZlYjAwMSwKKyAgICAweDA2N2ViMDAwLCAweDA2ZmViMDAxLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYjA0ZiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmViMDRmLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmViMDRmLCAweGZmZmViMDRmLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDUwLCAweGZmZmViMDUwLAorICAgIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNTAsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLAorICAgIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLAorICAgIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLAorICAgIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LAorICAgIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsCisgICAgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywKKyAgICAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LAorICAgIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsCisgICAgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywKKyAgICAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LAorICAgIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsCisgICAgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywKKyAgICAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LAorICAgIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsCisgICAgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywKKyAgICAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LAorICAgIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsCisgICAgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywgMHhmZmZlMzA1NywKKyAgICAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LCAweGZmZmUzMDU3LAorICAgIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTcsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsCisgICAgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwKKyAgICAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LAorICAgIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsCisgICAgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwKKyAgICAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LAorICAgIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsCisgICAgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwKKyAgICAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LAorICAgIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsCisgICAgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwKKyAgICAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LAorICAgIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksCisgICAgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwKKyAgICAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LAorICAgIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksCisgICAgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwKKyAgICAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LAorICAgIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksCisgICAgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwKKyAgICAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LAorICAgIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksCisgICAgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwKKyAgICAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LAorICAgIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksCisgICAgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwKKyAgICAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0ZiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjAwZiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIzMGYsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHgwNzdlYjAwMCwgMHgwN2ZlYjAwMSwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRmLAorICAgIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsCisgICAgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsCisgICAgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwKKyAgICAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmViMDRmLCAweGZmZmViMDRmLAorICAgIDB4ZmZmZWIwNDQsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIyNDgsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwNSwgMHhmZmZlYjAwNSwgMHhmZmZlYjAwZiwgMHhmZmZlYjAwZiwKKyAgICAweGZmZmViMDEwLCAweGZmZmViMDBiLCAweGZmZmViMDA1LCAweGZmZmViMDA1LCAweGZmZmViMDBiLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIzMDMsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywKKyAgICAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywKKyAgICAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwMGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjAwNSwgMHhmZmZlYjAwNSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDFlLCAweGZmZmViMDFlLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLAorICAgIDB4ZmZmZWExOWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwKKyAgICAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsIDB4ZmZmZWExOWUsCisgICAgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwKKyAgICAweGZmZmVhMTllLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsCisgICAgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDUzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsCisgICAgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwKKyAgICAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDUzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDEwLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIzMGYsIDB4ZmZmZWIzMGYsIDB4ZmZmZWIzMGYsIDB4ZmZmZWIzMGYsCisgICAgMHhmZmZlYjMwZiwgMHhmZmZlYjMwZiwgMHhmZmZlYjMwZiwgMHhmZmZlYjMwMywgMHhmZmZlYjMwZiwgMHhmZmZlYjMwZiwKKyAgICAweGZmZmViMzBmLCAweGZmZmViMjkyLCAweGZmZmU5YTkzLCAweGZmZmU5YTkzLCAweGZmZmU5ODUzLCAweGZmZmU5ODkzLAorICAgIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMDMsIDB4ZmZmZWIwMGYsIDB4ZmY4MmIwMGYsIDB4ZmY4NGIwMTEsIDB4ZmZmZWIwMjIsCisgICAgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHgwODA2YjAwMCwgMHgwODg4YjAwMiwgMHhmZmZlYjAwMCwgMHhmZmZlYjAwMiwKKyAgICAweDA5MGFiMDAwLCAweDA5OGNiMDAxLCAweGZmZmViMDAwLCAweGZmZmViMDAyLCAweGZmZmViMDIyLCAweGZmZmViMDIyLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGQsIDB4ZmZmZWIwMGQsIDB4ZmZmZWIwMGQsIDB4ZmZmZWIwMGYsCisgICAgMHhmZmZlOWIxYSwgMHhmZmZlOWI1YSwgMHhmZmZlOWM1MywgMHhmZmZlOWJkMywgMHhmZmZlOWM5MywgMHhmZmZlOWMxMywKKyAgICAweGZmZmU5YjkzLCAweGZmZmViMWMzLCAweGZmZmViMjQ5LCAweGZmZmViMjQ5LCAweGZmZmViMjQ5LCAweGZmZmViMjQ5LAorICAgIDB4ZmZmZWIyNDksIDB4ZmZmZWIwMDksIDB4ZmZmZWIwMDksIDB4ZmZmZWIwMDksIDB4ZmZmZWIwMGIsIDB4MGE3ZWIwMDAsCisgICAgMHgwYWZlYjAwMSwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwNCwgMHhmZmZlYjAwNCwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMWM3LCAweDBiN2ViMDAwLAorICAgIDB4MGJmZWIwMDEsIDB4ZmZmZWIwMDQsIDB4ZmZmZWIwMDQsIDB4ZmZmZWIwMDQsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBmLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGYsCisgICAgMHhmZmZlYjAwZiwgMHhmZmZlYjMwZiwgMHhmZmZlYjI5NCwgMHhmZmZlYjI4YiwgMHhmZmZlYjI4YiwgMHhmZmZlYjI4YiwKKyAgICAweGZmZmViMjhiLCAweGZmZmU4MmE0LCAweGZmZmU4MmE0LCAweGZmZmU4MmE0LCAweGZmZmU4MmE0LCAweGZmZmU4MmE0LAorICAgIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsIDB4ZmZmZTlhOTMsCisgICAgMHhmZmZlYjEwYiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjEyMiwgMHhmZmZlYjEwYiwKKyAgICAweGZmZmViMTBiLCAweGZmZmViMTBiLCAweGZmZmViMTBiLCAweGZmZmViMTBiLCAweGZmZmViMjBiLCAweGZmZmViMjBiLAorICAgIDB4ZmZmZWIwMGIsIDB4MGM3ZWIwMDAsIDB4MGNmZWIwMDEsIDB4ZmZmZWIwNjIsIDB4ZmZmZWIxMGIsIDB4ZmZmZWIxMjIsCisgICAgMHhmZmZlYjEyMiwgMHhmZmZlYjEyMiwgMHhmZmZlYjEyMiwgMHhmZmZlYjEwYiwgMHhmZmZlYjEwYiwgMHhmZmZlYjEwYiwKKyAgICAweGZmZmViMTBiLCAweGZmZmViMTBiLCAweGZmZmViMjBiLCAweGZmZmViMjBiLCAweGZmZmViMDBiLCAweDBkN2ViMDAwLAorICAgIDB4MGRmZWIwMDEsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDgsCisgICAgMHhmZmZlYjI0OCwgMHhmZmZlYjI0OSwgMHhmZmZlYjI0OCwgMHhmZmZlYjI0OCwgMHhmZmZlYjI0OCwgMHhmZmZlYjI0OCwKKyAgICAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LCAweGZmZmViMjQ4LAorICAgIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDgsIDB4ZmZmZWIyNDksIDB4ZmZmZWIyNDgsCisgICAgMHhmZmZlYjI0OCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYjE5MywgMHhmZmZlYjE5MywgMHhmZmZlYjE5MywgMHhmZmZlYjE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmViMTkzLCAweGZmZmViMTkzLCAweGZmZmViMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwOSwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDA5LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA2MiwgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwOCwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDYyLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMjRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLAorICAgIDB4ZmZmZWIwNjIsIDB4ZmZmZWIwNjIsIDB4ZmZmZWIwNjIsIDB4ZmZmZWIwNjIsIDB4ZmZmZWIwNjIsIDB4ZmZmZWIwNjIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA2MiwgMHhmZmZlYjA2MiwKKyAgICAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLCAweGZmZmViMDYyLAorICAgIDB4ZmZmZWIwNjIsIDB4ZmZmZWIwNjIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDIyLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwKKyAgICAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDIyLAorICAgIDB4MGU3ZWIwMjIsIDB4MGVmZWIwMGIsIDB4MGY3ZWIwMGIsIDB4MGZmZWIwMjIsIDB4MTA3ZWIwMGIsIDB4MTBmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjIwOCwgMHhmZmZlYjI0OCwKKyAgICAweGZmZmViMDBiLCAweDExN2ViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMjIsCisgICAgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDIyLCAweGZmZmViMDIyLAorICAgIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAyMiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweDExZmViMDIyLCAweDEyN2ViMDIyLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4MTJmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAyMiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4MTM3ZWIwMjIsIDB4MTNmZWIwMGIsIDB4MTQ3ZWIwMGIsIDB4MTRmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDIyLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4MTU3ZWIwMjIsIDB4MTVmZWIwMjIsIDB4MTY3ZWIwMjIsIDB4MTZmZWIwMjIsCisgICAgMHgxNzdlYjAwYiwgMHgxN2ZlYjAwYiwgMHgxODdlYjAyMiwgMHgxOGZlYjAyMiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweDE5N2ViMDIyLCAweDE5ZmViMDIyLCAweDFhN2ViMDBiLCAweDFhZmViMDBiLCAweDFiN2ViMDBiLCAweDFiZmViMDBiLAorICAgIDB4MWM3ZWIwMGIsIDB4MWNmZWIwMGIsIDB4MWQ3ZWIwMGIsIDB4MWRmZWIwMGIsIDB4MWU3ZWIwMGIsIDB4MWVmZWIwMGIsCisgICAgMHgxZjdlYjAwYiwgMHgxZmZlYjAwYiwgMHgyMDdlYjAwYiwgMHgyMGZlYjAwYiwgMHgyMTdlYjAwYiwgMHgyMWZlYjAwYiwKKyAgICAweDIyN2ViMDBiLCAweDIyZmViMDBiLCAweDIzN2ViMDIyLCAweDIzZmViMDIyLCAweDI0N2ViMDBiLCAweDI0ZmViMDBiLAorICAgIDB4MjU3ZWIwMjIsIDB4MjVmZWIwMjIsIDB4MjY3ZWIwMGIsIDB4MjZmZWIwMGIsIDB4Mjc3ZWIwMGIsIDB4MjdmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHgyODdlYjAwYiwgMHgyOGZlYjAwYiwgMHgyOTdlYjAwYiwKKyAgICAweDI5ZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4MmE3ZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHgyYWZlYjAwYiwgMHgyYjdlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweDJiZmViMDBiLCAweGZmZmViMDBiLCAweDJjN2ViMDBiLCAweDJjZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4MmQ3ZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHgyZGZlYjAwYiwgMHgyZTdlYjAwYiwgMHgyZWZlYjAwYiwgMHgyZjdlYjAwYiwgMHgyZmZlYjAwYiwgMHgzMDdlYjAwYiwKKyAgICAweDMwZmViMDBiLCAweDMxN2ViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMjIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweDMxZmViMDBiLCAweDMyN2ViMDBiLCAweDMyZmViMDBiLCAweDMzN2ViMDBiLCAweDMzZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4MzQ3ZWIwMGIsIDB4MzRmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHgzNTdlYjAwYiwgMHgzNWZlYjAwYiwgMHgzNjdlYjAwYiwgMHgzNmZlYjAwYiwKKyAgICAweDM3N2ViMDBiLCAweDM3ZmViMDBiLCAweDM4N2ViMDBiLCAweDM4ZmViMDBiLCAweDM5N2ViMDBiLCAweDM5ZmViMDBiLAorICAgIDB4M2E3ZWIwMGIsIDB4M2FmZWIwMGIsIDB4M2I3ZWIwMGIsIDB4M2JmZWIwMGIsIDB4M2M3ZWIwMGIsIDB4M2NmZWIwMGIsCisgICAgMHgzZDdlYjAwYiwgMHgzZGZlYjAwYiwgMHgzZTdlYjAwYiwgMHgzZWZlYjAwYiwgMHgzZjdlYjAwYiwgMHgzZmZlYjAwYiwKKyAgICAweDQwN2ViMDBiLCAweDQwZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweDQxN2ViMDBiLCAweDQxZmViMDBiLAorICAgIDB4NDI3ZWIwMGIsIDB4NDJmZWIwMGIsIDB4NDM3ZWIwMGIsIDB4ZmZmZWIwMGIsIDB4NDNmZWIwMGIsIDB4NDQ3ZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHg0NGZlYjAwYiwgMHg0NTdlYjAwYiwgMHg0NWZlYjAwYiwgMHg0NjdlYjAwYiwKKyAgICAweDQ2ZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4NDc3ZWIwMGIsIDB4NDdmZWIwMGIsCisgICAgMHg0ODdlYjAwYiwgMHg0OGZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDIyLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4NDk3ZWIwMDAsIDB4NDlmZWIwMDEsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwKKyAgICAweGZmZmUzMTIyLCAweGZmZmUzMTIyLCAweGZmZmUzMTIyLCAweGZmZmUzMTIyLCAweGZmZmUzMTIyLCAweGZmZmUzMTIyLAorICAgIDB4ZmZmZTMxMjIsIDB4ZmZmZTMxMjIsIDB4ZmZmZTMxMjIsIDB4ZmZmZTMxMjIsIDB4ZmZmZTMxMjIsIDB4ZmZmZTMxMjIsCisgICAgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwgMHhmZmZlMzEyMiwKKyAgICAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLAorICAgIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsCisgICAgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwKKyAgICAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLAorICAgIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsCisgICAgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwKKyAgICAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLAorICAgIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsCisgICAgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwKKyAgICAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLAorICAgIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsCisgICAgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwKKyAgICAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLCAweGZmZmUzMDYyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUwMDI0LCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwMjIsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUwMDI0LCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUwMDI0LCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMzAwYiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDAyLCAweGZmZmUzMDAyLCAweGZmZmUzMDAyLCAweGZmZmUzMDAyLCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMDUsIDB4ZmZmZTMwMDUsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg0YTdlMzAwMCwgMHg0YWZlMzAwMSwgMHg0YjdlMzAwMCwgMHg0YmZlMzAwMSwKKyAgICAweDRjN2UzMDAwLCAweDRjZmUzMDAxLCAweDRkN2UzMDAwLCAweDRkZmUzMDAxLCAweDRlN2UzMDAwLCAweDRlZmUzMDAxLAorICAgIDB4NGY3ZTMwMDAsIDB4NGZmZTMwMDEsIDB4NTA3ZTMwMDAsIDB4NTBmZTMwMDEsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLAorICAgIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwKKyAgICAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDIyLCAweGZmZmUzMDBiLCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMDAyNCwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg1MTdlMzAwYiwgMHg1MWZlMzAwYiwgMHg1MjdlMzAwMCwKKyAgICAweDUyZmUzMDAxLCAweGZmZmUzMDBiLCAweDUzN2UzMDBiLCAweDUzZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg1NDdlMzAwYiwgMHg1NGZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDU1N2UzMDBiLAorICAgIDB4NTVmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4NTY3ZTMwMGIsIDB4NTZmZTMwMGIsCisgICAgMHg1NzdlMzAwYiwgMHg1N2ZlMzAwYiwgMHg1ODdlMzAwMCwgMHg1OGZlMzAwMSwgMHg1OTdlMzAwMCwgMHg1OWZlMzAwMSwKKyAgICAweDVhN2UzMDAwLCAweDVhZmUzMDAxLCAweDViN2UzMDAwLCAweDViZmUzMDAxLCAweDVjN2UzMDAwLCAweDVjZmUzMDAxLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHg1ZDdlMzAwMCwgMHg1ZGZlMzAwMSwgMHg1ZTdlMzAwMCwgMHg1ZWZlMzAwMSwgMHg1ZjdlMzAwMCwKKyAgICAweDVmZmUzMDAxLCAweDYwN2UzMDAwLCAweDYwZmUzMDAxLCAweDYxN2UzMDAwLCAweDYxZmUzMDAxLCAweDYyN2UzMDAwLAorICAgIDB4NjJmZTMwMDEsIDB4NjM3ZTMwMDAsIDB4NjNmZTMwMDEsIDB4NjQ3ZTMwMDAsIDB4NjRmZTMwMDEsIDB4NjU3ZTMwMDAsCisgICAgMHg2NWZlMzAwMSwgMHg2NjdlMzAwMCwgMHg2NmZlMzAwMSwgMHg2NzdlMzAwMCwgMHg2N2ZlMzAwMSwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHg2ODdlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDY4ZmUzMDBiLCAweDY5N2UzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4NjlmZTMwMGIsIDB4NmE3ZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg2YWZlMzAwYiwKKyAgICAweDZiN2UzMDBiLCAweDZiZmUzMDBiLCAweDZjN2UzMDBiLCAweGZmZmUzMDBiLCAweDZjZmUzMDBiLCAweDZkN2UzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4NmRmZTMwMDAsIDB4NmU3ZTMwMDEsIDB4NmVmZTMwMDAsIDB4NmY3ZTMwMDEsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweDZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDcwN2UzMDBiLCAweDcwZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4NzE3ZTMwMDAsIDB4NzFmZTMwMDEsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweDcyN2UzMDBiLCAweDcyZmUzMDBiLCAweDczN2UzMDBiLCAweDczZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4NzQ3ZTMwMGIsIDB4NzRmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweDc1N2UzMDBiLCAweDc1ZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDc2N2UzMDBiLCAweDc2ZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4Nzc3ZTMwMGIsIDB4NzdmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4Nzg3ZTMwMGIsCisgICAgMHg3OGZlMzAwYiwgMHg3OTdlMzAwYiwgMHg3OWZlMzAwYiwgMHg3YTdlMzAwYiwgMHg3YWZlMzAwYiwgMHg3YjdlMzAwYiwKKyAgICAweDdiZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4N2M3ZTMwMGIsIDB4N2NmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHg3ZDdlMzAwYiwgMHg3ZGZlMzAwYiwgMHg3ZTdlMzAwYiwgMHg3ZWZlMzAwYiwgMHg3ZjdlMzAwYiwKKyAgICAweDdmZmUzMDBiLCAweDgwN2UzMDBiLCAweDgwZmUzMDBiLCAweDgxN2UzMDBiLCAweDgxZmUzMDBiLCAweDgyN2UzMDBiLAorICAgIDB4ODJmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ODM3ZTMwMGIsCisgICAgMHg4M2ZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg4NDdlMzAwYiwgMHg4NGZlMzAwYiwKKyAgICAweDg1N2UzMDBiLCAweDg1ZmUzMDBiLCAweDg2N2UzMDBiLCAweDg2ZmUzMDBiLCAweDg3N2UzMDBiLCAweDg3ZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ODg3ZTMwMGIsIDB4ODhmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ODk3ZTMwMGIsCisgICAgMHg4OWZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweDhhN2UzMDBiLCAweDhhZmUzMDBiLCAweDhiN2UzMDBiLCAweDhiZmUzMDBiLCAweDhjN2UzMDBiLAorICAgIDB4OGNmZTMwMGIsIDB4OGQ3ZTMwMGIsIDB4OGRmZTMwMGIsIDB4OGU3ZTMwMGIsIDB4OGVmZTMwMGIsIDB4OGY3ZTMwMGIsCisgICAgMHg4ZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweDkwN2UzMDBiLCAweDkwZmUzMDBiLCAweDkxN2UzMDBiLCAweDkxZmUzMDBiLCAweDkyN2UzMDBiLAorICAgIDB4OTJmZTMwMGIsIDB4OTM3ZTMwMGIsIDB4OTNmZTMwMGIsIDB4OTQ3ZTMwMGIsIDB4OTRmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweDk1N2UzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweDk1ZmUzMDBiLAorICAgIDB4OTY3ZTMwMGIsIDB4OTZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHg5NzdlMzAwYiwgMHg5N2ZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4OTg3ZTMwMGIsIDB4OThmZTMwMGIsIDB4OTk3ZTMwMGIsIDB4OTlmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMjIsCisgICAgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMzAyMiwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjAwNSwKKyAgICAweGZmZmViMDBmLCAweGZmZmViMDBmLCAweGZmZmViMDBmLCAweGZmZmViMDBiLCAweGZmZmViMDA1LCAweGZmZmViMDBmLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlODAyNCwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwMDEsIDB4ZmZmZWIwMDEsCisgICAgMHg5YTdlYjAwMCwgMHg5YWZlYjAwMSwgMHg5YjdlYjAwMCwgMHg5YmZlYjAwMSwgMHhmZmZlYjAwMiwgMHhmZmZlYjAwMiwKKyAgICAweGZmZmViMDAyLCAweDljN2ViMDAwLCAweDljZmViMDAxLCAweGZmZmViMDAyLCAweDlkN2ViMDAwLCAweDlkZmViMDAxLAorICAgIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGYsIDB4ZmZmZWIwMGYsCisgICAgMHhmZmZlYjAwZiwgMHhmZmZlYjAwZiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwZiwgMHhmZmZlYjAwMCwgMHhmZmZlYjAwZiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweDllN2ViMDAwLCAweDllZmViMDAxLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4OWY3ZWIwMDAsIDB4OWZmZWIwMDEsIDB4YTA3ZWIwMDAsIDB4YTBmZWIwMDEsIDB4YTE3ZWIwMDAsIDB4YTFmZWIwMDEsCisgICAgMHhhMjdlYjAwMCwgMHhhMmZlYjAwMSwgMHhhMzdlYjAwMCwgMHhhM2ZlYjAwMSwgMHhmZmZlYjAwZiwgMHhmZmZlYjAwZiwKKyAgICAweGZmZmViMDBmLCAweGZmZmViMDBmLCAweGZmZmViMDA1LCAweGZmZmViMDBiLCAweGZmZmViMDBmLCAweGZmZmViMDBmLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUwMDI0LCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUzMzBjLCAweGZmZmYzMDAxLCAweGZmZmYzMDAxLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDQ0LAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4YTQwZWIwMDAsIDB4YTQ5MGIwMDEsIDB4YTUxMmIwMDAsIDB4YTU5NGIwMDEsCisgICAgMHhhNjE2YjAwMCwgMHhhNjk4YjAwMSwgMHhhNzFhYjAwMCwgMHhhNzljYjAwMSwgMHhhODFlYjAwMCwgMHhhOGEwYjAwMSwKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGE5MjJiMDAwLCAweGE5YTRiMDAxLCAweGFhN2ViMDAwLCAweGFhZmViMDAxLAorICAgIDB4YWI3ZWIwMDAsIDB4YWJmZWIwMDEsIDB4YWM3ZWIwMDAsIDB4YWNmZWIwMDEsIDB4ZmZmZTMwMDQsIDB4ZmZmZTMwMDAsCisgICAgMHhmZmZlMzAwMSwgMHhmZmZlMzAwMSwgMHhmZmZlMzAwYywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTIxOTMsIDB4ZmZmZTIxOTMsIDB4ZmZmZTIxOTMsIDB4ZmZmZTIxOTMsIDB4ZmZmZTIxOTMsIDB4ZmZmZTIxOTMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDQ0LAorICAgIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwNDQsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YywgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YywgMHhmZmZlMzA0NCwKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDQ0LCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZjMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmYzMDQ0LAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZjMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZjMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDQ0LAorICAgIDB4ZmZmZTMwNDQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTIxOTMsIDB4ZmZmZTIxOTMsIDB4ZmZmZTMwMDQsCisgICAgMHhmZmZlMzAwNCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YywgMHhmZmZlMzAwNCwgMHhmZmZlMzA0NCwKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDQ0LCAweGZmZmUzMDRjLCAweGZmZmUzMDQ0LCAweGZmZmUzMDRjLCAweGZmZmUzMDQ0LAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNDQsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YywgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDQ0LCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNDQsCisgICAgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzAwNCwKKyAgICAweGZmZmViMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDRjLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZWIwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUwMDI0LCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsCisgICAgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwKKyAgICAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LAorICAgIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNDQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUwMDI0LCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsIDB4ZmZmZTMwNjIsCisgICAgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzA2MiwgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzAwYywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUwMDI0LCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLAorICAgIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsIDB4ZmZmZTMwMGIsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMDAyNCwgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDQ0LCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0ZiwgMHhmZmZlMzA0ZiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzAwZiwKKyAgICAweGZmZmUzMDA1LCAweGZmZmUzMDBmLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRhLCAweGZmZmUzMDRhLCAweGZmZmUzMDRhLCAweGZmZmUzMDRhLCAweGZmZmUzMDRhLCAweGZmZmUzMDRhLAorICAgIDB4ZmZmZTMwNGEsIDB4ZmZmZTMwNGEsIDB4ZmZmZTMwNGEsIDB4ZmZmZTMwNGEsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWIxOTMsIDB4ZmZmZWIxOTMsIDB4ZmZmZWIxOTMsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwgMHhmZmZlYjA0ZiwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsIDB4ZmZmZWIwMGIsCisgICAgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmViMDBiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNTMsCisgICAgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjAwYiwgMHhmZmZlYjAwYiwKKyAgICAweGZmZmViMDBiLCAweGZmZmViMDBiLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjI0OSwgMHhmZmZlYjI0YiwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDEwLCAweGZmZmViMDEwLCAweGZmZmViMDA1LCAweGZmZmViMDA1LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywKKyAgICAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLAorICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLAorICAgIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDU3LCAweGZmZmViMDU3LAorICAgIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsCisgICAgMHhmZmZlYjA1NywgMHhmZmZlYjA1NywgMHhmZmZlYjA1NywgMHhmZmZlYjA1NywgMHhmZmZlYjA1NywgMHhmZmZlYjA1NywKKyAgICAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LCAweGZmZmViMDU3LAorICAgIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsIDB4ZmZmZWIwNTcsCisgICAgMHhmZmZlYjA1NywgMHhmZmZlYjA1NywgMHhmZmZlYjA1NywgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0ZiwKKyAgICAweGZmZmViMDRmLCAweGZmZmViMDRmLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywgMHhmZmZlYjA1MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYjA1MywKKyAgICAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYTE5MywgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWIwNTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZWIwNGEsIDB4ZmZmZWIwNGEsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRmLAorICAgIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA1ZSwKKyAgICAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmVhMTllLCAweGZmZmViMDVlLCAweGZmZmViMDVlLCAweGZmZmVhMTllLAorICAgIDB4ZmZmZWExOWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsCisgICAgMHhmZmZlYTE5ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlYTE5ZSwgMHhmZmZlYjA1ZSwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDVlLAorICAgIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZWIwNWUsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwKKyAgICAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsCisgICAgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA0YiwgMHhmZmZlYjA1MywKKyAgICAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLCAweGZmZmViMDUzLCAweGZmZmVhMTkzLCAweGZmZmViMDUzLAorICAgIDB4ZmZmZWIwNTMsIDB4ZmZmZWIwNGYsIDB4ZmZmZWIwNTMsIDB4ZmZmZWExOTMsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwgMHhmZmZlYjA0YSwKKyAgICAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmViMDRhLCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LAorICAgIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMDA2NCwKKyAgICAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsIDB4ZmZmZTMwNTUsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUzMDU1LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA1NSwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LAorICAgIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsIDB4ZmZmZTMwNTYsCisgICAgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwgMHhmZmZlMzA1NiwKKyAgICAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUzMDU2LCAweGZmZmUwMDY0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwKKyAgICAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LAorICAgIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsIDB4ZmZmZTMwNTgsCisgICAgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwgMHhmZmZlMzA1OCwKKyAgICAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUzMDU4LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksCisgICAgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwKKyAgICAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LAorICAgIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksCisgICAgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwKKyAgICAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUzMDU5LAorICAgIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksIDB4ZmZmZTMwNTksCisgICAgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwgMHhmZmZlMzA1OSwKKyAgICAweGZmZmUzMDU5LCAweGZmZmUzMDU5LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUwMDI0LCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUwMDI0LCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLCAweGZmZmUzMDFmLAorICAgIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsIDB4ZmZmZTMwMWYsCisgICAgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwgMHhmZmZlMzAxZiwKKyAgICAweGZmZmUzMDFmLCAweGZmZmUwMDI0LCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsCisgICAgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwgMHhmZmZlMzA2MSwKKyAgICAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLCAweGZmZmUzMDYxLAorICAgIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTMwNjEsIDB4ZmZmZTAwNjQsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUwMDI0LCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUwMDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmViMDRiLCAweGZmZmViMDRiLCAweGZmZmViMDRiLAorICAgIDB4ZmZmZWIwNGIsIDB4ZmZmZWIwNGIsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsCisgICAgMHhmZmZlODAyNCwgMHhmZmZlYjA4YiwgMHhmZmZlYTE5MywgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwKKyAgICAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLAorICAgIDB4ZmZmZWIwOGIsIDB4ZmZmZWIyMGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsCisgICAgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwKKyAgICAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmU4MGE0LCAweGZmZmViMDhiLCAweGZmZmViMDhiLAorICAgIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZTgwYTQsIDB4ZmZmZWIwOGIsIDB4ZmZmZTgwYTQsCisgICAgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlODBhNCwgMHhmZmZlYjA4YiwgMHhmZmZlYjA4YiwgMHhmZmZlODBhNCwKKyAgICAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLCAweGZmZmViMDhiLAorICAgIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWIwOGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LAorICAgIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsCisgICAgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwKKyAgICAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LAorICAgIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsCisgICAgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkODAwLCAweGZmZmVkODAxLCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkOTY0LAorICAgIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsCisgICAgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NjQsIDB4ZmZmZWQ5NjQsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwKKyAgICAweGZmZmVkOTY0LCAweGZmZmVkOTY0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LAorICAgIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsCisgICAgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwKKyAgICAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LCAweGZmZmVkYWE0LAorICAgIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsIDB4ZmZmZWRhYTQsCisgICAgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZGFhNCwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NDksIDB4ZmZmZWQ4MGIsCisgICAgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywKKyAgICAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLCAweGZmZmVhMTkzLAorICAgIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlMzAwNywgMHhmZmZlMzAwMSwgMHhmZmZlMzAwMSwgMHhmZmZlMzAwNywgMHhmZmZlMzAwNywgMHhmZmZlMzAwNSwKKyAgICAweGZmZmUzMDA1LCAweGZmZmUzMDAwLCAweGZmZmUzMDAxLCAweGZmZmUzMDBkLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZWExOTMsIDB4ZmZmZWExOTMsCisgICAgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlYTE5MywgMHhmZmZlODAyNCwKKyAgICAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LCAweGZmZmU4MDI0LAorICAgIDB4ZmZmZTgwMjQsIDB4ZmZmZTgwMjQsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwMCwgMHhmZmZlMzAwMSwgMHhmZmZlMzAwMCwgMHhmZmZlMzAwMSwgMHhmZmZlMzAwMCwKKyAgICAweGZmZmUzMDAxLCAweGZmZmUzMDAwLCAweGZmZmUzMDAxLCAweGZmZmUzMDAwLCAweGZmZmUzMDAxLCAweGZmZmUzMDAwLAorICAgIDB4ZmZmZTMwMDEsIDB4ZmZmZTMwMDAsIDB4ZmZmZTMwMDEsIDB4ZmZmZTMwMDAsIDB4ZmZmZTMwMDEsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzAwMCwgMHhmZmZlMzAwMSwgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywgMHhmZmZlMzAwYywKKyAgICAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmYTYzMDBjLCAweGZmZmUzMWMxLCAweGZmZmUzMDBjLAorICAgIDB4ZmZmZTMxYzEsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwMDQsIDB4ZmZmZTMxYzQsIDB4ZmZmZTMwMDUsIDB4ZmZmZTMwMDUsCisgICAgMHhmZmZlMzAwYywgMHhhZDdlMzAwMCwgMHhhZGZlMzAwMSwgMHhhZTdlMzAwMCwgMHhhZWZlMzAwMSwgMHhhZjdlMzAwMCwKKyAgICAweGFmZmUzMDAxLCAweGZmZmUzMjRjLCAweGZmZmUzMDBjLCAweGZmZmUzMDBjLCAweGZmZmUzMjBjLCAweGZmZmUzMjBjLAorICAgIDB4YjA3ZTMwMGMsIDB4YjBmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMyNDgsCisgICAgMHhmZmZlMzI0OSwgMHhmZmZlMzAwYywgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTY0LAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwKKyAgICAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLCAweGZmZmVkOTRiLAorICAgIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsIDB4ZmZmZWQ5NGIsCisgICAgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk0YiwgMHhmZmZlZDk2NCwgMHhmZmZlZDk2NCwgMHhmZmZlOWE5NCwKKyAgICAweGZmZmUwMDI0LCAweGZmZmYzMDA1LCAweGZmZmUzMDBjLCAweGZmZmUzMjRjLCAweGZmZmUzMjQ4LCAweGZmZmUzMjQ5LAorICAgIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsIDB4YjEyODMwMDAsIDB4YjFhYTMwMDEsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMyMGMsCisgICAgMHhmZmZmMzFjMSwgMHhmZmZlYjIwYywgMHhmZmZmMzFjMSwgMHhmZmZlMzFjYywgMHhmZmZlMzEwYywgMHhmZmZlMzEwYywKKyAgICAweGZmZmUzMTBjLCAweGZmZmUzMTBjLCAweGZmZmUzMTBjLCAweGZmZmUzMTBjLCAweGZmZmUzMTBjLCAweGZmZmUzMTBjLAorICAgIDB4ZmZmZTMxMGMsIDB4ZmZmZTMxMGMsIDB4ZmZmZjMxYzQsIDB4ZmZmZjMwMDQsIDB4YjI3ZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhiMmZlMzAwYywgMHhmZmZmMzAwNSwgMHhmZmZlMzAwYywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGIzN2ViMDAwLAorICAgIDB4ZmZmZTMwMGMsIDB4YjNmZWIwMDEsIDB4ZmZmZTMwMGMsIDB4ZmZmZWIwMGMsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLCAweGZmZmUzMDRjLAorICAgIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsIDB4ZmZmZTMwNGMsCisgICAgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywgMHhmZmZlMzA0YywKKyAgICAweGZmZmUzMDRjLCAweGI0MmMzMDAwLCAweGZmZmUzMDBjLCAweGI0YWUzMDAxLCAweGZmZmViMDBjLCAweGI1N2UzMDAwLAorICAgIDB4YjVmZTMwMDEsIDB4ZmZmZWIwMDEsIDB4YjY3ZWIwMDAsIDB4YjZmZWIwMDEsIDB4ZmZmZWIwMDEsIDB4ZmZmZTMwMDQsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwKKyAgICAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDQ0LCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0NCwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMDAyNCwgMHhmZmZlMDAyNCwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLAorICAgIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTMwNGIsIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsCisgICAgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwgMHhmZmZlMzA0YiwKKyAgICAweGZmZmUwMDI0LCAweGZmZmUwMDI0LCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUzMDRiLCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAwMjQsIDB4ZmZmZTAwMjQsIDB4ZmZmZTMyNDksIDB4ZmZmZTMyNDgsIDB4ZmZmZTMwMGMsIDB4ZmZmZTMwMGMsCisgICAgMHhmZmZlMzAwYywgMHhmZmZlMzI0OCwgMHhmZmZlMzI0OCwgMHhmZmZlMDAyNCwgMHhmZmZlMzAwYiwgMHhmZmZlMzAwYiwKKyAgICAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUzMDBiLCAweGZmZmUwMDI0LAorICAgIDB4ZmZmZTAyYTQsIDB4ZmZmZTAyYTQsIDB4ZmZmZTAyYTQsIDB4ZmZmZTAyYTQsIDB4ZmZmZTAyYTQsIDB4ZmZmZTAyYTQsCisgICAgMHhmZmZlMDJhNCwgMHhmZmZlMDJhNCwgMHhmZmZlMDJhNCwgMHhmZmZlMzAxMywgMHhmZmZlMzAxMywgMHhmZmZlMzAxMywKKyAgICAweGZmZmUzMDExLCAweGZmZmUzMDIyLCAweGZmZmUxYWE0LCAweGZmZmUxYWE0LAogfTsKLWV4dGVybiBjb25zdCBGWF9XQ0hBUiBnc19GWF9UZXh0TGF5b3V0X1ZlcnRpY2FsTWlycm9yWzY0XSA9IHsKLSAgICAweEZFMzMsIDB4RkUzMiwgMHhGRTMxLCAweEZFNDEsIDB4RkU0MiwgMHhGRTQzLCAweEZFNDQsIDB4RkUzRiwgMHhGRTQwLCAweEZFM0QsIDB4RkUzRSwgMHhGRTQxLCAweEZFNDIsIDB4RkU0MywgMHhGRTQ0LCAweEZFM0IsCi0gICAgMHhGRTNDLCAweEZFMzksIDB4RkUzQSwgMHhGRTM0LCAweEZFMzUsIDB4RkUzNiwgMHhGRTM3LCAweEZFMzgsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLAotICAgIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwKLSAgICAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsCisKK2NvbnN0IHNpemVfdCBrVGV4dExheW91dENvZGVQcm9wZXJ0aWVzU2l6ZSA9CisgICAgRlhfQXJyYXlTaXplKGtUZXh0TGF5b3V0Q29kZVByb3BlcnRpZXMpOworCitjb25zdCBGWF9XQ0hBUiBrRlhUZXh0TGF5b3V0VmVydGljYWxNaXJyb3JbXSA9IHsKKyAgICAweEZFMzMsIDB4RkUzMiwgMHhGRTMxLCAweEZFNDEsIDB4RkU0MiwgMHhGRTQzLCAweEZFNDQsIDB4RkUzRiwKKyAgICAweEZFNDAsIDB4RkUzRCwgMHhGRTNFLCAweEZFNDEsIDB4RkU0MiwgMHhGRTQzLCAweEZFNDQsIDB4RkUzQiwKKyAgICAweEZFM0MsIDB4RkUzOSwgMHhGRTNBLCAweEZFMzQsIDB4RkUzNSwgMHhGRTM2LCAweEZFMzcsIDB4RkUzOCwKKyAgICAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwKKyAgICAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwKKyAgICAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwKKyAgICAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwKKyAgICAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwKIH07Ci1leHRlcm4gY29uc3QgRlhfV0NIQVIgZ3NfRlhfVGV4dExheW91dF9CaWRpTWlycm9yWzUxMl0gPSB7Ci0gICAgMHgwMDI5LCAweDAwMjgsIDB4MDAzRSwgMHgwMDNDLCAweDAwNUQsIDB4MDA1QiwgMHgwMDdELCAweDAwN0IsIDB4MDBCQiwgMHgwMEFCLCAweDBGM0IsIDB4MEYzQSwgMHgwRjNELCAweDBGM0MsIDB4MTY5QywgMHgxNjlCLAotICAgIDB4MjAxOSwgMHgyMDE4LCAweDIwMUQsIDB4MjAxQywgMHgyMDNBLCAweDIwMzksIDB4MjA0NiwgMHgyMDQ1LCAweDIwN0UsIDB4MjA3RCwgMHgyMDhFLCAweDIwOEQsIDB4MjIwQiwgMHgyMjBDLCAweDIyMEQsIDB4MjIwOCwKLSAgICAweDIyMDksIDB4MjIwQSwgMHgyOUY1LCAweDIyM0QsIDB4MjIzQywgMHgyMkNELCAweDIyNTMsIDB4MjI1MiwgMHgyMjU1LCAweDIyNTQsIDB4MjI2NSwgMHgyMjY0LCAweDIyNjcsIDB4MjI2NiwgMHgyMjY5LCAweDIyNjgsCi0gICAgMHgyMjZCLCAweDIyNkEsIDB4MjI2RiwgMHgyMjZFLCAweDIyNzEsIDB4MjI3MCwgMHgyMjczLCAweDIyNzIsIDB4MjI3NSwgMHgyMjc0LCAweDIyNzcsIDB4MjI3NiwgMHgyMjc5LCAweDIyNzgsIDB4MjI3QiwgMHgyMjdBLAotICAgIDB4MjI3RCwgMHgyMjdDLCAweDIyN0YsIDB4MjI3RSwgMHgyMjgxLCAweDIyODAsIDB4MjI4MywgMHgyMjgyLCAweDIyODUsIDB4MjI4NCwgMHgyMjg3LCAweDIyODYsIDB4MjI4OSwgMHgyMjg4LCAweDIyOEIsIDB4MjI4QSwKLSAgICAweDIyOTAsIDB4MjI4RiwgMHgyMjkyLCAweDIyOTEsIDB4MjlCOCwgMHgyMkEzLCAweDIyQTIsIDB4MkFERSwgMHgyQUU0LCAweDJBRTMsIDB4MkFFNSwgMHgyMkIxLCAweDIyQjAsIDB4MjJCMywgMHgyMkIyLCAweDIyQjUsCi0gICAgMHgyMkI0LCAweDIyQjcsIDB4MjJCNiwgMHgyMkNBLCAweDIyQzksIDB4MjJDQywgMHgyMkNCLCAweDIyNDMsIDB4MjJEMSwgMHgyMkQwLCAweDIyRDcsIDB4MjJENiwgMHgyMkQ5LCAweDIyRDgsIDB4MjJEQiwgMHgyMkRBLAotICAgIDB4MjJERCwgMHgyMkRDLCAweDIyREYsIDB4MjJERSwgMHgyMkUxLCAweDIyRTAsIDB4MjJFMywgMHgyMkUyLCAweDIyRTUsIDB4MjJFNCwgMHgyMkU3LCAweDIyRTYsIDB4MjJFOSwgMHgyMkU4LCAweDIyRUIsIDB4MjJFQSwKLSAgICAweDIyRUQsIDB4MjJFQywgMHgyMkYxLCAweDIyRjAsIDB4MjJGQSwgMHgyMkZCLCAweDIyRkMsIDB4MjJGRCwgMHgyMkZFLCAweDIyRjIsIDB4MjJGMywgMHgyMkY0LCAweDIyRjYsIDB4MjJGNywgMHgyMzA5LCAweDIzMDgsCi0gICAgMHgyMzBCLCAweDIzMEEsIDB4MjMyQSwgMHgyMzI5LCAweDI3NjksIDB4Mjc2OCwgMHgyNzZCLCAweDI3NkEsIDB4Mjc2RCwgMHgyNzZDLCAweDI3NkYsIDB4Mjc2RSwgMHgyNzcxLCAweDI3NzAsIDB4Mjc3MywgMHgyNzcyLAotICAgIDB4Mjc3NSwgMHgyNzc0LCAweDI3QzQsIDB4MjdDMywgMHgyN0M2LCAweDI3QzUsIDB4MjdDOSwgMHgyN0M4LCAweDI3RDYsIDB4MjdENSwgMHgyN0RFLCAweDI3REQsIDB4MjdFMywgMHgyN0UyLCAweDI3RTUsIDB4MjdFNCwKLSAgICAweDI3RTcsIDB4MjdFNiwgMHgyN0U5LCAweDI3RTgsIDB4MjdFQiwgMHgyN0VBLCAweDI3RUQsIDB4MjdFQywgMHgyN0VGLCAweDI3RUUsIDB4Mjk4NCwgMHgyOTgzLCAweDI5ODYsIDB4Mjk4NSwgMHgyOTg4LCAweDI5ODcsCi0gICAgMHgyOThBLCAweDI5ODksIDB4Mjk4QywgMHgyOThCLCAweDI5OTAsIDB4Mjk4RiwgMHgyOThFLCAweDI5OEQsIDB4Mjk5MiwgMHgyOTkxLCAweDI5OTQsIDB4Mjk5MywgMHgyOTk2LCAweDI5OTUsIDB4Mjk5OCwgMHgyOTk3LAotICAgIDB4MjI5OCwgMHgyOUMxLCAweDI5QzAsIDB4MjlDNSwgMHgyOUM0LCAweDI5RDAsIDB4MjlDRiwgMHgyOUQyLCAweDI5RDEsIDB4MjlENSwgMHgyOUQ0LCAweDI5RDksIDB4MjlEOCwgMHgyOURCLCAweDI5REEsIDB4MjIxNSwKLSAgICAweDI5RjksIDB4MjlGOCwgMHgyOUZELCAweDI5RkMsIDB4MkEyQywgMHgyQTJCLCAweDJBMkUsIDB4MkEyRCwgMHgyQTM1LCAweDJBMzQsIDB4MkEzRCwgMHgyQTNDLCAweDJBNjUsIDB4MkE2NCwgMHgyQTdBLCAweDJBNzksCi0gICAgMHgyQTdFLCAweDJBN0QsIDB4MkE4MCwgMHgyQTdGLCAweDJBODIsIDB4MkE4MSwgMHgyQTg0LCAweDJBODMsIDB4MkE4QywgMHgyQThCLCAweDJBOTIsIDB4MkE5MSwgMHgyQTk0LCAweDJBOTMsIDB4MkE5NiwgMHgyQTk1LAotICAgIDB4MkE5OCwgMHgyQTk3LCAweDJBOUEsIDB4MkE5OSwgMHgyQTlDLCAweDJBOUIsIDB4MkFBMiwgMHgyQUExLCAweDJBQTcsIDB4MkFBNiwgMHgyQUE5LCAweDJBQTgsIDB4MkFBQiwgMHgyQUFBLCAweDJBQUQsIDB4MkFBQywKLSAgICAweDJBQjAsIDB4MkFBRiwgMHgyQUI0LCAweDJBQjMsIDB4MkFCQywgMHgyQUJCLCAweDJBQkUsIDB4MkFCRCwgMHgyQUMwLCAweDJBQkYsIDB4MkFDMiwgMHgyQUMxLCAweDJBQzQsIDB4MkFDMywgMHgyQUM2LCAweDJBQzUsCi0gICAgMHgyQUNFLCAweDJBQ0QsIDB4MkFEMCwgMHgyQUNGLCAweDJBRDIsIDB4MkFEMSwgMHgyQUQ0LCAweDJBRDMsIDB4MkFENiwgMHgyQUQ1LCAweDIyQTYsIDB4MjJBOSwgMHgyMkE4LCAweDIyQUIsIDB4MkFFRCwgMHgyQUVDLAotICAgIDB4MkFGOCwgMHgyQUY3LCAweDJBRkEsIDB4MkFGOSwgMHgyRTAzLCAweDJFMDIsIDB4MkUwNSwgMHgyRTA0LCAweDJFMEEsIDB4MkUwOSwgMHgyRTBELCAweDJFMEMsIDB4MkUxRCwgMHgyRTFDLCAweDJFMjEsIDB4MkUyMCwKLSAgICAweDJFMjMsIDB4MkUyMiwgMHgyRTI1LCAweDJFMjQsIDB4MkUyNywgMHgyRTI2LCAweDJFMjksIDB4MkUyOCwgMHgzMDA5LCAweDMwMDgsIDB4MzAwQiwgMHgzMDBBLCAweDMwMEQsIDB4MzAwQywgMHgzMDBGLCAweDMwMEUsCi0gICAgMHgzMDExLCAweDMwMTAsIDB4MzAxNSwgMHgzMDE0LCAweDMwMTcsIDB4MzAxNiwgMHgzMDE5LCAweDMwMTgsIDB4MzAxQiwgMHgzMDFBLCAweEZFNUEsIDB4RkU1OSwgMHhGRTVDLCAweEZFNUIsIDB4RkU1RSwgMHhGRTVELAotICAgIDB4RkU2NSwgMHhGRTY0LCAweEZGMDksIDB4RkYwOCwgMHhGRjFFLCAweEZGMUMsIDB4RkYzRCwgMHhGRjNCLCAweEZGNUQsIDB4RkY1QiwgMHhGRjYwLCAweEZGNUYsIDB4RkY2MywgMHhGRjYyLCAweEZGRkYsIDB4RkVGRiwKLSAgICAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsCi0gICAgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLAotICAgIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwKLSAgICAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsCi0gICAgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLAotICAgIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwKLSAgICAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsCi0gICAgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLAotICAgIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwKK2NvbnN0IHNpemVfdCBrRlhUZXh0TGF5b3V0VmVydGljYWxNaXJyb3JTaXplID0KKyAgICBGWF9BcnJheVNpemUoa0ZYVGV4dExheW91dFZlcnRpY2FsTWlycm9yKTsKKworY29uc3QgRlhfV0NIQVIga0ZYVGV4dExheW91dEJpZGlNaXJyb3JbXSA9IHsKKyAgICAweDAwMjksIDB4MDAyOCwgMHgwMDNFLCAweDAwM0MsIDB4MDA1RCwgMHgwMDVCLCAweDAwN0QsIDB4MDA3QiwgMHgwMEJCLAorICAgIDB4MDBBQiwgMHgwRjNCLCAweDBGM0EsIDB4MEYzRCwgMHgwRjNDLCAweDE2OUMsIDB4MTY5QiwgMHgyMDE5LCAweDIwMTgsCisgICAgMHgyMDFELCAweDIwMUMsIDB4MjAzQSwgMHgyMDM5LCAweDIwNDYsIDB4MjA0NSwgMHgyMDdFLCAweDIwN0QsIDB4MjA4RSwKKyAgICAweDIwOEQsIDB4MjIwQiwgMHgyMjBDLCAweDIyMEQsIDB4MjIwOCwgMHgyMjA5LCAweDIyMEEsIDB4MjlGNSwgMHgyMjNELAorICAgIDB4MjIzQywgMHgyMkNELCAweDIyNTMsIDB4MjI1MiwgMHgyMjU1LCAweDIyNTQsIDB4MjI2NSwgMHgyMjY0LCAweDIyNjcsCisgICAgMHgyMjY2LCAweDIyNjksIDB4MjI2OCwgMHgyMjZCLCAweDIyNkEsIDB4MjI2RiwgMHgyMjZFLCAweDIyNzEsIDB4MjI3MCwKKyAgICAweDIyNzMsIDB4MjI3MiwgMHgyMjc1LCAweDIyNzQsIDB4MjI3NywgMHgyMjc2LCAweDIyNzksIDB4MjI3OCwgMHgyMjdCLAorICAgIDB4MjI3QSwgMHgyMjdELCAweDIyN0MsIDB4MjI3RiwgMHgyMjdFLCAweDIyODEsIDB4MjI4MCwgMHgyMjgzLCAweDIyODIsCisgICAgMHgyMjg1LCAweDIyODQsIDB4MjI4NywgMHgyMjg2LCAweDIyODksIDB4MjI4OCwgMHgyMjhCLCAweDIyOEEsIDB4MjI5MCwKKyAgICAweDIyOEYsIDB4MjI5MiwgMHgyMjkxLCAweDI5QjgsIDB4MjJBMywgMHgyMkEyLCAweDJBREUsIDB4MkFFNCwgMHgyQUUzLAorICAgIDB4MkFFNSwgMHgyMkIxLCAweDIyQjAsIDB4MjJCMywgMHgyMkIyLCAweDIyQjUsIDB4MjJCNCwgMHgyMkI3LCAweDIyQjYsCisgICAgMHgyMkNBLCAweDIyQzksIDB4MjJDQywgMHgyMkNCLCAweDIyNDMsIDB4MjJEMSwgMHgyMkQwLCAweDIyRDcsIDB4MjJENiwKKyAgICAweDIyRDksIDB4MjJEOCwgMHgyMkRCLCAweDIyREEsIDB4MjJERCwgMHgyMkRDLCAweDIyREYsIDB4MjJERSwgMHgyMkUxLAorICAgIDB4MjJFMCwgMHgyMkUzLCAweDIyRTIsIDB4MjJFNSwgMHgyMkU0LCAweDIyRTcsIDB4MjJFNiwgMHgyMkU5LCAweDIyRTgsCisgICAgMHgyMkVCLCAweDIyRUEsIDB4MjJFRCwgMHgyMkVDLCAweDIyRjEsIDB4MjJGMCwgMHgyMkZBLCAweDIyRkIsIDB4MjJGQywKKyAgICAweDIyRkQsIDB4MjJGRSwgMHgyMkYyLCAweDIyRjMsIDB4MjJGNCwgMHgyMkY2LCAweDIyRjcsIDB4MjMwOSwgMHgyMzA4LAorICAgIDB4MjMwQiwgMHgyMzBBLCAweDIzMkEsIDB4MjMyOSwgMHgyNzY5LCAweDI3NjgsIDB4Mjc2QiwgMHgyNzZBLCAweDI3NkQsCisgICAgMHgyNzZDLCAweDI3NkYsIDB4Mjc2RSwgMHgyNzcxLCAweDI3NzAsIDB4Mjc3MywgMHgyNzcyLCAweDI3NzUsIDB4Mjc3NCwKKyAgICAweDI3QzQsIDB4MjdDMywgMHgyN0M2LCAweDI3QzUsIDB4MjdDOSwgMHgyN0M4LCAweDI3RDYsIDB4MjdENSwgMHgyN0RFLAorICAgIDB4MjdERCwgMHgyN0UzLCAweDI3RTIsIDB4MjdFNSwgMHgyN0U0LCAweDI3RTcsIDB4MjdFNiwgMHgyN0U5LCAweDI3RTgsCisgICAgMHgyN0VCLCAweDI3RUEsIDB4MjdFRCwgMHgyN0VDLCAweDI3RUYsIDB4MjdFRSwgMHgyOTg0LCAweDI5ODMsIDB4Mjk4NiwKKyAgICAweDI5ODUsIDB4Mjk4OCwgMHgyOTg3LCAweDI5OEEsIDB4Mjk4OSwgMHgyOThDLCAweDI5OEIsIDB4Mjk5MCwgMHgyOThGLAorICAgIDB4Mjk4RSwgMHgyOThELCAweDI5OTIsIDB4Mjk5MSwgMHgyOTk0LCAweDI5OTMsIDB4Mjk5NiwgMHgyOTk1LCAweDI5OTgsCisgICAgMHgyOTk3LCAweDIyOTgsIDB4MjlDMSwgMHgyOUMwLCAweDI5QzUsIDB4MjlDNCwgMHgyOUQwLCAweDI5Q0YsIDB4MjlEMiwKKyAgICAweDI5RDEsIDB4MjlENSwgMHgyOUQ0LCAweDI5RDksIDB4MjlEOCwgMHgyOURCLCAweDI5REEsIDB4MjIxNSwgMHgyOUY5LAorICAgIDB4MjlGOCwgMHgyOUZELCAweDI5RkMsIDB4MkEyQywgMHgyQTJCLCAweDJBMkUsIDB4MkEyRCwgMHgyQTM1LCAweDJBMzQsCisgICAgMHgyQTNELCAweDJBM0MsIDB4MkE2NSwgMHgyQTY0LCAweDJBN0EsIDB4MkE3OSwgMHgyQTdFLCAweDJBN0QsIDB4MkE4MCwKKyAgICAweDJBN0YsIDB4MkE4MiwgMHgyQTgxLCAweDJBODQsIDB4MkE4MywgMHgyQThDLCAweDJBOEIsIDB4MkE5MiwgMHgyQTkxLAorICAgIDB4MkE5NCwgMHgyQTkzLCAweDJBOTYsIDB4MkE5NSwgMHgyQTk4LCAweDJBOTcsIDB4MkE5QSwgMHgyQTk5LCAweDJBOUMsCisgICAgMHgyQTlCLCAweDJBQTIsIDB4MkFBMSwgMHgyQUE3LCAweDJBQTYsIDB4MkFBOSwgMHgyQUE4LCAweDJBQUIsIDB4MkFBQSwKKyAgICAweDJBQUQsIDB4MkFBQywgMHgyQUIwLCAweDJBQUYsIDB4MkFCNCwgMHgyQUIzLCAweDJBQkMsIDB4MkFCQiwgMHgyQUJFLAorICAgIDB4MkFCRCwgMHgyQUMwLCAweDJBQkYsIDB4MkFDMiwgMHgyQUMxLCAweDJBQzQsIDB4MkFDMywgMHgyQUM2LCAweDJBQzUsCisgICAgMHgyQUNFLCAweDJBQ0QsIDB4MkFEMCwgMHgyQUNGLCAweDJBRDIsIDB4MkFEMSwgMHgyQUQ0LCAweDJBRDMsIDB4MkFENiwKKyAgICAweDJBRDUsIDB4MjJBNiwgMHgyMkE5LCAweDIyQTgsIDB4MjJBQiwgMHgyQUVELCAweDJBRUMsIDB4MkFGOCwgMHgyQUY3LAorICAgIDB4MkFGQSwgMHgyQUY5LCAweDJFMDMsIDB4MkUwMiwgMHgyRTA1LCAweDJFMDQsIDB4MkUwQSwgMHgyRTA5LCAweDJFMEQsCisgICAgMHgyRTBDLCAweDJFMUQsIDB4MkUxQywgMHgyRTIxLCAweDJFMjAsIDB4MkUyMywgMHgyRTIyLCAweDJFMjUsIDB4MkUyNCwKKyAgICAweDJFMjcsIDB4MkUyNiwgMHgyRTI5LCAweDJFMjgsIDB4MzAwOSwgMHgzMDA4LCAweDMwMEIsIDB4MzAwQSwgMHgzMDBELAorICAgIDB4MzAwQywgMHgzMDBGLCAweDMwMEUsIDB4MzAxMSwgMHgzMDEwLCAweDMwMTUsIDB4MzAxNCwgMHgzMDE3LCAweDMwMTYsCisgICAgMHgzMDE5LCAweDMwMTgsIDB4MzAxQiwgMHgzMDFBLCAweEZFNUEsIDB4RkU1OSwgMHhGRTVDLCAweEZFNUIsIDB4RkU1RSwKKyAgICAweEZFNUQsIDB4RkU2NSwgMHhGRTY0LCAweEZGMDksIDB4RkYwOCwgMHhGRjFFLCAweEZGMUMsIDB4RkYzRCwgMHhGRjNCLAorICAgIDB4RkY1RCwgMHhGRjVCLCAweEZGNjAsIDB4RkY1RiwgMHhGRjYzLCAweEZGNjIsIDB4RkZGRiwgMHhGRUZGLCAweEZFRkYsCisgICAgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwKKyAgICAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLAorICAgIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsCisgICAgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwKKyAgICAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLAorICAgIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsCisgICAgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwKKyAgICAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLAorICAgIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsCisgICAgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwKKyAgICAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLAorICAgIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsCisgICAgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwKKyAgICAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLAorICAgIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsCisgICAgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsCiB9OworCitjb25zdCBzaXplX3Qga0ZYVGV4dExheW91dEJpZGlNaXJyb3JTaXplID0KKyAgICBGWF9BcnJheVNpemUoa0ZYVGV4dExheW91dEJpZGlNaXJyb3IpOwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhfdW5pY29kZS5jcHAgYi9jb3JlL3NyYy9meGNydC9meF91bmljb2RlLmNwcAppbmRleCBhYWM2MTQyLi4xNDBiYWIwIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meF91bmljb2RlLmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meF91bmljb2RlLmNwcApAQCAtMSw2NSArMSw2NyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGNydC9meF9leHQuaCIKLWV4dGVybiBjb25zdCBGWF9EV09SRCBnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWzY1NTM2XTsKLWV4dGVybiBjb25zdCBGWF9XQ0hBUiBnc19GWF9UZXh0TGF5b3V0X1ZlcnRpY2FsTWlycm9yWzY0XTsKLWV4dGVybiBjb25zdCBGWF9XQ0hBUiBnc19GWF9UZXh0TGF5b3V0X0JpZGlNaXJyb3JbNTEyXTsKLUZYX0RXT1JEIEZYX0dldFVuaWNvZGVQcm9wZXJ0aWVzKEZYX1dDSEFSIHdjaCkKLXsKLSAgICByZXR1cm4gZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdOworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF91Y2QuaCIKKworRlhfRFdPUkQgRlhfR2V0VW5pY29kZVByb3BlcnRpZXMoRlhfV0NIQVIgd2NoKSB7CisgIHNpemVfdCBpZHggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHdjaCk7CisgIGlmIChpZHggPCBrVGV4dExheW91dENvZGVQcm9wZXJ0aWVzU2l6ZSkKKyAgICByZXR1cm4ga1RleHRMYXlvdXRDb2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdOworICByZXR1cm4gMDsKIH0KLUZYX0JPT0wgRlhfSXNDdHJsQ29kZShGWF9XQ0hBUiBjaCkKLXsKLSAgICBGWF9EV09SRCBkd1JldCA9IChnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKWNoXSAmIEZYX0NIQVJUWVBFQklUU01BU0spOwotICAgIHJldHVybiBkd1JldCA9PSBGWF9DSEFSVFlQRV9UYWIgfHwgZHdSZXQgPT0gRlhfQ0hBUlRZUEVfQ29udHJvbDsKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCitGWF9CT09MIEZYX0lzQ3RybENvZGUoRlhfV0NIQVIgY2gpIHsKKyAgRlhfRFdPUkQgZHdSZXQgPSAoRlhfR2V0VW5pY29kZVByb3BlcnRpZXMoY2gpICYgRlhfQ0hBUlRZUEVCSVRTTUFTSyk7CisgIHJldHVybiBkd1JldCA9PSBGWF9DSEFSVFlQRV9UYWIgfHwgZHdSZXQgPT0gRlhfQ0hBUlRZUEVfQ29udHJvbDsKIH0KLUZYX0JPT0wgRlhfSXNSb3RhdGlvbkNvZGUoRlhfV0NIQVIgY2gpCi17Ci0gICAgcmV0dXJuIChnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKWNoXSAmIDB4ODAwMCkgIT0gMDsKLX0KLUZYX0JPT0wgRlhfSXNDb21iaW5hdGlvbkNoYXIoRlhfV0NIQVIgd2NoKQotewotICAgIEZYX0RXT1JEIGR3UHJvcHMgPSAoZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdICYgRlhfQ0hBUlRZUEVCSVRTTUFTSyk7Ci0gICAgcmV0dXJuIGR3UHJvcHMgPT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb247Ci19Ci1GWF9CT09MCUZYX0lzQmlkaUNoYXIoRlhfV0NIQVIgd2NoKQotewotICAgIEZYX0RXT1JEIGR3UHJvcHMgPSBnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF07Ci0gICAgRlhfSU5UMzIgaUJpZGlDbHMgPSAoZHdQcm9wcyAmIEZYX0JJRElDTEFTU0JJVFNNQVNLKSA+PiBGWF9CSURJQ0xBU1NCSVRTOwotICAgIHJldHVybiAoRlhfQklESUNMQVNTX1IgPT0gaUJpZGlDbHMgfHwgRlhfQklESUNMQVNTX0FMID09IGlCaWRpQ2xzKTsKLX0KLUZYX1dDSEFSIEZYX0dldE1pcnJvckNoYXIoRlhfV0NIQVIgd2NoLCBGWF9CT09MIGJSVEwsIEZYX0JPT0wgYlZlcnRpY2FsKQotewotICAgIEZYX0RXT1JEIGR3UHJvcHMgPSBnc19GWF9UZXh0TGF5b3V0X0NvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF07Ci0gICAgRlhfRFdPUkQgZHdUZW1wID0gKGR3UHJvcHMgJiAweEZGODAwMDAwKTsKLSAgICBpZiAoYlJUTCAmJiBkd1RlbXAgPCAweEZGODAwMDAwKSB7Ci0gICAgICAgIHdjaCA9IGdzX0ZYX1RleHRMYXlvdXRfQmlkaU1pcnJvcltkd1RlbXAgPj4gMjNdOwotICAgICAgICBkd1Byb3BzID0gZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCitGWF9XQ0hBUiBGWF9HZXRNaXJyb3JDaGFyKEZYX1dDSEFSIHdjaCwgRlhfQk9PTCBiUlRMLCBGWF9CT09MIGJWZXJ0aWNhbCkgeworICBGWF9EV09SRCBkd1Byb3BzID0gRlhfR2V0VW5pY29kZVByb3BlcnRpZXMod2NoKTsKKyAgRlhfRFdPUkQgZHdUZW1wID0gKGR3UHJvcHMgJiAweEZGODAwMDAwKTsKKyAgaWYgKGJSVEwgJiYgZHdUZW1wIDwgMHhGRjgwMDAwMCkgeworICAgIHNpemVfdCBpZHggPSBkd1RlbXAgPj4gMjM7CisgICAgaWYgKGlkeCA8IGtGWFRleHRMYXlvdXRCaWRpTWlycm9yU2l6ZSkgeworICAgICAgd2NoID0ga0ZYVGV4dExheW91dEJpZGlNaXJyb3JbaWR4XTsKKyAgICAgIGR3UHJvcHMgPSBGWF9HZXRVbmljb2RlUHJvcGVydGllcyh3Y2gpOwogICAgIH0KLSAgICBpZiAoYlZlcnRpY2FsKSB7Ci0gICAgICAgIGR3VGVtcCA9IChkd1Byb3BzICYgMHgwMDdFMDAwMCk7Ci0gICAgICAgIGlmIChkd1RlbXAgPCAweDAwN0UwMDAwKSB7Ci0gICAgICAgICAgICB3Y2ggPSBnc19GWF9UZXh0TGF5b3V0X1ZlcnRpY2FsTWlycm9yW2R3VGVtcCA+PiAxN107Ci0gICAgICAgIH0KKyAgfQorICBpZiAoYlZlcnRpY2FsKSB7CisgICAgZHdUZW1wID0gKGR3UHJvcHMgJiAweDAwN0UwMDAwKTsKKyAgICBpZiAoZHdUZW1wIDwgMHgwMDdFMDAwMCkgeworICAgICAgc2l6ZV90IGlkeCA9IGR3VGVtcCA+PiAxNzsKKyAgICAgIGlmIChpZHggPCBrRlhUZXh0TGF5b3V0VmVydGljYWxNaXJyb3JTaXplKQorICAgICAgICB3Y2ggPSBrRlhUZXh0TGF5b3V0VmVydGljYWxNaXJyb3JbaWR4XTsKICAgICB9Ci0gICAgcmV0dXJuIHdjaDsKKyAgfQorICByZXR1cm4gd2NoOwogfQotRlhfV0NIQVIgRlhfR2V0TWlycm9yQ2hhcihGWF9XQ0hBUiB3Y2gsIEZYX0RXT1JEIGR3UHJvcHMsIEZYX0JPT0wgYlJUTCwgRlhfQk9PTCBiVmVydGljYWwpCi17Ci0gICAgRlhfRFdPUkQgZHdUZW1wID0gKGR3UHJvcHMgJiAweEZGODAwMDAwKTsKLSAgICBpZiAoYlJUTCAmJiBkd1RlbXAgPCAweEZGODAwMDAwKSB7Ci0gICAgICAgIHdjaCA9IGdzX0ZYX1RleHRMYXlvdXRfQmlkaU1pcnJvcltkd1RlbXAgPj4gMjNdOwotICAgICAgICBkd1Byb3BzID0gZ3NfRlhfVGV4dExheW91dF9Db2RlUHJvcGVydGllc1soRlhfV09SRCl3Y2hdOworCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK0ZYX1dDSEFSIEZYX0dldE1pcnJvckNoYXIoRlhfV0NIQVIgd2NoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1Byb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSVEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZlcnRpY2FsKSB7CisgIEZYX0RXT1JEIGR3VGVtcCA9IChkd1Byb3BzICYgMHhGRjgwMDAwMCk7CisgIGlmIChiUlRMICYmIGR3VGVtcCA8IDB4RkY4MDAwMDApIHsKKyAgICBzaXplX3QgaWR4ID0gZHdUZW1wID4+IDIzOworICAgIGlmIChpZHggPCBrRlhUZXh0TGF5b3V0QmlkaU1pcnJvclNpemUpIHsKKyAgICAgIHdjaCA9IGtGWFRleHRMYXlvdXRCaWRpTWlycm9yW2lkeF07CisgICAgICBkd1Byb3BzID0gRlhfR2V0VW5pY29kZVByb3BlcnRpZXMod2NoKTsKICAgICB9Ci0gICAgaWYgKGJWZXJ0aWNhbCkgewotICAgICAgICBkd1RlbXAgPSAoZHdQcm9wcyAmIDB4MDA3RTAwMDApOwotICAgICAgICBpZiAoZHdUZW1wIDwgMHgwMDdFMDAwMCkgewotICAgICAgICAgICAgd2NoID0gZ3NfRlhfVGV4dExheW91dF9WZXJ0aWNhbE1pcnJvcltkd1RlbXAgPj4gMTddOwotICAgICAgICB9CisgIH0KKyAgaWYgKGJWZXJ0aWNhbCkgeworICAgIGR3VGVtcCA9IChkd1Byb3BzICYgMHgwMDdFMDAwMCk7CisgICAgaWYgKGR3VGVtcCA8IDB4MDA3RTAwMDApIHsKKyAgICAgIHNpemVfdCBpZHggPSBkd1RlbXAgPj4gMTc7CisgICAgICBpZiAoaWR4IDwga0ZYVGV4dExheW91dFZlcnRpY2FsTWlycm9yU2l6ZSkKKyAgICAgICAgd2NoID0ga0ZYVGV4dExheW91dFZlcnRpY2FsTWlycm9yW2lkeF07CiAgICAgfQotICAgIHJldHVybiB3Y2g7CisgIH0KKyAgcmV0dXJuIHdjaDsKIH0KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X3htbF9jb21wb3Nlci5jcHAgYi9jb3JlL3NyYy9meGNydC9meF94bWxfY29tcG9zZXIuY3BwCmluZGV4IDk3YzVkZmQuLjVlMGIzMDQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X3htbF9jb21wb3Nlci5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhfeG1sX2NvbXBvc2VyLmNwcApAQCAtNCwzNyArNCw0MCBAQAogCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGNydC9meF94bWwuaCIKICNpbmNsdWRlICJ4bWxfaW50LmgiCi12b2lkIEZYX1hNTF9TcGxpdFF1YWxpZmllZE5hbWUoRlhfQlNUUiBic0Z1bGxOYW1lLCBDRlhfQnl0ZVN0cmluZ0MgJmJzU3BhY2UsIENGWF9CeXRlU3RyaW5nQyAmYnNOYW1lKQotewotICAgIGlmIChic0Z1bGxOYW1lLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm47CisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfeG1sLmgiCisKK3ZvaWQgRlhfWE1MX1NwbGl0UXVhbGlmaWVkTmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRnVsbE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDJiBic1NwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQyYgYnNOYW1lKSB7CisgIGlmIChic0Z1bGxOYW1lLklzRW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorICBpbnQzMl90IGlTdGFydCA9IDA7CisgIGZvciAoOyBpU3RhcnQgPCBic0Z1bGxOYW1lLkdldExlbmd0aCgpOyBpU3RhcnQrKykgeworICAgIGlmIChic0Z1bGxOYW1lLkdldEF0KGlTdGFydCkgPT0gJzonKSB7CisgICAgICBicmVhazsKICAgICB9Ci0gICAgRlhfSU5UMzIgaVN0YXJ0ID0gMDsKLSAgICBmb3IgKDsgaVN0YXJ0IDwgYnNGdWxsTmFtZS5HZXRMZW5ndGgoKTsgaVN0YXJ0ICsrKSB7Ci0gICAgICAgIGlmIChic0Z1bGxOYW1lLkdldEF0KGlTdGFydCkgPT0gJzonKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoaVN0YXJ0ID49IGJzRnVsbE5hbWUuR2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgYnNOYW1lID0gYnNGdWxsTmFtZTsKLSAgICB9IGVsc2UgewotICAgICAgICBic1NwYWNlID0gQ0ZYX0J5dGVTdHJpbmdDKGJzRnVsbE5hbWUuR2V0Q1N0cigpLCBpU3RhcnQpOwotICAgICAgICBpU3RhcnQgKys7Ci0gICAgICAgIGJzTmFtZSA9IENGWF9CeXRlU3RyaW5nQyhic0Z1bGxOYW1lLkdldENTdHIoKSArIGlTdGFydCwgYnNGdWxsTmFtZS5HZXRMZW5ndGgoKSAtIGlTdGFydCk7Ci0gICAgfQorICB9CisgIGlmIChpU3RhcnQgPj0gYnNGdWxsTmFtZS5HZXRMZW5ndGgoKSkgeworICAgIGJzTmFtZSA9IGJzRnVsbE5hbWU7CisgIH0gZWxzZSB7CisgICAgYnNTcGFjZSA9IENGWF9CeXRlU3RyaW5nQyhic0Z1bGxOYW1lLkdldENTdHIoKSwgaVN0YXJ0KTsKKyAgICBpU3RhcnQrKzsKKyAgICBic05hbWUgPSBDRlhfQnl0ZVN0cmluZ0MoYnNGdWxsTmFtZS5HZXRDU3RyKCkgKyBpU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzRnVsbE5hbWUuR2V0TGVuZ3RoKCkgLSBpU3RhcnQpOworICB9CiB9Ci12b2lkIENYTUxfRWxlbWVudDo6U2V0VGFnKEZYX0JTVFIgcVNwYWNlLCBGWF9CU1RSIHRhZ25hbWUpCi17Ci0gICAgbV9RU3BhY2VOYW1lID0gcVNwYWNlOwotICAgIG1fVGFnTmFtZSA9IHRhZ25hbWU7Cit2b2lkIENYTUxfRWxlbWVudDo6U2V0VGFnKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcVNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRhZ25hbWUpIHsKKyAgbV9RU3BhY2VOYW1lID0gcVNwYWNlOworICBtX1RhZ05hbWUgPSB0YWduYW1lOwogfQotdm9pZCBDWE1MX0VsZW1lbnQ6OlNldFRhZyhGWF9CU1RSIHFUYWdOYW1lKQotewotICAgIEFTU0VSVCghcVRhZ05hbWUuSXNFbXB0eSgpKTsKLSAgICBDRlhfQnl0ZVN0cmluZ0MgYnNTcGFjZSwgYnNOYW1lOwotICAgIEZYX1hNTF9TcGxpdFF1YWxpZmllZE5hbWUocVRhZ05hbWUsIGJzU3BhY2UsIGJzTmFtZSk7Ci0gICAgbV9RU3BhY2VOYW1lID0gYnNTcGFjZTsKLSAgICBtX1RhZ05hbWUgPSBic05hbWU7Cit2b2lkIENYTUxfRWxlbWVudDo6U2V0VGFnKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcVRhZ05hbWUpIHsKKyAgQVNTRVJUKCFxVGFnTmFtZS5Jc0VtcHR5KCkpOworICBDRlhfQnl0ZVN0cmluZ0MgYnNTcGFjZSwgYnNOYW1lOworICBGWF9YTUxfU3BsaXRRdWFsaWZpZWROYW1lKHFUYWdOYW1lLCBic1NwYWNlLCBic05hbWUpOworICBtX1FTcGFjZU5hbWUgPSBic1NwYWNlOworICBtX1RhZ05hbWUgPSBic05hbWU7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meF94bWxfcGFyc2VyLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X3htbF9wYXJzZXIuY3BwCmluZGV4IDJjMDY5Y2IuLjBiNzE4MzYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4X3htbF9wYXJzZXIuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4X3htbF9wYXJzZXIuY3BwCkBAIC00LDg0MiArNCw4MjggQEAKIAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfeG1sLmgiCiAjaW5jbHVkZSAieG1sX2ludC5oIgotQ1hNTF9QYXJzZXI6On5DWE1MX1BhcnNlcigpCi17Ci0gICAgaWYgKG1fYk93bmVkU3RyZWFtKSB7Ci0gICAgICAgIG1fcERhdGFBY2MtPlJlbGVhc2UoKTsKLSAgICB9CisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfZXh0LmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3htbC5oIgorCitDWE1MX1BhcnNlcjo6fkNYTUxfUGFyc2VyKCkgeworICBpZiAobV9iT3duZWRTdHJlYW0pIHsKKyAgICBtX3BEYXRhQWNjLT5SZWxlYXNlKCk7CisgIH0KIH0KLUZYX0JPT0wgQ1hNTF9QYXJzZXI6OkluaXQoRlhfTFBCWVRFIHBCdWZmZXIsIHNpemVfdCBzaXplKQotewotICAgIG1fcERhdGFBY2MgPSBuZXcgQ1hNTF9EYXRhQnVmQWNjKHBCdWZmZXIsIHNpemUpOwotICAgIHJldHVybiBJbml0KFRSVUUpOworRlhfQk9PTCBDWE1MX1BhcnNlcjo6SW5pdCh1aW50OF90KiBwQnVmZmVyLCBzaXplX3Qgc2l6ZSkgeworICBtX3BEYXRhQWNjID0gbmV3IENYTUxfRGF0YUJ1ZkFjYyhwQnVmZmVyLCBzaXplKTsKKyAgcmV0dXJuIEluaXQoVFJVRSk7CiB9Ci1GWF9CT09MIENYTUxfUGFyc2VyOjpJbml0KElGWF9GaWxlUmVhZCAqcEZpbGVSZWFkKQotewotICAgIG1fcERhdGFBY2MgPSBuZXcgQ1hNTF9EYXRhU3RtQWNjKHBGaWxlUmVhZCk7Ci0gICAgcmV0dXJuIEluaXQoVFJVRSk7CitGWF9CT09MIENYTUxfUGFyc2VyOjpJbml0KElGWF9GaWxlUmVhZCogcEZpbGVSZWFkKSB7CisgIG1fcERhdGFBY2MgPSBuZXcgQ1hNTF9EYXRhU3RtQWNjKHBGaWxlUmVhZCk7CisgIHJldHVybiBJbml0KFRSVUUpOwogfQotRlhfQk9PTCBDWE1MX1BhcnNlcjo6SW5pdChJRlhfQnVmZmVyUmVhZCAqcEJ1ZmZlcikKLXsKLSAgICBpZiAoIXBCdWZmZXIpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX3BEYXRhQWNjID0gcEJ1ZmZlcjsKLSAgICByZXR1cm4gSW5pdChGQUxTRSk7CitGWF9CT09MIENYTUxfUGFyc2VyOjpJbml0KElGWF9CdWZmZXJSZWFkKiBwQnVmZmVyKSB7CisgIGlmICghcEJ1ZmZlcikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBtX3BEYXRhQWNjID0gcEJ1ZmZlcjsKKyAgcmV0dXJuIEluaXQoRkFMU0UpOwogfQotRlhfQk9PTCBDWE1MX1BhcnNlcjo6SW5pdChGWF9CT09MIGJPd25kZWRTdHJlYW0pCi17Ci0gICAgbV9iT3duZWRTdHJlYW0gPSBiT3duZGVkU3RyZWFtOwotICAgIG1fbk9mZnNldCA9IDA7Ci0gICAgcmV0dXJuIFJlYWROZXh0QmxvY2soKTsKK0ZYX0JPT0wgQ1hNTF9QYXJzZXI6OkluaXQoRlhfQk9PTCBiT3duZGVkU3RyZWFtKSB7CisgIG1fYk93bmVkU3RyZWFtID0gYk93bmRlZFN0cmVhbTsKKyAgbV9uT2Zmc2V0ID0gMDsKKyAgcmV0dXJuIFJlYWROZXh0QmxvY2soKTsKIH0KLUZYX0JPT0wgQ1hNTF9QYXJzZXI6OlJlYWROZXh0QmxvY2soKQotewotICAgIGlmICghbV9wRGF0YUFjYy0+UmVhZE5leHRCbG9jaygpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9wQnVmZmVyID0gbV9wRGF0YUFjYy0+R2V0QmxvY2tCdWZmZXIoKTsKLSAgICBtX2R3QnVmZmVyU2l6ZSA9IG1fcERhdGFBY2MtPkdldEJsb2NrU2l6ZSgpOwotICAgIG1fbkJ1ZmZlck9mZnNldCA9IG1fcERhdGFBY2MtPkdldEJsb2NrT2Zmc2V0KCk7Ci0gICAgbV9kd0luZGV4ID0gMDsKLSAgICByZXR1cm4gbV9kd0J1ZmZlclNpemUgPiAwOworRlhfQk9PTCBDWE1MX1BhcnNlcjo6UmVhZE5leHRCbG9jaygpIHsKKyAgaWYgKCFtX3BEYXRhQWNjLT5SZWFkTmV4dEJsb2NrKCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9wQnVmZmVyID0gbV9wRGF0YUFjYy0+R2V0QmxvY2tCdWZmZXIoKTsKKyAgbV9kd0J1ZmZlclNpemUgPSBtX3BEYXRhQWNjLT5HZXRCbG9ja1NpemUoKTsKKyAgbV9uQnVmZmVyT2Zmc2V0ID0gbV9wRGF0YUFjYy0+R2V0QmxvY2tPZmZzZXQoKTsKKyAgbV9kd0luZGV4ID0gMDsKKyAgcmV0dXJuIG1fZHdCdWZmZXJTaXplID4gMDsKIH0KLUZYX0JPT0wgQ1hNTF9QYXJzZXI6OklzRU9GKCkKLXsKLSAgICBpZiAoIW1fcERhdGFBY2MtPklzRU9GKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gbV9kd0luZGV4ID49IG1fZHdCdWZmZXJTaXplOworRlhfQk9PTCBDWE1MX1BhcnNlcjo6SXNFT0YoKSB7CisgIGlmICghbV9wRGF0YUFjYy0+SXNFT0YoKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gbV9kd0luZGV4ID49IG1fZHdCdWZmZXJTaXplOwogfQotI2RlZmluZSBGWENSVE1fWE1MX0NIQVJUWVBFX05vcm1hbAkJCTB4MDAKLSNkZWZpbmUgRlhDUlRNX1hNTF9DSEFSVFlQRV9TcGFjZUNoYXIJCTB4MDEKLSNkZWZpbmUgRlhDUlRNX1hNTF9DSEFSVFlQRV9MZXR0ZXIJCQkweDAyCi0jZGVmaW5lIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfRGlnaXRhbAkJCTB4MDQKLSNkZWZpbmUgRlhDUlRNX1hNTF9DSEFSVFlQRV9OYW1lSW50cm8JCTB4MDgKLSNkZWZpbmUgRlhDUlRNX1hNTF9DSEFSVFlQRV9OYW1lQ2hhcgkJMHgxMAotI2RlZmluZSBGWENSVE1fWE1MX0NIQVJUWVBFX0hleERpZ2l0YWwJCTB4MjAKLSNkZWZpbmUgRlhDUlRNX1hNTF9DSEFSVFlQRV9IZXhMb3dlckxldHRlcgkweDQwCi0jZGVmaW5lIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfSGV4VXBwZXJMZXR0ZXIJMHg2MAotI2RlZmluZSBGWENSVE1fWE1MX0NIQVJUWVBFX0hleENoYXIJCQkweDYwCi1GWF9CWVRFIGdfRlhDUlRfWE1MX0J5dGVUeXBlc1syNTZdID0gewotICAgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCi0gICAgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKLSAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLAotICAgIDB4MzQsIDB4MzQsIDB4MzQsIDB4MzQsIDB4MzQsIDB4MzQsIDB4MzQsIDB4MzQsIDB4MzQsIDB4MzQsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHg3QSwgMHg3QSwgMHg3QSwgMHg3QSwgMHg3QSwgMHg3QSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKLSAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LAotICAgIDB4MDAsIDB4NUEsIDB4NUEsIDB4NUEsIDB4NUEsIDB4NUEsIDB4NUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsCi0gICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLAotICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsCi0gICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKLSAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLAotICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsCi0gICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKLSAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLAotICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MDEsIDB4MDEsCisjZGVmaW5lIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfTm9ybWFsIDB4MDAKKyNkZWZpbmUgRlhDUlRNX1hNTF9DSEFSVFlQRV9TcGFjZUNoYXIgMHgwMQorI2RlZmluZSBGWENSVE1fWE1MX0NIQVJUWVBFX0xldHRlciAweDAyCisjZGVmaW5lIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfRGlnaXRhbCAweDA0CisjZGVmaW5lIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfTmFtZUludHJvIDB4MDgKKyNkZWZpbmUgRlhDUlRNX1hNTF9DSEFSVFlQRV9OYW1lQ2hhciAweDEwCisjZGVmaW5lIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfSGV4RGlnaXRhbCAweDIwCisjZGVmaW5lIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfSGV4TG93ZXJMZXR0ZXIgMHg0MAorI2RlZmluZSBGWENSVE1fWE1MX0NIQVJUWVBFX0hleFVwcGVyTGV0dGVyIDB4NjAKKyNkZWZpbmUgRlhDUlRNX1hNTF9DSEFSVFlQRV9IZXhDaGFyIDB4NjAKK3VpbnQ4X3QgZ19GWENSVF9YTUxfQnl0ZVR5cGVzWzI1Nl0gPSB7CisgICAgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKyAgICAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorICAgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwKKyAgICAweDM0LCAweDM0LCAweDM0LCAweDM0LCAweDM0LCAweDM0LCAweDM0LCAweDM0LCAweDM0LCAweDM0LCAweDA4LCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N0EsIDB4N0EsIDB4N0EsIDB4N0EsIDB4N0EsIDB4N0EsIDB4MUEsCisgICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKKyAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LAorICAgIDB4MDAsIDB4NUEsIDB4NUEsIDB4NUEsIDB4NUEsIDB4NUEsIDB4NUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsCisgICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKKyAgICAweDFBLCAweDFBLCAweDFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDFBLCAweDFBLCAweDFBLCAweDFBLAorICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsCisgICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKKyAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLAorICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsCisgICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKKyAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLAorICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsCisgICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKKyAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLAorICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsCisgICAgMHgxQSwgMHgxQSwgMHgwMSwgMHgwMSwKIH07Ci1GWF9CT09MIGdfRlhDUlRfWE1MX0lzV2hpdGVTcGFjZShGWF9CWVRFIGNoKQotewotICAgIHJldHVybiAoZ19GWENSVF9YTUxfQnl0ZVR5cGVzW2NoXSAmIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfU3BhY2VDaGFyKSAhPSAwOworRlhfQk9PTCBnX0ZYQ1JUX1hNTF9Jc1doaXRlU3BhY2UodWludDhfdCBjaCkgeworICByZXR1cm4gKGdfRlhDUlRfWE1MX0J5dGVUeXBlc1tjaF0gJiBGWENSVE1fWE1MX0NIQVJUWVBFX1NwYWNlQ2hhcikgIT0gMDsKIH0KLUZYX0JPT0wgZ19GWENSVF9YTUxfSXNMZXR0ZXIoRlhfQllURSBjaCkKLXsKLSAgICByZXR1cm4gKGdfRlhDUlRfWE1MX0J5dGVUeXBlc1tjaF0gJiBGWENSVE1fWE1MX0NIQVJUWVBFX0xldHRlcikgIT0gMDsKK0ZYX0JPT0wgZ19GWENSVF9YTUxfSXNMZXR0ZXIodWludDhfdCBjaCkgeworICByZXR1cm4gKGdfRlhDUlRfWE1MX0J5dGVUeXBlc1tjaF0gJiBGWENSVE1fWE1MX0NIQVJUWVBFX0xldHRlcikgIT0gMDsKIH0KLUZYX0JPT0wgZ19GWENSVF9YTUxfSXNEaWdpdGFsKEZYX0JZVEUgY2gpCi17Ci0gICAgcmV0dXJuIChnX0ZYQ1JUX1hNTF9CeXRlVHlwZXNbY2hdICYgRlhDUlRNX1hNTF9DSEFSVFlQRV9EaWdpdGFsKSAhPSAwOworRlhfQk9PTCBnX0ZYQ1JUX1hNTF9Jc0RpZ2l0YWwodWludDhfdCBjaCkgeworICByZXR1cm4gKGdfRlhDUlRfWE1MX0J5dGVUeXBlc1tjaF0gJiBGWENSVE1fWE1MX0NIQVJUWVBFX0RpZ2l0YWwpICE9IDA7CiB9Ci1GWF9CT09MIGdfRlhDUlRfWE1MX0lzTmFtZUludHJvKEZYX0JZVEUgY2gpCi17Ci0gICAgcmV0dXJuIChnX0ZYQ1JUX1hNTF9CeXRlVHlwZXNbY2hdICYgRlhDUlRNX1hNTF9DSEFSVFlQRV9OYW1lSW50cm8pICE9IDA7CitGWF9CT09MIGdfRlhDUlRfWE1MX0lzTmFtZUludHJvKHVpbnQ4X3QgY2gpIHsKKyAgcmV0dXJuIChnX0ZYQ1JUX1hNTF9CeXRlVHlwZXNbY2hdICYgRlhDUlRNX1hNTF9DSEFSVFlQRV9OYW1lSW50cm8pICE9IDA7CiB9Ci1GWF9CT09MIGdfRlhDUlRfWE1MX0lzTmFtZUNoYXIoRlhfQllURSBjaCkKLXsKLSAgICByZXR1cm4gKGdfRlhDUlRfWE1MX0J5dGVUeXBlc1tjaF0gJiBGWENSVE1fWE1MX0NIQVJUWVBFX05hbWVDaGFyKSAhPSAwOworRlhfQk9PTCBnX0ZYQ1JUX1hNTF9Jc05hbWVDaGFyKHVpbnQ4X3QgY2gpIHsKKyAgcmV0dXJuIChnX0ZYQ1JUX1hNTF9CeXRlVHlwZXNbY2hdICYgRlhDUlRNX1hNTF9DSEFSVFlQRV9OYW1lQ2hhcikgIT0gMDsKIH0KLUZYX0JPT0wgZ19GWENSVF9YTUxfSXNIZXhDaGFyKEZYX0JZVEUgY2gpCi17Ci0gICAgcmV0dXJuIChnX0ZYQ1JUX1hNTF9CeXRlVHlwZXNbY2hdICYgRlhDUlRNX1hNTF9DSEFSVFlQRV9IZXhDaGFyKSAhPSAwOworRlhfQk9PTCBnX0ZYQ1JUX1hNTF9Jc0hleENoYXIodWludDhfdCBjaCkgeworICByZXR1cm4gKGdfRlhDUlRfWE1MX0J5dGVUeXBlc1tjaF0gJiBGWENSVE1fWE1MX0NIQVJUWVBFX0hleENoYXIpICE9IDA7CiB9Ci12b2lkIENYTUxfUGFyc2VyOjpTa2lwV2hpdGVTcGFjZXMoKQotewotICAgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIChGWF9GSUxFU0laRSltX2R3SW5kZXg7Ci0gICAgaWYgKElzRU9GKCkpIHsKLSAgICAgICAgcmV0dXJuOwordm9pZCBDWE1MX1BhcnNlcjo6U2tpcFdoaXRlU3BhY2VzKCkgeworICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0luZGV4OworICBpZiAoSXNFT0YoKSkgeworICAgIHJldHVybjsKKyAgfQorICBkbyB7CisgICAgd2hpbGUgKG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplICYmCisgICAgICAgICAgIGdfRlhDUlRfWE1MX0lzV2hpdGVTcGFjZShtX3BCdWZmZXJbbV9kd0luZGV4XSkpIHsKKyAgICAgIG1fZHdJbmRleCsrOwogICAgIH0KLSAgICBkbyB7Ci0gICAgICAgIHdoaWxlIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSAmJiBnX0ZYQ1JUX1hNTF9Jc1doaXRlU3BhY2UobV9wQnVmZmVyW21fZHdJbmRleF0pKSB7Ci0gICAgICAgICAgICBtX2R3SW5kZXggKys7Ci0gICAgICAgIH0KLSAgICAgICAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgKEZYX0ZJTEVTSVpFKW1fZHdJbmRleDsKLSAgICAgICAgaWYgKG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplIHx8IElzRU9GKCkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoUmVhZE5leHRCbG9jaygpKTsKLX0KLXZvaWQgQ1hNTF9QYXJzZXI6OkdldE5hbWUoQ0ZYX0J5dGVTdHJpbmcgJnNwYWNlLCBDRlhfQnl0ZVN0cmluZyAmbmFtZSkKLXsKICAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0luZGV4OwotICAgIGlmIChJc0VPRigpKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAobV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUgfHwgSXNFT0YoKSkgeworICAgICAgYnJlYWs7CiAgICAgfQotICAgIENGWF9CeXRlVGV4dEJ1ZiBidWY7Ci0gICAgRlhfQllURSBjaDsKLSAgICBkbyB7Ci0gICAgICAgIHdoaWxlIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSkgewotICAgICAgICAgICAgY2ggPSBtX3BCdWZmZXJbbV9kd0luZGV4XTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnOicpIHsKLSAgICAgICAgICAgICAgICBzcGFjZSA9IGJ1Zi5HZXRCeXRlU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgYnVmLkNsZWFyKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGdfRlhDUlRfWE1MX0lzTmFtZUNoYXIoY2gpKSB7Ci0gICAgICAgICAgICAgICAgYnVmLkFwcGVuZENoYXIoY2gpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fZHdJbmRleCArKzsKLSAgICAgICAgfQotICAgICAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0luZGV4OwotICAgICAgICBpZiAobV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUgfHwgSXNFT0YoKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChSZWFkTmV4dEJsb2NrKCkpOwotICAgIG5hbWUgPSBidWYuR2V0Qnl0ZVN0cmluZygpOworICB9IHdoaWxlIChSZWFkTmV4dEJsb2NrKCkpOwogfQotdm9pZCBDWE1MX1BhcnNlcjo6U2tpcExpdGVyYWxzKEZYX0JTVFIgc3RyKQotewotICAgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIChGWF9GSUxFU0laRSltX2R3SW5kZXg7Ci0gICAgaWYgKElzRU9GKCkpIHsKLSAgICAgICAgcmV0dXJuOwordm9pZCBDWE1MX1BhcnNlcjo6R2V0TmFtZShDRlhfQnl0ZVN0cmluZyYgc3BhY2UsIENGWF9CeXRlU3RyaW5nJiBuYW1lKSB7CisgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIChGWF9GSUxFU0laRSltX2R3SW5kZXg7CisgIGlmIChJc0VPRigpKSB7CisgICAgcmV0dXJuOworICB9CisgIENGWF9CeXRlVGV4dEJ1ZiBidWY7CisgIHVpbnQ4X3QgY2g7CisgIGRvIHsKKyAgICB3aGlsZSAobV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUpIHsKKyAgICAgIGNoID0gbV9wQnVmZmVyW21fZHdJbmRleF07CisgICAgICBpZiAoY2ggPT0gJzonKSB7CisgICAgICAgIHNwYWNlID0gYnVmLkdldEJ5dGVTdHJpbmcoKTsKKyAgICAgICAgYnVmLkNsZWFyKCk7CisgICAgICB9IGVsc2UgaWYgKGdfRlhDUlRfWE1MX0lzTmFtZUNoYXIoY2gpKSB7CisgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKGNoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgbV9kd0luZGV4Kys7CiAgICAgfQotICAgIEZYX0lOVDMyIGkgPSAwLCBpTGVuID0gc3RyLkdldExlbmd0aCgpOwotICAgIGRvIHsKLSAgICAgICAgd2hpbGUgKG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplKSB7Ci0gICAgICAgICAgICBpZiAoc3RyLkdldEF0KGkpICE9IG1fcEJ1ZmZlclttX2R3SW5kZXggKytdKSB7Ci0gICAgICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGkgKys7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPT0gaUxlbikgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgKEZYX0ZJTEVTSVpFKW1fZHdJbmRleDsKKyAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0luZGV4OworICAgIGlmIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSB8fCBJc0VPRigpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gd2hpbGUgKFJlYWROZXh0QmxvY2soKSk7CisgIG5hbWUgPSBidWYuR2V0Qnl0ZVN0cmluZygpOworfQordm9pZCBDWE1MX1BhcnNlcjo6U2tpcExpdGVyYWxzKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSB7CisgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIChGWF9GSUxFU0laRSltX2R3SW5kZXg7CisgIGlmIChJc0VPRigpKSB7CisgICAgcmV0dXJuOworICB9CisgIGludDMyX3QgaSA9IDAsIGlMZW4gPSBzdHIuR2V0TGVuZ3RoKCk7CisgIGRvIHsKKyAgICB3aGlsZSAobV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUpIHsKKyAgICAgIGlmIChzdHIuR2V0QXQoaSkgIT0gbV9wQnVmZmVyW21fZHdJbmRleCsrXSkgeworICAgICAgICBpID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGkrKzsKICAgICAgICAgaWYgKGkgPT0gaUxlbikgewotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSB8fCBJc0VPRigpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKFJlYWROZXh0QmxvY2soKSk7Ci0gICAgd2hpbGUgKCFtX3BEYXRhQWNjLT5Jc0VPRigpKSB7Ci0gICAgICAgIFJlYWROZXh0QmxvY2soKTsKLSAgICAgICAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgKEZYX0ZJTEVTSVpFKW1fZHdCdWZmZXJTaXplOworICAgICAgfQogICAgIH0KLSAgICBtX2R3SW5kZXggPSBtX2R3QnVmZmVyU2l6ZTsKLX0KLUZYX0RXT1JEIENYTUxfUGFyc2VyOjpHZXRDaGFyUmVmKCkKLXsKICAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0luZGV4OwotICAgIGlmIChJc0VPRigpKSB7Ci0gICAgICAgIHJldHVybiAwOworICAgIGlmIChpID09IGlMZW4pIHsKKyAgICAgIHJldHVybjsKICAgICB9Ci0gICAgRlhfQllURSBjaDsKLSAgICBGWF9JTlQzMiBpU3RhdGUgPSAwOwotICAgIENGWF9CeXRlVGV4dEJ1ZiBidWY7Ci0gICAgRlhfRFdPUkQgY29kZSA9IDA7Ci0gICAgZG8gewotICAgICAgICB3aGlsZSAobV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUpIHsKLSAgICAgICAgICAgIGNoID0gbV9wQnVmZmVyW21fZHdJbmRleF07Ci0gICAgICAgICAgICBzd2l0Y2ggKGlTdGF0ZSkgewotICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICcjJykgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9kd0luZGV4ICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgaVN0YXRlID0gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlTdGF0ZSA9IDE7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBtX2R3SW5kZXggKys7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnOycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQyByZWYgPSBidWYuR2V0Qnl0ZVN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZiA9PSBGWF9CU1RSQygiZ3QiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSAnPic7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlZiA9PSBGWF9CU1RSQygibHQiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSAnPCc7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlZiA9PSBGWF9CU1RSQygiYW1wIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gJyYnOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWYgPT0gRlhfQlNUUkMoImFwb3MiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSAnXCcnOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWYgPT0gRlhfQlNUUkMoInF1b3QiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSAnIic7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpU3RhdGUgPSAxMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5BcHBlbmRCeXRlKGNoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ3gnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2R3SW5kZXggKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpU3RhdGUgPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaVN0YXRlID0gMzsKLSAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgIG1fZHdJbmRleCArKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICc7JykgewotICAgICAgICAgICAgICAgICAgICAgICAgaVN0YXRlID0gMTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZ19GWENSVF9YTUxfSXNEaWdpdGFsKGNoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IGNvZGUgKiAxMCArIGNoIC0gJzAnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgbV9kd0luZGV4ICsrOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJzsnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpU3RhdGUgPSAxMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgbkhleCA9IGdfRlhDUlRfWE1MX0J5dGVUeXBlc1tjaF0gJiBGWENSVE1fWE1MX0NIQVJUWVBFX0hleENoYXI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuSGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobkhleCA9PSBGWENSVE1fWE1MX0NIQVJUWVBFX0hleERpZ2l0YWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gKGNvZGUgPDwgNCkgKyBjaCAtICcwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobkhleCA9PSBGWENSVE1fWE1MX0NIQVJUWVBFX0hleExvd2VyTGV0dGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IChjb2RlIDw8IDQpICsgY2ggLSA4NzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IChjb2RlIDw8IDQpICsgY2ggLSA1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpU3RhdGUgPT0gMTApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0luZGV4OwotICAgICAgICBpZiAoaVN0YXRlID09IDEwIHx8IG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplIHx8IElzRU9GKCkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoUmVhZE5leHRCbG9jaygpKTsKLSAgICByZXR1cm4gY29kZTsKKyAgICBpZiAobV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUgfHwgSXNFT0YoKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9IHdoaWxlIChSZWFkTmV4dEJsb2NrKCkpOworICB3aGlsZSAoIW1fcERhdGFBY2MtPklzRU9GKCkpIHsKKyAgICBSZWFkTmV4dEJsb2NrKCk7CisgICAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgKEZYX0ZJTEVTSVpFKW1fZHdCdWZmZXJTaXplOworICB9CisgIG1fZHdJbmRleCA9IG1fZHdCdWZmZXJTaXplOwogfQotdm9pZCBDWE1MX1BhcnNlcjo6R2V0QXR0clZhbHVlKENGWF9XaWRlU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0luZGV4OwotICAgIGlmIChJc0VPRigpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ0ZYX1VURjhEZWNvZGVyIGRlY29kZXI7Ci0gICAgRlhfQllURSBtYXJrID0gMCwgY2ggPSAwOwotICAgIGRvIHsKLSAgICAgICAgd2hpbGUgKG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplKSB7Ci0gICAgICAgICAgICBjaCA9IG1fcEJ1ZmZlclttX2R3SW5kZXhdOwotICAgICAgICAgICAgaWYgKG1hcmsgPT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnXCcnICYmIGNoICE9ICciJykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1hcmsgPSBjaDsKLSAgICAgICAgICAgICAgICBtX2R3SW5kZXggKys7Ci0gICAgICAgICAgICAgICAgY2ggPSAwOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOworRlhfRFdPUkQgQ1hNTF9QYXJzZXI6OkdldENoYXJSZWYoKSB7CisgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIChGWF9GSUxFU0laRSltX2R3SW5kZXg7CisgIGlmIChJc0VPRigpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgdWludDhfdCBjaDsKKyAgaW50MzJfdCBpU3RhdGUgPSAwOworICBDRlhfQnl0ZVRleHRCdWYgYnVmOworICBGWF9EV09SRCBjb2RlID0gMDsKKyAgZG8geworICAgIHdoaWxlIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSkgeworICAgICAgY2ggPSBtX3BCdWZmZXJbbV9kd0luZGV4XTsKKyAgICAgIHN3aXRjaCAoaVN0YXRlKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBpZiAoY2ggPT0gJyMnKSB7CisgICAgICAgICAgICBtX2R3SW5kZXgrKzsKKyAgICAgICAgICAgIGlTdGF0ZSA9IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaVN0YXRlID0gMTsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIG1fZHdJbmRleCsrOworICAgICAgICAgIGlmIChjaCA9PSAnOycpIHsKKyAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQyByZWYgPSBidWYuR2V0Qnl0ZVN0cmluZygpOworICAgICAgICAgICAgaWYgKHJlZiA9PSAiZ3QiKSB7CisgICAgICAgICAgICAgIGNvZGUgPSAnPic7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlZiA9PSAibHQiKSB7CisgICAgICAgICAgICAgIGNvZGUgPSAnPCc7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlZiA9PSAiYW1wIikgeworICAgICAgICAgICAgICBjb2RlID0gJyYnOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZWYgPT0gImFwb3MiKSB7CisgICAgICAgICAgICAgIGNvZGUgPSAnXCcnOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZWYgPT0gInF1b3QiKSB7CisgICAgICAgICAgICAgIGNvZGUgPSAnIic7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2R3SW5kZXggKys7Ci0gICAgICAgICAgICBpZiAoY2ggPT0gbWFyaykgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNoID09ICcmJykgewotICAgICAgICAgICAgICAgIGRlY29kZXIuQXBwZW5kQ2hhcihHZXRDaGFyUmVmKCkpOwotICAgICAgICAgICAgICAgIGlmIChJc0VPRigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZGVjb2Rlci5HZXRSZXN1bHQoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlTdGF0ZSA9IDEwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGJ1Zi5BcHBlbmRCeXRlKGNoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgIGlmIChjaCA9PSAneCcpIHsKKyAgICAgICAgICAgIG1fZHdJbmRleCsrOworICAgICAgICAgICAgaVN0YXRlID0gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpU3RhdGUgPSAzOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgbV9kd0luZGV4Kys7CisgICAgICAgICAgaWYgKGNoID09ICc7JykgeworICAgICAgICAgICAgaVN0YXRlID0gMTA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGdfRlhDUlRfWE1MX0lzRGlnaXRhbChjaCkpCisgICAgICAgICAgICBjb2RlID0gY29kZSAqIDEwICsgRlhTWVNfdG9EZWNpbWFsRGlnaXQoY2gpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgbV9kd0luZGV4Kys7CisgICAgICAgICAgaWYgKGNoID09ICc7JykgeworICAgICAgICAgICAgaVN0YXRlID0gMTA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgdWludDhfdCBuSGV4ID0KKyAgICAgICAgICAgICAgZ19GWENSVF9YTUxfQnl0ZVR5cGVzW2NoXSAmIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfSGV4Q2hhcjsKKyAgICAgICAgICBpZiAobkhleCkgeworICAgICAgICAgICAgaWYgKG5IZXggPT0gRlhDUlRNX1hNTF9DSEFSVFlQRV9IZXhEaWdpdGFsKSB7CisgICAgICAgICAgICAgIGNvZGUgPSAoY29kZSA8PCA0KSArIEZYU1lTX3RvRGVjaW1hbERpZ2l0KGNoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobkhleCA9PSBGWENSVE1fWE1MX0NIQVJUWVBFX0hleExvd2VyTGV0dGVyKSB7CisgICAgICAgICAgICAgIGNvZGUgPSAoY29kZSA8PCA0KSArIGNoIC0gODc7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRlY29kZXIuSW5wdXQoY2gpOworICAgICAgICAgICAgICBjb2RlID0gKGNvZGUgPDwgNCkgKyBjaCAtIDU1OwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIChGWF9GSUxFU0laRSltX2R3SW5kZXg7Ci0gICAgICAgIGlmIChjaCA9PSBtYXJrIHx8IG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplIHx8IElzRU9GKCkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoUmVhZE5leHRCbG9jaygpKTsKLSAgICB2YWx1ZSA9IGRlY29kZXIuR2V0UmVzdWx0KCk7Ci19Ci12b2lkIENYTUxfUGFyc2VyOjpHZXRUYWdOYW1lKENGWF9CeXRlU3RyaW5nICZzcGFjZSwgQ0ZYX0J5dGVTdHJpbmcgJm5hbWUsIEZYX0JPT0wgJmJFbmRUYWcsIEZYX0JPT0wgYlN0YXJ0VGFnKQoteworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChpU3RhdGUgPT0gMTApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQogICAgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIChGWF9GSUxFU0laRSltX2R3SW5kZXg7Ci0gICAgaWYgKElzRU9GKCkpIHsKLSAgICAgICAgcmV0dXJuOworICAgIGlmIChpU3RhdGUgPT0gMTAgfHwgbV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUgfHwgSXNFT0YoKSkgeworICAgICAgYnJlYWs7CiAgICAgfQotICAgIGJFbmRUYWcgPSBGQUxTRTsKLSAgICBGWF9CWVRFIGNoOwotICAgIEZYX0lOVDMyIGlTdGF0ZSA9IGJTdGFydFRhZyA/IDEgOiAwOwotICAgIGRvIHsKLSAgICAgICAgd2hpbGUgKG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplKSB7Ci0gICAgICAgICAgICBjaCA9IG1fcEJ1ZmZlclttX2R3SW5kZXhdOwotICAgICAgICAgICAgc3dpdGNoIChpU3RhdGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgIG1fZHdJbmRleCArKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoICE9ICc8JykgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaVN0YXRlID0gMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJz8nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2R3SW5kZXggKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTa2lwTGl0ZXJhbHMoRlhfQlNUUkMoIj8+IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgaVN0YXRlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICchJykgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9kd0luZGV4ICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgU2tpcExpdGVyYWxzKEZYX0JTVFJDKCItLT4iKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpU3RhdGUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICcvJykgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9kd0luZGV4ICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgR2V0TmFtZShzcGFjZSwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiRW5kVGFnID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdldE5hbWUoc3BhY2UsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYkVuZFRhZyA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0luZGV4OwotICAgICAgICBpZiAobV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUgfHwgSXNFT0YoKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChSZWFkTmV4dEJsb2NrKCkpOworICB9IHdoaWxlIChSZWFkTmV4dEJsb2NrKCkpOworICByZXR1cm4gY29kZTsKIH0KLUNYTUxfRWxlbWVudCogQ1hNTF9QYXJzZXI6OlBhcnNlRWxlbWVudChDWE1MX0VsZW1lbnQqIHBQYXJlbnQsIEZYX0JPT0wgYlN0YXJ0VGFnKQotewordm9pZCBDWE1MX1BhcnNlcjo6R2V0QXR0clZhbHVlKENGWF9XaWRlU3RyaW5nJiB2YWx1ZSkgeworICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0luZGV4OworICBpZiAoSXNFT0YoKSkgeworICAgIHJldHVybjsKKyAgfQorICBDRlhfVVRGOERlY29kZXIgZGVjb2RlcjsKKyAgdWludDhfdCBtYXJrID0gMCwgY2ggPSAwOworICBkbyB7CisgICAgd2hpbGUgKG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplKSB7CisgICAgICBjaCA9IG1fcEJ1ZmZlclttX2R3SW5kZXhdOworICAgICAgaWYgKG1hcmsgPT0gMCkgeworICAgICAgICBpZiAoY2ggIT0gJ1wnJyAmJiBjaCAhPSAnIicpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbWFyayA9IGNoOworICAgICAgICBtX2R3SW5kZXgrKzsKKyAgICAgICAgY2ggPSAwOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIG1fZHdJbmRleCsrOworICAgICAgaWYgKGNoID09IG1hcmspIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoY2ggPT0gJyYnKSB7CisgICAgICAgIGRlY29kZXIuQXBwZW5kQ2hhcihHZXRDaGFyUmVmKCkpOworICAgICAgICBpZiAoSXNFT0YoKSkgeworICAgICAgICAgIHZhbHVlID0gZGVjb2Rlci5HZXRSZXN1bHQoKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlY29kZXIuSW5wdXQoY2gpOworICAgICAgfQorICAgIH0KICAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0luZGV4OwotICAgIGlmIChJc0VPRigpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChjaCA9PSBtYXJrIHx8IG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplIHx8IElzRU9GKCkpIHsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyB0YWdfbmFtZSwgdGFnX3NwYWNlOwotICAgIEZYX0JPT0wgYkVuZFRhZzsKLSAgICBHZXRUYWdOYW1lKHRhZ19zcGFjZSwgdGFnX25hbWUsIGJFbmRUYWcsIGJTdGFydFRhZyk7Ci0gICAgaWYgKHRhZ19uYW1lLklzRW1wdHkoKSB8fCBiRW5kVGFnKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDWE1MX0VsZW1lbnQqIHBFbGVtZW50ID0gbmV3IENYTUxfRWxlbWVudDsKLSAgICBwRWxlbWVudC0+bV9wUGFyZW50ID0gcFBhcmVudDsKLSAgICBwRWxlbWVudC0+U2V0VGFnKHRhZ19zcGFjZSwgdGFnX25hbWUpOwotICAgIGRvIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYXR0cl9zcGFjZSwgYXR0cl9uYW1lOwotICAgICAgICB3aGlsZSAobV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUpIHsKLSAgICAgICAgICAgIFNraXBXaGl0ZVNwYWNlcygpOwotICAgICAgICAgICAgaWYgKElzRU9GKCkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZ19GWENSVF9YTUxfSXNOYW1lSW50cm8obV9wQnVmZmVyW21fZHdJbmRleF0pKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBHZXROYW1lKGF0dHJfc3BhY2UsIGF0dHJfbmFtZSk7Ci0gICAgICAgICAgICBTa2lwV2hpdGVTcGFjZXMoKTsKLSAgICAgICAgICAgIGlmIChJc0VPRigpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9wQnVmZmVyW21fZHdJbmRleF0gIT0gJz0nKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2R3SW5kZXggKys7Ci0gICAgICAgICAgICBTa2lwV2hpdGVTcGFjZXMoKTsKLSAgICAgICAgICAgIGlmIChJc0VPRigpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBhdHRyX3ZhbHVlOwotICAgICAgICAgICAgR2V0QXR0clZhbHVlKGF0dHJfdmFsdWUpOwotICAgICAgICAgICAgcEVsZW1lbnQtPm1fQXR0ck1hcC5TZXRBdChhdHRyX3NwYWNlLCBhdHRyX25hbWUsIGF0dHJfdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIChGWF9GSUxFU0laRSltX2R3SW5kZXg7Ci0gICAgICAgIGlmIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSB8fCBJc0VPRigpKSB7CisgIH0gd2hpbGUgKFJlYWROZXh0QmxvY2soKSk7CisgIHZhbHVlID0gZGVjb2Rlci5HZXRSZXN1bHQoKTsKK30KK3ZvaWQgQ1hNTF9QYXJzZXI6OkdldFRhZ05hbWUoQ0ZYX0J5dGVTdHJpbmcmIHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkVuZFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RhcnRUYWcpIHsKKyAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgKEZYX0ZJTEVTSVpFKW1fZHdJbmRleDsKKyAgaWYgKElzRU9GKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgYkVuZFRhZyA9IEZBTFNFOworICB1aW50OF90IGNoOworICBpbnQzMl90IGlTdGF0ZSA9IGJTdGFydFRhZyA/IDEgOiAwOworICBkbyB7CisgICAgd2hpbGUgKG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplKSB7CisgICAgICBjaCA9IG1fcEJ1ZmZlclttX2R3SW5kZXhdOworICAgICAgc3dpdGNoIChpU3RhdGUpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgIG1fZHdJbmRleCsrOworICAgICAgICAgIGlmIChjaCAhPSAnPCcpIHsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoUmVhZE5leHRCbG9jaygpKTsKLSAgICBTa2lwV2hpdGVTcGFjZXMoKTsKLSAgICBpZiAoSXNFT0YoKSkgewotICAgICAgICByZXR1cm4gcEVsZW1lbnQ7Ci0gICAgfQotICAgIEZYX0JZVEUgY2ggPSBtX3BCdWZmZXJbbV9kd0luZGV4ICsrXTsKLSAgICBpZiAoY2ggPT0gJy8nKSB7Ci0gICAgICAgIG1fZHdJbmRleCArKzsKLSAgICAgICAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgKEZYX0ZJTEVTSVpFKW1fZHdJbmRleDsKLSAgICAgICAgcmV0dXJuIHBFbGVtZW50OwotICAgIH0KLSAgICBpZiAoY2ggIT0gJz4nKSB7Ci0gICAgICAgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIChGWF9GSUxFU0laRSltX2R3SW5kZXg7Ci0gICAgICAgIGRlbGV0ZSBwRWxlbWVudDsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIFNraXBXaGl0ZVNwYWNlcygpOwotICAgIGlmIChJc0VPRigpKSB7Ci0gICAgICAgIHJldHVybiBwRWxlbWVudDsKLSAgICB9Ci0gICAgQ0ZYX1VURjhEZWNvZGVyIGRlY29kZXI7Ci0gICAgQ0ZYX1dpZGVUZXh0QnVmIGNvbnRlbnQ7Ci0gICAgRlhfQk9PTCBiQ0RBVEEgPSBGQUxTRTsKLSAgICBGWF9JTlQzMiBpU3RhdGUgPSAwOwotICAgIGRvIHsKLSAgICAgICAgd2hpbGUgKG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplKSB7Ci0gICAgICAgICAgICBjaCA9IG1fcEJ1ZmZlclttX2R3SW5kZXggKytdOwotICAgICAgICAgICAgc3dpdGNoIChpU3RhdGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnPCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlTdGF0ZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyYnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLkNsZWFyU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLkFwcGVuZENoYXIoR2V0Q2hhclJlZigpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIuSW5wdXQoY2gpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICchJykgewotICAgICAgICAgICAgICAgICAgICAgICAgaVN0YXRlID0gMjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnPycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNraXBMaXRlcmFscyhGWF9CU1RSQygiPz4iKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTa2lwV2hpdGVTcGFjZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlTdGF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzcGFjZSwgbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdldE5hbWUoc3BhY2UsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgU2tpcFdoaXRlU3BhY2VzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2R3SW5kZXggKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpU3RhdGUgPSAxMDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPDwgZGVjb2Rlci5HZXRSZXN1bHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGRhdGFTdHIgPSBjb250ZW50LkdldFdpZGVTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYkNEQVRBICYmICFtX2JTYXZlU3BhY2VDaGFycykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdHIuVHJpbVJpZ2h0KEwiIFx0XHJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0Q29udGVudFNlZ21lbnQoYkNEQVRBLCBkYXRhU3RyLCBwRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LkNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLkNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiQ0RBVEEgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlTdGF0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2R3SW5kZXggLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICBDWE1MX0VsZW1lbnQqIHBTdWJFbGVtZW50ID0gUGFyc2VFbGVtZW50KHBFbGVtZW50LCBUUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwU3ViRWxlbWVudCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwU3ViRWxlbWVudC0+bV9wUGFyZW50ID0gcEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRWxlbWVudC0+bV9DaGlsZHJlbi5BZGQoKEZYX0xQVk9JRClDWE1MX0VsZW1lbnQ6OkVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEVsZW1lbnQtPm1fQ2hpbGRyZW4uQWRkKHBTdWJFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNraXBXaGl0ZVNwYWNlcygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICdbJykgewotICAgICAgICAgICAgICAgICAgICAgICAgU2tpcExpdGVyYWxzKEZYX0JTVFJDKCJdXT4iKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJy0nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2R3SW5kZXggKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTa2lwTGl0ZXJhbHMoRlhfQlNUUkMoIi0tPiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNraXBMaXRlcmFscyhGWF9CU1RSQygiPiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLkNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIFNraXBXaGl0ZVNwYWNlcygpOwotICAgICAgICAgICAgICAgICAgICBpU3RhdGUgPSAwOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpU3RhdGUgPT0gMTApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0luZGV4OwotICAgICAgICBpZiAoaVN0YXRlID09IDEwIHx8IG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplIHx8IElzRU9GKCkpIHsKKyAgICAgICAgICB9CisgICAgICAgICAgaVN0YXRlID0gMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIGlmIChjaCA9PSAnPycpIHsKKyAgICAgICAgICAgIG1fZHdJbmRleCsrOworICAgICAgICAgICAgU2tpcExpdGVyYWxzKCI/PiIpOworICAgICAgICAgICAgaVN0YXRlID0gMDsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoUmVhZE5leHRCbG9jaygpKTsKLSAgICBjb250ZW50IDw8IGRlY29kZXIuR2V0UmVzdWx0KCk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgZGF0YVN0ciA9IGNvbnRlbnQuR2V0V2lkZVN0cmluZygpOwotICAgIGlmICghbV9iU2F2ZVNwYWNlQ2hhcnMpIHsKLSAgICAgICAgZGF0YVN0ci5UcmltUmlnaHQoTCIgXHRcclxuIik7CisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnIScpIHsKKyAgICAgICAgICAgIG1fZHdJbmRleCsrOworICAgICAgICAgICAgU2tpcExpdGVyYWxzKCItLT4iKTsKKyAgICAgICAgICAgIGlTdGF0ZSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGNoID09ICcvJykgeworICAgICAgICAgICAgbV9kd0luZGV4Kys7CisgICAgICAgICAgICBHZXROYW1lKHNwYWNlLCBuYW1lKTsKKyAgICAgICAgICAgIGJFbmRUYWcgPSBUUlVFOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBHZXROYW1lKHNwYWNlLCBuYW1lKTsKKyAgICAgICAgICAgIGJFbmRUYWcgPSBGQUxTRTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuOworICAgICAgfQogICAgIH0KLSAgICBJbnNlcnRDb250ZW50U2VnbWVudChiQ0RBVEEsIGRhdGFTdHIsIHBFbGVtZW50KTsKLSAgICBjb250ZW50LkNsZWFyKCk7Ci0gICAgZGVjb2Rlci5DbGVhcigpOwotICAgIGJDREFUQSA9IEZBTFNFOworICAgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIChGWF9GSUxFU0laRSltX2R3SW5kZXg7CisgICAgaWYgKG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplIHx8IElzRU9GKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfSB3aGlsZSAoUmVhZE5leHRCbG9jaygpKTsKK30KK0NYTUxfRWxlbWVudCogQ1hNTF9QYXJzZXI6OlBhcnNlRWxlbWVudChDWE1MX0VsZW1lbnQqIHBQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RhcnRUYWcpIHsKKyAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgKEZYX0ZJTEVTSVpFKW1fZHdJbmRleDsKKyAgaWYgKElzRU9GKCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyB0YWdfbmFtZSwgdGFnX3NwYWNlOworICBGWF9CT09MIGJFbmRUYWc7CisgIEdldFRhZ05hbWUodGFnX3NwYWNlLCB0YWdfbmFtZSwgYkVuZFRhZywgYlN0YXJ0VGFnKTsKKyAgaWYgKHRhZ19uYW1lLklzRW1wdHkoKSB8fCBiRW5kVGFnKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ1hNTF9FbGVtZW50KiBwRWxlbWVudCA9IG5ldyBDWE1MX0VsZW1lbnQ7CisgIHBFbGVtZW50LT5tX3BQYXJlbnQgPSBwUGFyZW50OworICBwRWxlbWVudC0+U2V0VGFnKHRhZ19zcGFjZSwgdGFnX25hbWUpOworICBkbyB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgYXR0cl9zcGFjZSwgYXR0cl9uYW1lOworICAgIHdoaWxlIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSkgeworICAgICAgU2tpcFdoaXRlU3BhY2VzKCk7CisgICAgICBpZiAoSXNFT0YoKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmICghZ19GWENSVF9YTUxfSXNOYW1lSW50cm8obV9wQnVmZmVyW21fZHdJbmRleF0pKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgR2V0TmFtZShhdHRyX3NwYWNlLCBhdHRyX25hbWUpOworICAgICAgU2tpcFdoaXRlU3BhY2VzKCk7CisgICAgICBpZiAoSXNFT0YoKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChtX3BCdWZmZXJbbV9kd0luZGV4XSAhPSAnPScpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBtX2R3SW5kZXgrKzsKKyAgICAgIFNraXBXaGl0ZVNwYWNlcygpOworICAgICAgaWYgKElzRU9GKCkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBDRlhfV2lkZVN0cmluZyBhdHRyX3ZhbHVlOworICAgICAgR2V0QXR0clZhbHVlKGF0dHJfdmFsdWUpOworICAgICAgcEVsZW1lbnQtPm1fQXR0ck1hcC5TZXRBdChhdHRyX3NwYWNlLCBhdHRyX25hbWUsIGF0dHJfdmFsdWUpOworICAgIH0KKyAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0luZGV4OworICAgIGlmIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSB8fCBJc0VPRigpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gd2hpbGUgKFJlYWROZXh0QmxvY2soKSk7CisgIFNraXBXaGl0ZVNwYWNlcygpOworICBpZiAoSXNFT0YoKSkgewogICAgIHJldHVybiBwRWxlbWVudDsKLX0KLXZvaWQgQ1hNTF9QYXJzZXI6Okluc2VydENvbnRlbnRTZWdtZW50KEZYX0JPT0wgYkNEQVRBLCBGWF9XU1RSIGNvbnRlbnQsIENYTUxfRWxlbWVudCogcEVsZW1lbnQpCi17Ci0gICAgaWYgKGNvbnRlbnQuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1hNTF9Db250ZW50KiBwQ29udGVudCA9IG5ldyBDWE1MX0NvbnRlbnQ7Ci0gICAgcENvbnRlbnQtPlNldChiQ0RBVEEsIGNvbnRlbnQpOwotICAgIHBFbGVtZW50LT5tX0NoaWxkcmVuLkFkZCgoRlhfTFBWT0lEKUNYTUxfRWxlbWVudDo6Q29udGVudCk7Ci0gICAgcEVsZW1lbnQtPm1fQ2hpbGRyZW4uQWRkKHBDb250ZW50KTsKLX0KLXN0YXRpYyBDWE1MX0VsZW1lbnQqIFhNTF9Db250aW51ZVBhcnNlKENYTUxfUGFyc2VyICZwYXJzZXIsIEZYX0JPT0wgYlNhdmVTcGFjZUNoYXJzLCBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUpCi17Ci0gICAgcGFyc2VyLm1fYlNhdmVTcGFjZUNoYXJzID0gYlNhdmVTcGFjZUNoYXJzOwotICAgIENYTUxfRWxlbWVudCogcEVsZW1lbnQgPSBwYXJzZXIuUGFyc2VFbGVtZW50KE5VTEwsIEZBTFNFKTsKLSAgICBpZiAocFBhcnNlZFNpemUpIHsKLSAgICAgICAgKnBQYXJzZWRTaXplID0gcGFyc2VyLm1fbk9mZnNldDsKLSAgICB9CisgIH0KKyAgdWludDhfdCBjaCA9IG1fcEJ1ZmZlclttX2R3SW5kZXgrK107CisgIGlmIChjaCA9PSAnLycpIHsKKyAgICBtX2R3SW5kZXgrKzsKKyAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0luZGV4OwogICAgIHJldHVybiBwRWxlbWVudDsKLX0KLUNYTUxfRWxlbWVudCogQ1hNTF9FbGVtZW50OjpQYXJzZShjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc2l6ZSwgRlhfQk9PTCBiU2F2ZVNwYWNlQ2hhcnMsIEZYX0ZJTEVTSVpFKiBwUGFyc2VkU2l6ZSkKLXsKLSAgICBDWE1MX1BhcnNlciBwYXJzZXI7Ci0gICAgaWYgKCFwYXJzZXIuSW5pdCgoRlhfTFBCWVRFKXBCdWZmZXIsIHNpemUpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChjaCAhPSAnPicpIHsKKyAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyAoRlhfRklMRVNJWkUpbV9kd0luZGV4OworICAgIGRlbGV0ZSBwRWxlbWVudDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBTa2lwV2hpdGVTcGFjZXMoKTsKKyAgaWYgKElzRU9GKCkpIHsKKyAgICByZXR1cm4gcEVsZW1lbnQ7CisgIH0KKyAgQ0ZYX1VURjhEZWNvZGVyIGRlY29kZXI7CisgIENGWF9XaWRlVGV4dEJ1ZiBjb250ZW50OworICBGWF9CT09MIGJDREFUQSA9IEZBTFNFOworICBpbnQzMl90IGlTdGF0ZSA9IDA7CisgIGRvIHsKKyAgICB3aGlsZSAobV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUpIHsKKyAgICAgIGNoID0gbV9wQnVmZmVyW21fZHdJbmRleCsrXTsKKyAgICAgIHN3aXRjaCAoaVN0YXRlKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBpZiAoY2ggPT0gJzwnKSB7CisgICAgICAgICAgICBpU3RhdGUgPSAxOworICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyYnKSB7CisgICAgICAgICAgICBkZWNvZGVyLkNsZWFyU3RhdHVzKCk7CisgICAgICAgICAgICBkZWNvZGVyLkFwcGVuZENoYXIoR2V0Q2hhclJlZigpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVjb2Rlci5JbnB1dChjaCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgaWYgKGNoID09ICchJykgeworICAgICAgICAgICAgaVN0YXRlID0gMjsKKyAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc/JykgeworICAgICAgICAgICAgU2tpcExpdGVyYWxzKCI/PiIpOworICAgICAgICAgICAgU2tpcFdoaXRlU3BhY2VzKCk7CisgICAgICAgICAgICBpU3RhdGUgPSAwOworICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJy8nKSB7CisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzcGFjZSwgbmFtZTsKKyAgICAgICAgICAgIEdldE5hbWUoc3BhY2UsIG5hbWUpOworICAgICAgICAgICAgU2tpcFdoaXRlU3BhY2VzKCk7CisgICAgICAgICAgICBtX2R3SW5kZXgrKzsKKyAgICAgICAgICAgIGlTdGF0ZSA9IDEwOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250ZW50IDw8IGRlY29kZXIuR2V0UmVzdWx0KCk7CisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBkYXRhU3RyID0gY29udGVudC5HZXRXaWRlU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAoIWJDREFUQSAmJiAhbV9iU2F2ZVNwYWNlQ2hhcnMpIHsKKyAgICAgICAgICAgICAgZGF0YVN0ci5UcmltUmlnaHQoTCIgXHRcclxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJbnNlcnRDb250ZW50U2VnbWVudChiQ0RBVEEsIGRhdGFTdHIsIHBFbGVtZW50KTsKKyAgICAgICAgICAgIGNvbnRlbnQuQ2xlYXIoKTsKKyAgICAgICAgICAgIGRlY29kZXIuQ2xlYXIoKTsKKyAgICAgICAgICAgIGJDREFUQSA9IEZBTFNFOworICAgICAgICAgICAgaVN0YXRlID0gMDsKKyAgICAgICAgICAgIG1fZHdJbmRleC0tOworICAgICAgICAgICAgQ1hNTF9FbGVtZW50KiBwU3ViRWxlbWVudCA9IFBhcnNlRWxlbWVudChwRWxlbWVudCwgVFJVRSk7CisgICAgICAgICAgICBpZiAoIXBTdWJFbGVtZW50KSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFN1YkVsZW1lbnQtPm1fcFBhcmVudCA9IHBFbGVtZW50OworICAgICAgICAgICAgcEVsZW1lbnQtPm1fQ2hpbGRyZW4uQWRkKCh2b2lkKilDWE1MX0VsZW1lbnQ6OkVsZW1lbnQpOworICAgICAgICAgICAgcEVsZW1lbnQtPm1fQ2hpbGRyZW4uQWRkKHBTdWJFbGVtZW50KTsKKyAgICAgICAgICAgIFNraXBXaGl0ZVNwYWNlcygpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgIGlmIChjaCA9PSAnWycpIHsKKyAgICAgICAgICAgIFNraXBMaXRlcmFscygiXV0+Iik7CisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnLScpIHsKKyAgICAgICAgICAgIG1fZHdJbmRleCsrOworICAgICAgICAgICAgU2tpcExpdGVyYWxzKCItLT4iKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU2tpcExpdGVyYWxzKCI+Iik7CisgICAgICAgICAgfQorICAgICAgICAgIGRlY29kZXIuQ2xlYXIoKTsKKyAgICAgICAgICBTa2lwV2hpdGVTcGFjZXMoKTsKKyAgICAgICAgICBpU3RhdGUgPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKGlTdGF0ZSA9PSAxMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIFhNTF9Db250aW51ZVBhcnNlKHBhcnNlciwgYlNhdmVTcGFjZUNoYXJzLCBwUGFyc2VkU2l6ZSk7Ci19Ci1DWE1MX0VsZW1lbnQqIENYTUxfRWxlbWVudDo6UGFyc2UoSUZYX0ZpbGVSZWFkICpwRmlsZSwgRlhfQk9PTCBiU2F2ZVNwYWNlQ2hhcnMsIEZYX0ZJTEVTSVpFKiBwUGFyc2VkU2l6ZSkKLXsKLSAgICBDWE1MX1BhcnNlciBwYXJzZXI7Ci0gICAgaWYgKCFwYXJzZXIuSW5pdChwRmlsZSkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgKEZYX0ZJTEVTSVpFKW1fZHdJbmRleDsKKyAgICBpZiAoaVN0YXRlID09IDEwIHx8IG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplIHx8IElzRU9GKCkpIHsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICByZXR1cm4gWE1MX0NvbnRpbnVlUGFyc2UocGFyc2VyLCBiU2F2ZVNwYWNlQ2hhcnMsIHBQYXJzZWRTaXplKTsKKyAgfSB3aGlsZSAoUmVhZE5leHRCbG9jaygpKTsKKyAgY29udGVudCA8PCBkZWNvZGVyLkdldFJlc3VsdCgpOworICBDRlhfV2lkZVN0cmluZyBkYXRhU3RyID0gY29udGVudC5HZXRXaWRlU3RyaW5nKCk7CisgIGlmICghbV9iU2F2ZVNwYWNlQ2hhcnMpIHsKKyAgICBkYXRhU3RyLlRyaW1SaWdodChMIiBcdFxyXG4iKTsKKyAgfQorICBJbnNlcnRDb250ZW50U2VnbWVudChiQ0RBVEEsIGRhdGFTdHIsIHBFbGVtZW50KTsKKyAgY29udGVudC5DbGVhcigpOworICBkZWNvZGVyLkNsZWFyKCk7CisgIGJDREFUQSA9IEZBTFNFOworICByZXR1cm4gcEVsZW1lbnQ7CiB9Ci1DWE1MX0VsZW1lbnQqIENYTUxfRWxlbWVudDo6UGFyc2UoSUZYX0J1ZmZlclJlYWQgKnBCdWZmZXIsIEZYX0JPT0wgYlNhdmVTcGFjZUNoYXJzLCBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUpCi17Ci0gICAgQ1hNTF9QYXJzZXIgcGFyc2VyOwotICAgIGlmICghcGFyc2VyLkluaXQocEJ1ZmZlcikpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Cit2b2lkIENYTUxfUGFyc2VyOjpJbnNlcnRDb250ZW50U2VnbWVudChGWF9CT09MIGJDREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYTUxfRWxlbWVudCogcEVsZW1lbnQpIHsKKyAgaWYgKGNvbnRlbnQuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisgIENYTUxfQ29udGVudCogcENvbnRlbnQgPSBuZXcgQ1hNTF9Db250ZW50OworICBwQ29udGVudC0+U2V0KGJDREFUQSwgY29udGVudCk7CisgIHBFbGVtZW50LT5tX0NoaWxkcmVuLkFkZCgodm9pZCopQ1hNTF9FbGVtZW50OjpDb250ZW50KTsKKyAgcEVsZW1lbnQtPm1fQ2hpbGRyZW4uQWRkKHBDb250ZW50KTsKK30KK3N0YXRpYyBDWE1MX0VsZW1lbnQqIFhNTF9Db250aW51ZVBhcnNlKENYTUxfUGFyc2VyJiBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlU3BhY2VDaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFKiBwUGFyc2VkU2l6ZSkgeworICBwYXJzZXIubV9iU2F2ZVNwYWNlQ2hhcnMgPSBiU2F2ZVNwYWNlQ2hhcnM7CisgIENYTUxfRWxlbWVudCogcEVsZW1lbnQgPSBwYXJzZXIuUGFyc2VFbGVtZW50KE5VTEwsIEZBTFNFKTsKKyAgaWYgKHBQYXJzZWRTaXplKSB7CisgICAgKnBQYXJzZWRTaXplID0gcGFyc2VyLm1fbk9mZnNldDsKKyAgfQorICByZXR1cm4gcEVsZW1lbnQ7Cit9CitDWE1MX0VsZW1lbnQqIENYTUxfRWxlbWVudDo6UGFyc2UoY29uc3Qgdm9pZCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlU3BhY2VDaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUpIHsKKyAgQ1hNTF9QYXJzZXIgcGFyc2VyOworICBpZiAoIXBhcnNlci5Jbml0KCh1aW50OF90KilwQnVmZmVyLCBzaXplKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBYTUxfQ29udGludWVQYXJzZShwYXJzZXIsIGJTYXZlU3BhY2VDaGFycywgcFBhcnNlZFNpemUpOworfQorQ1hNTF9FbGVtZW50KiBDWE1MX0VsZW1lbnQ6OlBhcnNlKElGWF9GaWxlUmVhZCogcEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVNwYWNlQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUqIHBQYXJzZWRTaXplKSB7CisgIENYTUxfUGFyc2VyIHBhcnNlcjsKKyAgaWYgKCFwYXJzZXIuSW5pdChwRmlsZSkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gWE1MX0NvbnRpbnVlUGFyc2UocGFyc2VyLCBiU2F2ZVNwYWNlQ2hhcnMsIHBQYXJzZWRTaXplKTsKK30KK0NYTUxfRWxlbWVudCogQ1hNTF9FbGVtZW50OjpQYXJzZShJRlhfQnVmZmVyUmVhZCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlU3BhY2VDaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSogcFBhcnNlZFNpemUpIHsKKyAgQ1hNTF9QYXJzZXIgcGFyc2VyOworICBpZiAoIXBhcnNlci5Jbml0KHBCdWZmZXIpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIFhNTF9Db250aW51ZVBhcnNlKHBhcnNlciwgYlNhdmVTcGFjZUNoYXJzLCBwUGFyc2VkU2l6ZSk7Cit9CitDWE1MX0VsZW1lbnQ6OkNYTUxfRWxlbWVudCgpIDogbV9RU3BhY2VOYW1lKCksIG1fVGFnTmFtZSgpLCBtX0F0dHJNYXAoKSB7fQorQ1hNTF9FbGVtZW50OjpDWE1MX0VsZW1lbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBxU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRhZ05hbWUpCisgICAgOiBtX1FTcGFjZU5hbWUoKSwgbV9UYWdOYW1lKCksIG1fQXR0ck1hcCgpIHsKKyAgbV9RU3BhY2VOYW1lID0gcVNwYWNlOworICBtX1RhZ05hbWUgPSB0YWdOYW1lOworfQorQ1hNTF9FbGVtZW50OjpDWE1MX0VsZW1lbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBxVGFnTmFtZSkKKyAgICA6IG1fcFBhcmVudChOVUxMKSwgbV9RU3BhY2VOYW1lKCksIG1fVGFnTmFtZSgpLCBtX0F0dHJNYXAoKSB7CisgIFNldFRhZyhxVGFnTmFtZSk7Cit9CitDWE1MX0VsZW1lbnQ6On5DWE1MX0VsZW1lbnQoKSB7CisgIEVtcHR5KCk7Cit9Cit2b2lkIENYTUxfRWxlbWVudDo6RW1wdHkoKSB7CisgIFJlbW92ZUNoaWxkcmVuKCk7Cit9Cit2b2lkIENYTUxfRWxlbWVudDo6UmVtb3ZlQ2hpbGRyZW4oKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9DaGlsZHJlbi5HZXRTaXplKCk7IGkgKz0gMikgeworICAgIENoaWxkVHlwZSB0eXBlID0gKENoaWxkVHlwZSkodWludHB0cl90KW1fQ2hpbGRyZW4uR2V0QXQoaSk7CisgICAgaWYgKHR5cGUgPT0gQ29udGVudCkgeworICAgICAgQ1hNTF9Db250ZW50KiBjb250ZW50ID0gKENYTUxfQ29udGVudCopbV9DaGlsZHJlbi5HZXRBdChpICsgMSk7CisgICAgICBkZWxldGUgY29udGVudDsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gRWxlbWVudCkgeworICAgICAgQ1hNTF9FbGVtZW50KiBjaGlsZCA9IChDWE1MX0VsZW1lbnQqKW1fQ2hpbGRyZW4uR2V0QXQoaSArIDEpOworICAgICAgY2hpbGQtPlJlbW92ZUNoaWxkcmVuKCk7CisgICAgICBkZWxldGUgY2hpbGQ7CiAgICAgfQotICAgIHJldHVybiBYTUxfQ29udGludWVQYXJzZShwYXJzZXIsIGJTYXZlU3BhY2VDaGFycywgcFBhcnNlZFNpemUpOworICB9CisgIG1fQ2hpbGRyZW4uUmVtb3ZlQWxsKCk7CiB9Ci1DWE1MX0VsZW1lbnQ6OkNYTUxfRWxlbWVudCgpCi0gICAgOiBtX1FTcGFjZU5hbWUoKQotICAgICwgbV9UYWdOYW1lKCkKLSAgICAsIG1fQXR0ck1hcCgpCi17CitDRlhfQnl0ZVN0cmluZyBDWE1MX0VsZW1lbnQ6OkdldFRhZ05hbWUoRlhfQk9PTCBiUXVhbGlmaWVkKSBjb25zdCB7CisgIGlmICghYlF1YWxpZmllZCB8fCBtX1FTcGFjZU5hbWUuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIG1fVGFnTmFtZTsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBic1RhZyA9IG1fUVNwYWNlTmFtZTsKKyAgYnNUYWcgKz0gIjoiOworICBic1RhZyArPSBtX1RhZ05hbWU7CisgIHJldHVybiBic1RhZzsKIH0KLUNYTUxfRWxlbWVudDo6Q1hNTF9FbGVtZW50KEZYX0JTVFIgcVNwYWNlLCBGWF9CU1RSIHRhZ05hbWUpCi0gICAgOiBtX1FTcGFjZU5hbWUoKQotICAgICwgbV9UYWdOYW1lKCkKLSAgICAsIG1fQXR0ck1hcCgpCi17Ci0gICAgbV9RU3BhY2VOYW1lID0gcVNwYWNlOwotICAgIG1fVGFnTmFtZSA9IHRhZ05hbWU7CitDRlhfQnl0ZVN0cmluZyBDWE1MX0VsZW1lbnQ6OkdldE5hbWVzcGFjZShGWF9CT09MIGJRdWFsaWZpZWQpIGNvbnN0IHsKKyAgaWYgKGJRdWFsaWZpZWQpIHsKKyAgICByZXR1cm4gbV9RU3BhY2VOYW1lOworICB9CisgIHJldHVybiBHZXROYW1lc3BhY2VVUkkobV9RU3BhY2VOYW1lKTsKIH0KLUNYTUxfRWxlbWVudDo6Q1hNTF9FbGVtZW50KEZYX0JTVFIgcVRhZ05hbWUpCi0gICAgOiBtX3BQYXJlbnQoTlVMTCkKLSAgICAsIG1fUVNwYWNlTmFtZSgpCi0gICAgLCBtX1RhZ05hbWUoKQotICAgICwgbV9BdHRyTWFwKCkKLXsKLSAgICBTZXRUYWcocVRhZ05hbWUpOwotfQotQ1hNTF9FbGVtZW50Ojp+Q1hNTF9FbGVtZW50KCkKLXsKLSAgICBFbXB0eSgpOwotfQotdm9pZCBDWE1MX0VsZW1lbnQ6OkVtcHR5KCkKLXsKLSAgICBSZW1vdmVDaGlsZHJlbigpOwotfQotdm9pZCBDWE1MX0VsZW1lbnQ6OlJlbW92ZUNoaWxkcmVuKCkKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fQ2hpbGRyZW4uR2V0U2l6ZSgpOyBpICs9IDIpIHsKLSAgICAgICAgQ2hpbGRUeXBlIHR5cGUgPSAoQ2hpbGRUeXBlKShGWF9VSU5UUFRSKW1fQ2hpbGRyZW4uR2V0QXQoaSk7Ci0gICAgICAgIGlmICh0eXBlID09IENvbnRlbnQpIHsKLSAgICAgICAgICAgIENYTUxfQ29udGVudCogY29udGVudCA9IChDWE1MX0NvbnRlbnQqKW1fQ2hpbGRyZW4uR2V0QXQoaSArIDEpOwotICAgICAgICAgICAgZGVsZXRlIGNvbnRlbnQ7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBFbGVtZW50KSB7Ci0gICAgICAgICAgICBDWE1MX0VsZW1lbnQqIGNoaWxkID0gKENYTUxfRWxlbWVudCopbV9DaGlsZHJlbi5HZXRBdChpICsgMSk7Ci0gICAgICAgICAgICBjaGlsZC0+UmVtb3ZlQ2hpbGRyZW4oKTsKLSAgICAgICAgICAgIGRlbGV0ZSBjaGlsZDsKLSAgICAgICAgfQorQ0ZYX0J5dGVTdHJpbmcgQ1hNTF9FbGVtZW50OjpHZXROYW1lc3BhY2VVUkkoCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBxTmFtZSkgY29uc3QgeworICBjb25zdCBDRlhfV2lkZVN0cmluZyogcHdzU3BhY2U7CisgIGNvbnN0IENYTUxfRWxlbWVudCogcEVsZW1lbnQgPSB0aGlzOworICBkbyB7CisgICAgaWYgKHFOYW1lLklzRW1wdHkoKSkgeworICAgICAgcHdzU3BhY2UgPSBwRWxlbWVudC0+bV9BdHRyTWFwLkxvb2t1cCgiIiwgInhtbG5zIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHB3c1NwYWNlID0gcEVsZW1lbnQtPm1fQXR0ck1hcC5Mb29rdXAoInhtbG5zIiwgcU5hbWUpOwogICAgIH0KLSAgICBtX0NoaWxkcmVuLlJlbW92ZUFsbCgpOwotfQotQ0ZYX0J5dGVTdHJpbmcgQ1hNTF9FbGVtZW50OjpHZXRUYWdOYW1lKEZYX0JPT0wgYlF1YWxpZmllZCkgY29uc3QKLXsKLSAgICBpZiAoIWJRdWFsaWZpZWQgfHwgbV9RU3BhY2VOYW1lLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gbV9UYWdOYW1lOworICAgIGlmIChwd3NTcGFjZSkgeworICAgICAgYnJlYWs7CiAgICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGJzVGFnID0gbV9RU3BhY2VOYW1lOwotICAgIGJzVGFnICs9ICI6IjsKLSAgICBic1RhZyArPSBtX1RhZ05hbWU7Ci0gICAgcmV0dXJuIGJzVGFnOworICAgIHBFbGVtZW50ID0gcEVsZW1lbnQtPkdldFBhcmVudCgpOworICB9IHdoaWxlIChwRWxlbWVudCk7CisgIHJldHVybiBwd3NTcGFjZSA/IEZYX1VURjhFbmNvZGUoKnB3c1NwYWNlKSA6IENGWF9CeXRlU3RyaW5nKCk7CiB9Ci1DRlhfQnl0ZVN0cmluZyBDWE1MX0VsZW1lbnQ6OkdldE5hbWVzcGFjZShGWF9CT09MIGJRdWFsaWZpZWQpIGNvbnN0Ci17Ci0gICAgaWYgKGJRdWFsaWZpZWQpIHsKLSAgICAgICAgcmV0dXJuIG1fUVNwYWNlTmFtZTsKLSAgICB9Ci0gICAgcmV0dXJuIEdldE5hbWVzcGFjZVVSSShtX1FTcGFjZU5hbWUpOwordm9pZCBDWE1MX0VsZW1lbnQ6OkdldEF0dHJCeUluZGV4KGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlKSBjb25zdCB7CisgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbV9BdHRyTWFwLkdldFNpemUoKSkgeworICAgIHJldHVybjsKKyAgfQorICBDWE1MX0F0dHJJdGVtJiBpdGVtID0gbV9BdHRyTWFwLkdldEF0KGluZGV4KTsKKyAgc3BhY2UgPSBpdGVtLm1fUVNwYWNlTmFtZTsKKyAgbmFtZSA9IGl0ZW0ubV9BdHRyTmFtZTsKKyAgdmFsdWUgPSBpdGVtLm1fVmFsdWU7CiB9Ci1DRlhfQnl0ZVN0cmluZyBDWE1MX0VsZW1lbnQ6OkdldE5hbWVzcGFjZVVSSShGWF9CU1RSIHFOYW1lKSBjb25zdAotewotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nKiBwd3NTcGFjZTsKLSAgICBjb25zdCBDWE1MX0VsZW1lbnQgKnBFbGVtZW50ID0gdGhpczsKLSAgICBkbyB7Ci0gICAgICAgIGlmIChxTmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHB3c1NwYWNlID0gcEVsZW1lbnQtPm1fQXR0ck1hcC5Mb29rdXAoRlhfQlNUUkMoIiIpLCBGWF9CU1RSQygieG1sbnMiKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwd3NTcGFjZSA9IHBFbGVtZW50LT5tX0F0dHJNYXAuTG9va3VwKEZYX0JTVFJDKCJ4bWxucyIpLCBxTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHB3c1NwYWNlKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBwRWxlbWVudCA9IHBFbGVtZW50LT5HZXRQYXJlbnQoKTsKLSAgICB9IHdoaWxlKHBFbGVtZW50KTsKLSAgICByZXR1cm4gcHdzU3BhY2UgPyBGWF9VVEY4RW5jb2RlKCpwd3NTcGFjZSkgOiBDRlhfQnl0ZVN0cmluZygpOworRlhfQk9PTCBDWE1MX0VsZW1lbnQ6Okhhc0F0dHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lKSBjb25zdCB7CisgIENGWF9CeXRlU3RyaW5nQyBic1NwYWNlLCBic05hbWU7CisgIEZYX1hNTF9TcGxpdFF1YWxpZmllZE5hbWUobmFtZSwgYnNTcGFjZSwgYnNOYW1lKTsKKyAgcmV0dXJuIG1fQXR0ck1hcC5Mb29rdXAoYnNTcGFjZSwgYnNOYW1lKSAhPSBOVUxMOwogfQotdm9pZCBDWE1MX0VsZW1lbnQ6OkdldEF0dHJCeUluZGV4KGludCBpbmRleCwgQ0ZYX0J5dGVTdHJpbmcmIHNwYWNlLCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlKSBjb25zdAotewotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbV9BdHRyTWFwLkdldFNpemUoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENYTUxfQXR0ckl0ZW0mIGl0ZW0gPSBtX0F0dHJNYXAuR2V0QXQoaW5kZXgpOwotICAgIHNwYWNlID0gaXRlbS5tX1FTcGFjZU5hbWU7Ci0gICAgbmFtZSA9IGl0ZW0ubV9BdHRyTmFtZTsKLSAgICB2YWx1ZSA9IGl0ZW0ubV9WYWx1ZTsKK0ZYX0JPT0wgQ1hNTF9FbGVtZW50OjpHZXRBdHRyVmFsdWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgYXR0cmlidXRlKSBjb25zdCB7CisgIENGWF9CeXRlU3RyaW5nQyBic1NwYWNlLCBic05hbWU7CisgIEZYX1hNTF9TcGxpdFF1YWxpZmllZE5hbWUobmFtZSwgYnNTcGFjZSwgYnNOYW1lKTsKKyAgcmV0dXJuIEdldEF0dHJWYWx1ZShic1NwYWNlLCBic05hbWUsIGF0dHJpYnV0ZSk7CiB9Ci1GWF9CT09MIENYTUxfRWxlbWVudDo6SGFzQXR0cihGWF9CU1RSIG5hbWUpIGNvbnN0Ci17Ci0gICAgQ0ZYX0J5dGVTdHJpbmdDIGJzU3BhY2UsIGJzTmFtZTsKLSAgICBGWF9YTUxfU3BsaXRRdWFsaWZpZWROYW1lKG5hbWUsIGJzU3BhY2UsIGJzTmFtZSk7Ci0gICAgcmV0dXJuIG1fQXR0ck1hcC5Mb29rdXAoYnNTcGFjZSwgYnNOYW1lKSAhPSBOVUxMOworRlhfQk9PTCBDWE1MX0VsZW1lbnQ6OkdldEF0dHJWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBhdHRyaWJ1dGUpIGNvbnN0IHsKKyAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcqIHBWYWx1ZSA9IG1fQXR0ck1hcC5Mb29rdXAoc3BhY2UsIG5hbWUpOworICBpZiAocFZhbHVlKSB7CisgICAgYXR0cmlidXRlID0gKnBWYWx1ZTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1GWF9CT09MIENYTUxfRWxlbWVudDo6R2V0QXR0clZhbHVlKEZYX0JTVFIgbmFtZSwgQ0ZYX1dpZGVTdHJpbmcmIGF0dHJpYnV0ZSkgY29uc3QKLXsKLSAgICBDRlhfQnl0ZVN0cmluZ0MgYnNTcGFjZSwgYnNOYW1lOwotICAgIEZYX1hNTF9TcGxpdFF1YWxpZmllZE5hbWUobmFtZSwgYnNTcGFjZSwgYnNOYW1lKTsKLSAgICByZXR1cm4gR2V0QXR0clZhbHVlKGJzU3BhY2UsIGJzTmFtZSwgYXR0cmlidXRlKTsKK0ZYX0JPT0wgQ1hNTF9FbGVtZW50OjpHZXRBdHRySW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBhdHRyaWJ1dGUpIGNvbnN0IHsKKyAgQ0ZYX0J5dGVTdHJpbmdDIGJzU3BhY2UsIGJzTmFtZTsKKyAgRlhfWE1MX1NwbGl0UXVhbGlmaWVkTmFtZShuYW1lLCBic1NwYWNlLCBic05hbWUpOworICBjb25zdCBDRlhfV2lkZVN0cmluZyogcHdzVmFsdWUgPSBtX0F0dHJNYXAuTG9va3VwKGJzU3BhY2UsIGJzTmFtZSk7CisgIGlmIChwd3NWYWx1ZSkgeworICAgIGF0dHJpYnV0ZSA9IHB3c1ZhbHVlLT5HZXRJbnRlZ2VyKCk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQotRlhfQk9PTCBDWE1MX0VsZW1lbnQ6OkdldEF0dHJWYWx1ZShGWF9CU1RSIHNwYWNlLCBGWF9CU1RSIG5hbWUsIENGWF9XaWRlU3RyaW5nJiBhdHRyaWJ1dGUpIGNvbnN0Ci17Ci0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcqIHBWYWx1ZSA9IG1fQXR0ck1hcC5Mb29rdXAoc3BhY2UsIG5hbWUpOwotICAgIGlmIChwVmFsdWUpIHsKLSAgICAgICAgYXR0cmlidXRlID0gKnBWYWx1ZTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1hNTF9FbGVtZW50OjpHZXRBdHRySW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGF0dHJpYnV0ZSkgY29uc3QgeworICBjb25zdCBDRlhfV2lkZVN0cmluZyogcHdzVmFsdWUgPSBtX0F0dHJNYXAuTG9va3VwKHNwYWNlLCBuYW1lKTsKKyAgaWYgKHB3c1ZhbHVlKSB7CisgICAgYXR0cmlidXRlID0gcHdzVmFsdWUtPkdldEludGVnZXIoKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1GWF9CT09MIENYTUxfRWxlbWVudDo6R2V0QXR0ckludGVnZXIoRlhfQlNUUiBuYW1lLCBpbnQmIGF0dHJpYnV0ZSkgY29uc3QKLXsKLSAgICBDRlhfQnl0ZVN0cmluZ0MgYnNTcGFjZSwgYnNOYW1lOwotICAgIEZYX1hNTF9TcGxpdFF1YWxpZmllZE5hbWUobmFtZSwgYnNTcGFjZSwgYnNOYW1lKTsKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZyogcHdzVmFsdWUgPSBtX0F0dHJNYXAuTG9va3VwKGJzU3BhY2UsIGJzTmFtZSk7Ci0gICAgaWYgKHB3c1ZhbHVlKSB7Ci0gICAgICAgIGF0dHJpYnV0ZSA9IHB3c1ZhbHVlLT5HZXRJbnRlZ2VyKCk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CitGWF9CT09MIENYTUxfRWxlbWVudDo6R2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGF0dHJpYnV0ZSkgY29uc3QgeworICBDRlhfQnl0ZVN0cmluZ0MgYnNTcGFjZSwgYnNOYW1lOworICBGWF9YTUxfU3BsaXRRdWFsaWZpZWROYW1lKG5hbWUsIGJzU3BhY2UsIGJzTmFtZSk7CisgIHJldHVybiBHZXRBdHRyRmxvYXQoYnNTcGFjZSwgYnNOYW1lLCBhdHRyaWJ1dGUpOwogfQotRlhfQk9PTAlDWE1MX0VsZW1lbnQ6OkdldEF0dHJJbnRlZ2VyKEZYX0JTVFIgc3BhY2UsIEZYX0JTVFIgbmFtZSwgaW50JiBhdHRyaWJ1dGUpIGNvbnN0Ci17Ci0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcqIHB3c1ZhbHVlID0gbV9BdHRyTWFwLkxvb2t1cChzcGFjZSwgbmFtZSk7Ci0gICAgaWYgKHB3c1ZhbHVlKSB7Ci0gICAgICAgIGF0dHJpYnV0ZSA9IHB3c1ZhbHVlLT5HZXRJbnRlZ2VyKCk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CitGWF9CT09MIENYTUxfRWxlbWVudDo6R2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGF0dHJpYnV0ZSkgY29uc3QgeworICBjb25zdCBDRlhfV2lkZVN0cmluZyogcFZhbHVlID0gbV9BdHRyTWFwLkxvb2t1cChzcGFjZSwgbmFtZSk7CisgIGlmIChwVmFsdWUpIHsKKyAgICBhdHRyaWJ1dGUgPSBwVmFsdWUtPkdldEZsb2F0KCk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQotRlhfQk9PTCBDWE1MX0VsZW1lbnQ6OkdldEF0dHJGbG9hdChGWF9CU1RSIG5hbWUsIEZYX0ZMT0FUJiBhdHRyaWJ1dGUpIGNvbnN0Ci17Ci0gICAgQ0ZYX0J5dGVTdHJpbmdDIGJzU3BhY2UsIGJzTmFtZTsKLSAgICBGWF9YTUxfU3BsaXRRdWFsaWZpZWROYW1lKG5hbWUsIGJzU3BhY2UsIGJzTmFtZSk7Ci0gICAgcmV0dXJuIEdldEF0dHJGbG9hdChic1NwYWNlLCBic05hbWUsIGF0dHJpYnV0ZSk7CitGWF9EV09SRCBDWE1MX0VsZW1lbnQ6OkNvdW50Q2hpbGRyZW4oKSBjb25zdCB7CisgIHJldHVybiBtX0NoaWxkcmVuLkdldFNpemUoKSAvIDI7CiB9Ci1GWF9CT09MIENYTUxfRWxlbWVudDo6R2V0QXR0ckZsb2F0KEZYX0JTVFIgc3BhY2UsIEZYX0JTVFIgbmFtZSwgRlhfRkxPQVQmIGF0dHJpYnV0ZSkgY29uc3QKLXsKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZyogcFZhbHVlID0gbV9BdHRyTWFwLkxvb2t1cChzcGFjZSwgbmFtZSk7Ci0gICAgaWYgKHBWYWx1ZSkgewotICAgICAgICBhdHRyaWJ1dGUgPSBwVmFsdWUtPkdldEZsb2F0KCk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7CitDWE1MX0VsZW1lbnQ6OkNoaWxkVHlwZSBDWE1MX0VsZW1lbnQ6OkdldENoaWxkVHlwZShGWF9EV09SRCBpbmRleCkgY29uc3QgeworICBpbmRleCA8PD0gMTsKKyAgaWYgKGluZGV4ID49IChGWF9EV09SRCltX0NoaWxkcmVuLkdldFNpemUoKSkgeworICAgIHJldHVybiBJbnZhbGlkOworICB9CisgIHJldHVybiAoQ2hpbGRUeXBlKSh1aW50cHRyX3QpbV9DaGlsZHJlbi5HZXRBdChpbmRleCk7CiB9Ci1GWF9EV09SRCBDWE1MX0VsZW1lbnQ6OkNvdW50Q2hpbGRyZW4oKSBjb25zdAotewotICAgIHJldHVybiBtX0NoaWxkcmVuLkdldFNpemUoKSAvIDI7Ci19Ci1DWE1MX0VsZW1lbnQ6OkNoaWxkVHlwZSBDWE1MX0VsZW1lbnQ6OkdldENoaWxkVHlwZShGWF9EV09SRCBpbmRleCkgY29uc3QKLXsKLSAgICBpbmRleCA8PD0gMTsKLSAgICBpZiAoaW5kZXggPj0gKEZYX0RXT1JEKW1fQ2hpbGRyZW4uR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBJbnZhbGlkOwotICAgIH0KLSAgICByZXR1cm4gKENoaWxkVHlwZSkoRlhfVUlOVFBUUiltX0NoaWxkcmVuLkdldEF0KGluZGV4KTsKLX0KLUNGWF9XaWRlU3RyaW5nIENYTUxfRWxlbWVudDo6R2V0Q29udGVudChGWF9EV09SRCBpbmRleCkgY29uc3QKLXsKLSAgICBpbmRleCA8PD0gMTsKLSAgICBpZiAoaW5kZXggPj0gKEZYX0RXT1JEKW1fQ2hpbGRyZW4uR2V0U2l6ZSgpIHx8Ci0gICAgICAgICAgICAoQ2hpbGRUeXBlKShGWF9VSU5UUFRSKW1fQ2hpbGRyZW4uR2V0QXQoaW5kZXgpICE9IENvbnRlbnQpIHsKLSAgICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgfQotICAgIENYTUxfQ29udGVudCogcENvbnRlbnQgPSAoQ1hNTF9Db250ZW50KiltX0NoaWxkcmVuLkdldEF0KGluZGV4ICsgMSk7Ci0gICAgaWYgKHBDb250ZW50KSB7Ci0gICAgICAgIHJldHVybiBwQ29udGVudC0+bV9Db250ZW50OwotICAgIH0KK0NGWF9XaWRlU3RyaW5nIENYTUxfRWxlbWVudDo6R2V0Q29udGVudChGWF9EV09SRCBpbmRleCkgY29uc3QgeworICBpbmRleCA8PD0gMTsKKyAgaWYgKGluZGV4ID49IChGWF9EV09SRCltX0NoaWxkcmVuLkdldFNpemUoKSB8fAorICAgICAgKENoaWxkVHlwZSkodWludHB0cl90KW1fQ2hpbGRyZW4uR2V0QXQoaW5kZXgpICE9IENvbnRlbnQpIHsKICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgfQorICBDWE1MX0NvbnRlbnQqIHBDb250ZW50ID0gKENYTUxfQ29udGVudCopbV9DaGlsZHJlbi5HZXRBdChpbmRleCArIDEpOworICBpZiAocENvbnRlbnQpIHsKKyAgICByZXR1cm4gcENvbnRlbnQtPm1fQ29udGVudDsKKyAgfQorICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKIH0KLUNYTUxfRWxlbWVudCogQ1hNTF9FbGVtZW50OjpHZXRFbGVtZW50KEZYX0RXT1JEIGluZGV4KSBjb25zdAotewotICAgIGluZGV4IDw8PSAxOwotICAgIGlmIChpbmRleCA+PSAoRlhfRFdPUkQpbV9DaGlsZHJlbi5HZXRTaXplKCkgfHwKLSAgICAgICAgICAgIChDaGlsZFR5cGUpKEZYX1VJTlRQVFIpbV9DaGlsZHJlbi5HZXRBdChpbmRleCkgIT0gRWxlbWVudCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIChDWE1MX0VsZW1lbnQqKW1fQ2hpbGRyZW4uR2V0QXQoaW5kZXggKyAxKTsKLX0KLUZYX0RXT1JEIENYTUxfRWxlbWVudDo6Q291bnRFbGVtZW50cyhGWF9CU1RSIHNwYWNlLCBGWF9CU1RSIHRhZykgY29uc3QKLXsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9DaGlsZHJlbi5HZXRTaXplKCk7IGkgKz0gMikgewotICAgICAgICBDaGlsZFR5cGUgdHlwZSA9IChDaGlsZFR5cGUpKEZYX1VJTlRQVFIpbV9DaGlsZHJlbi5HZXRBdChpKTsKLSAgICAgICAgaWYgKHR5cGUgIT0gRWxlbWVudCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1hNTF9FbGVtZW50KiBwS2lkID0gKENYTUxfRWxlbWVudCopbV9DaGlsZHJlbi5HZXRBdChpICsgMSk7Ci0gICAgICAgIGlmICgoc3BhY2UuSXNFbXB0eSgpIHx8IHBLaWQtPm1fUVNwYWNlTmFtZSA9PSBzcGFjZSkgJiYgcEtpZC0+bV9UYWdOYW1lID09IHRhZykgewotICAgICAgICAgICAgY291bnQgKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGNvdW50OwotfQotQ1hNTF9FbGVtZW50KiBDWE1MX0VsZW1lbnQ6OkdldEVsZW1lbnQoRlhfQlNUUiBzcGFjZSwgRlhfQlNUUiB0YWcsIGludCBpbmRleCkgY29uc3QKLXsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fQ2hpbGRyZW4uR2V0U2l6ZSgpOyBpICs9IDIpIHsKLSAgICAgICAgQ2hpbGRUeXBlIHR5cGUgPSAoQ2hpbGRUeXBlKShGWF9VSU5UUFRSKW1fQ2hpbGRyZW4uR2V0QXQoaSk7Ci0gICAgICAgIGlmICh0eXBlICE9IEVsZW1lbnQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIENYTUxfRWxlbWVudCogcEtpZCA9IChDWE1MX0VsZW1lbnQqKW1fQ2hpbGRyZW4uR2V0QXQoaSArIDEpOwotICAgICAgICBpZiAoKCFzcGFjZS5Jc0VtcHR5KCkgJiYgcEtpZC0+bV9RU3BhY2VOYW1lICE9IHNwYWNlKSB8fCBwS2lkLT5tX1RhZ05hbWUgIT0gdGFnKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5kZXggLS0gPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIHBLaWQ7Ci0gICAgICAgIH0KLSAgICB9CitDWE1MX0VsZW1lbnQqIENYTUxfRWxlbWVudDo6R2V0RWxlbWVudChGWF9EV09SRCBpbmRleCkgY29uc3QgeworICBpbmRleCA8PD0gMTsKKyAgaWYgKGluZGV4ID49IChGWF9EV09SRCltX0NoaWxkcmVuLkdldFNpemUoKSB8fAorICAgICAgKENoaWxkVHlwZSkodWludHB0cl90KW1fQ2hpbGRyZW4uR2V0QXQoaW5kZXgpICE9IEVsZW1lbnQpIHsKICAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gKENYTUxfRWxlbWVudCopbV9DaGlsZHJlbi5HZXRBdChpbmRleCArIDEpOwogfQotRlhfRFdPUkQgQ1hNTF9FbGVtZW50OjpGaW5kRWxlbWVudChDWE1MX0VsZW1lbnQgKnBDaGlsZCkgY29uc3QKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fQ2hpbGRyZW4uR2V0U2l6ZSgpOyBpICs9IDIpIHsKLSAgICAgICAgaWYgKChDaGlsZFR5cGUpKEZYX1VJTlRQVFIpbV9DaGlsZHJlbi5HZXRBdChpKSA9PSBFbGVtZW50ICYmCi0gICAgICAgICAgICAgICAgKENYTUxfRWxlbWVudCopbV9DaGlsZHJlbi5HZXRBdChpICsgMSkgPT0gcENoaWxkKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEZYX0RXT1JEKShpID4+IDEpOwotICAgICAgICB9CitGWF9EV09SRCBDWE1MX0VsZW1lbnQ6OkNvdW50RWxlbWVudHMoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRhZykgY29uc3QgeworICBpbnQgY291bnQgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IG1fQ2hpbGRyZW4uR2V0U2l6ZSgpOyBpICs9IDIpIHsKKyAgICBDaGlsZFR5cGUgdHlwZSA9IChDaGlsZFR5cGUpKHVpbnRwdHJfdCltX0NoaWxkcmVuLkdldEF0KGkpOworICAgIGlmICh0eXBlICE9IEVsZW1lbnQpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICByZXR1cm4gKEZYX0RXT1JEKSAtIDE7CisgICAgQ1hNTF9FbGVtZW50KiBwS2lkID0gKENYTUxfRWxlbWVudCopbV9DaGlsZHJlbi5HZXRBdChpICsgMSk7CisgICAgaWYgKChzcGFjZS5Jc0VtcHR5KCkgfHwgcEtpZC0+bV9RU3BhY2VOYW1lID09IHNwYWNlKSAmJgorICAgICAgICBwS2lkLT5tX1RhZ05hbWUgPT0gdGFnKSB7CisgICAgICBjb3VudCsrOworICAgIH0KKyAgfQorICByZXR1cm4gY291bnQ7CiB9Ci1jb25zdCBDRlhfV2lkZVN0cmluZyogQ1hNTF9BdHRyTWFwOjpMb29rdXAoRlhfQlNUUiBzcGFjZSwgRlhfQlNUUiBuYW1lKSBjb25zdAotewotICAgIGlmIChtX3BNYXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3BNYXAtPkdldFNpemUoKTsgaSArKykgewotICAgICAgICBDWE1MX0F0dHJJdGVtJiBpdGVtID0gR2V0QXQoaSk7Ci0gICAgICAgIGlmICgoc3BhY2UuSXNFbXB0eSgpIHx8IGl0ZW0ubV9RU3BhY2VOYW1lID09IHNwYWNlKSAmJiBpdGVtLm1fQXR0ck5hbWUgPT0gbmFtZSkgewotICAgICAgICAgICAgcmV0dXJuICZpdGVtLm1fVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9CitDWE1MX0VsZW1lbnQqIENYTUxfRWxlbWVudDo6R2V0RWxlbWVudChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0IHsKKyAgaWYgKGluZGV4IDwgMCkgewogICAgIHJldHVybiBOVUxMOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9DaGlsZHJlbi5HZXRTaXplKCk7IGkgKz0gMikgeworICAgIENoaWxkVHlwZSB0eXBlID0gKENoaWxkVHlwZSkodWludHB0cl90KW1fQ2hpbGRyZW4uR2V0QXQoaSk7CisgICAgaWYgKHR5cGUgIT0gRWxlbWVudCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIENYTUxfRWxlbWVudCogcEtpZCA9IChDWE1MX0VsZW1lbnQqKW1fQ2hpbGRyZW4uR2V0QXQoaSArIDEpOworICAgIGlmICgoIXNwYWNlLklzRW1wdHkoKSAmJiBwS2lkLT5tX1FTcGFjZU5hbWUgIT0gc3BhY2UpIHx8CisgICAgICAgIHBLaWQtPm1fVGFnTmFtZSAhPSB0YWcpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoaW5kZXgtLSA9PSAwKSB7CisgICAgICByZXR1cm4gcEtpZDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7CiB9Ci12b2lkIENYTUxfQXR0ck1hcDo6U2V0QXQoRlhfQlNUUiBzcGFjZSwgRlhfQlNUUiBuYW1lLCBGWF9XU1RSIHZhbHVlKQotewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgR2V0U2l6ZSgpOyBpKyspIHsKLSAgICAgICAgQ1hNTF9BdHRySXRlbSYgaXRlbSA9IEdldEF0KGkpOwotICAgICAgICBpZiAoKHNwYWNlLklzRW1wdHkoKSB8fCBpdGVtLm1fUVNwYWNlTmFtZSA9PSBzcGFjZSkgJiYgaXRlbS5tX0F0dHJOYW1lID09IG5hbWUpIHsKLSAgICAgICAgICAgIGl0ZW0ubV9WYWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CitGWF9EV09SRCBDWE1MX0VsZW1lbnQ6OkZpbmRFbGVtZW50KENYTUxfRWxlbWVudCogcENoaWxkKSBjb25zdCB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9DaGlsZHJlbi5HZXRTaXplKCk7IGkgKz0gMikgeworICAgIGlmICgoQ2hpbGRUeXBlKSh1aW50cHRyX3QpbV9DaGlsZHJlbi5HZXRBdChpKSA9PSBFbGVtZW50ICYmCisgICAgICAgIChDWE1MX0VsZW1lbnQqKW1fQ2hpbGRyZW4uR2V0QXQoaSArIDEpID09IHBDaGlsZCkgeworICAgICAgcmV0dXJuIChGWF9EV09SRCkoaSA+PiAxKTsKICAgICB9Ci0gICAgaWYgKCFtX3BNYXApIHsKLSAgICAgICAgbV9wTWFwID0gbmV3IENGWF9PYmplY3RBcnJheTxDWE1MX0F0dHJJdGVtPjsKLSAgICB9Ci0gICAgQ1hNTF9BdHRySXRlbSogcEl0ZW0gPSAoQ1hNTF9BdHRySXRlbSopbV9wTWFwLT5BZGRTcGFjZSgpOwotICAgIGlmICghcEl0ZW0pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwSXRlbS0+bV9RU3BhY2VOYW1lID0gc3BhY2U7Ci0gICAgcEl0ZW0tPm1fQXR0ck5hbWUgPSBuYW1lOwotICAgIHBJdGVtLT5tX1ZhbHVlID0gdmFsdWU7CisgIH0KKyAgcmV0dXJuIChGWF9EV09SRCktMTsKIH0KLXZvaWQgQ1hNTF9BdHRyTWFwOjpSZW1vdmVBdChGWF9CU1RSIHNwYWNlLCBGWF9CU1RSIG5hbWUpCi17Ci0gICAgaWYgKG1fcE1hcCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKK2NvbnN0IENGWF9XaWRlU3RyaW5nKiBDWE1MX0F0dHJNYXA6Okxvb2t1cChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3QgeworICBpZiAoIW1fcE1hcCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9wTWFwLT5HZXRTaXplKCk7IGkrKykgeworICAgIENYTUxfQXR0ckl0ZW0mIGl0ZW0gPSBHZXRBdChpKTsKKyAgICBpZiAoKHNwYWNlLklzRW1wdHkoKSB8fCBpdGVtLm1fUVNwYWNlTmFtZSA9PSBzcGFjZSkgJiYKKyAgICAgICAgaXRlbS5tX0F0dHJOYW1lID09IG5hbWUpIHsKKyAgICAgIHJldHVybiAmaXRlbS5tX1ZhbHVlOwogICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fcE1hcC0+R2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIENYTUxfQXR0ckl0ZW0mIGl0ZW0gPSBHZXRBdChpKTsKLSAgICAgICAgaWYgKChzcGFjZS5Jc0VtcHR5KCkgfHwgaXRlbS5tX1FTcGFjZU5hbWUgPT0gc3BhY2UpICYmIGl0ZW0ubV9BdHRyTmFtZSA9PSBuYW1lKSB7Ci0gICAgICAgICAgICBtX3BNYXAtPlJlbW92ZUF0KGkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9Cit2b2lkIENYTUxfQXR0ck1hcDo6U2V0QXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB2YWx1ZSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IEdldFNpemUoKTsgaSsrKSB7CisgICAgQ1hNTF9BdHRySXRlbSYgaXRlbSA9IEdldEF0KGkpOworICAgIGlmICgoc3BhY2UuSXNFbXB0eSgpIHx8IGl0ZW0ubV9RU3BhY2VOYW1lID09IHNwYWNlKSAmJgorICAgICAgICBpdGVtLm1fQXR0ck5hbWUgPT0gbmFtZSkgeworICAgICAgaXRlbS5tX1ZhbHVlID0gdmFsdWU7CisgICAgICByZXR1cm47CiAgICAgfQorICB9CisgIGlmICghbV9wTWFwKSB7CisgICAgbV9wTWFwID0gbmV3IENGWF9PYmplY3RBcnJheTxDWE1MX0F0dHJJdGVtPjsKKyAgfQorICBDWE1MX0F0dHJJdGVtKiBwSXRlbSA9IChDWE1MX0F0dHJJdGVtKiltX3BNYXAtPkFkZFNwYWNlKCk7CisgIGlmICghcEl0ZW0pIHsKKyAgICByZXR1cm47CisgIH0KKyAgcEl0ZW0tPm1fUVNwYWNlTmFtZSA9IHNwYWNlOworICBwSXRlbS0+bV9BdHRyTmFtZSA9IG5hbWU7CisgIHBJdGVtLT5tX1ZhbHVlID0gdmFsdWU7CiB9Ci1pbnQgQ1hNTF9BdHRyTWFwOjpHZXRTaXplKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wTWFwID09IE5VTEwgPyAwIDogbV9wTWFwLT5HZXRTaXplKCk7Ci19Ci1DWE1MX0F0dHJJdGVtJiBDWE1MX0F0dHJNYXA6OkdldEF0KGludCBpbmRleCkgY29uc3QKLXsKLSAgICBBU1NFUlQobV9wTWFwICE9IE5VTEwpOwotICAgIHJldHVybiAoKm1fcE1hcClbaW5kZXhdOwotfQotdm9pZCBDWE1MX0F0dHJNYXA6OlJlbW92ZUFsbCgpCi17Ci0gICAgaWYgKCFtX3BNYXApIHsKLSAgICAgICAgcmV0dXJuOwordm9pZCBDWE1MX0F0dHJNYXA6OlJlbW92ZUF0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lKSB7CisgIGlmICghbV9wTWFwKSB7CisgICAgcmV0dXJuOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9wTWFwLT5HZXRTaXplKCk7IGkrKykgeworICAgIENYTUxfQXR0ckl0ZW0mIGl0ZW0gPSBHZXRBdChpKTsKKyAgICBpZiAoKHNwYWNlLklzRW1wdHkoKSB8fCBpdGVtLm1fUVNwYWNlTmFtZSA9PSBzcGFjZSkgJiYKKyAgICAgICAgaXRlbS5tX0F0dHJOYW1lID09IG5hbWUpIHsKKyAgICAgIG1fcE1hcC0+UmVtb3ZlQXQoaSk7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIG1fcE1hcC0+UmVtb3ZlQWxsKCk7Ci0gICAgZGVsZXRlIG1fcE1hcDsKLSAgICBtX3BNYXAgPSBOVUxMOworICB9Cit9CitpbnQgQ1hNTF9BdHRyTWFwOjpHZXRTaXplKCkgY29uc3QgeworICByZXR1cm4gbV9wTWFwID8gbV9wTWFwLT5HZXRTaXplKCkgOiAwOworfQorQ1hNTF9BdHRySXRlbSYgQ1hNTF9BdHRyTWFwOjpHZXRBdChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuICgqbV9wTWFwKVtpbmRleF07Cit9Cit2b2lkIENYTUxfQXR0ck1hcDo6UmVtb3ZlQWxsKCkgeworICBpZiAoIW1fcE1hcCkgeworICAgIHJldHVybjsKKyAgfQorICBtX3BNYXAtPlJlbW92ZUFsbCgpOworICBkZWxldGUgbV9wTWFwOworICBtX3BNYXAgPSBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQvZnhjcnRfcGxhdGZvcm1zLmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3BsYXRmb3Jtcy5jcHAKaW5kZXggOTQyZDZhMy4uNGMxMjNkMyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhjcnRfcGxhdGZvcm1zLmNwcAorKysgYi9jb3JlL3NyYy9meGNydC9meGNydF9wbGF0Zm9ybXMuY3BwCkBAIC0xLDE5MiArMSwxMzIgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfZXh0LmgiCiAjaW5jbHVkZSAiZnhjcnRfcGxhdGZvcm1zLmgiCi0jaWYgKF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18gJiYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9MSU5VWF8gJiYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9BUFBMRV8gJiYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9BTkRST0lEXykKLUlGWENSVF9GaWxlQWNjZXNzKiBGWENSVF9GaWxlQWNjZXNzX0NyZWF0ZSgpCi17Ci0gICAgcmV0dXJuIG5ldyBDRlhDUlRfRmlsZUFjY2Vzc19DUlQ7CisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKKworI2lmIChfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfICYmIFwKKyAgICAgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9MSU5VWF8gJiYgICBcCisgICAgIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fQVBQTEVfICYmICAgXAorICAgICBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX0FORFJPSURfKQorSUZYQ1JUX0ZpbGVBY2Nlc3MqIEZYQ1JUX0ZpbGVBY2Nlc3NfQ3JlYXRlKCkgeworICByZXR1cm4gbmV3IENGWENSVF9GaWxlQWNjZXNzX0NSVDsKIH0KLXZvaWQgRlhDUlRfR2V0RmlsZU1vZGVTdHJpbmcoRlhfRFdPUkQgZHdNb2RlcywgQ0ZYX0J5dGVTdHJpbmcgJmJzTW9kZSkKLXsKLSAgICBpZiAoZHdNb2RlcyAmIEZYX0ZJTEVNT0RFX1JlYWRPbmx5KSB7Ci0gICAgICAgIGJzTW9kZSA9IEZYX0JTVFJDKCJyYiIpOwotICAgIH0gZWxzZSBpZiAoZHdNb2RlcyAmIEZYX0ZJTEVNT0RFX1RydW5jYXRlKSB7Ci0gICAgICAgIGJzTW9kZSA9IEZYX0JTVFJDKCJ3K2IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBic01vZGUgPSBGWF9CU1RSQygiYStiIik7Ci0gICAgfQordm9pZCBGWENSVF9HZXRGaWxlTW9kZVN0cmluZyhGWF9EV09SRCBkd01vZGVzLCBDRlhfQnl0ZVN0cmluZyYgYnNNb2RlKSB7CisgIGlmIChkd01vZGVzICYgRlhfRklMRU1PREVfUmVhZE9ubHkpIHsKKyAgICBic01vZGUgPSAicmIiOworICB9IGVsc2UgaWYgKGR3TW9kZXMgJiBGWF9GSUxFTU9ERV9UcnVuY2F0ZSkgeworICAgIGJzTW9kZSA9ICJ3K2IiOworICB9IGVsc2UgeworICAgIGJzTW9kZSA9ICJhK2IiOworICB9CiB9Ci12b2lkIEZYQ1JUX0dldEZpbGVNb2RlU3RyaW5nKEZYX0RXT1JEIGR3TW9kZXMsIENGWF9XaWRlU3RyaW5nICZ3c01vZGUpCi17Ci0gICAgaWYgKGR3TW9kZXMgJiBGWF9GSUxFTU9ERV9SZWFkT25seSkgewotICAgICAgICB3c01vZGUgPSBGWF9XU1RSQyhMInJiIik7Ci0gICAgfSBlbHNlIGlmIChkd01vZGVzICYgRlhfRklMRU1PREVfVHJ1bmNhdGUpIHsKLSAgICAgICAgd3NNb2RlID0gRlhfV1NUUkMoTCJ3K2IiKTsKLSAgICB9IGVsc2UgewotICAgICAgICB3c01vZGUgPSBGWF9XU1RSQyhMImErYiIpOwotICAgIH0KK3ZvaWQgRlhDUlRfR2V0RmlsZU1vZGVTdHJpbmcoRlhfRFdPUkQgZHdNb2RlcywgQ0ZYX1dpZGVTdHJpbmcmIHdzTW9kZSkgeworICBpZiAoZHdNb2RlcyAmIEZYX0ZJTEVNT0RFX1JlYWRPbmx5KSB7CisgICAgd3NNb2RlID0gRlhfV1NUUkMoTCJyYiIpOworICB9IGVsc2UgaWYgKGR3TW9kZXMgJiBGWF9GSUxFTU9ERV9UcnVuY2F0ZSkgeworICAgIHdzTW9kZSA9IEZYX1dTVFJDKEwidytiIik7CisgIH0gZWxzZSB7CisgICAgd3NNb2RlID0gRlhfV1NUUkMoTCJhK2IiKTsKKyAgfQogfQotQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpDRlhDUlRfRmlsZUFjY2Vzc19DUlQoKQotICAgIDogbV9oRmlsZShOVUxMKQoteworQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpDRlhDUlRfRmlsZUFjY2Vzc19DUlQoKSA6IG1faEZpbGUoTlVMTCkge30KK0NGWENSVF9GaWxlQWNjZXNzX0NSVDo6fkNGWENSVF9GaWxlQWNjZXNzX0NSVCgpIHsKKyAgQ2xvc2UoKTsKIH0KLUNGWENSVF9GaWxlQWNjZXNzX0NSVDo6fkNGWENSVF9GaWxlQWNjZXNzX0NSVCgpCi17Ci0gICAgQ2xvc2UoKTsKLX0KLUZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpPcGVuKEZYX0JTVFIgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSkKLXsKLSAgICBpZiAobV9oRmlsZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIHN0ck1vZGU7Ci0gICAgRlhDUlRfR2V0RmlsZU1vZGVTdHJpbmcoZHdNb2RlLCBzdHJNb2RlKTsKLSAgICBtX2hGaWxlID0gRlhTWVNfZm9wZW4oZmlsZU5hbWUuR2V0Q1N0cigpLCBzdHJNb2RlLmNfc3RyKCkpOwotICAgIHJldHVybiBtX2hGaWxlICE9IE5VTEw7Ci19Ci1GWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX0NSVDo6T3BlbihGWF9XU1RSIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpCi17Ci0gICAgaWYgKG1faEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDRlhfV2lkZVN0cmluZyBzdHJNb2RlOwotICAgIEZYQ1JUX0dldEZpbGVNb2RlU3RyaW5nKGR3TW9kZSwgc3RyTW9kZSk7Ci0gICAgbV9oRmlsZSA9IEZYU1lTX3dmb3BlbihmaWxlTmFtZS5HZXRQdHIoKSwgc3RyTW9kZS5jX3N0cigpKTsKLSAgICByZXR1cm4gbV9oRmlsZSAhPSBOVUxMOwotfQotdm9pZCBDRlhDUlRfRmlsZUFjY2Vzc19DUlQ6OkNsb3NlKCkKLXsKLSAgICBpZiAoIW1faEZpbGUpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWFNZU19mY2xvc2UobV9oRmlsZSk7Ci0gICAgbV9oRmlsZSA9IE5VTEw7Ci19Ci12b2lkIENGWENSVF9GaWxlQWNjZXNzX0NSVDo6UmVsZWFzZSgpCi17Ci0gICAgZGVsZXRlIHRoaXM7Ci19Ci1GWF9GSUxFU0laRSBDRlhDUlRfRmlsZUFjY2Vzc19DUlQ6OkdldFNpemUoKSBjb25zdAotewotICAgIGlmICghbV9oRmlsZSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgRlhfRklMRVNJWkUgcG9zID0gKEZYX0ZJTEVTSVpFKUZYU1lTX2Z0ZWxsKG1faEZpbGUpOwotICAgIEZYU1lTX2ZzZWVrKG1faEZpbGUsIDAsIEZYU1lTX1NFRUtfRU5EKTsKLSAgICBGWF9GSUxFU0laRSBzaXplID0gKEZYX0ZJTEVTSVpFKUZYU1lTX2Z0ZWxsKG1faEZpbGUpOwotICAgIEZYU1lTX2ZzZWVrKG1faEZpbGUsIHBvcywgRlhTWVNfU0VFS19TRVQpOwotICAgIHJldHVybiBzaXplOwotfQotRlhfRklMRVNJWkUgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpHZXRQb3NpdGlvbigpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX2hGaWxlKSB7Ci0gICAgICAgIHJldHVybiAoRlhfRklMRVNJWkUpIC0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIChGWF9GSUxFU0laRSlGWFNZU19mdGVsbChtX2hGaWxlKTsKLX0KLUZYX0ZJTEVTSVpFIENGWENSVF9GaWxlQWNjZXNzX0NSVDo6U2V0UG9zaXRpb24oRlhfRklMRVNJWkUgcG9zKQotewotICAgIGlmICghbV9oRmlsZSkgewotICAgICAgICByZXR1cm4gKEZYX0ZJTEVTSVpFKSAtIDE7Ci0gICAgfQotICAgIEZYU1lTX2ZzZWVrKG1faEZpbGUsIHBvcywgRlhTWVNfU0VFS19TRVQpOwotICAgIHJldHVybiAoRlhfRklMRVNJWkUpRlhTWVNfZnRlbGwobV9oRmlsZSk7Ci19Ci1zaXplX3QgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpSZWFkKHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikKLXsKLSAgICBpZiAoIW1faEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBGWFNZU19mcmVhZChwQnVmZmVyLCAxLCBzekJ1ZmZlciwgbV9oRmlsZSk7Ci19Ci1zaXplX3QgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpXcml0ZShjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpCi17Ci0gICAgaWYgKCFtX2hGaWxlKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gRlhTWVNfZndyaXRlKHBCdWZmZXIsIDEsIHN6QnVmZmVyLCBtX2hGaWxlKTsKLX0KLXNpemVfdCBDRlhDUlRfRmlsZUFjY2Vzc19DUlQ6OlJlYWRQb3Modm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpCi17Ci0gICAgaWYgKCFtX2hGaWxlKSB7Ci0gICAgICAgIHJldHVybiAoRlhfRklMRVNJWkUpIC0gMTsKLSAgICB9Ci0gICAgRlhTWVNfZnNlZWsobV9oRmlsZSwgcG9zLCBGWFNZU19TRUVLX1NFVCk7Ci0gICAgcmV0dXJuIEZYU1lTX2ZyZWFkKHBCdWZmZXIsIDEsIHN6QnVmZmVyLCBtX2hGaWxlKTsKLX0KLXNpemVfdCBDRlhDUlRfRmlsZUFjY2Vzc19DUlQ6OldyaXRlUG9zKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKQotewotICAgIGlmICghbV9oRmlsZSkgewotICAgICAgICByZXR1cm4gKEZYX0ZJTEVTSVpFKSAtIDE7Ci0gICAgfQotICAgIEZYU1lTX2ZzZWVrKG1faEZpbGUsIHBvcywgRlhTWVNfU0VFS19TRVQpOwotICAgIHJldHVybiBGWFNZU19md3JpdGUocEJ1ZmZlciwgMSwgc3pCdWZmZXIsIG1faEZpbGUpOwotfQotRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19DUlQ6OkZsdXNoKCkKLXsKLSAgICBpZiAoIW1faEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gIUZYU1lTX2ZmbHVzaChtX2hGaWxlKTsKLX0KLUZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpCi17CitGWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX0NSVDo6T3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdNb2RlKSB7CisgIGlmIChtX2hGaWxlKSB7CiAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENGWF9CeXRlU3RyaW5nIHN0ck1vZGU7CisgIEZYQ1JUX0dldEZpbGVNb2RlU3RyaW5nKGR3TW9kZSwgc3RyTW9kZSk7CisgIG1faEZpbGUgPSBGWFNZU19mb3BlbihmaWxlTmFtZS5HZXRDU3RyKCksIHN0ck1vZGUuY19zdHIoKSk7CisgIHJldHVybiBtX2hGaWxlICE9IE5VTEw7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfRXhpc3QoRlhfQlNUUiBmaWxlTmFtZSkKLXsKLSAgICByZXR1cm4gYWNjZXNzKGZpbGVOYW1lLkdldENTdHIoKSwgRl9PSykgPiAtMTsKK0ZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpPcGVuKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd01vZGUpIHsKKyAgaWYgKG1faEZpbGUpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0ZYX1dpZGVTdHJpbmcgc3RyTW9kZTsKKyAgRlhDUlRfR2V0RmlsZU1vZGVTdHJpbmcoZHdNb2RlLCBzdHJNb2RlKTsKKyAgbV9oRmlsZSA9IEZYU1lTX3dmb3BlbihmaWxlTmFtZS5HZXRQdHIoKSwgc3RyTW9kZS5jX3N0cigpKTsKKyAgcmV0dXJuIG1faEZpbGUgIT0gTlVMTDsKIH0KLUZYX0JPT0wgRlhfRmlsZV9FeGlzdChGWF9XU1RSIGZpbGVOYW1lKQotewotICAgIHJldHVybiBGWF9GaWxlX0V4aXN0KEZYX1VURjhFbmNvZGUoZmlsZU5hbWUpKTsKK3ZvaWQgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpDbG9zZSgpIHsKKyAgaWYgKCFtX2hGaWxlKSB7CisgICAgcmV0dXJuOworICB9CisgIEZYU1lTX2ZjbG9zZShtX2hGaWxlKTsKKyAgbV9oRmlsZSA9IE5VTEw7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfRGVsZXRlKEZYX0JTVFIgZmlsZU5hbWUpCi17Ci0gICAgcmV0dXJuIHJlbW92ZShmaWxlTmFtZS5HZXRDU3RyKCkpID4gLTE7Cit2b2lkIENGWENSVF9GaWxlQWNjZXNzX0NSVDo6UmVsZWFzZSgpIHsKKyAgZGVsZXRlIHRoaXM7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfRGVsZXRlKEZYX1dTVFIgZmlsZU5hbWUpCi17Ci0gICAgcmV0dXJuIEZYX0ZpbGVfRGVsZXRlKEZYX1VURjhFbmNvZGUoZmlsZU5hbWUpKTsKK0ZYX0ZJTEVTSVpFIENGWENSVF9GaWxlQWNjZXNzX0NSVDo6R2V0U2l6ZSgpIGNvbnN0IHsKKyAgaWYgKCFtX2hGaWxlKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgRlhfRklMRVNJWkUgcG9zID0gKEZYX0ZJTEVTSVpFKUZYU1lTX2Z0ZWxsKG1faEZpbGUpOworICBGWFNZU19mc2VlayhtX2hGaWxlLCAwLCBGWFNZU19TRUVLX0VORCk7CisgIEZYX0ZJTEVTSVpFIHNpemUgPSAoRlhfRklMRVNJWkUpRlhTWVNfZnRlbGwobV9oRmlsZSk7CisgIEZYU1lTX2ZzZWVrKG1faEZpbGUsIHBvcywgRlhTWVNfU0VFS19TRVQpOworICByZXR1cm4gc2l6ZTsKIH0KLUZYX0JPT0wgRlhfRmlsZV9Db3B5KEZYX0JTVFIgZmlsZU5hbWVTcmMsIEZYX0JTVFIgZmlsZU5hbWVEc3QpCi17Ci0gICAgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUIHNyYywgZHN0OwotICAgIGlmICghc3JjLk9wZW4oZmlsZU5hbWVTcmMsIEZYX0ZJTEVNT0RFX1JlYWRPbmx5KSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX0ZJTEVTSVpFIHNpemUgPSBzcmMuR2V0U2l6ZSgpOwotICAgIGlmICghc2l6ZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmICghZHN0Lk9wZW4oZmlsZU5hbWVEc3QsIEZYX0ZJTEVNT0RFX1RydW5jYXRlKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX0ZJTEVTSVpFIG51bSA9IDA7Ci0gICAgRlhfTFBCWVRFIHBCdWZmZXIgPSBGWF9BbGxvYyhGWF9CWVRFLCAzMjc2OCk7Ci0gICAgd2hpbGUgKG51bSA9IHNyYy5SZWFkKHBCdWZmZXIsIDMyNzY4KSkgewotICAgICAgICBpZiAoZHN0LldyaXRlKHBCdWZmZXIsIG51bSkgIT0gbnVtKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBGWF9GcmVlKHBCdWZmZXIpOwotICAgIHJldHVybiBUUlVFOworRlhfRklMRVNJWkUgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpHZXRQb3NpdGlvbigpIGNvbnN0IHsKKyAgaWYgKCFtX2hGaWxlKSB7CisgICAgcmV0dXJuIChGWF9GSUxFU0laRSktMTsKKyAgfQorICByZXR1cm4gKEZYX0ZJTEVTSVpFKUZYU1lTX2Z0ZWxsKG1faEZpbGUpOwogfQotRlhfQk9PTCBGWF9GaWxlX0NvcHkoRlhfV1NUUiBmaWxlTmFtZVNyYywgRlhfV1NUUiBmaWxlTmFtZURzdCkKLXsKLSAgICByZXR1cm4gRlhfRmlsZV9Db3B5KEZYX1VURjhFbmNvZGUoZmlsZU5hbWVTcmMpLCBGWF9VVEY4RW5jb2RlKGZpbGVOYW1lRHN0KSk7CitGWF9GSUxFU0laRSBDRlhDUlRfRmlsZUFjY2Vzc19DUlQ6OlNldFBvc2l0aW9uKEZYX0ZJTEVTSVpFIHBvcykgeworICBpZiAoIW1faEZpbGUpIHsKKyAgICByZXR1cm4gKEZYX0ZJTEVTSVpFKS0xOworICB9CisgIEZYU1lTX2ZzZWVrKG1faEZpbGUsIHBvcywgRlhTWVNfU0VFS19TRVQpOworICByZXR1cm4gKEZYX0ZJTEVTSVpFKUZYU1lTX2Z0ZWxsKG1faEZpbGUpOwogfQotRlhfQk9PTCBGWF9GaWxlX01vdmUoRlhfQlNUUiBmaWxlTmFtZVNyYywgRlhfQlNUUiBmaWxlTmFtZURzdCkKLXsKLSAgICByZXR1cm4gcmVuYW1lKGZpbGVOYW1lU3JjLkdldENTdHIoKSwgZmlsZU5hbWVEc3QuR2V0Q1N0cigpKTsKK3NpemVfdCBDRlhDUlRfRmlsZUFjY2Vzc19DUlQ6OlJlYWQodm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKSB7CisgIGlmICghbV9oRmlsZSkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBGWFNZU19mcmVhZChwQnVmZmVyLCAxLCBzekJ1ZmZlciwgbV9oRmlsZSk7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfTW92ZShGWF9XU1RSIGZpbGVOYW1lU3JjLCBGWF9XU1RSIGZpbGVOYW1lRHN0KQotewotICAgIHJldHVybiBGWF9GaWxlX01vdmUoRlhfVVRGOEVuY29kZShmaWxlTmFtZVNyYyksIEZYX1VURjhFbmNvZGUoZmlsZU5hbWVEc3QpKTsKK3NpemVfdCBDRlhDUlRfRmlsZUFjY2Vzc19DUlQ6OldyaXRlKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikgeworICBpZiAoIW1faEZpbGUpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gRlhTWVNfZndyaXRlKHBCdWZmZXIsIDEsIHN6QnVmZmVyLCBtX2hGaWxlKTsKK30KK3NpemVfdCBDRlhDUlRfRmlsZUFjY2Vzc19DUlQ6OlJlYWRQb3Modm9pZCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHN6QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBwb3MpIHsKKyAgaWYgKCFtX2hGaWxlKSB7CisgICAgcmV0dXJuIChGWF9GSUxFU0laRSktMTsKKyAgfQorICBGWFNZU19mc2VlayhtX2hGaWxlLCBwb3MsIEZYU1lTX1NFRUtfU0VUKTsKKyAgcmV0dXJuIEZYU1lTX2ZyZWFkKHBCdWZmZXIsIDEsIHN6QnVmZmVyLCBtX2hGaWxlKTsKK30KK3NpemVfdCBDRlhDUlRfRmlsZUFjY2Vzc19DUlQ6OldyaXRlUG9zKGNvbnN0IHZvaWQqIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3pCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBwb3MpIHsKKyAgaWYgKCFtX2hGaWxlKSB7CisgICAgcmV0dXJuIChGWF9GSUxFU0laRSktMTsKKyAgfQorICBGWFNZU19mc2VlayhtX2hGaWxlLCBwb3MsIEZYU1lTX1NFRUtfU0VUKTsKKyAgcmV0dXJuIEZYU1lTX2Z3cml0ZShwQnVmZmVyLCAxLCBzekJ1ZmZlciwgbV9oRmlsZSk7Cit9CitGWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX0NSVDo6Rmx1c2goKSB7CisgIGlmICghbV9oRmlsZSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gIUZYU1lTX2ZmbHVzaChtX2hGaWxlKTsKK30KK0ZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUOjpUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpIHsKKyAgcmV0dXJuIEZBTFNFOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meGNydF9wbGF0Zm9ybXMuaCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3BsYXRmb3Jtcy5oCmluZGV4IGJlNTE3MjQuLjM5M2RmNjkgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3BsYXRmb3Jtcy5oCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3BsYXRmb3Jtcy5oCkBAIC0xLDcgKzEsNyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIENPUkVfU1JDX0ZYQ1JUX0ZYQ1JUX1BMQVRGT1JNU19IXwpAQCAtMTAsMjggKzEwLDMyIEBACiAjaW5jbHVkZSAiZXh0ZW5zaW9uLmgiCiAKICNpZiBfRlhfT1NfID09IF9GWF9BTkRST0lEXwotdm9pZAlGWENSVF9HZXRGaWxlTW9kZVN0cmluZyhGWF9EV09SRCBkd01vZGVzLCBDRlhfQnl0ZVN0cmluZyAmYnNNb2RlKTsKLXZvaWQJRlhDUlRfR2V0RmlsZU1vZGVTdHJpbmcoRlhfRFdPUkQgZHdNb2RlcywgQ0ZYX1dpZGVTdHJpbmcgJndzTW9kZSk7Ci1jbGFzcyBDRlhDUlRfRmlsZUFjY2Vzc19DUlQgOiBwdWJsaWMgSUZYQ1JUX0ZpbGVBY2Nlc3MKLXsKLXB1YmxpYzoKLSAgICBDRlhDUlRfRmlsZUFjY2Vzc19DUlQoKTsKLSAgICB2aXJ0dWFsIH5DRlhDUlRfRmlsZUFjY2Vzc19DUlQoKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9wZW4oRlhfQlNUUiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCU9wZW4oRlhfV1NUUiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKTsKLSAgICB2aXJ0dWFsIHZvaWQJCUNsb3NlKCk7Ci0gICAgdmlydHVhbCB2b2lkCQlSZWxlYXNlKCk7Ci0gICAgdmlydHVhbCBGWF9GSUxFU0laRQlHZXRTaXplKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBGWF9GSUxFU0laRQlHZXRQb3NpdGlvbigpIGNvbnN0OwotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJU2V0UG9zaXRpb24oRlhfRklMRVNJWkUgcG9zKTsKLSAgICB2aXJ0dWFsIHNpemVfdAkJUmVhZCh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpOwotICAgIHZpcnR1YWwgc2l6ZV90CQlXcml0ZShjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpOwotICAgIHZpcnR1YWwgc2l6ZV90CQlSZWFkUG9zKHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKTsKLSAgICB2aXJ0dWFsIHNpemVfdAkJV3JpdGVQb3MoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJRmx1c2goKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSk7Ci1wcm90ZWN0ZWQ6Ci0gICAgRlhTWVNfRklMRSoJbV9oRmlsZTsKK3ZvaWQgRlhDUlRfR2V0RmlsZU1vZGVTdHJpbmcoRlhfRFdPUkQgZHdNb2RlcywgQ0ZYX0J5dGVTdHJpbmcmIGJzTW9kZSk7Cit2b2lkIEZYQ1JUX0dldEZpbGVNb2RlU3RyaW5nKEZYX0RXT1JEIGR3TW9kZXMsIENGWF9XaWRlU3RyaW5nJiB3c01vZGUpOworY2xhc3MgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUIDogcHVibGljIElGWENSVF9GaWxlQWNjZXNzIHsKKyBwdWJsaWM6CisgIENGWENSVF9GaWxlQWNjZXNzX0NSVCgpOworICB+Q0ZYQ1JUX0ZpbGVBY2Nlc3NfQ1JUKCkgb3ZlcnJpZGU7CisKKyAgLy8gSUZYQ1JUX0ZpbGVBY2Nlc3MKKyAgRlhfQk9PTCBPcGVuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgT3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpIG92ZXJyaWRlOworICB2b2lkIENsb3NlKCkgb3ZlcnJpZGU7CisgIHZvaWQgUmVsZWFzZSgpIG92ZXJyaWRlOworICBGWF9GSUxFU0laRSBHZXRTaXplKCkgY29uc3Qgb3ZlcnJpZGU7CisgIEZYX0ZJTEVTSVpFIEdldFBvc2l0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisgIEZYX0ZJTEVTSVpFIFNldFBvc2l0aW9uKEZYX0ZJTEVTSVpFIHBvcykgb3ZlcnJpZGU7CisgIHNpemVfdCBSZWFkKHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikgb3ZlcnJpZGU7CisgIHNpemVfdCBXcml0ZShjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpIG92ZXJyaWRlOworICBzaXplX3QgUmVhZFBvcyh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIsIEZYX0ZJTEVTSVpFIHBvcykgb3ZlcnJpZGU7CisgIHNpemVfdCBXcml0ZVBvcyhjb25zdCB2b2lkKiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgc2l6ZV90IHN6QnVmZmVyLAorICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgcG9zKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBGbHVzaCgpIG92ZXJyaWRlOworICBGWF9CT09MIFRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSkgb3ZlcnJpZGU7CisKKyBwcm90ZWN0ZWQ6CisgIEZYU1lTX0ZJTEUqIG1faEZpbGU7CiB9OwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3Bvc2l4LmNwcCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3Bvc2l4LmNwcAppbmRleCAwNmQ5MmM1Li5mNjcxMGViIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meGNydF9wb3NpeC5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhjcnRfcG9zaXguY3BwCkBAIC0xLDE5MCArMSwxMzAgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfZXh0LmgiCiAjaW5jbHVkZSAiZnhjcnRfcG9zaXguaCIKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0xJTlVYXyB8fCBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXyB8fCBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FORFJPSURfCi1JRlhDUlRfRmlsZUFjY2VzcyogRlhDUlRfRmlsZUFjY2Vzc19DcmVhdGUoKQotewotICAgIHJldHVybiBuZXcgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg7CisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKKworI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fTElOVVhfIHx8IFwKKyAgICBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXyB8fCBcCisgICAgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BTkRST0lEXworSUZYQ1JUX0ZpbGVBY2Nlc3MqIEZYQ1JUX0ZpbGVBY2Nlc3NfQ3JlYXRlKCkgeworICByZXR1cm4gbmV3IENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OwogfQotdm9pZCBGWENSVF9Qb3NpeF9HZXRGaWxlTW9kZShGWF9EV09SRCBkd01vZGVzLCBGWF9JTlQzMiAmbkZsYWdzLCBGWF9JTlQzMiAmbk1hc2tzKQotewotICAgIG5GbGFncyA9IE9fQklOQVJZIHwgT19MQVJHRUZJTEU7Ci0gICAgaWYgKGR3TW9kZXMgJiBGWF9GSUxFTU9ERV9SZWFkT25seSkgewotICAgICAgICBuRmxhZ3MgfD0gT19SRE9OTFk7Ci0gICAgICAgIG5NYXNrcyA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbkZsYWdzIHw9IE9fUkRXUiB8IE9fQ1JFQVQ7Ci0gICAgICAgIGlmIChkd01vZGVzICYgRlhfRklMRU1PREVfVHJ1bmNhdGUpIHsKLSAgICAgICAgICAgIG5GbGFncyB8PSBPX1RSVU5DOwotICAgICAgICB9Ci0gICAgICAgIG5NYXNrcyA9IFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVJPVEg7Cit2b2lkIEZYQ1JUX1Bvc2l4X0dldEZpbGVNb2RlKEZYX0RXT1JEIGR3TW9kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbk1hc2tzKSB7CisgIG5GbGFncyA9IE9fQklOQVJZIHwgT19MQVJHRUZJTEU7CisgIGlmIChkd01vZGVzICYgRlhfRklMRU1PREVfUmVhZE9ubHkpIHsKKyAgICBuRmxhZ3MgfD0gT19SRE9OTFk7CisgICAgbk1hc2tzID0gMDsKKyAgfSBlbHNlIHsKKyAgICBuRmxhZ3MgfD0gT19SRFdSIHwgT19DUkVBVDsKKyAgICBpZiAoZHdNb2RlcyAmIEZYX0ZJTEVNT0RFX1RydW5jYXRlKSB7CisgICAgICBuRmxhZ3MgfD0gT19UUlVOQzsKICAgICB9CisgICAgbk1hc2tzID0gU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USDsKKyAgfQogfQotQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6OkNGWENSVF9GaWxlQWNjZXNzX1Bvc2l4KCkKLSAgICA6IG1fbkZEKC0xKQoteworQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6OkNGWENSVF9GaWxlQWNjZXNzX1Bvc2l4KCkgOiBtX25GRCgtMSkge30KK0NGWENSVF9GaWxlQWNjZXNzX1Bvc2l4Ojp+Q0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXgoKSB7CisgIENsb3NlKCk7CiB9Ci1DRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6fkNGWENSVF9GaWxlQWNjZXNzX1Bvc2l4KCkKLXsKLSAgICBDbG9zZSgpOworRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6T3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd01vZGUpIHsKKyAgaWYgKG1fbkZEID4gLTEpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW50MzJfdCBuRmxhZ3MsIG5NYXNrczsKKyAgRlhDUlRfUG9zaXhfR2V0RmlsZU1vZGUoZHdNb2RlLCBuRmxhZ3MsIG5NYXNrcyk7CisgIG1fbkZEID0gb3BlbihmaWxlTmFtZS5HZXRDU3RyKCksIG5GbGFncywgbk1hc2tzKTsKKyAgcmV0dXJuIG1fbkZEID4gLTE7CiB9Ci1GWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpPcGVuKEZYX0JTVFIgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSkKLXsKLSAgICBpZiAobV9uRkQgPiAtMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX0lOVDMyIG5GbGFncywgbk1hc2tzOwotICAgIEZYQ1JUX1Bvc2l4X0dldEZpbGVNb2RlKGR3TW9kZSwgbkZsYWdzLCBuTWFza3MpOwotICAgIG1fbkZEID0gb3BlbihmaWxlTmFtZS5HZXRDU3RyKCksIG5GbGFncywgbk1hc2tzKTsKLSAgICByZXR1cm4gbV9uRkQgPiAtMTsKK0ZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6Ok9wZW4oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdNb2RlKSB7CisgIHJldHVybiBPcGVuKEZYX1VURjhFbmNvZGUoZmlsZU5hbWUpLCBkd01vZGUpOwogfQotRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6T3BlbihGWF9XU1RSIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpCi17Ci0gICAgcmV0dXJuIE9wZW4oRlhfVVRGOEVuY29kZShmaWxlTmFtZSksIGR3TW9kZSk7Cit2b2lkIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpDbG9zZSgpIHsKKyAgaWYgKG1fbkZEIDwgMCkgeworICAgIHJldHVybjsKKyAgfQorICBjbG9zZShtX25GRCk7CisgIG1fbkZEID0gLTE7CiB9Ci12b2lkIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpDbG9zZSgpCi17Ci0gICAgaWYgKG1fbkZEIDwgMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNsb3NlKG1fbkZEKTsKLSAgICBtX25GRCA9IC0xOwordm9pZCBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6UmVsZWFzZSgpIHsKKyAgZGVsZXRlIHRoaXM7CiB9Ci12b2lkIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpSZWxlYXNlKCkKLXsKLSAgICBkZWxldGUgdGhpczsKK0ZYX0ZJTEVTSVpFIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpHZXRTaXplKCkgY29uc3QgeworICBpZiAobV9uRkQgPCAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgc3RydWN0IHN0YXQgczsKKyAgRlhTWVNfbWVtc2V0KCZzLCAwLCBzaXplb2YocykpOworICBmc3RhdChtX25GRCwgJnMpOworICByZXR1cm4gcy5zdF9zaXplOwogfQotRlhfRklMRVNJWkUgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6OkdldFNpemUoKSBjb25zdAotewotICAgIGlmIChtX25GRCA8IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHN0cnVjdCBzdGF0IHM7Ci0gICAgRlhTWVNfbWVtc2V0MzIoJnMsIDAsIHNpemVvZihzKSk7Ci0gICAgZnN0YXQobV9uRkQsICZzKTsKLSAgICByZXR1cm4gcy5zdF9zaXplOworRlhfRklMRVNJWkUgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6OkdldFBvc2l0aW9uKCkgY29uc3QgeworICBpZiAobV9uRkQgPCAwKSB7CisgICAgcmV0dXJuIChGWF9GSUxFU0laRSktMTsKKyAgfQorICByZXR1cm4gbHNlZWsobV9uRkQsIDAsIFNFRUtfQ1VSKTsKIH0KLUZYX0ZJTEVTSVpFIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpHZXRQb3NpdGlvbigpIGNvbnN0Ci17Ci0gICAgaWYgKG1fbkZEIDwgMCkgewotICAgICAgICByZXR1cm4gKEZYX0ZJTEVTSVpFKSAtIDE7Ci0gICAgfQotICAgIHJldHVybiBsc2VlayhtX25GRCwgMCwgU0VFS19DVVIpOworRlhfRklMRVNJWkUgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6OlNldFBvc2l0aW9uKEZYX0ZJTEVTSVpFIHBvcykgeworICBpZiAobV9uRkQgPCAwKSB7CisgICAgcmV0dXJuIChGWF9GSUxFU0laRSktMTsKKyAgfQorICByZXR1cm4gbHNlZWsobV9uRkQsIHBvcywgU0VFS19TRVQpOwogfQotRlhfRklMRVNJWkUgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6OlNldFBvc2l0aW9uKEZYX0ZJTEVTSVpFIHBvcykKLXsKLSAgICBpZiAobV9uRkQgPCAwKSB7Ci0gICAgICAgIHJldHVybiAoRlhfRklMRVNJWkUpIC0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIGxzZWVrKG1fbkZELCBwb3MsIFNFRUtfU0VUKTsKK3NpemVfdCBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6UmVhZCh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpIHsKKyAgaWYgKG1fbkZEIDwgMCkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiByZWFkKG1fbkZELCBwQnVmZmVyLCBzekJ1ZmZlcik7CiB9Ci1zaXplX3QgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6OlJlYWQodm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKQotewotICAgIGlmIChtX25GRCA8IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiByZWFkKG1fbkZELCBwQnVmZmVyLCBzekJ1ZmZlcik7CitzaXplX3QgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6OldyaXRlKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikgeworICBpZiAobV9uRkQgPCAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIHdyaXRlKG1fbkZELCBwQnVmZmVyLCBzekJ1ZmZlcik7CiB9Ci1zaXplX3QgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6OldyaXRlKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikKLXsKLSAgICBpZiAobV9uRkQgPCAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gd3JpdGUobV9uRkQsIHBCdWZmZXIsIHN6QnVmZmVyKTsKK3NpemVfdCBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6UmVhZFBvcyh2b2lkKiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzekJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBwb3MpIHsKKyAgaWYgKG1fbkZEIDwgMCkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChwb3MgPj0gR2V0U2l6ZSgpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKFNldFBvc2l0aW9uKHBvcykgPT0gKEZYX0ZJTEVTSVpFKS0xKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIFJlYWQocEJ1ZmZlciwgc3pCdWZmZXIpOwogfQotc2l6ZV90IENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpSZWFkUG9zKHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKQotewotICAgIGlmIChtX25GRCA8IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChwb3MgPj0gR2V0U2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoU2V0UG9zaXRpb24ocG9zKSA9PSAoRlhfRklMRVNJWkUpIC0gMSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIFJlYWQocEJ1ZmZlciwgc3pCdWZmZXIpOworc2l6ZV90IENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpXcml0ZVBvcyhjb25zdCB2b2lkKiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3pCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIHBvcykgeworICBpZiAobV9uRkQgPCAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKFNldFBvc2l0aW9uKHBvcykgPT0gKEZYX0ZJTEVTSVpFKS0xKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIFdyaXRlKHBCdWZmZXIsIHN6QnVmZmVyKTsKIH0KLXNpemVfdCBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6V3JpdGVQb3MoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpCi17Ci0gICAgaWYgKG1fbkZEIDwgMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKFNldFBvc2l0aW9uKHBvcykgPT0gKEZYX0ZJTEVTSVpFKSAtIDEpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBXcml0ZShwQnVmZmVyLCBzekJ1ZmZlcik7CitGWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpGbHVzaCgpIHsKKyAgaWYgKG1fbkZEIDwgMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gZnN5bmMobV9uRkQpID4gLTE7CiB9Ci1GWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpGbHVzaCgpCi17Ci0gICAgaWYgKG1fbkZEIDwgMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBmc3luYyhtX25GRCkgPiAtMTsKLX0KLUZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6OlRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSkKLXsKLSAgICBpZiAobV9uRkQgPCAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuICFmdHJ1bmNhdGUobV9uRkQsIHN6RmlsZSk7Ci19Ci1GWF9CT09MIEZYX0ZpbGVfRXhpc3QoRlhfQlNUUiBmaWxlTmFtZSkKLXsKLSAgICByZXR1cm4gYWNjZXNzKGZpbGVOYW1lLkdldENTdHIoKSwgRl9PSykgPiAtMTsKLX0KLUZYX0JPT0wgRlhfRmlsZV9FeGlzdChGWF9XU1RSIGZpbGVOYW1lKQotewotICAgIHJldHVybiBGWF9GaWxlX0V4aXN0KEZYX1VURjhFbmNvZGUoZmlsZU5hbWUpKTsKLX0KLUZYX0JPT0wgRlhfRmlsZV9EZWxldGUoRlhfQlNUUiBmaWxlTmFtZSkKLXsKLSAgICByZXR1cm4gcmVtb3ZlKGZpbGVOYW1lLkdldENTdHIoKSkgPiAtMTsKLX0KLUZYX0JPT0wgRlhfRmlsZV9EZWxldGUoRlhfV1NUUiBmaWxlTmFtZSkKLXsKLSAgICByZXR1cm4gRlhfRmlsZV9EZWxldGUoRlhfVVRGOEVuY29kZShmaWxlTmFtZSkpOwotfQotRlhfQk9PTCBGWF9GaWxlX0NvcHkoRlhfQlNUUiBmaWxlTmFtZVNyYywgRlhfQlNUUiBmaWxlTmFtZURzdCkKLXsKLSAgICBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeCBzcmMsIGRzdDsKLSAgICBpZiAoIXNyYy5PcGVuKGZpbGVOYW1lU3JjLCBGWF9GSUxFTU9ERV9SZWFkT25seSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9GSUxFU0laRSBzaXplID0gc3JjLkdldFNpemUoKTsKLSAgICBpZiAoIXNpemUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoIWRzdC5PcGVuKGZpbGVOYW1lRHN0LCBGWF9GSUxFTU9ERV9UcnVuY2F0ZSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBzaXplX3QgbnVtID0gMDsKLSAgICBGWF9MUEJZVEUgcEJ1ZmZlciA9IEZYX0FsbG9jKEZYX0JZVEUsIDMyNzY4KTsKLSAgICBudW0gPSBzcmMuUmVhZChwQnVmZmVyLCAzMjc2OCk7Ci0gICAgd2hpbGUgKG51bSkgewotICAgICAgICBpZiAoZHN0LldyaXRlKHBCdWZmZXIsIG51bSkgIT0gbnVtKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBudW0gPSBzcmMuUmVhZChwQnVmZmVyLCAzMjc2OCk7Ci0gICAgfQotICAgIEZYX0ZyZWUocEJ1ZmZlcik7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIEZYX0ZpbGVfQ29weShGWF9XU1RSIGZpbGVOYW1lU3JjLCBGWF9XU1RSIGZpbGVOYW1lRHN0KQotewotICAgIHJldHVybiBGWF9GaWxlX0NvcHkoRlhfVVRGOEVuY29kZShmaWxlTmFtZVNyYyksIEZYX1VURjhFbmNvZGUoZmlsZU5hbWVEc3QpKTsKLX0KLUZYX0JPT0wgRlhfRmlsZV9Nb3ZlKEZYX0JTVFIgZmlsZU5hbWVTcmMsIEZYX0JTVFIgZmlsZU5hbWVEc3QpCi17Ci0gICAgcmV0dXJuIHJlbmFtZShmaWxlTmFtZVNyYy5HZXRDU3RyKCksIGZpbGVOYW1lRHN0LkdldENTdHIoKSk7Ci19Ci1GWF9CT09MIEZYX0ZpbGVfTW92ZShGWF9XU1RSIGZpbGVOYW1lU3JjLCBGWF9XU1RSIGZpbGVOYW1lRHN0KQotewotICAgIHJldHVybiBGWF9GaWxlX01vdmUoRlhfVVRGOEVuY29kZShmaWxlTmFtZVNyYyksIEZYX1VURjhFbmNvZGUoZmlsZU5hbWVEc3QpKTsKK0ZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6OlRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSkgeworICBpZiAobV9uRkQgPCAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiAhZnRydW5jYXRlKG1fbkZELCBzekZpbGUpOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9meGNydF9wb3NpeC5oIGIvY29yZS9zcmMvZnhjcnQvZnhjcnRfcG9zaXguaAppbmRleCA4YzcxNmNkLi5iMjQ3MjFkIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meGNydF9wb3NpeC5oCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3Bvc2l4LmgKQEAgLTEsNyArMSw3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgQ09SRV9TUkNfRlhDUlRfRlhDUlRfUE9TSVhfSF8KQEAgLTksMjcgKzksMzMgQEAKIAogI2luY2x1ZGUgImV4dGVuc2lvbi5oIgogCi0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9MSU5VWF8gfHwgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8gfHwgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BTkRST0lEXwotY2xhc3MgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXggOiBwdWJsaWMgSUZYQ1JUX0ZpbGVBY2Nlc3MKLXsKLXB1YmxpYzoKLSAgICBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeCgpOwotICAgIHZpcnR1YWwgfkNGWENSVF9GaWxlQWNjZXNzX1Bvc2l4KCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlPcGVuKEZYX0JTVFIgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlPcGVuKEZYX1dTVFIgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSk7Ci0gICAgdmlydHVhbCB2b2lkCQlDbG9zZSgpOwotICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpOwotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJR2V0U2l6ZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJR2V0UG9zaXRpb24oKSBjb25zdDsKLSAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCVNldFBvc2l0aW9uKEZYX0ZJTEVTSVpFIHBvcyk7Ci0gICAgdmlydHVhbCBzaXplX3QJCVJlYWQodm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKTsKLSAgICB2aXJ0dWFsIHNpemVfdAkJV3JpdGUoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKTsKLSAgICB2aXJ0dWFsIHNpemVfdAkJUmVhZFBvcyh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIsIEZYX0ZJTEVTSVpFIHBvcyk7Ci0gICAgdmlydHVhbCBzaXplX3QJCVdyaXRlUG9zKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUZsdXNoKCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpOwotcHJvdGVjdGVkOgotICAgIEZYX0lOVDMyCW1fbkZEOworI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fTElOVVhfIHx8IFwKKyAgICBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXyB8fCBcCisgICAgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BTkRST0lEXworY2xhc3MgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXggOiBwdWJsaWMgSUZYQ1JUX0ZpbGVBY2Nlc3MgeworIHB1YmxpYzoKKyAgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXgoKTsKKyAgfkNGWENSVF9GaWxlQWNjZXNzX1Bvc2l4KCkgb3ZlcnJpZGU7CisKKyAgLy8gSUZYQ1JUX0ZpbGVBY2Nlc3MKKyAgRlhfQk9PTCBPcGVuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUsIEZYX0RXT1JEIGR3TW9kZSkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgT3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpIG92ZXJyaWRlOworICB2b2lkIENsb3NlKCkgb3ZlcnJpZGU7CisgIHZvaWQgUmVsZWFzZSgpIG92ZXJyaWRlOworICBGWF9GSUxFU0laRSBHZXRTaXplKCkgY29uc3Qgb3ZlcnJpZGU7CisgIEZYX0ZJTEVTSVpFIEdldFBvc2l0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisgIEZYX0ZJTEVTSVpFIFNldFBvc2l0aW9uKEZYX0ZJTEVTSVpFIHBvcykgb3ZlcnJpZGU7CisgIHNpemVfdCBSZWFkKHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikgb3ZlcnJpZGU7CisgIHNpemVfdCBXcml0ZShjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpIG92ZXJyaWRlOworICBzaXplX3QgUmVhZFBvcyh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIsIEZYX0ZJTEVTSVpFIHBvcykgb3ZlcnJpZGU7CisgIHNpemVfdCBXcml0ZVBvcyhjb25zdCB2b2lkKiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgc2l6ZV90IHN6QnVmZmVyLAorICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgcG9zKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBGbHVzaCgpIG92ZXJyaWRlOworICBGWF9CT09MIFRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSkgb3ZlcnJpZGU7CisKKyBwcm90ZWN0ZWQ6CisgIGludDMyX3QgbV9uRkQ7CiB9OwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3dpbmRvd3MuY3BwIGIvY29yZS9zcmMvZnhjcnQvZnhjcnRfd2luZG93cy5jcHAKaW5kZXggMDVlZDYxOS4uNmYzNzlhMSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvZnhjcnRfd2luZG93cy5jcHAKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhjcnRfd2luZG93cy5jcHAKQEAgLTQsMjExICs0LDE2OSBAQAogCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGNydC9meF9leHQuaCIKICNpbmNsdWRlICJmeGNydF93aW5kb3dzLmgiCisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyaW5nLmgiCisKICNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi1GWF9CT09MIEZYX0ZpbGVfRXhpc3QoRlhfQlNUUiBmaWxlTmFtZSkKLXsKLSAgICBGWF9EV09SRCBkd0F0dHJpID0gOjpHZXRGaWxlQXR0cmlidXRlc0EoZmlsZU5hbWUuR2V0Q1N0cigpKTsKLSAgICBpZiAoZHdBdHRyaSA9PSAtMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiAoZHdBdHRyaSAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkgPT0gMDsKK0lGWENSVF9GaWxlQWNjZXNzKiBGWENSVF9GaWxlQWNjZXNzX0NyZWF0ZSgpIHsKKyAgcmV0dXJuIG5ldyBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDsKIH0KLUZYX0JPT0wgRlhfRmlsZV9FeGlzdChGWF9XU1RSIGZpbGVOYW1lKQotewotICAgIEZYX0RXT1JEIGR3QXR0cmkgPSA6OkdldEZpbGVBdHRyaWJ1dGVzVygoTFBDV1NUUilmaWxlTmFtZS5HZXRQdHIoKSk7Ci0gICAgaWYgKGR3QXR0cmkgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gKGR3QXR0cmkgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpID09IDA7Ci19Ci1JRlhDUlRfRmlsZUFjY2VzcyogRlhDUlRfRmlsZUFjY2Vzc19DcmVhdGUoKQotewotICAgIHJldHVybiBuZXcgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ7Ci19Ci12b2lkIEZYQ1JUX1dpbmRvd3NfR2V0RmlsZU1vZGUoRlhfRFdPUkQgZHdNb2RlLCBGWF9EV09SRCAmZHdBY2Nlc3MsIEZYX0RXT1JEICZkd1NoYXJlLCBGWF9EV09SRCAmZHdDcmVhdGlvbikKLXsKLSAgICBkd0FjY2VzcyA9IEdFTkVSSUNfUkVBRDsKLSAgICBkd1NoYXJlID0gRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURTsKLSAgICBpZiAoIShkd01vZGUgJiBGWF9GSUxFTU9ERV9SZWFkT25seSkpIHsKLSAgICAgICAgZHdBY2Nlc3MgfD0gR0VORVJJQ19XUklURTsKLSAgICAgICAgZHdDcmVhdGlvbiA9IChkd01vZGUgJiBGWF9GSUxFTU9ERV9UcnVuY2F0ZSkgPyBDUkVBVEVfQUxXQVlTIDogT1BFTl9BTFdBWVM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHdDcmVhdGlvbiA9IE9QRU5fRVhJU1RJTkc7Ci0gICAgfQordm9pZCBGWENSVF9XaW5kb3dzX0dldEZpbGVNb2RlKEZYX0RXT1JEIGR3TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCYgZHdBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGR3U2hhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGR3Q3JlYXRpb24pIHsKKyAgZHdBY2Nlc3MgPSBHRU5FUklDX1JFQUQ7CisgIGR3U2hhcmUgPSBGSUxFX1NIQVJFX1JFQUQgfCBGSUxFX1NIQVJFX1dSSVRFOworICBpZiAoIShkd01vZGUgJiBGWF9GSUxFTU9ERV9SZWFkT25seSkpIHsKKyAgICBkd0FjY2VzcyB8PSBHRU5FUklDX1dSSVRFOworICAgIGR3Q3JlYXRpb24gPSAoZHdNb2RlICYgRlhfRklMRU1PREVfVHJ1bmNhdGUpID8gQ1JFQVRFX0FMV0FZUyA6IE9QRU5fQUxXQVlTOworICB9IGVsc2UgeworICAgIGR3Q3JlYXRpb24gPSBPUEVOX0VYSVNUSU5HOworICB9CiB9CiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCiBXSU5CQVNFQVBJIEJPT0wgV0lOQVBJIEdldEZpbGVTaXplRXgoSEFORExFIGhGaWxlLCBQTEFSR0VfSU5URUdFUiBscEZpbGVTaXplKTsKLVdJTkJBU0VBUEkgQk9PTCBXSU5BUEkgU2V0RmlsZVBvaW50ZXJFeChIQU5ETEUgaEZpbGUsIExBUkdFX0lOVEVHRVIgbGlEaXN0YW5jZVRvTW92ZSwgUExBUkdFX0lOVEVHRVIgbHBOZXdGaWxlUG9pbnRlciwgRFdPUkQgZHdNb3ZlTWV0aG9kKTsKK1dJTkJBU0VBUEkgQk9PTCBXSU5BUEkgU2V0RmlsZVBvaW50ZXJFeChIQU5ETEUgaEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEFSR0VfSU5URUdFUiBsaURpc3RhbmNlVG9Nb3ZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBMQVJHRV9JTlRFR0VSIGxwTmV3RmlsZVBvaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdNb3ZlTWV0aG9kKTsKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmCi1DRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6Q0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQoKQotICAgIDogbV9oRmlsZShOVUxMKQoteworQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OkNGWENSVF9GaWxlQWNjZXNzX1dpbjY0KCkgOiBtX2hGaWxlKE5VTEwpIHt9CitDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6fkNGWENSVF9GaWxlQWNjZXNzX1dpbjY0KCkgeworICBDbG9zZSgpOwogfQotQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6On5DRlhDUlRfRmlsZUFjY2Vzc19XaW42NCgpCi17Ci0gICAgQ2xvc2UoKTsKLX0KLUZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6Ok9wZW4oRlhfQlNUUiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKQotewotICAgIGlmIChtX2hGaWxlKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfRFdPUkQgZHdBY2Nlc3MsIGR3U2hhcmUsIGR3Q3JlYXRpb247Ci0gICAgRlhDUlRfV2luZG93c19HZXRGaWxlTW9kZShkd01vZGUsIGR3QWNjZXNzLCBkd1NoYXJlLCBkd0NyZWF0aW9uKTsKLSAgICBtX2hGaWxlID0gOjpDcmVhdGVGaWxlQShmaWxlTmFtZS5HZXRDU3RyKCksIGR3QWNjZXNzLCBkd1NoYXJlLCBOVUxMLCBkd0NyZWF0aW9uLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIE5VTEwpOwotICAgIGlmIChtX2hGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0gICAgICAgIG1faEZpbGUgPSBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbV9oRmlsZSAhPSBOVUxMOwotfQotRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6T3BlbihGWF9XU1RSIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpCi17Ci0gICAgaWYgKG1faEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9EV09SRCBkd0FjY2VzcywgZHdTaGFyZSwgZHdDcmVhdGlvbjsKLSAgICBGWENSVF9XaW5kb3dzX0dldEZpbGVNb2RlKGR3TW9kZSwgZHdBY2Nlc3MsIGR3U2hhcmUsIGR3Q3JlYXRpb24pOwotICAgIG1faEZpbGUgPSA6OkNyZWF0ZUZpbGVXKChMUENXU1RSKWZpbGVOYW1lLkdldFB0cigpLCBkd0FjY2VzcywgZHdTaGFyZSwgTlVMTCwgZHdDcmVhdGlvbiwgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBOVUxMKTsKLSAgICBpZiAobV9oRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotICAgICAgICBtX2hGaWxlID0gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIG1faEZpbGUgIT0gTlVMTDsKLX0KLXZvaWQgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OkNsb3NlKCkKLXsKLSAgICBpZiAoIW1faEZpbGUpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICA6OkNsb3NlSGFuZGxlKG1faEZpbGUpOworRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6T3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd01vZGUpIHsKKyAgaWYgKG1faEZpbGUpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhfRFdPUkQgZHdBY2Nlc3MsIGR3U2hhcmUsIGR3Q3JlYXRpb247CisgIEZYQ1JUX1dpbmRvd3NfR2V0RmlsZU1vZGUoZHdNb2RlLCBkd0FjY2VzcywgZHdTaGFyZSwgZHdDcmVhdGlvbik7CisgIG1faEZpbGUgPSA6OkNyZWF0ZUZpbGVBKGZpbGVOYW1lLkdldENTdHIoKSwgZHdBY2Nlc3MsIGR3U2hhcmUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGR3Q3JlYXRpb24sIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgTlVMTCk7CisgIGlmIChtX2hGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CiAgICAgbV9oRmlsZSA9IE5VTEw7CisgIH0KKyAgcmV0dXJuIG1faEZpbGUgIT0gTlVMTDsKIH0KLXZvaWQgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OlJlbGVhc2UoKQotewotICAgIGRlbGV0ZSB0aGlzOworRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6T3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd01vZGUpIHsKKyAgaWYgKG1faEZpbGUpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhfRFdPUkQgZHdBY2Nlc3MsIGR3U2hhcmUsIGR3Q3JlYXRpb247CisgIEZYQ1JUX1dpbmRvd3NfR2V0RmlsZU1vZGUoZHdNb2RlLCBkd0FjY2VzcywgZHdTaGFyZSwgZHdDcmVhdGlvbik7CisgIG1faEZpbGUgPSA6OkNyZWF0ZUZpbGVXKChMUENXU1RSKWZpbGVOYW1lLkdldFB0cigpLCBkd0FjY2VzcywgZHdTaGFyZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHdDcmVhdGlvbiwgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBOVUxMKTsKKyAgaWYgKG1faEZpbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICBtX2hGaWxlID0gTlVMTDsKKyAgfQorICByZXR1cm4gbV9oRmlsZSAhPSBOVUxMOwogfQotRlhfRklMRVNJWkUgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OkdldFNpemUoKSBjb25zdAotewotICAgIGlmICghbV9oRmlsZSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgTEFSR0VfSU5URUdFUiBzaXplID0gezAsIDB9OwotICAgIGlmICghOjpHZXRGaWxlU2l6ZUV4KG1faEZpbGUsICZzaXplKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIChGWF9GSUxFU0laRSlzaXplLlF1YWRQYXJ0Owordm9pZCBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6Q2xvc2UoKSB7CisgIGlmICghbV9oRmlsZSkgeworICAgIHJldHVybjsKKyAgfQorICA6OkNsb3NlSGFuZGxlKG1faEZpbGUpOworICBtX2hGaWxlID0gTlVMTDsKIH0KLUZYX0ZJTEVTSVpFIENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpHZXRQb3NpdGlvbigpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX2hGaWxlKSB7Ci0gICAgICAgIHJldHVybiAoRlhfRklMRVNJWkUpIC0gMTsKLSAgICB9Ci0gICAgTEFSR0VfSU5URUdFUiBkaXN0ID0gezAsIDB9OwotICAgIExBUkdFX0lOVEVHRVIgbmV3UG9zID0gezAsIDB9OwotICAgIGlmICghOjpTZXRGaWxlUG9pbnRlckV4KG1faEZpbGUsIGRpc3QsICZuZXdQb3MsIEZJTEVfQ1VSUkVOVCkpIHsKLSAgICAgICAgcmV0dXJuIChGWF9GSUxFU0laRSkgLSAxOwotICAgIH0KLSAgICByZXR1cm4gKEZYX0ZJTEVTSVpFKW5ld1Bvcy5RdWFkUGFydDsKK3ZvaWQgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OlJlbGVhc2UoKSB7CisgIGRlbGV0ZSB0aGlzOwogfQotRlhfRklMRVNJWkUgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OlNldFBvc2l0aW9uKEZYX0ZJTEVTSVpFIHBvcykKLXsKLSAgICBpZiAoIW1faEZpbGUpIHsKLSAgICAgICAgcmV0dXJuIChGWF9GSUxFU0laRSkgLSAxOwotICAgIH0KLSAgICBMQVJHRV9JTlRFR0VSIGRpc3Q7Ci0gICAgZGlzdC5RdWFkUGFydCA9IHBvczsKLSAgICBMQVJHRV9JTlRFR0VSIG5ld1BvcyA9IHswLCAwfTsKLSAgICBpZiAoITo6U2V0RmlsZVBvaW50ZXJFeChtX2hGaWxlLCBkaXN0LCAmbmV3UG9zLCBGSUxFX0JFR0lOKSkgewotICAgICAgICByZXR1cm4gKEZYX0ZJTEVTSVpFKSAtIDE7Ci0gICAgfQotICAgIHJldHVybiAoRlhfRklMRVNJWkUpbmV3UG9zLlF1YWRQYXJ0OworRlhfRklMRVNJWkUgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OkdldFNpemUoKSBjb25zdCB7CisgIGlmICghbV9oRmlsZSkgeworICAgIHJldHVybiAwOworICB9CisgIExBUkdFX0lOVEVHRVIgc2l6ZSA9IHt9OworICBpZiAoITo6R2V0RmlsZVNpemVFeChtX2hGaWxlLCAmc2l6ZSkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gKEZYX0ZJTEVTSVpFKXNpemUuUXVhZFBhcnQ7CiB9Ci1zaXplX3QgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OlJlYWQodm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKQotewotICAgIGlmICghbV9oRmlsZSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgc2l6ZV90IHN6UmVhZCA9IDA7Ci0gICAgaWYgKCE6OlJlYWRGaWxlKG1faEZpbGUsIHBCdWZmZXIsIChEV09SRClzekJ1ZmZlciwgKExQRFdPUkQpJnN6UmVhZCwgTlVMTCkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBzelJlYWQ7CitGWF9GSUxFU0laRSBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6R2V0UG9zaXRpb24oKSBjb25zdCB7CisgIGlmICghbV9oRmlsZSkgeworICAgIHJldHVybiAoRlhfRklMRVNJWkUpLTE7CisgIH0KKyAgTEFSR0VfSU5URUdFUiBkaXN0ID0ge307CisgIExBUkdFX0lOVEVHRVIgbmV3UG9zID0ge307CisgIGlmICghOjpTZXRGaWxlUG9pbnRlckV4KG1faEZpbGUsIGRpc3QsICZuZXdQb3MsIEZJTEVfQ1VSUkVOVCkpIHsKKyAgICByZXR1cm4gKEZYX0ZJTEVTSVpFKS0xOworICB9CisgIHJldHVybiAoRlhfRklMRVNJWkUpbmV3UG9zLlF1YWRQYXJ0OwogfQotc2l6ZV90IENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpXcml0ZShjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpCi17Ci0gICAgaWYgKCFtX2hGaWxlKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBzaXplX3Qgc3pXcml0ZSA9IDA7Ci0gICAgaWYgKCE6OldyaXRlRmlsZShtX2hGaWxlLCBwQnVmZmVyLCAoRFdPUkQpc3pCdWZmZXIsIChMUERXT1JEKSZzeldyaXRlLCBOVUxMKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHN6V3JpdGU7CitGWF9GSUxFU0laRSBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6U2V0UG9zaXRpb24oRlhfRklMRVNJWkUgcG9zKSB7CisgIGlmICghbV9oRmlsZSkgeworICAgIHJldHVybiAoRlhfRklMRVNJWkUpLTE7CisgIH0KKyAgTEFSR0VfSU5URUdFUiBkaXN0OworICBkaXN0LlF1YWRQYXJ0ID0gcG9zOworICBMQVJHRV9JTlRFR0VSIG5ld1BvcyA9IHt9OworICBpZiAoITo6U2V0RmlsZVBvaW50ZXJFeChtX2hGaWxlLCBkaXN0LCAmbmV3UG9zLCBGSUxFX0JFR0lOKSkgeworICAgIHJldHVybiAoRlhfRklMRVNJWkUpLTE7CisgIH0KKyAgcmV0dXJuIChGWF9GSUxFU0laRSluZXdQb3MuUXVhZFBhcnQ7CiB9Ci1zaXplX3QgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OlJlYWRQb3Modm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpCi17Ci0gICAgaWYgKCFtX2hGaWxlKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAocG9zID49IEdldFNpemUoKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKFNldFBvc2l0aW9uKHBvcykgPT0gKEZYX0ZJTEVTSVpFKSAtIDEpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBSZWFkKHBCdWZmZXIsIHN6QnVmZmVyKTsKK3NpemVfdCBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6UmVhZCh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpIHsKKyAgaWYgKCFtX2hGaWxlKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgc2l6ZV90IHN6UmVhZCA9IDA7CisgIGlmICghOjpSZWFkRmlsZShtX2hGaWxlLCBwQnVmZmVyLCAoRFdPUkQpc3pCdWZmZXIsIChMUERXT1JEKSZzelJlYWQsIE5VTEwpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIHN6UmVhZDsKIH0KLXNpemVfdCBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6V3JpdGVQb3MoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpCi17Ci0gICAgaWYgKCFtX2hGaWxlKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoU2V0UG9zaXRpb24ocG9zKSA9PSAoRlhfRklMRVNJWkUpIC0gMSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIFdyaXRlKHBCdWZmZXIsIHN6QnVmZmVyKTsKK3NpemVfdCBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6V3JpdGUoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKSB7CisgIGlmICghbV9oRmlsZSkgeworICAgIHJldHVybiAwOworICB9CisgIHNpemVfdCBzeldyaXRlID0gMDsKKyAgaWYgKCE6OldyaXRlRmlsZShtX2hGaWxlLCBwQnVmZmVyLCAoRFdPUkQpc3pCdWZmZXIsIChMUERXT1JEKSZzeldyaXRlLAorICAgICAgICAgICAgICAgICAgIE5VTEwpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIHN6V3JpdGU7CiB9Ci1GWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpGbHVzaCgpCi17Ci0gICAgaWYgKCFtX2hGaWxlKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIDo6Rmx1c2hGaWxlQnVmZmVycyhtX2hGaWxlKTsKK3NpemVfdCBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6UmVhZFBvcyh2b2lkKiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzekJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBwb3MpIHsKKyAgaWYgKCFtX2hGaWxlKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKHBvcyA+PSBHZXRTaXplKCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoU2V0UG9zaXRpb24ocG9zKSA9PSAoRlhfRklMRVNJWkUpLTEpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gUmVhZChwQnVmZmVyLCBzekJ1ZmZlcik7CiB9Ci1GWF9CT09MIENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpCi17Ci0gICAgaWYgKFNldFBvc2l0aW9uKHN6RmlsZSkgPT0gKEZYX0ZJTEVTSVpFKSAtIDEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gOjpTZXRFbmRPZkZpbGUobV9oRmlsZSk7CitzaXplX3QgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OldyaXRlUG9zKGNvbnN0IHZvaWQqIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzekJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgcG9zKSB7CisgIGlmICghbV9oRmlsZSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChTZXRQb3NpdGlvbihwb3MpID09IChGWF9GSUxFU0laRSktMSkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBXcml0ZShwQnVmZmVyLCBzekJ1ZmZlcik7CiB9Ci1GWF9CT09MIEZYX0ZpbGVfRGVsZXRlKEZYX0JTVFIgZmlsZU5hbWUpCi17Ci0gICAgcmV0dXJuIDo6RGVsZXRlRmlsZUEoZmlsZU5hbWUuR2V0Q1N0cigpKTsKK0ZYX0JPT0wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OkZsdXNoKCkgeworICBpZiAoIW1faEZpbGUpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIDo6Rmx1c2hGaWxlQnVmZmVycyhtX2hGaWxlKTsKIH0KLUZYX0JPT0wgRlhfRmlsZV9EZWxldGUoRlhfV1NUUiBmaWxlTmFtZSkKLXsKLSAgICByZXR1cm4gOjpEZWxldGVGaWxlVygoTFBDV1NUUilmaWxlTmFtZS5HZXRQdHIoKSk7Ci19Ci1GWF9CT09MIEZYX0ZpbGVfQ29weShGWF9CU1RSIGZpbGVOYW1lU3JjLCBGWF9CU1RSIGZpbGVOYW1lRHN0KQotewotICAgIHJldHVybiA6OkNvcHlGaWxlQShmaWxlTmFtZVNyYy5HZXRDU3RyKCksIGZpbGVOYW1lRHN0LkdldENTdHIoKSwgRkFMU0UpOwotfQotRlhfQk9PTCBGWF9GaWxlX0NvcHkoRlhfV1NUUiBmaWxlTmFtZVNyYywgRlhfV1NUUiBmaWxlTmFtZURzdCkKLXsKLSAgICByZXR1cm4gOjpDb3B5RmlsZVcoKExQQ1dTVFIpZmlsZU5hbWVTcmMuR2V0UHRyKCksIChMUENXU1RSKWZpbGVOYW1lRHN0LkdldFB0cigpLCBGQUxTRSk7Ci19Ci1GWF9CT09MIEZYX0ZpbGVfTW92ZShGWF9CU1RSIGZpbGVOYW1lU3JjLCBGWF9CU1RSIGZpbGVOYW1lRHN0KQotewotICAgIHJldHVybiA6Ok1vdmVGaWxlQShmaWxlTmFtZVNyYy5HZXRDU3RyKCksIGZpbGVOYW1lRHN0LkdldENTdHIoKSk7Ci19Ci1GWF9CT09MIEZYX0ZpbGVfTW92ZShGWF9XU1RSIGZpbGVOYW1lU3JjLCBGWF9XU1RSIGZpbGVOYW1lRHN0KQotewotICAgIHJldHVybiA6Ok1vdmVGaWxlVygoTFBDV1NUUilmaWxlTmFtZVNyYy5HZXRQdHIoKSwgKExQQ1dTVFIpZmlsZU5hbWVEc3QuR2V0UHRyKCkpOworRlhfQk9PTCBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6VHJ1bmNhdGUoRlhfRklMRVNJWkUgc3pGaWxlKSB7CisgIGlmIChTZXRQb3NpdGlvbihzekZpbGUpID09IChGWF9GSUxFU0laRSktMSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gOjpTZXRFbmRPZkZpbGUobV9oRmlsZSk7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3dpbmRvd3MuaCBiL2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3dpbmRvd3MuaAppbmRleCAxOTE5ZjNlLi5iM2EyMGE5IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGNydC9meGNydF93aW5kb3dzLmgKKysrIGIvY29yZS9zcmMvZnhjcnQvZnhjcnRfd2luZG93cy5oCkBAIC0xMCwyNiArMTAsMzAgQEAKICNpbmNsdWRlICJleHRlbnNpb24uaCIKIAogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLWNsYXNzIENGWENSVF9GaWxlQWNjZXNzX1dpbjY0IDogcHVibGljIElGWENSVF9GaWxlQWNjZXNzCi17Ci1wdWJsaWM6Ci0gICAgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQoKTsKLSAgICB2aXJ0dWFsIH5DRlhDUlRfRmlsZUFjY2Vzc19XaW42NCgpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJT3BlbihGWF9CU1RSIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJT3BlbihGWF9XU1RSIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpOwotICAgIHZpcnR1YWwgdm9pZAkJQ2xvc2UoKTsKLSAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKTsKLSAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCUdldFNpemUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCUdldFBvc2l0aW9uKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBGWF9GSUxFU0laRQlTZXRQb3NpdGlvbihGWF9GSUxFU0laRSBwb3MpOwotICAgIHZpcnR1YWwgc2l6ZV90CQlSZWFkKHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcik7Ci0gICAgdmlydHVhbCBzaXplX3QJCVdyaXRlKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcik7Ci0gICAgdmlydHVhbCBzaXplX3QJCVJlYWRQb3Modm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpOwotICAgIHZpcnR1YWwgc2l6ZV90CQlXcml0ZVBvcyhjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIsIEZYX0ZJTEVTSVpFIHBvcyk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlGbHVzaCgpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJVHJ1bmNhdGUoRlhfRklMRVNJWkUgc3pGaWxlKTsKLXByb3RlY3RlZDoKLSAgICBGWF9MUFZPSUQJbV9oRmlsZTsKK2NsYXNzIENGWENSVF9GaWxlQWNjZXNzX1dpbjY0IDogcHVibGljIElGWENSVF9GaWxlQWNjZXNzIHsKKyBwdWJsaWM6CisgIENGWENSVF9GaWxlQWNjZXNzX1dpbjY0KCk7CisgIH5DRlhDUlRfRmlsZUFjY2Vzc19XaW42NCgpIG92ZXJyaWRlOworCisgIC8vIElGWENSVF9GaWxlQWNjZXNzCisgIEZYX0JPT0wgT3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLCBGWF9EV09SRCBkd01vZGUpIG92ZXJyaWRlOworICBGWF9CT09MIE9wZW4oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSwgRlhfRFdPUkQgZHdNb2RlKSBvdmVycmlkZTsKKyAgdm9pZCBDbG9zZSgpIG92ZXJyaWRlOworICB2b2lkIFJlbGVhc2UoKSBvdmVycmlkZTsKKyAgRlhfRklMRVNJWkUgR2V0U2l6ZSgpIGNvbnN0IG92ZXJyaWRlOworICBGWF9GSUxFU0laRSBHZXRQb3NpdGlvbigpIGNvbnN0IG92ZXJyaWRlOworICBGWF9GSUxFU0laRSBTZXRQb3NpdGlvbihGWF9GSUxFU0laRSBwb3MpIG92ZXJyaWRlOworICBzaXplX3QgUmVhZCh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpIG92ZXJyaWRlOworICBzaXplX3QgV3JpdGUoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKSBvdmVycmlkZTsKKyAgc2l6ZV90IFJlYWRQb3Modm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpIG92ZXJyaWRlOworICBzaXplX3QgV3JpdGVQb3MoY29uc3Qgdm9pZCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgIHNpemVfdCBzekJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIHBvcykgb3ZlcnJpZGU7CisgIEZYX0JPT0wgRmx1c2goKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpIG92ZXJyaWRlOworCisgcHJvdGVjdGVkOgorICB2b2lkKiBtX2hGaWxlOwogfTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNydC9wbGV4LmggYi9jb3JlL3NyYy9meGNydC9wbGV4LmgKaW5kZXggYTRhYzRmNy4uMTJiN2JkNCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhjcnQvcGxleC5oCisrKyBiL2NvcmUvc3JjL2Z4Y3J0L3BsZXguaApAQCAtMywxNyArMywxNyBAQAogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKwogI2lmbmRlZiBDT1JFX1NSQ19GWENSVF9QTEVYX0hfCiAjZGVmaW5lIENPUkVfU1JDX0ZYQ1JUX1BMRVhfSF8KIAorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaCIKKwogc3RydWN0IENGWF9QbGV4IHsKLSAgICBDRlhfUGxleCogcE5leHQ7Ci0gICAgdm9pZCogZGF0YSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcyArIDE7Ci0gICAgfQotICAgIHN0YXRpYyBDRlhfUGxleCogQ3JlYXRlKENGWF9QbGV4KiYgaGVhZCwgRlhfRFdPUkQgbk1heCwgRlhfRFdPUkQgY2JFbGVtZW50KTsKLSAgICB2b2lkIEZyZWVEYXRhQ2hhaW4oKTsKKyAgQ0ZYX1BsZXgqIHBOZXh0OworICB2b2lkKiBkYXRhKCkgeyByZXR1cm4gdGhpcyArIDE7IH0KKyAgc3RhdGljIENGWF9QbGV4KiBDcmVhdGUoQ0ZYX1BsZXgqJiBoZWFkLCBGWF9EV09SRCBuTWF4LCBGWF9EV09SRCBjYkVsZW1lbnQpOworICB2b2lkIEZyZWVEYXRhQ2hhaW4oKTsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9TUkNfRlhDUlRfUExFWF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjcnQveG1sX2ludC5oIGIvY29yZS9zcmMvZnhjcnQveG1sX2ludC5oCmluZGV4IDdjZmVlYzkuLmE4MzczMjcgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Y3J0L3htbF9pbnQuaAorKysgYi9jb3JlL3NyYy9meGNydC94bWxfaW50LmgKQEAgLTcsMTU3ICs3LDEyNCBAQAogI2lmbmRlZiBDT1JFX1NSQ19GWENSVF9YTUxfSU5UX0hfCiAjZGVmaW5lIENPUkVfU1JDX0ZYQ1JUX1hNTF9JTlRfSF8KIAotY2xhc3MgQ1hNTF9EYXRhQnVmQWNjIDogcHVibGljIElGWF9CdWZmZXJSZWFkCi17Ci1wdWJsaWM6Ci0gICAgQ1hNTF9EYXRhQnVmQWNjKEZYX0xQQ0JZVEUgcEJ1ZmZlciwgc2l6ZV90IHNpemUpCi0gICAgICAgIDogbV9wQnVmZmVyKHBCdWZmZXIpCi0gICAgICAgICwgbV9kd1NpemUoc2l6ZSkKLSAgICAgICAgLCBtX2R3Q3VyUG9zKDApCi0gICAgeworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zdHJlYW0uaCIKKworY2xhc3MgQ0ZYX1VURjhEZWNvZGVyOworY2xhc3MgQ1hNTF9FbGVtZW50OworCitjbGFzcyBDWE1MX0RhdGFCdWZBY2MgOiBwdWJsaWMgSUZYX0J1ZmZlclJlYWQgeworIHB1YmxpYzoKKyAgQ1hNTF9EYXRhQnVmQWNjKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBzaXplKQorICAgICAgOiBtX3BCdWZmZXIocEJ1ZmZlciksIG1fZHdTaXplKHNpemUpLCBtX2R3Q3VyUG9zKDApIHt9CisgIH5DWE1MX0RhdGFCdWZBY2MoKSBvdmVycmlkZSB7fQorCisgIC8vIElGWF9CdWZmZXJSZWFkCisgIHZvaWQgUmVsZWFzZSgpIG92ZXJyaWRlIHsgZGVsZXRlIHRoaXM7IH0KKyAgRlhfQk9PTCBJc0VPRigpIG92ZXJyaWRlIHsgcmV0dXJuIG1fZHdDdXJQb3MgPj0gbV9kd1NpemU7IH0KKyAgRlhfRklMRVNJWkUgR2V0UG9zaXRpb24oKSBvdmVycmlkZSB7IHJldHVybiAoRlhfRklMRVNJWkUpbV9kd0N1clBvczsgfQorICBzaXplX3QgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KKyAgRlhfQk9PTCBSZWFkTmV4dEJsb2NrKEZYX0JPT0wgYlJlc3RhcnQgPSBGQUxTRSkgb3ZlcnJpZGUgeworICAgIGlmIChiUmVzdGFydCkgeworICAgICAgbV9kd0N1clBvcyA9IDA7CiAgICAgfQotICAgIHZpcnR1YWwgfkNYTUxfRGF0YUJ1ZkFjYygpIHt9Ci0gICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpCi0gICAgewotICAgICAgICBkZWxldGUgdGhpczsKKyAgICBpZiAobV9kd0N1clBvcyA8IG1fZHdTaXplKSB7CisgICAgICBtX2R3Q3VyUG9zID0gbV9kd1NpemU7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJSXNFT0YoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fZHdDdXJQb3MgPj0gbV9kd1NpemU7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCUdldFBvc2l0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRlhfRklMRVNJWkUpbV9kd0N1clBvczsKLSAgICB9Ci0gICAgdmlydHVhbCBzaXplX3QJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlSZWFkTmV4dEJsb2NrKEZYX0JPT0wgYlJlc3RhcnQgPSBGQUxTRSkKLSAgICB7Ci0gICAgICAgIGlmIChiUmVzdGFydCkgewotICAgICAgICAgICAgbV9kd0N1clBvcyA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fZHdDdXJQb3MgPCBtX2R3U2l6ZSkgewotICAgICAgICAgICAgbV9kd0N1clBvcyA9IG1fZHdTaXplOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0xQQ0JZVEUJCUdldEJsb2NrQnVmZmVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3BCdWZmZXI7Ci0gICAgfQotICAgIHZpcnR1YWwgc2l6ZV90CQkJR2V0QmxvY2tTaXplKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2R3U2l6ZTsKLSAgICB9Ci0gICAgdmlydHVhbCBGWF9GSUxFU0laRQkJR2V0QmxvY2tPZmZzZXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotcHJvdGVjdGVkOgotICAgIEZYX0xQQ0JZVEUJCW1fcEJ1ZmZlcjsKLSAgICBzaXplX3QJCQltX2R3U2l6ZTsKLSAgICBzaXplX3QJCQltX2R3Q3VyUG9zOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBjb25zdCB1aW50OF90KiBHZXRCbG9ja0J1ZmZlcigpIG92ZXJyaWRlIHsgcmV0dXJuIG1fcEJ1ZmZlcjsgfQorICBzaXplX3QgR2V0QmxvY2tTaXplKCkgb3ZlcnJpZGUgeyByZXR1cm4gbV9kd1NpemU7IH0KKyAgRlhfRklMRVNJWkUgR2V0QmxvY2tPZmZzZXQoKSBvdmVycmlkZSB7IHJldHVybiAwOyB9CisKKyBwcm90ZWN0ZWQ6CisgIGNvbnN0IHVpbnQ4X3QqIG1fcEJ1ZmZlcjsKKyAgc2l6ZV90IG1fZHdTaXplOworICBzaXplX3QgbV9kd0N1clBvczsKIH07Ci0jZGVmaW5lIEZYX1hNTERBVEFTVFJFQU1fQnVmZmVyU2l6ZQkJKDMyICogMTAyNCkKLWNsYXNzIENYTUxfRGF0YVN0bUFjYyA6IHB1YmxpYyBJRlhfQnVmZmVyUmVhZAotewotcHVibGljOgotICAgIENYTUxfRGF0YVN0bUFjYyhJRlhfRmlsZVJlYWQgKnBGaWxlUmVhZCkKLSAgICAgICAgOiBtX3BGaWxlUmVhZChwRmlsZVJlYWQpCi0gICAgICAgICwgbV9wQnVmZmVyKE5VTEwpCi0gICAgICAgICwgbV9uU3RhcnQoMCkKLSAgICAgICAgLCBtX2R3U2l6ZSgwKQotICAgIHsKLSAgICAgICAgRlhTWVNfYXNzZXJ0KG1fcEZpbGVSZWFkICE9IE5VTEwpOworCitjbGFzcyBDWE1MX0RhdGFTdG1BY2MgOiBwdWJsaWMgSUZYX0J1ZmZlclJlYWQgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1hNTF9EYXRhU3RtQWNjKElGWF9GaWxlUmVhZCogcEZpbGVSZWFkKQorICAgICAgOiBtX3BGaWxlUmVhZChwRmlsZVJlYWQpLCBtX3BCdWZmZXIoTlVMTCksIG1fblN0YXJ0KDApLCBtX2R3U2l6ZSgwKSB7CisgICAgRlhTWVNfYXNzZXJ0KG1fcEZpbGVSZWFkKTsKKyAgfQorICB+Q1hNTF9EYXRhU3RtQWNjKCkgb3ZlcnJpZGUgeyBGWF9GcmVlKG1fcEJ1ZmZlcik7IH0KKworICB2b2lkIFJlbGVhc2UoKSBvdmVycmlkZSB7IGRlbGV0ZSB0aGlzOyB9CisgIEZYX0JPT0wgSXNFT0YoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIG1fblN0YXJ0ICsgKEZYX0ZJTEVTSVpFKW1fZHdTaXplID49IG1fcEZpbGVSZWFkLT5HZXRTaXplKCk7CisgIH0KKyAgRlhfRklMRVNJWkUgR2V0UG9zaXRpb24oKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIG1fblN0YXJ0ICsgKEZYX0ZJTEVTSVpFKW1fZHdTaXplOworICB9CisgIHNpemVfdCBSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQorICBGWF9CT09MIFJlYWROZXh0QmxvY2soRlhfQk9PTCBiUmVzdGFydCA9IEZBTFNFKSBvdmVycmlkZSB7CisgICAgaWYgKGJSZXN0YXJ0KSB7CisgICAgICBtX25TdGFydCA9IDA7CiAgICAgfQotICAgIHZpcnR1YWwgfkNYTUxfRGF0YVN0bUFjYygpCi0gICAgewotICAgICAgICBpZiAobV9wQnVmZmVyKSB7Ci0gICAgICAgICAgICBGWF9GcmVlKG1fcEJ1ZmZlcik7Ci0gICAgICAgIH0KKyAgICBGWF9GSUxFU0laRSBuTGVuZ3RoID0gbV9wRmlsZVJlYWQtPkdldFNpemUoKTsKKyAgICBtX25TdGFydCArPSAoRlhfRklMRVNJWkUpbV9kd1NpemU7CisgICAgaWYgKG1fblN0YXJ0ID49IG5MZW5ndGgpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpCi0gICAgewotICAgICAgICBkZWxldGUgdGhpczsKKyAgICBzdGF0aWMgY29uc3QgRlhfRklMRVNJWkUgRlhfWE1MREFUQVNUUkVBTV9CdWZmZXJTaXplID0gMzIgKiAxMDI0OworICAgIG1fZHdTaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PigKKyAgICAgICAgc3RkOjptaW4oRlhfWE1MREFUQVNUUkVBTV9CdWZmZXJTaXplLCBuTGVuZ3RoIC0gbV9uU3RhcnQpKTsKKyAgICBpZiAoIW1fcEJ1ZmZlcikgeworICAgICAgbV9wQnVmZmVyID0gRlhfQWxsb2ModWludDhfdCwgbV9kd1NpemUpOwogICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlJc0VPRigpCi0gICAgewotICAgICAgICByZXR1cm4gbV9uU3RhcnQgKyAoRlhfRklMRVNJWkUpbV9kd1NpemUgPj0gbV9wRmlsZVJlYWQtPkdldFNpemUoKTsKLSAgICB9Ci0gICAgdmlydHVhbCBGWF9GSUxFU0laRQkJR2V0UG9zaXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fblN0YXJ0ICsgKEZYX0ZJTEVTSVpFKW1fZHdTaXplOwotICAgIH0KLSAgICB2aXJ0dWFsIHNpemVfdAkJCVJlYWRCbG9jayh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCVJlYWROZXh0QmxvY2soRlhfQk9PTCBiUmVzdGFydCA9IEZBTFNFKQotICAgIHsKLSAgICAgICAgaWYgKGJSZXN0YXJ0KSB7Ci0gICAgICAgICAgICBtX25TdGFydCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRklMRVNJWkUgbkxlbmd0aCA9IG1fcEZpbGVSZWFkLT5HZXRTaXplKCk7Ci0gICAgICAgIG1fblN0YXJ0ICs9IChGWF9GSUxFU0laRSltX2R3U2l6ZTsKLSAgICAgICAgaWYgKG1fblN0YXJ0ID49IG5MZW5ndGgpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBtX2R3U2l6ZSA9IChzaXplX3QpRlhfTUlOKEZYX1hNTERBVEFTVFJFQU1fQnVmZmVyU2l6ZSwgbkxlbmd0aCAtIG1fblN0YXJ0KTsKLSAgICAgICAgaWYgKCFtX3BCdWZmZXIpIHsKLSAgICAgICAgICAgIG1fcEJ1ZmZlciA9IEZYX0FsbG9jKEZYX0JZVEUsIG1fZHdTaXplKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbV9wRmlsZVJlYWQtPlJlYWRCbG9jayhtX3BCdWZmZXIsIG1fblN0YXJ0LCBtX2R3U2l6ZSk7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfTFBDQllURQkJR2V0QmxvY2tCdWZmZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChGWF9MUENCWVRFKW1fcEJ1ZmZlcjsKLSAgICB9Ci0gICAgdmlydHVhbCBzaXplX3QJCQlHZXRCbG9ja1NpemUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fZHdTaXplOwotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0ZJTEVTSVpFCQlHZXRCbG9ja09mZnNldCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9uU3RhcnQ7Ci0gICAgfQotcHJvdGVjdGVkOgotICAgIElGWF9GaWxlUmVhZAkqbV9wRmlsZVJlYWQ7Ci0gICAgRlhfTFBCWVRFCQltX3BCdWZmZXI7Ci0gICAgRlhfRklMRVNJWkUJCW1fblN0YXJ0OwotICAgIHNpemVfdAkJCW1fZHdTaXplOworICAgIHJldHVybiBtX3BGaWxlUmVhZC0+UmVhZEJsb2NrKG1fcEJ1ZmZlciwgbV9uU3RhcnQsIG1fZHdTaXplKTsKKyAgfQorICBjb25zdCB1aW50OF90KiBHZXRCbG9ja0J1ZmZlcigpIG92ZXJyaWRlIHsgcmV0dXJuIChjb25zdCB1aW50OF90KiltX3BCdWZmZXI7IH0KKyAgc2l6ZV90IEdldEJsb2NrU2l6ZSgpIG92ZXJyaWRlIHsgcmV0dXJuIG1fZHdTaXplOyB9CisgIEZYX0ZJTEVTSVpFIEdldEJsb2NrT2Zmc2V0KCkgb3ZlcnJpZGUgeyByZXR1cm4gbV9uU3RhcnQ7IH0KKworIHByb3RlY3RlZDoKKyAgSUZYX0ZpbGVSZWFkKiBtX3BGaWxlUmVhZDsKKyAgdWludDhfdCogbV9wQnVmZmVyOworICBGWF9GSUxFU0laRSBtX25TdGFydDsKKyAgc2l6ZV90IG1fZHdTaXplOwogfTsKLWNsYXNzIENYTUxfUGFyc2VyCi17Ci1wdWJsaWM6Ci0gICAgfkNYTUxfUGFyc2VyKCk7Ci0gICAgSUZYX0J1ZmZlclJlYWQqCW1fcERhdGFBY2M7Ci0gICAgRlhfQk9PTAkJCW1fYk93bmVkU3RyZWFtOwotICAgIEZYX0ZJTEVTSVpFCQltX25PZmZzZXQ7Ci0gICAgRlhfQk9PTAkJCW1fYlNhdmVTcGFjZUNoYXJzOwotICAgIEZYX0xQQ0JZVEUJCW1fcEJ1ZmZlcjsKLSAgICBzaXplX3QJCQltX2R3QnVmZmVyU2l6ZTsKLSAgICBGWF9GSUxFU0laRQkJbV9uQnVmZmVyT2Zmc2V0OwotICAgIHNpemVfdAkJCW1fZHdJbmRleDsKLSAgICBGWF9CT09MCQkJSW5pdChGWF9MUEJZVEUgcEJ1ZmZlciwgc2l6ZV90IHNpemUpOwotICAgIEZYX0JPT0wJCQlJbml0KElGWF9GaWxlUmVhZCAqcEZpbGVSZWFkKTsKLSAgICBGWF9CT09MCQkJSW5pdChJRlhfQnVmZmVyUmVhZCAqcEJ1ZmZlcik7Ci0gICAgRlhfQk9PTAkJCUluaXQoRlhfQk9PTCBiT3duZGVkU3RyZWFtKTsKLSAgICBGWF9CT09MCQkJUmVhZE5leHRCbG9jaygpOwotICAgIEZYX0JPT0wJCQlJc0VPRigpOwotICAgIEZYX0JPT0wJCQlIYXZlQXZhaWxEYXRhKCk7Ci0gICAgdm9pZAkJCVNraXBXaGl0ZVNwYWNlcygpOwotICAgIHZvaWQJCQlHZXROYW1lKENGWF9CeXRlU3RyaW5nJiBzcGFjZSwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOwotICAgIHZvaWQJCQlHZXRBdHRyVmFsdWUoQ0ZYX1dpZGVTdHJpbmcgJnZhbHVlKTsKLSAgICBGWF9EV09SRAkJR2V0Q2hhclJlZigpOwotICAgIHZvaWQJCQlHZXRUYWdOYW1lKENGWF9CeXRlU3RyaW5nICZzcGFjZSwgQ0ZYX0J5dGVTdHJpbmcgJm5hbWUsIEZYX0JPT0wgJmJFbmRUYWcsIEZYX0JPT0wgYlN0YXJ0VGFnID0gRkFMU0UpOwotICAgIHZvaWQJCQlTa2lwTGl0ZXJhbHMoRlhfQlNUUiBzdHIpOwotICAgIENYTUxfRWxlbWVudCoJUGFyc2VFbGVtZW50KENYTUxfRWxlbWVudCogcFBhcmVudCwgRlhfQk9PTCBiU3RhcnRUYWcgPSBGQUxTRSk7Ci0gICAgdm9pZAkJCUluc2VydENvbnRlbnRTZWdtZW50KEZYX0JPT0wgYkNEQVRBLCBGWF9XU1RSIGNvbnRlbnQsIENYTUxfRWxlbWVudCogcEVsZW1lbnQpOwotICAgIHZvaWQJCQlJbnNlcnRDREFUQVNlZ21lbnQoQ0ZYX1VURjhEZWNvZGVyJiBkZWNvZGVyLCBDWE1MX0VsZW1lbnQqIHBFbGVtZW50KTsKKworY2xhc3MgQ1hNTF9QYXJzZXIgeworIHB1YmxpYzoKKyAgfkNYTUxfUGFyc2VyKCk7CisgIElGWF9CdWZmZXJSZWFkKiBtX3BEYXRhQWNjOworICBGWF9CT09MIG1fYk93bmVkU3RyZWFtOworICBGWF9GSUxFU0laRSBtX25PZmZzZXQ7CisgIEZYX0JPT0wgbV9iU2F2ZVNwYWNlQ2hhcnM7CisgIGNvbnN0IHVpbnQ4X3QqIG1fcEJ1ZmZlcjsKKyAgc2l6ZV90IG1fZHdCdWZmZXJTaXplOworICBGWF9GSUxFU0laRSBtX25CdWZmZXJPZmZzZXQ7CisgIHNpemVfdCBtX2R3SW5kZXg7CisgIEZYX0JPT0wgSW5pdCh1aW50OF90KiBwQnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisgIEZYX0JPT0wgSW5pdChJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZCk7CisgIEZYX0JPT0wgSW5pdChJRlhfQnVmZmVyUmVhZCogcEJ1ZmZlcik7CisgIEZYX0JPT0wgSW5pdChGWF9CT09MIGJPd25kZWRTdHJlYW0pOworICBGWF9CT09MIFJlYWROZXh0QmxvY2soKTsKKyAgRlhfQk9PTCBJc0VPRigpOworICBGWF9CT09MIEhhdmVBdmFpbERhdGEoKTsKKyAgdm9pZCBTa2lwV2hpdGVTcGFjZXMoKTsKKyAgdm9pZCBHZXROYW1lKENGWF9CeXRlU3RyaW5nJiBzcGFjZSwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOworICB2b2lkIEdldEF0dHJWYWx1ZShDRlhfV2lkZVN0cmluZyYgdmFsdWUpOworICBGWF9EV09SRCBHZXRDaGFyUmVmKCk7CisgIHZvaWQgR2V0VGFnTmFtZShDRlhfQnl0ZVN0cmluZyYgc3BhY2UsCisgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFbmRUYWcsCisgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGFydFRhZyA9IEZBTFNFKTsKKyAgdm9pZCBTa2lwTGl0ZXJhbHMoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpOworICBDWE1MX0VsZW1lbnQqIFBhcnNlRWxlbWVudChDWE1MX0VsZW1lbnQqIHBQYXJlbnQsIEZYX0JPT0wgYlN0YXJ0VGFnID0gRkFMU0UpOworICB2b2lkIEluc2VydENvbnRlbnRTZWdtZW50KEZYX0JPT0wgYkNEQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWE1MX0VsZW1lbnQqIHBFbGVtZW50KTsKKyAgdm9pZCBJbnNlcnRDREFUQVNlZ21lbnQoQ0ZYX1VURjhEZWNvZGVyJiBkZWNvZGVyLCBDWE1MX0VsZW1lbnQqIHBFbGVtZW50KTsKIH07Ci12b2lkIEZYX1hNTF9TcGxpdFF1YWxpZmllZE5hbWUoRlhfQlNUUiBic0Z1bGxOYW1lLCBDRlhfQnl0ZVN0cmluZ0MgJmJzU3BhY2UsIENGWF9CeXRlU3RyaW5nQyAmYnNOYW1lKTsKKwordm9pZCBGWF9YTUxfU3BsaXRRdWFsaWZpZWROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGdWxsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0MmIGJzU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDJiBic05hbWUpOwogCiAjZW5kaWYgIC8vIENPUkVfU1JDX0ZYQ1JUX1hNTF9JTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYWdnL0RFUFMgYi9jb3JlL3NyYy9meGdlL2FnZy9ERVBTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZDllMTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGdlL2FnZy9ERVBTCkBAIC0wLDAgKzEsMyBAQAoraW5jbHVkZV9ydWxlcyA9IFsKKyAgJyt0aGlyZF9wYXJ0eS9hZ2cyMycsCitdCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FnZy9hZ2cyMy9hZ2dfYXJyYXkuaCBiL2NvcmUvc3JjL2Z4Z2UvYWdnL2FnZzIzL2FnZ19hcnJheS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTBlYjRlLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Z2UvYWdnL2FnZzIzL2FnZ19hcnJheS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTA2ICswLDAgQEAKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBBbnRpLUdyYWluIEdlb21ldHJ5IC0gVmVyc2lvbiAyLjMKLS8vIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IE1heGltIFNoZW1hbmFyZXYgKGh0dHA6Ly93d3cuYW50aWdyYWluLmNvbSkKLS8vCi0vLyBQZXJtaXNzaW9uIHRvIGNvcHksIHVzZSwgbW9kaWZ5LCBzZWxsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKLS8vIGlzIGdyYW50ZWQgcHJvdmlkZWQgdGhpcyBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcy4KLS8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAotLy8gd2FycmFudHksIGFuZCB3aXRoIG5vIGNsYWltIGFzIHRvIGl0cyBzdWl0YWJpbGl0eSBmb3IgYW55IHB1cnBvc2UuCi0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb250YWN0OiBtY3NlZW1AYW50aWdyYWluLmNvbQotLy8gICAgICAgICAgbWNzZWVtYWdnQHlhaG9vLmNvbQotLy8gICAgICAgICAgaHR0cDovL3d3dy5hbnRpZ3JhaW4uY29tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZm5kZWYgQUdHX0FSUkFZX0lOQ0xVREVECi0jZGVmaW5lIEFHR19BUlJBWV9JTkNMVURFRAotI2luY2x1ZGUgImFnZ19iYXNpY3MuaCIKLW5hbWVzcGFjZSBhZ2cKLXsKLXRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIHBvZF9hcnJheSAKLXsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKLSAgICB+cG9kX2FycmF5KCkKLSAgICB7Ci0gICAgICAgIEZYX0ZyZWUobV9hcnJheSk7Ci0gICAgfQotICAgIHBvZF9hcnJheSgpIDogbV9zaXplKDApLCBtX2NhcGFjaXR5KDApLCBtX2FycmF5KDApIHt9Ci0gICAgcG9kX2FycmF5KHVuc2lnbmVkIGNhcCwgdW5zaWduZWQgZXh0cmFfdGFpbCA9IDApOwotICAgIHBvZF9hcnJheShjb25zdCBwb2RfYXJyYXk8VD4mKTsKLSAgICBjb25zdCBwb2RfYXJyYXk8VD4mIG9wZXJhdG9yID0gKGNvbnN0IHBvZF9hcnJheTxUPiYpOwotICAgIHZvaWQgY2FwYWNpdHkodW5zaWduZWQgY2FwLCB1bnNpZ25lZCBleHRyYV90YWlsID0gMCk7Ci0gICAgdW5zaWduZWQgY2FwYWNpdHkoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fY2FwYWNpdHk7Ci0gICAgfQotICAgIHZvaWQgYWxsb2NhdGUodW5zaWduZWQgc2l6ZSwgdW5zaWduZWQgZXh0cmFfdGFpbCA9IDApOwotICAgIHZvaWQgcmVzaXplKHVuc2lnbmVkIG5ld19zaXplKTsKLSAgICB2b2lkIHplcm8oKQotICAgIHsKLSAgICAgICAgRlhTWVNfbWVtc2V0KG1fYXJyYXksIDAsIHNpemVvZihUKSAqIG1fc2l6ZSk7Ci0gICAgfQotICAgIHZvaWQgYWRkKGNvbnN0IFQmIHYpCi0gICAgewotICAgICAgICBtX2FycmF5W21fc2l6ZSsrXSA9IHY7Ci0gICAgfQotICAgIHZvaWQgaW5jX3NpemUodW5zaWduZWQgc2l6ZSkKLSAgICB7Ci0gICAgICAgIG1fc2l6ZSArPSBzaXplOwotICAgIH0KLSAgICB1bnNpZ25lZCBzaXplKCkgICAgICBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fc2l6ZTsKLSAgICB9Ci0gICAgdW5zaWduZWQgYnl0ZV9zaXplKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3NpemUgKiBzaXplb2YoVCk7Ci0gICAgfQotICAgIGNvbnN0IFQmIG9wZXJhdG9yIFtdICh1bnNpZ25lZCBpKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYXJyYXlbaV07Ci0gICAgfQotICAgIFQmIG9wZXJhdG9yIFtdICh1bnNpZ25lZCBpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYXJyYXlbaV07Ci0gICAgfQotICAgIGNvbnN0IFQmIGF0KHVuc2lnbmVkIGkpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9hcnJheVtpXTsKLSAgICB9Ci0gICAgVCYgYXQodW5zaWduZWQgaSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2FycmF5W2ldOwotICAgIH0KLSAgICBUICB2YWx1ZV9hdCh1bnNpZ25lZCBpKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYXJyYXlbaV07Ci0gICAgfQotICAgIGNvbnN0IFQqIGRhdGEoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYXJyYXk7Ci0gICAgfQotICAgIFQqIGRhdGEoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYXJyYXk7Ci0gICAgfQotICAgIHZvaWQgcmVtb3ZlX2FsbCgpCi0gICAgewotICAgICAgICBtX3NpemUgPSAwOwotICAgIH0KLSAgICB2b2lkIGN1dF9hdCh1bnNpZ25lZCBudW0pCi0gICAgewotICAgICAgICBpZihudW0gPCBtX3NpemUpIHsKLSAgICAgICAgICAgIG1fc2l6ZSA9IG51bTsKLSAgICAgICAgfQotICAgIH0KLXByaXZhdGU6Ci0gICAgdW5zaWduZWQgbV9zaXplOwotICAgIHVuc2lnbmVkIG1fY2FwYWNpdHk7Ci0gICAgVCogICAgICAgbV9hcnJheTsKLX07Ci10ZW1wbGF0ZTxjbGFzcyBUPgotdm9pZCBwb2RfYXJyYXk8VD46OmNhcGFjaXR5KHVuc2lnbmVkIGNhcCwgdW5zaWduZWQgZXh0cmFfdGFpbCkKLXsKLSAgICBtX3NpemUgPSAwOwotICAgIHVuc2lnbmVkIGZ1bGxfY2FwID0gY2FwICsgZXh0cmFfdGFpbDsKLSAgICBpZihmdWxsX2NhcCA8IGNhcCkgewotICAgICAgICBGWF9GcmVlKG1fYXJyYXkpOwotICAgICAgICBtX2FycmF5ID0gMDsKLSAgICAgICAgbV9jYXBhY2l0eSA9IDA7Ci0gICAgfSBlbHNlIGlmKGZ1bGxfY2FwID4gbV9jYXBhY2l0eSkgewotICAgICAgICBGWF9GcmVlKG1fYXJyYXkpOwotICAgICAgICBtX2FycmF5ID0gRlhfQWxsb2MoVCwgZnVsbF9jYXApOwotICAgICAgICBtX2NhcGFjaXR5ID0gZnVsbF9jYXA7Ci0gICAgfQotfQotdGVtcGxhdGU8Y2xhc3MgVD4KLXZvaWQgcG9kX2FycmF5PFQ+OjphbGxvY2F0ZSh1bnNpZ25lZCBzaXplLCB1bnNpZ25lZCBleHRyYV90YWlsKQotewotICAgIGNhcGFjaXR5KHNpemUsIGV4dHJhX3RhaWwpOwotICAgIG1fc2l6ZSA9IHNpemU7Ci19Ci10ZW1wbGF0ZTxjbGFzcyBUPgotdm9pZCBwb2RfYXJyYXk8VD46OnJlc2l6ZSh1bnNpZ25lZCBuZXdfc2l6ZSkKLXsKLSAgICBpZihuZXdfc2l6ZSA+IG1fc2l6ZSkgewotICAgICAgICBpZihuZXdfc2l6ZSA+IG1fY2FwYWNpdHkpIHsKLSAgICAgICAgICAgIFQqIGRhdGEgPSBGWF9BbGxvYyhULCBuZXdfc2l6ZSk7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkoZGF0YSwgbV9hcnJheSwgbV9zaXplICogc2l6ZW9mKFQpKTsKLSAgICAgICAgICAgIEZYX0ZyZWUobV9hcnJheSk7Ci0gICAgICAgICAgICBtX2FycmF5ID0gZGF0YTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fc2l6ZSA9IG5ld19zaXplOwotICAgIH0KLX0KLXRlbXBsYXRlPGNsYXNzIFQ+IHBvZF9hcnJheTxUPjo6cG9kX2FycmF5KHVuc2lnbmVkIGNhcCwgdW5zaWduZWQgZXh0cmFfdGFpbCkgOgotICAgIG1fc2l6ZSgwKSwgbV9jYXBhY2l0eShjYXAgKyBleHRyYV90YWlsKSwgbV9hcnJheShGWF9BbGxvYyhULCBtX2NhcGFjaXR5KSkge30KLXRlbXBsYXRlPGNsYXNzIFQ+IHBvZF9hcnJheTxUPjo6cG9kX2FycmF5KGNvbnN0IHBvZF9hcnJheTxUPiYgdikgOgotICAgIG1fc2l6ZSh2Lm1fc2l6ZSksCi0gICAgbV9jYXBhY2l0eSh2Lm1fY2FwYWNpdHkpLAotICAgIG1fYXJyYXkodi5tX2NhcGFjaXR5ID8gRlhfQWxsb2MoVCwgdi5tX2NhcGFjaXR5KSA6IDApCi17Ci0gICAgRlhTWVNfbWVtY3B5KG1fYXJyYXksIHYubV9hcnJheSwgc2l6ZW9mKFQpICogdi5tX3NpemUpOwotfQotdGVtcGxhdGU8Y2xhc3MgVD4gY29uc3QgcG9kX2FycmF5PFQ+JgotcG9kX2FycmF5PFQ+OjpvcGVyYXRvciA9IChjb25zdCBwb2RfYXJyYXk8VD4mdikKLXsKLSAgICBhbGxvY2F0ZSh2Lm1fc2l6ZSk7Ci0gICAgaWYodi5tX3NpemUpIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5KG1fYXJyYXksIHYubV9hcnJheSwgc2l6ZW9mKFQpICogdi5tX3NpemUpOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci19Ci10ZW1wbGF0ZTxjbGFzcyBULCB1bnNpZ25lZCBTID0gNj4gY2xhc3MgcG9kX2RlcXVlIAotewotcHVibGljOgotICAgIGVudW0gYmxvY2tfc2NhbGVfZSB7Ci0gICAgICAgIGJsb2NrX3NoaWZ0ID0gUywKLSAgICAgICAgYmxvY2tfc2l6ZSAgPSAxIDw8IGJsb2NrX3NoaWZ0LAotICAgICAgICBibG9ja19tYXNrICA9IGJsb2NrX3NpemUgLSAxCi0gICAgfTsKLSAgICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKLSAgICB+cG9kX2RlcXVlKCk7Ci0gICAgcG9kX2RlcXVlKCk7Ci0gICAgcG9kX2RlcXVlKHVuc2lnbmVkIGJsb2NrX3B0cl9pbmMpOwotICAgIHBvZF9kZXF1ZShjb25zdCBwb2RfZGVxdWU8VCwgUz4mIHYpOwotICAgIGNvbnN0IHBvZF9kZXF1ZTxULCBTPiYgb3BlcmF0b3IgPSAoY29uc3QgcG9kX2RlcXVlPFQsIFM+JiB2KTsKLSAgICB2b2lkIHJlbW92ZV9hbGwoKQotICAgIHsKLSAgICAgICAgbV9zaXplID0gMDsKLSAgICB9Ci0gICAgdm9pZCBmcmVlX2FsbCgpCi0gICAgewotICAgICAgICBmcmVlX3RhaWwoMCk7Ci0gICAgfQotICAgIHZvaWQgZnJlZV90YWlsKHVuc2lnbmVkIHNpemUpOwotICAgIHZvaWQgYWRkKGNvbnN0IFQmIHZhbCk7Ci0gICAgdm9pZCBtb2RpZnlfbGFzdChjb25zdCBUJiB2YWwpOwotICAgIHZvaWQgcmVtb3ZlX2xhc3QoKTsKLSAgICBpbnQgYWxsb2NhdGVfY29udGludW91c19ibG9jayh1bnNpZ25lZCBudW1fZWxlbWVudHMpOwotICAgIHZvaWQgYWRkX2FycmF5KGNvbnN0IFQqIHB0ciwgdW5zaWduZWQgbnVtX2VsZW0pCi0gICAgewotICAgICAgICB3aGlsZShudW1fZWxlbS0tKSB7Ci0gICAgICAgICAgICBhZGQoKnB0cisrKTsKLSAgICAgICAgfQotICAgIH0KLSAgICB0ZW1wbGF0ZTxjbGFzcyBEYXRhQWNjZXNzb3I+IHZvaWQgYWRkX2RhdGEoRGF0YUFjY2Vzc29yJiBkYXRhKQotICAgIHsKLSAgICAgICAgd2hpbGUoZGF0YS5zaXplKCkpIHsKLSAgICAgICAgICAgIGFkZCgqZGF0YSk7Ci0gICAgICAgICAgICArK2RhdGE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdm9pZCBjdXRfYXQodW5zaWduZWQgc2l6ZSkKLSAgICB7Ci0gICAgICAgIGlmKHNpemUgPCBtX3NpemUpIHsKLSAgICAgICAgICAgIG1fc2l6ZSA9IHNpemU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9zaXplOwotICAgIH0KLSAgICBjb25zdCBUJiBvcGVyYXRvciBbXSAodW5zaWduZWQgaSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2Jsb2Nrc1tpID4+IGJsb2NrX3NoaWZ0XVtpICYgYmxvY2tfbWFza107Ci0gICAgfQotICAgIFQmIG9wZXJhdG9yIFtdICh1bnNpZ25lZCBpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYmxvY2tzW2kgPj4gYmxvY2tfc2hpZnRdW2kgJiBibG9ja19tYXNrXTsKLSAgICB9Ci0gICAgY29uc3QgVCYgYXQodW5zaWduZWQgaSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2Jsb2Nrc1tpID4+IGJsb2NrX3NoaWZ0XVtpICYgYmxvY2tfbWFza107Ci0gICAgfQotICAgIFQmIGF0KHVuc2lnbmVkIGkpCi0gICAgewotICAgICAgICByZXR1cm4gbV9ibG9ja3NbaSA+PiBibG9ja19zaGlmdF1baSAmIGJsb2NrX21hc2tdOwotICAgIH0KLSAgICBUIHZhbHVlX2F0KHVuc2lnbmVkIGkpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9ibG9ja3NbaSA+PiBibG9ja19zaGlmdF1baSAmIGJsb2NrX21hc2tdOwotICAgIH0KLSAgICBjb25zdCBUJiBjdXJyKHVuc2lnbmVkIGlkeCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKnRoaXMpW2lkeF07Ci0gICAgfQotICAgIFQmIGN1cnIodW5zaWduZWQgaWR4KQotICAgIHsKLSAgICAgICAgcmV0dXJuICgqdGhpcylbaWR4XTsKLSAgICB9Ci0gICAgY29uc3QgVCYgcHJldih1bnNpZ25lZCBpZHgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gKCp0aGlzKVsoaWR4ICsgbV9zaXplIC0gMSkgJSBtX3NpemVdOwotICAgIH0KLSAgICBUJiBwcmV2KHVuc2lnbmVkIGlkeCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKnRoaXMpWyhpZHggKyBtX3NpemUgLSAxKSAlIG1fc2l6ZV07Ci0gICAgfQotICAgIGNvbnN0IFQmIG5leHQodW5zaWduZWQgaWR4KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuICgqdGhpcylbKGlkeCArIDEpICUgbV9zaXplXTsKLSAgICB9Ci0gICAgVCYgbmV4dCh1bnNpZ25lZCBpZHgpCi0gICAgewotICAgICAgICByZXR1cm4gKCp0aGlzKVsoaWR4ICsgMSkgJSBtX3NpemVdOwotICAgIH0KLSAgICBjb25zdCBUJiBsYXN0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKnRoaXMpW21fc2l6ZSAtIDFdOwotICAgIH0KLSAgICBUJiBsYXN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKnRoaXMpW21fc2l6ZSAtIDFdOwotICAgIH0KLSAgICB1bnNpZ25lZCBieXRlX3NpemUoKSBjb25zdDsKLSAgICBjb25zdCBUKiBibG9jayh1bnNpZ25lZCBuYikgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2Jsb2Nrc1tuYl07Ci0gICAgfQotcHVibGljOgotICAgIHZvaWQgYWxsb2NhdGVfYmxvY2sodW5zaWduZWQgbmIpOwotICAgIFQqICAgZGF0YV9wdHIoKTsKLSAgICB1bnNpZ25lZCAgICAgICAgbV9zaXplOwotICAgIHVuc2lnbmVkICAgICAgICBtX251bV9ibG9ja3M7Ci0gICAgdW5zaWduZWQgICAgICAgIG1fbWF4X2Jsb2NrczsKLSAgICBUKiogICAgICAgICAgICAgbV9ibG9ja3M7Ci0gICAgdW5zaWduZWQgICAgICAgIG1fYmxvY2tfcHRyX2luYzsKLX07Ci10ZW1wbGF0ZTxjbGFzcyBULCB1bnNpZ25lZCBTPiBwb2RfZGVxdWU8VCwgUz46On5wb2RfZGVxdWUoKQotewotICAgIGlmKG1fbnVtX2Jsb2NrcykgewotICAgICAgICBUKiogYmxrID0gbV9ibG9ja3MgKyBtX251bV9ibG9ja3MgLSAxOwotICAgICAgICB3aGlsZShtX251bV9ibG9ja3MtLSkgewotICAgICAgICAgICAgRlhfRnJlZSgqYmxrKTsKLSAgICAgICAgICAgIC0tYmxrOwotICAgICAgICB9Ci0gICAgICAgIEZYX0ZyZWUobV9ibG9ja3MpOwotICAgIH0KLX0KLXRlbXBsYXRlPGNsYXNzIFQsIHVuc2lnbmVkIFM+Ci12b2lkIHBvZF9kZXF1ZTxULCBTPjo6ZnJlZV90YWlsKHVuc2lnbmVkIHNpemUpCi17Ci0gICAgaWYoc2l6ZSA8IG1fc2l6ZSkgewotICAgICAgICB1bnNpZ25lZCBuYiA9IChzaXplICsgYmxvY2tfbWFzaykgPj4gYmxvY2tfc2hpZnQ7Ci0gICAgICAgIHdoaWxlKG1fbnVtX2Jsb2NrcyA+IG5iKSB7Ci0gICAgICAgICAgICBGWF9GcmVlKG1fYmxvY2tzWy0tbV9udW1fYmxvY2tzXSk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9zaXplID0gc2l6ZTsKLSAgICB9Ci19Ci10ZW1wbGF0ZTxjbGFzcyBULCB1bnNpZ25lZCBTPiBwb2RfZGVxdWU8VCwgUz46OnBvZF9kZXF1ZSgpIDoKLSAgICBtX3NpemUoMCksCi0gICAgbV9udW1fYmxvY2tzKDApLAotICAgIG1fbWF4X2Jsb2NrcygwKSwKLSAgICBtX2Jsb2NrcygwKSwKLSAgICBtX2Jsb2NrX3B0cl9pbmMoYmxvY2tfc2l6ZSkKLXsKLX0KLXRlbXBsYXRlPGNsYXNzIFQsIHVuc2lnbmVkIFM+Ci1wb2RfZGVxdWU8VCwgUz46OnBvZF9kZXF1ZSh1bnNpZ25lZCBibG9ja19wdHJfaW5jKSA6Ci0gICAgbV9zaXplKDApLAotICAgIG1fbnVtX2Jsb2NrcygwKSwKLSAgICBtX21heF9ibG9ja3MoMCksCi0gICAgbV9ibG9ja3MoMCksCi0gICAgbV9ibG9ja19wdHJfaW5jKGJsb2NrX3B0cl9pbmMpCi17Ci19Ci10ZW1wbGF0ZTxjbGFzcyBULCB1bnNpZ25lZCBTPgotcG9kX2RlcXVlPFQsIFM+Ojpwb2RfZGVxdWUoY29uc3QgcG9kX2RlcXVlPFQsIFM+JiB2KSA6Ci0gICAgbV9zaXplKHYubV9zaXplKSwKLSAgICBtX251bV9ibG9ja3Modi5tX251bV9ibG9ja3MpLAotICAgIG1fbWF4X2Jsb2Nrcyh2Lm1fbWF4X2Jsb2NrcyksCi0gICAgbV9ibG9ja3Modi5tX21heF9ibG9ja3MgPyBGWF9BbGxvYyhUKiwgdi5tX21heF9ibG9ja3MpIDogMCksCi0gICAgbV9ibG9ja19wdHJfaW5jKHYubV9ibG9ja19wdHJfaW5jKQotewotICAgIHVuc2lnbmVkIGk7Ci0gICAgZm9yKGkgPSAwOyBpIDwgdi5tX251bV9ibG9ja3M7ICsraSkgewotICAgICAgICBtX2Jsb2Nrc1tpXSA9IEZYX0FsbG9jKFQsIGJsb2NrX3NpemUpOwotICAgICAgICBGWFNZU19tZW1jcHkobV9ibG9ja3NbaV0sIHYubV9ibG9ja3NbaV0sIGJsb2NrX3NpemUgKiBzaXplb2YoVCkpOwotICAgIH0KLX0KLXRlbXBsYXRlPGNsYXNzIFQsIHVuc2lnbmVkIFM+Ci1jb25zdCBwb2RfZGVxdWU8VCwgUz4mIHBvZF9kZXF1ZTxULCBTPjo6b3BlcmF0b3IgPSAoY29uc3QgcG9kX2RlcXVlPFQsIFM+JiB2KQotewotICAgIHVuc2lnbmVkIGk7Ci0gICAgZm9yKGkgPSBtX251bV9ibG9ja3M7IGkgPCB2Lm1fbnVtX2Jsb2NrczsgKytpKSB7Ci0gICAgICAgIGFsbG9jYXRlX2Jsb2NrKGkpOwotICAgIH0KLSAgICBmb3IoaSA9IDA7IGkgPCB2Lm1fbnVtX2Jsb2NrczsgKytpKSB7Ci0gICAgICAgIEZYU1lTX21lbWNweShtX2Jsb2Nrc1tpXSwgdi5tX2Jsb2Nrc1tpXSwgYmxvY2tfc2l6ZSAqIHNpemVvZihUKSk7Ci0gICAgfQotICAgIG1fc2l6ZSA9IHYubV9zaXplOwotICAgIHJldHVybiAqdGhpczsKLX0KLXRlbXBsYXRlPGNsYXNzIFQsIHVuc2lnbmVkIFM+Ci12b2lkIHBvZF9kZXF1ZTxULCBTPjo6YWxsb2NhdGVfYmxvY2sodW5zaWduZWQgbmIpCi17Ci0gICAgaWYobmIgPj0gbV9tYXhfYmxvY2tzKSB7Ci0gICAgICAgIFQqKiBuZXdfYmxvY2tzID0gRlhfQWxsb2MoVCosIG1fbWF4X2Jsb2NrcyArIG1fYmxvY2tfcHRyX2luYyk7Ci0gICAgICAgIGlmKG1fYmxvY2tzKSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkobmV3X2Jsb2NrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBtX2Jsb2NrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBtX251bV9ibG9ja3MgKiBzaXplb2YoVCopKTsKLSAgICAgICAgICAgIEZYX0ZyZWUobV9ibG9ja3MpOwotICAgICAgICB9Ci0gICAgICAgIG1fYmxvY2tzID0gbmV3X2Jsb2NrczsKLSAgICAgICAgbV9tYXhfYmxvY2tzICs9IG1fYmxvY2tfcHRyX2luYzsKLSAgICB9Ci0gICAgbV9ibG9ja3NbbmJdID0gRlhfQWxsb2MoVCwgYmxvY2tfc2l6ZSk7Ci0gICAgbV9udW1fYmxvY2tzKys7Ci19Ci10ZW1wbGF0ZTxjbGFzcyBULCB1bnNpZ25lZCBTPgotaW5saW5lIFQqIHBvZF9kZXF1ZTxULCBTPjo6ZGF0YV9wdHIoKQotewotICAgIHVuc2lnbmVkIG5iID0gbV9zaXplID4+IGJsb2NrX3NoaWZ0OwotICAgIGlmKG5iID49IG1fbnVtX2Jsb2NrcykgewotICAgICAgICBhbGxvY2F0ZV9ibG9jayhuYik7Ci0gICAgfQotICAgIHJldHVybiBtX2Jsb2Nrc1tuYl0gKyAobV9zaXplICYgYmxvY2tfbWFzayk7Ci19Ci10ZW1wbGF0ZTxjbGFzcyBULCB1bnNpZ25lZCBTPgotaW5saW5lIHZvaWQgcG9kX2RlcXVlPFQsIFM+OjphZGQoY29uc3QgVCYgdmFsKQotewotICAgICpkYXRhX3B0cigpID0gdmFsOwotICAgICsrbV9zaXplOwotfQotdGVtcGxhdGU8Y2xhc3MgVCwgdW5zaWduZWQgUz4KLWlubGluZSB2b2lkIHBvZF9kZXF1ZTxULCBTPjo6cmVtb3ZlX2xhc3QoKQotewotICAgIGlmKG1fc2l6ZSkgewotICAgICAgICAtLW1fc2l6ZTsKLSAgICB9Ci19Ci10ZW1wbGF0ZTxjbGFzcyBULCB1bnNpZ25lZCBTPgotdm9pZCBwb2RfZGVxdWU8VCwgUz46Om1vZGlmeV9sYXN0KGNvbnN0IFQmIHZhbCkKLXsKLSAgICByZW1vdmVfbGFzdCgpOwotICAgIGFkZCh2YWwpOwotfQotdGVtcGxhdGU8Y2xhc3MgVCwgdW5zaWduZWQgUz4KLWludCBwb2RfZGVxdWU8VCwgUz46OmFsbG9jYXRlX2NvbnRpbnVvdXNfYmxvY2sodW5zaWduZWQgbnVtX2VsZW1lbnRzKQotewotICAgIGlmKG51bV9lbGVtZW50cyA8IGJsb2NrX3NpemUpIHsKLSAgICAgICAgZGF0YV9wdHIoKTsKLSAgICAgICAgdW5zaWduZWQgcmVzdCA9IGJsb2NrX3NpemUgLSAobV9zaXplICYgYmxvY2tfbWFzayk7Ci0gICAgICAgIHVuc2lnbmVkIGluZGV4OwotICAgICAgICBpZihudW1fZWxlbWVudHMgPD0gcmVzdCkgewotICAgICAgICAgICAgaW5kZXggPSBtX3NpemU7Ci0gICAgICAgICAgICBtX3NpemUgKz0gbnVtX2VsZW1lbnRzOwotICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICB9Ci0gICAgICAgIG1fc2l6ZSArPSByZXN0OwotICAgICAgICBkYXRhX3B0cigpOwotICAgICAgICBpbmRleCA9IG1fc2l6ZTsKLSAgICAgICAgbV9zaXplICs9IG51bV9lbGVtZW50czsKLSAgICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci10ZW1wbGF0ZTxjbGFzcyBULCB1bnNpZ25lZCBTPgotdW5zaWduZWQgcG9kX2RlcXVlPFQsIFM+OjpieXRlX3NpemUoKSBjb25zdAotewotICAgIHJldHVybiBtX3NpemUgKiBzaXplb2YoVCk7Ci19Ci1jbGFzcyBwb2RfYWxsb2NhdG9yIAotewotcHVibGljOgotICAgIHZvaWQgcmVtb3ZlX2FsbCgpCi0gICAgewotICAgICAgICBpZihtX251bV9ibG9ja3MpIHsKLSAgICAgICAgICAgIGludDh1KiogYmxrID0gbV9ibG9ja3MgKyBtX251bV9ibG9ja3MgLSAxOwotICAgICAgICAgICAgd2hpbGUobV9udW1fYmxvY2tzLS0pIHsKLSAgICAgICAgICAgICAgICBGWF9GcmVlKCpibGspOwotICAgICAgICAgICAgICAgIC0tYmxrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfRnJlZShtX2Jsb2Nrcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9udW1fYmxvY2tzID0gMDsKLSAgICAgICAgbV9tYXhfYmxvY2tzID0gMDsKLSAgICAgICAgbV9ibG9ja3MgPSAwOwotICAgICAgICBtX2J1Zl9wdHIgPSAwOwotICAgICAgICBtX3Jlc3QgPSAwOwotICAgIH0KLSAgICB+cG9kX2FsbG9jYXRvcigpCi0gICAgewotICAgICAgICByZW1vdmVfYWxsKCk7Ci0gICAgfQotICAgIHBvZF9hbGxvY2F0b3IodW5zaWduZWQgYmxvY2tfc2l6ZSwgdW5zaWduZWQgYmxvY2tfcHRyX2luYyA9IDI1NiAtIDgpIDoKLSAgICAgICAgbV9ibG9ja19zaXplKGJsb2NrX3NpemUpLAotICAgICAgICBtX2Jsb2NrX3B0cl9pbmMoYmxvY2tfcHRyX2luYyksCi0gICAgICAgIG1fbnVtX2Jsb2NrcygwKSwKLSAgICAgICAgbV9tYXhfYmxvY2tzKDApLAotICAgICAgICBtX2Jsb2NrcygwKSwKLSAgICAgICAgbV9idWZfcHRyKDApLAotICAgICAgICBtX3Jlc3QoMCkKLSAgICB7Ci0gICAgfQotICAgIGludDh1KiBhbGxvY2F0ZSh1bnNpZ25lZCBzaXplLCB1bnNpZ25lZCBhbGlnbm1lbnQgPSAxKQotICAgIHsKLSAgICAgICAgaWYoc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZihzaXplIDw9IG1fcmVzdCkgewotICAgICAgICAgICAgaW50OHUqIHB0ciA9IG1fYnVmX3B0cjsKLSAgICAgICAgICAgIGlmKGFsaWdubWVudCA+IDEpIHsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBhbGlnbiA9IChhbGlnbm1lbnQgLSB1bnNpZ25lZCgoc2l6ZV90KXB0cikgJSBhbGlnbm1lbnQpICUgYWxpZ25tZW50OwotICAgICAgICAgICAgICAgIHNpemUgKz0gYWxpZ247Ci0gICAgICAgICAgICAgICAgcHRyICs9IGFsaWduOwotICAgICAgICAgICAgICAgIGlmKHNpemUgPD0gbV9yZXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcmVzdCAtPSBzaXplOwotICAgICAgICAgICAgICAgICAgICBtX2J1Zl9wdHIgKz0gc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHB0cjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWxsb2NhdGVfYmxvY2soc2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFsbG9jYXRlKHNpemUgLSBhbGlnbiwgYWxpZ25tZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fcmVzdCAtPSBzaXplOwotICAgICAgICAgICAgbV9idWZfcHRyICs9IHNpemU7Ci0gICAgICAgICAgICByZXR1cm4gcHRyOwotICAgICAgICB9Ci0gICAgICAgIGFsbG9jYXRlX2Jsb2NrKHNpemUgKyBhbGlnbm1lbnQgLSAxKTsKLSAgICAgICAgcmV0dXJuIGFsbG9jYXRlKHNpemUsIGFsaWdubWVudCk7Ci0gICAgfQotcHJpdmF0ZToKLSAgICB2b2lkIGFsbG9jYXRlX2Jsb2NrKHVuc2lnbmVkIHNpemUpCi0gICAgewotICAgICAgICBpZihzaXplIDwgbV9ibG9ja19zaXplKSB7Ci0gICAgICAgICAgICBzaXplID0gbV9ibG9ja19zaXplOwotICAgICAgICB9Ci0gICAgICAgIGlmKG1fbnVtX2Jsb2NrcyA+PSBtX21heF9ibG9ja3MpIHsKLSAgICAgICAgICAgIGludDh1KiogbmV3X2Jsb2NrcyA9IEZYX0FsbG9jKGludDh1KiwgbV9tYXhfYmxvY2tzICsgbV9ibG9ja19wdHJfaW5jKTsKLSAgICAgICAgICAgIGlmKG1fYmxvY2tzKSB7Ci0gICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KG5ld19ibG9ja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYmxvY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX251bV9ibG9ja3MgKiBzaXplb2YoaW50OHUqKSk7Ci0gICAgICAgICAgICAgICAgRlhfRnJlZShtX2Jsb2Nrcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2Jsb2NrcyA9IG5ld19ibG9ja3M7Ci0gICAgICAgICAgICBtX21heF9ibG9ja3MgKz0gbV9ibG9ja19wdHJfaW5jOwotICAgICAgICB9Ci0gICAgICAgIG1fYmxvY2tzW21fbnVtX2Jsb2Nrc10gPSBtX2J1Zl9wdHIgPSBGWF9BbGxvYyhpbnQ4dSwgc2l6ZSk7Ci0gICAgICAgIG1fbnVtX2Jsb2NrcysrOwotICAgICAgICBtX3Jlc3QgPSBzaXplOwotICAgIH0KLSAgICB1bnNpZ25lZCBtX2Jsb2NrX3NpemU7Ci0gICAgdW5zaWduZWQgbV9ibG9ja19wdHJfaW5jOwotICAgIHVuc2lnbmVkIG1fbnVtX2Jsb2NrczsKLSAgICB1bnNpZ25lZCBtX21heF9ibG9ja3M7Ci0gICAgaW50OHUqKiAgbV9ibG9ja3M7Ci0gICAgaW50OHUqICAgbV9idWZfcHRyOwotICAgIHVuc2lnbmVkIG1fcmVzdDsKLX07Ci1lbnVtIHF1aWNrX3NvcnRfdGhyZXNob2xkX2UgewotICAgIHF1aWNrX3NvcnRfdGhyZXNob2xkID0gOQotfTsKLXRlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSB2b2lkIHN3YXBfZWxlbWVudHMoVCYgYSwgVCYgYikKLXsKLSAgICBUIHRlbXAgPSBhOwotICAgIGEgPSBiOwotICAgIGIgPSB0ZW1wOwotfQotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FnZy9hZ2cyMy9hZ2dfYmFzaWNzLmggYi9jb3JlL3NyYy9meGdlL2FnZy9hZ2cyMy9hZ2dfYmFzaWNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZmFkNTguLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvYWdnX2Jhc2ljcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBBbnRpLUdyYWluIEdlb21ldHJ5IC0gVmVyc2lvbiAyLjMKLS8vIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IE1heGltIFNoZW1hbmFyZXYgKGh0dHA6Ly93d3cuYW50aWdyYWluLmNvbSkKLS8vCi0vLyBQZXJtaXNzaW9uIHRvIGNvcHksIHVzZSwgbW9kaWZ5LCBzZWxsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKLS8vIGlzIGdyYW50ZWQgcHJvdmlkZWQgdGhpcyBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcy4KLS8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAotLy8gd2FycmFudHksIGFuZCB3aXRoIG5vIGNsYWltIGFzIHRvIGl0cyBzdWl0YWJpbGl0eSBmb3IgYW55IHB1cnBvc2UuCi0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb250YWN0OiBtY3NlZW1AYW50aWdyYWluLmNvbQotLy8gICAgICAgICAgbWNzZWVtYWdnQHlhaG9vLmNvbQotLy8gICAgICAgICAgaHR0cDovL3d3dy5hbnRpZ3JhaW4uY29tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZm5kZWYgQUdHX0JBU0lDU19JTkNMVURFRAotI2RlZmluZSBBR0dfQkFTSUNTX0lOQ0xVREVECi0jaWZuZGVmIEFHR19JTlQ4Ci0jZGVmaW5lIEFHR19JTlQ4IHNpZ25lZCBjaGFyCi0jZW5kaWYKLSNpZm5kZWYgQUdHX0lOVDhVCi0jZGVmaW5lIEFHR19JTlQ4VSB1bnNpZ25lZCBjaGFyCi0jZW5kaWYKLSNpZm5kZWYgQUdHX0lOVDE2Ci0jZGVmaW5lIEFHR19JTlQxNiBzaG9ydAotI2VuZGlmCi0jaWZuZGVmIEFHR19JTlQxNlUKLSNkZWZpbmUgQUdHX0lOVDE2VSB1bnNpZ25lZCBzaG9ydAotI2VuZGlmCi0jaWZuZGVmIEFHR19JTlQzMgotI2RlZmluZSBBR0dfSU5UMzIgaW50Ci0jZW5kaWYKLSNpZm5kZWYgQUdHX0lOVDMyVQotI2RlZmluZSBBR0dfSU5UMzJVIHVuc2lnbmVkCi0jZW5kaWYKLSNpZm5kZWYgQUdHX0lOVDY0Ci0jZGVmaW5lIEFHR19JTlQ2NCBzaWduZWQgbG9uZyBsb25nCi0jZW5kaWYKLSNpZm5kZWYgQUdHX0lOVDY0VQotI2RlZmluZSBBR0dfSU5UNjRVIHVuc2lnbmVkIGxvbmcgbG9uZwotI2VuZGlmCi0jZGVmaW5lIEFHR19JTkxJTkUgaW5saW5lCi1uYW1lc3BhY2UgYWdnCi17Ci10eXBlZGVmIEFHR19JTlQ4ICAgaW50ODsKLXR5cGVkZWYgQUdHX0lOVDhVICBpbnQ4dTsKLXR5cGVkZWYgQUdHX0lOVDE2ICBpbnQxNjsKLXR5cGVkZWYgQUdHX0lOVDE2VSBpbnQxNnU7Ci10eXBlZGVmIEFHR19JTlQzMiAgaW50MzI7Ci10eXBlZGVmIEFHR19JTlQzMlUgaW50MzJ1OwotdHlwZWRlZiBBR0dfSU5UNjQgIGludDY0OwotdHlwZWRlZiBBR0dfSU5UNjRVIGludDY0dTsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBjb3Zlcl90eXBlOwotZW51bSBjb3Zlcl9zY2FsZV9lIHsKLSAgICBjb3Zlcl9zaGlmdCA9IDgsCi0gICAgY292ZXJfc2l6ZSAgPSAxIDw8IGNvdmVyX3NoaWZ0LAotICAgIGNvdmVyX21hc2sgID0gY292ZXJfc2l6ZSAtIDEsCi0gICAgY292ZXJfbm9uZSAgPSAwLAotICAgIGNvdmVyX2Z1bGwgID0gY292ZXJfbWFzawotfTsKLXRlbXBsYXRlPGNsYXNzIFQ+IHN0cnVjdCByZWN0X2Jhc2UgIHsKLSAgICB0eXBlZGVmIHJlY3RfYmFzZTxUPiBzZWxmX3R5cGU7Ci0gICAgVCB4MTsKLSAgICBUIHkxOwotICAgIFQgeDI7Ci0gICAgVCB5MjsKLSAgICByZWN0X2Jhc2UoKSB7fQotICAgIHJlY3RfYmFzZShUIHgxXywgVCB5MV8sIFQgeDJfLCBUIHkyXykgOgotICAgICAgICB4MSh4MV8pLCB5MSh5MV8pLCB4Mih4Ml8pLCB5Mih5Ml8pIHt9Ci0gICAgY29uc3Qgc2VsZl90eXBlJiBub3JtYWxpemUoKQotICAgIHsKLSAgICAgICAgVCB0OwotICAgICAgICBpZih4MSA+IHgyKSB7Ci0gICAgICAgICAgICB0ID0geDE7Ci0gICAgICAgICAgICB4MSA9IHgyOwotICAgICAgICAgICAgeDIgPSB0OwotICAgICAgICB9Ci0gICAgICAgIGlmKHkxID4geTIpIHsKLSAgICAgICAgICAgIHQgPSB5MTsKLSAgICAgICAgICAgIHkxID0geTI7Ci0gICAgICAgICAgICB5MiA9IHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgICBib29sIGNsaXAoY29uc3Qgc2VsZl90eXBlJiByKQotICAgIHsKLSAgICAgICAgaWYoeDIgPiByLngyKSB7Ci0gICAgICAgICAgICB4MiA9IHIueDI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoeTIgPiByLnkyKSB7Ci0gICAgICAgICAgICB5MiA9IHIueTI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoeDEgPCByLngxKSB7Ci0gICAgICAgICAgICB4MSA9IHIueDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoeTEgPCByLnkxKSB7Ci0gICAgICAgICAgICB5MSA9IHIueTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHgxIDw9IHgyICYmIHkxIDw9IHkyOwotICAgIH0KLSAgICBib29sIGlzX3ZhbGlkKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB4MSA8PSB4MiAmJiB5MSA8PSB5MjsKLSAgICB9Ci19OwotdGVtcGxhdGU8Y2xhc3MgUmVjdD4KLWlubGluZSBSZWN0IGludGVyc2VjdF9yZWN0YW5nbGVzKGNvbnN0IFJlY3QmIHIxLCBjb25zdCBSZWN0JiByMikKLXsKLSAgICBSZWN0IHIgPSByMTsKLSAgICBpZihyLngyID4gcjIueDIpIHsKLSAgICAgICAgci54MiA9IHIyLngyOwotICAgIH0KLSAgICBpZihyLnkyID4gcjIueTIpIHsKLSAgICAgICAgci55MiA9IHIyLnkyOwotICAgIH0KLSAgICBpZihyLngxIDwgcjIueDEpIHsKLSAgICAgICAgci54MSA9IHIyLngxOwotICAgIH0KLSAgICBpZihyLnkxIDwgcjIueTEpIHsKLSAgICAgICAgci55MSA9IHIyLnkxOwotICAgIH0KLSAgICByZXR1cm4gcjsKLX0KLXRlbXBsYXRlPGNsYXNzIFJlY3Q+Ci1pbmxpbmUgUmVjdCB1bml0ZV9yZWN0YW5nbGVzKGNvbnN0IFJlY3QmIHIxLCBjb25zdCBSZWN0JiByMikKLXsKLSAgICBSZWN0IHIgPSByMTsKLSAgICBpZihyLngyIDwgcjIueDIpIHsKLSAgICAgICAgci54MiA9IHIyLngyOwotICAgIH0KLSAgICBpZihyLnkyIDwgcjIueTIpIHsKLSAgICAgICAgci55MiA9IHIyLnkyOwotICAgIH0KLSAgICBpZihyLngxID4gcjIueDEpIHsKLSAgICAgICAgci54MSA9IHIyLngxOwotICAgIH0KLSAgICBpZihyLnkxID4gcjIueTEpIHsKLSAgICAgICAgci55MSA9IHIyLnkxOwotICAgIH0KLSAgICByZXR1cm4gcjsKLX0KLXR5cGVkZWYgcmVjdF9iYXNlPGludD4gICAgcmVjdDsKLXR5cGVkZWYgcmVjdF9iYXNlPEZYX0ZMT0FUPiByZWN0X2Q7Ci1lbnVtIHBhdGhfY29tbWFuZHNfZSB7Ci0gICAgcGF0aF9jbWRfc3RvcCAgICAgPSAwLAotICAgIHBhdGhfY21kX21vdmVfdG8gID0gMSwKLSAgICBwYXRoX2NtZF9saW5lX3RvICA9IDIsCi0gICAgcGF0aF9jbWRfY3VydmUzICAgPSAzLAotICAgIHBhdGhfY21kX2N1cnZlNCAgID0gNCwKLSAgICBwYXRoX2NtZF9jdXJ2ZU4gICA9IDUsCi0gICAgcGF0aF9jbWRfY2F0cm9tICAgPSA2LAotICAgIHBhdGhfY21kX3Vic3BsaW5lID0gNywKLSAgICBwYXRoX2NtZF9lbmRfcG9seSA9IDB4MEYsCi0gICAgcGF0aF9jbWRfbWFzayAgICAgPSAweDBGCi19OwotZW51bSBwYXRoX2ZsYWdzX2UgewotICAgIHBhdGhfZmxhZ3Nfbm9uZSAgPSAwLAotICAgIHBhdGhfZmxhZ3NfY2N3ICAgPSAweDEwLAotICAgIHBhdGhfZmxhZ3NfY3cgICAgPSAweDIwLAotICAgIHBhdGhfZmxhZ3NfY2xvc2UgPSAweDQwLAotICAgIHBhdGhfZmxhZ3NfanIJID0gMHg4MCwKLSAgICBwYXRoX2ZsYWdzX21hc2sgID0gMHhGMAotfTsKLWlubGluZSBib29sIGlzX3ZlcnRleCh1bnNpZ25lZCBjKQotewotICAgIGMgJj0gfnBhdGhfZmxhZ3NfanI7Ci0gICAgcmV0dXJuIGMgPj0gcGF0aF9jbWRfbW92ZV90byAmJiBjIDwgcGF0aF9jbWRfZW5kX3BvbHk7Ci19Ci1pbmxpbmUgYm9vbCBpc19kcmF3aW5nKHVuc2lnbmVkIGMpCi17Ci0gICAgYyAmPSB+cGF0aF9mbGFnc19qcjsKLSAgICByZXR1cm4gYyA+PSBwYXRoX2NtZF9saW5lX3RvICYmIGMgPCBwYXRoX2NtZF9lbmRfcG9seTsKLX0KLWlubGluZSBib29sIGlzX3N0b3AodW5zaWduZWQgYykKLXsKLSAgICBjICY9IH5wYXRoX2ZsYWdzX2pyOwotICAgIHJldHVybiBjID09IHBhdGhfY21kX3N0b3A7Ci19Ci1pbmxpbmUgYm9vbCBpc19tb3ZlX3RvKHVuc2lnbmVkIGMpCi17Ci0gICAgYyAmPSB+cGF0aF9mbGFnc19qcjsKLSAgICByZXR1cm4gYyA9PSBwYXRoX2NtZF9tb3ZlX3RvOwotfQotaW5saW5lIGJvb2wgaXNfbGluZV90byh1bnNpZ25lZCBjKQotewotICAgIGMgJj0gfnBhdGhfZmxhZ3NfanI7Ci0gICAgcmV0dXJuIGMgPT0gcGF0aF9jbWRfbGluZV90bzsKLX0KLWlubGluZSBib29sIGlzX2N1cnZlKHVuc2lnbmVkIGMpCi17Ci0gICAgYyAmPSB+cGF0aF9mbGFnc19qcjsKLSAgICByZXR1cm4gYyA9PSBwYXRoX2NtZF9jdXJ2ZTMgfHwgYyA9PSBwYXRoX2NtZF9jdXJ2ZTQ7Ci19Ci1pbmxpbmUgYm9vbCBpc19jdXJ2ZTModW5zaWduZWQgYykKLXsKLSAgICBjICY9IH5wYXRoX2ZsYWdzX2pyOwotICAgIHJldHVybiBjID09IHBhdGhfY21kX2N1cnZlMzsKLX0KLWlubGluZSBib29sIGlzX2N1cnZlNCh1bnNpZ25lZCBjKQotewotICAgIGMgJj0gfnBhdGhfZmxhZ3NfanI7Ci0gICAgcmV0dXJuIGMgPT0gcGF0aF9jbWRfY3VydmU0OwotfQotaW5saW5lIGJvb2wgaXNfZW5kX3BvbHkodW5zaWduZWQgYykKLXsKLSAgICBjICY9IH5wYXRoX2ZsYWdzX2pyOwotICAgIHJldHVybiAoYyAmIHBhdGhfY21kX21hc2spID09IHBhdGhfY21kX2VuZF9wb2x5OwotfQotaW5saW5lIGJvb2wgaXNfY2xvc2UodW5zaWduZWQgYykKLXsKLSAgICBjICY9IH5wYXRoX2ZsYWdzX2pyOwotICAgIHJldHVybiAoYyAmIH4ocGF0aF9mbGFnc19jdyB8IHBhdGhfZmxhZ3NfY2N3KSkgPT0KLSAgICAgICAgICAgKHBhdGhfY21kX2VuZF9wb2x5IHwgcGF0aF9mbGFnc19jbG9zZSk7Ci19Ci1pbmxpbmUgYm9vbCBpc19uZXh0X3BvbHkodW5zaWduZWQgYykKLXsKLSAgICBjICY9IH5wYXRoX2ZsYWdzX2pyOwotICAgIHJldHVybiBpc19zdG9wKGMpIHx8IGlzX21vdmVfdG8oYykgfHwgaXNfZW5kX3BvbHkoYyk7Ci19Ci1pbmxpbmUgYm9vbCBpc19jdyh1bnNpZ25lZCBjKQotewotICAgIGMgJj0gfnBhdGhfZmxhZ3NfanI7Ci0gICAgcmV0dXJuIChjICYgcGF0aF9mbGFnc19jdykgIT0gMDsKLX0KLWlubGluZSBib29sIGlzX2Njdyh1bnNpZ25lZCBjKQotewotICAgIGMgJj0gfnBhdGhfZmxhZ3NfanI7Ci0gICAgcmV0dXJuIChjICYgcGF0aF9mbGFnc19jY3cpICE9IDA7Ci19Ci1pbmxpbmUgYm9vbCBpc19vcmllbnRlZCh1bnNpZ25lZCBjKQotewotICAgIGMgJj0gfnBhdGhfZmxhZ3NfanI7Ci0gICAgcmV0dXJuIChjICYgKHBhdGhfZmxhZ3NfY3cgfCBwYXRoX2ZsYWdzX2NjdykpICE9IDA7Ci19Ci1pbmxpbmUgYm9vbCBpc19jbG9zZWQodW5zaWduZWQgYykKLXsKLSAgICBjICY9IH5wYXRoX2ZsYWdzX2pyOwotICAgIHJldHVybiAoYyAmIHBhdGhfZmxhZ3NfY2xvc2UpICE9IDA7Ci19Ci1pbmxpbmUgdW5zaWduZWQgZ2V0X2Nsb3NlX2ZsYWcodW5zaWduZWQgYykKLXsKLSAgICBjICY9IH5wYXRoX2ZsYWdzX2pyOwotICAgIHJldHVybiBjICYgcGF0aF9mbGFnc19jbG9zZTsKLX0KLWlubGluZSB1bnNpZ25lZCBjbGVhcl9vcmllbnRhdGlvbih1bnNpZ25lZCBjKQotewotICAgIGMgJj0gfnBhdGhfZmxhZ3NfanI7Ci0gICAgcmV0dXJuIGMgJiB+KHBhdGhfZmxhZ3NfY3cgfCBwYXRoX2ZsYWdzX2Njdyk7Ci19Ci1pbmxpbmUgdW5zaWduZWQgZ2V0X29yaWVudGF0aW9uKHVuc2lnbmVkIGMpCi17Ci0gICAgYyAmPSB+cGF0aF9mbGFnc19qcjsKLSAgICByZXR1cm4gYyAmIChwYXRoX2ZsYWdzX2N3IHwgcGF0aF9mbGFnc19jY3cpOwotfQotaW5saW5lIHVuc2lnbmVkIHNldF9vcmllbnRhdGlvbih1bnNpZ25lZCBjLCB1bnNpZ25lZCBvKQotewotICAgIGMgJj0gfnBhdGhfZmxhZ3NfanI7Ci0gICAgcmV0dXJuIGNsZWFyX29yaWVudGF0aW9uKGMpIHwgbzsKLX0KLXN0cnVjdCBwb2ludF90eXBlICB7Ci0gICAgRlhfRkxPQVQgeCwgeTsKLSAgICB1bnNpZ25lZCBmbGFnOwotICAgIHBvaW50X3R5cGUoKSB7fQotICAgIHBvaW50X3R5cGUoRlhfRkxPQVQgeF8sIEZYX0ZMT0FUIHlfLCB1bnNpZ25lZCBmbGFnXyA9IDApIDogeCh4XyksIHkoeV8pLCBmbGFnKGZsYWdfKSB7fQotfTsKLXN0cnVjdCBwb2ludF90eXBlX2ZsYWcgOiBwdWJsaWMgcG9pbnRfdHlwZSB7Ci0gICAgdW5zaWduZWQgZmxhZzsKLSAgICBwb2ludF90eXBlX2ZsYWcoKQotICAgIHsKLSAgICAgICAgZmxhZyA9IDA7Ci0gICAgfQotICAgIHBvaW50X3R5cGVfZmxhZyhGWF9GTE9BVCB4XywgRlhfRkxPQVQgeV8sIHVuc2lnbmVkIGZsYWdfID0gMCkgOiBwb2ludF90eXBlKHhfLCB5XyksIGZsYWcoZmxhZ18pIHt9Ci19Owotc3RydWN0IHZlcnRleF90eXBlICB7Ci0gICAgRlhfRkxPQVQgICB4LCB5OwotICAgIHVuc2lnbmVkIGNtZDsKLSAgICB2ZXJ0ZXhfdHlwZSgpIHt9Ci0gICAgdmVydGV4X3R5cGUoRlhfRkxPQVQgeF8sIEZYX0ZMT0FUIHlfLCB1bnNpZ25lZCBjbWRfKSA6Ci0gICAgICAgIHgoeF8pLCB5KHlfKSwgY21kKGNtZF8pIHt9Ci19OwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FnZy9hZ2cyMy9hZ2dfcmFzdGVyaXplcl9zY2FubGluZV9hYS5oIGIvY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvYWdnX3Jhc3Rlcml6ZXJfc2NhbmxpbmVfYWEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA2MzIyYy4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGdlL2FnZy9hZ2cyMy9hZ2dfcmFzdGVyaXplcl9zY2FubGluZV9hYS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcyICswLDAgQEAKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBBbnRpLUdyYWluIEdlb21ldHJ5IC0gVmVyc2lvbiAyLjMKLS8vIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IE1heGltIFNoZW1hbmFyZXYgKGh0dHA6Ly93d3cuYW50aWdyYWluLmNvbSkKLS8vCi0vLyBQZXJtaXNzaW9uIHRvIGNvcHksIHVzZSwgbW9kaWZ5LCBzZWxsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKLS8vIGlzIGdyYW50ZWQgcHJvdmlkZWQgdGhpcyBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcy4KLS8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAotLy8gd2FycmFudHksIGFuZCB3aXRoIG5vIGNsYWltIGFzIHRvIGl0cyBzdWl0YWJpbGl0eSBmb3IgYW55IHB1cnBvc2UuCi0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gVGhlIGF1dGhvciBncmF0ZWZ1bGx5IGFja25vd2xlZ2VzIHRoZSBzdXBwb3J0IG9mIERhdmlkIFR1cm5lciwKLS8vIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcgLSB0aGUgYXV0aG9ycyBvZiB0aGUgRnJlZVR5cGUKLS8vIGxpYnJheSAtIGluIHByb2R1Y2luZyB0aGlzIHdvcmsuIFNlZSBodHRwOi8vd3d3LmZyZWV0eXBlLm9yZyBmb3IgZGV0YWlscy4KLS8vCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvbnRhY3Q6IG1jc2VlbUBhbnRpZ3JhaW4uY29tCi0vLyAgICAgICAgICBtY3NlZW1hZ2dAeWFob28uY29tCi0vLyAgICAgICAgICBodHRwOi8vd3d3LmFudGlncmFpbi5jb20KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEFkYXB0YXRpb24gZm9yIDMyLWJpdCBzY3JlZW4gY29vcmRpbmF0ZXMgaGFzIGJlZW4gc3BvbnNvcmVkIGJ5Ci0vLyBMaWJlcnR5IFRlY2hub2xvZ3kgU3lzdGVtcywgSW5jLiwgdmlzaXQgaHR0cDovL2xpYi1zeXMuY29tCi0vLwotLy8gTGliZXJ0eSBUZWNobm9sb2d5IFN5c3RlbXMsIEluYy4gaXMgdGhlIHByb3ZpZGVyIG9mCi0vLyBQb3N0U2NyaXB0IGFuZCBQREYgdGVjaG5vbG9neSBmb3Igc29mdHdhcmUgZGV2ZWxvcGVycy4KLS8vCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZm5kZWYgQUdHX1JBU1RFUklaRVJfU0NBTkxJTkVfQUFfSU5DTFVERUQKLSNkZWZpbmUgQUdHX1JBU1RFUklaRVJfU0NBTkxJTkVfQUFfSU5DTFVERUQKLSNpbmNsdWRlICIuLi8uLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKLSNpbmNsdWRlICJhZ2dfYmFzaWNzLmgiCi0jaW5jbHVkZSAiYWdnX21hdGguaCIKLSNpbmNsdWRlICJhZ2dfYXJyYXkuaCIKLSNpbmNsdWRlICJhZ2dfY2xpcF9saWFuZ19iYXJza3kuaCIKLSNpbmNsdWRlICJhZ2dfcmVuZGVyX3NjYW5saW5lcy5oIgotbmFtZXNwYWNlIGFnZwotewotZW51bSBwb2x5X2Jhc2Vfc2NhbGVfZSB7Ci0gICAgcG9seV9iYXNlX3NoaWZ0ID0gOCwKLSAgICBwb2x5X2Jhc2Vfc2l6ZSAgPSAxIDw8IHBvbHlfYmFzZV9zaGlmdCwKLSAgICBwb2x5X2Jhc2VfbWFzayAgPSBwb2x5X2Jhc2Vfc2l6ZSAtIDEKLX07Ci1pbmxpbmUgaW50IHBvbHlfY29vcmQoRlhfRkxPQVQgYykKLXsKLSAgICByZXR1cm4gaW50KGMgKiBwb2x5X2Jhc2Vfc2l6ZSk7Ci19Ci1zdHJ1Y3QgY2VsbF9hYSAgewotICAgIGludCB4OwotICAgIGludCB5OwotICAgIGludCBjb3ZlcjsKLSAgICBpbnQgYXJlYTsKLSAgICB2b2lkIHNldChpbnQgeCwgaW50IHksIGludCBjLCBpbnQgYSk7Ci0gICAgdm9pZCBzZXRfY29vcmQoaW50IHgsIGludCB5KTsKLSAgICB2b2lkIHNldF9jb3ZlcihpbnQgYywgaW50IGEpOwotICAgIHZvaWQgYWRkX2NvdmVyKGludCBjLCBpbnQgYSk7Ci19OwotY2xhc3Mgb3V0bGluZV9hYSAKLXsKLSAgICBlbnVtIGNlbGxfYmxvY2tfc2NhbGVfZSB7Ci0gICAgICAgIGNlbGxfYmxvY2tfc2hpZnQgPSAxMiwKLSAgICAgICAgY2VsbF9ibG9ja19zaXplICA9IDEgPDwgY2VsbF9ibG9ja19zaGlmdCwKLSAgICAgICAgY2VsbF9ibG9ja19tYXNrICA9IGNlbGxfYmxvY2tfc2l6ZSAtIDEsCi0gICAgICAgIGNlbGxfYmxvY2tfcG9vbCAgPSAyNTYsCi0gICAgICAgIGNlbGxfYmxvY2tfbGltaXQgPSAxMDI0Ci0gICAgfTsKLSAgICBzdHJ1Y3Qgc29ydGVkX3kgIHsKLSAgICAgICAgdW5zaWduZWQgc3RhcnQ7Ci0gICAgICAgIHVuc2lnbmVkIG51bTsKLSAgICB9OwotcHVibGljOgotICAgIH5vdXRsaW5lX2FhKCk7Ci0gICAgb3V0bGluZV9hYSgpOwotICAgIHZvaWQgcmVzZXQoKTsKLSAgICB2b2lkIG1vdmVfdG8oaW50IHgsIGludCB5KTsKLSAgICB2b2lkIGxpbmVfdG8oaW50IHgsIGludCB5KTsKLSAgICBpbnQgbWluX3goKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbWluX3g7Ci0gICAgfQotICAgIGludCBtaW5feSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9taW5feTsKLSAgICB9Ci0gICAgaW50IG1heF94KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX21heF94OwotICAgIH0KLSAgICBpbnQgbWF4X3koKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbWF4X3k7Ci0gICAgfQotICAgIHZvaWQgc29ydF9jZWxscygpOwotICAgIHVuc2lnbmVkIHRvdGFsX2NlbGxzKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX251bV9jZWxsczsKLSAgICB9Ci0gICAgdW5zaWduZWQgc2NhbmxpbmVfbnVtX2NlbGxzKHVuc2lnbmVkIHkpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9zb3J0ZWRfeVt5IC0gbV9taW5feV0ubnVtOwotICAgIH0KLSAgICBjb25zdCBjZWxsX2FhKiBjb25zdCogc2NhbmxpbmVfY2VsbHModW5zaWduZWQgeSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3NvcnRlZF9jZWxscy5kYXRhKCkgKyBtX3NvcnRlZF95W3kgLSBtX21pbl95XS5zdGFydDsKLSAgICB9Ci0gICAgYm9vbCBzb3J0ZWQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fc29ydGVkOwotICAgIH0KLXByaXZhdGU6Ci0gICAgb3V0bGluZV9hYShjb25zdCBvdXRsaW5lX2FhJik7Ci0gICAgY29uc3Qgb3V0bGluZV9hYSYgb3BlcmF0b3IgPSAoY29uc3Qgb3V0bGluZV9hYSYpOwotICAgIHZvaWQgc2V0X2N1cl9jZWxsKGludCB4LCBpbnQgeSk7Ci0gICAgdm9pZCBhZGRfY3VyX2NlbGwoKTsKLSAgICB2b2lkIHJlbmRlcl9obGluZShpbnQgZXksIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5Mik7Ci0gICAgdm9pZCByZW5kZXJfbGluZShpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpOwotICAgIHZvaWQgYWxsb2NhdGVfYmxvY2soKTsKLXByaXZhdGU6Ci0gICAgdW5zaWduZWQgIG1fbnVtX2Jsb2NrczsKLSAgICB1bnNpZ25lZCAgbV9tYXhfYmxvY2tzOwotICAgIHVuc2lnbmVkICBtX2N1cl9ibG9jazsKLSAgICB1bnNpZ25lZCAgbV9udW1fY2VsbHM7Ci0gICAgY2VsbF9hYSoqIG1fY2VsbHM7Ci0gICAgY2VsbF9hYSogIG1fY3VyX2NlbGxfcHRyOwotICAgIHBvZF9hcnJheTxjZWxsX2FhKj4gbV9zb3J0ZWRfY2VsbHM7Ci0gICAgcG9kX2FycmF5PHNvcnRlZF95PiBtX3NvcnRlZF95OwotICAgIGNlbGxfYWEgICBtX2N1cl9jZWxsOwotICAgIGludCAgICAgICBtX2N1cl94OwotICAgIGludCAgICAgICBtX2N1cl95OwotICAgIGludCAgICAgICBtX21pbl94OwotICAgIGludCAgICAgICBtX21pbl95OwotICAgIGludCAgICAgICBtX21heF94OwotICAgIGludCAgICAgICBtX21heF95OwotICAgIGJvb2wgICAgICBtX3NvcnRlZDsKLX07Ci1jbGFzcyBzY2FubGluZV9oaXRfdGVzdCAKLXsKLXB1YmxpYzoKLSAgICBzY2FubGluZV9oaXRfdGVzdChpbnQgeCkgOiBtX3goeCksIG1faGl0KGZhbHNlKSB7fQotICAgIHZvaWQgcmVzZXRfc3BhbnMoKSB7fQotICAgIHZvaWQgZmluYWxpemUoaW50KSB7fQotICAgIHZvaWQgYWRkX2NlbGwoaW50IHgsIGludCkKLSAgICB7Ci0gICAgICAgIGlmKG1feCA9PSB4KSB7Ci0gICAgICAgICAgICBtX2hpdCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdm9pZCBhZGRfc3BhbihpbnQgeCwgaW50IGxlbiwgaW50KQotICAgIHsKLSAgICAgICAgaWYobV94ID49IHggJiYgbV94IDwgeCArIGxlbikgewotICAgICAgICAgICAgbV9oaXQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHVuc2lnbmVkIG51bV9zcGFucygpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgYm9vbCBoaXQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1faGl0OwotICAgIH0KLXByaXZhdGU6Ci0gICAgaW50ICBtX3g7Ci0gICAgYm9vbCBtX2hpdDsKLX07Ci1lbnVtIGZpbGxpbmdfcnVsZV9lIHsKLSAgICBmaWxsX25vbl96ZXJvLAotICAgIGZpbGxfZXZlbl9vZGQKLX07Ci1jbGFzcyByYXN0ZXJpemVyX3NjYW5saW5lX2FhIAotewotICAgIGVudW0gc3RhdHVzIHsKLSAgICAgICAgc3RhdHVzX2luaXRpYWwsCi0gICAgICAgIHN0YXR1c19saW5lX3RvLAotICAgICAgICBzdGF0dXNfY2xvc2VkCi0gICAgfTsKLXB1YmxpYzoKLSAgICBlbnVtIGFhX3NjYWxlX2UgewotICAgICAgICBhYV9udW0gICA9IDEgPDwgOCwKLSAgICAgICAgYWFfbWFzayAgPSBhYV9udW0gLSAxLAotICAgICAgICBhYV8ybnVtICA9IGFhX251bSAqIDIsCi0gICAgICAgIGFhXzJtYXNrID0gYWFfMm51bSAtIDEKLSAgICB9OwotICAgIHJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEoKSA6Ci0gICAgICAgIG1fZmlsbGluZ19ydWxlKGZpbGxfbm9uX3plcm8pLAotICAgICAgICBtX2NsaXBwZWRfc3RhcnRfeCgwKSwKLSAgICAgICAgbV9jbGlwcGVkX3N0YXJ0X3koMCksCi0gICAgICAgIG1fc3RhdHVzKHN0YXR1c19pbml0aWFsKSwKLSAgICAgICAgbV9jbGlwcGluZyhmYWxzZSkKLSAgICB7Ci0gICAgfQotICAgIH5yYXN0ZXJpemVyX3NjYW5saW5lX2FhKCkge30KLSAgICB2b2lkIGZpbGxpbmdfcnVsZShmaWxsaW5nX3J1bGVfZSBmaWxsaW5nX3J1bGUpCi0gICAgewotICAgICAgICBtX2ZpbGxpbmdfcnVsZSA9IGZpbGxpbmdfcnVsZTsKLSAgICB9Ci0gICAgaW50IG1pbl94KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX291dGxpbmUubWluX3goKTsKLSAgICB9Ci0gICAgaW50IG1pbl95KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX291dGxpbmUubWluX3koKTsKLSAgICB9Ci0gICAgaW50IG1heF94KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX291dGxpbmUubWF4X3goKTsKLSAgICB9Ci0gICAgaW50IG1heF95KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX291dGxpbmUubWF4X3koKTsKLSAgICB9Ci0gICAgdm9pZCByZXNldCgpCi0gICAgewotICAgICAgICBtX291dGxpbmUucmVzZXQoKTsKLSAgICAgICAgbV9zdGF0dXMgPSBzdGF0dXNfaW5pdGlhbDsKLSAgICB9Ci0gICAgdm9pZCBjbGlwX2JveChGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MikKLSAgICB7Ci0gICAgICAgIG1fY2xpcF9ib3ggPSByZWN0KHBvbHlfY29vcmQoeDEpLCBwb2x5X2Nvb3JkKHkxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcG9seV9jb29yZCh4MiksIHBvbHlfY29vcmQoeTIpKTsKLSAgICAgICAgbV9jbGlwX2JveC5ub3JtYWxpemUoKTsKLSAgICAgICAgbV9jbGlwcGluZyA9IHRydWU7Ci0gICAgfQotICAgIHZvaWQgYWRkX3ZlcnRleChGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCB1bnNpZ25lZCBjbWQpCi0gICAgewotICAgICAgICBpZihpc19jbG9zZShjbWQpKSB7Ci0gICAgICAgICAgICBjbG9zZV9wb2x5Z29uKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZihpc19tb3ZlX3RvKGNtZCkpIHsKLSAgICAgICAgICAgICAgICBtb3ZlX3RvKHBvbHlfY29vcmQoeCksIHBvbHlfY29vcmQoeSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZihpc192ZXJ0ZXgoY21kKSkgewotICAgICAgICAgICAgICAgICAgICBsaW5lX3RvKHBvbHlfY29vcmQoeCksIHBvbHlfY29vcmQoeSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICB2b2lkIG1vdmVfdG8oaW50IHgsIGludCB5KQotICAgIHsKLSAgICAgICAgaWYobV9jbGlwcGluZykgewotICAgICAgICAgICAgaWYobV9vdXRsaW5lLnNvcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmVzZXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKG1fc3RhdHVzID09IHN0YXR1c19saW5lX3RvKSB7Ci0gICAgICAgICAgICAgICAgY2xvc2VfcG9seWdvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9wcmV2X3ggPSBtX3N0YXJ0X3ggPSB4OwotICAgICAgICAgICAgbV9wcmV2X3kgPSBtX3N0YXJ0X3kgPSB5OwotICAgICAgICAgICAgbV9zdGF0dXMgPSBzdGF0dXNfaW5pdGlhbDsKLSAgICAgICAgICAgIG1fcHJldl9mbGFncyA9IGNsaXBwaW5nX2ZsYWdzKHgsIHksIG1fY2xpcF9ib3gpOwotICAgICAgICAgICAgaWYobV9wcmV2X2ZsYWdzID09IDApIHsKLSAgICAgICAgICAgICAgICBtb3ZlX3RvX25vX2NsaXAoeCwgeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtb3ZlX3RvX25vX2NsaXAoeCwgeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdm9pZCBsaW5lX3RvKGludCB4LCBpbnQgeSkKLSAgICB7Ci0gICAgICAgIGlmKG1fY2xpcHBpbmcpIHsKLSAgICAgICAgICAgIGNsaXBfc2VnbWVudCh4LCB5KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxpbmVfdG9fbm9fY2xpcCh4LCB5KTsKLSAgICAgICAgfQotICAgIH0KLSAgICB2b2lkIGNsb3NlX3BvbHlnb24oKQotICAgIHsKLSAgICAgICAgaWYgKG1fc3RhdHVzICE9IHN0YXR1c19saW5lX3RvKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYobV9jbGlwcGluZykgewotICAgICAgICAgICAgY2xpcF9zZWdtZW50KG1fc3RhcnRfeCwgbV9zdGFydF95KTsKLSAgICAgICAgfQotICAgICAgICBjbG9zZV9wb2x5Z29uX25vX2NsaXAoKTsKLSAgICB9Ci0gICAgQUdHX0lOTElORSB1bnNpZ25lZCBjYWxjdWxhdGVfYWxwaGEoaW50IGFyZWEsIGJvb2wgbm9fc21vb3RoKSBjb25zdAotICAgIHsKLSAgICAgICAgaW50IGNvdmVyID0gYXJlYSA+PiAocG9seV9iYXNlX3NoaWZ0ICogMiArIDEgLSA4KTsKLSAgICAgICAgaWYoY292ZXIgPCAwKSB7Ci0gICAgICAgICAgICBjb3ZlciA9IC1jb3ZlcjsKLSAgICAgICAgfQotICAgICAgICBpZihtX2ZpbGxpbmdfcnVsZSA9PSBmaWxsX2V2ZW5fb2RkKSB7Ci0gICAgICAgICAgICBjb3ZlciAmPSBhYV8ybWFzazsKLSAgICAgICAgICAgIGlmKGNvdmVyID4gYWFfbnVtKSB7Ci0gICAgICAgICAgICAgICAgY292ZXIgPSBhYV8ybnVtIC0gY292ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5vX3Ntb290aCkgewotICAgICAgICAgICAgY292ZXIgPSBjb3ZlciA+IGFhX21hc2sgLyAyID8gYWFfbWFzayA6IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoY292ZXIgPiBhYV9tYXNrKSB7Ci0gICAgICAgICAgICBjb3ZlciA9IGFhX21hc2s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvdmVyOwotICAgIH0KLSAgICBBR0dfSU5MSU5FIHZvaWQgc29ydCgpCi0gICAgewotICAgICAgICBtX291dGxpbmUuc29ydF9jZWxscygpOwotICAgIH0KLSAgICBBR0dfSU5MSU5FIGJvb2wgcmV3aW5kX3NjYW5saW5lcygpCi0gICAgewotICAgICAgICBjbG9zZV9wb2x5Z29uKCk7Ci0gICAgICAgIG1fb3V0bGluZS5zb3J0X2NlbGxzKCk7Ci0gICAgICAgIGlmKG1fb3V0bGluZS50b3RhbF9jZWxscygpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtX2N1cl95ID0gbV9vdXRsaW5lLm1pbl95KCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBBR0dfSU5MSU5FIGJvb2wgbmF2aWdhdGVfc2NhbmxpbmUoaW50IHkpCi0gICAgewotICAgICAgICBjbG9zZV9wb2x5Z29uKCk7Ci0gICAgICAgIG1fb3V0bGluZS5zb3J0X2NlbGxzKCk7Ci0gICAgICAgIGlmKG1fb3V0bGluZS50b3RhbF9jZWxscygpID09IDAgfHwKLSAgICAgICAgICAgICAgICB5IDwgbV9vdXRsaW5lLm1pbl95KCkgfHwKLSAgICAgICAgICAgICAgICB5ID4gbV9vdXRsaW5lLm1heF95KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtX2N1cl95ID0geTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHRlbXBsYXRlPGNsYXNzIFNjYW5saW5lPiBib29sIHN3ZWVwX3NjYW5saW5lKFNjYW5saW5lJiBzbCwgYm9vbCBub19zbW9vdGgpCi0gICAgewotICAgICAgICBmb3IoOzspIHsKLSAgICAgICAgICAgIGlmKG1fY3VyX3kgPiBtX291dGxpbmUubWF4X3koKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNsLnJlc2V0X3NwYW5zKCk7Ci0gICAgICAgICAgICB1bnNpZ25lZCBudW1fY2VsbHMgPSBtX291dGxpbmUuc2NhbmxpbmVfbnVtX2NlbGxzKG1fY3VyX3kpOwotICAgICAgICAgICAgY29uc3QgY2VsbF9hYSogY29uc3QqIGNlbGxzID0gbV9vdXRsaW5lLnNjYW5saW5lX2NlbGxzKG1fY3VyX3kpOwotICAgICAgICAgICAgaW50IGNvdmVyID0gMDsKLSAgICAgICAgICAgIHdoaWxlKG51bV9jZWxscykgewotICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxfYWEqIGN1cl9jZWxsID0gKmNlbGxzOwotICAgICAgICAgICAgICAgIGludCB4ICAgID0gY3VyX2NlbGwtPng7Ci0gICAgICAgICAgICAgICAgaW50IGFyZWEgPSBjdXJfY2VsbC0+YXJlYTsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBhbHBoYTsKLSAgICAgICAgICAgICAgICBjb3ZlciArPSBjdXJfY2VsbC0+Y292ZXI7Ci0gICAgICAgICAgICAgICAgd2hpbGUoLS1udW1fY2VsbHMpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VyX2NlbGwgPSAqKytjZWxsczsKLSAgICAgICAgICAgICAgICAgICAgaWYoY3VyX2NlbGwtPnggIT0geCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYXJlYSAgKz0gY3VyX2NlbGwtPmFyZWE7Ci0gICAgICAgICAgICAgICAgICAgIGNvdmVyICs9IGN1cl9jZWxsLT5jb3ZlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoYXJlYSkgewotICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IGNhbGN1bGF0ZV9hbHBoYSgoY292ZXIgPDwgKHBvbHlfYmFzZV9zaGlmdCArIDEpKSAtIGFyZWEsIG5vX3Ntb290aCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGFscGhhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzbC5hZGRfY2VsbCh4LCBhbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgeCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihudW1fY2VsbHMgJiYgY3VyX2NlbGwtPnggPiB4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhID0gY2FsY3VsYXRlX2FscGhhKGNvdmVyIDw8IChwb2x5X2Jhc2Vfc2hpZnQgKyAxKSwgbm9fc21vb3RoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoYWxwaGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNsLmFkZF9zcGFuKHgsIGN1cl9jZWxsLT54IC0geCwgYWxwaGEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoc2wubnVtX3NwYW5zKCkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICsrbV9jdXJfeTsKLSAgICAgICAgfQotICAgICAgICBzbC5maW5hbGl6ZShtX2N1cl95KTsKLSAgICAgICAgKyttX2N1cl95OwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgdGVtcGxhdGU8Y2xhc3MgVmVydGV4U291cmNlPgotICAgIHZvaWQgYWRkX3BhdGgoVmVydGV4U291cmNlJiB2cywgdW5zaWduZWQgcGF0aF9pZCA9IDApCi0gICAgewotICAgICAgICBGWF9GTE9BVCB4OwotICAgICAgICBGWF9GTE9BVCB5OwotICAgICAgICB1bnNpZ25lZCBjbWQ7Ci0gICAgICAgIHZzLnJld2luZChwYXRoX2lkKTsKLSAgICAgICAgd2hpbGUoIWlzX3N0b3AoY21kID0gdnMudmVydGV4KCZ4LCAmeSkpKSB7Ci0gICAgICAgICAgICBhZGRfdmVydGV4KHgsIHksIGNtZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdGVtcGxhdGU8Y2xhc3MgVmVydGV4U291cmNlPgotICAgIHZvaWQgYWRkX3BhdGhfdHJhbnNmb3JtZWQoVmVydGV4U291cmNlJiB2cywgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgdW5zaWduZWQgcGF0aF9pZCA9IDApCi0gICAgewotICAgICAgICBGWF9GTE9BVCB4OwotICAgICAgICBGWF9GTE9BVCB5OwotICAgICAgICB1bnNpZ25lZCBjbWQ7Ci0gICAgICAgIHZzLnJld2luZChwYXRoX2lkKTsKLSAgICAgICAgd2hpbGUoIWlzX3N0b3AoY21kID0gdnMudmVydGV4KCZ4LCAmeSkpKSB7Ci0gICAgICAgICAgICBpZiAocE1hdHJpeCkgewotICAgICAgICAgICAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybSh4LCB5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZF92ZXJ0ZXgoeCwgeSwgY21kKTsKLSAgICAgICAgfQotICAgIH0KLXByaXZhdGU6Ci0gICAgcmFzdGVyaXplcl9zY2FubGluZV9hYShjb25zdCByYXN0ZXJpemVyX3NjYW5saW5lX2FhJik7Ci0gICAgY29uc3QgcmFzdGVyaXplcl9zY2FubGluZV9hYSYKLSAgICBvcGVyYXRvciA9IChjb25zdCByYXN0ZXJpemVyX3NjYW5saW5lX2FhJik7Ci0gICAgdm9pZCBtb3ZlX3RvX25vX2NsaXAoaW50IHgsIGludCB5KQotICAgIHsKLSAgICAgICAgaWYobV9zdGF0dXMgPT0gc3RhdHVzX2xpbmVfdG8pIHsKLSAgICAgICAgICAgIGNsb3NlX3BvbHlnb25fbm9fY2xpcCgpOwotICAgICAgICB9Ci0gICAgICAgIG1fb3V0bGluZS5tb3ZlX3RvKHggKiAxLCB5KTsKLSAgICAgICAgbV9jbGlwcGVkX3N0YXJ0X3ggPSB4OwotICAgICAgICBtX2NsaXBwZWRfc3RhcnRfeSA9IHk7Ci0gICAgICAgIG1fc3RhdHVzID0gc3RhdHVzX2xpbmVfdG87Ci0gICAgfQotICAgIHZvaWQgbGluZV90b19ub19jbGlwKGludCB4LCBpbnQgeSkKLSAgICB7Ci0gICAgICAgIGlmKG1fc3RhdHVzICE9IHN0YXR1c19pbml0aWFsKSB7Ci0gICAgICAgICAgICBtX291dGxpbmUubGluZV90byh4ICogMSwgeSk7Ci0gICAgICAgICAgICBtX3N0YXR1cyA9IHN0YXR1c19saW5lX3RvOwotICAgICAgICB9Ci0gICAgfQotICAgIHZvaWQgY2xvc2VfcG9seWdvbl9ub19jbGlwKCkKLSAgICB7Ci0gICAgICAgIGlmKG1fc3RhdHVzID09IHN0YXR1c19saW5lX3RvKSB7Ci0gICAgICAgICAgICBtX291dGxpbmUubGluZV90byhtX2NsaXBwZWRfc3RhcnRfeCAqIDEsIG1fY2xpcHBlZF9zdGFydF95KTsKLSAgICAgICAgICAgIG1fc3RhdHVzID0gc3RhdHVzX2Nsb3NlZDsKLSAgICAgICAgfQotICAgIH0KLSAgICB2b2lkIGNsaXBfc2VnbWVudChpbnQgeCwgaW50IHkpCi0gICAgewotICAgICAgICB1bnNpZ25lZCBmbGFncyA9IGNsaXBwaW5nX2ZsYWdzKHgsIHksIG1fY2xpcF9ib3gpOwotICAgICAgICBpZihtX3ByZXZfZmxhZ3MgPT0gZmxhZ3MpIHsKLSAgICAgICAgICAgIGlmKGZsYWdzID09IDApIHsKLSAgICAgICAgICAgICAgICBpZihtX3N0YXR1cyA9PSBzdGF0dXNfaW5pdGlhbCkgewotICAgICAgICAgICAgICAgICAgICBtb3ZlX3RvX25vX2NsaXAoeCwgeSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZV90b19ub19jbGlwKHgsIHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBjeFs0XTsKLSAgICAgICAgICAgIGludCBjeVs0XTsKLSAgICAgICAgICAgIHVuc2lnbmVkIG4gPSBjbGlwX2xpYW5nX2JhcnNreShtX3ByZXZfeCwgbV9wcmV2X3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NsaXBfYm94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN4LCBjeSk7Ci0gICAgICAgICAgICBjb25zdCBpbnQqIHB4ID0gY3g7Ci0gICAgICAgICAgICBjb25zdCBpbnQqIHB5ID0gY3k7Ci0gICAgICAgICAgICB3aGlsZShuLS0pIHsKLSAgICAgICAgICAgICAgICBpZihtX3N0YXR1cyA9PSBzdGF0dXNfaW5pdGlhbCkgewotICAgICAgICAgICAgICAgICAgICBtb3ZlX3RvX25vX2NsaXAoKnB4KyssICpweSsrKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsaW5lX3RvX25vX2NsaXAoKnB4KyssICpweSsrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9wcmV2X2ZsYWdzID0gZmxhZ3M7Ci0gICAgICAgIG1fcHJldl94ID0geDsKLSAgICAgICAgbV9wcmV2X3kgPSB5OwotICAgIH0KLXByaXZhdGU6Ci0gICAgb3V0bGluZV9hYSAgICAgbV9vdXRsaW5lOwotICAgIGZpbGxpbmdfcnVsZV9lIG1fZmlsbGluZ19ydWxlOwotICAgIGludCAgICAgICAgICAgIG1fY2xpcHBlZF9zdGFydF94OwotICAgIGludCAgICAgICAgICAgIG1fY2xpcHBlZF9zdGFydF95OwotICAgIGludCAgICAgICAgICAgIG1fc3RhcnRfeDsKLSAgICBpbnQgICAgICAgICAgICBtX3N0YXJ0X3k7Ci0gICAgaW50ICAgICAgICAgICAgbV9wcmV2X3g7Ci0gICAgaW50ICAgICAgICAgICAgbV9wcmV2X3k7Ci0gICAgdW5zaWduZWQgICAgICAgbV9wcmV2X2ZsYWdzOwotICAgIHVuc2lnbmVkICAgICAgIG1fc3RhdHVzOwotICAgIHJlY3QgICAgICAgICAgIG1fY2xpcF9ib3g7Ci0gICAgYm9vbCAgICAgICAgICAgbV9jbGlwcGluZzsKLSAgICBpbnQgICAgICAgICAgICBtX2N1cl95OwotfTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvYWdnX3NjYW5saW5lX3UuaCBiL2NvcmUvc3JjL2Z4Z2UvYWdnL2FnZzIzL2FnZ19zY2FubGluZV91LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMTMyOTAuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvYWdnX3NjYW5saW5lX3UuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQW50aS1HcmFpbiBHZW9tZXRyeSAtIFZlcnNpb24gMi4zCi0vLyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBNYXhpbSBTaGVtYW5hcmV2IChodHRwOi8vd3d3LmFudGlncmFpbi5jb20pCi0vLwotLy8gUGVybWlzc2lvbiB0byBjb3B5LCB1c2UsIG1vZGlmeSwgc2VsbCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCi0vLyBpcyBncmFudGVkIHByb3ZpZGVkIHRoaXMgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMuCi0vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKLS8vIHdhcnJhbnR5LCBhbmQgd2l0aCBubyBjbGFpbSBhcyB0byBpdHMgc3VpdGFiaWxpdHkgZm9yIGFueSBwdXJwb3NlLgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29udGFjdDogbWNzZWVtQGFudGlncmFpbi5jb20KLS8vICAgICAgICAgIG1jc2VlbWFnZ0B5YWhvby5jb20KLS8vICAgICAgICAgIGh0dHA6Ly93d3cuYW50aWdyYWluLmNvbQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gQWRhcHRhdGlvbiBmb3IgMzItYml0IHNjcmVlbiBjb29yZGluYXRlcyAoc2NhbmxpbmUzMl91KSBoYXMgYmVlbiBzcG9uc29yZWQgYnkKLS8vIExpYmVydHkgVGVjaG5vbG9neSBTeXN0ZW1zLCBJbmMuLCB2aXNpdCBodHRwOi8vbGliLXN5cy5jb20KLS8vCi0vLyBMaWJlcnR5IFRlY2hub2xvZ3kgU3lzdGVtcywgSW5jLiBpcyB0aGUgcHJvdmlkZXIgb2YKLS8vIFBvc3RTY3JpcHQgYW5kIFBERiB0ZWNobm9sb2d5IGZvciBzb2Z0d2FyZSBkZXZlbG9wZXJzLgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2lmbmRlZiBBR0dfU0NBTkxJTkVfVV9JTkNMVURFRAotI2RlZmluZSBBR0dfU0NBTkxJTkVfVV9JTkNMVURFRAotI2luY2x1ZGUgImFnZ19hcnJheS5oIgotbmFtZXNwYWNlIGFnZwotewotdGVtcGxhdGU8Y2xhc3MgQ292ZXJUPiBjbGFzcyBzY2FubGluZV91IAotewotcHVibGljOgotICAgIHR5cGVkZWYgc2NhbmxpbmVfdTxDb3ZlclQ+IHNlbGZfdHlwZTsKLSAgICB0eXBlZGVmIENvdmVyVCBjb3Zlcl90eXBlOwotICAgIHR5cGVkZWYgaW50MTYgIGNvb3JkX3R5cGU7Ci0gICAgc3RydWN0IHNwYW4gIHsKLSAgICAgICAgY29vcmRfdHlwZSAgeDsKLSAgICAgICAgY29vcmRfdHlwZSAgbGVuOwotICAgICAgICBjb3Zlcl90eXBlKiBjb3ZlcnM7Ci0gICAgfTsKLSAgICB0eXBlZGVmIHNwYW4qIGl0ZXJhdG9yOwotICAgIHR5cGVkZWYgY29uc3Qgc3BhbiogY29uc3RfaXRlcmF0b3I7Ci0gICAgfnNjYW5saW5lX3UoKQotICAgIHsKLSAgICAgICAgRlhfRnJlZShtX3NwYW5zKTsKLSAgICAgICAgRlhfRnJlZShtX2NvdmVycyk7Ci0gICAgfQotICAgIHNjYW5saW5lX3UoKSA6Ci0gICAgICAgIG1fbWluX3goMCksCi0gICAgICAgIG1fbWF4X2xlbigwKSwKLSAgICAgICAgbV9sYXN0X3goMHg3RkZGRkZGMCksCi0gICAgICAgIG1fY292ZXJzKDApLAotICAgICAgICBtX3NwYW5zKDApLAotICAgICAgICBtX2N1cl9zcGFuKDApCi0gICAge30KLSAgICB2b2lkIHJlc2V0KGludCBtaW5feCwgaW50IG1heF94KQotICAgIHsKLSAgICAgICAgdW5zaWduZWQgbWF4X2xlbiA9IG1heF94IC0gbWluX3ggKyAyOwotICAgICAgICBpZihtYXhfbGVuID4gbV9tYXhfbGVuKSB7Ci0gICAgICAgICAgICBGWF9GcmVlKG1fc3BhbnMpOwotICAgICAgICAgICAgRlhfRnJlZShtX2NvdmVycyk7Ci0gICAgICAgICAgICBtX2NvdmVycyAgPSBGWF9BbGxvYyggY292ZXJfdHlwZSAsIG1heF9sZW4pOwotICAgICAgICAgICAgbV9zcGFucyAgID0gRlhfQWxsb2MoIHNwYW4gICAgICAgLCBtYXhfbGVuKTsKLSAgICAgICAgICAgIG1fbWF4X2xlbiA9IG1heF9sZW47Ci0gICAgICAgIH0KLSAgICAgICAgbV9sYXN0X3ggICAgICAgID0gMHg3RkZGRkZGMDsKLSAgICAgICAgbV9taW5feCAgICAgICAgID0gbWluX3g7Ci0gICAgICAgIG1fY3VyX3NwYW4gICAgICA9IG1fc3BhbnM7Ci0gICAgfQotICAgIHZvaWQgYWRkX2NlbGwoaW50IHgsIHVuc2lnbmVkIGNvdmVyKQotICAgIHsKLSAgICAgICAgeCAtPSBtX21pbl94OwotICAgICAgICBtX2NvdmVyc1t4XSA9IChjb3Zlcl90eXBlKWNvdmVyOwotICAgICAgICBpZih4ID09IG1fbGFzdF94ICsgMSkgewotICAgICAgICAgICAgbV9jdXJfc3Bhbi0+bGVuKys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX2N1cl9zcGFuKys7Ci0gICAgICAgICAgICBtX2N1cl9zcGFuLT54ICAgICAgPSAoY29vcmRfdHlwZSkoeCArIG1fbWluX3gpOwotICAgICAgICAgICAgbV9jdXJfc3Bhbi0+bGVuICAgID0gMTsKLSAgICAgICAgICAgIG1fY3VyX3NwYW4tPmNvdmVycyA9IG1fY292ZXJzICsgeDsKLSAgICAgICAgfQotICAgICAgICBtX2xhc3RfeCA9IHg7Ci0gICAgfQotICAgIHZvaWQgYWRkX2NlbGxzKGludCB4LCB1bnNpZ25lZCBsZW4sIGNvbnN0IENvdmVyVCogY292ZXJzKQotICAgIHsKLSAgICAgICAgeCAtPSBtX21pbl94OwotICAgICAgICBGWFNZU19tZW1jcHkobV9jb3ZlcnMgKyB4LCBjb3ZlcnMsIGxlbiAqIHNpemVvZihDb3ZlclQpKTsKLSAgICAgICAgaWYoeCA9PSBtX2xhc3RfeCArIDEpIHsKLSAgICAgICAgICAgIG1fY3VyX3NwYW4tPmxlbiArPSAoY29vcmRfdHlwZSlsZW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX2N1cl9zcGFuKys7Ci0gICAgICAgICAgICBtX2N1cl9zcGFuLT54ICAgICAgPSAoY29vcmRfdHlwZSkoeCArIG1fbWluX3gpOwotICAgICAgICAgICAgbV9jdXJfc3Bhbi0+bGVuICAgID0gKGNvb3JkX3R5cGUpbGVuOwotICAgICAgICAgICAgbV9jdXJfc3Bhbi0+Y292ZXJzID0gbV9jb3ZlcnMgKyB4OwotICAgICAgICB9Ci0gICAgICAgIG1fbGFzdF94ID0geCArIGxlbiAtIDE7Ci0gICAgfQotICAgIHZvaWQgYWRkX3NwYW4oaW50IHgsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgY292ZXIpCi0gICAgewotICAgICAgICB4IC09IG1fbWluX3g7Ci0gICAgICAgIEZYU1lTX21lbXNldDgobV9jb3ZlcnMgKyB4LCBjb3ZlciwgbGVuKTsKLSAgICAgICAgaWYoeCA9PSBtX2xhc3RfeCArIDEpIHsKLSAgICAgICAgICAgIG1fY3VyX3NwYW4tPmxlbiArPSAoY29vcmRfdHlwZSlsZW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX2N1cl9zcGFuKys7Ci0gICAgICAgICAgICBtX2N1cl9zcGFuLT54ICAgICAgPSAoY29vcmRfdHlwZSkoeCArIG1fbWluX3gpOwotICAgICAgICAgICAgbV9jdXJfc3Bhbi0+bGVuICAgID0gKGNvb3JkX3R5cGUpbGVuOwotICAgICAgICAgICAgbV9jdXJfc3Bhbi0+Y292ZXJzID0gbV9jb3ZlcnMgKyB4OwotICAgICAgICB9Ci0gICAgICAgIG1fbGFzdF94ID0geCArIGxlbiAtIDE7Ci0gICAgfQotICAgIHZvaWQgZmluYWxpemUoaW50IHkpCi0gICAgewotICAgICAgICBtX3kgPSB5OwotICAgIH0KLSAgICB2b2lkIHJlc2V0X3NwYW5zKCkKLSAgICB7Ci0gICAgICAgIG1fbGFzdF94ICAgID0gMHg3RkZGRkZGMDsKLSAgICAgICAgbV9jdXJfc3BhbiAgPSBtX3NwYW5zOwotICAgIH0KLSAgICBpbnQgICAgICB5KCkgICAgICAgICAgIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV95OwotICAgIH0KLSAgICB1bnNpZ25lZCBudW1fc3BhbnMoKSAgIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gdW5zaWduZWQobV9jdXJfc3BhbiAtIG1fc3BhbnMpOwotICAgIH0KLSAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9zcGFucyArIDE7Ci0gICAgfQotICAgIGl0ZXJhdG9yICAgICAgIGJlZ2luKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3NwYW5zICsgMTsKLSAgICB9Ci1wcml2YXRlOgotICAgIHNjYW5saW5lX3UoY29uc3Qgc2VsZl90eXBlJik7Ci0gICAgY29uc3Qgc2VsZl90eXBlJiBvcGVyYXRvciA9IChjb25zdCBzZWxmX3R5cGUmKTsKLXByaXZhdGU6Ci0gICAgaW50ICAgICAgICAgICBtX21pbl94OwotICAgIHVuc2lnbmVkICAgICAgbV9tYXhfbGVuOwotICAgIGludCAgICAgICAgICAgbV9sYXN0X3g7Ci0gICAgaW50ICAgICAgICAgICBtX3k7Ci0gICAgY292ZXJfdHlwZSogICBtX2NvdmVyczsKLSAgICBzcGFuKiAgICAgICAgIG1fc3BhbnM7Ci0gICAgc3BhbiogICAgICAgICBtX2N1cl9zcGFuOwotfTsKLXR5cGVkZWYgc2NhbmxpbmVfdTxpbnQ4dT4gc2NhbmxpbmVfdTg7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYWdnL2FnZzIzL2Z4X2FnZ19jdXJ2ZXMuY3BwIGIvY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvZnhfYWdnX2N1cnZlcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MTMyMGUuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvZnhfYWdnX2N1cnZlcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFhZUTogMjAwNi0wMS0yMiBDb3BpZWQgZnJvbSBBR0cgcHJvamVjdC4KLS8vIFRPRE86IFRoaXMgZmlsZSB1c2VzIGludGVuc2l2ZSBmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zLCBzbyBpdCdzIE5PVCBzdWl0YWJsZQotLy8gZm9yIHBsYXRmb3JtcyBsaWtlIFN5bWJpYW4gT1MuIFdlIG5lZWQgdG8gY2hhbmdlIHRvIEZJWCBmb3JtYXQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQW50aS1HcmFpbiBHZW9tZXRyeSAtIFZlcnNpb24gMi4zCi0vLyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBNYXhpbSBTaGVtYW5hcmV2IChodHRwOi8vd3d3LmFudGlncmFpbi5jb20pCi0vLwotLy8gUGVybWlzc2lvbiB0byBjb3B5LCB1c2UsIG1vZGlmeSwgc2VsbCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCi0vLyBpcyBncmFudGVkIHByb3ZpZGVkIHRoaXMgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMuCi0vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKLS8vIHdhcnJhbnR5LCBhbmQgd2l0aCBubyBjbGFpbSBhcyB0byBpdHMgc3VpdGFiaWxpdHkgZm9yIGFueSBwdXJwb3NlLgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29udGFjdDogbWNzZWVtQGFudGlncmFpbi5jb20KLS8vICAgICAgICAgIG1jc2VlbWFnZ0B5YWhvby5jb20KLS8vICAgICAgICAgIGh0dHA6Ly93d3cuYW50aWdyYWluLmNvbQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaW5jbHVkZSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgotI2luY2x1ZGUgImFnZ19jdXJ2ZXMuaCIKLSNpbmNsdWRlICJhZ2dfbWF0aC5oIgotbmFtZXNwYWNlIGFnZwotewotY29uc3QgRlhfRkxPQVQgY3VydmVfY29sbGluZWFyaXR5X2Vwc2lsb24gICAgICAgICAgICAgID0gMWUtMzBmOwotZW51bSBjdXJ2ZV9yZWN1cnNpb25fbGltaXRfZSB7IGN1cnZlX3JlY3Vyc2lvbl9saW1pdCA9IDE2IH07Ci12b2lkIGN1cnZlNF9kaXY6OmluaXQoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLAotICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwKLSAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MywgRlhfRkxPQVQgeTMsCi0gICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDQsIEZYX0ZMT0FUIHk0KQotewotICAgIG1fcG9pbnRzLnJlbW92ZV9hbGwoKTsKLSAgICBtX2Rpc3RhbmNlX3RvbGVyYW5jZV9zcXVhcmUgPSAxLjBmIC8gNDsKLSAgICBtX2Rpc3RhbmNlX3RvbGVyYW5jZV9tYW5oYXR0YW4gPSAxLjBmICogNDsKLSAgICBiZXppZXIoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0KTsKLSAgICBtX2NvdW50ID0gMDsKLX0KLXZvaWQgY3VydmU0X2Rpdjo6cmVjdXJzaXZlX2JlemllcihGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgzLCBGWF9GTE9BVCB5MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4NCwgRlhfRkxPQVQgeTQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGV2ZWwpCi17Ci0gICAgaWYobGV2ZWwgPiBjdXJ2ZV9yZWN1cnNpb25fbGltaXQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9GTE9BVCB4MTIgICA9ICh4MSArIHgyKSAvIDI7Ci0gICAgRlhfRkxPQVQgeTEyICAgPSAoeTEgKyB5MikgLyAyOwotICAgIEZYX0ZMT0FUIHgyMyAgID0gKHgyICsgeDMpIC8gMjsKLSAgICBGWF9GTE9BVCB5MjMgICA9ICh5MiArIHkzKSAvIDI7Ci0gICAgRlhfRkxPQVQgeDM0ICAgPSAoeDMgKyB4NCkgLyAyOwotICAgIEZYX0ZMT0FUIHkzNCAgID0gKHkzICsgeTQpIC8gMjsKLSAgICBGWF9GTE9BVCB4MTIzICA9ICh4MTIgKyB4MjMpIC8gMjsKLSAgICBGWF9GTE9BVCB5MTIzICA9ICh5MTIgKyB5MjMpIC8gMjsKLSAgICBGWF9GTE9BVCB4MjM0ICA9ICh4MjMgKyB4MzQpIC8gMjsKLSAgICBGWF9GTE9BVCB5MjM0ICA9ICh5MjMgKyB5MzQpIC8gMjsKLSAgICBGWF9GTE9BVCB4MTIzNCA9ICh4MTIzICsgeDIzNCkgLyAyOwotICAgIEZYX0ZMT0FUIHkxMjM0ID0gKHkxMjMgKyB5MjM0KSAvIDI7Ci0gICAgRlhfRkxPQVQgZHggPSB4NCAtIHgxOwotICAgIEZYX0ZMT0FUIGR5ID0geTQgLSB5MTsKLSAgICBGWF9GTE9BVCBkMiA9IEZYU1lTX2ZhYnMoRlhTWVNfTXVsKHgyIC0geDQsIGR5KSAtIEZYU1lTX011bCh5MiAtIHk0LCBkeCkpOwotICAgIEZYX0ZMT0FUIGQzID0gRlhTWVNfZmFicyhGWFNZU19NdWwoeDMgLSB4NCwgZHkpIC0gRlhTWVNfTXVsKHkzIC0geTQsIGR4KSk7Ci0gICAgc3dpdGNoKChpbnQoZDIgPiBjdXJ2ZV9jb2xsaW5lYXJpdHlfZXBzaWxvbikgPDwgMSkgKwotICAgICAgICAgICAgaW50KGQzID4gY3VydmVfY29sbGluZWFyaXR5X2Vwc2lsb24pKSB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIGlmKEZYU1lTX2ZhYnMoeDEgKyB4MyAtIHgyIC0geDIpICsKLSAgICAgICAgICAgICAgICAgICAgRlhTWVNfZmFicyh5MSArIHkzIC0geTIgLSB5MikgKwotICAgICAgICAgICAgICAgICAgICBGWFNZU19mYWJzKHgyICsgeDQgLSB4MyAtIHgzKSArCi0gICAgICAgICAgICAgICAgICAgIEZYU1lTX2ZhYnMoeTIgKyB5NCAtIHkzIC0geTMpIDw9IG1fZGlzdGFuY2VfdG9sZXJhbmNlX21hbmhhdHRhbikgewotICAgICAgICAgICAgICAgIG1fcG9pbnRzLmFkZChwb2ludF90eXBlKHgxMjM0LCB5MTIzNCwgcGF0aF9mbGFnc19qcikpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBpZihGWFNZU19NdWwoZDMsIGQzKSA8PSBGWFNZU19NdWwobV9kaXN0YW5jZV90b2xlcmFuY2Vfc3F1YXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX011bChkeCwgZHgpICsgRlhTWVNfTXVsKGR5LCBkeSkpKSB7Ci0gICAgICAgICAgICAgICAgbV9wb2ludHMuYWRkKHBvaW50X3R5cGUoeDIzLCB5MjMsIHBhdGhfZmxhZ3NfanIpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgaWYoRlhTWVNfTXVsKGQyLCBkMikgPD0gRlhTWVNfTXVsKG1fZGlzdGFuY2VfdG9sZXJhbmNlX3NxdWFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19NdWwoZHgsIGR4KSArIEZYU1lTX011bChkeSwgZHkpKSkgewotICAgICAgICAgICAgICAgIG1fcG9pbnRzLmFkZChwb2ludF90eXBlKHgyMywgeTIzLCBwYXRoX2ZsYWdzX2pyKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGlmKEZYU1lTX011bChkMiArIGQzLCBkMiArIGQzKSA8PSBGWFNZU19NdWwobV9kaXN0YW5jZV90b2xlcmFuY2Vfc3F1YXJlLAotICAgICAgICAgICAgICAgICAgICBGWFNZU19NdWwoZHgsIGR4KSArIEZYU1lTX011bChkeSwgZHkpKSkgewotICAgICAgICAgICAgICAgIG1fcG9pbnRzLmFkZChwb2ludF90eXBlKHgyMywgeTIzLCBwYXRoX2ZsYWdzX2pyKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJlY3Vyc2l2ZV9iZXppZXIoeDEsIHkxLCB4MTIsIHkxMiwgeDEyMywgeTEyMywgeDEyMzQsIHkxMjM0LCBsZXZlbCArIDEpOwotICAgIHJlY3Vyc2l2ZV9iZXppZXIoeDEyMzQsIHkxMjM0LCB4MjM0LCB5MjM0LCB4MzQsIHkzNCwgeDQsIHk0LCBsZXZlbCArIDEpOwotfQotdm9pZCBjdXJ2ZTRfZGl2OjpiZXppZXIoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLAotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLAotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDMsIEZYX0ZMT0FUIHkzLAotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDQsIEZYX0ZMT0FUIHk0KQotewotICAgIG1fcG9pbnRzLmFkZChwb2ludF90eXBlKHgxLCB5MSkpOwotICAgIHJlY3Vyc2l2ZV9iZXppZXIoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0LCAwKTsKLSAgICBtX3BvaW50cy5hZGQocG9pbnRfdHlwZSh4NCwgeTQpKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYWdnL2FnZzIzL2Z4X2FnZ19kcml2ZXIuY3BwIGIvY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvZnhfYWdnX2RyaXZlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4Zjc2YmYuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvZnhfYWdnX2RyaXZlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICIuLi8uLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKLSNpbmNsdWRlICIuLi8uLi9kaWIvZGliX2ludC5oIgotI2luY2x1ZGUgIi4uLy4uL2dlL3RleHRfaW50LmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCi0jaW5jbHVkZSAiYWdnX3BpeGZtdF9ncmF5LmgiCi0jaW5jbHVkZSAiYWdnX3BhdGhfc3RvcmFnZS5oIgotI2luY2x1ZGUgImFnZ19zY2FubGluZV91LmgiCi0jaW5jbHVkZSAiYWdnX3Jhc3Rlcml6ZXJfc2NhbmxpbmVfYWEuaCIKLSNpbmNsdWRlICJhZ2dfcmVuZGVyZXJfc2NhbmxpbmUuaCIKLSNpbmNsdWRlICJhZ2dfY3VydmVzLmgiCi0jaW5jbHVkZSAiYWdnX2NvbnZfc3Ryb2tlLmgiCi0jaW5jbHVkZSAiYWdnX2NvbnZfZGFzaC5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnhfYWdnX2RyaXZlci5oIgotdm9pZCBfSGFyZENsaXAoRlhfRkxPQVQmIHgsIEZYX0ZMT0FUJiB5KQotewotICAgIGlmICh4ID4gNTAwMDApIHsKLSAgICAgICAgeCA9IDUwMDAwOwotICAgIH0KLSAgICBpZiAoeCA8IC01MDAwMCkgewotICAgICAgICB4ID0gLTUwMDAwOwotICAgIH0KLSAgICBpZiAoeSA+IDUwMDAwKSB7Ci0gICAgICAgIHkgPSA1MDAwMDsKLSAgICB9Ci0gICAgaWYgKHkgPCAtNTAwMDApIHsKLSAgICAgICAgeSA9IC01MDAwMDsKLSAgICB9Ci19Ci12b2lkIENBZ2dfUGF0aERhdGE6OkJ1aWxkUGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UpCi17Ci0gICAgaW50IG5Qb2ludHMgPSBwUGF0aERhdGEtPkdldFBvaW50Q291bnQoKTsKLSAgICBGWF9QQVRIUE9JTlQqIHBQb2ludHMgPSBwUGF0aERhdGEtPkdldFBvaW50cygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgblBvaW50czsgaSArKykgewotICAgICAgICBGWF9GTE9BVCB4ID0gcFBvaW50c1tpXS5tX1BvaW50WCwgeSA9IHBQb2ludHNbaV0ubV9Qb2ludFk7Ci0gICAgICAgIGlmIChwT2JqZWN0MkRldmljZSkgewotICAgICAgICAgICAgcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybSh4LCB5KTsKLSAgICAgICAgfQotICAgICAgICBfSGFyZENsaXAoeCwgeSk7Ci0gICAgICAgIGludCBwb2ludF90eXBlID0gcFBvaW50c1tpXS5tX0ZsYWcgJiBGWFBUX1RZUEU7Ci0gICAgICAgIGlmIChwb2ludF90eXBlID09IEZYUFRfTU9WRVRPKSB7Ci0gICAgICAgICAgICBtX1BhdGhEYXRhLm1vdmVfdG8oeCwgeSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocG9pbnRfdHlwZSA9PSBGWFBUX0xJTkVUTykgewotICAgICAgICAgICAgaWYgKHBQb2ludHNbaSAtIDFdLm1fRmxhZyA9PSBGWFBUX01PVkVUTyAmJiAoaSA9PSBuUG9pbnRzIC0gMSB8fCBwUG9pbnRzW2kgKyAxXS5tX0ZsYWcgPT0gRlhQVF9NT1ZFVE8pICYmCi0gICAgICAgICAgICAgICAgICAgIHBQb2ludHNbaV0ubV9Qb2ludFggPT0gcFBvaW50c1tpIC0gMV0ubV9Qb2ludFggJiYgcFBvaW50c1tpXS5tX1BvaW50WSA9PSBwUG9pbnRzW2kgLSAxXS5tX1BvaW50WSkgewotICAgICAgICAgICAgICAgIHggKz0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fUGF0aERhdGEubGluZV90byh4LCB5KTsKLSAgICAgICAgfSBlbHNlIGlmIChwb2ludF90eXBlID09IEZYUFRfQkVaSUVSVE8pIHsKLSAgICAgICAgICAgIEZYX0ZMT0FUIHgwID0gcFBvaW50c1tpIC0gMV0ubV9Qb2ludFgsIHkwID0gcFBvaW50c1tpIC0gMV0ubV9Qb2ludFk7Ci0gICAgICAgICAgICBGWF9GTE9BVCB4MiA9IHBQb2ludHNbaSArIDFdLm1fUG9pbnRYLCB5MiA9IHBQb2ludHNbaSArIDFdLm1fUG9pbnRZOwotICAgICAgICAgICAgRlhfRkxPQVQgeDMgPSBwUG9pbnRzW2kgKyAyXS5tX1BvaW50WCwgeTMgPSBwUG9pbnRzW2kgKyAyXS5tX1BvaW50WTsKLSAgICAgICAgICAgIGlmIChwT2JqZWN0MkRldmljZSkgewotICAgICAgICAgICAgICAgIHBPYmplY3QyRGV2aWNlLT5UcmFuc2Zvcm0oeDAsIHkwKTsKLSAgICAgICAgICAgICAgICBwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtKHgyLCB5Mik7Ci0gICAgICAgICAgICAgICAgcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybSh4MywgeTMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWdnOjpjdXJ2ZTQgY3VydmUoeDAsIHkwLCB4LCB5LCB4MiwgeTIsIHgzLCB5Myk7Ci0gICAgICAgICAgICBpICs9IDI7Ci0gICAgICAgICAgICBtX1BhdGhEYXRhLmFkZF9wYXRoX2N1cnZlKGN1cnZlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocFBvaW50c1tpXS5tX0ZsYWcgJiBGWFBUX0NMT1NFRklHVVJFKSB7Ci0gICAgICAgICAgICBtX1BhdGhEYXRhLmVuZF9wb2x5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1uYW1lc3BhY2UgYWdnCi17Ci10ZW1wbGF0ZTxjbGFzcyBCYXNlUmVuZGVyZXI+IGNsYXNzIHJlbmRlcmVyX3NjYW5saW5lX2FhX29mZnNldAotewotcHVibGljOgotICAgIHR5cGVkZWYgQmFzZVJlbmRlcmVyIGJhc2VfcmVuX3R5cGU7Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3Jlbl90eXBlOjpjb2xvcl90eXBlIGNvbG9yX3R5cGU7Ci0gICAgcmVuZGVyZXJfc2NhbmxpbmVfYWFfb2Zmc2V0KGJhc2VfcmVuX3R5cGUmIHJlbiwgdW5zaWduZWQgbGVmdCwgdW5zaWduZWQgdG9wKSA6Ci0gICAgICAgIG1fcmVuKCZyZW4pLCBtX2xlZnQobGVmdCksIG1fdG9wKHRvcCkKLSAgICB7fQotICAgIHZvaWQgY29sb3IoY29uc3QgY29sb3JfdHlwZSYgYykKLSAgICB7Ci0gICAgICAgIG1fY29sb3IgPSBjOwotICAgIH0KLSAgICBjb25zdCBjb2xvcl90eXBlJiBjb2xvcigpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9jb2xvcjsKLSAgICB9Ci0gICAgdm9pZCBwcmVwYXJlKHVuc2lnbmVkKSB7fQotICAgIHRlbXBsYXRlPGNsYXNzIFNjYW5saW5lPiB2b2lkIHJlbmRlcihjb25zdCBTY2FubGluZSYgc2wpCi0gICAgewotICAgICAgICBpbnQgeSA9IHNsLnkoKTsKLSAgICAgICAgdW5zaWduZWQgbnVtX3NwYW5zID0gc2wubnVtX3NwYW5zKCk7Ci0gICAgICAgIHR5cGVuYW1lIFNjYW5saW5lOjpjb25zdF9pdGVyYXRvciBzcGFuID0gc2wuYmVnaW4oKTsKLSAgICAgICAgZm9yKDs7KSB7Ci0gICAgICAgICAgICBpbnQgeCA9IHNwYW4tPng7Ci0gICAgICAgICAgICBpZihzcGFuLT5sZW4gPiAwKSB7Ci0gICAgICAgICAgICAgICAgbV9yZW4tPmJsZW5kX3NvbGlkX2hzcGFuKHggLSBtX2xlZnQsIHkgLSBtX3RvcCwgKHVuc2lnbmVkKXNwYW4tPmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbi0+Y292ZXJzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9yZW4tPmJsZW5kX2hsaW5lKHggLSBtX2xlZnQsIHkgLSBtX3RvcCwgKHVuc2lnbmVkKSh4IC0gc3Bhbi0+bGVuIC0gMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooc3Bhbi0+Y292ZXJzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZigtLW51bV9zcGFucyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICArK3NwYW47Ci0gICAgICAgIH0KLSAgICB9Ci1wcml2YXRlOgotICAgIGJhc2VfcmVuX3R5cGUqIG1fcmVuOwotICAgIGNvbG9yX3R5cGUgbV9jb2xvcjsKLSAgICB1bnNpZ25lZCBtX2xlZnQsIG1fdG9wOwotfTsKLX0KLXN0YXRpYyB2b2lkIFJhc3Rlcml6ZVN0cm9rZShhZ2c6OnJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEmIHJhc3Rlcml6ZXIsIGFnZzo6cGF0aF9zdG9yYWdlJiBwYXRoX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwgRlhfRkxPQVQgc2NhbGUgPSAxLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0cm9rZUFkanVzdCA9IEZBTFNFLCBGWF9CT09MIGJUZXh0TW9kZSA9IEZBTFNFKQotewotICAgIGFnZzo6bGluZV9jYXBfZSBjYXA7Ci0gICAgc3dpdGNoIChwR3JhcGhTdGF0ZS0+bV9MaW5lQ2FwKSB7Ci0gICAgICAgIGNhc2UgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwUm91bmQ6Ci0gICAgICAgICAgICBjYXAgPSBhZ2c6OnJvdW5kX2NhcDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcFNxdWFyZToKLSAgICAgICAgICAgIGNhcCA9IGFnZzo6c3F1YXJlX2NhcDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgY2FwID0gYWdnOjpidXR0X2NhcDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBhZ2c6OmxpbmVfam9pbl9lIGpvaW47Ci0gICAgc3dpdGNoIChwR3JhcGhTdGF0ZS0+bV9MaW5lSm9pbikgewotICAgICAgICBjYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUpvaW5Sb3VuZDoKLSAgICAgICAgICAgIGpvaW4gPSBhZ2c6OnJvdW5kX2pvaW47Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luQmV2ZWw6Ci0gICAgICAgICAgICBqb2luID0gYWdnOjpiZXZlbF9qb2luOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBqb2luID0gYWdnOjptaXRlcl9qb2luX3JldmVydDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBGWF9GTE9BVCB3aWR0aCA9IHBHcmFwaFN0YXRlLT5tX0xpbmVXaWR0aCAqIHNjYWxlOwotICAgIEZYX0ZMT0FUIHVuaXQgPSAxLmY7Ci0gICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7Ci0gICAgICAgIHVuaXQgPSBGWFNZU19EaXYoMS4wZiwgKHBPYmplY3QyRGV2aWNlLT5HZXRYVW5pdCgpICsgcE9iamVjdDJEZXZpY2UtPkdldFlVbml0KCkpIC8gMik7Ci0gICAgfQotICAgIGlmICh3aWR0aCA8IHVuaXQpIHsKLSAgICAgICAgd2lkdGggPSB1bml0OwotICAgIH0KLSAgICBpZiAocEdyYXBoU3RhdGUtPm1fRGFzaEFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgYWdnOjpjb252X3N0cm9rZTxhZ2c6OnBhdGhfc3RvcmFnZT4gc3Ryb2tlKHBhdGhfZGF0YSk7Ci0gICAgICAgIHN0cm9rZS5saW5lX2pvaW4oam9pbik7Ci0gICAgICAgIHN0cm9rZS5saW5lX2NhcChjYXApOwotICAgICAgICBzdHJva2UubWl0ZXJfbGltaXQocEdyYXBoU3RhdGUtPm1fTWl0ZXJMaW1pdCk7Ci0gICAgICAgIHN0cm9rZS53aWR0aCh3aWR0aCk7Ci0gICAgICAgIHJhc3Rlcml6ZXIuYWRkX3BhdGhfdHJhbnNmb3JtZWQoc3Ryb2tlLCBwT2JqZWN0MkRldmljZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdHlwZWRlZiBhZ2c6OmNvbnZfZGFzaDxhZ2c6OnBhdGhfc3RvcmFnZT4gZGFzaF9jb252ZXJ0ZXI7Ci0gICAgICAgIGRhc2hfY29udmVydGVyIGRhc2gocGF0aF9kYXRhKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAocEdyYXBoU3RhdGUtPm1fRGFzaENvdW50ICsgMSkgLyAyOyBpICsrKSB7Ci0gICAgICAgICAgICBGWF9GTE9BVCBvbiA9IHBHcmFwaFN0YXRlLT5tX0Rhc2hBcnJheVtpICogMl07Ci0gICAgICAgICAgICBpZiAob24gPD0gMC4wMDAwMDFmKSB7Ci0gICAgICAgICAgICAgICAgb24gPSAxLjBmIC8gMTA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9GTE9BVCBvZmYgPSBpICogMiArIDEgPT0gcEdyYXBoU3RhdGUtPm1fRGFzaENvdW50ID8gb24gOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEdyYXBoU3RhdGUtPm1fRGFzaEFycmF5W2kgKiAyICsgMV07Ci0gICAgICAgICAgICBpZiAob2ZmIDwgMCkgewotICAgICAgICAgICAgICAgIG9mZiA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkYXNoLmFkZF9kYXNoKG9uICogc2NhbGUsIG9mZiAqIHNjYWxlKTsKLSAgICAgICAgfQotICAgICAgICBkYXNoLmRhc2hfc3RhcnQocEdyYXBoU3RhdGUtPm1fRGFzaFBoYXNlICogc2NhbGUpOwotICAgICAgICB0eXBlZGVmIGFnZzo6Y29udl9zdHJva2U8ZGFzaF9jb252ZXJ0ZXI+IGRhc2hfc3Ryb2tlOwotICAgICAgICBkYXNoX3N0cm9rZSBzdHJva2UoZGFzaCk7Ci0gICAgICAgIHN0cm9rZS5saW5lX2pvaW4oam9pbik7Ci0gICAgICAgIHN0cm9rZS5saW5lX2NhcChjYXApOwotICAgICAgICBzdHJva2UubWl0ZXJfbGltaXQocEdyYXBoU3RhdGUtPm1fTWl0ZXJMaW1pdCk7Ci0gICAgICAgIHN0cm9rZS53aWR0aCh3aWR0aCk7Ci0gICAgICAgIHJhc3Rlcml6ZXIuYWRkX3BhdGhfdHJhbnNmb3JtZWQoc3Ryb2tlLCBwT2JqZWN0MkRldmljZSk7Ci0gICAgfQotfQotSUZYX1JlbmRlckRldmljZURyaXZlciogSUZYX1JlbmRlckRldmljZURyaXZlcjo6Q3JlYXRlRnhnZURyaXZlcihDRlhfRElCaXRtYXAqIHBCaXRtYXAsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0KQotewotICAgIHJldHVybiBuZXcgQ0ZYX0FnZ0RldmljZURyaXZlcihwQml0bWFwLCAwLCBiUmdiQnl0ZU9yZGVyLCBwT3JpRGV2aWNlLCBiR3JvdXBLbm9ja291dCk7Ci19Ci1DRlhfQWdnRGV2aWNlRHJpdmVyOjpDRlhfQWdnRGV2aWNlRHJpdmVyKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRpdGhlcl9iaXRzLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwgRlhfQk9PTCBiR3JvdXBLbm9ja291dCkKLXsKLSAgICBtX3BCaXRtYXAgPSBwQml0bWFwOwotICAgIG1fRGl0aGVyQml0cyA9IGRpdGhlcl9iaXRzOwotICAgIG1fcENsaXBSZ24gPSBOVUxMOwotICAgIG1fcFBsYXRmb3JtQml0bWFwID0gTlVMTDsKLSAgICBtX3BQbGF0Zm9ybUdyYXBoaWNzID0gTlVMTDsKLSAgICBtX3BEd1JlbmRlclRhcnRnZXQgPSBOVUxMOwotICAgIG1fYlJnYkJ5dGVPcmRlciA9IGJSZ2JCeXRlT3JkZXI7Ci0gICAgbV9wT3JpRGV2aWNlID0gcE9yaURldmljZTsKLSAgICBtX2JHcm91cEtub2Nrb3V0ID0gYkdyb3VwS25vY2tvdXQ7Ci0gICAgbV9GaWxsRmxhZ3MgPSAwOwotICAgIEluaXRQbGF0Zm9ybSgpOwotfQotQ0ZYX0FnZ0RldmljZURyaXZlcjo6fkNGWF9BZ2dEZXZpY2VEcml2ZXIoKQotewotICAgIGlmIChtX3BDbGlwUmduKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BDbGlwUmduOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fU3RhdGVTdGFjay5HZXRTaXplKCk7IGkgKyspCi0gICAgICAgIGlmIChtX1N0YXRlU3RhY2tbaV0pIHsKLSAgICAgICAgICAgIGRlbGV0ZSAoQ0ZYX0NsaXBSZ24qKW1fU3RhdGVTdGFja1tpXTsKLSAgICAgICAgfQotICAgIERlc3Ryb3lQbGF0Zm9ybSgpOwotfQotI2lmIF9GWE1fUExBVEZPUk1fICAhPSBfRlhNX1BMQVRGT1JNX0FQUExFXwotdm9pZCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpJbml0UGxhdGZvcm0oKQotewotfQotdm9pZCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpEZXN0cm95UGxhdGZvcm0oKQotewotfQotRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKLSAgICAgICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwgRlhfRkxPQVQgZm9udF9zaXplLCBGWF9EV09SRCBjb2xvciwKLSAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotI2VuZGlmCi1pbnQgQ0ZYX0FnZ0RldmljZURyaXZlcjo6R2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCkKLXsKLSAgICBzd2l0Y2ggKGNhcHNfaWQpIHsKLSAgICAgICAgY2FzZSBGWERDX0RFVklDRV9DTEFTUzoKLSAgICAgICAgICAgIHJldHVybiBGWERDX0RJU1BMQVk7Ci0gICAgICAgIGNhc2UgRlhEQ19QSVhFTF9XSURUSDoKLSAgICAgICAgICAgIHJldHVybiBtX3BCaXRtYXAtPkdldFdpZHRoKCk7Ci0gICAgICAgIGNhc2UgRlhEQ19QSVhFTF9IRUlHSFQ6Ci0gICAgICAgICAgICByZXR1cm4gbV9wQml0bWFwLT5HZXRIZWlnaHQoKTsKLSAgICAgICAgY2FzZSBGWERDX0JJVFNfUElYRUw6Ci0gICAgICAgICAgICByZXR1cm4gbV9wQml0bWFwLT5HZXRCUFAoKTsKLSAgICAgICAgY2FzZSBGWERDX0hPUlpfU0laRToKLSAgICAgICAgY2FzZSBGWERDX1ZFUlRfU0laRToKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBjYXNlIEZYRENfUkVOREVSX0NBUFM6IHsKLSAgICAgICAgICAgICAgICBpbnQgZmxhZ3MgPSBGWFJDX0dFVF9CSVRTIHwgRlhSQ19BTFBIQV9QQVRIIHwgRlhSQ19BTFBIQV9JTUFHRSB8IEZYUkNfQkxFTkRfTU9ERSB8IEZYUkNfU09GVF9DTElQOwotICAgICAgICAgICAgICAgIGlmIChtX3BCaXRtYXAtPkhhc0FscGhhKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRlhSQ19BTFBIQV9PVVRQVVQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtX3BCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fcEJpdG1hcC0+R2V0QlBQKCkgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRlhSQ19CSVRNQVNLX09VVFBVVDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZYUkNfQllURU1BU0tfT1VUUFVUOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtX3BCaXRtYXAtPklzQ215a0ltYWdlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRlhSQ19DTVlLX09VVFBVVDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZsYWdzOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIEZYRENfRElUSEVSX0JJVFM6Ci0gICAgICAgICAgICByZXR1cm4gbV9EaXRoZXJCaXRzOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLXZvaWQgQ0ZYX0FnZ0RldmljZURyaXZlcjo6U2F2ZVN0YXRlKCkKLXsKLSAgICB2b2lkKiBwQ2xpcCA9IE5VTEw7Ci0gICAgaWYgKG1fcENsaXBSZ24pIHsKLSAgICAgICAgcENsaXAgPSBuZXcgQ0ZYX0NsaXBSZ24oKm1fcENsaXBSZ24pOwotICAgIH0KLSAgICBtX1N0YXRlU3RhY2suQWRkKHBDbGlwKTsKLX0KLXZvaWQgQ0ZYX0FnZ0RldmljZURyaXZlcjo6UmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCkKLXsKLSAgICBpZiAobV9TdGF0ZVN0YWNrLkdldFNpemUoKSA9PSAwKSB7Ci0gICAgICAgIGlmIChtX3BDbGlwUmduKSB7Ci0gICAgICAgICAgICBkZWxldGUgbV9wQ2xpcFJnbjsKLSAgICAgICAgICAgIG1fcENsaXBSZ24gPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ0ZYX0NsaXBSZ24qIHBTYXZlZENsaXAgPSAoQ0ZYX0NsaXBSZ24qKW1fU3RhdGVTdGFja1ttX1N0YXRlU3RhY2suR2V0U2l6ZSgpIC0gMV07Ci0gICAgaWYgKG1fcENsaXBSZ24pIHsKLSAgICAgICAgZGVsZXRlIG1fcENsaXBSZ247Ci0gICAgICAgIG1fcENsaXBSZ24gPSBOVUxMOwotICAgIH0KLSAgICBpZiAoYktlZXBTYXZlZCkgewotICAgICAgICBpZiAocFNhdmVkQ2xpcCkgewotICAgICAgICAgICAgbV9wQ2xpcFJnbiA9IG5ldyBDRlhfQ2xpcFJnbigqcFNhdmVkQ2xpcCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtX1N0YXRlU3RhY2suUmVtb3ZlQXQobV9TdGF0ZVN0YWNrLkdldFNpemUoKSAtIDEpOwotICAgICAgICBtX3BDbGlwUmduID0gcFNhdmVkQ2xpcDsKLSAgICB9Ci19Ci12b2lkIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlNldENsaXBNYXNrKGFnZzo6cmFzdGVyaXplcl9zY2FubGluZV9hYSYgcmFzdGVyaXplcikKLXsKLSAgICBGWF9SRUNUIHBhdGhfcmVjdChyYXN0ZXJpemVyLm1pbl94KCksIHJhc3Rlcml6ZXIubWluX3koKSwKLSAgICAgICAgICAgICAgICAgICAgICByYXN0ZXJpemVyLm1heF94KCkgKyAxLCByYXN0ZXJpemVyLm1heF95KCkgKyAxKTsKLSAgICBwYXRoX3JlY3QuSW50ZXJzZWN0KG1fcENsaXBSZ24tPkdldEJveCgpKTsKLSAgICBDRlhfRElCaXRtYXBSZWYgbWFzazsKLSAgICBDRlhfRElCaXRtYXAqIHBUaGlzTGF5ZXIgPSBtYXNrLk5ldygpOwotICAgIGlmICghcFRoaXNMYXllcikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHBUaGlzTGF5ZXItPkNyZWF0ZShwYXRoX3JlY3QuV2lkdGgoKSwgcGF0aF9yZWN0LkhlaWdodCgpLCBGWERJQl84YnBwTWFzayk7Ci0gICAgcFRoaXNMYXllci0+Q2xlYXIoMCk7Ci0gICAgYWdnOjpyZW5kZXJpbmdfYnVmZmVyIHJhd19idWYocFRoaXNMYXllci0+R2V0QnVmZmVyKCksIHBUaGlzTGF5ZXItPkdldFdpZHRoKCksIHBUaGlzTGF5ZXItPkdldEhlaWdodCgpLCBwVGhpc0xheWVyLT5HZXRQaXRjaCgpKTsKLSAgICBhZ2c6OnBpeGZtdF9ncmF5OCBwaXhlbF9idWYocmF3X2J1Zik7Ci0gICAgYWdnOjpyZW5kZXJlcl9iYXNlPGFnZzo6cGl4Zm10X2dyYXk4PiBiYXNlX2J1ZihwaXhlbF9idWYpOwotICAgIGFnZzo6cmVuZGVyZXJfc2NhbmxpbmVfYWFfb2Zmc2V0PGFnZzo6cmVuZGVyZXJfYmFzZTxhZ2c6OnBpeGZtdF9ncmF5OD4gPiBmaW5hbF9yZW5kZXIoYmFzZV9idWYsIHBhdGhfcmVjdC5sZWZ0LCBwYXRoX3JlY3QudG9wKTsKLSAgICBmaW5hbF9yZW5kZXIuY29sb3IoYWdnOjpncmF5OCgyNTUpKTsKLSAgICBhZ2c6OnNjYW5saW5lX3U4IHNjYW5saW5lOwotICAgIGFnZzo6cmVuZGVyX3NjYW5saW5lcyhyYXN0ZXJpemVyLCBzY2FubGluZSwgZmluYWxfcmVuZGVyLCAobV9GaWxsRmxhZ3MgJiBGWEZJTExfTk9QQVRIU01PT1RIKSAhPSAwKTsKLSAgICBtX3BDbGlwUmduLT5JbnRlcnNlY3RNYXNrRihwYXRoX3JlY3QubGVmdCwgcGF0aF9yZWN0LnRvcCwgbWFzayk7Ci19Ci1GWF9CT09MIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCi0gICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICBpbnQgZmlsbF9tb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgbV9GaWxsRmxhZ3MgPSBmaWxsX21vZGU7Ci0gICAgaWYgKG1fcENsaXBSZ24gPT0gTlVMTCkgewotICAgICAgICBtX3BDbGlwUmduID0gbmV3IENGWF9DbGlwUmduKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCksIEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKTsKLSAgICB9Ci0gICAgaWYgKHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID09IDUgfHwgcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgPT0gNCkgewotICAgICAgICBDRlhfRmxvYXRSZWN0IHJlY3RmOwotICAgICAgICBpZiAocFBhdGhEYXRhLT5Jc1JlY3QocE9iamVjdDJEZXZpY2UsICZyZWN0ZikpIHsKLSAgICAgICAgICAgIHJlY3RmLkludGVyc2VjdChDRlhfRmxvYXRSZWN0KDAsIDAsIChGWF9GTE9BVClHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpLCAoRlhfRkxPQVQpR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpKTsKLSAgICAgICAgICAgIEZYX1JFQ1QgcmVjdCA9IHJlY3RmLkdldE91dHRlclJlY3QoKTsKLSAgICAgICAgICAgIG1fcENsaXBSZ24tPkludGVyc2VjdFJlY3QocmVjdCk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBDQWdnX1BhdGhEYXRhIHBhdGhfZGF0YTsKLSAgICBwYXRoX2RhdGEuQnVpbGRQYXRoKHBQYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UpOwotICAgIHBhdGhfZGF0YS5tX1BhdGhEYXRhLmVuZF9wb2x5KCk7Ci0gICAgYWdnOjpyYXN0ZXJpemVyX3NjYW5saW5lX2FhIHJhc3Rlcml6ZXI7Ci0gICAgcmFzdGVyaXplci5jbGlwX2JveCgwLjBmLCAwLjBmLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCkpLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKSk7Ci0gICAgcmFzdGVyaXplci5hZGRfcGF0aChwYXRoX2RhdGEubV9QYXRoRGF0YSk7Ci0gICAgcmFzdGVyaXplci5maWxsaW5nX3J1bGUoKGZpbGxfbW9kZSAmIDMpID09IEZYRklMTF9XSU5ESU5HID8gYWdnOjpmaWxsX25vbl96ZXJvIDogYWdnOjpmaWxsX2V2ZW5fb2RkKTsKLSAgICBTZXRDbGlwTWFzayhyYXN0ZXJpemVyKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6U2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAotICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgaWYgKG1fcENsaXBSZ24gPT0gTlVMTCkgewotICAgICAgICBtX3BDbGlwUmduID0gbmV3IENGWF9DbGlwUmduKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCksIEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKTsKLSAgICB9Ci0gICAgQ0FnZ19QYXRoRGF0YSBwYXRoX2RhdGE7Ci0gICAgcGF0aF9kYXRhLkJ1aWxkUGF0aChwUGF0aERhdGEsIE5VTEwpOwotICAgIGFnZzo6cmFzdGVyaXplcl9zY2FubGluZV9hYSByYXN0ZXJpemVyOwotICAgIHJhc3Rlcml6ZXIuY2xpcF9ib3goMC4wZiwgMC4wZiwgKEZYX0ZMT0FUKShHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpKSwgKEZYX0ZMT0FUKShHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSkpOwotICAgIFJhc3Rlcml6ZVN0cm9rZShyYXN0ZXJpemVyLCBwYXRoX2RhdGEubV9QYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UsIHBHcmFwaFN0YXRlKTsKLSAgICByYXN0ZXJpemVyLmZpbGxpbmdfcnVsZShhZ2c6OmZpbGxfbm9uX3plcm8pOwotICAgIFNldENsaXBNYXNrKHJhc3Rlcml6ZXIpOwotICAgIHJldHVybiBUUlVFOwotfQotY2xhc3MgQ0ZYX1JlbmRlcmVyIAotewotcHJpdmF0ZToKLSAgICBpbnQJCQltX0FscGhhLAotICAgICAgICAgICAgICAgIG1fUmVkLAotICAgICAgICAgICAgICAgIG1fR3JlZW4sCi0gICAgICAgICAgICAgICAgbV9CbHVlLAotICAgICAgICAgICAgICAgIG1fR3JheTsKLSAgICBGWF9EV09SRAltX0NvbG9yOwotICAgIEZYX0JPT0wJCW1fYkZ1bGxDb3ZlcjsKLSAgICBGWF9CT09MICAgICBtX2JSZ2JCeXRlT3JkZXI7Ci0gICAgQ0ZYX0RJQml0bWFwKiBtX3BPcmlEZXZpY2U7Ci0gICAgRlhfUkVDVAkJbV9DbGlwQm94OwotICAgIGNvbnN0IENGWF9ESUJpdG1hcCoJbV9wQ2xpcE1hc2s7Ci0gICAgQ0ZYX0RJQml0bWFwKgltX3BEZXZpY2U7Ci0gICAgY29uc3QgQ0ZYX0NsaXBSZ24qIG1fcENsaXBSZ247Ci0gICAgdm9pZCAoQ0ZYX1JlbmRlcmVyOjoqY29tcG9zaXRlX3NwYW4pKEZYX0xQQllURSwgaW50LCBpbnQsIGludCwgRlhfTFBCWVRFLCBpbnQsIGludCwgRlhfTFBCWVRFLCBGWF9MUEJZVEUpOwotcHVibGljOgotICAgIHZvaWQgcHJlcGFyZSh1bnNpZ25lZCkge30KLSAgICB2b2lkIENvbXBvc2l0ZVNwYW4oRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBCWVRFIG9yaV9zY2FuLCBpbnQgQnBwLCBGWF9CT09MIGJEZXN0QWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgRlhfTFBCWVRFIGNvdmVyX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCBGWF9MUEJZVEUgY2xpcF9zY2FuKQotICAgIHsKLSAgICAgICAgQVNTRVJUKCFtX3BEZXZpY2UtPklzQ215a0ltYWdlKCkpOwotICAgICAgICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLSAgICAgICAgaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotICAgICAgICBpZiAoQnBwKSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0ICogQnBwOwotICAgICAgICAgICAgb3JpX3NjYW4gKz0gY29sX3N0YXJ0ICogQnBwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCAvIDg7Ci0gICAgICAgICAgICBvcmlfc2NhbiArPSBjb2xfc3RhcnQgLyA4OwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKLSAgICAgICAgICAgIGlmIChCcHAgPT0gNCAmJiBiRGVzdEFscGhhKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGRlc3RfYWxwaGEgPSBvcmlfc2NhblszXSArIHNyY19hbHBoYSAtIG9yaV9zY2FuWzNdICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgICAgICBpZiAobV9iRnVsbENvdmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9SZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9CbHVlLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yaV9zY2FuKys7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgciA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX1JlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGcgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9CbHVlLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcmlfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSggKmRlc3Rfc2NhbiwgciwgY292ZXJfc2Nhbltjb2xdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBnLCBjb3Zlcl9zY2FuW2NvbF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGIsIGNvdmVyX3NjYW5bY29sXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gMjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEJwcCA9PSAzIHx8IEJwcCA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1IDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW50IHIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9SZWQsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBnID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBiID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuLCBtX0JsdWUsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgIG9yaV9zY2FuICs9IEJwcCAtIDI7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSggKmRlc3Rfc2NhbiwgciwgY292ZXJfc2Nhbltjb2xdKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZywgY292ZXJfc2Nhbltjb2xdKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYiwgY292ZXJfc2Nhbltjb2xdKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcCAtIDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCcHAgPT0gNCAmJiBiRGVzdEFscGhhKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGE7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYV9jb3ZlcmVkID0gc3JjX2FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGFfY292ZXJlZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvdmVyX3NjYW5bY29sXSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gc3JjX2FscGhhX2NvdmVyZWQ7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gKysgPSBtX0JsdWU7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gKysgPSBtX0dyZWVuOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gbV9SZWQ7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAyOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdF9zY2FuWzNdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IHNyY19hbHBoYV9jb3ZlcmVkOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiArKyA9IG1fQmx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gKysgPSBtX0dyZWVuOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IG1fUmVkOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGNvdmVyID0gY292ZXJfc2Nhbltjb2xdOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bM10sIHNyY19hbHBoYSwgY292ZXIpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBjb3Zlcik7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGNvdmVyKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGNvdmVyKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKEJwcCA9PSAzIHx8IEJwcCA9PSA0KSB7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGE7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgewotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9CbHVlLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmVlbiwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbiwgbV9SZWQsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHAgLSAyOwotICAgICAgICAgICAgICAgICAgICBvcmlfc2NhbiArPSBCcHAgLSAyOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IGIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9CbHVlLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgIGludCBnID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgaW50IHIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgIG9yaV9zY2FuICs9IEJwcCAtIDI7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCAqZGVzdF9zY2FuLCBiLCBjb3Zlcl9zY2FuW2NvbF0pOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZywgY292ZXJfc2Nhbltjb2xdKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHIsIGNvdmVyX3NjYW5bY29sXSk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcCAtIDI7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoQnBwID09IDEpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobV9iRnVsbENvdmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmF5LCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBncmF5ID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JheSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGNvdmVyX3NjYW5bY29sXSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgICAgICBpZiAobV9wRGV2aWNlLT5HZXRQYWxldHRlKCkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGluZGV4ID0gKChGWF9CWVRFKW1fQ29sb3IgPT0gMHhmZikgPyAxIDogMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpICsrKQotICAgICAgICAgICAgICAgICAgICBpZiAoRlhBUkdCX1RPRElCKG1fcERldmljZS0+R2V0UGFsZXR0ZSgpW2ldKSA9PSBtX0NvbG9yKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X3NjYW4xID0gZGVzdF9zY2FuOwotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbjEgJj0gfigxIDw8ICg3IC0gKGNvbCArIHNwYW5fbGVmdCkgJSA4KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuMSB8PSAxIDw8ICg3IC0gKGNvbCArIHNwYW5fbGVmdCkgJSA4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4xID0gZGVzdF9zY2FuICsgKHNwYW5fbGVmdCAlIDggKyBjb2wgLSBjb2xfc3RhcnQgKyAxKSAvIDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdm9pZCBDb21wb3NpdGVTcGFuMWJwcChGWF9MUEJZVEUgZGVzdF9zY2FuLCBpbnQgQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBGWF9MUEJZVEUgY292ZXJfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCBGWF9MUEJZVEUgY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBCWVRFIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikKLSAgICB7Ci0gICAgICAgIEFTU0VSVCghbV9iUmdiQnl0ZU9yZGVyKTsKLSAgICAgICAgQVNTRVJUKCFtX3BEZXZpY2UtPklzQ215a0ltYWdlKCkpOwotICAgICAgICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLSAgICAgICAgaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotICAgICAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0IC8gODsKLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgaWYgKG1fcERldmljZS0+R2V0UGFsZXR0ZSgpID09IE5VTEwpIHsKLSAgICAgICAgICAgIGluZGV4ID0gKChGWF9CWVRFKW1fQ29sb3IgPT0gMHhmZikgPyAxIDogMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSArKykKLSAgICAgICAgICAgICAgICBpZiAoRlhBUkdCX1RPRElCKG1fcERldmljZS0+R2V0UGFsZXR0ZSgpW2ldKSA9PSBtX0NvbG9yKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRlhfTFBCWVRFIGRlc3Rfc2NhbjEgPSBkZXN0X3NjYW47Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4xICY9IH4oMSA8PCAoNyAtIChjb2wgKyBzcGFuX2xlZnQpICUgOCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4xIHw9IDEgPDwgKDcgLSAoY29sICsgc3Bhbl9sZWZ0KSAlIDgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3Rfc2NhbjEgPSBkZXN0X3NjYW4gKyAoc3Bhbl9sZWZ0ICUgOCArIGNvbCAtIGNvbF9zdGFydCArIDEpIC8gODsKLSAgICAgICAgfQotICAgIH0KLSAgICB2b2lkIENvbXBvc2l0ZVNwYW5HcmF5KEZYX0xQQllURSBkZXN0X3NjYW4sIGludCBCcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIEZYX0xQQllURSBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIEZYX0xQQllURSBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUEJZVEUgZGVzdF9leHRyYV9hbHBoYV9zY2FuKQotICAgIHsKLSAgICAgICAgQVNTRVJUKCFtX2JSZ2JCeXRlT3JkZXIpOwotICAgICAgICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLSAgICAgICAgaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotICAgICAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0OwotICAgICAgICBpZiAoZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGE7Ci0gICAgICAgICAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gbV9HcmF5OwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbiA9IG1fQWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGRlc3RfYWxwaGEgPSAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKyBzcmNfYWxwaGEgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmF5LCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0X2V4dHJhX2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBtX0dyYXk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmF5LCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICB2b2lkIENvbXBvc2l0ZVNwYW5BUkdCKEZYX0xQQllURSBkZXN0X3NjYW4sIGludCBCcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIEZYX0xQQllURSBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIEZYX0xQQllURSBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUEJZVEUgZGVzdF9leHRyYV9hbHBoYV9zY2FuKQotICAgIHsKLSAgICAgICAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7Ci0gICAgICAgIGludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKLSAgICAgICAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCAqIEJwcDsKLSAgICAgICAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgewotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICAgICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9zY2FuID0gbV9Db2xvcjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgZGVzdF9hbHBoYSA9IGRlc3Rfc2NhblszXSArIHNyY19hbHBoYSAtIGRlc3Rfc2NhblszXSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotICAgICAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdICogY2xpcF9zY2FuW2NvbF0gLyAyNTUgLyAyNTU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9zY2FuID0gbV9Db2xvcjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdF9zY2FuWzNdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IHNyY19hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fQmx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fR3JlZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gbV9SZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgZGVzdF9hbHBoYSA9IGRlc3Rfc2NhblszXSArIHNyY19hbHBoYSAtIGRlc3Rfc2NhblszXSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAyOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgICB9Ci0gICAgfQotICAgIHZvaWQgQ29tcG9zaXRlU3BhblJHQihGWF9MUEJZVEUgZGVzdF9zY2FuLCBpbnQgQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIEZYX0xQQllURSBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgRlhfTFBCWVRFIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBCWVRFIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikKLSAgICB7Ci0gICAgICAgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOwotICAgICAgICBpbnQgY29sX2VuZCA9IChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7Ci0gICAgICAgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgKiBCcHA7Ci0gICAgICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQnBwID09IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSBtX0NvbG9yOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChCcHAgPT0gMykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fUmVkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fR3JlZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9CbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHAgLSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoQnBwID09IDMgJiYgZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGE7Ci0gICAgICAgICAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAoRlhfQllURSltX0JsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAoRlhfQllURSltX0dyZWVuOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKEZYX0JZVEUpbV9SZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9leHRyYV9hbHBoYV9zY2FuKysgPSAoRlhfQllURSltX0FscGhhOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGRlc3RfYWxwaGEgPSAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKyBzcmNfYWxwaGEgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0X2V4dHJhX2FscGhhX3NjYW4rKzsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICAgICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJwcCA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9zY2FuID0gbV9Db2xvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQnBwID09IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9HcmVlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX1JlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHAgLSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICB2b2lkIENvbXBvc2l0ZVNwYW5DTVlLKEZYX0xQQllURSBkZXN0X3NjYW4sIGludCBCcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIEZYX0xQQllURSBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIEZYX0xQQllURSBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUEJZVEUgZGVzdF9leHRyYV9hbHBoYV9zY2FuKQotICAgIHsKLSAgICAgICAgQVNTRVJUKCFtX2JSZ2JCeXRlT3JkZXIpOwotICAgICAgICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLSAgICAgICAgaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotICAgICAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0ICogNDsKLSAgICAgICAgaWYgKGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgewotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICAgICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAgICAgKihGWF9DTVlLKilkZXN0X3NjYW4gPSBtX0NvbG9yOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbiA9IChGWF9CWVRFKW1fQWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGRlc3RfYWxwaGEgPSAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKyBzcmNfYWxwaGEgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmF5LCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0X2V4dHJhX2FscGhhX3NjYW4rKzsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKEZYX0NNWUsqKWRlc3Rfc2NhbiA9IG1fQ29sb3I7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmF5LCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdGVtcGxhdGU8Y2xhc3MgU2NhbmxpbmU+IHZvaWQgcmVuZGVyKGNvbnN0IFNjYW5saW5lJiBzbCkKLSAgICB7Ci0gICAgICAgIGlmIChtX3BPcmlEZXZpY2UgPT0gTlVMTCAmJiBjb21wb3NpdGVfc3BhbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHkgPSBzbC55KCk7Ci0gICAgICAgIGlmICh5IDwgbV9DbGlwQm94LnRvcCB8fCB5ID49IG1fQ2xpcEJveC5ib3R0b20pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBGWF9MUEJZVEUgZGVzdF9zY2FuID0gbV9wRGV2aWNlLT5HZXRCdWZmZXIoKSArIG1fcERldmljZS0+R2V0UGl0Y2goKSAqIHk7Ci0gICAgICAgIEZYX0xQQllURSBkZXN0X3NjYW5fZXh0cmFfYWxwaGEgPSBOVUxMOwotICAgICAgICBDRlhfRElCaXRtYXAqIHBBbHBoYU1hc2sgPSBtX3BEZXZpY2UtPm1fcEFscGhhTWFzazsKLSAgICAgICAgaWYgKHBBbHBoYU1hc2spIHsKLSAgICAgICAgICAgIGRlc3Rfc2Nhbl9leHRyYV9hbHBoYSA9IHBBbHBoYU1hc2stPkdldEJ1ZmZlcigpICsgcEFscGhhTWFzay0+R2V0UGl0Y2goKSAqIHk7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfTFBCWVRFIG9yaV9zY2FuID0gTlVMTDsKLSAgICAgICAgaWYgKG1fcE9yaURldmljZSkgewotICAgICAgICAgICAgb3JpX3NjYW4gPSBtX3BPcmlEZXZpY2UtPkdldEJ1ZmZlcigpICsgbV9wT3JpRGV2aWNlLT5HZXRQaXRjaCgpICogeTsKLSAgICAgICAgfQotICAgICAgICBpbnQgQnBwID0gbV9wRGV2aWNlLT5HZXRCUFAoKSAvIDg7Ci0gICAgICAgIEZYX0JPT0wgYkRlc3RBbHBoYSA9IG1fcERldmljZS0+SGFzQWxwaGEoKSB8fCBtX3BEZXZpY2UtPklzQWxwaGFNYXNrKCk7Ci0gICAgICAgIHVuc2lnbmVkIG51bV9zcGFucyA9IHNsLm51bV9zcGFucygpOwotICAgICAgICB0eXBlbmFtZSBTY2FubGluZTo6Y29uc3RfaXRlcmF0b3Igc3BhbiA9IHNsLmJlZ2luKCk7Ci0gICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICBpbnQgeCA9IHNwYW4tPng7Ci0gICAgICAgICAgICBBU1NFUlQoc3Bhbi0+bGVuID4gMCk7Ci0gICAgICAgICAgICBGWF9MUEJZVEUgZGVzdF9wb3MgPSBOVUxMOwotICAgICAgICAgICAgRlhfTFBCWVRFIGRlc3RfZXh0cmFfYWxwaGFfcG9zID0gTlVMTDsKLSAgICAgICAgICAgIEZYX0xQQllURSBvcmlfcG9zID0gTlVMTDsKLSAgICAgICAgICAgIGlmIChCcHApIHsKLSAgICAgICAgICAgICAgICBvcmlfcG9zID0gb3JpX3NjYW4gPyBvcmlfc2NhbiArIHggKiBCcHAgOiBOVUxMOwotICAgICAgICAgICAgICAgIGRlc3RfcG9zID0gZGVzdF9zY2FuICsgeCAqIEJwcDsKLSAgICAgICAgICAgICAgICBkZXN0X2V4dHJhX2FscGhhX3BvcyA9IGRlc3Rfc2Nhbl9leHRyYV9hbHBoYSA/IGRlc3Rfc2Nhbl9leHRyYV9hbHBoYSArIHggOiBOVUxMOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZXN0X3BvcyA9IGRlc3Rfc2NhbiArIHggLyA4OwotICAgICAgICAgICAgICAgIG9yaV9wb3MgPSBvcmlfc2NhbiA/IG9yaV9zY2FuICsgeCAvIDggOiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfTFBCWVRFIGNsaXBfcG9zID0gTlVMTDsKLSAgICAgICAgICAgIGlmIChtX3BDbGlwTWFzaykgewotICAgICAgICAgICAgICAgIGNsaXBfcG9zID0gbV9wQ2xpcE1hc2stPkdldEJ1ZmZlcigpICsgKHkgLSBtX0NsaXBCb3gudG9wKSAqIG1fcENsaXBNYXNrLT5HZXRQaXRjaCgpICsgeCAtIG1fQ2xpcEJveC5sZWZ0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG9yaV9wb3MpIHsKLSAgICAgICAgICAgICAgICBDb21wb3NpdGVTcGFuKGRlc3RfcG9zLCBvcmlfcG9zLCBCcHAsIGJEZXN0QWxwaGEsIHgsIHNwYW4tPmxlbiwgc3Bhbi0+Y292ZXJzLCBtX0NsaXBCb3gubGVmdCwgbV9DbGlwQm94LnJpZ2h0LCBjbGlwX3Bvcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICh0aGlzLT4qY29tcG9zaXRlX3NwYW4pKGRlc3RfcG9zLCBCcHAsIHgsIHNwYW4tPmxlbiwgc3Bhbi0+Y292ZXJzLCBtX0NsaXBCb3gubGVmdCwgbV9DbGlwQm94LnJpZ2h0LCBjbGlwX3BvcywgZGVzdF9leHRyYV9hbHBoYV9wb3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoLS1udW1fc3BhbnMgPT0gMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKytzcGFuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgRlhfQk9PTCBJbml0KENGWF9ESUJpdG1hcCogcERldmljZSwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sIEZYX0RXT1JEIGNvbG9yLCBGWF9CT09MIGJGdWxsQ292ZXIsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwKLSAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCkKLSAgICB7Ci0gICAgICAgIG1fcERldmljZSA9IHBEZXZpY2U7Ci0gICAgICAgIG1fcENsaXBSZ24gPSBwQ2xpcFJnbjsKLSAgICAgICAgY29tcG9zaXRlX3NwYW4gPSBOVUxMOwotICAgICAgICBtX2JSZ2JCeXRlT3JkZXIgPSBiUmdiQnl0ZU9yZGVyOwotICAgICAgICBtX3BPcmlEZXZpY2UgPSBwT3JpRGV2aWNlOwotICAgICAgICBpZiAobV9wQ2xpcFJnbikgewotICAgICAgICAgICAgbV9DbGlwQm94ID0gbV9wQ2xpcFJnbi0+R2V0Qm94KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX0NsaXBCb3gubGVmdCA9IG1fQ2xpcEJveC50b3AgPSAwOwotICAgICAgICAgICAgbV9DbGlwQm94LnJpZ2h0ID0gbV9wRGV2aWNlLT5HZXRXaWR0aCgpOwotICAgICAgICAgICAgbV9DbGlwQm94LmJvdHRvbSA9IG1fcERldmljZS0+R2V0SGVpZ2h0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wQ2xpcE1hc2sgPSBOVUxMOwotICAgICAgICBpZiAobV9wQ2xpcFJnbiAmJiBtX3BDbGlwUmduLT5HZXRUeXBlKCkgPT0gQ0ZYX0NsaXBSZ246Ok1hc2tGKSB7Ci0gICAgICAgICAgICBtX3BDbGlwTWFzayA9IG1fcENsaXBSZ24tPkdldE1hc2soKTsKLSAgICAgICAgfQotICAgICAgICBtX2JGdWxsQ292ZXIgPSBiRnVsbENvdmVyOwotICAgICAgICBGWF9CT09MIGJPYmplY3RDTVlLID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKTsKLSAgICAgICAgRlhfQk9PTCBiRGV2aWNlQ01ZSyA9IHBEZXZpY2UtPklzQ215a0ltYWdlKCk7Ci0gICAgICAgIG1fQWxwaGEgPSBiT2JqZWN0Q01ZSyA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpIDogRlhBUkdCX0EoY29sb3IpOwotICAgICAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gTlVMTDsKLSAgICAgICAgaWYgKCFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpIHx8ICFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKSkgewotICAgICAgICAgICAgcEljY1RyYW5zZm9ybSA9IE5VTEw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fcERldmljZS0+R2V0QlBQKCkgPT0gOCkgewotICAgICAgICAgICAgQVNTRVJUKCFtX2JSZ2JCeXRlT3JkZXIpOwotICAgICAgICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuR3JheTsKLSAgICAgICAgICAgIGlmIChtX3BEZXZpY2UtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgICAgICAgICBtX0dyYXkgPSAyNTU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgZ3JheTsKLSAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBiT2JqZWN0Q01ZSyA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOwotICAgICAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAmZ3JheSwgKEZYX0xQQ0JZVEUpJmNvbG9yLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgbV9HcmF5ID0gZ3JheTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoYk9iamVjdENNWUspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgciwgZywgYjsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUoY29sb3IpLCBGWFNZU19HZXRNVmFsdWUoY29sb3IpLCBGWFNZU19HZXRZVmFsdWUoY29sb3IpLCBGWFNZU19HZXRLVmFsdWUoY29sb3IpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIGcsIGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9HcmF5ID0gRlhSR0IyR1JBWShyLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fR3JheSA9IEZYUkdCMkdSQVkoRlhBUkdCX1IoY29sb3IpLCBGWEFSR0JfRyhjb2xvciksIEZYQVJHQl9CKGNvbG9yKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYkRldmljZUNNWUspIHsKLSAgICAgICAgICAgIEFTU0VSVCghbV9iUmdiQnl0ZU9yZGVyKTsKLSAgICAgICAgICAgIGNvbXBvc2l0ZV9zcGFuID0gJkNGWF9SZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkNNWUs7Ci0gICAgICAgICAgICBpZiAoYk9iamVjdENNWUspIHsKLSAgICAgICAgICAgICAgICBtX0NvbG9yID0gRlhDTVlLX1RPRElCKGNvbG9yKTsKLSAgICAgICAgICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAoRlhfTFBCWVRFKSZtX0NvbG9yLCAoRlhfTFBDQllURSkmbV9Db2xvciwgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIXBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb2xvciA9IEZYQVJHQl9UT0RJQihjb2xvcik7Ci0gICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKEZYX0xQQllURSkmbV9Db2xvciwgKEZYX0xQQ0JZVEUpJmNvbG9yLCAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fUmVkID0gKChGWF9MUEJZVEUpJm1fQ29sb3IpWzBdOwotICAgICAgICAgICAgbV9HcmVlbiA9ICgoRlhfTFBCWVRFKSZtX0NvbG9yKVsxXTsKLSAgICAgICAgICAgIG1fQmx1ZSA9ICgoRlhfTFBCWVRFKSZtX0NvbG9yKVsyXTsKLSAgICAgICAgICAgIG1fR3JheSA9ICgoRlhfTFBCWVRFKSZtX0NvbG9yKVszXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbXBvc2l0ZV9zcGFuID0gKHBEZXZpY2UtPkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpID8gJkNGWF9SZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkFSR0IgOiAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCOwotICAgICAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgICAgICAgICBjb2xvciA9IGJPYmplY3RDTVlLID8gRlhDTVlLX1RPRElCKGNvbG9yKSA6IEZYQVJHQl9UT0RJQihjb2xvcik7Ci0gICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKEZYX0xQQllURSkmbV9Db2xvciwgKEZYX0xQQ0JZVEUpJmNvbG9yLCAxKTsKLSAgICAgICAgICAgICAgICAoKEZYX0xQQllURSkmbV9Db2xvcilbM10gPSBtX0FscGhhOwotICAgICAgICAgICAgICAgIG1fUmVkID0gKChGWF9MUEJZVEUpJm1fQ29sb3IpWzJdOwotICAgICAgICAgICAgICAgIG1fR3JlZW4gPSAoKEZYX0xQQllURSkmbV9Db2xvcilbMV07Ci0gICAgICAgICAgICAgICAgbV9CbHVlID0gKChGWF9MUEJZVEUpJm1fQ29sb3IpWzBdOwotICAgICAgICAgICAgICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9Db2xvciA9IEZYQVJHQl9UT0RJQihtX0NvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgbV9Db2xvciA9IEZYQVJHQl9UT0JHUk9SREVSRElCKG1fQ29sb3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJPYmplY3RDTVlLKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgciwgZywgYjsKLSAgICAgICAgICAgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShjb2xvciksIEZYU1lTX0dldE1WYWx1ZShjb2xvciksIEZYU1lTX0dldFlWYWx1ZShjb2xvciksIEZYU1lTX0dldEtWYWx1ZShjb2xvciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgbV9Db2xvciA9IEZYQVJHQl9NQUtFKG1fQWxwaGEsIHIsIGcsIGIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPQkdST1JERVJESUIobV9Db2xvcik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPRElCKG1fQ29sb3IpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1fUmVkID0gcjsKLSAgICAgICAgICAgICAgICAgICAgbV9HcmVlbiA9IGc7Ci0gICAgICAgICAgICAgICAgICAgIG1fQmx1ZSA9IGI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9Db2xvciA9IEZYQVJHQl9UT0JHUk9SREVSRElCKGNvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fQ29sb3IgPSBGWEFSR0JfVE9ESUIoY29sb3IpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEFyZ2JEZWNvZGUoY29sb3IsIG1fQWxwaGEsIG1fUmVkLCBtX0dyZWVuLCBtX0JsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobV9wRGV2aWNlLT5HZXRCUFAoKSA9PSAxKSB7Ci0gICAgICAgICAgICBjb21wb3NpdGVfc3BhbiA9ICZDRlhfUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW4xYnBwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLX07Ci1GWF9CT09MIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlJlbmRlclJhc3Rlcml6ZXIoYWdnOjpyYXN0ZXJpemVyX3NjYW5saW5lX2FhJiByYXN0ZXJpemVyLCBGWF9EV09SRCBjb2xvciwgRlhfQk9PTCBiRnVsbENvdmVyLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0LAotICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBDRlhfRElCaXRtYXAqIHB0ID0gYkdyb3VwS25vY2tvdXQgPyBtX3BPcmlEZXZpY2UgOiBOVUxMOwotICAgIENGWF9SZW5kZXJlciByZW5kZXI7Ci0gICAgaWYgKCFyZW5kZXIuSW5pdChtX3BCaXRtYXAsIHB0LCBtX3BDbGlwUmduLCBjb2xvciwgYkZ1bGxDb3ZlciwgbV9iUmdiQnl0ZU9yZGVyLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGFnZzo6c2NhbmxpbmVfdTggc2NhbmxpbmU7Ci0gICAgYWdnOjpyZW5kZXJfc2NhbmxpbmVzKHJhc3Rlcml6ZXIsIHNjYW5saW5lLCByZW5kZXIsIChtX0ZpbGxGbGFncyAmIEZYRklMTF9OT1BBVEhTTU9PVEgpICE9IDApOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTAlDRlhfQWdnRGV2aWNlRHJpdmVyOjpEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0cm9rZV9jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAgIGlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChHZXRCdWZmZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBtX0ZpbGxGbGFncyA9IGZpbGxfbW9kZTsKLSAgICBpZiAoKGZpbGxfbW9kZSAmIDMpICYmIGZpbGxfY29sb3IpIHsKLSAgICAgICAgQ0FnZ19QYXRoRGF0YSBwYXRoX2RhdGE7Ci0gICAgICAgIHBhdGhfZGF0YS5CdWlsZFBhdGgocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSk7Ci0gICAgICAgIGFnZzo6cmFzdGVyaXplcl9zY2FubGluZV9hYSByYXN0ZXJpemVyOwotICAgICAgICByYXN0ZXJpemVyLmNsaXBfYm94KDAuMGYsIDAuMGYsIChGWF9GTE9BVCkoR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKSksIChGWF9GTE9BVCkoR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpKTsKLSAgICAgICAgcmFzdGVyaXplci5hZGRfcGF0aChwYXRoX2RhdGEubV9QYXRoRGF0YSk7Ci0gICAgICAgIHJhc3Rlcml6ZXIuZmlsbGluZ19ydWxlKChmaWxsX21vZGUgJiAzKSA9PSBGWEZJTExfV0lORElORyA/IGFnZzo6ZmlsbF9ub25femVybyA6IGFnZzo6ZmlsbF9ldmVuX29kZCk7Ci0gICAgICAgIGlmICghUmVuZGVyUmFzdGVyaXplcihyYXN0ZXJpemVyLCBmaWxsX2NvbG9yLCBmaWxsX21vZGUgJiBGWEZJTExfRlVMTENPVkVSLCBGQUxTRSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpbnQgc3Ryb2tlX2FscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/IEZYR0VURkxBR19BTFBIQV9TVFJPS0UoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShzdHJva2VfY29sb3IpOwotICAgIGlmIChwR3JhcGhTdGF0ZSAmJiBzdHJva2VfYWxwaGEpIHsKLSAgICAgICAgaWYgKGZpbGxfbW9kZSAmIEZYX1pFUk9BUkVBX0ZJTEwpIHsKLSAgICAgICAgICAgIENBZ2dfUGF0aERhdGEgcGF0aF9kYXRhOwotICAgICAgICAgICAgcGF0aF9kYXRhLkJ1aWxkUGF0aChwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlKTsKLSAgICAgICAgICAgIGFnZzo6cmFzdGVyaXplcl9zY2FubGluZV9hYSByYXN0ZXJpemVyOwotICAgICAgICAgICAgcmFzdGVyaXplci5jbGlwX2JveCgwLjBmLCAwLjBmLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCkpLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKSk7Ci0gICAgICAgICAgICBSYXN0ZXJpemVTdHJva2UocmFzdGVyaXplciwgcGF0aF9kYXRhLm1fUGF0aERhdGEsIE5VTEwsIHBHcmFwaFN0YXRlLCAxLCBGQUxTRSwgZmlsbF9tb2RlICYgRlhfU1RST0tFX1RFWFRfTU9ERSk7Ci0gICAgICAgICAgICBpbnQgZmlsbF9mbGFnID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA8PCA4IHwgRlhHRVRGTEFHX0FMUEhBX1NUUk9LRShhbHBoYV9mbGFnKTsKLSAgICAgICAgICAgIGlmICghUmVuZGVyUmFzdGVyaXplcihyYXN0ZXJpemVyLCBzdHJva2VfY29sb3IsIGZpbGxfbW9kZSAmIEZYRklMTF9GVUxMQ09WRVIsIG1fYkdyb3VwS25vY2tvdXQsIGZpbGxfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDEsIG1hdHJpeDI7Ci0gICAgICAgIGlmIChwT2JqZWN0MkRldmljZSkgewotICAgICAgICAgICAgbWF0cml4MS5hID0gRlhfTUFYKEZYU1lTX2ZhYnMocE9iamVjdDJEZXZpY2UtPmEpLCBGWFNZU19mYWJzKHBPYmplY3QyRGV2aWNlLT5iKSk7Ci0gICAgICAgICAgICBtYXRyaXgxLmQgPSBtYXRyaXgxLmE7Ci0gICAgICAgICAgICBtYXRyaXgyLlNldChwT2JqZWN0MkRldmljZS0+YSAvIG1hdHJpeDEuYSwgcE9iamVjdDJEZXZpY2UtPmIgLyBtYXRyaXgxLmEsCi0gICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0MkRldmljZS0+YyAvIG1hdHJpeDEuZCwgcE9iamVjdDJEZXZpY2UtPmQgLyBtYXRyaXgxLmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAwLCAwKTsKLSAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXggbXRSZXJ2ZXNlOwotICAgICAgICAgICAgbXRSZXJ2ZXNlLlNldFJldmVyc2UobWF0cml4Mik7Ci0gICAgICAgICAgICBtYXRyaXgxID0gKnBPYmplY3QyRGV2aWNlOwotICAgICAgICAgICAgbWF0cml4MS5Db25jYXQobXRSZXJ2ZXNlKTsKLSAgICAgICAgfQotICAgICAgICBDQWdnX1BhdGhEYXRhIHBhdGhfZGF0YTsKLSAgICAgICAgcGF0aF9kYXRhLkJ1aWxkUGF0aChwUGF0aERhdGEsICZtYXRyaXgxKTsKLSAgICAgICAgYWdnOjpyYXN0ZXJpemVyX3NjYW5saW5lX2FhIHJhc3Rlcml6ZXI7Ci0gICAgICAgIHJhc3Rlcml6ZXIuY2xpcF9ib3goMC4wZiwgMC4wZiwgKEZYX0ZMT0FUKShHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpKSwgKEZYX0ZMT0FUKShHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSkpOwotICAgICAgICBSYXN0ZXJpemVTdHJva2UocmFzdGVyaXplciwgcGF0aF9kYXRhLm1fUGF0aERhdGEsICZtYXRyaXgyLCBwR3JhcGhTdGF0ZSwgbWF0cml4MS5hLCBGQUxTRSwgZmlsbF9tb2RlICYgRlhfU1RST0tFX1RFWFRfTU9ERSk7Ci0gICAgICAgIGludCBmaWxsX2ZsYWcgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpIDw8IDggfCBGWEdFVEZMQUdfQUxQSEFfU1RST0tFKGFscGhhX2ZsYWcpOwotICAgICAgICBpZiAoIVJlbmRlclJhc3Rlcml6ZXIocmFzdGVyaXplciwgc3Ryb2tlX2NvbG9yLCBmaWxsX21vZGUgJiBGWEZJTExfRlVMTENPVkVSLCBtX2JHcm91cEtub2Nrb3V0LCBmaWxsX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci12b2lkIFJnYkJ5dGVPcmRlclNldFBpeGVsKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IHgsIGludCB5LCBGWF9EV09SRCBhcmdiKQotewotICAgIGlmICh4IDwgMCB8fCB4ID49IHBCaXRtYXAtPkdldFdpZHRoKCkgfHwgeSA8IDAgfHwgeSA+PSBwQml0bWFwLT5HZXRIZWlnaHQoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYX0xQQllURSBwb3MgPSAoRlhfQllURSopcEJpdG1hcC0+R2V0QnVmZmVyKCkgKyB5ICogcEJpdG1hcC0+R2V0UGl0Y2goKSArIHggKiBwQml0bWFwLT5HZXRCUFAoKSAvIDg7Ci0gICAgaWYgKHBCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgRlhBUkdCX1NFVFJHQk9SREVSRElCKHBvcywgQXJnYkdhbW1hKGFyZ2IpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgYWxwaGEgPSBGWEFSR0JfQShhcmdiKTsKLSAgICAgICAgcG9zWzBdID0gKEZYQVJHQl9SKGFyZ2IpICogYWxwaGEgKyBwb3NbMF0gKiAoMjU1IC0gYWxwaGEpKSAvIDI1NTsKLSAgICAgICAgcG9zWzFdID0gKEZYQVJHQl9HKGFyZ2IpICogYWxwaGEgKyBwb3NbMV0gKiAoMjU1IC0gYWxwaGEpKSAvIDI1NTsKLSAgICAgICAgcG9zWzJdID0gKEZYQVJHQl9CKGFyZ2IpICogYWxwaGEgKyBwb3NbMl0gKiAoMjU1IC0gYWxwaGEpKSAvIDI1NTsKLSAgICB9Ci19Ci12b2lkIFJnYkJ5dGVPcmRlckNvbXBvc2l0ZVJlY3QoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWF9BUkdCIGFyZ2IpCi17Ci0gICAgaW50IHNyY19hbHBoYSA9IEZYQVJHQl9BKGFyZ2IpOwotICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYX1JFQ1QgcmVjdChsZWZ0LCB0b3AsIGxlZnQgKyB3aWR0aCwgdG9wICsgaGVpZ2h0KTsKLSAgICByZWN0LkludGVyc2VjdCgwLCAwLCBwQml0bWFwLT5HZXRXaWR0aCgpLCBwQml0bWFwLT5HZXRIZWlnaHQoKSk7Ci0gICAgd2lkdGggPSByZWN0LldpZHRoKCk7Ci0gICAgaW50IHNyY19yID0gRlhBUkdCX1IoYXJnYiksIHNyY19nID0gRlhBUkdCX0coYXJnYiksIHNyY19iID0gRlhBUkdCX0IoYXJnYik7Ci0gICAgaW50IEJwcCA9IHBCaXRtYXAtPkdldEJQUCgpIC8gODsKLSAgICBGWF9CT09MIGJBbHBoYSA9IHBCaXRtYXAtPkhhc0FscGhhKCk7Ci0gICAgaW50IGRpYl9hcmdiID0gRlhBUkdCX1RPQkdST1JERVJESUIoYXJnYik7Ci0gICAgRlhfQllURSogcEJ1ZmZlciA9IHBCaXRtYXAtPkdldEJ1ZmZlcigpOwotICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IHJlY3QudG9wOyByb3cgPCByZWN0LmJvdHRvbTsgcm93ICsrKSB7Ci0gICAgICAgICAgICBGWF9MUEJZVEUgZGVzdF9zY2FuID0gcEJ1ZmZlciArIHJvdyAqIHBCaXRtYXAtPkdldFBpdGNoKCkgKyByZWN0LmxlZnQgKiBCcHA7Ci0gICAgICAgICAgICBpZiAoQnBwID09IDQpIHsKLSAgICAgICAgICAgICAgICBGWF9EV09SRCogc2NhbiA9IChGWF9EV09SRCopZGVzdF9zY2FuOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgKnNjYW4gKysgPSBkaWJfYXJnYjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiArKyA9IHNyY19yOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuICsrID0gc3JjX2c7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gKysgPSBzcmNfYjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzcmNfciA9IEZYX0dBTU1BKHNyY19yKTsKLSAgICBzcmNfZyA9IEZYX0dBTU1BKHNyY19nKTsKLSAgICBzcmNfYiA9IEZYX0dBTU1BKHNyY19iKTsKLSAgICBmb3IgKGludCByb3cgPSByZWN0LnRvcDsgcm93IDwgcmVjdC5ib3R0b207IHJvdyArKykgewotICAgICAgICBGWF9MUEJZVEUgZGVzdF9zY2FuID0gcEJ1ZmZlciArIHJvdyAqIHBCaXRtYXAtPkdldFBpdGNoKCkgKyByZWN0LmxlZnQgKiBCcHA7Ci0gICAgICAgIGlmIChiQWxwaGEpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBGWF9CWVRFIGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107Ci0gICAgICAgICAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBGWEFSR0JfU0VUUkdCT1JERVJESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShzcmNfYWxwaGEsIHNyY19yLCBzcmNfZywgc3JjX2IpKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGWF9CWVRFIGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoKmRlc3Rfc2NhbiksIHNyY19yLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQSgqZGVzdF9zY2FuKSwgc3JjX2csIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKCpkZXN0X3NjYW4pLCBzcmNfYiwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICAgICAgaWYgKEJwcCA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLXZvaWQgUmdiQnl0ZU9yZGVyVHJhbnNmZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCkKLXsKLSAgICBpZiAocEJpdG1hcCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcEJpdG1hcC0+R2V0T3ZlcmxhcFJlY3QoZGVzdF9sZWZ0LCBkZXN0X3RvcCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcC0+R2V0V2lkdGgoKSwgcFNyY0JpdG1hcC0+R2V0SGVpZ2h0KCksIHNyY19sZWZ0LCBzcmNfdG9wLCBOVUxMKTsKLSAgICBpZiAod2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludCBCcHAgPSBwQml0bWFwLT5HZXRCUFAoKSAvIDg7Ci0gICAgRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0ID0gcEJpdG1hcC0+R2V0Rm9ybWF0KCk7Ci0gICAgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQgPSBwU3JjQml0bWFwLT5HZXRGb3JtYXQoKTsKLSAgICBpbnQgcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpOwotICAgIEZYX0JZVEUqIGJ1ZmZlciA9IHBCaXRtYXAtPkdldEJ1ZmZlcigpOwotICAgIGlmIChkZXN0X2Zvcm1hdCA9PSBzcmNfZm9ybWF0KSB7Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICBGWF9MUEJZVEUgZGVzdF9zY2FuID0gYnVmZmVyICsgKGRlc3RfdG9wICsgcm93KSAqIHBpdGNoICsgZGVzdF9sZWZ0ICogQnBwOwotICAgICAgICAgICAgRlhfTFBCWVRFIHNyY19zY2FuID0gKEZYX0xQQllURSlwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogQnBwOwotICAgICAgICAgICAgaWYgKEJwcCA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0Uoc3JjX3NjYW5bM10sIHNyY19zY2FuWzBdLCBzcmNfc2NhblsxXSwgc3JjX3NjYW5bMl0pKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19zY2FuWzJdOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfc2NhblsxXTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3NjYW5bMF07Ci0gICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfTFBCWVRFIGRlc3RfYnVmID0gYnVmZmVyICsgZGVzdF90b3AgKiBwaXRjaCArIGRlc3RfbGVmdCAqIEJwcDsKLSAgICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfUmdiKSB7Ci0gICAgICAgIGlmIChzcmNfZm9ybWF0ID09IEZYRElCX1JnYjMyKSB7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIHBpdGNoOwotICAgICAgICAgICAgICAgIEZYX0xQQllURSBzcmNfc2NhbiA9IChGWF9CWVRFKilwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogNDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19zY2FuWzJdOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfc2NhblsxXTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3NjYW5bMF07Ci0gICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQVNTRVJUKEZBTFNFKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfQXJnYiB8fCBkZXN0X2Zvcm1hdCA9PSBGWERJQl9SZ2IzMikgewotICAgICAgICBpZiAoc3JjX2Zvcm1hdCA9PSBGWERJQl9SZ2IpIHsKLSAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgRlhfQllURSogZGVzdF9zY2FuID0gKEZYX0JZVEUqKShkZXN0X2J1ZiArIHJvdyAqIHBpdGNoKTsKLSAgICAgICAgICAgICAgICBGWF9MUEJZVEUgc3JjX3NjYW4gPSAoRlhfQllURSopcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdCAqIDM7Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19mb3JtYXQgPT0gRlhESUJfQXJnYikgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0UoMHhmZiwgRlhfR0FNTUEoc3JjX3NjYW5bMF0pLCBGWF9HQU1NQShzcmNfc2NhblsxXSksIEZYX0dBTU1BKHNyY19zY2FuWzJdKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKDB4ZmYsIHNyY19zY2FuWzBdLCBzcmNfc2NhblsxXSwgc3JjX3NjYW5bMl0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzcmNfZm9ybWF0ID09IEZYRElCX1JnYjMyKSB7Ci0gICAgICAgICAgICBBU1NFUlQoZGVzdF9mb3JtYXQgPT0gRlhESUJfQXJnYik7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIHBpdGNoOwotICAgICAgICAgICAgICAgIEZYX0xQQllURSBzcmNfc2NhbiA9IChGWF9MUEJZVEUpKHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiA0KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKDB4ZmYsIHNyY19zY2FuWzBdLCBzcmNfc2NhblsxXSwgc3JjX3NjYW5bMl0pKTsKLSAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFTU0VSVChGQUxTRSk7Ci0gICAgfQotfQotRlhfQVJHQiBfRGVmYXVsdENNWUsyQVJHQihGWF9DTVlLIGNteWssIEZYX0JZVEUgYWxwaGEpCi17Ci0gICAgRlhfQllURSByLCBnLCBiOwotICAgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUoY215ayksIEZYU1lTX0dldE1WYWx1ZShjbXlrKSwgRlhTWVNfR2V0WVZhbHVlKGNteWspLCBGWFNZU19HZXRLVmFsdWUoY215ayksCi0gICAgICAgICAgICAgICAgICAgICAgIHIsIGcsIGIpOwotICAgIHJldHVybiBBcmdiRW5jb2RlKGFscGhhLCByLCBnLCBiKTsKLX0KLUZYX0JPT0wgX0RpYlNldFBpeGVsKENGWF9ESUJpdG1hcCogcERldmljZSwgaW50IHgsIGludCB5LCBGWF9EV09SRCBjb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgRlhfQk9PTCBiT2JqQ01ZSyA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZyk7Ci0gICAgaW50IGFscGhhID0gYk9iakNNWUsgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKSA6IEZYQVJHQl9BKGNvbG9yKTsKLSAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgICAgIGNvbG9yID0gYk9iakNNWUsgPyBGWENNWUtfVE9ESUIoY29sb3IpIDogRlhBUkdCX1RPRElCKGNvbG9yKTsKLSAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKEZYX0xQQllURSkmY29sb3IsIChGWF9MUEJZVEUpJmNvbG9yLCAxKTsKLSAgICAgICAgY29sb3IgPSBiT2JqQ01ZSyA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOwotICAgICAgICBpZiAoIXBEZXZpY2UtPklzQ215a0ltYWdlKCkpIHsKLSAgICAgICAgICAgIGNvbG9yID0gKGNvbG9yICYgMHhmZmZmZmYpIHwgKGFscGhhIDw8IDI0KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChwRGV2aWNlLT5Jc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgICAgICBpZiAoIWJPYmpDTVlLKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGJPYmpDTVlLKSB7Ci0gICAgICAgICAgICAgICAgY29sb3IgPSBfRGVmYXVsdENNWUsyQVJHQihjb2xvciwgYWxwaGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHBEZXZpY2UtPlNldFBpeGVsKHgsIHksIGNvbG9yKTsKLSAgICBpZiAocERldmljZS0+bV9wQWxwaGFNYXNrKSB7Ci0gICAgICAgIHBEZXZpY2UtPm1fcEFscGhhTWFzay0+U2V0UGl4ZWwoeCwgeSwgYWxwaGEgPDwgMjQpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6U2V0UGl4ZWwoaW50IHgsIGludCB5LCBGWF9EV09SRCBjb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgaWYgKG1fcEJpdG1hcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKCFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpIHx8ICFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKSkgewotICAgICAgICBwSWNjVHJhbnNmb3JtID0gTlVMTDsKLSAgICB9Ci0gICAgaWYgKG1fcENsaXBSZ24gPT0gTlVMTCkgewotICAgICAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7Ci0gICAgICAgICAgICBSZ2JCeXRlT3JkZXJTZXRQaXhlbChtX3BCaXRtYXAsIHgsIHksIGNvbG9yKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBfRGliU2V0UGl4ZWwobV9wQml0bWFwLCB4LCB5LCBjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1fcENsaXBSZ24tPkdldEJveCgpLkNvbnRhaW5zKHgsIHkpKSB7Ci0gICAgICAgIGlmIChtX3BDbGlwUmduLT5HZXRUeXBlKCkgPT0gQ0ZYX0NsaXBSZ246OlJlY3RJKSB7Ci0gICAgICAgICAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7Ci0gICAgICAgICAgICAgICAgUmdiQnl0ZU9yZGVyU2V0UGl4ZWwobV9wQml0bWFwLCB4LCB5LCBjb2xvcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBfRGliU2V0UGl4ZWwobV9wQml0bWFwLCB4LCB5LCBjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobV9wQ2xpcFJnbi0+R2V0VHlwZSgpID09IENGWF9DbGlwUmduOjpNYXNrRikgewotICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwTWFzayA9IG1fcENsaXBSZ24tPkdldE1hc2soKTsKLSAgICAgICAgICAgIEZYX0JPT0wgYkNNWUsgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpOwotICAgICAgICAgICAgaW50IG5ld19hbHBoYSA9IGJDTVlLID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShjb2xvcik7Ci0gICAgICAgICAgICBuZXdfYWxwaGEgPSBuZXdfYWxwaGEgKiBwTWFzay0+R2V0U2NhbmxpbmUoeSlbeF0gLyAyNTU7Ci0gICAgICAgICAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7Ci0gICAgICAgICAgICAgICAgUmdiQnl0ZU9yZGVyU2V0UGl4ZWwobV9wQml0bWFwLCB4LCB5LCAoY29sb3IgJiAweGZmZmZmZikgfCAobmV3X2FscGhhIDw8IDI0KSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYkNNWUspIHsKLSAgICAgICAgICAgICAgICBGWFNFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnLCBuZXdfYWxwaGEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb2xvciA9IChjb2xvciAmIDB4ZmZmZmZmKSB8IChuZXdfYWxwaGEgPDwgMjQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIF9EaWJTZXRQaXhlbChtX3BCaXRtYXAsIHgsIHksIGNvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6RmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsIEZYX0RXT1JEIGZpbGxfY29sb3IsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKLXsKLSAgICBpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAobV9wQml0bWFwLT5HZXRCdWZmZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBGWF9SRUNUIGNsaXBfcmVjdDsKLSAgICBHZXRDbGlwQm94KCZjbGlwX3JlY3QpOwotICAgIEZYX1JFQ1QgZHJhd19yZWN0ID0gY2xpcF9yZWN0OwotICAgIGlmIChwUmVjdCkgewotICAgICAgICBkcmF3X3JlY3QuSW50ZXJzZWN0KCpwUmVjdCk7Ci0gICAgfQotICAgIGlmIChkcmF3X3JlY3QuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAobV9wQ2xpcFJnbiA9PSBOVUxMIHx8IG1fcENsaXBSZ24tPkdldFR5cGUoKSA9PSBDRlhfQ2xpcFJnbjo6UmVjdEkpIHsKLSAgICAgICAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgewotICAgICAgICAgICAgUmdiQnl0ZU9yZGVyQ29tcG9zaXRlUmVjdChtX3BCaXRtYXAsIGRyYXdfcmVjdC5sZWZ0LCBkcmF3X3JlY3QudG9wLCBkcmF3X3JlY3QuV2lkdGgoKSwgZHJhd19yZWN0LkhlaWdodCgpLCBmaWxsX2NvbG9yKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fcEJpdG1hcC0+Q29tcG9zaXRlUmVjdChkcmF3X3JlY3QubGVmdCwgZHJhd19yZWN0LnRvcCwgZHJhd19yZWN0LldpZHRoKCksIGRyYXdfcmVjdC5IZWlnaHQoKSwgZmlsbF9jb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIG1fcEJpdG1hcC0+Q29tcG9zaXRlTWFzayhkcmF3X3JlY3QubGVmdCwgZHJhd19yZWN0LnRvcCwgZHJhd19yZWN0LldpZHRoKCksIGRyYXdfcmVjdC5IZWlnaHQoKSwgKGNvbnN0IENGWF9ESUJpdG1hcCopbV9wQ2xpcFJnbi0+R2V0TWFzaygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2NvbG9yLCBkcmF3X3JlY3QubGVmdCAtIGNsaXBfcmVjdC5sZWZ0LCBkcmF3X3JlY3QudG9wIC0gY2xpcF9yZWN0LnRvcCwgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMLCBtX2JSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KQotewotICAgIGlmIChtX3BDbGlwUmduID09IE5VTEwpIHsKLSAgICAgICAgcFJlY3QtPmxlZnQgPSBwUmVjdC0+dG9wID0gMDsKLSAgICAgICAgcFJlY3QtPnJpZ2h0ID0gR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKTsKLSAgICAgICAgcFJlY3QtPmJvdHRvbSA9IEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgKnBSZWN0ID0gbV9wQ2xpcFJnbi0+R2V0Qm94KCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MCUNGWF9BZ2dEZXZpY2VEcml2ZXI6OkdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBGWF9CT09MIGJERWRnZSkKLXsKLSAgICBpZiAobV9wQml0bWFwLT5HZXRCdWZmZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAoYkRFZGdlKSB7Ci0gICAgICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKLSAgICAgICAgICAgIFJnYkJ5dGVPcmRlclRyYW5zZmVyQml0bWFwKHBCaXRtYXAsIDAsIDAsIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpLCBtX3BCaXRtYXAsIGxlZnQsIHRvcCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gcEJpdG1hcC0+VHJhbnNmZXJCaXRtYXAoMCwgMCwgcEJpdG1hcC0+R2V0V2lkdGgoKSwgcEJpdG1hcC0+R2V0SGVpZ2h0KCksIG1fcEJpdG1hcCwgbGVmdCwgdG9wLCBwSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgRlhfUkVDVCByZWN0KGxlZnQsIHRvcCwgbGVmdCArIHBCaXRtYXAtPkdldFdpZHRoKCksIHRvcCArIHBCaXRtYXAtPkdldEhlaWdodCgpKTsKLSAgICBDRlhfRElCaXRtYXAgKnBCYWNrID0gTlVMTDsKLSAgICBpZiAobV9wT3JpRGV2aWNlKSB7Ci0gICAgICAgIHBCYWNrID0gbV9wT3JpRGV2aWNlLT5DbG9uZSgmcmVjdCk7Ci0gICAgICAgIGlmICghcEJhY2spIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIHBCYWNrLT5Db21wb3NpdGVCaXRtYXAoMCwgMCwgcEJhY2stPkdldFdpZHRoKCksIHBCYWNrLT5HZXRIZWlnaHQoKSwgbV9wQml0bWFwLCAwLCAwKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwQmFjayA9IG1fcEJpdG1hcC0+Q2xvbmUoJnJlY3QpOwotICAgIH0KLSAgICBpZiAoIXBCYWNrKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBGWF9CT09MIGJSZXQgPSBUUlVFOwotICAgIGxlZnQgPSBsZWZ0ID49IDAgPyAwIDogbGVmdDsKLSAgICB0b3AgPSB0b3AgPj0gMCA/IDAgOiB0b3A7Ci0gICAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgewotICAgICAgICBSZ2JCeXRlT3JkZXJUcmFuc2ZlckJpdG1hcChwQml0bWFwLCAwLCAwLCByZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCksIHBCYWNrLCBsZWZ0LCB0b3ApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJSZXQgPSBwQml0bWFwLT5UcmFuc2ZlckJpdG1hcCgwLCAwLCByZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCksIHBCYWNrLCBsZWZ0LCB0b3AsIHBJY2NUcmFuc2Zvcm0pOwotICAgIH0KLSAgICBkZWxldGUgcEJhY2s7Ci0gICAgcmV0dXJuIGJSZXQ7Ci19Ci1GWF9CT09MCUNGWF9BZ2dEZXZpY2VEcml2ZXI6OlNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBhcmdiLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgaWYgKG1fcEJpdG1hcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKHBCaXRtYXAtPklzQWxwaGFNYXNrKCkpCi0gICAgICAgIHJldHVybiBtX3BCaXRtYXAtPkNvbXBvc2l0ZU1hc2sobGVmdCwgdG9wLCBwU3JjUmVjdC0+V2lkdGgoKSwgcFNyY1JlY3QtPkhlaWdodCgpLCBwQml0bWFwLCBhcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNSZWN0LT5sZWZ0LCBwU3JjUmVjdC0+dG9wLCBibGVuZF90eXBlLCBtX3BDbGlwUmduLCBtX2JSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwotICAgIHJldHVybiBtX3BCaXRtYXAtPkNvbXBvc2l0ZUJpdG1hcChsZWZ0LCB0b3AsIHBTcmNSZWN0LT5XaWR0aCgpLCBwU3JjUmVjdC0+SGVpZ2h0KCksIHBCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNSZWN0LT5sZWZ0LCBwU3JjUmVjdC0+dG9wLCBibGVuZF90eXBlLCBtX3BDbGlwUmduLCBtX2JSZ2JCeXRlT3JkZXIsIHBJY2NUcmFuc2Zvcm0pOwotfQotRlhfQk9PTAlDRlhfQWdnRGV2aWNlRHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGFyZ2IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKLSAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBGWF9EV09SRCBmbGFncywKLSAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQotewotICAgIGlmIChtX3BCaXRtYXAtPkdldEJ1ZmZlcigpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmIChkZXN0X3dpZHRoID09IHBTb3VyY2UtPkdldFdpZHRoKCkgJiYgZGVzdF9oZWlnaHQgPT0gcFNvdXJjZS0+R2V0SGVpZ2h0KCkpIHsKLSAgICAgICAgRlhfUkVDVCByZWN0KDAsIDAsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0KTsKLSAgICAgICAgcmV0dXJuIFNldERJQml0cyhwU291cmNlLCBhcmdiLCAmcmVjdCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgYmxlbmRfdHlwZSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci0gICAgfQotICAgIEZYX1JFQ1QgZGVzdF9yZWN0KGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3RfbGVmdCArIGRlc3Rfd2lkdGgsIGRlc3RfdG9wICsgZGVzdF9oZWlnaHQpOwotICAgIGRlc3RfcmVjdC5Ob3JtYWxpemUoKTsKLSAgICBGWF9SRUNUIGRlc3RfY2xpcCA9IGRlc3RfcmVjdDsKLSAgICBkZXN0X2NsaXAuSW50ZXJzZWN0KCpwQ2xpcFJlY3QpOwotICAgIENGWF9CaXRtYXBDb21wb3NlciBjb21wb3NlcjsKLSAgICBjb21wb3Nlci5Db21wb3NlKG1fcEJpdG1hcCwgbV9wQ2xpcFJnbiwgMjU1LCBhcmdiLCBkZXN0X2NsaXAsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIG1fYlJnYkJ5dGVPcmRlciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSk7Ci0gICAgZGVzdF9jbGlwLk9mZnNldCgtZGVzdF9yZWN0LmxlZnQsIC1kZXN0X3JlY3QudG9wKTsKLSAgICBDRlhfSW1hZ2VTdHJldGNoZXIgc3RyZXRjaGVyOwotICAgIGlmIChzdHJldGNoZXIuU3RhcnQoJmNvbXBvc2VyLCBwU291cmNlLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgZGVzdF9jbGlwLCBmbGFncykpIHsKLSAgICAgICAgc3RyZXRjaGVyLkNvbnRpbnVlKE5VTEwpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wJQ0ZYX0FnZ0RldmljZURyaXZlcjo6U3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgYXJnYiwKLSAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgcmVuZGVyX2ZsYWdzLCBGWF9MUFZPSUQmIGhhbmRsZSwKLSAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQotewotICAgIGlmIChtX3BCaXRtYXAtPkdldEJ1ZmZlcigpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIENGWF9JbWFnZVJlbmRlcmVyKiBwUmVuZGVyZXIgPSBuZXcgQ0ZYX0ltYWdlUmVuZGVyZXI7Ci0gICAgcFJlbmRlcmVyLT5TdGFydChtX3BCaXRtYXAsIG1fcENsaXBSZ24sIHBTb3VyY2UsIGJpdG1hcF9hbHBoYSwgYXJnYiwgcE1hdHJpeCwgcmVuZGVyX2ZsYWdzLCBtX2JSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwotICAgIGhhbmRsZSA9IHBSZW5kZXJlcjsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wJQ0ZYX0FnZ0RldmljZURyaXZlcjo6Q29udGludWVESUJpdHMoRlhfTFBWT0lEIHBIYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIGlmIChtX3BCaXRtYXAtPkdldEJ1ZmZlcigpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHJldHVybiAoKENGWF9JbWFnZVJlbmRlcmVyKilwSGFuZGxlKS0+Q29udGludWUocFBhdXNlKTsKLX0KLXZvaWQgQ0ZYX0FnZ0RldmljZURyaXZlcjo6Q2FuY2VsRElCaXRzKEZYX0xQVk9JRCBwSGFuZGxlKQotewotICAgIGlmIChtX3BCaXRtYXAtPkdldEJ1ZmZlcigpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBkZWxldGUgKENGWF9JbWFnZVJlbmRlcmVyKilwSGFuZGxlOwotfQotQ0ZYX0Z4Z2VEZXZpY2U6OkNGWF9GeGdlRGV2aWNlKCkKLXsKLSAgICBtX2JPd25lZEJpdG1hcCA9IEZBTFNFOwotfQotRlhfQk9PTCBDRlhfRnhnZURldmljZTo6QXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRpdGhlcl9iaXRzLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwgRlhfQk9PTCBiR3JvdXBLbm9ja291dCkKLXsKLSAgICBpZiAocEJpdG1hcCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgU2V0Qml0bWFwKHBCaXRtYXApOwotICAgIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPSBuZXcgQ0ZYX0FnZ0RldmljZURyaXZlcihwQml0bWFwLCBkaXRoZXJfYml0cywgYlJnYkJ5dGVPcmRlciwgcE9yaURldmljZSwgYkdyb3VwS25vY2tvdXQpOwotICAgIFNldERldmljZURyaXZlcihwRHJpdmVyKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0ZYX0Z4Z2VEZXZpY2U6OkNyZWF0ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQsIGludCBkaXRoZXJfYml0cywgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlKQotewotICAgIG1fYk93bmVkQml0bWFwID0gVFJVRTsKLSAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOwotICAgIGlmICghcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCkpIHsKLSAgICAgICAgZGVsZXRlIHBCaXRtYXA7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgU2V0Qml0bWFwKHBCaXRtYXApOwotICAgIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPSBuZXcgQ0ZYX0FnZ0RldmljZURyaXZlcihwQml0bWFwLCBkaXRoZXJfYml0cywgRkFMU0UsIHBPcmlEZXZpY2UsIEZBTFNFKTsKLSAgICBTZXREZXZpY2VEcml2ZXIocERyaXZlcik7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1DRlhfRnhnZURldmljZTo6fkNGWF9GeGdlRGV2aWNlKCkKLXsKLSAgICBpZiAobV9iT3duZWRCaXRtYXAgJiYgR2V0Qml0bWFwKCkpIHsKLSAgICAgICAgZGVsZXRlIEdldEJpdG1hcCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYWdnL2FnZzIzL2Z4X2FnZ19wYXRoX3N0b3JhZ2UuY3BwIGIvY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvZnhfYWdnX3BhdGhfc3RvcmFnZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MmQ0YmEuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvZnhfYWdnX3BhdGhfc3RvcmFnZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gWFlROiAyMDA2LTAxLTIyIENvcGllZCBmcm9tIEFHRyBwcm9qZWN0LgotLy8gVE9ETzogVGhpcyBmaWxlIHVzZXMgaW50ZW5zaXZlIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnMsIHNvIGl0J3MgTk9UIHN1aXRhYmxlCi0vLyBmb3IgcGxhdGZvcm1zIGxpa2UgU3ltYmlhbiBPUy4gV2UgbmVlZCB0byBjaGFuZ2UgdG8gRklYIGZvcm1hdC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBBbnRpLUdyYWluIEdlb21ldHJ5IC0gVmVyc2lvbiAyLjMKLS8vIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IE1heGltIFNoZW1hbmFyZXYgKGh0dHA6Ly93d3cuYW50aWdyYWluLmNvbSkKLS8vCi0vLyBQZXJtaXNzaW9uIHRvIGNvcHksIHVzZSwgbW9kaWZ5LCBzZWxsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKLS8vIGlzIGdyYW50ZWQgcHJvdmlkZWQgdGhpcyBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcy4KLS8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAotLy8gd2FycmFudHksIGFuZCB3aXRoIG5vIGNsYWltIGFzIHRvIGl0cyBzdWl0YWJpbGl0eSBmb3IgYW55IHB1cnBvc2UuCi0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb250YWN0OiBtY3NlZW1AYW50aWdyYWluLmNvbQotLy8gICAgICAgICAgbWNzZWVtYWdnQHlhaG9vLmNvbQotLy8gICAgICAgICAgaHR0cDovL3d3dy5hbnRpZ3JhaW4uY29tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBDbGFzcyBwYXRoX3N0b3JhZ2UKLS8vCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpbmNsdWRlICIuLi8uLi8uLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0jaW5jbHVkZSAiYWdnX3BhdGhfc3RvcmFnZS5oIgotI2luY2x1ZGUgImFnZ19tYXRoLmgiCi1uYW1lc3BhY2UgYWdnCi17Ci1wYXRoX3N0b3JhZ2U6On5wYXRoX3N0b3JhZ2UoKQotewotICAgIGlmKG1fdG90YWxfYmxvY2tzKSB7Ci0gICAgICAgIEZYX0ZMT0FUKiogY29vcmRfYmxrID0gbV9jb29yZF9ibG9ja3MgKyBtX3RvdGFsX2Jsb2NrcyAtIDE7Ci0gICAgICAgIHdoaWxlKG1fdG90YWxfYmxvY2tzLS0pIHsKLSAgICAgICAgICAgIEZYX0ZyZWUoKmNvb3JkX2Jsayk7Ci0gICAgICAgICAgICAtLWNvb3JkX2JsazsKLSAgICAgICAgfQotICAgICAgICBGWF9GcmVlKG1fY29vcmRfYmxvY2tzKTsKLSAgICB9Ci19Ci1wYXRoX3N0b3JhZ2U6OnBhdGhfc3RvcmFnZSgpIDoKLSAgICBtX3RvdGFsX3ZlcnRpY2VzKDApLAotICAgIG1fdG90YWxfYmxvY2tzKDApLAotICAgIG1fbWF4X2Jsb2NrcygwKSwKLSAgICBtX2Nvb3JkX2Jsb2NrcygwKSwKLSAgICBtX2NtZF9ibG9ja3MoMCksCi0gICAgbV9pdGVyYXRvcigwKQotewotfQotdm9pZCBwYXRoX3N0b3JhZ2U6OmFsbG9jYXRlX2Jsb2NrKHVuc2lnbmVkIG5iKQotewotICAgIGlmKG5iID49IG1fbWF4X2Jsb2NrcykgewotICAgICAgICBGWF9GTE9BVCoqIG5ld19jb29yZHMgPQotICAgICAgICAgICAgRlhfQWxsb2MyRChGWF9GTE9BVCosIG1fbWF4X2Jsb2NrcyArIGJsb2NrX3Bvb2wsIDIpOwotICAgICAgICB1bnNpZ25lZCBjaGFyKiogbmV3X2NtZHMgPQotICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIqKikobmV3X2Nvb3JkcyArIG1fbWF4X2Jsb2NrcyArIGJsb2NrX3Bvb2wpOwotICAgICAgICBpZihtX2Nvb3JkX2Jsb2NrcykgewotICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIobmV3X2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fY29vcmRfYmxvY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9tYXhfYmxvY2tzICogc2l6ZW9mKEZYX0ZMT0FUKikpOwotICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIobmV3X2NtZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NtZF9ibG9ja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtX21heF9ibG9ja3MgKiBzaXplb2YodW5zaWduZWQgY2hhciopKTsKLSAgICAgICAgICAgIEZYX0ZyZWUobV9jb29yZF9ibG9ja3MpOwotICAgICAgICB9Ci0gICAgICAgIG1fY29vcmRfYmxvY2tzID0gbmV3X2Nvb3JkczsKLSAgICAgICAgbV9jbWRfYmxvY2tzID0gbmV3X2NtZHM7Ci0gICAgICAgIG1fbWF4X2Jsb2NrcyArPSBibG9ja19wb29sOwotICAgIH0KLSAgICBtX2Nvb3JkX2Jsb2Nrc1tuYl0gPQotICAgICAgICBGWF9BbGxvYyggRlhfRkxPQVQsIGJsb2NrX3NpemUgKiAyICsKLSAgICAgICAgICAgICAgICAgIGJsb2NrX3NpemUgLwotICAgICAgICAgICAgICAgICAgKHNpemVvZihGWF9GTE9BVCkgLyBzaXplb2YodW5zaWduZWQgY2hhcikpKTsKLSAgICBtX2NtZF9ibG9ja3NbbmJdICA9Ci0gICAgICAgICh1bnNpZ25lZCBjaGFyKikobV9jb29yZF9ibG9ja3NbbmJdICsgYmxvY2tfc2l6ZSAqIDIpOwotICAgIG1fdG90YWxfYmxvY2tzKys7Ci19Ci12b2lkIHBhdGhfc3RvcmFnZTo6cmV3aW5kKHVuc2lnbmVkIHBhdGhfaWQpCi17Ci0gICAgbV9pdGVyYXRvciA9IHBhdGhfaWQ7Ci19Ci12b2lkIHBhdGhfc3RvcmFnZTo6Y3VydmU0KEZYX0ZMT0FUIHhfY3RybDEsIEZYX0ZMT0FUIHlfY3RybDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHhfY3RybDIsIEZYX0ZMT0FUIHlfY3RybDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHhfdG8sICAgIEZYX0ZMT0FUIHlfdG8pCi17Ci0gICAgYWRkX3ZlcnRleCh4X2N0cmwxLCB5X2N0cmwxLCBwYXRoX2NtZF9jdXJ2ZTQpOwotICAgIGFkZF92ZXJ0ZXgoeF9jdHJsMiwgeV9jdHJsMiwgcGF0aF9jbWRfY3VydmU0KTsKLSAgICBhZGRfdmVydGV4KHhfdG8sICAgIHlfdG8sICAgIHBhdGhfY21kX2N1cnZlNCk7Ci19Ci12b2lkIHBhdGhfc3RvcmFnZTo6ZW5kX3BvbHkoKQotewotICAgIGlmKG1fdG90YWxfdmVydGljZXMpIHsKLSAgICAgICAgaWYoaXNfdmVydGV4KGNvbW1hbmQobV90b3RhbF92ZXJ0aWNlcyAtIDEpKSkgewotICAgICAgICAgICAgYWRkX3ZlcnRleCgwLCAwLCBwYXRoX2NtZF9lbmRfcG9seSB8IHBhdGhfZmxhZ3NfY2xvc2UpOwotICAgICAgICB9Ci0gICAgfQotfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvZnhfYWdnX3Jhc3Rlcml6ZXJfc2NhbmxpbmVfYWEuY3BwIGIvY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvZnhfYWdnX3Jhc3Rlcml6ZXJfc2NhbmxpbmVfYWEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzMyZDk2Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Z2UvYWdnL2FnZzIzL2Z4X2FnZ19yYXN0ZXJpemVyX3NjYW5saW5lX2FhLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ4OSArMCwwIEBACi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gWFlROiAyMDA2LTAxLTIyIENvcGllZCBmcm9tIEFHRyBwcm9qZWN0LgotLy8gVGhpcyBmaWxlIHVzZXMgb25seSBpbnRlZ2VyIGRhdGEsIHNvIGl0J3Mgc3VpdGFibGUgZm9yIGFsbCBwbGF0Zm9ybXMuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQW50aS1HcmFpbiBHZW9tZXRyeSAtIFZlcnNpb24gMi4zCi0vLyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBNYXhpbSBTaGVtYW5hcmV2IChodHRwOi8vd3d3LmFudGlncmFpbi5jb20pCi0vLwotLy8gUGVybWlzc2lvbiB0byBjb3B5LCB1c2UsIG1vZGlmeSwgc2VsbCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCi0vLyBpcyBncmFudGVkIHByb3ZpZGVkIHRoaXMgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMuCi0vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKLS8vIHdhcnJhbnR5LCBhbmQgd2l0aCBubyBjbGFpbSBhcyB0byBpdHMgc3VpdGFiaWxpdHkgZm9yIGFueSBwdXJwb3NlLgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFRoZSBhdXRob3IgZ3JhdGVmdWxseSBhY2tub3dsZWdlcyB0aGUgc3VwcG9ydCBvZiBEYXZpZCBUdXJuZXIsCi0vLyBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnIC0gdGhlIGF1dGhvcnMgb2YgdGhlIEZyZWVUeXBlCi0vLyBsaWJyYXkgLSBpbiBwcm9kdWNpbmcgdGhpcyB3b3JrLiBTZWUgaHR0cDovL3d3dy5mcmVldHlwZS5vcmcgZm9yIGRldGFpbHMuCi0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb250YWN0OiBtY3NlZW1AYW50aWdyYWluLmNvbQotLy8gICAgICAgICAgbWNzZWVtYWdnQHlhaG9vLmNvbQotLy8gICAgICAgICAgaHR0cDovL3d3dy5hbnRpZ3JhaW4uY29tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBBZGFwdGF0aW9uIGZvciAzMi1iaXQgc2NyZWVuIGNvb3JkaW5hdGVzIGhhcyBiZWVuIHNwb25zb3JlZCBieQotLy8gTGliZXJ0eSBUZWNobm9sb2d5IFN5c3RlbXMsIEluYy4sIHZpc2l0IGh0dHA6Ly9saWItc3lzLmNvbQotLy8KLS8vIExpYmVydHkgVGVjaG5vbG9neSBTeXN0ZW1zLCBJbmMuIGlzIHRoZSBwcm92aWRlciBvZgotLy8gUG9zdFNjcmlwdCBhbmQgUERGIHRlY2hub2xvZ3kgZm9yIHNvZnR3YXJlIGRldmVsb3BlcnMuCi0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gQ2xhc3Mgb3V0bGluZV9hYSAtIGltcGxlbWVudGF0aW9uLgotLy8KLS8vIEluaXRpYWxseSB0aGUgcmVuZGVyaW5nIGFsZ29yaXRobSB3YXMgZGVzaWduZWQgYnkgRGF2aWQgVHVybmVyIGFuZCB0aGUKLS8vIG90aGVyIGF1dGhvcnMgb2YgdGhlIEZyZWVUeXBlIGxpYnJhcnkgLSBzZWUgdGhlIGFib3ZlIG5vdGljZS4gSSBuZWFybHkKLS8vIGNyZWF0ZWQgYSBzaW1pbGFyIHJlbmRlcmVyLCBidXQgc3RpbGwgSSB3YXMgZmFyIGZyb20gRGF2aWQncyB3b3JrLgotLy8gSSBjb21wbGV0ZWx5IHJlZGVzaWduZWQgdGhlIG9yaWdpbmFsIGNvZGUgYW5kIGFkYXB0ZWQgaXQgZm9yIEFudGktR3JhaW4KLS8vIGlkZWFzLiBUd28gZnVuY3Rpb25zIC0gcmVuZGVyX2xpbmUgYW5kIHJlbmRlcl9obGluZSBhcmUgdGhlIGNvcmUgb2YKLS8vIHRoZSBhbGdvcml0aG0gLSB0aGV5IGNhbGN1bGF0ZSB0aGUgZXhhY3QgY292ZXJhZ2Ugb2YgZWFjaCBwaXhlbCBjZWxsCi0vLyBvZiB0aGUgcG9seWdvbi4gSSBsZWZ0IHRoZXNlIGZ1bmN0aW9ucyBhbG1vc3QgYXMgaXMsIGJlY2F1c2UgdGhlcmUncwotLy8gbm8gd2F5IHRvIGltcHJvdmUgdGhlIHBlcmZlY3Rpb24gLSBoYXRzIG9mZiB0byBEYXZpZCBhbmQgaGlzIGdyb3VwIQotLy8KLS8vIEFsbCBvdGhlciBjb2RlIGlzIHZlcnkgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsLgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2luY2x1ZGUgIi4uLy4uLy4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfZXh0LmgiCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSAiYWdnX3Jhc3Rlcml6ZXJfc2NhbmxpbmVfYWEuaCIKLW5hbWVzcGFjZSBhZ2cKLXsKLUFHR19JTkxJTkUgdm9pZCBjZWxsX2FhOjpzZXRfY292ZXIoaW50IGMsIGludCBhKQotewotICAgIGNvdmVyID0gYzsKLSAgICBhcmVhID0gYTsKLX0KLUFHR19JTkxJTkUgdm9pZCBjZWxsX2FhOjphZGRfY292ZXIoaW50IGMsIGludCBhKQotewotICAgIGNvdmVyICs9IGM7Ci0gICAgYXJlYSArPSBhOwotfQotQUdHX0lOTElORSB2b2lkIGNlbGxfYWE6OnNldF9jb29yZChpbnQgY3gsIGludCBjeSkKLXsKLSAgICB4ID0gY3g7Ci0gICAgeSA9IGN5OwotfQotQUdHX0lOTElORSB2b2lkIGNlbGxfYWE6OnNldChpbnQgY3gsIGludCBjeSwgaW50IGMsIGludCBhKQotewotICAgIHggPSBjeDsKLSAgICB5ID0gY3k7Ci0gICAgY292ZXIgPSBjOwotICAgIGFyZWEgPSBhOwotfQotb3V0bGluZV9hYTo6fm91dGxpbmVfYWEoKQotewotICAgIGlmKG1fbnVtX2Jsb2NrcykgewotICAgICAgICBjZWxsX2FhKiogcHRyID0gbV9jZWxscyArIG1fbnVtX2Jsb2NrcyAtIDE7Ci0gICAgICAgIHdoaWxlKG1fbnVtX2Jsb2Nrcy0tKSB7Ci0gICAgICAgICAgICBGWF9GcmVlKCpwdHIpOwotICAgICAgICAgICAgcHRyLS07Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRnJlZShtX2NlbGxzKTsKLSAgICB9Ci19Ci1vdXRsaW5lX2FhOjpvdXRsaW5lX2FhKCkgOgotICAgIG1fbnVtX2Jsb2NrcygwKSwKLSAgICBtX21heF9ibG9ja3MoMCksCi0gICAgbV9jdXJfYmxvY2soMCksCi0gICAgbV9udW1fY2VsbHMoMCksCi0gICAgbV9jZWxscygwKSwKLSAgICBtX2N1cl9jZWxsX3B0cigwKSwKLSAgICBtX2N1cl94KDApLAotICAgIG1fY3VyX3koMCksCi0gICAgbV9taW5feCgweDdGRkZGRkZGKSwKLSAgICBtX21pbl95KDB4N0ZGRkZGRkYpLAotICAgIG1fbWF4X3goLTB4N0ZGRkZGRkYpLAotICAgIG1fbWF4X3koLTB4N0ZGRkZGRkYpLAotICAgIG1fc29ydGVkKGZhbHNlKQotewotICAgIG1fY3VyX2NlbGwuc2V0KDB4N0ZGRiwgMHg3RkZGLCAwLCAwKTsKLX0KLXZvaWQgb3V0bGluZV9hYTo6cmVzZXQoKQotewotICAgIG1fbnVtX2NlbGxzID0gMDsKLSAgICBtX2N1cl9ibG9jayA9IDA7Ci0gICAgbV9jdXJfY2VsbC5zZXQoMHg3RkZGLCAweDdGRkYsIDAsIDApOwotICAgIG1fc29ydGVkID0gZmFsc2U7Ci0gICAgbV9taW5feCA9ICAweDdGRkZGRkZGOwotICAgIG1fbWluX3kgPSAgMHg3RkZGRkZGRjsKLSAgICBtX21heF94ID0gLTB4N0ZGRkZGRkY7Ci0gICAgbV9tYXhfeSA9IC0weDdGRkZGRkZGOwotfQotdm9pZCBvdXRsaW5lX2FhOjphbGxvY2F0ZV9ibG9jaygpCi17Ci0gICAgaWYobV9jdXJfYmxvY2sgPj0gbV9udW1fYmxvY2tzKSB7Ci0gICAgICAgIGlmKG1fbnVtX2Jsb2NrcyA+PSBtX21heF9ibG9ja3MpIHsKLSAgICAgICAgICAgIGNlbGxfYWEqKiBuZXdfY2VsbHMgPSBGWF9BbGxvYyggY2VsbF9hYSosIG1fbWF4X2Jsb2NrcyArIGNlbGxfYmxvY2tfcG9vbCk7Ci0gICAgICAgICAgICBpZihtX2NlbGxzKSB7Ci0gICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIobmV3X2NlbGxzLCBtX2NlbGxzLCBtX21heF9ibG9ja3MgKiBzaXplb2YoY2VsbF9hYSopKTsKLSAgICAgICAgICAgICAgICBGWF9GcmVlKG1fY2VsbHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9jZWxscyA9IG5ld19jZWxsczsKLSAgICAgICAgICAgIG1fbWF4X2Jsb2NrcyArPSBjZWxsX2Jsb2NrX3Bvb2w7Ci0gICAgICAgIH0KLSAgICAgICAgbV9jZWxsc1ttX251bV9ibG9ja3MrK10gPSBGWF9BbGxvYyhjZWxsX2FhLCBjZWxsX2Jsb2NrX3NpemUpOwotICAgIH0KLSAgICBtX2N1cl9jZWxsX3B0ciA9IG1fY2VsbHNbbV9jdXJfYmxvY2srK107Ci19Ci1BR0dfSU5MSU5FIHZvaWQgb3V0bGluZV9hYTo6YWRkX2N1cl9jZWxsKCkKLXsKLSAgICBpZihtX2N1cl9jZWxsLmFyZWEgfCBtX2N1cl9jZWxsLmNvdmVyKSB7Ci0gICAgICAgIGlmKChtX251bV9jZWxscyAmIGNlbGxfYmxvY2tfbWFzaykgPT0gMCkgewotICAgICAgICAgICAgaWYobV9udW1fYmxvY2tzID49IGNlbGxfYmxvY2tfbGltaXQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhbGxvY2F0ZV9ibG9jaygpOwotICAgICAgICB9Ci0gICAgICAgICptX2N1cl9jZWxsX3B0cisrID0gbV9jdXJfY2VsbDsKLSAgICAgICAgKyttX251bV9jZWxsczsKLSAgICB9Ci19Ci1BR0dfSU5MSU5FIHZvaWQgb3V0bGluZV9hYTo6c2V0X2N1cl9jZWxsKGludCB4LCBpbnQgeSkKLXsKLSAgICBpZihtX2N1cl9jZWxsLnggIT0geCB8fCBtX2N1cl9jZWxsLnkgIT0geSkgewotICAgICAgICBhZGRfY3VyX2NlbGwoKTsKLSAgICAgICAgbV9jdXJfY2VsbC5zZXQoeCwgeSwgMCwgMCk7Ci0gICAgICAgIGlmKHggPCBtX21pbl94KSB7Ci0gICAgICAgICAgICBtX21pbl94ID0geDsKLSAgICAgICAgfQotICAgICAgICBpZih4ID4gbV9tYXhfeCkgewotICAgICAgICAgICAgbV9tYXhfeCA9IHg7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoeSA8IG1fbWluX3kpIHsKLSAgICAgICAgICAgIG1fbWluX3kgPSB5OwotICAgICAgICB9Ci0gICAgICAgIGlmKHkgPiBtX21heF95KSB7Ci0gICAgICAgICAgICBtX21heF95ID0geTsKLSAgICAgICAgfQotICAgIH0KLX0KLUFHR19JTkxJTkUgdm9pZCBvdXRsaW5lX2FhOjpyZW5kZXJfaGxpbmUoaW50IGV5LCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpCi17Ci0gICAgaW50IGV4MSA9IHgxID4+IHBvbHlfYmFzZV9zaGlmdDsKLSAgICBpbnQgZXgyID0geDIgPj4gcG9seV9iYXNlX3NoaWZ0OwotICAgIGludCBmeDEgPSB4MSAmIHBvbHlfYmFzZV9tYXNrOwotICAgIGludCBmeDIgPSB4MiAmIHBvbHlfYmFzZV9tYXNrOwotICAgIGludCBkZWx0YSwgcCwgZmlyc3QsIGR4OwotICAgIGludCBpbmNyLCBsaWZ0LCBtb2QsIHJlbTsKLSAgICBpZih5MSA9PSB5MikgewotICAgICAgICBzZXRfY3VyX2NlbGwoZXgyLCBleSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYoZXgxID09IGV4MikgewotICAgICAgICBkZWx0YSA9IHkyIC0geTE7Ci0gICAgICAgIG1fY3VyX2NlbGwuYWRkX2NvdmVyKGRlbHRhLCAoZngxICsgZngyKSAqIGRlbHRhKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwICAgICA9IChwb2x5X2Jhc2Vfc2l6ZSAtIGZ4MSkgKiAoeTIgLSB5MSk7Ci0gICAgZmlyc3QgPSBwb2x5X2Jhc2Vfc2l6ZTsKLSAgICBpbmNyICA9IDE7Ci0gICAgZHggPSB4MiAtIHgxOwotICAgIGlmKGR4IDwgMCkgewotICAgICAgICBwICAgICA9IGZ4MSAqICh5MiAtIHkxKTsKLSAgICAgICAgZmlyc3QgPSAwOwotICAgICAgICBpbmNyICA9IC0xOwotICAgICAgICBkeCAgICA9IC1keDsKLSAgICB9Ci0gICAgZGVsdGEgPSBwIC8gZHg7Ci0gICAgbW9kICAgPSBwICUgZHg7Ci0gICAgaWYobW9kIDwgMCkgewotICAgICAgICBkZWx0YS0tOwotICAgICAgICBtb2QgKz0gZHg7Ci0gICAgfQotICAgIG1fY3VyX2NlbGwuYWRkX2NvdmVyKGRlbHRhLCAoZngxICsgZmlyc3QpICogZGVsdGEpOwotICAgIGV4MSArPSBpbmNyOwotICAgIHNldF9jdXJfY2VsbChleDEsIGV5KTsKLSAgICB5MSAgKz0gZGVsdGE7Ci0gICAgaWYoZXgxICE9IGV4MikgewotICAgICAgICBwICAgICA9IHBvbHlfYmFzZV9zaXplICogKHkyIC0geTEgKyBkZWx0YSk7Ci0gICAgICAgIGxpZnQgID0gcCAvIGR4OwotICAgICAgICByZW0gICA9IHAgJSBkeDsKLSAgICAgICAgaWYgKHJlbSA8IDApIHsKLSAgICAgICAgICAgIGxpZnQtLTsKLSAgICAgICAgICAgIHJlbSArPSBkeDsKLSAgICAgICAgfQotICAgICAgICBtb2QgLT0gZHg7Ci0gICAgICAgIHdoaWxlIChleDEgIT0gZXgyKSB7Ci0gICAgICAgICAgICBkZWx0YSA9IGxpZnQ7Ci0gICAgICAgICAgICBtb2QgICs9IHJlbTsKLSAgICAgICAgICAgIGlmKG1vZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgbW9kIC09IGR4OwotICAgICAgICAgICAgICAgIGRlbHRhKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2N1cl9jZWxsLmFkZF9jb3ZlcihkZWx0YSwgKHBvbHlfYmFzZV9zaXplKSAqIGRlbHRhKTsKLSAgICAgICAgICAgIHkxICArPSBkZWx0YTsKLSAgICAgICAgICAgIGV4MSArPSBpbmNyOwotICAgICAgICAgICAgc2V0X2N1cl9jZWxsKGV4MSwgZXkpOwotICAgICAgICB9Ci0gICAgfQotICAgIGRlbHRhID0geTIgLSB5MTsKLSAgICBtX2N1cl9jZWxsLmFkZF9jb3ZlcihkZWx0YSwgKGZ4MiArIHBvbHlfYmFzZV9zaXplIC0gZmlyc3QpICogZGVsdGEpOwotfQotdm9pZCBvdXRsaW5lX2FhOjpyZW5kZXJfbGluZShpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpCi17Ci0gICAgZW51bSBkeF9saW1pdF9lIHsgZHhfbGltaXQgPSAxNjM4NCA8PCBwb2x5X2Jhc2Vfc2hpZnQgfTsKLSAgICBpbnQgZHggPSB4MiAtIHgxOwotICAgIGlmKGR4ID49IGR4X2xpbWl0IHx8IGR4IDw9IC1keF9saW1pdCkgewotICAgICAgICBpbnQgY3ggPSAoeDEgKyB4MikgPj4gMTsKLSAgICAgICAgaW50IGN5ID0gKHkxICsgeTIpID4+IDE7Ci0gICAgICAgIHJlbmRlcl9saW5lKHgxLCB5MSwgY3gsIGN5KTsKLSAgICAgICAgcmVuZGVyX2xpbmUoY3gsIGN5LCB4MiwgeTIpOwotICAgIH0KLSAgICBpbnQgZHkgPSB5MiAtIHkxOwotICAgIGludCBleTEgPSB5MSA+PiBwb2x5X2Jhc2Vfc2hpZnQ7Ci0gICAgaW50IGV5MiA9IHkyID4+IHBvbHlfYmFzZV9zaGlmdDsKLSAgICBpbnQgZnkxID0geTEgJiBwb2x5X2Jhc2VfbWFzazsKLSAgICBpbnQgZnkyID0geTIgJiBwb2x5X2Jhc2VfbWFzazsKLSAgICBpbnQgeF9mcm9tLCB4X3RvOwotICAgIGludCBwLCByZW0sIG1vZCwgbGlmdCwgZGVsdGEsIGZpcnN0LCBpbmNyOwotICAgIGlmKGV5MSA9PSBleTIpIHsKLSAgICAgICAgcmVuZGVyX2hsaW5lKGV5MSwgeDEsIGZ5MSwgeDIsIGZ5Mik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW5jciAgPSAxOwotICAgIGlmKGR4ID09IDApIHsKLSAgICAgICAgaW50IGV4ID0geDEgPj4gcG9seV9iYXNlX3NoaWZ0OwotICAgICAgICBpbnQgdHdvX2Z4ID0gKHgxIC0gKGV4IDw8IHBvbHlfYmFzZV9zaGlmdCkpIDw8IDE7Ci0gICAgICAgIGludCBhcmVhOwotICAgICAgICBmaXJzdCA9IHBvbHlfYmFzZV9zaXplOwotICAgICAgICBpZihkeSA8IDApIHsKLSAgICAgICAgICAgIGZpcnN0ID0gMDsKLSAgICAgICAgICAgIGluY3IgID0gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgeF9mcm9tID0geDE7Ci0gICAgICAgIGRlbHRhID0gZmlyc3QgLSBmeTE7Ci0gICAgICAgIG1fY3VyX2NlbGwuYWRkX2NvdmVyKGRlbHRhLCB0d29fZnggKiBkZWx0YSk7Ci0gICAgICAgIGV5MSArPSBpbmNyOwotICAgICAgICBzZXRfY3VyX2NlbGwoZXgsIGV5MSk7Ci0gICAgICAgIGRlbHRhID0gZmlyc3QgKyBmaXJzdCAtIHBvbHlfYmFzZV9zaXplOwotICAgICAgICBhcmVhID0gdHdvX2Z4ICogZGVsdGE7Ci0gICAgICAgIHdoaWxlKGV5MSAhPSBleTIpIHsKLSAgICAgICAgICAgIG1fY3VyX2NlbGwuc2V0X2NvdmVyKGRlbHRhLCBhcmVhKTsKLSAgICAgICAgICAgIGV5MSArPSBpbmNyOwotICAgICAgICAgICAgc2V0X2N1cl9jZWxsKGV4LCBleTEpOwotICAgICAgICB9Ci0gICAgICAgIGRlbHRhID0gZnkyIC0gcG9seV9iYXNlX3NpemUgKyBmaXJzdDsKLSAgICAgICAgbV9jdXJfY2VsbC5hZGRfY292ZXIoZGVsdGEsIHR3b19meCAqIGRlbHRhKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwICAgICA9IChwb2x5X2Jhc2Vfc2l6ZSAtIGZ5MSkgKiBkeDsKLSAgICBmaXJzdCA9IHBvbHlfYmFzZV9zaXplOwotICAgIGlmKGR5IDwgMCkgewotICAgICAgICBwICAgICA9IGZ5MSAqIGR4OwotICAgICAgICBmaXJzdCA9IDA7Ci0gICAgICAgIGluY3IgID0gLTE7Ci0gICAgICAgIGR5ICAgID0gLWR5OwotICAgIH0KLSAgICBkZWx0YSA9IHAgLyBkeTsKLSAgICBtb2QgICA9IHAgJSBkeTsKLSAgICBpZihtb2QgPCAwKSB7Ci0gICAgICAgIGRlbHRhLS07Ci0gICAgICAgIG1vZCArPSBkeTsKLSAgICB9Ci0gICAgeF9mcm9tID0geDEgKyBkZWx0YTsKLSAgICByZW5kZXJfaGxpbmUoZXkxLCB4MSwgZnkxLCB4X2Zyb20sIGZpcnN0KTsKLSAgICBleTEgKz0gaW5jcjsKLSAgICBzZXRfY3VyX2NlbGwoeF9mcm9tID4+IHBvbHlfYmFzZV9zaGlmdCwgZXkxKTsKLSAgICBpZihleTEgIT0gZXkyKSB7Ci0gICAgICAgIHAgICAgID0gcG9seV9iYXNlX3NpemUgKiBkeDsKLSAgICAgICAgbGlmdCAgPSBwIC8gZHk7Ci0gICAgICAgIHJlbSAgID0gcCAlIGR5OwotICAgICAgICBpZihyZW0gPCAwKSB7Ci0gICAgICAgICAgICBsaWZ0LS07Ci0gICAgICAgICAgICByZW0gKz0gZHk7Ci0gICAgICAgIH0KLSAgICAgICAgbW9kIC09IGR5OwotICAgICAgICB3aGlsZShleTEgIT0gZXkyKSB7Ci0gICAgICAgICAgICBkZWx0YSA9IGxpZnQ7Ci0gICAgICAgICAgICBtb2QgICs9IHJlbTsKLSAgICAgICAgICAgIGlmIChtb2QgPj0gMCkgewotICAgICAgICAgICAgICAgIG1vZCAtPSBkeTsKLSAgICAgICAgICAgICAgICBkZWx0YSsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgeF90byA9IHhfZnJvbSArIGRlbHRhOwotICAgICAgICAgICAgcmVuZGVyX2hsaW5lKGV5MSwgeF9mcm9tLCBwb2x5X2Jhc2Vfc2l6ZSAtIGZpcnN0LCB4X3RvLCBmaXJzdCk7Ci0gICAgICAgICAgICB4X2Zyb20gPSB4X3RvOwotICAgICAgICAgICAgZXkxICs9IGluY3I7Ci0gICAgICAgICAgICBzZXRfY3VyX2NlbGwoeF9mcm9tID4+IHBvbHlfYmFzZV9zaGlmdCwgZXkxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZW5kZXJfaGxpbmUoZXkxLCB4X2Zyb20sIHBvbHlfYmFzZV9zaXplIC0gZmlyc3QsIHgyLCBmeTIpOwotfQotdm9pZCBvdXRsaW5lX2FhOjptb3ZlX3RvKGludCB4LCBpbnQgeSkKLXsKLSAgICBpZihtX3NvcnRlZCkgewotICAgICAgICByZXNldCgpOwotICAgIH0KLSAgICBzZXRfY3VyX2NlbGwoeCA+PiBwb2x5X2Jhc2Vfc2hpZnQsIHkgPj4gcG9seV9iYXNlX3NoaWZ0KTsKLSAgICBtX2N1cl94ID0geDsKLSAgICBtX2N1cl95ID0geTsKLX0KLXZvaWQgb3V0bGluZV9hYTo6bGluZV90byhpbnQgeCwgaW50IHkpCi17Ci0gICAgcmVuZGVyX2xpbmUobV9jdXJfeCwgbV9jdXJfeSwgeCwgeSk7Ci0gICAgbV9jdXJfeCA9IHg7Ci0gICAgbV9jdXJfeSA9IHk7Ci0gICAgbV9zb3J0ZWQgPSBmYWxzZTsKLX0KLXRlbXBsYXRlIDxjbGFzcyBUPiBzdGF0aWMgQUdHX0lOTElORSB2b2lkIHN3YXBfY2VsbHMoVCogYSwgVCogYikKLXsKLSAgICBUIHRlbXAgPSAqYTsKLSAgICAqYSA9ICpiOwotICAgICpiID0gdGVtcDsKLX0KLWVudW0gewotICAgIHFzb3J0X3RocmVzaG9sZCA9IDkKLX07Ci1zdGF0aWMgdm9pZCBxc29ydF9jZWxscyhjZWxsX2FhKiogc3RhcnQsIHVuc2lnbmVkIG51bSkKLXsKLSAgICBjZWxsX2FhKiogIHN0YWNrWzgwXTsKLSAgICBjZWxsX2FhKioqIHRvcDsKLSAgICBjZWxsX2FhKiogIGxpbWl0OwotICAgIGNlbGxfYWEqKiAgYmFzZTsKLSAgICBsaW1pdCA9IHN0YXJ0ICsgbnVtOwotICAgIGJhc2UgID0gc3RhcnQ7Ci0gICAgdG9wICAgPSBzdGFjazsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGludCBsZW4gPSBpbnQobGltaXQgLSBiYXNlKTsKLSAgICAgICAgY2VsbF9hYSoqIGk7Ci0gICAgICAgIGNlbGxfYWEqKiBqOwotICAgICAgICBjZWxsX2FhKiogcGl2b3Q7Ci0gICAgICAgIGlmKGxlbiA+IHFzb3J0X3RocmVzaG9sZCkgewotICAgICAgICAgICAgcGl2b3QgPSBiYXNlICsgbGVuIC8gMjsKLSAgICAgICAgICAgIHN3YXBfY2VsbHMoYmFzZSwgcGl2b3QpOwotICAgICAgICAgICAgaSA9IGJhc2UgKyAxOwotICAgICAgICAgICAgaiA9IGxpbWl0IC0gMTsKLSAgICAgICAgICAgIGlmKCgqaiktPnggPCAoKmkpLT54KSB7Ci0gICAgICAgICAgICAgICAgc3dhcF9jZWxscyhpLCBqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKCgqYmFzZSktPnggPCAoKmkpLT54KSB7Ci0gICAgICAgICAgICAgICAgc3dhcF9jZWxscyhiYXNlLCBpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKCgqaiktPnggPCAoKmJhc2UpLT54KSB7Ci0gICAgICAgICAgICAgICAgc3dhcF9jZWxscyhiYXNlLCBqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvcig7OykgewotICAgICAgICAgICAgICAgIGludCB4ID0gKCpiYXNlKS0+eDsKLSAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICB9IHdoaWxlKCAoKmkpLT54IDwgeCApOwotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgai0tOwotICAgICAgICAgICAgICAgIH0gd2hpbGUoIHggPCAoKmopLT54ICk7Ci0gICAgICAgICAgICAgICAgaWYoaSA+IGopIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN3YXBfY2VsbHMoaSwgaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2FwX2NlbGxzKGJhc2UsIGopOwotICAgICAgICAgICAgaWYoaiAtIGJhc2UgPiBsaW1pdCAtIGkpIHsKLSAgICAgICAgICAgICAgICB0b3BbMF0gPSBiYXNlOwotICAgICAgICAgICAgICAgIHRvcFsxXSA9IGo7Ci0gICAgICAgICAgICAgICAgYmFzZSAgID0gaTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdG9wWzBdID0gaTsKLSAgICAgICAgICAgICAgICB0b3BbMV0gPSBsaW1pdDsKLSAgICAgICAgICAgICAgICBsaW1pdCAgPSBqOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdG9wICs9IDI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqID0gYmFzZTsKLSAgICAgICAgICAgIGkgPSBqICsgMTsKLSAgICAgICAgICAgIGZvcig7IGkgPCBsaW1pdDsgaiA9IGksIGkrKykgewotICAgICAgICAgICAgICAgIGZvcig7IGpbMV0tPnggPCAoKmopLT54OyBqLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgc3dhcF9jZWxscyhqICsgMSwgaik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChqID09IGJhc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYodG9wID4gc3RhY2spIHsKLSAgICAgICAgICAgICAgICB0b3AgIC09IDI7Ci0gICAgICAgICAgICAgICAgYmFzZSAgPSB0b3BbMF07Ci0gICAgICAgICAgICAgICAgbGltaXQgPSB0b3BbMV07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotdm9pZCBvdXRsaW5lX2FhOjpzb3J0X2NlbGxzKCkKLXsKLSAgICBpZihtX3NvcnRlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGFkZF9jdXJfY2VsbCgpOwotICAgIGlmKG1fbnVtX2NlbGxzID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX3NvcnRlZF9jZWxscy5hbGxvY2F0ZShtX251bV9jZWxscywgMTYpOwotICAgIGlmIChtX21heF95ID4gMCAmJiBtX21pbl95IDwgMCAmJiAtbV9taW5feSA+IElOVF9NQVggLSBtX21heF95KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgdW5zaWduZWQgc2l6ZSA9IG1fbWF4X3kgLSBtX21pbl95OwotICAgIGlmIChzaXplICsgMSA8IHNpemUpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzaXplKys7Ci0gICAgbV9zb3J0ZWRfeS5hbGxvY2F0ZShzaXplLCAxNik7Ci0gICAgbV9zb3J0ZWRfeS56ZXJvKCk7Ci0gICAgY2VsbF9hYSoqIGJsb2NrX3B0ciA9IG1fY2VsbHM7Ci0gICAgY2VsbF9hYSogIGNlbGxfcHRyID0gTlVMTDsKLSAgICB1bnNpZ25lZCBuYiA9IG1fbnVtX2NlbGxzID4+IGNlbGxfYmxvY2tfc2hpZnQ7Ci0gICAgdW5zaWduZWQgaTsKLSAgICB3aGlsZShuYi0tKSB7Ci0gICAgICAgIGNlbGxfcHRyID0gKmJsb2NrX3B0cisrOwotICAgICAgICBpID0gY2VsbF9ibG9ja19zaXplOwotICAgICAgICB3aGlsZShpLS0pIHsKLSAgICAgICAgICAgIG1fc29ydGVkX3lbY2VsbF9wdHItPnkgLSBtX21pbl95XS5zdGFydCsrOwotICAgICAgICAgICAgKytjZWxsX3B0cjsKLSAgICAgICAgfQotICAgIH0KLSAgICBpID0gbV9udW1fY2VsbHMgJiBjZWxsX2Jsb2NrX21hc2s7Ci0gICAgaWYgKGkpIHsKLSAgICAgICAgY2VsbF9wdHIgPSAqYmxvY2tfcHRyKys7Ci0gICAgfQotICAgIHdoaWxlKGktLSkgewotICAgICAgICBtX3NvcnRlZF95W2NlbGxfcHRyLT55IC0gbV9taW5feV0uc3RhcnQrKzsKLSAgICAgICAgKytjZWxsX3B0cjsKLSAgICB9Ci0gICAgdW5zaWduZWQgc3RhcnQgPSAwOwotICAgIGZvcihpID0gMDsgaSA8IG1fc29ydGVkX3kuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgdW5zaWduZWQgdiA9IG1fc29ydGVkX3lbaV0uc3RhcnQ7Ci0gICAgICAgIG1fc29ydGVkX3lbaV0uc3RhcnQgPSBzdGFydDsKLSAgICAgICAgc3RhcnQgKz0gdjsKLSAgICB9Ci0gICAgYmxvY2tfcHRyID0gbV9jZWxsczsKLSAgICBuYiA9IG1fbnVtX2NlbGxzID4+IGNlbGxfYmxvY2tfc2hpZnQ7Ci0gICAgd2hpbGUobmItLSkgewotICAgICAgICBjZWxsX3B0ciA9ICpibG9ja19wdHIrKzsKLSAgICAgICAgaSA9IGNlbGxfYmxvY2tfc2l6ZTsKLSAgICAgICAgd2hpbGUoaS0tKSB7Ci0gICAgICAgICAgICBzb3J0ZWRfeSYgY3VyX3kgPSBtX3NvcnRlZF95W2NlbGxfcHRyLT55IC0gbV9taW5feV07Ci0gICAgICAgICAgICBtX3NvcnRlZF9jZWxsc1tjdXJfeS5zdGFydCArIGN1cl95Lm51bV0gPSBjZWxsX3B0cjsKLSAgICAgICAgICAgICsrY3VyX3kubnVtOwotICAgICAgICAgICAgKytjZWxsX3B0cjsKLSAgICAgICAgfQotICAgIH0KLSAgICBpID0gbV9udW1fY2VsbHMgJiBjZWxsX2Jsb2NrX21hc2s7Ci0gICAgaWYgKGkpIHsKLSAgICAgICAgY2VsbF9wdHIgPSAqYmxvY2tfcHRyKys7Ci0gICAgfQotICAgIHdoaWxlKGktLSkgewotICAgICAgICBzb3J0ZWRfeSYgY3VyX3kgPSBtX3NvcnRlZF95W2NlbGxfcHRyLT55IC0gbV9taW5feV07Ci0gICAgICAgIG1fc29ydGVkX2NlbGxzW2N1cl95LnN0YXJ0ICsgY3VyX3kubnVtXSA9IGNlbGxfcHRyOwotICAgICAgICArK2N1cl95Lm51bTsKLSAgICAgICAgKytjZWxsX3B0cjsKLSAgICB9Ci0gICAgZm9yKGkgPSAwOyBpIDwgbV9zb3J0ZWRfeS5zaXplKCk7IGkrKykgewotICAgICAgICBjb25zdCBzb3J0ZWRfeSYgY3VyX3kgPSBtX3NvcnRlZF95W2ldOwotICAgICAgICBpZihjdXJfeS5udW0pIHsKLSAgICAgICAgICAgIHFzb3J0X2NlbGxzKG1fc29ydGVkX2NlbGxzLmRhdGEoKSArIGN1cl95LnN0YXJ0LCBjdXJfeS5udW0pOwotICAgICAgICB9Ci0gICAgfQotICAgIG1fc29ydGVkID0gdHJ1ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYWdnL2FnZzIzL2Z4X2FnZ192Y2dlbl9kYXNoLmNwcCBiL2NvcmUvc3JjL2Z4Z2UvYWdnL2FnZzIzL2Z4X2FnZ192Y2dlbl9kYXNoLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI2YzI5MC4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGdlL2FnZy9hZ2cyMy9meF9hZ2dfdmNnZW5fZGFzaC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEFudGktR3JhaW4gR2VvbWV0cnkgLSBWZXJzaW9uIDIuMwotLy8gQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgTWF4aW0gU2hlbWFuYXJldiAoaHR0cDovL3d3dy5hbnRpZ3JhaW4uY29tKQotLy8KLS8vIFBlcm1pc3Npb24gdG8gY29weSwgdXNlLCBtb2RpZnksIHNlbGwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQotLy8gaXMgZ3JhbnRlZCBwcm92aWRlZCB0aGlzIGNvcHlyaWdodCBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLgotLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCi0vLyB3YXJyYW50eSwgYW5kIHdpdGggbm8gY2xhaW0gYXMgdG8gaXRzIHN1aXRhYmlsaXR5IGZvciBhbnkgcHVycG9zZS4KLS8vCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvbnRhY3Q6IG1jc2VlbUBhbnRpZ3JhaW4uY29tCi0vLyAgICAgICAgICBtY3NlZW1hZ2dAeWFob28uY29tCi0vLyAgICAgICAgICBodHRwOi8vd3d3LmFudGlncmFpbi5jb20KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIExpbmUgZGFzaCBnZW5lcmF0b3IKLS8vCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpbmNsdWRlICIuLi8uLi8uLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0jaW5jbHVkZSAiYWdnX3ZjZ2VuX2Rhc2guaCIKLSNpbmNsdWRlICJhZ2dfc2hvcnRlbl9wYXRoLmgiCi1uYW1lc3BhY2UgYWdnCi17Ci12Y2dlbl9kYXNoOjp2Y2dlbl9kYXNoKCkgOgotICAgIG1fdG90YWxfZGFzaF9sZW4oMCksCi0gICAgbV9udW1fZGFzaGVzKDApLAotICAgIG1fZGFzaF9zdGFydCgwKSwKLSAgICBtX3Nob3J0ZW4oMCksCi0gICAgbV9jdXJyX2Rhc2hfc3RhcnQoMCksCi0gICAgbV9jdXJyX2Rhc2goMCksCi0gICAgbV9zcmNfdmVydGljZXMoKSwKLSAgICBtX2Nsb3NlZCgwKSwKLSAgICBtX3N0YXR1cyhpbml0aWFsKSwKLSAgICBtX3NyY192ZXJ0ZXgoMCkKLXsKLX0KLXZvaWQgdmNnZW5fZGFzaDo6cmVtb3ZlX2FsbF9kYXNoZXMoKQotewotICAgIG1fdG90YWxfZGFzaF9sZW4gPSAwOwotICAgIG1fbnVtX2Rhc2hlcyA9IDA7Ci0gICAgbV9jdXJyX2Rhc2hfc3RhcnQgPSAwOwotICAgIG1fY3Vycl9kYXNoID0gMDsKLX0KLXZvaWQgdmNnZW5fZGFzaDo6YWRkX2Rhc2goRlhfRkxPQVQgZGFzaF9sZW4sIEZYX0ZMT0FUIGdhcF9sZW4pCi17Ci0gICAgaWYobV9udW1fZGFzaGVzIDwgbWF4X2Rhc2hlcykgewotICAgICAgICBtX3RvdGFsX2Rhc2hfbGVuICs9IGRhc2hfbGVuICsgZ2FwX2xlbjsKLSAgICAgICAgbV9kYXNoZXNbbV9udW1fZGFzaGVzKytdID0gZGFzaF9sZW47Ci0gICAgICAgIG1fZGFzaGVzW21fbnVtX2Rhc2hlcysrXSA9IGdhcF9sZW47Ci0gICAgfQotfQotdm9pZCB2Y2dlbl9kYXNoOjpkYXNoX3N0YXJ0KEZYX0ZMT0FUIGRzKQotewotICAgIG1fZGFzaF9zdGFydCA9IGRzOwotICAgIGNhbGNfZGFzaF9zdGFydChGWFNZU19mYWJzKGRzKSk7Ci19Ci12b2lkIHZjZ2VuX2Rhc2g6OmNhbGNfZGFzaF9zdGFydChGWF9GTE9BVCBkcykKLXsKLSAgICBtX2N1cnJfZGFzaCA9IDA7Ci0gICAgbV9jdXJyX2Rhc2hfc3RhcnQgPSAwOwotICAgIHdoaWxlKGRzID4gMCkgewotICAgICAgICBpZihkcyA+IG1fZGFzaGVzW21fY3Vycl9kYXNoXSkgewotICAgICAgICAgICAgZHMgLT0gbV9kYXNoZXNbbV9jdXJyX2Rhc2hdOwotICAgICAgICAgICAgKyttX2N1cnJfZGFzaDsKLSAgICAgICAgICAgIG1fY3Vycl9kYXNoX3N0YXJ0ID0gMDsKLSAgICAgICAgICAgIGlmKG1fY3Vycl9kYXNoID49IG1fbnVtX2Rhc2hlcykgewotICAgICAgICAgICAgICAgIG1fY3Vycl9kYXNoID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fY3Vycl9kYXNoX3N0YXJ0ID0gZHM7Ci0gICAgICAgICAgICBkcyA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci12b2lkIHZjZ2VuX2Rhc2g6OnJlbW92ZV9hbGwoKQotewotICAgIG1fc3RhdHVzID0gaW5pdGlhbDsKLSAgICBtX3NyY192ZXJ0aWNlcy5yZW1vdmVfYWxsKCk7Ci0gICAgbV9jbG9zZWQgPSAwOwotfQotdm9pZCB2Y2dlbl9kYXNoOjphZGRfdmVydGV4KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIHVuc2lnbmVkIGNtZCkKLXsKLSAgICBtX3N0YXR1cyA9IGluaXRpYWw7Ci0gICAgaWYoaXNfbW92ZV90byhjbWQpKSB7Ci0gICAgICAgIG1fc3JjX3ZlcnRpY2VzLm1vZGlmeV9sYXN0KHZlcnRleF9kaXN0KHgsIHkpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZihpc192ZXJ0ZXgoY21kKSkgewotICAgICAgICAgICAgbV9zcmNfdmVydGljZXMuYWRkKHZlcnRleF9kaXN0KHgsIHkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fY2xvc2VkID0gZ2V0X2Nsb3NlX2ZsYWcoY21kKTsKLSAgICAgICAgfQotICAgIH0KLX0KLXZvaWQgdmNnZW5fZGFzaDo6cmV3aW5kKHVuc2lnbmVkKQotewotICAgIGlmKG1fc3RhdHVzID09IGluaXRpYWwpIHsKLSAgICAgICAgbV9zcmNfdmVydGljZXMuY2xvc2UobV9jbG9zZWQgIT0gMCk7Ci0gICAgICAgIHNob3J0ZW5fcGF0aChtX3NyY192ZXJ0aWNlcywgbV9zaG9ydGVuLCBtX2Nsb3NlZCk7Ci0gICAgfQotICAgIG1fc3RhdHVzID0gcmVhZHk7Ci0gICAgbV9zcmNfdmVydGV4ID0gMDsKLX0KLXVuc2lnbmVkIHZjZ2VuX2Rhc2g6OnZlcnRleChGWF9GTE9BVCogeCwgRlhfRkxPQVQqIHkpCi17Ci0gICAgdW5zaWduZWQgY21kID0gcGF0aF9jbWRfbW92ZV90bzsKLSAgICB3aGlsZSghaXNfc3RvcChjbWQpKSB7Ci0gICAgICAgIHN3aXRjaChtX3N0YXR1cykgewotICAgICAgICAgICAgY2FzZSBpbml0aWFsOgotICAgICAgICAgICAgICAgIHJld2luZCgwKTsKLSAgICAgICAgICAgIGNhc2UgcmVhZHk6Ci0gICAgICAgICAgICAgICAgaWYobV9udW1fZGFzaGVzIDwgMiB8fCBtX3NyY192ZXJ0aWNlcy5zaXplKCkgPCAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNtZCA9IHBhdGhfY21kX3N0b3A7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX3N0YXR1cyA9IHBvbHlsaW5lOwotICAgICAgICAgICAgICAgIG1fc3JjX3ZlcnRleCA9IDE7Ci0gICAgICAgICAgICAgICAgbV92MSA9ICZtX3NyY192ZXJ0aWNlc1swXTsKLSAgICAgICAgICAgICAgICBtX3YyID0gJm1fc3JjX3ZlcnRpY2VzWzFdOwotICAgICAgICAgICAgICAgIG1fY3Vycl9yZXN0ID0gbV92MS0+ZGlzdDsKLSAgICAgICAgICAgICAgICAqeCA9IG1fdjEtPng7Ci0gICAgICAgICAgICAgICAgKnkgPSBtX3YxLT55OwotICAgICAgICAgICAgICAgIGlmKG1fZGFzaF9zdGFydCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGNfZGFzaF9zdGFydChtX2Rhc2hfc3RhcnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcGF0aF9jbWRfbW92ZV90bzsKLSAgICAgICAgICAgIGNhc2UgcG9seWxpbmU6IHsKLSAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZGFzaF9yZXN0ID0gbV9kYXNoZXNbbV9jdXJyX2Rhc2hdIC0gbV9jdXJyX2Rhc2hfc3RhcnQ7Ci0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNtZCA9IChtX2N1cnJfZGFzaCAmIDEpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aF9jbWRfbW92ZV90byA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhfY21kX2xpbmVfdG87Ci0gICAgICAgICAgICAgICAgICAgIGlmKG1fY3Vycl9yZXN0ID4gZGFzaF9yZXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJfcmVzdCAtPSBkYXNoX3Jlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICArK21fY3Vycl9kYXNoOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYobV9jdXJyX2Rhc2ggPj0gbV9udW1fZGFzaGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jdXJyX2Rhc2ggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbV9jdXJyX2Rhc2hfc3RhcnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgKnggPSBtX3YyLT54IC0gKG1fdjItPnggLSBtX3YxLT54KSAqIG1fY3Vycl9yZXN0IC8gbV92MS0+ZGlzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICp5ID0gbV92Mi0+eSAtIChtX3YyLT55IC0gbV92MS0+eSkgKiBtX2N1cnJfcmVzdCAvIG1fdjEtPmRpc3Q7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJfZGFzaF9zdGFydCArPSBtX2N1cnJfcmVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICp4ID0gbV92Mi0+eDsKLSAgICAgICAgICAgICAgICAgICAgICAgICp5ID0gbV92Mi0+eTsKLSAgICAgICAgICAgICAgICAgICAgICAgICsrbV9zcmNfdmVydGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgbV92MSA9IG1fdjI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJfcmVzdCA9IG1fdjEtPmRpc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihtX2Nsb3NlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1fc3JjX3ZlcnRleCA+IG1fc3JjX3ZlcnRpY2VzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cyA9IHN0b3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92MiA9ICZtX3NyY192ZXJ0aWNlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX3NyY192ZXJ0ZXggPj0gbV9zcmNfdmVydGljZXMuc2l6ZSgpKSA/IDAgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3JjX3ZlcnRleAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1fc3JjX3ZlcnRleCA+PSBtX3NyY192ZXJ0aWNlcy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBzdG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdjIgPSAmbV9zcmNfdmVydGljZXNbbV9zcmNfdmVydGV4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNtZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIHN0b3A6Ci0gICAgICAgICAgICAgICAgY21kID0gcGF0aF9jbWRfc3RvcDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcGF0aF9jbWRfc3RvcDsKLX0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYWdnL2FnZzIzL2Z4X2FnZ192Y2dlbl9zdHJva2UuY3BwIGIvY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvZnhfYWdnX3ZjZ2VuX3N0cm9rZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNWFjNDUuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvZnhfYWdnX3ZjZ2VuX3N0cm9rZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFhZUTogMjAwNi0wMS0yMiBDb3BpZWQgZnJvbSBBR0cgcHJvamVjdC4KLS8vIFRPRE86IFRoaXMgZmlsZSB1c2VzIGludGVuc2l2ZSBmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zLCBzbyBpdCdzIE5PVCBzdWl0YWJsZQotLy8gZm9yIHBsYXRmb3JtcyBsaWtlIFN5bWJpYW4gT1MuIFdlIG5lZWQgdG8gY2hhbmdlIHRvIEZJWCBmb3JtYXQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQW50aS1HcmFpbiBHZW9tZXRyeSAtIFZlcnNpb24gMi4zCi0vLyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBNYXhpbSBTaGVtYW5hcmV2IChodHRwOi8vd3d3LmFudGlncmFpbi5jb20pCi0vLwotLy8gUGVybWlzc2lvbiB0byBjb3B5LCB1c2UsIG1vZGlmeSwgc2VsbCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCi0vLyBpcyBncmFudGVkIHByb3ZpZGVkIHRoaXMgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMuCi0vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKLS8vIHdhcnJhbnR5LCBhbmQgd2l0aCBubyBjbGFpbSBhcyB0byBpdHMgc3VpdGFiaWxpdHkgZm9yIGFueSBwdXJwb3NlLgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29udGFjdDogbWNzZWVtQGFudGlncmFpbi5jb20KLS8vICAgICAgICAgIG1jc2VlbWFnZ0B5YWhvby5jb20KLS8vICAgICAgICAgIGh0dHA6Ly93d3cuYW50aWdyYWluLmNvbQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gU3Ryb2tlIGdlbmVyYXRvcgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2luY2x1ZGUgIi4uLy4uLy4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKLSNpbmNsdWRlICJhZ2dfdmNnZW5fc3Ryb2tlLmgiCi1uYW1lc3BhY2UgYWdnCi17Ci0KLXZjZ2VuX3N0cm9rZTo6dmNnZW5fc3Ryb2tlKCkgOgotICAgIG1fc3JjX3ZlcnRpY2VzKCksCi0gICAgbV9vdXRfdmVydGljZXMoKSwKLSAgICBtX3dpZHRoKDAuNWYpLAotICAgIG1fbWl0ZXJfbGltaXQoNCAqIDEuMGYpLAotICAgIG1faW5uZXJfbWl0ZXJfbGltaXQoMS4wZiArIDEuMGYgLyAxMDApLAotICAgIG1fYXBwcm94X3NjYWxlKDEuMGYpLAotICAgIG1fbGluZV9jYXAoYnV0dF9jYXApLAotICAgIG1fbGluZV9qb2luKG1pdGVyX2pvaW4pLAotICAgIG1faW5uZXJfam9pbihpbm5lcl9taXRlciksCi0gICAgbV9jbG9zZWQoMCksCi0gICAgbV9zdGF0dXMoaW5pdGlhbCksCi0gICAgbV9zcmNfdmVydGV4KDApLAotICAgIG1fb3V0X3ZlcnRleCgwKQotewotfQotdm9pZCB2Y2dlbl9zdHJva2U6OnJlbW92ZV9hbGwoKQotewotICAgIG1fc3JjX3ZlcnRpY2VzLnJlbW92ZV9hbGwoKTsKLSAgICBtX2Nsb3NlZCA9IDA7Ci0gICAgbV9zdGF0dXMgPSBpbml0aWFsOwotfQotdm9pZCB2Y2dlbl9zdHJva2U6OmFkZF92ZXJ0ZXgoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgdW5zaWduZWQgY21kKQotewotICAgIG1fc3RhdHVzID0gaW5pdGlhbDsKLSAgICBpZihpc19tb3ZlX3RvKGNtZCkpIHsKLSAgICAgICAgbV9zcmNfdmVydGljZXMubW9kaWZ5X2xhc3QodmVydGV4X2Rpc3RfY21kKHgsIHksIGNtZCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKGlzX3ZlcnRleChjbWQpKSB7Ci0gICAgICAgICAgICBtX3NyY192ZXJ0aWNlcy5hZGQodmVydGV4X2Rpc3RfY21kKHgsIHksIGNtZCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9jbG9zZWQgPSBnZXRfY2xvc2VfZmxhZyhjbWQpOwotICAgICAgICB9Ci0gICAgfQotfQotc3RhdGljIGlubGluZSB2b2lkIGNhbGNfYnV0dF9jYXAoRlhfRkxPQVQqIGNhcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRleF9kaXN0JiB2MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRleF9kaXN0JiB2MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHdpZHRoKQotewotICAgIEZYX0ZMT0FUIGR4ID0gRlhTWVNfTXVsRGl2KHYxLnkgLSB2MC55LCB3aWR0aCwgbGVuKTsKLSAgICBGWF9GTE9BVCBkeSA9IEZYU1lTX011bERpdih2MS54IC0gdjAueCwgd2lkdGgsIGxlbik7Ci0gICAgY2FwWzBdID0gdjAueCAtIGR4OwotICAgIGNhcFsxXSA9IHYwLnkgKyBkeTsKLSAgICBjYXBbMl0gPSB2MC54ICsgZHg7Ci0gICAgY2FwWzNdID0gdjAueSAtIGR5OwotfQotdm9pZCB2Y2dlbl9zdHJva2U6OnJld2luZCh1bnNpZ25lZCkKLXsKLSAgICBpZihtX3N0YXR1cyA9PSBpbml0aWFsKSB7Ci0gICAgICAgIG1fc3JjX3ZlcnRpY2VzLmNsb3NlKG1fY2xvc2VkICE9IDApOwotICAgICAgICBpZihtX3NyY192ZXJ0aWNlcy5zaXplKCkgPCAzKSB7Ci0gICAgICAgICAgICBtX2Nsb3NlZCA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9zdGF0dXMgPSByZWFkeTsKLSAgICBtX3NyY192ZXJ0ZXggPSAwOwotICAgIG1fb3V0X3ZlcnRleCA9IDA7Ci19Ci11bnNpZ25lZCB2Y2dlbl9zdHJva2U6OnZlcnRleChGWF9GTE9BVCogeCwgRlhfRkxPQVQqIHkpCi17Ci0gICAgdW5zaWduZWQgY21kID0gcGF0aF9jbWRfbGluZV90bzsKLSAgICBsaW5lX2pvaW5fZSBjdXJqOwotICAgIHdoaWxlKCFpc19zdG9wKGNtZCkpIHsKLSAgICAgICAgc3dpdGNoKG1fc3RhdHVzKSB7Ci0gICAgICAgICAgICBjYXNlIGluaXRpYWw6Ci0gICAgICAgICAgICAgICAgcmV3aW5kKDApOwotICAgICAgICAgICAgY2FzZSByZWFkeToKLSAgICAgICAgICAgICAgICBpZihtX3NyY192ZXJ0aWNlcy5zaXplKCkgPCAyICsgdW5zaWduZWQobV9jbG9zZWQgIT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY21kID0gcGF0aF9jbWRfc3RvcDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gbV9jbG9zZWQgPyBvdXRsaW5lMSA6IGNhcDE7Ci0gICAgICAgICAgICAgICAgY21kID0gcGF0aF9jbWRfbW92ZV90bzsKLSAgICAgICAgICAgICAgICBtX3NyY192ZXJ0ZXggPSAwOwotICAgICAgICAgICAgICAgIG1fb3V0X3ZlcnRleCA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGNhcDE6Ci0gICAgICAgICAgICAgICAgc3Ryb2tlX2NhbGNfY2FwKG1fb3V0X3ZlcnRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NyY192ZXJ0aWNlc1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zcmNfdmVydGljZXNbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3JjX3ZlcnRpY2VzWzBdLmRpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbGluZV9jYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYXBwcm94X3NjYWxlKTsKLSAgICAgICAgICAgICAgICBtX3NyY192ZXJ0ZXggPSAxOwotICAgICAgICAgICAgICAgIG1fcHJldl9zdGF0dXMgPSBvdXRsaW5lMTsKLSAgICAgICAgICAgICAgICBtX3N0YXR1cyA9IG91dF92ZXJ0aWNlczsKLSAgICAgICAgICAgICAgICBtX291dF92ZXJ0ZXggPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBjYXAyOgotICAgICAgICAgICAgICAgIHN0cm9rZV9jYWxjX2NhcChtX291dF92ZXJ0aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zcmNfdmVydGljZXNbbV9zcmNfdmVydGljZXMuc2l6ZSgpIC0gMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3JjX3ZlcnRpY2VzW21fc3JjX3ZlcnRpY2VzLnNpemUoKSAtIDJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NyY192ZXJ0aWNlc1ttX3NyY192ZXJ0aWNlcy5zaXplKCkgLSAyXS5kaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2xpbmVfY2FwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2FwcHJveF9zY2FsZSk7Ci0gICAgICAgICAgICAgICAgbV9wcmV2X3N0YXR1cyA9IG91dGxpbmUyOwotICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gb3V0X3ZlcnRpY2VzOwotICAgICAgICAgICAgICAgIG1fb3V0X3ZlcnRleCA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIG91dGxpbmUxOgotICAgICAgICAgICAgICAgIGlmKG1fY2xvc2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKG1fc3JjX3ZlcnRleCA+PSBtX3NyY192ZXJ0aWNlcy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcHJldl9zdGF0dXMgPSBjbG9zZV9maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gZW5kX3BvbHkxOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZihtX3NyY192ZXJ0ZXggPj0gbV9zcmNfdmVydGljZXMuc2l6ZSgpIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBjYXAyOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3VyaiA9IG1fc3JjX3ZlcnRpY2VzW21fc3JjX3ZlcnRleF0uY21kICYgcGF0aF9mbGFnc19qciA/IG1pdGVyX2pvaW5fcm91bmQgOiBtX2xpbmVfam9pbjsKLSAgICAgICAgICAgICAgICBzdHJva2VfY2FsY19qb2luKG1fb3V0X3ZlcnRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zcmNfdmVydGljZXMucHJldihtX3NyY192ZXJ0ZXgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zcmNfdmVydGljZXMuY3VycihtX3NyY192ZXJ0ZXgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zcmNfdmVydGljZXMubmV4dChtX3NyY192ZXJ0ZXgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zcmNfdmVydGljZXMucHJldihtX3NyY192ZXJ0ZXgpLmRpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NyY192ZXJ0aWNlcy5jdXJyKG1fc3JjX3ZlcnRleCkuZGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbm5lcl9qb2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9taXRlcl9saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5uZXJfbWl0ZXJfbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2FwcHJveF9zY2FsZSk7Ci0gICAgICAgICAgICAgICAgKyttX3NyY192ZXJ0ZXg7Ci0gICAgICAgICAgICAgICAgbV9wcmV2X3N0YXR1cyA9IG1fc3RhdHVzOwotICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gb3V0X3ZlcnRpY2VzOwotICAgICAgICAgICAgICAgIG1fb3V0X3ZlcnRleCA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGNsb3NlX2ZpcnN0OgotICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gb3V0bGluZTI7Ci0gICAgICAgICAgICAgICAgY21kID0gcGF0aF9jbWRfbW92ZV90bzsKLSAgICAgICAgICAgIGNhc2Ugb3V0bGluZTI6Ci0gICAgICAgICAgICAgICAgaWYobV9zcmNfdmVydGV4IDw9IHVuc2lnbmVkKG1fY2xvc2VkID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gZW5kX3BvbHkyOwotICAgICAgICAgICAgICAgICAgICBtX3ByZXZfc3RhdHVzID0gc3RvcDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC0tbV9zcmNfdmVydGV4OwotICAgICAgICAgICAgICAgIGN1cmogPSBtX3NyY192ZXJ0aWNlc1ttX3NyY192ZXJ0ZXhdLmNtZCAmIHBhdGhfZmxhZ3NfanIgPyBtaXRlcl9qb2luX3JvdW5kIDogbV9saW5lX2pvaW47Ci0gICAgICAgICAgICAgICAgc3Ryb2tlX2NhbGNfam9pbihtX291dF92ZXJ0aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3JjX3ZlcnRpY2VzLm5leHQobV9zcmNfdmVydGV4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3JjX3ZlcnRpY2VzLmN1cnIobV9zcmNfdmVydGV4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3JjX3ZlcnRpY2VzLnByZXYobV9zcmNfdmVydGV4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3JjX3ZlcnRpY2VzLmN1cnIobV9zcmNfdmVydGV4KS5kaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zcmNfdmVydGljZXMucHJldihtX3NyY192ZXJ0ZXgpLmRpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5uZXJfam9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbWl0ZXJfbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lubmVyX21pdGVyX2xpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hcHByb3hfc2NhbGUpOwotICAgICAgICAgICAgICAgIG1fcHJldl9zdGF0dXMgPSBtX3N0YXR1czsKLSAgICAgICAgICAgICAgICBtX3N0YXR1cyA9IG91dF92ZXJ0aWNlczsKLSAgICAgICAgICAgICAgICBtX291dF92ZXJ0ZXggPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBvdXRfdmVydGljZXM6Ci0gICAgICAgICAgICAgICAgaWYobV9vdXRfdmVydGV4ID49IG1fb3V0X3ZlcnRpY2VzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cyA9IG1fcHJldl9zdGF0dXM7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRfdHlwZSYgYyA9IG1fb3V0X3ZlcnRpY2VzW21fb3V0X3ZlcnRleCsrXTsKLSAgICAgICAgICAgICAgICAgICAgKnggPSBjLng7Ci0gICAgICAgICAgICAgICAgICAgICp5ID0gYy55OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY21kOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgZW5kX3BvbHkxOgotICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gbV9wcmV2X3N0YXR1czsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGF0aF9jbWRfZW5kX3BvbHkgfCBwYXRoX2ZsYWdzX2Nsb3NlIHwgcGF0aF9mbGFnc19jY3c7Ci0gICAgICAgICAgICBjYXNlIGVuZF9wb2x5MjoKLSAgICAgICAgICAgICAgICBtX3N0YXR1cyA9IG1fcHJldl9zdGF0dXM7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhdGhfY21kX2VuZF9wb2x5IHwgcGF0aF9mbGFnc19jbG9zZSB8IHBhdGhfZmxhZ3NfY3c7Ci0gICAgICAgICAgICBjYXNlIHN0b3A6Ci0gICAgICAgICAgICAgICAgY21kID0gcGF0aF9jbWRfc3RvcDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gY21kOwotfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meF9hZ2dfZHJpdmVyLmggYi9jb3JlL3NyYy9meGdlL2FnZy9pbmNsdWRlL2Z4X2FnZ19kcml2ZXIuaAppbmRleCBmNGI5MzY4Li43MTU2OTc0IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FnZy9pbmNsdWRlL2Z4X2FnZ19kcml2ZXIuaAorKysgYi9jb3JlL3NyYy9meGdlL2FnZy9pbmNsdWRlL2Z4X2FnZ19kcml2ZXIuaApAQCAtMSwxMjQgKzEsMTUwIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpZm5kZWYgRlhfQUdHX0RSSVZFUl9IXwotI2RlZmluZSBGWF9BR0dfRFJJVkVSX0hfCisjaWZuZGVmIENPUkVfU1JDX0ZYR0VfQUdHX0lOQ0xVREVfRlhfQUdHX0RSSVZFUl9IXworI2RlZmluZSBDT1JFX1NSQ19GWEdFX0FHR19JTkNMVURFX0ZYX0FHR19EUklWRVJfSF8KIAotI2luY2x1ZGUgImZ4ZnhfYWdnX3BhdGhfc3RvcmFnZS5oIgotI2luY2x1ZGUgImZ4ZnhfYWdnX3Jhc3Rlcml6ZXJfc2NhbmxpbmVfYWEuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9nZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2FnZzIzL2FnZ19jbGlwX2xpYW5nX2JhcnNreS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2FnZzIzL2FnZ19wYXRoX3N0b3JhZ2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfcmFzdGVyaXplcl9zY2FubGluZV9hYS5oIgogCi1jbGFzcyBDQWdnX1BhdGhEYXRhIAotewotcHVibGljOgotICAgIENBZ2dfUGF0aERhdGEoKSB7fQotICAgIH5DQWdnX1BhdGhEYXRhKCkge30KLSAgICBGWF9OQU1FU1BBQ0VfREVDTEFSRShhZ2csIHBhdGhfc3RvcmFnZSkJbV9QYXRoRGF0YTsKLSAgICB2b2lkCQkJQnVpbGRQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSk7CitjbGFzcyBDRlhfTWF0cml4OworY2xhc3MgQ0ZYX1BhdGhEYXRhOworCitjbGFzcyBDQWdnX1BhdGhEYXRhIHsKKyBwdWJsaWM6CisgIENBZ2dfUGF0aERhdGEoKSB7fQorICB+Q0FnZ19QYXRoRGF0YSgpIHt9CisgIHZvaWQgQnVpbGRQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSk7CisKKyAgYWdnOjpwYXRoX3N0b3JhZ2UgbV9QYXRoRGF0YTsKIH07Ci1jbGFzcyBDRlhfQWdnRGV2aWNlRHJpdmVyIDogcHVibGljIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIKLXsKLXB1YmxpYzoKLSAgICBDRlhfQWdnRGV2aWNlRHJpdmVyKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRpdGhlcl9iaXRzLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwgRlhfQk9PTCBiR3JvdXBLbm9ja291dCk7Ci0gICAgdmlydHVhbCB+Q0ZYX0FnZ0RldmljZURyaXZlcigpOwotICAgIHZvaWQJCQkJSW5pdFBsYXRmb3JtKCk7Ci0gICAgdm9pZAkJCQlEZXN0cm95UGxhdGZvcm0oKTsKK2NsYXNzIENGWF9BZ2dEZXZpY2VEcml2ZXIgOiBwdWJsaWMgSUZYX1JlbmRlckRldmljZURyaXZlciB7CisgcHVibGljOgorICBDRlhfQWdnRGV2aWNlRHJpdmVyKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgZGl0aGVyX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJHcm91cEtub2Nrb3V0KTsKKyAgfkNGWF9BZ2dEZXZpY2VEcml2ZXIoKSBvdmVycmlkZTsKIAorICB2b2lkIEluaXRQbGF0Zm9ybSgpOworICB2b2lkIERlc3Ryb3lQbGF0Zm9ybSgpOwogCi0gICAgdmlydHVhbCBpbnQJCQlHZXREZXZpY2VDYXBzKGludCBjYXBzX2lkKTsKKyAgLy8gSUZYX1JlbmRlckRldmljZURyaXZlcgorICBpbnQgR2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCkgb3ZlcnJpZGU7CisgIHZvaWQgU2F2ZVN0YXRlKCkgb3ZlcnJpZGU7CisgIHZvaWQgUmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgU2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLAorICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0cm9rZV9jb2xvciwKKyAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlLAorICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIG92ZXJyaWRlOworICBGWF9CT09MIFNldFBpeGVsKGludCB4LAorICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIG92ZXJyaWRlOworICBGWF9CT09MIEZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LAorICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCisgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgRHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhfQk9PTCBHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KSBvdmVycmlkZTsKKyAgRlhfQk9PTCBHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRFZGdlID0gRkFMU0UpIG92ZXJyaWRlOworICBDRlhfRElCaXRtYXAqIEdldEJhY2tEcm9wKCkgb3ZlcnJpZGUgeyByZXR1cm4gbV9wT3JpRGV2aWNlOyB9CisgIEZYX0JPT0wgU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIG92ZXJyaWRlOworICBGWF9CT09MIENvbnRpbnVlRElCaXRzKHZvaWQqIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpIG92ZXJyaWRlOworICB2b2lkIENhbmNlbERJQml0cyh2b2lkKiBoYW5kbGUpIG92ZXJyaWRlOworICBGWF9CT09MIERyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udENhY2hlKiBwQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIG92ZXJyaWRlOworICBpbnQgR2V0RHJpdmVyVHlwZSgpIG92ZXJyaWRlIHsgcmV0dXJuIDE7IH0KIAorICBGWF9CT09MIFJlbmRlclJhc3Rlcml6ZXIoYWdnOjpyYXN0ZXJpemVyX3NjYW5saW5lX2FhJiByYXN0ZXJpemVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGdWxsQ292ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJHcm91cEtub2Nrb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKTsKIAotICAgIHZpcnR1YWwgdm9pZAkJU2F2ZVN0YXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkCQlSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkKTsKKyAgdm9pZCBTZXRDbGlwTWFzayhhZ2c6OnJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEmIHJhc3Rlcml6ZXIpOwogCisgIHZpcnR1YWwgdWludDhfdCogR2V0QnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbV9wQml0bWFwLT5HZXRCdWZmZXIoKTsgfQogCi0gICAgdmlydHVhbCBGWF9CT09MCQlTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLQotICAgIHZpcnR1YWwgRlhfQk9PTAkJU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLQotICAgIHZpcnR1YWwgRlhfQk9PTAkJRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3Ryb2tlX2NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVNldFBpeGVsKGludCB4LCBpbnQgeSwgRlhfRFdPUkQgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCUZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKTsKLQotCi0gICAgdmlydHVhbCBGWF9CT09MCQlEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLCBGWF9EV09SRCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCk7Ci0KLQotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBGWF9CT09MIGJERWRnZSA9IEZBTFNFKTsKLSAgICB2aXJ0dWFsIENGWF9ESUJpdG1hcCogICBHZXRCYWNrRHJvcCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wT3JpRGV2aWNlOwotICAgIH0KLQotICAgIHZpcnR1YWwgRlhfQk9PTAkJU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJCVN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBGWF9EV09SRCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKTsKLQotICAgIHZpcnR1YWwgRlhfQk9PTAkJU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBmbGFncywgRlhfTFBWT0lEJiBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJQ29udGludWVESUJpdHMoRlhfTFBWT0lEIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpOwotICAgIHZpcnR1YWwgdm9pZAkJQ2FuY2VsRElCaXRzKEZYX0xQVk9JRCBoYW5kbGUpOwotCi0gICAgdmlydHVhbCBGWF9CT09MICAgICBEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgRlhfRFdPUkQgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlSZW5kZXJSYXN0ZXJpemVyKEZYX05BTUVTUEFDRV9ERUNMQVJFKGFnZywgcmFzdGVyaXplcl9zY2FubGluZV9hYSkmIHJhc3Rlcml6ZXIsIEZYX0RXT1JEIGNvbG9yLCBGWF9CT09MIGJGdWxsQ292ZXIsIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKTsKLQotICAgIHZvaWQJCQkJU2V0Q2xpcE1hc2soRlhfTkFNRVNQQUNFX0RFQ0xBUkUoYWdnLCByYXN0ZXJpemVyX3NjYW5saW5lX2FhKSYgcmFzdGVyaXplcik7Ci0KLSAgICB2aXJ0dWFsCUZYX0xQQllURQlHZXRCdWZmZXIoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcEJpdG1hcC0+R2V0QnVmZmVyKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgaW50CQkJR2V0RHJpdmVyVHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBDRlhfRElCaXRtYXAqCQltX3BCaXRtYXA7Ci0gICAgQ0ZYX0NsaXBSZ24qCQltX3BDbGlwUmduOwotICAgIENGWF9QdHJBcnJheQkJbV9TdGF0ZVN0YWNrOwotICAgIHZvaWQqCQkJCW1fcFBsYXRmb3JtR3JhcGhpY3M7Ci0gICAgdm9pZCoJCQkJbV9wUGxhdGZvcm1CaXRtYXA7Ci0gICAgdm9pZCoJCQkJbV9wRHdSZW5kZXJUYXJ0Z2V0OwotICAgIGludAkJCQkJbV9GaWxsRmxhZ3M7Ci0gICAgaW50CQkJCQltX0RpdGhlckJpdHM7Ci0gICAgRlhfQk9PTAkJCQltX2JSZ2JCeXRlT3JkZXI7Ci0gICAgQ0ZYX0RJQml0bWFwKiAgICAgICBtX3BPcmlEZXZpY2U7Ci0gICAgRlhfQk9PTCAgICAgICAgICAgICBtX2JHcm91cEtub2Nrb3V0OworICBDRlhfRElCaXRtYXAqIG1fcEJpdG1hcDsKKyAgQ0ZYX0NsaXBSZ24qIG1fcENsaXBSZ247CisgIENGWF9BcnJheVRlbXBsYXRlPENGWF9DbGlwUmduKj4gbV9TdGF0ZVN0YWNrOworICB2b2lkKiBtX3BQbGF0Zm9ybUdyYXBoaWNzOworICB2b2lkKiBtX3BQbGF0Zm9ybUJpdG1hcDsKKyAgdm9pZCogbV9wRHdSZW5kZXJUYXJ0Z2V0OworICBpbnQgbV9GaWxsRmxhZ3M7CisgIGludCBtX0RpdGhlckJpdHM7CisgIEZYX0JPT0wgbV9iUmdiQnl0ZU9yZGVyOworICBDRlhfRElCaXRtYXAqIG1fcE9yaURldmljZTsKKyAgRlhfQk9PTCBtX2JHcm91cEtub2Nrb3V0OwogfTsKIAotI2VuZGlmICAvLyBGWF9BR0dfRFJJVkVSX0hfCisjZW5kaWYgIC8vIENPUkVfU1JDX0ZYR0VfQUdHX0lOQ0xVREVfRlhfQUdHX0RSSVZFUl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meGZ4X2FnZ19iYXNpY3MuaCBiL2NvcmUvc3JjL2Z4Z2UvYWdnL2luY2x1ZGUvZnhmeF9hZ2dfYmFzaWNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyN2E4NDMuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meGZ4X2FnZ19iYXNpY3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlhGWF9BR0dfQkFTSUNTX0hfCi0jZGVmaW5lIEZYRlhfQUdHX0JBU0lDU19IXwotCi0jaW5jbHVkZSAiLi4vYWdnMjMvYWdnX2Jhc2ljcy5oIgotCi0jZW5kaWYgIC8vIEZYRlhfQUdHX0JBU0lDU19IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meGZ4X2FnZ19jbGlwX2xpYW5nX2JhcnNreS5oIGIvY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meGZ4X2FnZ19jbGlwX2xpYW5nX2JhcnNreS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjY0YmY5Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Z2UvYWdnL2luY2x1ZGUvZnhmeF9hZ2dfY2xpcF9saWFuZ19iYXJza3kuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlhGWF9BR0dfQ0xJUF9MSUFOR19CQVJTS1lfSF8KLSNkZWZpbmUgRlhGWF9BR0dfQ0xJUF9MSUFOR19CQVJTS1lfSF8KLQotI2luY2x1ZGUgIi4uL2FnZzIzL2FnZ19jbGlwX2xpYW5nX2JhcnNreS5oIgotCi0jZW5kaWYgIC8vIEZYRlhfQUdHX0NMSVBfTElBTkdfQkFSU0tZX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FnZy9pbmNsdWRlL2Z4ZnhfYWdnX2NvbnZfZGFzaC5oIGIvY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meGZ4X2FnZ19jb252X2Rhc2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIxZTQyZC4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGdlL2FnZy9pbmNsdWRlL2Z4ZnhfYWdnX2NvbnZfZGFzaC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBGWEZYX0FHR19DT05WX0RBU0hfSF8KLSNkZWZpbmUgRlhGWF9BR0dfQ09OVl9EQVNIX0hfCi0KLSNpbmNsdWRlICIuLi9hZ2cyMy9hZ2dfY29udl9kYXNoLmgiCi0KLSNlbmRpZiAgLy8gRlhGWF9BR0dfQ09OVl9EQVNIX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FnZy9pbmNsdWRlL2Z4ZnhfYWdnX2NvbnZfc3Ryb2tlLmggYi9jb3JlL3NyYy9meGdlL2FnZy9pbmNsdWRlL2Z4ZnhfYWdnX2NvbnZfc3Ryb2tlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMWRmNTAuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meGZ4X2FnZ19jb252X3N0cm9rZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBGWEZYX0FHR19DT05WX1NUUk9LRV9IXwotI2RlZmluZSBGWEZYX0FHR19DT05WX1NUUk9LRV9IXwotCi0jaW5jbHVkZSAiLi4vYWdnMjMvYWdnX2NvbnZfc3Ryb2tlLmgiCi0KLSNlbmRpZiAgLy8gRlhGWF9BR0dfQ09OVl9TVFJPS0VfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYWdnL2luY2x1ZGUvZnhmeF9hZ2dfY3VydmVzLmggYi9jb3JlL3NyYy9meGdlL2FnZy9pbmNsdWRlL2Z4ZnhfYWdnX2N1cnZlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODc5OTU4Li4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Z2UvYWdnL2luY2x1ZGUvZnhmeF9hZ2dfY3VydmVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIEZYRlhfQUdHX0NVUlZFU19IXwotI2RlZmluZSBGWEZYX0FHR19DVVJWRVNfSF8KLQotI2luY2x1ZGUgIi4uL2FnZzIzL2FnZ19jdXJ2ZXMuaCIKLQotI2VuZGlmICAvLyBGWEZYX0FHR19DVVJWRVNfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYWdnL2luY2x1ZGUvZnhmeF9hZ2dfcGF0aF9zdG9yYWdlLmggYi9jb3JlL3NyYy9meGdlL2FnZy9pbmNsdWRlL2Z4ZnhfYWdnX3BhdGhfc3RvcmFnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjdhODViLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Z2UvYWdnL2luY2x1ZGUvZnhmeF9hZ2dfcGF0aF9zdG9yYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIEZYRlhfQUdHX1BBVEhfU1RPUkFHRV9IXwotI2RlZmluZSBGWEZYX0FHR19QQVRIX1NUT1JBR0VfSF8KLQotI2luY2x1ZGUgIi4uL2FnZzIzL2FnZ19wYXRoX3N0b3JhZ2UuaCIKLQotI2VuZGlmICAvLyBGWEZYX0FHR19QQVRIX1NUT1JBR0VfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYWdnL2luY2x1ZGUvZnhmeF9hZ2dfcmFzdGVyaXplcl9zY2FubGluZV9hYS5oIGIvY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meGZ4X2FnZ19yYXN0ZXJpemVyX3NjYW5saW5lX2FhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NDUyOTguLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meGZ4X2FnZ19yYXN0ZXJpemVyX3NjYW5saW5lX2FhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIEZYRlhfQUdHX1JBU1RFUklaRVJfU0NBTkxJTkVfQUFfSF8KLSNkZWZpbmUgRlhGWF9BR0dfUkFTVEVSSVpFUl9TQ0FOTElORV9BQV9IXwotCi0jaW5jbHVkZSAiLi4vYWdnMjMvYWdnX3Jhc3Rlcml6ZXJfc2NhbmxpbmVfYWEuaCIKLQotI2VuZGlmICAvLyBGWEZYX0FHR19SQVNURVJJWkVSX1NDQU5MSU5FX0FBX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FnZy9pbmNsdWRlL2Z4ZnhfYWdnX3JlbmRlcmVyX3NjYW5saW5lLmggYi9jb3JlL3NyYy9meGdlL2FnZy9pbmNsdWRlL2Z4ZnhfYWdnX3JlbmRlcmVyX3NjYW5saW5lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NzVkYWIuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meGZ4X2FnZ19yZW5kZXJlcl9zY2FubGluZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBGWEZYX0FHR19SRU5ERVJfU0NBTkxJTkVfSF8KLSNkZWZpbmUgRlhGWF9BR0dfUkVOREVSX1NDQU5MSU5FX0hfCi0KLSNpbmNsdWRlICIuLi9hZ2cyMy9hZ2dfcmVuZGVyZXJfc2NhbmxpbmUuaCIKLQotI2VuZGlmICAvLyBGWEZYX0FHR19SRU5ERVJfU0NBTkxJTkVfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYWdnL2luY2x1ZGUvZnhmeF9hZ2dfcmVuZGVyaW5nX2J1ZmZlci5oIGIvY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meGZ4X2FnZ19yZW5kZXJpbmdfYnVmZmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYjQ4YjguLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meGZ4X2FnZ19yZW5kZXJpbmdfYnVmZmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIEZYRlhfQUdHX1JFTkRFUklOR19CVUZGRVJfSF8KLSNkZWZpbmUgRlhGWF9BR0dfUkVOREVSSU5HX0JVRkZFUl9IXwotCi0jaW5jbHVkZSAiLi4vYWdnMjMvYWdnX3JlbmRlcmluZ19idWZmZXIuaCIKLQotI2VuZGlmICAvLyBGWEZYX0FHR19SRU5ERVJJTkdfQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FnZy9pbmNsdWRlL2Z4ZnhfYWdnX3NjYW5saW5lX3UuaCBiL2NvcmUvc3JjL2Z4Z2UvYWdnL2luY2x1ZGUvZnhmeF9hZ2dfc2NhbmxpbmVfdS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODUwZjYyLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL2Z4Z2UvYWdnL2luY2x1ZGUvZnhmeF9hZ2dfc2NhbmxpbmVfdS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBGWEZYX0FHR19TQ0FOTElORV9VX0hfCi0jZGVmaW5lIEZYRlhfQUdHX1NDQU5MSU5FX1VfSF8KLQotI2luY2x1ZGUgIi4uL2FnZzIzL2FnZ19zY2FubGluZV91LmgiCi0KLSNlbmRpZiAgLy8gRlhGWF9BR0dfU0NBTkxJTkVfVV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hZ2cvc3JjL2Z4X2FnZ19kcml2ZXIuY3BwIGIvY29yZS9zcmMvZnhnZS9hZ2cvc3JjL2Z4X2FnZ19kcml2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4Mjg1MzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGdlL2FnZy9zcmMvZnhfYWdnX2RyaXZlci5jcHAKQEAgLTAsMCArMSwxNzk1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL3NyYy9meGdlL2FnZy9pbmNsdWRlL2Z4X2FnZ19kcml2ZXIuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKKyNpbmNsdWRlICJjb3JlL3NyYy9meGdlL2RpYi9kaWJfaW50LmgiCisjaW5jbHVkZSAiY29yZS9zcmMvZnhnZS9nZS90ZXh0X2ludC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2FnZzIzL2FnZ19jb252X2Rhc2guaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfY29udl9zdHJva2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfY3VydmVzLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYWdnMjMvYWdnX3BhdGhfc3RvcmFnZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2FnZzIzL2FnZ19waXhmbXRfZ3JheS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2FnZzIzL2FnZ19yYXN0ZXJpemVyX3NjYW5saW5lX2FhLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYWdnMjMvYWdnX3JlbmRlcmVyX3NjYW5saW5lLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYWdnMjMvYWdnX3NjYW5saW5lX3UuaCIKKworbmFtZXNwYWNlIHsKKwordm9pZCBIYXJkQ2xpcChGWF9GTE9BVCYgeCwgRlhfRkxPQVQmIHkpIHsKKyAgeCA9IHN0ZDo6bWF4KHN0ZDo6bWluKHgsIDUwMDAwLjBmKSwgLTUwMDAwLjBmKTsKKyAgeSA9IHN0ZDo6bWF4KHN0ZDo6bWluKHksIDUwMDAwLjBmKSwgLTUwMDAwLjBmKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK3ZvaWQgQ0FnZ19QYXRoRGF0YTo6QnVpbGRQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UpIHsKKyAgaW50IG5Qb2ludHMgPSBwUGF0aERhdGEtPkdldFBvaW50Q291bnQoKTsKKyAgRlhfUEFUSFBPSU5UKiBwUG9pbnRzID0gcFBhdGhEYXRhLT5HZXRQb2ludHMoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuUG9pbnRzOyBpKyspIHsKKyAgICBGWF9GTE9BVCB4ID0gcFBvaW50c1tpXS5tX1BvaW50WCwgeSA9IHBQb2ludHNbaV0ubV9Qb2ludFk7CisgICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7CisgICAgICBwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtKHgsIHkpOworICAgIH0KKyAgICBIYXJkQ2xpcCh4LCB5KTsKKyAgICBpbnQgcG9pbnRfdHlwZSA9IHBQb2ludHNbaV0ubV9GbGFnICYgRlhQVF9UWVBFOworICAgIGlmIChwb2ludF90eXBlID09IEZYUFRfTU9WRVRPKSB7CisgICAgICBtX1BhdGhEYXRhLm1vdmVfdG8oeCwgeSk7CisgICAgfSBlbHNlIGlmIChwb2ludF90eXBlID09IEZYUFRfTElORVRPKSB7CisgICAgICBpZiAocFBvaW50c1tpIC0gMV0ubV9GbGFnID09IEZYUFRfTU9WRVRPICYmCisgICAgICAgICAgKGkgPT0gblBvaW50cyAtIDEgfHwgcFBvaW50c1tpICsgMV0ubV9GbGFnID09IEZYUFRfTU9WRVRPKSAmJgorICAgICAgICAgIHBQb2ludHNbaV0ubV9Qb2ludFggPT0gcFBvaW50c1tpIC0gMV0ubV9Qb2ludFggJiYKKyAgICAgICAgICBwUG9pbnRzW2ldLm1fUG9pbnRZID09IHBQb2ludHNbaSAtIDFdLm1fUG9pbnRZKSB7CisgICAgICAgIHggKz0gMTsKKyAgICAgIH0KKyAgICAgIG1fUGF0aERhdGEubGluZV90byh4LCB5KTsKKyAgICB9IGVsc2UgaWYgKHBvaW50X3R5cGUgPT0gRlhQVF9CRVpJRVJUTykgeworICAgICAgRlhfRkxPQVQgeDAgPSBwUG9pbnRzW2kgLSAxXS5tX1BvaW50WCwgeTAgPSBwUG9pbnRzW2kgLSAxXS5tX1BvaW50WTsKKyAgICAgIEZYX0ZMT0FUIHgyID0gcFBvaW50c1tpICsgMV0ubV9Qb2ludFgsIHkyID0gcFBvaW50c1tpICsgMV0ubV9Qb2ludFk7CisgICAgICBGWF9GTE9BVCB4MyA9IHBQb2ludHNbaSArIDJdLm1fUG9pbnRYLCB5MyA9IHBQb2ludHNbaSArIDJdLm1fUG9pbnRZOworICAgICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7CisgICAgICAgIHBPYmplY3QyRGV2aWNlLT5UcmFuc2Zvcm0oeDAsIHkwKTsKKyAgICAgICAgcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybSh4MiwgeTIpOworICAgICAgICBwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtKHgzLCB5Myk7CisgICAgICB9CisgICAgICBhZ2c6OmN1cnZlNCBjdXJ2ZSh4MCwgeTAsIHgsIHksIHgyLCB5MiwgeDMsIHkzKTsKKyAgICAgIGkgKz0gMjsKKyAgICAgIG1fUGF0aERhdGEuYWRkX3BhdGhfY3VydmUoY3VydmUpOworICAgIH0KKyAgICBpZiAocFBvaW50c1tpXS5tX0ZsYWcgJiBGWFBUX0NMT1NFRklHVVJFKSB7CisgICAgICBtX1BhdGhEYXRhLmVuZF9wb2x5KCk7CisgICAgfQorICB9Cit9CituYW1lc3BhY2UgYWdnIHsKKwordGVtcGxhdGUgPGNsYXNzIEJhc2VSZW5kZXJlcj4KK2NsYXNzIHJlbmRlcmVyX3NjYW5saW5lX2FhX29mZnNldCB7CisgcHVibGljOgorICB0eXBlZGVmIEJhc2VSZW5kZXJlciBiYXNlX3Jlbl90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfcmVuX3R5cGU6OmNvbG9yX3R5cGUgY29sb3JfdHlwZTsKKyAgcmVuZGVyZXJfc2NhbmxpbmVfYWFfb2Zmc2V0KGJhc2VfcmVuX3R5cGUmIHJlbiwgdW5zaWduZWQgbGVmdCwgdW5zaWduZWQgdG9wKQorICAgICAgOiBtX3JlbigmcmVuKSwgbV9sZWZ0KGxlZnQpLCBtX3RvcCh0b3ApIHt9CisgIHZvaWQgY29sb3IoY29uc3QgY29sb3JfdHlwZSYgYykgeyBtX2NvbG9yID0gYzsgfQorICBjb25zdCBjb2xvcl90eXBlJiBjb2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fY29sb3I7IH0KKyAgdm9pZCBwcmVwYXJlKHVuc2lnbmVkKSB7fQorICB0ZW1wbGF0ZSA8Y2xhc3MgU2NhbmxpbmU+CisgIHZvaWQgcmVuZGVyKGNvbnN0IFNjYW5saW5lJiBzbCkgeworICAgIGludCB5ID0gc2wueSgpOworICAgIHVuc2lnbmVkIG51bV9zcGFucyA9IHNsLm51bV9zcGFucygpOworICAgIHR5cGVuYW1lIFNjYW5saW5lOjpjb25zdF9pdGVyYXRvciBzcGFuID0gc2wuYmVnaW4oKTsKKyAgICBmb3IgKDs7KSB7CisgICAgICBpbnQgeCA9IHNwYW4tPng7CisgICAgICBpZiAoc3Bhbi0+bGVuID4gMCkgeworICAgICAgICBtX3Jlbi0+YmxlbmRfc29saWRfaHNwYW4oeCAtIG1fbGVmdCwgeSAtIG1fdG9wLCAodW5zaWduZWQpc3Bhbi0+bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb2xvciwgc3Bhbi0+Y292ZXJzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fcmVuLT5ibGVuZF9obGluZSh4IC0gbV9sZWZ0LCB5IC0gbV90b3AsICh1bnNpZ25lZCkoeCAtIHNwYW4tPmxlbiAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb2xvciwgKihzcGFuLT5jb3ZlcnMpKTsKKyAgICAgIH0KKyAgICAgIGlmICgtLW51bV9zcGFucyA9PSAwKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgKytzcGFuOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgYmFzZV9yZW5fdHlwZSogbV9yZW47CisgIGNvbG9yX3R5cGUgbV9jb2xvcjsKKyAgdW5zaWduZWQgbV9sZWZ0LCBtX3RvcDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhZ2cKKworc3RhdGljIHZvaWQgUmFzdGVyaXplU3Ryb2tlKGFnZzo6cmFzdGVyaXplcl9zY2FubGluZV9hYSYgcmFzdGVyaXplciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2c6OnBhdGhfc3RvcmFnZSYgcGF0aF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc2NhbGUgPSAxLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0cm9rZUFkanVzdCA9IEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRleHRNb2RlID0gRkFMU0UpIHsKKyAgYWdnOjpsaW5lX2NhcF9lIGNhcDsKKyAgc3dpdGNoIChwR3JhcGhTdGF0ZS0+bV9MaW5lQ2FwKSB7CisgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBSb3VuZDoKKyAgICAgIGNhcCA9IGFnZzo6cm91bmRfY2FwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBTcXVhcmU6CisgICAgICBjYXAgPSBhZ2c6OnNxdWFyZV9jYXA7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgY2FwID0gYWdnOjpidXR0X2NhcDsKKyAgICAgIGJyZWFrOworICB9CisgIGFnZzo6bGluZV9qb2luX2Ugam9pbjsKKyAgc3dpdGNoIChwR3JhcGhTdGF0ZS0+bV9MaW5lSm9pbikgeworICAgIGNhc2UgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pblJvdW5kOgorICAgICAgam9pbiA9IGFnZzo6cm91bmRfam9pbjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pbkJldmVsOgorICAgICAgam9pbiA9IGFnZzo6YmV2ZWxfam9pbjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBqb2luID0gYWdnOjptaXRlcl9qb2luX3JldmVydDsKKyAgICAgIGJyZWFrOworICB9CisgIEZYX0ZMT0FUIHdpZHRoID0gcEdyYXBoU3RhdGUtPm1fTGluZVdpZHRoICogc2NhbGU7CisgIEZYX0ZMT0FUIHVuaXQgPSAxLmY7CisgIGlmIChwT2JqZWN0MkRldmljZSkgeworICAgIHVuaXQgPSBGWFNZU19EaXYoCisgICAgICAgIDEuMGYsIChwT2JqZWN0MkRldmljZS0+R2V0WFVuaXQoKSArIHBPYmplY3QyRGV2aWNlLT5HZXRZVW5pdCgpKSAvIDIpOworICB9CisgIGlmICh3aWR0aCA8IHVuaXQpIHsKKyAgICB3aWR0aCA9IHVuaXQ7CisgIH0KKyAgaWYgKHBHcmFwaFN0YXRlLT5tX0Rhc2hBcnJheSkgeworICAgIHR5cGVkZWYgYWdnOjpjb252X2Rhc2g8YWdnOjpwYXRoX3N0b3JhZ2U+IGRhc2hfY29udmVydGVyOworICAgIGRhc2hfY29udmVydGVyIGRhc2gocGF0aF9kYXRhKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IChwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQgKyAxKSAvIDI7IGkrKykgeworICAgICAgRlhfRkxPQVQgb24gPSBwR3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXlbaSAqIDJdOworICAgICAgaWYgKG9uIDw9IDAuMDAwMDAxZikgeworICAgICAgICBvbiA9IDEuMGYgLyAxMDsKKyAgICAgIH0KKyAgICAgIEZYX0ZMT0FUIG9mZiA9IGkgKiAyICsgMSA9PSBwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICA/IG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgOiBwR3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXlbaSAqIDIgKyAxXTsKKyAgICAgIGlmIChvZmYgPCAwKSB7CisgICAgICAgIG9mZiA9IDA7CisgICAgICB9CisgICAgICBkYXNoLmFkZF9kYXNoKG9uICogc2NhbGUsIG9mZiAqIHNjYWxlKTsKKyAgICB9CisgICAgZGFzaC5kYXNoX3N0YXJ0KHBHcmFwaFN0YXRlLT5tX0Rhc2hQaGFzZSAqIHNjYWxlKTsKKyAgICB0eXBlZGVmIGFnZzo6Y29udl9zdHJva2U8ZGFzaF9jb252ZXJ0ZXI+IGRhc2hfc3Ryb2tlOworICAgIGRhc2hfc3Ryb2tlIHN0cm9rZShkYXNoKTsKKyAgICBzdHJva2UubGluZV9qb2luKGpvaW4pOworICAgIHN0cm9rZS5saW5lX2NhcChjYXApOworICAgIHN0cm9rZS5taXRlcl9saW1pdChwR3JhcGhTdGF0ZS0+bV9NaXRlckxpbWl0KTsKKyAgICBzdHJva2Uud2lkdGgod2lkdGgpOworICAgIHJhc3Rlcml6ZXIuYWRkX3BhdGhfdHJhbnNmb3JtZWQoc3Ryb2tlLCBwT2JqZWN0MkRldmljZSk7CisgIH0gZWxzZSB7CisgICAgYWdnOjpjb252X3N0cm9rZTxhZ2c6OnBhdGhfc3RvcmFnZT4gc3Ryb2tlKHBhdGhfZGF0YSk7CisgICAgc3Ryb2tlLmxpbmVfam9pbihqb2luKTsKKyAgICBzdHJva2UubGluZV9jYXAoY2FwKTsKKyAgICBzdHJva2UubWl0ZXJfbGltaXQocEdyYXBoU3RhdGUtPm1fTWl0ZXJMaW1pdCk7CisgICAgc3Ryb2tlLndpZHRoKHdpZHRoKTsKKyAgICByYXN0ZXJpemVyLmFkZF9wYXRoX3RyYW5zZm9ybWVkKHN0cm9rZSwgcE9iamVjdDJEZXZpY2UpOworICB9Cit9CitJRlhfUmVuZGVyRGV2aWNlRHJpdmVyKiBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyOjpDcmVhdGVGeGdlRHJpdmVyKAorICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsCisgICAgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLAorICAgIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQpIHsKKyAgcmV0dXJuIG5ldyBDRlhfQWdnRGV2aWNlRHJpdmVyKHBCaXRtYXAsIDAsIGJSZ2JCeXRlT3JkZXIsIHBPcmlEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiR3JvdXBLbm9ja291dCk7Cit9CitDRlhfQWdnRGV2aWNlRHJpdmVyOjpDRlhfQWdnRGV2aWNlRHJpdmVyKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpdGhlcl9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiR3JvdXBLbm9ja291dCkgeworICBtX3BCaXRtYXAgPSBwQml0bWFwOworICBtX0RpdGhlckJpdHMgPSBkaXRoZXJfYml0czsKKyAgbV9wQ2xpcFJnbiA9IE5VTEw7CisgIG1fcFBsYXRmb3JtQml0bWFwID0gTlVMTDsKKyAgbV9wUGxhdGZvcm1HcmFwaGljcyA9IE5VTEw7CisgIG1fcER3UmVuZGVyVGFydGdldCA9IE5VTEw7CisgIG1fYlJnYkJ5dGVPcmRlciA9IGJSZ2JCeXRlT3JkZXI7CisgIG1fcE9yaURldmljZSA9IHBPcmlEZXZpY2U7CisgIG1fYkdyb3VwS25vY2tvdXQgPSBiR3JvdXBLbm9ja291dDsKKyAgbV9GaWxsRmxhZ3MgPSAwOworICBJbml0UGxhdGZvcm0oKTsKK30KK0NGWF9BZ2dEZXZpY2VEcml2ZXI6On5DRlhfQWdnRGV2aWNlRHJpdmVyKCkgeworICBkZWxldGUgbV9wQ2xpcFJnbjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1N0YXRlU3RhY2suR2V0U2l6ZSgpOyBpKyspCisgICAgZGVsZXRlIG1fU3RhdGVTdGFja1tpXTsKKyAgRGVzdHJveVBsYXRmb3JtKCk7Cit9CisjaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KK3ZvaWQgQ0ZYX0FnZ0RldmljZURyaXZlcjo6SW5pdFBsYXRmb3JtKCkge30KK3ZvaWQgQ0ZYX0FnZ0RldmljZURyaXZlcjo6RGVzdHJveVBsYXRmb3JtKCkge30KK0ZYX0JPT0wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6RHJhd0RldmljZVRleHQoaW50IG5DaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIHJldHVybiBGQUxTRTsKK30KKyNlbmRpZgoraW50IENGWF9BZ2dEZXZpY2VEcml2ZXI6OkdldERldmljZUNhcHMoaW50IGNhcHNfaWQpIHsKKyAgc3dpdGNoIChjYXBzX2lkKSB7CisgICAgY2FzZSBGWERDX0RFVklDRV9DTEFTUzoKKyAgICAgIHJldHVybiBGWERDX0RJU1BMQVk7CisgICAgY2FzZSBGWERDX1BJWEVMX1dJRFRIOgorICAgICAgcmV0dXJuIG1fcEJpdG1hcC0+R2V0V2lkdGgoKTsKKyAgICBjYXNlIEZYRENfUElYRUxfSEVJR0hUOgorICAgICAgcmV0dXJuIG1fcEJpdG1hcC0+R2V0SGVpZ2h0KCk7CisgICAgY2FzZSBGWERDX0JJVFNfUElYRUw6CisgICAgICByZXR1cm4gbV9wQml0bWFwLT5HZXRCUFAoKTsKKyAgICBjYXNlIEZYRENfSE9SWl9TSVpFOgorICAgIGNhc2UgRlhEQ19WRVJUX1NJWkU6CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIEZYRENfUkVOREVSX0NBUFM6IHsKKyAgICAgIGludCBmbGFncyA9IEZYUkNfR0VUX0JJVFMgfCBGWFJDX0FMUEhBX1BBVEggfCBGWFJDX0FMUEhBX0lNQUdFIHwKKyAgICAgICAgICAgICAgICAgIEZYUkNfQkxFTkRfTU9ERSB8IEZYUkNfU09GVF9DTElQOworICAgICAgaWYgKG1fcEJpdG1hcC0+SGFzQWxwaGEoKSkgeworICAgICAgICBmbGFncyB8PSBGWFJDX0FMUEhBX09VVFBVVDsKKyAgICAgIH0gZWxzZSBpZiAobV9wQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7CisgICAgICAgIGlmIChtX3BCaXRtYXAtPkdldEJQUCgpID09IDEpIHsKKyAgICAgICAgICBmbGFncyB8PSBGWFJDX0JJVE1BU0tfT1VUUFVUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZsYWdzIHw9IEZYUkNfQllURU1BU0tfT1VUUFVUOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAobV9wQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7CisgICAgICAgIGZsYWdzIHw9IEZYUkNfQ01ZS19PVVRQVVQ7CisgICAgICB9CisgICAgICByZXR1cm4gZmxhZ3M7CisgICAgfQorICAgIGNhc2UgRlhEQ19ESVRIRVJfQklUUzoKKyAgICAgIHJldHVybiBtX0RpdGhlckJpdHM7CisgIH0KKyAgcmV0dXJuIDA7Cit9Cit2b2lkIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlNhdmVTdGF0ZSgpIHsKKyAgQ0ZYX0NsaXBSZ24qIHBDbGlwID0gTlVMTDsKKyAgaWYgKG1fcENsaXBSZ24pIHsKKyAgICBwQ2xpcCA9IG5ldyBDRlhfQ2xpcFJnbigqbV9wQ2xpcFJnbik7CisgIH0KKyAgbV9TdGF0ZVN0YWNrLkFkZChwQ2xpcCk7Cit9Cit2b2lkIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQpIHsKKyAgaWYgKG1fU3RhdGVTdGFjay5HZXRTaXplKCkgPT0gMCkgeworICAgIGRlbGV0ZSBtX3BDbGlwUmduOworICAgIG1fcENsaXBSZ24gPSBOVUxMOworICAgIHJldHVybjsKKyAgfQorICBDRlhfQ2xpcFJnbiogcFNhdmVkQ2xpcCA9IG1fU3RhdGVTdGFja1ttX1N0YXRlU3RhY2suR2V0U2l6ZSgpIC0gMV07CisgIGRlbGV0ZSBtX3BDbGlwUmduOworICBtX3BDbGlwUmduID0gTlVMTDsKKyAgaWYgKGJLZWVwU2F2ZWQpIHsKKyAgICBpZiAocFNhdmVkQ2xpcCkgeworICAgICAgbV9wQ2xpcFJnbiA9IG5ldyBDRlhfQ2xpcFJnbigqcFNhdmVkQ2xpcCk7CisgICAgfQorICB9IGVsc2UgeworICAgIG1fU3RhdGVTdGFjay5SZW1vdmVBdChtX1N0YXRlU3RhY2suR2V0U2l6ZSgpIC0gMSk7CisgICAgbV9wQ2xpcFJnbiA9IHBTYXZlZENsaXA7CisgIH0KK30KK3ZvaWQgQ0ZYX0FnZ0RldmljZURyaXZlcjo6U2V0Q2xpcE1hc2soYWdnOjpyYXN0ZXJpemVyX3NjYW5saW5lX2FhJiByYXN0ZXJpemVyKSB7CisgIEZYX1JFQ1QgcGF0aF9yZWN0KHJhc3Rlcml6ZXIubWluX3goKSwgcmFzdGVyaXplci5taW5feSgpLAorICAgICAgICAgICAgICAgICAgICByYXN0ZXJpemVyLm1heF94KCkgKyAxLCByYXN0ZXJpemVyLm1heF95KCkgKyAxKTsKKyAgcGF0aF9yZWN0LkludGVyc2VjdChtX3BDbGlwUmduLT5HZXRCb3goKSk7CisgIENGWF9ESUJpdG1hcFJlZiBtYXNrOworICBDRlhfRElCaXRtYXAqIHBUaGlzTGF5ZXIgPSBtYXNrLk5ldygpOworICBpZiAoIXBUaGlzTGF5ZXIpIHsKKyAgICByZXR1cm47CisgIH0KKyAgcFRoaXNMYXllci0+Q3JlYXRlKHBhdGhfcmVjdC5XaWR0aCgpLCBwYXRoX3JlY3QuSGVpZ2h0KCksIEZYRElCXzhicHBNYXNrKTsKKyAgcFRoaXNMYXllci0+Q2xlYXIoMCk7CisgIGFnZzo6cmVuZGVyaW5nX2J1ZmZlciByYXdfYnVmKHBUaGlzTGF5ZXItPkdldEJ1ZmZlcigpLCBwVGhpc0xheWVyLT5HZXRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGhpc0xheWVyLT5HZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXNMYXllci0+R2V0UGl0Y2goKSk7CisgIGFnZzo6cGl4Zm10X2dyYXk4IHBpeGVsX2J1ZihyYXdfYnVmKTsKKyAgYWdnOjpyZW5kZXJlcl9iYXNlPGFnZzo6cGl4Zm10X2dyYXk4PiBiYXNlX2J1ZihwaXhlbF9idWYpOworICBhZ2c6OnJlbmRlcmVyX3NjYW5saW5lX2FhX29mZnNldDxhZ2c6OnJlbmRlcmVyX2Jhc2U8YWdnOjpwaXhmbXRfZ3JheTg+ID4KKyAgICAgIGZpbmFsX3JlbmRlcihiYXNlX2J1ZiwgcGF0aF9yZWN0LmxlZnQsIHBhdGhfcmVjdC50b3ApOworICBmaW5hbF9yZW5kZXIuY29sb3IoYWdnOjpncmF5OCgyNTUpKTsKKyAgYWdnOjpzY2FubGluZV91OCBzY2FubGluZTsKKyAgYWdnOjpyZW5kZXJfc2NhbmxpbmVzKHJhc3Rlcml6ZXIsIHNjYW5saW5lLCBmaW5hbF9yZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAobV9GaWxsRmxhZ3MgJiBGWEZJTExfTk9QQVRIU01PT1RIKSAhPSAwKTsKKyAgbV9wQ2xpcFJnbi0+SW50ZXJzZWN0TWFza0YocGF0aF9yZWN0LmxlZnQsIHBhdGhfcmVjdC50b3AsIG1hc2spOworfQorRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUpIHsKKyAgbV9GaWxsRmxhZ3MgPSBmaWxsX21vZGU7CisgIGlmICghbV9wQ2xpcFJnbikgeworICAgIG1fcENsaXBSZ24gPSBuZXcgQ0ZYX0NsaXBSZ24oR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKTsKKyAgfQorICBpZiAocFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgPT0gNSB8fCBwUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSA9PSA0KSB7CisgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0ZjsKKyAgICBpZiAocFBhdGhEYXRhLT5Jc1JlY3QocE9iamVjdDJEZXZpY2UsICZyZWN0ZikpIHsKKyAgICAgIHJlY3RmLkludGVyc2VjdCgKKyAgICAgICAgICBDRlhfRmxvYXRSZWN0KDAsIDAsIChGWF9GTE9BVClHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpLAorICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKUdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKSk7CisgICAgICBGWF9SRUNUIHJlY3QgPSByZWN0Zi5HZXRPdXR0ZXJSZWN0KCk7CisgICAgICBtX3BDbGlwUmduLT5JbnRlcnNlY3RSZWN0KHJlY3QpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIENBZ2dfUGF0aERhdGEgcGF0aF9kYXRhOworICBwYXRoX2RhdGEuQnVpbGRQYXRoKHBQYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UpOworICBwYXRoX2RhdGEubV9QYXRoRGF0YS5lbmRfcG9seSgpOworICBhZ2c6OnJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEgcmFzdGVyaXplcjsKKyAgcmFzdGVyaXplci5jbGlwX2JveCgwLjBmLCAwLjBmLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCkpLAorICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCkoR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpKTsKKyAgcmFzdGVyaXplci5hZGRfcGF0aChwYXRoX2RhdGEubV9QYXRoRGF0YSk7CisgIHJhc3Rlcml6ZXIuZmlsbGluZ19ydWxlKChmaWxsX21vZGUgJiAzKSA9PSBGWEZJTExfV0lORElORworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhZ2c6OmZpbGxfbm9uX3plcm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYWdnOjpmaWxsX2V2ZW5fb2RkKTsKKyAgU2V0Q2xpcE1hc2socmFzdGVyaXplcik7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhTdHJva2UoCisgICAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSkgeworICBpZiAoIW1fcENsaXBSZ24pIHsKKyAgICBtX3BDbGlwUmduID0gbmV3IENGWF9DbGlwUmduKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSk7CisgIH0KKyAgQ0FnZ19QYXRoRGF0YSBwYXRoX2RhdGE7CisgIHBhdGhfZGF0YS5CdWlsZFBhdGgocFBhdGhEYXRhLCBOVUxMKTsKKyAgYWdnOjpyYXN0ZXJpemVyX3NjYW5saW5lX2FhIHJhc3Rlcml6ZXI7CisgIHJhc3Rlcml6ZXIuY2xpcF9ib3goMC4wZiwgMC4wZiwgKEZYX0ZMT0FUKShHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKSk7CisgIFJhc3Rlcml6ZVN0cm9rZShyYXN0ZXJpemVyLCBwYXRoX2RhdGEubV9QYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICBwR3JhcGhTdGF0ZSk7CisgIHJhc3Rlcml6ZXIuZmlsbGluZ19ydWxlKGFnZzo6ZmlsbF9ub25femVybyk7CisgIFNldENsaXBNYXNrKHJhc3Rlcml6ZXIpOworICByZXR1cm4gVFJVRTsKK30KK2NsYXNzIENGWF9SZW5kZXJlciB7CisgcHJpdmF0ZToKKyAgaW50IG1fQWxwaGEsIG1fUmVkLCBtX0dyZWVuLCBtX0JsdWUsIG1fR3JheTsKKyAgRlhfRFdPUkQgbV9Db2xvcjsKKyAgRlhfQk9PTCBtX2JGdWxsQ292ZXI7CisgIEZYX0JPT0wgbV9iUmdiQnl0ZU9yZGVyOworICBDRlhfRElCaXRtYXAqIG1fcE9yaURldmljZTsKKyAgRlhfUkVDVCBtX0NsaXBCb3g7CisgIGNvbnN0IENGWF9ESUJpdG1hcCogbV9wQ2xpcE1hc2s7CisgIENGWF9ESUJpdG1hcCogbV9wRGV2aWNlOworICBjb25zdCBDRlhfQ2xpcFJnbiogbV9wQ2xpcFJnbjsKKyAgdm9pZCAoQ0ZYX1JlbmRlcmVyOjoqY29tcG9zaXRlX3NwYW4pKHVpbnQ4X3QqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKTsKKworIHB1YmxpYzoKKyAgdm9pZCBwcmVwYXJlKHVuc2lnbmVkKSB7fQorICB2b2lkIENvbXBvc2l0ZVNwYW4odWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRGVzdEFscGhhLAorICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgICBBU1NFUlQoIW1fcERldmljZS0+SXNDbXlrSW1hZ2UoKSk7CisgICAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7CisgICAgaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodAorICAgICAgICAgICAgICAgICAgICAgID8gc3Bhbl9sZW4KKyAgICAgICAgICAgICAgICAgICAgICA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKKyAgICBpZiAoQnBwKSB7CisgICAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0ICogQnBwOworICAgICAgb3JpX3NjYW4gKz0gY29sX3N0YXJ0ICogQnBwOworICAgIH0gZWxzZSB7CisgICAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0IC8gODsKKyAgICAgIG9yaV9zY2FuICs9IGNvbF9zdGFydCAvIDg7CisgICAgfQorICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKKyAgICAgIGlmIChCcHAgPT0gNCAmJiBiRGVzdEFscGhhKSB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgICAgICBpbnQgc3JjX2FscGhhOworICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYTsKKyAgICAgICAgICB9CisgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KKyAgICAgICAgICAgICAgb3JpX3NjYW5bM10gKyBzcmNfYWxwaGEgLSBvcmlfc2NhblszXSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOworICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgeworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fUmVkLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOworICAgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgICBvcmlfc2NhbisrOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgciA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX1JlZCwgYWxwaGFfcmF0aW8pOworICAgICAgICAgICAgaW50IGcgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOworICAgICAgICAgICAgaW50IGIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9CbHVlLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgICBvcmlfc2NhbisrOworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHIsIGNvdmVyX3NjYW5bY29sXSk7CisgICAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBnLCBjb3Zlcl9zY2FuW2NvbF0pOworICAgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYiwgY292ZXJfc2Nhbltjb2xdKTsKKyAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAyOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAoQnBwID09IDMgfHwgQnBwID09IDQpIHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgICAgIGludCBzcmNfYWxwaGE7CisgICAgICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhOworICAgICAgICAgIH0KKyAgICAgICAgICBpbnQgciA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX1JlZCwgc3JjX2FscGhhKTsKKyAgICAgICAgICBpbnQgZyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyZWVuLCBzcmNfYWxwaGEpOworICAgICAgICAgIGludCBiID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuLCBtX0JsdWUsIHNyY19hbHBoYSk7CisgICAgICAgICAgb3JpX3NjYW4gKz0gQnBwIC0gMjsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgciwgY292ZXJfc2Nhbltjb2xdKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZywgY292ZXJfc2Nhbltjb2xdKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYiwgY292ZXJfc2Nhbltjb2xdKTsKKyAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwIC0gMjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoQnBwID09IDQgJiYgYkRlc3RBbHBoYSkgeworICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgICBpbnQgc3JjX2FscGhhOworICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGE7CisgICAgICAgIH0KKyAgICAgICAgaW50IHNyY19hbHBoYV9jb3ZlcmVkID0gc3JjX2FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OworICAgICAgICBpZiAoc3JjX2FscGhhX2NvdmVyZWQgPT0gMCkgeworICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChjb3Zlcl9zY2FuW2NvbF0gPT0gMjU1KSB7CisgICAgICAgICAgZGVzdF9zY2FuWzNdID0gc3JjX2FscGhhX2NvdmVyZWQ7CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9CbHVlOworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fR3JlZW47CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IG1fUmVkOworICAgICAgICAgIGRlc3Rfc2NhbiArPSAyOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChkZXN0X3NjYW5bM10gPT0gMCkgeworICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gc3JjX2FscGhhX2NvdmVyZWQ7CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IG1fUmVkOworICAgICAgICAgICAgZGVzdF9zY2FuICs9IDI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgdWludDhfdCBjb3ZlciA9IGNvdmVyX3NjYW5bY29sXTsKKyAgICAgICAgICBkZXN0X3NjYW5bM10gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bM10sIHNyY19hbHBoYSwgY292ZXIpOworICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGNvdmVyKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgY292ZXIpOworICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgY292ZXIpOworICAgICAgICAgIGRlc3Rfc2NhbiArPSAyOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChCcHAgPT0gMyB8fCBCcHAgPT0gNCkgeworICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgICBpbnQgc3JjX2FscGhhOworICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgeworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0JsdWUsIHNyY19hbHBoYSk7CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIHNyY19hbHBoYSk7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbiwgbV9SZWQsIHNyY19hbHBoYSk7CisgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcCAtIDI7CisgICAgICAgICAgb3JpX3NjYW4gKz0gQnBwIC0gMjsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbnQgYiA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0JsdWUsIHNyY19hbHBoYSk7CisgICAgICAgIGludCBnID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIHNyY19hbHBoYSk7CisgICAgICAgIGludCByID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuLCBtX1JlZCwgc3JjX2FscGhhKTsKKyAgICAgICAgb3JpX3NjYW4gKz0gQnBwIC0gMjsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGIsIGNvdmVyX3NjYW5bY29sXSk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZywgY292ZXJfc2Nhbltjb2xdKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCByLCBjb3Zlcl9zY2FuW2NvbF0pOworICAgICAgICBkZXN0X3NjYW4gKz0gQnBwIC0gMjsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChCcHAgPT0gMSkgeworICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgICBpbnQgc3JjX2FscGhhOworICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgeworICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmF5LCBzcmNfYWxwaGEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGludCBncmF5ID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JheSwgc3JjX2FscGhhKTsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgY292ZXJfc2Nhbltjb2xdKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgaWYgKG1fcERldmljZS0+R2V0UGFsZXR0ZSgpKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgaWYgKEZYQVJHQl9UT0RJQihtX3BEZXZpY2UtPkdldFBhbGV0dGUoKVtpXSkgPT0gbV9Db2xvcikgeworICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZXggPSAoKHVpbnQ4X3QpbV9Db2xvciA9PSAweGZmKSA/IDEgOiAwOworICAgICAgfQorICAgICAgdWludDhfdCogZGVzdF9zY2FuMSA9IGRlc3Rfc2NhbjsKKyAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgICAgaW50IHNyY19hbHBoYTsKKyAgICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OworICAgICAgICB9CisgICAgICAgIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgICAgICBpZiAoIWluZGV4KSB7CisgICAgICAgICAgICAqZGVzdF9zY2FuMSAmPSB+KDEgPDwgKDcgLSAoY29sICsgc3Bhbl9sZWZ0KSAlIDgpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmRlc3Rfc2NhbjEgfD0gMSA8PCAoNyAtIChjb2wgKyBzcGFuX2xlZnQpICUgOCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlc3Rfc2NhbjEgPSBkZXN0X3NjYW4gKyAoc3Bhbl9sZWZ0ICUgOCArIGNvbCAtIGNvbF9zdGFydCArIDEpIC8gODsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgdm9pZCBDb21wb3NpdGVTcGFuMWJwcCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgeworICAgIEFTU0VSVCghbV9iUmdiQnl0ZU9yZGVyKTsKKyAgICBBU1NFUlQoIW1fcERldmljZS0+SXNDbXlrSW1hZ2UoKSk7CisgICAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7CisgICAgaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodAorICAgICAgICAgICAgICAgICAgICAgID8gc3Bhbl9sZW4KKyAgICAgICAgICAgICAgICAgICAgICA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKKyAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0IC8gODsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIGlmIChtX3BEZXZpY2UtPkdldFBhbGV0dGUoKSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgaWYgKEZYQVJHQl9UT0RJQihtX3BEZXZpY2UtPkdldFBhbGV0dGUoKVtpXSkgPT0gbV9Db2xvcikgeworICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpbmRleCA9ICgodWludDhfdCltX0NvbG9yID09IDB4ZmYpID8gMSA6IDA7CisgICAgfQorICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbjEgPSBkZXN0X3NjYW47CisgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgaW50IHNyY19hbHBoYTsKKyAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgICAgaWYgKCFpbmRleCkgeworICAgICAgICAgICpkZXN0X3NjYW4xICY9IH4oMSA8PCAoNyAtIChjb2wgKyBzcGFuX2xlZnQpICUgOCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpkZXN0X3NjYW4xIHw9IDEgPDwgKDcgLSAoY29sICsgc3Bhbl9sZWZ0KSAlIDgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBkZXN0X3NjYW4xID0gZGVzdF9zY2FuICsgKHNwYW5fbGVmdCAlIDggKyBjb2wgLSBjb2xfc3RhcnQgKyAxKSAvIDg7CisgICAgfQorICB9CisgIHZvaWQgQ29tcG9zaXRlU3BhbkdyYXkodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKKyAgICBBU1NFUlQoIW1fYlJnYkJ5dGVPcmRlcik7CisgICAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7CisgICAgaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodAorICAgICAgICAgICAgICAgICAgICAgID8gc3Bhbl9sZW4KKyAgICAgICAgICAgICAgICAgICAgICA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKKyAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0OworICAgIGlmIChkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKKyAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgICAgaW50IHNyY19hbHBoYTsKKyAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgeworICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjX2FscGhhKSB7CisgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBtX0dyYXk7CisgICAgICAgICAgICAqZGVzdF9leHRyYV9hbHBoYV9zY2FuID0gbV9BbHBoYTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICsgc3JjX2FscGhhIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZGVzdF9leHRyYV9hbHBoYV9zY2FuKSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7CisgICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JheSwgYWxwaGFfcmF0aW8pOworICAgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVzdF9leHRyYV9hbHBoYV9zY2FuKys7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgICAgIGludCBzcmNfYWxwaGE7CisgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdICogY2xpcF9zY2FuW2NvbF0gLyAyNTUgLyAyNTU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjX2FscGhhKSB7CisgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBtX0dyYXk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyYXksIHNyY19hbHBoYSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgfQorICAgIH0KKyAgfQorICB2b2lkIENvbXBvc2l0ZVNwYW5BUkdCKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7CisgICAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7CisgICAgaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodAorICAgICAgICAgICAgICAgICAgICAgID8gc3Bhbl9sZW4KKyAgICAgICAgICAgICAgICAgICAgICA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKKyAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0ICogQnBwOworICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKKyAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgICAgaW50IHNyY19hbHBoYTsKKyAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgeworICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjX2FscGhhKSB7CisgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3Rfc2NhbiA9IG1fQ29sb3I7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9CisgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdICsgc3JjX2FscGhhIC0gZGVzdF9zY2FuWzNdICogc3JjX2FscGhhIC8gMjU1OworICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOworICAgICAgICAgICAgZGVzdF9zY2FuICs9IDI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGE7CisgICAgICBpZiAobV9iRnVsbENvdmVyKSB7CisgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoc3JjX2FscGhhKSB7CisgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9zY2FuID0gbV9Db2xvcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoZGVzdF9zY2FuWzNdID09IDApIHsKKyAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IHNyY19hbHBoYTsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fQmx1ZTsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fR3JlZW47CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gbV9SZWQ7CisgICAgICAgICAgICBkZXN0X3NjYW4gKz0gMjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gKyBzcmNfYWxwaGEgLSBkZXN0X3NjYW5bM10gKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOworICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgYWxwaGFfcmF0aW8pOworICAgICAgICAgIGRlc3Rfc2NhbiArPSAyOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgIH0KKyAgfQorICB2b2lkIENvbXBvc2l0ZVNwYW5SR0IodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7CisgICAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7CisgICAgaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodAorICAgICAgICAgICAgICAgICAgICAgID8gc3Bhbl9sZW4KKyAgICAgICAgICAgICAgICAgICAgICA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKKyAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0ICogQnBwOworICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKKyAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgICAgaW50IHNyY19hbHBoYTsKKyAgICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OworICAgICAgICB9CisgICAgICAgIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgICAgICAgICAgaWYgKEJwcCA9PSA0KSB7CisgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3Rfc2NhbiA9IG1fQ29sb3I7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEJwcCA9PSAzKSB7CisgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fUmVkOworICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOworICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIHNyY19hbHBoYSk7CisgICAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBzcmNfYWxwaGEpOworICAgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBzcmNfYWxwaGEpOworICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcCAtIDI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKEJwcCA9PSAzICYmIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgeworICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgICBpbnQgc3JjX2FscGhhOworICAgICAgICBpZiAobV9iRnVsbENvdmVyKSB7CisgICAgICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdICogY2xpcF9zY2FuW2NvbF0gLyAyNTUgLyAyNTU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gLyAyNTU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9CbHVlOworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9HcmVlbjsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KW1fUmVkOworICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gKHVpbnQ4X3QpbV9BbHBoYTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKyBzcmNfYWxwaGEgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICogc3JjX2FscGhhIC8gMjU1OworICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKKyAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgYWxwaGFfcmF0aW8pOworICAgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVzdF9leHRyYV9hbHBoYV9zY2FuKys7CisgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgICAgaW50IHNyY19hbHBoYTsKKyAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgeworICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjX2FscGhhKSB7CisgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgICAgIGlmIChCcHAgPT0gNCkgeworICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSBtX0NvbG9yOworICAgICAgICAgICAgfSBlbHNlIGlmIChCcHAgPT0gMykgeworICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7CisgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fR3JlZW47CisgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fUmVkOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgc3JjX2FscGhhKTsKKyAgICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIHNyY19hbHBoYSk7CisgICAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgc3JjX2FscGhhKTsKKyAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHAgLSAyOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7CisgICAgICB9CisgICAgfQorICB9CisgIHZvaWQgQ29tcG9zaXRlU3BhbkNNWUsodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKKyAgICBBU1NFUlQoIW1fYlJnYkJ5dGVPcmRlcik7CisgICAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7CisgICAgaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodAorICAgICAgICAgICAgICAgICAgICAgID8gc3Bhbl9sZW4KKyAgICAgICAgICAgICAgICAgICAgICA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKKyAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0ICogNDsKKyAgICBpZiAoZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7CisgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgICAgIGludCBzcmNfYWxwaGE7CisgICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKKyAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGE7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNyY19hbHBoYSkgeworICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgICAgICAgICAqKEZYX0NNWUsqKWRlc3Rfc2NhbiA9IG1fQ29sb3I7CisgICAgICAgICAgICAqZGVzdF9leHRyYV9hbHBoYV9zY2FuID0gKHVpbnQ4X3QpbV9BbHBoYTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICsgc3JjX2FscGhhIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZGVzdF9leHRyYV9hbHBoYV9zY2FuKSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7CisgICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JheSwgYWxwaGFfcmF0aW8pOworICAgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVzdF9leHRyYV9hbHBoYV9zY2FuKys7CisgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgICAgIGludCBzcmNfYWxwaGE7CisgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdICogY2xpcF9zY2FuW2NvbF0gLyAyNTUgLyAyNTU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjX2FscGhhKSB7CisgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgICAgICooRlhfQ01ZSyopZGVzdF9zY2FuID0gbV9Db2xvcjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOworICAgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgc3JjX2FscGhhKTsKKyAgICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgc3JjX2FscGhhKTsKKyAgICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JheSwgc3JjX2FscGhhKTsKKyAgICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgfQorICAgIH0KKyAgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgU2NhbmxpbmU+CisgIHZvaWQgcmVuZGVyKGNvbnN0IFNjYW5saW5lJiBzbCkgeworICAgIGlmICghbV9wT3JpRGV2aWNlICYmICFjb21wb3NpdGVfc3BhbikgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQgeSA9IHNsLnkoKTsKKyAgICBpZiAoeSA8IG1fQ2xpcEJveC50b3AgfHwgeSA+PSBtX0NsaXBCb3guYm90dG9tKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IG1fcERldmljZS0+R2V0QnVmZmVyKCkgKyBtX3BEZXZpY2UtPkdldFBpdGNoKCkgKiB5OworICAgIHVpbnQ4X3QqIGRlc3Rfc2Nhbl9leHRyYV9hbHBoYSA9IE5VTEw7CisgICAgQ0ZYX0RJQml0bWFwKiBwQWxwaGFNYXNrID0gbV9wRGV2aWNlLT5tX3BBbHBoYU1hc2s7CisgICAgaWYgKHBBbHBoYU1hc2spIHsKKyAgICAgIGRlc3Rfc2Nhbl9leHRyYV9hbHBoYSA9CisgICAgICAgICAgcEFscGhhTWFzay0+R2V0QnVmZmVyKCkgKyBwQWxwaGFNYXNrLT5HZXRQaXRjaCgpICogeTsKKyAgICB9CisgICAgdWludDhfdCogb3JpX3NjYW4gPSBOVUxMOworICAgIGlmIChtX3BPcmlEZXZpY2UpIHsKKyAgICAgIG9yaV9zY2FuID0gbV9wT3JpRGV2aWNlLT5HZXRCdWZmZXIoKSArIG1fcE9yaURldmljZS0+R2V0UGl0Y2goKSAqIHk7CisgICAgfQorICAgIGludCBCcHAgPSBtX3BEZXZpY2UtPkdldEJQUCgpIC8gODsKKyAgICBGWF9CT09MIGJEZXN0QWxwaGEgPSBtX3BEZXZpY2UtPkhhc0FscGhhKCkgfHwgbV9wRGV2aWNlLT5Jc0FscGhhTWFzaygpOworICAgIHVuc2lnbmVkIG51bV9zcGFucyA9IHNsLm51bV9zcGFucygpOworICAgIHR5cGVuYW1lIFNjYW5saW5lOjpjb25zdF9pdGVyYXRvciBzcGFuID0gc2wuYmVnaW4oKTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgaW50IHggPSBzcGFuLT54OworICAgICAgQVNTRVJUKHNwYW4tPmxlbiA+IDApOworICAgICAgdWludDhfdCogZGVzdF9wb3MgPSBOVUxMOworICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9wb3MgPSBOVUxMOworICAgICAgdWludDhfdCogb3JpX3BvcyA9IE5VTEw7CisgICAgICBpZiAoQnBwKSB7CisgICAgICAgIG9yaV9wb3MgPSBvcmlfc2NhbiA/IG9yaV9zY2FuICsgeCAqIEJwcCA6IE5VTEw7CisgICAgICAgIGRlc3RfcG9zID0gZGVzdF9zY2FuICsgeCAqIEJwcDsKKyAgICAgICAgZGVzdF9leHRyYV9hbHBoYV9wb3MgPQorICAgICAgICAgICAgZGVzdF9zY2FuX2V4dHJhX2FscGhhID8gZGVzdF9zY2FuX2V4dHJhX2FscGhhICsgeCA6IE5VTEw7CisgICAgICB9IGVsc2UgeworICAgICAgICBkZXN0X3BvcyA9IGRlc3Rfc2NhbiArIHggLyA4OworICAgICAgICBvcmlfcG9zID0gb3JpX3NjYW4gPyBvcmlfc2NhbiArIHggLyA4IDogTlVMTDsKKyAgICAgIH0KKyAgICAgIHVpbnQ4X3QqIGNsaXBfcG9zID0gTlVMTDsKKyAgICAgIGlmIChtX3BDbGlwTWFzaykgeworICAgICAgICBjbGlwX3BvcyA9IG1fcENsaXBNYXNrLT5HZXRCdWZmZXIoKSArCisgICAgICAgICAgICAgICAgICAgKHkgLSBtX0NsaXBCb3gudG9wKSAqIG1fcENsaXBNYXNrLT5HZXRQaXRjaCgpICsgeCAtCisgICAgICAgICAgICAgICAgICAgbV9DbGlwQm94LmxlZnQ7CisgICAgICB9CisgICAgICBpZiAob3JpX3BvcykgeworICAgICAgICBDb21wb3NpdGVTcGFuKGRlc3RfcG9zLCBvcmlfcG9zLCBCcHAsIGJEZXN0QWxwaGEsIHgsIHNwYW4tPmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBzcGFuLT5jb3ZlcnMsIG1fQ2xpcEJveC5sZWZ0LCBtX0NsaXBCb3gucmlnaHQsIGNsaXBfcG9zKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICh0aGlzLT4qY29tcG9zaXRlX3NwYW4pKGRlc3RfcG9zLCBCcHAsIHgsIHNwYW4tPmxlbiwgc3Bhbi0+Y292ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0NsaXBCb3gubGVmdCwgbV9DbGlwQm94LnJpZ2h0LCBjbGlwX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9leHRyYV9hbHBoYV9wb3MpOworICAgICAgfQorICAgICAgaWYgKC0tbnVtX3NwYW5zID09IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICArK3NwYW47CisgICAgfQorICB9CisKKyAgRlhfQk9PTCBJbml0KENGWF9ESUJpdG1hcCogcERldmljZSwKKyAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwKKyAgICAgICAgICAgICAgIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwKKyAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgRlhfQk9PTCBiRnVsbENvdmVyLAorICAgICAgICAgICAgICAgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLAorICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpIHsKKyAgICBtX3BEZXZpY2UgPSBwRGV2aWNlOworICAgIG1fcENsaXBSZ24gPSBwQ2xpcFJnbjsKKyAgICBjb21wb3NpdGVfc3BhbiA9IE5VTEw7CisgICAgbV9iUmdiQnl0ZU9yZGVyID0gYlJnYkJ5dGVPcmRlcjsKKyAgICBtX3BPcmlEZXZpY2UgPSBwT3JpRGV2aWNlOworICAgIGlmIChtX3BDbGlwUmduKSB7CisgICAgICBtX0NsaXBCb3ggPSBtX3BDbGlwUmduLT5HZXRCb3goKTsKKyAgICB9IGVsc2UgeworICAgICAgbV9DbGlwQm94LmxlZnQgPSBtX0NsaXBCb3gudG9wID0gMDsKKyAgICAgIG1fQ2xpcEJveC5yaWdodCA9IG1fcERldmljZS0+R2V0V2lkdGgoKTsKKyAgICAgIG1fQ2xpcEJveC5ib3R0b20gPSBtX3BEZXZpY2UtPkdldEhlaWdodCgpOworICAgIH0KKyAgICBtX3BDbGlwTWFzayA9IE5VTEw7CisgICAgaWYgKG1fcENsaXBSZ24gJiYgbV9wQ2xpcFJnbi0+R2V0VHlwZSgpID09IENGWF9DbGlwUmduOjpNYXNrRikgeworICAgICAgbV9wQ2xpcE1hc2sgPSBtX3BDbGlwUmduLT5HZXRNYXNrKCk7CisgICAgfQorICAgIG1fYkZ1bGxDb3ZlciA9IGJGdWxsQ292ZXI7CisgICAgRlhfQk9PTCBiT2JqZWN0Q01ZSyA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZyk7CisgICAgRlhfQk9PTCBiRGV2aWNlQ01ZSyA9IHBEZXZpY2UtPklzQ215a0ltYWdlKCk7CisgICAgbV9BbHBoYSA9IGJPYmplY3RDTVlLID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShjb2xvcik7CisgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IE5VTEw7CisgICAgaWYgKCFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpIHx8CisgICAgICAgICFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKSkgeworICAgICAgcEljY1RyYW5zZm9ybSA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKKyAgICB9CisgICAgaWYgKG1fcERldmljZS0+R2V0QlBQKCkgPT0gOCkgeworICAgICAgQVNTRVJUKCFtX2JSZ2JCeXRlT3JkZXIpOworICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuR3JheTsKKyAgICAgIGlmIChtX3BEZXZpY2UtPklzQWxwaGFNYXNrKCkpIHsKKyAgICAgICAgbV9HcmF5ID0gMjU1OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICAgICAgICB1aW50OF90IGdyYXk7CisgICAgICAgICAgY29sb3IgPSBiT2JqZWN0Q01ZSyA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOworICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KikmY29sb3IsIDEpOworICAgICAgICAgIG1fR3JheSA9IGdyYXk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGJPYmplY3RDTVlLKSB7CisgICAgICAgICAgICB1aW50OF90IHIsIGcsIGI7CisgICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0TVZhbHVlKGNvbG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRZVmFsdWUoY29sb3IpLCBGWFNZU19HZXRLVmFsdWUoY29sb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIGcsIGIpOworICAgICAgICAgICAgbV9HcmF5ID0gRlhSR0IyR1JBWShyLCBnLCBiKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbV9HcmF5ID0KKyAgICAgICAgICAgICAgICBGWFJHQjJHUkFZKEZYQVJHQl9SKGNvbG9yKSwgRlhBUkdCX0coY29sb3IpLCBGWEFSR0JfQihjb2xvcikpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGlmIChiRGV2aWNlQ01ZSykgeworICAgICAgQVNTRVJUKCFtX2JSZ2JCeXRlT3JkZXIpOworICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuQ01ZSzsKKyAgICAgIGlmIChiT2JqZWN0Q01ZSykgeworICAgICAgICBtX0NvbG9yID0gRlhDTVlLX1RPRElCKGNvbG9yKTsKKyAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAodWludDhfdCopJm1fQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKSZtX0NvbG9yLCAxKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFwSWNjVHJhbnNmb3JtKSB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIGNvbG9yID0gRlhBUkdCX1RPRElCKGNvbG9yKTsKKyAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKHVpbnQ4X3QqKSZtX0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopJmNvbG9yLCAxKTsKKyAgICAgIH0KKyAgICAgIG1fUmVkID0gKCh1aW50OF90KikmbV9Db2xvcilbMF07CisgICAgICBtX0dyZWVuID0gKCh1aW50OF90KikmbV9Db2xvcilbMV07CisgICAgICBtX0JsdWUgPSAoKHVpbnQ4X3QqKSZtX0NvbG9yKVsyXTsKKyAgICAgIG1fR3JheSA9ICgodWludDhfdCopJm1fQ29sb3IpWzNdOworICAgIH0gZWxzZSB7CisgICAgICBjb21wb3NpdGVfc3BhbiA9IChwRGV2aWNlLT5HZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuQVJHQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCOworICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICAgICAgY29sb3IgPSBiT2JqZWN0Q01ZSyA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOworICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAodWludDhfdCopJm1fQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KikmY29sb3IsIDEpOworICAgICAgICAoKHVpbnQ4X3QqKSZtX0NvbG9yKVszXSA9IG1fQWxwaGE7CisgICAgICAgIG1fUmVkID0gKCh1aW50OF90KikmbV9Db2xvcilbMl07CisgICAgICAgIG1fR3JlZW4gPSAoKHVpbnQ4X3QqKSZtX0NvbG9yKVsxXTsKKyAgICAgICAgbV9CbHVlID0gKCh1aW50OF90KikmbV9Db2xvcilbMF07CisgICAgICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKKyAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPRElCKG1fQ29sb3IpOworICAgICAgICAgIG1fQ29sb3IgPSBGWEFSR0JfVE9CR1JPUkRFUkRJQihtX0NvbG9yKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGJPYmplY3RDTVlLKSB7CisgICAgICAgICAgdWludDhfdCByLCBnLCBiOworICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUoY29sb3IpLCBGWFNZU19HZXRNVmFsdWUoY29sb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRZVmFsdWUoY29sb3IpLCBGWFNZU19HZXRLVmFsdWUoY29sb3IpLCByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLCBiKTsKKyAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX01BS0UobV9BbHBoYSwgciwgZywgYik7CisgICAgICAgICAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgeworICAgICAgICAgICAgbV9Db2xvciA9IEZYQVJHQl9UT0JHUk9SREVSRElCKG1fQ29sb3IpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPRElCKG1fQ29sb3IpOworICAgICAgICAgIH0KKyAgICAgICAgICBtX1JlZCA9IHI7CisgICAgICAgICAgbV9HcmVlbiA9IGc7CisgICAgICAgICAgbV9CbHVlID0gYjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7CisgICAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPQkdST1JERVJESUIoY29sb3IpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPRElCKGNvbG9yKTsKKyAgICAgICAgICB9CisgICAgICAgICAgQXJnYkRlY29kZShjb2xvciwgbV9BbHBoYSwgbV9SZWQsIG1fR3JlZW4sIG1fQmx1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG1fcERldmljZS0+R2V0QlBQKCkgPT0gMSkgeworICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuMWJwcDsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CisgIH0KK307CitGWF9CT09MIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlJlbmRlclJhc3Rlcml6ZXIoCisgICAgYWdnOjpyYXN0ZXJpemVyX3NjYW5saW5lX2FhJiByYXN0ZXJpemVyLAorICAgIEZYX0RXT1JEIGNvbG9yLAorICAgIEZYX0JPT0wgYkZ1bGxDb3ZlciwKKyAgICBGWF9CT09MIGJHcm91cEtub2Nrb3V0LAorICAgIGludCBhbHBoYV9mbGFnLAorICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgQ0ZYX0RJQml0bWFwKiBwdCA9IGJHcm91cEtub2Nrb3V0ID8gbV9wT3JpRGV2aWNlIDogTlVMTDsKKyAgQ0ZYX1JlbmRlcmVyIHJlbmRlcjsKKyAgaWYgKCFyZW5kZXIuSW5pdChtX3BCaXRtYXAsIHB0LCBtX3BDbGlwUmduLCBjb2xvciwgYkZ1bGxDb3ZlciwKKyAgICAgICAgICAgICAgICAgICBtX2JSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGFnZzo6c2NhbmxpbmVfdTggc2NhbmxpbmU7CisgIGFnZzo6cmVuZGVyX3NjYW5saW5lcyhyYXN0ZXJpemVyLCBzY2FubGluZSwgcmVuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgKG1fRmlsbEZsYWdzICYgRlhGSUxMX05PUEFUSFNNT09USCkgIT0gMCk7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0cm9rZV9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7CisgIGlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoIUdldEJ1ZmZlcigpKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgbV9GaWxsRmxhZ3MgPSBmaWxsX21vZGU7CisgIGlmICgoZmlsbF9tb2RlICYgMykgJiYgZmlsbF9jb2xvcikgeworICAgIENBZ2dfUGF0aERhdGEgcGF0aF9kYXRhOworICAgIHBhdGhfZGF0YS5CdWlsZFBhdGgocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSk7CisgICAgYWdnOjpyYXN0ZXJpemVyX3NjYW5saW5lX2FhIHJhc3Rlcml6ZXI7CisgICAgcmFzdGVyaXplci5jbGlwX2JveCgwLjBmLCAwLjBmLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSkpOworICAgIHJhc3Rlcml6ZXIuYWRkX3BhdGgocGF0aF9kYXRhLm1fUGF0aERhdGEpOworICAgIHJhc3Rlcml6ZXIuZmlsbGluZ19ydWxlKChmaWxsX21vZGUgJiAzKSA9PSBGWEZJTExfV0lORElORworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGFnZzo6ZmlsbF9ub25femVybworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFnZzo6ZmlsbF9ldmVuX29kZCk7CisgICAgaWYgKCFSZW5kZXJSYXN0ZXJpemVyKHJhc3Rlcml6ZXIsIGZpbGxfY29sb3IsIGZpbGxfbW9kZSAmIEZYRklMTF9GVUxMQ09WRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorICBpbnQgc3Ryb2tlX2FscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKQorICAgICAgICAgICAgICAgICAgICAgICAgID8gRlhHRVRGTEFHX0FMUEhBX1NUUk9LRShhbHBoYV9mbGFnKQorICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhBUkdCX0Eoc3Ryb2tlX2NvbG9yKTsKKyAgaWYgKHBHcmFwaFN0YXRlICYmIHN0cm9rZV9hbHBoYSkgeworICAgIGlmIChmaWxsX21vZGUgJiBGWF9aRVJPQVJFQV9GSUxMKSB7CisgICAgICBDQWdnX1BhdGhEYXRhIHBhdGhfZGF0YTsKKyAgICAgIHBhdGhfZGF0YS5CdWlsZFBhdGgocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSk7CisgICAgICBhZ2c6OnJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEgcmFzdGVyaXplcjsKKyAgICAgIHJhc3Rlcml6ZXIuY2xpcF9ib3goMC4wZiwgMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSkpOworICAgICAgUmFzdGVyaXplU3Ryb2tlKHJhc3Rlcml6ZXIsIHBhdGhfZGF0YS5tX1BhdGhEYXRhLCBOVUxMLCBwR3JhcGhTdGF0ZSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgZmlsbF9tb2RlICYgRlhfU1RST0tFX1RFWFRfTU9ERSk7CisgICAgICBpbnQgZmlsbF9mbGFnID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA8PCA4IHwKKyAgICAgICAgICAgICAgICAgICAgICBGWEdFVEZMQUdfQUxQSEFfU1RST0tFKGFscGhhX2ZsYWcpOworICAgICAgaWYgKCFSZW5kZXJSYXN0ZXJpemVyKHJhc3Rlcml6ZXIsIHN0cm9rZV9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX21vZGUgJiBGWEZJTExfRlVMTENPVkVSLCBtX2JHcm91cEtub2Nrb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIENGWF9NYXRyaXggbWF0cml4MSwgbWF0cml4MjsKKyAgICBpZiAocE9iamVjdDJEZXZpY2UpIHsKKyAgICAgIG1hdHJpeDEuYSA9IHN0ZDo6bWF4KEZYU1lTX2ZhYnMocE9iamVjdDJEZXZpY2UtPmEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfZmFicyhwT2JqZWN0MkRldmljZS0+YikpOworICAgICAgbWF0cml4MS5kID0gbWF0cml4MS5hOworICAgICAgbWF0cml4Mi5TZXQocE9iamVjdDJEZXZpY2UtPmEgLyBtYXRyaXgxLmEsIHBPYmplY3QyRGV2aWNlLT5iIC8gbWF0cml4MS5hLAorICAgICAgICAgICAgICAgICAgcE9iamVjdDJEZXZpY2UtPmMgLyBtYXRyaXgxLmQsIHBPYmplY3QyRGV2aWNlLT5kIC8gbWF0cml4MS5kLAorICAgICAgICAgICAgICAgICAgMCwgMCk7CisgICAgICBDRlhfTWF0cml4IG10UmVydmVzZTsKKyAgICAgIG10UmVydmVzZS5TZXRSZXZlcnNlKG1hdHJpeDIpOworICAgICAgbWF0cml4MSA9ICpwT2JqZWN0MkRldmljZTsKKyAgICAgIG1hdHJpeDEuQ29uY2F0KG10UmVydmVzZSk7CisgICAgfQorICAgIENBZ2dfUGF0aERhdGEgcGF0aF9kYXRhOworICAgIHBhdGhfZGF0YS5CdWlsZFBhdGgocFBhdGhEYXRhLCAmbWF0cml4MSk7CisgICAgYWdnOjpyYXN0ZXJpemVyX3NjYW5saW5lX2FhIHJhc3Rlcml6ZXI7CisgICAgcmFzdGVyaXplci5jbGlwX2JveCgwLjBmLCAwLjBmLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSkpOworICAgIFJhc3Rlcml6ZVN0cm9rZShyYXN0ZXJpemVyLCBwYXRoX2RhdGEubV9QYXRoRGF0YSwgJm1hdHJpeDIsIHBHcmFwaFN0YXRlLAorICAgICAgICAgICAgICAgICAgICBtYXRyaXgxLmEsIEZBTFNFLCBmaWxsX21vZGUgJiBGWF9TVFJPS0VfVEVYVF9NT0RFKTsKKyAgICBpbnQgZmlsbF9mbGFnID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA8PCA4IHwKKyAgICAgICAgICAgICAgICAgICAgRlhHRVRGTEFHX0FMUEhBX1NUUk9LRShhbHBoYV9mbGFnKTsKKyAgICBpZiAoIVJlbmRlclJhc3Rlcml6ZXIocmFzdGVyaXplciwgc3Ryb2tlX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX21vZGUgJiBGWEZJTExfRlVMTENPVkVSLCBtX2JHcm91cEtub2Nrb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQordm9pZCBSZ2JCeXRlT3JkZXJTZXRQaXhlbChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCB4LCBpbnQgeSwgRlhfRFdPUkQgYXJnYikgeworICBpZiAoeCA8IDAgfHwgeCA+PSBwQml0bWFwLT5HZXRXaWR0aCgpIHx8IHkgPCAwIHx8IHkgPj0gcEJpdG1hcC0+R2V0SGVpZ2h0KCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgdWludDhfdCogcG9zID0gKHVpbnQ4X3QqKXBCaXRtYXAtPkdldEJ1ZmZlcigpICsgeSAqIHBCaXRtYXAtPkdldFBpdGNoKCkgKworICAgICAgICAgICAgICAgICB4ICogcEJpdG1hcC0+R2V0QlBQKCkgLyA4OworICBpZiAocEJpdG1hcC0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYikgeworICAgIEZYQVJHQl9TRVRSR0JPUkRFUkRJQihwb3MsIEFyZ2JHYW1tYShhcmdiKSk7CisgIH0gZWxzZSB7CisgICAgaW50IGFscGhhID0gRlhBUkdCX0EoYXJnYik7CisgICAgcG9zWzBdID0gKEZYQVJHQl9SKGFyZ2IpICogYWxwaGEgKyBwb3NbMF0gKiAoMjU1IC0gYWxwaGEpKSAvIDI1NTsKKyAgICBwb3NbMV0gPSAoRlhBUkdCX0coYXJnYikgKiBhbHBoYSArIHBvc1sxXSAqICgyNTUgLSBhbHBoYSkpIC8gMjU1OworICAgIHBvc1syXSA9IChGWEFSR0JfQihhcmdiKSAqIGFscGhhICsgcG9zWzJdICogKDI1NSAtIGFscGhhKSkgLyAyNTU7CisgIH0KK30KK3ZvaWQgUmdiQnl0ZU9yZGVyQ29tcG9zaXRlUmVjdChDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGFyZ2IpIHsKKyAgaW50IHNyY19hbHBoYSA9IEZYQVJHQl9BKGFyZ2IpOworICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfUkVDVCByZWN0KGxlZnQsIHRvcCwgbGVmdCArIHdpZHRoLCB0b3AgKyBoZWlnaHQpOworICByZWN0LkludGVyc2VjdCgwLCAwLCBwQml0bWFwLT5HZXRXaWR0aCgpLCBwQml0bWFwLT5HZXRIZWlnaHQoKSk7CisgIHdpZHRoID0gcmVjdC5XaWR0aCgpOworICBpbnQgc3JjX3IgPSBGWEFSR0JfUihhcmdiKSwgc3JjX2cgPSBGWEFSR0JfRyhhcmdiKSwgc3JjX2IgPSBGWEFSR0JfQihhcmdiKTsKKyAgaW50IEJwcCA9IHBCaXRtYXAtPkdldEJQUCgpIC8gODsKKyAgRlhfQk9PTCBiQWxwaGEgPSBwQml0bWFwLT5IYXNBbHBoYSgpOworICBpbnQgZGliX2FyZ2IgPSBGWEFSR0JfVE9CR1JPUkRFUkRJQihhcmdiKTsKKyAgdWludDhfdCogcEJ1ZmZlciA9IHBCaXRtYXAtPkdldEJ1ZmZlcigpOworICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgIGZvciAoaW50IHJvdyA9IHJlY3QudG9wOyByb3cgPCByZWN0LmJvdHRvbTsgcm93KyspIHsKKyAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9CisgICAgICAgICAgcEJ1ZmZlciArIHJvdyAqIHBCaXRtYXAtPkdldFBpdGNoKCkgKyByZWN0LmxlZnQgKiBCcHA7CisgICAgICBpZiAoQnBwID09IDQpIHsKKyAgICAgICAgRlhfRFdPUkQqIHNjYW4gPSAoRlhfRFdPUkQqKWRlc3Rfc2NhbjsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgKnNjYW4rKyA9IGRpYl9hcmdiOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfcjsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfZzsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfYjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgc3JjX3IgPSBGWF9HQU1NQShzcmNfcik7CisgIHNyY19nID0gRlhfR0FNTUEoc3JjX2cpOworICBzcmNfYiA9IEZYX0dBTU1BKHNyY19iKTsKKyAgZm9yIChpbnQgcm93ID0gcmVjdC50b3A7IHJvdyA8IHJlY3QuYm90dG9tOyByb3crKykgeworICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IHBCdWZmZXIgKyByb3cgKiBwQml0bWFwLT5HZXRQaXRjaCgpICsgcmVjdC5sZWZ0ICogQnBwOworICAgIGlmIChiQWxwaGEpIHsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CisgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgICAgICBGWEFSR0JfU0VUUkdCT1JERVJESUIoZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfTUFLRShzcmNfYWxwaGEsIHNyY19yLCBzcmNfZywgc3JjX2IpKTsKKyAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgYWxwaGFfcmF0aW8pOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBhbHBoYV9yYXRpbyk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIGFscGhhX3JhdGlvKTsKKyAgICAgICAgZGVzdF9zY2FuICs9IDI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICAqZGVzdF9zY2FuID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKCpkZXN0X3NjYW4pLCBzcmNfciwgc3JjX2FscGhhKSk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKCpkZXN0X3NjYW4pLCBzcmNfZywgc3JjX2FscGhhKSk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKCpkZXN0X3NjYW4pLCBzcmNfYiwgc3JjX2FscGhhKSk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBpZiAoQnBwID09IDQpIHsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQordm9pZCBSZ2JCeXRlT3JkZXJUcmFuc2ZlckJpdG1hcChDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wKSB7CisgIGlmICghcEJpdG1hcCkgeworICAgIHJldHVybjsKKyAgfQorICBwQml0bWFwLT5HZXRPdmVybGFwUmVjdChkZXN0X2xlZnQsIGRlc3RfdG9wLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjQml0bWFwLT5HZXRXaWR0aCgpLCBwU3JjQml0bWFwLT5HZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2xlZnQsIHNyY190b3AsIE5VTEwpOworICBpZiAod2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBpbnQgQnBwID0gcEJpdG1hcC0+R2V0QlBQKCkgLyA4OworICBGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQgPSBwQml0bWFwLT5HZXRGb3JtYXQoKTsKKyAgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQgPSBwU3JjQml0bWFwLT5HZXRGb3JtYXQoKTsKKyAgaW50IHBpdGNoID0gcEJpdG1hcC0+R2V0UGl0Y2goKTsKKyAgdWludDhfdCogYnVmZmVyID0gcEJpdG1hcC0+R2V0QnVmZmVyKCk7CisgIGlmIChkZXN0X2Zvcm1hdCA9PSBzcmNfZm9ybWF0KSB7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gYnVmZmVyICsgKGRlc3RfdG9wICsgcm93KSAqIHBpdGNoICsgZGVzdF9sZWZ0ICogQnBwOworICAgICAgdWludDhfdCogc3JjX3NjYW4gPQorICAgICAgICAgICh1aW50OF90KilwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogQnBwOworICAgICAgaWYgKEJwcCA9PSA0KSB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShzcmNfc2NhblszXSwgc3JjX3NjYW5bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuWzFdLCBzcmNfc2NhblsyXSkpOworICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19zY2FuWzJdOworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19zY2FuWzFdOworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19zY2FuWzBdOworICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIHVpbnQ4X3QqIGRlc3RfYnVmID0gYnVmZmVyICsgZGVzdF90b3AgKiBwaXRjaCArIGRlc3RfbGVmdCAqIEJwcDsKKyAgaWYgKGRlc3RfZm9ybWF0ID09IEZYRElCX1JnYikgeworICAgIGlmIChzcmNfZm9ybWF0ID09IEZYRElCX1JnYjMyKSB7CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogcGl0Y2g7CisgICAgICAgIHVpbnQ4X3QqIHNyY19zY2FuID0KKyAgICAgICAgICAgICh1aW50OF90KilwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogNDsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3NjYW5bMl07CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3NjYW5bMV07CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3NjYW5bMF07CisgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBBU1NFUlQoRkFMU0UpOworICAgIH0KKyAgfSBlbHNlIGlmIChkZXN0X2Zvcm1hdCA9PSBGWERJQl9BcmdiIHx8IGRlc3RfZm9ybWF0ID09IEZYRElCX1JnYjMyKSB7CisgICAgaWYgKHNyY19mb3JtYXQgPT0gRlhESUJfUmdiKSB7CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9ICh1aW50OF90KikoZGVzdF9idWYgKyByb3cgKiBwaXRjaCk7CisgICAgICAgIHVpbnQ4X3QqIHNyY19zY2FuID0KKyAgICAgICAgICAgICh1aW50OF90KilwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogMzsKKyAgICAgICAgaWYgKHNyY19mb3JtYXQgPT0gRlhESUJfQXJnYikgeworICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKDB4ZmYsIEZYX0dBTU1BKHNyY19zY2FuWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9HQU1NQShzcmNfc2NhblsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfR0FNTUEoc3JjX3NjYW5bMl0pKSk7CisgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKDB4ZmYsIHNyY19zY2FuWzBdLCBzcmNfc2NhblsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhblsyXSkpOworICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3JjX2Zvcm1hdCA9PSBGWERJQl9SZ2IzMikgeworICAgICAgQVNTRVJUKGRlc3RfZm9ybWF0ID09IEZYRElCX0FyZ2IpOworICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIHBpdGNoOworICAgICAgICB1aW50OF90KiBzcmNfc2NhbiA9CisgICAgICAgICAgICAodWludDhfdCopKHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiA0KTsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKDB4ZmYsIHNyY19zY2FuWzBdLCBzcmNfc2NhblsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW5bMl0pKTsKKyAgICAgICAgICBzcmNfc2NhbiArPSA0OworICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIEFTU0VSVChGQUxTRSk7CisgIH0KK30KK0ZYX0FSR0IgX0RlZmF1bHRDTVlLMkFSR0IoRlhfQ01ZSyBjbXlrLCB1aW50OF90IGFscGhhKSB7CisgIHVpbnQ4X3QgciwgZywgYjsKKyAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShjbXlrKSwgRlhTWVNfR2V0TVZhbHVlKGNteWspLAorICAgICAgICAgICAgICAgICAgICAgRlhTWVNfR2V0WVZhbHVlKGNteWspLCBGWFNZU19HZXRLVmFsdWUoY215ayksIHIsIGcsIGIpOworICByZXR1cm4gQXJnYkVuY29kZShhbHBoYSwgciwgZywgYik7Cit9CitGWF9CT09MIF9EaWJTZXRQaXhlbChDRlhfRElCaXRtYXAqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICBpbnQgeCwKKyAgICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgRlhfQk9PTCBiT2JqQ01ZSyA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZyk7CisgIGludCBhbHBoYSA9IGJPYmpDTVlLID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShjb2xvcik7CisgIGlmIChwSWNjVHJhbnNmb3JtKSB7CisgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9CisgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOworICAgIGNvbG9yID0gYk9iakNNWUsgPyBGWENNWUtfVE9ESUIoY29sb3IpIDogRlhBUkdCX1RPRElCKGNvbG9yKTsKKyAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAodWludDhfdCopJmNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KikmY29sb3IsIDEpOworICAgIGNvbG9yID0gYk9iakNNWUsgPyBGWENNWUtfVE9ESUIoY29sb3IpIDogRlhBUkdCX1RPRElCKGNvbG9yKTsKKyAgICBpZiAoIXBEZXZpY2UtPklzQ215a0ltYWdlKCkpIHsKKyAgICAgIGNvbG9yID0gKGNvbG9yICYgMHhmZmZmZmYpIHwgKGFscGhhIDw8IDI0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKHBEZXZpY2UtPklzQ215a0ltYWdlKCkpIHsKKyAgICAgIGlmICghYk9iakNNWUspIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoYk9iakNNWUspIHsKKyAgICAgICAgY29sb3IgPSBfRGVmYXVsdENNWUsyQVJHQihjb2xvciwgYWxwaGEpOworICAgICAgfQorICAgIH0KKyAgfQorICBwRGV2aWNlLT5TZXRQaXhlbCh4LCB5LCBjb2xvcik7CisgIGlmIChwRGV2aWNlLT5tX3BBbHBoYU1hc2spIHsKKyAgICBwRGV2aWNlLT5tX3BBbHBoYU1hc2stPlNldFBpeGVsKHgsIHksIGFscGhhIDw8IDI0KTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6U2V0UGl4ZWwoaW50IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgaWYgKCFtX3BCaXRtYXAtPkdldEJ1ZmZlcigpKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKCFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpIHx8CisgICAgICAhQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCkpIHsKKyAgICBwSWNjVHJhbnNmb3JtID0gTlVMTDsKKyAgfQorICBpZiAoIW1fcENsaXBSZ24pIHsKKyAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7CisgICAgICBSZ2JCeXRlT3JkZXJTZXRQaXhlbChtX3BCaXRtYXAsIHgsIHksIGNvbG9yKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIF9EaWJTZXRQaXhlbChtX3BCaXRtYXAsIHgsIHksIGNvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKKyAgICB9CisgIH0gZWxzZSBpZiAobV9wQ2xpcFJnbi0+R2V0Qm94KCkuQ29udGFpbnMoeCwgeSkpIHsKKyAgICBpZiAobV9wQ2xpcFJnbi0+R2V0VHlwZSgpID09IENGWF9DbGlwUmduOjpSZWN0SSkgeworICAgICAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgeworICAgICAgICBSZ2JCeXRlT3JkZXJTZXRQaXhlbChtX3BCaXRtYXAsIHgsIHksIGNvbG9yKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBfRGliU2V0UGl4ZWwobV9wQml0bWFwLCB4LCB5LCBjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChtX3BDbGlwUmduLT5HZXRUeXBlKCkgPT0gQ0ZYX0NsaXBSZ246Ok1hc2tGKSB7CisgICAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBNYXNrID0gbV9wQ2xpcFJnbi0+R2V0TWFzaygpOworICAgICAgRlhfQk9PTCBiQ01ZSyA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZyk7CisgICAgICBpbnQgbmV3X2FscGhhID0KKyAgICAgICAgICBiQ01ZSyA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpIDogRlhBUkdCX0EoY29sb3IpOworICAgICAgbmV3X2FscGhhID0gbmV3X2FscGhhICogcE1hc2stPkdldFNjYW5saW5lKHkpW3hdIC8gMjU1OworICAgICAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgeworICAgICAgICBSZ2JCeXRlT3JkZXJTZXRQaXhlbChtX3BCaXRtYXAsIHgsIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xvciAmIDB4ZmZmZmZmKSB8IChuZXdfYWxwaGEgPDwgMjQpKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9CisgICAgICBpZiAoYkNNWUspIHsKKyAgICAgICAgRlhTRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZywgbmV3X2FscGhhKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbG9yID0gKGNvbG9yICYgMHhmZmZmZmYpIHwgKG5ld19hbHBoYSA8PCAyNCk7CisgICAgICB9CisgICAgICByZXR1cm4gX0RpYlNldFBpeGVsKG1fcEJpdG1hcCwgeCwgeSwgY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOworICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6RmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgeworICBpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKCFtX3BCaXRtYXAtPkdldEJ1ZmZlcigpKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgRlhfUkVDVCBjbGlwX3JlY3Q7CisgIEdldENsaXBCb3goJmNsaXBfcmVjdCk7CisgIEZYX1JFQ1QgZHJhd19yZWN0ID0gY2xpcF9yZWN0OworICBpZiAocFJlY3QpIHsKKyAgICBkcmF3X3JlY3QuSW50ZXJzZWN0KCpwUmVjdCk7CisgIH0KKyAgaWYgKGRyYXdfcmVjdC5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoIW1fcENsaXBSZ24gfHwgbV9wQ2xpcFJnbi0+R2V0VHlwZSgpID09IENGWF9DbGlwUmduOjpSZWN0SSkgeworICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKKyAgICAgIFJnYkJ5dGVPcmRlckNvbXBvc2l0ZVJlY3QobV9wQml0bWFwLCBkcmF3X3JlY3QubGVmdCwgZHJhd19yZWN0LnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd19yZWN0LldpZHRoKCksIGRyYXdfcmVjdC5IZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9jb2xvcik7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fcEJpdG1hcC0+Q29tcG9zaXRlUmVjdChkcmF3X3JlY3QubGVmdCwgZHJhd19yZWN0LnRvcCwgZHJhd19yZWN0LldpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd19yZWN0LkhlaWdodCgpLCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJY2NUcmFuc2Zvcm0pOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBtX3BCaXRtYXAtPkNvbXBvc2l0ZU1hc2soCisgICAgICBkcmF3X3JlY3QubGVmdCwgZHJhd19yZWN0LnRvcCwgZHJhd19yZWN0LldpZHRoKCksIGRyYXdfcmVjdC5IZWlnaHQoKSwKKyAgICAgIChjb25zdCBDRlhfRElCaXRtYXAqKW1fcENsaXBSZ24tPkdldE1hc2soKSwgZmlsbF9jb2xvciwKKyAgICAgIGRyYXdfcmVjdC5sZWZ0IC0gY2xpcF9yZWN0LmxlZnQsIGRyYXdfcmVjdC50b3AgLSBjbGlwX3JlY3QudG9wLAorICAgICAgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMLCBtX2JSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6R2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCkgeworICBpZiAoIW1fcENsaXBSZ24pIHsKKyAgICBwUmVjdC0+bGVmdCA9IHBSZWN0LT50b3AgPSAwOworICAgIHBSZWN0LT5yaWdodCA9IEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCk7CisgICAgcFJlY3QtPmJvdHRvbSA9IEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpOworICAgIHJldHVybiBUUlVFOworICB9CisgICpwUmVjdCA9IG1fcENsaXBSZ24tPkdldEJveCgpOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6R2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJERWRnZSkgeworICBpZiAoIW1fcEJpdG1hcC0+R2V0QnVmZmVyKCkpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoYkRFZGdlKSB7CisgICAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgeworICAgICAgUmdiQnl0ZU9yZGVyVHJhbnNmZXJCaXRtYXAocEJpdG1hcCwgMCwgMCwgcEJpdG1hcC0+R2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAtPkdldEhlaWdodCgpLCBtX3BCaXRtYXAsIGxlZnQsIHRvcCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBwQml0bWFwLT5UcmFuc2ZlckJpdG1hcCgwLCAwLCBwQml0bWFwLT5HZXRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAtPkdldEhlaWdodCgpLCBtX3BCaXRtYXAsIGxlZnQsIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtKTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgRlhfUkVDVCByZWN0KGxlZnQsIHRvcCwgbGVmdCArIHBCaXRtYXAtPkdldFdpZHRoKCksCisgICAgICAgICAgICAgICB0b3AgKyBwQml0bWFwLT5HZXRIZWlnaHQoKSk7CisgIENGWF9ESUJpdG1hcCogcEJhY2sgPSBOVUxMOworICBpZiAobV9wT3JpRGV2aWNlKSB7CisgICAgcEJhY2sgPSBtX3BPcmlEZXZpY2UtPkNsb25lKCZyZWN0KTsKKyAgICBpZiAoIXBCYWNrKSB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcEJhY2stPkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCBwQmFjay0+R2V0V2lkdGgoKSwgcEJhY2stPkdldEhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQml0bWFwLCAwLCAwKTsKKyAgfSBlbHNlIHsKKyAgICBwQmFjayA9IG1fcEJpdG1hcC0+Q2xvbmUoJnJlY3QpOworICB9CisgIGlmICghcEJhY2spIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBGWF9CT09MIGJSZXQgPSBUUlVFOworICBsZWZ0ID0gbGVmdCA+PSAwID8gMCA6IGxlZnQ7CisgIHRvcCA9IHRvcCA+PSAwID8gMCA6IHRvcDsKKyAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgeworICAgIFJnYkJ5dGVPcmRlclRyYW5zZmVyQml0bWFwKHBCaXRtYXAsIDAsIDAsIHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQmFjaywgbGVmdCwgdG9wKTsKKyAgfSBlbHNlIHsKKyAgICBiUmV0ID0gcEJpdG1hcC0+VHJhbnNmZXJCaXRtYXAoMCwgMCwgcmVjdC5XaWR0aCgpLCByZWN0LkhlaWdodCgpLCBwQmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCwgdG9wLCBwSWNjVHJhbnNmb3JtKTsKKyAgfQorICBkZWxldGUgcEJhY2s7CisgIHJldHVybiBiUmV0OworfQorRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIGlmICghbV9wQml0bWFwLT5HZXRCdWZmZXIoKSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChwQml0bWFwLT5Jc0FscGhhTWFzaygpKQorICAgIHJldHVybiBtX3BCaXRtYXAtPkNvbXBvc2l0ZU1hc2soCisgICAgICAgIGxlZnQsIHRvcCwgcFNyY1JlY3QtPldpZHRoKCksIHBTcmNSZWN0LT5IZWlnaHQoKSwgcEJpdG1hcCwgYXJnYiwKKyAgICAgICAgcFNyY1JlY3QtPmxlZnQsIHBTcmNSZWN0LT50b3AsIGJsZW5kX3R5cGUsIG1fcENsaXBSZ24sIG1fYlJnYkJ5dGVPcmRlciwKKyAgICAgICAgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CisgIHJldHVybiBtX3BCaXRtYXAtPkNvbXBvc2l0ZUJpdG1hcCgKKyAgICAgIGxlZnQsIHRvcCwgcFNyY1JlY3QtPldpZHRoKCksIHBTcmNSZWN0LT5IZWlnaHQoKSwgcEJpdG1hcCwgcFNyY1JlY3QtPmxlZnQsCisgICAgICBwU3JjUmVjdC0+dG9wLCBibGVuZF90eXBlLCBtX3BDbGlwUmduLCBtX2JSZ2JCeXRlT3JkZXIsIHBJY2NUcmFuc2Zvcm0pOworfQorRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgaWYgKCFtX3BCaXRtYXAtPkdldEJ1ZmZlcigpKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKGRlc3Rfd2lkdGggPT0gcFNvdXJjZS0+R2V0V2lkdGgoKSAmJgorICAgICAgZGVzdF9oZWlnaHQgPT0gcFNvdXJjZS0+R2V0SGVpZ2h0KCkpIHsKKyAgICBGWF9SRUNUIHJlY3QoMCwgMCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQpOworICAgIHJldHVybiBTZXRESUJpdHMocFNvdXJjZSwgYXJnYiwgJnJlY3QsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKKyAgfQorICBGWF9SRUNUIGRlc3RfcmVjdChkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X2xlZnQgKyBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICBkZXN0X3RvcCArIGRlc3RfaGVpZ2h0KTsKKyAgZGVzdF9yZWN0Lk5vcm1hbGl6ZSgpOworICBGWF9SRUNUIGRlc3RfY2xpcCA9IGRlc3RfcmVjdDsKKyAgZGVzdF9jbGlwLkludGVyc2VjdCgqcENsaXBSZWN0KTsKKyAgQ0ZYX0JpdG1hcENvbXBvc2VyIGNvbXBvc2VyOworICBjb21wb3Nlci5Db21wb3NlKG1fcEJpdG1hcCwgbV9wQ2xpcFJnbiwgMjU1LCBhcmdiLCBkZXN0X2NsaXAsIEZBTFNFLCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICBGQUxTRSwgbV9iUmdiQnl0ZU9yZGVyLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgIGJsZW5kX3R5cGUpOworICBkZXN0X2NsaXAuT2Zmc2V0KC1kZXN0X3JlY3QubGVmdCwgLWRlc3RfcmVjdC50b3ApOworICBDRlhfSW1hZ2VTdHJldGNoZXIgc3RyZXRjaGVyOworICBpZiAoc3RyZXRjaGVyLlN0YXJ0KCZjb21wb3NlciwgcFNvdXJjZSwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIGRlc3RfY2xpcCwKKyAgICAgICAgICAgICAgICAgICAgICBmbGFncykpIHsKKyAgICBzdHJldGNoZXIuQ29udGludWUoTlVMTCk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHJlbmRlcl9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7CisgIGlmICghbV9wQml0bWFwLT5HZXRCdWZmZXIoKSkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIENGWF9JbWFnZVJlbmRlcmVyKiBwUmVuZGVyZXIgPSBuZXcgQ0ZYX0ltYWdlUmVuZGVyZXI7CisgIHBSZW5kZXJlci0+U3RhcnQobV9wQml0bWFwLCBtX3BDbGlwUmduLCBwU291cmNlLCBiaXRtYXBfYWxwaGEsIGFyZ2IsIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgcmVuZGVyX2ZsYWdzLCBtX2JSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOworICBoYW5kbGUgPSBwUmVuZGVyZXI7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpDb250aW51ZURJQml0cyh2b2lkKiBwSGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpZiAoIW1fcEJpdG1hcC0+R2V0QnVmZmVyKCkpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gKChDRlhfSW1hZ2VSZW5kZXJlciopcEhhbmRsZSktPkNvbnRpbnVlKHBQYXVzZSk7Cit9Cit2b2lkIENGWF9BZ2dEZXZpY2VEcml2ZXI6OkNhbmNlbERJQml0cyh2b2lkKiBwSGFuZGxlKSB7CisgIGlmICghbV9wQml0bWFwLT5HZXRCdWZmZXIoKSkgeworICAgIHJldHVybjsKKyAgfQorICBkZWxldGUgKENGWF9JbWFnZVJlbmRlcmVyKilwSGFuZGxlOworfQorQ0ZYX0Z4Z2VEZXZpY2U6OkNGWF9GeGdlRGV2aWNlKCkgeworICBtX2JPd25lZEJpdG1hcCA9IEZBTFNFOworfQorRlhfQk9PTCBDRlhfRnhnZURldmljZTo6QXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGl0aGVyX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJHcm91cEtub2Nrb3V0KSB7CisgIGlmICghcEJpdG1hcCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBTZXRCaXRtYXAocEJpdG1hcCk7CisgIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPSBuZXcgQ0ZYX0FnZ0RldmljZURyaXZlcigKKyAgICAgIHBCaXRtYXAsIGRpdGhlcl9iaXRzLCBiUmdiQnl0ZU9yZGVyLCBwT3JpRGV2aWNlLCBiR3JvdXBLbm9ja291dCk7CisgIFNldERldmljZURyaXZlcihwRHJpdmVyKTsKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENGWF9GeGdlRGV2aWNlOjpDcmVhdGUoaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGl0aGVyX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlKSB7CisgIG1fYk93bmVkQml0bWFwID0gVFJVRTsKKyAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsKKyAgaWYgKCFwQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgZm9ybWF0KSkgeworICAgIGRlbGV0ZSBwQml0bWFwOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBTZXRCaXRtYXAocEJpdG1hcCk7CisgIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPQorICAgICAgbmV3IENGWF9BZ2dEZXZpY2VEcml2ZXIocEJpdG1hcCwgZGl0aGVyX2JpdHMsIEZBTFNFLCBwT3JpRGV2aWNlLCBGQUxTRSk7CisgIFNldERldmljZURyaXZlcihwRHJpdmVyKTsKKyAgcmV0dXJuIFRSVUU7Cit9CitDRlhfRnhnZURldmljZTo6fkNGWF9GeGdlRGV2aWNlKCkgeworICBpZiAobV9iT3duZWRCaXRtYXApIHsKKyAgICBkZWxldGUgR2V0Qml0bWFwKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYWdnL3NyYy9meGZ4X2FnZ19jdXJ2ZXMuY3BwIGIvY29yZS9zcmMvZnhnZS9hZ2cvc3JjL2Z4ZnhfYWdnX2N1cnZlcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzODE3ZjcuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhnZS9hZ2cvc3JjL2Z4ZnhfYWdnX2N1cnZlcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICIuLi9hZ2cyMy9meF9hZ2dfY3VydmVzLmNwcCIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYWdnL3NyYy9meGZ4X2FnZ19kcml2ZXIuY3BwIGIvY29yZS9zcmMvZnhnZS9hZ2cvc3JjL2Z4ZnhfYWdnX2RyaXZlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZTZhMzAuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhnZS9hZ2cvc3JjL2Z4ZnhfYWdnX2RyaXZlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICIuLi9hZ2cyMy9meF9hZ2dfZHJpdmVyLmNwcCIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYWdnL3NyYy9meGZ4X2FnZ19wYXRoX3N0b3JhZ2UuY3BwIGIvY29yZS9zcmMvZnhnZS9hZ2cvc3JjL2Z4ZnhfYWdnX3BhdGhfc3RvcmFnZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYmM1MjYuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhnZS9hZ2cvc3JjL2Z4ZnhfYWdnX3BhdGhfc3RvcmFnZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICIuLi9hZ2cyMy9meF9hZ2dfcGF0aF9zdG9yYWdlLmNwcCIKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYWdnL3NyYy9meGZ4X2FnZ19yYXN0ZXJpemVyX3NjYW5saW5lX2FhLmNwcCBiL2NvcmUvc3JjL2Z4Z2UvYWdnL3NyYy9meGZ4X2FnZ19yYXN0ZXJpemVyX3NjYW5saW5lX2FhLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI5ZTNiYS4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGdlL2FnZy9zcmMvZnhmeF9hZ2dfcmFzdGVyaXplcl9zY2FubGluZV9hYS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICIuLi9hZ2cyMy9meF9hZ2dfcmFzdGVyaXplcl9zY2FubGluZV9hYS5jcHAiCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FnZy9zcmMvZnhmeF9hZ2dfdmNnZW5fZGFzaC5jcHAgYi9jb3JlL3NyYy9meGdlL2FnZy9zcmMvZnhmeF9hZ2dfdmNnZW5fZGFzaC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMjU5YzAuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvZnhnZS9hZ2cvc3JjL2Z4ZnhfYWdnX3ZjZ2VuX2Rhc2guY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiLi4vYWdnMjMvZnhfYWdnX3ZjZ2VuX2Rhc2guY3BwIgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hZ2cvc3JjL2Z4ZnhfYWdnX3ZjZ2VuX3N0cm9rZS5jcHAgYi9jb3JlL3NyYy9meGdlL2FnZy9zcmMvZnhmeF9hZ2dfdmNnZW5fc3Ryb2tlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMxMWUxYS4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9meGdlL2FnZy9zcmMvZnhmeF9hZ2dfdmNnZW5fc3Ryb2tlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgIi4uL2FnZzIzL2Z4X2FnZ192Y2dlbl9zdHJva2UuY3BwIgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udC5jcHAgYi9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFmb250LmNwcAppbmRleCA5N2VlYjJmLi4yMjJiMjhlIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFmb250LmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFmb250LmNwcApAQCAtMSwyMDMgKzEsMjEzIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpbmNsdWRlICJmeF9mcGYuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKwogI2lmIF9GWF9PU18gPT0gX0ZYX0FORFJPSURfCiAjaW5jbHVkZSAiZnBmX3NraWFmb250LmgiCiAjaW5jbHVkZSAiZnBmX3NraWFmb250bWdyLmgiCi0jZGVmaW5lIEZQRl9FTV9BREpVU1QoZW0sIGEpIChlbSA9PSAwID8gKGEpIDogKGEpICogMTAwMCAvIGVtKQorI2RlZmluZSBGUEZfRU1fQURKVVNUKGVtLCBhKSAoZW0gPT0gMCA/IChhKSA6IChhKSoxMDAwIC8gZW0pCiBDRlBGX1NraWFGb250OjpDRlBGX1NraWFGb250KCkKLSAgICA6IG1fcEZvbnRNZ3IoTlVMTCkKLSAgICAsIG1fcEZvbnREZXMoTlVMTCkKLSAgICAsIG1fRmFjZShOVUxMKQotICAgICwgbV9kd1N0eWxlKDApCi0gICAgLCBtX3VDaGFyc2V0KDApCi0gICAgLCBtX2R3UmVmQ291bnQoMCkKLXsKKyAgICA6IG1fcEZvbnRNZ3IoTlVMTCksCisgICAgICBtX3BGb250RGVzKE5VTEwpLAorICAgICAgbV9GYWNlKE5VTEwpLAorICAgICAgbV9kd1N0eWxlKDApLAorICAgICAgbV91Q2hhcnNldCgwKSwKKyAgICAgIG1fZHdSZWZDb3VudCgwKSB7fQorQ0ZQRl9Ta2lhRm9udDo6fkNGUEZfU2tpYUZvbnQoKSB7CisgIGlmIChtX0ZhY2UpIHsKKyAgICBGWEZUX0RvbmVfRmFjZShtX0ZhY2UpOworICB9CiB9Ci1DRlBGX1NraWFGb250Ojp+Q0ZQRl9Ta2lhRm9udCgpCi17Ci0gICAgaWYgKG1fRmFjZSkgewotICAgICAgICBGWEZUX0RvbmVfRmFjZShtX0ZhY2UpOwotICAgIH0KK3ZvaWQgQ0ZQRl9Ta2lhRm9udDo6UmVsZWFzZSgpIHsKKyAgaWYgKC0tbV9kd1JlZkNvdW50ID09IDApIHsKKyAgICBkZWxldGUgdGhpczsKKyAgfQogfQotdm9pZCBDRlBGX1NraWFGb250OjpSZWxlYXNlKCkKLXsKLSAgICBpZiAoLS1tX2R3UmVmQ291bnQgPT0gMCkgewotICAgICAgICBkZWxldGUgdGhpczsKLSAgICB9CitJRlBGX0ZvbnQqIENGUEZfU2tpYUZvbnQ6OlJldGFpbigpIHsKKyAgbV9kd1JlZkNvdW50Kys7CisgIHJldHVybiAoSUZQRl9Gb250Kil0aGlzOwogfQotSUZQRl9Gb250KiBDRlBGX1NraWFGb250OjpSZXRhaW4oKQotewotICAgIG1fZHdSZWZDb3VudCsrOwotICAgIHJldHVybiAoSUZQRl9Gb250Kil0aGlzOworRlBGX0hGT05UIENGUEZfU2tpYUZvbnQ6OkdldEhhbmRsZSgpIHsKKyAgcmV0dXJuIE5VTEw7CiB9Ci1GUEZfSEZPTlQgQ0ZQRl9Ta2lhRm9udDo6R2V0SGFuZGxlKCkKLXsKLSAgICByZXR1cm4gTlVMTDsKK0NGWF9CeXRlU3RyaW5nIENGUEZfU2tpYUZvbnQ6OkdldEZhbWlseU5hbWUoKSB7CisgIGlmICghbV9GYWNlKSB7CisgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7CisgIH0KKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKEZYRlRfR2V0X0ZhY2VfRmFtaWx5X05hbWUobV9GYWNlKSk7CiB9Ci1DRlhfQnl0ZVN0cmluZyBDRlBGX1NraWFGb250OjpHZXRGYW1pbHlOYW1lKCkKLXsKLSAgICBpZiAoIW1fRmFjZSkgewotICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKEZYRlRfR2V0X0ZhY2VfRmFtaWx5X05hbWUobV9GYWNlKSk7CitDRlhfV2lkZVN0cmluZyBDRlBGX1NraWFGb250OjpHZXRQc05hbWUoKSB7CisgIGlmICghbV9GYWNlKSB7CisgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7CisgIH0KKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoRlhGVF9HZXRfUG9zdHNjcmlwdF9OYW1lKG1fRmFjZSkpOwogfQotQ0ZYX1dpZGVTdHJpbmcgQ0ZQRl9Ta2lhRm9udDo6R2V0UHNOYW1lKCkKLXsKLSAgICBpZiAoIW1fRmFjZSkgewotICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoRlhGVF9HZXRfUG9zdHNjcmlwdF9OYW1lKG1fRmFjZSkpOwotfQotRlhfSU5UMzIgQ0ZQRl9Ta2lhRm9udDo6R2V0R2x5cGhJbmRleChGWF9XQ0hBUiB3VW5pY29kZSkKLXsKLSAgICBpZiAoIW1fRmFjZSkgewotICAgICAgICByZXR1cm4gd1VuaWNvZGU7Ci0gICAgfQotICAgIGlmIChGWEZUX1NlbGVjdF9DaGFybWFwKG1fRmFjZSwgRlhGVF9FTkNPRElOR19VTklDT0RFKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIEZYRlRfR2V0X0NoYXJfSW5kZXgobV9GYWNlLCB3VW5pY29kZSk7Ci19Ci1GWF9JTlQzMiBDRlBGX1NraWFGb250OjpHZXRHbHlwaFdpZHRoKEZYX0lOVDMyIGlHbHlwaEluZGV4KQotewotICAgIGlmICghbV9GYWNlKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoRlhGVF9Mb2FkX0dseXBoKG1fRmFjZSwgaUdseXBoSW5kZXgsIEZYRlRfTE9BRF9OT19TQ0FMRSB8IEZYRlRfTE9BRF9JR05PUkVfR0xPQkFMX0FEVkFOQ0VfV0lEVEgpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwgRlhGVF9HZXRfR2x5cGhfSG9yaUFkdmFuY2UobV9GYWNlKSk7Ci19Ci1GWF9JTlQzMiBDRlBGX1NraWFGb250OjpHZXRBc2NlbnQoKSBjb25zdAotewotICAgIGlmICghbV9GYWNlKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwgRlhGVF9HZXRfRmFjZV9Bc2NlbmRlcihtX0ZhY2UpKTsKLX0KLUZYX0lOVDMyIENGUEZfU2tpYUZvbnQ6OkdldERlc2NlbnQoKSBjb25zdAotewotICAgIGlmICghbV9GYWNlKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwgRlhGVF9HZXRfRmFjZV9EZXNjZW5kZXIobV9GYWNlKSk7Ci19Ci1GWF9CT09MIENGUEZfU2tpYUZvbnQ6OkdldEdseXBoQkJveChGWF9JTlQzMiBpR2x5cGhJbmRleCwgRlhfUkVDVCAmcnRCQm94KQotewotICAgIGlmICghbV9GYWNlKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKEZYRlRfSXNfRmFjZV9Ucmlja3kobV9GYWNlKSkgewotICAgICAgICBpZiAoRlhGVF9TZXRfQ2hhcl9TaXplKG1fRmFjZSwgMCwgMTAwMCAqIDY0LCA3MiwgNzIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEZYRlRfTG9hZF9HbHlwaChtX0ZhY2UsIGlHbHlwaEluZGV4LCBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKSkgewotICAgICAgICAgICAgRlhGVF9TZXRfUGl4ZWxfU2l6ZXMobV9GYWNlLCAwLCA2NCk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgRlhGVF9HbHlwaCBnbHlwaDsKLSAgICAgICAgaWYgKEZYRlRfR2V0X0dseXBoKG1fRmFjZS0+Z2x5cGgsICZnbHlwaCkpIHsKLSAgICAgICAgICAgIEZYRlRfU2V0X1BpeGVsX1NpemVzKG1fRmFjZSwgMCwgNjQpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIEZYRlRfQkJveCBjYm94OwotICAgICAgICBGWEZUX0dseXBoX0dldF9DQm94KGdseXBoLCBGWEZUX0dMWVBIX0JCT1hfUElYRUxTLCAmY2JveCk7Ci0gICAgICAgIEZYX0lOVDMyIHhfcHBlbSA9IG1fRmFjZS0+c2l6ZS0+bWV0cmljcy54X3BwZW07Ci0gICAgICAgIEZYX0lOVDMyIHlfcHBlbSA9IG1fRmFjZS0+c2l6ZS0+bWV0cmljcy55X3BwZW07Ci0gICAgICAgIHJ0QkJveC5sZWZ0ID0gRlBGX0VNX0FESlVTVCh4X3BwZW0sIGNib3gueE1pbik7Ci0gICAgICAgIHJ0QkJveC5yaWdodCA9IEZQRl9FTV9BREpVU1QoeF9wcGVtLCBjYm94LnhNYXgpOwotICAgICAgICBydEJCb3gudG9wID0gRlBGX0VNX0FESlVTVCh5X3BwZW0sIGNib3gueU1heCk7Ci0gICAgICAgIHJ0QkJveC5ib3R0b20gPSBGUEZfRU1fQURKVVNUKHlfcHBlbSwgY2JveC55TWluKTsKLSAgICAgICAgcnRCQm94LnRvcCA9IEZYX01JTihydEJCb3gudG9wLCBHZXRBc2NlbnQoKSk7Ci0gICAgICAgIHJ0QkJveC5ib3R0b20gPSBGWF9NQVgocnRCQm94LmJvdHRvbSwgR2V0RGVzY2VudCgpKTsKLSAgICAgICAgRlhGVF9Eb25lX0dseXBoKGdseXBoKTsKLSAgICAgICAgcmV0dXJuIEZYRlRfU2V0X1BpeGVsX1NpemVzKG1fRmFjZSwgMCwgNjQpID09IDA7Ci0gICAgfQotICAgIGlmIChGWEZUX0xvYWRfR2x5cGgobV9GYWNlLCBpR2x5cGhJbmRleCwgRlhGVF9MT0FEX05PX1NDQUxFIHwgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBydEJCb3gubGVmdCA9IEZQRl9FTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksIEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWChtX0ZhY2UpKTsKLSAgICBydEJCb3guYm90dG9tID0gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwgRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdZKG1fRmFjZSkpOwotICAgIHJ0QkJveC5yaWdodCA9IEZQRl9FTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksIEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWChtX0ZhY2UpICsgRlhGVF9HZXRfR2x5cGhfV2lkdGgobV9GYWNlKSk7Ci0gICAgcnRCQm94LnRvcCA9IEZQRl9FTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksIEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWShtX0ZhY2UpIC0gRlhGVF9HZXRfR2x5cGhfSGVpZ2h0KG1fRmFjZSkpOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDRlBGX1NraWFGb250OjpHZXRCQm94KEZYX1JFQ1QgJnJ0QkJveCkKLXsKLSAgICBpZiAoIW1fRmFjZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJ0QkJveC5sZWZ0ID0gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwgRlhGVF9HZXRfRmFjZV94TWluKG1fRmFjZSkpOwotICAgIHJ0QkJveC50b3AgPSBGUEZfRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLCBGWEZUX0dldF9GYWNlX3lNaW4obV9GYWNlKSk7Ci0gICAgcnRCQm94LnJpZ2h0ID0gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwgRlhGVF9HZXRfRmFjZV94TWF4KG1fRmFjZSkpOwotICAgIHJ0QkJveC5ib3R0b20gPSBGUEZfRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLCBGWEZUX0dldF9GYWNlX3lNYXgobV9GYWNlKSk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9JTlQzMiBDRlBGX1NraWFGb250OjpHZXRIZWlnaHQoKSBjb25zdAotewotICAgIGlmICghbV9GYWNlKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4JRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwgRlhGVF9HZXRfRmFjZV9IZWlnaHQobV9GYWNlKSk7Ci19Ci1GWF9JTlQzMiBDRlBGX1NraWFGb250OjpHZXRJdGFsaWNBbmdsZSgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX0ZhY2UpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIFRUX1Bvc3RzY3JpcHQgKnR0SW5mbyA9IChUVF9Qb3N0c2NyaXB0KilGVF9HZXRfU2ZudF9UYWJsZShtX0ZhY2UsIGZ0X3NmbnRfcG9zdCk7Ci0gICAgaWYgKHR0SW5mbykgewotICAgICAgICByZXR1cm4gdHRJbmZvLT5pdGFsaWNBbmdsZTsKLSAgICB9CitpbnQzMl90IENGUEZfU2tpYUZvbnQ6OkdldEdseXBoSW5kZXgoRlhfV0NIQVIgd1VuaWNvZGUpIHsKKyAgaWYgKCFtX0ZhY2UpIHsKKyAgICByZXR1cm4gd1VuaWNvZGU7CisgIH0KKyAgaWYgKEZYRlRfU2VsZWN0X0NoYXJtYXAobV9GYWNlLCBGWEZUX0VOQ09ESU5HX1VOSUNPREUpKSB7CiAgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIEZYRlRfR2V0X0NoYXJfSW5kZXgobV9GYWNlLCB3VW5pY29kZSk7CiB9Ci1GWF9EV09SRCBDRlBGX1NraWFGb250OjpHZXRGb250RGF0YShGWF9EV09SRCBkd1RhYmxlLCBGWF9MUEJZVEUgcEJ1ZmZlciwgRlhfRFdPUkQgZHdTaXplKQotewotICAgIGlmICghbV9GYWNlKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKEZYRlRfTG9hZF9TZm50X1RhYmxlKG1fRmFjZSwgZHdUYWJsZSwgMCwgcEJ1ZmZlciwgKHVuc2lnbmVkIGxvbmcqKSZkd1NpemUpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gZHdTaXplOworaW50MzJfdCBDRlBGX1NraWFGb250OjpHZXRHbHlwaFdpZHRoKGludDMyX3QgaUdseXBoSW5kZXgpIHsKKyAgaWYgKCFtX0ZhY2UpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoRlhGVF9Mb2FkX0dseXBoKAorICAgICAgICAgIG1fRmFjZSwgaUdseXBoSW5kZXgsCisgICAgICAgICAgRlhGVF9MT0FEX05PX1NDQUxFIHwgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhGVF9HZXRfR2x5cGhfSG9yaUFkdmFuY2UobV9GYWNlKSk7CiB9Ci1GWF9CT09MIENGUEZfU2tpYUZvbnQ6OkluaXRGb250KENGUEZfU2tpYUZvbnRNZ3IgKnBGb250TWdyLCBDRlBGX1NraWFGb250RGVzY3JpcHRvciAqcEZvbnREZXMsIEZYX0JTVFIgYnNGYW1pbHksIEZYX0RXT1JEIGR3U3R5bGUsIEZYX0JZVEUgdUNoYXJzZXQpCi17Ci0gICAgaWYgKCFwRm9udE1nciB8fCAhcEZvbnREZXMpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworaW50MzJfdCBDRlBGX1NraWFGb250OjpHZXRBc2NlbnQoKSBjb25zdCB7CisgIGlmICghbV9GYWNlKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIEZQRl9FTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksCisgICAgICAgICAgICAgICAgICAgICAgIEZYRlRfR2V0X0ZhY2VfQXNjZW5kZXIobV9GYWNlKSk7Cit9CitpbnQzMl90IENGUEZfU2tpYUZvbnQ6OkdldERlc2NlbnQoKSBjb25zdCB7CisgIGlmICghbV9GYWNlKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIEZQRl9FTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksCisgICAgICAgICAgICAgICAgICAgICAgIEZYRlRfR2V0X0ZhY2VfRGVzY2VuZGVyKG1fRmFjZSkpOworfQorRlhfQk9PTCBDRlBGX1NraWFGb250OjpHZXRHbHlwaEJCb3goaW50MzJfdCBpR2x5cGhJbmRleCwgRlhfUkVDVCYgcnRCQm94KSB7CisgIGlmICghbV9GYWNlKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChGWEZUX0lzX0ZhY2VfVHJpY2t5KG1fRmFjZSkpIHsKKyAgICBpZiAoRlhGVF9TZXRfQ2hhcl9TaXplKG1fRmFjZSwgMCwgMTAwMCAqIDY0LCA3MiwgNzIpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIHN3aXRjaCAocEZvbnREZXMtPkdldFR5cGUoKSkgewotICAgICAgICBjYXNlIEZQRl9TS0lBRk9OVFRZUEVfUGF0aDogewotICAgICAgICAgICAgICAgIENGUEZfU2tpYVBhdGhGb250ICpwRm9udCA9IChDRlBGX1NraWFQYXRoRm9udCopcEZvbnREZXM7Ci0gICAgICAgICAgICAgICAgbV9GYWNlID0gcEZvbnRNZ3ItPkdldEZvbnRGYWNlKHBGb250LT5tX3BQYXRoLCBwRm9udC0+bV9pRmFjZUluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZQRl9TS0lBRk9OVFRZUEVfRmlsZTogewotICAgICAgICAgICAgICAgIENGUEZfU2tpYUZpbGVGb250ICpwRm9udCA9IChDRlBGX1NraWFGaWxlRm9udCopcEZvbnREZXM7Ci0gICAgICAgICAgICAgICAgbV9GYWNlID0gcEZvbnRNZ3ItPkdldEZvbnRGYWNlKHBGb250LT5tX3BGaWxlLCBwRm9udC0+bV9pRmFjZUluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZQRl9TS0lBRk9OVFRZUEVfQnVmZmVyOiB7Ci0gICAgICAgICAgICAgICAgQ0ZQRl9Ta2lhQnVmZmVyRm9udCAqcEZvbnQgPSAoQ0ZQRl9Ta2lhQnVmZmVyRm9udCopcEZvbnREZXM7Ci0gICAgICAgICAgICAgICAgbV9GYWNlID0gcEZvbnRNZ3ItPkdldEZvbnRGYWNlKChGWF9MUENCWVRFKXBGb250LT5tX3BCdWZmZXIsIHBGb250LT5tX3N6QnVmZmVyLCBwRm9udC0+bV9pRmFjZUluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmIChGWEZUX0xvYWRfR2x5cGgobV9GYWNlLCBpR2x5cGhJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYRlRfTE9BRF9JR05PUkVfR0xPQkFMX0FEVkFOQ0VfV0lEVEgpKSB7CisgICAgICBGWEZUX1NldF9QaXhlbF9TaXplcyhtX0ZhY2UsIDAsIDY0KTsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgaWYgKCFtX0ZhY2UpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIEZYRlRfR2x5cGggZ2x5cGg7CisgICAgaWYgKEZYRlRfR2V0X0dseXBoKG1fRmFjZS0+Z2x5cGgsICZnbHlwaCkpIHsKKyAgICAgIEZYRlRfU2V0X1BpeGVsX1NpemVzKG1fRmFjZSwgMCwgNjQpOworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBtX2R3U3R5bGUgPSBkd1N0eWxlOwotICAgIG1fdUNoYXJzZXQgPSB1Q2hhcnNldDsKLSAgICBtX3BGb250TWdyID0gcEZvbnRNZ3I7Ci0gICAgbV9wRm9udERlcyA9IHBGb250RGVzOwotICAgIG1fZHdSZWZDb3VudCA9IDE7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgRlhGVF9CQm94IGNib3g7CisgICAgRlhGVF9HbHlwaF9HZXRfQ0JveChnbHlwaCwgRlhGVF9HTFlQSF9CQk9YX1BJWEVMUywgJmNib3gpOworICAgIGludDMyX3QgeF9wcGVtID0gbV9GYWNlLT5zaXplLT5tZXRyaWNzLnhfcHBlbTsKKyAgICBpbnQzMl90IHlfcHBlbSA9IG1fRmFjZS0+c2l6ZS0+bWV0cmljcy55X3BwZW07CisgICAgcnRCQm94LmxlZnQgPSBGUEZfRU1fQURKVVNUKHhfcHBlbSwgY2JveC54TWluKTsKKyAgICBydEJCb3gucmlnaHQgPSBGUEZfRU1fQURKVVNUKHhfcHBlbSwgY2JveC54TWF4KTsKKyAgICBydEJCb3gudG9wID0gRlBGX0VNX0FESlVTVCh5X3BwZW0sIGNib3gueU1heCk7CisgICAgcnRCQm94LmJvdHRvbSA9IEZQRl9FTV9BREpVU1QoeV9wcGVtLCBjYm94LnlNaW4pOworICAgIHJ0QkJveC50b3AgPSBzdGQ6Om1pbihydEJCb3gudG9wLCBHZXRBc2NlbnQoKSk7CisgICAgcnRCQm94LmJvdHRvbSA9IHN0ZDo6bWF4KHJ0QkJveC5ib3R0b20sIEdldERlc2NlbnQoKSk7CisgICAgRlhGVF9Eb25lX0dseXBoKGdseXBoKTsKKyAgICByZXR1cm4gRlhGVF9TZXRfUGl4ZWxfU2l6ZXMobV9GYWNlLCAwLCA2NCkgPT0gMDsKKyAgfQorICBpZiAoRlhGVF9Mb2FkX0dseXBoKAorICAgICAgICAgIG1fRmFjZSwgaUdseXBoSW5kZXgsCisgICAgICAgICAgRlhGVF9MT0FEX05PX1NDQUxFIHwgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcnRCQm94LmxlZnQgPSBGUEZfRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdYKG1fRmFjZSkpOworICBydEJCb3guYm90dG9tID0gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdZKG1fRmFjZSkpOworICBydEJCb3gucmlnaHQgPSBGUEZfRU1fQURKVVNUKAorICAgICAgRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksCisgICAgICBGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1gobV9GYWNlKSArIEZYRlRfR2V0X0dseXBoX1dpZHRoKG1fRmFjZSkpOworICBydEJCb3gudG9wID0gRlBGX0VNX0FESlVTVCgKKyAgICAgIEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLAorICAgICAgRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdZKG1fRmFjZSkgLSBGWEZUX0dldF9HbHlwaF9IZWlnaHQobV9GYWNlKSk7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDRlBGX1NraWFGb250OjpHZXRCQm94KEZYX1JFQ1QmIHJ0QkJveCkgeworICBpZiAoIW1fRmFjZSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBydEJCb3gubGVmdCA9IEZQRl9FTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEZUX0dldF9GYWNlX3hNaW4obV9GYWNlKSk7CisgIHJ0QkJveC50b3AgPSBGUEZfRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEZUX0dldF9GYWNlX3lNaW4obV9GYWNlKSk7CisgIHJ0QkJveC5yaWdodCA9IEZQRl9FTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhGVF9HZXRfRmFjZV94TWF4KG1fRmFjZSkpOworICBydEJCb3guYm90dG9tID0gRlBGX0VNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhGVF9HZXRfRmFjZV95TWF4KG1fRmFjZSkpOworICByZXR1cm4gVFJVRTsKK30KK2ludDMyX3QgQ0ZQRl9Ta2lhRm9udDo6R2V0SGVpZ2h0KCkgY29uc3QgeworICBpZiAoIW1fRmFjZSkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBGUEZfRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLAorICAgICAgICAgICAgICAgICAgICAgICBGWEZUX0dldF9GYWNlX0hlaWdodChtX0ZhY2UpKTsKK30KK2ludDMyX3QgQ0ZQRl9Ta2lhRm9udDo6R2V0SXRhbGljQW5nbGUoKSBjb25zdCB7CisgIGlmICghbV9GYWNlKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgVFRfUG9zdHNjcmlwdCogdHRJbmZvID0KKyAgICAgIChUVF9Qb3N0c2NyaXB0KilGVF9HZXRfU2ZudF9UYWJsZShtX0ZhY2UsIGZ0X3NmbnRfcG9zdCk7CisgIGlmICh0dEluZm8pIHsKKyAgICByZXR1cm4gdHRJbmZvLT5pdGFsaWNBbmdsZTsKKyAgfQorICByZXR1cm4gMDsKK30KK0ZYX0RXT1JEIENGUEZfU2tpYUZvbnQ6OkdldEZvbnREYXRhKEZYX0RXT1JEIGR3VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTaXplKSB7CisgIGlmICghbV9GYWNlKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgRlRfVUxvbmcgdWxTaXplID0gcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlRfVUxvbmc+KGR3U2l6ZSk7CisgIGlmIChGWEZUX0xvYWRfU2ZudF9UYWJsZShtX0ZhY2UsIGR3VGFibGUsIDAsIHBCdWZmZXIsICZ1bFNpemUpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PEZYX0RXT1JEPih1bFNpemUpOworfQorRlhfQk9PTCBDRlBGX1NraWFGb250OjpJbml0Rm9udChDRlBGX1NraWFGb250TWdyKiBwRm9udE1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IqIHBGb250RGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHVDaGFyc2V0KSB7CisgIGlmICghcEZvbnRNZ3IgfHwgIXBGb250RGVzKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHN3aXRjaCAocEZvbnREZXMtPkdldFR5cGUoKSkgeworICAgIGNhc2UgRlBGX1NLSUFGT05UVFlQRV9QYXRoOiB7CisgICAgICBDRlBGX1NraWFQYXRoRm9udCogcEZvbnQgPSAoQ0ZQRl9Ta2lhUGF0aEZvbnQqKXBGb250RGVzOworICAgICAgbV9GYWNlID0gcEZvbnRNZ3ItPkdldEZvbnRGYWNlKHBGb250LT5tX3BQYXRoLCBwRm9udC0+bV9pRmFjZUluZGV4KTsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgRlBGX1NLSUFGT05UVFlQRV9GaWxlOiB7CisgICAgICBDRlBGX1NraWFGaWxlRm9udCogcEZvbnQgPSAoQ0ZQRl9Ta2lhRmlsZUZvbnQqKXBGb250RGVzOworICAgICAgbV9GYWNlID0gcEZvbnRNZ3ItPkdldEZvbnRGYWNlKHBGb250LT5tX3BGaWxlLCBwRm9udC0+bV9pRmFjZUluZGV4KTsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgRlBGX1NLSUFGT05UVFlQRV9CdWZmZXI6IHsKKyAgICAgIENGUEZfU2tpYUJ1ZmZlckZvbnQqIHBGb250ID0gKENGUEZfU2tpYUJ1ZmZlckZvbnQqKXBGb250RGVzOworICAgICAgbV9GYWNlID0gcEZvbnRNZ3ItPkdldEZvbnRGYWNlKChjb25zdCB1aW50OF90KilwRm9udC0+bV9wQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb250LT5tX3N6QnVmZmVyLCBwRm9udC0+bV9pRmFjZUluZGV4KTsKKyAgICB9IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKCFtX0ZhY2UpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9kd1N0eWxlID0gZHdTdHlsZTsKKyAgbV91Q2hhcnNldCA9IHVDaGFyc2V0OworICBtX3BGb250TWdyID0gcEZvbnRNZ3I7CisgIG1fcEZvbnREZXMgPSBwRm9udERlczsKKyAgbV9kd1JlZkNvdW50ID0gMTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnQuaCBiL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnQuaAppbmRleCAxMzVjODMwLi5jODhmMjQwIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFmb250LmgKKysrIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udC5oCkBAIC0xLDU4ICsxLDU3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgQ09SRV9TUkNfRlhHRV9BTkRST0lEX0ZQRl9TS0lBRk9OVF9IXwogI2RlZmluZSBDT1JFX1NSQ19GWEdFX0FORFJPSURfRlBGX1NLSUFGT05UX0hfCiAKICNpZiBfRlhfT1NfID09IF9GWF9BTkRST0lEXworCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnBmLmgiCisKIGNsYXNzIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yOwogY2xhc3MgQ0ZQRl9Ta2lhRm9udE1ncjsKIGNsYXNzIFNrVHlwZWZhY2U7Ci1jbGFzcyBDRlBGX1NraWFGb250IDogcHVibGljIElGUEZfRm9udAotewotcHVibGljOgotICAgIENGUEZfU2tpYUZvbnQoKTsKLSAgICB2aXJ0dWFsIH5DRlBGX1NraWFGb250KCk7Ci0gICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpOwotICAgIHZpcnR1YWwgSUZQRl9Gb250KgkJUmV0YWluKCk7CitjbGFzcyBDRlBGX1NraWFGb250IDogcHVibGljIElGUEZfRm9udCB7CisgcHVibGljOgorICBDRlBGX1NraWFGb250KCk7CisgIH5DRlBGX1NraWFGb250KCkgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIEZQRl9IRk9OVAkJR2V0SGFuZGxlKCk7CisgIC8vIElGUEZfRm9udAorICB2b2lkIFJlbGVhc2UoKSBvdmVycmlkZTsKKyAgSUZQRl9Gb250KiBSZXRhaW4oKSBvdmVycmlkZTsKKyAgRlBGX0hGT05UIEdldEhhbmRsZSgpIG92ZXJyaWRlOworICBDRlhfQnl0ZVN0cmluZyBHZXRGYW1pbHlOYW1lKCkgb3ZlcnJpZGU7CisgIENGWF9XaWRlU3RyaW5nIEdldFBzTmFtZSgpIG92ZXJyaWRlOworICBGWF9EV09SRCBHZXRGb250U3R5bGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtX2R3U3R5bGU7IH0KKyAgdWludDhfdCBHZXRDaGFyc2V0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbV91Q2hhcnNldDsgfQorICBpbnQzMl90IEdldEdseXBoSW5kZXgoRlhfV0NIQVIgd1VuaWNvZGUpIG92ZXJyaWRlOworICBpbnQzMl90IEdldEdseXBoV2lkdGgoaW50MzJfdCBpR2x5cGhJbmRleCkgb3ZlcnJpZGU7CisgIGludDMyX3QgR2V0QXNjZW50KCkgY29uc3Qgb3ZlcnJpZGU7CisgIGludDMyX3QgR2V0RGVzY2VudCgpIGNvbnN0IG92ZXJyaWRlOworICBGWF9CT09MIEdldEdseXBoQkJveChpbnQzMl90IGlHbHlwaEluZGV4LCBGWF9SRUNUJiBydEJCb3gpIG92ZXJyaWRlOworICBGWF9CT09MIEdldEJCb3goRlhfUkVDVCYgcnRCQm94KSBvdmVycmlkZTsKKyAgaW50MzJfdCBHZXRIZWlnaHQoKSBjb25zdCBvdmVycmlkZTsKKyAgaW50MzJfdCBHZXRJdGFsaWNBbmdsZSgpIGNvbnN0IG92ZXJyaWRlOworICBGWF9EV09SRCBHZXRGb250RGF0YShGWF9EV09SRCBkd1RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1NpemUpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZwlHZXRGYW1pbHlOYW1lKCk7Ci0gICAgdmlydHVhbCBDRlhfV2lkZVN0cmluZwlHZXRQc05hbWUoKTsKKyAgRlhfQk9PTCBJbml0Rm9udChDRlBGX1NraWFGb250TWdyKiBwRm9udE1nciwKKyAgICAgICAgICAgICAgICAgICBDRlBGX1NraWFGb250RGVzY3JpcHRvciogcEZvbnREZXMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlLAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdUNoYXJzZXQpOwogCi0gICAgdmlydHVhbCBGWF9EV09SRAkJR2V0Rm9udFN0eWxlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2R3U3R5bGU7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfQllURQkJCUdldENoYXJzZXQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fdUNoYXJzZXQ7Ci0gICAgfQotCi0gICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0R2x5cGhJbmRleChGWF9XQ0hBUiB3VW5pY29kZSk7Ci0gICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0R2x5cGhXaWR0aChGWF9JTlQzMiBpR2x5cGhJbmRleCk7Ci0KLSAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXRBc2NlbnQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIEZYX0lOVDMyCQlHZXREZXNjZW50KCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlHZXRHbHlwaEJCb3goRlhfSU5UMzIgaUdseXBoSW5kZXgsIEZYX1JFQ1QgJnJ0QkJveCk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQkJR2V0QkJveChGWF9SRUNUICZydEJCb3gpOwotCi0gICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0SGVpZ2h0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBGWF9JTlQzMgkJR2V0SXRhbGljQW5nbGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIEZYX0RXT1JECQlHZXRGb250RGF0YShGWF9EV09SRCBkd1RhYmxlLCBGWF9MUEJZVEUgcEJ1ZmZlciwgRlhfRFdPUkQgZHdTaXplKTsKLSAgICBGWF9CT09MCQkJCQlJbml0Rm9udChDRlBGX1NraWFGb250TWdyICpwRm9udE1nciwgQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IgKnBGb250RGVzLCBGWF9CU1RSIGJzRmFtaWx5LCBGWF9EV09SRCBkd1N0eWxlLCBGWF9CWVRFIHVDaGFyc2V0KTsKLXByb3RlY3RlZDoKLSAgICBDRlBGX1NraWFGb250TWdyCQkqbV9wRm9udE1ncjsKLSAgICBDRlBGX1NraWFGb250RGVzY3JpcHRvcgkqbV9wRm9udERlczsKLSAgICBGWEZUX0ZhY2UJCQkJbV9GYWNlOwotICAgIEZYX0RXT1JECQkJCW1fZHdTdHlsZTsKLSAgICBGWF9CWVRFCQkJCQltX3VDaGFyc2V0OwotICAgIEZYX0RXT1JECQkJCW1fZHdSZWZDb3VudDsKKyBwcm90ZWN0ZWQ6CisgIENGUEZfU2tpYUZvbnRNZ3IqIG1fcEZvbnRNZ3I7CisgIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yKiBtX3BGb250RGVzOworICBGWEZUX0ZhY2UgbV9GYWNlOworICBGWF9EV09SRCBtX2R3U3R5bGU7CisgIHVpbnQ4X3QgbV91Q2hhcnNldDsKKyAgRlhfRFdPUkQgbV9kd1JlZkNvdW50OwogfTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFmb250bWdyLmNwcCBiL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnRtZ3IuY3BwCmluZGV4IGZjMDEyZWEuLjlkYmUzNWQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnRtZ3IuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnRtZ3IuY3BwCkBAIC0xLDQ3MyArMSw0NTMgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9leHQuaCIKICNpbmNsdWRlICJmeF9mcGYuaCIKKwogI2lmIF9GWF9PU18gPT0gX0ZYX0FORFJPSURfCi0jZGVmaW5lIEZQRl9TS0lBTUFUQ0hXRUlHSFRfTkFNRTEJNjIKLSNkZWZpbmUgRlBGX1NLSUFNQVRDSFdFSUdIVF9OQU1FMgk2MAotI2RlZmluZSBGUEZfU0tJQU1BVENIV0VJR0hUXzEJCTE2Ci0jZGVmaW5lIEZQRl9TS0lBTUFUQ0hXRUlHSFRfMgkJOAorI2RlZmluZSBGUEZfU0tJQU1BVENIV0VJR0hUX05BTUUxIDYyCisjZGVmaW5lIEZQRl9TS0lBTUFUQ0hXRUlHSFRfTkFNRTIgNjAKKyNkZWZpbmUgRlBGX1NLSUFNQVRDSFdFSUdIVF8xIDE2CisjZGVmaW5lIEZQRl9TS0lBTUFUQ0hXRUlHSFRfMiA4CiAjaW5jbHVkZSAiZnBmX3NraWFmb250bWdyLmgiCiAjaW5jbHVkZSAiZnBmX3NraWFmb250LmgiCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBGUEZfU2tpYVN0cmVhbV9SZWFkKEZYRlRfU3RyZWFtIHN0cmVhbSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCkKLXsKLSAgICBJRlhfRmlsZVJlYWQgKnBGaWxlUmVhZCA9IChJRlhfRmlsZVJlYWQqKXN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyOwotICAgIGlmICghcEZpbGVSZWFkKSB7Ci0gICAgICAgIHJldHVybiAwOworc3RhdGljIHVuc2lnbmVkIGxvbmcgRlBGX1NraWFTdHJlYW1fUmVhZChGWEZUX1N0cmVhbSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQpIHsKKyAgSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQgPSAoSUZYX0ZpbGVSZWFkKilzdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlcjsKKyAgaWYgKCFwRmlsZVJlYWQpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoY291bnQgPiAwKSB7CisgICAgaWYgKHBGaWxlUmVhZC0+UmVhZEJsb2NrKGJ1ZmZlciwgKEZYX0ZJTEVTSVpFKW9mZnNldCwgKHNpemVfdCljb3VudCkgIT0KKyAgICAgICAgY291bnQpIHsKKyAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBpZiAoY291bnQgPiAwKSB7Ci0gICAgICAgIGlmIChwRmlsZVJlYWQtPlJlYWRCbG9jayhidWZmZXIsIChGWF9GSUxFU0laRSlvZmZzZXQsIChzaXplX3QpY291bnQpICE9IGNvdW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gY291bnQ7CisgIH0KKyAgcmV0dXJuIGNvdW50OwogfQotc3RhdGljIHZvaWQgRlBGX1NraWFTdHJlYW1fQ2xvc2UoRlhGVF9TdHJlYW0gc3RyZWFtKQotewotfQorc3RhdGljIHZvaWQgRlBGX1NraWFTdHJlYW1fQ2xvc2UoRlhGVF9TdHJlYW0gc3RyZWFtKSB7fQogI2lmZGVmIF9fY3BsdXNwbHVzCiB9OwogI2VuZGlmCiB0eXBlZGVmIHN0cnVjdCBfRlBGX1NLSUFGT05UTUFQIHsKLSAgICBGWF9EV09SRAlkd0ZhbWlseTsKLSAgICBGWF9EV09SRAlkd1N1YlN0OworICBGWF9EV09SRCBkd0ZhbWlseTsKKyAgRlhfRFdPUkQgZHdTdWJTdDsKIH0gRlBGX1NLSUFGT05UTUFQLCAqRlBGX0xQU0tJQUZPTlRNQVA7Ci10eXBlZGVmIEZQRl9TS0lBRk9OVE1BUCBjb25zdCAqIEZQRl9MUENTS0lBRk9OVE1BUDsKK3R5cGVkZWYgRlBGX1NLSUFGT05UTUFQIGNvbnN0KiBGUEZfTFBDU0tJQUZPTlRNQVA7CiBzdGF0aWMgY29uc3QgRlBGX1NLSUFGT05UTUFQIGdfU2tpYUZvbnRtYXBbXSA9IHsKLSAgICB7MHg1OGM1MDgzLAkJMHhjOGQyZTM0NX0sCi0gICAgezB4NWRmYWRlMiwJCTB4ZTE2MzMwODF9LAotICAgIHsweDY4NDMxN2QsCQkweGUxNjMzMDgxfSwKLSAgICB7MHgxNGVlMmQxMywJMHhjOGQyZTM0NX0sCi0gICAgezB4MzkxOGZlMmQsCTB4YmJlZWVjNzJ9LAotICAgIHsweDNiOThiMzFjLAkweGUxNjMzMDgxfSwKLSAgICB7MHgzZDQ5ZjQwZSwJMHhlMTYzMzA4MX0sCi0gICAgezB4NDMyYzQxYzUsCTB4ZTE2MzMwODF9LAotICAgIHsweDQ5MWI2YWQwLAkweGUxNjMzMDgxfSwKLSAgICB7MHg1NjEyY2FiMSwJMHg1OWI5ZjhmMX0sCi0gICAgezB4Nzc5Y2UxOWQsCTB4YzhkMmUzNDV9LAotICAgIHsweDdjYzk1MTBiLAkweDU5YjlmOGYxfSwKLSAgICB7MHg4Mzc0NjA1MywJMHhiYmVlZWM3Mn0sCi0gICAgezB4YWFhNjBjMDMsCTB4YmJlZWVjNzJ9LAotICAgIHsweGJmODVmZjI2LAkweGUxNjMzMDgxfSwKLSAgICB7MHhjMDRmZTYwMSwJMHhiYmVlZWM3Mn0sCi0gICAgezB4Y2EzODEyZDUsCTB4NTliOWY4ZjF9LAotICAgIHsweGNhMzgzZTE1LAkweDU5YjlmOGYxfSwKLSAgICB7MHhjYWQ1ZWFmNiwJMHg1OWI5ZjhmMX0sCi0gICAgezB4Y2I3YTA0YzgsCTB4YzhkMmUzNDV9LAotICAgIHsweGZiNGNlMGRlLAkweGUxNjMzMDgxfSwKKyAgICB7MHg1OGM1MDgzLCAweGM4ZDJlMzQ1fSwgIHsweDVkZmFkZTIsIDB4ZTE2MzMwODF9LAorICAgIHsweDY4NDMxN2QsIDB4ZTE2MzMwODF9LCAgezB4MTRlZTJkMTMsIDB4YzhkMmUzNDV9LAorICAgIHsweDM5MThmZTJkLCAweGJiZWVlYzcyfSwgezB4M2I5OGIzMWMsIDB4ZTE2MzMwODF9LAorICAgIHsweDNkNDlmNDBlLCAweGUxNjMzMDgxfSwgezB4NDMyYzQxYzUsIDB4ZTE2MzMwODF9LAorICAgIHsweDQ5MWI2YWQwLCAweGUxNjMzMDgxfSwgezB4NTYxMmNhYjEsIDB4NTliOWY4ZjF9LAorICAgIHsweDc3OWNlMTlkLCAweGM4ZDJlMzQ1fSwgezB4N2NjOTUxMGIsIDB4NTliOWY4ZjF9LAorICAgIHsweDgzNzQ2MDUzLCAweGJiZWVlYzcyfSwgezB4YWFhNjBjMDMsIDB4YmJlZWVjNzJ9LAorICAgIHsweGJmODVmZjI2LCAweGUxNjMzMDgxfSwgezB4YzA0ZmU2MDEsIDB4YmJlZWVjNzJ9LAorICAgIHsweGNhMzgxMmQ1LCAweDU5YjlmOGYxfSwgezB4Y2EzODNlMTUsIDB4NTliOWY4ZjF9LAorICAgIHsweGNhZDVlYWY2LCAweDU5YjlmOGYxfSwgezB4Y2I3YTA0YzgsIDB4YzhkMmUzNDV9LAorICAgIHsweGZiNGNlMGRlLCAweGUxNjMzMDgxfSwKIH07Ci1GWF9EV09SRCBGUEZfU2tpYUdldFN1YnN0Rm9udChGWF9EV09SRCBkd0hhc2gpCi17Ci0gICAgRlhfSU5UMzIgaVN0YXJ0ID0gMDsKLSAgICBGWF9JTlQzMiBpRW5kID0gc2l6ZW9mKGdfU2tpYUZvbnRtYXApIC8gc2l6ZW9mKEZQRl9TS0lBRk9OVE1BUCk7Ci0gICAgd2hpbGUgKGlTdGFydCA8PSBpRW5kKSB7Ci0gICAgICAgIEZYX0lOVDMyIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOwotICAgICAgICBGUEZfTFBDU0tJQUZPTlRNQVAgcEl0ZW0gPSAmZ19Ta2lhRm9udG1hcFtpTWlkXTsKLSAgICAgICAgaWYgKGR3SGFzaCA8IHBJdGVtLT5kd0ZhbWlseSkgewotICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOwotICAgICAgICB9IGVsc2UgaWYgKGR3SGFzaCA+IHBJdGVtLT5kd0ZhbWlseSkgewotICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gcEl0ZW0tPmR3U3ViU3Q7Ci0gICAgICAgIH0KK0ZYX0RXT1JEIEZQRl9Ta2lhR2V0U3Vic3RGb250KEZYX0RXT1JEIGR3SGFzaCkgeworICBpbnQzMl90IGlTdGFydCA9IDA7CisgIGludDMyX3QgaUVuZCA9IHNpemVvZihnX1NraWFGb250bWFwKSAvIHNpemVvZihGUEZfU0tJQUZPTlRNQVApOworICB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpIHsKKyAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOworICAgIEZQRl9MUENTS0lBRk9OVE1BUCBwSXRlbSA9ICZnX1NraWFGb250bWFwW2lNaWRdOworICAgIGlmIChkd0hhc2ggPCBwSXRlbS0+ZHdGYW1pbHkpIHsKKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsKKyAgICB9IGVsc2UgaWYgKGR3SGFzaCA+IHBJdGVtLT5kd0ZhbWlseSkgeworICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBwSXRlbS0+ZHdTdWJTdDsKICAgICB9Ci0gICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDA7CiB9CiBzdGF0aWMgY29uc3QgRlBGX1NLSUFGT05UTUFQIGdfU2tpYVNhbnNGb250TWFwW10gPSB7Ci0gICAgezB4NThjNTA4MywJCTB4ZDViOGQxMGZ9LAotICAgIHsweDE0ZWUyZDEzLAkweGQ1YjhkMTBmfSwKLSAgICB7MHg3NzljZTE5ZCwJMHhkNWI4ZDEwZn0sCi0gICAgezB4Y2I3YTA0YzgsCTB4ZDViOGQxMGZ9LAotICAgIHsweGZiNGNlMGRlLAkweGQ1YjhkMTBmfSwKKyAgICB7MHg1OGM1MDgzLCAweGQ1YjhkMTBmfSwgIHsweDE0ZWUyZDEzLCAweGQ1YjhkMTBmfSwKKyAgICB7MHg3NzljZTE5ZCwgMHhkNWI4ZDEwZn0sIHsweGNiN2EwNGM4LCAweGQ1YjhkMTBmfSwKKyAgICB7MHhmYjRjZTBkZSwgMHhkNWI4ZDEwZn0sCiB9OwotRlhfRFdPUkQgRlBGX1NraWFHZXRTYW5zRm9udChGWF9EV09SRCBkd0hhc2gpCi17Ci0gICAgRlhfSU5UMzIgaVN0YXJ0ID0gMDsKLSAgICBGWF9JTlQzMiBpRW5kID0gc2l6ZW9mKGdfU2tpYVNhbnNGb250TWFwKSAvIHNpemVvZihGUEZfU0tJQUZPTlRNQVApOwotICAgIHdoaWxlIChpU3RhcnQgPD0gaUVuZCkgewotICAgICAgICBGWF9JTlQzMiBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsKLSAgICAgICAgRlBGX0xQQ1NLSUFGT05UTUFQIHBJdGVtID0gJmdfU2tpYVNhbnNGb250TWFwW2lNaWRdOwotICAgICAgICBpZiAoZHdIYXNoIDwgcEl0ZW0tPmR3RmFtaWx5KSB7Ci0gICAgICAgICAgICBpRW5kID0gaU1pZCAtIDE7Ci0gICAgICAgIH0gZWxzZSBpZiAoZHdIYXNoID4gcEl0ZW0tPmR3RmFtaWx5KSB7Ci0gICAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBwSXRlbS0+ZHdTdWJTdDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLXN0YXRpYyBGWF9VSU5UMzIgRlBGX0dldEhhc2hDb2RlX1N0cmluZ0EoRlhfTFBDU1RSIHBTdHIsIEZYX0lOVDMyIGlMZW5ndGgsIEZYX0JPT0wgYklnbm9yZUNhc2UgPSBGQUxTRSkKLXsKLSAgICBpZiAoIXBTdHIpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChpTGVuZ3RoIDwgMCkgewotICAgICAgICBpTGVuZ3RoID0gRlhTWVNfc3RybGVuKHBTdHIpOwotICAgIH0KLSAgICBGWF9MUENTVFIgcFN0ckVuZCA9IHBTdHIgKyBpTGVuZ3RoOwotICAgIEZYX1VJTlQzMiB1SGFzaENvZGUgPSAwOwotICAgIGlmIChiSWdub3JlQ2FzZSkgewotICAgICAgICB3aGlsZSAocFN0ciA8IHBTdHJFbmQpIHsKLSAgICAgICAgICAgIHVIYXNoQ29kZSA9IDMxICogdUhhc2hDb2RlICsgRlhTWVNfdG9sb3dlcigqcFN0cisrKTsKLSAgICAgICAgfQorRlhfRFdPUkQgRlBGX1NraWFHZXRTYW5zRm9udChGWF9EV09SRCBkd0hhc2gpIHsKKyAgaW50MzJfdCBpU3RhcnQgPSAwOworICBpbnQzMl90IGlFbmQgPSBzaXplb2YoZ19Ta2lhU2Fuc0ZvbnRNYXApIC8gc2l6ZW9mKEZQRl9TS0lBRk9OVE1BUCk7CisgIHdoaWxlIChpU3RhcnQgPD0gaUVuZCkgeworICAgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7CisgICAgRlBGX0xQQ1NLSUFGT05UTUFQIHBJdGVtID0gJmdfU2tpYVNhbnNGb250TWFwW2lNaWRdOworICAgIGlmIChkd0hhc2ggPCBwSXRlbS0+ZHdGYW1pbHkpIHsKKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsKKyAgICB9IGVsc2UgaWYgKGR3SGFzaCA+IHBJdGVtLT5kd0ZhbWlseSkgeworICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgd2hpbGUgKHBTdHIgPCBwU3RyRW5kKSB7Ci0gICAgICAgICAgICB1SGFzaENvZGUgPSAzMSAqIHVIYXNoQ29kZSArICpwU3RyICsrOwotICAgICAgICB9CisgICAgICByZXR1cm4gcEl0ZW0tPmR3U3ViU3Q7CiAgICAgfQotICAgIHJldHVybiB1SGFzaENvZGU7CisgIH0KKyAgcmV0dXJuIDA7Cit9CitzdGF0aWMgdWludDMyX3QgRlBGX0dldEhhc2hDb2RlX1N0cmluZ0EoY29uc3QgRlhfQ0hBUiogcFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSWdub3JlQ2FzZSA9IEZBTFNFKSB7CisgIGlmICghcFN0cikgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChpTGVuZ3RoIDwgMCkgeworICAgIGlMZW5ndGggPSBGWFNZU19zdHJsZW4ocFN0cik7CisgIH0KKyAgY29uc3QgRlhfQ0hBUiogcFN0ckVuZCA9IHBTdHIgKyBpTGVuZ3RoOworICB1aW50MzJfdCB1SGFzaENvZGUgPSAwOworICBpZiAoYklnbm9yZUNhc2UpIHsKKyAgICB3aGlsZSAocFN0ciA8IHBTdHJFbmQpIHsKKyAgICAgIHVIYXNoQ29kZSA9IDMxICogdUhhc2hDb2RlICsgRlhTWVNfdG9sb3dlcigqcFN0cisrKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgd2hpbGUgKHBTdHIgPCBwU3RyRW5kKSB7CisgICAgICB1SGFzaENvZGUgPSAzMSAqIHVIYXNoQ29kZSArICpwU3RyKys7CisgICAgfQorICB9CisgIHJldHVybiB1SGFzaENvZGU7CiB9CiBlbnVtIEZQRl9TS0lBQ0hBUlNFVCB7Ci0gICAgRlBGX1NLSUFDSEFSU0VUX0Fuc2kJCQk9IDEgPDwgMCwKLSAgICBGUEZfU0tJQUNIQVJTRVRfRGVmYXVsdAkJCT0gMSA8PCAxLAotICAgIEZQRl9TS0lBQ0hBUlNFVF9TeW1ib2wJCQk9IDEgPDwgMiwKLSAgICBGUEZfU0tJQUNIQVJTRVRfU2hpZnRKSVMJCT0gMSA8PCAzLAotICAgIEZQRl9TS0lBQ0hBUlNFVF9Lb3JlYW4JCQk9IDEgPDwgNCwKLSAgICBGUEZfU0tJQUNIQVJTRVRfSm9oYWIJCQk9IDEgPDwgNSwKLSAgICBGUEZfU0tJQUNIQVJTRVRfR0IyMzEyCQkJPSAxIDw8IDYsCi0gICAgRlBGX1NLSUFDSEFSU0VUX0JJRzUJCQk9IDEgPDwgNywKLSAgICBGUEZfU0tJQUNIQVJTRVRfR3JlZWsJCQk9IDEgPDwgOCwKLSAgICBGUEZfU0tJQUNIQVJTRVRfVHVya2lzaAkJCT0gMSA8PCA5LAotICAgIEZQRl9TS0lBQ0hBUlNFVF9WaWV0bmFtZXNlCQk9IDEgPDwgMTAsCi0gICAgRlBGX1NLSUFDSEFSU0VUX0hlYnJldwkJCT0gMSA8PCAxMSwKLSAgICBGUEZfU0tJQUNIQVJTRVRfQXJhYmljCQkJPSAxIDw8IDEyLAotICAgIEZQRl9TS0lBQ0hBUlNFVF9CYWx0aWMJCQk9IDEgPDwgMTMsCi0gICAgRlBGX1NLSUFDSEFSU0VUX0N5cmlsbGljCQk9IDEgPDwgMTQsCi0gICAgRlBGX1NLSUFDSEFSU0VUX1RoYWkJCQk9IDEgPDwgMTUsCi0gICAgRlBGX1NLSUFDSEFSU0VUX0VlYXN0ZXJuRXVyb3BlYW4gPSAxIDw8IDE2LAotICAgIEZQRl9TS0lBQ0hBUlNFVF9QQwkJCQk9IDEgPDwgMTcsCi0gICAgRlBGX1NLSUFDSEFSU0VUX09FTQkJCQk9IDEgPDwgMTgsCisgIEZQRl9TS0lBQ0hBUlNFVF9BbnNpID0gMSA8PCAwLAorICBGUEZfU0tJQUNIQVJTRVRfRGVmYXVsdCA9IDEgPDwgMSwKKyAgRlBGX1NLSUFDSEFSU0VUX1N5bWJvbCA9IDEgPDwgMiwKKyAgRlBGX1NLSUFDSEFSU0VUX1NoaWZ0SklTID0gMSA8PCAzLAorICBGUEZfU0tJQUNIQVJTRVRfS29yZWFuID0gMSA8PCA0LAorICBGUEZfU0tJQUNIQVJTRVRfSm9oYWIgPSAxIDw8IDUsCisgIEZQRl9TS0lBQ0hBUlNFVF9HQjIzMTIgPSAxIDw8IDYsCisgIEZQRl9TS0lBQ0hBUlNFVF9CSUc1ID0gMSA8PCA3LAorICBGUEZfU0tJQUNIQVJTRVRfR3JlZWsgPSAxIDw8IDgsCisgIEZQRl9TS0lBQ0hBUlNFVF9UdXJraXNoID0gMSA8PCA5LAorICBGUEZfU0tJQUNIQVJTRVRfVmlldG5hbWVzZSA9IDEgPDwgMTAsCisgIEZQRl9TS0lBQ0hBUlNFVF9IZWJyZXcgPSAxIDw8IDExLAorICBGUEZfU0tJQUNIQVJTRVRfQXJhYmljID0gMSA8PCAxMiwKKyAgRlBGX1NLSUFDSEFSU0VUX0JhbHRpYyA9IDEgPDwgMTMsCisgIEZQRl9TS0lBQ0hBUlNFVF9DeXJpbGxpYyA9IDEgPDwgMTQsCisgIEZQRl9TS0lBQ0hBUlNFVF9UaGFpID0gMSA8PCAxNSwKKyAgRlBGX1NLSUFDSEFSU0VUX0VlYXN0ZXJuRXVyb3BlYW4gPSAxIDw8IDE2LAorICBGUEZfU0tJQUNIQVJTRVRfUEMgPSAxIDw8IDE3LAorICBGUEZfU0tJQUNIQVJTRVRfT0VNID0gMSA8PCAxOCwKIH07Ci1zdGF0aWMgRlhfRFdPUkQgRlBGX1NraWFHZXRDaGFyc2V0KEZYX0JZVEUgdUNoYXJzZXQpCi17Ci0gICAgc3dpdGNoICh1Q2hhcnNldCkgewotICAgICAgICBjYXNlIEZYRk9OVF9BTlNJX0NIQVJTRVQ6Ci0gICAgICAgICAgICByZXR1cm4gRlBGX1NLSUFDSEFSU0VUX0Fuc2k7Ci0gICAgICAgIGNhc2UgRlhGT05UX0RFRkFVTFRfQ0hBUlNFVDoKLSAgICAgICAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfRGVmYXVsdDsKLSAgICAgICAgY2FzZSBGWEZPTlRfU1lNQk9MX0NIQVJTRVQ6Ci0gICAgICAgICAgICByZXR1cm4gRlBGX1NLSUFDSEFSU0VUX1N5bWJvbDsKLSAgICAgICAgY2FzZSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVDoKLSAgICAgICAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfU2hpZnRKSVM7Ci0gICAgICAgIGNhc2UgRlhGT05UX0hBTkdFVUxfQ0hBUlNFVDoKLSAgICAgICAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfS29yZWFuOwotICAgICAgICBjYXNlIEZYRk9OVF9HQjIzMTJfQ0hBUlNFVDoKLSAgICAgICAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfR0IyMzEyOwotICAgICAgICBjYXNlIEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUOgotICAgICAgICAgICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9CSUc1OwotICAgICAgICBjYXNlIEZYRk9OVF9HUkVFS19DSEFSU0VUOgotICAgICAgICAgICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9HcmVlazsKLSAgICAgICAgY2FzZSBGWEZPTlRfVFVSS0lTSF9DSEFSU0VUOgotICAgICAgICAgICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9UdXJraXNoOwotICAgICAgICBjYXNlIEZYRk9OVF9IRUJSRVdfQ0hBUlNFVDoKLSAgICAgICAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfSGVicmV3OwotICAgICAgICBjYXNlIEZYRk9OVF9BUkFCSUNfQ0hBUlNFVDoKLSAgICAgICAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfQXJhYmljOwotICAgICAgICBjYXNlIEZYRk9OVF9CQUxUSUNfQ0hBUlNFVDoKLSAgICAgICAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfQmFsdGljOwotICAgICAgICBjYXNlIEZYRk9OVF9SVVNTSUFOX0NIQVJTRVQ6Ci0gICAgICAgICAgICByZXR1cm4gRlBGX1NLSUFDSEFSU0VUX0N5cmlsbGljOwotICAgICAgICBjYXNlIEZYRk9OVF9USEFJX0NIQVJTRVQ6Ci0gICAgICAgICAgICByZXR1cm4gRlBGX1NLSUFDSEFSU0VUX1RoYWk7Ci0gICAgICAgIGNhc2UgRlhGT05UX0VBU1RFVVJPUEVfQ0hBUlNFVDoKLSAgICAgICAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfRWVhc3Rlcm5FdXJvcGVhbjsKLSAgICB9Ci0gICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9EZWZhdWx0Oworc3RhdGljIEZYX0RXT1JEIEZQRl9Ta2lhR2V0Q2hhcnNldCh1aW50OF90IHVDaGFyc2V0KSB7CisgIHN3aXRjaCAodUNoYXJzZXQpIHsKKyAgICBjYXNlIEZYRk9OVF9BTlNJX0NIQVJTRVQ6CisgICAgICByZXR1cm4gRlBGX1NLSUFDSEFSU0VUX0Fuc2k7CisgICAgY2FzZSBGWEZPTlRfREVGQVVMVF9DSEFSU0VUOgorICAgICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9EZWZhdWx0OworICAgIGNhc2UgRlhGT05UX1NZTUJPTF9DSEFSU0VUOgorICAgICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9TeW1ib2w7CisgICAgY2FzZSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVDoKKyAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfU2hpZnRKSVM7CisgICAgY2FzZSBGWEZPTlRfSEFOR0VVTF9DSEFSU0VUOgorICAgICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9Lb3JlYW47CisgICAgY2FzZSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQ6CisgICAgICByZXR1cm4gRlBGX1NLSUFDSEFSU0VUX0dCMjMxMjsKKyAgICBjYXNlIEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUOgorICAgICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9CSUc1OworICAgIGNhc2UgRlhGT05UX0dSRUVLX0NIQVJTRVQ6CisgICAgICByZXR1cm4gRlBGX1NLSUFDSEFSU0VUX0dyZWVrOworICAgIGNhc2UgRlhGT05UX1RVUktJU0hfQ0hBUlNFVDoKKyAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfVHVya2lzaDsKKyAgICBjYXNlIEZYRk9OVF9IRUJSRVdfQ0hBUlNFVDoKKyAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfSGVicmV3OworICAgIGNhc2UgRlhGT05UX0FSQUJJQ19DSEFSU0VUOgorICAgICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9BcmFiaWM7CisgICAgY2FzZSBGWEZPTlRfQkFMVElDX0NIQVJTRVQ6CisgICAgICByZXR1cm4gRlBGX1NLSUFDSEFSU0VUX0JhbHRpYzsKKyAgICBjYXNlIEZYRk9OVF9SVVNTSUFOX0NIQVJTRVQ6CisgICAgICByZXR1cm4gRlBGX1NLSUFDSEFSU0VUX0N5cmlsbGljOworICAgIGNhc2UgRlhGT05UX1RIQUlfQ0hBUlNFVDoKKyAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfVGhhaTsKKyAgICBjYXNlIEZYRk9OVF9FQVNURVVST1BFX0NIQVJTRVQ6CisgICAgICByZXR1cm4gRlBGX1NLSUFDSEFSU0VUX0VlYXN0ZXJuRXVyb3BlYW47CisgIH0KKyAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9EZWZhdWx0OwogfQotc3RhdGljIEZYX0RXT1JEIEZQRl9TS0lBTm9ybWFsaXplRm9udE5hbWUoRlhfQlNUUiBic2ZhbWlseSkKLXsKLSAgICBGWF9EV09SRCBkd0hhc2ggPSAwOwotICAgIEZYX0lOVDMyIGlMZW5ndGggPSBic2ZhbWlseS5HZXRMZW5ndGgoKTsKLSAgICBGWF9MUENTVFIgcEJ1ZmZlciA9IGJzZmFtaWx5LkdldENTdHIoKTsKLSAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgaUxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIEZYX0NIQVIgY2ggPSBwQnVmZmVyW2ldOwotICAgICAgICBpZiAoY2ggPT0gJyAnIHx8IGNoID09ICctJyB8fCBjaCA9PSAnLCcpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGR3SGFzaCA9IDMxICogZHdIYXNoICsgRlhTWVNfdG9sb3dlcihjaCk7CitzdGF0aWMgRlhfRFdPUkQgRlBGX1NLSUFOb3JtYWxpemVGb250TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzZmFtaWx5KSB7CisgIEZYX0RXT1JEIGR3SGFzaCA9IDA7CisgIGludDMyX3QgaUxlbmd0aCA9IGJzZmFtaWx5LkdldExlbmd0aCgpOworICBjb25zdCBGWF9DSEFSKiBwQnVmZmVyID0gYnNmYW1pbHkuR2V0Q1N0cigpOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGVuZ3RoOyBpKyspIHsKKyAgICBGWF9DSEFSIGNoID0gcEJ1ZmZlcltpXTsKKyAgICBpZiAoY2ggPT0gJyAnIHx8IGNoID09ICctJyB8fCBjaCA9PSAnLCcpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICByZXR1cm4gZHdIYXNoOworICAgIGR3SGFzaCA9IDMxICogZHdIYXNoICsgRlhTWVNfdG9sb3dlcihjaCk7CisgIH0KKyAgcmV0dXJuIGR3SGFzaDsKIH0KLXN0YXRpYyBGWF9EV09SRAlGUEZfU0tJQUdldEZhbWlseUhhc2goRlhfQlNUUiBic0ZhbWlseSwgRlhfRFdPUkQgZHdTdHlsZSwgRlhfQllURSB1Q2hhcnNldCkKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBic0ZvbnQoYnNGYW1pbHkpOwotICAgIGlmIChkd1N0eWxlICYgRlhGT05UX0JPTEQpIHsKLSAgICAgICAgYnNGb250ICs9ICJCb2xkIjsKLSAgICB9Ci0gICAgaWYgKGR3U3R5bGUgJiBGWEZPTlRfSVRBTElDKSB7Ci0gICAgICAgIGJzRm9udCArPSAiSXRhbGljIjsKLSAgICB9Ci0gICAgaWYgKGR3U3R5bGUgJiBGWEZPTlRfU0VSSUYpCXsKLSAgICAgICAgYnNGb250ICs9ICJTZXJpZiI7Ci0gICAgfQotICAgIGJzRm9udCArPSB1Q2hhcnNldDsKLSAgICByZXR1cm4gRlBGX0dldEhhc2hDb2RlX1N0cmluZ0EoYnNGb250LmNfc3RyKCksIGJzRm9udC5HZXRMZW5ndGgoKSwgVFJVRSk7CitzdGF0aWMgRlhfRFdPUkQgRlBGX1NLSUFHZXRGYW1pbHlIYXNoKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdUNoYXJzZXQpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnNGb250KGJzRmFtaWx5KTsKKyAgaWYgKGR3U3R5bGUgJiBGWEZPTlRfQk9MRCkgeworICAgIGJzRm9udCArPSAiQm9sZCI7CisgIH0KKyAgaWYgKGR3U3R5bGUgJiBGWEZPTlRfSVRBTElDKSB7CisgICAgYnNGb250ICs9ICJJdGFsaWMiOworICB9CisgIGlmIChkd1N0eWxlICYgRlhGT05UX1NFUklGKSB7CisgICAgYnNGb250ICs9ICJTZXJpZiI7CisgIH0KKyAgYnNGb250ICs9IHVDaGFyc2V0OworICByZXR1cm4gRlBGX0dldEhhc2hDb2RlX1N0cmluZ0EoYnNGb250LmNfc3RyKCksIGJzRm9udC5HZXRMZW5ndGgoKSwgVFJVRSk7CiB9Ci1zdGF0aWMgRlhfQk9PTCBGUEZfU2tpYUlzQ0pLKEZYX0JZVEUgdUNoYXJzZXQpCi17Ci0gICAgcmV0dXJuICh1Q2hhcnNldCA9PSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQpIHx8ICh1Q2hhcnNldCA9PSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVCkKLSAgICAgICAgICAgfHwgKHVDaGFyc2V0ID09IEZYRk9OVF9IQU5HRVVMX0NIQVJTRVQpIHx8ICh1Q2hhcnNldCA9PSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVCk7CitzdGF0aWMgRlhfQk9PTCBGUEZfU2tpYUlzQ0pLKHVpbnQ4X3QgdUNoYXJzZXQpIHsKKyAgcmV0dXJuICh1Q2hhcnNldCA9PSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQpIHx8CisgICAgICAgICAodUNoYXJzZXQgPT0gRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQpIHx8CisgICAgICAgICAodUNoYXJzZXQgPT0gRlhGT05UX0hBTkdFVUxfQ0hBUlNFVCkgfHwKKyAgICAgICAgICh1Q2hhcnNldCA9PSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVCk7CiB9Ci1zdGF0aWMgRlhfQk9PTCBGUEZfU2tpYU1heWJlU3ltYm9sKEZYX0JTVFIgYnNGYWNlbmFtZSkKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBic05hbWUgPSBic0ZhY2VuYW1lOwotICAgIGJzTmFtZS5NYWtlTG93ZXIoKTsKLSAgICByZXR1cm4gYnNOYW1lLkZpbmQoInN5bWJvbCIpID4gLTE7CitzdGF0aWMgRlhfQk9PTCBGUEZfU2tpYU1heWJlU3ltYm9sKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGYWNlbmFtZSkgeworICBDRlhfQnl0ZVN0cmluZyBic05hbWUgPSBic0ZhY2VuYW1lOworICBic05hbWUuTWFrZUxvd2VyKCk7CisgIHJldHVybiBic05hbWUuRmluZCgic3ltYm9sIikgPiAtMTsKIH0KLXN0YXRpYyBGWF9CT09MIEZQRl9Ta2lhTWF5YmVBcmFiaWMoRlhfQlNUUiBic0ZhY2VuYW1lKQotewotICAgIENGWF9CeXRlU3RyaW5nIGJzTmFtZSA9IGJzRmFjZW5hbWU7Ci0gICAgYnNOYW1lLk1ha2VMb3dlcigpOwotICAgIHJldHVybiBic05hbWUuRmluZCgiYXJhYmljIikgPiAtMTsKK3N0YXRpYyBGWF9CT09MIEZQRl9Ta2lhTWF5YmVBcmFiaWMoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZhY2VuYW1lKSB7CisgIENGWF9CeXRlU3RyaW5nIGJzTmFtZSA9IGJzRmFjZW5hbWU7CisgIGJzTmFtZS5NYWtlTG93ZXIoKTsKKyAgcmV0dXJuIGJzTmFtZS5GaW5kKCJhcmFiaWMiKSA+IC0xOwogfQotQ0ZQRl9Ta2lhRm9udE1ncjo6Q0ZQRl9Ta2lhRm9udE1ncigpCi0gICAgOiBtX2JMb2FkZWQoRkFMU0UpLCBtX0ZUTGlicmFyeShOVUxMKQotewotfQotQ0ZQRl9Ta2lhRm9udE1ncjo6fkNGUEZfU2tpYUZvbnRNZ3IoKQotewotICAgIHZvaWQgKnBrZXkgPSBOVUxMOwotICAgIENGUEZfU2tpYUZvbnQgKnBWYWx1ZSA9IE5VTEw7Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9GYW1pbHlGb250cy5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBtX0ZhbWlseUZvbnRzLkdldE5leHRBc3NvYyhwb3MsIHBrZXksICh2b2lkKiYpcFZhbHVlKTsKLSAgICAgICAgaWYgKHBWYWx1ZSkgewotICAgICAgICAgICAgcFZhbHVlLT5SZWxlYXNlKCk7Ci0gICAgICAgIH0KK0NGUEZfU2tpYUZvbnRNZ3I6OkNGUEZfU2tpYUZvbnRNZ3IoKSA6IG1fYkxvYWRlZChGQUxTRSksIG1fRlRMaWJyYXJ5KE5VTEwpIHt9CitDRlBGX1NraWFGb250TWdyOjp+Q0ZQRl9Ta2lhRm9udE1ncigpIHsKKyAgdm9pZCogcGtleSA9IE5VTEw7CisgIENGUEZfU2tpYUZvbnQqIHBWYWx1ZSA9IE5VTEw7CisgIEZYX1BPU0lUSU9OIHBvcyA9IG1fRmFtaWx5Rm9udHMuR2V0U3RhcnRQb3NpdGlvbigpOworICB3aGlsZSAocG9zKSB7CisgICAgbV9GYW1pbHlGb250cy5HZXROZXh0QXNzb2MocG9zLCBwa2V5LCAodm9pZComKXBWYWx1ZSk7CisgICAgaWYgKHBWYWx1ZSkgeworICAgICAgcFZhbHVlLT5SZWxlYXNlKCk7CiAgICAgfQotICAgIG1fRmFtaWx5Rm9udHMuUmVtb3ZlQWxsKCk7Ci0gICAgZm9yIChGWF9JTlQzMiBpID0gbV9Gb250RmFjZXMuR2V0VXBwZXJCb3VuZCgpOyBpID49IDA7IGktLSkgewotICAgICAgICBDRlBGX1NraWFGb250RGVzY3JpcHRvciAqcEZvbnQgPSAoQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IqKW1fRm9udEZhY2VzLkVsZW1lbnRBdChpKTsKLSAgICAgICAgaWYgKHBGb250KSB7Ci0gICAgICAgICAgICBkZWxldGUgcEZvbnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9Gb250RmFjZXMuUmVtb3ZlQWxsKCk7Ci0gICAgaWYgKG1fRlRMaWJyYXJ5KSB7Ci0gICAgICAgIEZYRlRfRG9uZV9GcmVlVHlwZShtX0ZUTGlicmFyeSk7Ci0gICAgfQorICB9CisgIG1fRmFtaWx5Rm9udHMuUmVtb3ZlQWxsKCk7CisgIGZvciAoaW50MzJfdCBpID0gbV9Gb250RmFjZXMuR2V0VXBwZXJCb3VuZCgpOyBpID49IDA7IGktLSkgeworICAgIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yKiBwRm9udCA9CisgICAgICAgIChDRlBGX1NraWFGb250RGVzY3JpcHRvciopbV9Gb250RmFjZXMuRWxlbWVudEF0KGkpOworICAgIGRlbGV0ZSBwRm9udDsKKyAgfQorICBtX0ZvbnRGYWNlcy5SZW1vdmVBbGwoKTsKKyAgaWYgKG1fRlRMaWJyYXJ5KSB7CisgICAgRlhGVF9Eb25lX0ZyZWVUeXBlKG1fRlRMaWJyYXJ5KTsKKyAgfQogfQotRlhfQk9PTCBDRlBGX1NraWFGb250TWdyOjpJbml0RlRMaWJyYXJ5KCkKLXsKLSAgICBpZiAobV9GVExpYnJhcnkgPT0gTlVMTCkgewotICAgICAgICBGWEZUX0luaXRfRnJlZVR5cGUoJm1fRlRMaWJyYXJ5KTsKLSAgICB9Ci0gICAgcmV0dXJuIG1fRlRMaWJyYXJ5ICE9IE5VTEw7CitGWF9CT09MIENGUEZfU2tpYUZvbnRNZ3I6OkluaXRGVExpYnJhcnkoKSB7CisgIGlmICghbV9GVExpYnJhcnkpIHsKKyAgICBGWEZUX0luaXRfRnJlZVR5cGUoJm1fRlRMaWJyYXJ5KTsKKyAgfQorICByZXR1cm4gbV9GVExpYnJhcnkgIT0gTlVMTDsKIH0KLXZvaWQgQ0ZQRl9Ta2lhRm9udE1ncjo6TG9hZFN5c3RlbUZvbnRzKCkKLXsKLSAgICBpZiAobV9iTG9hZGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgU2NhblBhdGgoRlhfQlNUUkMoIi9zeXN0ZW0vZm9udHMiKSk7Ci0gICAgT3V0cHV0U3lzdGVtRm9udHMoKTsKLSAgICBtX2JMb2FkZWQgPSBUUlVFOwordm9pZCBDRlBGX1NraWFGb250TWdyOjpMb2FkU3lzdGVtRm9udHMoKSB7CisgIGlmIChtX2JMb2FkZWQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgU2NhblBhdGgoIi9zeXN0ZW0vZm9udHMiKTsKKyAgT3V0cHV0U3lzdGVtRm9udHMoKTsKKyAgbV9iTG9hZGVkID0gVFJVRTsKIH0KLXZvaWQgQ0ZQRl9Ta2lhRm9udE1ncjo6TG9hZFByaXZhdGVGb250KElGWF9GaWxlUmVhZCogcEZvbnRGaWxlKQotewordm9pZCBDRlBGX1NraWFGb250TWdyOjpMb2FkUHJpdmF0ZUZvbnQoSUZYX0ZpbGVSZWFkKiBwRm9udEZpbGUpIHt9Cit2b2lkIENGUEZfU2tpYUZvbnRNZ3I6OkxvYWRQcml2YXRlRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmlsZU5hbWUpIHt9Cit2b2lkIENGUEZfU2tpYUZvbnRNZ3I6OkxvYWRQcml2YXRlRm9udCh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpIHt9CitJRlBGX0ZvbnQqIENGUEZfU2tpYUZvbnRNZ3I6OkNyZWF0ZUZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZhbWlseW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB1Q2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TWF0Y2gpIHsKKyAgRlhfRFdPUkQgZHdIYXNoID0gRlBGX1NLSUFHZXRGYW1pbHlIYXNoKGJzRmFtaWx5bmFtZSwgZHdTdHlsZSwgdUNoYXJzZXQpOworICBJRlBGX0ZvbnQqIHBGb250ID0gTlVMTDsKKyAgaWYgKG1fRmFtaWx5Rm9udHMuTG9va3VwKCh2b2lkKikodWludHB0cl90KWR3SGFzaCwgKHZvaWQqJilwRm9udCkpIHsKKyAgICBpZiAocEZvbnQpIHsKKyAgICAgIHJldHVybiBwRm9udC0+UmV0YWluKCk7CisgICAgfQorICB9CisgIEZYX0RXT1JEIGR3RmFjZU5hbWUgPSBGUEZfU0tJQU5vcm1hbGl6ZUZvbnROYW1lKGJzRmFtaWx5bmFtZSk7CisgIEZYX0RXT1JEIGR3U3Vic3QgPSBGUEZfU2tpYUdldFN1YnN0Rm9udChkd0ZhY2VOYW1lKTsKKyAgRlhfRFdPUkQgZHdTdWJzdFNhbnMgPSBGUEZfU2tpYUdldFNhbnNGb250KGR3RmFjZU5hbWUpOworICBGWF9CT09MIGJNYXliZVN5bWJvbCA9IEZQRl9Ta2lhTWF5YmVTeW1ib2woYnNGYW1pbHluYW1lKTsKKyAgaWYgKHVDaGFyc2V0ICE9IEZYRk9OVF9BUkFCSUNfQ0hBUlNFVCAmJiBGUEZfU2tpYU1heWJlQXJhYmljKGJzRmFtaWx5bmFtZSkpIHsKKyAgICB1Q2hhcnNldCA9IEZYRk9OVF9BUkFCSUNfQ0hBUlNFVDsKKyAgfSBlbHNlIGlmICh1Q2hhcnNldCA9PSBGWEZPTlRfQU5TSV9DSEFSU0VUICYmCisgICAgICAgICAgICAgKGR3TWF0Y2ggJiBGUEZfTUFUQ0hGT05UX1JFUExBQ0VBTlNJKSkgeworICAgIHVDaGFyc2V0ID0gRlhGT05UX0RFRkFVTFRfQ0hBUlNFVDsKKyAgfQorICBpbnQzMl90IG5FeHBlY3RWYWwgPSBGUEZfU0tJQU1BVENIV0VJR0hUX05BTUUxICsgRlBGX1NLSUFNQVRDSFdFSUdIVF8xICogMyArCisgICAgICAgICAgICAgICAgICAgICAgIEZQRl9TS0lBTUFUQ0hXRUlHSFRfMiAqIDI7CisgIGludDMyX3Qgbkl0ZW0gPSAtMTsKKyAgaW50MzJfdCBuTWF4ID0gLTE7CisgIGludDMyX3QgbkdseXBoTnVtID0gMDsKKyAgZm9yIChpbnQzMl90IGkgPSBtX0ZvbnRGYWNlcy5HZXRVcHBlckJvdW5kKCk7IGkgPj0gMDsgaS0tKSB7CisgICAgQ0ZQRl9Ta2lhUGF0aEZvbnQqIHBGb250RGVzID0gKENGUEZfU2tpYVBhdGhGb250KiltX0ZvbnRGYWNlcy5FbGVtZW50QXQoaSk7CisgICAgaWYgKCEocEZvbnREZXMtPm1fZHdDaGFyc2V0cyAmIEZQRl9Ta2lhR2V0Q2hhcnNldCh1Q2hhcnNldCkpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50MzJfdCBuRmluZCA9IDA7CisgICAgRlhfRFdPUkQgZHdTeXNGb250TmFtZSA9IEZQRl9TS0lBTm9ybWFsaXplRm9udE5hbWUocEZvbnREZXMtPm1fcEZhbWlseSk7CisgICAgaWYgKGR3RmFjZU5hbWUgPT0gZHdTeXNGb250TmFtZSkgeworICAgICAgbkZpbmQgKz0gRlBGX1NLSUFNQVRDSFdFSUdIVF9OQU1FMTsKKyAgICB9CisgICAgRlhfQk9PTCBiTWF0Y2hlZE5hbWUgPSAobkZpbmQgPT0gRlBGX1NLSUFNQVRDSFdFSUdIVF9OQU1FMSk7CisgICAgaWYgKChkd1N0eWxlICYgRlhGT05UX0JPTEQpID09IChwRm9udERlcy0+bV9kd1N0eWxlICYgRlhGT05UX0JPTEQpKSB7CisgICAgICBuRmluZCArPSBGUEZfU0tJQU1BVENIV0VJR0hUXzE7CisgICAgfQorICAgIGlmICgoZHdTdHlsZSAmIEZYRk9OVF9JVEFMSUMpID09IChwRm9udERlcy0+bV9kd1N0eWxlICYgRlhGT05UX0lUQUxJQykpIHsKKyAgICAgIG5GaW5kICs9IEZQRl9TS0lBTUFUQ0hXRUlHSFRfMTsKKyAgICB9CisgICAgaWYgKChkd1N0eWxlICYgRlhGT05UX0ZJWEVEX1BJVENIKSA9PQorICAgICAgICAocEZvbnREZXMtPm1fZHdTdHlsZSAmIEZYRk9OVF9GSVhFRF9QSVRDSCkpIHsKKyAgICAgIG5GaW5kICs9IEZQRl9TS0lBTUFUQ0hXRUlHSFRfMjsKKyAgICB9CisgICAgaWYgKChkd1N0eWxlICYgRlhGT05UX1NFUklGKSA9PSAocEZvbnREZXMtPm1fZHdTdHlsZSAmIEZYRk9OVF9TRVJJRikpIHsKKyAgICAgIG5GaW5kICs9IEZQRl9TS0lBTUFUQ0hXRUlHSFRfMTsKKyAgICB9CisgICAgaWYgKChkd1N0eWxlICYgRlhGT05UX1NDUklQVCkgPT0gKHBGb250RGVzLT5tX2R3U3R5bGUgJiBGWEZPTlRfU0NSSVBUKSkgeworICAgICAgbkZpbmQgKz0gRlBGX1NLSUFNQVRDSFdFSUdIVF8yOworICAgIH0KKyAgICBpZiAoZHdTdWJzdCA9PSBkd1N5c0ZvbnROYW1lIHx8IGR3U3Vic3RTYW5zID09IGR3U3lzRm9udE5hbWUpIHsKKyAgICAgIG5GaW5kICs9IEZQRl9TS0lBTUFUQ0hXRUlHSFRfTkFNRTI7CisgICAgICBiTWF0Y2hlZE5hbWUgPSBUUlVFOworICAgIH0KKyAgICBpZiAodUNoYXJzZXQgPT0gRlhGT05UX0RFRkFVTFRfQ0hBUlNFVCB8fCBiTWF5YmVTeW1ib2wpIHsKKyAgICAgIGlmIChuRmluZCA+IG5NYXggJiYgYk1hdGNoZWROYW1lKSB7CisgICAgICAgIG5NYXggPSBuRmluZDsKKyAgICAgICAgbkl0ZW0gPSBpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoRlBGX1NraWFJc0NKSyh1Q2hhcnNldCkpIHsKKyAgICAgIGlmIChiTWF0Y2hlZE5hbWUgfHwgcEZvbnREZXMtPm1faUdseXBoTnVtID4gbkdseXBoTnVtKSB7CisgICAgICAgIG5JdGVtID0gaTsKKyAgICAgICAgbkdseXBoTnVtID0gcEZvbnREZXMtPm1faUdseXBoTnVtOworICAgICAgfQorICAgIH0gZWxzZSBpZiAobkZpbmQgPiBuTWF4KSB7CisgICAgICBuTWF4ID0gbkZpbmQ7CisgICAgICBuSXRlbSA9IGk7CisgICAgfQorICAgIGlmIChuRXhwZWN0VmFsIDw9IG5GaW5kKSB7CisgICAgICBuSXRlbSA9IGk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKG5JdGVtID4gLTEpIHsKKyAgICBDRlBGX1NraWFGb250RGVzY3JpcHRvciogcEZvbnREZXMgPQorICAgICAgICAoQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IqKW1fRm9udEZhY2VzLkVsZW1lbnRBdChuSXRlbSk7CisgICAgQ0ZQRl9Ta2lhRm9udCogcEZvbnQgPSBuZXcgQ0ZQRl9Ta2lhRm9udDsKKyAgICBpZiAocEZvbnQtPkluaXRGb250KHRoaXMsIHBGb250RGVzLCBic0ZhbWlseW5hbWUsIGR3U3R5bGUsIHVDaGFyc2V0KSkgeworICAgICAgbV9GYW1pbHlGb250cy5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKilwRm9udCk7CisgICAgICByZXR1cm4gcEZvbnQtPlJldGFpbigpOworICAgIH0KKyAgICBwRm9udC0+UmVsZWFzZSgpOworICB9CisgIHJldHVybiBOVUxMOwogfQotdm9pZCBDRlBGX1NraWFGb250TWdyOjpMb2FkUHJpdmF0ZUZvbnQoRlhfQlNUUiBic0ZpbGVOYW1lKQotewotfQotdm9pZCBDRlBGX1NraWFGb250TWdyOjpMb2FkUHJpdmF0ZUZvbnQoRlhfTFBWT0lEIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikKLXsKLX0KLUlGUEZfRm9udCogQ0ZQRl9Ta2lhRm9udE1ncjo6Q3JlYXRlRm9udChGWF9CU1RSIGJzRmFtaWx5bmFtZSwgRlhfQllURSB1Q2hhcnNldCwgRlhfRFdPUkQgZHdTdHlsZSwgRlhfRFdPUkQgZHdNYXRjaCkKLXsKLSAgICBGWF9EV09SRCBkd0hhc2ggPSBGUEZfU0tJQUdldEZhbWlseUhhc2goYnNGYW1pbHluYW1lLCBkd1N0eWxlLCB1Q2hhcnNldCk7Ci0gICAgSUZQRl9Gb250ICpwRm9udCA9IE5VTEw7Ci0gICAgaWYgKG1fRmFtaWx5Rm9udHMuTG9va3VwKCh2b2lkKikoRlhfVUlOVFBUUilkd0hhc2gsICh2b2lkKiYpcEZvbnQpKSB7Ci0gICAgICAgIGlmIChwRm9udCkgewotICAgICAgICAgICAgcmV0dXJuIHBGb250LT5SZXRhaW4oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBGWF9EV09SRCBkd0ZhY2VOYW1lID0gRlBGX1NLSUFOb3JtYWxpemVGb250TmFtZShic0ZhbWlseW5hbWUpOwotICAgIEZYX0RXT1JEIGR3U3Vic3QgPSBGUEZfU2tpYUdldFN1YnN0Rm9udChkd0ZhY2VOYW1lKTsKLSAgICBGWF9EV09SRCBkd1N1YnN0U2FucyA9IEZQRl9Ta2lhR2V0U2Fuc0ZvbnQoZHdGYWNlTmFtZSk7Ci0gICAgRlhfQk9PTCBiTWF5YmVTeW1ib2wgPSBGUEZfU2tpYU1heWJlU3ltYm9sKGJzRmFtaWx5bmFtZSk7Ci0gICAgaWYgKHVDaGFyc2V0ICE9IEZYRk9OVF9BUkFCSUNfQ0hBUlNFVCAmJiBGUEZfU2tpYU1heWJlQXJhYmljKGJzRmFtaWx5bmFtZSkpIHsKLSAgICAgICAgdUNoYXJzZXQgPSBGWEZPTlRfQVJBQklDX0NIQVJTRVQ7Ci0gICAgfSBlbHNlIGlmICh1Q2hhcnNldCA9PSBGWEZPTlRfQU5TSV9DSEFSU0VUICYmIChkd01hdGNoICYgRlBGX01BVENIRk9OVF9SRVBMQUNFQU5TSSkpIHsKLSAgICAgICAgdUNoYXJzZXQgPSBGWEZPTlRfREVGQVVMVF9DSEFSU0VUOwotICAgIH0KLSAgICBGWF9JTlQzMiBuRXhwZWN0VmFsID0gRlBGX1NLSUFNQVRDSFdFSUdIVF9OQU1FMSArIEZQRl9TS0lBTUFUQ0hXRUlHSFRfMSAqIDMgKyBGUEZfU0tJQU1BVENIV0VJR0hUXzIgKiAyOwotICAgIEZYX0lOVDMyIG5JdGVtID0gLTE7Ci0gICAgRlhfSU5UMzIgbk1heCA9IC0xOwotICAgIEZYX0lOVDMyIG5HbHlwaE51bSA9IDA7Ci0gICAgZm9yIChGWF9JTlQzMiBpID0gbV9Gb250RmFjZXMuR2V0VXBwZXJCb3VuZCgpOyBpID49IDA7IGktLSkgewotICAgICAgICBDRlBGX1NraWFQYXRoRm9udCAqcEZvbnREZXMgPSAoQ0ZQRl9Ta2lhUGF0aEZvbnQqKW1fRm9udEZhY2VzLkVsZW1lbnRBdChpKTsKLSAgICAgICAgaWYoIShwRm9udERlcy0+bV9kd0NoYXJzZXRzICYgRlBGX1NraWFHZXRDaGFyc2V0KHVDaGFyc2V0KSkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEZYX0lOVDMyIG5GaW5kID0gMDsKLSAgICAgICAgRlhfRFdPUkQgZHdTeXNGb250TmFtZSA9IEZQRl9TS0lBTm9ybWFsaXplRm9udE5hbWUocEZvbnREZXMtPm1fcEZhbWlseSk7Ci0gICAgICAgIGlmIChkd0ZhY2VOYW1lID09IGR3U3lzRm9udE5hbWUpIHsKLSAgICAgICAgICAgIG5GaW5kICs9IEZQRl9TS0lBTUFUQ0hXRUlHSFRfTkFNRTE7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfQk9PTCBiTWF0Y2hlZE5hbWUgPSAobkZpbmQgPT0gRlBGX1NLSUFNQVRDSFdFSUdIVF9OQU1FMSk7Ci0gICAgICAgIGlmICgoZHdTdHlsZSAmIEZYRk9OVF9CT0xEKSA9PSAocEZvbnREZXMtPm1fZHdTdHlsZSAmIEZYRk9OVF9CT0xEKSkgewotICAgICAgICAgICAgbkZpbmQgKz0gRlBGX1NLSUFNQVRDSFdFSUdIVF8xOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoZHdTdHlsZSAmIEZYRk9OVF9JVEFMSUMpID09IChwRm9udERlcy0+bV9kd1N0eWxlICYgRlhGT05UX0lUQUxJQykpIHsKLSAgICAgICAgICAgIG5GaW5kICs9IEZQRl9TS0lBTUFUQ0hXRUlHSFRfMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGR3U3R5bGUgJiBGWEZPTlRfRklYRURfUElUQ0gpID09IChwRm9udERlcy0+bV9kd1N0eWxlICYgRlhGT05UX0ZJWEVEX1BJVENIKSkgewotICAgICAgICAgICAgbkZpbmQgKz0gRlBGX1NLSUFNQVRDSFdFSUdIVF8yOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoZHdTdHlsZSAmIEZYRk9OVF9TRVJJRikgPT0gKHBGb250RGVzLT5tX2R3U3R5bGUgJiBGWEZPTlRfU0VSSUYpKSB7Ci0gICAgICAgICAgICBuRmluZCArPSBGUEZfU0tJQU1BVENIV0VJR0hUXzE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChkd1N0eWxlICYgRlhGT05UX1NDUklQVCkgPT0gKHBGb250RGVzLT5tX2R3U3R5bGUgJiBGWEZPTlRfU0NSSVBUKSkgewotICAgICAgICAgICAgbkZpbmQgKz0gRlBGX1NLSUFNQVRDSFdFSUdIVF8yOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkd1N1YnN0ID09IGR3U3lzRm9udE5hbWUgfHwgZHdTdWJzdFNhbnMgPT0gZHdTeXNGb250TmFtZSkgewotICAgICAgICAgICAgbkZpbmQgKz0gRlBGX1NLSUFNQVRDSFdFSUdIVF9OQU1FMjsKLSAgICAgICAgICAgIGJNYXRjaGVkTmFtZSA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVDaGFyc2V0ID09IEZYRk9OVF9ERUZBVUxUX0NIQVJTRVQgfHwgYk1heWJlU3ltYm9sKSB7Ci0gICAgICAgICAgICBpZiAobkZpbmQgPiBuTWF4ICYmIGJNYXRjaGVkTmFtZSkgewotICAgICAgICAgICAgICAgIG5NYXggPSBuRmluZDsKLSAgICAgICAgICAgICAgICBuSXRlbSA9IGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoRlBGX1NraWFJc0NKSyh1Q2hhcnNldCkpIHsKLSAgICAgICAgICAgIGlmIChiTWF0Y2hlZE5hbWUgfHwgcEZvbnREZXMtPm1faUdseXBoTnVtID4gbkdseXBoTnVtKSB7Ci0gICAgICAgICAgICAgICAgbkl0ZW0gPSBpOwotICAgICAgICAgICAgICAgIG5HbHlwaE51bSA9IHBGb250RGVzLT5tX2lHbHlwaE51bTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChuRmluZCA+IG5NYXgpIHsKLSAgICAgICAgICAgIG5NYXggPSBuRmluZDsKLSAgICAgICAgICAgIG5JdGVtID0gaTsKLSAgICAgICAgfQotICAgICAgICBpZiAobkV4cGVjdFZhbCA8PSBuRmluZCkgewotICAgICAgICAgICAgbkl0ZW0gPSBpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG5JdGVtID4gLTEpIHsKLSAgICAgICAgQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IgKnBGb250RGVzID0gKENGUEZfU2tpYUZvbnREZXNjcmlwdG9yKiltX0ZvbnRGYWNlcy5FbGVtZW50QXQobkl0ZW0pOwotICAgICAgICBDRlBGX1NraWFGb250ICpwRm9udCA9IG5ldyBDRlBGX1NraWFGb250OwotICAgICAgICBpZiAocEZvbnQtPkluaXRGb250KHRoaXMsIHBGb250RGVzLCBic0ZhbWlseW5hbWUsIGR3U3R5bGUsIHVDaGFyc2V0KSkgewotICAgICAgICAgICAgbV9GYW1pbHlGb250cy5TZXRBdCgodm9pZCopKEZYX1VJTlRQVFIpZHdIYXNoLCAodm9pZCopcEZvbnQpOwotICAgICAgICAgICAgcmV0dXJuIHBGb250LT5SZXRhaW4oKTsKLSAgICAgICAgfQotICAgICAgICBwRm9udC0+UmVsZWFzZSgpOwotICAgIH0KK0ZYRlRfRmFjZSBDRlBGX1NraWFGb250TWdyOjpHZXRGb250RmFjZShJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlGYWNlSW5kZXgpIHsKKyAgaWYgKCFwRmlsZVJlYWQpIHsKICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAocEZpbGVSZWFkLT5HZXRTaXplKCkgPT0gMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChpRmFjZUluZGV4IDwgMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEZYRlRfU3RyZWFtUmVjIHN0cmVhbVJlYzsKKyAgRlhTWVNfbWVtc2V0KCZzdHJlYW1SZWMsIDAsIHNpemVvZihGWEZUX1N0cmVhbVJlYykpOworICBzdHJlYW1SZWMuc2l6ZSA9IHBGaWxlUmVhZC0+R2V0U2l6ZSgpOworICBzdHJlYW1SZWMuZGVzY3JpcHRvci5wb2ludGVyID0gcEZpbGVSZWFkOworICBzdHJlYW1SZWMucmVhZCA9IEZQRl9Ta2lhU3RyZWFtX1JlYWQ7CisgIHN0cmVhbVJlYy5jbG9zZSA9IEZQRl9Ta2lhU3RyZWFtX0Nsb3NlOworICBGWEZUX09wZW5fQXJncyBhcmdzOworICBhcmdzLmZsYWdzID0gRlRfT1BFTl9TVFJFQU07CisgIGFyZ3Muc3RyZWFtID0gJnN0cmVhbVJlYzsKKyAgRlhGVF9GYWNlIGZhY2U7CisgIGlmIChGWEZUX09wZW5fRmFjZShtX0ZUTGlicmFyeSwgJmFyZ3MsIGlGYWNlSW5kZXgsICZmYWNlKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEZYRlRfU2V0X1BpeGVsX1NpemVzKGZhY2UsIDAsIDY0KTsKKyAgcmV0dXJuIGZhY2U7CiB9Ci1GWEZUX0ZhY2UgQ0ZQRl9Ta2lhRm9udE1ncjo6R2V0Rm9udEZhY2UoSUZYX0ZpbGVSZWFkICpwRmlsZVJlYWQsIEZYX0lOVDMyIGlGYWNlSW5kZXgpCi17Ci0gICAgaWYgKCFwRmlsZVJlYWQpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChwRmlsZVJlYWQtPkdldFNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoaUZhY2VJbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYRlRfU3RyZWFtUmVjIHN0cmVhbVJlYzsKLSAgICBGWFNZU19tZW1zZXQzMigmc3RyZWFtUmVjLCAwLCBzaXplb2YoRlhGVF9TdHJlYW1SZWMpKTsKLSAgICBzdHJlYW1SZWMuc2l6ZSA9IHBGaWxlUmVhZC0+R2V0U2l6ZSgpOwotICAgIHN0cmVhbVJlYy5kZXNjcmlwdG9yLnBvaW50ZXIgPSBwRmlsZVJlYWQ7Ci0gICAgc3RyZWFtUmVjLnJlYWQgPSBGUEZfU2tpYVN0cmVhbV9SZWFkOwotICAgIHN0cmVhbVJlYy5jbG9zZSA9IEZQRl9Ta2lhU3RyZWFtX0Nsb3NlOwotICAgIEZYRlRfT3Blbl9BcmdzIGFyZ3M7Ci0gICAgYXJncy5mbGFncyA9IEZUX09QRU5fU1RSRUFNOwotICAgIGFyZ3Muc3RyZWFtID0gJnN0cmVhbVJlYzsKLSAgICBGWEZUX0ZhY2UgZmFjZTsKLSAgICBpZiAoRlhGVF9PcGVuX0ZhY2UobV9GVExpYnJhcnksICZhcmdzLCBpRmFjZUluZGV4LCAmZmFjZSkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYRlRfU2V0X1BpeGVsX1NpemVzKGZhY2UsIDAsIDY0KTsKLSAgICByZXR1cm4gZmFjZTsKK0ZYRlRfRmFjZSBDRlBGX1NraWFGb250TWdyOjpHZXRGb250RmFjZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlGYWNlSW5kZXgpIHsKKyAgaWYgKGJzRmlsZS5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoaUZhY2VJbmRleCA8IDApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBGWEZUX09wZW5fQXJncyBhcmdzOworICBhcmdzLmZsYWdzID0gRlRfT1BFTl9QQVRITkFNRTsKKyAgYXJncy5wYXRobmFtZSA9IChGVF9TdHJpbmcqKWJzRmlsZS5HZXRDU3RyKCk7CisgIEZYRlRfRmFjZSBmYWNlOworICBpZiAoRlhGVF9PcGVuX0ZhY2UobV9GVExpYnJhcnksICZhcmdzLCBpRmFjZUluZGV4LCAmZmFjZSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhGVF9TZXRfUGl4ZWxfU2l6ZXMoZmFjZSwgMCwgNjQpOworICByZXR1cm4gZmFjZTsKIH0KLUZYRlRfRmFjZSBDRlBGX1NraWFGb250TWdyOjpHZXRGb250RmFjZShGWF9CU1RSIGJzRmlsZSwgRlhfSU5UMzIgaUZhY2VJbmRleCApCi17Ci0gICAgaWYgKGJzRmlsZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChpRmFjZUluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgRlhGVF9PcGVuX0FyZ3MgYXJnczsKLSAgICBhcmdzLmZsYWdzID0gRlRfT1BFTl9QQVRITkFNRTsKLSAgICBhcmdzLnBhdGhuYW1lID0gKEZUX1N0cmluZyopYnNGaWxlLkdldENTdHIoKTsKLSAgICBGWEZUX0ZhY2UgZmFjZTsKLSAgICBpZiAoRlhGVF9PcGVuX0ZhY2UobV9GVExpYnJhcnksICZhcmdzLCBpRmFjZUluZGV4LCAmZmFjZSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWEZUX1NldF9QaXhlbF9TaXplcyhmYWNlLCAwLCA2NCk7Ci0gICAgcmV0dXJuIGZhY2U7CitGWEZUX0ZhY2UgQ0ZQRl9Ta2lhRm9udE1ncjo6R2V0Rm9udEZhY2UoY29uc3QgdWludDhfdCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3pCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRmFjZUluZGV4KSB7CisgIGlmICghcEJ1ZmZlciB8fCBzekJ1ZmZlciA8IDEpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoaUZhY2VJbmRleCA8IDApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBGWEZUX09wZW5fQXJncyBhcmdzOworICBhcmdzLmZsYWdzID0gRlRfT1BFTl9NRU1PUlk7CisgIGFyZ3MubWVtb3J5X2Jhc2UgPSBwQnVmZmVyOworICBhcmdzLm1lbW9yeV9zaXplID0gc3pCdWZmZXI7CisgIEZYRlRfRmFjZSBmYWNlOworICBpZiAoRlhGVF9PcGVuX0ZhY2UobV9GVExpYnJhcnksICZhcmdzLCBpRmFjZUluZGV4LCAmZmFjZSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhGVF9TZXRfUGl4ZWxfU2l6ZXMoZmFjZSwgMCwgNjQpOworICByZXR1cm4gZmFjZTsKIH0KLUZYRlRfRmFjZSBDRlBGX1NraWFGb250TWdyOjpHZXRGb250RmFjZShGWF9MUENCWVRFIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfSU5UMzIgaUZhY2VJbmRleCApCi17Ci0gICAgaWYgKCFwQnVmZmVyIHx8IHN6QnVmZmVyIDwgMSkgewotICAgICAgICByZXR1cm4gTlVMTDsKK3ZvaWQgQ0ZQRl9Ta2lhRm9udE1ncjo6U2NhblBhdGgoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBwYXRoKSB7CisgIHZvaWQqIGhhbmRsZSA9IEZYX09wZW5Gb2xkZXIocGF0aC5HZXRDU3RyKCkpOworICBpZiAoIWhhbmRsZSkgeworICAgIHJldHVybjsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBmaWxlbmFtZTsKKyAgRlhfQk9PTCBiRm9sZGVyID0gRkFMU0U7CisgIHdoaWxlIChGWF9HZXROZXh0RmlsZShoYW5kbGUsIGZpbGVuYW1lLCBiRm9sZGVyKSkgeworICAgIGlmIChiRm9sZGVyKSB7CisgICAgICBpZiAoZmlsZW5hbWUgPT0gIi4iIHx8IGZpbGVuYW1lID09ICIuLiIpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIENGWF9CeXRlU3RyaW5nIGV4dCA9IGZpbGVuYW1lLlJpZ2h0KDQpOworICAgICAgZXh0Lk1ha2VMb3dlcigpOworICAgICAgaWYgKGV4dCAhPSAiLnR0ZiIgJiYgZXh0ICE9ICIudHRjIiAmJiBleHQgIT0gIi5vdGYiKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQogICAgIH0KLSAgICBpZiAoaUZhY2VJbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZYX0J5dGVTdHJpbmcgZnVsbHBhdGggPSBwYXRoOworICAgIGZ1bGxwYXRoICs9ICIvIjsKKyAgICBmdWxscGF0aCArPSBmaWxlbmFtZTsKKyAgICBpZiAoYkZvbGRlcikgeworICAgICAgU2NhblBhdGgoZnVsbHBhdGgpOworICAgIH0gZWxzZSB7CisgICAgICBTY2FuRmlsZShmdWxscGF0aCk7CiAgICAgfQotICAgIEZYRlRfT3Blbl9BcmdzIGFyZ3M7Ci0gICAgYXJncy5mbGFncyA9IEZUX09QRU5fTUVNT1JZOwotICAgIGFyZ3MubWVtb3J5X2Jhc2UgPSBwQnVmZmVyOwotICAgIGFyZ3MubWVtb3J5X3NpemUgPSBzekJ1ZmZlcjsKLSAgICBGWEZUX0ZhY2UgZmFjZTsKLSAgICBpZiAoRlhGVF9PcGVuX0ZhY2UobV9GVExpYnJhcnksICZhcmdzLCBpRmFjZUluZGV4LCAmZmFjZSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWEZUX1NldF9QaXhlbF9TaXplcyhmYWNlLCAwLCA2NCk7Ci0gICAgcmV0dXJuIGZhY2U7CisgIH0KKyAgRlhfQ2xvc2VGb2xkZXIoaGFuZGxlKTsKIH0KLXZvaWQgQ0ZQRl9Ta2lhRm9udE1ncjo6U2NhblBhdGgoRlhfQlNUUiBwYXRoKQotewotICAgIHZvaWQgKmhhbmRsZSA9IEZYX09wZW5Gb2xkZXIocGF0aC5HZXRDU3RyKCkpOwotICAgIGlmICghaGFuZGxlKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgZmlsZW5hbWU7Ci0gICAgRlhfQk9PTAliRm9sZGVyID0gRkFMU0U7Ci0gICAgd2hpbGUgKEZYX0dldE5leHRGaWxlKGhhbmRsZSwgZmlsZW5hbWUsIGJGb2xkZXIpKSB7Ci0gICAgICAgIGlmIChiRm9sZGVyKSB7Ci0gICAgICAgICAgICBpZiAoZmlsZW5hbWUgPT0gRlhfQlNUUkMoIi4iKSB8fCBmaWxlbmFtZSA9PSBGWF9CU1RSQygiLi4iKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZXh0ID0gZmlsZW5hbWUuUmlnaHQoNCk7Ci0gICAgICAgICAgICBleHQuTWFrZUxvd2VyKCk7Ci0gICAgICAgICAgICBpZiAoZXh0ICE9IEZYX0JTVFJDKCIudHRmIikgJiYgZXh0ICE9IEZYX0JTVFJDKCIudHRjIikpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBmdWxscGF0aCA9IHBhdGg7Ci0gICAgICAgIGZ1bGxwYXRoICs9ICIvIjsKLSAgICAgICAgZnVsbHBhdGggKz0gZmlsZW5hbWU7Ci0gICAgICAgIGlmIChiRm9sZGVyKSB7Ci0gICAgICAgICAgICBTY2FuUGF0aChmdWxscGF0aCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTY2FuRmlsZShmdWxscGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlhfQ2xvc2VGb2xkZXIoaGFuZGxlKTsKK3ZvaWQgQ0ZQRl9Ta2lhRm9udE1ncjo6U2NhbkZpbGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlKSB7CisgIEZYRlRfRmFjZSBmYWNlID0gR2V0Rm9udEZhY2UoZmlsZSk7CisgIGlmIChmYWNlKSB7CisgICAgQ0ZQRl9Ta2lhUGF0aEZvbnQqIHBGb250RGVzYyA9IG5ldyBDRlBGX1NraWFQYXRoRm9udDsKKyAgICBwRm9udERlc2MtPlNldFBhdGgoZmlsZS5HZXRDU3RyKCkpOworICAgIFJlcG9ydEZhY2UoZmFjZSwgcEZvbnREZXNjKTsKKyAgICBtX0ZvbnRGYWNlcy5BZGQocEZvbnREZXNjKTsKKyAgICBGWEZUX0RvbmVfRmFjZShmYWNlKTsKKyAgfQogfQotdm9pZCBDRlBGX1NraWFGb250TWdyOjpTY2FuRmlsZShGWF9CU1RSIGZpbGUpCi17Ci0gICAgRlhGVF9GYWNlIGZhY2UgPSBHZXRGb250RmFjZShmaWxlKTsKLSAgICBpZiAoZmFjZSkgewotICAgICAgICBDRlBGX1NraWFQYXRoRm9udCAqcEZvbnREZXNjID0gbmV3IENGUEZfU2tpYVBhdGhGb250OwotICAgICAgICBwRm9udERlc2MtPlNldFBhdGgoZmlsZS5HZXRDU3RyKCkpOwotICAgICAgICBSZXBvcnRGYWNlKGZhY2UsIHBGb250RGVzYyk7Ci0gICAgICAgIG1fRm9udEZhY2VzLkFkZChwRm9udERlc2MpOwotICAgICAgICBGWEZUX0RvbmVfRmFjZShmYWNlKTsKLSAgICB9Ci19Ci1zdGF0aWMgY29uc3QgRlhfRFdPUkQgZ19GUEZTa2lhRm9udENoYXJzZXRzIFtdID0geworc3RhdGljIGNvbnN0IEZYX0RXT1JEIGdfRlBGU2tpYUZvbnRDaGFyc2V0c1tdID0gewogICAgIEZQRl9TS0lBQ0hBUlNFVF9BbnNpLAogICAgIEZQRl9TS0lBQ0hBUlNFVF9FZWFzdGVybkV1cm9wZWFuLAogICAgIEZQRl9TS0lBQ0hBUlNFVF9DeXJpbGxpYywKQEAgLTUwMSw1NCArNDgxLDUxIEBACiAgICAgRlBGX1NLSUFDSEFSU0VUX09FTSwKICAgICBGUEZfU0tJQUNIQVJTRVRfU3ltYm9sLAogfTsKLXN0YXRpYyBGWF9EV09SRCBGUEZfU2tpYUdldEZhY2VDaGFyc2V0KFRUX09TMiAqcE9TMikKLXsKLSAgICBGWF9EV09SRCBkd0NoYXJzZXQgPSAwOwotICAgIGlmIChwT1MyKSB7Ci0gICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCAzMjsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocE9TMi0+dWxDb2RlUGFnZVJhbmdlMSAmICgxIDw8IGkpKSB7Ci0gICAgICAgICAgICAgICAgZHdDaGFyc2V0IHw9IGdfRlBGU2tpYUZvbnRDaGFyc2V0c1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorc3RhdGljIEZYX0RXT1JEIEZQRl9Ta2lhR2V0RmFjZUNoYXJzZXQoVFRfT1MyKiBwT1MyKSB7CisgIEZYX0RXT1JEIGR3Q2hhcnNldCA9IDA7CisgIGlmIChwT1MyKSB7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMzI7IGkrKykgeworICAgICAgaWYgKHBPUzItPnVsQ29kZVBhZ2VSYW5nZTEgJiAoMSA8PCBpKSkgeworICAgICAgICBkd0NoYXJzZXQgfD0gZ19GUEZTa2lhRm9udENoYXJzZXRzW2ldOworICAgICAgfQogICAgIH0KLSAgICBkd0NoYXJzZXQgfD0gRlBGX1NLSUFDSEFSU0VUX0RlZmF1bHQ7Ci0gICAgcmV0dXJuIGR3Q2hhcnNldDsKKyAgfQorICBkd0NoYXJzZXQgfD0gRlBGX1NLSUFDSEFSU0VUX0RlZmF1bHQ7CisgIHJldHVybiBkd0NoYXJzZXQ7CiB9Ci12b2lkIENGUEZfU2tpYUZvbnRNZ3I6OlJlcG9ydEZhY2UoRlhGVF9GYWNlIGZhY2UsIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yICpwRm9udERlc2MpCi17Ci0gICAgaWYgKCFmYWNlIHx8ICFwRm9udERlc2MpIHsKLSAgICAgICAgcmV0dXJuOwordm9pZCBDRlBGX1NraWFGb250TWdyOjpSZXBvcnRGYWNlKEZYRlRfRmFjZSBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yKiBwRm9udERlc2MpIHsKKyAgaWYgKCFmYWNlIHx8ICFwRm9udERlc2MpIHsKKyAgICByZXR1cm47CisgIH0KKyAgcEZvbnREZXNjLT5TZXRGYW1pbHkoRlhGVF9HZXRfRmFjZV9GYW1pbHlfTmFtZShmYWNlKSk7CisgIGlmIChGWEZUX0lzX0ZhY2VfQm9sZChmYWNlKSkgeworICAgIHBGb250RGVzYy0+bV9kd1N0eWxlIHw9IEZYRk9OVF9CT0xEOworICB9CisgIGlmIChGWEZUX0lzX0ZhY2VfSXRhbGljKGZhY2UpKSB7CisgICAgcEZvbnREZXNjLT5tX2R3U3R5bGUgfD0gRlhGT05UX0lUQUxJQzsKKyAgfQorICBpZiAoRlRfSVNfRklYRURfV0lEVEgoZmFjZSkpIHsKKyAgICBwRm9udERlc2MtPm1fZHdTdHlsZSB8PSBGWEZPTlRfRklYRURfUElUQ0g7CisgIH0KKyAgVFRfT1MyKiBwT1MyID0gKFRUX09TMiopRlRfR2V0X1NmbnRfVGFibGUoZmFjZSwgZnRfc2ZudF9vczIpOworICBpZiAocE9TMikgeworICAgIGlmIChwT1MyLT51bENvZGVQYWdlUmFuZ2UxICYgKDEgPDwgMzEpKSB7CisgICAgICBwRm9udERlc2MtPm1fZHdTdHlsZSB8PSBGWEZPTlRfU1lNQk9MSUM7CiAgICAgfQotICAgIHBGb250RGVzYy0+U2V0RmFtaWx5KEZYRlRfR2V0X0ZhY2VfRmFtaWx5X05hbWUoZmFjZSkpOwotICAgIGlmIChGWEZUX0lzX0ZhY2VfQm9sZChmYWNlKSkJewotICAgICAgICBwRm9udERlc2MtPm1fZHdTdHlsZSB8PSBGWEZPTlRfQk9MRDsKKyAgICBpZiAocE9TMi0+cGFub3NlWzBdID09IDIpIHsKKyAgICAgIHVpbnQ4X3QgdVNlcmlmID0gcE9TMi0+cGFub3NlWzFdOworICAgICAgaWYgKCh1U2VyaWYgPiAxICYmIHVTZXJpZiA8IDEwKSB8fCB1U2VyaWYgPiAxMykgeworICAgICAgICBwRm9udERlc2MtPm1fZHdTdHlsZSB8PSBGWEZPTlRfU0VSSUY7CisgICAgICB9CiAgICAgfQotICAgIGlmIChGWEZUX0lzX0ZhY2VfSXRhbGljKGZhY2UpKQl7Ci0gICAgICAgIHBGb250RGVzYy0+bV9kd1N0eWxlIHw9IEZYRk9OVF9JVEFMSUM7Ci0gICAgfQotICAgIGlmIChGVF9JU19GSVhFRF9XSURUSChmYWNlKSkJewotICAgICAgICBwRm9udERlc2MtPm1fZHdTdHlsZSB8PSBGWEZPTlRfRklYRURfUElUQ0g7Ci0gICAgfQotICAgIFRUX09TMiAqcE9TMiA9IChUVF9PUzIqKUZUX0dldF9TZm50X1RhYmxlKGZhY2UsIGZ0X3NmbnRfb3MyKTsKLSAgICBpZiAocE9TMikgewotICAgICAgICBpZiAocE9TMi0+dWxDb2RlUGFnZVJhbmdlMSAmICgxIDw8IDMxKSkgewotICAgICAgICAgICAgcEZvbnREZXNjLT5tX2R3U3R5bGUgfD0gRlhGT05UX1NZTUJPTElDOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwT1MyLT5wYW5vc2VbMF0gPT0gMikgewotICAgICAgICAgICAgRlhfQllURSB1U2VyaWYgPSBwT1MyLT5wYW5vc2VbMV07Ci0gICAgICAgICAgICBpZiAoKHVTZXJpZiA+IDEgJiYgdVNlcmlmIDwgMTApIHx8IHVTZXJpZiA+IDEzKSB7Ci0gICAgICAgICAgICAgICAgcEZvbnREZXNjLT5tX2R3U3R5bGUgfD0gRlhGT05UX1NFUklGOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwT1MyICYmIChwT1MyLT51bENvZGVQYWdlUmFuZ2UxICYgKDEgPDwgMzEpKSkgewotICAgICAgICBwRm9udERlc2MtPm1fZHdTdHlsZSB8PSBGWEZPTlRfU1lNQk9MSUM7Ci0gICAgfQotICAgIHBGb250RGVzYy0+bV9kd0NoYXJzZXRzID0gRlBGX1NraWFHZXRGYWNlQ2hhcnNldChwT1MyKTsKLSAgICBwRm9udERlc2MtPm1faUZhY2VJbmRleCA9IGZhY2UtPmZhY2VfaW5kZXg7Ci0gICAgcEZvbnREZXNjLT5tX2lHbHlwaE51bSA9IGZhY2UtPm51bV9nbHlwaHM7CisgIH0KKyAgaWYgKHBPUzIgJiYgKHBPUzItPnVsQ29kZVBhZ2VSYW5nZTEgJiAoMSA8PCAzMSkpKSB7CisgICAgcEZvbnREZXNjLT5tX2R3U3R5bGUgfD0gRlhGT05UX1NZTUJPTElDOworICB9CisgIHBGb250RGVzYy0+bV9kd0NoYXJzZXRzID0gRlBGX1NraWFHZXRGYWNlQ2hhcnNldChwT1MyKTsKKyAgcEZvbnREZXNjLT5tX2lGYWNlSW5kZXggPSBmYWNlLT5mYWNlX2luZGV4OworICBwRm9udERlc2MtPm1faUdseXBoTnVtID0gZmFjZS0+bnVtX2dseXBoczsKIH0KLXZvaWQgQ0ZQRl9Ta2lhRm9udE1ncjo6T3V0cHV0U3lzdGVtRm9udHMoKQotewotfQordm9pZCBDRlBGX1NraWFGb250TWdyOjpPdXRwdXRTeXN0ZW1Gb250cygpIHt9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnRtZ3IuaCBiL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnRtZ3IuaAppbmRleCAzYzA3MmZhLi5jZDUwM2Y1IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFmb250bWdyLmgKKysrIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udG1nci5oCkBAIC0xLDExOSArMSwxMTggQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBDT1JFX1NSQ19GWEdFX0FORFJPSURfRlBGX1NLSUFGT05UTUdSX0hfCiAjZGVmaW5lIENPUkVfU1JDX0ZYR0VfQU5EUk9JRF9GUEZfU0tJQUZPTlRNR1JfSF8KIAogI2lmIF9GWF9PU18gPT0gX0ZYX0FORFJPSURfCi0jZGVmaW5lIEZQRl9TS0lBRk9OVFRZUEVfVW5rbm93bgkwCi0jZGVmaW5lCUZQRl9TS0lBRk9OVFRZUEVfUGF0aAkJMQotI2RlZmluZSBGUEZfU0tJQUZPTlRUWVBFX0ZpbGUJCTIKLSNkZWZpbmUgRlBGX1NLSUFGT05UVFlQRV9CdWZmZXIJCTMKLWNsYXNzIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yIAotewotcHVibGljOgotICAgIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yKCkgOiBtX3BGYW1pbHkoTlVMTCksIG1fZHdTdHlsZSgwKSwgbV9pRmFjZUluZGV4KDApLCBtX2R3Q2hhcnNldHMoMCksIG1faUdseXBoTnVtKDApIHt9Ci0gICAgdmlydHVhbCB+Q0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IoKQotICAgIHsKLSAgICAgICAgaWYgKG1fcEZhbWlseSkgewotICAgICAgICAgICAgRlhfRnJlZShtX3BGYW1pbHkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHZpcnR1YWwJRlhfSU5UMzIJR2V0VHlwZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gRlBGX1NLSUFGT05UVFlQRV9Vbmtub3duOwotICAgIH0KLSAgICB2b2lkCQkJCVNldEZhbWlseShGWF9MUENTVFIgcEZhbWlseSkKLSAgICB7Ci0gICAgICAgIGlmIChtX3BGYW1pbHkpIHsKLSAgICAgICAgICAgIEZYX0ZyZWUobV9wRmFtaWx5KTsKLSAgICAgICAgfQotICAgICAgICBGWF9JTlQzMiBpU2l6ZSA9IEZYU1lTX3N0cmxlbihwRmFtaWx5KTsKLSAgICAgICAgbV9wRmFtaWx5ID0gRlhfQWxsb2MoRlhfQ0hBUiwgaVNpemUgKyAxKTsKLSAgICAgICAgRlhTWVNfbWVtY3B5MzIobV9wRmFtaWx5LCBwRmFtaWx5LCBpU2l6ZSAqIHNpemVvZihGWF9DSEFSKSk7Ci0gICAgICAgIG1fcEZhbWlseVtpU2l6ZV0gPSAwOwotICAgIH0KLSAgICBGWF9MUFNUUgkJbV9wRmFtaWx5OwotICAgIEZYX0RXT1JECQltX2R3U3R5bGU7Ci0gICAgRlhfSU5UMzIJCW1faUZhY2VJbmRleDsKLSAgICBGWF9EV09SRAkJbV9kd0NoYXJzZXRzOwotICAgIEZYX0lOVDMyCQltX2lHbHlwaE51bTsKLX07Ci1jbGFzcyBDRlBGX1NraWFQYXRoRm9udCA6IHB1YmxpYyBDRlBGX1NraWFGb250RGVzY3JpcHRvcgotewotcHVibGljOgotICAgIENGUEZfU2tpYVBhdGhGb250KCkgOiBtX3BQYXRoKE5VTEwpIHt9Ci0gICAgdmlydHVhbCB+Q0ZQRl9Ta2lhUGF0aEZvbnQoKQotICAgIHsKLSAgICAgICAgaWYgKG1fcFBhdGgpIHsKLSAgICAgICAgICAgIEZYX0ZyZWUobV9wUGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdmlydHVhbAlGWF9JTlQzMglHZXRUeXBlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBGUEZfU0tJQUZPTlRUWVBFX1BhdGg7Ci0gICAgfQotICAgIHZvaWQJCQkJU2V0UGF0aChGWF9MUENTVFIgcFBhdGgpCi0gICAgewotICAgICAgICBpZiAobV9wUGF0aCkgewotICAgICAgICAgICAgRlhfRnJlZShtX3BQYXRoKTsKLSAgICAgICAgfQotICAgICAgICBGWF9JTlQzMiBpU2l6ZSA9IEZYU1lTX3N0cmxlbihwUGF0aCk7Ci0gICAgICAgIG1fcFBhdGggPSBGWF9BbGxvYyhGWF9DSEFSLCBpU2l6ZSArIDEpOwotICAgICAgICBGWFNZU19tZW1jcHkzMihtX3BQYXRoLCBwUGF0aCwgaVNpemUgKiBzaXplb2YoRlhfQ0hBUikpOwotICAgICAgICBtX3BQYXRoW2lTaXplXSA9IDA7Ci0gICAgfQotICAgIEZYX0xQU1RSCQltX3BQYXRoOwotfTsKLWNsYXNzIENGUEZfU2tpYUZpbGVGb250IDogcHVibGljIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yCi17Ci1wdWJsaWM6Ci0gICAgQ0ZQRl9Ta2lhRmlsZUZvbnQoKSA6IG1fcEZpbGUoTlVMTCkge30KLSAgICB2aXJ0dWFsIEZYX0lOVDMyCUdldFR5cGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIEZQRl9TS0lBRk9OVFRZUEVfRmlsZTsKLSAgICB9Ci0gICAgSUZYX0ZpbGVSZWFkCQkqbV9wRmlsZTsKLX07Ci1jbGFzcyBDRlBGX1NraWFCdWZmZXJGb250IDogcHVibGljIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yCi17Ci1wdWJsaWM6Ci0gICAgQ0ZQRl9Ta2lhQnVmZmVyRm9udCgpIDogbV9wQnVmZmVyKE5VTEwpLCBtX3N6QnVmZmVyKDApIHt9Ci0gICAgdmlydHVhbCBGWF9JTlQzMglHZXRUeXBlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBGUEZfU0tJQUZPTlRUWVBFX0J1ZmZlcjsKLSAgICB9Ci0gICAgRlhfTFBWT0lECQkJbV9wQnVmZmVyOwotICAgIHNpemVfdAkJCQltX3N6QnVmZmVyOwotfTsKLWNsYXNzIENGUEZfU2tpYUZvbnRNZ3IgOiBwdWJsaWMgSUZQRl9Gb250TWdyCi17Ci1wdWJsaWM6Ci0gICAgQ0ZQRl9Ta2lhRm9udE1ncigpOwotICAgIHZpcnR1YWwgfkNGUEZfU2tpYUZvbnRNZ3IoKTsKLSAgICBGWF9CT09MCQkJCQlJbml0RlRMaWJyYXJ5KCk7Ci0gICAgdmlydHVhbCB2b2lkCQkJTG9hZFN5c3RlbUZvbnRzKCk7Ci0gICAgdmlydHVhbCB2b2lkCQkJTG9hZFByaXZhdGVGb250KElGWF9GaWxlUmVhZCogcEZvbnRGaWxlKTsKLSAgICB2aXJ0dWFsIHZvaWQJCQlMb2FkUHJpdmF0ZUZvbnQoRlhfQlNUUiBic0ZpbGVOYW1lKTsKLSAgICB2aXJ0dWFsIHZvaWQJCQlMb2FkUHJpdmF0ZUZvbnQoRlhfTFBWT0lEIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcik7CiAKLSAgICB2aXJ0dWFsIElGUEZfRm9udCoJCUNyZWF0ZUZvbnQoRlhfQlNUUiBic0ZhbWlseW5hbWUsIEZYX0JZVEUgdUNoYXJzZXQsIEZYX0RXT1JEIGR3U3R5bGUsIEZYX0RXT1JEIGR3TWF0Y2ggPSAwKTsKLSAgICBGWEZUX0ZhY2UJCQkJR2V0Rm9udEZhY2UoSUZYX0ZpbGVSZWFkICpwRmlsZVJlYWQsIEZYX0lOVDMyIGlGYWNlSW5kZXggPSAwKTsKLSAgICBGWEZUX0ZhY2UJCQkJR2V0Rm9udEZhY2UoRlhfQlNUUiBic0ZpbGUsIEZYX0lOVDMyIGlGYWNlSW5kZXggPSAwKTsKLSAgICBGWEZUX0ZhY2UJCQkJR2V0Rm9udEZhY2UoRlhfTFBDQllURSBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIsIEZYX0lOVDMyIGlGYWNlSW5kZXggPSAwKTsKLXByb3RlY3RlZDoKLSAgICB2b2lkCQkJCVNjYW5QYXRoKEZYX0JTVFIgcGF0aCk7Ci0gICAgdm9pZAkJCQlTY2FuRmlsZShGWF9CU1RSIGZpbGUpOwotICAgIHZvaWQJCQkJUmVwb3J0RmFjZShGWEZUX0ZhY2UgZmFjZSwgQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IgKnBGb250RGVzYyk7Ci0gICAgdm9pZAkJCQlPdXRwdXRTeXN0ZW1Gb250cygpOwotICAgIEZYX0JPT0wJCQkJbV9iTG9hZGVkOwotICAgIENGWF9QdHJBcnJheQkJbV9Gb250RmFjZXM7Ci0gICAgRlhGVF9MaWJyYXJ5CQltX0ZUTGlicmFyeTsKLSAgICBDRlhfTWFwUHRyVG9QdHIJCW1fRmFtaWx5Rm9udHM7CisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnBmLmgiCisKKyNkZWZpbmUgRlBGX1NLSUFGT05UVFlQRV9Vbmtub3duIDAKKyNkZWZpbmUgRlBGX1NLSUFGT05UVFlQRV9QYXRoIDEKKyNkZWZpbmUgRlBGX1NLSUFGT05UVFlQRV9GaWxlIDIKKyNkZWZpbmUgRlBGX1NLSUFGT05UVFlQRV9CdWZmZXIgMworCitjbGFzcyBDRlBGX1NraWFGb250RGVzY3JpcHRvciB7CisgcHVibGljOgorICBDRlBGX1NraWFGb250RGVzY3JpcHRvcigpCisgICAgICA6IG1fcEZhbWlseShOVUxMKSwKKyAgICAgICAgbV9kd1N0eWxlKDApLAorICAgICAgICBtX2lGYWNlSW5kZXgoMCksCisgICAgICAgIG1fZHdDaGFyc2V0cygwKSwKKyAgICAgICAgbV9pR2x5cGhOdW0oMCkge30KKyAgdmlydHVhbCB+Q0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IoKSB7IEZYX0ZyZWUobV9wRmFtaWx5KTsgfQorCisgIHZpcnR1YWwgaW50MzJfdCBHZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gRlBGX1NLSUFGT05UVFlQRV9Vbmtub3duOyB9CisKKyAgdm9pZCBTZXRGYW1pbHkoY29uc3QgRlhfQ0hBUiogcEZhbWlseSkgeworICAgIEZYX0ZyZWUobV9wRmFtaWx5KTsKKyAgICBpbnQzMl90IGlTaXplID0gRlhTWVNfc3RybGVuKHBGYW1pbHkpOworICAgIG1fcEZhbWlseSA9IEZYX0FsbG9jKEZYX0NIQVIsIGlTaXplICsgMSk7CisgICAgRlhTWVNfbWVtY3B5KG1fcEZhbWlseSwgcEZhbWlseSwgaVNpemUgKiBzaXplb2YoRlhfQ0hBUikpOworICAgIG1fcEZhbWlseVtpU2l6ZV0gPSAwOworICB9CisgIEZYX0NIQVIqIG1fcEZhbWlseTsKKyAgRlhfRFdPUkQgbV9kd1N0eWxlOworICBpbnQzMl90IG1faUZhY2VJbmRleDsKKyAgRlhfRFdPUkQgbV9kd0NoYXJzZXRzOworICBpbnQzMl90IG1faUdseXBoTnVtOwogfTsKKworY2xhc3MgQ0ZQRl9Ta2lhUGF0aEZvbnQgOiBwdWJsaWMgQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IgeworIHB1YmxpYzoKKyAgQ0ZQRl9Ta2lhUGF0aEZvbnQoKSA6IG1fcFBhdGgoTlVMTCkge30KKyAgfkNGUEZfU2tpYVBhdGhGb250KCkgb3ZlcnJpZGUgeyBGWF9GcmVlKG1fcFBhdGgpOyB9CisKKyAgLy8gQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IKKyAgaW50MzJfdCBHZXRUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gRlBGX1NLSUFGT05UVFlQRV9QYXRoOyB9CisKKyAgdm9pZCBTZXRQYXRoKGNvbnN0IEZYX0NIQVIqIHBQYXRoKSB7CisgICAgRlhfRnJlZShtX3BQYXRoKTsKKyAgICBpbnQzMl90IGlTaXplID0gRlhTWVNfc3RybGVuKHBQYXRoKTsKKyAgICBtX3BQYXRoID0gRlhfQWxsb2MoRlhfQ0hBUiwgaVNpemUgKyAxKTsKKyAgICBGWFNZU19tZW1jcHkobV9wUGF0aCwgcFBhdGgsIGlTaXplICogc2l6ZW9mKEZYX0NIQVIpKTsKKyAgICBtX3BQYXRoW2lTaXplXSA9IDA7CisgIH0KKyAgRlhfQ0hBUiogbV9wUGF0aDsKK307CisKK2NsYXNzIENGUEZfU2tpYUZpbGVGb250IDogcHVibGljIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yIHsKKyBwdWJsaWM6CisgIENGUEZfU2tpYUZpbGVGb250KCkgOiBtX3BGaWxlKE5VTEwpIHt9CisKKyAgLy8gQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IKKyAgaW50MzJfdCBHZXRUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gRlBGX1NLSUFGT05UVFlQRV9GaWxlOyB9CisgIElGWF9GaWxlUmVhZCogbV9wRmlsZTsKK307CisKK2NsYXNzIENGUEZfU2tpYUJ1ZmZlckZvbnQgOiBwdWJsaWMgQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IgeworIHB1YmxpYzoKKyAgQ0ZQRl9Ta2lhQnVmZmVyRm9udCgpIDogbV9wQnVmZmVyKE5VTEwpLCBtX3N6QnVmZmVyKDApIHt9CisKKyAgLy8gQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IKKyAgaW50MzJfdCBHZXRUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gRlBGX1NLSUFGT05UVFlQRV9CdWZmZXI7IH0KKworICB2b2lkKiBtX3BCdWZmZXI7CisgIHNpemVfdCBtX3N6QnVmZmVyOworfTsKKworY2xhc3MgQ0ZQRl9Ta2lhRm9udE1nciA6IHB1YmxpYyBJRlBGX0ZvbnRNZ3IgeworIHB1YmxpYzoKKyAgQ0ZQRl9Ta2lhRm9udE1ncigpOworICB+Q0ZQRl9Ta2lhRm9udE1ncigpIG92ZXJyaWRlOworCisgIC8vIElGUEZfRm9udE1ncgorICB2b2lkIExvYWRTeXN0ZW1Gb250cygpIG92ZXJyaWRlOworICB2b2lkIExvYWRQcml2YXRlRm9udChJRlhfRmlsZVJlYWQqIHBGb250RmlsZSkgb3ZlcnJpZGU7CisgIHZvaWQgTG9hZFByaXZhdGVGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGaWxlTmFtZSkgb3ZlcnJpZGU7CisgIHZvaWQgTG9hZFByaXZhdGVGb250KHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikgb3ZlcnJpZGU7CisgIElGUEZfRm9udCogQ3JlYXRlRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmFtaWx5bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdUNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdNYXRjaCA9IDApIG92ZXJyaWRlOworCisgIEZYX0JPT0wgSW5pdEZUTGlicmFyeSgpOworICBGWEZUX0ZhY2UgR2V0Rm9udEZhY2UoSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQsIGludDMyX3QgaUZhY2VJbmRleCA9IDApOworICBGWEZUX0ZhY2UgR2V0Rm9udEZhY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZpbGUsIGludDMyX3QgaUZhY2VJbmRleCA9IDApOworICBGWEZUX0ZhY2UgR2V0Rm9udEZhY2UoY29uc3QgdWludDhfdCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzekJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZhY2VJbmRleCA9IDApOworCisgcHJvdGVjdGVkOgorICB2b2lkIFNjYW5QYXRoKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcGF0aCk7CisgIHZvaWQgU2NhbkZpbGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlKTsKKyAgdm9pZCBSZXBvcnRGYWNlKEZYRlRfRmFjZSBmYWNlLCBDRlBGX1NraWFGb250RGVzY3JpcHRvciogcEZvbnREZXNjKTsKKyAgdm9pZCBPdXRwdXRTeXN0ZW1Gb250cygpOworICBGWF9CT09MIG1fYkxvYWRlZDsKKyAgQ0ZYX1B0ckFycmF5IG1fRm9udEZhY2VzOworICBGWEZUX0xpYnJhcnkgbV9GVExpYnJhcnk7CisgIENGWF9NYXBQdHJUb1B0ciBtX0ZhbWlseUZvbnRzOworfTsKKwogI2VuZGlmCiAKICNlbmRpZiAgLy8gQ09SRV9TUkNfRlhHRV9BTkRST0lEX0ZQRl9TS0lBRk9OVE1HUl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhbW9kdWxlLmNwcCBiL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYW1vZHVsZS5jcHAKaW5kZXggNmI1OTg3ZC4uZmRjMzM5OCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhbW9kdWxlLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFtb2R1bGUuY3BwCkBAIC0xLDQzICsxLDM1IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpbmNsdWRlICJmeF9mcGYuaCIKICNpZiBfRlhfT1NfID09IF9GWF9BTkRST0lEXwogI2luY2x1ZGUgImZwZl9za2lhbW9kdWxlLmgiCiAjaW5jbHVkZSAiZnBmX3NraWFmb250bWdyLmgiCi1zdGF0aWMgSUZQRl9EZXZpY2VNb2R1bGUgKmdzX3BQRk1vZHVsZSA9IE5VTEw7Ci1JRlBGX0RldmljZU1vZHVsZSogRlBGX0dldERldmljZU1vZHVsZSgpCi17Ci0gICAgaWYgKCFnc19wUEZNb2R1bGUpIHsKLSAgICAgICAgZ3NfcFBGTW9kdWxlID0gbmV3IENGUEZfU2tpYURldmljZU1vZHVsZTsKLSAgICB9Ci0gICAgcmV0dXJuIGdzX3BQRk1vZHVsZTsKK3N0YXRpYyBJRlBGX0RldmljZU1vZHVsZSogZ3NfcFBGTW9kdWxlID0gTlVMTDsKK0lGUEZfRGV2aWNlTW9kdWxlKiBGUEZfR2V0RGV2aWNlTW9kdWxlKCkgeworICBpZiAoIWdzX3BQRk1vZHVsZSkgeworICAgIGdzX3BQRk1vZHVsZSA9IG5ldyBDRlBGX1NraWFEZXZpY2VNb2R1bGU7CisgIH0KKyAgcmV0dXJuIGdzX3BQRk1vZHVsZTsKIH0KLUNGUEZfU2tpYURldmljZU1vZHVsZTo6fkNGUEZfU2tpYURldmljZU1vZHVsZSgpCi17Ci0gICAgaWYgKG1fcEZvbnRNZ3IpIHsKLSAgICAgICAgZGVsZXRlIG1fcEZvbnRNZ3I7Ci0gICAgfQorQ0ZQRl9Ta2lhRGV2aWNlTW9kdWxlOjp+Q0ZQRl9Ta2lhRGV2aWNlTW9kdWxlKCkgeworICBkZWxldGUgbV9wRm9udE1ncjsKIH0KLXZvaWQgQ0ZQRl9Ta2lhRGV2aWNlTW9kdWxlOjpEZXN0cm95KCkKLXsKLSAgICBpZiAoZ3NfcFBGTW9kdWxlKSB7Ci0gICAgICAgIGRlbGV0ZSAoQ0ZQRl9Ta2lhRGV2aWNlTW9kdWxlKilnc19wUEZNb2R1bGU7Ci0gICAgICAgIGdzX3BQRk1vZHVsZSA9IE5VTEw7Ci0gICAgfQordm9pZCBDRlBGX1NraWFEZXZpY2VNb2R1bGU6OkRlc3Ryb3koKSB7CisgIGRlbGV0ZSAoQ0ZQRl9Ta2lhRGV2aWNlTW9kdWxlKilnc19wUEZNb2R1bGU7CisgIGdzX3BQRk1vZHVsZSA9IE5VTEw7CiB9Ci1JRlBGX0ZvbnRNZ3IqIENGUEZfU2tpYURldmljZU1vZHVsZTo6R2V0Rm9udE1ncigpCi17Ci0gICAgaWYgKCFtX3BGb250TWdyKSB7Ci0gICAgICAgIG1fcEZvbnRNZ3IgPSBuZXcgQ0ZQRl9Ta2lhRm9udE1ncjsKLSAgICAgICAgaWYgKCFtX3BGb250TWdyLT5Jbml0RlRMaWJyYXJ5KCkpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtX3BGb250TWdyOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KK0lGUEZfRm9udE1nciogQ0ZQRl9Ta2lhRGV2aWNlTW9kdWxlOjpHZXRGb250TWdyKCkgeworICBpZiAoIW1fcEZvbnRNZ3IpIHsKKyAgICBtX3BGb250TWdyID0gbmV3IENGUEZfU2tpYUZvbnRNZ3I7CisgICAgaWYgKCFtX3BGb250TWdyLT5Jbml0RlRMaWJyYXJ5KCkpIHsKKyAgICAgIGRlbGV0ZSBtX3BGb250TWdyOworICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHJldHVybiAoSUZQRl9Gb250TWdyKiltX3BGb250TWdyOworICB9CisgIHJldHVybiAoSUZQRl9Gb250TWdyKiltX3BGb250TWdyOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnBmX3NraWFtb2R1bGUuaCBiL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYW1vZHVsZS5oCmluZGV4IGY5N2FhOTUuLmZmOTllZGEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYW1vZHVsZS5oCisrKyBiL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYW1vZHVsZS5oCkBAIC0xLDIzICsxLDI5IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgQ09SRV9TUkNfRlhHRV9BTkRST0lEX0ZQRl9TS0lBTU9EVUxFX0hfCiAjZGVmaW5lIENPUkVfU1JDX0ZYR0VfQU5EUk9JRF9GUEZfU0tJQU1PRFVMRV9IXwogCiAjaWYgX0ZYX09TXyA9PSBfRlhfQU5EUk9JRF8KKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2ZwZi5oIgorCiBjbGFzcyBDRlBGX1NraWFGb250TWdyOwotY2xhc3MgQ0ZQRl9Ta2lhRGV2aWNlTW9kdWxlIDogcHVibGljIElGUEZfRGV2aWNlTW9kdWxlCi17Ci1wdWJsaWM6Ci0gICAgQ0ZQRl9Ta2lhRGV2aWNlTW9kdWxlKCkgOiBtX3BGb250TWdyKE5VTEwpIHt9Ci0gICAgdmlydHVhbCB+Q0ZQRl9Ta2lhRGV2aWNlTW9kdWxlKCk7Ci0gICAgdmlydHVhbCB2b2lkCQkJCURlc3Ryb3koKTsKLSAgICB2aXJ0dWFsIElGUEZfRm9udE1ncioJCUdldEZvbnRNZ3IoKTsKLXByb3RlY3RlZDoKLSAgICBDRlBGX1NraWFGb250TWdyCSptX3BGb250TWdyOworCitjbGFzcyBDRlBGX1NraWFEZXZpY2VNb2R1bGUgOiBwdWJsaWMgSUZQRl9EZXZpY2VNb2R1bGUgeworIHB1YmxpYzoKKyAgQ0ZQRl9Ta2lhRGV2aWNlTW9kdWxlKCkgOiBtX3BGb250TWdyKG51bGxwdHIpIHt9CisgIH5DRlBGX1NraWFEZXZpY2VNb2R1bGUoKSBvdmVycmlkZTsKKworICAvLyBJRlBGX0RldmljZU1vZHVsZQorICB2b2lkIERlc3Ryb3koKSBvdmVycmlkZTsKKyAgSUZQRl9Gb250TWdyKiBHZXRGb250TWdyKCkgb3ZlcnJpZGU7CisKKyBwcm90ZWN0ZWQ6CisgIENGUEZfU2tpYUZvbnRNZ3IqIG1fcEZvbnRNZ3I7CiB9OwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9meF9hbmRyb2lkX2ZvbnQuY3BwIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2Z4X2FuZHJvaWRfZm9udC5jcHAKaW5kZXggNWY4YWFmYy4uZjRkZmMyOSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2Z4X2FuZHJvaWRfZm9udC5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2Z4X2FuZHJvaWRfZm9udC5jcHAKQEAgLTEsODcgKzEsODQgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2luY2x1ZGUgImZ4X2ZwZi5oIgogI2lmIF9GWF9PU18gPT0gX0ZYX0FORFJPSURfCi1DRlhfQW5kcm9pZEZvbnRJbmZvOjpDRlhfQW5kcm9pZEZvbnRJbmZvKCkKLSAgICA6IG1fcEZvbnRNZ3IoTlVMTCkKLXsKLX0KLUZYX0JPT0wgQ0ZYX0FuZHJvaWRGb250SW5mbzo6SW5pdChJRlBGX0ZvbnRNZ3IgKnBGb250TWdyKQotewotICAgIGlmICghcEZvbnRNZ3IpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBwRm9udE1nci0+TG9hZFN5c3RlbUZvbnRzKCk7Ci0gICAgbV9wRm9udE1nciA9IHBGb250TWdyOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDRlhfQW5kcm9pZEZvbnRJbmZvOjpFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpCi17CitDRlhfQW5kcm9pZEZvbnRJbmZvOjpDRlhfQW5kcm9pZEZvbnRJbmZvKCkgOiBtX3BGb250TWdyKE5VTEwpIHt9CitGWF9CT09MIENGWF9BbmRyb2lkRm9udEluZm86OkluaXQoSUZQRl9Gb250TWdyKiBwRm9udE1ncikgeworICBpZiAoIXBGb250TWdyKSB7CiAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHBGb250TWdyLT5Mb2FkU3lzdGVtRm9udHMoKTsKKyAgbV9wRm9udE1nciA9IHBGb250TWdyOworICByZXR1cm4gVFJVRTsKIH0KLXZvaWQqIENGWF9BbmRyb2lkRm9udEluZm86Ok1hcEZvbnQoaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgRlhfTFBDU1RSIGZhY2UsIEZYX0JPT0wmIGJFeGFjdCkKLXsKLSAgICBpZiAoIW1fcEZvbnRNZ3IpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYX0RXT1JEIGR3U3R5bGUgPSAwOwotICAgIGlmICh3ZWlnaHQgPj0gNzAwKSB7Ci0gICAgICAgIGR3U3R5bGUgfD0gRlhGT05UX0JPTEQ7Ci0gICAgfQotICAgIGlmIChiSXRhbGljKSB7Ci0gICAgICAgIGR3U3R5bGUgfD0gRlhGT05UX0lUQUxJQzsKLSAgICB9Ci0gICAgaWYgKHBpdGNoX2ZhbWlseSAmIEZYRk9OVF9GRl9GSVhFRFBJVENIKSB7Ci0gICAgICAgIGR3U3R5bGUgfD0gRlhGT05UX0ZJWEVEX1BJVENIOwotICAgIH0KLSAgICBpZiAocGl0Y2hfZmFtaWx5ICYgRlhGT05UX0ZGX1NDUklQVCkgewotICAgICAgICBkd1N0eWxlIHw9IEZYRk9OVF9TQ1JJUFQ7Ci0gICAgfQotICAgIGlmIChwaXRjaF9mYW1pbHkgJiBGWEZPTlRfRkZfUk9NQU4pIHsKLSAgICAgICAgZHdTdHlsZSB8PSBGWEZPTlRfU0VSSUY7Ci0gICAgfQotICAgIHJldHVybiBtX3BGb250TWdyLT5DcmVhdGVGb250KGZhY2UsIGNoYXJzZXQsIGR3U3R5bGUsIEZQRl9NQVRDSEZPTlRfUkVQTEFDRUFOU0kpOworRlhfQk9PTCBDRlhfQW5kcm9pZEZvbnRJbmZvOjpFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpIHsKKyAgcmV0dXJuIEZBTFNFOwogfQotdm9pZCogQ0ZYX0FuZHJvaWRGb250SW5mbzo6R2V0Rm9udChGWF9MUENTVFIgZmFjZSkKLXsKK3ZvaWQqIENGWF9BbmRyb2lkRm9udEluZm86Ok1hcEZvbnQoaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXRhbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoX2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBpRXhhY3QpIHsKKyAgaWYgKCFtX3BGb250TWdyKSB7CiAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgRlhfRFdPUkQgZHdTdHlsZSA9IDA7CisgIGlmICh3ZWlnaHQgPj0gNzAwKSB7CisgICAgZHdTdHlsZSB8PSBGWEZPTlRfQk9MRDsKKyAgfQorICBpZiAoYkl0YWxpYykgeworICAgIGR3U3R5bGUgfD0gRlhGT05UX0lUQUxJQzsKKyAgfQorICBpZiAocGl0Y2hfZmFtaWx5ICYgRlhGT05UX0ZGX0ZJWEVEUElUQ0gpIHsKKyAgICBkd1N0eWxlIHw9IEZYRk9OVF9GSVhFRF9QSVRDSDsKKyAgfQorICBpZiAocGl0Y2hfZmFtaWx5ICYgRlhGT05UX0ZGX1NDUklQVCkgeworICAgIGR3U3R5bGUgfD0gRlhGT05UX1NDUklQVDsKKyAgfQorICBpZiAocGl0Y2hfZmFtaWx5ICYgRlhGT05UX0ZGX1JPTUFOKSB7CisgICAgZHdTdHlsZSB8PSBGWEZPTlRfU0VSSUY7CisgIH0KKyAgcmV0dXJuIG1fcEZvbnRNZ3ItPkNyZWF0ZUZvbnQoZmFjZSwgY2hhcnNldCwgZHdTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBGX01BVENIRk9OVF9SRVBMQUNFQU5TSSk7CiB9Ci1GWF9EV09SRCBDRlhfQW5kcm9pZEZvbnRJbmZvOjpHZXRGb250RGF0YSh2b2lkKiBoRm9udCwgRlhfRFdPUkQgdGFibGUsIEZYX0xQQllURSBidWZmZXIsIEZYX0RXT1JEIHNpemUpCi17Ci0gICAgaWYgKCFoRm9udCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuICgoSUZQRl9Gb250KiloRm9udCktPkdldEZvbnREYXRhKHRhYmxlLCBidWZmZXIsIHNpemUpOwordm9pZCogQ0ZYX0FuZHJvaWRGb250SW5mbzo6R2V0Rm9udChjb25zdCBGWF9DSEFSKiBmYWNlKSB7CisgIHJldHVybiBOVUxMOwogfQotRlhfQk9PTCBDRlhfQW5kcm9pZEZvbnRJbmZvOjpHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpCi17Ci0gICAgaWYgKCFoRm9udCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG5hbWUgPSAoKElGUEZfRm9udCopaEZvbnQpLT5HZXRGYW1pbHlOYW1lKCk7Ci0gICAgcmV0dXJuIFRSVUU7CitGWF9EV09SRCBDRlhfQW5kcm9pZEZvbnRJbmZvOjpHZXRGb250RGF0YSh2b2lkKiBoRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSkgeworICBpZiAoIWhGb250KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuICgoSUZQRl9Gb250KiloRm9udCktPkdldEZvbnREYXRhKHRhYmxlLCBidWZmZXIsIHNpemUpOwogfQotRlhfQk9PTCBDRlhfQW5kcm9pZEZvbnRJbmZvOjpHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KQotewotICAgIGlmICghaEZvbnQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBjaGFyc2V0ID0gKChJRlBGX0ZvbnQqKWhGb250KS0+R2V0Q2hhcnNldCgpOworRlhfQk9PTCBDRlhfQW5kcm9pZEZvbnRJbmZvOjpHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpIHsKKyAgaWYgKCFoRm9udCkgewogICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBuYW1lID0gKChJRlBGX0ZvbnQqKWhGb250KS0+R2V0RmFtaWx5TmFtZSgpOworICByZXR1cm4gVFJVRTsKIH0KLXZvaWQgQ0ZYX0FuZHJvaWRGb250SW5mbzo6RGVsZXRlRm9udCh2b2lkKiBoRm9udCkKLXsKLSAgICBpZiAoIWhGb250KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgKChJRlBGX0ZvbnQqKWhGb250KS0+UmVsZWFzZSgpOworRlhfQk9PTCBDRlhfQW5kcm9pZEZvbnRJbmZvOjpHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KSB7CisgIGlmICghaEZvbnQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgY2hhcnNldCA9ICgoSUZQRl9Gb250KiloRm9udCktPkdldENoYXJzZXQoKTsKKyAgcmV0dXJuIEZBTFNFOwogfQotdm9pZCogQ0ZYX0FuZHJvaWRGb250SW5mbzo6UmV0YWluRm9udCh2b2lkKiBoRm9udCkKLXsKLSAgICByZXR1cm4gTlVMTDsKK3ZvaWQgQ0ZYX0FuZHJvaWRGb250SW5mbzo6RGVsZXRlRm9udCh2b2lkKiBoRm9udCkgeworICBpZiAoIWhGb250KSB7CisgICAgcmV0dXJuOworICB9CisgICgoSUZQRl9Gb250KiloRm9udCktPlJlbGVhc2UoKTsKK30KK3ZvaWQqIENGWF9BbmRyb2lkRm9udEluZm86OlJldGFpbkZvbnQodm9pZCogaEZvbnQpIHsKKyAgcmV0dXJuIE5VTEw7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9meF9hbmRyb2lkX2ZvbnQuaCBiL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9meF9hbmRyb2lkX2ZvbnQuaAppbmRleCBmYjdmZjdjLi41Njc1ZTFjIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnhfYW5kcm9pZF9mb250LmgKKysrIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2Z4X2FuZHJvaWRfZm9udC5oCkBAIC0xLDcgKzEsNyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIENPUkVfU1JDX0ZYR0VfQU5EUk9JRF9GWF9BTkRST0lEX0ZPTlRfSF8KQEAgLTksMjkgKzksMzQgQEAKIAogI2lmIF9GWF9PU18gPT0gX0ZYX0FORFJPSURfCiBjbGFzcyBJRlBGX0ZvbnRNZ3I7Ci1jbGFzcyBDRlhfQW5kcm9pZEZvbnRJbmZvIDogcHVibGljIElGWF9TeXN0ZW1Gb250SW5mbwotewotcHVibGljOgotICAgIENGWF9BbmRyb2lkRm9udEluZm8oKTsKLSAgICB2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKQotICAgIHsKLSAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgfQorY2xhc3MgQ0ZYX0FuZHJvaWRGb250SW5mbyA6IHB1YmxpYyBJRlhfU3lzdGVtRm9udEluZm8geworIHB1YmxpYzoKKyAgQ0ZYX0FuZHJvaWRGb250SW5mbygpOworICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0KIAotICAgIHZpcnR1YWwJRlhfQk9PTAkJRW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKTsKKyAgdmlydHVhbCBGWF9CT09MIEVudW1Gb250TGlzdChDRlhfRm9udE1hcHBlciogcE1hcHBlcik7CiAKLSAgICB2aXJ0dWFsIHZvaWQqCQlNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIEZYX0xQQ1NUUiBmYWNlLCBGWF9CT09MJiBiRXhhY3QpOworICB2aXJ0dWFsIHZvaWQqIE1hcEZvbnQoaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoX2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGJFeGFjdCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQqCQlHZXRGb250KEZYX0xQQ1NUUiBmYWNlKTsKLSAgICB2aXJ0dWFsIEZYX0RXT1JECUdldEZvbnREYXRhKHZvaWQqIGhGb250LCBGWF9EV09SRCB0YWJsZSwgRlhfTFBCWVRFIGJ1ZmZlciwgRlhfRFdPUkQgc2l6ZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCQlHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCk7CisgIHZpcnR1YWwgdm9pZCogR2V0Rm9udChjb25zdCBGWF9DSEFSKiBmYWNlKTsKKyAgdmlydHVhbCBGWF9EV09SRCBHZXRGb250RGF0YSh2b2lkKiBoRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSk7CisgIHZpcnR1YWwgRlhfQk9PTCBHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOworICB2aXJ0dWFsIEZYX0JPT0wgR2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQJCURlbGV0ZUZvbnQodm9pZCogaEZvbnQpOwotICAgIHZpcnR1YWwgdm9pZCogICAgICAgUmV0YWluRm9udCh2b2lkKiBoRm9udCk7Ci0gICAgRlhfQk9PTAkJCQlJbml0KElGUEZfRm9udE1nciAqcEZvbnRNZ3IpOwotcHJvdGVjdGVkOgotICAgIElGUEZfRm9udE1ncgkJKm1fcEZvbnRNZ3I7CisgIHZpcnR1YWwgdm9pZCBEZWxldGVGb250KHZvaWQqIGhGb250KTsKKyAgdmlydHVhbCB2b2lkKiBSZXRhaW5Gb250KHZvaWQqIGhGb250KTsKKyAgRlhfQk9PTCBJbml0KElGUEZfRm9udE1nciogcEZvbnRNZ3IpOworCisgcHJvdGVjdGVkOgorICBJRlBGX0ZvbnRNZ3IqIG1fcEZvbnRNZ3I7CiB9OwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9meF9hbmRyb2lkX2ltcC5jcHAgYi9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnhfYW5kcm9pZF9pbXAuY3BwCmluZGV4IGExNjMxYWIuLjA3M2E2NjUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9meF9hbmRyb2lkX2ltcC5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2Z4X2FuZHJvaWRfaW1wLmNwcApAQCAtMSwyOSArMSwyNyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSAiZnhfZnBmLmgiCiAjaWYgX0ZYX09TXyA9PSBfRlhfQU5EUk9JRF8KLXZvaWQgQ0ZYX0dFTW9kdWxlOjpJbml0UGxhdGZvcm0oKQotewotICAgIElGUEZfRGV2aWNlTW9kdWxlICpwRGV2aWNlTW9kdWxlID0gRlBGX0dldERldmljZU1vZHVsZSgpOwotICAgIGlmICghcERldmljZU1vZHVsZSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIElGUEZfRm9udE1nciAqcEZvbnRNZ3IgPSBwRGV2aWNlTW9kdWxlLT5HZXRGb250TWdyKCk7Ci0gICAgaWYgKHBGb250TWdyKSB7Ci0gICAgICAgIENGWF9BbmRyb2lkRm9udEluZm8gKnBGb250SW5mbyA9IG5ldyBDRlhfQW5kcm9pZEZvbnRJbmZvOwotICAgICAgICBwRm9udEluZm8tPkluaXQocEZvbnRNZ3IpOwotICAgICAgICBtX3BGb250TWdyLT5TZXRTeXN0ZW1Gb250SW5mbyhwRm9udEluZm8pOwotICAgIH0KLSAgICBtX3BQbGF0Zm9ybURhdGEgPSBwRGV2aWNlTW9kdWxlOwordm9pZCBDRlhfR0VNb2R1bGU6OkluaXRQbGF0Zm9ybSgpIHsKKyAgSUZQRl9EZXZpY2VNb2R1bGUqIHBEZXZpY2VNb2R1bGUgPSBGUEZfR2V0RGV2aWNlTW9kdWxlKCk7CisgIGlmICghcERldmljZU1vZHVsZSkgeworICAgIHJldHVybjsKKyAgfQorICBJRlBGX0ZvbnRNZ3IqIHBGb250TWdyID0gcERldmljZU1vZHVsZS0+R2V0Rm9udE1ncigpOworICBpZiAocEZvbnRNZ3IpIHsKKyAgICBDRlhfQW5kcm9pZEZvbnRJbmZvKiBwRm9udEluZm8gPSBuZXcgQ0ZYX0FuZHJvaWRGb250SW5mbzsKKyAgICBwRm9udEluZm8tPkluaXQocEZvbnRNZ3IpOworICAgIG1fcEZvbnRNZ3ItPlNldFN5c3RlbUZvbnRJbmZvKHBGb250SW5mbyk7CisgIH0KKyAgbV9wUGxhdGZvcm1EYXRhID0gcERldmljZU1vZHVsZTsKIH0KLXZvaWQgQ0ZYX0dFTW9kdWxlOjpEZXN0cm95UGxhdGZvcm0oKQotewotICAgIGlmIChtX3BQbGF0Zm9ybURhdGEpIHsKLSAgICAgICAgKChJRlBGX0RldmljZU1vZHVsZSopbV9wUGxhdGZvcm1EYXRhKS0+RGVzdHJveSgpOwotICAgIH0KK3ZvaWQgQ0ZYX0dFTW9kdWxlOjpEZXN0cm95UGxhdGZvcm0oKSB7CisgIGlmIChtX3BQbGF0Zm9ybURhdGEpIHsKKyAgICAoKElGUEZfRGV2aWNlTW9kdWxlKiltX3BQbGF0Zm9ybURhdGEpLT5EZXN0cm95KCk7CisgIH0KIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2Z4X2ZwZi5oIGIvY29yZS9zcmMvZnhnZS9hbmRyb2lkL2Z4X2ZwZi5oCmluZGV4IGJlZWYzYzcuLjYwOTY4ODQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9meF9mcGYuaAorKysgYi9jb3JlL3NyYy9meGdlL2FuZHJvaWQvZnhfZnBmLmgKQEAgLTEsMTYgKzEsMTUgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBDT1JFX1NSQ19GWEdFX0FORFJPSURfRlhfRlBGX0hfCiAjZGVmaW5lIENPUkVfU1JDX0ZYR0VfQU5EUk9JRF9GWF9GUEZfSF8KIAotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhjcnQvZnhfZXh0LmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGdlL2ZwZi5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhnZS9meF9mcmVldHlwZS5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhnZS9meF9nZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2ZwZi5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2ZyZWV0eXBlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKICNpbmNsdWRlICJmeF9hbmRyb2lkX2ZvbnQuaCIKIAogI2VuZGlmICAvLyBDT1JFX1NSQ19GWEdFX0FORFJPSURfRlhfRlBGX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FwcGxlL2FwcGxlX2ludC5oIGIvY29yZS9zcmMvZnhnZS9hcHBsZS9hcHBsZV9pbnQuaAppbmRleCA1YjA4M2Q4Li4wNjAxZmNjIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FwcGxlL2FwcGxlX2ludC5oCisrKyBiL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvYXBwbGVfaW50LmgKQEAgLTEsMjQ4ICsxLDI2OSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIENPUkVfU1JDX0ZYR0VfQVBQTEVfQVBQTEVfSU5UX0hfCiAjZGVmaW5lIENPUkVfU1JDX0ZYR0VfQVBQTEVfQVBQTEVfSU5UX0hfCiAKLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKKwogI2lmIF9GWF9PU18gPT0gX0ZYX01BQ09TWF8KICNpbmNsdWRlIDxDYXJib24vQ2FyYm9uLmg+CiAjZW5kaWYKKwogdHlwZWRlZiBlbnVtIGVGWElPU0ZPTlRDSEFSU0VUIHsKLSAgICBlRlhGb250Q2hhcnNldERFRkFVTFQgICAgICAgPSAgIDAsCi0gICAgZUZYRm9udENoYXJzZXRBTlNJICAgICAgICAgID0gICAxLAotICAgIGVGWEZvbnRDaGFyc2V0U1lNQk9MICAgICAgICA9ICAgMSA8PCAxLAotICAgIGVGWEZvbnRDaGFyc2V0U0hJRlRKSVMgICAgICA9ICAgMSA8PCAyLAotICAgIGVGWEZvbnRDaGFyc2V0SEFOR0VVTCAgICAgICA9ICAgMSA8PCAzLAotICAgIGVGWEZvbnRDaGFyc2V0R0IyMzEyICAgICAgICA9ICAgMSA8PCA0LAotICAgIGVGWEZvbnRDaGFyc2V0Q0hJTkVTRUJJRzUgICA9ICAgMSA8PCA1LAotICAgIGVGWEZvbnRDaGFyc2V0VEhBSSAgICAgICAgICA9ICAgMSA8PCA2LAotICAgIGVGWEZvbnRDaGFyc2V0RUFTVEVVUk9QRSAgICA9ICAgMSA8PCA3LAotICAgIGVGWEZvbnRDaGFyc2V0UlVTU0lBTiAgICAgICA9ICAgMSA8PCA4LAotICAgIGVGWEZvbnRDaGFyc2V0R1JFRUsgICAgICAgICA9ICAgMSA8PCA5LAotICAgIGVGWEZvbnRDaGFyc2V0VFVSS0lTSCAgICAgICA9ICAgMSA8PCAxMCwKLSAgICBlRlhGb250Q2hhcnNldEhFQlJFVyAgICAgICAgPSAgIDEgPDwgMTEsCi0gICAgZUZYRm9udENoYXJzZXRBUkFCSUMgICAgICAgID0gICAxIDw8IDEyLAotICAgIGVGWEZvbnRDaGFyc2V0QkFMVElDICAgICAgICA9ICAgMSA8PCAxMywKKyAgZUZYRm9udENoYXJzZXRERUZBVUxUID0gMCwKKyAgZUZYRm9udENoYXJzZXRBTlNJID0gMSwKKyAgZUZYRm9udENoYXJzZXRTWU1CT0wgPSAxIDw8IDEsCisgIGVGWEZvbnRDaGFyc2V0U0hJRlRKSVMgPSAxIDw8IDIsCisgIGVGWEZvbnRDaGFyc2V0SEFOR0VVTCA9IDEgPDwgMywKKyAgZUZYRm9udENoYXJzZXRHQjIzMTIgPSAxIDw8IDQsCisgIGVGWEZvbnRDaGFyc2V0Q0hJTkVTRUJJRzUgPSAxIDw8IDUsCisgIGVGWEZvbnRDaGFyc2V0VEhBSSA9IDEgPDwgNiwKKyAgZUZYRm9udENoYXJzZXRFQVNURVVST1BFID0gMSA8PCA3LAorICBlRlhGb250Q2hhcnNldFJVU1NJQU4gPSAxIDw8IDgsCisgIGVGWEZvbnRDaGFyc2V0R1JFRUsgPSAxIDw8IDksCisgIGVGWEZvbnRDaGFyc2V0VFVSS0lTSCA9IDEgPDwgMTAsCisgIGVGWEZvbnRDaGFyc2V0SEVCUkVXID0gMSA8PCAxMSwKKyAgZUZYRm9udENoYXJzZXRBUkFCSUMgPSAxIDw8IDEyLAorICBlRlhGb250Q2hhcnNldEJBTFRJQyA9IDEgPDwgMTMsCiB9IEZYX0lPU0NIQVJTRVQ7CiBGWF9JT1NDSEFSU0VUIEZYX0dldGlPU0NoYXJzZXQoaW50IGNoYXJzZXQpOwogdHlwZWRlZiBlbnVtIGVGWElPU0ZPTlRGTEFHIHsKLSAgICBlRlhGb250RmxhZ0JvbGQgICAgICAgICA9ICAxLAotICAgIGVGWEZvbnRGbGFnSXRhbGljICAgICAgID0gIDEgPDwgMSwKLSAgICBlRlhGb250RmxhZ0ZpeGVkUGl0Y2ggICA9ICAxIDw8IDIsCi0gICAgZUZYRm9udEZsYWdTZXJpZiAgICAgICAgPSAgMSA8PCAzLAotICAgIGVGWEZvbnRGbGFnU2NyaXB0ICAgICAgID0gIDEgPDwgNCwKKyAgZUZYRm9udEZsYWdCb2xkID0gMSwKKyAgZUZYRm9udEZsYWdJdGFsaWMgPSAxIDw8IDEsCisgIGVGWEZvbnRGbGFnRml4ZWRQaXRjaCA9IDEgPDwgMiwKKyAgZUZYRm9udEZsYWdTZXJpZiA9IDEgPDwgMywKKyAgZUZYRm9udEZsYWdTY3JpcHQgPSAxIDw8IDQsCiB9IEZYX0lPU0ZPTlRGTEFHOwogdHlwZWRlZiBzdHJ1Y3QgX0lPU19GT05UREFUQSB7Ci0gICAgRlhfRFdPUkQgICAgICAgIG5IYXNoQ29kZTsKLSAgICBjb25zdCBjaGFyKiAgICAgICBwc05hbWU7Ci0gICAgRlhfRFdPUkQgICAgICAgIGNoYXJzZXRzOwotICAgIEZYX0RXT1JEICAgICAgICBzdHlsZXM7CisgIEZYX0RXT1JEIG5IYXNoQ29kZTsKKyAgY29uc3QgY2hhciogcHNOYW1lOworICBGWF9EV09SRCBjaGFyc2V0czsKKyAgRlhfRFdPUkQgc3R5bGVzOwogfSBJT1NfRk9OVERBVEE7Ci1jbGFzcyBDUXVhcnR6MkQKLXsKLXB1YmxpYzoKLSAgICB2b2lkKgljcmVhdGVHcmFwaGljcyhDRlhfRElCaXRtYXAqIGJpdG1hcCk7Ci0gICAgdm9pZAlkZXN0cm95R3JhcGhpY3Modm9pZCogZ3JhcGhpY3MpOworY2xhc3MgQ1F1YXJ0ejJEIHsKKyBwdWJsaWM6CisgIHZvaWQqIGNyZWF0ZUdyYXBoaWNzKENGWF9ESUJpdG1hcCogYml0bWFwKTsKKyAgdm9pZCBkZXN0cm95R3JhcGhpY3Modm9pZCogZ3JhcGhpY3MpOwogCi0gICAgdm9pZCoJQ3JlYXRlRm9udChGWF9MUENCWVRFIHBGb250RGF0YSwgRlhfRFdPUkQgZHdGb250U2l6ZSk7Ci0gICAgdm9pZAlEZXN0cm95Rm9udCh2b2lkKiBwRm9udCk7Ci0gICAgdm9pZAlzZXRHcmFwaGljc1RleHRNYXRyaXgodm9pZCogZ3JhcGhpY3MsIENGWF9BZmZpbmVNYXRyaXgqIG1hdHJpeCk7Ci0gICAgRlhfQk9PTAlkcmF3R3JhcGhpY3NTdHJpbmcodm9pZCogICAgICAgICAgICAgICAgZ3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCAgICAgICAgICAgICBmb250U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEKiAgICAgICAgICAgICBnbHlwaEluZGljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dQb2ludCogICAgICAgICAgZ2x5cGhQb3NpdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgICAgICAgICAgICAgY2hhcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiAgICAgICAgICAgICAgYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4KiAgICBtYXRyaXggPSBOVUxMKTsKLSAgICB2b2lkIHNhdmVHcmFwaGljc1N0YXRlKHZvaWQqIGdyYXBoaWNzKTsKLSAgICB2b2lkIHJlc3RvcmVHcmFwaGljc1N0YXRlKHZvaWQqIGdyYXBoaWNzKTsKKyAgdm9pZCogQ3JlYXRlRm9udChjb25zdCB1aW50OF90KiBwRm9udERhdGEsIEZYX0RXT1JEIGR3Rm9udFNpemUpOworICB2b2lkIERlc3Ryb3lGb250KHZvaWQqIHBGb250KTsKKyAgdm9pZCBzZXRHcmFwaGljc1RleHRNYXRyaXgodm9pZCogZ3JhcGhpY3MsIENGWF9NYXRyaXgqIG1hdHJpeCk7CisgIEZYX0JPT0wgZHJhd0dyYXBoaWNzU3RyaW5nKHZvaWQqIGdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBmb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCogZ2x5cGhJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDR1BvaW50KiBnbHlwaFBvc2l0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBtYXRyaXggPSBOVUxMKTsKKyAgdm9pZCBzYXZlR3JhcGhpY3NTdGF0ZSh2b2lkKiBncmFwaGljcyk7CisgIHZvaWQgcmVzdG9yZUdyYXBoaWNzU3RhdGUodm9pZCogZ3JhcGhpY3MpOwogfTsKLWNsYXNzIENBcHBsZVBsYXRmb3JtIAotewotcHVibGljOgotICAgIENBcHBsZVBsYXRmb3JtKCkKLSAgICB7Ci0gICAgICAgIG1fcEZvbnRNYXBwZXIgPSBOVUxMOwotICAgIH0KLSAgICB+Q0FwcGxlUGxhdGZvcm0oKQotICAgIHsKLSAgICAgICAgaWYgKG1fcEZvbnRNYXBwZXIpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtX3BGb250TWFwcGVyOwotICAgICAgICB9Ci0gICAgfQotICAgIENRdWFydHoyRAlfcXVhcnR6MmQ7Ci0gICAgSUZYX0ZvbnRNYXBwZXIqIG1fcEZvbnRNYXBwZXI7Ci19OwotY2xhc3MgQ0ZYX1F1YXJ0ekRldmljZURyaXZlciA6IHB1YmxpYyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyCi17Ci1wdWJsaWM6Ci0gICAgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcihDR0NvbnRleHRSZWYgY29udGV4dCwgRlhfSU5UMzIgZGV2aWNlQ2xhc3MpOwotICAgIHZpcnR1YWwgfkNGWF9RdWFydHpEZXZpY2VEcml2ZXIoKTsKK2NsYXNzIENBcHBsZVBsYXRmb3JtIHsKKyBwdWJsaWM6CisgIENBcHBsZVBsYXRmb3JtKCkge30KKyAgfkNBcHBsZVBsYXRmb3JtKCkge30KIAotICAgIHZpcnR1YWwgaW50CQlHZXREZXZpY2VDYXBzKGludCBjYXBzX2lkKTsKLSAgICB2aXJ0dWFsIENGWF9NYXRyaXgJR2V0Q1RNKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBDRlhfRElCaXRtYXAqICAgR2V0QmFja0Ryb3AoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCoJR2V0UGxhdGZvcm1TdXJmYWNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wgSXNQU1ByaW50RHJpdmVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgdmlydHVhbCBGWF9CT09MCVN0YXJ0UmVuZGVyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQJRW5kUmVuZGVyaW5nKCkge30KLSAgICB2aXJ0dWFsIHZvaWQJU2F2ZVN0YXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkCVJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQpOwotICAgIHZpcnR1YWwgRlhfQk9PTAlTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgdmlydHVhbCBGWF9CT09MCVNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIHZpcnR1YWwgRlhfQk9PTAlEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0cm9rZV9jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIHZpcnR1YWwgRlhfQk9PTAlTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wgRmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsIEZYX0RXT1JEIGZpbGxfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJRHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOwotICAgIHZpcnR1YWwgRlhfQk9PTCBHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJR2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBGWF9CT09MIGJERWRnZSA9IEZBTFNFKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgRlhfRFdPUkQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOwotICAgIHZpcnR1YWwgRlhfQk9PTAlTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgZmxhZ3MsIEZYX0xQVk9JRCYgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgdmlydHVhbCBGWF9CT09MCUNvbnRpbnVlRElCaXRzKEZYX0xQVk9JRCBoYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQJQ2FuY2VsRElCaXRzKEZYX0xQVk9JRCBoYW5kbGUpIHt9Ci0gICAgdmlydHVhbCBGWF9CT09MIERyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywgQ0ZYX0ZvbnQqIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udENhY2hlKiBwQ2FjaGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLCBGWF9GTE9BVCBmb250X3NpemUsIEZYX0RXT1JEIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgQ2xlYXJEcml2ZXIoKTsKLXByb3RlY3RlZDoKLSAgICB2b2lkIHNldFN0cm9rZUluZm8oY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhICogZ3JhcGhTdGF0ZSwgRlhfQVJHQiBhcmdiLCBGWF9GTE9BVCBsaW5lV2lkdGgpOwotICAgIHZvaWQgc2V0RmlsbEluZm8oRlhfQVJHQiBhcmdiKTsKLSAgICB2b2lkIHNldFBhdGhUb0NvbnRleHQoY29uc3QgQ0ZYX1BhdGhEYXRhICogcGF0aERhdGEpOwotICAgIEZYX0ZMT0FUIGdldExpbmVXaWR0aChjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEgKiBncmFwaFN0YXRlLCBDR0FmZmluZVRyYW5zZm9ybSBjdG0pOwotICAgIEZYX0JPT0wgQ0dfRHJhd0dseXBSdW4oaW50ICAgICAgICAgICAgICAgICAgICAgICAgbkNoYXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqICAgICAgcENoYXJQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogICAgICAgICAgICAgICAgICBwRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250Q2FjaGUqICAgICAgICAgICAgIHBDYWNoZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqICAgIHBHbHlwaE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqICAgIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgICAgICAgICAgICAgICAgICAgZm9udF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgICAgICAgICAgICAgICAgICAgYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtKTsKLSAgICB2b2lkICAgIENHX1NldEltYWdlVHJhbnNmb3JtKGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgQ0dSZWN0KiByZWN0ID0gTlVMTCk7Ci1wcm90ZWN0ZWQ6Ci0gICAgQ0dDb250ZXh0UmVmCV9jb250ZXh0OwotICAgIENHQWZmaW5lVHJhbnNmb3JtIF9mb3hpdERldmljZTJVc2VyOwotICAgIENHQWZmaW5lVHJhbnNmb3JtIF91c2VyMkZveGl0RGV2aWNlOwotICAgIEZYX0lOVDMyICAgICAgICBtX3NhdmVDb3VudDsKLQotICAgIEZYX0lOVDMyCQlfd2lkdGg7Ci0gICAgRlhfSU5UMzIJCV9oZWlnaHQ7Ci0gICAgRlhfSU5UMzIJCV9iaXRzUGVyUGl4ZWw7Ci0gICAgRlhfSU5UMzIJCV9kZXZpY2VDbGFzczsKLSAgICBGWF9JTlQzMgkJX3JlbmRlckNhcHM7Ci0gICAgRlhfSU5UMzIJX2hvcnpTaXplOwotICAgIEZYX0lOVDMyCV92ZXJ0U2l6ZTsKKyAgQ1F1YXJ0ejJEIF9xdWFydHoyZDsKIH07Ci1jbGFzcyBDRlhfRm9udFByb3ZpZGVyIEZYX0ZJTkFMIDogcHVibGljIElGWF9GaWxlUmVhZAotewotcHVibGljOgotICAgIHZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKSBGWF9PVkVSUklERQotICAgIHsKLSAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCUdldFNpemUoKSBGWF9PVkVSUklERQotICAgIHsKLSAgICAgICAgcmV0dXJuIChGWF9GSUxFU0laRSlfdG90YWxTaXplOwotICAgIH0KLSAgICB2aXJ0dWFsIEZYX0JPT0wJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSBGWF9PVkVSUklERTsKIAotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzRU9GKCkgRlhfT1ZFUlJJREUKLSAgICB7Ci0gICAgICAgIHJldHVybiBfb2ZmU2V0ID09IF90b3RhbFNpemU7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfRklMRVNJWkUJCUdldFBvc2l0aW9uKCkgRlhfT1ZFUlJJREUKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRlhfRklMRVNJWkUpX29mZlNldDsKLSAgICB9Ci0gICAgdmlydHVhbCBzaXplX3QJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgRlhfT1ZFUlJJREU7Ci1wdWJsaWM6Ci0gICAgQ0ZYX0ZvbnRQcm92aWRlcihDR0ZvbnRSZWYgY2dGb250KTsKLSAgICB+Q0ZYX0ZvbnRQcm92aWRlcigpOwotICAgIHZvaWQgICAgICAgICAgICBJbml0VGFibGVPZmZzZXQoKTsKLSAgICB1bnNpZ25lZCBsb25nICAgUmVhZCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLXByb3RlY3RlZDoKLSAgICB1aW50MzJfdCBDYWxjVGFibGVDaGVja1N1bShjb25zdCB1aW50MzJfdCAqdGFibGUsIHVpbnQzMl90IG51bWJlck9mQnl0ZXNJblRhYmxlKTsKLSAgICB1aW50MzJfdCBDYWxjVGFibGVEYXRhUmVmQ2hlY2tTdW0oQ0ZEYXRhUmVmIGRhdGFSZWYpOwotcHJpdmF0ZToKLSAgICBDR0ZvbnRSZWYgICBtX2NnRm9udDsKLSAgICBVSW50MzIgICAgICBtX2lUYWJsZVNpemU7Ci0gICAgc2l6ZV90ICAgICAgX29mZlNldDsKLSAgICB0eXBlZGVmIHN0cnVjdCBGb250SGVhZGVyIHsKLSAgICAgICAgaW50MzJfdCBmVmVyc2lvbjsKLSAgICAgICAgdWludDE2X3QgZk51bVRhYmxlczsKLSAgICAgICAgdWludDE2X3QgZlNlYXJjaFJhbmdlOwotICAgICAgICB1aW50MTZfdCBmRW50cnlTZWxlY3RvcjsKLSAgICAgICAgdWludDE2X3QgZlJhbmdlU2hpZnQ7Ci0gICAgfSBGb250SGVhZGVyOwotICAgIHR5cGVkZWYgc3RydWN0IFRhYmxlRW50cnkgewotICAgICAgICB1aW50MzJfdCBmVGFnOwotICAgICAgICB1aW50MzJfdCBmQ2hlY2tTdW07Ci0gICAgICAgIHVpbnQzMl90IGZPZmZzZXQ7Ci0gICAgICAgIHVpbnQzMl90IGZMZW5ndGg7Ci0gICAgfSBUYWJsZUVudHJ5OwotICAgIEZvbnRIZWFkZXIgX2ZvbnRIZWFkZXI7Ci0gICAgdW5zaWduZWQgY2hhciAqIF90YWJsZUVudHJpZXM7Ci0gICAgc2l6ZV90ICogX3RhYmxlT2Zmc2V0czsKLSAgICBpbnQgX3RhYmxlQ291bnQ7Ci0gICAgaW50IF90b3RhbFNpemU7CitjbGFzcyBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyIDogcHVibGljIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIgeworIHB1YmxpYzoKKyAgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcihDR0NvbnRleHRSZWYgY29udGV4dCwgaW50MzJfdCBkZXZpY2VDbGFzcyk7CisgIH5DRlhfUXVhcnR6RGV2aWNlRHJpdmVyKCkgb3ZlcnJpZGU7CisKKyAgLy8gSUZYX1JlbmRlckRldmljZURyaXZlcgorICBpbnQgR2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCkgb3ZlcnJpZGU7CisgIENGWF9NYXRyaXggR2V0Q1RNKCkgY29uc3Qgb3ZlcnJpZGU7CisgIEZYX0JPT0wgSXNQU1ByaW50RHJpdmVyKCkgb3ZlcnJpZGUgeyByZXR1cm4gRkFMU0U7IH0KKyAgRlhfQk9PTCBTdGFydFJlbmRlcmluZygpIG92ZXJyaWRlIHsgcmV0dXJuIFRSVUU7IH0KKyAgdm9pZCBFbmRSZW5kZXJpbmcoKSBvdmVycmlkZSB7fQorICB2b2lkIFNhdmVTdGF0ZSgpIG92ZXJyaWRlOworICB2b2lkIFJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQpIG92ZXJyaWRlOworICBGWF9CT09MIFNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUpIG92ZXJyaWRlOworICBGWF9CT09MIFNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUpIG92ZXJyaWRlOworICBGWF9CT09MIERyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzdHJva2VfY29sb3IsCisgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpIG92ZXJyaWRlOworICBGWF9CT09MIFNldFBpeGVsKGludCB4LAorICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9CT09MIEZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHBSZWN0LAorICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCisgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLAorICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KSBvdmVycmlkZTsKKyAgRlhfQk9PTCBHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRFZGdlID0gRkFMU0UpIG92ZXJyaWRlOworICBDRlhfRElCaXRtYXAqIEdldEJhY2tEcm9wKCkgb3ZlcnJpZGUgeyByZXR1cm4gTlVMTDsgfQorICBGWF9CT09MIFNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpIG92ZXJyaWRlOworICBGWF9CT09MIFN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9CT09MIENvbnRpbnVlRElCaXRzKHZvaWQqIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgdm9pZCBDYW5jZWxESUJpdHModm9pZCogaGFuZGxlKSBvdmVycmlkZSB7fQorICBGWF9CT09MIERyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udENhY2hlKiBwQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCkgb3ZlcnJpZGU7CisgIHZvaWQqIEdldFBsYXRmb3JtU3VyZmFjZSgpIG92ZXJyaWRlIHsgcmV0dXJuIE5VTEw7IH0KKyAgdm9pZCBDbGVhckRyaXZlcigpIG92ZXJyaWRlOworCisgcHJvdGVjdGVkOgorICB2b2lkIHNldFN0cm9rZUluZm8oY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBncmFwaFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbGluZVdpZHRoKTsKKyAgdm9pZCBzZXRGaWxsSW5mbyhGWF9BUkdCIGFyZ2IpOworICB2b2lkIHNldFBhdGhUb0NvbnRleHQoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwYXRoRGF0YSk7CisgIEZYX0ZMT0FUIGdldExpbmVXaWR0aChjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIGdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBDR0FmZmluZVRyYW5zZm9ybSBjdG0pOworICBGWF9CT09MIENHX0RyYXdHbHlwUnVuKGludCBuQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udENhY2hlKiBwQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcEdseXBoTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pOworICB2b2lkIENHX1NldEltYWdlVHJhbnNmb3JtKGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDR1JlY3QqIHJlY3QgPSBOVUxMKTsKKworIHByb3RlY3RlZDoKKyAgQ0dDb250ZXh0UmVmIF9jb250ZXh0OworICBDR0FmZmluZVRyYW5zZm9ybSBfZm94aXREZXZpY2UyVXNlcjsKKyAgQ0dBZmZpbmVUcmFuc2Zvcm0gX3VzZXIyRm94aXREZXZpY2U7CisgIGludDMyX3QgbV9zYXZlQ291bnQ7CisKKyAgaW50MzJfdCBfd2lkdGg7CisgIGludDMyX3QgX2hlaWdodDsKKyAgaW50MzJfdCBfYml0c1BlclBpeGVsOworICBpbnQzMl90IF9kZXZpY2VDbGFzczsKKyAgaW50MzJfdCBfcmVuZGVyQ2FwczsKKyAgaW50MzJfdCBfaG9yelNpemU7CisgIGludDMyX3QgX3ZlcnRTaXplOwogfTsKLUZYX1VJTlQzMiBGWF9HZXRIYXNoQ29kZSggRlhfTFBDU1RSIHBTdHIpOwotRlhfRFdPUkQgIEZYX0lPU0dldE1hdGNoRmFtaWx5TmFtZUhhc2hjb2RlKEZYX0xQQ1NUUiBwRm9udE5hbWUpOwotRlhfVUlOVDMyIEZYX0lPU0dldEZhbWlseU5hbWVzQ291bnQoKTsKLUZYX0xQQ1NUUiBGWF9JT1NHZXRGYW1pbHlOYW1lKCBGWF9VSU5UMzIgdUluZGV4KTsKKworY2xhc3MgQ0ZYX0ZvbnRQcm92aWRlciBmaW5hbCA6IHB1YmxpYyBJRlhfRmlsZVJlYWQgeworIHB1YmxpYzoKKyAgLy8gSUZYX0ZpbGVSZWFkCisgIHZvaWQgUmVsZWFzZSgpIG92ZXJyaWRlIHsgZGVsZXRlIHRoaXM7IH0KKyAgRlhfRklMRVNJWkUgR2V0U2l6ZSgpIG92ZXJyaWRlIHsgcmV0dXJuIChGWF9GSUxFU0laRSlfdG90YWxTaXplOyB9CisgIEZYX0JPT0wgSXNFT0YoKSBvdmVycmlkZSB7IHJldHVybiBfb2ZmU2V0ID09IF90b3RhbFNpemU7IH0KKyAgRlhfRklMRVNJWkUgR2V0UG9zaXRpb24oKSBvdmVycmlkZSB7IHJldHVybiAoRlhfRklMRVNJWkUpX29mZlNldDsgfQorICBGWF9CT09MIFJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICBzaXplX3QgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworCisgcHVibGljOgorICBDRlhfRm9udFByb3ZpZGVyKENHRm9udFJlZiBjZ0ZvbnQpOworICB+Q0ZYX0ZvbnRQcm92aWRlcigpIG92ZXJyaWRlOworICB2b2lkIEluaXRUYWJsZU9mZnNldCgpOworICB1bnNpZ25lZCBsb25nIFJlYWQodW5zaWduZWQgbG9uZyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50KTsKKworIHByb3RlY3RlZDoKKyAgdWludDMyX3QgQ2FsY1RhYmxlQ2hlY2tTdW0oY29uc3QgdWludDMyX3QqIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1iZXJPZkJ5dGVzSW5UYWJsZSk7CisgIHVpbnQzMl90IENhbGNUYWJsZURhdGFSZWZDaGVja1N1bShDRkRhdGFSZWYgZGF0YVJlZik7CisKKyBwcml2YXRlOgorICBDR0ZvbnRSZWYgbV9jZ0ZvbnQ7CisgIFVJbnQzMiBtX2lUYWJsZVNpemU7CisgIHNpemVfdCBfb2ZmU2V0OworICB0eXBlZGVmIHN0cnVjdCBGb250SGVhZGVyIHsKKyAgICBpbnQzMl90IGZWZXJzaW9uOworICAgIHVpbnQxNl90IGZOdW1UYWJsZXM7CisgICAgdWludDE2X3QgZlNlYXJjaFJhbmdlOworICAgIHVpbnQxNl90IGZFbnRyeVNlbGVjdG9yOworICAgIHVpbnQxNl90IGZSYW5nZVNoaWZ0OworICB9IEZvbnRIZWFkZXI7CisgIHR5cGVkZWYgc3RydWN0IFRhYmxlRW50cnkgeworICAgIHVpbnQzMl90IGZUYWc7CisgICAgdWludDMyX3QgZkNoZWNrU3VtOworICAgIHVpbnQzMl90IGZPZmZzZXQ7CisgICAgdWludDMyX3QgZkxlbmd0aDsKKyAgfSBUYWJsZUVudHJ5OworICBGb250SGVhZGVyIF9mb250SGVhZGVyOworICB1bnNpZ25lZCBjaGFyKiBfdGFibGVFbnRyaWVzOworICBzaXplX3QqIF90YWJsZU9mZnNldHM7CisgIGludCBfdGFibGVDb3VudDsKKyAgaW50IF90b3RhbFNpemU7Cit9OworCit1aW50MzJfdCBGWF9HZXRIYXNoQ29kZShjb25zdCBGWF9DSEFSKiBwU3RyKTsKK0ZYX0RXT1JEIEZYX0lPU0dldE1hdGNoRmFtaWx5TmFtZUhhc2hjb2RlKGNvbnN0IEZYX0NIQVIqIHBGb250TmFtZSk7Cit1aW50MzJfdCBGWF9JT1NHZXRGYW1pbHlOYW1lc0NvdW50KCk7Citjb25zdCBGWF9DSEFSKiBGWF9JT1NHZXRGYW1pbHlOYW1lKHVpbnQzMl90IHVJbmRleCk7CiAjZW5kaWYKIAogI2VuZGlmICAvLyBDT1JFX1NSQ19GWEdFX0FQUExFX0FQUExFX0lOVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hcHBsZS9meF9hcHBsZV9wbGF0Zm9ybS5jcHAgYi9jb3JlL3NyYy9meGdlL2FwcGxlL2Z4X2FwcGxlX3BsYXRmb3JtLmNwcAppbmRleCBhMTMzMjNkLi5mMGEyMzgyIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FwcGxlL2Z4X2FwcGxlX3BsYXRmb3JtLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2FwcGxlL2Z4X2FwcGxlX3BsYXRmb3JtLmNwcApAQCAtMSwxNzMgKzEsMTczIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X2V4dC5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhnZS9meF9nZS5oIgotI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9nZS5oIgorCisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKwogI2luY2x1ZGUgImFwcGxlX2ludC5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhnZS9meF9nZV9hcHBsZS5oIgotI2luY2x1ZGUgIi4uL2FnZy9pbmNsdWRlL2Z4ZnhfYWdnX2NsaXBfbGlhbmdfYmFyc2t5LmgiCi0jaW5jbHVkZSAiLi4vZ2UvdGV4dF9pbnQuaCIKLSNpbmNsdWRlICIuLi9kaWIvZGliX2ludC5oIgotI2luY2x1ZGUgIi4uL2FnZy9pbmNsdWRlL2Z4X2FnZ19kcml2ZXIuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLXZvaWQgQ0ZYX0FnZ0RldmljZURyaXZlcjo6SW5pdFBsYXRmb3JtKCkKLXsKLSAgICBDUXVhcnR6MkQgJiBxdWFydHoyZCA9ICgoQ0FwcGxlUGxhdGZvcm0gKikgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5fcXVhcnR6MmQ7Ci0gICAgbV9wUGxhdGZvcm1HcmFwaGljcyA9IHF1YXJ0ejJkLmNyZWF0ZUdyYXBoaWNzKG1fcEJpdG1hcCk7CisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9nZV9hcHBsZS5oIgorI2luY2x1ZGUgImNvcmUvc3JjL2Z4Z2UvYWdnL2luY2x1ZGUvZnhfYWdnX2RyaXZlci5oIgorI2luY2x1ZGUgImNvcmUvc3JjL2Z4Z2UvZGliL2RpYl9pbnQuaCIKKyNpbmNsdWRlICJjb3JlL3NyYy9meGdlL2dlL3RleHRfaW50LmgiCisKK3ZvaWQgQ0ZYX0FnZ0RldmljZURyaXZlcjo6SW5pdFBsYXRmb3JtKCkgeworICBDUXVhcnR6MkQmIHF1YXJ0ejJkID0KKyAgICAgICgoQ0FwcGxlUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+X3F1YXJ0ejJkOworICBtX3BQbGF0Zm9ybUdyYXBoaWNzID0gcXVhcnR6MmQuY3JlYXRlR3JhcGhpY3MobV9wQml0bWFwKTsKIH0KLXZvaWQgQ0ZYX0FnZ0RldmljZURyaXZlcjo6RGVzdHJveVBsYXRmb3JtKCkKLXsKLSAgICBDUXVhcnR6MkQgJiBxdWFydHoyZCA9ICgoQ0FwcGxlUGxhdGZvcm0gKikgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5fcXVhcnR6MmQ7Ci0gICAgaWYgKG1fcFBsYXRmb3JtR3JhcGhpY3MpIHsKLSAgICAgICAgcXVhcnR6MmQuZGVzdHJveUdyYXBoaWNzKG1fcFBsYXRmb3JtR3JhcGhpY3MpOwotICAgICAgICBtX3BQbGF0Zm9ybUdyYXBoaWNzID0gTlVMTDsKLSAgICB9Cit2b2lkIENGWF9BZ2dEZXZpY2VEcml2ZXI6OkRlc3Ryb3lQbGF0Zm9ybSgpIHsKKyAgQ1F1YXJ0ejJEJiBxdWFydHoyZCA9CisgICAgICAoKENBcHBsZVBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPl9xdWFydHoyZDsKKyAgaWYgKG1fcFBsYXRmb3JtR3JhcGhpY3MpIHsKKyAgICBxdWFydHoyZC5kZXN0cm95R3JhcGhpY3MobV9wUGxhdGZvcm1HcmFwaGljcyk7CisgICAgbV9wUGxhdGZvcm1HcmFwaGljcyA9IE5VTEw7CisgIH0KIH0KIHZvaWQgQ0ZYX0ZhY2VDYWNoZTo6SW5pdFBsYXRmb3JtKCkge30KIHZvaWQgQ0ZYX0ZhY2VDYWNoZTo6RGVzdHJveVBsYXRmb3JtKCkge30KLUNGWF9HbHlwaEJpdG1hcCogQ0ZYX0ZhY2VDYWNoZTo6UmVuZGVyR2x5cGhfTmF0aXZldGV4dChDRlhfRm9udCAqCQkJCXBGb250LAotICAgICAgICBGWF9EV09SRAkJCQkJZ2x5cGhfaW5kZXgsCi0gICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXggKglwTWF0cml4LAotICAgICAgICBpbnQJCQkJCQlkZXN0X3dpZHRoLAotICAgICAgICBpbnQJCQkJCQlhbnRpX2FsaWFzKQotewotICAgIHJldHVybiBOVUxMOworQ0ZYX0dseXBoQml0bWFwKiBDRlhfRmFjZUNhY2hlOjpSZW5kZXJHbHlwaF9OYXRpdmV0ZXh0KAorICAgIENGWF9Gb250KiBwRm9udCwKKyAgICBGWF9EV09SRCBnbHlwaF9pbmRleCwKKyAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgIGludCBkZXN0X3dpZHRoLAorICAgIGludCBhbnRpX2FsaWFzKSB7CisgIHJldHVybiBOVUxMOwogfQotc3RhdGljIEZYX0JPT0wgX0NHRHJhd0dseXBoUnVuKENHQ29udGV4dFJlZiAgICAgICAgICAgICAgIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogICAgICBwQ2hhclBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogICAgICAgICAgICAgICAgICBwRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udENhY2hlKiAgICAgICAgICAgICBwQ2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogICAgcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgICAgICAgICAgICAgICAgICAgZm9udF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEICAgICAgICAgICAgICAgICAgIGFyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtKQotewotICAgIGlmIChuQ2hhcnMgPT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKK3N0YXRpYyBGWF9CT09MIF9DR0RyYXdHbHlwaFJ1bihDR0NvbnRleHRSZWYgcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5DaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIGlmIChuQ2hhcnMgPT0gMCkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIENGWF9NYXRyaXggbmV3X21hdHJpeDsKKyAgRlhfQk9PTCBiTmVnU2l6ZSA9IGZvbnRfc2l6ZSA8IDA7CisgIGlmIChiTmVnU2l6ZSkgeworICAgIGZvbnRfc2l6ZSA9IC1mb250X3NpemU7CisgIH0KKyAgRlhfRkxPQVQgb3JpX3ggPSBwQ2hhclBvc1swXS5tX09yaWdpblgsIG9yaV95ID0gcENoYXJQb3NbMF0ubV9PcmlnaW5ZOworICBuZXdfbWF0cml4LlRyYW5zZm9ybShvcmlfeCwgb3JpX3kpOworICBpZiAocE9iamVjdDJEZXZpY2UpIHsKKyAgICBuZXdfbWF0cml4LkNvbmNhdCgqcE9iamVjdDJEZXZpY2UpOworICB9CisgIENRdWFydHoyRCYgcXVhcnR6MmQgPQorICAgICAgKChDQXBwbGVQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5fcXVhcnR6MmQ7CisgIGlmICghcEZvbnQtPkdldFBsYXRmb3JtRm9udCgpKSB7CisgICAgaWYgKHBGb250LT5HZXRQc05hbWUoKSA9PSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKCJERkhlaVN0ZC1XNSIpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIENGWF9BZmZpbmVNYXRyaXggbmV3X21hdHJpeDsKLSAgICBGWF9CT09MIGJOZWdTaXplID0gZm9udF9zaXplIDwgMDsKKyAgICBwRm9udC0+U2V0UGxhdGZvcm1Gb250KAorICAgICAgICBxdWFydHoyZC5DcmVhdGVGb250KHBGb250LT5HZXRGb250RGF0YSgpLCBwRm9udC0+R2V0U2l6ZSgpKSk7CisgICAgaWYgKCFwRm9udC0+R2V0UGxhdGZvcm1Gb250KCkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKyAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9XT1JELCAzMj4gZ2x5cGhfaW5kaWNlcyhuQ2hhcnMpOworICBDRlhfRml4ZWRCdWZHcm93PENHUG9pbnQsIDMyPiBnbHlwaF9wb3NpdGlvbnMobkNoYXJzKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ2hhcnM7IGkrKykgeworICAgIGdseXBoX2luZGljZXNbaV0gPSBwQ2hhclBvc1tpXS5tX0V4dEdJRDsKICAgICBpZiAoYk5lZ1NpemUpIHsKLSAgICAgICAgZm9udF9zaXplID0gLWZvbnRfc2l6ZTsKLSAgICB9Ci0gICAgRlhfRkxPQVQgb3JpX3ggPSBwQ2hhclBvc1swXS5tX09yaWdpblgsIG9yaV95ID0gcENoYXJQb3NbMF0ubV9PcmlnaW5ZOwotICAgIG5ld19tYXRyaXguVHJhbnNmb3JtKG9yaV94LCBvcmlfeSk7Ci0gICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7Ci0gICAgICAgIG5ld19tYXRyaXguQ29uY2F0KCpwT2JqZWN0MkRldmljZSk7Ci0gICAgfQotICAgIENRdWFydHoyRCYgcXVhcnR6MmQgPSAoKENBcHBsZVBsYXRmb3JtICopIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+X3F1YXJ0ejJkOwotICAgIGlmICghcEZvbnQtPm1fcFBsYXRmb3JtRm9udCkgewotICAgICAgICBpZiAocEZvbnQtPkdldFBzTmFtZSgpID09IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoIkRGSGVpU3RkLVc1IikpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBwRm9udC0+bV9wUGxhdGZvcm1Gb250ID0gcXVhcnR6MmQuQ3JlYXRlRm9udChwRm9udC0+bV9wRm9udERhdGEsIHBGb250LT5tX2R3U2l6ZSk7Ci0gICAgICAgIGlmIChOVUxMID09IHBGb250LT5tX3BQbGF0Zm9ybUZvbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBDRlhfRml4ZWRCdWZHcm93PEZYX1dPUkQsIDMyPiBnbHlwaF9pbmRpY2VzKG5DaGFycyk7Ci0gICAgQ0ZYX0ZpeGVkQnVmR3JvdzxDR1BvaW50LCAzMj4gZ2x5cGhfcG9zaXRpb25zKG5DaGFycyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ2hhcnM7IGkrKyApIHsKLSAgICAgICAgZ2x5cGhfaW5kaWNlc1tpXSA9IHBDaGFyUG9zW2ldLm1fRXh0R0lEOwotICAgICAgICBpZiAoYk5lZ1NpemUpIHsKLSAgICAgICAgICAgIGdseXBoX3Bvc2l0aW9uc1tpXS54ID0gLXBDaGFyUG9zW2ldLm1fT3JpZ2luWDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdseXBoX3Bvc2l0aW9uc1tpXS54ID0gcENoYXJQb3NbaV0ubV9PcmlnaW5YOwotICAgICAgICB9Ci0gICAgICAgIGdseXBoX3Bvc2l0aW9uc1tpXS55ID0gcENoYXJQb3NbaV0ubV9PcmlnaW5ZOwotICAgIH0KLSAgICBpZiAoYk5lZ1NpemUpIHsKLSAgICAgICAgbmV3X21hdHJpeC5hID0gLW5ld19tYXRyaXguYTsKKyAgICAgIGdseXBoX3Bvc2l0aW9uc1tpXS54ID0gLXBDaGFyUG9zW2ldLm1fT3JpZ2luWDsKICAgICB9IGVsc2UgewotICAgICAgICBuZXdfbWF0cml4LmIgPSAtbmV3X21hdHJpeC5iOwotICAgICAgICBuZXdfbWF0cml4LmQgPSAtbmV3X21hdHJpeC5kOworICAgICAgZ2x5cGhfcG9zaXRpb25zW2ldLnggPSBwQ2hhclBvc1tpXS5tX09yaWdpblg7CiAgICAgfQotICAgIHF1YXJ0ejJkLnNldEdyYXBoaWNzVGV4dE1hdHJpeChwQ29udGV4dCwgJm5ld19tYXRyaXgpOwotICAgIHJldHVybiBxdWFydHoyZC5kcmF3R3JhcGhpY3NTdHJpbmcocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9udC0+bV9wUGxhdGZvcm1Gb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kaWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX3Bvc2l0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICBnbHlwaF9wb3NpdGlvbnNbaV0ueSA9IHBDaGFyUG9zW2ldLm1fT3JpZ2luWTsKKyAgfQorICBpZiAoYk5lZ1NpemUpIHsKKyAgICBuZXdfbWF0cml4LmEgPSAtbmV3X21hdHJpeC5hOworICB9IGVsc2UgeworICAgIG5ld19tYXRyaXguYiA9IC1uZXdfbWF0cml4LmI7CisgICAgbmV3X21hdHJpeC5kID0gLW5ld19tYXRyaXguZDsKKyAgfQorICBxdWFydHoyZC5zZXRHcmFwaGljc1RleHRNYXRyaXgocENvbnRleHQsICZuZXdfbWF0cml4KTsKKyAgcmV0dXJuIHF1YXJ0ejJkLmRyYXdHcmFwaGljc1N0cmluZyhwQ29udGV4dCwgcEZvbnQtPkdldFBsYXRmb3JtRm9udCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRfc2l6ZSwgZ2x5cGhfaW5kaWNlcywgZ2x5cGhfcG9zaXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFycywgYXJnYiwgTlVMTCk7CiB9Ci1zdGF0aWMgdm9pZCBfRG9Ob3RoaW5nKHZvaWQgKmluZm8sIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7fQotRlhfQk9PTCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpEcmF3RGV2aWNlVGV4dChpbnQJCQkJCQkgbkNoYXJzLAotICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyAqCSBwQ2hhclBvcywKLSAgICAgICAgQ0ZYX0ZvbnQgKgkJCQkgcEZvbnQsCi0gICAgICAgIENGWF9Gb250Q2FjaGUgKgkJCSBwQ2FjaGUsCi0gICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXggKiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgRlhfRkxPQVQJCQkJIGZvbnRfc2l6ZSwKLSAgICAgICAgRlhfRFdPUkQJCQkJIGFyZ2IsCi0gICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIGlmICghcEZvbnQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworc3RhdGljIHZvaWQgX0RvTm90aGluZyh2b2lkKiBpbmZvLCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkge30KK0ZYX0JPT0wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6RHJhd0RldmljZVRleHQoaW50IG5DaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgaWYgKCFwRm9udCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9CT09MIGJCb2xkID0gcEZvbnQtPklzQm9sZCgpOworICBpZiAoIWJCb2xkICYmIHBGb250LT5HZXRTdWJzdEZvbnQoKSAmJgorICAgICAgcEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX1dlaWdodCA+PSA1MDAgJiYKKyAgICAgIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9XZWlnaHQgPD0gNjAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNoYXJzOyBpKyspIHsKKyAgICBpZiAocENoYXJQb3NbaV0ubV9iR2x5cGhBZGp1c3QpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgRlhfQk9PTCBiQm9sZCA9IHBGb250LT5Jc0JvbGQoKTsKLSAgICBpZiAoIWJCb2xkICYmIHBGb250LT5HZXRTdWJzdEZvbnQoKSAmJgotICAgICAgICAgICAgcEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX1dlaWdodCA+PSA1MDAgJiYKLSAgICAgICAgICAgIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9XZWlnaHQgPD0gNjAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDR0NvbnRleHRSZWYgY3R4ID0gQ0dDb250ZXh0UmVmKG1fcFBsYXRmb3JtR3JhcGhpY3MpOworICBpZiAoTlVMTCA9PSBjdHgpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShjdHgpOworICBDR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGUoY3R4LCBrQ0dUZXh0RmlsbENsaXApOworICBDR1JlY3QgcmVjdF9jZzsKKyAgQ0dJbWFnZVJlZiBwSW1hZ2VDRyA9IE5VTEw7CisgIGlmIChtX3BDbGlwUmduKSB7CisgICAgcmVjdF9jZyA9CisgICAgICAgIENHUmVjdE1ha2UobV9wQ2xpcFJnbi0+R2V0Qm94KCkubGVmdCwgbV9wQ2xpcFJnbi0+R2V0Qm94KCkudG9wLAorICAgICAgICAgICAgICAgICAgIG1fcENsaXBSZ24tPkdldEJveCgpLldpZHRoKCksIG1fcENsaXBSZ24tPkdldEJveCgpLkhlaWdodCgpKTsKKyAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBDbGlwTWFzayA9IG1fcENsaXBSZ24tPkdldE1hc2soKTsKKyAgICBpZiAocENsaXBNYXNrKSB7CisgICAgICBDR0RhdGFQcm92aWRlclJlZiBwQ2xpcE1hc2tEYXRhUHJvdmlkZXIgPSBDR0RhdGFQcm92aWRlckNyZWF0ZVdpdGhEYXRhKAorICAgICAgICAgIE5VTEwsIHBDbGlwTWFzay0+R2V0QnVmZmVyKCksCisgICAgICAgICAgcENsaXBNYXNrLT5HZXRQaXRjaCgpICogcENsaXBNYXNrLT5HZXRIZWlnaHQoKSwgX0RvTm90aGluZyk7CisgICAgICBDR0Zsb2F0IGRlY29kZV9mWzJdID0gezI1NS5mLCAwLmZ9OworICAgICAgcEltYWdlQ0cgPSBDR0ltYWdlTWFza0NyZWF0ZSgKKyAgICAgICAgICBwQ2xpcE1hc2stPkdldFdpZHRoKCksIHBDbGlwTWFzay0+R2V0SGVpZ2h0KCksIDgsIDgsCisgICAgICAgICAgcENsaXBNYXNrLT5HZXRQaXRjaCgpLCBwQ2xpcE1hc2tEYXRhUHJvdmlkZXIsIGRlY29kZV9mLCBGQUxTRSk7CisgICAgICBDR0RhdGFQcm92aWRlclJlbGVhc2UocENsaXBNYXNrRGF0YVByb3ZpZGVyKTsKICAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ2hhcnM7IGkgKyspIHsKLSAgICAgICAgaWYgKHBDaGFyUG9zW2ldLm1fYkdseXBoQWRqdXN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQ0dDb250ZXh0UmVmIGN0eCA9IENHQ29udGV4dFJlZihtX3BQbGF0Zm9ybUdyYXBoaWNzKTsKLSAgICBpZiAoTlVMTCA9PSBjdHgpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGN0eCk7Ci0gICAgQ0dDb250ZXh0U2V0VGV4dERyYXdpbmdNb2RlKGN0eCwga0NHVGV4dEZpbGxDbGlwKTsKLSAgICBDR1JlY3QgcmVjdF9jZzsKLSAgICBDR0ltYWdlUmVmIHBJbWFnZUNHID0gTlVMTDsKLSAgICBpZiAobV9wQ2xpcFJnbikgewotICAgICAgICByZWN0X2NnID0gQ0dSZWN0TWFrZShtX3BDbGlwUmduLT5HZXRCb3goKS5sZWZ0LCBtX3BDbGlwUmduLT5HZXRCb3goKS50b3AsIG1fcENsaXBSZ24tPkdldEJveCgpLldpZHRoKCksIG1fcENsaXBSZ24tPkdldEJveCgpLkhlaWdodCgpKTsKLSAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKglwQ2xpcE1hc2sgPSBtX3BDbGlwUmduLT5HZXRNYXNrKCk7Ci0gICAgICAgIGlmIChwQ2xpcE1hc2spIHsKLSAgICAgICAgICAgIENHRGF0YVByb3ZpZGVyUmVmIHBDbGlwTWFza0RhdGFQcm92aWRlciA9IENHRGF0YVByb3ZpZGVyQ3JlYXRlV2l0aERhdGEoTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgcENsaXBNYXNrLT5HZXRCdWZmZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgcENsaXBNYXNrLT5HZXRQaXRjaCgpICogcENsaXBNYXNrLT5HZXRIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgX0RvTm90aGluZyk7Ci0gICAgICAgICAgICBDR0Zsb2F0IGRlY29kZV9mWzJdID0gezI1NS5mLCAwLmZ9OwotICAgICAgICAgICAgcEltYWdlQ0cgPSBDR0ltYWdlTWFza0NyZWF0ZShwQ2xpcE1hc2stPkdldFdpZHRoKCksIHBDbGlwTWFzay0+R2V0SGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsIDgsIHBDbGlwTWFzay0+R2V0UGl0Y2goKSwgcENsaXBNYXNrRGF0YVByb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfZiwgRkFMU0UpOwotICAgICAgICAgICAgQ0dEYXRhUHJvdmlkZXJSZWxlYXNlKHBDbGlwTWFza0RhdGFQcm92aWRlcik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICByZWN0X2NnID0gQ0dSZWN0TWFrZSgwLCAwLCBtX3BCaXRtYXAtPkdldFdpZHRoKCksIG1fcEJpdG1hcC0+R2V0SGVpZ2h0KCkpOwotICAgIH0KLSAgICByZWN0X2NnID0gQ0dDb250ZXh0Q29udmVydFJlY3RUb0RldmljZVNwYWNlKGN0eCwgcmVjdF9jZyk7Ci0gICAgaWYgKHBJbWFnZUNHKSB7Ci0gICAgICAgIENHQ29udGV4dENsaXBUb01hc2soY3R4LCByZWN0X2NnLCBwSW1hZ2VDRyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQ0dDb250ZXh0Q2xpcFRvUmVjdChjdHgsIHJlY3RfY2cpOwotICAgIH0KLSAgICBGWF9CT09MIHJldCA9IF9DR0RyYXdHbHlwaFJ1bihjdHgsIG5DaGFycywgcENoYXJQb3MsIHBGb250LCBwQ2FjaGUsIHBPYmplY3QyRGV2aWNlLCBmb250X3NpemUsIGFyZ2IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwotICAgIGlmIChwSW1hZ2VDRykgewotICAgICAgICBDR0ltYWdlUmVsZWFzZShwSW1hZ2VDRyk7Ci0gICAgfQotICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY3R4KTsKLSAgICByZXR1cm4gcmV0OworICB9IGVsc2UgeworICAgIHJlY3RfY2cgPSBDR1JlY3RNYWtlKDAsIDAsIG1fcEJpdG1hcC0+R2V0V2lkdGgoKSwgbV9wQml0bWFwLT5HZXRIZWlnaHQoKSk7CisgIH0KKyAgcmVjdF9jZyA9IENHQ29udGV4dENvbnZlcnRSZWN0VG9EZXZpY2VTcGFjZShjdHgsIHJlY3RfY2cpOworICBpZiAocEltYWdlQ0cpIHsKKyAgICBDR0NvbnRleHRDbGlwVG9NYXNrKGN0eCwgcmVjdF9jZywgcEltYWdlQ0cpOworICB9IGVsc2UgeworICAgIENHQ29udGV4dENsaXBUb1JlY3QoY3R4LCByZWN0X2NnKTsKKyAgfQorICBGWF9CT09MIHJldCA9CisgICAgICBfQ0dEcmF3R2x5cGhSdW4oY3R4LCBuQ2hhcnMsIHBDaGFyUG9zLCBwRm9udCwgcENhY2hlLCBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICBmb250X3NpemUsIGFyZ2IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOworICBpZiAocEltYWdlQ0cpIHsKKyAgICBDR0ltYWdlUmVsZWFzZShwSW1hZ2VDRyk7CisgIH0KKyAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShjdHgpOworICByZXR1cm4gcmV0OwogfQotdm9pZCBDRlhfRm9udDo6UmVsZWFzZVBsYXRmb3JtUmVzb3VyY2UoKQotewotICAgIGlmIChtX3BQbGF0Zm9ybUZvbnQpIHsKLSAgICAgICAgQ1F1YXJ0ejJEICYgcXVhcnR6MmQgPSAoKENBcHBsZVBsYXRmb3JtICopIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+X3F1YXJ0ejJkOwotICAgICAgICBxdWFydHoyZC5EZXN0cm95Rm9udChtX3BQbGF0Zm9ybUZvbnQpOwotICAgICAgICBtX3BQbGF0Zm9ybUZvbnQgPSBOVUxMOwotICAgIH0KK3ZvaWQgQ0ZYX0ZvbnQ6OlJlbGVhc2VQbGF0Zm9ybVJlc291cmNlKCkgeworICBpZiAobV9wUGxhdGZvcm1Gb250KSB7CisgICAgQ1F1YXJ0ejJEJiBxdWFydHoyZCA9CisgICAgICAgICgoQ0FwcGxlUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+X3F1YXJ0ejJkOworICAgIHF1YXJ0ejJkLkRlc3Ryb3lGb250KG1fcFBsYXRmb3JtRm9udCk7CisgICAgbV9wUGxhdGZvcm1Gb250ID0gTlVMTDsKKyAgfQogfQotI2VuZGlmCi0jZW5kaWYKKworI2VuZGlmICAvLyBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvZnhfbWFjX2ltcC5jcHAgYi9jb3JlL3NyYy9meGdlL2FwcGxlL2Z4X21hY19pbXAuY3BwCmluZGV4IDc1NDg5ZWEuLjE2NmQzYjQgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvZnhfbWFjX2ltcC5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9hcHBsZS9meF9tYWNfaW1wLmNwcApAQCAtMSwxNyArMSwxNyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGdlL2Z4X2dlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKICNpbmNsdWRlICJhcHBsZV9pbnQuaCIKKwogI2lmIF9GWF9PU18gPT0gX0ZYX01BQ09TWF8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewotICAgIEZYX0xQQ1NUUgltX3BOYW1lOwotICAgIEZYX0xQQ1NUUgltX3BTdWJzdE5hbWU7Ci19Ci1CYXNlMTRTdWJzdHNbXSA9IHsKKyAgY29uc3QgRlhfQ0hBUiogbV9wTmFtZTsKKyAgY29uc3QgRlhfQ0hBUiogbV9wU3Vic3ROYW1lOworfSBCYXNlMTRTdWJzdHNbXSA9IHsKICAgICB7IkNvdXJpZXIiLCAiQ291cmllciBOZXcifSwKICAgICB7IkNvdXJpZXItQm9sZCIsICJDb3VyaWVyIE5ldyBCb2xkIn0sCiAgICAgeyJDb3VyaWVyLUJvbGRPYmxpcXVlIiwgIkNvdXJpZXIgTmV3IEJvbGQgSXRhbGljIn0sCkBAIC0yNSw4NCArMjUsODkgQEAKICAgICB7IlRpbWVzLUJvbGRJdGFsaWMiLCAiVGltZXMgTmV3IFJvbWFuIEJvbGQgSXRhbGljIn0sCiAgICAgeyJUaW1lcy1JdGFsaWMiLCAiVGltZXMgTmV3IFJvbWFuIEl0YWxpYyJ9LAogfTsKLWNsYXNzIENGWF9NYWNGb250SW5mbyA6IHB1YmxpYyBDRlhfRm9sZGVyRm9udEluZm8KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQqCQlNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIEZYX0xQQ1NUUiBmYW1pbHksIEZYX0JPT0wmIGJFeGFjdCk7CitjbGFzcyBDRlhfTWFjRm9udEluZm8gOiBwdWJsaWMgQ0ZYX0ZvbGRlckZvbnRJbmZvIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCogTWFwRm9udChpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXRhbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBpRXhhY3QpOwogfTsKICNkZWZpbmUgSkFQQU5fR09USElDICJIaXJhZ2lubyBLYWt1IEdvdGhpYyBQcm8gVzYiCiAjZGVmaW5lIEpBUEFOX01JTkNITyAiSGlyYWdpbm8gTWluY2hvIFBybyBXNiIKLXN0YXRpYyB2b2lkIEdldEphcGFuZXNlUHJlZmVyZW5jZShDRlhfQnl0ZVN0cmluZyYgZmFjZSwgaW50IHdlaWdodCwgaW50IHBpY3RoX2ZhbWlseSkKLXsKLSAgICBpZiAoZmFjZS5GaW5kKCJHb3RoaWMiKSA+PSAwKSB7Ci0gICAgICAgIGZhY2UgPSBKQVBBTl9HT1RISUM7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCEocGljdGhfZmFtaWx5ICYgRlhGT05UX0ZGX1JPTUFOKSAmJiB3ZWlnaHQgPiA0MDApIHsKLSAgICAgICAgZmFjZSA9IEpBUEFOX0dPVEhJQzsKLSAgICB9IGVsc2UgewotICAgICAgICBmYWNlID0gSkFQQU5fTUlOQ0hPOwotICAgIH0KK3N0YXRpYyB2b2lkIEdldEphcGFuZXNlUHJlZmVyZW5jZShDRlhfQnl0ZVN0cmluZyYgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaWN0aF9mYW1pbHkpIHsKKyAgaWYgKGZhY2UuRmluZCgiR290aGljIikgPj0gMCkgeworICAgIGZhY2UgPSBKQVBBTl9HT1RISUM7CisgICAgcmV0dXJuOworICB9CisgIGlmICghKHBpY3RoX2ZhbWlseSAmIEZYRk9OVF9GRl9ST01BTikgJiYgd2VpZ2h0ID4gNDAwKSB7CisgICAgZmFjZSA9IEpBUEFOX0dPVEhJQzsKKyAgfSBlbHNlIHsKKyAgICBmYWNlID0gSkFQQU5fTUlOQ0hPOworICB9CiB9Ci12b2lkKiBDRlhfTWFjRm9udEluZm86Ok1hcEZvbnQoaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgRlhfTFBDU1RSIGNzdHJfZmFjZSwgRlhfQk9PTCYgYkV4YWN0KQotewotICAgIENGWF9CeXRlU3RyaW5nIGZhY2UgPSBjc3RyX2ZhY2U7Ci0gICAgaW50IGlCYXNlRm9udDsKLSAgICBmb3IgKGlCYXNlRm9udCA9IDA7IGlCYXNlRm9udCA8IDEyOyBpQmFzZUZvbnQgKyspCi0gICAgICAgIGlmIChmYWNlID09IENGWF9CeXRlU3RyaW5nQyhCYXNlMTRTdWJzdHNbaUJhc2VGb250XS5tX3BOYW1lKSkgewotICAgICAgICAgICAgZmFjZSA9IEJhc2UxNFN1YnN0c1tpQmFzZUZvbnRdLm1fcFN1YnN0TmFtZTsKLSAgICAgICAgICAgIGJFeGFjdCA9IFRSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIGlmIChpQmFzZUZvbnQgPCAxMikgewotICAgICAgICByZXR1cm4gR2V0Rm9udChmYWNlKTsKK3ZvaWQqIENGWF9NYWNGb250SW5mbzo6TWFwRm9udChpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGNzdHJfZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGlFeGFjdCkgeworICBDRlhfQnl0ZVN0cmluZyBmYWNlID0gY3N0cl9mYWNlOworICBpbnQgaUJhc2VGb250OworICBmb3IgKGlCYXNlRm9udCA9IDA7IGlCYXNlRm9udCA8IDEyOyBpQmFzZUZvbnQrKykKKyAgICBpZiAoZmFjZSA9PSBDRlhfQnl0ZVN0cmluZ0MoQmFzZTE0U3Vic3RzW2lCYXNlRm9udF0ubV9wTmFtZSkpIHsKKyAgICAgIGZhY2UgPSBCYXNlMTRTdWJzdHNbaUJhc2VGb250XS5tX3BTdWJzdE5hbWU7CisgICAgICBpRXhhY3QgPSBUUlVFOworICAgICAgYnJlYWs7CiAgICAgfQotICAgIEZYX0xQVk9JRCBwOwotICAgIGlmIChtX0ZvbnRMaXN0Lkxvb2t1cChmYWNlLCBwKSkgewotICAgICAgICByZXR1cm4gcDsKLSAgICB9Ci0gICAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX0FOU0lfQ0hBUlNFVCAmJiAocGl0Y2hfZmFtaWx5ICYgRlhGT05UX0ZGX0ZJWEVEUElUQ0gpKSB7Ci0gICAgICAgIHJldHVybiBHZXRGb250KCJDb3VyaWVyIE5ldyIpOwotICAgIH0KLSAgICBpZiAoY2hhcnNldCA9PSBGWEZPTlRfQU5TSV9DSEFSU0VUIHx8IGNoYXJzZXQgPT0gRlhGT05UX1NZTUJPTF9DSEFSU0VUKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBzd2l0Y2ggKGNoYXJzZXQpIHsKLSAgICAgICAgY2FzZSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVDoKLSAgICAgICAgICAgIEdldEphcGFuZXNlUHJlZmVyZW5jZShmYWNlLCB3ZWlnaHQsIHBpdGNoX2ZhbWlseSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQ6Ci0gICAgICAgICAgICBmYWNlID0gIlNUU29uZyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWEZPTlRfSEFOR0VVTF9DSEFSU0VUOgotICAgICAgICAgICAgZmFjZSA9ICJBcHBsZU15dW5nam8iOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQ6Ci0gICAgICAgICAgICBmYWNlID0gIkxpU29uZyBQcm8gTGlnaHQiOwotICAgIH0KLSAgICBpZiAobV9Gb250TGlzdC5Mb29rdXAoZmFjZSwgcCkpIHsKLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgfQorICBpZiAoaUJhc2VGb250IDwgMTIpIHsKKyAgICByZXR1cm4gR2V0Rm9udChmYWNlKTsKKyAgfQorICBhdXRvIGl0ID0gbV9Gb250TGlzdC5maW5kKGZhY2UpOworICBpZiAoaXQgIT0gbV9Gb250TGlzdC5lbmQoKSkKKyAgICByZXR1cm4gaXQtPnNlY29uZDsKKworICBpZiAoY2hhcnNldCA9PSBGWEZPTlRfQU5TSV9DSEFSU0VUICYmIChwaXRjaF9mYW1pbHkgJiBGWEZPTlRfRkZfRklYRURQSVRDSCkpIHsKKyAgICByZXR1cm4gR2V0Rm9udCgiQ291cmllciBOZXciKTsKKyAgfQorICBpZiAoY2hhcnNldCA9PSBGWEZPTlRfQU5TSV9DSEFSU0VUIHx8IGNoYXJzZXQgPT0gRlhGT05UX1NZTUJPTF9DSEFSU0VUKSB7CiAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgc3dpdGNoIChjaGFyc2V0KSB7CisgICAgY2FzZSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVDoKKyAgICAgIEdldEphcGFuZXNlUHJlZmVyZW5jZShmYWNlLCB3ZWlnaHQsIHBpdGNoX2ZhbWlseSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRk9OVF9HQjIzMTJfQ0hBUlNFVDoKKyAgICAgIGZhY2UgPSAiU1RTb25nIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhGT05UX0hBTkdFVUxfQ0hBUlNFVDoKKyAgICAgIGZhY2UgPSAiQXBwbGVNeXVuZ2pvIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQ6CisgICAgICBmYWNlID0gIkxpU29uZyBQcm8gTGlnaHQiOworICB9CisgIGl0ID0gbV9Gb250TGlzdC5maW5kKGZhY2UpOworICBpZiAoaXQgIT0gbV9Gb250TGlzdC5lbmQoKSkKKyAgICByZXR1cm4gaXQtPnNlY29uZDsKKworICByZXR1cm4gTlVMTDsKIH0KLUlGWF9TeXN0ZW1Gb250SW5mbyogSUZYX1N5c3RlbUZvbnRJbmZvOjpDcmVhdGVEZWZhdWx0KCkKLXsKLSAgICBDRlhfTWFjRm9udEluZm8qIHBJbmZvID0gbmV3IENGWF9NYWNGb250SW5mbzsKLSAgICBwSW5mby0+QWRkUGF0aCgifi9MaWJyYXJ5L0ZvbnRzIik7Ci0gICAgcEluZm8tPkFkZFBhdGgoIi9MaWJyYXJ5L0ZvbnRzIik7Ci0gICAgcEluZm8tPkFkZFBhdGgoIi9TeXN0ZW0vTGlicmFyeS9Gb250cyIpOwotICAgIHJldHVybiBwSW5mbzsKK0lGWF9TeXN0ZW1Gb250SW5mbyogSUZYX1N5c3RlbUZvbnRJbmZvOjpDcmVhdGVEZWZhdWx0KGNvbnN0IGNoYXIqKiBwVW51c2VkKSB7CisgIENGWF9NYWNGb250SW5mbyogcEluZm8gPSBuZXcgQ0ZYX01hY0ZvbnRJbmZvOworICBwSW5mby0+QWRkUGF0aCgifi9MaWJyYXJ5L0ZvbnRzIik7CisgIHBJbmZvLT5BZGRQYXRoKCIvTGlicmFyeS9Gb250cyIpOworICBwSW5mby0+QWRkUGF0aCgiL1N5c3RlbS9MaWJyYXJ5L0ZvbnRzIik7CisgIHJldHVybiBwSW5mbzsKIH0KLXZvaWQgQ0ZYX0dFTW9kdWxlOjpJbml0UGxhdGZvcm0oKQotewotICAgIG1fcFBsYXRmb3JtRGF0YSA9IG5ldyBDQXBwbGVQbGF0Zm9ybTsKLSAgICBtX3BGb250TWdyLT5TZXRTeXN0ZW1Gb250SW5mbyhJRlhfU3lzdGVtRm9udEluZm86OkNyZWF0ZURlZmF1bHQoKSk7Cit2b2lkIENGWF9HRU1vZHVsZTo6SW5pdFBsYXRmb3JtKCkgeworICBtX3BQbGF0Zm9ybURhdGEgPSBuZXcgQ0FwcGxlUGxhdGZvcm07CisgIG1fcEZvbnRNZ3ItPlNldFN5c3RlbUZvbnRJbmZvKElGWF9TeXN0ZW1Gb250SW5mbzo6Q3JlYXRlRGVmYXVsdChudWxscHRyKSk7CiB9Ci12b2lkIENGWF9HRU1vZHVsZTo6RGVzdHJveVBsYXRmb3JtKCkKLXsKLSAgICBpZiAobV9wUGxhdGZvcm1EYXRhKSB7Ci0gICAgICAgIGRlbGV0ZSAoQ0FwcGxlUGxhdGZvcm0gKikgbV9wUGxhdGZvcm1EYXRhOwotICAgIH0KLSAgICBtX3BQbGF0Zm9ybURhdGEgPSBOVUxMOwordm9pZCBDRlhfR0VNb2R1bGU6OkRlc3Ryb3lQbGF0Zm9ybSgpIHsKKyAgZGVsZXRlIChDQXBwbGVQbGF0Zm9ybSopbV9wUGxhdGZvcm1EYXRhOworICBtX3BQbGF0Zm9ybURhdGEgPSBOVUxMOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FwcGxlL2Z4X3F1YXJ0el9kZXZpY2UuY3BwIGIvY29yZS9zcmMvZnhnZS9hcHBsZS9meF9xdWFydHpfZGV2aWNlLmNwcAppbmRleCBmN2ZhZWUxLi4wYjE5NDM4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2FwcGxlL2Z4X3F1YXJ0el9kZXZpY2UuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvYXBwbGUvZnhfcXVhcnR6X2RldmljZS5jcHAKQEAgLTEsMTEyOCArMSwxMDQ4IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X2V4dC5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhnZS9meF9nZS5oIgotI2luY2x1ZGUgIi4uL2FnZy9pbmNsdWRlL2Z4ZnhfYWdnX2NsaXBfbGlhbmdfYmFyc2t5LmgiCi0jaW5jbHVkZSAiLi4vZ2UvdGV4dF9pbnQuaCIKLSNpbmNsdWRlICIuLi9kaWIvZGliX2ludC5oIgotI2luY2x1ZGUgIi4uL2FnZy9pbmNsdWRlL2Z4X2FnZ19kcml2ZXIuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfZXh0LmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9nZS5oIgorI2luY2x1ZGUgImNvcmUvc3JjL2Z4Z2UvYWdnL2luY2x1ZGUvZnhfYWdnX2RyaXZlci5oIgorI2luY2x1ZGUgImNvcmUvc3JjL2Z4Z2UvZGliL2RpYl9pbnQuaCIKKyNpbmNsdWRlICJjb3JlL3NyYy9meGdlL2dlL3RleHRfaW50LmgiCisKKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwogI2luY2x1ZGUgImFwcGxlX2ludC5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhnZS9meF9nZV9hcHBsZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2dlX2FwcGxlLmgiCiAjaWZuZGVmIENHRkxPQVRfSVNfRE9VQkxFCiAjZXJyb3IgRXhwZWN0ZWQgQ0dGTE9BVF9JU19ET1VCTEUgdG8gYmUgZGVmaW5lZCBieSBDb3JlR3JhcGhpY3MgaGVhZGVycwogI2VuZGlmCi12b2lkKiBDUXVhcnR6MkQ6OmNyZWF0ZUdyYXBoaWNzKENGWF9ESUJpdG1hcCogcEJpdG1hcCkKLXsKLSAgICBpZiAoIXBCaXRtYXApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENHQml0bWFwSW5mbyBibXBJbmZvID0ga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGU7Ci0gICAgc3dpdGNoIChwQml0bWFwLT5HZXRGb3JtYXQoKSkgewotICAgICAgICBjYXNlIEZYRElCX1JnYjMyOgotICAgICAgICAgICAgYm1wSW5mbyB8PSBrQ0dJbWFnZUFscGhhTm9uZVNraXBGaXJzdDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCX0FyZ2I6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ0dDb2xvclNwYWNlUmVmIGNvbG9yU3BhY2UgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKLSAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZShwQml0bWFwLT5HZXRCdWZmZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAtPkdldFdpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwLT5HZXRIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwLT5HZXRQaXRjaCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JTcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcEluZm8pOwotICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoY29sb3JTcGFjZSk7Ci0gICAgcmV0dXJuIGNvbnRleHQ7CisKK3ZvaWQqIENRdWFydHoyRDo6Y3JlYXRlR3JhcGhpY3MoQ0ZYX0RJQml0bWFwKiBwQml0bWFwKSB7CisgIGlmICghcEJpdG1hcCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENHQml0bWFwSW5mbyBibXBJbmZvID0ga0NHQml0bWFwQnl0ZU9yZGVyMzJMaXR0bGU7CisgIHN3aXRjaCAocEJpdG1hcC0+R2V0Rm9ybWF0KCkpIHsKKyAgICBjYXNlIEZYRElCX1JnYjMyOgorICAgICAgYm1wSW5mbyB8PSBrQ0dJbWFnZUFscGhhTm9uZVNraXBGaXJzdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfQXJnYjoKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ0dDb2xvclNwYWNlUmVmIGNvbG9yU3BhY2UgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKKyAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBDR0JpdG1hcENvbnRleHRDcmVhdGUoCisgICAgICBwQml0bWFwLT5HZXRCdWZmZXIoKSwgcEJpdG1hcC0+R2V0V2lkdGgoKSwgcEJpdG1hcC0+R2V0SGVpZ2h0KCksIDgsCisgICAgICBwQml0bWFwLT5HZXRQaXRjaCgpLCBjb2xvclNwYWNlLCBibXBJbmZvKTsKKyAgQ0dDb2xvclNwYWNlUmVsZWFzZShjb2xvclNwYWNlKTsKKyAgcmV0dXJuIGNvbnRleHQ7CiB9Ci12b2lkIENRdWFydHoyRDo6ZGVzdHJveUdyYXBoaWNzKHZvaWQqIGdyYXBoaWNzKQotewotICAgIGlmIChncmFwaGljcykgewotICAgICAgICBDR0NvbnRleHRSZWxlYXNlKChDR0NvbnRleHRSZWYpIGdyYXBoaWNzKTsKLSAgICB9Cit2b2lkIENRdWFydHoyRDo6ZGVzdHJveUdyYXBoaWNzKHZvaWQqIGdyYXBoaWNzKSB7CisgIGlmIChncmFwaGljcykgeworICAgIENHQ29udGV4dFJlbGVhc2UoKENHQ29udGV4dFJlZilncmFwaGljcyk7CisgIH0KIH0KLXZvaWQqIENRdWFydHoyRDo6Q3JlYXRlRm9udChGWF9MUENCWVRFIHBGb250RGF0YSwgRlhfRFdPUkQgZHdGb250U2l6ZSkKLXsKLSAgICBDR0RhdGFQcm92aWRlclJlZiBwRGF0YVByb3ZpZGVyID0gQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRoRGF0YShOVUxMLCBwRm9udERhdGEsIChzaXplX3QpZHdGb250U2l6ZSwgTlVMTCk7Ci0gICAgaWYgKE5VTEwgPT0gcERhdGFQcm92aWRlcikgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ0dGb250UmVmIHBDR0ZvbnQgPSBDR0ZvbnRDcmVhdGVXaXRoRGF0YVByb3ZpZGVyKHBEYXRhUHJvdmlkZXIpOwotICAgIENHRGF0YVByb3ZpZGVyUmVsZWFzZShwRGF0YVByb3ZpZGVyKTsKLSAgICByZXR1cm4gcENHRm9udDsKK3ZvaWQqIENRdWFydHoyRDo6Q3JlYXRlRm9udChjb25zdCB1aW50OF90KiBwRm9udERhdGEsIEZYX0RXT1JEIGR3Rm9udFNpemUpIHsKKyAgQ0dEYXRhUHJvdmlkZXJSZWYgcERhdGFQcm92aWRlciA9CisgICAgICBDR0RhdGFQcm92aWRlckNyZWF0ZVdpdGhEYXRhKE5VTEwsIHBGb250RGF0YSwgKHNpemVfdClkd0ZvbnRTaXplLCBOVUxMKTsKKyAgaWYgKE5VTEwgPT0gcERhdGFQcm92aWRlcikgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENHRm9udFJlZiBwQ0dGb250ID0gQ0dGb250Q3JlYXRlV2l0aERhdGFQcm92aWRlcihwRGF0YVByb3ZpZGVyKTsKKyAgQ0dEYXRhUHJvdmlkZXJSZWxlYXNlKHBEYXRhUHJvdmlkZXIpOworICByZXR1cm4gcENHRm9udDsKIH0KLXZvaWQgQ1F1YXJ0ejJEOjpEZXN0cm95Rm9udCh2b2lkKiBwRm9udCkKLXsKLSAgICBDR0ZvbnRSZWxlYXNlKChDR0ZvbnRSZWYpcEZvbnQpOwordm9pZCBDUXVhcnR6MkQ6OkRlc3Ryb3lGb250KHZvaWQqIHBGb250KSB7CisgIENHRm9udFJlbGVhc2UoKENHRm9udFJlZilwRm9udCk7CiB9Ci12b2lkIENRdWFydHoyRDo6c2V0R3JhcGhpY3NUZXh0TWF0cml4KHZvaWQqIGdyYXBoaWNzLCBDRlhfQWZmaW5lTWF0cml4KiBtYXRyaXgpCi17Ci0gICAgaWYgKCFncmFwaGljcyB8fCAhbWF0cml4KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSAoQ0dDb250ZXh0UmVmKSBncmFwaGljczsKLSAgICBDR0Zsb2F0IHR5ID0gQ0dCaXRtYXBDb250ZXh0R2V0SGVpZ2h0KGNvbnRleHQpIC0gbWF0cml4LT5mOwotICAgIENHQ29udGV4dFNldFRleHRNYXRyaXgoY29udGV4dCwgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlKG1hdHJpeC0+YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeC0+YiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeC0+YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeC0+ZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeC0+ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5KSk7Cit2b2lkIENRdWFydHoyRDo6c2V0R3JhcGhpY3NUZXh0TWF0cml4KHZvaWQqIGdyYXBoaWNzLCBDRlhfTWF0cml4KiBtYXRyaXgpIHsKKyAgaWYgKCFncmFwaGljcyB8fCAhbWF0cml4KSB7CisgICAgcmV0dXJuOworICB9CisgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gKENHQ29udGV4dFJlZilncmFwaGljczsKKyAgQ0dGbG9hdCB0eSA9IENHQml0bWFwQ29udGV4dEdldEhlaWdodChjb250ZXh0KSAtIG1hdHJpeC0+ZjsKKyAgQ0dDb250ZXh0U2V0VGV4dE1hdHJpeCgKKyAgICAgIGNvbnRleHQsIENHQWZmaW5lVHJhbnNmb3JtTWFrZShtYXRyaXgtPmEsIG1hdHJpeC0+YiwgbWF0cml4LT5jLCBtYXRyaXgtPmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LT5lLCB0eSkpOwogfQotRlhfQk9PTCBDUXVhcnR6MkQ6OmRyYXdHcmFwaGljc1N0cmluZyh2b2lkKiAgICAgICAgICAgICAgICAgZ3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICBmb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCAgICAgICAgICAgICAgZm9udFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQqICAgICAgICAgICAgICBnbHlwaEluZGljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHUG9pbnQqICAgICAgICAgICBnbHlwaFBvc2l0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSU5UMzIgICAgICAgICAgICAgIGNoYXJzQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgICAgICAgICAgICAgICBhcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4KiAgICAgbWF0cml4ICkKLXsKLSAgICBpZiAoIWdyYXBoaWNzKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSAoQ0dDb250ZXh0UmVmKSBncmFwaGljczsKLSAgICBDR0NvbnRleHRTZXRGb250KGNvbnRleHQsIChDR0ZvbnRSZWYpZm9udCk7Ci0gICAgQ0dDb250ZXh0U2V0Rm9udFNpemUoY29udGV4dCwgZm9udFNpemUpOwotICAgIGlmIChtYXRyaXgpIHsKLSAgICAgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENHQ29udGV4dEdldFRleHRNYXRyaXgoY29udGV4dCk7Ci0gICAgICAgIG0gPSBDR0FmZmluZVRyYW5zZm9ybUNvbmNhdChtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlKG1hdHJpeC0+YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LT5iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgtPmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeC0+ZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LT5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgtPmYpKTsKLSAgICAgICAgQ0dDb250ZXh0U2V0VGV4dE1hdHJpeChjb250ZXh0LCBtKTsKLSAgICB9Ci0gICAgRlhfSU5UMzIgYSwgciwgZywgYjsKLSAgICBBcmdiRGVjb2RlKGFyZ2IsIGEsIHIsIGcsIGIpOwotICAgIENHQ29udGV4dFNldFJHQkZpbGxDb2xvcihjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIC8gMjU1LmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgLyAyNTUuZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiAvIDI1NS5mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIC8gMjU1LmYpOwotICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7CitGWF9CT09MIENRdWFydHoyRDo6ZHJhd0dyYXBoaWNzU3RyaW5nKHZvaWQqIGdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBmb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCogZ2x5cGhJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDR1BvaW50KiBnbHlwaFBvc2l0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCkgeworICBpZiAoIWdyYXBoaWNzKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gKENHQ29udGV4dFJlZilncmFwaGljczsKKyAgQ0dDb250ZXh0U2V0Rm9udChjb250ZXh0LCAoQ0dGb250UmVmKWZvbnQpOworICBDR0NvbnRleHRTZXRGb250U2l6ZShjb250ZXh0LCBmb250U2l6ZSk7CisgIGlmIChtYXRyaXgpIHsKKyAgICBDR0FmZmluZVRyYW5zZm9ybSBtID0gQ0dDb250ZXh0R2V0VGV4dE1hdHJpeChjb250ZXh0KTsKKyAgICBtID0gQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXQoCisgICAgICAgIG0sIENHQWZmaW5lVHJhbnNmb3JtTWFrZShtYXRyaXgtPmEsIG1hdHJpeC0+YiwgbWF0cml4LT5jLCBtYXRyaXgtPmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgtPmUsIG1hdHJpeC0+ZikpOworICAgIENHQ29udGV4dFNldFRleHRNYXRyaXgoY29udGV4dCwgbSk7CisgIH0KKyAgaW50MzJfdCBhLCByLCBnLCBiOworICBBcmdiRGVjb2RlKGFyZ2IsIGEsIHIsIGcsIGIpOworICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoY29udGV4dCwgciAvIDI1NS5mLCBnIC8gMjU1LmYsIGIgLyAyNTUuZiwgYSAvIDI1NS5mKTsKKyAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShjb250ZXh0KTsKICNpZiBDR0ZMT0FUX0lTX0RPVUJMRQotICAgIENHUG9pbnQqIGdseXBoUG9zaXRpb25zQ0cgPSBuZXcgQ0dQb2ludFtjaGFyc0NvdW50XTsKLSAgICBpZiAoIWdseXBoUG9zaXRpb25zQ0cpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgY2hhcnNDb3VudDsgKytpbmRleCkgewotICAgICAgICBnbHlwaFBvc2l0aW9uc0NHW2luZGV4XS54ID0gZ2x5cGhQb3NpdGlvbnNbaW5kZXhdLng7Ci0gICAgICAgIGdseXBoUG9zaXRpb25zQ0dbaW5kZXhdLnkgPSBnbHlwaFBvc2l0aW9uc1tpbmRleF0ueTsKLSAgICB9CisgIENHUG9pbnQqIGdseXBoUG9zaXRpb25zQ0cgPSBuZXcgQ0dQb2ludFtjaGFyc0NvdW50XTsKKyAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNoYXJzQ291bnQ7ICsraW5kZXgpIHsKKyAgICBnbHlwaFBvc2l0aW9uc0NHW2luZGV4XS54ID0gZ2x5cGhQb3NpdGlvbnNbaW5kZXhdLng7CisgICAgZ2x5cGhQb3NpdGlvbnNDR1tpbmRleF0ueSA9IGdseXBoUG9zaXRpb25zW2luZGV4XS55OworICB9CiAjZWxzZQotICAgIENHUG9pbnQqIGdseXBoUG9zaXRpb25zQ0cgPSAoQ0dQb2ludCopZ2x5cGhQb3NpdGlvbnM7CisgIENHUG9pbnQqIGdseXBoUG9zaXRpb25zQ0cgPSAoQ0dQb2ludCopZ2x5cGhQb3NpdGlvbnM7CiAjZW5kaWYKLSAgICBDR0NvbnRleHRTaG93R2x5cGhzQXRQb3NpdGlvbnMoY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENHR2x5cGggKikgZ2x5cGhJbmRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaFBvc2l0aW9uc0NHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc0NvdW50KTsKKyAgQ0dDb250ZXh0U2hvd0dseXBoc0F0UG9zaXRpb25zKGNvbnRleHQsIChDR0dseXBoKilnbHlwaEluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaFBvc2l0aW9uc0NHLCBjaGFyc0NvdW50KTsKICNpZiBDR0ZMT0FUX0lTX0RPVUJMRQotICAgIGRlbGV0ZVtdIGdseXBoUG9zaXRpb25zQ0c7CisgIGRlbGV0ZVtdIGdseXBoUG9zaXRpb25zQ0c7CiAjZW5kaWYKLSAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOwotICAgIHJldHVybiBUUlVFOworICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOworICByZXR1cm4gVFJVRTsKIH0KLXZvaWQgQ1F1YXJ0ejJEOjpzYXZlR3JhcGhpY3NTdGF0ZSh2b2lkICogZ3JhcGhpY3MpCi17Ci0gICAgaWYgKGdyYXBoaWNzKSB7Ci0gICAgICAgIENHQ29udGV4dFNhdmVHU3RhdGUoKENHQ29udGV4dFJlZikgZ3JhcGhpY3MpOwotICAgIH0KK3ZvaWQgQ1F1YXJ0ejJEOjpzYXZlR3JhcGhpY3NTdGF0ZSh2b2lkKiBncmFwaGljcykgeworICBpZiAoZ3JhcGhpY3MpIHsKKyAgICBDR0NvbnRleHRTYXZlR1N0YXRlKChDR0NvbnRleHRSZWYpZ3JhcGhpY3MpOworICB9CiB9Ci12b2lkIENRdWFydHoyRDo6cmVzdG9yZUdyYXBoaWNzU3RhdGUodm9pZCAqIGdyYXBoaWNzKQotewotICAgIGlmIChncmFwaGljcykgewotICAgICAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKChDR0NvbnRleHRSZWYpIGdyYXBoaWNzKTsKLSAgICB9Cit2b2lkIENRdWFydHoyRDo6cmVzdG9yZUdyYXBoaWNzU3RhdGUodm9pZCogZ3JhcGhpY3MpIHsKKyAgaWYgKGdyYXBoaWNzKSB7CisgICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZSgoQ0dDb250ZXh0UmVmKWdyYXBoaWNzKTsKKyAgfQogfQotc3RhdGljIENHQ29udGV4dFJlZiBjcmVhdGVDb250ZXh0V2l0aEJpdG1hcChDRlhfRElCaXRtYXAqIHBCaXRtYXApCi17Ci0gICAgaWYgKCFwQml0bWFwIHx8IHBCaXRtYXAtPklzQ215a0ltYWdlKCkgfHwgcEJpdG1hcC0+R2V0QlBQKCkgPCAzMikgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ0dCaXRtYXBJbmZvIGJpdG1hcEluZm8gPSBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZTsKLSAgICBpZiAocEJpdG1hcC0+SGFzQWxwaGEoKSkgewotICAgICAgICBiaXRtYXBJbmZvIHw9IGtDR0ltYWdlQWxwaGFQcmVtdWx0aXBsaWVkRmlyc3Q7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYml0bWFwSW5mbyB8PSBrQ0dJbWFnZUFscGhhTm9uZVNraXBGaXJzdDsKLSAgICB9Ci0gICAgQ0dDb2xvclNwYWNlUmVmIGNvbG9yU3BhY2UgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKTsKLSAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZShwQml0bWFwLT5HZXRCdWZmZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAtPkdldFdpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwLT5HZXRIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwLT5HZXRQaXRjaCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JTcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcEluZm8pOwotICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoY29sb3JTcGFjZSk7Ci0gICAgcmV0dXJuIGNvbnRleHQ7CitzdGF0aWMgQ0dDb250ZXh0UmVmIGNyZWF0ZUNvbnRleHRXaXRoQml0bWFwKENGWF9ESUJpdG1hcCogcEJpdG1hcCkgeworICBpZiAoIXBCaXRtYXAgfHwgcEJpdG1hcC0+SXNDbXlrSW1hZ2UoKSB8fCBwQml0bWFwLT5HZXRCUFAoKSA8IDMyKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ0dCaXRtYXBJbmZvIGJpdG1hcEluZm8gPSBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZTsKKyAgaWYgKHBCaXRtYXAtPkhhc0FscGhhKCkpIHsKKyAgICBiaXRtYXBJbmZvIHw9IGtDR0ltYWdlQWxwaGFQcmVtdWx0aXBsaWVkRmlyc3Q7CisgIH0gZWxzZSB7CisgICAgYml0bWFwSW5mbyB8PSBrQ0dJbWFnZUFscGhhTm9uZVNraXBGaXJzdDsKKyAgfQorICBDR0NvbG9yU3BhY2VSZWYgY29sb3JTcGFjZSA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOworICBDR0NvbnRleHRSZWYgY29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZSgKKyAgICAgIHBCaXRtYXAtPkdldEJ1ZmZlcigpLCBwQml0bWFwLT5HZXRXaWR0aCgpLCBwQml0bWFwLT5HZXRIZWlnaHQoKSwgOCwKKyAgICAgIHBCaXRtYXAtPkdldFBpdGNoKCksIGNvbG9yU3BhY2UsIGJpdG1hcEluZm8pOworICBDR0NvbG9yU3BhY2VSZWxlYXNlKGNvbG9yU3BhY2UpOworICByZXR1cm4gY29udGV4dDsKIH0KLUNGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkNGWF9RdWFydHpEZXZpY2VEcml2ZXIoQ0dDb250ZXh0UmVmIGNvbnRleHQsIEZYX0lOVDMyIGRldmljZUNsYXNzKQotewotICAgIG1fc2F2ZUNvdW50ID0gMDsKLSAgICBfY29udGV4dAkJPSBjb250ZXh0OwotICAgIF9kZXZpY2VDbGFzcwk9IGRldmljZUNsYXNzOwotICAgIENHQ29udGV4dFJldGFpbihfY29udGV4dCk7Ci0gICAgQ0dSZWN0IHIgPSBDR0NvbnRleHRHZXRDbGlwQm91bmRpbmdCb3goY29udGV4dCk7Ci0gICAgX3dpZHRoCT0gRlhTWVNfcm91bmQoci5zaXplLndpZHRoKTsKLSAgICBfaGVpZ2h0CT0gRlhTWVNfcm91bmQoci5zaXplLmhlaWdodCk7Ci0gICAgX3JlbmRlckNhcHMgPSBGWFJDX1NPRlRfQ0xJUCB8IEZYUkNfQkxFTkRfTU9ERSB8Ci0gICAgICAgICAgICAgICAgICBGWFJDX0FMUEhBX1BBVEggfCBGWFJDX0FMUEhBX0lNQUdFIHwKLSAgICAgICAgICAgICAgICAgIEZYUkNfQklUX01BU0sgfCBGWFJDX0FMUEhBX01BU0s7Ci0gICAgaWYgKF9kZXZpY2VDbGFzcyAhPSBGWERDX0RJU1BMQVkpIHsKLSAgICB9IGVsc2UgewotICAgICAgICBDR0ltYWdlUmVmIGltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlSW1hZ2UoX2NvbnRleHQpOwotICAgICAgICBpZiAoaW1hZ2UpIHsKLSAgICAgICAgICAgIF9yZW5kZXJDYXBzIHw9IEZYUkNfR0VUX0JJVFM7Ci0gICAgICAgICAgICBfd2lkdGggPSBDR0ltYWdlR2V0V2lkdGgoaW1hZ2UpOwotICAgICAgICAgICAgX2hlaWdodCA9IENHSW1hZ2VHZXRIZWlnaHQoaW1hZ2UpOwotICAgICAgICAgICAgQ0dJbWFnZUFscGhhSW5mbyBhbHBoYUluZm8gPSBDR0ltYWdlR2V0QWxwaGFJbmZvKGltYWdlKTsKLSAgICAgICAgICAgIGlmIChrQ0dJbWFnZUFscGhhUHJlbXVsdGlwbGllZEZpcnN0ID09IGFscGhhSW5mbyB8fAotICAgICAgICAgICAgICAgICAgICBrQ0dJbWFnZUFscGhhUHJlbXVsdGlwbGllZExhc3QgPT0gYWxwaGFJbmZvIHx8Ci0gICAgICAgICAgICAgICAgICAgIGtDR0ltYWdlQWxwaGFPbmx5ID09IGFscGhhSW5mbykgewotICAgICAgICAgICAgICAgIF9yZW5kZXJDYXBzIHw9IEZYUkNfQUxQSEFfT1VUUFVUOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIENHSW1hZ2VSZWxlYXNlKGltYWdlKTsKLSAgICB9Ci0gICAgQ0dBZmZpbmVUcmFuc2Zvcm0gY3RtID0gQ0dDb250ZXh0R2V0Q1RNKF9jb250ZXh0KTsKLSAgICBDR0NvbnRleHRTYXZlR1N0YXRlKF9jb250ZXh0KTsKLSAgICBtX3NhdmVDb3VudCsrOwotICAgIGlmIChjdG0uZCA+PSAwKSB7Ci0gICAgICAgIENHRmxvYXQgb2Zmc2V0X3gsIG9mZnNldF95OwotICAgICAgICBvZmZzZXRfeCA9IGN0bS50eDsKLSAgICAgICAgb2Zmc2V0X3kgPSBjdG0udHk7Ci0gICAgICAgIENHQ29udGV4dFRyYW5zbGF0ZUNUTShfY29udGV4dCwgLW9mZnNldF94LCAtb2Zmc2V0X3kpOwotICAgICAgICBDR0NvbnRleHRDb25jYXRDVE0oX2NvbnRleHQsIENHQWZmaW5lVHJhbnNmb3JtTWFrZSgxLCAwLCAwLCAtMSwgb2Zmc2V0X3gsIF9oZWlnaHQgKyBvZmZzZXRfeSkpOwotICAgIH0KLSAgICBfZm94aXREZXZpY2UyVXNlciA9IENHQWZmaW5lVHJhbnNmb3JtSWRlbnRpdHk7Ci0gICAgX3VzZXIyRm94aXREZXZpY2UgPSBDR0FmZmluZVRyYW5zZm9ybUludmVydChfZm94aXREZXZpY2UyVXNlcik7Ci19Ci1DRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjp+Q0ZYX1F1YXJ0ekRldmljZURyaXZlcigpCi17Ci0gICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShfY29udGV4dCk7Ci0gICAgbV9zYXZlQ291bnQtLTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fc2F2ZUNvdW50OyArK2kpIHsKLSAgICAgICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShfY29udGV4dCk7Ci0gICAgfQotICAgIGlmIChfY29udGV4dCkgewotICAgICAgICBDR0NvbnRleHRSZWxlYXNlKF9jb250ZXh0KTsKLSAgICB9Ci19Ci1pbnQgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6R2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc0lEKQotewotICAgIHN3aXRjaCAoY2Fwc0lEKSB7Ci0gICAgICAgIGNhc2UgRlhEQ19ERVZJQ0VfQ0xBU1M6IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2RldmljZUNsYXNzOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIEZYRENfUElYRUxfV0lEVEg6IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3dpZHRoOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIEZYRENfUElYRUxfSEVJR0hUOiB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9oZWlnaHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgRlhEQ19CSVRTX1BJWEVMOiB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDMyOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIEZYRENfUkVOREVSX0NBUFM6IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3JlbmRlckNhcHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICB9Ci19Ci1DRlhfTWF0cml4IENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkdldENUTSgpIGNvbnN0Ci17Ci0gICAgQ0dBZmZpbmVUcmFuc2Zvcm0gY3RtID0gQ0dDb250ZXh0R2V0Q1RNKF9jb250ZXh0KTsKLSAgICByZXR1cm4gQ0ZYX01hdHJpeChjdG0uYSwgY3RtLmIsIGN0bS5jLCBjdG0uZCwgY3RtLnR4LCBjdG0udHkpOwotfQotdm9pZCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpTYXZlU3RhdGUoKQotewotICAgIENHQ29udGV4dFNhdmVHU3RhdGUoX2NvbnRleHQpOwotICAgIG1fc2F2ZUNvdW50Kys7Ci19Ci12b2lkIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OlJlc3RvcmVTdGF0ZShGWF9CT09MIGlzS2VlcFNhdmVkICkKLXsKLSAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKF9jb250ZXh0KTsKLSAgICBpZiAoaXNLZWVwU2F2ZWQpIHsKLSAgICAgICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShfY29udGV4dCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9zYXZlQ291bnQtLTsKLSAgICB9Ci19Ci1GWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiAgICBwYXRoRGF0YSwKLSAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogICBtYXRyaXgsCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgZmlsbE1vZGUgKQotewotICAgIFNhdmVTdGF0ZSgpOwotICAgIENHQWZmaW5lVHJhbnNmb3JtIG0gPSBDR0FmZmluZVRyYW5zZm9ybUlkZW50aXR5OwotICAgIGlmIChtYXRyaXgpIHsKLSAgICAgICAgbSA9IENHQWZmaW5lVHJhbnNmb3JtTWFrZShtYXRyaXgtPkdldEEoKSwgbWF0cml4LT5HZXRCKCksIG1hdHJpeC0+R2V0QygpLCBtYXRyaXgtPkdldEQoKSwgbWF0cml4LT5HZXRFKCksIG1hdHJpeC0+R2V0RigpKTsKLSAgICB9Ci0gICAgbSA9IENHQWZmaW5lVHJhbnNmb3JtQ29uY2F0KG0sIF9mb3hpdERldmljZTJVc2VyKTsKLSAgICBDR0NvbnRleHRDb25jYXRDVE0oX2NvbnRleHQsIG0pOwotICAgIHNldFBhdGhUb0NvbnRleHQocGF0aERhdGEpOwotICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7Ci0gICAgaWYgKChmaWxsTW9kZSAmIDMpID09IEZYRklMTF9XSU5ESU5HKSB7Ci0gICAgICAgIENHQ29udGV4dENsaXAoX2NvbnRleHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIENHQ29udGV4dEVPQ2xpcChfY29udGV4dCk7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfRkxPQVQgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6Z2V0TGluZVdpZHRoKGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSAqIGdyYXBoU3RhdGUsIENHQWZmaW5lVHJhbnNmb3JtIGN0bSkKLXsKLSAgICBGWF9GTE9BVCBsaW5lV2lkdGggPSBncmFwaFN0YXRlLT5tX0xpbmVXaWR0aDsKLSAgICBpZiAoZ3JhcGhTdGF0ZS0+bV9MaW5lV2lkdGggPD0gMC5mKSB7Ci0gICAgICAgIENHU2l6ZSBzaXplOwotICAgICAgICBzaXplLndpZHRoID0gMTsKLSAgICAgICAgc2l6ZS5oZWlnaHQgPSAxOwotICAgICAgICBDR1NpemUgdGVtcCA9IENHU2l6ZUFwcGx5QWZmaW5lVHJhbnNmb3JtKHNpemUsIGN0bSk7Ci0gICAgICAgIENHRmxvYXQgeCA9IDEgLyB0ZW1wLndpZHRoOwotICAgICAgICBDR0Zsb2F0IHkgPSAxIC8gdGVtcC5oZWlnaHQ7Ci0gICAgICAgIGxpbmVXaWR0aCA9IHggPiB5ID8geCA6IHk7Ci0gICAgfQotICAgIHJldHVybiBsaW5lV2lkdGg7Ci19Ci1GWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqICAgICAgcGF0aERhdGEsCi0gICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqICAgICBtYXRyaXgsCi0gICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogICBncmFwaFN0YXRlICkKLXsKLSAgICBTYXZlU3RhdGUoKTsKLSAgICBDR0FmZmluZVRyYW5zZm9ybSBtID0gQ0dBZmZpbmVUcmFuc2Zvcm1JZGVudGl0eTsKLSAgICBpZiAobWF0cml4KSB7Ci0gICAgICAgIG0gPSBDR0FmZmluZVRyYW5zZm9ybU1ha2UobWF0cml4LT5HZXRBKCksIG1hdHJpeC0+R2V0QigpLCBtYXRyaXgtPkdldEMoKSwgbWF0cml4LT5HZXREKCksIG1hdHJpeC0+R2V0RSgpLCBtYXRyaXgtPkdldEYoKSk7Ci0gICAgfQotICAgIG0gPSBDR0FmZmluZVRyYW5zZm9ybUNvbmNhdChtLCBfZm94aXREZXZpY2UyVXNlcik7Ci0gICAgQ0dDb250ZXh0Q29uY2F0Q1RNKF9jb250ZXh0LCBtKTsKLSAgICBGWF9GTE9BVCBsaW5lV2lkdGggPSBnZXRMaW5lV2lkdGgoZ3JhcGhTdGF0ZSwgbSk7Ci0gICAgc2V0U3Ryb2tlSW5mbyhncmFwaFN0YXRlLCAweEZGMDAwMDAwLCBsaW5lV2lkdGgpOwotICAgIHNldFBhdGhUb0NvbnRleHQocGF0aERhdGEpOwotICAgIENHQ29udGV4dFJlcGxhY2VQYXRoV2l0aFN0cm9rZWRQYXRoKF9jb250ZXh0KTsKLSAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwotICAgIENHQ29udGV4dENsaXAoX2NvbnRleHQpOwotICAgIHJldHVybiBUUlVFOwotfQotc3RhdGljIENHQmxlbmRNb2RlIEdldENHQmxlbmRNb2RlKGludCBibGVuZF90eXBlKQotewotICAgIENHQmxlbmRNb2RlIG1vZGUgPSBrQ0dCbGVuZE1vZGVOb3JtYWw7Ci0gICAgc3dpdGNoIChibGVuZF90eXBlKSB7Ci0gICAgICAgIGNhc2UgRlhESUJfQkxFTkRfTk9STUFMOgotICAgICAgICAgICAgbW9kZSA9IGtDR0JsZW5kTW9kZU5vcm1hbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCX0JMRU5EX01VTFRJUExZOgotICAgICAgICAgICAgbW9kZSA9IGtDR0JsZW5kTW9kZU11bHRpcGx5OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhESUJfQkxFTkRfU0NSRUVOOgotICAgICAgICAgICAgbW9kZSA9IGtDR0JsZW5kTW9kZVNjcmVlbjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCX0JMRU5EX09WRVJMQVk6Ci0gICAgICAgICAgICBtb2RlID0ga0NHQmxlbmRNb2RlT3ZlcmxheTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCX0JMRU5EX0RBUktFTjoKLSAgICAgICAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVEYXJrZW47Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWERJQl9CTEVORF9MSUdIVEVOOgotICAgICAgICAgICAgbW9kZSA9IGtDR0JsZW5kTW9kZUxpZ2h0ZW47Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWERJQl9CTEVORF9DT0xPUkRPREdFOgotICAgICAgICAgICAgbW9kZSA9IGtDR0JsZW5kTW9kZUNvbG9yRG9kZ2U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWERJQl9CTEVORF9DT0xPUkJVUk46Ci0gICAgICAgICAgICBtb2RlID0ga0NHQmxlbmRNb2RlQ29sb3JCdXJuOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhESUJfQkxFTkRfSEFSRExJR0hUOgotICAgICAgICAgICAgbW9kZSA9IGtDR0JsZW5kTW9kZUhhcmRMaWdodDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCX0JMRU5EX1NPRlRMSUdIVDoKLSAgICAgICAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVTb2Z0TGlnaHQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWERJQl9CTEVORF9ESUZGRVJFTkNFOgotICAgICAgICAgICAgbW9kZSA9IGtDR0JsZW5kTW9kZURpZmZlcmVuY2U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWERJQl9CTEVORF9FWENMVVNJT046Ci0gICAgICAgICAgICBtb2RlID0ga0NHQmxlbmRNb2RlRXhjbHVzaW9uOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhESUJfQkxFTkRfSFVFOgotICAgICAgICAgICAgbW9kZSA9IGtDR0JsZW5kTW9kZUh1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCX0JMRU5EX1NBVFVSQVRJT046Ci0gICAgICAgICAgICBtb2RlID0ga0NHQmxlbmRNb2RlU2F0dXJhdGlvbjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCX0JMRU5EX0NPTE9SOgotICAgICAgICAgICAgbW9kZSA9IGtDR0JsZW5kTW9kZUNvbG9yOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhESUJfQkxFTkRfTFVNSU5PU0lUWToKLSAgICAgICAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVMdW1pbm9zaXR5OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBtb2RlID0ga0NHQmxlbmRNb2RlTm9ybWFsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBtb2RlOwotfQotRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqICAgICAgICBwYXRoRGF0YSwKLSAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogICAgICAgbWF0cml4LAotICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqICAgICBncmFwaFN0YXRlLAotICAgICAgICBGWF9EV09SRCAgICAgICAgICAgICAgICAgICAgICBmaWxsQXJnYiwKLSAgICAgICAgRlhfRFdPUkQgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlQXJnYiwKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbE1vZGUsCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ZsYWcsCi0gICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIHBJY2NUcmFuc2Zvcm0sCi0gICAgICAgIGludAkJCQkJCQlibGVuZF90eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAgIFNhdmVTdGF0ZSgpOwotICAgIENHQmxlbmRNb2RlIG1vZGUgPSBHZXRDR0JsZW5kTW9kZShibGVuZF90eXBlKTsKLSAgICBpZiAobW9kZSAhPSBrQ0dCbGVuZE1vZGVOb3JtYWwpIHsKLSAgICAgICAgQ0dDb250ZXh0U2V0QmxlbmRNb2RlKF9jb250ZXh0LCBtb2RlKTsKLSAgICB9Ci0gICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENHQWZmaW5lVHJhbnNmb3JtSWRlbnRpdHk7Ci0gICAgaWYgKG1hdHJpeCkgewotICAgICAgICBtID0gQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlKG1hdHJpeC0+R2V0QSgpLCBtYXRyaXgtPkdldEIoKSwgbWF0cml4LT5HZXRDKCksIG1hdHJpeC0+R2V0RCgpLCBtYXRyaXgtPkdldEUoKSwgbWF0cml4LT5HZXRGKCkpOwotICAgIH0KLSAgICBtID0gQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXQobSwgX2ZveGl0RGV2aWNlMlVzZXIpOwotICAgIENHQ29udGV4dENvbmNhdENUTShfY29udGV4dCwgbSk7Ci0gICAgaW50IHBhdGhNb2RlID0gMDsKLSAgICBpZiAoZ3JhcGhTdGF0ZSAmJiBzdHJva2VBcmdiKSB7Ci0gICAgICAgIENHQ29udGV4dFNldE1pdGVyTGltaXQoX2NvbnRleHQsIGdyYXBoU3RhdGUtPm1fTWl0ZXJMaW1pdCk7Ci0gICAgICAgIEZYX0ZMT0FUIGxpbmVXaWR0aCA9IGdldExpbmVXaWR0aChncmFwaFN0YXRlLCBtKTsKLSAgICAgICAgc2V0U3Ryb2tlSW5mbyhncmFwaFN0YXRlLCBzdHJva2VBcmdiLCBsaW5lV2lkdGgpOwotICAgICAgICBwYXRoTW9kZSB8PSA0OwotICAgIH0KLSAgICBpZiAoZmlsbE1vZGUgJiYgZmlsbEFyZ2IpIHsKLSAgICAgICAgc2V0RmlsbEluZm8oZmlsbEFyZ2IpOwotICAgICAgICBpZiAoKGZpbGxNb2RlICYgMykgPT0gRlhGSUxMX1dJTkRJTkcpIHsKLSAgICAgICAgICAgIHBhdGhNb2RlIHw9IDE7Ci0gICAgICAgIH0gZWxzZSBpZiAoKGZpbGxNb2RlICYgMykgPT0gRlhGSUxMX0FMVEVSTkFURSkgewotICAgICAgICAgICAgcGF0aE1vZGUgfD0gMjsKLSAgICAgICAgfQotICAgIH0KLSAgICBzZXRQYXRoVG9Db250ZXh0KHBhdGhEYXRhKTsKLSAgICBpZiAoZmlsbE1vZGUgJiBGWEZJTExfRlVMTENPVkVSKSB7Ci0gICAgICAgIENHQ29udGV4dFNldFNob3VsZEFudGlhbGlhcyhfY29udGV4dCwgZmFsc2UpOwotICAgIH0KLSAgICBpZiAocGF0aE1vZGUgPT0gNCkgewotICAgICAgICBDR0NvbnRleHRTdHJva2VQYXRoKF9jb250ZXh0KTsKLSAgICB9IGVsc2UgaWYgKHBhdGhNb2RlID09IDEpIHsKLSAgICAgICAgQ0dDb250ZXh0RmlsbFBhdGgoX2NvbnRleHQpOwotICAgIH0gZWxzZSBpZiAocGF0aE1vZGUgPT0gMikgewotICAgICAgICBDR0NvbnRleHRFT0ZpbGxQYXRoKF9jb250ZXh0KTsKLSAgICB9IGVsc2UgaWYgKHBhdGhNb2RlID09IDUpIHsKLSAgICAgICAgQ0dDb250ZXh0RHJhd1BhdGgoX2NvbnRleHQsIGtDR1BhdGhGaWxsU3Ryb2tlKTsKLSAgICB9IGVsc2UgaWYgKHBhdGhNb2RlID09IDYpIHsKLSAgICAgICAgQ0dDb250ZXh0RHJhd1BhdGgoX2NvbnRleHQsIGtDR1BhdGhFT0ZpbGxTdHJva2UpOwotICAgIH0KLSAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpGaWxsUmVjdChjb25zdCBGWF9SRUNUKiAgICAgICAgIHJlY3QsCi0gICAgICAgIEZYX0FSR0IgICAgICAgICAgICAgICAgICAgZmlsbEFyZ2IsCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFGbGFnCSAgICwKLSAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICBpY2NUcmFuc2Zvcm0gLAotICAgICAgICBpbnQJCQkJCQlibGVuZF90eXBlICkKLXsKLSAgICBDR0JsZW5kTW9kZSBtb2RlID0gR2V0Q0dCbGVuZE1vZGUoYmxlbmRfdHlwZSk7Ci0gICAgaWYgKG1vZGUgIT0ga0NHQmxlbmRNb2RlTm9ybWFsKSB7Ci0gICAgICAgIENHQ29udGV4dFNldEJsZW5kTW9kZShfY29udGV4dCwgbW9kZSk7Ci0gICAgfQotICAgIENHUmVjdCByZWN0X2Z4ID0gQ0dSZWN0TWFrZShyZWN0LT5sZWZ0LCByZWN0LT50b3AsIHJlY3QtPldpZHRoKCksIHJlY3QtPkhlaWdodCgpKTsKLSAgICBDR1JlY3QgcmVjdF91c3IgPSBDR1JlY3RBcHBseUFmZmluZVRyYW5zZm9ybShyZWN0X2Z4LCBfZm94aXREZXZpY2UyVXNlcik7Ci0gICAgRlhfSU5UMzIgYSwgciwgZywgYjsKLSAgICBBcmdiRGVjb2RlKGZpbGxBcmdiLCBhLCByLCBnLCBiKTsKLSAgICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgLyAyNTUuZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyAvIDI1NS5mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiIC8gMjU1LmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgLyAyNTUuZik7Ci0gICAgQ0dDb250ZXh0RmlsbFJlY3QoX2NvbnRleHQsIHJlY3RfdXNyKTsKLSAgICBpZiAobW9kZSAhPSBrQ0dCbGVuZE1vZGVOb3JtYWwpIHsKLSAgICAgICAgQ0dDb250ZXh0U2V0QmxlbmRNb2RlKF9jb250ZXh0LCBrQ0dCbGVuZE1vZGVOb3JtYWwpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6RHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCAgICAgICAgICAgeDEsCi0gICAgICAgIEZYX0ZMT0FUICAgICAgICAgICAgICB5MSwKLSAgICAgICAgRlhfRkxPQVQgICAgICAgICAgICAgIHgyLAotICAgICAgICBGWF9GTE9BVCAgICAgICAgICAgICAgeTIsCi0gICAgICAgIEZYX0RXT1JEICAgICAgICAgICAgICBhcmdiLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgYWxwaGFGbGFnICAgICAgICwKLSAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgIGljY1RyYW5zZm9ybSAgICAsCi0gICAgICAgIGludAkJCQkJYmxlbmRfdHlwZSApCi17Ci0gICAgQ0dCbGVuZE1vZGUgbW9kZSA9IEdldENHQmxlbmRNb2RlKGJsZW5kX3R5cGUpOwotICAgIGlmIChtb2RlICE9IGtDR0JsZW5kTW9kZU5vcm1hbCkgewotICAgICAgICBDR0NvbnRleHRTZXRCbGVuZE1vZGUoX2NvbnRleHQsIG1vZGUpOwotICAgIH0KLSAgICBDR1BvaW50IHB0ID0gQ0dQb2ludEFwcGx5QWZmaW5lVHJhbnNmb3JtKENHUG9pbnRNYWtlKHgxLCB5MSksIF9mb3hpdERldmljZTJVc2VyKTsKLSAgICB4MSA9IHB0Lng7Ci0gICAgeTEgPSBwdC55OwotICAgIHB0ID0gQ0dQb2ludEFwcGx5QWZmaW5lVHJhbnNmb3JtKENHUG9pbnRNYWtlKHgyLCB5MiksIF9mb3hpdERldmljZTJVc2VyKTsKLSAgICB4MiA9IHB0Lng7Ci0gICAgeTIgPSBwdC55OwotICAgIEZYX0lOVDMyIGEsIHIsIGcsIGI7Ci0gICAgQXJnYkRlY29kZShhcmdiLCBhLCByLCBnLCBiKTsKLSAgICBDR0NvbnRleHRTZXRSR0JTdHJva2VDb2xvcihfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIC8gMjU1LmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyAvIDI1NS5mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgLyAyNTUuZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIC8gMjU1LmYpOwotICAgIENHQ29udGV4dE1vdmVUb1BvaW50KF9jb250ZXh0LCB4MSwgeTEpOwotICAgIENHQ29udGV4dEFkZExpbmVUb1BvaW50KF9jb250ZXh0LCB4MiwgeTIpOwotICAgIENHQ29udGV4dFN0cm9rZVBhdGgoX2NvbnRleHQpOwotICAgIGlmIChtb2RlICE9IGtDR0JsZW5kTW9kZU5vcm1hbCkgewotICAgICAgICBDR0NvbnRleHRTZXRCbGVuZE1vZGUoX2NvbnRleHQsIGtDR0JsZW5kTW9kZU5vcm1hbCk7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpHZXRDbGlwQm94KEZYX1JFQ1QqIHJlY3QpCi17Ci0gICAgQ0dSZWN0IHIgPSBDR0NvbnRleHRHZXRDbGlwQm91bmRpbmdCb3goX2NvbnRleHQpOwotICAgIHIgPSBDR1JlY3RBcHBseUFmZmluZVRyYW5zZm9ybShyLCBfdXNlcjJGb3hpdERldmljZSk7Ci0gICAgcmVjdC0+bGVmdAkJPSBGWFNZU19mbG9vcihyLm9yaWdpbi54KTsKLSAgICByZWN0LT50b3AJCT0gRlhTWVNfZmxvb3Ioci5vcmlnaW4ueSk7Ci0gICAgcmVjdC0+cmlnaHQJCT0gRlhTWVNfY2VpbChyLm9yaWdpbi54ICsgci5zaXplLndpZHRoKTsKLSAgICByZWN0LT5ib3R0b20JPSBGWFNZU19jZWlsKHIub3JpZ2luLnkgKyByLnNpemUuaGVpZ2h0KTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6R2V0RElCaXRzKENGWF9ESUJpdG1hcCogICAgIGJpdG1hcCwKLSAgICAgICAgRlhfSU5UMzIgICAgICAgICAgICBsZWZ0LAotICAgICAgICBGWF9JTlQzMiAgICAgICAgICAgIHRvcCwKLSAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKLSAgICAgICAgRlhfQk9PTCBiREVkZ2UpCi17Ci0gICAgaWYgKEZYRENfUFJJTlRFUiA9PSBfZGV2aWNlQ2xhc3MpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoYml0bWFwLT5HZXRCUFAoKSA8IDMyKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKCEoX3JlbmRlckNhcHMgfCBGWFJDX0dFVF9CSVRTKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENHUG9pbnQgcHQgPSBDR1BvaW50TWFrZShsZWZ0LCB0b3ApOwotICAgIHB0ID0gQ0dQb2ludEFwcGx5QWZmaW5lVHJhbnNmb3JtKHB0LCBfZm94aXREZXZpY2UyVXNlcik7Ci0gICAgQ0dBZmZpbmVUcmFuc2Zvcm0gY3RtID0gQ0dDb250ZXh0R2V0Q1RNKF9jb250ZXh0KTsKLSAgICBwdC54ICo9IEZYU1lTX2ZhYnMoY3RtLmEpOwotICAgIHB0LnkgKj0gRlhTWVNfZmFicyhjdG0uZCk7CitDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpDRlhfUXVhcnR6RGV2aWNlRHJpdmVyKENHQ29udGV4dFJlZiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRldmljZUNsYXNzKSB7CisgIG1fc2F2ZUNvdW50ID0gMDsKKyAgX2NvbnRleHQgPSBjb250ZXh0OworICBfZGV2aWNlQ2xhc3MgPSBkZXZpY2VDbGFzczsKKyAgQ0dDb250ZXh0UmV0YWluKF9jb250ZXh0KTsKKyAgQ0dSZWN0IHIgPSBDR0NvbnRleHRHZXRDbGlwQm91bmRpbmdCb3goY29udGV4dCk7CisgIF93aWR0aCA9IEZYU1lTX3JvdW5kKHIuc2l6ZS53aWR0aCk7CisgIF9oZWlnaHQgPSBGWFNZU19yb3VuZChyLnNpemUuaGVpZ2h0KTsKKyAgX3JlbmRlckNhcHMgPSBGWFJDX1NPRlRfQ0xJUCB8IEZYUkNfQkxFTkRfTU9ERSB8IEZYUkNfQUxQSEFfUEFUSCB8CisgICAgICAgICAgICAgICAgRlhSQ19BTFBIQV9JTUFHRSB8IEZYUkNfQklUX01BU0sgfCBGWFJDX0FMUEhBX01BU0s7CisgIGlmIChfZGV2aWNlQ2xhc3MgIT0gRlhEQ19ESVNQTEFZKSB7CisgIH0gZWxzZSB7CiAgICAgQ0dJbWFnZVJlZiBpbWFnZSA9IENHQml0bWFwQ29udGV4dENyZWF0ZUltYWdlKF9jb250ZXh0KTsKLSAgICBpZiAoTlVMTCA9PSBpbWFnZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKGltYWdlKSB7CisgICAgICBfcmVuZGVyQ2FwcyB8PSBGWFJDX0dFVF9CSVRTOworICAgICAgX3dpZHRoID0gQ0dJbWFnZUdldFdpZHRoKGltYWdlKTsKKyAgICAgIF9oZWlnaHQgPSBDR0ltYWdlR2V0SGVpZ2h0KGltYWdlKTsKKyAgICAgIENHSW1hZ2VBbHBoYUluZm8gYWxwaGFJbmZvID0gQ0dJbWFnZUdldEFscGhhSW5mbyhpbWFnZSk7CisgICAgICBpZiAoa0NHSW1hZ2VBbHBoYVByZW11bHRpcGxpZWRGaXJzdCA9PSBhbHBoYUluZm8gfHwKKyAgICAgICAgICBrQ0dJbWFnZUFscGhhUHJlbXVsdGlwbGllZExhc3QgPT0gYWxwaGFJbmZvIHx8CisgICAgICAgICAga0NHSW1hZ2VBbHBoYU9ubHkgPT0gYWxwaGFJbmZvKSB7CisgICAgICAgIF9yZW5kZXJDYXBzIHw9IEZYUkNfQUxQSEFfT1VUUFVUOworICAgICAgfQogICAgIH0KLSAgICBDR0Zsb2F0IHdpZHRoCT0gKENHRmxvYXQpIGJpdG1hcC0+R2V0V2lkdGgoKTsKLSAgICBDR0Zsb2F0IGhlaWdodAk9IChDR0Zsb2F0KSBiaXRtYXAtPkdldEhlaWdodCgpOwotICAgIGlmICh3aWR0aCArIHB0LnggPiBfd2lkdGgpIHsKLSAgICAgICAgd2lkdGggLT0gKHdpZHRoICsgcHQueCAtIF93aWR0aCk7Ci0gICAgfQotICAgIGlmIChoZWlnaHQgKyBwdC55ID4gX2hlaWdodCkgewotICAgICAgICBoZWlnaHQgLT0gKGhlaWdodCArIHB0LnkgLSBfaGVpZ2h0KTsKLSAgICB9Ci0gICAgQ0dJbWFnZVJlZiBzdWJJbWFnZSA9IENHSW1hZ2VDcmVhdGVXaXRoSW1hZ2VJblJlY3QoaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENHUmVjdE1ha2UocHQueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdC55LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCkpOwotICAgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gY3JlYXRlQ29udGV4dFdpdGhCaXRtYXAoYml0bWFwKTsKLSAgICBDR1JlY3QgcmVjdCA9IENHQ29udGV4dEdldENsaXBCb3VuZGluZ0JveChjb250ZXh0KTsKLSAgICBDR0NvbnRleHRDbGVhclJlY3QoY29udGV4dCwgcmVjdCk7Ci0gICAgQ0dDb250ZXh0RHJhd0ltYWdlKGNvbnRleHQsIHJlY3QsIHN1YkltYWdlKTsKLSAgICBDR0NvbnRleHRSZWxlYXNlKGNvbnRleHQpOwotICAgIENHSW1hZ2VSZWxlYXNlKHN1YkltYWdlKTsKICAgICBDR0ltYWdlUmVsZWFzZShpbWFnZSk7Ci0gICAgaWYgKGJpdG1hcC0+SGFzQWxwaGEoKSkgewotICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBiaXRtYXAtPkdldEhlaWdodCgpOyByb3cgKyspIHsKLSAgICAgICAgICAgIEZYX0xQQllURSBwU2NhbmxpbmUgPSAoRlhfTFBCWVRFKWJpdG1hcC0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IGJpdG1hcC0+R2V0V2lkdGgoKTsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBTY2FubGluZVszXSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gKHBTY2FubGluZVswXSAqIDI1NS5mIC8gcFNjYW5saW5lWzNdICsgLjVmKTsKLSAgICAgICAgICAgICAgICAgICAgcFNjYW5saW5lWzFdID0gKHBTY2FubGluZVsxXSAqIDI1NS5mIC8gcFNjYW5saW5lWzNdICsgLjVmKTsKLSAgICAgICAgICAgICAgICAgICAgcFNjYW5saW5lWzJdID0gKHBTY2FubGluZVsyXSAqIDI1NS5mIC8gcFNjYW5saW5lWzNdICsgLjVmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcFNjYW5saW5lICs9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgQ0dBZmZpbmVUcmFuc2Zvcm0gY3RtID0gQ0dDb250ZXh0R2V0Q1RNKF9jb250ZXh0KTsKKyAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShfY29udGV4dCk7CisgIG1fc2F2ZUNvdW50Kys7CisgIGlmIChjdG0uZCA+PSAwKSB7CisgICAgQ0dGbG9hdCBvZmZzZXRfeCwgb2Zmc2V0X3k7CisgICAgb2Zmc2V0X3ggPSBjdG0udHg7CisgICAgb2Zmc2V0X3kgPSBjdG0udHk7CisgICAgQ0dDb250ZXh0VHJhbnNsYXRlQ1RNKF9jb250ZXh0LCAtb2Zmc2V0X3gsIC1vZmZzZXRfeSk7CisgICAgQ0dDb250ZXh0Q29uY2F0Q1RNKF9jb250ZXh0LCBDR0FmZmluZVRyYW5zZm9ybU1ha2UoMSwgMCwgMCwgLTEsIG9mZnNldF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9oZWlnaHQgKyBvZmZzZXRfeSkpOworICB9CisgIF9mb3hpdERldmljZTJVc2VyID0gQ0dBZmZpbmVUcmFuc2Zvcm1JZGVudGl0eTsKKyAgX3VzZXIyRm94aXREZXZpY2UgPSBDR0FmZmluZVRyYW5zZm9ybUludmVydChfZm94aXREZXZpY2UyVXNlcik7CiB9Ci1GWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OlNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiAgICAgIHBCaXRtYXAsCi0gICAgICAgIEZYX0FSR0IgICAgICAgICAgICAgICAgICAgICBhcmdiLAotICAgICAgICBjb25zdCBGWF9SRUNUKiAgICAgICAgICAgICAgc3JjUmVjdCwKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfbGVmdCwKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfdG9wLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRUeXBlLAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFGbGFnICAgICAgICwKLSAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgIGljY1RyYW5zZm9ybSAgICApCi17Ci0gICAgU2F2ZVN0YXRlKCk7Ci0gICAgQ0dGbG9hdCBzcmNfbGVmdCwgc3JjX3RvcCwgc3JjX3dpZHRoLCBzcmNfaGVpZ2h0OwotICAgIGlmIChzcmNSZWN0KSB7Ci0gICAgICAgIHNyY19sZWZ0ID0gc3JjUmVjdC0+bGVmdDsKLSAgICAgICAgc3JjX3RvcCA9IHNyY1JlY3QtPnRvcDsKLSAgICAgICAgc3JjX3dpZHRoID0gc3JjUmVjdC0+V2lkdGgoKTsKLSAgICAgICAgc3JjX2hlaWdodCA9IHNyY1JlY3QtPkhlaWdodCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNyY19sZWZ0ID0gc3JjX3RvcCA9IDA7Ci0gICAgICAgIHNyY193aWR0aCA9IHBCaXRtYXAtPkdldFdpZHRoKCk7Ci0gICAgICAgIHNyY19oZWlnaHQgPSBwQml0bWFwLT5HZXRIZWlnaHQoKTsKK0NGWF9RdWFydHpEZXZpY2VEcml2ZXI6On5DRlhfUXVhcnR6RGV2aWNlRHJpdmVyKCkgeworICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKF9jb250ZXh0KTsKKyAgbV9zYXZlQ291bnQtLTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3NhdmVDb3VudDsgKytpKSB7CisgICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShfY29udGV4dCk7CisgIH0KKyAgaWYgKF9jb250ZXh0KSB7CisgICAgQ0dDb250ZXh0UmVsZWFzZShfY29udGV4dCk7CisgIH0KK30KK2ludCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpHZXREZXZpY2VDYXBzKGludCBjYXBzSUQpIHsKKyAgc3dpdGNoIChjYXBzSUQpIHsKKyAgICBjYXNlIEZYRENfREVWSUNFX0NMQVNTOiB7CisgICAgICByZXR1cm4gX2RldmljZUNsYXNzOwogICAgIH0KLSAgICBDR0FmZmluZVRyYW5zZm9ybSBjdG0gPSBDR0NvbnRleHRHZXRDVE0oX2NvbnRleHQpOwotICAgIENHRmxvYXQgc2NhbGVfeCA9IEZYU1lTX2ZhYnMoY3RtLmEpOwotICAgIENHRmxvYXQgc2NhbGVfeSA9IEZYU1lTX2ZhYnMoY3RtLmQpOwotICAgIHNyY19sZWZ0IC89IHNjYWxlX3g7Ci0gICAgc3JjX3RvcCAvPSBzY2FsZV95OwotICAgIHNyY193aWR0aCAvPSBzY2FsZV94OwotICAgIHNyY19oZWlnaHQgLz0gc2NhbGVfeTsKLSAgICBDR1JlY3QgcmVjdF9meCA9IENHUmVjdE1ha2UoZGVzdF9sZWZ0LCBkZXN0X3RvcCwgc3JjX3dpZHRoLCBzcmNfaGVpZ2h0KTsKLSAgICBDR1JlY3QgcmVjdF91c3IgPSBDR1JlY3RBcHBseUFmZmluZVRyYW5zZm9ybShyZWN0X2Z4LCBfZm94aXREZXZpY2UyVXNlcik7Ci0gICAgQ0dDb250ZXh0QmVnaW5QYXRoKF9jb250ZXh0KTsKLSAgICBDR0NvbnRleHRBZGRSZWN0KF9jb250ZXh0LCByZWN0X3Vzcik7CisgICAgY2FzZSBGWERDX1BJWEVMX1dJRFRIOiB7CisgICAgICByZXR1cm4gX3dpZHRoOworICAgIH0KKyAgICBjYXNlIEZYRENfUElYRUxfSEVJR0hUOiB7CisgICAgICByZXR1cm4gX2hlaWdodDsKKyAgICB9CisgICAgY2FzZSBGWERDX0JJVFNfUElYRUw6IHsKKyAgICAgIHJldHVybiAzMjsKKyAgICB9CisgICAgY2FzZSBGWERDX1JFTkRFUl9DQVBTOiB7CisgICAgICByZXR1cm4gX3JlbmRlckNhcHM7CisgICAgfQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIDA7IH0KKyAgfQorfQorQ0ZYX01hdHJpeCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpHZXRDVE0oKSBjb25zdCB7CisgIENHQWZmaW5lVHJhbnNmb3JtIGN0bSA9IENHQ29udGV4dEdldENUTShfY29udGV4dCk7CisgIHJldHVybiBDRlhfTWF0cml4KGN0bS5hLCBjdG0uYiwgY3RtLmMsIGN0bS5kLCBjdG0udHgsIGN0bS50eSk7Cit9Cit2b2lkIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OlNhdmVTdGF0ZSgpIHsKKyAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShfY29udGV4dCk7CisgIG1fc2F2ZUNvdW50Kys7Cit9Cit2b2lkIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OlJlc3RvcmVTdGF0ZShGWF9CT09MIGlzS2VlcFNhdmVkKSB7CisgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoX2NvbnRleHQpOworICBpZiAoaXNLZWVwU2F2ZWQpIHsKKyAgICBDR0NvbnRleHRTYXZlR1N0YXRlKF9jb250ZXh0KTsKKyAgfSBlbHNlIHsKKyAgICBtX3NhdmVDb3VudC0tOworICB9Cit9CitGWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxNb2RlKSB7CisgIFNhdmVTdGF0ZSgpOworICBDR0FmZmluZVRyYW5zZm9ybSBtID0gQ0dBZmZpbmVUcmFuc2Zvcm1JZGVudGl0eTsKKyAgaWYgKG1hdHJpeCkgeworICAgIG0gPSBDR0FmZmluZVRyYW5zZm9ybU1ha2UobWF0cml4LT5HZXRBKCksIG1hdHJpeC0+R2V0QigpLCBtYXRyaXgtPkdldEMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeC0+R2V0RCgpLCBtYXRyaXgtPkdldEUoKSwgbWF0cml4LT5HZXRGKCkpOworICB9CisgIG0gPSBDR0FmZmluZVRyYW5zZm9ybUNvbmNhdChtLCBfZm94aXREZXZpY2UyVXNlcik7CisgIENHQ29udGV4dENvbmNhdENUTShfY29udGV4dCwgbSk7CisgIHNldFBhdGhUb0NvbnRleHQocGF0aERhdGEpOworICBSZXN0b3JlU3RhdGUoRkFMU0UpOworICBpZiAoKGZpbGxNb2RlICYgMykgPT0gRlhGSUxMX1dJTkRJTkcpIHsKICAgICBDR0NvbnRleHRDbGlwKF9jb250ZXh0KTsKLSAgICByZWN0X3Vzci5zaXplID0gQ0dTaXplTWFrZShwQml0bWFwLT5HZXRXaWR0aCgpIC8gc2NhbGVfeCwgcEJpdG1hcC0+R2V0SGVpZ2h0KCkgLyBzY2FsZV95KTsKLSAgICByZWN0X3VzciA9IENHUmVjdE9mZnNldChyZWN0X3VzciwgLXNyY19sZWZ0LCAtc3JjX3RvcCk7Ci0gICAgQ0dfU2V0SW1hZ2VUcmFuc2Zvcm0oZGVzdF9sZWZ0LCBkZXN0X3RvcCwgc3JjX3dpZHRoLCBzcmNfaGVpZ2h0LCAmcmVjdF91c3IpOwotICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcDEgPSBOVUxMOwotICAgIGlmIChwQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7Ci0gICAgICAgIGlmIChwQml0bWFwLT5HZXRCdWZmZXIoKSkgewotICAgICAgICAgICAgcEJpdG1hcDEgPSAoQ0ZYX0RJQml0bWFwKilwQml0bWFwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcEJpdG1hcDEgPSBwQml0bWFwLT5DbG9uZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChOVUxMID09IHBCaXRtYXAxKSB7Ci0gICAgICAgICAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIENHRGF0YVByb3ZpZGVyUmVmIHBCaXRtYXBQcm92aWRlciA9IENHRGF0YVByb3ZpZGVyQ3JlYXRlV2l0aERhdGEoTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdG1hcDEtPkdldEJ1ZmZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwMS0+R2V0UGl0Y2goKSAqIHBCaXRtYXAxLT5HZXRIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICAgIENHQ29sb3JTcGFjZVJlZiBwQ29sb3JTcGFjZSA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZUdyYXkoKTsKLSAgICAgICAgQ0dCaXRtYXBJbmZvIGJpdG1hcEluZm8gPSBrQ0dJbWFnZUFscGhhTm9uZSB8IGtDR0JpdG1hcEJ5dGVPcmRlckRlZmF1bHQ7Ci0gICAgICAgIENHSW1hZ2VSZWYgcEltYWdlID0gQ0dJbWFnZUNyZWF0ZShwQml0bWFwMS0+R2V0V2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAxLT5HZXRIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAxLT5HZXRCUFAoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAxLT5HZXRCUFAoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAxLT5HZXRQaXRjaCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbG9yU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXBJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdG1hcFByb3ZpZGVyLCBOVUxMLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NHUmVuZGVyaW5nSW50ZW50RGVmYXVsdCk7Ci0gICAgICAgIENHQ29udGV4dENsaXBUb01hc2soX2NvbnRleHQsIHJlY3RfdXNyLCBwSW1hZ2UpOwotICAgICAgICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfUihhcmdiKSAvIDI1NS5mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX0coYXJnYikgLyAyNTUuZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9CKGFyZ2IpIC8gMjU1LmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfQShhcmdiKSAvIDI1NS5mKTsKLSAgICAgICAgQ0dDb250ZXh0RmlsbFJlY3QoX2NvbnRleHQsIHJlY3RfdXNyKTsKLSAgICAgICAgQ0dJbWFnZVJlbGVhc2UocEltYWdlKTsKLSAgICAgICAgQ0dDb2xvclNwYWNlUmVsZWFzZShwQ29sb3JTcGFjZSk7Ci0gICAgICAgIENHRGF0YVByb3ZpZGVyUmVsZWFzZShwQml0bWFwUHJvdmlkZXIpOwotICAgICAgICBpZiAocEJpdG1hcDEgIT0gcEJpdG1hcCkgewotICAgICAgICAgICAgZGVsZXRlIHBCaXRtYXAxOwotICAgICAgICB9Ci0gICAgICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7Ci0gICAgICAgIHJldHVybiBUUlVFOworICB9IGVsc2UgeworICAgIENHQ29udGV4dEVPQ2xpcChfY29udGV4dCk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9GTE9BVCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpnZXRMaW5lV2lkdGgoCisgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBncmFwaFN0YXRlLAorICAgIENHQWZmaW5lVHJhbnNmb3JtIGN0bSkgeworICBGWF9GTE9BVCBsaW5lV2lkdGggPSBncmFwaFN0YXRlLT5tX0xpbmVXaWR0aDsKKyAgaWYgKGdyYXBoU3RhdGUtPm1fTGluZVdpZHRoIDw9IDAuZikgeworICAgIENHU2l6ZSBzaXplOworICAgIHNpemUud2lkdGggPSAxOworICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICBDR1NpemUgdGVtcCA9IENHU2l6ZUFwcGx5QWZmaW5lVHJhbnNmb3JtKHNpemUsIGN0bSk7CisgICAgQ0dGbG9hdCB4ID0gMSAvIHRlbXAud2lkdGg7CisgICAgQ0dGbG9hdCB5ID0gMSAvIHRlbXAuaGVpZ2h0OworICAgIGxpbmVXaWR0aCA9IHggPiB5ID8geCA6IHk7CisgIH0KKyAgcmV0dXJuIGxpbmVXaWR0aDsKK30KK0ZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6U2V0Q2xpcF9QYXRoU3Ryb2tlKAorICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcGF0aERhdGEsCisgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LAorICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogZ3JhcGhTdGF0ZSkgeworICBTYXZlU3RhdGUoKTsKKyAgQ0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENHQWZmaW5lVHJhbnNmb3JtSWRlbnRpdHk7CisgIGlmIChtYXRyaXgpIHsKKyAgICBtID0gQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlKG1hdHJpeC0+R2V0QSgpLCBtYXRyaXgtPkdldEIoKSwgbWF0cml4LT5HZXRDKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgtPkdldEQoKSwgbWF0cml4LT5HZXRFKCksIG1hdHJpeC0+R2V0RigpKTsKKyAgfQorICBtID0gQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXQobSwgX2ZveGl0RGV2aWNlMlVzZXIpOworICBDR0NvbnRleHRDb25jYXRDVE0oX2NvbnRleHQsIG0pOworICBGWF9GTE9BVCBsaW5lV2lkdGggPSBnZXRMaW5lV2lkdGgoZ3JhcGhTdGF0ZSwgbSk7CisgIHNldFN0cm9rZUluZm8oZ3JhcGhTdGF0ZSwgMHhGRjAwMDAwMCwgbGluZVdpZHRoKTsKKyAgc2V0UGF0aFRvQ29udGV4dChwYXRoRGF0YSk7CisgIENHQ29udGV4dFJlcGxhY2VQYXRoV2l0aFN0cm9rZWRQYXRoKF9jb250ZXh0KTsKKyAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKKyAgQ0dDb250ZXh0Q2xpcChfY29udGV4dCk7CisgIHJldHVybiBUUlVFOworfQorc3RhdGljIENHQmxlbmRNb2RlIEdldENHQmxlbmRNb2RlKGludCBibGVuZF90eXBlKSB7CisgIENHQmxlbmRNb2RlIG1vZGUgPSBrQ0dCbGVuZE1vZGVOb3JtYWw7CisgIHN3aXRjaCAoYmxlbmRfdHlwZSkgeworICAgIGNhc2UgRlhESUJfQkxFTkRfTk9STUFMOgorICAgICAgbW9kZSA9IGtDR0JsZW5kTW9kZU5vcm1hbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfQkxFTkRfTVVMVElQTFk6CisgICAgICBtb2RlID0ga0NHQmxlbmRNb2RlTXVsdGlwbHk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCX0JMRU5EX1NDUkVFTjoKKyAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVTY3JlZW47CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCX0JMRU5EX09WRVJMQVk6CisgICAgICBtb2RlID0ga0NHQmxlbmRNb2RlT3ZlcmxheTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfQkxFTkRfREFSS0VOOgorICAgICAgbW9kZSA9IGtDR0JsZW5kTW9kZURhcmtlbjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfQkxFTkRfTElHSFRFTjoKKyAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVMaWdodGVuOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWERJQl9CTEVORF9DT0xPUkRPREdFOgorICAgICAgbW9kZSA9IGtDR0JsZW5kTW9kZUNvbG9yRG9kZ2U7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCX0JMRU5EX0NPTE9SQlVSTjoKKyAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVDb2xvckJ1cm47CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCX0JMRU5EX0hBUkRMSUdIVDoKKyAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVIYXJkTGlnaHQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCX0JMRU5EX1NPRlRMSUdIVDoKKyAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVTb2Z0TGlnaHQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCX0JMRU5EX0RJRkZFUkVOQ0U6CisgICAgICBtb2RlID0ga0NHQmxlbmRNb2RlRGlmZmVyZW5jZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfQkxFTkRfRVhDTFVTSU9OOgorICAgICAgbW9kZSA9IGtDR0JsZW5kTW9kZUV4Y2x1c2lvbjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfQkxFTkRfSFVFOgorICAgICAgbW9kZSA9IGtDR0JsZW5kTW9kZUh1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfQkxFTkRfU0FUVVJBVElPTjoKKyAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVTYXR1cmF0aW9uOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWERJQl9CTEVORF9DT0xPUjoKKyAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVDb2xvcjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfQkxFTkRfTFVNSU5PU0lUWToKKyAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVMdW1pbm9zaXR5OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIG1vZGUgPSBrQ0dCbGVuZE1vZGVOb3JtYWw7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gbW9kZTsKK30KK0ZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6RHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIGdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxBcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzdHJva2VBcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgeworICBTYXZlU3RhdGUoKTsKKyAgQ0dCbGVuZE1vZGUgbW9kZSA9IEdldENHQmxlbmRNb2RlKGJsZW5kX3R5cGUpOworICBpZiAobW9kZSAhPSBrQ0dCbGVuZE1vZGVOb3JtYWwpIHsKKyAgICBDR0NvbnRleHRTZXRCbGVuZE1vZGUoX2NvbnRleHQsIG1vZGUpOworICB9CisgIENHQWZmaW5lVHJhbnNmb3JtIG0gPSBDR0FmZmluZVRyYW5zZm9ybUlkZW50aXR5OworICBpZiAobWF0cml4KSB7CisgICAgbSA9IENHQWZmaW5lVHJhbnNmb3JtTWFrZShtYXRyaXgtPkdldEEoKSwgbWF0cml4LT5HZXRCKCksIG1hdHJpeC0+R2V0QygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LT5HZXREKCksIG1hdHJpeC0+R2V0RSgpLCBtYXRyaXgtPkdldEYoKSk7CisgIH0KKyAgbSA9IENHQWZmaW5lVHJhbnNmb3JtQ29uY2F0KG0sIF9mb3hpdERldmljZTJVc2VyKTsKKyAgQ0dDb250ZXh0Q29uY2F0Q1RNKF9jb250ZXh0LCBtKTsKKyAgaW50IHBhdGhNb2RlID0gMDsKKyAgaWYgKGdyYXBoU3RhdGUgJiYgc3Ryb2tlQXJnYikgeworICAgIENHQ29udGV4dFNldE1pdGVyTGltaXQoX2NvbnRleHQsIGdyYXBoU3RhdGUtPm1fTWl0ZXJMaW1pdCk7CisgICAgRlhfRkxPQVQgbGluZVdpZHRoID0gZ2V0TGluZVdpZHRoKGdyYXBoU3RhdGUsIG0pOworICAgIHNldFN0cm9rZUluZm8oZ3JhcGhTdGF0ZSwgc3Ryb2tlQXJnYiwgbGluZVdpZHRoKTsKKyAgICBwYXRoTW9kZSB8PSA0OworICB9CisgIGlmIChmaWxsTW9kZSAmJiBmaWxsQXJnYikgeworICAgIHNldEZpbGxJbmZvKGZpbGxBcmdiKTsKKyAgICBpZiAoKGZpbGxNb2RlICYgMykgPT0gRlhGSUxMX1dJTkRJTkcpIHsKKyAgICAgIHBhdGhNb2RlIHw9IDE7CisgICAgfSBlbHNlIGlmICgoZmlsbE1vZGUgJiAzKSA9PSBGWEZJTExfQUxURVJOQVRFKSB7CisgICAgICBwYXRoTW9kZSB8PSAyOwogICAgIH0KLSAgICBpZiAocEJpdG1hcC0+R2V0QlBQKCkgPCAzMikgewotICAgICAgICBwQml0bWFwMSA9IHBCaXRtYXAtPkNsb25lQ29udmVydChGWERJQl9SZ2IzMik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHBCaXRtYXAtPkdldEJ1ZmZlcigpKSB7Ci0gICAgICAgICAgICBwQml0bWFwMSA9IChDRlhfRElCaXRtYXAqKXBCaXRtYXA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwQml0bWFwMSA9IHBCaXRtYXAtPkNsb25lKCk7CisgIH0KKyAgc2V0UGF0aFRvQ29udGV4dChwYXRoRGF0YSk7CisgIGlmIChmaWxsTW9kZSAmIEZYRklMTF9GVUxMQ09WRVIpIHsKKyAgICBDR0NvbnRleHRTZXRTaG91bGRBbnRpYWxpYXMoX2NvbnRleHQsIGZhbHNlKTsKKyAgfQorICBpZiAocGF0aE1vZGUgPT0gNCkgeworICAgIENHQ29udGV4dFN0cm9rZVBhdGgoX2NvbnRleHQpOworICB9IGVsc2UgaWYgKHBhdGhNb2RlID09IDEpIHsKKyAgICBDR0NvbnRleHRGaWxsUGF0aChfY29udGV4dCk7CisgIH0gZWxzZSBpZiAocGF0aE1vZGUgPT0gMikgeworICAgIENHQ29udGV4dEVPRmlsbFBhdGgoX2NvbnRleHQpOworICB9IGVsc2UgaWYgKHBhdGhNb2RlID09IDUpIHsKKyAgICBDR0NvbnRleHREcmF3UGF0aChfY29udGV4dCwga0NHUGF0aEZpbGxTdHJva2UpOworICB9IGVsc2UgaWYgKHBhdGhNb2RlID09IDYpIHsKKyAgICBDR0NvbnRleHREcmF3UGF0aChfY29udGV4dCwga0NHUGF0aEVPRmlsbFN0cm9rZSk7CisgIH0KKyAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkZpbGxSZWN0KGNvbnN0IEZYX1JFQ1QqIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZmlsbEFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgQ0dCbGVuZE1vZGUgbW9kZSA9IEdldENHQmxlbmRNb2RlKGJsZW5kX3R5cGUpOworICBpZiAobW9kZSAhPSBrQ0dCbGVuZE1vZGVOb3JtYWwpIHsKKyAgICBDR0NvbnRleHRTZXRCbGVuZE1vZGUoX2NvbnRleHQsIG1vZGUpOworICB9CisgIENHUmVjdCByZWN0X2Z4ID0KKyAgICAgIENHUmVjdE1ha2UocmVjdC0+bGVmdCwgcmVjdC0+dG9wLCByZWN0LT5XaWR0aCgpLCByZWN0LT5IZWlnaHQoKSk7CisgIENHUmVjdCByZWN0X3VzciA9IENHUmVjdEFwcGx5QWZmaW5lVHJhbnNmb3JtKHJlY3RfZngsIF9mb3hpdERldmljZTJVc2VyKTsKKyAgaW50MzJfdCBhLCByLCBnLCBiOworICBBcmdiRGVjb2RlKGZpbGxBcmdiLCBhLCByLCBnLCBiKTsKKyAgQ0dDb250ZXh0U2V0UkdCRmlsbENvbG9yKF9jb250ZXh0LCByIC8gMjU1LmYsIGcgLyAyNTUuZiwgYiAvIDI1NS5mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAvIDI1NS5mKTsKKyAgQ0dDb250ZXh0RmlsbFJlY3QoX2NvbnRleHQsIHJlY3RfdXNyKTsKKyAgaWYgKG1vZGUgIT0ga0NHQmxlbmRNb2RlTm9ybWFsKSB7CisgICAgQ0dDb250ZXh0U2V0QmxlbmRNb2RlKF9jb250ZXh0LCBrQ0dCbGVuZE1vZGVOb3JtYWwpOworICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBpY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgQ0dCbGVuZE1vZGUgbW9kZSA9IEdldENHQmxlbmRNb2RlKGJsZW5kX3R5cGUpOworICBpZiAobW9kZSAhPSBrQ0dCbGVuZE1vZGVOb3JtYWwpIHsKKyAgICBDR0NvbnRleHRTZXRCbGVuZE1vZGUoX2NvbnRleHQsIG1vZGUpOworICB9CisgIENHUG9pbnQgcHQgPQorICAgICAgQ0dQb2ludEFwcGx5QWZmaW5lVHJhbnNmb3JtKENHUG9pbnRNYWtlKHgxLCB5MSksIF9mb3hpdERldmljZTJVc2VyKTsKKyAgeDEgPSBwdC54OworICB5MSA9IHB0Lnk7CisgIHB0ID0gQ0dQb2ludEFwcGx5QWZmaW5lVHJhbnNmb3JtKENHUG9pbnRNYWtlKHgyLCB5MiksIF9mb3hpdERldmljZTJVc2VyKTsKKyAgeDIgPSBwdC54OworICB5MiA9IHB0Lnk7CisgIGludDMyX3QgYSwgciwgZywgYjsKKyAgQXJnYkRlY29kZShhcmdiLCBhLCByLCBnLCBiKTsKKyAgQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IoX2NvbnRleHQsIHIgLyAyNTUuZiwgZyAvIDI1NS5mLCBiIC8gMjU1LmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgLyAyNTUuZik7CisgIENHQ29udGV4dE1vdmVUb1BvaW50KF9jb250ZXh0LCB4MSwgeTEpOworICBDR0NvbnRleHRBZGRMaW5lVG9Qb2ludChfY29udGV4dCwgeDIsIHkyKTsKKyAgQ0dDb250ZXh0U3Ryb2tlUGF0aChfY29udGV4dCk7CisgIGlmIChtb2RlICE9IGtDR0JsZW5kTW9kZU5vcm1hbCkgeworICAgIENHQ29udGV4dFNldEJsZW5kTW9kZShfY29udGV4dCwga0NHQmxlbmRNb2RlTm9ybWFsKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6R2V0Q2xpcEJveChGWF9SRUNUKiByZWN0KSB7CisgIENHUmVjdCByID0gQ0dDb250ZXh0R2V0Q2xpcEJvdW5kaW5nQm94KF9jb250ZXh0KTsKKyAgciA9IENHUmVjdEFwcGx5QWZmaW5lVHJhbnNmb3JtKHIsIF91c2VyMkZveGl0RGV2aWNlKTsKKyAgcmVjdC0+bGVmdCA9IEZYU1lTX2Zsb29yKHIub3JpZ2luLngpOworICByZWN0LT50b3AgPSBGWFNZU19mbG9vcihyLm9yaWdpbi55KTsKKyAgcmVjdC0+cmlnaHQgPSBGWFNZU19jZWlsKHIub3JpZ2luLnggKyByLnNpemUud2lkdGgpOworICByZWN0LT5ib3R0b20gPSBGWFNZU19jZWlsKHIub3JpZ2luLnkgKyByLnNpemUuaGVpZ2h0KTsKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkdldERJQml0cyhDRlhfRElCaXRtYXAqIGJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRFZGdlKSB7CisgIGlmIChGWERDX1BSSU5URVIgPT0gX2RldmljZUNsYXNzKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChiaXRtYXAtPkdldEJQUCgpIDwgMzIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKCEoX3JlbmRlckNhcHMgfCBGWFJDX0dFVF9CSVRTKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDR1BvaW50IHB0ID0gQ0dQb2ludE1ha2UobGVmdCwgdG9wKTsKKyAgcHQgPSBDR1BvaW50QXBwbHlBZmZpbmVUcmFuc2Zvcm0ocHQsIF9mb3hpdERldmljZTJVc2VyKTsKKyAgQ0dBZmZpbmVUcmFuc2Zvcm0gY3RtID0gQ0dDb250ZXh0R2V0Q1RNKF9jb250ZXh0KTsKKyAgcHQueCAqPSBGWFNZU19mYWJzKGN0bS5hKTsKKyAgcHQueSAqPSBGWFNZU19mYWJzKGN0bS5kKTsKKyAgQ0dJbWFnZVJlZiBpbWFnZSA9IENHQml0bWFwQ29udGV4dENyZWF0ZUltYWdlKF9jb250ZXh0KTsKKyAgaWYgKE5VTEwgPT0gaW1hZ2UpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0dGbG9hdCB3aWR0aCA9IChDR0Zsb2F0KWJpdG1hcC0+R2V0V2lkdGgoKTsKKyAgQ0dGbG9hdCBoZWlnaHQgPSAoQ0dGbG9hdCliaXRtYXAtPkdldEhlaWdodCgpOworICBpZiAod2lkdGggKyBwdC54ID4gX3dpZHRoKSB7CisgICAgd2lkdGggLT0gKHdpZHRoICsgcHQueCAtIF93aWR0aCk7CisgIH0KKyAgaWYgKGhlaWdodCArIHB0LnkgPiBfaGVpZ2h0KSB7CisgICAgaGVpZ2h0IC09IChoZWlnaHQgKyBwdC55IC0gX2hlaWdodCk7CisgIH0KKyAgQ0dJbWFnZVJlZiBzdWJJbWFnZSA9IENHSW1hZ2VDcmVhdGVXaXRoSW1hZ2VJblJlY3QoCisgICAgICBpbWFnZSwgQ0dSZWN0TWFrZShwdC54LCBwdC55LCB3aWR0aCwgaGVpZ2h0KSk7CisgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gY3JlYXRlQ29udGV4dFdpdGhCaXRtYXAoYml0bWFwKTsKKyAgQ0dSZWN0IHJlY3QgPSBDR0NvbnRleHRHZXRDbGlwQm91bmRpbmdCb3goY29udGV4dCk7CisgIENHQ29udGV4dENsZWFyUmVjdChjb250ZXh0LCByZWN0KTsKKyAgQ0dDb250ZXh0RHJhd0ltYWdlKGNvbnRleHQsIHJlY3QsIHN1YkltYWdlKTsKKyAgQ0dDb250ZXh0UmVsZWFzZShjb250ZXh0KTsKKyAgQ0dJbWFnZVJlbGVhc2Uoc3ViSW1hZ2UpOworICBDR0ltYWdlUmVsZWFzZShpbWFnZSk7CisgIGlmIChiaXRtYXAtPkhhc0FscGhhKCkpIHsKKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBiaXRtYXAtPkdldEhlaWdodCgpOyByb3crKykgeworICAgICAgdWludDhfdCogcFNjYW5saW5lID0gKHVpbnQ4X3QqKWJpdG1hcC0+R2V0U2NhbmxpbmUocm93KTsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IGJpdG1hcC0+R2V0V2lkdGgoKTsgY29sKyspIHsKKyAgICAgICAgaWYgKHBTY2FubGluZVszXSA+IDApIHsKKyAgICAgICAgICBwU2NhbmxpbmVbMF0gPSAocFNjYW5saW5lWzBdICogMjU1LmYgLyBwU2NhbmxpbmVbM10gKyAuNWYpOworICAgICAgICAgIHBTY2FubGluZVsxXSA9IChwU2NhbmxpbmVbMV0gKiAyNTUuZiAvIHBTY2FubGluZVszXSArIC41Zik7CisgICAgICAgICAgcFNjYW5saW5lWzJdID0gKHBTY2FubGluZVsyXSAqIDI1NS5mIC8gcFNjYW5saW5lWzNdICsgLjVmKTsKICAgICAgICAgfQorICAgICAgICBwU2NhbmxpbmUgKz0gNDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OlNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGljY1RyYW5zZm9ybSkgeworICBTYXZlU3RhdGUoKTsKKyAgQ0dGbG9hdCBzcmNfbGVmdCwgc3JjX3RvcCwgc3JjX3dpZHRoLCBzcmNfaGVpZ2h0OworICBpZiAoc3JjUmVjdCkgeworICAgIHNyY19sZWZ0ID0gc3JjUmVjdC0+bGVmdDsKKyAgICBzcmNfdG9wID0gc3JjUmVjdC0+dG9wOworICAgIHNyY193aWR0aCA9IHNyY1JlY3QtPldpZHRoKCk7CisgICAgc3JjX2hlaWdodCA9IHNyY1JlY3QtPkhlaWdodCgpOworICB9IGVsc2UgeworICAgIHNyY19sZWZ0ID0gc3JjX3RvcCA9IDA7CisgICAgc3JjX3dpZHRoID0gcEJpdG1hcC0+R2V0V2lkdGgoKTsKKyAgICBzcmNfaGVpZ2h0ID0gcEJpdG1hcC0+R2V0SGVpZ2h0KCk7CisgIH0KKyAgQ0dBZmZpbmVUcmFuc2Zvcm0gY3RtID0gQ0dDb250ZXh0R2V0Q1RNKF9jb250ZXh0KTsKKyAgQ0dGbG9hdCBzY2FsZV94ID0gRlhTWVNfZmFicyhjdG0uYSk7CisgIENHRmxvYXQgc2NhbGVfeSA9IEZYU1lTX2ZhYnMoY3RtLmQpOworICBzcmNfbGVmdCAvPSBzY2FsZV94OworICBzcmNfdG9wIC89IHNjYWxlX3k7CisgIHNyY193aWR0aCAvPSBzY2FsZV94OworICBzcmNfaGVpZ2h0IC89IHNjYWxlX3k7CisgIENHUmVjdCByZWN0X2Z4ID0gQ0dSZWN0TWFrZShkZXN0X2xlZnQsIGRlc3RfdG9wLCBzcmNfd2lkdGgsIHNyY19oZWlnaHQpOworICBDR1JlY3QgcmVjdF91c3IgPSBDR1JlY3RBcHBseUFmZmluZVRyYW5zZm9ybShyZWN0X2Z4LCBfZm94aXREZXZpY2UyVXNlcik7CisgIENHQ29udGV4dEJlZ2luUGF0aChfY29udGV4dCk7CisgIENHQ29udGV4dEFkZFJlY3QoX2NvbnRleHQsIHJlY3RfdXNyKTsKKyAgQ0dDb250ZXh0Q2xpcChfY29udGV4dCk7CisgIHJlY3RfdXNyLnNpemUgPQorICAgICAgQ0dTaXplTWFrZShwQml0bWFwLT5HZXRXaWR0aCgpIC8gc2NhbGVfeCwgcEJpdG1hcC0+R2V0SGVpZ2h0KCkgLyBzY2FsZV95KTsKKyAgcmVjdF91c3IgPSBDR1JlY3RPZmZzZXQocmVjdF91c3IsIC1zcmNfbGVmdCwgLXNyY190b3ApOworICBDR19TZXRJbWFnZVRyYW5zZm9ybShkZXN0X2xlZnQsIGRlc3RfdG9wLCBzcmNfd2lkdGgsIHNyY19oZWlnaHQsICZyZWN0X3Vzcik7CisgIENGWF9ESUJpdG1hcCogcEJpdG1hcDEgPSBOVUxMOworICBpZiAocEJpdG1hcC0+SXNBbHBoYU1hc2soKSkgeworICAgIGlmIChwQml0bWFwLT5HZXRCdWZmZXIoKSkgeworICAgICAgcEJpdG1hcDEgPSAoQ0ZYX0RJQml0bWFwKilwQml0bWFwOworICAgIH0gZWxzZSB7CisgICAgICBwQml0bWFwMSA9IHBCaXRtYXAtPkNsb25lKCk7CiAgICAgfQogICAgIGlmIChOVUxMID09IHBCaXRtYXAxKSB7Ci0gICAgICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIGlmIChwQml0bWFwMS0+SGFzQWxwaGEoKSkgewotICAgICAgICBpZiAocEJpdG1hcDEgPT0gcEJpdG1hcCkgewotICAgICAgICAgICAgcEJpdG1hcDEgPSBwQml0bWFwLT5DbG9uZSgpOwotICAgICAgICAgICAgaWYgKCFwQml0bWFwMSkgewotICAgICAgICAgICAgICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IHBCaXRtYXAxLT5HZXRIZWlnaHQoKTsgcm93ICsrKSB7Ci0gICAgICAgICAgICBGWF9MUEJZVEUgcFNjYW5saW5lID0gKEZYX0xQQllURSlwQml0bWFwMS0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBCaXRtYXAxLT5HZXRXaWR0aCgpOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBwU2NhbmxpbmVbMF0gPSAoRlhfQllURSkocFNjYW5saW5lWzBdICogcFNjYW5saW5lWzNdIC8gMjU1LmYgKyAuNWYpOwotICAgICAgICAgICAgICAgIHBTY2FubGluZVsxXSA9IChGWF9CWVRFKShwU2NhbmxpbmVbMV0gKiBwU2NhbmxpbmVbM10gLyAyNTUuZiArIC41Zik7Ci0gICAgICAgICAgICAgICAgcFNjYW5saW5lWzJdID0gKEZYX0JZVEUpKHBTY2FubGluZVsyXSAqIHBTY2FubGluZVszXSAvIDI1NS5mICsgLjVmKTsKLSAgICAgICAgICAgICAgICBwU2NhbmxpbmUgKz0gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBDR0NvbnRleHRSZWYgY3R4ID0gY3JlYXRlQ29udGV4dFdpdGhCaXRtYXAocEJpdG1hcDEpOwotICAgIENHSW1hZ2VSZWYgaW1hZ2UgPSBDR0JpdG1hcENvbnRleHRDcmVhdGVJbWFnZShjdHgpOwotICAgIGludCBibGVuZF9tb2RlID0gYmxlbmRUeXBlOwotICAgIGlmIChGWERJQl9CTEVORF9IQVJETElHSFQgPT0gYmxlbmRUeXBlKSB7Ci0gICAgICAgIGJsZW5kX21vZGUgPSBrQ0dCbGVuZE1vZGVTb2Z0TGlnaHQ7Ci0gICAgfSBlbHNlIGlmIChGWERJQl9CTEVORF9TT0ZUTElHSFQgPT0gYmxlbmRUeXBlKSB7Ci0gICAgICAgIGJsZW5kX21vZGUgPSBrQ0dCbGVuZE1vZGVIYXJkTGlnaHQ7Ci0gICAgfSBlbHNlIGlmIChibGVuZFR5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFICYmIGJsZW5kVHlwZSA8PSBGWERJQl9CTEVORF9MVU1JTk9TSVRZKSB7Ci0gICAgICAgIGJsZW5kX21vZGUgPSBibGVuZFR5cGUgLSA5OwotICAgIH0gZWxzZSBpZiAoYmxlbmRUeXBlID4gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSB8fCBibGVuZFR5cGUgPCAwKSB7Ci0gICAgICAgIGJsZW5kX21vZGUgPSBrQ0dCbGVuZE1vZGVOb3JtYWw7Ci0gICAgfQotICAgIENHQ29udGV4dFNldEJsZW5kTW9kZShfY29udGV4dCwgKENHQmxlbmRNb2RlKWJsZW5kX21vZGUpOwotICAgIENHQ29udGV4dERyYXdJbWFnZShfY29udGV4dCwgcmVjdF91c3IsIGltYWdlKTsKLSAgICBDR0ltYWdlUmVsZWFzZShpbWFnZSk7Ci0gICAgQ0dDb250ZXh0UmVsZWFzZShjdHgpOworICAgIENHRGF0YVByb3ZpZGVyUmVmIHBCaXRtYXBQcm92aWRlciA9IENHRGF0YVByb3ZpZGVyQ3JlYXRlV2l0aERhdGEoCisgICAgICAgIE5VTEwsIHBCaXRtYXAxLT5HZXRCdWZmZXIoKSwKKyAgICAgICAgcEJpdG1hcDEtPkdldFBpdGNoKCkgKiBwQml0bWFwMS0+R2V0SGVpZ2h0KCksIE5VTEwpOworICAgIENHQ29sb3JTcGFjZVJlZiBwQ29sb3JTcGFjZSA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZUdyYXkoKTsKKyAgICBDR0JpdG1hcEluZm8gYml0bWFwSW5mbyA9IGtDR0ltYWdlQWxwaGFOb25lIHwga0NHQml0bWFwQnl0ZU9yZGVyRGVmYXVsdDsKKyAgICBDR0ltYWdlUmVmIHBJbWFnZSA9IENHSW1hZ2VDcmVhdGUoCisgICAgICAgIHBCaXRtYXAxLT5HZXRXaWR0aCgpLCBwQml0bWFwMS0+R2V0SGVpZ2h0KCksIHBCaXRtYXAxLT5HZXRCUFAoKSwKKyAgICAgICAgcEJpdG1hcDEtPkdldEJQUCgpLCBwQml0bWFwMS0+R2V0UGl0Y2goKSwgcENvbG9yU3BhY2UsIGJpdG1hcEluZm8sCisgICAgICAgIHBCaXRtYXBQcm92aWRlciwgTlVMTCwgdHJ1ZSwga0NHUmVuZGVyaW5nSW50ZW50RGVmYXVsdCk7CisgICAgQ0dDb250ZXh0Q2xpcFRvTWFzayhfY29udGV4dCwgcmVjdF91c3IsIHBJbWFnZSk7CisgICAgQ0dDb250ZXh0U2V0UkdCRmlsbENvbG9yKF9jb250ZXh0LCBGWEFSR0JfUihhcmdiKSAvIDI1NS5mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfRyhhcmdiKSAvIDI1NS5mLCBGWEFSR0JfQihhcmdiKSAvIDI1NS5mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfQShhcmdiKSAvIDI1NS5mKTsKKyAgICBDR0NvbnRleHRGaWxsUmVjdChfY29udGV4dCwgcmVjdF91c3IpOworICAgIENHSW1hZ2VSZWxlYXNlKHBJbWFnZSk7CisgICAgQ0dDb2xvclNwYWNlUmVsZWFzZShwQ29sb3JTcGFjZSk7CisgICAgQ0dEYXRhUHJvdmlkZXJSZWxlYXNlKHBCaXRtYXBQcm92aWRlcik7CiAgICAgaWYgKHBCaXRtYXAxICE9IHBCaXRtYXApIHsKLSAgICAgICAgZGVsZXRlIHBCaXRtYXAxOworICAgICAgZGVsZXRlIHBCaXRtYXAxOwogICAgIH0KICAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwogICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqICAgICAgcEJpdG1hcCwKLSAgICAgICAgRlhfQVJHQiAgICAgICAgICAgICAgICAgICAgIGFyZ2IsCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2xlZnQsCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3RvcCwKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfd2lkdGgsCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2hlaWdodCwKLSAgICAgICAgY29uc3QgRlhfUkVDVCogICAgICAgICAgICAgIGNsaXBSZWN0LAotICAgICAgICBGWF9EV09SRCAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUZsYWcJICAgLAotICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgaWNjVHJhbnNmb3JtICwKLSAgICAgICAgaW50CQkJCQkJCWJsZW5kX3R5cGUpCi17Ci0gICAgU2F2ZVN0YXRlKCk7Ci0gICAgaWYgKGNsaXBSZWN0KSB7Ci0gICAgICAgIENHQ29udGV4dEJlZ2luUGF0aChfY29udGV4dCk7Ci0gICAgICAgIENHUmVjdCByZWN0X2NsaXAgPSBDR1JlY3RNYWtlKGNsaXBSZWN0LT5sZWZ0LCBjbGlwUmVjdC0+dG9wLCBjbGlwUmVjdC0+V2lkdGgoKSwgY2xpcFJlY3QtPkhlaWdodCgpKTsKLSAgICAgICAgcmVjdF9jbGlwID0gQ0dSZWN0QXBwbHlBZmZpbmVUcmFuc2Zvcm0ocmVjdF9jbGlwLCBfZm94aXREZXZpY2UyVXNlcik7Ci0gICAgICAgIENHQ29udGV4dEFkZFJlY3QoX2NvbnRleHQsIHJlY3RfY2xpcCk7Ci0gICAgICAgIENHQ29udGV4dENsaXAoX2NvbnRleHQpOwotICAgIH0KLSAgICBDR1JlY3QgcmVjdCA9IENHUmVjdE1ha2UoZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQpOwotICAgIHJlY3QgPSBDR1JlY3RBcHBseUFmZmluZVRyYW5zZm9ybShyZWN0LCBfZm94aXREZXZpY2UyVXNlcik7Ci0gICAgaWYgKEZYRElCX0JJQ1VCSUNfSU5URVJQT0wgPT0gZmxhZ3MpIHsKLSAgICAgICAgQ0dDb250ZXh0U2V0SW50ZXJwb2xhdGlvblF1YWxpdHkoX2NvbnRleHQsIGtDR0ludGVycG9sYXRpb25IaWdoKTsKLSAgICB9IGVsc2UgaWYgKEZYRElCX0RPV05TQU1QTEUgPT0gZmxhZ3MpIHsKLSAgICAgICAgQ0dDb250ZXh0U2V0SW50ZXJwb2xhdGlvblF1YWxpdHkoX2NvbnRleHQsIGtDR0ludGVycG9sYXRpb25Ob25lKTsKKyAgfQorICBpZiAocEJpdG1hcC0+R2V0QlBQKCkgPCAzMikgeworICAgIHBCaXRtYXAxID0gcEJpdG1hcC0+Q2xvbmVDb252ZXJ0KEZYRElCX1JnYjMyKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAocEJpdG1hcC0+R2V0QnVmZmVyKCkpIHsKKyAgICAgIHBCaXRtYXAxID0gKENGWF9ESUJpdG1hcCopcEJpdG1hcDsKICAgICB9IGVsc2UgewotICAgICAgICBDR0NvbnRleHRTZXRJbnRlcnBvbGF0aW9uUXVhbGl0eShfY29udGV4dCwga0NHSW50ZXJwb2xhdGlvbk1lZGl1bSk7CisgICAgICBwQml0bWFwMSA9IHBCaXRtYXAtPkNsb25lKCk7CiAgICAgfQotICAgIENHX1NldEltYWdlVHJhbnNmb3JtKGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0KTsKLSAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAxID0gTlVMTDsKLSAgICBpZiAocEJpdG1hcC0+SXNBbHBoYU1hc2soKSkgewotICAgICAgICBpZiAocEJpdG1hcC0+R2V0QnVmZmVyKCkpIHsKLSAgICAgICAgICAgIHBCaXRtYXAxID0gKENGWF9ESUJpdG1hcCopcEJpdG1hcDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBCaXRtYXAxID0gcEJpdG1hcC0+Q2xvbmUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTlVMTCA9PSBwQml0bWFwMSkgewotICAgICAgICAgICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBDR0RhdGFQcm92aWRlclJlZiBwQml0bWFwUHJvdmlkZXIgPSBDR0RhdGFQcm92aWRlckNyZWF0ZVdpdGhEYXRhKE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAxLT5HZXRCdWZmZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdG1hcDEtPkdldFBpdGNoKCkgKiBwQml0bWFwMS0+R2V0SGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgICAgICBDR0NvbG9yU3BhY2VSZWYgcENvbG9yU3BhY2UgPSBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VHcmF5KCk7Ci0gICAgICAgIENHQml0bWFwSW5mbyBiaXRtYXBJbmZvID0ga0NHSW1hZ2VBbHBoYU5vbmUgfCBrQ0dCaXRtYXBCeXRlT3JkZXJEZWZhdWx0OwotICAgICAgICBDR0ltYWdlUmVmIHBJbWFnZSA9IENHSW1hZ2VDcmVhdGUocEJpdG1hcDEtPkdldFdpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwMS0+R2V0SGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwMS0+R2V0QlBQKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwMS0+R2V0QlBQKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwMS0+R2V0UGl0Y2goKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2xvclNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXBQcm92aWRlciwgTlVMTCwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDR1JlbmRlcmluZ0ludGVudERlZmF1bHQpOwotICAgICAgICBDR0NvbnRleHRDbGlwVG9NYXNrKF9jb250ZXh0LCByZWN0LCBwSW1hZ2UpOwotICAgICAgICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfUihhcmdiKSAvIDI1NS5mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX0coYXJnYikgLyAyNTUuZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9CKGFyZ2IpIC8gMjU1LmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfQShhcmdiKSAvIDI1NS5mKTsKLSAgICAgICAgQ0dDb250ZXh0RmlsbFJlY3QoX2NvbnRleHQsIHJlY3QpOwotICAgICAgICBDR0ltYWdlUmVsZWFzZShwSW1hZ2UpOwotICAgICAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKHBDb2xvclNwYWNlKTsKLSAgICAgICAgQ0dEYXRhUHJvdmlkZXJSZWxlYXNlKHBCaXRtYXBQcm92aWRlcik7Ci0gICAgICAgIGlmIChwQml0bWFwMSAhPSBwQml0bWFwKSB7Ci0gICAgICAgICAgICBkZWxldGUgcEJpdG1hcDE7Ci0gICAgICAgIH0KLSAgICAgICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmIChwQml0bWFwLT5HZXRCUFAoKSA8IDMyKSB7Ci0gICAgICAgIHBCaXRtYXAxID0gcEJpdG1hcC0+Q2xvbmVDb252ZXJ0KEZYRElCX1JnYjMyKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAocEJpdG1hcC0+R2V0QnVmZmVyKCkpIHsKLSAgICAgICAgICAgIHBCaXRtYXAxID0gKENGWF9ESUJpdG1hcCopcEJpdG1hcDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBCaXRtYXAxID0gcEJpdG1hcC0+Q2xvbmUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoTlVMTCA9PSBwQml0bWFwMSkgeworICB9CisgIGlmIChOVUxMID09IHBCaXRtYXAxKSB7CisgICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKHBCaXRtYXAxLT5IYXNBbHBoYSgpKSB7CisgICAgaWYgKHBCaXRtYXAxID09IHBCaXRtYXApIHsKKyAgICAgIHBCaXRtYXAxID0gcEJpdG1hcC0+Q2xvbmUoKTsKKyAgICAgIGlmICghcEJpdG1hcDEpIHsKICAgICAgICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQogICAgIH0KLSAgICBpZiAocEJpdG1hcDEtPkhhc0FscGhhKCkpIHsKLSAgICAgICAgaWYgKHBCaXRtYXAxID09IHBCaXRtYXApIHsKLSAgICAgICAgICAgIHBCaXRtYXAxID0gcEJpdG1hcC0+Q2xvbmUoKTsKLSAgICAgICAgICAgIGlmICghcEJpdG1hcDEpIHsKLSAgICAgICAgICAgICAgICBSZXN0b3JlU3RhdGUoRkFMU0UpOwotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBwQml0bWFwMS0+R2V0SGVpZ2h0KCk7IHJvdyArKykgewotICAgICAgICAgICAgRlhfTFBCWVRFIHBTY2FubGluZSA9IChGWF9MUEJZVEUpcEJpdG1hcDEtPkdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwQml0bWFwMS0+R2V0V2lkdGgoKTsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgcFNjYW5saW5lWzBdID0gKEZYX0JZVEUpKHBTY2FubGluZVswXSAqIHBTY2FubGluZVszXSAvIDI1NS5mICsgLjVmKTsKLSAgICAgICAgICAgICAgICBwU2NhbmxpbmVbMV0gPSAoRlhfQllURSkocFNjYW5saW5lWzFdICogcFNjYW5saW5lWzNdIC8gMjU1LmYgKyAuNWYpOwotICAgICAgICAgICAgICAgIHBTY2FubGluZVsyXSA9IChGWF9CWVRFKShwU2NhbmxpbmVbMl0gKiBwU2NhbmxpbmVbM10gLyAyNTUuZiArIC41Zik7Ci0gICAgICAgICAgICAgICAgcFNjYW5saW5lICs9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBwQml0bWFwMS0+R2V0SGVpZ2h0KCk7IHJvdysrKSB7CisgICAgICB1aW50OF90KiBwU2NhbmxpbmUgPSAodWludDhfdCopcEJpdG1hcDEtPkdldFNjYW5saW5lKHJvdyk7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwQml0bWFwMS0+R2V0V2lkdGgoKTsgY29sKyspIHsKKyAgICAgICAgcFNjYW5saW5lWzBdID0gKHVpbnQ4X3QpKHBTY2FubGluZVswXSAqIHBTY2FubGluZVszXSAvIDI1NS5mICsgLjVmKTsKKyAgICAgICAgcFNjYW5saW5lWzFdID0gKHVpbnQ4X3QpKHBTY2FubGluZVsxXSAqIHBTY2FubGluZVszXSAvIDI1NS5mICsgLjVmKTsKKyAgICAgICAgcFNjYW5saW5lWzJdID0gKHVpbnQ4X3QpKHBTY2FubGluZVsyXSAqIHBTY2FubGluZVszXSAvIDI1NS5mICsgLjVmKTsKKyAgICAgICAgcFNjYW5saW5lICs9IDQ7CisgICAgICB9CiAgICAgfQotICAgIENHQ29udGV4dFJlZiBjdHggPSBjcmVhdGVDb250ZXh0V2l0aEJpdG1hcChwQml0bWFwMSk7Ci0gICAgQ0dJbWFnZVJlZiBpbWFnZSA9IENHQml0bWFwQ29udGV4dENyZWF0ZUltYWdlKGN0eCk7Ci0gICAgQ0dDb250ZXh0RHJhd0ltYWdlKF9jb250ZXh0LCByZWN0LCBpbWFnZSk7Ci0gICAgQ0dJbWFnZVJlbGVhc2UoaW1hZ2UpOwotICAgIENHQ29udGV4dFJlbGVhc2UoY3R4KTsKLSAgICBpZiAocEJpdG1hcDEgIT0gcEJpdG1hcCkgewotICAgICAgICBkZWxldGUgcEJpdG1hcDE7Ci0gICAgfQotICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7Ci0gICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgQ0dDb250ZXh0UmVmIGN0eCA9IGNyZWF0ZUNvbnRleHRXaXRoQml0bWFwKHBCaXRtYXAxKTsKKyAgQ0dJbWFnZVJlZiBpbWFnZSA9IENHQml0bWFwQ29udGV4dENyZWF0ZUltYWdlKGN0eCk7CisgIGludCBibGVuZF9tb2RlID0gYmxlbmRUeXBlOworICBpZiAoRlhESUJfQkxFTkRfSEFSRExJR0hUID09IGJsZW5kVHlwZSkgeworICAgIGJsZW5kX21vZGUgPSBrQ0dCbGVuZE1vZGVTb2Z0TGlnaHQ7CisgIH0gZWxzZSBpZiAoRlhESUJfQkxFTkRfU09GVExJR0hUID09IGJsZW5kVHlwZSkgeworICAgIGJsZW5kX21vZGUgPSBrQ0dCbGVuZE1vZGVIYXJkTGlnaHQ7CisgIH0gZWxzZSBpZiAoYmxlbmRUeXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSAmJgorICAgICAgICAgICAgIGJsZW5kVHlwZSA8PSBGWERJQl9CTEVORF9MVU1JTk9TSVRZKSB7CisgICAgYmxlbmRfbW9kZSA9IGJsZW5kVHlwZSAtIDk7CisgIH0gZWxzZSBpZiAoYmxlbmRUeXBlID4gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSB8fCBibGVuZFR5cGUgPCAwKSB7CisgICAgYmxlbmRfbW9kZSA9IGtDR0JsZW5kTW9kZU5vcm1hbDsKKyAgfQorICBDR0NvbnRleHRTZXRCbGVuZE1vZGUoX2NvbnRleHQsIChDR0JsZW5kTW9kZSlibGVuZF9tb2RlKTsKKyAgQ0dDb250ZXh0RHJhd0ltYWdlKF9jb250ZXh0LCByZWN0X3VzciwgaW1hZ2UpOworICBDR0ltYWdlUmVsZWFzZShpbWFnZSk7CisgIENHQ29udGV4dFJlbGVhc2UoY3R4KTsKKyAgaWYgKHBCaXRtYXAxICE9IHBCaXRtYXApIHsKKyAgICBkZWxldGUgcEJpdG1hcDE7CisgIH0KKyAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkNHX0RyYXdHbHlwUnVuKGludCAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFycywKLSAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqICAgICAgcENoYXJQb3MsCi0gICAgICAgIENGWF9Gb250KiAgICAgICAgICAgICAgICAgIHBGb250LAotICAgICAgICBDRlhfRm9udENhY2hlKiAgICAgICAgICAgICBwQ2FjaGUsCi0gICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqICAgIHBHbHlwaE1hdHJpeCwKLSAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogICAgcE9iamVjdDJEZXZpY2UsCi0gICAgICAgIEZYX0ZMT0FUICAgICAgICAgICAgICAgICAgIGZvbnRfc2l6ZSwKLSAgICAgICAgRlhfRFdPUkQgICAgICAgICAgICAgICAgICAgYXJnYiwKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZmxhZywKLSAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSkKLXsKLSAgICBpZiAobkNoYXJzID09IDApIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIENRdWFydHoyRCYgcXVhcnR6MmQgPSAoKENBcHBsZVBsYXRmb3JtICopIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+X3F1YXJ0ejJkOwotICAgIGlmICghcEZvbnQtPm1fcFBsYXRmb3JtRm9udCkgewotICAgICAgICBpZiAocEZvbnQtPkdldFBzTmFtZSgpID09IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoIkRGSGVpU3RkLVc1IikpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBwRm9udC0+bV9wUGxhdGZvcm1Gb250ID0gcXVhcnR6MmQuQ3JlYXRlRm9udChwRm9udC0+bV9wRm9udERhdGEsIHBGb250LT5tX2R3U2l6ZSk7Ci0gICAgICAgIGlmIChOVUxMID09IHBGb250LT5tX3BQbGF0Zm9ybUZvbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBDRlhfRml4ZWRCdWZHcm93PEZYX1dPUkQsIDMyPiBnbHlwaF9pbmRpY2VzKG5DaGFycyk7Ci0gICAgQ0ZYX0ZpeGVkQnVmR3JvdzxDR1BvaW50LCAzMj4gZ2x5cGhfcG9zaXRpb25zKG5DaGFycyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ2hhcnM7IGkrKyApIHsKLSAgICAgICAgZ2x5cGhfaW5kaWNlc1tpXSA9IHBDaGFyUG9zW2ldLm1fRXh0R0lEOwotICAgICAgICBnbHlwaF9wb3NpdGlvbnNbaV0ueCA9IHBDaGFyUG9zW2ldLm1fT3JpZ2luWDsKLSAgICAgICAgZ2x5cGhfcG9zaXRpb25zW2ldLnkgPSBwQ2hhclBvc1tpXS5tX09yaWdpblk7Ci0gICAgfQotICAgIENGWF9BZmZpbmVNYXRyaXggdGV4dF9tYXRyaXg7Ci0gICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7Ci0gICAgICAgIHRleHRfbWF0cml4LkNvbmNhdCgqcE9iamVjdDJEZXZpY2UpOwotICAgIH0KLSAgICBDR0FmZmluZVRyYW5zZm9ybSBtYXRyaXhfY2cgPSBDR0FmZmluZVRyYW5zZm9ybU1ha2UodGV4dF9tYXRyaXguYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X21hdHJpeC5iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfbWF0cml4LmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9tYXRyaXguZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X21hdHJpeC5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfbWF0cml4LmYpOwotICAgIG1hdHJpeF9jZyA9IENHQWZmaW5lVHJhbnNmb3JtQ29uY2F0KG1hdHJpeF9jZywgX2ZveGl0RGV2aWNlMlVzZXIpOwotICAgIENHQ29udGV4dFNldFRleHRNYXRyaXgoX2NvbnRleHQsIG1hdHJpeF9jZyk7Ci0gICAgQ0dDb250ZXh0U2V0Rm9udChfY29udGV4dCwgKENHRm9udFJlZilwRm9udC0+bV9wUGxhdGZvcm1Gb250KTsKLSAgICBDR0NvbnRleHRTZXRGb250U2l6ZShfY29udGV4dCwgRlhTWVNfZmFicyhmb250X3NpemUpKTsKLSAgICBGWF9JTlQzMiBhLCByLCBnLCBiOwotICAgIEFyZ2JEZWNvZGUoYXJnYiwgYSwgciwgZywgYik7Ci0gICAgQ0dDb250ZXh0U2V0UkdCRmlsbENvbG9yKF9jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIC8gMjU1LmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgLyAyNTUuZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiAvIDI1NS5mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIC8gMjU1LmYpOwotICAgIFNhdmVTdGF0ZSgpOwotICAgIGlmIChwR2x5cGhNYXRyaXgpIHsKLSAgICAgICAgQ0dQb2ludCBvcmlnaW4gPSBDR1BvaW50TWFrZSggZ2x5cGhfcG9zaXRpb25zWzBdLngsICBnbHlwaF9wb3NpdGlvbnNbMF0ueSk7Ci0gICAgICAgIG9yaWdpbiA9IENHUG9pbnRBcHBseUFmZmluZVRyYW5zZm9ybShvcmlnaW4sIG1hdHJpeF9jZyk7Ci0gICAgICAgIENHQ29udGV4dFRyYW5zbGF0ZUNUTShfY29udGV4dCwgb3JpZ2luLngsIG9yaWdpbi55KTsKLSAgICAgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gZ2x5cGhfbWF0cml4ID0gQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlKHBHbHlwaE1hdHJpeC0+YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEdseXBoTWF0cml4LT5iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwR2x5cGhNYXRyaXgtPmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBHbHlwaE1hdHJpeC0+ZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEdseXBoTWF0cml4LT5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwR2x5cGhNYXRyaXgtPmYpOwotICAgICAgICBpZiAoX2ZveGl0RGV2aWNlMlVzZXIuZCA8IDApIHsKLSAgICAgICAgICAgIGdseXBoX21hdHJpeCA9IENHQWZmaW5lVHJhbnNmb3JtSW52ZXJ0KGdseXBoX21hdHJpeCk7Ci0gICAgICAgIH0KLSAgICAgICAgQ0dDb250ZXh0Q29uY2F0Q1RNKF9jb250ZXh0LCBnbHlwaF9tYXRyaXgpOwotICAgICAgICBDR0NvbnRleHRUcmFuc2xhdGVDVE0oX2NvbnRleHQsIC1vcmlnaW4ueCwgLW9yaWdpbi55KTsKLSAgICB9Ci0gICAgQ0dDb250ZXh0U2hvd0dseXBoc0F0UG9zaXRpb25zKF9jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0dHbHlwaCopZ2x5cGhfaW5kaWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfcG9zaXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhcnMpOwotICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkRyYXdEZXZpY2VUZXh0KGludCAgICAgICAgICAgICAgICAgICAgICBuQ2hhcnMsCi0gICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiAgICBwQ2hhclBvcywKLSAgICAgICAgQ0ZYX0ZvbnQqICAgICAgICAgICAgICAgIHBGb250LAotICAgICAgICBDRlhfRm9udENhY2hlKiAgICAgICAgICAgcENhY2hlLAotICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiAgcE9iamVjdDJEZXZpY2UsCi0gICAgICAgIEZYX0ZMT0FUICAgICAgICAgICAgICAgICBmb250X3NpemUsCi0gICAgICAgIEZYX0RXT1JEICAgICAgICAgICAgICAgICBjb2xvciwKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ZsYWcgICAgICAgLAotICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSkKLXsKLSAgICBpZiAoTlVMTCA9PSBwRm9udCB8fCBOVUxMID09IF9jb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfQk9PTCBiQm9sZCA9IHBGb250LT5Jc0JvbGQoKTsKLSAgICBpZiAoIWJCb2xkICYmIHBGb250LT5HZXRTdWJzdEZvbnQoKSAmJgotICAgICAgICAgICAgcEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX1dlaWdodCA+PSA1MDAgJiYKLSAgICAgICAgICAgIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9XZWlnaHQgPD0gNjAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgU2F2ZVN0YXRlKCk7Ci0gICAgQ0dDb250ZXh0U2V0VGV4dERyYXdpbmdNb2RlKF9jb250ZXh0LCBrQ0dUZXh0RmlsbENsaXApOwotICAgIEZYX0JPT0wgcmV0ID0gRkFMU0U7Ci0gICAgRlhfSU5UMzIgaSA9IDA7Ci0gICAgd2hpbGUgKGkgPCBuQ2hhcnMpIHsKLSAgICAgICAgaWYgKHBDaGFyUG9zW2ldLm1fYkdseXBoQWRqdXN0IHx8IGZvbnRfc2l6ZSA8IDApIHsKLSAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgIHJldCA9IENHX0RyYXdHbHlwUnVuKGksIHBDaGFyUG9zLCBwRm9udCwgcENhY2hlLCBOVUxMLCBwT2JqZWN0MkRldmljZSwgZm9udF9zaXplLCBjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFyZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogY2hhcl9wb3MgPSBwQ2hhclBvcyArIGk7Ci0gICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4IGdscGh5X21hdHJpeDsKLSAgICAgICAgICAgIGlmIChmb250X3NpemUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgZ2xwaHlfbWF0cml4LkNvbmNhdCgtMSwgMCwgMCwgLTEsIDAsIDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNoYXJfcG9zLT5tX2JHbHlwaEFkanVzdCkgewotICAgICAgICAgICAgICAgIGdscGh5X21hdHJpeC5Db25jYXQoY2hhcl9wb3MtPm1fQWRqdXN0TWF0cml4WzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9wb3MtPm1fQWRqdXN0TWF0cml4WzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9wb3MtPm1fQWRqdXN0TWF0cml4WzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9wb3MtPm1fQWRqdXN0TWF0cml4WzNdLCAwLCAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldCA9IENHX0RyYXdHbHlwUnVuKDEsIGNoYXJfcG9zLCBwRm9udCwgcENhY2hlLCAmZ2xwaHlfbWF0cml4LCBwT2JqZWN0MkRldmljZSwgZm9udF9zaXplLCBjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICBpZiAoIXJldCkgewotICAgICAgICAgICAgICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGkgKys7Ci0gICAgICAgICAgICBwQ2hhclBvcyArPSBpOwotICAgICAgICAgICAgbkNoYXJzIC09IGk7Ci0gICAgICAgICAgICBpID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGkgKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgIHJldCA9IENHX0RyYXdHbHlwUnVuKGksIHBDaGFyUG9zLCBwRm9udCwgcENhY2hlLCBOVUxMLCBwT2JqZWN0MkRldmljZSwgZm9udF9zaXplLCBjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci0gICAgfQotICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLXZvaWQgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6c2V0U3Ryb2tlSW5mbyhjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIGdyYXBoU3RhdGUsIEZYX0FSR0IgYXJnYiwgRlhfRkxPQVQgbGluZVdpZHRoKQotewotICAgIGlmIChOVUxMID09IGdyYXBoU3RhdGUpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDR0NvbnRleHRTZXRMaW5lV2lkdGgoX2NvbnRleHQsIGxpbmVXaWR0aCk7Ci0gICAgQ0dMaW5lQ2FwIGNhcDsKLSAgICBzd2l0Y2ggKGdyYXBoU3RhdGUtPm1fTGluZUNhcCkgewotICAgICAgICBjYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcFJvdW5kOiB7Ci0gICAgICAgICAgICAgICAgY2FwID0ga0NHTGluZUNhcFJvdW5kOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcFNxdWFyZTogewotICAgICAgICAgICAgICAgIGNhcCA9IGtDR0xpbmVDYXBTcXVhcmU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwQnV0dDoKLSAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIGNhcCA9IGtDR0xpbmVDYXBCdXR0OwotICAgICAgICAgICAgfQotICAgIH0KLSAgICBDR0NvbnRleHRTZXRMaW5lQ2FwKF9jb250ZXh0LCBjYXApOwotICAgIENHTGluZUpvaW4gam9pbjsKLSAgICBzd2l0Y2ggKGdyYXBoU3RhdGUtPm1fTGluZUpvaW4pIHsKLSAgICAgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luUm91bmQ6IHsKLSAgICAgICAgICAgICAgICBqb2luID0ga0NHTGluZUpvaW5Sb3VuZDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luQmV2ZWw6IHsKLSAgICAgICAgICAgICAgICBqb2luID0ga0NHTGluZUpvaW5CZXZlbDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luTWl0ZXI6Ci0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICBqb2luID0ga0NHTGluZUpvaW5NaXRlcjsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0gICAgQ0dDb250ZXh0U2V0TGluZUpvaW4oX2NvbnRleHQsIGpvaW4pOwotICAgIGlmIChncmFwaFN0YXRlLT5tX0Rhc2hDb3VudCkgewotI2lmIENHRkxPQVRfSVNfRE9VQkxFCi0gICAgICAgIENHRmxvYXQqIGRhc2hBcnJheSA9IG5ldyBDR0Zsb2F0W2dyYXBoU3RhdGUtPm1fRGFzaENvdW50XTsKLSAgICAgICAgaWYgKCFkYXNoQXJyYXkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZ3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQ7ICsraW5kZXgpIHsKLSAgICAgICAgICAgIGRhc2hBcnJheVtpbmRleF0gPSBncmFwaFN0YXRlLT5tX0Rhc2hBcnJheVtpbmRleF07Ci0gICAgICAgIH0KLSNlbHNlCi0gICAgICAgIENHRmxvYXQqIGRhc2hBcnJheSA9IChDR0Zsb2F0KilncmFwaFN0YXRlLT5tX0Rhc2hBcnJheTsKLSNlbmRpZgotICAgICAgICBDR0NvbnRleHRTZXRMaW5lRGFzaChfY29udGV4dCwgZ3JhcGhTdGF0ZS0+bV9EYXNoUGhhc2UsIGRhc2hBcnJheSwgZ3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQpOwotI2lmIENHRkxPQVRfSVNfRE9VQkxFCi0gICAgICAgIGRlbGV0ZVtdIGRhc2hBcnJheTsKLSNlbmRpZgotICAgIH0KLSAgICBGWF9JTlQzMiBhLCByLCBnLCBiOwotICAgIEFyZ2JEZWNvZGUoYXJnYiwgYSwgciwgZywgYik7Ci0gICAgQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IoX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciAvIDI1NS5mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgLyAyNTUuZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiIC8gMjU1LmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAvIDI1NS5mKTsKLX0KLXZvaWQgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6c2V0RmlsbEluZm8oRlhfQVJHQiBhcmdiKQotewotICAgIEZYX0lOVDMyIGEsIHIsIGcsIGI7Ci0gICAgQXJnYkRlY29kZShhcmdiLCBhLCByLCBnLCBiKTsKLSAgICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgLyAyNTUuZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyAvIDI1NS5mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiIC8gMjU1LmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgLyAyNTUuZik7Ci19Ci12b2lkIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OnNldFBhdGhUb0NvbnRleHQoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwYXRoRGF0YSkKLXsKLSAgICBGWF9JTlQzMiBjb3VudCA9IHBhdGhEYXRhLT5HZXRQb2ludENvdW50KCk7Ci0gICAgRlhfUEFUSFBPSU5UKiBwb2ludHMgPSBwYXRoRGF0YS0+R2V0UG9pbnRzKCk7CitGWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OlN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIGNsaXBSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogaWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7CisgIFNhdmVTdGF0ZSgpOworICBpZiAoY2xpcFJlY3QpIHsKICAgICBDR0NvbnRleHRCZWdpblBhdGgoX2NvbnRleHQpOwotICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgewotICAgICAgICBzd2l0Y2ggKHBvaW50c1tpXS5tX0ZsYWcgJiBGWFBUX1RZUEUpIHsKLSAgICAgICAgICAgIGNhc2UgRlhQVF9NT1ZFVE86Ci0gICAgICAgICAgICAgICAgQ0dDb250ZXh0TW92ZVRvUG9pbnQoX2NvbnRleHQsIHBvaW50c1tpXS5tX1BvaW50WCwgcG9pbnRzW2ldLm1fUG9pbnRZKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRlhQVF9MSU5FVE86Ci0gICAgICAgICAgICAgICAgQ0dDb250ZXh0QWRkTGluZVRvUG9pbnQoX2NvbnRleHQsIHBvaW50c1tpXS5tX1BvaW50WCwgcG9pbnRzW2ldLm1fUG9pbnRZKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRlhQVF9CRVpJRVJUTzogewotICAgICAgICAgICAgICAgICAgICBDR0NvbnRleHRBZGRDdXJ2ZVRvUG9pbnQoX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHNbaV0ubV9Qb2ludFgsIHBvaW50c1tpXS5tX1BvaW50WSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50c1tpICsgMV0ubV9Qb2ludFgsIHBvaW50c1tpICsgMV0ubV9Qb2ludFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHNbaSArIDJdLm1fUG9pbnRYLCBwb2ludHNbaSArIDJdLm1fUG9pbnRZKTsKLSAgICAgICAgICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocG9pbnRzW2ldLm1fRmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpIHsKLSAgICAgICAgICAgIENHQ29udGV4dENsb3NlUGF0aChfY29udGV4dCk7Ci0gICAgICAgIH0KKyAgICBDR1JlY3QgcmVjdF9jbGlwID0gQ0dSZWN0TWFrZShjbGlwUmVjdC0+bGVmdCwgY2xpcFJlY3QtPnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUmVjdC0+V2lkdGgoKSwgY2xpcFJlY3QtPkhlaWdodCgpKTsKKyAgICByZWN0X2NsaXAgPSBDR1JlY3RBcHBseUFmZmluZVRyYW5zZm9ybShyZWN0X2NsaXAsIF9mb3hpdERldmljZTJVc2VyKTsKKyAgICBDR0NvbnRleHRBZGRSZWN0KF9jb250ZXh0LCByZWN0X2NsaXApOworICAgIENHQ29udGV4dENsaXAoX2NvbnRleHQpOworICB9CisgIENHUmVjdCByZWN0ID0gQ0dSZWN0TWFrZShkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCk7CisgIHJlY3QgPSBDR1JlY3RBcHBseUFmZmluZVRyYW5zZm9ybShyZWN0LCBfZm94aXREZXZpY2UyVXNlcik7CisgIGlmIChGWERJQl9CSUNVQklDX0lOVEVSUE9MID09IGZsYWdzKSB7CisgICAgQ0dDb250ZXh0U2V0SW50ZXJwb2xhdGlvblF1YWxpdHkoX2NvbnRleHQsIGtDR0ludGVycG9sYXRpb25IaWdoKTsKKyAgfSBlbHNlIGlmIChGWERJQl9ET1dOU0FNUExFID09IGZsYWdzKSB7CisgICAgQ0dDb250ZXh0U2V0SW50ZXJwb2xhdGlvblF1YWxpdHkoX2NvbnRleHQsIGtDR0ludGVycG9sYXRpb25Ob25lKTsKKyAgfSBlbHNlIHsKKyAgICBDR0NvbnRleHRTZXRJbnRlcnBvbGF0aW9uUXVhbGl0eShfY29udGV4dCwga0NHSW50ZXJwb2xhdGlvbk1lZGl1bSk7CisgIH0KKyAgQ0dfU2V0SW1hZ2VUcmFuc2Zvcm0oZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQpOworICBDRlhfRElCaXRtYXAqIHBCaXRtYXAxID0gTlVMTDsKKyAgaWYgKHBCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKKyAgICBpZiAocEJpdG1hcC0+R2V0QnVmZmVyKCkpIHsKKyAgICAgIHBCaXRtYXAxID0gKENGWF9ESUJpdG1hcCopcEJpdG1hcDsKKyAgICB9IGVsc2UgeworICAgICAgcEJpdG1hcDEgPSBwQml0bWFwLT5DbG9uZSgpOwogICAgIH0KLX0KLXZvaWQgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6Q0dfU2V0SW1hZ2VUcmFuc2Zvcm0oaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LAotICAgICAgICBDR1JlY3QqIHJlY3QgKQotewotICAgIGludCBmbGlwX3kgPSBfZm94aXREZXZpY2UyVXNlci5kICogZGVzdF9oZWlnaHQgPCAwID8gMSA6IC0xOwotICAgIGludCBmbGlwX3ggPSBfZm94aXREZXZpY2UyVXNlci5hICogZGVzdF93aWR0aCA+IDAgPyAxIDogLTE7Ci0gICAgaWYgKGZsaXBfeSA8IDAgfHwgZmxpcF94IDwgMCkgewotICAgICAgICBpZiAoZGVzdF9oZWlnaHQgPCAwKSB7Ci0gICAgICAgICAgICBkZXN0X2hlaWdodCA9IC1kZXN0X2hlaWdodDsKLSAgICAgICAgICAgIGRlc3RfdG9wIC09IGRlc3RfaGVpZ2h0OwotICAgICAgICB9Ci0gICAgICAgIENHUmVjdCBydCA9IENHUmVjdEFwcGx5QWZmaW5lVHJhbnNmb3JtKENHUmVjdE1ha2UoZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQpLCBfZm94aXREZXZpY2UyVXNlcik7Ci0gICAgICAgIENHRmxvYXQgb2Zmc2V0X3ggPSAocnQub3JpZ2luLngpICsgcnQuc2l6ZS53aWR0aCAvIDIuZiwKLSAgICAgICAgICAgICAgICBvZmZzZXRfeSA9IChydC5vcmlnaW4ueSkgKyBydC5zaXplLmhlaWdodCAvIDIuZjsKLSAgICAgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtID0gQ0dBZmZpbmVUcmFuc2Zvcm1JZGVudGl0eTsKLSAgICAgICAgdHJhbnNmb3JtID0gQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXQodHJhbnNmb3JtLCBDR0FmZmluZVRyYW5zZm9ybU1ha2UoMSwgMCwgMCwgMSwgLW9mZnNldF94LCAtb2Zmc2V0X3kpKTsKLSAgICAgICAgdHJhbnNmb3JtID0gQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXQodHJhbnNmb3JtLCBDR0FmZmluZVRyYW5zZm9ybU1ha2UoZmxpcF94LCAwLCAwLCBmbGlwX3ksIDAsIDApKTsKLSAgICAgICAgdHJhbnNmb3JtID0gQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXQodHJhbnNmb3JtLCBDR0FmZmluZVRyYW5zZm9ybU1ha2UoMSwgMCwgMCwgMSwgb2Zmc2V0X3gsIG9mZnNldF95KSk7Ci0gICAgICAgIENHQ29udGV4dENvbmNhdENUTShfY29udGV4dCwgdHJhbnNmb3JtKTsKLSAgICAgICAgaWYgKHJlY3QpIHsKLSAgICAgICAgICAgICpyZWN0ID0gQ0dSZWN0QXBwbHlBZmZpbmVUcmFuc2Zvcm0oKnJlY3QsIHRyYW5zZm9ybSk7Ci0gICAgICAgIH0KKyAgICBpZiAoTlVMTCA9PSBwQml0bWFwMSkgeworICAgICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci19Ci12b2lkIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkNsZWFyRHJpdmVyKCkKLXsKLSAgICBpZiAoTlVMTCA9PSBfY29udGV4dCkgewotICAgICAgICByZXR1cm47CisgICAgQ0dEYXRhUHJvdmlkZXJSZWYgcEJpdG1hcFByb3ZpZGVyID0gQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRoRGF0YSgKKyAgICAgICAgTlVMTCwgcEJpdG1hcDEtPkdldEJ1ZmZlcigpLAorICAgICAgICBwQml0bWFwMS0+R2V0UGl0Y2goKSAqIHBCaXRtYXAxLT5HZXRIZWlnaHQoKSwgTlVMTCk7CisgICAgQ0dDb2xvclNwYWNlUmVmIHBDb2xvclNwYWNlID0gQ0dDb2xvclNwYWNlQ3JlYXRlRGV2aWNlR3JheSgpOworICAgIENHQml0bWFwSW5mbyBiaXRtYXBJbmZvID0ga0NHSW1hZ2VBbHBoYU5vbmUgfCBrQ0dCaXRtYXBCeXRlT3JkZXJEZWZhdWx0OworICAgIENHSW1hZ2VSZWYgcEltYWdlID0gQ0dJbWFnZUNyZWF0ZSgKKyAgICAgICAgcEJpdG1hcDEtPkdldFdpZHRoKCksIHBCaXRtYXAxLT5HZXRIZWlnaHQoKSwgcEJpdG1hcDEtPkdldEJQUCgpLAorICAgICAgICBwQml0bWFwMS0+R2V0QlBQKCksIHBCaXRtYXAxLT5HZXRQaXRjaCgpLCBwQ29sb3JTcGFjZSwgYml0bWFwSW5mbywKKyAgICAgICAgcEJpdG1hcFByb3ZpZGVyLCBOVUxMLCB0cnVlLCBrQ0dSZW5kZXJpbmdJbnRlbnREZWZhdWx0KTsKKyAgICBDR0NvbnRleHRDbGlwVG9NYXNrKF9jb250ZXh0LCByZWN0LCBwSW1hZ2UpOworICAgIENHQ29udGV4dFNldFJHQkZpbGxDb2xvcihfY29udGV4dCwgRlhBUkdCX1IoYXJnYikgLyAyNTUuZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX0coYXJnYikgLyAyNTUuZiwgRlhBUkdCX0IoYXJnYikgLyAyNTUuZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX0EoYXJnYikgLyAyNTUuZik7CisgICAgQ0dDb250ZXh0RmlsbFJlY3QoX2NvbnRleHQsIHJlY3QpOworICAgIENHSW1hZ2VSZWxlYXNlKHBJbWFnZSk7CisgICAgQ0dDb2xvclNwYWNlUmVsZWFzZShwQ29sb3JTcGFjZSk7CisgICAgQ0dEYXRhUHJvdmlkZXJSZWxlYXNlKHBCaXRtYXBQcm92aWRlcik7CisgICAgaWYgKHBCaXRtYXAxICE9IHBCaXRtYXApIHsKKyAgICAgIGRlbGV0ZSBwQml0bWFwMTsKICAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3NhdmVDb3VudDsgKytpKSB7Ci0gICAgICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoX2NvbnRleHQpOwotICAgIH0KLSAgICBtX3NhdmVDb3VudCA9IDA7Ci0gICAgaWYgKF9jb250ZXh0KSB7Ci0gICAgICAgIENHQ29udGV4dFJlbGVhc2UoX2NvbnRleHQpOwotICAgIH0KLX0KLUNGWF9RdWFydHpEZXZpY2U6OkNGWF9RdWFydHpEZXZpY2UoKQotewotICAgIG1fYk93bmVkQml0bWFwID0gRkFMU0U7Ci0gICAgbV9wQ29udGV4dCA9IE5VTEw7Ci19Ci1DRlhfUXVhcnR6RGV2aWNlOjp+Q0ZYX1F1YXJ0ekRldmljZSgpCi17Ci0gICAgaWYgKG1fcENvbnRleHQpIHsKLSAgICAgICAgQ0dDb250ZXh0UmVsZWFzZShtX3BDb250ZXh0KTsKLSAgICB9Ci0gICAgaWYgKEdldEJpdG1hcCgpICYmIG1fYk93bmVkQml0bWFwKSB7Ci0gICAgICAgIGRlbGV0ZSBHZXRCaXRtYXAoKTsKLSAgICB9Ci19Ci1DR0NvbnRleHRSZWYgQ0ZYX1F1YXJ0ekRldmljZTo6R2V0Q29udGV4dCgpCi17Ci0gICAgcmV0dXJuIG1fcENvbnRleHQ7Ci19Ci1GWF9CT09MIENGWF9RdWFydHpEZXZpY2U6OkF0dGFjaChDR0NvbnRleHRSZWYgY29udGV4dCwgRlhfSU5UMzIgbkRldmljZUNsYXNzKQotewotICAgIGlmIChtX3BDb250ZXh0KSB7Ci0gICAgICAgIENHQ29udGV4dFJlbGVhc2UobV9wQ29udGV4dCk7Ci0gICAgfQotICAgIG1fcENvbnRleHQgPSBjb250ZXh0OwotICAgIENHQ29udGV4dFJldGFpbihtX3BDb250ZXh0KTsKLSAgICBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyKiBwRHJpdmVyID0gbmV3IENGWF9RdWFydHpEZXZpY2VEcml2ZXIobV9wQ29udGV4dCwgbkRldmljZUNsYXNzKTsKLSAgICBTZXREZXZpY2VEcml2ZXIocERyaXZlcik7CisgICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKICAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZTo6QXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCkKLXsKLSAgICBTZXRCaXRtYXAocEJpdG1hcCk7Ci0gICAgbV9wQ29udGV4dCA9IGNyZWF0ZUNvbnRleHRXaXRoQml0bWFwKHBCaXRtYXApOwotICAgIGlmIChOVUxMID09IG1fcENvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChwQml0bWFwLT5HZXRCUFAoKSA8IDMyKSB7CisgICAgcEJpdG1hcDEgPSBwQml0bWFwLT5DbG9uZUNvbnZlcnQoRlhESUJfUmdiMzIpOworICB9IGVsc2UgeworICAgIGlmIChwQml0bWFwLT5HZXRCdWZmZXIoKSkgeworICAgICAgcEJpdG1hcDEgPSAoQ0ZYX0RJQml0bWFwKilwQml0bWFwOworICAgIH0gZWxzZSB7CisgICAgICBwQml0bWFwMSA9IHBCaXRtYXAtPkNsb25lKCk7CiAgICAgfQotICAgIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPSBuZXcgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcihtX3BDb250ZXh0LCBGWERDX0RJU1BMQVkpOwotICAgIFNldERldmljZURyaXZlcihwRHJpdmVyKTsKKyAgfQorICBpZiAoTlVMTCA9PSBwQml0bWFwMSkgeworICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChwQml0bWFwMS0+SGFzQWxwaGEoKSkgeworICAgIGlmIChwQml0bWFwMSA9PSBwQml0bWFwKSB7CisgICAgICBwQml0bWFwMSA9IHBCaXRtYXAtPkNsb25lKCk7CisgICAgICBpZiAoIXBCaXRtYXAxKSB7CisgICAgICAgIFJlc3RvcmVTdGF0ZShGQUxTRSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgcEJpdG1hcDEtPkdldEhlaWdodCgpOyByb3crKykgeworICAgICAgdWludDhfdCogcFNjYW5saW5lID0gKHVpbnQ4X3QqKXBCaXRtYXAxLT5HZXRTY2FubGluZShyb3cpOworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcEJpdG1hcDEtPkdldFdpZHRoKCk7IGNvbCsrKSB7CisgICAgICAgIHBTY2FubGluZVswXSA9ICh1aW50OF90KShwU2NhbmxpbmVbMF0gKiBwU2NhbmxpbmVbM10gLyAyNTUuZiArIC41Zik7CisgICAgICAgIHBTY2FubGluZVsxXSA9ICh1aW50OF90KShwU2NhbmxpbmVbMV0gKiBwU2NhbmxpbmVbM10gLyAyNTUuZiArIC41Zik7CisgICAgICAgIHBTY2FubGluZVsyXSA9ICh1aW50OF90KShwU2NhbmxpbmVbMl0gKiBwU2NhbmxpbmVbM10gLyAyNTUuZiArIC41Zik7CisgICAgICAgIHBTY2FubGluZSArPSA0OworICAgICAgfQorICAgIH0KKyAgfQorICBDR0NvbnRleHRSZWYgY3R4ID0gY3JlYXRlQ29udGV4dFdpdGhCaXRtYXAocEJpdG1hcDEpOworICBDR0ltYWdlUmVmIGltYWdlID0gQ0dCaXRtYXBDb250ZXh0Q3JlYXRlSW1hZ2UoY3R4KTsKKyAgQ0dDb250ZXh0RHJhd0ltYWdlKF9jb250ZXh0LCByZWN0LCBpbWFnZSk7CisgIENHSW1hZ2VSZWxlYXNlKGltYWdlKTsKKyAgQ0dDb250ZXh0UmVsZWFzZShjdHgpOworICBpZiAocEJpdG1hcDEgIT0gcEJpdG1hcCkgeworICAgIGRlbGV0ZSBwQml0bWFwMTsKKyAgfQorICBSZXN0b3JlU3RhdGUoRkFMU0UpOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6Q0dfRHJhd0dseXBSdW4oaW50IG5DaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcEdseXBoTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBpZiAobkNoYXJzID09IDApIHsKICAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZTo6Q3JlYXRlKEZYX0lOVDMyIHdpZHRoLCBGWF9JTlQzMiBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQpCi17Ci0gICAgaWYgKChGWF9CWVRFKWZvcm1hdCA8IDMyKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDUXVhcnR6MkQmIHF1YXJ0ejJkID0KKyAgICAgICgoQ0FwcGxlUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+X3F1YXJ0ejJkOworICBpZiAoIXBGb250LT5HZXRQbGF0Zm9ybUZvbnQoKSkgeworICAgIGlmIChwRm9udC0+R2V0UHNOYW1lKCkgPT0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbCgiREZIZWlTdGQtVzUiKSkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOwotICAgIGlmICghcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCkpIHsKLSAgICAgICAgZGVsZXRlIHBCaXRtYXA7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICBwRm9udC0+U2V0UGxhdGZvcm1Gb250KAorICAgICAgICBxdWFydHoyZC5DcmVhdGVGb250KHBGb250LT5HZXRGb250RGF0YSgpLCBwRm9udC0+R2V0U2l6ZSgpKSk7CisgICAgaWYgKCFwRm9udC0+R2V0UGxhdGZvcm1Gb250KCkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgbV9iT3duZWRCaXRtYXAgPSBUUlVFOwotICAgIHJldHVybiBBdHRhY2gocEJpdG1hcCk7CisgIH0KKyAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9XT1JELCAzMj4gZ2x5cGhfaW5kaWNlcyhuQ2hhcnMpOworICBDRlhfRml4ZWRCdWZHcm93PENHUG9pbnQsIDMyPiBnbHlwaF9wb3NpdGlvbnMobkNoYXJzKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ2hhcnM7IGkrKykgeworICAgIGdseXBoX2luZGljZXNbaV0gPSBwQ2hhclBvc1tpXS5tX0V4dEdJRDsKKyAgICBnbHlwaF9wb3NpdGlvbnNbaV0ueCA9IHBDaGFyUG9zW2ldLm1fT3JpZ2luWDsKKyAgICBnbHlwaF9wb3NpdGlvbnNbaV0ueSA9IHBDaGFyUG9zW2ldLm1fT3JpZ2luWTsKKyAgfQorICBDRlhfTWF0cml4IHRleHRfbWF0cml4OworICBpZiAocE9iamVjdDJEZXZpY2UpIHsKKyAgICB0ZXh0X21hdHJpeC5Db25jYXQoKnBPYmplY3QyRGV2aWNlKTsKKyAgfQorICBDR0FmZmluZVRyYW5zZm9ybSBtYXRyaXhfY2cgPQorICAgICAgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlKHRleHRfbWF0cml4LmEsIHRleHRfbWF0cml4LmIsIHRleHRfbWF0cml4LmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9tYXRyaXguZCwgdGV4dF9tYXRyaXguZSwgdGV4dF9tYXRyaXguZik7CisgIG1hdHJpeF9jZyA9IENHQWZmaW5lVHJhbnNmb3JtQ29uY2F0KG1hdHJpeF9jZywgX2ZveGl0RGV2aWNlMlVzZXIpOworICBDR0NvbnRleHRTZXRUZXh0TWF0cml4KF9jb250ZXh0LCBtYXRyaXhfY2cpOworICBDR0NvbnRleHRTZXRGb250KF9jb250ZXh0LCAoQ0dGb250UmVmKXBGb250LT5HZXRQbGF0Zm9ybUZvbnQoKSk7CisgIENHQ29udGV4dFNldEZvbnRTaXplKF9jb250ZXh0LCBGWFNZU19mYWJzKGZvbnRfc2l6ZSkpOworICBpbnQzMl90IGEsIHIsIGcsIGI7CisgIEFyZ2JEZWNvZGUoYXJnYiwgYSwgciwgZywgYik7CisgIENHQ29udGV4dFNldFJHQkZpbGxDb2xvcihfY29udGV4dCwgciAvIDI1NS5mLCBnIC8gMjU1LmYsIGIgLyAyNTUuZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgLyAyNTUuZik7CisgIFNhdmVTdGF0ZSgpOworICBpZiAocEdseXBoTWF0cml4KSB7CisgICAgQ0dQb2ludCBvcmlnaW4gPSBDR1BvaW50TWFrZShnbHlwaF9wb3NpdGlvbnNbMF0ueCwgZ2x5cGhfcG9zaXRpb25zWzBdLnkpOworICAgIG9yaWdpbiA9IENHUG9pbnRBcHBseUFmZmluZVRyYW5zZm9ybShvcmlnaW4sIG1hdHJpeF9jZyk7CisgICAgQ0dDb250ZXh0VHJhbnNsYXRlQ1RNKF9jb250ZXh0LCBvcmlnaW4ueCwgb3JpZ2luLnkpOworICAgIENHQWZmaW5lVHJhbnNmb3JtIGdseXBoX21hdHJpeCA9IENHQWZmaW5lVHJhbnNmb3JtTWFrZSgKKyAgICAgICAgcEdseXBoTWF0cml4LT5hLCBwR2x5cGhNYXRyaXgtPmIsIHBHbHlwaE1hdHJpeC0+YywgcEdseXBoTWF0cml4LT5kLAorICAgICAgICBwR2x5cGhNYXRyaXgtPmUsIHBHbHlwaE1hdHJpeC0+Zik7CisgICAgaWYgKF9mb3hpdERldmljZTJVc2VyLmQgPCAwKSB7CisgICAgICBnbHlwaF9tYXRyaXggPSBDR0FmZmluZVRyYW5zZm9ybUludmVydChnbHlwaF9tYXRyaXgpOworICAgIH0KKyAgICBDR0NvbnRleHRDb25jYXRDVE0oX2NvbnRleHQsIGdseXBoX21hdHJpeCk7CisgICAgQ0dDb250ZXh0VHJhbnNsYXRlQ1RNKF9jb250ZXh0LCAtb3JpZ2luLngsIC1vcmlnaW4ueSk7CisgIH0KKyAgQ0dDb250ZXh0U2hvd0dseXBoc0F0UG9zaXRpb25zKF9jb250ZXh0LCAoQ0dHbHlwaCopZ2x5cGhfaW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX3Bvc2l0aW9ucywgbkNoYXJzKTsKKyAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKKyAgcmV0dXJuIFRSVUU7CiB9CitGWF9CT09MIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkRyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udENhY2hlKiBwQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBpZiAoTlVMTCA9PSBwRm9udCB8fCBOVUxMID09IF9jb250ZXh0KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX0JPT0wgYkJvbGQgPSBwRm9udC0+SXNCb2xkKCk7CisgIGlmICghYkJvbGQgJiYgcEZvbnQtPkdldFN1YnN0Rm9udCgpICYmCisgICAgICBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0ID49IDUwMCAmJgorICAgICAgcEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX1dlaWdodCA8PSA2MDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgU2F2ZVN0YXRlKCk7CisgIENHQ29udGV4dFNldFRleHREcmF3aW5nTW9kZShfY29udGV4dCwga0NHVGV4dEZpbGxDbGlwKTsKKyAgRlhfQk9PTCByZXQgPSBGQUxTRTsKKyAgaW50MzJfdCBpID0gMDsKKyAgd2hpbGUgKGkgPCBuQ2hhcnMpIHsKKyAgICBpZiAocENoYXJQb3NbaV0ubV9iR2x5cGhBZGp1c3QgfHwgZm9udF9zaXplIDwgMCkgeworICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgIHJldCA9IENHX0RyYXdHbHlwUnVuKGksIHBDaGFyUG9zLCBwRm9udCwgcENhY2hlLCBOVUxMLCBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udF9zaXplLCBjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CisgICAgICAgIGlmICghcmV0KSB7CisgICAgICAgICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKKyAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICB9CisgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogY2hhcl9wb3MgPSBwQ2hhclBvcyArIGk7CisgICAgICBDRlhfTWF0cml4IGdscGh5X21hdHJpeDsKKyAgICAgIGlmIChmb250X3NpemUgPCAwKSB7CisgICAgICAgIGdscGh5X21hdHJpeC5Db25jYXQoLTEsIDAsIDAsIC0xLCAwLCAwKTsKKyAgICAgIH0KKyAgICAgIGlmIChjaGFyX3Bvcy0+bV9iR2x5cGhBZGp1c3QpIHsKKyAgICAgICAgZ2xwaHlfbWF0cml4LkNvbmNhdCgKKyAgICAgICAgICAgIGNoYXJfcG9zLT5tX0FkanVzdE1hdHJpeFswXSwgY2hhcl9wb3MtPm1fQWRqdXN0TWF0cml4WzFdLAorICAgICAgICAgICAgY2hhcl9wb3MtPm1fQWRqdXN0TWF0cml4WzJdLCBjaGFyX3Bvcy0+bV9BZGp1c3RNYXRyaXhbM10sIDAsIDApOworICAgICAgfQorICAgICAgcmV0ID0gQ0dfRHJhd0dseXBSdW4oMSwgY2hhcl9wb3MsIHBGb250LCBwQ2FjaGUsICZnbHBoeV9tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0MkRldmljZSwgZm9udF9zaXplLCBjb2xvciwgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJY2NUcmFuc2Zvcm0pOworICAgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgUmVzdG9yZVN0YXRlKEZBTFNFKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIH0KKyAgICAgIGkrKzsKKyAgICAgIHBDaGFyUG9zICs9IGk7CisgICAgICBuQ2hhcnMgLT0gaTsKKyAgICAgIGkgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBpKys7CisgICAgfQorICB9CisgIGlmIChpID4gMCkgeworICAgIHJldCA9IENHX0RyYXdHbHlwUnVuKGksIHBDaGFyUG9zLCBwRm9udCwgcENhY2hlLCBOVUxMLCBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb250X3NpemUsIGNvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKKyAgfQorICBSZXN0b3JlU3RhdGUoRkFMU0UpOworICByZXR1cm4gcmV0OworfQordm9pZCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpzZXRTdHJva2VJbmZvKGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogZ3JhcGhTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbGluZVdpZHRoKSB7CisgIGlmIChOVUxMID09IGdyYXBoU3RhdGUpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ0dDb250ZXh0U2V0TGluZVdpZHRoKF9jb250ZXh0LCBsaW5lV2lkdGgpOworICBDR0xpbmVDYXAgY2FwOworICBzd2l0Y2ggKGdyYXBoU3RhdGUtPm1fTGluZUNhcCkgeworICAgIGNhc2UgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwUm91bmQ6IHsKKyAgICAgIGNhcCA9IGtDR0xpbmVDYXBSb3VuZDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcFNxdWFyZTogeworICAgICAgY2FwID0ga0NHTGluZUNhcFNxdWFyZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcEJ1dHQ6CisgICAgZGVmYXVsdDogeyBjYXAgPSBrQ0dMaW5lQ2FwQnV0dDsgfQorICB9CisgIENHQ29udGV4dFNldExpbmVDYXAoX2NvbnRleHQsIGNhcCk7CisgIENHTGluZUpvaW4gam9pbjsKKyAgc3dpdGNoIChncmFwaFN0YXRlLT5tX0xpbmVKb2luKSB7CisgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luUm91bmQ6IHsKKyAgICAgIGpvaW4gPSBrQ0dMaW5lSm9pblJvdW5kOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pbkJldmVsOiB7CisgICAgICBqb2luID0ga0NHTGluZUpvaW5CZXZlbDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUpvaW5NaXRlcjoKKyAgICBkZWZhdWx0OiB7IGpvaW4gPSBrQ0dMaW5lSm9pbk1pdGVyOyB9CisgIH0KKyAgQ0dDb250ZXh0U2V0TGluZUpvaW4oX2NvbnRleHQsIGpvaW4pOworICBpZiAoZ3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQpIHsKKyNpZiBDR0ZMT0FUX0lTX0RPVUJMRQorICAgIENHRmxvYXQqIGRhc2hBcnJheSA9IG5ldyBDR0Zsb2F0W2dyYXBoU3RhdGUtPm1fRGFzaENvdW50XTsKKyAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZ3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQ7ICsraW5kZXgpIHsKKyAgICAgIGRhc2hBcnJheVtpbmRleF0gPSBncmFwaFN0YXRlLT5tX0Rhc2hBcnJheVtpbmRleF07CisgICAgfQorI2Vsc2UKKyAgICBDR0Zsb2F0KiBkYXNoQXJyYXkgPSAoQ0dGbG9hdCopZ3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXk7CiAjZW5kaWYKKyAgICBDR0NvbnRleHRTZXRMaW5lRGFzaChfY29udGV4dCwgZ3JhcGhTdGF0ZS0+bV9EYXNoUGhhc2UsIGRhc2hBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaFN0YXRlLT5tX0Rhc2hDb3VudCk7CisjaWYgQ0dGTE9BVF9JU19ET1VCTEUKKyAgICBkZWxldGVbXSBkYXNoQXJyYXk7CisjZW5kaWYKKyAgfQorICBpbnQzMl90IGEsIHIsIGcsIGI7CisgIEFyZ2JEZWNvZGUoYXJnYiwgYSwgciwgZywgYik7CisgIENHQ29udGV4dFNldFJHQlN0cm9rZUNvbG9yKF9jb250ZXh0LCByIC8gMjU1LmYsIGcgLyAyNTUuZiwgYiAvIDI1NS5mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIC8gMjU1LmYpOworfQordm9pZCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpzZXRGaWxsSW5mbyhGWF9BUkdCIGFyZ2IpIHsKKyAgaW50MzJfdCBhLCByLCBnLCBiOworICBBcmdiRGVjb2RlKGFyZ2IsIGEsIHIsIGcsIGIpOworICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoX2NvbnRleHQsIHIgLyAyNTUuZiwgZyAvIDI1NS5mLCBiIC8gMjU1LmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhIC8gMjU1LmYpOworfQordm9pZCBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyOjpzZXRQYXRoVG9Db250ZXh0KGNvbnN0IENGWF9QYXRoRGF0YSogcGF0aERhdGEpIHsKKyAgaW50MzJfdCBjb3VudCA9IHBhdGhEYXRhLT5HZXRQb2ludENvdW50KCk7CisgIEZYX1BBVEhQT0lOVCogcG9pbnRzID0gcGF0aERhdGEtPkdldFBvaW50cygpOworICBDR0NvbnRleHRCZWdpblBhdGgoX2NvbnRleHQpOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgc3dpdGNoIChwb2ludHNbaV0ubV9GbGFnICYgRlhQVF9UWVBFKSB7CisgICAgICBjYXNlIEZYUFRfTU9WRVRPOgorICAgICAgICBDR0NvbnRleHRNb3ZlVG9Qb2ludChfY29udGV4dCwgcG9pbnRzW2ldLm1fUG9pbnRYLCBwb2ludHNbaV0ubV9Qb2ludFkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRlhQVF9MSU5FVE86CisgICAgICAgIENHQ29udGV4dEFkZExpbmVUb1BvaW50KF9jb250ZXh0LCBwb2ludHNbaV0ubV9Qb2ludFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50c1tpXS5tX1BvaW50WSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWFBUX0JFWklFUlRPOiB7CisgICAgICAgIENHQ29udGV4dEFkZEN1cnZlVG9Qb2ludChfY29udGV4dCwgcG9pbnRzW2ldLm1fUG9pbnRYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzW2ldLm1fUG9pbnRZLCBwb2ludHNbaSArIDFdLm1fUG9pbnRYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzW2kgKyAxXS5tX1BvaW50WSwgcG9pbnRzW2kgKyAyXS5tX1BvaW50WCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50c1tpICsgMl0ubV9Qb2ludFkpOworICAgICAgICBpICs9IDI7CisgICAgICB9CisgICAgfQorICAgIGlmIChwb2ludHNbaV0ubV9GbGFnICYgRlhQVF9DTE9TRUZJR1VSRSkgeworICAgICAgQ0dDb250ZXh0Q2xvc2VQYXRoKF9jb250ZXh0KTsKKyAgICB9CisgIH0KK30KK3ZvaWQgQ0ZYX1F1YXJ0ekRldmljZURyaXZlcjo6Q0dfU2V0SW1hZ2VUcmFuc2Zvcm0oaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDR1JlY3QqIHJlY3QpIHsKKyAgaW50IGZsaXBfeSA9IF9mb3hpdERldmljZTJVc2VyLmQgKiBkZXN0X2hlaWdodCA8IDAgPyAxIDogLTE7CisgIGludCBmbGlwX3ggPSBfZm94aXREZXZpY2UyVXNlci5hICogZGVzdF93aWR0aCA+IDAgPyAxIDogLTE7CisgIGlmIChmbGlwX3kgPCAwIHx8IGZsaXBfeCA8IDApIHsKKyAgICBpZiAoZGVzdF9oZWlnaHQgPCAwKSB7CisgICAgICBkZXN0X2hlaWdodCA9IC1kZXN0X2hlaWdodDsKKyAgICAgIGRlc3RfdG9wIC09IGRlc3RfaGVpZ2h0OworICAgIH0KKyAgICBDR1JlY3QgcnQgPSBDR1JlY3RBcHBseUFmZmluZVRyYW5zZm9ybSgKKyAgICAgICAgQ0dSZWN0TWFrZShkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCksCisgICAgICAgIF9mb3hpdERldmljZTJVc2VyKTsKKyAgICBDR0Zsb2F0IG9mZnNldF94ID0gKHJ0Lm9yaWdpbi54KSArIHJ0LnNpemUud2lkdGggLyAyLmYsCisgICAgICAgICAgICBvZmZzZXRfeSA9IChydC5vcmlnaW4ueSkgKyBydC5zaXplLmhlaWdodCAvIDIuZjsKKyAgICBDR0FmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm0gPSBDR0FmZmluZVRyYW5zZm9ybUlkZW50aXR5OworICAgIHRyYW5zZm9ybSA9IENHQWZmaW5lVHJhbnNmb3JtQ29uY2F0KAorICAgICAgICB0cmFuc2Zvcm0sIENHQWZmaW5lVHJhbnNmb3JtTWFrZSgxLCAwLCAwLCAxLCAtb2Zmc2V0X3gsIC1vZmZzZXRfeSkpOworICAgIHRyYW5zZm9ybSA9IENHQWZmaW5lVHJhbnNmb3JtQ29uY2F0KAorICAgICAgICB0cmFuc2Zvcm0sIENHQWZmaW5lVHJhbnNmb3JtTWFrZShmbGlwX3gsIDAsIDAsIGZsaXBfeSwgMCwgMCkpOworICAgIHRyYW5zZm9ybSA9IENHQWZmaW5lVHJhbnNmb3JtQ29uY2F0KAorICAgICAgICB0cmFuc2Zvcm0sIENHQWZmaW5lVHJhbnNmb3JtTWFrZSgxLCAwLCAwLCAxLCBvZmZzZXRfeCwgb2Zmc2V0X3kpKTsKKyAgICBDR0NvbnRleHRDb25jYXRDVE0oX2NvbnRleHQsIHRyYW5zZm9ybSk7CisgICAgaWYgKHJlY3QpIHsKKyAgICAgICpyZWN0ID0gQ0dSZWN0QXBwbHlBZmZpbmVUcmFuc2Zvcm0oKnJlY3QsIHRyYW5zZm9ybSk7CisgICAgfQorICB9Cit9Cit2b2lkIENGWF9RdWFydHpEZXZpY2VEcml2ZXI6OkNsZWFyRHJpdmVyKCkgeworICBpZiAoTlVMTCA9PSBfY29udGV4dCkgeworICAgIHJldHVybjsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IG1fc2F2ZUNvdW50OyArK2kpIHsKKyAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKF9jb250ZXh0KTsKKyAgfQorICBtX3NhdmVDb3VudCA9IDA7CisgIGlmIChfY29udGV4dCkgeworICAgIENHQ29udGV4dFJlbGVhc2UoX2NvbnRleHQpOworICB9Cit9CitDRlhfUXVhcnR6RGV2aWNlOjpDRlhfUXVhcnR6RGV2aWNlKCkgeworICBtX2JPd25lZEJpdG1hcCA9IEZBTFNFOworICBtX3BDb250ZXh0ID0gTlVMTDsKK30KK0NGWF9RdWFydHpEZXZpY2U6On5DRlhfUXVhcnR6RGV2aWNlKCkgeworICBpZiAobV9wQ29udGV4dCkgeworICAgIENHQ29udGV4dFJlbGVhc2UobV9wQ29udGV4dCk7CisgIH0KKyAgaWYgKG1fYk93bmVkQml0bWFwKSB7CisgICAgZGVsZXRlIEdldEJpdG1hcCgpOworICB9Cit9CitDR0NvbnRleHRSZWYgQ0ZYX1F1YXJ0ekRldmljZTo6R2V0Q29udGV4dCgpIHsKKyAgcmV0dXJuIG1fcENvbnRleHQ7Cit9CitGWF9CT09MIENGWF9RdWFydHpEZXZpY2U6OkF0dGFjaChDR0NvbnRleHRSZWYgY29udGV4dCwgaW50MzJfdCBuRGV2aWNlQ2xhc3MpIHsKKyAgaWYgKG1fcENvbnRleHQpIHsKKyAgICBDR0NvbnRleHRSZWxlYXNlKG1fcENvbnRleHQpOworICB9CisgIG1fcENvbnRleHQgPSBjb250ZXh0OworICBDR0NvbnRleHRSZXRhaW4obV9wQ29udGV4dCk7CisgIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPQorICAgICAgbmV3IENGWF9RdWFydHpEZXZpY2VEcml2ZXIobV9wQ29udGV4dCwgbkRldmljZUNsYXNzKTsKKyAgU2V0RGV2aWNlRHJpdmVyKHBEcml2ZXIpOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0ZYX1F1YXJ0ekRldmljZTo6QXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCkgeworICBTZXRCaXRtYXAocEJpdG1hcCk7CisgIG1fcENvbnRleHQgPSBjcmVhdGVDb250ZXh0V2l0aEJpdG1hcChwQml0bWFwKTsKKyAgaWYgKE5VTEwgPT0gbV9wQ29udGV4dCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyKiBwRHJpdmVyID0KKyAgICAgIG5ldyBDRlhfUXVhcnR6RGV2aWNlRHJpdmVyKG1fcENvbnRleHQsIEZYRENfRElTUExBWSk7CisgIFNldERldmljZURyaXZlcihwRHJpdmVyKTsKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENGWF9RdWFydHpEZXZpY2U6OkNyZWF0ZShpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgZm9ybWF0KSB7CisgIGlmICgodWludDhfdClmb3JtYXQgPCAzMikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOworICBpZiAoIXBCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpKSB7CisgICAgZGVsZXRlIHBCaXRtYXA7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fYk93bmVkQml0bWFwID0gVFJVRTsKKyAgcmV0dXJuIEF0dGFjaChwQml0bWFwKTsKK30KKyNlbmRpZiAgLy8gX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2RpYi9kaWJfaW50LmggYi9jb3JlL3NyYy9meGdlL2RpYi9kaWJfaW50LmgKaW5kZXggYzgyYTAzNy4uYjg5ZTE5ZiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9kaWIvZGliX2ludC5oCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZGliL2RpYl9pbnQuaApAQCAtNyw4NyArNywxMDEgQEAKICNpZm5kZWYgQ09SRV9TUkNfRlhHRV9ESUJfRElCX0lOVF9IXwogI2RlZmluZSBDT1JFX1NSQ19GWEdFX0RJQl9ESUJfSU5UX0hfCiAKLWNsYXNzIENQREZfRml4ZWRNYXRyaXggCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9GaXhlZE1hdHJpeChjb25zdCBDRlhfQWZmaW5lTWF0cml4JiBzcmMsIGludCBiaXRzKQotICAgIHsKLSAgICAgICAgYmFzZSA9IDEgPDwgYml0czsKLSAgICAgICAgYSA9IEZYU1lTX3JvdW5kKHNyYy5hICogYmFzZSk7Ci0gICAgICAgIGIgPSBGWFNZU19yb3VuZChzcmMuYiAqIGJhc2UpOwotICAgICAgICBjID0gRlhTWVNfcm91bmQoc3JjLmMgKiBiYXNlKTsKLSAgICAgICAgZCA9IEZYU1lTX3JvdW5kKHNyYy5kICogYmFzZSk7Ci0gICAgICAgIGUgPSBGWFNZU19yb3VuZChzcmMuZSAqIGJhc2UpOwotICAgICAgICBmID0gRlhTWVNfcm91bmQoc3JjLmYgKiBiYXNlKTsKLSAgICB9Ci0gICAgaW5saW5lIHZvaWQJVHJhbnNmb3JtKGludCB4LCBpbnQgeSwgaW50JiB4MSwgaW50JiB5MSkKLSAgICB7Ci0gICAgICAgIHgxID0gKGEgKiB4ICsgYyAqIHkgKyBlICsgYmFzZSAvIDIpIC8gYmFzZTsKLSAgICAgICAgeTEgPSAoYiAqIHggKyBkICogeSArIGYgKyBiYXNlIC8gMikgLyBiYXNlOwotICAgIH0KLSAgICBpbnQJCWEsIGIsIGMsIGQsIGUsIGY7Ci0gICAgaW50CQliYXNlOworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZGliLmgiCisKK2NsYXNzIElGWF9TY2FubGluZUNvbXBvc2VyOworCitleHRlcm4gY29uc3QgaW50MTZfdCBTRFBfVGFibGVbNTEzXTsKKworY2xhc3MgQ1BERl9GaXhlZE1hdHJpeCB7CisgcHVibGljOgorICBDUERGX0ZpeGVkTWF0cml4KGNvbnN0IENGWF9NYXRyaXgmIHNyYywgaW50IGJpdHMpIHsKKyAgICBiYXNlID0gMSA8PCBiaXRzOworICAgIGEgPSBGWFNZU19yb3VuZChzcmMuYSAqIGJhc2UpOworICAgIGIgPSBGWFNZU19yb3VuZChzcmMuYiAqIGJhc2UpOworICAgIGMgPSBGWFNZU19yb3VuZChzcmMuYyAqIGJhc2UpOworICAgIGQgPSBGWFNZU19yb3VuZChzcmMuZCAqIGJhc2UpOworICAgIGUgPSBGWFNZU19yb3VuZChzcmMuZSAqIGJhc2UpOworICAgIGYgPSBGWFNZU19yb3VuZChzcmMuZiAqIGJhc2UpOworICB9CisgIGlubGluZSB2b2lkIFRyYW5zZm9ybShpbnQgeCwgaW50IHksIGludCYgeDEsIGludCYgeTEpIHsKKyAgICB4MSA9IChhICogeCArIGMgKiB5ICsgZSArIGJhc2UgLyAyKSAvIGJhc2U7CisgICAgeTEgPSAoYiAqIHggKyBkICogeSArIGYgKyBiYXNlIC8gMikgLyBiYXNlOworICB9CisgIGludCBhLCBiLCBjLCBkLCBlLCBmOworICBpbnQgYmFzZTsKIH07Ci0jZGVmaW5lIEZQREZfSFVHRV9JTUFHRV9TSVpFCTYwMDAwMDAwCisjZGVmaW5lIEZQREZfSFVHRV9JTUFHRV9TSVpFIDYwMDAwMDAwCiBzdHJ1Y3QgUGl4ZWxXZWlnaHQgewotICAgIGludAkJbV9TcmNTdGFydDsKLSAgICBpbnQJCW1fU3JjRW5kOwotICAgIGludAkJbV9XZWlnaHRzWzFdOworICBpbnQgbV9TcmNTdGFydDsKKyAgaW50IG1fU3JjRW5kOworICBpbnQgbV9XZWlnaHRzWzFdOwogfTsKLWNsYXNzIENXZWlnaHRUYWJsZSAKLXsKLXB1YmxpYzoKLSAgICBDV2VpZ2h0VGFibGUoKQotICAgIHsKLSAgICAgICAgbV9wV2VpZ2h0VGFibGVzID0gTlVMTDsKLSAgICB9Ci0gICAgfkNXZWlnaHRUYWJsZSgpCi0gICAgewotICAgICAgICBpZihtX3BXZWlnaHRUYWJsZXMpIHsKLSAgICAgICAgICAgIEZYX0ZyZWUobV9wV2VpZ2h0VGFibGVzKTsKLSAgICAgICAgfQotICAgICAgICBtX3BXZWlnaHRUYWJsZXMgPSBOVUxMOwotICAgIH0KLSAgICB2b2lkCQkJQ2FsYyhpbnQgZGVzdF9sZW4sIGludCBkZXN0X21pbiwgaW50IGRlc3RfbWF4LCBpbnQgc3JjX2xlbiwgaW50IHNyY19taW4sIGludCBzcmNfbWF4LCBpbnQgZmxhZ3MpOwotICAgIFBpeGVsV2VpZ2h0KglHZXRQaXhlbFdlaWdodChpbnQgcGl4ZWwpCi0gICAgewotICAgICAgICByZXR1cm4gKFBpeGVsV2VpZ2h0KikobV9wV2VpZ2h0VGFibGVzICsgKHBpeGVsIC0gbV9EZXN0TWluKSAqIG1fSXRlbVNpemUpOwotICAgIH0KLSAgICBpbnQJCQkJbV9EZXN0TWluLCBtX0l0ZW1TaXplOwotICAgIEZYX0xQQllURQkJbV9wV2VpZ2h0VGFibGVzOworY2xhc3MgQ1dlaWdodFRhYmxlIHsKKyBwdWJsaWM6CisgIENXZWlnaHRUYWJsZSgpIHsgbV9wV2VpZ2h0VGFibGVzID0gTlVMTDsgfQorICB+Q1dlaWdodFRhYmxlKCkgeworICAgIEZYX0ZyZWUobV9wV2VpZ2h0VGFibGVzKTsKKyAgICBtX3BXZWlnaHRUYWJsZXMgPSBOVUxMOworICB9CisgIHZvaWQgQ2FsYyhpbnQgZGVzdF9sZW4sCisgICAgICAgICAgICBpbnQgZGVzdF9taW4sCisgICAgICAgICAgICBpbnQgZGVzdF9tYXgsCisgICAgICAgICAgICBpbnQgc3JjX2xlbiwKKyAgICAgICAgICAgIGludCBzcmNfbWluLAorICAgICAgICAgICAgaW50IHNyY19tYXgsCisgICAgICAgICAgICBpbnQgZmxhZ3MpOworICBQaXhlbFdlaWdodCogR2V0UGl4ZWxXZWlnaHQoaW50IHBpeGVsKSB7CisgICAgcmV0dXJuIChQaXhlbFdlaWdodCopKG1fcFdlaWdodFRhYmxlcyArIChwaXhlbCAtIG1fRGVzdE1pbikgKiBtX0l0ZW1TaXplKTsKKyAgfQorICBpbnQgbV9EZXN0TWluLCBtX0l0ZW1TaXplOworICB1aW50OF90KiBtX3BXZWlnaHRUYWJsZXM7CiB9OwotY2xhc3MgQ1N0cmV0Y2hFbmdpbmUgCi17Ci1wdWJsaWM6Ci0gICAgQ1N0cmV0Y2hFbmdpbmUoSUZYX1NjYW5saW5lQ29tcG9zZXIqIHBEZXN0Qml0bWFwLCBGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCYgY2xpcF9yZWN0LAotICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBmbGFncyk7Ci0gICAgfkNTdHJldGNoRW5naW5lKCk7Ci0gICAgRlhfQk9PTAkJQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOwotcHVibGljOgotICAgIEZYRElCX0Zvcm1hdCBtX0Rlc3RGb3JtYXQ7Ci0gICAgaW50CQltX0Rlc3RCcHAsIG1fU3JjQnBwLCBtX2JIYXNBbHBoYTsKLSAgICBJRlhfU2NhbmxpbmVDb21wb3NlcioJbV9wRGVzdEJpdG1hcDsKLSAgICBpbnQJCW1fRGVzdFdpZHRoLCBtX0Rlc3RIZWlnaHQ7Ci0gICAgRlhfUkVDVAltX0Rlc3RDbGlwOwotICAgIEZYX0xQQllURQltX3BEZXN0U2NhbmxpbmU7Ci0gICAgRlhfTFBCWVRFICAgbV9wRGVzdE1hc2tTY2FubGluZTsKLSAgICBGWF9SRUNUCW1fU3JjQ2xpcDsKLSAgICBjb25zdCBDRlhfRElCU291cmNlKgltX3BTb3VyY2U7Ci0gICAgRlhfRFdPUkQqCW1fcFNyY1BhbGV0dGU7Ci0gICAgaW50CQltX1NyY1dpZHRoLCBtX1NyY0hlaWdodDsKLSAgICBpbnQJCW1fU3JjUGl0Y2gsIG1fSW50ZXJQaXRjaDsKLSAgICBpbnQgbV9FeHRyYU1hc2tQaXRjaDsKLSAgICB1bnNpZ25lZCBjaGFyKgltX3BJbnRlckJ1ZjsKLSAgICB1bnNpZ25lZCBjaGFyKgltX3BFeHRyYUFscGhhQnVmOwotICAgIGludAkJbV9UcmFuc01ldGhvZDsKLSAgICBpbnQgCW1fRmxhZ3M7Ci0gICAgQ1dlaWdodFRhYmxlCW1fV2VpZ2h0VGFibGU7Ci0gICAgaW50CQltX0N1clJvdzsKLSAgICBGWF9CT09MCVN0YXJ0U3RyZXRjaEhvcnooKTsKLSAgICBGWF9CT09MCUNvbnRpbnVlU3RyZXRjaEhvcnooSUZYX1BhdXNlKiBwUGF1c2UpOwotICAgIHZvaWQJU3RyZXRjaFZlcnQoKTsKLSAgICBpbnQJCW1fU3RhdGU7CitjbGFzcyBDU3RyZXRjaEVuZ2luZSB7CisgcHVibGljOgorICBDU3RyZXRjaEVuZ2luZShJRlhfU2NhbmxpbmVDb21wb3NlciogcERlc3RCaXRtYXAsCisgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCYgY2xpcF9yZWN0LAorICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpOworICB+Q1N0cmV0Y2hFbmdpbmUoKTsKKyAgRlhfQk9PTCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CisKKyBwdWJsaWM6CisgIEZYRElCX0Zvcm1hdCBtX0Rlc3RGb3JtYXQ7CisgIGludCBtX0Rlc3RCcHAsIG1fU3JjQnBwLCBtX2JIYXNBbHBoYTsKKyAgSUZYX1NjYW5saW5lQ29tcG9zZXIqIG1fcERlc3RCaXRtYXA7CisgIGludCBtX0Rlc3RXaWR0aCwgbV9EZXN0SGVpZ2h0OworICBGWF9SRUNUIG1fRGVzdENsaXA7CisgIHVpbnQ4X3QqIG1fcERlc3RTY2FubGluZTsKKyAgdWludDhfdCogbV9wRGVzdE1hc2tTY2FubGluZTsKKyAgRlhfUkVDVCBtX1NyY0NsaXA7CisgIGNvbnN0IENGWF9ESUJTb3VyY2UqIG1fcFNvdXJjZTsKKyAgRlhfRFdPUkQqIG1fcFNyY1BhbGV0dGU7CisgIGludCBtX1NyY1dpZHRoLCBtX1NyY0hlaWdodDsKKyAgaW50IG1fU3JjUGl0Y2gsIG1fSW50ZXJQaXRjaDsKKyAgaW50IG1fRXh0cmFNYXNrUGl0Y2g7CisgIHVuc2lnbmVkIGNoYXIqIG1fcEludGVyQnVmOworICB1bnNpZ25lZCBjaGFyKiBtX3BFeHRyYUFscGhhQnVmOworICBpbnQgbV9UcmFuc01ldGhvZDsKKyAgaW50IG1fRmxhZ3M7CisgIENXZWlnaHRUYWJsZSBtX1dlaWdodFRhYmxlOworICBpbnQgbV9DdXJSb3c7CisgIEZYX0JPT0wgU3RhcnRTdHJldGNoSG9yeigpOworICBGWF9CT09MIENvbnRpbnVlU3RyZXRjaEhvcnooSUZYX1BhdXNlKiBwUGF1c2UpOworICB2b2lkIFN0cmV0Y2hWZXJ0KCk7CisgIGludCBtX1N0YXRlOwogfTsKIAorRlhfUkVDVCBGWERJQl9Td2FwQ2xpcEJveChGWF9SRUNUJiBjbGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZsaXBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGbGlwWSk7CisKICNlbmRpZiAgLy8gQ09SRV9TUkNfRlhHRV9ESUJfRElCX0lOVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX2NvbXBvc2l0ZS5jcHAgYi9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfY29tcG9zaXRlLmNwcAppbmRleCBlMzg1YmM5Li5lMjg0ZjYyIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfY29tcG9zaXRlLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfY29tcG9zaXRlLmNwcApAQCAtMSw0NTU2ICsxLDUxOTMgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhnZS9meF9nZS5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2dlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCIKICNpbmNsdWRlICJkaWJfaW50LmgiCi1jb25zdCBGWF9CWVRFIGdfR2FtbWFSYW1wWzI1Nl0gPSB7Ci0gICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwKLSAgICAxLCAgIDEsICAgMiwgICAyLCAgIDIsICAgMiwgICAyLCAgIDIsICAgMiwgICAyLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLAotICAgIDQsICAgNCwgICA0LCAgIDQsICAgNCwgICA1LCAgIDUsICAgNSwgICA1LCAgIDYsICAgNiwgICA2LCAgIDYsICAgNywgICA3LCAgIDcsCi0gICAgOCwgICA4LCAgIDgsICAgOCwgICA5LCAgIDksICAgOSwgIDEwLCAgMTAsICAxMCwgIDExLCAgMTEsICAxMiwgIDEyLCAgMTIsICAxMywKLSAgICAxMywgIDEzLCAgMTQsICAxNCwgIDE1LCAgMTUsICAxNiwgIDE2LCAgMTcsICAxNywgIDE3LCAgMTgsICAxOCwgIDE5LCAgMTksICAyMCwKLSAgICAyMCwgIDIxLCAgMjIsICAyMiwgIDIzLCAgMjMsICAyNCwgIDI0LCAgMjUsICAyNSwgIDI2LCAgMjcsICAyNywgIDI4LCAgMjksICAyOSwKLSAgICAzMCwgIDMwLCAgMzEsICAzMiwgIDMyLCAgMzMsICAzNCwgIDM1LCAgMzUsICAzNiwgIDM3LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwKLSAgICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDUsICA0NiwgIDQ3LCAgNDgsICA0OSwgIDUwLCAgNTEsICA1MSwgIDUyLCAgNTMsICA1NCwKLSAgICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsICA2NCwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwKLSAgICA3MSwgIDcyLCAgNzMsICA3NCwgIDc2LCAgNzcsICA3OCwgIDc5LCAgODAsICA4MSwgIDgyLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwKLSAgICA5MCwgIDkxLCAgOTIsICA5MywgIDk1LCAgOTYsICA5NywgIDk5LCAxMDAsIDEwMSwgMTAzLCAxMDQsIDEwNSwgMTA3LCAxMDgsIDEwOSwKLSAgICAxMTEsIDExMiwgMTE0LCAxMTUsIDExNiwgMTE4LCAxMTksIDEyMSwgMTIyLCAxMjQsIDEyNSwgMTI3LCAxMjgsIDEzMCwgMTMxLCAxMzMsCi0gICAgMTM0LCAxMzYsIDEzOCwgMTM5LCAxNDEsIDE0MiwgMTQ0LCAxNDYsIDE0NywgMTQ5LCAxNTEsIDE1MiwgMTU0LCAxNTYsIDE1NywgMTU5LAotICAgIDE2MSwgMTYzLCAxNjQsIDE2NiwgMTY4LCAxNzAsIDE3MSwgMTczLCAxNzUsIDE3NywgMTc5LCAxODEsIDE4MywgMTg0LCAxODYsIDE4OCwKLSAgICAxOTAsIDE5MiwgMTk0LCAxOTYsIDE5OCwgMjAwLCAyMDIsIDIwNCwgMjA2LCAyMDgsIDIxMCwgMjEyLCAyMTQsIDIxNiwgMjE4LCAyMjAsCi0gICAgMjIyLCAyMjQsIDIyNiwgMjI5LCAyMzEsIDIzMywgMjM1LCAyMzcsIDIzOSwgMjQyLCAyNDQsIDI0NiwgMjQ4LCAyNTAsIDI1MywgMjU1LAotfTsKLWNvbnN0IEZYX0JZVEUgZ19HYW1tYUludmVyc2VbMjU2XSA9IHsKLSAgICAwLCAgMTMsICAyMiwgIDI4LCAgMzQsICAzOCwgIDQyLCAgNDYsICA1MCwgIDUzLCAgNTYsICA1OSwgIDYxLCAgNjQsICA2NiwgIDY5LAotICAgIDcxLCAgNzMsICA3NSwgIDc3LCAgNzksICA4MSwgIDgzLCAgODUsICA4NiwgIDg4LCAgOTAsICA5MiwgIDkzLCAgOTUsICA5NiwgIDk4LAotICAgIDk5LCAxMDEsIDEwMiwgMTA0LCAxMDUsIDEwNiwgMTA4LCAxMDksIDExMCwgMTEyLCAxMTMsIDExNCwgMTE1LCAxMTcsIDExOCwgMTE5LAotICAgIDEyMCwgMTIxLCAxMjIsIDEyNCwgMTI1LCAxMjYsIDEyNywgMTI4LCAxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNiwKLSAgICAxMzcsIDEzOCwgMTM5LCAxNDAsIDE0MSwgMTQyLCAxNDMsIDE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxNDgsIDE0OSwgMTUwLCAxNTEsCi0gICAgMTUyLCAxNTMsIDE1NCwgMTU1LCAxNTUsIDE1NiwgMTU3LCAxNTgsIDE1OSwgMTU5LCAxNjAsIDE2MSwgMTYyLCAxNjMsIDE2MywgMTY0LAotICAgIDE2NSwgMTY2LCAxNjcsIDE2NywgMTY4LCAxNjksIDE3MCwgMTcwLCAxNzEsIDE3MiwgMTczLCAxNzMsIDE3NCwgMTc1LCAxNzUsIDE3NiwKLSAgICAxNzcsIDE3OCwgMTc4LCAxNzksIDE4MCwgMTgwLCAxODEsIDE4MiwgMTgyLCAxODMsIDE4NCwgMTg1LCAxODUsIDE4NiwgMTg3LCAxODcsCi0gICAgMTg4LCAxODksIDE4OSwgMTkwLCAxOTAsIDE5MSwgMTkyLCAxOTIsIDE5MywgMTk0LCAxOTQsIDE5NSwgMTk2LCAxOTYsIDE5NywgMTk3LAotICAgIDE5OCwgMTk5LCAxOTksIDIwMCwgMjAwLCAyMDEsIDIwMiwgMjAyLCAyMDMsIDIwMywgMjA0LCAyMDUsIDIwNSwgMjA2LCAyMDYsIDIwNywKLSAgICAyMDgsIDIwOCwgMjA5LCAyMDksIDIxMCwgMjEwLCAyMTEsIDIxMiwgMjEyLCAyMTMsIDIxMywgMjE0LCAyMTQsIDIxNSwgMjE1LCAyMTYsCi0gICAgMjE2LCAyMTcsIDIxOCwgMjE4LCAyMTksIDIxOSwgMjIwLCAyMjAsIDIyMSwgMjIxLCAyMjIsIDIyMiwgMjIzLCAyMjMsIDIyNCwgMjI0LAotICAgIDIyNSwgMjI2LCAyMjYsIDIyNywgMjI3LCAyMjgsIDIyOCwgMjI5LCAyMjksIDIzMCwgMjMwLCAyMzEsIDIzMSwgMjMyLCAyMzIsIDIzMywKLSAgICAyMzMsIDIzNCwgMjM0LCAyMzUsIDIzNSwgMjM2LCAyMzYsIDIzNywgMjM3LCAyMzgsIDIzOCwgMjM4LCAyMzksIDIzOSwgMjQwLCAyNDAsCi0gICAgMjQxLCAyNDEsIDI0MiwgMjQyLCAyNDMsIDI0MywgMjQ0LCAyNDQsIDI0NSwgMjQ1LCAyNDYsIDI0NiwgMjQ2LCAyNDcsIDI0NywgMjQ4LAotICAgIDI0OCwgMjQ5LCAyNDksIDI1MCwgMjUwLCAyNTEsIDI1MSwgMjUxLCAyNTIsIDI1MiwgMjUzLCAyNTMsIDI1NCwgMjU0LCAyNTUsIDI1NSwKLX07Ci1jb25zdCBGWF9CWVRFIF9jb2xvcl9zcXJ0WzI1Nl0gPSB7Ci0gICAgMHgwMCwgMHgwMywgMHgwNywgMHgwQiwgMHgwRiwgMHgxMiwgMHgxNiwgMHgxOSwgMHgxRCwgMHgyMCwgMHgyMywgMHgyNiwgMHgyOSwgMHgyQywgMHgyRiwgMHgzMiwKLSAgICAweDM1LCAweDM3LCAweDNBLCAweDNDLCAweDNGLCAweDQxLCAweDQzLCAweDQ2LCAweDQ4LCAweDRBLCAweDRDLCAweDRFLCAweDUwLCAweDUyLCAweDU0LCAweDU2LAotICAgIDB4NTcsIDB4NTksIDB4NUIsIDB4NUMsIDB4NUUsIDB4NjAsIDB4NjEsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjcsIDB4NjgsIDB4NjksIDB4NkIsIDB4NkMsIDB4NkQsCi0gICAgMHg2RSwgMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwgMHg3QSwgMHg3QiwgMHg3QywgMHg3RCwgMHg3RSwKLSAgICAweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg3LCAweDg4LCAweDg5LCAweDhBLCAweDhCLCAweDhDLCAweDhELCAweDhFLAotICAgIDB4OEYsIDB4OTAsIDB4OTEsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTcsIDB4OTgsIDB4OTksIDB4OUEsIDB4OUIsIDB4OUMsCi0gICAgMHg5QywgMHg5RCwgMHg5RSwgMHg5RiwgMHhBMCwgMHhBMCwgMHhBMSwgMHhBMiwgMHhBMywgMHhBNCwgMHhBNCwgMHhBNSwgMHhBNiwgMHhBNywgMHhBNywgMHhBOCwKLSAgICAweEE5LCAweEFBLCAweEFBLCAweEFCLCAweEFDLCAweEFELCAweEFELCAweEFFLCAweEFGLCAweEIwLCAweEIwLCAweEIxLCAweEIyLCAweEIzLCAweEIzLCAweEI0LAotICAgIDB4QjUsIDB4QjUsIDB4QjYsIDB4QjcsIDB4QjcsIDB4QjgsIDB4QjksIDB4QkEsIDB4QkEsIDB4QkIsIDB4QkMsIDB4QkMsIDB4QkQsIDB4QkUsIDB4QkUsIDB4QkYsCi0gICAgMHhDMCwgMHhDMCwgMHhDMSwgMHhDMiwgMHhDMiwgMHhDMywgMHhDNCwgMHhDNCwgMHhDNSwgMHhDNiwgMHhDNiwgMHhDNywgMHhDNywgMHhDOCwgMHhDOSwgMHhDOSwKLSAgICAweENBLCAweENCLCAweENCLCAweENDLCAweENDLCAweENELCAweENFLCAweENFLCAweENGLCAweEQwLCAweEQwLCAweEQxLCAweEQxLCAweEQyLCAweEQzLCAweEQzLAotICAgIDB4RDQsIDB4RDQsIDB4RDUsIDB4RDYsIDB4RDYsIDB4RDcsIDB4RDcsIDB4RDgsIDB4RDksIDB4RDksIDB4REEsIDB4REEsIDB4REIsIDB4REMsIDB4REMsIDB4REQsCi0gICAgMHhERCwgMHhERSwgMHhERSwgMHhERiwgMHhFMCwgMHhFMCwgMHhFMSwgMHhFMSwgMHhFMiwgMHhFMiwgMHhFMywgMHhFNCwgMHhFNCwgMHhFNSwgMHhFNSwgMHhFNiwKLSAgICAweEU2LCAweEU3LCAweEU3LCAweEU4LCAweEU5LCAweEU5LCAweEVBLCAweEVBLCAweEVCLCAweEVCLCAweEVDLCAweEVDLCAweEVELCAweEVELCAweEVFLCAweEVFLAotICAgIDB4RUYsIDB4RjAsIDB4RjAsIDB4RjEsIDB4RjEsIDB4RjIsIDB4RjIsIDB4RjMsIDB4RjMsIDB4RjQsIDB4RjQsIDB4RjUsIDB4RjUsIDB4RjYsIDB4RjYsIDB4RjcsCi0gICAgMHhGNywgMHhGOCwgMHhGOCwgMHhGOSwgMHhGOSwgMHhGQSwgMHhGQSwgMHhGQiwgMHhGQiwgMHhGQywgMHhGQywgMHhGRCwgMHhGRCwgMHhGRSwgMHhGRSwgMHhGRgotfTsKLWludCBfQkxFTkQoaW50IGJsZW5kX21vZGUsIGludCBiYWNrX2NvbG9yLCBpbnQgc3JjX2NvbG9yKQotewotICAgIHN3aXRjaCAoYmxlbmRfbW9kZSkgewotICAgICAgICBjYXNlIEZYRElCX0JMRU5EX05PUk1BTDoKLSAgICAgICAgICAgIHJldHVybiBzcmNfY29sb3I7Ci0gICAgICAgIGNhc2UgRlhESUJfQkxFTkRfTVVMVElQTFk6Ci0gICAgICAgICAgICByZXR1cm4gc3JjX2NvbG9yICogYmFja19jb2xvciAvIDI1NTsKLSAgICAgICAgY2FzZSBGWERJQl9CTEVORF9TQ1JFRU46Ci0gICAgICAgICAgICByZXR1cm4gc3JjX2NvbG9yICsgYmFja19jb2xvciAtIHNyY19jb2xvciAqIGJhY2tfY29sb3IgLyAyNTU7Ci0gICAgICAgIGNhc2UgRlhESUJfQkxFTkRfT1ZFUkxBWToKLSAgICAgICAgICAgIHJldHVybiBfQkxFTkQoRlhESUJfQkxFTkRfSEFSRExJR0hULCBzcmNfY29sb3IsIGJhY2tfY29sb3IpOwotICAgICAgICBjYXNlIEZYRElCX0JMRU5EX0RBUktFTjoKLSAgICAgICAgICAgIHJldHVybiBzcmNfY29sb3IgPCBiYWNrX2NvbG9yID8gc3JjX2NvbG9yIDogYmFja19jb2xvcjsKLSAgICAgICAgY2FzZSBGWERJQl9CTEVORF9MSUdIVEVOOgotICAgICAgICAgICAgcmV0dXJuIHNyY19jb2xvciA+IGJhY2tfY29sb3IgPyBzcmNfY29sb3IgOiBiYWNrX2NvbG9yOwotICAgICAgICBjYXNlIEZYRElCX0JMRU5EX0NPTE9SRE9ER0U6IHsKLSAgICAgICAgICAgICAgICBpZiAoc3JjX2NvbG9yID09IDI1NSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3JjX2NvbG9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gYmFja19jb2xvciAqIDI1NSAvICgyNTUgLSBzcmNfY29sb3IpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPiAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI1NTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGWERJQl9CTEVORF9DT0xPUkJVUk46IHsKLSAgICAgICAgICAgICAgICBpZiAoc3JjX2NvbG9yID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNyY19jb2xvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9ICgyNTUgLSBiYWNrX2NvbG9yKSAqIDI1NSAvIHNyY19jb2xvcjsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID4gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDI1NTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDI1NSAtIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGWERJQl9CTEVORF9IQVJETElHSFQ6Ci0gICAgICAgICAgICBpZiAoc3JjX2NvbG9yIDwgMTI4KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChzcmNfY29sb3IgKiBiYWNrX2NvbG9yICogMikgLyAyNTU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gX0JMRU5EKEZYRElCX0JMRU5EX1NDUkVFTiwgYmFja19jb2xvciwgMiAqIHNyY19jb2xvciAtIDI1NSk7Ci0gICAgICAgIGNhc2UgRlhESUJfQkxFTkRfU09GVExJR0hUOiB7Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19jb2xvciA8IDEyOCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFja19jb2xvciAtICgyNTUgLSAyICogc3JjX2NvbG9yKSAqIGJhY2tfY29sb3IgKiAoMjU1IC0gYmFja19jb2xvcikgLyAyNTUgLyAyNTU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBiYWNrX2NvbG9yICsgKDIgKiBzcmNfY29sb3IgLSAyNTUpICogKF9jb2xvcl9zcXJ0W2JhY2tfY29sb3JdIC0gYmFja19jb2xvcikgLyAyNTU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgRlhESUJfQkxFTkRfRElGRkVSRU5DRToKLSAgICAgICAgICAgIHJldHVybiBiYWNrX2NvbG9yIDwgc3JjX2NvbG9yID8gc3JjX2NvbG9yIC0gYmFja19jb2xvciA6IGJhY2tfY29sb3IgLSBzcmNfY29sb3I7Ci0gICAgICAgIGNhc2UgRlhESUJfQkxFTkRfRVhDTFVTSU9OOgotICAgICAgICAgICAgcmV0dXJuIGJhY2tfY29sb3IgKyBzcmNfY29sb3IgLSAyICogYmFja19jb2xvciAqIHNyY19jb2xvciAvIDI1NTsKKworY29uc3QgdWludDhfdCBfY29sb3Jfc3FydFsyNTZdID0geworICAgIDB4MDAsIDB4MDMsIDB4MDcsIDB4MEIsIDB4MEYsIDB4MTIsIDB4MTYsIDB4MTksIDB4MUQsIDB4MjAsIDB4MjMsIDB4MjYsCisgICAgMHgyOSwgMHgyQywgMHgyRiwgMHgzMiwgMHgzNSwgMHgzNywgMHgzQSwgMHgzQywgMHgzRiwgMHg0MSwgMHg0MywgMHg0NiwKKyAgICAweDQ4LCAweDRBLCAweDRDLCAweDRFLCAweDUwLCAweDUyLCAweDU0LCAweDU2LCAweDU3LCAweDU5LCAweDVCLCAweDVDLAorICAgIDB4NUUsIDB4NjAsIDB4NjEsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjcsIDB4NjgsIDB4NjksIDB4NkIsIDB4NkMsIDB4NkQsCisgICAgMHg2RSwgMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwgMHg3QSwKKyAgICAweDdCLCAweDdDLCAweDdELCAweDdFLCAweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LAorICAgIDB4ODcsIDB4ODgsIDB4ODksIDB4OEEsIDB4OEIsIDB4OEMsIDB4OEQsIDB4OEUsIDB4OEYsIDB4OTAsIDB4OTEsIDB4OTEsCisgICAgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5NywgMHg5OCwgMHg5OSwgMHg5QSwgMHg5QiwgMHg5QywKKyAgICAweDlDLCAweDlELCAweDlFLCAweDlGLCAweEEwLCAweEEwLCAweEExLCAweEEyLCAweEEzLCAweEE0LCAweEE0LCAweEE1LAorICAgIDB4QTYsIDB4QTcsIDB4QTcsIDB4QTgsIDB4QTksIDB4QUEsIDB4QUEsIDB4QUIsIDB4QUMsIDB4QUQsIDB4QUQsIDB4QUUsCisgICAgMHhBRiwgMHhCMCwgMHhCMCwgMHhCMSwgMHhCMiwgMHhCMywgMHhCMywgMHhCNCwgMHhCNSwgMHhCNSwgMHhCNiwgMHhCNywKKyAgICAweEI3LCAweEI4LCAweEI5LCAweEJBLCAweEJBLCAweEJCLCAweEJDLCAweEJDLCAweEJELCAweEJFLCAweEJFLCAweEJGLAorICAgIDB4QzAsIDB4QzAsIDB4QzEsIDB4QzIsIDB4QzIsIDB4QzMsIDB4QzQsIDB4QzQsIDB4QzUsIDB4QzYsIDB4QzYsIDB4QzcsCisgICAgMHhDNywgMHhDOCwgMHhDOSwgMHhDOSwgMHhDQSwgMHhDQiwgMHhDQiwgMHhDQywgMHhDQywgMHhDRCwgMHhDRSwgMHhDRSwKKyAgICAweENGLCAweEQwLCAweEQwLCAweEQxLCAweEQxLCAweEQyLCAweEQzLCAweEQzLCAweEQ0LCAweEQ0LCAweEQ1LCAweEQ2LAorICAgIDB4RDYsIDB4RDcsIDB4RDcsIDB4RDgsIDB4RDksIDB4RDksIDB4REEsIDB4REEsIDB4REIsIDB4REMsIDB4REMsIDB4REQsCisgICAgMHhERCwgMHhERSwgMHhERSwgMHhERiwgMHhFMCwgMHhFMCwgMHhFMSwgMHhFMSwgMHhFMiwgMHhFMiwgMHhFMywgMHhFNCwKKyAgICAweEU0LCAweEU1LCAweEU1LCAweEU2LCAweEU2LCAweEU3LCAweEU3LCAweEU4LCAweEU5LCAweEU5LCAweEVBLCAweEVBLAorICAgIDB4RUIsIDB4RUIsIDB4RUMsIDB4RUMsIDB4RUQsIDB4RUQsIDB4RUUsIDB4RUUsIDB4RUYsIDB4RjAsIDB4RjAsIDB4RjEsCisgICAgMHhGMSwgMHhGMiwgMHhGMiwgMHhGMywgMHhGMywgMHhGNCwgMHhGNCwgMHhGNSwgMHhGNSwgMHhGNiwgMHhGNiwgMHhGNywKKyAgICAweEY3LCAweEY4LCAweEY4LCAweEY5LCAweEY5LCAweEZBLCAweEZBLCAweEZCLCAweEZCLCAweEZDLCAweEZDLCAweEZELAorICAgIDB4RkQsIDB4RkUsIDB4RkUsIDB4RkZ9OworaW50IF9CTEVORChpbnQgYmxlbmRfbW9kZSwgaW50IGJhY2tfY29sb3IsIGludCBzcmNfY29sb3IpIHsKKyAgc3dpdGNoIChibGVuZF9tb2RlKSB7CisgICAgY2FzZSBGWERJQl9CTEVORF9OT1JNQUw6CisgICAgICByZXR1cm4gc3JjX2NvbG9yOworICAgIGNhc2UgRlhESUJfQkxFTkRfTVVMVElQTFk6CisgICAgICByZXR1cm4gc3JjX2NvbG9yICogYmFja19jb2xvciAvIDI1NTsKKyAgICBjYXNlIEZYRElCX0JMRU5EX1NDUkVFTjoKKyAgICAgIHJldHVybiBzcmNfY29sb3IgKyBiYWNrX2NvbG9yIC0gc3JjX2NvbG9yICogYmFja19jb2xvciAvIDI1NTsKKyAgICBjYXNlIEZYRElCX0JMRU5EX09WRVJMQVk6CisgICAgICByZXR1cm4gX0JMRU5EKEZYRElCX0JMRU5EX0hBUkRMSUdIVCwgc3JjX2NvbG9yLCBiYWNrX2NvbG9yKTsKKyAgICBjYXNlIEZYRElCX0JMRU5EX0RBUktFTjoKKyAgICAgIHJldHVybiBzcmNfY29sb3IgPCBiYWNrX2NvbG9yID8gc3JjX2NvbG9yIDogYmFja19jb2xvcjsKKyAgICBjYXNlIEZYRElCX0JMRU5EX0xJR0hURU46CisgICAgICByZXR1cm4gc3JjX2NvbG9yID4gYmFja19jb2xvciA/IHNyY19jb2xvciA6IGJhY2tfY29sb3I7CisgICAgY2FzZSBGWERJQl9CTEVORF9DT0xPUkRPREdFOiB7CisgICAgICBpZiAoc3JjX2NvbG9yID09IDI1NSkgeworICAgICAgICByZXR1cm4gc3JjX2NvbG9yOworICAgICAgfQorICAgICAgaW50IHJlc3VsdCA9IGJhY2tfY29sb3IgKiAyNTUgLyAoMjU1IC0gc3JjX2NvbG9yKTsKKyAgICAgIGlmIChyZXN1bHQgPiAyNTUpIHsKKyAgICAgICAgcmV0dXJuIDI1NTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQotICAgIHJldHVybiBzcmNfY29sb3I7CisgICAgY2FzZSBGWERJQl9CTEVORF9DT0xPUkJVUk46IHsKKyAgICAgIGlmIChzcmNfY29sb3IgPT0gMCkgeworICAgICAgICByZXR1cm4gc3JjX2NvbG9yOworICAgICAgfQorICAgICAgaW50IHJlc3VsdCA9ICgyNTUgLSBiYWNrX2NvbG9yKSAqIDI1NSAvIHNyY19jb2xvcjsKKyAgICAgIGlmIChyZXN1bHQgPiAyNTUpIHsKKyAgICAgICAgcmVzdWx0ID0gMjU1OworICAgICAgfQorICAgICAgcmV0dXJuIDI1NSAtIHJlc3VsdDsKKyAgICB9CisgICAgY2FzZSBGWERJQl9CTEVORF9IQVJETElHSFQ6CisgICAgICBpZiAoc3JjX2NvbG9yIDwgMTI4KSB7CisgICAgICAgIHJldHVybiAoc3JjX2NvbG9yICogYmFja19jb2xvciAqIDIpIC8gMjU1OworICAgICAgfQorICAgICAgcmV0dXJuIF9CTEVORChGWERJQl9CTEVORF9TQ1JFRU4sIGJhY2tfY29sb3IsIDIgKiBzcmNfY29sb3IgLSAyNTUpOworICAgIGNhc2UgRlhESUJfQkxFTkRfU09GVExJR0hUOiB7CisgICAgICBpZiAoc3JjX2NvbG9yIDwgMTI4KSB7CisgICAgICAgIHJldHVybiBiYWNrX2NvbG9yIC0KKyAgICAgICAgICAgICAgICgyNTUgLSAyICogc3JjX2NvbG9yKSAqIGJhY2tfY29sb3IgKiAoMjU1IC0gYmFja19jb2xvcikgLyAyNTUgLworICAgICAgICAgICAgICAgICAgIDI1NTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBiYWNrX2NvbG9yICsKKyAgICAgICAgICAgICAoMiAqIHNyY19jb2xvciAtIDI1NSkgKiAoX2NvbG9yX3NxcnRbYmFja19jb2xvcl0gLSBiYWNrX2NvbG9yKSAvCisgICAgICAgICAgICAgICAgIDI1NTsKKyAgICB9CisgICAgY2FzZSBGWERJQl9CTEVORF9ESUZGRVJFTkNFOgorICAgICAgcmV0dXJuIGJhY2tfY29sb3IgPCBzcmNfY29sb3IgPyBzcmNfY29sb3IgLSBiYWNrX2NvbG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGJhY2tfY29sb3IgLSBzcmNfY29sb3I7CisgICAgY2FzZSBGWERJQl9CTEVORF9FWENMVVNJT046CisgICAgICByZXR1cm4gYmFja19jb2xvciArIHNyY19jb2xvciAtIDIgKiBiYWNrX2NvbG9yICogc3JjX2NvbG9yIC8gMjU1OworICB9CisgIHJldHVybiBzcmNfY29sb3I7CiB9CiBzdHJ1Y3QgX1JHQiB7Ci0gICAgaW50IHJlZDsKLSAgICBpbnQgZ3JlZW47Ci0gICAgaW50IGJsdWU7CisgIGludCByZWQ7CisgIGludCBncmVlbjsKKyAgaW50IGJsdWU7CiB9Owotc3RhdGljIGlubGluZSBpbnQgX0x1bShfUkdCIGNvbG9yKQotewotICAgIHJldHVybiAoY29sb3IucmVkICogMzAgKyBjb2xvci5ncmVlbiAqIDU5ICsgY29sb3IuYmx1ZSAqIDExKSAvIDEwMDsKK3N0YXRpYyBpbmxpbmUgaW50IF9MdW0oX1JHQiBjb2xvcikgeworICByZXR1cm4gKGNvbG9yLnJlZCAqIDMwICsgY29sb3IuZ3JlZW4gKiA1OSArIGNvbG9yLmJsdWUgKiAxMSkgLyAxMDA7CiB9Ci1zdGF0aWMgX1JHQiBfQ2xpcENvbG9yKF9SR0IgY29sb3IpCi17Ci0gICAgaW50IGwgPSBfTHVtKGNvbG9yKTsKLSAgICBpbnQgbiA9IGNvbG9yLnJlZDsKLSAgICBpZiAoY29sb3IuZ3JlZW4gPCBuKSB7Ci0gICAgICAgIG4gPSBjb2xvci5ncmVlbjsKLSAgICB9Ci0gICAgaWYgKGNvbG9yLmJsdWUgPCBuKSB7Ci0gICAgICAgIG4gPSBjb2xvci5ibHVlOwotICAgIH0KLSAgICBpbnQgeCA9IGNvbG9yLnJlZDsKLSAgICBpZiAoY29sb3IuZ3JlZW4gPiB4KSB7Ci0gICAgICAgIHggPSBjb2xvci5ncmVlbjsKLSAgICB9Ci0gICAgaWYgKGNvbG9yLmJsdWUgPiB4KSB7Ci0gICAgICAgIHggPSBjb2xvci5ibHVlOwotICAgIH0KLSAgICBpZiAobiA8IDApIHsKLSAgICAgICAgY29sb3IucmVkID0gbCArICgoY29sb3IucmVkIC0gbCkgKiBsIC8gKGwgLSBuKSk7Ci0gICAgICAgIGNvbG9yLmdyZWVuID0gbCArICgoY29sb3IuZ3JlZW4gLSBsKSAqIGwgLyAobCAtIG4pKTsKLSAgICAgICAgY29sb3IuYmx1ZSA9IGwgKyAoKGNvbG9yLmJsdWUgLSBsKSAqIGwgLyAobCAtIG4pKTsKLSAgICB9Ci0gICAgaWYgKHggPiAyNTUpIHsKLSAgICAgICAgY29sb3IucmVkID0gbCArICgoY29sb3IucmVkIC0gbCkgKiAoMjU1IC0gbCkgLyAoeCAtIGwpKTsKLSAgICAgICAgY29sb3IuZ3JlZW4gPSBsICsgKChjb2xvci5ncmVlbiAtIGwpICogKDI1NSAtIGwpIC8gKHggLSBsKSk7Ci0gICAgICAgIGNvbG9yLmJsdWUgPSBsICsgKChjb2xvci5ibHVlIC0gbCkgKiAoMjU1IC0gbCkgLyAoeCAtIGwpKTsKLSAgICB9CitzdGF0aWMgX1JHQiBfQ2xpcENvbG9yKF9SR0IgY29sb3IpIHsKKyAgaW50IGwgPSBfTHVtKGNvbG9yKTsKKyAgaW50IG4gPSBjb2xvci5yZWQ7CisgIGlmIChjb2xvci5ncmVlbiA8IG4pIHsKKyAgICBuID0gY29sb3IuZ3JlZW47CisgIH0KKyAgaWYgKGNvbG9yLmJsdWUgPCBuKSB7CisgICAgbiA9IGNvbG9yLmJsdWU7CisgIH0KKyAgaW50IHggPSBjb2xvci5yZWQ7CisgIGlmIChjb2xvci5ncmVlbiA+IHgpIHsKKyAgICB4ID0gY29sb3IuZ3JlZW47CisgIH0KKyAgaWYgKGNvbG9yLmJsdWUgPiB4KSB7CisgICAgeCA9IGNvbG9yLmJsdWU7CisgIH0KKyAgaWYgKG4gPCAwKSB7CisgICAgY29sb3IucmVkID0gbCArICgoY29sb3IucmVkIC0gbCkgKiBsIC8gKGwgLSBuKSk7CisgICAgY29sb3IuZ3JlZW4gPSBsICsgKChjb2xvci5ncmVlbiAtIGwpICogbCAvIChsIC0gbikpOworICAgIGNvbG9yLmJsdWUgPSBsICsgKChjb2xvci5ibHVlIC0gbCkgKiBsIC8gKGwgLSBuKSk7CisgIH0KKyAgaWYgKHggPiAyNTUpIHsKKyAgICBjb2xvci5yZWQgPSBsICsgKChjb2xvci5yZWQgLSBsKSAqICgyNTUgLSBsKSAvICh4IC0gbCkpOworICAgIGNvbG9yLmdyZWVuID0gbCArICgoY29sb3IuZ3JlZW4gLSBsKSAqICgyNTUgLSBsKSAvICh4IC0gbCkpOworICAgIGNvbG9yLmJsdWUgPSBsICsgKChjb2xvci5ibHVlIC0gbCkgKiAoMjU1IC0gbCkgLyAoeCAtIGwpKTsKKyAgfQorICByZXR1cm4gY29sb3I7Cit9CitzdGF0aWMgX1JHQiBfU2V0THVtKF9SR0IgY29sb3IsIGludCBsKSB7CisgIGludCBkID0gbCAtIF9MdW0oY29sb3IpOworICBjb2xvci5yZWQgKz0gZDsKKyAgY29sb3IuZ3JlZW4gKz0gZDsKKyAgY29sb3IuYmx1ZSArPSBkOworICByZXR1cm4gX0NsaXBDb2xvcihjb2xvcik7Cit9CitzdGF0aWMgaW50IF9TYXQoX1JHQiBjb2xvcikgeworICBpbnQgbiA9IGNvbG9yLnJlZDsKKyAgaWYgKGNvbG9yLmdyZWVuIDwgbikgeworICAgIG4gPSBjb2xvci5ncmVlbjsKKyAgfQorICBpZiAoY29sb3IuYmx1ZSA8IG4pIHsKKyAgICBuID0gY29sb3IuYmx1ZTsKKyAgfQorICBpbnQgeCA9IGNvbG9yLnJlZDsKKyAgaWYgKGNvbG9yLmdyZWVuID4geCkgeworICAgIHggPSBjb2xvci5ncmVlbjsKKyAgfQorICBpZiAoY29sb3IuYmx1ZSA+IHgpIHsKKyAgICB4ID0gY29sb3IuYmx1ZTsKKyAgfQorICByZXR1cm4geCAtIG47Cit9CitzdGF0aWMgX1JHQiBfU2V0U2F0KF9SR0IgY29sb3IsIGludCBzKSB7CisgIGludCogbWF4ID0gJmNvbG9yLnJlZDsKKyAgaW50KiBtaWQgPSAmY29sb3IucmVkOworICBpbnQqIG1pbiA9ICZjb2xvci5yZWQ7CisgIGlmIChjb2xvci5ncmVlbiA+ICptYXgpIHsKKyAgICBtYXggPSAmY29sb3IuZ3JlZW47CisgIH0KKyAgaWYgKGNvbG9yLmJsdWUgPiAqbWF4KSB7CisgICAgbWF4ID0gJmNvbG9yLmJsdWU7CisgIH0KKyAgaWYgKGNvbG9yLmdyZWVuIDwgKm1pbikgeworICAgIG1pbiA9ICZjb2xvci5ncmVlbjsKKyAgfQorICBpZiAoY29sb3IuYmx1ZSA8ICptaW4pIHsKKyAgICBtaW4gPSAmY29sb3IuYmx1ZTsKKyAgfQorICBpZiAoKm1heCA9PSAqbWluKSB7CisgICAgY29sb3IucmVkID0gMDsKKyAgICBjb2xvci5ncmVlbiA9IDA7CisgICAgY29sb3IuYmx1ZSA9IDA7CiAgICAgcmV0dXJuIGNvbG9yOwotfQotc3RhdGljIF9SR0IgX1NldEx1bShfUkdCIGNvbG9yLCBpbnQgbCkKLXsKLSAgICBpbnQgZCA9IGwgLSBfTHVtKGNvbG9yKTsKLSAgICBjb2xvci5yZWQgKz0gZDsKLSAgICBjb2xvci5ncmVlbiArPSBkOwotICAgIGNvbG9yLmJsdWUgKz0gZDsKLSAgICByZXR1cm4gX0NsaXBDb2xvcihjb2xvcik7Ci19Ci1zdGF0aWMgaW50IF9TYXQoX1JHQiBjb2xvcikKLXsKLSAgICBpbnQgbiA9IGNvbG9yLnJlZDsKLSAgICBpZiAoY29sb3IuZ3JlZW4gPCBuKSB7Ci0gICAgICAgIG4gPSBjb2xvci5ncmVlbjsKLSAgICB9Ci0gICAgaWYgKGNvbG9yLmJsdWUgPCBuKSB7Ci0gICAgICAgIG4gPSBjb2xvci5ibHVlOwotICAgIH0KLSAgICBpbnQgeCA9IGNvbG9yLnJlZDsKLSAgICBpZiAoY29sb3IuZ3JlZW4gPiB4KSB7Ci0gICAgICAgIHggPSBjb2xvci5ncmVlbjsKLSAgICB9Ci0gICAgaWYgKGNvbG9yLmJsdWUgPiB4KSB7Ci0gICAgICAgIHggPSBjb2xvci5ibHVlOwotICAgIH0KLSAgICByZXR1cm4geCAtIG47Ci19Ci1zdGF0aWMgX1JHQiBfU2V0U2F0KF9SR0IgY29sb3IsIGludCBzKQotewotICAgIGludCogbWF4ID0gJmNvbG9yLnJlZDsKLSAgICBpbnQqIG1pZCA9ICZjb2xvci5yZWQ7Ci0gICAgaW50KiBtaW4gPSAmY29sb3IucmVkOwotICAgIGlmIChjb2xvci5ncmVlbiA+ICptYXgpIHsKLSAgICAgICAgbWF4ID0gJmNvbG9yLmdyZWVuOwotICAgIH0KLSAgICBpZiAoY29sb3IuYmx1ZSA+ICptYXgpIHsKLSAgICAgICAgbWF4ID0gJmNvbG9yLmJsdWU7Ci0gICAgfQotICAgIGlmIChjb2xvci5ncmVlbiA8ICptaW4pIHsKLSAgICAgICAgbWluID0gJmNvbG9yLmdyZWVuOwotICAgIH0KLSAgICBpZiAoY29sb3IuYmx1ZSA8ICptaW4pIHsKLSAgICAgICAgbWluID0gJmNvbG9yLmJsdWU7Ci0gICAgfQotICAgIGlmICgqbWF4ID09ICptaW4pIHsKLSAgICAgICAgY29sb3IucmVkID0gMDsKLSAgICAgICAgY29sb3IuZ3JlZW4gPSAwOwotICAgICAgICBjb2xvci5ibHVlID0gMDsKLSAgICAgICAgcmV0dXJuIGNvbG9yOwotICAgIH0KLSAgICBpZiAobWF4ID09ICZjb2xvci5yZWQpIHsKLSAgICAgICAgaWYgKG1pbiA9PSAmY29sb3IuZ3JlZW4pIHsKLSAgICAgICAgICAgIG1pZCA9ICZjb2xvci5ibHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWlkID0gJmNvbG9yLmdyZWVuOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtYXggPT0gJmNvbG9yLmdyZWVuKSB7Ci0gICAgICAgIGlmIChtaW4gPT0gJmNvbG9yLnJlZCkgewotICAgICAgICAgICAgbWlkID0gJmNvbG9yLmJsdWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtaWQgPSAmY29sb3IucmVkOwotICAgICAgICB9CisgIH0KKyAgaWYgKG1heCA9PSAmY29sb3IucmVkKSB7CisgICAgaWYgKG1pbiA9PSAmY29sb3IuZ3JlZW4pIHsKKyAgICAgIG1pZCA9ICZjb2xvci5ibHVlOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtaW4gPT0gJmNvbG9yLmdyZWVuKSB7Ci0gICAgICAgICAgICBtaWQgPSAmY29sb3IucmVkOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWlkID0gJmNvbG9yLmdyZWVuOwotICAgICAgICB9CisgICAgICBtaWQgPSAmY29sb3IuZ3JlZW47CiAgICAgfQotICAgIGlmICgqbWF4ID4gKm1pbikgewotICAgICAgICAqbWlkID0gKCptaWQgLSAqbWluKSAqIHMgLyAoKm1heCAtICptaW4pOwotICAgICAgICAqbWF4ID0gczsKLSAgICAgICAgKm1pbiA9IDA7CisgIH0gZWxzZSBpZiAobWF4ID09ICZjb2xvci5ncmVlbikgeworICAgIGlmIChtaW4gPT0gJmNvbG9yLnJlZCkgeworICAgICAgbWlkID0gJmNvbG9yLmJsdWU7CisgICAgfSBlbHNlIHsKKyAgICAgIG1pZCA9ICZjb2xvci5yZWQ7CiAgICAgfQotICAgIHJldHVybiBjb2xvcjsKKyAgfSBlbHNlIHsKKyAgICBpZiAobWluID09ICZjb2xvci5ncmVlbikgeworICAgICAgbWlkID0gJmNvbG9yLnJlZDsKKyAgICB9IGVsc2UgeworICAgICAgbWlkID0gJmNvbG9yLmdyZWVuOworICAgIH0KKyAgfQorICBpZiAoKm1heCA+ICptaW4pIHsKKyAgICAqbWlkID0gKCptaWQgLSAqbWluKSAqIHMgLyAoKm1heCAtICptaW4pOworICAgICptYXggPSBzOworICAgICptaW4gPSAwOworICB9CisgIHJldHVybiBjb2xvcjsKIH0KLXZvaWQgX1JHQl9CbGVuZChpbnQgYmxlbmRfbW9kZSwgRlhfTFBDQllURSBzcmNfc2NhbiwgRlhfQllURSogZGVzdF9zY2FuLCBpbnQgcmVzdWx0c1szXSkKLXsKLSAgICBfUkdCIHNyYywgYmFjaywgcmVzdWx0OwotICAgIHNyYy5yZWQgPSBzcmNfc2NhblsyXTsKLSAgICBzcmMuZ3JlZW4gPSBzcmNfc2NhblsxXTsKLSAgICBzcmMuYmx1ZSA9IHNyY19zY2FuWzBdOwotICAgIGJhY2sucmVkID0gZGVzdF9zY2FuWzJdOwotICAgIGJhY2suZ3JlZW4gPSBkZXN0X3NjYW5bMV07Ci0gICAgYmFjay5ibHVlID0gZGVzdF9zY2FuWzBdOwotICAgIHN3aXRjaCAoYmxlbmRfbW9kZSkgewotICAgICAgICBjYXNlIEZYRElCX0JMRU5EX0hVRToKLSAgICAgICAgICAgIHJlc3VsdCA9IF9TZXRMdW0oX1NldFNhdChzcmMsIF9TYXQoYmFjaykpLCBfTHVtKGJhY2spKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCX0JMRU5EX1NBVFVSQVRJT046Ci0gICAgICAgICAgICByZXN1bHQgPSBfU2V0THVtKF9TZXRTYXQoYmFjaywgX1NhdChzcmMpKSwgX0x1bShiYWNrKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWERJQl9CTEVORF9DT0xPUjoKLSAgICAgICAgICAgIHJlc3VsdCA9IF9TZXRMdW0oc3JjLCBfTHVtKGJhY2spKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCX0JMRU5EX0xVTUlOT1NJVFk6Ci0gICAgICAgICAgICByZXN1bHQgPSBfU2V0THVtKGJhY2ssIF9MdW0oc3JjKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmVzdWx0c1swXSA9IHJlc3VsdC5ibHVlOwotICAgIHJlc3VsdHNbMV0gPSByZXN1bHQuZ3JlZW47Ci0gICAgcmVzdWx0c1syXSA9IHJlc3VsdC5yZWQ7Cit2b2lkIF9SR0JfQmxlbmQoaW50IGJsZW5kX21vZGUsCisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgIGludCByZXN1bHRzWzNdKSB7CisgIF9SR0Igc3JjLCBiYWNrLCByZXN1bHQ7CisgIHNyYy5yZWQgPSBzcmNfc2NhblsyXTsKKyAgc3JjLmdyZWVuID0gc3JjX3NjYW5bMV07CisgIHNyYy5ibHVlID0gc3JjX3NjYW5bMF07CisgIGJhY2sucmVkID0gZGVzdF9zY2FuWzJdOworICBiYWNrLmdyZWVuID0gZGVzdF9zY2FuWzFdOworICBiYWNrLmJsdWUgPSBkZXN0X3NjYW5bMF07CisgIHN3aXRjaCAoYmxlbmRfbW9kZSkgeworICAgIGNhc2UgRlhESUJfQkxFTkRfSFVFOgorICAgICAgcmVzdWx0ID0gX1NldEx1bShfU2V0U2F0KHNyYywgX1NhdChiYWNrKSksIF9MdW0oYmFjaykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWERJQl9CTEVORF9TQVRVUkFUSU9OOgorICAgICAgcmVzdWx0ID0gX1NldEx1bShfU2V0U2F0KGJhY2ssIF9TYXQoc3JjKSksIF9MdW0oYmFjaykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWERJQl9CTEVORF9DT0xPUjoKKyAgICAgIHJlc3VsdCA9IF9TZXRMdW0oc3JjLCBfTHVtKGJhY2spKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfQkxFTkRfTFVNSU5PU0lUWToKKyAgICAgIHJlc3VsdCA9IF9TZXRMdW0oYmFjaywgX0x1bShzcmMpKTsKKyAgICAgIGJyZWFrOworICB9CisgIHJlc3VsdHNbMF0gPSByZXN1bHQuYmx1ZTsKKyAgcmVzdWx0c1sxXSA9IHJlc3VsdC5ncmVlbjsKKyAgcmVzdWx0c1syXSA9IHJlc3VsdC5yZWQ7CiB9Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X0FyZ2IyTWFzayhGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUENCWVRFIHNyY19zY2FuLCBpbnQgcGl4ZWxfY291bnQsIEZYX0xQQ0JZVEUgY2xpcF9zY2FuKQotewotICAgIHNyY19zY2FuICs9IDM7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICBpbnQgc3JjX2FscGhhID0gKnNyY19zY2FuOwotICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X0FyZ2IyTWFzayh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBzcmNfc2NhbiArPSAzOworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBpbnQgc3JjX2FscGhhID0gKnNyY19zY2FuOworICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OworICAgIH0KKyAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9zY2FuOworICAgIGlmICghYmFja19hbHBoYSkgeworICAgICAgKmRlc3Rfc2NhbiA9IHNyY19hbHBoYTsKKyAgICB9IGVsc2UgaWYgKHNyY19hbHBoYSkgeworICAgICAgKmRlc3Rfc2NhbiA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgIH0KKyAgICBkZXN0X3NjYW4rKzsKKyAgICBzcmNfc2NhbiArPSA0OworICB9Cit9Cit2b2lkIF9Db21wb3NpdGVSb3dfUmdiYTJNYXNrKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgIGludCBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKKyAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICB9CisgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3Rfc2NhbjsKKyAgICBpZiAoIWJhY2tfYWxwaGEpIHsKKyAgICAgICpkZXN0X3NjYW4gPSBzcmNfYWxwaGE7CisgICAgfSBlbHNlIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgICpkZXN0X3NjYW4gPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICB9CisgICAgZGVzdF9zY2FuKys7CisgIH0KK30KK3ZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyTWFzayh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBpZiAoY2xpcF9zY2FuKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfVU5JT04oKmRlc3Rfc2NhbiwgKmNsaXBfc2Nhbik7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIGNsaXBfc2NhbisrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBGWFNZU19tZW1zZXQoZGVzdF9zY2FuLCAweGZmLCB3aWR0aCk7CisgIH0KK30KK3ZvaWQgX0NvbXBvc2l0ZVJvd19BcmdiMkdyYXlhKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYWxwaGFfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdF9hbHBoYV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gTlVMTDsKKyAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CisgIH0KKyAgaWYgKGJsZW5kX3R5cGUpIHsKKyAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgIGludCBibGVuZGVkX2NvbG9yOworICAgIGlmIChzcmNfYWxwaGFfc2NhbikgeworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkc3RfYWxwaGFfc2NhbjsKKyAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgICAgIGludCBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKKyAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CiAgICAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHNyY19hbHBoYSkgeworICAgICAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZGVzdF9zY2FuLCBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZHN0X2FscGhhX3NjYW4gPSBzcmNfYWxwaGE7CisgICAgICAgICAgfQorICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgIGRzdF9hbHBoYV9zY2FuKys7CisgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBGWF9CWVRFIGJhY2tfYWxwaGEgPSAqZGVzdF9zY2FuOwotICAgICAgICBpZiAoIWJhY2tfYWxwaGEpIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBzcmNfYWxwaGE7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7CisgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKICAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4gKys7CisgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgIGRzdF9hbHBoYV9zY2FuKys7CisgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAqZHN0X2FscGhhX3NjYW4gPSBGWERJQl9BTFBIQV9VTklPTihiYWNrX2FscGhhLCBzcmNfYWxwaGEpOworICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyAoKmRzdF9hbHBoYV9zY2FuKTsKKyAgICAgICAgdWludDhfdCBncmF5OworICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LCBzcmNfc2NhbiwgMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3JheSA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOworICAgICAgICB9CisgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKKyAgICAgICAgICBibGVuZGVkX2NvbG9yID0KKyAgICAgICAgICAgICAgYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9MVU1JTk9TSVRZID8gZ3JheSA6ICpkZXN0X3NjYW47CisgICAgICAgIH0KKyAgICAgICAgZ3JheSA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBncmF5KTsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGFscGhhX3JhdGlvKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIGRzdF9hbHBoYV9zY2FuKys7CisgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICB9CisgICAgfSBlbHNlCisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRzdF9hbHBoYV9zY2FuOworICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7CisgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOworICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7CisgICAgICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkc3RfYWxwaGFfc2NhbiA9IHNyY19hbHBoYTsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgZHN0X2FscGhhX3NjYW4rKzsKKyAgICAgICAgICBzcmNfc2NhbiArPSA0OworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhID0gc3JjX3NjYW5bM107CisgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICBkc3RfYWxwaGFfc2NhbisrOworICAgICAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgKmRzdF9hbHBoYV9zY2FuID0gRlhESUJfQUxQSEFfVU5JT04oYmFja19hbHBoYSwgc3JjX2FscGhhKTsKKyAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gKCpkc3RfYWxwaGFfc2Nhbik7CisgICAgICAgIHVpbnQ4X3QgZ3JheTsKKyAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAmZ3JheSwgc3JjX3NjYW4sIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdyYXkgPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKKyAgICAgICAgfQorICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgZHN0X2FscGhhX3NjYW4rKzsKICAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICB9Ci19Ci12b2lkIF9Db21wb3NpdGVSb3dfUmdiYTJNYXNrKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX2FscGhhX3NjYW4sIGludCBwaXhlbF9jb3VudCwgRlhfTFBDQllURSBjbGlwX3NjYW4pCi17Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgeworICAgICAgfQorICAgIHJldHVybjsKKyAgfQorICBpZiAoc3JjX2FscGhhX3NjYW4pIHsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkc3RfYWxwaGFfc2NhbjsKKyAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKICAgICAgICAgaW50IHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOwogICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKICAgICAgICAgfQotICAgICAgICBGWF9CWVRFIGJhY2tfYWxwaGEgPSAqZGVzdF9zY2FuOwotICAgICAgICBpZiAoIWJhY2tfYWxwaGEpIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBzcmNfYWxwaGE7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAgIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZGVzdF9zY2FuLCBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7CisgICAgICAgICAgfQorICAgICAgICAgICpkc3RfYWxwaGFfc2NhbiA9IHNyY19hbHBoYTsKICAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4gKys7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBkc3RfYWxwaGFfc2NhbisrOworICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7CisgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBkc3RfYWxwaGFfc2NhbisrOworICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgICpkc3RfYWxwaGFfc2NhbiA9IEZYRElCX0FMUEhBX1VOSU9OKGJhY2tfYWxwaGEsIHNyY19hbHBoYSk7CisgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyAoKmRzdF9hbHBoYV9zY2FuKTsKKyAgICAgIHVpbnQ4X3QgZ3JheTsKKyAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7CisgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LCBzcmNfc2NhbiwgMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBncmF5ID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7CisgICAgICB9CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBkc3RfYWxwaGFfc2NhbisrOworICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICB9CisgIH0gZWxzZQorICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRzdF9hbHBoYV9zY2FuOworICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bM107CisgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjX2FscGhhKSB7CisgICAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOworICAgICAgICAgIH0KKyAgICAgICAgICAqZHN0X2FscGhhX3NjYW4gPSBzcmNfYWxwaGE7CisgICAgICAgIH0KKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIGRzdF9hbHBoYV9zY2FuKys7CisgICAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgdWludDhfdCBzcmNfYWxwaGEgPSBzcmNfc2NhblszXTsKKyAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICB9CisgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIGRzdF9hbHBoYV9zY2FuKys7CisgICAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgKmRzdF9hbHBoYV9zY2FuID0gRlhESUJfQUxQSEFfVU5JT04oYmFja19hbHBoYSwgc3JjX2FscGhhKTsKKyAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvICgqZHN0X2FscGhhX3NjYW4pOworICAgICAgdWludDhfdCBncmF5OworICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgJmdyYXksIHNyY19zY2FuLCAxKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdyYXkgPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKKyAgICAgIH0KKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIGRzdF9hbHBoYV9zY2FuKys7CisgICAgICBzcmNfc2NhbiArPSA0OwogICAgIH0KIH0KLXZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyTWFzayhGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUENCWVRFIHNyY19zY2FuLCBpbnQgd2lkdGgsIEZYX0xQQ0JZVEUgY2xpcF9zY2FuKQoteworaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19BcmdiMkdyYXkodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gTlVMTDsKKyAgdWludDhfdCBncmF5OworICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKKyAgfQorICBpZiAoYmxlbmRfdHlwZSkgeworICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgaW50IGJsZW5kZWRfY29sb3I7CisgICAgaWYgKHNyY19hbHBoYV9zY2FuKSB7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgICAgaW50IHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOworICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNyY19hbHBoYSkgeworICAgICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7CisgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAmZ3JheSwgc3JjX3NjYW4sIDEpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBncmF5ID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKKyAgICAgICAgICAgIGJsZW5kZWRfY29sb3IgPQorICAgICAgICAgICAgICAgIGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSA/IGdyYXkgOiAqZGVzdF9zY2FuOworICAgICAgICAgIH0KKyAgICAgICAgICBncmF5ID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2NhbiwgZ3JheSk7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIHNyY19hbHBoYSk7CisgICAgICAgIH0KKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICB9CisgICAgfSBlbHNlCisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOworICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNyY19hbHBoYSkgeworICAgICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7CisgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAmZ3JheSwgc3JjX3NjYW4sIDEpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBncmF5ID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKKyAgICAgICAgICAgIGJsZW5kZWRfY29sb3IgPQorICAgICAgICAgICAgICAgIGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSA/IGdyYXkgOiAqZGVzdF9zY2FuOworICAgICAgICAgIH0KKyAgICAgICAgICBncmF5ID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2NhbiwgZ3JheSk7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIHNyY19hbHBoYSk7CisgICAgICAgIH0KKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICB9CisgICAgcmV0dXJuOworICB9CisgIGlmIChzcmNfYWxwaGFfc2NhbikgeworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgICAgaW50IHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOworICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAmZ3JheSwgc3JjX3NjYW4sIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdyYXkgPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKKyAgICAgICAgfQorICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgc3JjX2FscGhhKTsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICB9CisgIH0gZWxzZQorICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOworICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAmZ3JheSwgc3JjX3NjYW4sIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdyYXkgPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKKyAgICAgICAgfQorICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgc3JjX2FscGhhKTsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICB9Cit9CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJHcmF5KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IE5VTEw7CisgIHVpbnQ4X3QgZ3JheTsKKyAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CisgIH0KKyAgaWYgKGJsZW5kX3R5cGUpIHsKKyAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgIGludCBibGVuZGVkX2NvbG9yOworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgJmdyYXksIHNyY19zY2FuLCAxKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdyYXkgPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKKyAgICAgIH0KKyAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKKyAgICAgICAgYmxlbmRlZF9jb2xvciA9CisgICAgICAgICAgICBibGVuZF90eXBlID09IEZYRElCX0JMRU5EX0xVTUlOT1NJVFkgPyBncmF5IDogKmRlc3Rfc2NhbjsKKyAgICAgIH0KKyAgICAgIGdyYXkgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIGdyYXkpOworICAgICAgaWYgKGNsaXBfc2NhbiAmJiBjbGlwX3NjYW5bY29sXSA8IDI1NSkgeworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgY2xpcF9zY2FuW2NvbF0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IGdyYXk7CisgICAgICB9CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgJmdyYXksIHNyY19zY2FuLCAxKTsKKyAgICB9IGVsc2UgeworICAgICAgZ3JheSA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOworICAgIH0KKyAgICBpZiAoY2xpcF9zY2FuICYmIGNsaXBfc2Nhbltjb2xdIDwgMjU1KSB7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgY2xpcF9zY2FuW2NvbF0pOworICAgIH0gZWxzZSB7CisgICAgICAqZGVzdF9zY2FuID0gZ3JheTsKKyAgICB9CisgICAgZGVzdF9zY2FuKys7CisgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgfQorfQordm9pZCBfQ29tcG9zaXRlUm93X1JnYjJHcmF5YSh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IE5VTEw7CisgIGlmIChwSWNjVHJhbnNmb3JtKSB7CisgICAgcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOworICB9CisgIGlmIChibGVuZF90eXBlKSB7CisgICAgaW50IGJsZW5kZWRfY29sb3I7CisgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgIGludCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKKyAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIHNyY19zY2FuLCAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7CisgICAgICAgIH0KKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGludCBzcmNfYWxwaGEgPSAyNTU7CisgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKKyAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICB1aW50OF90IGdyYXk7CisgICAgICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAmZ3JheSwgc3JjX3NjYW4sIDEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ3JheSA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOworICAgICAgfQorICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgeworICAgICAgICBibGVuZGVkX2NvbG9yID0KKyAgICAgICAgICAgIGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSA/IGdyYXkgOiAqZGVzdF9zY2FuOworICAgICAgfQorICAgICAgZ3JheSA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2NhbiwgZ3JheSk7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgaW50IHNyY19hbHBoYSA9IDI1NTsKICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2lkdGg7IGkgKyspIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9VTklPTigqZGVzdF9zY2FuLCAqY2xpcF9zY2FuKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIGNsaXBfc2NhbiArKzsKLSAgICAgICAgfQorICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07CisgICAgfQorICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIHNyY19zY2FuLCAxKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gMjU1OworICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgZGVzdF9hbHBoYV9zY2FuKys7CisgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGludCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKKyAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgdWludDhfdCBncmF5OworICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7CisgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAmZ3JheSwgc3JjX3NjYW4sIDEpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYU1lTX21lbXNldDgoZGVzdF9zY2FuLCAweGZmLCB3aWR0aCk7CisgICAgICBncmF5ID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7CiAgICAgfQorICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBhbHBoYV9yYXRpbyk7CisgICAgZGVzdF9zY2FuKys7CisgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgfQogfQotdm9pZCBfQ29tcG9zaXRlUm93X0FyZ2IyR3JheWEoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgaW50IHBpeGVsX2NvdW50LCBpbnQgYmxlbmRfdHlwZSwgRlhfTFBDQllURSBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUENCWVRFIHNyY19hbHBoYV9zY2FuLCBGWF9MUEJZVEUgZHN0X2FscGhhX3NjYW4sIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IE5VTEw7Ci0gICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICAgIH0KLSAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKLSAgICAgICAgaWYgKHNyY19hbHBoYV9zY2FuKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgRlhfQllURSBiYWNrX2FscGhhID0gKmRzdF9hbHBoYV9zY2FuOwotICAgICAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gIEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKmRzdF9hbHBoYV9zY2FuID0gc3JjX2FscGhhOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgZHN0X2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGWF9CWVRFIHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOwotICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgIGRzdF9hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKmRzdF9hbHBoYV9zY2FuID0gRlhESUJfQUxQSEFfVU5JT04oYmFja19hbHBoYSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyAoKmRzdF9hbHBoYV9zY2FuKTsKLSAgICAgICAgICAgICAgICBGWF9CWVRFIGdyYXk7Ci0gICAgICAgICAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgJmdyYXksIHNyY19zY2FuLCAxKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBncmF5ID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgYmxlbmRlZF9jb2xvciA9IGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSA/IGdyYXkgOiAqZGVzdF9zY2FuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBncmF5ID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvciA6IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBncmF5KTsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBkc3RfYWxwaGFfc2NhbisrOwotICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIEZYX0JZVEUgYmFja19hbHBoYSA9ICpkc3RfYWxwaGFfc2NhbjsKLSAgICAgICAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblszXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIHNyY19zY2FuLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9ICBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICpkc3RfYWxwaGFfc2NhbiA9IHNyY19hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgIGRzdF9hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhfQllURSBzcmNfYWxwaGEgPSBzcmNfc2NhblszXTsKLSAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICBkc3RfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICpkc3RfYWxwaGFfc2NhbiA9IEZYRElCX0FMUEhBX1VOSU9OKGJhY2tfYWxwaGEsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gKCpkc3RfYWxwaGFfc2Nhbik7Ci0gICAgICAgICAgICAgICAgRlhfQllURSBncmF5OwotICAgICAgICAgICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZ3JheSA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBkc3RfYWxwaGFfc2NhbisrOwotICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHNyY19hbHBoYV9zY2FuKSB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgICAgIEZYX0JZVEUgYmFja19hbHBoYSA9ICpkc3RfYWxwaGFfc2NhbjsKLSAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZGVzdF9zY2FuLCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gIEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICpkc3RfYWxwaGFfc2NhbiA9IHNyY19hbHBoYTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgIGRzdF9hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9CWVRFIHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOwotICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgIGRzdF9hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqZHN0X2FscGhhX3NjYW4gPSBGWERJQl9BTFBIQV9VTklPTihiYWNrX2FscGhhLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gKCpkc3RfYWxwaGFfc2Nhbik7Ci0gICAgICAgICAgICBGWF9CWVRFIGdyYXk7Ci0gICAgICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGdyYXkgPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBkc3RfYWxwaGFfc2NhbisrOwotICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKK3ZvaWQgX0NvbXBvc2l0ZVJvd19BcmdiMkFyZ2IodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuKSB7CisgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgaWYgKCFkZXN0X2FscGhhX3NjYW4pIHsKKyAgICBpZiAoIXNyY19hbHBoYV9zY2FuKSB7CisgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAwOworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICAgIGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CisgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2NhblszXSAvIDI1NTsKKyAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCAoRlhBUkdCX0dFVERJQihzcmNfc2NhbikgJiAweGZmZmZmZikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3JjX2FscGhhIDw8IDI0KSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEZYQVJHQl9DT1BZKGRlc3Rfc2Nhbiwgc3JjX3NjYW4pOworICAgICAgICAgIH0KKyAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgICBzcmNfc2NhbiArPSA0OworICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgfSBlbHNlCi0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgICAgIEZYX0JZVEUgYmFja19hbHBoYSA9ICpkc3RfYWxwaGFfc2NhbjsKLSAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bM107Ci0gICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZGVzdF9zY2FuLCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gIEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICpkc3RfYWxwaGFfc2NhbiA9IHNyY19hbHBoYTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgIGRzdF9hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9CWVRFIHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOwotICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgIGRzdF9hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqZHN0X2FscGhhX3NjYW4gPSBGWERJQl9BTFBIQV9VTklPTihiYWNrX2FscGhhLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gKCpkc3RfYWxwaGFfc2Nhbik7Ci0gICAgICAgICAgICBGWF9CWVRFIGdyYXk7Ci0gICAgICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGdyYXkgPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBkc3RfYWxwaGFfc2NhbisrOwotICAgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgfQotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19BcmdiMkdyYXkoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgaW50IHBpeGVsX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsIEZYX0xQQ0JZVEUgY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBDQllURSBzcmNfYWxwaGFfc2Nhbiwgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gTlVMTDsKLSAgICBGWF9CWVRFIGdyYXk7Ci0gICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICAgIH0KLSAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKLSAgICAgICAgaWYgKHNyY19hbHBoYV9zY2FuKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOwotICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmF5ID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRlZF9jb2xvciA9IGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSA/IGdyYXkgOiAqZGVzdF9zY2FuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGdyYXkgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yIDogX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIGdyYXkpOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblszXTsKLSAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAmZ3JheSwgc3JjX3NjYW4sIDEpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZ3JheSA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kZWRfY29sb3IgPSBibGVuZF90eXBlID09IEZYRElCX0JMRU5EX0xVTUlOT1NJVFkgPyBncmF5IDogKmRlc3Rfc2NhbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBncmF5ID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvciA6IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBncmF5KTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChzcmNfYWxwaGFfc2NhbikgewotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7Ci0gICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgJmdyYXksIHNyY19zY2FuLCAxKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBncmF5ID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgfQotICAgIH0gZWxzZQotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bM107Ci0gICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgJmdyYXksIHNyY19zY2FuLCAxKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBncmF5ID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgfQotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyR3JheShGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUENCWVRFIHNyY19zY2FuLCBpbnQgc3JjX0JwcCwgaW50IHBpeGVsX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwgRlhfTFBDQllURSBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IE5VTEw7Ci0gICAgRlhfQllURSBncmF5OwotICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICB9Ci0gICAgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKLSAgICAgICAgaW50IGJsZW5kZWRfY29sb3I7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgJmdyYXksIHNyY19zY2FuLCAxKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZ3JheSA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgICAgICAgICAgIGJsZW5kZWRfY29sb3IgPSBibGVuZF90eXBlID09IEZYRElCX0JMRU5EX0xVTUlOT1NJVFkgPyBncmF5IDogKmRlc3Rfc2NhbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdyYXkgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yIDogX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIGdyYXkpOwotICAgICAgICAgICAgaWYgKGNsaXBfc2NhbiAmJiBjbGlwX3NjYW5bY29sXSA8IDI1NSkgewotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBjbGlwX3NjYW5bY29sXSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBncmF5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBncmF5ID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNsaXBfc2NhbiAmJiBjbGlwX3NjYW5bY29sXSA8IDI1NSkgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGNsaXBfc2Nhbltjb2xdKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBncmF5OwotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKLSAgICB9Ci19Ci12b2lkIF9Db21wb3NpdGVSb3dfUmdiMkdyYXlhKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCBzcmNfQnBwLCBpbnQgcGl4ZWxfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLCBGWF9MUENCWVRFIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBCWVRFIGRlc3RfYWxwaGFfc2Nhbiwgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gTlVMTDsKLSAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgfQotICAgIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgIGludCBibGVuZGVkX2NvbG9yOwotICAgICAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgICAgICBpbnQgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47Ci0gICAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZGVzdF9zY2FuLCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuKys7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSAyNTU7Ci0gICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9CWVRFIGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAgICAgRlhfQllURSBncmF5OwotICAgICAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAmZ3JheSwgc3JjX3NjYW4sIDEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBncmF5ID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7Ci0gICAgICAgICAgICAgICAgYmxlbmRlZF9jb2xvciA9IGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSA/IGdyYXkgOiAqZGVzdF9zY2FuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ3JheSA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3IgOiBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2NhbiwgZ3JheSk7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgaW50IHNyY19hbHBoYSA9IDI1NTsKKyAgICAgICAgdWludDhfdCBzcmNfYWxwaGE7CiAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7Ci0gICAgICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIDEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSAyNTU7Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOwotICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2NhblszXSAvIDI1NTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXTsKICAgICAgICAgfQogICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgICBzcmNfc2NhbiArPSA0OworICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIGludCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKLSAgICAgICAgRlhfQllURSBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9CisgICAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgeworICAgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7CisgICAgICAgICAgaWYgKGJsZW5kX3R5cGUpIHsKKyAgICAgICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2NhbiwgKnNyY19zY2FuKTsKKyAgICAgICAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRSgqc3JjX3NjYW4sIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfc2NhbiwgYWxwaGFfcmF0aW8pOworICAgICAgICAgIH0KKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICBzcmNfc2NhbisrOworICAgICAgICB9CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBzcmNfc2NhbisrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7CisgICAgICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogKCpzcmNfYWxwaGFfc2NhbikgLyAyNTU7CisgICAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0UoKHNyY19hbHBoYSA8PCAyNCksIHNyY19zY2FuWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9NQUtFKCgqc3JjX2FscGhhX3NjYW4gPDwgMjQpLCBzcmNfc2NhblsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW5bMV0sICpzcmNfc2NhbikpOworICAgICAgICAgIH0KKyAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgIHNyY19hbHBoYV9zY2FuKys7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgdWludDhfdCBzcmNfYWxwaGE7CisgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqICgqc3JjX2FscGhhX3NjYW4rKykgLyAyNTU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKKyAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgeworICAgICAgICAgIGlmIChibGVuZF90eXBlKSB7CisgICAgICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sICpzcmNfc2Nhbik7CisgICAgICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0UoKnNyY19zY2FuLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCAqc3JjX3NjYW4sIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgc3JjX3NjYW4rKzsKKyAgICAgICAgfQorICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKHNyY19hbHBoYV9zY2FuKSB7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKKyAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqICgqc3JjX2FscGhhX3NjYW4pIC8gMjU1OworICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiA9IHNyY19hbHBoYTsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiA9ICpzcmNfYWxwaGFfc2NhbjsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuKys7CisgICAgICAgICAgc3JjX2FscGhhX3NjYW4rKzsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB1aW50OF90IHNyY19hbHBoYTsKKyAgICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogKCpzcmNfYWxwaGFfc2NhbisrKSAvIDI1NTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgICAgICBkZXN0X3NjYW4gKz0gMzsKKyAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9CisgICAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgRlhfQllURSBncmF5OwotICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgJmdyYXksIHNyY19zY2FuLCAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdyYXkgPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKLSAgICAgICAgfQotICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOwotICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgfQotfQotdm9pZCBfQ29tcG9zaXRlUm93X0FyZ2IyQXJnYihGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUENCWVRFIHNyY19zY2FuLCBpbnQgcGl4ZWxfY291bnQsIGludCBibGVuZF90eXBlLCBGWF9MUENCWVRFIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBCWVRFIGRlc3RfYWxwaGFfc2NhbiwgRlhfTFBDQllURSBzcmNfYWxwaGFfc2NhbikKLXsKLSAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKLSAgICBpZiAoZGVzdF9hbHBoYV9zY2FuID09IE5VTEwpIHsKLSAgICAgICAgaWYgKHNyY19hbHBoYV9zY2FuID09IE5VTEwpIHsKLSAgICAgICAgICAgIEZYX0JZVEUgYmFja19hbHBoYSA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICAgICAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuWzNdIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIChGWEFSR0JfR0VURElCKHNyY19zY2FuKSAmIDB4ZmZmZmZmKSB8IChzcmNfYWxwaGEgPDwgMjQpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9DT1BZKGRlc3Rfc2Nhbiwgc3JjX3NjYW4pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhfQllURSBzcmNfYWxwaGE7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX3NjYW5bM10gLyAyNTU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZYX0JZVEUgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sICpzcmNfc2Nhbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0UoKnNyY19zY2FuLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgKnNyY19zY2FuLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIEZYX0JZVEUgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICAgICAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqICgqc3JjX2FscGhhX3NjYW4pIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKChzcmNfYWxwaGEgPDwgMjQpLCBzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2NhbikpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKCgqc3JjX2FscGhhX3NjYW4gPDwgMjQpLCBzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2NhbikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZYX0JZVEUgc3JjX2FscGhhOwotICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiAoKnNyY19hbHBoYV9zY2FuICsrKSAvIDI1NTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhfQllURSBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvciArKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0gOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2NhbiwgKnNyY19zY2FuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRSgqc3JjX3NjYW4sIGJsZW5kZWQsIGJhY2tfYWxwaGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCAqc3JjX3NjYW4sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoc3JjX2FscGhhX3NjYW4pIHsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBGWF9CWVRFIGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgICAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogKCpzcmNfYWxwaGFfc2NhbikgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuID0gc3JjX2FscGhhOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiA9ICpzcmNfYWxwaGFfc2NhbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZXN0X2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhfQllURSBzcmNfYWxwaGE7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqICgqc3JjX2FscGhhX3NjYW4gKyspIC8gMjU1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZYX0JZVEUgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gKysgPSBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgICAgICAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCAqc3JjX3NjYW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKCpzcmNfc2NhbiwgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfc2NhbiwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIEZYX0JZVEUgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47Ci0gICAgICAgICAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2NhblszXSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gPSBzcmNfYWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuID0gc3JjX3NjYW5bM107Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZYX0JZVEUgc3JjX2FscGhhOwotICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuWzNdIC8gMjU1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZYX0JZVEUgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sICpzcmNfc2Nhbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0UoKnNyY19zY2FuLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgKnNyY19zY2FuLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci12b2lkIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfTm9DbGlwKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGJsZW5kX3R5cGUsIGludCBzcmNfQnBwLAotICAgICAgICBGWF9MUEJZVEUgZGVzdF9hbHBoYV9zY2FuKQotewotICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICAgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7Ci0gICAgaWYgKGRlc3RfYWxwaGFfc2NhbiA9PSBOVUxMKSB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgIEZYX0JZVEUgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoc3JjX0JwcCA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCAweGZmMDAwMDAwIHwgRlhBUkdCX0dFVERJQihzcmNfc2NhbikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRSgweGZmLCBzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sIHNyY19zY2FuWzBdKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW5bM10gPSAweGZmOwotICAgICAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgICAgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19jb2xvciA9ICpzcmNfc2NhbjsKLSAgICAgICAgICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2NvbG9yKTsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2NvbG9yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgRlhfQllURSBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKLSAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSAweGZmOwotICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSAweGZmOwotICAgICAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgICAgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19jb2xvciA9ICpzcmNfc2NhbjsKLSAgICAgICAgICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2NvbG9yKTsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2NvbG9yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOwotICAgICAgICB9Ci0gICAgfQotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9DbGlwKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGJsZW5kX3R5cGUsIGludCBzcmNfQnBwLCBGWF9MUENCWVRFIGNsaXBfc2NhbiwKLSAgICAgICAgRlhfTFBCWVRFIGRlc3RfYWxwaGFfc2NhbikKLXsKLSAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKLSAgICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOwotICAgIGlmIChkZXN0X2FscGhhX3NjYW4gPT0gTlVMTCkgewotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gKmNsaXBfc2NhbiArKzsKLSAgICAgICAgICAgIEZYX0JZVEUgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9CWVRFIGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgICAgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19jb2xvciA9ICpzcmNfc2NhbjsKLSAgICAgICAgICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2NvbG9yKTsKLSAgICAgICAgICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2NvbG9yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gKmNsaXBfc2NhbiArKzsKLSAgICAgICAgICAgIEZYX0JZVEUgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47Ci0gICAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKLSAgICAgICAgICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOwotICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9CWVRFIGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgICAgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19jb2xvciA9ICpzcmNfc2NhbjsKLSAgICAgICAgICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2NvbG9yKTsKLSAgICAgICAgICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2NvbG9yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX05vQmxlbmRfQ2xpcChGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUENCWVRFIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBzcmNfQnBwLCBGWF9MUENCWVRFIGNsaXBfc2NhbiwKLSAgICAgICAgRlhfTFBCWVRFIGRlc3RfYWxwaGFfc2NhbikKLXsKLSAgICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOwotICAgIGlmIChkZXN0X2FscGhhX3NjYW4gPT0gTlVMTCkgewotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07Ci0gICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IDI1NTsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOwotICAgICAgICAgICAgRlhfQllURSBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOwotICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvciArKykgewotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCAqc3JjX3NjYW4sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOwotICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSAyNTU7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgICAgICAgICAgRlhfQllURSBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuICsrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IgKyspIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgKnNyY19zY2FuLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKLSAgICAgICAgfQotICAgIH0KLX0KLWlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9Ob0NsaXAoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgc3JjX0JwcCwKLSAgICAgICAgRlhfTFBCWVRFIGRlc3RfYWxwaGFfc2NhbikKLXsKLSAgICBpZiAoZGVzdF9hbHBoYV9zY2FuID09IE5VTEwpIHsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgaWYgKHNyY19CcHAgPT0gNCkgewotICAgICAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCAweGZmMDAwMDAwIHwgRlhBUkdCX0dFVERJQihzcmNfc2NhbikpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0UoMHhmZiwgc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCBzcmNfc2NhblswXSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gMHhmZjsKLSAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X0FyZ2IyUmdiX0JsZW5kKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGJsZW5kX3R5cGUsIGludCBkZXN0X0JwcCwgRlhfTFBDQllURSBjbGlwX3NjYW4sCi0gICAgICAgIEZYX0xQQ0JZVEUgc3JjX2FscGhhX3NjYW4pCi17Ci0gICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7Ci0gICAgaW50IGRlc3RfZ2FwID0gZGVzdF9CcHAgLSAzOwotICAgIGlmIChzcmNfYWxwaGFfc2NhbiA9PSBOVUxMKSB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgIEZYX0JZVEUgc3JjX2FscGhhOwotICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzNdICogKCpjbGlwX3NjYW4rKykgLyAyNTU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOwotICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7Ci0gICAgICAgICAgICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgYmFja19jb2xvciA9ICpkZXN0X3NjYW47Ci0gICAgICAgICAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0gOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JMRU5EKGJsZW5kX3R5cGUsIGJhY2tfY29sb3IsICpzcmNfc2Nhbik7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKGJhY2tfY29sb3IsIGJsZW5kZWQsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOwotICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICBGWF9CWVRFIHNyY19hbHBoYTsKLSAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSAoKnNyY19hbHBoYV9zY2FuKyspICogKCpjbGlwX3NjYW4rKykgLyAyNTU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOwotICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7Ci0gICAgICAgICAgICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgYmFja19jb2xvciA9ICpkZXN0X3NjYW47Ci0gICAgICAgICAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0gOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JMRU5EKGJsZW5kX3R5cGUsIGJhY2tfY29sb3IsICpzcmNfc2Nhbik7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKGJhY2tfY29sb3IsIGJsZW5kZWQsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOwotICAgICAgICB9Ci0gICAgfQotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19BcmdiMlJnYl9Ob0JsZW5kKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGRlc3RfQnBwLCBGWF9MUENCWVRFIGNsaXBfc2NhbiwKLSAgICAgICAgRlhfTFBDQllURSBzcmNfYWxwaGFfc2NhbikKLXsKLSAgICBpbnQgZGVzdF9nYXAgPSBkZXN0X0JwcCAtIDM7Ci0gICAgaWYgKHNyY19hbHBoYV9zY2FuID09IE5VTEwpIHsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgRlhfQllURSBzcmNfYWxwaGE7Ci0gICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM10gKiAoKmNsaXBfc2NhbisrKSAvIDI1NTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X2dhcDsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfc2Nhbiwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7Ci0gICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgIEZYX0JZVEUgc3JjX2FscGhhOwotICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9ICgqc3JjX2FscGhhX3NjYW4rKykgKiAoKmNsaXBfc2NhbisrKSAvIDI1NTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X2dhcDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfc2Nhbiwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfTm9DbGlwKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGJsZW5kX3R5cGUsIGludCBkZXN0X0JwcCwgaW50IHNyY19CcHApCi17Ci0gICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7Ci0gICAgaW50IGRlc3RfZ2FwID0gZGVzdF9CcHAgLSAzOwotICAgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewogICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7Ci0gICAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKKyAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKICAgICAgICAgfQotICAgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IgKyspIHsKLSAgICAgICAgICAgIGludCBiYWNrX2NvbG9yID0gKmRlc3Rfc2NhbjsKLSAgICAgICAgICAgIGludCBzcmNfY29sb3IgPSAqc3JjX3NjYW47Ci0gICAgICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIF9CTEVORChibGVuZF90eXBlLCBiYWNrX2NvbG9yLCBzcmNfY29sb3IpOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IGJsZW5kZWQ7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBzcmNfc2NhbiArKzsKKyAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgICAgICBpZiAoYmxlbmRfdHlwZSkgeworICAgICAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCAqc3JjX3NjYW4pOworICAgICAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKCpzcmNfc2NhbiwgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgKnNyY19zY2FuLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgfQorICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgIHNyY19zY2FuKys7CiAgICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOwotICAgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOwotICAgIH0KLX0KLWlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9DbGlwKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGJsZW5kX3R5cGUsIGludCBkZXN0X0JwcCwgaW50IHNyY19CcHAsIEZYX0xQQ0JZVEUgY2xpcF9zY2FuKQotewotICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICAgIGludCBkZXN0X2dhcCA9IGRlc3RfQnBwIC0gMzsKLSAgICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOwotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgRlhfQllURSBzcmNfYWxwaGEgPSAqY2xpcF9zY2FuICsrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKKyAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuWzNdIC8gMjU1OworICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiA9IHNyY19hbHBoYTsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiA9IHNyY19zY2FuWzNdOworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAgIH0KKyAgICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgICAgICBzcmNfc2NhbisrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhOworICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2NhblszXSAvIDI1NTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXTsKKyAgICAgICAgfQogICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKLSAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBkZXN0X3NjYW4gKz0gMzsKKyAgICAgICAgICBzcmNfc2NhbiArPSA0OworICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9CisgICAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKKyAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgeworICAgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7CisgICAgICAgICAgaWYgKGJsZW5kX3R5cGUpIHsKKyAgICAgICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2NhbiwgKnNyY19zY2FuKTsKKyAgICAgICAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRSgqc3JjX3NjYW4sIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfc2NhbiwgYWxwaGFfcmF0aW8pOworICAgICAgICAgIH0KKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICBzcmNfc2NhbisrOworICAgICAgICB9CisgICAgICAgIHNyY19zY2FuKys7CisgICAgICB9CisgICAgfQorICB9Cit9Cit2b2lkIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfTm9DbGlwKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4pIHsKKyAgaW50IGJsZW5kZWRfY29sb3JzWzNdOworICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOworICBpZiAoZGVzdF9hbHBoYV9zY2FuKSB7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOworICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSAweGZmOworICAgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IDB4ZmY7CisgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CisgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOworICAgICAgfQorICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgICAgaW50IHNyY19jb2xvciA9ICpzcmNfc2NhbjsKKyAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2NvbG9yKTsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19jb2xvciwgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBzcmNfc2NhbisrOworICAgICAgfQorICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CisgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7CisgICAgICAgIGlmIChzcmNfQnBwID09IDQpIHsKKyAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgMHhmZjAwMDAwMCB8IEZYQVJHQl9HRVRESUIoc3JjX3NjYW4pKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0UoMHhmZiwgc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhblswXSkpOworICAgICAgICB9CisgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhblszXSA9IDB4ZmY7CisgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CisgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOworICAgICAgfQorICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgICAgaW50IHNyY19jb2xvciA9ICpzcmNfc2NhbjsKKyAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2NvbG9yKTsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19jb2xvciwgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBzcmNfc2NhbisrOworICAgICAgfQorICAgICAgZGVzdF9zY2FuKys7CisgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOworICAgIH0KKyAgfQorfQoraW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9DbGlwKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbikgeworICBpbnQgYmxlbmRlZF9jb2xvcnNbM107CisgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7CisgIGlmIChkZXN0X2FscGhhX3NjYW4pIHsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGEgPSAqY2xpcF9zY2FuKys7CisgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOworICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOworICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgICAgZGVzdF9zY2FuICs9IDM7CisgICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9CisgICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKKyAgICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7CisgICAgICB9CisgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgeworICAgICAgICBpbnQgc3JjX2NvbG9yID0gKnNyY19zY2FuOworICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQorICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfY29sb3IpOworICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2NvbG9yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIHNyY19zY2FuKys7CisgICAgICB9CisgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGEgPSAqY2xpcF9zY2FuKys7CisgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CisgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CisgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOworICAgICAgfQorICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgICAgaW50IHNyY19jb2xvciA9ICpzcmNfc2NhbjsKKyAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2NvbG9yKTsKKyAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19jb2xvciwgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBzcmNfc2NhbisrOworICAgICAgfQorICAgICAgZGVzdF9zY2FuKys7CisgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOworICAgIH0KKyAgfQorfQoraW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9Ob0JsZW5kX0NsaXAodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbikgeworICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOworICBpZiAoZGVzdF9hbHBoYV9zY2FuKSB7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07CisgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSAyNTU7CisgICAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgIGRlc3Rfc2NhbiArPSAzOworICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpbnQgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47CisgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKKyAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgeworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgKnNyY19zY2FuLCBhbHBoYV9yYXRpbyk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBzcmNfc2NhbisrOworICAgICAgfQorICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07CisgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuKysgPSAyNTU7CisgICAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGludCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KKyAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfc2NhbiwgYWxwaGFfcmF0aW8pOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgc3JjX3NjYW4rKzsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKKyAgICB9CisgIH0KK30KK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9Ob0NsaXAodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuKSB7CisgIGlmIChkZXN0X2FscGhhX3NjYW4pIHsKKyAgICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gMHhmZjsKKyAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgaWYgKHNyY19CcHAgPT0gNCkgeworICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgMHhmZjAwMDAwMCB8IEZYQVJHQl9HRVRESUIoc3JjX3NjYW4pKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9NQUtFKDB4ZmYsIHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgc3JjX3NjYW5bMF0pKTsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgICB9CisgIH0KK30KK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfQXJnYjJSZ2JfQmxlbmQodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuKSB7CisgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgaW50IGRlc3RfZ2FwID0gZGVzdF9CcHAgLSAzOworICBpZiAoc3JjX2FscGhhX3NjYW4pIHsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhOworICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICBzcmNfYWxwaGEgPSAoKnNyY19hbHBoYV9zY2FuKyspICogKCpjbGlwX3NjYW4rKykgLyAyNTU7CisgICAgICB9IGVsc2UgeworICAgICAgICBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7CisgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgeworICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7CisgICAgICAgIGludCBiYWNrX2NvbG9yID0gKmRlc3Rfc2NhbjsKKyAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfQkxFTkQoYmxlbmRfdHlwZSwgYmFja19jb2xvciwgKnNyY19zY2FuKTsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKGJhY2tfY29sb3IsIGJsZW5kZWQsIHNyY19hbHBoYSk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBzcmNfc2NhbisrOworICAgICAgfQorICAgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhOworICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXSAqICgqY2xpcF9zY2FuKyspIC8gMjU1OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107CisgICAgICB9CisgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOworICAgICAgICBzcmNfc2NhbiArPSA0OworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKKyAgICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7CisgICAgICB9CisgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgeworICAgICAgICBpbnQgYmFja19jb2xvciA9ICpkZXN0X3NjYW47CisgICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogX0JMRU5EKGJsZW5kX3R5cGUsIGJhY2tfY29sb3IsICpzcmNfc2Nhbik7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRShiYWNrX2NvbG9yLCBibGVuZGVkLCBzcmNfYWxwaGEpOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgc3JjX3NjYW4rKzsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X2dhcDsKKyAgICAgIHNyY19zY2FuKys7CisgICAgfQorICB9Cit9CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X0FyZ2IyUmdiX05vQmxlbmQodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuKSB7CisgIGludCBkZXN0X2dhcCA9IGRlc3RfQnBwIC0gMzsKKyAgaWYgKHNyY19hbHBoYV9zY2FuKSB7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICB1aW50OF90IHNyY19hbHBoYTsKKyAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgc3JjX2FscGhhID0gKCpzcmNfYWxwaGFfc2NhbisrKSAqICgqY2xpcF9zY2FuKyspIC8gMjU1OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7CisgICAgICB9CisgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKKyAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgeworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgKnNyY19zY2FuLCBzcmNfYWxwaGEpOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgc3JjX3NjYW4rKzsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X2dhcDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICB1aW50OF90IHNyY19hbHBoYTsKKyAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM10gKiAoKmNsaXBfc2NhbisrKSAvIDI1NTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOworICAgICAgICBzcmNfc2NhbisrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7CisgICAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfc2Nhbiwgc3JjX2FscGhhKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIHNyY19zY2FuKys7CisgICAgICB9CisgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7CisgICAgICBzcmNfc2NhbisrOworICAgIH0KKyAgfQorfQoraW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX05vQ2xpcCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwKSB7CisgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgaW50IGRlc3RfZ2FwID0gZGVzdF9CcHAgLSAzOworICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CisgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKKyAgICB9CisgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgIGludCBiYWNrX2NvbG9yID0gKmRlc3Rfc2NhbjsKKyAgICAgIGludCBzcmNfY29sb3IgPSAqc3JjX3NjYW47CisgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0KKyAgICAgICAgICAgICAgICAgICAgICAgIDogX0JMRU5EKGJsZW5kX3R5cGUsIGJhY2tfY29sb3IsIHNyY19jb2xvcik7CisgICAgICAqZGVzdF9zY2FuID0gYmxlbmRlZDsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgc3JjX3NjYW4rKzsKKyAgICB9CisgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOworICAgIHNyY19zY2FuICs9IHNyY19nYXA7CisgIH0KK30KK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9DbGlwKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBpbnQgYmxlbmRlZF9jb2xvcnNbM107CisgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgIGludCBkZXN0X2dhcCA9IGRlc3RfQnBwIC0gMzsKKyAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgdWludDhfdCBzcmNfYWxwaGEgPSAqY2xpcF9zY2FuKys7CisgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7CisgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKKyAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOworICAgIH0KKyAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgeworICAgICAgaW50IHNyY19jb2xvciA9ICpzcmNfc2NhbjsKKyAgICAgIGludCBiYWNrX2NvbG9yID0gKmRlc3Rfc2NhbjsKKyAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCisgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQorICAgICAgICAgICAgICAgICAgICAgICAgOiBfQkxFTkQoYmxlbmRfdHlwZSwgYmFja19jb2xvciwgc3JjX2NvbG9yKTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRShiYWNrX2NvbG9yLCBibGVuZGVkLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBzcmNfc2NhbisrOworICAgIH0KKyAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7CisgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKKyAgfQorfQoraW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfTm9DbGlwKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwKSB7CisgIGlmIChkZXN0X0JwcCA9PSBzcmNfQnBwKSB7CisgICAgRlhTWVNfbWVtY3B5KGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoICogZGVzdF9CcHApOworICAgIHJldHVybjsKKyAgfQorICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICBkZXN0X3NjYW5bMF0gPSBzcmNfc2NhblswXTsKKyAgICBkZXN0X3NjYW5bMV0gPSBzcmNfc2NhblsxXTsKKyAgICBkZXN0X3NjYW5bMl0gPSBzcmNfc2NhblsyXTsKKyAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7CisgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgfQorfQoraW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfQ2xpcCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07CisgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgIGRlc3Rfc2NhblswXSA9IHNyY19zY2FuWzBdOworICAgICAgZGVzdF9zY2FuWzFdID0gc3JjX3NjYW5bMV07CisgICAgICBkZXN0X3NjYW5bMl0gPSBzcmNfc2NhblsyXTsKKyAgICB9IGVsc2UgaWYgKHNyY19hbHBoYSkgeworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfc2Nhbiwgc3JjX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgc3JjX3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCAqc3JjX3NjYW4sIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIHNyY19zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgKnNyY19zY2FuLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwIC0gMjsKKyAgICAgIHNyY19zY2FuICs9IHNyY19CcHAgLSAyOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKKyAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICB9Cit9Cit2b2lkIF9Db21wb3NpdGVSb3dfQXJnYjJBcmdiX1RyYW5zZm9ybSh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfY2FjaGVfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgdWludDhfdCogZHAgPSBzcmNfY2FjaGVfc2NhbjsKKyAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9CisgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKKyAgaWYgKHNyY19hbHBoYV9zY2FuKSB7CisgICAgaWYgKGRlc3RfYWxwaGFfc2NhbikgeworICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZHAsIHNyY19zY2FuLCBwaXhlbF9jb3VudCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkcCwgc3JjX3NjYW4sIDEpOworICAgICAgICBkcFszXSA9ICpzcmNfYWxwaGFfc2NhbisrOworICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICBkcCArPSA0OworICAgICAgfQorICAgICAgc3JjX2FscGhhX3NjYW4gPSBOVUxMOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoZGVzdF9hbHBoYV9zY2FuKSB7CisgICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107CisgICAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47CisgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2NhblszXSAvIDI1NTsKKyAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gPSBzcmNfYWxwaGE7CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX2NhY2hlX3NjYW4rKzsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfY2FjaGVfc2NhbisrOworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19jYWNoZV9zY2FuKys7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gPSBzcmNfc2NhblszXTsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfY2FjaGVfc2NhbisrOworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19jYWNoZV9zY2FuKys7CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX2NhY2hlX3NjYW4rKzsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuKys7CisgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB1aW50OF90IHNyY19hbHBoYTsKKyAgICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX3NjYW5bM10gLyAyNTU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107CisgICAgICAgIH0KKyAgICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgICAgZGVzdF9zY2FuICs9IDM7CisgICAgICAgICAgc3JjX2NhY2hlX3NjYW4gKz0gMzsKKyAgICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7CisgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKKyAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19jYWNoZV9zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgeworICAgICAgICAgIGlmIChibGVuZF90eXBlKSB7CisgICAgICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sICpzcmNfY2FjaGVfc2Nhbik7CisgICAgICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0UoKnNyY19jYWNoZV9zY2FuLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPQorICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfY2FjaGVfc2NhbiwgYWxwaGFfcmF0aW8pOworICAgICAgICAgIH0KKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICBzcmNfY2FjaGVfc2NhbisrOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZHAsIHNyY19zY2FuLCAxKTsKKyAgICAgIGRwWzNdID0gc3JjX3NjYW5bM107CisgICAgICBzcmNfc2NhbiArPSA0OworICAgICAgZHAgKz0gNDsKKyAgICB9CisgIH0KKyAgX0NvbXBvc2l0ZVJvd19BcmdiMkFyZ2IoZGVzdF9zY2FuLCBzcmNfY2FjaGVfc2NhbiwgcGl4ZWxfY291bnQsIGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2NhbiwgZGVzdF9hbHBoYV9zY2FuLCBzcmNfYWxwaGFfc2Nhbik7Cit9Cit2b2lkIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfTm9DbGlwX1RyYW5zZm9ybSh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfY2FjaGVfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9CisgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKKyAgaWYgKHNyY19CcHAgPT0gMykgeworICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7CisgIH0gZWxzZSB7CisgICAgdWludDhfdCogZHAgPSBzcmNfY2FjaGVfc2NhbjsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRwLCBzcmNfc2NhbiwgMSk7CisgICAgICBzcmNfc2NhbiArPSA0OworICAgICAgZHAgKz0gMzsKKyAgICB9CisgIH0KKyAgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9Ob0NsaXAoZGVzdF9zY2FuLCBzcmNfY2FjaGVfc2Nhbiwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kX3R5cGUsIDMsIGRlc3RfYWxwaGFfc2Nhbik7Cit9CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX0NsaXBfVHJhbnNmb3JtKAorICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IGJsZW5kX3R5cGUsCisgICAgaW50IHNyY19CcHAsCisgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbiwKKyAgICB1aW50OF90KiBzcmNfY2FjaGVfc2NhbiwKKyAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPQorICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CisgIGlmIChzcmNfQnBwID09IDMpIHsKKyAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBzcmNfY2FjaGVfc2Nhbiwgc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOworICB9IGVsc2UgeworICAgIHVpbnQ4X3QqIGRwID0gc3JjX2NhY2hlX3NjYW47CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkcCwgc3JjX3NjYW4sIDEpOworICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICAgIGRwICs9IDM7CisgICAgfQorICB9CisgIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfQ2xpcChkZXN0X3NjYW4sIHNyY19jYWNoZV9zY2FuLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kX3R5cGUsIDMsIGNsaXBfc2NhbiwgZGVzdF9hbHBoYV9zY2FuKTsKK30KK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9DbGlwX1RyYW5zZm9ybSgKKyAgICB1aW50OF90KiBkZXN0X3NjYW4sCisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgaW50IHdpZHRoLAorICAgIGludCBzcmNfQnBwLAorICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4sCisgICAgdWludDhfdCogc3JjX2NhY2hlX3NjYW4sCisgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0KKyAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOworICBpZiAoc3JjX0JwcCA9PSAzKSB7CisgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKKyAgfSBlbHNlIHsKKyAgICB1aW50OF90KiBkcCA9IHNyY19jYWNoZV9zY2FuOworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZHAsIHNyY19zY2FuLCAxKTsKKyAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICBkcCArPSAzOworICAgIH0KKyAgfQorICBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX05vQmxlbmRfQ2xpcChkZXN0X3NjYW4sIHNyY19jYWNoZV9zY2FuLCB3aWR0aCwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9zY2FuLCBkZXN0X2FscGhhX3NjYW4pOworfQoraW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9Ob0JsZW5kX05vQ2xpcF9UcmFuc2Zvcm0oCisgICAgdWludDhfdCogZGVzdF9zY2FuLAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgIGludCB3aWR0aCwKKyAgICBpbnQgc3JjX0JwcCwKKyAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4sCisgICAgdWludDhfdCogc3JjX2NhY2hlX3NjYW4sCisgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0KKyAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOworICBpZiAoc3JjX0JwcCA9PSAzKSB7CisgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKKyAgfSBlbHNlIHsKKyAgICB1aW50OF90KiBkcCA9IHNyY19jYWNoZV9zY2FuOworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZHAsIHNyY19zY2FuLCAxKTsKKyAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICBkcCArPSAzOworICAgIH0KKyAgfQorICBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX05vQmxlbmRfTm9DbGlwKGRlc3Rfc2Nhbiwgc3JjX2NhY2hlX3NjYW4sIHdpZHRoLCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYWxwaGFfc2Nhbik7Cit9CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X0FyZ2IyUmdiX0JsZW5kX1RyYW5zZm9ybSgKKyAgICB1aW50OF90KiBkZXN0X3NjYW4sCisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgaW50IHdpZHRoLAorICAgIGludCBibGVuZF90eXBlLAorICAgIGludCBkZXN0X0JwcCwKKyAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4sCisgICAgdWludDhfdCogc3JjX2NhY2hlX3NjYW4sCisgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0KKyAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOworICBpZiAoc3JjX2FscGhhX3NjYW4pIHsKKyAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBzcmNfY2FjaGVfc2Nhbiwgc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOworICB9IGVsc2UgeworICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgIGludCBkZXN0X2dhcCA9IGRlc3RfQnBwIC0gMzsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2NhbiwgMSk7CisgICAgICB1aW50OF90IHNyY19hbHBoYTsKKyAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM10gKiAoKmNsaXBfc2NhbisrKSAvIDI1NTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOworICAgICAgfQorICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7CisgICAgICAgIHNyY19jYWNoZV9zY2FuICs9IDM7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgeworICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19jYWNoZV9zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7CisgICAgICAgIGludCBiYWNrX2NvbG9yID0gKmRlc3Rfc2NhbjsKKyAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfQkxFTkQoYmxlbmRfdHlwZSwgYmFja19jb2xvciwgKnNyY19jYWNoZV9zY2FuKTsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKGJhY2tfY29sb3IsIGJsZW5kZWQsIHNyY19hbHBoYSk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBzcmNfY2FjaGVfc2NhbisrOworICAgICAgfQorICAgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgX0NvbXBvc2l0ZVJvd19BcmdiMlJnYl9CbGVuZChkZXN0X3NjYW4sIHNyY19jYWNoZV9zY2FuLCB3aWR0aCwgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X0JwcCwgY2xpcF9zY2FuLCBzcmNfYWxwaGFfc2Nhbik7Cit9CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X0FyZ2IyUmdiX05vQmxlbmRfVHJhbnNmb3JtKAorICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IGRlc3RfQnBwLAorICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICBjb25zdCB1aW50OF90KiBzcmNfYWxwaGFfc2NhbiwKKyAgICB1aW50OF90KiBzcmNfY2FjaGVfc2NhbiwKKyAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPQorICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CisgIGlmIChzcmNfYWxwaGFfc2NhbikgeworICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7CisgIH0gZWxzZSB7CisgICAgaW50IGRlc3RfZ2FwID0gZGVzdF9CcHAgLSAzOworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLCAxKTsKKyAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhOworICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXSAqICgqY2xpcF9zY2FuKyspIC8gMjU1OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107CisgICAgICB9CisgICAgICBzcmNfc2NhbiArPSA0OworICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19jYWNoZV9zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfY2FjaGVfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX2NhY2hlX3NjYW4rKzsKKyAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7CisgICAgICAgIHNyY19jYWNoZV9zY2FuICs9IDM7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfY2FjaGVfc2Nhbiwgc3JjX2FscGhhKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIHNyY19jYWNoZV9zY2FuKys7CisgICAgICB9CisgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBfQ29tcG9zaXRlUm93X0FyZ2IyUmdiX05vQmxlbmQoZGVzdF9zY2FuLCBzcmNfY2FjaGVfc2Nhbiwgd2lkdGgsIGRlc3RfQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9zY2FuLCBzcmNfYWxwaGFfc2Nhbik7Cit9CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfTm9DbGlwX1RyYW5zZm9ybSgKKyAgICB1aW50OF90KiBkZXN0X3NjYW4sCisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgaW50IHdpZHRoLAorICAgIGludCBibGVuZF90eXBlLAorICAgIGludCBkZXN0X0JwcCwKKyAgICBpbnQgc3JjX0JwcCwKKyAgICB1aW50OF90KiBzcmNfY2FjaGVfc2NhbiwKKyAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPQorICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CisgIGlmIChzcmNfQnBwID09IDMpIHsKKyAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBzcmNfY2FjaGVfc2Nhbiwgc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOworICB9IGVsc2UgeworICAgIHVpbnQ4X3QqIGRwID0gc3JjX2NhY2hlX3NjYW47CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkcCwgc3JjX3NjYW4sIDEpOworICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICAgIGRwICs9IDM7CisgICAgfQorICB9CisgIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9Ob0NsaXAoZGVzdF9zY2FuLCBzcmNfY2FjaGVfc2Nhbiwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRfdHlwZSwgZGVzdF9CcHAsIDMpOworfQoraW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX0NsaXBfVHJhbnNmb3JtKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfY2FjaGVfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPQorICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CisgIGlmIChzcmNfQnBwID09IDMpIHsKKyAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBzcmNfY2FjaGVfc2Nhbiwgc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOworICB9IGVsc2UgeworICAgIHVpbnQ4X3QqIGRwID0gc3JjX2NhY2hlX3NjYW47CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkcCwgc3JjX3NjYW4sIDEpOworICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICAgIGRwICs9IDM7CisgICAgfQorICB9CisgIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9DbGlwKGRlc3Rfc2Nhbiwgc3JjX2NhY2hlX3NjYW4sIHdpZHRoLCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X0JwcCwgMywgY2xpcF9zY2FuKTsKK30KK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX05vQ2xpcF9UcmFuc2Zvcm0oCisgICAgdWludDhfdCogZGVzdF9zY2FuLAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgIGludCB3aWR0aCwKKyAgICBpbnQgZGVzdF9CcHAsCisgICAgaW50IHNyY19CcHAsCisgICAgdWludDhfdCogc3JjX2NhY2hlX3NjYW4sCisgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0KKyAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOworICBpZiAoc3JjX0JwcCA9PSAzKSB7CisgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKKyAgfSBlbHNlIHsKKyAgICB1aW50OF90KiBkcCA9IHNyY19jYWNoZV9zY2FuOworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZHAsIHNyY19zY2FuLCAxKTsKKyAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICBkcCArPSAzOworICAgIH0KKyAgfQorICBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9Ob0NsaXAoZGVzdF9zY2FuLCBzcmNfY2FjaGVfc2Nhbiwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X0JwcCwgMyk7Cit9CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9DbGlwX1RyYW5zZm9ybSgKKyAgICB1aW50OF90KiBkZXN0X3NjYW4sCisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgaW50IHdpZHRoLAorICAgIGludCBkZXN0X0JwcCwKKyAgICBpbnQgc3JjX0JwcCwKKyAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgdWludDhfdCogc3JjX2NhY2hlX3NjYW4sCisgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0KKyAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOworICBpZiAoc3JjX0JwcCA9PSAzKSB7CisgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKKyAgfSBlbHNlIHsKKyAgICB1aW50OF90KiBkcCA9IHNyY19jYWNoZV9zY2FuOworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZHAsIHNyY19zY2FuLCAxKTsKKyAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICBkcCArPSAzOworICAgIH0KKyAgfQorICBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9DbGlwKGRlc3Rfc2Nhbiwgc3JjX2NhY2hlX3NjYW4sIHdpZHRoLCBkZXN0X0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCBjbGlwX3NjYW4pOworfQoraW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd184YnBwUGFsMkdyYXkodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwUGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4pIHsKKyAgaWYgKHNyY19hbHBoYV9zY2FuKSB7CisgICAgaWYgKGJsZW5kX3R5cGUpIHsKKyAgICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgICAgICB1aW50OF90IGdyYXkgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOworICAgICAgICBpbnQgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7CisgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKICAgICAgICAgfQogICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7Ci0gICAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKKyAgICAgICAgICBibGVuZGVkX2NvbG9yID0KKyAgICAgICAgICAgICAgYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9MVU1JTk9TSVRZID8gZ3JheSA6ICpkZXN0X3NjYW47CiAgICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICBpbnQgc3JjX2NvbG9yID0gKnNyY19zY2FuOwotICAgICAgICAgICAgaW50IGJhY2tfY29sb3IgPSAqZGVzdF9zY2FuOwotICAgICAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0gOgotICAgICAgICAgICAgICAgICAgICAgICAgICBfQkxFTkQoYmxlbmRfdHlwZSwgYmFja19jb2xvciwgc3JjX2NvbG9yKTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRShiYWNrX2NvbG9yLCBibGVuZGVkLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOwotICAgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOwotICAgIH0KLX0KLWlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX05vQ2xpcChGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUENCWVRFIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBkZXN0X0JwcCwgaW50IHNyY19CcHApCi17Ci0gICAgaWYgKGRlc3RfQnBwID09IHNyY19CcHApIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5MzIoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGggKiBkZXN0X0JwcCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICBkZXN0X3NjYW5bMF0gPSBzcmNfc2NhblswXTsKLSAgICAgICAgZGVzdF9zY2FuWzFdID0gc3JjX3NjYW5bMV07Ci0gICAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19zY2FuWzJdOwotICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7Ci0gICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgfQotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfQ2xpcChGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUENCWVRFIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBkZXN0X0JwcCwgaW50IHNyY19CcHAsIEZYX0xQQ0JZVEUgY2xpcF9zY2FuKQotewotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOwotICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gc3JjX3NjYW5bMF07Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBzcmNfc2NhblsxXTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19zY2FuWzJdOwotICAgICAgICB9IGVsc2UgaWYgKHNyY19hbHBoYSkgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfc2Nhbiwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfc2Nhbiwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfc2Nhbiwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcCAtIDI7Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwIC0gMjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKLSAgICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKLSAgICB9Ci19Ci12b2lkIF9Db21wb3NpdGVSb3dfQXJnYjJBcmdiX1RyYW5zZm9ybShGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUENCWVRFIHNyY19zY2FuLCBpbnQgcGl4ZWxfY291bnQsIGludCBibGVuZF90eXBlLCBGWF9MUENCWVRFIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X2FscGhhX3NjYW4sIEZYX0xQQ0JZVEUgc3JjX2FscGhhX3NjYW4sIEZYX0xQQllURSBzcmNfY2FjaGVfc2Nhbiwgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBGWF9MUEJZVEUgZHAgPSBzcmNfY2FjaGVfc2NhbjsKLSAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgaWYgKHNyY19hbHBoYV9zY2FuKSB7Ci0gICAgICAgIGlmIChkZXN0X2FscGhhX3NjYW4gPT0gTlVMTCkgewotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRwLCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICAgICAgZHBbM10gPSAqc3JjX2FscGhhX3NjYW4rKzsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgIGRwICs9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcmNfYWxwaGFfc2NhbiA9IE5VTEw7CisgICAgICAgIGdyYXkgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2NhbiwgZ3JheSk7CisgICAgICAgIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgc3JjX2FscGhhKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRwLCBzcmNfc2NhbiwgcGl4ZWxfY291bnQpOworICAgICAgICAgICpkZXN0X3NjYW4gPSBncmF5OwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGRlc3RfYWxwaGFfc2NhbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZHAsIHNyY19zY2FuLCAxKTsKLSAgICAgICAgICAgICAgICBkcFszXSA9IHNyY19zY2FuWzNdOwotICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgZHAgKz0gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICAgICAgICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLCAxKTsKLSAgICAgICAgICAgICAgICBGWF9CWVRFIGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgICAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX3NjYW5bM10gLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuID0gc3JjX2FscGhhOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19jYWNoZV9zY2FuKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX2NhY2hlX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfY2FjaGVfc2NhbisrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiA9IHNyY19zY2FuWzNdOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19jYWNoZV9zY2FuKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX2NhY2hlX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfY2FjaGVfc2NhbisrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZYX0JZVEUgc3JjX2FscGhhOwotICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuWzNdIC8gMjU1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2NhY2hlX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhfQllURSBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiArKyA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX2NhY2hlX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sICpzcmNfY2FjaGVfc2Nhbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0UoKnNyY19jYWNoZV9zY2FuLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgKnNyY19jYWNoZV9zY2FuLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICBzcmNfY2FjaGVfc2NhbiArKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIHNyY19zY2FuKys7CisgICAgICB9CisgICAgICByZXR1cm47CiAgICAgfQotICAgIF9Db21wb3NpdGVSb3dfQXJnYjJBcmdiKGRlc3Rfc2Nhbiwgc3JjX2NhY2hlX3NjYW4sIHBpeGVsX2NvdW50LCBibGVuZF90eXBlLCBjbGlwX3NjYW4sIGRlc3RfYWxwaGFfc2Nhbiwgc3JjX2FscGhhX3NjYW4pOwotfQotdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX05vQ2xpcF9UcmFuc2Zvcm0oRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgYmxlbmRfdHlwZSwgaW50IHNyY19CcHAsCi0gICAgICAgIEZYX0xQQllURSBkZXN0X2FscGhhX3NjYW4sIEZYX0xQQllURSBzcmNfY2FjaGVfc2Nhbiwgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgaWYgKHNyY19CcHAgPT0gMykgewotICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBzcmNfY2FjaGVfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBGWF9MUEJZVEUgZHAgPSBzcmNfY2FjaGVfc2NhbjsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZHAsIHNyY19zY2FuLCAxKTsKLSAgICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgICBkcCArPSAzOwotICAgICAgICB9CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICB1aW50OF90IGdyYXkgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOworICAgICAgaW50IHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOworICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIHNyY19hbHBoYSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAqZGVzdF9zY2FuID0gZ3JheTsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgc3JjX3NjYW4rKzsKICAgICB9Ci0gICAgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9Ob0NsaXAoZGVzdF9zY2FuLCBzcmNfY2FjaGVfc2Nhbiwgd2lkdGgsIGJsZW5kX3R5cGUsIDMsIGRlc3RfYWxwaGFfc2Nhbik7Ci19Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX0NsaXBfVHJhbnNmb3JtKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGJsZW5kX3R5cGUsIGludCBzcmNfQnBwLCBGWF9MUENCWVRFIGNsaXBfc2NhbiwKLSAgICAgICAgRlhfTFBCWVRFIGRlc3RfYWxwaGFfc2NhbiwgRlhfTFBCWVRFIHNyY19jYWNoZV9zY2FuLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICBpZiAoc3JjX0JwcCA9PSAzKSB7Ci0gICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYX0xQQllURSBkcCA9IHNyY19jYWNoZV9zY2FuOwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkcCwgc3JjX3NjYW4sIDEpOwotICAgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgICAgIGRwICs9IDM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9DbGlwKGRlc3Rfc2Nhbiwgc3JjX2NhY2hlX3NjYW4sIHdpZHRoLCBibGVuZF90eXBlLCAzLCBjbGlwX3NjYW4sIGRlc3RfYWxwaGFfc2Nhbik7Ci19Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX05vQmxlbmRfQ2xpcF9UcmFuc2Zvcm0oRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgc3JjX0JwcCwgRlhfTFBDQllURSBjbGlwX3NjYW4sCi0gICAgICAgIEZYX0xQQllURSBkZXN0X2FscGhhX3NjYW4sIEZYX0xQQllURSBzcmNfY2FjaGVfc2Nhbiwgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgaWYgKHNyY19CcHAgPT0gMykgewotICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBzcmNfY2FjaGVfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBGWF9MUEJZVEUgZHAgPSBzcmNfY2FjaGVfc2NhbjsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZHAsIHNyY19zY2FuLCAxKTsKLSAgICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgICBkcCArPSAzOwotICAgICAgICB9Ci0gICAgfQotICAgIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9DbGlwKGRlc3Rfc2Nhbiwgc3JjX2NhY2hlX3NjYW4sIHdpZHRoLCAzLCBjbGlwX3NjYW4sIGRlc3RfYWxwaGFfc2Nhbik7Ci19Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX05vQmxlbmRfTm9DbGlwX1RyYW5zZm9ybShGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUENCWVRFIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBzcmNfQnBwLAotICAgICAgICBGWF9MUEJZVEUgZGVzdF9hbHBoYV9zY2FuLCBGWF9MUEJZVEUgc3JjX2NhY2hlX3NjYW4sIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICAgIGlmIChzcmNfQnBwID09IDMpIHsKLSAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLCB3aWR0aCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRlhfTFBCWVRFIGRwID0gc3JjX2NhY2hlX3NjYW47Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRwLCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgZHAgKz0gMzsKLSAgICAgICAgfQotICAgIH0KLSAgICBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX05vQmxlbmRfTm9DbGlwKGRlc3Rfc2Nhbiwgc3JjX2NhY2hlX3NjYW4sIHdpZHRoLCAzLCBkZXN0X2FscGhhX3NjYW4pOwotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19BcmdiMlJnYl9CbGVuZF9UcmFuc2Zvcm0oRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgYmxlbmRfdHlwZSwgaW50IGRlc3RfQnBwLCBGWF9MUENCWVRFIGNsaXBfc2NhbiwKLSAgICAgICAgRlhfTFBDQllURSBzcmNfYWxwaGFfc2NhbiwgRlhfTFBCWVRFIHNyY19jYWNoZV9zY2FuLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICBpZiAoc3JjX2FscGhhX3NjYW4pIHsKLSAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLCB3aWR0aCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgICAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICAgICAgICBpbnQgZGVzdF9nYXAgPSBkZXN0X0JwcCAtIDM7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICBGWF9CWVRFIHNyY19hbHBoYTsKLSAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXSAqICgqY2xpcF9zY2FuKyspIC8gMjU1OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7Ci0gICAgICAgICAgICAgICAgc3JjX2NhY2hlX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgICAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19jYWNoZV9zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvciArKykgewotICAgICAgICAgICAgICAgIGludCBiYWNrX2NvbG9yID0gKmRlc3Rfc2NhbjsKLSAgICAgICAgICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQkxFTkQoYmxlbmRfdHlwZSwgYmFja19jb2xvciwgKnNyY19jYWNoZV9zY2FuKTsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoYmFja19jb2xvciwgYmxlbmRlZCwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgc3JjX2NhY2hlX3NjYW4gKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBfQ29tcG9zaXRlUm93X0FyZ2IyUmdiX0JsZW5kKGRlc3Rfc2Nhbiwgc3JjX2NhY2hlX3NjYW4sIHdpZHRoLCBibGVuZF90eXBlLCBkZXN0X0JwcCwgY2xpcF9zY2FuLCBzcmNfYWxwaGFfc2Nhbik7Ci19Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X0FyZ2IyUmdiX05vQmxlbmRfVHJhbnNmb3JtKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGRlc3RfQnBwLCBGWF9MUENCWVRFIGNsaXBfc2NhbiwKLSAgICAgICAgRlhfTFBDQllURSBzcmNfYWxwaGFfc2NhbiwgRlhfTFBCWVRFIHNyY19jYWNoZV9zY2FuLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICBpZiAoc3JjX2FscGhhX3NjYW4pIHsKLSAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLCB3aWR0aCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IGRlc3RfZ2FwID0gZGVzdF9CcHAgLSAzOwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBzcmNfY2FjaGVfc2Nhbiwgc3JjX3NjYW4sIDEpOwotICAgICAgICAgICAgRlhfQllURSBzcmNfYWxwaGE7Ci0gICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM10gKiAoKmNsaXBfc2NhbisrKSAvIDI1NTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX2NhY2hlX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX2NhY2hlX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX2NhY2hlX3NjYW4rKzsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7Ci0gICAgICAgICAgICAgICAgc3JjX2NhY2hlX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvciArKykgewotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCAqc3JjX2NhY2hlX3NjYW4sIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgIHNyY19jYWNoZV9zY2FuICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgX0NvbXBvc2l0ZVJvd19BcmdiMlJnYl9Ob0JsZW5kKGRlc3Rfc2Nhbiwgc3JjX2NhY2hlX3NjYW4sIHdpZHRoLCBkZXN0X0JwcCwgY2xpcF9zY2FuLCBzcmNfYWxwaGFfc2Nhbik7Ci19Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfTm9DbGlwX1RyYW5zZm9ybShGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUENCWVRFIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBibGVuZF90eXBlLCBpbnQgZGVzdF9CcHAsIGludCBzcmNfQnBwLAotICAgICAgICBGWF9MUEJZVEUgc3JjX2NhY2hlX3NjYW4sIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICAgIGlmIChzcmNfQnBwID09IDMpIHsKLSAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLCB3aWR0aCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRlhfTFBCWVRFIGRwID0gc3JjX2NhY2hlX3NjYW47Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRwLCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgZHAgKz0gMzsKLSAgICAgICAgfQotICAgIH0KLSAgICBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfTm9DbGlwKGRlc3Rfc2Nhbiwgc3JjX2NhY2hlX3NjYW4sIHdpZHRoLCBibGVuZF90eXBlLCBkZXN0X0JwcCwgMyk7Ci19Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfQ2xpcF9UcmFuc2Zvcm0oRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgYmxlbmRfdHlwZSwgaW50IGRlc3RfQnBwLCBpbnQgc3JjX0JwcCwgRlhfTFBDQllURSBjbGlwX3NjYW4sCi0gICAgICAgIEZYX0xQQllURSBzcmNfY2FjaGVfc2Nhbiwgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgaWYgKHNyY19CcHAgPT0gMykgewotICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBzcmNfY2FjaGVfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBGWF9MUEJZVEUgZHAgPSBzcmNfY2FjaGVfc2NhbjsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZHAsIHNyY19zY2FuLCAxKTsKLSAgICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgICBkcCArPSAzOwotICAgICAgICB9Ci0gICAgfQotICAgIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9DbGlwKGRlc3Rfc2Nhbiwgc3JjX2NhY2hlX3NjYW4sIHdpZHRoLCBibGVuZF90eXBlLCBkZXN0X0JwcCwgMywgY2xpcF9zY2FuKTsKLX0KLWlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX05vQ2xpcF9UcmFuc2Zvcm0oRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgZGVzdF9CcHAsIGludCBzcmNfQnBwLAotICAgICAgICBGWF9MUEJZVEUgc3JjX2NhY2hlX3NjYW4sIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICAgIGlmIChzcmNfQnBwID09IDMpIHsKLSAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLCB3aWR0aCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRlhfTFBCWVRFIGRwID0gc3JjX2NhY2hlX3NjYW47Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRwLCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgZHAgKz0gMzsKLSAgICAgICAgfQotICAgIH0KLSAgICBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9Ob0NsaXAoZGVzdF9zY2FuLCBzcmNfY2FjaGVfc2Nhbiwgd2lkdGgsIGRlc3RfQnBwLCAzKTsKLX0KLWlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX0NsaXBfVHJhbnNmb3JtKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGRlc3RfQnBwLCBpbnQgc3JjX0JwcCwgRlhfTFBDQllURSBjbGlwX3NjYW4sCi0gICAgICAgIEZYX0xQQllURSBzcmNfY2FjaGVfc2Nhbiwgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgaWYgKHNyY19CcHAgPT0gMykgewotICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBzcmNfY2FjaGVfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBGWF9MUEJZVEUgZHAgPSBzcmNfY2FjaGVfc2NhbjsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZHAsIHNyY19zY2FuLCAxKTsKLSAgICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgICBkcCArPSAzOwotICAgICAgICB9Ci0gICAgfQotICAgIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX0NsaXAoZGVzdF9zY2FuLCBzcmNfY2FjaGVfc2Nhbiwgd2lkdGgsIGRlc3RfQnBwLCAzLCBjbGlwX3NjYW4pOwotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd184YnBwUGFsMkdyYXkoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgRlhfTFBDQllURSBwUGFsZXR0ZSwgaW50IHBpeGVsX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsIEZYX0xQQ0JZVEUgY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBDQllURSBzcmNfYWxwaGFfc2NhbikKLXsKLSAgICBpZiAoc3JjX2FscGhhX3NjYW4pIHsKLSAgICAgICAgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7Ci0gICAgICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBGWF9CWVRFIGdyYXkgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOwotICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKLSAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJsZW5kZWRfY29sb3IgPSBibGVuZF90eXBlID09IEZYRElCX0JMRU5EX0xVTUlOT1NJVFkgPyBncmF5IDogKmRlc3Rfc2NhbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ3JheSA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3IgOiBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2NhbiwgZ3JheSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSkgewotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gZ3JheTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgICAgIEZYX0JZVEUgZ3JheSA9IHBQYWxldHRlWypzcmNfc2Nhbl07Ci0gICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7Ci0gICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBncmF5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICAgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKLSAgICAgICAgICAgIGludCBibGVuZGVkX2NvbG9yOwotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIEZYX0JZVEUgZ3JheSA9IHBQYWxldHRlWypzcmNfc2Nhbl07Ci0gICAgICAgICAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgICAgICAgICAgICAgICBibGVuZGVkX2NvbG9yID0gYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9MVU1JTk9TSVRZID8gZ3JheSA6ICpkZXN0X3NjYW47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGdyYXkgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yIDogX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIGdyYXkpOwotICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4gJiYgY2xpcF9zY2FuW2NvbF0gPCAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGNsaXBfc2Nhbltjb2xdKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gZ3JheTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgICAgIEZYX0JZVEUgZ3JheSA9IHBQYWxldHRlWypzcmNfc2Nhbl07Ci0gICAgICAgICAgICBpZiAoY2xpcF9zY2FuICYmIGNsaXBfc2Nhbltjb2xdIDwgMjU1KSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGNsaXBfc2Nhbltjb2xdKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IGdyYXk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgfQotICAgIH0KLX0KLWlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfOGJwcFBhbDJHcmF5YShGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUENCWVRFIHNyY19zY2FuLCBGWF9MUENCWVRFIHBQYWxldHRlLCBpbnQgcGl4ZWxfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsIEZYX0xQQ0JZVEUgY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X2FscGhhX3NjYW4sIEZYX0xQQ0JZVEUgc3JjX2FscGhhX3NjYW4pCi17Ci0gICAgaWYgKHNyY19hbHBoYV9zY2FuKSB7Ci0gICAgICAgIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgICAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICAgICAgICAgICAgaW50IGJsZW5kZWRfY29sb3I7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgRlhfQllURSBncmF5ID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBGWF9CWVRFIGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgICAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IGdyYXk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuID0gc3JjX2FscGhhOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhfQllURSBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKLSAgICAgICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICBkZXN0X2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gKCpkZXN0X2FscGhhX3NjYW4pOwotICAgICAgICAgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgYmxlbmRlZF9jb2xvciA9IGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSA/IGdyYXkgOiAqZGVzdF9zY2FuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBncmF5ID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvciA6IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBncmF5KTsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICAgICAgRlhfQllURSBncmF5ID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKLSAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICAgICAgRlhfQllURSBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKLSAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IGdyYXk7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gPSBzcmNfYWxwaGE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBkZXN0X2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9CWVRFIHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOwotICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvICgqZGVzdF9hbHBoYV9zY2FuKTsKLSAgICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICAgICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKLSAgICAgICAgICAgIGludCBibGVuZGVkX2NvbG9yOwotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgIEZYX0JZVEUgZ3JheSA9IHBQYWxldHRlWypzcmNfc2Nhbl07Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbiA9PSBOVUxMIHx8IGNsaXBfc2Nhbltjb2xdID09IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBncmF5OwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgICAgICAgICAgICAgIEZYX0JZVEUgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gKysgPSBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgICAgICAgICAgICAgICBibGVuZGVkX2NvbG9yID0gYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9MVU1JTk9TSVRZID8gZ3JheSA6ICpkZXN0X3NjYW47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGdyYXkgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yIDogX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIGdyYXkpOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgICAgIEZYX0JZVEUgZ3JheSA9IHBQYWxldHRlWypzcmNfc2Nhbl07Ci0gICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgIGlmIChjbGlwX3NjYW4gPT0gTlVMTCB8fCBjbGlwX3NjYW5bY29sXSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBncmF5OwotICAgICAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IDI1NTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXTsKLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBkZXN0X2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47Ci0gICAgICAgICAgICBGWF9CWVRFIGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gKysgPSBkZXN0X2FscGhhOwotICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93XzFicHBQYWwyR3JheShGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUENCWVRFIHNyY19zY2FuLCBpbnQgc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUENCWVRFIHBQYWxldHRlLCBpbnQgcGl4ZWxfY291bnQsIGludCBibGVuZF90eXBlLCBGWF9MUENCWVRFIGNsaXBfc2NhbikKLXsKLSAgICBpbnQgcmVzZXRfZ3JheSA9IHBQYWxldHRlWzBdOwotICAgIGludCBzZXRfZ3JheSA9IHBQYWxldHRlWzFdOworICB9IGVsc2UgewogICAgIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7Ci0gICAgICAgIGludCBibGVuZGVkX2NvbG9yOwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgICAgICBGWF9CWVRFIGdyYXkgPSAoc3JjX3NjYW5bKGNvbCArIHNyY19sZWZ0KSAvIDhdICYgKDEgPDwgKDcgLSAoY29sICsgc3JjX2xlZnQpICUgOCkpKSA/IHNldF9ncmF5IDogcmVzZXRfZ3JheTsKLSAgICAgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgICAgICAgICAgICBibGVuZGVkX2NvbG9yID0gYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9MVU1JTk9TSVRZID8gZ3JheSA6ICpkZXN0X3NjYW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBncmF5ID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvciA6IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBncmF5KTsKLSAgICAgICAgICAgIGlmIChjbGlwX3NjYW4gJiYgY2xpcF9zY2FuW2NvbF0gPCAyNTUpIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgY2xpcF9zY2FuW2NvbF0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gZ3JheTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKKyAgICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgICAgICB1aW50OF90IGdyYXkgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOworICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CisgICAgICAgICAgYmxlbmRlZF9jb2xvciA9CisgICAgICAgICAgICAgIGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSA/IGdyYXkgOiAqZGVzdF9zY2FuOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICBGWF9CWVRFIGdyYXkgPSAoc3JjX3NjYW5bKGNvbCArIHNyY19sZWZ0KSAvIDhdICYgKDEgPDwgKDcgLSAoY29sICsgc3JjX2xlZnQpICUgOCkpKSA/IHNldF9ncmF5IDogcmVzZXRfZ3JheTsKKyAgICAgICAgZ3JheSA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBncmF5KTsKICAgICAgICAgaWYgKGNsaXBfc2NhbiAmJiBjbGlwX3NjYW5bY29sXSA8IDI1NSkgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGNsaXBfc2Nhbltjb2xdKTsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgY2xpcF9zY2FuW2NvbF0pOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpkZXN0X3NjYW4gPSBncmF5OworICAgICAgICB9CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBzcmNfc2NhbisrOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgIHVpbnQ4X3QgZ3JheSA9IHBQYWxldHRlWypzcmNfc2Nhbl07CisgICAgICBpZiAoY2xpcF9zY2FuICYmIGNsaXBfc2Nhbltjb2xdIDwgMjU1KSB7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBjbGlwX3NjYW5bY29sXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAqZGVzdF9zY2FuID0gZ3JheTsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgc3JjX3NjYW4rKzsKKyAgICB9CisgIH0KK30KK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfOGJwcFBhbDJHcmF5YSh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFBhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4pIHsKKyAgaWYgKHNyY19hbHBoYV9zY2FuKSB7CisgICAgaWYgKGJsZW5kX3R5cGUpIHsKKyAgICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgICAgICB1aW50OF90IGdyYXkgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOworICAgICAgICBzcmNfc2NhbisrOworICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOworICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7CisgICAgICAgICAgaW50IHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOworICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7CiAgICAgICAgICAgICAqZGVzdF9zY2FuID0gZ3JheTsKKyAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gPSBzcmNfYWxwaGE7CisgICAgICAgICAgfQorICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICB9Ci19Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93XzFicHBQYWwyR3JheWEoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgaW50IHNyY19sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQ0JZVEUgcFBhbGV0dGUsIGludCBwaXhlbF9jb3VudCwgaW50IGJsZW5kX3R5cGUsIEZYX0xQQ0JZVEUgY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X2FscGhhX3NjYW4pCi17Ci0gICAgaW50IHJlc2V0X2dyYXkgPSBwUGFsZXR0ZVswXTsKLSAgICBpbnQgc2V0X2dyYXkgPSBwUGFsZXR0ZVsxXTsKLSAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICAgICAgRlhfQllURSBncmF5ID0gKHNyY19zY2FuWyhjb2wgKyBzcmNfbGVmdCkgLyA4XSAmICgxIDw8ICg3IC0gKGNvbCArIHNyY19sZWZ0KSAlIDgpKSkgPyBzZXRfZ3JheSA6IHJlc2V0X2dyYXk7Ci0gICAgICAgICAgICBpZiAoY2xpcF9zY2FuID09IE5VTEwgfHwgY2xpcF9zY2FuW2NvbF0gPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gZ3JheTsKLSAgICAgICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuICsrID0gMjU1OwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOwotICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKLSAgICAgICAgICAgIEZYX0JZVEUgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiArKyA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgICAgICAgICAgIGJsZW5kZWRfY29sb3IgPSBibGVuZF90eXBlID09IEZYRElCX0JMRU5EX0xVTUlOT1NJVFkgPyBncmF5IDogKmRlc3Rfc2NhbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdyYXkgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yIDogX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIGdyYXkpOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKKyAgICAgICAgdWludDhfdCBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKKyAgICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OwogICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICBGWF9CWVRFIGdyYXkgPSAoc3JjX3NjYW5bKGNvbCArIHNyY19sZWZ0KSAvIDhdICYgKDEgPDwgKDcgLSAoY29sICsgc3JjX2xlZnQpICUgOCkpKSA/IHNldF9ncmF5IDogcmVzZXRfZ3JheTsKLSAgICAgICAgaWYgKGNsaXBfc2NhbiA9PSBOVUxMIHx8IGNsaXBfc2Nhbltjb2xdID09IDI1NSkgewotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gZ3JheTsKLSAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gKysgPSAyNTU7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07CiAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuKys7CisgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgaW50IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgICAgICBGWF9CWVRFIGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiArKyA9IGRlc3RfYWxwaGE7Ci0gICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAgICpkZXN0X2FscGhhX3NjYW4gPQorICAgICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvICgqZGVzdF9hbHBoYV9zY2FuKTsKKyAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgeworICAgICAgICAgIGJsZW5kZWRfY29sb3IgPQorICAgICAgICAgICAgICBibGVuZF90eXBlID09IEZYRElCX0JMRU5EX0xVTUlOT1NJVFkgPyBncmF5IDogKmRlc3Rfc2NhbjsKKyAgICAgICAgfQorICAgICAgICBncmF5ID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIGdyYXkpOwogICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOwotICAgICAgICBkZXN0X3NjYW4gKys7CisgICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKICAgICB9Ci19Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93XzhicHBSZ2IyUmdiX05vQmxlbmQoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgRlhfRFdPUkQqIHBQYWxldHRlLCBpbnQgcGl4ZWxfY291bnQsCi0gICAgICAgIGludCBEZXN0QnBwLCBGWF9MUENCWVRFIGNsaXBfc2NhbiwKLSAgICAgICAgRlhfTFBDQllURSBzcmNfYWxwaGFfc2NhbikKLXsKLSAgICBpZiAoc3JjX2FscGhhX3NjYW4pIHsKLSAgICAgICAgaW50IGRlc3RfZ2FwID0gRGVzdEJwcCAtIDM7Ci0gICAgICAgIEZYX0FSR0IgYXJnYiA9IDA7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgICAgIGFyZ2IgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOwotICAgICAgICAgICAgaW50IHNyY19yID0gRlhBUkdCX1IoYXJnYik7Ci0gICAgICAgICAgICBpbnQgc3JjX2cgPSBGWEFSR0JfRyhhcmdiKTsKLSAgICAgICAgICAgIGludCBzcmNfYiA9IEZYQVJHQl9CKGFyZ2IpOwotICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICBGWF9CWVRFIHNyY19hbHBoYSA9IDA7Ci0gICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgc3JjX2FscGhhID0gKCpzcmNfYWxwaGFfc2NhbisrKSAqICgqY2xpcF9zY2FuKyspIC8gMjU1OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2I7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2c7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3I7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IERlc3RCcHA7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX3IsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBGWF9BUkdCIGFyZ2IgPSAwOwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgICAgICBhcmdiID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKLSAgICAgICAgICAgIGludCBzcmNfciA9IEZYQVJHQl9SKGFyZ2IpOwotICAgICAgICAgICAgaW50IHNyY19nID0gRlhBUkdCX0coYXJnYik7Ci0gICAgICAgICAgICBpbnQgc3JjX2IgPSBGWEFSR0JfQihhcmdiKTsKLSAgICAgICAgICAgIGlmIChjbGlwX3NjYW4gJiYgY2xpcF9zY2FuW2NvbF0gPCAyNTUpIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIGNsaXBfc2Nhbltjb2xdKTsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBjbGlwX3NjYW5bY29sXSk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgY2xpcF9zY2FuW2NvbF0pOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2I7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2c7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoRGVzdEJwcCA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgfQotICAgIH0KLX0KLWlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfMWJwcFJnYjJSZ2JfTm9CbGVuZChGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUENCWVRFIHNyY19zY2FuLCBpbnQgc3JjX2xlZnQsCi0gICAgICAgIEZYX0RXT1JEKiBwUGFsZXR0ZSwgaW50IHBpeGVsX2NvdW50LCBpbnQgRGVzdEJwcCwgRlhfTFBDQllURSBjbGlwX3NjYW4pCi17Ci0gICAgaW50IHJlc2V0X3IsIHJlc2V0X2csIHJlc2V0X2I7Ci0gICAgaW50IHNldF9yLCBzZXRfZywgc2V0X2I7Ci0gICAgcmVzZXRfciA9IEZYQVJHQl9SKHBQYWxldHRlWzBdKTsKLSAgICByZXNldF9nID0gRlhBUkdCX0cocFBhbGV0dGVbMF0pOwotICAgIHJlc2V0X2IgPSBGWEFSR0JfQihwUGFsZXR0ZVswXSk7Ci0gICAgc2V0X3IgPSBGWEFSR0JfUihwUGFsZXR0ZVsxXSk7Ci0gICAgc2V0X2cgPSBGWEFSR0JfRyhwUGFsZXR0ZVsxXSk7Ci0gICAgc2V0X2IgPSBGWEFSR0JfQihwUGFsZXR0ZVsxXSk7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICBpbnQgc3JjX3IsIHNyY19nLCBzcmNfYjsKLSAgICAgICAgaWYgKHNyY19zY2FuWyhjb2wgKyBzcmNfbGVmdCkgLyA4XSAmICgxIDw8ICg3IC0gKGNvbCArIHNyY19sZWZ0KSAlIDgpKSkgewotICAgICAgICAgICAgc3JjX3IgPSBzZXRfcjsKLSAgICAgICAgICAgIHNyY19nID0gc2V0X2c7Ci0gICAgICAgICAgICBzcmNfYiA9IHNldF9iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjX3IgPSByZXNldF9yOwotICAgICAgICAgICAgc3JjX2cgPSByZXNldF9nOwotICAgICAgICAgICAgc3JjX2IgPSByZXNldF9iOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjbGlwX3NjYW4gJiYgY2xpcF9zY2FuW2NvbF0gPCAyNTUpIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgY2xpcF9zY2FuW2NvbF0pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBjbGlwX3NjYW5bY29sXSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX3IsIGNsaXBfc2Nhbltjb2xdKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19iOwotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2c7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfcjsKLSAgICAgICAgfQotICAgICAgICBpZiAoRGVzdEJwcCA9PSA0KSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgfQotICAgIH0KLX0KLWlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfOGJwcFJnYjJBcmdiX05vQmxlbmQoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgaW50IHdpZHRoLAotICAgICAgICBGWF9EV09SRCogcFBhbGV0dGUsIEZYX0xQQ0JZVEUgY2xpcF9zY2FuLAotICAgICAgICBGWF9MUENCWVRFIHNyY19hbHBoYV9zY2FuKQotewotICAgIGlmIChzcmNfYWxwaGFfc2NhbikgewotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICBGWF9BUkdCIGFyZ2IgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOwotICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICBpbnQgc3JjX3IgPSBGWEFSR0JfUihhcmdiKTsKLSAgICAgICAgICAgIGludCBzcmNfZyA9IEZYQVJHQl9HKGFyZ2IpOwotICAgICAgICAgICAgaW50IHNyY19iID0gRlhBUkdCX0IoYXJnYik7Ci0gICAgICAgICAgICBGWF9CWVRFIGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107Ci0gICAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiAoKnNyY19hbHBoYV9zY2FuKSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKHNyY19hbHBoYSwgc3JjX3IsIHNyY19nLCBzcmNfYikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRSgqc3JjX2FscGhhX3NjYW4sIHNyY19yLCBzcmNfZywgc3JjX2IpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgc3JjX2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9CWVRFIHNyY19hbHBoYTsKLSAgICAgICAgICAgIGlmIChjbGlwX3NjYW4gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiAoKnNyY19hbHBoYV9zY2FuKyspIC8gMjU1OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9CWVRFIGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICB9Ci0gICAgfSBlbHNlCi0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgIEZYX0FSR0IgYXJnYiA9IHBQYWxldHRlWypzcmNfc2Nhbl07Ci0gICAgICAgICAgICBpbnQgc3JjX3IgPSBGWEFSR0JfUihhcmdiKTsKLSAgICAgICAgICAgIGludCBzcmNfZyA9IEZYQVJHQl9HKGFyZ2IpOwotICAgICAgICAgICAgaW50IHNyY19iID0gRlhBUkdCX0IoYXJnYik7Ci0gICAgICAgICAgICBpZiAoY2xpcF9zY2FuID09IE5VTEwgfHwgY2xpcF9zY2FuW2NvbF0gPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2I7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2c7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3I7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gMjU1OwotICAgICAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOwotICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICAgICAgICAgIEZYX0JZVEUgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgfQotfQotdm9pZCBfQ29tcG9zaXRlUm93XzhicHBSZ2IyUmdiYV9Ob0JsZW5kKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcFBhbGV0dGUsIEZYX0xQQ0JZVEUgY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X2FscGhhX3NjYW4sIEZYX0xQQ0JZVEUgc3JjX2FscGhhX3NjYW4pCi17Ci0gICAgaWYgKHNyY19hbHBoYV9zY2FuKSB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgIEZYX0FSR0IgYXJnYiA9IHBQYWxldHRlWypzcmNfc2Nhbl07Ci0gICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgIGludCBzcmNfciA9IEZYQVJHQl9SKGFyZ2IpOwotICAgICAgICAgICAgaW50IHNyY19nID0gRlhBUkdCX0coYXJnYik7Ci0gICAgICAgICAgICBpbnQgc3JjX2IgPSBGWEFSR0JfQihhcmdiKTsKLSAgICAgICAgICAgIEZYX0JZVEUgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47Ci0gICAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiAoKnNyY19hbHBoYV9zY2FuKSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiArKyA9IHNyY19hbHBoYTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuICsrID0gKnNyY19hbHBoYV9zY2FuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuICsrID0gc3JjX2I7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiArKyA9IHNyY19nOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gKysgPSBzcmNfcjsKLSAgICAgICAgICAgICAgICBzcmNfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX0JZVEUgc3JjX2FscGhhOwotICAgICAgICAgICAgaWYgKGNsaXBfc2NhbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogKCpzcmNfYWxwaGFfc2NhbisrKSAvIDI1NTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX0JZVEUgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiArKyA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICB9Ci0gICAgfSBlbHNlCi0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgIEZYX0FSR0IgYXJnYiA9IHBQYWxldHRlWypzcmNfc2Nhbl07Ci0gICAgICAgICAgICBpbnQgc3JjX3IgPSBGWEFSR0JfUihhcmdiKTsKLSAgICAgICAgICAgIGludCBzcmNfZyA9IEZYQVJHQl9HKGFyZ2IpOwotICAgICAgICAgICAgaW50IHNyY19iID0gRlhBUkdCX0IoYXJnYik7Ci0gICAgICAgICAgICBpZiAoY2xpcF9zY2FuID09IE5VTEwgfHwgY2xpcF9zY2FuW2NvbF0gPT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2I7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2c7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3I7Ci0gICAgICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gMjU1OwotICAgICAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOwotICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgICAgICAgICAgRlhfQllURSBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuICsrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgfQotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd18xYnBwUmdiMkFyZ2JfTm9CbGVuZChGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUENCWVRFIHNyY19zY2FuLCBpbnQgc3JjX2xlZnQsIGludCB3aWR0aCwKLSAgICAgICAgRlhfRFdPUkQqIHBQYWxldHRlLCBGWF9MUENCWVRFIGNsaXBfc2NhbikKLXsKLSAgICBpbnQgcmVzZXRfciwgcmVzZXRfZywgcmVzZXRfYjsKLSAgICBpbnQgc2V0X3IsIHNldF9nLCBzZXRfYjsKLSAgICByZXNldF9yID0gRlhBUkdCX1IocFBhbGV0dGVbMF0pOwotICAgIHJlc2V0X2cgPSBGWEFSR0JfRyhwUGFsZXR0ZVswXSk7Ci0gICAgcmVzZXRfYiA9IEZYQVJHQl9CKHBQYWxldHRlWzBdKTsKLSAgICBzZXRfciA9IEZYQVJHQl9SKHBQYWxldHRlWzFdKTsKLSAgICBzZXRfZyA9IEZYQVJHQl9HKHBQYWxldHRlWzFdKTsKLSAgICBzZXRfYiA9IEZYQVJHQl9CKHBQYWxldHRlWzFdKTsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgIGludCBzcmNfciwgc3JjX2csIHNyY19iOwotICAgICAgICBpZiAoc3JjX3NjYW5bKGNvbCArIHNyY19sZWZ0KSAvIDhdICYgKDEgPDwgKDcgLSAoY29sICsgc3JjX2xlZnQpICUgOCkpKSB7Ci0gICAgICAgICAgICBzcmNfciA9IHNldF9yOwotICAgICAgICAgICAgc3JjX2cgPSBzZXRfZzsKLSAgICAgICAgICAgIHNyY19iID0gc2V0X2I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfciA9IHJlc2V0X3I7Ci0gICAgICAgICAgICBzcmNfZyA9IHJlc2V0X2c7Ci0gICAgICAgICAgICBzcmNfYiA9IHJlc2V0X2I7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNsaXBfc2NhbiA9PSBOVUxMIHx8IGNsaXBfc2Nhbltjb2xdID09IDI1NSkgewotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2I7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfZzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19yOwotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gMjU1OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOwotICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107Ci0gICAgICAgIEZYX0JZVEUgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOwotICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIGFscGhhX3JhdGlvKTsKLSAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX3IsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgfQotfQotdm9pZCBfQ29tcG9zaXRlUm93XzFicHBSZ2IyUmdiYV9Ob0JsZW5kKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCBzcmNfbGVmdCwgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwUGFsZXR0ZSwgRlhfTFBDQllURSBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBCWVRFIGRlc3RfYWxwaGFfc2NhbikKLXsKLSAgICBpbnQgcmVzZXRfciwgcmVzZXRfZywgcmVzZXRfYjsKLSAgICBpbnQgc2V0X3IsIHNldF9nLCBzZXRfYjsKLSAgICByZXNldF9yID0gRlhBUkdCX1IocFBhbGV0dGVbMF0pOwotICAgIHJlc2V0X2cgPSBGWEFSR0JfRyhwUGFsZXR0ZVswXSk7Ci0gICAgcmVzZXRfYiA9IEZYQVJHQl9CKHBQYWxldHRlWzBdKTsKLSAgICBzZXRfciA9IEZYQVJHQl9SKHBQYWxldHRlWzFdKTsKLSAgICBzZXRfZyA9IEZYQVJHQl9HKHBQYWxldHRlWzFdKTsKLSAgICBzZXRfYiA9IEZYQVJHQl9CKHBQYWxldHRlWzFdKTsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgIGludCBzcmNfciwgc3JjX2csIHNyY19iOwotICAgICAgICBpZiAoc3JjX3NjYW5bKGNvbCArIHNyY19sZWZ0KSAvIDhdICYgKDEgPDwgKDcgLSAoY29sICsgc3JjX2xlZnQpICUgOCkpKSB7Ci0gICAgICAgICAgICBzcmNfciA9IHNldF9yOwotICAgICAgICAgICAgc3JjX2cgPSBzZXRfZzsKLSAgICAgICAgICAgIHNyY19iID0gc2V0X2I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfciA9IHJlc2V0X3I7Ci0gICAgICAgICAgICBzcmNfZyA9IHJlc2V0X2c7Ci0gICAgICAgICAgICBzcmNfYiA9IHJlc2V0X2I7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNsaXBfc2NhbiA9PSBOVUxMIHx8IGNsaXBfc2Nhbltjb2xdID09IDI1NSkgewotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2I7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfZzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19yOwotICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gMjU1OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOwotICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAzOwotICAgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuICsrOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgICAgICBGWF9CWVRFIGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiArKyA9IGRlc3RfYWxwaGE7Ci0gICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgYWxwaGFfcmF0aW8pOwotICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgYWxwaGFfcmF0aW8pOwotICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgYWxwaGFfcmF0aW8pOwotICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgfQotfQotdm9pZCBfQ29tcG9zaXRlUm93X0J5dGVNYXNrMkFyZ2IoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgaW50IG1hc2tfYWxwaGEsIGludCBzcmNfciwgaW50IHNyY19nLCBpbnQgc3JjX2IsIGludCBwaXhlbF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLCBGWF9MUENCWVRFIGNsaXBfc2NhbikKLXsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgIGludCBzcmNfYWxwaGE7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICB1aW50OF90IGdyYXkgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOworICAgICAgc3JjX3NjYW4rKzsKKyAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47CisgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7CisgICAgICAgIGludCBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdICogc3JjX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBzcmNfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICB9Ci0gICAgICAgIEZYX0JZVEUgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKHNyY19hbHBoYSwgc3JjX3IsIHNyY19nLCBzcmNfYikpOwotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfQllURSBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgIGlmIChibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSkgewotICAgICAgICAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgICAgICAgICAgRlhfQllURSBzcmNfc2NhblszXTsKLSAgICAgICAgICAgIHNyY19zY2FuWzBdID0gc3JjX2I7Ci0gICAgICAgICAgICBzcmNfc2NhblsxXSA9IHNyY19nOwotICAgICAgICAgICAgc3JjX3NjYW5bMl0gPSBzcmNfcjsKLSAgICAgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzBdLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMV0sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1syXSwgYWxwaGFfcmF0aW8pOwotICAgICAgICB9IGVsc2UgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgICAgIGludCBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19iKTsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfYiwgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfZyk7Ci0gICAgICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2csIGJsZW5kZWQsIGJhY2tfYWxwaGEpOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX3IpOwotICAgICAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICs9IDI7Ci0gICAgfQotfQotdm9pZCBfQ29tcG9zaXRlUm93X0J5dGVNYXNrMlJnYmEoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgaW50IG1hc2tfYWxwaGEsIGludCBzcmNfciwgaW50IHNyY19nLCBpbnQgc3JjX2IsIGludCBwaXhlbF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLCBGWF9MUENCWVRFIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X2FscGhhX3NjYW4pCi17Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIHNyY19zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfQllURSBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKLSAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiArKyA9IHNyY19iOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiArKyA9IHNyY19nOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiArKyA9IHNyY19yOwotICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiArKyA9IHNyY19hbHBoYTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDM7Ci0gICAgICAgICAgICBkZXN0X2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBGWF9CWVRFIGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiArKyA9IGRlc3RfYWxwaGE7Ci0gICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgIGlmIChibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSkgewotICAgICAgICAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgICAgICAgICAgRlhfQllURSBzcmNfc2NhblszXTsKLSAgICAgICAgICAgIHNyY19zY2FuWzBdID0gc3JjX2I7Ci0gICAgICAgICAgICBzcmNfc2NhblsxXSA9IHNyY19nOwotICAgICAgICAgICAgc3JjX3NjYW5bMl0gPSBzcmNfcjsKLSAgICAgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzBdLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMV0sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1syXSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICB9IGVsc2UgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgICAgIGludCBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19iKTsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfYiwgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfZyk7Ci0gICAgICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2csIGJsZW5kZWQsIGJhY2tfYWxwaGEpOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX3IpOwotICAgICAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci12b2lkIF9Db21wb3NpdGVSb3dfQnl0ZU1hc2syUmdiKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCBtYXNrX2FscGhhLCBpbnQgc3JjX3IsIGludCBzcmNfZywgaW50IHNyY19iLCBpbnQgcGl4ZWxfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLCBpbnQgQnBwLCBGWF9MUENCWVRFIGNsaXBfc2NhbikKLXsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgIGludCBzcmNfYWxwaGE7Ci0gICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuW2NvbF0gLyAyNTUgLyAyNTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogc3JjX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEUpIHsKLSAgICAgICAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICAgICAgICAgIEZYX0JZVEUgc3JjX3NjYW5bM107Ci0gICAgICAgICAgICBzcmNfc2NhblswXSA9IHNyY19iOwotICAgICAgICAgICAgc3JjX3NjYW5bMV0gPSBzcmNfZzsKLSAgICAgICAgICAgIHNyY19zY2FuWzJdID0gc3JjX3I7Ci0gICAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1swXSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1sxXSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1syXSwgc3JjX2FscGhhKTsKLSAgICAgICAgfSBlbHNlIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgICAgICBpbnQgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfYik7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2cpOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19yKTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBzcmNfYWxwaGEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBzcmNfYWxwaGEpOwotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArPSBCcHAgLSAyOwotICAgIH0KLX0KLXZvaWQgX0NvbXBvc2l0ZVJvd19CeXRlTWFzazJNYXNrKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCBtYXNrX2FscGhhLCBpbnQgcGl4ZWxfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUENCWVRFIGNsaXBfc2NhbikKLXsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgIGludCBzcmNfYWxwaGE7Ci0gICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuW2NvbF0gLyAyNTUgLyAyNTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogc3JjX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgfQotICAgICAgICBGWF9CWVRFIGJhY2tfYWxwaGEgPSAqZGVzdF9zY2FuOwotICAgICAgICBpZiAoIWJhY2tfYWxwaGEpIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBzcmNfYWxwaGE7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICsrOwotICAgIH0KLX0KLXZvaWQgX0NvbXBvc2l0ZVJvd19CeXRlTWFzazJHcmF5KEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCBtYXNrX2FscGhhLCBpbnQgc3JjX2dyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsIEZYX0xQQ0JZVEUgY2xpcF9zY2FuKQotewotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdICogc3JjX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBzcmNfc2Nhbltjb2xdIC8gMjU1OworICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OwogICAgICAgICB9CiAgICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZ3JheSwgc3JjX2FscGhhKTsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gZ3JheTsKKyAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuID0gc3JjX2FscGhhOwogICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArKzsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7CisgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAqZGVzdF9hbHBoYV9zY2FuID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyAoKmRlc3RfYWxwaGFfc2Nhbik7CisgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKICAgICB9Ci19Ci12b2lkIF9Db21wb3NpdGVSb3dfQnl0ZU1hc2syR3JheWEoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgaW50IG1hc2tfYWxwaGEsIGludCBzcmNfZ3JheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsIEZYX0xQQ0JZVEUgY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X2FscGhhX3NjYW4pCi17Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIHNyY19zY2FuW2NvbF0gLyAyNTU7CisgIH0gZWxzZSB7CisgICAgaWYgKGJsZW5kX3R5cGUpIHsKKyAgICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgICBpbnQgYmxlbmRlZF9jb2xvcjsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgICAgICB1aW50OF90IGdyYXkgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOworICAgICAgICBzcmNfc2NhbisrOworICAgICAgICBpZiAoIWNsaXBfc2NhbiB8fCBjbGlwX3NjYW5bY29sXSA9PSAyNTUpIHsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBncmF5OworICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IDI1NTsKKyAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBGWF9CWVRFIGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuICsrID0gc3JjX2dyYXk7Ci0gICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuICsrID0gc3JjX2FscGhhOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KKyAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOwogICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIEZYX0JZVEUgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgICAgICBpbnQgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47CisgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9CisgICAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19ncmF5LCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICB9Ci19Ci12b2lkIF9Db21wb3NpdGVSb3dfQml0TWFzazJBcmdiKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCBtYXNrX2FscGhhLCBpbnQgc3JjX3IsIGludCBzcmNfZywgaW50IHNyY19iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsIGludCBwaXhlbF9jb3VudCwgaW50IGJsZW5kX3R5cGUsIEZYX0xQQ0JZVEUgY2xpcF9zY2FuKQotewotICAgIGlmIChibGVuZF90eXBlID09IEZYRElCX0JMRU5EX05PUk1BTCAmJiBjbGlwX3NjYW4gPT0gTlVMTCAmJiBtYXNrX2FscGhhID09IDI1NSkgewotICAgICAgICBGWF9BUkdCIGFyZ2IgPSBGWEFSR0JfTUFLRSgweGZmLCBzcmNfciwgc3JjX2csIHNyY19iKTsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICAgICAgaWYgKHNyY19zY2FuWyhzcmNfbGVmdCArIGNvbCkgLyA4XSAmICgxIDw8ICg3IC0gKHNyY19sZWZ0ICsgY29sKSAlIDgpKSkgewotICAgICAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBhcmdiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICBpZiAoIShzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpKSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludCBzcmNfYWxwaGE7Ci0gICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGE7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfQllURSBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOwotICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0Uoc3JjX2FscGhhLCBzcmNfciwgc3JjX2csIHNyY19iKSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEZYX0JZVEUgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOwotICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICBpZiAoYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEUpIHsKLSAgICAgICAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICAgICAgICAgIEZYX0JZVEUgc3JjX3NjYW5bM107Ci0gICAgICAgICAgICBzcmNfc2NhblswXSA9IHNyY19iOwotICAgICAgICAgICAgc3JjX3NjYW5bMV0gPSBzcmNfZzsKLSAgICAgICAgICAgIHNyY19zY2FuWzJdID0gc3JjX3I7Ci0gICAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1swXSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzFdLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMl0sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgfSBlbHNlIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgICAgICBpbnQgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfYik7Ci0gICAgICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2cpOwotICAgICAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19nLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19yKTsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfciwgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgYWxwaGFfcmF0aW8pOwotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArPSAyOwotICAgIH0KLX0KLXZvaWQgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMlJnYmEoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgaW50IG1hc2tfYWxwaGEsIGludCBzcmNfciwgaW50IHNyY19nLCBpbnQgc3JjX2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwgaW50IHBpeGVsX2NvdW50LCBpbnQgYmxlbmRfdHlwZSwgRlhfTFBDQllURSBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X2FscGhhX3NjYW4pCi17Ci0gICAgaWYgKGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTk9STUFMICYmIGNsaXBfc2NhbiA9PSBOVUxMICYmIG1hc2tfYWxwaGEgPT0gMjU1KSB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgICAgIGlmIChzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpIHsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBzcmNfYjsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBzcmNfZzsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBzcmNfcjsKLSAgICAgICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuID0gbWFza19hbHBoYTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAzOwotICAgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuICsrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICBpZiAoIShzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpKSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gMzsKLSAgICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludCBzcmNfYWxwaGE7Ci0gICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGE7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfQllURSBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOwotICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuICsrID0gc3JjX2I7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuICsrID0gc3JjX2c7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuICsrID0gc3JjX3I7Ci0gICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuICsrID0gbWFza19hbHBoYTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEZYX0JZVEUgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAqZGVzdF9hbHBoYV9zY2FuICsrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgaWYgKGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFKSB7Ci0gICAgICAgICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gICAgICAgICAgICBGWF9CWVRFIHNyY19zY2FuWzNdOwotICAgICAgICAgICAgc3JjX3NjYW5bMF0gPSBzcmNfYjsKLSAgICAgICAgICAgIHNyY19zY2FuWzFdID0gc3JjX2c7Ci0gICAgICAgICAgICBzcmNfc2NhblsyXSA9IHNyY19yOwotICAgICAgICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMF0sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1sxXSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzJdLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgIH0gZWxzZSBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgICAgICAgaW50IGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2IpOwotICAgICAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19iLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19nKTsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfZywgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfcik7Ci0gICAgICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX3IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX3IsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgfQotICAgIH0KLX0KLXZvaWQgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMlJnYihGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUENCWVRFIHNyY19zY2FuLCBpbnQgbWFza19hbHBoYSwgaW50IHNyY19yLCBpbnQgc3JjX2csIGludCBzcmNfYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsIGludCBwaXhlbF9jb3VudCwgaW50IGJsZW5kX3R5cGUsIGludCBCcHAsIEZYX0xQQ0JZVEUgY2xpcF9zY2FuKQotewotICAgIGlmIChibGVuZF90eXBlID09IEZYRElCX0JMRU5EX05PUk1BTCAmJiBjbGlwX3NjYW4gPT0gTlVMTCAmJiBtYXNrX2FscGhhID09IDI1NSkgewotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgICAgICBpZiAoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gc3JjX3I7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gc3JjX2c7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gc3JjX2I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICBpZiAoIShzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpKSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEUpIHsKLSAgICAgICAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICAgICAgICAgIEZYX0JZVEUgc3JjX3NjYW5bM107Ci0gICAgICAgICAgICBzcmNfc2NhblswXSA9IHNyY19iOwotICAgICAgICAgICAgc3JjX3NjYW5bMV0gPSBzcmNfZzsKLSAgICAgICAgICAgIHNyY19zY2FuWzJdID0gc3JjX3I7Ci0gICAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1swXSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1sxXSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1syXSwgc3JjX2FscGhhKTsKLSAgICAgICAgfSBlbHNlIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgICAgICBpbnQgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfYik7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfZyk7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfcik7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgc3JjX2FscGhhKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgc3JjX2FscGhhKTsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4gKz0gQnBwIC0gMjsKLSAgICB9Ci19Ci12b2lkIF9Db21wb3NpdGVSb3dfQml0TWFzazJNYXNrKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCBtYXNrX2FscGhhLCBpbnQgc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwgRlhfTFBDQllURSBjbGlwX3NjYW4pCi17Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICBpZiAoIShzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpKSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhOwotICAgICAgICB9Ci0gICAgICAgIEZYX0JZVEUgYmFja19hbHBoYSA9ICpkZXN0X3NjYW47Ci0gICAgICAgIGlmICghYmFja19hbHBoYSkgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IHNyY19hbHBoYTsKLSAgICAgICAgfSBlbHNlIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgfQotfQotdm9pZCBfQ29tcG9zaXRlUm93X0JpdE1hc2syR3JheShGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUENCWVRFIHNyY19zY2FuLCBpbnQgbWFza19hbHBoYSwgaW50IHNyY19ncmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsIGludCBwaXhlbF9jb3VudCwgRlhfTFBDQllURSBjbGlwX3NjYW4pCi17Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICBpZiAoIShzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpKSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZ3JheSwgc3JjX2FscGhhKTsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgfQotfQotdm9pZCBfQ29tcG9zaXRlUm93X0JpdE1hc2syR3JheWEoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgaW50IG1hc2tfYWxwaGEsIGludCBzcmNfZ3JheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwgaW50IHBpeGVsX2NvdW50LCBGWF9MUENCWVRFIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X2FscGhhX3NjYW4pCi17Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICBpZiAoIShzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpKSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICBkZXN0X2FscGhhX3NjYW4gKys7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhOwotICAgICAgICB9Ci0gICAgICAgIEZYX0JZVEUgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47Ci0gICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gKysgPSBzcmNfZ3JheTsKLSAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gKysgPSBzcmNfYWxwaGE7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbiArKzsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEZYX0JZVEUgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOwotICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2dyYXksIGFscGhhX3JhdGlvKTsKLSAgICAgICAgZGVzdF9zY2FuICsrOwotICAgIH0KLX0KLXZvaWQgX0NvbXBvc2l0ZVJvd19BcmdiMkFyZ2JfUmdiQnl0ZU9yZGVyKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCBwaXhlbF9jb3VudCwgaW50IGJsZW5kX3R5cGUsIEZYX0xQQ0JZVEUgY2xpcF9zY2FuKQotewotICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgRlhfQllURSBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOwotICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX3NjYW5bM10gLyAyNTU7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gc3JjX2FscGhhOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IHNyY19zY2FuWzJdOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IHNyY19zY2FuWzFdOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19zY2FuWzBdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBGWEFSR0JfUkdCT1JERVJDT1BZKGRlc3Rfc2Nhbiwgc3JjX3NjYW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfQllURSBzcmNfYWxwaGE7Ci0gICAgICAgIGlmIChjbGlwX3NjYW4gPT0gTlVMTCkgewotICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuWzNdIC8gMjU1OwotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfQllURSBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CiAgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgICAgICAgIEZYX0JZVEUgZGVzdF9zY2FuX29bM107Ci0gICAgICAgICAgICBkZXN0X3NjYW5fb1swXSA9IGRlc3Rfc2NhblsyXTsKLSAgICAgICAgICAgIGRlc3Rfc2Nhbl9vWzFdID0gZGVzdF9zY2FuWzFdOwotICAgICAgICAgICAgZGVzdF9zY2FuX29bMl0gPSBkZXN0X3NjYW5bMF07Ci0gICAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW5fbywgYmxlbmRlZF9jb2xvcnMpOworICAgICAgICAgIGJsZW5kZWRfY29sb3IgPQorICAgICAgICAgICAgICBibGVuZF90eXBlID09IEZYRElCX0JMRU5EX0xVTUlOT1NJVFkgPyBncmF5IDogKmRlc3Rfc2NhbjsKICAgICAgICAgfQotICAgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IgKyspIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IDIgLSBjb2xvcjsKLSAgICAgICAgICAgIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgICAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0gOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JMRU5EKGJsZW5kX3R5cGUsIGRlc3Rfc2NhbltpbmRleF0sICpzcmNfc2Nhbik7Ci0gICAgICAgICAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKCpzcmNfc2NhbiwgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuW2luZGV4XSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhbltpbmRleF0sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuW2luZGV4XSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhbltpbmRleF0sICpzcmNfc2NhbiwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3JjX3NjYW4gKys7CisgICAgICAgIGdyYXkgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2NhbiwgZ3JheSk7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBhbHBoYV9yYXRpbyk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgIHVpbnQ4X3QgZ3JheSA9IHBQYWxldHRlWypzcmNfc2Nhbl07CisgICAgICBzcmNfc2NhbisrOworICAgICAgaWYgKCFjbGlwX3NjYW4gfHwgY2xpcF9zY2FuW2NvbF0gPT0gMjU1KSB7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IGdyYXk7CisgICAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IDI1NTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07CisgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGludCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKKyAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9CisgICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICB9CisgIH0KK30KK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfMWJwcFBhbDJHcmF5KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFBhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBpbnQgcmVzZXRfZ3JheSA9IHBQYWxldHRlWzBdOworICBpbnQgc2V0X2dyYXkgPSBwUGFsZXR0ZVsxXTsKKyAgaWYgKGJsZW5kX3R5cGUpIHsKKyAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgIGludCBibGVuZGVkX2NvbG9yOworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgICAgdWludDhfdCBncmF5ID0KKyAgICAgICAgICAoc3JjX3NjYW5bKGNvbCArIHNyY19sZWZ0KSAvIDhdICYgKDEgPDwgKDcgLSAoY29sICsgc3JjX2xlZnQpICUgOCkpKQorICAgICAgICAgICAgICA/IHNldF9ncmF5CisgICAgICAgICAgICAgIDogcmVzZXRfZ3JheTsKKyAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKKyAgICAgICAgYmxlbmRlZF9jb2xvciA9CisgICAgICAgICAgICBibGVuZF90eXBlID09IEZYRElCX0JMRU5EX0xVTUlOT1NJVFkgPyBncmF5IDogKmRlc3Rfc2NhbjsKKyAgICAgIH0KKyAgICAgIGdyYXkgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIGdyYXkpOworICAgICAgaWYgKGNsaXBfc2NhbiAmJiBjbGlwX3NjYW5bY29sXSA8IDI1NSkgeworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgY2xpcF9zY2FuW2NvbF0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IGdyYXk7CisgICAgICB9CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgIHVpbnQ4X3QgZ3JheSA9CisgICAgICAgIChzcmNfc2NhblsoY29sICsgc3JjX2xlZnQpIC8gOF0gJiAoMSA8PCAoNyAtIChjb2wgKyBzcmNfbGVmdCkgJSA4KSkpCisgICAgICAgICAgICA/IHNldF9ncmF5CisgICAgICAgICAgICA6IHJlc2V0X2dyYXk7CisgICAgaWYgKGNsaXBfc2NhbiAmJiBjbGlwX3NjYW5bY29sXSA8IDI1NSkgeworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGNsaXBfc2Nhbltjb2xdKTsKKyAgICB9IGVsc2UgeworICAgICAgKmRlc3Rfc2NhbiA9IGdyYXk7CisgICAgfQorICAgIGRlc3Rfc2NhbisrOworICB9Cit9CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93XzFicHBQYWwyR3JheWEodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwUGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbikgeworICBpbnQgcmVzZXRfZ3JheSA9IHBQYWxldHRlWzBdOworICBpbnQgc2V0X2dyYXkgPSBwUGFsZXR0ZVsxXTsKKyAgaWYgKGJsZW5kX3R5cGUpIHsKKyAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgIGludCBibGVuZGVkX2NvbG9yOworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgICAgdWludDhfdCBncmF5ID0KKyAgICAgICAgICAoc3JjX3NjYW5bKGNvbCArIHNyY19sZWZ0KSAvIDhdICYgKDEgPDwgKDcgLSAoY29sICsgc3JjX2xlZnQpICUgOCkpKQorICAgICAgICAgICAgICA/IHNldF9ncmF5CisgICAgICAgICAgICAgIDogcmVzZXRfZ3JheTsKKyAgICAgIGlmICghY2xpcF9zY2FuIHx8IGNsaXBfc2Nhbltjb2xdID09IDI1NSkgeworICAgICAgICAqZGVzdF9zY2FuKysgPSBncmF5OworICAgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSAyNTU7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOworICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpbnQgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47CisgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKKyAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CisgICAgICAgIGJsZW5kZWRfY29sb3IgPQorICAgICAgICAgICAgYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9MVU1JTk9TSVRZID8gZ3JheSA6ICpkZXN0X3NjYW47CisgICAgICB9CisgICAgICBncmF5ID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBncmF5KTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgIHVpbnQ4X3QgZ3JheSA9CisgICAgICAgIChzcmNfc2NhblsoY29sICsgc3JjX2xlZnQpIC8gOF0gJiAoMSA8PCAoNyAtIChjb2wgKyBzcmNfbGVmdCkgJSA4KSkpCisgICAgICAgICAgICA/IHNldF9ncmF5CisgICAgICAgICAgICA6IHJlc2V0X2dyYXk7CisgICAgaWYgKCFjbGlwX3NjYW4gfHwgY2xpcF9zY2FuW2NvbF0gPT0gMjU1KSB7CisgICAgICAqZGVzdF9zY2FuKysgPSBncmF5OworICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gMjU1OworICAgICAgY29udGludWU7CisgICAgfQorICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXTsKKyAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgZGVzdF9hbHBoYV9zY2FuKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOworICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7CisgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhbisrOworICB9Cit9CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93XzhicHBSZ2IyUmdiX05vQmxlbmQodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwUGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IERlc3RCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuKSB7CisgIGlmIChzcmNfYWxwaGFfc2NhbikgeworICAgIGludCBkZXN0X2dhcCA9IERlc3RCcHAgLSAzOworICAgIEZYX0FSR0IgYXJnYiA9IDA7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICBhcmdiID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKKyAgICAgIGludCBzcmNfciA9IEZYQVJHQl9SKGFyZ2IpOworICAgICAgaW50IHNyY19nID0gRlhBUkdCX0coYXJnYik7CisgICAgICBpbnQgc3JjX2IgPSBGWEFSR0JfQihhcmdiKTsKKyAgICAgIHNyY19zY2FuKys7CisgICAgICB1aW50OF90IHNyY19hbHBoYSA9IDA7CisgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgIHNyY19hbHBoYSA9ICgqc3JjX2FscGhhX3NjYW4rKykgKiAoKmNsaXBfc2NhbisrKSAvIDI1NTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2I7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19nOworICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfcjsKKyAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgICBkZXN0X3NjYW4gKz0gRGVzdEJwcDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgc3JjX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7CisgICAgfQorICB9IGVsc2UgeworICAgIEZYX0FSR0IgYXJnYiA9IDA7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICBhcmdiID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKKyAgICAgIGludCBzcmNfciA9IEZYQVJHQl9SKGFyZ2IpOworICAgICAgaW50IHNyY19nID0gRlhBUkdCX0coYXJnYik7CisgICAgICBpbnQgc3JjX2IgPSBGWEFSR0JfQihhcmdiKTsKKyAgICAgIGlmIChjbGlwX3NjYW4gJiYgY2xpcF9zY2FuW2NvbF0gPCAyNTUpIHsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBjbGlwX3NjYW5bY29sXSk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIGNsaXBfc2Nhbltjb2xdKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgY2xpcF9zY2FuW2NvbF0pOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19iOworICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfZzsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3I7CisgICAgICB9CisgICAgICBpZiAoRGVzdEJwcCA9PSA0KSB7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgfQorICAgICAgc3JjX3NjYW4rKzsKKyAgICB9CisgIH0KK30KK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfMWJwcFJnYjJSZ2JfTm9CbGVuZCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwUGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IERlc3RCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7CisgIGludCByZXNldF9yLCByZXNldF9nLCByZXNldF9iOworICBpbnQgc2V0X3IsIHNldF9nLCBzZXRfYjsKKyAgcmVzZXRfciA9IEZYQVJHQl9SKHBQYWxldHRlWzBdKTsKKyAgcmVzZXRfZyA9IEZYQVJHQl9HKHBQYWxldHRlWzBdKTsKKyAgcmVzZXRfYiA9IEZYQVJHQl9CKHBQYWxldHRlWzBdKTsKKyAgc2V0X3IgPSBGWEFSR0JfUihwUGFsZXR0ZVsxXSk7CisgIHNldF9nID0gRlhBUkdCX0cocFBhbGV0dGVbMV0pOworICBzZXRfYiA9IEZYQVJHQl9CKHBQYWxldHRlWzFdKTsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgaW50IHNyY19yLCBzcmNfZywgc3JjX2I7CisgICAgaWYgKHNyY19zY2FuWyhjb2wgKyBzcmNfbGVmdCkgLyA4XSAmICgxIDw8ICg3IC0gKGNvbCArIHNyY19sZWZ0KSAlIDgpKSkgeworICAgICAgc3JjX3IgPSBzZXRfcjsKKyAgICAgIHNyY19nID0gc2V0X2c7CisgICAgICBzcmNfYiA9IHNldF9iOworICAgIH0gZWxzZSB7CisgICAgICBzcmNfciA9IHJlc2V0X3I7CisgICAgICBzcmNfZyA9IHJlc2V0X2c7CisgICAgICBzcmNfYiA9IHJlc2V0X2I7CisgICAgfQorICAgIGlmIChjbGlwX3NjYW4gJiYgY2xpcF9zY2FuW2NvbF0gPCAyNTUpIHsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgY2xpcF9zY2FuW2NvbF0pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIGNsaXBfc2Nhbltjb2xdKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBjbGlwX3NjYW5bY29sXSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICB9IGVsc2UgeworICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2I7CisgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfZzsKKyAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19yOworICAgIH0KKyAgICBpZiAoRGVzdEJwcCA9PSA0KSB7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICB9CisgIH0KK30KK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfOGJwcFJnYjJBcmdiX05vQmxlbmQodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcFBhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4pIHsKKyAgaWYgKHNyY19hbHBoYV9zY2FuKSB7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICBGWF9BUkdCIGFyZ2IgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOworICAgICAgc3JjX3NjYW4rKzsKKyAgICAgIGludCBzcmNfciA9IEZYQVJHQl9SKGFyZ2IpOworICAgICAgaW50IHNyY19nID0gRlhBUkdCX0coYXJnYik7CisgICAgICBpbnQgc3JjX2IgPSBGWEFSR0JfQihhcmdiKTsKKyAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKKyAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqICgqc3JjX2FscGhhX3NjYW4pIC8gMjU1OworICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShzcmNfYWxwaGEsIHNyY19yLCBzcmNfZywgc3JjX2IpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9NQUtFKCpzcmNfYWxwaGFfc2Nhbiwgc3JjX3IsIHNyY19nLCBzcmNfYikpOwogICAgICAgICB9CiAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICBzcmNfYWxwaGFfc2NhbisrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhOworICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqICgqc3JjX2FscGhhX3NjYW4rKykgLyAyNTU7CisgICAgICB9IGVsc2UgeworICAgICAgICBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICB9CisgIH0gZWxzZQorICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgRlhfQVJHQiBhcmdiID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKKyAgICAgIGludCBzcmNfciA9IEZYQVJHQl9SKGFyZ2IpOworICAgICAgaW50IHNyY19nID0gRlhBUkdCX0coYXJnYik7CisgICAgICBpbnQgc3JjX2IgPSBGWEFSR0JfQihhcmdiKTsKKyAgICAgIGlmICghY2xpcF9zY2FuIHx8IGNsaXBfc2Nhbltjb2xdID09IDI1NSkgeworICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfYjsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2c7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19yOworICAgICAgICAqZGVzdF9zY2FuKysgPSAyNTU7CisgICAgICAgIHNyY19zY2FuKys7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOworICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgIGRlc3Rfc2NhbiArPSA0OwogICAgICAgICBzcmNfc2NhbisrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGludCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KKyAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX3IsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBzcmNfc2NhbisrOwogICAgIH0KIH0KLXZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9Ob0NsaXBfUmdiQnl0ZU9yZGVyKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGJsZW5kX3R5cGUsIGludCBzcmNfQnBwKQotewotICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICAgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICBGWF9CWVRFIGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107Ci0gICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgIGlmIChzcmNfQnBwID09IDQpIHsKLSAgICAgICAgICAgICAgICBGWEFSR0JfU0VUUkdCT1JERVJESUIoZGVzdF9zY2FuLCAweGZmMDAwMDAwIHwgRlhBUkdCX0dFVERJQihzcmNfc2NhbikpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBGWEFSR0JfU0VUUkdCT1JERVJESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRSgweGZmLCBzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sIHNyY19zY2FuWzBdKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW5bM10gPSAweGZmOwotICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKQl7Ci0gICAgICAgICAgICBGWF9CWVRFIGRlc3Rfc2Nhbl9vWzNdOwotICAgICAgICAgICAgZGVzdF9zY2FuX29bMF0gPSBkZXN0X3NjYW5bMl07Ci0gICAgICAgICAgICBkZXN0X3NjYW5fb1sxXSA9IGRlc3Rfc2NhblsxXTsKLSAgICAgICAgICAgIGRlc3Rfc2Nhbl9vWzJdID0gZGVzdF9zY2FuWzBdOwotICAgICAgICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuX28sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IgKyspIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IDIgLSBjb2xvcjsKLSAgICAgICAgICAgIGludCBzcmNfY29sb3IgPSBGWF9HQU1NQSgqc3JjX3NjYW4pOwotICAgICAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0gOgotICAgICAgICAgICAgICAgICAgICAgICAgICBfQkxFTkQoYmxlbmRfdHlwZSwgZGVzdF9zY2FuW2luZGV4XSwgc3JjX2NvbG9yKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbltpbmRleF0gPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfY29sb3IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOwotICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7Ci0gICAgfQotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19BcmdiMlJnYl9CbGVuZF9SZ2JCeXRlT3JkZXIoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgYmxlbmRfdHlwZSwgaW50IGRlc3RfQnBwLCBGWF9MUENCWVRFIGNsaXBfc2NhbikKLXsKLSAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgIEZYX0JZVEUgc3JjX2FscGhhOwordm9pZCBfQ29tcG9zaXRlUm93XzhicHBSZ2IyUmdiYV9Ob0JsZW5kKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBQYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4pIHsKKyAgaWYgKHNyY19hbHBoYV9zY2FuKSB7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICBGWF9BUkdCIGFyZ2IgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOworICAgICAgc3JjX3NjYW4rKzsKKyAgICAgIGludCBzcmNfciA9IEZYQVJHQl9SKGFyZ2IpOworICAgICAgaW50IHNyY19nID0gRlhBUkdCX0coYXJnYik7CisgICAgICBpbnQgc3JjX2IgPSBGWEFSR0JfQihhcmdiKTsKKyAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47CisgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7CiAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzNdICogKCpjbGlwX3NjYW4rKykgLyAyNTU7CisgICAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogKCpzcmNfYWxwaGFfc2NhbikgLyAyNTU7CisgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gc3JjX2FscGhhOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107CisgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gKnNyY19hbHBoYV9zY2FuOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOwotICAgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgICAgICAgIEZYX0JZVEUgZGVzdF9zY2FuX29bM107Ci0gICAgICAgICAgICBkZXN0X3NjYW5fb1swXSA9IGRlc3Rfc2NhblsyXTsKLSAgICAgICAgICAgIGRlc3Rfc2Nhbl9vWzFdID0gZGVzdF9zY2FuWzFdOwotICAgICAgICAgICAgZGVzdF9zY2FuX29bMl0gPSBkZXN0X3NjYW5bMF07Ci0gICAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW5fbywgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvciArKykgewotICAgICAgICAgICAgaW50IGluZGV4ID0gMiAtIGNvbG9yOwotICAgICAgICAgICAgaW50IGJhY2tfY29sb3IgPSBGWF9HQU1NQShkZXN0X3NjYW5baW5kZXhdKTsKLSAgICAgICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgX0JMRU5EKGJsZW5kX3R5cGUsIGJhY2tfY29sb3IsICpzcmNfc2Nhbik7Ci0gICAgICAgICAgICBkZXN0X3NjYW5baW5kZXhdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShiYWNrX2NvbG9yLCBibGVuZGVkLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKLSAgICAgICAgc3JjX3NjYW4gKys7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19iOworICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfZzsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3I7CisgICAgICAgIHNyY19hbHBoYV9zY2FuKys7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgdWludDhfdCBzcmNfYWxwaGE7CisgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogKCpzcmNfYWxwaGFfc2NhbisrKSAvIDI1NTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgIGRlc3Rfc2NhbiArPSAzOworICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKKyAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgfQorICB9IGVsc2UKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgIEZYX0FSR0IgYXJnYiA9IHBQYWxldHRlWypzcmNfc2Nhbl07CisgICAgICBpbnQgc3JjX3IgPSBGWEFSR0JfUihhcmdiKTsKKyAgICAgIGludCBzcmNfZyA9IEZYQVJHQl9HKGFyZ2IpOworICAgICAgaW50IHNyY19iID0gRlhBUkdCX0IoYXJnYik7CisgICAgICBpZiAoIWNsaXBfc2NhbiB8fCBjbGlwX3NjYW5bY29sXSA9PSAyNTUpIHsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2I7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19nOworICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfcjsKKyAgICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gMjU1OworICAgICAgICBzcmNfc2NhbisrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXTsKKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgICBkZXN0X3NjYW4gKz0gMzsKKyAgICAgICAgZGVzdF9hbHBoYV9zY2FuKys7CisgICAgICAgIHNyY19zY2FuKys7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaW50IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOworICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KKyAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7CisgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX3IsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgc3JjX3NjYW4rKzsKICAgICB9CiB9Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX05vQmxlbmRfTm9DbGlwX1JnYkJ5dGVPcmRlcihGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUENCWVRFIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBzcmNfQnBwKQotewotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgaWYgKHNyY19CcHAgPT0gNCkgewotICAgICAgICAgICAgRlhBUkdCX1NFVFJHQk9SREVSRElCKGRlc3Rfc2NhbiwgMHhmZjAwMDAwMCB8IEZYQVJHQl9HRVRESUIoc3JjX3NjYW4pKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZYQVJHQl9TRVRSR0JPUkRFUkRJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKDB4ZmYsIHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgc3JjX3NjYW5bMF0pKTsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfMWJwcFJnYjJBcmdiX05vQmxlbmQodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwUGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7CisgIGludCByZXNldF9yLCByZXNldF9nLCByZXNldF9iOworICBpbnQgc2V0X3IsIHNldF9nLCBzZXRfYjsKKyAgcmVzZXRfciA9IEZYQVJHQl9SKHBQYWxldHRlWzBdKTsKKyAgcmVzZXRfZyA9IEZYQVJHQl9HKHBQYWxldHRlWzBdKTsKKyAgcmVzZXRfYiA9IEZYQVJHQl9CKHBQYWxldHRlWzBdKTsKKyAgc2V0X3IgPSBGWEFSR0JfUihwUGFsZXR0ZVsxXSk7CisgIHNldF9nID0gRlhBUkdCX0cocFBhbGV0dGVbMV0pOworICBzZXRfYiA9IEZYQVJHQl9CKHBQYWxldHRlWzFdKTsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgaW50IHNyY19yLCBzcmNfZywgc3JjX2I7CisgICAgaWYgKHNyY19zY2FuWyhjb2wgKyBzcmNfbGVmdCkgLyA4XSAmICgxIDw8ICg3IC0gKGNvbCArIHNyY19sZWZ0KSAlIDgpKSkgeworICAgICAgc3JjX3IgPSBzZXRfcjsKKyAgICAgIHNyY19nID0gc2V0X2c7CisgICAgICBzcmNfYiA9IHNldF9iOworICAgIH0gZWxzZSB7CisgICAgICBzcmNfciA9IHJlc2V0X3I7CisgICAgICBzcmNfZyA9IHJlc2V0X2c7CisgICAgICBzcmNfYiA9IHJlc2V0X2I7CiAgICAgfQotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX05vQ2xpcF9SZ2JCeXRlT3JkZXIoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgaW50IHdpZHRoLCBpbnQgYmxlbmRfdHlwZSwgaW50IGRlc3RfQnBwLCBpbnQgc3JjX0JwcCkKLXsKLSAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gICAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKLSAgICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOwotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgICAgICAgRlhfQllURSBkZXN0X3NjYW5fb1szXTsKLSAgICAgICAgICAgIGRlc3Rfc2Nhbl9vWzBdID0gZGVzdF9zY2FuWzJdOwotICAgICAgICAgICAgZGVzdF9zY2FuX29bMV0gPSBkZXN0X3NjYW5bMV07Ci0gICAgICAgICAgICBkZXN0X3NjYW5fb1syXSA9IGRlc3Rfc2NhblswXTsKLSAgICAgICAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2Nhbl9vLCBibGVuZGVkX2NvbG9ycyk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSAyIC0gY29sb3I7Ci0gICAgICAgICAgICBpbnQgYmFja19jb2xvciA9IEZYX0dBTU1BKGRlc3Rfc2NhbltpbmRleF0pOwotICAgICAgICAgICAgaW50IHNyY19jb2xvciA9IEZYX0dBTU1BKCpzcmNfc2Nhbik7Ci0gICAgICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIF9CTEVORChibGVuZF90eXBlLCBiYWNrX2NvbG9yLCBzcmNfY29sb3IpOwotICAgICAgICAgICAgZGVzdF9zY2FuW2luZGV4XSA9IEZYX0dBTU1BX0lOVkVSU0UoYmxlbmRlZCk7Ci0gICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7Ci0gICAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7CisgICAgaWYgKCFjbGlwX3NjYW4gfHwgY2xpcF9zY2FuW2NvbF0gPT0gMjU1KSB7CisgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfYjsKKyAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19nOworICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3I7CisgICAgICAqZGVzdF9zY2FuKysgPSAyNTU7CisgICAgICBjb250aW51ZTsKICAgICB9Ci19Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X0FyZ2IyUmdiX05vQmxlbmRfUmdiQnl0ZU9yZGVyKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGRlc3RfQnBwLCBGWF9MUENCWVRFIGNsaXBfc2NhbikKLXsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgIEZYX0JZVEUgc3JjX2FscGhhOwotICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXSAqICgqY2xpcF9zY2FuKyspIC8gMjU1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoKnNyY19zY2FuKyspOwotICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRSgqc3JjX3NjYW4rKyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKCpzcmNfc2NhbisrKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKLSAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yICsrKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSAyIC0gY29sb3I7Ci0gICAgICAgICAgICBkZXN0X3NjYW5baW5kZXhdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5baW5kZXhdKSwgKnNyY19zY2FuLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKLSAgICAgICAgc3JjX3NjYW4gKys7CisgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOworICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICBjb250aW51ZTsKICAgICB9CisgICAgaW50IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CisgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhbisrOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhbisrOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhbisrOworICAgIGRlc3Rfc2NhbisrOworICB9CiB9Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9Ob0NsaXBfUmdiQnl0ZU9yZGVyKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGRlc3RfQnBwLCBpbnQgc3JjX0JwcCkKLXsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19zY2FuWzBdOwotICAgICAgICBkZXN0X3NjYW5bMV0gPSBzcmNfc2NhblsxXTsKK3ZvaWQgX0NvbXBvc2l0ZVJvd18xYnBwUmdiMlJnYmFfTm9CbGVuZCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcFBhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbikgeworICBpbnQgcmVzZXRfciwgcmVzZXRfZywgcmVzZXRfYjsKKyAgaW50IHNldF9yLCBzZXRfZywgc2V0X2I7CisgIHJlc2V0X3IgPSBGWEFSR0JfUihwUGFsZXR0ZVswXSk7CisgIHJlc2V0X2cgPSBGWEFSR0JfRyhwUGFsZXR0ZVswXSk7CisgIHJlc2V0X2IgPSBGWEFSR0JfQihwUGFsZXR0ZVswXSk7CisgIHNldF9yID0gRlhBUkdCX1IocFBhbGV0dGVbMV0pOworICBzZXRfZyA9IEZYQVJHQl9HKHBQYWxldHRlWzFdKTsKKyAgc2V0X2IgPSBGWEFSR0JfQihwUGFsZXR0ZVsxXSk7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgIGludCBzcmNfciwgc3JjX2csIHNyY19iOworICAgIGlmIChzcmNfc2NhblsoY29sICsgc3JjX2xlZnQpIC8gOF0gJiAoMSA8PCAoNyAtIChjb2wgKyBzcmNfbGVmdCkgJSA4KSkpIHsKKyAgICAgIHNyY19yID0gc2V0X3I7CisgICAgICBzcmNfZyA9IHNldF9nOworICAgICAgc3JjX2IgPSBzZXRfYjsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX3IgPSByZXNldF9yOworICAgICAgc3JjX2cgPSByZXNldF9nOworICAgICAgc3JjX2IgPSByZXNldF9iOworICAgIH0KKyAgICBpZiAoIWNsaXBfc2NhbiB8fCBjbGlwX3NjYW5bY29sXSA9PSAyNTUpIHsKKyAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19iOworICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2c7CisgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfcjsKKyAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IDI1NTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07CisgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICBkZXN0X3NjYW4gKz0gMzsKKyAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGludCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKKyAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBhbHBoYV9yYXRpbyk7CisgICAgZGVzdF9zY2FuKys7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBhbHBoYV9yYXRpbyk7CisgICAgZGVzdF9zY2FuKys7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBhbHBoYV9yYXRpbyk7CisgICAgZGVzdF9zY2FuKys7CisgIH0KK30KK3ZvaWQgX0NvbXBvc2l0ZVJvd19CeXRlTWFzazJBcmdiKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBpbnQgc3JjX2FscGhhOworICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuW2NvbF0gLyAyNTUgLyAyNTU7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBzcmNfc2Nhbltjb2xdIC8gMjU1OworICAgIH0KKyAgICB1aW50OF90IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CisgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKHNyY19hbHBoYSwgc3JjX3IsIHNyY19nLCBzcmNfYikpOworICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOworICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgaWYgKGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFKSB7CisgICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107CisgICAgICB1aW50OF90IHNyY19zY2FuWzNdOworICAgICAgc3JjX3NjYW5bMF0gPSBzcmNfYjsKKyAgICAgIHNyY19zY2FuWzFdID0gc3JjX2c7CisgICAgICBzcmNfc2NhblsyXSA9IHNyY19yOworICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7CisgICAgICAqZGVzdF9zY2FuID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1swXSwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1sxXSwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1syXSwgYWxwaGFfcmF0aW8pOworICAgIH0gZWxzZSBpZiAoYmxlbmRfdHlwZSkgeworICAgICAgaW50IGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2IpOworICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19iLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2cpOworICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19nLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX3IpOworICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7CisgICAgfSBlbHNlIHsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBhbHBoYV9yYXRpbyk7CisgICAgfQorICAgIGRlc3Rfc2NhbiArPSAyOworICB9Cit9Cit2b2lkIF9Db21wb3NpdGVSb3dfQnl0ZU1hc2syUmdiYSh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4pIHsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgaW50IHNyY19hbHBoYTsKKyAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OworICAgIH0gZWxzZSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogc3JjX3NjYW5bY29sXSAvIDI1NTsKKyAgICB9CisgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKKyAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7CisgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfYjsKKyAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19nOworICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3I7CisgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBzcmNfYWxwaGE7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICBkZXN0X3NjYW4gKz0gMzsKKyAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgY29udGludWU7CisgICAgfQorICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7CisgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICBpZiAoYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEUpIHsKKyAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgICAgIHVpbnQ4X3Qgc3JjX3NjYW5bM107CisgICAgICBzcmNfc2NhblswXSA9IHNyY19iOworICAgICAgc3JjX3NjYW5bMV0gPSBzcmNfZzsKKyAgICAgIHNyY19zY2FuWzJdID0gc3JjX3I7CisgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKKyAgICAgICpkZXN0X3NjYW4gPQorICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzBdLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPQorICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzFdLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPQorICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzJdLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICB9IGVsc2UgaWYgKGJsZW5kX3R5cGUpIHsKKyAgICAgIGludCBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19iKTsKKyAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfYiwgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19nKTsKKyAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfZywgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19yKTsKKyAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfciwgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgfSBlbHNlIHsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICB9CisgIH0KK30KK3ZvaWQgX0NvbXBvc2l0ZVJvd19CeXRlTWFzazJSZ2IodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBpbnQgc3JjX2FscGhhOworICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuW2NvbF0gLyAyNTUgLyAyNTU7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBzcmNfc2Nhbltjb2xdIC8gMjU1OworICAgIH0KKyAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgIGRlc3Rfc2NhbiArPSBCcHA7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFKSB7CisgICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107CisgICAgICB1aW50OF90IHNyY19zY2FuWzNdOworICAgICAgc3JjX3NjYW5bMF0gPSBzcmNfYjsKKyAgICAgIHNyY19zY2FuWzFdID0gc3JjX2c7CisgICAgICBzcmNfc2NhblsyXSA9IHNyY19yOworICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMF0sIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1sxXSwgc3JjX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzJdLCBzcmNfYWxwaGEpOworICAgIH0gZWxzZSBpZiAoYmxlbmRfdHlwZSkgeworICAgICAgaW50IGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2IpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2cpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX3IpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIHNyY19hbHBoYSk7CisgICAgfSBlbHNlIHsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgc3JjX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX3IsIHNyY19hbHBoYSk7CisgICAgfQorICAgIGRlc3Rfc2NhbiArPSBCcHAgLSAyOworICB9Cit9Cit2b2lkIF9Db21wb3NpdGVSb3dfQnl0ZU1hc2syTWFzayh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgIGludCBzcmNfYWxwaGE7CisgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdICogc3JjX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIHNyY19zY2FuW2NvbF0gLyAyNTU7CisgICAgfQorICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkZXN0X3NjYW47CisgICAgaWYgKCFiYWNrX2FscGhhKSB7CisgICAgICAqZGVzdF9zY2FuID0gc3JjX2FscGhhOworICAgIH0gZWxzZSBpZiAoc3JjX2FscGhhKSB7CisgICAgICAqZGVzdF9zY2FuID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgfQorICAgIGRlc3Rfc2NhbisrOworICB9Cit9Cit2b2lkIF9Db21wb3NpdGVSb3dfQnl0ZU1hc2syR3JheSh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19ncmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgIGludCBzcmNfYWxwaGE7CisgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdICogc3JjX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIHNyY19zY2FuW2NvbF0gLyAyNTU7CisgICAgfQorICAgIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZ3JheSwgc3JjX2FscGhhKTsKKyAgICB9CisgICAgZGVzdF9zY2FuKys7CisgIH0KK30KK3ZvaWQgX0NvbXBvc2l0ZVJvd19CeXRlTWFzazJHcmF5YSh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19ncmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuKSB7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgIGludCBzcmNfYWxwaGE7CisgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdICogc3JjX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIHNyY19zY2FuW2NvbF0gLyAyNTU7CisgICAgfQorICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47CisgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2dyYXk7CisgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBzcmNfYWxwaGE7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgY29udGludWU7CisgICAgfQorICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7CisgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2dyYXksIGFscGhhX3JhdGlvKTsKKyAgICBkZXN0X3NjYW4rKzsKKyAgfQorfQordm9pZCBfQ29tcG9zaXRlUm93X0JpdE1hc2syQXJnYih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza19hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgaWYgKGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTk9STUFMICYmICFjbGlwX3NjYW4gJiYgbWFza19hbHBoYSA9PSAyNTUpIHsKKyAgICBGWF9BUkdCIGFyZ2IgPSBGWEFSR0JfTUFLRSgweGZmLCBzcmNfciwgc3JjX2csIHNyY19iKTsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgIGlmIChzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpIHsKKyAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIGFyZ2IpOworICAgICAgfQorICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBpZiAoIShzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpKSB7CisgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgc3JjX2FscGhhOworICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYTsKKyAgICB9CisgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShzcmNfYWxwaGEsIHNyY19yLCBzcmNfZywgc3JjX2IpKTsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgY29udGludWU7CisgICAgfQorICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICBpZiAoYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEUpIHsKKyAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgICAgIHVpbnQ4X3Qgc3JjX3NjYW5bM107CisgICAgICBzcmNfc2NhblswXSA9IHNyY19iOworICAgICAgc3JjX3NjYW5bMV0gPSBzcmNfZzsKKyAgICAgIHNyY19zY2FuWzJdID0gc3JjX3I7CisgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKKyAgICAgICpkZXN0X3NjYW4gPQorICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzBdLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPQorICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzFdLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPQorICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzJdLCBhbHBoYV9yYXRpbyk7CisgICAgfSBlbHNlIGlmIChibGVuZF90eXBlKSB7CisgICAgICBpbnQgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfYik7CisgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfZyk7CisgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2csIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfcik7CisgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX3IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICB9IGVsc2UgeworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX3IsIGFscGhhX3JhdGlvKTsKKyAgICB9CisgICAgZGVzdF9zY2FuICs9IDI7CisgIH0KK30KK3ZvaWQgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMlJnYmEodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4pIHsKKyAgaWYgKGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTk9STUFMICYmICFjbGlwX3NjYW4gJiYgbWFza19hbHBoYSA9PSAyNTUpIHsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgIGlmIChzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpIHsKKyAgICAgICAgZGVzdF9zY2FuWzBdID0gc3JjX2I7CisgICAgICAgIGRlc3Rfc2NhblsxXSA9IHNyY19nOworICAgICAgICBkZXN0X3NjYW5bMl0gPSBzcmNfcjsKKyAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiA9IG1hc2tfYWxwaGE7CisgICAgICB9CisgICAgICBkZXN0X3NjYW4gKz0gMzsKKyAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgaWYgKCEoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSkgeworICAgICAgZGVzdF9zY2FuICs9IDM7CisgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgc3JjX2FscGhhOworICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYTsKKyAgICB9CisgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19iOworICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2c7CisgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfcjsKKyAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IG1hc2tfYWxwaGE7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKKyAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgIGlmIChibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSkgeworICAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOworICAgICAgdWludDhfdCBzcmNfc2NhblszXTsKKyAgICAgIHNyY19zY2FuWzBdID0gc3JjX2I7CisgICAgICBzcmNfc2NhblsxXSA9IHNyY19nOworICAgICAgc3JjX3NjYW5bMl0gPSBzcmNfcjsKKyAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOworICAgICAgKmRlc3Rfc2NhbiA9CisgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMF0sIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9CisgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMV0sIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9CisgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMl0sIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgIH0gZWxzZSBpZiAoYmxlbmRfdHlwZSkgeworICAgICAgaW50IGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2IpOworICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19iLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2cpOworICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19nLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX3IpOworICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICB9IGVsc2UgeworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX3IsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgIH0KKyAgfQorfQordm9pZCBfQ29tcG9zaXRlUm93X0JpdE1hc2syUmdiKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza19hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7CisgIGlmIChibGVuZF90eXBlID09IEZYRElCX0JMRU5EX05PUk1BTCAmJiAhY2xpcF9zY2FuICYmIG1hc2tfYWxwaGEgPT0gMjU1KSB7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICBpZiAoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSB7CisgICAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19yOworICAgICAgICBkZXN0X3NjYW5bMV0gPSBzcmNfZzsKKyAgICAgICAgZGVzdF9zY2FuWzBdID0gc3JjX2I7CisgICAgICB9CisgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgaWYgKCEoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSkgeworICAgICAgZGVzdF9zY2FuICs9IEJwcDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgc3JjX2FscGhhOworICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYTsKKyAgICB9CisgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSkgeworICAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOworICAgICAgdWludDhfdCBzcmNfc2NhblszXTsKKyAgICAgIHNyY19zY2FuWzBdID0gc3JjX2I7CisgICAgICBzcmNfc2NhblsxXSA9IHNyY19nOworICAgICAgc3JjX3NjYW5bMl0gPSBzcmNfcjsKKyAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzBdLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMV0sIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1syXSwgc3JjX2FscGhhKTsKKyAgICB9IGVsc2UgaWYgKGJsZW5kX3R5cGUpIHsKKyAgICAgIGludCBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19iKTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19nKTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19yKTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBzcmNfYWxwaGEpOworICAgIH0gZWxzZSB7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgc3JjX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBzcmNfYWxwaGEpOworICAgIH0KKyAgICBkZXN0X3NjYW4gKz0gQnBwIC0gMjsKKyAgfQorfQordm9pZCBfQ29tcG9zaXRlUm93X0JpdE1hc2syTWFzayh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza19hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBpZiAoIShzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpKSB7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgc3JjX2FscGhhOworICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYTsKKyAgICB9CisgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3Rfc2NhbjsKKyAgICBpZiAoIWJhY2tfYWxwaGEpIHsKKyAgICAgICpkZXN0X3NjYW4gPSBzcmNfYWxwaGE7CisgICAgfSBlbHNlIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgICpkZXN0X3NjYW4gPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICB9CisgICAgZGVzdF9zY2FuKys7CisgIH0KK30KK3ZvaWQgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMkdyYXkodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfZ3JheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBpZiAoIShzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpKSB7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgc3JjX2FscGhhOworICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYTsKKyAgICB9CisgICAgaWYgKHNyY19hbHBoYSkgeworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19ncmF5LCBzcmNfYWxwaGEpOworICAgIH0KKyAgICBkZXN0X3NjYW4rKzsKKyAgfQorfQordm9pZCBfQ29tcG9zaXRlUm93X0JpdE1hc2syR3JheWEodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza19hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfZ3JheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbikgeworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBpZiAoIShzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpKSB7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGludCBzcmNfYWxwaGE7CisgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgIH0gZWxzZSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhOworICAgIH0KKyAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOworICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19ncmF5OworICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gc3JjX2FscGhhOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19ncmF5LCBhbHBoYV9yYXRpbyk7CisgICAgZGVzdF9zY2FuKys7CisgIH0KK30KK3ZvaWQgX0NvbXBvc2l0ZVJvd19BcmdiMkFyZ2JfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgaW50IGJsZW5kZWRfY29sb3JzWzNdOworICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICB1aW50OF90IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CisgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2NhblszXSAvIDI1NTsKKyAgICAgICAgZGVzdF9zY2FuWzNdID0gc3JjX2FscGhhOwogICAgICAgICBkZXN0X3NjYW5bMF0gPSBzcmNfc2NhblsyXTsKLSAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOwotICAgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICAgICAgICBkZXN0X3NjYW5bMV0gPSBzcmNfc2NhblsxXTsKKyAgICAgICAgZGVzdF9zY2FuWzJdID0gc3JjX3NjYW5bMF07CisgICAgICB9IGVsc2UgeworICAgICAgICBGWEFSR0JfUkdCT1JERVJDT1BZKGRlc3Rfc2Nhbiwgc3JjX3NjYW4pOworICAgICAgfQorICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICBzcmNfc2NhbiArPSA0OworICAgICAgY29udGludWU7CiAgICAgfQotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9DbGlwX1JnYkJ5dGVPcmRlcihGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUENCWVRFIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBibGVuZF90eXBlLCBpbnQgc3JjX0JwcCwgRlhfTFBDQllURSBjbGlwX3NjYW4pCi17Ci0gICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7Ci0gICAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgIGludCBzcmNfYWxwaGEgPSAqY2xpcF9zY2FuICsrOwotICAgICAgICBGWF9CWVRFIGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107Ci0gICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BKCpzcmNfc2NhbisrKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BKCpzcmNfc2NhbisrKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BKCpzcmNfc2NhbisrKTsKLSAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfQllURSBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgICAgICAgIEZYX0JZVEUgZGVzdF9zY2FuX29bM107Ci0gICAgICAgICAgICBkZXN0X3NjYW5fb1swXSA9IGRlc3Rfc2NhblsyXTsKLSAgICAgICAgICAgIGRlc3Rfc2Nhbl9vWzFdID0gZGVzdF9zY2FuWzFdOwotICAgICAgICAgICAgZGVzdF9zY2FuX29bMl0gPSBkZXN0X3NjYW5bMF07Ci0gICAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW5fbywgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvciArKykgewotICAgICAgICAgICAgaW50IGluZGV4ID0gMiAtIGNvbG9yOwotICAgICAgICAgICAgaW50IHNyY19jb2xvciA9IEZYX0dBTU1BKCpzcmNfc2Nhbik7Ci0gICAgICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZCA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIF9CTEVORChibGVuZF90eXBlLCBkZXN0X3NjYW5baW5kZXhdLCBzcmNfY29sb3IpOwotICAgICAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19jb2xvciwgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5baW5kZXhdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuW2luZGV4XSwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7Ci0gICAgfQotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX0NsaXBfUmdiQnl0ZU9yZGVyKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCB3aWR0aCwgaW50IGJsZW5kX3R5cGUsIGludCBkZXN0X0JwcCwgaW50IHNyY19CcHAsIEZYX0xQQ0JZVEUgY2xpcF9zY2FuKQotewotICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICAgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICBGWF9CWVRFIHNyY19hbHBoYSA9ICpjbGlwX3NjYW4gKys7Ci0gICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOwotICAgICAgICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgICAgICAgIEZYX0JZVEUgZGVzdF9zY2FuX29bM107Ci0gICAgICAgICAgICBkZXN0X3NjYW5fb1swXSA9IGRlc3Rfc2NhblsyXTsKLSAgICAgICAgICAgIGRlc3Rfc2Nhbl9vWzFdID0gZGVzdF9zY2FuWzFdOwotICAgICAgICAgICAgZGVzdF9zY2FuX29bMl0gPSBkZXN0X3NjYW5bMF07Ci0gICAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW5fbywgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvciArKykgewotICAgICAgICAgICAgaW50IGluZGV4ID0gMiAtIGNvbG9yOwotICAgICAgICAgICAgaW50IHNyY19jb2xvciA9IEZYX0dBTU1BKCpzcmNfc2Nhbik7Ci0gICAgICAgICAgICBpbnQgYmFja19jb2xvciA9IEZYX0dBTU1BKGRlc3Rfc2NhbltpbmRleF0pOwotICAgICAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0gOgotICAgICAgICAgICAgICAgICAgICAgICAgICBfQkxFTkQoYmxlbmRfdHlwZSwgYmFja19jb2xvciwgc3JjX2NvbG9yKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbltpbmRleF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKGJhY2tfY29sb3IsIGJsZW5kZWQsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgc3JjX3NjYW4gKys7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOwotICAgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOwotICAgIH0KLX0KLWlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9DbGlwX1JnYkJ5dGVPcmRlcihGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUENCWVRFIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBzcmNfQnBwLCBGWF9MUENCWVRFIGNsaXBfc2NhbikKLXsKLSAgICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOwotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOwotICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUEoKnNyY19zY2FuKyspOwotICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUEoKnNyY19zY2FuKyspOwotICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUEoKnNyY19zY2FuKyspOwotICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gMjU1OwotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICBzcmNfc2NhbiAgKz0gc3JjX2dhcDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107Ci0gICAgICAgIEZYX0JZVEUgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOwotICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IgKyspIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IDIgLSBjb2xvcjsKLSAgICAgICAgICAgIGRlc3Rfc2NhbltpbmRleF0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5baW5kZXhdLCBGWF9HQU1NQSgqc3JjX3NjYW4pLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKLSAgICB9Ci19Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9DbGlwX1JnYkJ5dGVPcmRlcihGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUENCWVRFIHNyY19zY2FuLCBpbnQgd2lkdGgsIGludCBkZXN0X0JwcCwgaW50IHNyY19CcHAsIEZYX0xQQ0JZVEUgY2xpcF9zY2FuKQotewotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOwotICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gc3JjX3NjYW5bMF07Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBzcmNfc2NhblsxXTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IHNyY19zY2FuWzJdOwotICAgICAgICB9IGVsc2UgaWYgKHNyY19hbHBoYSkgewotICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCBGWF9HQU1NQSgqc3JjX3NjYW4pLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBGWF9HQU1NQSgqc3JjX3NjYW4pLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBGWF9HQU1NQSgqc3JjX3NjYW4pLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKLSAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY19CcHAgLSAyOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOwotICAgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOwotICAgIH0KLX0KLWlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfOGJwcFJnYjJSZ2JfTm9CbGVuZF9SZ2JCeXRlT3JkZXIoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgRlhfQVJHQiogcFBhbGV0dGUsIGludCBwaXhlbF9jb3VudCwKLSAgICAgICAgaW50IERlc3RCcHAsIEZYX0xQQ0JZVEUgY2xpcF9zY2FuKQotewotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgRlhfQVJHQiBhcmdiID0gcFBhbGV0dGUgPyBwUGFsZXR0ZVsqc3JjX3NjYW5dIDogKCpzcmNfc2NhbikgKiAweDAxMDEwMTsKLSAgICAgICAgaW50IHNyY19yID0gRlhBUkdCX1IoYXJnYik7Ci0gICAgICAgIGludCBzcmNfZyA9IEZYQVJHQl9HKGFyZ2IpOwotICAgICAgICBpbnQgc3JjX2IgPSBGWEFSR0JfQihhcmdiKTsKLSAgICAgICAgaWYgKGNsaXBfc2NhbiAmJiBjbGlwX3NjYW5bY29sXSA8IDI1NSkgewotICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBzcmNfYiwgY2xpcF9zY2FuW2NvbF0pOwotICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBzcmNfZywgY2xpcF9zY2FuW2NvbF0pOwotICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBzcmNfciwgY2xpcF9zY2FuW2NvbF0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gc3JjX2I7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBzcmNfZzsKLSAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IHNyY19yOwotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArPSBEZXN0QnBwOwotICAgICAgICBzcmNfc2NhbiArKzsKLSAgICB9Ci19Ci1pbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93XzFicHBSZ2IyUmdiX05vQmxlbmRfUmdiQnl0ZU9yZGVyKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCBzcmNfbGVmdCwKLSAgICAgICAgRlhfQVJHQiogcFBhbGV0dGUsIGludCBwaXhlbF9jb3VudCwgaW50IERlc3RCcHAsIEZYX0xQQ0JZVEUgY2xpcF9zY2FuKQotewotICAgIGludCByZXNldF9yLCByZXNldF9nLCByZXNldF9iOwotICAgIGludCBzZXRfciwgc2V0X2csIHNldF9iOwotICAgIGlmIChwUGFsZXR0ZSkgewotICAgICAgICByZXNldF9yID0gRlhBUkdCX1IocFBhbGV0dGVbMF0pOwotICAgICAgICByZXNldF9nID0gRlhBUkdCX0cocFBhbGV0dGVbMF0pOwotICAgICAgICByZXNldF9iID0gRlhBUkdCX0IocFBhbGV0dGVbMF0pOwotICAgICAgICBzZXRfciA9IEZYQVJHQl9SKHBQYWxldHRlWzFdKTsKLSAgICAgICAgc2V0X2cgPSBGWEFSR0JfRyhwUGFsZXR0ZVsxXSk7Ci0gICAgICAgIHNldF9iID0gRlhBUkdCX0IocFBhbGV0dGVbMV0pOworICAgIHVpbnQ4X3Qgc3JjX2FscGhhOworICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX3NjYW5bM10gLyAyNTU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzZXRfciA9IHJlc2V0X2cgPSByZXNldF9iID0gMDsKLSAgICAgICAgc2V0X3IgPSBzZXRfZyA9IHNldF9iID0gMjU1OworICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107CiAgICAgfQotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgaW50IHNyY19yLCBzcmNfZywgc3JjX2I7Ci0gICAgICAgIGlmIChzcmNfc2NhblsoY29sICsgc3JjX2xlZnQpIC8gOF0gJiAoMSA8PCAoNyAtIChjb2wgKyBzcmNfbGVmdCkgJSA4KSkpIHsKLSAgICAgICAgICAgIHNyY19yID0gc2V0X3I7Ci0gICAgICAgICAgICBzcmNfZyA9IHNldF9nOwotICAgICAgICAgICAgc3JjX2IgPSBzZXRfYjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNyY19yID0gcmVzZXRfcjsKLSAgICAgICAgICAgIHNyY19nID0gcmVzZXRfZzsKLSAgICAgICAgICAgIHNyY19iID0gcmVzZXRfYjsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2xpcF9zY2FuICYmIGNsaXBfc2Nhbltjb2xdIDwgMjU1KSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIHNyY19iLCBjbGlwX3NjYW5bY29sXSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIHNyY19nLCBjbGlwX3NjYW5bY29sXSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIHNyY19yLCBjbGlwX3NjYW5bY29sXSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBzcmNfYjsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IHNyY19nOwotICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gc3JjX3I7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICs9IERlc3RCcHA7Ci0gICAgfQotfQotaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd184YnBwUmdiMkFyZ2JfTm9CbGVuZF9SZ2JCeXRlT3JkZXIoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgaW50IHdpZHRoLAotICAgICAgICBGWF9BUkdCKiBwUGFsZXR0ZSwgRlhfTFBDQllURSBjbGlwX3NjYW4pCi17Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICBpbnQgc3JjX3IsIHNyY19nLCBzcmNfYjsKLSAgICAgICAgaWYgKHBQYWxldHRlKSB7Ci0gICAgICAgICAgICBGWF9BUkdCIGFyZ2IgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOwotICAgICAgICAgICAgc3JjX3IgPSBGWEFSR0JfUihhcmdiKTsKLSAgICAgICAgICAgIHNyY19nID0gRlhBUkdCX0coYXJnYik7Ci0gICAgICAgICAgICBzcmNfYiA9IEZYQVJHQl9CKGFyZ2IpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjX3IgPSBzcmNfZyA9IHNyY19iID0gKnNyY19zY2FuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjbGlwX3NjYW4gPT0gTlVMTCB8fCBjbGlwX3NjYW5bY29sXSA9PSAyNTUpIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BKHNyY19iKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BKHNyY19nKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BKHNyY19yKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IDI1NTsKLSAgICAgICAgICAgIHNyY19zY2FuICsrOwotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07Ci0gICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOwotICAgICAgICBGWF9CWVRFIGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBGWF9HQU1NQShzcmNfYiksIGFscGhhX3JhdGlvKTsKLSAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBGWF9HQU1NQShzcmNfZyksIGFscGhhX3JhdGlvKTsKLSAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBGWF9HQU1NQShzcmNfciksIGFscGhhX3JhdGlvKTsKLSAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgIHNyY19zY2FuICsrOwotICAgIH0KLX0KLWlubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfMWJwcFJnYjJBcmdiX05vQmxlbmRfUmdiQnl0ZU9yZGVyKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCBzcmNfbGVmdCwgaW50IHdpZHRoLAotICAgICAgICBGWF9BUkdCKiBwUGFsZXR0ZSwgRlhfTFBDQllURSBjbGlwX3NjYW4pCi17Ci0gICAgaW50IHJlc2V0X3IsIHJlc2V0X2csIHJlc2V0X2I7Ci0gICAgaW50IHNldF9yLCBzZXRfZywgc2V0X2I7Ci0gICAgaWYgKHBQYWxldHRlKSB7Ci0gICAgICAgIHJlc2V0X3IgPSBGWEFSR0JfUihwUGFsZXR0ZVswXSk7Ci0gICAgICAgIHJlc2V0X2cgPSBGWEFSR0JfRyhwUGFsZXR0ZVswXSk7Ci0gICAgICAgIHJlc2V0X2IgPSBGWEFSR0JfQihwUGFsZXR0ZVswXSk7Ci0gICAgICAgIHNldF9yID0gRlhBUkdCX1IocFBhbGV0dGVbMV0pOwotICAgICAgICBzZXRfZyA9IEZYQVJHQl9HKHBQYWxldHRlWzFdKTsKLSAgICAgICAgc2V0X2IgPSBGWEFSR0JfQihwUGFsZXR0ZVsxXSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVzZXRfciA9IHJlc2V0X2cgPSByZXNldF9iID0gMDsKLSAgICAgICAgc2V0X3IgPSBzZXRfZyA9IHNldF9iID0gMjU1OwotICAgIH0KLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgIGludCBzcmNfciwgc3JjX2csIHNyY19iOwotICAgICAgICBpZiAoc3JjX3NjYW5bKGNvbCArIHNyY19sZWZ0KSAvIDhdICYgKDEgPDwgKDcgLSAoY29sICsgc3JjX2xlZnQpICUgOCkpKSB7Ci0gICAgICAgICAgICBzcmNfciA9IHNldF9yOwotICAgICAgICAgICAgc3JjX2cgPSBzZXRfZzsKLSAgICAgICAgICAgIHNyY19iID0gc2V0X2I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfciA9IHJlc2V0X3I7Ci0gICAgICAgICAgICBzcmNfZyA9IHJlc2V0X2c7Ci0gICAgICAgICAgICBzcmNfYiA9IHJlc2V0X2I7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNsaXBfc2NhbiA9PSBOVUxMIHx8IGNsaXBfc2Nhbltjb2xdID09IDI1NSkgewotICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUEoc3JjX2IpOwotICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUEoc3JjX2cpOwotICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUEoc3JjX3IpOwotICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gMjU1OwotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07Ci0gICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICAgICAgRlhfQllURSBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgRlhfR0FNTUEoc3JjX2IpLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgRlhfR0FNTUEoc3JjX2cpLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgIGRlc3Rfc2NhblswXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgRlhfR0FNTUEoc3JjX3IpLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgIH0KLX0KLXZvaWQgX0NvbXBvc2l0ZVJvd19CeXRlTWFzazJBcmdiX1JnYkJ5dGVPcmRlcihGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUENCWVRFIHNyY19zY2FuLCBpbnQgbWFza19hbHBoYSwgaW50IHNyY19yLCBpbnQgc3JjX2csIGludCBzcmNfYiwgaW50IHBpeGVsX2NvdW50LAotICAgICAgICBpbnQgYmxlbmRfdHlwZSwgRlhfTFBDQllURSBjbGlwX3NjYW4pCi17Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCArKykgewotICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIHNyY19zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfQllURSBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOwotICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICBGWEFSR0JfU0VUUkdCT1JERVJESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShzcmNfYWxwaGEsIHNyY19yLCBzcmNfZywgc3JjX2IpKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEZYX0JZVEUgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOwotICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICBpZiAoYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEUpIHsKLSAgICAgICAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICAgICAgICAgIEZYX0JZVEUgc3JjX3NjYW5bM107Ci0gICAgICAgICAgICBGWF9CWVRFIGRlc3Rfc2Nhbl9vWzNdOwotICAgICAgICAgICAgc3JjX3NjYW5bMF0gPSBzcmNfYjsKLSAgICAgICAgICAgIHNyY19zY2FuWzFdID0gc3JjX2c7Ci0gICAgICAgICAgICBzcmNfc2NhblsyXSA9IHNyY19yOwotICAgICAgICAgICAgZGVzdF9zY2FuX29bMF0gPSBkZXN0X3NjYW5bMl07Ci0gICAgICAgICAgICBkZXN0X3NjYW5fb1sxXSA9IGRlc3Rfc2NhblsxXTsKLSAgICAgICAgICAgIGRlc3Rfc2Nhbl9vWzJdID0gZGVzdF9zY2FuWzBdOwotICAgICAgICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuX28sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgYmxlbmRlZF9jb2xvcnNbMF0sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgYmxlbmRlZF9jb2xvcnNbMV0sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgYmxlbmRlZF9jb2xvcnNbMl0sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgfSBlbHNlIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgICAgICBpbnQgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCBkZXN0X3NjYW5bMl0sIHNyY19iKTsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfYiwgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgZGVzdF9zY2FuWzFdLCBzcmNfZyk7Ci0gICAgICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2csIGJsZW5kZWQsIGJhY2tfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsIGRlc3Rfc2NhblswXSwgc3JjX3IpOwotICAgICAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBzcmNfYiwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBzcmNfZywgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBzcmNfciwgYWxwaGFfcmF0aW8pOwotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgIH0KLX0KLXZvaWQgX0NvbXBvc2l0ZVJvd19CeXRlTWFzazJSZ2JfUmdiQnl0ZU9yZGVyKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCBtYXNrX2FscGhhLCBpbnQgc3JjX3IsIGludCBzcmNfZywgaW50IHNyY19iLCBpbnQgcGl4ZWxfY291bnQsCi0gICAgICAgIGludCBibGVuZF90eXBlLCBpbnQgQnBwLCBGWF9MUENCWVRFIGNsaXBfc2NhbikKLXsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgIGludCBzcmNfYWxwaGE7Ci0gICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuW2NvbF0gLyAyNTUgLyAyNTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogc3JjX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEUpIHsKLSAgICAgICAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICAgICAgICAgIEZYX0JZVEUgc3JjX3NjYW5bM107Ci0gICAgICAgICAgICBGWF9CWVRFIGRlc3Rfc2Nhbl9vWzNdOwotICAgICAgICAgICAgc3JjX3NjYW5bMF0gPSBzcmNfYjsKLSAgICAgICAgICAgIHNyY19zY2FuWzFdID0gc3JjX2c7Ci0gICAgICAgICAgICBzcmNfc2NhblsyXSA9IHNyY19yOwotICAgICAgICAgICAgZGVzdF9zY2FuX29bMF0gPSBkZXN0X3NjYW5bMl07Ci0gICAgICAgICAgICBkZXN0X3NjYW5fb1sxXSA9IGRlc3Rfc2NhblsxXTsKLSAgICAgICAgICAgIGRlc3Rfc2Nhbl9vWzJdID0gZGVzdF9zY2FuWzBdOwotICAgICAgICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuX28sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgYmxlbmRlZF9jb2xvcnNbMF0sIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIGJsZW5kZWRfY29sb3JzWzFdLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBibGVuZGVkX2NvbG9yc1syXSwgc3JjX2FscGhhKTsKLSAgICAgICAgfSBlbHNlIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgICAgICBpbnQgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCBkZXN0X3NjYW5bMl0sIHNyY19iKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgYmxlbmRlZCwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgZGVzdF9zY2FuWzFdLCBzcmNfZyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIGJsZW5kZWQsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsIGRlc3Rfc2NhblswXSwgc3JjX3IpOwotICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBibGVuZGVkLCBzcmNfYWxwaGEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBzcmNfYiwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgc3JjX2csIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIHNyY19yLCBzcmNfYWxwaGEpOwotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgfQotfQotdm9pZCBfQ29tcG9zaXRlUm93X0JpdE1hc2syQXJnYl9SZ2JCeXRlT3JkZXIoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgaW50IG1hc2tfYWxwaGEsIGludCBzcmNfciwgaW50IHNyY19nLCBpbnQgc3JjX2IsCi0gICAgICAgIGludCBzcmNfbGVmdCwgaW50IHBpeGVsX2NvdW50LCBpbnQgYmxlbmRfdHlwZSwgRlhfTFBDQllURSBjbGlwX3NjYW4pCi17Ci0gICAgaWYgKGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTk9STUFMICYmIGNsaXBfc2NhbiA9PSBOVUxMICYmIG1hc2tfYWxwaGEgPT0gMjU1KSB7Ci0gICAgICAgIEZYX0FSR0IgYXJnYiA9IEZYQVJHQl9NQUtFKDB4ZmYsIHNyY19yLCBzcmNfZywgc3JjX2IpOwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgICAgICBpZiAoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSB7Ci0gICAgICAgICAgICAgICAgRlhBUkdCX1NFVFJHQk9SREVSRElCKGRlc3Rfc2NhbiwgYXJnYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgaWYgKCEoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSkgewotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhOwotICAgICAgICB9Ci0gICAgICAgIEZYX0JZVEUgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgRlhBUkdCX1NFVFJHQk9SREVSRElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0Uoc3JjX2FscGhhLCBzcmNfciwgc3JjX2csIHNyY19iKSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEZYX0JZVEUgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOwotICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICBpZiAoYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEUpIHsKLSAgICAgICAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICAgICAgICAgIEZYX0JZVEUgc3JjX3NjYW5bM107Ci0gICAgICAgICAgICBGWF9CWVRFIGRlc3Rfc2Nhbl9vWzNdOwotICAgICAgICAgICAgc3JjX3NjYW5bMF0gPSBzcmNfYjsKLSAgICAgICAgICAgIHNyY19zY2FuWzFdID0gc3JjX2c7Ci0gICAgICAgICAgICBzcmNfc2NhblsyXSA9IHNyY19yOwotICAgICAgICAgICAgZGVzdF9zY2FuX29bMF0gPSBkZXN0X3NjYW5bMl07Ci0gICAgICAgICAgICBkZXN0X3NjYW5fb1sxXSA9IGRlc3Rfc2NhblsxXTsKLSAgICAgICAgICAgIGRlc3Rfc2Nhbl9vWzJdID0gZGVzdF9zY2FuWzBdOwotICAgICAgICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuX28sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgYmxlbmRlZF9jb2xvcnNbMF0sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgYmxlbmRlZF9jb2xvcnNbMV0sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgYmxlbmRlZF9jb2xvcnNbMl0sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgfSBlbHNlIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgICAgICBpbnQgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCBkZXN0X3NjYW5bMl0sIHNyY19iKTsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfYiwgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgZGVzdF9zY2FuWzFdLCBzcmNfZyk7Ci0gICAgICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2csIGJsZW5kZWQsIGJhY2tfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsIGRlc3Rfc2NhblswXSwgc3JjX3IpOwotICAgICAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBzcmNfYiwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBzcmNfZywgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBzcmNfciwgYWxwaGFfcmF0aW8pOwotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgIH0KLX0KLXZvaWQgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMlJnYl9SZ2JCeXRlT3JkZXIoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgaW50IG1hc2tfYWxwaGEsIGludCBzcmNfciwgaW50IHNyY19nLCBpbnQgc3JjX2IsCi0gICAgICAgIGludCBzcmNfbGVmdCwgaW50IHBpeGVsX2NvdW50LCBpbnQgYmxlbmRfdHlwZSwgaW50IEJwcCwgRlhfTFBDQllURSBjbGlwX3NjYW4pCi17Ci0gICAgaWYgKGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTk9STUFMICYmIGNsaXBfc2NhbiA9PSBOVUxMICYmIG1hc2tfYWxwaGEgPT0gMjU1KSB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wgKyspIHsKLSAgICAgICAgICAgIGlmIChzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpIHsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBzcmNfYjsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBzcmNfZzsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBzcmNfcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sICsrKSB7Ci0gICAgICAgIGlmICghKHNyY19zY2FuWyhzcmNfbGVmdCArIGNvbCkgLyA4XSAmICgxIDw8ICg3IC0gKHNyY19sZWZ0ICsgY29sKSAlIDgpKSkpIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSkgewotICAgICAgICAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgICAgICAgICAgRlhfQllURSBzcmNfc2NhblszXTsKLSAgICAgICAgICAgIEZYX0JZVEUgZGVzdF9zY2FuX29bM107Ci0gICAgICAgICAgICBzcmNfc2NhblswXSA9IHNyY19iOwotICAgICAgICAgICAgc3JjX3NjYW5bMV0gPSBzcmNfZzsKLSAgICAgICAgICAgIHNyY19zY2FuWzJdID0gc3JjX3I7Ci0gICAgICAgICAgICBkZXN0X3NjYW5fb1swXSA9IGRlc3Rfc2NhblsyXTsKLSAgICAgICAgICAgIGRlc3Rfc2Nhbl9vWzFdID0gZGVzdF9zY2FuWzFdOwotICAgICAgICAgICAgZGVzdF9zY2FuX29bMl0gPSBkZXN0X3NjYW5bMF07Ci0gICAgICAgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW5fbywgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBibGVuZGVkX2NvbG9yc1swXSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgYmxlbmRlZF9jb2xvcnNbMV0sIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIGJsZW5kZWRfY29sb3JzWzJdLCBzcmNfYWxwaGEpOwotICAgICAgICB9IGVsc2UgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgICAgIGludCBiYWNrX2NvbG9yID0gRlhfR0FNTUEoZGVzdF9zY2FuWzJdKTsKLSAgICAgICAgICAgIGludCBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsIGJhY2tfY29sb3IsIHNyY19iKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoYmFja19jb2xvciwgYmxlbmRlZCwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICBiYWNrX2NvbG9yID0gRlhfR0FNTUEoZGVzdF9zY2FuWzFdKTsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgYmFja19jb2xvciwgc3JjX2cpOwotICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShiYWNrX2NvbG9yLCBibGVuZGVkLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgIGJhY2tfY29sb3IgPSBGWF9HQU1NQShkZXN0X3NjYW5bMF0pOwotICAgICAgICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCBiYWNrX2NvbG9yLCBzcmNfcik7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKGJhY2tfY29sb3IsIGJsZW5kZWQsIHNyY19hbHBoYSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCBzcmNfYiwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIHNyY19nLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgc3JjX3IsIHNyY19hbHBoYSkpOwotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgfQotfQotaW5saW5lIEZYX0JPT0wgX1NjYW5saW5lQ29tcG9zaXRvcl9Jbml0U291cmNlTWFzayhGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsIGludCBhbHBoYV9mbGFnLCBGWF9EV09SRCBtYXNrX2NvbG9yLCBpbnQmIG1hc2tfYWxwaGEsCi0gICAgICAgIGludCYgbWFza19yZWQsIGludCYgbWFza19ncmVlbiwgaW50JiBtYXNrX2JsdWUsIGludCYgbWFza19ibGFjaywKLSAgICAgICAgdm9pZCogaWNjX21vZHVsZSwgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gKElDb2RlY19JY2NNb2R1bGUqKWljY19tb2R1bGU7Ci0gICAgaWYgKGFscGhhX2ZsYWcgPj4gOCkgewotICAgICAgICBtYXNrX2FscGhhID0gYWxwaGFfZmxhZyAmIDB4ZmY7Ci0gICAgICAgIG1hc2tfcmVkID0gRlhTWVNfR2V0Q1ZhbHVlKG1hc2tfY29sb3IpOwotICAgICAgICBtYXNrX2dyZWVuID0gRlhTWVNfR2V0TVZhbHVlKG1hc2tfY29sb3IpOwotICAgICAgICBtYXNrX2JsdWUgPSBGWFNZU19HZXRZVmFsdWUobWFza19jb2xvcik7Ci0gICAgICAgIG1hc2tfYmxhY2sgPSBGWFNZU19HZXRLVmFsdWUobWFza19jb2xvcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbWFza19hbHBoYSA9IEZYQVJHQl9BKG1hc2tfY29sb3IpOwotICAgICAgICBtYXNrX3JlZCA9IEZYQVJHQl9SKG1hc2tfY29sb3IpOwotICAgICAgICBtYXNrX2dyZWVuID0gRlhBUkdCX0cobWFza19jb2xvcik7Ci0gICAgICAgIG1hc2tfYmx1ZSA9IEZYQVJHQl9CKG1hc2tfY29sb3IpOwotICAgIH0KLSAgICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfOGJwcE1hc2spIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmICgoZGVzdF9mb3JtYXQgJiAweGZmKSA9PSA4KSB7Ci0gICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgICBtYXNrX2NvbG9yID0gKGFscGhhX2ZsYWcgPj4gOCkgPyBGWENNWUtfVE9ESUIobWFza19jb2xvcikgOiBGWEFSR0JfVE9ESUIobWFza19jb2xvcik7Ci0gICAgICAgICAgICBGWF9MUEJZVEUgZ3JheV9wID0gKEZYX0xQQllURSkmbWFza19jb2xvcjsKLSAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGdyYXlfcCwgZ3JheV9wLCAxKTsKLSAgICAgICAgICAgIG1hc2tfcmVkID0gZGVzdF9mb3JtYXQgJiAweDA0MDAgPyBGWF9DQ09MT1IoZ3JheV9wWzBdKSA6IGdyYXlfcFswXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChhbHBoYV9mbGFnID4+IDgpIHsKLSAgICAgICAgICAgICAgICBGWF9CWVRFIHIsIGcsIGI7Ci0gICAgICAgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKG1hc2tfcmVkLCBtYXNrX2dyZWVuLCBtYXNrX2JsdWUsIG1hc2tfYmxhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIGcsIGIpOwotICAgICAgICAgICAgICAgIG1hc2tfcmVkID0gRlhSR0IyR1JBWShyLCBnLCBiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWFza19yZWQgPSBGWFJHQjJHUkFZKG1hc2tfcmVkLCBtYXNrX2dyZWVuLCBtYXNrX2JsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRlc3RfZm9ybWF0ICYgMHgwNDAwKSB7Ci0gICAgICAgICAgICAgICAgbWFza19yZWQgPSBGWF9DQ09MT1IobWFza19yZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRlhfTFBCWVRFIG1hc2tfY29sb3JfcCA9IChGWF9MUEJZVEUpJm1hc2tfY29sb3I7Ci0gICAgICAgIG1hc2tfY29sb3IgPSAoYWxwaGFfZmxhZyA+PiA4KSA/IEZYQ01ZS19UT0RJQihtYXNrX2NvbG9yKSA6IEZYQVJHQl9UT0RJQihtYXNrX2NvbG9yKTsKLSAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIG1hc2tfY29sb3JfcCwgbWFza19jb2xvcl9wLCAxKTsKLSAgICAgICAgICAgIG1hc2tfcmVkID0gbWFza19jb2xvcl9wWzJdOwotICAgICAgICAgICAgbWFza19ncmVlbiA9IG1hc2tfY29sb3JfcFsxXTsKLSAgICAgICAgICAgIG1hc2tfYmx1ZSA9IG1hc2tfY29sb3JfcFswXTsKLSAgICAgICAgfSBlbHNlIGlmIChhbHBoYV9mbGFnID4+IDgpIHsKLSAgICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShtYXNrX2NvbG9yX3BbMF0sIG1hc2tfY29sb3JfcFsxXSwgbWFza19jb2xvcl9wWzJdLCBtYXNrX2NvbG9yX3BbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza19jb2xvcl9wWzJdLCBtYXNrX2NvbG9yX3BbMV0sIG1hc2tfY29sb3JfcFswXSk7Ci0gICAgICAgICAgICBtYXNrX3JlZCA9IG1hc2tfY29sb3JfcFsyXTsKLSAgICAgICAgICAgIG1hc2tfZ3JlZW4gPSBtYXNrX2NvbG9yX3BbMV07Ci0gICAgICAgICAgICBtYXNrX2JsdWUgPSBtYXNrX2NvbG9yX3BbMF07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1pbmxpbmUgdm9pZCBfU2NhbmxpbmVDb21wb3NpdG9yX0luaXRTb3VyY2VQYWxldHRlKEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LCBGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsCi0gICAgICAgIEZYX0RXT1JEKiYgcERlc3RQYWxldHRlLCBGWF9EV09SRCogcFNyY1BhbGV0dGUsCi0gICAgICAgIHZvaWQqIGljY19tb2R1bGUsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IChJQ29kZWNfSWNjTW9kdWxlKilpY2NfbW9kdWxlOwotICAgIEZYX0JPT0wgaXNTcmNDbXlrID0gc3JjX2Zvcm1hdCAmIDB4MDQwMCA/IFRSVUUgOiBGQUxTRTsKLSAgICBGWF9CT09MIGlzRHN0Q215ayA9IGRlc3RfZm9ybWF0ICYgMHgwNDAwID8gVFJVRSA6IEZBTFNFOwotICAgIHBEZXN0UGFsZXR0ZSA9IE5VTEw7Ci0gICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgaWYgKHBTcmNQYWxldHRlKSB7Ci0gICAgICAgICAgICBpZiAoKGRlc3RfZm9ybWF0ICYgMHhmZikgPT0gOCkgewotICAgICAgICAgICAgICAgIGludCBwYWxfY291bnQgPSAxIDw8IChzcmNfZm9ybWF0ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgRlhfTFBCWVRFIGdyYXlfcGFsID0gRlhfQWxsb2MoRlhfQllURSwgcGFsX2NvdW50KTsKLSAgICAgICAgICAgICAgICBwRGVzdFBhbGV0dGUgPSAoRlhfRFdPUkQqKWdyYXlfcGFsOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsX2NvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yID0gaXNTcmNDbXlrID8gRlhDTVlLX1RPRElCKHBTcmNQYWxldHRlW2ldKSA6IEZYQVJHQl9UT0RJQihwU3JjUGFsZXR0ZVtpXSk7Ci0gICAgICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGdyYXlfcGFsLCAoRlhfTFBDQllURSkmY29sb3IsIDEpOwotICAgICAgICAgICAgICAgICAgICBncmF5X3BhbCArKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCBwYWxzaXplID0gMSA8PCAoc3JjX2Zvcm1hdCAmIDB4ZmYpOwotICAgICAgICAgICAgICAgIHBEZXN0UGFsZXR0ZSA9IEZYX0FsbG9jKEZYX0RXT1JELCBwYWxzaXplKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhbHNpemU7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IgPSBpc1NyY0NteWsgPyBGWENNWUtfVE9ESUIocFNyY1BhbGV0dGVbaV0pIDogRlhBUkdCX1RPRElCKHBTcmNQYWxldHRlW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKEZYX0xQQllURSkmY29sb3IsIChGWF9MUENCWVRFKSZjb2xvciwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIHBEZXN0UGFsZXR0ZVtpXSA9IGlzRHN0Q215ayA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBwYWxfY291bnQgPSAxIDw8IChzcmNfZm9ybWF0ICYgMHhmZik7Ci0gICAgICAgICAgICBGWF9MUEJZVEUgZ3JheV9wYWwgPSBGWF9BbGxvYyhGWF9CWVRFLCBwYWxfY291bnQpOwotICAgICAgICAgICAgaWYgKHBhbF9jb3VudCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgZ3JheV9wYWxbMF0gPSAwOwotICAgICAgICAgICAgICAgIGdyYXlfcGFsWzFdID0gMjU1OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhbF9jb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdyYXlfcGFsW2ldID0gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGRlc3RfZm9ybWF0ICYgMHhmZikgPT0gOCkgewotICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGdyYXlfcGFsLCBncmF5X3BhbCwgcGFsX2NvdW50KTsKLSAgICAgICAgICAgICAgICBwRGVzdFBhbGV0dGUgPSAoRlhfRFdPUkQqKWdyYXlfcGFsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwRGVzdFBhbGV0dGUgPSBGWF9BbGxvYyhGWF9EV09SRCwgcGFsX2NvdW50KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhbF9jb3VudDsgaSArKykgewotICAgICAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAoRlhfTFBCWVRFKSZwRGVzdFBhbGV0dGVbaV0sICZncmF5X3BhbFtpXSwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIHBEZXN0UGFsZXR0ZVtpXSA9IGlzRHN0Q215ayA/IEZYQ01ZS19UT0RJQihwRGVzdFBhbGV0dGVbaV0pIDogRlhBUkdCX1RPRElCKHBEZXN0UGFsZXR0ZVtpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZYX0ZyZWUoZ3JheV9wYWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHBTcmNQYWxldHRlKSB7Ci0gICAgICAgICAgICBpZiAoKGRlc3RfZm9ybWF0ICYgMHhmZikgPT0gOCkgewotICAgICAgICAgICAgICAgIGludCBwYWxfY291bnQgPSAxIDw8IChzcmNfZm9ybWF0ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgRlhfTFBCWVRFIGdyYXlfcGFsID0gRlhfQWxsb2MoRlhfQllURSwgcGFsX2NvdW50KTsKLSAgICAgICAgICAgICAgICBwRGVzdFBhbGV0dGUgPSAoRlhfRFdPUkQqKWdyYXlfcGFsOwotICAgICAgICAgICAgICAgIGlmIChpc1NyY0NteWspIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWxfY291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NNWUsgY215ayA9IHBTcmNQYWxldHRlW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgRlhfQllURSByLCBnLCBiOwotICAgICAgICAgICAgICAgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShjbXlrKSwgRlhTWVNfR2V0TVZhbHVlKGNteWspLCBGWFNZU19HZXRZVmFsdWUoY215ayksIEZYU1lTX0dldEtWYWx1ZShjbXlrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpncmF5X3BhbCArKyA9IEZYUkdCMkdSQVkociwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWxfY291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYiA9IHBTcmNQYWxldHRlW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgKmdyYXlfcGFsICsrID0gRlhSR0IyR1JBWShGWEFSR0JfUihhcmdiKSwgRlhBUkdCX0coYXJnYiksIEZYQVJHQl9CKGFyZ2IpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgcGFsc2l6ZSA9IDEgPDwgKHNyY19mb3JtYXQgJiAweGZmKTsKLSAgICAgICAgICAgICAgICBwRGVzdFBhbGV0dGUgPSBGWF9BbGxvYyhGWF9EV09SRCwgcGFsc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRHN0Q215ayA9PSBpc1NyY0NteWspIHsKLSAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIocERlc3RQYWxldHRlLCBwU3JjUGFsZXR0ZSwgcGFsc2l6ZSAqIHNpemVvZihGWF9EV09SRCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsc2l6ZTsgaSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ01ZSyBjbXlrID0gcFNyY1BhbGV0dGVbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIHIsIGcsIGI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKGNteWspLCBGWFNZU19HZXRNVmFsdWUoY215ayksIEZYU1lTX0dldFlWYWx1ZShjbXlrKSwgRlhTWVNfR2V0S1ZhbHVlKGNteWspLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIGcsIGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcERlc3RQYWxldHRlW2ldID0gRlhBUkdCX01BS0UoMHhmZiwgciwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoKGRlc3RfZm9ybWF0ICYgMHhmZikgPT0gOCkgewotICAgICAgICAgICAgICAgIGludCBwYWxfY291bnQgPSAxIDw8IChzcmNfZm9ybWF0ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgRlhfTFBCWVRFIGdyYXlfcGFsID0gRlhfQWxsb2MoRlhfQllURSwgcGFsX2NvdW50KTsKLSAgICAgICAgICAgICAgICBpZiAocGFsX2NvdW50ID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgZ3JheV9wYWxbMF0gPSAwOwotICAgICAgICAgICAgICAgICAgICBncmF5X3BhbFsxXSA9IDI1NTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhbF9jb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmF5X3BhbFtpXSA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcERlc3RQYWxldHRlID0gKEZYX0RXT1JEKilncmF5X3BhbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IHBhbHNpemUgPSAxIDw8IChzcmNfZm9ybWF0ICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgcERlc3RQYWxldHRlID0gRlhfQWxsb2MoRlhfRFdPUkQsIHBhbHNpemUpOwotICAgICAgICAgICAgICAgIGlmIChwYWxzaXplID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgcERlc3RQYWxldHRlWzBdID0gaXNTcmNDbXlrID8gMjU1IDogMHhmZjAwMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgcERlc3RQYWxldHRlWzFdID0gaXNTcmNDbXlrID8gMCA6IDB4ZmZmZmZmZmY7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWxzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0UGFsZXR0ZVtpXSA9IGlzU3JjQ215ayA/IEZYX0NDT0xPUihpKSA6IChpICogMHgxMDEwMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGlzU3JjQ215ayAhPSBpc0RzdENteWspIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWxzaXplOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWF9DTVlLIGNteWsgPSBwRGVzdFBhbGV0dGVbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIHIsIGcsIGI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKGNteWspLCBGWFNZU19HZXRNVmFsdWUoY215ayksIEZYU1lTX0dldFlWYWx1ZShjbXlrKSwgRlhTWVNfR2V0S1ZhbHVlKGNteWspLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIGcsIGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcERlc3RQYWxldHRlW2ldID0gRlhBUkdCX01BS0UoMHhmZiwgciwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1DRlhfU2NhbmxpbmVDb21wb3NpdG9yOjpDRlhfU2NhbmxpbmVDb21wb3NpdG9yKCkKLXsKLSAgICBtX3BTcmNQYWxldHRlID0gTlVMTDsKLSAgICBtX3BDYWNoZVNjYW5saW5lID0gTlVMTDsKLSAgICBtX0NhY2hlU2l6ZSA9IDA7Ci0gICAgbV9iUmdiQnl0ZU9yZGVyID0gRkFMU0U7Ci0gICAgbV9CbGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUw7Ci19Ci1DRlhfU2NhbmxpbmVDb21wb3NpdG9yOjp+Q0ZYX1NjYW5saW5lQ29tcG9zaXRvcigpCi17Ci0gICAgaWYgKG1fcFNyY1BhbGV0dGUpIHsKLSAgICAgICAgRlhfRnJlZShtX3BTcmNQYWxldHRlKTsKLSAgICB9Ci0gICAgaWYgKG1fcENhY2hlU2NhbmxpbmUpIHsKLSAgICAgICAgRlhfRnJlZShtX3BDYWNoZVNjYW5saW5lKTsKLSAgICB9Ci19Ci1GWF9CT09MIENGWF9TY2FubGluZUNvbXBvc2l0b3I6OkluaXQoRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgRlhfSU5UMzIgd2lkdGgsIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtYXNrX2NvbG9yLCBpbnQgYmxlbmRfdHlwZSwgRlhfQk9PTCBiQ2xpcCwgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBtX1NyY0Zvcm1hdCA9IHNyY19mb3JtYXQ7Ci0gICAgbV9EZXN0Rm9ybWF0ID0gZGVzdF9mb3JtYXQ7Ci0gICAgbV9CbGVuZFR5cGUgPSBibGVuZF90eXBlOwotICAgIG1fYlJnYkJ5dGVPcmRlciA9IGJSZ2JCeXRlT3JkZXI7Ci0gICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IE5VTEw7Ci0gICAgaWYgKENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCkpIHsKLSAgICAgICAgcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICAgIH0KLSAgICBpZiAocEljY01vZHVsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHBJY2NUcmFuc2Zvcm0gPSBOVUxMOwotICAgIH0KLSAgICBtX3BJY2NUcmFuc2Zvcm0gPSBwSWNjVHJhbnNmb3JtOwotICAgIGlmICgoZGVzdF9mb3JtYXQgJiAweGZmKSA9PSAxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG1fU3JjRm9ybWF0ID09IEZYRElCXzFicHBNYXNrIHx8IG1fU3JjRm9ybWF0ID09IEZYRElCXzhicHBNYXNrKSB7Ci0gICAgICAgIHJldHVybiBfU2NhbmxpbmVDb21wb3NpdG9yX0luaXRTb3VyY2VNYXNrKGRlc3RfZm9ybWF0LCBhbHBoYV9mbGFnLCBtYXNrX2NvbG9yLAotICAgICAgICAgICAgICAgIG1fTWFza0FscGhhLCBtX01hc2tSZWQsIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLCBtX01hc2tCbGFjaywKLSAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLCBwSWNjVHJhbnNmb3JtKTsKLSAgICB9Ci0gICAgaWYgKHBJY2NUcmFuc2Zvcm0gPT0gTlVMTCAmJiAofnNyY19mb3JtYXQgJiAweDA0MDApICYmIChkZXN0X2Zvcm1hdCAmIDB4MDQwMCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoKG1fU3JjRm9ybWF0ICYgMHhmZikgPD0gOCkgewotICAgICAgICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfOGJwcE1hc2spIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIF9TY2FubGluZUNvbXBvc2l0b3JfSW5pdFNvdXJjZVBhbGV0dGUoc3JjX2Zvcm1hdCwgZGVzdF9mb3JtYXQsIG1fcFNyY1BhbGV0dGUsIHBTcmNQYWxldHRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUsIHBJY2NUcmFuc2Zvcm0pOwotICAgICAgICBtX1RyYW5zcGFyZW5jeSA9IChkZXN0X2Zvcm1hdCA9PSBGWERJQl9BcmdiID8gMSA6IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAoZGVzdF9mb3JtYXQgJiAweDAyMDAgPyAyIDogMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICArIChkZXN0X2Zvcm1hdCAmIDB4MDQwMCA/IDQgOiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICsgKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gMSA/IDggOiAwKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIG1fVHJhbnNwYXJlbmN5ID0gKHNyY19mb3JtYXQgJiAweDAyMDAgPyAwIDogMSkKLSAgICAgICAgICAgICAgICAgICAgICsgKGRlc3RfZm9ybWF0ICYgMHgwMjAwID8gMCA6IDIpCi0gICAgICAgICAgICAgICAgICAgICArIChibGVuZF90eXBlID09IEZYRElCX0JMRU5EX05PUk1BTCA/IDQgOiAwKQotICAgICAgICAgICAgICAgICAgICAgKyAoYkNsaXAgPyA4IDogMCkKLSAgICAgICAgICAgICAgICAgICAgICsgKHNyY19mb3JtYXQgJiAweDA0MDAgPyAxNiA6IDApCi0gICAgICAgICAgICAgICAgICAgICArIChkZXN0X2Zvcm1hdCAmIDB4MDQwMCA/IDMyIDogMCkKLSAgICAgICAgICAgICAgICAgICAgICsgKHBJY2NUcmFuc2Zvcm0gPyA2NCA6IDApOwotICAgIHJldHVybiBUUlVFOwotfQotdm9pZCBDRlhfU2NhbmxpbmVDb21wb3NpdG9yOjpDb21wb3NpdGVSZ2JCaXRtYXBMaW5lKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCB3aWR0aCwgRlhfTFBDQllURSBjbGlwX3NjYW4sCi0gICAgICAgIEZYX0xQQ0JZVEUgc3JjX2V4dHJhX2FscGhhLCBGWF9MUEJZVEUgZHN0X2V4dHJhX2FscGhhKQotewotICAgIGludCBzcmNfQnBwID0gKG1fU3JjRm9ybWF0ICYgMHhmZikgPj4gMzsKLSAgICBpbnQgZGVzdF9CcHAgPSAobV9EZXN0Rm9ybWF0ICYgMHhmZikgPj4gMzsKLSAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7Ci0gICAgICAgIHN3aXRjaCAobV9UcmFuc3BhcmVuY3kpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19BcmdiMkFyZ2JfUmdiQnl0ZU9yZGVyKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgY2xpcF9zY2FuKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX05vQ2xpcF9SZ2JCeXRlT3JkZXIoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLCBzcmNfQnBwKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19BcmdiMlJnYl9CbGVuZF9SZ2JCeXRlT3JkZXIoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLCBkZXN0X0JwcCwgY2xpcF9zY2FuKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfTm9DbGlwX1JnYkJ5dGVPcmRlcihkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsIGRlc3RfQnBwLCBzcmNfQnBwKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX05vQmxlbmRfTm9DbGlwX1JnYkJ5dGVPcmRlcihkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgc3JjX0JwcCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfQXJnYjJSZ2JfTm9CbGVuZF9SZ2JCeXRlT3JkZXIoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGRlc3RfQnBwLCBjbGlwX3NjYW4pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX05vQ2xpcF9SZ2JCeXRlT3JkZXIoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGRlc3RfQnBwLCBzcmNfQnBwKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX0NsaXBfUmdiQnl0ZU9yZGVyKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgc3JjX0JwcCwgY2xpcF9zY2FuKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX0NsaXBfUmdiQnl0ZU9yZGVyKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgZGVzdF9CcHAsIHNyY19CcHAsIGNsaXBfc2Nhbik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9DbGlwX1JnYkJ5dGVPcmRlcihkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgc3JjX0JwcCwgY2xpcF9zY2FuKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfQ2xpcF9SZ2JCeXRlT3JkZXIoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGRlc3RfQnBwLCBzcmNfQnBwLCBjbGlwX3NjYW4pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl84YnBwTWFzaykgewotICAgICAgICBpZiAobV9TcmNGb3JtYXQgJiAweDAyMDApIHsKLSAgICAgICAgICAgIGlmIChtX1NyY0Zvcm1hdCA9PSBGWERJQl9BcmdiKSB7Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19BcmdiMk1hc2soZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGNsaXBfc2Nhbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiYTJNYXNrKGRlc3Rfc2Nhbiwgc3JjX2V4dHJhX2FscGhhLCB3aWR0aCwgY2xpcF9zY2FuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMk1hc2soZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGNsaXBfc2Nhbik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKChtX0Rlc3RGb3JtYXQgJiAweGZmKSA9PSA4KSB7Ci0gICAgICAgIGlmIChtX0Rlc3RGb3JtYXQgJiAweDA0MDApIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2lkdGg7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gfipkZXN0X3NjYW47Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fU3JjRm9ybWF0ICYgMHgwMjAwKSB7Ci0gICAgICAgICAgICBpZiAobV9EZXN0Rm9ybWF0ICYgMHgwMjAwKSB7Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19BcmdiMkdyYXlhKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgY2xpcF9zY2FuLCBzcmNfZXh0cmFfYWxwaGEsIGRzdF9leHRyYV9hbHBoYSwgbV9wSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19BcmdiMkdyYXkoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLCBjbGlwX3NjYW4sIHNyY19leHRyYV9hbHBoYSwgbV9wSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtX0Rlc3RGb3JtYXQgJiAweDAyMDApIHsKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJHcmF5YShkZXN0X3NjYW4sIHNyY19zY2FuLCBzcmNfQnBwLCB3aWR0aCwgbV9CbGVuZFR5cGUsIGNsaXBfc2NhbiwgZHN0X2V4dHJhX2FscGhhLCBtX3BJY2NUcmFuc2Zvcm0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJHcmF5KGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHNyY19CcHAsIHdpZHRoLCBtX0JsZW5kVHlwZSwgY2xpcF9zY2FuLCBtX3BJY2NUcmFuc2Zvcm0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtX0Rlc3RGb3JtYXQgJiAweDA0MDApIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2lkdGg7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gfipkZXN0X3NjYW47Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgZGVzdF9TaXplID0gd2lkdGggKiBkZXN0X0JwcCArIDQ7Ci0gICAgICAgIGlmIChkZXN0X1NpemUgPiBtX0NhY2hlU2l6ZSkgewotICAgICAgICAgICAgbV9wQ2FjaGVTY2FubGluZSA9IEZYX1JlYWxsb2MoRlhfQllURSwgbV9wQ2FjaGVTY2FubGluZSwgZGVzdF9TaXplKTsKLSAgICAgICAgICAgIGlmICghbV9wQ2FjaGVTY2FubGluZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fQ2FjaGVTaXplID0gZGVzdF9TaXplOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAobV9UcmFuc3BhcmVuY3kpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIGNhc2UgNCs4OiB7Ci0gICAgICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfQXJnYjJBcmdiKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZXh0cmFfYWxwaGEsIHNyY19leHRyYV9hbHBoYSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA2NDoKLSAgICAgICAgICAgIGNhc2UgNCs2NDoKLSAgICAgICAgICAgIGNhc2UgOCs2NDoKLSAgICAgICAgICAgIGNhc2UgNCs4KzY0OiB7Ci0gICAgICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfQXJnYjJBcmdiX1RyYW5zZm9ybShkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9leHRyYV9hbHBoYSwgc3JjX2V4dHJhX2FscGhhLCBtX3BDYWNoZVNjYW5saW5lLCBtX3BJY2NUcmFuc2Zvcm0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX05vQ2xpcChkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsIHNyY19CcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2V4dHJhX2FscGhhKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMSs2NDoKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX05vQ2xpcF9UcmFuc2Zvcm0oZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLCBzcmNfQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2V4dHJhX2FscGhhLCBtX3BDYWNoZVNjYW5saW5lLCBtX3BJY2NUcmFuc2Zvcm0pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxKzg6Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9DbGlwKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgc3JjX0JwcCwgY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZXh0cmFfYWxwaGEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxKzgrNjQ6Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9DbGlwX1RyYW5zZm9ybShkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsIHNyY19CcHAsIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9leHRyYV9hbHBoYSwgbV9wQ2FjaGVTY2FubGluZSwgbV9wSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMSs0OgotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9Ob0NsaXAoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIHNyY19CcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZXh0cmFfYWxwaGEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxKzQrNjQ6Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9Ob0JsZW5kX05vQ2xpcF9UcmFuc2Zvcm0oZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIHNyY19CcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3RfZXh0cmFfYWxwaGEsIG1fcENhY2hlU2NhbmxpbmUsIG1fcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDErNCs4OgotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9DbGlwKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBzcmNfQnBwLCBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2V4dHJhX2FscGhhKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMSs0KzgrNjQ6Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9Ob0JsZW5kX0NsaXBfVHJhbnNmb3JtKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBzcmNfQnBwLCBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3RfZXh0cmFfYWxwaGEsIG1fcENhY2hlU2NhbmxpbmUsIG1fcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBjYXNlIDIrODoKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X0FyZ2IyUmdiX0JsZW5kKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgZGVzdF9CcHAsIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19leHRyYV9hbHBoYSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDIrNjQ6Ci0gICAgICAgICAgICBjYXNlIDIrOCs2NDoKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X0FyZ2IyUmdiX0JsZW5kX1RyYW5zZm9ybShkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsIGRlc3RfQnBwLCBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2V4dHJhX2FscGhhLCBtX3BDYWNoZVNjYW5saW5lLCBtX3BJY2NUcmFuc2Zvcm0pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyKzQ6Ci0gICAgICAgICAgICBjYXNlIDIrNCs4OgotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfQXJnYjJSZ2JfTm9CbGVuZChkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgZGVzdF9CcHAsIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2V4dHJhX2FscGhhKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMis0KzY0OgotICAgICAgICAgICAgY2FzZSAyKzQrOCs2NDoKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X0FyZ2IyUmdiX05vQmxlbmRfVHJhbnNmb3JtKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBkZXN0X0JwcCwgY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2V4dHJhX2FscGhhLCBtX3BDYWNoZVNjYW5saW5lLCBtX3BJY2NUcmFuc2Zvcm0pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxKzI6Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX05vQ2xpcChkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsIGRlc3RfQnBwLCBzcmNfQnBwKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMSsyKzY0OgotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9Ob0NsaXBfVHJhbnNmb3JtKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgZGVzdF9CcHAsIHNyY19CcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3BDYWNoZVNjYW5saW5lLCBtX3BJY2NUcmFuc2Zvcm0pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxKzIrODoKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfQ2xpcChkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsIGRlc3RfQnBwLCBzcmNfQnBwLCBjbGlwX3NjYW4pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxKzIrOCs2NDoKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfQ2xpcF9UcmFuc2Zvcm0oZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLCBkZXN0X0JwcCwgc3JjX0JwcCwgY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ2FjaGVTY2FubGluZSwgbV9wSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMSsyKzQ6Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfTm9DbGlwKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBkZXN0X0JwcCwgc3JjX0JwcCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDErMis0KzY0OgotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX05vQ2xpcF9UcmFuc2Zvcm0oZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGRlc3RfQnBwLCBzcmNfQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ2FjaGVTY2FubGluZSwgbV9wSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMSsyKzQrODoKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9DbGlwKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBkZXN0X0JwcCwgc3JjX0JwcCwgY2xpcF9zY2FuKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMSsyKzQrOCs2NDoKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9DbGlwX1RyYW5zZm9ybShkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgZGVzdF9CcHAsIHNyY19CcHAsIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcENhY2hlU2NhbmxpbmUsIG1fcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci12b2lkIENGWF9TY2FubGluZUNvbXBvc2l0b3I6OkNvbXBvc2l0ZVBhbEJpdG1hcExpbmUoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgaW50IHNyY19sZWZ0LCBpbnQgd2lkdGgsIEZYX0xQQ0JZVEUgY2xpcF9zY2FuLAotICAgICAgICBGWF9MUENCWVRFIHNyY19leHRyYV9hbHBoYSwgRlhfTFBCWVRFIGRzdF9leHRyYV9hbHBoYSkKLXsKLSAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7Ci0gICAgICAgIGlmIChtX1NyY0Zvcm1hdCA9PSBGWERJQl8xYnBwUmdiKSB7Ci0gICAgICAgICAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCXzhicHBSZ2IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9IGVsc2UgaWYobV9EZXN0Rm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93XzFicHBSZ2IyQXJnYl9Ob0JsZW5kX1JnYkJ5dGVPcmRlcihkZXN0X3NjYW4sIHNyY19zY2FuLCBzcmNfbGVmdCwgd2lkdGgsIG1fcFNyY1BhbGV0dGUsIGNsaXBfc2Nhbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfMWJwcFJnYjJSZ2JfTm9CbGVuZF9SZ2JCeXRlT3JkZXIoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX2xlZnQsIG1fcFNyY1BhbGV0dGUsIHdpZHRoLCAobV9EZXN0Rm9ybWF0ICYgMHhmZikgPj4gMywgY2xpcF9zY2FuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfOGJwcFJnYikgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93XzhicHBSZ2IyQXJnYl9Ob0JsZW5kX1JnYkJ5dGVPcmRlcihkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9wU3JjUGFsZXR0ZSwgY2xpcF9zY2FuKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd184YnBwUmdiMlJnYl9Ob0JsZW5kX1JnYkJ5dGVPcmRlcihkZXN0X3NjYW4sIHNyY19zY2FuLCBtX3BTcmNQYWxldHRlLCB3aWR0aCwgKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID4+IDMsIGNsaXBfc2Nhbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCXzhicHBNYXNrKSB7Ci0gICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMk1hc2soZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGNsaXBfc2Nhbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKChtX0Rlc3RGb3JtYXQgJiAweGZmKSA9PSA4KSB7Ci0gICAgICAgIGlmIChtX1RyYW5zcGFyZW5jeSAmIDgpIHsKLSAgICAgICAgICAgIGlmIChtX0Rlc3RGb3JtYXQgJiAweDAyMDApIHsKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93XzFicHBQYWwyR3JheWEoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX2xlZnQsIChGWF9MUENCWVRFKW1fcFNyY1BhbGV0dGUsIHdpZHRoLCBtX0JsZW5kVHlwZSwgY2xpcF9zY2FuLCBkc3RfZXh0cmFfYWxwaGEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93XzFicHBQYWwyR3JheShkZXN0X3NjYW4sIHNyY19zY2FuLCBzcmNfbGVmdCwgKEZYX0xQQ0JZVEUpbV9wU3JjUGFsZXR0ZSwgd2lkdGgsIG1fQmxlbmRUeXBlLCBjbGlwX3NjYW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1fRGVzdEZvcm1hdCAmIDB4MDIwMCkKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93XzhicHBQYWwyR3JheWEoZGVzdF9zY2FuLCBzcmNfc2NhbiwgKEZYX0xQQ0JZVEUpbV9wU3JjUGFsZXR0ZSwgd2lkdGgsIG1fQmxlbmRUeXBlLCBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9leHRyYV9hbHBoYSwgc3JjX2V4dHJhX2FscGhhKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93XzhicHBQYWwyR3JheShkZXN0X3NjYW4sIHNyY19zY2FuLCAoRlhfTFBDQllURSltX3BTcmNQYWxldHRlLCB3aWR0aCwgbV9CbGVuZFR5cGUsIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfZXh0cmFfYWxwaGEpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoIChtX1RyYW5zcGFyZW5jeSkgewotICAgICAgICAgICAgY2FzZSAxKzI6Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd184YnBwUmdiMkFyZ2JfTm9CbGVuZChkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9wU3JjUGFsZXR0ZSwgY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2V4dHJhX2FscGhhKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMSsyKzg6Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd18xYnBwUmdiMkFyZ2JfTm9CbGVuZChkZXN0X3NjYW4sIHNyY19zY2FuLCBzcmNfbGVmdCwgd2lkdGgsIG1fcFNyY1BhbGV0dGUsIGNsaXBfc2Nhbik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd184YnBwUmdiMlJnYl9Ob0JsZW5kKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fcFNyY1BhbGV0dGUsIHdpZHRoLCAobV9EZXN0Rm9ybWF0ICYgMHhmZikgPj4gMywgY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfZXh0cmFfYWxwaGEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAwKzg6Ci0gICAgICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd18xYnBwUmdiMlJnYl9Ob0JsZW5kKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHNyY19sZWZ0LCBtX3BTcmNQYWxldHRlLCB3aWR0aCwgKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID4+IDMsIGNsaXBfc2Nhbik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDArMjoKLSAgICAgICAgICAgICAgICBfQ29tcG9zaXRlUm93XzhicHBSZ2IyUmdiX05vQmxlbmQoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9wU3JjUGFsZXR0ZSwgd2lkdGgsIChtX0Rlc3RGb3JtYXQgJiAweGZmKSA+PiAzLCBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19leHRyYV9hbHBoYSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDArMis4OgotICAgICAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfMWJwcFJnYjJSZ2JhX05vQmxlbmQoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX2xlZnQsIHdpZHRoLCBtX3BTcmNQYWxldHRlLCBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZXh0cmFfYWxwaGEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotfQotdm9pZCBDRlhfU2NhbmxpbmVDb21wb3NpdG9yOjpDb21wb3NpdGVCeXRlTWFza0xpbmUoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBDQllURSBzcmNfc2NhbiwgaW50IHdpZHRoLCBGWF9MUENCWVRFIGNsaXBfc2NhbiwKLSAgICAgICAgRlhfTFBCWVRFIGRzdF9leHRyYV9hbHBoYSkKLXsKLSAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCXzhicHBNYXNrKSB7Ci0gICAgICAgIF9Db21wb3NpdGVSb3dfQnl0ZU1hc2syTWFzayhkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgd2lkdGgsIGNsaXBfc2Nhbik7Ci0gICAgfSBlbHNlIGlmICgobV9EZXN0Rm9ybWF0ICYgMHhmZikgPT0gOCkgewotICAgICAgICBpZiAobV9EZXN0Rm9ybWF0ICYgMHgwMjAwKSB7Ci0gICAgICAgICAgICBfQ29tcG9zaXRlUm93X0J5dGVNYXNrMkdyYXlhKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsIHdpZHRoLCBjbGlwX3NjYW4sIGRzdF9leHRyYV9hbHBoYSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBfQ29tcG9zaXRlUm93X0J5dGVNYXNrMkdyYXkoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwgd2lkdGgsIGNsaXBfc2Nhbik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1fYlJnYkJ5dGVPcmRlcikgewotICAgICAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX0FyZ2IpCi0gICAgICAgICAgICBfQ29tcG9zaXRlUm93X0J5dGVNYXNrMkFyZ2JfUmdiQnl0ZU9yZGVyKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLAotICAgICAgICAgICAgICAgICAgICB3aWR0aCwgbV9CbGVuZFR5cGUsIGNsaXBfc2Nhbik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfQnl0ZU1hc2syUmdiX1JnYkJ5dGVPcmRlcihkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLCBtX01hc2tHcmVlbiwgbV9NYXNrQmx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgbV9CbGVuZFR5cGUsIChtX0Rlc3RGb3JtYXQgJiAweGZmKSA+PiAzLCBjbGlwX3NjYW4pOwotICAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfQXJnYikKLSAgICAgICAgX0NvbXBvc2l0ZVJvd19CeXRlTWFzazJBcmdiKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIG1fQmxlbmRUeXBlLCBjbGlwX3NjYW4pOwotICAgIGVsc2UgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9SZ2IgfHwgbV9EZXN0Rm9ybWF0ID09IEZYRElCX1JnYjMyKQotICAgICAgICBfQ29tcG9zaXRlUm93X0J5dGVNYXNrMlJnYihkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLCBtX01hc2tHcmVlbiwgbV9NYXNrQmx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIG1fQmxlbmRUeXBlLCAobV9EZXN0Rm9ybWF0ICYgMHhmZikgPj4gMywgY2xpcF9zY2FuKTsKLSAgICBlbHNlIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfUmdiYSkKLSAgICAgICAgX0NvbXBvc2l0ZVJvd19CeXRlTWFzazJSZ2JhKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIG1fQmxlbmRUeXBlLCBjbGlwX3NjYW4sIGRzdF9leHRyYV9hbHBoYSk7Ci19Ci12b2lkIENGWF9TY2FubGluZUNvbXBvc2l0b3I6OkNvbXBvc2l0ZUJpdE1hc2tMaW5lKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCBzcmNfbGVmdCwgaW50IHdpZHRoLCBGWF9MUENCWVRFIGNsaXBfc2NhbiwKLSAgICAgICAgRlhfTFBCWVRFIGRzdF9leHRyYV9hbHBoYSkKLXsKLSAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCXzhicHBNYXNrKSB7Ci0gICAgICAgIF9Db21wb3NpdGVSb3dfQml0TWFzazJNYXNrKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBzcmNfbGVmdCwgd2lkdGgsIGNsaXBfc2Nhbik7Ci0gICAgfSBlbHNlIGlmICgobV9EZXN0Rm9ybWF0ICYgMHhmZikgPT0gOCkgewotICAgICAgICBpZiAobV9EZXN0Rm9ybWF0ICYgMHgwMjAwKQotICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMkdyYXlhKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsIHNyY19sZWZ0LCB3aWR0aCwgY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9leHRyYV9hbHBoYSk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMkdyYXkoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwgc3JjX2xlZnQsIHdpZHRoLCBjbGlwX3NjYW4pOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKLSAgICAgICAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9BcmdiKQotICAgICAgICAgICAgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMkFyZ2JfUmdiQnl0ZU9yZGVyKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19sZWZ0LCB3aWR0aCwgbV9CbGVuZFR5cGUsIGNsaXBfc2Nhbik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIF9Db21wb3NpdGVSb3dfQml0TWFzazJSZ2JfUmdiQnl0ZU9yZGVyKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2xlZnQsIHdpZHRoLCBtX0JsZW5kVHlwZSwgKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID4+IDMsIGNsaXBfc2Nhbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9BcmdiKQotICAgICAgICBfQ29tcG9zaXRlUm93X0JpdE1hc2syQXJnYihkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLCBtX01hc2tHcmVlbiwgbV9NYXNrQmx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2xlZnQsIHdpZHRoLCBtX0JsZW5kVHlwZSwgY2xpcF9zY2FuKTsKLSAgICBlbHNlIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfUmdiIHx8IG1fRGVzdEZvcm1hdCA9PSBGWERJQl9SZ2IzMikKLSAgICAgICAgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMlJnYihkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLCBtX01hc2tHcmVlbiwgbV9NYXNrQmx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfbGVmdCwgd2lkdGgsIG1fQmxlbmRUeXBlLCAobV9EZXN0Rm9ybWF0ICYgMHhmZikgPj4gMywgY2xpcF9zY2FuKTsKLX0KLUZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpDb21wb3NpdGVCaXRtYXAoaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBBU1NFUlQoIXBTcmNCaXRtYXAtPklzQWxwaGFNYXNrKCkpOwotICAgIEFTU0VSVChtX2JwcCA+PSA4KTsKLSAgICBpZiAocFNyY0JpdG1hcC0+SXNBbHBoYU1hc2soKSB8fCBtX2JwcCA8IDgpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBHZXRPdmVybGFwUmVjdChkZXN0X2xlZnQsIGRlc3RfdG9wLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLT5HZXRXaWR0aCgpLCBwU3JjQml0bWFwLT5HZXRIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICBzcmNfbGVmdCwgc3JjX3RvcCwgcENsaXBSZ24pOwotICAgIGlmICh3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBDbGlwTWFzayA9IE5VTEw7Ci0gICAgRlhfUkVDVCBjbGlwX2JveDsKLSAgICBpZiAocENsaXBSZ24gJiYgcENsaXBSZ24tPkdldFR5cGUoKSAhPSBDRlhfQ2xpcFJnbjo6UmVjdEkpIHsKLSAgICAgICAgQVNTRVJUKHBDbGlwUmduLT5HZXRUeXBlKCkgPT0gQ0ZYX0NsaXBSZ246Ok1hc2tGKTsKLSAgICAgICAgcENsaXBNYXNrID0gcENsaXBSZ24tPkdldE1hc2soKTsKLSAgICAgICAgY2xpcF9ib3ggPSBwQ2xpcFJnbi0+R2V0Qm94KCk7Ci0gICAgfQotICAgIENGWF9TY2FubGluZUNvbXBvc2l0b3IgY29tcG9zaXRvcjsKLSAgICBpZiAoIWNvbXBvc2l0b3IuSW5pdChHZXRGb3JtYXQoKSwgcFNyY0JpdG1hcC0+R2V0Rm9ybWF0KCksIHdpZHRoLCBwU3JjQml0bWFwLT5HZXRQYWxldHRlKCksIDAsIGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBNYXNrICE9IE5VTEwsIGJSZ2JCeXRlT3JkZXIsIDAsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaW50IGRlc3RfQnBwID0gbV9icHAgLyA4OwotICAgIGludCBzcmNfQnBwID0gcFNyY0JpdG1hcC0+R2V0QlBQKCkgLyA4OwotICAgIEZYX0JPT0wgYlJnYiA9IHNyY19CcHAgPiAxICYmICFwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpOwotICAgIENGWF9ESUJpdG1hcCogcFNyY0FscGhhTWFzayA9IHBTcmNCaXRtYXAtPm1fcEFscGhhTWFzazsKLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICBGWF9MUEJZVEUgZGVzdF9zY2FuID0gbV9wQnVmZmVyICsgKGRlc3RfdG9wICsgcm93KSAqIG1fUGl0Y2ggKyBkZXN0X2xlZnQgKiBkZXN0X0JwcDsKLSAgICAgICAgRlhfTFBDQllURSBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiBzcmNfQnBwOwotICAgICAgICBGWF9MUENCWVRFIHNyY19zY2FuX2V4dHJhX2FscGhhID0gcFNyY0FscGhhTWFzayA/IHBTcmNBbHBoYU1hc2stPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgOiBOVUxMOwotICAgICAgICBGWF9MUEJZVEUgZHN0X3NjYW5fZXh0cmFfYWxwaGEgPSBtX3BBbHBoYU1hc2sgPyAoRlhfTFBCWVRFKW1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUoZGVzdF90b3AgKyByb3cpICsgZGVzdF9sZWZ0IDogTlVMTDsKLSAgICAgICAgRlhfTFBDQllURSBjbGlwX3NjYW4gPSBOVUxMOwotICAgICAgICBpZiAocENsaXBNYXNrKSB7Ci0gICAgICAgICAgICBjbGlwX3NjYW4gPSBwQ2xpcE1hc2stPm1fcEJ1ZmZlciArIChkZXN0X3RvcCArIHJvdyAtIGNsaXBfYm94LnRvcCkgKiBwQ2xpcE1hc2stPm1fUGl0Y2ggKyAoZGVzdF9sZWZ0IC0gY2xpcF9ib3gubGVmdCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJSZ2IpIHsKLSAgICAgICAgICAgIGNvbXBvc2l0b3IuQ29tcG9zaXRlUmdiQml0bWFwTGluZShkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgY2xpcF9zY2FuLCBzcmNfc2Nhbl9leHRyYV9hbHBoYSwgZHN0X3NjYW5fZXh0cmFfYWxwaGEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29tcG9zaXRvci5Db21wb3NpdGVQYWxCaXRtYXBMaW5lKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHNyY19sZWZ0LCB3aWR0aCwgY2xpcF9zY2FuLCBzcmNfc2Nhbl9leHRyYV9hbHBoYSwgZHN0X3NjYW5fZXh0cmFfYWxwaGEpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDRlhfRElCaXRtYXA6OkNvbXBvc2l0ZU1hc2soaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwTWFzaywgRlhfRFdPUkQgY29sb3IsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEFTU0VSVChwTWFzay0+SXNBbHBoYU1hc2soKSk7Ci0gICAgQVNTRVJUKG1fYnBwID49IDgpOwotICAgIGlmICghcE1hc2stPklzQWxwaGFNYXNrKCkgfHwgbV9icHAgPCA4KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgR2V0T3ZlcmxhcFJlY3QoZGVzdF9sZWZ0LCBkZXN0X3RvcCwgd2lkdGgsIGhlaWdodCwgcE1hc2stPkdldFdpZHRoKCksIHBNYXNrLT5HZXRIZWlnaHQoKSwgc3JjX2xlZnQsIHNyY190b3AsIHBDbGlwUmduKTsKLSAgICBpZiAod2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaW50IHNyY19hbHBoYSA9IChGWF9CWVRFKShhbHBoYV9mbGFnID4+IDgpID8gKGFscGhhX2ZsYWcgJiAweGZmKSA6IEZYQVJHQl9BKGNvbG9yKTsKICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQ2xpcE1hc2sgPSBOVUxMOwotICAgIEZYX1JFQ1QgY2xpcF9ib3g7Ci0gICAgaWYgKHBDbGlwUmduICYmIHBDbGlwUmduLT5HZXRUeXBlKCkgIT0gQ0ZYX0NsaXBSZ246OlJlY3RJKSB7Ci0gICAgICAgIEFTU0VSVChwQ2xpcFJnbi0+R2V0VHlwZSgpID09IENGWF9DbGlwUmduOjpNYXNrRik7Ci0gICAgICAgIHBDbGlwTWFzayA9IHBDbGlwUmduLT5HZXRNYXNrKCk7Ci0gICAgICAgIGNsaXBfYm94ID0gcENsaXBSZ24tPkdldEJveCgpOworICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CisgICAgICB1aW50OF90IGRlc3Rfc2Nhbl9vWzNdOworICAgICAgZGVzdF9zY2FuX29bMF0gPSBkZXN0X3NjYW5bMl07CisgICAgICBkZXN0X3NjYW5fb1sxXSA9IGRlc3Rfc2NhblsxXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzJdID0gZGVzdF9zY2FuWzBdOworICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuX28sIGJsZW5kZWRfY29sb3JzKTsKICAgICB9Ci0gICAgaW50IHNyY19icHAgPSBwTWFzay0+R2V0QlBQKCk7Ci0gICAgaW50IEJwcCA9IEdldEJQUCgpIC8gODsKLSAgICBDRlhfU2NhbmxpbmVDb21wb3NpdG9yIGNvbXBvc2l0b3I7Ci0gICAgaWYgKCFjb21wb3NpdG9yLkluaXQoR2V0Rm9ybWF0KCksIHBNYXNrLT5HZXRGb3JtYXQoKSwgd2lkdGgsIE5VTEwsIGNvbG9yLCBibGVuZF90eXBlLCBwQ2xpcE1hc2sgIT0gTlVMTCwgYlJnYkJ5dGVPcmRlciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7CisgICAgICBpbnQgaW5kZXggPSAyIC0gY29sb3I7CisgICAgICBpZiAoYmxlbmRfdHlwZSkgeworICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQorICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9CTEVORChibGVuZF90eXBlLCBkZXN0X3NjYW5baW5kZXhdLCAqc3JjX3NjYW4pOworICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0UoKnNyY19zY2FuLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKKyAgICAgICAgZGVzdF9zY2FuW2luZGV4XSA9CisgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5baW5kZXhdLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkZXN0X3NjYW5baW5kZXhdID0KKyAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhbltpbmRleF0sICpzcmNfc2NhbiwgYWxwaGFfcmF0aW8pOworICAgICAgfQorICAgICAgc3JjX3NjYW4rKzsKICAgICB9Ci0gICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgRlhfTFBCWVRFIGRlc3Rfc2NhbiA9IG1fcEJ1ZmZlciArIChkZXN0X3RvcCArIHJvdykgKiBtX1BpdGNoICsgZGVzdF9sZWZ0ICogQnBwOwotICAgICAgICBGWF9MUENCWVRFIHNyY19zY2FuID0gcE1hc2stPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpOwotICAgICAgICBGWF9MUEJZVEUgZHN0X3NjYW5fZXh0cmFfYWxwaGEgPSBtX3BBbHBoYU1hc2sgPyAoRlhfTFBCWVRFKW1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUoZGVzdF90b3AgKyByb3cpICsgZGVzdF9sZWZ0IDogTlVMTDsKLSAgICAgICAgRlhfTFBDQllURSBjbGlwX3NjYW4gPSBOVUxMOwotICAgICAgICBpZiAocENsaXBNYXNrKSB7Ci0gICAgICAgICAgICBjbGlwX3NjYW4gPSBwQ2xpcE1hc2stPm1fcEJ1ZmZlciArIChkZXN0X3RvcCArIHJvdyAtIGNsaXBfYm94LnRvcCkgKiBwQ2xpcE1hc2stPm1fUGl0Y2ggKyAoZGVzdF9sZWZ0IC0gY2xpcF9ib3gubGVmdCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNyY19icHAgPT0gMSkgewotICAgICAgICAgICAgY29tcG9zaXRvci5Db21wb3NpdGVCaXRNYXNrTGluZShkZXN0X3NjYW4sIHNyY19zY2FuLCBzcmNfbGVmdCwgd2lkdGgsIGNsaXBfc2NhbiwgZHN0X3NjYW5fZXh0cmFfYWxwaGEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29tcG9zaXRvci5Db21wb3NpdGVCeXRlTWFza0xpbmUoZGVzdF9zY2FuLCBzcmNfc2NhbiArIHNyY19sZWZ0LCB3aWR0aCwgY2xpcF9zY2FuLCBkc3Rfc2Nhbl9leHRyYV9hbHBoYSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgc3JjX3NjYW4rKzsKKyAgfQogfQotRlhfQk9PTCBDRlhfRElCaXRtYXA6OkNvbXBvc2l0ZVJlY3QoaW50IGxlZnQsIGludCB0b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhfRFdPUkQgY29sb3IsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Cit2b2lkIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfTm9DbGlwX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19CcHApIHsKKyAgaW50IGJsZW5kZWRfY29sb3JzWzNdOworICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICB1aW50OF90IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CisgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgaWYgKHNyY19CcHAgPT0gNCkgeworICAgICAgICBGWEFSR0JfU0VUUkdCT1JERVJESUIoZGVzdF9zY2FuLCAweGZmMDAwMDAwIHwgRlhBUkdCX0dFVERJQihzcmNfc2NhbikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRlhBUkdCX1NFVFJHQk9SREVSRElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0UoMHhmZiwgc3JjX3NjYW5bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuWzFdLCBzcmNfc2NhblswXSkpOworICAgICAgfQorICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICAgICAgY29udGludWU7CiAgICAgfQotICAgIGludCBzcmNfYWxwaGEgPSAoYWxwaGFfZmxhZyA+PiA4KSA/IChhbHBoYV9mbGFnICYgMHhmZikgOiBGWEFSR0JfQShjb2xvcik7CisgICAgZGVzdF9zY2FuWzNdID0gMHhmZjsKKyAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CisgICAgICB1aW50OF90IGRlc3Rfc2Nhbl9vWzNdOworICAgICAgZGVzdF9zY2FuX29bMF0gPSBkZXN0X3NjYW5bMl07CisgICAgICBkZXN0X3NjYW5fb1sxXSA9IGRlc3Rfc2NhblsxXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzJdID0gZGVzdF9zY2FuWzBdOworICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuX28sIGJsZW5kZWRfY29sb3JzKTsKKyAgICB9CisgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgIGludCBpbmRleCA9IDIgLSBjb2xvcjsKKyAgICAgIGludCBzcmNfY29sb3IgPSBGWF9HQU1NQSgqc3JjX3NjYW4pOworICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdCisgICAgICAgICAgICAgICAgICAgICAgICA6IF9CTEVORChibGVuZF90eXBlLCBkZXN0X3NjYW5baW5kZXhdLCBzcmNfY29sb3IpOworICAgICAgZGVzdF9zY2FuW2luZGV4XSA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19jb2xvciwgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICBzcmNfc2NhbisrOworICAgIH0KKyAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOworICB9Cit9CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X0FyZ2IyUmdiX0JsZW5kX1JnYkJ5dGVPcmRlcigKKyAgICB1aW50OF90KiBkZXN0X3NjYW4sCisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgaW50IHdpZHRoLAorICAgIGludCBibGVuZF90eXBlLAorICAgIGludCBkZXN0X0JwcCwKKyAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgaW50IGJsZW5kZWRfY29sb3JzWzNdOworICBGWF9CT09MIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICB1aW50OF90IHNyY19hbHBoYTsKKyAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXSAqICgqY2xpcF9zY2FuKyspIC8gMjU1OworICAgIH0gZWxzZSB7CisgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXTsKKyAgICB9CiAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOworICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBGWF9SRUNUIHJlY3QobGVmdCwgdG9wLCBsZWZ0ICsgd2lkdGgsIHRvcCArIGhlaWdodCk7Ci0gICAgcmVjdC5JbnRlcnNlY3QoMCwgMCwgbV9XaWR0aCwgbV9IZWlnaHQpOwotICAgIGlmIChyZWN0LklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CisgICAgICB1aW50OF90IGRlc3Rfc2Nhbl9vWzNdOworICAgICAgZGVzdF9zY2FuX29bMF0gPSBkZXN0X3NjYW5bMl07CisgICAgICBkZXN0X3NjYW5fb1sxXSA9IGRlc3Rfc2NhblsxXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzJdID0gZGVzdF9zY2FuWzBdOworICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuX28sIGJsZW5kZWRfY29sb3JzKTsKICAgICB9Ci0gICAgd2lkdGggPSByZWN0LldpZHRoKCk7Ci0gICAgRlhfRFdPUkQgZHN0X2NvbG9yOwotICAgIGlmIChhbHBoYV9mbGFnID4+IDgpIHsKLSAgICAgICAgZHN0X2NvbG9yID0gRlhDTVlLX1RPRElCKGNvbG9yKTsKKyAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgeworICAgICAgaW50IGluZGV4ID0gMiAtIGNvbG9yOworICAgICAgaW50IGJhY2tfY29sb3IgPSBGWF9HQU1NQShkZXN0X3NjYW5baW5kZXhdKTsKKyAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCisgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQorICAgICAgICAgICAgICAgICAgICAgICAgOiBfQkxFTkQoYmxlbmRfdHlwZSwgYmFja19jb2xvciwgKnNyY19zY2FuKTsKKyAgICAgIGRlc3Rfc2NhbltpbmRleF0gPQorICAgICAgICAgIEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoYmFja19jb2xvciwgYmxlbmRlZCwgc3JjX2FscGhhKSk7CisgICAgICBzcmNfc2NhbisrOworICAgIH0KKyAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7CisgICAgc3JjX3NjYW4rKzsKKyAgfQorfQoraW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9Ob0JsZW5kX05vQ2xpcF9SZ2JCeXRlT3JkZXIoCisgICAgdWludDhfdCogZGVzdF9zY2FuLAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgIGludCB3aWR0aCwKKyAgICBpbnQgc3JjX0JwcCkgeworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICBpZiAoc3JjX0JwcCA9PSA0KSB7CisgICAgICBGWEFSR0JfU0VUUkdCT1JERVJESUIoZGVzdF9zY2FuLCAweGZmMDAwMDAwIHwgRlhBUkdCX0dFVERJQihzcmNfc2NhbikpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGRzdF9jb2xvciA9IEZYQVJHQl9UT0RJQihjb2xvcik7CisgICAgICBGWEFSR0JfU0VUUkdCT1JERVJESUIoCisgICAgICAgICAgZGVzdF9zY2FuLCBGWEFSR0JfTUFLRSgweGZmLCBzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sIHNyY19zY2FuWzBdKSk7CiAgICAgfQotICAgIEZYX0xQQllURSBjb2xvcl9wID0gKEZYX0xQQllURSkmZHN0X2NvbG9yOwotICAgIGlmIChtX2JwcCA9PSA4KSB7Ci0gICAgICAgIEZYX0JZVEUgZ3JheSA9IDI1NTsKLSAgICAgICAgaWYgKCFJc0FscGhhTWFzaygpKSB7Ci0gICAgICAgICAgICBpZiAocEljY1RyYW5zZm9ybSAmJiBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpICYmIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpKSB7Ci0gICAgICAgICAgICAgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LCBjb2xvcl9wLCAxKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFscGhhX2ZsYWcgPj4gOCkgewotICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIHIsIGcsIGI7Ci0gICAgICAgICAgICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShjb2xvcl9wWzBdLCBjb2xvcl9wWzFdLCBjb2xvcl9wWzJdLCBjb2xvcl9wWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciwgZywgYik7Ci0gICAgICAgICAgICAgICAgICAgIGdyYXkgPSBGWFJHQjJHUkFZKHIsIGcsIGIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGdyYXkgPSAoRlhfQllURSlGWFJHQjJHUkFZKChpbnQpY29sb3JfcFsyXSwgY29sb3JfcFsxXSwgY29sb3JfcFswXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKElzQ215a0ltYWdlKCkpIHsKLSAgICAgICAgICAgICAgICBncmF5ID0gfmdyYXk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgcm93ID0gcmVjdC50b3A7IHJvdyA8IHJlY3QuYm90dG9tOyByb3cgKyspIHsKLSAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X3NjYW4gPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoICsgcmVjdC5sZWZ0OwotICAgICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQ4KGRlc3Rfc2NhbiwgZ3JheSwgd2lkdGgpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9IGVsc2UgaWYgKG1fYnBwID09IDEpIHsKLSAgICAgICAgQVNTRVJUKCFJc0NteWtJbWFnZSgpICYmIChGWF9CWVRFKShhbHBoYV9mbGFnID4+IDgpID09IDApOwotICAgICAgICBpbnQgbGVmdF9zaGlmdCA9IHJlY3QubGVmdCAlIDg7Ci0gICAgICAgIGludCByaWdodF9zaGlmdCA9IHJlY3QucmlnaHQgJSA4OwotICAgICAgICBpbnQgd2lkdGggPSByZWN0LnJpZ2h0IC8gOCAtIHJlY3QubGVmdCAvIDg7Ci0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgIGlmIChtX3BQYWxldHRlID09IE5VTEwpIHsKLSAgICAgICAgICAgIGluZGV4ID0gKChGWF9CWVRFKWNvbG9yID09IDB4ZmYpID8gMSA6IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkgKyspCi0gICAgICAgICAgICAgICAgaWYgKG1fcFBhbGV0dGVbaV0gPT0gY29sb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCByb3cgPSByZWN0LnRvcDsgcm93IDwgcmVjdC5ib3R0b207IHJvdyArKykgewotICAgICAgICAgICAgRlhfQllURSogZGVzdF9zY2FuX3RvcCA9IChGWF9CWVRFKilHZXRTY2FubGluZShyb3cpICsgcmVjdC5sZWZ0IC8gODsKLSAgICAgICAgICAgIEZYX0JZVEUqIGRlc3Rfc2Nhbl90b3BfciA9IChGWF9CWVRFKilHZXRTY2FubGluZShyb3cpICsgcmVjdC5yaWdodCAvIDg7Ci0gICAgICAgICAgICBGWF9CWVRFIGxlZnRfZmxhZyA9ICAqZGVzdF9zY2FuX3RvcCAmICgyNTUgPDwgKDggLSBsZWZ0X3NoaWZ0KSk7Ci0gICAgICAgICAgICBGWF9CWVRFIHJpZ2h0X2ZsYWcgPSAqZGVzdF9zY2FuX3RvcF9yICYgKDI1NSA+PiByaWdodF9zaGlmdCk7Ci0gICAgICAgICAgICBpZiAod2lkdGgpIHsKLSAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQ4KGRlc3Rfc2Nhbl90b3AgKyAxLCBpbmRleCA/IDI1NSA6IDAsIHdpZHRoIC0gMSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbmRleCkgewotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuX3RvcCAmPSBsZWZ0X2ZsYWc7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW5fdG9wX3IgJj0gcmlnaHRfZmxhZzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuX3RvcCB8PSB+bGVmdF9mbGFnOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuX3RvcF9yIHw9IH5yaWdodF9mbGFnOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbmRleCkgewotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuX3RvcCAmPSBsZWZ0X2ZsYWcgfCByaWdodF9mbGFnOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW5fdG9wIHw9IH4obGVmdF9mbGFnIHwgcmlnaHRfZmxhZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgIGRlc3Rfc2NhbiArPSA0OworICAgIHNyY19zY2FuICs9IHNyY19CcHA7CisgIH0KK30KK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9Ob0NsaXBfUmdiQnl0ZU9yZGVyKAorICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IGJsZW5kX3R5cGUsCisgICAgaW50IGRlc3RfQnBwLAorICAgIGludCBzcmNfQnBwKSB7CisgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgRlhfQk9PTCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgeworICAgICAgdWludDhfdCBkZXN0X3NjYW5fb1szXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzBdID0gZGVzdF9zY2FuWzJdOworICAgICAgZGVzdF9zY2FuX29bMV0gPSBkZXN0X3NjYW5bMV07CisgICAgICBkZXN0X3NjYW5fb1syXSA9IGRlc3Rfc2NhblswXTsKKyAgICAgIF9SR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2Nhbl9vLCBibGVuZGVkX2NvbG9ycyk7CiAgICAgfQotICAgIEFTU0VSVChtX2JwcCA+PSAyNCk7Ci0gICAgaWYgKG1fYnBwIDwgMjQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7CisgICAgICBpbnQgaW5kZXggPSAyIC0gY29sb3I7CisgICAgICBpbnQgYmFja19jb2xvciA9IEZYX0dBTU1BKGRlc3Rfc2NhbltpbmRleF0pOworICAgICAgaW50IHNyY19jb2xvciA9IEZYX0dBTU1BKCpzcmNfc2Nhbik7CisgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0KKyAgICAgICAgICAgICAgICAgICAgICAgIDogX0JMRU5EKGJsZW5kX3R5cGUsIGJhY2tfY29sb3IsIHNyY19jb2xvcik7CisgICAgICBkZXN0X3NjYW5baW5kZXhdID0gRlhfR0FNTUFfSU5WRVJTRShibGVuZGVkKTsKKyAgICAgIHNyY19zY2FuKys7CiAgICAgfQotICAgIGlmIChwSWNjVHJhbnNmb3JtICYmIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCkpIHsKLSAgICAgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBjb2xvcl9wLCBjb2xvcl9wLCAxKTsKKyAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7CisgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKKyAgfQorfQoraW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19BcmdiMlJnYl9Ob0JsZW5kX1JnYkJ5dGVPcmRlcigKKyAgICB1aW50OF90KiBkZXN0X3NjYW4sCisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgaW50IHdpZHRoLAorICAgIGludCBkZXN0X0JwcCwKKyAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgdWludDhfdCBzcmNfYWxwaGE7CisgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM10gKiAoKmNsaXBfc2NhbisrKSAvIDI1NTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAoYWxwaGFfZmxhZyA+PiA4ICYmICFJc0NteWtJbWFnZSgpKQotICAgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShjb2xvciksIEZYU1lTX0dldE1WYWx1ZShjb2xvciksIEZYU1lTX0dldFlWYWx1ZShjb2xvciksIEZYU1lTX0dldEtWYWx1ZShjb2xvciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfcFsyXSwgY29sb3JfcFsxXSwgY29sb3JfcFswXSk7Ci0gICAgICAgIGVsc2UgaWYgKCEoYWxwaGFfZmxhZyA+PiA4KSAmJiBJc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KKyAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOwogICAgIH0KLSAgICBpZighSXNDbXlrSW1hZ2UoKSkgewotICAgICAgICBjb2xvcl9wWzNdID0gKEZYX0JZVEUpc3JjX2FscGhhOwotICAgIH0KLSAgICBpbnQgQnBwID0gbV9icHAgLyA4OwotICAgIEZYX0JPT0wgYkFscGhhID0gSGFzQWxwaGEoKTsKLSAgICBGWF9CT09MIGJBcmdiID0gR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYiA/IFRSVUUgOiBGQUxTRTsKICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICBmb3IgKGludCByb3cgPSByZWN0LnRvcDsgcm93IDwgcmVjdC5ib3R0b207IHJvdyArKykgewotICAgICAgICAgICAgRlhfTFBCWVRFIGRlc3Rfc2NhbiA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2ggKyByZWN0LmxlZnQgKiBCcHA7Ci0gICAgICAgICAgICBGWF9MUEJZVEUgZGVzdF9zY2FuX2FscGhhID0gbV9wQWxwaGFNYXNrID8gKEZYX0xQQllURSltX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKHJvdykgKyByZWN0LmxlZnQgOiBOVUxMOwotICAgICAgICAgICAgaWYgKGRlc3Rfc2Nhbl9hbHBoYSkgewotICAgICAgICAgICAgICAgIEZYU1lTX21lbXNldDgoZGVzdF9zY2FuX2FscGhhLCAweGZmLCB3aWR0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoQnBwID09IDQpIHsKLSAgICAgICAgICAgICAgICBGWF9EV09SRCogc2NhbiA9IChGWF9EV09SRCopZGVzdF9zY2FuOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgKnNjYW4gKysgPSBkc3RfY29sb3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gKysgPSBjb2xvcl9wWzBdOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuICsrID0gY29sb3JfcFsxXTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiArKyA9IGNvbG9yX3BbMl07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRSgqc3JjX3NjYW4rKyk7CisgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKCpzcmNfc2NhbisrKTsKKyAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoKnNyY19zY2FuKyspOworICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOworICAgICAgc3JjX3NjYW4rKzsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBmb3IgKGludCByb3cgPSByZWN0LnRvcDsgcm93IDwgcmVjdC5ib3R0b207IHJvdyArKykgewotICAgICAgICBGWF9MUEJZVEUgZGVzdF9zY2FuID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaCArIHJlY3QubGVmdCAqIEJwcDsKLSAgICAgICAgaWYgKGJBbHBoYSkgewotICAgICAgICAgICAgaWYgKGJBcmdiKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShzcmNfYWxwaGEsIGNvbG9yX3BbMl0sIGNvbG9yX3BbMV0sIGNvbG9yX3BbMF0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgRlhfQllURSBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBjb2xvcl9wWzBdLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGNvbG9yX3BbMV0sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICsrOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgY29sb3JfcFsyXSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBGWF9MUEJZVEUgZGVzdF9zY2FuX2FscGhhID0gKEZYX0xQQllURSltX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKHJvdykgKyByZWN0LmxlZnQ7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGJhY2tfYWxwaGEgPSAqZGVzdF9zY2FuX2FscGhhOwotICAgICAgICAgICAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuX2FscGhhKysgPSBzcmNfYWxwaGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkzMihkZXN0X3NjYW4sIGNvbG9yX3AsIEJwcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgRlhfQllURSBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW5fYWxwaGEgKysgPSBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGNvbXBzID0gMDsgY29tcHMgPCBCcHA7IGNvbXBzICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgY29sb3JfcFtjb21wc10sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBmb3IoaW50IGNvbXBzID0gMDsgY29tcHMgPCBCcHA7IGNvbXBzICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21wcyA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuICsrID0gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGNvbG9yX3BbY29tcHNdLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7CisgICAgICBzcmNfc2NhbiArPSA0OworICAgICAgY29udGludWU7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7CisgICAgICBpbnQgaW5kZXggPSAyIC0gY29sb3I7CisgICAgICBkZXN0X3NjYW5baW5kZXhdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5baW5kZXhdKSwgKnNyY19zY2FuLCBzcmNfYWxwaGEpKTsKKyAgICAgIHNyY19zY2FuKys7CisgICAgfQorICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKKyAgICBzcmNfc2NhbisrOworICB9CiB9Ci1DRlhfQml0bWFwQ29tcG9zZXI6OkNGWF9CaXRtYXBDb21wb3NlcigpCi17Ci0gICAgbV9wU2NhbmxpbmVWID0gTlVMTDsKLSAgICBtX3BTY2FubGluZUFscGhhViA9IE5VTEw7Ci0gICAgbV9wQ2xpcFNjYW5WID0gTlVMTDsKLSAgICBtX3BBZGRDbGlwU2NhbiA9IE5VTEw7Ci0gICAgbV9iUmdiQnl0ZU9yZGVyID0gRkFMU0U7Ci0gICAgbV9CbGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUw7CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9Ob0NsaXBfUmdiQnl0ZU9yZGVyKAorICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IGRlc3RfQnBwLAorICAgIGludCBzcmNfQnBwKSB7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgIGRlc3Rfc2NhblsyXSA9IHNyY19zY2FuWzBdOworICAgIGRlc3Rfc2NhblsxXSA9IHNyY19zY2FuWzFdOworICAgIGRlc3Rfc2NhblswXSA9IHNyY19zY2FuWzJdOworICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKKyAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICB9CiB9Ci1DRlhfQml0bWFwQ29tcG9zZXI6On5DRlhfQml0bWFwQ29tcG9zZXIoKQotewotICAgIGlmIChtX3BTY2FubGluZVYpIHsKLSAgICAgICAgRlhfRnJlZShtX3BTY2FubGluZVYpOworaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9DbGlwX1JnYkJ5dGVPcmRlcigKKyAgICB1aW50OF90KiBkZXN0X3NjYW4sCisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgaW50IHdpZHRoLAorICAgIGludCBibGVuZF90eXBlLAorICAgIGludCBzcmNfQnBwLAorICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBpbnQgYmxlbmRlZF9jb2xvcnNbM107CisgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgIGludCBzcmNfYWxwaGEgPSAqY2xpcF9zY2FuKys7CisgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BKCpzcmNfc2NhbisrKTsKKyAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BKCpzcmNfc2NhbisrKTsKKyAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BKCpzcmNfc2NhbisrKTsKKyAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7CisgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpZiAobV9wU2NhbmxpbmVBbHBoYVYpIHsKLSAgICAgICAgRlhfRnJlZShtX3BTY2FubGluZUFscGhhVik7CisgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgaWYgKG1fcENsaXBTY2FuVikgewotICAgICAgICBGWF9GcmVlKG1fcENsaXBTY2FuVik7CisgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKKyAgICAgIHVpbnQ4X3QgZGVzdF9zY2FuX29bM107CisgICAgICBkZXN0X3NjYW5fb1swXSA9IGRlc3Rfc2NhblsyXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzFdID0gZGVzdF9zY2FuWzFdOworICAgICAgZGVzdF9zY2FuX29bMl0gPSBkZXN0X3NjYW5bMF07CisgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW5fbywgYmxlbmRlZF9jb2xvcnMpOwogICAgIH0KLSAgICBpZiAobV9wQWRkQ2xpcFNjYW4pIHsKLSAgICAgICAgRlhfRnJlZShtX3BBZGRDbGlwU2Nhbik7CisgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgIGludCBpbmRleCA9IDIgLSBjb2xvcjsKKyAgICAgIGludCBzcmNfY29sb3IgPSBGWF9HQU1NQSgqc3JjX3NjYW4pOworICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdCisgICAgICAgICAgICAgICAgICAgICAgICA6IF9CTEVORChibGVuZF90eXBlLCBkZXN0X3NjYW5baW5kZXhdLCBzcmNfY29sb3IpOworICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19jb2xvciwgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICBkZXN0X3NjYW5baW5kZXhdID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5baW5kZXhdLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7CisgICAgICBzcmNfc2NhbisrOwogICAgIH0KKyAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOworICB9CiB9Ci12b2lkIENGWF9CaXRtYXBDb21wb3Nlcjo6Q29tcG9zZShDRlhfRElCaXRtYXAqIHBEZXN0LCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sIGludCBiaXRtYXBfYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtYXNrX2NvbG9yLCBGWF9SRUNUJiBkZXN0X3JlY3QsIEZYX0JPT0wgYlZlcnRpY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmxpcFgsIEZYX0JPT0wgYkZsaXBZLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpCi17Ci0gICAgbV9wQml0bWFwID0gcERlc3Q7Ci0gICAgbV9wQ2xpcFJnbiA9IHBDbGlwUmduOwotICAgIG1fRGVzdExlZnQgPSBkZXN0X3JlY3QubGVmdDsKLSAgICBtX0Rlc3RUb3AgPSBkZXN0X3JlY3QudG9wOwotICAgIG1fRGVzdFdpZHRoID0gZGVzdF9yZWN0LldpZHRoKCk7Ci0gICAgbV9EZXN0SGVpZ2h0ID0gZGVzdF9yZWN0LkhlaWdodCgpOwotICAgIG1fQml0bWFwQWxwaGEgPSBiaXRtYXBfYWxwaGE7Ci0gICAgbV9NYXNrQ29sb3IgPSBtYXNrX2NvbG9yOwotICAgIG1fcENsaXBNYXNrID0gTlVMTDsKLSAgICBpZiAocENsaXBSZ24gJiYgcENsaXBSZ24tPkdldFR5cGUoKSAhPSBDRlhfQ2xpcFJnbjo6UmVjdEkpIHsKLSAgICAgICAgbV9wQ2xpcE1hc2sgPSBwQ2xpcFJnbi0+R2V0TWFzaygpOworaW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX0NsaXBfUmdiQnl0ZU9yZGVyKAorICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IGJsZW5kX3R5cGUsCisgICAgaW50IGRlc3RfQnBwLAorICAgIGludCBzcmNfQnBwLAorICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBpbnQgYmxlbmRlZF9jb2xvcnNbM107CisgIEZYX0JPT0wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgIHVpbnQ4X3Qgc3JjX2FscGhhID0gKmNsaXBfc2NhbisrOworICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOworICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBtX2JWZXJ0aWNhbCA9IGJWZXJ0aWNhbDsKLSAgICBtX2JGbGlwWCA9IGJGbGlwWDsKLSAgICBtX2JGbGlwWSA9IGJGbGlwWTsKLSAgICBtX0FscGhhRmxhZyA9IGFscGhhX2ZsYWc7Ci0gICAgbV9wSWNjVHJhbnNmb3JtID0gcEljY1RyYW5zZm9ybTsKLSAgICBtX2JSZ2JCeXRlT3JkZXIgPSBiUmdiQnl0ZU9yZGVyOwotICAgIG1fQmxlbmRUeXBlID0gYmxlbmRfdHlwZTsKKyAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CisgICAgICB1aW50OF90IGRlc3Rfc2Nhbl9vWzNdOworICAgICAgZGVzdF9zY2FuX29bMF0gPSBkZXN0X3NjYW5bMl07CisgICAgICBkZXN0X3NjYW5fb1sxXSA9IGRlc3Rfc2NhblsxXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzJdID0gZGVzdF9zY2FuWzBdOworICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuX28sIGJsZW5kZWRfY29sb3JzKTsKKyAgICB9CisgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgIGludCBpbmRleCA9IDIgLSBjb2xvcjsKKyAgICAgIGludCBzcmNfY29sb3IgPSBGWF9HQU1NQSgqc3JjX3NjYW4pOworICAgICAgaW50IGJhY2tfY29sb3IgPSBGWF9HQU1NQShkZXN0X3NjYW5baW5kZXhdKTsKKyAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCisgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQorICAgICAgICAgICAgICAgICAgICAgICAgOiBfQkxFTkQoYmxlbmRfdHlwZSwgYmFja19jb2xvciwgc3JjX2NvbG9yKTsKKyAgICAgIGRlc3Rfc2NhbltpbmRleF0gPQorICAgICAgICAgIEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoYmFja19jb2xvciwgYmxlbmRlZCwgc3JjX2FscGhhKSk7CisgICAgICBzcmNfc2NhbisrOworICAgIH0KKyAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7CisgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKKyAgfQogfQotRlhfQk9PTCBDRlhfQml0bWFwQ29tcG9zZXI6OlNldEluZm8oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlKQotewotICAgIG1fU3JjRm9ybWF0ID0gc3JjX2Zvcm1hdDsKLSAgICBpZiAoIW1fQ29tcG9zaXRvci5Jbml0KG1fcEJpdG1hcC0+R2V0Rm9ybWF0KCksIHNyY19mb3JtYXQsIHdpZHRoLCBwU3JjUGFsZXR0ZSwgbV9NYXNrQ29sb3IsIEZYRElCX0JMRU5EX05PUk1BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcENsaXBNYXNrICE9IE5VTEwgfHwgKG1fQml0bWFwQWxwaGEgPCAyNTUpLCBtX2JSZ2JCeXRlT3JkZXIsIG1fQWxwaGFGbGFnLCBtX3BJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9DbGlwX1JnYkJ5dGVPcmRlcigKKyAgICB1aW50OF90KiBkZXN0X3NjYW4sCisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgaW50IHdpZHRoLAorICAgIGludCBzcmNfQnBwLAorICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07CisgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BKCpzcmNfc2NhbisrKTsKKyAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BKCpzcmNfc2NhbisrKTsKKyAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BKCpzcmNfc2NhbisrKTsKKyAgICAgIGRlc3Rfc2NhblszXSA9IDI1NTsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpZiAobV9iVmVydGljYWwpIHsKLSAgICAgICAgbV9wU2NhbmxpbmVWID0gRlhfQWxsb2MoRlhfQllURSwgbV9wQml0bWFwLT5HZXRCUFAoKSAvIDggKiB3aWR0aCArIDQpOwotICAgICAgICBtX3BDbGlwU2NhblYgPSBGWF9BbGxvYyhGWF9CWVRFLCBtX3BCaXRtYXAtPkdldEhlaWdodCgpKTsKLSAgICAgICAgaWYgKG1fcEJpdG1hcC0+bV9wQWxwaGFNYXNrKSB7Ci0gICAgICAgICAgICBtX3BTY2FubGluZUFscGhhViA9IEZYX0FsbG9jKEZYX0JZVEUsIHdpZHRoICsgNCk7Ci0gICAgICAgIH0KKyAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpZiAobV9CaXRtYXBBbHBoYSA8IDI1NSkgewotICAgICAgICBtX3BBZGRDbGlwU2NhbiA9IEZYX0FsbG9jKEZYX0JZVEUsIG1fYlZlcnRpY2FsID8gbV9wQml0bWFwLT5HZXRIZWlnaHQoKSA6IG1fcEJpdG1hcC0+R2V0V2lkdGgoKSk7CisgICAgaW50IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CisgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7CisgICAgICBpbnQgaW5kZXggPSAyIC0gY29sb3I7CisgICAgICBkZXN0X3NjYW5baW5kZXhdID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5baW5kZXhdLCBGWF9HQU1NQSgqc3JjX3NjYW4pLCBhbHBoYV9yYXRpbyk7CisgICAgICBzcmNfc2NhbisrOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOworICB9CiB9Ci12b2lkIENGWF9CaXRtYXBDb21wb3Nlcjo6RG9Db21wb3NlKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQ0JZVEUgc3JjX3NjYW4sIGludCBkZXN0X3dpZHRoLCBGWF9MUENCWVRFIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBDQllURSBzcmNfZXh0cmFfYWxwaGEsIEZYX0xQQllURSBkc3RfZXh0cmFfYWxwaGEpCi17Ci0gICAgaWYgKG1fQml0bWFwQWxwaGEgPCAyNTUpIHsKLSAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXN0X3dpZHRoOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgbV9wQWRkQ2xpcFNjYW5baV0gPSBjbGlwX3NjYW5baV0gKiBtX0JpdG1hcEFscGhhIC8gMjU1OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRlhTWVNfbWVtc2V0OChtX3BBZGRDbGlwU2NhbiwgbV9CaXRtYXBBbHBoYSwgZGVzdF93aWR0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2xpcF9zY2FuID0gbV9wQWRkQ2xpcFNjYW47CitpbmxpbmUgdm9pZCBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9DbGlwX1JnYkJ5dGVPcmRlcigKKyAgICB1aW50OF90KiBkZXN0X3NjYW4sCisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgaW50IHdpZHRoLAorICAgIGludCBkZXN0X0JwcCwKKyAgICBpbnQgc3JjX0JwcCwKKyAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOworICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgICBkZXN0X3NjYW5bMl0gPSBzcmNfc2NhblswXTsKKyAgICAgIGRlc3Rfc2NhblsxXSA9IHNyY19zY2FuWzFdOworICAgICAgZGVzdF9zY2FuWzBdID0gc3JjX3NjYW5bMl07CisgICAgfSBlbHNlIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoCisgICAgICAgICAgRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgRlhfR0FNTUEoKnNyY19zY2FuKSwgc3JjX2FscGhhKSk7CisgICAgICBzcmNfc2NhbisrOworICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRSgKKyAgICAgICAgICBGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBGWF9HQU1NQSgqc3JjX3NjYW4pLCBzcmNfYWxwaGEpKTsKKyAgICAgIHNyY19zY2FuKys7CisgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKAorICAgICAgICAgIEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIEZYX0dBTU1BKCpzcmNfc2NhbiksIHNyY19hbHBoYSkpOworICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOworICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcCAtIDI7CisgICAgICBjb250aW51ZTsKICAgICB9Ci0gICAgaWYgKG1fU3JjRm9ybWF0ID09IEZYRElCXzhicHBNYXNrKSB7Ci0gICAgICAgIG1fQ29tcG9zaXRvci5Db21wb3NpdGVCeXRlTWFza0xpbmUoZGVzdF9zY2FuLCBzcmNfc2NhbiwgZGVzdF93aWR0aCwgY2xpcF9zY2FuLCBkc3RfZXh0cmFfYWxwaGEpOwotICAgIH0gZWxzZSBpZiAoKG1fU3JjRm9ybWF0ICYgMHhmZikgPT0gOCkgewotICAgICAgICBtX0NvbXBvc2l0b3IuQ29tcG9zaXRlUGFsQml0bWFwTGluZShkZXN0X3NjYW4sIHNyY19zY2FuLCAwLCBkZXN0X3dpZHRoLCBjbGlwX3NjYW4sIHNyY19leHRyYV9hbHBoYSwgZHN0X2V4dHJhX2FscGhhKTsKKyAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7CisgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgfQorfQoraW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd184YnBwUmdiMlJnYl9Ob0JsZW5kX1JnYkJ5dGVPcmRlcigKKyAgICB1aW50OF90KiBkZXN0X3NjYW4sCisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgRlhfQVJHQiogcFBhbGV0dGUsCisgICAgaW50IHBpeGVsX2NvdW50LAorICAgIGludCBEZXN0QnBwLAorICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBGWF9BUkdCIGFyZ2IgPSBwUGFsZXR0ZSA/IHBQYWxldHRlWypzcmNfc2Nhbl0gOiAoKnNyY19zY2FuKSAqIDB4MDEwMTAxOworICAgIGludCBzcmNfciA9IEZYQVJHQl9SKGFyZ2IpOworICAgIGludCBzcmNfZyA9IEZYQVJHQl9HKGFyZ2IpOworICAgIGludCBzcmNfYiA9IEZYQVJHQl9CKGFyZ2IpOworICAgIGlmIChjbGlwX3NjYW4gJiYgY2xpcF9zY2FuW2NvbF0gPCAyNTUpIHsKKyAgICAgIGRlc3Rfc2NhblsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgc3JjX2IsIGNsaXBfc2Nhbltjb2xdKTsKKyAgICAgIGRlc3Rfc2NhblsxXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgc3JjX2csIGNsaXBfc2Nhbltjb2xdKTsKKyAgICAgIGRlc3Rfc2NhblswXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgc3JjX3IsIGNsaXBfc2Nhbltjb2xdKTsKICAgICB9IGVsc2UgewotICAgICAgICBtX0NvbXBvc2l0b3IuQ29tcG9zaXRlUmdiQml0bWFwTGluZShkZXN0X3NjYW4sIHNyY19zY2FuLCBkZXN0X3dpZHRoLCBjbGlwX3NjYW4sIHNyY19leHRyYV9hbHBoYSwgZHN0X2V4dHJhX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19iOworICAgICAgZGVzdF9zY2FuWzFdID0gc3JjX2c7CisgICAgICBkZXN0X3NjYW5bMF0gPSBzcmNfcjsKICAgICB9CisgICAgZGVzdF9zY2FuICs9IERlc3RCcHA7CisgICAgc3JjX3NjYW4rKzsKKyAgfQogfQotdm9pZCBDRlhfQml0bWFwQ29tcG9zZXI6OkNvbXBvc2VTY2FubGluZShpbnQgbGluZSwgRlhfTFBDQllURSBzY2FubGluZSwgRlhfTFBDQllURSBzY2FuX2V4dHJhX2FscGhhKQotewotICAgIGlmIChtX2JWZXJ0aWNhbCkgewotICAgICAgICBDb21wb3NlU2NhbmxpbmVWKGxpbmUsIHNjYW5saW5lLCBzY2FuX2V4dHJhX2FscGhhKTsKK2lubGluZSB2b2lkIF9Db21wb3NpdGVSb3dfMWJwcFJnYjJSZ2JfTm9CbGVuZF9SZ2JCeXRlT3JkZXIoCisgICAgdWludDhfdCogZGVzdF9zY2FuLAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgIGludCBzcmNfbGVmdCwKKyAgICBGWF9BUkdCKiBwUGFsZXR0ZSwKKyAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgaW50IERlc3RCcHAsCisgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7CisgIGludCByZXNldF9yLCByZXNldF9nLCByZXNldF9iOworICBpbnQgc2V0X3IsIHNldF9nLCBzZXRfYjsKKyAgaWYgKHBQYWxldHRlKSB7CisgICAgcmVzZXRfciA9IEZYQVJHQl9SKHBQYWxldHRlWzBdKTsKKyAgICByZXNldF9nID0gRlhBUkdCX0cocFBhbGV0dGVbMF0pOworICAgIHJlc2V0X2IgPSBGWEFSR0JfQihwUGFsZXR0ZVswXSk7CisgICAgc2V0X3IgPSBGWEFSR0JfUihwUGFsZXR0ZVsxXSk7CisgICAgc2V0X2cgPSBGWEFSR0JfRyhwUGFsZXR0ZVsxXSk7CisgICAgc2V0X2IgPSBGWEFSR0JfQihwUGFsZXR0ZVsxXSk7CisgIH0gZWxzZSB7CisgICAgcmVzZXRfciA9IHJlc2V0X2cgPSByZXNldF9iID0gMDsKKyAgICBzZXRfciA9IHNldF9nID0gc2V0X2IgPSAyNTU7CisgIH0KKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgaW50IHNyY19yLCBzcmNfZywgc3JjX2I7CisgICAgaWYgKHNyY19zY2FuWyhjb2wgKyBzcmNfbGVmdCkgLyA4XSAmICgxIDw8ICg3IC0gKGNvbCArIHNyY19sZWZ0KSAlIDgpKSkgeworICAgICAgc3JjX3IgPSBzZXRfcjsKKyAgICAgIHNyY19nID0gc2V0X2c7CisgICAgICBzcmNfYiA9IHNldF9iOworICAgIH0gZWxzZSB7CisgICAgICBzcmNfciA9IHJlc2V0X3I7CisgICAgICBzcmNfZyA9IHJlc2V0X2c7CisgICAgICBzcmNfYiA9IHJlc2V0X2I7CisgICAgfQorICAgIGlmIChjbGlwX3NjYW4gJiYgY2xpcF9zY2FuW2NvbF0gPCAyNTUpIHsKKyAgICAgIGRlc3Rfc2NhblsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgc3JjX2IsIGNsaXBfc2Nhbltjb2xdKTsKKyAgICAgIGRlc3Rfc2NhblsxXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgc3JjX2csIGNsaXBfc2Nhbltjb2xdKTsKKyAgICAgIGRlc3Rfc2NhblswXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgc3JjX3IsIGNsaXBfc2Nhbltjb2xdKTsKKyAgICB9IGVsc2UgeworICAgICAgZGVzdF9zY2FuWzJdID0gc3JjX2I7CisgICAgICBkZXN0X3NjYW5bMV0gPSBzcmNfZzsKKyAgICAgIGRlc3Rfc2NhblswXSA9IHNyY19yOworICAgIH0KKyAgICBkZXN0X3NjYW4gKz0gRGVzdEJwcDsKKyAgfQorfQoraW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd184YnBwUmdiMkFyZ2JfTm9CbGVuZF9SZ2JCeXRlT3JkZXIoCisgICAgdWludDhfdCogZGVzdF9zY2FuLAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgIGludCB3aWR0aCwKKyAgICBGWF9BUkdCKiBwUGFsZXR0ZSwKKyAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgaW50IHNyY19yLCBzcmNfZywgc3JjX2I7CisgICAgaWYgKHBQYWxldHRlKSB7CisgICAgICBGWF9BUkdCIGFyZ2IgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOworICAgICAgc3JjX3IgPSBGWEFSR0JfUihhcmdiKTsKKyAgICAgIHNyY19nID0gRlhBUkdCX0coYXJnYik7CisgICAgICBzcmNfYiA9IEZYQVJHQl9CKGFyZ2IpOworICAgIH0gZWxzZSB7CisgICAgICBzcmNfciA9IHNyY19nID0gc3JjX2IgPSAqc3JjX3NjYW47CisgICAgfQorICAgIGlmICghY2xpcF9zY2FuIHx8IGNsaXBfc2Nhbltjb2xdID09IDI1NSkgeworICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUEoc3JjX2IpOworICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUEoc3JjX2cpOworICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUEoc3JjX3IpOworICAgICAgZGVzdF9zY2FuWzNdID0gMjU1OworICAgICAgc3JjX3NjYW4rKzsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgY29udGludWU7CisgICAgfQorICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXTsKKyAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgc3JjX3NjYW4rKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKKyAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOworICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgZGVzdF9zY2FuWzJdID0KKyAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBGWF9HQU1NQShzcmNfYiksIGFscGhhX3JhdGlvKTsKKyAgICBkZXN0X3NjYW5bMV0gPQorICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIEZYX0dBTU1BKHNyY19nKSwgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhblswXSA9CisgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgRlhfR0FNTUEoc3JjX3IpLCBhbHBoYV9yYXRpbyk7CisgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgc3JjX3NjYW4rKzsKKyAgfQorfQoraW5saW5lIHZvaWQgX0NvbXBvc2l0ZVJvd18xYnBwUmdiMkFyZ2JfTm9CbGVuZF9SZ2JCeXRlT3JkZXIoCisgICAgdWludDhfdCogZGVzdF9zY2FuLAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgIGludCBzcmNfbGVmdCwKKyAgICBpbnQgd2lkdGgsCisgICAgRlhfQVJHQiogcFBhbGV0dGUsCisgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7CisgIGludCByZXNldF9yLCByZXNldF9nLCByZXNldF9iOworICBpbnQgc2V0X3IsIHNldF9nLCBzZXRfYjsKKyAgaWYgKHBQYWxldHRlKSB7CisgICAgcmVzZXRfciA9IEZYQVJHQl9SKHBQYWxldHRlWzBdKTsKKyAgICByZXNldF9nID0gRlhBUkdCX0cocFBhbGV0dGVbMF0pOworICAgIHJlc2V0X2IgPSBGWEFSR0JfQihwUGFsZXR0ZVswXSk7CisgICAgc2V0X3IgPSBGWEFSR0JfUihwUGFsZXR0ZVsxXSk7CisgICAgc2V0X2cgPSBGWEFSR0JfRyhwUGFsZXR0ZVsxXSk7CisgICAgc2V0X2IgPSBGWEFSR0JfQihwUGFsZXR0ZVsxXSk7CisgIH0gZWxzZSB7CisgICAgcmVzZXRfciA9IHJlc2V0X2cgPSByZXNldF9iID0gMDsKKyAgICBzZXRfciA9IHNldF9nID0gc2V0X2IgPSAyNTU7CisgIH0KKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgaW50IHNyY19yLCBzcmNfZywgc3JjX2I7CisgICAgaWYgKHNyY19zY2FuWyhjb2wgKyBzcmNfbGVmdCkgLyA4XSAmICgxIDw8ICg3IC0gKGNvbCArIHNyY19sZWZ0KSAlIDgpKSkgeworICAgICAgc3JjX3IgPSBzZXRfcjsKKyAgICAgIHNyY19nID0gc2V0X2c7CisgICAgICBzcmNfYiA9IHNldF9iOworICAgIH0gZWxzZSB7CisgICAgICBzcmNfciA9IHJlc2V0X3I7CisgICAgICBzcmNfZyA9IHJlc2V0X2c7CisgICAgICBzcmNfYiA9IHJlc2V0X2I7CisgICAgfQorICAgIGlmICghY2xpcF9zY2FuIHx8IGNsaXBfc2Nhbltjb2xdID09IDI1NSkgeworICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUEoc3JjX2IpOworICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUEoc3JjX2cpOworICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUEoc3JjX3IpOworICAgICAgZGVzdF9zY2FuWzNdID0gMjU1OworICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOworICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CisgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgIGRlc3Rfc2NhblsyXSA9CisgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgRlhfR0FNTUEoc3JjX2IpLCBhbHBoYV9yYXRpbyk7CisgICAgZGVzdF9zY2FuWzFdID0KKyAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBGWF9HQU1NQShzcmNfZyksIGFscGhhX3JhdGlvKTsKKyAgICBkZXN0X3NjYW5bMF0gPQorICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIEZYX0dBTU1BKHNyY19yKSwgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhbiArPSA0OworICB9Cit9Cit2b2lkIF9Db21wb3NpdGVSb3dfQnl0ZU1hc2syQXJnYl9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgaW50IHNyY19hbHBoYTsKKyAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OworICAgIH0gZWxzZSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogc3JjX3NjYW5bY29sXSAvIDI1NTsKKyAgICB9CisgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgIEZYQVJHQl9TRVRSR0JPUkRFUkRJQihkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX01BS0Uoc3JjX2FscGhhLCBzcmNfciwgc3JjX2csIHNyY19iKSk7CisgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgY29udGludWU7CisgICAgfQorICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICBpZiAoYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEUpIHsKKyAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgICAgIHVpbnQ4X3Qgc3JjX3NjYW5bM107CisgICAgICB1aW50OF90IGRlc3Rfc2Nhbl9vWzNdOworICAgICAgc3JjX3NjYW5bMF0gPSBzcmNfYjsKKyAgICAgIHNyY19zY2FuWzFdID0gc3JjX2c7CisgICAgICBzcmNfc2NhblsyXSA9IHNyY19yOworICAgICAgZGVzdF9zY2FuX29bMF0gPSBkZXN0X3NjYW5bMl07CisgICAgICBkZXN0X3NjYW5fb1sxXSA9IGRlc3Rfc2NhblsxXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzJdID0gZGVzdF9zY2FuWzBdOworICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuX28sIGJsZW5kZWRfY29sb3JzKTsKKyAgICAgIGRlc3Rfc2NhblsyXSA9CisgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBibGVuZGVkX2NvbG9yc1swXSwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuWzFdID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIGJsZW5kZWRfY29sb3JzWzFdLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW5bMF0gPQorICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgYmxlbmRlZF9jb2xvcnNbMl0sIGFscGhhX3JhdGlvKTsKKyAgICB9IGVsc2UgaWYgKGJsZW5kX3R5cGUpIHsKKyAgICAgIGludCBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsIGRlc3Rfc2NhblsyXSwgc3JjX2IpOworICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19iLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhblsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOworICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCBkZXN0X3NjYW5bMV0sIHNyY19nKTsKKyAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfZywgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICBkZXN0X3NjYW5bMV0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgIGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgZGVzdF9zY2FuWzBdLCBzcmNfcik7CisgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX3IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgZGVzdF9zY2FuWzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRlc3Rfc2NhblsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgc3JjX2IsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhblsxXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgc3JjX2csIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhblswXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgc3JjX3IsIGFscGhhX3JhdGlvKTsKKyAgICB9CisgICAgZGVzdF9zY2FuICs9IDQ7CisgIH0KK30KK3ZvaWQgX0NvbXBvc2l0ZVJvd19CeXRlTWFzazJSZ2JfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgaW50IHNyY19hbHBoYTsKKyAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OworICAgIH0gZWxzZSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogc3JjX3NjYW5bY29sXSAvIDI1NTsKKyAgICB9CisgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSkgeworICAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOworICAgICAgdWludDhfdCBzcmNfc2NhblszXTsKKyAgICAgIHVpbnQ4X3QgZGVzdF9zY2FuX29bM107CisgICAgICBzcmNfc2NhblswXSA9IHNyY19iOworICAgICAgc3JjX3NjYW5bMV0gPSBzcmNfZzsKKyAgICAgIHNyY19zY2FuWzJdID0gc3JjX3I7CisgICAgICBkZXN0X3NjYW5fb1swXSA9IGRlc3Rfc2NhblsyXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzFdID0gZGVzdF9zY2FuWzFdOworICAgICAgZGVzdF9zY2FuX29bMl0gPSBkZXN0X3NjYW5bMF07CisgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW5fbywgYmxlbmRlZF9jb2xvcnMpOworICAgICAgZGVzdF9zY2FuWzJdID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIGJsZW5kZWRfY29sb3JzWzBdLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuWzFdID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIGJsZW5kZWRfY29sb3JzWzFdLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuWzBdID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIGJsZW5kZWRfY29sb3JzWzJdLCBzcmNfYWxwaGEpOworICAgIH0gZWxzZSBpZiAoYmxlbmRfdHlwZSkgeworICAgICAgaW50IGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgZGVzdF9zY2FuWzJdLCBzcmNfYik7CisgICAgICBkZXN0X3NjYW5bMl0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIGJsZW5kZWQsIHNyY19hbHBoYSk7CisgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsIGRlc3Rfc2NhblsxXSwgc3JjX2cpOworICAgICAgZGVzdF9zY2FuWzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBibGVuZGVkLCBzcmNfYWxwaGEpOworICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCBkZXN0X3NjYW5bMF0sIHNyY19yKTsKKyAgICAgIGRlc3Rfc2NhblswXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgYmxlbmRlZCwgc3JjX2FscGhhKTsKKyAgICB9IGVsc2UgeworICAgICAgZGVzdF9zY2FuWzJdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBzcmNfYiwgc3JjX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhblsxXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgc3JjX2csIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW5bMF0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIHNyY19yLCBzcmNfYWxwaGEpOworICAgIH0KKyAgICBkZXN0X3NjYW4gKz0gQnBwOworICB9Cit9Cit2b2lkIF9Db21wb3NpdGVSb3dfQml0TWFzazJBcmdiX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgaWYgKGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTk9STUFMICYmICFjbGlwX3NjYW4gJiYgbWFza19hbHBoYSA9PSAyNTUpIHsKKyAgICBGWF9BUkdCIGFyZ2IgPSBGWEFSR0JfTUFLRSgweGZmLCBzcmNfciwgc3JjX2csIHNyY19iKTsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgIGlmIChzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpIHsKKyAgICAgICAgRlhBUkdCX1NFVFJHQk9SREVSRElCKGRlc3Rfc2NhbiwgYXJnYik7CisgICAgICB9CisgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgIGlmICghKHNyY19zY2FuWyhzcmNfbGVmdCArIGNvbCkgLyA4XSAmICgxIDw8ICg3IC0gKHNyY19sZWZ0ICsgY29sKSAlIDgpKSkpIHsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgY29udGludWU7CisgICAgfQorICAgIGludCBzcmNfYWxwaGE7CisgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgIH0gZWxzZSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhOworICAgIH0KKyAgICB1aW50OF90IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CisgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgRlhBUkdCX1NFVFJHQk9SREVSRElCKGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfTUFLRShzcmNfYWxwaGEsIHNyY19yLCBzcmNfZywgc3JjX2IpKTsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgY29udGludWU7CisgICAgfQorICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICBpZiAoYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEUpIHsKKyAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgICAgIHVpbnQ4X3Qgc3JjX3NjYW5bM107CisgICAgICB1aW50OF90IGRlc3Rfc2Nhbl9vWzNdOworICAgICAgc3JjX3NjYW5bMF0gPSBzcmNfYjsKKyAgICAgIHNyY19zY2FuWzFdID0gc3JjX2c7CisgICAgICBzcmNfc2NhblsyXSA9IHNyY19yOworICAgICAgZGVzdF9zY2FuX29bMF0gPSBkZXN0X3NjYW5bMl07CisgICAgICBkZXN0X3NjYW5fb1sxXSA9IGRlc3Rfc2NhblsxXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzJdID0gZGVzdF9zY2FuWzBdOworICAgICAgX1JHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuX28sIGJsZW5kZWRfY29sb3JzKTsKKyAgICAgIGRlc3Rfc2NhblsyXSA9CisgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBibGVuZGVkX2NvbG9yc1swXSwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuWzFdID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIGJsZW5kZWRfY29sb3JzWzFdLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW5bMF0gPQorICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgYmxlbmRlZF9jb2xvcnNbMl0sIGFscGhhX3JhdGlvKTsKKyAgICB9IGVsc2UgaWYgKGJsZW5kX3R5cGUpIHsKKyAgICAgIGludCBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsIGRlc3Rfc2NhblsyXSwgc3JjX2IpOworICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19iLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhblsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOworICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCBkZXN0X3NjYW5bMV0sIHNyY19nKTsKKyAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfZywgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICBkZXN0X3NjYW5bMV0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgIGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgZGVzdF9zY2FuWzBdLCBzcmNfcik7CisgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX3IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgZGVzdF9zY2FuWzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRlc3Rfc2NhblsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgc3JjX2IsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhblsxXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgc3JjX2csIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhblswXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgc3JjX3IsIGFscGhhX3JhdGlvKTsKKyAgICB9CisgICAgZGVzdF9zY2FuICs9IDQ7CisgIH0KK30KK3ZvaWQgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMlJnYl9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7CisgIGlmIChibGVuZF90eXBlID09IEZYRElCX0JMRU5EX05PUk1BTCAmJiAhY2xpcF9zY2FuICYmIG1hc2tfYWxwaGEgPT0gMjU1KSB7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICBpZiAoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSB7CisgICAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19iOworICAgICAgICBkZXN0X3NjYW5bMV0gPSBzcmNfZzsKKyAgICAgICAgZGVzdF9zY2FuWzBdID0gc3JjX3I7CisgICAgICB9CisgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgaWYgKCEoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSkgeworICAgICAgZGVzdF9zY2FuICs9IEJwcDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgc3JjX2FscGhhOworICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYTsKKyAgICB9CisgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSkgeworICAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOworICAgICAgdWludDhfdCBzcmNfc2NhblszXTsKKyAgICAgIHVpbnQ4X3QgZGVzdF9zY2FuX29bM107CisgICAgICBzcmNfc2NhblswXSA9IHNyY19iOworICAgICAgc3JjX3NjYW5bMV0gPSBzcmNfZzsKKyAgICAgIHNyY19zY2FuWzJdID0gc3JjX3I7CisgICAgICBkZXN0X3NjYW5fb1swXSA9IGRlc3Rfc2NhblsyXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzFdID0gZGVzdF9zY2FuWzFdOworICAgICAgZGVzdF9zY2FuX29bMl0gPSBkZXN0X3NjYW5bMF07CisgICAgICBfUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW5fbywgYmxlbmRlZF9jb2xvcnMpOworICAgICAgZGVzdF9zY2FuWzJdID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIGJsZW5kZWRfY29sb3JzWzBdLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuWzFdID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIGJsZW5kZWRfY29sb3JzWzFdLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuWzBdID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIGJsZW5kZWRfY29sb3JzWzJdLCBzcmNfYWxwaGEpOworICAgIH0gZWxzZSBpZiAoYmxlbmRfdHlwZSkgeworICAgICAgaW50IGJhY2tfY29sb3IgPSBGWF9HQU1NQShkZXN0X3NjYW5bMl0pOworICAgICAgaW50IGJsZW5kZWQgPSBfQkxFTkQoYmxlbmRfdHlwZSwgYmFja19jb2xvciwgc3JjX2IpOworICAgICAgZGVzdF9zY2FuWzJdID0KKyAgICAgICAgICBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKGJhY2tfY29sb3IsIGJsZW5kZWQsIHNyY19hbHBoYSkpOworICAgICAgYmFja19jb2xvciA9IEZYX0dBTU1BKGRlc3Rfc2NhblsxXSk7CisgICAgICBibGVuZGVkID0gX0JMRU5EKGJsZW5kX3R5cGUsIGJhY2tfY29sb3IsIHNyY19nKTsKKyAgICAgIGRlc3Rfc2NhblsxXSA9CisgICAgICAgICAgRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShiYWNrX2NvbG9yLCBibGVuZGVkLCBzcmNfYWxwaGEpKTsKKyAgICAgIGJhY2tfY29sb3IgPSBGWF9HQU1NQShkZXN0X3NjYW5bMF0pOworICAgICAgYmxlbmRlZCA9IF9CTEVORChibGVuZF90eXBlLCBiYWNrX2NvbG9yLCBzcmNfcik7CisgICAgICBkZXN0X3NjYW5bMF0gPQorICAgICAgICAgIEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoYmFja19jb2xvciwgYmxlbmRlZCwgc3JjX2FscGhhKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgc3JjX2IsIHNyY19hbHBoYSkpOworICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBzcmNfZywgc3JjX2FscGhhKSk7CisgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIHNyY19yLCBzcmNfYWxwaGEpKTsKKyAgICB9CisgICAgZGVzdF9zY2FuICs9IEJwcDsKKyAgfQorfQoraW5saW5lIEZYX0JPT0wgX1NjYW5saW5lQ29tcG9zaXRvcl9Jbml0U291cmNlTWFzayhGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtYXNrX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG1hc2tfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbWFza19yZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbWFza19ncmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBtYXNrX2JsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbWFza19ibGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogaWNjX21vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gKElDb2RlY19JY2NNb2R1bGUqKWljY19tb2R1bGU7CisgIGlmIChhbHBoYV9mbGFnID4+IDgpIHsKKyAgICBtYXNrX2FscGhhID0gYWxwaGFfZmxhZyAmIDB4ZmY7CisgICAgbWFza19yZWQgPSBGWFNZU19HZXRDVmFsdWUobWFza19jb2xvcik7CisgICAgbWFza19ncmVlbiA9IEZYU1lTX0dldE1WYWx1ZShtYXNrX2NvbG9yKTsKKyAgICBtYXNrX2JsdWUgPSBGWFNZU19HZXRZVmFsdWUobWFza19jb2xvcik7CisgICAgbWFza19ibGFjayA9IEZYU1lTX0dldEtWYWx1ZShtYXNrX2NvbG9yKTsKKyAgfSBlbHNlIHsKKyAgICBtYXNrX2FscGhhID0gRlhBUkdCX0EobWFza19jb2xvcik7CisgICAgbWFza19yZWQgPSBGWEFSR0JfUihtYXNrX2NvbG9yKTsKKyAgICBtYXNrX2dyZWVuID0gRlhBUkdCX0cobWFza19jb2xvcik7CisgICAgbWFza19ibHVlID0gRlhBUkdCX0IobWFza19jb2xvcik7CisgIH0KKyAgaWYgKGRlc3RfZm9ybWF0ID09IEZYRElCXzhicHBNYXNrKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKChkZXN0X2Zvcm1hdCAmIDB4ZmYpID09IDgpIHsKKyAgICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgICAgbWFza19jb2xvciA9IChhbHBoYV9mbGFnID4+IDgpID8gRlhDTVlLX1RPRElCKG1hc2tfY29sb3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGWEFSR0JfVE9ESUIobWFza19jb2xvcik7CisgICAgICB1aW50OF90KiBncmF5X3AgPSAodWludDhfdCopJm1hc2tfY29sb3I7CisgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBncmF5X3AsIGdyYXlfcCwgMSk7CisgICAgICBtYXNrX3JlZCA9IGRlc3RfZm9ybWF0ICYgMHgwNDAwID8gRlhfQ0NPTE9SKGdyYXlfcFswXSkgOiBncmF5X3BbMF07CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChhbHBoYV9mbGFnID4+IDgpIHsKKyAgICAgICAgdWludDhfdCByLCBnLCBiOworICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEobWFza19yZWQsIG1hc2tfZ3JlZW4sIG1hc2tfYmx1ZSwgbWFza19ibGFjaywgciwgZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGIpOworICAgICAgICBtYXNrX3JlZCA9IEZYUkdCMkdSQVkociwgZywgYik7CisgICAgICB9IGVsc2UgeworICAgICAgICBtYXNrX3JlZCA9IEZYUkdCMkdSQVkobWFza19yZWQsIG1hc2tfZ3JlZW4sIG1hc2tfYmx1ZSk7CisgICAgICB9CisgICAgICBpZiAoZGVzdF9mb3JtYXQgJiAweDA0MDApIHsKKyAgICAgICAgbWFza19yZWQgPSBGWF9DQ09MT1IobWFza19yZWQpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICB1aW50OF90KiBtYXNrX2NvbG9yX3AgPSAodWludDhfdCopJm1hc2tfY29sb3I7CisgICAgbWFza19jb2xvciA9CisgICAgICAgIChhbHBoYV9mbGFnID4+IDgpID8gRlhDTVlLX1RPRElCKG1hc2tfY29sb3IpIDogRlhBUkdCX1RPRElCKG1hc2tfY29sb3IpOworICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7CisgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBtYXNrX2NvbG9yX3AsIG1hc2tfY29sb3JfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgbWFza19yZWQgPSBtYXNrX2NvbG9yX3BbMl07CisgICAgICBtYXNrX2dyZWVuID0gbWFza19jb2xvcl9wWzFdOworICAgICAgbWFza19ibHVlID0gbWFza19jb2xvcl9wWzBdOworICAgIH0gZWxzZSBpZiAoYWxwaGFfZmxhZyA+PiA4KSB7CisgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEobWFza19jb2xvcl9wWzBdLCBtYXNrX2NvbG9yX3BbMV0sIG1hc2tfY29sb3JfcFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrX2NvbG9yX3BbM10sIG1hc2tfY29sb3JfcFsyXSwgbWFza19jb2xvcl9wWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tfY29sb3JfcFswXSk7CisgICAgICBtYXNrX3JlZCA9IG1hc2tfY29sb3JfcFsyXTsKKyAgICAgIG1hc2tfZ3JlZW4gPSBtYXNrX2NvbG9yX3BbMV07CisgICAgICBtYXNrX2JsdWUgPSBtYXNrX2NvbG9yX3BbMF07CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQoraW5saW5lIHZvaWQgX1NjYW5saW5lQ29tcG9zaXRvcl9Jbml0U291cmNlUGFsZXR0ZShGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRComIHBEZXN0UGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBTcmNQYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBpY2NfbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSAoSUNvZGVjX0ljY01vZHVsZSopaWNjX21vZHVsZTsKKyAgRlhfQk9PTCBpc1NyY0NteWsgPSAhIShzcmNfZm9ybWF0ICYgMHgwNDAwKTsKKyAgRlhfQk9PTCBpc0RzdENteWsgPSAhIShkZXN0X2Zvcm1hdCAmIDB4MDQwMCk7CisgIHBEZXN0UGFsZXR0ZSA9IE5VTEw7CisgIGlmIChwSWNjVHJhbnNmb3JtKSB7CisgICAgaWYgKHBTcmNQYWxldHRlKSB7CisgICAgICBpZiAoKGRlc3RfZm9ybWF0ICYgMHhmZikgPT0gOCkgeworICAgICAgICBpbnQgcGFsX2NvdW50ID0gMSA8PCAoc3JjX2Zvcm1hdCAmIDB4ZmYpOworICAgICAgICB1aW50OF90KiBncmF5X3BhbCA9IEZYX0FsbG9jKHVpbnQ4X3QsIHBhbF9jb3VudCk7CisgICAgICAgIHBEZXN0UGFsZXR0ZSA9IChGWF9EV09SRCopZ3JheV9wYWw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsX2NvdW50OyBpKyspIHsKKyAgICAgICAgICBGWF9EV09SRCBjb2xvciA9IGlzU3JjQ215ayA/IEZYQ01ZS19UT0RJQihwU3JjUGFsZXR0ZVtpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZYQVJHQl9UT0RJQihwU3JjUGFsZXR0ZVtpXSk7CisgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZ3JheV9wYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKSZjb2xvciwgMSk7CisgICAgICAgICAgZ3JheV9wYWwrKzsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHBhbHNpemUgPSAxIDw8IChzcmNfZm9ybWF0ICYgMHhmZik7CisgICAgICAgIHBEZXN0UGFsZXR0ZSA9IEZYX0FsbG9jKEZYX0RXT1JELCBwYWxzaXplKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWxzaXplOyBpKyspIHsKKyAgICAgICAgICBGWF9EV09SRCBjb2xvciA9IGlzU3JjQ215ayA/IEZYQ01ZS19UT0RJQihwU3JjUGFsZXR0ZVtpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZYQVJHQl9UT0RJQihwU3JjUGFsZXR0ZVtpXSk7CisgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKHVpbnQ4X3QqKSZjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopJmNvbG9yLCAxKTsKKyAgICAgICAgICBwRGVzdFBhbGV0dGVbaV0gPQorICAgICAgICAgICAgICBpc0RzdENteWsgPyBGWENNWUtfVE9ESUIoY29sb3IpIDogRlhBUkdCX1RPRElCKGNvbG9yKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpbnQgcGFsX2NvdW50ID0gMSA8PCAoc3JjX2Zvcm1hdCAmIDB4ZmYpOworICAgICAgdWludDhfdCogZ3JheV9wYWwgPSBGWF9BbGxvYyh1aW50OF90LCBwYWxfY291bnQpOworICAgICAgaWYgKHBhbF9jb3VudCA9PSAyKSB7CisgICAgICAgIGdyYXlfcGFsWzBdID0gMDsKKyAgICAgICAgZ3JheV9wYWxbMV0gPSAyNTU7CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhbF9jb3VudDsgaSsrKSB7CisgICAgICAgICAgZ3JheV9wYWxbaV0gPSBpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoKGRlc3RfZm9ybWF0ICYgMHhmZikgPT0gOCkgeworICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBncmF5X3BhbCwgZ3JheV9wYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbF9jb3VudCk7CisgICAgICAgIHBEZXN0UGFsZXR0ZSA9IChGWF9EV09SRCopZ3JheV9wYWw7CisgICAgICB9IGVsc2UgeworICAgICAgICBwRGVzdFBhbGV0dGUgPSBGWF9BbGxvYyhGWF9EV09SRCwgcGFsX2NvdW50KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWxfY291bnQ7IGkrKykgeworICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKAorICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtLCAodWludDhfdCopJnBEZXN0UGFsZXR0ZVtpXSwgJmdyYXlfcGFsW2ldLCAxKTsKKyAgICAgICAgICBwRGVzdFBhbGV0dGVbaV0gPSBpc0RzdENteWsgPyBGWENNWUtfVE9ESUIocERlc3RQYWxldHRlW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZYQVJHQl9UT0RJQihwRGVzdFBhbGV0dGVbaV0pOworICAgICAgICB9CisgICAgICAgIEZYX0ZyZWUoZ3JheV9wYWwpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAocFNyY1BhbGV0dGUpIHsKKyAgICAgIGlmICgoZGVzdF9mb3JtYXQgJiAweGZmKSA9PSA4KSB7CisgICAgICAgIGludCBwYWxfY291bnQgPSAxIDw8IChzcmNfZm9ybWF0ICYgMHhmZik7CisgICAgICAgIHVpbnQ4X3QqIGdyYXlfcGFsID0gRlhfQWxsb2ModWludDhfdCwgcGFsX2NvdW50KTsKKyAgICAgICAgcERlc3RQYWxldHRlID0gKEZYX0RXT1JEKilncmF5X3BhbDsKKyAgICAgICAgaWYgKGlzU3JjQ215aykgeworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIEZYX0NNWUsgY215ayA9IHBTcmNQYWxldHRlW2ldOworICAgICAgICAgICAgdWludDhfdCByLCBnLCBiOworICAgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShjbXlrKSwgRlhTWVNfR2V0TVZhbHVlKGNteWspLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX0dldFlWYWx1ZShjbXlrKSwgRlhTWVNfR2V0S1ZhbHVlKGNteWspLCByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcsIGIpOworICAgICAgICAgICAgKmdyYXlfcGFsKysgPSBGWFJHQjJHUkFZKHIsIGcsIGIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWxfY291bnQ7IGkrKykgeworICAgICAgICAgICAgRlhfQVJHQiBhcmdiID0gcFNyY1BhbGV0dGVbaV07CisgICAgICAgICAgICAqZ3JheV9wYWwrKyA9CisgICAgICAgICAgICAgICAgRlhSR0IyR1JBWShGWEFSR0JfUihhcmdiKSwgRlhBUkdCX0coYXJnYiksIEZYQVJHQl9CKGFyZ2IpKTsKKyAgICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgcGFsc2l6ZSA9IDEgPDwgKHNyY19mb3JtYXQgJiAweGZmKTsKKyAgICAgICAgcERlc3RQYWxldHRlID0gRlhfQWxsb2MoRlhfRFdPUkQsIHBhbHNpemUpOworICAgICAgICBpZiAoaXNEc3RDbXlrID09IGlzU3JjQ215aykgeworICAgICAgICAgIEZYU1lTX21lbWNweShwRGVzdFBhbGV0dGUsIHBTcmNQYWxldHRlLCBwYWxzaXplICogc2l6ZW9mKEZYX0RXT1JEKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWxzaXplOyBpKyspIHsKKyAgICAgICAgICAgIEZYX0NNWUsgY215ayA9IHBTcmNQYWxldHRlW2ldOworICAgICAgICAgICAgdWludDhfdCByLCBnLCBiOworICAgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShjbXlrKSwgRlhTWVNfR2V0TVZhbHVlKGNteWspLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX0dldFlWYWx1ZShjbXlrKSwgRlhTWVNfR2V0S1ZhbHVlKGNteWspLCByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcsIGIpOworICAgICAgICAgICAgcERlc3RQYWxldHRlW2ldID0gRlhBUkdCX01BS0UoMHhmZiwgciwgZywgYik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICgoZGVzdF9mb3JtYXQgJiAweGZmKSA9PSA4KSB7CisgICAgICAgIGludCBwYWxfY291bnQgPSAxIDw8IChzcmNfZm9ybWF0ICYgMHhmZik7CisgICAgICAgIHVpbnQ4X3QqIGdyYXlfcGFsID0gRlhfQWxsb2ModWludDhfdCwgcGFsX2NvdW50KTsKKyAgICAgICAgaWYgKHBhbF9jb3VudCA9PSAyKSB7CisgICAgICAgICAgZ3JheV9wYWxbMF0gPSAwOworICAgICAgICAgIGdyYXlfcGFsWzFdID0gMjU1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGdyYXlfcGFsW2ldID0gaTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcERlc3RQYWxldHRlID0gKEZYX0RXT1JEKilncmF5X3BhbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCBwYWxzaXplID0gMSA8PCAoc3JjX2Zvcm1hdCAmIDB4ZmYpOworICAgICAgICBwRGVzdFBhbGV0dGUgPSBGWF9BbGxvYyhGWF9EV09SRCwgcGFsc2l6ZSk7CisgICAgICAgIGlmIChwYWxzaXplID09IDIpIHsKKyAgICAgICAgICBwRGVzdFBhbGV0dGVbMF0gPSBpc1NyY0NteWsgPyAyNTUgOiAweGZmMDAwMDAwOworICAgICAgICAgIHBEZXN0UGFsZXR0ZVsxXSA9IGlzU3JjQ215ayA/IDAgOiAweGZmZmZmZmZmOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBwRGVzdFBhbGV0dGVbaV0gPSBpc1NyY0NteWsgPyBGWF9DQ09MT1IoaSkgOiAoaSAqIDB4MTAxMDEpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaXNTcmNDbXlrICE9IGlzRHN0Q215aykgeworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBGWF9DTVlLIGNteWsgPSBwRGVzdFBhbGV0dGVbaV07CisgICAgICAgICAgICB1aW50OF90IHIsIGcsIGI7CisgICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKGNteWspLCBGWFNZU19HZXRNVmFsdWUoY215ayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfR2V0WVZhbHVlKGNteWspLCBGWFNZU19HZXRLVmFsdWUoY215ayksIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZywgYik7CisgICAgICAgICAgICBwRGVzdFBhbGV0dGVbaV0gPSBGWEFSR0JfTUFLRSgweGZmLCByLCBnLCBiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KK0NGWF9TY2FubGluZUNvbXBvc2l0b3I6OkNGWF9TY2FubGluZUNvbXBvc2l0b3IoKSB7CisgIG1fcFNyY1BhbGV0dGUgPSBOVUxMOworICBtX3BDYWNoZVNjYW5saW5lID0gTlVMTDsKKyAgbV9DYWNoZVNpemUgPSAwOworICBtX2JSZ2JCeXRlT3JkZXIgPSBGQUxTRTsKKyAgbV9CbGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUw7Cit9CitDRlhfU2NhbmxpbmVDb21wb3NpdG9yOjp+Q0ZYX1NjYW5saW5lQ29tcG9zaXRvcigpIHsKKyAgRlhfRnJlZShtX3BTcmNQYWxldHRlKTsKKyAgRlhfRnJlZShtX3BDYWNoZVNjYW5saW5lKTsKK30KK0ZYX0JPT0wgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvcjo6SW5pdChGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcFNyY1BhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFza19jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDbGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIG1fU3JjRm9ybWF0ID0gc3JjX2Zvcm1hdDsKKyAgbV9EZXN0Rm9ybWF0ID0gZGVzdF9mb3JtYXQ7CisgIG1fQmxlbmRUeXBlID0gYmxlbmRfdHlwZTsKKyAgbV9iUmdiQnl0ZU9yZGVyID0gYlJnYkJ5dGVPcmRlcjsKKyAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IE5VTEw7CisgIGlmIChDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpKSB7CisgICAgcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOworICB9CisgIGlmICghcEljY01vZHVsZSkgeworICAgIHBJY2NUcmFuc2Zvcm0gPSBOVUxMOworICB9CisgIG1fcEljY1RyYW5zZm9ybSA9IHBJY2NUcmFuc2Zvcm07CisgIGlmICgoZGVzdF9mb3JtYXQgJiAweGZmKSA9PSAxKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX1NyY0Zvcm1hdCA9PSBGWERJQl8xYnBwTWFzayB8fCBtX1NyY0Zvcm1hdCA9PSBGWERJQl84YnBwTWFzaykgeworICAgIHJldHVybiBfU2NhbmxpbmVDb21wb3NpdG9yX0luaXRTb3VyY2VNYXNrKAorICAgICAgICBkZXN0X2Zvcm1hdCwgYWxwaGFfZmxhZywgbWFza19jb2xvciwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwKKyAgICAgICAgbV9NYXNrR3JlZW4sIG1fTWFza0JsdWUsIG1fTWFza0JsYWNrLCBwSWNjTW9kdWxlLCBwSWNjVHJhbnNmb3JtKTsKKyAgfQorICBpZiAoIXBJY2NUcmFuc2Zvcm0gJiYgKH5zcmNfZm9ybWF0ICYgMHgwNDAwKSAmJiAoZGVzdF9mb3JtYXQgJiAweDA0MDApKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICgobV9TcmNGb3JtYXQgJiAweGZmKSA8PSA4KSB7CisgICAgaWYgKGRlc3RfZm9ybWF0ID09IEZYRElCXzhicHBNYXNrKSB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgX1NjYW5saW5lQ29tcG9zaXRvcl9Jbml0U291cmNlUGFsZXR0ZShzcmNfZm9ybWF0LCBkZXN0X2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFNyY1BhbGV0dGUsIHBTcmNQYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEljY01vZHVsZSwgcEljY1RyYW5zZm9ybSk7CisgICAgbV9UcmFuc3BhcmVuY3kgPQorICAgICAgICAoZGVzdF9mb3JtYXQgPT0gRlhESUJfQXJnYiA/IDEgOiAwKSArIChkZXN0X2Zvcm1hdCAmIDB4MDIwMCA/IDIgOiAwKSArCisgICAgICAgIChkZXN0X2Zvcm1hdCAmIDB4MDQwMCA/IDQgOiAwKSArICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDEgPyA4IDogMCk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgbV9UcmFuc3BhcmVuY3kgPSAoc3JjX2Zvcm1hdCAmIDB4MDIwMCA/IDAgOiAxKSArCisgICAgICAgICAgICAgICAgICAgKGRlc3RfZm9ybWF0ICYgMHgwMjAwID8gMCA6IDIpICsKKyAgICAgICAgICAgICAgICAgICAoYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9OT1JNQUwgPyA0IDogMCkgKworICAgICAgICAgICAgICAgICAgIChiQ2xpcCA/IDggOiAwKSArIChzcmNfZm9ybWF0ICYgMHgwNDAwID8gMTYgOiAwKSArCisgICAgICAgICAgICAgICAgICAgKGRlc3RfZm9ybWF0ICYgMHgwNDAwID8gMzIgOiAwKSArIChwSWNjVHJhbnNmb3JtID8gNjQgOiAwKTsKKyAgcmV0dXJuIFRSVUU7Cit9Cit2b2lkIENGWF9TY2FubGluZUNvbXBvc2l0b3I6OkNvbXBvc2l0ZVJnYkJpdG1hcExpbmUoCisgICAgdWludDhfdCogZGVzdF9zY2FuLAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgIGludCB3aWR0aCwKKyAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgY29uc3QgdWludDhfdCogc3JjX2V4dHJhX2FscGhhLAorICAgIHVpbnQ4X3QqIGRzdF9leHRyYV9hbHBoYSkgeworICBpbnQgc3JjX0JwcCA9IChtX1NyY0Zvcm1hdCAmIDB4ZmYpID4+IDM7CisgIGludCBkZXN0X0JwcCA9IChtX0Rlc3RGb3JtYXQgJiAweGZmKSA+PiAzOworICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7CisgICAgc3dpdGNoIChtX1RyYW5zcGFyZW5jeSkgeworICAgICAgY2FzZSAwOgorICAgICAgY2FzZSA0OgorICAgICAgY2FzZSA4OgorICAgICAgY2FzZSAxMjoKKyAgICAgICAgX0NvbXBvc2l0ZVJvd19BcmdiMkFyZ2JfUmdiQnl0ZU9yZGVyKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CbGVuZFR5cGUsIGNsaXBfc2Nhbik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOgorICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX05vQ2xpcF9SZ2JCeXRlT3JkZXIoCisgICAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsIHNyY19CcHApOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgIGNhc2UgMTA6CisgICAgICAgIF9Db21wb3NpdGVSb3dfQXJnYjJSZ2JfQmxlbmRfUmdiQnl0ZU9yZGVyKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLCBkZXN0X0JwcCwgY2xpcF9zY2FuKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDM6CisgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9Ob0NsaXBfUmdiQnl0ZU9yZGVyKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLCBkZXN0X0JwcCwgc3JjX0JwcCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1OgorICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX05vQmxlbmRfTm9DbGlwX1JnYkJ5dGVPcmRlcihkZXN0X3NjYW4sIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgc3JjX0JwcCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA2OgorICAgICAgY2FzZSAxNDoKKyAgICAgICAgX0NvbXBvc2l0ZVJvd19BcmdiMlJnYl9Ob0JsZW5kX1JnYkJ5dGVPcmRlcihkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X0JwcCwgY2xpcF9zY2FuKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDc6CisgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX05vQ2xpcF9SZ2JCeXRlT3JkZXIoCisgICAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgZGVzdF9CcHAsIHNyY19CcHApOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgOToKKyAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9DbGlwX1JnYkJ5dGVPcmRlcigKKyAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgc3JjX0JwcCwgY2xpcF9zY2FuKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDExOgorICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfQ2xpcF9SZ2JCeXRlT3JkZXIoCisgICAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsIGRlc3RfQnBwLCBzcmNfQnBwLAorICAgICAgICAgICAgY2xpcF9zY2FuKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEzOgorICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX05vQmxlbmRfQ2xpcF9SZ2JCeXRlT3JkZXIoCisgICAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgc3JjX0JwcCwgY2xpcF9zY2FuKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE1OgorICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9DbGlwX1JnYkJ5dGVPcmRlcigKKyAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBkZXN0X0JwcCwgc3JjX0JwcCwgY2xpcF9zY2FuKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCXzhicHBNYXNrKSB7CisgICAgaWYgKG1fU3JjRm9ybWF0ICYgMHgwMjAwKSB7CisgICAgICBpZiAobV9TcmNGb3JtYXQgPT0gRlhESUJfQXJnYikgeworICAgICAgICBfQ29tcG9zaXRlUm93X0FyZ2IyTWFzayhkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgY2xpcF9zY2FuKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiYTJNYXNrKGRlc3Rfc2Nhbiwgc3JjX2V4dHJhX2FscGhhLCB3aWR0aCwgY2xpcF9zY2FuKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyTWFzayhkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgY2xpcF9zY2FuKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID09IDgpIHsKKyAgICBpZiAobV9EZXN0Rm9ybWF0ICYgMHgwNDAwKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IH4qZGVzdF9zY2FuOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG1fU3JjRm9ybWF0ICYgMHgwMjAwKSB7CisgICAgICBpZiAobV9EZXN0Rm9ybWF0ICYgMHgwMjAwKSB7CisgICAgICAgIF9Db21wb3NpdGVSb3dfQXJnYjJHcmF5YShkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3NjYW4sIHNyY19leHRyYV9hbHBoYSwgZHN0X2V4dHJhX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wSWNjVHJhbnNmb3JtKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIF9Db21wb3NpdGVSb3dfQXJnYjJHcmF5KGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9zY2FuLCBzcmNfZXh0cmFfYWxwaGEsIG1fcEljY1RyYW5zZm9ybSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtX0Rlc3RGb3JtYXQgJiAweDAyMDApIHsKKyAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyR3JheWEoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX0JwcCwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxlbmRUeXBlLCBjbGlwX3NjYW4sIGRzdF9leHRyYV9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wSWNjVHJhbnNmb3JtKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMkdyYXkoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX0JwcCwgd2lkdGgsIG1fQmxlbmRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2NhbiwgbV9wSWNjVHJhbnNmb3JtKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG1fRGVzdEZvcm1hdCAmIDB4MDQwMCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgICpkZXN0X3NjYW4gPSB+KmRlc3Rfc2NhbjsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGludCBkZXN0X1NpemUgPSB3aWR0aCAqIGRlc3RfQnBwICsgNDsKKyAgICBpZiAoZGVzdF9TaXplID4gbV9DYWNoZVNpemUpIHsKKyAgICAgIG1fcENhY2hlU2NhbmxpbmUgPSBGWF9SZWFsbG9jKHVpbnQ4X3QsIG1fcENhY2hlU2NhbmxpbmUsIGRlc3RfU2l6ZSk7CisgICAgICBpZiAoIW1fcENhY2hlU2NhbmxpbmUpIHsKICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgbV9DYWNoZVNpemUgPSBkZXN0X1NpemU7CiAgICAgfQotICAgIEZYX0xQQ0JZVEUgY2xpcF9zY2FuID0gTlVMTDsKLSAgICBpZiAobV9wQ2xpcE1hc2spCi0gICAgICAgIGNsaXBfc2NhbiA9IG1fcENsaXBNYXNrLT5HZXRCdWZmZXIoKSArIChtX0Rlc3RUb3AgKyBsaW5lIC0gbV9wQ2xpcFJnbi0+R2V0Qm94KCkudG9wKSAqCi0gICAgICAgICAgICAgICAgICAgIG1fcENsaXBNYXNrLT5HZXRQaXRjaCgpICsgKG1fRGVzdExlZnQgLSBtX3BDbGlwUmduLT5HZXRCb3goKS5sZWZ0KTsKLSAgICBGWF9MUEJZVEUgZGVzdF9zY2FuID0gKEZYX0xQQllURSltX3BCaXRtYXAtPkdldFNjYW5saW5lKGxpbmUgKyBtX0Rlc3RUb3ApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbV9EZXN0TGVmdCAqIG1fcEJpdG1hcC0+R2V0QlBQKCkgLyA4OwotICAgIEZYX0xQQllURSBkZXN0X2FscGhhX3NjYW4gPSBtX3BCaXRtYXAtPm1fcEFscGhhTWFzayA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9MUEJZVEUpbV9wQml0bWFwLT5tX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKGxpbmUgKyBtX0Rlc3RUb3ApICsgbV9EZXN0TGVmdCA6IE5VTEw7Ci0gICAgRG9Db21wb3NlKGRlc3Rfc2Nhbiwgc2NhbmxpbmUsIG1fRGVzdFdpZHRoLCBjbGlwX3NjYW4sIHNjYW5fZXh0cmFfYWxwaGEsIGRlc3RfYWxwaGFfc2Nhbik7CisgICAgc3dpdGNoIChtX1RyYW5zcGFyZW5jeSkgeworICAgICAgY2FzZSAwOgorICAgICAgY2FzZSA0OgorICAgICAgY2FzZSA4OgorICAgICAgY2FzZSA0ICsgODogeworICAgICAgICBfQ29tcG9zaXRlUm93X0FyZ2IyQXJnYihkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2NhbiwgZHN0X2V4dHJhX2FscGhhLCBzcmNfZXh0cmFfYWxwaGEpOworICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgNjQ6CisgICAgICBjYXNlIDQgKyA2NDoKKyAgICAgIGNhc2UgOCArIDY0OgorICAgICAgY2FzZSA0ICsgOCArIDY0OiB7CisgICAgICAgIF9Db21wb3NpdGVSb3dfQXJnYjJBcmdiX1RyYW5zZm9ybSgKKyAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgY2xpcF9zY2FuLCBkc3RfZXh0cmFfYWxwaGEsCisgICAgICAgICAgICBzcmNfZXh0cmFfYWxwaGEsIG1fcENhY2hlU2NhbmxpbmUsIG1fcEljY1RyYW5zZm9ybSk7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSAxOgorICAgICAgICBfQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX05vQ2xpcCgKKyAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgc3JjX0JwcCwgZHN0X2V4dHJhX2FscGhhKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEgKyA2NDoKKyAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9Ob0NsaXBfVHJhbnNmb3JtKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLCBzcmNfQnBwLCBkc3RfZXh0cmFfYWxwaGEsCisgICAgICAgICAgICBtX3BDYWNoZVNjYW5saW5lLCBtX3BJY2NUcmFuc2Zvcm0pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMSArIDg6CisgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfQ2xpcChkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxlbmRUeXBlLCBzcmNfQnBwLCBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZXh0cmFfYWxwaGEpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMSArIDggKyA2NDoKKyAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9DbGlwX1RyYW5zZm9ybSgKKyAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgc3JjX0JwcCwgY2xpcF9zY2FuLAorICAgICAgICAgICAgZHN0X2V4dHJhX2FscGhhLCBtX3BDYWNoZVNjYW5saW5lLCBtX3BJY2NUcmFuc2Zvcm0pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMSArIDQ6CisgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9Ob0NsaXAoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX0JwcCwgZHN0X2V4dHJhX2FscGhhKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEgKyA0ICsgNjQ6CisgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9Ob0NsaXBfVHJhbnNmb3JtKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIHNyY19CcHAsIGRzdF9leHRyYV9hbHBoYSwKKyAgICAgICAgICAgIG1fcENhY2hlU2NhbmxpbmUsIG1fcEljY1RyYW5zZm9ybSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxICsgNCArIDg6CisgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9DbGlwKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBzcmNfQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3NjYW4sIGRzdF9leHRyYV9hbHBoYSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxICsgNCArIDggKyA2NDoKKyAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyQXJnYl9Ob0JsZW5kX0NsaXBfVHJhbnNmb3JtKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIHNyY19CcHAsIGNsaXBfc2NhbiwgZHN0X2V4dHJhX2FscGhhLAorICAgICAgICAgICAgbV9wQ2FjaGVTY2FubGluZSwgbV9wSWNjVHJhbnNmb3JtKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICBjYXNlIDIgKyA4OgorICAgICAgICBfQ29tcG9zaXRlUm93X0FyZ2IyUmdiX0JsZW5kKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X0JwcCwgY2xpcF9zY2FuLCBzcmNfZXh0cmFfYWxwaGEpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMiArIDY0OgorICAgICAgY2FzZSAyICsgOCArIDY0OgorICAgICAgICBfQ29tcG9zaXRlUm93X0FyZ2IyUmdiX0JsZW5kX1RyYW5zZm9ybSgKKyAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgZGVzdF9CcHAsIGNsaXBfc2NhbiwKKyAgICAgICAgICAgIHNyY19leHRyYV9hbHBoYSwgbV9wQ2FjaGVTY2FubGluZSwgbV9wSWNjVHJhbnNmb3JtKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIgKyA0OgorICAgICAgY2FzZSAyICsgNCArIDg6CisgICAgICAgIF9Db21wb3NpdGVSb3dfQXJnYjJSZ2JfTm9CbGVuZChkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgZGVzdF9CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3NjYW4sIHNyY19leHRyYV9hbHBoYSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyICsgNCArIDY0OgorICAgICAgY2FzZSAyICsgNCArIDggKyA2NDoKKyAgICAgICAgX0NvbXBvc2l0ZVJvd19BcmdiMlJnYl9Ob0JsZW5kX1RyYW5zZm9ybSgKKyAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBkZXN0X0JwcCwgY2xpcF9zY2FuLCBzcmNfZXh0cmFfYWxwaGEsCisgICAgICAgICAgICBtX3BDYWNoZVNjYW5saW5lLCBtX3BJY2NUcmFuc2Zvcm0pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMSArIDI6CisgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9Ob0NsaXAoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CbGVuZFR5cGUsIGRlc3RfQnBwLCBzcmNfQnBwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEgKyAyICsgNjQ6CisgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9Ob0NsaXBfVHJhbnNmb3JtKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLCBkZXN0X0JwcCwgc3JjX0JwcCwKKyAgICAgICAgICAgIG1fcENhY2hlU2NhbmxpbmUsIG1fcEljY1RyYW5zZm9ybSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxICsgMiArIDg6CisgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9DbGlwKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0JsZW5kVHlwZSwgZGVzdF9CcHAsIHNyY19CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2Nhbik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxICsgMiArIDggKyA2NDoKKyAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX0NsaXBfVHJhbnNmb3JtKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLCBkZXN0X0JwcCwgc3JjX0JwcCwKKyAgICAgICAgICAgIGNsaXBfc2NhbiwgbV9wQ2FjaGVTY2FubGluZSwgbV9wSWNjVHJhbnNmb3JtKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEgKyAyICsgNDoKKyAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfTm9DbGlwKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9CcHAsIHNyY19CcHApOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMSArIDIgKyA0ICsgNjQ6CisgICAgICAgIF9Db21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX05vQ2xpcF9UcmFuc2Zvcm0oCisgICAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgZGVzdF9CcHAsIHNyY19CcHAsIG1fcENhY2hlU2NhbmxpbmUsCisgICAgICAgICAgICBtX3BJY2NUcmFuc2Zvcm0pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMSArIDIgKyA0ICsgODoKKyAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfQ2xpcChkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgZGVzdF9CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX0JwcCwgY2xpcF9zY2FuKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEgKyAyICsgNCArIDggKyA2NDoKKyAgICAgICAgX0NvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfQ2xpcF9UcmFuc2Zvcm0oCisgICAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgZGVzdF9CcHAsIHNyY19CcHAsIGNsaXBfc2NhbiwKKyAgICAgICAgICAgIG1fcENhY2hlU2NhbmxpbmUsIG1fcEljY1RyYW5zZm9ybSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQogfQotdm9pZCBDRlhfQml0bWFwQ29tcG9zZXI6OkNvbXBvc2VTY2FubGluZVYoaW50IGxpbmUsIEZYX0xQQ0JZVEUgc2NhbmxpbmUsIEZYX0xQQ0JZVEUgc2Nhbl9leHRyYV9hbHBoYSkKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgQnBwID0gbV9wQml0bWFwLT5HZXRCUFAoKSAvIDg7Ci0gICAgaW50IGRlc3RfcGl0Y2ggPSBtX3BCaXRtYXAtPkdldFBpdGNoKCk7Ci0gICAgaW50IGRlc3RfYWxwaGFfcGl0Y2ggPSBtX3BCaXRtYXAtPm1fcEFscGhhTWFzayA/IG1fcEJpdG1hcC0+bV9wQWxwaGFNYXNrLT5HZXRQaXRjaCgpIDogMDsKLSAgICBpbnQgZGVzdF94ID0gbV9EZXN0TGVmdCArIChtX2JGbGlwWCA/IChtX0Rlc3RXaWR0aCAtIGxpbmUgLSAxKSA6IGxpbmUpOwotICAgIEZYX0xQQllURSBkZXN0X2J1ZiA9IG1fcEJpdG1hcC0+R2V0QnVmZmVyKCkgKyBkZXN0X3ggKiBCcHAgKyBtX0Rlc3RUb3AgKiBkZXN0X3BpdGNoOwotICAgIEZYX0xQQllURSBkZXN0X2FscGhhX2J1ZiA9IG1fcEJpdG1hcC0+bV9wQWxwaGFNYXNrID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BCaXRtYXAtPm1fcEFscGhhTWFzay0+R2V0QnVmZmVyKCkgKyBkZXN0X3ggKyBtX0Rlc3RUb3AgKiBkZXN0X2FscGhhX3BpdGNoIDogTlVMTDsKK3ZvaWQgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvcjo6Q29tcG9zaXRlUGFsQml0bWFwTGluZSgKKyAgICB1aW50OF90KiBkZXN0X3NjYW4sCisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgaW50IHNyY19sZWZ0LAorICAgIGludCB3aWR0aCwKKyAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgY29uc3QgdWludDhfdCogc3JjX2V4dHJhX2FscGhhLAorICAgIHVpbnQ4X3QqIGRzdF9leHRyYV9hbHBoYSkgeworICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7CisgICAgaWYgKG1fU3JjRm9ybWF0ID09IEZYRElCXzFicHBSZ2IpIHsKKyAgICAgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfOGJwcFJnYikgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKKyAgICAgICAgX0NvbXBvc2l0ZVJvd18xYnBwUmdiMkFyZ2JfTm9CbGVuZF9SZ2JCeXRlT3JkZXIoCisgICAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCBzcmNfbGVmdCwgd2lkdGgsIG1fcFNyY1BhbGV0dGUsIGNsaXBfc2Nhbik7CisgICAgICB9IGVsc2UgeworICAgICAgICBfQ29tcG9zaXRlUm93XzFicHBSZ2IyUmdiX05vQmxlbmRfUmdiQnl0ZU9yZGVyKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX2xlZnQsIG1fcFNyY1BhbGV0dGUsIHdpZHRoLAorICAgICAgICAgICAgKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID4+IDMsIGNsaXBfc2Nhbik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfOGJwcFJnYikgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKKyAgICAgICAgX0NvbXBvc2l0ZVJvd184YnBwUmdiMkFyZ2JfTm9CbGVuZF9SZ2JCeXRlT3JkZXIoCisgICAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9wU3JjUGFsZXR0ZSwgY2xpcF9zY2FuKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIF9Db21wb3NpdGVSb3dfOGJwcFJnYjJSZ2JfTm9CbGVuZF9SZ2JCeXRlT3JkZXIoCisgICAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCBtX3BTcmNQYWxldHRlLCB3aWR0aCwKKyAgICAgICAgICAgIChtX0Rlc3RGb3JtYXQgJiAweGZmKSA+PiAzLCBjbGlwX3NjYW4pOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl84YnBwTWFzaykgeworICAgIF9Db21wb3NpdGVSb3dfUmdiMk1hc2soZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGNsaXBfc2Nhbik7CisgICAgcmV0dXJuOworICB9CisgIGlmICgobV9EZXN0Rm9ybWF0ICYgMHhmZikgPT0gOCkgeworICAgIGlmIChtX1RyYW5zcGFyZW5jeSAmIDgpIHsKKyAgICAgIGlmIChtX0Rlc3RGb3JtYXQgJiAweDAyMDApIHsKKyAgICAgICAgX0NvbXBvc2l0ZVJvd18xYnBwUGFsMkdyYXlhKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKW1fcFNyY1BhbGV0dGUsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CbGVuZFR5cGUsIGNsaXBfc2NhbiwgZHN0X2V4dHJhX2FscGhhKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIF9Db21wb3NpdGVSb3dfMWJwcFBhbDJHcmF5KGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopbV9wU3JjUGFsZXR0ZSwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxlbmRUeXBlLCBjbGlwX3NjYW4pOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAobV9EZXN0Rm9ybWF0ICYgMHgwMjAwKQorICAgICAgICBfQ29tcG9zaXRlUm93XzhicHBQYWwyR3JheWEoCisgICAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCAoY29uc3QgdWludDhfdCopbV9wU3JjUGFsZXR0ZSwgd2lkdGgsCisgICAgICAgICAgICBtX0JsZW5kVHlwZSwgY2xpcF9zY2FuLCBkc3RfZXh0cmFfYWxwaGEsIHNyY19leHRyYV9hbHBoYSk7CisgICAgICBlbHNlCisgICAgICAgIF9Db21wb3NpdGVSb3dfOGJwcFBhbDJHcmF5KGRlc3Rfc2Nhbiwgc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KiltX3BTcmNQYWxldHRlLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CbGVuZFR5cGUsIGNsaXBfc2Nhbiwgc3JjX2V4dHJhX2FscGhhKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc3dpdGNoIChtX1RyYW5zcGFyZW5jeSkgeworICAgICAgY2FzZSAxICsgMjoKKyAgICAgICAgX0NvbXBvc2l0ZVJvd184YnBwUmdiMkFyZ2JfTm9CbGVuZChkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BTcmNQYWxldHRlLCBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2V4dHJhX2FscGhhKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEgKyAyICsgODoKKyAgICAgICAgX0NvbXBvc2l0ZVJvd18xYnBwUmdiMkFyZ2JfTm9CbGVuZChkZXN0X3NjYW4sIHNyY19zY2FuLCBzcmNfbGVmdCwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3JjUGFsZXR0ZSwgY2xpcF9zY2FuKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDA6CisgICAgICAgIF9Db21wb3NpdGVSb3dfOGJwcFJnYjJSZ2JfTm9CbGVuZChkZXN0X3NjYW4sIHNyY19zY2FuLCBtX3BTcmNQYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIChtX0Rlc3RGb3JtYXQgJiAweGZmKSA+PiAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9zY2FuLCBzcmNfZXh0cmFfYWxwaGEpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMCArIDg6CisgICAgICAgIF9Db21wb3NpdGVSb3dfMWJwcFJnYjJSZ2JfTm9CbGVuZCgKKyAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHNyY19sZWZ0LCBtX3BTcmNQYWxldHRlLCB3aWR0aCwKKyAgICAgICAgICAgIChtX0Rlc3RGb3JtYXQgJiAweGZmKSA+PiAzLCBjbGlwX3NjYW4pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMCArIDI6CisgICAgICAgIF9Db21wb3NpdGVSb3dfOGJwcFJnYjJSZ2JfTm9CbGVuZChkZXN0X3NjYW4sIHNyY19zY2FuLCBtX3BTcmNQYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIChtX0Rlc3RGb3JtYXQgJiAweGZmKSA+PiAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9zY2FuLCBzcmNfZXh0cmFfYWxwaGEpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMCArIDIgKyA4OgorICAgICAgICBfQ29tcG9zaXRlUm93XzFicHBSZ2IyUmdiYV9Ob0JsZW5kKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHNyY19sZWZ0LCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BTcmNQYWxldHRlLCBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2V4dHJhX2FscGhhKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQordm9pZCBDRlhfU2NhbmxpbmVDb21wb3NpdG9yOjpDb21wb3NpdGVCeXRlTWFza0xpbmUodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3RfZXh0cmFfYWxwaGEpIHsKKyAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl84YnBwTWFzaykgeworICAgIF9Db21wb3NpdGVSb3dfQnl0ZU1hc2syTWFzayhkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2Nhbik7CisgIH0gZWxzZSBpZiAoKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID09IDgpIHsKKyAgICBpZiAobV9EZXN0Rm9ybWF0ICYgMHgwMjAwKSB7CisgICAgICBfQ29tcG9zaXRlUm93X0J5dGVNYXNrMkdyYXlhKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBjbGlwX3NjYW4sIGRzdF9leHRyYV9hbHBoYSk7CisgICAgfSBlbHNlIHsKKyAgICAgIF9Db21wb3NpdGVSb3dfQnl0ZU1hc2syR3JheShkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBjbGlwX3NjYW4pOworICAgIH0KKyAgfSBlbHNlIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKKyAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX0FyZ2IpCisgICAgICBfQ29tcG9zaXRlUm93X0J5dGVNYXNrMkFyZ2JfUmdiQnl0ZU9yZGVyKAorICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLAorICAgICAgICAgIHdpZHRoLCBtX0JsZW5kVHlwZSwgY2xpcF9zY2FuKTsKKyAgICBlbHNlCisgICAgICBfQ29tcG9zaXRlUm93X0J5dGVNYXNrMlJnYl9SZ2JCeXRlT3JkZXIoCisgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwgbV9NYXNrR3JlZW4sIG1fTWFza0JsdWUsCisgICAgICAgICAgd2lkdGgsIG1fQmxlbmRUeXBlLCAobV9EZXN0Rm9ybWF0ICYgMHhmZikgPj4gMywgY2xpcF9zY2FuKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX0FyZ2IpCisgICAgX0NvbXBvc2l0ZVJvd19CeXRlTWFzazJBcmdiKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLCB3aWR0aCwgbV9CbGVuZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2Nhbik7CisgIGVsc2UgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9SZ2IgfHwgbV9EZXN0Rm9ybWF0ID09IEZYRElCX1JnYjMyKQorICAgIF9Db21wb3NpdGVSb3dfQnl0ZU1hc2syUmdiKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9NYXNrR3JlZW4sIG1fTWFza0JsdWUsIHdpZHRoLCBtX0JsZW5kVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV9EZXN0Rm9ybWF0ICYgMHhmZikgPj4gMywgY2xpcF9zY2FuKTsKKyAgZWxzZSBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX1JnYmEpCisgICAgX0NvbXBvc2l0ZVJvd19CeXRlTWFzazJSZ2JhKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLCB3aWR0aCwgbV9CbGVuZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2NhbiwgZHN0X2V4dHJhX2FscGhhKTsKK30KK3ZvaWQgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvcjo6Q29tcG9zaXRlQml0TWFza0xpbmUodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0X2V4dHJhX2FscGhhKSB7CisgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfOGJwcE1hc2spIHsKKyAgICBfQ29tcG9zaXRlUm93X0JpdE1hc2syTWFzayhkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGNsaXBfc2Nhbik7CisgIH0gZWxzZSBpZiAoKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID09IDgpIHsKKyAgICBpZiAobV9EZXN0Rm9ybWF0ICYgMHgwMjAwKQorICAgICAgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMkdyYXlhKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2xlZnQsIHdpZHRoLCBjbGlwX3NjYW4sIGRzdF9leHRyYV9hbHBoYSk7CisgICAgZWxzZSB7CisgICAgICBfQ29tcG9zaXRlUm93X0JpdE1hc2syR3JheShkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2xlZnQsIHdpZHRoLCBjbGlwX3NjYW4pOworICAgIH0KKyAgfSBlbHNlIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKKyAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX0FyZ2IpCisgICAgICBfQ29tcG9zaXRlUm93X0JpdE1hc2syQXJnYl9SZ2JCeXRlT3JkZXIoCisgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwgbV9NYXNrR3JlZW4sIG1fTWFza0JsdWUsCisgICAgICAgICAgc3JjX2xlZnQsIHdpZHRoLCBtX0JsZW5kVHlwZSwgY2xpcF9zY2FuKTsKKyAgICBlbHNlCisgICAgICBfQ29tcG9zaXRlUm93X0JpdE1hc2syUmdiX1JnYkJ5dGVPcmRlcigKKyAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLCBtX01hc2tHcmVlbiwgbV9NYXNrQmx1ZSwKKyAgICAgICAgICBzcmNfbGVmdCwgd2lkdGgsIG1fQmxlbmRUeXBlLCAobV9EZXN0Rm9ybWF0ICYgMHhmZikgPj4gMywgY2xpcF9zY2FuKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX0FyZ2IpCisgICAgX0NvbXBvc2l0ZVJvd19CaXRNYXNrMkFyZ2IoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX01hc2tHcmVlbiwgbV9NYXNrQmx1ZSwgc3JjX2xlZnQsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxlbmRUeXBlLCBjbGlwX3NjYW4pOworICBlbHNlIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfUmdiIHx8IG1fRGVzdEZvcm1hdCA9PSBGWERJQl9SZ2IzMikKKyAgICBfQ29tcG9zaXRlUm93X0JpdE1hc2syUmdiKAorICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLCBtX01hc2tHcmVlbiwgbV9NYXNrQmx1ZSwKKyAgICAgICAgc3JjX2xlZnQsIHdpZHRoLCBtX0JsZW5kVHlwZSwgKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID4+IDMsIGNsaXBfc2Nhbik7Cit9CitGWF9CT09MIENGWF9ESUJpdG1hcDo6Q29tcG9zaXRlQml0bWFwKGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgaWYgKCFtX3BCdWZmZXIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQVNTRVJUKCFwU3JjQml0bWFwLT5Jc0FscGhhTWFzaygpKTsKKyAgQVNTRVJUKG1fYnBwID49IDgpOworICBpZiAocFNyY0JpdG1hcC0+SXNBbHBoYU1hc2soKSB8fCBtX2JwcCA8IDgpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgR2V0T3ZlcmxhcFJlY3QoZGVzdF9sZWZ0LCBkZXN0X3RvcCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcC0+R2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgcFNyY0JpdG1hcC0+R2V0SGVpZ2h0KCksIHNyY19sZWZ0LCBzcmNfdG9wLCBwQ2xpcFJnbik7CisgIGlmICh3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQ2xpcE1hc2sgPSBOVUxMOworICBGWF9SRUNUIGNsaXBfYm94OworICBpZiAocENsaXBSZ24gJiYgcENsaXBSZ24tPkdldFR5cGUoKSAhPSBDRlhfQ2xpcFJnbjo6UmVjdEkpIHsKKyAgICBBU1NFUlQocENsaXBSZ24tPkdldFR5cGUoKSA9PSBDRlhfQ2xpcFJnbjo6TWFza0YpOworICAgIHBDbGlwTWFzayA9IHBDbGlwUmduLT5HZXRNYXNrKCk7CisgICAgY2xpcF9ib3ggPSBwQ2xpcFJnbi0+R2V0Qm94KCk7CisgIH0KKyAgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvciBjb21wb3NpdG9yOworICBpZiAoIWNvbXBvc2l0b3IuSW5pdChHZXRGb3JtYXQoKSwgcFNyY0JpdG1hcC0+R2V0Rm9ybWF0KCksIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICBwU3JjQml0bWFwLT5HZXRQYWxldHRlKCksIDAsIGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTWFzayAhPSBOVUxMLCBiUmdiQnl0ZU9yZGVyLCAwLCBwSWNjVHJhbnNmb3JtKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpbnQgZGVzdF9CcHAgPSBtX2JwcCAvIDg7CisgIGludCBzcmNfQnBwID0gcFNyY0JpdG1hcC0+R2V0QlBQKCkgLyA4OworICBGWF9CT09MIGJSZ2IgPSBzcmNfQnBwID4gMSAmJiAhcFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKTsKKyAgQ0ZYX0RJQml0bWFwKiBwU3JjQWxwaGFNYXNrID0gcFNyY0JpdG1hcC0+bV9wQWxwaGFNYXNrOworICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0KKyAgICAgICAgbV9wQnVmZmVyICsgKGRlc3RfdG9wICsgcm93KSAqIG1fUGl0Y2ggKyBkZXN0X2xlZnQgKiBkZXN0X0JwcDsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9CisgICAgICAgIHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiBzcmNfQnBwOworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuX2V4dHJhX2FscGhhID0KKyAgICAgICAgcFNyY0FscGhhTWFzayA/IHBTcmNBbHBoYU1hc2stPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQKKyAgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7CisgICAgdWludDhfdCogZHN0X3NjYW5fZXh0cmFfYWxwaGEgPQorICAgICAgICBtX3BBbHBoYU1hc2sKKyAgICAgICAgICAgID8gKHVpbnQ4X3QqKW1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUoZGVzdF90b3AgKyByb3cpICsgZGVzdF9sZWZ0CisgICAgICAgICAgICA6IE5VTEw7CisgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuID0gTlVMTDsKKyAgICBpZiAocENsaXBNYXNrKSB7CisgICAgICBjbGlwX3NjYW4gPSBwQ2xpcE1hc2stPm1fcEJ1ZmZlciArCisgICAgICAgICAgICAgICAgICAoZGVzdF90b3AgKyByb3cgLSBjbGlwX2JveC50b3ApICogcENsaXBNYXNrLT5tX1BpdGNoICsKKyAgICAgICAgICAgICAgICAgIChkZXN0X2xlZnQgLSBjbGlwX2JveC5sZWZ0KTsKKyAgICB9CisgICAgaWYgKGJSZ2IpIHsKKyAgICAgIGNvbXBvc2l0b3IuQ29tcG9zaXRlUmdiQml0bWFwTGluZShkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuX2V4dHJhX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9zY2FuX2V4dHJhX2FscGhhKTsKKyAgICB9IGVsc2UgeworICAgICAgY29tcG9zaXRvci5Db21wb3NpdGVQYWxCaXRtYXBMaW5lKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHNyY19sZWZ0LCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3NjYW4sIHNyY19zY2FuX2V4dHJhX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9zY2FuX2V4dHJhX2FscGhhKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENGWF9ESUJpdG1hcDo6Q29tcG9zaXRlTWFzayhpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIGlmICghbV9wQnVmZmVyKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEFTU0VSVChwTWFzay0+SXNBbHBoYU1hc2soKSk7CisgIEFTU0VSVChtX2JwcCA+PSA4KTsKKyAgaWYgKCFwTWFzay0+SXNBbHBoYU1hc2soKSB8fCBtX2JwcCA8IDgpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgR2V0T3ZlcmxhcFJlY3QoZGVzdF9sZWZ0LCBkZXN0X3RvcCwgd2lkdGgsIGhlaWdodCwgcE1hc2stPkdldFdpZHRoKCksCisgICAgICAgICAgICAgICAgIHBNYXNrLT5HZXRIZWlnaHQoKSwgc3JjX2xlZnQsIHNyY190b3AsIHBDbGlwUmduKTsKKyAgaWYgKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpbnQgc3JjX2FscGhhID0KKyAgICAgICh1aW50OF90KShhbHBoYV9mbGFnID4+IDgpID8gKGFscGhhX2ZsYWcgJiAweGZmKSA6IEZYQVJHQl9BKGNvbG9yKTsKKyAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQ2xpcE1hc2sgPSBOVUxMOworICBGWF9SRUNUIGNsaXBfYm94OworICBpZiAocENsaXBSZ24gJiYgcENsaXBSZ24tPkdldFR5cGUoKSAhPSBDRlhfQ2xpcFJnbjo6UmVjdEkpIHsKKyAgICBBU1NFUlQocENsaXBSZ24tPkdldFR5cGUoKSA9PSBDRlhfQ2xpcFJnbjo6TWFza0YpOworICAgIHBDbGlwTWFzayA9IHBDbGlwUmduLT5HZXRNYXNrKCk7CisgICAgY2xpcF9ib3ggPSBwQ2xpcFJnbi0+R2V0Qm94KCk7CisgIH0KKyAgaW50IHNyY19icHAgPSBwTWFzay0+R2V0QlBQKCk7CisgIGludCBCcHAgPSBHZXRCUFAoKSAvIDg7CisgIENGWF9TY2FubGluZUNvbXBvc2l0b3IgY29tcG9zaXRvcjsKKyAgaWYgKCFjb21wb3NpdG9yLkluaXQoR2V0Rm9ybWF0KCksIHBNYXNrLT5HZXRGb3JtYXQoKSwgd2lkdGgsIE5VTEwsIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICBibGVuZF90eXBlLCBwQ2xpcE1hc2sgIT0gTlVMTCwgYlJnYkJ5dGVPcmRlciwgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9CisgICAgICAgIG1fcEJ1ZmZlciArIChkZXN0X3RvcCArIHJvdykgKiBtX1BpdGNoICsgZGVzdF9sZWZ0ICogQnBwOworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcE1hc2stPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpOworICAgIHVpbnQ4X3QqIGRzdF9zY2FuX2V4dHJhX2FscGhhID0KKyAgICAgICAgbV9wQWxwaGFNYXNrCisgICAgICAgICAgICA/ICh1aW50OF90KiltX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKGRlc3RfdG9wICsgcm93KSArIGRlc3RfbGVmdAorICAgICAgICAgICAgOiBOVUxMOworICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiA9IE5VTEw7CisgICAgaWYgKHBDbGlwTWFzaykgeworICAgICAgY2xpcF9zY2FuID0gcENsaXBNYXNrLT5tX3BCdWZmZXIgKworICAgICAgICAgICAgICAgICAgKGRlc3RfdG9wICsgcm93IC0gY2xpcF9ib3gudG9wKSAqIHBDbGlwTWFzay0+bV9QaXRjaCArCisgICAgICAgICAgICAgICAgICAoZGVzdF9sZWZ0IC0gY2xpcF9ib3gubGVmdCk7CisgICAgfQorICAgIGlmIChzcmNfYnBwID09IDEpIHsKKyAgICAgIGNvbXBvc2l0b3IuQ29tcG9zaXRlQml0TWFza0xpbmUoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX2xlZnQsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3NjYW4sIGRzdF9zY2FuX2V4dHJhX2FscGhhKTsKKyAgICB9IGVsc2UgeworICAgICAgY29tcG9zaXRvci5Db21wb3NpdGVCeXRlTWFza0xpbmUoZGVzdF9zY2FuLCBzcmNfc2NhbiArIHNyY19sZWZ0LCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2NhbiwgZHN0X3NjYW5fZXh0cmFfYWxwaGEpOworICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpDb21wb3NpdGVSZWN0KGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBpZiAoIW1fcEJ1ZmZlcikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpbnQgc3JjX2FscGhhID0gKGFscGhhX2ZsYWcgPj4gOCkgPyAoYWxwaGFfZmxhZyAmIDB4ZmYpIDogRlhBUkdCX0EoY29sb3IpOworICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBGWF9SRUNUIHJlY3QobGVmdCwgdG9wLCBsZWZ0ICsgd2lkdGgsIHRvcCArIGhlaWdodCk7CisgIHJlY3QuSW50ZXJzZWN0KDAsIDAsIG1fV2lkdGgsIG1fSGVpZ2h0KTsKKyAgaWYgKHJlY3QuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgd2lkdGggPSByZWN0LldpZHRoKCk7CisgIEZYX0RXT1JEIGRzdF9jb2xvcjsKKyAgaWYgKGFscGhhX2ZsYWcgPj4gOCkgeworICAgIGRzdF9jb2xvciA9IEZYQ01ZS19UT0RJQihjb2xvcik7CisgIH0gZWxzZSB7CisgICAgZHN0X2NvbG9yID0gRlhBUkdCX1RPRElCKGNvbG9yKTsKKyAgfQorICB1aW50OF90KiBjb2xvcl9wID0gKHVpbnQ4X3QqKSZkc3RfY29sb3I7CisgIGlmIChtX2JwcCA9PSA4KSB7CisgICAgdWludDhfdCBncmF5ID0gMjU1OworICAgIGlmICghSXNBbHBoYU1hc2soKSkgeworICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0gJiYgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKSAmJgorICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpKSB7CisgICAgICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPQorICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CisgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LCBjb2xvcl9wLCAxKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChhbHBoYV9mbGFnID4+IDgpIHsKKyAgICAgICAgICB1aW50OF90IHIsIGcsIGI7CisgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKGNvbG9yX3BbMF0sIGNvbG9yX3BbMV0sIGNvbG9yX3BbMl0sIGNvbG9yX3BbM10sIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcsIGIpOworICAgICAgICAgIGdyYXkgPSBGWFJHQjJHUkFZKHIsIGcsIGIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdyYXkgPSAodWludDhfdClGWFJHQjJHUkFZKChpbnQpY29sb3JfcFsyXSwgY29sb3JfcFsxXSwgY29sb3JfcFswXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChJc0NteWtJbWFnZSgpKSB7CisgICAgICAgIGdyYXkgPSB+Z3JheTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChpbnQgcm93ID0gcmVjdC50b3A7IHJvdyA8IHJlY3QuYm90dG9tOyByb3crKykgeworICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaCArIHJlY3QubGVmdDsKKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW4sIGdyYXksIHdpZHRoKTsKKyAgICAgIH0gZWxzZQorICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgc3JjX2FscGhhKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAobV9icHAgPT0gMSkgeworICAgIEFTU0VSVCghSXNDbXlrSW1hZ2UoKSAmJiAodWludDhfdCkoYWxwaGFfZmxhZyA+PiA4KSA9PSAwKTsKKyAgICBpbnQgbGVmdF9zaGlmdCA9IHJlY3QubGVmdCAlIDg7CisgICAgaW50IHJpZ2h0X3NoaWZ0ID0gcmVjdC5yaWdodCAlIDg7CisgICAgaW50IHdpZHRoID0gcmVjdC5yaWdodCAvIDggLSByZWN0LmxlZnQgLyA4OworICAgIGludCBpbmRleCA9IDA7CisgICAgaWYgKG1fcFBhbGV0dGUpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIGlmIChtX3BQYWxldHRlW2ldID09IGNvbG9yKSB7CisgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGV4ID0gKCh1aW50OF90KWNvbG9yID09IDB4ZmYpID8gMSA6IDA7CisgICAgfQorICAgIGZvciAoaW50IHJvdyA9IHJlY3QudG9wOyByb3cgPCByZWN0LmJvdHRvbTsgcm93KyspIHsKKyAgICAgIHVpbnQ4X3QqIGRlc3Rfc2Nhbl90b3AgPSAodWludDhfdCopR2V0U2NhbmxpbmUocm93KSArIHJlY3QubGVmdCAvIDg7CisgICAgICB1aW50OF90KiBkZXN0X3NjYW5fdG9wX3IgPSAodWludDhfdCopR2V0U2NhbmxpbmUocm93KSArIHJlY3QucmlnaHQgLyA4OworICAgICAgdWludDhfdCBsZWZ0X2ZsYWcgPSAqZGVzdF9zY2FuX3RvcCAmICgyNTUgPDwgKDggLSBsZWZ0X3NoaWZ0KSk7CisgICAgICB1aW50OF90IHJpZ2h0X2ZsYWcgPSAqZGVzdF9zY2FuX3RvcF9yICYgKDI1NSA+PiByaWdodF9zaGlmdCk7CisgICAgICBpZiAod2lkdGgpIHsKKyAgICAgICAgRlhTWVNfbWVtc2V0KGRlc3Rfc2Nhbl90b3AgKyAxLCBpbmRleCA/IDI1NSA6IDAsIHdpZHRoIC0gMSk7CisgICAgICAgIGlmICghaW5kZXgpIHsKKyAgICAgICAgICAqZGVzdF9zY2FuX3RvcCAmPSBsZWZ0X2ZsYWc7CisgICAgICAgICAgKmRlc3Rfc2Nhbl90b3BfciAmPSByaWdodF9mbGFnOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpkZXN0X3NjYW5fdG9wIHw9IH5sZWZ0X2ZsYWc7CisgICAgICAgICAgKmRlc3Rfc2Nhbl90b3BfciB8PSB+cmlnaHRfZmxhZzsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFpbmRleCkgeworICAgICAgICAgICpkZXN0X3NjYW5fdG9wICY9IGxlZnRfZmxhZyB8IHJpZ2h0X2ZsYWc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKmRlc3Rfc2Nhbl90b3AgfD0gfihsZWZ0X2ZsYWcgfCByaWdodF9mbGFnKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBBU1NFUlQobV9icHAgPj0gMjQpOworICBpZiAobV9icHAgPCAyNCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAocEljY1RyYW5zZm9ybSAmJiBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpKSB7CisgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9CisgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOworICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGNvbG9yX3AsIGNvbG9yX3AsIDEpOworICB9IGVsc2UgeworICAgIGlmIChhbHBoYV9mbGFnID4+IDggJiYgIUlzQ215a0ltYWdlKCkpCisgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0TVZhbHVlKGNvbG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRZVmFsdWUoY29sb3IpLCBGWFNZU19HZXRLVmFsdWUoY29sb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX3BbMl0sIGNvbG9yX3BbMV0sIGNvbG9yX3BbMF0pOworICAgIGVsc2UgaWYgKCEoYWxwaGFfZmxhZyA+PiA4KSAmJiBJc0NteWtJbWFnZSgpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CisgIGlmICghSXNDbXlrSW1hZ2UoKSkgeworICAgIGNvbG9yX3BbM10gPSAodWludDhfdClzcmNfYWxwaGE7CisgIH0KKyAgaW50IEJwcCA9IG1fYnBwIC8gODsKKyAgRlhfQk9PTCBiQWxwaGEgPSBIYXNBbHBoYSgpOworICBGWF9CT09MIGJBcmdiID0gR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYjsKKyAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICBmb3IgKGludCByb3cgPSByZWN0LnRvcDsgcm93IDwgcmVjdC5ib3R0b207IHJvdysrKSB7CisgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoICsgcmVjdC5sZWZ0ICogQnBwOworICAgICAgdWludDhfdCogZGVzdF9zY2FuX2FscGhhID0KKyAgICAgICAgICBtX3BBbHBoYU1hc2sgPyAodWludDhfdCopbV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShyb3cpICsgcmVjdC5sZWZ0CisgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTDsKKyAgICAgIGlmIChkZXN0X3NjYW5fYWxwaGEpIHsKKyAgICAgICAgRlhTWVNfbWVtc2V0KGRlc3Rfc2Nhbl9hbHBoYSwgMHhmZiwgd2lkdGgpOworICAgICAgfQorICAgICAgaWYgKEJwcCA9PSA0KSB7CisgICAgICAgIEZYX0RXT1JEKiBzY2FuID0gKEZYX0RXT1JEKilkZXN0X3NjYW47CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICAgICpzY2FuKysgPSBkc3RfY29sb3I7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IGNvbG9yX3BbMF07CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gY29sb3JfcFsxXTsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBjb2xvcl9wWzJdOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBUUlVFOworICB9CisgIGZvciAoaW50IHJvdyA9IHJlY3QudG9wOyByb3cgPCByZWN0LmJvdHRvbTsgcm93KyspIHsKKyAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoICsgcmVjdC5sZWZ0ICogQnBwOworICAgIGlmIChiQWxwaGEpIHsKKyAgICAgIGlmIChiQXJnYikgeworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CisgICAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKHNyY19hbHBoYSwgY29sb3JfcFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9wWzFdLCBjb2xvcl9wWzBdKSk7CisgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBjb2xvcl9wWzBdLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGNvbG9yX3BbMV0sIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgY29sb3JfcFsyXSwgYWxwaGFfcmF0aW8pOworICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IGRlc3RfYWxwaGE7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2Nhbl9hbHBoYSA9CisgICAgICAgICAgICAodWludDhfdCopbV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShyb3cpICsgcmVjdC5sZWZ0OworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9zY2FuX2FscGhhOworICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgICAgICAgICpkZXN0X3NjYW5fYWxwaGErKyA9IHNyY19hbHBoYTsKKyAgICAgICAgICAgIEZYU1lTX21lbWNweShkZXN0X3NjYW4sIGNvbG9yX3AsIEJwcCk7CisgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9CisgICAgICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgICAgICAgICpkZXN0X3NjYW5fYWxwaGErKyA9IGRlc3RfYWxwaGE7CisgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgICAgICBmb3IgKGludCBjb21wcyA9IDA7IGNvbXBzIDwgQnBwOyBjb21wcysrKSB7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0KKyAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBjb2xvcl9wW2NvbXBzXSwgYWxwaGFfcmF0aW8pOworICAgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICBmb3IgKGludCBjb21wcyA9IDA7IGNvbXBzIDwgQnBwOyBjb21wcysrKSB7CisgICAgICAgICAgaWYgKGNvbXBzID09IDMpIHsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IDI1NTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgY29sb3JfcFtjb21wc10sIHNyY19hbHBoYSk7CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitDRlhfQml0bWFwQ29tcG9zZXI6OkNGWF9CaXRtYXBDb21wb3NlcigpIHsKKyAgbV9wU2NhbmxpbmVWID0gTlVMTDsKKyAgbV9wU2NhbmxpbmVBbHBoYVYgPSBOVUxMOworICBtX3BDbGlwU2NhblYgPSBOVUxMOworICBtX3BBZGRDbGlwU2NhbiA9IE5VTEw7CisgIG1fYlJnYkJ5dGVPcmRlciA9IEZBTFNFOworICBtX0JsZW5kVHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTDsKK30KK0NGWF9CaXRtYXBDb21wb3Nlcjo6fkNGWF9CaXRtYXBDb21wb3NlcigpIHsKKyAgRlhfRnJlZShtX3BTY2FubGluZVYpOworICBGWF9GcmVlKG1fcFNjYW5saW5lQWxwaGFWKTsKKyAgRlhfRnJlZShtX3BDbGlwU2NhblYpOworICBGWF9GcmVlKG1fcEFkZENsaXBTY2FuKTsKK30KK3ZvaWQgQ0ZYX0JpdG1hcENvbXBvc2VyOjpDb21wb3NlKENGWF9ESUJpdG1hcCogcERlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFza19jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QmIGRlc3RfcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZlcnRpY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmxpcFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGbGlwWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7CisgIG1fcEJpdG1hcCA9IHBEZXN0OworICBtX3BDbGlwUmduID0gcENsaXBSZ247CisgIG1fRGVzdExlZnQgPSBkZXN0X3JlY3QubGVmdDsKKyAgbV9EZXN0VG9wID0gZGVzdF9yZWN0LnRvcDsKKyAgbV9EZXN0V2lkdGggPSBkZXN0X3JlY3QuV2lkdGgoKTsKKyAgbV9EZXN0SGVpZ2h0ID0gZGVzdF9yZWN0LkhlaWdodCgpOworICBtX0JpdG1hcEFscGhhID0gYml0bWFwX2FscGhhOworICBtX01hc2tDb2xvciA9IG1hc2tfY29sb3I7CisgIG1fcENsaXBNYXNrID0gTlVMTDsKKyAgaWYgKHBDbGlwUmduICYmIHBDbGlwUmduLT5HZXRUeXBlKCkgIT0gQ0ZYX0NsaXBSZ246OlJlY3RJKSB7CisgICAgbV9wQ2xpcE1hc2sgPSBwQ2xpcFJnbi0+R2V0TWFzaygpOworICB9CisgIG1fYlZlcnRpY2FsID0gYlZlcnRpY2FsOworICBtX2JGbGlwWCA9IGJGbGlwWDsKKyAgbV9iRmxpcFkgPSBiRmxpcFk7CisgIG1fQWxwaGFGbGFnID0gYWxwaGFfZmxhZzsKKyAgbV9wSWNjVHJhbnNmb3JtID0gcEljY1RyYW5zZm9ybTsKKyAgbV9iUmdiQnl0ZU9yZGVyID0gYlJnYkJ5dGVPcmRlcjsKKyAgbV9CbGVuZFR5cGUgPSBibGVuZF90eXBlOworfQorRlhfQk9PTCBDRlhfQml0bWFwQ29tcG9zZXI6OlNldEluZm8oaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBTcmNQYWxldHRlKSB7CisgIG1fU3JjRm9ybWF0ID0gc3JjX2Zvcm1hdDsKKyAgaWYgKCFtX0NvbXBvc2l0b3IuSW5pdChtX3BCaXRtYXAtPkdldEZvcm1hdCgpLCBzcmNfZm9ybWF0LCB3aWR0aCwgcFNyY1BhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbV9NYXNrQ29sb3IsIEZYRElCX0JMRU5EX05PUk1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDbGlwTWFzayAhPSBOVUxMIHx8IChtX0JpdG1hcEFscGhhIDwgMjU1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX2JSZ2JCeXRlT3JkZXIsIG1fQWxwaGFGbGFnLCBtX3BJY2NUcmFuc2Zvcm0pKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX2JWZXJ0aWNhbCkgeworICAgIG1fcFNjYW5saW5lViA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fcEJpdG1hcC0+R2V0QlBQKCkgLyA4ICogd2lkdGggKyA0KTsKKyAgICBtX3BDbGlwU2NhblYgPSBGWF9BbGxvYyh1aW50OF90LCBtX3BCaXRtYXAtPkdldEhlaWdodCgpKTsKKyAgICBpZiAobV9wQml0bWFwLT5tX3BBbHBoYU1hc2spIHsKKyAgICAgIG1fcFNjYW5saW5lQWxwaGFWID0gRlhfQWxsb2ModWludDhfdCwgd2lkdGggKyA0KTsKKyAgICB9CisgIH0KKyAgaWYgKG1fQml0bWFwQWxwaGEgPCAyNTUpIHsKKyAgICBtX3BBZGRDbGlwU2NhbiA9IEZYX0FsbG9jKAorICAgICAgICB1aW50OF90LCBtX2JWZXJ0aWNhbCA/IG1fcEJpdG1hcC0+R2V0SGVpZ2h0KCkgOiBtX3BCaXRtYXAtPkdldFdpZHRoKCkpOworICB9CisgIHJldHVybiBUUlVFOworfQordm9pZCBDRlhfQml0bWFwQ29tcG9zZXI6OkRvQ29tcG9zZSh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfZXh0cmFfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdF9leHRyYV9hbHBoYSkgeworICBpZiAobV9CaXRtYXBBbHBoYSA8IDI1NSkgeworICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzdF93aWR0aDsgaSsrKSB7CisgICAgICAgIG1fcEFkZENsaXBTY2FuW2ldID0gY2xpcF9zY2FuW2ldICogbV9CaXRtYXBBbHBoYSAvIDI1NTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgRlhTWVNfbWVtc2V0KG1fcEFkZENsaXBTY2FuLCBtX0JpdG1hcEFscGhhLCBkZXN0X3dpZHRoKTsKKyAgICB9CisgICAgY2xpcF9zY2FuID0gbV9wQWRkQ2xpcFNjYW47CisgIH0KKyAgaWYgKG1fU3JjRm9ybWF0ID09IEZYRElCXzhicHBNYXNrKSB7CisgICAgbV9Db21wb3NpdG9yLkNvbXBvc2l0ZUJ5dGVNYXNrTGluZShkZXN0X3NjYW4sIHNyY19zY2FuLCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9zY2FuLCBkc3RfZXh0cmFfYWxwaGEpOworICB9IGVsc2UgaWYgKChtX1NyY0Zvcm1hdCAmIDB4ZmYpID09IDgpIHsKKyAgICBtX0NvbXBvc2l0b3IuQ29tcG9zaXRlUGFsQml0bWFwTGluZShkZXN0X3NjYW4sIHNyY19zY2FuLCAwLCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2Nhbiwgc3JjX2V4dHJhX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9leHRyYV9hbHBoYSk7CisgIH0gZWxzZSB7CisgICAgbV9Db21wb3NpdG9yLkNvbXBvc2l0ZVJnYkJpdG1hcExpbmUoZGVzdF9zY2FuLCBzcmNfc2NhbiwgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3NjYW4sIHNyY19leHRyYV9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZXh0cmFfYWxwaGEpOworICB9Cit9Cit2b2lkIENGWF9CaXRtYXBDb21wb3Nlcjo6Q29tcG9zZVNjYW5saW5lKGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzY2FubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2Nhbl9leHRyYV9hbHBoYSkgeworICBpZiAobV9iVmVydGljYWwpIHsKKyAgICBDb21wb3NlU2NhbmxpbmVWKGxpbmUsIHNjYW5saW5lLCBzY2FuX2V4dHJhX2FscGhhKTsKKyAgICByZXR1cm47CisgIH0KKyAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuID0gTlVMTDsKKyAgaWYgKG1fcENsaXBNYXNrKQorICAgIGNsaXBfc2NhbiA9IG1fcENsaXBNYXNrLT5HZXRCdWZmZXIoKSArCisgICAgICAgICAgICAgICAgKG1fRGVzdFRvcCArIGxpbmUgLSBtX3BDbGlwUmduLT5HZXRCb3goKS50b3ApICoKKyAgICAgICAgICAgICAgICAgICAgbV9wQ2xpcE1hc2stPkdldFBpdGNoKCkgKworICAgICAgICAgICAgICAgIChtX0Rlc3RMZWZ0IC0gbV9wQ2xpcFJnbi0+R2V0Qm94KCkubGVmdCk7CisgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9ICh1aW50OF90KiltX3BCaXRtYXAtPkdldFNjYW5saW5lKGxpbmUgKyBtX0Rlc3RUb3ApICsKKyAgICAgICAgICAgICAgICAgICAgICAgbV9EZXN0TGVmdCAqIG1fcEJpdG1hcC0+R2V0QlBQKCkgLyA4OworICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4gPQorICAgICAgbV9wQml0bWFwLT5tX3BBbHBoYU1hc2sKKyAgICAgICAgICA/ICh1aW50OF90KiltX3BCaXRtYXAtPm1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUobGluZSArIG1fRGVzdFRvcCkgKworICAgICAgICAgICAgICAgIG1fRGVzdExlZnQKKyAgICAgICAgICA6IE5VTEw7CisgIERvQ29tcG9zZShkZXN0X3NjYW4sIHNjYW5saW5lLCBtX0Rlc3RXaWR0aCwgY2xpcF9zY2FuLCBzY2FuX2V4dHJhX2FscGhhLAorICAgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuKTsKK30KK3ZvaWQgQ0ZYX0JpdG1hcENvbXBvc2VyOjpDb21wb3NlU2NhbmxpbmVWKGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2NhbmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzY2FuX2V4dHJhX2FscGhhKSB7CisgIGludCBpOworICBpbnQgQnBwID0gbV9wQml0bWFwLT5HZXRCUFAoKSAvIDg7CisgIGludCBkZXN0X3BpdGNoID0gbV9wQml0bWFwLT5HZXRQaXRjaCgpOworICBpbnQgZGVzdF9hbHBoYV9waXRjaCA9CisgICAgICBtX3BCaXRtYXAtPm1fcEFscGhhTWFzayA/IG1fcEJpdG1hcC0+bV9wQWxwaGFNYXNrLT5HZXRQaXRjaCgpIDogMDsKKyAgaW50IGRlc3RfeCA9IG1fRGVzdExlZnQgKyAobV9iRmxpcFggPyAobV9EZXN0V2lkdGggLSBsaW5lIC0gMSkgOiBsaW5lKTsKKyAgdWludDhfdCogZGVzdF9idWYgPQorICAgICAgbV9wQml0bWFwLT5HZXRCdWZmZXIoKSArIGRlc3RfeCAqIEJwcCArIG1fRGVzdFRvcCAqIGRlc3RfcGl0Y2g7CisgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfYnVmID0gbV9wQml0bWFwLT5tX3BBbHBoYU1hc2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtX3BCaXRtYXAtPm1fcEFscGhhTWFzay0+R2V0QnVmZmVyKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3ggKyBtX0Rlc3RUb3AgKiBkZXN0X2FscGhhX3BpdGNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTDsKKyAgaWYgKG1fYkZsaXBZKSB7CisgICAgZGVzdF9idWYgKz0gZGVzdF9waXRjaCAqIChtX0Rlc3RIZWlnaHQgLSAxKTsKKyAgICBkZXN0X2FscGhhX2J1ZiArPSBkZXN0X2FscGhhX3BpdGNoICogKG1fRGVzdEhlaWdodCAtIDEpOworICB9CisgIGludCB5X3N0ZXAgPSBkZXN0X3BpdGNoOworICBpbnQgeV9hbHBoYV9zdGVwID0gZGVzdF9hbHBoYV9waXRjaDsKKyAgaWYgKG1fYkZsaXBZKSB7CisgICAgeV9zdGVwID0gLXlfc3RlcDsKKyAgICB5X2FscGhhX3N0ZXAgPSAteV9hbHBoYV9zdGVwOworICB9CisgIHVpbnQ4X3QqIHNyY19zY2FuID0gbV9wU2NhbmxpbmVWOworICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZjsKKyAgZm9yIChpID0gMDsgaSA8IG1fRGVzdEhlaWdodDsgaSsrKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBCcHA7IGorKykgeworICAgICAgKnNyY19zY2FuKysgPSBkZXN0X3NjYW5bal07CisgICAgfQorICAgIGRlc3Rfc2NhbiArPSB5X3N0ZXA7CisgIH0KKyAgdWludDhfdCogc3JjX2FscGhhX3NjYW4gPSBtX3BTY2FubGluZUFscGhhVjsKKyAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuID0gZGVzdF9hbHBoYV9idWY7CisgIGlmIChkZXN0X2FscGhhX3NjYW4pIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbV9EZXN0SGVpZ2h0OyBpKyspIHsKKyAgICAgICpzcmNfYWxwaGFfc2NhbisrID0gKmRlc3RfYWxwaGFfc2NhbjsKKyAgICAgIGRlc3RfYWxwaGFfc2NhbiArPSB5X2FscGhhX3N0ZXA7CisgICAgfQorICB9CisgIHVpbnQ4X3QqIGNsaXBfc2NhbiA9IE5VTEw7CisgIGlmIChtX3BDbGlwTWFzaykgeworICAgIGNsaXBfc2NhbiA9IG1fcENsaXBTY2FuVjsKKyAgICBpbnQgY2xpcF9waXRjaCA9IG1fcENsaXBNYXNrLT5HZXRQaXRjaCgpOworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19jbGlwID0KKyAgICAgICAgbV9wQ2xpcE1hc2stPkdldEJ1ZmZlcigpICsKKyAgICAgICAgKG1fRGVzdFRvcCAtIG1fcENsaXBSZ24tPkdldEJveCgpLnRvcCkgKiBjbGlwX3BpdGNoICsKKyAgICAgICAgKGRlc3RfeCAtIG1fcENsaXBSZ24tPkdldEJveCgpLmxlZnQpOwogICAgIGlmIChtX2JGbGlwWSkgewotICAgICAgICBkZXN0X2J1ZiArPSBkZXN0X3BpdGNoICogKG1fRGVzdEhlaWdodCAtIDEpOwotICAgICAgICBkZXN0X2FscGhhX2J1ZiArPSBkZXN0X2FscGhhX3BpdGNoICogKG1fRGVzdEhlaWdodCAtIDEpOworICAgICAgc3JjX2NsaXAgKz0gY2xpcF9waXRjaCAqIChtX0Rlc3RIZWlnaHQgLSAxKTsKKyAgICAgIGNsaXBfcGl0Y2ggPSAtY2xpcF9waXRjaDsKICAgICB9Ci0gICAgaW50IHlfc3RlcCA9IGRlc3RfcGl0Y2g7Ci0gICAgaW50IHlfYWxwaGFfc3RlcCA9IGRlc3RfYWxwaGFfcGl0Y2g7Ci0gICAgaWYgKG1fYkZsaXBZKSB7Ci0gICAgICAgIHlfc3RlcCA9IC15X3N0ZXA7Ci0gICAgICAgIHlfYWxwaGFfc3RlcCA9IC15X2FscGhhX3N0ZXA7CisgICAgZm9yIChpID0gMDsgaSA8IG1fRGVzdEhlaWdodDsgaSsrKSB7CisgICAgICBjbGlwX3NjYW5baV0gPSAqc3JjX2NsaXA7CisgICAgICBzcmNfY2xpcCArPSBjbGlwX3BpdGNoOwogICAgIH0KLSAgICBGWF9MUEJZVEUgc3JjX3NjYW4gPSBtX3BTY2FubGluZVY7Ci0gICAgRlhfTFBCWVRFIGRlc3Rfc2NhbiA9IGRlc3RfYnVmOwotICAgIGZvciAoaSA9IDA7IGkgPCBtX0Rlc3RIZWlnaHQ7IGkgKyspIHsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBCcHA7IGogKyspIHsKLSAgICAgICAgICAgICpzcmNfc2NhbisrID0gZGVzdF9zY2FuW2pdOwotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArPSB5X3N0ZXA7CisgIH0KKyAgRG9Db21wb3NlKG1fcFNjYW5saW5lViwgc2NhbmxpbmUsIG1fRGVzdEhlaWdodCwgY2xpcF9zY2FuLCBzY2FuX2V4dHJhX2FscGhhLAorICAgICAgICAgICAgbV9wU2NhbmxpbmVBbHBoYVYpOworICBzcmNfc2NhbiA9IG1fcFNjYW5saW5lVjsKKyAgZGVzdF9zY2FuID0gZGVzdF9idWY7CisgIGZvciAoaSA9IDA7IGkgPCBtX0Rlc3RIZWlnaHQ7IGkrKykgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgQnBwOyBqKyspIHsKKyAgICAgIGRlc3Rfc2NhbltqXSA9ICpzcmNfc2NhbisrOwogICAgIH0KLSAgICBGWF9MUEJZVEUgc3JjX2FscGhhX3NjYW4gPSBtX3BTY2FubGluZUFscGhhVjsKLSAgICBGWF9MUEJZVEUgZGVzdF9hbHBoYV9zY2FuID0gZGVzdF9hbHBoYV9idWY7Ci0gICAgaWYgKGRlc3RfYWxwaGFfc2NhbikgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9EZXN0SGVpZ2h0OyBpICsrKSB7Ci0gICAgICAgICAgICAqc3JjX2FscGhhX3NjYW4rKyA9ICpkZXN0X2FscGhhX3NjYW47Ci0gICAgICAgICAgICBkZXN0X2FscGhhX3NjYW4gKz0geV9hbHBoYV9zdGVwOwotICAgICAgICB9CisgICAgZGVzdF9zY2FuICs9IHlfc3RlcDsKKyAgfQorICBzcmNfYWxwaGFfc2NhbiA9IG1fcFNjYW5saW5lQWxwaGFWOworICBkZXN0X2FscGhhX3NjYW4gPSBkZXN0X2FscGhhX2J1ZjsKKyAgaWYgKGRlc3RfYWxwaGFfc2NhbikgeworICAgIGZvciAoaSA9IDA7IGkgPCBtX0Rlc3RIZWlnaHQ7IGkrKykgeworICAgICAgKmRlc3RfYWxwaGFfc2NhbiA9ICpzcmNfYWxwaGFfc2NhbisrOworICAgICAgZGVzdF9hbHBoYV9zY2FuICs9IHlfYWxwaGFfc3RlcDsKICAgICB9Ci0gICAgRlhfTFBCWVRFIGNsaXBfc2NhbiA9IE5VTEw7Ci0gICAgaWYgKG1fcENsaXBNYXNrKSB7Ci0gICAgICAgIGNsaXBfc2NhbiA9IG1fcENsaXBTY2FuVjsKLSAgICAgICAgaW50IGNsaXBfcGl0Y2ggPSBtX3BDbGlwTWFzay0+R2V0UGl0Y2goKTsKLSAgICAgICAgRlhfTFBDQllURSBzcmNfY2xpcCA9IG1fcENsaXBNYXNrLT5HZXRCdWZmZXIoKSArIChtX0Rlc3RUb3AgLSBtX3BDbGlwUmduLT5HZXRCb3goKS50b3ApICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfcGl0Y2ggKyAoZGVzdF94IC0gbV9wQ2xpcFJnbi0+R2V0Qm94KCkubGVmdCk7Ci0gICAgICAgIGlmIChtX2JGbGlwWSkgewotICAgICAgICAgICAgc3JjX2NsaXAgKz0gY2xpcF9waXRjaCAqIChtX0Rlc3RIZWlnaHQgLSAxKTsKLSAgICAgICAgICAgIGNsaXBfcGl0Y2ggPSAtY2xpcF9waXRjaDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9EZXN0SGVpZ2h0OyBpICsrKSB7Ci0gICAgICAgICAgICBjbGlwX3NjYW5baV0gPSAqc3JjX2NsaXA7Ci0gICAgICAgICAgICBzcmNfY2xpcCArPSBjbGlwX3BpdGNoOwotICAgICAgICB9Ci0gICAgfQotICAgIERvQ29tcG9zZShtX3BTY2FubGluZVYsIHNjYW5saW5lLCBtX0Rlc3RIZWlnaHQsIGNsaXBfc2Nhbiwgc2Nhbl9leHRyYV9hbHBoYSwgbV9wU2NhbmxpbmVBbHBoYVYpOwotICAgIHNyY19zY2FuID0gbV9wU2NhbmxpbmVWOwotICAgIGRlc3Rfc2NhbiA9IGRlc3RfYnVmOwotICAgIGZvciAoaSA9IDA7IGkgPCBtX0Rlc3RIZWlnaHQ7IGkgKyspIHsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBCcHA7IGogKyspIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhbltqXSA9ICpzcmNfc2NhbisrOwotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArPSB5X3N0ZXA7Ci0gICAgfQotICAgIHNyY19hbHBoYV9zY2FuID0gbV9wU2NhbmxpbmVBbHBoYVY7Ci0gICAgZGVzdF9hbHBoYV9zY2FuID0gZGVzdF9hbHBoYV9idWY7Ci0gICAgaWYgKGRlc3RfYWxwaGFfc2NhbikgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9EZXN0SGVpZ2h0OyBpICsrKSB7Ci0gICAgICAgICAgICAqZGVzdF9hbHBoYV9zY2FuID0gKnNyY19hbHBoYV9zY2FuKys7Ci0gICAgICAgICAgICBkZXN0X2FscGhhX3NjYW4gKz0geV9hbHBoYV9zdGVwOwotICAgICAgICB9Ci0gICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfY29udmVydC5jcHAgYi9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfY29udmVydC5jcHAKaW5kZXggZGFjYzQzZC4uZDg3YjFmOSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX2NvbnZlcnQuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9jb252ZXJ0LmNwcApAQCAtNCw5ICs0LDEwIEBACiAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZGliLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGdlL2Z4X2dlLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9kaWIuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9nZS5oIgorCiBjb25zdCBGWF9EV09SRCBnX2R3V2luUGFsZXR0ZVsyNTZdID0gewogICAgIDB4ZmYwMDAwMDAsIDB4ZmY4MDAwMDAsIDB4ZmYwMDgwMDAsIDB4ZmY4MDgwMDAsIDB4ZmYwMDAwODAsIDB4ZmY4MDAwODAsCiAgICAgMHhmZjAwODA4MCwgMHhmZjgwODA4MCwgMHhmZkMwRENDMCwgMHhmZkE2Q0FGMCwgMHhmZjJBM0ZBQSwgMHhmZjJBM0ZGRiwKQEAgLTUwLDggKzUxLDcgQEAKICAgICAweGZmMDBGRjU1LCAweGZmMDBGRkFBLCAweGZmMkEwMDAwLCAweGZmMkEwMDU1LCAweGZmMkEwMEFBLCAweGZmMkEwMEZGLAogICAgIDB4ZmYyQTFGMDAsIDB4ZmYyQTFGNTUsIDB4ZmYyQTFGQUEsIDB4ZmYyQTFGRkYsIDB4ZmYyQTNGMDAsIDB4ZmYyQTNGNTUsCiAgICAgMHhmZkZGRkJGMCwgMHhmZkEwQTBBNCwgMHhmZjgwODA4MCwgMHhmZkZGMDAwMCwgMHhmZjAwRkYwMCwgMHhmZkZGMDAwMCwKLSAgICAweGZmMDAwMEZGLCAweGZmRkYwMEZGLCAweGZmMDBGRkZGLCAweGZmRkZGRkZGCi19OworICAgIDB4ZmYwMDAwRkYsIDB4ZmZGRjAwRkYsIDB4ZmYwMEZGRkYsIDB4ZmZGRkZGRkZ9OwogY29uc3QgRlhfRFdPUkQgZ19kd01hY1BhbGV0dGVbMjU2XSA9IHsKICAgICAweGZmRkZGRkZGLCAweGZmRkZGRkNDLCAweGZmRkZGRjk5LCAweGZmRkZGRjY2LCAweGZmRkZGRjMzLCAweGZmRkZGRjAwLAogICAgIDB4ZmZGRkNDRkYsIDB4ZmZGRkNDQ0MsIDB4ZmZGRkNDOTksIDB4ZmZGRkNDNjYsIDB4ZmZGRkNDMzMsIDB4ZmZGRkNDMDAsCkBAIC04OCw5ODEgKzg4LDExNDYgQEAKICAgICAweGZmMDA5OUZGLCAweGZmMDA5OUNDLCAweGZmMDA5OTk5LCAweGZmMDA5OTY2LCAweGZmMDA5OTMzLCAweGZmMDA5OTAwLAogICAgIDB4ZmYwMDY2RkYsIDB4ZmYwMDY2Q0MsIDB4ZmYwMDY2OTksIDB4ZmYwMDY2NjYsIDB4ZmYwMDY2MzMsIDB4ZmYwMDY2MDAsCiAgICAgMHhmZjAwMzNGRiwgMHhmZjAwMzNDQywgMHhmZjAwMzM5OSwgMHhmZjAwMzM2NiwgMHhmZjAwMzMzMywgMHhmZjAwMzMwMCwKLSAgICAweGZmMDAwMEZGLCAweGZmMDAwMENDLCAweGZmMDAwMDk5LCAweGZmMDAwMDY2LCAweGZmMDAwMDMzLAotICAgIDB4ZmZFRTAwMDAsIDB4ZmZERDAwMDAsIDB4ZmZCQjAwMDAsIDB4ZmZBQTAwMDAsIDB4ZmY4ODAwMDAsIDB4ZmY3NzAwMDAsCi0gICAgMHhmZjU1MDAwMCwgMHhmZjQ0MDAwMCwgMHhmZjIyMDAwMCwgMHhmZjExMDAwMCwgMHhmZjAwRUUwMCwgMHhmZjAwREQwMCwKLSAgICAweGZmMDBCQjAwLCAweGZmMDBBQTAwLCAweGZmMDA4ODAwLCAweGZmMDA3NzAwLCAweGZmMDA1NTAwLCAweGZmMDA0NDAwLAotICAgIDB4ZmYwMDIyMDAsIDB4ZmYwMDExMDAsIDB4ZmYwMDAwRUUsIDB4ZmYwMDAwREQsIDB4ZmYwMDAwQkIsIDB4ZmYwMDAwQUEsCi0gICAgMHhmZjAwMDA4OCwgMHhmZjAwMDA3NywgMHhmZjAwMDA1NSwgMHhmZjAwMDA0NCwgMHhmZjAwMDAyMiwgMHhmZjAwMDAxMSwKLSAgICAweGZmRUVFRUVFLCAweGZmRERERERELCAweGZmQkJCQkJCLCAweGZmQUFBQUFBLCAweGZmODg4ODg4LCAweGZmNzc3Nzc3LAotICAgIDB4ZmY1NTU1NTUsIDB4ZmY0NDQ0NDQsIDB4ZmYyMjIyMjIsIDB4ZmYxMTExMTEsIDB4ZmYwMDAwMDAKLX07Ci1jbGFzcyBDRlhfUGFsZXR0ZQotewotcHVibGljOgotICAgIENGWF9QYWxldHRlKCk7Ci0gICAgfkNGWF9QYWxldHRlKCk7Ci1wdWJsaWM6Ci0gICAgRlhfQk9PTCAgICAgIEJ1aWxkUGFsZXR0ZShjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgZHdQYWxldHRlVHlwZSk7Ci0gICAgRlhfRFdPUkQqICAgIEdldFBhbGV0dGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcFBhbGV0dGU7Ci0gICAgfQorICAgIDB4ZmYwMDAwRkYsIDB4ZmYwMDAwQ0MsIDB4ZmYwMDAwOTksIDB4ZmYwMDAwNjYsIDB4ZmYwMDAwMzMsIDB4ZmZFRTAwMDAsCisgICAgMHhmZkREMDAwMCwgMHhmZkJCMDAwMCwgMHhmZkFBMDAwMCwgMHhmZjg4MDAwMCwgMHhmZjc3MDAwMCwgMHhmZjU1MDAwMCwKKyAgICAweGZmNDQwMDAwLCAweGZmMjIwMDAwLCAweGZmMTEwMDAwLCAweGZmMDBFRTAwLCAweGZmMDBERDAwLCAweGZmMDBCQjAwLAorICAgIDB4ZmYwMEFBMDAsIDB4ZmYwMDg4MDAsIDB4ZmYwMDc3MDAsIDB4ZmYwMDU1MDAsIDB4ZmYwMDQ0MDAsIDB4ZmYwMDIyMDAsCisgICAgMHhmZjAwMTEwMCwgMHhmZjAwMDBFRSwgMHhmZjAwMDBERCwgMHhmZjAwMDBCQiwgMHhmZjAwMDBBQSwgMHhmZjAwMDA4OCwKKyAgICAweGZmMDAwMDc3LCAweGZmMDAwMDU1LCAweGZmMDAwMDQ0LCAweGZmMDAwMDIyLCAweGZmMDAwMDExLCAweGZmRUVFRUVFLAorICAgIDB4ZmZEREREREQsIDB4ZmZCQkJCQkIsIDB4ZmZBQUFBQUEsIDB4ZmY4ODg4ODgsIDB4ZmY3Nzc3NzcsIDB4ZmY1NTU1NTUsCisgICAgMHhmZjQ0NDQ0NCwgMHhmZjIyMjIyMiwgMHhmZjExMTExMSwgMHhmZjAwMDAwMH07CitjbGFzcyBDRlhfUGFsZXR0ZSB7CisgcHVibGljOgorICBDRlhfUGFsZXR0ZSgpOworICB+Q0ZYX1BhbGV0dGUoKTsKIAotICAgIEZYX0RXT1JEKiAgICBHZXRDb2xvckx1dCgpY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2NMdXQ7Ci0gICAgfQotICAgIEZYX0RXT1JEKiAgICBHZXRBbW91bnRMdXQoKWNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV9hTHV0OwotICAgIH0KLSAgICBGWF9JTlQzMiAgICAgR2V0bHV0KCljb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fbHV0OwotICAgIH0KLXByb3RlY3RlZDoKLSAgICBGWF9EV09SRCogICAgbV9wUGFsZXR0ZTsKLSAgICBGWF9EV09SRCogICAgbV9jTHV0OwotICAgIEZYX0RXT1JEKiAgICBtX2FMdXQ7Ci0gICAgaW50ICAgICAgICAgIG1fbHV0OworIHB1YmxpYzoKKyAgRlhfQk9PTCBCdWlsZFBhbGV0dGUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGR3UGFsZXR0ZVR5cGUpOworICBGWF9EV09SRCogR2V0UGFsZXR0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcFBhbGV0dGU7IH0KKworICBGWF9EV09SRCogR2V0Q29sb3JMdXQoKSBjb25zdCB7IHJldHVybiBtX2NMdXQ7IH0KKyAgRlhfRFdPUkQqIEdldEFtb3VudEx1dCgpIGNvbnN0IHsgcmV0dXJuIG1fYUx1dDsgfQorICBpbnQzMl90IEdldGx1dCgpIGNvbnN0IHsgcmV0dXJuIG1fbHV0OyB9CisKKyBwcm90ZWN0ZWQ6CisgIEZYX0RXT1JEKiBtX3BQYWxldHRlOworICBGWF9EV09SRCogbV9jTHV0OworICBGWF9EV09SRCogbV9hTHV0OworICBpbnQgbV9sdXQ7CiB9OwotaW50IF9QYXJ0aXRpb24oRlhfRFdPUkQqIGFsdXQsIEZYX0RXT1JEKiBjbHV0LCBpbnQgbCwgaW50IHIpCi17Ci0gICAgRlhfRFdPUkQgcF9hID0gYWx1dFtsXTsKLSAgICBGWF9EV09SRCBwX2MgPSBjbHV0W2xdOwotICAgIHdoaWxlKGwgPCByKSB7Ci0gICAgICAgIHdoaWxlKGwgPCByICYmIGFsdXRbcl0gPj0gcF9hKSB7Ci0gICAgICAgICAgICByLS07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGwgPCByKSB7Ci0gICAgICAgICAgICBhbHV0W2xdID0gYWx1dFtyXTsKLSAgICAgICAgICAgIGNsdXRbbCsrXSA9IGNsdXRbcl07Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUobCA8IHIgJiYgYWx1dFtsXSA8PSBwX2EpIHsKLSAgICAgICAgICAgIGwrKzsKLSAgICAgICAgfQotICAgICAgICBpZiAobCA8IHIpIHsKLSAgICAgICAgICAgIGFsdXRbcl0gPSBhbHV0W2xdOwotICAgICAgICAgICAgY2x1dFtyLS1dID0gY2x1dFtsXTsKLSAgICAgICAgfQoraW50IF9QYXJ0aXRpb24oRlhfRFdPUkQqIGFsdXQsIEZYX0RXT1JEKiBjbHV0LCBpbnQgbCwgaW50IHIpIHsKKyAgRlhfRFdPUkQgcF9hID0gYWx1dFtsXTsKKyAgRlhfRFdPUkQgcF9jID0gY2x1dFtsXTsKKyAgd2hpbGUgKGwgPCByKSB7CisgICAgd2hpbGUgKGwgPCByICYmIGFsdXRbcl0gPj0gcF9hKSB7CisgICAgICByLS07CiAgICAgfQotICAgIGFsdXRbbF0gPSBwX2E7Ci0gICAgY2x1dFtsXSA9IHBfYzsKLSAgICByZXR1cm4gbDsKKyAgICBpZiAobCA8IHIpIHsKKyAgICAgIGFsdXRbbF0gPSBhbHV0W3JdOworICAgICAgY2x1dFtsKytdID0gY2x1dFtyXTsKKyAgICB9CisgICAgd2hpbGUgKGwgPCByICYmIGFsdXRbbF0gPD0gcF9hKSB7CisgICAgICBsKys7CisgICAgfQorICAgIGlmIChsIDwgcikgeworICAgICAgYWx1dFtyXSA9IGFsdXRbbF07CisgICAgICBjbHV0W3ItLV0gPSBjbHV0W2xdOworICAgIH0KKyAgfQorICBhbHV0W2xdID0gcF9hOworICBjbHV0W2xdID0gcF9jOworICByZXR1cm4gbDsKIH0KLXZvaWQgX1Fzb3J0KEZYX0RXT1JEKiBhbHV0LCBGWF9EV09SRCogY2x1dCwgaW50IGwsIGludCByKQotewotICAgIGlmKGwgPCByKSB7Ci0gICAgICAgIGludCBwSSA9IF9QYXJ0aXRpb24oYWx1dCwgY2x1dCwgbCwgcik7Ci0gICAgICAgIF9Rc29ydChhbHV0LCBjbHV0LCBsLCBwSSAtIDEpOwotICAgICAgICBfUXNvcnQoYWx1dCwgY2x1dCwgcEkgKyAxLCByKTsKLSAgICB9Cit2b2lkIF9Rc29ydChGWF9EV09SRCogYWx1dCwgRlhfRFdPUkQqIGNsdXQsIGludCBsLCBpbnQgcikgeworICBpZiAobCA8IHIpIHsKKyAgICBpbnQgcEkgPSBfUGFydGl0aW9uKGFsdXQsIGNsdXQsIGwsIHIpOworICAgIF9Rc29ydChhbHV0LCBjbHV0LCBsLCBwSSAtIDEpOworICAgIF9Rc29ydChhbHV0LCBjbHV0LCBwSSArIDEsIHIpOworICB9CiB9Ci12b2lkIF9Db2xvckRlY29kZShGWF9EV09SRCBwYWxfdiwgRlhfQllURSYgciwgRlhfQllURSYgZywgRlhfQllURSYgYikKLXsKLSAgICByID0gKEZYX0JZVEUpKChwYWxfdiAmIDB4ZjAwKSA+PiA0KTsKLSAgICBnID0gKEZYX0JZVEUpKHBhbF92ICYgMHgwZjApOwotICAgIGIgPSAoRlhfQllURSkoKHBhbF92ICYgMHgwMGYpIDw8IDQpOwordm9pZCBfQ29sb3JEZWNvZGUoRlhfRFdPUkQgcGFsX3YsIHVpbnQ4X3QmIHIsIHVpbnQ4X3QmIGcsIHVpbnQ4X3QmIGIpIHsKKyAgciA9ICh1aW50OF90KSgocGFsX3YgJiAweGYwMCkgPj4gNCk7CisgIGcgPSAodWludDhfdCkocGFsX3YgJiAweDBmMCk7CisgIGIgPSAodWludDhfdCkoKHBhbF92ICYgMHgwMGYpIDw8IDQpOwogfQotdm9pZCBfT2J0YWluX1BhbChGWF9EV09SRCogYUx1dCwgRlhfRFdPUkQqY0x1dCwgRlhfRFdPUkQqIGRlc3RfcGFsLCBpbnQgcGFsX3R5cGUsIEZYX0RXT1JEKiB3aW5fbWFjX3BhbCwgRlhfRFdPUkQgbHV0KQotewotICAgIGludCByb3csIGNvbDsKLSAgICBGWF9EV09SRCBsdXRfMSA9IGx1dCAtIDE7Ci0gICAgaWYgKHBhbF90eXBlID09IEZYRElCX1BBTEVUVEVfTE9DKSB7Ci0gICAgICAgIGZvciAocm93ID0gMDsgcm93IDwgMjU2OyByb3crKykgewotICAgICAgICAgICAgaW50IGx1dF9vZmZzZXQgPSBsdXRfMSAtIHJvdzsKLSAgICAgICAgICAgIGlmIChsdXRfb2Zmc2V0IDwgMCkgewotICAgICAgICAgICAgICAgIGx1dF9vZmZzZXQgKz0gMjU2OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IgPSBjTHV0W2x1dF9vZmZzZXRdOwotICAgICAgICAgICAgRlhfQllURSByLCBnLCBiOwotICAgICAgICAgICAgX0NvbG9yRGVjb2RlKGNvbG9yLCByLCBnLCBiKTsKLSAgICAgICAgICAgIGRlc3RfcGFsW3Jvd10gPSAoKEZYX0RXT1JEKXIgPDwgMTYpIHwgKChGWF9EV09SRClnIDw8IDgpIHwgYiB8IDB4ZmYwMDAwMDA7Ci0gICAgICAgICAgICBhTHV0W2x1dF9vZmZzZXRdID0gcm93OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChyb3cgPSAwOyByb3cgPCAyNTY7IHJvdysrKSB7Ci0gICAgICAgICAgICBpbnQgbHV0X29mZnNldCA9IGx1dF8xIC0gcm93OwotICAgICAgICAgICAgaWYgKGx1dF9vZmZzZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbHV0X29mZnNldCArPSAyNTY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9CWVRFIHIsIGcsIGI7Ci0gICAgICAgICAgICBfQ29sb3JEZWNvZGUoY0x1dFtsdXRfb2Zmc2V0XSwgciwgZywgYik7Ci0gICAgICAgICAgICBpbnQgZXJyb3IsIG1pbl9lcnJvciA9IDEwMDAwMDA7Ci0gICAgICAgICAgICBpbnQgY19pbmRleCA9IDA7Ci0gICAgICAgICAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IDI1NjsgY29sKyspIHsKLSAgICAgICAgICAgICAgICBGWF9EV09SRCBwX2NvbG9yID0gd2luX21hY19wYWxbY29sXTsKLSAgICAgICAgICAgICAgICBpbnQgZF9yID0gciAtIChGWF9CWVRFKShwX2NvbG9yID4+IDE2KTsKLSAgICAgICAgICAgICAgICBpbnQgZF9nID0gZyAtIChGWF9CWVRFKShwX2NvbG9yID4+IDgpOwotICAgICAgICAgICAgICAgIGludCBkX2IgPSBiIC0gKEZYX0JZVEUpcF9jb2xvcjsKLSAgICAgICAgICAgICAgICBlcnJvciA9IGRfciAqIGRfciArIGRfZyAqIGRfZyArIGRfYiAqIGRfYjsKLSAgICAgICAgICAgICAgICBpZiAoZXJyb3IgPCBtaW5fZXJyb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgbWluX2Vycm9yID0gZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgIGNfaW5kZXggPSBjb2w7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9wYWxbcm93XSA9ICB3aW5fbWFjX3BhbFtjX2luZGV4XTsKLSAgICAgICAgICAgIGFMdXRbbHV0X29mZnNldF0gPSByb3c7Ci0gICAgICAgIH0KK3ZvaWQgX09idGFpbl9QYWwoRlhfRFdPUkQqIGFMdXQsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBjTHV0LAorICAgICAgICAgICAgICAgICBGWF9EV09SRCogZGVzdF9wYWwsCisgICAgICAgICAgICAgICAgIGludCBwYWxfdHlwZSwKKyAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHdpbl9tYWNfcGFsLAorICAgICAgICAgICAgICAgICBGWF9EV09SRCBsdXQpIHsKKyAgaW50IHJvdywgY29sOworICBGWF9EV09SRCBsdXRfMSA9IGx1dCAtIDE7CisgIGlmIChwYWxfdHlwZSA9PSBGWERJQl9QQUxFVFRFX0xPQykgeworICAgIGZvciAocm93ID0gMDsgcm93IDwgMjU2OyByb3crKykgeworICAgICAgaW50IGx1dF9vZmZzZXQgPSBsdXRfMSAtIHJvdzsKKyAgICAgIGlmIChsdXRfb2Zmc2V0IDwgMCkgeworICAgICAgICBsdXRfb2Zmc2V0ICs9IDI1NjsKKyAgICAgIH0KKyAgICAgIEZYX0RXT1JEIGNvbG9yID0gY0x1dFtsdXRfb2Zmc2V0XTsKKyAgICAgIHVpbnQ4X3QgciwgZywgYjsKKyAgICAgIF9Db2xvckRlY29kZShjb2xvciwgciwgZywgYik7CisgICAgICBkZXN0X3BhbFtyb3ddID0gKChGWF9EV09SRClyIDw8IDE2KSB8ICgoRlhfRFdPUkQpZyA8PCA4KSB8IGIgfCAweGZmMDAwMDAwOworICAgICAgYUx1dFtsdXRfb2Zmc2V0XSA9IHJvdzsKICAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChyb3cgPSAwOyByb3cgPCAyNTY7IHJvdysrKSB7CisgICAgICBpbnQgbHV0X29mZnNldCA9IGx1dF8xIC0gcm93OworICAgICAgaWYgKGx1dF9vZmZzZXQgPCAwKSB7CisgICAgICAgIGx1dF9vZmZzZXQgKz0gMjU2OworICAgICAgfQorICAgICAgdWludDhfdCByLCBnLCBiOworICAgICAgX0NvbG9yRGVjb2RlKGNMdXRbbHV0X29mZnNldF0sIHIsIGcsIGIpOworICAgICAgaW50IGVycm9yLCBtaW5fZXJyb3IgPSAxMDAwMDAwOworICAgICAgaW50IGNfaW5kZXggPSAwOworICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCAyNTY7IGNvbCsrKSB7CisgICAgICAgIEZYX0RXT1JEIHBfY29sb3IgPSB3aW5fbWFjX3BhbFtjb2xdOworICAgICAgICBpbnQgZF9yID0gciAtICh1aW50OF90KShwX2NvbG9yID4+IDE2KTsKKyAgICAgICAgaW50IGRfZyA9IGcgLSAodWludDhfdCkocF9jb2xvciA+PiA4KTsKKyAgICAgICAgaW50IGRfYiA9IGIgLSAodWludDhfdClwX2NvbG9yOworICAgICAgICBlcnJvciA9IGRfciAqIGRfciArIGRfZyAqIGRfZyArIGRfYiAqIGRfYjsKKyAgICAgICAgaWYgKGVycm9yIDwgbWluX2Vycm9yKSB7CisgICAgICAgICAgbWluX2Vycm9yID0gZXJyb3I7CisgICAgICAgICAgY19pbmRleCA9IGNvbDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZGVzdF9wYWxbcm93XSA9IHdpbl9tYWNfcGFsW2NfaW5kZXhdOworICAgICAgYUx1dFtsdXRfb2Zmc2V0XSA9IHJvdzsKKyAgICB9CisgIH0KIH0KLUNGWF9QYWxldHRlOjpDRlhfUGFsZXR0ZSgpCi17Ci0gICAgbV9wUGFsZXR0ZSA9IE5VTEw7Ci0gICAgbV9jTHV0ID0gTlVMTDsKLSAgICBtX2FMdXQgPSBOVUxMOwotICAgIG1fbHV0ID0gMDsKK0NGWF9QYWxldHRlOjpDRlhfUGFsZXR0ZSgpIHsKKyAgbV9wUGFsZXR0ZSA9IE5VTEw7CisgIG1fY0x1dCA9IE5VTEw7CisgIG1fYUx1dCA9IE5VTEw7CisgIG1fbHV0ID0gMDsKIH0KLUNGWF9QYWxldHRlOjp+Q0ZYX1BhbGV0dGUoKQotewotICAgIGlmIChtX3BQYWxldHRlKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wUGFsZXR0ZSk7Ci0gICAgfQotICAgIGlmIChtX2NMdXQpIHsKLSAgICAgICAgRlhfRnJlZShtX2NMdXQpOwotICAgIH0KLSAgICBpZiAobV9hTHV0KSB7Ci0gICAgICAgIEZYX0ZyZWUobV9hTHV0KTsKLSAgICB9Ci0gICAgbV9sdXQgPSAwOworQ0ZYX1BhbGV0dGU6On5DRlhfUGFsZXR0ZSgpIHsKKyAgRlhfRnJlZShtX3BQYWxldHRlKTsKKyAgRlhfRnJlZShtX2NMdXQpOworICBGWF9GcmVlKG1fYUx1dCk7CisgIG1fbHV0ID0gMDsKIH0KLUZYX0JPT0wgQ0ZYX1BhbGV0dGU6OkJ1aWxkUGFsZXR0ZShjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgcGFsX3R5cGUpCi17Ci0gICAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX3BQYWxldHRlICE9IE5VTEwpIHsKLSAgICAgICAgRlhfRnJlZShtX3BQYWxldHRlKTsKLSAgICB9Ci0gICAgbV9wUGFsZXR0ZSA9IEZYX0FsbG9jKEZYX0RXT1JELCAyNTYpOwotICAgIGludCBicHAgICAgPSBwQml0bWFwLT5HZXRCUFAoKSAvIDg7Ci0gICAgaW50IHdpZHRoICA9IHBCaXRtYXAtPkdldFdpZHRoKCk7Ci0gICAgaW50IGhlaWdodCA9IHBCaXRtYXAtPkdldEhlaWdodCgpOwotICAgIGlmIChtX2NMdXQpIHsKLSAgICAgICAgRlhfRnJlZShtX2NMdXQpOwotICAgICAgICBtX2NMdXQgPSBOVUxMOwotICAgIH0KLSAgICBpZiAobV9hTHV0KSB7Ci0gICAgICAgIEZYX0ZyZWUobV9hTHV0KTsKLSAgICAgICAgbV9hTHV0ID0gTlVMTDsKLSAgICB9Ci0gICAgbV9jTHV0ID0gRlhfQWxsb2MoRlhfRFdPUkQsIDQwOTYpOwotICAgIG1fYUx1dCA9IEZYX0FsbG9jKEZYX0RXT1JELCA0MDk2KTsKLSAgICBpbnQgcm93LCBjb2w7Ci0gICAgbV9sdXQgPSAwOwotICAgIGZvciAocm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgewotICAgICAgICBGWF9CWVRFKiBzY2FuX2xpbmUgPSAoRlhfQllURSopcEJpdG1hcC0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKLSAgICAgICAgICAgIEZYX0JZVEUqIHNyY19wb3J0ID0gc2Nhbl9saW5lICsgY29sICogYnBwOwotICAgICAgICAgICAgRlhfRFdPUkQgYiA9IHNyY19wb3J0WzBdICYgMHhmMDsKLSAgICAgICAgICAgIEZYX0RXT1JEIGcgPSBzcmNfcG9ydFsxXSAmIDB4ZjA7Ci0gICAgICAgICAgICBGWF9EV09SRCByID0gc3JjX3BvcnRbMl0gJiAweGYwOwotICAgICAgICAgICAgRlhfRFdPUkQgaW5kZXggPSAociA8PCA0KSArIGcgKyAoYiA+PiA0KTsKLSAgICAgICAgICAgIG1fYUx1dFtpbmRleF0rKzsKLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IDQwOTY7IHJvdysrKSB7Ci0gICAgICAgIGlmIChtX2FMdXRbcm93XSAhPSAwKSB7Ci0gICAgICAgICAgICBtX2FMdXRbbV9sdXRdID0gbV9hTHV0W3Jvd107Ci0gICAgICAgICAgICBtX2NMdXRbbV9sdXRdID0gcm93OwotICAgICAgICAgICAgbV9sdXQrKzsKLSAgICAgICAgfQotICAgIH0KLSAgICBfUXNvcnQobV9hTHV0LCBtX2NMdXQsIDAsIG1fbHV0IC0gMSk7Ci0gICAgRlhfRFdPUkQqIHdpbl9tYWNfcGFsID0gTlVMTDsKLSAgICBpZiAocGFsX3R5cGUgPT0gRlhESUJfUEFMRVRURV9XSU4pIHsKLSAgICAgICAgd2luX21hY19wYWwgPSAoRlhfRFdPUkQqKWdfZHdXaW5QYWxldHRlOwotICAgIH0gZWxzZSBpZiAocGFsX3R5cGUgPT0gRlhESUJfUEFMRVRURV9NQUMpIHsKLSAgICAgICAgd2luX21hY19wYWwgPSAoRlhfRFdPUkQqKWdfZHdNYWNQYWxldHRlOwotICAgIH0KLSAgICBfT2J0YWluX1BhbChtX2FMdXQsIG1fY0x1dCwgbV9wUGFsZXR0ZSwgcGFsX3R5cGUsIHdpbl9tYWNfcGFsLCBtX2x1dCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIF9Db252ZXJ0QnVmZmVyXzFicHBNYXNrMkdyYXkoRlhfTFBCWVRFIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3ApCi17Ci0gICAgRlhfQllURSBzZXRfZ3JheSwgcmVzZXRfZ3JheTsKLSAgICBzZXRfZ3JheSA9IDB4ZmY7Ci0gICAgcmVzZXRfZ3JheSA9IDB4MDA7Ci0gICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgRlhfTFBCWVRFIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICAgICAgRlhTWVNfbWVtc2V0OChkZXN0X3NjYW4sIHJlc2V0X2dyYXksIHdpZHRoKTsKLSAgICAgICAgRlhfTFBDQllURSBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpOwotICAgICAgICBmb3IgKGludCBjb2wgPSBzcmNfbGVmdDsgY29sIDwgc3JjX2xlZnQgKyB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICBpZiAoc3JjX3NjYW5bY29sIC8gOF0gJiAoMSA8PCAoNyAtIGNvbCAlIDgpKSkgewotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBzZXRfZ3JheTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfOGJwcE1hc2syR3JheShGWF9MUEJZVEUgZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCkKLXsKLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICBGWF9MUEJZVEUgZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOwotICAgICAgICBGWF9MUENCWVRFIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdDsKLSAgICAgICAgRlhTWVNfbWVtY3B5MzIoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfMWJwcFBsdDJHcmF5KEZYX0xQQllURSBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgRlhfRFdPUkQqIHNyY19wbHQgPSBwU3JjQml0bWFwLT5HZXRQYWxldHRlKCk7Ci0gICAgRlhfQllURSBncmF5WzJdOwotICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgIEZYX0RXT1JEIHBsdFsyXTsKLSAgICAgICAgaWYgKHBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCkpIHsKLSAgICAgICAgICAgIHBsdFswXSA9IEZYQ01ZS19UT0RJQihzcmNfcGx0WzBdKTsKLSAgICAgICAgICAgIHBsdFsxXSA9IEZYQ01ZS19UT0RJQihzcmNfcGx0WzFdKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZYX0xQQllURSBiZ3JfcHRyID0gKEZYX0xQQllURSlwbHQ7Ci0gICAgICAgICAgICBiZ3JfcHRyWzBdID0gRlhBUkdCX0Ioc3JjX3BsdFswXSk7Ci0gICAgICAgICAgICBiZ3JfcHRyWzFdID0gRlhBUkdCX0coc3JjX3BsdFswXSk7Ci0gICAgICAgICAgICBiZ3JfcHRyWzJdID0gRlhBUkdCX1Ioc3JjX3BsdFswXSk7Ci0gICAgICAgICAgICBiZ3JfcHRyWzNdID0gRlhBUkdCX0Ioc3JjX3BsdFsxXSk7Ci0gICAgICAgICAgICBiZ3JfcHRyWzRdID0gRlhBUkdCX0coc3JjX3BsdFsxXSk7Ci0gICAgICAgICAgICBiZ3JfcHRyWzVdID0gRlhBUkdCX1Ioc3JjX3BsdFsxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBncmF5LCAoRlhfTFBDQllURSlwbHQsIDIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYX0JZVEUgcmVzZXRfciwgcmVzZXRfZywgcmVzZXRfYiwKLSAgICAgICAgICAgICAgICBzZXRfciwgc2V0X2csIHNldF9iOwotICAgICAgICBpZiAocFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgewotICAgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShzcmNfcGx0WzBdKSwgRlhTWVNfR2V0TVZhbHVlKHNyY19wbHRbMF0pLCBGWFNZU19HZXRZVmFsdWUoc3JjX3BsdFswXSksIEZYU1lTX0dldEtWYWx1ZShzcmNfcGx0WzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldF9yLCByZXNldF9nLCByZXNldF9iKTsKLSAgICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUoc3JjX3BsdFsxXSksIEZYU1lTX0dldE1WYWx1ZShzcmNfcGx0WzFdKSwgRlhTWVNfR2V0WVZhbHVlKHNyY19wbHRbMV0pLCBGWFNZU19HZXRLVmFsdWUoc3JjX3BsdFsxXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3IsIHNldF9nLCBzZXRfYik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXNldF9yID0gRlhBUkdCX1Ioc3JjX3BsdFswXSk7Ci0gICAgICAgICAgICByZXNldF9nID0gRlhBUkdCX0coc3JjX3BsdFswXSk7Ci0gICAgICAgICAgICByZXNldF9iID0gRlhBUkdCX0Ioc3JjX3BsdFswXSk7Ci0gICAgICAgICAgICBzZXRfciA9IEZYQVJHQl9SKHNyY19wbHRbMV0pOwotICAgICAgICAgICAgc2V0X2cgPSBGWEFSR0JfRyhzcmNfcGx0WzFdKTsKLSAgICAgICAgICAgIHNldF9iID0gRlhBUkdCX0Ioc3JjX3BsdFsxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZ3JheVswXSA9IEZYUkdCMkdSQVkocmVzZXRfciwgcmVzZXRfZywgcmVzZXRfYik7Ci0gICAgICAgIGdyYXlbMV0gPSBGWFJHQjJHUkFZKHNldF9yLCBzZXRfZywgc2V0X2IpOwotICAgIH0KLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICBGWF9MUEJZVEUgZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOwotICAgICAgICBGWFNZU19tZW1zZXQ4KGRlc3Rfc2NhbiwgZ3JheVswXSwgd2lkdGgpOwotICAgICAgICBGWF9MUENCWVRFIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdyk7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IHNyY19sZWZ0OyBjb2wgPCBzcmNfbGVmdCArIHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgIGlmIChzcmNfc2Nhbltjb2wgLyA4XSAmICgxIDw8ICg3IC0gY29sICUgOCkpKSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IGdyYXlbMV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIF9Db252ZXJ0QnVmZmVyXzhicHBQbHQyR3JheShGWF9MUEJZVEUgZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIEZYX0RXT1JEKiBzcmNfcGx0ID0gcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpOwotICAgIEZYX0JZVEUgZ3JheVsyNTZdOwotICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgIEZYX0RXT1JEIHBsdFsyNTZdOwotICAgICAgICBpZiAocFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBwbHRbaV0gPSBGWENNWUtfVE9ESUIoc3JjX3BsdFtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGWF9MUEJZVEUgYmdyX3B0ciA9IChGWF9MUEJZVEUpcGx0OwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAqYmdyX3B0cisrID0gRlhBUkdCX0Ioc3JjX3BsdFtpXSk7Ci0gICAgICAgICAgICAgICAgKmJncl9wdHIrKyA9IEZYQVJHQl9HKHNyY19wbHRbaV0pOwotICAgICAgICAgICAgICAgICpiZ3JfcHRyKysgPSBGWEFSR0JfUihzcmNfcGx0W2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGdyYXksIChGWF9MUENCWVRFKXBsdCwgMjU2KTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAocFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgewotICAgICAgICAgICAgRlhfQllURSByLCBnLCBiOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKHNyY19wbHRbaV0pLCBGWFNZU19HZXRNVmFsdWUoc3JjX3BsdFtpXSksIEZYU1lTX0dldFlWYWx1ZShzcmNfcGx0W2ldKSwgRlhTWVNfR2V0S1ZhbHVlKHNyY19wbHRbaV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLCBnLCBiKTsKLSAgICAgICAgICAgICAgICBncmF5W2ldID0gRlhSR0IyR1JBWShyLCBnLCBiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSArKykgewotICAgICAgICAgICAgICAgIGdyYXlbaV0gPSBGWFJHQjJHUkFZKEZYQVJHQl9SKHNyY19wbHRbaV0pLCBGWEFSR0JfRyhzcmNfcGx0W2ldKSwgRlhBUkdCX0Ioc3JjX3BsdFtpXSkpOwotICAgICAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICBGWF9MUEJZVEUgZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOwotICAgICAgICBGWF9MUENCWVRFIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdDsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gZ3JheVsqc3JjX3NjYW4rK107Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIF9Db252ZXJ0QnVmZmVyX1JnYk9yQ215azJHcmF5KEZYX0xQQllURSBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBpbnQgQnBwID0gcFNyY0JpdG1hcC0+R2V0QlBQKCkgLyA4OwotICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICAgICAgaWYgKEJwcCA9PSAzIHx8IHBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCkpIHsKLSAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgRlhfTFBCWVRFIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICAgICAgICAgICAgICBGWF9MUENCWVRFIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdCAqIEJwcDsKLSAgICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7Ci0gICAgICAgICAgICAgICAgRlhfTFBDQllURSBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiA0OwotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZGVzdF9zY2FuLCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7Ci0gICAgICAgICAgICAgICAgRlhfTFBDQllURSBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiA0OwotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfQllURSByLCBnLCBiOwotICAgICAgICAgICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKChGWF9EV09SRClzcmNfc2NhblswXSksIEZYU1lTX0dldE1WYWx1ZSgoRlhfRFdPUkQpc3JjX3NjYW5bMV0pLCBGWFNZU19HZXRZVmFsdWUoKEZYX0RXT1JEKXNyY19zY2FuWzJdKSwgRlhTWVNfR2V0S1ZhbHVlKChGWF9EV09SRClzcmNfc2NhblszXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhSR0IyR1JBWShyLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7Ci0gICAgICAgICAgICAgICAgRlhfTFBDQllURSBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiBCcHA7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgc3JjX3NjYW5bMF0pOwotICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSBCcHA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotaW5saW5lIHZvaWQgX0NvbnZlcnRCdWZmZXJfSW5kZXhDb3B5KEZYX0xQQllURSBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wKQotewotICAgIGlmIChwU3JjQml0bWFwLT5HZXRCUFAoKSA9PSAxKSB7Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICBGWF9MUEJZVEUgZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOwotICAgICAgICAgICAgRlhTWVNfbWVtc2V0MzIoZGVzdF9zY2FuLCAwLCB3aWR0aCk7Ci0gICAgICAgICAgICBGWF9MUENCWVRFIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdyk7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSBzcmNfbGVmdDsgY29sIDwgc3JjX2xlZnQgKyB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNyY19zY2FuW2NvbCAvIDhdICYgKDEgPDwgKDcgLSBjb2wgJSA4KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICBGWF9MUEJZVEUgZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOwotICAgICAgICAgICAgRlhfTFBDQllURSBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQ7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkzMihkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1GWF9CT09MIF9Db252ZXJ0QnVmZmVyX1BsdDJQbHRSZ2I4KEZYX0xQQllURSBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgRlhfRFdPUkQqIGRzdF9wbHQsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgX0NvbnZlcnRCdWZmZXJfSW5kZXhDb3B5KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCk7Ci0gICAgRlhfRFdPUkQqIHNyY19wbHQgPSBwU3JjQml0bWFwLT5HZXRQYWxldHRlKCk7Ci0gICAgaW50IHBsdF9zaXplID0gcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZVNpemUoKTsKLSAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICBGWF9EV09SRCBwbHRbMjU2XTsKLSAgICAgICAgRlhfTFBCWVRFIGJncl9wdHIgPSAoRlhfTFBCWVRFKXBsdDsKLSAgICAgICAgaWYgKHBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCkpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGx0X3NpemU7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBwbHRbaV0gPSBGWENNWUtfVE9ESUIoc3JjX3BsdFtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBsdF9zaXplOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgKmJncl9wdHIrKyA9IEZYQVJHQl9CKHNyY19wbHRbaV0pOwotICAgICAgICAgICAgICAgICpiZ3JfcHRyKysgPSBGWEFSR0JfRyhzcmNfcGx0W2ldKTsKLSAgICAgICAgICAgICAgICAqYmdyX3B0cisrID0gRlhBUkdCX1Ioc3JjX3BsdFtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiZ3JfcHRyID0gKEZYX0xQQllURSlwbHQ7Ci0gICAgICAgIH0KLSAgICAgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAoRlhfTFBCWVRFKXBsdCwgKEZYX0xQQ0JZVEUpcGx0LCBwbHRfc2l6ZSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGx0X3NpemU7IGkgKyspIHsKLSAgICAgICAgICAgIGRzdF9wbHRbaV0gPSBGWEFSR0JfTUFLRSgweGZmLCBiZ3JfcHRyWzJdLCBiZ3JfcHRyWzFdLCBiZ3JfcHRyWzBdKTsKLSAgICAgICAgICAgIGJncl9wdHIgKz0gMzsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBsdF9zaXplOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgRlhfQllURSByLCBnLCBiOwotICAgICAgICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUoc3JjX3BsdFtpXSksIEZYU1lTX0dldE1WYWx1ZShzcmNfcGx0W2ldKSwgRlhTWVNfR2V0WVZhbHVlKHNyY19wbHRbaV0pLCBGWFNZU19HZXRLVmFsdWUoc3JjX3BsdFtpXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIGcsIGIpOwotICAgICAgICAgICAgICAgIGRzdF9wbHRbaV0gPSBGWEFSR0JfTUFLRSgweGZmLCByLCBnLCBiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKGRzdF9wbHQsIHNyY19wbHQsIHBsdF9zaXplICogNCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1pbmxpbmUgRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl9SZ2IyUGx0UmdiOF9Ob1RyYW5zZm9ybShGWF9MUEJZVEUgZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIEZYX0RXT1JEKiBkc3RfcGx0KQotewotICAgIGludCBicHAgPSBwU3JjQml0bWFwLT5HZXRCUFAoKSAvIDg7Ci0gICAgaW50IHJvdywgY29sOwotICAgIENGWF9QYWxldHRlIHBhbGV0dGU7Ci0gICAgcGFsZXR0ZS5CdWlsZFBhbGV0dGUocFNyY0JpdG1hcCwgRlhESUJfUEFMRVRURV9MT0MpOwotICAgIEZYX0RXT1JEKiBjTHV0ID0gcGFsZXR0ZS5HZXRDb2xvckx1dCgpOwotICAgIEZYX0RXT1JEKiBhTHV0ID0gcGFsZXR0ZS5HZXRBbW91bnRMdXQoKTsKLSAgICBpZiAoY0x1dCA9PSBOVUxMIHx8IGFMdXQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGludCBsdXQgPSBwYWxldHRlLkdldGx1dCgpOwotICAgIEZYX0RXT1JEKiBwUGFsZXR0ZSA9IHBhbGV0dGUuR2V0UGFsZXR0ZSgpOwotICAgIGlmIChsdXQgPiAyNTYpIHsKLSAgICAgICAgaW50IGVyciwgbWluX2VycjsKLSAgICAgICAgaW50IGx1dF8yNTYgPSBsdXQgLSAyNTY7Ci0gICAgICAgIGZvciAocm93ID0gMDsgcm93IDwgbHV0XzI1Njsgcm93KyspIHsKLSAgICAgICAgICAgIG1pbl9lcnIgPSAxMDAwMDAwOwotICAgICAgICAgICAgRlhfQllURSByLCBnLCBiOwotICAgICAgICAgICAgX0NvbG9yRGVjb2RlKGNMdXRbcm93XSwgciwgZywgYik7Ci0gICAgICAgICAgICBpbnQgY2xyaW5kZXggPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgMjU2OyBjb2wrKykgewotICAgICAgICAgICAgICAgIEZYX0RXT1JEIHBfY29sb3IgPSAqKHBQYWxldHRlICsgY29sKTsKLSAgICAgICAgICAgICAgICBpbnQgZF9yID0gciAtIChGWF9CWVRFKShwX2NvbG9yID4+IDE2KTsKLSAgICAgICAgICAgICAgICBpbnQgZF9nID0gZyAtIChGWF9CWVRFKShwX2NvbG9yID4+IDgpOwotICAgICAgICAgICAgICAgIGludCBkX2IgPSBiIC0gKEZYX0JZVEUpKHBfY29sb3IpOwotICAgICAgICAgICAgICAgIGVyciA9IGRfciAqIGRfciArIGRfZyAqIGRfZyArIGRfYiAqIGRfYjsKLSAgICAgICAgICAgICAgICBpZiAoZXJyIDwgbWluX2VycikgewotICAgICAgICAgICAgICAgICAgICBtaW5fZXJyID0gZXJyOwotICAgICAgICAgICAgICAgICAgICBjbHJpbmRleCA9IGNvbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhTHV0W3Jvd10gPSBjbHJpbmRleDsKLSAgICAgICAgfQotICAgIH0KLSAgICBGWF9JTlQzMiBsdXRfMSA9IGx1dCAtIDE7Ci0gICAgZm9yIChyb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICBGWF9CWVRFKiBzcmNfc2NhbiA9IChGWF9CWVRFKilwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0OwotICAgICAgICBGWF9CWVRFKiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7Ci0gICAgICAgIGZvciAoY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgICAgICAgICBGWF9CWVRFKiBzcmNfcG9ydCA9IHNyY19zY2FuICsgY29sICogYnBwOwotICAgICAgICAgICAgaW50IHIgPSBzcmNfcG9ydFsyXSAmIDB4ZjA7Ci0gICAgICAgICAgICBpbnQgZyA9IHNyY19wb3J0WzFdICYgMHhmMDsKLSAgICAgICAgICAgIGludCBiID0gc3JjX3BvcnRbMF0gJiAweGYwOwotICAgICAgICAgICAgRlhfRFdPUkQgY2xyaW5kZXggPSAociA8PCA0KSArIGcgKyAoYiA+PiA0KTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBsdXRfMTsgaSA+PSAwOyBpLS0pCi0gICAgICAgICAgICAgICAgaWYgKGNscmluZGV4ID09IGNMdXRbaV0pIHsKLSAgICAgICAgICAgICAgICAgICAgKihkZXN0X3NjYW4gKyBjb2wpID0gKEZYX0JZVEUpKGFMdXRbaV0pOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlhTWVNfbWVtY3B5MzIoZHN0X3BsdCwgcFBhbGV0dGUsIHNpemVvZihGWF9EV09SRCkgKiAyNTYpOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl9SZ2IyUGx0UmdiOChGWF9MUEJZVEUgZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIEZYX0RXT1JEKiBkc3RfcGx0LCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIEZYX0JPT0wgcmV0ID0gX0NvbnZlcnRCdWZmZXJfUmdiMlBsdFJnYjhfTm9UcmFuc2Zvcm0oZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wLCBkc3RfcGx0KTsKLSAgICBpZiAocmV0ICYmIHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0gICAgICAgICAgICBGWF9BUkdCKiBwbHQgPSBkc3RfcGx0ICsgaTsKLSAgICAgICAgICAgIEZYX0FSR0IgcGx0X2VudHJ5ID0gRlhBUkdCX1RPRElCKCpwbHQpOwotICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKEZYX0xQQllURSkmcGx0X2VudHJ5LCAoRlhfTFBDQllURSkmcGx0X2VudHJ5LCAxKTsKLSAgICAgICAgICAgICpwbHQgPSBGWEFSR0JfVE9ESUIocGx0X2VudHJ5KTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl8xYnBwTWFzazJSZ2IoRlhESUJfRm9ybWF0IGRzdF9mb3JtYXQsIEZYX0xQQllURSBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3ApCi17Ci0gICAgaW50IGNvbXBzID0gKGRzdF9mb3JtYXQgJiAweGZmKSAvIDg7Ci0gICAgRlhfQllURSBzZXRfZ3JheSwgcmVzZXRfZ3JheTsKLSAgICBzZXRfZ3JheSA9IDB4ZmY7Ci0gICAgcmVzZXRfZ3JheSA9IDB4MDA7Ci0gICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgRlhfTFBCWVRFIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICAgICAgRlhfTFBDQllURSBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpOwotICAgICAgICBmb3IgKGludCBjb2wgPSBzcmNfbGVmdDsgY29sIDwgc3JjX2xlZnQgKyB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICBpZiAoc3JjX3NjYW5bY29sIC8gOF0gJiAoMSA8PCAoNyAtIGNvbCAlIDgpKSkgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IHNldF9ncmF5OwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IHNldF9ncmF5OwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IHNldF9ncmF5OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSByZXNldF9ncmF5OwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IHJlc2V0X2dyYXk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gcmVzZXRfZ3JheTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBjb21wczsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfOGJwcE1hc2syUmdiKEZYRElCX0Zvcm1hdCBkc3RfZm9ybWF0LCBGWF9MUEJZVEUgZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wKQotewotICAgIGludCBjb21wcyA9IChkc3RfZm9ybWF0ICYgMHhmZikgLyA4OwotICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgIEZYX0xQQllURSBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7Ci0gICAgICAgIEZYX0xQQ0JZVEUgc3JjX3NjYW4gPSBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0OwotICAgICAgICBGWF9CWVRFIHNyY19waXhlbDsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgc3JjX3BpeGVsID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfcGl4ZWw7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfcGl4ZWw7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuICAgPSBzcmNfcGl4ZWw7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gY29tcHMgLSAyOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl8xYnBwUGx0MlJnYihGWERJQl9Gb3JtYXQgZHN0X2Zvcm1hdCwgRlhfTFBCWVRFIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIGludCBjb21wcyA9IChkc3RfZm9ybWF0ICYgMHhmZikgLyA4OwotICAgIEZYX0RXT1JEKiBzcmNfcGx0ID0gcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpOwotICAgIEZYX0RXT1JEIHBsdFsyXTsKLSAgICBGWF9MUEJZVEUgYmdyX3B0ciA9IChGWF9MUEJZVEUpcGx0OwotICAgIGlmIChwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgIHBsdFswXSA9IEZYQ01ZS19UT0RJQihzcmNfcGx0WzBdKTsKLSAgICAgICAgcGx0WzFdID0gRlhDTVlLX1RPRElCKHNyY19wbHRbMV0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJncl9wdHJbMF0gPSBGWEFSR0JfQihzcmNfcGx0WzBdKTsKLSAgICAgICAgYmdyX3B0clsxXSA9IEZYQVJHQl9HKHNyY19wbHRbMF0pOwotICAgICAgICBiZ3JfcHRyWzJdID0gRlhBUkdCX1Ioc3JjX3BsdFswXSk7Ci0gICAgICAgIGJncl9wdHJbM10gPSBGWEFSR0JfQihzcmNfcGx0WzFdKTsKLSAgICAgICAgYmdyX3B0cls0XSA9IEZYQVJHQl9HKHNyY19wbHRbMV0pOwotICAgICAgICBiZ3JfcHRyWzVdID0gRlhBUkdCX1Ioc3JjX3BsdFsxXSk7Ci0gICAgfQotICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKEZYX0xQQllURSlwbHQsIChGWF9MUENCWVRFKXBsdCwgMik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCkpIHsKLSAgICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUoc3JjX3BsdFswXSksIEZYU1lTX0dldE1WYWx1ZShzcmNfcGx0WzBdKSwgRlhTWVNfR2V0WVZhbHVlKHNyY19wbHRbMF0pLCBGWFNZU19HZXRLVmFsdWUoc3JjX3BsdFswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmdyX3B0clsyXSwgYmdyX3B0clsxXSwgYmdyX3B0clswXSk7Ci0gICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKHNyY19wbHRbMV0pLCBGWFNZU19HZXRNVmFsdWUoc3JjX3BsdFsxXSksIEZYU1lTX0dldFlWYWx1ZShzcmNfcGx0WzFdKSwgRlhTWVNfR2V0S1ZhbHVlKHNyY19wbHRbMV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJncl9wdHJbNV0sIGJncl9wdHJbNF0sIGJncl9wdHJbM10pOwotICAgICAgICB9Ci0gICAgfQotICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgIEZYX0xQQllURSBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7Ci0gICAgICAgIEZYX0xQQ0JZVEUgc3JjX3NjYW4gPSBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KTsKLSAgICAgICAgZm9yIChpbnQgY29sID0gc3JjX2xlZnQ7IGNvbCA8IHNyY19sZWZ0ICsgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgaWYgKHNyY19zY2FuW2NvbCAvIDhdICYgKDEgPDwgKDcgLSBjb2wgJSA4KSkpIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBiZ3JfcHRyWzNdOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IGJncl9wdHJbNF07Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiAgID0gYmdyX3B0cls1XTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gYmdyX3B0clswXTsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBiZ3JfcHRyWzFdOwotICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gICA9IGJncl9wdHJbMl07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gY29tcHMgLSAyOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl84YnBwUGx0MlJnYihGWERJQl9Gb3JtYXQgZHN0X2Zvcm1hdCwgRlhfTFBCWVRFIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIGludCBjb21wcyA9IChkc3RfZm9ybWF0ICYgMHhmZikgLyA4OwotICAgIEZYX0RXT1JEKiBzcmNfcGx0ID0gcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpOwotICAgIEZYX0RXT1JEIHBsdFsyNTZdOwotICAgIEZYX0xQQllURSBiZ3JfcHRyID0gKEZYX0xQQllURSlwbHQ7Ci0gICAgaWYgKCFwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLSAgICAgICAgICAgICpiZ3JfcHRyKysgPSBGWEFSR0JfQihzcmNfcGx0W2ldKTsKLSAgICAgICAgICAgICpiZ3JfcHRyKysgPSBGWEFSR0JfRyhzcmNfcGx0W2ldKTsKLSAgICAgICAgICAgICpiZ3JfcHRyKysgPSBGWEFSR0JfUihzcmNfcGx0W2ldKTsKLSAgICAgICAgfQotICAgICAgICBiZ3JfcHRyID0gKEZYX0xQQllURSlwbHQ7Ci0gICAgfQotICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgIGlmIChwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcGx0W2ldID0gRlhDTVlLX1RPRElCKHNyY19wbHRbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKEZYX0xQQllURSlwbHQsIChGWF9MUENCWVRFKXBsdCwgMjU2KTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAocFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgewotICAgICAgICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUoc3JjX3BsdFtpXSksIEZYU1lTX0dldE1WYWx1ZShzcmNfcGx0W2ldKSwgRlhTWVNfR2V0WVZhbHVlKHNyY19wbHRbaV0pLCBGWFNZU19HZXRLVmFsdWUoc3JjX3BsdFtpXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJncl9wdHJbMl0sIGJncl9wdHJbMV0sIGJncl9wdHJbMF0pOwotICAgICAgICAgICAgICAgIGJncl9wdHIgKz0gMzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJncl9wdHIgPSAoRlhfTFBCWVRFKXBsdDsKLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICBGWF9MUEJZVEUgZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOwotICAgICAgICBGWF9MUENCWVRFIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdDsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgRlhfTFBCWVRFIHNyY19waXhlbCA9IGJncl9wdHIgKyAzICogKCpzcmNfc2NhbisrKTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfcGl4ZWwrKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfcGl4ZWwrKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gICA9ICpzcmNfcGl4ZWwrKzsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBjb21wcyAtIDI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIF9Db252ZXJ0QnVmZmVyXzI0YnBwUmdiMlJnYjI0KEZYX0xQQllURSBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICBGWF9MUEJZVEUgZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOwotICAgICAgICAgICAgRlhfTFBDQllURSBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiAzOwotICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7Ci0gICAgICAgICAgICBGWF9MUENCWVRFIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdCAqIDM7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkzMihkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCAqIDMpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl8zMmJwcFJnYjJSZ2IyNChGWF9MUEJZVEUgZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgRlhfTFBCWVRFIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICAgICAgRlhfTFBDQllURSBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiA0OwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICBzcmNfc2NhbisrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7Ci0gICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIGRlc3Rfc2Nhbiwgd2lkdGgpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl9SZ2IyUmdiMzIoRlhfTFBCWVRFIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBpbnQgY29tcHMgPSBwU3JjQml0bWFwLT5HZXRCUFAoKSAvIDg7Ci0gICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgRlhfTFBCWVRFIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICAgICAgICAgIEZYX0xQQ0JZVEUgc3JjX3NjYW4gPSBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogY29tcHM7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZGVzdF9zY2FuLCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gY29tcHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgRlhfTFBCWVRFIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICAgICAgICAgIEZYX0xQQ0JZVEUgc3JjX3NjYW4gPSBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogY29tcHM7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gY29tcHMgLSAzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl8zMmJwcENteWsyUmdiMzIoRlhfTFBCWVRFIGRlc3RfYnVmLCBpbnQgZGVzdF9waXRjaCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICBGWF9MUEJZVEUgZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOwotICAgICAgICAgICAgRlhfTFBDQllURSBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiA0OwotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIDEpOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgRlhfTFBCWVRFIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICAgICAgICAgIEZYX0xQQ0JZVEUgc3JjX3NjYW4gPSBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogNDsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoc3JjX3NjYW5bMF0sIHNyY19zY2FuWzFdLCBzcmNfc2NhblsyXSwgc3JjX3NjYW5bM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSwgZGVzdF9zY2FuWzFdLCBkZXN0X3NjYW5bMF0pOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENvbnZlcnRCdWZmZXIoRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LCBGWF9MUEJZVEUgZGVzdF9idWYsIGludCBkZXN0X3BpdGNoLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgRlhfRFdPUkQqJiBkX3BhbCwgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCA9IHBTcmNCaXRtYXAtPkdldEZvcm1hdCgpOwotICAgIGlmICghQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKSB8fCAhQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCkpIHsKLSAgICAgICAgcEljY1RyYW5zZm9ybSA9IE5VTEw7Ci0gICAgfQotICAgIHN3aXRjaCAoZGVzdF9mb3JtYXQpIHsKLSAgICAgICAgY2FzZSBGWERJQl9JbnZhbGlkOgotICAgICAgICBjYXNlIEZYRElCXzFicHBDbXlrOgotICAgICAgICBjYXNlIEZYRElCXzFicHBNYXNrOgotICAgICAgICBjYXNlIEZYRElCXzFicHBSZ2I6Ci0gICAgICAgICAgICBBU1NFUlQoRkFMU0UpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBjYXNlIEZYRElCXzhicHBNYXNrOiB7Ci0gICAgICAgICAgICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfMWJwcFBsdDJHcmF5KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCwgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyXzFicHBNYXNrMkdyYXkoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gOCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfOGJwcFBsdDJHcmF5KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCwgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyXzhicHBNYXNrMkdyYXkoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPj0gMjQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyX1JnYk9yQ215azJHcmF5KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCwgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGWERJQl84YnBwUmdiOgotICAgICAgICBjYXNlIEZYRElCXzhicHBSZ2JhOiB7Ci0gICAgICAgICAgICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gOCAmJiBwU3JjQml0bWFwLT5HZXRQYWxldHRlKCkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29udmVydEJ1ZmZlcihGWERJQl84YnBwTWFzaywgZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wLCBkX3BhbCwgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRfcGFsID0gRlhfQWxsb2MoRlhfRFdPUkQsIDI1Nik7Ci0gICAgICAgICAgICAgICAgaWYgKCgoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDEgfHwgKHNyY19mb3JtYXQgJiAweGZmKSA9PSA4KSAmJiBwU3JjQml0bWFwLT5HZXRQYWxldHRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyX1BsdDJQbHRSZ2I4KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCwgZF9wYWwsIHBJY2NUcmFuc2Zvcm0pOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA+PSAyNCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfUmdiMlBsdFJnYjgoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wLCBkX3BhbCwgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGWERJQl9SZ2I6Ci0gICAgICAgIGNhc2UgRlhESUJfUmdiYTogewotICAgICAgICAgICAgICAgIGlmICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyXzFicHBQbHQyUmdiKGRlc3RfZm9ybWF0LCBkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3AsIHBJY2NUcmFuc2Zvcm0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl8xYnBwTWFzazJSZ2IoZGVzdF9mb3JtYXQsIGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyXzhicHBQbHQyUmdiKGRlc3RfZm9ybWF0LCBkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3AsIHBJY2NUcmFuc2Zvcm0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl84YnBwTWFzazJSZ2IoZGVzdF9mb3JtYXQsIGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDI0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl8yNGJwcFJnYjJSZ2IyNChkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3AsIHBJY2NUcmFuc2Zvcm0pOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSAzMikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfMzJicHBSZ2IyUmdiMjQoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wLCBwSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIEZYRElCX0FyZ2I6Ci0gICAgICAgIGNhc2UgRlhESUJfUmdiMzI6IHsKLSAgICAgICAgICAgICAgICBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwU3JjQml0bWFwLT5HZXRQYWxldHRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl8xYnBwUGx0MlJnYihkZXN0X2Zvcm1hdCwgZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wLCBwSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfMWJwcE1hc2syUmdiKGRlc3RfZm9ybWF0LCBkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3ApOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSA4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwU3JjQml0bWFwLT5HZXRQYWxldHRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl84YnBwUGx0MlJnYihkZXN0X2Zvcm1hdCwgZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wLCBwSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfOGJwcE1hc2syUmdiKGRlc3RfZm9ybWF0LCBkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3ApOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA+PSAyNCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2Zvcm1hdCAmIDB4MDQwMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyXzMyYnBwQ215azJSZ2IzMihkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3AsIHBJY2NUcmFuc2Zvcm0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl9SZ2IyUmdiMzIoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wLCBwSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KK0ZYX0JPT0wgQ0ZYX1BhbGV0dGU6OkJ1aWxkUGFsZXR0ZShjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgcGFsX3R5cGUpIHsKKyAgaWYgKCFwQml0bWFwKSB7CiAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX0ZyZWUobV9wUGFsZXR0ZSk7CisgIG1fcFBhbGV0dGUgPSBGWF9BbGxvYyhGWF9EV09SRCwgMjU2KTsKKyAgaW50IGJwcCA9IHBCaXRtYXAtPkdldEJQUCgpIC8gODsKKyAgaW50IHdpZHRoID0gcEJpdG1hcC0+R2V0V2lkdGgoKTsKKyAgaW50IGhlaWdodCA9IHBCaXRtYXAtPkdldEhlaWdodCgpOworICBGWF9GcmVlKG1fY0x1dCk7CisgIG1fY0x1dCA9IE5VTEw7CisgIEZYX0ZyZWUobV9hTHV0KTsKKyAgbV9hTHV0ID0gTlVMTDsKKyAgbV9jTHV0ID0gRlhfQWxsb2MoRlhfRFdPUkQsIDQwOTYpOworICBtX2FMdXQgPSBGWF9BbGxvYyhGWF9EV09SRCwgNDA5Nik7CisgIGludCByb3csIGNvbDsKKyAgbV9sdXQgPSAwOworICBmb3IgKHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICB1aW50OF90KiBzY2FuX2xpbmUgPSAodWludDhfdCopcEJpdG1hcC0+R2V0U2NhbmxpbmUocm93KTsKKyAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgdWludDhfdCogc3JjX3BvcnQgPSBzY2FuX2xpbmUgKyBjb2wgKiBicHA7CisgICAgICBGWF9EV09SRCBiID0gc3JjX3BvcnRbMF0gJiAweGYwOworICAgICAgRlhfRFdPUkQgZyA9IHNyY19wb3J0WzFdICYgMHhmMDsKKyAgICAgIEZYX0RXT1JEIHIgPSBzcmNfcG9ydFsyXSAmIDB4ZjA7CisgICAgICBGWF9EV09SRCBpbmRleCA9IChyIDw8IDQpICsgZyArIChiID4+IDQpOworICAgICAgbV9hTHV0W2luZGV4XSsrOworICAgIH0KKyAgfQorICBmb3IgKHJvdyA9IDA7IHJvdyA8IDQwOTY7IHJvdysrKSB7CisgICAgaWYgKG1fYUx1dFtyb3ddICE9IDApIHsKKyAgICAgIG1fYUx1dFttX2x1dF0gPSBtX2FMdXRbcm93XTsKKyAgICAgIG1fY0x1dFttX2x1dF0gPSByb3c7CisgICAgICBtX2x1dCsrOworICAgIH0KKyAgfQorICBfUXNvcnQobV9hTHV0LCBtX2NMdXQsIDAsIG1fbHV0IC0gMSk7CisgIEZYX0RXT1JEKiB3aW5fbWFjX3BhbCA9IE5VTEw7CisgIGlmIChwYWxfdHlwZSA9PSBGWERJQl9QQUxFVFRFX1dJTikgeworICAgIHdpbl9tYWNfcGFsID0gKEZYX0RXT1JEKilnX2R3V2luUGFsZXR0ZTsKKyAgfSBlbHNlIGlmIChwYWxfdHlwZSA9PSBGWERJQl9QQUxFVFRFX01BQykgeworICAgIHdpbl9tYWNfcGFsID0gKEZYX0RXT1JEKilnX2R3TWFjUGFsZXR0ZTsKKyAgfQorICBfT2J0YWluX1BhbChtX2FMdXQsIG1fY0x1dCwgbV9wUGFsZXR0ZSwgcGFsX3R5cGUsIHdpbl9tYWNfcGFsLCBtX2x1dCk7CisgIHJldHVybiBUUlVFOwogfQotQ0ZYX0RJQml0bWFwKiBDRlhfRElCU291cmNlOjpDbG9uZUNvbnZlcnQoRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcCwgdm9pZCogcEljY1RyYW5zZm9ybSkgY29uc3QKLXsKLSAgICBpZihkZXN0X2Zvcm1hdCA9PSBHZXRGb3JtYXQoKSAmJiBwSWNjVHJhbnNmb3JtID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIENsb25lKHBDbGlwKTsKK0ZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfMWJwcE1hc2syR3JheSh1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCkgeworICB1aW50OF90IHNldF9ncmF5LCByZXNldF9ncmF5OworICBzZXRfZ3JheSA9IDB4ZmY7CisgIHJlc2V0X2dyYXkgPSAweDAwOworICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW4sIHJlc2V0X2dyYXksIHdpZHRoKTsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpOworICAgIGZvciAoaW50IGNvbCA9IHNyY19sZWZ0OyBjb2wgPCBzcmNfbGVmdCArIHdpZHRoOyBjb2wrKykgeworICAgICAgaWYgKHNyY19zY2FuW2NvbCAvIDhdICYgKDEgPDwgKDcgLSBjb2wgJSA4KSkpIHsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IHNldF9ncmF5OworICAgICAgfQorICAgICAgZGVzdF9zY2FuKys7CiAgICAgfQotICAgIGlmIChwQ2xpcCkgewotICAgICAgICBDRlhfRElCaXRtYXAqIHBDbG9uZSA9IENsb25lKHBDbGlwKTsKLSAgICAgICAgaWYgKHBDbG9uZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfOGJwcE1hc2syR3JheSh1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCkgeworICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdDsKKyAgICBGWFNZU19tZW1jcHkoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgpOworICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl8xYnBwUGx0MkdyYXkodWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIEZYX0RXT1JEKiBzcmNfcGx0ID0gcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpOworICB1aW50OF90IGdyYXlbMl07CisgIGlmIChwSWNjVHJhbnNmb3JtKSB7CisgICAgRlhfRFdPUkQgcGx0WzJdOworICAgIGlmIChwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7CisgICAgICBwbHRbMF0gPSBGWENNWUtfVE9ESUIoc3JjX3BsdFswXSk7CisgICAgICBwbHRbMV0gPSBGWENNWUtfVE9ESUIoc3JjX3BsdFsxXSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHVpbnQ4X3QqIGJncl9wdHIgPSAodWludDhfdCopcGx0OworICAgICAgYmdyX3B0clswXSA9IEZYQVJHQl9CKHNyY19wbHRbMF0pOworICAgICAgYmdyX3B0clsxXSA9IEZYQVJHQl9HKHNyY19wbHRbMF0pOworICAgICAgYmdyX3B0clsyXSA9IEZYQVJHQl9SKHNyY19wbHRbMF0pOworICAgICAgYmdyX3B0clszXSA9IEZYQVJHQl9CKHNyY19wbHRbMV0pOworICAgICAgYmdyX3B0cls0XSA9IEZYQVJHQl9HKHNyY19wbHRbMV0pOworICAgICAgYmdyX3B0cls1XSA9IEZYQVJHQl9SKHNyY19wbHRbMV0pOworICAgIH0KKyAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0KKyAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CisgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZ3JheSwgKGNvbnN0IHVpbnQ4X3QqKXBsdCwgMik7CisgIH0gZWxzZSB7CisgICAgdWludDhfdCByZXNldF9yLCByZXNldF9nLCByZXNldF9iLCBzZXRfciwgc2V0X2csIHNldF9iOworICAgIGlmIChwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7CisgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoCisgICAgICAgICAgRlhTWVNfR2V0Q1ZhbHVlKHNyY19wbHRbMF0pLCBGWFNZU19HZXRNVmFsdWUoc3JjX3BsdFswXSksCisgICAgICAgICAgRlhTWVNfR2V0WVZhbHVlKHNyY19wbHRbMF0pLCBGWFNZU19HZXRLVmFsdWUoc3JjX3BsdFswXSksIHJlc2V0X3IsCisgICAgICAgICAgcmVzZXRfZywgcmVzZXRfYik7CisgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKHNyY19wbHRbMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX0dldE1WYWx1ZShzcmNfcGx0WzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRZVmFsdWUoc3JjX3BsdFsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfR2V0S1ZhbHVlKHNyY19wbHRbMV0pLCBzZXRfciwgc2V0X2csIHNldF9iKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzZXRfciA9IEZYQVJHQl9SKHNyY19wbHRbMF0pOworICAgICAgcmVzZXRfZyA9IEZYQVJHQl9HKHNyY19wbHRbMF0pOworICAgICAgcmVzZXRfYiA9IEZYQVJHQl9CKHNyY19wbHRbMF0pOworICAgICAgc2V0X3IgPSBGWEFSR0JfUihzcmNfcGx0WzFdKTsKKyAgICAgIHNldF9nID0gRlhBUkdCX0coc3JjX3BsdFsxXSk7CisgICAgICBzZXRfYiA9IEZYQVJHQl9CKHNyY19wbHRbMV0pOworICAgIH0KKyAgICBncmF5WzBdID0gRlhSR0IyR1JBWShyZXNldF9yLCByZXNldF9nLCByZXNldF9iKTsKKyAgICBncmF5WzFdID0gRlhSR0IyR1JBWShzZXRfciwgc2V0X2csIHNldF9iKTsKKyAgfQorICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW4sIGdyYXlbMF0sIHdpZHRoKTsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpOworICAgIGZvciAoaW50IGNvbCA9IHNyY19sZWZ0OyBjb2wgPCBzcmNfbGVmdCArIHdpZHRoOyBjb2wrKykgeworICAgICAgaWYgKHNyY19zY2FuW2NvbCAvIDhdICYgKDEgPDwgKDcgLSBjb2wgJSA4KSkpIHsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IGdyYXlbMV07CisgICAgICB9CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIF9Db252ZXJ0QnVmZmVyXzhicHBQbHQyR3JheSh1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgRlhfRFdPUkQqIHNyY19wbHQgPSBwU3JjQml0bWFwLT5HZXRQYWxldHRlKCk7CisgIHVpbnQ4X3QgZ3JheVsyNTZdOworICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgIEZYX0RXT1JEIHBsdFsyNTZdOworICAgIGlmIChwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIHBsdFtpXSA9IEZYQ01ZS19UT0RJQihzcmNfcGx0W2ldKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdWludDhfdCogYmdyX3B0ciA9ICh1aW50OF90KilwbHQ7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgICpiZ3JfcHRyKysgPSBGWEFSR0JfQihzcmNfcGx0W2ldKTsKKyAgICAgICAgKmJncl9wdHIrKyA9IEZYQVJHQl9HKHNyY19wbHRbaV0pOworICAgICAgICAqYmdyX3B0cisrID0gRlhBUkdCX1Ioc3JjX3BsdFtpXSk7CisgICAgICB9CisgICAgfQorICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPQorICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKKyAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBncmF5LCAoY29uc3QgdWludDhfdCopcGx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1Nik7CisgIH0gZWxzZSB7CisgICAgaWYgKHBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCkpIHsKKyAgICAgIHVpbnQ4X3QgciwgZywgYjsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKAorICAgICAgICAgICAgRlhTWVNfR2V0Q1ZhbHVlKHNyY19wbHRbaV0pLCBGWFNZU19HZXRNVmFsdWUoc3JjX3BsdFtpXSksCisgICAgICAgICAgICBGWFNZU19HZXRZVmFsdWUoc3JjX3BsdFtpXSksIEZYU1lTX0dldEtWYWx1ZShzcmNfcGx0W2ldKSwgciwgZywgYik7CisgICAgICAgIGdyYXlbaV0gPSBGWFJHQjJHUkFZKHIsIGcsIGIpOworICAgICAgfQorICAgIH0gZWxzZQorICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBncmF5W2ldID0gRlhSR0IyR1JBWShGWEFSR0JfUihzcmNfcGx0W2ldKSwgRlhBUkdCX0coc3JjX3BsdFtpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9CKHNyY19wbHRbaV0pKTsKKyAgICAgIH0KKyAgfQorICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdDsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICpkZXN0X3NjYW4rKyA9IGdyYXlbKnNyY19zY2FuKytdOworICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfUmdiT3JDbXlrMkdyYXkodWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgaW50IEJwcCA9IHBTcmNCaXRtYXAtPkdldEJQUCgpIC8gODsKKyAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0KKyAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CisgICAgaWYgKEJwcCA9PSAzIHx8IHBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCkpIHsKKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9CisgICAgICAgICAgICBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogQnBwOworICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9CisgICAgICAgICAgICBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogNDsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZGVzdF9zY2FuLCBzcmNfc2NhbiwgMSk7CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKICAgICAgICAgfQotICAgICAgICBpZighcENsb25lLT5Db252ZXJ0Rm9ybWF0KGRlc3RfZm9ybWF0LCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICAgICAgZGVsZXRlIHBDbG9uZTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAocFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgeworICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0KKyAgICAgICAgICAgIHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiA0OworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgICB1aW50OF90IHIsIGcsIGI7CisgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZSgoRlhfRFdPUkQpc3JjX3NjYW5bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRNVmFsdWUoKEZYX0RXT1JEKXNyY19zY2FuWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfR2V0WVZhbHVlKChGWF9EV09SRClzcmNfc2NhblsyXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX0dldEtWYWx1ZSgoRlhfRFdPUkQpc3JjX3NjYW5bM10pLCByLCBnLCBiKTsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBGWFJHQjJHUkFZKHIsIGcsIGIpOworICAgICAgICAgIHNyY19zY2FuICs9IDQ7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBDbG9uZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0KKyAgICAgICAgICAgIHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiBCcHA7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCBzcmNfc2NhblswXSk7CisgICAgICAgICAgc3JjX3NjYW4gKz0gQnBwOworICAgICAgICB9CisgICAgICB9CiAgICAgfQotICAgIENGWF9ESUJpdG1hcCogcENsb25lID0gbmV3IENGWF9ESUJpdG1hcDsKLSAgICBpZighcENsb25lLT5DcmVhdGUobV9XaWR0aCwgbV9IZWlnaHQsIGRlc3RfZm9ybWF0KSkgewotICAgICAgICBkZWxldGUgcENsb25lOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK2lubGluZSB2b2lkIF9Db252ZXJ0QnVmZmVyX0luZGV4Q29weSh1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCkgeworICBpZiAocFNyY0JpdG1hcC0+R2V0QlBQKCkgPT0gMSkgeworICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKKyAgICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW4sIDAsIHdpZHRoKTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdyk7CisgICAgICBmb3IgKGludCBjb2wgPSBzcmNfbGVmdDsgY29sIDwgc3JjX2xlZnQgKyB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgaWYgKHNyY19zY2FuW2NvbCAvIDhdICYgKDEgPDwgKDcgLSBjb2wgJSA4KSkpIHsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gMTsKKyAgICAgICAgfQorICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIH0KICAgICB9Ci0gICAgRlhfQk9PTCByZXQgPSBUUlVFOwotICAgIENGWF9ESUJpdG1hcCogcFNyY0FscGhhID0gTlVMTDsKLSAgICBpZiAobV9BbHBoYUZsYWcgJiAyKSB7Ci0gICAgICAgIHBTcmNBbHBoYSA9IChHZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKSA/IEdldEFscGhhTWFzaygpIDogbV9wQWxwaGFNYXNrOwotICAgICAgICBpZiAocFNyY0FscGhhID09IE5VTEwpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwQ2xvbmU7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7CisgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9CisgICAgICAgICAgcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdDsKKyAgICAgIEZYU1lTX21lbWNweShkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCk7CisgICAgfQorICB9Cit9CitGWF9CT09MIF9Db252ZXJ0QnVmZmVyX1BsdDJQbHRSZ2I4KHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogZHN0X3BsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBfQ29udmVydEJ1ZmZlcl9JbmRleENvcHkoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfbGVmdCwgc3JjX3RvcCk7CisgIEZYX0RXT1JEKiBzcmNfcGx0ID0gcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpOworICBpbnQgcGx0X3NpemUgPSBwU3JjQml0bWFwLT5HZXRQYWxldHRlU2l6ZSgpOworICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgIEZYX0RXT1JEIHBsdFsyNTZdOworICAgIHVpbnQ4X3QqIGJncl9wdHIgPSAodWludDhfdCopcGx0OworICAgIGlmIChwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBsdF9zaXplOyBpKyspIHsKKyAgICAgICAgcGx0W2ldID0gRlhDTVlLX1RPRElCKHNyY19wbHRbaV0pOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBsdF9zaXplOyBpKyspIHsKKyAgICAgICAgKmJncl9wdHIrKyA9IEZYQVJHQl9CKHNyY19wbHRbaV0pOworICAgICAgICAqYmdyX3B0cisrID0gRlhBUkdCX0coc3JjX3BsdFtpXSk7CisgICAgICAgICpiZ3JfcHRyKysgPSBGWEFSR0JfUihzcmNfcGx0W2ldKTsKKyAgICAgIH0KKyAgICAgIGJncl9wdHIgPSAodWludDhfdCopcGx0OworICAgIH0KKyAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0KKyAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CisgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKHVpbnQ4X3QqKXBsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopcGx0LCBwbHRfc2l6ZSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbHRfc2l6ZTsgaSsrKSB7CisgICAgICBkc3RfcGx0W2ldID0gRlhBUkdCX01BS0UoMHhmZiwgYmdyX3B0clsyXSwgYmdyX3B0clsxXSwgYmdyX3B0clswXSk7CisgICAgICBiZ3JfcHRyICs9IDM7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBsdF9zaXplOyBpKyspIHsKKyAgICAgICAgdWludDhfdCByLCBnLCBiOworICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoCisgICAgICAgICAgICBGWFNZU19HZXRDVmFsdWUoc3JjX3BsdFtpXSksIEZYU1lTX0dldE1WYWx1ZShzcmNfcGx0W2ldKSwKKyAgICAgICAgICAgIEZYU1lTX0dldFlWYWx1ZShzcmNfcGx0W2ldKSwgRlhTWVNfR2V0S1ZhbHVlKHNyY19wbHRbaV0pLCByLCBnLCBiKTsKKyAgICAgICAgZHN0X3BsdFtpXSA9IEZYQVJHQl9NQUtFKDB4ZmYsIHIsIGcsIGIpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBGWFNZU19tZW1jcHkoZHN0X3BsdCwgc3JjX3BsdCwgcGx0X3NpemUgKiA0KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitpbmxpbmUgRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl9SZ2IyUGx0UmdiOF9Ob1RyYW5zZm9ybSgKKyAgICB1aW50OF90KiBkZXN0X2J1ZiwKKyAgICBpbnQgZGVzdF9waXRjaCwKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IGhlaWdodCwKKyAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAorICAgIGludCBzcmNfbGVmdCwKKyAgICBpbnQgc3JjX3RvcCwKKyAgICBGWF9EV09SRCogZHN0X3BsdCkgeworICBpbnQgYnBwID0gcFNyY0JpdG1hcC0+R2V0QlBQKCkgLyA4OworICBpbnQgcm93LCBjb2w7CisgIENGWF9QYWxldHRlIHBhbGV0dGU7CisgIHBhbGV0dGUuQnVpbGRQYWxldHRlKHBTcmNCaXRtYXAsIEZYRElCX1BBTEVUVEVfTE9DKTsKKyAgRlhfRFdPUkQqIGNMdXQgPSBwYWxldHRlLkdldENvbG9yTHV0KCk7CisgIEZYX0RXT1JEKiBhTHV0ID0gcGFsZXR0ZS5HZXRBbW91bnRMdXQoKTsKKyAgaWYgKCFjTHV0IHx8ICFhTHV0KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGludCBsdXQgPSBwYWxldHRlLkdldGx1dCgpOworICBGWF9EV09SRCogcFBhbGV0dGUgPSBwYWxldHRlLkdldFBhbGV0dGUoKTsKKyAgaWYgKGx1dCA+IDI1NikgeworICAgIGludCBlcnIsIG1pbl9lcnI7CisgICAgaW50IGx1dF8yNTYgPSBsdXQgLSAyNTY7CisgICAgZm9yIChyb3cgPSAwOyByb3cgPCBsdXRfMjU2OyByb3crKykgeworICAgICAgbWluX2VyciA9IDEwMDAwMDA7CisgICAgICB1aW50OF90IHIsIGcsIGI7CisgICAgICBfQ29sb3JEZWNvZGUoY0x1dFtyb3ddLCByLCBnLCBiKTsKKyAgICAgIGludCBjbHJpbmRleCA9IDA7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCAyNTY7IGNvbCsrKSB7CisgICAgICAgIEZYX0RXT1JEIHBfY29sb3IgPSAqKHBQYWxldHRlICsgY29sKTsKKyAgICAgICAgaW50IGRfciA9IHIgLSAodWludDhfdCkocF9jb2xvciA+PiAxNik7CisgICAgICAgIGludCBkX2cgPSBnIC0gKHVpbnQ4X3QpKHBfY29sb3IgPj4gOCk7CisgICAgICAgIGludCBkX2IgPSBiIC0gKHVpbnQ4X3QpKHBfY29sb3IpOworICAgICAgICBlcnIgPSBkX3IgKiBkX3IgKyBkX2cgKiBkX2cgKyBkX2IgKiBkX2I7CisgICAgICAgIGlmIChlcnIgPCBtaW5fZXJyKSB7CisgICAgICAgICAgbWluX2VyciA9IGVycjsKKyAgICAgICAgICBjbHJpbmRleCA9IGNvbDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYUx1dFtyb3ddID0gY2xyaW5kZXg7CisgICAgfQorICB9CisgIGludDMyX3QgbHV0XzEgPSBsdXQgLSAxOworICBmb3IgKHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICB1aW50OF90KiBzcmNfc2NhbiA9CisgICAgICAgICh1aW50OF90KilwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0OworICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKKyAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgdWludDhfdCogc3JjX3BvcnQgPSBzcmNfc2NhbiArIGNvbCAqIGJwcDsKKyAgICAgIGludCByID0gc3JjX3BvcnRbMl0gJiAweGYwOworICAgICAgaW50IGcgPSBzcmNfcG9ydFsxXSAmIDB4ZjA7CisgICAgICBpbnQgYiA9IHNyY19wb3J0WzBdICYgMHhmMDsKKyAgICAgIEZYX0RXT1JEIGNscmluZGV4ID0gKHIgPDwgNCkgKyBnICsgKGIgPj4gNCk7CisgICAgICBmb3IgKGludCBpID0gbHV0XzE7IGkgPj0gMDsgaS0tKQorICAgICAgICBpZiAoY2xyaW5kZXggPT0gY0x1dFtpXSkgeworICAgICAgICAgICooZGVzdF9zY2FuICsgY29sKSA9ICh1aW50OF90KShhTHV0W2ldKTsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoZGVzdF9mb3JtYXQgJiAweDAyMDApIHsKLSAgICAgICAgaWYgKGRlc3RfZm9ybWF0ID09IEZYRElCX0FyZ2IpCi0gICAgICAgICAgICByZXQgPSBwU3JjQWxwaGEgPwotICAgICAgICAgICAgICAgICAgcENsb25lLT5Mb2FkQ2hhbm5lbChGWERJQl9BbHBoYSwgcFNyY0FscGhhLCBGWERJQl9BbHBoYSkgOgotICAgICAgICAgICAgICAgICAgcENsb25lLT5Mb2FkQ2hhbm5lbChGWERJQl9BbHBoYSwgMHhmZik7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0ID0gcENsb25lLT5Db3B5QWxwaGFNYXNrKHBTcmNBbHBoYSk7CisgIH0KKyAgRlhTWVNfbWVtY3B5KGRzdF9wbHQsIHBQYWxldHRlLCBzaXplb2YoRlhfRFdPUkQpICogMjU2KTsKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIF9Db252ZXJ0QnVmZmVyX1JnYjJQbHRSZ2I4KHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogZHN0X3BsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBOVUxMOworICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKKyAgfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICBGWF9CT09MIHJldCA9IF9Db252ZXJ0QnVmZmVyX1JnYjJQbHRSZ2I4X05vVHJhbnNmb3JtKAorICAgICAgZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wLAorICAgICAgZHN0X3BsdCk7CisgIGlmIChyZXQgJiYgcEljY1RyYW5zZm9ybSkgeworICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPQorICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICBGWF9BUkdCKiBwbHQgPSBkc3RfcGx0ICsgaTsKKyAgICAgIEZYX0FSR0IgcGx0X2VudHJ5ID0gRlhBUkdCX1RPRElCKCpwbHQpOworICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKHVpbnQ4X3QqKSZwbHRfZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopJnBsdF9lbnRyeSwgMSk7CisgICAgICAqcGx0ID0gRlhBUkdCX1RPRElCKHBsdF9lbnRyeSk7CisgICAgfQorICB9CisgIHJldHVybiByZXQ7Cit9CitGWF9CT09MIF9Db252ZXJ0QnVmZmVyXzFicHBNYXNrMlJnYihGWERJQl9Gb3JtYXQgZHN0X2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wKSB7CisgIGludCBjb21wcyA9IChkc3RfZm9ybWF0ICYgMHhmZikgLyA4OworICB1aW50OF90IHNldF9ncmF5LCByZXNldF9ncmF5OworICBzZXRfZ3JheSA9IDB4ZmY7CisgIHJlc2V0X2dyYXkgPSAweDAwOworICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdyk7CisgICAgZm9yIChpbnQgY29sID0gc3JjX2xlZnQ7IGNvbCA8IHNyY19sZWZ0ICsgd2lkdGg7IGNvbCsrKSB7CisgICAgICBpZiAoc3JjX3NjYW5bY29sIC8gOF0gJiAoMSA8PCAoNyAtIGNvbCAlIDgpKSkgeworICAgICAgICBkZXN0X3NjYW5bMF0gPSBzZXRfZ3JheTsKKyAgICAgICAgZGVzdF9zY2FuWzFdID0gc2V0X2dyYXk7CisgICAgICAgIGRlc3Rfc2NhblsyXSA9IHNldF9ncmF5OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGVzdF9zY2FuWzBdID0gcmVzZXRfZ3JheTsKKyAgICAgICAgZGVzdF9zY2FuWzFdID0gcmVzZXRfZ3JheTsKKyAgICAgICAgZGVzdF9zY2FuWzJdID0gcmVzZXRfZ3JheTsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbiArPSBjb21wczsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIF9Db252ZXJ0QnVmZmVyXzhicHBNYXNrMlJnYihGWERJQl9Gb3JtYXQgZHN0X2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wKSB7CisgIGludCBjb21wcyA9IChkc3RfZm9ybWF0ICYgMHhmZikgLyA4OworICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdDsKKyAgICB1aW50OF90IHNyY19waXhlbDsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgIHNyY19waXhlbCA9ICpzcmNfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3BpeGVsOworICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3BpeGVsOworICAgICAgKmRlc3Rfc2NhbiA9IHNyY19waXhlbDsKKyAgICAgIGRlc3Rfc2NhbiArPSBjb21wcyAtIDI7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl8xYnBwUGx0MlJnYihGWERJQl9Gb3JtYXQgZHN0X2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgaW50IGNvbXBzID0gKGRzdF9mb3JtYXQgJiAweGZmKSAvIDg7CisgIEZYX0RXT1JEKiBzcmNfcGx0ID0gcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpOworICBGWF9EV09SRCBwbHRbMl07CisgIHVpbnQ4X3QqIGJncl9wdHIgPSAodWludDhfdCopcGx0OworICBpZiAocFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgeworICAgIHBsdFswXSA9IEZYQ01ZS19UT0RJQihzcmNfcGx0WzBdKTsKKyAgICBwbHRbMV0gPSBGWENNWUtfVE9ESUIoc3JjX3BsdFsxXSk7CisgIH0gZWxzZSB7CisgICAgYmdyX3B0clswXSA9IEZYQVJHQl9CKHNyY19wbHRbMF0pOworICAgIGJncl9wdHJbMV0gPSBGWEFSR0JfRyhzcmNfcGx0WzBdKTsKKyAgICBiZ3JfcHRyWzJdID0gRlhBUkdCX1Ioc3JjX3BsdFswXSk7CisgICAgYmdyX3B0clszXSA9IEZYQVJHQl9CKHNyY19wbHRbMV0pOworICAgIGJncl9wdHJbNF0gPSBGWEFSR0JfRyhzcmNfcGx0WzFdKTsKKyAgICBiZ3JfcHRyWzVdID0gRlhBUkdCX1Ioc3JjX3BsdFsxXSk7CisgIH0KKyAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0KKyAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CisgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKHVpbnQ4X3QqKXBsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopcGx0LCAyKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAocFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgeworICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKAorICAgICAgICAgIEZYU1lTX0dldENWYWx1ZShzcmNfcGx0WzBdKSwgRlhTWVNfR2V0TVZhbHVlKHNyY19wbHRbMF0pLAorICAgICAgICAgIEZYU1lTX0dldFlWYWx1ZShzcmNfcGx0WzBdKSwgRlhTWVNfR2V0S1ZhbHVlKHNyY19wbHRbMF0pLCBiZ3JfcHRyWzJdLAorICAgICAgICAgIGJncl9wdHJbMV0sIGJncl9wdHJbMF0pOworICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKAorICAgICAgICAgIEZYU1lTX0dldENWYWx1ZShzcmNfcGx0WzFdKSwgRlhTWVNfR2V0TVZhbHVlKHNyY19wbHRbMV0pLAorICAgICAgICAgIEZYU1lTX0dldFlWYWx1ZShzcmNfcGx0WzFdKSwgRlhTWVNfR2V0S1ZhbHVlKHNyY19wbHRbMV0pLCBiZ3JfcHRyWzVdLAorICAgICAgICAgIGJncl9wdHJbNF0sIGJncl9wdHJbM10pOworICAgIH0KKyAgfQorICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdyk7CisgICAgZm9yIChpbnQgY29sID0gc3JjX2xlZnQ7IGNvbCA8IHNyY19sZWZ0ICsgd2lkdGg7IGNvbCsrKSB7CisgICAgICBpZiAoc3JjX3NjYW5bY29sIC8gOF0gJiAoMSA8PCAoNyAtIGNvbCAlIDgpKSkgeworICAgICAgICAqZGVzdF9zY2FuKysgPSBiZ3JfcHRyWzNdOworICAgICAgICAqZGVzdF9zY2FuKysgPSBiZ3JfcHRyWzRdOworICAgICAgICAqZGVzdF9zY2FuID0gYmdyX3B0cls1XTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IGJncl9wdHJbMF07CisgICAgICAgICpkZXN0X3NjYW4rKyA9IGJncl9wdHJbMV07CisgICAgICAgICpkZXN0X3NjYW4gPSBiZ3JfcHRyWzJdOworICAgICAgfQorICAgICAgZGVzdF9zY2FuICs9IGNvbXBzIC0gMjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIF9Db252ZXJ0QnVmZmVyXzhicHBQbHQyUmdiKEZYRElCX0Zvcm1hdCBkc3RfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBpbnQgY29tcHMgPSAoZHN0X2Zvcm1hdCAmIDB4ZmYpIC8gODsKKyAgRlhfRFdPUkQqIHNyY19wbHQgPSBwU3JjQml0bWFwLT5HZXRQYWxldHRlKCk7CisgIEZYX0RXT1JEIHBsdFsyNTZdOworICB1aW50OF90KiBiZ3JfcHRyID0gKHVpbnQ4X3QqKXBsdDsKKyAgaWYgKCFwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgKmJncl9wdHIrKyA9IEZYQVJHQl9CKHNyY19wbHRbaV0pOworICAgICAgKmJncl9wdHIrKyA9IEZYQVJHQl9HKHNyY19wbHRbaV0pOworICAgICAgKmJncl9wdHIrKyA9IEZYQVJHQl9SKHNyY19wbHRbaV0pOworICAgIH0KKyAgICBiZ3JfcHRyID0gKHVpbnQ4X3QqKXBsdDsKKyAgfQorICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgIGlmIChwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIHBsdFtpXSA9IEZYQ01ZS19UT0RJQihzcmNfcGx0W2ldKTsKKyAgICAgIH0KKyAgICB9CisgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9CisgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOworICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICh1aW50OF90KilwbHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKXBsdCwgMjU2KTsKKyAgfSBlbHNlIHsKKyAgICBpZiAocFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoCisgICAgICAgICAgICBGWFNZU19HZXRDVmFsdWUoc3JjX3BsdFtpXSksIEZYU1lTX0dldE1WYWx1ZShzcmNfcGx0W2ldKSwKKyAgICAgICAgICAgIEZYU1lTX0dldFlWYWx1ZShzcmNfcGx0W2ldKSwgRlhTWVNfR2V0S1ZhbHVlKHNyY19wbHRbaV0pLAorICAgICAgICAgICAgYmdyX3B0clsyXSwgYmdyX3B0clsxXSwgYmdyX3B0clswXSk7CisgICAgICAgIGJncl9wdHIgKz0gMzsKKyAgICAgIH0KKyAgICAgIGJncl9wdHIgPSAodWludDhfdCopcGx0OworICAgIH0KKyAgfQorICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdDsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgIHVpbnQ4X3QqIHNyY19waXhlbCA9IGJncl9wdHIgKyAzICogKCpzcmNfc2NhbisrKTsKKyAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfcGl4ZWwrKzsKKyAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfcGl4ZWwrKzsKKyAgICAgICpkZXN0X3NjYW4gPSAqc3JjX3BpeGVsKys7CisgICAgICBkZXN0X3NjYW4gKz0gY29tcHMgLSAyOworICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgX0NvbnZlcnRCdWZmZXJfMjRicHBSZ2IyUmdiMjQodWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0KKyAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPQorICAgICAgICAgIHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiAzOworICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7CisgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9CisgICAgICAgICAgcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdCAqIDM7CisgICAgICBGWFNZU19tZW1jcHkoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGggKiAzKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIF9Db252ZXJ0QnVmZmVyXzMyYnBwUmdiMlJnYjI0KHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7CisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPQorICAgICAgICBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogNDsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgIHNyY19zY2FuKys7CisgICAgfQorICB9CisgIGlmIChwSWNjVHJhbnNmb3JtKSB7CisgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9CisgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOworICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKKyAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRlc3Rfc2NhbiwgZGVzdF9zY2FuLCB3aWR0aCk7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl9SZ2IyUmdiMzIodWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIGludCBjb21wcyA9IHBTcmNCaXRtYXAtPkdldEJQUCgpIC8gODsKKyAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0KKyAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPQorICAgICAgICAgIHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiBjb21wczsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIHNyY19zY2FuLCAxKTsKKyAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgIHNyY19zY2FuICs9IGNvbXBzOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7CisgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9CisgICAgICAgICAgcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdCAqIGNvbXBzOworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBzcmNfc2NhbiArPSBjb21wcyAtIDM7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBfQ29udmVydEJ1ZmZlcl8zMmJwcENteWsyUmdiMzIodWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIGlmIChwSWNjVHJhbnNmb3JtKSB7CisgICAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9CisgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOworICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0KKyAgICAgICAgICBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogNDsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIHNyY19zY2FuLCAxKTsKKyAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0KKyAgICAgICAgICBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogNDsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoc3JjX3NjYW5bMF0sIHNyY19zY2FuWzFdLCBzcmNfc2NhblsyXSwgc3JjX3NjYW5bM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0sIGRlc3Rfc2NhblsxXSwgZGVzdF9zY2FuWzBdKTsKKyAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDb252ZXJ0QnVmZmVyKEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRComIGRfcGFsLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQgPSBwU3JjQml0bWFwLT5HZXRGb3JtYXQoKTsKKyAgaWYgKCFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpIHx8CisgICAgICAhQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCkpIHsKKyAgICBwSWNjVHJhbnNmb3JtID0gTlVMTDsKKyAgfQorICBzd2l0Y2ggKGRlc3RfZm9ybWF0KSB7CisgICAgY2FzZSBGWERJQl9JbnZhbGlkOgorICAgIGNhc2UgRlhESUJfMWJwcENteWs6CisgICAgY2FzZSBGWERJQl8xYnBwTWFzazoKKyAgICBjYXNlIEZYRElCXzFicHBSZ2I6CisgICAgICBBU1NFUlQoRkFMU0UpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6IHsKKyAgICAgIGlmICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDEpIHsKKyAgICAgICAgaWYgKHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKSkgeworICAgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl8xYnBwUGx0MkdyYXkoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY190b3AsIHBJY2NUcmFuc2Zvcm0pOwogICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwU3JjQWxwaGEgJiYgcFNyY0FscGhhICE9IG1fcEFscGhhTWFzaykgewotICAgICAgICBkZWxldGUgcFNyY0FscGhhOwotICAgICAgICBwU3JjQWxwaGEgPSBOVUxMOwotICAgIH0KLSAgICBpZiAoIXJldCkgewotICAgICAgICBkZWxldGUgcENsb25lOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgRlhfRFdPUkQqIHBhbF84YnBwID0gTlVMTDsKLSAgICByZXQgPSBDb252ZXJ0QnVmZmVyKGRlc3RfZm9ybWF0LCBwQ2xvbmUtPkdldEJ1ZmZlcigpLCBwQ2xvbmUtPkdldFBpdGNoKCksIG1fV2lkdGgsIG1fSGVpZ2h0LCB0aGlzLCAwLCAwLCBwYWxfOGJwcCwgcEljY1RyYW5zZm9ybSk7Ci0gICAgaWYgKCFyZXQpIHsKLSAgICAgICAgaWYgKHBhbF84YnBwKSB7Ci0gICAgICAgICAgICBGWF9GcmVlKHBhbF84YnBwKTsKKyAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyXzFicHBNYXNrMkdyYXkoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wKTsKKyAgICAgIH0KKyAgICAgIGlmICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDgpIHsKKyAgICAgICAgaWYgKHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKSkgeworICAgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl84YnBwUGx0MkdyYXkoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY190b3AsIHBJY2NUcmFuc2Zvcm0pOwogICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZSBwQ2xvbmU7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfOGJwcE1hc2syR3JheShkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3ApOworICAgICAgfQorICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPj0gMjQpIHsKKyAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyX1JnYk9yQ215azJHcmF5KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfdG9wLCBwSWNjVHJhbnNmb3JtKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgaWYgKHBhbF84YnBwKSB7Ci0gICAgICAgIHBDbG9uZS0+Q29weVBhbGV0dGUocGFsXzhicHApOwotICAgICAgICBGWF9GcmVlKHBhbF84YnBwKTsKLSAgICAgICAgcGFsXzhicHAgPSBOVUxMOworICAgIGNhc2UgRlhESUJfOGJwcFJnYjoKKyAgICBjYXNlIEZYRElCXzhicHBSZ2JhOiB7CisgICAgICBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSA4ICYmICFwU3JjQml0bWFwLT5HZXRQYWxldHRlKCkpIHsKKyAgICAgICAgcmV0dXJuIENvbnZlcnRCdWZmZXIoRlhESUJfOGJwcE1hc2ssIGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCwgZF9wYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJY2NUcmFuc2Zvcm0pOworICAgICAgfQorICAgICAgZF9wYWwgPSBGWF9BbGxvYyhGWF9EV09SRCwgMjU2KTsKKyAgICAgIGlmICgoKHNyY19mb3JtYXQgJiAweGZmKSA9PSAxIHx8IChzcmNfZm9ybWF0ICYgMHhmZikgPT0gOCkgJiYKKyAgICAgICAgICBwU3JjQml0bWFwLT5HZXRQYWxldHRlKCkpIHsKKyAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyX1BsdDJQbHRSZ2I4KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3AsIGRfcGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSk7CisgICAgICB9CisgICAgICBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA+PSAyNCkgeworICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfUmdiMlBsdFJnYjgoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCwgZF9wYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgY2FzZSBGWERJQl9SZ2I6CisgICAgY2FzZSBGWERJQl9SZ2JhOiB7CisgICAgICBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSAxKSB7CisgICAgICAgIGlmIChwU3JjQml0bWFwLT5HZXRQYWxldHRlKCkpIHsKKyAgICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfMWJwcFBsdDJSZ2IoZGVzdF9mb3JtYXQsIGRlc3RfYnVmLCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3RvcCwgcEljY1RyYW5zZm9ybSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyXzFicHBNYXNrMlJnYihkZXN0X2Zvcm1hdCwgZGVzdF9idWYsIGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3RvcCk7CisgICAgICB9CisgICAgICBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSA4KSB7CisgICAgICAgIGlmIChwU3JjQml0bWFwLT5HZXRQYWxldHRlKCkpIHsKKyAgICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfOGJwcFBsdDJSZ2IoZGVzdF9mb3JtYXQsIGRlc3RfYnVmLCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3RvcCwgcEljY1RyYW5zZm9ybSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyXzhicHBNYXNrMlJnYihkZXN0X2Zvcm1hdCwgZGVzdF9idWYsIGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3RvcCk7CisgICAgICB9CisgICAgICBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSAyNCkgeworICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfMjRicHBSZ2IyUmdiMjQoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY190b3AsIHBJY2NUcmFuc2Zvcm0pOworICAgICAgfQorICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gMzIpIHsKKyAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyXzMyYnBwUmdiMlJnYjI0KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfdG9wLCBwSWNjVHJhbnNmb3JtKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgY2FzZSBGWERJQl9BcmdiOgorICAgIGNhc2UgRlhESUJfUmdiMzI6IHsKKyAgICAgIGlmICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDEpIHsKKyAgICAgICAgaWYgKHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKSkgeworICAgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl8xYnBwUGx0MlJnYihkZXN0X2Zvcm1hdCwgZGVzdF9idWYsIGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfdG9wLCBwSWNjVHJhbnNmb3JtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfMWJwcE1hc2syUmdiKGRlc3RfZm9ybWF0LCBkZXN0X2J1ZiwgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfdG9wKTsKKyAgICAgIH0KKyAgICAgIGlmICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDgpIHsKKyAgICAgICAgaWYgKHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKSkgeworICAgICAgICAgIHJldHVybiBfQ29udmVydEJ1ZmZlcl84YnBwUGx0MlJnYihkZXN0X2Zvcm1hdCwgZGVzdF9idWYsIGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfdG9wLCBwSWNjVHJhbnNmb3JtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX0NvbnZlcnRCdWZmZXJfOGJwcE1hc2syUmdiKGRlc3RfZm9ybWF0LCBkZXN0X2J1ZiwgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfdG9wKTsKKyAgICAgIH0KKyAgICAgIGlmICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID49IDI0KSB7CisgICAgICAgIGlmIChzcmNfZm9ybWF0ICYgMHgwNDAwKSB7CisgICAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyXzMyYnBwQ215azJSZ2IzMihkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3RvcCwgcEljY1RyYW5zZm9ybSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9Db252ZXJ0QnVmZmVyX1JnYjJSZ2IzMihkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitDRlhfRElCaXRtYXAqIENGWF9ESUJTb3VyY2U6OkNsb25lQ29udmVydChGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIGNvbnN0IHsKKyAgaWYgKGRlc3RfZm9ybWF0ID09IEdldEZvcm1hdCgpICYmICFwSWNjVHJhbnNmb3JtKSB7CisgICAgcmV0dXJuIENsb25lKHBDbGlwKTsKKyAgfQorICBpZiAocENsaXApIHsKKyAgICBDRlhfRElCaXRtYXAqIHBDbG9uZSA9IENsb25lKHBDbGlwKTsKKyAgICBpZiAoIXBDbG9uZSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghcENsb25lLT5Db252ZXJ0Rm9ybWF0KGRlc3RfZm9ybWF0LCBwSWNjVHJhbnNmb3JtKSkgeworICAgICAgZGVsZXRlIHBDbG9uZTsKKyAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICByZXR1cm4gcENsb25lOworICB9CisgIENGWF9ESUJpdG1hcCogcENsb25lID0gbmV3IENGWF9ESUJpdG1hcDsKKyAgaWYgKCFwQ2xvbmUtPkNyZWF0ZShtX1dpZHRoLCBtX0hlaWdodCwgZGVzdF9mb3JtYXQpKSB7CisgICAgZGVsZXRlIHBDbG9uZTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBGWF9CT09MIHJldCA9IFRSVUU7CisgIENGWF9ESUJpdG1hcCogcFNyY0FscGhhID0gTlVMTDsKKyAgaWYgKEhhc0FscGhhKCkpIHsKKyAgICBwU3JjQWxwaGEgPSAoR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYikgPyBHZXRBbHBoYU1hc2soKSA6IG1fcEFscGhhTWFzazsKKyAgICBpZiAoIXBTcmNBbHBoYSkgeworICAgICAgZGVsZXRlIHBDbG9uZTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorICBpZiAoZGVzdF9mb3JtYXQgJiAweDAyMDApIHsKKyAgICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfQXJnYikKKyAgICAgIHJldCA9IHBTcmNBbHBoYSA/IHBDbG9uZS0+TG9hZENoYW5uZWwoRlhESUJfQWxwaGEsIHBTcmNBbHBoYSwgRlhESUJfQWxwaGEpCisgICAgICAgICAgICAgICAgICAgICAgOiBwQ2xvbmUtPkxvYWRDaGFubmVsKEZYRElCX0FscGhhLCAweGZmKTsKKyAgICBlbHNlIHsKKyAgICAgIHJldCA9IHBDbG9uZS0+Q29weUFscGhhTWFzayhwU3JjQWxwaGEpOworICAgIH0KKyAgfQorICBpZiAocFNyY0FscGhhICYmIHBTcmNBbHBoYSAhPSBtX3BBbHBoYU1hc2spIHsKKyAgICBkZWxldGUgcFNyY0FscGhhOworICAgIHBTcmNBbHBoYSA9IE5VTEw7CisgIH0KKyAgaWYgKCFyZXQpIHsKKyAgICBkZWxldGUgcENsb25lOworICAgIHJldHVybiBOVUxMOworICB9CisgIEZYX0RXT1JEKiBwYWxfOGJwcCA9IE5VTEw7CisgIHJldCA9IENvbnZlcnRCdWZmZXIoZGVzdF9mb3JtYXQsIHBDbG9uZS0+R2V0QnVmZmVyKCksIHBDbG9uZS0+R2V0UGl0Y2goKSwKKyAgICAgICAgICAgICAgICAgICAgICBtX1dpZHRoLCBtX0hlaWdodCwgdGhpcywgMCwgMCwgcGFsXzhicHAsIHBJY2NUcmFuc2Zvcm0pOworICBpZiAoIXJldCkgeworICAgIEZYX0ZyZWUocGFsXzhicHApOworICAgIGRlbGV0ZSBwQ2xvbmU7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKHBhbF84YnBwKSB7CisgICAgcENsb25lLT5Db3B5UGFsZXR0ZShwYWxfOGJwcCk7CisgICAgRlhfRnJlZShwYWxfOGJwcCk7CisgICAgcGFsXzhicHAgPSBOVUxMOworICB9CisgIHJldHVybiBwQ2xvbmU7CiB9Ci1GWF9CT09MIENGWF9ESUJpdG1hcDo6Q29udmVydEZvcm1hdChGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQgPSBHZXRGb3JtYXQoKTsKLSAgICBpZiAoZGVzdF9mb3JtYXQgPT0gc3JjX2Zvcm1hdCAmJiBwSWNjVHJhbnNmb3JtID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmIChkZXN0X2Zvcm1hdCA9PSBGWERJQl84YnBwTWFzayAmJiBzcmNfZm9ybWF0ID09IEZYRElCXzhicHBSZ2IgJiYgbV9wUGFsZXR0ZSA9PSBOVUxMKSB7Ci0gICAgICAgIG1fQWxwaGFGbGFnID0gMTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmIChkZXN0X2Zvcm1hdCA9PSBGWERJQl9BcmdiICYmIHNyY19mb3JtYXQgPT0gRlhESUJfUmdiMzIgJiYgcEljY1RyYW5zZm9ybSA9PSBOVUxMKSB7Ci0gICAgICAgIG1fQWxwaGFGbGFnID0gMjsKLSAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgRlhfTFBCWVRFIHNjYW5saW5lID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaCArIDM7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAqc2NhbmxpbmUgPSAweGZmOwotICAgICAgICAgICAgICAgIHNjYW5saW5lICs9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGludCBkZXN0X2JwcCA9IGRlc3RfZm9ybWF0ICYgMHhmZjsKLSAgICBpbnQgZGVzdF9waXRjaCA9IChkZXN0X2JwcCAqIG1fV2lkdGggKyAzMSkgLyAzMiAqIDQ7Ci0gICAgRlhfTFBCWVRFIGRlc3RfYnVmID0gRlhfVHJ5QWxsb2MoRlhfQllURSwgZGVzdF9waXRjaCAqIG1fSGVpZ2h0ICsgNCk7Ci0gICAgaWYgKGRlc3RfYnVmID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDRlhfRElCaXRtYXAqIHBBbHBoYU1hc2sgPSBOVUxMOwotICAgIGlmIChkZXN0X2Zvcm1hdCA9PSBGWERJQl9BcmdiKSB7Ci0gICAgICAgIEZYU1lTX21lbXNldDgoZGVzdF9idWYsIDB4ZmYsIGRlc3RfcGl0Y2ggKiBtX0hlaWdodCArIDQpOwotICAgICAgICBpZiAobV9wQWxwaGFNYXNrKSB7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgRlhfTFBCWVRFIHBEc3RTY2FubGluZSA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaCArIDM7Ci0gICAgICAgICAgICAgICAgRlhfTFBDQllURSBwU3JjU2NhbmxpbmUgPSBtX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICpwRHN0U2NhbmxpbmUgPSAqcFNyY1NjYW5saW5lKys7Ci0gICAgICAgICAgICAgICAgICAgIHBEc3RTY2FubGluZSArPSA0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoZGVzdF9mb3JtYXQgJiAweDAyMDApIHsKLSAgICAgICAgaWYgKHNyY19mb3JtYXQgPT0gRlhESUJfQXJnYikgewotICAgICAgICAgICAgcEFscGhhTWFzayA9IEdldEFscGhhTWFzaygpOwotICAgICAgICAgICAgaWYgKHBBbHBoYU1hc2sgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEZYX0ZyZWUoZGVzdF9idWYpOwotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtX3BBbHBoYU1hc2sgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmICghQnVpbGRBbHBoYU1hc2soKSkgewotICAgICAgICAgICAgICAgICAgICBGWF9GcmVlKGRlc3RfYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwQWxwaGFNYXNrID0gbV9wQWxwaGFNYXNrOwotICAgICAgICAgICAgICAgIG1fcEFscGhhTWFzayA9IE5VTEw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBBbHBoYU1hc2sgPSBtX3BBbHBoYU1hc2s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlhfQk9PTCByZXQgPSBGQUxTRTsKLSAgICBGWF9EV09SRCogcGFsXzhicHAgPSBOVUxMOwotICAgIHJldCA9IENvbnZlcnRCdWZmZXIoZGVzdF9mb3JtYXQsIGRlc3RfYnVmLCBkZXN0X3BpdGNoLCBtX1dpZHRoLCBtX0hlaWdodCwgdGhpcywgMCwgMCwgcGFsXzhicHAsIHBJY2NUcmFuc2Zvcm0pOwotICAgIGlmICghcmV0KSB7Ci0gICAgICAgIGlmIChwYWxfOGJwcCkgewotICAgICAgICAgICAgRlhfRnJlZShwYWxfOGJwcCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBBbHBoYU1hc2sgIT0gbV9wQWxwaGFNYXNrKSB7Ci0gICAgICAgICAgICBkZWxldGUgcEFscGhhTWFzazsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGVzdF9idWYpIHsKLSAgICAgICAgICAgIEZYX0ZyZWUoZGVzdF9idWYpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG1fcEFscGhhTWFzayAmJiBwQWxwaGFNYXNrICE9IG1fcEFscGhhTWFzaykgewotICAgICAgICBkZWxldGUgbV9wQWxwaGFNYXNrOwotICAgIH0KLSAgICBtX3BBbHBoYU1hc2sgPSBwQWxwaGFNYXNrOwotICAgIGlmIChtX3BQYWxldHRlKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wUGFsZXR0ZSk7Ci0gICAgfQotICAgIG1fcFBhbGV0dGUgPSBwYWxfOGJwcDsKLSAgICBpZiAoIW1fYkV4dEJ1ZikgewotICAgICAgICBGWF9GcmVlKG1fcEJ1ZmZlcik7Ci0gICAgfQotICAgIG1fYkV4dEJ1ZiA9IEZBTFNFOwotICAgIG1fcEJ1ZmZlciA9IGRlc3RfYnVmOwotICAgIG1fYnBwID0gKEZYX0JZVEUpZGVzdF9mb3JtYXQ7Ci0gICAgbV9BbHBoYUZsYWcgPSAoRlhfQllURSkoZGVzdF9mb3JtYXQgPj4gOCk7Ci0gICAgbV9QaXRjaCA9IGRlc3RfcGl0Y2g7CitGWF9CT09MIENGWF9ESUJpdG1hcDo6Q29udmVydEZvcm1hdChGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0ID0gR2V0Rm9ybWF0KCk7CisgIGlmIChkZXN0X2Zvcm1hdCA9PSBzcmNfZm9ybWF0ICYmICFwSWNjVHJhbnNmb3JtKSB7CiAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKGRlc3RfZm9ybWF0ID09IEZYRElCXzhicHBNYXNrICYmIHNyY19mb3JtYXQgPT0gRlhESUJfOGJwcFJnYiAmJgorICAgICAgIW1fcFBhbGV0dGUpIHsKKyAgICBtX0FscGhhRmxhZyA9IDE7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKGRlc3RfZm9ybWF0ID09IEZYRElCX0FyZ2IgJiYgc3JjX2Zvcm1hdCA9PSBGWERJQl9SZ2IzMiAmJgorICAgICAgIXBJY2NUcmFuc2Zvcm0pIHsKKyAgICBtX0FscGhhRmxhZyA9IDI7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdysrKSB7CisgICAgICB1aW50OF90KiBzY2FubGluZSA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2ggKyAzOworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgKnNjYW5saW5lID0gMHhmZjsKKyAgICAgICAgc2NhbmxpbmUgKz0gNDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaW50IGRlc3RfYnBwID0gZGVzdF9mb3JtYXQgJiAweGZmOworICBpbnQgZGVzdF9waXRjaCA9IChkZXN0X2JwcCAqIG1fV2lkdGggKyAzMSkgLyAzMiAqIDQ7CisgIHVpbnQ4X3QqIGRlc3RfYnVmID0gRlhfVHJ5QWxsb2ModWludDhfdCwgZGVzdF9waXRjaCAqIG1fSGVpZ2h0ICsgNCk7CisgIGlmICghZGVzdF9idWYpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0ZYX0RJQml0bWFwKiBwQWxwaGFNYXNrID0gTlVMTDsKKyAgaWYgKGRlc3RfZm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKKyAgICBGWFNZU19tZW1zZXQoZGVzdF9idWYsIDB4ZmYsIGRlc3RfcGl0Y2ggKiBtX0hlaWdodCArIDQpOworICAgIGlmIChtX3BBbHBoYU1hc2spIHsKKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3crKykgeworICAgICAgICB1aW50OF90KiBwRHN0U2NhbmxpbmUgPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2ggKyAzOworICAgICAgICBjb25zdCB1aW50OF90KiBwU3JjU2NhbmxpbmUgPSBtX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKHJvdyk7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgKnBEc3RTY2FubGluZSA9ICpwU3JjU2NhbmxpbmUrKzsKKyAgICAgICAgICBwRHN0U2NhbmxpbmUgKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmIChkZXN0X2Zvcm1hdCAmIDB4MDIwMCkgeworICAgIGlmIChzcmNfZm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKKyAgICAgIHBBbHBoYU1hc2sgPSBHZXRBbHBoYU1hc2soKTsKKyAgICAgIGlmICghcEFscGhhTWFzaykgeworICAgICAgICBGWF9GcmVlKGRlc3RfYnVmKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoIW1fcEFscGhhTWFzaykgeworICAgICAgICBpZiAoIUJ1aWxkQWxwaGFNYXNrKCkpIHsKKyAgICAgICAgICBGWF9GcmVlKGRlc3RfYnVmKTsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgcEFscGhhTWFzayA9IG1fcEFscGhhTWFzazsKKyAgICAgICAgbV9wQWxwaGFNYXNrID0gTlVMTDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBBbHBoYU1hc2sgPSBtX3BBbHBoYU1hc2s7CisgICAgICB9CisgICAgfQorICB9CisgIEZYX0JPT0wgcmV0ID0gRkFMU0U7CisgIEZYX0RXT1JEKiBwYWxfOGJwcCA9IE5VTEw7CisgIHJldCA9IENvbnZlcnRCdWZmZXIoZGVzdF9mb3JtYXQsIGRlc3RfYnVmLCBkZXN0X3BpdGNoLCBtX1dpZHRoLCBtX0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICB0aGlzLCAwLCAwLCBwYWxfOGJwcCwgcEljY1RyYW5zZm9ybSk7CisgIGlmICghcmV0KSB7CisgICAgRlhfRnJlZShwYWxfOGJwcCk7CisgICAgaWYgKHBBbHBoYU1hc2sgIT0gbV9wQWxwaGFNYXNrKSB7CisgICAgICBkZWxldGUgcEFscGhhTWFzazsKKyAgICB9CisgICAgRlhfRnJlZShkZXN0X2J1Zik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX3BBbHBoYU1hc2sgJiYgcEFscGhhTWFzayAhPSBtX3BBbHBoYU1hc2spIHsKKyAgICBkZWxldGUgbV9wQWxwaGFNYXNrOworICB9CisgIG1fcEFscGhhTWFzayA9IHBBbHBoYU1hc2s7CisgIEZYX0ZyZWUobV9wUGFsZXR0ZSk7CisgIG1fcFBhbGV0dGUgPSBwYWxfOGJwcDsKKyAgaWYgKCFtX2JFeHRCdWYpIHsKKyAgICBGWF9GcmVlKG1fcEJ1ZmZlcik7CisgIH0KKyAgbV9iRXh0QnVmID0gRkFMU0U7CisgIG1fcEJ1ZmZlciA9IGRlc3RfYnVmOworICBtX2JwcCA9ICh1aW50OF90KWRlc3RfZm9ybWF0OworICBtX0FscGhhRmxhZyA9ICh1aW50OF90KShkZXN0X2Zvcm1hdCA+PiA4KTsKKyAgbV9QaXRjaCA9IGRlc3RfcGl0Y2g7CisgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX2VuZ2luZS5jcHAgYi9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfZW5naW5lLmNwcAppbmRleCBiNDg2ZGVmLi4xNjc3MmVkIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfZW5naW5lLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfZW5naW5lLmNwcApAQCAtMSw4NDAgKzEsOTE3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZGliLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGdlL2Z4X2dlLmgiCi0jaW5jbHVkZSAiZGliX2ludC5oIgogI2luY2x1ZGUgPGxpbWl0cy5oPgotZXh0ZXJuIGludCBTRFBfVGFibGVbNTEzXTsKLXZvaWQgQ1dlaWdodFRhYmxlOjpDYWxjKGludCBkZXN0X2xlbiwgaW50IGRlc3RfbWluLCBpbnQgZGVzdF9tYXgsIGludCBzcmNfbGVuLCBpbnQgc3JjX21pbiwgaW50IHNyY19tYXgsIGludCBmbGFncykKLXsKLSAgICBpZiAobV9wV2VpZ2h0VGFibGVzKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wV2VpZ2h0VGFibGVzKTsKLSAgICAgICAgbV9wV2VpZ2h0VGFibGVzID0gTlVMTDsKLSAgICB9Ci0gICAgZG91YmxlIHNjYWxlLCBiYXNlOwotICAgIHNjYWxlID0gRlhTWVNfRGl2KChGWF9GTE9BVCkoc3JjX2xlbiksIChGWF9GTE9BVCkoZGVzdF9sZW4pKTsKLSAgICBpZiAoZGVzdF9sZW4gPCAwKSB7Ci0gICAgICAgIGJhc2UgPSAoRlhfRkxPQVQpKHNyY19sZW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJhc2UgPSAwOwotICAgIH0KLSAgICBpbnQgZXh0X3NpemUgPSBmbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wgPyAzIDogMTsKLSAgICBtX0l0ZW1TaXplID0gc2l6ZW9mKGludCkgKiAyICsgKGludCkoc2l6ZW9mKGludCkgKiAoRlhTWVNfY2VpbChGWFNZU19mYWJzKChGWF9GTE9BVClzY2FsZSkpICsgZXh0X3NpemUpKTsKLSAgICBtX0Rlc3RNaW4gPSBkZXN0X21pbjsKLSAgICBpZiAoKGRlc3RfbWF4IC0gZGVzdF9taW4pID4gKGludCkoKDFVIDw8IDMwKSAtIDQpIC8gbV9JdGVtU2l6ZSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fcFdlaWdodFRhYmxlcyA9IEZYX1RyeUFsbG9jKEZYX0JZVEUsIChkZXN0X21heCAtIGRlc3RfbWluKSAqIG1fSXRlbVNpemUgKyA0KTsKLSAgICBpZiAobV9wV2VpZ2h0VGFibGVzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoKGZsYWdzICYgRlhESUJfTk9TTU9PVEgpICE9IDAgfHwgRlhTWVNfZmFicygoRlhfRkxPQVQpc2NhbGUpIDwgMS4wZikgewotICAgICAgICBmb3IgKGludCBkZXN0X3BpeGVsID0gZGVzdF9taW47IGRlc3RfcGl4ZWwgPCBkZXN0X21heDsgZGVzdF9waXhlbCArKykgewotICAgICAgICAgICAgUGl4ZWxXZWlnaHQmIHBpeGVsX3dlaWdodHMgPSAqR2V0UGl4ZWxXZWlnaHQoZGVzdF9waXhlbCk7Ci0gICAgICAgICAgICBkb3VibGUgc3JjX3BvcyA9IGRlc3RfcGl4ZWwgKiBzY2FsZSArIHNjYWxlIC8gMiArIGJhc2U7Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgJiBGWERJQl9JTlRFUlBPTCkgewotICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9IChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY19wb3MgLSAxLjBmIC8gMik7Ci0gICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9IChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY19wb3MgKyAxLjBmIC8gMik7Ci0gICAgICAgICAgICAgICAgaWYgKHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA8IHNyY19taW4pIHsKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gc3JjX21pbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPj0gc3JjX21heCkgewotICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gc3JjX21heCAtIDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCkgewotICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9IDY1NTM2OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzFdID0gRlhTWVNfcm91bmQoKEZYX0ZMT0FUKShzcmNfcG9zIC0gcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0IC0gMS4wZiAvIDIpICogNjU1MzYpOwotICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9IDY1NTM2IC0gcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChmbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKLSAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPSAoaW50KUZYU1lTX2Zsb29yKChGWF9GTE9BVClzcmNfcG9zIC0gMS4wZiAvIDIpOwotICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSAoaW50KUZYU1lTX2Zsb29yKChGWF9GTE9BVClzcmNfcG9zICsgMS4wZiAvIDIpOwotICAgICAgICAgICAgICAgIGludCBzdGFydCA9IHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCAtIDE7Ci0gICAgICAgICAgICAgICAgaW50IGVuZCA9IHBpeGVsX3dlaWdodHMubV9TcmNFbmQgKyAxOwotICAgICAgICAgICAgICAgIGlmIChzdGFydCA8IHNyY19taW4pIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBzcmNfbWluOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZW5kID49IHNyY19tYXgpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kID0gc3JjX21heCAtIDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPCBzcmNfbWluKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNyY19wb3MgKz0gc3JjX21pbiAtIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydDsKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gc3JjX21pbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPj0gc3JjX21heCkgewotICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gc3JjX21heCAtIDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludCB3ZWlnaHQ7Ci0gICAgICAgICAgICAgICAgd2VpZ2h0ID0gRlhTWVNfcm91bmQoKEZYX0ZMT0FUKShzcmNfcG9zIC0gcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0IC0gMS4wZiAvIDIpICogMjU2KTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0gKFNEUF9UYWJsZVsyNTYgKyB3ZWlnaHRdICsgU0RQX1RhYmxlW3dlaWdodF0gKyBTRFBfVGFibGVbMjU2IC0gd2VpZ2h0XSArIFNEUF9UYWJsZVs1MTIgLSB3ZWlnaHRdKSA8PCA4OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHN0YXJ0ID09IHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCAmJiAocGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID09IHBpeGVsX3dlaWdodHMubV9TcmNFbmQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCkgJiYgc3RhcnQgPCBlbmQpIHx8IChzdGFydCA8IHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCAmJiBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCAmJiBlbmQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0IDwgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9IFNEUF9UYWJsZVsyNTYgKyB3ZWlnaHRdIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1sxXSA9IChTRFBfVGFibGVbd2VpZ2h0XSArIFNEUF9UYWJsZVsyNTYgLSB3ZWlnaHRdICsgU0RQX1RhYmxlWzUxMiAtIHdlaWdodF0pIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID09IHBpeGVsX3dlaWdodHMubV9TcmNFbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9IChTRFBfVGFibGVbMjU2ICsgd2VpZ2h0XSArIFNEUF9UYWJsZVt3ZWlnaHRdICsgU0RQX1RhYmxlWzI1NiAtIHdlaWdodF0pIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMV0gPSBTRFBfVGFibGVbNTEyIC0gd2VpZ2h0XSA8PCA4OwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9IChTRFBfVGFibGVbMjU2ICsgd2VpZ2h0XSArIFNEUF9UYWJsZVt3ZWlnaHRdKSA8PCA4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzFdID0gKFNEUF9UYWJsZVsyNTYgLSB3ZWlnaHRdICsgU0RQX1RhYmxlWzUxMiAtIHdlaWdodF0pIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9PSBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gZW5kOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA8IHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gc3RhcnQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0ID09IHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPCBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kIDwgZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0gKFNEUF9UYWJsZVsyNTYgKyB3ZWlnaHRdICsgU0RQX1RhYmxlW3dlaWdodF0pIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzFdID0gU0RQX1RhYmxlWzI1NiAtIHdlaWdodF0gPDwgODsKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMl0gPSBTRFBfVGFibGVbNTEyIC0gd2VpZ2h0XSA8PCA4OwotICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gZW5kOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnQgPCBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA8IHBpeGVsX3dlaWdodHMubV9TcmNFbmQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPT0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0gU0RQX1RhYmxlWzI1NiArIHdlaWdodF0gPDwgODsKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMV0gPSBTRFBfVGFibGVbd2VpZ2h0XSA8PCA4OwotICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1syXSA9IChTRFBfVGFibGVbMjU2IC0gd2VpZ2h0XSArIFNEUF9UYWJsZVs1MTIgLSB3ZWlnaHRdKSA8PCA4OwotICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9IFNEUF9UYWJsZVsyNTYgKyB3ZWlnaHRdIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzFdID0gU0RQX1RhYmxlW3dlaWdodF0gPDwgODsKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMl0gPSBTRFBfVGFibGVbMjU2IC0gd2VpZ2h0XSA8PCA4OwotICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1szXSA9IFNEUF9UYWJsZVs1MTIgLSB3ZWlnaHRdIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9IHN0YXJ0OwotICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gZW5kOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9IChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY19wb3MpOwotICAgICAgICAgICAgICAgIGlmIChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPCBzcmNfbWluKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9IHNyY19taW47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID49IHNyY19tYXgpIHsKLSAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9IHNyY19tYXggLSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9IDY1NTM2OwotICAgICAgICAgICAgfQorCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZGliLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKKyNpbmNsdWRlICJkaWJfaW50LmgiCisKK3ZvaWQgQ1dlaWdodFRhYmxlOjpDYWxjKGludCBkZXN0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X21pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X21heCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19taW4sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX21heCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykgeworICBGWF9GcmVlKG1fcFdlaWdodFRhYmxlcyk7CisgIG1fcFdlaWdodFRhYmxlcyA9IE5VTEw7CisgIGRvdWJsZSBzY2FsZSwgYmFzZTsKKyAgc2NhbGUgPSBGWFNZU19EaXYoKEZYX0ZMT0FUKShzcmNfbGVuKSwgKEZYX0ZMT0FUKShkZXN0X2xlbikpOworICBpZiAoZGVzdF9sZW4gPCAwKSB7CisgICAgYmFzZSA9IChGWF9GTE9BVCkoc3JjX2xlbik7CisgIH0gZWxzZSB7CisgICAgYmFzZSA9IDA7CisgIH0KKyAgaW50IGV4dF9zaXplID0gZmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MID8gMyA6IDE7CisgIG1fSXRlbVNpemUgPQorICAgICAgc2l6ZW9mKGludCkgKiAyICsKKyAgICAgIChpbnQpKHNpemVvZihpbnQpICogKEZYU1lTX2NlaWwoRlhTWVNfZmFicygoRlhfRkxPQVQpc2NhbGUpKSArIGV4dF9zaXplKSk7CisgIG1fRGVzdE1pbiA9IGRlc3RfbWluOworICBpZiAoKGRlc3RfbWF4IC0gZGVzdF9taW4pID4gKGludCkoKDFVIDw8IDMwKSAtIDQpIC8gbV9JdGVtU2l6ZSkgeworICAgIHJldHVybjsKKyAgfQorICBtX3BXZWlnaHRUYWJsZXMgPQorICAgICAgRlhfVHJ5QWxsb2ModWludDhfdCwgKGRlc3RfbWF4IC0gZGVzdF9taW4pICogbV9JdGVtU2l6ZSArIDQpOworICBpZiAoIW1fcFdlaWdodFRhYmxlcykgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoKGZsYWdzICYgRlhESUJfTk9TTU9PVEgpICE9IDAgfHwgRlhTWVNfZmFicygoRlhfRkxPQVQpc2NhbGUpIDwgMS4wZikgeworICAgIGZvciAoaW50IGRlc3RfcGl4ZWwgPSBkZXN0X21pbjsgZGVzdF9waXhlbCA8IGRlc3RfbWF4OyBkZXN0X3BpeGVsKyspIHsKKyAgICAgIFBpeGVsV2VpZ2h0JiBwaXhlbF93ZWlnaHRzID0gKkdldFBpeGVsV2VpZ2h0KGRlc3RfcGl4ZWwpOworICAgICAgZG91YmxlIHNyY19wb3MgPSBkZXN0X3BpeGVsICogc2NhbGUgKyBzY2FsZSAvIDIgKyBiYXNlOworICAgICAgaWYgKGZsYWdzICYgRlhESUJfSU5URVJQT0wpIHsKKyAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0KKyAgICAgICAgICAgIChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY19wb3MgLSAxLjBmIC8gMik7CisgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSAoaW50KUZYU1lTX2Zsb29yKChGWF9GTE9BVClzcmNfcG9zICsgMS4wZiAvIDIpOworICAgICAgICBpZiAocGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0IDwgc3JjX21pbikgeworICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9IHNyY19taW47CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3IgKGludCBkZXN0X3BpeGVsID0gZGVzdF9taW47IGRlc3RfcGl4ZWwgPCBkZXN0X21heDsgZGVzdF9waXhlbCArKykgewotICAgICAgICBQaXhlbFdlaWdodCYgcGl4ZWxfd2VpZ2h0cyA9ICpHZXRQaXhlbFdlaWdodChkZXN0X3BpeGVsKTsKLSAgICAgICAgZG91YmxlIHNyY19zdGFydCA9IGRlc3RfcGl4ZWwgKiBzY2FsZSArIGJhc2U7Ci0gICAgICAgIGRvdWJsZSBzcmNfZW5kID0gc3JjX3N0YXJ0ICsgc2NhbGU7Ci0gICAgICAgIGludCBzdGFydF9pLCBlbmRfaTsKLSAgICAgICAgaWYgKHNyY19zdGFydCA8IHNyY19lbmQpIHsKLSAgICAgICAgICAgIHN0YXJ0X2kgPSAoaW50KUZYU1lTX2Zsb29yKChGWF9GTE9BVClzcmNfc3RhcnQpOwotICAgICAgICAgICAgZW5kX2kgPSAoaW50KUZYU1lTX2NlaWwoKEZYX0ZMT0FUKXNyY19lbmQpOworICAgICAgICBpZiAocGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA+PSBzcmNfbWF4KSB7CisgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9IHNyY19tYXggLSAxOworICAgICAgICB9CisgICAgICAgIGlmIChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCkgeworICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0gNjU1MzY7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdGFydF9pID0gKGludClGWFNZU19mbG9vcigoRlhfRkxPQVQpc3JjX2VuZCk7Ci0gICAgICAgICAgICBlbmRfaSA9IChpbnQpRlhTWVNfY2VpbCgoRlhfRkxPQVQpc3JjX3N0YXJ0KTsKKyAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1sxXSA9IEZYU1lTX3JvdW5kKAorICAgICAgICAgICAgICAoRlhfRkxPQVQpKHNyY19wb3MgLSBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgLSAxLjBmIC8gMikgKgorICAgICAgICAgICAgICA2NTUzNik7CisgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMF0gPSA2NTUzNiAtIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzFdOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzdGFydF9pIDwgc3JjX21pbikgewotICAgICAgICAgICAgc3RhcnRfaSA9IHNyY19taW47CisgICAgICB9IGVsc2UgaWYgKGZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgeworICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPQorICAgICAgICAgICAgKGludClGWFNZU19mbG9vcigoRlhfRkxPQVQpc3JjX3BvcyAtIDEuMGYgLyAyKTsKKyAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9IChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY19wb3MgKyAxLjBmIC8gMik7CisgICAgICAgIGludCBzdGFydCA9IHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCAtIDE7CisgICAgICAgIGludCBlbmQgPSBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kICsgMTsKKyAgICAgICAgaWYgKHN0YXJ0IDwgc3JjX21pbikgeworICAgICAgICAgIHN0YXJ0ID0gc3JjX21pbjsKICAgICAgICAgfQotICAgICAgICBpZiAoZW5kX2kgPj0gc3JjX21heCkgewotICAgICAgICAgICAgZW5kX2kgPSBzcmNfbWF4IC0gMTsKKyAgICAgICAgaWYgKGVuZCA+PSBzcmNfbWF4KSB7CisgICAgICAgICAgZW5kID0gc3JjX21heCAtIDE7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXJ0X2kgPiBlbmRfaSkgewotICAgICAgICAgICAgaWYgKHN0YXJ0X2kgPj0gc3JjX21heCkgewotICAgICAgICAgICAgICAgIHN0YXJ0X2kgPSBzcmNfbWF4IC0gMTsKKyAgICAgICAgaWYgKHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA8IHNyY19taW4pIHsKKyAgICAgICAgICBzcmNfcG9zICs9IHNyY19taW4gLSBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQ7CisgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gc3JjX21pbjsKKyAgICAgICAgfQorICAgICAgICBpZiAocGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA+PSBzcmNfbWF4KSB7CisgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9IHNyY19tYXggLSAxOworICAgICAgICB9CisgICAgICAgIGludCB3ZWlnaHQ7CisgICAgICAgIHdlaWdodCA9IEZYU1lTX3JvdW5kKAorICAgICAgICAgICAgKEZYX0ZMT0FUKShzcmNfcG9zIC0gcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0IC0gMS4wZiAvIDIpICogMjU2KTsKKyAgICAgICAgaWYgKHN0YXJ0ID09IGVuZCkgeworICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0KKyAgICAgICAgICAgICAgKFNEUF9UYWJsZVsyNTYgKyB3ZWlnaHRdICsgU0RQX1RhYmxlW3dlaWdodF0gKworICAgICAgICAgICAgICAgU0RQX1RhYmxlWzI1NiAtIHdlaWdodF0gKyBTRFBfVGFibGVbNTEyIC0gd2VpZ2h0XSkKKyAgICAgICAgICAgICAgPDwgODsKKyAgICAgICAgfSBlbHNlIGlmICgoc3RhcnQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ICYmCisgICAgICAgICAgICAgICAgICAgIChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCB8fAorICAgICAgICAgICAgICAgICAgICAgZW5kID09IHBpeGVsX3dlaWdodHMubV9TcmNFbmQpICYmCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0IDwgZW5kKSB8fAorICAgICAgICAgICAgICAgICAgIChzdGFydCA8IHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCAmJgorICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCAmJgorICAgICAgICAgICAgICAgICAgICBlbmQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCkpIHsKKyAgICAgICAgICBpZiAoc3RhcnQgPCBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQpIHsKKyAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0gU0RQX1RhYmxlWzI1NiArIHdlaWdodF0gPDwgODsKKyAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzFdID0KKyAgICAgICAgICAgICAgICAoU0RQX1RhYmxlW3dlaWdodF0gKyBTRFBfVGFibGVbMjU2IC0gd2VpZ2h0XSArCisgICAgICAgICAgICAgICAgIFNEUF9UYWJsZVs1MTIgLSB3ZWlnaHRdKQorICAgICAgICAgICAgICAgIDw8IDg7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCkgeworICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9CisgICAgICAgICAgICAgICAgICAoU0RQX1RhYmxlWzI1NiArIHdlaWdodF0gKyBTRFBfVGFibGVbd2VpZ2h0XSArCisgICAgICAgICAgICAgICAgICAgU0RQX1RhYmxlWzI1NiAtIHdlaWdodF0pCisgICAgICAgICAgICAgICAgICA8PCA4OworICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1sxXSA9IFNEUF9UYWJsZVs1MTIgLSB3ZWlnaHRdIDw8IDg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9CisgICAgICAgICAgICAgICAgICAoU0RQX1RhYmxlWzI1NiArIHdlaWdodF0gKyBTRFBfVGFibGVbd2VpZ2h0XSkgPDwgODsKKyAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMV0gPQorICAgICAgICAgICAgICAgICAgKFNEUF9UYWJsZVsyNTYgLSB3ZWlnaHRdICsgU0RQX1RhYmxlWzUxMiAtIHdlaWdodF0pIDw8IDg7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPSBzdGFydF9pOwotICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9IHN0YXJ0X2k7Ci0gICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9PSBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kKSB7CisgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gZW5kOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc3RhcnQgPCBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQpIHsKKyAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9IHN0YXJ0OworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzdGFydCA9PSBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgJiYKKyAgICAgICAgICAgICAgICAgICBzdGFydCA8IHBpeGVsX3dlaWdodHMubV9TcmNFbmQgJiYKKyAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kIDwgZW5kKSB7CisgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMF0gPQorICAgICAgICAgICAgICAoU0RQX1RhYmxlWzI1NiArIHdlaWdodF0gKyBTRFBfVGFibGVbd2VpZ2h0XSkgPDwgODsKKyAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1sxXSA9IFNEUF9UYWJsZVsyNTYgLSB3ZWlnaHRdIDw8IDg7CisgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMl0gPSBTRFBfVGFibGVbNTEyIC0gd2VpZ2h0XSA8PCA4OworICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSBlbmQ7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhcnQgPCBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgJiYKKyAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPCBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kICYmCisgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9PSBlbmQpIHsKKyAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9IFNEUF9UYWJsZVsyNTYgKyB3ZWlnaHRdIDw8IDg7CisgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMV0gPSBTRFBfVGFibGVbd2VpZ2h0XSA8PCA4OworICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzJdID0KKyAgICAgICAgICAgICAgKFNEUF9UYWJsZVsyNTYgLSB3ZWlnaHRdICsgU0RQX1RhYmxlWzUxMiAtIHdlaWdodF0pIDw8IDg7CisgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gc3RhcnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMF0gPSBTRFBfVGFibGVbMjU2ICsgd2VpZ2h0XSA8PCA4OworICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzFdID0gU0RQX1RhYmxlW3dlaWdodF0gPDwgODsKKyAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1syXSA9IFNEUF9UYWJsZVsyNTYgLSB3ZWlnaHRdIDw8IDg7CisgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbM10gPSBTRFBfVGFibGVbNTEyIC0gd2VpZ2h0XSA8PCA4OworICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9IHN0YXJ0OworICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSBlbmQ7CiAgICAgICAgIH0KLSAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gc3RhcnRfaTsKLSAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9IGVuZF9pOwotICAgICAgICBmb3IgKGludCBqID0gc3RhcnRfaTsgaiA8PSBlbmRfaTsgaiArKykgewotICAgICAgICAgICAgZG91YmxlIGRlc3Rfc3RhcnQgPSBGWFNZU19EaXYoKEZYX0ZMT0FUKShqKSAtIGJhc2UsIHNjYWxlKTsKLSAgICAgICAgICAgIGRvdWJsZSBkZXN0X2VuZCA9IEZYU1lTX0RpdigoRlhfRkxPQVQpKGogKyAxKSAtIGJhc2UsIHNjYWxlKTsKLSAgICAgICAgICAgIGlmIChkZXN0X3N0YXJ0ID4gZGVzdF9lbmQpIHsKLSAgICAgICAgICAgICAgICBkb3VibGUgdGVtcCA9IGRlc3Rfc3RhcnQ7Ci0gICAgICAgICAgICAgICAgZGVzdF9zdGFydCA9IGRlc3RfZW5kOwotICAgICAgICAgICAgICAgIGRlc3RfZW5kID0gdGVtcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRvdWJsZSBhcmVhX3N0YXJ0ID0gZGVzdF9zdGFydCA+IChGWF9GTE9BVCkoZGVzdF9waXhlbCkgPyBkZXN0X3N0YXJ0IDogKEZYX0ZMT0FUKShkZXN0X3BpeGVsKTsKLSAgICAgICAgICAgIGRvdWJsZSBhcmVhX2VuZCA9IGRlc3RfZW5kID4gKEZYX0ZMT0FUKShkZXN0X3BpeGVsICsgMSkgPyAoRlhfRkxPQVQpKGRlc3RfcGl4ZWwgKyAxKSA6IGRlc3RfZW5kOwotICAgICAgICAgICAgZG91YmxlIHdlaWdodCA9IGFyZWFfc3RhcnQgPj0gYXJlYV9lbmQgPyAwLjBmIDogYXJlYV9lbmQgLSBhcmVhX3N0YXJ0OwotICAgICAgICAgICAgaWYgKHdlaWdodCA9PSAwICYmIGogPT0gZW5kX2kpIHsKLSAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kIC0tOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbaiAtIHN0YXJ0X2ldID0gRlhTWVNfcm91bmQoKEZYX0ZMT0FUKSh3ZWlnaHQgKiA2NTUzNikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9CisgICAgICAgICAgICAoaW50KUZYU1lTX2Zsb29yKChGWF9GTE9BVClzcmNfcG9zKTsKKyAgICAgICAgaWYgKHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA8IHNyY19taW4pIHsKKyAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPSBzcmNfbWluOwogICAgICAgICB9CisgICAgICAgIGlmIChwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID49IHNyY19tYXgpIHsKKyAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gc3JjX21heCAtIDE7CisgICAgICAgIH0KKyAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMF0gPSA2NTUzNjsKKyAgICAgIH0KICAgICB9CisgICAgcmV0dXJuOworICB9CisgIGZvciAoaW50IGRlc3RfcGl4ZWwgPSBkZXN0X21pbjsgZGVzdF9waXhlbCA8IGRlc3RfbWF4OyBkZXN0X3BpeGVsKyspIHsKKyAgICBQaXhlbFdlaWdodCYgcGl4ZWxfd2VpZ2h0cyA9ICpHZXRQaXhlbFdlaWdodChkZXN0X3BpeGVsKTsKKyAgICBkb3VibGUgc3JjX3N0YXJ0ID0gZGVzdF9waXhlbCAqIHNjYWxlICsgYmFzZTsKKyAgICBkb3VibGUgc3JjX2VuZCA9IHNyY19zdGFydCArIHNjYWxlOworICAgIGludCBzdGFydF9pLCBlbmRfaTsKKyAgICBpZiAoc3JjX3N0YXJ0IDwgc3JjX2VuZCkgeworICAgICAgc3RhcnRfaSA9IChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY19zdGFydCk7CisgICAgICBlbmRfaSA9IChpbnQpRlhTWVNfY2VpbCgoRlhfRkxPQVQpc3JjX2VuZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0YXJ0X2kgPSAoaW50KUZYU1lTX2Zsb29yKChGWF9GTE9BVClzcmNfZW5kKTsKKyAgICAgIGVuZF9pID0gKGludClGWFNZU19jZWlsKChGWF9GTE9BVClzcmNfc3RhcnQpOworICAgIH0KKyAgICBpZiAoc3RhcnRfaSA8IHNyY19taW4pIHsKKyAgICAgIHN0YXJ0X2kgPSBzcmNfbWluOworICAgIH0KKyAgICBpZiAoZW5kX2kgPj0gc3JjX21heCkgeworICAgICAgZW5kX2kgPSBzcmNfbWF4IC0gMTsKKyAgICB9CisgICAgaWYgKHN0YXJ0X2kgPiBlbmRfaSkgeworICAgICAgaWYgKHN0YXJ0X2kgPj0gc3JjX21heCkgeworICAgICAgICBzdGFydF9pID0gc3JjX21heCAtIDE7CisgICAgICB9CisgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPSBzdGFydF9pOworICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9IHN0YXJ0X2k7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gc3RhcnRfaTsKKyAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gZW5kX2k7CisgICAgZm9yIChpbnQgaiA9IHN0YXJ0X2k7IGogPD0gZW5kX2k7IGorKykgeworICAgICAgZG91YmxlIGRlc3Rfc3RhcnQgPSBGWFNZU19EaXYoKEZYX0ZMT0FUKShqKS1iYXNlLCBzY2FsZSk7CisgICAgICBkb3VibGUgZGVzdF9lbmQgPSBGWFNZU19EaXYoKEZYX0ZMT0FUKShqICsgMSkgLSBiYXNlLCBzY2FsZSk7CisgICAgICBpZiAoZGVzdF9zdGFydCA+IGRlc3RfZW5kKSB7CisgICAgICAgIGRvdWJsZSB0ZW1wID0gZGVzdF9zdGFydDsKKyAgICAgICAgZGVzdF9zdGFydCA9IGRlc3RfZW5kOworICAgICAgICBkZXN0X2VuZCA9IHRlbXA7CisgICAgICB9CisgICAgICBkb3VibGUgYXJlYV9zdGFydCA9IGRlc3Rfc3RhcnQgPiAoRlhfRkxPQVQpKGRlc3RfcGl4ZWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRlc3Rfc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKEZYX0ZMT0FUKShkZXN0X3BpeGVsKTsKKyAgICAgIGRvdWJsZSBhcmVhX2VuZCA9IGRlc3RfZW5kID4gKEZYX0ZMT0FUKShkZXN0X3BpeGVsICsgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChGWF9GTE9BVCkoZGVzdF9waXhlbCArIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZXN0X2VuZDsKKyAgICAgIGRvdWJsZSB3ZWlnaHQgPSBhcmVhX3N0YXJ0ID49IGFyZWFfZW5kID8gMC4wZiA6IGFyZWFfZW5kIC0gYXJlYV9zdGFydDsKKyAgICAgIGlmICh3ZWlnaHQgPT0gMCAmJiBqID09IGVuZF9pKSB7CisgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQtLTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1tqIC0gc3RhcnRfaV0gPQorICAgICAgICAgIEZYU1lTX3JvdW5kKChGWF9GTE9BVCkod2VpZ2h0ICogNjU1MzYpKTsKKyAgICB9CisgIH0KIH0KLUNTdHJldGNoRW5naW5lOjpDU3RyZXRjaEVuZ2luZShJRlhfU2NhbmxpbmVDb21wb3NlciogcERlc3RCaXRtYXAsIEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUJiBjbGlwX3JlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwgaW50IGZsYWdzKQotewotICAgIG1fU3RhdGUgPSAwOwotICAgIG1fRGVzdEZvcm1hdCA9IGRlc3RfZm9ybWF0OwotICAgIG1fRGVzdEJwcCA9IGRlc3RfZm9ybWF0ICYgMHhmZjsKLSAgICBtX1NyY0JwcCA9IHBTcmNCaXRtYXAtPkdldEZvcm1hdCgpICYgMHhmZjsKLSAgICBtX2JIYXNBbHBoYSA9IHBTcmNCaXRtYXAtPkdldEZvcm1hdCgpICYgMHgyMDA7Ci0gICAgbV9wU3JjUGFsZXR0ZSA9IHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKTsKLSAgICBtX3BEZXN0Qml0bWFwID0gcERlc3RCaXRtYXA7Ci0gICAgbV9EZXN0V2lkdGggPSBkZXN0X3dpZHRoOwotICAgIG1fRGVzdEhlaWdodCA9IGRlc3RfaGVpZ2h0OwotICAgIG1fcEludGVyQnVmID0gTlVMTDsKLSAgICBtX3BFeHRyYUFscGhhQnVmID0gTlVMTDsKLSAgICBtX3BEZXN0TWFza1NjYW5saW5lID0gTlVMTDsKLSAgICBtX0Rlc3RDbGlwID0gY2xpcF9yZWN0OwotICAgIEZYX0RXT1JEIHNpemUgPSBjbGlwX3JlY3QuV2lkdGgoKTsKLSAgICBpZiAoc2l6ZSAmJiBtX0Rlc3RCcHAgPiAoaW50KShJTlRfTUFYIC8gc2l6ZSkpIHsKLSAgICAgICAgcmV0dXJuOworQ1N0cmV0Y2hFbmdpbmU6OkNTdHJldGNoRW5naW5lKElGWF9TY2FubGluZUNvbXBvc2VyKiBwRGVzdEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QmIGNsaXBfcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykgeworICBtX1N0YXRlID0gMDsKKyAgbV9EZXN0Rm9ybWF0ID0gZGVzdF9mb3JtYXQ7CisgIG1fRGVzdEJwcCA9IGRlc3RfZm9ybWF0ICYgMHhmZjsKKyAgbV9TcmNCcHAgPSBwU3JjQml0bWFwLT5HZXRGb3JtYXQoKSAmIDB4ZmY7CisgIG1fYkhhc0FscGhhID0gcFNyY0JpdG1hcC0+R2V0Rm9ybWF0KCkgJiAweDIwMDsKKyAgbV9wU3JjUGFsZXR0ZSA9IHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKTsKKyAgbV9wRGVzdEJpdG1hcCA9IHBEZXN0Qml0bWFwOworICBtX0Rlc3RXaWR0aCA9IGRlc3Rfd2lkdGg7CisgIG1fRGVzdEhlaWdodCA9IGRlc3RfaGVpZ2h0OworICBtX3BJbnRlckJ1ZiA9IE5VTEw7CisgIG1fcEV4dHJhQWxwaGFCdWYgPSBOVUxMOworICBtX3BEZXN0TWFza1NjYW5saW5lID0gTlVMTDsKKyAgbV9EZXN0Q2xpcCA9IGNsaXBfcmVjdDsKKyAgRlhfRFdPUkQgc2l6ZSA9IGNsaXBfcmVjdC5XaWR0aCgpOworICBpZiAoc2l6ZSAmJiBtX0Rlc3RCcHAgPiAoaW50KShJTlRfTUFYIC8gc2l6ZSkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgc2l6ZSAqPSBtX0Rlc3RCcHA7CisgIGlmIChzaXplID4gSU5UX01BWCAtIDMxKSB7CisgICAgcmV0dXJuOworICB9CisgIHNpemUgKz0gMzE7CisgIHNpemUgPSBzaXplIC8gMzIgKiA0OworICBtX3BEZXN0U2NhbmxpbmUgPSBGWF9UcnlBbGxvYyh1aW50OF90LCBzaXplKTsKKyAgaWYgKCFtX3BEZXN0U2NhbmxpbmUpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGRlc3RfZm9ybWF0ID09IEZYRElCX1JnYjMyKSB7CisgICAgRlhTWVNfbWVtc2V0KG1fcERlc3RTY2FubGluZSwgMjU1LCBzaXplKTsKKyAgfQorICBtX0ludGVyUGl0Y2ggPSAobV9EZXN0Q2xpcC5XaWR0aCgpICogbV9EZXN0QnBwICsgMzEpIC8gMzIgKiA0OworICBtX0V4dHJhTWFza1BpdGNoID0gKG1fRGVzdENsaXAuV2lkdGgoKSAqIDggKyAzMSkgLyAzMiAqIDQ7CisgIG1fcEludGVyQnVmID0gTlVMTDsKKyAgbV9wU291cmNlID0gcFNyY0JpdG1hcDsKKyAgbV9TcmNXaWR0aCA9IHBTcmNCaXRtYXAtPkdldFdpZHRoKCk7CisgIG1fU3JjSGVpZ2h0ID0gcFNyY0JpdG1hcC0+R2V0SGVpZ2h0KCk7CisgIG1fU3JjUGl0Y2ggPSAobV9TcmNXaWR0aCAqIG1fU3JjQnBwICsgMzEpIC8gMzIgKiA0OworICBpZiAoKGZsYWdzICYgRlhESUJfTk9TTU9PVEgpID09IDApIHsKKyAgICBGWF9CT09MIGJJbnRlcnBvbCA9CisgICAgICAgIGZsYWdzICYgRlhESUJfSU5URVJQT0wgfHwgZmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MOworICAgIGlmICghYkludGVycG9sICYmIEZYU1lTX2FicyhkZXN0X3dpZHRoKSAhPSAwICYmCisgICAgICAgIEZYU1lTX2FicyhkZXN0X2hlaWdodCkgPAorICAgICAgICAgICAgbV9TcmNXaWR0aCAqIG1fU3JjSGVpZ2h0ICogOCAvIEZYU1lTX2FicyhkZXN0X3dpZHRoKSkgeworICAgICAgZmxhZ3MgPSBGWERJQl9JTlRFUlBPTDsKICAgICB9Ci0gICAgc2l6ZSAqPSBtX0Rlc3RCcHA7Ci0gICAgaWYgKHNpemUgPiBJTlRfTUFYIC0gMzEpIHsKLSAgICAgICAgcmV0dXJuOworICAgIG1fRmxhZ3MgPSBmbGFnczsKKyAgfSBlbHNlIHsKKyAgICBtX0ZsYWdzID0gRlhESUJfTk9TTU9PVEg7CisgICAgaWYgKGZsYWdzICYgRlhESUJfRE9XTlNBTVBMRSkgeworICAgICAgbV9GbGFncyB8PSBGWERJQl9ET1dOU0FNUExFOwogICAgIH0KLSAgICBzaXplICs9IDMxOwotICAgIHNpemUgPSBzaXplIC8gMzIgKiA0OwotICAgIG1fcERlc3RTY2FubGluZSA9IEZYX1RyeUFsbG9jKEZYX0JZVEUsIHNpemUpOwotICAgIGlmIChtX3BEZXN0U2NhbmxpbmUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChkZXN0X2Zvcm1hdCA9PSBGWERJQl9SZ2IzMikgewotICAgICAgICBGWFNZU19tZW1zZXQ4KG1fcERlc3RTY2FubGluZSwgMjU1LCBzaXplKTsKLSAgICB9Ci0gICAgbV9JbnRlclBpdGNoID0gKG1fRGVzdENsaXAuV2lkdGgoKSAqIG1fRGVzdEJwcCArIDMxKSAvIDMyICogNDsKLSAgICBtX0V4dHJhTWFza1BpdGNoID0gKG1fRGVzdENsaXAuV2lkdGgoKSAqIDggKyAzMSkgLyAzMiAqIDQ7Ci0gICAgbV9wSW50ZXJCdWYgPSBOVUxMOwotICAgIG1fcFNvdXJjZSA9IHBTcmNCaXRtYXA7Ci0gICAgbV9TcmNXaWR0aCA9IHBTcmNCaXRtYXAtPkdldFdpZHRoKCk7Ci0gICAgbV9TcmNIZWlnaHQgPSBwU3JjQml0bWFwLT5HZXRIZWlnaHQoKTsKLSAgICBtX1NyY1BpdGNoID0gKG1fU3JjV2lkdGggKiBtX1NyY0JwcCArIDMxKSAvIDMyICogNDsKLSAgICBpZiAoKGZsYWdzICYgRlhESUJfTk9TTU9PVEgpID09IDApIHsKLSAgICAgICAgRlhfQk9PTCBiSW50ZXJwb2wgPSBmbGFncyAmIEZYRElCX0lOVEVSUE9MIHx8IGZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTDsKLSAgICAgICAgaWYgKCFiSW50ZXJwb2wgJiYgRlhTWVNfYWJzKGRlc3Rfd2lkdGgpICE9IDAgJiYgRlhTWVNfYWJzKGRlc3RfaGVpZ2h0KSA8IG1fU3JjV2lkdGggKiBtX1NyY0hlaWdodCAqIDggLyBGWFNZU19hYnMoZGVzdF93aWR0aCkpIHsKLSAgICAgICAgICAgIGZsYWdzID0gRlhESUJfSU5URVJQT0w7Ci0gICAgICAgIH0KLSAgICAgICAgbV9GbGFncyA9IGZsYWdzOworICB9CisgIGRvdWJsZSBzY2FsZV94ID0gRlhTWVNfRGl2KChGWF9GTE9BVCkobV9TcmNXaWR0aCksIChGWF9GTE9BVCkobV9EZXN0V2lkdGgpKTsKKyAgZG91YmxlIHNjYWxlX3kgPSBGWFNZU19EaXYoKEZYX0ZMT0FUKShtX1NyY0hlaWdodCksIChGWF9GTE9BVCkobV9EZXN0SGVpZ2h0KSk7CisgIGRvdWJsZSBiYXNlX3ggPSBtX0Rlc3RXaWR0aCA+IDAgPyAwLjBmIDogKEZYX0ZMT0FUKShtX0Rlc3RXaWR0aCk7CisgIGRvdWJsZSBiYXNlX3kgPSBtX0Rlc3RIZWlnaHQgPiAwID8gMC4wZiA6IChGWF9GTE9BVCkobV9EZXN0SGVpZ2h0KTsKKyAgZG91YmxlIHNyY19sZWZ0ID0gRlhTWVNfTXVsKHNjYWxlX3gsIChGWF9GTE9BVCkoY2xpcF9yZWN0LmxlZnQpICsgYmFzZV94KTsKKyAgZG91YmxlIHNyY19yaWdodCA9IEZYU1lTX011bChzY2FsZV94LCAoRlhfRkxPQVQpKGNsaXBfcmVjdC5yaWdodCkgKyBiYXNlX3gpOworICBkb3VibGUgc3JjX3RvcCA9IEZYU1lTX011bChzY2FsZV95LCAoRlhfRkxPQVQpKGNsaXBfcmVjdC50b3ApICsgYmFzZV95KTsKKyAgZG91YmxlIHNyY19ib3R0b20gPSBGWFNZU19NdWwoc2NhbGVfeSwgKEZYX0ZMT0FUKShjbGlwX3JlY3QuYm90dG9tKSArIGJhc2VfeSk7CisgIGlmIChzcmNfbGVmdCA+IHNyY19yaWdodCkgeworICAgIGRvdWJsZSB0ZW1wID0gc3JjX2xlZnQ7CisgICAgc3JjX2xlZnQgPSBzcmNfcmlnaHQ7CisgICAgc3JjX3JpZ2h0ID0gdGVtcDsKKyAgfQorICBpZiAoc3JjX3RvcCA+IHNyY19ib3R0b20pIHsKKyAgICBkb3VibGUgdGVtcCA9IHNyY190b3A7CisgICAgc3JjX3RvcCA9IHNyY19ib3R0b207CisgICAgc3JjX2JvdHRvbSA9IHRlbXA7CisgIH0KKyAgbV9TcmNDbGlwLmxlZnQgPSAoaW50KUZYU1lTX2Zsb29yKChGWF9GTE9BVClzcmNfbGVmdCk7CisgIG1fU3JjQ2xpcC5yaWdodCA9IChpbnQpRlhTWVNfY2VpbCgoRlhfRkxPQVQpc3JjX3JpZ2h0KTsKKyAgbV9TcmNDbGlwLnRvcCA9IChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY190b3ApOworICBtX1NyY0NsaXAuYm90dG9tID0gKGludClGWFNZU19jZWlsKChGWF9GTE9BVClzcmNfYm90dG9tKTsKKyAgRlhfUkVDVCBzcmNfcmVjdCgwLCAwLCBtX1NyY1dpZHRoLCBtX1NyY0hlaWdodCk7CisgIG1fU3JjQ2xpcC5JbnRlcnNlY3Qoc3JjX3JlY3QpOworICBpZiAobV9TcmNCcHAgPT0gMSkgeworICAgIGlmIChtX0Rlc3RCcHAgPT0gOCkgeworICAgICAgbV9UcmFuc01ldGhvZCA9IDE7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbV9GbGFncyA9IEZYRElCX05PU01PT1RIOwotICAgICAgICBpZiAoZmxhZ3MgJiBGWERJQl9ET1dOU0FNUExFKSB7Ci0gICAgICAgICAgICBtX0ZsYWdzIHw9IEZYRElCX0RPV05TQU1QTEU7Ci0gICAgICAgIH0KKyAgICAgIG1fVHJhbnNNZXRob2QgPSAyOwogICAgIH0KLSAgICBkb3VibGUgc2NhbGVfeCA9IEZYU1lTX0RpdigoRlhfRkxPQVQpKG1fU3JjV2lkdGgpLCAoRlhfRkxPQVQpKG1fRGVzdFdpZHRoKSk7Ci0gICAgZG91YmxlIHNjYWxlX3kgPSBGWFNZU19EaXYoKEZYX0ZMT0FUKShtX1NyY0hlaWdodCksIChGWF9GTE9BVCkobV9EZXN0SGVpZ2h0KSk7Ci0gICAgZG91YmxlIGJhc2VfeCA9IG1fRGVzdFdpZHRoID4gMCA/IDAuMGYgOiAoRlhfRkxPQVQpKG1fRGVzdFdpZHRoKTsKLSAgICBkb3VibGUgYmFzZV95ID0gbV9EZXN0SGVpZ2h0ID4gMCA/IDAuMGYgOiAoRlhfRkxPQVQpKG1fRGVzdEhlaWdodCk7Ci0gICAgZG91YmxlIHNyY19sZWZ0ID0gRlhTWVNfTXVsKHNjYWxlX3gsIChGWF9GTE9BVCkoY2xpcF9yZWN0LmxlZnQpICsgYmFzZV94KTsKLSAgICBkb3VibGUgc3JjX3JpZ2h0ID0gRlhTWVNfTXVsKHNjYWxlX3gsIChGWF9GTE9BVCkoY2xpcF9yZWN0LnJpZ2h0KSArIGJhc2VfeCk7Ci0gICAgZG91YmxlIHNyY190b3AgPSBGWFNZU19NdWwoc2NhbGVfeSwgKEZYX0ZMT0FUKShjbGlwX3JlY3QudG9wKSArIGJhc2VfeSk7Ci0gICAgZG91YmxlIHNyY19ib3R0b20gPSBGWFNZU19NdWwoc2NhbGVfeSwgKEZYX0ZMT0FUKShjbGlwX3JlY3QuYm90dG9tKSArIGJhc2VfeSk7Ci0gICAgaWYgKHNyY19sZWZ0ID4gc3JjX3JpZ2h0KSB7Ci0gICAgICAgIGRvdWJsZSB0ZW1wID0gc3JjX2xlZnQ7Ci0gICAgICAgIHNyY19sZWZ0ID0gc3JjX3JpZ2h0OwotICAgICAgICBzcmNfcmlnaHQgPSB0ZW1wOwotICAgIH0KLSAgICBpZiAoc3JjX3RvcCA+IHNyY19ib3R0b20pIHsKLSAgICAgICAgZG91YmxlIHRlbXAgPSBzcmNfdG9wOwotICAgICAgICBzcmNfdG9wID0gc3JjX2JvdHRvbTsKLSAgICAgICAgc3JjX2JvdHRvbSA9IHRlbXA7Ci0gICAgfQotICAgIG1fU3JjQ2xpcC5sZWZ0ID0gKGludClGWFNZU19mbG9vcigoRlhfRkxPQVQpc3JjX2xlZnQpOwotICAgIG1fU3JjQ2xpcC5yaWdodCA9IChpbnQpRlhTWVNfY2VpbCgoRlhfRkxPQVQpc3JjX3JpZ2h0KTsKLSAgICBtX1NyY0NsaXAudG9wID0gKGludClGWFNZU19mbG9vcigoRlhfRkxPQVQpc3JjX3RvcCk7Ci0gICAgbV9TcmNDbGlwLmJvdHRvbSA9IChpbnQpRlhTWVNfY2VpbCgoRlhfRkxPQVQpc3JjX2JvdHRvbSk7Ci0gICAgRlhfUkVDVCBzcmNfcmVjdCgwLCAwLCBtX1NyY1dpZHRoLCBtX1NyY0hlaWdodCk7Ci0gICAgbV9TcmNDbGlwLkludGVyc2VjdChzcmNfcmVjdCk7Ci0gICAgaWYgKG1fU3JjQnBwID09IDEpIHsKLSAgICAgICAgaWYgKG1fRGVzdEJwcCA9PSA4KSB7Ci0gICAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSAyOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtX1NyY0JwcCA9PSA4KSB7Ci0gICAgICAgIGlmIChtX0Rlc3RCcHAgPT0gOCkgewotICAgICAgICAgICAgaWYgKCFtX2JIYXNBbHBoYSkgewotICAgICAgICAgICAgICAgIG1fVHJhbnNNZXRob2QgPSAzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghbV9iSGFzQWxwaGEpIHsKLSAgICAgICAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gNTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgfSBlbHNlIGlmIChtX1NyY0JwcCA9PSA4KSB7CisgICAgaWYgKG1fRGVzdEJwcCA9PSA4KSB7CisgICAgICBpZiAoIW1fYkhhc0FscGhhKSB7CisgICAgICAgIG1fVHJhbnNNZXRob2QgPSAzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbV9UcmFuc01ldGhvZCA9IDQ7CisgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFtX2JIYXNBbHBoYSkgewotICAgICAgICAgICAgbV9UcmFuc01ldGhvZCA9IDc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX1RyYW5zTWV0aG9kID0gODsKLSAgICAgICAgfQorICAgICAgaWYgKCFtX2JIYXNBbHBoYSkgeworICAgICAgICBtX1RyYW5zTWV0aG9kID0gNTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fVHJhbnNNZXRob2QgPSA2OworICAgICAgfQogICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoIW1fYkhhc0FscGhhKSB7CisgICAgICBtX1RyYW5zTWV0aG9kID0gNzsKKyAgICB9IGVsc2UgeworICAgICAgbV9UcmFuc01ldGhvZCA9IDg7CisgICAgfQorICB9CiB9Ci1GWF9CT09MIENTdHJldGNoRW5naW5lOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICB3aGlsZSAobV9TdGF0ZSA9PSAxKSB7Ci0gICAgICAgIGlmIChDb250aW51ZVN0cmV0Y2hIb3J6KHBQYXVzZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIG1fU3RhdGUgPSAyOwotICAgICAgICBTdHJldGNoVmVydCgpOworRlhfQk9PTCBDU3RyZXRjaEVuZ2luZTo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgd2hpbGUgKG1fU3RhdGUgPT0gMSkgeworICAgIGlmIChDb250aW51ZVN0cmV0Y2hIb3J6KHBQYXVzZSkpIHsKKyAgICAgIHJldHVybiBUUlVFOwogICAgIH0KKyAgICBtX1N0YXRlID0gMjsKKyAgICBTdHJldGNoVmVydCgpOworICB9CisgIHJldHVybiBGQUxTRTsKK30KK0NTdHJldGNoRW5naW5lOjp+Q1N0cmV0Y2hFbmdpbmUoKSB7CisgIEZYX0ZyZWUobV9wRGVzdFNjYW5saW5lKTsKKyAgRlhfRnJlZShtX3BJbnRlckJ1Zik7CisgIEZYX0ZyZWUobV9wRXh0cmFBbHBoYUJ1Zik7CisgIEZYX0ZyZWUobV9wRGVzdE1hc2tTY2FubGluZSk7Cit9CitGWF9CT09MIENTdHJldGNoRW5naW5lOjpTdGFydFN0cmV0Y2hIb3J6KCkgeworICBpZiAobV9EZXN0V2lkdGggPT0gMCB8fCAhbV9wRGVzdFNjYW5saW5lIHx8CisgICAgICBtX1NyY0NsaXAuSGVpZ2h0KCkgPiAoaW50KSgoMVUgPDwgMjkpIC8gbV9JbnRlclBpdGNoKSB8fAorICAgICAgbV9TcmNDbGlwLkhlaWdodCgpID09IDApIHsKICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9wSW50ZXJCdWYgPSBGWF9UcnlBbGxvYyh1bnNpZ25lZCBjaGFyLCBtX1NyY0NsaXAuSGVpZ2h0KCkgKiBtX0ludGVyUGl0Y2gpOworICBpZiAoIW1fcEludGVyQnVmKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX3BTb3VyY2UgJiYgbV9iSGFzQWxwaGEgJiYgbV9wU291cmNlLT5tX3BBbHBoYU1hc2spIHsKKyAgICBtX3BFeHRyYUFscGhhQnVmID0KKyAgICAgICAgRlhfQWxsb2MyRCh1bnNpZ25lZCBjaGFyLCBtX1NyY0NsaXAuSGVpZ2h0KCksIG1fRXh0cmFNYXNrUGl0Y2gpOworICAgIEZYX0RXT1JEIHNpemUgPSAobV9EZXN0Q2xpcC5XaWR0aCgpICogOCArIDMxKSAvIDMyICogNDsKKyAgICBtX3BEZXN0TWFza1NjYW5saW5lID0gRlhfVHJ5QWxsb2ModW5zaWduZWQgY2hhciwgc2l6ZSk7CisgICAgaWYgKCFtX3BEZXN0TWFza1NjYW5saW5lKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CisgIG1fV2VpZ2h0VGFibGUuQ2FsYyhtX0Rlc3RXaWR0aCwgbV9EZXN0Q2xpcC5sZWZ0LCBtX0Rlc3RDbGlwLnJpZ2h0LCBtX1NyY1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgbV9TcmNDbGlwLmxlZnQsIG1fU3JjQ2xpcC5yaWdodCwgbV9GbGFncyk7CisgIGlmICghbV9XZWlnaHRUYWJsZS5tX3BXZWlnaHRUYWJsZXMpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9DdXJSb3cgPSBtX1NyY0NsaXAudG9wOworICBtX1N0YXRlID0gMTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci1DU3RyZXRjaEVuZ2luZTo6fkNTdHJldGNoRW5naW5lKCkKLXsKLSAgICBpZiAobV9wRGVzdFNjYW5saW5lKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wRGVzdFNjYW5saW5lKTsKLSAgICB9Ci0gICAgaWYgKG1fcEludGVyQnVmKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wSW50ZXJCdWYpOwotICAgIH0KLSAgICBpZiAobV9wRXh0cmFBbHBoYUJ1ZikgewotICAgICAgICBGWF9GcmVlKG1fcEV4dHJhQWxwaGFCdWYpOwotICAgIH0KLSAgICBpZiAobV9wRGVzdE1hc2tTY2FubGluZSkgewotICAgICAgICBGWF9GcmVlKG1fcERlc3RNYXNrU2NhbmxpbmUpOwotICAgIH0KLX0KLUZYX0JPT0wgQ1N0cmV0Y2hFbmdpbmU6OlN0YXJ0U3RyZXRjaEhvcnooKQotewotICAgIGlmIChtX0Rlc3RXaWR0aCA9PSAwIHx8IG1fcERlc3RTY2FubGluZSA9PSBOVUxMIHx8IG1fU3JjQ2xpcC5IZWlnaHQoKSA+IChpbnQpKCgxVSA8PCAyOSkgLyBtX0ludGVyUGl0Y2gpIHx8IG1fU3JjQ2xpcC5IZWlnaHQoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9wSW50ZXJCdWYgPSBGWF9UcnlBbGxvYyh1bnNpZ25lZCBjaGFyLCBtX1NyY0NsaXAuSGVpZ2h0KCkgKiBtX0ludGVyUGl0Y2gpOwotICAgIGlmIChtX3BJbnRlckJ1ZiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG1fcFNvdXJjZSAmJiBtX2JIYXNBbHBoYSAmJiBtX3BTb3VyY2UtPm1fcEFscGhhTWFzaykgewotICAgICAgICBtX3BFeHRyYUFscGhhQnVmID0gRlhfQWxsb2MyRCh1bnNpZ25lZCBjaGFyLCBtX1NyY0NsaXAuSGVpZ2h0KCksIG1fRXh0cmFNYXNrUGl0Y2gpOwotICAgICAgICBGWF9EV09SRCBzaXplID0gKG1fRGVzdENsaXAuV2lkdGgoKSAqIDggKyAzMSkgLyAzMiAqIDQ7Ci0gICAgICAgIG1fcERlc3RNYXNrU2NhbmxpbmUgPSBGWF9UcnlBbGxvYyh1bnNpZ25lZCBjaGFyLCBzaXplKTsKLSAgICAgICAgaWYgKCFtX3BEZXN0TWFza1NjYW5saW5lKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9XZWlnaHRUYWJsZS5DYWxjKG1fRGVzdFdpZHRoLCBtX0Rlc3RDbGlwLmxlZnQsIG1fRGVzdENsaXAucmlnaHQsIG1fU3JjV2lkdGgsIG1fU3JjQ2xpcC5sZWZ0LCBtX1NyY0NsaXAucmlnaHQsIG1fRmxhZ3MpOwotICAgIGlmIChtX1dlaWdodFRhYmxlLm1fcFdlaWdodFRhYmxlcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9DdXJSb3cgPSBtX1NyY0NsaXAudG9wOwotICAgIG1fU3RhdGUgPSAxOworI2RlZmluZSBGWF9TVFJFQ0hfUEFVU0VfUk9XUyAxMAorRlhfQk9PTCBDU3RyZXRjaEVuZ2luZTo6Q29udGludWVTdHJldGNoSG9yeihJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpZiAoIW1fRGVzdFdpZHRoKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKG1fcFNvdXJjZS0+U2tpcFRvU2NhbmxpbmUobV9DdXJSb3csIHBQYXVzZSkpIHsKICAgICByZXR1cm4gVFJVRTsKLX0KLSNkZWZpbmUgRlhfU1RSRUNIX1BBVVNFX1JPV1MJMTAKLUZYX0JPT0wgQ1N0cmV0Y2hFbmdpbmU6OkNvbnRpbnVlU3RyZXRjaEhvcnooSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgaWYgKCFtX0Rlc3RXaWR0aCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKG1fcFNvdXJjZS0+U2tpcFRvU2NhbmxpbmUobV9DdXJSb3csIHBQYXVzZSkpIHsKKyAgfQorICBpbnQgQnBwID0gbV9EZXN0QnBwIC8gODsKKyAgaW50IHJvd3NfdG9fZ28gPSBGWF9TVFJFQ0hfUEFVU0VfUk9XUzsKKyAgZm9yICg7IG1fQ3VyUm93IDwgbV9TcmNDbGlwLmJvdHRvbTsgbV9DdXJSb3crKykgeworICAgIGlmIChyb3dzX3RvX2dvID09IDApIHsKKyAgICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7CiAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQorICAgICAgcm93c190b19nbyA9IEZYX1NUUkVDSF9QQVVTRV9ST1dTOwogICAgIH0KLSAgICBpbnQgQnBwID0gbV9EZXN0QnBwIC8gODsKLSAgICBpbnQgcm93c190b19nbyA9IEZYX1NUUkVDSF9QQVVTRV9ST1dTOwotICAgIGZvciAoOyBtX0N1clJvdyA8IG1fU3JjQ2xpcC5ib3R0b207IG1fQ3VyUm93ICsrKSB7Ci0gICAgICAgIGlmIChyb3dzX3RvX2dvID09IDApIHsKLSAgICAgICAgICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJvd3NfdG9fZ28gPSBGWF9TVFJFQ0hfUEFVU0VfUk9XUzsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IG1fcFNvdXJjZS0+R2V0U2NhbmxpbmUobV9DdXJSb3cpOworICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9CisgICAgICAgIG1fcEludGVyQnVmICsgKG1fQ3VyUm93IC0gbV9TcmNDbGlwLnRvcCkgKiBtX0ludGVyUGl0Y2g7CisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW5fbWFzayA9IE5VTEw7CisgICAgdWludDhfdCogZGVzdF9zY2FuX21hc2sgPSBOVUxMOworICAgIGlmIChtX3BFeHRyYUFscGhhQnVmKSB7CisgICAgICBzcmNfc2Nhbl9tYXNrID0gbV9wU291cmNlLT5tX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKG1fQ3VyUm93KTsKKyAgICAgIGRlc3Rfc2Nhbl9tYXNrID0KKyAgICAgICAgICBtX3BFeHRyYUFscGhhQnVmICsgKG1fQ3VyUm93IC0gbV9TcmNDbGlwLnRvcCkgKiBtX0V4dHJhTWFza1BpdGNoOworICAgIH0KKyAgICBzd2l0Y2ggKG1fVHJhbnNNZXRob2QpIHsKKyAgICAgIGNhc2UgMToKKyAgICAgIGNhc2UgMjogeworICAgICAgICBmb3IgKGludCBjb2wgPSBtX0Rlc3RDbGlwLmxlZnQ7IGNvbCA8IG1fRGVzdENsaXAucmlnaHQ7IGNvbCsrKSB7CisgICAgICAgICAgUGl4ZWxXZWlnaHQqIHBQaXhlbFdlaWdodHMgPSBtX1dlaWdodFRhYmxlLkdldFBpeGVsV2VpZ2h0KGNvbCk7CisgICAgICAgICAgaW50IGRlc3RfYSA9IDA7CisgICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7CisgICAgICAgICAgICAgICBqKyspIHsKKyAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPQorICAgICAgICAgICAgICAgIHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1tqIC0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydF07CisgICAgICAgICAgICBpZiAoc3JjX3NjYW5baiAvIDhdICYgKDEgPDwgKDcgLSBqICUgOCkpKSB7CisgICAgICAgICAgICAgIGRlc3RfYSArPSBwaXhlbF93ZWlnaHQgKiAyNTU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgeworICAgICAgICAgICAgZGVzdF9hID0gZGVzdF9hIDwgMCA/IDAgOiBkZXN0X2EgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9hOworICAgICAgICAgIH0KKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCkoZGVzdF9hID4+IDE2KTsKICAgICAgICAgfQotICAgICAgICBGWF9MUENCWVRFIHNyY19zY2FuID0gbV9wU291cmNlLT5HZXRTY2FubGluZShtX0N1clJvdyk7Ci0gICAgICAgIEZYX0xQQllURSBkZXN0X3NjYW4gPSBtX3BJbnRlckJ1ZiArIChtX0N1clJvdyAtIG1fU3JjQ2xpcC50b3ApICogbV9JbnRlclBpdGNoOwotICAgICAgICBGWF9MUENCWVRFIHNyY19zY2FuX21hc2sgPSBOVUxMOwotICAgICAgICBGWF9MUEJZVEUgZGVzdF9zY2FuX21hc2sgPSBOVUxMOwotICAgICAgICBpZiAobV9wRXh0cmFBbHBoYUJ1ZikgewotICAgICAgICAgICAgc3JjX3NjYW5fbWFzayA9IG1fcFNvdXJjZS0+bV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShtX0N1clJvdyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW5fbWFzayA9IG1fcEV4dHJhQWxwaGFCdWYgKyAobV9DdXJSb3cgLSBtX1NyY0NsaXAudG9wKSAqIG1fRXh0cmFNYXNrUGl0Y2g7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAzOiB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgY29sKyspIHsKKyAgICAgICAgICBQaXhlbFdlaWdodCogcFBpeGVsV2VpZ2h0cyA9IG1fV2VpZ2h0VGFibGUuR2V0UGl4ZWxXZWlnaHQoY29sKTsKKyAgICAgICAgICBpbnQgZGVzdF9hID0gMDsKKyAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsKKyAgICAgICAgICAgICAgIGorKykgeworICAgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9CisgICAgICAgICAgICAgICAgcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsKKyAgICAgICAgICAgIGRlc3RfYSArPSBwaXhlbF93ZWlnaHQgKiBzcmNfc2NhbltqXTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7CisgICAgICAgICAgICBkZXN0X2EgPSBkZXN0X2EgPCAwID8gMCA6IGRlc3RfYSA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2E7CisgICAgICAgICAgfQorICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KShkZXN0X2EgPj4gMTYpOwogICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAobV9UcmFuc01ldGhvZCkgewotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgY2FzZSAyOiB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQaXhlbFdlaWdodCogcFBpeGVsV2VpZ2h0cyA9IG1fV2VpZ2h0VGFibGUuR2V0UGl4ZWxXZWlnaHQoY29sKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2EgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7IGogKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX3NjYW5baiAvIDhdICYgKDEgPDwgKDcgLSBqICUgOCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYSArPSBwaXhlbF93ZWlnaHQgKiAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9hID0gZGVzdF9hIDwgMCA/IDAgOiBkZXN0X2EgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9hOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKEZYX0JZVEUpKGRlc3RfYSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAzOiB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQaXhlbFdlaWdodCogcFBpeGVsV2VpZ2h0cyA9IG1fV2VpZ2h0VGFibGUuR2V0UGl4ZWxXZWlnaHQoY29sKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2EgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7IGogKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2EgKz0gcGl4ZWxfd2VpZ2h0ICogc3JjX3NjYW5bal07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2EgPSBkZXN0X2EgPCAwID8gMCA6IGRlc3RfYSA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2E7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAoRlhfQllURSkoZGVzdF9hID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIDQ6IHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gbV9EZXN0Q2xpcC5sZWZ0OyBjb2wgPCBtX0Rlc3RDbGlwLnJpZ2h0OyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBpeGVsV2VpZ2h0KiBwUGl4ZWxXZWlnaHRzID0gbV9XZWlnaHRUYWJsZS5HZXRQaXhlbFdlaWdodChjb2wpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfYSA9IDAsIGRlc3RfciA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsgaiArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodCA9IHBpeGVsX3dlaWdodCAqIHNyY19zY2FuX21hc2tbal0gLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9yICs9IHBpeGVsX3dlaWdodCAqIHNyY19zY2FuW2pdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYSArPSBwaXhlbF93ZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3IgPSBkZXN0X3IgPCAwID8gMCA6IGRlc3RfciA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9hID0gZGVzdF9hIDwgMCA/IDAgOiBkZXN0X2EgPiA2NTUzNiA/IDY1NTM2IDogZGVzdF9hOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKEZYX0JZVEUpKGRlc3RfciA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuX21hc2srKyA9IChGWF9CWVRFKSgoZGVzdF9hICogMjU1KSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSA1OiB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQaXhlbFdlaWdodCogcFBpeGVsV2VpZ2h0cyA9IG1fV2VpZ2h0VGFibGUuR2V0UGl4ZWxXZWlnaHQoY29sKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3JfeSA9IDAsIGRlc3RfZ19tID0gMCwgZGVzdF9iX2MgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7IGogKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZ2JfY215ayA9IG1fcFNyY1BhbGV0dGVbc3JjX3NjYW5bal1dOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfUmdiKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfcl95ICs9IHBpeGVsX3dlaWdodCAqIChGWF9CWVRFKShhcmdiX2NteWsgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2dfbSArPSBwaXhlbF93ZWlnaHQgKiAoRlhfQllURSkoYXJnYl9jbXlrID4+IDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2JfYyArPSBwaXhlbF93ZWlnaHQgKiAoRlhfQllURSlhcmdiX2NteWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9iX2MgKz0gcGl4ZWxfd2VpZ2h0ICogKEZYX0JZVEUpKGFyZ2JfY215ayA+PiAyNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfZ19tICs9IHBpeGVsX3dlaWdodCAqIChGWF9CWVRFKShhcmdiX2NteWsgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3JfeSArPSBwaXhlbF93ZWlnaHQgKiAoRlhfQllURSkoYXJnYl9jbXlrID4+IDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfcl95ID0gZGVzdF9yX3kgPCAwID8gMCA6IGRlc3Rfcl95ID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3Rfcl95OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfZ19tID0gZGVzdF9nX20gPCAwID8gMCA6IGRlc3RfZ19tID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfZ19tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYl9jID0gZGVzdF9iX2MgPCAwID8gMCA6IGRlc3RfYl9jID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfYl9jOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKEZYX0JZVEUpKGRlc3RfYl9jID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IChGWF9CWVRFKShkZXN0X2dfbSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAoRlhfQllURSkoZGVzdF9yX3kgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgNjogewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSBtX0Rlc3RDbGlwLmxlZnQ7IGNvbCA8IG1fRGVzdENsaXAucmlnaHQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgUGl4ZWxXZWlnaHQqIHBQaXhlbFdlaWdodHMgPSBtX1dlaWdodFRhYmxlLkdldFBpeGVsV2VpZ2h0KGNvbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9hID0gMCwgZGVzdF9yX3kgPSAwLCBkZXN0X2dfbSA9IDAsIGRlc3RfYl9jID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOyBqICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1tqIC0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0ID0gcGl4ZWxfd2VpZ2h0ICogc3JjX3NjYW5fbWFza1tqXSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZ2JfY215ayA9IG1fcFNyY1BhbGV0dGVbc3JjX3NjYW5bal1dOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfUmdiYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3JfeSArPSBwaXhlbF93ZWlnaHQgKiAoRlhfQllURSkoYXJnYl9jbXlrID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9nX20gKz0gcGl4ZWxfd2VpZ2h0ICogKEZYX0JZVEUpKGFyZ2JfY215ayA+PiA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9iX2MgKz0gcGl4ZWxfd2VpZ2h0ICogKEZYX0JZVEUpYXJnYl9jbXlrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYl9jICs9IHBpeGVsX3dlaWdodCAqIChGWF9CWVRFKShhcmdiX2NteWsgPj4gMjQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2dfbSArPSBwaXhlbF93ZWlnaHQgKiAoRlhfQllURSkoYXJnYl9jbXlrID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9yX3kgKz0gcGl4ZWxfd2VpZ2h0ICogKEZYX0JZVEUpKGFyZ2JfY215ayA+PiA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9hICs9IHBpeGVsX3dlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYl9jID0gZGVzdF9iX2MgPCAwID8gMCA6IGRlc3RfYl9jID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfYl9jOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfZ19tID0gZGVzdF9nX20gPCAwID8gMCA6IGRlc3RfZ19tID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfZ19tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfcl95ID0gZGVzdF9yX3kgPCAwID8gMCA6IGRlc3Rfcl95ID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3Rfcl95OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYSA9IGRlc3RfYSA8IDAgPyAwIDogZGVzdF9hID4gNjU1MzYgPyA2NTUzNiA6IGRlc3RfYTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IChGWF9CWVRFKShkZXN0X2JfYyA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAoRlhfQllURSkoZGVzdF9nX20gPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKEZYX0JZVEUpKGRlc3Rfcl95ID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW5fbWFzaysrID0gKEZYX0JZVEUpKChkZXN0X2EgKiAyNTUpID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIDc6IHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gbV9EZXN0Q2xpcC5sZWZ0OyBjb2wgPCBtX0Rlc3RDbGlwLnJpZ2h0OyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBpeGVsV2VpZ2h0KiBwUGl4ZWxXZWlnaHRzID0gbV9XZWlnaHRUYWJsZS5HZXRQaXhlbFdlaWdodChjb2wpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfcl95ID0gMCwgZGVzdF9nX20gPSAwLCBkZXN0X2JfYyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsgaiArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQ0JZVEUgc3JjX3BpeGVsID0gc3JjX3NjYW4gKyBqICogQnBwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYl9jICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKyspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfZ19tICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKyspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfcl95ICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYl9jID0gZGVzdF9iX2MgPCAwID8gMCA6IGRlc3RfYl9jID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfYl9jOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfZ19tID0gZGVzdF9nX20gPCAwID8gMCA6IGRlc3RfZ19tID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfZ19tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfcl95ID0gZGVzdF9yX3kgPCAwID8gMCA6IGRlc3Rfcl95ID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3Rfcl95OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKEZYX0JZVEUpKChkZXN0X2JfYykgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKEZYX0JZVEUpKChkZXN0X2dfbSkgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKEZYX0JZVEUpKChkZXN0X3JfeSkgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcCAtIDM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSA4OiB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQaXhlbFdlaWdodCogcFBpeGVsV2VpZ2h0cyA9IG1fV2VpZ2h0VGFibGUuR2V0UGl4ZWxXZWlnaHQoY29sKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2EgPSAwLCBkZXN0X3JfeSA9IDAsIGRlc3RfZ19tID0gMCwgZGVzdF9iX2MgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7IGogKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUENCWVRFIHNyY19waXhlbCA9IHNyY19zY2FuICsgaiAqIEJwcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0ID0gcGl4ZWxfd2VpZ2h0ICogc3JjX3BpeGVsWzNdIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodCA9IHBpeGVsX3dlaWdodCAqIHNyY19zY2FuX21hc2tbal0gLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYl9jICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKyspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfZ19tICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKyspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfcl95ICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2EgKz0gcGl4ZWxfd2VpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9yX3kgPSBkZXN0X3JfeSA8IDAgPyAwIDogZGVzdF9yX3kgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9yX3k7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9nX20gPSBkZXN0X2dfbSA8IDAgPyAwIDogZGVzdF9nX20gPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9nX207Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9iX2MgPSBkZXN0X2JfYyA8IDAgPyAwIDogZGVzdF9iX2MgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9iX2M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9hID0gZGVzdF9hIDwgMCA/IDAgOiBkZXN0X2EgPiA2NTUzNiA/IDY1NTM2IDogZGVzdF9hOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKEZYX0JZVEUpKChkZXN0X2JfYykgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKEZYX0JZVEUpKChkZXN0X2dfbSkgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKEZYX0JZVEUpKChkZXN0X3JfeSkgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9BcmdiKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IChGWF9CWVRFKSgoZGVzdF9hICogMjU1KSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdF9zY2FuX21hc2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuX21hc2srKyA9IChGWF9CWVRFKSgoZGVzdF9hICogMjU1KSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwIC0gMzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSA0OiB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgY29sKyspIHsKKyAgICAgICAgICBQaXhlbFdlaWdodCogcFBpeGVsV2VpZ2h0cyA9IG1fV2VpZ2h0VGFibGUuR2V0UGl4ZWxXZWlnaHQoY29sKTsKKyAgICAgICAgICBpbnQgZGVzdF9hID0gMCwgZGVzdF9yID0gMDsKKyAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsKKyAgICAgICAgICAgICAgIGorKykgeworICAgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9CisgICAgICAgICAgICAgICAgcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsKKyAgICAgICAgICAgIHBpeGVsX3dlaWdodCA9IHBpeGVsX3dlaWdodCAqIHNyY19zY2FuX21hc2tbal0gLyAyNTU7CisgICAgICAgICAgICBkZXN0X3IgKz0gcGl4ZWxfd2VpZ2h0ICogc3JjX3NjYW5bal07CisgICAgICAgICAgICBkZXN0X2EgKz0gcGl4ZWxfd2VpZ2h0OworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKKyAgICAgICAgICAgIGRlc3RfciA9IGRlc3RfciA8IDAgPyAwIDogZGVzdF9yID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfcjsKKyAgICAgICAgICAgIGRlc3RfYSA9IGRlc3RfYSA8IDAgPyAwIDogZGVzdF9hID4gNjU1MzYgPyA2NTUzNiA6IGRlc3RfYTsKKyAgICAgICAgICB9CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpKGRlc3RfciA+PiAxNik7CisgICAgICAgICAgKmRlc3Rfc2Nhbl9tYXNrKysgPSAodWludDhfdCkoKGRlc3RfYSAqIDI1NSkgPj4gMTYpOwogICAgICAgICB9Ci0gICAgICAgIHJvd3NfdG9fZ28gLS07CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSA1OiB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgY29sKyspIHsKKyAgICAgICAgICBQaXhlbFdlaWdodCogcFBpeGVsV2VpZ2h0cyA9IG1fV2VpZ2h0VGFibGUuR2V0UGl4ZWxXZWlnaHQoY29sKTsKKyAgICAgICAgICBpbnQgZGVzdF9yX3kgPSAwLCBkZXN0X2dfbSA9IDAsIGRlc3RfYl9jID0gMDsKKyAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsKKyAgICAgICAgICAgICAgIGorKykgeworICAgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9CisgICAgICAgICAgICAgICAgcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnYl9jbXlrID0gbV9wU3JjUGFsZXR0ZVtzcmNfc2NhbltqXV07CisgICAgICAgICAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX1JnYikgeworICAgICAgICAgICAgICBkZXN0X3JfeSArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdCkoYXJnYl9jbXlrID4+IDE2KTsKKyAgICAgICAgICAgICAgZGVzdF9nX20gKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpKGFyZ2JfY215ayA+PiA4KTsKKyAgICAgICAgICAgICAgZGVzdF9iX2MgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpYXJnYl9jbXlrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZGVzdF9iX2MgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpKGFyZ2JfY215ayA+PiAyNCk7CisgICAgICAgICAgICAgIGRlc3RfZ19tICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KShhcmdiX2NteWsgPj4gMTYpOworICAgICAgICAgICAgICBkZXN0X3JfeSArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdCkoYXJnYl9jbXlrID4+IDgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKKyAgICAgICAgICAgIGRlc3Rfcl95ID0KKyAgICAgICAgICAgICAgICBkZXN0X3JfeSA8IDAgPyAwIDogZGVzdF9yX3kgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9yX3k7CisgICAgICAgICAgICBkZXN0X2dfbSA9CisgICAgICAgICAgICAgICAgZGVzdF9nX20gPCAwID8gMCA6IGRlc3RfZ19tID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfZ19tOworICAgICAgICAgICAgZGVzdF9iX2MgPQorICAgICAgICAgICAgICAgIGRlc3RfYl9jIDwgMCA/IDAgOiBkZXN0X2JfYyA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2JfYzsKKyAgICAgICAgICB9CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpKGRlc3RfYl9jID4+IDE2KTsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCkoZGVzdF9nX20gPj4gMTYpOworICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KShkZXN0X3JfeSA+PiAxNik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIDY6IHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gbV9EZXN0Q2xpcC5sZWZ0OyBjb2wgPCBtX0Rlc3RDbGlwLnJpZ2h0OyBjb2wrKykgeworICAgICAgICAgIFBpeGVsV2VpZ2h0KiBwUGl4ZWxXZWlnaHRzID0gbV9XZWlnaHRUYWJsZS5HZXRQaXhlbFdlaWdodChjb2wpOworICAgICAgICAgIGludCBkZXN0X2EgPSAwLCBkZXN0X3JfeSA9IDAsIGRlc3RfZ19tID0gMCwgZGVzdF9iX2MgPSAwOworICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOworICAgICAgICAgICAgICAgaisrKSB7CisgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0KKyAgICAgICAgICAgICAgICBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOworICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0ID0gcGl4ZWxfd2VpZ2h0ICogc3JjX3NjYW5fbWFza1tqXSAvIDI1NTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnYl9jbXlrID0gbV9wU3JjUGFsZXR0ZVtzcmNfc2NhbltqXV07CisgICAgICAgICAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX1JnYmEpIHsKKyAgICAgICAgICAgICAgZGVzdF9yX3kgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpKGFyZ2JfY215ayA+PiAxNik7CisgICAgICAgICAgICAgIGRlc3RfZ19tICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KShhcmdiX2NteWsgPj4gOCk7CisgICAgICAgICAgICAgIGRlc3RfYl9jICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KWFyZ2JfY215azsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGRlc3RfYl9jICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KShhcmdiX2NteWsgPj4gMjQpOworICAgICAgICAgICAgICBkZXN0X2dfbSArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdCkoYXJnYl9jbXlrID4+IDE2KTsKKyAgICAgICAgICAgICAgZGVzdF9yX3kgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpKGFyZ2JfY215ayA+PiA4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc3RfYSArPSBwaXhlbF93ZWlnaHQ7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgeworICAgICAgICAgICAgZGVzdF9iX2MgPQorICAgICAgICAgICAgICAgIGRlc3RfYl9jIDwgMCA/IDAgOiBkZXN0X2JfYyA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2JfYzsKKyAgICAgICAgICAgIGRlc3RfZ19tID0KKyAgICAgICAgICAgICAgICBkZXN0X2dfbSA8IDAgPyAwIDogZGVzdF9nX20gPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9nX207CisgICAgICAgICAgICBkZXN0X3JfeSA9CisgICAgICAgICAgICAgICAgZGVzdF9yX3kgPCAwID8gMCA6IGRlc3Rfcl95ID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3Rfcl95OworICAgICAgICAgICAgZGVzdF9hID0gZGVzdF9hIDwgMCA/IDAgOiBkZXN0X2EgPiA2NTUzNiA/IDY1NTM2IDogZGVzdF9hOworICAgICAgICAgIH0KKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCkoZGVzdF9iX2MgPj4gMTYpOworICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KShkZXN0X2dfbSA+PiAxNik7CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpKGRlc3Rfcl95ID4+IDE2KTsKKyAgICAgICAgICAqZGVzdF9zY2FuX21hc2srKyA9ICh1aW50OF90KSgoZGVzdF9hICogMjU1KSA+PiAxNik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIDc6IHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gbV9EZXN0Q2xpcC5sZWZ0OyBjb2wgPCBtX0Rlc3RDbGlwLnJpZ2h0OyBjb2wrKykgeworICAgICAgICAgIFBpeGVsV2VpZ2h0KiBwUGl4ZWxXZWlnaHRzID0gbV9XZWlnaHRUYWJsZS5HZXRQaXhlbFdlaWdodChjb2wpOworICAgICAgICAgIGludCBkZXN0X3JfeSA9IDAsIGRlc3RfZ19tID0gMCwgZGVzdF9iX2MgPSAwOworICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOworICAgICAgICAgICAgICAgaisrKSB7CisgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0KKyAgICAgICAgICAgICAgICBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOworICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3BpeGVsID0gc3JjX3NjYW4gKyBqICogQnBwOworICAgICAgICAgICAgZGVzdF9iX2MgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7CisgICAgICAgICAgICBkZXN0X2dfbSArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCsrKTsKKyAgICAgICAgICAgIGRlc3Rfcl95ICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7CisgICAgICAgICAgICBkZXN0X2JfYyA9CisgICAgICAgICAgICAgICAgZGVzdF9iX2MgPCAwID8gMCA6IGRlc3RfYl9jID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfYl9jOworICAgICAgICAgICAgZGVzdF9nX20gPQorICAgICAgICAgICAgICAgIGRlc3RfZ19tIDwgMCA/IDAgOiBkZXN0X2dfbSA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2dfbTsKKyAgICAgICAgICAgIGRlc3Rfcl95ID0KKyAgICAgICAgICAgICAgICBkZXN0X3JfeSA8IDAgPyAwIDogZGVzdF9yX3kgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9yX3k7CisgICAgICAgICAgfQorICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KSgoZGVzdF9iX2MpID4+IDE2KTsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCkoKGRlc3RfZ19tKSA+PiAxNik7CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpKChkZXN0X3JfeSkgPj4gMTYpOworICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHAgLSAzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSA4OiB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgY29sKyspIHsKKyAgICAgICAgICBQaXhlbFdlaWdodCogcFBpeGVsV2VpZ2h0cyA9IG1fV2VpZ2h0VGFibGUuR2V0UGl4ZWxXZWlnaHQoY29sKTsKKyAgICAgICAgICBpbnQgZGVzdF9hID0gMCwgZGVzdF9yX3kgPSAwLCBkZXN0X2dfbSA9IDAsIGRlc3RfYl9jID0gMDsKKyAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsKKyAgICAgICAgICAgICAgIGorKykgeworICAgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9CisgICAgICAgICAgICAgICAgcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19waXhlbCA9IHNyY19zY2FuICsgaiAqIEJwcDsKKyAgICAgICAgICAgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfQXJnYikgeworICAgICAgICAgICAgICBwaXhlbF93ZWlnaHQgPSBwaXhlbF93ZWlnaHQgKiBzcmNfcGl4ZWxbM10gLyAyNTU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBwaXhlbF93ZWlnaHQgPSBwaXhlbF93ZWlnaHQgKiBzcmNfc2Nhbl9tYXNrW2pdIC8gMjU1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzdF9iX2MgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7CisgICAgICAgICAgICBkZXN0X2dfbSArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCsrKTsKKyAgICAgICAgICAgIGRlc3Rfcl95ICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKTsKKyAgICAgICAgICAgIGRlc3RfYSArPSBwaXhlbF93ZWlnaHQ7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgeworICAgICAgICAgICAgZGVzdF9yX3kgPQorICAgICAgICAgICAgICAgIGRlc3Rfcl95IDwgMCA/IDAgOiBkZXN0X3JfeSA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X3JfeTsKKyAgICAgICAgICAgIGRlc3RfZ19tID0KKyAgICAgICAgICAgICAgICBkZXN0X2dfbSA8IDAgPyAwIDogZGVzdF9nX20gPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9nX207CisgICAgICAgICAgICBkZXN0X2JfYyA9CisgICAgICAgICAgICAgICAgZGVzdF9iX2MgPCAwID8gMCA6IGRlc3RfYl9jID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfYl9jOworICAgICAgICAgICAgZGVzdF9hID0gZGVzdF9hIDwgMCA/IDAgOiBkZXN0X2EgPiA2NTUzNiA/IDY1NTM2IDogZGVzdF9hOworICAgICAgICAgIH0KKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCkoKGRlc3RfYl9jKSA+PiAxNik7CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpKChkZXN0X2dfbSkgPj4gMTYpOworICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KSgoZGVzdF9yX3kpID4+IDE2KTsKKyAgICAgICAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSAodWludDhfdCkoKGRlc3RfYSAqIDI1NSkgPj4gMTYpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoZGVzdF9zY2FuX21hc2spIHsKKyAgICAgICAgICAgICpkZXN0X3NjYW5fbWFzaysrID0gKHVpbnQ4X3QpKChkZXN0X2EgKiAyNTUpID4+IDE2KTsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcCAtIDM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiBGQUxTRTsKKyAgICByb3dzX3RvX2dvLS07CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQotdm9pZCBDU3RyZXRjaEVuZ2luZTo6U3RyZXRjaFZlcnQoKQotewotICAgIGlmIChtX0Rlc3RIZWlnaHQgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENXZWlnaHRUYWJsZSB0YWJsZTsKLSAgICB0YWJsZS5DYWxjKG1fRGVzdEhlaWdodCwgbV9EZXN0Q2xpcC50b3AsIG1fRGVzdENsaXAuYm90dG9tLCBtX1NyY0hlaWdodCwgbV9TcmNDbGlwLnRvcCwgbV9TcmNDbGlwLmJvdHRvbSwgbV9GbGFncyk7Ci0gICAgaWYgKHRhYmxlLm1fcFdlaWdodFRhYmxlcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IERlc3RCcHAgPSBtX0Rlc3RCcHAgLyA4OwotICAgIGZvciAoaW50IHJvdyA9IG1fRGVzdENsaXAudG9wOyByb3cgPCBtX0Rlc3RDbGlwLmJvdHRvbTsgcm93ICsrKSB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIqIGRlc3Rfc2NhbiA9IG1fcERlc3RTY2FubGluZTsKLSAgICAgICAgdW5zaWduZWQgY2hhciogZGVzdF9zYWNuX21hc2sgPSBtX3BEZXN0TWFza1NjYW5saW5lOwotICAgICAgICBQaXhlbFdlaWdodCogcFBpeGVsV2VpZ2h0cyA9IHRhYmxlLkdldFBpeGVsV2VpZ2h0KHJvdyk7Ci0gICAgICAgIHN3aXRjaChtX1RyYW5zTWV0aG9kKSB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBjYXNlIDM6IHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gbV9EZXN0Q2xpcC5sZWZ0OyBjb2wgPCBtX0Rlc3RDbGlwLnJpZ2h0OyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHNyY19zY2FuID0gbV9wSW50ZXJCdWYgKyAoY29sIC0gbV9EZXN0Q2xpcC5sZWZ0KSAqIERlc3RCcHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9hID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOyBqICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1tqIC0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9hICs9IHBpeGVsX3dlaWdodCAqIHNyY19zY2FuWyhqIC0gbV9TcmNDbGlwLnRvcCkgKiBtX0ludGVyUGl0Y2hdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9hID0gZGVzdF9hIDwgMCA/IDAgOiBkZXN0X2EgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9hOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IChGWF9CWVRFKShkZXN0X2EgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IERlc3RCcHA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSA0OiB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBzcmNfc2NhbiA9IG1fcEludGVyQnVmICsgKGNvbCAtIG1fRGVzdENsaXAubGVmdCkgKiBEZXN0QnBwOwotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogc3JjX3NjYW5fbWFzayA9IG1fcEV4dHJhQWxwaGFCdWYgKyAoY29sIC0gbV9EZXN0Q2xpcC5sZWZ0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2EgPSAwLCBkZXN0X2sgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7IGogKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0gcFBpeGVsV2VpZ2h0cy0+bV9XZWlnaHRzW2ogLSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2sgKz0gcGl4ZWxfd2VpZ2h0ICogc3JjX3NjYW5bKGogLSBtX1NyY0NsaXAudG9wKSAqIG1fSW50ZXJQaXRjaF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9hICs9IHBpeGVsX3dlaWdodCAqIHNyY19zY2FuX21hc2tbKGogLSBtX1NyY0NsaXAudG9wKSAqIG1fRXh0cmFNYXNrUGl0Y2hdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9rID0gZGVzdF9rIDwgMCA/IDAgOiBkZXN0X2sgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9rOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYSA9IGRlc3RfYSA8IDAgPyAwIDogZGVzdF9hID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfYTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSAoRlhfQllURSkoZGVzdF9rID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBEZXN0QnBwOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2Fjbl9tYXNrKysgPSAoRlhfQllURSkoZGVzdF9hID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICBjYXNlIDc6IHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gbV9EZXN0Q2xpcC5sZWZ0OyBjb2wgPCBtX0Rlc3RDbGlwLnJpZ2h0OyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHNyY19zY2FuID0gbV9wSW50ZXJCdWYgKyAoY29sIC0gbV9EZXN0Q2xpcC5sZWZ0KSAqIERlc3RCcHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9yX3kgPSAwLCBkZXN0X2dfbSA9IDAsIGRlc3RfYl9jID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOyBqICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1tqIC0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBDQllURSBzcmNfcGl4ZWwgPSBzcmNfc2NhbiArIChqIC0gbV9TcmNDbGlwLnRvcCkgKiBtX0ludGVyUGl0Y2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9iX2MgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9nX20gKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9yX3kgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9yX3kgPSBkZXN0X3JfeSA8IDAgPyAwIDogZGVzdF9yX3kgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9yX3k7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9nX20gPSBkZXN0X2dfbSA8IDAgPyAwIDogZGVzdF9nX20gPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9nX207Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9iX2MgPSBkZXN0X2JfYyA8IDAgPyAwIDogZGVzdF9iX2MgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9iX2M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSAoRlhfQllURSkoKGRlc3RfYl9jKSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSAoRlhfQllURSkoKGRlc3RfZ19tKSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSAoRlhfQllURSkoKGRlc3Rfcl95KSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gRGVzdEJwcDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICBjYXNlIDg6IHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gbV9EZXN0Q2xpcC5sZWZ0OyBjb2wgPCBtX0Rlc3RDbGlwLnJpZ2h0OyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHNyY19zY2FuID0gbV9wSW50ZXJCdWYgKyAoY29sIC0gbV9EZXN0Q2xpcC5sZWZ0KSAqIERlc3RCcHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBzcmNfc2Nhbl9tYXNrID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0Rlc3RGb3JtYXQgIT0gRlhESUJfQXJnYikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuX21hc2sgPSBtX3BFeHRyYUFscGhhQnVmICsgKGNvbCAtIG1fRGVzdENsaXAubGVmdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9hID0gMCwgZGVzdF9yX3kgPSAwLCBkZXN0X2dfbSA9IDAsIGRlc3RfYl9jID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOyBqICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9IHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1tqIC0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBDQllURSBzcmNfcGl4ZWwgPSBzcmNfc2NhbiArIChqIC0gbV9TcmNDbGlwLnRvcCkgKiBtX0ludGVyUGl0Y2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfdiA9IDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX3NjYW5fbWFzaykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrX3YgPSBzcmNfc2Nhbl9tYXNrWyhqIC0gbV9TcmNDbGlwLnRvcCkgKiBtX0V4dHJhTWFza1BpdGNoXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9iX2MgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9nX20gKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9yX3kgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfQXJnYikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2EgKz0gcGl4ZWxfd2VpZ2h0ICogKCooc3JjX3BpeGVsICsgMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYSArPSBwaXhlbF93ZWlnaHQgKiBtYXNrX3Y7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9yX3kgPSBkZXN0X3JfeSA8IDAgPyAwIDogZGVzdF9yX3kgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9yX3k7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9nX20gPSBkZXN0X2dfbSA8IDAgPyAwIDogZGVzdF9nX20gPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9nX207Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9iX2MgPSBkZXN0X2JfYyA8IDAgPyAwIDogZGVzdF9iX2MgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9iX2M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9hID0gZGVzdF9hIDwgMCA/IDAgOiBkZXN0X2EgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9hOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3RfYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByID0gKChGWF9EV09SRClkZXN0X3JfeSkgKiAyNTUgLyBkZXN0X2E7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGcgPSAoKEZYX0RXT1JEKWRlc3RfZ19tKSAqIDI1NSAvIGRlc3RfYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYiA9ICgoRlhfRFdPUkQpZGVzdF9iX2MpICogMjU1IC8gZGVzdF9hOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IGIgPiAyNTUgPyAyNTUgOiBiIDwgMCA/IDAgOiBiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IGcgPiAyNTUgPyAyNTUgOiBnIDwgMCA/IDAgOiBnOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IHIgPiAyNTUgPyAyNTUgOiByIDwgMCA/IDAgOiByOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9BcmdiKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gKEZYX0JZVEUpKChkZXN0X2EpID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2Fjbl9tYXNrID0gKEZYX0JZVEUpKChkZXN0X2EpID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBEZXN0QnBwOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3Rfc2Fjbl9tYXNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zYWNuX21hc2srKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Cit2b2lkIENTdHJldGNoRW5naW5lOjpTdHJldGNoVmVydCgpIHsKKyAgaWYgKG1fRGVzdEhlaWdodCA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIENXZWlnaHRUYWJsZSB0YWJsZTsKKyAgdGFibGUuQ2FsYyhtX0Rlc3RIZWlnaHQsIG1fRGVzdENsaXAudG9wLCBtX0Rlc3RDbGlwLmJvdHRvbSwgbV9TcmNIZWlnaHQsCisgICAgICAgICAgICAgbV9TcmNDbGlwLnRvcCwgbV9TcmNDbGlwLmJvdHRvbSwgbV9GbGFncyk7CisgIGlmICghdGFibGUubV9wV2VpZ2h0VGFibGVzKSB7CisgICAgcmV0dXJuOworICB9CisgIGludCBEZXN0QnBwID0gbV9EZXN0QnBwIC8gODsKKyAgZm9yIChpbnQgcm93ID0gbV9EZXN0Q2xpcC50b3A7IHJvdyA8IG1fRGVzdENsaXAuYm90dG9tOyByb3crKykgeworICAgIHVuc2lnbmVkIGNoYXIqIGRlc3Rfc2NhbiA9IG1fcERlc3RTY2FubGluZTsKKyAgICB1bnNpZ25lZCBjaGFyKiBkZXN0X3NhY25fbWFzayA9IG1fcERlc3RNYXNrU2NhbmxpbmU7CisgICAgUGl4ZWxXZWlnaHQqIHBQaXhlbFdlaWdodHMgPSB0YWJsZS5HZXRQaXhlbFdlaWdodChyb3cpOworICAgIHN3aXRjaCAobV9UcmFuc01ldGhvZCkgeworICAgICAgY2FzZSAxOgorICAgICAgY2FzZSAyOgorICAgICAgY2FzZSAzOiB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgY29sKyspIHsKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBzcmNfc2NhbiA9CisgICAgICAgICAgICAgIG1fcEludGVyQnVmICsgKGNvbCAtIG1fRGVzdENsaXAubGVmdCkgKiBEZXN0QnBwOworICAgICAgICAgIGludCBkZXN0X2EgPSAwOworICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOworICAgICAgICAgICAgICAgaisrKSB7CisgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0KKyAgICAgICAgICAgICAgICBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOworICAgICAgICAgICAgZGVzdF9hICs9CisgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0ICogc3JjX3NjYW5bKGogLSBtX1NyY0NsaXAudG9wKSAqIG1fSW50ZXJQaXRjaF07CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgeworICAgICAgICAgICAgZGVzdF9hID0gZGVzdF9hIDwgMCA/IDAgOiBkZXN0X2EgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9hOworICAgICAgICAgIH0KKyAgICAgICAgICAqZGVzdF9zY2FuID0gKHVpbnQ4X3QpKGRlc3RfYSA+PiAxNik7CisgICAgICAgICAgZGVzdF9zY2FuICs9IERlc3RCcHA7CiAgICAgICAgIH0KLSAgICAgICAgbV9wRGVzdEJpdG1hcC0+Q29tcG9zZVNjYW5saW5lKHJvdyAtIG1fRGVzdENsaXAudG9wLCBtX3BEZXN0U2NhbmxpbmUsIG1fcERlc3RNYXNrU2NhbmxpbmUpOwotICAgIH0KLX0KLUNGWF9JbWFnZVN0cmV0Y2hlcjo6Q0ZYX0ltYWdlU3RyZXRjaGVyKCkKLXsKLSAgICBtX3BTY2FubGluZSA9IE5VTEw7Ci0gICAgbV9wU3RyZXRjaEVuZ2luZSA9IE5VTEw7Ci0gICAgbV9wTWFza1NjYW5saW5lID0gTlVMTDsKLX0KLUNGWF9JbWFnZVN0cmV0Y2hlcjo6fkNGWF9JbWFnZVN0cmV0Y2hlcigpCi17Ci0gICAgaWYgKG1fcFNjYW5saW5lKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wU2NhbmxpbmUpOwotICAgIH0KLSAgICBpZiAobV9wU3RyZXRjaEVuZ2luZSkgewotICAgICAgICBkZWxldGUgbV9wU3RyZXRjaEVuZ2luZTsKLSAgICB9Ci0gICAgaWYgKG1fcE1hc2tTY2FubGluZSkgewotICAgICAgICBGWF9GcmVlKG1fcE1hc2tTY2FubGluZSk7Ci0gICAgfQotfQotRlhESUJfRm9ybWF0IF9HZXRTdHJldGNoZWRGb3JtYXQoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYykKLXsKLSAgICBGWERJQl9Gb3JtYXQgZm9ybWF0ID0gcFNyYy0+R2V0Rm9ybWF0KCk7Ci0gICAgaWYgKGZvcm1hdCA9PSBGWERJQl8xYnBwTWFzaykgewotICAgICAgICBmb3JtYXQgPSBGWERJQl84YnBwTWFzazsKLSAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBGWERJQl8xYnBwUmdiKSB7Ci0gICAgICAgIGZvcm1hdCA9IEZYRElCXzhicHBSZ2I7Ci0gICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gRlhESUJfOGJwcFJnYikgewotICAgICAgICBpZiAocFNyYy0+R2V0UGFsZXR0ZSgpKSB7Ci0gICAgICAgICAgICBmb3JtYXQgPSBGWERJQl9SZ2I7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSA0OiB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgY29sKyspIHsKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBzcmNfc2NhbiA9CisgICAgICAgICAgICAgIG1fcEludGVyQnVmICsgKGNvbCAtIG1fRGVzdENsaXAubGVmdCkgKiBEZXN0QnBwOworICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHNyY19zY2FuX21hc2sgPQorICAgICAgICAgICAgICBtX3BFeHRyYUFscGhhQnVmICsgKGNvbCAtIG1fRGVzdENsaXAubGVmdCk7CisgICAgICAgICAgaW50IGRlc3RfYSA9IDAsIGRlc3RfayA9IDA7CisgICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7CisgICAgICAgICAgICAgICBqKyspIHsKKyAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPQorICAgICAgICAgICAgICAgIHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1tqIC0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydF07CisgICAgICAgICAgICBkZXN0X2sgKz0KKyAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHQgKiBzcmNfc2NhblsoaiAtIG1fU3JjQ2xpcC50b3ApICogbV9JbnRlclBpdGNoXTsKKyAgICAgICAgICAgIGRlc3RfYSArPSBwaXhlbF93ZWlnaHQgKgorICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuX21hc2tbKGogLSBtX1NyY0NsaXAudG9wKSAqIG1fRXh0cmFNYXNrUGl0Y2hdOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKKyAgICAgICAgICAgIGRlc3RfayA9IGRlc3RfayA8IDAgPyAwIDogZGVzdF9rID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfazsKKyAgICAgICAgICAgIGRlc3RfYSA9IGRlc3RfYSA8IDAgPyAwIDogZGVzdF9hID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfYTsKKyAgICAgICAgICB9CisgICAgICAgICAgKmRlc3Rfc2NhbiA9ICh1aW50OF90KShkZXN0X2sgPj4gMTYpOworICAgICAgICAgIGRlc3Rfc2NhbiArPSBEZXN0QnBwOworICAgICAgICAgICpkZXN0X3NhY25fbWFzaysrID0gKHVpbnQ4X3QpKGRlc3RfYSA+PiAxNik7CiAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIDU6CisgICAgICBjYXNlIDc6IHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gbV9EZXN0Q2xpcC5sZWZ0OyBjb2wgPCBtX0Rlc3RDbGlwLnJpZ2h0OyBjb2wrKykgeworICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHNyY19zY2FuID0KKyAgICAgICAgICAgICAgbV9wSW50ZXJCdWYgKyAoY29sIC0gbV9EZXN0Q2xpcC5sZWZ0KSAqIERlc3RCcHA7CisgICAgICAgICAgaW50IGRlc3Rfcl95ID0gMCwgZGVzdF9nX20gPSAwLCBkZXN0X2JfYyA9IDA7CisgICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7CisgICAgICAgICAgICAgICBqKyspIHsKKyAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPQorICAgICAgICAgICAgICAgIHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1tqIC0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydF07CisgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfcGl4ZWwgPQorICAgICAgICAgICAgICAgIHNyY19zY2FuICsgKGogLSBtX1NyY0NsaXAudG9wKSAqIG1fSW50ZXJQaXRjaDsKKyAgICAgICAgICAgIGRlc3RfYl9jICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKyspOworICAgICAgICAgICAgZGVzdF9nX20gKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7CisgICAgICAgICAgICBkZXN0X3JfeSArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgeworICAgICAgICAgICAgZGVzdF9yX3kgPQorICAgICAgICAgICAgICAgIGRlc3Rfcl95IDwgMCA/IDAgOiBkZXN0X3JfeSA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X3JfeTsKKyAgICAgICAgICAgIGRlc3RfZ19tID0KKyAgICAgICAgICAgICAgICBkZXN0X2dfbSA8IDAgPyAwIDogZGVzdF9nX20gPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9nX207CisgICAgICAgICAgICBkZXN0X2JfYyA9CisgICAgICAgICAgICAgICAgZGVzdF9iX2MgPCAwID8gMCA6IGRlc3RfYl9jID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfYl9jOworICAgICAgICAgIH0KKyAgICAgICAgICBkZXN0X3NjYW5bMF0gPSAodWludDhfdCkoKGRlc3RfYl9jKSA+PiAxNik7CisgICAgICAgICAgZGVzdF9zY2FuWzFdID0gKHVpbnQ4X3QpKChkZXN0X2dfbSkgPj4gMTYpOworICAgICAgICAgIGRlc3Rfc2NhblsyXSA9ICh1aW50OF90KSgoZGVzdF9yX3kpID4+IDE2KTsKKyAgICAgICAgICBkZXN0X3NjYW4gKz0gRGVzdEJwcDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgNjoKKyAgICAgIGNhc2UgODogeworICAgICAgICBmb3IgKGludCBjb2wgPSBtX0Rlc3RDbGlwLmxlZnQ7IGNvbCA8IG1fRGVzdENsaXAucmlnaHQ7IGNvbCsrKSB7CisgICAgICAgICAgdW5zaWduZWQgY2hhciogc3JjX3NjYW4gPQorICAgICAgICAgICAgICBtX3BJbnRlckJ1ZiArIChjb2wgLSBtX0Rlc3RDbGlwLmxlZnQpICogRGVzdEJwcDsKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBzcmNfc2Nhbl9tYXNrID0gTlVMTDsKKyAgICAgICAgICBpZiAobV9EZXN0Rm9ybWF0ICE9IEZYRElCX0FyZ2IpIHsKKyAgICAgICAgICAgIHNyY19zY2FuX21hc2sgPSBtX3BFeHRyYUFscGhhQnVmICsgKGNvbCAtIG1fRGVzdENsaXAubGVmdCk7CisgICAgICAgICAgfQorICAgICAgICAgIGludCBkZXN0X2EgPSAwLCBkZXN0X3JfeSA9IDAsIGRlc3RfZ19tID0gMCwgZGVzdF9iX2MgPSAwOworICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOworICAgICAgICAgICAgICAgaisrKSB7CisgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0KKyAgICAgICAgICAgICAgICBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOworICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3BpeGVsID0KKyAgICAgICAgICAgICAgICBzcmNfc2NhbiArIChqIC0gbV9TcmNDbGlwLnRvcCkgKiBtX0ludGVyUGl0Y2g7CisgICAgICAgICAgICBpbnQgbWFza192ID0gMjU1OworICAgICAgICAgICAgaWYgKHNyY19zY2FuX21hc2spIHsKKyAgICAgICAgICAgICAgbWFza192ID0gc3JjX3NjYW5fbWFza1soaiAtIG1fU3JjQ2xpcC50b3ApICogbV9FeHRyYU1hc2tQaXRjaF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0X2JfYyArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCsrKTsKKyAgICAgICAgICAgIGRlc3RfZ19tICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKyspOworICAgICAgICAgICAgZGVzdF9yX3kgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwpOworICAgICAgICAgICAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9BcmdiKSB7CisgICAgICAgICAgICAgIGRlc3RfYSArPSBwaXhlbF93ZWlnaHQgKiAoKihzcmNfcGl4ZWwgKyAxKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBkZXN0X2EgKz0gcGl4ZWxfd2VpZ2h0ICogbWFza192OworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKKyAgICAgICAgICAgIGRlc3Rfcl95ID0KKyAgICAgICAgICAgICAgICBkZXN0X3JfeSA8IDAgPyAwIDogZGVzdF9yX3kgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9yX3k7CisgICAgICAgICAgICBkZXN0X2dfbSA9CisgICAgICAgICAgICAgICAgZGVzdF9nX20gPCAwID8gMCA6IGRlc3RfZ19tID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfZ19tOworICAgICAgICAgICAgZGVzdF9iX2MgPQorICAgICAgICAgICAgICAgIGRlc3RfYl9jIDwgMCA/IDAgOiBkZXN0X2JfYyA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2JfYzsKKyAgICAgICAgICAgIGRlc3RfYSA9IGRlc3RfYSA8IDAgPyAwIDogZGVzdF9hID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfYTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGRlc3RfYSkgeworICAgICAgICAgICAgaW50IHIgPSAoKEZYX0RXT1JEKWRlc3Rfcl95KSAqIDI1NSAvIGRlc3RfYTsKKyAgICAgICAgICAgIGludCBnID0gKChGWF9EV09SRClkZXN0X2dfbSkgKiAyNTUgLyBkZXN0X2E7CisgICAgICAgICAgICBpbnQgYiA9ICgoRlhfRFdPUkQpZGVzdF9iX2MpICogMjU1IC8gZGVzdF9hOworICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gYiA+IDI1NSA/IDI1NSA6IGIgPCAwID8gMCA6IGI7CisgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBnID4gMjU1ID8gMjU1IDogZyA8IDAgPyAwIDogZzsKKyAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IHIgPiAyNTUgPyAyNTUgOiByIDwgMCA/IDAgOiByOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKKyAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9ICh1aW50OF90KSgoZGVzdF9hKSA+PiAxNik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkZXN0X3NhY25fbWFzayA9ICh1aW50OF90KSgoZGVzdF9hKSA+PiAxNik7CisgICAgICAgICAgfQorICAgICAgICAgIGRlc3Rfc2NhbiArPSBEZXN0QnBwOworICAgICAgICAgIGlmIChkZXN0X3NhY25fbWFzaykgeworICAgICAgICAgICAgZGVzdF9zYWNuX21hc2srKzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmb3JtYXQ7CisgICAgbV9wRGVzdEJpdG1hcC0+Q29tcG9zZVNjYW5saW5lKHJvdyAtIG1fRGVzdENsaXAudG9wLCBtX3BEZXN0U2NhbmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcERlc3RNYXNrU2NhbmxpbmUpOworICB9Cit9CitDRlhfSW1hZ2VTdHJldGNoZXI6OkNGWF9JbWFnZVN0cmV0Y2hlcigpIHsKKyAgbV9wU2NhbmxpbmUgPSBOVUxMOworICBtX3BTdHJldGNoRW5naW5lID0gTlVMTDsKKyAgbV9wTWFza1NjYW5saW5lID0gTlVMTDsKK30KK0NGWF9JbWFnZVN0cmV0Y2hlcjo6fkNGWF9JbWFnZVN0cmV0Y2hlcigpIHsKKyAgRlhfRnJlZShtX3BTY2FubGluZSk7CisgIGRlbGV0ZSBtX3BTdHJldGNoRW5naW5lOworICBGWF9GcmVlKG1fcE1hc2tTY2FubGluZSk7Cit9CitGWERJQl9Gb3JtYXQgX0dldFN0cmV0Y2hlZEZvcm1hdChjb25zdCBDRlhfRElCU291cmNlKiBwU3JjKSB7CisgIEZYRElCX0Zvcm1hdCBmb3JtYXQgPSBwU3JjLT5HZXRGb3JtYXQoKTsKKyAgaWYgKGZvcm1hdCA9PSBGWERJQl8xYnBwTWFzaykgeworICAgIGZvcm1hdCA9IEZYRElCXzhicHBNYXNrOworICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBGWERJQl8xYnBwUmdiKSB7CisgICAgZm9ybWF0ID0gRlhESUJfOGJwcFJnYjsKKyAgfSBlbHNlIGlmIChmb3JtYXQgPT0gRlhESUJfOGJwcFJnYikgeworICAgIGlmIChwU3JjLT5HZXRQYWxldHRlKCkpIHsKKyAgICAgIGZvcm1hdCA9IEZYRElCX1JnYjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZvcm1hdDsKIH0KIEZYX0JPT0wgQ0ZYX0ltYWdlU3RyZXRjaGVyOjpTdGFydChJRlhfU2NhbmxpbmVDb21wb3NlciogcERlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUJiByZWN0LCBGWF9EV09SRCBmbGFncykKLXsKLSAgICBtX0Rlc3RGb3JtYXQgPSBfR2V0U3RyZXRjaGVkRm9ybWF0KHBTb3VyY2UpOwotICAgIG1fRGVzdEJQUCA9IG1fRGVzdEZvcm1hdCAmIDB4ZmY7Ci0gICAgbV9wRGVzdCA9IHBEZXN0OwotICAgIG1fcFNvdXJjZSA9IHBTb3VyY2U7Ci0gICAgbV9EZXN0V2lkdGggPSBkZXN0X3dpZHRoOwotICAgIG1fRGVzdEhlaWdodCA9IGRlc3RfaGVpZ2h0OwotICAgIG1fQ2xpcFJlY3QgPSByZWN0OwotICAgIG1fRmxhZ3MgPSBmbGFnczsKLSAgICBpZiAocFNvdXJjZS0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfMWJwcFJnYiAmJiBwU291cmNlLT5HZXRQYWxldHRlKCkpIHsKLSAgICAgICAgRlhfQVJHQiBwYWxbMjU2XTsKLSAgICAgICAgaW50IGEwLCByMCwgZzAsIGIwLCBhMSwgcjEsIGcxLCBiMTsKLSAgICAgICAgQXJnYkRlY29kZShwU291cmNlLT5HZXRQYWxldHRlRW50cnkoMCksIGEwLCByMCwgZzAsIGIwKTsKLSAgICAgICAgQXJnYkRlY29kZShwU291cmNlLT5HZXRQYWxldHRlRW50cnkoMSksIGExLCByMSwgZzEsIGIxKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKLSAgICAgICAgICAgIGludCBhID0gYTAgKyAoYTEgLSBhMCkgKiBpIC8gMjU1OwotICAgICAgICAgICAgaW50IHIgPSByMCArIChyMSAtIHIwKSAqIGkgLyAyNTU7Ci0gICAgICAgICAgICBpbnQgZyA9IGcwICsgKGcxIC0gZzApICogaSAvIDI1NTsKLSAgICAgICAgICAgIGludCBiID0gYjAgKyAoYjEgLSBiMCkgKiBpIC8gMjU1OwotICAgICAgICAgICAgcGFsW2ldID0gQXJnYkVuY29kZShhLCByLCBnLCBiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXBEZXN0LT5TZXRJbmZvKHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwgbV9EZXN0Rm9ybWF0LCBwYWwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHBTb3VyY2UtPkdldEZvcm1hdCgpID09IEZYRElCXzFicHBDbXlrICYmIHBTb3VyY2UtPkdldFBhbGV0dGUoKSkgewotICAgICAgICBGWF9DTVlLIHBhbFsyNTZdOwotICAgICAgICBpbnQgYzAsIG0wLCB5MCwgazAsIGMxLCBtMSwgeTEsIGsxOwotICAgICAgICBDbXlrRGVjb2RlKHBTb3VyY2UtPkdldFBhbGV0dGVFbnRyeSgwKSwgYzAsIG0wLCB5MCwgazApOwotICAgICAgICBDbXlrRGVjb2RlKHBTb3VyY2UtPkdldFBhbGV0dGVFbnRyeSgxKSwgYzEsIG0xLCB5MSwgazEpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSArKykgewotICAgICAgICAgICAgaW50IGMgPSBjMCArIChjMSAtIGMwKSAqIGkgLyAyNTU7Ci0gICAgICAgICAgICBpbnQgbSA9IG0wICsgKG0xIC0gbTApICogaSAvIDI1NTsKLSAgICAgICAgICAgIGludCB5ID0geTAgKyAoeTEgLSB5MCkgKiBpIC8gMjU1OwotICAgICAgICAgICAgaW50IGsgPSBrMCArIChrMSAtIGswKSAqIGkgLyAyNTU7Ci0gICAgICAgICAgICBwYWxbaV0gPSBDbXlrRW5jb2RlKGMsIG0sIHksIGspOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcERlc3QtPlNldEluZm8ocmVjdC5XaWR0aCgpLCByZWN0LkhlaWdodCgpLCBtX0Rlc3RGb3JtYXQsIHBhbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoIXBEZXN0LT5TZXRJbmZvKHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwgbV9EZXN0Rm9ybWF0LCBOVUxMKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncykgeworICBtX0Rlc3RGb3JtYXQgPSBfR2V0U3RyZXRjaGVkRm9ybWF0KHBTb3VyY2UpOworICBtX0Rlc3RCUFAgPSBtX0Rlc3RGb3JtYXQgJiAweGZmOworICBtX3BEZXN0ID0gcERlc3Q7CisgIG1fcFNvdXJjZSA9IHBTb3VyY2U7CisgIG1fRGVzdFdpZHRoID0gZGVzdF93aWR0aDsKKyAgbV9EZXN0SGVpZ2h0ID0gZGVzdF9oZWlnaHQ7CisgIG1fQ2xpcFJlY3QgPSByZWN0OworICBtX0ZsYWdzID0gZmxhZ3M7CisgIGlmIChwU291cmNlLT5HZXRGb3JtYXQoKSA9PSBGWERJQl8xYnBwUmdiICYmIHBTb3VyY2UtPkdldFBhbGV0dGUoKSkgeworICAgIEZYX0FSR0IgcGFsWzI1Nl07CisgICAgaW50IGEwLCByMCwgZzAsIGIwLCBhMSwgcjEsIGcxLCBiMTsKKyAgICBBcmdiRGVjb2RlKHBTb3VyY2UtPkdldFBhbGV0dGVFbnRyeSgwKSwgYTAsIHIwLCBnMCwgYjApOworICAgIEFyZ2JEZWNvZGUocFNvdXJjZS0+R2V0UGFsZXR0ZUVudHJ5KDEpLCBhMSwgcjEsIGcxLCBiMSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgaW50IGEgPSBhMCArIChhMSAtIGEwKSAqIGkgLyAyNTU7CisgICAgICBpbnQgciA9IHIwICsgKHIxIC0gcjApICogaSAvIDI1NTsKKyAgICAgIGludCBnID0gZzAgKyAoZzEgLSBnMCkgKiBpIC8gMjU1OworICAgICAgaW50IGIgPSBiMCArIChiMSAtIGIwKSAqIGkgLyAyNTU7CisgICAgICBwYWxbaV0gPSBBcmdiRW5jb2RlKGEsIHIsIGcsIGIpOwogICAgIH0KLSAgICBpZiAoZmxhZ3MgJiBGWERJQl9ET1dOU0FNUExFKSB7Ci0gICAgICAgIHJldHVybiBTdGFydFF1aWNrU3RyZXRjaCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBTdGFydFN0cmV0Y2goKTsKKyAgICBpZiAoIXBEZXN0LT5TZXRJbmZvKHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwgbV9EZXN0Rm9ybWF0LCBwYWwpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotfQotRlhfQk9PTCBDRlhfSW1hZ2VTdHJldGNoZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIGlmIChtX0ZsYWdzICYgRlhESUJfRE9XTlNBTVBMRSkgewotICAgICAgICByZXR1cm4gQ29udGludWVRdWlja1N0cmV0Y2gocFBhdXNlKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gQ29udGludWVTdHJldGNoKHBQYXVzZSk7CisgIH0gZWxzZSBpZiAocFNvdXJjZS0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfMWJwcENteWsgJiYgcFNvdXJjZS0+R2V0UGFsZXR0ZSgpKSB7CisgICAgRlhfQ01ZSyBwYWxbMjU2XTsKKyAgICBpbnQgYzAsIG0wLCB5MCwgazAsIGMxLCBtMSwgeTEsIGsxOworICAgIENteWtEZWNvZGUocFNvdXJjZS0+R2V0UGFsZXR0ZUVudHJ5KDApLCBjMCwgbTAsIHkwLCBrMCk7CisgICAgQ215a0RlY29kZShwU291cmNlLT5HZXRQYWxldHRlRW50cnkoMSksIGMxLCBtMSwgeTEsIGsxKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICBpbnQgYyA9IGMwICsgKGMxIC0gYzApICogaSAvIDI1NTsKKyAgICAgIGludCBtID0gbTAgKyAobTEgLSBtMCkgKiBpIC8gMjU1OworICAgICAgaW50IHkgPSB5MCArICh5MSAtIHkwKSAqIGkgLyAyNTU7CisgICAgICBpbnQgayA9IGswICsgKGsxIC0gazApICogaSAvIDI1NTsKKyAgICAgIHBhbFtpXSA9IENteWtFbmNvZGUoYywgbSwgeSwgayk7CiAgICAgfQotfQotI2RlZmluZSBNQVhfUFJPR1JFU1NJVkVfU1RSRVRDSF9QSVhFTFMJMTAwMDAwMAotRlhfQk9PTCBDRlhfSW1hZ2VTdHJldGNoZXI6OlN0YXJ0U3RyZXRjaCgpCi17Ci0gICAgbV9wU3RyZXRjaEVuZ2luZSA9IG5ldyBDU3RyZXRjaEVuZ2luZShtX3BEZXN0LCBtX0Rlc3RGb3JtYXQsIG1fRGVzdFdpZHRoLCBtX0Rlc3RIZWlnaHQsIG1fQ2xpcFJlY3QsIG1fcFNvdXJjZSwgbV9GbGFncyk7Ci0gICAgbV9wU3RyZXRjaEVuZ2luZS0+U3RhcnRTdHJldGNoSG9yeigpOwotICAgIGlmIChtX3BTb3VyY2UtPkdldFdpZHRoKCkgKiBtX3BTb3VyY2UtPkdldEhlaWdodCgpIDwgTUFYX1BST0dSRVNTSVZFX1NUUkVUQ0hfUElYRUxTKSB7Ci0gICAgICAgIG1fcFN0cmV0Y2hFbmdpbmUtPkNvbnRpbnVlKE5VTEwpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFwRGVzdC0+U2V0SW5mbyhyZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCksIG1fRGVzdEZvcm1hdCwgcGFsKSkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0ZYX0ltYWdlU3RyZXRjaGVyOjpDb250aW51ZVN0cmV0Y2goSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgaWYgKG1fcFN0cmV0Y2hFbmdpbmUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBtX3BTdHJldGNoRW5naW5lLT5Db250aW51ZShwUGF1c2UpOwotfQotRlhfQk9PTCBDRlhfSW1hZ2VTdHJldGNoZXI6OlN0YXJ0UXVpY2tTdHJldGNoKCkKLXsKLSAgICBtX2JGbGlwWCA9IEZBTFNFOwotICAgIG1fYkZsaXBZID0gRkFMU0U7Ci0gICAgaWYgKG1fRGVzdFdpZHRoIDwgMCkgewotICAgICAgICBtX2JGbGlwWCA9IFRSVUU7Ci0gICAgICAgIG1fRGVzdFdpZHRoID0gLW1fRGVzdFdpZHRoOwotICAgIH0KLSAgICBpZiAobV9EZXN0SGVpZ2h0IDwgMCkgewotICAgICAgICBtX2JGbGlwWSA9IFRSVUU7Ci0gICAgICAgIG1fRGVzdEhlaWdodCA9IC1tX0Rlc3RIZWlnaHQ7Ci0gICAgfQotICAgIG1fTGluZUluZGV4ID0gMDsKLSAgICBGWF9EV09SRCBzaXplID0gbV9DbGlwUmVjdC5XaWR0aCgpOwotICAgIGlmIChzaXplICYmIG1fRGVzdEJQUCA+IChpbnQpKElOVF9NQVggLyBzaXplKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHNpemUgKj0gbV9EZXN0QlBQOwotICAgIG1fcFNjYW5saW5lID0gRlhfQWxsb2MoRlhfQllURSwgKHNpemUgLyA4ICsgMykgLyA0ICogNCk7Ci0gICAgaWYgKG1fcFNvdXJjZS0+bV9wQWxwaGFNYXNrKSB7Ci0gICAgICAgIG1fcE1hc2tTY2FubGluZSA9IEZYX0FsbG9jKEZYX0JZVEUsIChtX0NsaXBSZWN0LldpZHRoKCkgKyAzKSAvIDQgKiA0KTsKLSAgICB9Ci0gICAgaWYgKG1fcFNvdXJjZS0+R2V0V2lkdGgoKSAqIG1fcFNvdXJjZS0+R2V0SGVpZ2h0KCkgPCBNQVhfUFJPR1JFU1NJVkVfU1RSRVRDSF9QSVhFTFMpIHsKLSAgICAgICAgQ29udGludWVRdWlja1N0cmV0Y2goTlVMTCk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENGWF9JbWFnZVN0cmV0Y2hlcjo6Q29udGludWVRdWlja1N0cmV0Y2goSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgaWYgKG1fcFNjYW5saW5lID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpbnQgcmVzdWx0X3dpZHRoID0gbV9DbGlwUmVjdC5XaWR0aCgpLCByZXN1bHRfaGVpZ2h0ID0gbV9DbGlwUmVjdC5IZWlnaHQoKTsKLSAgICBpbnQgc3JjX2hlaWdodCA9IG1fcFNvdXJjZS0+R2V0SGVpZ2h0KCk7Ci0gICAgZm9yICg7IG1fTGluZUluZGV4IDwgcmVzdWx0X2hlaWdodDsgbV9MaW5lSW5kZXggKyspIHsKLSAgICAgICAgaW50IGRlc3RfeSwgc3JjX3k7Ci0gICAgICAgIGlmIChtX2JGbGlwWSkgewotICAgICAgICAgICAgZGVzdF95ID0gcmVzdWx0X2hlaWdodCAtIG1fTGluZUluZGV4IC0gMTsKLSAgICAgICAgICAgIHNyY195ID0gKG1fRGVzdEhlaWdodCAtIChkZXN0X3kgKyBtX0NsaXBSZWN0LnRvcCkgLSAxKSAqIHNyY19oZWlnaHQgLyBtX0Rlc3RIZWlnaHQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZXN0X3kgPSBtX0xpbmVJbmRleDsKLSAgICAgICAgICAgIHNyY195ID0gKGRlc3RfeSArIG1fQ2xpcFJlY3QudG9wKSAqIHNyY19oZWlnaHQgLyBtX0Rlc3RIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNyY195ID49IHNyY19oZWlnaHQpIHsKLSAgICAgICAgICAgIHNyY195ID0gc3JjX2hlaWdodCAtIDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNyY195IDwgMCkgewotICAgICAgICAgICAgc3JjX3kgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX3BTb3VyY2UtPlNraXBUb1NjYW5saW5lKHNyY195LCBwUGF1c2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBtX3BTb3VyY2UtPkRvd25TYW1wbGVTY2FubGluZShzcmNfeSwgbV9wU2NhbmxpbmUsIG1fRGVzdEJQUCwgbV9EZXN0V2lkdGgsIG1fYkZsaXBYLCBtX0NsaXBSZWN0LmxlZnQsIHJlc3VsdF93aWR0aCk7Ci0gICAgICAgIGlmIChtX3BNYXNrU2NhbmxpbmUpIHsKLSAgICAgICAgICAgIG1fcFNvdXJjZS0+bV9wQWxwaGFNYXNrLT5Eb3duU2FtcGxlU2NhbmxpbmUoc3JjX3ksIG1fcE1hc2tTY2FubGluZSwgMSwgbV9EZXN0V2lkdGgsIG1fYkZsaXBYLCBtX0NsaXBSZWN0LmxlZnQsIHJlc3VsdF93aWR0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wRGVzdC0+Q29tcG9zZVNjYW5saW5lKGRlc3RfeSwgbV9wU2NhbmxpbmUsIG1fcE1hc2tTY2FubGluZSk7Ci0gICAgfQorICB9IGVsc2UgaWYgKCFwRGVzdC0+U2V0SW5mbyhyZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCksIG1fRGVzdEZvcm1hdCwgTlVMTCkpIHsKICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKGZsYWdzICYgRlhESUJfRE9XTlNBTVBMRSkgeworICAgIHJldHVybiBTdGFydFF1aWNrU3RyZXRjaCgpOworICB9CisgIHJldHVybiBTdGFydFN0cmV0Y2goKTsKK30KK0ZYX0JPT0wgQ0ZYX0ltYWdlU3RyZXRjaGVyOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpZiAobV9GbGFncyAmIEZYRElCX0RPV05TQU1QTEUpIHsKKyAgICByZXR1cm4gQ29udGludWVRdWlja1N0cmV0Y2gocFBhdXNlKTsKKyAgfQorICByZXR1cm4gQ29udGludWVTdHJldGNoKHBQYXVzZSk7Cit9CisjZGVmaW5lIE1BWF9QUk9HUkVTU0lWRV9TVFJFVENIX1BJWEVMUyAxMDAwMDAwCitGWF9CT09MIENGWF9JbWFnZVN0cmV0Y2hlcjo6U3RhcnRTdHJldGNoKCkgeworICBtX3BTdHJldGNoRW5naW5lID0KKyAgICAgIG5ldyBDU3RyZXRjaEVuZ2luZShtX3BEZXN0LCBtX0Rlc3RGb3JtYXQsIG1fRGVzdFdpZHRoLCBtX0Rlc3RIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbV9DbGlwUmVjdCwgbV9wU291cmNlLCBtX0ZsYWdzKTsKKyAgbV9wU3RyZXRjaEVuZ2luZS0+U3RhcnRTdHJldGNoSG9yeigpOworICBpZiAobV9wU291cmNlLT5HZXRXaWR0aCgpICogbV9wU291cmNlLT5HZXRIZWlnaHQoKSA8CisgICAgICBNQVhfUFJPR1JFU1NJVkVfU1RSRVRDSF9QSVhFTFMpIHsKKyAgICBtX3BTdHJldGNoRW5naW5lLT5Db250aW51ZShOVUxMKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENGWF9JbWFnZVN0cmV0Y2hlcjo6Q29udGludWVTdHJldGNoKElGWF9QYXVzZSogcFBhdXNlKSB7CisgIHJldHVybiBtX3BTdHJldGNoRW5naW5lICYmIG1fcFN0cmV0Y2hFbmdpbmUtPkNvbnRpbnVlKHBQYXVzZSk7Cit9CitGWF9CT09MIENGWF9JbWFnZVN0cmV0Y2hlcjo6U3RhcnRRdWlja1N0cmV0Y2goKSB7CisgIG1fYkZsaXBYID0gRkFMU0U7CisgIG1fYkZsaXBZID0gRkFMU0U7CisgIGlmIChtX0Rlc3RXaWR0aCA8IDApIHsKKyAgICBtX2JGbGlwWCA9IFRSVUU7CisgICAgbV9EZXN0V2lkdGggPSAtbV9EZXN0V2lkdGg7CisgIH0KKyAgaWYgKG1fRGVzdEhlaWdodCA8IDApIHsKKyAgICBtX2JGbGlwWSA9IFRSVUU7CisgICAgbV9EZXN0SGVpZ2h0ID0gLW1fRGVzdEhlaWdodDsKKyAgfQorICBtX0xpbmVJbmRleCA9IDA7CisgIEZYX0RXT1JEIHNpemUgPSBtX0NsaXBSZWN0LldpZHRoKCk7CisgIGlmIChzaXplICYmIG1fRGVzdEJQUCA+IChpbnQpKElOVF9NQVggLyBzaXplKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBzaXplICo9IG1fRGVzdEJQUDsKKyAgbV9wU2NhbmxpbmUgPSBGWF9BbGxvYyh1aW50OF90LCAoc2l6ZSAvIDggKyAzKSAvIDQgKiA0KTsKKyAgaWYgKG1fcFNvdXJjZS0+bV9wQWxwaGFNYXNrKSB7CisgICAgbV9wTWFza1NjYW5saW5lID0gRlhfQWxsb2ModWludDhfdCwgKG1fQ2xpcFJlY3QuV2lkdGgoKSArIDMpIC8gNCAqIDQpOworICB9CisgIGlmIChtX3BTb3VyY2UtPkdldFdpZHRoKCkgKiBtX3BTb3VyY2UtPkdldEhlaWdodCgpIDwKKyAgICAgIE1BWF9QUk9HUkVTU0lWRV9TVFJFVENIX1BJWEVMUykgeworICAgIENvbnRpbnVlUXVpY2tTdHJldGNoKE5VTEwpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0ZYX0ltYWdlU3RyZXRjaGVyOjpDb250aW51ZVF1aWNrU3RyZXRjaChJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpZiAoIW1fcFNjYW5saW5lKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGludCByZXN1bHRfd2lkdGggPSBtX0NsaXBSZWN0LldpZHRoKCksIHJlc3VsdF9oZWlnaHQgPSBtX0NsaXBSZWN0LkhlaWdodCgpOworICBpbnQgc3JjX2hlaWdodCA9IG1fcFNvdXJjZS0+R2V0SGVpZ2h0KCk7CisgIGZvciAoOyBtX0xpbmVJbmRleCA8IHJlc3VsdF9oZWlnaHQ7IG1fTGluZUluZGV4KyspIHsKKyAgICBpbnQgZGVzdF95LCBzcmNfeTsKKyAgICBpZiAobV9iRmxpcFkpIHsKKyAgICAgIGRlc3RfeSA9IHJlc3VsdF9oZWlnaHQgLSBtX0xpbmVJbmRleCAtIDE7CisgICAgICBzcmNfeSA9IChtX0Rlc3RIZWlnaHQgLSAoZGVzdF95ICsgbV9DbGlwUmVjdC50b3ApIC0gMSkgKiBzcmNfaGVpZ2h0IC8KKyAgICAgICAgICAgICAgbV9EZXN0SGVpZ2h0OworICAgIH0gZWxzZSB7CisgICAgICBkZXN0X3kgPSBtX0xpbmVJbmRleDsKKyAgICAgIHNyY195ID0gKGRlc3RfeSArIG1fQ2xpcFJlY3QudG9wKSAqIHNyY19oZWlnaHQgLyBtX0Rlc3RIZWlnaHQ7CisgICAgfQorICAgIGlmIChzcmNfeSA+PSBzcmNfaGVpZ2h0KSB7CisgICAgICBzcmNfeSA9IHNyY19oZWlnaHQgLSAxOworICAgIH0KKyAgICBpZiAoc3JjX3kgPCAwKSB7CisgICAgICBzcmNfeSA9IDA7CisgICAgfQorICAgIGlmIChtX3BTb3VyY2UtPlNraXBUb1NjYW5saW5lKHNyY195LCBwUGF1c2UpKSB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgbV9wU291cmNlLT5Eb3duU2FtcGxlU2NhbmxpbmUoc3JjX3ksIG1fcFNjYW5saW5lLCBtX0Rlc3RCUFAsIG1fRGVzdFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkZsaXBYLCBtX0NsaXBSZWN0LmxlZnQsIHJlc3VsdF93aWR0aCk7CisgICAgaWYgKG1fcE1hc2tTY2FubGluZSkgeworICAgICAgbV9wU291cmNlLT5tX3BBbHBoYU1hc2stPkRvd25TYW1wbGVTY2FubGluZSgKKyAgICAgICAgICBzcmNfeSwgbV9wTWFza1NjYW5saW5lLCAxLCBtX0Rlc3RXaWR0aCwgbV9iRmxpcFgsIG1fQ2xpcFJlY3QubGVmdCwKKyAgICAgICAgICByZXN1bHRfd2lkdGgpOworICAgIH0KKyAgICBtX3BEZXN0LT5Db21wb3NlU2NhbmxpbmUoZGVzdF95LCBtX3BTY2FubGluZSwgbV9wTWFza1NjYW5saW5lKTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfbWFpbi5jcHAgYi9jb3JlL3NyYy9meGdlL2RpYi9meF9kaWJfbWFpbi5jcHAKaW5kZXggZjU1YjJmNS4uODdjMTEzZCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX21haW4uY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl9tYWluLmNwcApAQCAtMSwxNjgxICsxLDE3MjQgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhnZS9meF9kaWIuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCIKLSNpbmNsdWRlICJkaWJfaW50LmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZGliLmgiCisKICNpbmNsdWRlIDxsaW1pdHMuaD4KLUZYX0JPT0wgQ29udmVydEJ1ZmZlcihGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsIEZYX0xQQllURSBkZXN0X2J1ZiwgaW50IGRlc3RfcGl0Y2gsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLCBpbnQgc3JjX2xlZnQsIGludCBzcmNfdG9wLCBGWF9EV09SRComIHBhbCwgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci12b2lkIENteWtEZWNvZGUoRlhfRFdPUkQgY215aywgaW50JiBjLCBpbnQmIG0sIGludCYgeSwgaW50JiBrKQotewotICAgIGMgPSBGWFNZU19HZXRDVmFsdWUoY215ayk7Ci0gICAgbSA9IEZYU1lTX0dldE1WYWx1ZShjbXlrKTsKLSAgICB5ID0gRlhTWVNfR2V0WVZhbHVlKGNteWspOwotICAgIGsgPSBGWFNZU19HZXRLVmFsdWUoY215ayk7CisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9nZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCisjaW5jbHVkZSAiZGliX2ludC5oIgorCitGWF9CT09MIENvbnZlcnRCdWZmZXIoRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wLAorICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiYgcGFsLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pOwordm9pZCBDbXlrRGVjb2RlKEZYX0RXT1JEIGNteWssIGludCYgYywgaW50JiBtLCBpbnQmIHksIGludCYgaykgeworICBjID0gRlhTWVNfR2V0Q1ZhbHVlKGNteWspOworICBtID0gRlhTWVNfR2V0TVZhbHVlKGNteWspOworICB5ID0gRlhTWVNfR2V0WVZhbHVlKGNteWspOworICBrID0gRlhTWVNfR2V0S1ZhbHVlKGNteWspOwogfQotdm9pZCBBcmdiRGVjb2RlKEZYX0RXT1JEIGFyZ2IsIGludCYgYSwgaW50JiByLCBpbnQmIGcsIGludCYgYikKLXsKLSAgICBhID0gRlhBUkdCX0EoYXJnYik7Ci0gICAgciA9IEZYQVJHQl9SKGFyZ2IpOwotICAgIGcgPSBGWEFSR0JfRyhhcmdiKTsKLSAgICBiID0gRlhBUkdCX0IoYXJnYik7Cit2b2lkIEFyZ2JEZWNvZGUoRlhfRFdPUkQgYXJnYiwgaW50JiBhLCBpbnQmIHIsIGludCYgZywgaW50JiBiKSB7CisgIGEgPSBGWEFSR0JfQShhcmdiKTsKKyAgciA9IEZYQVJHQl9SKGFyZ2IpOworICBnID0gRlhBUkdCX0coYXJnYik7CisgIGIgPSBGWEFSR0JfQihhcmdiKTsKIH0KLXZvaWQgQXJnYkRlY29kZShGWF9EV09SRCBhcmdiLCBpbnQmIGEsIEZYX0NPTE9SUkVGJiByZ2IpCi17Ci0gICAgYSA9IEZYQVJHQl9BKGFyZ2IpOwotICAgIHJnYiA9IEZYU1lTX1JHQihGWEFSR0JfUihhcmdiKSwgRlhBUkdCX0coYXJnYiksIEZYQVJHQl9CKGFyZ2IpKTsKK3ZvaWQgQXJnYkRlY29kZShGWF9EV09SRCBhcmdiLCBpbnQmIGEsIEZYX0NPTE9SUkVGJiByZ2IpIHsKKyAgYSA9IEZYQVJHQl9BKGFyZ2IpOworICByZ2IgPSBGWFNZU19SR0IoRlhBUkdCX1IoYXJnYiksIEZYQVJHQl9HKGFyZ2IpLCBGWEFSR0JfQihhcmdiKSk7CiB9Ci1GWF9EV09SRCBBcmdiRW5jb2RlKGludCBhLCBGWF9DT0xPUlJFRiByZ2IpCi17Ci0gICAgcmV0dXJuIEZYQVJHQl9NQUtFKGEsIEZYU1lTX0dldFJWYWx1ZShyZ2IpLCBGWFNZU19HZXRHVmFsdWUocmdiKSwgRlhTWVNfR2V0QlZhbHVlKHJnYikpOworRlhfRFdPUkQgQXJnYkVuY29kZShpbnQgYSwgRlhfQ09MT1JSRUYgcmdiKSB7CisgIHJldHVybiBGWEFSR0JfTUFLRShhLCBGWFNZU19HZXRSVmFsdWUocmdiKSwgRlhTWVNfR2V0R1ZhbHVlKHJnYiksCisgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRCVmFsdWUocmdiKSk7CiB9Ci1DRlhfRElCU291cmNlOjpDRlhfRElCU291cmNlKCkKLXsKLSAgICBtX2JwcCA9IDA7Ci0gICAgbV9BbHBoYUZsYWcgPSAwOwotICAgIG1fV2lkdGggPSBtX0hlaWdodCA9IDA7Ci0gICAgbV9QaXRjaCA9IDA7Ci0gICAgbV9wUGFsZXR0ZSA9IE5VTEw7Ci0gICAgbV9wQWxwaGFNYXNrID0gTlVMTDsKK0NGWF9ESUJTb3VyY2U6OkNGWF9ESUJTb3VyY2UoKSB7CisgIG1fYnBwID0gMDsKKyAgbV9BbHBoYUZsYWcgPSAwOworICBtX1dpZHRoID0gbV9IZWlnaHQgPSAwOworICBtX1BpdGNoID0gMDsKKyAgbV9wUGFsZXR0ZSA9IE5VTEw7CisgIG1fcEFscGhhTWFzayA9IE5VTEw7CiB9Ci1DRlhfRElCU291cmNlOjp+Q0ZYX0RJQlNvdXJjZSgpCi17Ci0gICAgaWYgKG1fcFBhbGV0dGUpIHsKLSAgICAgICAgRlhfRnJlZShtX3BQYWxldHRlKTsKLSAgICB9Ci0gICAgaWYgKG1fcEFscGhhTWFzaykgewotICAgICAgICBkZWxldGUgbV9wQWxwaGFNYXNrOwotICAgIH0KK0NGWF9ESUJTb3VyY2U6On5DRlhfRElCU291cmNlKCkgeworICBGWF9GcmVlKG1fcFBhbGV0dGUpOworICBkZWxldGUgbV9wQWxwaGFNYXNrOwogfQotQ0ZYX0RJQml0bWFwOjpDRlhfRElCaXRtYXAoKQotewotICAgIG1fYkV4dEJ1ZiA9IEZBTFNFOwotICAgIG1fcEJ1ZmZlciA9IE5VTEw7Ci0gICAgbV9wUGFsZXR0ZSA9IE5VTEw7CitDRlhfRElCaXRtYXA6OkNGWF9ESUJpdG1hcCgpIHsKKyAgbV9iRXh0QnVmID0gRkFMU0U7CisgIG1fcEJ1ZmZlciA9IE5VTEw7CisgIG1fcFBhbGV0dGUgPSBOVUxMOwogfQotI2RlZmluZSBfTUFYX09PTV9MSU1JVF8JMTIwMDAwMDAKLUZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpDcmVhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgZm9ybWF0LCBGWF9MUEJZVEUgcEJ1ZmZlciwgaW50IHBpdGNoKQotewotICAgIG1fcEJ1ZmZlciA9IE5VTEw7Ci0gICAgbV9icHAgPSAoRlhfQllURSlmb3JtYXQ7Ci0gICAgbV9BbHBoYUZsYWcgPSAoRlhfQllURSkoZm9ybWF0ID4+IDgpOwotICAgIG1fV2lkdGggPSBtX0hlaWdodCA9IG1fUGl0Y2ggPSAwOwotICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwIHx8IHBpdGNoIDwgMCkgeworI2RlZmluZSBfTUFYX09PTV9MSU1JVF8gMTIwMDAwMDAKK0ZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpDcmVhdGUoaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2gpIHsKKyAgbV9wQnVmZmVyID0gTlVMTDsKKyAgbV9icHAgPSAodWludDhfdClmb3JtYXQ7CisgIG1fQWxwaGFGbGFnID0gKHVpbnQ4X3QpKGZvcm1hdCA+PiA4KTsKKyAgbV9XaWR0aCA9IG1fSGVpZ2h0ID0gbV9QaXRjaCA9IDA7CisgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwIHx8IHBpdGNoIDwgMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoKElOVF9NQVggLSAzMSkgLyB3aWR0aCA8IChmb3JtYXQgJiAweGZmKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoIXBpdGNoKSB7CisgICAgcGl0Y2ggPSAod2lkdGggKiAoZm9ybWF0ICYgMHhmZikgKyAzMSkgLyAzMiAqIDQ7CisgIH0KKyAgaWYgKCgxIDw8IDMwKSAvIHBpdGNoIDwgaGVpZ2h0KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChwQnVmZmVyKSB7CisgICAgbV9wQnVmZmVyID0gcEJ1ZmZlcjsKKyAgICBtX2JFeHRCdWYgPSBUUlVFOworICB9IGVsc2UgeworICAgIGludCBzaXplID0gcGl0Y2ggKiBoZWlnaHQgKyA0OworICAgIGludCBvb21saW1pdCA9IF9NQVhfT09NX0xJTUlUXzsKKyAgICBpZiAob29tbGltaXQgPj0gMCAmJiBzaXplID49IG9vbWxpbWl0KSB7CisgICAgICBtX3BCdWZmZXIgPSBGWF9UcnlBbGxvYyh1aW50OF90LCBzaXplKTsKKyAgICAgIGlmICghbV9wQnVmZmVyKSB7CiAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKChJTlRfTUFYIC0gMzEpIC8gd2lkdGggPCAoZm9ybWF0ICYgMHhmZikpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoIXBpdGNoKSB7Ci0gICAgICAgIHBpdGNoID0gKHdpZHRoICogKGZvcm1hdCAmIDB4ZmYpICsgMzEpIC8gMzIgKiA0OwotICAgIH0KLSAgICBpZiAoKDEgPDwgMzApIC8gcGl0Y2ggPCBoZWlnaHQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAocEJ1ZmZlcikgewotICAgICAgICBtX3BCdWZmZXIgPSBwQnVmZmVyOwotICAgICAgICBtX2JFeHRCdWYgPSBUUlVFOworICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBzaXplID0gcGl0Y2ggKiBoZWlnaHQgKyA0OwotICAgICAgICBpbnQgb29tbGltaXQgPSBfTUFYX09PTV9MSU1JVF87Ci0gICAgICAgIGlmIChvb21saW1pdCA+PSAwICYmIHNpemUgPj0gb29tbGltaXQpIHsKLSAgICAgICAgICAgIG1fcEJ1ZmZlciA9IEZYX1RyeUFsbG9jKEZYX0JZVEUsIHNpemUpOwotICAgICAgICAgICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9wQnVmZmVyID0gRlhfQWxsb2MoRlhfQllURSwgc2l6ZSk7Ci0gICAgICAgIH0KKyAgICAgIG1fcEJ1ZmZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNpemUpOwogICAgIH0KLSAgICBtX1dpZHRoID0gd2lkdGg7Ci0gICAgbV9IZWlnaHQgPSBoZWlnaHQ7Ci0gICAgbV9QaXRjaCA9IHBpdGNoOwotICAgIGlmIChIYXNBbHBoYSgpICYmIGZvcm1hdCAhPSBGWERJQl9BcmdiKSB7Ci0gICAgICAgIEZYX0JPT0wgcmV0ID0gVFJVRTsKLSAgICAgICAgcmV0ID0gQnVpbGRBbHBoYU1hc2soKTsKLSAgICAgICAgaWYgKCFyZXQpIHsKLSAgICAgICAgICAgIGlmICghbV9iRXh0QnVmICYmIG1fcEJ1ZmZlcikgewotICAgICAgICAgICAgICAgIEZYX0ZyZWUobV9wQnVmZmVyKTsKLSAgICAgICAgICAgICAgICBtX3BCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIG1fV2lkdGggPSBtX0hlaWdodCA9IG1fUGl0Y2ggPSAwOwotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpDb3B5KGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMpCi17Ci0gICAgaWYgKG1fcEJ1ZmZlcikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmICghQ3JlYXRlKHBTcmMtPkdldFdpZHRoKCksIHBTcmMtPkdldEhlaWdodCgpLCBwU3JjLT5HZXRGb3JtYXQoKSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDb3B5UGFsZXR0ZShwU3JjLT5HZXRQYWxldHRlKCkpOwotICAgIENvcHlBbHBoYU1hc2socFNyYy0+bV9wQWxwaGFNYXNrKTsKLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBwU3JjLT5HZXRIZWlnaHQoKTsgcm93ICsrKSB7Ci0gICAgICAgIEZYU1lTX21lbWNweTMyKG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2gsIHBTcmMtPkdldFNjYW5saW5lKHJvdyksIG1fUGl0Y2gpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUNGWF9ESUJpdG1hcDo6fkNGWF9ESUJpdG1hcCgpCi17Ci0gICAgaWYgKG1fcEJ1ZmZlciAmJiAhbV9iRXh0QnVmKSB7CisgIH0KKyAgbV9XaWR0aCA9IHdpZHRoOworICBtX0hlaWdodCA9IGhlaWdodDsKKyAgbV9QaXRjaCA9IHBpdGNoOworICBpZiAoSGFzQWxwaGEoKSAmJiBmb3JtYXQgIT0gRlhESUJfQXJnYikgeworICAgIEZYX0JPT0wgcmV0ID0gVFJVRTsKKyAgICByZXQgPSBCdWlsZEFscGhhTWFzaygpOworICAgIGlmICghcmV0KSB7CisgICAgICBpZiAoIW1fYkV4dEJ1ZikgewogICAgICAgICBGWF9GcmVlKG1fcEJ1ZmZlcik7Ci0gICAgfQotICAgIG1fcEJ1ZmZlciA9IE5VTEw7Ci19Ci12b2lkIENGWF9ESUJpdG1hcDo6VGFrZU92ZXIoQ0ZYX0RJQml0bWFwKiBwU3JjQml0bWFwKQotewotICAgIGlmIChtX3BCdWZmZXIgJiYgIW1fYkV4dEJ1ZikgewotICAgICAgICBGWF9GcmVlKG1fcEJ1ZmZlcik7Ci0gICAgfQotICAgIGlmIChtX3BQYWxldHRlKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wUGFsZXR0ZSk7Ci0gICAgfQotICAgIGlmIChtX3BBbHBoYU1hc2spIHsKLSAgICAgICAgZGVsZXRlIG1fcEFscGhhTWFzazsKLSAgICB9Ci0gICAgbV9wQnVmZmVyID0gcFNyY0JpdG1hcC0+bV9wQnVmZmVyOwotICAgIG1fcFBhbGV0dGUgPSBwU3JjQml0bWFwLT5tX3BQYWxldHRlOwotICAgIG1fcEFscGhhTWFzayA9IHBTcmNCaXRtYXAtPm1fcEFscGhhTWFzazsKLSAgICBwU3JjQml0bWFwLT5tX3BCdWZmZXIgPSBOVUxMOwotICAgIHBTcmNCaXRtYXAtPm1fcFBhbGV0dGUgPSBOVUxMOwotICAgIHBTcmNCaXRtYXAtPm1fcEFscGhhTWFzayA9IE5VTEw7Ci0gICAgbV9icHAgPSBwU3JjQml0bWFwLT5tX2JwcDsKLSAgICBtX2JFeHRCdWYgPSBwU3JjQml0bWFwLT5tX2JFeHRCdWY7Ci0gICAgbV9BbHBoYUZsYWcgPSBwU3JjQml0bWFwLT5tX0FscGhhRmxhZzsKLSAgICBtX1dpZHRoID0gcFNyY0JpdG1hcC0+bV9XaWR0aDsKLSAgICBtX0hlaWdodCA9IHBTcmNCaXRtYXAtPm1fSGVpZ2h0OwotICAgIG1fUGl0Y2ggPSBwU3JjQml0bWFwLT5tX1BpdGNoOwotfQotQ0ZYX0RJQml0bWFwKiBDRlhfRElCU291cmNlOjpDbG9uZShjb25zdCBGWF9SRUNUKiBwQ2xpcCkgY29uc3QKLXsKLSAgICBGWF9SRUNUIHJlY3QoMCwgMCwgbV9XaWR0aCwgbV9IZWlnaHQpOwotICAgIGlmIChwQ2xpcCkgewotICAgICAgICByZWN0LkludGVyc2VjdCgqcENsaXApOwotICAgICAgICBpZiAocmVjdC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIENGWF9ESUJpdG1hcCogcE5ld0JpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7Ci0gICAgaWYgKCFwTmV3Qml0bWFwLT5DcmVhdGUocmVjdC5XaWR0aCgpLCByZWN0LkhlaWdodCgpLCBHZXRGb3JtYXQoKSkpIHsKLSAgICAgICAgZGVsZXRlIHBOZXdCaXRtYXA7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBwTmV3Qml0bWFwLT5Db3B5UGFsZXR0ZShtX3BQYWxldHRlKTsKLSAgICBwTmV3Qml0bWFwLT5Db3B5QWxwaGFNYXNrKG1fcEFscGhhTWFzaywgcENsaXApOwotICAgIGlmIChHZXRCUFAoKSA9PSAxICYmIHJlY3QubGVmdCAlIDggIT0gMCkgewotICAgICAgICBpbnQgbGVmdF9zaGlmdCA9IHJlY3QubGVmdCAlIDMyOwotICAgICAgICBpbnQgcmlnaHRfc2hpZnQgPSAzMiAtIGxlZnRfc2hpZnQ7Ci0gICAgICAgIGludCBkd29yZF9jb3VudCA9IHBOZXdCaXRtYXAtPm1fUGl0Y2ggLyA0OwotICAgICAgICBmb3IgKGludCByb3cgPSByZWN0LnRvcDsgcm93IDwgcmVjdC5ib3R0b207IHJvdyArKykgewotICAgICAgICAgICAgRlhfRFdPUkQqIHNyY19zY2FuID0gKEZYX0RXT1JEKilHZXRTY2FubGluZShyb3cpICsgcmVjdC5sZWZ0IC8gMzI7Ci0gICAgICAgICAgICBGWF9EV09SRCogZGVzdF9zY2FuID0gKEZYX0RXT1JEKilwTmV3Qml0bWFwLT5HZXRTY2FubGluZShyb3cgLSByZWN0LnRvcCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGR3b3JkX2NvdW50OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuW2ldID0gKHNyY19zY2FuW2ldIDw8IGxlZnRfc2hpZnQpIHwgKHNyY19zY2FuW2kgKyAxXSA+PiByaWdodF9zaGlmdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgY29weV9sZW4gPSAocE5ld0JpdG1hcC0+R2V0V2lkdGgoKSAqIHBOZXdCaXRtYXAtPkdldEJQUCgpICsgNykgLyA4OwotICAgICAgICBpZiAobV9QaXRjaCA8IChGWF9EV09SRCljb3B5X2xlbikgewotICAgICAgICAgICAgY29weV9sZW4gPSBtX1BpdGNoOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IHJlY3QudG9wOyByb3cgPCByZWN0LmJvdHRvbTsgcm93ICsrKSB7Ci0gICAgICAgICAgICBGWF9MUENCWVRFIHNyY19zY2FuID0gR2V0U2NhbmxpbmUocm93KSArIHJlY3QubGVmdCAqIG1fYnBwIC8gODsKLSAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X3NjYW4gPSAoRlhfTFBCWVRFKXBOZXdCaXRtYXAtPkdldFNjYW5saW5lKHJvdyAtIHJlY3QudG9wKTsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIGNvcHlfbGVuKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcE5ld0JpdG1hcDsKLX0KLXZvaWQgQ0ZYX0RJQlNvdXJjZTo6QnVpbGRQYWxldHRlKCkKLXsKLSAgICBpZiAobV9wUGFsZXR0ZSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChHZXRCUFAoKSA9PSAxKSB7Ci0gICAgICAgIG1fcFBhbGV0dGUgPSBGWF9BbGxvYyhGWF9EV09SRCwgMik7Ci0gICAgICAgIGlmKElzQ215a0ltYWdlKCkpIHsKLSAgICAgICAgICAgIG1fcFBhbGV0dGVbMF0gPSAweGZmOwotICAgICAgICAgICAgbV9wUGFsZXR0ZVsxXSA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX3BQYWxldHRlWzBdID0gMHhmZjAwMDAwMDsKLSAgICAgICAgICAgIG1fcFBhbGV0dGVbMV0gPSAweGZmZmZmZmZmOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChHZXRCUFAoKSA9PSA4KSB7Ci0gICAgICAgIG1fcFBhbGV0dGUgPSBGWF9BbGxvYyhGWF9EV09SRCwgMjU2KTsKLSAgICAgICAgaWYoSXNDbXlrSW1hZ2UoKSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBtX3BQYWxldHRlW2ldID0gMHhmZiAtIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSArKykgewotICAgICAgICAgICAgICAgIG1fcFBhbGV0dGVbaV0gPSAweGZmMDAwMDAwIHwgKGkgKiAweDEwMTAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLUZYX0JPT0wgQ0ZYX0RJQlNvdXJjZTo6QnVpbGRBbHBoYU1hc2soKQotewotICAgIGlmIChtX3BBbHBoYU1hc2spIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIG1fcEFscGhhTWFzayA9IG5ldyBDRlhfRElCaXRtYXA7Ci0gICAgaWYgKCFtX3BBbHBoYU1hc2stPkNyZWF0ZShtX1dpZHRoLCBtX0hlaWdodCwgRlhESUJfOGJwcE1hc2spKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BBbHBoYU1hc2s7Ci0gICAgICAgIG1fcEFscGhhTWFzayA9IE5VTEw7CisgICAgICAgIG1fcEJ1ZmZlciA9IE5VTEw7CisgICAgICAgIG1fV2lkdGggPSBtX0hlaWdodCA9IG1fUGl0Y2ggPSAwOwogICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CiAgICAgfQotICAgIEZYU1lTX21lbXNldDgobV9wQWxwaGFNYXNrLT5HZXRCdWZmZXIoKSwgMHhmZiwgbV9wQWxwaGFNYXNrLT5HZXRIZWlnaHQoKSptX3BBbHBoYU1hc2stPkdldFBpdGNoKCkpOwotICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBUUlVFOwogfQotRlhfRFdPUkQgQ0ZYX0RJQlNvdXJjZTo6R2V0UGFsZXR0ZUVudHJ5KGludCBpbmRleCkgY29uc3QKLXsKLSAgICBBU1NFUlQoKEdldEJQUCgpID09IDEgfHwgR2V0QlBQKCkgPT0gOCkgJiYgIUlzQWxwaGFNYXNrKCkpOwotICAgIGlmIChtX3BQYWxldHRlKSB7Ci0gICAgICAgIHJldHVybiBtX3BQYWxldHRlW2luZGV4XTsKK0ZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpDb3B5KGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMpIHsKKyAgaWYgKG1fcEJ1ZmZlcikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoIUNyZWF0ZShwU3JjLT5HZXRXaWR0aCgpLCBwU3JjLT5HZXRIZWlnaHQoKSwgcFNyYy0+R2V0Rm9ybWF0KCkpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENvcHlQYWxldHRlKHBTcmMtPkdldFBhbGV0dGUoKSk7CisgIENvcHlBbHBoYU1hc2socFNyYy0+bV9wQWxwaGFNYXNrKTsKKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgcFNyYy0+R2V0SGVpZ2h0KCk7IHJvdysrKSB7CisgICAgRlhTWVNfbWVtY3B5KG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2gsIHBTcmMtPkdldFNjYW5saW5lKHJvdyksIG1fUGl0Y2gpOworICB9CisgIHJldHVybiBUUlVFOworfQorQ0ZYX0RJQml0bWFwOjp+Q0ZYX0RJQml0bWFwKCkgeworICBpZiAoIW1fYkV4dEJ1ZikgeworICAgIEZYX0ZyZWUobV9wQnVmZmVyKTsKKyAgfQorICBtX3BCdWZmZXIgPSBOVUxMOworfQordm9pZCBDRlhfRElCaXRtYXA6OlRha2VPdmVyKENGWF9ESUJpdG1hcCogcFNyY0JpdG1hcCkgeworICBpZiAoIW1fYkV4dEJ1ZikgeworICAgIEZYX0ZyZWUobV9wQnVmZmVyKTsKKyAgfQorICBGWF9GcmVlKG1fcFBhbGV0dGUpOworICBkZWxldGUgbV9wQWxwaGFNYXNrOworICBtX3BCdWZmZXIgPSBwU3JjQml0bWFwLT5tX3BCdWZmZXI7CisgIG1fcFBhbGV0dGUgPSBwU3JjQml0bWFwLT5tX3BQYWxldHRlOworICBtX3BBbHBoYU1hc2sgPSBwU3JjQml0bWFwLT5tX3BBbHBoYU1hc2s7CisgIHBTcmNCaXRtYXAtPm1fcEJ1ZmZlciA9IE5VTEw7CisgIHBTcmNCaXRtYXAtPm1fcFBhbGV0dGUgPSBOVUxMOworICBwU3JjQml0bWFwLT5tX3BBbHBoYU1hc2sgPSBOVUxMOworICBtX2JwcCA9IHBTcmNCaXRtYXAtPm1fYnBwOworICBtX2JFeHRCdWYgPSBwU3JjQml0bWFwLT5tX2JFeHRCdWY7CisgIG1fQWxwaGFGbGFnID0gcFNyY0JpdG1hcC0+bV9BbHBoYUZsYWc7CisgIG1fV2lkdGggPSBwU3JjQml0bWFwLT5tX1dpZHRoOworICBtX0hlaWdodCA9IHBTcmNCaXRtYXAtPm1fSGVpZ2h0OworICBtX1BpdGNoID0gcFNyY0JpdG1hcC0+bV9QaXRjaDsKK30KK0NGWF9ESUJpdG1hcCogQ0ZYX0RJQlNvdXJjZTo6Q2xvbmUoY29uc3QgRlhfUkVDVCogcENsaXApIGNvbnN0IHsKKyAgRlhfUkVDVCByZWN0KDAsIDAsIG1fV2lkdGgsIG1fSGVpZ2h0KTsKKyAgaWYgKHBDbGlwKSB7CisgICAgcmVjdC5JbnRlcnNlY3QoKnBDbGlwKTsKKyAgICBpZiAocmVjdC5Jc0VtcHR5KCkpIHsKKyAgICAgIHJldHVybiBOVUxMOwogICAgIH0KKyAgfQorICBDRlhfRElCaXRtYXAqIHBOZXdCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOworICBpZiAoIXBOZXdCaXRtYXAtPkNyZWF0ZShyZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCksIEdldEZvcm1hdCgpKSkgeworICAgIGRlbGV0ZSBwTmV3Qml0bWFwOworICAgIHJldHVybiBOVUxMOworICB9CisgIHBOZXdCaXRtYXAtPkNvcHlQYWxldHRlKG1fcFBhbGV0dGUpOworICBwTmV3Qml0bWFwLT5Db3B5QWxwaGFNYXNrKG1fcEFscGhhTWFzaywgcENsaXApOworICBpZiAoR2V0QlBQKCkgPT0gMSAmJiByZWN0LmxlZnQgJSA4ICE9IDApIHsKKyAgICBpbnQgbGVmdF9zaGlmdCA9IHJlY3QubGVmdCAlIDMyOworICAgIGludCByaWdodF9zaGlmdCA9IDMyIC0gbGVmdF9zaGlmdDsKKyAgICBpbnQgZHdvcmRfY291bnQgPSBwTmV3Qml0bWFwLT5tX1BpdGNoIC8gNDsKKyAgICBmb3IgKGludCByb3cgPSByZWN0LnRvcDsgcm93IDwgcmVjdC5ib3R0b207IHJvdysrKSB7CisgICAgICBGWF9EV09SRCogc3JjX3NjYW4gPSAoRlhfRFdPUkQqKUdldFNjYW5saW5lKHJvdykgKyByZWN0LmxlZnQgLyAzMjsKKyAgICAgIEZYX0RXT1JEKiBkZXN0X3NjYW4gPSAoRlhfRFdPUkQqKXBOZXdCaXRtYXAtPkdldFNjYW5saW5lKHJvdyAtIHJlY3QudG9wKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZHdvcmRfY291bnQ7IGkrKykgeworICAgICAgICBkZXN0X3NjYW5baV0gPQorICAgICAgICAgICAgKHNyY19zY2FuW2ldIDw8IGxlZnRfc2hpZnQpIHwgKHNyY19zY2FuW2kgKyAxXSA+PiByaWdodF9zaGlmdCk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGludCBjb3B5X2xlbiA9IChwTmV3Qml0bWFwLT5HZXRXaWR0aCgpICogcE5ld0JpdG1hcC0+R2V0QlBQKCkgKyA3KSAvIDg7CisgICAgaWYgKG1fUGl0Y2ggPCAoRlhfRFdPUkQpY29weV9sZW4pIHsKKyAgICAgIGNvcHlfbGVuID0gbV9QaXRjaDsKKyAgICB9CisgICAgZm9yIChpbnQgcm93ID0gcmVjdC50b3A7IHJvdyA8IHJlY3QuYm90dG9tOyByb3crKykgeworICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBHZXRTY2FubGluZShyb3cpICsgcmVjdC5sZWZ0ICogbV9icHAgLyA4OworICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gKHVpbnQ4X3QqKXBOZXdCaXRtYXAtPkdldFNjYW5saW5lKHJvdyAtIHJlY3QudG9wKTsKKyAgICAgIEZYU1lTX21lbWNweShkZXN0X3NjYW4sIHNyY19zY2FuLCBjb3B5X2xlbik7CisgICAgfQorICB9CisgIHJldHVybiBwTmV3Qml0bWFwOworfQordm9pZCBDRlhfRElCU291cmNlOjpCdWlsZFBhbGV0dGUoKSB7CisgIGlmIChtX3BQYWxldHRlKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChHZXRCUFAoKSA9PSAxKSB7CisgICAgbV9wUGFsZXR0ZSA9IEZYX0FsbG9jKEZYX0RXT1JELCAyKTsKICAgICBpZiAoSXNDbXlrSW1hZ2UoKSkgewotICAgICAgICBpZiAoR2V0QlBQKCkgPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIGluZGV4ID8gMCA6IDB4ZmY7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDB4ZmYgLSBpbmRleDsKKyAgICAgIG1fcFBhbGV0dGVbMF0gPSAweGZmOworICAgICAgbV9wUGFsZXR0ZVsxXSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fcFBhbGV0dGVbMF0gPSAweGZmMDAwMDAwOworICAgICAgbV9wUGFsZXR0ZVsxXSA9IDB4ZmZmZmZmZmY7CisgICAgfQorICB9IGVsc2UgaWYgKEdldEJQUCgpID09IDgpIHsKKyAgICBtX3BQYWxldHRlID0gRlhfQWxsb2MoRlhfRFdPUkQsIDI1Nik7CisgICAgaWYgKElzQ215a0ltYWdlKCkpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgbV9wUGFsZXR0ZVtpXSA9IDB4ZmYgLSBpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIG1fcFBhbGV0dGVbaV0gPSAweGZmMDAwMDAwIHwgKGkgKiAweDEwMTAxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KK0ZYX0JPT0wgQ0ZYX0RJQlNvdXJjZTo6QnVpbGRBbHBoYU1hc2soKSB7CisgIGlmIChtX3BBbHBoYU1hc2spIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBtX3BBbHBoYU1hc2sgPSBuZXcgQ0ZYX0RJQml0bWFwOworICBpZiAoIW1fcEFscGhhTWFzay0+Q3JlYXRlKG1fV2lkdGgsIG1fSGVpZ2h0LCBGWERJQl84YnBwTWFzaykpIHsKKyAgICBkZWxldGUgbV9wQWxwaGFNYXNrOworICAgIG1fcEFscGhhTWFzayA9IE5VTEw7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYU1lTX21lbXNldChtX3BBbHBoYU1hc2stPkdldEJ1ZmZlcigpLCAweGZmLAorICAgICAgICAgICAgICAgbV9wQWxwaGFNYXNrLT5HZXRIZWlnaHQoKSAqIG1fcEFscGhhTWFzay0+R2V0UGl0Y2goKSk7CisgIHJldHVybiBUUlVFOworfQorRlhfRFdPUkQgQ0ZYX0RJQlNvdXJjZTo6R2V0UGFsZXR0ZUVudHJ5KGludCBpbmRleCkgY29uc3QgeworICBBU1NFUlQoKEdldEJQUCgpID09IDEgfHwgR2V0QlBQKCkgPT0gOCkgJiYgIUlzQWxwaGFNYXNrKCkpOworICBpZiAobV9wUGFsZXR0ZSkgeworICAgIHJldHVybiBtX3BQYWxldHRlW2luZGV4XTsKKyAgfQorICBpZiAoSXNDbXlrSW1hZ2UoKSkgeworICAgIGlmIChHZXRCUFAoKSA9PSAxKSB7CisgICAgICByZXR1cm4gaW5kZXggPyAwIDogMHhmZjsKKyAgICB9CisgICAgcmV0dXJuIDB4ZmYgLSBpbmRleDsKKyAgfQorICBpZiAoR2V0QlBQKCkgPT0gMSkgeworICAgIHJldHVybiBpbmRleCA/IDB4ZmZmZmZmZmYgOiAweGZmMDAwMDAwOworICB9CisgIHJldHVybiBpbmRleCAqIDB4MTAxMDEgfCAweGZmMDAwMDAwOworfQordm9pZCBDRlhfRElCU291cmNlOjpTZXRQYWxldHRlRW50cnkoaW50IGluZGV4LCBGWF9EV09SRCBjb2xvcikgeworICBBU1NFUlQoKEdldEJQUCgpID09IDEgfHwgR2V0QlBQKCkgPT0gOCkgJiYgIUlzQWxwaGFNYXNrKCkpOworICBpZiAoIW1fcFBhbGV0dGUpIHsKKyAgICBCdWlsZFBhbGV0dGUoKTsKKyAgfQorICBtX3BQYWxldHRlW2luZGV4XSA9IGNvbG9yOworfQoraW50IENGWF9ESUJTb3VyY2U6OkZpbmRQYWxldHRlKEZYX0RXT1JEIGNvbG9yKSBjb25zdCB7CisgIEFTU0VSVCgoR2V0QlBQKCkgPT0gMSB8fCBHZXRCUFAoKSA9PSA4KSAmJiAhSXNBbHBoYU1hc2soKSk7CisgIGlmICghbV9wUGFsZXR0ZSkgeworICAgIGlmIChJc0NteWtJbWFnZSgpKSB7CisgICAgICBpZiAoR2V0QlBQKCkgPT0gMSkgeworICAgICAgICByZXR1cm4gKCh1aW50OF90KWNvbG9yID09IDB4ZmYpID8gMCA6IDE7CisgICAgICB9CisgICAgICByZXR1cm4gMHhmZiAtICh1aW50OF90KWNvbG9yOwogICAgIH0KICAgICBpZiAoR2V0QlBQKCkgPT0gMSkgewotICAgICAgICByZXR1cm4gaW5kZXggPyAweGZmZmZmZmZmIDogMHhmZjAwMDAwMDsKKyAgICAgIHJldHVybiAoKHVpbnQ4X3QpY29sb3IgPT0gMHhmZikgPyAxIDogMDsKICAgICB9Ci0gICAgcmV0dXJuIGluZGV4ICogMHgxMDEwMSB8IDB4ZmYwMDAwMDA7CisgICAgcmV0dXJuICh1aW50OF90KWNvbG9yOworICB9CisgIGludCBwYWxzaXplID0gKDEgPDwgR2V0QlBQKCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IHBhbHNpemU7IGkrKykKKyAgICBpZiAobV9wUGFsZXR0ZVtpXSA9PSBjb2xvcikgeworICAgICAgcmV0dXJuIGk7CisgICAgfQorICByZXR1cm4gLTE7CiB9Ci12b2lkIENGWF9ESUJTb3VyY2U6OlNldFBhbGV0dGVFbnRyeShpbnQgaW5kZXgsIEZYX0RXT1JEIGNvbG9yKQotewotICAgIEFTU0VSVCgoR2V0QlBQKCkgPT0gMSB8fCBHZXRCUFAoKSA9PSA4KSAmJiAhSXNBbHBoYU1hc2soKSk7Ci0gICAgaWYgKG1fcFBhbGV0dGUgPT0gTlVMTCkgewotICAgICAgICBCdWlsZFBhbGV0dGUoKTsKK3ZvaWQgQ0ZYX0RJQml0bWFwOjpDbGVhcihGWF9EV09SRCBjb2xvcikgeworICBpZiAoIW1fcEJ1ZmZlcikgeworICAgIHJldHVybjsKKyAgfQorICBzd2l0Y2ggKEdldEZvcm1hdCgpKSB7CisgICAgY2FzZSBGWERJQl8xYnBwTWFzazoKKyAgICAgIEZYU1lTX21lbXNldChtX3BCdWZmZXIsIChjb2xvciAmIDB4ZmYwMDAwMDApID8gMHhmZiA6IDAsCisgICAgICAgICAgICAgICAgICAgbV9QaXRjaCAqIG1fSGVpZ2h0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfMWJwcFJnYjogeworICAgICAgaW50IGluZGV4ID0gRmluZFBhbGV0dGUoY29sb3IpOworICAgICAgRlhTWVNfbWVtc2V0KG1fcEJ1ZmZlciwgaW5kZXggPyAweGZmIDogMCwgbV9QaXRjaCAqIG1fSGVpZ2h0KTsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICBtX3BQYWxldHRlW2luZGV4XSA9IGNvbG9yOworICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6CisgICAgICBGWFNZU19tZW1zZXQobV9wQnVmZmVyLCBjb2xvciA+PiAyNCwgbV9QaXRjaCAqIG1fSGVpZ2h0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfOGJwcFJnYjogeworICAgICAgaW50IGluZGV4ID0gRmluZFBhbGV0dGUoY29sb3IpOworICAgICAgRlhTWVNfbWVtc2V0KG1fcEJ1ZmZlciwgaW5kZXgsIG1fUGl0Y2ggKiBtX0hlaWdodCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGWERJQl9SZ2I6CisgICAgY2FzZSBGWERJQl9SZ2JhOiB7CisgICAgICBpbnQgYSwgciwgZywgYjsKKyAgICAgIEFyZ2JEZWNvZGUoY29sb3IsIGEsIHIsIGcsIGIpOworICAgICAgaWYgKHIgPT0gZyAmJiBnID09IGIpIHsKKyAgICAgICAgRlhTWVNfbWVtc2V0KG1fcEJ1ZmZlciwgciwgbV9QaXRjaCAqIG1fSGVpZ2h0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCBieXRlX3BvcyA9IDA7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgbV9wQnVmZmVyW2J5dGVfcG9zKytdID0gYjsKKyAgICAgICAgICBtX3BCdWZmZXJbYnl0ZV9wb3MrK10gPSBnOworICAgICAgICAgIG1fcEJ1ZmZlcltieXRlX3BvcysrXSA9IHI7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgcm93ID0gMTsgcm93IDwgbV9IZWlnaHQ7IHJvdysrKSB7CisgICAgICAgICAgRlhTWVNfbWVtY3B5KG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2gsIG1fcEJ1ZmZlciwgbV9QaXRjaCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZYRElCX1JnYjMyOgorICAgIGNhc2UgRlhESUJfQXJnYjogeworICAgICAgY29sb3IgPSBJc0NteWtJbWFnZSgpID8gRlhDTVlLX1RPRElCKGNvbG9yKSA6IEZYQVJHQl9UT0RJQihjb2xvcik7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fV2lkdGg7IGkrKykgeworICAgICAgICAoKEZYX0RXT1JEKiltX3BCdWZmZXIpW2ldID0gY29sb3I7CisgICAgICB9CisgICAgICBmb3IgKGludCByb3cgPSAxOyByb3cgPCBtX0hlaWdodDsgcm93KyspIHsKKyAgICAgICAgRlhTWVNfbWVtY3B5KG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2gsIG1fcEJ1ZmZlciwgbV9QaXRjaCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CiB9Ci1pbnQgQ0ZYX0RJQlNvdXJjZTo6RmluZFBhbGV0dGUoRlhfRFdPUkQgY29sb3IpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKChHZXRCUFAoKSA9PSAxIHx8IEdldEJQUCgpID09IDgpICYmICFJc0FscGhhTWFzaygpKTsKLSAgICBpZiAobV9wUGFsZXR0ZSA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChJc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgICAgICBpZiAoR2V0QlBQKCkgPT0gMSkgewotICAgICAgICAgICAgICAgIHJldHVybiAoKEZYX0JZVEUpY29sb3IgPT0gMHhmZikgPyAwIDogMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAweGZmIC0gKEZYX0JZVEUpY29sb3I7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEdldEJQUCgpID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEZYX0JZVEUpY29sb3IgPT0gMHhmZikgPyAxIDogMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKEZYX0JZVEUpY29sb3I7Ci0gICAgfQotICAgIGludCBwYWxzaXplID0gKDEgPDwgR2V0QlBQKCkpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsc2l6ZTsgaSArKykKLSAgICAgICAgaWYgKG1fcFBhbGV0dGVbaV0gPT0gY29sb3IpIHsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgcmV0dXJuIC0xOwordm9pZCBDRlhfRElCU291cmNlOjpHZXRPdmVybGFwUmVjdChpbnQmIGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHNyY190b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbikgeworICBpZiAod2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBBU1NFUlQod2lkdGggPiAwICYmIGhlaWdodCA+IDApOworICBpZiAoZGVzdF9sZWZ0ID4gbV9XaWR0aCB8fCBkZXN0X3RvcCA+IG1fSGVpZ2h0KSB7CisgICAgd2lkdGggPSAwOworICAgIGhlaWdodCA9IDA7CisgICAgcmV0dXJuOworICB9CisgIGludCB4X29mZnNldCA9IGRlc3RfbGVmdCAtIHNyY19sZWZ0OworICBpbnQgeV9vZmZzZXQgPSBkZXN0X3RvcCAtIHNyY190b3A7CisgIEZYX1JFQ1Qgc3JjX3JlY3Qoc3JjX2xlZnQsIHNyY190b3AsIHNyY19sZWZ0ICsgd2lkdGgsIHNyY190b3AgKyBoZWlnaHQpOworICBGWF9SRUNUIHNyY19ib3VuZCgwLCAwLCBzcmNfd2lkdGgsIHNyY19oZWlnaHQpOworICBzcmNfcmVjdC5JbnRlcnNlY3Qoc3JjX2JvdW5kKTsKKyAgRlhfUkVDVCBkZXN0X3JlY3Qoc3JjX3JlY3QubGVmdCArIHhfb2Zmc2V0LCBzcmNfcmVjdC50b3AgKyB5X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgc3JjX3JlY3QucmlnaHQgKyB4X29mZnNldCwgc3JjX3JlY3QuYm90dG9tICsgeV9vZmZzZXQpOworICBGWF9SRUNUIGRlc3RfYm91bmQoMCwgMCwgbV9XaWR0aCwgbV9IZWlnaHQpOworICBkZXN0X3JlY3QuSW50ZXJzZWN0KGRlc3RfYm91bmQpOworICBpZiAocENsaXBSZ24pIHsKKyAgICBkZXN0X3JlY3QuSW50ZXJzZWN0KHBDbGlwUmduLT5HZXRCb3goKSk7CisgIH0KKyAgZGVzdF9sZWZ0ID0gZGVzdF9yZWN0LmxlZnQ7CisgIGRlc3RfdG9wID0gZGVzdF9yZWN0LnRvcDsKKyAgc3JjX2xlZnQgPSBkZXN0X2xlZnQgLSB4X29mZnNldDsKKyAgc3JjX3RvcCA9IGRlc3RfdG9wIC0geV9vZmZzZXQ7CisgIHdpZHRoID0gZGVzdF9yZWN0LnJpZ2h0IC0gZGVzdF9yZWN0LmxlZnQ7CisgIGhlaWdodCA9IGRlc3RfcmVjdC5ib3R0b20gLSBkZXN0X3JlY3QudG9wOwogfQotdm9pZCBDRlhfRElCaXRtYXA6OkNsZWFyKEZYX0RXT1JEIGNvbG9yKQotewotICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN3aXRjaCAoR2V0Rm9ybWF0KCkpIHsKLSAgICAgICAgY2FzZSBGWERJQl8xYnBwTWFzazoKLSAgICAgICAgICAgIEZYU1lTX21lbXNldDgobV9wQnVmZmVyLCAoY29sb3IgJiAweGZmMDAwMDAwKSA/IDB4ZmYgOiAwLCBtX1BpdGNoICogbV9IZWlnaHQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhESUJfMWJwcFJnYjogewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IEZpbmRQYWxldHRlKGNvbG9yKTsKLSAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQ4KG1fcEJ1ZmZlciwgaW5kZXggPyAweGZmIDogMCwgbV9QaXRjaCAqIG1fSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGWERJQl84YnBwTWFzazoKLSAgICAgICAgICAgIEZYU1lTX21lbXNldDgobV9wQnVmZmVyLCBjb2xvciA+PiAyNCwgbV9QaXRjaCAqIG1fSGVpZ2h0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCXzhicHBSZ2I6IHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBGaW5kUGFsZXR0ZShjb2xvcik7Ci0gICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0OChtX3BCdWZmZXIsIGluZGV4LCBtX1BpdGNoICogbV9IZWlnaHQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIEZYRElCX1JnYjoKLSAgICAgICAgY2FzZSBGWERJQl9SZ2JhOiB7Ci0gICAgICAgICAgICAgICAgaW50IGEsIHIsIGcsIGI7Ci0gICAgICAgICAgICAgICAgQXJnYkRlY29kZShjb2xvciwgYSwgciwgZywgYik7Ci0gICAgICAgICAgICAgICAgaWYgKHIgPT0gZyAmJiBnID09IGIpIHsKLSAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0OChtX3BCdWZmZXIsIHIsIG1fUGl0Y2ggKiBtX0hlaWdodCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVfcG9zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BCdWZmZXJbYnl0ZV9wb3MrK10gPSBiOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9wQnVmZmVyW2J5dGVfcG9zKytdID0gZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcEJ1ZmZlcltieXRlX3BvcysrXSA9IHI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMTsgcm93IDwgbV9IZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIobV9wQnVmZmVyICsgcm93ICogbV9QaXRjaCwgbV9wQnVmZmVyLCBtX1BpdGNoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGWERJQl9SZ2IzMjoKLSAgICAgICAgY2FzZSBGWERJQl9BcmdiOiB7Ci0gICAgICAgICAgICAgICAgY29sb3IgPSBJc0NteWtJbWFnZSgpID8gRlhDTVlLX1RPRElCKGNvbG9yKSA6IEZYQVJHQl9UT0RJQihjb2xvcik7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1dpZHRoOyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICgoRlhfRFdPUkQqKW1fcEJ1ZmZlcilbaV0gPSBjb2xvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMTsgcm93IDwgbV9IZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkzMihtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoLCBtX3BCdWZmZXIsIG1fUGl0Y2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLXZvaWQgQ0ZYX0RJQlNvdXJjZTo6R2V0T3ZlcmxhcFJlY3QoaW50JiBkZXN0X2xlZnQsIGludCYgZGVzdF90b3AsIGludCYgd2lkdGgsIGludCYgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3dpZHRoLCBpbnQgc3JjX2hlaWdodCwgaW50JiBzcmNfbGVmdCwgaW50JiBzcmNfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24pCi17Ci0gICAgaWYgKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBU1NFUlQod2lkdGggPiAwICYmIGhlaWdodCA+IDApOwotICAgIGlmIChkZXN0X2xlZnQgPiBtX1dpZHRoIHx8IGRlc3RfdG9wID4gbV9IZWlnaHQpIHsKLSAgICAgICAgd2lkdGggPSAwOwotICAgICAgICBoZWlnaHQgPSAwOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludCB4X29mZnNldCA9IGRlc3RfbGVmdCAtIHNyY19sZWZ0OwotICAgIGludCB5X29mZnNldCA9IGRlc3RfdG9wIC0gc3JjX3RvcDsKLSAgICBGWF9SRUNUIHNyY19yZWN0KHNyY19sZWZ0LCBzcmNfdG9wLCBzcmNfbGVmdCArIHdpZHRoLCBzcmNfdG9wICsgaGVpZ2h0KTsKLSAgICBGWF9SRUNUIHNyY19ib3VuZCgwLCAwLCBzcmNfd2lkdGgsIHNyY19oZWlnaHQpOwotICAgIHNyY19yZWN0LkludGVyc2VjdChzcmNfYm91bmQpOwotICAgIEZYX1JFQ1QgZGVzdF9yZWN0KHNyY19yZWN0LmxlZnQgKyB4X29mZnNldCwgc3JjX3JlY3QudG9wICsgeV9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgc3JjX3JlY3QucmlnaHQgKyB4X29mZnNldCwgc3JjX3JlY3QuYm90dG9tICsgeV9vZmZzZXQpOwotICAgIEZYX1JFQ1QgZGVzdF9ib3VuZCgwLCAwLCBtX1dpZHRoLCBtX0hlaWdodCk7Ci0gICAgZGVzdF9yZWN0LkludGVyc2VjdChkZXN0X2JvdW5kKTsKLSAgICBpZiAocENsaXBSZ24pIHsKLSAgICAgICAgZGVzdF9yZWN0LkludGVyc2VjdChwQ2xpcFJnbi0+R2V0Qm94KCkpOwotICAgIH0KLSAgICBkZXN0X2xlZnQgPSBkZXN0X3JlY3QubGVmdDsKLSAgICBkZXN0X3RvcCA9IGRlc3RfcmVjdC50b3A7Ci0gICAgc3JjX2xlZnQgPSBkZXN0X2xlZnQgLSB4X29mZnNldDsKLSAgICBzcmNfdG9wID0gZGVzdF90b3AgLSB5X29mZnNldDsKLSAgICB3aWR0aCA9IGRlc3RfcmVjdC5yaWdodCAtIGRlc3RfcmVjdC5sZWZ0OwotICAgIGhlaWdodCA9IGRlc3RfcmVjdC5ib3R0b20gLSBkZXN0X3JlY3QudG9wOwotfQotRlhfQk9PTCBDRlhfRElCaXRtYXA6OlRyYW5zZmVyQml0bWFwKGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIGludCBzcmNfbGVmdCwgaW50IHNyY190b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgR2V0T3ZlcmxhcFJlY3QoZGVzdF9sZWZ0LCBkZXN0X3RvcCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcC0+R2V0V2lkdGgoKSwgcFNyY0JpdG1hcC0+R2V0SGVpZ2h0KCksIHNyY19sZWZ0LCBzcmNfdG9wLCBOVUxMKTsKLSAgICBpZiAod2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0ID0gR2V0Rm9ybWF0KCk7Ci0gICAgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQgPSBwU3JjQml0bWFwLT5HZXRGb3JtYXQoKTsKLSAgICBpZiAoZGVzdF9mb3JtYXQgPT0gc3JjX2Zvcm1hdCAmJiBwSWNjVHJhbnNmb3JtID09IE5VTEwpIHsKLSAgICAgICAgaWYgKEdldEJQUCgpID09IDEpIHsKLSAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgRlhfTFBCWVRFIGRlc3Rfc2NhbiA9IG1fcEJ1ZmZlciArIChkZXN0X3RvcCArIHJvdykgKiBtX1BpdGNoOwotICAgICAgICAgICAgICAgIEZYX0xQQ0JZVEUgc3JjX3NjYW4gPSBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsoZGVzdF9sZWZ0ICsgY29sKSAvIDhdIHw9IDEgPDwgKDcgLSAoZGVzdF9sZWZ0ICsgY29sKSAlIDgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWyhkZXN0X2xlZnQgKyBjb2wpIC8gOF0gJj0gfigxIDw8ICg3IC0gKGRlc3RfbGVmdCArIGNvbCkgJSA4KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgQnBwID0gR2V0QlBQKCkgLyA4OwotICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgICAgICBGWF9MUEJZVEUgZGVzdF9zY2FuID0gbV9wQnVmZmVyICsgKGRlc3RfdG9wICsgcm93KSAqIG1fUGl0Y2ggKyBkZXN0X2xlZnQgKiBCcHA7Ci0gICAgICAgICAgICAgICAgRlhfTFBDQllURSBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiBCcHA7Ci0gICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGggKiBCcHApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1fcFBhbGV0dGUpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9icHAgPT0gOCkgewotICAgICAgICAgICAgZGVzdF9mb3JtYXQgPSBGWERJQl84YnBwTWFzazsKLSAgICAgICAgfQotICAgICAgICBGWF9MUEJZVEUgZGVzdF9idWYgPSBtX3BCdWZmZXIgKyBkZXN0X3RvcCAqIG1fUGl0Y2ggKyBkZXN0X2xlZnQgKiBHZXRCUFAoKSAvIDg7Ci0gICAgICAgIEZYX0RXT1JEKiBkX3BsdCA9IE5VTEw7Ci0gICAgICAgIGlmKCFDb252ZXJ0QnVmZmVyKGRlc3RfZm9ybWF0LCBkZXN0X2J1ZiwgbV9QaXRjaCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3AsIGRfcGx0LCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQorRlhfQk9PTCBDRlhfRElCaXRtYXA6OlRyYW5zZmVyQml0bWFwKGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgaWYgKCFtX3BCdWZmZXIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgR2V0T3ZlcmxhcFJlY3QoZGVzdF9sZWZ0LCBkZXN0X3RvcCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcC0+R2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgcFNyY0JpdG1hcC0+R2V0SGVpZ2h0KCksIHNyY19sZWZ0LCBzcmNfdG9wLCBOVUxMKTsKKyAgaWYgKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApIHsKICAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpUcmFuc2Zlck1hc2soaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBNYXNrLCBGWF9EV09SRCBjb2xvciwgaW50IHNyY19sZWZ0LCBpbnQgc3JjX3RvcCwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQVNTRVJUKEhhc0FscGhhKCkgJiYgKG1fYnBwID49IDI0KSk7Ci0gICAgQVNTRVJUKHBNYXNrLT5Jc0FscGhhTWFzaygpKTsKLSAgICBpZiAoIUhhc0FscGhhKCkgfHwgIXBNYXNrLT5Jc0FscGhhTWFzaygpIHx8IG1fYnBwIDwgMjQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBHZXRPdmVybGFwUmVjdChkZXN0X2xlZnQsIGRlc3RfdG9wLCB3aWR0aCwgaGVpZ2h0LCBwTWFzay0+R2V0V2lkdGgoKSwgcE1hc2stPkdldEhlaWdodCgpLCBzcmNfbGVmdCwgc3JjX3RvcCwgTlVMTCk7Ci0gICAgaWYgKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGludCBzcmNfYnBwID0gcE1hc2stPkdldEJQUCgpOwotICAgIGludCBhbHBoYTsKLSAgICBGWF9EV09SRCBkc3RfY29sb3I7Ci0gICAgaWYgKGFscGhhX2ZsYWcgPj4gOCkgewotICAgICAgICBhbHBoYSA9IGFscGhhX2ZsYWcgJiAweGZmOwotICAgICAgICBkc3RfY29sb3IgPSBGWENNWUtfVE9ESUIoY29sb3IpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGFscGhhID0gRlhBUkdCX0EoY29sb3IpOwotICAgICAgICBkc3RfY29sb3IgPSBGWEFSR0JfVE9ESUIoY29sb3IpOwotICAgIH0KLSAgICBGWF9MUEJZVEUgY29sb3JfcCA9IChGWF9MUEJZVEUpJmRzdF9jb2xvcjsKLSAgICBpZiAocEljY1RyYW5zZm9ybSAmJiBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpICYmIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpKSB7Ci0gICAgICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgY29sb3JfcCwgY29sb3JfcCwgMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGFscGhhX2ZsYWcgPj4gOCAmJiAhSXNDbXlrSW1hZ2UoKSkKLSAgICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUoY29sb3IpLCBGWFNZU19HZXRNVmFsdWUoY29sb3IpLCBGWFNZU19HZXRZVmFsdWUoY29sb3IpLCBGWFNZU19HZXRLVmFsdWUoY29sb3IpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX3BbMl0sIGNvbG9yX3BbMV0sIGNvbG9yX3BbMF0pOwotICAgICAgICBlbHNlIGlmICghKGFscGhhX2ZsYWcgPj4gOCkgJiYgSXNDbXlrSW1hZ2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmKCFJc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgIGNvbG9yX3BbM10gPSAoRlhfQllURSlhbHBoYTsKLSAgICB9Ci0gICAgaWYgKEdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgIEZYX0RXT1JEKiBkZXN0X3BvcyA9IChGWF9EV09SRCopKG1fcEJ1ZmZlciArIChkZXN0X3RvcCArIHJvdykgKiBtX1BpdGNoICsgZGVzdF9sZWZ0ICogNCk7Ci0gICAgICAgICAgICBGWF9MUENCWVRFIHNyY19zY2FuID0gcE1hc2stPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpOwotICAgICAgICAgICAgaWYgKHNyY19icHAgPT0gMSkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNyY19iaXRwb3MgPSBzcmNfbGVmdCArIGNvbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19zY2FuW3NyY19iaXRwb3MgLyA4XSAmICgxIDw8ICg3IC0gc3JjX2JpdHBvcyAlIDgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfcG9zID0gZHN0X2NvbG9yOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfcG9zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZXN0X3BvcyArKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IHNyY19sZWZ0OwotICAgICAgICAgICAgICAgIGRzdF9jb2xvciA9IEZYQVJHQl9UT0RJQihkc3RfY29sb3IpOwotICAgICAgICAgICAgICAgIGRzdF9jb2xvciAmPSAweGZmZmZmZjsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9wb3MrKywgZHN0X2NvbG9yIHwgKChhbHBoYSAqICgqc3JjX3NjYW4rKykgLyAyNTUpIDw8IDI0KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IGNvbXBzID0gbV9icHAgLyA4OwotICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgRlhfTFBCWVRFIGRlc3RfY29sb3JfcG9zID0gbV9wQnVmZmVyICsgKGRlc3RfdG9wICsgcm93KSAqIG1fUGl0Y2ggKyBkZXN0X2xlZnQgKiBjb21wczsKLSAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X2FscGhhX3BvcyA9IChGWF9MUEJZVEUpbV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShkZXN0X3RvcCArIHJvdykgKyBkZXN0X2xlZnQ7Ci0gICAgICAgICAgICBGWF9MUENCWVRFIHNyY19zY2FuID0gcE1hc2stPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpOwotICAgICAgICAgICAgaWYgKHNyY19icHAgPT0gMSkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNyY19iaXRwb3MgPSBzcmNfbGVmdCArIGNvbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19zY2FuW3NyY19iaXRwb3MgLyA4XSAmICgxIDw8ICg3IC0gc3JjX2JpdHBvcyAlIDgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIoZGVzdF9jb2xvcl9wb3MsIGNvbG9yX3AsIGNvbXBzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X2FscGhhX3BvcyA9IDB4ZmY7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQzMihkZXN0X2NvbG9yX3BvcywgMCwgY29tcHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfYWxwaGFfcG9zID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZXN0X2NvbG9yX3BvcyArPSBjb21wczsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9hbHBoYV9wb3MgKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSBzcmNfbGVmdDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKGRlc3RfY29sb3JfcG9zLCBjb2xvcl9wLCBjb21wcyk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfY29sb3JfcG9zICs9IGNvbXBzOwotICAgICAgICAgICAgICAgICAgICAqZGVzdF9hbHBoYV9wb3MrKyA9IChhbHBoYSAqICgqc3JjX3NjYW4rKykgLyAyNTUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLXZvaWQgQ0ZYX0RJQlNvdXJjZTo6Q29weVBhbGV0dGUoY29uc3QgRlhfRFdPUkQqIHBTcmMsIEZYX0RXT1JEIHNpemUpCi17Ci0gICAgaWYgKHBTcmMgPT0gTlVMTCB8fCBHZXRCUFAoKSA+IDgpIHsKLSAgICAgICAgaWYgKG1fcFBhbGV0dGUpIHsKLSAgICAgICAgICAgIEZYX0ZyZWUobV9wUGFsZXR0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wUGFsZXR0ZSA9IE5VTEw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRlhfRFdPUkQgcGFsX3NpemUgPSAxIDw8IEdldEJQUCgpOwotICAgICAgICBpZiAobV9wUGFsZXR0ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtX3BQYWxldHRlID0gRlhfQWxsb2MoRlhfRFdPUkQsIHBhbF9zaXplKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGFsX3NpemUgPiBzaXplKSB7Ci0gICAgICAgICAgICBwYWxfc2l6ZSA9IHNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgRlhTWVNfbWVtY3B5MzIobV9wUGFsZXR0ZSwgcFNyYywgcGFsX3NpemUgKiBzaXplb2YoRlhfRFdPUkQpKTsKLSAgICB9Ci19Ci12b2lkIENGWF9ESUJTb3VyY2U6OkdldFBhbGV0dGUoRlhfRFdPUkQqIHBhbCwgaW50IGFscGhhKSBjb25zdAotewotICAgIEFTU0VSVChHZXRCUFAoKSA8PSA4ICYmICFJc0NteWtJbWFnZSgpKTsKKyAgfQorICBGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQgPSBHZXRGb3JtYXQoKTsKKyAgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQgPSBwU3JjQml0bWFwLT5HZXRGb3JtYXQoKTsKKyAgaWYgKGRlc3RfZm9ybWF0ID09IHNyY19mb3JtYXQgJiYgIXBJY2NUcmFuc2Zvcm0pIHsKICAgICBpZiAoR2V0QlBQKCkgPT0gMSkgewotICAgICAgICBwYWxbMF0gPSAoKG1fcFBhbGV0dGUgPyBtX3BQYWxldHRlWzBdIDogMHhmZjAwMDAwMCkgJiAweGZmZmZmZikgfCAoYWxwaGEgPDwgMjQpOwotICAgICAgICBwYWxbMV0gPSAoKG1fcFBhbGV0dGUgPyBtX3BQYWxldHRlWzFdIDogMHhmZmZmZmZmZikgJiAweGZmZmZmZikgfCAoYWxwaGEgPDwgMjQpOwotICAgICAgICByZXR1cm47CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IG1fcEJ1ZmZlciArIChkZXN0X3RvcCArIHJvdykgKiBtX1BpdGNoOworICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpOworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgICBpZiAoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYKKyAgICAgICAgICAgICAgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSB7CisgICAgICAgICAgICBkZXN0X3NjYW5bKGRlc3RfbGVmdCArIGNvbCkgLyA4XSB8PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoNyAtIChkZXN0X2xlZnQgKyBjb2wpICUgOCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc3Rfc2NhblsoZGVzdF9sZWZ0ICsgY29sKSAvIDhdICY9CisgICAgICAgICAgICAgICAgfigxIDw8ICg3IC0gKGRlc3RfbGVmdCArIGNvbCkgJSA4KSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGludCBCcHAgPSBHZXRCUFAoKSAvIDg7CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9CisgICAgICAgICAgICBtX3BCdWZmZXIgKyAoZGVzdF90b3AgKyByb3cpICogbV9QaXRjaCArIGRlc3RfbGVmdCAqIEJwcDsKKyAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPQorICAgICAgICAgICAgcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdCAqIEJwcDsKKyAgICAgICAgRlhTWVNfbWVtY3B5KGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoICogQnBwKTsKKyAgICAgIH0KICAgICB9CisgIH0gZWxzZSB7CiAgICAgaWYgKG1fcFBhbGV0dGUpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKLSAgICAgICAgICAgIHBhbFtpXSA9IChtX3BQYWxldHRlW2ldICYgMHgwMGZmZmZmZikgfCAoYWxwaGEgPDwgMjQpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKLSAgICAgICAgICAgIHBhbFtpXSA9IChpICogMHgxMDEwMSkgfCAoYWxwaGEgPDwgMjQpOwotICAgICAgICB9CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQorICAgIGlmIChtX2JwcCA9PSA4KSB7CisgICAgICBkZXN0X2Zvcm1hdCA9IEZYRElCXzhicHBNYXNrOworICAgIH0KKyAgICB1aW50OF90KiBkZXN0X2J1ZiA9CisgICAgICAgIG1fcEJ1ZmZlciArIGRlc3RfdG9wICogbV9QaXRjaCArIGRlc3RfbGVmdCAqIEdldEJQUCgpIC8gODsKKyAgICBGWF9EV09SRCogZF9wbHQgPSBOVUxMOworICAgIGlmICghQ29udmVydEJ1ZmZlcihkZXN0X2Zvcm1hdCwgZGVzdF9idWYsIG1fUGl0Y2gsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wLCBkX3BsdCwgcEljY1RyYW5zZm9ybSkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1DRlhfRElCaXRtYXAqIENGWF9ESUJTb3VyY2U6OkdldEFscGhhTWFzayhjb25zdCBGWF9SRUNUKiBwQ2xpcCkgY29uc3QKLXsKLSAgICBBU1NFUlQoR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYik7Ci0gICAgRlhfUkVDVCByZWN0KDAsIDAsIG1fV2lkdGgsIG1fSGVpZ2h0KTsKLSAgICBpZiAocENsaXApIHsKLSAgICAgICAgcmVjdC5JbnRlcnNlY3QoKnBDbGlwKTsKLSAgICAgICAgaWYgKHJlY3QuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICBDRlhfRElCaXRtYXAqIHBNYXNrID0gbmV3IENGWF9ESUJpdG1hcDsKLSAgICBpZiAoIXBNYXNrLT5DcmVhdGUocmVjdC5XaWR0aCgpLCByZWN0LkhlaWdodCgpLCBGWERJQl84YnBwTWFzaykpIHsKLSAgICAgICAgZGVsZXRlIHBNYXNrOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgZm9yIChpbnQgcm93ID0gcmVjdC50b3A7IHJvdyA8IHJlY3QuYm90dG9tOyByb3cgKyspIHsKLSAgICAgICAgRlhfTFBDQllURSBzcmNfc2NhbiA9IEdldFNjYW5saW5lKHJvdykgKyByZWN0LmxlZnQgKiA0ICsgMzsKLSAgICAgICAgRlhfTFBCWVRFIGRlc3Rfc2NhbiA9IChGWF9MUEJZVEUpcE1hc2stPkdldFNjYW5saW5lKHJvdyAtIHJlY3QudG9wKTsKLSAgICAgICAgZm9yIChpbnQgY29sID0gcmVjdC5sZWZ0OyBjb2wgPCByZWN0LnJpZ2h0OyBjb2wgKyspIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gKysgPSAqc3JjX3NjYW47Ci0gICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwTWFzazsKLX0KLUZYX0JPT0wgQ0ZYX0RJQlNvdXJjZTo6Q29weUFscGhhTWFzayhjb25zdCBDRlhfRElCU291cmNlKiBwQWxwaGFNYXNrLCBjb25zdCBGWF9SRUNUKiBwQ2xpcCkKLXsKLSAgICBpZiAoIUhhc0FscGhhKCkgfHwgR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChwQWxwaGFNYXNrKSB7Ci0gICAgICAgIEZYX1JFQ1QgcmVjdCgwLCAwLCBwQWxwaGFNYXNrLT5tX1dpZHRoLCBwQWxwaGFNYXNrLT5tX0hlaWdodCk7Ci0gICAgICAgIGlmIChwQ2xpcCkgewotICAgICAgICAgICAgcmVjdC5JbnRlcnNlY3QoKnBDbGlwKTsKLSAgICAgICAgICAgIGlmIChyZWN0LklzRW1wdHkoKSB8fCByZWN0LldpZHRoKCkgIT0gbV9XaWR0aCB8fCByZWN0LkhlaWdodCgpICE9IG1fSGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHBBbHBoYU1hc2stPm1fV2lkdGggIT0gbV9XaWR0aCB8fCBwQWxwaGFNYXNrLT5tX0hlaWdodCAhPSBtX0hlaWdodCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93ICsrKQotICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIoKHZvaWQqKW1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUocm93KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbHBoYU1hc2stPkdldFNjYW5saW5lKHJvdyArIHJlY3QudG9wKSArIHJlY3QubGVmdCwgbV9wQWxwaGFNYXNrLT5tX1BpdGNoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX3BBbHBoYU1hc2stPkNsZWFyKDB4ZmYwMDAwMDApOwotICAgIH0KK0ZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpUcmFuc2Zlck1hc2soaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgaWYgKCFtX3BCdWZmZXIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQVNTRVJUKEhhc0FscGhhKCkgJiYgKG1fYnBwID49IDI0KSk7CisgIEFTU0VSVChwTWFzay0+SXNBbHBoYU1hc2soKSk7CisgIGlmICghSGFzQWxwaGEoKSB8fCAhcE1hc2stPklzQWxwaGFNYXNrKCkgfHwgbV9icHAgPCAyNCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBHZXRPdmVybGFwUmVjdChkZXN0X2xlZnQsIGRlc3RfdG9wLCB3aWR0aCwgaGVpZ2h0LCBwTWFzay0+R2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgcE1hc2stPkdldEhlaWdodCgpLCBzcmNfbGVmdCwgc3JjX3RvcCwgTlVMTCk7CisgIGlmICh3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwKSB7CiAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaW50IHNyY19icHAgPSBwTWFzay0+R2V0QlBQKCk7CisgIGludCBhbHBoYTsKKyAgRlhfRFdPUkQgZHN0X2NvbG9yOworICBpZiAoYWxwaGFfZmxhZyA+PiA4KSB7CisgICAgYWxwaGEgPSBhbHBoYV9mbGFnICYgMHhmZjsKKyAgICBkc3RfY29sb3IgPSBGWENNWUtfVE9ESUIoY29sb3IpOworICB9IGVsc2UgeworICAgIGFscGhhID0gRlhBUkdCX0EoY29sb3IpOworICAgIGRzdF9jb2xvciA9IEZYQVJHQl9UT0RJQihjb2xvcik7CisgIH0KKyAgdWludDhfdCogY29sb3JfcCA9ICh1aW50OF90KikmZHN0X2NvbG9yOworICBpZiAocEljY1RyYW5zZm9ybSAmJiBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpICYmCisgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKSkgeworICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPQorICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKKyAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBjb2xvcl9wLCBjb2xvcl9wLCAxKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoYWxwaGFfZmxhZyA+PiA4ICYmICFJc0NteWtJbWFnZSgpKQorICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShjb2xvciksIEZYU1lTX0dldE1WYWx1ZShjb2xvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfR2V0WVZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0S1ZhbHVlKGNvbG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9wWzJdLCBjb2xvcl9wWzFdLCBjb2xvcl9wWzBdKTsKKyAgICBlbHNlIGlmICghKGFscGhhX2ZsYWcgPj4gOCkgJiYgSXNDbXlrSW1hZ2UoKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorICBpZiAoIUlzQ215a0ltYWdlKCkpIHsKKyAgICBjb2xvcl9wWzNdID0gKHVpbnQ4X3QpYWxwaGE7CisgIH0KKyAgaWYgKEdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpIHsKKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgICBGWF9EV09SRCogZGVzdF9wb3MgPQorICAgICAgICAgIChGWF9EV09SRCopKG1fcEJ1ZmZlciArIChkZXN0X3RvcCArIHJvdykgKiBtX1BpdGNoICsgZGVzdF9sZWZ0ICogNCk7CisgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBNYXNrLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KTsKKyAgICAgIGlmIChzcmNfYnBwID09IDEpIHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgaW50IHNyY19iaXRwb3MgPSBzcmNfbGVmdCArIGNvbDsKKyAgICAgICAgICBpZiAoc3JjX3NjYW5bc3JjX2JpdHBvcyAvIDhdICYgKDEgPDwgKDcgLSBzcmNfYml0cG9zICUgOCkpKSB7CisgICAgICAgICAgICAqZGVzdF9wb3MgPSBkc3RfY29sb3I7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpkZXN0X3BvcyA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGRlc3RfcG9zKys7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNyY19zY2FuICs9IHNyY19sZWZ0OworICAgICAgICBkc3RfY29sb3IgPSBGWEFSR0JfVE9ESUIoZHN0X2NvbG9yKTsKKyAgICAgICAgZHN0X2NvbG9yICY9IDB4ZmZmZmZmOworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3RfcG9zKyssCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RfY29sb3IgfCAoKGFscGhhICogKCpzcmNfc2NhbisrKSAvIDI1NSkgPDwgMjQpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbnQgY29tcHMgPSBtX2JwcCAvIDg7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgICAgdWludDhfdCogZGVzdF9jb2xvcl9wb3MgPQorICAgICAgICAgIG1fcEJ1ZmZlciArIChkZXN0X3RvcCArIHJvdykgKiBtX1BpdGNoICsgZGVzdF9sZWZ0ICogY29tcHM7CisgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3BvcyA9CisgICAgICAgICAgKHVpbnQ4X3QqKW1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUoZGVzdF90b3AgKyByb3cpICsgZGVzdF9sZWZ0OworICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBwTWFzay0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdyk7CisgICAgICBpZiAoc3JjX2JwcCA9PSAxKSB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICAgIGludCBzcmNfYml0cG9zID0gc3JjX2xlZnQgKyBjb2w7CisgICAgICAgICAgaWYgKHNyY19zY2FuW3NyY19iaXRwb3MgLyA4XSAmICgxIDw8ICg3IC0gc3JjX2JpdHBvcyAlIDgpKSkgeworICAgICAgICAgICAgRlhTWVNfbWVtY3B5KGRlc3RfY29sb3JfcG9zLCBjb2xvcl9wLCBjb21wcyk7CisgICAgICAgICAgICAqZGVzdF9hbHBoYV9wb3MgPSAweGZmOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGWFNZU19tZW1zZXQoZGVzdF9jb2xvcl9wb3MsIDAsIGNvbXBzKTsKKyAgICAgICAgICAgICpkZXN0X2FscGhhX3BvcyA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGRlc3RfY29sb3JfcG9zICs9IGNvbXBzOworICAgICAgICAgIGRlc3RfYWxwaGFfcG9zKys7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNyY19zY2FuICs9IHNyY19sZWZ0OworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgICBGWFNZU19tZW1jcHkoZGVzdF9jb2xvcl9wb3MsIGNvbG9yX3AsIGNvbXBzKTsKKyAgICAgICAgICBkZXN0X2NvbG9yX3BvcyArPSBjb21wczsKKyAgICAgICAgICAqZGVzdF9hbHBoYV9wb3MrKyA9IChhbHBoYSAqICgqc3JjX3NjYW4rKykgLyAyNTUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQordm9pZCBDRlhfRElCU291cmNlOjpDb3B5UGFsZXR0ZShjb25zdCBGWF9EV09SRCogcFNyYywgRlhfRFdPUkQgc2l6ZSkgeworICBpZiAoIXBTcmMgfHwgR2V0QlBQKCkgPiA4KSB7CisgICAgRlhfRnJlZShtX3BQYWxldHRlKTsKKyAgICBtX3BQYWxldHRlID0gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICBGWF9EV09SRCBwYWxfc2l6ZSA9IDEgPDwgR2V0QlBQKCk7CisgICAgaWYgKCFtX3BQYWxldHRlKSB7CisgICAgICBtX3BQYWxldHRlID0gRlhfQWxsb2MoRlhfRFdPUkQsIHBhbF9zaXplKTsKKyAgICB9CisgICAgaWYgKHBhbF9zaXplID4gc2l6ZSkgeworICAgICAgcGFsX3NpemUgPSBzaXplOworICAgIH0KKyAgICBGWFNZU19tZW1jcHkobV9wUGFsZXR0ZSwgcFNyYywgcGFsX3NpemUgKiBzaXplb2YoRlhfRFdPUkQpKTsKKyAgfQorfQordm9pZCBDRlhfRElCU291cmNlOjpHZXRQYWxldHRlKEZYX0RXT1JEKiBwYWwsIGludCBhbHBoYSkgY29uc3QgeworICBBU1NFUlQoR2V0QlBQKCkgPD0gOCAmJiAhSXNDbXlrSW1hZ2UoKSk7CisgIGlmIChHZXRCUFAoKSA9PSAxKSB7CisgICAgcGFsWzBdID0KKyAgICAgICAgKChtX3BQYWxldHRlID8gbV9wUGFsZXR0ZVswXSA6IDB4ZmYwMDAwMDApICYgMHhmZmZmZmYpIHwgKGFscGhhIDw8IDI0KTsKKyAgICBwYWxbMV0gPQorICAgICAgICAoKG1fcFBhbGV0dGUgPyBtX3BQYWxldHRlWzFdIDogMHhmZmZmZmZmZikgJiAweGZmZmZmZikgfCAoYWxwaGEgPDwgMjQpOworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9wUGFsZXR0ZSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgIHBhbFtpXSA9IChtX3BQYWxldHRlW2ldICYgMHgwMGZmZmZmZikgfCAoYWxwaGEgPDwgMjQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICBwYWxbaV0gPSAoaSAqIDB4MTAxMDEpIHwgKGFscGhhIDw8IDI0KTsKKyAgICB9CisgIH0KK30KK0NGWF9ESUJpdG1hcCogQ0ZYX0RJQlNvdXJjZTo6R2V0QWxwaGFNYXNrKGNvbnN0IEZYX1JFQ1QqIHBDbGlwKSBjb25zdCB7CisgIEFTU0VSVChHZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKTsKKyAgRlhfUkVDVCByZWN0KDAsIDAsIG1fV2lkdGgsIG1fSGVpZ2h0KTsKKyAgaWYgKHBDbGlwKSB7CisgICAgcmVjdC5JbnRlcnNlY3QoKnBDbGlwKTsKKyAgICBpZiAocmVjdC5Jc0VtcHR5KCkpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorICBDRlhfRElCaXRtYXAqIHBNYXNrID0gbmV3IENGWF9ESUJpdG1hcDsKKyAgaWYgKCFwTWFzay0+Q3JlYXRlKHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwgRlhESUJfOGJwcE1hc2spKSB7CisgICAgZGVsZXRlIHBNYXNrOworICAgIHJldHVybiBOVUxMOworICB9CisgIGZvciAoaW50IHJvdyA9IHJlY3QudG9wOyByb3cgPCByZWN0LmJvdHRvbTsgcm93KyspIHsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IEdldFNjYW5saW5lKHJvdykgKyByZWN0LmxlZnQgKiA0ICsgMzsKKyAgICB1aW50OF90KiBkZXN0X3NjYW4gPSAodWludDhfdCopcE1hc2stPkdldFNjYW5saW5lKHJvdyAtIHJlY3QudG9wKTsKKyAgICBmb3IgKGludCBjb2wgPSByZWN0LmxlZnQ7IGNvbCA8IHJlY3QucmlnaHQ7IGNvbCsrKSB7CisgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW47CisgICAgICBzcmNfc2NhbiArPSA0OworICAgIH0KKyAgfQorICByZXR1cm4gcE1hc2s7Cit9CitGWF9CT09MIENGWF9ESUJTb3VyY2U6OkNvcHlBbHBoYU1hc2soY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEFscGhhTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcCkgeworICBpZiAoIUhhc0FscGhhKCkgfHwgR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAocEFscGhhTWFzaykgeworICAgIEZYX1JFQ1QgcmVjdCgwLCAwLCBwQWxwaGFNYXNrLT5tX1dpZHRoLCBwQWxwaGFNYXNrLT5tX0hlaWdodCk7CisgICAgaWYgKHBDbGlwKSB7CisgICAgICByZWN0LkludGVyc2VjdCgqcENsaXApOworICAgICAgaWYgKHJlY3QuSXNFbXB0eSgpIHx8IHJlY3QuV2lkdGgoKSAhPSBtX1dpZHRoIHx8CisgICAgICAgICAgcmVjdC5IZWlnaHQoKSAhPSBtX0hlaWdodCkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChwQWxwaGFNYXNrLT5tX1dpZHRoICE9IG1fV2lkdGggfHwgcEFscGhhTWFzay0+bV9IZWlnaHQgIT0gbV9IZWlnaHQpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0KKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93KyspCisgICAgICBGWFNZU19tZW1jcHkoKHZvaWQqKW1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUocm93KSwKKyAgICAgICAgICAgICAgICAgICBwQWxwaGFNYXNrLT5HZXRTY2FubGluZShyb3cgKyByZWN0LnRvcCkgKyByZWN0LmxlZnQsCisgICAgICAgICAgICAgICAgICAgbV9wQWxwaGFNYXNrLT5tX1BpdGNoKTsKKyAgfSBlbHNlIHsKKyAgICBtX3BBbHBoYU1hc2stPkNsZWFyKDB4ZmYwMDAwMDApOworICB9CisgIHJldHVybiBUUlVFOwogfQogY29uc3QgaW50IGdfQ2hhbm5lbE9mZnNldFtdID0gezAsIDIsIDEsIDAsIDAsIDEsIDIsIDMsIDN9OwotRlhfQk9PTCBDRlhfRElCaXRtYXA6OkxvYWRDaGFubmVsKEZYRElCX0NoYW5uZWwgZGVzdENoYW5uZWwsIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsIEZYRElCX0NoYW5uZWwgc3JjQ2hhbm5lbCkKLXsKLSAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDRlhfRElCaXRtYXA6OkxvYWRDaGFubmVsKEZYRElCX0NoYW5uZWwgZGVzdENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9DaGFubmVsIHNyY0NoYW5uZWwpIHsKKyAgaWYgKCFtX3BCdWZmZXIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0ZYX0RJQlNvdXJjZSogcFNyY0Nsb25lID0gKENGWF9ESUJTb3VyY2UqKXBTcmNCaXRtYXA7CisgIENGWF9ESUJpdG1hcCogcERzdCA9IHRoaXM7CisgIGludCBkZXN0T2Zmc2V0LCBzcmNPZmZzZXQ7CisgIGlmIChzcmNDaGFubmVsID09IEZYRElCX0FscGhhKSB7CisgICAgaWYgKCFwU3JjQml0bWFwLT5IYXNBbHBoYSgpICYmICFwU3JjQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIENGWF9ESUJTb3VyY2UqIHBTcmNDbG9uZSA9IChDRlhfRElCU291cmNlKilwU3JjQml0bWFwOwotICAgIENGWF9ESUJpdG1hcCogcERzdCA9IHRoaXM7Ci0gICAgaW50IGRlc3RPZmZzZXQsIHNyY09mZnNldDsKLSAgICBpZiAoc3JjQ2hhbm5lbCA9PSBGWERJQl9BbHBoYSkgewotICAgICAgICBpZiAoIXBTcmNCaXRtYXAtPkhhc0FscGhhKCkgJiYgIXBTcmNCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAocFNyY0JpdG1hcC0+R2V0QlBQKCkgPT0gMSkgewotICAgICAgICAgICAgcFNyY0Nsb25lID0gcFNyY0JpdG1hcC0+Q2xvbmVDb252ZXJ0KEZYRElCXzhicHBNYXNrKTsKLSAgICAgICAgICAgIGlmIChwU3JjQ2xvbmUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihwU3JjQml0bWFwLT5HZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKSB7Ci0gICAgICAgICAgICBzcmNPZmZzZXQgPSAzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjT2Zmc2V0ID0gMDsKLSAgICAgICAgfQorICAgIGlmIChwU3JjQml0bWFwLT5HZXRCUFAoKSA9PSAxKSB7CisgICAgICBwU3JjQ2xvbmUgPSBwU3JjQml0bWFwLT5DbG9uZUNvbnZlcnQoRlhESUJfOGJwcE1hc2spOworICAgICAgaWYgKCFwU3JjQ2xvbmUpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0KKyAgICBpZiAocFNyY0JpdG1hcC0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYikgeworICAgICAgc3JjT2Zmc2V0ID0gMzsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAocFNyY0JpdG1hcC0+SXNBbHBoYU1hc2soKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwU3JjQml0bWFwLT5HZXRCUFAoKSA8IDI0KSB7Ci0gICAgICAgICAgICBpZiAocFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgewotICAgICAgICAgICAgICAgIHBTcmNDbG9uZSA9IHBTcmNCaXRtYXAtPkNsb25lQ29udmVydCgoRlhESUJfRm9ybWF0KSgocFNyY0JpdG1hcC0+R2V0Rm9ybWF0KCkgJiAweGZmMDApIHwgMHgyMCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwU3JjQ2xvbmUgPSBwU3JjQml0bWFwLT5DbG9uZUNvbnZlcnQoKEZYRElCX0Zvcm1hdCkoKHBTcmNCaXRtYXAtPkdldEZvcm1hdCgpICYgMHhmZjAwKSB8IDB4MTgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwU3JjQ2xvbmUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzcmNPZmZzZXQgPSBnX0NoYW5uZWxPZmZzZXRbc3JjQ2hhbm5lbF07CisgICAgICBzcmNPZmZzZXQgPSAwOwogICAgIH0KLSAgICBpZiAoZGVzdENoYW5uZWwgPT0gRlhESUJfQWxwaGEpIHsKLSAgICAgICAgaWYgKElzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgICAgIGlmKCFDb252ZXJ0Rm9ybWF0KEZYRElCXzhicHBNYXNrKSkgewotICAgICAgICAgICAgICAgIGlmIChwU3JjQ2xvbmUgIT0gcFNyY0JpdG1hcCkgewotICAgICAgICAgICAgICAgICAgICBkZWxldGUgcFNyY0Nsb25lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0T2Zmc2V0ID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlc3RPZmZzZXQgPSAwOwotICAgICAgICAgICAgaWYoIUNvbnZlcnRGb3JtYXQoSXNDbXlrSW1hZ2UoKSA/IEZYRElCX0NteWthIDogRlhESUJfQXJnYikpIHsKLSAgICAgICAgICAgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKEdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgICAgICAgICBkZXN0T2Zmc2V0ID0gMzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChJc0FscGhhTWFzaygpKSB7Ci0gICAgICAgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKLSAgICAgICAgICAgICAgICBkZWxldGUgcFNyY0Nsb25lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChHZXRCUFAoKSA8IDI0KSB7Ci0gICAgICAgICAgICBpZiAoSGFzQWxwaGEoKSkgewotICAgICAgICAgICAgICAgIGlmICghQ29udmVydEZvcm1hdChJc0NteWtJbWFnZSgpID8gRlhESUJfQ215a2EgOiBGWERJQl9BcmdiKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwU3JjQ2xvbmU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZQotI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgICAgICAgICAgICAgIGlmICghQ29udmVydEZvcm1hdChJc0NteWtJbWFnZSgpID8gRlhESUJfQ215ayA6IEZYRElCX1JnYjMyKSkgewotI2Vsc2UKLSAgICAgICAgICAgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoSXNDbXlrSW1hZ2UoKSA/IEZYRElCX0NteWsgOiBGWERJQl9SZ2IpKSB7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBTcmNDbG9uZSAhPSBwU3JjQml0bWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcFNyY0Nsb25lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdE9mZnNldCA9IGdfQ2hhbm5lbE9mZnNldFtkZXN0Q2hhbm5lbF07CisgIH0gZWxzZSB7CisgICAgaWYgKHBTcmNCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgaWYgKHNyY0NoYW5uZWwgPT0gRlhESUJfQWxwaGEgJiYgcFNyY0Nsb25lLT5tX3BBbHBoYU1hc2spIHsKLSAgICAgICAgQ0ZYX0RJQml0bWFwKiBwQWxwaGFNYXNrID0gcFNyY0Nsb25lLT5tX3BBbHBoYU1hc2s7Ci0gICAgICAgIGlmIChwU3JjQ2xvbmUtPkdldFdpZHRoKCkgIT0gbV9XaWR0aCB8fCBwU3JjQ2xvbmUtPkdldEhlaWdodCgpICE9IG1fSGVpZ2h0KSB7Ci0gICAgICAgICAgICBpZiAocEFscGhhTWFzaykgewotICAgICAgICAgICAgICAgIHBBbHBoYU1hc2sgPSBwQWxwaGFNYXNrLT5TdHJldGNoVG8obV9XaWR0aCwgbV9IZWlnaHQpOwotICAgICAgICAgICAgICAgIGlmIChwQWxwaGFNYXNrID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBTcmNDbG9uZSAhPSBwU3JjQml0bWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcFNyY0Nsb25lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBTcmNDbG9uZSAhPSBwU3JjQml0bWFwKSB7Ci0gICAgICAgICAgICBwU3JjQ2xvbmUtPm1fcEFscGhhTWFzayA9IE5VTEw7Ci0gICAgICAgICAgICBkZWxldGUgcFNyY0Nsb25lOwotICAgICAgICB9Ci0gICAgICAgIHBTcmNDbG9uZSA9IHBBbHBoYU1hc2s7Ci0gICAgICAgIHNyY09mZnNldCA9IDA7Ci0gICAgfSBlbHNlIGlmIChwU3JjQ2xvbmUtPkdldFdpZHRoKCkgIT0gbV9XaWR0aCB8fCBwU3JjQ2xvbmUtPkdldEhlaWdodCgpICE9IG1fSGVpZ2h0KSB7Ci0gICAgICAgIENGWF9ESUJpdG1hcCogcFNyY01hdGNoZWQgPSBwU3JjQ2xvbmUtPlN0cmV0Y2hUbyhtX1dpZHRoLCBtX0hlaWdodCk7Ci0gICAgICAgIGlmIChwU3JjQ2xvbmUgIT0gcFNyY0JpdG1hcCkgewotICAgICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocFNyY01hdGNoZWQgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIHBTcmNDbG9uZSA9IHBTcmNNYXRjaGVkOwotICAgIH0KLSAgICBpZiAoZGVzdENoYW5uZWwgPT0gRlhESUJfQWxwaGEgJiYgbV9wQWxwaGFNYXNrKSB7Ci0gICAgICAgIHBEc3QgPSBtX3BBbHBoYU1hc2s7Ci0gICAgICAgIGRlc3RPZmZzZXQgPSAwOwotICAgIH0KLSAgICBpbnQgc3JjQnl0ZXMgPSBwU3JjQ2xvbmUtPkdldEJQUCgpIC8gODsKLSAgICBpbnQgZGVzdEJ5dGVzID0gcERzdC0+R2V0QlBQKCkgLyA4OwotICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgRlhfTFBCWVRFIGRlc3RfcG9zID0gKEZYX0xQQllURSlwRHN0LT5HZXRTY2FubGluZShyb3cpICsgZGVzdE9mZnNldDsKLSAgICAgICAgRlhfTFBDQllURSBzcmNfcG9zID0gcFNyY0Nsb25lLT5HZXRTY2FubGluZShyb3cpICsgc3JjT2Zmc2V0OwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICpkZXN0X3BvcyA9ICpzcmNfcG9zOwotICAgICAgICAgICAgZGVzdF9wb3MgKz0gZGVzdEJ5dGVzOwotICAgICAgICAgICAgc3JjX3BvcyArPSBzcmNCeXRlczsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXAgJiYgcFNyY0Nsb25lICE9IHBTcmNCaXRtYXAtPm1fcEFscGhhTWFzaykgewotICAgICAgICBkZWxldGUgcFNyY0Nsb25lOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpMb2FkQ2hhbm5lbChGWERJQl9DaGFubmVsIGRlc3RDaGFubmVsLCBpbnQgdmFsdWUpCi17Ci0gICAgaWYgKG1fcEJ1ZmZlciA9PSBOVUxMKSB7CisgICAgaWYgKHBTcmNCaXRtYXAtPkdldEJQUCgpIDwgMjQpIHsKKyAgICAgIGlmIChwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7CisgICAgICAgIHBTcmNDbG9uZSA9IHBTcmNCaXRtYXAtPkNsb25lQ29udmVydCgKKyAgICAgICAgICAgIChGWERJQl9Gb3JtYXQpKChwU3JjQml0bWFwLT5HZXRGb3JtYXQoKSAmIDB4ZmYwMCkgfCAweDIwKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwU3JjQ2xvbmUgPSBwU3JjQml0bWFwLT5DbG9uZUNvbnZlcnQoCisgICAgICAgICAgICAoRlhESUJfRm9ybWF0KSgocFNyY0JpdG1hcC0+R2V0Rm9ybWF0KCkgJiAweGZmMDApIHwgMHgxOCkpOworICAgICAgfQorICAgICAgaWYgKCFwU3JjQ2xvbmUpIHsKICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQogICAgIH0KLSAgICBpbnQgZGVzdE9mZnNldDsKLSAgICBpZiAoZGVzdENoYW5uZWwgPT0gRlhESUJfQWxwaGEpIHsKLSAgICAgICAgaWYgKElzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgICAgIGlmKCFDb252ZXJ0Rm9ybWF0KEZYRElCXzhicHBNYXNrKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3RPZmZzZXQgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVzdE9mZnNldCA9IDA7Ci0gICAgICAgICAgICBpZighQ29udmVydEZvcm1hdChJc0NteWtJbWFnZSgpID8gRlhESUJfQ215a2EgOiBGWERJQl9BcmdiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChHZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKSB7Ci0gICAgICAgICAgICAgICAgZGVzdE9mZnNldCA9IDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoSXNBbHBoYU1hc2soKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChHZXRCUFAoKSA8IDI0KSB7Ci0gICAgICAgICAgICBpZiAoSGFzQWxwaGEoKSkgewotICAgICAgICAgICAgICAgIGlmICghQ29udmVydEZvcm1hdChJc0NteWtJbWFnZSgpID8gRlhESUJfQ215a2EgOiBGWERJQl9BcmdiKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlCi0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgICAgICAgICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KElzQ215a0ltYWdlKCkgPyBGWERJQl9DbXlrIDogRlhESUJfUmdiKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICAgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoSXNDbXlrSW1hZ2UoKSA/IEZYRElCX0NteWsgOiBGWERJQl9SZ2IzMikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICB9Ci0gICAgICAgIGRlc3RPZmZzZXQgPSBnX0NoYW5uZWxPZmZzZXRbZGVzdENoYW5uZWxdOwotICAgIH0KLSAgICBpbnQgQnBwID0gR2V0QlBQKCkgLyA4OwotICAgIGlmIChCcHAgPT0gMSkgewotICAgICAgICBGWFNZU19tZW1zZXQ4KG1fcEJ1ZmZlciwgdmFsdWUsIG1fSGVpZ2h0ICogbV9QaXRjaCk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAoZGVzdENoYW5uZWwgPT0gRlhESUJfQWxwaGEgJiYgbV9wQWxwaGFNYXNrKSB7Ci0gICAgICAgIEZYU1lTX21lbXNldDgobV9wQWxwaGFNYXNrLT5HZXRCdWZmZXIoKSwgdmFsdWUsIG1fcEFscGhhTWFzay0+R2V0SGVpZ2h0KCkqbV9wQWxwaGFNYXNrLT5HZXRQaXRjaCgpKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgRlhfTFBCWVRFIHNjYW5fbGluZSA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2ggKyBkZXN0T2Zmc2V0OwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICpzY2FuX2xpbmUgPSB2YWx1ZTsKLSAgICAgICAgICAgIHNjYW5fbGluZSArPSBCcHA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENGWF9ESUJpdG1hcDo6TXVsdGlwbHlBbHBoYShjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwKQotewotICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEFTU0VSVChwU3JjQml0bWFwLT5Jc0FscGhhTWFzaygpKTsKLSAgICBpZiAoIXBTcmNCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoIUlzQWxwaGFNYXNrKCkgJiYgIUhhc0FscGhhKCkpIHsKLSAgICAgICAgcmV0dXJuIExvYWRDaGFubmVsKEZYRElCX0FscGhhLCBwU3JjQml0bWFwLCBGWERJQl9BbHBoYSk7Ci0gICAgfQotICAgIENGWF9ESUJpdG1hcCogcFNyY0Nsb25lID0gKENGWF9ESUJpdG1hcCopcFNyY0JpdG1hcDsKLSAgICBpZiAocFNyY0JpdG1hcC0+R2V0V2lkdGgoKSAhPSBtX1dpZHRoIHx8IHBTcmNCaXRtYXAtPkdldEhlaWdodCgpICE9IG1fSGVpZ2h0KSB7Ci0gICAgICAgIHBTcmNDbG9uZSA9IHBTcmNCaXRtYXAtPlN0cmV0Y2hUbyhtX1dpZHRoLCBtX0hlaWdodCk7Ci0gICAgICAgIEFTU0VSVChwU3JjQ2xvbmUgIT0gTlVMTCk7Ci0gICAgICAgIGlmIChwU3JjQ2xvbmUgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQorICAgIHNyY09mZnNldCA9IGdfQ2hhbm5lbE9mZnNldFtzcmNDaGFubmVsXTsKKyAgfQorICBpZiAoZGVzdENoYW5uZWwgPT0gRlhESUJfQWxwaGEpIHsKICAgICBpZiAoSXNBbHBoYU1hc2soKSkgewotICAgICAgICBpZighQ29udmVydEZvcm1hdChGWERJQl84YnBwTWFzaykpIHsKLSAgICAgICAgICAgIGlmIChwU3JjQ2xvbmUgIT0gcFNyY0JpdG1hcCkgewotICAgICAgICAgICAgICAgIGRlbGV0ZSBwU3JjQ2xvbmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoRlhESUJfOGJwcE1hc2spKSB7CisgICAgICAgIGlmIChwU3JjQ2xvbmUgIT0gcFNyY0JpdG1hcCkgeworICAgICAgICAgIGRlbGV0ZSBwU3JjQ2xvbmU7CiAgICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgRlhfTFBCWVRFIGRlc3Rfc2NhbiA9IG1fcEJ1ZmZlciArIG1fUGl0Y2ggKiByb3c7Ci0gICAgICAgICAgICBGWF9MUEJZVEUgc3JjX3NjYW4gPSBwU3JjQ2xvbmUtPm1fcEJ1ZmZlciArIHBTcmNDbG9uZS0+bV9QaXRjaCAqIHJvdzsKLSAgICAgICAgICAgIGlmIChwU3JjQ2xvbmUtPkdldEJQUCgpID09IDEpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEoKDEgPDwgKDcgLSBjb2wgJSA4KSkgJiBzcmNfc2Nhbltjb2wgLyA4XSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2Nhbltjb2xdID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSAoKmRlc3Rfc2NhbikgKiBzcmNfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGRlc3RPZmZzZXQgPSAwOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKEdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgICAgIGlmIChwU3JjQ2xvbmUtPkdldEJQUCgpID09IDEpIHsKLSAgICAgICAgICAgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X3NjYW4gPSBtX3BCdWZmZXIgKyBtX1BpdGNoICogcm93ICsgMzsKLSAgICAgICAgICAgICAgICBGWF9MUEJZVEUgc3JjX3NjYW4gPSBwU3JjQ2xvbmUtPm1fcEJ1ZmZlciArIHBTcmNDbG9uZS0+bV9QaXRjaCAqIHJvdzsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9ICgqZGVzdF9zY2FuKSAqIHNyY19zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fcEFscGhhTWFzay0+TXVsdGlwbHlBbHBoYShwU3JjQ2xvbmUpOworICAgICAgZGVzdE9mZnNldCA9IDA7CisgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoSXNDbXlrSW1hZ2UoKSA/IEZYRElCX0NteWthIDogRlhESUJfQXJnYikpIHsKKyAgICAgICAgaWYgKHBTcmNDbG9uZSAhPSBwU3JjQml0bWFwKSB7CisgICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKICAgICAgICAgfQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBpZiAoR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYikgeworICAgICAgICBkZXN0T2Zmc2V0ID0gMzsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKElzQWxwaGFNYXNrKCkpIHsKKyAgICAgIGlmIChwU3JjQ2xvbmUgIT0gcFNyY0JpdG1hcCkgeworICAgICAgICBkZWxldGUgcFNyY0Nsb25lOworICAgICAgfQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZiAoR2V0QlBQKCkgPCAyNCkgeworICAgICAgaWYgKEhhc0FscGhhKCkpIHsKKyAgICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KElzQ215a0ltYWdlKCkgPyBGWERJQl9DbXlrYSA6IEZYRElCX0FyZ2IpKSB7CisgICAgICAgICAgaWYgKHBTcmNDbG9uZSAhPSBwU3JjQml0bWFwKSB7CisgICAgICAgICAgICBkZWxldGUgcFNyY0Nsb25lOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZQorI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisgICAgICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KElzQ215a0ltYWdlKCkgPyBGWERJQl9DbXlrIDogRlhESUJfUmdiMzIpKSB7CisjZWxzZQorICAgICAgICAgIGlmICghQ29udmVydEZvcm1hdChJc0NteWtJbWFnZSgpID8gRlhESUJfQ215ayA6IEZYRElCX1JnYikpIHsKKyNlbmRpZgorICAgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKKyAgICAgICAgICBkZWxldGUgcFNyY0Nsb25lOworICAgICAgICB9CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisgICAgZGVzdE9mZnNldCA9IGdfQ2hhbm5lbE9mZnNldFtkZXN0Q2hhbm5lbF07CisgIH0KKyAgaWYgKHNyY0NoYW5uZWwgPT0gRlhESUJfQWxwaGEgJiYgcFNyY0Nsb25lLT5tX3BBbHBoYU1hc2spIHsKKyAgICBDRlhfRElCaXRtYXAqIHBBbHBoYU1hc2sgPSBwU3JjQ2xvbmUtPm1fcEFscGhhTWFzazsKKyAgICBpZiAocFNyY0Nsb25lLT5HZXRXaWR0aCgpICE9IG1fV2lkdGggfHwKKyAgICAgICAgcFNyY0Nsb25lLT5HZXRIZWlnaHQoKSAhPSBtX0hlaWdodCkgeworICAgICAgaWYgKHBBbHBoYU1hc2spIHsKKyAgICAgICAgcEFscGhhTWFzayA9IHBBbHBoYU1hc2stPlN0cmV0Y2hUbyhtX1dpZHRoLCBtX0hlaWdodCk7CisgICAgICAgIGlmICghcEFscGhhTWFzaykgeworICAgICAgICAgIGlmIChwU3JjQ2xvbmUgIT0gcFNyY0JpdG1hcCkgeworICAgICAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICB9CiAgICAgfQogICAgIGlmIChwU3JjQ2xvbmUgIT0gcFNyY0JpdG1hcCkgewotICAgICAgICBkZWxldGUgcFNyY0Nsb25lOworICAgICAgcFNyY0Nsb25lLT5tX3BBbHBoYU1hc2sgPSBOVUxMOworICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKICAgICB9Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcFNyY0Nsb25lID0gcEFscGhhTWFzazsKKyAgICBzcmNPZmZzZXQgPSAwOworICB9IGVsc2UgaWYgKHBTcmNDbG9uZS0+R2V0V2lkdGgoKSAhPSBtX1dpZHRoIHx8CisgICAgICAgICAgICAgcFNyY0Nsb25lLT5HZXRIZWlnaHQoKSAhPSBtX0hlaWdodCkgeworICAgIENGWF9ESUJpdG1hcCogcFNyY01hdGNoZWQgPSBwU3JjQ2xvbmUtPlN0cmV0Y2hUbyhtX1dpZHRoLCBtX0hlaWdodCk7CisgICAgaWYgKHBTcmNDbG9uZSAhPSBwU3JjQml0bWFwKSB7CisgICAgICBkZWxldGUgcFNyY0Nsb25lOworICAgIH0KKyAgICBpZiAoIXBTcmNNYXRjaGVkKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHBTcmNDbG9uZSA9IHBTcmNNYXRjaGVkOworICB9CisgIGlmIChkZXN0Q2hhbm5lbCA9PSBGWERJQl9BbHBoYSAmJiBtX3BBbHBoYU1hc2spIHsKKyAgICBwRHN0ID0gbV9wQWxwaGFNYXNrOworICAgIGRlc3RPZmZzZXQgPSAwOworICB9CisgIGludCBzcmNCeXRlcyA9IHBTcmNDbG9uZS0+R2V0QlBQKCkgLyA4OworICBpbnQgZGVzdEJ5dGVzID0gcERzdC0+R2V0QlBQKCkgLyA4OworICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93KyspIHsKKyAgICB1aW50OF90KiBkZXN0X3BvcyA9ICh1aW50OF90KilwRHN0LT5HZXRTY2FubGluZShyb3cpICsgZGVzdE9mZnNldDsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfcG9zID0gcFNyY0Nsb25lLT5HZXRTY2FubGluZShyb3cpICsgc3JjT2Zmc2V0OworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7CisgICAgICAqZGVzdF9wb3MgPSAqc3JjX3BvczsKKyAgICAgIGRlc3RfcG9zICs9IGRlc3RCeXRlczsKKyAgICAgIHNyY19wb3MgKz0gc3JjQnl0ZXM7CisgICAgfQorICB9CisgIGlmIChwU3JjQ2xvbmUgIT0gcFNyY0JpdG1hcCAmJiBwU3JjQ2xvbmUgIT0gcFNyY0JpdG1hcC0+bV9wQWxwaGFNYXNrKSB7CisgICAgZGVsZXRlIHBTcmNDbG9uZTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpHZXRHcmF5RGF0YSh2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHN3aXRjaCAoR2V0Rm9ybWF0KCkpIHsKLSAgICAgICAgY2FzZSBGWERJQl8xYnBwUmdiOiB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fcFBhbGV0dGUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZYX0JZVEUgZ3JheVsyXTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHIgPSAoRlhfQllURSkobV9wUGFsZXR0ZVtpXSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgIGludCBnID0gKEZYX0JZVEUpKG1fcFBhbGV0dGVbaV0gPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBiID0gKEZYX0JZVEUpbV9wUGFsZXR0ZVtpXTsKLSAgICAgICAgICAgICAgICAgICAgZ3JheVtpXSA9IChGWF9CWVRFKUZYUkdCMkdSQVkociwgZywgYik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE1hc2sgPSBuZXcgQ0ZYX0RJQml0bWFwOwotICAgICAgICAgICAgICAgIGlmICghcE1hc2stPkNyZWF0ZShtX1dpZHRoLCBtX0hlaWdodCwgRlhESUJfOGJwcE1hc2spKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwTWFzazsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGWFNZU19tZW1zZXQ4KHBNYXNrLT5HZXRCdWZmZXIoKSwgZ3JheVswXSwgcE1hc2stPkdldFBpdGNoKCkgKiBtX0hlaWdodCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgICAgICBGWF9MUEJZVEUgc3JjX3BvcyA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2g7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X3BvcyA9IChGWF9MUEJZVEUpcE1hc2stPkdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19wb3NbY29sIC8gOF0gJiAoMSA8PCAoNyAtIGNvbCAlIDgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3BvcyA9IGdyYXlbMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3BvcyArKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBUYWtlT3ZlcihwTWFzayk7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIHBNYXNrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIEZYRElCXzhicHBSZ2I6IHsKLSAgICAgICAgICAgICAgICBpZiAobV9wUGFsZXR0ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhfQllURSBncmF5WzI1Nl07Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHIgPSAoRlhfQllURSkobV9wUGFsZXR0ZVtpXSA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgIGludCBnID0gKEZYX0JZVEUpKG1fcFBhbGV0dGVbaV0gPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBiID0gKEZYX0JZVEUpbV9wUGFsZXR0ZVtpXTsKLSAgICAgICAgICAgICAgICAgICAgZ3JheVtpXSA9IChGWF9CWVRFKUZYUkdCMkdSQVkociwgZywgYik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE1hc2sgPSBuZXcgQ0ZYX0RJQml0bWFwOwotICAgICAgICAgICAgICAgIGlmICghcE1hc2stPkNyZWF0ZShtX1dpZHRoLCBtX0hlaWdodCwgRlhESUJfOGJwcE1hc2spKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwTWFzazsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X3BvcyA9IHBNYXNrLT5HZXRCdWZmZXIoKSArIHJvdyAqIHBNYXNrLT5HZXRQaXRjaCgpOwotICAgICAgICAgICAgICAgICAgICBGWF9MUEJZVEUgc3JjX3BvcyA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2g7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfcG9zICsrID0gZ3JheVsqc3JjX3BvcyArK107Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgVGFrZU92ZXIocE1hc2spOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBwTWFzazsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGWERJQl9SZ2I6IHsKLSAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBNYXNrID0gbmV3IENGWF9ESUJpdG1hcDsKLSAgICAgICAgICAgICAgICBpZiAoIXBNYXNrLT5DcmVhdGUobV9XaWR0aCwgbV9IZWlnaHQsIEZYRElCXzhicHBNYXNrKSkgewotICAgICAgICAgICAgICAgICAgICBkZWxldGUgcE1hc2s7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgICAgICBGWF9MUEJZVEUgc3JjX3BvcyA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2g7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X3BvcyA9IHBNYXNrLT5HZXRCdWZmZXIoKSArIHJvdyAqIHBNYXNrLT5HZXRQaXRjaCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3BvcyArKyA9IEZYUkdCMkdSQVkoc3JjX3Bvc1syXSwgc3JjX3Bvc1sxXSwgKnNyY19wb3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3BvcyArPSAzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFRha2VPdmVyKHBNYXNrKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgcE1hc2s7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgRlhESUJfUmdiMzI6IHsKLSAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBNYXNrID0gbmV3IENGWF9ESUJpdG1hcDsKLSAgICAgICAgICAgICAgICBpZiAoIXBNYXNrLT5DcmVhdGUobV9XaWR0aCwgbV9IZWlnaHQsIEZYRElCXzhicHBNYXNrKSkgewotICAgICAgICAgICAgICAgICAgICBkZWxldGUgcE1hc2s7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgICAgICBGWF9MUEJZVEUgc3JjX3BvcyA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2g7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X3BvcyA9IHBNYXNrLT5HZXRCdWZmZXIoKSArIHJvdyAqIHBNYXNrLT5HZXRQaXRjaCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3BvcyArKyA9IEZYUkdCMkdSQVkoc3JjX3Bvc1syXSwgc3JjX3Bvc1sxXSwgKnNyY19wb3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3BvcyArPSA0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFRha2VPdmVyKHBNYXNrKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgcE1hc2s7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDRlhfRElCaXRtYXA6Ok11bHRpcGx5QWxwaGEoaW50IGFscGhhKQotewotICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHN3aXRjaCAoR2V0Rm9ybWF0KCkpIHsKLSAgICAgICAgY2FzZSBGWERJQl8xYnBwTWFzazoKLSAgICAgICAgICAgIGlmICghQ29udmVydEZvcm1hdChGWERJQl84YnBwTWFzaykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNdWx0aXBseUFscGhhKGFscGhhKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCXzhicHBNYXNrOiB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgICAgICBGWF9MUEJZVEUgc2Nhbl9saW5lID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaDsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2FuX2xpbmVbY29sXSA9IHNjYW5fbGluZVtjb2xdICogYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgRlhESUJfQXJnYjogewotICAgICAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfTFBCWVRFIHNjYW5fbGluZSA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2ggKyAzOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpzY2FuX2xpbmUgPSAoKnNjYW5fbGluZSkgKiBhbHBoYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5fbGluZSArPSA0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYgKEhhc0FscGhhKCkpIHsKLSAgICAgICAgICAgICAgICBtX3BBbHBoYU1hc2stPk11bHRpcGx5QWxwaGEoYWxwaGEpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChJc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KChGWERJQl9Gb3JtYXQpKEdldEZvcm1hdCgpIHwgMHgwMjAwKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtX3BBbHBoYU1hc2stPk11bHRpcGx5QWxwaGEoYWxwaGEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoRlhESUJfQXJnYikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBNdWx0aXBseUFscGhhKGFscGhhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0RXT1JEIENGWF9ESUJpdG1hcDo6R2V0UGl4ZWwoaW50IHgsIGludCB5KSBjb25zdAotewotICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgRlhfTFBCWVRFIHBvcyA9IG1fcEJ1ZmZlciArIHkgKiBtX1BpdGNoICsgeCAqIEdldEJQUCgpIC8gODsKLSAgICBzd2l0Y2ggKEdldEZvcm1hdCgpKSB7Ci0gICAgICAgIGNhc2UgRlhESUJfMWJwcE1hc2s6IHsKLSAgICAgICAgICAgICAgICBpZiAoKCpwb3MpICYgKDEgPDwgKDcgLSB4ICUgOCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAweGZmMDAwMDAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGWERJQl8xYnBwUmdiOiB7Ci0gICAgICAgICAgICAgICAgaWYgKCgqcG9zKSAmICgxIDw8ICg3IC0geCAlIDgpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9wUGFsZXR0ZSA/IG1fcFBhbGV0dGVbMV0gOiAweGZmZmZmZmZmOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3BQYWxldHRlID8gbV9wUGFsZXR0ZVswXSA6IDB4ZmYwMDAwMDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIEZYRElCXzhicHBNYXNrOgotICAgICAgICAgICAgcmV0dXJuICgqcG9zKSA8PCAyNDsKLSAgICAgICAgY2FzZSBGWERJQl84YnBwUmdiOgotICAgICAgICAgICAgcmV0dXJuIG1fcFBhbGV0dGUgPyBtX3BQYWxldHRlWypwb3NdIDogKDB4ZmYwMDAwMDAgfCAoKCpwb3MpICogMHgxMDEwMSkpOwotICAgICAgICBjYXNlIEZYRElCX1JnYjoKLSAgICAgICAgY2FzZSBGWERJQl9SZ2JhOgotICAgICAgICBjYXNlIEZYRElCX1JnYjMyOgotICAgICAgICAgICAgcmV0dXJuIEZYQVJHQl9HRVRESUIocG9zKSB8IDB4ZmYwMDAwMDA7Ci0gICAgICAgIGNhc2UgRlhESUJfQXJnYjoKLSAgICAgICAgICAgIHJldHVybiBGWEFSR0JfR0VURElCKHBvcyk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci12b2lkIENGWF9ESUJpdG1hcDo6U2V0UGl4ZWwoaW50IHgsIGludCB5LCBGWF9EV09SRCBjb2xvcikKLXsKLSAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoeCA8IDAgfHwgeCA+PSBtX1dpZHRoIHx8IHkgPCAwIHx8IHkgPj0gbV9IZWlnaHQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9MUEJZVEUgcG9zID0gbV9wQnVmZmVyICsgeSAqIG1fUGl0Y2ggKyB4ICogR2V0QlBQKCkgLyA4OwotICAgIHN3aXRjaCAoR2V0Rm9ybWF0KCkpIHsKLSAgICAgICAgY2FzZSBGWERJQl8xYnBwTWFzazoKLSAgICAgICAgICAgIGlmIChjb2xvciA+PiAyNCkgewotICAgICAgICAgICAgICAgICpwb3MgfD0gMSA8PCAoNyAtIHggJSA4KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKnBvcyAmPSB+KDEgPDwgKDcgLSB4ICUgOCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhESUJfMWJwcFJnYjoKLSAgICAgICAgICAgIGlmIChtX3BQYWxldHRlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbG9yID09IG1fcFBhbGV0dGVbMV0pIHsKLSAgICAgICAgICAgICAgICAgICAgKnBvcyB8PSAxIDw8ICg3IC0geCAlIDgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICpwb3MgJj0gfigxIDw8ICg3IC0geCAlIDgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChjb2xvciA9PSAweGZmZmZmZmZmKSB7Ci0gICAgICAgICAgICAgICAgICAgICpwb3MgfD0gMSA8PCAoNyAtIHggJSA4KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAqcG9zICY9IH4oMSA8PCAoNyAtIHggJSA4KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6Ci0gICAgICAgICAgICAqcG9zID0gKEZYX0JZVEUpKGNvbG9yID4+IDI0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCXzhicHBSZ2I6IHsKLSAgICAgICAgICAgICAgICBpZiAobV9wUGFsZXR0ZSkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fcFBhbGV0dGVbaV0gPT0gY29sb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcG9zID0gKEZYX0JZVEUpaTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgKnBvcyA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgKnBvcyA9IEZYUkdCMkdSQVkoRlhBUkdCX1IoY29sb3IpLCBGWEFSR0JfRyhjb2xvciksIEZYQVJHQl9CKGNvbG9yKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIEZYRElCX1JnYjoKLSAgICAgICAgY2FzZSBGWERJQl9SZ2IzMjogewotICAgICAgICAgICAgICAgIGludCBhbHBoYSA9IEZYQVJHQl9BKGNvbG9yKTsKLSAgICAgICAgICAgICAgICBwb3NbMF0gPSAoRlhBUkdCX0IoY29sb3IpICogYWxwaGEgKyBwb3NbMF0gKiAoMjU1IC0gYWxwaGEpKSAvIDI1NTsKLSAgICAgICAgICAgICAgICBwb3NbMV0gPSAoRlhBUkdCX0coY29sb3IpICogYWxwaGEgKyBwb3NbMV0gKiAoMjU1IC0gYWxwaGEpKSAvIDI1NTsKLSAgICAgICAgICAgICAgICBwb3NbMl0gPSAoRlhBUkdCX1IoY29sb3IpICogYWxwaGEgKyBwb3NbMl0gKiAoMjU1IC0gYWxwaGEpKSAvIDI1NTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGWERJQl9SZ2JhOiB7Ci0gICAgICAgICAgICAgICAgcG9zWzBdID0gRlhBUkdCX0IoY29sb3IpOwotICAgICAgICAgICAgICAgIHBvc1sxXSA9IEZYQVJHQl9HKGNvbG9yKTsKLSAgICAgICAgICAgICAgICBwb3NbMl0gPSBGWEFSR0JfUihjb2xvcik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgRlhESUJfQXJnYjoKLSAgICAgICAgICAgIEZYQVJHQl9TRVRESUIocG9zLCBjb2xvcik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLXZvaWQgQ0ZYX0RJQml0bWFwOjpEb3duU2FtcGxlU2NhbmxpbmUoaW50IGxpbmUsIEZYX0xQQllURSBkZXN0X3NjYW4sIGludCBkZXN0X2JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIEZYX0JPT0wgYkZsaXBYLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF93aWR0aCkgY29uc3QKLXsKLSAgICBpZiAobV9wQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgc3JjX0JwcCA9IG1fYnBwIC8gODsKLSAgICBGWF9MUEJZVEUgc2NhbmxpbmUgPSBtX3BCdWZmZXIgKyBsaW5lICogbV9QaXRjaDsKLSAgICBpZiAoc3JjX0JwcCA9PSAwKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xpcF93aWR0aDsgaSArKykgewotICAgICAgICAgICAgRlhfRFdPUkQgZGVzdF94ID0gY2xpcF9sZWZ0ICsgaTsKLSAgICAgICAgICAgIEZYX0RXT1JEIHNyY194ID0gZGVzdF94ICogbV9XaWR0aCAvIGRlc3Rfd2lkdGg7Ci0gICAgICAgICAgICBpZiAoYkZsaXBYKSB7Ci0gICAgICAgICAgICAgICAgc3JjX3ggPSBtX1dpZHRoIC0gc3JjX3ggLSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3JjX3ggJT0gbV9XaWR0aDsKLSAgICAgICAgICAgIGRlc3Rfc2NhbltpXSA9IChzY2FubGluZVtzcmNfeCAvIDhdICYgKDEgPDwgKDcgLSBzcmNfeCAlIDgpKSkgPyAyNTUgOiAwOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChzcmNfQnBwID09IDEpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGlwX3dpZHRoOyBpICsrKSB7Ci0gICAgICAgICAgICBGWF9EV09SRCBkZXN0X3ggPSBjbGlwX2xlZnQgKyBpOwotICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3ggPSBkZXN0X3ggKiBtX1dpZHRoIC8gZGVzdF93aWR0aDsKLSAgICAgICAgICAgIGlmIChiRmxpcFgpIHsKLSAgICAgICAgICAgICAgICBzcmNfeCA9IG1fV2lkdGggLSBzcmNfeCAtIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcmNfeCAlPSBtX1dpZHRoOwotICAgICAgICAgICAgaW50IGRlc3RfcG9zID0gaTsKLSAgICAgICAgICAgIGlmIChtX3BQYWxldHRlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFJc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zICo9IDM7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYiA9IG1fcFBhbGV0dGVbc2NhbmxpbmVbc3JjX3hdXTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zXSA9IEZYQVJHQl9CKGFyZ2IpOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3MgKyAxXSA9IEZYQVJHQl9HKGFyZ2IpOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3MgKyAyXSA9IEZYQVJHQl9SKGFyZ2IpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zICo9IDQ7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0NNWUsgY215ayA9IG1fcFBhbGV0dGVbc2NhbmxpbmVbc3JjX3hdXTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zXSA9IEZYU1lTX0dldENWYWx1ZShjbXlrKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zICsgMV0gPSBGWFNZU19HZXRNVmFsdWUoY215ayk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3BvcyArIDJdID0gRlhTWVNfR2V0WVZhbHVlKGNteWspOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3MgKyAzXSA9IEZYU1lTX0dldEtWYWx1ZShjbXlrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3Bvc10gPSBzY2FubGluZVtzcmNfeF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsaXBfd2lkdGg7IGkgKyspIHsKLSAgICAgICAgICAgIEZYX0RXT1JEIGRlc3RfeCA9IGNsaXBfbGVmdCArIGk7Ci0gICAgICAgICAgICBGWF9EV09SRCBzcmNfeCA9IGJGbGlwWCA/IChtX1dpZHRoIC0gZGVzdF94ICogbV9XaWR0aCAvIGRlc3Rfd2lkdGggLSAxKSAqIHNyY19CcHAgOiAoZGVzdF94ICogbV9XaWR0aCAvIGRlc3Rfd2lkdGgpICogc3JjX0JwcDsKLSAgICAgICAgICAgIHNyY194ICU9IG1fV2lkdGggKiBzcmNfQnBwOwotICAgICAgICAgICAgaW50IGRlc3RfcG9zID0gaSAqIHNyY19CcHA7Ci0gICAgICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8IHNyY19CcHA7IGIgKyspIHsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3MgKyBiXSA9IHNjYW5saW5lW3NyY194ICsgYl07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1GWF9CT09MIENGWF9ESUJpdG1hcDo6Q29udmVydENvbG9yU2NhbGUoRlhfRFdPUkQgZm9yZWNvbG9yLCBGWF9EV09SRCBiYWNrY29sb3IpCi17Ci0gICAgQVNTRVJUKCFJc0FscGhhTWFzaygpKTsKLSAgICBpZiAobV9wQnVmZmVyID09IE5VTEwgfHwgSXNBbHBoYU1hc2soKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGludCBmYywgZm0sIGZ5LCBmaywgYmMsIGJtLCBieSwgYms7Ci0gICAgaW50IGZyLCBmZywgZmIsIGJyLCBiZywgYmI7Ci0gICAgRlhfQk9PTCBpc0NteWtJbWFnZSA9IElzQ215a0ltYWdlKCk7Ci0gICAgaWYgKGlzQ215a0ltYWdlKSB7Ci0gICAgICAgIGZjID0gRlhTWVNfR2V0Q1ZhbHVlKGZvcmVjb2xvcik7Ci0gICAgICAgIGZtID0gRlhTWVNfR2V0TVZhbHVlKGZvcmVjb2xvcik7Ci0gICAgICAgIGZ5ID0gRlhTWVNfR2V0WVZhbHVlKGZvcmVjb2xvcik7Ci0gICAgICAgIGZrID0gRlhTWVNfR2V0S1ZhbHVlKGZvcmVjb2xvcik7Ci0gICAgICAgIGJjID0gRlhTWVNfR2V0Q1ZhbHVlKGJhY2tjb2xvcik7Ci0gICAgICAgIGJtID0gRlhTWVNfR2V0TVZhbHVlKGJhY2tjb2xvcik7Ci0gICAgICAgIGJ5ID0gRlhTWVNfR2V0WVZhbHVlKGJhY2tjb2xvcik7Ci0gICAgICAgIGJrID0gRlhTWVNfR2V0S1ZhbHVlKGJhY2tjb2xvcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnIgPSBGWFNZU19HZXRSVmFsdWUoZm9yZWNvbG9yKTsKLSAgICAgICAgZmcgPSBGWFNZU19HZXRHVmFsdWUoZm9yZWNvbG9yKTsKLSAgICAgICAgZmIgPSBGWFNZU19HZXRCVmFsdWUoZm9yZWNvbG9yKTsKLSAgICAgICAgYnIgPSBGWFNZU19HZXRSVmFsdWUoYmFja2NvbG9yKTsKLSAgICAgICAgYmcgPSBGWFNZU19HZXRHVmFsdWUoYmFja2NvbG9yKTsKLSAgICAgICAgYmIgPSBGWFNZU19HZXRCVmFsdWUoYmFja2NvbG9yKTsKLSAgICB9Ci0gICAgaWYgKG1fYnBwIDw9IDgpIHsKLSAgICAgICAgaWYgKGlzQ215a0ltYWdlKSB7Ci0gICAgICAgICAgICBpZiAoZm9yZWNvbG9yID09IDB4ZmYgJiYgYmFja2NvbG9yID09IDAgJiYgbV9wUGFsZXR0ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZm9yZWNvbG9yID09IDAgJiYgYmFja2NvbG9yID09IDB4ZmZmZmZmICYmIG1fcFBhbGV0dGUgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fcFBhbGV0dGUgPT0gTlVMTCkgewotICAgICAgICAgICAgQnVpbGRQYWxldHRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHNpemUgPSAxIDw8IG1fYnBwOwotICAgICAgICBpZiAoaXNDbXlrSW1hZ2UpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSArKykgewotICAgICAgICAgICAgICAgIEZYX0JZVEUgYiwgZywgcjsKLSAgICAgICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKG1fcFBhbGV0dGVbaV0pLCBGWFNZU19HZXRNVmFsdWUobV9wUGFsZXR0ZVtpXSksIEZYU1lTX0dldFlWYWx1ZShtX3BQYWxldHRlW2ldKSwgRlhTWVNfR2V0S1ZhbHVlKG1fcFBhbGV0dGVbaV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLCBnLCBiKTsKLSAgICAgICAgICAgICAgICBpbnQgZ3JheSA9IDI1NSAtIEZYUkdCMkdSQVkociwgZywgYik7Ci0gICAgICAgICAgICAgICAgbV9wUGFsZXR0ZVtpXSA9IENteWtFbmNvZGUoYmMgKyAoZmMgLSBiYykgKiBncmF5IC8gMjU1LCBibSArIChmbSAtIGJtKSAqIGdyYXkgLyAyNTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgKyAoZnkgLSBieSkgKiBncmF5IC8gMjU1LCBiayArIChmayAtIGJrKSAqIGdyYXkgLyAyNTUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSArKykgewotICAgICAgICAgICAgICAgIGludCBncmF5ID0gRlhSR0IyR1JBWShGWEFSR0JfUihtX3BQYWxldHRlW2ldKSwgRlhBUkdCX0cobV9wUGFsZXR0ZVtpXSksIEZYQVJHQl9CKG1fcFBhbGV0dGVbaV0pKTsKLSAgICAgICAgICAgICAgICBtX3BQYWxldHRlW2ldID0gRlhBUkdCX01BS0UoMHhmZiwgYnIgKyAoZnIgLSBicikgKiBncmF5IC8gMjU1LCBiZyArIChmZyAtIGJnKSAqIGdyYXkgLyAyNTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiICsgKGZiIC0gYmIpICogZ3JheSAvIDI1NSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAoaXNDbXlrSW1hZ2UpIHsKLSAgICAgICAgaWYgKGZvcmVjb2xvciA9PSAweGZmICYmIGJhY2tjb2xvciA9PSAweDAwKSB7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgRlhfTFBCWVRFIHNjYW5saW5lID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfQllURSBiLCBnLCByOwotICAgICAgICAgICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoc2NhbmxpbmVbMF0sIHNjYW5saW5lWzFdLCBzY2FubGluZVsyXSwgc2NhbmxpbmVbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLCBnLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgKnNjYW5saW5lICsrID0gMDsKLSAgICAgICAgICAgICAgICAgICAgKnNjYW5saW5lICsrID0gMDsKLSAgICAgICAgICAgICAgICAgICAgKnNjYW5saW5lICsrID0gMDsKLSAgICAgICAgICAgICAgICAgICAgKnNjYW5saW5lICsrID0gMjU1IC0gRlhSR0IyR1JBWShyLCBnLCBiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoZm9yZWNvbG9yID09IDAgJiYgYmFja2NvbG9yID09IDB4ZmZmZmZmKSB7Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgIEZYX0xQQllURSBzY2FubGluZSA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2g7Ci0gICAgICAgICAgICBpbnQgZ2FwID0gbV9icHAgLyA4IC0gMjsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgIGludCBncmF5ID0gRlhSR0IyR1JBWShzY2FubGluZVsyXSwgc2NhbmxpbmVbMV0sIHNjYW5saW5lWzBdKTsKLSAgICAgICAgICAgICAgICAqc2NhbmxpbmUgKysgPSBncmF5OwotICAgICAgICAgICAgICAgICpzY2FubGluZSArKyA9IGdyYXk7Ci0gICAgICAgICAgICAgICAgKnNjYW5saW5lICAgID0gZ3JheTsKLSAgICAgICAgICAgICAgICBzY2FubGluZSArPSBnYXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmIChpc0NteWtJbWFnZSkgewotICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICBGWF9MUEJZVEUgc2NhbmxpbmUgPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoOwotICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgRlhfQllURSBiLCBnLCByOwotICAgICAgICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShzY2FubGluZVswXSwgc2NhbmxpbmVbMV0sIHNjYW5saW5lWzJdLCBzY2FubGluZVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciwgZywgYik7Ci0gICAgICAgICAgICAgICAgaW50IGdyYXkgPSAyNTUgLSBGWFJHQjJHUkFZKHIsIGcsIGIpOwotICAgICAgICAgICAgICAgICpzY2FubGluZSArKyA9IGJjICsgKGZjIC0gYmMpICogZ3JheSAvIDI1NTsKLSAgICAgICAgICAgICAgICAqc2NhbmxpbmUgKysgPSBibSArIChmbSAtIGJtKSAqIGdyYXkgLyAyNTU7Ci0gICAgICAgICAgICAgICAgKnNjYW5saW5lICsrID0gYnkgKyAoZnkgLSBieSkgKiBncmF5IC8gMjU1OwotICAgICAgICAgICAgICAgICpzY2FubGluZSArKyA9IGJrICsgKGZrIC0gYmspICogZ3JheSAvIDI1NTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgIEZYX0xQQllURSBzY2FubGluZSA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2g7Ci0gICAgICAgICAgICBpbnQgZ2FwID0gbV9icHAgLyA4IC0gMjsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgIGludCBncmF5ID0gRlhSR0IyR1JBWShzY2FubGluZVsyXSwgc2NhbmxpbmVbMV0sIHNjYW5saW5lWzBdKTsKLSAgICAgICAgICAgICAgICAqc2NhbmxpbmUgKysgPSBiYiArIChmYiAtIGJiKSAqIGdyYXkgLyAyNTU7Ci0gICAgICAgICAgICAgICAgKnNjYW5saW5lICsrID0gYmcgKyAoZmcgLSBiZykgKiBncmF5IC8gMjU1OwotICAgICAgICAgICAgICAgICpzY2FubGluZSAgICA9IGJyICsgKGZyIC0gYnIpICogZ3JheSAvIDI1NTsKLSAgICAgICAgICAgICAgICBzY2FubGluZSArPSBnYXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENGWF9ESUJpdG1hcDo6RGl0aGVyRlMoY29uc3QgRlhfRFdPUkQqIHBQYWxldHRlLCBpbnQgcGFsX3NpemUsIGNvbnN0IEZYX1JFQ1QqIHBSZWN0KQotewotICAgIGlmIChtX3BCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX2JwcCAhPSA4ICYmIG1fcFBhbGV0dGUgIT0gTlVMTCAmJiBtX0FscGhhRmxhZyAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG1fV2lkdGggPCA0ICYmIG1fSGVpZ2h0IDwgNCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX1JFQ1QgcmVjdCgwLCAwLCBtX1dpZHRoLCBtX0hlaWdodCk7Ci0gICAgaWYgKHBSZWN0KSB7Ci0gICAgICAgIHJlY3QuSW50ZXJzZWN0KCpwUmVjdCk7Ci0gICAgfQotICAgIEZYX0JZVEUgdHJhbnNsYXRlWzI1Nl07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKLSAgICAgICAgaW50IGVycjIgPSA2NTUzNjsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYWxfc2l6ZTsgaiArKykgewotICAgICAgICAgICAgRlhfQllURSBlbnRyeSA9IChGWF9CWVRFKXBQYWxldHRlW2pdOwotICAgICAgICAgICAgaW50IGVyciA9IChpbnQpZW50cnkgLSBpOwotICAgICAgICAgICAgaWYgKGVyciAqIGVyciA8IGVycjIpIHsKLSAgICAgICAgICAgICAgICBlcnIyID0gZXJyICogZXJyOwotICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVtpXSA9IGVudHJ5OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGZvciAoaW50IHJvdyA9IHJlY3QudG9wOyByb3cgPCByZWN0LmJvdHRvbTsgcm93ICsrKSB7Ci0gICAgICAgIEZYX0xQQllURSBzY2FuID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaDsKLSAgICAgICAgRlhfTFBCWVRFIG5leHRfc2NhbiA9IG1fcEJ1ZmZlciArIChyb3cgKyAxKSAqIG1fUGl0Y2g7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IHJlY3QubGVmdDsgY29sIDwgcmVjdC5yaWdodDsgY29sICsrKSB7Ci0gICAgICAgICAgICBpbnQgc3JjX3BpeGVsID0gc2Nhbltjb2xdOwotICAgICAgICAgICAgaW50IGRlc3RfcGl4ZWwgPSB0cmFuc2xhdGVbc3JjX3BpeGVsXTsKLSAgICAgICAgICAgIHNjYW5bY29sXSA9IChGWF9CWVRFKWRlc3RfcGl4ZWw7Ci0gICAgICAgICAgICBpbnQgZXJyb3IgPSAtZGVzdF9waXhlbCArIHNyY19waXhlbDsKLSAgICAgICAgICAgIGlmIChjb2wgPCByZWN0LnJpZ2h0IC0gMSkgewotICAgICAgICAgICAgICAgIGludCBzcmMgPSBzY2FuW2NvbCArIDFdOwotICAgICAgICAgICAgICAgIHNyYyArPSBlcnJvciAqIDcgLyAxNjsKLSAgICAgICAgICAgICAgICBpZiAoc3JjID4gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjYW5bY29sICsgMV0gPSAyNTU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzcmMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjYW5bY29sICsgMV0gPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjYW5bY29sICsgMV0gPSBzcmM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNvbCA8IHJlY3QucmlnaHQgLSAxICYmIHJvdyA8IHJlY3QuYm90dG9tIC0gMSkgewotICAgICAgICAgICAgICAgIGludCBzcmMgPSBuZXh0X3NjYW5bY29sICsgMV07Ci0gICAgICAgICAgICAgICAgc3JjICs9IGVycm9yICogMSAvIDE2OwotICAgICAgICAgICAgICAgIGlmIChzcmMgPiAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4dF9zY2FuW2NvbCArIDFdID0gMjU1OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBuZXh0X3NjYW5bY29sICsgMV0gPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRfc2Nhbltjb2wgKyAxXSA9IHNyYzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocm93IDwgcmVjdC5ib3R0b20gLSAxKSB7Ci0gICAgICAgICAgICAgICAgaW50IHNyYyA9IG5leHRfc2Nhbltjb2xdOwotICAgICAgICAgICAgICAgIHNyYyArPSBlcnJvciAqIDUgLyAxNjsKLSAgICAgICAgICAgICAgICBpZiAoc3JjID4gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRfc2Nhbltjb2xdID0gMjU1OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBuZXh0X3NjYW5bY29sXSA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4dF9zY2FuW2NvbF0gPSBzcmM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNvbCA+IHJlY3QubGVmdCAmJiByb3cgPCByZWN0LmJvdHRvbSAtIDEpIHsKLSAgICAgICAgICAgICAgICBpbnQgc3JjID0gbmV4dF9zY2FuW2NvbCAtIDFdOwotICAgICAgICAgICAgICAgIHNyYyArPSBlcnJvciAqIDMgLyAxNjsKLSAgICAgICAgICAgICAgICBpZiAoc3JjID4gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRfc2Nhbltjb2wgLSAxXSA9IDI1NTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNyYyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4dF9zY2FuW2NvbCAtIDFdID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBuZXh0X3NjYW5bY29sIC0gMV0gPSBzcmM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotQ0ZYX0RJQml0bWFwKiBDRlhfRElCU291cmNlOjpGbGlwSW1hZ2UoRlhfQk9PTCBiWEZsaXAsIEZYX0JPT0wgYllGbGlwKSBjb25zdAotewotICAgIENGWF9ESUJpdG1hcCogcEZsaXBwZWQgPSBuZXcgQ0ZYX0RJQml0bWFwOwotICAgIGlmICghcEZsaXBwZWQtPkNyZWF0ZShtX1dpZHRoLCBtX0hlaWdodCwgR2V0Rm9ybWF0KCkpKSB7Ci0gICAgICAgIGRlbGV0ZSBwRmxpcHBlZDsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHBGbGlwcGVkLT5Db3B5UGFsZXR0ZShtX3BQYWxldHRlKTsKLSAgICBGWF9MUEJZVEUgcERlc3RCdWZmZXIgPSBwRmxpcHBlZC0+R2V0QnVmZmVyKCk7Ci0gICAgaW50IEJwcCA9IG1fYnBwIC8gODsKLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgIEZYX0xQQ0JZVEUgc3JjX3NjYW4gPSBHZXRTY2FubGluZShyb3cpOwotICAgICAgICBGWF9MUEJZVEUgZGVzdF9zY2FuID0gcERlc3RCdWZmZXIgKyBtX1BpdGNoICogKGJZRmxpcCA/IChtX0hlaWdodCAtIHJvdyAtIDEpIDogcm93KTsKLSAgICAgICAgaWYgKCFiWEZsaXApIHsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fUGl0Y2gpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fYnBwID09IDEpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbXNldDMyKGRlc3Rfc2NhbiwgMCwgbV9QaXRjaCk7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspCi0gICAgICAgICAgICAgICAgaWYgKHNyY19zY2FuW2NvbCAvIDhdICYgKDEgPDwgKDcgLSBjb2wgJSA4KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfY29sID0gbV9XaWR0aCAtIGNvbCAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X2NvbCAvIDhdIHw9ICgxIDw8ICg3IC0gZGVzdF9jb2wgJSA4KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVzdF9zY2FuICs9IChtX1dpZHRoIC0gMSkgKiBCcHA7Ci0gICAgICAgICAgICBpZiAoQnBwID09IDEpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9ICpzcmNfc2NhbjsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuIC0tOwotICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEJwcCA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IHNyY19zY2FuWzBdOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBzcmNfc2NhblsxXTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gc3JjX3NjYW5bMl07Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiAtPSAzOwotICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKEJwcCA9PSA0KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9zY2FuID0gKihGWF9EV09SRCopc3JjX3NjYW47Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiAtPSA0OwotICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobV9wQWxwaGFNYXNrKSB7Ci0gICAgICAgIHBEZXN0QnVmZmVyID0gcEZsaXBwZWQtPm1fcEFscGhhTWFzay0+R2V0QnVmZmVyKCk7Ci0gICAgICAgIEZYX0RXT1JEIGRlc3RfcGl0Y2ggPSBwRmxpcHBlZC0+bV9wQWxwaGFNYXNrLT5HZXRQaXRjaCgpOwotICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICBGWF9MUENCWVRFIHNyY19zY2FuID0gbV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShyb3cpOwotICAgICAgICAgICAgRlhfTFBCWVRFIGRlc3Rfc2NhbiA9IHBEZXN0QnVmZmVyICsgZGVzdF9waXRjaCAqIChiWUZsaXAgPyAobV9IZWlnaHQgLSByb3cgLSAxKSA6IHJvdyk7Ci0gICAgICAgICAgICBpZiAoIWJYRmxpcCkgewotICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIGRlc3RfcGl0Y2gpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9zY2FuICs9IChtX1dpZHRoIC0gMSk7Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gKnNyY19zY2FuOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiAtLTsKLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcEZsaXBwZWQ7Ci19Ci1DRlhfRElCRXh0cmFjdG9yOjpDRlhfRElCRXh0cmFjdG9yKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMpCi17Ci0gICAgbV9wQml0bWFwID0gTlVMTDsKLSAgICBpZiAocFNyYy0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgewotICAgICAgICBtX3BCaXRtYXAgPSBwU3JjLT5DbG9uZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcEJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7Ci0gICAgICAgIGlmICghbV9wQml0bWFwLT5DcmVhdGUocFNyYy0+R2V0V2lkdGgoKSwgcFNyYy0+R2V0SGVpZ2h0KCksIHBTcmMtPkdldEZvcm1hdCgpLCBwU3JjLT5HZXRCdWZmZXIoKSkpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtX3BCaXRtYXA7Ci0gICAgICAgICAgICBtX3BCaXRtYXAgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1fcEJpdG1hcC0+Q29weVBhbGV0dGUocFNyYy0+R2V0UGFsZXR0ZSgpKTsKLSAgICAgICAgbV9wQml0bWFwLT5Db3B5QWxwaGFNYXNrKHBTcmMtPm1fcEFscGhhTWFzayk7Ci0gICAgfQotfQotQ0ZYX0RJQkV4dHJhY3Rvcjo6fkNGWF9ESUJFeHRyYWN0b3IoKQotewotICAgIGlmIChtX3BCaXRtYXApIHsKLSAgICAgICAgZGVsZXRlIG1fcEJpdG1hcDsKLSAgICB9Ci19Ci1DRlhfRmlsdGVyZWRESUI6OkNGWF9GaWx0ZXJlZERJQigpCi17Ci0gICAgbV9wU2NhbmxpbmUgPSBOVUxMOwotICAgIG1fcFNyYyA9IE5VTEw7Ci19Ci1DRlhfRmlsdGVyZWRESUI6On5DRlhfRmlsdGVyZWRESUIoKQotewotICAgIGlmIChtX3BTcmMgJiYgbV9iQXV0b0Ryb3BTcmMpIHsKLSAgICAgICAgZGVsZXRlIG1fcFNyYzsKLSAgICB9Ci0gICAgaWYgKG1fcFNjYW5saW5lKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wU2NhbmxpbmUpOwotICAgIH0KLX0KLXZvaWQgQ0ZYX0ZpbHRlcmVkRElCOjpMb2FkU3JjKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsIEZYX0JPT0wgYkF1dG9Ecm9wU3JjKQotewotICAgIG1fcFNyYyA9IHBTcmM7Ci0gICAgbV9iQXV0b0Ryb3BTcmMgPSBiQXV0b0Ryb3BTcmM7Ci0gICAgbV9XaWR0aCA9IHBTcmMtPkdldFdpZHRoKCk7Ci0gICAgbV9IZWlnaHQgPSBwU3JjLT5HZXRIZWlnaHQoKTsKLSAgICBGWERJQl9Gb3JtYXQgZm9ybWF0ID0gR2V0RGVzdEZvcm1hdCgpOwotICAgIG1fYnBwID0gKEZYX0JZVEUpZm9ybWF0OwotICAgIG1fQWxwaGFGbGFnID0gKEZYX0JZVEUpKGZvcm1hdCA+PiA4KTsKLSAgICBtX1BpdGNoID0gKG1fV2lkdGggKiAoZm9ybWF0ICYgMHhmZikgKyAzMSkgLyAzMiAqIDQ7Ci0gICAgbV9wUGFsZXR0ZSA9IEdldERlc3RQYWxldHRlKCk7Ci0gICAgbV9wU2NhbmxpbmUgPSBGWF9BbGxvYyhGWF9CWVRFLCBtX1BpdGNoKTsKLX0KLUZYX0xQQ0JZVEUgQ0ZYX0ZpbHRlcmVkRElCOjpHZXRTY2FubGluZShpbnQgbGluZSkgY29uc3QKLXsKLSAgICBUcmFuc2xhdGVTY2FubGluZShtX3BTY2FubGluZSwgbV9wU3JjLT5HZXRTY2FubGluZShsaW5lKSk7Ci0gICAgcmV0dXJuIG1fcFNjYW5saW5lOwotfQotdm9pZCBDRlhfRmlsdGVyZWRESUI6OkRvd25TYW1wbGVTY2FubGluZShpbnQgbGluZSwgRlhfTFBCWVRFIGRlc3Rfc2NhbiwgaW50IGRlc3RfYnBwLAotICAgICAgICBpbnQgZGVzdF93aWR0aCwgRlhfQk9PTCBiRmxpcFgsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3dpZHRoKSBjb25zdAotewotICAgIG1fcFNyYy0+RG93blNhbXBsZVNjYW5saW5lKGxpbmUsIGRlc3Rfc2NhbiwgZGVzdF9icHAsIGRlc3Rfd2lkdGgsIGJGbGlwWCwgY2xpcF9sZWZ0LCBjbGlwX3dpZHRoKTsKLSAgICBUcmFuc2xhdGVEb3duU2FtcGxlcyhkZXN0X3NjYW4sIGRlc3Rfc2NhbiwgY2xpcF93aWR0aCwgZGVzdF9icHApOwotfQotQ0ZYX0ltYWdlUmVuZGVyZXI6OkNGWF9JbWFnZVJlbmRlcmVyKCkKLXsKLSAgICBtX1N0YXR1cyA9IDA7Ci0gICAgbV9wVHJhbnNmb3JtZXIgPSBOVUxMOwotICAgIG1fYlJnYkJ5dGVPcmRlciA9IEZBTFNFOwotICAgIG1fQmxlbmRUeXBlID0gRlhESUJfQkxFTkRfTk9STUFMOwotfQotQ0ZYX0ltYWdlUmVuZGVyZXI6On5DRlhfSW1hZ2VSZW5kZXJlcigpCi17Ci0gICAgaWYgKG1fcFRyYW5zZm9ybWVyKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BUcmFuc2Zvcm1lcjsKLSAgICB9Ci19Ci1leHRlcm4gRlhfUkVDVCBfRlhESUJfU3dhcENsaXBCb3goRlhfUkVDVCYgY2xpcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWF9CT09MIGJGbGlwWCwgRlhfQk9PTCBiRmxpcFkpOwotRlhfQk9PTCBDRlhfSW1hZ2VSZW5kZXJlcjo6U3RhcnQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBpbnQgYml0bWFwX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbWFza19jb2xvciwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGRpYl9mbGFncywgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQotewotICAgIG1fTWF0cml4ID0gKnBNYXRyaXg7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCBpbWFnZV9yZWN0X2YgPSBtX01hdHJpeC5HZXRVbml0UmVjdCgpOwotICAgIEZYX1JFQ1QgaW1hZ2VfcmVjdCA9IGltYWdlX3JlY3RfZi5HZXRPdXR0ZXJSZWN0KCk7Ci0gICAgbV9DbGlwQm94ID0gcENsaXBSZ24gPyBwQ2xpcFJnbi0+R2V0Qm94KCkgOiBGWF9SRUNUKDAsIDAsIHBEZXZpY2UtPkdldFdpZHRoKCksIHBEZXZpY2UtPkdldEhlaWdodCgpKTsKLSAgICBtX0NsaXBCb3guSW50ZXJzZWN0KGltYWdlX3JlY3QpOwotICAgIGlmIChtX0NsaXBCb3guSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbV9wRGV2aWNlID0gcERldmljZTsKLSAgICBtX3BDbGlwUmduID0gcENsaXBSZ247Ci0gICAgbV9NYXNrQ29sb3IgPSBtYXNrX2NvbG9yOwotICAgIG1fQml0bWFwQWxwaGEgPSBiaXRtYXBfYWxwaGE7Ci0gICAgbV9NYXRyaXggPSAqcE1hdHJpeDsKLSAgICBtX0ZsYWdzID0gZGliX2ZsYWdzOwotICAgIG1fQWxwaGFGbGFnID0gYWxwaGFfZmxhZzsKLSAgICBtX3BJY2NUcmFuc2Zvcm0gPSBwSWNjVHJhbnNmb3JtOwotICAgIG1fYlJnYkJ5dGVPcmRlciA9IGJSZ2JCeXRlT3JkZXI7Ci0gICAgbV9CbGVuZFR5cGUgPSBibGVuZF90eXBlOwotICAgIEZYX0JPT0wgcmV0ID0gVFJVRTsKLSAgICBpZiAoKEZYU1lTX2ZhYnMobV9NYXRyaXguYikgPj0gMC41ZiB8fCBtX01hdHJpeC5hID09IDApIHx8Ci0gICAgICAgICAgICAoRlhTWVNfZmFicyhtX01hdHJpeC5jKSA+PSAwLjVmIHx8IG1fTWF0cml4LmQgPT0gMCkgKSB7Ci0gICAgICAgIGlmIChGWFNZU19mYWJzKG1fTWF0cml4LmEpIDwgRlhTWVNfZmFicyhtX01hdHJpeC5iKSAvIDIwICYmIEZYU1lTX2ZhYnMobV9NYXRyaXguZCkgPCBGWFNZU19mYWJzKG1fTWF0cml4LmMpIC8gMjAgJiYKLSAgICAgICAgICAgICAgICBGWFNZU19mYWJzKG1fTWF0cml4LmEpIDwgMC41ZiAmJiBGWFNZU19mYWJzKG1fTWF0cml4LmQpIDwgMC41ZikgewotICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGggPSBpbWFnZV9yZWN0LldpZHRoKCk7Ci0gICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQgPSBpbWFnZV9yZWN0LkhlaWdodCgpOwotICAgICAgICAgICAgRlhfUkVDVCBiaXRtYXBfY2xpcCA9IG1fQ2xpcEJveDsKLSAgICAgICAgICAgIGJpdG1hcF9jbGlwLk9mZnNldCgtaW1hZ2VfcmVjdC5sZWZ0LCAtaW1hZ2VfcmVjdC50b3ApOwotICAgICAgICAgICAgYml0bWFwX2NsaXAgPSBfRlhESUJfU3dhcENsaXBCb3goYml0bWFwX2NsaXAsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBtX01hdHJpeC5jID4gMCwgbV9NYXRyaXguYiA8IDApOwotICAgICAgICAgICAgbV9Db21wb3Nlci5Db21wb3NlKHBEZXZpY2UsIHBDbGlwUmduLCBiaXRtYXBfYWxwaGEsIG1hc2tfY29sb3IsIG1fQ2xpcEJveCwgVFJVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX01hdHJpeC5jID4gMCwgbV9NYXRyaXguYiA8IDAsIG1fYlJnYkJ5dGVPcmRlciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgbV9CbGVuZFR5cGUpOwotICAgICAgICAgICAgaWYgKCFtX1N0cmV0Y2hlci5TdGFydCgmbV9Db21wb3NlciwgcFNvdXJjZSwgZGVzdF9oZWlnaHQsIGRlc3Rfd2lkdGgsIGJpdG1hcF9jbGlwLCBkaWJfZmxhZ3MpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9TdGF0dXMgPSAxOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgbV9TdGF0dXMgPSAyOwotICAgICAgICBtX3BUcmFuc2Zvcm1lciA9IG5ldyBDRlhfSW1hZ2VUcmFuc2Zvcm1lcjsKLSAgICAgICAgbV9wVHJhbnNmb3JtZXItPlN0YXJ0KHBTb3VyY2UsICZtX01hdHJpeCwgZGliX2ZsYWdzLCAmbV9DbGlwQm94KTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGludCBkZXN0X3dpZHRoID0gaW1hZ2VfcmVjdC5XaWR0aCgpOwotICAgIGlmIChtX01hdHJpeC5hIDwgMCkgewotICAgICAgICBkZXN0X3dpZHRoID0gLWRlc3Rfd2lkdGg7Ci0gICAgfQotICAgIGludCBkZXN0X2hlaWdodCA9IGltYWdlX3JlY3QuSGVpZ2h0KCk7Ci0gICAgaWYgKG1fTWF0cml4LmQgPiAwKSB7Ci0gICAgICAgIGRlc3RfaGVpZ2h0ID0gLWRlc3RfaGVpZ2h0OwotICAgIH0KLSAgICBpZiAoZGVzdF93aWR0aCA9PSAwIHx8IGRlc3RfaGVpZ2h0ID09IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9SRUNUIGJpdG1hcF9jbGlwID0gbV9DbGlwQm94OwotICAgIGJpdG1hcF9jbGlwLk9mZnNldCgtaW1hZ2VfcmVjdC5sZWZ0LCAtaW1hZ2VfcmVjdC50b3ApOwotICAgIG1fQ29tcG9zZXIuQ29tcG9zZShwRGV2aWNlLCBwQ2xpcFJnbiwgYml0bWFwX2FscGhhLCBtYXNrX2NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICBtX0NsaXBCb3gsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIG1fYlJnYkJ5dGVPcmRlciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgbV9CbGVuZFR5cGUpOwotICAgIG1fU3RhdHVzID0gMTsKLSAgICByZXQgPSBtX1N0cmV0Y2hlci5TdGFydCgmbV9Db21wb3NlciwgcFNvdXJjZSwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIGJpdG1hcF9jbGlwLCBkaWJfZmxhZ3MpOwotICAgIHJldHVybiByZXQ7Ci19Ci1GWF9CT09MIENGWF9JbWFnZVJlbmRlcmVyOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBpZiAobV9TdGF0dXMgPT0gMSkgewotICAgICAgICByZXR1cm4gbV9TdHJldGNoZXIuQ29udGludWUocFBhdXNlKTsKLSAgICB9IGVsc2UgaWYgKG1fU3RhdHVzID09IDIpIHsKLSAgICAgICAgaWYgKG1fcFRyYW5zZm9ybWVyLT5Db250aW51ZShwUGF1c2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBtX3BUcmFuc2Zvcm1lci0+bV9TdG9yZXIuRGV0YWNoKCk7Ci0gICAgICAgIGlmIChwQml0bWFwID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAocEJpdG1hcC0+R2V0QnVmZmVyKCkgPT0gTlVMTCkgewotICAgICAgICAgICAgZGVsZXRlIHBCaXRtYXA7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgICAgIGlmIChtX0JpdG1hcEFscGhhICE9IDI1NSkgewotICAgICAgICAgICAgICAgIGlmIChtX0FscGhhRmxhZyA+PiA4KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fQWxwaGFGbGFnID0gKCgoRlhfQllURSkoKG1fQWxwaGFGbGFnICYgMHhmZikgKiBtX0JpdG1hcEFscGhhIC8gMjU1KSkgfCAoKG1fQWxwaGFGbGFnID4+IDgpIDw8IDgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtX01hc2tDb2xvciA9IEZYQVJHQl9NVUxfQUxQSEEobV9NYXNrQ29sb3IsIG1fQml0bWFwQWxwaGEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fcERldmljZS0+Q29tcG9zaXRlTWFzayhtX3BUcmFuc2Zvcm1lci0+bV9SZXN1bHRMZWZ0LCBtX3BUcmFuc2Zvcm1lci0+bV9SZXN1bHRUb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdG1hcC0+R2V0V2lkdGgoKSwgcEJpdG1hcC0+R2V0SGVpZ2h0KCksIHBCaXRtYXAsIG1fTWFza0NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIG1fQmxlbmRUeXBlLCBtX3BDbGlwUmduLCBtX2JSZ2JCeXRlT3JkZXIsIG1fQWxwaGFGbGFnLCBtX3BJY2NUcmFuc2Zvcm0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1fQml0bWFwQWxwaGEgIT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgcEJpdG1hcC0+TXVsdGlwbHlBbHBoYShtX0JpdG1hcEFscGhhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fcERldmljZS0+Q29tcG9zaXRlQml0bWFwKG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdExlZnQsIG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdFRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpLCBwQml0bWFwLCAwLCAwLCBtX0JsZW5kVHlwZSwgbV9wQ2xpcFJnbiwgbV9iUmdiQnl0ZU9yZGVyLCBtX3BJY2NUcmFuc2Zvcm0pOwotICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZSBwQml0bWFwOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQorRlhfQk9PTCBDRlhfRElCaXRtYXA6OkxvYWRDaGFubmVsKEZYRElCX0NoYW5uZWwgZGVzdENoYW5uZWwsIGludCB2YWx1ZSkgeworICBpZiAoIW1fcEJ1ZmZlcikgewogICAgIHJldHVybiBGQUxTRTsKLX0KLUNGWF9CaXRtYXBTdG9yZXI6OkNGWF9CaXRtYXBTdG9yZXIoKQotewotICAgIG1fcEJpdG1hcCA9IE5VTEw7Ci19Ci1DRlhfQml0bWFwU3RvcmVyOjp+Q0ZYX0JpdG1hcFN0b3JlcigpCi17Ci0gICAgaWYgKG1fcEJpdG1hcCkgewotICAgICAgICBkZWxldGUgbV9wQml0bWFwOwotICAgIH0KLX0KLUNGWF9ESUJpdG1hcCogQ0ZYX0JpdG1hcFN0b3Jlcjo6RGV0YWNoKCkKLXsKLSAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBtX3BCaXRtYXA7Ci0gICAgbV9wQml0bWFwID0gTlVMTDsKLSAgICByZXR1cm4gcEJpdG1hcDsKLX0KLXZvaWQgQ0ZYX0JpdG1hcFN0b3Jlcjo6UmVwbGFjZShDRlhfRElCaXRtYXAqIHBCaXRtYXApCi17Ci0gICAgaWYgKG1fcEJpdG1hcCkgewotICAgICAgICBkZWxldGUgbV9wQml0bWFwOwotICAgIH0KLSAgICBtX3BCaXRtYXAgPSBwQml0bWFwOwotfQotdm9pZCBDRlhfQml0bWFwU3RvcmVyOjpDb21wb3NlU2NhbmxpbmUoaW50IGxpbmUsIEZYX0xQQ0JZVEUgc2NhbmxpbmUsIEZYX0xQQ0JZVEUgc2Nhbl9leHRyYV9hbHBoYSkKLXsKLSAgICBGWF9MUEJZVEUgZGVzdF9idWYgPSAoRlhfTFBCWVRFKW1fcEJpdG1hcC0+R2V0U2NhbmxpbmUobGluZSk7Ci0gICAgRlhfTFBCWVRFIGRlc3RfYWxwaGFfYnVmID0gbV9wQml0bWFwLT5tX3BBbHBoYU1hc2sgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9MUEJZVEUpbV9wQml0bWFwLT5tX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKGxpbmUpIDogTlVMTDsKLSAgICBpZiAoZGVzdF9idWYpIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5MzIoZGVzdF9idWYsIHNjYW5saW5lLCBtX3BCaXRtYXAtPkdldFBpdGNoKCkpOwotICAgIH0KLSAgICBpZiAoZGVzdF9hbHBoYV9idWYpIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5MzIoZGVzdF9hbHBoYV9idWYsIHNjYW5fZXh0cmFfYWxwaGEsIG1fcEJpdG1hcC0+bV9wQWxwaGFNYXNrLT5HZXRQaXRjaCgpKTsKLSAgICB9Ci19Ci1GWF9CT09MIENGWF9CaXRtYXBTdG9yZXI6OlNldEluZm8oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwgRlhfRFdPUkQqIHBTcmNQYWxldHRlKQotewotICAgIG1fcEJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7Ci0gICAgaWYgKCFtX3BCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBzcmNfZm9ybWF0KSkgewotICAgICAgICBkZWxldGUgbV9wQml0bWFwOwotICAgICAgICBtX3BCaXRtYXAgPSBOVUxMOworICB9CisgIGludCBkZXN0T2Zmc2V0OworICBpZiAoZGVzdENoYW5uZWwgPT0gRlhESUJfQWxwaGEpIHsKKyAgICBpZiAoSXNBbHBoYU1hc2soKSkgeworICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KEZYRElCXzhicHBNYXNrKSkgewogICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBkZXN0T2Zmc2V0ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgZGVzdE9mZnNldCA9IDA7CisgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoSXNDbXlrSW1hZ2UoKSA/IEZYRElCX0NteWthIDogRlhESUJfQXJnYikpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgaWYgKEdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpIHsKKyAgICAgICAgZGVzdE9mZnNldCA9IDM7CisgICAgICB9CiAgICAgfQotICAgIGlmIChwU3JjUGFsZXR0ZSkgewotICAgICAgICBtX3BCaXRtYXAtPkNvcHlQYWxldHRlKHBTcmNQYWxldHRlKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoSXNBbHBoYU1hc2soKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZiAoR2V0QlBQKCkgPCAyNCkgeworICAgICAgaWYgKEhhc0FscGhhKCkpIHsKKyAgICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KElzQ215a0ltYWdlKCkgPyBGWERJQl9DbXlrYSA6IEZYRElCX0FyZ2IpKSB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICB9IGVsc2UKKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworICAgICAgICAgIGlmICghQ29udmVydEZvcm1hdChJc0NteWtJbWFnZSgpID8gRlhESUJfQ215ayA6IEZYRElCX1JnYikpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorI2Vsc2UKKyAgICAgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoSXNDbXlrSW1hZ2UoKSA/IEZYRElCX0NteWsgOiBGWERJQl9SZ2IzMikpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorI2VuZGlmCisgICAgfQorICAgIGRlc3RPZmZzZXQgPSBnX0NoYW5uZWxPZmZzZXRbZGVzdENoYW5uZWxdOworICB9CisgIGludCBCcHAgPSBHZXRCUFAoKSAvIDg7CisgIGlmIChCcHAgPT0gMSkgeworICAgIEZYU1lTX21lbXNldChtX3BCdWZmZXIsIHZhbHVlLCBtX0hlaWdodCAqIG1fUGl0Y2gpOworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChkZXN0Q2hhbm5lbCA9PSBGWERJQl9BbHBoYSAmJiBtX3BBbHBoYU1hc2spIHsKKyAgICBGWFNZU19tZW1zZXQobV9wQWxwaGFNYXNrLT5HZXRCdWZmZXIoKSwgdmFsdWUsCisgICAgICAgICAgICAgICAgIG1fcEFscGhhTWFzay0+R2V0SGVpZ2h0KCkgKiBtX3BBbHBoYU1hc2stPkdldFBpdGNoKCkpOworICAgIHJldHVybiBUUlVFOworICB9CisgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3crKykgeworICAgIHVpbnQ4X3QqIHNjYW5fbGluZSA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2ggKyBkZXN0T2Zmc2V0OworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7CisgICAgICAqc2Nhbl9saW5lID0gdmFsdWU7CisgICAgICBzY2FuX2xpbmUgKz0gQnBwOworICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpNdWx0aXBseUFscGhhKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXApIHsKKyAgaWYgKCFtX3BCdWZmZXIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQVNTRVJUKHBTcmNCaXRtYXAtPklzQWxwaGFNYXNrKCkpOworICBpZiAoIXBTcmNCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKCFJc0FscGhhTWFzaygpICYmICFIYXNBbHBoYSgpKSB7CisgICAgcmV0dXJuIExvYWRDaGFubmVsKEZYRElCX0FscGhhLCBwU3JjQml0bWFwLCBGWERJQl9BbHBoYSk7CisgIH0KKyAgQ0ZYX0RJQml0bWFwKiBwU3JjQ2xvbmUgPSAoQ0ZYX0RJQml0bWFwKilwU3JjQml0bWFwOworICBpZiAocFNyY0JpdG1hcC0+R2V0V2lkdGgoKSAhPSBtX1dpZHRoIHx8CisgICAgICBwU3JjQml0bWFwLT5HZXRIZWlnaHQoKSAhPSBtX0hlaWdodCkgeworICAgIHBTcmNDbG9uZSA9IHBTcmNCaXRtYXAtPlN0cmV0Y2hUbyhtX1dpZHRoLCBtX0hlaWdodCk7CisgICAgaWYgKCFwU3JjQ2xvbmUpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKyAgaWYgKElzQWxwaGFNYXNrKCkpIHsKKyAgICBpZiAoIUNvbnZlcnRGb3JtYXQoRlhESUJfOGJwcE1hc2spKSB7CisgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKKyAgICAgICAgZGVsZXRlIHBTcmNDbG9uZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdysrKSB7CisgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBtX3BCdWZmZXIgKyBtX1BpdGNoICogcm93OworICAgICAgdWludDhfdCogc3JjX3NjYW4gPSBwU3JjQ2xvbmUtPm1fcEJ1ZmZlciArIHBTcmNDbG9uZS0+bV9QaXRjaCAqIHJvdzsKKyAgICAgIGlmIChwU3JjQ2xvbmUtPkdldEJQUCgpID09IDEpIHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgICBpZiAoISgoMSA8PCAoNyAtIGNvbCAlIDgpKSAmIHNyY19zY2FuW2NvbCAvIDhdKSkgeworICAgICAgICAgICAgZGVzdF9zY2FuW2NvbF0gPSAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gKCpkZXN0X3NjYW4pICogc3JjX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYikgeworICAgICAgaWYgKHBTcmNDbG9uZS0+R2V0QlBQKCkgPT0gMSkgeworICAgICAgICBpZiAocFNyY0Nsb25lICE9IHBTcmNCaXRtYXApIHsKKyAgICAgICAgICBkZWxldGUgcFNyY0Nsb25lOworICAgICAgICB9CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3crKykgeworICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBtX3BCdWZmZXIgKyBtX1BpdGNoICogcm93ICsgMzsKKyAgICAgICAgdWludDhfdCogc3JjX3NjYW4gPSBwU3JjQ2xvbmUtPm1fcEJ1ZmZlciArIHBTcmNDbG9uZS0+bV9QaXRjaCAqIHJvdzsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gKCpkZXN0X3NjYW4pICogc3JjX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBtX3BBbHBoYU1hc2stPk11bHRpcGx5QWxwaGEocFNyY0Nsb25lKTsKKyAgICB9CisgIH0KKyAgaWYgKHBTcmNDbG9uZSAhPSBwU3JjQml0bWFwKSB7CisgICAgZGVsZXRlIHBTcmNDbG9uZTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpHZXRHcmF5RGF0YSh2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIGlmICghbV9wQnVmZmVyKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHN3aXRjaCAoR2V0Rm9ybWF0KCkpIHsKKyAgICBjYXNlIEZYRElCXzFicHBSZ2I6IHsKKyAgICAgIGlmICghbV9wUGFsZXR0ZSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICB1aW50OF90IGdyYXlbMl07CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBpbnQgciA9ICh1aW50OF90KShtX3BQYWxldHRlW2ldID4+IDE2KTsKKyAgICAgICAgaW50IGcgPSAodWludDhfdCkobV9wUGFsZXR0ZVtpXSA+PiA4KTsKKyAgICAgICAgaW50IGIgPSAodWludDhfdCltX3BQYWxldHRlW2ldOworICAgICAgICBncmF5W2ldID0gKHVpbnQ4X3QpRlhSR0IyR1JBWShyLCBnLCBiKTsKKyAgICAgIH0KKyAgICAgIENGWF9ESUJpdG1hcCogcE1hc2sgPSBuZXcgQ0ZYX0RJQml0bWFwOworICAgICAgaWYgKCFwTWFzay0+Q3JlYXRlKG1fV2lkdGgsIG1fSGVpZ2h0LCBGWERJQl84YnBwTWFzaykpIHsKKyAgICAgICAgZGVsZXRlIHBNYXNrOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBGWFNZU19tZW1zZXQocE1hc2stPkdldEJ1ZmZlcigpLCBncmF5WzBdLCBwTWFzay0+R2V0UGl0Y2goKSAqIG1fSGVpZ2h0KTsKKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3crKykgeworICAgICAgICB1aW50OF90KiBzcmNfcG9zID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaDsKKyAgICAgICAgdWludDhfdCogZGVzdF9wb3MgPSAodWludDhfdCopcE1hc2stPkdldFNjYW5saW5lKHJvdyk7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgaWYgKHNyY19wb3NbY29sIC8gOF0gJiAoMSA8PCAoNyAtIGNvbCAlIDgpKSkgeworICAgICAgICAgICAgKmRlc3RfcG9zID0gZ3JheVsxXTsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVzdF9wb3MrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgVGFrZU92ZXIocE1hc2spOworICAgICAgZGVsZXRlIHBNYXNrOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRlhESUJfOGJwcFJnYjogeworICAgICAgaWYgKCFtX3BQYWxldHRlKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIHVpbnQ4X3QgZ3JheVsyNTZdOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBpbnQgciA9ICh1aW50OF90KShtX3BQYWxldHRlW2ldID4+IDE2KTsKKyAgICAgICAgaW50IGcgPSAodWludDhfdCkobV9wUGFsZXR0ZVtpXSA+PiA4KTsKKyAgICAgICAgaW50IGIgPSAodWludDhfdCltX3BQYWxldHRlW2ldOworICAgICAgICBncmF5W2ldID0gKHVpbnQ4X3QpRlhSR0IyR1JBWShyLCBnLCBiKTsKKyAgICAgIH0KKyAgICAgIENGWF9ESUJpdG1hcCogcE1hc2sgPSBuZXcgQ0ZYX0RJQml0bWFwOworICAgICAgaWYgKCFwTWFzay0+Q3JlYXRlKG1fV2lkdGgsIG1fSGVpZ2h0LCBGWERJQl84YnBwTWFzaykpIHsKKyAgICAgICAgZGVsZXRlIHBNYXNrOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCogZGVzdF9wb3MgPSBwTWFzay0+R2V0QnVmZmVyKCkgKyByb3cgKiBwTWFzay0+R2V0UGl0Y2goKTsKKyAgICAgICAgdWludDhfdCogc3JjX3BvcyA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2g7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgKmRlc3RfcG9zKysgPSBncmF5WypzcmNfcG9zKytdOworICAgICAgICB9CisgICAgICB9CisgICAgICBUYWtlT3ZlcihwTWFzayk7CisgICAgICBkZWxldGUgcE1hc2s7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGWERJQl9SZ2I6IHsKKyAgICAgIENGWF9ESUJpdG1hcCogcE1hc2sgPSBuZXcgQ0ZYX0RJQml0bWFwOworICAgICAgaWYgKCFwTWFzay0+Q3JlYXRlKG1fV2lkdGgsIG1fSGVpZ2h0LCBGWERJQl84YnBwTWFzaykpIHsKKyAgICAgICAgZGVsZXRlIHBNYXNrOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCogc3JjX3BvcyA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2g7CisgICAgICAgIHVpbnQ4X3QqIGRlc3RfcG9zID0gcE1hc2stPkdldEJ1ZmZlcigpICsgcm93ICogcE1hc2stPkdldFBpdGNoKCk7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgKmRlc3RfcG9zKysgPSBGWFJHQjJHUkFZKHNyY19wb3NbMl0sIHNyY19wb3NbMV0sICpzcmNfcG9zKTsKKyAgICAgICAgICBzcmNfcG9zICs9IDM7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIFRha2VPdmVyKHBNYXNrKTsKKyAgICAgIGRlbGV0ZSBwTWFzazsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZYRElCX1JnYjMyOiB7CisgICAgICBDRlhfRElCaXRtYXAqIHBNYXNrID0gbmV3IENGWF9ESUJpdG1hcDsKKyAgICAgIGlmICghcE1hc2stPkNyZWF0ZShtX1dpZHRoLCBtX0hlaWdodCwgRlhESUJfOGJwcE1hc2spKSB7CisgICAgICAgIGRlbGV0ZSBwTWFzazsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdysrKSB7CisgICAgICAgIHVpbnQ4X3QqIHNyY19wb3MgPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoOworICAgICAgICB1aW50OF90KiBkZXN0X3BvcyA9IHBNYXNrLT5HZXRCdWZmZXIoKSArIHJvdyAqIHBNYXNrLT5HZXRQaXRjaCgpOworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgeworICAgICAgICAgICpkZXN0X3BvcysrID0gRlhSR0IyR1JBWShzcmNfcG9zWzJdLCBzcmNfcG9zWzFdLCAqc3JjX3Bvcyk7CisgICAgICAgICAgc3JjX3BvcyArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgICBUYWtlT3ZlcihwTWFzayk7CisgICAgICBkZWxldGUgcE1hc2s7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpNdWx0aXBseUFscGhhKGludCBhbHBoYSkgeworICBpZiAoIW1fcEJ1ZmZlcikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBzd2l0Y2ggKEdldEZvcm1hdCgpKSB7CisgICAgY2FzZSBGWERJQl8xYnBwTWFzazoKKyAgICAgIGlmICghQ29udmVydEZvcm1hdChGWERJQl84YnBwTWFzaykpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgTXVsdGlwbHlBbHBoYShhbHBoYSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCXzhicHBNYXNrOiB7CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCogc2Nhbl9saW5lID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaDsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgICBzY2FuX2xpbmVbY29sXSA9IHNjYW5fbGluZVtjb2xdICogYWxwaGEgLyAyNTU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZYRElCX0FyZ2I6IHsKKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3crKykgeworICAgICAgICB1aW50OF90KiBzY2FuX2xpbmUgPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoICsgMzsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgICAqc2Nhbl9saW5lID0gKCpzY2FuX2xpbmUpICogYWxwaGEgLyAyNTU7CisgICAgICAgICAgc2Nhbl9saW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgaWYgKEhhc0FscGhhKCkpIHsKKyAgICAgICAgbV9wQWxwaGFNYXNrLT5NdWx0aXBseUFscGhhKGFscGhhKTsKKyAgICAgIH0gZWxzZSBpZiAoSXNDbXlrSW1hZ2UoKSkgeworICAgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoKEZYRElCX0Zvcm1hdCkoR2V0Rm9ybWF0KCkgfCAweDAyMDApKSkgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBtX3BBbHBoYU1hc2stPk11bHRpcGx5QWxwaGEoYWxwaGEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KEZYRElCX0FyZ2IpKSB7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIE11bHRpcGx5QWxwaGEoYWxwaGEpOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9EV09SRCBDRlhfRElCaXRtYXA6OkdldFBpeGVsKGludCB4LCBpbnQgeSkgY29uc3QgeworICBpZiAoIW1fcEJ1ZmZlcikgeworICAgIHJldHVybiAwOworICB9CisgIHVpbnQ4X3QqIHBvcyA9IG1fcEJ1ZmZlciArIHkgKiBtX1BpdGNoICsgeCAqIEdldEJQUCgpIC8gODsKKyAgc3dpdGNoIChHZXRGb3JtYXQoKSkgeworICAgIGNhc2UgRlhESUJfMWJwcE1hc2s6IHsKKyAgICAgIGlmICgoKnBvcykgJiAoMSA8PCAoNyAtIHggJSA4KSkpIHsKKyAgICAgICAgcmV0dXJuIDB4ZmYwMDAwMDA7CisgICAgICB9CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY2FzZSBGWERJQl8xYnBwUmdiOiB7CisgICAgICBpZiAoKCpwb3MpICYgKDEgPDwgKDcgLSB4ICUgOCkpKSB7CisgICAgICAgIHJldHVybiBtX3BQYWxldHRlID8gbV9wUGFsZXR0ZVsxXSA6IDB4ZmZmZmZmZmY7CisgICAgICB9CisgICAgICByZXR1cm4gbV9wUGFsZXR0ZSA/IG1fcFBhbGV0dGVbMF0gOiAweGZmMDAwMDAwOworICAgIH0KKyAgICBjYXNlIEZYRElCXzhicHBNYXNrOgorICAgICAgcmV0dXJuICgqcG9zKSA8PCAyNDsKKyAgICBjYXNlIEZYRElCXzhicHBSZ2I6CisgICAgICByZXR1cm4gbV9wUGFsZXR0ZSA/IG1fcFBhbGV0dGVbKnBvc10gOiAoMHhmZjAwMDAwMCB8ICgoKnBvcykgKiAweDEwMTAxKSk7CisgICAgY2FzZSBGWERJQl9SZ2I6CisgICAgY2FzZSBGWERJQl9SZ2JhOgorICAgIGNhc2UgRlhESUJfUmdiMzI6CisgICAgICByZXR1cm4gRlhBUkdCX0dFVERJQihwb3MpIHwgMHhmZjAwMDAwMDsKKyAgICBjYXNlIEZYRElCX0FyZ2I6CisgICAgICByZXR1cm4gRlhBUkdCX0dFVERJQihwb3MpOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gMDsKK30KK3ZvaWQgQ0ZYX0RJQml0bWFwOjpTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yKSB7CisgIGlmICghbV9wQnVmZmVyKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmICh4IDwgMCB8fCB4ID49IG1fV2lkdGggfHwgeSA8IDAgfHwgeSA+PSBtX0hlaWdodCkgeworICAgIHJldHVybjsKKyAgfQorICB1aW50OF90KiBwb3MgPSBtX3BCdWZmZXIgKyB5ICogbV9QaXRjaCArIHggKiBHZXRCUFAoKSAvIDg7CisgIHN3aXRjaCAoR2V0Rm9ybWF0KCkpIHsKKyAgICBjYXNlIEZYRElCXzFicHBNYXNrOgorICAgICAgaWYgKGNvbG9yID4+IDI0KSB7CisgICAgICAgICpwb3MgfD0gMSA8PCAoNyAtIHggJSA4KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpwb3MgJj0gfigxIDw8ICg3IC0geCAlIDgpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfMWJwcFJnYjoKKyAgICAgIGlmIChtX3BQYWxldHRlKSB7CisgICAgICAgIGlmIChjb2xvciA9PSBtX3BQYWxldHRlWzFdKSB7CisgICAgICAgICAgKnBvcyB8PSAxIDw8ICg3IC0geCAlIDgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpwb3MgJj0gfigxIDw8ICg3IC0geCAlIDgpKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGNvbG9yID09IDB4ZmZmZmZmZmYpIHsKKyAgICAgICAgICAqcG9zIHw9IDEgPDwgKDcgLSB4ICUgOCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKnBvcyAmPSB+KDEgPDwgKDcgLSB4ICUgOCkpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCXzhicHBNYXNrOgorICAgICAgKnBvcyA9ICh1aW50OF90KShjb2xvciA+PiAyNCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCXzhicHBSZ2I6IHsKKyAgICAgIGlmIChtX3BQYWxldHRlKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgICBpZiAobV9wUGFsZXR0ZVtpXSA9PSBjb2xvcikgeworICAgICAgICAgICAgKnBvcyA9ICh1aW50OF90KWk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICpwb3MgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKnBvcyA9IEZYUkdCMkdSQVkoRlhBUkdCX1IoY29sb3IpLCBGWEFSR0JfRyhjb2xvciksIEZYQVJHQl9CKGNvbG9yKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGWERJQl9SZ2I6CisgICAgY2FzZSBGWERJQl9SZ2IzMjogeworICAgICAgaW50IGFscGhhID0gRlhBUkdCX0EoY29sb3IpOworICAgICAgcG9zWzBdID0gKEZYQVJHQl9CKGNvbG9yKSAqIGFscGhhICsgcG9zWzBdICogKDI1NSAtIGFscGhhKSkgLyAyNTU7CisgICAgICBwb3NbMV0gPSAoRlhBUkdCX0coY29sb3IpICogYWxwaGEgKyBwb3NbMV0gKiAoMjU1IC0gYWxwaGEpKSAvIDI1NTsKKyAgICAgIHBvc1syXSA9IChGWEFSR0JfUihjb2xvcikgKiBhbHBoYSArIHBvc1syXSAqICgyNTUgLSBhbHBoYSkpIC8gMjU1OworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRlhESUJfUmdiYTogeworICAgICAgcG9zWzBdID0gRlhBUkdCX0IoY29sb3IpOworICAgICAgcG9zWzFdID0gRlhBUkdCX0coY29sb3IpOworICAgICAgcG9zWzJdID0gRlhBUkdCX1IoY29sb3IpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRlhESUJfQXJnYjoKKyAgICAgIEZYQVJHQl9TRVRESUIocG9zLCBjb2xvcik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KK3ZvaWQgQ0ZYX0RJQml0bWFwOjpEb3duU2FtcGxlU2NhbmxpbmUoaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfYnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmxpcFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3dpZHRoKSBjb25zdCB7CisgIGlmICghbV9wQnVmZmVyKSB7CisgICAgcmV0dXJuOworICB9CisgIGludCBzcmNfQnBwID0gbV9icHAgLyA4OworICB1aW50OF90KiBzY2FubGluZSA9IG1fcEJ1ZmZlciArIGxpbmUgKiBtX1BpdGNoOworICBpZiAoc3JjX0JwcCA9PSAwKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGlwX3dpZHRoOyBpKyspIHsKKyAgICAgIEZYX0RXT1JEIGRlc3RfeCA9IGNsaXBfbGVmdCArIGk7CisgICAgICBGWF9EV09SRCBzcmNfeCA9IGRlc3RfeCAqIG1fV2lkdGggLyBkZXN0X3dpZHRoOworICAgICAgaWYgKGJGbGlwWCkgeworICAgICAgICBzcmNfeCA9IG1fV2lkdGggLSBzcmNfeCAtIDE7CisgICAgICB9CisgICAgICBzcmNfeCAlPSBtX1dpZHRoOworICAgICAgZGVzdF9zY2FuW2ldID0gKHNjYW5saW5lW3NyY194IC8gOF0gJiAoMSA8PCAoNyAtIHNyY194ICUgOCkpKSA/IDI1NSA6IDA7CisgICAgfQorICB9IGVsc2UgaWYgKHNyY19CcHAgPT0gMSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xpcF93aWR0aDsgaSsrKSB7CisgICAgICBGWF9EV09SRCBkZXN0X3ggPSBjbGlwX2xlZnQgKyBpOworICAgICAgRlhfRFdPUkQgc3JjX3ggPSBkZXN0X3ggKiBtX1dpZHRoIC8gZGVzdF93aWR0aDsKKyAgICAgIGlmIChiRmxpcFgpIHsKKyAgICAgICAgc3JjX3ggPSBtX1dpZHRoIC0gc3JjX3ggLSAxOworICAgICAgfQorICAgICAgc3JjX3ggJT0gbV9XaWR0aDsKKyAgICAgIGludCBkZXN0X3BvcyA9IGk7CisgICAgICBpZiAobV9wUGFsZXR0ZSkgeworICAgICAgICBpZiAoIUlzQ215a0ltYWdlKCkpIHsKKyAgICAgICAgICBkZXN0X3BvcyAqPSAzOworICAgICAgICAgIEZYX0FSR0IgYXJnYiA9IG1fcFBhbGV0dGVbc2NhbmxpbmVbc3JjX3hdXTsKKyAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3NdID0gRlhBUkdCX0IoYXJnYik7CisgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zICsgMV0gPSBGWEFSR0JfRyhhcmdiKTsKKyAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3MgKyAyXSA9IEZYQVJHQl9SKGFyZ2IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGRlc3RfcG9zICo9IDQ7CisgICAgICAgICAgRlhfQ01ZSyBjbXlrID0gbV9wUGFsZXR0ZVtzY2FubGluZVtzcmNfeF1dOworICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3Bvc10gPSBGWFNZU19HZXRDVmFsdWUoY215ayk7CisgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zICsgMV0gPSBGWFNZU19HZXRNVmFsdWUoY215ayk7CisgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zICsgMl0gPSBGWFNZU19HZXRZVmFsdWUoY215ayk7CisgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zICsgM10gPSBGWFNZU19HZXRLVmFsdWUoY215ayk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlc3Rfc2NhbltkZXN0X3Bvc10gPSBzY2FubGluZVtzcmNfeF07CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xpcF93aWR0aDsgaSsrKSB7CisgICAgICBGWF9EV09SRCBkZXN0X3ggPSBjbGlwX2xlZnQgKyBpOworICAgICAgRlhfRFdPUkQgc3JjX3ggPQorICAgICAgICAgIGJGbGlwWCA/IChtX1dpZHRoIC0gZGVzdF94ICogbV9XaWR0aCAvIGRlc3Rfd2lkdGggLSAxKSAqIHNyY19CcHAKKyAgICAgICAgICAgICAgICAgOiAoZGVzdF94ICogbV9XaWR0aCAvIGRlc3Rfd2lkdGgpICogc3JjX0JwcDsKKyAgICAgIHNyY194ICU9IG1fV2lkdGggKiBzcmNfQnBwOworICAgICAgaW50IGRlc3RfcG9zID0gaSAqIHNyY19CcHA7CisgICAgICBmb3IgKGludCBiID0gMDsgYiA8IHNyY19CcHA7IGIrKykgeworICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3MgKyBiXSA9IHNjYW5saW5lW3NyY194ICsgYl07CisgICAgICB9CisgICAgfQorICB9Cit9CitGWF9CT09MIENGWF9ESUJpdG1hcDo6Q29udmVydENvbG9yU2NhbGUoRlhfRFdPUkQgZm9yZWNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGJhY2tjb2xvcikgeworICBBU1NFUlQoIUlzQWxwaGFNYXNrKCkpOworICBpZiAoIW1fcEJ1ZmZlciB8fCBJc0FscGhhTWFzaygpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGludCBmYywgZm0sIGZ5LCBmaywgYmMsIGJtLCBieSwgYms7CisgIGludCBmciwgZmcsIGZiLCBiciwgYmcsIGJiOworICBGWF9CT09MIGlzQ215a0ltYWdlID0gSXNDbXlrSW1hZ2UoKTsKKyAgaWYgKGlzQ215a0ltYWdlKSB7CisgICAgZmMgPSBGWFNZU19HZXRDVmFsdWUoZm9yZWNvbG9yKTsKKyAgICBmbSA9IEZYU1lTX0dldE1WYWx1ZShmb3JlY29sb3IpOworICAgIGZ5ID0gRlhTWVNfR2V0WVZhbHVlKGZvcmVjb2xvcik7CisgICAgZmsgPSBGWFNZU19HZXRLVmFsdWUoZm9yZWNvbG9yKTsKKyAgICBiYyA9IEZYU1lTX0dldENWYWx1ZShiYWNrY29sb3IpOworICAgIGJtID0gRlhTWVNfR2V0TVZhbHVlKGJhY2tjb2xvcik7CisgICAgYnkgPSBGWFNZU19HZXRZVmFsdWUoYmFja2NvbG9yKTsKKyAgICBiayA9IEZYU1lTX0dldEtWYWx1ZShiYWNrY29sb3IpOworICB9IGVsc2UgeworICAgIGZyID0gRlhTWVNfR2V0UlZhbHVlKGZvcmVjb2xvcik7CisgICAgZmcgPSBGWFNZU19HZXRHVmFsdWUoZm9yZWNvbG9yKTsKKyAgICBmYiA9IEZYU1lTX0dldEJWYWx1ZShmb3JlY29sb3IpOworICAgIGJyID0gRlhTWVNfR2V0UlZhbHVlKGJhY2tjb2xvcik7CisgICAgYmcgPSBGWFNZU19HZXRHVmFsdWUoYmFja2NvbG9yKTsKKyAgICBiYiA9IEZYU1lTX0dldEJWYWx1ZShiYWNrY29sb3IpOworICB9CisgIGlmIChtX2JwcCA8PSA4KSB7CisgICAgaWYgKGlzQ215a0ltYWdlKSB7CisgICAgICBpZiAoZm9yZWNvbG9yID09IDB4ZmYgJiYgYmFja2NvbG9yID09IDAgJiYgIW1fcFBhbGV0dGUpIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChmb3JlY29sb3IgPT0gMCAmJiBiYWNrY29sb3IgPT0gMHhmZmZmZmYgJiYgIW1fcFBhbGV0dGUpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBpZiAoIW1fcFBhbGV0dGUpIHsKKyAgICAgIEJ1aWxkUGFsZXR0ZSgpOworICAgIH0KKyAgICBpbnQgc2l6ZSA9IDEgPDwgbV9icHA7CisgICAgaWYgKGlzQ215a0ltYWdlKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICB1aW50OF90IGIsIGcsIHI7CisgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUobV9wUGFsZXR0ZVtpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRNVmFsdWUobV9wUGFsZXR0ZVtpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRZVmFsdWUobV9wUGFsZXR0ZVtpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRLVmFsdWUobV9wUGFsZXR0ZVtpXSksIHIsIGcsIGIpOworICAgICAgICBpbnQgZ3JheSA9IDI1NSAtIEZYUkdCMkdSQVkociwgZywgYik7CisgICAgICAgIG1fcFBhbGV0dGVbaV0gPSBDbXlrRW5jb2RlKAorICAgICAgICAgICAgYmMgKyAoZmMgLSBiYykgKiBncmF5IC8gMjU1LCBibSArIChmbSAtIGJtKSAqIGdyYXkgLyAyNTUsCisgICAgICAgICAgICBieSArIChmeSAtIGJ5KSAqIGdyYXkgLyAyNTUsIGJrICsgKGZrIC0gYmspICogZ3JheSAvIDI1NSk7CisgICAgICB9CisgICAgfSBlbHNlCisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBpbnQgZ3JheSA9IEZYUkdCMkdSQVkoRlhBUkdCX1IobV9wUGFsZXR0ZVtpXSksIEZYQVJHQl9HKG1fcFBhbGV0dGVbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX0IobV9wUGFsZXR0ZVtpXSkpOworICAgICAgICBtX3BQYWxldHRlW2ldID0gRlhBUkdCX01BS0UoMHhmZiwgYnIgKyAoZnIgLSBicikgKiBncmF5IC8gMjU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmcgKyAoZmcgLSBiZykgKiBncmF5IC8gMjU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmIgKyAoZmIgLSBiYikgKiBncmF5IC8gMjU1KTsKKyAgICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoaXNDbXlrSW1hZ2UpIHsKKyAgICBpZiAoZm9yZWNvbG9yID09IDB4ZmYgJiYgYmFja2NvbG9yID09IDB4MDApIHsKKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3crKykgeworICAgICAgICB1aW50OF90KiBzY2FubGluZSA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2g7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgdWludDhfdCBiLCBnLCByOworICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShzY2FubGluZVswXSwgc2NhbmxpbmVbMV0sIHNjYW5saW5lWzJdLCBzY2FubGluZVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciwgZywgYik7CisgICAgICAgICAgKnNjYW5saW5lKysgPSAwOworICAgICAgICAgICpzY2FubGluZSsrID0gMDsKKyAgICAgICAgICAqc2NhbmxpbmUrKyA9IDA7CisgICAgICAgICAgKnNjYW5saW5lKysgPSAyNTUgLSBGWFJHQjJHUkFZKHIsIGcsIGIpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0gZWxzZSBpZiAoZm9yZWNvbG9yID09IDAgJiYgYmFja2NvbG9yID09IDB4ZmZmZmZmKSB7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdysrKSB7CisgICAgICB1aW50OF90KiBzY2FubGluZSA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2g7CisgICAgICBpbnQgZ2FwID0gbV9icHAgLyA4IC0gMjsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7CisgICAgICAgIGludCBncmF5ID0gRlhSR0IyR1JBWShzY2FubGluZVsyXSwgc2NhbmxpbmVbMV0sIHNjYW5saW5lWzBdKTsKKyAgICAgICAgKnNjYW5saW5lKysgPSBncmF5OworICAgICAgICAqc2NhbmxpbmUrKyA9IGdyYXk7CisgICAgICAgICpzY2FubGluZSA9IGdyYXk7CisgICAgICAgIHNjYW5saW5lICs9IGdhcDsKKyAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKGlzQ215a0ltYWdlKSB7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdysrKSB7CisgICAgICB1aW50OF90KiBzY2FubGluZSA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2g7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgeworICAgICAgICB1aW50OF90IGIsIGcsIHI7CisgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShzY2FubGluZVswXSwgc2NhbmxpbmVbMV0sIHNjYW5saW5lWzJdLCBzY2FubGluZVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIGcsIGIpOworICAgICAgICBpbnQgZ3JheSA9IDI1NSAtIEZYUkdCMkdSQVkociwgZywgYik7CisgICAgICAgICpzY2FubGluZSsrID0gYmMgKyAoZmMgLSBiYykgKiBncmF5IC8gMjU1OworICAgICAgICAqc2NhbmxpbmUrKyA9IGJtICsgKGZtIC0gYm0pICogZ3JheSAvIDI1NTsKKyAgICAgICAgKnNjYW5saW5lKysgPSBieSArIChmeSAtIGJ5KSAqIGdyYXkgLyAyNTU7CisgICAgICAgICpzY2FubGluZSsrID0gYmsgKyAoZmsgLSBiaykgKiBncmF5IC8gMjU1OworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93KyspIHsKKyAgICAgIHVpbnQ4X3QqIHNjYW5saW5lID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaDsKKyAgICAgIGludCBnYXAgPSBtX2JwcCAvIDggLSAyOworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgaW50IGdyYXkgPSBGWFJHQjJHUkFZKHNjYW5saW5lWzJdLCBzY2FubGluZVsxXSwgc2NhbmxpbmVbMF0pOworICAgICAgICAqc2NhbmxpbmUrKyA9IGJiICsgKGZiIC0gYmIpICogZ3JheSAvIDI1NTsKKyAgICAgICAgKnNjYW5saW5lKysgPSBiZyArIChmZyAtIGJnKSAqIGdyYXkgLyAyNTU7CisgICAgICAgICpzY2FubGluZSA9IGJyICsgKGZyIC0gYnIpICogZ3JheSAvIDI1NTsKKyAgICAgICAgc2NhbmxpbmUgKz0gZ2FwOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0ZYX0RJQml0bWFwOjpEaXRoZXJGUyhjb25zdCBGWF9EV09SRCogcFBhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhbF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBSZWN0KSB7CisgIGlmICghbV9wQnVmZmVyKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX2JwcCAhPSA4ICYmIG1fcFBhbGV0dGUgJiYgbV9BbHBoYUZsYWcgIT0gMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAobV9XaWR0aCA8IDQgJiYgbV9IZWlnaHQgPCA0KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX1JFQ1QgcmVjdCgwLCAwLCBtX1dpZHRoLCBtX0hlaWdodCk7CisgIGlmIChwUmVjdCkgeworICAgIHJlY3QuSW50ZXJzZWN0KCpwUmVjdCk7CisgIH0KKyAgdWludDhfdCB0cmFuc2xhdGVbMjU2XTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgIGludCBlcnIyID0gNjU1MzY7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYWxfc2l6ZTsgaisrKSB7CisgICAgICB1aW50OF90IGVudHJ5ID0gKHVpbnQ4X3QpcFBhbGV0dGVbal07CisgICAgICBpbnQgZXJyID0gKGludCllbnRyeSAtIGk7CisgICAgICBpZiAoZXJyICogZXJyIDwgZXJyMikgeworICAgICAgICBlcnIyID0gZXJyICogZXJyOworICAgICAgICB0cmFuc2xhdGVbaV0gPSBlbnRyeTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZm9yIChpbnQgcm93ID0gcmVjdC50b3A7IHJvdyA8IHJlY3QuYm90dG9tOyByb3crKykgeworICAgIHVpbnQ4X3QqIHNjYW4gPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoOworICAgIHVpbnQ4X3QqIG5leHRfc2NhbiA9IG1fcEJ1ZmZlciArIChyb3cgKyAxKSAqIG1fUGl0Y2g7CisgICAgZm9yIChpbnQgY29sID0gcmVjdC5sZWZ0OyBjb2wgPCByZWN0LnJpZ2h0OyBjb2wrKykgeworICAgICAgaW50IHNyY19waXhlbCA9IHNjYW5bY29sXTsKKyAgICAgIGludCBkZXN0X3BpeGVsID0gdHJhbnNsYXRlW3NyY19waXhlbF07CisgICAgICBzY2FuW2NvbF0gPSAodWludDhfdClkZXN0X3BpeGVsOworICAgICAgaW50IGVycm9yID0gLWRlc3RfcGl4ZWwgKyBzcmNfcGl4ZWw7CisgICAgICBpZiAoY29sIDwgcmVjdC5yaWdodCAtIDEpIHsKKyAgICAgICAgaW50IHNyYyA9IHNjYW5bY29sICsgMV07CisgICAgICAgIHNyYyArPSBlcnJvciAqIDcgLyAxNjsKKyAgICAgICAgaWYgKHNyYyA+IDI1NSkgeworICAgICAgICAgIHNjYW5bY29sICsgMV0gPSAyNTU7CisgICAgICAgIH0gZWxzZSBpZiAoc3JjIDwgMCkgeworICAgICAgICAgIHNjYW5bY29sICsgMV0gPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNjYW5bY29sICsgMV0gPSBzcmM7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChjb2wgPCByZWN0LnJpZ2h0IC0gMSAmJiByb3cgPCByZWN0LmJvdHRvbSAtIDEpIHsKKyAgICAgICAgaW50IHNyYyA9IG5leHRfc2Nhbltjb2wgKyAxXTsKKyAgICAgICAgc3JjICs9IGVycm9yICogMSAvIDE2OworICAgICAgICBpZiAoc3JjID4gMjU1KSB7CisgICAgICAgICAgbmV4dF9zY2FuW2NvbCArIDFdID0gMjU1OworICAgICAgICB9IGVsc2UgaWYgKHNyYyA8IDApIHsKKyAgICAgICAgICBuZXh0X3NjYW5bY29sICsgMV0gPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5leHRfc2Nhbltjb2wgKyAxXSA9IHNyYzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHJvdyA8IHJlY3QuYm90dG9tIC0gMSkgeworICAgICAgICBpbnQgc3JjID0gbmV4dF9zY2FuW2NvbF07CisgICAgICAgIHNyYyArPSBlcnJvciAqIDUgLyAxNjsKKyAgICAgICAgaWYgKHNyYyA+IDI1NSkgeworICAgICAgICAgIG5leHRfc2Nhbltjb2xdID0gMjU1OworICAgICAgICB9IGVsc2UgaWYgKHNyYyA8IDApIHsKKyAgICAgICAgICBuZXh0X3NjYW5bY29sXSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbmV4dF9zY2FuW2NvbF0gPSBzcmM7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChjb2wgPiByZWN0LmxlZnQgJiYgcm93IDwgcmVjdC5ib3R0b20gLSAxKSB7CisgICAgICAgIGludCBzcmMgPSBuZXh0X3NjYW5bY29sIC0gMV07CisgICAgICAgIHNyYyArPSBlcnJvciAqIDMgLyAxNjsKKyAgICAgICAgaWYgKHNyYyA+IDI1NSkgeworICAgICAgICAgIG5leHRfc2Nhbltjb2wgLSAxXSA9IDI1NTsKKyAgICAgICAgfSBlbHNlIGlmIChzcmMgPCAwKSB7CisgICAgICAgICAgbmV4dF9zY2FuW2NvbCAtIDFdID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuZXh0X3NjYW5bY29sIC0gMV0gPSBzcmM7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CitDRlhfRElCaXRtYXAqIENGWF9ESUJTb3VyY2U6OkZsaXBJbWFnZShGWF9CT09MIGJYRmxpcCwgRlhfQk9PTCBiWUZsaXApIGNvbnN0IHsKKyAgQ0ZYX0RJQml0bWFwKiBwRmxpcHBlZCA9IG5ldyBDRlhfRElCaXRtYXA7CisgIGlmICghcEZsaXBwZWQtPkNyZWF0ZShtX1dpZHRoLCBtX0hlaWdodCwgR2V0Rm9ybWF0KCkpKSB7CisgICAgZGVsZXRlIHBGbGlwcGVkOworICAgIHJldHVybiBOVUxMOworICB9CisgIHBGbGlwcGVkLT5Db3B5UGFsZXR0ZShtX3BQYWxldHRlKTsKKyAgdWludDhfdCogcERlc3RCdWZmZXIgPSBwRmxpcHBlZC0+R2V0QnVmZmVyKCk7CisgIGludCBCcHAgPSBtX2JwcCAvIDg7CisgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3crKykgeworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gR2V0U2NhbmxpbmUocm93KTsKKyAgICB1aW50OF90KiBkZXN0X3NjYW4gPQorICAgICAgICBwRGVzdEJ1ZmZlciArIG1fUGl0Y2ggKiAoYllGbGlwID8gKG1fSGVpZ2h0IC0gcm93IC0gMSkgOiByb3cpOworICAgIGlmICghYlhGbGlwKSB7CisgICAgICBGWFNZU19tZW1jcHkoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9QaXRjaCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKG1fYnBwID09IDEpIHsKKyAgICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW4sIDAsIG1fUGl0Y2gpOworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspCisgICAgICAgIGlmIChzcmNfc2Nhbltjb2wgLyA4XSAmICgxIDw8ICg3IC0gY29sICUgOCkpKSB7CisgICAgICAgICAgaW50IGRlc3RfY29sID0gbV9XaWR0aCAtIGNvbCAtIDE7CisgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfY29sIC8gOF0gfD0gKDEgPDwgKDcgLSBkZXN0X2NvbCAlIDgpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBkZXN0X3NjYW4gKz0gKG1fV2lkdGggLSAxKSAqIEJwcDsKKyAgICAgIGlmIChCcHAgPT0gMSkgeworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgeworICAgICAgICAgICpkZXN0X3NjYW4gPSAqc3JjX3NjYW47CisgICAgICAgICAgZGVzdF9zY2FuLS07CisgICAgICAgICAgc3JjX3NjYW4rKzsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChCcHAgPT0gMykgeworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgeworICAgICAgICAgIGRlc3Rfc2NhblswXSA9IHNyY19zY2FuWzBdOworICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IHNyY19zY2FuWzFdOworICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19zY2FuWzJdOworICAgICAgICAgIGRlc3Rfc2NhbiAtPSAzOworICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVChCcHAgPT0gNCk7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9zY2FuID0gKihGWF9EV09SRCopc3JjX3NjYW47CisgICAgICAgICAgZGVzdF9zY2FuIC09IDQ7CisgICAgICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAobV9wQWxwaGFNYXNrKSB7CisgICAgcERlc3RCdWZmZXIgPSBwRmxpcHBlZC0+bV9wQWxwaGFNYXNrLT5HZXRCdWZmZXIoKTsKKyAgICBGWF9EV09SRCBkZXN0X3BpdGNoID0gcEZsaXBwZWQtPm1fcEFscGhhTWFzay0+R2V0UGl0Y2goKTsKKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93KyspIHsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gbV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShyb3cpOworICAgICAgdWludDhfdCogZGVzdF9zY2FuID0KKyAgICAgICAgICBwRGVzdEJ1ZmZlciArIGRlc3RfcGl0Y2ggKiAoYllGbGlwID8gKG1fSGVpZ2h0IC0gcm93IC0gMSkgOiByb3cpOworICAgICAgaWYgKCFiWEZsaXApIHsKKyAgICAgICAgRlhTWVNfbWVtY3B5KGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIGRlc3RfcGl0Y2gpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbiArPSAobV9XaWR0aCAtIDEpOworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgKmRlc3Rfc2NhbiA9ICpzcmNfc2NhbjsKKyAgICAgICAgZGVzdF9zY2FuLS07CisgICAgICAgIHNyY19zY2FuKys7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBwRmxpcHBlZDsKK30KK0NGWF9ESUJFeHRyYWN0b3I6OkNGWF9ESUJFeHRyYWN0b3IoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYykgeworICBtX3BCaXRtYXAgPSBOVUxMOworICBpZiAocFNyYy0+R2V0QnVmZmVyKCkpIHsKKyAgICBtX3BCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOworICAgIGlmICghbV9wQml0bWFwLT5DcmVhdGUocFNyYy0+R2V0V2lkdGgoKSwgcFNyYy0+R2V0SGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjLT5HZXRGb3JtYXQoKSwgcFNyYy0+R2V0QnVmZmVyKCkpKSB7CisgICAgICBkZWxldGUgbV9wQml0bWFwOworICAgICAgbV9wQml0bWFwID0gTlVMTDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgbV9wQml0bWFwLT5Db3B5UGFsZXR0ZShwU3JjLT5HZXRQYWxldHRlKCkpOworICAgIG1fcEJpdG1hcC0+Q29weUFscGhhTWFzayhwU3JjLT5tX3BBbHBoYU1hc2spOworICB9IGVsc2UgeworICAgIG1fcEJpdG1hcCA9IHBTcmMtPkNsb25lKCk7CisgIH0KK30KK0NGWF9ESUJFeHRyYWN0b3I6On5DRlhfRElCRXh0cmFjdG9yKCkgeworICBkZWxldGUgbV9wQml0bWFwOworfQorQ0ZYX0ZpbHRlcmVkRElCOjpDRlhfRmlsdGVyZWRESUIoKSB7CisgIG1fcFNjYW5saW5lID0gTlVMTDsKKyAgbV9wU3JjID0gTlVMTDsKK30KK0NGWF9GaWx0ZXJlZERJQjo6fkNGWF9GaWx0ZXJlZERJQigpIHsKKyAgaWYgKG1fYkF1dG9Ecm9wU3JjKSB7CisgICAgZGVsZXRlIG1fcFNyYzsKKyAgfQorICBGWF9GcmVlKG1fcFNjYW5saW5lKTsKK30KK3ZvaWQgQ0ZYX0ZpbHRlcmVkRElCOjpMb2FkU3JjKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsIEZYX0JPT0wgYkF1dG9Ecm9wU3JjKSB7CisgIG1fcFNyYyA9IHBTcmM7CisgIG1fYkF1dG9Ecm9wU3JjID0gYkF1dG9Ecm9wU3JjOworICBtX1dpZHRoID0gcFNyYy0+R2V0V2lkdGgoKTsKKyAgbV9IZWlnaHQgPSBwU3JjLT5HZXRIZWlnaHQoKTsKKyAgRlhESUJfRm9ybWF0IGZvcm1hdCA9IEdldERlc3RGb3JtYXQoKTsKKyAgbV9icHAgPSAodWludDhfdClmb3JtYXQ7CisgIG1fQWxwaGFGbGFnID0gKHVpbnQ4X3QpKGZvcm1hdCA+PiA4KTsKKyAgbV9QaXRjaCA9IChtX1dpZHRoICogKGZvcm1hdCAmIDB4ZmYpICsgMzEpIC8gMzIgKiA0OworICBtX3BQYWxldHRlID0gR2V0RGVzdFBhbGV0dGUoKTsKKyAgbV9wU2NhbmxpbmUgPSBGWF9BbGxvYyh1aW50OF90LCBtX1BpdGNoKTsKK30KK2NvbnN0IHVpbnQ4X3QqIENGWF9GaWx0ZXJlZERJQjo6R2V0U2NhbmxpbmUoaW50IGxpbmUpIGNvbnN0IHsKKyAgVHJhbnNsYXRlU2NhbmxpbmUobV9wU2NhbmxpbmUsIG1fcFNyYy0+R2V0U2NhbmxpbmUobGluZSkpOworICByZXR1cm4gbV9wU2NhbmxpbmU7Cit9Cit2b2lkIENGWF9GaWx0ZXJlZERJQjo6RG93blNhbXBsZVNjYW5saW5lKGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZsaXBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF93aWR0aCkgY29uc3QgeworICBtX3BTcmMtPkRvd25TYW1wbGVTY2FubGluZShsaW5lLCBkZXN0X3NjYW4sIGRlc3RfYnBwLCBkZXN0X3dpZHRoLCBiRmxpcFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfbGVmdCwgY2xpcF93aWR0aCk7CisgIFRyYW5zbGF0ZURvd25TYW1wbGVzKGRlc3Rfc2NhbiwgZGVzdF9zY2FuLCBjbGlwX3dpZHRoLCBkZXN0X2JwcCk7Cit9CitDRlhfSW1hZ2VSZW5kZXJlcjo6Q0ZYX0ltYWdlUmVuZGVyZXIoKSB7CisgIG1fU3RhdHVzID0gMDsKKyAgbV9wVHJhbnNmb3JtZXIgPSBOVUxMOworICBtX2JSZ2JCeXRlT3JkZXIgPSBGQUxTRTsKKyAgbV9CbGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUw7Cit9CitDRlhfSW1hZ2VSZW5kZXJlcjo6fkNGWF9JbWFnZVJlbmRlcmVyKCkgeworICBkZWxldGUgbV9wVHJhbnNmb3JtZXI7Cit9CitGWF9CT09MIENGWF9JbWFnZVJlbmRlcmVyOjpTdGFydChDRlhfRElCaXRtYXAqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG1hc2tfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZGliX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgbV9NYXRyaXggPSAqcE1hdHJpeDsKKyAgQ0ZYX0Zsb2F0UmVjdCBpbWFnZV9yZWN0X2YgPSBtX01hdHJpeC5HZXRVbml0UmVjdCgpOworICBGWF9SRUNUIGltYWdlX3JlY3QgPSBpbWFnZV9yZWN0X2YuR2V0T3V0dGVyUmVjdCgpOworICBtX0NsaXBCb3ggPSBwQ2xpcFJnbiA/IHBDbGlwUmduLT5HZXRCb3goKSA6IEZYX1JFQ1QoMCwgMCwgcERldmljZS0+R2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXZpY2UtPkdldEhlaWdodCgpKTsKKyAgbV9DbGlwQm94LkludGVyc2VjdChpbWFnZV9yZWN0KTsKKyAgaWYgKG1fQ2xpcEJveC5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9wRGV2aWNlID0gcERldmljZTsKKyAgbV9wQ2xpcFJnbiA9IHBDbGlwUmduOworICBtX01hc2tDb2xvciA9IG1hc2tfY29sb3I7CisgIG1fQml0bWFwQWxwaGEgPSBiaXRtYXBfYWxwaGE7CisgIG1fTWF0cml4ID0gKnBNYXRyaXg7CisgIG1fRmxhZ3MgPSBkaWJfZmxhZ3M7CisgIG1fQWxwaGFGbGFnID0gYWxwaGFfZmxhZzsKKyAgbV9wSWNjVHJhbnNmb3JtID0gcEljY1RyYW5zZm9ybTsKKyAgbV9iUmdiQnl0ZU9yZGVyID0gYlJnYkJ5dGVPcmRlcjsKKyAgbV9CbGVuZFR5cGUgPSBibGVuZF90eXBlOworICBGWF9CT09MIHJldCA9IFRSVUU7CisgIGlmICgoRlhTWVNfZmFicyhtX01hdHJpeC5iKSA+PSAwLjVmIHx8IG1fTWF0cml4LmEgPT0gMCkgfHwKKyAgICAgIChGWFNZU19mYWJzKG1fTWF0cml4LmMpID49IDAuNWYgfHwgbV9NYXRyaXguZCA9PSAwKSkgeworICAgIGlmIChGWFNZU19mYWJzKG1fTWF0cml4LmEpIDwgRlhTWVNfZmFicyhtX01hdHJpeC5iKSAvIDIwICYmCisgICAgICAgIEZYU1lTX2ZhYnMobV9NYXRyaXguZCkgPCBGWFNZU19mYWJzKG1fTWF0cml4LmMpIC8gMjAgJiYKKyAgICAgICAgRlhTWVNfZmFicyhtX01hdHJpeC5hKSA8IDAuNWYgJiYgRlhTWVNfZmFicyhtX01hdHJpeC5kKSA8IDAuNWYpIHsKKyAgICAgIGludCBkZXN0X3dpZHRoID0gaW1hZ2VfcmVjdC5XaWR0aCgpOworICAgICAgaW50IGRlc3RfaGVpZ2h0ID0gaW1hZ2VfcmVjdC5IZWlnaHQoKTsKKyAgICAgIEZYX1JFQ1QgYml0bWFwX2NsaXAgPSBtX0NsaXBCb3g7CisgICAgICBiaXRtYXBfY2xpcC5PZmZzZXQoLWltYWdlX3JlY3QubGVmdCwgLWltYWdlX3JlY3QudG9wKTsKKyAgICAgIGJpdG1hcF9jbGlwID0gRlhESUJfU3dhcENsaXBCb3goYml0bWFwX2NsaXAsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX01hdHJpeC5jID4gMCwgbV9NYXRyaXguYiA8IDApOworICAgICAgbV9Db21wb3Nlci5Db21wb3NlKHBEZXZpY2UsIHBDbGlwUmduLCBiaXRtYXBfYWxwaGEsIG1hc2tfY29sb3IsIG1fQ2xpcEJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLCBtX01hdHJpeC5jID4gMCwgbV9NYXRyaXguYiA8IDAsIG1fYlJnYkJ5dGVPcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBtX0JsZW5kVHlwZSk7CisgICAgICBpZiAoIW1fU3RyZXRjaGVyLlN0YXJ0KCZtX0NvbXBvc2VyLCBwU291cmNlLCBkZXN0X2hlaWdodCwgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwX2NsaXAsIGRpYl9mbGFncykpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgbV9TdGF0dXMgPSAxOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIG1fU3RhdHVzID0gMjsKKyAgICBtX3BUcmFuc2Zvcm1lciA9IG5ldyBDRlhfSW1hZ2VUcmFuc2Zvcm1lcjsKKyAgICBtX3BUcmFuc2Zvcm1lci0+U3RhcnQocFNvdXJjZSwgJm1fTWF0cml4LCBkaWJfZmxhZ3MsICZtX0NsaXBCb3gpOworICAgIHJldHVybiBUUlVFOworICB9CisgIGludCBkZXN0X3dpZHRoID0gaW1hZ2VfcmVjdC5XaWR0aCgpOworICBpZiAobV9NYXRyaXguYSA8IDApIHsKKyAgICBkZXN0X3dpZHRoID0gLWRlc3Rfd2lkdGg7CisgIH0KKyAgaW50IGRlc3RfaGVpZ2h0ID0gaW1hZ2VfcmVjdC5IZWlnaHQoKTsKKyAgaWYgKG1fTWF0cml4LmQgPiAwKSB7CisgICAgZGVzdF9oZWlnaHQgPSAtZGVzdF9oZWlnaHQ7CisgIH0KKyAgaWYgKGRlc3Rfd2lkdGggPT0gMCB8fCBkZXN0X2hlaWdodCA9PSAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX1JFQ1QgYml0bWFwX2NsaXAgPSBtX0NsaXBCb3g7CisgIGJpdG1hcF9jbGlwLk9mZnNldCgtaW1hZ2VfcmVjdC5sZWZ0LCAtaW1hZ2VfcmVjdC50b3ApOworICBtX0NvbXBvc2VyLkNvbXBvc2UocERldmljZSwgcENsaXBSZ24sIGJpdG1hcF9hbHBoYSwgbWFza19jb2xvciwgbV9DbGlwQm94LAorICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIEZBTFNFLCBGQUxTRSwgbV9iUmdiQnl0ZU9yZGVyLCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSwgbV9CbGVuZFR5cGUpOworICBtX1N0YXR1cyA9IDE7CisgIHJldCA9IG1fU3RyZXRjaGVyLlN0YXJ0KCZtX0NvbXBvc2VyLCBwU291cmNlLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwX2NsaXAsIGRpYl9mbGFncyk7CisgIHJldHVybiByZXQ7Cit9CitGWF9CT09MIENGWF9JbWFnZVJlbmRlcmVyOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkgeworICBpZiAobV9TdGF0dXMgPT0gMSkgeworICAgIHJldHVybiBtX1N0cmV0Y2hlci5Db250aW51ZShwUGF1c2UpOworICB9CisgIGlmIChtX1N0YXR1cyA9PSAyKSB7CisgICAgaWYgKG1fcFRyYW5zZm9ybWVyLT5Db250aW51ZShwUGF1c2UpKSB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gbV9wVHJhbnNmb3JtZXItPm1fU3RvcmVyLkRldGFjaCgpOworICAgIGlmICghcEJpdG1hcCkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZiAoIXBCaXRtYXAtPkdldEJ1ZmZlcigpKSB7CisgICAgICBkZWxldGUgcEJpdG1hcDsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKHBCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKKyAgICAgIGlmIChtX0JpdG1hcEFscGhhICE9IDI1NSkgeworICAgICAgICBpZiAobV9BbHBoYUZsYWcgPj4gOCkgeworICAgICAgICAgIG1fQWxwaGFGbGFnID0KKyAgICAgICAgICAgICAgKCgodWludDhfdCkoKG1fQWxwaGFGbGFnICYgMHhmZikgKiBtX0JpdG1hcEFscGhhIC8gMjU1KSkgfAorICAgICAgICAgICAgICAgKChtX0FscGhhRmxhZyA+PiA4KSA8PCA4KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbV9NYXNrQ29sb3IgPSBGWEFSR0JfTVVMX0FMUEhBKG1fTWFza0NvbG9yLCBtX0JpdG1hcEFscGhhKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbV9wRGV2aWNlLT5Db21wb3NpdGVNYXNrKG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdExlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wVHJhbnNmb3JtZXItPm1fUmVzdWx0VG9wLCBwQml0bWFwLT5HZXRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAtPkdldEhlaWdodCgpLCBwQml0bWFwLCBtX01hc2tDb2xvciwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0JsZW5kVHlwZSwgbV9wQ2xpcFJnbiwgbV9iUmdiQnl0ZU9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQWxwaGFGbGFnLCBtX3BJY2NUcmFuc2Zvcm0pOworICAgIH0gZWxzZSB7CisgICAgICBpZiAobV9CaXRtYXBBbHBoYSAhPSAyNTUpIHsKKyAgICAgICAgcEJpdG1hcC0+TXVsdGlwbHlBbHBoYShtX0JpdG1hcEFscGhhKTsKKyAgICAgIH0KKyAgICAgIG1fcERldmljZS0+Q29tcG9zaXRlQml0bWFwKAorICAgICAgICAgIG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdExlZnQsIG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdFRvcCwKKyAgICAgICAgICBwQml0bWFwLT5HZXRXaWR0aCgpLCBwQml0bWFwLT5HZXRIZWlnaHQoKSwgcEJpdG1hcCwgMCwgMCwgbV9CbGVuZFR5cGUsCisgICAgICAgICAgbV9wQ2xpcFJnbiwgbV9iUmdiQnl0ZU9yZGVyLCBtX3BJY2NUcmFuc2Zvcm0pOworICAgIH0KKyAgICBkZWxldGUgcEJpdG1hcDsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorQ0ZYX0JpdG1hcFN0b3Jlcjo6Q0ZYX0JpdG1hcFN0b3JlcigpIHsKKyAgbV9wQml0bWFwID0gTlVMTDsKK30KK0NGWF9CaXRtYXBTdG9yZXI6On5DRlhfQml0bWFwU3RvcmVyKCkgeworICBkZWxldGUgbV9wQml0bWFwOworfQorQ0ZYX0RJQml0bWFwKiBDRlhfQml0bWFwU3RvcmVyOjpEZXRhY2goKSB7CisgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IG1fcEJpdG1hcDsKKyAgbV9wQml0bWFwID0gTlVMTDsKKyAgcmV0dXJuIHBCaXRtYXA7Cit9Cit2b2lkIENGWF9CaXRtYXBTdG9yZXI6OlJlcGxhY2UoQ0ZYX0RJQml0bWFwKiBwQml0bWFwKSB7CisgIGRlbGV0ZSBtX3BCaXRtYXA7CisgIG1fcEJpdG1hcCA9IHBCaXRtYXA7Cit9Cit2b2lkIENGWF9CaXRtYXBTdG9yZXI6OkNvbXBvc2VTY2FubGluZShpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNjYW5saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2Nhbl9leHRyYV9hbHBoYSkgeworICB1aW50OF90KiBkZXN0X2J1ZiA9ICh1aW50OF90KiltX3BCaXRtYXAtPkdldFNjYW5saW5lKGxpbmUpOworICB1aW50OF90KiBkZXN0X2FscGhhX2J1ZiA9CisgICAgICBtX3BCaXRtYXAtPm1fcEFscGhhTWFzaworICAgICAgICAgID8gKHVpbnQ4X3QqKW1fcEJpdG1hcC0+bV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShsaW5lKQorICAgICAgICAgIDogTlVMTDsKKyAgaWYgKGRlc3RfYnVmKSB7CisgICAgRlhTWVNfbWVtY3B5KGRlc3RfYnVmLCBzY2FubGluZSwgbV9wQml0bWFwLT5HZXRQaXRjaCgpKTsKKyAgfQorICBpZiAoZGVzdF9hbHBoYV9idWYpIHsKKyAgICBGWFNZU19tZW1jcHkoZGVzdF9hbHBoYV9idWYsIHNjYW5fZXh0cmFfYWxwaGEsCisgICAgICAgICAgICAgICAgIG1fcEJpdG1hcC0+bV9wQWxwaGFNYXNrLT5HZXRQaXRjaCgpKTsKKyAgfQorfQorRlhfQk9PTCBDRlhfQml0bWFwU3RvcmVyOjpTZXRJbmZvKGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwU3JjUGFsZXR0ZSkgeworICBtX3BCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOworICBpZiAoIW1fcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIHNyY19mb3JtYXQpKSB7CisgICAgZGVsZXRlIG1fcEJpdG1hcDsKKyAgICBtX3BCaXRtYXAgPSBOVUxMOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAocFNyY1BhbGV0dGUpIHsKKyAgICBtX3BCaXRtYXAtPkNvcHlQYWxldHRlKHBTcmNQYWxldHRlKTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl90cmFuc2Zvcm0uY3BwIGIvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX3RyYW5zZm9ybS5jcHAKaW5kZXggNDU0NDUwNi4uZDk3NDBlMCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX3RyYW5zZm9ybS5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX3RyYW5zZm9ybS5jcHAKQEAgLTEsNzg4ICsxLDk0OCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGdlL2Z4X2RpYi5oIgogI2luY2x1ZGUgImRpYl9pbnQuaCIKLWludCBTRFBfVGFibGVbNTEzXSA9IHsKLSAgICAyNTYsIDI1NiwgMjU2LCAyNTYsIDI1NiwgMjU2LCAyNTYsIDI1NiwgMjU2LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTQsIDI1NCwgMjU0LCAyNTQsCi0gICAgMjUzLCAyNTMsIDI1MywgMjUyLCAyNTIsIDI1MiwgMjUxLCAyNTEsIDI1MSwgMjUwLCAyNTAsIDI0OSwgMjQ5LCAyNDksIDI0OCwgMjQ4LCAyNDcsIDI0NywgMjQ2LAotICAgIDI0NiwgMjQ1LCAyNDQsIDI0NCwgMjQzLCAyNDMsIDI0MiwgMjQyLCAyNDEsIDI0MCwgMjQwLCAyMzksIDIzOCwgMjM4LCAyMzcsIDIzNiwgMjM2LCAyMzUsIDIzNCwKLSAgICAyMzMsIDIzMywgMjMyLCAyMzEsIDIzMCwgMjMwLCAyMjksIDIyOCwgMjI3LCAyMjYsIDIyNiwgMjI1LCAyMjQsIDIyMywgMjIyLCAyMjEsIDIyMCwgMjE5LCAyMTgsCi0gICAgMjE4LCAyMTcsIDIxNiwgMjE1LCAyMTQsIDIxMywgMjEyLCAyMTEsIDIxMCwgMjA5LCAyMDgsIDIwNywgMjA2LCAyMDUsIDIwNCwgMjAzLCAyMDIsIDIwMSwgMjAwLAotICAgIDE5OSwgMTk4LCAxOTYsIDE5NSwgMTk0LCAxOTMsIDE5MiwgMTkxLCAxOTAsIDE4OSwgMTg4LCAxODYsIDE4NSwgMTg0LCAxODMsIDE4MiwgMTgxLCAxNzksIDE3OCwKLSAgICAxNzcsIDE3NiwgMTc1LCAxNzMsIDE3MiwgMTcxLCAxNzAsIDE2OSwgMTY3LCAxNjYsIDE2NSwgMTY0LCAxNjIsIDE2MSwgMTYwLCAxNTksIDE1NywgMTU2LCAxNTUsCi0gICAgMTU0LCAxNTIsIDE1MSwgMTUwLCAxNDksIDE0NywgMTQ2LCAxNDUsIDE0MywgMTQyLCAxNDEsIDE0MCwgMTM4LCAxMzcsIDEzNiwgMTM0LCAxMzMsIDEzMiwgMTMwLAotICAgIDEyOSwgMTI4LCAxMjYsIDEyNSwgMTI0LCAxMjIsIDEyMSwgMTIwLCAxMTksIDExNywgMTE2LCAxMTUsIDExMywgMTEyLCAxMTEsIDEwOSwgMTA4LCAxMDcsIDEwNSwKLSAgICAxMDQsIDEwMywgMTAxLCAxMDAsIDk5LCA5NywgOTYsIDk1LCA5MywgOTIsIDkxLCA4OSwgODgsIDg3LCA4NSwgODQsIDgzLCA4MSwgODAsIDc5LCA3NywgNzYsIDc1LAotICAgIDczLCA3MiwgNzEsIDY5LCA2OCwgNjcsIDY2LCA2NCwgNjMsIDYyLCA2MCwgNTksIDU4LCA1NywgNTUsIDU0LCA1MywgNTIsIDUwLCA0OSwgNDgsIDQ3LCA0NSwgNDQsCi0gICAgNDMsIDQyLCA0MCwgMzksIDM4LCAzNywgMzYsIDM0LCAzMywgMzIsIDMxLCAzMCwgMjgsIDI3LCAyNiwgMjUsIDI0LCAyMywgMjEsIDIwLCAxOSwgMTgsIDE3LCAxNiwKLSAgICAxNSwgMTQsIDEzLCAxMSwgMTAsIDksIDgsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDAsIDAsIC0xLCAtMiwgLTMsIC00LCAtNSwgLTYsIC03LCAtNywgLTgsIC05LCAtMTAsCi0gICAgLTExLCAtMTIsIC0xMiwgLTEzLCAtMTQsIC0xNSwgLTE1LCAtMTYsIC0xNywgLTE3LCAtMTgsIC0xOSwgLTE5LCAtMjAsIC0yMSwgLTIxLCAtMjIsIC0yMiwgLTIzLCAtMjQsCi0gICAgLTI0LCAtMjUsIC0yNSwgLTI2LCAtMjYsIC0yNywgLTI3LCAtMjcsIC0yOCwgLTI4LCAtMjksIC0yOSwgLTMwLCAtMzAsIC0zMCwgLTMxLCAtMzEsIC0zMSwgLTMyLCAtMzIsCi0gICAgLTMyLCAtMzMsIC0zMywgLTMzLCAtMzMsIC0zNCwgLTM0LCAtMzQsIC0zNCwgLTM1LCAtMzUsIC0zNSwgLTM1LCAtMzUsIC0zNiwgLTM2LCAtMzYsIC0zNiwgLTM2LCAtMzYsCi0gICAgLTM2LCAtMzYsIC0zNiwgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsCi0gICAgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzYsIC0zNiwgLTM2LCAtMzYsIC0zNiwgLTM2LCAtMzYsIC0zNiwgLTM2LCAtMzUsIC0zNSwgLTM1LCAtMzUsIC0zNSwgLTM1LCAtMzQsCi0gICAgLTM0LCAtMzQsIC0zNCwgLTM0LCAtMzMsIC0zMywgLTMzLCAtMzMsIC0zMywgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzEsIC0zMSwgLTMxLCAtMzEsIC0zMCwgLTMwLCAtMzAsCi0gICAgLTMwLCAtMjksIC0yOSwgLTI5LCAtMjksIC0yOCwgLTI4LCAtMjgsIC0yNywgLTI3LCAtMjcsIC0yNywgLTI2LCAtMjYsIC0yNiwgLTI1LCAtMjUsIC0yNSwgLTI0LCAtMjQsCi0gICAgLTI0LCAtMjMsIC0yMywgLTIzLCAtMjIsIC0yMiwgLTIyLCAtMjIsIC0yMSwgLTIxLCAtMjEsIC0yMCwgLTIwLCAtMjAsIC0xOSwgLTE5LCAtMTksIC0xOCwgLTE4LCAtMTgsCi0gICAgLTE3LCAtMTcsIC0xNywgLTE2LCAtMTYsIC0xNiwgLTE1LCAtMTUsIC0xNSwgLTE0LCAtMTQsIC0xNCwgLTEzLCAtMTMsIC0xMywgLTEyLCAtMTIsIC0xMiwgLTExLCAtMTEsCi0gICAgLTExLCAtMTAsIC0xMCwgLTEwLCAtOSwgLTksIC05LCAtOSwgLTgsIC04LCAtOCwgLTcsIC03LCAtNywgLTcsIC02LCAtNiwgLTYsIC02LCAtNSwgLTUsIC01LCAtNSwgLTQsCi0gICAgLTQsIC00LCAtNCwgLTMsIC0zLCAtMywgLTMsIC0zLCAtMiwgLTIsIC0yLCAtMiwgLTIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2RpYi5oIgorCituYW1lc3BhY2UgeworCit1aW50OF90IGJpbGluZWFyX2ludGVycG9sKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd19vZmZzZXRfbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd19vZmZzZXRfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19jb2xfbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19jb2xfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc194LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVzX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBicHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjX29mZnNldCkgeworICBpbnQgaV9yZXN4ID0gMjU1IC0gcmVzX3g7CisgIGludCBjb2xfYnBwX2wgPSBzcmNfY29sX2wgKiBicHA7CisgIGludCBjb2xfYnBwX3IgPSBzcmNfY29sX3IgKiBicHA7CisgIGNvbnN0IHVpbnQ4X3QqIGJ1Zl91ID0gYnVmICsgcm93X29mZnNldF9sICsgY19vZmZzZXQ7CisgIGNvbnN0IHVpbnQ4X3QqIGJ1Zl9kID0gYnVmICsgcm93X29mZnNldF9yICsgY19vZmZzZXQ7CisgIGNvbnN0IHVpbnQ4X3QqIHNyY19wb3MwID0gYnVmX3UgKyBjb2xfYnBwX2w7CisgIGNvbnN0IHVpbnQ4X3QqIHNyY19wb3MxID0gYnVmX3UgKyBjb2xfYnBwX3I7CisgIGNvbnN0IHVpbnQ4X3QqIHNyY19wb3MyID0gYnVmX2QgKyBjb2xfYnBwX2w7CisgIGNvbnN0IHVpbnQ4X3QqIHNyY19wb3MzID0gYnVmX2QgKyBjb2xfYnBwX3I7CisgIHVpbnQ4X3Qgcl9wb3NfMCA9ICgqc3JjX3BvczAgKiBpX3Jlc3ggKyAqc3JjX3BvczEgKiByZXNfeCkgPj4gODsKKyAgdWludDhfdCByX3Bvc18xID0gKCpzcmNfcG9zMiAqIGlfcmVzeCArICpzcmNfcG9zMyAqIHJlc194KSA+PiA4OworICByZXR1cm4gKHJfcG9zXzAgKiAoMjU1IC0gcmVzX3kpICsgcl9wb3NfMSAqIHJlc195KSA+PiA4OworfQorCit1aW50OF90IGJpY3ViaWNfaW50ZXJwb2woY29uc3QgdWludDhfdCogYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zX3BpeGVsW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVfd1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2X3dbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVzX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc195LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBicHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNfb2Zmc2V0KSB7CisgIGludCBzX3Jlc3VsdCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgaW50IGFfcmVzdWx0ID0gMDsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgYV9yZXN1bHQgKz0gdV93W2pdICogKCoodWludDhfdCopKGJ1ZiArIHBvc19waXhlbFtpICsgNF0gKiBwaXRjaCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zX3BpeGVsW2pdICogYnBwICsgY19vZmZzZXQpKTsKKyAgICB9CisgICAgc19yZXN1bHQgKz0gYV9yZXN1bHQgKiB2X3dbaV07CisgIH0KKyAgc19yZXN1bHQgPj49IDE2OworICByZXR1cm4gKHVpbnQ4X3QpKHNfcmVzdWx0IDwgMCA/IDAgOiBzX3Jlc3VsdCA+IDI1NSA/IDI1NSA6IHNfcmVzdWx0KTsKK30KKwordm9pZCBiaWN1YmljX2dldF9wb3Nfd2VpZ2h0KGludCBwb3NfcGl4ZWxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdV93W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZfd1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfY29sX2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19yb3dfbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVzX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc195LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJldGNoX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJldGNoX2hlaWdodCkgeworICBwb3NfcGl4ZWxbMF0gPSBzcmNfY29sX2wgLSAxOworICBwb3NfcGl4ZWxbMV0gPSBzcmNfY29sX2w7CisgIHBvc19waXhlbFsyXSA9IHNyY19jb2xfbCArIDE7CisgIHBvc19waXhlbFszXSA9IHNyY19jb2xfbCArIDI7CisgIHBvc19waXhlbFs0XSA9IHNyY19yb3dfbCAtIDE7CisgIHBvc19waXhlbFs1XSA9IHNyY19yb3dfbDsKKyAgcG9zX3BpeGVsWzZdID0gc3JjX3Jvd19sICsgMTsKKyAgcG9zX3BpeGVsWzddID0gc3JjX3Jvd19sICsgMjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICBpZiAocG9zX3BpeGVsW2ldIDwgMCkgeworICAgICAgcG9zX3BpeGVsW2ldID0gMDsKKyAgICB9CisgICAgaWYgKHBvc19waXhlbFtpXSA+PSBzdHJldGNoX3dpZHRoKSB7CisgICAgICBwb3NfcGl4ZWxbaV0gPSBzdHJldGNoX3dpZHRoIC0gMTsKKyAgICB9CisgICAgaWYgKHBvc19waXhlbFtpICsgNF0gPCAwKSB7CisgICAgICBwb3NfcGl4ZWxbaSArIDRdID0gMDsKKyAgICB9CisgICAgaWYgKHBvc19waXhlbFtpICsgNF0gPj0gc3RyZXRjaF9oZWlnaHQpIHsKKyAgICAgIHBvc19waXhlbFtpICsgNF0gPSBzdHJldGNoX2hlaWdodCAtIDE7CisgICAgfQorICB9CisgIHVfd1swXSA9IFNEUF9UYWJsZVsyNTYgKyByZXNfeF07CisgIHVfd1sxXSA9IFNEUF9UYWJsZVtyZXNfeF07CisgIHVfd1syXSA9IFNEUF9UYWJsZVsyNTYgLSByZXNfeF07CisgIHVfd1szXSA9IFNEUF9UYWJsZVs1MTIgLSByZXNfeF07CisgIHZfd1swXSA9IFNEUF9UYWJsZVsyNTYgKyByZXNfeV07CisgIHZfd1sxXSA9IFNEUF9UYWJsZVtyZXNfeV07CisgIHZfd1syXSA9IFNEUF9UYWJsZVsyNTYgLSByZXNfeV07CisgIHZfd1szXSA9IFNEUF9UYWJsZVs1MTIgLSByZXNfeV07Cit9CisKK0ZYRElCX0Zvcm1hdCBHZXRUcmFuc2Zvcm1lZEZvcm1hdChjb25zdCBDRlhfRElCU291cmNlKiBwRHJjKSB7CisgIEZYRElCX0Zvcm1hdCBmb3JtYXQgPSBwRHJjLT5HZXRGb3JtYXQoKTsKKyAgaWYgKHBEcmMtPklzQWxwaGFNYXNrKCkpIHsKKyAgICBmb3JtYXQgPSBGWERJQl84YnBwTWFzazsKKyAgfSBlbHNlIGlmIChmb3JtYXQgPj0gMTAyNSkgeworICAgIGZvcm1hdCA9IEZYRElCX0NteWthOworICB9IGVsc2UgaWYgKGZvcm1hdCA8PSAzMiB8fCBmb3JtYXQgPT0gRlhESUJfQXJnYikgeworICAgIGZvcm1hdCA9IEZYRElCX0FyZ2I7CisgIH0gZWxzZSB7CisgICAgZm9ybWF0ID0gRlhESUJfUmdiYTsKKyAgfQorICByZXR1cm4gZm9ybWF0OworfQorCit9ICAvLyBuYW1lc3BhY2UKKworY29uc3QgaW50MTZfdCBTRFBfVGFibGVbNTEzXSA9IHsKKyAgICAyNTYsIDI1NiwgMjU2LCAyNTYsIDI1NiwgMjU2LCAyNTYsIDI1NiwgMjU2LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjUzLCAyNTMsIDI1MywgMjUyLCAyNTIsIDI1MiwgMjUxLCAyNTEsIDI1MSwgMjUwLCAyNTAsCisgICAgMjQ5LCAyNDksIDI0OSwgMjQ4LCAyNDgsIDI0NywgMjQ3LCAyNDYsIDI0NiwgMjQ1LCAyNDQsIDI0NCwgMjQzLCAyNDMsIDI0MiwKKyAgICAyNDIsIDI0MSwgMjQwLCAyNDAsIDIzOSwgMjM4LCAyMzgsIDIzNywgMjM2LCAyMzYsIDIzNSwgMjM0LCAyMzMsIDIzMywgMjMyLAorICAgIDIzMSwgMjMwLCAyMzAsIDIyOSwgMjI4LCAyMjcsIDIyNiwgMjI2LCAyMjUsIDIyNCwgMjIzLCAyMjIsIDIyMSwgMjIwLCAyMTksCisgICAgMjE4LCAyMTgsIDIxNywgMjE2LCAyMTUsIDIxNCwgMjEzLCAyMTIsIDIxMSwgMjEwLCAyMDksIDIwOCwgMjA3LCAyMDYsIDIwNSwKKyAgICAyMDQsIDIwMywgMjAyLCAyMDEsIDIwMCwgMTk5LCAxOTgsIDE5NiwgMTk1LCAxOTQsIDE5MywgMTkyLCAxOTEsIDE5MCwgMTg5LAorICAgIDE4OCwgMTg2LCAxODUsIDE4NCwgMTgzLCAxODIsIDE4MSwgMTc5LCAxNzgsIDE3NywgMTc2LCAxNzUsIDE3MywgMTcyLCAxNzEsCisgICAgMTcwLCAxNjksIDE2NywgMTY2LCAxNjUsIDE2NCwgMTYyLCAxNjEsIDE2MCwgMTU5LCAxNTcsIDE1NiwgMTU1LCAxNTQsIDE1MiwKKyAgICAxNTEsIDE1MCwgMTQ5LCAxNDcsIDE0NiwgMTQ1LCAxNDMsIDE0MiwgMTQxLCAxNDAsIDEzOCwgMTM3LCAxMzYsIDEzNCwgMTMzLAorICAgIDEzMiwgMTMwLCAxMjksIDEyOCwgMTI2LCAxMjUsIDEyNCwgMTIyLCAxMjEsIDEyMCwgMTE5LCAxMTcsIDExNiwgMTE1LCAxMTMsCisgICAgMTEyLCAxMTEsIDEwOSwgMTA4LCAxMDcsIDEwNSwgMTA0LCAxMDMsIDEwMSwgMTAwLCA5OSwgIDk3LCAgOTYsICA5NSwgIDkzLAorICAgIDkyLCAgOTEsICA4OSwgIDg4LCAgODcsICA4NSwgIDg0LCAgODMsICA4MSwgIDgwLCAgNzksICA3NywgIDc2LCAgNzUsICA3MywKKyAgICA3MiwgIDcxLCAgNjksICA2OCwgIDY3LCAgNjYsICA2NCwgIDYzLCAgNjIsICA2MCwgIDU5LCAgNTgsICA1NywgIDU1LCAgNTQsCisgICAgNTMsICA1MiwgIDUwLCAgNDksICA0OCwgIDQ3LCAgNDUsICA0NCwgIDQzLCAgNDIsICA0MCwgIDM5LCAgMzgsICAzNywgIDM2LAorICAgIDM0LCAgMzMsICAzMiwgIDMxLCAgMzAsICAyOCwgIDI3LCAgMjYsICAyNSwgIDI0LCAgMjMsICAyMSwgIDIwLCAgMTksICAxOCwKKyAgICAxNywgIDE2LCAgMTUsICAxNCwgIDEzLCAgMTEsICAxMCwgIDksICAgOCwgICA3LCAgIDYsICAgNSwgICA0LCAgIDMsICAgMiwKKyAgICAxLCAgIDAsICAgMCwgICAtMSwgIC0yLCAgLTMsICAtNCwgIC01LCAgLTYsICAtNywgIC03LCAgLTgsICAtOSwgIC0xMCwgLTExLAorICAgIC0xMiwgLTEyLCAtMTMsIC0xNCwgLTE1LCAtMTUsIC0xNiwgLTE3LCAtMTcsIC0xOCwgLTE5LCAtMTksIC0yMCwgLTIxLCAtMjEsCisgICAgLTIyLCAtMjIsIC0yMywgLTI0LCAtMjQsIC0yNSwgLTI1LCAtMjYsIC0yNiwgLTI3LCAtMjcsIC0yNywgLTI4LCAtMjgsIC0yOSwKKyAgICAtMjksIC0zMCwgLTMwLCAtMzAsIC0zMSwgLTMxLCAtMzEsIC0zMiwgLTMyLCAtMzIsIC0zMywgLTMzLCAtMzMsIC0zMywgLTM0LAorICAgIC0zNCwgLTM0LCAtMzQsIC0zNSwgLTM1LCAtMzUsIC0zNSwgLTM1LCAtMzYsIC0zNiwgLTM2LCAtMzYsIC0zNiwgLTM2LCAtMzYsCisgICAgLTM2LCAtMzYsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywKKyAgICAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM2LCAtMzYsIC0zNiwgLTM2LCAtMzYsIC0zNiwgLTM2LAorICAgIC0zNiwgLTM2LCAtMzUsIC0zNSwgLTM1LCAtMzUsIC0zNSwgLTM1LCAtMzQsIC0zNCwgLTM0LCAtMzQsIC0zNCwgLTMzLCAtMzMsCisgICAgLTMzLCAtMzMsIC0zMywgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzEsIC0zMSwgLTMxLCAtMzEsIC0zMCwgLTMwLCAtMzAsIC0zMCwKKyAgICAtMjksIC0yOSwgLTI5LCAtMjksIC0yOCwgLTI4LCAtMjgsIC0yNywgLTI3LCAtMjcsIC0yNywgLTI2LCAtMjYsIC0yNiwgLTI1LAorICAgIC0yNSwgLTI1LCAtMjQsIC0yNCwgLTI0LCAtMjMsIC0yMywgLTIzLCAtMjIsIC0yMiwgLTIyLCAtMjIsIC0yMSwgLTIxLCAtMjEsCisgICAgLTIwLCAtMjAsIC0yMCwgLTE5LCAtMTksIC0xOSwgLTE4LCAtMTgsIC0xOCwgLTE3LCAtMTcsIC0xNywgLTE2LCAtMTYsIC0xNiwKKyAgICAtMTUsIC0xNSwgLTE1LCAtMTQsIC0xNCwgLTE0LCAtMTMsIC0xMywgLTEzLCAtMTIsIC0xMiwgLTEyLCAtMTEsIC0xMSwgLTExLAorICAgIC0xMCwgLTEwLCAtMTAsIC05LCAgLTksICAtOSwgIC05LCAgLTgsICAtOCwgIC04LCAgLTcsICAtNywgIC03LCAgLTcsICAtNiwKKyAgICAtNiwgIC02LCAgLTYsICAtNSwgIC01LCAgLTUsICAtNSwgIC00LCAgLTQsICAtNCwgIC00LCAgLTMsICAtMywgIC0zLCAgLTMsCisgICAgLTMsICAtMiwgIC0yLCAgLTIsICAtMiwgIC0yLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgMCwgICAwLCAgIDAsCisgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMCwgICAwLCAgIDAsCiB9OwotY2xhc3MgQ0ZYX0JpbGluZWFyTWF0cml4IDogcHVibGljIENQREZfRml4ZWRNYXRyaXgKLXsKLXB1YmxpYzoKLSAgICBDRlhfQmlsaW5lYXJNYXRyaXgoY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCYgc3JjLCBpbnQgYml0cyk6IENQREZfRml4ZWRNYXRyaXgoc3JjLCBiaXRzKQotICAgIHt9Ci0gICAgaW5saW5lIHZvaWQJVHJhbnNmb3JtKGludCB4LCBpbnQgeSwgaW50JiB4MSwgaW50JiB5MSwgaW50JnJlc194LCBpbnQmcmVzX3kpCi0gICAgewotICAgICAgICB4MSA9IGEgKiB4ICsgYyAqIHkgKyBlICsgYmFzZSAvIDI7Ci0gICAgICAgIHkxID0gYiAqIHggKyBkICogeSArIGYgKyBiYXNlIC8gMjsKLSAgICAgICAgcmVzX3ggPSB4MSAlIGJhc2U7Ci0gICAgICAgIHJlc195ID0geTEgJSBiYXNlOwotICAgICAgICBpZiAocmVzX3ggPCAwICYmIHJlc194ID4gLWJhc2UpIHsKLSAgICAgICAgICAgIHJlc194ID0gYmFzZSArIHJlc194OwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXNfeSA8IDAgJiYgcmVzX3ggPiAtYmFzZSkgewotICAgICAgICAgICAgcmVzX3kgPSBiYXNlICsgcmVzX3k7Ci0gICAgICAgIH0KLSAgICAgICAgeDEgLz0gYmFzZTsKLSAgICAgICAgeTEgLz0gYmFzZTsKKworY2xhc3MgQ0ZYX0JpbGluZWFyTWF0cml4IDogcHVibGljIENQREZfRml4ZWRNYXRyaXggeworIHB1YmxpYzoKKyAgQ0ZYX0JpbGluZWFyTWF0cml4KGNvbnN0IENGWF9NYXRyaXgmIHNyYywgaW50IGJpdHMpCisgICAgICA6IENQREZfRml4ZWRNYXRyaXgoc3JjLCBiaXRzKSB7fQorICBpbmxpbmUgdm9pZCBUcmFuc2Zvcm0oaW50IHgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCYgeDEsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHkxLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50JiByZXNfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCYgcmVzX3kpIHsKKyAgICB4MSA9IGEgKiB4ICsgYyAqIHkgKyBlICsgYmFzZSAvIDI7CisgICAgeTEgPSBiICogeCArIGQgKiB5ICsgZiArIGJhc2UgLyAyOworICAgIHJlc194ID0geDEgJSBiYXNlOworICAgIHJlc195ID0geTEgJSBiYXNlOworICAgIGlmIChyZXNfeCA8IDAgJiYgcmVzX3ggPiAtYmFzZSkgeworICAgICAgcmVzX3ggPSBiYXNlICsgcmVzX3g7CiAgICAgfQorICAgIGlmIChyZXNfeSA8IDAgJiYgcmVzX3ggPiAtYmFzZSkgeworICAgICAgcmVzX3kgPSBiYXNlICsgcmVzX3k7CisgICAgfQorICAgIHgxIC89IGJhc2U7CisgICAgeTEgLz0gYmFzZTsKKyAgfQogfTsKLUNGWF9ESUJpdG1hcCogQ0ZYX0RJQlNvdXJjZTo6U3dhcFhZKEZYX0JPT0wgYlhGbGlwLCBGWF9CT09MIGJZRmxpcCwgY29uc3QgRlhfUkVDVCogcERlc3RDbGlwKSBjb25zdAotewotICAgIEZYX1JFQ1QgZGVzdF9jbGlwKDAsIDAsIG1fSGVpZ2h0LCBtX1dpZHRoKTsKLSAgICBpZiAocERlc3RDbGlwKSB7Ci0gICAgICAgIGRlc3RfY2xpcC5JbnRlcnNlY3QoKnBEZXN0Q2xpcCk7Ci0gICAgfQotICAgIGlmIChkZXN0X2NsaXAuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDRlhfRElCaXRtYXAqIHBUcmFuc0JpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7Ci0gICAgaW50IHJlc3VsdF9oZWlnaHQgPSBkZXN0X2NsaXAuSGVpZ2h0KCksIHJlc3VsdF93aWR0aCA9IGRlc3RfY2xpcC5XaWR0aCgpOwotICAgIGlmICghcFRyYW5zQml0bWFwLT5DcmVhdGUocmVzdWx0X3dpZHRoLCByZXN1bHRfaGVpZ2h0LCBHZXRGb3JtYXQoKSkpIHsKLSAgICAgICAgZGVsZXRlIHBUcmFuc0JpdG1hcDsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHBUcmFuc0JpdG1hcC0+Q29weVBhbGV0dGUobV9wUGFsZXR0ZSk7Ci0gICAgaW50IGRlc3RfcGl0Y2ggPSBwVHJhbnNCaXRtYXAtPkdldFBpdGNoKCk7Ci0gICAgRlhfTFBCWVRFIGRlc3RfYnVmID0gcFRyYW5zQml0bWFwLT5HZXRCdWZmZXIoKTsKLSAgICBpbnQgcm93X3N0YXJ0ID0gYlhGbGlwID8gbV9IZWlnaHQgLSBkZXN0X2NsaXAucmlnaHQgOiBkZXN0X2NsaXAubGVmdDsKLSAgICBpbnQgcm93X2VuZCA9IGJYRmxpcCA/IG1fSGVpZ2h0IC0gZGVzdF9jbGlwLmxlZnQgOiBkZXN0X2NsaXAucmlnaHQ7Ci0gICAgaW50IGNvbF9zdGFydCA9IGJZRmxpcCA/IG1fV2lkdGggLSBkZXN0X2NsaXAuYm90dG9tIDogZGVzdF9jbGlwLnRvcDsKLSAgICBpbnQgY29sX2VuZCA9IGJZRmxpcCA/IG1fV2lkdGggLSBkZXN0X2NsaXAudG9wIDogZGVzdF9jbGlwLmJvdHRvbTsKLSAgICBpZiAoR2V0QlBQKCkgPT0gMSkgewotICAgICAgICBGWFNZU19tZW1zZXQ4KGRlc3RfYnVmLCAweGZmLCBkZXN0X3BpdGNoICogcmVzdWx0X2hlaWdodCk7Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IHJvd19zdGFydDsgcm93IDwgcm93X2VuZDsgcm93ICsrKSB7Ci0gICAgICAgICAgICBGWF9MUENCWVRFIHNyY19zY2FuID0gR2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgICAgIGludCBkZXN0X2NvbCA9IChiWEZsaXAgPyBkZXN0X2NsaXAucmlnaHQgLSAocm93IC0gcm93X3N0YXJ0KSAtIDEgOiByb3cpIC0gZGVzdF9jbGlwLmxlZnQ7Ci0gICAgICAgICAgICBGWF9MUEJZVEUgZGVzdF9zY2FuID0gZGVzdF9idWY7Ci0gICAgICAgICAgICBpZiAoYllGbGlwKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IChyZXN1bHRfaGVpZ2h0IC0gMSkgKiBkZXN0X3BpdGNoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGRlc3Rfc3RlcCA9IGJZRmxpcCA/IC1kZXN0X3BpdGNoIDogZGVzdF9waXRjaDsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEoc3JjX3NjYW5bY29sIC8gOF0gJiAoMSA8PCAoNyAtIGNvbCAlIDgpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfY29sIC8gOF0gJj0gfigxIDw8ICg3IC0gZGVzdF9jb2wgJSA4KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X3N0ZXA7Ci0gICAgICAgICAgICB9CitDRlhfRElCaXRtYXAqIENGWF9ESUJTb3VyY2U6OlN3YXBYWShGWF9CT09MIGJYRmxpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYllGbGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcERlc3RDbGlwKSBjb25zdCB7CisgIEZYX1JFQ1QgZGVzdF9jbGlwKDAsIDAsIG1fSGVpZ2h0LCBtX1dpZHRoKTsKKyAgaWYgKHBEZXN0Q2xpcCkgeworICAgIGRlc3RfY2xpcC5JbnRlcnNlY3QoKnBEZXN0Q2xpcCk7CisgIH0KKyAgaWYgKGRlc3RfY2xpcC5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDRlhfRElCaXRtYXAqIHBUcmFuc0JpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7CisgIGludCByZXN1bHRfaGVpZ2h0ID0gZGVzdF9jbGlwLkhlaWdodCgpLCByZXN1bHRfd2lkdGggPSBkZXN0X2NsaXAuV2lkdGgoKTsKKyAgaWYgKCFwVHJhbnNCaXRtYXAtPkNyZWF0ZShyZXN1bHRfd2lkdGgsIHJlc3VsdF9oZWlnaHQsIEdldEZvcm1hdCgpKSkgeworICAgIGRlbGV0ZSBwVHJhbnNCaXRtYXA7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcFRyYW5zQml0bWFwLT5Db3B5UGFsZXR0ZShtX3BQYWxldHRlKTsKKyAgaW50IGRlc3RfcGl0Y2ggPSBwVHJhbnNCaXRtYXAtPkdldFBpdGNoKCk7CisgIHVpbnQ4X3QqIGRlc3RfYnVmID0gcFRyYW5zQml0bWFwLT5HZXRCdWZmZXIoKTsKKyAgaW50IHJvd19zdGFydCA9IGJYRmxpcCA/IG1fSGVpZ2h0IC0gZGVzdF9jbGlwLnJpZ2h0IDogZGVzdF9jbGlwLmxlZnQ7CisgIGludCByb3dfZW5kID0gYlhGbGlwID8gbV9IZWlnaHQgLSBkZXN0X2NsaXAubGVmdCA6IGRlc3RfY2xpcC5yaWdodDsKKyAgaW50IGNvbF9zdGFydCA9IGJZRmxpcCA/IG1fV2lkdGggLSBkZXN0X2NsaXAuYm90dG9tIDogZGVzdF9jbGlwLnRvcDsKKyAgaW50IGNvbF9lbmQgPSBiWUZsaXAgPyBtX1dpZHRoIC0gZGVzdF9jbGlwLnRvcCA6IGRlc3RfY2xpcC5ib3R0b207CisgIGlmIChHZXRCUFAoKSA9PSAxKSB7CisgICAgRlhTWVNfbWVtc2V0KGRlc3RfYnVmLCAweGZmLCBkZXN0X3BpdGNoICogcmVzdWx0X2hlaWdodCk7CisgICAgZm9yIChpbnQgcm93ID0gcm93X3N0YXJ0OyByb3cgPCByb3dfZW5kOyByb3crKykgeworICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBHZXRTY2FubGluZShyb3cpOworICAgICAgaW50IGRlc3RfY29sID0gKGJYRmxpcCA/IGRlc3RfY2xpcC5yaWdodCAtIChyb3cgLSByb3dfc3RhcnQpIC0gMSA6IHJvdykgLQorICAgICAgICAgICAgICAgICAgICAgZGVzdF9jbGlwLmxlZnQ7CisgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZjsKKyAgICAgIGlmIChiWUZsaXApIHsKKyAgICAgICAgZGVzdF9zY2FuICs9IChyZXN1bHRfaGVpZ2h0IC0gMSkgKiBkZXN0X3BpdGNoOworICAgICAgfQorICAgICAgaW50IGRlc3Rfc3RlcCA9IGJZRmxpcCA/IC1kZXN0X3BpdGNoIDogZGVzdF9waXRjaDsKKyAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgICAgaWYgKCEoc3JjX3NjYW5bY29sIC8gOF0gJiAoMSA8PCAoNyAtIGNvbCAlIDgpKSkpIHsKKyAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9jb2wgLyA4XSAmPSB+KDEgPDwgKDcgLSBkZXN0X2NvbCAlIDgpKTsKICAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBuQnl0ZXMgPSBHZXRCUFAoKSAvIDg7Ci0gICAgICAgIGludCBkZXN0X3N0ZXAgPSBiWUZsaXAgPyAtZGVzdF9waXRjaCA6IGRlc3RfcGl0Y2g7Ci0gICAgICAgIGlmIChuQnl0ZXMgPT0gMykgewotICAgICAgICAgICAgZGVzdF9zdGVwIC09IDI7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgcm93ID0gcm93X3N0YXJ0OyByb3cgPCByb3dfZW5kOyByb3cgKyspIHsKLSAgICAgICAgICAgIGludCBkZXN0X2NvbCA9IChiWEZsaXAgPyBkZXN0X2NsaXAucmlnaHQgLSAocm93IC0gcm93X3N0YXJ0KSAtIDEgOiByb3cpIC0gZGVzdF9jbGlwLmxlZnQ7Ci0gICAgICAgICAgICBGWF9MUEJZVEUgZGVzdF9zY2FuID0gZGVzdF9idWYgKyBkZXN0X2NvbCAqIG5CeXRlczsKLSAgICAgICAgICAgIGlmIChiWUZsaXApIHsKLSAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gKHJlc3VsdF9oZWlnaHQgLSAxKSAqIGRlc3RfcGl0Y2g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobkJ5dGVzID09IDQpIHsKLSAgICAgICAgICAgICAgICBGWF9EV09SRCogc3JjX3NjYW4gPSAoRlhfRFdPUkQqKUdldFNjYW5saW5lKHJvdykgKyBjb2xfc3RhcnQ7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9zY2FuID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X3N0ZXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBGWF9MUENCWVRFIHNyY19zY2FuID0gR2V0U2NhbmxpbmUocm93KSArIGNvbF9zdGFydCAqIG5CeXRlczsKLSAgICAgICAgICAgICAgICBpZiAobkJ5dGVzID09IDEpCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9zdGVwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X3N0ZXA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9zdGVwOworICAgICAgfQogICAgIH0KLSAgICBpZiAobV9wQWxwaGFNYXNrKSB7Ci0gICAgICAgIGRlc3RfcGl0Y2ggPSBwVHJhbnNCaXRtYXAtPm1fcEFscGhhTWFzay0+R2V0UGl0Y2goKTsKLSAgICAgICAgZGVzdF9idWYgPSBwVHJhbnNCaXRtYXAtPm1fcEFscGhhTWFzay0+R2V0QnVmZmVyKCk7Ci0gICAgICAgIGludCBkZXN0X3N0ZXAgPSBiWUZsaXAgPyAtZGVzdF9waXRjaCA6IGRlc3RfcGl0Y2g7Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IHJvd19zdGFydDsgcm93IDwgcm93X2VuZDsgcm93ICsrKSB7Ci0gICAgICAgICAgICBpbnQgZGVzdF9jb2wgPSAoYlhGbGlwID8gZGVzdF9jbGlwLnJpZ2h0IC0gKHJvdyAtIHJvd19zdGFydCkgLSAxIDogcm93KSAtIGRlc3RfY2xpcC5sZWZ0OwotICAgICAgICAgICAgRlhfTFBCWVRFIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgZGVzdF9jb2w7Ci0gICAgICAgICAgICBpZiAoYllGbGlwKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IChyZXN1bHRfaGVpZ2h0IC0gMSkgKiBkZXN0X3BpdGNoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfTFBDQllURSBzcmNfc2NhbiA9IG1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUocm93KSArIGNvbF9zdGFydDsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X3N0ZXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbnQgbkJ5dGVzID0gR2V0QlBQKCkgLyA4OworICAgIGludCBkZXN0X3N0ZXAgPSBiWUZsaXAgPyAtZGVzdF9waXRjaCA6IGRlc3RfcGl0Y2g7CisgICAgaWYgKG5CeXRlcyA9PSAzKSB7CisgICAgICBkZXN0X3N0ZXAgLT0gMjsKICAgICB9Ci0gICAgcmV0dXJuIHBUcmFuc0JpdG1hcDsKKyAgICBmb3IgKGludCByb3cgPSByb3dfc3RhcnQ7IHJvdyA8IHJvd19lbmQ7IHJvdysrKSB7CisgICAgICBpbnQgZGVzdF9jb2wgPSAoYlhGbGlwID8gZGVzdF9jbGlwLnJpZ2h0IC0gKHJvdyAtIHJvd19zdGFydCkgLSAxIDogcm93KSAtCisgICAgICAgICAgICAgICAgICAgICBkZXN0X2NsaXAubGVmdDsKKyAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgZGVzdF9jb2wgKiBuQnl0ZXM7CisgICAgICBpZiAoYllGbGlwKSB7CisgICAgICAgIGRlc3Rfc2NhbiArPSAocmVzdWx0X2hlaWdodCAtIDEpICogZGVzdF9waXRjaDsKKyAgICAgIH0KKyAgICAgIGlmIChuQnl0ZXMgPT0gNCkgeworICAgICAgICBGWF9EV09SRCogc3JjX3NjYW4gPSAoRlhfRFdPUkQqKUdldFNjYW5saW5lKHJvdykgKyBjb2xfc3RhcnQ7CisgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9zdGVwOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IEdldFNjYW5saW5lKHJvdykgKyBjb2xfc3RhcnQgKiBuQnl0ZXM7CisgICAgICAgIGlmIChuQnl0ZXMgPT0gMSkgeworICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X3N0ZXA7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gKnNyY19zY2FuKys7CisgICAgICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9zdGVwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiAobV9wQWxwaGFNYXNrKSB7CisgICAgZGVzdF9waXRjaCA9IHBUcmFuc0JpdG1hcC0+bV9wQWxwaGFNYXNrLT5HZXRQaXRjaCgpOworICAgIGRlc3RfYnVmID0gcFRyYW5zQml0bWFwLT5tX3BBbHBoYU1hc2stPkdldEJ1ZmZlcigpOworICAgIGludCBkZXN0X3N0ZXAgPSBiWUZsaXAgPyAtZGVzdF9waXRjaCA6IGRlc3RfcGl0Y2g7CisgICAgZm9yIChpbnQgcm93ID0gcm93X3N0YXJ0OyByb3cgPCByb3dfZW5kOyByb3crKykgeworICAgICAgaW50IGRlc3RfY29sID0gKGJYRmxpcCA/IGRlc3RfY2xpcC5yaWdodCAtIChyb3cgLSByb3dfc3RhcnQpIC0gMSA6IHJvdykgLQorICAgICAgICAgICAgICAgICAgICAgZGVzdF9jbGlwLmxlZnQ7CisgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIGRlc3RfY29sOworICAgICAgaWYgKGJZRmxpcCkgeworICAgICAgICBkZXN0X3NjYW4gKz0gKHJlc3VsdF9oZWlnaHQgLSAxKSAqIGRlc3RfcGl0Y2g7CisgICAgICB9CisgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IG1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUocm93KSArIGNvbF9zdGFydDsKKyAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgICAgKmRlc3Rfc2NhbiA9ICpzcmNfc2NhbisrOworICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9zdGVwOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gcFRyYW5zQml0bWFwOwogfQogI2RlZmluZSBGSVgxNl8wMDUgMC4wNWYKLUZYX1JFQ1QgX0ZYRElCX1N3YXBDbGlwQm94KEZYX1JFQ1QmIGNsaXAsIGludCB3aWR0aCwgaW50IGhlaWdodCwgRlhfQk9PTCBiRmxpcFgsIEZYX0JPT0wgYkZsaXBZKQotewotICAgIEZYX1JFQ1QgcmVjdDsKLSAgICBpZiAoYkZsaXBZKSB7Ci0gICAgICAgIHJlY3QubGVmdCA9IGhlaWdodCAtIGNsaXAudG9wOwotICAgICAgICByZWN0LnJpZ2h0ID0gaGVpZ2h0IC0gY2xpcC5ib3R0b207Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVjdC5sZWZ0ID0gY2xpcC50b3A7Ci0gICAgICAgIHJlY3QucmlnaHQgPSBjbGlwLmJvdHRvbTsKLSAgICB9Ci0gICAgaWYgKGJGbGlwWCkgewotICAgICAgICByZWN0LnRvcCA9IHdpZHRoIC0gY2xpcC5sZWZ0OwotICAgICAgICByZWN0LmJvdHRvbSA9IHdpZHRoIC0gY2xpcC5yaWdodDsKLSAgICB9IGVsc2UgewotICAgICAgICByZWN0LnRvcCA9IGNsaXAubGVmdDsKLSAgICAgICAgcmVjdC5ib3R0b20gPSBjbGlwLnJpZ2h0OwotICAgIH0KLSAgICByZWN0Lk5vcm1hbGl6ZSgpOwotICAgIHJldHVybiByZWN0OworRlhfUkVDVCBGWERJQl9Td2FwQ2xpcEJveChGWF9SRUNUJiBjbGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZsaXBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGbGlwWSkgeworICBGWF9SRUNUIHJlY3Q7CisgIGlmIChiRmxpcFkpIHsKKyAgICByZWN0LmxlZnQgPSBoZWlnaHQgLSBjbGlwLnRvcDsKKyAgICByZWN0LnJpZ2h0ID0gaGVpZ2h0IC0gY2xpcC5ib3R0b207CisgIH0gZWxzZSB7CisgICAgcmVjdC5sZWZ0ID0gY2xpcC50b3A7CisgICAgcmVjdC5yaWdodCA9IGNsaXAuYm90dG9tOworICB9CisgIGlmIChiRmxpcFgpIHsKKyAgICByZWN0LnRvcCA9IHdpZHRoIC0gY2xpcC5sZWZ0OworICAgIHJlY3QuYm90dG9tID0gd2lkdGggLSBjbGlwLnJpZ2h0OworICB9IGVsc2UgeworICAgIHJlY3QudG9wID0gY2xpcC5sZWZ0OworICAgIHJlY3QuYm90dG9tID0gY2xpcC5yaWdodDsKKyAgfQorICByZWN0Lk5vcm1hbGl6ZSgpOworICByZXR1cm4gcmVjdDsKIH0KLUNGWF9ESUJpdG1hcCogQ0ZYX0RJQlNvdXJjZTo6VHJhbnNmb3JtVG8oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcERlc3RNYXRyaXgsIGludCYgcmVzdWx0X2xlZnQsIGludCYgcmVzdWx0X3RvcCwKLSAgICAgICAgRlhfRFdPUkQgZmxhZ3MsIGNvbnN0IEZYX1JFQ1QqIHBEZXN0Q2xpcCkgY29uc3QKLXsKLSAgICBDRlhfSW1hZ2VUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcjsKLSAgICB0cmFuc2Zvcm1lci5TdGFydCh0aGlzLCBwRGVzdE1hdHJpeCwgZmxhZ3MsIHBEZXN0Q2xpcCk7Ci0gICAgdHJhbnNmb3JtZXIuQ29udGludWUoTlVMTCk7Ci0gICAgcmVzdWx0X2xlZnQgPSB0cmFuc2Zvcm1lci5tX1Jlc3VsdExlZnQ7Ci0gICAgcmVzdWx0X3RvcCA9IHRyYW5zZm9ybWVyLm1fUmVzdWx0VG9wOwotICAgIENGWF9ESUJpdG1hcCogcFRyYW5zZm9ybWVkID0gdHJhbnNmb3JtZXIubV9TdG9yZXIuRGV0YWNoKCk7Ci0gICAgcmV0dXJuIHBUcmFuc2Zvcm1lZDsKK0NGWF9ESUJpdG1hcCogQ0ZYX0RJQlNvdXJjZTo6VHJhbnNmb3JtVG8oY29uc3QgQ0ZYX01hdHJpeCogcERlc3RNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgcmVzdWx0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgcmVzdWx0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBEZXN0Q2xpcCkgY29uc3QgeworICBDRlhfSW1hZ2VUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcjsKKyAgdHJhbnNmb3JtZXIuU3RhcnQodGhpcywgcERlc3RNYXRyaXgsIGZsYWdzLCBwRGVzdENsaXApOworICB0cmFuc2Zvcm1lci5Db250aW51ZShOVUxMKTsKKyAgcmVzdWx0X2xlZnQgPSB0cmFuc2Zvcm1lci5tX1Jlc3VsdExlZnQ7CisgIHJlc3VsdF90b3AgPSB0cmFuc2Zvcm1lci5tX1Jlc3VsdFRvcDsKKyAgQ0ZYX0RJQml0bWFwKiBwVHJhbnNmb3JtZWQgPSB0cmFuc2Zvcm1lci5tX1N0b3Jlci5EZXRhY2goKTsKKyAgcmV0dXJuIHBUcmFuc2Zvcm1lZDsKIH0KLUNGWF9ESUJpdG1hcCogQ0ZYX0RJQlNvdXJjZTo6U3RyZXRjaFRvKGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIEZYX0RXT1JEIGZsYWdzLCBjb25zdCBGWF9SRUNUKiBwQ2xpcCkgY29uc3QKLXsKLSAgICBGWF9SRUNUIGNsaXBfcmVjdCgwLCAwLCBGWFNZU19hYnMoZGVzdF93aWR0aCksIEZYU1lTX2FicyhkZXN0X2hlaWdodCkpOwotICAgIGlmIChwQ2xpcCkgewotICAgICAgICBjbGlwX3JlY3QuSW50ZXJzZWN0KCpwQ2xpcCk7Ci0gICAgfQotICAgIGlmIChjbGlwX3JlY3QuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoZGVzdF93aWR0aCA9PSBtX1dpZHRoICYmIGRlc3RfaGVpZ2h0ID09IG1fSGVpZ2h0KSB7Ci0gICAgICAgIHJldHVybiBDbG9uZSgmY2xpcF9yZWN0KTsKLSAgICB9Ci0gICAgQ0ZYX0ltYWdlU3RyZXRjaGVyIHN0cmV0Y2hlcjsKLSAgICBDRlhfQml0bWFwU3RvcmVyIHN0b3JlcjsKLSAgICBpZiAoc3RyZXRjaGVyLlN0YXJ0KCZzdG9yZXIsIHRoaXMsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBjbGlwX3JlY3QsIGZsYWdzKSkgewotICAgICAgICBzdHJldGNoZXIuQ29udGludWUoTlVMTCk7Ci0gICAgfQotICAgIHJldHVybiBzdG9yZXIuRGV0YWNoKCk7CitDRlhfRElCaXRtYXAqIENGWF9ESUJTb3VyY2U6OlN0cmV0Y2hUbyhpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcENsaXApIGNvbnN0IHsKKyAgRlhfUkVDVCBjbGlwX3JlY3QoMCwgMCwgRlhTWVNfYWJzKGRlc3Rfd2lkdGgpLCBGWFNZU19hYnMoZGVzdF9oZWlnaHQpKTsKKyAgaWYgKHBDbGlwKSB7CisgICAgY2xpcF9yZWN0LkludGVyc2VjdCgqcENsaXApOworICB9CisgIGlmIChjbGlwX3JlY3QuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKGRlc3Rfd2lkdGggPT0gbV9XaWR0aCAmJiBkZXN0X2hlaWdodCA9PSBtX0hlaWdodCkgeworICAgIHJldHVybiBDbG9uZSgmY2xpcF9yZWN0KTsKKyAgfQorICBDRlhfSW1hZ2VTdHJldGNoZXIgc3RyZXRjaGVyOworICBDRlhfQml0bWFwU3RvcmVyIHN0b3JlcjsKKyAgaWYgKHN0cmV0Y2hlci5TdGFydCgmc3RvcmVyLCB0aGlzLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgY2xpcF9yZWN0LAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKSkgeworICAgIHN0cmV0Y2hlci5Db250aW51ZShOVUxMKTsKKyAgfQorICByZXR1cm4gc3RvcmVyLkRldGFjaCgpOwogfQotQ0ZYX0ltYWdlVHJhbnNmb3JtZXI6OkNGWF9JbWFnZVRyYW5zZm9ybWVyKCkKLXsKLSAgICBtX1N0YXR1cyA9IDA7Ci0gICAgbV9wTWF0cml4ID0gTlVMTDsKK0NGWF9JbWFnZVRyYW5zZm9ybWVyOjpDRlhfSW1hZ2VUcmFuc2Zvcm1lcigpIHsKKyAgbV9TdGF0dXMgPSAwOworICBtX3BNYXRyaXggPSBOVUxMOwogfQotQ0ZYX0ltYWdlVHJhbnNmb3JtZXI6On5DRlhfSW1hZ2VUcmFuc2Zvcm1lcigpCi17Ci19Ci1GWF9CT09MIENGWF9JbWFnZVRyYW5zZm9ybWVyOjpTdGFydChjb25zdCBDRlhfRElCU291cmNlKiBwU3JjLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwRGVzdE1hdHJpeCwgaW50IGZsYWdzLCBjb25zdCBGWF9SRUNUKiBwRGVzdENsaXApCi17Ci0gICAgbV9wTWF0cml4ID0gKENGWF9BZmZpbmVNYXRyaXgqKXBEZXN0TWF0cml4OwotICAgIENGWF9GbG9hdFJlY3QgdW5pdF9yZWN0ID0gcERlc3RNYXRyaXgtPkdldFVuaXRSZWN0KCk7Ci0gICAgRlhfUkVDVCByZXN1bHRfcmVjdCA9IHVuaXRfcmVjdC5HZXRDbG9zZXN0UmVjdCgpOwotICAgIEZYX1JFQ1QgcmVzdWx0X2NsaXAgPSByZXN1bHRfcmVjdDsKLSAgICBpZiAocERlc3RDbGlwKSB7Ci0gICAgICAgIHJlc3VsdF9jbGlwLkludGVyc2VjdCgqcERlc3RDbGlwKTsKLSAgICB9Ci0gICAgaWYgKHJlc3VsdF9jbGlwLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG1fUmVzdWx0TGVmdCA9IHJlc3VsdF9jbGlwLmxlZnQ7Ci0gICAgbV9SZXN1bHRUb3AgPSByZXN1bHRfY2xpcC50b3A7Ci0gICAgbV9SZXN1bHRXaWR0aCA9IHJlc3VsdF9jbGlwLldpZHRoKCk7Ci0gICAgbV9SZXN1bHRIZWlnaHQgPSByZXN1bHRfY2xpcC5IZWlnaHQoKTsKLSAgICBtX0ZsYWdzID0gZmxhZ3M7Ci0gICAgaWYgKEZYU1lTX2ZhYnMocERlc3RNYXRyaXgtPmEpIDwgRlhTWVNfZmFicyhwRGVzdE1hdHJpeC0+YikgLyAyMCAmJgotICAgICAgICAgICAgRlhTWVNfZmFicyhwRGVzdE1hdHJpeC0+ZCkgPCBGWFNZU19mYWJzKHBEZXN0TWF0cml4LT5jKSAvIDIwICYmCi0gICAgICAgICAgICBGWFNZU19mYWJzKHBEZXN0TWF0cml4LT5hKSA8IDAuNWYgJiYgRlhTWVNfZmFicyhwRGVzdE1hdHJpeC0+ZCkgPCAwLjVmKSB7Ci0gICAgICAgIGludCBkZXN0X3dpZHRoID0gcmVzdWx0X3JlY3QuV2lkdGgoKTsKLSAgICAgICAgaW50IGRlc3RfaGVpZ2h0ID0gcmVzdWx0X3JlY3QuSGVpZ2h0KCk7Ci0gICAgICAgIHJlc3VsdF9jbGlwLk9mZnNldCgtcmVzdWx0X3JlY3QubGVmdCwgLXJlc3VsdF9yZWN0LnRvcCk7Ci0gICAgICAgIHJlc3VsdF9jbGlwID0gX0ZYRElCX1N3YXBDbGlwQm94KHJlc3VsdF9jbGlwLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgcERlc3RNYXRyaXgtPmMgPiAwLCBwRGVzdE1hdHJpeC0+YiA8IDApOwotICAgICAgICBtX1N0cmV0Y2hlci5TdGFydCgmbV9TdG9yZXIsIHBTcmMsIGRlc3RfaGVpZ2h0LCBkZXN0X3dpZHRoLCByZXN1bHRfY2xpcCwgZmxhZ3MpOwotICAgICAgICBtX1N0YXR1cyA9IDE7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAoRlhTWVNfZmFicyhwRGVzdE1hdHJpeC0+YikgPCBGSVgxNl8wMDUgJiYgRlhTWVNfZmFicyhwRGVzdE1hdHJpeC0+YykgPCBGSVgxNl8wMDUpIHsKLSAgICAgICAgaW50IGRlc3Rfd2lkdGggPSBwRGVzdE1hdHJpeC0+YSA+IDAgPyAoaW50KUZYU1lTX2NlaWwocERlc3RNYXRyaXgtPmEpIDogKGludClGWFNZU19mbG9vcihwRGVzdE1hdHJpeC0+YSk7Ci0gICAgICAgIGludCBkZXN0X2hlaWdodCA9IHBEZXN0TWF0cml4LT5kID4gMCA/IChpbnQpIC0gRlhTWVNfY2VpbChwRGVzdE1hdHJpeC0+ZCkgOiAoaW50KSAtIEZYU1lTX2Zsb29yKHBEZXN0TWF0cml4LT5kKTsKLSAgICAgICAgcmVzdWx0X2NsaXAuT2Zmc2V0KC1yZXN1bHRfcmVjdC5sZWZ0LCAtcmVzdWx0X3JlY3QudG9wKTsKLSAgICAgICAgbV9TdHJldGNoZXIuU3RhcnQoJm1fU3RvcmVyLCBwU3JjLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgcmVzdWx0X2NsaXAsIGZsYWdzKTsKLSAgICAgICAgbV9TdGF0dXMgPSAyOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaW50IHN0cmV0Y2hfd2lkdGggPSAoaW50KUZYU1lTX2NlaWwoRlhTWVNfc3FydDIocERlc3RNYXRyaXgtPmEsIHBEZXN0TWF0cml4LT5iKSk7Ci0gICAgaW50IHN0cmV0Y2hfaGVpZ2h0ID0gKGludClGWFNZU19jZWlsKEZYU1lTX3NxcnQyKHBEZXN0TWF0cml4LT5jLCBwRGVzdE1hdHJpeC0+ZCkpOwotICAgIENGWF9BZmZpbmVNYXRyaXggc3RyZXRjaDJkZXN0KDEuMGYsIDAuMGYsIDAuMGYsIC0xLjBmLCAwLjBmLCAoRlhfRkxPQVQpKHN0cmV0Y2hfaGVpZ2h0KSk7Ci0gICAgc3RyZXRjaDJkZXN0LkNvbmNhdChwRGVzdE1hdHJpeC0+YSAvIHN0cmV0Y2hfd2lkdGgsIHBEZXN0TWF0cml4LT5iIC8gc3RyZXRjaF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0TWF0cml4LT5jIC8gc3RyZXRjaF9oZWlnaHQsIHBEZXN0TWF0cml4LT5kIC8gc3RyZXRjaF9oZWlnaHQsIHBEZXN0TWF0cml4LT5lLCBwRGVzdE1hdHJpeC0+Zik7Ci0gICAgbV9kZXN0MnN0cmV0Y2guU2V0UmV2ZXJzZShzdHJldGNoMmRlc3QpOwotICAgIENGWF9GbG9hdFJlY3QgY2xpcF9yZWN0X2YocmVzdWx0X2NsaXApOwotICAgIGNsaXBfcmVjdF9mLlRyYW5zZm9ybSgmbV9kZXN0MnN0cmV0Y2gpOwotICAgIG1fU3RyZXRjaENsaXAgPSBjbGlwX3JlY3RfZi5HZXRPdXR0ZXJSZWN0KCk7Ci0gICAgbV9TdHJldGNoQ2xpcC5JbnRlcnNlY3QoMCwgMCwgc3RyZXRjaF93aWR0aCwgc3RyZXRjaF9oZWlnaHQpOwotICAgIG1fU3RyZXRjaGVyLlN0YXJ0KCZtX1N0b3JlciwgcFNyYywgc3RyZXRjaF93aWR0aCwgc3RyZXRjaF9oZWlnaHQsIG1fU3RyZXRjaENsaXAsIGZsYWdzKTsKLSAgICBtX1N0YXR1cyA9IDM7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CWVRFIF9iaWxpbmVhcl9pbnRlcnBvbChGWF9MUENCWVRFIGJ1ZiwgaW50IHJvd19vZmZzZXRfbCwgaW50IHJvd19vZmZzZXRfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfY29sX2wsIGludCBzcmNfY29sX3IsIGludCByZXNfeCwgaW50IHJlc195LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJwcCwgaW50IGNfb2Zmc2V0KQotewotICAgIGludCBpX3Jlc3ggPSAyNTUgLSByZXNfeDsKLSAgICBpbnQgY29sX2JwcF9sID0gc3JjX2NvbF9sICogYnBwOwotICAgIGludCBjb2xfYnBwX3IgPSBzcmNfY29sX3IgKiBicHA7Ci0gICAgRlhfTFBDQllURSBidWZfdSA9IGJ1ZiArIHJvd19vZmZzZXRfbCArIGNfb2Zmc2V0OwotICAgIEZYX0xQQ0JZVEUgYnVmX2QgPSBidWYgKyByb3dfb2Zmc2V0X3IgKyBjX29mZnNldDsKLSAgICBGWF9MUENCWVRFIHNyY19wb3MwID0gYnVmX3UgKyBjb2xfYnBwX2w7Ci0gICAgRlhfTFBDQllURSBzcmNfcG9zMSA9IGJ1Zl91ICsgY29sX2JwcF9yOwotICAgIEZYX0xQQ0JZVEUgc3JjX3BvczIgPSBidWZfZCArIGNvbF9icHBfbDsKLSAgICBGWF9MUENCWVRFIHNyY19wb3MzID0gYnVmX2QgKyBjb2xfYnBwX3I7Ci0gICAgRlhfQllURSByX3Bvc18wID0gKCpzcmNfcG9zMCAqIGlfcmVzeCArICpzcmNfcG9zMSAqIHJlc194KSA+PiA4OwotICAgIEZYX0JZVEUgcl9wb3NfMSA9ICgqc3JjX3BvczIgKiBpX3Jlc3ggKyAqc3JjX3BvczMgKiByZXNfeCkgPj4gODsKLSAgICByZXR1cm4gKHJfcG9zXzAgKiAoMjU1IC0gcmVzX3kpICsgcl9wb3NfMSAqIHJlc195KSA+PiA4OwotfQotRlhfQllURSBfYmljdWJpY19pbnRlcnBvbChGWF9MUENCWVRFIGJ1ZiwgaW50IHBpdGNoLCBpbnQgcG9zX3BpeGVsW10sIGludCB1X3dbXSwgaW50IHZfd1tdLCBpbnQgcmVzX3gsIGludCByZXNfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJwcCwgaW50IGNfb2Zmc2V0KQotewotICAgIGludCBzX3Jlc3VsdCA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpICsrKSB7Ci0gICAgICAgIGludCBhX3Jlc3VsdCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgaiArKykgewotICAgICAgICAgICAgYV9yZXN1bHQgKz0gdV93W2pdICogKCooRlhfQllURSopKGJ1ZiArIHBvc19waXhlbFtpICsgNF0gKiBwaXRjaCArIHBvc19waXhlbFtqXSAqIGJwcCArIGNfb2Zmc2V0KSk7Ci0gICAgICAgIH0KLSAgICAgICAgc19yZXN1bHQgKz0gYV9yZXN1bHQgKiB2X3dbaV07Ci0gICAgfQotICAgIHNfcmVzdWx0ID4+PSAxNjsKLSAgICByZXR1cm4gKEZYX0JZVEUpKHNfcmVzdWx0IDwgMCA/IDAgOiBzX3Jlc3VsdCA+IDI1NSA/IDI1NSA6IHNfcmVzdWx0KTsKLX0KLXZvaWQgX2JpY3ViaWNfZ2V0X3Bvc193ZWlnaHQoaW50IHBvc19waXhlbFtdLCBpbnQgdV93W10sIGludCB2X3dbXSwgaW50IHNyY19jb2xfbCwgaW50IHNyY19yb3dfbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc194LCBpbnQgcmVzX3ksIGludCBzdHJldGNoX3dpZHRoLCBpbnQgc3RyZXRjaF9oZWlnaHQpCi17Ci0gICAgcG9zX3BpeGVsWzBdID0gc3JjX2NvbF9sIC0gMTsKLSAgICBwb3NfcGl4ZWxbMV0gPSBzcmNfY29sX2w7Ci0gICAgcG9zX3BpeGVsWzJdID0gc3JjX2NvbF9sICsgMTsKLSAgICBwb3NfcGl4ZWxbM10gPSBzcmNfY29sX2wgKyAyOwotICAgIHBvc19waXhlbFs0XSA9IHNyY19yb3dfbCAtIDE7Ci0gICAgcG9zX3BpeGVsWzVdID0gc3JjX3Jvd19sOwotICAgIHBvc19waXhlbFs2XSA9IHNyY19yb3dfbCArIDE7Ci0gICAgcG9zX3BpeGVsWzddID0gc3JjX3Jvd19sICsgMjsKLSAgICBmb3IgKGludCBpID0gMCA7IGkgPCA0OyBpICsrKSB7Ci0gICAgICAgIGlmIChwb3NfcGl4ZWxbaV0gPCAwKSB7Ci0gICAgICAgICAgICBwb3NfcGl4ZWxbaV0gPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwb3NfcGl4ZWxbaV0gPj0gc3RyZXRjaF93aWR0aCkgewotICAgICAgICAgICAgcG9zX3BpeGVsW2ldID0gc3RyZXRjaF93aWR0aCAtIDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBvc19waXhlbFtpICsgNF0gPCAwKSB7Ci0gICAgICAgICAgICBwb3NfcGl4ZWxbaSArIDRdID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAocG9zX3BpeGVsW2kgKyA0XSA+PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgcG9zX3BpeGVsW2kgKyA0XSA9IHN0cmV0Y2hfaGVpZ2h0IC0gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICB1X3dbMF0gPSBTRFBfVGFibGVbMjU2ICsgcmVzX3hdOwotICAgIHVfd1sxXSA9IFNEUF9UYWJsZVtyZXNfeF07Ci0gICAgdV93WzJdID0gU0RQX1RhYmxlWzI1NiAtIHJlc194XTsKLSAgICB1X3dbM10gPSBTRFBfVGFibGVbNTEyIC0gcmVzX3hdOwotICAgIHZfd1swXSA9IFNEUF9UYWJsZVsyNTYgKyByZXNfeV07Ci0gICAgdl93WzFdID0gU0RQX1RhYmxlW3Jlc195XTsKLSAgICB2X3dbMl0gPSBTRFBfVGFibGVbMjU2IC0gcmVzX3ldOwotICAgIHZfd1szXSA9IFNEUF9UYWJsZVs1MTIgLSByZXNfeV07Ci19Ci1GWERJQl9Gb3JtYXQgX0dldFRyYW5zZm9ybWVkRm9ybWF0KGNvbnN0IENGWF9ESUJTb3VyY2UqIHBEcmMpCi17Ci0gICAgRlhESUJfRm9ybWF0IGZvcm1hdCA9IHBEcmMtPkdldEZvcm1hdCgpOwotICAgIGlmIChwRHJjLT5Jc0FscGhhTWFzaygpKSB7Ci0gICAgICAgIGZvcm1hdCA9IEZYRElCXzhicHBNYXNrOwotICAgIH0gZWxzZSBpZiAoZm9ybWF0ID49IDEwMjUpIHsKLSAgICAgICAgZm9ybWF0ID0gRlhESUJfQ215a2E7Ci0gICAgfSBlbHNlIGlmIChmb3JtYXQgPD0gMzIgfHwgZm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgZm9ybWF0ID0gRlhESUJfQXJnYjsKLSAgICB9IGVsc2UgewotICAgICAgICBmb3JtYXQgPSBGWERJQl9SZ2JhOwotICAgIH0KLSAgICByZXR1cm4gZm9ybWF0OwotfQotRlhfQk9PTCBDRlhfSW1hZ2VUcmFuc2Zvcm1lcjo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgaWYgKG1fU3RhdHVzID09IDEpIHsKLSAgICAgICAgaWYgKG1fU3RyZXRjaGVyLkNvbnRpbnVlKHBQYXVzZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX1N0b3Jlci5HZXRCaXRtYXAoKSkgewotICAgICAgICAgICAgbV9TdG9yZXIuUmVwbGFjZShtX1N0b3Jlci5HZXRCaXRtYXAoKS0+U3dhcFhZKG1fcE1hdHJpeC0+YyA+IDAsIG1fcE1hdHJpeC0+YiA8IDApKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfSBlbHNlIGlmIChtX1N0YXR1cyA9PSAyKSB7Ci0gICAgICAgIHJldHVybiBtX1N0cmV0Y2hlci5Db250aW51ZShwUGF1c2UpOwotICAgIH0gZWxzZSBpZiAobV9TdGF0dXMgIT0gMykgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX1N0cmV0Y2hlci5Db250aW51ZShwUGF1c2UpKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpbnQgc3RyZXRjaF93aWR0aCA9IG1fU3RyZXRjaENsaXAuV2lkdGgoKTsKLSAgICBpbnQgc3RyZXRjaF9oZWlnaHQgPSBtX1N0cmV0Y2hDbGlwLkhlaWdodCgpOwotICAgIGlmIChtX1N0b3Jlci5HZXRCaXRtYXAoKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfTFBDQllURSBzdHJldGNoX2J1ZiA9IG1fU3RvcmVyLkdldEJpdG1hcCgpLT5HZXRCdWZmZXIoKTsKLSAgICBGWF9MUENCWVRFIHN0cmV0Y2hfYnVmX21hc2sgPSBOVUxMOwotICAgIGlmIChtX1N0b3Jlci5HZXRCaXRtYXAoKS0+bV9wQWxwaGFNYXNrKSB7Ci0gICAgICAgIHN0cmV0Y2hfYnVmX21hc2sgPSBtX1N0b3Jlci5HZXRCaXRtYXAoKS0+bV9wQWxwaGFNYXNrLT5HZXRCdWZmZXIoKTsKLSAgICB9Ci0gICAgaW50IHN0cmV0Y2hfcGl0Y2ggPSBtX1N0b3Jlci5HZXRCaXRtYXAoKS0+R2V0UGl0Y2goKTsKLSAgICBDRlhfRElCaXRtYXAqIHBUcmFuc2Zvcm1lZCA9IG5ldyBDRlhfRElCaXRtYXA7Ci0gICAgRlhESUJfRm9ybWF0IHRyYW5zZm9ybUYgPSBfR2V0VHJhbnNmb3JtZWRGb3JtYXQobV9TdHJldGNoZXIubV9wU291cmNlKTsKLSAgICBpZiAoIXBUcmFuc2Zvcm1lZC0+Q3JlYXRlKG1fUmVzdWx0V2lkdGgsIG1fUmVzdWx0SGVpZ2h0LCB0cmFuc2Zvcm1GKSkgewotICAgICAgICBkZWxldGUgcFRyYW5zZm9ybWVkOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHBUcmFuc2Zvcm1lZC0+Q2xlYXIoMCk7Ci0gICAgaWYgKHBUcmFuc2Zvcm1lZC0+bV9wQWxwaGFNYXNrKSB7Ci0gICAgICAgIHBUcmFuc2Zvcm1lZC0+bV9wQWxwaGFNYXNrLT5DbGVhcigwKTsKLSAgICB9Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCByZXN1bHQyc3RyZXRjaCgxLjBmLCAwLjBmLCAwLjBmLCAxLjBmLCAoRlhfRkxPQVQpKG1fUmVzdWx0TGVmdCksIChGWF9GTE9BVCkobV9SZXN1bHRUb3ApKTsKLSAgICByZXN1bHQyc3RyZXRjaC5Db25jYXQobV9kZXN0MnN0cmV0Y2gpOwotICAgIHJlc3VsdDJzdHJldGNoLlRyYW5zbGF0ZUkoLW1fU3RyZXRjaENsaXAubGVmdCwgLW1fU3RyZXRjaENsaXAudG9wKTsKLSAgICBpZiAoc3RyZXRjaF9idWZfbWFzayA9PSBOVUxMICYmIHBUcmFuc2Zvcm1lZC0+bV9wQWxwaGFNYXNrKSB7Ci0gICAgICAgIHBUcmFuc2Zvcm1lZC0+bV9wQWxwaGFNYXNrLT5DbGVhcigweGZmMDAwMDAwKTsKLSAgICB9IGVsc2UgaWYgKHBUcmFuc2Zvcm1lZC0+bV9wQWxwaGFNYXNrKSB7Ci0gICAgICAgIGludCBzdHJldGNoX3BpdGNoX21hc2sgPSBtX1N0b3Jlci5HZXRCaXRtYXAoKS0+bV9wQWxwaGFNYXNrLT5HZXRQaXRjaCgpOwotICAgICAgICBpZiAoIShtX0ZsYWdzICYgRlhESUJfRE9XTlNBTVBMRSkgJiYgIShtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkpIHsKLSAgICAgICAgICAgIENGWF9CaWxpbmVhck1hdHJpeCByZXN1bHQyc3RyZXRjaF9maXgocmVzdWx0MnN0cmV0Y2gsIDgpOwotICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9SZXN1bHRIZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgIEZYX0JZVEUqIGRlc3RfcG9zX21hc2sgPSAoRlhfQllURSopcFRyYW5zZm9ybWVkLT5tX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9SZXN1bHRXaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzcmNfY29sX2wsIHNyY19yb3dfbCwgcmVzX3gsIHJlc195OwotICAgICAgICAgICAgICAgICAgICByZXN1bHQyc3RyZXRjaF9maXguVHJhbnNmb3JtKGNvbCwgcm93LCBzcmNfY29sX2wsIHNyY19yb3dfbCwgcmVzX3gsIHJlc195KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19jb2xfbCA+PSAwICYmIHNyY19jb2xfbCA8PSBzdHJldGNoX3dpZHRoICYmIHNyY19yb3dfbCA+PSAwICYmIHNyY19yb3dfbCA8PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19jb2xfbCA9PSBzdHJldGNoX3dpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2NvbF9sLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX3Jvd19sID09IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3Jvd19sLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2NvbF9yID0gc3JjX2NvbF9sICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfcm93X3IgPSBzcmNfcm93X2wgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19jb2xfciA9PSBzdHJldGNoX3dpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2NvbF9yLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX3Jvd19yID09IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3Jvd19yLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93X29mZnNldF9sID0gc3JjX3Jvd19sICogc3RyZXRjaF9waXRjaF9tYXNrOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd19vZmZzZXRfciA9IHNyY19yb3dfciAqIHN0cmV0Y2hfcGl0Y2hfbWFzazsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3Bvc19tYXNrID0gX2JpbGluZWFyX2ludGVycG9sKHN0cmV0Y2hfYnVmX21hc2ssIHJvd19vZmZzZXRfbCwgcm93X29mZnNldF9yLCBzcmNfY29sX2wsIHNyY19jb2xfciwgcmVzX3gsIHJlc195LCAxLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZXN0X3Bvc19tYXNrKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7Ci0gICAgICAgICAgICBDRlhfQmlsaW5lYXJNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKLSAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fUmVzdWx0SGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgICAgICBGWF9CWVRFKiBkZXN0X3Bvc19tYXNrID0gKEZYX0JZVEUqKXBUcmFuc2Zvcm1lZC0+bV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShyb3cpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fUmVzdWx0V2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0MnN0cmV0Y2hfZml4LlRyYW5zZm9ybShjb2wsIHJvdywgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPj0gMCAmJiBzcmNfY29sX2wgPD0gc3RyZXRjaF93aWR0aCAmJiBzcmNfcm93X2wgPj0gMCAmJiBzcmNfcm93X2wgPD0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NfcGl4ZWxbOF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgdV93WzRdLCB2X3dbNF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2NvbF9sID09IHN0cmV0Y2hfd2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfY29sX2wtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfcm93X2wgPT0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcm93X2wtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIF9iaWN1YmljX2dldF9wb3Nfd2VpZ2h0KHBvc19waXhlbCwgdV93LCB2X3csIHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwgcmVzX3ksIHN0cmV0Y2hfd2lkdGgsIHN0cmV0Y2hfaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3Bvc19tYXNrID0gX2JpY3ViaWNfaW50ZXJwb2woc3RyZXRjaF9idWZfbWFzaywgc3RyZXRjaF9waXRjaF9tYXNrLCBwb3NfcGl4ZWwsIHVfdywgdl93LCByZXNfeCwgcmVzX3ksIDEsIDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zX21hc2srKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDUERGX0ZpeGVkTWF0cml4IHJlc3VsdDJzdHJldGNoX2ZpeChyZXN1bHQyc3RyZXRjaCwgOCk7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX1Jlc3VsdEhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgRlhfQllURSogZGVzdF9wb3NfbWFzayA9IChGWF9CWVRFKilwVHJhbnNmb3JtZWQtPm1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1Jlc3VsdFdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNyY19jb2wsIHNyY19yb3c7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdDJzdHJldGNoX2ZpeC5UcmFuc2Zvcm0oY29sLCByb3csIHNyY19jb2wsIHNyY19yb3cpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2NvbCA+PSAwICYmIHNyY19jb2wgPD0gc3RyZXRjaF93aWR0aCAmJiBzcmNfcm93ID49IDAgJiYgc3JjX3JvdyA8PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19jb2wgPT0gc3RyZXRjaF93aWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb2wgLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX3JvdyA9PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19yb3cgLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9wb3NfbWFzayA9IHN0cmV0Y2hfYnVmX21hc2tbc3JjX3JvdyAqIHN0cmV0Y2hfcGl0Y2hfbWFzayArIHNyY19jb2xdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zX21hc2srKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fU3RvcmVyLkdldEJpdG1hcCgpLT5Jc0FscGhhTWFzaygpKSB7Ci0gICAgICAgIGlmICghKG1fRmxhZ3MgJiBGWERJQl9ET1dOU0FNUExFKSAmJiAhKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSkgewotICAgICAgICAgICAgQ0ZYX0JpbGluZWFyTWF0cml4IHJlc3VsdDJzdHJldGNoX2ZpeChyZXN1bHQyc3RyZXRjaCwgOCk7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX1Jlc3VsdEhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgRlhfTFBCWVRFIGRlc3Rfc2NhbiA9IChGWF9MUEJZVEUpcFRyYW5zZm9ybWVkLT5HZXRTY2FubGluZShyb3cpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fUmVzdWx0V2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0MnN0cmV0Y2hfZml4LlRyYW5zZm9ybShjb2wsIHJvdywgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPj0gMCAmJiBzcmNfY29sX2wgPD0gc3RyZXRjaF93aWR0aCAmJiBzcmNfcm93X2wgPj0gMCAmJiBzcmNfcm93X2wgPD0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPT0gc3RyZXRjaF93aWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb2xfbC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19yb3dfbCA9PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19yb3dfbC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19jb2xfciA9IHNyY19jb2xfbCArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3Jvd19yID0gc3JjX3Jvd19sICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfY29sX3IgPT0gc3RyZXRjaF93aWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb2xfci0tOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19yb3dfciA9PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19yb3dfci0tOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd19vZmZzZXRfbCA9IHNyY19yb3dfbCAqIHN0cmV0Y2hfcGl0Y2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93X29mZnNldF9yID0gc3JjX3Jvd19yICogc3RyZXRjaF9waXRjaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBfYmlsaW5lYXJfaW50ZXJwb2woc3RyZXRjaF9idWYsIHJvd19vZmZzZXRfbCwgcm93X29mZnNldF9yLCBzcmNfY29sX2wsIHNyY19jb2xfciwgcmVzX3gsIHJlc195LCAxLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7Ci0gICAgICAgICAgICBDRlhfQmlsaW5lYXJNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKLSAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fUmVzdWx0SGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgICAgICBGWF9MUEJZVEUgZGVzdF9zY2FuID0gKEZYX0xQQllURSlwVHJhbnNmb3JtZWQtPkdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9SZXN1bHRXaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzcmNfY29sX2wsIHNyY19yb3dfbCwgcmVzX3gsIHJlc195OwotICAgICAgICAgICAgICAgICAgICByZXN1bHQyc3RyZXRjaF9maXguVHJhbnNmb3JtKGNvbCwgcm93LCBzcmNfY29sX2wsIHNyY19yb3dfbCwgcmVzX3gsIHJlc195KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19jb2xfbCA+PSAwICYmIHNyY19jb2xfbCA8PSBzdHJldGNoX3dpZHRoICYmIHNyY19yb3dfbCA+PSAwICYmIHNyY19yb3dfbCA8PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvc19waXhlbFs4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB1X3dbNF0sIHZfd1s0XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPT0gc3RyZXRjaF93aWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb2xfbC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19yb3dfbCA9PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19yb3dfbC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgX2JpY3ViaWNfZ2V0X3Bvc193ZWlnaHQocG9zX3BpeGVsLCB1X3csIHZfdywgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeSwgc3RyZXRjaF93aWR0aCwgc3RyZXRjaF9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IF9iaWN1YmljX2ludGVycG9sKHN0cmV0Y2hfYnVmLCBzdHJldGNoX3BpdGNoLCBwb3NfcGl4ZWwsIHVfdywgdl93LCByZXNfeCwgcmVzX3ksIDEsIDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDUERGX0ZpeGVkTWF0cml4IHJlc3VsdDJzdHJldGNoX2ZpeChyZXN1bHQyc3RyZXRjaCwgOCk7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX1Jlc3VsdEhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgRlhfTFBCWVRFIGRlc3Rfc2NhbiA9IChGWF9MUEJZVEUpcFRyYW5zZm9ybWVkLT5HZXRTY2FubGluZShyb3cpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fUmVzdWx0V2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2NvbCwgc3JjX3JvdzsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0MnN0cmV0Y2hfZml4LlRyYW5zZm9ybShjb2wsIHJvdywgc3JjX2NvbCwgc3JjX3Jvdyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcmNfY29sID49IDAgJiYgc3JjX2NvbCA8PSBzdHJldGNoX3dpZHRoICYmIHNyY19yb3cgPj0gMCAmJiBzcmNfcm93IDw9IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2NvbCA9PSBzdHJldGNoX3dpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2NvbCAtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfcm93ID09IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3JvdyAtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQ0JZVEUgc3JjX3BpeGVsID0gc3RyZXRjaF9idWYgKyBzdHJldGNoX3BpdGNoICogc3JjX3JvdyArIHNyY19jb2w7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuID0gKnNyY19waXhlbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IEJwcCA9IG1fU3RvcmVyLkdldEJpdG1hcCgpLT5HZXRCUFAoKSAvIDg7Ci0gICAgICAgIGludCBkZXN0QnBwID0gcFRyYW5zZm9ybWVkLT5HZXRCUFAoKSAvIDg7Ci0gICAgICAgIGlmIChCcHAgPT0gMSkgewotICAgICAgICAgICAgRlhfRFdPUkQgYXJnYlsyNTZdOwotICAgICAgICAgICAgRlhfQVJHQiogcFBhbCA9IG1fU3RvcmVyLkdldEJpdG1hcCgpLT5HZXRQYWxldHRlKCk7Ci0gICAgICAgICAgICBpZiAocFBhbCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyZ2JbaV0gPSBwUGFsW2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fU3RvcmVyLkdldEJpdG1hcCgpLT5Jc0NteWtJbWFnZSgpKQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgYXJnYltpXSA9IDI1NSAtIGk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcmdiW2ldID0gMHhmZjAwMDAwMCB8IChpICogMHgwMTAxMDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIShtX0ZsYWdzICYgRlhESUJfRE9XTlNBTVBMRSkgJiYgIShtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkpIHsKLSAgICAgICAgICAgICAgICBDRlhfQmlsaW5lYXJNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX1Jlc3VsdEhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0JZVEUqIGRlc3RfcG9zID0gKEZYX0JZVEUqKXBUcmFuc2Zvcm1lZC0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9SZXN1bHRXaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDJzdHJldGNoX2ZpeC5UcmFuc2Zvcm0oY29sLCByb3csIHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwgcmVzX3kpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19jb2xfbCA+PSAwICYmIHNyY19jb2xfbCA8PSBzdHJldGNoX3dpZHRoICYmIHNyY19yb3dfbCA+PSAwICYmIHNyY19yb3dfbCA8PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPT0gc3RyZXRjaF93aWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfY29sX2wtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19yb3dfbCA9PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcm93X2wtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19jb2xfciA9IHNyY19jb2xfbCArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19yb3dfciA9IHNyY19yb3dfbCArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19jb2xfciA9PSBzdHJldGNoX3dpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb2xfci0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX3Jvd19yID09IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19yb3dfci0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93X29mZnNldF9sID0gc3JjX3Jvd19sICogc3RyZXRjaF9waXRjaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93X29mZnNldF9yID0gc3JjX3Jvd19yICogc3RyZXRjaF9waXRjaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCByX2JncmFfY215ayA9IGFyZ2JbX2JpbGluZWFyX2ludGVycG9sKHN0cmV0Y2hfYnVmLCByb3dfb2Zmc2V0X2wsIHJvd19vZmZzZXRfciwgc3JjX2NvbF9sLCBzcmNfY29sX3IsIHJlc194LCByZXNfeSwgMSwgMCldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1GID09IEZYRElCX1JnYmEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9wb3NbMF0gPSAoRlhfQllURSkocl9iZ3JhX2NteWsgPj4gMjQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3Bvc1sxXSA9IChGWF9CWVRFKShyX2JncmFfY215ayA+PiAxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zWzJdID0gKEZYX0JZVEUpKHJfYmdyYV9jbXlrID4+IDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3RfcG9zID0gcl9iZ3JhX2NteWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9wb3MgKz0gZGVzdEJwcDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKLSAgICAgICAgICAgICAgICBDRlhfQmlsaW5lYXJNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX1Jlc3VsdEhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0JZVEUqIGRlc3RfcG9zID0gKEZYX0JZVEUqKXBUcmFuc2Zvcm1lZC0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9SZXN1bHRXaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDJzdHJldGNoX2ZpeC5UcmFuc2Zvcm0oY29sLCByb3csIHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwgcmVzX3kpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19jb2xfbCA+PSAwICYmIHNyY19jb2xfbCA8PSBzdHJldGNoX3dpZHRoICYmIHNyY19yb3dfbCA+PSAwICYmIHNyY19yb3dfbCA8PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NfcGl4ZWxbOF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVfd1s0XSwgdl93WzRdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPT0gc3RyZXRjaF93aWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfY29sX2wtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19yb3dfbCA9PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcm93X2wtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JpY3ViaWNfZ2V0X3Bvc193ZWlnaHQocG9zX3BpeGVsLCB1X3csIHZfdywgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeSwgc3RyZXRjaF93aWR0aCwgc3RyZXRjaF9oZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHJfYmdyYV9jbXlrID0gYXJnYltfYmljdWJpY19pbnRlcnBvbChzdHJldGNoX2J1Ziwgc3RyZXRjaF9waXRjaCwgcG9zX3BpeGVsLCB1X3csIHZfdywgcmVzX3gsIHJlc195LCAxLCAwKV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybUYgPT0gRlhESUJfUmdiYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3Bvc1swXSA9IChGWF9CWVRFKShyX2JncmFfY215ayA+PiAyNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zWzFdID0gKEZYX0JZVEUpKHJfYmdyYV9jbXlrID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9wb3NbMl0gPSAoRlhfQllURSkocl9iZ3JhX2NteWsgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9wb3MgPSByX2JncmFfY215azsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3BvcyArPSBkZXN0QnBwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDUERGX0ZpeGVkTWF0cml4IHJlc3VsdDJzdHJldGNoX2ZpeChyZXN1bHQyc3RyZXRjaCwgOCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9SZXN1bHRIZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgICAgICBGWF9CWVRFKiBkZXN0X3BvcyA9IChGWF9CWVRFKilwVHJhbnNmb3JtZWQtPkdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fUmVzdWx0V2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19jb2wsIHNyY19yb3c7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQyc3RyZXRjaF9maXguVHJhbnNmb3JtKGNvbCwgcm93LCBzcmNfY29sLCBzcmNfcm93KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfY29sID49IDAgJiYgc3JjX2NvbCA8PSBzdHJldGNoX3dpZHRoICYmIHNyY19yb3cgPj0gMCAmJiBzcmNfcm93IDw9IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19jb2wgPT0gc3RyZXRjaF93aWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfY29sIC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX3JvdyA9PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcm93IC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCByX2JncmFfY215ayA9IGFyZ2Jbc3RyZXRjaF9idWZbc3JjX3JvdyAqIHN0cmV0Y2hfcGl0Y2ggKyBzcmNfY29sXV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybUYgPT0gRlhESUJfUmdiYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3Bvc1swXSA9IChGWF9CWVRFKShyX2JncmFfY215ayA+PiAyNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zWzFdID0gKEZYX0JZVEUpKHJfYmdyYV9jbXlrID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9wb3NbMl0gPSAoRlhfQllURSkocl9iZ3JhX2NteWsgPj4gOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9wb3MgPSByX2JncmFfY215azsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3BvcyArPSBkZXN0QnBwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRlhfQk9PTCBiSGFzQWxwaGEgPSBtX1N0b3Jlci5HZXRCaXRtYXAoKS0+SGFzQWxwaGEoKTsKLSAgICAgICAgICAgIGludCBkZXN0QnBwID0gcFRyYW5zZm9ybWVkLT5HZXRCUFAoKSAvIDg7Ci0gICAgICAgICAgICBpZiAoIShtX0ZsYWdzICYgRlhESUJfRE9XTlNBTVBMRSkgJiYgIShtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkpIHsKLSAgICAgICAgICAgICAgICBDRlhfQmlsaW5lYXJNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX1Jlc3VsdEhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0JZVEUqIGRlc3RfcG9zID0gKEZYX0JZVEUqKXBUcmFuc2Zvcm1lZC0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9SZXN1bHRXaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeSwgcl9wb3Nfa19yID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDJzdHJldGNoX2ZpeC5UcmFuc2Zvcm0oY29sLCByb3csIHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwgcmVzX3kpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19jb2xfbCA+PSAwICYmIHNyY19jb2xfbCA8PSBzdHJldGNoX3dpZHRoICYmIHNyY19yb3dfbCA+PSAwICYmIHNyY19yb3dfbCA8PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPT0gc3RyZXRjaF93aWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfY29sX2wtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19yb3dfbCA9PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcm93X2wtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19jb2xfciA9IHNyY19jb2xfbCArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19yb3dfciA9IHNyY19yb3dfbCArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19jb2xfciA9PSBzdHJldGNoX3dpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb2xfci0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX3Jvd19yID09IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19yb3dfci0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93X29mZnNldF9sID0gc3JjX3Jvd19sICogc3RyZXRjaF9waXRjaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93X29mZnNldF9yID0gc3JjX3Jvd19yICogc3RyZXRjaF9waXRjaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIHJfcG9zX3JlZF95X3IgICA9IF9iaWxpbmVhcl9pbnRlcnBvbChzdHJldGNoX2J1Ziwgcm93X29mZnNldF9sLCByb3dfb2Zmc2V0X3IsIHNyY19jb2xfbCwgc3JjX2NvbF9yLCByZXNfeCwgcmVzX3ksIEJwcCwgMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQllURSByX3Bvc19ncmVlbl9tX3IgPSBfYmlsaW5lYXJfaW50ZXJwb2woc3RyZXRjaF9idWYsIHJvd19vZmZzZXRfbCwgcm93X29mZnNldF9yLCBzcmNfY29sX2wsIHNyY19jb2xfciwgcmVzX3gsIHJlc195LCBCcHAsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgcl9wb3NfYmx1ZV9jX3IgID0gX2JpbGluZWFyX2ludGVycG9sKHN0cmV0Y2hfYnVmLCByb3dfb2Zmc2V0X2wsIHJvd19vZmZzZXRfciwgc3JjX2NvbF9sLCBzcmNfY29sX3IsIHJlc194LCByZXNfeSwgQnBwLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYkhhc0FscGhhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1GICE9IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1GID09IEZYRElCX1JnYmEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3Bvc1swXSA9IHJfcG9zX2JsdWVfY19yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zWzFdID0gcl9wb3NfZ3JlZW5fbV9yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zWzJdID0gcl9wb3NfcmVkX3lfcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9wb3Nfa19yID0gX2JpbGluZWFyX2ludGVycG9sKHN0cmV0Y2hfYnVmLCByb3dfb2Zmc2V0X2wsIHJvd19vZmZzZXRfciwgc3JjX2NvbF9sLCBzcmNfY29sX3IsIHJlc194LCByZXNfeSwgQnBwLCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3BvcyA9IEZYQ01ZS19UT0RJQihDbXlrRW5jb2RlKHJfcG9zX2JsdWVfY19yLCByX3Bvc19ncmVlbl9tX3IsIHJfcG9zX3JlZF95X3IsIHJfcG9zX2tfcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQllURSByX3Bvc19hX3IgPSBfYmlsaW5lYXJfaW50ZXJwb2woc3RyZXRjaF9idWYsIHJvd19vZmZzZXRfbCwgcm93X29mZnNldF9yLCBzcmNfY29sX2wsIHNyY19jb2xfciwgcmVzX3gsIHJlc195LCBCcHAsIDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9wb3MgPSBGWEFSR0JfVE9ESUIoRlhBUkdCX01BS0Uocl9wb3NfYV9yLCByX3Bvc19yZWRfeV9yLCByX3Bvc19ncmVlbl9tX3IsIHJfcG9zX2JsdWVfY19yKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByX3Bvc19rX3IgPSAweGZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtRiA9PSBGWERJQl9DbXlrYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9wb3Nfa19yID0gX2JpbGluZWFyX2ludGVycG9sKHN0cmV0Y2hfYnVmLCByb3dfb2Zmc2V0X2wsIHJvd19vZmZzZXRfciwgc3JjX2NvbF9sLCBzcmNfY29sX3IsIHJlc194LCByZXNfeSwgQnBwLCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3RfcG9zID0gRlhDTVlLX1RPRElCKENteWtFbmNvZGUocl9wb3NfYmx1ZV9jX3IsIHJfcG9zX2dyZWVuX21fciwgcl9wb3NfcmVkX3lfciwgcl9wb3Nfa19yKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3BvcyA9IEZYQVJHQl9UT0RJQihGWEFSR0JfTUFLRShyX3Bvc19rX3IsIHJfcG9zX3JlZF95X3IsIHJfcG9zX2dyZWVuX21fciwgcl9wb3NfYmx1ZV9jX3IpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zICs9IGRlc3RCcHA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7Ci0gICAgICAgICAgICAgICAgQ0ZYX0JpbGluZWFyTWF0cml4IHJlc3VsdDJzdHJldGNoX2ZpeChyZXN1bHQyc3RyZXRjaCwgOCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9SZXN1bHRIZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgICAgICBGWF9CWVRFKiBkZXN0X3BvcyA9IChGWF9CWVRFKilwVHJhbnNmb3JtZWQtPkdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fUmVzdWx0V2lkdGg7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwgcmVzX3ksIHJfcG9zX2tfciA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQyc3RyZXRjaF9maXguVHJhbnNmb3JtKGNvbCwgcm93LCBzcmNfY29sX2wsIHNyY19yb3dfbCwgcmVzX3gsIHJlc195KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPj0gMCAmJiBzcmNfY29sX2wgPD0gc3RyZXRjaF93aWR0aCAmJiBzcmNfcm93X2wgPj0gMCAmJiBzcmNfcm93X2wgPD0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zX3BpeGVsWzhdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1X3dbNF0sIHZfd1s0XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2NvbF9sID09IHN0cmV0Y2hfd2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2NvbF9sLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfcm93X2wgPT0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3Jvd19sLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iaWN1YmljX2dldF9wb3Nfd2VpZ2h0KHBvc19waXhlbCwgdV93LCB2X3csIHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwgcmVzX3ksIHN0cmV0Y2hfd2lkdGgsIHN0cmV0Y2hfaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIHJfcG9zX3JlZF95X3IgICA9IF9iaWN1YmljX2ludGVycG9sKHN0cmV0Y2hfYnVmLCBzdHJldGNoX3BpdGNoLCBwb3NfcGl4ZWwsIHVfdywgdl93LCByZXNfeCwgcmVzX3ksIEJwcCwgMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQllURSByX3Bvc19ncmVlbl9tX3IgPSBfYmljdWJpY19pbnRlcnBvbChzdHJldGNoX2J1Ziwgc3RyZXRjaF9waXRjaCwgcG9zX3BpeGVsLCB1X3csIHZfdywgcmVzX3gsIHJlc195LCBCcHAsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JZVEUgcl9wb3NfYmx1ZV9jX3IgID0gX2JpY3ViaWNfaW50ZXJwb2woc3RyZXRjaF9idWYsIHN0cmV0Y2hfcGl0Y2gsIHBvc19waXhlbCwgdV93LCB2X3csIHJlc194LCByZXNfeSwgQnBwLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYkhhc0FscGhhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1GICE9IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1GID09IEZYRElCX1JnYmEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3Bvc1swXSA9IHJfcG9zX2JsdWVfY19yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zWzFdID0gcl9wb3NfZ3JlZW5fbV9yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zWzJdID0gcl9wb3NfcmVkX3lfcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9wb3Nfa19yID0gX2JpY3ViaWNfaW50ZXJwb2woc3RyZXRjaF9idWYsIHN0cmV0Y2hfcGl0Y2gsIHBvc19waXhlbCwgdV93LCB2X3csIHJlc194LCByZXNfeSwgQnBwLCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3BvcyA9IEZYQ01ZS19UT0RJQihDbXlrRW5jb2RlKHJfcG9zX2JsdWVfY19yLCByX3Bvc19ncmVlbl9tX3IsIHJfcG9zX3JlZF95X3IsIHJfcG9zX2tfcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQllURSByX3Bvc19hX3IgPSBfYmljdWJpY19pbnRlcnBvbChzdHJldGNoX2J1Ziwgc3RyZXRjaF9waXRjaCwgcG9zX3BpeGVsLCB1X3csIHZfdywgcmVzX3gsIHJlc195LCBCcHAsIDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9wb3MgPSBGWEFSR0JfVE9ESUIoRlhBUkdCX01BS0Uocl9wb3NfYV9yLCByX3Bvc19yZWRfeV9yLCByX3Bvc19ncmVlbl9tX3IsIHJfcG9zX2JsdWVfY19yKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByX3Bvc19rX3IgPSAweGZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtRiA9PSBGWERJQl9DbXlrYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9wb3Nfa19yID0gX2JpY3ViaWNfaW50ZXJwb2woc3RyZXRjaF9idWYsIHN0cmV0Y2hfcGl0Y2gsIHBvc19waXhlbCwgdV93LCB2X3csIHJlc194LCByZXNfeSwgQnBwLCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3RfcG9zID0gRlhDTVlLX1RPRElCKENteWtFbmNvZGUocl9wb3NfYmx1ZV9jX3IsIHJfcG9zX2dyZWVuX21fciwgcl9wb3NfcmVkX3lfciwgcl9wb3Nfa19yKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3BvcyA9IEZYQVJHQl9UT0RJQihGWEFSR0JfTUFLRShyX3Bvc19rX3IsIHJfcG9zX3JlZF95X3IsIHJfcG9zX2dyZWVuX21fciwgcl9wb3NfYmx1ZV9jX3IpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zICs9IGRlc3RCcHA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENQREZfRml4ZWRNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX1Jlc3VsdEhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0JZVEUqIGRlc3RfcG9zID0gKEZYX0JZVEUqKXBUcmFuc2Zvcm1lZC0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9SZXN1bHRXaWR0aDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2NvbCwgc3JjX3JvdzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDJzdHJldGNoX2ZpeC5UcmFuc2Zvcm0oY29sLCByb3csIHNyY19jb2wsIHNyY19yb3cpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19jb2wgPj0gMCAmJiBzcmNfY29sIDw9IHN0cmV0Y2hfd2lkdGggJiYgc3JjX3JvdyA+PSAwICYmIHNyY19yb3cgPD0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2NvbCA9PSBzdHJldGNoX3dpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb2wgLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfcm93ID09IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19yb3cgLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQQ0JZVEUgc3JjX3BvcyA9IHN0cmV0Y2hfYnVmICsgc3JjX3JvdyAqIHN0cmV0Y2hfcGl0Y2ggKyBzcmNfY29sICogQnBwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiSGFzQWxwaGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybUYgIT0gRlhESUJfQXJnYikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybUYgPT0gRlhESUJfUmdiYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zWzBdID0gc3JjX3Bvc1swXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3Bvc1sxXSA9IHNyY19wb3NbMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9wb3NbMl0gPSBzcmNfcG9zWzJdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3BvcyA9IEZYQ01ZS19UT0RJQihDbXlrRW5jb2RlKHNyY19wb3NbMF0sIHNyY19wb3NbMV0sIHNyY19wb3NbMl0sIHNyY19wb3NbM10pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3RfcG9zID0gRlhBUkdCX1RPRElCKEZYQVJHQl9NQUtFKHNyY19wb3NbM10sIHNyY19wb3NbMl0sIHNyY19wb3NbMV0sIHNyY19wb3NbMF0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1GID09IEZYRElCX0NteWthKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3BvcyA9IEZYQ01ZS19UT0RJQihDbXlrRW5jb2RlKHNyY19wb3NbMF0sIHNyY19wb3NbMV0sIHNyY19wb3NbMl0sIHNyY19wb3NbM10pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3RfcG9zID0gRlhBUkdCX1RPRElCKEZYQVJHQl9NQUtFKDB4ZmYsIHNyY19wb3NbMl0sIHNyY19wb3NbMV0sIHNyY19wb3NbMF0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zICs9IGRlc3RCcHA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9TdG9yZXIuUmVwbGFjZShwVHJhbnNmb3JtZWQpOworQ0ZYX0ltYWdlVHJhbnNmb3JtZXI6On5DRlhfSW1hZ2VUcmFuc2Zvcm1lcigpIHt9CitGWF9CT09MIENGWF9JbWFnZVRyYW5zZm9ybWVyOjpTdGFydChjb25zdCBDRlhfRElCU291cmNlKiBwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcERlc3RNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwRGVzdENsaXApIHsKKyAgbV9wTWF0cml4ID0gKENGWF9NYXRyaXgqKXBEZXN0TWF0cml4OworICBDRlhfRmxvYXRSZWN0IHVuaXRfcmVjdCA9IHBEZXN0TWF0cml4LT5HZXRVbml0UmVjdCgpOworICBGWF9SRUNUIHJlc3VsdF9yZWN0ID0gdW5pdF9yZWN0LkdldENsb3Nlc3RSZWN0KCk7CisgIEZYX1JFQ1QgcmVzdWx0X2NsaXAgPSByZXN1bHRfcmVjdDsKKyAgaWYgKHBEZXN0Q2xpcCkgeworICAgIHJlc3VsdF9jbGlwLkludGVyc2VjdCgqcERlc3RDbGlwKTsKKyAgfQorICBpZiAocmVzdWx0X2NsaXAuSXNFbXB0eSgpKSB7CiAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fUmVzdWx0TGVmdCA9IHJlc3VsdF9jbGlwLmxlZnQ7CisgIG1fUmVzdWx0VG9wID0gcmVzdWx0X2NsaXAudG9wOworICBtX1Jlc3VsdFdpZHRoID0gcmVzdWx0X2NsaXAuV2lkdGgoKTsKKyAgbV9SZXN1bHRIZWlnaHQgPSByZXN1bHRfY2xpcC5IZWlnaHQoKTsKKyAgbV9GbGFncyA9IGZsYWdzOworICBpZiAoRlhTWVNfZmFicyhwRGVzdE1hdHJpeC0+YSkgPCBGWFNZU19mYWJzKHBEZXN0TWF0cml4LT5iKSAvIDIwICYmCisgICAgICBGWFNZU19mYWJzKHBEZXN0TWF0cml4LT5kKSA8IEZYU1lTX2ZhYnMocERlc3RNYXRyaXgtPmMpIC8gMjAgJiYKKyAgICAgIEZYU1lTX2ZhYnMocERlc3RNYXRyaXgtPmEpIDwgMC41ZiAmJiBGWFNZU19mYWJzKHBEZXN0TWF0cml4LT5kKSA8IDAuNWYpIHsKKyAgICBpbnQgZGVzdF93aWR0aCA9IHJlc3VsdF9yZWN0LldpZHRoKCk7CisgICAgaW50IGRlc3RfaGVpZ2h0ID0gcmVzdWx0X3JlY3QuSGVpZ2h0KCk7CisgICAgcmVzdWx0X2NsaXAuT2Zmc2V0KC1yZXN1bHRfcmVjdC5sZWZ0LCAtcmVzdWx0X3JlY3QudG9wKTsKKyAgICByZXN1bHRfY2xpcCA9IEZYRElCX1N3YXBDbGlwQm94KHJlc3VsdF9jbGlwLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0TWF0cml4LT5jID4gMCwgcERlc3RNYXRyaXgtPmIgPCAwKTsKKyAgICBtX1N0cmV0Y2hlci5TdGFydCgmbV9TdG9yZXIsIHBTcmMsIGRlc3RfaGVpZ2h0LCBkZXN0X3dpZHRoLCByZXN1bHRfY2xpcCwKKyAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgbV9TdGF0dXMgPSAxOworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChGWFNZU19mYWJzKHBEZXN0TWF0cml4LT5iKSA8IEZJWDE2XzAwNSAmJgorICAgICAgRlhTWVNfZmFicyhwRGVzdE1hdHJpeC0+YykgPCBGSVgxNl8wMDUpIHsKKyAgICBpbnQgZGVzdF93aWR0aCA9IHBEZXN0TWF0cml4LT5hID4gMCA/IChpbnQpRlhTWVNfY2VpbChwRGVzdE1hdHJpeC0+YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChpbnQpRlhTWVNfZmxvb3IocERlc3RNYXRyaXgtPmEpOworICAgIGludCBkZXN0X2hlaWdodCA9IHBEZXN0TWF0cml4LT5kID4gMCA/IChpbnQpLUZYU1lTX2NlaWwocERlc3RNYXRyaXgtPmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGludCktRlhTWVNfZmxvb3IocERlc3RNYXRyaXgtPmQpOworICAgIHJlc3VsdF9jbGlwLk9mZnNldCgtcmVzdWx0X3JlY3QubGVmdCwgLXJlc3VsdF9yZWN0LnRvcCk7CisgICAgbV9TdHJldGNoZXIuU3RhcnQoJm1fU3RvcmVyLCBwU3JjLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgcmVzdWx0X2NsaXAsCisgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIG1fU3RhdHVzID0gMjsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpbnQgc3RyZXRjaF93aWR0aCA9CisgICAgICAoaW50KUZYU1lTX2NlaWwoRlhTWVNfc3FydDIocERlc3RNYXRyaXgtPmEsIHBEZXN0TWF0cml4LT5iKSk7CisgIGludCBzdHJldGNoX2hlaWdodCA9CisgICAgICAoaW50KUZYU1lTX2NlaWwoRlhTWVNfc3FydDIocERlc3RNYXRyaXgtPmMsIHBEZXN0TWF0cml4LT5kKSk7CisgIENGWF9NYXRyaXggc3RyZXRjaDJkZXN0KDEuMGYsIDAuMGYsIDAuMGYsIC0xLjBmLCAwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKHN0cmV0Y2hfaGVpZ2h0KSk7CisgIHN0cmV0Y2gyZGVzdC5Db25jYXQoCisgICAgICBwRGVzdE1hdHJpeC0+YSAvIHN0cmV0Y2hfd2lkdGgsIHBEZXN0TWF0cml4LT5iIC8gc3RyZXRjaF93aWR0aCwKKyAgICAgIHBEZXN0TWF0cml4LT5jIC8gc3RyZXRjaF9oZWlnaHQsIHBEZXN0TWF0cml4LT5kIC8gc3RyZXRjaF9oZWlnaHQsCisgICAgICBwRGVzdE1hdHJpeC0+ZSwgcERlc3RNYXRyaXgtPmYpOworICBtX2Rlc3Qyc3RyZXRjaC5TZXRSZXZlcnNlKHN0cmV0Y2gyZGVzdCk7CisgIENGWF9GbG9hdFJlY3QgY2xpcF9yZWN0X2YocmVzdWx0X2NsaXApOworICBjbGlwX3JlY3RfZi5UcmFuc2Zvcm0oJm1fZGVzdDJzdHJldGNoKTsKKyAgbV9TdHJldGNoQ2xpcCA9IGNsaXBfcmVjdF9mLkdldE91dHRlclJlY3QoKTsKKyAgbV9TdHJldGNoQ2xpcC5JbnRlcnNlY3QoMCwgMCwgc3RyZXRjaF93aWR0aCwgc3RyZXRjaF9oZWlnaHQpOworICBtX1N0cmV0Y2hlci5TdGFydCgmbV9TdG9yZXIsIHBTcmMsIHN0cmV0Y2hfd2lkdGgsIHN0cmV0Y2hfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBtX1N0cmV0Y2hDbGlwLCBmbGFncyk7CisgIG1fU3RhdHVzID0gMzsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgQ0ZYX0ltYWdlVHJhbnNmb3JtZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKSB7CisgIGlmIChtX1N0YXR1cyA9PSAxKSB7CisgICAgaWYgKG1fU3RyZXRjaGVyLkNvbnRpbnVlKHBQYXVzZSkpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBpZiAobV9TdG9yZXIuR2V0Qml0bWFwKCkpIHsKKyAgICAgIG1fU3RvcmVyLlJlcGxhY2UoCisgICAgICAgICAgbV9TdG9yZXIuR2V0Qml0bWFwKCktPlN3YXBYWShtX3BNYXRyaXgtPmMgPiAwLCBtX3BNYXRyaXgtPmIgPCAwKSk7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAobV9TdGF0dXMgPT0gMikgeworICAgIHJldHVybiBtX1N0cmV0Y2hlci5Db250aW51ZShwUGF1c2UpOworICB9CisgIGlmIChtX1N0YXR1cyAhPSAzKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX1N0cmV0Y2hlci5Db250aW51ZShwUGF1c2UpKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaW50IHN0cmV0Y2hfd2lkdGggPSBtX1N0cmV0Y2hDbGlwLldpZHRoKCk7CisgIGludCBzdHJldGNoX2hlaWdodCA9IG1fU3RyZXRjaENsaXAuSGVpZ2h0KCk7CisgIGlmICghbV9TdG9yZXIuR2V0Qml0bWFwKCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgY29uc3QgdWludDhfdCogc3RyZXRjaF9idWYgPSBtX1N0b3Jlci5HZXRCaXRtYXAoKS0+R2V0QnVmZmVyKCk7CisgIGNvbnN0IHVpbnQ4X3QqIHN0cmV0Y2hfYnVmX21hc2sgPSBOVUxMOworICBpZiAobV9TdG9yZXIuR2V0Qml0bWFwKCktPm1fcEFscGhhTWFzaykgeworICAgIHN0cmV0Y2hfYnVmX21hc2sgPSBtX1N0b3Jlci5HZXRCaXRtYXAoKS0+bV9wQWxwaGFNYXNrLT5HZXRCdWZmZXIoKTsKKyAgfQorICBpbnQgc3RyZXRjaF9waXRjaCA9IG1fU3RvcmVyLkdldEJpdG1hcCgpLT5HZXRQaXRjaCgpOworICBDRlhfRElCaXRtYXAqIHBUcmFuc2Zvcm1lZCA9IG5ldyBDRlhfRElCaXRtYXA7CisgIEZYRElCX0Zvcm1hdCB0cmFuc2Zvcm1GID0gR2V0VHJhbnNmb3JtZWRGb3JtYXQobV9TdHJldGNoZXIubV9wU291cmNlKTsKKyAgaWYgKCFwVHJhbnNmb3JtZWQtPkNyZWF0ZShtX1Jlc3VsdFdpZHRoLCBtX1Jlc3VsdEhlaWdodCwgdHJhbnNmb3JtRikpIHsKKyAgICBkZWxldGUgcFRyYW5zZm9ybWVkOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBwVHJhbnNmb3JtZWQtPkNsZWFyKDApOworICBpZiAocFRyYW5zZm9ybWVkLT5tX3BBbHBoYU1hc2spIHsKKyAgICBwVHJhbnNmb3JtZWQtPm1fcEFscGhhTWFzay0+Q2xlYXIoMCk7CisgIH0KKyAgQ0ZYX01hdHJpeCByZXN1bHQyc3RyZXRjaCgxLjBmLCAwLjBmLCAwLjBmLCAxLjBmLCAoRlhfRkxPQVQpKG1fUmVzdWx0TGVmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShtX1Jlc3VsdFRvcCkpOworICByZXN1bHQyc3RyZXRjaC5Db25jYXQobV9kZXN0MnN0cmV0Y2gpOworICByZXN1bHQyc3RyZXRjaC5UcmFuc2xhdGVJKC1tX1N0cmV0Y2hDbGlwLmxlZnQsIC1tX1N0cmV0Y2hDbGlwLnRvcCk7CisgIGlmICghc3RyZXRjaF9idWZfbWFzayAmJiBwVHJhbnNmb3JtZWQtPm1fcEFscGhhTWFzaykgeworICAgIHBUcmFuc2Zvcm1lZC0+bV9wQWxwaGFNYXNrLT5DbGVhcigweGZmMDAwMDAwKTsKKyAgfSBlbHNlIGlmIChwVHJhbnNmb3JtZWQtPm1fcEFscGhhTWFzaykgeworICAgIGludCBzdHJldGNoX3BpdGNoX21hc2sgPSBtX1N0b3Jlci5HZXRCaXRtYXAoKS0+bV9wQWxwaGFNYXNrLT5HZXRQaXRjaCgpOworICAgIGlmICghKG1fRmxhZ3MgJiBGWERJQl9ET1dOU0FNUExFKSAmJiAhKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSkgeworICAgICAgQ0ZYX0JpbGluZWFyTWF0cml4IHJlc3VsdDJzdHJldGNoX2ZpeChyZXN1bHQyc3RyZXRjaCwgOCk7CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX1Jlc3VsdEhlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCogZGVzdF9wb3NfbWFzayA9CisgICAgICAgICAgICAodWludDhfdCopcFRyYW5zZm9ybWVkLT5tX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKHJvdyk7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fUmVzdWx0V2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgaW50IHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwgcmVzX3k7CisgICAgICAgICAgcmVzdWx0MnN0cmV0Y2hfZml4LlRyYW5zZm9ybShjb2wsIHJvdywgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzX3kpOworICAgICAgICAgIGlmIChzcmNfY29sX2wgPj0gMCAmJiBzcmNfY29sX2wgPD0gc3RyZXRjaF93aWR0aCAmJiBzcmNfcm93X2wgPj0gMCAmJgorICAgICAgICAgICAgICBzcmNfcm93X2wgPD0gc3RyZXRjaF9oZWlnaHQpIHsKKyAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPT0gc3RyZXRjaF93aWR0aCkgeworICAgICAgICAgICAgICBzcmNfY29sX2wtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzcmNfcm93X2wgPT0gc3RyZXRjaF9oZWlnaHQpIHsKKyAgICAgICAgICAgICAgc3JjX3Jvd19sLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgc3JjX2NvbF9yID0gc3JjX2NvbF9sICsgMTsKKyAgICAgICAgICAgIGludCBzcmNfcm93X3IgPSBzcmNfcm93X2wgKyAxOworICAgICAgICAgICAgaWYgKHNyY19jb2xfciA9PSBzdHJldGNoX3dpZHRoKSB7CisgICAgICAgICAgICAgIHNyY19jb2xfci0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNyY19yb3dfciA9PSBzdHJldGNoX2hlaWdodCkgeworICAgICAgICAgICAgICBzcmNfcm93X3ItLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCByb3dfb2Zmc2V0X2wgPSBzcmNfcm93X2wgKiBzdHJldGNoX3BpdGNoX21hc2s7CisgICAgICAgICAgICBpbnQgcm93X29mZnNldF9yID0gc3JjX3Jvd19yICogc3RyZXRjaF9waXRjaF9tYXNrOworICAgICAgICAgICAgKmRlc3RfcG9zX21hc2sgPQorICAgICAgICAgICAgICAgIGJpbGluZWFyX2ludGVycG9sKHN0cmV0Y2hfYnVmX21hc2ssIHJvd19vZmZzZXRfbCwgcm93X29mZnNldF9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb2xfbCwgc3JjX2NvbF9yLCByZXNfeCwgcmVzX3ksIDEsIDApOworICAgICAgICAgIH0KKyAgICAgICAgICBkZXN0X3Bvc19tYXNrKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7CisgICAgICBDRlhfQmlsaW5lYXJNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fUmVzdWx0SGVpZ2h0OyByb3crKykgeworICAgICAgICB1aW50OF90KiBkZXN0X3Bvc19tYXNrID0KKyAgICAgICAgICAgICh1aW50OF90KilwVHJhbnNmb3JtZWQtPm1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUocm93KTsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9SZXN1bHRXaWR0aDsgY29sKyspIHsKKyAgICAgICAgICBpbnQgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeTsKKyAgICAgICAgICByZXN1bHQyc3RyZXRjaF9maXguVHJhbnNmb3JtKGNvbCwgcm93LCBzcmNfY29sX2wsIHNyY19yb3dfbCwgcmVzX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNfeSk7CisgICAgICAgICAgaWYgKHNyY19jb2xfbCA+PSAwICYmIHNyY19jb2xfbCA8PSBzdHJldGNoX3dpZHRoICYmIHNyY19yb3dfbCA+PSAwICYmCisgICAgICAgICAgICAgIHNyY19yb3dfbCA8PSBzdHJldGNoX2hlaWdodCkgeworICAgICAgICAgICAgaW50IHBvc19waXhlbFs4XTsKKyAgICAgICAgICAgIGludCB1X3dbNF0sIHZfd1s0XTsKKyAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPT0gc3RyZXRjaF93aWR0aCkgeworICAgICAgICAgICAgICBzcmNfY29sX2wtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzcmNfcm93X2wgPT0gc3RyZXRjaF9oZWlnaHQpIHsKKyAgICAgICAgICAgICAgc3JjX3Jvd19sLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiaWN1YmljX2dldF9wb3Nfd2VpZ2h0KHBvc19waXhlbCwgdV93LCB2X3csIHNyY19jb2xfbCwgc3JjX3Jvd19sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNfeCwgcmVzX3ksIHN0cmV0Y2hfd2lkdGgsIHN0cmV0Y2hfaGVpZ2h0KTsKKyAgICAgICAgICAgICpkZXN0X3Bvc19tYXNrID0KKyAgICAgICAgICAgICAgICBiaWN1YmljX2ludGVycG9sKHN0cmV0Y2hfYnVmX21hc2ssIHN0cmV0Y2hfcGl0Y2hfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc19waXhlbCwgdV93LCB2X3csIHJlc194LCByZXNfeSwgMSwgMCk7CisgICAgICAgICAgfQorICAgICAgICAgIGRlc3RfcG9zX21hc2srKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBDUERGX0ZpeGVkTWF0cml4IHJlc3VsdDJzdHJldGNoX2ZpeChyZXN1bHQyc3RyZXRjaCwgOCk7CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX1Jlc3VsdEhlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCogZGVzdF9wb3NfbWFzayA9CisgICAgICAgICAgICAodWludDhfdCopcFRyYW5zZm9ybWVkLT5tX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKHJvdyk7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fUmVzdWx0V2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgaW50IHNyY19jb2wsIHNyY19yb3c7CisgICAgICAgICAgcmVzdWx0MnN0cmV0Y2hfZml4LlRyYW5zZm9ybShjb2wsIHJvdywgc3JjX2NvbCwgc3JjX3Jvdyk7CisgICAgICAgICAgaWYgKHNyY19jb2wgPj0gMCAmJiBzcmNfY29sIDw9IHN0cmV0Y2hfd2lkdGggJiYgc3JjX3JvdyA+PSAwICYmCisgICAgICAgICAgICAgIHNyY19yb3cgPD0gc3RyZXRjaF9oZWlnaHQpIHsKKyAgICAgICAgICAgIGlmIChzcmNfY29sID09IHN0cmV0Y2hfd2lkdGgpIHsKKyAgICAgICAgICAgICAgc3JjX2NvbC0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNyY19yb3cgPT0gc3RyZXRjaF9oZWlnaHQpIHsKKyAgICAgICAgICAgICAgc3JjX3Jvdy0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmRlc3RfcG9zX21hc2sgPQorICAgICAgICAgICAgICAgIHN0cmV0Y2hfYnVmX21hc2tbc3JjX3JvdyAqIHN0cmV0Y2hfcGl0Y2hfbWFzayArIHNyY19jb2xdOworICAgICAgICAgIH0KKyAgICAgICAgICBkZXN0X3Bvc19tYXNrKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKG1fU3RvcmVyLkdldEJpdG1hcCgpLT5Jc0FscGhhTWFzaygpKSB7CisgICAgaWYgKCEobV9GbGFncyAmIEZYRElCX0RPV05TQU1QTEUpICYmICEobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpKSB7CisgICAgICBDRlhfQmlsaW5lYXJNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fUmVzdWx0SGVpZ2h0OyByb3crKykgeworICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSAodWludDhfdCopcFRyYW5zZm9ybWVkLT5HZXRTY2FubGluZShyb3cpOworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1Jlc3VsdFdpZHRoOyBjb2wrKykgeworICAgICAgICAgIGludCBzcmNfY29sX2wsIHNyY19yb3dfbCwgcmVzX3gsIHJlc195OworICAgICAgICAgIHJlc3VsdDJzdHJldGNoX2ZpeC5UcmFuc2Zvcm0oY29sLCByb3csIHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc195KTsKKyAgICAgICAgICBpZiAoc3JjX2NvbF9sID49IDAgJiYgc3JjX2NvbF9sIDw9IHN0cmV0Y2hfd2lkdGggJiYgc3JjX3Jvd19sID49IDAgJiYKKyAgICAgICAgICAgICAgc3JjX3Jvd19sIDw9IHN0cmV0Y2hfaGVpZ2h0KSB7CisgICAgICAgICAgICBpZiAoc3JjX2NvbF9sID09IHN0cmV0Y2hfd2lkdGgpIHsKKyAgICAgICAgICAgICAgc3JjX2NvbF9sLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3JjX3Jvd19sID09IHN0cmV0Y2hfaGVpZ2h0KSB7CisgICAgICAgICAgICAgIHNyY19yb3dfbC0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHNyY19jb2xfciA9IHNyY19jb2xfbCArIDE7CisgICAgICAgICAgICBpbnQgc3JjX3Jvd19yID0gc3JjX3Jvd19sICsgMTsKKyAgICAgICAgICAgIGlmIChzcmNfY29sX3IgPT0gc3RyZXRjaF93aWR0aCkgeworICAgICAgICAgICAgICBzcmNfY29sX3ItLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzcmNfcm93X3IgPT0gc3RyZXRjaF9oZWlnaHQpIHsKKyAgICAgICAgICAgICAgc3JjX3Jvd19yLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgcm93X29mZnNldF9sID0gc3JjX3Jvd19sICogc3RyZXRjaF9waXRjaDsKKyAgICAgICAgICAgIGludCByb3dfb2Zmc2V0X3IgPSBzcmNfcm93X3IgKiBzdHJldGNoX3BpdGNoOworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9CisgICAgICAgICAgICAgICAgYmlsaW5lYXJfaW50ZXJwb2woc3RyZXRjaF9idWYsIHJvd19vZmZzZXRfbCwgcm93X29mZnNldF9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb2xfbCwgc3JjX2NvbF9yLCByZXNfeCwgcmVzX3ksIDEsIDApOworICAgICAgICAgIH0KKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKKyAgICAgIENGWF9CaWxpbmVhck1hdHJpeCByZXN1bHQyc3RyZXRjaF9maXgocmVzdWx0MnN0cmV0Y2gsIDgpOworICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9SZXN1bHRIZWlnaHQ7IHJvdysrKSB7CisgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9ICh1aW50OF90KilwVHJhbnNmb3JtZWQtPkdldFNjYW5saW5lKHJvdyk7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fUmVzdWx0V2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgaW50IHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwgcmVzX3k7CisgICAgICAgICAgcmVzdWx0MnN0cmV0Y2hfZml4LlRyYW5zZm9ybShjb2wsIHJvdywgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzX3kpOworICAgICAgICAgIGlmIChzcmNfY29sX2wgPj0gMCAmJiBzcmNfY29sX2wgPD0gc3RyZXRjaF93aWR0aCAmJiBzcmNfcm93X2wgPj0gMCAmJgorICAgICAgICAgICAgICBzcmNfcm93X2wgPD0gc3RyZXRjaF9oZWlnaHQpIHsKKyAgICAgICAgICAgIGludCBwb3NfcGl4ZWxbOF07CisgICAgICAgICAgICBpbnQgdV93WzRdLCB2X3dbNF07CisgICAgICAgICAgICBpZiAoc3JjX2NvbF9sID09IHN0cmV0Y2hfd2lkdGgpIHsKKyAgICAgICAgICAgICAgc3JjX2NvbF9sLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3JjX3Jvd19sID09IHN0cmV0Y2hfaGVpZ2h0KSB7CisgICAgICAgICAgICAgIHNyY19yb3dfbC0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmljdWJpY19nZXRfcG9zX3dlaWdodChwb3NfcGl4ZWwsIHVfdywgdl93LCBzcmNfY29sX2wsIHNyY19yb3dfbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzX3gsIHJlc195LCBzdHJldGNoX3dpZHRoLCBzdHJldGNoX2hlaWdodCk7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gYmljdWJpY19pbnRlcnBvbChzdHJldGNoX2J1Ziwgc3RyZXRjaF9waXRjaCwgcG9zX3BpeGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV93LCB2X3csIHJlc194LCByZXNfeSwgMSwgMCk7CisgICAgICAgICAgfQorICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIENQREZfRml4ZWRNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKKyAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fUmVzdWx0SGVpZ2h0OyByb3crKykgeworICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSAodWludDhfdCopcFRyYW5zZm9ybWVkLT5HZXRTY2FubGluZShyb3cpOworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1Jlc3VsdFdpZHRoOyBjb2wrKykgeworICAgICAgICAgIGludCBzcmNfY29sLCBzcmNfcm93OworICAgICAgICAgIHJlc3VsdDJzdHJldGNoX2ZpeC5UcmFuc2Zvcm0oY29sLCByb3csIHNyY19jb2wsIHNyY19yb3cpOworICAgICAgICAgIGlmIChzcmNfY29sID49IDAgJiYgc3JjX2NvbCA8PSBzdHJldGNoX3dpZHRoICYmIHNyY19yb3cgPj0gMCAmJgorICAgICAgICAgICAgICBzcmNfcm93IDw9IHN0cmV0Y2hfaGVpZ2h0KSB7CisgICAgICAgICAgICBpZiAoc3JjX2NvbCA9PSBzdHJldGNoX3dpZHRoKSB7CisgICAgICAgICAgICAgIHNyY19jb2wtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzcmNfcm93ID09IHN0cmV0Y2hfaGVpZ2h0KSB7CisgICAgICAgICAgICAgIHNyY19yb3ctLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19waXhlbCA9CisgICAgICAgICAgICAgICAgc3RyZXRjaF9idWYgKyBzdHJldGNoX3BpdGNoICogc3JjX3JvdyArIHNyY19jb2w7CisgICAgICAgICAgICAqZGVzdF9zY2FuID0gKnNyY19waXhlbDsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW50IEJwcCA9IG1fU3RvcmVyLkdldEJpdG1hcCgpLT5HZXRCUFAoKSAvIDg7CisgICAgaW50IGRlc3RCcHAgPSBwVHJhbnNmb3JtZWQtPkdldEJQUCgpIC8gODsKKyAgICBpZiAoQnBwID09IDEpIHsKKyAgICAgIEZYX0RXT1JEIGFyZ2JbMjU2XTsKKyAgICAgIEZYX0FSR0IqIHBQYWwgPSBtX1N0b3Jlci5HZXRCaXRtYXAoKS0+R2V0UGFsZXR0ZSgpOworICAgICAgaWYgKHBQYWwpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICAgIGFyZ2JbaV0gPSBwUGFsW2ldOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAobV9TdG9yZXIuR2V0Qml0bWFwKCktPklzQ215a0ltYWdlKCkpIHsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgICAgICBhcmdiW2ldID0gMjU1IC0gaTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICAgICAgYXJnYltpXSA9IDB4ZmYwMDAwMDAgfCAoaSAqIDB4MDEwMTAxKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICghKG1fRmxhZ3MgJiBGWERJQl9ET1dOU0FNUExFKSAmJgorICAgICAgICAgICEobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpKSB7CisgICAgICAgIENGWF9CaWxpbmVhck1hdHJpeCByZXN1bHQyc3RyZXRjaF9maXgocmVzdWx0MnN0cmV0Y2gsIDgpOworICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX1Jlc3VsdEhlaWdodDsgcm93KyspIHsKKyAgICAgICAgICB1aW50OF90KiBkZXN0X3BvcyA9ICh1aW50OF90KilwVHJhbnNmb3JtZWQtPkdldFNjYW5saW5lKHJvdyk7CisgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9SZXN1bHRXaWR0aDsgY29sKyspIHsKKyAgICAgICAgICAgIGludCBzcmNfY29sX2wsIHNyY19yb3dfbCwgcmVzX3gsIHJlc195OworICAgICAgICAgICAgcmVzdWx0MnN0cmV0Y2hfZml4LlRyYW5zZm9ybShjb2wsIHJvdywgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNfeSk7CisgICAgICAgICAgICBpZiAoc3JjX2NvbF9sID49IDAgJiYgc3JjX2NvbF9sIDw9IHN0cmV0Y2hfd2lkdGggJiYKKyAgICAgICAgICAgICAgICBzcmNfcm93X2wgPj0gMCAmJiBzcmNfcm93X2wgPD0gc3RyZXRjaF9oZWlnaHQpIHsKKyAgICAgICAgICAgICAgaWYgKHNyY19jb2xfbCA9PSBzdHJldGNoX3dpZHRoKSB7CisgICAgICAgICAgICAgICAgc3JjX2NvbF9sLS07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKHNyY19yb3dfbCA9PSBzdHJldGNoX2hlaWdodCkgeworICAgICAgICAgICAgICAgIHNyY19yb3dfbC0tOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGludCBzcmNfY29sX3IgPSBzcmNfY29sX2wgKyAxOworICAgICAgICAgICAgICBpbnQgc3JjX3Jvd19yID0gc3JjX3Jvd19sICsgMTsKKyAgICAgICAgICAgICAgaWYgKHNyY19jb2xfciA9PSBzdHJldGNoX3dpZHRoKSB7CisgICAgICAgICAgICAgICAgc3JjX2NvbF9yLS07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKHNyY19yb3dfciA9PSBzdHJldGNoX2hlaWdodCkgeworICAgICAgICAgICAgICAgIHNyY19yb3dfci0tOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGludCByb3dfb2Zmc2V0X2wgPSBzcmNfcm93X2wgKiBzdHJldGNoX3BpdGNoOworICAgICAgICAgICAgICBpbnQgcm93X29mZnNldF9yID0gc3JjX3Jvd19yICogc3RyZXRjaF9waXRjaDsKKyAgICAgICAgICAgICAgRlhfRFdPUkQgcl9iZ3JhX2NteWsgPSBhcmdiW2JpbGluZWFyX2ludGVycG9sKAorICAgICAgICAgICAgICAgICAgc3RyZXRjaF9idWYsIHJvd19vZmZzZXRfbCwgcm93X29mZnNldF9yLCBzcmNfY29sX2wsIHNyY19jb2xfciwKKyAgICAgICAgICAgICAgICAgIHJlc194LCByZXNfeSwgMSwgMCldOworICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtRiA9PSBGWERJQl9SZ2JhKSB7CisgICAgICAgICAgICAgICAgZGVzdF9wb3NbMF0gPSAodWludDhfdCkocl9iZ3JhX2NteWsgPj4gMjQpOworICAgICAgICAgICAgICAgIGRlc3RfcG9zWzFdID0gKHVpbnQ4X3QpKHJfYmdyYV9jbXlrID4+IDE2KTsKKyAgICAgICAgICAgICAgICBkZXN0X3Bvc1syXSA9ICh1aW50OF90KShyX2JncmFfY215ayA+PiA4KTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3BvcyA9IHJfYmdyYV9jbXlrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0X3BvcyArPSBkZXN0QnBwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgeworICAgICAgICBDRlhfQmlsaW5lYXJNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKKyAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9SZXN1bHRIZWlnaHQ7IHJvdysrKSB7CisgICAgICAgICAgdWludDhfdCogZGVzdF9wb3MgPSAodWludDhfdCopcFRyYW5zZm9ybWVkLT5HZXRTY2FubGluZShyb3cpOworICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fUmVzdWx0V2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgICBpbnQgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeTsKKyAgICAgICAgICAgIHJlc3VsdDJzdHJldGNoX2ZpeC5UcmFuc2Zvcm0oY29sLCByb3csIHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzX3kpOworICAgICAgICAgICAgaWYgKHNyY19jb2xfbCA+PSAwICYmIHNyY19jb2xfbCA8PSBzdHJldGNoX3dpZHRoICYmCisgICAgICAgICAgICAgICAgc3JjX3Jvd19sID49IDAgJiYgc3JjX3Jvd19sIDw9IHN0cmV0Y2hfaGVpZ2h0KSB7CisgICAgICAgICAgICAgIGludCBwb3NfcGl4ZWxbOF07CisgICAgICAgICAgICAgIGludCB1X3dbNF0sIHZfd1s0XTsKKyAgICAgICAgICAgICAgaWYgKHNyY19jb2xfbCA9PSBzdHJldGNoX3dpZHRoKSB7CisgICAgICAgICAgICAgICAgc3JjX2NvbF9sLS07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKHNyY19yb3dfbCA9PSBzdHJldGNoX2hlaWdodCkgeworICAgICAgICAgICAgICAgIHNyY19yb3dfbC0tOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJpY3ViaWNfZ2V0X3Bvc193ZWlnaHQocG9zX3BpeGVsLCB1X3csIHZfdywgc3JjX2NvbF9sLCBzcmNfcm93X2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzX3gsIHJlc195LCBzdHJldGNoX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmV0Y2hfaGVpZ2h0KTsKKyAgICAgICAgICAgICAgRlhfRFdPUkQgcl9iZ3JhX2NteWsgPQorICAgICAgICAgICAgICAgICAgYXJnYltiaWN1YmljX2ludGVycG9sKHN0cmV0Y2hfYnVmLCBzdHJldGNoX3BpdGNoLCBwb3NfcGl4ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV93LCB2X3csIHJlc194LCByZXNfeSwgMSwgMCldOworICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtRiA9PSBGWERJQl9SZ2JhKSB7CisgICAgICAgICAgICAgICAgZGVzdF9wb3NbMF0gPSAodWludDhfdCkocl9iZ3JhX2NteWsgPj4gMjQpOworICAgICAgICAgICAgICAgIGRlc3RfcG9zWzFdID0gKHVpbnQ4X3QpKHJfYmdyYV9jbXlrID4+IDE2KTsKKyAgICAgICAgICAgICAgICBkZXN0X3Bvc1syXSA9ICh1aW50OF90KShyX2JncmFfY215ayA+PiA4KTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3BvcyA9IHJfYmdyYV9jbXlrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0X3BvcyArPSBkZXN0QnBwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ1BERl9GaXhlZE1hdHJpeCByZXN1bHQyc3RyZXRjaF9maXgocmVzdWx0MnN0cmV0Y2gsIDgpOworICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX1Jlc3VsdEhlaWdodDsgcm93KyspIHsKKyAgICAgICAgICB1aW50OF90KiBkZXN0X3BvcyA9ICh1aW50OF90KilwVHJhbnNmb3JtZWQtPkdldFNjYW5saW5lKHJvdyk7CisgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9SZXN1bHRXaWR0aDsgY29sKyspIHsKKyAgICAgICAgICAgIGludCBzcmNfY29sLCBzcmNfcm93OworICAgICAgICAgICAgcmVzdWx0MnN0cmV0Y2hfZml4LlRyYW5zZm9ybShjb2wsIHJvdywgc3JjX2NvbCwgc3JjX3Jvdyk7CisgICAgICAgICAgICBpZiAoc3JjX2NvbCA+PSAwICYmIHNyY19jb2wgPD0gc3RyZXRjaF93aWR0aCAmJiBzcmNfcm93ID49IDAgJiYKKyAgICAgICAgICAgICAgICBzcmNfcm93IDw9IHN0cmV0Y2hfaGVpZ2h0KSB7CisgICAgICAgICAgICAgIGlmIChzcmNfY29sID09IHN0cmV0Y2hfd2lkdGgpIHsKKyAgICAgICAgICAgICAgICBzcmNfY29sLS07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKHNyY19yb3cgPT0gc3RyZXRjaF9oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBzcmNfcm93LS07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgRlhfRFdPUkQgcl9iZ3JhX2NteWsgPQorICAgICAgICAgICAgICAgICAgYXJnYltzdHJldGNoX2J1ZltzcmNfcm93ICogc3RyZXRjaF9waXRjaCArIHNyY19jb2xdXTsKKyAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybUYgPT0gRlhESUJfUmdiYSkgeworICAgICAgICAgICAgICAgIGRlc3RfcG9zWzBdID0gKHVpbnQ4X3QpKHJfYmdyYV9jbXlrID4+IDI0KTsKKyAgICAgICAgICAgICAgICBkZXN0X3Bvc1sxXSA9ICh1aW50OF90KShyX2JncmFfY215ayA+PiAxNik7CisgICAgICAgICAgICAgICAgZGVzdF9wb3NbMl0gPSAodWludDhfdCkocl9iZ3JhX2NteWsgPj4gOCk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9wb3MgPSByX2JncmFfY215azsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzdF9wb3MgKz0gZGVzdEJwcDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgRlhfQk9PTCBiSGFzQWxwaGEgPSBtX1N0b3Jlci5HZXRCaXRtYXAoKS0+SGFzQWxwaGEoKTsKKyAgICAgIGludCBkZXN0QnBwID0gcFRyYW5zZm9ybWVkLT5HZXRCUFAoKSAvIDg7CisgICAgICBpZiAoIShtX0ZsYWdzICYgRlhESUJfRE9XTlNBTVBMRSkgJiYKKyAgICAgICAgICAhKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSkgeworICAgICAgICBDRlhfQmlsaW5lYXJNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKKyAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9SZXN1bHRIZWlnaHQ7IHJvdysrKSB7CisgICAgICAgICAgdWludDhfdCogZGVzdF9wb3MgPSAodWludDhfdCopcFRyYW5zZm9ybWVkLT5HZXRTY2FubGluZShyb3cpOworICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fUmVzdWx0V2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgICBpbnQgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeSwgcl9wb3Nfa19yID0gMDsKKyAgICAgICAgICAgIHJlc3VsdDJzdHJldGNoX2ZpeC5UcmFuc2Zvcm0oY29sLCByb3csIHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzX3kpOworICAgICAgICAgICAgaWYgKHNyY19jb2xfbCA+PSAwICYmIHNyY19jb2xfbCA8PSBzdHJldGNoX3dpZHRoICYmCisgICAgICAgICAgICAgICAgc3JjX3Jvd19sID49IDAgJiYgc3JjX3Jvd19sIDw9IHN0cmV0Y2hfaGVpZ2h0KSB7CisgICAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPT0gc3RyZXRjaF93aWR0aCkgeworICAgICAgICAgICAgICAgIHNyY19jb2xfbC0tOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChzcmNfcm93X2wgPT0gc3RyZXRjaF9oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBzcmNfcm93X2wtLTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpbnQgc3JjX2NvbF9yID0gc3JjX2NvbF9sICsgMTsKKyAgICAgICAgICAgICAgaW50IHNyY19yb3dfciA9IHNyY19yb3dfbCArIDE7CisgICAgICAgICAgICAgIGlmIChzcmNfY29sX3IgPT0gc3RyZXRjaF93aWR0aCkgeworICAgICAgICAgICAgICAgIHNyY19jb2xfci0tOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChzcmNfcm93X3IgPT0gc3RyZXRjaF9oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBzcmNfcm93X3ItLTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpbnQgcm93X29mZnNldF9sID0gc3JjX3Jvd19sICogc3RyZXRjaF9waXRjaDsKKyAgICAgICAgICAgICAgaW50IHJvd19vZmZzZXRfciA9IHNyY19yb3dfciAqIHN0cmV0Y2hfcGl0Y2g7CisgICAgICAgICAgICAgIHVpbnQ4X3Qgcl9wb3NfcmVkX3lfciA9CisgICAgICAgICAgICAgICAgICBiaWxpbmVhcl9pbnRlcnBvbChzdHJldGNoX2J1Ziwgcm93X29mZnNldF9sLCByb3dfb2Zmc2V0X3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfY29sX2wsIHNyY19jb2xfciwgcmVzX3gsIHJlc195LCBCcHAsIDIpOworICAgICAgICAgICAgICB1aW50OF90IHJfcG9zX2dyZWVuX21fciA9CisgICAgICAgICAgICAgICAgICBiaWxpbmVhcl9pbnRlcnBvbChzdHJldGNoX2J1Ziwgcm93X29mZnNldF9sLCByb3dfb2Zmc2V0X3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfY29sX2wsIHNyY19jb2xfciwgcmVzX3gsIHJlc195LCBCcHAsIDEpOworICAgICAgICAgICAgICB1aW50OF90IHJfcG9zX2JsdWVfY19yID0KKyAgICAgICAgICAgICAgICAgIGJpbGluZWFyX2ludGVycG9sKHN0cmV0Y2hfYnVmLCByb3dfb2Zmc2V0X2wsIHJvd19vZmZzZXRfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb2xfbCwgc3JjX2NvbF9yLCByZXNfeCwgcmVzX3ksIEJwcCwgMCk7CisgICAgICAgICAgICAgIGlmIChiSGFzQWxwaGEpIHsKKyAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtRiAhPSBGWERJQl9BcmdiKSB7CisgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtRiA9PSBGWERJQl9SZ2JhKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zWzBdID0gcl9wb3NfYmx1ZV9jX3I7CisgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zWzFdID0gcl9wb3NfZ3JlZW5fbV9yOworICAgICAgICAgICAgICAgICAgICBkZXN0X3Bvc1syXSA9IHJfcG9zX3JlZF95X3I7CisgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByX3Bvc19rX3IgPSBiaWxpbmVhcl9pbnRlcnBvbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmV0Y2hfYnVmLCByb3dfb2Zmc2V0X2wsIHJvd19vZmZzZXRfciwgc3JjX2NvbF9sLAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2NvbF9yLCByZXNfeCwgcmVzX3ksIEJwcCwgMyk7CisgICAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3RfcG9zID0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYQ01ZS19UT0RJQihDbXlrRW5jb2RlKHJfcG9zX2JsdWVfY19yLCByX3Bvc19ncmVlbl9tX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByX3Bvc19yZWRfeV9yLCByX3Bvc19rX3IpKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgdWludDhfdCByX3Bvc19hX3IgPSBiaWxpbmVhcl9pbnRlcnBvbCgKKyAgICAgICAgICAgICAgICAgICAgICBzdHJldGNoX2J1Ziwgcm93X29mZnNldF9sLCByb3dfb2Zmc2V0X3IsIHNyY19jb2xfbCwKKyAgICAgICAgICAgICAgICAgICAgICBzcmNfY29sX3IsIHJlc194LCByZXNfeSwgQnBwLCAzKTsKKyAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3RfcG9zID0gRlhBUkdCX1RPRElCKAorICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9NQUtFKHJfcG9zX2Ffciwgcl9wb3NfcmVkX3lfciwgcl9wb3NfZ3JlZW5fbV9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJfcG9zX2JsdWVfY19yKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJfcG9zX2tfciA9IDB4ZmY7CisgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybUYgPT0gRlhESUJfQ215a2EpIHsKKyAgICAgICAgICAgICAgICAgIHJfcG9zX2tfciA9IGJpbGluZWFyX2ludGVycG9sKAorICAgICAgICAgICAgICAgICAgICAgIHN0cmV0Y2hfYnVmLCByb3dfb2Zmc2V0X2wsIHJvd19vZmZzZXRfciwgc3JjX2NvbF9sLAorICAgICAgICAgICAgICAgICAgICAgIHNyY19jb2xfciwgcmVzX3gsIHJlc195LCBCcHAsIDMpOworICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9wb3MgPQorICAgICAgICAgICAgICAgICAgICAgIEZYQ01ZS19UT0RJQihDbXlrRW5jb2RlKHJfcG9zX2JsdWVfY19yLCByX3Bvc19ncmVlbl9tX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9wb3NfcmVkX3lfciwgcl9wb3Nfa19yKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3RfcG9zID0gRlhBUkdCX1RPRElCKAorICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9NQUtFKHJfcG9zX2tfciwgcl9wb3NfcmVkX3lfciwgcl9wb3NfZ3JlZW5fbV9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJfcG9zX2JsdWVfY19yKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0X3BvcyArPSBkZXN0QnBwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgeworICAgICAgICBDRlhfQmlsaW5lYXJNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKKyAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9SZXN1bHRIZWlnaHQ7IHJvdysrKSB7CisgICAgICAgICAgdWludDhfdCogZGVzdF9wb3MgPSAodWludDhfdCopcFRyYW5zZm9ybWVkLT5HZXRTY2FubGluZShyb3cpOworICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fUmVzdWx0V2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgICBpbnQgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeSwgcl9wb3Nfa19yID0gMDsKKyAgICAgICAgICAgIHJlc3VsdDJzdHJldGNoX2ZpeC5UcmFuc2Zvcm0oY29sLCByb3csIHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzX3kpOworICAgICAgICAgICAgaWYgKHNyY19jb2xfbCA+PSAwICYmIHNyY19jb2xfbCA8PSBzdHJldGNoX3dpZHRoICYmCisgICAgICAgICAgICAgICAgc3JjX3Jvd19sID49IDAgJiYgc3JjX3Jvd19sIDw9IHN0cmV0Y2hfaGVpZ2h0KSB7CisgICAgICAgICAgICAgIGludCBwb3NfcGl4ZWxbOF07CisgICAgICAgICAgICAgIGludCB1X3dbNF0sIHZfd1s0XTsKKyAgICAgICAgICAgICAgaWYgKHNyY19jb2xfbCA9PSBzdHJldGNoX3dpZHRoKSB7CisgICAgICAgICAgICAgICAgc3JjX2NvbF9sLS07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKHNyY19yb3dfbCA9PSBzdHJldGNoX2hlaWdodCkgeworICAgICAgICAgICAgICAgIHNyY19yb3dfbC0tOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJpY3ViaWNfZ2V0X3Bvc193ZWlnaHQocG9zX3BpeGVsLCB1X3csIHZfdywgc3JjX2NvbF9sLCBzcmNfcm93X2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzX3gsIHJlc195LCBzdHJldGNoX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmV0Y2hfaGVpZ2h0KTsKKyAgICAgICAgICAgICAgdWludDhfdCByX3Bvc19yZWRfeV9yID0KKyAgICAgICAgICAgICAgICAgIGJpY3ViaWNfaW50ZXJwb2woc3RyZXRjaF9idWYsIHN0cmV0Y2hfcGl0Y2gsIHBvc19waXhlbCwgdV93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X3csIHJlc194LCByZXNfeSwgQnBwLCAyKTsKKyAgICAgICAgICAgICAgdWludDhfdCByX3Bvc19ncmVlbl9tX3IgPQorICAgICAgICAgICAgICAgICAgYmljdWJpY19pbnRlcnBvbChzdHJldGNoX2J1Ziwgc3RyZXRjaF9waXRjaCwgcG9zX3BpeGVsLCB1X3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfdywgcmVzX3gsIHJlc195LCBCcHAsIDEpOworICAgICAgICAgICAgICB1aW50OF90IHJfcG9zX2JsdWVfY19yID0KKyAgICAgICAgICAgICAgICAgIGJpY3ViaWNfaW50ZXJwb2woc3RyZXRjaF9idWYsIHN0cmV0Y2hfcGl0Y2gsIHBvc19waXhlbCwgdV93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X3csIHJlc194LCByZXNfeSwgQnBwLCAwKTsKKyAgICAgICAgICAgICAgaWYgKGJIYXNBbHBoYSkgeworICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1GICE9IEZYRElCX0FyZ2IpIHsKKyAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1GID09IEZYRElCX1JnYmEpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzdF9wb3NbMF0gPSByX3Bvc19ibHVlX2NfcjsKKyAgICAgICAgICAgICAgICAgICAgZGVzdF9wb3NbMV0gPSByX3Bvc19ncmVlbl9tX3I7CisgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zWzJdID0gcl9wb3NfcmVkX3lfcjsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJfcG9zX2tfciA9CisgICAgICAgICAgICAgICAgICAgICAgICBiaWN1YmljX2ludGVycG9sKHN0cmV0Y2hfYnVmLCBzdHJldGNoX3BpdGNoLCBwb3NfcGl4ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfdywgdl93LCByZXNfeCwgcmVzX3ksIEJwcCwgMyk7CisgICAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3RfcG9zID0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYQ01ZS19UT0RJQihDbXlrRW5jb2RlKHJfcG9zX2JsdWVfY19yLCByX3Bvc19ncmVlbl9tX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByX3Bvc19yZWRfeV9yLCByX3Bvc19rX3IpKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgdWludDhfdCByX3Bvc19hX3IgPQorICAgICAgICAgICAgICAgICAgICAgIGJpY3ViaWNfaW50ZXJwb2woc3RyZXRjaF9idWYsIHN0cmV0Y2hfcGl0Y2gsIHBvc19waXhlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfdywgdl93LCByZXNfeCwgcmVzX3ksIEJwcCwgMyk7CisgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3BvcyA9IEZYQVJHQl9UT0RJQigKKyAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfTUFLRShyX3Bvc19hX3IsIHJfcG9zX3JlZF95X3IsIHJfcG9zX2dyZWVuX21fciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByX3Bvc19ibHVlX2NfcikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByX3Bvc19rX3IgPSAweGZmOworICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1GID09IEZYRElCX0NteWthKSB7CisgICAgICAgICAgICAgICAgICByX3Bvc19rX3IgPQorICAgICAgICAgICAgICAgICAgICAgIGJpY3ViaWNfaW50ZXJwb2woc3RyZXRjaF9idWYsIHN0cmV0Y2hfcGl0Y2gsIHBvc19waXhlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfdywgdl93LCByZXNfeCwgcmVzX3ksIEJwcCwgMyk7CisgICAgICAgICAgICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3BvcyA9CisgICAgICAgICAgICAgICAgICAgICAgRlhDTVlLX1RPRElCKENteWtFbmNvZGUocl9wb3NfYmx1ZV9jX3IsIHJfcG9zX2dyZWVuX21fciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByX3Bvc19yZWRfeV9yLCByX3Bvc19rX3IpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9wb3MgPSBGWEFSR0JfVE9ESUIoCisgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX01BS0Uocl9wb3Nfa19yLCByX3Bvc19yZWRfeV9yLCByX3Bvc19ncmVlbl9tX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9wb3NfYmx1ZV9jX3IpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc3RfcG9zICs9IGRlc3RCcHA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBDUERGX0ZpeGVkTWF0cml4IHJlc3VsdDJzdHJldGNoX2ZpeChyZXN1bHQyc3RyZXRjaCwgOCk7CisgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fUmVzdWx0SGVpZ2h0OyByb3crKykgeworICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfcG9zID0gKHVpbnQ4X3QqKXBUcmFuc2Zvcm1lZC0+R2V0U2NhbmxpbmUocm93KTsKKyAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1Jlc3VsdFdpZHRoOyBjb2wrKykgeworICAgICAgICAgICAgaW50IHNyY19jb2wsIHNyY19yb3c7CisgICAgICAgICAgICByZXN1bHQyc3RyZXRjaF9maXguVHJhbnNmb3JtKGNvbCwgcm93LCBzcmNfY29sLCBzcmNfcm93KTsKKyAgICAgICAgICAgIGlmIChzcmNfY29sID49IDAgJiYgc3JjX2NvbCA8PSBzdHJldGNoX3dpZHRoICYmIHNyY19yb3cgPj0gMCAmJgorICAgICAgICAgICAgICAgIHNyY19yb3cgPD0gc3RyZXRjaF9oZWlnaHQpIHsKKyAgICAgICAgICAgICAgaWYgKHNyY19jb2wgPT0gc3RyZXRjaF93aWR0aCkgeworICAgICAgICAgICAgICAgIHNyY19jb2wtLTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoc3JjX3JvdyA9PSBzdHJldGNoX2hlaWdodCkgeworICAgICAgICAgICAgICAgIHNyY19yb3ctLTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfcG9zID0KKyAgICAgICAgICAgICAgICAgIHN0cmV0Y2hfYnVmICsgc3JjX3JvdyAqIHN0cmV0Y2hfcGl0Y2ggKyBzcmNfY29sICogQnBwOworICAgICAgICAgICAgICBpZiAoYkhhc0FscGhhKSB7CisgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybUYgIT0gRlhESUJfQXJnYikgeworICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybUYgPT0gRlhESUJfUmdiYSkgeworICAgICAgICAgICAgICAgICAgICBkZXN0X3Bvc1swXSA9IHNyY19wb3NbMF07CisgICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zWzFdID0gc3JjX3Bvc1sxXTsKKyAgICAgICAgICAgICAgICAgICAgZGVzdF9wb3NbMl0gPSBzcmNfcG9zWzJdOworICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9wb3MgPSBGWENNWUtfVE9ESUIoQ215a0VuY29kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY19wb3NbMF0sIHNyY19wb3NbMV0sIHNyY19wb3NbMl0sIHNyY19wb3NbM10pKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9wb3MgPSBGWEFSR0JfVE9ESUIoRlhBUkdCX01BS0UoCisgICAgICAgICAgICAgICAgICAgICAgc3JjX3Bvc1szXSwgc3JjX3Bvc1syXSwgc3JjX3Bvc1sxXSwgc3JjX3Bvc1swXSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtRiA9PSBGWERJQl9DbXlrYSkgeworICAgICAgICAgICAgICAgICAgKihGWF9EV09SRCopZGVzdF9wb3MgPSBGWENNWUtfVE9ESUIoQ215a0VuY29kZSgKKyAgICAgICAgICAgICAgICAgICAgICBzcmNfcG9zWzBdLCBzcmNfcG9zWzFdLCBzcmNfcG9zWzJdLCBzcmNfcG9zWzNdKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICooRlhfRFdPUkQqKWRlc3RfcG9zID0gRlhBUkdCX1RPRElCKAorICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9NQUtFKDB4ZmYsIHNyY19wb3NbMl0sIHNyY19wb3NbMV0sIHNyY19wb3NbMF0pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc3RfcG9zICs9IGRlc3RCcHA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIG1fU3RvcmVyLlJlcGxhY2UocFRyYW5zZm9ybWVkKTsKKyAgcmV0dXJuIEZBTFNFOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdERpbmdiYXRzLmMgYi9jb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0RGluZ2JhdHMuYwppbmRleCBiNGMyYWMxLi5hNjUzYTA5IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0RGluZ2JhdHMuYworKysgYi9jb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0RGluZ2JhdHMuYwpAQCAtNCw2ICs0LDggQEAKICAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKKyNpbmNsdWRlICJjaHJvbWVmb250ZGF0YS5oIgorCiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXREaW5nYmF0c0ZvbnREYXRhIFsyOTUxM10gPSB7MHgxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MCwgMHg0LCAweDIsIDB4MCwgMHgxLCAweDEsIDB4MSwgMHgxMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQzLCAweDY4LCAweDcyLCAweDZmLCAweDZkLCAweDQ0LCAweDY5LCAweDZlLApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdEZpeGVkLmMgYi9jb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0Rml4ZWQuYwppbmRleCA4YmFlMGZhLi5hZjIyNGI0IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0Rml4ZWQuYworKysgYi9jb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0Rml4ZWQuYwpAQCAtNCw2ICs0LDggQEAKICAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKKyNpbmNsdWRlICJjaHJvbWVmb250ZGF0YS5oIgorCiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRGaXhlZEZvbnREYXRhIFsxNzU5N10gPSB7MHgxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MCwgMHg0LCAweDIsIDB4MCwgMHgxLCAweDEsIDB4MSwgMHhlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDMsIDB4NjgsIDB4NzIsIDB4NmYsIDB4NmQsIDB4NDYsIDB4NjksIDB4NzgsCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0Rml4ZWRCb2xkLmMgYi9jb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0Rml4ZWRCb2xkLmMKaW5kZXggZWI0ZmI4Zi4uZTRkZTVmNSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdEZpeGVkQm9sZC5jCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRGaXhlZEJvbGQuYwpAQCAtNCw2ICs0LDggQEAKICAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKKyNpbmNsdWRlICJjaHJvbWVmb250ZGF0YS5oIgorCiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRGaXhlZEJvbGRGb250RGF0YSBbMTgwNTVdID0gezB4MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwLCAweDQsIDB4MiwgMHgwLCAweDEsIDB4MSwgMHgxLCAweDEzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQzLCAweDY4LCAweDcyLCAweDZmLCAweDZkLCAweDQ2LCAweDY5LCAweDc4LApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdEZpeGVkQm9sZEl0YWxpYy5jIGIvY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdEZpeGVkQm9sZEl0YWxpYy5jCmluZGV4IDQ1ODQ3ZjYuLjhhOTAwNDMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRGaXhlZEJvbGRJdGFsaWMuYworKysgYi9jb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0Rml4ZWRCb2xkSXRhbGljLmMKQEAgLTQsNiArNCw4IEBACiAgCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCisjaW5jbHVkZSAiY2hyb21lZm9udGRhdGEuaCIKKwogY29uc3QgdW5zaWduZWQgY2hhciBnX0ZveGl0Rml4ZWRCb2xkSXRhbGljRm9udERhdGEgWzE5MTUxXSA9IHsweDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MCwgMHg0LCAweDIsIDB4MCwgMHgxLCAweDEsIDB4MSwgMHgxOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MywgMHg2OCwgMHg3MiwgMHg2ZiwgMHg2ZCwgMHg0NiwgMHg2OSwgMHg3OCwKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRGaXhlZEl0YWxpYy5jIGIvY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdEZpeGVkSXRhbGljLmMKaW5kZXggZDg0MDliYS4uODdkN2RhMCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdEZpeGVkSXRhbGljLmMKKysrIGIvY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdEZpeGVkSXRhbGljLmMKQEAgLTQsNiArNCw4IEBACiAgCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCisjaW5jbHVkZSAiY2hyb21lZm9udGRhdGEuaCIKKwogY29uc3QgdW5zaWduZWQgY2hhciBnX0ZveGl0Rml4ZWRJdGFsaWNGb250RGF0YSBbMTg3NDZdID0gezB4MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAsIDB4NCwgMHgyLCAweDAsIDB4MSwgMHgxLCAweDEsIDB4MTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MywgMHg2OCwgMHg3MiwgMHg2ZiwgMHg2ZCwgMHg0NiwgMHg2OSwgMHg3OCwKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTYW5zLmMgYi9jb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0U2Fucy5jCmluZGV4IGNkODdkMmIuLjQ4NDY1ZmMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTYW5zLmMKKysrIGIvY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdFNhbnMuYwpAQCAtNCw2ICs0LDggQEAKICAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKKyNpbmNsdWRlICJjaHJvbWVmb250ZGF0YS5oIgorCiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRTYW5zRm9udERhdGEgWzE1MDI1XSA9IHsweDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAsIDB4NCwgMHgyLCAweDAsIDB4MSwgMHgxLCAweDEsIDB4ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDMsIDB4NjgsIDB4NzIsIDB4NmYsIDB4NmQsIDB4NTMsIDB4NjEsIDB4NmUsCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0U2Fuc0JvbGQuYyBiL2NvcmUvc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTYW5zQm9sZC5jCmluZGV4IDU5NGIzN2YuLjgxNTA3OTggMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTYW5zQm9sZC5jCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTYW5zQm9sZC5jCkBAIC00LDYgKzQsOCBAQAogIAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAorI2luY2x1ZGUgImNocm9tZWZvbnRkYXRhLmgiCisKIGNvbnN0IHVuc2lnbmVkIGNoYXIgZ19Gb3hpdFNhbnNCb2xkRm9udERhdGEgWzE2MzQ0XSA9IHsweDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwLCAweDQsIDB4MiwgMHgwLCAweDEsIDB4MSwgMHgxLCAweDEyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDMsIDB4NjgsIDB4NzIsIDB4NmYsIDB4NmQsIDB4NTMsIDB4NjEsIDB4NmUsCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0U2Fuc0JvbGRJdGFsaWMuYyBiL2NvcmUvc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTYW5zQm9sZEl0YWxpYy5jCmluZGV4IDA1NTUxNjUuLjkxMjAwZTEgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTYW5zQm9sZEl0YWxpYy5jCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTYW5zQm9sZEl0YWxpYy5jCkBAIC00LDYgKzQsOCBAQAogIAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAorI2luY2x1ZGUgImNocm9tZWZvbnRkYXRhLmgiCisKIGNvbnN0IHVuc2lnbmVkIGNoYXIgZ19Gb3hpdFNhbnNCb2xkSXRhbGljRm9udERhdGEgWzE2NDE4XSA9IHsweDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwLCAweDQsIDB4MiwgMHgwLCAweDEsIDB4MSwgMHgxLCAweDE3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDMsIDB4NjgsIDB4NzIsIDB4NmYsIDB4NmQsIDB4NTMsIDB4NjEsIDB4NmUsCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0U2Fuc0l0YWxpYy5jIGIvY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdFNhbnNJdGFsaWMuYwppbmRleCA5YWMyZWRlLi5jZTY0NTRlIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0U2Fuc0l0YWxpYy5jCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTYW5zSXRhbGljLmMKQEAgLTQsNiArNCw4IEBACiAgCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCisjaW5jbHVkZSAiY2hyb21lZm9udGRhdGEuaCIKKwogY29uc3QgdW5zaWduZWQgY2hhciBnX0ZveGl0U2Fuc0l0YWxpY0ZvbnREYXRhIFsxNjMzOV0gPSB7MHgxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwLCAweDQsIDB4MiwgMHgwLCAweDEsIDB4MSwgMHgxLCAweDE0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MywgMHg2OCwgMHg3MiwgMHg2ZiwgMHg2ZCwgMHg1MywgMHg2MSwgMHg2ZSwKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTYW5zTU0uYyBiL2NvcmUvc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTYW5zTU0uYwppbmRleCAwNWIwYTE2Li5kZDEzODI4IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0U2Fuc01NLmMKKysrIGIvY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdFNhbnNNTS5jCkBAIC00LDYgKzQsOCBAQAogIAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAorI2luY2x1ZGUgImNocm9tZWZvbnRkYXRhLmgiCisKIGNvbnN0IHVuc2lnbmVkIGNoYXIgZ19Gb3hpdFNhbnNNTUZvbnREYXRhIFs2NjkxOV0gPSB7CiAgICAgMHg4MCwgMHgwMSwgMHhEMiwgMHgyOSwgMHgwMCwgMHgwMCwgMHgyNSwgMHgyMSwgMHg1MCwgMHg1MywgMHgyRCwgMHg0MSwgMHg2NCwgMHg2RiwgMHg2MiwgMHg2NSwKICAgICAweDQ2LCAweDZGLCAweDZFLCAweDc0LCAweDJELCAweDMxLCAweDJFLCAweDMwLCAweDNBLCAweDIwLCAweDQzLCAweDY4LCAweDcyLCAweDZmLCAweDZkLCAweDY1LCAweDUzLApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdFNlcmlmLmMgYi9jb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0U2VyaWYuYwppbmRleCBjY2IxMmVkLi42ZjBjMjQyIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0U2VyaWYuYworKysgYi9jb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0U2VyaWYuYwpAQCAtNCw2ICs0LDggQEAKICAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKKyNpbmNsdWRlICJjaHJvbWVmb250ZGF0YS5oIgorCiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRTZXJpZkZvbnREYXRhIFsxOTQ2OV0gPSB7MHgxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MCwgMHg0LCAweDIsIDB4MCwgMHgxLCAweDEsIDB4MSwgMHhlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDMsIDB4NjgsIDB4NzIsIDB4NmYsIDB4NmQsIDB4NTMsIDB4NjUsIDB4NzIsCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0U2VyaWZCb2xkLmMgYi9jb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0U2VyaWZCb2xkLmMKaW5kZXggYmE4NzliZC4uNWY4YTM3MyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdFNlcmlmQm9sZC5jCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTZXJpZkJvbGQuYwpAQCAtNCw2ICs0LDggQEAKICAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKKyNpbmNsdWRlICJjaHJvbWVmb250ZGF0YS5oIgorCiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRTZXJpZkJvbGRGb250RGF0YSBbMTkzOTVdID0gezB4MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwLCAweDQsIDB4MiwgMHgwLCAweDEsIDB4MSwgMHgxLCAweDEzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQzLCAweDY4LCAweDcyLCAweDZmLCAweDZkLCAweDUzLCAweDY1LCAweDcyLApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdFNlcmlmQm9sZEl0YWxpYy5jIGIvY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdFNlcmlmQm9sZEl0YWxpYy5jCmluZGV4IDYzZjg2OTYuLjE2MmJmNDkgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTZXJpZkJvbGRJdGFsaWMuYworKysgYi9jb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0U2VyaWZCb2xkSXRhbGljLmMKQEAgLTQsNiArNCw4IEBACiAgCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCisjaW5jbHVkZSAiY2hyb21lZm9udGRhdGEuaCIKKwogY29uc3QgdW5zaWduZWQgY2hhciBnX0ZveGl0U2VyaWZCb2xkSXRhbGljRm9udERhdGEgWzIwNzMzXSA9IHsweDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MCwgMHg0LCAweDIsIDB4MCwgMHgxLCAweDEsIDB4MSwgMHgxOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MywgMHg2OCwgMHg3MiwgMHg2ZiwgMHg2ZCwgMHg1MywgMHg2NSwgMHg3MiwKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTZXJpZkl0YWxpYy5jIGIvY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdFNlcmlmSXRhbGljLmMKaW5kZXggMjZmNzc4NC4uZmYzNTNmNyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdFNlcmlmSXRhbGljLmMKKysrIGIvY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdFNlcmlmSXRhbGljLmMKQEAgLTQsNiArNCw4IEBACiAgCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCisjaW5jbHVkZSAiY2hyb21lZm9udGRhdGEuaCIKKwogY29uc3QgdW5zaWduZWQgY2hhciBnX0ZveGl0U2VyaWZJdGFsaWNGb250RGF0YSBbMjEyMjddID0gezB4MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAsIDB4NCwgMHgyLCAweDAsIDB4MSwgMHgxLCAweDEsIDB4MTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MywgMHg2OCwgMHg3MiwgMHg2ZiwgMHg2ZCwgMHg1MywgMHg2NSwgMHg3MiwKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTZXJpZk1NLmMgYi9jb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0U2VyaWZNTS5jCmluZGV4IDQ0MDYyY2QuLjQ5NDc4YjYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTZXJpZk1NLmMKKysrIGIvY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdFNlcmlmTU0uYwpAQCAtNCw2ICs0LDggQEAKICAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKKyNpbmNsdWRlICJjaHJvbWVmb250ZGF0YS5oIgorCiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRTZXJpZk1NRm9udERhdGEgWzExMzQxN10gPSB7CiAgICAgMHg4MCwgMHgwMSwgMHhENiwgMHgyOSwgMHgwMCwgMHgwMCwgMHgyNSwgMHgyMSwgMHg1MCwgMHg1MywgMHgyRCwgMHg0MSwgMHg2NCwgMHg2RiwgMHg2MiwgMHg2NSwKICAgICAweDQ2LCAweDZGLCAweDZFLCAweDc0LCAweDJELCAweDMxLCAweDJFLCAweDMwLCAweDNBLCAweDIwLCAweDQzLCAweDY4LCAweDcyLCAweDZmLCAweDZkLCAweDY1LCAweDUzLApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdFN5bWJvbC5jIGIvY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdFN5bWJvbC5jCmluZGV4IDE4Y2RlMzQuLjQ2NWEyMzYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTeW1ib2wuYworKysgYi9jb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0U3ltYm9sLmMKQEAgLTQsNiArNCw4IEBACiAgCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCisjaW5jbHVkZSAiY2hyb21lZm9udGRhdGEuaCIKKwogY29uc3QgdW5zaWduZWQgY2hhciBnX0ZveGl0U3ltYm9sRm9udERhdGEgWzE2NzI5XSA9IHsweDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MCwgMHg0LCAweDIsIDB4MCwgMHgxLCAweDEsIDB4MSwgMHhmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQzLCAweDY4LCAweDcyLCAweDZmLCAweDZkLCAweDUzLCAweDc5LCAweDZkLApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9jaHJvbWVmb250ZGF0YS5oIGIvY29yZS9zcmMvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9jaHJvbWVmb250ZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNjQwNTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhLmgKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfU1JDX0ZYR0VfRk9OVERBVEFfQ0hST01FRk9OVERBVEFfQ0hST01FRk9OVERBVEFfSF8KKyNkZWZpbmUgQ09SRV9TUkNfRlhHRV9GT05UREFUQV9DSFJPTUVGT05UREFUQV9DSFJPTUVGT05UREFUQV9IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRGaXhlZEl0YWxpY0ZvbnREYXRhWzE4NzQ2XTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRGaXhlZEZvbnREYXRhWzE3NTk3XTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRTYW5zSXRhbGljRm9udERhdGFbMTYzMzldOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgZ19Gb3hpdFNhbnNGb250RGF0YVsxNTAyNV07CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBnX0ZveGl0U2VyaWZJdGFsaWNGb250RGF0YVsyMTIyN107CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBnX0ZveGl0U2VyaWZGb250RGF0YVsxOTQ2OV07CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBnX0ZveGl0Rml4ZWRCb2xkSXRhbGljRm9udERhdGFbMTkxNTFdOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgZ19Gb3hpdEZpeGVkQm9sZEZvbnREYXRhWzE4MDU1XTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRTYW5zQm9sZEl0YWxpY0ZvbnREYXRhWzE2NDE4XTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRTYW5zQm9sZEZvbnREYXRhWzE2MzQ0XTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRTZXJpZkJvbGRJdGFsaWNGb250RGF0YVsyMDczM107CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBnX0ZveGl0U2VyaWZCb2xkRm9udERhdGFbMTkzOTVdOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgZ19Gb3hpdFN5bWJvbEZvbnREYXRhWzE2NzI5XTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXREaW5nYmF0c0ZvbnREYXRhWzI5NTEzXTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRTZXJpZk1NRm9udERhdGFbMTEzNDE3XTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRTYW5zTU1Gb250RGF0YVs2NjkxOV07CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gQ09SRV9TUkNfRlhHRV9GT05UREFUQV9DSFJPTUVGT05UREFUQV9DSFJPTUVGT05UREFUQV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9mcmVldHlwZS9meF9mcmVldHlwZS5jIGIvY29yZS9zcmMvZnhnZS9mcmVldHlwZS9meF9mcmVldHlwZS5jCmluZGV4IDc4ZGVjOWEuLjFmZjJjYzYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZnJlZXR5cGUvZnhfZnJlZXR5cGUuYworKysgYi9jb3JlL3NyYy9meGdlL2ZyZWV0eXBlL2Z4X2ZyZWV0eXBlLmMKQEAgLTEsMTEgKzEsMTIgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhnZS9meF9mcmVldHlwZS5oIgotI2luY2x1ZGUgIi4uLy4uLy4uLy4uL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc25hbWVzL3BzdGFibGVzLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc25hbWVzL3BzdGFibGVzLmgiCiAKIHN0YXRpYyBpbnQgeHlxX3NlYXJjaF9ub2RlKGNoYXIqIGdseXBoX25hbWUsIGludCBuYW1lX29mZnNldCwgaW50IHRhYmxlX29mZnNldCwgd2NoYXJfdCB1bmljb2RlKQogewpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZS5jcHAgYi9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlLmNwcAppbmRleCA3NTVhYWQ1Li5mNzc4N2NmIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlLmNwcApAQCAtMSw3NiArMSw2MCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGdlL2Z4X2dlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKKwogI2luY2x1ZGUgInRleHRfaW50LmgiCisKIHN0YXRpYyBDRlhfR0VNb2R1bGUqIGdfcEdFTW9kdWxlID0gTlVMTDsKLUNGWF9HRU1vZHVsZTo6Q0ZYX0dFTW9kdWxlKCkKLXsKLSAgICBtX3BGb250Q2FjaGUgPSBOVUxMOwotICAgIG1fcEZvbnRNZ3IgPSBOVUxMOwotICAgIG1fRlRMaWJyYXJ5ID0gTlVMTDsKLSAgICBtX3BDb2RlY01vZHVsZSA9IE5VTEw7Ci0gICAgbV9wUGxhdGZvcm1EYXRhID0gTlVMTDsKK0NGWF9HRU1vZHVsZTo6Q0ZYX0dFTW9kdWxlKGNvbnN0IGNoYXIqKiBwVXNlckZvbnRQYXRocykgeworICBtX3BGb250Q2FjaGUgPSBOVUxMOworICBtX3BGb250TWdyID0gTlVMTDsKKyAgbV9GVExpYnJhcnkgPSBOVUxMOworICBtX3BDb2RlY01vZHVsZSA9IE5VTEw7CisgIG1fcFBsYXRmb3JtRGF0YSA9IE5VTEw7CisgIG1fcFVzZXJGb250UGF0aHMgPSBwVXNlckZvbnRQYXRoczsKIH0KLUNGWF9HRU1vZHVsZTo6fkNGWF9HRU1vZHVsZSgpCi17Ci0gICAgaWYgKG1fcEZvbnRDYWNoZSkgewotICAgICAgICBkZWxldGUgbV9wRm9udENhY2hlOwotICAgIH0KLSAgICBtX3BGb250Q2FjaGUgPSBOVUxMOwotICAgIGlmIChtX3BGb250TWdyKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BGb250TWdyOwotICAgIH0KLSAgICBtX3BGb250TWdyID0gTlVMTDsKLSAgICBEZXN0cm95UGxhdGZvcm0oKTsKK0NGWF9HRU1vZHVsZTo6fkNGWF9HRU1vZHVsZSgpIHsKKyAgZGVsZXRlIG1fcEZvbnRDYWNoZTsKKyAgbV9wRm9udENhY2hlID0gTlVMTDsKKyAgZGVsZXRlIG1fcEZvbnRNZ3I7CisgIG1fcEZvbnRNZ3IgPSBOVUxMOworICBEZXN0cm95UGxhdGZvcm0oKTsKIH0KLUNGWF9HRU1vZHVsZSogQ0ZYX0dFTW9kdWxlOjpHZXQoKQotewotICAgIHJldHVybiBnX3BHRU1vZHVsZTsKK0NGWF9HRU1vZHVsZSogQ0ZYX0dFTW9kdWxlOjpHZXQoKSB7CisgIHJldHVybiBnX3BHRU1vZHVsZTsKIH0KLXZvaWQgQ0ZYX0dFTW9kdWxlOjpDcmVhdGUoKQotewotICAgIGdfcEdFTW9kdWxlID0gbmV3IENGWF9HRU1vZHVsZTsKLSAgICBnX3BHRU1vZHVsZS0+bV9wRm9udE1nciA9IG5ldyBDRlhfRm9udE1ncjsKLSAgICBnX3BHRU1vZHVsZS0+SW5pdFBsYXRmb3JtKCk7Ci0gICAgZ19wR0VNb2R1bGUtPlNldFRleHRHYW1tYSgyLjJmKTsKK3ZvaWQgQ0ZYX0dFTW9kdWxlOjpDcmVhdGUoY29uc3QgY2hhcioqIHVzZXJGb250UGF0aHMpIHsKKyAgZ19wR0VNb2R1bGUgPSBuZXcgQ0ZYX0dFTW9kdWxlKHVzZXJGb250UGF0aHMpOworICBnX3BHRU1vZHVsZS0+bV9wRm9udE1nciA9IG5ldyBDRlhfRm9udE1ncjsKKyAgZ19wR0VNb2R1bGUtPkluaXRQbGF0Zm9ybSgpOworICBnX3BHRU1vZHVsZS0+U2V0VGV4dEdhbW1hKDIuMmYpOwogfQotdm9pZCBDRlhfR0VNb2R1bGU6OlVzZShDRlhfR0VNb2R1bGUqIHBNb2R1bGUpCi17Ci0gICAgZ19wR0VNb2R1bGUgPSBwTW9kdWxlOwordm9pZCBDRlhfR0VNb2R1bGU6OlVzZShDRlhfR0VNb2R1bGUqIHBNb2R1bGUpIHsKKyAgZ19wR0VNb2R1bGUgPSBwTW9kdWxlOwogfQotdm9pZCBDRlhfR0VNb2R1bGU6OkRlc3Ryb3koKQotewotICAgIGlmIChnX3BHRU1vZHVsZSkgewotICAgICAgICBkZWxldGUgZ19wR0VNb2R1bGU7Ci0gICAgfQotICAgIGdfcEdFTW9kdWxlID0gTlVMTDsKK3ZvaWQgQ0ZYX0dFTW9kdWxlOjpEZXN0cm95KCkgeworICBkZWxldGUgZ19wR0VNb2R1bGU7CisgIGdfcEdFTW9kdWxlID0gTlVMTDsKIH0KLUNGWF9Gb250Q2FjaGUqIENGWF9HRU1vZHVsZTo6R2V0Rm9udENhY2hlKCkKLXsKLSAgICBpZiAobV9wRm9udENhY2hlID09IE5VTEwpIHsKLSAgICAgICAgbV9wRm9udENhY2hlID0gbmV3IENGWF9Gb250Q2FjaGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1fcEZvbnRDYWNoZTsKK0NGWF9Gb250Q2FjaGUqIENGWF9HRU1vZHVsZTo6R2V0Rm9udENhY2hlKCkgeworICBpZiAoIW1fcEZvbnRDYWNoZSkgeworICAgIG1fcEZvbnRDYWNoZSA9IG5ldyBDRlhfRm9udENhY2hlKCk7CisgIH0KKyAgcmV0dXJuIG1fcEZvbnRDYWNoZTsKIH0KLXZvaWQgQ0ZYX0dFTW9kdWxlOjpTZXRUZXh0R2FtbWEoRlhfRkxPQVQgZ2FtbWFWYWx1ZSkKLXsKLSAgICBnYW1tYVZhbHVlIC89IDIuMmY7Ci0gICAgaW50IGkgPSAwOwotICAgIHdoaWxlIChpIDwgMjU2KSB7Ci0gICAgICAgIG1fR2FtbWFWYWx1ZVtpXSA9IChGWF9CWVRFKShGWFNZU19wb3coKEZYX0ZMT0FUKWkgLyAyNTUsIGdhbW1hVmFsdWUpICogMjU1LjBmICsgMC41Zik7Ci0gICAgICAgIGkrKzsKLSAgICB9Cit2b2lkIENGWF9HRU1vZHVsZTo6U2V0VGV4dEdhbW1hKEZYX0ZMT0FUIGdhbW1hVmFsdWUpIHsKKyAgZ2FtbWFWYWx1ZSAvPSAyLjJmOworICBpbnQgaSA9IDA7CisgIHdoaWxlIChpIDwgMjU2KSB7CisgICAgbV9HYW1tYVZhbHVlW2ldID0KKyAgICAgICAgKHVpbnQ4X3QpKEZYU1lTX3BvdygoRlhfRkxPQVQpaSAvIDI1NSwgZ2FtbWFWYWx1ZSkgKiAyNTUuMGYgKyAwLjVmKTsKKyAgICBpKys7CisgIH0KIH0KLUZYX0xQQ0JZVEUgQ0ZYX0dFTW9kdWxlOjpHZXRUZXh0R2FtbWFUYWJsZSgpCi17Ci0gICAgcmV0dXJuIG1fR2FtbWFWYWx1ZTsKLX0KLXZvaWQgQ0ZYX0dFTW9kdWxlOjpTZXRFeHRGb250TWFwcGVyKElGWF9Gb250TWFwcGVyKiBwRm9udE1hcHBlcikKLXsKLSAgICBHZXRGb250TWdyKCktPm1fcEV4dE1hcHBlciA9IHBGb250TWFwcGVyOwotICAgIHBGb250TWFwcGVyLT5tX3BGb250TWdyID0gbV9wRm9udE1ncjsKK2NvbnN0IHVpbnQ4X3QqIENGWF9HRU1vZHVsZTo6R2V0VGV4dEdhbW1hVGFibGUoKSB7CisgIHJldHVybiBtX0dhbW1hVmFsdWU7CiB9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2RldmljZS5jcHAgYi9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2RldmljZS5jcHAKaW5kZXggOWMyNjhiNS4uMjY4MDAxYiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9kZXZpY2UuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfZGV2aWNlLmNwcApAQCAtMSw0MDUgKzEsNDc0IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKLUNGWF9SZW5kZXJEZXZpY2U6OkNGWF9SZW5kZXJEZXZpY2UoKQotewotICAgIG1fcERldmljZURyaXZlciA9IE5VTEw7Ci0gICAgbV9wQml0bWFwID0gTlVMTDsKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9nZS5oIgorCitDRlhfUmVuZGVyRGV2aWNlOjpDRlhfUmVuZGVyRGV2aWNlKCkgeworICBtX3BEZXZpY2VEcml2ZXIgPSBOVUxMOworICBtX3BCaXRtYXAgPSBOVUxMOwogfQotQ0ZYX1JlbmRlckRldmljZTo6fkNGWF9SZW5kZXJEZXZpY2UoKQotewotICAgIGlmIChtX3BEZXZpY2VEcml2ZXIpIHsKLSAgICAgICAgZGVsZXRlIG1fcERldmljZURyaXZlcjsKLSAgICB9CitDRlhfUmVuZGVyRGV2aWNlOjp+Q0ZYX1JlbmRlckRldmljZSgpIHsKKyAgZGVsZXRlIG1fcERldmljZURyaXZlcjsKIH0KLXZvaWQgQ0ZYX1JlbmRlckRldmljZTo6U2V0RGV2aWNlRHJpdmVyKElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIHBEcml2ZXIpCi17Ci0gICAgaWYgKG1fcERldmljZURyaXZlcikgewotICAgICAgICBkZWxldGUgbV9wRGV2aWNlRHJpdmVyOwotICAgIH0KLSAgICBtX3BEZXZpY2VEcml2ZXIgPSBwRHJpdmVyOwotICAgIEluaXREZXZpY2VJbmZvKCk7Cit2b2lkIENGWF9SZW5kZXJEZXZpY2U6OlNldERldmljZURyaXZlcihJRlhfUmVuZGVyRGV2aWNlRHJpdmVyKiBwRHJpdmVyKSB7CisgIGRlbGV0ZSBtX3BEZXZpY2VEcml2ZXI7CisgIG1fcERldmljZURyaXZlciA9IHBEcml2ZXI7CisgIEluaXREZXZpY2VJbmZvKCk7CiB9Ci12b2lkIENGWF9SZW5kZXJEZXZpY2U6OkluaXREZXZpY2VJbmZvKCkKLXsKLSAgICBBU1NFUlQobV9wRGV2aWNlRHJpdmVyICE9IE5VTEwpOwotICAgIG1fV2lkdGggPSBtX3BEZXZpY2VEcml2ZXItPkdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCk7Ci0gICAgbV9IZWlnaHQgPSBtX3BEZXZpY2VEcml2ZXItPkdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpOwotICAgIG1fYnBwID0gbV9wRGV2aWNlRHJpdmVyLT5HZXREZXZpY2VDYXBzKEZYRENfQklUU19QSVhFTCk7Ci0gICAgbV9SZW5kZXJDYXBzID0gbV9wRGV2aWNlRHJpdmVyLT5HZXREZXZpY2VDYXBzKEZYRENfUkVOREVSX0NBUFMpOwotICAgIG1fRGV2aWNlQ2xhc3MgPSBtX3BEZXZpY2VEcml2ZXItPkdldERldmljZUNhcHMoRlhEQ19ERVZJQ0VfQ0xBU1MpOwotICAgIGlmICghbV9wRGV2aWNlRHJpdmVyLT5HZXRDbGlwQm94KCZtX0NsaXBCb3gpKSB7Ci0gICAgICAgIG1fQ2xpcEJveC5sZWZ0ID0gMDsKLSAgICAgICAgbV9DbGlwQm94LnRvcCA9IDA7Ci0gICAgICAgIG1fQ2xpcEJveC5yaWdodCA9IG1fV2lkdGg7Ci0gICAgICAgIG1fQ2xpcEJveC5ib3R0b20gPSBtX0hlaWdodDsKLSAgICB9Ci19Ci1GWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OlN0YXJ0UmVuZGVyaW5nKCkKLXsKLSAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TdGFydFJlbmRlcmluZygpOwotfQotdm9pZCBDRlhfUmVuZGVyRGV2aWNlOjpFbmRSZW5kZXJpbmcoKQotewotICAgIG1fcERldmljZURyaXZlci0+RW5kUmVuZGVyaW5nKCk7Ci19Ci12b2lkIENGWF9SZW5kZXJEZXZpY2U6OlNhdmVTdGF0ZSgpCi17Ci0gICAgbV9wRGV2aWNlRHJpdmVyLT5TYXZlU3RhdGUoKTsKLX0KLXZvaWQgQ0ZYX1JlbmRlckRldmljZTo6UmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCkKLXsKLSAgICBtX3BEZXZpY2VEcml2ZXItPlJlc3RvcmVTdGF0ZShiS2VlcFNhdmVkKTsKLSAgICBVcGRhdGVDbGlwQm94KCk7Ci19Ci1pbnQgQ0ZYX1JlbmRlckRldmljZTo6R2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5HZXREZXZpY2VDYXBzKGNhcHNfaWQpOwotfQotQ0ZYX01hdHJpeCBDRlhfUmVuZGVyRGV2aWNlOjpHZXRDVE0oKSBjb25zdAotewotICAgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPkdldENUTSgpOwotfQotRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpDcmVhdGVDb21wYXRpYmxlQml0bWFwKENGWF9ESUJpdG1hcCogcERJQiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSBjb25zdAotewotICAgIGlmIChtX1JlbmRlckNhcHMgJiBGWFJDX0NNWUtfT1VUUFVUKSB7Ci0gICAgICAgIHJldHVybiBwRElCLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgbV9SZW5kZXJDYXBzICYgRlhSQ19BTFBIQV9PVVRQVVQgPyBGWERJQl9DbXlrYSA6IEZYRElCX0NteWspOwotICAgIH0gZWxzZSBpZiAobV9SZW5kZXJDYXBzICYgRlhSQ19CWVRFTUFTS19PVVRQVVQpIHsKLSAgICAgICAgcmV0dXJuIHBESUItPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl84YnBwTWFzayk7Ci0gICAgfSBlbHNlCi0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgICAgIHJldHVybiBwRElCLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgbV9SZW5kZXJDYXBzICYgRlhSQ19BTFBIQV9PVVRQVVQgPyBGWERJQl9BcmdiIDogRlhESUJfUmdiMzIpOwotI2Vsc2UKLSAgICAgICAgcmV0dXJuIHBESUItPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBtX1JlbmRlckNhcHMgJiBGWFJDX0FMUEhBX09VVFBVVCA/IEZYRElCX0FyZ2IgOiBGWERJQl9SZ2IpOwotI2VuZGlmCi19Ci1GWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OlNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCi0gICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICBpbnQgZmlsbF9tb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgaWYgKCFtX3BEZXZpY2VEcml2ZXItPlNldENsaXBfUGF0aEZpbGwocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSwgZmlsbF9tb2RlKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIFVwZGF0ZUNsaXBCb3goKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6U2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAotICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgaWYgKCFtX3BEZXZpY2VEcml2ZXItPlNldENsaXBfUGF0aFN0cm9rZShwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlLCBwR3JhcGhTdGF0ZSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBVcGRhdGVDbGlwQm94KCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OlNldENsaXBfUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCkKLXsKLSAgICBDRlhfUGF0aERhdGEgcGF0aDsKLSAgICBwYXRoLkFwcGVuZFJlY3QoKEZYX0ZMT0FUKShwUmVjdC0+bGVmdCksIChGWF9GTE9BVCkocFJlY3QtPmJvdHRvbSksIChGWF9GTE9BVCkocFJlY3QtPnJpZ2h0KSwgKEZYX0ZMT0FUKShwUmVjdC0+dG9wKSk7Ci0gICAgaWYgKCFTZXRDbGlwX1BhdGhGaWxsKCZwYXRoLCBOVUxMLCBGWEZJTExfV0lORElORykpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBVcGRhdGVDbGlwQm94KCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci12b2lkIENGWF9SZW5kZXJEZXZpY2U6OlVwZGF0ZUNsaXBCb3goKQotewotICAgIGlmIChtX3BEZXZpY2VEcml2ZXItPkdldENsaXBCb3goJm1fQ2xpcEJveCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KK3ZvaWQgQ0ZYX1JlbmRlckRldmljZTo6SW5pdERldmljZUluZm8oKSB7CisgIG1fV2lkdGggPSBtX3BEZXZpY2VEcml2ZXItPkdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCk7CisgIG1fSGVpZ2h0ID0gbV9wRGV2aWNlRHJpdmVyLT5HZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKTsKKyAgbV9icHAgPSBtX3BEZXZpY2VEcml2ZXItPkdldERldmljZUNhcHMoRlhEQ19CSVRTX1BJWEVMKTsKKyAgbV9SZW5kZXJDYXBzID0gbV9wRGV2aWNlRHJpdmVyLT5HZXREZXZpY2VDYXBzKEZYRENfUkVOREVSX0NBUFMpOworICBtX0RldmljZUNsYXNzID0gbV9wRGV2aWNlRHJpdmVyLT5HZXREZXZpY2VDYXBzKEZYRENfREVWSUNFX0NMQVNTKTsKKyAgaWYgKCFtX3BEZXZpY2VEcml2ZXItPkdldENsaXBCb3goJm1fQ2xpcEJveCkpIHsKICAgICBtX0NsaXBCb3gubGVmdCA9IDA7CiAgICAgbV9DbGlwQm94LnRvcCA9IDA7CiAgICAgbV9DbGlwQm94LnJpZ2h0ID0gbV9XaWR0aDsKICAgICBtX0NsaXBCb3guYm90dG9tID0gbV9IZWlnaHQ7CisgIH0KK30KK0ZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6U3RhcnRSZW5kZXJpbmcoKSB7CisgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPlN0YXJ0UmVuZGVyaW5nKCk7Cit9Cit2b2lkIENGWF9SZW5kZXJEZXZpY2U6OkVuZFJlbmRlcmluZygpIHsKKyAgbV9wRGV2aWNlRHJpdmVyLT5FbmRSZW5kZXJpbmcoKTsKK30KK3ZvaWQgQ0ZYX1JlbmRlckRldmljZTo6U2F2ZVN0YXRlKCkgeworICBtX3BEZXZpY2VEcml2ZXItPlNhdmVTdGF0ZSgpOworfQordm9pZCBDRlhfUmVuZGVyRGV2aWNlOjpSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkKSB7CisgIG1fcERldmljZURyaXZlci0+UmVzdG9yZVN0YXRlKGJLZWVwU2F2ZWQpOworICBVcGRhdGVDbGlwQm94KCk7Cit9CitpbnQgQ0ZYX1JlbmRlckRldmljZTo6R2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCkgY29uc3QgeworICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5HZXREZXZpY2VDYXBzKGNhcHNfaWQpOworfQorQ0ZYX01hdHJpeCBDRlhfUmVuZGVyRGV2aWNlOjpHZXRDVE0oKSBjb25zdCB7CisgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPkdldENUTSgpOworfQorRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpDcmVhdGVDb21wYXRpYmxlQml0bWFwKENGWF9ESUJpdG1hcCogcERJQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCkgY29uc3QgeworICBpZiAobV9SZW5kZXJDYXBzICYgRlhSQ19DTVlLX09VVFBVVCkgeworICAgIHJldHVybiBwRElCLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgbV9SZW5kZXJDYXBzICYgRlhSQ19BTFBIQV9PVVRQVVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEZYRElCX0NteWthCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGWERJQl9DbXlrKTsKKyAgfQorICBpZiAobV9SZW5kZXJDYXBzICYgRlhSQ19CWVRFTUFTS19PVVRQVVQpIHsKKyAgICByZXR1cm4gcERJQi0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCXzhicHBNYXNrKTsKKyAgfQorI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisgIHJldHVybiBwRElCLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgbV9SZW5kZXJDYXBzICYgRlhSQ19BTFBIQV9PVVRQVVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBGWERJQl9BcmdiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhESUJfUmdiMzIpOworI2Vsc2UKKyAgcmV0dXJuIHBESUItPkNyZWF0ZSgKKyAgICAgIHdpZHRoLCBoZWlnaHQsIG1fUmVuZGVyQ2FwcyAmIEZYUkNfQUxQSEFfT1VUUFVUID8gRlhESUJfQXJnYiA6IEZYRElCX1JnYik7CisjZW5kaWYKK30KK0ZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6U2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlKSB7CisgIGlmICghbV9wRGV2aWNlRHJpdmVyLT5TZXRDbGlwX1BhdGhGaWxsKHBQYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfbW9kZSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgVXBkYXRlQ2xpcEJveCgpOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6U2V0Q2xpcF9QYXRoU3Ryb2tlKAorICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUpIHsKKyAgaWYgKCFtX3BEZXZpY2VEcml2ZXItPlNldENsaXBfUGF0aFN0cm9rZShwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBHcmFwaFN0YXRlKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBVcGRhdGVDbGlwQm94KCk7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRDbGlwX1JlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QpIHsKKyAgQ0ZYX1BhdGhEYXRhIHBhdGg7CisgIHBhdGguQXBwZW5kUmVjdCgoRlhfRkxPQVQpKHBSZWN0LT5sZWZ0KSwgKEZYX0ZMT0FUKShwUmVjdC0+Ym90dG9tKSwKKyAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCkocFJlY3QtPnJpZ2h0KSwgKEZYX0ZMT0FUKShwUmVjdC0+dG9wKSk7CisgIGlmICghU2V0Q2xpcF9QYXRoRmlsbCgmcGF0aCwgTlVMTCwgRlhGSUxMX1dJTkRJTkcpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIFVwZGF0ZUNsaXBCb3goKTsKKyAgcmV0dXJuIFRSVUU7Cit9Cit2b2lkIENGWF9SZW5kZXJEZXZpY2U6OlVwZGF0ZUNsaXBCb3goKSB7CisgIGlmIChtX3BEZXZpY2VEcml2ZXItPkdldENsaXBCb3goJm1fQ2xpcEJveCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbV9DbGlwQm94LmxlZnQgPSAwOworICBtX0NsaXBCb3gudG9wID0gMDsKKyAgbV9DbGlwQm94LnJpZ2h0ID0gbV9XaWR0aDsKKyAgbV9DbGlwQm94LmJvdHRvbSA9IG1fSGVpZ2h0OwogfQogRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLCBGWF9EV09SRCBzdHJva2VfY29sb3IsIGludCBmaWxsX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKLXsKLSAgICBGWF9CWVRFIGZpbGxfYWxwaGEsIHN0cm9rZV9hbHBoYTsKLSAgICBpZiAoRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSkgewotICAgICAgICBmaWxsX2FscGhhID0gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZyk7Ci0gICAgICAgIHN0cm9rZV9hbHBoYSA9IEZYR0VURkxBR19BTFBIQV9TVFJPS0UoYWxwaGFfZmxhZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0cm9rZV9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7CisgIHVpbnQ4X3QgZmlsbF9hbHBoYSwgc3Ryb2tlX2FscGhhOworICBpZiAoRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSkgeworICAgIGZpbGxfYWxwaGEgPSBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKTsKKyAgICBzdHJva2VfYWxwaGEgPSBGWEdFVEZMQUdfQUxQSEFfU1RST0tFKGFscGhhX2ZsYWcpOworICB9IGVsc2UgeworICAgIGZpbGxfYWxwaGEgPSBGWEFSR0JfQShmaWxsX2NvbG9yKTsKKyAgICBzdHJva2VfYWxwaGEgPSBGWEFSR0JfQShzdHJva2VfY29sb3IpOworICB9CisgIGlmICgoZmlsbF9tb2RlICYgMykgPT0gMCkgeworICAgIGZpbGxfYWxwaGEgPSAwOworICB9CisgIGlmICghcEdyYXBoU3RhdGUpIHsKKyAgICBzdHJva2VfYWxwaGEgPSAwOworICB9CisgIGlmIChzdHJva2VfYWxwaGEgPT0gMCAmJiBwUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSA9PSAyKSB7CisgICAgRlhfUEFUSFBPSU5UKiBwUG9pbnRzID0gcFBhdGhEYXRhLT5HZXRQb2ludHMoKTsKKyAgICBGWF9GTE9BVCB4MSwgeDIsIHkxLCB5MjsKKyAgICBpZiAocE9iamVjdDJEZXZpY2UpIHsKKyAgICAgIHBPYmplY3QyRGV2aWNlLT5UcmFuc2Zvcm0ocFBvaW50c1swXS5tX1BvaW50WCwgcFBvaW50c1swXS5tX1BvaW50WSwgeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkxKTsKKyAgICAgIHBPYmplY3QyRGV2aWNlLT5UcmFuc2Zvcm0ocFBvaW50c1sxXS5tX1BvaW50WCwgcFBvaW50c1sxXS5tX1BvaW50WSwgeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkyKTsKICAgICB9IGVsc2UgewotICAgICAgICBmaWxsX2FscGhhID0gRlhBUkdCX0EoZmlsbF9jb2xvcik7Ci0gICAgICAgIHN0cm9rZV9hbHBoYSA9IEZYQVJHQl9BKHN0cm9rZV9jb2xvcik7CisgICAgICB4MSA9IHBQb2ludHNbMF0ubV9Qb2ludFg7CisgICAgICB5MSA9IHBQb2ludHNbMF0ubV9Qb2ludFk7CisgICAgICB4MiA9IHBQb2ludHNbMV0ubV9Qb2ludFg7CisgICAgICB5MiA9IHBQb2ludHNbMV0ubV9Qb2ludFk7CiAgICAgfQotICAgIGlmICgoZmlsbF9tb2RlICYgMykgPT0gMCkgewotICAgICAgICBmaWxsX2FscGhhID0gMDsKLSAgICB9Ci0gICAgaWYgKHBHcmFwaFN0YXRlID09IE5VTEwpIHsKLSAgICAgICAgc3Ryb2tlX2FscGhhID0gMDsKLSAgICB9Ci0gICAgaWYgKHN0cm9rZV9hbHBoYSA9PSAwICYmIHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID09IDIpIHsKLSAgICAgICAgRlhfUEFUSFBPSU5UKiBwUG9pbnRzID0gcFBhdGhEYXRhLT5HZXRQb2ludHMoKTsKLSAgICAgICAgRlhfRkxPQVQgeDEsIHgyLCB5MSwgeTI7Ci0gICAgICAgIGlmIChwT2JqZWN0MkRldmljZSkgewotICAgICAgICAgICAgcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybShwUG9pbnRzWzBdLm1fUG9pbnRYLCBwUG9pbnRzWzBdLm1fUG9pbnRZLCB4MSwgeTEpOwotICAgICAgICAgICAgcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybShwUG9pbnRzWzFdLm1fUG9pbnRYLCBwUG9pbnRzWzFdLm1fUG9pbnRZLCB4MiwgeTIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgeDEgPSBwUG9pbnRzWzBdLm1fUG9pbnRYOwotICAgICAgICAgICAgeTEgPSBwUG9pbnRzWzBdLm1fUG9pbnRZOwotICAgICAgICAgICAgeDIgPSBwUG9pbnRzWzFdLm1fUG9pbnRYOwotICAgICAgICAgICAgeTIgPSBwUG9pbnRzWzFdLm1fUG9pbnRZOwotICAgICAgICB9Ci0gICAgICAgIERyYXdDb3NtZXRpY0xpbmUoeDEsIHkxLCB4MiwgeTIsIGZpbGxfY29sb3IsIGZpbGxfbW9kZSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBpZiAoKHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID09IDUgfHwgcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgPT0gNCkgJiYgc3Ryb2tlX2FscGhhID09IDApIHsKLSAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0X2Y7Ci0gICAgICAgIGlmICghKGZpbGxfbW9kZSAmIEZYRklMTF9SRUNUX0FBKSAmJiBwUGF0aERhdGEtPklzUmVjdChwT2JqZWN0MkRldmljZSwgJnJlY3RfZikpIHsKLSAgICAgICAgICAgIEZYX1JFQ1QgcmVjdF9pID0gcmVjdF9mLkdldE91dHRlclJlY3QoKTsKLSAgICAgICAgICAgIGludCB3aWR0aCA9IChpbnQpRlhTWVNfY2VpbChyZWN0X2YucmlnaHQgLSByZWN0X2YubGVmdCk7Ci0gICAgICAgICAgICBpZiAod2lkdGggPCAxKSB7Ci0gICAgICAgICAgICAgICAgd2lkdGggPSAxOwotICAgICAgICAgICAgICAgIGlmIChyZWN0X2kubGVmdCA9PSByZWN0X2kucmlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVjdF9pLnJpZ2h0ICsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBoZWlnaHQgPSAoaW50KUZYU1lTX2NlaWwocmVjdF9mLnRvcCAtIHJlY3RfZi5ib3R0b20pOwotICAgICAgICAgICAgaWYgKGhlaWdodCA8IDEpIHsKLSAgICAgICAgICAgICAgICBoZWlnaHQgPSAxOwotICAgICAgICAgICAgICAgIGlmIChyZWN0X2kuYm90dG9tID09IHJlY3RfaS50b3ApIHsKLSAgICAgICAgICAgICAgICAgICAgcmVjdF9pLmJvdHRvbSArKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVjdF9pLldpZHRoKCkgPj0gd2lkdGggKyAxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlY3RfZi5sZWZ0IC0gKEZYX0ZMT0FUKShyZWN0X2kubGVmdCkgPiAoRlhfRkxPQVQpKHJlY3RfaS5yaWdodCkgLSByZWN0X2YucmlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVjdF9pLmxlZnQgKys7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVjdF9pLnJpZ2h0IC0tOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZWN0X2kuSGVpZ2h0KCkgPj0gaGVpZ2h0ICsgMSkgewotICAgICAgICAgICAgICAgIGlmIChyZWN0X2YudG9wIC0gKEZYX0ZMT0FUKShyZWN0X2kudG9wKSA+IChGWF9GTE9BVCkocmVjdF9pLmJvdHRvbSkgLSByZWN0X2YuYm90dG9tKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlY3RfaS50b3AgKys7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVjdF9pLmJvdHRvbSAtLTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoRmlsbFJlY3QoJnJlY3RfaSwgZmlsbF9jb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZigoZmlsbF9tb2RlICYgMykgJiYgc3Ryb2tlX2FscGhhID09IDAgJiYgIShmaWxsX21vZGUgJiBGWF9GSUxMX1NUUk9LRSkgJiYgIShmaWxsX21vZGUgJiBGWF9GSUxMX1RFWFRfTU9ERSkpIHsKLSAgICAgICAgQ0ZYX1BhdGhEYXRhIG5ld1BhdGg7Ci0gICAgICAgIEZYX0JPT0wgYlRoaW4gPSBGQUxTRTsKLSAgICAgICAgaWYgKHBQYXRoRGF0YS0+R2V0WmVyb0FyZWFQYXRoKG5ld1BhdGgsIChDRlhfTWF0cml4KilwT2JqZWN0MkRldmljZSwgYlRoaW4sIG1fcERldmljZURyaXZlci0+R2V0RHJpdmVyVHlwZSgpKSkgewotICAgICAgICAgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdyYXBoU3RhdGU7Ci0gICAgICAgICAgICBncmFwaFN0YXRlLm1fTGluZVdpZHRoID0gMC4wZjsKLSAgICAgICAgICAgIEZYX0RXT1JEIHN0cm9rZWNvbG9yID0gZmlsbF9jb2xvcjsKLSAgICAgICAgICAgIGlmIChiVGhpbikgewotICAgICAgICAgICAgICAgIGlmIChGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZYU0VURkxBR19BTFBIQV9TVFJPS0UoYWxwaGFfZmxhZywgZmlsbF9hbHBoYSA+PiAyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzdHJva2Vjb2xvciA9ICgoKGZpbGxfYWxwaGEgPj4gMikgPDwgMjQpIHwgKHN0cm9rZWNvbG9yICYgMHgwMGZmZmZmZikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXggPSBOVUxMOwotICAgICAgICAgICAgaWYgKHBPYmplY3QyRGV2aWNlICYmICFwT2JqZWN0MkRldmljZS0+SXNJZGVudGl0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcE1hdHJpeCA9IChDRlhfQWZmaW5lTWF0cml4KilwT2JqZWN0MkRldmljZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBzbW9vdGhfcGF0aCA9IEZYX1pFUk9BUkVBX0ZJTEw7Ci0gICAgICAgICAgICBpZiAoZmlsbF9tb2RlICYgRlhGSUxMX05PUEFUSFNNT09USCkgewotICAgICAgICAgICAgICAgIHNtb290aF9wYXRoIHw9IEZYRklMTF9OT1BBVEhTTU9PVEg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX3BEZXZpY2VEcml2ZXItPkRyYXdQYXRoKCZuZXdQYXRoLCBwTWF0cml4LCAmZ3JhcGhTdGF0ZSwgMCwgc3Ryb2tlY29sb3IsIHNtb290aF9wYXRoLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoKGZpbGxfbW9kZSAmIDMpICYmIGZpbGxfYWxwaGEgJiYgc3Ryb2tlX2FscGhhIDwgMHhmZiAmJiAoZmlsbF9tb2RlICYgRlhfRklMTF9TVFJPS0UpKSB7Ci0gICAgICAgIGlmICghKG1fUmVuZGVyQ2FwcyAmIEZYUkNfR0VUX0JJVFMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0Zsb2F0UmVjdCBiYm94OwotICAgICAgICBpZiAocEdyYXBoU3RhdGUpIHsKLSAgICAgICAgICAgIGJib3ggPSBwUGF0aERhdGEtPkdldEJvdW5kaW5nQm94KHBHcmFwaFN0YXRlLT5tX0xpbmVXaWR0aCwgcEdyYXBoU3RhdGUtPm1fTWl0ZXJMaW1pdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBiYm94ID0gcFBhdGhEYXRhLT5HZXRCb3VuZGluZ0JveCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwT2JqZWN0MkRldmljZSkgewotICAgICAgICAgICAgYmJveC5UcmFuc2Zvcm0ocE9iamVjdDJEZXZpY2UpOwotICAgICAgICB9Ci0gICAgICAgIENGWF9NYXRyaXggY3RtID0gR2V0Q1RNKCk7Ci0gICAgICAgIEZYX0ZMT0FUIGZTY2FsZVggPSBGWFNZU19mYWJzKGN0bS5hKTsKLSAgICAgICAgRlhfRkxPQVQgZlNjYWxlWSA9IEZYU1lTX2ZhYnMoY3RtLmQpOwotICAgICAgICBGWF9SRUNUIHJlY3QgPSBiYm94LkdldE91dHRlclJlY3QoKTsKLSAgICAgICAgQ0ZYX0RJQml0bWFwIGJpdG1hcCwgQmFja2Ryb3A7Ci0gICAgICAgIGlmICghQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcCgmYml0bWFwLCBGWFNZU19yb3VuZChyZWN0LldpZHRoKCkgKiBmU2NhbGVYKSwgRlhTWVNfcm91bmQocmVjdC5IZWlnaHQoKSAqIGZTY2FsZVkpKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaXRtYXAuSGFzQWxwaGEoKSkgewotICAgICAgICAgICAgYml0bWFwLkNsZWFyKDApOwotICAgICAgICAgICAgQmFja2Ryb3AuQ29weSgmYml0bWFwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghbV9wRGV2aWNlRHJpdmVyLT5HZXRESUJpdHMoJmJpdG1hcCwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgTlVMTCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCYWNrZHJvcC5Db3B5KCZiaXRtYXApOwotICAgICAgICB9Ci0gICAgICAgIENGWF9GeGdlRGV2aWNlIGJpdG1hcF9kZXZpY2U7Ci0gICAgICAgIGJpdG1hcF9kZXZpY2UuQXR0YWNoKCZiaXRtYXAsIDAsIEZBTFNFLCAmQmFja2Ryb3AsIFRSVUUpOwotICAgICAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKLSAgICAgICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7Ci0gICAgICAgICAgICBtYXRyaXggPSAqcE9iamVjdDJEZXZpY2U7Ci0gICAgICAgIH0KLSAgICAgICAgbWF0cml4LlRyYW5zbGF0ZUkoLXJlY3QubGVmdCwgLXJlY3QudG9wKTsKLSAgICAgICAgbWF0cml4LkNvbmNhdChmU2NhbGVYLCAwLCAwLCBmU2NhbGVZLCAwLCAwKTsKLSAgICAgICAgaWYgKCFiaXRtYXBfZGV2aWNlLkdldERldmljZURyaXZlcigpLT5EcmF3UGF0aChwUGF0aERhdGEsICZtYXRyaXgsIHBHcmFwaFN0YXRlLCBmaWxsX2NvbG9yLCBzdHJva2VfY29sb3IsIGZpbGxfbW9kZSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIEZYU1lTX3JvdW5kKHJlY3QuV2lkdGgoKSAqIGZTY2FsZVgpLCBGWFNZU19yb3VuZChyZWN0LkhlaWdodCgpICogZlNjYWxlWSkpOwotICAgICAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TZXRESUJpdHMoJmJpdG1hcCwgMCwgJnNyY19yZWN0LCByZWN0LmxlZnQsIHJlY3QudG9wLCBGWERJQl9CTEVORF9OT1JNQUwpOwotICAgIH0KLSAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5EcmF3UGF0aChwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlLCBwR3JhcGhTdGF0ZSwgZmlsbF9jb2xvciwgc3Ryb2tlX2NvbG9yLCBmaWxsX21vZGUsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX3R5cGUpOwotfQotRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBpZiAobV9wRGV2aWNlRHJpdmVyLT5TZXRQaXhlbCh4LCB5LCBjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIEZYX1JFQ1QgcmVjdCh4LCB5LCB4ICsgMSwgeSArIDEpOwotICAgIHJldHVybiBGaWxsUmVjdCgmcmVjdCwgY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwotfQotRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgZmlsbF9jb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQotewotICAgIGlmIChtX3BEZXZpY2VEcml2ZXItPkZpbGxSZWN0KHBSZWN0LCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKCEobV9SZW5kZXJDYXBzICYgRlhSQ19HRVRfQklUUykpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDRlhfRElCaXRtYXAgYml0bWFwOwotICAgIGlmICghQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcCgmYml0bWFwLCBwUmVjdC0+V2lkdGgoKSwgcFJlY3QtPkhlaWdodCgpKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmICghbV9wRGV2aWNlRHJpdmVyLT5HZXRESUJpdHMoJmJpdG1hcCwgcFJlY3QtPmxlZnQsIHBSZWN0LT50b3ApKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKCFiaXRtYXAuQ29tcG9zaXRlUmVjdCgwLCAwLCBwUmVjdC0+V2lkdGgoKSwgcFJlY3QtPkhlaWdodCgpLCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgcFJlY3QtPldpZHRoKCksIHBSZWN0LT5IZWlnaHQoKSk7Ci0gICAgbV9wRGV2aWNlRHJpdmVyLT5TZXRESUJpdHMoJmJpdG1hcCwgMCwgJnNyY19yZWN0LCBwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgRlhESUJfQkxFTkRfTk9STUFMKTsKKyAgICBEcmF3Q29zbWV0aWNMaW5lKHgxLCB5MSwgeDIsIHkyLCBmaWxsX2NvbG9yLCBmaWxsX21vZGUsIGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKTsKICAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6RHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsCi0gICAgICAgIGludCBmaWxsX21vZGUsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKLXsKLSAgICBpZiAoKChtX1JlbmRlckNhcHMgJiBGWFJDX0FMUEhBX1BBVEgpICYmCi0gICAgICAgICAgICAoRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSAmJiBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKSA9PSAweGZmKSkgfHwKLSAgICAgICAgICAgIGNvbG9yID49IDB4ZmYwMDAwMDApCi0gICAgICAgIGlmIChtX3BEZXZpY2VEcml2ZXItPkRyYXdDb3NtZXRpY0xpbmUoeDEsIHkxLCB4MiwgeTIsIGNvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKChwUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSA9PSA1IHx8IHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID09IDQpICYmCisgICAgICBzdHJva2VfYWxwaGEgPT0gMCkgeworICAgIENGWF9GbG9hdFJlY3QgcmVjdF9mOworICAgIGlmICghKGZpbGxfbW9kZSAmIEZYRklMTF9SRUNUX0FBKSAmJgorICAgICAgICBwUGF0aERhdGEtPklzUmVjdChwT2JqZWN0MkRldmljZSwgJnJlY3RfZikpIHsKKyAgICAgIEZYX1JFQ1QgcmVjdF9pID0gcmVjdF9mLkdldE91dHRlclJlY3QoKTsKKyAgICAgIGludCB3aWR0aCA9IChpbnQpRlhTWVNfY2VpbChyZWN0X2YucmlnaHQgLSByZWN0X2YubGVmdCk7CisgICAgICBpZiAod2lkdGggPCAxKSB7CisgICAgICAgIHdpZHRoID0gMTsKKyAgICAgICAgaWYgKHJlY3RfaS5sZWZ0ID09IHJlY3RfaS5yaWdodCkgeworICAgICAgICAgIHJlY3RfaS5yaWdodCsrOwogICAgICAgICB9Ci0gICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdyYXBoX3N0YXRlOwotICAgIENGWF9QYXRoRGF0YSBwYXRoOwotICAgIHBhdGguU2V0UG9pbnRDb3VudCgyKTsKLSAgICBwYXRoLlNldFBvaW50KDAsIHgxLCB5MSwgRlhQVF9NT1ZFVE8pOwotICAgIHBhdGguU2V0UG9pbnQoMSwgeDIsIHkyLCBGWFBUX0xJTkVUTyk7Ci0gICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+RHJhd1BhdGgoJnBhdGgsIE5VTEwsICZncmFwaF9zdGF0ZSwgMCwgY29sb3IsIGZpbGxfbW9kZSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSk7Ci19Ci1GWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OkdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIGlmICghKG1fUmVuZGVyQ2FwcyAmIEZYUkNfR0VUX0JJVFMpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGludCBoZWlnaHQgPSAoaW50KUZYU1lTX2NlaWwocmVjdF9mLnRvcCAtIHJlY3RfZi5ib3R0b20pOworICAgICAgaWYgKGhlaWdodCA8IDEpIHsKKyAgICAgICAgaGVpZ2h0ID0gMTsKKyAgICAgICAgaWYgKHJlY3RfaS5ib3R0b20gPT0gcmVjdF9pLnRvcCkgeworICAgICAgICAgIHJlY3RfaS5ib3R0b20rKzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHJlY3RfaS5XaWR0aCgpID49IHdpZHRoICsgMSkgeworICAgICAgICBpZiAocmVjdF9mLmxlZnQgLSAoRlhfRkxPQVQpKHJlY3RfaS5sZWZ0KSA+CisgICAgICAgICAgICAoRlhfRkxPQVQpKHJlY3RfaS5yaWdodCkgLSByZWN0X2YucmlnaHQpIHsKKyAgICAgICAgICByZWN0X2kubGVmdCsrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlY3RfaS5yaWdodC0tOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAocmVjdF9pLkhlaWdodCgpID49IGhlaWdodCArIDEpIHsKKyAgICAgICAgaWYgKHJlY3RfZi50b3AgLSAoRlhfRkxPQVQpKHJlY3RfaS50b3ApID4KKyAgICAgICAgICAgIChGWF9GTE9BVCkocmVjdF9pLmJvdHRvbSkgLSByZWN0X2YuYm90dG9tKSB7CisgICAgICAgICAgcmVjdF9pLnRvcCsrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlY3RfaS5ib3R0b20tLTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKEZpbGxSZWN0KCZyZWN0X2ksIGZpbGxfY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgYmxlbmRfdHlwZSkpIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPkdldERJQml0cyhwQml0bWFwLCBsZWZ0LCB0b3AsIHBJY2NUcmFuc2Zvcm0pOwotfQotQ0ZYX0RJQml0bWFwKiBDRlhfUmVuZGVyRGV2aWNlOjpHZXRCYWNrRHJvcCgpCi17Ci0gICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+R2V0QmFja0Ryb3AoKTsKLX0KLUZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6U2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgQVNTRVJUKCFwQml0bWFwLT5Jc0FscGhhTWFzaygpKTsKLSAgICBDRlhfQWZmaW5lTWF0cml4IGN0bSA9IEdldENUTSgpOworICB9CisgIGlmICgoZmlsbF9tb2RlICYgMykgJiYgc3Ryb2tlX2FscGhhID09IDAgJiYgIShmaWxsX21vZGUgJiBGWF9GSUxMX1NUUk9LRSkgJiYKKyAgICAgICEoZmlsbF9tb2RlICYgRlhfRklMTF9URVhUX01PREUpKSB7CisgICAgQ0ZYX1BhdGhEYXRhIG5ld1BhdGg7CisgICAgRlhfQk9PTCBiVGhpbiA9IEZBTFNFOworICAgIGlmIChwUGF0aERhdGEtPkdldFplcm9BcmVhUGF0aChuZXdQYXRoLCAoQ0ZYX01hdHJpeCopcE9iamVjdDJEZXZpY2UsIGJUaGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BEZXZpY2VEcml2ZXItPkdldERyaXZlclR5cGUoKSkpIHsKKyAgICAgIENGWF9HcmFwaFN0YXRlRGF0YSBncmFwaFN0YXRlOworICAgICAgZ3JhcGhTdGF0ZS5tX0xpbmVXaWR0aCA9IDAuMGY7CisgICAgICBGWF9EV09SRCBzdHJva2Vjb2xvciA9IGZpbGxfY29sb3I7CisgICAgICBpZiAoYlRoaW4pIHsKKyAgICAgICAgaWYgKEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykpIHsKKyAgICAgICAgICBGWFNFVEZMQUdfQUxQSEFfU1RST0tFKGFscGhhX2ZsYWcsIGZpbGxfYWxwaGEgPj4gMik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3Ryb2tlY29sb3IgPQorICAgICAgICAgICAgICAoKChmaWxsX2FscGhhID4+IDIpIDw8IDI0KSB8IChzdHJva2Vjb2xvciAmIDB4MDBmZmZmZmYpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEw7CisgICAgICBpZiAocE9iamVjdDJEZXZpY2UgJiYgIXBPYmplY3QyRGV2aWNlLT5Jc0lkZW50aXR5KCkpIHsKKyAgICAgICAgcE1hdHJpeCA9IChDRlhfTWF0cml4KilwT2JqZWN0MkRldmljZTsKKyAgICAgIH0KKyAgICAgIGludCBzbW9vdGhfcGF0aCA9IEZYX1pFUk9BUkVBX0ZJTEw7CisgICAgICBpZiAoZmlsbF9tb2RlICYgRlhGSUxMX05PUEFUSFNNT09USCkgeworICAgICAgICBzbW9vdGhfcGF0aCB8PSBGWEZJTExfTk9QQVRIU01PT1RIOworICAgICAgfQorICAgICAgbV9wRGV2aWNlRHJpdmVyLT5EcmF3UGF0aCgmbmV3UGF0aCwgcE1hdHJpeCwgJmdyYXBoU3RhdGUsIDAsIHN0cm9rZWNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbW9vdGhfcGF0aCwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRfdHlwZSk7CisgICAgfQorICB9CisgIGlmICgoZmlsbF9tb2RlICYgMykgJiYgZmlsbF9hbHBoYSAmJiBzdHJva2VfYWxwaGEgPCAweGZmICYmCisgICAgICAoZmlsbF9tb2RlICYgRlhfRklMTF9TVFJPS0UpKSB7CisgICAgaWYgKCEobV9SZW5kZXJDYXBzICYgRlhSQ19HRVRfQklUUykpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgQ0ZYX0Zsb2F0UmVjdCBiYm94OworICAgIGlmIChwR3JhcGhTdGF0ZSkgeworICAgICAgYmJveCA9IHBQYXRoRGF0YS0+R2V0Qm91bmRpbmdCb3gocEdyYXBoU3RhdGUtPm1fTGluZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEdyYXBoU3RhdGUtPm1fTWl0ZXJMaW1pdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGJib3ggPSBwUGF0aERhdGEtPkdldEJvdW5kaW5nQm94KCk7CisgICAgfQorICAgIGlmIChwT2JqZWN0MkRldmljZSkgeworICAgICAgYmJveC5UcmFuc2Zvcm0ocE9iamVjdDJEZXZpY2UpOworICAgIH0KKyAgICBDRlhfTWF0cml4IGN0bSA9IEdldENUTSgpOwogICAgIEZYX0ZMT0FUIGZTY2FsZVggPSBGWFNZU19mYWJzKGN0bS5hKTsKICAgICBGWF9GTE9BVCBmU2NhbGVZID0gRlhTWVNfZmFicyhjdG0uZCk7Ci0gICAgRlhfUkVDVCBkZXN0X3JlY3QobGVmdCwgdG9wLCBGWFNZU19yb3VuZChsZWZ0ICsgcEJpdG1hcC0+R2V0V2lkdGgoKSAvIGZTY2FsZVgpLCBGWFNZU19yb3VuZCh0b3AgKyBwQml0bWFwLT5HZXRIZWlnaHQoKSAvIGZTY2FsZVkpKTsKLSAgICBkZXN0X3JlY3QuSW50ZXJzZWN0KG1fQ2xpcEJveCk7Ci0gICAgaWYgKGRlc3RfcmVjdC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgRlhfUkVDVCByZWN0ID0gYmJveC5HZXRPdXR0ZXJSZWN0KCk7CisgICAgQ0ZYX0RJQml0bWFwIGJpdG1hcCwgQmFja2Ryb3A7CisgICAgaWYgKCFDcmVhdGVDb21wYXRpYmxlQml0bWFwKCZiaXRtYXAsIEZYU1lTX3JvdW5kKHJlY3QuV2lkdGgoKSAqIGZTY2FsZVgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChyZWN0LkhlaWdodCgpICogZlNjYWxlWSkpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIEZYX1JFQ1Qgc3JjX3JlY3QoZGVzdF9yZWN0LmxlZnQgLSBsZWZ0LCBkZXN0X3JlY3QudG9wIC0gdG9wLAotICAgICAgICAgICAgICAgICAgICAgZGVzdF9yZWN0LmxlZnQgLSBsZWZ0ICsgZGVzdF9yZWN0LldpZHRoKCksIGRlc3RfcmVjdC50b3AgLSB0b3AgKyBkZXN0X3JlY3QuSGVpZ2h0KCkpOwotICAgIHNyY19yZWN0LmxlZnQgPSBGWFNZU19yb3VuZChzcmNfcmVjdC5sZWZ0ICogZlNjYWxlWCk7Ci0gICAgc3JjX3JlY3QudG9wID0gRlhTWVNfcm91bmQoc3JjX3JlY3QudG9wICogZlNjYWxlWSk7Ci0gICAgc3JjX3JlY3QucmlnaHQgPSBGWFNZU19yb3VuZChzcmNfcmVjdC5yaWdodCAqIGZTY2FsZVgpOwotICAgIHNyY19yZWN0LmJvdHRvbSA9IEZYU1lTX3JvdW5kKHNyY19yZWN0LmJvdHRvbSAqIGZTY2FsZVkpOwotICAgIGlmICgoYmxlbmRfbW9kZSAhPSBGWERJQl9CTEVORF9OT1JNQUwgJiYgIShtX1JlbmRlckNhcHMgJiBGWFJDX0JMRU5EX01PREUpKSB8fAotICAgICAgICAgICAgKHBCaXRtYXAtPkhhc0FscGhhKCkgJiYgIShtX1JlbmRlckNhcHMgJiBGWFJDX0FMUEhBX0lNQUdFKSkpIHsKLSAgICAgICAgaWYgKCEobV9SZW5kZXJDYXBzICYgRlhSQ19HRVRfQklUUykpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpbnQgYmdfcGl4ZWxfd2lkdGggPSBGWFNZU19yb3VuZChkZXN0X3JlY3QuV2lkdGgoKSAqIGZTY2FsZVgpOwotICAgICAgICBpbnQgYmdfcGl4ZWxfaGVpZ2h0ID0gRlhTWVNfcm91bmQoZGVzdF9yZWN0LkhlaWdodCgpICogZlNjYWxlWSk7Ci0gICAgICAgIENGWF9ESUJpdG1hcCBiYWNrZ3JvdW5kOwotICAgICAgICBpZiAoIWJhY2tncm91bmQuQ3JlYXRlKGJnX3BpeGVsX3dpZHRoLCBiZ19waXhlbF9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fUmVuZGVyQ2FwcyAmIEZYUkNfQ01ZS19PVVRQVVQpID8gRlhESUJfQ215ayA6IEZYRElCX1JnYjMyKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbV9wRGV2aWNlRHJpdmVyLT5HZXRESUJpdHMoJmJhY2tncm91bmQsIGRlc3RfcmVjdC5sZWZ0LCBkZXN0X3JlY3QudG9wKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmICghYmFja2dyb3VuZC5Db21wb3NpdGVCaXRtYXAoMCwgMCwgYmdfcGl4ZWxfd2lkdGgsIGJnX3BpeGVsX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwLCBzcmNfcmVjdC5sZWZ0LCBzcmNfcmVjdC50b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRfbW9kZSwgTlVMTCwgRkFMU0UsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfUkVDVCBzcmNfcmVjdCgwLCAwLCBiZ19waXhlbF93aWR0aCwgYmdfcGl4ZWxfaGVpZ2h0KTsKLSAgICAgICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U2V0RElCaXRzKCZiYWNrZ3JvdW5kLCAwLCAmc3JjX3JlY3QsIGRlc3RfcmVjdC5sZWZ0LCBkZXN0X3JlY3QudG9wLCBGWERJQl9CTEVORF9OT1JNQUwpOworICAgIGlmIChiaXRtYXAuSGFzQWxwaGEoKSkgeworICAgICAgYml0bWFwLkNsZWFyKDApOworICAgICAgQmFja2Ryb3AuQ29weSgmYml0bWFwKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFtX3BEZXZpY2VEcml2ZXItPkdldERJQml0cygmYml0bWFwLCByZWN0LmxlZnQsIHJlY3QudG9wLCBOVUxMKSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBCYWNrZHJvcC5Db3B5KCZiaXRtYXApOwogICAgIH0KLSAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TZXRESUJpdHMocEJpdG1hcCwgMCwgJnNyY19yZWN0LCBkZXN0X3JlY3QubGVmdCwgZGVzdF9yZWN0LnRvcCwgYmxlbmRfbW9kZSwgMCwgcEljY1RyYW5zZm9ybSk7Ci19Ci1GWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OlN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgRlhfRFdPUkQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX21vZGUpCi17Ci0gICAgRlhfUkVDVCBkZXN0X3JlY3QobGVmdCwgdG9wLCBsZWZ0ICsgZGVzdF93aWR0aCwgdG9wICsgZGVzdF9oZWlnaHQpOwotICAgIEZYX1JFQ1QgY2xpcF9ib3ggPSBtX0NsaXBCb3g7Ci0gICAgY2xpcF9ib3guSW50ZXJzZWN0KGRlc3RfcmVjdCk7Ci0gICAgaWYgKGNsaXBfYm94LklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICBDRlhfRnhnZURldmljZSBiaXRtYXBfZGV2aWNlOworICAgIGJpdG1hcF9kZXZpY2UuQXR0YWNoKCZiaXRtYXAsIDAsIEZBTFNFLCAmQmFja2Ryb3AsIFRSVUUpOworICAgIENGWF9NYXRyaXggbWF0cml4OworICAgIGlmIChwT2JqZWN0MkRldmljZSkgeworICAgICAgbWF0cml4ID0gKnBPYmplY3QyRGV2aWNlOwogICAgIH0KLSAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TdHJldGNoRElCaXRzKHBCaXRtYXAsIDAsIGxlZnQsIHRvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsICZjbGlwX2JveCwgZmxhZ3MsIDAsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX21vZGUpOworICAgIG1hdHJpeC5UcmFuc2xhdGVJKC1yZWN0LmxlZnQsIC1yZWN0LnRvcCk7CisgICAgbWF0cml4LkNvbmNhdChmU2NhbGVYLCAwLCAwLCBmU2NhbGVZLCAwLCAwKTsKKyAgICBpZiAoIWJpdG1hcF9kZXZpY2UuR2V0RGV2aWNlRHJpdmVyKCktPkRyYXdQYXRoKAorICAgICAgICAgICAgcFBhdGhEYXRhLCAmbWF0cml4LCBwR3JhcGhTdGF0ZSwgZmlsbF9jb2xvciwgc3Ryb2tlX2NvbG9yLAorICAgICAgICAgICAgZmlsbF9tb2RlLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIEZYU1lTX3JvdW5kKHJlY3QuV2lkdGgoKSAqIGZTY2FsZVgpLAorICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQocmVjdC5IZWlnaHQoKSAqIGZTY2FsZVkpKTsKKyAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TZXRESUJpdHMoJmJpdG1hcCwgMCwgJnNyY19yZWN0LCByZWN0LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QudG9wLCBGWERJQl9CTEVORF9OT1JNQUwpOworICB9CisgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPkRyYXdQYXRoKHBQYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UsIHBHcmFwaFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2NvbG9yLCBzdHJva2VfY29sb3IsIGZpbGxfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSk7CiB9Ci1GWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OlNldEJpdE1hc2soY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIEZYX0RXT1JEIGFyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgRlhfUkVDVCBzcmNfcmVjdCgwLCAwLCBwQml0bWFwLT5HZXRXaWR0aCgpLCBwQml0bWFwLT5HZXRIZWlnaHQoKSk7Ci0gICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U2V0RElCaXRzKHBCaXRtYXAsIGFyZ2IsICZzcmNfcmVjdCwgbGVmdCwgdG9wLCBGWERJQl9CTEVORF9OT1JNQUwsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOworRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRQaXhlbChpbnQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBpZiAobV9wRGV2aWNlRHJpdmVyLT5TZXRQaXhlbCh4LCB5LCBjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBGWF9SRUNUIHJlY3QoeCwgeSwgeCArIDEsIHkgKyAxKTsKKyAgcmV0dXJuIEZpbGxSZWN0KCZyZWN0LCBjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiB9Ci1GWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OlN0cmV0Y2hCaXRNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLAotICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBGWF9EV09SRCBhcmdiLCBGWF9EV09SRCBmbGFncywKLSAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgRlhfUkVDVCBkZXN0X3JlY3QobGVmdCwgdG9wLCBsZWZ0ICsgZGVzdF93aWR0aCwgdG9wICsgZGVzdF9oZWlnaHQpOwotICAgIEZYX1JFQ1QgY2xpcF9ib3ggPSBtX0NsaXBCb3g7Ci0gICAgY2xpcF9ib3guSW50ZXJzZWN0KGRlc3RfcmVjdCk7Ci0gICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U3RyZXRjaERJQml0cyhwQml0bWFwLCBhcmdiLCBsZWZ0LCB0b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCAmY2xpcF9ib3gsIGZsYWdzLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKK0ZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6RmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgeworICBpZiAobV9wRGV2aWNlRHJpdmVyLT5GaWxsUmVjdChwUmVjdCwgZmlsbF9jb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRfdHlwZSkpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoIShtX1JlbmRlckNhcHMgJiBGWFJDX0dFVF9CSVRTKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDRlhfRElCaXRtYXAgYml0bWFwOworICBpZiAoIUNyZWF0ZUNvbXBhdGlibGVCaXRtYXAoJmJpdG1hcCwgcFJlY3QtPldpZHRoKCksIHBSZWN0LT5IZWlnaHQoKSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKCFtX3BEZXZpY2VEcml2ZXItPkdldERJQml0cygmYml0bWFwLCBwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKCFiaXRtYXAuQ29tcG9zaXRlUmVjdCgwLCAwLCBwUmVjdC0+V2lkdGgoKSwgcFJlY3QtPkhlaWdodCgpLCBmaWxsX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgcFJlY3QtPldpZHRoKCksIHBSZWN0LT5IZWlnaHQoKSk7CisgIG1fcERldmljZURyaXZlci0+U2V0RElCaXRzKCZiaXRtYXAsIDAsICZzcmNfcmVjdCwgcFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0JMRU5EX05PUk1BTCk7CisgIHJldHVybiBUUlVFOwogfQotRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBhcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBmbGFncywgRlhfTFBWT0lEJiBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfbW9kZSkKLXsKLSAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TdGFydERJQml0cyhwQml0bWFwLCBiaXRtYXBfYWxwaGEsIGFyZ2IsIHBNYXRyaXgsIGZsYWdzLCBoYW5kbGUsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX21vZGUpOworRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgeworICBpZiAoKChtX1JlbmRlckNhcHMgJiBGWFJDX0FMUEhBX1BBVEgpICYmCisgICAgICAgKEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykgJiYKKyAgICAgICAgRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgPT0gMHhmZikpIHx8CisgICAgICBjb2xvciA+PSAweGZmMDAwMDAwKQorICAgIGlmIChtX3BEZXZpY2VEcml2ZXItPkRyYXdDb3NtZXRpY0xpbmUoeDEsIHkxLCB4MiwgeTIsIGNvbG9yLCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSkpIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdyYXBoX3N0YXRlOworICBDRlhfUGF0aERhdGEgcGF0aDsKKyAgcGF0aC5TZXRQb2ludENvdW50KDIpOworICBwYXRoLlNldFBvaW50KDAsIHgxLCB5MSwgRlhQVF9NT1ZFVE8pOworICBwYXRoLlNldFBvaW50KDEsIHgyLCB5MiwgRlhQVF9MSU5FVE8pOworICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5EcmF3UGF0aCgmcGF0aCwgTlVMTCwgJmdyYXBoX3N0YXRlLCAwLCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9tb2RlLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZF90eXBlKTsKIH0KLUZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6Q29udGludWVESUJpdHMoRlhfTFBWT0lEIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+Q29udGludWVESUJpdHMoaGFuZGxlLCBwUGF1c2UpOworRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBpZiAoIShtX1JlbmRlckNhcHMgJiBGWFJDX0dFVF9CSVRTKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5HZXRESUJpdHMocEJpdG1hcCwgbGVmdCwgdG9wLCBwSWNjVHJhbnNmb3JtKTsKIH0KLXZvaWQgQ0ZYX1JlbmRlckRldmljZTo6Q2FuY2VsRElCaXRzKEZYX0xQVk9JRCBoYW5kbGUpCi17Ci0gICAgbV9wRGV2aWNlRHJpdmVyLT5DYW5jZWxESUJpdHMoaGFuZGxlKTsKK0NGWF9ESUJpdG1hcCogQ0ZYX1JlbmRlckRldmljZTo6R2V0QmFja0Ryb3AoKSB7CisgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPkdldEJhY2tEcm9wKCk7Cit9CitGWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OlNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIEFTU0VSVCghcEJpdG1hcC0+SXNBbHBoYU1hc2soKSk7CisgIENGWF9NYXRyaXggY3RtID0gR2V0Q1RNKCk7CisgIEZYX0ZMT0FUIGZTY2FsZVggPSBGWFNZU19mYWJzKGN0bS5hKTsKKyAgRlhfRkxPQVQgZlNjYWxlWSA9IEZYU1lTX2ZhYnMoY3RtLmQpOworICBGWF9SRUNUIGRlc3RfcmVjdChsZWZ0LCB0b3AsCisgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKGxlZnQgKyBwQml0bWFwLT5HZXRXaWR0aCgpIC8gZlNjYWxlWCksCisgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKHRvcCArIHBCaXRtYXAtPkdldEhlaWdodCgpIC8gZlNjYWxlWSkpOworICBkZXN0X3JlY3QuSW50ZXJzZWN0KG1fQ2xpcEJveCk7CisgIGlmIChkZXN0X3JlY3QuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgRlhfUkVDVCBzcmNfcmVjdChkZXN0X3JlY3QubGVmdCAtIGxlZnQsIGRlc3RfcmVjdC50b3AgLSB0b3AsCisgICAgICAgICAgICAgICAgICAgZGVzdF9yZWN0LmxlZnQgLSBsZWZ0ICsgZGVzdF9yZWN0LldpZHRoKCksCisgICAgICAgICAgICAgICAgICAgZGVzdF9yZWN0LnRvcCAtIHRvcCArIGRlc3RfcmVjdC5IZWlnaHQoKSk7CisgIHNyY19yZWN0LmxlZnQgPSBGWFNZU19yb3VuZChzcmNfcmVjdC5sZWZ0ICogZlNjYWxlWCk7CisgIHNyY19yZWN0LnRvcCA9IEZYU1lTX3JvdW5kKHNyY19yZWN0LnRvcCAqIGZTY2FsZVkpOworICBzcmNfcmVjdC5yaWdodCA9IEZYU1lTX3JvdW5kKHNyY19yZWN0LnJpZ2h0ICogZlNjYWxlWCk7CisgIHNyY19yZWN0LmJvdHRvbSA9IEZYU1lTX3JvdW5kKHNyY19yZWN0LmJvdHRvbSAqIGZTY2FsZVkpOworICBpZiAoKGJsZW5kX21vZGUgIT0gRlhESUJfQkxFTkRfTk9STUFMICYmICEobV9SZW5kZXJDYXBzICYgRlhSQ19CTEVORF9NT0RFKSkgfHwKKyAgICAgIChwQml0bWFwLT5IYXNBbHBoYSgpICYmICEobV9SZW5kZXJDYXBzICYgRlhSQ19BTFBIQV9JTUFHRSkpKSB7CisgICAgaWYgKCEobV9SZW5kZXJDYXBzICYgRlhSQ19HRVRfQklUUykpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaW50IGJnX3BpeGVsX3dpZHRoID0gRlhTWVNfcm91bmQoZGVzdF9yZWN0LldpZHRoKCkgKiBmU2NhbGVYKTsKKyAgICBpbnQgYmdfcGl4ZWxfaGVpZ2h0ID0gRlhTWVNfcm91bmQoZGVzdF9yZWN0LkhlaWdodCgpICogZlNjYWxlWSk7CisgICAgQ0ZYX0RJQml0bWFwIGJhY2tncm91bmQ7CisgICAgaWYgKCFiYWNrZ3JvdW5kLkNyZWF0ZSgKKyAgICAgICAgICAgIGJnX3BpeGVsX3dpZHRoLCBiZ19waXhlbF9oZWlnaHQsCisgICAgICAgICAgICAobV9SZW5kZXJDYXBzICYgRlhSQ19DTVlLX09VVFBVVCkgPyBGWERJQl9DbXlrIDogRlhESUJfUmdiMzIpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGlmICghbV9wRGV2aWNlRHJpdmVyLT5HZXRESUJpdHMoJmJhY2tncm91bmQsIGRlc3RfcmVjdC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9yZWN0LnRvcCkpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKCFiYWNrZ3JvdW5kLkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCBiZ19waXhlbF93aWR0aCwgYmdfcGl4ZWxfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdG1hcCwgc3JjX3JlY3QubGVmdCwgc3JjX3JlY3QudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRfbW9kZSwgTlVMTCwgRkFMU0UsIHBJY2NUcmFuc2Zvcm0pKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgYmdfcGl4ZWxfd2lkdGgsIGJnX3BpeGVsX2hlaWdodCk7CisgICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U2V0RElCaXRzKCZiYWNrZ3JvdW5kLCAwLCAmc3JjX3JlY3QsIGRlc3RfcmVjdC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3JlY3QudG9wLCBGWERJQl9CTEVORF9OT1JNQUwpOworICB9CisgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPlNldERJQml0cyhwQml0bWFwLCAwLCAmc3JjX3JlY3QsIGRlc3RfcmVjdC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9yZWN0LnRvcCwgYmxlbmRfbW9kZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJY2NUcmFuc2Zvcm0pOworfQorRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfbW9kZSkgeworICBGWF9SRUNUIGRlc3RfcmVjdChsZWZ0LCB0b3AsIGxlZnQgKyBkZXN0X3dpZHRoLCB0b3AgKyBkZXN0X2hlaWdodCk7CisgIEZYX1JFQ1QgY2xpcF9ib3ggPSBtX0NsaXBCb3g7CisgIGNsaXBfYm94LkludGVyc2VjdChkZXN0X3JlY3QpOworICBpZiAoY2xpcF9ib3guSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U3RyZXRjaERJQml0cyhwQml0bWFwLCAwLCBsZWZ0LCB0b3AsIGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9oZWlnaHQsICZjbGlwX2JveCwgZmxhZ3MsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSwgYmxlbmRfbW9kZSk7Cit9CitGWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OlNldEJpdE1hc2soY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpKTsKKyAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U2V0RElCaXRzKHBCaXRtYXAsIGFyZ2IsICZzcmNfcmVjdCwgbGVmdCwgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfQkxFTkRfTk9STUFMLCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSk7Cit9CitGWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OlN0cmV0Y2hCaXRNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgRlhfUkVDVCBkZXN0X3JlY3QobGVmdCwgdG9wLCBsZWZ0ICsgZGVzdF93aWR0aCwgdG9wICsgZGVzdF9oZWlnaHQpOworICBGWF9SRUNUIGNsaXBfYm94ID0gbV9DbGlwQm94OworICBjbGlwX2JveC5JbnRlcnNlY3QoZGVzdF9yZWN0KTsKKyAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U3RyZXRjaERJQml0cyhwQml0bWFwLCBhcmdiLCBsZWZ0LCB0b3AsIGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9oZWlnaHQsICZjbGlwX2JveCwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Cit9CitGWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OlN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX21vZGUpIHsKKyAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U3RhcnRESUJpdHMocEJpdG1hcCwgYml0bWFwX2FscGhhLCBhcmdiLCBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgaGFuZGxlLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZF9tb2RlKTsKK30KK0ZYX0JPT0wgQ0ZYX1JlbmRlckRldmljZTo6Q29udGludWVESUJpdHModm9pZCogaGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSkgeworICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5Db250aW51ZURJQml0cyhoYW5kbGUsIHBQYXVzZSk7Cit9Cit2b2lkIENGWF9SZW5kZXJEZXZpY2U6OkNhbmNlbERJQml0cyh2b2lkKiBoYW5kbGUpIHsKKyAgbV9wRGV2aWNlRHJpdmVyLT5DYW5jZWxESUJpdHMoaGFuZGxlKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfZm9udC5jcHAgYi9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2ZvbnQuY3BwCmluZGV4IDE4OTYyMTguLjU2ZTE3OGYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfZm9udC5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9mb250LmNwcApAQCAtMSw0MzcgKzEsNTU1IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9mcmVldHlwZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2dlLmgiCiAjaW5jbHVkZSAidGV4dF9pbnQuaCIKLSNkZWZpbmUgRU1fQURKVVNUKGVtLCBhKSAoZW0gPT0gMD8oYSk6IChhKSoxMDAwL2VtKQotZXh0ZXJuIHZvaWQgX0ZQREZBUElfR2V0SW50ZXJuYWxGb250RGF0YShpbnQgaWQxLCBGWF9MUENCWVRFJiBkYXRhLCBGWF9EV09SRCYgc2l6ZSk7Ci1DRlhfRm9udDo6Q0ZYX0ZvbnQoKQotewotICAgIG1fcFN1YnN0Rm9udCA9IE5VTEw7Ci0gICAgbV9GYWNlID0gTlVMTDsKLSAgICBtX2JFbWJlZGRlZCA9IEZBTFNFOwotICAgIG1fYlZlcnRpY2FsID0gRkFMU0U7Ci0gICAgbV9wRm9udERhdGEgPSBOVUxMOwotICAgIG1fcEZvbnREYXRhQWxsb2NhdGlvbiA9IE5VTEw7Ci0gICAgbV9kd1NpemUgPSAwOwotICAgIG1fcE93bmVkU3RyZWFtID0gTlVMTDsKLSAgICBtX3BHc3ViRGF0YSA9IE5VTEw7Ci0gICAgbV9wUGxhdGZvcm1Gb250ID0gTlVMTDsKLSAgICBtX3BQbGF0Zm9ybUZvbnRDb2xsZWN0aW9uID0gTlVMTDsKLSAgICBtX3BEd0ZvbnQgPSBOVUxMOwotICAgIG1faEhhbmRsZSA9IE5VTEw7Ci0gICAgbV9iRHdMb2FkZWQgPSBGQUxTRTsKLX0KLUNGWF9Gb250Ojp+Q0ZYX0ZvbnQoKQotewotICAgIGlmIChtX3BTdWJzdEZvbnQpIHsKLSAgICAgICAgZGVsZXRlIG1fcFN1YnN0Rm9udDsKLSAgICAgICAgbV9wU3Vic3RGb250ID0gTlVMTDsKLSAgICB9Ci0gICAgaWYgKG1fcEZvbnREYXRhQWxsb2NhdGlvbikgewotICAgICAgICBGWF9GcmVlKG1fcEZvbnREYXRhQWxsb2NhdGlvbik7Ci0gICAgICAgIG1fcEZvbnREYXRhQWxsb2NhdGlvbiA9IE5VTEw7Ci0gICAgfQotICAgIGlmIChtX0ZhY2UpIHsKLSAgICAgICAgaWYgKEZYRlRfR2V0X0ZhY2VfRXh0ZXJuYWxfU3RyZWFtKG1fRmFjZSkpIHsKLSAgICAgICAgICAgIEZYRlRfQ2xlYXJfRmFjZV9FeHRlcm5hbF9TdHJlYW0obV9GYWNlKTsKLSAgICAgICAgfQotICAgICAgICBpZihtX2JFbWJlZGRlZCkgewotICAgICAgICAgICAgRGVsZXRlRmFjZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5SZWxlYXNlRmFjZShtX0ZhY2UpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtX3BPd25lZFN0cmVhbSkgewotICAgICAgICBGWF9GcmVlKG1fcE93bmVkU3RyZWFtKTsKLSAgICAgICAgbV9wT3duZWRTdHJlYW0gPSBOVUxMOwotICAgIH0KLSAgICBpZiAobV9wR3N1YkRhdGEpIHsKLSAgICAgICAgRlhfRnJlZShtX3BHc3ViRGF0YSk7Ci0gICAgICAgIG1fcEdzdWJEYXRhID0gTlVMTDsKLSAgICB9Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgUmVsZWFzZVBsYXRmb3JtUmVzb3VyY2UoKTsKLSNlbmRpZgotfQotdm9pZCBDRlhfRm9udDo6RGVsZXRlRmFjZSgpCi17Ci0gICAgRlhGVF9Eb25lX0ZhY2UobV9GYWNlKTsKLSAgICBtX0ZhY2UgPSBOVUxMOwotfQotRlhfQk9PTCBDRlhfRm9udDo6TG9hZFN1YnN0KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsIEZYX0JPT0wgYlRydWVUeXBlLCBGWF9EV09SRCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LCBpbnQgaXRhbGljX2FuZ2xlLCBpbnQgQ2hhcnNldENQLCBGWF9CT09MIGJWZXJ0aWNhbCkKLXsKLSAgICBtX2JFbWJlZGRlZCA9IEZBTFNFOwotICAgIG1fYlZlcnRpY2FsID0gYlZlcnRpY2FsOwotICAgIG1fcFN1YnN0Rm9udCA9IG5ldyBDRlhfU3Vic3RGb250OwotICAgIG1fRmFjZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+RmluZFN1YnN0Rm9udChmYWNlX25hbWUsIGJUcnVlVHlwZSwgZmxhZ3MsIHdlaWdodCwgaXRhbGljX2FuZ2xlLAotICAgICAgICAgICAgIENoYXJzZXRDUCwgbV9wU3Vic3RGb250KTsKLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICBpZihtX3BTdWJzdEZvbnQtPm1fRXh0SGFuZGxlKSB7Ci0gICAgICAgIG1fcFBsYXRmb3JtRm9udCA9IG1fcFN1YnN0Rm9udC0+bV9FeHRIYW5kbGU7Ci0gICAgICAgIG1fcFN1YnN0Rm9udC0+bV9FeHRIYW5kbGUgPSBOVUxMOwotICAgIH0KLSNlbmRpZgotICAgIGlmIChtX0ZhY2UpIHsKLSAgICAgICAgbV9wRm9udERhdGEgPSBGWEZUX0dldF9GYWNlX1N0cmVhbV9CYXNlKG1fRmFjZSk7Ci0gICAgICAgIG1fZHdTaXplID0gRlhGVF9HZXRfRmFjZV9TdHJlYW1fU2l6ZShtX0ZhY2UpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLWV4dGVybiAiQyIgewotICAgIHVuc2lnbmVkIGxvbmcgX0ZUU3RyZWFtUmVhZChGWEZUX1N0cmVhbSBzdHJlYW0sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQpCi0gICAgewotICAgICAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgSUZYX0ZpbGVSZWFkKiBwRmlsZSA9IChJRlhfRmlsZVJlYWQqKXN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyOwotICAgICAgICBpbnQgcmVzID0gcEZpbGUtPlJlYWRCbG9jayhidWZmZXIsIG9mZnNldCwgY291bnQpOwotICAgICAgICBpZiAocmVzKSB7Ci0gICAgICAgICAgICByZXR1cm4gY291bnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHZvaWQgX0ZUU3RyZWFtQ2xvc2UoRlhGVF9TdHJlYW0gc3RyZWFtKQotICAgIHsKLSAgICB9CisKKyNkZWZpbmUgRU1fQURKVVNUKGVtLCBhKSAoZW0gPT0gMCA/IChhKSA6IChhKSoxMDAwIC8gZW0pCisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorZXh0ZXJuIHZvaWQgX0ZQREZBUElfR2V0SW50ZXJuYWxGb250RGF0YShpbnQgaWQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIHNpemUpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCituYW1lc3BhY2UgeworCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK2NvbnN0IEZYX0RXT1JEIGdfRW5jb2RpbmdJRFtdID0geworICBGWEZNX0VOQ09ESU5HX01TX1NZTUJPTCwKKyAgRlhGTV9FTkNPRElOR19VTklDT0RFLAorICBGWEZNX0VOQ09ESU5HX01TX1NKSVMsCisgIEZYRk1fRU5DT0RJTkdfTVNfR0IyMzEyLAorICBGWEZNX0VOQ09ESU5HX01TX0JJRzUsCisgIEZYRk1fRU5DT0RJTkdfTVNfV0FOU1VORywKKyAgRlhGTV9FTkNPRElOR19NU19KT0hBQiwKKyAgRlhGTV9FTkNPRElOR19BRE9CRV9TVEFOREFSRCwKKyAgRlhGTV9FTkNPRElOR19BRE9CRV9FWFBFUlQsCisgIEZYRk1fRU5DT0RJTkdfQURPQkVfQ1VTVE9NLAorICBGWEZNX0VOQ09ESU5HX0FET0JFX0xBVElOXzEsCisgIEZYRk1fRU5DT0RJTkdfT0xEX0xBVElOXzIsCisgIEZYRk1fRU5DT0RJTkdfQVBQTEVfUk9NQU4sCiB9OwotRlhfQk9PTCBfTG9hZEZpbGUoRlhGVF9MaWJyYXJ5IGxpYnJhcnksIEZYRlRfRmFjZSogRmFjZSwgSUZYX0ZpbGVSZWFkKiBwRmlsZSwgRlhGVF9TdHJlYW0qIHN0cmVhbSkKLXsKLSAgICBGWEZUX1N0cmVhbSBzdHJlYW0xID0gKEZYRlRfU3RyZWFtKUZYX0FsbG9jKEZYX0JZVEUsIHNpemVvZiAoRlhGVF9TdHJlYW1SZWMpKTsKLSAgICBzdHJlYW0xLT5iYXNlID0gTlVMTDsKLSAgICBzdHJlYW0xLT5zaXplID0gKHVuc2lnbmVkIGxvbmcpcEZpbGUtPkdldFNpemUoKTsKLSAgICBzdHJlYW0xLT5wb3MgPSAwOwotICAgIHN0cmVhbTEtPmRlc2NyaXB0b3IucG9pbnRlciA9IHBGaWxlOwotICAgIHN0cmVhbTEtPmNsb3NlID0gX0ZUU3RyZWFtQ2xvc2U7Ci0gICAgc3RyZWFtMS0+cmVhZCA9IF9GVFN0cmVhbVJlYWQ7Ci0gICAgRlhGVF9PcGVuX0FyZ3MgYXJnczsKLSAgICBhcmdzLmZsYWdzID0gRlRfT1BFTl9TVFJFQU07Ci0gICAgYXJncy5zdHJlYW0gPSBzdHJlYW0xOwotICAgIGlmIChGWEZUX09wZW5fRmFjZShsaWJyYXJ5LCAmYXJncywgMCwgRmFjZSkpIHsKLSAgICAgICAgRlhfRnJlZShzdHJlYW0xKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoc3RyZWFtKSB7Ci0gICAgICAgICpzdHJlYW0gPSBzdHJlYW0xOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKworQ0ZYX1VuaWNvZGVFbmNvZGluZ0V4KiBfRlhGTV9DcmVhdGVGb250RW5jb2RpbmcoQ0ZYX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkVuY29kaW5nSUQpIHsKKyAgaWYgKEZYRlRfU2VsZWN0X0NoYXJtYXAocEZvbnQtPkdldEZhY2UoKSwgbkVuY29kaW5nSUQpKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gbmV3IENGWF9Vbmljb2RlRW5jb2RpbmdFeChwRm9udCwgbkVuY29kaW5nSUQpOwogfQotRlhfQk9PTCBDRlhfRm9udDo6TG9hZEZpbGUoSUZYX0ZpbGVSZWFkKiBwRmlsZSkKLXsKLSAgICBtX2JFbWJlZGRlZCA9IEZBTFNFOwotICAgIEZYRlRfTGlicmFyeSBsaWJyYXJ5OwotICAgIGlmIChDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCktPm1fRlRMaWJyYXJ5ID09IE5VTEwpIHsKLSAgICAgICAgRlhGVF9Jbml0X0ZyZWVUeXBlKCZDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCktPm1fRlRMaWJyYXJ5KTsKLSAgICB9Ci0gICAgbGlicmFyeSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+bV9GVExpYnJhcnk7Ci0gICAgRlhGVF9TdHJlYW0gc3RyZWFtID0gTlVMTDsKLSAgICBpZiAoIV9Mb2FkRmlsZShsaWJyYXJ5LCAmbV9GYWNlLCBwRmlsZSwgJnN0cmVhbSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBtX3BPd25lZFN0cmVhbSA9IHN0cmVhbTsKLSAgICBGWEZUX1NldF9QaXhlbF9TaXplcyhtX0ZhY2UsIDAsIDY0KTsKLSAgICByZXR1cm4gVFJVRTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworRlhGVF9GYWNlIEZUX0xvYWRGb250KGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBpbnQgc2l6ZSkgeworICByZXR1cm4gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5HZXRGaXhlZEZhY2UocERhdGEsIHNpemUsIDApOwogfQotaW50IENGWF9Gb250OjpHZXRHbHlwaFdpZHRoKEZYX0RXT1JEIGdseXBoX2luZGV4KQotewotICAgIGlmICghbV9GYWNlKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAobV9wU3Vic3RGb250ICYmIChtX3BTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyAmIEZYRk9OVF9TVUJTVF9NTSkpIHsKLSAgICAgICAgQWRqdXN0TU1QYXJhbXMoZ2x5cGhfaW5kZXgsIDAsIDApOwotICAgIH0KLSAgICBpbnQgZXJyID0gRlhGVF9Mb2FkX0dseXBoKG1fRmFjZSwgZ2x5cGhfaW5kZXgsIEZYRlRfTE9BRF9OT19TQ0FMRSB8IEZYRlRfTE9BRF9JR05PUkVfR0xPQkFMX0FEVkFOQ0VfV0lEVEgpOwotICAgIGlmIChlcnIpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGludCB3aWR0aCA9IEVNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwgRlhGVF9HZXRfR2x5cGhfSG9yaUFkdmFuY2UobV9GYWNlKSk7Ci0gICAgcmV0dXJuIHdpZHRoOworCit9ICAvLyBuYW1lc3BhY2UKKworQ0ZYX0ZvbnQ6OkNGWF9Gb250KCkgeworICBtX3BTdWJzdEZvbnQgPSBOVUxMOworICBtX0ZhY2UgPSBOVUxMOworICBtX2JFbWJlZGRlZCA9IEZBTFNFOworICBtX2JWZXJ0aWNhbCA9IEZBTFNFOworICBtX3BGb250RGF0YSA9IE5VTEw7CisgIG1fcEZvbnREYXRhQWxsb2NhdGlvbiA9IE5VTEw7CisgIG1fZHdTaXplID0gMDsKKyAgbV9wR3N1YkRhdGEgPSBOVUxMOworICBtX3BQbGF0Zm9ybUZvbnQgPSBOVUxMOworICBtX3BQbGF0Zm9ybUZvbnRDb2xsZWN0aW9uID0gTlVMTDsKKyAgbV9wRHdGb250ID0gTlVMTDsKKyAgbV9oSGFuZGxlID0gTlVMTDsKKyAgbV9iRHdMb2FkZWQgPSBGQUxTRTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBtX2JMb2dpYyA9IEZBTFNFOworICBtX3BPd25lZFN0cmVhbSA9IE5VTEw7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiB9Ci1zdGF0aWMgRlhGVF9GYWNlIEZUX0xvYWRGb250KEZYX0xQQllURSBwRGF0YSwgaW50IHNpemUpCi17Ci0gICAgRlhGVF9MaWJyYXJ5IGxpYnJhcnk7Ci0gICAgaWYgKENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+bV9GVExpYnJhcnkgPT0gTlVMTCkgewotICAgICAgICBGWEZUX0luaXRfRnJlZVR5cGUoJkNGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+bV9GVExpYnJhcnkpOworCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK0ZYX0JPT0wgQ0ZYX0ZvbnQ6OkxvYWRDbG9uZShjb25zdCBDRlhfRm9udCogcEZvbnQpIHsKKyAgaWYgKHBGb250ID09IE5VTEwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbV9iTG9naWMgPSBUUlVFOworICBpZiAocEZvbnQtPm1fcFN1YnN0Rm9udCkgeworICAgIG1fcFN1YnN0Rm9udCA9IG5ldyBDRlhfU3Vic3RGb250OworICAgIG1fcFN1YnN0Rm9udC0+bV9DaGFyc2V0ID0gcEZvbnQtPm1fcFN1YnN0Rm9udC0+bV9DaGFyc2V0OworICAgIG1fcFN1YnN0Rm9udC0+bV9FeHRIYW5kbGUgPSBwRm9udC0+bV9wU3Vic3RGb250LT5tX0V4dEhhbmRsZTsKKyAgICBtX3BTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyA9IHBGb250LT5tX3BTdWJzdEZvbnQtPm1fU3Vic3RGbGFnczsKKyAgICBtX3BTdWJzdEZvbnQtPm1fV2VpZ2h0ID0gcEZvbnQtPm1fcFN1YnN0Rm9udC0+bV9XZWlnaHQ7CisgICAgbV9wU3Vic3RGb250LT5tX0ZhbWlseSA9IHBGb250LT5tX3BTdWJzdEZvbnQtPm1fRmFtaWx5OworICAgIG1fcFN1YnN0Rm9udC0+bV9JdGFsaWNBbmdsZSA9IHBGb250LT5tX3BTdWJzdEZvbnQtPm1fSXRhbGljQW5nbGU7CisgIH0KKyAgaWYgKHBGb250LT5tX090ZkZvbnREYXRhLkdldFNpemUoKSkgeworICAgIG1fT3RmRm9udERhdGEuQXR0YWNoRGF0YShwRm9udC0+bV9PdGZGb250RGF0YS5HZXRCdWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvbnQtPm1fT3RmRm9udERhdGEuR2V0U2l6ZSgpKTsKKyAgfQorICBtX0ZhY2UgPSBwRm9udC0+bV9GYWNlOworICBtX2JFbWJlZGRlZCA9IHBGb250LT5tX2JFbWJlZGRlZDsKKyAgbV9iVmVydGljYWwgPSBwRm9udC0+bV9iVmVydGljYWw7CisgIG1fZHdTaXplID0gcEZvbnQtPm1fZHdTaXplOworICBtX3BGb250RGF0YSA9IHBGb250LT5tX3BGb250RGF0YTsKKyAgbV9wR3N1YkRhdGEgPSBwRm9udC0+bV9wR3N1YkRhdGE7CisgIG1fcFBsYXRmb3JtRm9udCA9IHBGb250LT5tX3BQbGF0Zm9ybUZvbnQ7CisgIG1fcFBsYXRmb3JtRm9udENvbGxlY3Rpb24gPSBwRm9udC0+bV9wUGxhdGZvcm1Gb250Q29sbGVjdGlvbjsKKyAgbV9wRHdGb250ID0gcEZvbnQtPm1fcER3Rm9udDsKKyAgbV9oSGFuZGxlID0gcEZvbnQtPm1faEhhbmRsZTsKKyAgbV9iRHdMb2FkZWQgPSBwRm9udC0+bV9iRHdMb2FkZWQ7CisgIG1fcE93bmVkU3RyZWFtID0gcEZvbnQtPm1fcE93bmVkU3RyZWFtOworICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworQ0ZYX0ZvbnQ6On5DRlhfRm9udCgpIHsKKyAgZGVsZXRlIG1fcFN1YnN0Rm9udDsKKyAgRlhfRnJlZShtX3BGb250RGF0YUFsbG9jYXRpb24pOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIGlmIChtX2JMb2dpYykgeworICAgIG1fT3RmRm9udERhdGEuRGV0YWNoQnVmZmVyKCk7CisgICAgcmV0dXJuOworICB9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisgIGlmIChtX0ZhY2UpIHsKKyNpZm5kZWYgUERGX0VOQUJMRV9YRkEKKyAgICBpZiAoRlhGVF9HZXRfRmFjZV9FeHRlcm5hbF9TdHJlYW0obV9GYWNlKSkgeworICAgICAgRlhGVF9DbGVhcl9GYWNlX0V4dGVybmFsX1N0cmVhbShtX0ZhY2UpOwogICAgIH0KLSAgICBsaWJyYXJ5ID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5tX0ZUTGlicmFyeTsKLSAgICBGWEZUX0ZhY2UgZmFjZSA9IE5VTEw7Ci0gICAgaW50IGVycm9yID0gRlhGVF9OZXdfTWVtb3J5X0ZhY2UobGlicmFyeSwgcERhdGEsIHNpemUsIDAsICZmYWNlKTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgICBpZiAobV9iRW1iZWRkZWQpIHsKKyAgICAgIERlbGV0ZUZhY2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5SZWxlYXNlRmFjZShtX0ZhY2UpOworICAgIH0KKyAgfQorI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIEZYX0ZyZWUobV9wT3duZWRTdHJlYW0pOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICBGWF9GcmVlKG1fcEdzdWJEYXRhKTsKKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworICBSZWxlYXNlUGxhdGZvcm1SZXNvdXJjZSgpOworI2VuZGlmCit9Cit2b2lkIENGWF9Gb250OjpEZWxldGVGYWNlKCkgeworICBGWEZUX0RvbmVfRmFjZShtX0ZhY2UpOworICBtX0ZhY2UgPSBOVUxMOworfQordm9pZCBDRlhfRm9udDo6TG9hZFN1YnN0KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVHJ1ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRhbGljX2FuZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDaGFyc2V0Q1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydGljYWwpIHsKKyAgbV9iRW1iZWRkZWQgPSBGQUxTRTsKKyAgbV9iVmVydGljYWwgPSBiVmVydGljYWw7CisgIG1fcFN1YnN0Rm9udCA9IG5ldyBDRlhfU3Vic3RGb250OworICBtX0ZhY2UgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCktPkZpbmRTdWJzdEZvbnQoCisgICAgICBmYWNlX25hbWUsIGJUcnVlVHlwZSwgZmxhZ3MsIHdlaWdodCwgaXRhbGljX2FuZ2xlLCBDaGFyc2V0Q1AsCisgICAgICBtX3BTdWJzdEZvbnQpOworI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisgIGlmIChtX3BTdWJzdEZvbnQtPm1fRXh0SGFuZGxlKSB7CisgICAgbV9wUGxhdGZvcm1Gb250ID0gbV9wU3Vic3RGb250LT5tX0V4dEhhbmRsZTsKKyAgICBtX3BTdWJzdEZvbnQtPm1fRXh0SGFuZGxlID0gTlVMTDsKKyAgfQorI2VuZGlmCisgIGlmIChtX0ZhY2UpIHsKKyAgICBtX3BGb250RGF0YSA9IEZYRlRfR2V0X0ZhY2VfU3RyZWFtX0Jhc2UobV9GYWNlKTsKKyAgICBtX2R3U2l6ZSA9IEZYRlRfR2V0X0ZhY2VfU3RyZWFtX1NpemUobV9GYWNlKTsKKyAgfQorfQorI2lmZGVmIFBERl9FTkFCTEVfWEZBCitleHRlcm4gIkMiIHsKK3Vuc2lnbmVkIGxvbmcgX0ZUU3RyZWFtUmVhZChGWEZUX1N0cmVhbSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQpIHsKKyAgaWYgKGNvdW50ID09IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBJRlhfRmlsZVJlYWQqIHBGaWxlID0gKElGWF9GaWxlUmVhZCopc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXI7CisgIGludCByZXMgPSBwRmlsZS0+UmVhZEJsb2NrKGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCk7CisgIGlmIChyZXMpIHsKKyAgICByZXR1cm4gY291bnQ7CisgIH0KKyAgcmV0dXJuIDA7Cit9Cit2b2lkIF9GVFN0cmVhbUNsb3NlKEZYRlRfU3RyZWFtIHN0cmVhbSkge30KK307CitGWF9CT09MIF9Mb2FkRmlsZShGWEZUX0xpYnJhcnkgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgIEZYRlRfRmFjZSogRmFjZSwKKyAgICAgICAgICAgICAgICAgIElGWF9GaWxlUmVhZCogcEZpbGUsCisgICAgICAgICAgICAgICAgICBGWEZUX1N0cmVhbSogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgaW50MzJfdCBmYWNlSW5kZXggPSAwKSB7CisgIEZYRlRfU3RyZWFtIHN0cmVhbTEgPSAoRlhGVF9TdHJlYW0pRlhfQWxsb2ModWludDhfdCwgc2l6ZW9mKEZYRlRfU3RyZWFtUmVjKSk7CisgIHN0cmVhbTEtPmJhc2UgPSBOVUxMOworICBzdHJlYW0xLT5zaXplID0gKHVuc2lnbmVkIGxvbmcpcEZpbGUtPkdldFNpemUoKTsKKyAgc3RyZWFtMS0+cG9zID0gMDsKKyAgc3RyZWFtMS0+ZGVzY3JpcHRvci5wb2ludGVyID0gcEZpbGU7CisgIHN0cmVhbTEtPmNsb3NlID0gX0ZUU3RyZWFtQ2xvc2U7CisgIHN0cmVhbTEtPnJlYWQgPSBfRlRTdHJlYW1SZWFkOworICBGWEZUX09wZW5fQXJncyBhcmdzOworICBhcmdzLmZsYWdzID0gRlRfT1BFTl9TVFJFQU07CisgIGFyZ3Muc3RyZWFtID0gc3RyZWFtMTsKKyAgaWYgKEZYRlRfT3Blbl9GYWNlKGxpYnJhcnksICZhcmdzLCBmYWNlSW5kZXgsIEZhY2UpKSB7CisgICAgRlhfRnJlZShzdHJlYW0xKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKHN0cmVhbSkgeworICAgICpzdHJlYW0gPSBzdHJlYW0xOworICB9CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIENGWF9Gb250OjpMb2FkRmlsZShJRlhfRmlsZVJlYWQqIHBGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5GYWNlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHBGYWNlQ291bnQpIHsKKyAgbV9iRW1iZWRkZWQgPSBGQUxTRTsKKworICBDRlhfRm9udE1nciogcEZvbnRNZ3IgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCk7CisgIHBGb250TWdyLT5Jbml0RlRMaWJyYXJ5KCk7CisgIEZYRlRfTGlicmFyeSBsaWJyYXJ5ID0gcEZvbnRNZ3ItPkdldEZUTGlicmFyeSgpOworCisgIEZYRlRfU3RyZWFtIHN0cmVhbSA9IG51bGxwdHI7CisgIGlmICghX0xvYWRGaWxlKGxpYnJhcnksICZtX0ZhY2UsIHBGaWxlLCAmc3RyZWFtLCBuRmFjZUluZGV4KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHBGYWNlQ291bnQpCisgICAgKnBGYWNlQ291bnQgPSAoaW50KW1fRmFjZS0+bnVtX2ZhY2VzOworICBtX3BPd25lZFN0cmVhbSA9IHN0cmVhbTsKKyAgRlhGVF9TZXRfUGl4ZWxfU2l6ZXMobV9GYWNlLCAwLCA2NCk7CisgIHJldHVybiBUUlVFOworfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCitpbnQgQ0ZYX0ZvbnQ6OkdldEdseXBoV2lkdGgoRlhfRFdPUkQgZ2x5cGhfaW5kZXgpIHsKKyAgaWYgKCFtX0ZhY2UpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAobV9wU3Vic3RGb250ICYmIChtX3BTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyAmIEZYRk9OVF9TVUJTVF9NTSkpIHsKKyAgICBBZGp1c3RNTVBhcmFtcyhnbHlwaF9pbmRleCwgMCwgMCk7CisgIH0KKyAgaW50IGVyciA9IEZYRlRfTG9hZF9HbHlwaCgKKyAgICAgIG1fRmFjZSwgZ2x5cGhfaW5kZXgsCisgICAgICBGWEZUX0xPQURfTk9fU0NBTEUgfCBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKTsKKyAgaWYgKGVycikgeworICAgIHJldHVybiAwOworICB9CisgIGludCB3aWR0aCA9IEVNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYRlRfR2V0X0dseXBoX0hvcmlBZHZhbmNlKG1fRmFjZSkpOworICByZXR1cm4gd2lkdGg7Cit9CisKK0ZYX0JPT0wgQ0ZYX0ZvbnQ6OkxvYWRFbWJlZGRlZChjb25zdCB1aW50OF90KiBkYXRhLCBGWF9EV09SRCBzaXplKSB7CisgIG1fcEZvbnREYXRhQWxsb2NhdGlvbiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNpemUpOworICBGWFNZU19tZW1jcHkobV9wRm9udERhdGFBbGxvY2F0aW9uLCBkYXRhLCBzaXplKTsKKyAgbV9GYWNlID0gRlRfTG9hZEZvbnQobV9wRm9udERhdGFBbGxvY2F0aW9uLCBzaXplKTsKKyAgbV9wRm9udERhdGEgPSBtX3BGb250RGF0YUFsbG9jYXRpb247CisgIG1fYkVtYmVkZGVkID0gVFJVRTsKKyAgbV9kd1NpemUgPSBzaXplOworICByZXR1cm4gbV9GYWNlICE9IE5VTEw7Cit9CisKK0ZYX0JPT0wgQ0ZYX0ZvbnQ6OklzVFRGb250KCkgY29uc3QgeworICBpZiAoIW1fRmFjZSkKKyAgICByZXR1cm4gRkFMU0U7CisgIHJldHVybiBGWEZUX0lzX0ZhY2VfVFRfT1QobV9GYWNlKSA9PSBGWEZUX0ZBQ0VfRkxBR19TRk5UOworfQorCitpbnQgQ0ZYX0ZvbnQ6OkdldEFzY2VudCgpIGNvbnN0IHsKKyAgaWYgKCFtX0ZhY2UpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBFTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksCisgICAgICAgICAgICAgICAgICAgRlhGVF9HZXRfRmFjZV9Bc2NlbmRlcihtX0ZhY2UpKTsKK30KKworaW50IENGWF9Gb250OjpHZXREZXNjZW50KCkgY29uc3QgeworICBpZiAoIW1fRmFjZSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIEVNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwKKyAgICAgICAgICAgICAgICAgICBGWEZUX0dldF9GYWNlX0Rlc2NlbmRlcihtX0ZhY2UpKTsKK30KKworRlhfQk9PTCBDRlhfRm9udDo6R2V0R2x5cGhCQm94KEZYX0RXT1JEIGdseXBoX2luZGV4LCBGWF9SRUNUJiBiYm94KSB7CisgIGlmICghbV9GYWNlKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoRlhGVF9Jc19GYWNlX1RyaWNreShtX0ZhY2UpKSB7CisgICAgaW50IGVycm9yID0gRlhGVF9TZXRfQ2hhcl9TaXplKG1fRmFjZSwgMCwgMTAwMCAqIDY0LCA3MiwgNzIpOwogICAgIGlmIChlcnJvcikgewotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgZXJyb3IgPSBGWEZUX1NldF9QaXhlbF9TaXplcyhmYWNlLCA2NCwgNjQpOworICAgIGVycm9yID0gRlhGVF9Mb2FkX0dseXBoKG1fRmFjZSwgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCk7CiAgICAgaWYgKGVycm9yKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICByZXR1cm4gZmFjZTsKLX0KLUZYX0JPT0wgQ0ZYX0ZvbnQ6OkxvYWRFbWJlZGRlZChGWF9MUENCWVRFIGRhdGEsIEZYX0RXT1JEIHNpemUpCi17Ci0gICAgbV9wRm9udERhdGFBbGxvY2F0aW9uID0gRlhfQWxsb2MoRlhfQllURSwgc2l6ZSk7Ci0gICAgRlhTWVNfbWVtY3B5MzIobV9wRm9udERhdGFBbGxvY2F0aW9uLCBkYXRhLCBzaXplKTsKLSAgICBtX0ZhY2UgPSBGVF9Mb2FkRm9udCgoRlhfTFBCWVRFKW1fcEZvbnREYXRhQWxsb2NhdGlvbiwgc2l6ZSk7Ci0gICAgbV9wRm9udERhdGEgPSAoRlhfTFBCWVRFKW1fcEZvbnREYXRhQWxsb2NhdGlvbjsKLSAgICBtX2JFbWJlZGRlZCA9IFRSVUU7Ci0gICAgbV9kd1NpemUgPSBzaXplOwotICAgIHJldHVybiBtX0ZhY2UgIT0gTlVMTDsKLX0KLUZYX0JPT0wgQ0ZYX0ZvbnQ6OklzVFRGb250KCkKLXsKLSAgICBpZiAobV9GYWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIEZYRlRfQkJveCBjYm94OworICAgIEZUX0dseXBoIGdseXBoOworICAgIGVycm9yID0gRlhGVF9HZXRfR2x5cGgoKChGWEZUX0ZhY2UpbV9GYWNlKS0+Z2x5cGgsICZnbHlwaCk7CisgICAgaWYgKGVycm9yKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIHJldHVybiBGWEZUX0lzX0ZhY2VfVFRfT1QobV9GYWNlKSA9PSBGWEZUX0ZBQ0VfRkxBR19TRk5UOwotfQotaW50IENGWF9Gb250OjpHZXRBc2NlbnQoKSBjb25zdAotewotICAgIGlmIChtX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW50IGFzY2VudCA9IEVNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwgRlhGVF9HZXRfRmFjZV9Bc2NlbmRlcihtX0ZhY2UpKTsKLSAgICByZXR1cm4gYXNjZW50OwotfQotaW50IENGWF9Gb250OjpHZXREZXNjZW50KCkgY29uc3QKLXsKLSAgICBpZiAobV9GYWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGludCBkZXNjZW50ID0gRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLCBGWEZUX0dldF9GYWNlX0Rlc2NlbmRlcihtX0ZhY2UpKTsKLSAgICByZXR1cm4gZGVzY2VudDsKLX0KLUZYX0JPT0wgQ0ZYX0ZvbnQ6OkdldEdseXBoQkJveChGWF9EV09SRCBnbHlwaF9pbmRleCwgRlhfUkVDVCAmYmJveCkKLXsKLSAgICBpZiAobV9GYWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoRlhGVF9Jc19GYWNlX1RyaWNreShtX0ZhY2UpKSB7Ci0gICAgICAgIGludCBlcnJvciA9IEZYRlRfU2V0X0NoYXJfU2l6ZShtX0ZhY2UsIDAsIDEwMDAgKiA2NCwgNzIsIDcyKTsKLSAgICAgICAgaWYgKGVycm9yKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZXJyb3IgPSBGWEZUX0xvYWRfR2x5cGgobV9GYWNlLCBnbHlwaF9pbmRleCwgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCk7Ci0gICAgICAgIGlmIChlcnJvcikgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIEZYRlRfQkJveCBjYm94OwotICAgICAgICBGVF9HbHlwaCBnbHlwaDsKLSAgICAgICAgZXJyb3IgPSBGWEZUX0dldF9HbHlwaCgoKEZYRlRfRmFjZSltX0ZhY2UpLT5nbHlwaCwgJmdseXBoKTsKLSAgICAgICAgaWYgKGVycm9yKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgRlhGVF9HbHlwaF9HZXRfQ0JveChnbHlwaCwgRlhGVF9HTFlQSF9CQk9YX1BJWEVMUywgJmNib3gpOwotICAgICAgICBpbnQgcGl4ZWxfc2l6ZV94ID0gKChGWEZUX0ZhY2UpbV9GYWNlKS0+c2l6ZS0+bWV0cmljcy54X3BwZW0sCi0gICAgICAgICAgICBwaXhlbF9zaXplX3kgPSAoKEZYRlRfRmFjZSltX0ZhY2UpLT5zaXplLT5tZXRyaWNzLnlfcHBlbTsKLSAgICAgICAgaWYgKHBpeGVsX3NpemVfeCA9PSAwIHx8IHBpeGVsX3NpemVfeSA9PSAwKSB7Ci0gICAgICAgICAgICBiYm94LmxlZnQgPSBjYm94LnhNaW47Ci0gICAgICAgICAgICBiYm94LnJpZ2h0ID0gY2JveC54TWF4OwotICAgICAgICAgICAgYmJveC50b3AgPSBjYm94LnlNYXg7Ci0gICAgICAgICAgICBiYm94LmJvdHRvbSA9IGNib3gueU1pbjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJib3gubGVmdCA9IGNib3gueE1pbiAqIDEwMDAgLyBwaXhlbF9zaXplX3g7Ci0gICAgICAgICAgICBiYm94LnJpZ2h0ID0gY2JveC54TWF4ICogMTAwMCAvIHBpeGVsX3NpemVfeDsKLSAgICAgICAgICAgIGJib3gudG9wID0gY2JveC55TWF4ICogMTAwMCAvIHBpeGVsX3NpemVfeTsKLSAgICAgICAgICAgIGJib3guYm90dG9tID0gY2JveC55TWluICogMTAwMCAvIHBpeGVsX3NpemVfeTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmJveC50b3AgPiBGWEZUX0dldF9GYWNlX0FzY2VuZGVyKG1fRmFjZSkpIHsKLSAgICAgICAgICAgIGJib3gudG9wID0gRlhGVF9HZXRfRmFjZV9Bc2NlbmRlcihtX0ZhY2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiYm94LmJvdHRvbSA8IEZYRlRfR2V0X0ZhY2VfRGVzY2VuZGVyKG1fRmFjZSkpIHsKLSAgICAgICAgICAgIGJib3guYm90dG9tID0gRlhGVF9HZXRfRmFjZV9EZXNjZW5kZXIobV9GYWNlKTsKLSAgICAgICAgfQotICAgICAgICBGVF9Eb25lX0dseXBoKGdseXBoKTsKLSAgICAgICAgcmV0dXJuIEZYRlRfU2V0X1BpeGVsX1NpemVzKG1fRmFjZSwgMCwgNjQpID09IDA7Ci0gICAgfQotICAgIGlmIChGWEZUX0xvYWRfR2x5cGgobV9GYWNlLCBnbHlwaF9pbmRleCwgRlhGVF9MT0FEX05PX1NDQUxFIHwgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpbnQgZW0gPSBGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKTsKLSAgICBpZiAoZW0gPT0gMCkgewotICAgICAgICBiYm94LmxlZnQgPSBGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1gobV9GYWNlKTsKLSAgICAgICAgYmJveC5ib3R0b20gPSBGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1kobV9GYWNlKTsKLSAgICAgICAgYmJveC50b3AgPSBiYm94LmJvdHRvbSAtIEZYRlRfR2V0X0dseXBoX0hlaWdodChtX0ZhY2UpOwotICAgICAgICBiYm94LnJpZ2h0ID0gYmJveC5sZWZ0ICsgRlhGVF9HZXRfR2x5cGhfV2lkdGgobV9GYWNlKTsKKyAgICBGWEZUX0dseXBoX0dldF9DQm94KGdseXBoLCBGWEZUX0dMWVBIX0JCT1hfUElYRUxTLCAmY2JveCk7CisgICAgaW50IHBpeGVsX3NpemVfeCA9ICgoRlhGVF9GYWNlKW1fRmFjZSktPnNpemUtPm1ldHJpY3MueF9wcGVtLAorICAgICAgICBwaXhlbF9zaXplX3kgPSAoKEZYRlRfRmFjZSltX0ZhY2UpLT5zaXplLT5tZXRyaWNzLnlfcHBlbTsKKyAgICBpZiAocGl4ZWxfc2l6ZV94ID09IDAgfHwgcGl4ZWxfc2l6ZV95ID09IDApIHsKKyAgICAgIGJib3gubGVmdCA9IGNib3gueE1pbjsKKyAgICAgIGJib3gucmlnaHQgPSBjYm94LnhNYXg7CisgICAgICBiYm94LnRvcCA9IGNib3gueU1heDsKKyAgICAgIGJib3guYm90dG9tID0gY2JveC55TWluOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGJib3gubGVmdCA9IEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWChtX0ZhY2UpICogMTAwMCAvIGVtOwotICAgICAgICBiYm94LnRvcCA9IChGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1kobV9GYWNlKSAtIEZYRlRfR2V0X0dseXBoX0hlaWdodChtX0ZhY2UpKSAqIDEwMDAgLyBlbTsKLSAgICAgICAgYmJveC5yaWdodCA9IChGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1gobV9GYWNlKSArIEZYRlRfR2V0X0dseXBoX1dpZHRoKG1fRmFjZSkpICogMTAwMCAvIGVtOwotICAgICAgICBiYm94LmJvdHRvbSA9IChGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1kobV9GYWNlKSkgKiAxMDAwIC8gZW07CisgICAgICBiYm94LmxlZnQgPSBjYm94LnhNaW4gKiAxMDAwIC8gcGl4ZWxfc2l6ZV94OworICAgICAgYmJveC5yaWdodCA9IGNib3gueE1heCAqIDEwMDAgLyBwaXhlbF9zaXplX3g7CisgICAgICBiYm94LnRvcCA9IGNib3gueU1heCAqIDEwMDAgLyBwaXhlbF9zaXplX3k7CisgICAgICBiYm94LmJvdHRvbSA9IGNib3gueU1pbiAqIDEwMDAgLyBwaXhlbF9zaXplX3k7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIGlmIChiYm94LnRvcCA+IEZYRlRfR2V0X0ZhY2VfQXNjZW5kZXIobV9GYWNlKSkgeworICAgICAgYmJveC50b3AgPSBGWEZUX0dldF9GYWNlX0FzY2VuZGVyKG1fRmFjZSk7CisgICAgfQorICAgIGlmIChiYm94LmJvdHRvbSA8IEZYRlRfR2V0X0ZhY2VfRGVzY2VuZGVyKG1fRmFjZSkpIHsKKyAgICAgIGJib3guYm90dG9tID0gRlhGVF9HZXRfRmFjZV9EZXNjZW5kZXIobV9GYWNlKTsKKyAgICB9CisgICAgRlRfRG9uZV9HbHlwaChnbHlwaCk7CisgICAgcmV0dXJuIEZYRlRfU2V0X1BpeGVsX1NpemVzKG1fRmFjZSwgMCwgNjQpID09IDA7CisgIH0KKyAgaWYgKEZYRlRfTG9hZF9HbHlwaCgKKyAgICAgICAgICBtX0ZhY2UsIGdseXBoX2luZGV4LAorICAgICAgICAgIEZYRlRfTE9BRF9OT19TQ0FMRSB8IEZYRlRfTE9BRF9JR05PUkVfR0xPQkFMX0FEVkFOQ0VfV0lEVEgpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGludCBlbSA9IEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpOworICBpZiAoZW0gPT0gMCkgeworICAgIGJib3gubGVmdCA9IEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWChtX0ZhY2UpOworICAgIGJib3guYm90dG9tID0gRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdZKG1fRmFjZSk7CisgICAgYmJveC50b3AgPSBiYm94LmJvdHRvbSAtIEZYRlRfR2V0X0dseXBoX0hlaWdodChtX0ZhY2UpOworICAgIGJib3gucmlnaHQgPSBiYm94LmxlZnQgKyBGWEZUX0dldF9HbHlwaF9XaWR0aChtX0ZhY2UpOworICB9IGVsc2UgeworICAgIGJib3gubGVmdCA9IEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWChtX0ZhY2UpICogMTAwMCAvIGVtOworICAgIGJib3gudG9wID0KKyAgICAgICAgKEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWShtX0ZhY2UpIC0gRlhGVF9HZXRfR2x5cGhfSGVpZ2h0KG1fRmFjZSkpICoKKyAgICAgICAgMTAwMCAvIGVtOworICAgIGJib3gucmlnaHQgPQorICAgICAgICAoRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdYKG1fRmFjZSkgKyBGWEZUX0dldF9HbHlwaF9XaWR0aChtX0ZhY2UpKSAqCisgICAgICAgIDEwMDAgLyBlbTsKKyAgICBiYm94LmJvdHRvbSA9IChGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1kobV9GYWNlKSkgKiAxMDAwIC8gZW07CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci1GWF9CT09MIENGWF9Gb250OjpJc0l0YWxpYygpCi17Ci0gICAgaWYgKG1fRmFjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKworRlhfQk9PTCBDRlhfRm9udDo6SXNJdGFsaWMoKSBjb25zdCB7CisgIGlmICghbV9GYWNlKQorICAgIHJldHVybiBGQUxTRTsKKworICBGWF9CT09MIHJldCA9IEZYRlRfSXNfRmFjZV9JdGFsaWMobV9GYWNlKSA9PSBGWEZUX1NUWUxFX0ZMQUdfSVRBTElDOworICBpZiAoIXJldCkgeworICAgIENGWF9CeXRlU3RyaW5nIHN0cihGWEZUX0dldF9GYWNlX1N0eWxlX05hbWUobV9GYWNlKSk7CisgICAgc3RyLk1ha2VMb3dlcigpOworICAgIGlmIChzdHIuRmluZCgiaXRhbGljIikgIT0gLTEpIHsKKyAgICAgIHJldCA9IFRSVUU7CiAgICAgfQotICAgIEZYX0JPT0wgcmV0ID0gRlhGVF9Jc19GYWNlX0l0YWxpYyhtX0ZhY2UpID09IEZYRlRfU1RZTEVfRkxBR19JVEFMSUM7Ci0gICAgaWYgKCFyZXQpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyKEZYRlRfR2V0X0ZhY2VfU3R5bGVfTmFtZShtX0ZhY2UpKTsKLSAgICAgICAgc3RyLk1ha2VMb3dlcigpOwotICAgICAgICBpZiAoc3RyLkZpbmQoIml0YWxpYyIpICE9IC0xKSB7Ci0gICAgICAgICAgICByZXQgPSBUUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXQ7CisgIH0KKyAgcmV0dXJuIHJldDsKIH0KLUZYX0JPT0wgQ0ZYX0ZvbnQ6OklzQm9sZCgpCi17Ci0gICAgaWYgKG1fRmFjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZYRlRfSXNfRmFjZV9Cb2xkKG1fRmFjZSkgPT0gRlhGVF9TVFlMRV9GTEFHX0JPTEQ7CisKK0ZYX0JPT0wgQ0ZYX0ZvbnQ6OklzQm9sZCgpIGNvbnN0IHsKKyAgaWYgKCFtX0ZhY2UpCisgICAgcmV0dXJuIEZBTFNFOworICByZXR1cm4gRlhGVF9Jc19GYWNlX0JvbGQobV9GYWNlKSA9PSBGWEZUX1NUWUxFX0ZMQUdfQk9MRDsKIH0KLUZYX0JPT0wgQ0ZYX0ZvbnQ6OklzRml4ZWRXaWR0aCgpCi17Ci0gICAgaWYgKG1fRmFjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZYRlRfSXNfRmFjZV9maXhlZHdpZHRoKG1fRmFjZSk7CisKK0ZYX0JPT0wgQ0ZYX0ZvbnQ6OklzRml4ZWRXaWR0aCgpIGNvbnN0IHsKKyAgaWYgKCFtX0ZhY2UpCisgICAgcmV0dXJuIEZBTFNFOworICByZXR1cm4gRlhGVF9Jc19GYWNlX2ZpeGVkd2lkdGgobV9GYWNlKTsKIH0KLUNGWF9XaWRlU3RyaW5nIENGWF9Gb250OjpHZXRQc05hbWUoKSBjb25zdAotewotICAgIGlmIChtX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgICB9Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgcHNOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChGWEZUX0dldF9Qb3N0c2NyaXB0X05hbWUobV9GYWNlKSk7Ci0gICAgaWYgKHBzTmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcHNOYW1lID0gIENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoIlVudGl0bGVkIik7Ci0gICAgfQotICAgIHJldHVybiBwc05hbWU7CisKK0NGWF9XaWRlU3RyaW5nIENGWF9Gb250OjpHZXRQc05hbWUoKSBjb25zdCB7CisgIGlmICghbV9GYWNlKSB7CisgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7CisgIH0KKyAgQ0ZYX1dpZGVTdHJpbmcgcHNOYW1lID0KKyAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoRlhGVF9HZXRfUG9zdHNjcmlwdF9OYW1lKG1fRmFjZSkpOworICBpZiAocHNOYW1lLklzRW1wdHkoKSkgeworICAgIHBzTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoIlVudGl0bGVkIik7CisgIH0KKyAgcmV0dXJuIHBzTmFtZTsKIH0KLUNGWF9CeXRlU3RyaW5nIENGWF9Gb250OjpHZXRGYW1pbHlOYW1lKCkgY29uc3QKLXsKLSAgICBpZiAobV9GYWNlID09IE5VTEwgJiYgbV9wU3Vic3RGb250ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci0gICAgfQotICAgIGlmIChtX0ZhY2UpIHsKLSAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKEZYRlRfR2V0X0ZhY2VfRmFtaWx5X05hbWUobV9GYWNlKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1fcFN1YnN0Rm9udC0+bV9GYW1pbHk7Ci0gICAgfQorQ0ZYX0J5dGVTdHJpbmcgQ0ZYX0ZvbnQ6OkdldEZhbWlseU5hbWUoKSBjb25zdCB7CisgIGlmICghbV9GYWNlICYmICFtX3BTdWJzdEZvbnQpIHsKKyAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKKyAgfQorICBpZiAobV9GYWNlKSB7CisgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKEZYRlRfR2V0X0ZhY2VfRmFtaWx5X05hbWUobV9GYWNlKSk7CisgIH0KKyAgcmV0dXJuIG1fcFN1YnN0Rm9udC0+bV9GYW1pbHk7CiB9Ci1DRlhfQnl0ZVN0cmluZyBDRlhfRm9udDo6R2V0RmFjZU5hbWUoKSBjb25zdAotewotICAgIGlmIChtX0ZhY2UgPT0gTlVMTCAmJiBtX3BTdWJzdEZvbnQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKK0NGWF9CeXRlU3RyaW5nIENGWF9Gb250OjpHZXRGYWNlTmFtZSgpIGNvbnN0IHsKKyAgaWYgKCFtX0ZhY2UgJiYgIW1fcFN1YnN0Rm9udCkgeworICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOworICB9CisgIGlmIChtX0ZhY2UpIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBmYWNlbmFtZTsKKyAgICBDRlhfQnl0ZVN0cmluZyBzdHlsZSA9IENGWF9CeXRlU3RyaW5nKEZYRlRfR2V0X0ZhY2VfU3R5bGVfTmFtZShtX0ZhY2UpKTsKKyAgICBmYWNlbmFtZSA9IEdldEZhbWlseU5hbWUoKTsKKyAgICBpZiAoZmFjZW5hbWUuSXNFbXB0eSgpKSB7CisgICAgICBmYWNlbmFtZSA9ICJVbnRpdGxlZCI7CiAgICAgfQotICAgIGlmIChtX0ZhY2UpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZmFjZW5hbWU7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHN0eWxlID0gQ0ZYX0J5dGVTdHJpbmcoRlhGVF9HZXRfRmFjZV9TdHlsZV9OYW1lKG1fRmFjZSkpOwotICAgICAgICBmYWNlbmFtZSA9IEdldEZhbWlseU5hbWUoKTsKLSAgICAgICAgaWYgKGZhY2VuYW1lLklzRW1wdHkoKSkgewotICAgICAgICAgICAgZmFjZW5hbWUgPSAiVW50aXRsZWQiOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc3R5bGUuSXNFbXB0eSgpICYmIHN0eWxlICE9ICJSZWd1bGFyIikgewotICAgICAgICAgICAgZmFjZW5hbWUgKz0gIiAiICsgc3R5bGU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhY2VuYW1lOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtX3BTdWJzdEZvbnQtPm1fRmFtaWx5OworICAgIGlmICghc3R5bGUuSXNFbXB0eSgpICYmIHN0eWxlICE9ICJSZWd1bGFyIikgeworICAgICAgZmFjZW5hbWUgKz0gIiAiICsgc3R5bGU7CiAgICAgfQorICAgIHJldHVybiBmYWNlbmFtZTsKKyAgfQorICByZXR1cm4gbV9wU3Vic3RGb250LT5tX0ZhbWlseTsKIH0KLUZYX0JPT0wgQ0ZYX0ZvbnQ6OkdldEJCb3goRlhfUkVDVCAmYmJveCkKLXsKLSAgICBpZiAobV9GYWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpbnQgZW0gPSBGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKTsKLSAgICBpZiAoZW0gPT0gMCkgewotICAgICAgICBiYm94LmxlZnQgPSBGWEZUX0dldF9GYWNlX3hNaW4obV9GYWNlKTsKLSAgICAgICAgYmJveC5ib3R0b20gPSBGWEZUX0dldF9GYWNlX3lNYXgobV9GYWNlKTsKLSAgICAgICAgYmJveC50b3AgPSBGWEZUX0dldF9GYWNlX3lNaW4obV9GYWNlKTsKLSAgICAgICAgYmJveC5yaWdodCA9IEZYRlRfR2V0X0ZhY2VfeE1heChtX0ZhY2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJib3gubGVmdCA9IEZYRlRfR2V0X0ZhY2VfeE1pbihtX0ZhY2UpICogMTAwMCAvIGVtOwotICAgICAgICBiYm94LnRvcCA9IEZYRlRfR2V0X0ZhY2VfeU1pbihtX0ZhY2UpICogMTAwMCAvIGVtOwotICAgICAgICBiYm94LnJpZ2h0ID0gRlhGVF9HZXRfRmFjZV94TWF4KG1fRmFjZSkgKiAxMDAwIC8gZW07Ci0gICAgICAgIGJib3guYm90dG9tID0gRlhGVF9HZXRfRmFjZV95TWF4KG1fRmFjZSkgKiAxMDAwIC8gZW07Ci0gICAgfQotICAgIHJldHVybiBUUlVFOworRlhfQk9PTCBDRlhfRm9udDo6R2V0QkJveChGWF9SRUNUJiBiYm94KSB7CisgIGlmICghbV9GYWNlKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGludCBlbSA9IEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpOworICBpZiAoZW0gPT0gMCkgeworICAgIGJib3gubGVmdCA9IEZYRlRfR2V0X0ZhY2VfeE1pbihtX0ZhY2UpOworICAgIGJib3guYm90dG9tID0gRlhGVF9HZXRfRmFjZV95TWF4KG1fRmFjZSk7CisgICAgYmJveC50b3AgPSBGWEZUX0dldF9GYWNlX3lNaW4obV9GYWNlKTsKKyAgICBiYm94LnJpZ2h0ID0gRlhGVF9HZXRfRmFjZV94TWF4KG1fRmFjZSk7CisgIH0gZWxzZSB7CisgICAgYmJveC5sZWZ0ID0gRlhGVF9HZXRfRmFjZV94TWluKG1fRmFjZSkgKiAxMDAwIC8gZW07CisgICAgYmJveC50b3AgPSBGWEZUX0dldF9GYWNlX3lNaW4obV9GYWNlKSAqIDEwMDAgLyBlbTsKKyAgICBiYm94LnJpZ2h0ID0gRlhGVF9HZXRfRmFjZV94TWF4KG1fRmFjZSkgKiAxMDAwIC8gZW07CisgICAgYmJveC5ib3R0b20gPSBGWEZUX0dldF9GYWNlX3lNYXgobV9GYWNlKSAqIDEwMDAgLyBlbTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLWludCBDRlhfRm9udDo6R2V0SGVpZ2h0KCkKLXsKLSAgICBpZiAobV9GYWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGludCBoZWlnaHQgPSBFTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksIEZYRlRfR2V0X0ZhY2VfSGVpZ2h0KG1fRmFjZSkpOwotICAgIHJldHVybiBoZWlnaHQ7CisKK2ludCBDRlhfRm9udDo6R2V0SGVpZ2h0KCkgY29uc3QgeworICBpZiAoIW1fRmFjZSkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLAorICAgICAgICAgICAgICAgICAgIEZYRlRfR2V0X0ZhY2VfSGVpZ2h0KG1fRmFjZSkpOwogfQotaW50IENGWF9Gb250OjpHZXRNYXhBZHZhbmNlV2lkdGgoKQotewotICAgIGlmIChtX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW50IHdpZHRoID0gRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLCBGWEZUX0dldF9GYWNlX01heEFkdmFuY2VXaWR0aChtX0ZhY2UpKTsKLSAgICByZXR1cm4gd2lkdGg7CisKK2ludCBDRlhfRm9udDo6R2V0TWF4QWR2YW5jZVdpZHRoKCkgY29uc3QgeworICBpZiAoIW1fRmFjZSkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLAorICAgICAgICAgICAgICAgICAgIEZYRlRfR2V0X0ZhY2VfTWF4QWR2YW5jZVdpZHRoKG1fRmFjZSkpOwogfQotaW50IENGWF9Gb250OjpHZXRVTFBvcygpCi17Ci0gICAgaWYgKG1fRmFjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpbnQgcG9zID0gRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLCBGWEZUX0dldF9GYWNlX1VuZGVyTGluZVBvc2l0aW9uKG1fRmFjZSkpOwotICAgIHJldHVybiBwb3M7CisKK2ludCBDRlhfRm9udDo6R2V0VUxQb3MoKSBjb25zdCB7CisgIGlmICghbV9GYWNlKQorICAgIHJldHVybiAwOworCisgIHJldHVybiBFTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksCisgICAgICAgICAgICAgICAgICAgRlhGVF9HZXRfRmFjZV9VbmRlckxpbmVQb3NpdGlvbihtX0ZhY2UpKTsKIH0KLWludCBDRlhfRm9udDo6R2V0VUx0aGlja25lc3MoKQotewotICAgIGlmIChtX0ZhY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW50IHRoaWNrbmVzcyA9IEVNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwgRlhGVF9HZXRfRmFjZV9VbmRlckxpbmVUaGlja25lc3MobV9GYWNlKSk7Ci0gICAgcmV0dXJuIHRoaWNrbmVzczsKKworaW50IENGWF9Gb250OjpHZXRVTHRoaWNrbmVzcygpIGNvbnN0IHsKKyAgaWYgKCFtX0ZhY2UpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIEVNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwKKyAgICAgICAgICAgICAgICAgICBGWEZUX0dldF9GYWNlX1VuZGVyTGluZVRoaWNrbmVzcyhtX0ZhY2UpKTsKIH0KLUNGWF9Vbmljb2RlRW5jb2Rpbmc6OkNGWF9Vbmljb2RlRW5jb2RpbmcoQ0ZYX0ZvbnQqIHBGb250KQotewotICAgIG1fcEZvbnQgPSBwRm9udDsKKworQ0ZYX1VuaWNvZGVFbmNvZGluZzo6Q0ZYX1VuaWNvZGVFbmNvZGluZyhDRlhfRm9udCogcEZvbnQpIDogbV9wRm9udChwRm9udCkgewogfQotRlhfRFdPUkQgQ0ZYX1VuaWNvZGVFbmNvZGluZzo6R2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpCi17Ci0gICAgRlhGVF9GYWNlIGZhY2UgPSAgbV9wRm9udC0+R2V0RmFjZSgpOwotICAgIGlmICghZmFjZSkgewotICAgICAgICByZXR1cm4gY2hhcmNvZGU7Ci0gICAgfQotICAgIGlmIChGWEZUX1NlbGVjdF9DaGFybWFwKGZhY2UsIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSkgPT0gMCkgewotICAgICAgICByZXR1cm4gRlhGVF9HZXRfQ2hhcl9JbmRleChmYWNlLCBjaGFyY29kZSk7Ci0gICAgfQotICAgIGlmIChtX3BGb250LT5tX3BTdWJzdEZvbnQgJiYgbV9wRm9udC0+bV9wU3Vic3RGb250LT5tX0NoYXJzZXQgPT0gMikgewotICAgICAgICBGWF9EV09SRCBpbmRleCA9IDA7Ci0gICAgICAgIGlmIChGWEZUX1NlbGVjdF9DaGFybWFwKGZhY2UsIEZYRlRfRU5DT0RJTkdfTVNfU1lNQk9MKSA9PSAwKSB7Ci0gICAgICAgICAgICBpbmRleCA9IEZYRlRfR2V0X0NoYXJfSW5kZXgoZmFjZSwgY2hhcmNvZGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghaW5kZXggJiYgIUZYRlRfU2VsZWN0X0NoYXJtYXAoZmFjZSwgRlhGVF9FTkNPRElOR19BUFBMRV9ST01BTikpIHsKLSAgICAgICAgICAgIHJldHVybiBGWEZUX0dldF9DaGFyX0luZGV4KGZhY2UsIGNoYXJjb2RlKTsKLSAgICAgICAgfQotICAgIH0KKworQ0ZYX1VuaWNvZGVFbmNvZGluZzo6fkNGWF9Vbmljb2RlRW5jb2RpbmcoKSB7Cit9CisKK0ZYX0RXT1JEIENGWF9Vbmljb2RlRW5jb2Rpbmc6OkdseXBoRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKSB7CisgIEZYRlRfRmFjZSBmYWNlID0gbV9wRm9udC0+R2V0RmFjZSgpOworICBpZiAoIWZhY2UpCiAgICAgcmV0dXJuIGNoYXJjb2RlOwotfQotRlhfRFdPUkQgQ0ZYX1VuaWNvZGVFbmNvZGluZzo6R2x5cGhGcm9tQ2hhckNvZGVFeChGWF9EV09SRCBjaGFyY29kZSwgaW50IGVuY29kaW5nKQotewotICAgIEZYRlRfRmFjZSBmYWNlID0gIG1fcEZvbnQtPkdldEZhY2UoKTsKLSAgICBpZiAoIWZhY2UpIHsKLSAgICAgICAgcmV0dXJuIGNoYXJjb2RlOwotICAgIH0KLSAgICBpZiAoZW5jb2RpbmcgPT0gRU5DT0RJTkdfVU5JQ09ERSkgewotICAgICAgICByZXR1cm4JR2x5cGhGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBubWFwcyA9IEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcENvdW50KG1fcEZvbnQtPm1fRmFjZSk7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgd2hpbGUgKGkgPCBubWFwcykgewotICAgICAgICAgICAgaW50IGVuY29kaW5nID0gRlhGVF9HZXRfQ2hhcm1hcF9FbmNvZGluZyhGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpW2krK10pOwotICAgICAgICAgICAgaWYgKGVuY29kaW5nICE9IEZYRlRfRU5DT0RJTkdfVU5JQ09ERSkgewotICAgICAgICAgICAgICAgIEZYRlRfU2VsZWN0X0NoYXJtYXAoZmFjZSwgZW5jb2RpbmcpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQorCisgIGlmIChGWEZUX1NlbGVjdF9DaGFybWFwKGZhY2UsIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSkgPT0gMCkKICAgICByZXR1cm4gRlhGVF9HZXRfQ2hhcl9JbmRleChmYWNlLCBjaGFyY29kZSk7CisKKyAgaWYgKG1fcEZvbnQtPkdldFN1YnN0Rm9udCgpICYmIG1fcEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX0NoYXJzZXQgPT0gMikgeworICAgIEZYX0RXT1JEIGluZGV4ID0gMDsKKyAgICBpZiAoRlhGVF9TZWxlY3RfQ2hhcm1hcChmYWNlLCBGWEZUX0VOQ09ESU5HX01TX1NZTUJPTCkgPT0gMCkKKyAgICAgIGluZGV4ID0gRlhGVF9HZXRfQ2hhcl9JbmRleChmYWNlLCBjaGFyY29kZSk7CisgICAgaWYgKCFpbmRleCAmJiAhRlhGVF9TZWxlY3RfQ2hhcm1hcChmYWNlLCBGWEZUX0VOQ09ESU5HX0FQUExFX1JPTUFOKSkKKyAgICAgIHJldHVybiBGWEZUX0dldF9DaGFyX0luZGV4KGZhY2UsIGNoYXJjb2RlKTsKKyAgfQorICByZXR1cm4gY2hhcmNvZGU7CiB9Ci1JRlhfRm9udEVuY29kaW5nKiBGWEdFX0NyZWF0ZVVuaWNvZGVFbmNvZGluZyhDRlhfRm9udCogcEZvbnQpCi17Ci0gICAgcmV0dXJuIG5ldyBDRlhfVW5pY29kZUVuY29kaW5nKHBGb250KTsKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCitDRlhfVW5pY29kZUVuY29kaW5nRXg6OkNGWF9Vbmljb2RlRW5jb2RpbmdFeChDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBFbmNvZGluZ0lEKQorICAgIDogQ0ZYX1VuaWNvZGVFbmNvZGluZyhwRm9udCksIG1fbkVuY29kaW5nSUQoRW5jb2RpbmdJRCkgewogfQorCitDRlhfVW5pY29kZUVuY29kaW5nRXg6On5DRlhfVW5pY29kZUVuY29kaW5nRXgoKSB7Cit9CisKK0ZYX0RXT1JEIENGWF9Vbmljb2RlRW5jb2RpbmdFeDo6R2x5cGhGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIHsKKyAgRlhGVF9GYWNlIGZhY2UgPSBtX3BGb250LT5HZXRGYWNlKCk7CisgIEZUX1VJbnQgbkluZGV4ID0gRlhGVF9HZXRfQ2hhcl9JbmRleChmYWNlLCBjaGFyY29kZSk7CisgIGlmIChuSW5kZXggPiAwKSB7CisgICAgcmV0dXJuIG5JbmRleDsKKyAgfQorICBpbnQgbm1hcHMgPSBGWEZUX0dldF9GYWNlX0NoYXJtYXBDb3VudChmYWNlKTsKKyAgaW50IG0gPSAwOworICB3aGlsZSAobSA8IG5tYXBzKSB7CisgICAgaW50IG5FbmNvZGluZ0lEID0KKyAgICAgICAgRlhGVF9HZXRfQ2hhcm1hcF9FbmNvZGluZyhGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpW20rK10pOworICAgIGlmIChtX25FbmNvZGluZ0lEID09IG5FbmNvZGluZ0lEKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50IGVycm9yID0gRlhGVF9TZWxlY3RfQ2hhcm1hcChmYWNlLCBuRW5jb2RpbmdJRCk7CisgICAgaWYgKGVycm9yKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgbkluZGV4ID0gRlhGVF9HZXRfQ2hhcl9JbmRleChmYWNlLCBjaGFyY29kZSk7CisgICAgaWYgKG5JbmRleCA+IDApIHsKKyAgICAgIG1fbkVuY29kaW5nSUQgPSBuRW5jb2RpbmdJRDsKKyAgICAgIHJldHVybiBuSW5kZXg7CisgICAgfQorICB9CisgIEZYRlRfU2VsZWN0X0NoYXJtYXAoZmFjZSwgbV9uRW5jb2RpbmdJRCk7CisgIHJldHVybiAwOworfQorCitGWF9EV09SRCBDRlhfVW5pY29kZUVuY29kaW5nRXg6OkNoYXJDb2RlRnJvbVVuaWNvZGUoRlhfV0NIQVIgVW5pY29kZSkgY29uc3QgeworICBpZiAobV9uRW5jb2RpbmdJRCA9PSBGWEZNX0VOQ09ESU5HX1VOSUNPREUgfHwKKyAgICAgIG1fbkVuY29kaW5nSUQgPT0gRlhGTV9FTkNPRElOR19NU19TWU1CT0wpIHsKKyAgICByZXR1cm4gVW5pY29kZTsKKyAgfQorICBGWEZUX0ZhY2UgZmFjZSA9IG1fcEZvbnQtPkdldEZhY2UoKTsKKyAgaW50IG5tYXBzID0gRlhGVF9HZXRfRmFjZV9DaGFybWFwQ291bnQoZmFjZSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbm1hcHM7IGkrKykgeworICAgIGludCBuRW5jb2RpbmdJRCA9CisgICAgICAgIEZYRlRfR2V0X0NoYXJtYXBfRW5jb2RpbmcoRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKVtpXSk7CisgICAgaWYgKG5FbmNvZGluZ0lEID09IEZYRk1fRU5DT0RJTkdfVU5JQ09ERSB8fAorICAgICAgICBuRW5jb2RpbmdJRCA9PSBGWEZNX0VOQ09ESU5HX01TX1NZTUJPTCkgeworICAgICAgcmV0dXJuIFVuaWNvZGU7CisgICAgfQorICB9CisgIHJldHVybiAtMTsKK30KKworQ0ZYX1VuaWNvZGVFbmNvZGluZ0V4KiBGWF9DcmVhdGVGb250RW5jb2RpbmdFeChDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5FbmNvZGluZ0lEKSB7CisgIGlmICghcEZvbnQgfHwgIXBGb250LT5HZXRGYWNlKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgaWYgKG5FbmNvZGluZ0lEICE9IEZYRk1fRU5DT0RJTkdfTk9ORSkKKyAgICByZXR1cm4gX0ZYRk1fQ3JlYXRlRm9udEVuY29kaW5nKHBGb250LCBuRW5jb2RpbmdJRCk7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoZ19FbmNvZGluZ0lEKTsgKytpKSB7CisgICAgQ0ZYX1VuaWNvZGVFbmNvZGluZ0V4KiBwRm9udEVuY29kaW5nID0KKyAgICAgICAgX0ZYRk1fQ3JlYXRlRm9udEVuY29kaW5nKHBGb250LCBnX0VuY29kaW5nSURbaV0pOworICAgIGlmIChwRm9udEVuY29kaW5nKSB7CisgICAgICByZXR1cm4gcEZvbnRFbmNvZGluZzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2ZvbnRtYXAuY3BwIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9mb250bWFwLmNwcAppbmRleCA3NGY5N2QxLi5iZTcxZjZiIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX2ZvbnRtYXAuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfZm9udG1hcC5jcHAKQEAgLTEsMTY4ICsxLDU3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKLSNpbmNsdWRlICJ0ZXh0X2ludC5oIgotI2RlZmluZSBHRVRfVFRfU0hPUlQodykgIChGWF9XT1JEKSgoKHcpWzBdIDw8IDgpIHwgKHcpWzFdKQotI2RlZmluZSBHRVRfVFRfTE9ORyh3KSAoRlhfRFdPUkQpKCgodylbMF0gPDwgMjQpIHwgKCh3KVsxXSA8PCAxNikgfCAoKHcpWzJdIDw8IDgpIHwgKHcpWzNdKQotQ0ZYX1N1YnN0Rm9udDo6Q0ZYX1N1YnN0Rm9udCgpCi17Ci0gICAgbV9FeHRIYW5kbGUgPSBOVUxMOwotICAgIG1fQ2hhcnNldCA9IDA7Ci0gICAgbV9TdWJzdEZsYWdzID0gMDsKLSAgICBtX1dlaWdodCA9IDA7Ci0gICAgbV9JdGFsaWNBbmdsZSA9IDA7Ci0gICAgbV9iU3Vic3RPZkNKSyA9IEZBTFNFOwotICAgIG1fV2VpZ2h0Q0pLID0gMDsKLSAgICBtX2JJdGxpY0NKSyA9IEZBTFNFOwotfQotQ1RURm9udERlc2M6On5DVFRGb250RGVzYygpCi17Ci0gICAgaWYgKG1fVHlwZSA9PSAxKSB7Ci0gICAgICAgIGlmIChtX1NpbmdsZUZhY2UubV9wRmFjZSkgewotICAgICAgICAgICAgRlhGVF9Eb25lX0ZhY2UobV9TaW5nbGVGYWNlLm1fcEZhY2UpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtX1R5cGUgPT0gMikgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpICsrKQotICAgICAgICAgICAgaWYgKG1fVFRDRmFjZS5tX3BGYWNlc1tpXSkgewotICAgICAgICAgICAgICAgIEZYRlRfRG9uZV9GYWNlKG1fVFRDRmFjZS5tX3BGYWNlc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtX3BGb250RGF0YSkgewotICAgICAgICBGWF9GcmVlKG1fcEZvbnREYXRhKTsKLSAgICB9Ci19Ci1GWF9CT09MIENUVEZvbnREZXNjOjpSZWxlYXNlRmFjZShGWEZUX0ZhY2UgZmFjZSkKLXsKLSAgICBpZiAobV9UeXBlID09IDEpIHsKLSAgICAgICAgaWYgKG1fU2luZ2xlRmFjZS5tX3BGYWNlICE9IGZhY2UpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobV9UeXBlID09IDIpIHsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSArKykKLSAgICAgICAgICAgIGlmIChtX1RUQ0ZhY2UubV9wRmFjZXNbaV0gPT0gZmFjZSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBpZiAoaSA9PSAxNikgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIG1fUmVmQ291bnQgLS07Ci0gICAgaWYgKG1fUmVmQ291bnQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBkZWxldGUgdGhpczsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUNGWF9Gb250TWdyOjpDRlhfRm9udE1ncigpCi17Ci0gICAgbV9wQnVpbHRpbk1hcHBlciA9IG5ldyBDRlhfRm9udE1hcHBlcjsKLSAgICBtX3BCdWlsdGluTWFwcGVyLT5tX3BGb250TWdyID0gdGhpczsKLSAgICBtX3BFeHRNYXBwZXIgPSBOVUxMOwotICAgIG1fRlRMaWJyYXJ5ID0gTlVMTDsKLSAgICBGWFNZU19tZW1zZXQzMihtX0V4dGVybmFsRm9udHMsIDAsIHNpemVvZiBtX0V4dGVybmFsRm9udHMpOwotfQotQ0ZYX0ZvbnRNZ3I6On5DRlhfRm9udE1ncigpCi17Ci0gICAgaWYgKG1fcEJ1aWx0aW5NYXBwZXIpIHsKLSAgICAgICAgZGVsZXRlIG1fcEJ1aWx0aW5NYXBwZXI7Ci0gICAgfQotICAgIEZyZWVDYWNoZSgpOwotICAgIGlmIChtX0ZUTGlicmFyeSkgewotICAgICAgICBGWEZUX0RvbmVfRnJlZVR5cGUobV9GVExpYnJhcnkpOwotICAgIH0KLX0KLXZvaWQgQ0ZYX0ZvbnRNZ3I6OkluaXRGVExpYnJhcnkoKQotewotICAgIGlmIChtX0ZUTGlicmFyeSA9PSBOVUxMKSB7Ci0gICAgICAgIEZYRlRfSW5pdF9GcmVlVHlwZSgmbV9GVExpYnJhcnkpOwotICAgIH0KLX0KLXZvaWQgQ0ZYX0ZvbnRNZ3I6OkZyZWVDYWNoZSgpCi17Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9GYWNlTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICB3aGlsZShwb3MpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgS2V5OwotICAgICAgICBDVFRGb250RGVzYyogZmFjZTsKLSAgICAgICAgbV9GYWNlTWFwLkdldE5leHRBc3NvYyhwb3MsIEtleSwgKHZvaWQqJilmYWNlKTsKLSAgICAgICAgZGVsZXRlIGZhY2U7Ci0gICAgfQotICAgIG1fRmFjZU1hcC5SZW1vdmVBbGwoKTsKLX0KLXZvaWQgQ0ZYX0ZvbnRNZ3I6OlNldFN5c3RlbUZvbnRJbmZvKElGWF9TeXN0ZW1Gb250SW5mbyogcEZvbnRJbmZvKQotewotICAgIG1fcEJ1aWx0aW5NYXBwZXItPlNldFN5c3RlbUZvbnRJbmZvKHBGb250SW5mbyk7Ci19Ci1GWEZUX0ZhY2UgQ0ZYX0ZvbnRNZ3I6OkZpbmRTdWJzdEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGZhY2VfbmFtZSwgRlhfQk9PTCBiVHJ1ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsIGludCB3ZWlnaHQsIGludCBpdGFsaWNfYW5nbGUsIGludCBDaGFyc2V0Q1AsIENGWF9TdWJzdEZvbnQqIHBTdWJzdEZvbnQpCi17Ci0gICAgaWYgKG1fRlRMaWJyYXJ5ID09IE5VTEwpIHsKLSAgICAgICAgRlhGVF9Jbml0X0ZyZWVUeXBlKCZtX0ZUTGlicmFyeSk7Ci0gICAgfQotICAgIGlmIChtX3BFeHRNYXBwZXIpIHsKLSAgICAgICAgRlhGVF9GYWNlIGZhY2UgPSBtX3BFeHRNYXBwZXItPkZpbmRTdWJzdEZvbnQoZmFjZV9uYW1lLCBiVHJ1ZVR5cGUsIGZsYWdzLCB3ZWlnaHQsIGl0YWxpY19hbmdsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc2V0Q1AsIHBTdWJzdEZvbnQpOwotICAgICAgICBpZiAoZmFjZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhY2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1fcEJ1aWx0aW5NYXBwZXItPkZpbmRTdWJzdEZvbnQoZmFjZV9uYW1lLCBiVHJ1ZVR5cGUsIGZsYWdzLCB3ZWlnaHQsIGl0YWxpY19hbmdsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc2V0Q1AsIHBTdWJzdEZvbnQpOwotfQotRlhGVF9GYWNlIENGWF9Gb250TWdyOjpHZXRDYWNoZWRGYWNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBGWF9MUEJZVEUmIHBGb250RGF0YSkKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBrZXkoZmFjZV9uYW1lKTsKLSAgICBrZXkgKz0gJywnOwotICAgIGtleSArPSBDRlhfQnl0ZVN0cmluZzo6Rm9ybWF0SW50ZWdlcih3ZWlnaHQpOwotICAgIGtleSArPSBiSXRhbGljID8gJ0knIDogJ04nOwotICAgIENUVEZvbnREZXNjKiBwRm9udERlc2MgPSBOVUxMOwotICAgIG1fRmFjZU1hcC5Mb29rdXAoa2V5LCAodm9pZComKXBGb250RGVzYyk7Ci0gICAgaWYocEZvbnREZXNjKSB7Ci0gICAgICAgIHBGb250RGF0YSA9IHBGb250RGVzYy0+bV9wRm9udERhdGE7Ci0gICAgICAgIHBGb250RGVzYy0+bV9SZWZDb3VudCArKzsKLSAgICAgICAgcmV0dXJuIHBGb250RGVzYy0+bV9TaW5nbGVGYWNlLm1fcEZhY2U7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotRlhGVF9GYWNlIENGWF9Gb250TWdyOjpBZGRDYWNoZWRGYWNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBGWF9MUEJZVEUgcERhdGEsIEZYX0RXT1JEIHNpemUsIGludCBmYWNlX2luZGV4KQotewotICAgIENUVEZvbnREZXNjKiBwRm9udERlc2MgPSBuZXcgQ1RURm9udERlc2M7Ci0gICAgcEZvbnREZXNjLT5tX1R5cGUgPSAxOwotICAgIHBGb250RGVzYy0+bV9TaW5nbGVGYWNlLm1fcEZhY2UgPSBOVUxMOwotICAgIHBGb250RGVzYy0+bV9TaW5nbGVGYWNlLm1fYkJvbGQgPSB3ZWlnaHQ7Ci0gICAgcEZvbnREZXNjLT5tX1NpbmdsZUZhY2UubV9iSXRhbGljID0gYkl0YWxpYzsKLSAgICBwRm9udERlc2MtPm1fcEZvbnREYXRhID0gcERhdGE7Ci0gICAgcEZvbnREZXNjLT5tX1JlZkNvdW50ID0gMTsKLSAgICBGWEZUX0xpYnJhcnkgbGlicmFyeTsKLSAgICBpZiAobV9GVExpYnJhcnkgPT0gTlVMTCkgewotICAgICAgICBGWEZUX0luaXRfRnJlZVR5cGUoJm1fRlRMaWJyYXJ5KTsKLSAgICB9Ci0gICAgbGlicmFyeSA9IG1fRlRMaWJyYXJ5OwotICAgIGludCByZXQgPSBGWEZUX05ld19NZW1vcnlfRmFjZShsaWJyYXJ5LCBwRGF0YSwgc2l6ZSwgZmFjZV9pbmRleCwgJnBGb250RGVzYy0+bV9TaW5nbGVGYWNlLm1fcEZhY2UpOwotICAgIGlmIChyZXQpIHsKLSAgICAgICAgZGVsZXRlIHBGb250RGVzYzsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldCA9IEZYRlRfU2V0X1BpeGVsX1NpemVzKHBGb250RGVzYy0+bV9TaW5nbGVGYWNlLm1fcEZhY2UsIDY0LCA2NCk7Ci0gICAgaWYgKHJldCkgewotICAgICAgICBkZWxldGUgcEZvbnREZXNjOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcga2V5KGZhY2VfbmFtZSk7Ci0gICAga2V5ICs9ICcsJzsKLSAgICBrZXkgKz0gQ0ZYX0J5dGVTdHJpbmc6OkZvcm1hdEludGVnZXIod2VpZ2h0KTsKLSAgICBrZXkgKz0gYkl0YWxpYyA/ICdJJyA6ICdOJzsKLSAgICBtX0ZhY2VNYXAuU2V0QXQoa2V5LCBwRm9udERlc2MpOwotICAgIHJldHVybiBwRm9udERlc2MtPm1fU2luZ2xlRmFjZS5tX3BGYWNlOwotfQotY29uc3QgRlhfTFBDU1RSIGdfQmFzZTE0Rm9udE5hbWVzWzE0XSA9IHsKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9nZS5oIgorI2luY2x1ZGUgImNvcmUvc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvY2hyb21lZm9udGRhdGEuaCIKKyNpbmNsdWRlICJjb3JlL3NyYy9meGdlL2dlL3RleHRfaW50LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgorCisjZGVmaW5lIEdFVF9UVF9TSE9SVCh3KSAoRlhfV09SRCkoKCh3KVswXSA8PCA4KSB8ICh3KVsxXSkKKyNkZWZpbmUgR0VUX1RUX0xPTkcodykgXAorICAoRlhfRFdPUkQpKCgodylbMF0gPDwgMjQpIHwgKCh3KVsxXSA8PCAxNikgfCAoKHcpWzJdIDw8IDgpIHwgKHcpWzNdKQorCisjZGVmaW5lIEZYX0ZPTlRfU1RZTEVfTm9uZSAweDAwCisjZGVmaW5lIEZYX0ZPTlRfU1RZTEVfQm9sZCAweDAxCisjZGVmaW5lIEZYX0ZPTlRfU1RZTEVfSXRhbGljIDB4MDIKKyNkZWZpbmUgRlhfRk9OVF9TVFlMRV9Cb2xkQm9sZCAweDA0CisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBCdWlsdGluRm9udCB7CisgIGNvbnN0IHVpbnQ4X3QqIG1fcEZvbnREYXRhOworICBGWF9EV09SRCBtX2R3U2l6ZTsKK307CisKK2NvbnN0IEJ1aWx0aW5Gb250IGdfRm94aXRGb250c1sxNF0gPSB7CisgICAge2dfRm94aXRGaXhlZEZvbnREYXRhLCAxNzU5N30sCisgICAge2dfRm94aXRGaXhlZEJvbGRGb250RGF0YSwgMTgwNTV9LAorICAgIHtnX0ZveGl0Rml4ZWRCb2xkSXRhbGljRm9udERhdGEsIDE5MTUxfSwKKyAgICB7Z19Gb3hpdEZpeGVkSXRhbGljRm9udERhdGEsIDE4NzQ2fSwKKyAgICB7Z19Gb3hpdFNhbnNGb250RGF0YSwgMTUwMjV9LAorICAgIHtnX0ZveGl0U2Fuc0JvbGRGb250RGF0YSwgMTYzNDR9LAorICAgIHtnX0ZveGl0U2Fuc0JvbGRJdGFsaWNGb250RGF0YSwgMTY0MTh9LAorICAgIHtnX0ZveGl0U2Fuc0l0YWxpY0ZvbnREYXRhLCAxNjMzOX0sCisgICAge2dfRm94aXRTZXJpZkZvbnREYXRhLCAxOTQ2OX0sCisgICAge2dfRm94aXRTZXJpZkJvbGRGb250RGF0YSwgMTkzOTV9LAorICAgIHtnX0ZveGl0U2VyaWZCb2xkSXRhbGljRm9udERhdGEsIDIwNzMzfSwKKyAgICB7Z19Gb3hpdFNlcmlmSXRhbGljRm9udERhdGEsIDIxMjI3fSwKKyAgICB7Z19Gb3hpdFN5bWJvbEZvbnREYXRhLCAxNjcyOX0sCisgICAge2dfRm94aXREaW5nYmF0c0ZvbnREYXRhLCAyOTUxM30sCit9OworCitjb25zdCBCdWlsdGluRm9udCBnX01NRm9udHNbMl0gPSB7CisgICAge2dfRm94aXRTZXJpZk1NRm9udERhdGEsIDExMzQxN30sCisgICAge2dfRm94aXRTYW5zTU1Gb250RGF0YSwgNjY5MTl9LAorfTsKKworY29uc3QgRlhfQ0hBUiogY29uc3QgZ19CYXNlMTRGb250TmFtZXNbMTRdID0gewogICAgICJDb3VyaWVyIiwKICAgICAiQ291cmllci1Cb2xkIiwKICAgICAiQ291cmllci1Cb2xkT2JsaXF1ZSIsCkBAIC0xNzgsMTEgKzY3LDExIEBACiAgICAgIlN5bWJvbCIsCiAgICAgIlphcGZEaW5nYmF0cyIsCiB9OwotY29uc3Qgc3RydWN0IF9BbHRGb250TmFtZSB7Ci0gICAgY29uc3QgRlhfQ0hBUioJbV9wTmFtZTsKLSAgICBpbnQJCW1fSW5kZXg7Ci19Ci1nX0FsdEZvbnROYW1lc1tdID0geworCitjb25zdCBzdHJ1Y3QgQWx0Rm9udE5hbWUgeworICBjb25zdCBGWF9DSEFSKiBtX3BOYW1lOworICBpbnQgbV9JbmRleDsKK30gZ19BbHRGb250TmFtZXNbXSA9IHsKICAgICB7IkFyaWFsIiwgNH0sCiAgICAgeyJBcmlhbCxCb2xkIiwgNX0sCiAgICAgeyJBcmlhbCxCb2xkSXRhbGljIiwgNn0sCkBAIC0yNzMsMTI1MyArMTYyLDE0NDIgQEAKICAgICB7IlRpbWVzTmV3Um9tYW5QU01ULEl0YWxpYyIsIDExfSwKICAgICB7IlphcGZEaW5nYmF0cyIsIDEzfSwKIH07Ci1leHRlcm4gIkMiIHsKLSAgICBzdGF0aWMgaW50IGNvbXBhcmVTdHJpbmcoY29uc3Qgdm9pZCoga2V5LCBjb25zdCB2b2lkKiBlbGVtZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZYU1lTX3N0cmljbXAoKEZYX0xQQ1NUUilrZXksICgoX0FsdEZvbnROYW1lKillbGVtZW50KS0+bV9wTmFtZSk7Ci0gICAgfQotfQotaW50IF9QREZfR2V0U3RhbmRhcmRGb250TmFtZShDRlhfQnl0ZVN0cmluZyYgbmFtZSkKLXsKLSAgICBfQWx0Rm9udE5hbWUqIGZvdW5kID0gKF9BbHRGb250TmFtZSopRlhTWVNfYnNlYXJjaChuYW1lLmNfc3RyKCksIGdfQWx0Rm9udE5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgZ19BbHRGb250TmFtZXMgLyBzaXplb2YgKF9BbHRGb250TmFtZSksIHNpemVvZiAoX0FsdEZvbnROYW1lKSwgY29tcGFyZVN0cmluZyk7Ci0gICAgaWYgKGZvdW5kID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBuYW1lID0gZ19CYXNlMTRGb250TmFtZXNbZm91bmQtPm1fSW5kZXhdOwotICAgIHJldHVybiBmb3VuZC0+bV9JbmRleDsKLX0KLWludCBHZXRUVENJbmRleChGWF9MUENCWVRFIHBGb250RGF0YSwgRlhfRFdPUkQgdHRjX3NpemUsIEZYX0RXT1JEIGZvbnRfb2Zmc2V0KQotewotICAgIGludCBmYWNlX2luZGV4ID0gMDsKLSAgICBGWF9MUENCWVRFIHAgPSBwRm9udERhdGEgKyA4OwotICAgIEZYX0RXT1JEIG5mb250ID0gR0VUX1RUX0xPTkcocCk7Ci0gICAgRlhfRFdPUkQgaW5kZXg7Ci0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbmZvbnQ7IGluZGV4ICsrKSB7Ci0gICAgICAgIHAgPSBwRm9udERhdGEgKyAxMiArIGluZGV4ICogNDsKLSAgICAgICAgaWYgKEdFVF9UVF9MT05HKHApID09IGZvbnRfb2Zmc2V0KSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZihpbmRleCA+PSBuZm9udCkgewotICAgICAgICBmYWNlX2luZGV4ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBmYWNlX2luZGV4ID0gaW5kZXg7Ci0gICAgfQotICAgIHJldHVybiBmYWNlX2luZGV4OwotfQotRlhGVF9GYWNlIENGWF9Gb250TWdyOjpHZXRDYWNoZWRUVENGYWNlKGludCB0dGNfc2l6ZSwgRlhfRFdPUkQgY2hlY2tzdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbnRfb2Zmc2V0LCBGWF9MUEJZVEUmIHBGb250RGF0YSkKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBrZXk7Ci0gICAga2V5LkZvcm1hdCgiJWQ6JWQiLCB0dGNfc2l6ZSwgY2hlY2tzdW0pOwotICAgIENUVEZvbnREZXNjKiBwRm9udERlc2MgPSBOVUxMOwotICAgIG1fRmFjZU1hcC5Mb29rdXAoa2V5LCAodm9pZComKXBGb250RGVzYyk7Ci0gICAgaWYgKHBGb250RGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBwRm9udERhdGEgPSBwRm9udERlc2MtPm1fcEZvbnREYXRhOwotICAgIHBGb250RGVzYy0+bV9SZWZDb3VudCArKzsKLSAgICBpbnQgZmFjZV9pbmRleCA9IEdldFRUQ0luZGV4KHBGb250RGVzYy0+bV9wRm9udERhdGEsIHR0Y19zaXplLCBmb250X29mZnNldCk7Ci0gICAgaWYgKHBGb250RGVzYy0+bV9UVENGYWNlLm1fcEZhY2VzW2ZhY2VfaW5kZXhdID09IE5VTEwpIHsKLSAgICAgICAgcEZvbnREZXNjLT5tX1RUQ0ZhY2UubV9wRmFjZXNbZmFjZV9pbmRleF0gPSBHZXRGaXhlZEZhY2UocEZvbnREZXNjLT5tX3BGb250RGF0YSwgdHRjX3NpemUsIGZhY2VfaW5kZXgpOwotICAgIH0KLSAgICByZXR1cm4gcEZvbnREZXNjLT5tX1RUQ0ZhY2UubV9wRmFjZXNbZmFjZV9pbmRleF07Ci19Ci1GWEZUX0ZhY2UgQ0ZYX0ZvbnRNZ3I6OkFkZENhY2hlZFRUQ0ZhY2UoaW50IHR0Y19zaXplLCBGWF9EV09SRCBjaGVja3N1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9MUEJZVEUgcERhdGEsIEZYX0RXT1JEIHNpemUsIGludCBmb250X29mZnNldCkKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBrZXk7Ci0gICAga2V5LkZvcm1hdCgiJWQ6JWQiLCB0dGNfc2l6ZSwgY2hlY2tzdW0pOwotICAgIENUVEZvbnREZXNjKiBwRm9udERlc2MgPSBuZXcgQ1RURm9udERlc2M7Ci0gICAgcEZvbnREZXNjLT5tX1R5cGUgPSAyOwotICAgIHBGb250RGVzYy0+bV9wRm9udERhdGEgPSBwRGF0YTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpICsrKSB7Ci0gICAgICAgIHBGb250RGVzYy0+bV9UVENGYWNlLm1fcEZhY2VzW2ldID0gTlVMTDsKLSAgICB9Ci0gICAgcEZvbnREZXNjLT5tX1JlZkNvdW50ICsrOwotICAgIGtleS5Gb3JtYXQoIiVkOiVkIiwgdHRjX3NpemUsIGNoZWNrc3VtKTsKLSAgICBtX0ZhY2VNYXAuU2V0QXQoa2V5LCBwRm9udERlc2MpOwotICAgIGludCBmYWNlX2luZGV4ID0gR2V0VFRDSW5kZXgocEZvbnREZXNjLT5tX3BGb250RGF0YSwgdHRjX3NpemUsIGZvbnRfb2Zmc2V0KTsKLSAgICBwRm9udERlc2MtPm1fVFRDRmFjZS5tX3BGYWNlc1tmYWNlX2luZGV4XSA9IEdldEZpeGVkRmFjZShwRm9udERlc2MtPm1fcEZvbnREYXRhLCB0dGNfc2l6ZSwgZmFjZV9pbmRleCk7Ci0gICAgcmV0dXJuIHBGb250RGVzYy0+bV9UVENGYWNlLm1fcEZhY2VzW2ZhY2VfaW5kZXhdOwotfQotRlhGVF9GYWNlIENGWF9Gb250TWdyOjpHZXRGaXhlZEZhY2UoRlhfTFBDQllURSBwRGF0YSwgRlhfRFdPUkQgc2l6ZSwgaW50IGZhY2VfaW5kZXgpCi17Ci0gICAgRlhGVF9MaWJyYXJ5IGxpYnJhcnk7Ci0gICAgaWYgKG1fRlRMaWJyYXJ5ID09IE5VTEwpIHsKLSAgICAgICAgRlhGVF9Jbml0X0ZyZWVUeXBlKCZtX0ZUTGlicmFyeSk7Ci0gICAgfQotICAgIGxpYnJhcnkgPSBtX0ZUTGlicmFyeTsKLSAgICBGWEZUX0ZhY2UgZmFjZSA9IE5VTEw7Ci0gICAgaW50IHJldCA9IEZYRlRfTmV3X01lbW9yeV9GYWNlKGxpYnJhcnksIHBEYXRhLCBzaXplLCBmYWNlX2luZGV4LCAmZmFjZSk7Ci0gICAgaWYgKHJldCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0ID0gRlhGVF9TZXRfUGl4ZWxfU2l6ZXMoZmFjZSwgNjQsIDY0KTsKLSAgICBpZiAocmV0KSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gZmFjZTsKLX0KLUZYRlRfRmFjZSBDRlhfRm9udE1ncjo6R2V0RmlsZUZhY2UoRlhfTFBDU1RSIGZpbGVuYW1lLCBpbnQgZmFjZV9pbmRleCkKLXsKLSAgICBGWEZUX0xpYnJhcnkgbGlicmFyeTsKLSAgICBpZiAobV9GVExpYnJhcnkgPT0gTlVMTCkgewotICAgICAgICBGWEZUX0luaXRfRnJlZVR5cGUoJm1fRlRMaWJyYXJ5KTsKLSAgICB9Ci0gICAgbGlicmFyeSA9IG1fRlRMaWJyYXJ5OwotICAgIEZYRlRfRmFjZSBmYWNlID0gTlVMTDsKLSAgICBpbnQgcmV0ID0gRlhGVF9OZXdfRmFjZShsaWJyYXJ5LCBmaWxlbmFtZSwgZmFjZV9pbmRleCwgJmZhY2UpOwotICAgIGlmIChyZXQpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldCA9IEZYRlRfU2V0X1BpeGVsX1NpemVzKGZhY2UsIDY0LCA2NCk7Ci0gICAgaWYgKHJldCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIGZhY2U7Ci19Ci12b2lkIENGWF9Gb250TWdyOjpSZWxlYXNlRmFjZShGWEZUX0ZhY2UgZmFjZSkKLXsKLSAgICBpZiAoZmFjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9GYWNlTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICB3aGlsZShwb3MpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgS2V5OwotICAgICAgICBDVFRGb250RGVzYyogdHRmYWNlOwotICAgICAgICBtX0ZhY2VNYXAuR2V0TmV4dEFzc29jKHBvcywgS2V5LCAodm9pZComKXR0ZmFjZSk7Ci0gICAgICAgIGlmICh0dGZhY2UtPlJlbGVhc2VGYWNlKGZhY2UpKSB7Ci0gICAgICAgICAgICBtX0ZhY2VNYXAuUmVtb3ZlS2V5KEtleSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1leHRlcm4gIkMiIHsKLSAgICBleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBnX0ZveGl0Rml4ZWRJdGFsaWNGb250RGF0YSBbMTg3NDZdOwotICAgIGV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRGaXhlZEZvbnREYXRhIFsxNzU5N107Ci0gICAgZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgZ19Gb3hpdFNhbnNJdGFsaWNGb250RGF0YSBbMTYzMzldOwotICAgIGV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRTYW5zRm9udERhdGEgWzE1MDI1XTsKLSAgICBleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBnX0ZveGl0U2VyaWZJdGFsaWNGb250RGF0YSBbMjEyMjddOwotICAgIGV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRTZXJpZkZvbnREYXRhIFsxOTQ2OV07Ci0gICAgZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgZ19Gb3hpdEZpeGVkQm9sZEl0YWxpY0ZvbnREYXRhIFsxOTE1MV07Ci0gICAgZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgZ19Gb3hpdEZpeGVkQm9sZEZvbnREYXRhIFsxODA1NV07Ci0gICAgZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgZ19Gb3hpdFNhbnNCb2xkSXRhbGljRm9udERhdGEgWzE2NDE4XTsKLSAgICBleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBnX0ZveGl0U2Fuc0JvbGRGb250RGF0YSBbMTYzNDRdOwotICAgIGV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRTZXJpZkJvbGRJdGFsaWNGb250RGF0YSBbMjA3MzNdOwotICAgIGV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRTZXJpZkJvbGRGb250RGF0YSBbMTkzOTVdOwotICAgIGV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRTeW1ib2xGb250RGF0YVsxNjcyOV07Ci0gICAgZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgZ19Gb3hpdERpbmdiYXRzRm9udERhdGFbMjk1MTNdOwotICAgIGV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfRm94aXRTZXJpZk1NRm9udERhdGFbMTEzNDE3XTsKLSAgICBleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBnX0ZveGl0U2Fuc01NRm9udERhdGFbNjY5MTldOworCitjb25zdCBzdHJ1Y3QgeworICBjb25zdCBGWF9DSEFSKiBtX3BOYW1lOworICBjb25zdCBGWF9DSEFSKiBtX3BTdWJzdE5hbWU7Cit9IEJhc2UxNFN1YnN0c1tdID0geworICAgIHsiQ291cmllciIsICJDb3VyaWVyIE5ldyJ9LAorICAgIHsiQ291cmllci1Cb2xkIiwgIkNvdXJpZXIgTmV3IEJvbGQifSwKKyAgICB7IkNvdXJpZXItQm9sZE9ibGlxdWUiLCAiQ291cmllciBOZXcgQm9sZCBJdGFsaWMifSwKKyAgICB7IkNvdXJpZXItT2JsaXF1ZSIsICJDb3VyaWVyIE5ldyBJdGFsaWMifSwKKyAgICB7IkhlbHZldGljYSIsICJBcmlhbCJ9LAorICAgIHsiSGVsdmV0aWNhLUJvbGQiLCAiQXJpYWwgQm9sZCJ9LAorICAgIHsiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIiwgIkFyaWFsIEJvbGQgSXRhbGljIn0sCisgICAgeyJIZWx2ZXRpY2EtT2JsaXF1ZSIsICJBcmlhbCBJdGFsaWMifSwKKyAgICB7IlRpbWVzLVJvbWFuIiwgIlRpbWVzIE5ldyBSb21hbiJ9LAorICAgIHsiVGltZXMtQm9sZCIsICJUaW1lcyBOZXcgUm9tYW4gQm9sZCJ9LAorICAgIHsiVGltZXMtQm9sZEl0YWxpYyIsICJUaW1lcyBOZXcgUm9tYW4gQm9sZCBJdGFsaWMifSwKKyAgICB7IlRpbWVzLUl0YWxpYyIsICJUaW1lcyBOZXcgUm9tYW4gSXRhbGljIn0sCiB9OwotY29uc3QgRm94aXRGb250cyBnX0ZveGl0Rm9udHNbMTRdID0gewotICAgIHtnX0ZveGl0Rml4ZWRGb250RGF0YSwgMTc1OTd9LAotICAgIHtnX0ZveGl0Rml4ZWRCb2xkRm9udERhdGEsIDE4MDU1fSwKLSAgICB7Z19Gb3hpdEZpeGVkQm9sZEl0YWxpY0ZvbnREYXRhLCAxOTE1MX0sCi0gICAge2dfRm94aXRGaXhlZEl0YWxpY0ZvbnREYXRhLCAxODc0Nn0sCi0gICAge2dfRm94aXRTYW5zRm9udERhdGEsIDE1MDI1fSwKLSAgICB7Z19Gb3hpdFNhbnNCb2xkRm9udERhdGEsIDE2MzQ0fSwKLSAgICB7Z19Gb3hpdFNhbnNCb2xkSXRhbGljRm9udERhdGEsIDE2NDE4fSwKLSAgICB7Z19Gb3hpdFNhbnNJdGFsaWNGb250RGF0YSwgMTYzMzl9LAotICAgIHtnX0ZveGl0U2VyaWZGb250RGF0YSwgMTk0Njl9LAotICAgIHtnX0ZveGl0U2VyaWZCb2xkRm9udERhdGEsIDE5Mzk1fSwKLSAgICB7Z19Gb3hpdFNlcmlmQm9sZEl0YWxpY0ZvbnREYXRhLCAyMDczM30sCi0gICAge2dfRm94aXRTZXJpZkl0YWxpY0ZvbnREYXRhLCAyMTIyN30sCi0gICAge2dfRm94aXRTeW1ib2xGb250RGF0YSwgMTY3Mjl9LAotICAgIHtnX0ZveGl0RGluZ2JhdHNGb250RGF0YSwgMjk1MTN9LAotfTsKLXZvaWQgX0ZQREZBUElfR2V0SW50ZXJuYWxGb250RGF0YShpbnQgaWQsIEZYX0xQQ0JZVEUmIGRhdGEsIEZYX0RXT1JEJiBzaXplKQotewotICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+R2V0U3RhbmRhcmRGb250KGRhdGEsIHNpemUsIGlkKTsKLX0KLUZYX0JPT0wgQ0ZYX0ZvbnRNZ3I6OkdldFN0YW5kYXJkRm9udChGWF9MUENCWVRFJiBwRm9udERhdGEsIEZYX0RXT1JEJiBzaXplLCBpbnQgaW5kZXgpCi17Ci0gICAgaWYgKGluZGV4ID4gMTUgfHwgaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgewotICAgICAgICBpZiAoaW5kZXggPj0gMTQpIHsKLSAgICAgICAgICAgIGlmIChpbmRleCA9PSAxNCkgewotICAgICAgICAgICAgICAgIHBGb250RGF0YSA9IGdfRm94aXRTZXJpZk1NRm9udERhdGE7Ci0gICAgICAgICAgICAgICAgc2l6ZSA9IDExMzQxNzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcEZvbnREYXRhID0gZ19Gb3hpdFNhbnNNTUZvbnREYXRhOwotICAgICAgICAgICAgICAgIHNpemUgPSA2NjkxOTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBGb250RGF0YSA9IGdfRm94aXRGb250c1tpbmRleF0ubV9wRm9udERhdGE7Ci0gICAgICAgICAgICBzaXplID0gZ19Gb3hpdEZvbnRzW2luZGV4XS5tX2R3U2l6ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUNGWF9Gb250TWFwcGVyOjpDRlhfRm9udE1hcHBlcigpCi17Ci0gICAgRlhTWVNfbWVtc2V0MzIobV9Gb3hpdEZhY2VzLCAwLCBzaXplb2YgbV9Gb3hpdEZhY2VzKTsKLSAgICBtX01NRmFjZXNbMF0gPSBtX01NRmFjZXNbMV0gPSBOVUxMOwotICAgIG1fcEZvbnRJbmZvID0gTlVMTDsKLSAgICBtX2JMaXN0TG9hZGVkID0gRkFMU0U7Ci0gICAgbV9wRm9udEVudW1lcmF0b3IgPSBOVUxMOwotfQotQ0ZYX0ZvbnRNYXBwZXI6On5DRlhfRm9udE1hcHBlcigpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNDsgaSArKykKLSAgICAgICAgaWYgKG1fRm94aXRGYWNlc1tpXSkgewotICAgICAgICAgICAgRlhGVF9Eb25lX0ZhY2UobV9Gb3hpdEZhY2VzW2ldKTsKLSAgICAgICAgfQotICAgIGlmIChtX01NRmFjZXNbMF0pIHsKLSAgICAgICAgRlhGVF9Eb25lX0ZhY2UobV9NTUZhY2VzWzBdKTsKLSAgICB9Ci0gICAgaWYgKG1fTU1GYWNlc1sxXSkgewotICAgICAgICBGWEZUX0RvbmVfRmFjZShtX01NRmFjZXNbMV0pOwotICAgIH0KLSAgICBpZiAobV9wRm9udEluZm8pIHsKLSAgICAgICAgbV9wRm9udEluZm8tPlJlbGVhc2UoKTsKLSAgICB9Ci19Ci12b2lkIENGWF9Gb250TWFwcGVyOjpTZXRTeXN0ZW1Gb250SW5mbyhJRlhfU3lzdGVtRm9udEluZm8qIHBGb250SW5mbykKLXsKLSAgICBpZiAocEZvbnRJbmZvID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobV9wRm9udEluZm8pIHsKLSAgICAgICAgbV9wRm9udEluZm8tPlJlbGVhc2UoKTsKLSAgICB9Ci0gICAgbV9wRm9udEluZm8gPSBwRm9udEluZm87Ci19Ci1zdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgX1RUX05vcm1hbGl6ZU5hbWUoRlhfTFBDU1RSIGZhbWlseSkKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBub3JtKGZhbWlseSwgLTEpOwotICAgIG5vcm0uUmVtb3ZlKCcgJyk7Ci0gICAgbm9ybS5SZW1vdmUoJy0nKTsKLSAgICBub3JtLlJlbW92ZSgnLCcpOwotICAgIGludCBwb3MgPSBub3JtLkZpbmQoJysnKTsKLSAgICBpZiAocG9zID4gMCkgewotICAgICAgICBub3JtID0gbm9ybS5MZWZ0KHBvcyk7Ci0gICAgfQotICAgIG5vcm0uTWFrZUxvd2VyKCk7Ci0gICAgcmV0dXJuIG5vcm07Ci19Ci1DRlhfQnl0ZVN0cmluZyBfRlBERl9HZXROYW1lRnJvbVRUKEZYX0xQQ0JZVEUgbmFtZV90YWJsZSwgRlhfRFdPUkQgbmFtZV9pZCkKLXsKLSAgICBGWF9MUENCWVRFIHB0ciA9IG5hbWVfdGFibGUgKyAyOwotICAgIGludCBuYW1lX2NvdW50ID0gR0VUX1RUX1NIT1JUKHB0cik7Ci0gICAgaW50IHN0cmluZ19vZmZzZXQgPSBHRVRfVFRfU0hPUlQocHRyICsgMik7Ci0gICAgRlhfTFBDQllURSBzdHJpbmdfcHRyID0gbmFtZV90YWJsZSArIHN0cmluZ19vZmZzZXQ7Ci0gICAgcHRyICs9IDQ7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lX2NvdW50OyBpICsrKSB7Ci0gICAgICAgIGlmIChHRVRfVFRfU0hPUlQocHRyICsgNikgPT0gbmFtZV9pZCAmJiBHRVRfVFRfU0hPUlQocHRyKSA9PSAxICYmIEdFVF9UVF9TSE9SVChwdHIgKyAyKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKHN0cmluZ19wdHIgKyBHRVRfVFRfU0hPUlQocHRyICsgMTApLCBHRVRfVFRfU0hPUlQocHRyICsgOCkpOwotICAgICAgICB9Ci0gICAgICAgIHB0ciArPSAxMjsKLSAgICB9Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci19Ci1zdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgX0ZQREZfUmVhZFN0cmluZ0Zyb21GaWxlKEZYU1lTX0ZJTEUqIHBGaWxlLCBGWF9EV09SRCBzaXplKQotewotICAgIENGWF9CeXRlU3RyaW5nIGJ1ZmZlcjsKLSAgICBpZiAoIUZYU1lTX2ZyZWFkKGJ1ZmZlci5HZXRCdWZmZXIoc2l6ZSksIHNpemUsIDEsIHBGaWxlKSkgewotICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKLSAgICB9Ci0gICAgYnVmZmVyLlJlbGVhc2VCdWZmZXIoc2l6ZSk7Ci0gICAgcmV0dXJuIGJ1ZmZlcjsKLX0KLUNGWF9CeXRlU3RyaW5nIF9GUERGX0xvYWRUYWJsZUZyb21UVChGWFNZU19GSUxFKiBwRmlsZSwgRlhfTFBDQllURSBwVGFibGVzLCBGWF9EV09SRCBuVGFibGVzLCBGWF9EV09SRCB0YWcpCi17Ci0gICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG5UYWJsZXM7IGkgKyspIHsKLSAgICAgICAgRlhfTFBDQllURSBwID0gcFRhYmxlcyArIGkgKiAxNjsKLSAgICAgICAgaWYgKEdFVF9UVF9MT05HKHApID09IHRhZykgewotICAgICAgICAgICAgRlhfRFdPUkQgb2Zmc2V0ID0gR0VUX1RUX0xPTkcocCArIDgpOwotICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSA9IEdFVF9UVF9MT05HKHAgKyAxMik7Ci0gICAgICAgICAgICBGWFNZU19mc2VlayhwRmlsZSwgb2Zmc2V0LCBGWFNZU19TRUVLX1NFVCk7Ci0gICAgICAgICAgICByZXR1cm4gX0ZQREZfUmVhZFN0cmluZ0Zyb21GaWxlKHBGaWxlLCBzaXplKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKLX0KLUNGWF9CeXRlU3RyaW5nIF9GUERGX0xvYWRUYWJsZUZyb21UVFN0cmVhbUZpbGUoSUZYX0ZpbGVTdHJlYW0qIHBGaWxlLCBGWF9MUENCWVRFIHBUYWJsZXMsIEZYX0RXT1JEIG5UYWJsZXMsIEZYX0RXT1JEIHRhZykKLXsKLSAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgblRhYmxlczsgaSArKykgewotICAgICAgICBGWF9MUENCWVRFIHAgPSBwVGFibGVzICsgaSAqIDE2OwotICAgICAgICBpZiAoR0VUX1RUX0xPTkcocCkgPT0gdGFnKSB7Ci0gICAgICAgICAgICBGWF9EV09SRCBvZmZzZXQgPSBHRVRfVFRfTE9ORyhwICsgOCk7Ci0gICAgICAgICAgICBGWF9EV09SRCBzaXplID0gR0VUX1RUX0xPTkcocCArIDEyKTsKLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJ1ZmZlcjsKLSAgICAgICAgICAgIGlmICghcEZpbGUtPlJlYWRCbG9jayhidWZmZXIuR2V0QnVmZmVyKHNpemUpLCBvZmZzZXQsIHNpemUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWZmZXIuUmVsZWFzZUJ1ZmZlcihzaXplKTsKLSAgICAgICAgICAgIHJldHVybiBidWZmZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci19Ci1DRlhfQnl0ZVN0cmluZyBDRlhfRm9udE1hcHBlcjo6R2V0UFNOYW1lRnJvbVRUKHZvaWQqIGhGb250KQotewotICAgIGlmIChtX3BGb250SW5mbyA9PSBOVUxMKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nKCk7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nIHJlc3VsdDsKLSAgICBGWF9EV09SRCBzaXplID0gbV9wRm9udEluZm8tPkdldEZvbnREYXRhKGhGb250LCAweDZlNjE2ZDY1LCBOVUxMLCAwKTsKLSAgICBpZiAoc2l6ZSkgewotICAgICAgICBGWF9MUEJZVEUgYnVmZmVyID0gRlhfQWxsb2MoRlhfQllURSwgc2l6ZSk7Ci0gICAgICAgIG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwgMHg2ZTYxNmQ2NSwgYnVmZmVyLCBzaXplKTsKLSAgICAgICAgcmVzdWx0ID0gX0ZQREZfR2V0TmFtZUZyb21UVChidWZmZXIsIDYpOwotICAgICAgICBGWF9GcmVlKGJ1ZmZlcik7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci12b2lkIENGWF9Gb250TWFwcGVyOjpBZGRJbnN0YWxsZWRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBpbnQgY2hhcnNldCkKLXsKLSAgICBpZiAobV9wRm9udEluZm8gPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtX0NoYXJzZXRBcnJheS5GaW5kKChGWF9EV09SRCljaGFyc2V0KSA9PSAtMSkgewotICAgICAgICBtX0NoYXJzZXRBcnJheS5BZGQoKEZYX0RXT1JEKWNoYXJzZXQpOwotICAgICAgICBtX0ZhY2VBcnJheS5BZGQobmFtZSk7Ci0gICAgfQotICAgIGlmIChuYW1lID09IG1fTGFzdEZhbWlseSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYX0xQQ0JZVEUgcHRyID0gbmFtZTsKLSAgICBGWF9CT09MIGJMb2NhbGl6ZWQgPSBGQUxTRTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWUuR2V0TGVuZ3RoKCk7IGkgKyspCi0gICAgICAgIGlmIChwdHJbaV0gPiAweDgwKSB7Ci0gICAgICAgICAgICBiTG9jYWxpemVkID0gVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgaWYgKGJMb2NhbGl6ZWQpIHsKLSAgICAgICAgdm9pZCogaEZvbnQgPSBtX3BGb250SW5mby0+R2V0Rm9udChuYW1lKTsKLSAgICAgICAgaWYgKGhGb250ID09IE5VTEwpIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYkV4YWN0OwotICAgICAgICAgICAgaEZvbnQgPSBtX3BGb250SW5mby0+TWFwRm9udCgwLCAwLCBGWEZPTlRfREVGQVVMVF9DSEFSU0VULCAwLCBuYW1lLCBiRXhhY3QpOwotICAgICAgICAgICAgaWYgKGhGb250ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmV3X25hbWUgPSBHZXRQU05hbWVGcm9tVFQoaEZvbnQpOwotICAgICAgICBpZiAoIW5ld19uYW1lLklzRW1wdHkoKSkgewotICAgICAgICAgICAgbmV3X25hbWUuSW5zZXJ0KDAsICcgJyk7Ci0gICAgICAgICAgICBtX0luc3RhbGxlZFRURm9udHMuQWRkKG5ld19uYW1lKTsKLSAgICAgICAgfQotICAgICAgICBtX3BGb250SW5mby0+RGVsZXRlRm9udChoRm9udCk7Ci0gICAgfQotICAgIG1fSW5zdGFsbGVkVFRGb250cy5BZGQobmFtZSk7Ci0gICAgbV9MYXN0RmFtaWx5ID0gbmFtZTsKLX0KLXZvaWQgQ0ZYX0ZvbnRNYXBwZXI6OkxvYWRJbnN0YWxsZWRGb250cygpCi17Ci0gICAgaWYgKG1fcEZvbnRJbmZvID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobV9iTGlzdExvYWRlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtX2JMaXN0TG9hZGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbV9wRm9udEluZm8tPkVudW1Gb250TGlzdCh0aGlzKTsKLSAgICBtX2JMaXN0TG9hZGVkID0gVFJVRTsKLX0KLUNGWF9CeXRlU3RyaW5nIENGWF9Gb250TWFwcGVyOjpNYXRjaEluc3RhbGxlZEZvbnRzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBub3JtX25hbWUpCi17Ci0gICAgTG9hZEluc3RhbGxlZEZvbnRzKCk7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gbV9JbnN0YWxsZWRUVEZvbnRzLkdldFNpemUoKSAtIDE7IGkgPj0gMDsgaSAtLSkgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBub3JtMSA9IF9UVF9Ob3JtYWxpemVOYW1lKG1fSW5zdGFsbGVkVFRGb250c1tpXSk7Ci0gICAgICAgIGlmIChub3JtMSA9PSBub3JtX25hbWUpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChpIDwgMCkgewotICAgICAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgbWF0Y2ggPSBtX0luc3RhbGxlZFRURm9udHNbaV07Ci0gICAgaWYgKG1hdGNoWzBdID09ICcgJykgewotICAgICAgICBtYXRjaCA9IG1fSW5zdGFsbGVkVFRGb250c1tpICsgMV07Ci0gICAgfQotICAgIHJldHVybiBtYXRjaDsKLX0KLXR5cGVkZWYgc3RydWN0IF9DSEFSU0VUX01BUF8gewotICAgIEZYX0JZVEUgY2hhcnNldDsKLSAgICBGWF9XT1JEIGNvZGVwYWdlOwotfSBDSEFSU0VUX01BUDsKLXN0YXRpYyBjb25zdCBDSEFSU0VUX01BUCBnX0NvZGVwYWdlMkNoYXJzZXRUYWJsZVtdID0gewotICAgIHsgMQkgLCAwCX0sCi0gICAgeyAyCSAsIDQyCX0sCi0gICAgeyAyNTQsIDQzNwl9LAotICAgIHsgMjU1LCA4NTAJfSwKLSAgICB7IDIyMiwgODc0CX0sCi0gICAgeyAxMjgsIDkzMgl9LAotICAgIHsgMTM0LCA5MzYJfSwKLSAgICB7IDEyOSwgOTQ5CX0sCi0gICAgeyAxMzYsIDk1MAl9LAotICAgIHsgMjM4LCAxMjUwCX0sCi0gICAgeyAyMDQsIDEyNTEJfSwKLSAgICB7IDAsICAgMTI1Mgl9LAotICAgIHsgMTYxLCAxMjUzCX0sCi0gICAgeyAxNjIsIDEyNTQJfSwKLSAgICB7IDE3NywgMTI1NQl9LAotICAgIHsgMTc4LCAxMjU2CX0sCi0gICAgeyAxODYsIDEyNTcJfSwKLSAgICB7IDE2MywgMTI1OCB9LAotICAgIHsgMTMwLCAxMzYxIH0sCi0gICAgeyA3NywgMTAwMDAgfSwKLSAgICB7IDc4LCAxMDAwMSB9LAotICAgIHsgNzksIDEwMDAzIH0sCi0gICAgeyA4MCwgMTAwMDggfSwKLSAgICB7IDgxLCAxMDAwMiB9LAotICAgIHsgODMsIDEwMDA1IH0sCi0gICAgeyA4NCwgMTAwMDQgfSwKLSAgICB7IDg1LCAxMDAwNiB9LAotICAgIHsgODYsIDEwMDgxIH0sCi0gICAgeyA4NywgMTAwMjEgfSwKLSAgICB7IDg4LCAxMDAyOSB9LAotICAgIHsgODksIDEwMDA3IH0sCi19OwotRlhfQllURSBfR2V0Q2hhcnNldEZyb21Db2RlUGFnZShGWF9XT1JEIGNvZGVwYWdlKQotewotICAgIEZYX0lOVDMyIGlFbmQgPSBzaXplb2YoZ19Db2RlcGFnZTJDaGFyc2V0VGFibGUpIC8gc2l6ZW9mKENIQVJTRVRfTUFQKSAtIDE7Ci0gICAgRlhTWVNfYXNzZXJ0KGlFbmQgPj0gMCk7Ci0gICAgRlhfSU5UMzIgaVN0YXJ0ID0gMCwgaU1pZDsKLSAgICBkbyB7Ci0gICAgICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOwotICAgICAgICBjb25zdCBDSEFSU0VUX01BUCAmIGNwID0gZ19Db2RlcGFnZTJDaGFyc2V0VGFibGVbaU1pZF07Ci0gICAgICAgIGlmIChjb2RlcGFnZSA9PSBjcC5jb2RlcGFnZSkgewotICAgICAgICAgICAgcmV0dXJuIGNwLmNoYXJzZXQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29kZXBhZ2UgPCBjcC5jb2RlcGFnZSkgewotICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7Ci0gICAgcmV0dXJuIDE7Ci19Ci1GWF9EV09SRCBfR2V0Q29kZVBhZ2VSYW5nZUZyb21DaGFyc2V0KGludCBjaGFyc2V0KQotewotICAgIGlmIChjaGFyc2V0ID09IEZYRk9OVF9FQVNURVVST1BFX0NIQVJTRVQpIHsKLSAgICAgICAgcmV0dXJuIDEgPDwgMTsKLSAgICB9Ci0gICAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX0dSRUVLX0NIQVJTRVQpIHsKLSAgICAgICAgcmV0dXJuIDEgPDwgMzsKLSAgICB9Ci0gICAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX1RVUktJU0hfQ0hBUlNFVCkgewotICAgICAgICByZXR1cm4gMSA8PCA0OwotICAgIH0KLSAgICBpZiAoY2hhcnNldCA9PSBGWEZPTlRfSEVCUkVXX0NIQVJTRVQpIHsKLSAgICAgICAgcmV0dXJuIDEgPDwgNTsKLSAgICB9Ci0gICAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX0FSQUJJQ19DSEFSU0VUKSB7Ci0gICAgICAgIHJldHVybiAxIDw8IDY7Ci0gICAgfQotICAgIGlmIChjaGFyc2V0ID09IEZYRk9OVF9CQUxUSUNfQ0hBUlNFVCkgewotICAgICAgICByZXR1cm4gMSA8PCA3OwotICAgIH0KLSAgICBpZiAoY2hhcnNldCA9PSBGWEZPTlRfVEhBSV9DSEFSU0VUKSB7Ci0gICAgICAgIHJldHVybiAxIDw8IDE2OwotICAgIH0KLSAgICBpZiAoY2hhcnNldCA9PSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVCkgewotICAgICAgICByZXR1cm4gMSA8PCAxNzsKLSAgICB9Ci0gICAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX0dCMjMxMl9DSEFSU0VUKSB7Ci0gICAgICAgIHJldHVybiAxIDw8IDE4OwotICAgIH0KLSAgICBpZiAoY2hhcnNldCA9PSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVCkgewotICAgICAgICByZXR1cm4gMSA8PCAyMDsKLSAgICB9Ci0gICAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX0hBTkdFVUxfQ0hBUlNFVCkgewotICAgICAgICByZXR1cm4gMSA8PCAxOTsKLSAgICB9Ci0gICAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX1NZTUJPTF9DSEFSU0VUKSB7Ci0gICAgICAgIHJldHVybiAxIDw8IDMxOwotICAgIH0KLSAgICByZXR1cm4gMSA8PCAyMTsKLX0KLUZYRlRfRmFjZSBDRlhfRm9udE1hcHBlcjo6VXNlSW50ZXJuYWxTdWJzdChDRlhfU3Vic3RGb250KiBwU3Vic3RGb250LCBpbnQgaUJhc2VGb250LCBpbnQgaXRhbGljX2FuZ2xlLCBpbnQgd2VpZ2h0LCBpbnQgcGljdGhmYW1pbHkpCi17Ci0gICAgaWYgKGlCYXNlRm9udCA8IDEyKSB7Ci0gICAgICAgIGlmIChtX0ZveGl0RmFjZXNbaUJhc2VGb250XSkgewotICAgICAgICAgICAgcmV0dXJuIG1fRm94aXRGYWNlc1tpQmFzZUZvbnRdOwotICAgICAgICB9Ci0gICAgICAgIEZYX0xQQ0JZVEUgcEZvbnREYXRhID0gTlVMTDsKLSAgICAgICAgRlhfRFdPUkQgc2l6ZSA9IDA7Ci0gICAgICAgIGlmIChtX3BGb250TWdyLT5HZXRTdGFuZGFyZEZvbnQocEZvbnREYXRhLCBzaXplLCBpQmFzZUZvbnQpKSB7Ci0gICAgICAgICAgICBtX0ZveGl0RmFjZXNbaUJhc2VGb250XSA9IG1fcEZvbnRNZ3ItPkdldEZpeGVkRmFjZShwRm9udERhdGEsIHNpemUsIDApOwotICAgICAgICAgICAgcmV0dXJuIG1fRm94aXRGYWNlc1tpQmFzZUZvbnRdOwotICAgICAgICB9Ci0gICAgfQotICAgIHBTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyB8PSBGWEZPTlRfU1VCU1RfTU07Ci0gICAgcFN1YnN0Rm9udC0+bV9JdGFsaWNBbmdsZSA9IGl0YWxpY19hbmdsZTsKLSAgICBpZiAod2VpZ2h0KSB7Ci0gICAgICAgIHBTdWJzdEZvbnQtPm1fV2VpZ2h0ID0gd2VpZ2h0OwotICAgIH0KLSAgICBpZiAocGljdGhmYW1pbHkgJiBGWEZPTlRfRkZfUk9NQU4pIHsKLSAgICAgICAgcFN1YnN0Rm9udC0+bV9XZWlnaHQgPSBwU3Vic3RGb250LT5tX1dlaWdodCAqIDQgLyA1OwotICAgICAgICBwU3Vic3RGb250LT5tX0ZhbWlseSA9ICJDaHJvbWUgU2VyaWYiOwotICAgICAgICBpZiAobV9NTUZhY2VzWzFdKSB7Ci0gICAgICAgICAgICByZXR1cm4gbV9NTUZhY2VzWzFdOwotICAgICAgICB9Ci0gICAgICAgIEZYX0xQQ0JZVEUgcEZvbnREYXRhID0gTlVMTDsKLSAgICAgICAgRlhfRFdPUkQgc2l6ZTsKLSAgICAgICAgbV9wRm9udE1nci0+R2V0U3RhbmRhcmRGb250KHBGb250RGF0YSwgc2l6ZSwgMTQpOwotICAgICAgICBtX01NRmFjZXNbMV0gPSBtX3BGb250TWdyLT5HZXRGaXhlZEZhY2UocEZvbnREYXRhLCBzaXplLCAwKTsKLSAgICAgICAgcmV0dXJuIG1fTU1GYWNlc1sxXTsKLSAgICB9Ci0gICAgcFN1YnN0Rm9udC0+bV9GYW1pbHkgPSAiQ2hyb21lIFNhbnMiOwotICAgIGlmIChtX01NRmFjZXNbMF0pIHsKLSAgICAgICAgcmV0dXJuIG1fTU1GYWNlc1swXTsKLSAgICB9Ci0gICAgRlhfTFBDQllURSBwRm9udERhdGEgPSBOVUxMOwotICAgIEZYX0RXT1JEIHNpemUgPSAwOwotICAgIG1fcEZvbnRNZ3ItPkdldFN0YW5kYXJkRm9udChwRm9udERhdGEsIHNpemUsIDE1KTsKLSAgICBtX01NRmFjZXNbMF0gPSBtX3BGb250TWdyLT5HZXRGaXhlZEZhY2UocEZvbnREYXRhLCBzaXplLCAwKTsKLSAgICByZXR1cm4gbV9NTUZhY2VzWzBdOwotfQotY29uc3Qgc3RydWN0IF9BbHRGb250RmFtaWx5IHsKLSAgICBGWF9MUENTVFIgbV9wRm9udE5hbWU7Ci0gICAgRlhfTFBDU1RSIG1fcEZvbnRGYW1pbHk7Ci19Ci1nX0FsdEZvbnRGYW1pbGllc1tdID0geworCitjb25zdCBzdHJ1Y3QgQWx0Rm9udEZhbWlseSB7CisgIGNvbnN0IEZYX0NIQVIqIG1fcEZvbnROYW1lOworICBjb25zdCBGWF9DSEFSKiBtX3BGb250RmFtaWx5OworfSBnX0FsdEZvbnRGYW1pbGllc1tdID0gewogICAgIHsiQUdhcmFtb25kUHJvIiwgIkFkb2JlIEdhcmFtb25kIFBybyJ9LAogICAgIHsiQmFua0dvdGhpY0JULU1lZGl1bSIsICJCYW5rR290aGljIE1kIEJUIn0sCiAgICAgeyJGb3J0ZU1UIiwgIkZvcnRlIn0sCiB9OwotZXh0ZXJuICJDIiB7Ci0gICAgc3RhdGljIGludCBjb21wYXJlRm9udEZhbWlseVN0cmluZyhjb25zdCB2b2lkKiBrZXksIGNvbnN0IHZvaWQqIGVsZW1lbnQpCi0gICAgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHJfa2V5KChGWF9MUENTVFIpa2V5KTsKLSAgICAgICAgaWYgKHN0cl9rZXkuRmluZCgoKF9BbHRGb250RmFtaWx5KillbGVtZW50KS0+bV9wRm9udE5hbWUpICE9IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRlhTWVNfc3RyaWNtcCgoRlhfTFBDU1RSKWtleSwgKChfQWx0Rm9udEZhbWlseSopZWxlbWVudCktPm1fcEZvbnROYW1lKTsKLSAgICB9CisKK2NvbnN0IHN0cnVjdCBGWF9Gb250U3R5bGUgeworICBjb25zdCBGWF9DSEFSKiBzdHlsZTsKKyAgaW50MzJfdCBsZW47Cit9IGdfRm9udFN0eWxlc1tdID0geworICAgIHsiQm9sZCIsIDR9LCB7Ikl0YWxpYyIsIDZ9LCB7IkJvbGRJdGFsaWMiLCAxMH0sIHsiUmVnIiwgM30sIHsiUmVndWxhciIsIDd9LAorfTsKKworY29uc3Qgc3RydWN0IENIQVJTRVRfTUFQIHsKKyAgdWludDhfdCBjaGFyc2V0OworICBGWF9XT1JEIGNvZGVwYWdlOworfSBnX0NvZGVwYWdlMkNoYXJzZXRUYWJsZVtdID0geworICAgIHsxLCAwfSwgICAgICB7MiwgNDJ9LCAgICAgezI1NCwgNDM3fSwgIHsyNTUsIDg1MH0sICB7MjIyLCA4NzR9LAorICAgIHsxMjgsIDkzMn0sICB7MTM0LCA5MzZ9LCAgezEyOSwgOTQ5fSwgIHsxMzYsIDk1MH0sICB7MjM4LCAxMjUwfSwKKyAgICB7MjA0LCAxMjUxfSwgezAsIDEyNTJ9LCAgIHsxNjEsIDEyNTN9LCB7MTYyLCAxMjU0fSwgezE3NywgMTI1NX0sCisgICAgezE3OCwgMTI1Nn0sIHsxODYsIDEyNTd9LCB7MTYzLCAxMjU4fSwgezEzMCwgMTM2MX0sIHs3NywgMTAwMDB9LAorICAgIHs3OCwgMTAwMDF9LCB7NzksIDEwMDAzfSwgezgwLCAxMDAwOH0sIHs4MSwgMTAwMDJ9LCB7ODMsIDEwMDA1fSwKKyAgICB7ODQsIDEwMDA0fSwgezg1LCAxMDAwNn0sIHs4NiwgMTAwODF9LCB7ODcsIDEwMDIxfSwgezg4LCAxMDAyOX0sCisgICAgezg5LCAxMDAwN30sCit9OworCitjb25zdCBGWF9EV09SRCBrVGFibGVOQU1FID0gRlhEV09SRF9HRVRfTVNCRklSU1QoIm5hbWUiKTsKK2NvbnN0IEZYX0RXT1JEIGtUYWJsZVRUQ0YgPSBGWERXT1JEX0dFVF9NU0JGSVJTVCgidHRjZiIpOworCitpbnQgQ29tcGFyZUZvbnRGYW1pbHlTdHJpbmcoY29uc3Qgdm9pZCoga2V5LCBjb25zdCB2b2lkKiBlbGVtZW50KSB7CisgIENGWF9CeXRlU3RyaW5nIHN0cl9rZXkoKGNvbnN0IEZYX0NIQVIqKWtleSk7CisgIGlmIChzdHJfa2V5LkZpbmQoKChBbHRGb250RmFtaWx5KillbGVtZW50KS0+bV9wRm9udE5hbWUpICE9IC0xKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIEZYU1lTX3N0cmljbXAoKGNvbnN0IEZYX0NIQVIqKWtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgKChBbHRGb250RmFtaWx5KillbGVtZW50KS0+bV9wRm9udE5hbWUpOwogfQotI2RlZmluZSBGWF9GT05UX1NUWUxFX05vbmUJCTB4MDAKLSNkZWZpbmUgRlhfRk9OVF9TVFlMRV9Cb2xkCQkweDAxCi0jZGVmaW5lIEZYX0ZPTlRfU1RZTEVfSXRhbGljCTB4MDIKLSNkZWZpbmUgRlhfRk9OVF9TVFlMRV9Cb2xkQm9sZAkweDA0Ci1zdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgX0dldEZvbnRGYW1pbHkoQ0ZYX0J5dGVTdHJpbmcgZm9udE5hbWUsIGludCBuU3R5bGUpCi17Ci0gICAgaWYgKGZvbnROYW1lLkZpbmQoIlNjcmlwdCIpID49IDApIHsKLSAgICAgICAgaWYgKChuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0JvbGQpID09IEZYX0ZPTlRfU1RZTEVfQm9sZCkgewotICAgICAgICAgICAgZm9udE5hbWUgPSAiU2NyaXB0TVRCb2xkIjsKLSAgICAgICAgfSBlbHNlIGlmIChmb250TmFtZS5GaW5kKCJQYWxhY2UiKSA+PSAwKSB7Ci0gICAgICAgICAgICBmb250TmFtZSA9ICJQYWxhY2VTY3JpcHRNVCI7Ci0gICAgICAgIH0gZWxzZSBpZiAoZm9udE5hbWUuRmluZCgiRnJlbmNoIikgPj0gMCkgewotICAgICAgICAgICAgZm9udE5hbWUgPSAiRnJlbmNoU2NyaXB0TVQiOwotICAgICAgICB9IGVsc2UgaWYgKGZvbnROYW1lLkZpbmQoIkZyZWVTdHlsZSIpID49IDApIHsKLSAgICAgICAgICAgIGZvbnROYW1lID0gIkZyZWVTdHlsZVNjcmlwdCI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZvbnROYW1lOworCitpbnQgQ29tcGFyZVN0cmluZyhjb25zdCB2b2lkKiBrZXksIGNvbnN0IHZvaWQqIGVsZW1lbnQpIHsKKyAgcmV0dXJuIEZYU1lTX3N0cmljbXAoKGNvbnN0IEZYX0NIQVIqKWtleSwgKChBbHRGb250TmFtZSopZWxlbWVudCktPm1fcE5hbWUpOworfQorCitDRlhfQnl0ZVN0cmluZyBLZXlOYW1lRnJvbUZhY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGZhY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkl0YWxpYykgeworICBDRlhfQnl0ZVN0cmluZyBrZXkoZmFjZV9uYW1lKTsKKyAga2V5ICs9ICcsJzsKKyAga2V5ICs9IENGWF9CeXRlU3RyaW5nOjpGb3JtYXRJbnRlZ2VyKHdlaWdodCk7CisgIGtleSArPSBiSXRhbGljID8gJ0knIDogJ04nOworICByZXR1cm4ga2V5OworfQorCitDRlhfQnl0ZVN0cmluZyBLZXlOYW1lRnJvbVNpemUoaW50IHR0Y19zaXplLCBGWF9EV09SRCBjaGVja3N1bSkgeworICBDRlhfQnl0ZVN0cmluZyBrZXk7CisgIGtleS5Gb3JtYXQoIiVkOiVkIiwgdHRjX3NpemUsIGNoZWNrc3VtKTsKKyAgcmV0dXJuIGtleTsKK30KKworQ0ZYX0J5dGVTdHJpbmcgVFRfTm9ybWFsaXplTmFtZShjb25zdCBGWF9DSEFSKiBmYW1pbHkpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgbm9ybShmYW1pbHkpOworICBub3JtLlJlbW92ZSgnICcpOworICBub3JtLlJlbW92ZSgnLScpOworICBub3JtLlJlbW92ZSgnLCcpOworICBpbnQgcG9zID0gbm9ybS5GaW5kKCcrJyk7CisgIGlmIChwb3MgPiAwKSB7CisgICAgbm9ybSA9IG5vcm0uTGVmdChwb3MpOworICB9CisgIG5vcm0uTWFrZUxvd2VyKCk7CisgIHJldHVybiBub3JtOworfQorCitDRlhfQnl0ZVN0cmluZyBGUERGX1JlYWRTdHJpbmdGcm9tRmlsZShGWFNZU19GSUxFKiBwRmlsZSwgRlhfRFdPUkQgc2l6ZSkgeworICBDRlhfQnl0ZVN0cmluZyBidWZmZXI7CisgIGlmICghRlhTWVNfZnJlYWQoYnVmZmVyLkdldEJ1ZmZlcihzaXplKSwgc2l6ZSwgMSwgcEZpbGUpKSB7CisgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7CisgIH0KKyAgYnVmZmVyLlJlbGVhc2VCdWZmZXIoc2l6ZSk7CisgIHJldHVybiBidWZmZXI7Cit9CisKK0NGWF9CeXRlU3RyaW5nIEZQREZfTG9hZFRhYmxlRnJvbVRUKEZYU1lTX0ZJTEUqIHBGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFRhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5UYWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCB0YWcpIHsKKyAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG5UYWJsZXM7IGkrKykgeworICAgIGNvbnN0IHVpbnQ4X3QqIHAgPSBwVGFibGVzICsgaSAqIDE2OworICAgIGlmIChHRVRfVFRfTE9ORyhwKSA9PSB0YWcpIHsKKyAgICAgIEZYX0RXT1JEIG9mZnNldCA9IEdFVF9UVF9MT05HKHAgKyA4KTsKKyAgICAgIEZYX0RXT1JEIHNpemUgPSBHRVRfVFRfTE9ORyhwICsgMTIpOworICAgICAgRlhTWVNfZnNlZWsocEZpbGUsIG9mZnNldCwgRlhTWVNfU0VFS19TRVQpOworICAgICAgcmV0dXJuIEZQREZfUmVhZFN0cmluZ0Zyb21GaWxlKHBGaWxlLCBzaXplKTsKICAgICB9Ci0gICAgX0FsdEZvbnRGYW1pbHkqIGZvdW5kID0gKF9BbHRGb250RmFtaWx5KilGWFNZU19ic2VhcmNoKGZvbnROYW1lLmNfc3RyKCksIGdfQWx0Rm9udEZhbWlsaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiBnX0FsdEZvbnRGYW1pbGllcyAvIHNpemVvZiAoX0FsdEZvbnRGYW1pbHkpLCBzaXplb2YgKF9BbHRGb250RmFtaWx5KSwgY29tcGFyZUZvbnRGYW1pbHlTdHJpbmcpOwotICAgIGlmIChmb3VuZCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmb250TmFtZTsKKyAgfQorICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKK30KKwordWludDhfdCBHZXRDaGFyc2V0RnJvbUNvZGVQYWdlKEZYX1dPUkQgY29kZXBhZ2UpIHsKKyAgaW50MzJfdCBpRW5kID0gc2l6ZW9mKGdfQ29kZXBhZ2UyQ2hhcnNldFRhYmxlKSAvIHNpemVvZihDSEFSU0VUX01BUCkgLSAxOworICBGWFNZU19hc3NlcnQoaUVuZCA+PSAwKTsKKyAgaW50MzJfdCBpU3RhcnQgPSAwLCBpTWlkOworICBkbyB7CisgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7CisgICAgY29uc3QgQ0hBUlNFVF9NQVAmIGNwID0gZ19Db2RlcGFnZTJDaGFyc2V0VGFibGVbaU1pZF07CisgICAgaWYgKGNvZGVwYWdlID09IGNwLmNvZGVwYWdlKSB7CisgICAgICByZXR1cm4gY3AuY2hhcnNldDsKICAgICB9Ci0gICAgcmV0dXJuIGZvdW5kLT5tX3BGb250RmFtaWx5OwotfTsKLXR5cGVkZWYgc3RydWN0IF9GWF9Gb250U3R5bGUgewotICAgIEZYX0xQQ1NUUiBzdHlsZTsKLSAgICBGWF9JTlQzMiBsZW47Ci19IEZYX0ZvbnRTdHlsZTsKLWNvbnN0IEZYX0ZvbnRTdHlsZSBnX0ZvbnRTdHlsZXNbXSA9IHsKLSAgeyAiQm9sZCIsIDQgfSwKLSAgeyAiSXRhbGljIiwgNiB9LAotICB7ICJCb2xkSXRhbGljIiwgMTAgfSwKLSAgeyAiUmVnIiwgMyB9LAotICB7ICJSZWd1bGFyIiwgNyB9LAotfTsKLUNGWF9CeXRlU3RyaW5nIFBhcnNlU3R5bGUoRlhfTFBDU1RSIHBTdHlsZSwgaW50IGlMZW4sIGludCBpSW5kZXgpCi17Ci0gICAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKLSAgICBpZiAoIWlMZW4gfHwgaUxlbiA8PSBpSW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIGJ1Zi5HZXRCeXRlU3RyaW5nKCk7CisgICAgaWYgKGNvZGVwYWdlIDwgY3AuY29kZXBhZ2UpIHsKKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsKKyAgICB9IGVsc2UgeworICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7CiAgICAgfQotICAgIHdoaWxlIChpSW5kZXggPCBpTGVuKSB7Ci0gICAgICAgIGlmIChwU3R5bGVbaUluZGV4XSA9PSAnLCcpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGJ1Zi5BcHBlbmRDaGFyKHBTdHlsZVtpSW5kZXhdKTsKLSAgICAgICAgKytpSW5kZXg7CisgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsKKyAgcmV0dXJuIDE7Cit9CisKK0NGWF9CeXRlU3RyaW5nIEdldEZvbnRGYW1pbHkoQ0ZYX0J5dGVTdHJpbmcgZm9udE5hbWUsIGludCBuU3R5bGUpIHsKKyAgaWYgKGZvbnROYW1lLkZpbmQoIlNjcmlwdCIpID49IDApIHsKKyAgICBpZiAoKG5TdHlsZSAmIEZYX0ZPTlRfU1RZTEVfQm9sZCkgPT0gRlhfRk9OVF9TVFlMRV9Cb2xkKSB7CisgICAgICBmb250TmFtZSA9ICJTY3JpcHRNVEJvbGQiOworICAgIH0gZWxzZSBpZiAoZm9udE5hbWUuRmluZCgiUGFsYWNlIikgPj0gMCkgeworICAgICAgZm9udE5hbWUgPSAiUGFsYWNlU2NyaXB0TVQiOworICAgIH0gZWxzZSBpZiAoZm9udE5hbWUuRmluZCgiRnJlbmNoIikgPj0gMCkgeworICAgICAgZm9udE5hbWUgPSAiRnJlbmNoU2NyaXB0TVQiOworICAgIH0gZWxzZSBpZiAoZm9udE5hbWUuRmluZCgiRnJlZVN0eWxlIikgPj0gMCkgeworICAgICAgZm9udE5hbWUgPSAiRnJlZVN0eWxlU2NyaXB0IjsKICAgICB9CisgICAgcmV0dXJuIGZvbnROYW1lOworICB9CisgIEFsdEZvbnRGYW1pbHkqIGZvdW5kID0gKEFsdEZvbnRGYW1pbHkqKUZYU1lTX2JzZWFyY2goCisgICAgICBmb250TmFtZS5jX3N0cigpLCBnX0FsdEZvbnRGYW1pbGllcywKKyAgICAgIHNpemVvZiBnX0FsdEZvbnRGYW1pbGllcyAvIHNpemVvZihBbHRGb250RmFtaWx5KSwgc2l6ZW9mKEFsdEZvbnRGYW1pbHkpLAorICAgICAgQ29tcGFyZUZvbnRGYW1pbHlTdHJpbmcpOworICByZXR1cm4gZm91bmQgPyBDRlhfQnl0ZVN0cmluZyhmb3VuZC0+bV9wRm9udEZhbWlseSkgOiBmb250TmFtZTsKK30KKworQ0ZYX0J5dGVTdHJpbmcgUGFyc2VTdHlsZShjb25zdCBGWF9DSEFSKiBwU3R5bGUsIGludCBpTGVuLCBpbnQgaUluZGV4KSB7CisgIENGWF9CeXRlVGV4dEJ1ZiBidWY7CisgIGlmICghaUxlbiB8fCBpTGVuIDw9IGlJbmRleCkgewogICAgIHJldHVybiBidWYuR2V0Qnl0ZVN0cmluZygpOworICB9CisgIHdoaWxlIChpSW5kZXggPCBpTGVuKSB7CisgICAgaWYgKHBTdHlsZVtpSW5kZXhdID09ICcsJykgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGJ1Zi5BcHBlbmRDaGFyKHBTdHlsZVtpSW5kZXhdKTsKKyAgICArK2lJbmRleDsKKyAgfQorICByZXR1cm4gYnVmLkdldEJ5dGVTdHJpbmcoKTsKIH0KLUZYX0lOVDMyIEdldFN0eWxlVHlwZShjb25zdCBDRlhfQnl0ZVN0cmluZyAmYnNTdHlsZSwgRlhfQk9PTCBiUmV2ZXJ0KQotewotICAgIEZYX0lOVDMyIGlMZW4gPSBic1N0eWxlLkdldExlbmd0aCgpOwotICAgIGlmICghaUxlbikgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGludCBpU2l6ZSA9IHNpemVvZihnX0ZvbnRTdHlsZXMpIC8gc2l6ZW9mKEZYX0ZvbnRTdHlsZSk7Ci0gICAgY29uc3QgRlhfRm9udFN0eWxlICpwU3R5bGUgPSBOVUxMOwotICAgIGZvciAoaW50IGkgPSBpU2l6ZSAtIDE7IGkgPj0gMDsgLS1pKSB7Ci0gICAgICAgIHBTdHlsZSA9IGdfRm9udFN0eWxlcyArIGk7Ci0gICAgICAgIGlmICghcFN0eWxlIHx8IHBTdHlsZS0+bGVuID4gaUxlbikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFiUmV2ZXJ0KSB7Ci0gICAgICAgICAgICBpZiAoYnNTdHlsZS5MZWZ0KHBTdHlsZS0+bGVuKS5Db21wYXJlKHBTdHlsZS0+c3R5bGUpID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChic1N0eWxlLlJpZ2h0KHBTdHlsZS0+bGVuKS5Db21wYXJlKHBTdHlsZS0+c3R5bGUpID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KKworaW50MzJfdCBHZXRTdHlsZVR5cGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJzU3R5bGUsIEZYX0JPT0wgYlJldmVydCkgeworICBpbnQzMl90IGlMZW4gPSBic1N0eWxlLkdldExlbmd0aCgpOworICBpZiAoIWlMZW4pIHsKICAgICByZXR1cm4gLTE7CisgIH0KKyAgaW50IGlTaXplID0gc2l6ZW9mKGdfRm9udFN0eWxlcykgLyBzaXplb2YoRlhfRm9udFN0eWxlKTsKKyAgY29uc3QgRlhfRm9udFN0eWxlKiBwU3R5bGUgPSBOVUxMOworICBmb3IgKGludCBpID0gaVNpemUgLSAxOyBpID49IDA7IC0taSkgeworICAgIHBTdHlsZSA9IGdfRm9udFN0eWxlcyArIGk7CisgICAgaWYgKCFwU3R5bGUgfHwgcFN0eWxlLT5sZW4gPiBpTGVuKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKCFiUmV2ZXJ0KSB7CisgICAgICBpZiAoYnNTdHlsZS5MZWZ0KHBTdHlsZS0+bGVuKS5Db21wYXJlKHBTdHlsZS0+c3R5bGUpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChic1N0eWxlLlJpZ2h0KHBTdHlsZS0+bGVuKS5Db21wYXJlKHBTdHlsZS0+c3R5bGUpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAtMTsKIH0KLUZYX0JPT0wgQ2hlY2tTdXBwb3J0VGhpcmRQYXJ0Rm9udChDRlhfQnl0ZVN0cmluZyBuYW1lLCBpbnQgJlBpdGNoRmFtaWx5KQotewotICAgIGlmIChuYW1lID09IEZYX0JTVFJDKCJNeXJpYWRQcm8iKSkgewotICAgICAgICBQaXRjaEZhbWlseSAmPSB+RlhGT05UX0ZGX1JPTUFOOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworCitGWF9CT09MIENoZWNrU3VwcG9ydFRoaXJkUGFydEZvbnQoQ0ZYX0J5dGVTdHJpbmcgbmFtZSwgaW50JiBQaXRjaEZhbWlseSkgeworICBpZiAobmFtZSA9PSAiTXlyaWFkUHJvIikgeworICAgIFBpdGNoRmFtaWx5ICY9IH5GWEZPTlRfRkZfUk9NQU47CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQotRlhGVF9GYWNlIENGWF9Gb250TWFwcGVyOjpGaW5kU3Vic3RGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBGWF9CT09MIGJUcnVlVHlwZSwgRlhfRFdPUkQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgaW50IGl0YWxpY19hbmdsZSwgaW50IFdpbmRvd0NQLCBDRlhfU3Vic3RGb250KiBwU3Vic3RGb250KQotewotICAgIGlmICghKGZsYWdzICYgRlhGT05UX1VTRUVYVEVSTkFUVFIpKSB7Ci0gICAgICAgIHdlaWdodCA9IEZYRk9OVF9GV19OT1JNQUw7Ci0gICAgICAgIGl0YWxpY19hbmdsZSA9IDA7CisKK0ZYX0RXT1JEIEdldENoYXJzZXQoaW50IGNoYXJzZXQpIHsKKyAgc3dpdGNoIChjaGFyc2V0KSB7CisgICAgY2FzZSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVDoKKyAgICAgIHJldHVybiBDSEFSU0VUX0ZMQUdfU0hJRlRKSVM7CisgICAgY2FzZSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQ6CisgICAgICByZXR1cm4gQ0hBUlNFVF9GTEFHX0dCOworICAgIGNhc2UgRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQ6CisgICAgICByZXR1cm4gQ0hBUlNFVF9GTEFHX0JJRzU7CisgICAgY2FzZSBGWEZPTlRfSEFOR0VVTF9DSEFSU0VUOgorICAgICAgcmV0dXJuIENIQVJTRVRfRkxBR19LT1JFQU47CisgICAgY2FzZSBGWEZPTlRfU1lNQk9MX0NIQVJTRVQ6CisgICAgICByZXR1cm4gQ0hBUlNFVF9GTEFHX1NZTUJPTDsKKyAgICBjYXNlIEZYRk9OVF9BTlNJX0NIQVJTRVQ6CisgICAgICByZXR1cm4gQ0hBUlNFVF9GTEFHX0FOU0k7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiAwOworfQorCitpbnQzMl90IEdldFNpbWlsYXJWYWx1ZShpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXRhbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoX2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0eWxlKSB7CisgIGludDMyX3QgaVNpbWlsYXJWYWx1ZSA9IDA7CisgIGlmICgoc3R5bGUgJiBGWEZPTlRfQk9MRCkgPT0gKHdlaWdodCA+IDQwMCkpIHsKKyAgICBpU2ltaWxhclZhbHVlICs9IDE2OworICB9CisgIGlmICgoc3R5bGUgJiBGWEZPTlRfSVRBTElDKSA9PSBiSXRhbGljKSB7CisgICAgaVNpbWlsYXJWYWx1ZSArPSAxNjsKKyAgfQorICBpZiAoKHN0eWxlICYgRlhGT05UX1NFUklGKSA9PSAocGl0Y2hfZmFtaWx5ICYgRlhGT05UX0ZGX1JPTUFOKSkgeworICAgIGlTaW1pbGFyVmFsdWUgKz0gMTY7CisgIH0KKyAgaWYgKChzdHlsZSAmIEZYRk9OVF9TQ1JJUFQpID09IChwaXRjaF9mYW1pbHkgJiBGWEZPTlRfRkZfU0NSSVBUKSkgeworICAgIGlTaW1pbGFyVmFsdWUgKz0gODsKKyAgfQorICBpZiAoKHN0eWxlICYgRlhGT05UX0ZJWEVEX1BJVENIKSA9PSAocGl0Y2hfZmFtaWx5ICYgRlhGT05UX0ZGX0ZJWEVEUElUQ0gpKSB7CisgICAgaVNpbWlsYXJWYWx1ZSArPSA4OworICB9CisgIHJldHVybiBpU2ltaWxhclZhbHVlOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworQ0ZYX1N1YnN0Rm9udDo6Q0ZYX1N1YnN0Rm9udCgpIHsKKyAgbV9FeHRIYW5kbGUgPSBOVUxMOworICBtX0NoYXJzZXQgPSAwOworICBtX1N1YnN0RmxhZ3MgPSAwOworICBtX1dlaWdodCA9IDA7CisgIG1fSXRhbGljQW5nbGUgPSAwOworICBtX2JTdWJzdE9mQ0pLID0gRkFMU0U7CisgIG1fV2VpZ2h0Q0pLID0gMDsKKyAgbV9iSXRsaWNDSksgPSBGQUxTRTsKK30KK0NUVEZvbnREZXNjOjp+Q1RURm9udERlc2MoKSB7CisgIGlmIChtX1R5cGUgPT0gMSkgeworICAgIGlmIChtX1NpbmdsZUZhY2UubV9wRmFjZSkgeworICAgICAgRlhGVF9Eb25lX0ZhY2UobV9TaW5nbGVGYWNlLm1fcEZhY2UpOwogICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBTdWJzdE5hbWUgPSBuYW1lOwotICAgIFN1YnN0TmFtZS5SZW1vdmUoMHgyMCk7Ci0gICAgaWYgKGJUcnVlVHlwZSkgewotICAgICAgICBpZiAobmFtZVswXSA9PSAnQCcpIHsKLSAgICAgICAgICAgIFN1YnN0TmFtZSA9IG5hbWUuTWlkKDEpOwotICAgICAgICB9CisgIH0gZWxzZSBpZiAobV9UeXBlID09IDIpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICBpZiAobV9UVENGYWNlLm1fcEZhY2VzW2ldKSB7CisgICAgICAgIEZYRlRfRG9uZV9GYWNlKG1fVFRDRmFjZS5tX3BGYWNlc1tpXSk7CisgICAgICB9CisgIH0KKyAgRlhfRnJlZShtX3BGb250RGF0YSk7Cit9CitpbnQgQ1RURm9udERlc2M6OlJlbGVhc2VGYWNlKEZYRlRfRmFjZSBmYWNlKSB7CisgIGlmIChtX1R5cGUgPT0gMSkgeworICAgIGlmIChtX1NpbmdsZUZhY2UubV9wRmFjZSAhPSBmYWNlKSB7CisgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIF9QREZfR2V0U3RhbmRhcmRGb250TmFtZShTdWJzdE5hbWUpOwotICAgIGlmIChTdWJzdE5hbWUgPT0gRlhfQlNUUkMoIlN5bWJvbCIpICYmICFiVHJ1ZVR5cGUpIHsKLSAgICAgICAgcFN1YnN0Rm9udC0+bV9GYW1pbHkgPSAiQ2hyb21lIFN5bWJvbCI7Ci0gICAgICAgIHBTdWJzdEZvbnQtPm1fQ2hhcnNldCA9IEZYRk9OVF9TWU1CT0xfQ0hBUlNFVDsKLSAgICAgICAgcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzIHw9IEZYRk9OVF9TVUJTVF9TVEFOREFSRDsKLSAgICAgICAgaWYgKG1fRm94aXRGYWNlc1sxMl0pIHsKLSAgICAgICAgICAgIHJldHVybiBtX0ZveGl0RmFjZXNbMTJdOwotICAgICAgICB9Ci0gICAgICAgIEZYX0xQQ0JZVEUgcEZvbnREYXRhID0gTlVMTDsKLSAgICAgICAgRlhfRFdPUkQgc2l6ZSA9IDA7Ci0gICAgICAgIG1fcEZvbnRNZ3ItPkdldFN0YW5kYXJkRm9udChwRm9udERhdGEsIHNpemUsIDEyKTsKLSAgICAgICAgbV9Gb3hpdEZhY2VzWzEyXSA9IG1fcEZvbnRNZ3ItPkdldEZpeGVkRmFjZShwRm9udERhdGEsIHNpemUsIDApOwotICAgICAgICByZXR1cm4gbV9Gb3hpdEZhY2VzWzEyXTsKKyAgfSBlbHNlIGlmIChtX1R5cGUgPT0gMikgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgaWYgKG1fVFRDRmFjZS5tX3BGYWNlc1tpXSA9PSBmYWNlKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIGlmIChpID09IDE2KSB7CisgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIGlmIChTdWJzdE5hbWUgPT0gRlhfQlNUUkMoIlphcGZEaW5nYmF0cyIpKSB7Ci0gICAgICAgIHBTdWJzdEZvbnQtPm1fRmFtaWx5ID0gIkNocm9tZSBEaW5nYmF0cyI7Ci0gICAgICAgIHBTdWJzdEZvbnQtPm1fQ2hhcnNldCA9IEZYRk9OVF9TWU1CT0xfQ0hBUlNFVDsKLSAgICAgICAgcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzIHw9IEZYRk9OVF9TVUJTVF9TVEFOREFSRDsKLSAgICAgICAgaWYgKG1fRm94aXRGYWNlc1sxM10pIHsKLSAgICAgICAgICAgIHJldHVybiBtX0ZveGl0RmFjZXNbMTNdOwotICAgICAgICB9Ci0gICAgICAgIEZYX0xQQ0JZVEUgcEZvbnREYXRhID0gTlVMTDsKLSAgICAgICAgRlhfRFdPUkQgc2l6ZSA9IDA7Ci0gICAgICAgIG1fcEZvbnRNZ3ItPkdldFN0YW5kYXJkRm9udChwRm9udERhdGEsIHNpemUsIDEzKTsKLSAgICAgICAgbV9Gb3hpdEZhY2VzWzEzXSA9IG1fcEZvbnRNZ3ItPkdldEZpeGVkRmFjZShwRm9udERhdGEsIHNpemUsIDApOwotICAgICAgICByZXR1cm4gbV9Gb3hpdEZhY2VzWzEzXTsKKyAgfQorICBtX1JlZkNvdW50LS07CisgIGlmIChtX1JlZkNvdW50KSB7CisgICAgcmV0dXJuIG1fUmVmQ291bnQ7CisgIH0KKyAgZGVsZXRlIHRoaXM7CisgIHJldHVybiAwOworfQorCitDRlhfRm9udE1ncjo6Q0ZYX0ZvbnRNZ3IoKSA6IG1fRlRMaWJyYXJ5KG51bGxwdHIpIHsKKyAgbV9wQnVpbHRpbk1hcHBlci5yZXNldChuZXcgQ0ZYX0ZvbnRNYXBwZXIodGhpcykpOworfQorCitDRlhfRm9udE1ncjo6fkNGWF9Gb250TWdyKCkgeworICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBtX0ZhY2VNYXApCisgICAgZGVsZXRlIHBhaXIuc2Vjb25kOworCisgIC8vIHxtX3BCdWlsdGluTWFwcGVyfCByZWZlcmVuY2VzIHxtX0ZUTGlicmFyeXwsIHNvIGl0IGhhcyB0byBiZSBkZXN0cm95ZWQKKyAgLy8gZmlyc3QuCisgIG1fcEJ1aWx0aW5NYXBwZXIucmVzZXQoKTsKKyAgRlhGVF9Eb25lX0ZyZWVUeXBlKG1fRlRMaWJyYXJ5KTsKK30KKwordm9pZCBDRlhfRm9udE1ncjo6SW5pdEZUTGlicmFyeSgpIHsKKyAgaWYgKG1fRlRMaWJyYXJ5KQorICAgIHJldHVybjsKKyAgRlhGVF9Jbml0X0ZyZWVUeXBlKCZtX0ZUTGlicmFyeSk7Cit9CisKK3ZvaWQgQ0ZYX0ZvbnRNZ3I6OlNldFN5c3RlbUZvbnRJbmZvKElGWF9TeXN0ZW1Gb250SW5mbyogcEZvbnRJbmZvKSB7CisgIG1fcEJ1aWx0aW5NYXBwZXItPlNldFN5c3RlbUZvbnRJbmZvKHBGb250SW5mbyk7Cit9CisKK0ZYRlRfRmFjZSBDRlhfRm9udE1ncjo6RmluZFN1YnN0Rm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRydWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0YWxpY19hbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ2hhcnNldENQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9TdWJzdEZvbnQqIHBTdWJzdEZvbnQpIHsKKyAgSW5pdEZUTGlicmFyeSgpOworICByZXR1cm4gbV9wQnVpbHRpbk1hcHBlci0+RmluZFN1YnN0Rm9udChmYWNlX25hbWUsIGJUcnVlVHlwZSwgZmxhZ3MsIHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRhbGljX2FuZ2xlLCBDaGFyc2V0Q1AsIHBTdWJzdEZvbnQpOworfQorCitGWEZUX0ZhY2UgQ0ZYX0ZvbnRNZ3I6OkdldENhY2hlZEZhY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGZhY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgcEZvbnREYXRhKSB7CisgIGF1dG8gaXQgPSBtX0ZhY2VNYXAuZmluZChLZXlOYW1lRnJvbUZhY2UoZmFjZV9uYW1lLCB3ZWlnaHQsIGJJdGFsaWMpKTsKKyAgaWYgKGl0ID09IG1fRmFjZU1hcC5lbmQoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBDVFRGb250RGVzYyogcEZvbnREZXNjID0gaXQtPnNlY29uZDsKKyAgcEZvbnREYXRhID0gcEZvbnREZXNjLT5tX3BGb250RGF0YTsKKyAgcEZvbnREZXNjLT5tX1JlZkNvdW50Kys7CisgIHJldHVybiBwRm9udERlc2MtPm1fU2luZ2xlRmFjZS5tX3BGYWNlOworfQorRlhGVF9GYWNlIENGWF9Gb250TWdyOjpBZGRDYWNoZWRGYWNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJdGFsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmFjZV9pbmRleCkgeworICBDVFRGb250RGVzYyogcEZvbnREZXNjID0gbmV3IENUVEZvbnREZXNjOworICBwRm9udERlc2MtPm1fVHlwZSA9IDE7CisgIHBGb250RGVzYy0+bV9TaW5nbGVGYWNlLm1fcEZhY2UgPSBOVUxMOworICBwRm9udERlc2MtPm1fU2luZ2xlRmFjZS5tX2JCb2xkID0gd2VpZ2h0OworICBwRm9udERlc2MtPm1fU2luZ2xlRmFjZS5tX2JJdGFsaWMgPSBiSXRhbGljOworICBwRm9udERlc2MtPm1fcEZvbnREYXRhID0gcERhdGE7CisgIHBGb250RGVzYy0+bV9SZWZDb3VudCA9IDE7CisKKyAgSW5pdEZUTGlicmFyeSgpOworICBGWEZUX0xpYnJhcnkgbGlicmFyeSA9IG1fRlRMaWJyYXJ5OworICBpbnQgcmV0ID0gRlhGVF9OZXdfTWVtb3J5X0ZhY2UobGlicmFyeSwgcERhdGEsIHNpemUsIGZhY2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEZvbnREZXNjLT5tX1NpbmdsZUZhY2UubV9wRmFjZSk7CisgIGlmIChyZXQpIHsKKyAgICBkZWxldGUgcEZvbnREZXNjOworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldCA9IEZYRlRfU2V0X1BpeGVsX1NpemVzKHBGb250RGVzYy0+bV9TaW5nbGVGYWNlLm1fcEZhY2UsIDY0LCA2NCk7CisgIGlmIChyZXQpIHsKKyAgICBkZWxldGUgcEZvbnREZXNjOworICAgIHJldHVybiBOVUxMOworICB9CisgIG1fRmFjZU1hcFtLZXlOYW1lRnJvbUZhY2UoZmFjZV9uYW1lLCB3ZWlnaHQsIGJJdGFsaWMpXSA9IHBGb250RGVzYzsKKyAgcmV0dXJuIHBGb250RGVzYy0+bV9TaW5nbGVGYWNlLm1fcEZhY2U7Cit9CisKK2ludCBHZXRUVENJbmRleChjb25zdCB1aW50OF90KiBwRm9udERhdGEsCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgdHRjX3NpemUsCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgZm9udF9vZmZzZXQpIHsKKyAgaW50IGZhY2VfaW5kZXggPSAwOworICBjb25zdCB1aW50OF90KiBwID0gcEZvbnREYXRhICsgODsKKyAgRlhfRFdPUkQgbmZvbnQgPSBHRVRfVFRfTE9ORyhwKTsKKyAgRlhfRFdPUkQgaW5kZXg7CisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG5mb250OyBpbmRleCsrKSB7CisgICAgcCA9IHBGb250RGF0YSArIDEyICsgaW5kZXggKiA0OworICAgIGlmIChHRVRfVFRfTE9ORyhwKSA9PSBmb250X29mZnNldCkgeworICAgICAgYnJlYWs7CiAgICAgfQotICAgIGludCBpQmFzZUZvbnQgPSAwOwotICAgIENGWF9CeXRlU3RyaW5nIGZhbWlseSwgc3R5bGU7Ci0gICAgRlhfQk9PTAliSGFzQ29tbWEgPSBGQUxTRTsKLSAgICBGWF9CT09MIGJIYXNIeXBlbiA9IEZBTFNFOwotICAgIGludCBmaW5kID0gU3Vic3ROYW1lLkZpbmQoRlhfQlNUUkMoIiwiKSwgMCk7Ci0gICAgaWYgKGZpbmQgPj0gMCkgewotICAgICAgICBmYW1pbHkgPSBTdWJzdE5hbWUuTGVmdChmaW5kKTsKLSAgICAgICAgX1BERl9HZXRTdGFuZGFyZEZvbnROYW1lKGZhbWlseSk7Ci0gICAgICAgIHN0eWxlID0gU3Vic3ROYW1lLk1pZChmaW5kICsgMSk7Ci0gICAgICAgIGJIYXNDb21tYSA9IFRSVUU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZmFtaWx5ID0gU3Vic3ROYW1lOworICB9CisgIGlmIChpbmRleCA+PSBuZm9udCkgeworICAgIGZhY2VfaW5kZXggPSAwOworICB9IGVsc2UgeworICAgIGZhY2VfaW5kZXggPSBpbmRleDsKKyAgfQorICByZXR1cm4gZmFjZV9pbmRleDsKK30KK0ZYRlRfRmFjZSBDRlhfRm9udE1ncjo6R2V0Q2FjaGVkVFRDRmFjZShpbnQgdHRjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY2hlY2tzdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbnRfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBwRm9udERhdGEpIHsKKyAgYXV0byBpdCA9IG1fRmFjZU1hcC5maW5kKEtleU5hbWVGcm9tU2l6ZSh0dGNfc2l6ZSwgY2hlY2tzdW0pKTsKKyAgaWYgKGl0ID09IG1fRmFjZU1hcC5lbmQoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBDVFRGb250RGVzYyogcEZvbnREZXNjID0gaXQtPnNlY29uZDsKKyAgcEZvbnREYXRhID0gcEZvbnREZXNjLT5tX3BGb250RGF0YTsKKyAgcEZvbnREZXNjLT5tX1JlZkNvdW50Kys7CisgIGludCBmYWNlX2luZGV4ID0gR2V0VFRDSW5kZXgocEZvbnREZXNjLT5tX3BGb250RGF0YSwgdHRjX3NpemUsIGZvbnRfb2Zmc2V0KTsKKyAgaWYgKCFwRm9udERlc2MtPm1fVFRDRmFjZS5tX3BGYWNlc1tmYWNlX2luZGV4XSkgeworICAgIHBGb250RGVzYy0+bV9UVENGYWNlLm1fcEZhY2VzW2ZhY2VfaW5kZXhdID0KKyAgICAgICAgR2V0Rml4ZWRGYWNlKHBGb250RGVzYy0+bV9wRm9udERhdGEsIHR0Y19zaXplLCBmYWNlX2luZGV4KTsKKyAgfQorICByZXR1cm4gcEZvbnREZXNjLT5tX1RUQ0ZhY2UubV9wRmFjZXNbZmFjZV9pbmRleF07Cit9CitGWEZUX0ZhY2UgQ0ZYX0ZvbnRNZ3I6OkFkZENhY2hlZFRUQ0ZhY2UoaW50IHR0Y19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNoZWNrc3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbnRfb2Zmc2V0KSB7CisgIENUVEZvbnREZXNjKiBwRm9udERlc2MgPSBuZXcgQ1RURm9udERlc2M7CisgIHBGb250RGVzYy0+bV9UeXBlID0gMjsKKyAgcEZvbnREZXNjLT5tX3BGb250RGF0YSA9IHBEYXRhOworICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICBwRm9udERlc2MtPm1fVFRDRmFjZS5tX3BGYWNlc1tpXSA9IE5VTEw7CisgIH0KKyAgcEZvbnREZXNjLT5tX1JlZkNvdW50Kys7CisgIG1fRmFjZU1hcFtLZXlOYW1lRnJvbVNpemUodHRjX3NpemUsIGNoZWNrc3VtKV0gPSBwRm9udERlc2M7CisgIGludCBmYWNlX2luZGV4ID0gR2V0VFRDSW5kZXgocEZvbnREZXNjLT5tX3BGb250RGF0YSwgdHRjX3NpemUsIGZvbnRfb2Zmc2V0KTsKKyAgcEZvbnREZXNjLT5tX1RUQ0ZhY2UubV9wRmFjZXNbZmFjZV9pbmRleF0gPQorICAgICAgR2V0Rml4ZWRGYWNlKHBGb250RGVzYy0+bV9wRm9udERhdGEsIHR0Y19zaXplLCBmYWNlX2luZGV4KTsKKyAgcmV0dXJuIHBGb250RGVzYy0+bV9UVENGYWNlLm1fcEZhY2VzW2ZhY2VfaW5kZXhdOworfQorCitGWEZUX0ZhY2UgQ0ZYX0ZvbnRNZ3I6OkdldEZpeGVkRmFjZShjb25zdCB1aW50OF90KiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmFjZV9pbmRleCkgeworICBJbml0RlRMaWJyYXJ5KCk7CisgIEZYRlRfTGlicmFyeSBsaWJyYXJ5ID0gbV9GVExpYnJhcnk7CisgIEZYRlRfRmFjZSBmYWNlID0gbnVsbHB0cjsKKyAgaWYgKEZYRlRfTmV3X01lbW9yeV9GYWNlKGxpYnJhcnksIHBEYXRhLCBzaXplLCBmYWNlX2luZGV4LCAmZmFjZSkpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiBGWEZUX1NldF9QaXhlbF9TaXplcyhmYWNlLCA2NCwgNjQpID8gbnVsbHB0ciA6IGZhY2U7Cit9CisKK0ZYRlRfRmFjZSBDRlhfRm9udE1ncjo6R2V0RmlsZUZhY2UoY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUsIGludCBmYWNlX2luZGV4KSB7CisgIEluaXRGVExpYnJhcnkoKTsKKyAgRlhGVF9MaWJyYXJ5IGxpYnJhcnkgPSBtX0ZUTGlicmFyeTsKKyAgRlhGVF9GYWNlIGZhY2UgPSBudWxscHRyOworICBpZiAoRlhGVF9OZXdfRmFjZShsaWJyYXJ5LCBmaWxlbmFtZSwgZmFjZV9pbmRleCwgJmZhY2UpKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gRlhGVF9TZXRfUGl4ZWxfU2l6ZXMoZmFjZSwgNjQsIDY0KSA/IG51bGxwdHIgOiBmYWNlOworfQorCit2b2lkIENGWF9Gb250TWdyOjpSZWxlYXNlRmFjZShGWEZUX0ZhY2UgZmFjZSkgeworICBpZiAoIWZhY2UpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfQk9PTCBiTmVlZEZhY2VEb25lID0gVFJVRTsKKyAgYXV0byBpdCA9IG1fRmFjZU1hcC5iZWdpbigpOworICB3aGlsZSAoaXQgIT0gbV9GYWNlTWFwLmVuZCgpKSB7CisgICAgYXV0byB0ZW1wID0gaXQrKzsKKyAgICBpbnQgblJldCA9IHRlbXAtPnNlY29uZC0+UmVsZWFzZUZhY2UoZmFjZSk7CisgICAgaWYgKG5SZXQgPT0gLTEpCisgICAgICBjb250aW51ZTsKKyAgICBiTmVlZEZhY2VEb25lID0gRkFMU0U7CisgICAgaWYgKG5SZXQgPT0gMCkKKyAgICAgIG1fRmFjZU1hcC5lcmFzZSh0ZW1wKTsKKyAgICBicmVhazsKKyAgfQorICBpZiAoYk5lZWRGYWNlRG9uZSAmJiAhbV9wQnVpbHRpbk1hcHBlci0+SXNCdWlsdGluRmFjZShmYWNlKSkKKyAgICBGWEZUX0RvbmVfRmFjZShmYWNlKTsKK30KKworYm9vbCBDRlhfRm9udE1ncjo6R2V0QnVpbHRpbkZvbnQoc2l6ZV90IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCoqIHBGb250RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBzaXplKSB7CisgIGlmIChpbmRleCA8IEZYX0FycmF5U2l6ZShnX0ZveGl0Rm9udHMpKSB7CisgICAgKnBGb250RGF0YSA9IGdfRm94aXRGb250c1tpbmRleF0ubV9wRm9udERhdGE7CisgICAgKnNpemUgPSBnX0ZveGl0Rm9udHNbaW5kZXhdLm1fZHdTaXplOworICAgIHJldHVybiB0cnVlOworICB9CisgIGluZGV4IC09IEZYX0FycmF5U2l6ZShnX0ZveGl0Rm9udHMpOworICBpZiAoaW5kZXggPCBGWF9BcnJheVNpemUoZ19NTUZvbnRzKSkgeworICAgICpwRm9udERhdGEgPSBnX01NRm9udHNbaW5kZXhdLm1fcEZvbnREYXRhOworICAgICpzaXplID0gZ19NTUZvbnRzW2luZGV4XS5tX2R3U2l6ZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK0NGWF9Gb250TWFwcGVyOjpDRlhfRm9udE1hcHBlcihDRlhfRm9udE1nciogbWdyKQorICAgIDogbV9iTGlzdExvYWRlZChGQUxTRSksCisgICAgICBtX3BGb250SW5mbyhudWxscHRyKSwKKyAgICAgIG1fcEZvbnRFbnVtZXJhdG9yKG51bGxwdHIpLAorICAgICAgbV9wRm9udE1ncihtZ3IpIHsKKyAgbV9NTUZhY2VzWzBdID0gbnVsbHB0cjsKKyAgbV9NTUZhY2VzWzFdID0gbnVsbHB0cjsKKyAgRlhTWVNfbWVtc2V0KG1fRm94aXRGYWNlcywgMCwgc2l6ZW9mKG1fRm94aXRGYWNlcykpOworfQorQ0ZYX0ZvbnRNYXBwZXI6On5DRlhfRm9udE1hcHBlcigpIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUobV9Gb3hpdEZhY2VzKTsgKytpKSB7CisgICAgaWYgKG1fRm94aXRGYWNlc1tpXSkKKyAgICAgIEZYRlRfRG9uZV9GYWNlKG1fRm94aXRGYWNlc1tpXSk7CisgIH0KKyAgaWYgKG1fTU1GYWNlc1swXSkgeworICAgIEZYRlRfRG9uZV9GYWNlKG1fTU1GYWNlc1swXSk7CisgIH0KKyAgaWYgKG1fTU1GYWNlc1sxXSkgeworICAgIEZYRlRfRG9uZV9GYWNlKG1fTU1GYWNlc1sxXSk7CisgIH0KKyAgaWYgKG1fcEZvbnRJbmZvKSB7CisgICAgbV9wRm9udEluZm8tPlJlbGVhc2UoKTsKKyAgfQorfQordm9pZCBDRlhfRm9udE1hcHBlcjo6U2V0U3lzdGVtRm9udEluZm8oSUZYX1N5c3RlbUZvbnRJbmZvKiBwRm9udEluZm8pIHsKKyAgaWYgKCFwRm9udEluZm8pIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fcEZvbnRJbmZvKSB7CisgICAgbV9wRm9udEluZm8tPlJlbGVhc2UoKTsKKyAgfQorICBtX3BGb250SW5mbyA9IHBGb250SW5mbzsKK30KKworQ0ZYX0J5dGVTdHJpbmcgR2V0TmFtZUZyb21UVChjb25zdCB1aW50OF90KiBuYW1lX3RhYmxlLCBGWF9EV09SRCBuYW1lX2lkKSB7CisgIGNvbnN0IHVpbnQ4X3QqIHB0ciA9IG5hbWVfdGFibGUgKyAyOworICBpbnQgbmFtZV9jb3VudCA9IEdFVF9UVF9TSE9SVChwdHIpOworICBpbnQgc3RyaW5nX29mZnNldCA9IEdFVF9UVF9TSE9SVChwdHIgKyAyKTsKKyAgY29uc3QgdWludDhfdCogc3RyaW5nX3B0ciA9IG5hbWVfdGFibGUgKyBzdHJpbmdfb2Zmc2V0OworICBwdHIgKz0gNDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lX2NvdW50OyBpKyspIHsKKyAgICBpZiAoR0VUX1RUX1NIT1JUKHB0ciArIDYpID09IG5hbWVfaWQgJiYgR0VUX1RUX1NIT1JUKHB0cikgPT0gMSAmJgorICAgICAgICBHRVRfVFRfU0hPUlQocHRyICsgMikgPT0gMCkgeworICAgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQyhzdHJpbmdfcHRyICsgR0VUX1RUX1NIT1JUKHB0ciArIDEwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1RUX1NIT1JUKHB0ciArIDgpKTsKICAgICB9Ci0gICAgZm9yICg7IGlCYXNlRm9udCA8IDEyOyBpQmFzZUZvbnQgKyspCi0gICAgICAgIGlmIChmYW1pbHkgPT0gQ0ZYX0J5dGVTdHJpbmdDKGdfQmFzZTE0Rm9udE5hbWVzW2lCYXNlRm9udF0pKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIGludCBQaXRjaEZhbWlseSA9IDA7Ci0gICAgRlhfQk9PTCBiSXRhbGljID0gRkFMU0U7Ci0gICAgRlhfRFdPUkQgblN0eWxlID0gMDsKLSAgICBGWF9CT09MIGJTdHlsZUF2YWlsID0gRkFMU0U7Ci0gICAgaWYgKGlCYXNlRm9udCA8IDEyKSB7Ci0gICAgICAgIGZhbWlseSA9IGdfQmFzZTE0Rm9udE5hbWVzW2lCYXNlRm9udF07Ci0gICAgICAgIGlmICgoaUJhc2VGb250ICUgNCkgPT0gMSB8fCAoaUJhc2VGb250ICUgNCkgPT0gMikgewotICAgICAgICAgICAgblN0eWxlIHw9IEZYX0ZPTlRfU1RZTEVfQm9sZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGlCYXNlRm9udCAlIDQpIC8gMikgewotICAgICAgICAgICAgblN0eWxlIHw9IEZYX0ZPTlRfU1RZTEVfSXRhbGljOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpQmFzZUZvbnQgPCA0KSB7Ci0gICAgICAgICAgICBQaXRjaEZhbWlseSB8PSBGWEZPTlRfRkZfRklYRURQSVRDSDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaUJhc2VGb250ID49IDgpIHsKLSAgICAgICAgICAgIFBpdGNoRmFtaWx5IHw9IEZYRk9OVF9GRl9ST01BTjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghYkhhc0NvbW1hKSB7Ci0gICAgICAgICAgICBmaW5kID0gZmFtaWx5LlJldmVyc2VGaW5kKCctJyk7Ci0gICAgICAgICAgICBpZiAoZmluZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGUgPSBmYW1pbHkuTWlkKGZpbmQgKyAxKTsKLSAgICAgICAgICAgICAgICBmYW1pbHkgPSBmYW1pbHkuTGVmdChmaW5kKTsKLSAgICAgICAgICAgICAgICBiSGFzSHlwZW4gPSBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghYkhhc0h5cGVuKSB7Ci0gICAgICAgICAgICBpbnQgbkxlbiA9IGZhbWlseS5HZXRMZW5ndGgoKTsKLSAgICAgICAgICAgIEZYX0lOVDMyIG5SZXQgPSBHZXRTdHlsZVR5cGUoZmFtaWx5LCBUUlVFKTsKLSAgICAgICAgICAgIGlmIChuUmV0ID4gLTEpIHsKLSAgICAgICAgICAgICAgICBmYW1pbHkgPSBmYW1pbHkuTGVmdChuTGVuIC0gZ19Gb250U3R5bGVzW25SZXRdLmxlbik7Ci0gICAgICAgICAgICAgICAgaWYgKG5SZXQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBuU3R5bGUgfD0gRlhfRk9OVF9TVFlMRV9Cb2xkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoblJldCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5TdHlsZSB8PSBGWF9GT05UX1NUWUxFX0l0YWxpYzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG5SZXQgPT0gMikgewotICAgICAgICAgICAgICAgICAgICBuU3R5bGUgfD0gKEZYX0ZPTlRfU1RZTEVfQm9sZCB8IEZYX0ZPTlRfU1RZTEVfSXRhbGljKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZsYWdzICYgRlhGT05UX1NFUklGKSB7Ci0gICAgICAgICAgICBQaXRjaEZhbWlseSB8PSBGWEZPTlRfRkZfUk9NQU47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZsYWdzICYgRlhGT05UX1NDUklQVCkgewotICAgICAgICAgICAgUGl0Y2hGYW1pbHkgfD0gRlhGT05UX0ZGX1NDUklQVDsKLSAgICAgICAgfQotICAgICAgICBpZiAoZmxhZ3MgJiBGWEZPTlRfRklYRURfUElUQ0gpIHsKLSAgICAgICAgICAgIFBpdGNoRmFtaWx5IHw9IEZYRk9OVF9GRl9GSVhFRFBJVENIOwotICAgICAgICB9CisgICAgcHRyICs9IDEyOworICB9CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOworfQorCitDRlhfQnl0ZVN0cmluZyBDRlhfRm9udE1hcHBlcjo6R2V0UFNOYW1lRnJvbVRUKHZvaWQqIGhGb250KSB7CisgIGlmICghbV9wRm9udEluZm8pCisgICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7CisKKyAgRlhfRFdPUkQgc2l6ZSA9IG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwga1RhYmxlTkFNRSwgbnVsbHB0ciwgMCk7CisgIGlmICghc2l6ZSkKKyAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKKworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXIoc2l6ZSk7CisgIHVpbnQ4X3QqIGJ1ZmZlcl9wdHIgPSBidWZmZXIuZGF0YSgpOworICBGWF9EV09SRCBieXRlc19yZWFkID0KKyAgICAgIG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwga1RhYmxlTkFNRSwgYnVmZmVyX3B0ciwgc2l6ZSk7CisgIHJldHVybiAoYnl0ZXNfcmVhZCA9PSBzaXplKSA/IEdldE5hbWVGcm9tVFQoYnVmZmVyX3B0ciwgNikgOiBDRlhfQnl0ZVN0cmluZygpOworfQorCit2b2lkIENGWF9Gb250TWFwcGVyOjpBZGRJbnN0YWxsZWRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBpbnQgY2hhcnNldCkgeworICBpZiAoIW1fcEZvbnRJbmZvKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX0NoYXJzZXRBcnJheS5GaW5kKChGWF9EV09SRCljaGFyc2V0KSA9PSAtMSkgeworICAgIG1fQ2hhcnNldEFycmF5LkFkZCgoRlhfRFdPUkQpY2hhcnNldCk7CisgICAgbV9GYWNlQXJyYXkuQWRkKG5hbWUpOworICB9CisgIGlmIChuYW1lID09IG1fTGFzdEZhbWlseSkgeworICAgIHJldHVybjsKKyAgfQorICBjb25zdCB1aW50OF90KiBwdHIgPSBuYW1lOworICBGWF9CT09MIGJMb2NhbGl6ZWQgPSBGQUxTRTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lLkdldExlbmd0aCgpOyBpKyspCisgICAgaWYgKHB0cltpXSA+IDB4ODApIHsKKyAgICAgIGJMb2NhbGl6ZWQgPSBUUlVFOworICAgICAgYnJlYWs7CiAgICAgfQotICAgIGlmICghc3R5bGUuSXNFbXB0eSgpKSB7Ci0gICAgICAgIGludCBuTGVuID0gc3R5bGUuR2V0TGVuZ3RoKCk7Ci0gICAgICAgIEZYX0xQQ1NUUiBwU3R5bGUgPSBzdHlsZTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBGWF9CT09MIGJGaXJzdEl0ZW0gPSBUUlVFOwotICAgICAgICBDRlhfQnl0ZVN0cmluZyBidWY7Ci0gICAgICAgIHdoaWxlIChpIDwgbkxlbikgewotICAgICAgICAgICAgYnVmID0gUGFyc2VTdHlsZShwU3R5bGUsIG5MZW4sIGkpOwotICAgICAgICAgICAgRlhfSU5UMzIgblJldCA9IEdldFN0eWxlVHlwZShidWYsIEZBTFNFKTsKLSAgICAgICAgICAgIGlmICgoaSAmJiAhYlN0eWxlQXZhaWwpIHx8ICghaSAmJiBuUmV0IDwgMCkpIHsKLSAgICAgICAgICAgICAgICBmYW1pbHkgPSBTdWJzdE5hbWU7Ci0gICAgICAgICAgICAgICAgaUJhc2VGb250ID0gMTI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5SZXQgPj0gMCkgewotICAgICAgICAgICAgICAgIGJTdHlsZUF2YWlsID0gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuUmV0ID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoblN0eWxlICYgRlhfRk9OVF9TVFlMRV9Cb2xkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5TdHlsZSB8PSBGWF9GT05UX1NUWUxFX0JvbGRCb2xkOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5TdHlsZSB8PSBGWF9GT05UX1NUWUxFX0JvbGQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJGaXJzdEl0ZW0gPSBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuUmV0ID09IDEpIHsKLSAgICAgICAgICAgICAgICBpZiAoYkZpcnN0SXRlbSkgewotICAgICAgICAgICAgICAgICAgICBuU3R5bGUgfD0gRlhfRk9OVF9TVFlMRV9JdGFsaWM7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gU3Vic3ROYW1lOwotICAgICAgICAgICAgICAgICAgICBpQmFzZUZvbnQgPSAxMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoblJldCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgblN0eWxlIHw9IEZYX0ZPTlRfU1RZTEVfSXRhbGljOwotICAgICAgICAgICAgICAgIGlmIChuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0JvbGQpIHsKLSAgICAgICAgICAgICAgICAgICAgblN0eWxlIHw9IEZYX0ZPTlRfU1RZTEVfQm9sZEJvbGQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgblN0eWxlIHw9IEZYX0ZPTlRfU1RZTEVfQm9sZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYkZpcnN0SXRlbSA9IEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaSArPSBidWYuR2V0TGVuZ3RoKCkgKyAxOwotICAgICAgICB9CisgIGlmIChiTG9jYWxpemVkKSB7CisgICAgdm9pZCogaEZvbnQgPSBtX3BGb250SW5mby0+R2V0Rm9udChuYW1lKTsKKyAgICBpZiAoIWhGb250KSB7CisgICAgICBpbnQgaUV4YWN0OworICAgICAgaEZvbnQgPQorICAgICAgICAgIG1fcEZvbnRJbmZvLT5NYXBGb250KDAsIDAsIEZYRk9OVF9ERUZBVUxUX0NIQVJTRVQsIDAsIG5hbWUsIGlFeGFjdCk7CisgICAgICBpZiAoIWhGb250KSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KICAgICB9Ci0gICAgd2VpZ2h0ID0gd2VpZ2h0ID8gd2VpZ2h0IDogRlhGT05UX0ZXX05PUk1BTDsKLSAgICBpbnQgb2xkX3dlaWdodCA9IHdlaWdodDsKLSAgICBpZiAoblN0eWxlKSB7Ci0gICAgICAgIHdlaWdodCA9IG5TdHlsZSAmIEZYX0ZPTlRfU1RZTEVfQm9sZEJvbGQgPyA5MDAgOiAoblN0eWxlICYgRlhfRk9OVF9TVFlMRV9Cb2xkID8gRlhGT05UX0ZXX0JPTEQgOiBGWEZPTlRfRldfTk9STUFMKTsKLSAgICB9Ci0gICAgaWYgKG5TdHlsZSAmIEZYX0ZPTlRfU1RZTEVfSXRhbGljKSB7Ci0gICAgICAgIGJJdGFsaWMgPSBUUlVFOwotICAgIH0KLSAgICBGWF9CT09MIGJDSksgPSBGQUxTRTsKLSAgICBGWF9CT09MIGJFeGFjdCA9IEZBTFNFOwotICAgIGludCBDaGFyc2V0ID0gRlhGT05UX0FOU0lfQ0hBUlNFVDsKLSAgICBpZiAoV2luZG93Q1ApIHsKLSAgICAgICAgQ2hhcnNldCA9IF9HZXRDaGFyc2V0RnJvbUNvZGVQYWdlKFdpbmRvd0NQKTsKLSAgICB9IGVsc2UgaWYgKGlCYXNlRm9udCA9PSAxMiAmJiAoZmxhZ3MgJiBGWEZPTlRfU1lNQk9MSUMpKSB7Ci0gICAgICAgIENoYXJzZXQgPSBGWEZPTlRfU1lNQk9MX0NIQVJTRVQ7Ci0gICAgfQotICAgIGlmIChDaGFyc2V0ID09IEZYRk9OVF9TSElGVEpJU19DSEFSU0VUIHx8IENoYXJzZXQgPT0gRlhGT05UX0dCMjMxMl9DSEFSU0VUIHx8Ci0gICAgICAgICAgICBDaGFyc2V0ID09IEZYRk9OVF9IQU5HRVVMX0NIQVJTRVQgfHwgQ2hhcnNldCA9PSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVCkgewotICAgICAgICBiQ0pLID0gVFJVRTsKLSAgICB9Ci0gICAgaWYgKG1fcEZvbnRJbmZvID09IE5VTEwpIHsKLSAgICAgICAgcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzIHw9IEZYRk9OVF9TVUJTVF9TVEFOREFSRDsKLSAgICAgICAgcmV0dXJuIFVzZUludGVybmFsU3Vic3QocFN1YnN0Rm9udCwgaUJhc2VGb250LCBpdGFsaWNfYW5nbGUsIG9sZF93ZWlnaHQsIFBpdGNoRmFtaWx5KTsKLSAgICB9Ci0gICAgZmFtaWx5ID0gX0dldEZvbnRGYW1pbHkoZmFtaWx5LCBuU3R5bGUpOwotICAgIENGWF9CeXRlU3RyaW5nIG1hdGNoID0gTWF0Y2hJbnN0YWxsZWRGb250cyhfVFRfTm9ybWFsaXplTmFtZShmYW1pbHkpKTsKLSAgICBpZiAobWF0Y2guSXNFbXB0eSgpICYmIGZhbWlseSAhPSBTdWJzdE5hbWUgJiYgKCFiSGFzQ29tbWEgJiYgKCFiSGFzSHlwZW4gfHwgKGJIYXNIeXBlbiAmJiAhYlN0eWxlQXZhaWwpKSkpIHsKLSAgICAgICAgbWF0Y2ggPSBNYXRjaEluc3RhbGxlZEZvbnRzKF9UVF9Ob3JtYWxpemVOYW1lKFN1YnN0TmFtZSkpOwotICAgIH0KLSAgICBpZiAobWF0Y2guSXNFbXB0eSgpICYmIGlCYXNlRm9udCA+PSAxMikgewotICAgICAgICBpZiAoIWJDSkspIHsKLSAgICAgICAgICAgIGlmICghQ2hlY2tTdXBwb3J0VGhpcmRQYXJ0Rm9udChmYW1pbHksIFBpdGNoRmFtaWx5KSkgewotICAgICAgICAgICAgICAgIGlmIChpdGFsaWNfYW5nbGUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBiSXRhbGljID0gVFJVRTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiSXRhbGljID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdlaWdodCA9IG9sZF93ZWlnaHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwU3Vic3RGb250LT5tX2JTdWJzdE9mQ0pLID0gVFJVRTsKLSAgICAgICAgICAgIGlmIChuU3R5bGUpIHsKLSAgICAgICAgICAgICAgICBwU3Vic3RGb250LT5tX1dlaWdodENKSyA9IHdlaWdodDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcFN1YnN0Rm9udC0+bV9XZWlnaHRDSksgPSBGWEZPTlRfRldfTk9STUFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5TdHlsZSAmIEZYX0ZPTlRfU1RZTEVfSXRhbGljKSB7Ci0gICAgICAgICAgICAgICAgcFN1YnN0Rm9udC0+bV9iSXRsaWNDSksgPSBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaXRhbGljX2FuZ2xlID0gMDsKLSAgICAgICAgd2VpZ2h0ID0gblN0eWxlICYgRlhfRk9OVF9TVFlMRV9Cb2xkQm9sZCA/IDkwMCA6IChuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0JvbGQgPyBGWEZPTlRfRldfQk9MRCA6IEZYRk9OVF9GV19OT1JNQUwpOwotICAgIH0KLSAgICBpZiAoIW1hdGNoLklzRW1wdHkoKSB8fCBpQmFzZUZvbnQgPCAxMikgewotICAgICAgICBwU3Vic3RGb250LT5tX1N1YnN0RmxhZ3MgfD0gRlhGT05UX1NVQlNUX0VYQUNUOwotICAgICAgICBpZiAoIW1hdGNoLklzRW1wdHkoKSkgewotICAgICAgICAgICAgZmFtaWx5ID0gbWF0Y2g7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlCYXNlRm9udCA8IDEyKSB7Ci0gICAgICAgICAgICBpZiAoblN0eWxlICYmICEoaUJhc2VGb250ICUgNCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoKG5TdHlsZSAmIDB4MykgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBpQmFzZUZvbnQgKz0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChuU3R5bGUgJiAweDMpID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgaUJhc2VGb250ICs9IDM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoblN0eWxlICYgMHgzKSA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlCYXNlRm9udCArPSAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX3BGb250TWdyLT5tX0V4dGVybmFsRm9udHNbaUJhc2VGb250XS5tX3BGb250RGF0YSkgewotICAgICAgICAgICAgICAgIGlmIChtX0ZveGl0RmFjZXNbaUJhc2VGb250XSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9Gb3hpdEZhY2VzW2lCYXNlRm9udF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fRm94aXRGYWNlc1tpQmFzZUZvbnRdID0gbV9wRm9udE1nci0+R2V0Rml4ZWRGYWNlKG1fcEZvbnRNZ3ItPm1fRXh0ZXJuYWxGb250c1tpQmFzZUZvbnRdLm1fcEZvbnREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRm9udE1nci0+bV9FeHRlcm5hbEZvbnRzW2lCYXNlRm9udF0ubV9kd1NpemUsIDApOwotICAgICAgICAgICAgICAgIGlmIChtX0ZveGl0RmFjZXNbaUJhc2VGb250XSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9Gb3hpdEZhY2VzW2lCYXNlRm9udF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmYW1pbHkgPSBnX0Jhc2UxNEZvbnROYW1lc1tpQmFzZUZvbnRdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzIHw9IEZYRk9OVF9TVUJTVF9TVEFOREFSRDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChmbGFncyAmIEZYRk9OVF9JVEFMSUMpIHsKLSAgICAgICAgICAgIGJJdGFsaWMgPSBUUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIGJFeGFjdCA9ICFtYXRjaC5Jc0VtcHR5KCk7Ci0gICAgdm9pZCogaEZvbnQgPSBtX3BGb250SW5mby0+TWFwRm9udCh3ZWlnaHQsIGJJdGFsaWMsIENoYXJzZXQsIFBpdGNoRmFtaWx5LCBmYW1pbHksIGJFeGFjdCk7Ci0gICAgaWYgKGJFeGFjdCkgewotICAgICAgICBwU3Vic3RGb250LT5tX1N1YnN0RmxhZ3MgfD0gRlhGT05UX1NVQlNUX0VYQUNUOwotICAgIH0KLSAgICBpZiAoaEZvbnQgPT0gTlVMTCkgewotICAgICAgICBpZiAoYkNKSykgewotICAgICAgICAgICAgaWYgKGl0YWxpY19hbmdsZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYkl0YWxpYyA9IFRSVUU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJJdGFsaWMgPSBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdlaWdodCA9IG9sZF93ZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtYXRjaC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGhGb250ID0gbV9wRm9udEluZm8tPkdldEZvbnQobWF0Y2gpOwotICAgICAgICAgICAgaWYgKGhGb250ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVXNlSW50ZXJuYWxTdWJzdChwU3Vic3RGb250LCBpQmFzZUZvbnQsIGl0YWxpY19hbmdsZSwgb2xkX3dlaWdodCwgUGl0Y2hGYW1pbHkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKENoYXJzZXQgPT0gRlhGT05UX1NZTUJPTF9DSEFSU0VUKSB7Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfIHx8IF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FORFJPSURfCi0gICAgICAgICAgICAgICAgaWYgKFN1YnN0TmFtZSA9PSBGWF9CU1RSQygiU3ltYm9sIikpIHsKLSAgICAgICAgICAgICAgICAgICAgcFN1YnN0Rm9udC0+bV9GYW1pbHkgPSAiQ2hyb21lIFN5bWJvbCI7Ci0gICAgICAgICAgICAgICAgICAgIHBTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyB8PSBGWEZPTlRfU1VCU1RfU1RBTkRBUkQ7Ci0gICAgICAgICAgICAgICAgICAgIHBTdWJzdEZvbnQtPm1fQ2hhcnNldCA9IEZYRk9OVF9TWU1CT0xfQ0hBUlNFVDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1fRm94aXRGYWNlc1sxMl0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX0ZveGl0RmFjZXNbMTJdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEZYX0xQQ0JZVEUgcEZvbnREYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIG1fcEZvbnRNZ3ItPkdldFN0YW5kYXJkRm9udChwRm9udERhdGEsIHNpemUsIDEyKTsKLSAgICAgICAgICAgICAgICAgICAgbV9Gb3hpdEZhY2VzWzEyXSA9IG1fcEZvbnRNZ3ItPkdldEZpeGVkRmFjZShwRm9udERhdGEsIHNpemUsIDApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9Gb3hpdEZhY2VzWzEyXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwU3Vic3RGb250LT5tX1N1YnN0RmxhZ3MgfD0gRlhGT05UX1NVQlNUX05PTlNZTUJPTDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZpbmRTdWJzdEZvbnQoZmFtaWx5LCBiVHJ1ZVR5cGUsIGZsYWdzICYgfkZYRk9OVF9TWU1CT0xJQywgd2VpZ2h0LCBpdGFsaWNfYW5nbGUsIDAsIHBTdWJzdEZvbnQpOwotICAgICAgICAgICAgICAgIH0KLSNlbHNlCi0gICAgICAgICAgICAgICAgcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzIHw9IEZYRk9OVF9TVUJTVF9OT05TWU1CT0w7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZpbmRTdWJzdEZvbnQoZmFtaWx5LCBiVHJ1ZVR5cGUsIGZsYWdzICYgfkZYRk9OVF9TWU1CT0xJQywgd2VpZ2h0LCBpdGFsaWNfYW5nbGUsIDAsIHBTdWJzdEZvbnQpOwotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoQ2hhcnNldCA9PSBGWEZPTlRfQU5TSV9DSEFSU0VUKSB7Ci0gICAgICAgICAgICAgICAgcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzIHw9IEZYRk9OVF9TVUJTVF9TVEFOREFSRDsKLSAgICAgICAgICAgICAgICByZXR1cm4gVXNlSW50ZXJuYWxTdWJzdChwU3Vic3RGb250LCBpQmFzZUZvbnQsIGl0YWxpY19hbmdsZSwgb2xkX3dlaWdodCwgUGl0Y2hGYW1pbHkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGluZGV4ID0gbV9DaGFyc2V0QXJyYXkuRmluZChDaGFyc2V0KTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVXNlSW50ZXJuYWxTdWJzdChwU3Vic3RGb250LCBpQmFzZUZvbnQsIGl0YWxpY19hbmdsZSwgb2xkX3dlaWdodCwgUGl0Y2hGYW1pbHkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBoRm9udCA9IG1fcEZvbnRJbmZvLT5HZXRGb250KG1fRmFjZUFycmF5W2luZGV4XSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcFN1YnN0Rm9udC0+bV9FeHRIYW5kbGUgPSBtX3BGb250SW5mby0+UmV0YWluRm9udChoRm9udCk7Ci0gICAgaWYgKGhGb250ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIG1fcEZvbnRJbmZvLT5HZXRGYWNlTmFtZShoRm9udCwgU3Vic3ROYW1lKTsKLSAgICBpZiAoQ2hhcnNldCA9PSBGWEZPTlRfREVGQVVMVF9DSEFSU0VUKSB7Ci0gICAgICAgIG1fcEZvbnRJbmZvLT5HZXRGb250Q2hhcnNldChoRm9udCwgQ2hhcnNldCk7Ci0gICAgfQotICAgIEZYX0RXT1JEIHR0Y19zaXplID0gbV9wRm9udEluZm8tPkdldEZvbnREYXRhKGhGb250LCAweDc0NzQ2MzY2LCBOVUxMLCAwKTsKLSAgICBGWF9EV09SRCBmb250X3NpemUgPSBtX3BGb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIDAsIE5VTEwsIDApOwotICAgIGlmKGZvbnRfc2l6ZSA9PSAwICYmIHR0Y19zaXplID09IDApIHsKLSAgICAgICAgbV9wRm9udEluZm8tPkRlbGV0ZUZvbnQoaEZvbnQpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgRlhGVF9GYWNlIGZhY2UgPSBOVUxMOwotICAgIGlmICh0dGNfc2l6ZSkgewotICAgICAgICBGWF9CWVRFIHRlbXBbMTAyNF07Ci0gICAgICAgIG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwgMHg3NDc0NjM2NiwgdGVtcCwgMTAyNCk7Ci0gICAgICAgIEZYX0RXT1JEIGNoZWNrc3VtID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKLSAgICAgICAgICAgIGNoZWNrc3VtICs9ICgoRlhfRFdPUkQqKXRlbXApW2ldOwotICAgICAgICB9Ci0gICAgICAgIEZYX0xQQllURSBwRm9udERhdGE7Ci0gICAgICAgIGZhY2UgPSBtX3BGb250TWdyLT5HZXRDYWNoZWRUVENGYWNlKHR0Y19zaXplLCBjaGVja3N1bSwgdHRjX3NpemUgLSBmb250X3NpemUsIHBGb250RGF0YSk7Ci0gICAgICAgIGlmIChmYWNlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHBGb250RGF0YSA9IEZYX0FsbG9jKEZYX0JZVEUsIHR0Y19zaXplKTsKLSAgICAgICAgICAgIG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwgMHg3NDc0NjM2NiwgcEZvbnREYXRhLCB0dGNfc2l6ZSk7Ci0gICAgICAgICAgICBmYWNlID0gbV9wRm9udE1nci0+QWRkQ2FjaGVkVFRDRmFjZSh0dGNfc2l6ZSwgY2hlY2tzdW0sIHBGb250RGF0YSwgdHRjX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGNfc2l6ZSAtIGZvbnRfc2l6ZSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBGWF9MUEJZVEUgcEZvbnREYXRhOwotICAgICAgICBmYWNlID0gbV9wRm9udE1nci0+R2V0Q2FjaGVkRmFjZShTdWJzdE5hbWUsIHdlaWdodCwgYkl0YWxpYywgcEZvbnREYXRhKTsKLSAgICAgICAgaWYgKGZhY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgcEZvbnREYXRhID0gRlhfQWxsb2MoRlhfQllURSwgZm9udF9zaXplKTsKLSAgICAgICAgICAgIG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwgMCwgcEZvbnREYXRhLCBmb250X3NpemUpOwotICAgICAgICAgICAgZmFjZSA9IG1fcEZvbnRNZ3ItPkFkZENhY2hlZEZhY2UoU3Vic3ROYW1lLCB3ZWlnaHQsIGJJdGFsaWMsIHBGb250RGF0YSwgZm9udF9zaXplLCBtX3BGb250SW5mby0+R2V0RmFjZUluZGV4KGhGb250KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGZhY2UgPT0gTlVMTCkgewotICAgICAgICBtX3BGb250SW5mby0+RGVsZXRlRm9udChoRm9udCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBwU3Vic3RGb250LT5tX0ZhbWlseSA9IFN1YnN0TmFtZTsKLSAgICBwU3Vic3RGb250LT5tX0NoYXJzZXQgPSBDaGFyc2V0OwotICAgIEZYX0JPT0wgYk5lZWRVcGRhdGVXZWlnaHQgPSBGQUxTRTsKLSAgICBpZiAoRlhGVF9Jc19GYWNlX0JvbGQoZmFjZSkpIHsKLSAgICAgICAgaWYgKHdlaWdodCA9PSBGWEZPTlRfRldfQk9MRCkgewotICAgICAgICAgICAgYk5lZWRVcGRhdGVXZWlnaHQgPSBGQUxTRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJOZWVkVXBkYXRlV2VpZ2h0ID0gVFJVRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICh3ZWlnaHQgPT0gRlhGT05UX0ZXX05PUk1BTCkgewotICAgICAgICAgICAgYk5lZWRVcGRhdGVXZWlnaHQgPSBGQUxTRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJOZWVkVXBkYXRlV2VpZ2h0ID0gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoYk5lZWRVcGRhdGVXZWlnaHQpIHsKLSAgICAgICAgcFN1YnN0Rm9udC0+bV9XZWlnaHQgPSB3ZWlnaHQ7Ci0gICAgfQotICAgIGlmIChiSXRhbGljICYmICFGWEZUX0lzX0ZhY2VfSXRhbGljKGZhY2UpKSB7Ci0gICAgICAgIGlmIChpdGFsaWNfYW5nbGUgPT0gMCkgewotICAgICAgICAgICAgaXRhbGljX2FuZ2xlID0gLTEyOwotICAgICAgICB9IGVsc2UgaWYgKEZYU1lTX2FicyhpdGFsaWNfYW5nbGUpIDwgNSkgewotICAgICAgICAgICAgaXRhbGljX2FuZ2xlID0gMDsKLSAgICAgICAgfQotICAgICAgICBwU3Vic3RGb250LT5tX0l0YWxpY0FuZ2xlID0gaXRhbGljX2FuZ2xlOworICAgIENGWF9CeXRlU3RyaW5nIG5ld19uYW1lID0gR2V0UFNOYW1lRnJvbVRUKGhGb250KTsKKyAgICBpZiAoIW5ld19uYW1lLklzRW1wdHkoKSkgeworICAgICAgbmV3X25hbWUuSW5zZXJ0KDAsICcgJyk7CisgICAgICBtX0luc3RhbGxlZFRURm9udHMuQWRkKG5ld19uYW1lKTsKICAgICB9CiAgICAgbV9wRm9udEluZm8tPkRlbGV0ZUZvbnQoaEZvbnQpOwotICAgIHJldHVybiBmYWNlOworICB9CisgIG1fSW5zdGFsbGVkVFRGb250cy5BZGQobmFtZSk7CisgIG1fTGFzdEZhbWlseSA9IG5hbWU7CiB9Ci1leHRlcm4gIkMiIHsKLSAgICB1bnNpZ25lZCBsb25nIF9GVFN0cmVhbVJlYWQoRlhGVF9TdHJlYW0gc3RyZWFtLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLSAgICB2b2lkIF9GVFN0cmVhbUNsb3NlKEZYRlRfU3RyZWFtIHN0cmVhbSk7Ci19OwotQ0ZvbnRGaWxlRmFjZUluZm86OkNGb250RmlsZUZhY2VJbmZvKCkKLXsKLSAgICBtX3BGaWxlID0gTlVMTDsKLSAgICBtX0ZhY2UgPSBOVUxMOwotICAgIG1fQ2hhcnNldHMgPSAwOwotICAgIG1fRmlsZVNpemUgPSAwOwotICAgIG1fRm9udE9mZnNldCA9IDA7Ci0gICAgbV9XZWlnaHQgPSAwOwotICAgIG1fYkl0YWxpYyA9IEZBTFNFOwotICAgIG1fUGl0Y2hGYW1pbHkgPSAwOwordm9pZCBDRlhfRm9udE1hcHBlcjo6TG9hZEluc3RhbGxlZEZvbnRzKCkgeworICBpZiAoIW1fcEZvbnRJbmZvKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX2JMaXN0TG9hZGVkKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX2JMaXN0TG9hZGVkKSB7CisgICAgcmV0dXJuOworICB9CisgIG1fcEZvbnRJbmZvLT5FbnVtRm9udExpc3QodGhpcyk7CisgIG1fYkxpc3RMb2FkZWQgPSBUUlVFOwogfQotQ0ZvbnRGaWxlRmFjZUluZm86On5DRm9udEZpbGVGYWNlSW5mbygpCi17Ci0gICAgaWYgKG1fRmFjZSkgewotICAgICAgICBGWEZUX0RvbmVfRmFjZShtX0ZhY2UpOworQ0ZYX0J5dGVTdHJpbmcgQ0ZYX0ZvbnRNYXBwZXI6Ok1hdGNoSW5zdGFsbGVkRm9udHMoCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5vcm1fbmFtZSkgeworICBMb2FkSW5zdGFsbGVkRm9udHMoKTsKKyAgaW50IGk7CisgIGZvciAoaSA9IG1fSW5zdGFsbGVkVFRGb250cy5HZXRTaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgIENGWF9CeXRlU3RyaW5nIG5vcm0xID0gVFRfTm9ybWFsaXplTmFtZShtX0luc3RhbGxlZFRURm9udHNbaV0pOworICAgIGlmIChub3JtMSA9PSBub3JtX25hbWUpIHsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICBtX0ZhY2UgPSBOVUxMOworICB9CisgIGlmIChpIDwgMCkgeworICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOworICB9CisgIENGWF9CeXRlU3RyaW5nIG1hdGNoID0gbV9JbnN0YWxsZWRUVEZvbnRzW2ldOworICBpZiAobWF0Y2hbMF0gPT0gJyAnKSB7CisgICAgbWF0Y2ggPSBtX0luc3RhbGxlZFRURm9udHNbaSArIDFdOworICB9CisgIHJldHVybiBtYXRjaDsKIH0KLWV4dGVybiBGWF9CT09MIF9Mb2FkRmlsZShGWEZUX0xpYnJhcnkgbGlicmFyeSwgRlhGVF9GYWNlKiBGYWNlLCBJRlhfRmlsZVJlYWQqIHBGaWxlLCBGWEZUX1N0cmVhbSogc3RyZWFtKTsKLSNpZiBfRlhfT1NfID09IF9GWF9BTkRST0lEXwotSUZYX1N5c3RlbUZvbnRJbmZvKiBJRlhfU3lzdGVtRm9udEluZm86OkNyZWF0ZURlZmF1bHQoKQotewotICAgIHJldHVybiBOVUxMOwotfQotI2VuZGlmCi1DRlhfRm9sZGVyRm9udEluZm86OkNGWF9Gb2xkZXJGb250SW5mbygpCi17Ci19Ci1DRlhfRm9sZGVyRm9udEluZm86On5DRlhfRm9sZGVyRm9udEluZm8oKQotewotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fRm9udExpc3QuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcga2V5OwotICAgICAgICBGWF9MUFZPSUQgdmFsdWU7Ci0gICAgICAgIG1fRm9udExpc3QuR2V0TmV4dEFzc29jKHBvcywga2V5LCB2YWx1ZSk7Ci0gICAgICAgIGRlbGV0ZSAoQ0ZvbnRGYWNlSW5mbyopdmFsdWU7Ci0gICAgfQotfQotdm9pZCBDRlhfRm9sZGVyRm9udEluZm86OkFkZFBhdGgoRlhfQlNUUiBwYXRoKQotewotICAgIG1fUGF0aExpc3QuQWRkKHBhdGgpOwotfQotdm9pZCBDRlhfRm9sZGVyRm9udEluZm86OlJlbGVhc2UoKQotewotICAgIGRlbGV0ZSB0aGlzOwotfQotRlhfQk9PTCBDRlhfRm9sZGVyRm9udEluZm86OkVudW1Gb250TGlzdChDRlhfRm9udE1hcHBlciogcE1hcHBlcikKLXsKLSAgICBtX3BNYXBwZXIgPSBwTWFwcGVyOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9QYXRoTGlzdC5HZXRTaXplKCk7IGkgKyspIHsKLSAgICAgICAgU2NhblBhdGgobV9QYXRoTGlzdFtpXSk7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotdm9pZCBDRlhfRm9sZGVyRm9udEluZm86OlNjYW5QYXRoKENGWF9CeXRlU3RyaW5nJiBwYXRoKQotewotICAgIHZvaWQqIGhhbmRsZSA9IEZYX09wZW5Gb2xkZXIocGF0aCk7Ci0gICAgaWYgKGhhbmRsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgZmlsZW5hbWU7Ci0gICAgRlhfQk9PTCBiRm9sZGVyOwotICAgIHdoaWxlIChGWF9HZXROZXh0RmlsZShoYW5kbGUsIGZpbGVuYW1lLCBiRm9sZGVyKSkgewotICAgICAgICBpZiAoYkZvbGRlcikgewotICAgICAgICAgICAgaWYgKGZpbGVuYW1lID09ICIuIiB8fCBmaWxlbmFtZSA9PSAiLi4iKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBleHQgPSBmaWxlbmFtZS5SaWdodCg0KTsKLSAgICAgICAgICAgIGV4dC5NYWtlVXBwZXIoKTsKLSAgICAgICAgICAgIGlmIChleHQgIT0gIi5UVEYiICYmIGV4dCAhPSAiLk9URiIgJiYgZXh0ICE9ICIuVFRDIikgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGZ1bGxwYXRoID0gcGF0aDsKLSNpZiBfRlhNX1BMQVRGT1JNXyAgPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotICAgICAgICBmdWxscGF0aCArPSAiXFwiOwotI2Vsc2UKLSAgICAgICAgZnVsbHBhdGggKz0gIi8iOwotI2VuZGlmCi0gICAgICAgIGZ1bGxwYXRoICs9IGZpbGVuYW1lOwotICAgICAgICBpZiAoYkZvbGRlcikgewotICAgICAgICAgICAgU2NhblBhdGgoZnVsbHBhdGgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU2NhbkZpbGUoZnVsbHBhdGgpOwotICAgICAgICB9Ci0gICAgfQotICAgIEZYX0Nsb3NlRm9sZGVyKGhhbmRsZSk7Ci19Ci12b2lkIENGWF9Gb2xkZXJGb250SW5mbzo6U2NhbkZpbGUoQ0ZYX0J5dGVTdHJpbmcmIHBhdGgpCi17Ci0gICAgRlhTWVNfRklMRSogcEZpbGUgPSBGWFNZU19mb3BlbihwYXRoLCAicmIiKTsKLSAgICBpZiAocEZpbGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYU1lTX2ZzZWVrKHBGaWxlLCAwLCBGWFNZU19TRUVLX0VORCk7Ci0gICAgRlhfRFdPUkQgZmlsZXNpemUgPSBGWFNZU19mdGVsbChwRmlsZSk7Ci0gICAgRlhfQllURSBidWZmZXJbMTZdOwotICAgIEZYU1lTX2ZzZWVrKHBGaWxlLCAwLCBGWFNZU19TRUVLX1NFVCk7Ci0gICAgc2l6ZV90IHJlYWRDbnQgPSBGWFNZU19mcmVhZChidWZmZXIsIDEyLCAxLCBwRmlsZSk7Ci0gICAgaWYgKHJlYWRDbnQgIT0gMSkgewotICAgICAgICBGWFNZU19mY2xvc2UocEZpbGUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQogCi0gICAgaWYgKEdFVF9UVF9MT05HKGJ1ZmZlcikgPT0gMHg3NDc0NjM2NikgewotICAgICAgICBGWF9EV09SRCBuRmFjZXMgPSBHRVRfVFRfTE9ORyhidWZmZXIgKyA4KTsKLSAgICAgICAgaWYgKG5GYWNlcyA+IEZYX0RXT1JEX01BWCAvIDQpIHsKLSAgICAgICAgICAgIEZYU1lTX2ZjbG9zZShwRmlsZSk7Ci0gICAgICAgICAgICByZXR1cm47CitGWEZUX0ZhY2UgQ0ZYX0ZvbnRNYXBwZXI6OlVzZUludGVybmFsU3Vic3QoQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaUJhc2VGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGFsaWNfYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGljdGhmYW1pbHkpIHsKKyAgaWYgKGlCYXNlRm9udCA8IDEyKSB7CisgICAgaWYgKG1fRm94aXRGYWNlc1tpQmFzZUZvbnRdKSB7CisgICAgICByZXR1cm4gbV9Gb3hpdEZhY2VzW2lCYXNlRm9udF07CisgICAgfQorICAgIGNvbnN0IHVpbnQ4X3QqIHBGb250RGF0YSA9IE5VTEw7CisgICAgRlhfRFdPUkQgc2l6ZSA9IDA7CisgICAgaWYgKG1fcEZvbnRNZ3ItPkdldEJ1aWx0aW5Gb250KGlCYXNlRm9udCwgJnBGb250RGF0YSwgJnNpemUpKSB7CisgICAgICBtX0ZveGl0RmFjZXNbaUJhc2VGb250XSA9IG1fcEZvbnRNZ3ItPkdldEZpeGVkRmFjZShwRm9udERhdGEsIHNpemUsIDApOworICAgICAgcmV0dXJuIG1fRm94aXRGYWNlc1tpQmFzZUZvbnRdOworICAgIH0KKyAgfQorICBwU3Vic3RGb250LT5tX1N1YnN0RmxhZ3MgfD0gRlhGT05UX1NVQlNUX01NOworICBwU3Vic3RGb250LT5tX0l0YWxpY0FuZ2xlID0gaXRhbGljX2FuZ2xlOworICBpZiAod2VpZ2h0KSB7CisgICAgcFN1YnN0Rm9udC0+bV9XZWlnaHQgPSB3ZWlnaHQ7CisgIH0KKyAgaWYgKHBpY3RoZmFtaWx5ICYgRlhGT05UX0ZGX1JPTUFOKSB7CisgICAgcFN1YnN0Rm9udC0+bV9XZWlnaHQgPSBwU3Vic3RGb250LT5tX1dlaWdodCAqIDQgLyA1OworICAgIHBTdWJzdEZvbnQtPm1fRmFtaWx5ID0gIkNocm9tZSBTZXJpZiI7CisgICAgaWYgKG1fTU1GYWNlc1sxXSkgeworICAgICAgcmV0dXJuIG1fTU1GYWNlc1sxXTsKKyAgICB9CisgICAgY29uc3QgdWludDhfdCogcEZvbnREYXRhID0gTlVMTDsKKyAgICBGWF9EV09SRCBzaXplID0gMDsKKyAgICBtX3BGb250TWdyLT5HZXRCdWlsdGluRm9udCgxNCwgJnBGb250RGF0YSwgJnNpemUpOworICAgIG1fTU1GYWNlc1sxXSA9IG1fcEZvbnRNZ3ItPkdldEZpeGVkRmFjZShwRm9udERhdGEsIHNpemUsIDApOworICAgIHJldHVybiBtX01NRmFjZXNbMV07CisgIH0KKyAgcFN1YnN0Rm9udC0+bV9GYW1pbHkgPSAiQ2hyb21lIFNhbnMiOworICBpZiAobV9NTUZhY2VzWzBdKSB7CisgICAgcmV0dXJuIG1fTU1GYWNlc1swXTsKKyAgfQorICBjb25zdCB1aW50OF90KiBwRm9udERhdGEgPSBOVUxMOworICBGWF9EV09SRCBzaXplID0gMDsKKyAgbV9wRm9udE1nci0+R2V0QnVpbHRpbkZvbnQoMTUsICZwRm9udERhdGEsICZzaXplKTsKKyAgbV9NTUZhY2VzWzBdID0gbV9wRm9udE1nci0+R2V0Rml4ZWRGYWNlKHBGb250RGF0YSwgc2l6ZSwgMCk7CisgIHJldHVybiBtX01NRmFjZXNbMF07Cit9CisKK0ZYRlRfRmFjZSBDRlhfRm9udE1hcHBlcjo6RmluZFN1YnN0Rm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUcnVlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGFsaWNfYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFdpbmRvd0NQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9TdWJzdEZvbnQqIHBTdWJzdEZvbnQpIHsKKyAgaWYgKCEoZmxhZ3MgJiBGWEZPTlRfVVNFRVhURVJOQVRUUikpIHsKKyAgICB3ZWlnaHQgPSBGWEZPTlRfRldfTk9STUFMOworICAgIGl0YWxpY19hbmdsZSA9IDA7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgU3Vic3ROYW1lID0gbmFtZTsKKyAgU3Vic3ROYW1lLlJlbW92ZSgweDIwKTsKKyAgaWYgKGJUcnVlVHlwZSkgeworICAgIGlmIChuYW1lWzBdID09ICdAJykgeworICAgICAgU3Vic3ROYW1lID0gbmFtZS5NaWQoMSk7CisgICAgfQorICB9CisgIFBERl9HZXRTdGFuZGFyZEZvbnROYW1lKCZTdWJzdE5hbWUpOworICBpZiAoU3Vic3ROYW1lID09ICJTeW1ib2wiICYmICFiVHJ1ZVR5cGUpIHsKKyAgICBwU3Vic3RGb250LT5tX0ZhbWlseSA9ICJDaHJvbWUgU3ltYm9sIjsKKyAgICBwU3Vic3RGb250LT5tX0NoYXJzZXQgPSBGWEZPTlRfU1lNQk9MX0NIQVJTRVQ7CisgICAgcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzIHw9IEZYRk9OVF9TVUJTVF9TVEFOREFSRDsKKyAgICBpZiAobV9Gb3hpdEZhY2VzWzEyXSkgeworICAgICAgcmV0dXJuIG1fRm94aXRGYWNlc1sxMl07CisgICAgfQorICAgIGNvbnN0IHVpbnQ4X3QqIHBGb250RGF0YSA9IE5VTEw7CisgICAgRlhfRFdPUkQgc2l6ZSA9IDA7CisgICAgbV9wRm9udE1nci0+R2V0QnVpbHRpbkZvbnQoMTIsICZwRm9udERhdGEsICZzaXplKTsKKyAgICBtX0ZveGl0RmFjZXNbMTJdID0gbV9wRm9udE1nci0+R2V0Rml4ZWRGYWNlKHBGb250RGF0YSwgc2l6ZSwgMCk7CisgICAgcmV0dXJuIG1fRm94aXRGYWNlc1sxMl07CisgIH0KKyAgaWYgKFN1YnN0TmFtZSA9PSAiWmFwZkRpbmdiYXRzIikgeworICAgIHBTdWJzdEZvbnQtPm1fRmFtaWx5ID0gIkNocm9tZSBEaW5nYmF0cyI7CisgICAgcFN1YnN0Rm9udC0+bV9DaGFyc2V0ID0gRlhGT05UX1NZTUJPTF9DSEFSU0VUOworICAgIHBTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyB8PSBGWEZPTlRfU1VCU1RfU1RBTkRBUkQ7CisgICAgaWYgKG1fRm94aXRGYWNlc1sxM10pIHsKKyAgICAgIHJldHVybiBtX0ZveGl0RmFjZXNbMTNdOworICAgIH0KKyAgICBjb25zdCB1aW50OF90KiBwRm9udERhdGEgPSBOVUxMOworICAgIEZYX0RXT1JEIHNpemUgPSAwOworICAgIG1fcEZvbnRNZ3ItPkdldEJ1aWx0aW5Gb250KDEzLCAmcEZvbnREYXRhLCAmc2l6ZSk7CisgICAgbV9Gb3hpdEZhY2VzWzEzXSA9IG1fcEZvbnRNZ3ItPkdldEZpeGVkRmFjZShwRm9udERhdGEsIHNpemUsIDApOworICAgIHJldHVybiBtX0ZveGl0RmFjZXNbMTNdOworICB9CisgIGludCBpQmFzZUZvbnQgPSAwOworICBDRlhfQnl0ZVN0cmluZyBmYW1pbHksIHN0eWxlOworICBGWF9CT09MIGJIYXNDb21tYSA9IEZBTFNFOworICBGWF9CT09MIGJIYXNIeXBlbiA9IEZBTFNFOworICBpbnQgZmluZCA9IFN1YnN0TmFtZS5GaW5kKCIsIiwgMCk7CisgIGlmIChmaW5kID49IDApIHsKKyAgICBmYW1pbHkgPSBTdWJzdE5hbWUuTGVmdChmaW5kKTsKKyAgICBQREZfR2V0U3RhbmRhcmRGb250TmFtZSgmZmFtaWx5KTsKKyAgICBzdHlsZSA9IFN1YnN0TmFtZS5NaWQoZmluZCArIDEpOworICAgIGJIYXNDb21tYSA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgZmFtaWx5ID0gU3Vic3ROYW1lOworICB9CisgIGZvciAoOyBpQmFzZUZvbnQgPCAxMjsgaUJhc2VGb250KyspCisgICAgaWYgKGZhbWlseSA9PSBDRlhfQnl0ZVN0cmluZ0MoZ19CYXNlMTRGb250TmFtZXNbaUJhc2VGb250XSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgaW50IFBpdGNoRmFtaWx5ID0gMDsKKyAgRlhfQk9PTCBiSXRhbGljID0gRkFMU0U7CisgIEZYX0RXT1JEIG5TdHlsZSA9IDA7CisgIEZYX0JPT0wgYlN0eWxlQXZhaWwgPSBGQUxTRTsKKyAgaWYgKGlCYXNlRm9udCA8IDEyKSB7CisgICAgZmFtaWx5ID0gZ19CYXNlMTRGb250TmFtZXNbaUJhc2VGb250XTsKKyAgICBpZiAoKGlCYXNlRm9udCAlIDQpID09IDEgfHwgKGlCYXNlRm9udCAlIDQpID09IDIpIHsKKyAgICAgIG5TdHlsZSB8PSBGWF9GT05UX1NUWUxFX0JvbGQ7CisgICAgfQorICAgIGlmICgoaUJhc2VGb250ICUgNCkgLyAyKSB7CisgICAgICBuU3R5bGUgfD0gRlhfRk9OVF9TVFlMRV9JdGFsaWM7CisgICAgfQorICAgIGlmIChpQmFzZUZvbnQgPCA0KSB7CisgICAgICBQaXRjaEZhbWlseSB8PSBGWEZPTlRfRkZfRklYRURQSVRDSDsKKyAgICB9CisgICAgaWYgKGlCYXNlRm9udCA+PSA4KSB7CisgICAgICBQaXRjaEZhbWlseSB8PSBGWEZPTlRfRkZfUk9NQU47CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICghYkhhc0NvbW1hKSB7CisgICAgICBmaW5kID0gZmFtaWx5LlJldmVyc2VGaW5kKCctJyk7CisgICAgICBpZiAoZmluZCA+PSAwKSB7CisgICAgICAgIHN0eWxlID0gZmFtaWx5Lk1pZChmaW5kICsgMSk7CisgICAgICAgIGZhbWlseSA9IGZhbWlseS5MZWZ0KGZpbmQpOworICAgICAgICBiSGFzSHlwZW4gPSBUUlVFOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWJIYXNIeXBlbikgeworICAgICAgaW50IG5MZW4gPSBmYW1pbHkuR2V0TGVuZ3RoKCk7CisgICAgICBpbnQzMl90IG5SZXQgPSBHZXRTdHlsZVR5cGUoZmFtaWx5LCBUUlVFKTsKKyAgICAgIGlmIChuUmV0ID4gLTEpIHsKKyAgICAgICAgZmFtaWx5ID0gZmFtaWx5LkxlZnQobkxlbiAtIGdfRm9udFN0eWxlc1tuUmV0XS5sZW4pOworICAgICAgICBpZiAoblJldCA9PSAwKSB7CisgICAgICAgICAgblN0eWxlIHw9IEZYX0ZPTlRfU1RZTEVfQm9sZDsKICAgICAgICAgfQotICAgICAgICBGWF9EV09SRCBmYWNlX2J5dGVzID0gbkZhY2VzICogNDsKLSAgICAgICAgRlhfTFBCWVRFIG9mZnNldHMgPSBGWF9BbGxvYyhGWF9CWVRFLCBmYWNlX2J5dGVzKTsKLSAgICAgICAgcmVhZENudCA9IEZYU1lTX2ZyZWFkKG9mZnNldHMsIGZhY2VfYnl0ZXMsIDEsIHBGaWxlKTsKLSAgICAgICAgaWYgKHJlYWRDbnQgIT0gZmFjZV9ieXRlcykgewotICAgICAgICAgICAgRlhfRnJlZShvZmZzZXRzKTsKLSAgICAgICAgICAgIEZYU1lTX2ZjbG9zZShwRmlsZSk7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChuUmV0ID09IDEpIHsKKyAgICAgICAgICBuU3R5bGUgfD0gRlhfRk9OVF9TVFlMRV9JdGFsaWM7CiAgICAgICAgIH0KLSAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG5GYWNlczsgaSArKykgewotICAgICAgICAgICAgRlhfTFBCWVRFIHAgPSBvZmZzZXRzICsgaSAqIDQ7Ci0gICAgICAgICAgICBSZXBvcnRGYWNlKHBhdGgsIHBGaWxlLCBmaWxlc2l6ZSwgR0VUX1RUX0xPTkcocCkpOworICAgICAgICBpZiAoblJldCA9PSAyKSB7CisgICAgICAgICAgblN0eWxlIHw9IChGWF9GT05UX1NUWUxFX0JvbGQgfCBGWF9GT05UX1NUWUxFX0l0YWxpYyk7CiAgICAgICAgIH0KLSAgICAgICAgRlhfRnJlZShvZmZzZXRzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGZsYWdzICYgRlhGT05UX1NFUklGKSB7CisgICAgICBQaXRjaEZhbWlseSB8PSBGWEZPTlRfRkZfUk9NQU47CisgICAgfQorICAgIGlmIChmbGFncyAmIEZYRk9OVF9TQ1JJUFQpIHsKKyAgICAgIFBpdGNoRmFtaWx5IHw9IEZYRk9OVF9GRl9TQ1JJUFQ7CisgICAgfQorICAgIGlmIChmbGFncyAmIEZYRk9OVF9GSVhFRF9QSVRDSCkgeworICAgICAgUGl0Y2hGYW1pbHkgfD0gRlhGT05UX0ZGX0ZJWEVEUElUQ0g7CisgICAgfQorICB9CisgIGlmICghc3R5bGUuSXNFbXB0eSgpKSB7CisgICAgaW50IG5MZW4gPSBzdHlsZS5HZXRMZW5ndGgoKTsKKyAgICBjb25zdCBGWF9DSEFSKiBwU3R5bGUgPSBzdHlsZTsKKyAgICBpbnQgaSA9IDA7CisgICAgRlhfQk9PTCBiRmlyc3RJdGVtID0gVFJVRTsKKyAgICBDRlhfQnl0ZVN0cmluZyBidWY7CisgICAgd2hpbGUgKGkgPCBuTGVuKSB7CisgICAgICBidWYgPSBQYXJzZVN0eWxlKHBTdHlsZSwgbkxlbiwgaSk7CisgICAgICBpbnQzMl90IG5SZXQgPSBHZXRTdHlsZVR5cGUoYnVmLCBGQUxTRSk7CisgICAgICBpZiAoKGkgJiYgIWJTdHlsZUF2YWlsKSB8fCAoIWkgJiYgblJldCA8IDApKSB7CisgICAgICAgIGZhbWlseSA9IFN1YnN0TmFtZTsKKyAgICAgICAgaUJhc2VGb250ID0gMTI7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIGlmIChuUmV0ID49IDApIHsKKyAgICAgICAgYlN0eWxlQXZhaWwgPSBUUlVFOworICAgICAgfQorICAgICAgaWYgKG5SZXQgPT0gMCkgeworICAgICAgICBpZiAoblN0eWxlICYgRlhfRk9OVF9TVFlMRV9Cb2xkKSB7CisgICAgICAgICAgblN0eWxlIHw9IEZYX0ZPTlRfU1RZTEVfQm9sZEJvbGQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgblN0eWxlIHw9IEZYX0ZPTlRfU1RZTEVfQm9sZDsKKyAgICAgICAgfQorICAgICAgICBiRmlyc3RJdGVtID0gRkFMU0U7CisgICAgICB9CisgICAgICBpZiAoblJldCA9PSAxKSB7CisgICAgICAgIGlmIChiRmlyc3RJdGVtKSB7CisgICAgICAgICAgblN0eWxlIHw9IEZYX0ZPTlRfU1RZTEVfSXRhbGljOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZhbWlseSA9IFN1YnN0TmFtZTsKKyAgICAgICAgICBpQmFzZUZvbnQgPSAxMjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChuUmV0ID09IDIpIHsKKyAgICAgICAgblN0eWxlIHw9IEZYX0ZPTlRfU1RZTEVfSXRhbGljOworICAgICAgICBpZiAoblN0eWxlICYgRlhfRk9OVF9TVFlMRV9Cb2xkKSB7CisgICAgICAgICAgblN0eWxlIHw9IEZYX0ZPTlRfU1RZTEVfQm9sZEJvbGQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgblN0eWxlIHw9IEZYX0ZPTlRfU1RZTEVfQm9sZDsKKyAgICAgICAgfQorICAgICAgICBiRmlyc3RJdGVtID0gRkFMU0U7CisgICAgICB9CisgICAgICBpICs9IGJ1Zi5HZXRMZW5ndGgoKSArIDE7CisgICAgfQorICB9CisgIHdlaWdodCA9IHdlaWdodCA/IHdlaWdodCA6IEZYRk9OVF9GV19OT1JNQUw7CisgIGludCBvbGRfd2VpZ2h0ID0gd2VpZ2h0OworICBpZiAoblN0eWxlKSB7CisgICAgd2VpZ2h0ID0KKyAgICAgICAgblN0eWxlICYgRlhfRk9OVF9TVFlMRV9Cb2xkQm9sZAorICAgICAgICAgICAgPyA5MDAKKyAgICAgICAgICAgIDogKG5TdHlsZSAmIEZYX0ZPTlRfU1RZTEVfQm9sZCA/IEZYRk9OVF9GV19CT0xEIDogRlhGT05UX0ZXX05PUk1BTCk7CisgIH0KKyAgaWYgKG5TdHlsZSAmIEZYX0ZPTlRfU1RZTEVfSXRhbGljKSB7CisgICAgYkl0YWxpYyA9IFRSVUU7CisgIH0KKyAgRlhfQk9PTCBiQ0pLID0gRkFMU0U7CisgIGludCBpRXhhY3QgPSAwOworICBpbnQgQ2hhcnNldCA9IEZYRk9OVF9BTlNJX0NIQVJTRVQ7CisgIGlmIChXaW5kb3dDUCkgeworICAgIENoYXJzZXQgPSBHZXRDaGFyc2V0RnJvbUNvZGVQYWdlKFdpbmRvd0NQKTsKKyAgfSBlbHNlIGlmIChpQmFzZUZvbnQgPT0gMTIgJiYgKGZsYWdzICYgRlhGT05UX1NZTUJPTElDKSkgeworICAgIENoYXJzZXQgPSBGWEZPTlRfU1lNQk9MX0NIQVJTRVQ7CisgIH0KKyAgaWYgKENoYXJzZXQgPT0gRlhGT05UX1NISUZUSklTX0NIQVJTRVQgfHwgQ2hhcnNldCA9PSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQgfHwKKyAgICAgIENoYXJzZXQgPT0gRlhGT05UX0hBTkdFVUxfQ0hBUlNFVCB8fAorICAgICAgQ2hhcnNldCA9PSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVCkgeworICAgIGJDSksgPSBUUlVFOworICB9CisgIGlmICghbV9wRm9udEluZm8pIHsKKyAgICBwU3Vic3RGb250LT5tX1N1YnN0RmxhZ3MgfD0gRlhGT05UX1NVQlNUX1NUQU5EQVJEOworICAgIHJldHVybiBVc2VJbnRlcm5hbFN1YnN0KHBTdWJzdEZvbnQsIGlCYXNlRm9udCwgaXRhbGljX2FuZ2xlLCBvbGRfd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpdGNoRmFtaWx5KTsKKyAgfQorICBmYW1pbHkgPSBHZXRGb250RmFtaWx5KGZhbWlseSwgblN0eWxlKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgbWF0Y2ggPSBNYXRjaEluc3RhbGxlZEZvbnRzKFRUX05vcm1hbGl6ZU5hbWUoZmFtaWx5KSk7CisgIGlmIChtYXRjaC5Jc0VtcHR5KCkgJiYgZmFtaWx5ICE9IFN1YnN0TmFtZSAmJgorICAgICAgKCFiSGFzQ29tbWEgJiYgKCFiSGFzSHlwZW4gfHwgKGJIYXNIeXBlbiAmJiAhYlN0eWxlQXZhaWwpKSkpIHsKKyAgICBtYXRjaCA9IE1hdGNoSW5zdGFsbGVkRm9udHMoVFRfTm9ybWFsaXplTmFtZShTdWJzdE5hbWUpKTsKKyAgfQorICBpZiAobWF0Y2guSXNFbXB0eSgpICYmIGlCYXNlRm9udCA+PSAxMikgeworICAgIGlmICghYkNKSykgeworICAgICAgaWYgKCFDaGVja1N1cHBvcnRUaGlyZFBhcnRGb250KGZhbWlseSwgUGl0Y2hGYW1pbHkpKSB7CisgICAgICAgIGlmIChpdGFsaWNfYW5nbGUgIT0gMCkgeworICAgICAgICAgIGJJdGFsaWMgPSBUUlVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJJdGFsaWMgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICB3ZWlnaHQgPSBvbGRfd2VpZ2h0OworICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIFJlcG9ydEZhY2UocGF0aCwgcEZpbGUsIGZpbGVzaXplLCAwKTsKKyAgICAgIHBTdWJzdEZvbnQtPm1fYlN1YnN0T2ZDSksgPSBUUlVFOworICAgICAgaWYgKG5TdHlsZSkgeworICAgICAgICBwU3Vic3RGb250LT5tX1dlaWdodENKSyA9IHdlaWdodDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBTdWJzdEZvbnQtPm1fV2VpZ2h0Q0pLID0gRlhGT05UX0ZXX05PUk1BTDsKKyAgICAgIH0KKyAgICAgIGlmIChuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0l0YWxpYykgeworICAgICAgICBwU3Vic3RGb250LT5tX2JJdGxpY0NKSyA9IFRSVUU7CisgICAgICB9CiAgICAgfQotICAgIEZYU1lTX2ZjbG9zZShwRmlsZSk7Ci19Ci12b2lkIENGWF9Gb2xkZXJGb250SW5mbzo6UmVwb3J0RmFjZShDRlhfQnl0ZVN0cmluZyYgcGF0aCwgRlhTWVNfRklMRSogcEZpbGUsIEZYX0RXT1JEIGZpbGVzaXplLCBGWF9EV09SRCBvZmZzZXQpCi17Ci0gICAgRlhTWVNfZnNlZWsocEZpbGUsIG9mZnNldCwgRlhTWVNfU0VFS19TRVQpOwotICAgIGNoYXIgYnVmZmVyWzE2XTsKLSAgICBpZiAoIUZYU1lTX2ZyZWFkKGJ1ZmZlciwgMTIsIDEsIHBGaWxlKSkgewotICAgICAgICByZXR1cm47CisgIH0gZWxzZSB7CisgICAgaXRhbGljX2FuZ2xlID0gMDsKKyAgICB3ZWlnaHQgPQorICAgICAgICBuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0JvbGRCb2xkCisgICAgICAgICAgICA/IDkwMAorICAgICAgICAgICAgOiAoblN0eWxlICYgRlhfRk9OVF9TVFlMRV9Cb2xkID8gRlhGT05UX0ZXX0JPTEQgOiBGWEZPTlRfRldfTk9STUFMKTsKKyAgfQorICBpZiAoIW1hdGNoLklzRW1wdHkoKSB8fCBpQmFzZUZvbnQgPCAxMikgeworICAgIGlmICghbWF0Y2guSXNFbXB0eSgpKSB7CisgICAgICBmYW1pbHkgPSBtYXRjaDsKICAgICB9Ci0gICAgRlhfRFdPUkQgblRhYmxlcyA9IEdFVF9UVF9TSE9SVChidWZmZXIgKyA0KTsKLSAgICBDRlhfQnl0ZVN0cmluZyB0YWJsZXMgPSBfRlBERl9SZWFkU3RyaW5nRnJvbUZpbGUocEZpbGUsIG5UYWJsZXMgKiAxNik7Ci0gICAgaWYgKHRhYmxlcy5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBuYW1lcyA9IF9GUERGX0xvYWRUYWJsZUZyb21UVChwRmlsZSwgdGFibGVzLCBuVGFibGVzLCAweDZlNjE2ZDY1KTsKLSAgICBDRlhfQnl0ZVN0cmluZyBmYWNlbmFtZSA9IF9GUERGX0dldE5hbWVGcm9tVFQobmFtZXMsIDEpOwotICAgIENGWF9CeXRlU3RyaW5nIHN0eWxlID0gX0ZQREZfR2V0TmFtZUZyb21UVChuYW1lcywgMik7Ci0gICAgaWYgKHN0eWxlICE9ICJSZWd1bGFyIikgewotICAgICAgICBmYWNlbmFtZSArPSAiICIgKyBzdHlsZTsKLSAgICB9Ci0gICAgRlhfTFBWT0lEIHA7Ci0gICAgaWYgKG1fRm9udExpc3QuTG9va3VwKGZhY2VuYW1lLCBwKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENGb250RmFjZUluZm8qIHBJbmZvID0gbmV3IENGb250RmFjZUluZm87Ci0gICAgcEluZm8tPm1fRmlsZVBhdGggPSBwYXRoOwotICAgIHBJbmZvLT5tX0ZhY2VOYW1lID0gZmFjZW5hbWU7Ci0gICAgcEluZm8tPm1fRm9udFRhYmxlcyA9IHRhYmxlczsKLSAgICBwSW5mby0+bV9Gb250T2Zmc2V0ID0gb2Zmc2V0OwotICAgIHBJbmZvLT5tX0ZpbGVTaXplID0gZmlsZXNpemU7Ci0gICAgcEluZm8tPm1fQ2hhcnNldHMgPSAwOwotICAgIENGWF9CeXRlU3RyaW5nIG9zMiA9IF9GUERGX0xvYWRUYWJsZUZyb21UVChwRmlsZSwgdGFibGVzLCBuVGFibGVzLCAweDRmNTMyZjMyKTsKLSAgICBpZiAob3MyLkdldExlbmd0aCgpID49IDg2KSB7Ci0gICAgICAgIEZYX0xQQ0JZVEUgcCA9IChGWF9MUENCWVRFKW9zMiArIDc4OwotICAgICAgICBGWF9EV09SRCBjb2RlcGFnZXMgPSBHRVRfVFRfTE9ORyhwKTsKLSAgICAgICAgaWYgKGNvZGVwYWdlcyAmICgxIDw8IDE3KSkgewotICAgICAgICAgICAgbV9wTWFwcGVyLT5BZGRJbnN0YWxsZWRGb250KGZhY2VuYW1lLCBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVCk7Ci0gICAgICAgICAgICBwSW5mby0+bV9DaGFyc2V0cyB8PSBDSEFSU0VUX0ZMQUdfU0hJRlRKSVM7CisgICAgaWYgKGlCYXNlRm9udCA8IDEyKSB7CisgICAgICBpZiAoblN0eWxlICYmICEoaUJhc2VGb250ICUgNCkpIHsKKyAgICAgICAgaWYgKChuU3R5bGUgJiAweDMpID09IDEpIHsKKyAgICAgICAgICBpQmFzZUZvbnQgKz0gMTsKICAgICAgICAgfQotICAgICAgICBpZiAoY29kZXBhZ2VzICYgKDEgPDwgMTgpKSB7Ci0gICAgICAgICAgICBtX3BNYXBwZXItPkFkZEluc3RhbGxlZEZvbnQoZmFjZW5hbWUsIEZYRk9OVF9HQjIzMTJfQ0hBUlNFVCk7Ci0gICAgICAgICAgICBwSW5mby0+bV9DaGFyc2V0cyB8PSBDSEFSU0VUX0ZMQUdfR0I7CisgICAgICAgIGlmICgoblN0eWxlICYgMHgzKSA9PSAyKSB7CisgICAgICAgICAgaUJhc2VGb250ICs9IDM7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGNvZGVwYWdlcyAmICgxIDw8IDIwKSkgewotICAgICAgICAgICAgbV9wTWFwcGVyLT5BZGRJbnN0YWxsZWRGb250KGZhY2VuYW1lLCBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVCk7Ci0gICAgICAgICAgICBwSW5mby0+bV9DaGFyc2V0cyB8PSBDSEFSU0VUX0ZMQUdfQklHNTsKKyAgICAgICAgaWYgKChuU3R5bGUgJiAweDMpID09IDMpIHsKKyAgICAgICAgICBpQmFzZUZvbnQgKz0gMjsKICAgICAgICAgfQotICAgICAgICBpZiAoKGNvZGVwYWdlcyAmICgxIDw8IDE5KSkgfHwgKGNvZGVwYWdlcyAmICgxIDw8IDIxKSkpIHsKLSAgICAgICAgICAgIG1fcE1hcHBlci0+QWRkSW5zdGFsbGVkRm9udChmYWNlbmFtZSwgRlhGT05UX0hBTkdFVUxfQ0hBUlNFVCk7Ci0gICAgICAgICAgICBwSW5mby0+bV9DaGFyc2V0cyB8PSBDSEFSU0VUX0ZMQUdfS09SRUFOOworICAgICAgfQorICAgICAgZmFtaWx5ID0gZ19CYXNlMTRGb250TmFtZXNbaUJhc2VGb250XTsKKyAgICAgIHBTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyB8PSBGWEZPTlRfU1VCU1RfU1RBTkRBUkQ7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChmbGFncyAmIEZYRk9OVF9JVEFMSUMpIHsKKyAgICAgIGJJdGFsaWMgPSBUUlVFOworICAgIH0KKyAgfQorICBpRXhhY3QgPSAhbWF0Y2guSXNFbXB0eSgpOworICB2b2lkKiBoRm9udCA9IG1fcEZvbnRJbmZvLT5NYXBGb250KHdlaWdodCwgYkl0YWxpYywgQ2hhcnNldCwgUGl0Y2hGYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5LCBpRXhhY3QpOworICBpZiAoaUV4YWN0KSB7CisgICAgcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzIHw9IEZYRk9OVF9TVUJTVF9FWEFDVDsKKyAgfQorICBpZiAoIWhGb250KSB7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgICBpZiAoZmxhZ3MgJiBGWEZPTlRfRVhBQ1RNQVRDSCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICAgIGlmIChiQ0pLKSB7CisgICAgICBpZiAoaXRhbGljX2FuZ2xlICE9IDApIHsKKyAgICAgICAgYkl0YWxpYyA9IFRSVUU7CisgICAgICB9IGVsc2UgeworICAgICAgICBiSXRhbGljID0gRkFMU0U7CisgICAgICB9CisgICAgICB3ZWlnaHQgPSBvbGRfd2VpZ2h0OworICAgIH0KKyAgICBpZiAoIW1hdGNoLklzRW1wdHkoKSkgeworICAgICAgaEZvbnQgPSBtX3BGb250SW5mby0+R2V0Rm9udChtYXRjaCk7CisgICAgICBpZiAoIWhGb250KSB7CisgICAgICAgIHJldHVybiBVc2VJbnRlcm5hbFN1YnN0KHBTdWJzdEZvbnQsIGlCYXNlRm9udCwgaXRhbGljX2FuZ2xlLCBvbGRfd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXRjaEZhbWlseSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChDaGFyc2V0ID09IEZYRk9OVF9TWU1CT0xfQ0hBUlNFVCkgeworI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfIHx8IFwKKyAgICBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FORFJPSURfCisgICAgICAgIGlmIChTdWJzdE5hbWUgPT0gIlN5bWJvbCIpIHsKKyAgICAgICAgICBwU3Vic3RGb250LT5tX0ZhbWlseSA9ICJDaHJvbWUgU3ltYm9sIjsKKyAgICAgICAgICBwU3Vic3RGb250LT5tX1N1YnN0RmxhZ3MgfD0gRlhGT05UX1NVQlNUX1NUQU5EQVJEOworICAgICAgICAgIHBTdWJzdEZvbnQtPm1fQ2hhcnNldCA9IEZYRk9OVF9TWU1CT0xfQ0hBUlNFVDsKKyAgICAgICAgICBpZiAobV9Gb3hpdEZhY2VzWzEyXSkgeworICAgICAgICAgICAgcmV0dXJuIG1fRm94aXRGYWNlc1sxMl07CisgICAgICAgICAgfQorICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBGb250RGF0YSA9IE5VTEw7CisgICAgICAgICAgRlhfRFdPUkQgc2l6ZSA9IDA7CisgICAgICAgICAgbV9wRm9udE1nci0+R2V0QnVpbHRpbkZvbnQoMTIsICZwRm9udERhdGEsICZzaXplKTsKKyAgICAgICAgICBtX0ZveGl0RmFjZXNbMTJdID0gbV9wRm9udE1nci0+R2V0Rml4ZWRGYWNlKHBGb250RGF0YSwgc2l6ZSwgMCk7CisgICAgICAgICAgcmV0dXJuIG1fRm94aXRGYWNlc1sxMl07CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGNvZGVwYWdlcyAmICgxIDw8IDMxKSkgewotICAgICAgICAgICAgbV9wTWFwcGVyLT5BZGRJbnN0YWxsZWRGb250KGZhY2VuYW1lLCBGWEZPTlRfU1lNQk9MX0NIQVJTRVQpOwotICAgICAgICAgICAgcEluZm8tPm1fQ2hhcnNldHMgfD0gQ0hBUlNFVF9GTEFHX1NZTUJPTDsKLSAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHBTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyB8PSBGWEZPTlRfU1VCU1RfTk9OU1lNQk9MOworICAgICAgICByZXR1cm4gRmluZFN1YnN0Rm9udChmYW1pbHksIGJUcnVlVHlwZSwgZmxhZ3MgJiB+RlhGT05UX1NZTUJPTElDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQsIGl0YWxpY19hbmdsZSwgMCwgcFN1YnN0Rm9udCk7CisgICAgICB9CisgICAgICBpZiAoQ2hhcnNldCA9PSBGWEZPTlRfQU5TSV9DSEFSU0VUKSB7CisgICAgICAgIHBTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyB8PSBGWEZPTlRfU1VCU1RfU1RBTkRBUkQ7CisgICAgICAgIHJldHVybiBVc2VJbnRlcm5hbFN1YnN0KHBTdWJzdEZvbnQsIGlCYXNlRm9udCwgaXRhbGljX2FuZ2xlLCBvbGRfd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXRjaEZhbWlseSk7CisgICAgICB9CisgICAgICBpbnQgaW5kZXggPSBtX0NoYXJzZXRBcnJheS5GaW5kKENoYXJzZXQpOworICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gVXNlSW50ZXJuYWxTdWJzdChwU3Vic3RGb250LCBpQmFzZUZvbnQsIGl0YWxpY19hbmdsZSwgb2xkX3dlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGl0Y2hGYW1pbHkpOworICAgICAgfQorICAgICAgaEZvbnQgPSBtX3BGb250SW5mby0+R2V0Rm9udChtX0ZhY2VBcnJheVtpbmRleF0pOwogICAgIH0KLSAgICBtX3BNYXBwZXItPkFkZEluc3RhbGxlZEZvbnQoZmFjZW5hbWUsIEZYRk9OVF9BTlNJX0NIQVJTRVQpOwotICAgIHBJbmZvLT5tX0NoYXJzZXRzIHw9IENIQVJTRVRfRkxBR19BTlNJOwotICAgIHBJbmZvLT5tX1N0eWxlcyA9IDA7Ci0gICAgaWYgKHN0eWxlLkZpbmQoRlhfQlNUUkMoIkJvbGQiKSkgPiAtMSkgewotICAgICAgICBwSW5mby0+bV9TdHlsZXMgfD0gRlhGT05UX0JPTEQ7CisgIH0KKyAgcFN1YnN0Rm9udC0+bV9FeHRIYW5kbGUgPSBtX3BGb250SW5mby0+UmV0YWluRm9udChoRm9udCk7CisgIGlmICghaEZvbnQpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgbV9wRm9udEluZm8tPkdldEZhY2VOYW1lKGhGb250LCBTdWJzdE5hbWUpOworICBpZiAoQ2hhcnNldCA9PSBGWEZPTlRfREVGQVVMVF9DSEFSU0VUKSB7CisgICAgbV9wRm9udEluZm8tPkdldEZvbnRDaGFyc2V0KGhGb250LCBDaGFyc2V0KTsKKyAgfQorICBGWF9EV09SRCB0dGNfc2l6ZSA9IG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwga1RhYmxlVFRDRiwgbnVsbHB0ciwgMCk7CisgIEZYX0RXT1JEIGZvbnRfc2l6ZSA9IG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwgMCwgbnVsbHB0ciwgMCk7CisgIGlmIChmb250X3NpemUgPT0gMCAmJiB0dGNfc2l6ZSA9PSAwKSB7CisgICAgbV9wRm9udEluZm8tPkRlbGV0ZUZvbnQoaEZvbnQpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIEZYRlRfRmFjZSBmYWNlID0gbnVsbHB0cjsKKyAgaWYgKHR0Y19zaXplKSB7CisgICAgdWludDhfdCB0ZW1wWzEwMjRdOworICAgIG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwga1RhYmxlVFRDRiwgdGVtcCwgMTAyNCk7CisgICAgRlhfRFdPUkQgY2hlY2tzdW0gPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgIGNoZWNrc3VtICs9ICgoRlhfRFdPUkQqKXRlbXApW2ldOwogICAgIH0KLSAgICBpZiAoc3R5bGUuRmluZChGWF9CU1RSQygiSXRhbGljIikpID4gLTEgfHwgc3R5bGUuRmluZChGWF9CU1RSQygiT2JsaXF1ZSIpKSA+IC0xKSB7Ci0gICAgICAgIHBJbmZvLT5tX1N0eWxlcyB8PSBGWEZPTlRfSVRBTElDOworICAgIHVpbnQ4X3QqIHBGb250RGF0YTsKKyAgICBmYWNlID0gbV9wRm9udE1nci0+R2V0Q2FjaGVkVFRDRmFjZSh0dGNfc2l6ZSwgY2hlY2tzdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRjX3NpemUgLSBmb250X3NpemUsIHBGb250RGF0YSk7CisgICAgaWYgKCFmYWNlKSB7CisgICAgICBwRm9udERhdGEgPSBGWF9BbGxvYyh1aW50OF90LCB0dGNfc2l6ZSk7CisgICAgICBtX3BGb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIGtUYWJsZVRUQ0YsIHBGb250RGF0YSwgdHRjX3NpemUpOworICAgICAgZmFjZSA9IG1fcEZvbnRNZ3ItPkFkZENhY2hlZFRUQ0ZhY2UodHRjX3NpemUsIGNoZWNrc3VtLCBwRm9udERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGNfc2l6ZSwgdHRjX3NpemUgLSBmb250X3NpemUpOwogICAgIH0KLSAgICBpZiAoZmFjZW5hbWUuRmluZChGWF9CU1RSQygiU2VyaWYiKSkgPiAtMSkgewotICAgICAgICBwSW5mby0+bV9TdHlsZXMgfD0gRlhGT05UX1NFUklGOworICB9IGVsc2UgeworICAgIHVpbnQ4X3QqIHBGb250RGF0YTsKKyAgICBmYWNlID0gbV9wRm9udE1nci0+R2V0Q2FjaGVkRmFjZShTdWJzdE5hbWUsIHdlaWdodCwgYkl0YWxpYywgcEZvbnREYXRhKTsKKyAgICBpZiAoIWZhY2UpIHsKKyAgICAgIHBGb250RGF0YSA9IEZYX0FsbG9jKHVpbnQ4X3QsIGZvbnRfc2l6ZSk7CisgICAgICBtX3BGb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIDAsIHBGb250RGF0YSwgZm9udF9zaXplKTsKKyAgICAgIGZhY2UgPSBtX3BGb250TWdyLT5BZGRDYWNoZWRGYWNlKFN1YnN0TmFtZSwgd2VpZ2h0LCBiSXRhbGljLCBwRm9udERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGb250SW5mby0+R2V0RmFjZUluZGV4KGhGb250KSk7CiAgICAgfQotICAgIG1fRm9udExpc3QuU2V0QXQoZmFjZW5hbWUsIHBJbmZvKTsKLX0KLXZvaWQqIENGWF9Gb2xkZXJGb250SW5mbzo6TWFwRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBGWF9MUENTVFIgZmFtaWx5LCBGWF9CT09MJiBiRXhhY3QpCi17CisgIH0KKyAgaWYgKCFmYWNlKSB7CisgICAgbV9wRm9udEluZm8tPkRlbGV0ZUZvbnQoaEZvbnQpOwogICAgIHJldHVybiBOVUxMOwotfQotdm9pZCogQ0ZYX0ZvbGRlckZvbnRJbmZvOjpHZXRGb250KEZYX0xQQ1NUUiBmYWNlKQotewotICAgIEZYX0xQVk9JRCBwOwotICAgIGlmICghbV9Gb250TGlzdC5Mb29rdXAoZmFjZSwgcCkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBwOwotfQotRlhfRFdPUkQgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpHZXRGb250RGF0YSh2b2lkKiBoRm9udCwgRlhfRFdPUkQgdGFibGUsIEZYX0xQQllURSBidWZmZXIsIEZYX0RXT1JEIHNpemUpCi17Ci0gICAgaWYgKGhGb250ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENGb250RmFjZUluZm8qIHBGb250ID0gKENGb250RmFjZUluZm8qKWhGb250OwotICAgIEZYU1lTX0ZJTEUqIHBGaWxlID0gTlVMTDsKLSAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgcEZpbGUgPSBGWFNZU19mb3BlbihwRm9udC0+bV9GaWxlUGF0aCwgInJiIik7Ci0gICAgICAgIGlmIChwRmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICBGWF9EV09SRCBkYXRhc2l6ZSA9IDA7Ci0gICAgRlhfRFdPUkQgb2Zmc2V0OwotICAgIGlmICh0YWJsZSA9PSAwKQl7Ci0gICAgICAgIGRhdGFzaXplID0gcEZvbnQtPm1fRm9udE9mZnNldCA/IDAgOiBwRm9udC0+bV9GaWxlU2l6ZTsKLSAgICAgICAgb2Zmc2V0ID0gMDsKLSAgICB9IGVsc2UgaWYgKHRhYmxlID09IDB4NzQ3NDYzNjYpCXsKLSAgICAgICAgZGF0YXNpemUgPSBwRm9udC0+bV9Gb250T2Zmc2V0ID8gcEZvbnQtPm1fRmlsZVNpemUgOiAwOwotICAgICAgICBvZmZzZXQgPSAwOworICB9CisgIHBTdWJzdEZvbnQtPm1fRmFtaWx5ID0gU3Vic3ROYW1lOworICBwU3Vic3RGb250LT5tX0NoYXJzZXQgPSBDaGFyc2V0OworICBGWF9CT09MIGJOZWVkVXBkYXRlV2VpZ2h0ID0gRkFMU0U7CisgIGlmIChGWEZUX0lzX0ZhY2VfQm9sZChmYWNlKSkgeworICAgIGlmICh3ZWlnaHQgPT0gRlhGT05UX0ZXX0JPTEQpIHsKKyAgICAgIGJOZWVkVXBkYXRlV2VpZ2h0ID0gRkFMU0U7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgRlhfRFdPUkQgblRhYmxlcyA9IHBGb250LT5tX0ZvbnRUYWJsZXMuR2V0TGVuZ3RoKCkgLyAxNjsKLSAgICAgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG5UYWJsZXM7IGkgKyspIHsKLSAgICAgICAgICAgIEZYX0xQQ0JZVEUgcCA9IChGWF9MUENCWVRFKXBGb250LT5tX0ZvbnRUYWJsZXMgKyBpICogMTY7Ci0gICAgICAgICAgICBpZiAoR0VUX1RUX0xPTkcocCkgPT0gdGFibGUpIHsKLSAgICAgICAgICAgICAgICBvZmZzZXQgPSBHRVRfVFRfTE9ORyhwICsgOCk7Ci0gICAgICAgICAgICAgICAgZGF0YXNpemUgPSBHRVRfVFRfTE9ORyhwICsgMTIpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICBiTmVlZFVwZGF0ZVdlaWdodCA9IFRSVUU7CiAgICAgfQotICAgIGlmIChkYXRhc2l6ZSAmJiBzaXplID49IGRhdGFzaXplICYmIHBGaWxlKSB7Ci0gICAgICAgIEZYU1lTX2ZzZWVrKHBGaWxlLCBvZmZzZXQsIEZYU1lTX1NFRUtfU0VUKTsKLSAgICAgICAgRlhTWVNfZnJlYWQoYnVmZmVyLCBkYXRhc2l6ZSwgMSwgcEZpbGUpOworICB9IGVsc2UgeworICAgIGlmICh3ZWlnaHQgPT0gRlhGT05UX0ZXX05PUk1BTCkgeworICAgICAgYk5lZWRVcGRhdGVXZWlnaHQgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgYk5lZWRVcGRhdGVXZWlnaHQgPSBUUlVFOwogICAgIH0KLSAgICBpZiAocEZpbGUpIHsKLSAgICAgICAgRlhTWVNfZmNsb3NlKHBGaWxlKTsKKyAgfQorICBpZiAoYk5lZWRVcGRhdGVXZWlnaHQpIHsKKyAgICBwU3Vic3RGb250LT5tX1dlaWdodCA9IHdlaWdodDsKKyAgfQorICBpZiAoYkl0YWxpYyAmJiAhRlhGVF9Jc19GYWNlX0l0YWxpYyhmYWNlKSkgeworICAgIGlmIChpdGFsaWNfYW5nbGUgPT0gMCkgeworICAgICAgaXRhbGljX2FuZ2xlID0gLTEyOworICAgIH0gZWxzZSBpZiAoRlhTWVNfYWJzKGl0YWxpY19hbmdsZSkgPCA1KSB7CisgICAgICBpdGFsaWNfYW5nbGUgPSAwOwogICAgIH0KKyAgICBwU3Vic3RGb250LT5tX0l0YWxpY0FuZ2xlID0gaXRhbGljX2FuZ2xlOworICB9CisgIG1fcEZvbnRJbmZvLT5EZWxldGVGb250KGhGb250KTsKKyAgcmV0dXJuIGZhY2U7Cit9CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK0ZYRlRfRmFjZSBDRlhfRm9udE1hcHBlcjo6RmluZFN1YnN0Rm9udEJ5VW5pY29kZShGWF9EV09SRCBkd1VuaWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRhbGljX2FuZ2xlKSB7CisgIGlmIChtX3BGb250SW5mbyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgRlhfQk9PTCBiSXRhbGljID0gKGZsYWdzICYgRlhGT05UX0lUQUxJQykgIT0gMDsKKyAgaW50IFBpdGNoRmFtaWx5ID0gMDsKKyAgaWYgKGZsYWdzICYgRlhGT05UX1NFUklGKSB7CisgICAgUGl0Y2hGYW1pbHkgfD0gRlhGT05UX0ZGX1JPTUFOOworICB9CisgIGlmIChmbGFncyAmIEZYRk9OVF9TQ1JJUFQpIHsKKyAgICBQaXRjaEZhbWlseSB8PSBGWEZPTlRfRkZfU0NSSVBUOworICB9CisgIGlmIChmbGFncyAmIEZYRk9OVF9GSVhFRF9QSVRDSCkgeworICAgIFBpdGNoRmFtaWx5IHw9IEZYRk9OVF9GRl9GSVhFRFBJVENIOworICB9CisgIHZvaWQqIGhGb250ID0KKyAgICAgIG1fcEZvbnRJbmZvLT5NYXBGb250QnlVbmljb2RlKGR3VW5pY29kZSwgd2VpZ2h0LCBiSXRhbGljLCBQaXRjaEZhbWlseSk7CisgIGlmIChoRm9udCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgRlhfRFdPUkQgdHRjX3NpemUgPSBtX3BGb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIDB4NzQ3NDYzNjYsIE5VTEwsIDApOworICBGWF9EV09SRCBmb250X3NpemUgPSBtX3BGb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIDAsIE5VTEwsIDApOworICBpZiAoZm9udF9zaXplID09IDAgJiYgdHRjX3NpemUgPT0gMCkgeworICAgIG1fcEZvbnRJbmZvLT5EZWxldGVGb250KGhGb250KTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBGWEZUX0ZhY2UgZmFjZSA9IE5VTEw7CisgIGlmICh0dGNfc2l6ZSkgeworICAgIHVpbnQ4X3QgdGVtcFsxMDI0XTsKKyAgICBtX3BGb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIDB4NzQ3NDYzNjYsIHRlbXAsIDEwMjQpOworICAgIEZYX0RXT1JEIGNoZWNrc3VtID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICBjaGVja3N1bSArPSAoKEZYX0RXT1JEKil0ZW1wKVtpXTsKKyAgICB9CisgICAgdWludDhfdCogcEZvbnREYXRhOworICAgIGZhY2UgPSBtX3BGb250TWdyLT5HZXRDYWNoZWRUVENGYWNlKHR0Y19zaXplLCBjaGVja3N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGNfc2l6ZSAtIGZvbnRfc2l6ZSwgcEZvbnREYXRhKTsKKyAgICBpZiAoZmFjZSA9PSBOVUxMKSB7CisgICAgICBwRm9udERhdGEgPSBGWF9BbGxvYyh1aW50OF90LCB0dGNfc2l6ZSk7CisgICAgICBpZiAocEZvbnREYXRhKSB7CisgICAgICAgIG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwgMHg3NDc0NjM2NiwgcEZvbnREYXRhLCB0dGNfc2l6ZSk7CisgICAgICAgIGZhY2UgPSBtX3BGb250TWdyLT5BZGRDYWNoZWRUVENGYWNlKHR0Y19zaXplLCBjaGVja3N1bSwgcEZvbnREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGNfc2l6ZSwgdHRjX3NpemUgLSBmb250X3NpemUpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBTdWJzdE5hbWU7CisgICAgbV9wRm9udEluZm8tPkdldEZhY2VOYW1lKGhGb250LCBTdWJzdE5hbWUpOworICAgIHVpbnQ4X3QqIHBGb250RGF0YTsKKyAgICBmYWNlID0gbV9wRm9udE1nci0+R2V0Q2FjaGVkRmFjZShTdWJzdE5hbWUsIHdlaWdodCwgYkl0YWxpYywgcEZvbnREYXRhKTsKKyAgICBpZiAoZmFjZSA9PSBOVUxMKSB7CisgICAgICBwRm9udERhdGEgPSBGWF9BbGxvYyh1aW50OF90LCBmb250X3NpemUpOworICAgICAgaWYgKCFwRm9udERhdGEpIHsKKyAgICAgICAgbV9wRm9udEluZm8tPkRlbGV0ZUZvbnQoaEZvbnQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwgMCwgcEZvbnREYXRhLCBmb250X3NpemUpOworICAgICAgZmFjZSA9IG1fcEZvbnRNZ3ItPkFkZENhY2hlZEZhY2UoU3Vic3ROYW1lLCB3ZWlnaHQsIGJJdGFsaWMsIHBGb250RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZvbnRJbmZvLT5HZXRGYWNlSW5kZXgoaEZvbnQpKTsKKyAgICB9CisgIH0KKyAgbV9wRm9udEluZm8tPkRlbGV0ZUZvbnQoaEZvbnQpOworICByZXR1cm4gZmFjZTsKK30KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworRlhfQk9PTCBDRlhfRm9udE1hcHBlcjo6SXNCdWlsdGluRmFjZShjb25zdCBGWEZUX0ZhY2UgZmFjZSkgY29uc3QgeworICBmb3IgKGludCBpID0gMDsgaSA8IE1NX0ZBQ0VfQ09VTlQ7ICsraSkgeworICAgIGlmIChtX01NRmFjZXNbaV0gPT0gZmFjZSkgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgRk9YSVRfRkFDRV9DT1VOVDsgKytpKSB7CisgICAgaWYgKG1fRm94aXRGYWNlc1tpXSA9PSBmYWNlKSB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCitleHRlcm4gIkMiIHsKK3Vuc2lnbmVkIGxvbmcgX0ZUU3RyZWFtUmVhZChGWEZUX1N0cmVhbSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQpOwordm9pZCBfRlRTdHJlYW1DbG9zZShGWEZUX1N0cmVhbSBzdHJlYW0pOworfTsKKyNpZiBfRlhfT1NfID09IF9GWF9BTkRST0lEXworSUZYX1N5c3RlbUZvbnRJbmZvKiBJRlhfU3lzdGVtRm9udEluZm86OkNyZWF0ZURlZmF1bHQoY29uc3QgY2hhcioqIHBVbnVzZWQpIHsKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKK0NGWF9Gb2xkZXJGb250SW5mbzo6Q0ZYX0ZvbGRlckZvbnRJbmZvKCkge30KK0NGWF9Gb2xkZXJGb250SW5mbzo6fkNGWF9Gb2xkZXJGb250SW5mbygpIHsKKyAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbV9Gb250TGlzdCkgeworICAgIGRlbGV0ZSBwYWlyLnNlY29uZDsKKyAgfQorfQordm9pZCBDRlhfRm9sZGVyRm9udEluZm86OkFkZFBhdGgoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBwYXRoKSB7CisgIG1fUGF0aExpc3QuQWRkKHBhdGgpOworfQordm9pZCBDRlhfRm9sZGVyRm9udEluZm86OlJlbGVhc2UoKSB7CisgIGRlbGV0ZSB0aGlzOworfQorRlhfQk9PTCBDRlhfRm9sZGVyRm9udEluZm86OkVudW1Gb250TGlzdChDRlhfRm9udE1hcHBlciogcE1hcHBlcikgeworICBtX3BNYXBwZXIgPSBwTWFwcGVyOworICBmb3IgKGludCBpID0gMDsgaSA8IG1fUGF0aExpc3QuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICBTY2FuUGF0aChtX1BhdGhMaXN0W2ldKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KK3ZvaWQgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpTY2FuUGF0aChDRlhfQnl0ZVN0cmluZyYgcGF0aCkgeworICB2b2lkKiBoYW5kbGUgPSBGWF9PcGVuRm9sZGVyKHBhdGgpOworICBpZiAoIWhhbmRsZSkgeworICAgIHJldHVybjsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBmaWxlbmFtZTsKKyAgRlhfQk9PTCBiRm9sZGVyOworICB3aGlsZSAoRlhfR2V0TmV4dEZpbGUoaGFuZGxlLCBmaWxlbmFtZSwgYkZvbGRlcikpIHsKKyAgICBpZiAoYkZvbGRlcikgeworICAgICAgaWYgKGZpbGVuYW1lID09ICIuIiB8fCBmaWxlbmFtZSA9PSAiLi4iKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBDRlhfQnl0ZVN0cmluZyBleHQgPSBmaWxlbmFtZS5SaWdodCg0KTsKKyAgICAgIGV4dC5NYWtlVXBwZXIoKTsKKyAgICAgIGlmIChleHQgIT0gIi5UVEYiICYmIGV4dCAhPSAiLk9URiIgJiYgZXh0ICE9ICIuVFRDIikgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisgICAgQ0ZYX0J5dGVTdHJpbmcgZnVsbHBhdGggPSBwYXRoOworI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyAgICBmdWxscGF0aCArPSAiXFwiOworI2Vsc2UKKyAgICBmdWxscGF0aCArPSAiLyI7CisjZW5kaWYKKyAgICBmdWxscGF0aCArPSBmaWxlbmFtZTsKKyAgICBpZiAoYkZvbGRlcikgeworICAgICAgU2NhblBhdGgoZnVsbHBhdGgpOworICAgIH0gZWxzZSB7CisgICAgICBTY2FuRmlsZShmdWxscGF0aCk7CisgICAgfQorICB9CisgIEZYX0Nsb3NlRm9sZGVyKGhhbmRsZSk7Cit9Cit2b2lkIENGWF9Gb2xkZXJGb250SW5mbzo6U2NhbkZpbGUoQ0ZYX0J5dGVTdHJpbmcmIHBhdGgpIHsKKyAgRlhTWVNfRklMRSogcEZpbGUgPSBGWFNZU19mb3BlbihwYXRoLCAicmIiKTsKKyAgaWYgKCFwRmlsZSkgeworICAgIHJldHVybjsKKyAgfQorICBGWFNZU19mc2VlayhwRmlsZSwgMCwgRlhTWVNfU0VFS19FTkQpOworICBGWF9EV09SRCBmaWxlc2l6ZSA9IEZYU1lTX2Z0ZWxsKHBGaWxlKTsKKyAgdWludDhfdCBidWZmZXJbMTZdOworICBGWFNZU19mc2VlayhwRmlsZSwgMCwgRlhTWVNfU0VFS19TRVQpOworICBzaXplX3QgcmVhZENudCA9IEZYU1lTX2ZyZWFkKGJ1ZmZlciwgMTIsIDEsIHBGaWxlKTsKKyAgaWYgKHJlYWRDbnQgIT0gMSkgeworICAgIEZYU1lTX2ZjbG9zZShwRmlsZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKEdFVF9UVF9MT05HKGJ1ZmZlcikgPT0ga1RhYmxlVFRDRikgeworICAgIEZYX0RXT1JEIG5GYWNlcyA9IEdFVF9UVF9MT05HKGJ1ZmZlciArIDgpOworICAgIGlmIChuRmFjZXMgPiBzdGQ6Om51bWVyaWNfbGltaXRzPEZYX0RXT1JEPjo6bWF4KCkgLyA0KSB7CisgICAgICBGWFNZU19mY2xvc2UocEZpbGUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBGWF9EV09SRCBmYWNlX2J5dGVzID0gbkZhY2VzICogNDsKKyAgICB1aW50OF90KiBvZmZzZXRzID0gRlhfQWxsb2ModWludDhfdCwgZmFjZV9ieXRlcyk7CisgICAgcmVhZENudCA9IEZYU1lTX2ZyZWFkKG9mZnNldHMsIDEsIGZhY2VfYnl0ZXMsIHBGaWxlKTsKKyAgICBpZiAocmVhZENudCAhPSBmYWNlX2J5dGVzKSB7CisgICAgICBGWF9GcmVlKG9mZnNldHMpOworICAgICAgRlhTWVNfZmNsb3NlKHBGaWxlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG5GYWNlczsgaSsrKSB7CisgICAgICB1aW50OF90KiBwID0gb2Zmc2V0cyArIGkgKiA0OworICAgICAgUmVwb3J0RmFjZShwYXRoLCBwRmlsZSwgZmlsZXNpemUsIEdFVF9UVF9MT05HKHApKTsKKyAgICB9CisgICAgRlhfRnJlZShvZmZzZXRzKTsKKyAgfSBlbHNlIHsKKyAgICBSZXBvcnRGYWNlKHBhdGgsIHBGaWxlLCBmaWxlc2l6ZSwgMCk7CisgIH0KKyAgRlhTWVNfZmNsb3NlKHBGaWxlKTsKK30KK3ZvaWQgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpSZXBvcnRGYWNlKENGWF9CeXRlU3RyaW5nJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfRklMRSogcEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxlc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG9mZnNldCkgeworICBGWFNZU19mc2VlayhwRmlsZSwgb2Zmc2V0LCBGWFNZU19TRUVLX1NFVCk7CisgIGNoYXIgYnVmZmVyWzE2XTsKKyAgaWYgKCFGWFNZU19mcmVhZChidWZmZXIsIDEyLCAxLCBwRmlsZSkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfRFdPUkQgblRhYmxlcyA9IEdFVF9UVF9TSE9SVChidWZmZXIgKyA0KTsKKyAgQ0ZYX0J5dGVTdHJpbmcgdGFibGVzID0gRlBERl9SZWFkU3RyaW5nRnJvbUZpbGUocEZpbGUsIG5UYWJsZXMgKiAxNik7CisgIGlmICh0YWJsZXMuSXNFbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisgIENGWF9CeXRlU3RyaW5nIG5hbWVzID0KKyAgICAgIEZQREZfTG9hZFRhYmxlRnJvbVRUKHBGaWxlLCB0YWJsZXMsIG5UYWJsZXMsIDB4NmU2MTZkNjUpOworICBDRlhfQnl0ZVN0cmluZyBmYWNlbmFtZSA9IEdldE5hbWVGcm9tVFQobmFtZXMsIDEpOworICBDRlhfQnl0ZVN0cmluZyBzdHlsZSA9IEdldE5hbWVGcm9tVFQobmFtZXMsIDIpOworICBpZiAoc3R5bGUgIT0gIlJlZ3VsYXIiKSB7CisgICAgZmFjZW5hbWUgKz0gIiAiICsgc3R5bGU7CisgIH0KKyAgaWYgKHBkZml1bTo6Q29udGFpbnNLZXkobV9Gb250TGlzdCwgZmFjZW5hbWUpKQorICAgIHJldHVybjsKKworICBDRlhfRm9udEZhY2VJbmZvKiBwSW5mbyA9CisgICAgICBuZXcgQ0ZYX0ZvbnRGYWNlSW5mbyhwYXRoLCBmYWNlbmFtZSwgdGFibGVzLCBvZmZzZXQsIGZpbGVzaXplKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgb3MyID0gRlBERl9Mb2FkVGFibGVGcm9tVFQocEZpbGUsIHRhYmxlcywgblRhYmxlcywgMHg0ZjUzMmYzMik7CisgIGlmIChvczIuR2V0TGVuZ3RoKCkgPj0gODYpIHsKKyAgICBjb25zdCB1aW50OF90KiBwID0gKGNvbnN0IHVpbnQ4X3QqKW9zMiArIDc4OworICAgIEZYX0RXT1JEIGNvZGVwYWdlcyA9IEdFVF9UVF9MT05HKHApOworICAgIGlmIChjb2RlcGFnZXMgJiAoMSA8PCAxNykpIHsKKyAgICAgIG1fcE1hcHBlci0+QWRkSW5zdGFsbGVkRm9udChmYWNlbmFtZSwgRlhGT05UX1NISUZUSklTX0NIQVJTRVQpOworICAgICAgcEluZm8tPm1fQ2hhcnNldHMgfD0gQ0hBUlNFVF9GTEFHX1NISUZUSklTOworICAgIH0KKyAgICBpZiAoY29kZXBhZ2VzICYgKDEgPDwgMTgpKSB7CisgICAgICBtX3BNYXBwZXItPkFkZEluc3RhbGxlZEZvbnQoZmFjZW5hbWUsIEZYRk9OVF9HQjIzMTJfQ0hBUlNFVCk7CisgICAgICBwSW5mby0+bV9DaGFyc2V0cyB8PSBDSEFSU0VUX0ZMQUdfR0I7CisgICAgfQorICAgIGlmIChjb2RlcGFnZXMgJiAoMSA8PCAyMCkpIHsKKyAgICAgIG1fcE1hcHBlci0+QWRkSW5zdGFsbGVkRm9udChmYWNlbmFtZSwgRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQpOworICAgICAgcEluZm8tPm1fQ2hhcnNldHMgfD0gQ0hBUlNFVF9GTEFHX0JJRzU7CisgICAgfQorICAgIGlmICgoY29kZXBhZ2VzICYgKDEgPDwgMTkpKSB8fCAoY29kZXBhZ2VzICYgKDEgPDwgMjEpKSkgeworICAgICAgbV9wTWFwcGVyLT5BZGRJbnN0YWxsZWRGb250KGZhY2VuYW1lLCBGWEZPTlRfSEFOR0VVTF9DSEFSU0VUKTsKKyAgICAgIHBJbmZvLT5tX0NoYXJzZXRzIHw9IENIQVJTRVRfRkxBR19LT1JFQU47CisgICAgfQorICAgIGlmIChjb2RlcGFnZXMgJiAoMSA8PCAzMSkpIHsKKyAgICAgIG1fcE1hcHBlci0+QWRkSW5zdGFsbGVkRm9udChmYWNlbmFtZSwgRlhGT05UX1NZTUJPTF9DSEFSU0VUKTsKKyAgICAgIHBJbmZvLT5tX0NoYXJzZXRzIHw9IENIQVJTRVRfRkxBR19TWU1CT0w7CisgICAgfQorICB9CisgIG1fcE1hcHBlci0+QWRkSW5zdGFsbGVkRm9udChmYWNlbmFtZSwgRlhGT05UX0FOU0lfQ0hBUlNFVCk7CisgIHBJbmZvLT5tX0NoYXJzZXRzIHw9IENIQVJTRVRfRkxBR19BTlNJOworICBwSW5mby0+bV9TdHlsZXMgPSAwOworICBpZiAoc3R5bGUuRmluZCgiQm9sZCIpID4gLTEpIHsKKyAgICBwSW5mby0+bV9TdHlsZXMgfD0gRlhGT05UX0JPTEQ7CisgIH0KKyAgaWYgKHN0eWxlLkZpbmQoIkl0YWxpYyIpID4gLTEgfHwgc3R5bGUuRmluZCgiT2JsaXF1ZSIpID4gLTEpIHsKKyAgICBwSW5mby0+bV9TdHlsZXMgfD0gRlhGT05UX0lUQUxJQzsKKyAgfQorICBpZiAoZmFjZW5hbWUuRmluZCgiU2VyaWYiKSA+IC0xKSB7CisgICAgcEluZm8tPm1fU3R5bGVzIHw9IEZYRk9OVF9TRVJJRjsKKyAgfQorICBtX0ZvbnRMaXN0W2ZhY2VuYW1lXSA9IHBJbmZvOworfQorCit2b2lkKiBDRlhfRm9sZGVyRm9udEluZm86OkdldFN1YnN0Rm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZSkgeworICBmb3IgKHNpemVfdCBpQmFzZUZvbnQgPSAwOyBpQmFzZUZvbnQgPCBGWF9BcnJheVNpemUoQmFzZTE0U3Vic3RzKTsKKyAgICAgICBpQmFzZUZvbnQrKykgeworICAgIGlmIChmYWNlID09IEJhc2UxNFN1YnN0c1tpQmFzZUZvbnRdLm1fcE5hbWUpIHsKKyAgICAgIHJldHVybiBHZXRGb250KEJhc2UxNFN1YnN0c1tpQmFzZUZvbnRdLm1fcFN1YnN0TmFtZSk7CisgICAgfQorICB9CisgIHJldHVybiBudWxscHRyOworfQorCit2b2lkKiBDRlhfRm9sZGVyRm9udEluZm86OkZpbmRGb250KGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTWF0Y2hOYW1lKSB7CisgIENGWF9Gb250RmFjZUluZm8qIHBGaW5kID0gbnVsbHB0cjsKKyAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX0FOU0lfQ0hBUlNFVCAmJiAocGl0Y2hfZmFtaWx5ICYgRlhGT05UX0ZGX0ZJWEVEUElUQ0gpKSB7CisgICAgcmV0dXJuIEdldEZvbnQoIkNvdXJpZXIgTmV3Iik7CisgIH0KKyAgRlhfRFdPUkQgY2hhcnNldF9mbGFnID0gR2V0Q2hhcnNldChjaGFyc2V0KTsKKyAgaW50MzJfdCBpQmVzdFNpbWlsYXIgPSAwOworICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogbV9Gb250TGlzdCkgeworICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic05hbWUgPSBpdC5maXJzdDsKKyAgICBDRlhfRm9udEZhY2VJbmZvKiBwRm9udCA9IGl0LnNlY29uZDsKKyAgICBpZiAoIShwRm9udC0+bV9DaGFyc2V0cyAmIGNoYXJzZXRfZmxhZykgJiYKKyAgICAgICAgY2hhcnNldCAhPSBGWEZPTlRfREVGQVVMVF9DSEFSU0VUKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50MzJfdCBpbmRleCA9IGJzTmFtZS5GaW5kKGZhbWlseSk7CisgICAgaWYgKGJNYXRjaE5hbWUgJiYgaW5kZXggPCAwKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50MzJfdCBpU2ltaWxhclZhbHVlID0KKyAgICAgICAgR2V0U2ltaWxhclZhbHVlKHdlaWdodCwgYkl0YWxpYywgcGl0Y2hfZmFtaWx5LCBwRm9udC0+bV9TdHlsZXMpOworICAgIGlmIChpU2ltaWxhclZhbHVlID4gaUJlc3RTaW1pbGFyKSB7CisgICAgICBpQmVzdFNpbWlsYXIgPSBpU2ltaWxhclZhbHVlOworICAgICAgcEZpbmQgPSBwRm9udDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHBGaW5kOworfQordm9pZCogQ0ZYX0ZvbGRlckZvbnRJbmZvOjpNYXBGb250KGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXRhbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgaUV4YWN0KSB7CisgIHJldHVybiBOVUxMOworfQorCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK3ZvaWQqIENGWF9Gb2xkZXJGb250SW5mbzo6TWFwRm9udEJ5VW5pY29kZShGWF9EV09SRCBkd1VuaWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJdGFsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoX2ZhbWlseSkgeworICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKwordm9pZCogQ0ZYX0ZvbGRlckZvbnRJbmZvOjpHZXRGb250KGNvbnN0IEZYX0NIQVIqIGZhY2UpIHsKKyAgYXV0byBpdCA9IG1fRm9udExpc3QuZmluZChmYWNlKTsKKyAgcmV0dXJuIGl0ICE9IG1fRm9udExpc3QuZW5kKCkgPyBpdC0+c2Vjb25kIDogbnVsbHB0cjsKK30KKworRlhfRFdPUkQgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpHZXRGb250RGF0YSh2b2lkKiBoRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSkgeworICBpZiAoIWhGb250KQorICAgIHJldHVybiAwOworCisgIGNvbnN0IENGWF9Gb250RmFjZUluZm8qIHBGb250ID0gc3RhdGljX2Nhc3Q8Q0ZYX0ZvbnRGYWNlSW5mbyo+KGhGb250KTsKKyAgRlhfRFdPUkQgZGF0YXNpemUgPSAwOworICBGWF9EV09SRCBvZmZzZXQgPSAwOworICBpZiAodGFibGUgPT0gMCkgeworICAgIGRhdGFzaXplID0gcEZvbnQtPm1fRm9udE9mZnNldCA/IDAgOiBwRm9udC0+bV9GaWxlU2l6ZTsKKyAgfSBlbHNlIGlmICh0YWJsZSA9PSBrVGFibGVUVENGKSB7CisgICAgZGF0YXNpemUgPSBwRm9udC0+bV9Gb250T2Zmc2V0ID8gcEZvbnQtPm1fRmlsZVNpemUgOiAwOworICB9IGVsc2UgeworICAgIEZYX0RXT1JEIG5UYWJsZXMgPSBwRm9udC0+bV9Gb250VGFibGVzLkdldExlbmd0aCgpIC8gMTY7CisgICAgZm9yIChGWF9EV09SRCBpID0gMDsgaSA8IG5UYWJsZXM7IGkrKykgeworICAgICAgY29uc3QgdWludDhfdCogcCA9CisgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KHBGb250LT5tX0ZvbnRUYWJsZXMpICsgaSAqIDE2OworICAgICAgaWYgKEdFVF9UVF9MT05HKHApID09IHRhYmxlKSB7CisgICAgICAgIG9mZnNldCA9IEdFVF9UVF9MT05HKHAgKyA4KTsKKyAgICAgICAgZGF0YXNpemUgPSBHRVRfVFRfTE9ORyhwICsgMTIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmICghZGF0YXNpemUgfHwgc2l6ZSA8IGRhdGFzaXplKQogICAgIHJldHVybiBkYXRhc2l6ZTsKKworICBGWFNZU19GSUxFKiBwRmlsZSA9IEZYU1lTX2ZvcGVuKHBGb250LT5tX0ZpbGVQYXRoLCAicmIiKTsKKyAgaWYgKCFwRmlsZSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoRlhTWVNfZnNlZWsocEZpbGUsIG9mZnNldCwgRlhTWVNfU0VFS19TRVQpIDwgMCB8fAorICAgICAgRlhTWVNfZnJlYWQoYnVmZmVyLCBkYXRhc2l6ZSwgMSwgcEZpbGUpICE9IDEpIHsKKyAgICBkYXRhc2l6ZSA9IDA7CisgIH0KKyAgRlhTWVNfZmNsb3NlKHBGaWxlKTsKKyAgcmV0dXJuIGRhdGFzaXplOwogfQotdm9pZCBDRlhfRm9sZGVyRm9udEluZm86OkRlbGV0ZUZvbnQodm9pZCogaEZvbnQpCi17Ci19Ci1GWF9CT09MIENGWF9Gb2xkZXJGb250SW5mbzo6R2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKQotewotICAgIGlmIChoRm9udCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ0ZvbnRGYWNlSW5mbyogcEZvbnQgPSAoQ0ZvbnRGYWNlSW5mbyopaEZvbnQ7Ci0gICAgbmFtZSA9IHBGb250LT5tX0ZhY2VOYW1lOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDRlhfRm9sZGVyRm9udEluZm86OkdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpCi17CisKK3ZvaWQgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpEZWxldGVGb250KHZvaWQqIGhGb250KSB7fQorRlhfQk9PTCBDRlhfRm9sZGVyRm9udEluZm86OkdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkgeworICBpZiAoIWhGb250KSB7CiAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENGWF9Gb250RmFjZUluZm8qIHBGb250ID0gKENGWF9Gb250RmFjZUluZm8qKWhGb250OworICBuYW1lID0gcEZvbnQtPm1fRmFjZU5hbWU7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDRlhfRm9sZGVyRm9udEluZm86OkdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpIHsKKyAgcmV0dXJuIEZBTFNFOworfQorCitpbnQgUERGX0dldFN0YW5kYXJkRm9udE5hbWUoQ0ZYX0J5dGVTdHJpbmcqIG5hbWUpIHsKKyAgQWx0Rm9udE5hbWUqIGZvdW5kID0gc3RhdGljX2Nhc3Q8QWx0Rm9udE5hbWUqPigKKyAgICAgIEZYU1lTX2JzZWFyY2gobmFtZS0+Y19zdHIoKSwgZ19BbHRGb250TmFtZXMsIEZYX0FycmF5U2l6ZShnX0FsdEZvbnROYW1lcyksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihBbHRGb250TmFtZSksIENvbXBhcmVTdHJpbmcpKTsKKyAgaWYgKCFmb3VuZCkKKyAgICByZXR1cm4gLTE7CisKKyAgKm5hbWUgPSBnX0Jhc2UxNEZvbnROYW1lc1tmb3VuZC0+bV9JbmRleF07CisgIHJldHVybiBmb3VuZC0+bV9JbmRleDsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfbGludXguY3BwIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9saW51eC5jcHAKaW5kZXggYjljZmM4ZS4uZDU4MTYyNyAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9saW51eC5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9saW51eC5jcHAKQEAgLTEsMjMxICsxLDE0NyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGdlL2Z4X2dlLmgiCi0jaW5jbHVkZSAiLi4vYWdnL2luY2x1ZGUvZnhfYWdnX2RyaXZlci5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2dlLmgiCisjaW5jbHVkZSAiY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meF9hZ2dfZHJpdmVyLmgiCiAjaW5jbHVkZSAidGV4dF9pbnQuaCIKKwogI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fTElOVVhfCitjbGFzcyBDRlhfTGludXhGb250SW5mbyA6IHB1YmxpYyBDRlhfRm9sZGVyRm9udEluZm8geworIHB1YmxpYzoKKyAgdm9pZCogTWFwRm9udChpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgIEZYX0JPT0wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfZmFtaWx5LAorICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwKKyAgICAgICAgICAgICAgICBpbnQmIGlFeGFjdCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgUGFyc2VGb250Q2ZnKGNvbnN0IGNoYXIqKiBwVXNlclBhdGhzKTsKK307CisjZGVmaW5lIExJTlVYX0dQTkFNRVNJWkUgNgogc3RhdGljIGNvbnN0IHN0cnVjdCB7Ci0gICAgRlhfTFBDU1RSCW1fcE5hbWU7Ci0gICAgRlhfTFBDU1RSCW1fcFN1YnN0TmFtZTsKLX0KLUJhc2UxNFN1YnN0c1tdID0gewotICAgIHsiQ291cmllciIsICJDb3VyaWVyIE5ldyJ9LAotICAgIHsiQ291cmllci1Cb2xkIiwgIkNvdXJpZXIgTmV3IEJvbGQifSwKLSAgICB7IkNvdXJpZXItQm9sZE9ibGlxdWUiLCAiQ291cmllciBOZXcgQm9sZCBJdGFsaWMifSwKLSAgICB7IkNvdXJpZXItT2JsaXF1ZSIsICJDb3VyaWVyIE5ldyBJdGFsaWMifSwKLSAgICB7IkhlbHZldGljYSIsICJBcmlhbCJ9LAotICAgIHsiSGVsdmV0aWNhLUJvbGQiLCAiQXJpYWwgQm9sZCJ9LAotICAgIHsiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIiwgIkFyaWFsIEJvbGQgSXRhbGljIn0sCi0gICAgeyJIZWx2ZXRpY2EtT2JsaXF1ZSIsICJBcmlhbCBJdGFsaWMifSwKLSAgICB7IlRpbWVzLVJvbWFuIiwgIlRpbWVzIE5ldyBSb21hbiJ9LAotICAgIHsiVGltZXMtQm9sZCIsICJUaW1lcyBOZXcgUm9tYW4gQm9sZCJ9LAotICAgIHsiVGltZXMtQm9sZEl0YWxpYyIsICJUaW1lcyBOZXcgUm9tYW4gQm9sZCBJdGFsaWMifSwKLSAgICB7IlRpbWVzLUl0YWxpYyIsICJUaW1lcyBOZXcgUm9tYW4gSXRhbGljIn0sCisgIGNvbnN0IEZYX0NIQVIqIE5hbWVBcnJbTElOVVhfR1BOQU1FU0laRV07Cit9IExpbnV4R3BGb250TGlzdFtdID0geworICAgIHt7IlRha2FvUEdvdGhpYyIsICJWTCBQR290aGljIiwgIklQQVBHb3RoaWMiLCAiVkwgR290aGljIiwgIktvY2hpIEdvdGhpYyIsCisgICAgICAiVkwgR290aGljIHJlZ3VsYXIifX0sCisgICAge3siVGFrYW9Hb3RoaWMiLCAiVkwgR290aGljIiwgIklQQUdvdGhpYyIsICJLb2NoaSBHb3RoaWMiLCBOVUxMLAorICAgICAgIlZMIEdvdGhpYyByZWd1bGFyIn19LAorICAgIHt7IlRha2FvUE1pbmNobyIsICJJUEFQTWluY2hvIiwgIlZMIEdvdGhpYyIsICJLb2NoaSBNaW5jaG8iLCBOVUxMLAorICAgICAgIlZMIEdvdGhpYyByZWd1bGFyIn19LAorICAgIHt7IlRha2FvTWluY2hvIiwgIklQQU1pbmNobyIsICJWTCBHb3RoaWMiLCAiS29jaGkgTWluY2hvIiwgTlVMTCwKKyAgICAgICJWTCBHb3RoaWMgcmVndWxhciJ9fSwKIH07Ci1jbGFzcyBDRlhfTGludXhGb250SW5mbyA6IHB1YmxpYyBDRlhfRm9sZGVyRm9udEluZm8KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQqCQlNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIEZYX0xQQ1NUUiBmYW1pbHksIEZYX0JPT0wmIGJFeGFjdCk7Ci0gICAgRlhfQk9PTAkJCQlQYXJzZUZvbnRDZmcoKTsKLSAgICB2b2lkKgkJCQlGaW5kRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBGWF9MUENTVFIgZmFtaWx5LCBGWF9CT09MIGJNYXRjaE5hbWUpOworc3RhdGljIGNvbnN0IEZYX0NIQVIqIGNvbnN0IGdfTGludXhHYkZvbnRMaXN0W10gPSB7CisgICAgIkFSIFBMIFVNaW5nIENOIExpZ2h0IiwgIldlblF1YW5ZaSBNaWNybyBIZWkiLCAiQVIgUEwgVUthaSBDTiIsCiB9OwotI2RlZmluZSBMSU5VWF9HUE5BTUVTSVpFCTYKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgewotICAgIEZYX0xQQ1NUUiBOYW1lQXJyW0xJTlVYX0dQTkFNRVNJWkVdOwotfQotTGludXhHcEZvbnRMaXN0W10gPSB7Ci0gICAge3siVGFrYW9QR290aGljIiwgIlZMIFBHb3RoaWMiLCAiSVBBUEdvdGhpYyIsICJWTCBHb3RoaWMiLCAiS29jaGkgR290aGljIiwgIlZMIEdvdGhpYyByZWd1bGFyIn19LAotICAgIHt7IlRha2FvR290aGljIiwgIlZMIEdvdGhpYyIsICJJUEFHb3RoaWMiLCAiS29jaGkgR290aGljIiwgTlVMTCwgIlZMIEdvdGhpYyByZWd1bGFyIn19LAotICAgIHt7IlRha2FvUE1pbmNobyIsICJJUEFQTWluY2hvIiwgIlZMIEdvdGhpYyIsICJLb2NoaSBNaW5jaG8iLCBOVUxMLCAiVkwgR290aGljIHJlZ3VsYXIifX0sCi0gICAge3siVGFrYW9NaW5jaG8iLCAiSVBBTWluY2hvIiwgIlZMIEdvdGhpYyIsICJLb2NoaSBNaW5jaG8iLCBOVUxMLCAiVkwgR290aGljIHJlZ3VsYXIifX0sCitzdGF0aWMgY29uc3QgRlhfQ0hBUiogY29uc3QgZ19MaW51eEI1Rm9udExpc3RbXSA9IHsKKyAgICAiQVIgUEwgVU1pbmcgVFcgTGlnaHQiLCAiV2VuUXVhbllpIE1pY3JvIEhlaSIsICJBUiBQTCBVS2FpIFRXIiwKIH07Ci1zdGF0aWMgY29uc3QgRlhfTFBDU1RSIGdfTGludXhHYkZvbnRMaXN0W10gPSB7Ci0gICAgIkFSIFBMIFVNaW5nIENOIExpZ2h0IiwKLSAgICAiV2VuUXVhbllpIE1pY3JvIEhlaSIsCi0gICAgIkFSIFBMIFVLYWkgQ04iLAotfTsKLXN0YXRpYyBjb25zdCBGWF9MUENTVFIgZ19MaW51eEI1Rm9udExpc3RbXSA9IHsKLSAgICAiQVIgUEwgVU1pbmcgVFcgTGlnaHQiLAotICAgICJXZW5RdWFuWWkgTWljcm8gSGVpIiwKLSAgICAiQVIgUEwgVUthaSBUVyIsCi19Owotc3RhdGljIGNvbnN0IEZYX0xQQ1NUUiBnX0xpbnV4SEdGb250TGlzdFtdID0geworc3RhdGljIGNvbnN0IEZYX0NIQVIqIGNvbnN0IGdfTGludXhIR0ZvbnRMaXN0W10gPSB7CiAgICAgIlVuRG90dW0iLAogfTsKLXN0YXRpYyBGWF9JTlQzMiBHZXRKYXBhbmVzZVByZWZlcmVuY2UoRlhfTFBDU1RSIGZhY2VhcnIsIGludCB3ZWlnaHQsIGludCBwaWN0aF9mYW1pbHkpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgZmFjZSA9IGZhY2VhcnI7Ci0gICAgaWYgKGZhY2UuRmluZCgiR290aGljIikgPj0gMCB8fCBmYWNlLkZpbmQoIlx4ODNceDUzXHg4M1x4NTZceDgzXHg2Mlx4ODNceDRlIikgPj0gMCkgewotICAgICAgICBpZiAoZmFjZS5GaW5kKCJQR290aGljIikgPj0gMCB8fCBmYWNlLkZpbmQoIlx4ODJceDZmXHg4M1x4NTNceDgzXHg1Nlx4ODNceDYyXHg4M1x4NGUiKSA+PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChmYWNlLkZpbmQoIk1pbmNobyIpID49IDAgfHwgZmFjZS5GaW5kKCJceDk2XHhiZVx4OTJceGE5IikgPj0gMCkgewotICAgICAgICBpZiAoZmFjZS5GaW5kKCJQTWluY2hvIikgPj0gMCB8fCBmYWNlLkZpbmQoIlx4ODJceDZmXHg5Nlx4YmVceDkyXHhhOSIpID49IDApIHsKLSAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIDM7Ci0gICAgICAgIH0KK3N0YXRpYyBpbnQzMl90IEdldEphcGFuZXNlUHJlZmVyZW5jZShjb25zdCBGWF9DSEFSKiBmYWNlYXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpY3RoX2ZhbWlseSkgeworICBDRlhfQnl0ZVN0cmluZyBmYWNlID0gZmFjZWFycjsKKyAgaWYgKGZhY2UuRmluZCgiR290aGljIikgPj0gMCB8fAorICAgICAgZmFjZS5GaW5kKCJceDgzXHg1M1x4ODNceDU2XHg4M1x4NjJceDgzXHg0ZSIpID49IDApIHsKKyAgICBpZiAoZmFjZS5GaW5kKCJQR290aGljIikgPj0gMCB8fAorICAgICAgICBmYWNlLkZpbmQoIlx4ODJceDZmXHg4M1x4NTNceDgzXHg1Nlx4ODNceDYyXHg4M1x4NGUiKSA+PSAwKSB7CisgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgaWYgKCEocGljdGhfZmFtaWx5ICYgRlhGT05UX0ZGX1JPTUFOKSAmJiB3ZWlnaHQgPiA0MDApIHsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKGZhY2UuRmluZCgiTWluY2hvIikgPj0gMCB8fCBmYWNlLkZpbmQoIlx4OTZceGJlXHg5Mlx4YTkiKSA+PSAwKSB7CisgICAgaWYgKGZhY2UuRmluZCgiUE1pbmNobyIpID49IDAgfHwKKyAgICAgICAgZmFjZS5GaW5kKCJceDgyXHg2Zlx4OTZceGJlXHg5Mlx4YTkiKSA+PSAwKSB7CisgICAgICByZXR1cm4gMjsKICAgICB9Ci0gICAgcmV0dXJuIDI7Ci19Ci12b2lkKiBDRlhfTGludXhGb250SW5mbzo6TWFwRm9udChpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LCBGWF9MUENTVFIgY3N0cl9mYWNlLCBGWF9CT09MJiBiRXhhY3QpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgZmFjZSA9IGNzdHJfZmFjZTsKLSAgICBpbnQgaUJhc2VGb250OwotICAgIGZvciAoaUJhc2VGb250ID0gMDsgaUJhc2VGb250IDwgMTI7IGlCYXNlRm9udCArKykKLSAgICAgICAgaWYgKGZhY2UgPT0gQ0ZYX0J5dGVTdHJpbmdDKEJhc2UxNFN1YnN0c1tpQmFzZUZvbnRdLm1fcE5hbWUpKSB7Ci0gICAgICAgICAgICBmYWNlID0gQmFzZTE0U3Vic3RzW2lCYXNlRm9udF0ubV9wU3Vic3ROYW1lOwotICAgICAgICAgICAgYkV4YWN0ID0gVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgaWYgKGlCYXNlRm9udCA8IDEyKSB7Ci0gICAgICAgIHJldHVybiBHZXRGb250KGZhY2UpOwotICAgIH0KLSAgICBGWF9MUFZPSUQgcCA9IE5VTEw7Ci0gICAgRlhfQk9PTCBiQ0pLID0gVFJVRTsKLSAgICBzd2l0Y2ggKGNoYXJzZXQpIHsKLSAgICAgICAgY2FzZSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVDogewotICAgICAgICAgICAgICAgIEZYX0lOVDMyIGluZGV4ID0gR2V0SmFwYW5lc2VQcmVmZXJlbmNlKGNzdHJfZmFjZSwgd2VpZ2h0LCBwaXRjaF9mYW1pbHkpOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoRlhfSU5UMzIgaSA9IDA7IGkgPCBMSU5VWF9HUE5BTUVTSVpFOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIGlmIChtX0ZvbnRMaXN0Lkxvb2t1cChMaW51eEdwRm9udExpc3RbaW5kZXhdLk5hbWVBcnJbaV0sIHApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhGT05UX0dCMjMxMl9DSEFSU0VUOiB7Ci0gICAgICAgICAgICAgICAgc3RhdGljIEZYX0lOVDMyIHNfZ2JDb3VudCA9IHNpemVvZihnX0xpbnV4R2JGb250TGlzdCkgLyBzaXplb2YoRlhfTFBDU1RSKTsKLSAgICAgICAgICAgICAgICBmb3IgKEZYX0lOVDMyIGkgPSAwOyBpIDwgc19nYkNvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIGlmIChtX0ZvbnRMaXN0Lkxvb2t1cChnX0xpbnV4R2JGb250TGlzdFtpXSwgcCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVDogewotICAgICAgICAgICAgICAgIHN0YXRpYyBGWF9JTlQzMiBzX2I1Q291bnQgPSBzaXplb2YoZ19MaW51eEI1Rm9udExpc3QpIC8gc2l6ZW9mKEZYX0xQQ1NUUik7Ci0gICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IHNfYjVDb3VudDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBpZiAobV9Gb250TGlzdC5Mb29rdXAoZ19MaW51eEI1Rm9udExpc3RbaV0sIHApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhGT05UX0hBTkdFVUxfQ0hBUlNFVDogewotICAgICAgICAgICAgICAgIHN0YXRpYyBGWF9JTlQzMiBzX2hnQ291bnQgPSBzaXplb2YoZ19MaW51eEhHRm9udExpc3QpIC8gc2l6ZW9mKEZYX0xQQ1NUUik7Ci0gICAgICAgICAgICAgICAgZm9yIChGWF9JTlQzMiBpID0gMDsgaSA8IHNfaGdDb3VudDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBpZiAobV9Gb250TGlzdC5Mb29rdXAoZ19MaW51eEhHRm9udExpc3RbaV0sIHApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBiQ0pLID0gRkFMU0U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX0FOU0lfQ0hBUlNFVCAmJiAocGl0Y2hfZmFtaWx5ICYgRlhGT05UX0ZGX0ZJWEVEUElUQ0gpKSB7Ci0gICAgICAgIHJldHVybiBHZXRGb250KCJDb3VyaWVyIE5ldyIpOwotICAgIH0KLSAgICByZXR1cm4gRmluZEZvbnQod2VpZ2h0LCBiSXRhbGljLCBjaGFyc2V0LCBwaXRjaF9mYW1pbHksIGNzdHJfZmFjZSwgIWJDSkspOwotfQotc3RhdGljIEZYX0RXT1JEIF9MaW51eEdldENoYXJzZXQoaW50IGNoYXJzZXQpCi17Ci0gICAgc3dpdGNoKGNoYXJzZXQpIHsKLSAgICAgICAgY2FzZSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVDoKLSAgICAgICAgICAgIHJldHVybiBDSEFSU0VUX0ZMQUdfU0hJRlRKSVM7Ci0gICAgICAgIGNhc2UgRlhGT05UX0dCMjMxMl9DSEFSU0VUOgotICAgICAgICAgICAgcmV0dXJuIENIQVJTRVRfRkxBR19HQjsKLSAgICAgICAgY2FzZSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVDoKLSAgICAgICAgICAgIHJldHVybiBDSEFSU0VUX0ZMQUdfQklHNTsKLSAgICAgICAgY2FzZSBGWEZPTlRfSEFOR0VVTF9DSEFSU0VUOgotICAgICAgICAgICAgcmV0dXJuIENIQVJTRVRfRkxBR19LT1JFQU47Ci0gICAgICAgIGNhc2UgRlhGT05UX1NZTUJPTF9DSEFSU0VUOgotICAgICAgICAgICAgcmV0dXJuIENIQVJTRVRfRkxBR19TWU1CT0w7Ci0gICAgICAgIGNhc2UgRlhGT05UX0FOU0lfQ0hBUlNFVDoKLSAgICAgICAgICAgIHJldHVybiBDSEFSU0VUX0ZMQUdfQU5TSTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KKyAgICByZXR1cm4gMzsKKyAgfQorICBpZiAoIShwaWN0aF9mYW1pbHkgJiBGWEZPTlRfRkZfUk9NQU4pICYmIHdlaWdodCA+IDQwMCkgewogICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAyOwogfQotc3RhdGljIEZYX0lOVDMyIF9MaW51eEdldFNpbWlsYXJWYWx1ZShpbnQgd2VpZ2h0LCBGWF9CT09MIGJJdGFsaWMsIGludCBwaXRjaF9mYW1pbHksIEZYX0RXT1JEIHN0eWxlKQotewotICAgIEZYX0lOVDMyIGlTaW1pbGFyVmFsdWUgPSAwOwotICAgIGlmICgoc3R5bGUgJiBGWEZPTlRfQk9MRCkgPT0gKHdlaWdodCA+IDQwMCkpIHsKLSAgICAgICAgaVNpbWlsYXJWYWx1ZSArPSAxNjsKLSAgICB9Ci0gICAgaWYgKChzdHlsZSAmIEZYRk9OVF9JVEFMSUMpID09IGJJdGFsaWMpIHsKLSAgICAgICAgaVNpbWlsYXJWYWx1ZSArPSAxNjsKLSAgICB9Ci0gICAgaWYgKChzdHlsZSAmIEZYRk9OVF9TRVJJRikgPT0gKHBpdGNoX2ZhbWlseSAmIEZYRk9OVF9GRl9ST01BTikpIHsKLSAgICAgICAgaVNpbWlsYXJWYWx1ZSArPSAxNjsKLSAgICB9Ci0gICAgaWYgKChzdHlsZSAmIEZYRk9OVF9TQ1JJUFQpID09IChwaXRjaF9mYW1pbHkgJiBGWEZPTlRfRkZfU0NSSVBUKSkgewotICAgICAgICBpU2ltaWxhclZhbHVlICs9IDg7Ci0gICAgfQotICAgIGlmICgoc3R5bGUgJiBGWEZPTlRfRklYRURfUElUQ0gpID09IChwaXRjaF9mYW1pbHkgJiBGWEZPTlRfRkZfRklYRURQSVRDSCkpIHsKLSAgICAgICAgaVNpbWlsYXJWYWx1ZSArPSA4OwotICAgIH0KLSAgICByZXR1cm4gaVNpbWlsYXJWYWx1ZTsKK3ZvaWQqIENGWF9MaW51eEZvbnRJbmZvOjpNYXBGb250KGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJdGFsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBjc3RyX2ZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGlFeGFjdCkgeworICB2b2lkKiBmb250ID0gR2V0U3Vic3RGb250KGNzdHJfZmFjZSk7CisgIGlmIChmb250KSB7CisgICAgaUV4YWN0ID0gMTsKKyAgICByZXR1cm4gZm9udDsKKyAgfQorICBGWF9CT09MIGJDSksgPSBUUlVFOworICBzd2l0Y2ggKGNoYXJzZXQpIHsKKyAgICBjYXNlIEZYRk9OVF9TSElGVEpJU19DSEFSU0VUOiB7CisgICAgICBpbnQzMl90IGluZGV4ID0gR2V0SmFwYW5lc2VQcmVmZXJlbmNlKGNzdHJfZmFjZSwgd2VpZ2h0LCBwaXRjaF9mYW1pbHkpOworICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IExJTlVYX0dQTkFNRVNJWkU7IGkrKykgeworICAgICAgICBhdXRvIGl0ID0gbV9Gb250TGlzdC5maW5kKExpbnV4R3BGb250TGlzdFtpbmRleF0uTmFtZUFycltpXSk7CisgICAgICAgIGlmIChpdCAhPSBtX0ZvbnRMaXN0LmVuZCgpKSB7CisgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgRlhGT05UX0dCMjMxMl9DSEFSU0VUOiB7CisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShnX0xpbnV4R2JGb250TGlzdCk7ICsraSkgeworICAgICAgICBhdXRvIGl0ID0gbV9Gb250TGlzdC5maW5kKGdfTGludXhHYkZvbnRMaXN0W2ldKTsKKyAgICAgICAgaWYgKGl0ICE9IG1fRm9udExpc3QuZW5kKCkpIHsKKyAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVDogeworICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoZ19MaW51eEI1Rm9udExpc3QpOyArK2kpIHsKKyAgICAgICAgYXV0byBpdCA9IG1fRm9udExpc3QuZmluZChnX0xpbnV4QjVGb250TGlzdFtpXSk7CisgICAgICAgIGlmIChpdCAhPSBtX0ZvbnRMaXN0LmVuZCgpKSB7CisgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgRlhGT05UX0hBTkdFVUxfQ0hBUlNFVDogeworICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoZ19MaW51eEhHRm9udExpc3QpOyArK2kpIHsKKyAgICAgICAgYXV0byBpdCA9IG1fRm9udExpc3QuZmluZChnX0xpbnV4SEdGb250TGlzdFtpXSk7CisgICAgICAgIGlmIChpdCAhPSBtX0ZvbnRMaXN0LmVuZCgpKSB7CisgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBiQ0pLID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gRmluZEZvbnQod2VpZ2h0LCBiSXRhbGljLCBjaGFyc2V0LCBwaXRjaF9mYW1pbHksIGNzdHJfZmFjZSwgIWJDSkspOwogfQotdm9pZCogQ0ZYX0xpbnV4Rm9udEluZm86OkZpbmRGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIEZYX0xQQ1NUUiBmYW1pbHksIEZYX0JPT0wgYk1hdGNoTmFtZSkKLXsKLSAgICBDRm9udEZhY2VJbmZvKiBwRmluZCA9IE5VTEw7Ci0gICAgRlhfRFdPUkQgY2hhcnNldF9mbGFnID0gX0xpbnV4R2V0Q2hhcnNldChjaGFyc2V0KTsKLSAgICBGWF9JTlQzMiBpQmVzdFNpbWlsYXIgPSAwOwotICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fRm9udExpc3QuR2V0U3RhcnRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNOYW1lOwotICAgICAgICBDRm9udEZhY2VJbmZvKiBwRm9udCA9IE5VTEw7Ci0gICAgICAgIG1fRm9udExpc3QuR2V0TmV4dEFzc29jKHBvcywgYnNOYW1lLCAoRlhfTFBWT0lEJilwRm9udCk7Ci0gICAgICAgIGlmICghKHBGb250LT5tX0NoYXJzZXRzICYgY2hhcnNldF9mbGFnKSAmJiBjaGFyc2V0ICE9IEZYRk9OVF9ERUZBVUxUX0NIQVJTRVQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEZYX0lOVDMyIGlTaW1pbGFyVmFsdWUgPSAwOwotICAgICAgICBGWF9JTlQzMiBpbmRleCA9IGJzTmFtZS5GaW5kKGZhbWlseSk7Ci0gICAgICAgIGlmIChiTWF0Y2hOYW1lICYmIGluZGV4IDwgMCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFiTWF0Y2hOYW1lICYmIGluZGV4ID4gMCkgewotICAgICAgICAgICAgaVNpbWlsYXJWYWx1ZSArPSA2NDsKLSAgICAgICAgfQotICAgICAgICBpU2ltaWxhclZhbHVlID0gX0xpbnV4R2V0U2ltaWxhclZhbHVlKHdlaWdodCwgYkl0YWxpYywgcGl0Y2hfZmFtaWx5LCBwRm9udC0+bV9TdHlsZXMpOwotICAgICAgICBpZiAoaVNpbWlsYXJWYWx1ZSA+IGlCZXN0U2ltaWxhcikgewotICAgICAgICAgICAgaUJlc3RTaW1pbGFyID0gaVNpbWlsYXJWYWx1ZTsKLSAgICAgICAgICAgIHBGaW5kID0gcEZvbnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHBGaW5kOworSUZYX1N5c3RlbUZvbnRJbmZvKiBJRlhfU3lzdGVtRm9udEluZm86OkNyZWF0ZURlZmF1bHQoY29uc3QgY2hhcioqIHBVc2VyUGF0aHMpIHsKKyAgQ0ZYX0xpbnV4Rm9udEluZm8qIHBJbmZvID0gbmV3IENGWF9MaW51eEZvbnRJbmZvOworICBpZiAoIXBJbmZvLT5QYXJzZUZvbnRDZmcocFVzZXJQYXRocykpIHsKKyAgICBwSW5mby0+QWRkUGF0aCgiL3Vzci9zaGFyZS9mb250cyIpOworICAgIHBJbmZvLT5BZGRQYXRoKCIvdXNyL3NoYXJlL1gxMS9mb250cy9UeXBlMSIpOworICAgIHBJbmZvLT5BZGRQYXRoKCIvdXNyL3NoYXJlL1gxMS9mb250cy9UVEYiKTsKKyAgICBwSW5mby0+QWRkUGF0aCgiL3Vzci9sb2NhbC9zaGFyZS9mb250cyIpOworICB9CisgIHJldHVybiBwSW5mbzsKIH0KLUlGWF9TeXN0ZW1Gb250SW5mbyogSUZYX1N5c3RlbUZvbnRJbmZvOjpDcmVhdGVEZWZhdWx0KCkKLXsKLSAgICBDRlhfTGludXhGb250SW5mbyogcEluZm8gPSBuZXcgQ0ZYX0xpbnV4Rm9udEluZm87Ci0gICAgaWYgKCFwSW5mby0+UGFyc2VGb250Q2ZnKCkpIHsKLSAgICAgICAgcEluZm8tPkFkZFBhdGgoIi91c3Ivc2hhcmUvZm9udHMiKTsKLSAgICAgICAgcEluZm8tPkFkZFBhdGgoIi91c3Ivc2hhcmUvWDExL2ZvbnRzL1R5cGUxIik7Ci0gICAgICAgIHBJbmZvLT5BZGRQYXRoKCIvdXNyL3NoYXJlL1gxMS9mb250cy9UVEYiKTsKLSAgICAgICAgcEluZm8tPkFkZFBhdGgoIi91c3IvbG9jYWwvc2hhcmUvZm9udHMiKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBJbmZvOwotfQotRlhfQk9PTCBDRlhfTGludXhGb250SW5mbzo6UGFyc2VGb250Q2ZnKCkKLXsKK0ZYX0JPT0wgQ0ZYX0xpbnV4Rm9udEluZm86OlBhcnNlRm9udENmZyhjb25zdCBjaGFyKiogcFVzZXJQYXRocykgeworICBpZiAoIXBVc2VyUGF0aHMpIHsKICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZm9yIChjb25zdCBjaGFyKiogcFBhdGggPSBwVXNlclBhdGhzOyAqcFBhdGg7ICsrcFBhdGgpIHsKKyAgICBBZGRQYXRoKCpwUGF0aCk7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9Ci12b2lkIENGWF9HRU1vZHVsZTo6SW5pdFBsYXRmb3JtKCkKLXsKLSAgICBtX3BGb250TWdyLT5TZXRTeXN0ZW1Gb250SW5mbyhJRlhfU3lzdGVtRm9udEluZm86OkNyZWF0ZURlZmF1bHQoKSk7Cit2b2lkIENGWF9HRU1vZHVsZTo6SW5pdFBsYXRmb3JtKCkgeworICBtX3BGb250TWdyLT5TZXRTeXN0ZW1Gb250SW5mbygKKyAgICAgIElGWF9TeXN0ZW1Gb250SW5mbzo6Q3JlYXRlRGVmYXVsdChtX3BVc2VyRm9udFBhdGhzKSk7CiB9Ci12b2lkIENGWF9HRU1vZHVsZTo6RGVzdHJveVBsYXRmb3JtKCkKLXsKLX0KLSNlbmRpZgordm9pZCBDRlhfR0VNb2R1bGU6OkRlc3Ryb3lQbGF0Zm9ybSgpIHt9CisjZW5kaWYgIC8vIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fTElOVVhfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX3BhdGguY3BwIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9wYXRoLmNwcAppbmRleCA1MWQ1OTA4Li4yM2IxYzJmIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX3BhdGguY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfcGF0aC5jcHAKQEAgLTEsNjI5ICsxLDY1NyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vLi4vLi4vdGhpcmRfcGFydHkvYmFzZS9udW1lcmljcy9zYWZlX21hdGguaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGdlL2Z4X2dlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2dlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9udW1lcmljcy9zYWZlX21hdGguaCIKIAotQ0ZYX0NsaXBSZ246OkNGWF9DbGlwUmduKGludCB3aWR0aCwgaW50IGhlaWdodCkKLXsKK0NGWF9DbGlwUmduOjpDRlhfQ2xpcFJnbihpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgbV9UeXBlID0gUmVjdEk7CisgIG1fQm94LmxlZnQgPSBtX0JveC50b3AgPSAwOworICBtX0JveC5yaWdodCA9IHdpZHRoOworICBtX0JveC5ib3R0b20gPSBoZWlnaHQ7Cit9CitDRlhfQ2xpcFJnbjo6Q0ZYX0NsaXBSZ24oY29uc3QgRlhfUkVDVCYgcmVjdCkgeworICBtX1R5cGUgPSBSZWN0STsKKyAgbV9Cb3ggPSByZWN0OworfQorQ0ZYX0NsaXBSZ246OkNGWF9DbGlwUmduKGNvbnN0IENGWF9DbGlwUmduJiBzcmMpIHsKKyAgbV9UeXBlID0gc3JjLm1fVHlwZTsKKyAgbV9Cb3ggPSBzcmMubV9Cb3g7CisgIG1fTWFzayA9IHNyYy5tX01hc2s7Cit9CitDRlhfQ2xpcFJnbjo6fkNGWF9DbGlwUmduKCkge30KK3ZvaWQgQ0ZYX0NsaXBSZ246OlJlc2V0KGNvbnN0IEZYX1JFQ1QmIHJlY3QpIHsKKyAgbV9UeXBlID0gUmVjdEk7CisgIG1fQm94ID0gcmVjdDsKKyAgbV9NYXNrLlNldE51bGwoKTsKK30KK3ZvaWQgQ0ZYX0NsaXBSZ246OkludGVyc2VjdFJlY3QoY29uc3QgRlhfUkVDVCYgcmVjdCkgeworICBpZiAobV9UeXBlID09IFJlY3RJKSB7CisgICAgbV9Cb3guSW50ZXJzZWN0KHJlY3QpOworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9UeXBlID09IE1hc2tGKSB7CisgICAgSW50ZXJzZWN0TWFza1JlY3QocmVjdCwgbV9Cb3gsIG1fTWFzayk7CisgICAgcmV0dXJuOworICB9Cit9Cit2b2lkIENGWF9DbGlwUmduOjpJbnRlcnNlY3RNYXNrUmVjdChGWF9SRUNUIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9SRUNUIG1hc2tfcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcFJlZiBNYXNrKSB7CisgIGNvbnN0IENGWF9ESUJpdG1hcCogbWFza19kaWIgPSBNYXNrOworICBtX1R5cGUgPSBNYXNrRjsKKyAgbV9Cb3ggPSByZWN0OworICBtX0JveC5JbnRlcnNlY3QobWFza19yZWN0KTsKKyAgaWYgKG1fQm94LklzRW1wdHkoKSkgewogICAgIG1fVHlwZSA9IFJlY3RJOwotICAgIG1fQm94LmxlZnQgPSBtX0JveC50b3AgPSAwOwotICAgIG1fQm94LnJpZ2h0ID0gd2lkdGg7Ci0gICAgbV9Cb3guYm90dG9tID0gaGVpZ2h0OwotfQotQ0ZYX0NsaXBSZ246OkNGWF9DbGlwUmduKGNvbnN0IEZYX1JFQ1QmIHJlY3QpCi17Ci0gICAgbV9UeXBlID0gUmVjdEk7Ci0gICAgbV9Cb3ggPSByZWN0OwotfQotQ0ZYX0NsaXBSZ246OkNGWF9DbGlwUmduKGNvbnN0IENGWF9DbGlwUmduJiBzcmMpCi17Ci0gICAgbV9UeXBlID0gc3JjLm1fVHlwZTsKLSAgICBtX0JveCA9IHNyYy5tX0JveDsKLSAgICBtX01hc2sgPSBzcmMubV9NYXNrOwotfQotQ0ZYX0NsaXBSZ246On5DRlhfQ2xpcFJnbigpCi17Ci19Ci12b2lkIENGWF9DbGlwUmduOjpSZXNldChjb25zdCBGWF9SRUNUJiByZWN0KQotewotICAgIG1fVHlwZSA9IFJlY3RJOwotICAgIG1fQm94ID0gcmVjdDsKLSAgICBtX01hc2suU2V0TnVsbCgpOwotfQotdm9pZCBDRlhfQ2xpcFJnbjo6SW50ZXJzZWN0UmVjdChjb25zdCBGWF9SRUNUJiByZWN0KQotewotICAgIGlmIChtX1R5cGUgPT0gUmVjdEkpIHsKLSAgICAgICAgbV9Cb3guSW50ZXJzZWN0KHJlY3QpOwotICAgICAgICByZXR1cm47CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX0JveCA9PSBtYXNrX3JlY3QpIHsKKyAgICBtX01hc2sgPSBNYXNrOworICAgIHJldHVybjsKKyAgfQorICBDRlhfRElCaXRtYXAqIG5ld19kaWIgPSBtX01hc2suTmV3KCk7CisgIGlmICghbmV3X2RpYikgeworICAgIHJldHVybjsKKyAgfQorICBuZXdfZGliLT5DcmVhdGUobV9Cb3guV2lkdGgoKSwgbV9Cb3guSGVpZ2h0KCksIEZYRElCXzhicHBNYXNrKTsKKyAgZm9yIChpbnQgcm93ID0gbV9Cb3gudG9wOyByb3cgPCBtX0JveC5ib3R0b207IHJvdysrKSB7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0KKyAgICAgICAgbmV3X2RpYi0+R2V0QnVmZmVyKCkgKyBuZXdfZGliLT5HZXRQaXRjaCgpICogKHJvdyAtIG1fQm94LnRvcCk7CisgICAgdWludDhfdCogc3JjX3NjYW4gPQorICAgICAgICBtYXNrX2RpYi0+R2V0QnVmZmVyKCkgKyBtYXNrX2RpYi0+R2V0UGl0Y2goKSAqIChyb3cgLSBtYXNrX3JlY3QudG9wKTsKKyAgICBmb3IgKGludCBjb2wgPSBtX0JveC5sZWZ0OyBjb2wgPCBtX0JveC5yaWdodDsgY29sKyspIHsKKyAgICAgIGRlc3Rfc2Nhbltjb2wgLSBtX0JveC5sZWZ0XSA9IHNyY19zY2FuW2NvbCAtIG1hc2tfcmVjdC5sZWZ0XTsKICAgICB9Ci0gICAgaWYgKG1fVHlwZSA9PSBNYXNrRikgewotICAgICAgICBJbnRlcnNlY3RNYXNrUmVjdChyZWN0LCBtX0JveCwgbV9NYXNrKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KKyAgfQogfQotdm9pZCBDRlhfQ2xpcFJnbjo6SW50ZXJzZWN0TWFza1JlY3QoRlhfUkVDVCByZWN0LCBGWF9SRUNUIG1hc2tfcmVjdCwgQ0ZYX0RJQml0bWFwUmVmIE1hc2spCi17Ci0gICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBtYXNrX2RpYiA9IE1hc2s7Ci0gICAgbV9UeXBlID0gTWFza0Y7Ci0gICAgbV9Cb3ggPSByZWN0OwotICAgIG1fQm94LkludGVyc2VjdChtYXNrX3JlY3QpOwotICAgIGlmIChtX0JveC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgbV9UeXBlID0gUmVjdEk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKG1fQm94ID09IG1hc2tfcmVjdCkgewotICAgICAgICBtX01hc2sgPSBNYXNrOwotICAgICAgICByZXR1cm47Cit2b2lkIENGWF9DbGlwUmduOjpJbnRlcnNlY3RNYXNrRihpbnQgbGVmdCwgaW50IHRvcCwgQ0ZYX0RJQml0bWFwUmVmIE1hc2spIHsKKyAgY29uc3QgQ0ZYX0RJQml0bWFwKiBtYXNrX2RpYiA9IE1hc2s7CisgIEFTU0VSVChtYXNrX2RpYi0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfOGJwcE1hc2spOworICBGWF9SRUNUIG1hc2tfYm94KGxlZnQsIHRvcCwgbGVmdCArIG1hc2tfZGliLT5HZXRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgIHRvcCArIG1hc2tfZGliLT5HZXRIZWlnaHQoKSk7CisgIGlmIChtX1R5cGUgPT0gUmVjdEkpIHsKKyAgICBJbnRlcnNlY3RNYXNrUmVjdChtX0JveCwgbWFza19ib3gsIE1hc2spOworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9UeXBlID09IE1hc2tGKSB7CisgICAgRlhfUkVDVCBuZXdfYm94ID0gbV9Cb3g7CisgICAgbmV3X2JveC5JbnRlcnNlY3QobWFza19ib3gpOworICAgIGlmIChuZXdfYm94LklzRW1wdHkoKSkgeworICAgICAgbV9UeXBlID0gUmVjdEk7CisgICAgICBtX01hc2suU2V0TnVsbCgpOworICAgICAgbV9Cb3ggPSBuZXdfYm94OworICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBDRlhfRElCaXRtYXAqIG5ld19kaWIgPSBtX01hc2suTmV3KCk7CisgICAgQ0ZYX0RJQml0bWFwUmVmIG5ld19tYXNrOworICAgIENGWF9ESUJpdG1hcCogbmV3X2RpYiA9IG5ld19tYXNrLk5ldygpOwogICAgIGlmICghbmV3X2RpYikgewotICAgICAgICByZXR1cm47CisgICAgICByZXR1cm47CiAgICAgfQotICAgIG5ld19kaWItPkNyZWF0ZShtX0JveC5XaWR0aCgpLCBtX0JveC5IZWlnaHQoKSwgRlhESUJfOGJwcE1hc2spOwotICAgIGZvciAoaW50IHJvdyA9IG1fQm94LnRvcDsgcm93IDwgbV9Cb3guYm90dG9tOyByb3cgKyspIHsKLSAgICAgICAgRlhfTFBCWVRFIGRlc3Rfc2NhbiA9IG5ld19kaWItPkdldEJ1ZmZlcigpICsgbmV3X2RpYi0+R2V0UGl0Y2goKSAqIChyb3cgLSBtX0JveC50b3ApOwotICAgICAgICBGWF9MUEJZVEUgc3JjX3NjYW4gPSBtYXNrX2RpYi0+R2V0QnVmZmVyKCkgKyBtYXNrX2RpYi0+R2V0UGl0Y2goKSAqIChyb3cgLSBtYXNrX3JlY3QudG9wKTsKLSAgICAgICAgZm9yIChpbnQgY29sID0gbV9Cb3gubGVmdDsgY29sIDwgbV9Cb3gucmlnaHQ7IGNvbCArKykgewotICAgICAgICAgICAgZGVzdF9zY2FuW2NvbCAtIG1fQm94LmxlZnRdID0gc3JjX3NjYW5bY29sIC0gbWFza19yZWN0LmxlZnRdOwotICAgICAgICB9CisgICAgbmV3X2RpYi0+Q3JlYXRlKG5ld19ib3guV2lkdGgoKSwgbmV3X2JveC5IZWlnaHQoKSwgRlhESUJfOGJwcE1hc2spOworICAgIGNvbnN0IENGWF9ESUJpdG1hcCogb2xkX2RpYiA9IG1fTWFzazsKKyAgICBmb3IgKGludCByb3cgPSBuZXdfYm94LnRvcDsgcm93IDwgbmV3X2JveC5ib3R0b207IHJvdysrKSB7CisgICAgICB1aW50OF90KiBvbGRfc2NhbiA9CisgICAgICAgICAgb2xkX2RpYi0+R2V0QnVmZmVyKCkgKyAocm93IC0gbV9Cb3gudG9wKSAqIG9sZF9kaWItPkdldFBpdGNoKCk7CisgICAgICB1aW50OF90KiBtYXNrX3NjYW4gPQorICAgICAgICAgIG1hc2tfZGliLT5HZXRCdWZmZXIoKSArIChyb3cgLSB0b3ApICogbWFza19kaWItPkdldFBpdGNoKCk7CisgICAgICB1aW50OF90KiBuZXdfc2NhbiA9CisgICAgICAgICAgbmV3X2RpYi0+R2V0QnVmZmVyKCkgKyAocm93IC0gbmV3X2JveC50b3ApICogbmV3X2RpYi0+R2V0UGl0Y2goKTsKKyAgICAgIGZvciAoaW50IGNvbCA9IG5ld19ib3gubGVmdDsgY29sIDwgbmV3X2JveC5yaWdodDsgY29sKyspIHsKKyAgICAgICAgbmV3X3NjYW5bY29sIC0gbmV3X2JveC5sZWZ0XSA9CisgICAgICAgICAgICBvbGRfc2Nhbltjb2wgLSBtX0JveC5sZWZ0XSAqIG1hc2tfc2Nhbltjb2wgLSBsZWZ0XSAvIDI1NTsKKyAgICAgIH0KICAgICB9CisgICAgbV9Cb3ggPSBuZXdfYm94OworICAgIG1fTWFzayA9IG5ld19tYXNrOworICAgIHJldHVybjsKKyAgfQorICBBU1NFUlQoRkFMU0UpOwogfQotdm9pZCBDRlhfQ2xpcFJnbjo6SW50ZXJzZWN0TWFza0YoaW50IGxlZnQsIGludCB0b3AsIENGWF9ESUJpdG1hcFJlZiBNYXNrKQotewotICAgIGNvbnN0IENGWF9ESUJpdG1hcCogbWFza19kaWIgPSBNYXNrOwotICAgIEFTU0VSVChtYXNrX2RpYi0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfOGJwcE1hc2spOwotICAgIEZYX1JFQ1QgbWFza19ib3gobGVmdCwgdG9wLCBsZWZ0ICsgbWFza19kaWItPkdldFdpZHRoKCksIHRvcCArIG1hc2tfZGliLT5HZXRIZWlnaHQoKSk7Ci0gICAgaWYgKG1fVHlwZSA9PSBSZWN0SSkgewotICAgICAgICBJbnRlcnNlY3RNYXNrUmVjdChtX0JveCwgbWFza19ib3gsIE1hc2spOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtX1R5cGUgPT0gTWFza0YpIHsKLSAgICAgICAgRlhfUkVDVCBuZXdfYm94ID0gbV9Cb3g7Ci0gICAgICAgIG5ld19ib3guSW50ZXJzZWN0KG1hc2tfYm94KTsKLSAgICAgICAgaWYgKG5ld19ib3guSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBtX1R5cGUgPSBSZWN0STsKLSAgICAgICAgICAgIG1fTWFzay5TZXROdWxsKCk7Ci0gICAgICAgICAgICBtX0JveCA9IG5ld19ib3g7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0RJQml0bWFwUmVmIG5ld19tYXNrOwotICAgICAgICBDRlhfRElCaXRtYXAqIG5ld19kaWIgPSBuZXdfbWFzay5OZXcoKTsKLSAgICAgICAgaWYgKCFuZXdfZGliKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbmV3X2RpYi0+Q3JlYXRlKG5ld19ib3guV2lkdGgoKSwgbmV3X2JveC5IZWlnaHQoKSwgRlhESUJfOGJwcE1hc2spOwotICAgICAgICBjb25zdCBDRlhfRElCaXRtYXAqIG9sZF9kaWIgPSBtX01hc2s7Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IG5ld19ib3gudG9wOyByb3cgPCBuZXdfYm94LmJvdHRvbTsgcm93ICsrKSB7Ci0gICAgICAgICAgICBGWF9MUEJZVEUgb2xkX3NjYW4gPSBvbGRfZGliLT5HZXRCdWZmZXIoKSArIChyb3cgLSBtX0JveC50b3ApICogb2xkX2RpYi0+R2V0UGl0Y2goKTsKLSAgICAgICAgICAgIEZYX0xQQllURSBtYXNrX3NjYW4gPSBtYXNrX2RpYi0+R2V0QnVmZmVyKCkgKyAocm93IC0gdG9wKSAqIG1hc2tfZGliLT5HZXRQaXRjaCgpOwotICAgICAgICAgICAgRlhfTFBCWVRFIG5ld19zY2FuID0gbmV3X2RpYi0+R2V0QnVmZmVyKCkgKyAocm93IC0gbmV3X2JveC50b3ApICogbmV3X2RpYi0+R2V0UGl0Y2goKTsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IG5ld19ib3gubGVmdDsgY29sIDwgbmV3X2JveC5yaWdodDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgbmV3X3NjYW5bY29sIC0gbmV3X2JveC5sZWZ0XSA9IG9sZF9zY2FuW2NvbCAtIG1fQm94LmxlZnRdICogbWFza19zY2FuW2NvbCAtIGxlZnRdIC8gMjU1OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1fQm94ID0gbmV3X2JveDsKLSAgICAgICAgbV9NYXNrID0gbmV3X21hc2s7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQVNTRVJUKEZBTFNFKTsKK0NGWF9QYXRoRGF0YTo6Q0ZYX1BhdGhEYXRhKCkgeworICBtX1BvaW50Q291bnQgPSBtX0FsbG9jQ291bnQgPSAwOworICBtX3BQb2ludHMgPSBOVUxMOwogfQotQ0ZYX1BhdGhEYXRhOjpDRlhfUGF0aERhdGEoKQotewotICAgIG1fUG9pbnRDb3VudCA9IG1fQWxsb2NDb3VudCA9IDA7Ci0gICAgbV9wUG9pbnRzID0gTlVMTDsKK0NGWF9QYXRoRGF0YTo6fkNGWF9QYXRoRGF0YSgpIHsKKyAgRlhfRnJlZShtX3BQb2ludHMpOwogfQotQ0ZYX1BhdGhEYXRhOjp+Q0ZYX1BhdGhEYXRhKCkKLXsKLSAgICBpZiAobV9wUG9pbnRzKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wUG9pbnRzKTsKLSAgICB9Cit2b2lkIENGWF9QYXRoRGF0YTo6U2V0UG9pbnRDb3VudChpbnQgblBvaW50cykgeworICBtX1BvaW50Q291bnQgPSBuUG9pbnRzOworICBpZiAobV9BbGxvY0NvdW50IDwgblBvaW50cykgeworICAgIEZYX0ZyZWUobV9wUG9pbnRzKTsKKyAgICBtX3BQb2ludHMgPSBGWF9BbGxvYyhGWF9QQVRIUE9JTlQsIG5Qb2ludHMpOworICAgIG1fQWxsb2NDb3VudCA9IG5Qb2ludHM7CisgIH0KIH0KLXZvaWQgQ0ZYX1BhdGhEYXRhOjpTZXRQb2ludENvdW50KGludCBuUG9pbnRzKQotewotICAgIG1fUG9pbnRDb3VudCA9IG5Qb2ludHM7Ci0gICAgaWYgKG1fQWxsb2NDb3VudCA8IG5Qb2ludHMpIHsKLSAgICAgICAgaWYgKG1fcFBvaW50cykgewotICAgICAgICAgICAgRlhfRnJlZShtX3BQb2ludHMpOwotICAgICAgICAgICAgbV9wUG9pbnRzID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBtX3BQb2ludHMgPSBGWF9BbGxvYyhGWF9QQVRIUE9JTlQsIG5Qb2ludHMpOwotICAgICAgICBtX0FsbG9jQ291bnQgPSBuUG9pbnRzOwotICAgIH0KLX0KLXZvaWQgQ0ZYX1BhdGhEYXRhOjpBbGxvY1BvaW50Q291bnQoaW50IG5Qb2ludHMpCi17Ci0gICAgaWYgKG1fQWxsb2NDb3VudCA8IG5Qb2ludHMpIHsKLSAgICAgICAgRlhfUEFUSFBPSU5UKiBwTmV3QnVmID0gRlhfQWxsb2MoRlhfUEFUSFBPSU5ULCBuUG9pbnRzKTsKLSAgICAgICAgaWYgKG1fUG9pbnRDb3VudCkgewotICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIocE5ld0J1ZiwgbV9wUG9pbnRzLCBtX1BvaW50Q291bnQgKiBzaXplb2YoRlhfUEFUSFBPSU5UKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fcFBvaW50cykgewotICAgICAgICAgICAgRlhfRnJlZShtX3BQb2ludHMpOwotICAgICAgICB9Ci0gICAgICAgIG1fcFBvaW50cyA9IHBOZXdCdWY7Ci0gICAgICAgIG1fQWxsb2NDb3VudCA9IG5Qb2ludHM7Ci0gICAgfQotfQotQ0ZYX1BhdGhEYXRhOjpDRlhfUGF0aERhdGEoY29uc3QgQ0ZYX1BhdGhEYXRhJiBzcmMpCi17Ci0gICAgbV9Qb2ludENvdW50ID0gbV9BbGxvY0NvdW50ID0gc3JjLm1fUG9pbnRDb3VudDsKLSAgICBtX3BQb2ludHMgPSBGWF9BbGxvYyhGWF9QQVRIUE9JTlQsIHNyYy5tX1BvaW50Q291bnQpOwotICAgIEZYU1lTX21lbWNweTMyKG1fcFBvaW50cywgc3JjLm1fcFBvaW50cywgc2l6ZW9mKEZYX1BBVEhQT0lOVCkgKiBtX1BvaW50Q291bnQpOwotfQotdm9pZCBDRlhfUGF0aERhdGE6OlRyaW1Qb2ludHMoaW50IG5Qb2ludHMpCi17Ci0gICAgaWYgKG1fUG9pbnRDb3VudCA8PSBuUG9pbnRzKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgU2V0UG9pbnRDb3VudChuUG9pbnRzKTsKLX0KLXZvaWQgQ0ZYX1BhdGhEYXRhOjpBZGRQb2ludENvdW50KGludCBhZGRQb2ludHMpCi17Ci0gICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxpbnQ+IHNhZmVfbmV3X2NvdW50ID0gbV9Qb2ludENvdW50OwotICAgIHNhZmVfbmV3X2NvdW50ICs9IGFkZFBvaW50czsKLSAgICBpbnQgbmV3X2NvdW50ID0gc2FmZV9uZXdfY291bnQuVmFsdWVPckRpZSgpOwotICAgIEFsbG9jUG9pbnRDb3VudChuZXdfY291bnQpOwotICAgIG1fUG9pbnRDb3VudCA9IG5ld19jb3VudDsKLX0KLXZvaWQgQ0ZYX1BhdGhEYXRhOjpBcHBlbmQoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwU3JjLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4KQotewotICAgIGludCBvbGRfY291bnQgPSBtX1BvaW50Q291bnQ7Ci0gICAgQWRkUG9pbnRDb3VudChwU3JjLT5tX1BvaW50Q291bnQpOwotICAgIEZYU1lTX21lbWNweTMyKG1fcFBvaW50cyArIG9sZF9jb3VudCwgcFNyYy0+bV9wUG9pbnRzLCBwU3JjLT5tX1BvaW50Q291bnQgKiBzaXplb2YoRlhfUEFUSFBPSU5UKSk7Ci0gICAgaWYgKHBNYXRyaXgpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwU3JjLT5tX1BvaW50Q291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybShtX3BQb2ludHNbb2xkX2NvdW50ICsgaV0ubV9Qb2ludFgsIG1fcFBvaW50c1tvbGRfY291bnQgKyBpXS5tX1BvaW50WSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci12b2lkIENGWF9QYXRoRGF0YTo6U2V0UG9pbnQoaW50IGluZGV4LCBGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBpbnQgZmxhZykKLXsKLSAgICBBU1NFUlQoaW5kZXggPCBtX1BvaW50Q291bnQpOwotICAgIG1fcFBvaW50c1tpbmRleF0ubV9Qb2ludFggPSB4OwotICAgIG1fcFBvaW50c1tpbmRleF0ubV9Qb2ludFkgPSB5OwotICAgIG1fcFBvaW50c1tpbmRleF0ubV9GbGFnID0gZmxhZzsKLX0KLXZvaWQgQ0ZYX1BhdGhEYXRhOjpBcHBlbmRSZWN0KEZYX0ZMT0FUIGxlZnQsIEZYX0ZMT0FUIGJvdHRvbSwgRlhfRkxPQVQgcmlnaHQsIEZYX0ZMT0FUIHRvcCkKLXsKLSAgICBpbnQgb2xkX2NvdW50ID0gbV9Qb2ludENvdW50OwotICAgIEFkZFBvaW50Q291bnQoNSk7Ci0gICAgRlhfUEFUSFBPSU5UKiBwUG9pbnRzID0gbV9wUG9pbnRzICsgb2xkX2NvdW50OwotICAgIHBQb2ludHNbMF0ubV9Qb2ludFggPSBwUG9pbnRzWzFdLm1fUG9pbnRYID0gcFBvaW50c1s0XS5tX1BvaW50WCA9IGxlZnQ7Ci0gICAgcFBvaW50c1syXS5tX1BvaW50WCA9IHBQb2ludHNbM10ubV9Qb2ludFggPSByaWdodDsKLSAgICBwUG9pbnRzWzBdLm1fUG9pbnRZID0gcFBvaW50c1szXS5tX1BvaW50WSA9IHBQb2ludHNbNF0ubV9Qb2ludFkgPSBib3R0b207Ci0gICAgcFBvaW50c1sxXS5tX1BvaW50WSA9IHBQb2ludHNbMl0ubV9Qb2ludFkgPSB0b3A7Ci0gICAgcFBvaW50c1swXS5tX0ZsYWcgPSBGWFBUX01PVkVUTzsKLSAgICBwUG9pbnRzWzFdLm1fRmxhZyA9IHBQb2ludHNbMl0ubV9GbGFnID0gcFBvaW50c1szXS5tX0ZsYWcgPSBGWFBUX0xJTkVUTzsKLSAgICBwUG9pbnRzWzRdLm1fRmxhZyA9IEZYUFRfTElORVRPIHwgRlhQVF9DTE9TRUZJR1VSRTsKLX0KLUNGWF9GbG9hdFJlY3QgQ0ZYX1BhdGhEYXRhOjpHZXRCb3VuZGluZ0JveCgpIGNvbnN0Ci17Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByZWN0Owordm9pZCBDRlhfUGF0aERhdGE6OkFsbG9jUG9pbnRDb3VudChpbnQgblBvaW50cykgeworICBpZiAobV9BbGxvY0NvdW50IDwgblBvaW50cykgeworICAgIEZYX1BBVEhQT0lOVCogcE5ld0J1ZiA9IEZYX0FsbG9jKEZYX1BBVEhQT0lOVCwgblBvaW50cyk7CiAgICAgaWYgKG1fUG9pbnRDb3VudCkgewotICAgICAgICByZWN0LkluaXRSZWN0KG1fcFBvaW50c1swXS5tX1BvaW50WCwgbV9wUG9pbnRzWzBdLm1fUG9pbnRZKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBtX1BvaW50Q291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIHJlY3QuVXBkYXRlUmVjdChtX3BQb2ludHNbaV0ubV9Qb2ludFgsIG1fcFBvaW50c1tpXS5tX1BvaW50WSk7Ci0gICAgICAgIH0KKyAgICAgIEZYU1lTX21lbWNweShwTmV3QnVmLCBtX3BQb2ludHMsIG1fUG9pbnRDb3VudCAqIHNpemVvZihGWF9QQVRIUE9JTlQpKTsKICAgICB9Ci0gICAgcmV0dXJuIHJlY3Q7CisgICAgRlhfRnJlZShtX3BQb2ludHMpOworICAgIG1fcFBvaW50cyA9IHBOZXdCdWY7CisgICAgbV9BbGxvY0NvdW50ID0gblBvaW50czsKKyAgfQogfQotc3RhdGljIHZvaWQgX1VwZGF0ZUxpbmVFbmRQb2ludHMoQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwgRlhfRkxPQVQgc3RhcnRfeCwgRlhfRkxPQVQgc3RhcnRfeSwgRlhfRkxPQVQgZW5kX3gsIEZYX0ZMT0FUIGVuZF95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaHcpCi17Ci0gICAgaWYgKHN0YXJ0X3ggPT0gZW5kX3gpIHsKLSAgICAgICAgaWYgKHN0YXJ0X3kgPT0gZW5kX3kpIHsKLSAgICAgICAgICAgIHJlY3QuVXBkYXRlUmVjdChlbmRfeCArIGh3LCBlbmRfeSArIGh3KTsKLSAgICAgICAgICAgIHJlY3QuVXBkYXRlUmVjdChlbmRfeCAtIGh3LCBlbmRfeSAtIGh3KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBGWF9GTE9BVCBwb2ludF95OwotICAgICAgICBpZiAoZW5kX3kgPCBzdGFydF95KSB7Ci0gICAgICAgICAgICBwb2ludF95ID0gZW5kX3kgLSBodzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBvaW50X3kgPSBlbmRfeSArIGh3OwotICAgICAgICB9Ci0gICAgICAgIHJlY3QuVXBkYXRlUmVjdChlbmRfeCArIGh3LCBwb2ludF95KTsKLSAgICAgICAgcmVjdC5VcGRhdGVSZWN0KGVuZF94IC0gaHcsIHBvaW50X3kpOwotICAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChzdGFydF95ID09IGVuZF95KSB7Ci0gICAgICAgIEZYX0ZMT0FUIHBvaW50X3g7Ci0gICAgICAgIGlmIChlbmRfeCA8IHN0YXJ0X3gpIHsKLSAgICAgICAgICAgIHBvaW50X3ggPSBlbmRfeCAtIGh3OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcG9pbnRfeCA9IGVuZF94ICsgaHc7Ci0gICAgICAgIH0KLSAgICAgICAgcmVjdC5VcGRhdGVSZWN0KHBvaW50X3gsIGVuZF95ICsgaHcpOwotICAgICAgICByZWN0LlVwZGF0ZVJlY3QocG9pbnRfeCwgZW5kX3kgLSBodyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfRkxPQVQgZHggPSBlbmRfeCAtIHN0YXJ0X3g7Ci0gICAgRlhfRkxPQVQgZHkgPSBlbmRfeSAtIHN0YXJ0X3k7Ci0gICAgRlhfRkxPQVQgbGwgPSBGWFNZU19zcXJ0MihkeCwgZHkpOwotICAgIEZYX0ZMT0FUIG14ID0gZW5kX3ggKyBodyAqIGR4IC8gbGw7Ci0gICAgRlhfRkxPQVQgbXkgPSBlbmRfeSArIGh3ICogZHkgLyBsbDsKLSAgICBGWF9GTE9BVCBkeDEgPSBodyAqIGR5IC8gbGw7Ci0gICAgRlhfRkxPQVQgZHkxID0gaHcgKiBkeCAvIGxsOwotICAgIHJlY3QuVXBkYXRlUmVjdChteCAtIGR4MSwgbXkgKyBkeTEpOwotICAgIHJlY3QuVXBkYXRlUmVjdChteCArIGR4MSwgbXkgLSBkeTEpOworQ0ZYX1BhdGhEYXRhOjpDRlhfUGF0aERhdGEoY29uc3QgQ0ZYX1BhdGhEYXRhJiBzcmMpIHsKKyAgbV9Qb2ludENvdW50ID0gbV9BbGxvY0NvdW50ID0gc3JjLm1fUG9pbnRDb3VudDsKKyAgbV9wUG9pbnRzID0gRlhfQWxsb2MoRlhfUEFUSFBPSU5ULCBzcmMubV9Qb2ludENvdW50KTsKKyAgRlhTWVNfbWVtY3B5KG1fcFBvaW50cywgc3JjLm1fcFBvaW50cywgc2l6ZW9mKEZYX1BBVEhQT0lOVCkgKiBtX1BvaW50Q291bnQpOwogfQotc3RhdGljIHZvaWQgX1VwZGF0ZUxpbmVKb2luUG9pbnRzKENGWF9GbG9hdFJlY3QmIHJlY3QsIEZYX0ZMT0FUIHN0YXJ0X3gsIEZYX0ZMT0FUIHN0YXJ0X3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbWlkZGxlX3gsIEZYX0ZMT0FUIG1pZGRsZV95LCBGWF9GTE9BVCBlbmRfeCwgRlhfRkxPQVQgZW5kX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaGFsZl93aWR0aCwgRlhfRkxPQVQgbWl0ZXJfbGltaXQpCi17Ci0gICAgRlhfRkxPQVQgc3RhcnRfayA9IDAsIHN0YXJ0X2MgPSAwLCBlbmRfayA9IDAsIGVuZF9jID0gMCwgc3RhcnRfbGVuID0gMCwgc3RhcnRfZGMgPSAwLCBlbmRfbGVuID0gMCwgZW5kX2RjID0gMDsKLSAgICBGWF9CT09MIGJTdGFydFZlcnQgPSBGWFNZU19mYWJzKHN0YXJ0X3ggLSBtaWRkbGVfeCkgPCAxLjBmIC8gMjA7Ci0gICAgRlhfQk9PTCBiRW5kVmVydCA9IEZYU1lTX2ZhYnMobWlkZGxlX3ggLSBlbmRfeCkgPCAxLjBmIC8gMjA7Ci0gICAgaWYgKGJTdGFydFZlcnQgJiYgYkVuZFZlcnQpIHsKLSAgICAgICAgaW50IHN0YXJ0X2RpciA9IG1pZGRsZV95ID4gc3RhcnRfeSA/IDEgOiAtMTsKLSAgICAgICAgRlhfRkxPQVQgcG9pbnRfeSA9IG1pZGRsZV95ICsgaGFsZl93aWR0aCAqIHN0YXJ0X2RpcjsKLSAgICAgICAgcmVjdC5VcGRhdGVSZWN0KG1pZGRsZV94ICsgaGFsZl93aWR0aCwgcG9pbnRfeSk7Ci0gICAgICAgIHJlY3QuVXBkYXRlUmVjdChtaWRkbGVfeCAtIGhhbGZfd2lkdGgsIHBvaW50X3kpOwotICAgICAgICByZXR1cm47Cit2b2lkIENGWF9QYXRoRGF0YTo6VHJpbVBvaW50cyhpbnQgblBvaW50cykgeworICBpZiAobV9Qb2ludENvdW50IDw9IG5Qb2ludHMpIHsKKyAgICByZXR1cm47CisgIH0KKyAgU2V0UG9pbnRDb3VudChuUG9pbnRzKTsKK30KK3ZvaWQgQ0ZYX1BhdGhEYXRhOjpBZGRQb2ludENvdW50KGludCBhZGRQb2ludHMpIHsKKyAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxpbnQ+IHNhZmVfbmV3X2NvdW50ID0gbV9Qb2ludENvdW50OworICBzYWZlX25ld19jb3VudCArPSBhZGRQb2ludHM7CisgIGludCBuZXdfY291bnQgPSBzYWZlX25ld19jb3VudC5WYWx1ZU9yRGllKCk7CisgIEFsbG9jUG9pbnRDb3VudChuZXdfY291bnQpOworICBtX1BvaW50Q291bnQgPSBuZXdfY291bnQ7Cit9Cit2b2lkIENGWF9QYXRoRGF0YTo6QXBwZW5kKGNvbnN0IENGWF9QYXRoRGF0YSogcFNyYywgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgeworICBpbnQgb2xkX2NvdW50ID0gbV9Qb2ludENvdW50OworICBBZGRQb2ludENvdW50KHBTcmMtPm1fUG9pbnRDb3VudCk7CisgIEZYU1lTX21lbWNweShtX3BQb2ludHMgKyBvbGRfY291bnQsIHBTcmMtPm1fcFBvaW50cywKKyAgICAgICAgICAgICAgIHBTcmMtPm1fUG9pbnRDb3VudCAqIHNpemVvZihGWF9QQVRIUE9JTlQpKTsKKyAgaWYgKHBNYXRyaXgpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBTcmMtPm1fUG9pbnRDb3VudDsgaSsrKSB7CisgICAgICBwTWF0cml4LT5UcmFuc2Zvcm0obV9wUG9pbnRzW29sZF9jb3VudCArIGldLm1fUG9pbnRYLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFBvaW50c1tvbGRfY291bnQgKyBpXS5tX1BvaW50WSk7CiAgICAgfQotICAgIGlmICghYlN0YXJ0VmVydCkgewotICAgICAgICBzdGFydF9rID0gRlhTWVNfRGl2KG1pZGRsZV95IC0gc3RhcnRfeSwgbWlkZGxlX3ggLSBzdGFydF94KTsKLSAgICAgICAgc3RhcnRfYyA9IG1pZGRsZV95IC0gRlhTWVNfTXVsKHN0YXJ0X2ssIG1pZGRsZV94KTsKLSAgICAgICAgc3RhcnRfbGVuID0gRlhTWVNfc3FydDIoc3RhcnRfeCAtIG1pZGRsZV94LCBzdGFydF95IC0gbWlkZGxlX3kpOwotICAgICAgICBzdGFydF9kYyA9IChGWF9GTE9BVClGWFNZU19mYWJzKEZYU1lTX011bERpdihoYWxmX3dpZHRoLCBzdGFydF9sZW4sIHN0YXJ0X3ggLSBtaWRkbGVfeCkpOworICB9Cit9Cit2b2lkIENGWF9QYXRoRGF0YTo6U2V0UG9pbnQoaW50IGluZGV4LCBGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBpbnQgZmxhZykgeworICBBU1NFUlQoaW5kZXggPCBtX1BvaW50Q291bnQpOworICBtX3BQb2ludHNbaW5kZXhdLm1fUG9pbnRYID0geDsKKyAgbV9wUG9pbnRzW2luZGV4XS5tX1BvaW50WSA9IHk7CisgIG1fcFBvaW50c1tpbmRleF0ubV9GbGFnID0gZmxhZzsKK30KK3ZvaWQgQ0ZYX1BhdGhEYXRhOjpBcHBlbmRSZWN0KEZYX0ZMT0FUIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRvcCkgeworICBpbnQgb2xkX2NvdW50ID0gbV9Qb2ludENvdW50OworICBBZGRQb2ludENvdW50KDUpOworICBGWF9QQVRIUE9JTlQqIHBQb2ludHMgPSBtX3BQb2ludHMgKyBvbGRfY291bnQ7CisgIHBQb2ludHNbMF0ubV9Qb2ludFggPSBwUG9pbnRzWzFdLm1fUG9pbnRYID0gcFBvaW50c1s0XS5tX1BvaW50WCA9IGxlZnQ7CisgIHBQb2ludHNbMl0ubV9Qb2ludFggPSBwUG9pbnRzWzNdLm1fUG9pbnRYID0gcmlnaHQ7CisgIHBQb2ludHNbMF0ubV9Qb2ludFkgPSBwUG9pbnRzWzNdLm1fUG9pbnRZID0gcFBvaW50c1s0XS5tX1BvaW50WSA9IGJvdHRvbTsKKyAgcFBvaW50c1sxXS5tX1BvaW50WSA9IHBQb2ludHNbMl0ubV9Qb2ludFkgPSB0b3A7CisgIHBQb2ludHNbMF0ubV9GbGFnID0gRlhQVF9NT1ZFVE87CisgIHBQb2ludHNbMV0ubV9GbGFnID0gcFBvaW50c1syXS5tX0ZsYWcgPSBwUG9pbnRzWzNdLm1fRmxhZyA9IEZYUFRfTElORVRPOworICBwUG9pbnRzWzRdLm1fRmxhZyA9IEZYUFRfTElORVRPIHwgRlhQVF9DTE9TRUZJR1VSRTsKK30KK0NGWF9GbG9hdFJlY3QgQ0ZYX1BhdGhEYXRhOjpHZXRCb3VuZGluZ0JveCgpIGNvbnN0IHsKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0OworICBpZiAobV9Qb2ludENvdW50KSB7CisgICAgcmVjdC5Jbml0UmVjdChtX3BQb2ludHNbMF0ubV9Qb2ludFgsIG1fcFBvaW50c1swXS5tX1BvaW50WSk7CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBtX1BvaW50Q291bnQ7IGkrKykgeworICAgICAgcmVjdC5VcGRhdGVSZWN0KG1fcFBvaW50c1tpXS5tX1BvaW50WCwgbV9wUG9pbnRzW2ldLm1fUG9pbnRZKTsKICAgICB9Ci0gICAgaWYgKCFiRW5kVmVydCkgewotICAgICAgICBlbmRfayA9IEZYU1lTX0RpdihlbmRfeSAtIG1pZGRsZV95LCBlbmRfeCAtIG1pZGRsZV94KTsKLSAgICAgICAgZW5kX2MgPSBtaWRkbGVfeSAtIEZYU1lTX011bChlbmRfaywgbWlkZGxlX3gpOwotICAgICAgICBlbmRfbGVuID0gRlhTWVNfc3FydDIoZW5kX3ggLSBtaWRkbGVfeCwgZW5kX3kgLSBtaWRkbGVfeSk7Ci0gICAgICAgIGVuZF9kYyA9IChGWF9GTE9BVClGWFNZU19mYWJzKEZYU1lTX011bERpdihoYWxmX3dpZHRoLCBlbmRfbGVuLCBlbmRfeCAtIG1pZGRsZV94KSk7CisgIH0KKyAgcmV0dXJuIHJlY3Q7Cit9CitzdGF0aWMgdm9pZCBfVXBkYXRlTGluZUVuZFBvaW50cyhDRlhfRmxvYXRSZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBlbmRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGVuZF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaHcpIHsKKyAgaWYgKHN0YXJ0X3ggPT0gZW5kX3gpIHsKKyAgICBpZiAoc3RhcnRfeSA9PSBlbmRfeSkgeworICAgICAgcmVjdC5VcGRhdGVSZWN0KGVuZF94ICsgaHcsIGVuZF95ICsgaHcpOworICAgICAgcmVjdC5VcGRhdGVSZWN0KGVuZF94IC0gaHcsIGVuZF95IC0gaHcpOworICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBpZiAoYlN0YXJ0VmVydCkgewotICAgICAgICBGWF9GTE9BVCBvdXRzaWRlX3ggPSBzdGFydF94OwotICAgICAgICBpZiAoZW5kX3ggPCBzdGFydF94KSB7Ci0gICAgICAgICAgICBvdXRzaWRlX3ggKz0gaGFsZl93aWR0aDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dHNpZGVfeCAtPSBoYWxmX3dpZHRoOwotICAgICAgICB9Ci0gICAgICAgIEZYX0ZMT0FUIG91dHNpZGVfeTsKLSAgICAgICAgaWYgKHN0YXJ0X3kgPCBGWFNZU19NdWwoZW5kX2ssIHN0YXJ0X3gpICsgZW5kX2MpIHsKLSAgICAgICAgICAgIG91dHNpZGVfeSA9IEZYU1lTX011bChlbmRfaywgb3V0c2lkZV94KSArIGVuZF9jICsgZW5kX2RjOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0c2lkZV95ID0gRlhTWVNfTXVsKGVuZF9rLCBvdXRzaWRlX3gpICsgZW5kX2MgLSBlbmRfZGM7Ci0gICAgICAgIH0KLSAgICAgICAgcmVjdC5VcGRhdGVSZWN0KG91dHNpZGVfeCwgb3V0c2lkZV95KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoYkVuZFZlcnQpIHsKLSAgICAgICAgRlhfRkxPQVQgb3V0c2lkZV94ID0gZW5kX3g7Ci0gICAgICAgIGlmIChzdGFydF94IDwgZW5kX3gpIHsKLSAgICAgICAgICAgIG91dHNpZGVfeCArPSBoYWxmX3dpZHRoOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0c2lkZV94IC09IGhhbGZfd2lkdGg7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRkxPQVQgb3V0c2lkZV95OwotICAgICAgICBpZiAoZW5kX3kgPCBGWFNZU19NdWwoc3RhcnRfaywgZW5kX3gpICsgc3RhcnRfYykgewotICAgICAgICAgICAgb3V0c2lkZV95ID0gRlhTWVNfTXVsKHN0YXJ0X2ssIG91dHNpZGVfeCkgKyBzdGFydF9jICsgc3RhcnRfZGM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXRzaWRlX3kgPSBGWFNZU19NdWwoc3RhcnRfaywgb3V0c2lkZV94KSArIHN0YXJ0X2MgLSBzdGFydF9kYzsKLSAgICAgICAgfQotICAgICAgICByZWN0LlVwZGF0ZVJlY3Qob3V0c2lkZV94LCBvdXRzaWRlX3kpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChGWFNZU19mYWJzKHN0YXJ0X2sgLSBlbmRfaykgPCAxLjBmIC8gMjApIHsKLSAgICAgICAgaW50IHN0YXJ0X2RpciA9IG1pZGRsZV94ID4gc3RhcnRfeCA/IDEgOiAtMTsKLSAgICAgICAgaW50IGVuZF9kaXIgPSBlbmRfeCA+IG1pZGRsZV94ID8gMSA6IC0xOwotICAgICAgICBpZiAoc3RhcnRfZGlyID09IGVuZF9kaXIpIHsKLSAgICAgICAgICAgIF9VcGRhdGVMaW5lRW5kUG9pbnRzKHJlY3QsIG1pZGRsZV94LCBtaWRkbGVfeSwgZW5kX3gsIGVuZF95LCBoYWxmX3dpZHRoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIF9VcGRhdGVMaW5lRW5kUG9pbnRzKHJlY3QsIHN0YXJ0X3gsIHN0YXJ0X3ksIG1pZGRsZV94LCBtaWRkbGVfeSwgaGFsZl93aWR0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9GTE9BVCBzdGFydF9vdXRzaWRlX2MgPSBzdGFydF9jOwotICAgIGlmIChlbmRfeSA8IEZYU1lTX011bChzdGFydF9rLCBlbmRfeCkgKyBzdGFydF9jKSB7Ci0gICAgICAgIHN0YXJ0X291dHNpZGVfYyArPSBzdGFydF9kYzsKKyAgICBGWF9GTE9BVCBwb2ludF95OworICAgIGlmIChlbmRfeSA8IHN0YXJ0X3kpIHsKKyAgICAgIHBvaW50X3kgPSBlbmRfeSAtIGh3OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXJ0X291dHNpZGVfYyAtPSBzdGFydF9kYzsKKyAgICAgIHBvaW50X3kgPSBlbmRfeSArIGh3OwogICAgIH0KLSAgICBGWF9GTE9BVCBlbmRfb3V0c2lkZV9jID0gZW5kX2M7CisgICAgcmVjdC5VcGRhdGVSZWN0KGVuZF94ICsgaHcsIHBvaW50X3kpOworICAgIHJlY3QuVXBkYXRlUmVjdChlbmRfeCAtIGh3LCBwb2ludF95KTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHN0YXJ0X3kgPT0gZW5kX3kpIHsKKyAgICBGWF9GTE9BVCBwb2ludF94OworICAgIGlmIChlbmRfeCA8IHN0YXJ0X3gpIHsKKyAgICAgIHBvaW50X3ggPSBlbmRfeCAtIGh3OworICAgIH0gZWxzZSB7CisgICAgICBwb2ludF94ID0gZW5kX3ggKyBodzsKKyAgICB9CisgICAgcmVjdC5VcGRhdGVSZWN0KHBvaW50X3gsIGVuZF95ICsgaHcpOworICAgIHJlY3QuVXBkYXRlUmVjdChwb2ludF94LCBlbmRfeSAtIGh3KTsKKyAgICByZXR1cm47CisgIH0KKyAgRlhfRkxPQVQgZHggPSBlbmRfeCAtIHN0YXJ0X3g7CisgIEZYX0ZMT0FUIGR5ID0gZW5kX3kgLSBzdGFydF95OworICBGWF9GTE9BVCBsbCA9IEZYU1lTX3NxcnQyKGR4LCBkeSk7CisgIEZYX0ZMT0FUIG14ID0gZW5kX3ggKyBodyAqIGR4IC8gbGw7CisgIEZYX0ZMT0FUIG15ID0gZW5kX3kgKyBodyAqIGR5IC8gbGw7CisgIEZYX0ZMT0FUIGR4MSA9IGh3ICogZHkgLyBsbDsKKyAgRlhfRkxPQVQgZHkxID0gaHcgKiBkeCAvIGxsOworICByZWN0LlVwZGF0ZVJlY3QobXggLSBkeDEsIG15ICsgZHkxKTsKKyAgcmVjdC5VcGRhdGVSZWN0KG14ICsgZHgxLCBteSAtIGR5MSk7Cit9CitzdGF0aWMgdm9pZCBfVXBkYXRlTGluZUpvaW5Qb2ludHMoQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzdGFydF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbWlkZGxlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbWlkZGxlX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZW5kX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZW5kX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaGFsZl93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBtaXRlcl9saW1pdCkgeworICBGWF9GTE9BVCBzdGFydF9rID0gMCwgc3RhcnRfYyA9IDAsIGVuZF9rID0gMCwgZW5kX2MgPSAwLCBzdGFydF9sZW4gPSAwLAorICAgICAgICAgICBzdGFydF9kYyA9IDAsIGVuZF9sZW4gPSAwLCBlbmRfZGMgPSAwOworICBGWF9CT09MIGJTdGFydFZlcnQgPSBGWFNZU19mYWJzKHN0YXJ0X3ggLSBtaWRkbGVfeCkgPCAxLjBmIC8gMjA7CisgIEZYX0JPT0wgYkVuZFZlcnQgPSBGWFNZU19mYWJzKG1pZGRsZV94IC0gZW5kX3gpIDwgMS4wZiAvIDIwOworICBpZiAoYlN0YXJ0VmVydCAmJiBiRW5kVmVydCkgeworICAgIGludCBzdGFydF9kaXIgPSBtaWRkbGVfeSA+IHN0YXJ0X3kgPyAxIDogLTE7CisgICAgRlhfRkxPQVQgcG9pbnRfeSA9IG1pZGRsZV95ICsgaGFsZl93aWR0aCAqIHN0YXJ0X2RpcjsKKyAgICByZWN0LlVwZGF0ZVJlY3QobWlkZGxlX3ggKyBoYWxmX3dpZHRoLCBwb2ludF95KTsKKyAgICByZWN0LlVwZGF0ZVJlY3QobWlkZGxlX3ggLSBoYWxmX3dpZHRoLCBwb2ludF95KTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFiU3RhcnRWZXJ0KSB7CisgICAgc3RhcnRfayA9IEZYU1lTX0RpdihtaWRkbGVfeSAtIHN0YXJ0X3ksIG1pZGRsZV94IC0gc3RhcnRfeCk7CisgICAgc3RhcnRfYyA9IG1pZGRsZV95IC0gRlhTWVNfTXVsKHN0YXJ0X2ssIG1pZGRsZV94KTsKKyAgICBzdGFydF9sZW4gPSBGWFNZU19zcXJ0MihzdGFydF94IC0gbWlkZGxlX3gsIHN0YXJ0X3kgLSBtaWRkbGVfeSk7CisgICAgc3RhcnRfZGMgPSAoRlhfRkxPQVQpRlhTWVNfZmFicygKKyAgICAgICAgRlhTWVNfTXVsRGl2KGhhbGZfd2lkdGgsIHN0YXJ0X2xlbiwgc3RhcnRfeCAtIG1pZGRsZV94KSk7CisgIH0KKyAgaWYgKCFiRW5kVmVydCkgeworICAgIGVuZF9rID0gRlhTWVNfRGl2KGVuZF95IC0gbWlkZGxlX3ksIGVuZF94IC0gbWlkZGxlX3gpOworICAgIGVuZF9jID0gbWlkZGxlX3kgLSBGWFNZU19NdWwoZW5kX2ssIG1pZGRsZV94KTsKKyAgICBlbmRfbGVuID0gRlhTWVNfc3FydDIoZW5kX3ggLSBtaWRkbGVfeCwgZW5kX3kgLSBtaWRkbGVfeSk7CisgICAgZW5kX2RjID0gKEZYX0ZMT0FUKUZYU1lTX2ZhYnMoCisgICAgICAgIEZYU1lTX011bERpdihoYWxmX3dpZHRoLCBlbmRfbGVuLCBlbmRfeCAtIG1pZGRsZV94KSk7CisgIH0KKyAgaWYgKGJTdGFydFZlcnQpIHsKKyAgICBGWF9GTE9BVCBvdXRzaWRlX3ggPSBzdGFydF94OworICAgIGlmIChlbmRfeCA8IHN0YXJ0X3gpIHsKKyAgICAgIG91dHNpZGVfeCArPSBoYWxmX3dpZHRoOworICAgIH0gZWxzZSB7CisgICAgICBvdXRzaWRlX3ggLT0gaGFsZl93aWR0aDsKKyAgICB9CisgICAgRlhfRkxPQVQgb3V0c2lkZV95OwogICAgIGlmIChzdGFydF95IDwgRlhTWVNfTXVsKGVuZF9rLCBzdGFydF94KSArIGVuZF9jKSB7Ci0gICAgICAgIGVuZF9vdXRzaWRlX2MgKz0gZW5kX2RjOworICAgICAgb3V0c2lkZV95ID0gRlhTWVNfTXVsKGVuZF9rLCBvdXRzaWRlX3gpICsgZW5kX2MgKyBlbmRfZGM7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZW5kX291dHNpZGVfYyAtPSBlbmRfZGM7CisgICAgICBvdXRzaWRlX3kgPSBGWFNZU19NdWwoZW5kX2ssIG91dHNpZGVfeCkgKyBlbmRfYyAtIGVuZF9kYzsKICAgICB9Ci0gICAgRlhfRkxPQVQgam9pbl94ID0gRlhTWVNfRGl2KGVuZF9vdXRzaWRlX2MgLSBzdGFydF9vdXRzaWRlX2MsIHN0YXJ0X2sgLSBlbmRfayk7Ci0gICAgRlhfRkxPQVQgam9pbl95ID0gRlhTWVNfTXVsKHN0YXJ0X2ssIGpvaW5feCkgKyBzdGFydF9vdXRzaWRlX2M7Ci0gICAgcmVjdC5VcGRhdGVSZWN0KGpvaW5feCwgam9pbl95KTsKKyAgICByZWN0LlVwZGF0ZVJlY3Qob3V0c2lkZV94LCBvdXRzaWRlX3kpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoYkVuZFZlcnQpIHsKKyAgICBGWF9GTE9BVCBvdXRzaWRlX3ggPSBlbmRfeDsKKyAgICBpZiAoc3RhcnRfeCA8IGVuZF94KSB7CisgICAgICBvdXRzaWRlX3ggKz0gaGFsZl93aWR0aDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0c2lkZV94IC09IGhhbGZfd2lkdGg7CisgICAgfQorICAgIEZYX0ZMT0FUIG91dHNpZGVfeTsKKyAgICBpZiAoZW5kX3kgPCBGWFNZU19NdWwoc3RhcnRfaywgZW5kX3gpICsgc3RhcnRfYykgeworICAgICAgb3V0c2lkZV95ID0gRlhTWVNfTXVsKHN0YXJ0X2ssIG91dHNpZGVfeCkgKyBzdGFydF9jICsgc3RhcnRfZGM7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dHNpZGVfeSA9IEZYU1lTX011bChzdGFydF9rLCBvdXRzaWRlX3gpICsgc3RhcnRfYyAtIHN0YXJ0X2RjOworICAgIH0KKyAgICByZWN0LlVwZGF0ZVJlY3Qob3V0c2lkZV94LCBvdXRzaWRlX3kpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoRlhTWVNfZmFicyhzdGFydF9rIC0gZW5kX2spIDwgMS4wZiAvIDIwKSB7CisgICAgaW50IHN0YXJ0X2RpciA9IG1pZGRsZV94ID4gc3RhcnRfeCA/IDEgOiAtMTsKKyAgICBpbnQgZW5kX2RpciA9IGVuZF94ID4gbWlkZGxlX3ggPyAxIDogLTE7CisgICAgaWYgKHN0YXJ0X2RpciA9PSBlbmRfZGlyKSB7CisgICAgICBfVXBkYXRlTGluZUVuZFBvaW50cyhyZWN0LCBtaWRkbGVfeCwgbWlkZGxlX3ksIGVuZF94LCBlbmRfeSwgaGFsZl93aWR0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgIF9VcGRhdGVMaW5lRW5kUG9pbnRzKHJlY3QsIHN0YXJ0X3gsIHN0YXJ0X3ksIG1pZGRsZV94LCBtaWRkbGVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbGZfd2lkdGgpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgRlhfRkxPQVQgc3RhcnRfb3V0c2lkZV9jID0gc3RhcnRfYzsKKyAgaWYgKGVuZF95IDwgRlhTWVNfTXVsKHN0YXJ0X2ssIGVuZF94KSArIHN0YXJ0X2MpIHsKKyAgICBzdGFydF9vdXRzaWRlX2MgKz0gc3RhcnRfZGM7CisgIH0gZWxzZSB7CisgICAgc3RhcnRfb3V0c2lkZV9jIC09IHN0YXJ0X2RjOworICB9CisgIEZYX0ZMT0FUIGVuZF9vdXRzaWRlX2MgPSBlbmRfYzsKKyAgaWYgKHN0YXJ0X3kgPCBGWFNZU19NdWwoZW5kX2ssIHN0YXJ0X3gpICsgZW5kX2MpIHsKKyAgICBlbmRfb3V0c2lkZV9jICs9IGVuZF9kYzsKKyAgfSBlbHNlIHsKKyAgICBlbmRfb3V0c2lkZV9jIC09IGVuZF9kYzsKKyAgfQorICBGWF9GTE9BVCBqb2luX3ggPSBGWFNZU19EaXYoZW5kX291dHNpZGVfYyAtIHN0YXJ0X291dHNpZGVfYywgc3RhcnRfayAtIGVuZF9rKTsKKyAgRlhfRkxPQVQgam9pbl95ID0gRlhTWVNfTXVsKHN0YXJ0X2ssIGpvaW5feCkgKyBzdGFydF9vdXRzaWRlX2M7CisgIHJlY3QuVXBkYXRlUmVjdChqb2luX3gsIGpvaW5feSk7CiB9Ci1DRlhfRmxvYXRSZWN0IENGWF9QYXRoRGF0YTo6R2V0Qm91bmRpbmdCb3goRlhfRkxPQVQgbGluZV93aWR0aCwgRlhfRkxPQVQgbWl0ZXJfbGltaXQpIGNvbnN0Ci17Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByZWN0KDEwMDAwMCAqIDEuMGYsIDEwMDAwMCAqIDEuMGYsIC0xMDAwMDAgKiAxLjBmLCAtMTAwMDAwICogMS4wZik7Ci0gICAgaW50IGlQb2ludCA9IDA7Ci0gICAgRlhfRkxPQVQgaGFsZl93aWR0aCA9IGxpbmVfd2lkdGg7Ci0gICAgaW50IGlTdGFydFBvaW50LCBpRW5kUG9pbnQsIGlNaWRkbGVQb2ludDsKLSAgICBGWF9CT09MIGJKb2luOwotICAgIHdoaWxlIChpUG9pbnQgPCBtX1BvaW50Q291bnQpIHsKLSAgICAgICAgaWYgKG1fcFBvaW50c1tpUG9pbnRdLm1fRmxhZyA9PSBGWFBUX01PVkVUTykgewotICAgICAgICAgICAgaVN0YXJ0UG9pbnQgPSBpUG9pbnQgKyAxOwotICAgICAgICAgICAgaUVuZFBvaW50ID0gaVBvaW50OwotICAgICAgICAgICAgYkpvaW4gPSBGQUxTRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtX3BQb2ludHNbaVBvaW50XS5tX0ZsYWcgPT0gRlhQVF9CRVpJRVJUTykgewotICAgICAgICAgICAgICAgIHJlY3QuVXBkYXRlUmVjdChtX3BQb2ludHNbaVBvaW50XS5tX1BvaW50WCwgbV9wUG9pbnRzW2lQb2ludF0ubV9Qb2ludFkpOwotICAgICAgICAgICAgICAgIHJlY3QuVXBkYXRlUmVjdChtX3BQb2ludHNbaVBvaW50ICsgMV0ubV9Qb2ludFgsIG1fcFBvaW50c1tpUG9pbnQgKyAxXS5tX1BvaW50WSk7Ci0gICAgICAgICAgICAgICAgaVBvaW50ICs9IDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaVBvaW50ID09IG1fUG9pbnRDb3VudCAtIDEgfHwgbV9wUG9pbnRzW2lQb2ludCArIDFdLm1fRmxhZyA9PSBGWFBUX01PVkVUTykgewotICAgICAgICAgICAgICAgIGlTdGFydFBvaW50ID0gaVBvaW50IC0gMTsKLSAgICAgICAgICAgICAgICBpRW5kUG9pbnQgPSBpUG9pbnQ7Ci0gICAgICAgICAgICAgICAgYkpvaW4gPSBGQUxTRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaVN0YXJ0UG9pbnQgPSBpUG9pbnQgLSAxOwotICAgICAgICAgICAgICAgIGlNaWRkbGVQb2ludCA9IGlQb2ludDsKLSAgICAgICAgICAgICAgICBpRW5kUG9pbnQgPSBpUG9pbnQgKyAxOwotICAgICAgICAgICAgICAgIGJKb2luID0gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBGWF9GTE9BVCBzdGFydF94ID0gbV9wUG9pbnRzW2lTdGFydFBvaW50XS5tX1BvaW50WDsKLSAgICAgICAgRlhfRkxPQVQgc3RhcnRfeSA9IG1fcFBvaW50c1tpU3RhcnRQb2ludF0ubV9Qb2ludFk7Ci0gICAgICAgIEZYX0ZMT0FUIGVuZF94ID0gbV9wUG9pbnRzW2lFbmRQb2ludF0ubV9Qb2ludFg7Ci0gICAgICAgIEZYX0ZMT0FUIGVuZF95ID0gbV9wUG9pbnRzW2lFbmRQb2ludF0ubV9Qb2ludFk7Ci0gICAgICAgIGlmIChiSm9pbikgewotICAgICAgICAgICAgRlhfRkxPQVQgbWlkZGxlX3ggPSBtX3BQb2ludHNbaU1pZGRsZVBvaW50XS5tX1BvaW50WDsKLSAgICAgICAgICAgIEZYX0ZMT0FUIG1pZGRsZV95ID0gbV9wUG9pbnRzW2lNaWRkbGVQb2ludF0ubV9Qb2ludFk7Ci0gICAgICAgICAgICBfVXBkYXRlTGluZUpvaW5Qb2ludHMocmVjdCwgc3RhcnRfeCwgc3RhcnRfeSwgbWlkZGxlX3gsIG1pZGRsZV95LCBlbmRfeCwgZW5kX3ksIGhhbGZfd2lkdGgsIG1pdGVyX2xpbWl0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIF9VcGRhdGVMaW5lRW5kUG9pbnRzKHJlY3QsIHN0YXJ0X3gsIHN0YXJ0X3ksIGVuZF94LCBlbmRfeSwgaGFsZl93aWR0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgaVBvaW50ICsrOworQ0ZYX0Zsb2F0UmVjdCBDRlhfUGF0aERhdGE6OkdldEJvdW5kaW5nQm94KEZYX0ZMT0FUIGxpbmVfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbWl0ZXJfbGltaXQpIGNvbnN0IHsKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0KDEwMDAwMCAqIDEuMGYsIDEwMDAwMCAqIDEuMGYsIC0xMDAwMDAgKiAxLjBmLAorICAgICAgICAgICAgICAgICAgICAgLTEwMDAwMCAqIDEuMGYpOworICBpbnQgaVBvaW50ID0gMDsKKyAgRlhfRkxPQVQgaGFsZl93aWR0aCA9IGxpbmVfd2lkdGg7CisgIGludCBpU3RhcnRQb2ludCwgaUVuZFBvaW50LCBpTWlkZGxlUG9pbnQ7CisgIEZYX0JPT0wgYkpvaW47CisgIHdoaWxlIChpUG9pbnQgPCBtX1BvaW50Q291bnQpIHsKKyAgICBpZiAobV9wUG9pbnRzW2lQb2ludF0ubV9GbGFnID09IEZYUFRfTU9WRVRPKSB7CisgICAgICBpU3RhcnRQb2ludCA9IGlQb2ludCArIDE7CisgICAgICBpRW5kUG9pbnQgPSBpUG9pbnQ7CisgICAgICBiSm9pbiA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICBpZiAobV9wUG9pbnRzW2lQb2ludF0ubV9GbGFnID09IEZYUFRfQkVaSUVSVE8pIHsKKyAgICAgICAgcmVjdC5VcGRhdGVSZWN0KG1fcFBvaW50c1tpUG9pbnRdLm1fUG9pbnRYLCBtX3BQb2ludHNbaVBvaW50XS5tX1BvaW50WSk7CisgICAgICAgIHJlY3QuVXBkYXRlUmVjdChtX3BQb2ludHNbaVBvaW50ICsgMV0ubV9Qb2ludFgsCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BQb2ludHNbaVBvaW50ICsgMV0ubV9Qb2ludFkpOworICAgICAgICBpUG9pbnQgKz0gMjsKKyAgICAgIH0KKyAgICAgIGlmIChpUG9pbnQgPT0gbV9Qb2ludENvdW50IC0gMSB8fAorICAgICAgICAgIG1fcFBvaW50c1tpUG9pbnQgKyAxXS5tX0ZsYWcgPT0gRlhQVF9NT1ZFVE8pIHsKKyAgICAgICAgaVN0YXJ0UG9pbnQgPSBpUG9pbnQgLSAxOworICAgICAgICBpRW5kUG9pbnQgPSBpUG9pbnQ7CisgICAgICAgIGJKb2luID0gRkFMU0U7CisgICAgICB9IGVsc2UgeworICAgICAgICBpU3RhcnRQb2ludCA9IGlQb2ludCAtIDE7CisgICAgICAgIGlNaWRkbGVQb2ludCA9IGlQb2ludDsKKyAgICAgICAgaUVuZFBvaW50ID0gaVBvaW50ICsgMTsKKyAgICAgICAgYkpvaW4gPSBUUlVFOworICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gcmVjdDsKKyAgICBGWF9GTE9BVCBzdGFydF94ID0gbV9wUG9pbnRzW2lTdGFydFBvaW50XS5tX1BvaW50WDsKKyAgICBGWF9GTE9BVCBzdGFydF95ID0gbV9wUG9pbnRzW2lTdGFydFBvaW50XS5tX1BvaW50WTsKKyAgICBGWF9GTE9BVCBlbmRfeCA9IG1fcFBvaW50c1tpRW5kUG9pbnRdLm1fUG9pbnRYOworICAgIEZYX0ZMT0FUIGVuZF95ID0gbV9wUG9pbnRzW2lFbmRQb2ludF0ubV9Qb2ludFk7CisgICAgaWYgKGJKb2luKSB7CisgICAgICBGWF9GTE9BVCBtaWRkbGVfeCA9IG1fcFBvaW50c1tpTWlkZGxlUG9pbnRdLm1fUG9pbnRYOworICAgICAgRlhfRkxPQVQgbWlkZGxlX3kgPSBtX3BQb2ludHNbaU1pZGRsZVBvaW50XS5tX1BvaW50WTsKKyAgICAgIF9VcGRhdGVMaW5lSm9pblBvaW50cyhyZWN0LCBzdGFydF94LCBzdGFydF95LCBtaWRkbGVfeCwgbWlkZGxlX3ksIGVuZF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF95LCBoYWxmX3dpZHRoLCBtaXRlcl9saW1pdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIF9VcGRhdGVMaW5lRW5kUG9pbnRzKHJlY3QsIHN0YXJ0X3gsIHN0YXJ0X3ksIGVuZF94LCBlbmRfeSwgaGFsZl93aWR0aCk7CisgICAgfQorICAgIGlQb2ludCsrOworICB9CisgIHJldHVybiByZWN0OwogfQotdm9pZCBDRlhfUGF0aERhdGE6OlRyYW5zZm9ybShjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4KQotewotICAgIGlmIChwTWF0cml4ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fUG9pbnRDb3VudDsgaSArKykgewotICAgICAgICBwTWF0cml4LT5UcmFuc2Zvcm0obV9wUG9pbnRzW2ldLm1fUG9pbnRYLCBtX3BQb2ludHNbaV0ubV9Qb2ludFkpOwotICAgIH0KK3ZvaWQgQ0ZYX1BhdGhEYXRhOjpUcmFuc2Zvcm0oY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgeworICBpZiAoIXBNYXRyaXgpIHsKKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1BvaW50Q291bnQ7IGkrKykgeworICAgIHBNYXRyaXgtPlRyYW5zZm9ybShtX3BQb2ludHNbaV0ubV9Qb2ludFgsIG1fcFBvaW50c1tpXS5tX1BvaW50WSk7CisgIH0KIH0KLUZYX0JPT0wgQ0ZYX1BhdGhEYXRhOjpHZXRaZXJvQXJlYVBhdGgoQ0ZYX1BhdGhEYXRhJiBOZXdQYXRoLCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9CT09MJmJUaGluLCBGWF9CT09MIGJBZGp1c3QpIGNvbnN0Ci17Ci0gICAgaWYgKG1fUG9pbnRDb3VudCA8IDMpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDRlhfUGF0aERhdGE6OkdldFplcm9BcmVhUGF0aChDRlhfUGF0aERhdGEmIE5ld1BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJUaGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBZGp1c3QpIGNvbnN0IHsKKyAgaWYgKG1fUG9pbnRDb3VudCA8IDMpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fUG9pbnRDb3VudCA9PSAzICYmIChtX3BQb2ludHNbMF0ubV9GbGFnICYgRlhQVF9UWVBFKSA9PSBGWFBUX01PVkVUTyAmJgorICAgICAgKG1fcFBvaW50c1sxXS5tX0ZsYWcgJiBGWFBUX1RZUEUpID09IEZYUFRfTElORVRPICYmCisgICAgICAobV9wUG9pbnRzWzJdLm1fRmxhZyAmIEZYUFRfVFlQRSkgPT0gRlhQVF9MSU5FVE8gJiYKKyAgICAgIG1fcFBvaW50c1swXS5tX1BvaW50WCA9PSBtX3BQb2ludHNbMl0ubV9Qb2ludFggJiYKKyAgICAgIG1fcFBvaW50c1swXS5tX1BvaW50WSA9PSBtX3BQb2ludHNbMl0ubV9Qb2ludFkpIHsKKyAgICBOZXdQYXRoLkFkZFBvaW50Q291bnQoMik7CisgICAgaWYgKGJBZGp1c3QpIHsKKyAgICAgIGlmIChwTWF0cml4KSB7CisgICAgICAgIEZYX0ZMT0FUIHggPSBtX3BQb2ludHNbMF0ubV9Qb2ludFgsIHkgPSBtX3BQb2ludHNbMF0ubV9Qb2ludFk7CisgICAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybVBvaW50KHgsIHkpOworICAgICAgICB4ID0gKGludCl4ICsgMC41ZjsKKyAgICAgICAgeSA9IChpbnQpeSArIDAuNWY7CisgICAgICAgIE5ld1BhdGguU2V0UG9pbnQoMCwgeCwgeSwgRlhQVF9NT1ZFVE8pOworICAgICAgICB4ID0gbV9wUG9pbnRzWzFdLm1fUG9pbnRYLCB5ID0gbV9wUG9pbnRzWzFdLm1fUG9pbnRZOworICAgICAgICBwTWF0cml4LT5UcmFuc2Zvcm1Qb2ludCh4LCB5KTsKKyAgICAgICAgeCA9IChpbnQpeCArIDAuNWY7CisgICAgICAgIHkgPSAoaW50KXkgKyAwLjVmOworICAgICAgICBOZXdQYXRoLlNldFBvaW50KDEsIHgsIHksIEZYUFRfTElORVRPKTsKKyAgICAgICAgcE1hdHJpeC0+U2V0SWRlbnRpdHkoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZYX0ZMT0FUIHggPSAoaW50KW1fcFBvaW50c1swXS5tX1BvaW50WCArIDAuNWYsCisgICAgICAgICAgICAgICAgIHkgPSAoaW50KW1fcFBvaW50c1swXS5tX1BvaW50WSArIDAuNWY7CisgICAgICAgIE5ld1BhdGguU2V0UG9pbnQoMCwgeCwgeSwgRlhQVF9NT1ZFVE8pOworICAgICAgICB4ID0gKGludCltX3BQb2ludHNbMV0ubV9Qb2ludFggKyAwLjVmLAorICAgICAgICB5ID0gKGludCltX3BQb2ludHNbMV0ubV9Qb2ludFkgKyAwLjVmOworICAgICAgICBOZXdQYXRoLlNldFBvaW50KDEsIHgsIHksIEZYUFRfTElORVRPKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgTmV3UGF0aC5TZXRQb2ludCgwLCBtX3BQb2ludHNbMF0ubV9Qb2ludFgsIG1fcFBvaW50c1swXS5tX1BvaW50WSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhQVF9NT1ZFVE8pOworICAgICAgTmV3UGF0aC5TZXRQb2ludCgxLCBtX3BQb2ludHNbMV0ubV9Qb2ludFgsIG1fcFBvaW50c1sxXS5tX1BvaW50WSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhQVF9MSU5FVE8pOwogICAgIH0KLSAgICBpZiAobV9Qb2ludENvdW50ID09IDMgJiYgKG1fcFBvaW50c1swXS5tX0ZsYWcgJiBGWFBUX1RZUEUpID09IEZYUFRfTU9WRVRPICYmCi0gICAgICAgICAgICAobV9wUG9pbnRzWzFdLm1fRmxhZyAmIEZYUFRfVFlQRSkgPT0gRlhQVF9MSU5FVE8gJiYgKG1fcFBvaW50c1syXS5tX0ZsYWcgJiBGWFBUX1RZUEUpID09IEZYUFRfTElORVRPCi0gICAgICAgICAgICAmJiBtX3BQb2ludHNbMF0ubV9Qb2ludFggPT0gbV9wUG9pbnRzWzJdLm1fUG9pbnRYICYmIG1fcFBvaW50c1swXS5tX1BvaW50WSA9PSBtX3BQb2ludHNbMl0ubV9Qb2ludFkpIHsKLSAgICAgICAgTmV3UGF0aC5BZGRQb2ludENvdW50KDIpOwotICAgICAgICBpZiAoYkFkanVzdCkgewotICAgICAgICAgICAgaWYgKHBNYXRyaXgpIHsKLSAgICAgICAgICAgICAgICBGWF9GTE9BVCB4ID0gbV9wUG9pbnRzWzBdLm1fUG9pbnRYLCB5ID0gbV9wUG9pbnRzWzBdLm1fUG9pbnRZOwotICAgICAgICAgICAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybVBvaW50KHgsIHkpOwotICAgICAgICAgICAgICAgIHggPSAoaW50KXggKyAwLjVmOwotICAgICAgICAgICAgICAgIHkgPSAoaW50KXkgKyAwLjVmOwotICAgICAgICAgICAgICAgIE5ld1BhdGguU2V0UG9pbnQoMCwgeCwgeSwgRlhQVF9NT1ZFVE8pOwotICAgICAgICAgICAgICAgIHggPSBtX3BQb2ludHNbMV0ubV9Qb2ludFgsIHkgPSBtX3BQb2ludHNbMV0ubV9Qb2ludFk7Ci0gICAgICAgICAgICAgICAgcE1hdHJpeC0+VHJhbnNmb3JtUG9pbnQoeCwgeSk7Ci0gICAgICAgICAgICAgICAgeCA9IChpbnQpeCArIDAuNWY7Ci0gICAgICAgICAgICAgICAgeSA9IChpbnQpeSArIDAuNWY7Ci0gICAgICAgICAgICAgICAgTmV3UGF0aC5TZXRQb2ludCgxLCB4LCB5LCBGWFBUX0xJTkVUTyk7Ci0gICAgICAgICAgICAgICAgcE1hdHJpeC0+U2V0SWRlbnRpdHkoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgRlhfRkxPQVQgeCA9IChpbnQpbV9wUG9pbnRzWzBdLm1fUG9pbnRYICsgMC41ZiwgeSA9IChpbnQpbV9wUG9pbnRzWzBdLm1fUG9pbnRZICsgMC41ZjsKLSAgICAgICAgICAgICAgICBOZXdQYXRoLlNldFBvaW50KDAsIHgsIHksIEZYUFRfTU9WRVRPKTsKLSAgICAgICAgICAgICAgICB4ID0gKGludCltX3BQb2ludHNbMV0ubV9Qb2ludFggKyAwLjVmLCB5ID0gKGludCltX3BQb2ludHNbMV0ubV9Qb2ludFkgKyAwLjVmOwotICAgICAgICAgICAgICAgIE5ld1BhdGguU2V0UG9pbnQoMSwgeCwgeSwgRlhQVF9MSU5FVE8pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTmV3UGF0aC5TZXRQb2ludCgwLCBtX3BQb2ludHNbMF0ubV9Qb2ludFgsIG1fcFBvaW50c1swXS5tX1BvaW50WSwgRlhQVF9NT1ZFVE8pOwotICAgICAgICAgICAgTmV3UGF0aC5TZXRQb2ludCgxLCBtX3BQb2ludHNbMV0ubV9Qb2ludFgsIG1fcFBvaW50c1sxXS5tX1BvaW50WSwgRlhQVF9MSU5FVE8pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX3BQb2ludHNbMF0ubV9Qb2ludFggIT0gbV9wUG9pbnRzWzFdLm1fUG9pbnRYICYmIG1fcFBvaW50c1swXS5tX1BvaW50WSAhPSBtX3BQb2ludHNbMV0ubV9Qb2ludFkpIHsKLSAgICAgICAgICAgIGJUaGluID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKCgobV9Qb2ludENvdW50ID4gMykgJiYgKG1fUG9pbnRDb3VudCAlIDIpKSkgewotICAgICAgICBpbnQgbWlkID0gbV9Qb2ludENvdW50IC8gMjsKLSAgICAgICAgRlhfQk9PTCBiWmVyb0FyZWEgPSBGQUxTRTsKLSAgICAgICAgQ0ZYX1BhdGhEYXRhIHRfcGF0aDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaWQ7IGkrKykgewotICAgICAgICAgICAgaWYgKCEobV9wUG9pbnRzW21pZCAtIGkgLSAxXS5tX1BvaW50WCA9PSBtX3BQb2ludHNbbWlkICsgaSArIDFdLm1fUG9pbnRYCi0gICAgICAgICAgICAgICAgICAgICYmIG1fcFBvaW50c1ttaWQgLSBpIC0gMV0ubV9Qb2ludFkgPT0gbV9wUG9pbnRzW21pZCArIGkgKyAxXS5tX1BvaW50WSAmJgotICAgICAgICAgICAgICAgICAgICAoKG1fcFBvaW50c1ttaWQgLSBpIC0gMV0ubV9GbGFnICYgRlhQVF9UWVBFKSAhPSBGWFBUX0JFWklFUlRPICYmIChtX3BQb2ludHNbbWlkICsgaSArIDFdLm1fRmxhZyAmIEZYUFRfVFlQRSkgIT0gRlhQVF9CRVpJRVJUTykpKSB7Ci0gICAgICAgICAgICAgICAgYlplcm9BcmVhID0gVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBuZXdfY291bnQgPSB0X3BhdGguR2V0UG9pbnRDb3VudCgpOwotICAgICAgICAgICAgdF9wYXRoLkFkZFBvaW50Q291bnQoMik7Ci0gICAgICAgICAgICB0X3BhdGguU2V0UG9pbnQobmV3X2NvdW50LCBtX3BQb2ludHNbbWlkIC0gaV0ubV9Qb2ludFgsIG1fcFBvaW50c1ttaWQgLSBpXS5tX1BvaW50WSwgRlhQVF9NT1ZFVE8pOwotICAgICAgICAgICAgdF9wYXRoLlNldFBvaW50KG5ld19jb3VudCArIDEsIG1fcFBvaW50c1ttaWQgLSBpIC0gMV0ubV9Qb2ludFgsIG1fcFBvaW50c1ttaWQgLSBpIC0gMV0ubV9Qb2ludFksIEZYUFRfTElORVRPKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWJaZXJvQXJlYSkgewotICAgICAgICAgICAgTmV3UGF0aC5BcHBlbmQoJnRfcGF0aCwgTlVMTCk7Ci0gICAgICAgICAgICBiVGhpbiA9IFRSVUU7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpbnQgc3RyYXRQb2ludCA9IDA7Ci0gICAgaW50IG5leHQgPSAwLCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBtX1BvaW50Q291bnQ7IGkrKykgewotICAgICAgICBpbnQgcG9pbnRfdHlwZSA9IG1fcFBvaW50c1tpXS5tX0ZsYWcgJiBGWFBUX1RZUEU7Ci0gICAgICAgIGlmIChwb2ludF90eXBlID09IEZYUFRfTU9WRVRPKSB7Ci0gICAgICAgICAgICBzdHJhdFBvaW50ID0gaTsKLSAgICAgICAgfSBlbHNlIGlmIChwb2ludF90eXBlID09IEZYUFRfTElORVRPKSB7Ci0gICAgICAgICAgICBuZXh0ID0gKGkgKyAxIC0gc3RyYXRQb2ludCkgJSAobV9Qb2ludENvdW50IC0gc3RyYXRQb2ludCkgKyBzdHJhdFBvaW50OwotICAgICAgICAgICAgaWYgKChtX3BQb2ludHNbbmV4dF0ubV9GbGFnICYgRlhQVF9UWVBFKSAhPSBGWFBUX0JFWklFUlRPICYmIChtX3BQb2ludHNbbmV4dF0ubV9GbGFnICYgRlhQVF9UWVBFKSAhPSBGWFBUX01PVkVUTykgewotICAgICAgICAgICAgICAgIGlmKChtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRYID09IG1fcFBvaW50c1tpXS5tX1BvaW50WCAmJiBtX3BQb2ludHNbaV0ubV9Qb2ludFggPT0gbV9wUG9pbnRzW25leHRdLm1fUG9pbnRYKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChtX3BQb2ludHNbaV0ubV9Qb2ludFkgLSBtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRZKSAqIChtX3BQb2ludHNbaV0ubV9Qb2ludFkgLSBtX3BQb2ludHNbbmV4dF0ubV9Qb2ludFkpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHByZSA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChGWFNZU19mYWJzKG1fcFBvaW50c1tpXS5tX1BvaW50WSAtIG1fcFBvaW50c1tpIC0gMV0ubV9Qb2ludFkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCBGWFNZU19mYWJzKG1fcFBvaW50c1tpXS5tX1BvaW50WSAtIG1fcFBvaW50c1tuZXh0XS5tX1BvaW50WSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZSAtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5leHQtLTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbnQgbmV3X2NvdW50ID0gTmV3UGF0aC5HZXRQb2ludENvdW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIE5ld1BhdGguQWRkUG9pbnRDb3VudCgyKTsKLSAgICAgICAgICAgICAgICAgICAgTmV3UGF0aC5TZXRQb2ludChuZXdfY291bnQsIG1fcFBvaW50c1twcmVdLm1fUG9pbnRYLCBtX3BQb2ludHNbcHJlXS5tX1BvaW50WSwgRlhQVF9NT1ZFVE8pOwotICAgICAgICAgICAgICAgICAgICBOZXdQYXRoLlNldFBvaW50KG5ld19jb3VudCArIDEsIG1fcFBvaW50c1tuZXh0XS5tX1BvaW50WCwgbV9wUG9pbnRzW25leHRdLm1fUG9pbnRZLCBGWFBUX0xJTkVUTyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKChtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRZID09IG1fcFBvaW50c1tpXS5tX1BvaW50WSAmJiBtX3BQb2ludHNbaV0ubV9Qb2ludFkgPT0gbV9wUG9pbnRzW25leHRdLm1fUG9pbnRZKQotICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKG1fcFBvaW50c1tpXS5tX1BvaW50WCAtIG1fcFBvaW50c1tpIC0gMV0ubV9Qb2ludFgpICogKG1fcFBvaW50c1tpXS5tX1BvaW50WCAtIG1fcFBvaW50c1tuZXh0XS5tX1BvaW50WCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgcHJlID0gaTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEZYU1lTX2ZhYnMobV9wUG9pbnRzW2ldLm1fUG9pbnRYIC0gbV9wUG9pbnRzW2kgLSAxXS5tX1BvaW50WCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IEZYU1lTX2ZhYnMobV9wUG9pbnRzW2ldLm1fUG9pbnRYIC0gbV9wUG9pbnRzW25leHRdLm1fUG9pbnRYKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlIC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC0tOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGludCBuZXdfY291bnQgPSBOZXdQYXRoLkdldFBvaW50Q291bnQoKTsKLSAgICAgICAgICAgICAgICAgICAgTmV3UGF0aC5BZGRQb2ludENvdW50KDIpOwotICAgICAgICAgICAgICAgICAgICBOZXdQYXRoLlNldFBvaW50KG5ld19jb3VudCwgbV9wUG9pbnRzW3ByZV0ubV9Qb2ludFgsIG1fcFBvaW50c1twcmVdLm1fUG9pbnRZLCBGWFBUX01PVkVUTyk7Ci0gICAgICAgICAgICAgICAgICAgIE5ld1BhdGguU2V0UG9pbnQobmV3X2NvdW50ICsgMSwgbV9wUG9pbnRzW25leHRdLm1fUG9pbnRYLCBtX3BQb2ludHNbbmV4dF0ubV9Qb2ludFksIEZYUFRfTElORVRPKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChtX3BQb2ludHNbaSAtIDFdLm1fRmxhZyAmIEZYUFRfVFlQRSkgPT0gRlhQVF9NT1ZFVE8gJiYgKG1fcFBvaW50c1tuZXh0XS5tX0ZsYWcgJiBGWFBUX1RZUEUpID09IEZYUFRfTElORVRPICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRYID09IG1fcFBvaW50c1tuZXh0XS5tX1BvaW50WCAmJiBtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRZID09IG1fcFBvaW50c1tuZXh0XS5tX1BvaW50WQotICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbV9wUG9pbnRzW25leHRdLm1fRmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG5ld19jb3VudCA9IE5ld1BhdGguR2V0UG9pbnRDb3VudCgpOwotICAgICAgICAgICAgICAgICAgICBOZXdQYXRoLkFkZFBvaW50Q291bnQoMik7Ci0gICAgICAgICAgICAgICAgICAgIE5ld1BhdGguU2V0UG9pbnQobmV3X2NvdW50LCBtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRYLCBtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRZLCBGWFBUX01PVkVUTyk7Ci0gICAgICAgICAgICAgICAgICAgIE5ld1BhdGguU2V0UG9pbnQobmV3X2NvdW50ICsgMSwgbV9wUG9pbnRzW2ldLm1fUG9pbnRYLCBtX3BQb2ludHNbaV0ubV9Qb2ludFksIEZYUFRfTElORVRPKTsKLSAgICAgICAgICAgICAgICAgICAgYlRoaW4gPSBUUlVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwb2ludF90eXBlID09IEZYUFRfQkVaSUVSVE8pIHsKLSAgICAgICAgICAgIGkgKz0gMjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtX1BvaW50Q291bnQgPiAzICYmIE5ld1BhdGguR2V0UG9pbnRDb3VudCgpKSB7Ci0gICAgICAgIGJUaGluID0gVFJVRTsKLSAgICB9Ci0gICAgaWYgKE5ld1BhdGguR2V0UG9pbnRDb3VudCgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmIChtX3BQb2ludHNbMF0ubV9Qb2ludFggIT0gbV9wUG9pbnRzWzFdLm1fUG9pbnRYICYmCisgICAgICAgIG1fcFBvaW50c1swXS5tX1BvaW50WSAhPSBtX3BQb2ludHNbMV0ubV9Qb2ludFkpIHsKKyAgICAgIGJUaGluID0gVFJVRTsKICAgICB9CiAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKCgobV9Qb2ludENvdW50ID4gMykgJiYgKG1fUG9pbnRDb3VudCAlIDIpKSkgeworICAgIGludCBtaWQgPSBtX1BvaW50Q291bnQgLyAyOworICAgIEZYX0JPT0wgYlplcm9BcmVhID0gRkFMU0U7CisgICAgQ0ZYX1BhdGhEYXRhIHRfcGF0aDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pZDsgaSsrKSB7CisgICAgICBpZiAoIShtX3BQb2ludHNbbWlkIC0gaSAtIDFdLm1fUG9pbnRYID09CisgICAgICAgICAgICAgICAgbV9wUG9pbnRzW21pZCArIGkgKyAxXS5tX1BvaW50WCAmJgorICAgICAgICAgICAgbV9wUG9pbnRzW21pZCAtIGkgLSAxXS5tX1BvaW50WSA9PQorICAgICAgICAgICAgICAgIG1fcFBvaW50c1ttaWQgKyBpICsgMV0ubV9Qb2ludFkgJiYKKyAgICAgICAgICAgICgobV9wUG9pbnRzW21pZCAtIGkgLSAxXS5tX0ZsYWcgJiBGWFBUX1RZUEUpICE9IEZYUFRfQkVaSUVSVE8gJiYKKyAgICAgICAgICAgICAobV9wUG9pbnRzW21pZCArIGkgKyAxXS5tX0ZsYWcgJiBGWFBUX1RZUEUpICE9IEZYUFRfQkVaSUVSVE8pKSkgeworICAgICAgICBiWmVyb0FyZWEgPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGludCBuZXdfY291bnQgPSB0X3BhdGguR2V0UG9pbnRDb3VudCgpOworICAgICAgdF9wYXRoLkFkZFBvaW50Q291bnQoMik7CisgICAgICB0X3BhdGguU2V0UG9pbnQobmV3X2NvdW50LCBtX3BQb2ludHNbbWlkIC0gaV0ubV9Qb2ludFgsCisgICAgICAgICAgICAgICAgICAgICAgbV9wUG9pbnRzW21pZCAtIGldLm1fUG9pbnRZLCBGWFBUX01PVkVUTyk7CisgICAgICB0X3BhdGguU2V0UG9pbnQobmV3X2NvdW50ICsgMSwgbV9wUG9pbnRzW21pZCAtIGkgLSAxXS5tX1BvaW50WCwKKyAgICAgICAgICAgICAgICAgICAgICBtX3BQb2ludHNbbWlkIC0gaSAtIDFdLm1fUG9pbnRZLCBGWFBUX0xJTkVUTyk7CisgICAgfQorICAgIGlmICghYlplcm9BcmVhKSB7CisgICAgICBOZXdQYXRoLkFwcGVuZCgmdF9wYXRoLCBOVUxMKTsKKyAgICAgIGJUaGluID0gVFJVRTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICBpbnQgc3RyYXRQb2ludCA9IDA7CisgIGludCBuZXh0ID0gMCwgaTsKKyAgZm9yIChpID0gMDsgaSA8IG1fUG9pbnRDb3VudDsgaSsrKSB7CisgICAgaW50IHBvaW50X3R5cGUgPSBtX3BQb2ludHNbaV0ubV9GbGFnICYgRlhQVF9UWVBFOworICAgIGlmIChwb2ludF90eXBlID09IEZYUFRfTU9WRVRPKSB7CisgICAgICBzdHJhdFBvaW50ID0gaTsKKyAgICB9IGVsc2UgaWYgKHBvaW50X3R5cGUgPT0gRlhQVF9MSU5FVE8pIHsKKyAgICAgIG5leHQgPSAoaSArIDEgLSBzdHJhdFBvaW50KSAlIChtX1BvaW50Q291bnQgLSBzdHJhdFBvaW50KSArIHN0cmF0UG9pbnQ7CisgICAgICBpZiAoKG1fcFBvaW50c1tuZXh0XS5tX0ZsYWcgJiBGWFBUX1RZUEUpICE9IEZYUFRfQkVaSUVSVE8gJiYKKyAgICAgICAgICAobV9wUG9pbnRzW25leHRdLm1fRmxhZyAmIEZYUFRfVFlQRSkgIT0gRlhQVF9NT1ZFVE8pIHsKKyAgICAgICAgaWYgKChtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRYID09IG1fcFBvaW50c1tpXS5tX1BvaW50WCAmJgorICAgICAgICAgICAgIG1fcFBvaW50c1tpXS5tX1BvaW50WCA9PSBtX3BQb2ludHNbbmV4dF0ubV9Qb2ludFgpICYmCisgICAgICAgICAgICAoKG1fcFBvaW50c1tpXS5tX1BvaW50WSAtIG1fcFBvaW50c1tpIC0gMV0ubV9Qb2ludFkpICoKKyAgICAgICAgICAgICAgICAgKG1fcFBvaW50c1tpXS5tX1BvaW50WSAtIG1fcFBvaW50c1tuZXh0XS5tX1BvaW50WSkgPgorICAgICAgICAgICAgIDApKSB7CisgICAgICAgICAgaW50IHByZSA9IGk7CisgICAgICAgICAgaWYgKEZYU1lTX2ZhYnMobV9wUG9pbnRzW2ldLm1fUG9pbnRZIC0gbV9wUG9pbnRzW2kgLSAxXS5tX1BvaW50WSkgPAorICAgICAgICAgICAgICBGWFNZU19mYWJzKG1fcFBvaW50c1tpXS5tX1BvaW50WSAtIG1fcFBvaW50c1tuZXh0XS5tX1BvaW50WSkpIHsKKyAgICAgICAgICAgIHByZS0tOworICAgICAgICAgICAgbmV4dC0tOworICAgICAgICAgIH0KKyAgICAgICAgICBpbnQgbmV3X2NvdW50ID0gTmV3UGF0aC5HZXRQb2ludENvdW50KCk7CisgICAgICAgICAgTmV3UGF0aC5BZGRQb2ludENvdW50KDIpOworICAgICAgICAgIE5ld1BhdGguU2V0UG9pbnQobmV3X2NvdW50LCBtX3BQb2ludHNbcHJlXS5tX1BvaW50WCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFBvaW50c1twcmVdLm1fUG9pbnRZLCBGWFBUX01PVkVUTyk7CisgICAgICAgICAgTmV3UGF0aC5TZXRQb2ludChuZXdfY291bnQgKyAxLCBtX3BQb2ludHNbbmV4dF0ubV9Qb2ludFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BQb2ludHNbbmV4dF0ubV9Qb2ludFksIEZYUFRfTElORVRPKTsKKyAgICAgICAgfSBlbHNlIGlmICgobV9wUG9pbnRzW2kgLSAxXS5tX1BvaW50WSA9PSBtX3BQb2ludHNbaV0ubV9Qb2ludFkgJiYKKyAgICAgICAgICAgICAgICAgICAgbV9wUG9pbnRzW2ldLm1fUG9pbnRZID09IG1fcFBvaW50c1tuZXh0XS5tX1BvaW50WSkgJiYKKyAgICAgICAgICAgICAgICAgICAoKG1fcFBvaW50c1tpXS5tX1BvaW50WCAtIG1fcFBvaW50c1tpIC0gMV0ubV9Qb2ludFgpICoKKyAgICAgICAgICAgICAgICAgICAgICAgIChtX3BQb2ludHNbaV0ubV9Qb2ludFggLSBtX3BQb2ludHNbbmV4dF0ubV9Qb2ludFgpID4KKyAgICAgICAgICAgICAgICAgICAgMCkpIHsKKyAgICAgICAgICBpbnQgcHJlID0gaTsKKyAgICAgICAgICBpZiAoRlhTWVNfZmFicyhtX3BQb2ludHNbaV0ubV9Qb2ludFggLSBtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRYKSA8CisgICAgICAgICAgICAgIEZYU1lTX2ZhYnMobV9wUG9pbnRzW2ldLm1fUG9pbnRYIC0gbV9wUG9pbnRzW25leHRdLm1fUG9pbnRYKSkgeworICAgICAgICAgICAgcHJlLS07CisgICAgICAgICAgICBuZXh0LS07CisgICAgICAgICAgfQorICAgICAgICAgIGludCBuZXdfY291bnQgPSBOZXdQYXRoLkdldFBvaW50Q291bnQoKTsKKyAgICAgICAgICBOZXdQYXRoLkFkZFBvaW50Q291bnQoMik7CisgICAgICAgICAgTmV3UGF0aC5TZXRQb2ludChuZXdfY291bnQsIG1fcFBvaW50c1twcmVdLm1fUG9pbnRYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUG9pbnRzW3ByZV0ubV9Qb2ludFksIEZYUFRfTU9WRVRPKTsKKyAgICAgICAgICBOZXdQYXRoLlNldFBvaW50KG5ld19jb3VudCArIDEsIG1fcFBvaW50c1tuZXh0XS5tX1BvaW50WCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFBvaW50c1tuZXh0XS5tX1BvaW50WSwgRlhQVF9MSU5FVE8pOworICAgICAgICB9IGVsc2UgaWYgKChtX3BQb2ludHNbaSAtIDFdLm1fRmxhZyAmIEZYUFRfVFlQRSkgPT0gRlhQVF9NT1ZFVE8gJiYKKyAgICAgICAgICAgICAgICAgICAobV9wUG9pbnRzW25leHRdLm1fRmxhZyAmIEZYUFRfVFlQRSkgPT0gRlhQVF9MSU5FVE8gJiYKKyAgICAgICAgICAgICAgICAgICBtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRYID09IG1fcFBvaW50c1tuZXh0XS5tX1BvaW50WCAmJgorICAgICAgICAgICAgICAgICAgIG1fcFBvaW50c1tpIC0gMV0ubV9Qb2ludFkgPT0gbV9wUG9pbnRzW25leHRdLm1fUG9pbnRZICYmCisgICAgICAgICAgICAgICAgICAgbV9wUG9pbnRzW25leHRdLm1fRmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpIHsKKyAgICAgICAgICBpbnQgbmV3X2NvdW50ID0gTmV3UGF0aC5HZXRQb2ludENvdW50KCk7CisgICAgICAgICAgTmV3UGF0aC5BZGRQb2ludENvdW50KDIpOworICAgICAgICAgIE5ld1BhdGguU2V0UG9pbnQobmV3X2NvdW50LCBtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUG9pbnRzW2kgLSAxXS5tX1BvaW50WSwgRlhQVF9NT1ZFVE8pOworICAgICAgICAgIE5ld1BhdGguU2V0UG9pbnQobmV3X2NvdW50ICsgMSwgbV9wUG9pbnRzW2ldLm1fUG9pbnRYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUG9pbnRzW2ldLm1fUG9pbnRZLCBGWFBUX0xJTkVUTyk7CisgICAgICAgICAgYlRoaW4gPSBUUlVFOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChwb2ludF90eXBlID09IEZYUFRfQkVaSUVSVE8pIHsKKyAgICAgIGkgKz0gMjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgfQorICBpZiAobV9Qb2ludENvdW50ID4gMyAmJiBOZXdQYXRoLkdldFBvaW50Q291bnQoKSkgeworICAgIGJUaGluID0gVFJVRTsKKyAgfQorICBpZiAoTmV3UGF0aC5HZXRQb2ludENvdW50KCkgPT0gMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ0ZYX1BhdGhEYXRhOjpJc1JlY3QoKSBjb25zdAotewotICAgIGlmIChtX1BvaW50Q291bnQgIT0gNSAmJiBtX1BvaW50Q291bnQgIT0gNCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CitGWF9CT09MIENGWF9QYXRoRGF0YTo6SXNSZWN0KCkgY29uc3QgeworICBpZiAobV9Qb2ludENvdW50ICE9IDUgJiYgbV9Qb2ludENvdW50ICE9IDQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKChtX1BvaW50Q291bnQgPT0gNSAmJiAobV9wUG9pbnRzWzBdLm1fUG9pbnRYICE9IG1fcFBvaW50c1s0XS5tX1BvaW50WCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BQb2ludHNbMF0ubV9Qb2ludFkgIT0gbV9wUG9pbnRzWzRdLm1fUG9pbnRZKSkgfHwKKyAgICAgIChtX3BQb2ludHNbMF0ubV9Qb2ludFggPT0gbV9wUG9pbnRzWzJdLm1fUG9pbnRYICYmCisgICAgICAgbV9wUG9pbnRzWzBdLm1fUG9pbnRZID09IG1fcFBvaW50c1syXS5tX1BvaW50WSkgfHwKKyAgICAgIChtX3BQb2ludHNbMV0ubV9Qb2ludFggPT0gbV9wUG9pbnRzWzNdLm1fUG9pbnRYICYmCisgICAgICAgbV9wUG9pbnRzWzFdLm1fUG9pbnRZID09IG1fcFBvaW50c1szXS5tX1BvaW50WSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG1fcFBvaW50c1swXS5tX1BvaW50WCAhPSBtX3BQb2ludHNbM10ubV9Qb2ludFggJiYKKyAgICAgIG1fcFBvaW50c1swXS5tX1BvaW50WSAhPSBtX3BQb2ludHNbM10ubV9Qb2ludFkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZm9yIChpbnQgaSA9IDE7IGkgPCA0OyBpKyspIHsKKyAgICBpZiAoKG1fcFBvaW50c1tpXS5tX0ZsYWcgJiBGWFBUX1RZUEUpICE9IEZYUFRfTElORVRPKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIGlmICgobV9Qb2ludENvdW50ID09IDUgJiYgKG1fcFBvaW50c1swXS5tX1BvaW50WCAhPSBtX3BQb2ludHNbNF0ubV9Qb2ludFggfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BQb2ludHNbMF0ubV9Qb2ludFkgIT0gbV9wUG9pbnRzWzRdLm1fUG9pbnRZKSkgfHwKLSAgICAgICAgICAgIChtX3BQb2ludHNbMF0ubV9Qb2ludFggPT0gbV9wUG9pbnRzWzJdLm1fUG9pbnRYICYmIG1fcFBvaW50c1swXS5tX1BvaW50WSA9PSBtX3BQb2ludHNbMl0ubV9Qb2ludFkpIHx8Ci0gICAgICAgICAgICAobV9wUG9pbnRzWzFdLm1fUG9pbnRYID09IG1fcFBvaW50c1szXS5tX1BvaW50WCAmJiBtX3BQb2ludHNbMV0ubV9Qb2ludFkgPT0gbV9wUG9pbnRzWzNdLm1fUG9pbnRZKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKG1fcFBvaW50c1tpXS5tX1BvaW50WCAhPSBtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRYICYmCisgICAgICAgIG1fcFBvaW50c1tpXS5tX1BvaW50WSAhPSBtX3BQb2ludHNbaSAtIDFdLm1fUG9pbnRZKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIGlmIChtX3BQb2ludHNbMF0ubV9Qb2ludFggIT0gbV9wUG9pbnRzWzNdLm1fUG9pbnRYICYmIG1fcFBvaW50c1swXS5tX1BvaW50WSAhPSBtX3BQb2ludHNbM10ubV9Qb2ludFkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMTsgaSA8IDQ7IGkgKyspIHsKLSAgICAgICAgaWYgKChtX3BQb2ludHNbaV0ubV9GbGFnICYgRlhQVF9UWVBFKSAhPSBGWFBUX0xJTkVUTykgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX3BQb2ludHNbaV0ubV9Qb2ludFggIT0gbV9wUG9pbnRzW2kgLSAxXS5tX1BvaW50WCAmJiBtX3BQb2ludHNbaV0ubV9Qb2ludFkgIT0gbV9wUG9pbnRzW2kgLSAxXS5tX1BvaW50WSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtX1BvaW50Q291bnQgPT0gNSB8fCAobV9wUG9pbnRzWzNdLm1fRmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpOworICB9CisgIHJldHVybiBtX1BvaW50Q291bnQgPT0gNSB8fCAobV9wUG9pbnRzWzNdLm1fRmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpOwogfQotRlhfQk9PTCBDRlhfUGF0aERhdGE6OklzUmVjdChjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBDRlhfRmxvYXRSZWN0KiBwUmVjdCkgY29uc3QKLXsKLSAgICBpZiAocE1hdHJpeCA9PSBOVUxMKSB7Ci0gICAgICAgIGlmICghSXNSZWN0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAocFJlY3QpIHsKLSAgICAgICAgICAgIHBSZWN0LT5sZWZ0ID0gbV9wUG9pbnRzWzBdLm1fUG9pbnRYOwotICAgICAgICAgICAgcFJlY3QtPnJpZ2h0ID0gbV9wUG9pbnRzWzJdLm1fUG9pbnRYOwotICAgICAgICAgICAgcFJlY3QtPmJvdHRvbSA9IG1fcFBvaW50c1swXS5tX1BvaW50WTsKLSAgICAgICAgICAgIHBSZWN0LT50b3AgPSBtX3BQb2ludHNbMl0ubV9Qb2ludFk7Ci0gICAgICAgICAgICBwUmVjdC0+Tm9ybWFsaXplKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGlmIChtX1BvaW50Q291bnQgIT0gNSAmJiBtX1BvaW50Q291bnQgIT0gNCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmICgobV9Qb2ludENvdW50ID09IDUgJiYgKG1fcFBvaW50c1swXS5tX1BvaW50WCAhPSBtX3BQb2ludHNbNF0ubV9Qb2ludFggfHwgbV9wUG9pbnRzWzBdLm1fUG9pbnRZICE9IG1fcFBvaW50c1s0XS5tX1BvaW50WSkpIHx8Ci0gICAgICAgICAgICAobV9wUG9pbnRzWzFdLm1fUG9pbnRYID09IG1fcFBvaW50c1szXS5tX1BvaW50WCAmJiBtX3BQb2ludHNbMV0ubV9Qb2ludFkgPT0gbV9wUG9pbnRzWzNdLm1fUG9pbnRZKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChtX1BvaW50Q291bnQgPT0gNCAmJiBtX3BQb2ludHNbMF0ubV9Qb2ludFggIT0gbV9wUG9pbnRzWzNdLm1fUG9pbnRYICYmIG1fcFBvaW50c1swXS5tX1BvaW50WSAhPSBtX3BQb2ludHNbM10ubV9Qb2ludFkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBGWF9GTE9BVCB4WzVdLCB5WzVdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9Qb2ludENvdW50OyBpICsrKSB7Ci0gICAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybShtX3BQb2ludHNbaV0ubV9Qb2ludFgsIG1fcFBvaW50c1tpXS5tX1BvaW50WSwgeFtpXSwgeVtpXSk7Ci0gICAgICAgIGlmIChpKSB7Ci0gICAgICAgICAgICBpZiAoKG1fcFBvaW50c1tpXS5tX0ZsYWcgJiBGWFBUX1RZUEUpICE9IEZYUFRfTElORVRPKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHhbaV0gIT0geFtpIC0gMV0gJiYgeVtpXSAhPSB5W2kgLSAxXSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorRlhfQk9PTCBDRlhfUGF0aERhdGE6OklzUmVjdChjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRmxvYXRSZWN0KiBwUmVjdCkgY29uc3QgeworICBpZiAoIXBNYXRyaXgpIHsKKyAgICBpZiAoIUlzUmVjdCgpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmIChwUmVjdCkgewotICAgICAgICBwUmVjdC0+bGVmdCA9IHhbMF07Ci0gICAgICAgIHBSZWN0LT5yaWdodCA9IHhbMl07Ci0gICAgICAgIHBSZWN0LT5ib3R0b20gPSB5WzBdOwotICAgICAgICBwUmVjdC0+dG9wID0geVsyXTsKLSAgICAgICAgcFJlY3QtPk5vcm1hbGl6ZSgpOworICAgICAgcFJlY3QtPmxlZnQgPSBtX3BQb2ludHNbMF0ubV9Qb2ludFg7CisgICAgICBwUmVjdC0+cmlnaHQgPSBtX3BQb2ludHNbMl0ubV9Qb2ludFg7CisgICAgICBwUmVjdC0+Ym90dG9tID0gbV9wUG9pbnRzWzBdLm1fUG9pbnRZOworICAgICAgcFJlY3QtPnRvcCA9IG1fcFBvaW50c1syXS5tX1BvaW50WTsKKyAgICAgIHBSZWN0LT5Ob3JtYWxpemUoKTsKICAgICB9CiAgICAgcmV0dXJuIFRSVUU7Ci19Ci12b2lkIENGWF9QYXRoRGF0YTo6Q29weShjb25zdCBDRlhfUGF0aERhdGEgJnNyYykKLXsKLSAgICBTZXRQb2ludENvdW50KHNyYy5tX1BvaW50Q291bnQpOwotICAgIEZYU1lTX21lbWNweTMyKG1fcFBvaW50cywgc3JjLm1fcFBvaW50cywgc2l6ZW9mKEZYX1BBVEhQT0lOVCkgKiBtX1BvaW50Q291bnQpOwotfQotQ0ZYX0dyYXBoU3RhdGVEYXRhOjpDRlhfR3JhcGhTdGF0ZURhdGEoKQotewotICAgIG1fTGluZUNhcCA9IExpbmVDYXBCdXR0OwotICAgIG1fRGFzaENvdW50ID0gMDsKLSAgICBtX0Rhc2hBcnJheSA9IE5VTEw7Ci0gICAgbV9EYXNoUGhhc2UgPSAwOwotICAgIG1fTGluZUpvaW4gPSBMaW5lSm9pbk1pdGVyOwotICAgIG1fTWl0ZXJMaW1pdCA9IDEwICogMS4wZjsKLSAgICBtX0xpbmVXaWR0aCA9IDEuMGY7Ci19Ci1DRlhfR3JhcGhTdGF0ZURhdGE6OkNGWF9HcmFwaFN0YXRlRGF0YShjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEmIHNyYykKLXsKLSAgICBtX0Rhc2hBcnJheSA9IE5VTEw7Ci0gICAgQ29weShzcmMpOwotfQotdm9pZCBDRlhfR3JhcGhTdGF0ZURhdGE6OkNvcHkoY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhJiBzcmMpCi17Ci0gICAgbV9MaW5lQ2FwID0gc3JjLm1fTGluZUNhcDsKLSAgICBtX0Rhc2hDb3VudCA9IHNyYy5tX0Rhc2hDb3VudDsKLSAgICBpZiAobV9EYXNoQXJyYXkpIHsKLSAgICAgICAgRlhfRnJlZShtX0Rhc2hBcnJheSk7CisgIH0KKyAgaWYgKG1fUG9pbnRDb3VudCAhPSA1ICYmIG1fUG9pbnRDb3VudCAhPSA0KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICgobV9Qb2ludENvdW50ID09IDUgJiYgKG1fcFBvaW50c1swXS5tX1BvaW50WCAhPSBtX3BQb2ludHNbNF0ubV9Qb2ludFggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUG9pbnRzWzBdLm1fUG9pbnRZICE9IG1fcFBvaW50c1s0XS5tX1BvaW50WSkpIHx8CisgICAgICAobV9wUG9pbnRzWzFdLm1fUG9pbnRYID09IG1fcFBvaW50c1szXS5tX1BvaW50WCAmJgorICAgICAgIG1fcFBvaW50c1sxXS5tX1BvaW50WSA9PSBtX3BQb2ludHNbM10ubV9Qb2ludFkpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChtX1BvaW50Q291bnQgPT0gNCAmJiBtX3BQb2ludHNbMF0ubV9Qb2ludFggIT0gbV9wUG9pbnRzWzNdLm1fUG9pbnRYICYmCisgICAgICBtX3BQb2ludHNbMF0ubV9Qb2ludFkgIT0gbV9wUG9pbnRzWzNdLm1fUG9pbnRZKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX0ZMT0FUIHhbNV0sIHlbNV07CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9Qb2ludENvdW50OyBpKyspIHsKKyAgICBwTWF0cml4LT5UcmFuc2Zvcm0obV9wUG9pbnRzW2ldLm1fUG9pbnRYLCBtX3BQb2ludHNbaV0ubV9Qb2ludFksIHhbaV0sCisgICAgICAgICAgICAgICAgICAgICAgIHlbaV0pOworICAgIGlmIChpKSB7CisgICAgICBpZiAoKG1fcFBvaW50c1tpXS5tX0ZsYWcgJiBGWFBUX1RZUEUpICE9IEZYUFRfTElORVRPKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGlmICh4W2ldICE9IHhbaSAtIDFdICYmIHlbaV0gIT0geVtpIC0gMV0pIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQogICAgIH0KLSAgICBtX0Rhc2hBcnJheSA9IE5VTEw7Ci0gICAgbV9EYXNoUGhhc2UgPSBzcmMubV9EYXNoUGhhc2U7Ci0gICAgbV9MaW5lSm9pbiA9IHNyYy5tX0xpbmVKb2luOwotICAgIG1fTWl0ZXJMaW1pdCA9IHNyYy5tX01pdGVyTGltaXQ7Ci0gICAgbV9MaW5lV2lkdGggPSBzcmMubV9MaW5lV2lkdGg7Ci0gICAgaWYgKG1fRGFzaENvdW50KSB7Ci0gICAgICAgIG1fRGFzaEFycmF5ID0gRlhfQWxsb2MoRlhfRkxPQVQsIG1fRGFzaENvdW50KTsKLSAgICAgICAgRlhTWVNfbWVtY3B5MzIobV9EYXNoQXJyYXksIHNyYy5tX0Rhc2hBcnJheSwgbV9EYXNoQ291bnQgKiBzaXplb2YoRlhfRkxPQVQpKTsKLSAgICB9CisgIH0KKyAgaWYgKHBSZWN0KSB7CisgICAgcFJlY3QtPmxlZnQgPSB4WzBdOworICAgIHBSZWN0LT5yaWdodCA9IHhbMl07CisgICAgcFJlY3QtPmJvdHRvbSA9IHlbMF07CisgICAgcFJlY3QtPnRvcCA9IHlbMl07CisgICAgcFJlY3QtPk5vcm1hbGl6ZSgpOworICB9CisgIHJldHVybiBUUlVFOwogfQotQ0ZYX0dyYXBoU3RhdGVEYXRhOjp+Q0ZYX0dyYXBoU3RhdGVEYXRhKCkKLXsKLSAgICBpZiAobV9EYXNoQXJyYXkpIHsKLSAgICAgICAgRlhfRnJlZShtX0Rhc2hBcnJheSk7Ci0gICAgfQordm9pZCBDRlhfUGF0aERhdGE6OkNvcHkoY29uc3QgQ0ZYX1BhdGhEYXRhJiBzcmMpIHsKKyAgU2V0UG9pbnRDb3VudChzcmMubV9Qb2ludENvdW50KTsKKyAgRlhTWVNfbWVtY3B5KG1fcFBvaW50cywgc3JjLm1fcFBvaW50cywgc2l6ZW9mKEZYX1BBVEhQT0lOVCkgKiBtX1BvaW50Q291bnQpOwogfQotdm9pZCBDRlhfR3JhcGhTdGF0ZURhdGE6OlNldERhc2hDb3VudChpbnQgY291bnQpCi17Ci0gICAgaWYgKG1fRGFzaEFycmF5KSB7Ci0gICAgICAgIEZYX0ZyZWUobV9EYXNoQXJyYXkpOwotICAgIH0KLSAgICBtX0Rhc2hBcnJheSA9IE5VTEw7Ci0gICAgbV9EYXNoQ291bnQgPSBjb3VudDsKLSAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fRGFzaEFycmF5ID0gRlhfQWxsb2MoRlhfRkxPQVQsIGNvdW50KTsKK0NGWF9HcmFwaFN0YXRlRGF0YTo6Q0ZYX0dyYXBoU3RhdGVEYXRhKCkgeworICBtX0xpbmVDYXAgPSBMaW5lQ2FwQnV0dDsKKyAgbV9EYXNoQ291bnQgPSAwOworICBtX0Rhc2hBcnJheSA9IE5VTEw7CisgIG1fRGFzaFBoYXNlID0gMDsKKyAgbV9MaW5lSm9pbiA9IExpbmVKb2luTWl0ZXI7CisgIG1fTWl0ZXJMaW1pdCA9IDEwICogMS4wZjsKKyAgbV9MaW5lV2lkdGggPSAxLjBmOworfQorQ0ZYX0dyYXBoU3RhdGVEYXRhOjpDRlhfR3JhcGhTdGF0ZURhdGEoY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhJiBzcmMpIHsKKyAgbV9EYXNoQXJyYXkgPSBOVUxMOworICBDb3B5KHNyYyk7Cit9Cit2b2lkIENGWF9HcmFwaFN0YXRlRGF0YTo6Q29weShjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEmIHNyYykgeworICBtX0xpbmVDYXAgPSBzcmMubV9MaW5lQ2FwOworICBtX0Rhc2hDb3VudCA9IHNyYy5tX0Rhc2hDb3VudDsKKyAgRlhfRnJlZShtX0Rhc2hBcnJheSk7CisgIG1fRGFzaEFycmF5ID0gTlVMTDsKKyAgbV9EYXNoUGhhc2UgPSBzcmMubV9EYXNoUGhhc2U7CisgIG1fTGluZUpvaW4gPSBzcmMubV9MaW5lSm9pbjsKKyAgbV9NaXRlckxpbWl0ID0gc3JjLm1fTWl0ZXJMaW1pdDsKKyAgbV9MaW5lV2lkdGggPSBzcmMubV9MaW5lV2lkdGg7CisgIGlmIChtX0Rhc2hDb3VudCkgeworICAgIG1fRGFzaEFycmF5ID0gRlhfQWxsb2MoRlhfRkxPQVQsIG1fRGFzaENvdW50KTsKKyAgICBGWFNZU19tZW1jcHkobV9EYXNoQXJyYXksIHNyYy5tX0Rhc2hBcnJheSwgbV9EYXNoQ291bnQgKiBzaXplb2YoRlhfRkxPQVQpKTsKKyAgfQorfQorQ0ZYX0dyYXBoU3RhdGVEYXRhOjp+Q0ZYX0dyYXBoU3RhdGVEYXRhKCkgeworICBGWF9GcmVlKG1fRGFzaEFycmF5KTsKK30KK3ZvaWQgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpTZXREYXNoQ291bnQoaW50IGNvdW50KSB7CisgIEZYX0ZyZWUobV9EYXNoQXJyYXkpOworICBtX0Rhc2hBcnJheSA9IE5VTEw7CisgIG1fRGFzaENvdW50ID0gY291bnQ7CisgIGlmIChjb3VudCA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIG1fRGFzaEFycmF5ID0gRlhfQWxsb2MoRlhfRkxPQVQsIGNvdW50KTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfcHMuY3BwIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9wcy5jcHAKaW5kZXggZTgxYjZiZi4uZjlmZDhkZSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9wcy5jcHAKKysrIGIvY29yZS9zcmMvZnhnZS9nZS9meF9nZV9wcy5jcHAKQEAgLTEsNjQ0ICsxLDY5OSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGdlL2Z4X2dlLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIgogI2luY2x1ZGUgInRleHRfaW50LmgiCisKIHN0cnVjdCBQU0dseXBoIHsKLSAgICBDRlhfRm9udCoJCW1fcEZvbnQ7Ci0gICAgRlhfRFdPUkQJCW1fR2x5cGhJbmRleDsKLSAgICBGWF9CT09MCQkJbV9iR2x5cGhBZGp1c3Q7Ci0gICAgRlhfRkxPQVQJCW1fQWRqdXN0TWF0cml4WzRdOworICBDRlhfRm9udCogbV9wRm9udDsKKyAgRlhfRFdPUkQgbV9HbHlwaEluZGV4OworICBGWF9CT09MIG1fYkdseXBoQWRqdXN0OworICBGWF9GTE9BVCBtX0FkanVzdE1hdHJpeFs0XTsKIH07Ci1jbGFzcyBDUFNGb250IAotewotcHVibGljOgotICAgIFBTR2x5cGgJCQltX0dseXBoc1syNTZdOwotICAgIGludAkJCQltX25HbHlwaHM7CitjbGFzcyBDUFNGb250IHsKKyBwdWJsaWM6CisgIFBTR2x5cGggbV9HbHlwaHNbMjU2XTsKKyAgaW50IG1fbkdseXBoczsKIH07Ci1DRlhfUFNSZW5kZXJlcjo6Q0ZYX1BTUmVuZGVyZXIoKQotewotICAgIG1fcE91dHB1dCA9IE5VTEw7Ci0gICAgbV9iQ29sb3JTZXQgPSBtX2JHcmFwaFN0YXRlU2V0ID0gRkFMU0U7Ci0gICAgbV9iSW5pdGVkID0gRkFMU0U7CitDRlhfUFNSZW5kZXJlcjo6Q0ZYX1BTUmVuZGVyZXIoKSB7CisgIG1fcE91dHB1dCA9IE5VTEw7CisgIG1fYkNvbG9yU2V0ID0gbV9iR3JhcGhTdGF0ZVNldCA9IEZBTFNFOworICBtX2JJbml0ZWQgPSBGQUxTRTsKIH0KLUNGWF9QU1JlbmRlcmVyOjp+Q0ZYX1BTUmVuZGVyZXIoKQotewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCltX1BTRm9udExpc3QuR2V0U2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIENQU0ZvbnQqIHBGb250ID0gbV9QU0ZvbnRMaXN0W2ldOwotICAgICAgICBkZWxldGUgcEZvbnQ7Ci0gICAgfQorQ0ZYX1BTUmVuZGVyZXI6On5DRlhfUFNSZW5kZXJlcigpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KW1fUFNGb250TGlzdC5HZXRTaXplKCk7IGkrKykgeworICAgIENQU0ZvbnQqIHBGb250ID0gbV9QU0ZvbnRMaXN0W2ldOworICAgIGRlbGV0ZSBwRm9udDsKKyAgfQogfQotI2RlZmluZSBPVVRQVVRfUFMoc3RyKSBtX3BPdXRwdXQtPk91dHB1dFBTKHN0ciwgc2l6ZW9mIHN0ci0xKQotdm9pZCBDRlhfUFNSZW5kZXJlcjo6SW5pdChJRlhfUFNPdXRwdXQqIHBPdXRwdXQsIGludCBwc2xldmVsLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYX0JPT0wgYkNteWtPdXRwdXQpCi17Ci0gICAgbV9QU0xldmVsID0gcHNsZXZlbDsKLSAgICBtX3BPdXRwdXQgPSBwT3V0cHV0OwotICAgIG1fQ2xpcEJveC5sZWZ0ID0gbV9DbGlwQm94LnRvcCA9IDA7Ci0gICAgbV9DbGlwQm94LnJpZ2h0ID0gd2lkdGg7Ci0gICAgbV9DbGlwQm94LmJvdHRvbSA9IGhlaWdodDsKLSAgICBtX2JDbXlrT3V0cHV0ID0gYkNteWtPdXRwdXQ7CisjZGVmaW5lIE9VVFBVVF9QUyhzdHIpIG1fcE91dHB1dC0+T3V0cHV0UFMoc3RyLCBzaXplb2Ygc3RyIC0gMSkKK3ZvaWQgQ0ZYX1BTUmVuZGVyZXI6OkluaXQoSUZYX1BTT3V0cHV0KiBwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHNsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDbXlrT3V0cHV0KSB7CisgIG1fUFNMZXZlbCA9IHBzbGV2ZWw7CisgIG1fcE91dHB1dCA9IHBPdXRwdXQ7CisgIG1fQ2xpcEJveC5sZWZ0ID0gbV9DbGlwQm94LnRvcCA9IDA7CisgIG1fQ2xpcEJveC5yaWdodCA9IHdpZHRoOworICBtX0NsaXBCb3guYm90dG9tID0gaGVpZ2h0OworICBtX2JDbXlrT3V0cHV0ID0gYkNteWtPdXRwdXQ7CiB9Ci1GWF9CT09MIENGWF9QU1JlbmRlcmVyOjpTdGFydFJlbmRlcmluZygpCi17Ci0gICAgaWYgKG1fYkluaXRlZCkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgaW5pdF9zdHJbXSA9ICJcbnNhdmVcbi9pbS9pbml0bWF0cml4IGxvYWQgZGVmXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvbi9uZXdwYXRoIGxvYWQgZGVmL20vbW92ZXRvIGxvYWQgZGVmL2wvbGluZXRvIGxvYWQgZGVmL2MvY3VydmV0byBsb2FkIGRlZi9oL2Nsb3NlcGF0aCBsb2FkIGRlZlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2YvZmlsbCBsb2FkIGRlZi9GL2VvZmlsbCBsb2FkIGRlZi9zL3N0cm9rZSBsb2FkIGRlZi9XL2NsaXAgbG9hZCBkZWYvVyovZW9jbGlwIGxvYWQgZGVmXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvcmcvc2V0cmdiY29sb3IgbG9hZCBkZWYvay9zZXRjbXlrY29sb3IgbG9hZCBkZWZcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9KL3NldGxpbmVjYXAgbG9hZCBkZWYvai9zZXRsaW5lam9pbiBsb2FkIGRlZi93L3NldGxpbmV3aWR0aCBsb2FkIGRlZi9NL3NldG1pdGVybGltaXQgbG9hZCBkZWYvZC9zZXRkYXNoIGxvYWQgZGVmXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvcS9nc2F2ZSBsb2FkIGRlZi9RL2dyZXN0b3JlIGxvYWQgZGVmL2lNL2ltYWdlbWFzayBsb2FkIGRlZlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL1RqL3Nob3cgbG9hZCBkZWYvRmYvZmluZGZvbnQgbG9hZCBkZWYvRnMvc2NhbGVmb250IGxvYWQgZGVmL1NmL3NldGZvbnQgbG9hZCBkZWZcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9jbS9jb25jYXQgbG9hZCBkZWYvQ20vY3VycmVudG1hdHJpeCBsb2FkIGRlZi9teC9tYXRyaXggbG9hZCBkZWYvc20vc2V0bWF0cml4IGxvYWQgZGVmXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKLSAgICBPVVRQVVRfUFMoaW5pdF9zdHIpOwotICAgIG1fYkluaXRlZCA9IFRSVUU7CitGWF9CT09MIENGWF9QU1JlbmRlcmVyOjpTdGFydFJlbmRlcmluZygpIHsKKyAgaWYgKG1fYkluaXRlZCkgewogICAgIHJldHVybiBUUlVFOworICB9CisgIHN0YXRpYyBjb25zdCBjaGFyIGluaXRfc3RyW10gPQorICAgICAgIlxuc2F2ZVxuL2ltL2luaXRtYXRyaXggbG9hZCBkZWZcbiIKKyAgICAgICIvbi9uZXdwYXRoIGxvYWQgZGVmL20vbW92ZXRvIGxvYWQgZGVmL2wvbGluZXRvIGxvYWQgZGVmL2MvY3VydmV0byBsb2FkICIKKyAgICAgICJkZWYvaC9jbG9zZXBhdGggbG9hZCBkZWZcbiIKKyAgICAgICIvZi9maWxsIGxvYWQgZGVmL0YvZW9maWxsIGxvYWQgZGVmL3Mvc3Ryb2tlIGxvYWQgZGVmL1cvY2xpcCBsb2FkICIKKyAgICAgICJkZWYvVyovZW9jbGlwIGxvYWQgZGVmXG4iCisgICAgICAiL3JnL3NldHJnYmNvbG9yIGxvYWQgZGVmL2svc2V0Y215a2NvbG9yIGxvYWQgZGVmXG4iCisgICAgICAiL0ovc2V0bGluZWNhcCBsb2FkIGRlZi9qL3NldGxpbmVqb2luIGxvYWQgZGVmL3cvc2V0bGluZXdpZHRoIGxvYWQgIgorICAgICAgImRlZi9NL3NldG1pdGVybGltaXQgbG9hZCBkZWYvZC9zZXRkYXNoIGxvYWQgZGVmXG4iCisgICAgICAiL3EvZ3NhdmUgbG9hZCBkZWYvUS9ncmVzdG9yZSBsb2FkIGRlZi9pTS9pbWFnZW1hc2sgbG9hZCBkZWZcbiIKKyAgICAgICIvVGovc2hvdyBsb2FkIGRlZi9GZi9maW5kZm9udCBsb2FkIGRlZi9Gcy9zY2FsZWZvbnQgbG9hZCBkZWYvU2Yvc2V0Zm9udCAiCisgICAgICAibG9hZCBkZWZcbiIKKyAgICAgICIvY20vY29uY2F0IGxvYWQgZGVmL0NtL2N1cnJlbnRtYXRyaXggbG9hZCBkZWYvbXgvbWF0cml4IGxvYWQgIgorICAgICAgImRlZi9zbS9zZXRtYXRyaXggbG9hZCBkZWZcbiI7CisgIE9VVFBVVF9QUyhpbml0X3N0cik7CisgIG1fYkluaXRlZCA9IFRSVUU7CisgIHJldHVybiBUUlVFOwogfQotdm9pZCBDRlhfUFNSZW5kZXJlcjo6RW5kUmVuZGVyaW5nKCkKLXsKLSAgICBpZiAobV9iSW5pdGVkKSB7Ci0gICAgICAgIE9VVFBVVF9QUygiXG5yZXN0b3JlXG4iKTsKK3ZvaWQgQ0ZYX1BTUmVuZGVyZXI6OkVuZFJlbmRlcmluZygpIHsKKyAgaWYgKG1fYkluaXRlZCkgeworICAgIE9VVFBVVF9QUygiXG5yZXN0b3JlXG4iKTsKKyAgfQorICBtX2JJbml0ZWQgPSBGQUxTRTsKK30KK3ZvaWQgQ0ZYX1BTUmVuZGVyZXI6OlNhdmVTdGF0ZSgpIHsKKyAgU3RhcnRSZW5kZXJpbmcoKTsKKyAgT1VUUFVUX1BTKCJxXG4iKTsKKyAgbV9DbGlwQm94U3RhY2suQWRkKG1fQ2xpcEJveCk7Cit9Cit2b2lkIENGWF9QU1JlbmRlcmVyOjpSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkKSB7CisgIFN0YXJ0UmVuZGVyaW5nKCk7CisgIGlmIChiS2VlcFNhdmVkKSB7CisgICAgT1VUUFVUX1BTKCJRXG5xXG4iKTsKKyAgfSBlbHNlIHsKKyAgICBPVVRQVVRfUFMoIlFcbiIpOworICB9CisgIG1fYkNvbG9yU2V0ID0gbV9iR3JhcGhTdGF0ZVNldCA9IEZBTFNFOworICBtX0NsaXBCb3ggPSBtX0NsaXBCb3hTdGFjay5HZXRBdChtX0NsaXBCb3hTdGFjay5HZXRTaXplKCkgLSAxKTsKKyAgaWYgKCFiS2VlcFNhdmVkKSB7CisgICAgbV9DbGlwQm94U3RhY2suUmVtb3ZlQXQobV9DbGlwQm94U3RhY2suR2V0U2l6ZSgpIC0gMSk7CisgIH0KK30KK3ZvaWQgQ0ZYX1BTUmVuZGVyZXI6Ok91dHB1dFBhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlKSB7CisgIGludCBuUG9pbnRzID0gcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCk7CisgIENGWF9CeXRlVGV4dEJ1ZiBidWY7CisgIGJ1Zi5Fc3RpbWF0ZVNpemUoblBvaW50cyAqIDEwKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuUG9pbnRzOyBpKyspIHsKKyAgICB1aW50OF90IGZsYWcgPSBwUGF0aERhdGEtPkdldEZsYWcoaSk7CisgICAgRlhfRkxPQVQgeCA9IHBQYXRoRGF0YS0+R2V0UG9pbnRYKGkpOworICAgIEZYX0ZMT0FUIHkgPSBwUGF0aERhdGEtPkdldFBvaW50WShpKTsKKyAgICBpZiAocE9iamVjdDJEZXZpY2UpIHsKKyAgICAgIHBPYmplY3QyRGV2aWNlLT5UcmFuc2Zvcm0oeCwgeSk7CiAgICAgfQotICAgIG1fYkluaXRlZCA9IEZBTFNFOwotfQotdm9pZCBDRlhfUFNSZW5kZXJlcjo6U2F2ZVN0YXRlKCkKLXsKLSAgICBTdGFydFJlbmRlcmluZygpOwotICAgIE9VVFBVVF9QUygicVxuIik7Ci0gICAgbV9DbGlwQm94U3RhY2suQWRkKG1fQ2xpcEJveCk7Ci19Ci12b2lkIENGWF9QU1JlbmRlcmVyOjpSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkKQotewotICAgIFN0YXJ0UmVuZGVyaW5nKCk7Ci0gICAgaWYgKGJLZWVwU2F2ZWQpIHsKLSAgICAgICAgT1VUUFVUX1BTKCJRXG5xXG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBPVVRQVVRfUFMoIlFcbiIpOwotICAgIH0KLSAgICBtX2JDb2xvclNldCA9IG1fYkdyYXBoU3RhdGVTZXQgPSBGQUxTRTsKLSAgICBtX0NsaXBCb3ggPSBtX0NsaXBCb3hTdGFjay5HZXRBdChtX0NsaXBCb3hTdGFjay5HZXRTaXplKCkgLSAxKTsKLSAgICBpZiAoIWJLZWVwU2F2ZWQpIHsKLSAgICAgICAgbV9DbGlwQm94U3RhY2suUmVtb3ZlQXQobV9DbGlwQm94U3RhY2suR2V0U2l6ZSgpIC0gMSk7Ci0gICAgfQotfQotdm9pZCBDRlhfUFNSZW5kZXJlcjo6T3V0cHV0UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UpCi17Ci0gICAgaW50IG5Qb2ludHMgPSBwUGF0aERhdGEtPkdldFBvaW50Q291bnQoKTsKLSAgICBDRlhfQnl0ZVRleHRCdWYgYnVmOwotICAgIGJ1Zi5Fc3RpbWF0ZVNpemUoblBvaW50cyAqIDEwKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Qb2ludHM7IGkgKyspIHsKLSAgICAgICAgRlhfQllURSBmbGFnID0gcFBhdGhEYXRhLT5HZXRGbGFnKGkpOwotICAgICAgICBGWF9GTE9BVCB4ID0gcFBhdGhEYXRhLT5HZXRQb2ludFgoaSk7Ci0gICAgICAgIEZYX0ZMT0FUIHkgPSBwUGF0aERhdGEtPkdldFBvaW50WShpKTsKKyAgICBidWYgPDwgeCA8PCAiICIgPDwgeTsKKyAgICBzd2l0Y2ggKGZsYWcgJiBGWFBUX1RZUEUpIHsKKyAgICAgIGNhc2UgRlhQVF9NT1ZFVE86CisgICAgICAgIGJ1ZiA8PCAiIG0gIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZYUFRfTElORVRPOgorICAgICAgICBpZiAoZmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpIHsKKyAgICAgICAgICBidWYgPDwgIiBsIGggIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBidWYgPDwgIiBsICI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZYUFRfQkVaSUVSVE86IHsKKyAgICAgICAgRlhfRkxPQVQgeDEgPSBwUGF0aERhdGEtPkdldFBvaW50WChpICsgMSk7CisgICAgICAgIEZYX0ZMT0FUIHgyID0gcFBhdGhEYXRhLT5HZXRQb2ludFgoaSArIDIpOworICAgICAgICBGWF9GTE9BVCB5MSA9IHBQYXRoRGF0YS0+R2V0UG9pbnRZKGkgKyAxKTsKKyAgICAgICAgRlhfRkxPQVQgeTIgPSBwUGF0aERhdGEtPkdldFBvaW50WShpICsgMik7CiAgICAgICAgIGlmIChwT2JqZWN0MkRldmljZSkgewotICAgICAgICAgICAgcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybSh4LCB5KTsKKyAgICAgICAgICBwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtKHgxLCB5MSk7CisgICAgICAgICAgcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybSh4MiwgeTIpOwogICAgICAgICB9Ci0gICAgICAgIGJ1ZiA8PCB4IDw8IEZYX0JTVFJDKCIgIikgPDwgeTsKLSAgICAgICAgc3dpdGNoIChmbGFnICYgRlhQVF9UWVBFKSB7Ci0gICAgICAgICAgICBjYXNlIEZYUFRfTU9WRVRPOgotICAgICAgICAgICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiIG0gIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZYUFRfTElORVRPOgotICAgICAgICAgICAgICAgIGlmIChmbGFnICYgRlhQVF9DTE9TRUZJR1VSRSkgewotICAgICAgICAgICAgICAgICAgICBidWYgPDwgRlhfQlNUUkMoIiBsIGggIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmIDw8IEZYX0JTVFJDKCIgbCAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZYUFRfQkVaSUVSVE86IHsKLSAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDEgPSBwUGF0aERhdGEtPkdldFBvaW50WChpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgyID0gcFBhdGhEYXRhLT5HZXRQb2ludFgoaSArIDIpOwotICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MSA9IHBQYXRoRGF0YS0+R2V0UG9pbnRZKGkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTIgPSBwUGF0aERhdGEtPkdldFBvaW50WShpICsgMik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwT2JqZWN0MkRldmljZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybSh4MSwgeTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybSh4MiwgeTIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiICIpIDw8IHgxIDw8IEZYX0JTVFJDKCIgIikgPDwgeTEgPDwgRlhfQlNUUkMoIiAiKSA8PCB4MiA8PCBGWF9CU1RSQygiICIpIDw8IHkyOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiIGMgaFxuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWYgPDwgRlhfQlNUUkMoIiBjXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpICs9IDI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgYnVmIDw8ICIgIiA8PCB4MSA8PCAiICIgPDwgeTEgPDwgIiAiIDw8IHgyIDw8ICIgIiA8PCB5MjsKKyAgICAgICAgaWYgKGZsYWcgJiBGWFBUX0NMT1NFRklHVVJFKSB7CisgICAgICAgICAgYnVmIDw8ICIgYyBoXG4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJ1ZiA8PCAiIGNcbiI7CiAgICAgICAgIH0KKyAgICAgICAgaSArPSAyOworICAgICAgICBicmVhazsKKyAgICAgIH0KICAgICB9Ci0gICAgbV9wT3V0cHV0LT5PdXRwdXRQUygoRlhfTFBDU1RSKWJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldFNpemUoKSk7CisgIH0KKyAgbV9wT3V0cHV0LT5PdXRwdXRQUygoY29uc3QgRlhfQ0hBUiopYnVmLkdldEJ1ZmZlcigpLCBidWYuR2V0U2l6ZSgpKTsKIH0KIHZvaWQgQ0ZYX1BTUmVuZGVyZXI6OlNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAgIFN0YXJ0UmVuZGVyaW5nKCk7Ci0gICAgT3V0cHV0UGF0aChwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlKTsKLSAgICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBwUGF0aERhdGEtPkdldEJvdW5kaW5nQm94KCk7Ci0gICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7Ci0gICAgICAgIHJlY3QuVHJhbnNmb3JtKHBPYmplY3QyRGV2aWNlKTsKLSAgICB9Ci0gICAgbV9DbGlwQm94LkludGVyc2VjdChyZWN0LkdldE91dHRlclJlY3QoKSk7Ci0gICAgaWYgKChmaWxsX21vZGUgJiAzKSA9PSBGWEZJTExfV0lORElORykgewotICAgICAgICBPVVRQVVRfUFMoIlcgblxuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgT1VUUFVUX1BTKCJXKiBuXG4iKTsKLSAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlKSB7CisgIFN0YXJ0UmVuZGVyaW5nKCk7CisgIE91dHB1dFBhdGgocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSk7CisgIENGWF9GbG9hdFJlY3QgcmVjdCA9IHBQYXRoRGF0YS0+R2V0Qm91bmRpbmdCb3goKTsKKyAgaWYgKHBPYmplY3QyRGV2aWNlKSB7CisgICAgcmVjdC5UcmFuc2Zvcm0ocE9iamVjdDJEZXZpY2UpOworICB9CisgIG1fQ2xpcEJveC5JbnRlcnNlY3QocmVjdC5HZXRPdXR0ZXJSZWN0KCkpOworICBpZiAoKGZpbGxfbW9kZSAmIDMpID09IEZYRklMTF9XSU5ESU5HKSB7CisgICAgT1VUUFVUX1BTKCJXIG5cbiIpOworICB9IGVsc2UgeworICAgIE9VVFBVVF9QUygiVyogblxuIik7CisgIH0KIH0KIHZvaWQgQ0ZYX1BTUmVuZGVyZXI6OlNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgU3RhcnRSZW5kZXJpbmcoKTsKLSAgICBTZXRHcmFwaFN0YXRlKHBHcmFwaFN0YXRlKTsKLSAgICBpZiAocE9iamVjdDJEZXZpY2UpIHsKLSAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKLSAgICAgICAgYnVmIDw8IEZYX0JTVFJDKCJteCBDbSBbIikgPDwgcE9iamVjdDJEZXZpY2UtPmEgPDwgRlhfQlNUUkMoIiAiKSA8PCBwT2JqZWN0MkRldmljZS0+YiA8PCBGWF9CU1RSQygiICIpIDw8Ci0gICAgICAgICAgICBwT2JqZWN0MkRldmljZS0+YyA8PCBGWF9CU1RSQygiICIpIDw8IHBPYmplY3QyRGV2aWNlLT5kIDw8IEZYX0JTVFJDKCIgIikgPDwgcE9iamVjdDJEZXZpY2UtPmUgPDwKLSAgICAgICAgICAgIEZYX0JTVFJDKCIgIikgPDwgcE9iamVjdDJEZXZpY2UtPmYgPDwgRlhfQlNUUkMoIl1jbSAiKTsKLSAgICAgICAgbV9wT3V0cHV0LT5PdXRwdXRQUygoRlhfTFBDU1RSKWJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldFNpemUoKSk7Ci0gICAgfQotICAgIE91dHB1dFBhdGgocFBhdGhEYXRhLCBOVUxMKTsKLSAgICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBwUGF0aERhdGEtPkdldEJvdW5kaW5nQm94KHBHcmFwaFN0YXRlLT5tX0xpbmVXaWR0aCwgcEdyYXBoU3RhdGUtPm1fTWl0ZXJMaW1pdCk7Ci0gICAgcmVjdC5UcmFuc2Zvcm0ocE9iamVjdDJEZXZpY2UpOwotICAgIG1fQ2xpcEJveC5JbnRlcnNlY3QocmVjdC5HZXRPdXR0ZXJSZWN0KCkpOwotICAgIGlmIChwT2JqZWN0MkRldmljZSkgewotICAgICAgICBPVVRQVVRfUFMoInN0cm9rZXBhdGggVyBuIHNtXG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBPVVRQVVRfUFMoInN0cm9rZXBhdGggVyBuXG4iKTsKLSAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSkgeworICBTdGFydFJlbmRlcmluZygpOworICBTZXRHcmFwaFN0YXRlKHBHcmFwaFN0YXRlKTsKKyAgaWYgKHBPYmplY3QyRGV2aWNlKSB7CisgICAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKKyAgICBidWYgPDwgIm14IENtIFsiIDw8IHBPYmplY3QyRGV2aWNlLT5hIDw8ICIgIiA8PCBwT2JqZWN0MkRldmljZS0+YiA8PCAiICIKKyAgICAgICAgPDwgcE9iamVjdDJEZXZpY2UtPmMgPDwgIiAiIDw8IHBPYmplY3QyRGV2aWNlLT5kIDw8ICIgIgorICAgICAgICA8PCBwT2JqZWN0MkRldmljZS0+ZSA8PCAiICIgPDwgcE9iamVjdDJEZXZpY2UtPmYgPDwgIl1jbSAiOworICAgIG1fcE91dHB1dC0+T3V0cHV0UFMoKGNvbnN0IEZYX0NIQVIqKWJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldFNpemUoKSk7CisgIH0KKyAgT3V0cHV0UGF0aChwUGF0aERhdGEsIE5VTEwpOworICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBwUGF0aERhdGEtPkdldEJvdW5kaW5nQm94KHBHcmFwaFN0YXRlLT5tX0xpbmVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwR3JhcGhTdGF0ZS0+bV9NaXRlckxpbWl0KTsKKyAgcmVjdC5UcmFuc2Zvcm0ocE9iamVjdDJEZXZpY2UpOworICBtX0NsaXBCb3guSW50ZXJzZWN0KHJlY3QuR2V0T3V0dGVyUmVjdCgpKTsKKyAgaWYgKHBPYmplY3QyRGV2aWNlKSB7CisgICAgT1VUUFVUX1BTKCJzdHJva2VwYXRoIFcgbiBzbVxuIik7CisgIH0gZWxzZSB7CisgICAgT1VUUFVUX1BTKCJzdHJva2VwYXRoIFcgblxuIik7CisgIH0KIH0KIEZYX0JPT0wgQ0ZYX1BTUmVuZGVyZXI6OkRyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3Ryb2tlX2NvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgU3RhcnRSZW5kZXJpbmcoKTsKLSAgICBpbnQgZmlsbF9hbHBoYSA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKSA6IEZYQVJHQl9BKGZpbGxfY29sb3IpOwotICAgIGludCBzdHJva2VfYWxwaGEgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpID8gRlhHRVRGTEFHX0FMUEhBX1NUUk9LRShhbHBoYV9mbGFnKSA6IEZYQVJHQl9BKHN0cm9rZV9jb2xvcik7Ci0gICAgaWYgKGZpbGxfYWxwaGEgJiYgZmlsbF9hbHBoYSA8IDI1NSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIFN0YXJ0UmVuZGVyaW5nKCk7CisgIGludCBmaWxsX2FscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKQorICAgICAgICAgICAgICAgICAgICAgICA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpCisgICAgICAgICAgICAgICAgICAgICAgIDogRlhBUkdCX0EoZmlsbF9jb2xvcik7CisgIGludCBzdHJva2VfYWxwaGEgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpCisgICAgICAgICAgICAgICAgICAgICAgICAgPyBGWEdFVEZMQUdfQUxQSEFfU1RST0tFKGFscGhhX2ZsYWcpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiBGWEFSR0JfQShzdHJva2VfY29sb3IpOworICBpZiAoZmlsbF9hbHBoYSAmJiBmaWxsX2FscGhhIDwgMjU1KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChzdHJva2VfYWxwaGEgJiYgc3Ryb2tlX2FscGhhIDwgMjU1KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChmaWxsX2FscGhhID09IDAgJiYgc3Ryb2tlX2FscGhhID09IDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKHN0cm9rZV9hbHBoYSkgeworICAgIFNldEdyYXBoU3RhdGUocEdyYXBoU3RhdGUpOworICAgIGlmIChwT2JqZWN0MkRldmljZSkgeworICAgICAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKKyAgICAgIGJ1ZiA8PCAibXggQ20gWyIgPDwgcE9iamVjdDJEZXZpY2UtPmEgPDwgIiAiIDw8IHBPYmplY3QyRGV2aWNlLT5iIDw8ICIgIgorICAgICAgICAgIDw8IHBPYmplY3QyRGV2aWNlLT5jIDw8ICIgIiA8PCBwT2JqZWN0MkRldmljZS0+ZCA8PCAiICIKKyAgICAgICAgICA8PCBwT2JqZWN0MkRldmljZS0+ZSA8PCAiICIgPDwgcE9iamVjdDJEZXZpY2UtPmYgPDwgIl1jbSAiOworICAgICAgbV9wT3V0cHV0LT5PdXRwdXRQUygoY29uc3QgRlhfQ0hBUiopYnVmLkdldEJ1ZmZlcigpLCBidWYuR2V0U2l6ZSgpKTsKICAgICB9Ci0gICAgaWYgKHN0cm9rZV9hbHBoYSAmJiBzdHJva2VfYWxwaGEgPCAyNTUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIE91dHB1dFBhdGgocFBhdGhEYXRhLCBzdHJva2VfYWxwaGEgPyBOVUxMIDogcE9iamVjdDJEZXZpY2UpOworICBpZiAoZmlsbF9tb2RlICYmIGZpbGxfYWxwaGEpIHsKKyAgICBTZXRDb2xvcihmaWxsX2NvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKKyAgICBpZiAoKGZpbGxfbW9kZSAmIDMpID09IEZYRklMTF9XSU5ESU5HKSB7CisgICAgICBpZiAoc3Ryb2tlX2FscGhhKSB7CisgICAgICAgIE9VVFBVVF9QUygicSBmIFEgIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBPVVRQVVRfUFMoImYiKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKChmaWxsX21vZGUgJiAzKSA9PSBGWEZJTExfQUxURVJOQVRFKSB7CisgICAgICBpZiAoc3Ryb2tlX2FscGhhKSB7CisgICAgICAgIE9VVFBVVF9QUygicSBGIFEgIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBPVVRQVVRfUFMoIkYiKTsKKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKGZpbGxfYWxwaGEgPT0gMCAmJiBzdHJva2VfYWxwaGEgPT0gMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKHN0cm9rZV9hbHBoYSkgeworICAgIFNldENvbG9yKHN0cm9rZV9jb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CisgICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7CisgICAgICBPVVRQVVRfUFMoInMgc20iKTsKKyAgICB9IGVsc2UgeworICAgICAgT1VUUFVUX1BTKCJzIik7CiAgICAgfQotICAgIGlmIChzdHJva2VfYWxwaGEpIHsKLSAgICAgICAgU2V0R3JhcGhTdGF0ZShwR3JhcGhTdGF0ZSk7Ci0gICAgICAgIGlmIChwT2JqZWN0MkRldmljZSkgewotICAgICAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKLSAgICAgICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygibXggQ20gWyIpIDw8IHBPYmplY3QyRGV2aWNlLT5hIDw8IEZYX0JTVFJDKCIgIikgPDwgcE9iamVjdDJEZXZpY2UtPmIgPDwgRlhfQlNUUkMoIiAiKSA8PAotICAgICAgICAgICAgICAgIHBPYmplY3QyRGV2aWNlLT5jIDw8IEZYX0JTVFJDKCIgIikgPDwgcE9iamVjdDJEZXZpY2UtPmQgPDwgRlhfQlNUUkMoIiAiKSA8PCBwT2JqZWN0MkRldmljZS0+ZSA8PAotICAgICAgICAgICAgICAgIEZYX0JTVFJDKCIgIikgPDwgcE9iamVjdDJEZXZpY2UtPmYgPDwgRlhfQlNUUkMoIl1jbSAiKTsKLSAgICAgICAgICAgIG1fcE91dHB1dC0+T3V0cHV0UFMoKEZYX0xQQ1NUUilidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRTaXplKCkpOwotICAgICAgICB9CisgIH0KKyAgT1VUUFVUX1BTKCJcbiIpOworICByZXR1cm4gVFJVRTsKK30KK3ZvaWQgQ0ZYX1BTUmVuZGVyZXI6OlNldEdyYXBoU3RhdGUoY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSkgeworICBDRlhfQnl0ZVRleHRCdWYgYnVmOworICBpZiAoIW1fYkdyYXBoU3RhdGVTZXQgfHwKKyAgICAgIG1fQ3VyR3JhcGhTdGF0ZS5tX0xpbmVDYXAgIT0gcEdyYXBoU3RhdGUtPm1fTGluZUNhcCkgeworICAgIGJ1ZiA8PCBwR3JhcGhTdGF0ZS0+bV9MaW5lQ2FwIDw8ICIgSlxuIjsKKyAgfQorICBpZiAoIW1fYkdyYXBoU3RhdGVTZXQgfHwKKyAgICAgIG1fQ3VyR3JhcGhTdGF0ZS5tX0Rhc2hDb3VudCAhPSBwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQgfHwKKyAgICAgIEZYU1lTX21lbWNtcChtX0N1ckdyYXBoU3RhdGUubV9EYXNoQXJyYXksIHBHcmFwaFN0YXRlLT5tX0Rhc2hBcnJheSwKKyAgICAgICAgICAgICAgICAgICBzaXplb2YoRlhfRkxPQVQpICogbV9DdXJHcmFwaFN0YXRlLm1fRGFzaENvdW50KSkgeworICAgIGJ1ZiA8PCAiWyI7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQ7IGkrKykgeworICAgICAgYnVmIDw8IHBHcmFwaFN0YXRlLT5tX0Rhc2hBcnJheVtpXSA8PCAiICI7CiAgICAgfQotICAgIE91dHB1dFBhdGgocFBhdGhEYXRhLCBzdHJva2VfYWxwaGEgPyBOVUxMIDogcE9iamVjdDJEZXZpY2UpOwotICAgIGlmIChmaWxsX21vZGUgJiYgZmlsbF9hbHBoYSkgewotICAgICAgICBTZXRDb2xvcihmaWxsX2NvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgaWYgKChmaWxsX21vZGUgJiAzKSA9PSBGWEZJTExfV0lORElORykgewotICAgICAgICAgICAgaWYgKHN0cm9rZV9hbHBoYSkgewotICAgICAgICAgICAgICAgIE9VVFBVVF9QUygicSBmIFEgIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIE9VVFBVVF9QUygiZiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKChmaWxsX21vZGUgJiAzKSA9PSBGWEZJTExfQUxURVJOQVRFKSB7Ci0gICAgICAgICAgICBpZiAoc3Ryb2tlX2FscGhhKSB7Ci0gICAgICAgICAgICAgICAgT1VUUFVUX1BTKCJxIEYgUSAiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgT1VUUFVUX1BTKCJGIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICBidWYgPDwgIl0iIDw8IHBHcmFwaFN0YXRlLT5tX0Rhc2hQaGFzZSA8PCAiIGRcbiI7CisgIH0KKyAgaWYgKCFtX2JHcmFwaFN0YXRlU2V0IHx8CisgICAgICBtX0N1ckdyYXBoU3RhdGUubV9MaW5lSm9pbiAhPSBwR3JhcGhTdGF0ZS0+bV9MaW5lSm9pbikgeworICAgIGJ1ZiA8PCBwR3JhcGhTdGF0ZS0+bV9MaW5lSm9pbiA8PCAiIGpcbiI7CisgIH0KKyAgaWYgKCFtX2JHcmFwaFN0YXRlU2V0IHx8CisgICAgICBtX0N1ckdyYXBoU3RhdGUubV9MaW5lV2lkdGggIT0gcEdyYXBoU3RhdGUtPm1fTGluZVdpZHRoKSB7CisgICAgYnVmIDw8IHBHcmFwaFN0YXRlLT5tX0xpbmVXaWR0aCA8PCAiIHdcbiI7CisgIH0KKyAgaWYgKCFtX2JHcmFwaFN0YXRlU2V0IHx8CisgICAgICBtX0N1ckdyYXBoU3RhdGUubV9NaXRlckxpbWl0ICE9IHBHcmFwaFN0YXRlLT5tX01pdGVyTGltaXQpIHsKKyAgICBidWYgPDwgcEdyYXBoU3RhdGUtPm1fTWl0ZXJMaW1pdCA8PCAiIE1cbiI7CisgIH0KKyAgbV9DdXJHcmFwaFN0YXRlLkNvcHkoKnBHcmFwaFN0YXRlKTsKKyAgbV9iR3JhcGhTdGF0ZVNldCA9IFRSVUU7CisgIGlmIChidWYuR2V0U2l6ZSgpKSB7CisgICAgbV9wT3V0cHV0LT5PdXRwdXRQUygoY29uc3QgRlhfQ0hBUiopYnVmLkdldEJ1ZmZlcigpLCBidWYuR2V0U2l6ZSgpKTsKKyAgfQorfQorc3RhdGljIHZvaWQgRmF4Q29tcHJlc3NEYXRhKHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkZXN0X3NpemUpIHsKKyAgQ0NvZGVjX01vZHVsZU1nciogcEVuY29kZXJzID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKTsKKyAgaWYgKHdpZHRoICogaGVpZ2h0ID4gMTI4ICYmIHBFbmNvZGVycyAmJgorICAgICAgcEVuY29kZXJzLT5HZXRGYXhNb2R1bGUoKS0+RW5jb2RlKHNyY19idWYsIHdpZHRoLCBoZWlnaHQsICh3aWR0aCArIDcpIC8gOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2J1ZiwgZGVzdF9zaXplKSkgeworICAgIEZYX0ZyZWUoc3JjX2J1Zik7CisgIH0gZWxzZSB7CisgICAgZGVzdF9idWYgPSBzcmNfYnVmOworICAgIGRlc3Rfc2l6ZSA9ICh3aWR0aCArIDcpIC8gOCAqIGhlaWdodDsKKyAgfQorfQorc3RhdGljIHZvaWQgUFNDb21wcmVzc0RhdGEoaW50IFBTTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgb3V0cHV0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBvdXRwdXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqJiBmaWx0ZXIpIHsKKyAgb3V0cHV0X2J1ZiA9IHNyY19idWY7CisgIG91dHB1dF9zaXplID0gc3JjX3NpemU7CisgIGZpbHRlciA9ICIiOworICBpZiAoc3JjX3NpemUgPCAxMDI0KSB7CisgICAgcmV0dXJuOworICB9CisgIENDb2RlY19Nb2R1bGVNZ3IqIHBFbmNvZGVycyA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCk7CisgIHVpbnQ4X3QqIGRlc3RfYnVmID0gTlVMTDsKKyAgRlhfRFdPUkQgZGVzdF9zaXplID0gc3JjX3NpemU7CisgIGlmIChQU0xldmVsID49IDMpIHsKKyAgICBpZiAocEVuY29kZXJzICYmCisgICAgICAgIHBFbmNvZGVycy0+R2V0RmxhdGVNb2R1bGUoKS0+RW5jb2RlKHNyY19idWYsIHNyY19zaXplLCBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zaXplKSkgeworICAgICAgZmlsdGVyID0gIi9GbGF0ZURlY29kZSBmaWx0ZXIgIjsKICAgICB9Ci0gICAgaWYgKHN0cm9rZV9hbHBoYSkgewotICAgICAgICBTZXRDb2xvcihzdHJva2VfY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwotICAgICAgICBpZiAocE9iamVjdDJEZXZpY2UpIHsKLSAgICAgICAgICAgIE9VVFBVVF9QUygicyBzbSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgT1VUUFVUX1BTKCJzIik7Ci0gICAgICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAocEVuY29kZXJzICYmCisgICAgICAgIHBFbmNvZGVycy0+R2V0QmFzaWNNb2R1bGUoKS0+UnVuTGVuZ3RoRW5jb2RlKHNyY19idWYsIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2J1ZiwgZGVzdF9zaXplKSkgeworICAgICAgZmlsdGVyID0gIi9SdW5MZW5ndGhEZWNvZGUgZmlsdGVyICI7CiAgICAgfQotICAgIE9VVFBVVF9QUygiXG4iKTsKKyAgfQorICBpZiAoZGVzdF9zaXplIDwgc3JjX3NpemUpIHsKKyAgICBvdXRwdXRfYnVmID0gZGVzdF9idWY7CisgICAgb3V0cHV0X3NpemUgPSBkZXN0X3NpemU7CisgIH0gZWxzZSB7CisgICAgZmlsdGVyID0gTlVMTDsKKyAgICBGWF9GcmVlKGRlc3RfYnVmKTsKKyAgfQorfQorRlhfQk9PTCBDRlhfUFNSZW5kZXJlcjo6U2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIFN0YXJ0UmVuZGVyaW5nKCk7CisgIENGWF9NYXRyaXggbWF0cml4KChGWF9GTE9BVCkocFNvdXJjZS0+R2V0V2lkdGgoKSksIDAuMGYsIDAuMGYsCisgICAgICAgICAgICAgICAgICAgIC0oRlhfRkxPQVQpKHBTb3VyY2UtPkdldEhlaWdodCgpKSwgKEZYX0ZMT0FUKShsZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKSh0b3AgKyBwU291cmNlLT5HZXRIZWlnaHQoKSkpOworICByZXR1cm4gRHJhd0RJQml0cyhwU291cmNlLCBjb2xvciwgJm1hdHJpeCwgMCwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Cit9CitGWF9CT09MIENGWF9QU1JlbmRlcmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBTdGFydFJlbmRlcmluZygpOworICBDRlhfTWF0cml4IG1hdHJpeCgoRlhfRkxPQVQpKGRlc3Rfd2lkdGgpLCAwLjBmLCAwLjBmLAorICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKC1kZXN0X2hlaWdodCksIChGWF9GTE9BVCkoZGVzdF9sZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShkZXN0X3RvcCArIGRlc3RfaGVpZ2h0KSk7CisgIHJldHVybiBEcmF3RElCaXRzKHBTb3VyY2UsIGNvbG9yLCAmbWF0cml4LCBmbGFncywgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Cit9CitGWF9CT09MIENGWF9QU1JlbmRlcmVyOjpEcmF3RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgU3RhcnRSZW5kZXJpbmcoKTsKKyAgaWYgKChwTWF0cml4LT5hID09IDAgJiYgcE1hdHJpeC0+YiA9PSAwKSB8fAorICAgICAgKHBNYXRyaXgtPmMgPT0gMCAmJiBwTWF0cml4LT5kID09IDApKSB7CiAgICAgcmV0dXJuIFRSVUU7Ci19Ci12b2lkIENGWF9QU1JlbmRlcmVyOjpTZXRHcmFwaFN0YXRlKGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUpCi17Ci0gICAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKLSAgICBpZiAoIW1fYkdyYXBoU3RhdGVTZXQgfHwgbV9DdXJHcmFwaFN0YXRlLm1fTGluZUNhcCAhPSBwR3JhcGhTdGF0ZS0+bV9MaW5lQ2FwKSB7Ci0gICAgICAgIGJ1ZiA8PCBwR3JhcGhTdGF0ZS0+bV9MaW5lQ2FwIDw8IEZYX0JTVFJDKCIgSlxuIik7CisgIH0KKyAgaWYgKHBTb3VyY2UtPkhhc0FscGhhKCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW50IGFscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGNvbG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhBUkdCX0EoY29sb3IpOworICBpZiAocFNvdXJjZS0+SXNBbHBoYU1hc2soKSAmJiAoYWxwaGEgPCAyNTUgfHwgcFNvdXJjZS0+R2V0QlBQKCkgIT0gMSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgT1VUUFVUX1BTKCJxXG4iKTsKKyAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKKyAgYnVmIDw8ICJbIiA8PCBwTWF0cml4LT5hIDw8ICIgIiA8PCBwTWF0cml4LT5iIDw8ICIgIiA8PCBwTWF0cml4LT5jIDw8ICIgIgorICAgICAgPDwgcE1hdHJpeC0+ZCA8PCAiICIgPDwgcE1hdHJpeC0+ZSA8PCAiICIgPDwgcE1hdHJpeC0+ZiA8PCAiXWNtICI7CisgIGludCB3aWR0aCA9IHBTb3VyY2UtPkdldFdpZHRoKCk7CisgIGludCBoZWlnaHQgPSBwU291cmNlLT5HZXRIZWlnaHQoKTsKKyAgYnVmIDw8IHdpZHRoIDw8ICIgIiA8PCBoZWlnaHQ7CisgIGlmIChwU291cmNlLT5HZXRCUFAoKSA9PSAxICYmICFwU291cmNlLT5HZXRQYWxldHRlKCkpIHsKKyAgICBpbnQgcGl0Y2ggPSAod2lkdGggKyA3KSAvIDg7CisgICAgRlhfRFdPUkQgc3JjX3NpemUgPSBoZWlnaHQgKiBwaXRjaDsKKyAgICB1aW50OF90KiBzcmNfYnVmID0gRlhfQWxsb2ModWludDhfdCwgc3JjX3NpemUpOworICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNvdXJjZS0+R2V0U2NhbmxpbmUocm93KTsKKyAgICAgIEZYU1lTX21lbWNweShzcmNfYnVmICsgcm93ICogcGl0Y2gsIHNyY19zY2FuLCBwaXRjaCk7CiAgICAgfQotICAgIGlmICghbV9iR3JhcGhTdGF0ZVNldCB8fCBtX0N1ckdyYXBoU3RhdGUubV9EYXNoQ291bnQgIT0gcEdyYXBoU3RhdGUtPm1fRGFzaENvdW50IHx8Ci0gICAgICAgICAgICBGWFNZU19tZW1jbXAzMihtX0N1ckdyYXBoU3RhdGUubV9EYXNoQXJyYXksIHBHcmFwaFN0YXRlLT5tX0Rhc2hBcnJheSwgc2l6ZW9mKEZYX0ZMT0FUKSptX0N1ckdyYXBoU3RhdGUubV9EYXNoQ291bnQpKSB7Ci0gICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiWyIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudDsgaSArKykgewotICAgICAgICAgICAgYnVmIDw8IHBHcmFwaFN0YXRlLT5tX0Rhc2hBcnJheVtpXSA8PCBGWF9CU1RSQygiICIpOwotICAgICAgICB9Ci0gICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiXSIpIDw8IHBHcmFwaFN0YXRlLT5tX0Rhc2hQaGFzZSA8PCBGWF9CU1RSQygiIGRcbiIpOwotICAgIH0KLSAgICBpZiAoIW1fYkdyYXBoU3RhdGVTZXQgfHwgbV9DdXJHcmFwaFN0YXRlLm1fTGluZUpvaW4gIT0gcEdyYXBoU3RhdGUtPm1fTGluZUpvaW4pIHsKLSAgICAgICAgYnVmIDw8IHBHcmFwaFN0YXRlLT5tX0xpbmVKb2luIDw8IEZYX0JTVFJDKCIgalxuIik7Ci0gICAgfQotICAgIGlmICghbV9iR3JhcGhTdGF0ZVNldCB8fCBtX0N1ckdyYXBoU3RhdGUubV9MaW5lV2lkdGggIT0gcEdyYXBoU3RhdGUtPm1fTGluZVdpZHRoKSB7Ci0gICAgICAgIGJ1ZiA8PCBwR3JhcGhTdGF0ZS0+bV9MaW5lV2lkdGggPDwgRlhfQlNUUkMoIiB3XG4iKTsKLSAgICB9Ci0gICAgaWYgKCFtX2JHcmFwaFN0YXRlU2V0IHx8IG1fQ3VyR3JhcGhTdGF0ZS5tX01pdGVyTGltaXQgIT0gcEdyYXBoU3RhdGUtPm1fTWl0ZXJMaW1pdCkgewotICAgICAgICBidWYgPDwgcEdyYXBoU3RhdGUtPm1fTWl0ZXJMaW1pdCA8PCBGWF9CU1RSQygiIE1cbiIpOwotICAgIH0KLSAgICBtX0N1ckdyYXBoU3RhdGUuQ29weSgqcEdyYXBoU3RhdGUpOwotICAgIG1fYkdyYXBoU3RhdGVTZXQgPSBUUlVFOwotICAgIGlmIChidWYuR2V0U2l6ZSgpKSB7Ci0gICAgICAgIG1fcE91dHB1dC0+T3V0cHV0UFMoKEZYX0xQQ1NUUilidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRTaXplKCkpOwotICAgIH0KLX0KLXN0YXRpYyB2b2lkIEZheENvbXByZXNzRGF0YShGWF9MUEJZVEUgc3JjX2J1ZiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWF9MUEJZVEUmIGRlc3RfYnVmLCBGWF9EV09SRCYgZGVzdF9zaXplKQotewotICAgIENDb2RlY19Nb2R1bGVNZ3IqIHBFbmNvZGVycyA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCk7Ci0gICAgaWYgKHdpZHRoICogaGVpZ2h0ID4gMTI4ICYmIHBFbmNvZGVycyAmJiBwRW5jb2RlcnMtPkdldEZheE1vZHVsZSgpLT5FbmNvZGUoc3JjX2J1Ziwgd2lkdGgsIGhlaWdodCwgKHdpZHRoICsgNykgLyA4LCBkZXN0X2J1ZiwgZGVzdF9zaXplKSkgewotICAgICAgICBGWF9GcmVlKHNyY19idWYpOworICAgIHVpbnQ4X3QqIG91dHB1dF9idWY7CisgICAgRlhfRFdPUkQgb3V0cHV0X3NpemU7CisgICAgRmF4Q29tcHJlc3NEYXRhKHNyY19idWYsIHdpZHRoLCBoZWlnaHQsIG91dHB1dF9idWYsIG91dHB1dF9zaXplKTsKKyAgICBpZiAocFNvdXJjZS0+SXNBbHBoYU1hc2soKSkgeworICAgICAgU2V0Q29sb3IoY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOworICAgICAgbV9iQ29sb3JTZXQgPSBGQUxTRTsKKyAgICAgIGJ1ZiA8PCAiIHRydWVbIjsKICAgICB9IGVsc2UgewotICAgICAgICBkZXN0X2J1ZiA9IHNyY19idWY7Ci0gICAgICAgIGRlc3Rfc2l6ZSA9ICh3aWR0aCArIDcpIC8gOCAqIGhlaWdodDsKKyAgICAgIGJ1ZiA8PCAiIDFbIjsKICAgICB9Ci19Ci1zdGF0aWMgdm9pZCBQU0NvbXByZXNzRGF0YShpbnQgUFNMZXZlbCwgRlhfTFBCWVRFIHNyY19idWYsIEZYX0RXT1JEIHNyY19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBCWVRFJiBvdXRwdXRfYnVmLCBGWF9EV09SRCYgb3V0cHV0X3NpemUsIEZYX0xQQ1NUUiYgZmlsdGVyKQotewotICAgIG91dHB1dF9idWYgPSBzcmNfYnVmOwotICAgIG91dHB1dF9zaXplID0gc3JjX3NpemU7Ci0gICAgZmlsdGVyID0gIiI7Ci0gICAgaWYgKHNyY19zaXplIDwgMTAyNCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENDb2RlY19Nb2R1bGVNZ3IqIHBFbmNvZGVycyA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCk7Ci0gICAgRlhfTFBCWVRFIGRlc3RfYnVmID0gTlVMTDsKLSAgICBGWF9EV09SRCBkZXN0X3NpemUgPSBzcmNfc2l6ZTsKLSAgICBpZiAoUFNMZXZlbCA+PSAzKSB7Ci0gICAgICAgIGlmIChwRW5jb2RlcnMgJiYgcEVuY29kZXJzLT5HZXRGbGF0ZU1vZHVsZSgpLT5FbmNvZGUoc3JjX2J1Ziwgc3JjX3NpemUsIGRlc3RfYnVmLCBkZXN0X3NpemUpKSB7Ci0gICAgICAgICAgICBmaWx0ZXIgPSAiL0ZsYXRlRGVjb2RlIGZpbHRlciAiOwotICAgICAgICB9CisgICAgYnVmIDw8IHdpZHRoIDw8ICIgMCAwIC0iIDw8IGhlaWdodCA8PCAiIDAgIiA8PCBoZWlnaHQKKyAgICAgICAgPDwgIl1jdXJyZW50ZmlsZS9BU0NJSTg1RGVjb2RlIGZpbHRlciAiOworICAgIGlmIChvdXRwdXRfYnVmICE9IHNyY19idWYpCisgICAgICBidWYgPDwgIjw8L0sgLTEvRW5kT2ZCbG9jayBmYWxzZS9Db2x1bW5zICIgPDwgd2lkdGggPDwgIi9Sb3dzICIgPDwgaGVpZ2h0CisgICAgICAgICAgPDwgIj4+L0NDSVRURmF4RGVjb2RlIGZpbHRlciAiOworICAgIGlmIChwU291cmNlLT5Jc0FscGhhTWFzaygpKSB7CisgICAgICBidWYgPDwgImlNXG4iOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChwRW5jb2RlcnMgJiYgcEVuY29kZXJzLT5HZXRCYXNpY01vZHVsZSgpLT5SdW5MZW5ndGhFbmNvZGUoc3JjX2J1Ziwgc3JjX3NpemUsIGRlc3RfYnVmLCBkZXN0X3NpemUpKSB7Ci0gICAgICAgICAgICBmaWx0ZXIgPSAiL1J1bkxlbmd0aERlY29kZSBmaWx0ZXIgIjsKLSAgICAgICAgfQorICAgICAgYnVmIDw8ICJmYWxzZSAxIGNvbG9yaW1hZ2VcbiI7CiAgICAgfQotICAgIGlmIChkZXN0X3NpemUgPCBzcmNfc2l6ZSkgewotICAgICAgICBvdXRwdXRfYnVmID0gZGVzdF9idWY7Ci0gICAgICAgIG91dHB1dF9zaXplID0gZGVzdF9zaXplOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZpbHRlciA9IE5VTEw7Ci0gICAgICAgIGlmIChkZXN0X2J1ZikgewotICAgICAgICAgICAgRlhfRnJlZShkZXN0X2J1Zik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1GWF9CT09MIENGWF9QU1JlbmRlcmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgY29sb3IsIGludCBsZWZ0LCBpbnQgdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIFN0YXJ0UmVuZGVyaW5nKCk7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXgoKEZYX0ZMT0FUKShwU291cmNlLT5HZXRXaWR0aCgpKSwgMC4wZiwgMC4wZiwgLShGWF9GTE9BVCkocFNvdXJjZS0+R2V0SGVpZ2h0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCkobGVmdCksIChGWF9GTE9BVCkodG9wICsgcFNvdXJjZS0+R2V0SGVpZ2h0KCkpKTsKLSAgICByZXR1cm4gRHJhd0RJQml0cyhwU291cmNlLCBjb2xvciwgJm1hdHJpeCwgMCwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci19Ci1GWF9CT09MIENGWF9QU1JlbmRlcmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIEZYX0RXT1JEIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBTdGFydFJlbmRlcmluZygpOwotICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4KChGWF9GTE9BVCkoZGVzdF93aWR0aCksIDAuMGYsIDAuMGYsIChGWF9GTE9BVCkoLWRlc3RfaGVpZ2h0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKGRlc3RfbGVmdCksIChGWF9GTE9BVCkoZGVzdF90b3AgKyBkZXN0X2hlaWdodCkpOwotICAgIHJldHVybiBEcmF3RElCaXRzKHBTb3VyY2UsIGNvbG9yLCAmbWF0cml4LCBmbGFncywgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci19Ci1GWF9CT09MIENGWF9QU1JlbmRlcmVyOjpEcmF3RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgU3RhcnRSZW5kZXJpbmcoKTsKLSAgICBpZiAoKHBNYXRyaXgtPmEgPT0gMCAmJiBwTWF0cml4LT5iID09IDApIHx8IChwTWF0cml4LT5jID09IDAgJiYgcE1hdHJpeC0+ZCA9PSAwKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKHBTb3VyY2UtPkhhc0FscGhhKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpbnQgYWxwaGEgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoY29sb3IpIDogRlhBUkdCX0EoY29sb3IpOwotICAgIGlmIChwU291cmNlLT5Jc0FscGhhTWFzaygpICYmIChhbHBoYSA8IDI1NSB8fCBwU291cmNlLT5HZXRCUFAoKSAhPSAxKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIE9VVFBVVF9QUygicVxuIik7Ci0gICAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKLSAgICBidWYgPDwgRlhfQlNUUkMoIlsiKSA8PCBwTWF0cml4LT5hIDw8IEZYX0JTVFJDKCIgIikgPDwgcE1hdHJpeC0+YiA8PCBGWF9CU1RSQygiICIpIDw8Ci0gICAgICAgIHBNYXRyaXgtPmMgPDwgRlhfQlNUUkMoIiAiKSA8PCBwTWF0cml4LT5kIDw8IEZYX0JTVFJDKCIgIikgPDwgcE1hdHJpeC0+ZSA8PAotICAgICAgICBGWF9CU1RSQygiICIpIDw8IHBNYXRyaXgtPmYgPDwgRlhfQlNUUkMoIl1jbSAiKTsKLSAgICBpbnQgd2lkdGggPSBwU291cmNlLT5HZXRXaWR0aCgpOwotICAgIGludCBoZWlnaHQgPSBwU291cmNlLT5HZXRIZWlnaHQoKTsKLSAgICBidWYgPDwgd2lkdGggPDwgRlhfQlNUUkMoIiAiKSA8PCBoZWlnaHQ7Ci0gICAgaWYgKHBTb3VyY2UtPkdldEJQUCgpID09IDEgJiYgcFNvdXJjZS0+R2V0UGFsZXR0ZSgpID09IE5VTEwpIHsKLSAgICAgICAgaW50IHBpdGNoID0gKHdpZHRoICsgNykgLyA4OwotICAgICAgICBGWF9EV09SRCBzcmNfc2l6ZSA9IGhlaWdodCAqIHBpdGNoOwotICAgICAgICBGWF9MUEJZVEUgc3JjX2J1ZiA9IEZYX0FsbG9jKEZYX0JZVEUsIHNyY19zaXplKTsKLSAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgIEZYX0xQQ0JZVEUgc3JjX3NjYW4gPSBwU291cmNlLT5HZXRTY2FubGluZShyb3cpOwotICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIoc3JjX2J1ZiArIHJvdyAqIHBpdGNoLCBzcmNfc2NhbiwgcGl0Y2gpOwotICAgICAgICB9Ci0gICAgICAgIEZYX0xQQllURSBvdXRwdXRfYnVmOwotICAgICAgICBGWF9EV09SRCBvdXRwdXRfc2l6ZTsKLSAgICAgICAgRmF4Q29tcHJlc3NEYXRhKHNyY19idWYsIHdpZHRoLCBoZWlnaHQsIG91dHB1dF9idWYsIG91dHB1dF9zaXplKTsKLSAgICAgICAgaWYgKHBTb3VyY2UtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgICAgIFNldENvbG9yKGNvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgICAgIG1fYkNvbG9yU2V0ID0gRkFMU0U7Ci0gICAgICAgICAgICBidWYgPDwgRlhfQlNUUkMoIiB0cnVlWyIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVmIDw8IEZYX0JTVFJDKCIgMVsiKTsKLSAgICAgICAgfQotICAgICAgICBidWYgPDwgd2lkdGggPDwgRlhfQlNUUkMoIiAwIDAgLSIpIDw8IGhlaWdodCA8PCBGWF9CU1RSQygiIDAgIikgPDwgaGVpZ2h0IDw8Ci0gICAgICAgICAgICBGWF9CU1RSQygiXWN1cnJlbnRmaWxlL0FTQ0lJODVEZWNvZGUgZmlsdGVyICIpOwotICAgICAgICBpZiAob3V0cHV0X2J1ZiAhPSBzcmNfYnVmKQotICAgICAgICAgICAgYnVmIDw8IEZYX0JTVFJDKCI8PC9LIC0xL0VuZE9mQmxvY2sgZmFsc2UvQ29sdW1ucyAiKSA8PCB3aWR0aCA8PCBGWF9CU1RSQygiL1Jvd3MgIikgPDwgaGVpZ2h0IDw8Ci0gICAgICAgICAgICAgICAgRlhfQlNUUkMoIj4+L0NDSVRURmF4RGVjb2RlIGZpbHRlciAiKTsKLSAgICAgICAgaWYgKHBTb3VyY2UtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiaU1cbiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVmIDw8IEZYX0JTVFJDKCJmYWxzZSAxIGNvbG9yaW1hZ2VcbiIpOwotICAgICAgICB9Ci0gICAgICAgIG1fcE91dHB1dC0+T3V0cHV0UFMoKEZYX0xQQ1NUUilidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRTaXplKCkpOwotICAgICAgICBXcml0ZVBTQmluYXJ5KG91dHB1dF9idWYsIG91dHB1dF9zaXplKTsKLSAgICAgICAgRlhfRnJlZShvdXRwdXRfYnVmKTsKLSAgICB9IGVsc2UgewotICAgICAgICBDRlhfRElCU291cmNlKiBwQ29udmVydGVkID0gKENGWF9ESUJTb3VyY2UqKXBTb3VyY2U7Ci0gICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgICBGWERJQl9Gb3JtYXQgZm9ybWF0ID0gbV9iQ215a091dHB1dCA/IEZYRElCX0NteWsgOiBGWERJQl9SZ2I7Ci0gICAgICAgICAgICBwQ29udmVydGVkID0gcFNvdXJjZS0+Q2xvbmVDb252ZXJ0KGZvcm1hdCwgTlVMTCwgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHBTb3VyY2UtPkdldEZvcm1hdCgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBGWERJQl8xYnBwUmdiOgotICAgICAgICAgICAgICAgIGNhc2UgRlhESUJfUmdiMzI6Ci0gICAgICAgICAgICAgICAgICAgIHBDb252ZXJ0ZWQgPSBwU291cmNlLT5DbG9uZUNvbnZlcnQoRlhESUJfUmdiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBGWERJQl84YnBwUmdiOgotICAgICAgICAgICAgICAgICAgICBpZiAocFNvdXJjZS0+R2V0UGFsZXR0ZSgpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDb252ZXJ0ZWQgPSBwU291cmNlLT5DbG9uZUNvbnZlcnQoRlhESUJfUmdiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEZYRElCXzFicHBDbXlrOgotICAgICAgICAgICAgICAgICAgICBwQ29udmVydGVkID0gcFNvdXJjZS0+Q2xvbmVDb252ZXJ0KEZYRElCX0NteWspOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEZYRElCXzhicHBDbXlrOgotICAgICAgICAgICAgICAgICAgICBpZiAocFNvdXJjZS0+R2V0UGFsZXR0ZSgpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDb252ZXJ0ZWQgPSBwU291cmNlLT5DbG9uZUNvbnZlcnQoRlhESUJfQ215ayk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBDb252ZXJ0ZWQgPT0gTlVMTCkgewotICAgICAgICAgICAgT1VUUFVUX1BTKCJcblFcbiIpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGludCBCcHAgPSBwQ29udmVydGVkLT5HZXRCUFAoKSAvIDg7Ci0gICAgICAgIEZYX0xQQllURSBvdXRwdXRfYnVmID0gTlVMTDsKLSAgICAgICAgRlhfU1RSU0laRSBvdXRwdXRfc2l6ZSA9IDA7Ci0gICAgICAgIEZYX0xQQ1NUUiBmaWx0ZXIgPSBOVUxMOwotICAgICAgICBpZiAoZmxhZ3MgJiBGWFJFTkRFUl9JTUFHRV9MT1NTWSkgewotICAgICAgICAgICAgQ0NvZGVjX01vZHVsZU1nciogcEVuY29kZXJzID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKTsKLSAgICAgICAgICAgIGlmIChwRW5jb2RlcnMgJiYgcEVuY29kZXJzLT5HZXRKcGVnTW9kdWxlKCktPkVuY29kZShwQ29udmVydGVkLCBvdXRwdXRfYnVmLCBvdXRwdXRfc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICBmaWx0ZXIgPSAiL0RDVERlY29kZSBmaWx0ZXIgIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZmlsdGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIGludCBzcmNfcGl0Y2ggPSB3aWR0aCAqIEJwcDsKLSAgICAgICAgICAgIG91dHB1dF9zaXplID0gaGVpZ2h0ICogc3JjX3BpdGNoOwotICAgICAgICAgICAgb3V0cHV0X2J1ZiA9IEZYX0FsbG9jKEZYX0JZVEUsIG91dHB1dF9zaXplKTsKLSAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93ICsrKSB7Ci0gICAgICAgICAgICAgICAgRlhfTFBDQllURSBzcmNfc2NhbiA9IHBDb252ZXJ0ZWQtPkdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgICAgICAgICAgRlhfTFBCWVRFIGRlc3Rfc2NhbiA9IG91dHB1dF9idWYgKyByb3cgKiBzcmNfcGl0Y2g7Ci0gICAgICAgICAgICAgICAgaWYgKEJwcCA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19zY2FuWzJdOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3NjYW5bMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX3BpdGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9MUEJZVEUgY29tcHJlc3NlZF9idWY7Ci0gICAgICAgICAgICBGWF9EV09SRCBjb21wcmVzc2VkX3NpemU7Ci0gICAgICAgICAgICBQU0NvbXByZXNzRGF0YShtX1BTTGV2ZWwsIG91dHB1dF9idWYsIG91dHB1dF9zaXplLCBjb21wcmVzc2VkX2J1ZiwgY29tcHJlc3NlZF9zaXplLCBmaWx0ZXIpOwotICAgICAgICAgICAgaWYgKG91dHB1dF9idWYgIT0gY29tcHJlc3NlZF9idWYpIHsKLSAgICAgICAgICAgICAgICBGWF9GcmVlKG91dHB1dF9idWYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0cHV0X2J1ZiA9IGNvbXByZXNzZWRfYnVmOwotICAgICAgICAgICAgb3V0cHV0X3NpemUgPSBjb21wcmVzc2VkX3NpemU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBDb252ZXJ0ZWQgIT0gcFNvdXJjZSkgewotICAgICAgICAgICAgZGVsZXRlIHBDb252ZXJ0ZWQ7Ci0gICAgICAgICAgICBwQ29udmVydGVkID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBidWYgPDwgRlhfQlNUUkMoIiA4WyIpOwotICAgICAgICBidWYgPDwgd2lkdGggPDwgRlhfQlNUUkMoIiAwIDAgLSIpIDw8IGhlaWdodCA8PCBGWF9CU1RSQygiIDAgIikgPDwgaGVpZ2h0IDw8IEZYX0JTVFJDKCJdIik7Ci0gICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiY3VycmVudGZpbGUvQVNDSUk4NURlY29kZSBmaWx0ZXIgIik7Ci0gICAgICAgIGlmIChmaWx0ZXIpIHsKLSAgICAgICAgICAgIGJ1ZiA8PCBmaWx0ZXI7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmIDw8IEZYX0JTVFJDKCJmYWxzZSAiKSA8PCBCcHA7Ci0gICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiIGNvbG9yaW1hZ2VcbiIpOwotICAgICAgICBtX3BPdXRwdXQtPk91dHB1dFBTKChGWF9MUENTVFIpYnVmLkdldEJ1ZmZlcigpLCBidWYuR2V0U2l6ZSgpKTsKLSAgICAgICAgV3JpdGVQU0JpbmFyeShvdXRwdXRfYnVmLCBvdXRwdXRfc2l6ZSk7Ci0gICAgICAgIEZYX0ZyZWUob3V0cHV0X2J1Zik7Ci0gICAgfQotICAgIE9VVFBVVF9QUygiXG5RXG4iKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLXZvaWQgQ0ZYX1BTUmVuZGVyZXI6OlNldENvbG9yKEZYX0RXT1JEIGNvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBpZiAoIUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCkgfHwgIUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpKSB7Ci0gICAgICAgIHBJY2NUcmFuc2Zvcm0gPSBOVUxMOwotICAgIH0KLSAgICBGWF9CT09MIGJDTVlLID0gRkFMU0U7CisgICAgbV9wT3V0cHV0LT5PdXRwdXRQUygoY29uc3QgRlhfQ0hBUiopYnVmLkdldEJ1ZmZlcigpLCBidWYuR2V0U2l6ZSgpKTsKKyAgICBXcml0ZVBTQmluYXJ5KG91dHB1dF9idWYsIG91dHB1dF9zaXplKTsKKyAgICBGWF9GcmVlKG91dHB1dF9idWYpOworICB9IGVsc2UgeworICAgIENGWF9ESUJTb3VyY2UqIHBDb252ZXJ0ZWQgPSAoQ0ZYX0RJQlNvdXJjZSopcFNvdXJjZTsKICAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgICAgIGNvbG9yID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOwotICAgICAgICBGWF9MUEJZVEUgcENvbG9yID0gKEZYX0xQQllURSkmY29sb3I7Ci0gICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHBDb2xvciwgcENvbG9yLCAxKTsKLSAgICAgICAgY29sb3IgPSBtX2JDbXlrT3V0cHV0ID8gRlhDTVlLX1RPRElCKGNvbG9yKSA6IEZYQVJHQl9UT0RJQihjb2xvcik7Ci0gICAgICAgIGJDTVlLID0gbV9iQ215a091dHB1dDsKKyAgICAgIEZYRElCX0Zvcm1hdCBmb3JtYXQgPSBtX2JDbXlrT3V0cHV0ID8gRlhESUJfQ215ayA6IEZYRElCX1JnYjsKKyAgICAgIHBDb252ZXJ0ZWQgPSBwU291cmNlLT5DbG9uZUNvbnZlcnQoZm9ybWF0LCBOVUxMLCBwSWNjVHJhbnNmb3JtKTsKICAgICB9IGVsc2UgewotICAgICAgICBiQ01ZSyA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZyk7CisgICAgICBzd2l0Y2ggKHBTb3VyY2UtPkdldEZvcm1hdCgpKSB7CisgICAgICAgIGNhc2UgRlhESUJfMWJwcFJnYjoKKyAgICAgICAgY2FzZSBGWERJQl9SZ2IzMjoKKyAgICAgICAgICBwQ29udmVydGVkID0gcFNvdXJjZS0+Q2xvbmVDb252ZXJ0KEZYRElCX1JnYik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYjoKKyAgICAgICAgICBpZiAocFNvdXJjZS0+R2V0UGFsZXR0ZSgpKSB7CisgICAgICAgICAgICBwQ29udmVydGVkID0gcFNvdXJjZS0+Q2xvbmVDb252ZXJ0KEZYRElCX1JnYik7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZYRElCXzFicHBDbXlrOgorICAgICAgICAgIHBDb252ZXJ0ZWQgPSBwU291cmNlLT5DbG9uZUNvbnZlcnQoRlhESUJfQ215ayk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRlhESUJfOGJwcENteWs6CisgICAgICAgICAgaWYgKHBTb3VyY2UtPkdldFBhbGV0dGUoKSkgeworICAgICAgICAgICAgcENvbnZlcnRlZCA9IHBTb3VyY2UtPkNsb25lQ29udmVydChGWERJQl9DbXlrKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CiAgICAgfQotICAgIGlmIChiQ01ZSyAhPSBtX2JDbXlrT3V0cHV0IHx8ICFtX2JDb2xvclNldCB8fCBtX0xhc3RDb2xvciAhPSBjb2xvcikgewotICAgICAgICBDRlhfQnl0ZVRleHRCdWYgYnVmOwotICAgICAgICBpZiAoYkNNWUspIHsKLSAgICAgICAgICAgIGJ1ZiA8PCBGWFNZU19HZXRDVmFsdWUoY29sb3IpIC8gMjU1LjAgPDwgRlhfQlNUUkMoIiAiKSA8PCBGWFNZU19HZXRNVmFsdWUoY29sb3IpIC8gMjU1LjAgPDwgRlhfQlNUUkMoIiAiKQotICAgICAgICAgICAgICAgIDw8IEZYU1lTX0dldFlWYWx1ZShjb2xvcikgLyAyNTUuMCA8PCBGWF9CU1RSQygiICIpIDw8IEZYU1lTX0dldEtWYWx1ZShjb2xvcikgLyAyNTUuMCA8PCBGWF9CU1RSQygiIGtcbiIpOworICAgIGlmICghcENvbnZlcnRlZCkgeworICAgICAgT1VUUFVUX1BTKCJcblFcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpbnQgQnBwID0gcENvbnZlcnRlZC0+R2V0QlBQKCkgLyA4OworICAgIHVpbnQ4X3QqIG91dHB1dF9idWYgPSBOVUxMOworICAgIEZYX1NUUlNJWkUgb3V0cHV0X3NpemUgPSAwOworICAgIGNvbnN0IEZYX0NIQVIqIGZpbHRlciA9IE5VTEw7CisgICAgaWYgKGZsYWdzICYgRlhSRU5ERVJfSU1BR0VfTE9TU1kpIHsKKyAgICAgIENDb2RlY19Nb2R1bGVNZ3IqIHBFbmNvZGVycyA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCk7CisgICAgICBpZiAocEVuY29kZXJzICYmCisgICAgICAgICAgcEVuY29kZXJzLT5HZXRKcGVnTW9kdWxlKCktPkVuY29kZShwQ29udmVydGVkLCBvdXRwdXRfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3NpemUpKSB7CisgICAgICAgIGZpbHRlciA9ICIvRENURGVjb2RlIGZpbHRlciAiOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWZpbHRlcikgeworICAgICAgaW50IHNyY19waXRjaCA9IHdpZHRoICogQnBwOworICAgICAgb3V0cHV0X3NpemUgPSBoZWlnaHQgKiBzcmNfcGl0Y2g7CisgICAgICBvdXRwdXRfYnVmID0gRlhfQWxsb2ModWludDhfdCwgb3V0cHV0X3NpemUpOworICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBDb252ZXJ0ZWQtPkdldFNjYW5saW5lKHJvdyk7CisgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IG91dHB1dF9idWYgKyByb3cgKiBzcmNfcGl0Y2g7CisgICAgICAgIGlmIChCcHAgPT0gMykgeworICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3NjYW5bMl07CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfc2NhblsxXTsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbjsKKyAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVmIDw8IEZYQVJHQl9SKGNvbG9yKSAvIDI1NS4wIDw8IEZYX0JTVFJDKCIgIikgPDwgRlhBUkdCX0coY29sb3IpIC8gMjU1LjAgPDwgRlhfQlNUUkMoIiAiKQotICAgICAgICAgICAgICAgIDw8IEZYQVJHQl9CKGNvbG9yKSAvIDI1NS4wIDw8IEZYX0JTVFJDKCIgcmdcbiIpOworICAgICAgICAgIEZYU1lTX21lbWNweShkZXN0X3NjYW4sIHNyY19zY2FuLCBzcmNfcGl0Y2gpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChiQ01ZSyA9PSBtX2JDbXlrT3V0cHV0KSB7Ci0gICAgICAgICAgICBtX2JDb2xvclNldCA9IFRSVUU7Ci0gICAgICAgICAgICBtX0xhc3RDb2xvciA9IGNvbG9yOwotICAgICAgICB9Ci0gICAgICAgIG1fcE91dHB1dC0+T3V0cHV0UFMoKEZYX0xQQ1NUUilidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRTaXplKCkpOworICAgICAgfQorICAgICAgdWludDhfdCogY29tcHJlc3NlZF9idWY7CisgICAgICBGWF9EV09SRCBjb21wcmVzc2VkX3NpemU7CisgICAgICBQU0NvbXByZXNzRGF0YShtX1BTTGV2ZWwsIG91dHB1dF9idWYsIG91dHB1dF9zaXplLCBjb21wcmVzc2VkX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWRfc2l6ZSwgZmlsdGVyKTsKKyAgICAgIGlmIChvdXRwdXRfYnVmICE9IGNvbXByZXNzZWRfYnVmKSB7CisgICAgICAgIEZYX0ZyZWUob3V0cHV0X2J1Zik7CisgICAgICB9CisgICAgICBvdXRwdXRfYnVmID0gY29tcHJlc3NlZF9idWY7CisgICAgICBvdXRwdXRfc2l6ZSA9IGNvbXByZXNzZWRfc2l6ZTsKICAgICB9CisgICAgaWYgKHBDb252ZXJ0ZWQgIT0gcFNvdXJjZSkgeworICAgICAgZGVsZXRlIHBDb252ZXJ0ZWQ7CisgICAgICBwQ29udmVydGVkID0gTlVMTDsKKyAgICB9CisgICAgYnVmIDw8ICIgOFsiOworICAgIGJ1ZiA8PCB3aWR0aCA8PCAiIDAgMCAtIiA8PCBoZWlnaHQgPDwgIiAwICIgPDwgaGVpZ2h0IDw8ICJdIjsKKyAgICBidWYgPDwgImN1cnJlbnRmaWxlL0FTQ0lJODVEZWNvZGUgZmlsdGVyICI7CisgICAgaWYgKGZpbHRlcikgeworICAgICAgYnVmIDw8IGZpbHRlcjsKKyAgICB9CisgICAgYnVmIDw8ICJmYWxzZSAiIDw8IEJwcDsKKyAgICBidWYgPDwgIiBjb2xvcmltYWdlXG4iOworICAgIG1fcE91dHB1dC0+T3V0cHV0UFMoKGNvbnN0IEZYX0NIQVIqKWJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldFNpemUoKSk7CisgICAgV3JpdGVQU0JpbmFyeShvdXRwdXRfYnVmLCBvdXRwdXRfc2l6ZSk7CisgICAgRlhfRnJlZShvdXRwdXRfYnVmKTsKKyAgfQorICBPVVRQVVRfUFMoIlxuUVxuIik7CisgIHJldHVybiBUUlVFOwogfQotdm9pZCBDRlhfUFNSZW5kZXJlcjo6RmluZFBTRm9udEdseXBoKENGWF9GYWNlQ2FjaGUqIHBGYWNlQ2FjaGUsIENGWF9Gb250KiBwRm9udCwgY29uc3QgRlhURVhUX0NIQVJQT1MmIGNoYXJwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBwc19mb250bnVtLCBpbnQgJnBzX2dseXBoaW5kZXgpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KW1fUFNGb250TGlzdC5HZXRTaXplKCk7IGkgKyspIHsKLSAgICAgICAgQ1BTRm9udCogcFBTRm9udCA9IG1fUFNGb250TGlzdFtpXTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwUFNGb250LT5tX25HbHlwaHM7IGogKyspCi0gICAgICAgICAgICBpZiAocFBTRm9udC0+bV9HbHlwaHNbal0ubV9wRm9udCA9PSBwRm9udCAmJiBwUFNGb250LT5tX0dseXBoc1tqXS5tX0dseXBoSW5kZXggPT0gY2hhcnBvcy5tX0dseXBoSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBpZiAoKCFwUFNGb250LT5tX0dseXBoc1tqXS5tX2JHbHlwaEFkanVzdCAmJiAhY2hhcnBvcy5tX2JHbHlwaEFkanVzdCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwUFNGb250LT5tX0dseXBoc1tqXS5tX2JHbHlwaEFkanVzdCAmJiBjaGFycG9zLm1fYkdseXBoQWRqdXN0ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgKEZYU1lTX2ZhYnMocFBTRm9udC0+bV9HbHlwaHNbal0ubV9BZGp1c3RNYXRyaXhbMF0gLSBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzBdKSA8IDAuMDEgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfZmFicyhwUFNGb250LT5tX0dseXBoc1tqXS5tX0FkanVzdE1hdHJpeFsxXSAtIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMV0pIDwgMC4wMSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19mYWJzKHBQU0ZvbnQtPm1fR2x5cGhzW2pdLm1fQWRqdXN0TWF0cml4WzJdIC0gY2hhcnBvcy5tX0FkanVzdE1hdHJpeFsyXSkgPCAwLjAxICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX2ZhYnMocFBTRm9udC0+bV9HbHlwaHNbal0ubV9BZGp1c3RNYXRyaXhbM10gLSBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzNdKSA8IDAuMDEpKSkgewotICAgICAgICAgICAgICAgICAgICBwc19mb250bnVtID0gaTsKLSAgICAgICAgICAgICAgICAgICAgcHNfZ2x5cGhpbmRleCA9IGo7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtX1BTRm9udExpc3QuR2V0U2l6ZSgpID09IDAgfHwgbV9QU0ZvbnRMaXN0W21fUFNGb250TGlzdC5HZXRTaXplKCkgLSAxXS0+bV9uR2x5cGhzID09IDI1NikgewotICAgICAgICBDUFNGb250KiBwUFNGb250ID0gbmV3IENQU0ZvbnQ7Ci0gICAgICAgIHBQU0ZvbnQtPm1fbkdseXBocyA9IDA7Ci0gICAgICAgIG1fUFNGb250TGlzdC5BZGQocFBTRm9udCk7Ci0gICAgICAgIENGWF9CeXRlVGV4dEJ1ZiBidWY7Ci0gICAgICAgIGJ1ZiA8PCBGWF9CU1RSQygiOCBkaWN0IGJlZ2luL0ZvbnRUeXBlIDMgZGVmL0ZvbnRNYXRyaXhbMSAwIDAgMSAwIDBdZGVmXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAiL0ZvbnRCQm94WzAgMCAwIDBdZGVmL0VuY29kaW5nIDI1NiBhcnJheSBkZWYgMCAxIDI1NXtFbmNvZGluZyBleGNoLy5ub3RkZWYgcHV0fWZvclxuIgotICAgICAgICAgICAgICAgICAgICAgICAgIi9DaGFyUHJvY3MgMSBkaWN0IGRlZiBDaGFyUHJvY3MgYmVnaW4vLm5vdGRlZiB7fSBkZWYgZW5kXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAiL0J1aWxkR2x5cGh7MSAwIC0xMCAtMTAgMTAgMTAgc2V0Y2FjaGVkZXZpY2UgZXhjaC9DaGFyUHJvY3MgZ2V0IGV4Y2ggMiBjb3B5IGtub3duIG5vdHtwb3AvLm5vdGRlZn1pZiBnZXQgZXhlY31iaW5kIGRlZlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgIi9CdWlsZENoYXJ7MSBpbmRleC9FbmNvZGluZyBnZXQgZXhjaCBnZXQgMSBpbmRleC9CdWlsZEdseXBoIGdldCBleGVjfWJpbmQgZGVmXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAiY3VycmVudGRpY3QgZW5kXG4iKTsKLSAgICAgICAgYnVmIDw8IEZYX0JTVFJDKCIvWCIpIDw8IG1fUFNGb250TGlzdC5HZXRTaXplKCkgLSAxIDw8IEZYX0JTVFJDKCIgZXhjaCBkZWZpbmVmb250IHBvcFxuIik7Ci0gICAgICAgIG1fcE91dHB1dC0+T3V0cHV0UFMoKEZYX0xQQ1NUUilidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRTaXplKCkpOwotICAgICAgICBidWYuQ2xlYXIoKTsKLSAgICB9Ci0gICAgcHNfZm9udG51bSA9IG1fUFNGb250TGlzdC5HZXRTaXplKCkgLSAxOwotICAgIENQU0ZvbnQqIHBQU0ZvbnQgPSBtX1BTRm9udExpc3RbcHNfZm9udG51bV07Ci0gICAgcHNfZ2x5cGhpbmRleCA9IHBQU0ZvbnQtPm1fbkdseXBoczsKLSAgICBwUFNGb250LT5tX0dseXBoc1twc19nbHlwaGluZGV4XS5tX0dseXBoSW5kZXggPSBjaGFycG9zLm1fR2x5cGhJbmRleDsKLSAgICBwUFNGb250LT5tX0dseXBoc1twc19nbHlwaGluZGV4XS5tX3BGb250ID0gcEZvbnQ7Ci0gICAgcFBTRm9udC0+bV9HbHlwaHNbcHNfZ2x5cGhpbmRleF0ubV9iR2x5cGhBZGp1c3QgPSBjaGFycG9zLm1fYkdseXBoQWRqdXN0OwotICAgIGlmIChjaGFycG9zLm1fYkdseXBoQWRqdXN0KSB7Ci0gICAgICAgIHBQU0ZvbnQtPm1fR2x5cGhzW3BzX2dseXBoaW5kZXhdLm1fQWRqdXN0TWF0cml4WzBdID0gY2hhcnBvcy5tX0FkanVzdE1hdHJpeFswXTsKLSAgICAgICAgcFBTRm9udC0+bV9HbHlwaHNbcHNfZ2x5cGhpbmRleF0ubV9BZGp1c3RNYXRyaXhbMV0gPSBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzFdOwotICAgICAgICBwUFNGb250LT5tX0dseXBoc1twc19nbHlwaGluZGV4XS5tX0FkanVzdE1hdHJpeFsyXSA9IGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMl07Ci0gICAgICAgIHBQU0ZvbnQtPm1fR2x5cGhzW3BzX2dseXBoaW5kZXhdLm1fQWRqdXN0TWF0cml4WzNdID0gY2hhcnBvcy5tX0FkanVzdE1hdHJpeFszXTsKLSAgICB9Ci0gICAgcFBTRm9udC0+bV9uR2x5cGhzICsrOwotICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwotICAgIGlmIChjaGFycG9zLm1fYkdseXBoQWRqdXN0KQotICAgICAgICBtYXRyaXguU2V0KGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMF0sIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMV0sCi0gICAgICAgICAgICAgICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFsyXSwgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFszXSwgMCwgMCk7Ci0gICAgbWF0cml4LkNvbmNhdCgxLjBmLCAwLCAwLCAxLjBmLCAwLCAwKTsKLSAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSA9IHBGYWNlQ2FjaGUtPkxvYWRHbHlwaFBhdGgocEZvbnQsIGNoYXJwb3MubV9HbHlwaEluZGV4LCBjaGFycG9zLm1fRm9udENoYXJXaWR0aCk7Ci0gICAgaWYgKHBQYXRoRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ0ZYX1BhdGhEYXRhIFRyYW5zZm9ybWVkUGF0aCgqcFBhdGhEYXRhKTsKLSAgICBpZiAoY2hhcnBvcy5tX2JHbHlwaEFkanVzdCkgewotICAgICAgICBUcmFuc2Zvcm1lZFBhdGguVHJhbnNmb3JtKCZtYXRyaXgpOwotICAgIH0KK3ZvaWQgQ0ZYX1BTUmVuZGVyZXI6OlNldENvbG9yKEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIGlmICghQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKSB8fAorICAgICAgIUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpKSB7CisgICAgcEljY1RyYW5zZm9ybSA9IE5VTEw7CisgIH0KKyAgRlhfQk9PTCBiQ01ZSyA9IEZBTFNFOworICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPQorICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKKyAgICBjb2xvciA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykgPyBGWENNWUtfVE9ESUIoY29sb3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhBUkdCX1RPRElCKGNvbG9yKTsKKyAgICB1aW50OF90KiBwQ29sb3IgPSAodWludDhfdCopJmNvbG9yOworICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHBDb2xvciwgcENvbG9yLCAxKTsKKyAgICBjb2xvciA9IG1fYkNteWtPdXRwdXQgPyBGWENNWUtfVE9ESUIoY29sb3IpIDogRlhBUkdCX1RPRElCKGNvbG9yKTsKKyAgICBiQ01ZSyA9IG1fYkNteWtPdXRwdXQ7CisgIH0gZWxzZSB7CisgICAgYkNNWUsgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpOworICB9CisgIGlmIChiQ01ZSyAhPSBtX2JDbXlrT3V0cHV0IHx8ICFtX2JDb2xvclNldCB8fCBtX0xhc3RDb2xvciAhPSBjb2xvcikgewogICAgIENGWF9CeXRlVGV4dEJ1ZiBidWY7Ci0gICAgYnVmIDw8IEZYX0JTVFJDKCIvWCIpIDw8IHBzX2ZvbnRudW0gPDwgRlhfQlNUUkMoIiBGZi9DaGFyUHJvY3MgZ2V0IGJlZ2luLyIpCi0gICAgICAgIDw8IHBzX2dseXBoaW5kZXggPDwgRlhfQlNUUkMoInsiKTsKLSAgICBidWYgPDwgRlhfQlNUUkMoIm4gIik7Ci0gICAgZm9yIChpbnQgcCA9IDA7IHAgPCBUcmFuc2Zvcm1lZFBhdGguR2V0UG9pbnRDb3VudCgpOyBwICsrKSB7Ci0gICAgICAgIEZYX0ZMT0FUIHggPSBUcmFuc2Zvcm1lZFBhdGguR2V0UG9pbnRYKHApLCB5ID0gVHJhbnNmb3JtZWRQYXRoLkdldFBvaW50WShwKTsKLSAgICAgICAgc3dpdGNoIChUcmFuc2Zvcm1lZFBhdGguR2V0RmxhZyhwKSAmIEZYUFRfVFlQRSkgewotICAgICAgICAgICAgY2FzZSBGWFBUX01PVkVUTzogewotICAgICAgICAgICAgICAgICAgICBidWYgPDwgeCA8PCBGWF9CU1RSQygiICIpIDw8IHkgPDwgRlhfQlNUUkMoIiBtXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGWFBUX0xJTkVUTzogewotICAgICAgICAgICAgICAgICAgICBidWYgPDwgeCA8PCBGWF9CU1RSQygiICIpIDw8IHkgPDwgRlhfQlNUUkMoIiBsXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBGWFBUX0JFWklFUlRPOiB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZiA8PCB4IDw8IEZYX0JTVFJDKCIgIikgPDwgeSA8PCBGWF9CU1RSQygiICIpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCBUcmFuc2Zvcm1lZFBhdGguR2V0UG9pbnRYKHAgKyAxKSA8PCBGWF9CU1RSQygiICIpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCBUcmFuc2Zvcm1lZFBhdGguR2V0UG9pbnRZKHAgKyAxKSA8PCBGWF9CU1RSQygiICIpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCBUcmFuc2Zvcm1lZFBhdGguR2V0UG9pbnRYKHAgKyAyKSA8PCBGWF9CU1RSQygiICIpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCBUcmFuc2Zvcm1lZFBhdGguR2V0UG9pbnRZKHAgKyAyKSA8PCBGWF9CU1RSQygiIGNcbiIpOwotICAgICAgICAgICAgICAgICAgICBwICs9IDI7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBidWYgPDwgRlhfQlNUUkMoImYiKTsKLSAgICBidWYgPDwgRlhfQlNUUkMoIn1iaW5kIGRlZiBlbmRcbiIpOwotICAgIGJ1ZiA8PCBGWF9CU1RSQygiL1giKSA8PCBwc19mb250bnVtIDw8IEZYX0JTVFJDKCIgRmYvRW5jb2RpbmcgZ2V0ICIpIDw8IHBzX2dseXBoaW5kZXgKLSAgICAgICAgPDwgRlhfQlNUUkMoIi8iKSA8PCBwc19nbHlwaGluZGV4IDw8IEZYX0JTVFJDKCIgcHV0XG4iKTsKLSAgICBtX3BPdXRwdXQtPk91dHB1dFBTKChGWF9MUENTVFIpYnVmLkdldEJ1ZmZlcigpLCBidWYuR2V0U2l6ZSgpKTsKLX0KLUZYX0JPT0wgQ0ZYX1BTUmVuZGVyZXI6OkRyYXdUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywgQ0ZYX0ZvbnQqIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgRlhfRFdPUkQgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBTdGFydFJlbmRlcmluZygpOwotICAgIGludCBhbHBoYSA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKSA6IEZYQVJHQl9BKGNvbG9yKTsKLSAgICBpZiAoYWxwaGEgPCAyNTUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZiAoKHBPYmplY3QyRGV2aWNlLT5hID09IDAgJiYgcE9iamVjdDJEZXZpY2UtPmIgPT0gMCkgfHwgKHBPYmplY3QyRGV2aWNlLT5jID09IDAgJiYgcE9iamVjdDJEZXZpY2UtPmQgPT0gMCkpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIFNldENvbG9yKGNvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKLSAgICBDRlhfQnl0ZVRleHRCdWYgYnVmOwotICAgIGJ1ZiA8PCBGWF9CU1RSQygicVsiKSA8PCBwT2JqZWN0MkRldmljZS0+YSA8PCBGWF9CU1RSQygiICIpIDw8IHBPYmplY3QyRGV2aWNlLT5iIDw8IEZYX0JTVFJDKCIgIikKLSAgICAgICAgPDwgcE9iamVjdDJEZXZpY2UtPmMgPDwgRlhfQlNUUkMoIiAiKSA8PCBwT2JqZWN0MkRldmljZS0+ZDsKLSAgICBidWYgPDwgRlhfQlNUUkMoIiAiKSA8PCBwT2JqZWN0MkRldmljZS0+ZSA8PCBGWF9CU1RSQygiICIpIDw8IHBPYmplY3QyRGV2aWNlLT5mIDw8ICJdY21cbiI7Ci0gICAgaWYgKHBDYWNoZSA9PSBOVUxMKSB7Ci0gICAgICAgIHBDYWNoZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpOwotICAgIH0KLSAgICBDRlhfRmFjZUNhY2hlKiBwRmFjZUNhY2hlID0gcENhY2hlLT5HZXRDYWNoZWRGYWNlKHBGb250KTsKLSAgICBGWF9GT05UQ0FDSEVfREVGSU5FKHBDYWNoZSwgcEZvbnQpOwotICAgIGludCBsYXN0X2ZvbnRudW0gPSAtMTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5DaGFyczsgaSArKykgewotICAgICAgICBpbnQgcHNfZm9udG51bSwgcHNfZ2x5cGhpbmRleDsKLSAgICAgICAgRmluZFBTRm9udEdseXBoKHBGYWNlQ2FjaGUsIHBGb250LCBwQ2hhclBvc1tpXSwgcHNfZm9udG51bSwgcHNfZ2x5cGhpbmRleCk7Ci0gICAgICAgIGlmIChsYXN0X2ZvbnRudW0gIT0gcHNfZm9udG51bSkgewotICAgICAgICAgICAgYnVmIDw8IEZYX0JTVFJDKCIvWCIpIDw8IHBzX2ZvbnRudW0gPDwgRlhfQlNUUkMoIiBGZiAiKSA8PCBmb250X3NpemUKLSAgICAgICAgICAgICAgICA8PCBGWF9CU1RSQygiIEZzIFNmICIpOwotICAgICAgICAgICAgbGFzdF9mb250bnVtID0gcHNfZm9udG51bTsKLSAgICAgICAgfQotICAgICAgICBidWYgPDwgcENoYXJQb3NbaV0ubV9PcmlnaW5YIDw8IEZYX0JTVFJDKCIgIikKLSAgICAgICAgICAgIDw8IHBDaGFyUG9zW2ldLm1fT3JpZ2luWSA8PCBGWF9CU1RSQygiIG0iKTsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgaGV4OwotICAgICAgICBoZXguRm9ybWF0KCI8JTAyWD4iLCBwc19nbHlwaGluZGV4KTsKLSAgICAgICAgYnVmIDw8IGhleCA8PCBGWF9CU1RSQygiVGpcbiIpOwotICAgIH0KLSAgICBidWYgPDwgRlhfQlNUUkMoIlFcbiIpOwotICAgIG1fcE91dHB1dC0+T3V0cHV0UFMoKEZYX0xQQ1NUUilidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRTaXplKCkpOwotICAgIHJldHVybiBUUlVFOwotfQotdm9pZCBDRlhfUFNSZW5kZXJlcjo6V3JpdGVQU0JpbmFyeShGWF9MUENCWVRFIGRhdGEsIGludCBsZW4pCi17Ci0gICAgRlhfTFBCWVRFIGRlc3RfYnVmOwotICAgIEZYX0RXT1JEIGRlc3Rfc2l6ZTsKLSAgICBDQ29kZWNfTW9kdWxlTWdyKiBwRW5jb2RlcnMgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpOwotICAgIGlmIChwRW5jb2RlcnMgJiYgcEVuY29kZXJzLT5HZXRCYXNpY01vZHVsZSgpLT5BODVFbmNvZGUoZGF0YSwgbGVuLCBkZXN0X2J1ZiwgZGVzdF9zaXplKSkgewotICAgICAgICBtX3BPdXRwdXQtPk91dHB1dFBTKChGWF9MUENTVFIpZGVzdF9idWYsIGRlc3Rfc2l6ZSk7Ci0gICAgICAgIEZYX0ZyZWUoZGVzdF9idWYpOworICAgIGlmIChiQ01ZSykgeworICAgICAgYnVmIDw8IEZYU1lTX0dldENWYWx1ZShjb2xvcikgLyAyNTUuMCA8PCAiICIKKyAgICAgICAgICA8PCBGWFNZU19HZXRNVmFsdWUoY29sb3IpIC8gMjU1LjAgPDwgIiAiCisgICAgICAgICAgPDwgRlhTWVNfR2V0WVZhbHVlKGNvbG9yKSAvIDI1NS4wIDw8ICIgIgorICAgICAgICAgIDw8IEZYU1lTX0dldEtWYWx1ZShjb2xvcikgLyAyNTUuMCA8PCAiIGtcbiI7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbV9wT3V0cHV0LT5PdXRwdXRQUygoRlhfTFBDU1RSKWRhdGEsIGxlbik7CisgICAgICBidWYgPDwgRlhBUkdCX1IoY29sb3IpIC8gMjU1LjAgPDwgIiAiIDw8IEZYQVJHQl9HKGNvbG9yKSAvIDI1NS4wIDw8ICIgIgorICAgICAgICAgIDw8IEZYQVJHQl9CKGNvbG9yKSAvIDI1NS4wIDw8ICIgcmdcbiI7CiAgICAgfQorICAgIGlmIChiQ01ZSyA9PSBtX2JDbXlrT3V0cHV0KSB7CisgICAgICBtX2JDb2xvclNldCA9IFRSVUU7CisgICAgICBtX0xhc3RDb2xvciA9IGNvbG9yOworICAgIH0KKyAgICBtX3BPdXRwdXQtPk91dHB1dFBTKChjb25zdCBGWF9DSEFSKilidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRTaXplKCkpOworICB9Cit9Cit2b2lkIENGWF9QU1JlbmRlcmVyOjpGaW5kUFNGb250R2x5cGgoQ0ZYX0ZhY2VDYWNoZSogcEZhY2VDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MmIGNoYXJwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBwc19mb250bnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgcHNfZ2x5cGhpbmRleCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpbV9QU0ZvbnRMaXN0LkdldFNpemUoKTsgaSsrKSB7CisgICAgQ1BTRm9udCogcFBTRm9udCA9IG1fUFNGb250TGlzdFtpXTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IHBQU0ZvbnQtPm1fbkdseXBoczsgaisrKQorICAgICAgaWYgKHBQU0ZvbnQtPm1fR2x5cGhzW2pdLm1fcEZvbnQgPT0gcEZvbnQgJiYKKyAgICAgICAgICBwUFNGb250LT5tX0dseXBoc1tqXS5tX0dseXBoSW5kZXggPT0gY2hhcnBvcy5tX0dseXBoSW5kZXgpIHsKKyAgICAgICAgaWYgKCghcFBTRm9udC0+bV9HbHlwaHNbal0ubV9iR2x5cGhBZGp1c3QgJiYgIWNoYXJwb3MubV9iR2x5cGhBZGp1c3QpIHx8CisgICAgICAgICAgICAocFBTRm9udC0+bV9HbHlwaHNbal0ubV9iR2x5cGhBZGp1c3QgJiYgY2hhcnBvcy5tX2JHbHlwaEFkanVzdCAmJgorICAgICAgICAgICAgIChGWFNZU19mYWJzKHBQU0ZvbnQtPm1fR2x5cGhzW2pdLm1fQWRqdXN0TWF0cml4WzBdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzBdKSA8IDAuMDEgJiYKKyAgICAgICAgICAgICAgRlhTWVNfZmFicyhwUFNGb250LT5tX0dseXBoc1tqXS5tX0FkanVzdE1hdHJpeFsxXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFsxXSkgPCAwLjAxICYmCisgICAgICAgICAgICAgIEZYU1lTX2ZhYnMocFBTRm9udC0+bV9HbHlwaHNbal0ubV9BZGp1c3RNYXRyaXhbMl0gLQorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMl0pIDwgMC4wMSAmJgorICAgICAgICAgICAgICBGWFNZU19mYWJzKHBQU0ZvbnQtPm1fR2x5cGhzW2pdLm1fQWRqdXN0TWF0cml4WzNdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzNdKSA8IDAuMDEpKSkgeworICAgICAgICAgIHBzX2ZvbnRudW0gPSBpOworICAgICAgICAgIHBzX2dseXBoaW5kZXggPSBqOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICB9CisgIGlmIChtX1BTRm9udExpc3QuR2V0U2l6ZSgpID09IDAgfHwKKyAgICAgIG1fUFNGb250TGlzdFttX1BTRm9udExpc3QuR2V0U2l6ZSgpIC0gMV0tPm1fbkdseXBocyA9PSAyNTYpIHsKKyAgICBDUFNGb250KiBwUFNGb250ID0gbmV3IENQU0ZvbnQ7CisgICAgcFBTRm9udC0+bV9uR2x5cGhzID0gMDsKKyAgICBtX1BTRm9udExpc3QuQWRkKHBQU0ZvbnQpOworICAgIENGWF9CeXRlVGV4dEJ1ZiBidWY7CisgICAgYnVmIDw8ICI4IGRpY3QgYmVnaW4vRm9udFR5cGUgMyBkZWYvRm9udE1hdHJpeFsxIDAgMCAxIDAgMF1kZWZcbiIKKyAgICAgICAgICAgIi9Gb250QkJveFswIDAgMCAwXWRlZi9FbmNvZGluZyAyNTYgYXJyYXkgZGVmIDAgMSAyNTV7RW5jb2RpbmcgIgorICAgICAgICAgICAiZXhjaC8ubm90ZGVmIHB1dH1mb3JcbiIKKyAgICAgICAgICAgIi9DaGFyUHJvY3MgMSBkaWN0IGRlZiBDaGFyUHJvY3MgYmVnaW4vLm5vdGRlZiB7fSBkZWYgZW5kXG4iCisgICAgICAgICAgICIvQnVpbGRHbHlwaHsxIDAgLTEwIC0xMCAxMCAxMCBzZXRjYWNoZWRldmljZSBleGNoL0NoYXJQcm9jcyBnZXQgIgorICAgICAgICAgICAiZXhjaCAyIGNvcHkga25vd24gbm90e3BvcC8ubm90ZGVmfWlmIGdldCBleGVjfWJpbmQgZGVmXG4iCisgICAgICAgICAgICIvQnVpbGRDaGFyezEgaW5kZXgvRW5jb2RpbmcgZ2V0IGV4Y2ggZ2V0IDEgaW5kZXgvQnVpbGRHbHlwaCBnZXQgIgorICAgICAgICAgICAiZXhlY31iaW5kIGRlZlxuIgorICAgICAgICAgICAiY3VycmVudGRpY3QgZW5kXG4iOworICAgIGJ1ZiA8PCAiL1giIDw8IG1fUFNGb250TGlzdC5HZXRTaXplKCkgLSAxIDw8ICIgZXhjaCBkZWZpbmVmb250IHBvcFxuIjsKKyAgICBtX3BPdXRwdXQtPk91dHB1dFBTKChjb25zdCBGWF9DSEFSKilidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRTaXplKCkpOworICAgIGJ1Zi5DbGVhcigpOworICB9CisgIHBzX2ZvbnRudW0gPSBtX1BTRm9udExpc3QuR2V0U2l6ZSgpIC0gMTsKKyAgQ1BTRm9udCogcFBTRm9udCA9IG1fUFNGb250TGlzdFtwc19mb250bnVtXTsKKyAgcHNfZ2x5cGhpbmRleCA9IHBQU0ZvbnQtPm1fbkdseXBoczsKKyAgcFBTRm9udC0+bV9HbHlwaHNbcHNfZ2x5cGhpbmRleF0ubV9HbHlwaEluZGV4ID0gY2hhcnBvcy5tX0dseXBoSW5kZXg7CisgIHBQU0ZvbnQtPm1fR2x5cGhzW3BzX2dseXBoaW5kZXhdLm1fcEZvbnQgPSBwRm9udDsKKyAgcFBTRm9udC0+bV9HbHlwaHNbcHNfZ2x5cGhpbmRleF0ubV9iR2x5cGhBZGp1c3QgPSBjaGFycG9zLm1fYkdseXBoQWRqdXN0OworICBpZiAoY2hhcnBvcy5tX2JHbHlwaEFkanVzdCkgeworICAgIHBQU0ZvbnQtPm1fR2x5cGhzW3BzX2dseXBoaW5kZXhdLm1fQWRqdXN0TWF0cml4WzBdID0KKyAgICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFswXTsKKyAgICBwUFNGb250LT5tX0dseXBoc1twc19nbHlwaGluZGV4XS5tX0FkanVzdE1hdHJpeFsxXSA9CisgICAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMV07CisgICAgcFBTRm9udC0+bV9HbHlwaHNbcHNfZ2x5cGhpbmRleF0ubV9BZGp1c3RNYXRyaXhbMl0gPQorICAgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzJdOworICAgIHBQU0ZvbnQtPm1fR2x5cGhzW3BzX2dseXBoaW5kZXhdLm1fQWRqdXN0TWF0cml4WzNdID0KKyAgICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFszXTsKKyAgfQorICBwUFNGb250LT5tX25HbHlwaHMrKzsKKyAgQ0ZYX01hdHJpeCBtYXRyaXg7CisgIGlmIChjaGFycG9zLm1fYkdseXBoQWRqdXN0KQorICAgIG1hdHJpeC5TZXQoY2hhcnBvcy5tX0FkanVzdE1hdHJpeFswXSwgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFsxXSwKKyAgICAgICAgICAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMl0sIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbM10sIDAsIDApOworICBtYXRyaXguQ29uY2F0KDEuMGYsIDAsIDAsIDEuMGYsIDAsIDApOworICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSA9IHBGYWNlQ2FjaGUtPkxvYWRHbHlwaFBhdGgoCisgICAgICBwRm9udCwgY2hhcnBvcy5tX0dseXBoSW5kZXgsIGNoYXJwb3MubV9Gb250Q2hhcldpZHRoKTsKKyAgaWYgKCFwUGF0aERhdGEpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ0ZYX1BhdGhEYXRhIFRyYW5zZm9ybWVkUGF0aCgqcFBhdGhEYXRhKTsKKyAgaWYgKGNoYXJwb3MubV9iR2x5cGhBZGp1c3QpIHsKKyAgICBUcmFuc2Zvcm1lZFBhdGguVHJhbnNmb3JtKCZtYXRyaXgpOworICB9CisgIENGWF9CeXRlVGV4dEJ1ZiBidWY7CisgIGJ1ZiA8PCAiL1giIDw8IHBzX2ZvbnRudW0gPDwgIiBGZi9DaGFyUHJvY3MgZ2V0IGJlZ2luLyIgPDwgcHNfZ2x5cGhpbmRleAorICAgICAgPDwgIntuICI7CisgIGZvciAoaW50IHAgPSAwOyBwIDwgVHJhbnNmb3JtZWRQYXRoLkdldFBvaW50Q291bnQoKTsgcCsrKSB7CisgICAgRlhfRkxPQVQgeCA9IFRyYW5zZm9ybWVkUGF0aC5HZXRQb2ludFgocCksIHkgPSBUcmFuc2Zvcm1lZFBhdGguR2V0UG9pbnRZKHApOworICAgIHN3aXRjaCAoVHJhbnNmb3JtZWRQYXRoLkdldEZsYWcocCkgJiBGWFBUX1RZUEUpIHsKKyAgICAgIGNhc2UgRlhQVF9NT1ZFVE86IHsKKyAgICAgICAgYnVmIDw8IHggPDwgIiAiIDw8IHkgPDwgIiBtXG4iOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgRlhQVF9MSU5FVE86IHsKKyAgICAgICAgYnVmIDw8IHggPDwgIiAiIDw8IHkgPDwgIiBsXG4iOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgRlhQVF9CRVpJRVJUTzogeworICAgICAgICBidWYgPDwgeCA8PCAiICIgPDwgeSA8PCAiICIgPDwgVHJhbnNmb3JtZWRQYXRoLkdldFBvaW50WChwICsgMSkgPDwgIiAiCisgICAgICAgICAgICA8PCBUcmFuc2Zvcm1lZFBhdGguR2V0UG9pbnRZKHAgKyAxKSA8PCAiICIKKyAgICAgICAgICAgIDw8IFRyYW5zZm9ybWVkUGF0aC5HZXRQb2ludFgocCArIDIpIDw8ICIgIgorICAgICAgICAgICAgPDwgVHJhbnNmb3JtZWRQYXRoLkdldFBvaW50WShwICsgMikgPDwgIiBjXG4iOworICAgICAgICBwICs9IDI7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICBidWYgPDwgImZ9YmluZCBkZWYgZW5kXG4iOworICBidWYgPDwgIi9YIiA8PCBwc19mb250bnVtIDw8ICIgRmYvRW5jb2RpbmcgZ2V0ICIgPDwgcHNfZ2x5cGhpbmRleCA8PCAiLyIKKyAgICAgIDw8IHBzX2dseXBoaW5kZXggPDwgIiBwdXRcbiI7CisgIG1fcE91dHB1dC0+T3V0cHV0UFMoKGNvbnN0IEZYX0NIQVIqKWJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldFNpemUoKSk7Cit9CitGWF9CT09MIENGWF9QU1JlbmRlcmVyOjpEcmF3VGV4dChpbnQgbkNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBTdGFydFJlbmRlcmluZygpOworICBpbnQgYWxwaGEgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZYQVJHQl9BKGNvbG9yKTsKKyAgaWYgKGFscGhhIDwgMjU1KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICgocE9iamVjdDJEZXZpY2UtPmEgPT0gMCAmJiBwT2JqZWN0MkRldmljZS0+YiA9PSAwKSB8fAorICAgICAgKHBPYmplY3QyRGV2aWNlLT5jID09IDAgJiYgcE9iamVjdDJEZXZpY2UtPmQgPT0gMCkpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBTZXRDb2xvcihjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CisgIENGWF9CeXRlVGV4dEJ1ZiBidWY7CisgIGJ1ZiA8PCAicVsiIDw8IHBPYmplY3QyRGV2aWNlLT5hIDw8ICIgIiA8PCBwT2JqZWN0MkRldmljZS0+YiA8PCAiICIKKyAgICAgIDw8IHBPYmplY3QyRGV2aWNlLT5jIDw8ICIgIiA8PCBwT2JqZWN0MkRldmljZS0+ZCA8PCAiICIKKyAgICAgIDw8IHBPYmplY3QyRGV2aWNlLT5lIDw8ICIgIiA8PCBwT2JqZWN0MkRldmljZS0+ZiA8PCAiXWNtXG4iOworICBpZiAoIXBDYWNoZSkgeworICAgIHBDYWNoZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpOworICB9CisgIENGWF9GYWNlQ2FjaGUqIHBGYWNlQ2FjaGUgPSBwQ2FjaGUtPkdldENhY2hlZEZhY2UocEZvbnQpOworICBGWF9GT05UQ0FDSEVfREVGSU5FKHBDYWNoZSwgcEZvbnQpOworICBpbnQgbGFzdF9mb250bnVtID0gLTE7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNoYXJzOyBpKyspIHsKKyAgICBpbnQgcHNfZm9udG51bSwgcHNfZ2x5cGhpbmRleDsKKyAgICBGaW5kUFNGb250R2x5cGgocEZhY2VDYWNoZSwgcEZvbnQsIHBDaGFyUG9zW2ldLCBwc19mb250bnVtLCBwc19nbHlwaGluZGV4KTsKKyAgICBpZiAobGFzdF9mb250bnVtICE9IHBzX2ZvbnRudW0pIHsKKyAgICAgIGJ1ZiA8PCAiL1giIDw8IHBzX2ZvbnRudW0gPDwgIiBGZiAiIDw8IGZvbnRfc2l6ZSA8PCAiIEZzIFNmICI7CisgICAgICBsYXN0X2ZvbnRudW0gPSBwc19mb250bnVtOworICAgIH0KKyAgICBidWYgPDwgcENoYXJQb3NbaV0ubV9PcmlnaW5YIDw8ICIgIiA8PCBwQ2hhclBvc1tpXS5tX09yaWdpblkgPDwgIiBtIjsKKyAgICBDRlhfQnl0ZVN0cmluZyBoZXg7CisgICAgaGV4LkZvcm1hdCgiPCUwMlg+IiwgcHNfZ2x5cGhpbmRleCk7CisgICAgYnVmIDw8IGhleCA8PCAiVGpcbiI7CisgIH0KKyAgYnVmIDw8ICJRXG4iOworICBtX3BPdXRwdXQtPk91dHB1dFBTKChjb25zdCBGWF9DSEFSKilidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRTaXplKCkpOworICByZXR1cm4gVFJVRTsKK30KK3ZvaWQgQ0ZYX1BTUmVuZGVyZXI6OldyaXRlUFNCaW5hcnkoY29uc3QgdWludDhfdCogZGF0YSwgaW50IGxlbikgeworICB1aW50OF90KiBkZXN0X2J1ZjsKKyAgRlhfRFdPUkQgZGVzdF9zaXplOworICBDQ29kZWNfTW9kdWxlTWdyKiBwRW5jb2RlcnMgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpOworICBpZiAocEVuY29kZXJzICYmCisgICAgICBwRW5jb2RlcnMtPkdldEJhc2ljTW9kdWxlKCktPkE4NUVuY29kZShkYXRhLCBsZW4sIGRlc3RfYnVmLCBkZXN0X3NpemUpKSB7CisgICAgbV9wT3V0cHV0LT5PdXRwdXRQUygoY29uc3QgRlhfQ0hBUiopZGVzdF9idWYsIGRlc3Rfc2l6ZSk7CisgICAgRlhfRnJlZShkZXN0X2J1Zik7CisgIH0gZWxzZSB7CisgICAgbV9wT3V0cHV0LT5PdXRwdXRQUygoY29uc3QgRlhfQ0hBUiopZGF0YSwgbGVuKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV90ZXh0LmNwcCBiL2NvcmUvc3JjL2Z4Z2UvZ2UvZnhfZ2VfdGV4dC5jcHAKaW5kZXggZjZkMmZhNS4uMGVkMGJiYiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9nZS9meF9nZV90ZXh0LmNwcAorKysgYi9jb3JlL3NyYy9meGdlL2dlL2Z4X2dlX3RleHQuY3BwCkBAIC0xLDE2ODEgKzEsMTg2OSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGdlL2Z4X2dlLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGdlL2Z4X2ZyZWV0eXBlLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9mcmVldHlwZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCiAjaW5jbHVkZSAidGV4dF9pbnQuaCIKKwogI3VuZGVmIEZYX0dBTU1BCiAjdW5kZWYgRlhfR0FNTUFfSU5WRVJTRQotI2RlZmluZSBGWF9HQU1NQSh2YWx1ZSkJCQkodmFsdWUpCi0jZGVmaW5lIEZYX0dBTU1BX0lOVkVSU0UodmFsdWUpCSh2YWx1ZSkKLUZYX1JFQ1QgRlhHRV9HZXRHbHlwaHNCQm94KEZYVEVYVF9HTFlQSFBPUyogcEdseXBoQW5kUG9zLCBpbnQgbkNoYXJzLCBpbnQgYW50aV9hbGlhcywgRlhfRkxPQVQgcmV0aW5hU2NhbGVYLCBGWF9GTE9BVCByZXRpbmFTY2FsZVkpCi17Ci0gICAgRlhfUkVDVCByZWN0KDAsIDAsIDAsIDApOwotICAgIEZYX0JPT0wgYlN0YXJ0ZWQgPSBGQUxTRTsKLSAgICBmb3IgKGludCBpQ2hhciA9IDA7IGlDaGFyIDwgbkNoYXJzOyBpQ2hhciArKykgewotICAgICAgICBGWFRFWFRfR0xZUEhQT1MmIGdseXBoID0gcEdseXBoQW5kUG9zW2lDaGFyXTsKLSAgICAgICAgY29uc3QgQ0ZYX0dseXBoQml0bWFwKiBwR2x5cGggPSBnbHlwaC5tX3BHbHlwaDsKLSAgICAgICAgaWYgKHBHbHlwaCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgY2hhcl9sZWZ0ID0gZ2x5cGgubV9PcmlnaW5YICsgcEdseXBoLT5tX0xlZnQ7Ci0gICAgICAgIGludCBjaGFyX3dpZHRoID0gKGludCkocEdseXBoLT5tX0JpdG1hcC5HZXRXaWR0aCgpIC8gcmV0aW5hU2NhbGVYKTsKLSAgICAgICAgaWYgKGFudGlfYWxpYXMgPT0gRlhGVF9SRU5ERVJfTU9ERV9MQ0QpIHsKLSAgICAgICAgICAgIGNoYXJfd2lkdGggLz0gMzsKLSAgICAgICAgfQotICAgICAgICBpbnQgY2hhcl9yaWdodCA9IGNoYXJfbGVmdCArIGNoYXJfd2lkdGg7Ci0gICAgICAgIGludCBjaGFyX3RvcCA9IGdseXBoLm1fT3JpZ2luWSAtIHBHbHlwaC0+bV9Ub3A7Ci0gICAgICAgIGludCBjaGFyX2JvdHRvbSA9IGNoYXJfdG9wICsgKGludCkocEdseXBoLT5tX0JpdG1hcC5HZXRIZWlnaHQoKSAvIHJldGluYVNjYWxlWSk7Ci0gICAgICAgIGlmICghYlN0YXJ0ZWQpIHsKLSAgICAgICAgICAgIHJlY3QubGVmdCA9IGNoYXJfbGVmdDsKLSAgICAgICAgICAgIHJlY3QucmlnaHQgPSBjaGFyX3JpZ2h0OwotICAgICAgICAgICAgcmVjdC50b3AgPSBjaGFyX3RvcDsKLSAgICAgICAgICAgIHJlY3QuYm90dG9tID0gY2hhcl9ib3R0b207Ci0gICAgICAgICAgICBiU3RhcnRlZCA9IFRSVUU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAocmVjdC5sZWZ0ID4gY2hhcl9sZWZ0KSB7Ci0gICAgICAgICAgICAgICAgcmVjdC5sZWZ0ID0gY2hhcl9sZWZ0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlY3QucmlnaHQgPCBjaGFyX3JpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgcmVjdC5yaWdodCA9IGNoYXJfcmlnaHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVjdC50b3AgPiBjaGFyX3RvcCkgewotICAgICAgICAgICAgICAgIHJlY3QudG9wID0gY2hhcl90b3A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVjdC5ib3R0b20gPCBjaGFyX2JvdHRvbSkgewotICAgICAgICAgICAgICAgIHJlY3QuYm90dG9tID0gY2hhcl9ib3R0b207Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlY3Q7CisjZGVmaW5lIEZYX0dBTU1BKHZhbHVlKSAodmFsdWUpCisjZGVmaW5lIEZYX0dBTU1BX0lOVkVSU0UodmFsdWUpICh2YWx1ZSkKKworbmFtZXNwYWNlIHsKKwordm9pZCBSZXNldFRyYW5zZm9ybShGVF9GYWNlIGZhY2UpIHsKKyAgRlhGVF9NYXRyaXggbWF0cml4OworICBtYXRyaXgueHggPSAweDEwMDAwTDsKKyAgbWF0cml4Lnh5ID0gMDsKKyAgbWF0cml4Lnl4ID0gMDsKKyAgbWF0cml4Lnl5ID0gMHgxMDAwMEw7CisgIEZYRlRfU2V0X1RyYW5zZm9ybShmYWNlLCAmbWF0cml4LCAwKTsKIH0KLXN0YXRpYyB2b2lkIF9BZGp1c3RHbHlwaFNwYWNlKEZYVEVYVF9HTFlQSFBPUyogcEdseXBoQW5kUG9zLCBpbnQgbkNoYXJzKQotewotICAgIEFTU0VSVChuQ2hhcnMgPiAxKTsKLSAgICBGWF9CT09MIGJWZXJ0aWNhbCA9IEZBTFNFOwotICAgIGlmIChwR2x5cGhBbmRQb3NbbkNoYXJzIC0gMV0ubV9PcmlnaW5YID09IHBHbHlwaEFuZFBvc1swXS5tX09yaWdpblgpIHsKLSAgICAgICAgYlZlcnRpY2FsID0gVFJVRTsKLSAgICB9IGVsc2UgaWYgKHBHbHlwaEFuZFBvc1tuQ2hhcnMgLSAxXS5tX09yaWdpblkgIT0gcEdseXBoQW5kUG9zWzBdLm1fT3JpZ2luWSkgewotICAgICAgICByZXR1cm47CisKKy8vIFNldHMgdGhlIGdpdmVuIHRyYW5zZm9ybSBvbiB0aGUgZm9udCwgYW5kIHJlc2V0cyBpdCB0byB0aGUgaWRlbnRpdHkgd2hlbiBpdAorLy8gZ29lcyBvdXQgb2Ygc2NvcGUuCitjbGFzcyBTY29wZWRGb250VHJhbnNmb3JtIHsKKyBwdWJsaWM6CisgIFNjb3BlZEZvbnRUcmFuc2Zvcm0oRlRfRmFjZSBmYWNlLCBGWEZUX01hdHJpeCogbWF0cml4KSA6IG1fRmFjZShmYWNlKSB7CisgICAgRlhGVF9TZXRfVHJhbnNmb3JtKG1fRmFjZSwgbWF0cml4LCAwKTsKKyAgfQorCisgIH5TY29wZWRGb250VHJhbnNmb3JtKCkgeyBSZXNldFRyYW5zZm9ybShtX0ZhY2UpOyB9CisKKyBwcml2YXRlOgorICBGVF9GYWNlIG1fRmFjZTsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitGWF9SRUNUIEZYR0VfR2V0R2x5cGhzQkJveChGWFRFWFRfR0xZUEhQT1MqIHBHbHlwaEFuZFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW50aV9hbGlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHJldGluYVNjYWxlWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHJldGluYVNjYWxlWSkgeworICBGWF9SRUNUIHJlY3QoMCwgMCwgMCwgMCk7CisgIEZYX0JPT0wgYlN0YXJ0ZWQgPSBGQUxTRTsKKyAgZm9yIChpbnQgaUNoYXIgPSAwOyBpQ2hhciA8IG5DaGFyczsgaUNoYXIrKykgeworICAgIEZYVEVYVF9HTFlQSFBPUyYgZ2x5cGggPSBwR2x5cGhBbmRQb3NbaUNoYXJdOworICAgIGNvbnN0IENGWF9HbHlwaEJpdG1hcCogcEdseXBoID0gZ2x5cGgubV9wR2x5cGg7CisgICAgaWYgKCFwR2x5cGgpIHsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpbnQgaSA9IG5DaGFycyAtIDE7Ci0gICAgaW50KiBuZXh0X29yaWdpbiA9IGJWZXJ0aWNhbCA/ICZwR2x5cGhBbmRQb3NbaV0ubV9PcmlnaW5ZIDogJnBHbHlwaEFuZFBvc1tpXS5tX09yaWdpblg7Ci0gICAgRlhfRkxPQVQgbmV4dF9vcmlnaW5fZiA9IGJWZXJ0aWNhbCA/IHBHbHlwaEFuZFBvc1tpXS5tX2ZPcmlnaW5ZIDogcEdseXBoQW5kUG9zW2ldLm1fZk9yaWdpblg7Ci0gICAgZm9yIChpIC0tOyBpID4gMDsgaSAtLSkgewotICAgICAgICBpbnQqIHRoaXNfb3JpZ2luID0gYlZlcnRpY2FsID8gJnBHbHlwaEFuZFBvc1tpXS5tX09yaWdpblkgOiAmcEdseXBoQW5kUG9zW2ldLm1fT3JpZ2luWDsKLSAgICAgICAgRlhfRkxPQVQgdGhpc19vcmlnaW5fZiA9IGJWZXJ0aWNhbCA/IHBHbHlwaEFuZFBvc1tpXS5tX2ZPcmlnaW5ZIDogcEdseXBoQW5kUG9zW2ldLm1fZk9yaWdpblg7Ci0gICAgICAgIGludCBzcGFjZSA9ICgqbmV4dF9vcmlnaW4pIC0gKCp0aGlzX29yaWdpbik7Ci0gICAgICAgIEZYX0ZMT0FUIHNwYWNlX2YgPSBuZXh0X29yaWdpbl9mIC0gdGhpc19vcmlnaW5fZjsKLSAgICAgICAgRlhfRkxPQVQgZXJyb3IgPSAoRlhfRkxPQVQpKEZYU1lTX2ZhYnMoc3BhY2VfZikgLSBGWFNZU19mYWJzKChGWF9GTE9BVCkoc3BhY2UpKSk7Ci0gICAgICAgIGlmIChlcnJvciA+IDAuNWYpIHsKLSAgICAgICAgICAgICp0aGlzX29yaWdpbiArPSBzcGFjZSA+IDAgPyAtMSA6IDE7Ci0gICAgICAgIH0KLSAgICAgICAgbmV4dF9vcmlnaW4gPSB0aGlzX29yaWdpbjsKLSAgICAgICAgbmV4dF9vcmlnaW5fZiA9IHRoaXNfb3JpZ2luX2Y7CisgICAgaW50IGNoYXJfbGVmdCA9IGdseXBoLm1fT3JpZ2luWCArIHBHbHlwaC0+bV9MZWZ0OworICAgIGludCBjaGFyX3dpZHRoID0gKGludCkocEdseXBoLT5tX0JpdG1hcC5HZXRXaWR0aCgpIC8gcmV0aW5hU2NhbGVYKTsKKyAgICBpZiAoYW50aV9hbGlhcyA9PSBGWEZUX1JFTkRFUl9NT0RFX0xDRCkgeworICAgICAgY2hhcl93aWR0aCAvPSAzOwogICAgIH0KKyAgICBpbnQgY2hhcl9yaWdodCA9IGNoYXJfbGVmdCArIGNoYXJfd2lkdGg7CisgICAgaW50IGNoYXJfdG9wID0gZ2x5cGgubV9PcmlnaW5ZIC0gcEdseXBoLT5tX1RvcDsKKyAgICBpbnQgY2hhcl9ib3R0b20gPQorICAgICAgICBjaGFyX3RvcCArIChpbnQpKHBHbHlwaC0+bV9CaXRtYXAuR2V0SGVpZ2h0KCkgLyByZXRpbmFTY2FsZVkpOworICAgIGlmICghYlN0YXJ0ZWQpIHsKKyAgICAgIHJlY3QubGVmdCA9IGNoYXJfbGVmdDsKKyAgICAgIHJlY3QucmlnaHQgPSBjaGFyX3JpZ2h0OworICAgICAgcmVjdC50b3AgPSBjaGFyX3RvcDsKKyAgICAgIHJlY3QuYm90dG9tID0gY2hhcl9ib3R0b207CisgICAgICBiU3RhcnRlZCA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChyZWN0LmxlZnQgPiBjaGFyX2xlZnQpIHsKKyAgICAgICAgcmVjdC5sZWZ0ID0gY2hhcl9sZWZ0OworICAgICAgfQorICAgICAgaWYgKHJlY3QucmlnaHQgPCBjaGFyX3JpZ2h0KSB7CisgICAgICAgIHJlY3QucmlnaHQgPSBjaGFyX3JpZ2h0OworICAgICAgfQorICAgICAgaWYgKHJlY3QudG9wID4gY2hhcl90b3ApIHsKKyAgICAgICAgcmVjdC50b3AgPSBjaGFyX3RvcDsKKyAgICAgIH0KKyAgICAgIGlmIChyZWN0LmJvdHRvbSA8IGNoYXJfYm90dG9tKSB7CisgICAgICAgIHJlY3QuYm90dG9tID0gY2hhcl9ib3R0b207CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiByZWN0OwogfQotc3RhdGljIGNvbnN0IEZYX0JZVEUgZ19UZXh0R2FtbWFBZGp1c3RbMjU2XSA9IHsKLSAgICAwLCAyLCAzLCA0LCA2LCA3LCA4LCAxMCwgMTEsIDEyLCAxMywgMTUsIDE2LCAxNywgMTgsIDE5LAotICAgIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM4LAotICAgIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTEsIDUyLCA1MywgNTQsIDU1LAotICAgIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgNjQsIDY1LCA2NiwgNjcsIDY4LCA2OSwgNzEsIDcyLAotICAgIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsIDc5LCA4MCwgODEsIDgyLCA4MywgODQsIDg1LCA4NiwgODcsIDg4LAotICAgIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsCi0gICAgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLCAxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLAotICAgIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyNywgMTI4LCAxMjksIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwKLSAgICAxMzYsIDEzNywgMTM4LCAxMzksIDE0MCwgMTQxLCAxNDIsIDE0MywgMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsCi0gICAgMTUyLCAxNTMsIDE1NCwgMTU1LCAxNTYsIDE1NiwgMTU3LCAxNTgsIDE1OSwgMTYwLCAxNjEsIDE2MiwgMTYzLCAxNjQsIDE2NSwgMTY2LAotICAgIDE2NywgMTY4LCAxNjksIDE3MCwgMTcxLCAxNzIsIDE3MywgMTc0LCAxNzQsIDE3NSwgMTc2LCAxNzcsIDE3OCwgMTc5LCAxODAsIDE4MSwKLSAgICAxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OSwgMTkwLCAxOTAsIDE5MSwgMTkyLCAxOTMsIDE5NCwgMTk1LCAxOTYsCi0gICAgMTk3LCAxOTgsIDE5OSwgMjAwLCAyMDEsIDIwMiwgMjAzLCAyMDQsIDIwNCwgMjA1LCAyMDYsIDIwNywgMjA4LCAyMDksIDIxMCwgMjExLAotICAgIDIxMiwgMjEzLCAyMTQsIDIxNSwgMjE2LCAyMTcsIDIxNywgMjE4LCAyMTksIDIyMCwgMjIxLCAyMjIsIDIyMywgMjI0LCAyMjUsIDIyNiwKLSAgICAyMjcsIDIyOCwgMjI4LCAyMjksIDIzMCwgMjMxLCAyMzIsIDIzMywgMjM0LCAyMzUsIDIzNiwgMjM3LCAyMzgsIDIzOSwgMjM5LCAyNDAsCi0gICAgMjQxLCAyNDIsIDI0MywgMjQ0LCAyNDUsIDI0NiwgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTAsIDI1MSwgMjUyLCAyNTMsIDI1NCwgMjU1LAorc3RhdGljIHZvaWQgX0FkanVzdEdseXBoU3BhY2UoRlhURVhUX0dMWVBIUE9TKiBwR2x5cGhBbmRQb3MsIGludCBuQ2hhcnMpIHsKKyAgQVNTRVJUKG5DaGFycyA+IDEpOworICBGWF9CT09MIGJWZXJ0aWNhbCA9IEZBTFNFOworICBpZiAocEdseXBoQW5kUG9zW25DaGFycyAtIDFdLm1fT3JpZ2luWCA9PSBwR2x5cGhBbmRQb3NbMF0ubV9PcmlnaW5YKSB7CisgICAgYlZlcnRpY2FsID0gVFJVRTsKKyAgfSBlbHNlIGlmIChwR2x5cGhBbmRQb3NbbkNoYXJzIC0gMV0ubV9PcmlnaW5ZICE9IHBHbHlwaEFuZFBvc1swXS5tX09yaWdpblkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IGkgPSBuQ2hhcnMgLSAxOworICBpbnQqIG5leHRfb3JpZ2luID0KKyAgICAgIGJWZXJ0aWNhbCA/ICZwR2x5cGhBbmRQb3NbaV0ubV9PcmlnaW5ZIDogJnBHbHlwaEFuZFBvc1tpXS5tX09yaWdpblg7CisgIEZYX0ZMT0FUIG5leHRfb3JpZ2luX2YgPQorICAgICAgYlZlcnRpY2FsID8gcEdseXBoQW5kUG9zW2ldLm1fZk9yaWdpblkgOiBwR2x5cGhBbmRQb3NbaV0ubV9mT3JpZ2luWDsKKyAgZm9yIChpLS07IGkgPiAwOyBpLS0pIHsKKyAgICBpbnQqIHRoaXNfb3JpZ2luID0KKyAgICAgICAgYlZlcnRpY2FsID8gJnBHbHlwaEFuZFBvc1tpXS5tX09yaWdpblkgOiAmcEdseXBoQW5kUG9zW2ldLm1fT3JpZ2luWDsKKyAgICBGWF9GTE9BVCB0aGlzX29yaWdpbl9mID0KKyAgICAgICAgYlZlcnRpY2FsID8gcEdseXBoQW5kUG9zW2ldLm1fZk9yaWdpblkgOiBwR2x5cGhBbmRQb3NbaV0ubV9mT3JpZ2luWDsKKyAgICBpbnQgc3BhY2UgPSAoKm5leHRfb3JpZ2luKSAtICgqdGhpc19vcmlnaW4pOworICAgIEZYX0ZMT0FUIHNwYWNlX2YgPSBuZXh0X29yaWdpbl9mIC0gdGhpc19vcmlnaW5fZjsKKyAgICBGWF9GTE9BVCBlcnJvciA9CisgICAgICAgIChGWF9GTE9BVCkoRlhTWVNfZmFicyhzcGFjZV9mKSAtIEZYU1lTX2ZhYnMoKEZYX0ZMT0FUKShzcGFjZSkpKTsKKyAgICBpZiAoZXJyb3IgPiAwLjVmKSB7CisgICAgICAqdGhpc19vcmlnaW4gKz0gc3BhY2UgPiAwID8gLTEgOiAxOworICAgIH0KKyAgICBuZXh0X29yaWdpbiA9IHRoaXNfb3JpZ2luOworICAgIG5leHRfb3JpZ2luX2YgPSB0aGlzX29yaWdpbl9mOworICB9Cit9CitzdGF0aWMgY29uc3QgdWludDhfdCBnX1RleHRHYW1tYUFkanVzdFsyNTZdID0geworICAgIDAsICAgMiwgICAzLCAgIDQsICAgNiwgICA3LCAgIDgsICAgMTAsICAxMSwgIDEyLCAgMTMsICAxNSwgIDE2LCAgMTcsICAxOCwKKyAgICAxOSwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjksICAzMCwgIDMxLCAgMzIsICAzMywgIDM0LCAgMzUsCisgICAgMzYsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywgIDQ4LCAgNDksICA1MSwgIDUyLAorICAgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsICA2NCwgIDY1LCAgNjYsICA2NywKKyAgICA2OCwgIDY5LCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LCAgODAsICA4MSwgIDgyLCAgODMsCisgICAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LCAgOTYsICA5NywgIDk4LAorICAgIDk5LCAgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwgMTEyLCAxMTMsCisgICAgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsIDEyOCwKKyAgICAxMjksIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwgMTM5LCAxNDAsIDE0MSwgMTQyLAorICAgIDE0MywgMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsIDE1MiwgMTUzLCAxNTQsIDE1NSwgMTU2LCAxNTYsCisgICAgMTU3LCAxNTgsIDE1OSwgMTYwLCAxNjEsIDE2MiwgMTYzLCAxNjQsIDE2NSwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzAsIDE3MSwKKyAgICAxNzIsIDE3MywgMTc0LCAxNzQsIDE3NSwgMTc2LCAxNzcsIDE3OCwgMTc5LCAxODAsIDE4MSwgMTgyLCAxODMsIDE4NCwgMTg1LAorICAgIDE4NiwgMTg3LCAxODgsIDE4OSwgMTkwLCAxOTAsIDE5MSwgMTkyLCAxOTMsIDE5NCwgMTk1LCAxOTYsIDE5NywgMTk4LCAxOTksCisgICAgMjAwLCAyMDEsIDIwMiwgMjAzLCAyMDQsIDIwNCwgMjA1LCAyMDYsIDIwNywgMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIxMywKKyAgICAyMTQsIDIxNSwgMjE2LCAyMTcsIDIxNywgMjE4LCAyMTksIDIyMCwgMjIxLCAyMjIsIDIyMywgMjI0LCAyMjUsIDIyNiwgMjI3LAorICAgIDIyOCwgMjI4LCAyMjksIDIzMCwgMjMxLCAyMzIsIDIzMywgMjM0LCAyMzUsIDIzNiwgMjM3LCAyMzgsIDIzOSwgMjM5LCAyNDAsCisgICAgMjQxLCAyNDIsIDI0MywgMjQ0LCAyNDUsIDI0NiwgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTAsIDI1MSwgMjUyLCAyNTMsIDI1NCwKKyAgICAyNTUsCiB9OwogI2RlZmluZSBBREpVU1RfQUxQSEEoYmFja2dyb3VuZCwgZm9yZWdyb3VuZCwgc3JjX2FscGhhLCB0ZXh0X2ZsYWdzLCBhKSBcCi0gICAgc3JjX2FscGhhID0gZ19UZXh0R2FtbWFBZGp1c3RbKEZYX0JZVEUpc3JjX2FscGhhXTsKLXZvaWQgX0NvbG9yMkFyZ2IoRlhfQVJHQiYgYXJnYiwgRlhfRFdPUkQgY29sb3IsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIGlmIChwSWNjVHJhbnNmb3JtID09IE5VTEwgJiYgIUZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykpIHsKLSAgICAgICAgYXJnYiA9IGNvbG9yOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICghQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKSB8fCAhQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCkpIHsKLSAgICAgICAgcEljY1RyYW5zZm9ybSA9IE5VTEw7Ci0gICAgfQotICAgIEZYX0JZVEUgYmdyYVs0XTsKLSAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICBJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgICAgIGNvbG9yID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOwotICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBiZ3JhLCAoRlhfTFBDQllURSkmY29sb3IsIDEpOwotICAgICAgICBiZ3JhWzNdID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/Ci0gICAgICAgICAgICAgICAgICAoYWxwaGFfZmxhZyA+PiAyNCkgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKSA6IEZYR0VURkxBR19BTFBIQV9TVFJPS0UoYWxwaGFfZmxhZykgOgotICAgICAgICAgICAgICAgICAgRlhBUkdCX0EoY29sb3IpOwotICAgICAgICBhcmdiID0gRlhBUkdCX01BS0UoYmdyYVszXSwgYmdyYVsyXSwgYmdyYVsxXSwgYmdyYVswXSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShjb2xvciksIEZYU1lTX0dldE1WYWx1ZShjb2xvciksCi0gICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX0dldFlWYWx1ZShjb2xvciksIEZYU1lTX0dldEtWYWx1ZShjb2xvciksCi0gICAgICAgICAgICAgICAgICAgICAgIGJncmFbMl0sIGJncmFbMV0sIGJncmFbMF0pOwotICAgIGJncmFbM10gPSAoYWxwaGFfZmxhZyA+PiAyNCkgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKSA6IEZYR0VURkxBR19BTFBIQV9TVFJPS0UoYWxwaGFfZmxhZyk7CisgIHNyY19hbHBoYSA9IGdfVGV4dEdhbW1hQWRqdXN0Wyh1aW50OF90KXNyY19hbHBoYV07Cit2b2lkIF9Db2xvcjJBcmdiKEZYX0FSR0ImIGFyZ2IsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBpZiAoIXBJY2NUcmFuc2Zvcm0gJiYgIUZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykpIHsKKyAgICBhcmdiID0gY29sb3I7CisgICAgcmV0dXJuOworICB9CisgIGlmICghQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKSB8fAorICAgICAgIUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpKSB7CisgICAgcEljY1RyYW5zZm9ybSA9IE5VTEw7CisgIH0KKyAgdWludDhfdCBiZ3JhWzRdOworICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgIElDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPQorICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKKyAgICBjb2xvciA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykgPyBGWENNWUtfVE9ESUIoY29sb3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhBUkdCX1RPRElCKGNvbG9yKTsKKyAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBiZ3JhLCAoY29uc3QgdWludDhfdCopJmNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgIGJncmFbM10gPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpCisgICAgICAgICAgICAgICAgICA/IChhbHBoYV9mbGFnID4+IDI0KSA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZYR0VURkxBR19BTFBIQV9TVFJPS0UoYWxwaGFfZmxhZykKKyAgICAgICAgICAgICAgICAgIDogRlhBUkdCX0EoY29sb3IpOwogICAgIGFyZ2IgPSBGWEFSR0JfTUFLRShiZ3JhWzNdLCBiZ3JhWzJdLCBiZ3JhWzFdLCBiZ3JhWzBdKTsKKyAgICByZXR1cm47CisgIH0KKyAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShjb2xvciksIEZYU1lTX0dldE1WYWx1ZShjb2xvciksCisgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRZVmFsdWUoY29sb3IpLCBGWFNZU19HZXRLVmFsdWUoY29sb3IpLCBiZ3JhWzJdLAorICAgICAgICAgICAgICAgICAgICAgYmdyYVsxXSwgYmdyYVswXSk7CisgIGJncmFbM10gPSAoYWxwaGFfZmxhZyA+PiAyNCkgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhHRVRGTEFHX0FMUEhBX1NUUk9LRShhbHBoYV9mbGFnKTsKKyAgYXJnYiA9IEZYQVJHQl9NQUtFKGJncmFbM10sIGJncmFbMl0sIGJncmFbMV0sIGJncmFbMF0pOwogfQotRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpEcmF3Tm9ybWFsVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCi0gICAgICAgIENGWF9Gb250KiBwRm9udCwgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLAotICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBUZXh0MkRldmljZSwKLSAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwgRlhfRFdPUkQgdGV4dF9mbGFncywKLSAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgaW50IG5hdGl2ZXRleHRfZmxhZ3MgPSB0ZXh0X2ZsYWdzOwotICAgIGlmIChtX0RldmljZUNsYXNzICE9IEZYRENfRElTUExBWSkgewotICAgICAgICBpZiAoISh0ZXh0X2ZsYWdzICYgRlhURVhUX1BSSU5UR1JBUEhJQ1RFWFQpKSB7Ci0jaWYgX0ZYTV9QTEFURk9STV8gID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgICAgICAgICBpZiAoISh0ZXh0X2ZsYWdzICYgRlhGT05UX0NJREZPTlQpICYmIHBGb250LT5HZXRQc05hbWUoKS5GaW5kKENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoIitaSkhMIikpID09IC0xKQotI2lmZGVmIEZPWElUX0NIUk9NRV9CVUlMRAotICAgICAgICAgICAgICAgIGlmIChwRm9udC0+R2V0UHNOYW1lKCkgIT0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbCgiQ05BQUpJK2NtZXgxMCIpKQorRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpEcmF3Tm9ybWFsVGV4dChpbnQgbkNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBUZXh0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgdGV4dF9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgaW50IG5hdGl2ZXRleHRfZmxhZ3MgPSB0ZXh0X2ZsYWdzOworICBpZiAobV9EZXZpY2VDbGFzcyAhPSBGWERDX0RJU1BMQVkpIHsKKyAgICBpZiAoISh0ZXh0X2ZsYWdzICYgRlhURVhUX1BSSU5UR1JBUEhJQ1RFWFQpKSB7CisgICAgICBib29sIHNob3VsZF9jYWxsX2RyYXdfZGV2aWNlX3RleHQgPSB0cnVlOworI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisgICAgICBpZiAoKHRleHRfZmxhZ3MgJiBGWEZPTlRfQ0lERk9OVCkgfHwKKyAgICAgICAgICAocEZvbnQtPkdldFBzTmFtZSgpLkZpbmQoQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbCgiK1pKSEwiKSkgIT0gLTEpIHx8CisgICAgICAgICAgKHBGb250LT5HZXRQc05hbWUoKSA9PSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKCJDTkFBSkkrY21leDEwIikpKSB7CisgICAgICAgIHNob3VsZF9jYWxsX2RyYXdfZGV2aWNlX3RleHQgPSBmYWxzZTsKKyAgICAgIH0KICNlbmRpZgotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIGlmIChtX3BEZXZpY2VEcml2ZXItPkRyYXdEZXZpY2VUZXh0KG5DaGFycywgcENoYXJQb3MsIHBGb250LCBwQ2FjaGUsIHBUZXh0MkRldmljZSwgZm9udF9zaXplLCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnQgYWxwaGEgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShmaWxsX2NvbG9yKTsKLSAgICAgICAgaWYgKGFscGhhIDwgMjU1KSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCEodGV4dF9mbGFncyAmIEZYVEVYVF9OT19OQVRJVkVURVhUKSkgewotI2lmIF9GWE1fUExBVEZPUk1fICA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgICAgICBpZiAoISh0ZXh0X2ZsYWdzICYgRlhGT05UX0NJREZPTlQpKQotI2lmZGVmIEZPWElUX0NIUk9NRV9CVUlMRAotICAgICAgICAgICAgaWYgKHBGb250LT5HZXRQc05hbWUoKSAhPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKCJDTkFBSkkrY21leDEwIikpCi0jZW5kaWYKLSNlbmRpZgotICAgICAgICAgICAgICAgIGlmIChtX3BEZXZpY2VEcml2ZXItPkRyYXdEZXZpY2VUZXh0KG5DaGFycywgcENoYXJQb3MsIHBGb250LCBwQ2FjaGUsIHBUZXh0MkRldmljZSwgZm9udF9zaXplLCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgfQotICAgIENGWF9BZmZpbmVNYXRyaXggY2hhcjJkZXZpY2UsIGRldmljZUN0bSwgdGV4dDJEZXZpY2U7Ci0gICAgaWYgKHBUZXh0MkRldmljZSkgewotICAgICAgICBjaGFyMmRldmljZSA9ICpwVGV4dDJEZXZpY2U7Ci0gICAgICAgIHRleHQyRGV2aWNlID0gKnBUZXh0MkRldmljZTsKLSAgICB9Ci0gICAgY2hhcjJkZXZpY2UuU2NhbGUoZm9udF9zaXplLCAtZm9udF9zaXplKTsKLSAgICBpZiAoRlhTWVNfZmFicyhjaGFyMmRldmljZS5hKSArIEZYU1lTX2ZhYnMoY2hhcjJkZXZpY2UuYikgPiA1MCAqIDEuMGYgfHwKLSAgICAgICAgICAgICgobV9EZXZpY2VDbGFzcyA9PSBGWERDX1BSSU5URVIgJiYgIW1fcERldmljZURyaXZlci0+SXNQU1ByaW50RHJpdmVyKCkpCi0gICAgICAgICAgICAgJiYgISh0ZXh0X2ZsYWdzICYgRlhURVhUX1BSSU5USU1BR0VURVhUKSkpIHsKLSAgICAgICAgaWYgKHBGb250LT5HZXRGYWNlKCkgIT0gTlVMTCB8fCAocEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX1N1YnN0RmxhZ3MgJiBGWEZPTlRfU1VCU1RfR0xZUEhQQVRIKSkgewotICAgICAgICAgICAgaW50IG5QYXRoRmxhZ3MgPSAodGV4dF9mbGFncyAmIEZYVEVYVF9OT1NNT09USCkgPT0gMCA/IDAgOiBGWEZJTExfTk9QQVRIU01PT1RIOwotICAgICAgICAgICAgcmV0dXJuIERyYXdUZXh0UGF0aChuQ2hhcnMsIHBDaGFyUG9zLCBwRm9udCwgcENhY2hlLCBmb250X3NpemUsIHBUZXh0MkRldmljZSwgTlVMTCwgTlVMTCwgZmlsbF9jb2xvciwgMCwgTlVMTCwgblBhdGhGbGFncywgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaW50IGFudGlfYWxpYXMgPSBGWEZUX1JFTkRFUl9NT0RFX01PTk87Ci0gICAgRlhfQk9PTCBiTm9ybWFsID0gRkFMU0U7Ci0gICAgaWYgKCh0ZXh0X2ZsYWdzICYgRlhURVhUX05PU01PT1RIKSA9PSAwKSB7Ci0gICAgICAgIGlmIChtX0RldmljZUNsYXNzID09IEZYRENfRElTUExBWSAmJiBtX2JwcCA+IDEpIHsKLSAgICAgICAgICAgIEZYX0JPT0wgYkNsZWFyVHlwZTsKLSAgICAgICAgICAgIGlmIChwRm9udC0+R2V0RmFjZSgpID09IE5VTEwgJiYgIShwRm9udC0+R2V0U3Vic3RGb250KCktPm1fU3Vic3RGbGFncyAmIEZYRk9OVF9TVUJTVF9DTEVBUlRZUEUpKSB7Ci0gICAgICAgICAgICAgICAgYkNsZWFyVHlwZSA9IEZBTFNFOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBiQ2xlYXJUeXBlID0gdGV4dF9mbGFncyAmIEZYVEVYVF9DTEVBUlRZUEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG1fUmVuZGVyQ2FwcyAmIChGWFJDX0FMUEhBX09VVFBVVCB8IEZYUkNfQ01ZS19PVVRQVVQpKSkgewotICAgICAgICAgICAgICAgIGFudGlfYWxpYXMgPSBGWEZUX1JFTkRFUl9NT0RFX0xDRDsKLSAgICAgICAgICAgICAgICBiTm9ybWFsID0gVFJVRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobV9icHAgPCAxNikgewotICAgICAgICAgICAgICAgIGFudGlfYWxpYXMgPSBGWEZUX1JFTkRFUl9NT0RFX05PUk1BTDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJDbGVhclR5cGUgPT0gRkFMU0UpIHsKLSAgICAgICAgICAgICAgICAgICAgYW50aV9hbGlhcyA9IEZYRlRfUkVOREVSX01PREVfTENEOwotICAgICAgICAgICAgICAgICAgICBiTm9ybWFsID0gVFJVRTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhbnRpX2FsaWFzID0gRlhGVF9SRU5ERVJfTU9ERV9MQ0Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwQ2FjaGUgPT0gTlVMTCkgewotICAgICAgICBwQ2FjaGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKTsKLSAgICB9Ci0gICAgQ0ZYX0ZhY2VDYWNoZSogcEZhY2VDYWNoZSA9IHBDYWNoZS0+R2V0Q2FjaGVkRmFjZShwRm9udCk7Ci0gICAgRlhfRk9OVENBQ0hFX0RFRklORShwQ2FjaGUsIHBGb250KTsKLSAgICBGWFRFWFRfR0xZUEhQT1MqIHBHbHlwaEFuZFBvcyA9IEZYX0FsbG9jKEZYVEVYVF9HTFlQSFBPUywgbkNoYXJzKTsKLSAgICBpbnQgaUNoYXI7Ci0gICAgZGV2aWNlQ3RtID0gY2hhcjJkZXZpY2U7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXhDVE0gPSBHZXRDVE0oKTsKLSAgICBGWF9GTE9BVCBzY2FsZV94ID0gRlhTWVNfZmFicyhtYXRyaXhDVE0uYSk7Ci0gICAgRlhfRkxPQVQgc2NhbGVfeSA9IEZYU1lTX2ZhYnMobWF0cml4Q1RNLmQpOwotICAgIGRldmljZUN0bS5Db25jYXQoc2NhbGVfeCwgMCwgMCwgc2NhbGVfeSwgMCwgMCk7Ci0gICAgdGV4dDJEZXZpY2UuQ29uY2F0KHNjYWxlX3gsIDAsIDAsIHNjYWxlX3ksIDAsIDApOwotICAgIGZvciAoaUNoYXIgPSAwOyBpQ2hhciA8IG5DaGFyczsgaUNoYXIgKyspIHsKLSAgICAgICAgRlhURVhUX0dMWVBIUE9TJiBnbHlwaCA9IHBHbHlwaEFuZFBvc1tpQ2hhcl07Ci0gICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TJiBjaGFycG9zID0gcENoYXJQb3NbaUNoYXJdOwotICAgICAgICBnbHlwaC5tX2ZPcmlnaW5YID0gY2hhcnBvcy5tX09yaWdpblg7Ci0gICAgICAgIGdseXBoLm1fZk9yaWdpblkgPSBjaGFycG9zLm1fT3JpZ2luWTsKLSAgICAgICAgdGV4dDJEZXZpY2UuVHJhbnNmb3JtKGdseXBoLm1fZk9yaWdpblgsIGdseXBoLm1fZk9yaWdpblkpOwotICAgICAgICBpZiAoYW50aV9hbGlhcyA8IEZYRlRfUkVOREVSX01PREVfTENEKSB7Ci0gICAgICAgICAgICBnbHlwaC5tX09yaWdpblggPSBGWFNZU19yb3VuZChnbHlwaC5tX2ZPcmlnaW5YKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdseXBoLm1fT3JpZ2luWCA9IChpbnQpRlhTWVNfZmxvb3IoZ2x5cGgubV9mT3JpZ2luWCk7Ci0gICAgICAgIH0KLSAgICAgICAgZ2x5cGgubV9PcmlnaW5ZID0gRlhTWVNfcm91bmQoZ2x5cGgubV9mT3JpZ2luWSk7Ci0gICAgICAgIGlmIChjaGFycG9zLm1fYkdseXBoQWRqdXN0KSB7Ci0gICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4IG5ld19tYXRyaXgoY2hhcnBvcy5tX0FkanVzdE1hdHJpeFswXSwgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzJdLCBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzNdLCAwLCAwKTsKLSAgICAgICAgICAgIG5ld19tYXRyaXguQ29uY2F0KGRldmljZUN0bSk7Ci0gICAgICAgICAgICBnbHlwaC5tX3BHbHlwaCA9IHBGYWNlQ2FjaGUtPkxvYWRHbHlwaEJpdG1hcChwRm9udCwgY2hhcnBvcy5tX0dseXBoSW5kZXgsIGNoYXJwb3MubV9iRm9udFN0eWxlLCAmbmV3X21hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnBvcy5tX0ZvbnRDaGFyV2lkdGgsIGFudGlfYWxpYXMsIG5hdGl2ZXRleHRfZmxhZ3MpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGdseXBoLm1fcEdseXBoID0gcEZhY2VDYWNoZS0+TG9hZEdseXBoQml0bWFwKHBGb250LCBjaGFycG9zLm1fR2x5cGhJbmRleCwgY2hhcnBvcy5tX2JGb250U3R5bGUsICZkZXZpY2VDdG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJwb3MubV9Gb250Q2hhcldpZHRoLCBhbnRpX2FsaWFzLCBuYXRpdmV0ZXh0X2ZsYWdzKTsKLSAgICB9Ci0gICAgaWYgKGFudGlfYWxpYXMgPCBGWEZUX1JFTkRFUl9NT0RFX0xDRCAmJiBuQ2hhcnMgPiAxKSB7Ci0gICAgICAgIF9BZGp1c3RHbHlwaFNwYWNlKHBHbHlwaEFuZFBvcywgbkNoYXJzKTsKLSAgICB9Ci0gICAgRlhfUkVDVCBibXBfcmVjdDEgPSBGWEdFX0dldEdseXBoc0JCb3gocEdseXBoQW5kUG9zLCBuQ2hhcnMsIGFudGlfYWxpYXMpOwotICAgIGlmIChzY2FsZV94ID4gMSAmJiBzY2FsZV95ID4gMSkgewotICAgICAgICBibXBfcmVjdDEubGVmdC0tOwotICAgICAgICBibXBfcmVjdDEudG9wIC0tOwotICAgICAgICBibXBfcmVjdDEucmlnaHQgKys7Ci0gICAgICAgIGJtcF9yZWN0MS5ib3R0b20gKys7Ci0gICAgfQotICAgIEZYX1JFQ1QgYm1wX3JlY3QoRlhTWVNfcm91bmQoKEZYX0ZMT0FUKShibXBfcmVjdDEubGVmdCkgLyBzY2FsZV94KSwgRlhTWVNfcm91bmQoKEZYX0ZMT0FUKShibXBfcmVjdDEudG9wKSAvIHNjYWxlX3kpLAotICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQoKEZYX0ZMT0FUKWJtcF9yZWN0MS5yaWdodCAvIHNjYWxlX3gpLCBGWFNZU19yb3VuZCgoRlhfRkxPQVQpYm1wX3JlY3QxLmJvdHRvbSAvIHNjYWxlX3kpKTsKLSAgICBibXBfcmVjdC5JbnRlcnNlY3QobV9DbGlwQm94KTsKLSAgICBpZiAoYm1wX3JlY3QuSXNFbXB0eSgpKSB7Ci0gICAgICAgIEZYX0ZyZWUocEdseXBoQW5kUG9zKTsKKyAgICAgIGlmIChzaG91bGRfY2FsbF9kcmF3X2RldmljZV90ZXh0ICYmCisgICAgICAgICAgbV9wRGV2aWNlRHJpdmVyLT5EcmF3RGV2aWNlVGV4dChuQ2hhcnMsIHBDaGFyUG9zLCBwRm9udCwgcENhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRleHQyRGV2aWNlLCBmb250X3NpemUsIGZpbGxfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgewogICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KICAgICB9Ci0gICAgaW50IHBpeGVsX3dpZHRoID0gRlhTWVNfcm91bmQoYm1wX3JlY3QuV2lkdGgoKSAqIHNjYWxlX3gpOwotICAgIGludCBwaXhlbF9oZWlnaHQgPSBGWFNZU19yb3VuZChibXBfcmVjdC5IZWlnaHQoKSAqIHNjYWxlX3kpOwotICAgIGludCBwaXhlbF9sZWZ0ID0gRlhTWVNfcm91bmQoYm1wX3JlY3QubGVmdCAqIHNjYWxlX3gpOwotICAgIGludCBwaXhlbF90b3AgPSBGWFNZU19yb3VuZChibXBfcmVjdC50b3AgKiBzY2FsZV95KTsKLSAgICBpZiAoYW50aV9hbGlhcyA9PSBGWEZUX1JFTkRFUl9NT0RFX01PTk8pIHsKLSAgICAgICAgQ0ZYX0RJQml0bWFwIGJpdG1hcDsKLSAgICAgICAgaWYgKCFiaXRtYXAuQ3JlYXRlKHBpeGVsX3dpZHRoLCBwaXhlbF9oZWlnaHQsIEZYRElCXzFicHBNYXNrKSkgewotICAgICAgICAgICAgRlhfRnJlZShwR2x5cGhBbmRQb3MpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGJpdG1hcC5DbGVhcigwKTsKLSAgICAgICAgZm9yIChpQ2hhciA9IDA7IGlDaGFyIDwgbkNoYXJzOyBpQ2hhciArKykgewotICAgICAgICAgICAgRlhURVhUX0dMWVBIUE9TJiBnbHlwaCA9IHBHbHlwaEFuZFBvc1tpQ2hhcl07Ci0gICAgICAgICAgICBpZiAoZ2x5cGgubV9wR2x5cGggPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwR2x5cGggPSAmZ2x5cGgubV9wR2x5cGgtPm1fQml0bWFwOwotICAgICAgICAgICAgYml0bWFwLlRyYW5zZmVyQml0bWFwKGdseXBoLm1fT3JpZ2luWCArIGdseXBoLm1fcEdseXBoLT5tX0xlZnQgLSBwaXhlbF9sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoLm1fT3JpZ2luWSAtIGdseXBoLm1fcEdseXBoLT5tX1RvcCAtIHBpeGVsX3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwR2x5cGgtPkdldFdpZHRoKCksIHBHbHlwaC0+R2V0SGVpZ2h0KCksIHBHbHlwaCwgMCwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRnJlZShwR2x5cGhBbmRQb3MpOwotICAgICAgICByZXR1cm4gU2V0Qml0TWFzaygmYml0bWFwLCBibXBfcmVjdC5sZWZ0LCBibXBfcmVjdC50b3AsIGZpbGxfY29sb3IpOworICAgIGludCBhbHBoYSA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykKKyAgICAgICAgICAgICAgICAgICAgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKQorICAgICAgICAgICAgICAgICAgICA6IEZYQVJHQl9BKGZpbGxfY29sb3IpOworICAgIGlmIChhbHBoYSA8IDI1NSkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBDRlhfRElCaXRtYXAgYml0bWFwOwotICAgIGlmIChtX2JwcCA9PSA4KSB7Ci0gICAgICAgIGlmICghYml0bWFwLkNyZWF0ZShwaXhlbF93aWR0aCwgcGl4ZWxfaGVpZ2h0LCBGWERJQl84YnBwTWFzaykpIHsKLSAgICAgICAgICAgIEZYX0ZyZWUocEdseXBoQW5kUG9zKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcCgmYml0bWFwLCBwaXhlbF93aWR0aCwgcGl4ZWxfaGVpZ2h0KSkgewotICAgICAgICAgICAgRlhfRnJlZShwR2x5cGhBbmRQb3MpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9CisgIH0gZWxzZSBpZiAoISh0ZXh0X2ZsYWdzICYgRlhURVhUX05PX05BVElWRVRFWFQpKSB7CisgICAgYm9vbCBzaG91bGRfY2FsbF9kcmF3X2RldmljZV90ZXh0ID0gdHJ1ZTsKKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworICAgIGlmICgodGV4dF9mbGFncyAmIEZYRk9OVF9DSURGT05UKSB8fAorICAgICAgICAocEZvbnQtPkdldFBzTmFtZSgpID09IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoIkNOQUFKSStjbWV4MTAiKSkpIHsKKyAgICAgIHNob3VsZF9jYWxsX2RyYXdfZGV2aWNlX3RleHQgPSBmYWxzZTsKICAgICB9Ci0gICAgaWYgKCFiaXRtYXAuSGFzQWxwaGEoKSAmJiAhYml0bWFwLklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgYml0bWFwLkNsZWFyKDB4RkZGRkZGRkYpOwotICAgICAgICBpZiAoIUdldERJQml0cygmYml0bWFwLCBibXBfcmVjdC5sZWZ0LCBibXBfcmVjdC50b3ApKSB7Ci0gICAgICAgICAgICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBiaXRtYXAuQ2xlYXIoMCk7Ci0gICAgICAgIGlmIChiaXRtYXAubV9wQWxwaGFNYXNrKSB7Ci0gICAgICAgICAgICBiaXRtYXAubV9wQWxwaGFNYXNrLT5DbGVhcigwKTsKLSAgICAgICAgfQorI2VuZGlmCisgICAgaWYgKHNob3VsZF9jYWxsX2RyYXdfZGV2aWNlX3RleHQgJiYKKyAgICAgICAgbV9wRGV2aWNlRHJpdmVyLT5EcmF3RGV2aWNlVGV4dChuQ2hhcnMsIHBDaGFyUG9zLCBwRm9udCwgcENhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZXh0MkRldmljZSwgZm9udF9zaXplLCBmaWxsX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKSB7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgaW50IGRlc3Rfd2lkdGggPSBwaXhlbF93aWR0aDsKLSAgICBGWF9MUEJZVEUgZGVzdF9idWYgPSBiaXRtYXAuR2V0QnVmZmVyKCk7Ci0gICAgaW50IGRlc3RfcGl0Y2ggPSBiaXRtYXAuR2V0UGl0Y2goKTsKLSAgICBpbnQgQnBwID0gYml0bWFwLkdldEJQUCgpIC8gODsKLSAgICBpbnQgYSwgciwgZywgYjsKLSAgICBpZiAoYW50aV9hbGlhcyA9PSBGWEZUX1JFTkRFUl9NT0RFX0xDRCkgewotICAgICAgICBfQ29sb3IyQXJnYihmaWxsX2NvbG9yLCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnIHwgKDEgPDwgMjQpLCBwSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgQXJnYkRlY29kZShmaWxsX2NvbG9yLCBhLCByLCBnLCBiKTsKLSAgICAgICAgciA9IEZYX0dBTU1BKHIpOwotICAgICAgICBnID0gRlhfR0FNTUEoZyk7Ci0gICAgICAgIGIgPSBGWF9HQU1NQShiKTsKKyAgfQorICBDRlhfTWF0cml4IGNoYXIyZGV2aWNlLCBkZXZpY2VDdG0sIHRleHQyRGV2aWNlOworICBpZiAocFRleHQyRGV2aWNlKSB7CisgICAgY2hhcjJkZXZpY2UgPSAqcFRleHQyRGV2aWNlOworICAgIHRleHQyRGV2aWNlID0gKnBUZXh0MkRldmljZTsKKyAgfQorICBjaGFyMmRldmljZS5TY2FsZShmb250X3NpemUsIC1mb250X3NpemUpOworICBpZiAoRlhTWVNfZmFicyhjaGFyMmRldmljZS5hKSArIEZYU1lTX2ZhYnMoY2hhcjJkZXZpY2UuYikgPiA1MCAqIDEuMGYgfHwKKyAgICAgICgobV9EZXZpY2VDbGFzcyA9PSBGWERDX1BSSU5URVIgJiYgIW1fcERldmljZURyaXZlci0+SXNQU1ByaW50RHJpdmVyKCkpICYmCisgICAgICAgISh0ZXh0X2ZsYWdzICYgRlhURVhUX1BSSU5USU1BR0VURVhUKSkpIHsKKyAgICBpZiAocEZvbnQtPkdldEZhY2UoKSB8fAorICAgICAgICAocEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX1N1YnN0RmxhZ3MgJiBGWEZPTlRfU1VCU1RfR0xZUEhQQVRIKSkgeworICAgICAgaW50IG5QYXRoRmxhZ3MgPQorICAgICAgICAgICh0ZXh0X2ZsYWdzICYgRlhURVhUX05PU01PT1RIKSA9PSAwID8gMCA6IEZYRklMTF9OT1BBVEhTTU9PVEg7CisgICAgICByZXR1cm4gRHJhd1RleHRQYXRoKG5DaGFycywgcENoYXJQb3MsIHBGb250LCBwQ2FjaGUsIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcFRleHQyRGV2aWNlLCBOVUxMLCBOVUxMLCBmaWxsX2NvbG9yLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuUGF0aEZsYWdzLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKICAgICB9Ci0gICAgZm9yIChpQ2hhciA9IDA7IGlDaGFyIDwgbkNoYXJzOyBpQ2hhciArKykgewotICAgICAgICBGWFRFWFRfR0xZUEhQT1MmIGdseXBoID0gcEdseXBoQW5kUG9zW2lDaGFyXTsKLSAgICAgICAgaWYgKGdseXBoLm1fcEdseXBoID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcEdseXBoID0gJmdseXBoLm1fcEdseXBoLT5tX0JpdG1hcDsKLSAgICAgICAgaW50IGxlZnQgPSBnbHlwaC5tX09yaWdpblggKyBnbHlwaC5tX3BHbHlwaC0+bV9MZWZ0IC0gcGl4ZWxfbGVmdDsKLSAgICAgICAgaW50IHRvcCA9IGdseXBoLm1fT3JpZ2luWSAtIGdseXBoLm1fcEdseXBoLT5tX1RvcCAtIHBpeGVsX3RvcDsKLSAgICAgICAgaW50IG5jb2xzID0gcEdseXBoLT5HZXRXaWR0aCgpOwotICAgICAgICBpbnQgbnJvd3MgPSBwR2x5cGgtPkdldEhlaWdodCgpOwotICAgICAgICBpZiAoYW50aV9hbGlhcyA9PSBGWEZUX1JFTkRFUl9NT0RFX05PUk1BTCkgewotICAgICAgICAgICAgaWYgKCFiaXRtYXAuQ29tcG9zaXRlTWFzayhsZWZ0LCB0b3AsIG5jb2xzLCBucm93cywgcEdseXBoLCBmaWxsX2NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBGWERJQl9CTEVORF9OT1JNQUwsIE5VTEwsIEZBTFNFLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICAgICAgICAgIEZYX0ZyZWUocEdseXBoQW5kUG9zKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBGWF9CT09MIGJCR1JTdHJpcGUgPSB0ZXh0X2ZsYWdzICYgRlhURVhUX0JHUl9TVFJJUEU7Ci0gICAgICAgIG5jb2xzIC89IDM7Ci0gICAgICAgIGludCB4X3N1YnBpeGVsID0gKGludCkoZ2x5cGgubV9mT3JpZ2luWCAqIDMpICUgMzsKLSAgICAgICAgRlhfTFBCWVRFIHNyY19idWYgPSBwR2x5cGgtPkdldEJ1ZmZlcigpOwotICAgICAgICBpbnQgc3JjX3BpdGNoID0gcEdseXBoLT5HZXRQaXRjaCgpOwotICAgICAgICBpbnQgc3RhcnRfY29sID0gbGVmdDsKLSAgICAgICAgaWYgKHN0YXJ0X2NvbCA8IDApIHsKLSAgICAgICAgICAgIHN0YXJ0X2NvbCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGVuZF9jb2wgPSBsZWZ0ICsgbmNvbHM7Ci0gICAgICAgIGlmIChlbmRfY29sID4gZGVzdF93aWR0aCkgewotICAgICAgICAgICAgZW5kX2NvbCA9IGRlc3Rfd2lkdGg7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXJ0X2NvbCA+PSBlbmRfY29sKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYml0bWFwLkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG5yb3dzOyByb3cgKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgZGVzdF9yb3cgPSByb3cgKyB0b3A7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc3Rfcm93IDwgMCB8fCBkZXN0X3JvdyA+PSBiaXRtYXAuR2V0SGVpZ2h0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZYX0xQQllURSBzcmNfc2NhbiA9IHNyY19idWYgKyByb3cgKiBzcmNfcGl0Y2ggKyAoc3RhcnRfY29sIC0gbGVmdCkgKiAzOwotICAgICAgICAgICAgICAgIEZYX0xQQllURSBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIGRlc3Rfcm93ICogZGVzdF9waXRjaCArIChzdGFydF9jb2wgPDwgMik7Ci0gICAgICAgICAgICAgICAgaWYgKGJCR1JTdHJpcGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHhfc3VicGl4ZWwgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gc3RhcnRfY29sOyBjb2wgPCBlbmRfY29sOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bMl07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeF9zdWJwaXhlbCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMV0sIGcsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydF9jb2wgPiBsZWZ0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bLTFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMF0sIGIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gc3RhcnRfY29sICsgMTsgY29sIDwgZW5kX2NvbCAtIDE7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblsxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzFdLCBnLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblswXSwgYiwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRfY29sID4gbGVmdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWy0xXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzFdLCBnLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblstMl07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblswXSwgYiwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSBzdGFydF9jb2wgKyAxOyBjb2wgPCBlbmRfY29sIC0gMTsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWy0xXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzFdLCBnLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblstMl07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblswXSwgYiwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoeF9zdWJwaXhlbCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSBzdGFydF9jb2w7IGNvbCA8IGVuZF9jb2w7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiTm9ybWFsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGExID0gKHNyY19zY2FuWzBdICsgc3JjX3NjYW5bMV0gKyBzcmNfc2NhblsyXSkgLyAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGExLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhMSA9IHNyY19hbHBoYTEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShzcmNfYWxwaGExLCByLCBnLCBiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhMSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhMSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGExIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGExICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBhbHBoYV9yYXRpbykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIGFscGhhX3JhdGlvKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgYWxwaGFfcmF0aW8pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bMl07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblswXSwgYiwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeF9zdWJwaXhlbCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYk5vcm1hbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGExID0gc3RhcnRfY29sID4gbGVmdCA/ICgoc3JjX3NjYW5bLTFdICsgc3JjX3NjYW5bMF0gKyBzcmNfc2NhblsxXSkgLyAzKSA6ICgoc3JjX3NjYW5bMF0gKyBzcmNfc2NhblsxXSkgLyAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGExLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGExID0gc3JjX2FscGhhMSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYTEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShzcmNfYWxwaGExLCByLCBnLCBiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhMSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGExIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYTEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBhbHBoYV9yYXRpbykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBhbHBoYV9yYXRpbykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBhbHBoYV9yYXRpbykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0X2NvbCA+IGxlZnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWy0xXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMV0sIGcsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMF0sIGIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gc3RhcnRfY29sICsgMTsgY29sIDwgZW5kX2NvbDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJOb3JtYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYTEgPSAoc3JjX3NjYW5bLTFdICsgc3JjX3NjYW5bMF0gKyBzcmNfc2NhblsxXSkgLyAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGExLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhMSA9IHNyY19hbHBoYTEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShzcmNfYWxwaGExLCByLCBnLCBiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhMSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhMSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGExIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGExICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBhbHBoYV9yYXRpbykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIGFscGhhX3JhdGlvKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgYWxwaGFfcmF0aW8pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bLTFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMV0sIGcsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMF0sIGIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJOb3JtYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhMSA9IHN0YXJ0X2NvbCA+IGxlZnQgPyAoKHNyY19zY2FuWy0yXSArIHNyY19zY2FuWy0xXSArIHNyY19zY2FuWzBdKSAvIDMpIDogKChzcmNfc2NhblswXSkgLyAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGExLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGExID0gc3JjX2FscGhhMSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYTEgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShzcmNfYWxwaGExLCByLCBnLCBiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhMSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGExIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYTEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBhbHBoYV9yYXRpbykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBhbHBoYV9yYXRpbykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBhbHBoYV9yYXRpbykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0X2NvbCA+IGxlZnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWy0yXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bLTFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzFdLCBnLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblswXSwgYiwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSBzdGFydF9jb2wgKyAxOyBjb2wgPCBlbmRfY29sOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYk5vcm1hbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhMSA9IChzcmNfc2NhblstMl0gKyBzcmNfc2NhblstMV0gKyBzcmNfc2NhblswXSkgLyAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGExLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhMSA9IHNyY19hbHBoYTEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShzcmNfYWxwaGExLCByLCBnLCBiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhMSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CWVRFIGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhMSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGExIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGExICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBhbHBoYV9yYXRpbykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIGFscGhhX3JhdGlvKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgYWxwaGFfcmF0aW8pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bLTJdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWy0xXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzFdLCBnLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgfQorICBpbnQgYW50aV9hbGlhcyA9IEZYRlRfUkVOREVSX01PREVfTU9OTzsKKyAgRlhfQk9PTCBiTm9ybWFsID0gRkFMU0U7CisgIGlmICgodGV4dF9mbGFncyAmIEZYVEVYVF9OT1NNT09USCkgPT0gMCkgeworICAgIGlmIChtX0RldmljZUNsYXNzID09IEZYRENfRElTUExBWSAmJiBtX2JwcCA+IDEpIHsKKyAgICAgIEZYX0JPT0wgYkNsZWFyVHlwZTsKKyAgICAgIGlmICghcEZvbnQtPkdldEZhY2UoKSAmJgorICAgICAgICAgICEocEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX1N1YnN0RmxhZ3MgJiBGWEZPTlRfU1VCU1RfQ0xFQVJUWVBFKSkgeworICAgICAgICBiQ2xlYXJUeXBlID0gRkFMU0U7CisgICAgICB9IGVsc2UgeworICAgICAgICBiQ2xlYXJUeXBlID0gdGV4dF9mbGFncyAmIEZYVEVYVF9DTEVBUlRZUEU7CisgICAgICB9CisgICAgICBpZiAoKG1fUmVuZGVyQ2FwcyAmIChGWFJDX0FMUEhBX09VVFBVVCB8IEZYUkNfQ01ZS19PVVRQVVQpKSkgeworICAgICAgICBhbnRpX2FsaWFzID0gRlhGVF9SRU5ERVJfTU9ERV9MQ0Q7CisgICAgICAgIGJOb3JtYWwgPSBUUlVFOworICAgICAgfSBlbHNlIGlmIChtX2JwcCA8IDE2KSB7CisgICAgICAgIGFudGlfYWxpYXMgPSBGWEZUX1JFTkRFUl9NT0RFX05PUk1BTDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChiQ2xlYXJUeXBlID09IEZBTFNFKSB7CisgICAgICAgICAgYW50aV9hbGlhcyA9IEZYRlRfUkVOREVSX01PREVfTENEOworICAgICAgICAgIGJOb3JtYWwgPSBUUlVFOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbnJvd3M7IHJvdyArKykgewotICAgICAgICAgICAgICAgIGludCBkZXN0X3JvdyA9IHJvdyArIHRvcDsKLSAgICAgICAgICAgICAgICBpZiAoZGVzdF9yb3cgPCAwIHx8IGRlc3Rfcm93ID49IGJpdG1hcC5HZXRIZWlnaHQoKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhfTFBCWVRFIHNyY19zY2FuID0gc3JjX2J1ZiArIHJvdyAqIHNyY19waXRjaCArIChzdGFydF9jb2wgLSBsZWZ0KSAqIDM7Ci0gICAgICAgICAgICAgICAgRlhfTFBCWVRFIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgZGVzdF9yb3cgKiBkZXN0X3BpdGNoICsgc3RhcnRfY29sICogQnBwOwotICAgICAgICAgICAgICAgIGlmIChiQkdSU3RyaXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4X3N1YnBpeGVsID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbDsgY29sIDwgZW5kX2NvbDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWzJdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMV0sIGcsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMF0sIGIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh4X3N1YnBpeGVsID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblsxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0X2NvbCA+IGxlZnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblswXSwgYiwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbCArIDE7IGNvbCA8IGVuZF9jb2wgLSAxOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bLTFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMF0sIGIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydF9jb2wgPiBsZWZ0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bLTFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMV0sIGcsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWy0yXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gc3RhcnRfY29sICsgMTsgY29sIDwgZW5kX2NvbCAtIDE7IGNvbCArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bLTJdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMF0sIGIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4X3N1YnBpeGVsID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbDsgY29sIDwgZW5kX2NvbDsgY29sICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJOb3JtYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYTEgPSAoc3JjX3NjYW5bMF0gKyBzcmNfc2NhblsxXSArIHNyY19zY2FuWzJdKSAvIDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYTEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGExID0gc3JjX2FscGhhMSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGExID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGExKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYTEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblsxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzFdLCBnLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblsyXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeF9zdWJwaXhlbCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYk5vcm1hbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGExID0gc3RhcnRfY29sID4gbGVmdCA/IChzcmNfc2NhblswXSArIHNyY19zY2FuWzFdICsgc3JjX3NjYW5bLTFdKSAvIDMgOiAoc3JjX3NjYW5bMF0gKyBzcmNfc2NhblsxXSkgLyAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYTEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYTEgPSBzcmNfYWxwaGExICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYTEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYTEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYTEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydF9jb2wgPiBsZWZ0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzFdLCBnLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblsxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSBzdGFydF9jb2wgKyAxOyBjb2wgPCBlbmRfY29sOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYk5vcm1hbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhMSA9IChzcmNfc2NhblswXSArIHNyY19zY2FuWzFdICsgc3JjX3NjYW5bLTFdKSAvIDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYTEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGExID0gc3JjX2FscGhhMSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGExID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGExKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYTEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblswXSwgYiwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJOb3JtYWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhMSA9IHN0YXJ0X2NvbCA+IGxlZnQgPyAoc3JjX3NjYW5bMF0gKyBzcmNfc2NhblstMl0gKyBzcmNfc2NhblstMV0pIC8gMyA6IHNyY19zY2FuWzBdIC8gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGExLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGExID0gc3JjX2FscGhhMSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGExKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGExKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGExKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRfY29sID4gbGVmdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bLTJdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMV0sIGcsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSBzdGFydF9jb2wgKyAxOyBjb2wgPCBlbmRfY29sOyBjb2wgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYk5vcm1hbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhMSA9ICgoaW50KShzcmNfc2NhblswXSkgKyAoaW50KShzcmNfc2NhblstMl0pICsgKGludCkoc3JjX3NjYW5bLTFdKSkgLyAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGExLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhMSA9IHNyY19hbHBoYTEgKiBhIC8gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhMSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYTEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGExKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bLTJdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWy0xXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzFdLCBnLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgYW50aV9hbGlhcyA9IEZYRlRfUkVOREVSX01PREVfTENEOwogICAgICAgICB9CisgICAgICB9CiAgICAgfQotICAgIGlmIChiaXRtYXAuSXNBbHBoYU1hc2soKSkgewotICAgICAgICBTZXRCaXRNYXNrKCZiaXRtYXAsIGJtcF9yZWN0LmxlZnQsIGJtcF9yZWN0LnRvcCwgZmlsbF9jb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CisgIH0KKyAgaWYgKCFwQ2FjaGUpIHsKKyAgICBwQ2FjaGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKTsKKyAgfQorICBDRlhfRmFjZUNhY2hlKiBwRmFjZUNhY2hlID0gcENhY2hlLT5HZXRDYWNoZWRGYWNlKHBGb250KTsKKyAgRlhfRk9OVENBQ0hFX0RFRklORShwQ2FjaGUsIHBGb250KTsKKyAgRlhURVhUX0dMWVBIUE9TKiBwR2x5cGhBbmRQb3MgPSBGWF9BbGxvYyhGWFRFWFRfR0xZUEhQT1MsIG5DaGFycyk7CisgIGludCBpQ2hhcjsKKyAgZGV2aWNlQ3RtID0gY2hhcjJkZXZpY2U7CisgIENGWF9NYXRyaXggbWF0cml4Q1RNID0gR2V0Q1RNKCk7CisgIEZYX0ZMT0FUIHNjYWxlX3ggPSBGWFNZU19mYWJzKG1hdHJpeENUTS5hKTsKKyAgRlhfRkxPQVQgc2NhbGVfeSA9IEZYU1lTX2ZhYnMobWF0cml4Q1RNLmQpOworICBkZXZpY2VDdG0uQ29uY2F0KHNjYWxlX3gsIDAsIDAsIHNjYWxlX3ksIDAsIDApOworICB0ZXh0MkRldmljZS5Db25jYXQoc2NhbGVfeCwgMCwgMCwgc2NhbGVfeSwgMCwgMCk7CisgIGZvciAoaUNoYXIgPSAwOyBpQ2hhciA8IG5DaGFyczsgaUNoYXIrKykgeworICAgIEZYVEVYVF9HTFlQSFBPUyYgZ2x5cGggPSBwR2x5cGhBbmRQb3NbaUNoYXJdOworICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TJiBjaGFycG9zID0gcENoYXJQb3NbaUNoYXJdOworICAgIGdseXBoLm1fZk9yaWdpblggPSBjaGFycG9zLm1fT3JpZ2luWDsKKyAgICBnbHlwaC5tX2ZPcmlnaW5ZID0gY2hhcnBvcy5tX09yaWdpblk7CisgICAgdGV4dDJEZXZpY2UuVHJhbnNmb3JtKGdseXBoLm1fZk9yaWdpblgsIGdseXBoLm1fZk9yaWdpblkpOworICAgIGlmIChhbnRpX2FsaWFzIDwgRlhGVF9SRU5ERVJfTU9ERV9MQ0QpIHsKKyAgICAgIGdseXBoLm1fT3JpZ2luWCA9IEZYU1lTX3JvdW5kKGdseXBoLm1fZk9yaWdpblgpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIFNldERJQml0cygmYml0bWFwLCBibXBfcmVjdC5sZWZ0LCBibXBfcmVjdC50b3ApOworICAgICAgZ2x5cGgubV9PcmlnaW5YID0gKGludClGWFNZU19mbG9vcihnbHlwaC5tX2ZPcmlnaW5YKTsKICAgICB9CisgICAgZ2x5cGgubV9PcmlnaW5ZID0gRlhTWVNfcm91bmQoZ2x5cGgubV9mT3JpZ2luWSk7CisgICAgaWYgKGNoYXJwb3MubV9iR2x5cGhBZGp1c3QpIHsKKyAgICAgIENGWF9NYXRyaXggbmV3X21hdHJpeCgKKyAgICAgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzBdLCBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzFdLAorICAgICAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMl0sIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbM10sIDAsIDApOworICAgICAgbmV3X21hdHJpeC5Db25jYXQoZGV2aWNlQ3RtKTsKKyAgICAgIGdseXBoLm1fcEdseXBoID0gcEZhY2VDYWNoZS0+TG9hZEdseXBoQml0bWFwKAorICAgICAgICAgIHBGb250LCBjaGFycG9zLm1fR2x5cGhJbmRleCwgY2hhcnBvcy5tX2JGb250U3R5bGUsICZuZXdfbWF0cml4LAorICAgICAgICAgIGNoYXJwb3MubV9Gb250Q2hhcldpZHRoLCBhbnRpX2FsaWFzLCBuYXRpdmV0ZXh0X2ZsYWdzKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2x5cGgubV9wR2x5cGggPSBwRmFjZUNhY2hlLT5Mb2FkR2x5cGhCaXRtYXAoCisgICAgICAgICAgcEZvbnQsIGNoYXJwb3MubV9HbHlwaEluZGV4LCBjaGFycG9zLm1fYkZvbnRTdHlsZSwgJmRldmljZUN0bSwKKyAgICAgICAgICBjaGFycG9zLm1fRm9udENoYXJXaWR0aCwgYW50aV9hbGlhcywgbmF0aXZldGV4dF9mbGFncyk7CisgICAgfQorICB9CisgIGlmIChhbnRpX2FsaWFzIDwgRlhGVF9SRU5ERVJfTU9ERV9MQ0QgJiYgbkNoYXJzID4gMSkgeworICAgIF9BZGp1c3RHbHlwaFNwYWNlKHBHbHlwaEFuZFBvcywgbkNoYXJzKTsKKyAgfQorICBGWF9SRUNUIGJtcF9yZWN0MSA9IEZYR0VfR2V0R2x5cGhzQkJveChwR2x5cGhBbmRQb3MsIG5DaGFycywgYW50aV9hbGlhcyk7CisgIGlmIChzY2FsZV94ID4gMSAmJiBzY2FsZV95ID4gMSkgeworICAgIGJtcF9yZWN0MS5sZWZ0LS07CisgICAgYm1wX3JlY3QxLnRvcC0tOworICAgIGJtcF9yZWN0MS5yaWdodCsrOworICAgIGJtcF9yZWN0MS5ib3R0b20rKzsKKyAgfQorICBGWF9SRUNUIGJtcF9yZWN0KEZYU1lTX3JvdW5kKChGWF9GTE9BVCkoYm1wX3JlY3QxLmxlZnQpIC8gc2NhbGVfeCksCisgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQoKEZYX0ZMT0FUKShibXBfcmVjdDEudG9wKSAvIHNjYWxlX3kpLAorICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKChGWF9GTE9BVClibXBfcmVjdDEucmlnaHQgLyBzY2FsZV94KSwKKyAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZCgoRlhfRkxPQVQpYm1wX3JlY3QxLmJvdHRvbSAvIHNjYWxlX3kpKTsKKyAgYm1wX3JlY3QuSW50ZXJzZWN0KG1fQ2xpcEJveCk7CisgIGlmIChibXBfcmVjdC5Jc0VtcHR5KCkpIHsKICAgICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7CiAgICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENGWF9SZW5kZXJEZXZpY2U6OkRyYXdUZXh0UGF0aChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFRleHQyVXNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBVc2VyMkRldmljZSwgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsIEZYX0FSR0Igc3Ryb2tlX2NvbG9yLCBDRlhfUGF0aERhdGEqIHBDbGlwcGluZ1BhdGgsIGludCBuRmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKLXsKLSAgICBpZiAocENhY2hlID09IE5VTEwpIHsKLSAgICAgICAgcENhY2hlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCk7CisgIH0KKyAgaW50IHBpeGVsX3dpZHRoID0gRlhTWVNfcm91bmQoYm1wX3JlY3QuV2lkdGgoKSAqIHNjYWxlX3gpOworICBpbnQgcGl4ZWxfaGVpZ2h0ID0gRlhTWVNfcm91bmQoYm1wX3JlY3QuSGVpZ2h0KCkgKiBzY2FsZV95KTsKKyAgaW50IHBpeGVsX2xlZnQgPSBGWFNZU19yb3VuZChibXBfcmVjdC5sZWZ0ICogc2NhbGVfeCk7CisgIGludCBwaXhlbF90b3AgPSBGWFNZU19yb3VuZChibXBfcmVjdC50b3AgKiBzY2FsZV95KTsKKyAgaWYgKGFudGlfYWxpYXMgPT0gRlhGVF9SRU5ERVJfTU9ERV9NT05PKSB7CisgICAgQ0ZYX0RJQml0bWFwIGJpdG1hcDsKKyAgICBpZiAoIWJpdG1hcC5DcmVhdGUocGl4ZWxfd2lkdGgsIHBpeGVsX2hlaWdodCwgRlhESUJfMWJwcE1hc2spKSB7CisgICAgICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIENGWF9GYWNlQ2FjaGUqIHBGYWNlQ2FjaGUgPSBwQ2FjaGUtPkdldENhY2hlZEZhY2UocEZvbnQpOwotICAgIEZYX0ZPTlRDQUNIRV9ERUZJTkUocENhY2hlLCBwRm9udCk7Ci0gICAgZm9yIChpbnQgaUNoYXIgPSAwOyBpQ2hhciA8IG5DaGFyczsgaUNoYXIgKyspIHsKLSAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MmIGNoYXJwb3MgPSBwQ2hhclBvc1tpQ2hhcl07Ci0gICAgICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwotICAgICAgICBpZiAoY2hhcnBvcy5tX2JHbHlwaEFkanVzdCkKLSAgICAgICAgICAgIG1hdHJpeC5TZXQoY2hhcnBvcy5tX0FkanVzdE1hdHJpeFswXSwgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFsyXSwgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFszXSwgMCwgMCk7Ci0gICAgICAgIG1hdHJpeC5Db25jYXQoZm9udF9zaXplLCAwLCAwLCBmb250X3NpemUsIGNoYXJwb3MubV9PcmlnaW5YLCBjaGFycG9zLm1fT3JpZ2luWSk7Ci0gICAgICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGggPSBwRmFjZUNhY2hlLT5Mb2FkR2x5cGhQYXRoKHBGb250LCBjaGFycG9zLm1fR2x5cGhJbmRleCwgY2hhcnBvcy5tX0ZvbnRDaGFyV2lkdGgpOwotICAgICAgICBpZiAocFBhdGggPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7CisgICAgYml0bWFwLkNsZWFyKDApOworICAgIGZvciAoaUNoYXIgPSAwOyBpQ2hhciA8IG5DaGFyczsgaUNoYXIrKykgeworICAgICAgRlhURVhUX0dMWVBIUE9TJiBnbHlwaCA9IHBHbHlwaEFuZFBvc1tpQ2hhcl07CisgICAgICBpZiAoIWdseXBoLm1fcEdseXBoKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwR2x5cGggPSAmZ2x5cGgubV9wR2x5cGgtPm1fQml0bWFwOworICAgICAgYml0bWFwLlRyYW5zZmVyQml0bWFwKAorICAgICAgICAgIGdseXBoLm1fT3JpZ2luWCArIGdseXBoLm1fcEdseXBoLT5tX0xlZnQgLSBwaXhlbF9sZWZ0LAorICAgICAgICAgIGdseXBoLm1fT3JpZ2luWSAtIGdseXBoLm1fcEdseXBoLT5tX1RvcCAtIHBpeGVsX3RvcCwKKyAgICAgICAgICBwR2x5cGgtPkdldFdpZHRoKCksIHBHbHlwaC0+R2V0SGVpZ2h0KCksIHBHbHlwaCwgMCwgMCk7CisgICAgfQorICAgIEZYX0ZyZWUocEdseXBoQW5kUG9zKTsKKyAgICByZXR1cm4gU2V0Qml0TWFzaygmYml0bWFwLCBibXBfcmVjdC5sZWZ0LCBibXBfcmVjdC50b3AsIGZpbGxfY29sb3IpOworICB9CisgIENGWF9ESUJpdG1hcCBiaXRtYXA7CisgIGlmIChtX2JwcCA9PSA4KSB7CisgICAgaWYgKCFiaXRtYXAuQ3JlYXRlKHBpeGVsX3dpZHRoLCBwaXhlbF9oZWlnaHQsIEZYRElCXzhicHBNYXNrKSkgeworICAgICAgRlhfRnJlZShwR2x5cGhBbmRQb3MpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoIUNyZWF0ZUNvbXBhdGlibGVCaXRtYXAoJmJpdG1hcCwgcGl4ZWxfd2lkdGgsIHBpeGVsX2hlaWdodCkpIHsKKyAgICAgIEZYX0ZyZWUocEdseXBoQW5kUG9zKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KKyAgaWYgKCFiaXRtYXAuSGFzQWxwaGEoKSAmJiAhYml0bWFwLklzQWxwaGFNYXNrKCkpIHsKKyAgICBiaXRtYXAuQ2xlYXIoMHhGRkZGRkZGRik7CisgICAgaWYgKCFHZXRESUJpdHMoJmJpdG1hcCwgYm1wX3JlY3QubGVmdCwgYm1wX3JlY3QudG9wKSkgeworICAgICAgRlhfRnJlZShwR2x5cGhBbmRQb3MpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBiaXRtYXAuQ2xlYXIoMCk7CisgICAgaWYgKGJpdG1hcC5tX3BBbHBoYU1hc2spIHsKKyAgICAgIGJpdG1hcC5tX3BBbHBoYU1hc2stPkNsZWFyKDApOworICAgIH0KKyAgfQorICBpbnQgZGVzdF93aWR0aCA9IHBpeGVsX3dpZHRoOworICB1aW50OF90KiBkZXN0X2J1ZiA9IGJpdG1hcC5HZXRCdWZmZXIoKTsKKyAgaW50IGRlc3RfcGl0Y2ggPSBiaXRtYXAuR2V0UGl0Y2goKTsKKyAgaW50IEJwcCA9IGJpdG1hcC5HZXRCUFAoKSAvIDg7CisgIGludCBhLCByLCBnLCBiOworICBpZiAoYW50aV9hbGlhcyA9PSBGWEZUX1JFTkRFUl9NT0RFX0xDRCkgeworICAgIF9Db2xvcjJBcmdiKGZpbGxfY29sb3IsIGZpbGxfY29sb3IsIGFscGhhX2ZsYWcgfCAoMSA8PCAyNCksIHBJY2NUcmFuc2Zvcm0pOworICAgIEFyZ2JEZWNvZGUoZmlsbF9jb2xvciwgYSwgciwgZywgYik7CisgICAgciA9IEZYX0dBTU1BKHIpOworICAgIGcgPSBGWF9HQU1NQShnKTsKKyAgICBiID0gRlhfR0FNTUEoYik7CisgIH0KKyAgZm9yIChpQ2hhciA9IDA7IGlDaGFyIDwgbkNoYXJzOyBpQ2hhcisrKSB7CisgICAgRlhURVhUX0dMWVBIUE9TJiBnbHlwaCA9IHBHbHlwaEFuZFBvc1tpQ2hhcl07CisgICAgaWYgKCFnbHlwaC5tX3BHbHlwaCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcEdseXBoID0gJmdseXBoLm1fcEdseXBoLT5tX0JpdG1hcDsKKyAgICBpbnQgbGVmdCA9IGdseXBoLm1fT3JpZ2luWCArIGdseXBoLm1fcEdseXBoLT5tX0xlZnQgLSBwaXhlbF9sZWZ0OworICAgIGludCB0b3AgPSBnbHlwaC5tX09yaWdpblkgLSBnbHlwaC5tX3BHbHlwaC0+bV9Ub3AgLSBwaXhlbF90b3A7CisgICAgaW50IG5jb2xzID0gcEdseXBoLT5HZXRXaWR0aCgpOworICAgIGludCBucm93cyA9IHBHbHlwaC0+R2V0SGVpZ2h0KCk7CisgICAgaWYgKGFudGlfYWxpYXMgPT0gRlhGVF9SRU5ERVJfTU9ERV9OT1JNQUwpIHsKKyAgICAgIGlmICghYml0bWFwLkNvbXBvc2l0ZU1hc2sobGVmdCwgdG9wLCBuY29scywgbnJvd3MsIHBHbHlwaCwgZmlsbF9jb2xvciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMLCBGQUxTRSwgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSkpIHsKKyAgICAgICAgRlhfRnJlZShwR2x5cGhBbmRQb3MpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgRlhfQk9PTCBiQkdSU3RyaXBlID0gdGV4dF9mbGFncyAmIEZYVEVYVF9CR1JfU1RSSVBFOworICAgIG5jb2xzIC89IDM7CisgICAgaW50IHhfc3VicGl4ZWwgPSAoaW50KShnbHlwaC5tX2ZPcmlnaW5YICogMykgJSAzOworICAgIHVpbnQ4X3QqIHNyY19idWYgPSBwR2x5cGgtPkdldEJ1ZmZlcigpOworICAgIGludCBzcmNfcGl0Y2ggPSBwR2x5cGgtPkdldFBpdGNoKCk7CisgICAgaW50IHN0YXJ0X2NvbCA9IGxlZnQ7CisgICAgaWYgKHN0YXJ0X2NvbCA8IDApIHsKKyAgICAgIHN0YXJ0X2NvbCA9IDA7CisgICAgfQorICAgIGludCBlbmRfY29sID0gbGVmdCArIG5jb2xzOworICAgIGlmIChlbmRfY29sID4gZGVzdF93aWR0aCkgeworICAgICAgZW5kX2NvbCA9IGRlc3Rfd2lkdGg7CisgICAgfQorICAgIGlmIChzdGFydF9jb2wgPj0gZW5kX2NvbCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChiaXRtYXAuR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYikgeworICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbnJvd3M7IHJvdysrKSB7CisgICAgICAgIGludCBkZXN0X3JvdyA9IHJvdyArIHRvcDsKKyAgICAgICAgaWYgKGRlc3Rfcm93IDwgMCB8fCBkZXN0X3JvdyA+PSBiaXRtYXAuR2V0SGVpZ2h0KCkpIHsKKyAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBtYXRyaXguQ29uY2F0KCpwVGV4dDJVc2VyKTsKLSAgICAgICAgQ0ZYX1BhdGhEYXRhIFRyYW5zZm9ybWVkUGF0aCgqcFBhdGgpOwotICAgICAgICBUcmFuc2Zvcm1lZFBhdGguVHJhbnNmb3JtKCZtYXRyaXgpOwotICAgICAgICBGWF9CT09MIGJIYXNBbHBoYSA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKSB8fCBGWEdFVEZMQUdfQUxQSEFfU1RST0tFKGFscGhhX2ZsYWcpKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGxfY29sb3IgfHwgc3Ryb2tlX2NvbG9yKTsKLSAgICAgICAgaWYgKGJIYXNBbHBoYSkgewotICAgICAgICAgICAgaW50IGZpbGxfbW9kZSA9IG5GbGFnOwotICAgICAgICAgICAgaWYgKEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykpIHsKLSAgICAgICAgICAgICAgICBpZiAoRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsbF9tb2RlIHw9IEZYRklMTF9XSU5ESU5HOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGxfY29sb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsbF9tb2RlIHw9IEZYRklMTF9XSU5ESU5HOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgdWludDhfdCogc3JjX3NjYW4gPSBzcmNfYnVmICsgcm93ICogc3JjX3BpdGNoICsgKHN0YXJ0X2NvbCAtIGxlZnQpICogMzsKKyAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0KKyAgICAgICAgICAgIGRlc3RfYnVmICsgZGVzdF9yb3cgKiBkZXN0X3BpdGNoICsgKHN0YXJ0X2NvbCA8PCAyKTsKKyAgICAgICAgaWYgKGJCR1JTdHJpcGUpIHsKKyAgICAgICAgICBpZiAoeF9zdWJwaXhlbCA9PSAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBjb2wgPSBzdGFydF9jb2w7IGNvbCA8IGVuZF9jb2w7IGNvbCsrKSB7CisgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblsyXTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblsxXTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZmlsbF9tb2RlIHw9IEZYX0ZJTExfVEVYVF9NT0RFOwotICAgICAgICAgICAgaWYgKCFEcmF3UGF0aCgmVHJhbnNmb3JtZWRQYXRoLCBwVXNlcjJEZXZpY2UsIHBHcmFwaFN0YXRlLCBmaWxsX2NvbG9yLCBzdHJva2VfY29sb3IsIGZpbGxfbW9kZSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgfSBlbHNlIGlmICh4X3N1YnBpeGVsID09IDEpIHsKKyAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblsxXTsKKyAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzBdOworICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgaWYgKHN0YXJ0X2NvbCA+IGxlZnQpIHsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bLTFdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBDbGlwcGluZ1BhdGgpIHsKLSAgICAgICAgICAgIHBDbGlwcGluZ1BhdGgtPkFwcGVuZCgmVHJhbnNmb3JtZWRQYXRoLCBwVXNlcjJEZXZpY2UpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotQ0ZYX0ZvbnRDYWNoZTo6fkNGWF9Gb250Q2FjaGUoKQotewotICAgIEZyZWVDYWNoZShUUlVFKTsKLX0KLUNGWF9GYWNlQ2FjaGUqIENGWF9Gb250Q2FjaGU6OkdldENhY2hlZEZhY2UoQ0ZYX0ZvbnQqIHBGb250KQotewotICAgIEZYX0JPT0wgYkV4dGVybmFsID0gcEZvbnQtPkdldEZhY2UoKSA9PSBOVUxMOwotICAgIHZvaWQqIGZhY2UgPSBiRXh0ZXJuYWwgPyBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fRXh0SGFuZGxlIDogcEZvbnQtPkdldEZhY2UoKTsKLSAgICBDRlhfRlRDYWNoZU1hcCYgbWFwID0gIGJFeHRlcm5hbCA/IG1fRXh0RmFjZU1hcCA6IG1fRlRGYWNlTWFwOwotICAgIENGWF9Db3VudGVkRmFjZUNhY2hlKiBjb3VudGVkX2ZhY2VfY2FjaGUgPSBOVUxMOwotICAgIGlmIChtYXAuTG9va3VwKChGWEZUX0ZhY2UpZmFjZSwgY291bnRlZF9mYWNlX2NhY2hlKSkgewotICAgICAgICBjb3VudGVkX2ZhY2VfY2FjaGUtPm1fbkNvdW50Kys7Ci0gICAgICAgIHJldHVybiBjb3VudGVkX2ZhY2VfY2FjaGUtPm1fT2JqOwotICAgIH0KLSAgICBDRlhfRmFjZUNhY2hlKiBmYWNlX2NhY2hlID0gbmV3IENGWF9GYWNlQ2FjaGUoYkV4dGVybmFsID8gTlVMTCA6IChGWEZUX0ZhY2UpZmFjZSk7Ci0gICAgY291bnRlZF9mYWNlX2NhY2hlID0gbmV3IENGWF9Db3VudGVkRmFjZUNhY2hlOwotICAgIGNvdW50ZWRfZmFjZV9jYWNoZS0+bV9uQ291bnQgPSAyOwotICAgIGNvdW50ZWRfZmFjZV9jYWNoZS0+bV9PYmogPSBmYWNlX2NhY2hlOwotICAgIG1hcC5TZXRBdCgoRlhGVF9GYWNlKWZhY2UsIGNvdW50ZWRfZmFjZV9jYWNoZSk7Ci0gICAgcmV0dXJuIGZhY2VfY2FjaGU7Ci19Ci12b2lkIENGWF9Gb250Q2FjaGU6OlJlbGVhc2VDYWNoZWRGYWNlKENGWF9Gb250KiBwRm9udCkKLXsKLSAgICBGWF9CT09MIGJFeHRlcm5hbCA9IHBGb250LT5HZXRGYWNlKCkgPT0gTlVMTDsKLSAgICB2b2lkKiBmYWNlID0gYkV4dGVybmFsID8gcEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX0V4dEhhbmRsZSA6IHBGb250LT5HZXRGYWNlKCk7Ci0gICAgQ0ZYX0ZUQ2FjaGVNYXAmIG1hcCA9ICBiRXh0ZXJuYWwgPyBtX0V4dEZhY2VNYXAgOiBtX0ZURmFjZU1hcDsKLSAgICBDRlhfQ291bnRlZEZhY2VDYWNoZSogY291bnRlZF9mYWNlX2NhY2hlID0gTlVMTDsKLSAgICBpZiAoIW1hcC5Mb29rdXAoKEZYRlRfRmFjZSlmYWNlLCBjb3VudGVkX2ZhY2VfY2FjaGUpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGNvdW50ZWRfZmFjZV9jYWNoZS0+bV9uQ291bnQgPiAxKSB7Ci0gICAgICAgIGNvdW50ZWRfZmFjZV9jYWNoZS0+bV9uQ291bnQtLTsKLSAgICB9Ci19Ci12b2lkIENGWF9Gb250Q2FjaGU6OkZyZWVDYWNoZShGWF9CT09MIGJSZWxlYXNlKQotewotICAgIHsKLSAgICAgICAgRlhfUE9TSVRJT04gcG9zOwotICAgICAgICBwb3MgPSBtX0ZURmFjZU1hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgICAgIEZYRlRfRmFjZSBmYWNlOwotICAgICAgICAgICAgQ0ZYX0NvdW50ZWRGYWNlQ2FjaGUqIGNhY2hlOwotICAgICAgICAgICAgbV9GVEZhY2VNYXAuR2V0TmV4dEFzc29jKHBvcywgZmFjZSwgY2FjaGUpOwotICAgICAgICAgICAgaWYgKGJSZWxlYXNlIHx8IGNhY2hlLT5tX25Db3VudCA8IDIpIHsKLSAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGUtPm1fT2JqOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBjYWNoZTsKLSAgICAgICAgICAgICAgICBtX0ZURmFjZU1hcC5SZW1vdmVLZXkoZmFjZSk7CisgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSAyNTU7CisgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgICBmb3IgKGludCBjb2wgPSBzdGFydF9jb2wgKyAxOyBjb2wgPCBlbmRfY29sIC0gMTsgY29sKyspIHsKKyAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWzFdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzBdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzFdLCBnLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWy0xXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblswXSwgYiwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBvcyA9IG1fRXh0RmFjZU1hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgICAgIEZYRlRfRmFjZSBmYWNlOwotICAgICAgICAgICAgQ0ZYX0NvdW50ZWRGYWNlQ2FjaGUqIGNhY2hlOwotICAgICAgICAgICAgbV9FeHRGYWNlTWFwLkdldE5leHRBc3NvYyhwb3MsIGZhY2UsIGNhY2hlKTsKLSAgICAgICAgICAgIGlmIChiUmVsZWFzZSB8fCBjYWNoZS0+bV9uQ291bnQgPCAyKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlLT5tX09iajsKLSAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGU7Ci0gICAgICAgICAgICAgICAgbV9FeHRGYWNlTWFwLlJlbW92ZUtleShmYWNlKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWzBdOworICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgaWYgKHN0YXJ0X2NvbCA+IGxlZnQpIHsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bLTFdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzFdLCBnLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWy0yXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblswXSwgYiwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotQ0ZYX0ZhY2VDYWNoZTo6Q0ZYX0ZhY2VDYWNoZShGWEZUX0ZhY2UgZmFjZSkKLXsKLSAgICBtX0ZhY2UgPSBmYWNlOwotICAgIG1fcEJpdG1hcCA9IE5VTEw7Ci19Ci1DRlhfRmFjZUNhY2hlOjp+Q0ZYX0ZhY2VDYWNoZSgpCi17Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9TaXplTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBLZXk7Ci0gICAgQ0ZYX1NpemVHbHlwaENhY2hlKiBwU2l6ZUNhY2hlID0gTlVMTDsKLSAgICB3aGlsZShwb3MpIHsKLSAgICAgICAgbV9TaXplTWFwLkdldE5leHRBc3NvYyggcG9zLCBLZXksICh2b2lkKiYpcFNpemVDYWNoZSk7Ci0gICAgICAgIGRlbGV0ZSBwU2l6ZUNhY2hlOwotICAgIH0KLSAgICBtX1NpemVNYXAuUmVtb3ZlQWxsKCk7Ci0gICAgcG9zID0gbV9QYXRoTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICBGWF9MUFZPSUQga2V5MTsKLSAgICBDRlhfUGF0aERhdGEqIHBQYXRoOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgbV9QYXRoTWFwLkdldE5leHRBc3NvYyhwb3MsIGtleTEsIChGWF9MUFZPSUQmKXBQYXRoKTsKLSAgICAgICAgZGVsZXRlIHBQYXRoOwotICAgIH0KLSAgICBpZiAobV9wQml0bWFwKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BCaXRtYXA7Ci0gICAgfQotICAgIG1fUGF0aE1hcC5SZW1vdmVBbGwoKTsKLX0KLSNpZiBfRlhNX1BMQVRGT1JNXyAgIT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLXZvaWQgQ0ZYX0ZhY2VDYWNoZTo6SW5pdFBsYXRmb3JtKCkKLXsKLX0KLSNlbmRpZgotQ0ZYX0dseXBoQml0bWFwKiBDRlhfRmFjZUNhY2hlOjpMb29rVXBHbHlwaEJpdG1hcChDRlhfRm9udCogcEZvbnQsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgIENGWF9CeXRlU3RyaW5nQyYgRmFjZUdseXBoc0tleSwgRlhfRFdPUkQgZ2x5cGhfaW5kZXgsIEZYX0JPT0wgYkZvbnRTdHlsZSwKLSAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBhbnRpX2FsaWFzKQotewotICAgIENGWF9TaXplR2x5cGhDYWNoZSogcFNpemVDYWNoZSA9IE5VTEw7Ci0gICAgaWYgKCFtX1NpemVNYXAuTG9va3VwKEZhY2VHbHlwaHNLZXksICh2b2lkKiYpcFNpemVDYWNoZSkpIHsKLSAgICAgICAgcFNpemVDYWNoZSA9IG5ldyBDRlhfU2l6ZUdseXBoQ2FjaGU7Ci0gICAgICAgIG1fU2l6ZU1hcC5TZXRBdChGYWNlR2x5cGhzS2V5LCBwU2l6ZUNhY2hlKTsKLSAgICB9Ci0gICAgQ0ZYX0dseXBoQml0bWFwKiBwR2x5cGhCaXRtYXAgPSBOVUxMOwotICAgIGlmIChwU2l6ZUNhY2hlLT5tX0dseXBoTWFwLkxvb2t1cCgoRlhfTFBWT0lEKShGWF9VSU5UUFRSKWdseXBoX2luZGV4LCAodm9pZComKXBHbHlwaEJpdG1hcCkpIHsKLSAgICAgICAgcmV0dXJuIHBHbHlwaEJpdG1hcDsKLSAgICB9Ci0gICAgcEdseXBoQml0bWFwID0gUmVuZGVyR2x5cGgocEZvbnQsIGdseXBoX2luZGV4LCBiRm9udFN0eWxlLCBwTWF0cml4LCBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzKTsKLSAgICBpZiAocEdseXBoQml0bWFwID09IE5VTEwpCXsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHBTaXplQ2FjaGUtPm1fR2x5cGhNYXAuU2V0QXQoKEZYX0xQVk9JRCkoRlhfVUlOVFBUUilnbHlwaF9pbmRleCwgcEdseXBoQml0bWFwKTsKLSAgICByZXR1cm4gcEdseXBoQml0bWFwOwotfQotY29uc3QgQ0ZYX0dseXBoQml0bWFwKiBDRlhfRmFjZUNhY2hlOjpMb2FkR2x5cGhCaXRtYXAoQ0ZYX0ZvbnQqIHBGb250LCBGWF9EV09SRCBnbHlwaF9pbmRleCwgRlhfQk9PTCBiRm9udFN0eWxlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAotICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGFudGlfYWxpYXMsIGludCYgdGV4dF9mbGFncykKLXsKLSAgICBpZiAoZ2x5cGhfaW5kZXggPT0gKEZYX0RXT1JEKSAtIDEpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIF9DRlhfVW5pcXVlS2V5R2VuIGtleWdlbjsKLSNpZiBfRlhNX1BMQVRGT1JNXyAgIT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICBpZiAocEZvbnQtPkdldFN1YnN0Rm9udCgpKQotICAgICAgICBrZXlnZW4uR2VuZXJhdGUoOSwgKGludCkocE1hdHJpeC0+YSAqIDEwMDAwKSwgKGludCkocE1hdHJpeC0+YiAqIDEwMDAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKHBNYXRyaXgtPmMgKiAxMDAwMCksIChpbnQpKHBNYXRyaXgtPmQgKiAxMDAwMCksIGRlc3Rfd2lkdGgsIGFudGlfYWxpYXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0LCBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fSXRhbGljQW5nbGUsIHBGb250LT5Jc1ZlcnRpY2FsKCkpOwotICAgIGVsc2UKLSAgICAgICAga2V5Z2VuLkdlbmVyYXRlKDYsIChpbnQpKHBNYXRyaXgtPmEgKiAxMDAwMCksIChpbnQpKHBNYXRyaXgtPmIgKiAxMDAwMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50KShwTWF0cml4LT5jICogMTAwMDApLCAoaW50KShwTWF0cml4LT5kICogMTAwMDApLCBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzKTsKLSNlbHNlCi0gICAgaWYgKHRleHRfZmxhZ3MgJiBGWFRFWFRfTk9fTkFUSVZFVEVYVCkgewotICAgICAgICBpZiAocEZvbnQtPkdldFN1YnN0Rm9udCgpKQotICAgICAgICAgICAga2V5Z2VuLkdlbmVyYXRlKDksIChpbnQpKHBNYXRyaXgtPmEgKiAxMDAwMCksIChpbnQpKHBNYXRyaXgtPmIgKiAxMDAwMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkocE1hdHJpeC0+YyAqIDEwMDAwKSwgKGludCkocE1hdHJpeC0+ZCAqIDEwMDAwKSwgZGVzdF93aWR0aCwgYW50aV9hbGlhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0LCBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fSXRhbGljQW5nbGUsIHBGb250LT5Jc1ZlcnRpY2FsKCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBrZXlnZW4uR2VuZXJhdGUoNiwgKGludCkocE1hdHJpeC0+YSAqIDEwMDAwKSwgKGludCkocE1hdHJpeC0+YiAqIDEwMDAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShwTWF0cml4LT5jICogMTAwMDApLCAoaW50KShwTWF0cml4LT5kICogMTAwMDApLCBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAocEZvbnQtPkdldFN1YnN0Rm9udCgpKQotICAgICAgICAgICAga2V5Z2VuLkdlbmVyYXRlKDEwLCAoaW50KShwTWF0cml4LT5hICogMTAwMDApLCAoaW50KShwTWF0cml4LT5iICogMTAwMDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKHBNYXRyaXgtPmMgKiAxMDAwMCksIChpbnQpKHBNYXRyaXgtPmQgKiAxMDAwMCksIGRlc3Rfd2lkdGgsIGFudGlfYWxpYXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX1dlaWdodCwgcEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX0l0YWxpY0FuZ2xlLCBwRm9udC0+SXNWZXJ0aWNhbCgpLCAzKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAga2V5Z2VuLkdlbmVyYXRlKDcsIChpbnQpKHBNYXRyaXgtPmEgKiAxMDAwMCksIChpbnQpKHBNYXRyaXgtPmIgKiAxMDAwMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkocE1hdHJpeC0+YyAqIDEwMDAwKSwgKGludCkocE1hdHJpeC0+ZCAqIDEwMDAwKSwgZGVzdF93aWR0aCwgYW50aV9hbGlhcywgMyk7Ci0gICAgfQotI2VuZGlmCi0gICAgQ0ZYX0J5dGVTdHJpbmdDIEZhY2VHbHlwaHNLZXkoa2V5Z2VuLm1fS2V5LCBrZXlnZW4ubV9LZXlMZW4pOwotI2lmIF9GWE1fUExBVEZPUk1fICAhPSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgIHJldHVybiBMb29rVXBHbHlwaEJpdG1hcChwRm9udCwgcE1hdHJpeCwgRmFjZUdseXBoc0tleSwgZ2x5cGhfaW5kZXgsIGJGb250U3R5bGUsIGRlc3Rfd2lkdGgsIGFudGlfYWxpYXMpOwotI2Vsc2UKLSAgICBpZiAodGV4dF9mbGFncyAmIEZYVEVYVF9OT19OQVRJVkVURVhUKSB7Ci0gICAgICAgIHJldHVybiBMb29rVXBHbHlwaEJpdG1hcChwRm9udCwgcE1hdHJpeCwgRmFjZUdseXBoc0tleSwgZ2x5cGhfaW5kZXgsIGJGb250U3R5bGUsIGRlc3Rfd2lkdGgsIGFudGlfYWxpYXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIENGWF9HbHlwaEJpdG1hcCogcEdseXBoQml0bWFwOwotICAgICAgICBDRlhfU2l6ZUdseXBoQ2FjaGUqIHBTaXplQ2FjaGUgPSBOVUxMOwotICAgICAgICBpZiAobV9TaXplTWFwLkxvb2t1cChGYWNlR2x5cGhzS2V5LCAodm9pZComKXBTaXplQ2FjaGUpKSB7Ci0gICAgICAgICAgICBpZiAocFNpemVDYWNoZS0+bV9HbHlwaE1hcC5Mb29rdXAoKEZYX0xQVk9JRCkoRlhfVUlOVFBUUilnbHlwaF9pbmRleCwgKHZvaWQqJilwR2x5cGhCaXRtYXApKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBHbHlwaEJpdG1hcDsKKyAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IDI1NTsKKyAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbCArIDE7IGNvbCA8IGVuZF9jb2wgLSAxOyBjb2wrKykgeworICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bMF07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bLTFdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzFdLCBnLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWy0yXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblswXSwgYiwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcEdseXBoQml0bWFwID0gUmVuZGVyR2x5cGhfTmF0aXZldGV4dChwRm9udCwgZ2x5cGhfaW5kZXgsIHBNYXRyaXgsIGRlc3Rfd2lkdGgsIGFudGlfYWxpYXMpOwotICAgICAgICAgICAgaWYgKHBHbHlwaEJpdG1hcCkgewotICAgICAgICAgICAgICAgIHBTaXplQ2FjaGUtPm1fR2x5cGhNYXAuU2V0QXQoKEZYX0xQVk9JRCkoRlhfVUlOVFBUUilnbHlwaF9pbmRleCwgcEdseXBoQml0bWFwKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcEdseXBoQml0bWFwOwotICAgICAgICAgICAgfQorICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBHbHlwaEJpdG1hcCA9IFJlbmRlckdseXBoX05hdGl2ZXRleHQocEZvbnQsIGdseXBoX2luZGV4LCBwTWF0cml4LCBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzKTsKLSAgICAgICAgICAgIGlmIChwR2x5cGhCaXRtYXApIHsKLSAgICAgICAgICAgICAgICBwU2l6ZUNhY2hlID0gbmV3IENGWF9TaXplR2x5cGhDYWNoZTsKLSAgICAgICAgICAgICAgICBtX1NpemVNYXAuU2V0QXQoRmFjZUdseXBoc0tleSwgcFNpemVDYWNoZSk7Ci0gICAgICAgICAgICAgICAgcFNpemVDYWNoZS0+bV9HbHlwaE1hcC5TZXRBdCgoRlhfTFBWT0lEKShGWF9VSU5UUFRSKWdseXBoX2luZGV4LCBwR2x5cGhCaXRtYXApOwotICAgICAgICAgICAgICAgIHJldHVybiBwR2x5cGhCaXRtYXA7CisgICAgICAgICAgaWYgKHhfc3VicGl4ZWwgPT0gMCkgeworICAgICAgICAgICAgZm9yIChpbnQgY29sID0gc3RhcnRfY29sOyBjb2wgPCBlbmRfY29sOyBjb2wrKykgeworICAgICAgICAgICAgICBpZiAoYk5vcm1hbCkgeworICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGExID0gKHNyY19zY2FuWzBdICsgc3JjX3NjYW5bMV0gKyBzcmNfc2NhblsyXSkgLyAzOworICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYTEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICAgIHNyY19hbHBoYTEgPSBzcmNfYWxwaGExICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CisgICAgICAgICAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgICAgICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKHNyY19hbHBoYTEsIHIsIGcsIGIpKTsKKyAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhMSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KKyAgICAgICAgICAgICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYTEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhMSAvIDI1NTsKKyAgICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOworICAgICAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYTEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIGFscGhhX3JhdGlvKSk7CisgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgYWxwaGFfcmF0aW8pKTsKKyAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBhbHBoYV9yYXRpbykpOworICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWzBdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzFdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzFdLCBnLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzJdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CiAgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmICh4X3N1YnBpeGVsID09IDEpIHsKKyAgICAgICAgICAgIGlmIChiTm9ybWFsKSB7CisgICAgICAgICAgICAgIGludCBzcmNfYWxwaGExID0KKyAgICAgICAgICAgICAgICAgIHN0YXJ0X2NvbCA+IGxlZnQKKyAgICAgICAgICAgICAgICAgICAgICA/ICgoc3JjX3NjYW5bLTFdICsgc3JjX3NjYW5bMF0gKyBzcmNfc2NhblsxXSkgLyAzKQorICAgICAgICAgICAgICAgICAgICAgIDogKChzcmNfc2NhblswXSArIHNyY19zY2FuWzFdKSAvIDMpOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGExLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhMSA9IHNyY19hbHBoYTEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhMSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CisgICAgICAgICAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgICAgICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKHNyY19hbHBoYTEsIHIsIGcsIGIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KKyAgICAgICAgICAgICAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhMSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGExIC8gMjU1OworICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYTEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRSgKKyAgICAgICAgICAgICAgICAgICAgICBGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBhbHBoYV9yYXRpbykpOworICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRSgKKyAgICAgICAgICAgICAgICAgICAgICBGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBhbHBoYV9yYXRpbykpOworICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRShGWERJQl9BTFBIQV9NRVJHRSgKKyAgICAgICAgICAgICAgICAgICAgICBGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBhbHBoYV9yYXRpbykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpZiAoc3RhcnRfY29sID4gbGVmdCkgeworICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07CisgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblsxXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblswXSwgYiwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgY29sID0gc3RhcnRfY29sICsgMTsgY29sIDwgZW5kX2NvbDsgY29sKyspIHsKKyAgICAgICAgICAgICAgaWYgKGJOb3JtYWwpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhMSA9IChzcmNfc2NhblstMV0gKyBzcmNfc2NhblswXSArIHNyY19zY2FuWzFdKSAvIDM7CisgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhMSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgICAgc3JjX2FscGhhMSA9IHNyY19hbHBoYTEgKiBhIC8gMjU1OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKKyAgICAgICAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0Uoc3JjX2FscGhhMSwgciwgZywgYikpOworICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGExID09IDApIHsKKyAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgICAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhMSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGExIC8gMjU1OworICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhMSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgYWxwaGFfcmF0aW8pKTsKKyAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBhbHBoYV9yYXRpbykpOworICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIGFscGhhX3JhdGlvKSk7CisgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bLTFdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzBdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzFdLCBnLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzFdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChiTm9ybWFsKSB7CisgICAgICAgICAgICAgIGludCBzcmNfYWxwaGExID0KKyAgICAgICAgICAgICAgICAgIHN0YXJ0X2NvbCA+IGxlZnQKKyAgICAgICAgICAgICAgICAgICAgICA/ICgoc3JjX3NjYW5bLTJdICsgc3JjX3NjYW5bLTFdICsgc3JjX3NjYW5bMF0pIC8gMykKKyAgICAgICAgICAgICAgICAgICAgICA6ICgoc3JjX3NjYW5bMF0pIC8gMyk7CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYTEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGExID0gc3JjX2FscGhhMSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGlmIChzcmNfYWxwaGExID09IDApIHsKKyAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKKyAgICAgICAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0Uoc3JjX2FscGhhMSwgciwgZywgYikpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgICAgICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGExIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYTEgLyAyNTU7CisgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOworICAgICAgICAgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhMSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKAorICAgICAgICAgICAgICAgICAgICAgIEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIGFscGhhX3JhdGlvKSk7CisgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKAorICAgICAgICAgICAgICAgICAgICAgIEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIGFscGhhX3JhdGlvKSk7CisgICAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKEZYRElCX0FMUEhBX01FUkdFKAorICAgICAgICAgICAgICAgICAgICAgIEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIGFscGhhX3JhdGlvKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGlmIChzdGFydF9jb2wgPiBsZWZ0KSB7CisgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWy0yXTsKKyAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bLTFdOworICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMV0sIGcsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bMF07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMF0sIGIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbCArIDE7IGNvbCA8IGVuZF9jb2w7IGNvbCsrKSB7CisgICAgICAgICAgICAgIGlmIChiTm9ybWFsKSB7CisgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYTEgPQorICAgICAgICAgICAgICAgICAgICAoc3JjX3NjYW5bLTJdICsgc3JjX3NjYW5bLTFdICsgc3JjX3NjYW5bMF0pIC8gMzsKKyAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGExLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgICBzcmNfYWxwaGExID0gc3JjX2FscGhhMSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgICAgICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgICAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShzcmNfYWxwaGExLCByLCBnLCBiKSk7CisgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYTEgPT0gMCkgeworICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9CisgICAgICAgICAgICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGExIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYTEgLyAyNTU7CisgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICAgICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGExICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBhbHBoYV9yYXRpbykpOworICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIGFscGhhX3JhdGlvKSk7CisgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgYWxwaGFfcmF0aW8pKTsKKyAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblstMl07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bLTFdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzFdLCBnLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzBdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChwRm9udC0+R2V0U3Vic3RGb250KCkpCi0gICAgICAgICAgICBrZXlnZW4uR2VuZXJhdGUoOSwgKGludCkocE1hdHJpeC0+YSAqIDEwMDAwKSwgKGludCkocE1hdHJpeC0+YiAqIDEwMDAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShwTWF0cml4LT5jICogMTAwMDApLCAoaW50KShwTWF0cml4LT5kICogMTAwMDApLCBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9XZWlnaHQsIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9JdGFsaWNBbmdsZSwgcEZvbnQtPklzVmVydGljYWwoKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGtleWdlbi5HZW5lcmF0ZSg2LCAoaW50KShwTWF0cml4LT5hICogMTAwMDApLCAoaW50KShwTWF0cml4LT5iICogMTAwMDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKHBNYXRyaXgtPmMgKiAxMDAwMCksIChpbnQpKHBNYXRyaXgtPmQgKiAxMDAwMCksIGRlc3Rfd2lkdGgsIGFudGlfYWxpYXMpOwotICAgICAgICBDRlhfQnl0ZVN0cmluZ0MgRmFjZUdseXBoc0tleShrZXlnZW4ubV9LZXksIGtleWdlbi5tX0tleUxlbik7Ci0gICAgICAgIHRleHRfZmxhZ3MgfD0gRlhURVhUX05PX05BVElWRVRFWFQ7Ci0gICAgICAgIHJldHVybiBMb29rVXBHbHlwaEJpdG1hcChwRm9udCwgcE1hdHJpeCwgRmFjZUdseXBoc0tleSwgZ2x5cGhfaW5kZXgsIGJGb250U3R5bGUsIGRlc3Rfd2lkdGgsIGFudGlfYWxpYXMpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBucm93czsgcm93KyspIHsKKyAgICAgICAgaW50IGRlc3Rfcm93ID0gcm93ICsgdG9wOworICAgICAgICBpZiAoZGVzdF9yb3cgPCAwIHx8IGRlc3Rfcm93ID49IGJpdG1hcC5HZXRIZWlnaHQoKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3QqIHNyY19zY2FuID0gc3JjX2J1ZiArIHJvdyAqIHNyY19waXRjaCArIChzdGFydF9jb2wgLSBsZWZ0KSAqIDM7CisgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgZGVzdF9yb3cgKiBkZXN0X3BpdGNoICsgc3RhcnRfY29sICogQnBwOworICAgICAgICBpZiAoYkJHUlN0cmlwZSkgeworICAgICAgICAgIGlmICh4X3N1YnBpeGVsID09IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbDsgY29sIDwgZW5kX2NvbDsgY29sKyspIHsKKyAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWzJdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzFdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzFdLCBnLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzBdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7CisgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmICh4X3N1YnBpeGVsID09IDEpIHsKKyAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblsxXTsKKyAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzBdOworICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgaWYgKHN0YXJ0X2NvbCA+IGxlZnQpIHsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bLTFdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbCArIDE7IGNvbCA8IGVuZF9jb2wgLSAxOyBjb2wrKykgeworICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bMV07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bMF07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMV0sIGcsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bLTFdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7CisgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKKyAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgIGlmIChzdGFydF9jb2wgPiBsZWZ0KSB7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWy0xXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblstMl07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMF0sIGIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7CisgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgZm9yIChpbnQgY29sID0gc3RhcnRfY29sICsgMTsgY29sIDwgZW5kX2NvbCAtIDE7IGNvbCsrKSB7CisgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMV0sIGcsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bLTJdOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzBdLCBiLCBzcmNfYWxwaGEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhKSk7CisgICAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7CisgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmICh4X3N1YnBpeGVsID09IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbDsgY29sIDwgZW5kX2NvbDsgY29sKyspIHsKKyAgICAgICAgICAgICAgaWYgKGJOb3JtYWwpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhMSA9IChzcmNfc2NhblswXSArIHNyY19zY2FuWzFdICsgc3JjX3NjYW5bMl0pIC8gMzsKKyAgICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGExLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgICBzcmNfYWxwaGExID0gc3JjX2FscGhhMSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgICAgaWYgKHNyY19hbHBoYTEgPT0gMCkgeworICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKKyAgICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhMSkpOworICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYTEpKTsKKyAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGExKSk7CisgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKKyAgICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblsxXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblsyXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblswXSwgYiwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSBpZiAoeF9zdWJwaXhlbCA9PSAxKSB7CisgICAgICAgICAgICBpZiAoYk5vcm1hbCkgeworICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhMSA9CisgICAgICAgICAgICAgICAgICBzdGFydF9jb2wgPiBsZWZ0CisgICAgICAgICAgICAgICAgICAgICAgPyAoc3JjX3NjYW5bMF0gKyBzcmNfc2NhblsxXSArIHNyY19zY2FuWy0xXSkgLyAzCisgICAgICAgICAgICAgICAgICAgICAgOiAoc3JjX3NjYW5bMF0gKyBzcmNfc2NhblsxXSkgLyAzOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGExLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhMSA9IHNyY19hbHBoYTEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhMSkpOworICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhMSkpOworICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhMSkpOworICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKHN0YXJ0X2NvbCA+IGxlZnQpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bLTFdOworICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bMF07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMV0sIGcsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bMV07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMF0sIGIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKKyAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbCArIDE7IGNvbCA8IGVuZF9jb2w7IGNvbCsrKSB7CisgICAgICAgICAgICAgIGlmIChiTm9ybWFsKSB7CisgICAgICAgICAgICAgICAgaW50IHNyY19hbHBoYTEgPSAoc3JjX3NjYW5bMF0gKyBzcmNfc2NhblsxXSArIHNyY19zY2FuWy0xXSkgLyAzOworICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYTEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICAgIHNyY19hbHBoYTEgPSBzcmNfYWxwaGExICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhMSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGExKSk7CisgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhMSkpOworICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYTEpKTsKKyAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWy0xXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblsxXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblswXSwgYiwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYk5vcm1hbCkgeworICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhMSA9CisgICAgICAgICAgICAgICAgICBzdGFydF9jb2wgPiBsZWZ0CisgICAgICAgICAgICAgICAgICAgICAgPyAoc3JjX3NjYW5bMF0gKyBzcmNfc2NhblstMl0gKyBzcmNfc2NhblstMV0pIC8gMworICAgICAgICAgICAgICAgICAgICAgIDogc3JjX3NjYW5bMF0gLyAzOworICAgICAgICAgICAgICBBREpVU1RfQUxQSEEoZGVzdF9zY2FuWzJdLCByLCBzcmNfYWxwaGExLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhMSA9IHNyY19hbHBoYTEgKiBhIC8gMjU1OworICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzJdKSwgciwgc3JjX2FscGhhMSkpOworICAgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhMSkpOworICAgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzBdKSwgYiwgc3JjX2FscGhhMSkpOworICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKHN0YXJ0X2NvbCA+IGxlZnQpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gc3JjX3NjYW5bLTJdOworICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07CisgICAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsxXSwgZywgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfYWxwaGEgKiBhIC8gMjU1OworICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsxXSksIGcsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblswXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblswXSwgYiwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgY29sID0gc3RhcnRfY29sICsgMTsgY29sIDwgZW5kX2NvbDsgY29sKyspIHsKKyAgICAgICAgICAgICAgaWYgKGJOb3JtYWwpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhMSA9ICgoaW50KShzcmNfc2NhblswXSkgKyAoaW50KShzcmNfc2NhblstMl0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShzcmNfc2NhblstMV0pKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOworICAgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMl0sIHIsIHNyY19hbHBoYTEsIG5hdGl2ZXRleHRfZmxhZ3MsIGEpOworICAgICAgICAgICAgICAgIHNyY19hbHBoYTEgPSBzcmNfYWxwaGExICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgICBpZiAoc3JjX2FscGhhMSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBGWF9HQU1NQV9JTlZFUlNFKAorICAgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMl0pLCByLCBzcmNfYWxwaGExKSk7CisgICAgICAgICAgICAgICAgZGVzdF9zY2FuWzFdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoRlhfR0FNTUEoZGVzdF9zY2FuWzFdKSwgZywgc3JjX2FscGhhMSkpOworICAgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblswXSksIGIsIHNyY19hbHBoYTEpKTsKKyAgICAgICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWy0yXTsKKyAgICAgICAgICAgICAgQURKVVNUX0FMUEhBKGRlc3Rfc2NhblsyXSwgciwgc3JjX2FscGhhLCBuYXRpdmV0ZXh0X2ZsYWdzLCBhKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX2FscGhhICogYSAvIDI1NTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuWzJdID0gRlhfR0FNTUFfSU5WRVJTRSgKKyAgICAgICAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKEZYX0dBTU1BKGRlc3Rfc2NhblsyXSksIHIsIHNyY19hbHBoYSkpOworICAgICAgICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblstMV07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMV0sIGcsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMV0pLCBnLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bMF07CisgICAgICAgICAgICAgIEFESlVTVF9BTFBIQShkZXN0X3NjYW5bMF0sIGIsIHNyY19hbHBoYSwgbmF0aXZldGV4dF9mbGFncywgYSk7CisgICAgICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19hbHBoYSAqIGEgLyAyNTU7CisgICAgICAgICAgICAgIGRlc3Rfc2NhblswXSA9IEZYX0dBTU1BX0lOVkVSU0UoCisgICAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShGWF9HQU1NQShkZXN0X3NjYW5bMF0pLCBiLCBzcmNfYWxwaGEpKTsKKyAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKKyAgICAgICAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KICAgICB9CisgIH0KKyAgaWYgKGJpdG1hcC5Jc0FscGhhTWFzaygpKSB7CisgICAgU2V0Qml0TWFzaygmYml0bWFwLCBibXBfcmVjdC5sZWZ0LCBibXBfcmVjdC50b3AsIGZpbGxfY29sb3IsIGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtKTsKKyAgfSBlbHNlIHsKKyAgICBTZXRESUJpdHMoJmJpdG1hcCwgYm1wX3JlY3QubGVmdCwgYm1wX3JlY3QudG9wKTsKKyAgfQorICBGWF9GcmVlKHBHbHlwaEFuZFBvcyk7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDRlhfUmVuZGVyRGV2aWNlOjpEcmF3VGV4dFBhdGgoaW50IG5DaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBUZXh0MlVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0Igc3Ryb2tlX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhKiBwQ2xpcHBpbmdQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5GbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgaWYgKCFwQ2FjaGUpIHsKKyAgICBwQ2FjaGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKTsKKyAgfQorICBDRlhfRmFjZUNhY2hlKiBwRmFjZUNhY2hlID0gcENhY2hlLT5HZXRDYWNoZWRGYWNlKHBGb250KTsKKyAgRlhfRk9OVENBQ0hFX0RFRklORShwQ2FjaGUsIHBGb250KTsKKyAgZm9yIChpbnQgaUNoYXIgPSAwOyBpQ2hhciA8IG5DaGFyczsgaUNoYXIrKykgeworICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TJiBjaGFycG9zID0gcENoYXJQb3NbaUNoYXJdOworICAgIENGWF9NYXRyaXggbWF0cml4OworICAgIGlmIChjaGFycG9zLm1fYkdseXBoQWRqdXN0KQorICAgICAgbWF0cml4LlNldChjaGFycG9zLm1fQWRqdXN0TWF0cml4WzBdLCBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzFdLAorICAgICAgICAgICAgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzJdLCBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzNdLCAwLCAwKTsKKyAgICBtYXRyaXguQ29uY2F0KGZvbnRfc2l6ZSwgMCwgMCwgZm9udF9zaXplLCBjaGFycG9zLm1fT3JpZ2luWCwKKyAgICAgICAgICAgICAgICAgIGNoYXJwb3MubV9PcmlnaW5ZKTsKKyAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoID0gcEZhY2VDYWNoZS0+TG9hZEdseXBoUGF0aCgKKyAgICAgICAgcEZvbnQsIGNoYXJwb3MubV9HbHlwaEluZGV4LCBjaGFycG9zLm1fRm9udENoYXJXaWR0aCk7CisgICAgaWYgKCFwUGF0aCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIG1hdHJpeC5Db25jYXQoKnBUZXh0MlVzZXIpOworICAgIENGWF9QYXRoRGF0YSBUcmFuc2Zvcm1lZFBhdGgoKnBQYXRoKTsKKyAgICBUcmFuc2Zvcm1lZFBhdGguVHJhbnNmb3JtKCZtYXRyaXgpOworICAgIEZYX0JPT0wgYkhhc0FscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhHRVRGTEFHX0FMUEhBX1NUUk9LRShhbHBoYV9mbGFnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChmaWxsX2NvbG9yIHx8IHN0cm9rZV9jb2xvcik7CisgICAgaWYgKGJIYXNBbHBoYSkgeworICAgICAgaW50IGZpbGxfbW9kZSA9IG5GbGFnOworICAgICAgaWYgKEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykpIHsKKyAgICAgICAgaWYgKEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpKSB7CisgICAgICAgICAgZmlsbF9tb2RlIHw9IEZYRklMTF9XSU5ESU5HOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZmlsbF9jb2xvcikgeworICAgICAgICAgIGZpbGxfbW9kZSB8PSBGWEZJTExfV0lORElORzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZmlsbF9tb2RlIHw9IEZYX0ZJTExfVEVYVF9NT0RFOworICAgICAgaWYgKCFEcmF3UGF0aCgmVHJhbnNmb3JtZWRQYXRoLCBwVXNlcjJEZXZpY2UsIHBHcmFwaFN0YXRlLCBmaWxsX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICBzdHJva2VfY29sb3IsIGZpbGxfbW9kZSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgYmxlbmRfdHlwZSkpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0KKyAgICBpZiAocENsaXBwaW5nUGF0aCkgeworICAgICAgcENsaXBwaW5nUGF0aC0+QXBwZW5kKCZUcmFuc2Zvcm1lZFBhdGgsIHBVc2VyMkRldmljZSk7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorQ0ZYX0ZvbnRDYWNoZTo6fkNGWF9Gb250Q2FjaGUoKSB7CisgIEZyZWVDYWNoZShUUlVFKTsKK30KKworQ0ZYX0ZhY2VDYWNoZSogQ0ZYX0ZvbnRDYWNoZTo6R2V0Q2FjaGVkRmFjZShDRlhfRm9udCogcEZvbnQpIHsKKyAgRlhGVF9GYWNlIGludGVybmFsX2ZhY2UgPSBwRm9udC0+R2V0RmFjZSgpOworICBjb25zdCBGWF9CT09MIGJFeHRlcm5hbCA9IGludGVybmFsX2ZhY2UgPT0gbnVsbHB0cjsKKyAgRlhGVF9GYWNlIGZhY2UgPQorICAgICAgYkV4dGVybmFsID8gKEZYRlRfRmFjZSlwRm9udC0+R2V0U3Vic3RGb250KCktPm1fRXh0SGFuZGxlIDogaW50ZXJuYWxfZmFjZTsKKyAgQ0ZYX0ZUQ2FjaGVNYXAmIG1hcCA9IGJFeHRlcm5hbCA/IG1fRXh0RmFjZU1hcCA6IG1fRlRGYWNlTWFwOworICBhdXRvIGl0ID0gbWFwLmZpbmQoZmFjZSk7CisgIGlmIChpdCAhPSBtYXAuZW5kKCkpIHsKKyAgICBDRlhfQ291bnRlZEZhY2VDYWNoZSogY291bnRlZF9mYWNlX2NhY2hlID0gaXQtPnNlY29uZDsKKyAgICBjb3VudGVkX2ZhY2VfY2FjaGUtPm1fbkNvdW50Kys7CisgICAgcmV0dXJuIGNvdW50ZWRfZmFjZV9jYWNoZS0+bV9PYmo7CisgIH0KKworICBDRlhfRmFjZUNhY2hlKiBmYWNlX2NhY2hlID0gbmV3IENGWF9GYWNlQ2FjaGUoYkV4dGVybmFsID8gbnVsbHB0ciA6IGZhY2UpOworICBDRlhfQ291bnRlZEZhY2VDYWNoZSogY291bnRlZF9mYWNlX2NhY2hlID0gbmV3IENGWF9Db3VudGVkRmFjZUNhY2hlOworICBjb3VudGVkX2ZhY2VfY2FjaGUtPm1fbkNvdW50ID0gMjsKKyAgY291bnRlZF9mYWNlX2NhY2hlLT5tX09iaiA9IGZhY2VfY2FjaGU7CisgIG1hcFtmYWNlXSA9IGNvdW50ZWRfZmFjZV9jYWNoZTsKKyAgcmV0dXJuIGZhY2VfY2FjaGU7Cit9CisKK3ZvaWQgQ0ZYX0ZvbnRDYWNoZTo6UmVsZWFzZUNhY2hlZEZhY2UoQ0ZYX0ZvbnQqIHBGb250KSB7CisgIEZYRlRfRmFjZSBpbnRlcm5hbF9mYWNlID0gcEZvbnQtPkdldEZhY2UoKTsKKyAgY29uc3QgRlhfQk9PTCBiRXh0ZXJuYWwgPSBpbnRlcm5hbF9mYWNlID09IG51bGxwdHI7CisgIEZYRlRfRmFjZSBmYWNlID0KKyAgICAgIGJFeHRlcm5hbCA/IChGWEZUX0ZhY2UpcEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX0V4dEhhbmRsZSA6IGludGVybmFsX2ZhY2U7CisgIENGWF9GVENhY2hlTWFwJiBtYXAgPSBiRXh0ZXJuYWwgPyBtX0V4dEZhY2VNYXAgOiBtX0ZURmFjZU1hcDsKKworICBhdXRvIGl0ID0gbWFwLmZpbmQoZmFjZSk7CisgIGlmIChpdCA9PSBtYXAuZW5kKCkpCisgICAgcmV0dXJuOworCisgIENGWF9Db3VudGVkRmFjZUNhY2hlKiBjb3VudGVkX2ZhY2VfY2FjaGUgPSBpdC0+c2Vjb25kOworICBpZiAoY291bnRlZF9mYWNlX2NhY2hlLT5tX25Db3VudCA+IDEpIHsKKyAgICBjb3VudGVkX2ZhY2VfY2FjaGUtPm1fbkNvdW50LS07CisgIH0KK30KKwordm9pZCBDRlhfRm9udENhY2hlOjpGcmVlQ2FjaGUoRlhfQk9PTCBiUmVsZWFzZSkgeworICBmb3IgKGF1dG8gaXQgPSBtX0ZURmFjZU1hcC5iZWdpbigpOyBpdCAhPSBtX0ZURmFjZU1hcC5lbmQoKTspIHsKKyAgICBhdXRvIGN1cnJfaXQgPSBpdCsrOworICAgIENGWF9Db3VudGVkRmFjZUNhY2hlKiBjYWNoZSA9IGN1cnJfaXQtPnNlY29uZDsKKyAgICBpZiAoYlJlbGVhc2UgfHwgY2FjaGUtPm1fbkNvdW50IDwgMikgeworICAgICAgZGVsZXRlIGNhY2hlLT5tX09iajsKKyAgICAgIGRlbGV0ZSBjYWNoZTsKKyAgICAgIG1fRlRGYWNlTWFwLmVyYXNlKGN1cnJfaXQpOworICAgIH0KKyAgfQorCisgIGZvciAoYXV0byBpdCA9IG1fRXh0RmFjZU1hcC5iZWdpbigpOyBpdCAhPSBtX0V4dEZhY2VNYXAuZW5kKCk7KSB7CisgICAgYXV0byBjdXJyX2l0ID0gaXQrKzsKKyAgICBDRlhfQ291bnRlZEZhY2VDYWNoZSogY2FjaGUgPSBjdXJyX2l0LT5zZWNvbmQ7CisgICAgaWYgKGJSZWxlYXNlIHx8IGNhY2hlLT5tX25Db3VudCA8IDIpIHsKKyAgICAgIGRlbGV0ZSBjYWNoZS0+bV9PYmo7CisgICAgICBkZWxldGUgY2FjaGU7CisgICAgICBtX0V4dEZhY2VNYXAuZXJhc2UoY3Vycl9pdCk7CisgICAgfQorICB9Cit9CisKK0NGWF9GYWNlQ2FjaGU6OkNGWF9GYWNlQ2FjaGUoRlhGVF9GYWNlIGZhY2UpIDogbV9GYWNlKGZhY2UpIHt9CisKK0NGWF9GYWNlQ2FjaGU6On5DRlhfRmFjZUNhY2hlKCkgeworICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBtX1NpemVNYXApIHsKKyAgICBkZWxldGUgcGFpci5zZWNvbmQ7CisgIH0KKyAgbV9TaXplTWFwLmNsZWFyKCk7CisgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG1fUGF0aE1hcCkgeworICAgIGRlbGV0ZSBwYWlyLnNlY29uZDsKKyAgfQorICBtX1BhdGhNYXAuY2xlYXIoKTsKK30KKyNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX0FQUExFXwordm9pZCBDRlhfRmFjZUNhY2hlOjpJbml0UGxhdGZvcm0oKSB7fQorI2VuZGlmCitDRlhfR2x5cGhCaXRtYXAqIENGWF9GYWNlQ2FjaGU6Okxvb2tVcEdseXBoQml0bWFwKAorICAgIENGWF9Gb250KiBwRm9udCwKKyAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgIENGWF9CeXRlU3RyaW5nQyYgRmFjZUdseXBoc0tleSwKKyAgICBGWF9EV09SRCBnbHlwaF9pbmRleCwKKyAgICBGWF9CT09MIGJGb250U3R5bGUsCisgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgaW50IGFudGlfYWxpYXMpIHsKKyAgQ0ZYX1NpemVHbHlwaENhY2hlKiBwU2l6ZUNhY2hlOworICBhdXRvIGl0ID0gbV9TaXplTWFwLmZpbmQoRmFjZUdseXBoc0tleSk7CisgIGlmIChpdCA9PSBtX1NpemVNYXAuZW5kKCkpIHsKKyAgICBwU2l6ZUNhY2hlID0gbmV3IENGWF9TaXplR2x5cGhDYWNoZTsKKyAgICBtX1NpemVNYXBbRmFjZUdseXBoc0tleV0gPSBwU2l6ZUNhY2hlOworICB9IGVsc2UgeworICAgIHBTaXplQ2FjaGUgPSBpdC0+c2Vjb25kOworICB9CisgIGF1dG8gaXQyID0gcFNpemVDYWNoZS0+bV9HbHlwaE1hcC5maW5kKGdseXBoX2luZGV4KTsKKyAgaWYgKGl0MiAhPSBwU2l6ZUNhY2hlLT5tX0dseXBoTWFwLmVuZCgpKQorICAgIHJldHVybiBpdDItPnNlY29uZDsKKworICBDRlhfR2x5cGhCaXRtYXAqIHBHbHlwaEJpdG1hcCA9IFJlbmRlckdseXBoKHBGb250LCBnbHlwaF9pbmRleCwgYkZvbnRTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWF0cml4LCBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzKTsKKyAgaWYgKCFwR2x5cGhCaXRtYXApCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgcFNpemVDYWNoZS0+bV9HbHlwaE1hcFtnbHlwaF9pbmRleF0gPSBwR2x5cGhCaXRtYXA7CisgIHJldHVybiBwR2x5cGhCaXRtYXA7Cit9Citjb25zdCBDRlhfR2x5cGhCaXRtYXAqIENGWF9GYWNlQ2FjaGU6OkxvYWRHbHlwaEJpdG1hcChDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZvbnRTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbnRpX2FsaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiB0ZXh0X2ZsYWdzKSB7CisgIGlmIChnbHlwaF9pbmRleCA9PSAoRlhfRFdPUkQpLTEpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBfQ0ZYX1VuaXF1ZUtleUdlbiBrZXlnZW47CisjaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyAgaWYgKHBGb250LT5HZXRTdWJzdEZvbnQoKSkKKyAgICBrZXlnZW4uR2VuZXJhdGUoOSwgKGludCkocE1hdHJpeC0+YSAqIDEwMDAwKSwgKGludCkocE1hdHJpeC0+YiAqIDEwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgKGludCkocE1hdHJpeC0+YyAqIDEwMDAwKSwgKGludCkocE1hdHJpeC0+ZCAqIDEwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgZGVzdF93aWR0aCwgYW50aV9hbGlhcywgcEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX1dlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgcEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX0l0YWxpY0FuZ2xlLCBwRm9udC0+SXNWZXJ0aWNhbCgpKTsKKyAgZWxzZQorICAgIGtleWdlbi5HZW5lcmF0ZSg2LCAoaW50KShwTWF0cml4LT5hICogMTAwMDApLCAoaW50KShwTWF0cml4LT5iICogMTAwMDApLAorICAgICAgICAgICAgICAgICAgICAoaW50KShwTWF0cml4LT5jICogMTAwMDApLCAoaW50KShwTWF0cml4LT5kICogMTAwMDApLAorICAgICAgICAgICAgICAgICAgICBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzKTsKKyNlbHNlCisgIGlmICh0ZXh0X2ZsYWdzICYgRlhURVhUX05PX05BVElWRVRFWFQpIHsKKyAgICBpZiAocEZvbnQtPkdldFN1YnN0Rm9udCgpKQorICAgICAga2V5Z2VuLkdlbmVyYXRlKDksIChpbnQpKHBNYXRyaXgtPmEgKiAxMDAwMCksIChpbnQpKHBNYXRyaXgtPmIgKiAxMDAwMCksCisgICAgICAgICAgICAgICAgICAgICAgKGludCkocE1hdHJpeC0+YyAqIDEwMDAwKSwgKGludCkocE1hdHJpeC0+ZCAqIDEwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzLCBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9JdGFsaWNBbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICBwRm9udC0+SXNWZXJ0aWNhbCgpKTsKKyAgICBlbHNlCisgICAgICBrZXlnZW4uR2VuZXJhdGUoNiwgKGludCkocE1hdHJpeC0+YSAqIDEwMDAwKSwgKGludCkocE1hdHJpeC0+YiAqIDEwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAoaW50KShwTWF0cml4LT5jICogMTAwMDApLCAoaW50KShwTWF0cml4LT5kICogMTAwMDApLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfd2lkdGgsIGFudGlfYWxpYXMpOworICB9IGVsc2UgeworICAgIGlmIChwRm9udC0+R2V0U3Vic3RGb250KCkpCisgICAgICBrZXlnZW4uR2VuZXJhdGUoMTAsIChpbnQpKHBNYXRyaXgtPmEgKiAxMDAwMCksIChpbnQpKHBNYXRyaXgtPmIgKiAxMDAwMCksCisgICAgICAgICAgICAgICAgICAgICAgKGludCkocE1hdHJpeC0+YyAqIDEwMDAwKSwgKGludCkocE1hdHJpeC0+ZCAqIDEwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzLCBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9JdGFsaWNBbmdsZSwgcEZvbnQtPklzVmVydGljYWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAzKTsKKyAgICBlbHNlCisgICAgICBrZXlnZW4uR2VuZXJhdGUoNywgKGludCkocE1hdHJpeC0+YSAqIDEwMDAwKSwgKGludCkocE1hdHJpeC0+YiAqIDEwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAoaW50KShwTWF0cml4LT5jICogMTAwMDApLCAoaW50KShwTWF0cml4LT5kICogMTAwMDApLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfd2lkdGgsIGFudGlfYWxpYXMsIDMpOworICB9CisjZW5kaWYKKyAgQ0ZYX0J5dGVTdHJpbmdDIEZhY2VHbHlwaHNLZXkoa2V5Z2VuLm1fS2V5LCBrZXlnZW4ubV9LZXlMZW4pOworI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fQVBQTEVfCisgIHJldHVybiBMb29rVXBHbHlwaEJpdG1hcChwRm9udCwgcE1hdHJpeCwgRmFjZUdseXBoc0tleSwgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiRm9udFN0eWxlLCBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzKTsKKyNlbHNlCisgIGlmICh0ZXh0X2ZsYWdzICYgRlhURVhUX05PX05BVElWRVRFWFQpIHsKKyAgICByZXR1cm4gTG9va1VwR2x5cGhCaXRtYXAocEZvbnQsIHBNYXRyaXgsIEZhY2VHbHlwaHNLZXksIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRm9udFN0eWxlLCBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzKTsKKyAgfQorICBDRlhfR2x5cGhCaXRtYXAqIHBHbHlwaEJpdG1hcDsKKyAgYXV0byBpdCA9IG1fU2l6ZU1hcC5maW5kKEZhY2VHbHlwaHNLZXkpOworICBpZiAoaXQgIT0gbV9TaXplTWFwLmVuZCgpKSB7CisgICAgQ0ZYX1NpemVHbHlwaENhY2hlKiBwU2l6ZUNhY2hlID0gaXQtPnNlY29uZDsKKyAgICBhdXRvIGl0MiA9IHBTaXplQ2FjaGUtPm1fR2x5cGhNYXAuZmluZChnbHlwaF9pbmRleCk7CisgICAgaWYgKGl0MiAhPSBwU2l6ZUNhY2hlLT5tX0dseXBoTWFwLmVuZCgpKQorICAgICAgcmV0dXJuIGl0Mi0+c2Vjb25kOworCisgICAgcEdseXBoQml0bWFwID0gUmVuZGVyR2x5cGhfTmF0aXZldGV4dChwRm9udCwgZ2x5cGhfaW5kZXgsIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzKTsKKyAgICBpZiAocEdseXBoQml0bWFwKSB7CisgICAgICBwU2l6ZUNhY2hlLT5tX0dseXBoTWFwW2dseXBoX2luZGV4XSA9IHBHbHlwaEJpdG1hcDsKKyAgICAgIHJldHVybiBwR2x5cGhCaXRtYXA7CisgICAgfQorICB9IGVsc2UgeworICAgIHBHbHlwaEJpdG1hcCA9IFJlbmRlckdseXBoX05hdGl2ZXRleHQocEZvbnQsIGdseXBoX2luZGV4LCBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF93aWR0aCwgYW50aV9hbGlhcyk7CisgICAgaWYgKHBHbHlwaEJpdG1hcCkgeworICAgICAgQ0ZYX1NpemVHbHlwaENhY2hlKiBwU2l6ZUNhY2hlID0gbmV3IENGWF9TaXplR2x5cGhDYWNoZTsKKyAgICAgIG1fU2l6ZU1hcFtGYWNlR2x5cGhzS2V5XSA9IHBTaXplQ2FjaGU7CisgICAgICBwU2l6ZUNhY2hlLT5tX0dseXBoTWFwW2dseXBoX2luZGV4XSA9IHBHbHlwaEJpdG1hcDsKKyAgICAgIHJldHVybiBwR2x5cGhCaXRtYXA7CisgICAgfQorICB9CisgIGlmIChwRm9udC0+R2V0U3Vic3RGb250KCkpCisgICAga2V5Z2VuLkdlbmVyYXRlKDksIChpbnQpKHBNYXRyaXgtPmEgKiAxMDAwMCksIChpbnQpKHBNYXRyaXgtPmIgKiAxMDAwMCksCisgICAgICAgICAgICAgICAgICAgIChpbnQpKHBNYXRyaXgtPmMgKiAxMDAwMCksIChpbnQpKHBNYXRyaXgtPmQgKiAxMDAwMCksCisgICAgICAgICAgICAgICAgICAgIGRlc3Rfd2lkdGgsIGFudGlfYWxpYXMsIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9XZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9JdGFsaWNBbmdsZSwgcEZvbnQtPklzVmVydGljYWwoKSk7CisgIGVsc2UKKyAgICBrZXlnZW4uR2VuZXJhdGUoNiwgKGludCkocE1hdHJpeC0+YSAqIDEwMDAwKSwgKGludCkocE1hdHJpeC0+YiAqIDEwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgKGludCkocE1hdHJpeC0+YyAqIDEwMDAwKSwgKGludCkocE1hdHJpeC0+ZCAqIDEwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgZGVzdF93aWR0aCwgYW50aV9hbGlhcyk7CisgIENGWF9CeXRlU3RyaW5nQyBGYWNlR2x5cGhzS2V5MihrZXlnZW4ubV9LZXksIGtleWdlbi5tX0tleUxlbik7CisgIHRleHRfZmxhZ3MgfD0gRlhURVhUX05PX05BVElWRVRFWFQ7CisgIHJldHVybiBMb29rVXBHbHlwaEJpdG1hcChwRm9udCwgcE1hdHJpeCwgRmFjZUdseXBoc0tleTIsIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZvbnRTdHlsZSwgZGVzdF93aWR0aCwgYW50aV9hbGlhcyk7CiAjZW5kaWYKIH0KLUNGWF9TaXplR2x5cGhDYWNoZTo6fkNGWF9TaXplR2x5cGhDYWNoZSgpCi17Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9HbHlwaE1hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0gICAgRlhfTFBWT0lEIEtleTsKLSAgICBDRlhfR2x5cGhCaXRtYXAqIHBHbHlwaEJpdG1hcCA9IE5VTEw7Ci0gICAgd2hpbGUocG9zKSB7Ci0gICAgICAgIG1fR2x5cGhNYXAuR2V0TmV4dEFzc29jKHBvcywgS2V5LCAodm9pZComKXBHbHlwaEJpdG1hcCk7Ci0gICAgICAgIGRlbGV0ZSBwR2x5cGhCaXRtYXA7Ci0gICAgfQotICAgIG1fR2x5cGhNYXAuUmVtb3ZlQWxsKCk7CitDRlhfU2l6ZUdseXBoQ2FjaGU6On5DRlhfU2l6ZUdseXBoQ2FjaGUoKSB7CisgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG1fR2x5cGhNYXApIHsKKyAgICBkZWxldGUgcGFpci5zZWNvbmQ7CisgIH0KKyAgbV9HbHlwaE1hcC5jbGVhcigpOwogfQotI2RlZmluZSBDT05UUkFTVF9SQU1QX1NURVAJMQotdm9pZCBDRlhfRm9udDo6QWRqdXN0TU1QYXJhbXMoaW50IGdseXBoX2luZGV4LCBpbnQgZGVzdF93aWR0aCwgaW50IHdlaWdodCkKLXsKLSAgICBGWEZUX01NX1ZhciBwTWFzdGVycyA9IE5VTEw7Ci0gICAgRlhGVF9HZXRfTU1fVmFyKG1fRmFjZSwgJnBNYXN0ZXJzKTsKLSAgICBpZiAocE1hc3RlcnMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47CisjZGVmaW5lIENPTlRSQVNUX1JBTVBfU1RFUCAxCit2b2lkIENGWF9Gb250OjpBZGp1c3RNTVBhcmFtcyhpbnQgZ2x5cGhfaW5kZXgsIGludCBkZXN0X3dpZHRoLCBpbnQgd2VpZ2h0KSB7CisgIEZYRlRfTU1fVmFyIHBNYXN0ZXJzID0gTlVMTDsKKyAgRlhGVF9HZXRfTU1fVmFyKG1fRmFjZSwgJnBNYXN0ZXJzKTsKKyAgaWYgKCFwTWFzdGVycykgeworICAgIHJldHVybjsKKyAgfQorICBsb25nIGNvb3Jkc1syXTsKKyAgaWYgKHdlaWdodCA9PSAwKSB7CisgICAgY29vcmRzWzBdID0gRlhGVF9HZXRfTU1fQXhpc19EZWYoRlhGVF9HZXRfTU1fQXhpcyhwTWFzdGVycywgMCkpIC8gNjU1MzY7CisgIH0gZWxzZSB7CisgICAgY29vcmRzWzBdID0gd2VpZ2h0OworICB9CisgIGlmIChkZXN0X3dpZHRoID09IDApIHsKKyAgICBjb29yZHNbMV0gPSBGWEZUX0dldF9NTV9BeGlzX0RlZihGWEZUX0dldF9NTV9BeGlzKHBNYXN0ZXJzLCAxKSkgLyA2NTUzNjsKKyAgfSBlbHNlIHsKKyAgICBpbnQgbWluX3BhcmFtID0gRlhGVF9HZXRfTU1fQXhpc19NaW4oRlhGVF9HZXRfTU1fQXhpcyhwTWFzdGVycywgMSkpIC8gNjU1MzY7CisgICAgaW50IG1heF9wYXJhbSA9IEZYRlRfR2V0X01NX0F4aXNfTWF4KEZYRlRfR2V0X01NX0F4aXMocE1hc3RlcnMsIDEpKSAvIDY1NTM2OworICAgIGNvb3Jkc1sxXSA9IG1pbl9wYXJhbTsKKyAgICAodm9pZClGWEZUX1NldF9NTV9EZXNpZ25fQ29vcmRpbmF0ZXMobV9GYWNlLCAyLCBjb29yZHMpOworICAgICh2b2lkKUZYRlRfTG9hZF9HbHlwaCgKKyAgICAgICAgbV9GYWNlLCBnbHlwaF9pbmRleCwKKyAgICAgICAgRlhGVF9MT0FEX05PX1NDQUxFIHwgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCk7CisgICAgaW50IG1pbl93aWR0aCA9IEZYRlRfR2V0X0dseXBoX0hvcmlBZHZhbmNlKG1fRmFjZSkgKiAxMDAwIC8KKyAgICAgICAgICAgICAgICAgICAgRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSk7CisgICAgY29vcmRzWzFdID0gbWF4X3BhcmFtOworICAgICh2b2lkKUZYRlRfU2V0X01NX0Rlc2lnbl9Db29yZGluYXRlcyhtX0ZhY2UsIDIsIGNvb3Jkcyk7CisgICAgKHZvaWQpRlhGVF9Mb2FkX0dseXBoKAorICAgICAgICBtX0ZhY2UsIGdseXBoX2luZGV4LAorICAgICAgICBGWEZUX0xPQURfTk9fU0NBTEUgfCBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKTsKKyAgICBpbnQgbWF4X3dpZHRoID0gRlhGVF9HZXRfR2x5cGhfSG9yaUFkdmFuY2UobV9GYWNlKSAqIDEwMDAgLworICAgICAgICAgICAgICAgICAgICBGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKTsKKyAgICBpZiAobWF4X3dpZHRoID09IG1pbl93aWR0aCkgeworICAgICAgRlhGVF9GcmVlKG1fRmFjZSwgcE1hc3RlcnMpOworICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBsb25nIGNvb3Jkc1syXTsKLSAgICBpZiAod2VpZ2h0ID09IDApIHsKLSAgICAgICAgY29vcmRzWzBdID0gRlhGVF9HZXRfTU1fQXhpc19EZWYoRlhGVF9HZXRfTU1fQXhpcyhwTWFzdGVycywgMCkpIC8gNjU1MzY7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY29vcmRzWzBdID0gd2VpZ2h0OwotICAgIH0KLSAgICBpZiAoZGVzdF93aWR0aCA9PSAwKSB7Ci0gICAgICAgIGNvb3Jkc1sxXSA9IEZYRlRfR2V0X01NX0F4aXNfRGVmKEZYRlRfR2V0X01NX0F4aXMocE1hc3RlcnMsIDEpKSAvIDY1NTM2OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBtaW5fcGFyYW0gPSBGWEZUX0dldF9NTV9BeGlzX01pbihGWEZUX0dldF9NTV9BeGlzKHBNYXN0ZXJzLCAxKSkgLyA2NTUzNjsKLSAgICAgICAgaW50IG1heF9wYXJhbSA9IEZYRlRfR2V0X01NX0F4aXNfTWF4KEZYRlRfR2V0X01NX0F4aXMocE1hc3RlcnMsIDEpKSAvIDY1NTM2OwotICAgICAgICBjb29yZHNbMV0gPSBtaW5fcGFyYW07Ci0gICAgICAgIGludCBlcnJvciA9IEZYRlRfU2V0X01NX0Rlc2lnbl9Db29yZGluYXRlcyhtX0ZhY2UsIDIsIGNvb3Jkcyk7Ci0gICAgICAgIGVycm9yID0gRlhGVF9Mb2FkX0dseXBoKG1fRmFjZSwgZ2x5cGhfaW5kZXgsIEZYRlRfTE9BRF9OT19TQ0FMRSB8IEZYRlRfTE9BRF9JR05PUkVfR0xPQkFMX0FEVkFOQ0VfV0lEVEgpOwotICAgICAgICBpbnQgbWluX3dpZHRoID0gRlhGVF9HZXRfR2x5cGhfSG9yaUFkdmFuY2UobV9GYWNlKSAqIDEwMDAgLyBGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKTsKLSAgICAgICAgY29vcmRzWzFdID0gbWF4X3BhcmFtOwotICAgICAgICBlcnJvciA9IEZYRlRfU2V0X01NX0Rlc2lnbl9Db29yZGluYXRlcyhtX0ZhY2UsIDIsIGNvb3Jkcyk7Ci0gICAgICAgIGVycm9yID0gRlhGVF9Mb2FkX0dseXBoKG1fRmFjZSwgZ2x5cGhfaW5kZXgsIEZYRlRfTE9BRF9OT19TQ0FMRSB8IEZYRlRfTE9BRF9JR05PUkVfR0xPQkFMX0FEVkFOQ0VfV0lEVEgpOwotICAgICAgICBpbnQgbWF4X3dpZHRoID0gRlhGVF9HZXRfR2x5cGhfSG9yaUFkdmFuY2UobV9GYWNlKSAqIDEwMDAgLyBGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKTsKLSAgICAgICAgaWYgKG1heF93aWR0aCA9PSBtaW5fd2lkdGgpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpbnQgcGFyYW0gPSBtaW5fcGFyYW0gKyAobWF4X3BhcmFtIC0gbWluX3BhcmFtKSAqIChkZXN0X3dpZHRoIC0gbWluX3dpZHRoKSAvIChtYXhfd2lkdGggLSBtaW5fd2lkdGgpOwotICAgICAgICBjb29yZHNbMV0gPSBwYXJhbTsKLSAgICB9Ci0gICAgRlhGVF9GcmVlKG1fRmFjZSwgcE1hc3RlcnMpOwotICAgIEZYRlRfU2V0X01NX0Rlc2lnbl9Db29yZGluYXRlcyhtX0ZhY2UsIDIsIGNvb3Jkcyk7CisgICAgaW50IHBhcmFtID0gbWluX3BhcmFtICsKKyAgICAgICAgICAgICAgICAobWF4X3BhcmFtIC0gbWluX3BhcmFtKSAqIChkZXN0X3dpZHRoIC0gbWluX3dpZHRoKSAvCisgICAgICAgICAgICAgICAgICAgIChtYXhfd2lkdGggLSBtaW5fd2lkdGgpOworICAgIGNvb3Jkc1sxXSA9IHBhcmFtOworICB9CisgIEZYRlRfRnJlZShtX0ZhY2UsIHBNYXN0ZXJzKTsKKyAgRlhGVF9TZXRfTU1fRGVzaWduX0Nvb3JkaW5hdGVzKG1fRmFjZSwgMiwgY29vcmRzKTsKIH0KIHN0YXRpYyBjb25zdCBzaXplX3QgQU5HTEVTS0VXX0FSUkFZX1NJWkUgPSAzMDsKIHN0YXRpYyBjb25zdCBjaGFyIGdfQW5nbGVTa2V3W0FOR0xFU0tFV19BUlJBWV9TSVpFXSA9IHsKLSAgICAwLCAyLCAzLCA1LCA3LCA5LCAxMSwgMTIsIDE0LCAxNiwKLSAgICAxOCwgMTksIDIxLCAyMywgMjUsIDI3LCAyOSwgMzEsIDMyLCAzNCwKLSAgICAzNiwgMzgsIDQwLCA0MiwgNDUsIDQ3LCA0OSwgNTEsIDUzLCA1NSwKKyAgICAwLCAgMiwgIDMsICA1LCAgNywgIDksICAxMSwgMTIsIDE0LCAxNiwgMTgsIDE5LCAyMSwgMjMsIDI1LAorICAgIDI3LCAyOSwgMzEsIDMyLCAzNCwgMzYsIDM4LCA0MCwgNDIsIDQ1LCA0NywgNDksIDUxLCA1MywgNTUsCiB9Owogc3RhdGljIGNvbnN0IHNpemVfdCBXRUlHSFRQT1dfQVJSQVlfU0laRSA9IDEwMDsKLXN0YXRpYyBjb25zdCBGWF9CWVRFIGdfV2VpZ2h0UG93W1dFSUdIVFBPV19BUlJBWV9TSVpFXSA9IHsKLSAgICAwLCAzLCA2LCA3LCA4LCA5LCAxMSwgMTIsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLAotICAgIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM1LCAzNiwgMzYsCi0gICAgMzcsIDM3LCAzNywgMzgsIDM4LCAzOCwgMzksIDM5LCAzOSwgNDAsIDQwLCA0MCwgNDEsIDQxLCA0MSwgNDIsIDQyLCA0MiwKLSAgICA0MiwgNDMsIDQzLCA0MywgNDQsIDQ0LCA0NCwgNDQsIDQ1LCA0NSwgNDUsIDQ1LCA0NiwgNDYsIDQ2LCA0NiwgNDcsIDQ3LAotICAgIDQ3LCA0NywgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OSwgNDksIDQ5LCA0OSwgNTAsIDUwLCA1MCwgNTAsIDUwLCA1MSwgNTEsCi0gICAgNTEsIDUxLCA1MSwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MywgNTMsIDUzLCA1MywgNTMsCitzdGF0aWMgY29uc3QgdWludDhfdCBnX1dlaWdodFBvd1tXRUlHSFRQT1dfQVJSQVlfU0laRV0gPSB7CisgICAgMCwgIDMsICA2LCAgNywgIDgsICA5LCAgMTEsIDEyLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLAorICAgIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNSwgMzYsIDM2LCAzNywKKyAgICAzNywgMzcsIDM4LCAzOCwgMzgsIDM5LCAzOSwgMzksIDQwLCA0MCwgNDAsIDQxLCA0MSwgNDEsIDQyLCA0MiwgNDIsCisgICAgNDIsIDQzLCA0MywgNDMsIDQ0LCA0NCwgNDQsIDQ0LCA0NSwgNDUsIDQ1LCA0NSwgNDYsIDQ2LCA0NiwgNDYsIDQ3LAorICAgIDQ3LCA0NywgNDcsIDQ4LCA0OCwgNDgsIDQ4LCA0OCwgNDksIDQ5LCA0OSwgNDksIDUwLCA1MCwgNTAsIDUwLCA1MCwKKyAgICA1MSwgNTEsIDUxLCA1MSwgNTEsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTMsIDUzLCA1MywgNTMsIDUzLAogfTsKLXN0YXRpYyBjb25zdCBGWF9CWVRFIGdfV2VpZ2h0UG93XzExW1dFSUdIVFBPV19BUlJBWV9TSVpFXSA9IHsKLSAgICAwLCA0LCA3LCA4LCA5LCAxMCwgMTIsIDEzLCAxNSwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwKLSAgICAyMywgMjQsIDI1LCAyNiwgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM5LCAzOSwgNDAsIDQwLAotICAgIDQxLCA0MSwgNDEsIDQyLCA0MiwgNDIsIDQzLCA0MywgNDMsIDQ0LCA0NCwgNDQsIDQ1LCA0NSwgNDUsIDQ2LCA0NiwgNDYsCi0gICAgNDYsIDQzLCA0NywgNDcsIDQ4LCA0OCwgNDgsIDQ4LCA0NSwgNTAsIDUwLCA1MCwgNDYsIDUxLCA1MSwgNTEsIDUyLCA1MiwKLSAgICA1MiwgNTIsIDUzLCA1MywgNTMsIDUzLCA1MywgNTQsIDU0LCA1NCwgNTQsIDU1LCA1NSwgNTUsIDU1LCA1NSwgNTYsIDU2LAotICAgIDU2LCA1NiwgNTYsIDU3LCA1NywgNTcsIDU3LCA1NywgNTgsIDU4LCA1OCwgNTgsIDU4LAorc3RhdGljIGNvbnN0IHVpbnQ4X3QgZ19XZWlnaHRQb3dfMTFbV0VJR0hUUE9XX0FSUkFZX1NJWkVdID0geworICAgIDAsICA0LCAgNywgIDgsICA5LCAgMTAsIDEyLCAxMywgMTUsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwKKyAgICAyNSwgMjYsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOSwgMzksIDQwLCA0MCwgNDEsCisgICAgNDEsIDQxLCA0MiwgNDIsIDQyLCA0MywgNDMsIDQzLCA0NCwgNDQsIDQ0LCA0NSwgNDUsIDQ1LCA0NiwgNDYsIDQ2LAorICAgIDQ2LCA0MywgNDcsIDQ3LCA0OCwgNDgsIDQ4LCA0OCwgNDUsIDUwLCA1MCwgNTAsIDQ2LCA1MSwgNTEsIDUxLCA1MiwKKyAgICA1MiwgNTIsIDUyLCA1MywgNTMsIDUzLCA1MywgNTMsIDU0LCA1NCwgNTQsIDU0LCA1NSwgNTUsIDU1LCA1NSwgNTUsCisgICAgNTYsIDU2LCA1NiwgNTYsIDU2LCA1NywgNTcsIDU3LCA1NywgNTcsIDU4LCA1OCwgNTgsIDU4LCA1OCwKIH07Ci1zdGF0aWMgY29uc3QgRlhfQllURSBnX1dlaWdodFBvd19TSElGVEpJU1tXRUlHSFRQT1dfQVJSQVlfU0laRV0gPSB7Ci0gICAgMCwgMCwgMSwgMiwgMywgNCwgNSwgNywgOCwgMTAsIDExLCAxMywgMTQsIDE2LCAxNywgMTksIDIxLCAyMiwgMjQsIDI2LCAyOCwKLSAgICAzMCwgMzIsIDMzLCAzNSwgMzcsIDM5LCA0MSwgNDMsIDQ1LCA0OCwgNDgsIDQ4LCA0OCwgNDksIDQ5LCA0OSwgNTAsIDUwLCA1MCwgNTAsCi0gICAgNTEsIDUxLCA1MSwgNTEsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTMsIDUzLCA1MywgNTMsIDUzLCA1NCwgNTQsIDU0LCA1NCwgNTQsIDU1LCA1NSwKLSAgICA1NSwgNTUsIDU1LCA1NiwgNTYsIDU2LCA1NiwgNTYgLCA1NiwgNTcsIDU3LCA1NyAsIDU3ICwgNTcsIDU3LCA1NywgNTgsIDU4LCA1OCwgNTgsIDU4LAotICAgIDU4LCA1OCwgNTksIDU5LCA1OSwgNTksIDU5LCA1OSwgNTksIDYwLCA2MCwgNjAsIDYwLCA2MCwgNjAsIDYwLCA2MCwKK3N0YXRpYyBjb25zdCB1aW50OF90IGdfV2VpZ2h0UG93X1NISUZUSklTW1dFSUdIVFBPV19BUlJBWV9TSVpFXSA9IHsKKyAgICAwLCAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNywgIDgsICAxMCwgMTEsIDEzLCAxNCwgMTYsIDE3LCAxOSwgMjEsCisgICAgMjIsIDI0LCAyNiwgMjgsIDMwLCAzMiwgMzMsIDM1LCAzNywgMzksIDQxLCA0MywgNDUsIDQ4LCA0OCwgNDgsIDQ4LAorICAgIDQ5LCA0OSwgNDksIDUwLCA1MCwgNTAsIDUwLCA1MSwgNTEsIDUxLCA1MSwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MywKKyAgICA1MywgNTMsIDUzLCA1MywgNTQsIDU0LCA1NCwgNTQsIDU0LCA1NSwgNTUsIDU1LCA1NSwgNTUsIDU2LCA1NiwgNTYsCisgICAgNTYsIDU2LCA1NiwgNTcsIDU3LCA1NywgNTcsIDU3LCA1NywgNTcsIDU4LCA1OCwgNTgsIDU4LCA1OCwgNTgsIDU4LAorICAgIDU5LCA1OSwgNTksIDU5LCA1OSwgNTksIDU5LCA2MCwgNjAsIDYwLCA2MCwgNjAsIDYwLCA2MCwgNjAsCiB9Owotc3RhdGljIHZvaWQgX0dhbW1hQWRqdXN0KEZYX0xQQllURSBwRGF0YSwgaW50IG5XaWQsIGludCBuSGVpLCBpbnQgc3JjX3BpdGNoLCBGWF9MUENCWVRFIGdhbW1hVGFibGUpCi17Ci0gICAgaW50IGNvdW50ID0gbkhlaSAqIHNyY19waXRjaDsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBwRGF0YVtpXSA9IGdhbW1hVGFibGVbcERhdGFbaV1dOwotICAgIH0KK3N0YXRpYyB2b2lkIF9HYW1tYUFkanVzdCh1aW50OF90KiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbldpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkhlaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGdhbW1hVGFibGUpIHsKKyAgaW50IGNvdW50ID0gbkhlaSAqIHNyY19waXRjaDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgcERhdGFbaV0gPSBnYW1tYVRhYmxlW3BEYXRhW2ldXTsKKyAgfQogfQotc3RhdGljIHZvaWQgX0NvbnRyYXN0QWRqdXN0KEZYX0xQQllURSBwRGF0YUluLCBGWF9MUEJZVEUgcERhdGFPdXQsIGludCBuV2lkLCBpbnQgbkhlaSwgaW50IG5TcmNSb3dCeXRlcywgaW50IG5Ec3RSb3dCeXRlcykKLXsKLSAgICBpbnQgY29sLCByb3csIHRlbXA7Ci0gICAgaW50IG1heCA9IDAsIG1pbiA9IDI1NTsKLSAgICBGWF9GTE9BVCByYXRlOwotICAgIGZvciAocm93ID0gMDsgcm93IDwgbkhlaTsgcm93ICsrKSB7Ci0gICAgICAgIEZYX0xQQllURSBwUm93ID0gcERhdGFJbiArIHJvdyAqIG5TcmNSb3dCeXRlczsKLSAgICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBuV2lkOyBjb2wrKykgewotICAgICAgICAgICAgdGVtcCA9ICpwUm93ICsrOwotICAgICAgICAgICAgaWYgKHRlbXAgPiBtYXgpIHsKLSAgICAgICAgICAgICAgICBtYXggPSB0ZW1wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRlbXAgPCBtaW4pIHsKLSAgICAgICAgICAgICAgICBtaW4gPSB0ZW1wOwotICAgICAgICAgICAgfQotICAgICAgICB9CitzdGF0aWMgdm9pZCBfQ29udHJhc3RBZGp1c3QodWludDhfdCogcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbldpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkhlaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblNyY1Jvd0J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuRHN0Um93Qnl0ZXMpIHsKKyAgaW50IGNvbCwgcm93LCB0ZW1wOworICBpbnQgbWF4ID0gMCwgbWluID0gMjU1OworICBGWF9GTE9BVCByYXRlOworICBmb3IgKHJvdyA9IDA7IHJvdyA8IG5IZWk7IHJvdysrKSB7CisgICAgdWludDhfdCogcFJvdyA9IHBEYXRhSW4gKyByb3cgKiBuU3JjUm93Qnl0ZXM7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBuV2lkOyBjb2wrKykgeworICAgICAgdGVtcCA9ICpwUm93Kys7CisgICAgICBpZiAodGVtcCA+IG1heCkgeworICAgICAgICBtYXggPSB0ZW1wOworICAgICAgfQorICAgICAgaWYgKHRlbXAgPCBtaW4pIHsKKyAgICAgICAgbWluID0gdGVtcDsKKyAgICAgIH0KICAgICB9Ci0gICAgdGVtcCA9IG1heCAtIG1pbjsKLSAgICBpZiAoMCA9PSB0ZW1wIHx8IDI1NSA9PSB0ZW1wKSB7Ci0gICAgICAgIGludCByb3dieXRlcyA9IEZYU1lTX2FicyhuU3JjUm93Qnl0ZXMpID4gbkRzdFJvd0J5dGVzID8gbkRzdFJvd0J5dGVzIDogRlhTWVNfYWJzKG5TcmNSb3dCeXRlcyk7Ci0gICAgICAgIGZvciAocm93ID0gMDsgcm93IDwgbkhlaTsgcm93ICsrKSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkzMihwRGF0YU91dCArIHJvdyAqIG5Ec3RSb3dCeXRlcywgcERhdGFJbiArIHJvdyAqIG5TcmNSb3dCeXRlcywgcm93Ynl0ZXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKKyAgfQorICB0ZW1wID0gbWF4IC0gbWluOworICBpZiAoMCA9PSB0ZW1wIHx8IDI1NSA9PSB0ZW1wKSB7CisgICAgaW50IHJvd2J5dGVzID0gRlhTWVNfYWJzKG5TcmNSb3dCeXRlcykgPiBuRHN0Um93Qnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgPyBuRHN0Um93Qnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgOiBGWFNZU19hYnMoblNyY1Jvd0J5dGVzKTsKKyAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IG5IZWk7IHJvdysrKSB7CisgICAgICBGWFNZU19tZW1jcHkocERhdGFPdXQgKyByb3cgKiBuRHN0Um93Qnl0ZXMsIHBEYXRhSW4gKyByb3cgKiBuU3JjUm93Qnl0ZXMsCisgICAgICAgICAgICAgICAgICAgcm93Ynl0ZXMpOwogICAgIH0KLSAgICByYXRlID0gMjU1LmYgLyB0ZW1wOwotICAgIGZvciAocm93ID0gMDsgcm93IDwgbkhlaTsgcm93ICsrKSB7Ci0gICAgICAgIEZYX0xQQllURSBwU3JjUm93ID0gcERhdGFJbiArIHJvdyAqIG5TcmNSb3dCeXRlczsKLSAgICAgICAgRlhfTFBCWVRFIHBEc3RSb3cgPSBwRGF0YU91dCArIHJvdyAqIG5Ec3RSb3dCeXRlczsKLSAgICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBuV2lkOyBjb2wgKyspIHsKLSAgICAgICAgICAgIHRlbXAgPSAoaW50KSgoKihwU3JjUm93KyspIC0gbWluKSAqIHJhdGUgKyAwLjUpOwotICAgICAgICAgICAgaWYgKHRlbXAgPiAyNTUpCXsKLSAgICAgICAgICAgICAgICB0ZW1wID0gMjU1OwotICAgICAgICAgICAgfSBlbHNlIGlmICh0ZW1wIDwgMCkgewotICAgICAgICAgICAgICAgIHRlbXAgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKnBEc3RSb3cgKysgPSAoRlhfQllURSl0ZW1wOwotICAgICAgICB9CisgICAgcmV0dXJuOworICB9CisgIHJhdGUgPSAyNTUuZiAvIHRlbXA7CisgIGZvciAocm93ID0gMDsgcm93IDwgbkhlaTsgcm93KyspIHsKKyAgICB1aW50OF90KiBwU3JjUm93ID0gcERhdGFJbiArIHJvdyAqIG5TcmNSb3dCeXRlczsKKyAgICB1aW50OF90KiBwRHN0Um93ID0gcERhdGFPdXQgKyByb3cgKiBuRHN0Um93Qnl0ZXM7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBuV2lkOyBjb2wrKykgeworICAgICAgdGVtcCA9IChpbnQpKCgqKHBTcmNSb3crKykgLSBtaW4pICogcmF0ZSArIDAuNSk7CisgICAgICBpZiAodGVtcCA+IDI1NSkgeworICAgICAgICB0ZW1wID0gMjU1OworICAgICAgfSBlbHNlIGlmICh0ZW1wIDwgMCkgeworICAgICAgICB0ZW1wID0gMDsKKyAgICAgIH0KKyAgICAgICpwRHN0Um93KysgPSAodWludDhfdCl0ZW1wOwogICAgIH0KKyAgfQogfQotQ0ZYX0dseXBoQml0bWFwKiBDRlhfRmFjZUNhY2hlOjpSZW5kZXJHbHlwaChDRlhfRm9udCogcEZvbnQsIEZYX0RXT1JEIGdseXBoX2luZGV4LCBGWF9CT09MIGJGb250U3R5bGUsCi0gICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIGludCBkZXN0X3dpZHRoLCBpbnQgYW50aV9hbGlhcykKLXsKLSAgICBpZiAobV9GYWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEZYRlRfTWF0cml4ICBmdF9tYXRyaXg7Ci0gICAgZnRfbWF0cml4Lnh4ID0gKHNpZ25lZCBsb25nKShwTWF0cml4LT5HZXRBKCkgLyA2NCAqIDY1NTM2KTsKLSAgICBmdF9tYXRyaXgueHkgPSAoc2lnbmVkIGxvbmcpKHBNYXRyaXgtPkdldEMoKSAvIDY0ICogNjU1MzYpOwotICAgIGZ0X21hdHJpeC55eCA9IChzaWduZWQgbG9uZykocE1hdHJpeC0+R2V0QigpIC8gNjQgKiA2NTUzNik7Ci0gICAgZnRfbWF0cml4Lnl5ID0gKHNpZ25lZCBsb25nKShwTWF0cml4LT5HZXREKCkgLyA2NCAqIDY1NTM2KTsKLSAgICBGWF9CT09MIGJVc2VDSktTdWJGb250ID0gRkFMU0U7Ci0gICAgY29uc3QgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCA9IHBGb250LT5HZXRTdWJzdEZvbnQoKTsKLSAgICBpZiAocFN1YnN0Rm9udCkgewotICAgICAgICBiVXNlQ0pLU3ViRm9udCA9IHBTdWJzdEZvbnQtPm1fYlN1YnN0T2ZDSksgJiYgYkZvbnRTdHlsZTsKLSAgICAgICAgaW50IHNrZXcgPSAwOwotICAgICAgICBpZiAoYlVzZUNKS1N1YkZvbnQpIHsKLSAgICAgICAgICAgIHNrZXcgPSBwU3Vic3RGb250LT5tX2JJdGxpY0NKSyA/IC0xNSA6IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBza2V3ID0gcFN1YnN0Rm9udC0+bV9JdGFsaWNBbmdsZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2tldykgewotICAgICAgICAgICAgc2tldyA9IHNrZXcgPD0gLUFOR0xFU0tFV19BUlJBWV9TSVpFID8gLTU4IDogLWdfQW5nbGVTa2V3Wy1za2V3XTsKLSAgICAgICAgICAgIGlmIChwRm9udC0+SXNWZXJ0aWNhbCgpKSB7Ci0gICAgICAgICAgICAgICAgZnRfbWF0cml4Lnl4ICs9IGZ0X21hdHJpeC55eSAqIHNrZXcgLyAxMDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZ0X21hdHJpeC54eSArPSAtZnRfbWF0cml4Lnh4ICogc2tldyAvIDEwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX01NKSB7Ci0gICAgICAgICAgICBwRm9udC0+QWRqdXN0TU1QYXJhbXMoZ2x5cGhfaW5kZXgsIGRlc3Rfd2lkdGgsIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9XZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotICAgIEZYRlRfU2V0X1RyYW5zZm9ybShtX0ZhY2UsICZmdF9tYXRyaXgsIDApOwotICAgIGludCBsb2FkX2ZsYWdzID0gKG1fRmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TRk5UKSA/IEZYRlRfTE9BRF9OT19CSVRNQVAgOiAoRlhGVF9MT0FEX05PX0JJVE1BUCB8IEZUX0xPQURfTk9fSElOVElORyk7Ci0gICAgaW50IGVycm9yID0gRlhGVF9Mb2FkX0dseXBoKG1fRmFjZSwgZ2x5cGhfaW5kZXgsIGxvYWRfZmxhZ3MpOwotICAgIGlmIChlcnJvcikgewotICAgICAgICAvL2lmIGFuIGVycm9yIGlzIHJldHVybmVkLCB0cnkgdG8gcmVsb2FkIGdseXBocyB3aXRob3V0IGhpbnRpbmcuCi0gICAgICAgIGlmIChsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19ISU5USU5HIHx8IGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGxvYWRfZmxhZ3MgfD0gRlRfTE9BRF9OT19ISU5USU5HOwotICAgICAgICBlcnJvciA9IEZYRlRfTG9hZF9HbHlwaChtX0ZhY2UsIGdseXBoX2luZGV4LCBsb2FkX2ZsYWdzKTsKLQotICAgICAgICBpZiAoZXJyb3IpIHsgCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpbnQgd2VpZ2h0ID0gMDsKK0NGWF9HbHlwaEJpdG1hcCogQ0ZYX0ZhY2VDYWNoZTo6UmVuZGVyR2x5cGgoQ0ZYX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRm9udFN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFudGlfYWxpYXMpIHsKKyAgaWYgKCFtX0ZhY2UpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBGWEZUX01hdHJpeCBmdF9tYXRyaXg7CisgIGZ0X21hdHJpeC54eCA9IChzaWduZWQgbG9uZykocE1hdHJpeC0+R2V0QSgpIC8gNjQgKiA2NTUzNik7CisgIGZ0X21hdHJpeC54eSA9IChzaWduZWQgbG9uZykocE1hdHJpeC0+R2V0QygpIC8gNjQgKiA2NTUzNik7CisgIGZ0X21hdHJpeC55eCA9IChzaWduZWQgbG9uZykocE1hdHJpeC0+R2V0QigpIC8gNjQgKiA2NTUzNik7CisgIGZ0X21hdHJpeC55eSA9IChzaWduZWQgbG9uZykocE1hdHJpeC0+R2V0RCgpIC8gNjQgKiA2NTUzNik7CisgIEZYX0JPT0wgYlVzZUNKS1N1YkZvbnQgPSBGQUxTRTsKKyAgY29uc3QgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCA9IHBGb250LT5HZXRTdWJzdEZvbnQoKTsKKyAgaWYgKHBTdWJzdEZvbnQpIHsKKyAgICBiVXNlQ0pLU3ViRm9udCA9IHBTdWJzdEZvbnQtPm1fYlN1YnN0T2ZDSksgJiYgYkZvbnRTdHlsZTsKKyAgICBpbnQgc2tldyA9IDA7CiAgICAgaWYgKGJVc2VDSktTdWJGb250KSB7Ci0gICAgICAgIHdlaWdodCA9IHBTdWJzdEZvbnQtPm1fV2VpZ2h0Q0pLOworICAgICAgc2tldyA9IHBTdWJzdEZvbnQtPm1fYkl0bGljQ0pLID8gLTE1IDogMDsKICAgICB9IGVsc2UgewotICAgICAgICB3ZWlnaHQgPSBwU3Vic3RGb250ID8gcFN1YnN0Rm9udC0+bV9XZWlnaHQgOiAwOworICAgICAgc2tldyA9IHBTdWJzdEZvbnQtPm1fSXRhbGljQW5nbGU7CiAgICAgfQotICAgIGlmIChwU3Vic3RGb250ICYmICEocFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX01NKSAmJiB3ZWlnaHQgPiA0MDApIHsKLSAgICAgICAgaW50IGluZGV4ID0gKHdlaWdodCAtIDQwMCkgLyAxMDsKLSAgICAgICAgaWYgKGluZGV4ID49IFdFSUdIVFBPV19BUlJBWV9TSVpFKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpbnQgbGV2ZWwgPSAwOwotICAgICAgICBpZiAocFN1YnN0Rm9udC0+bV9DaGFyc2V0ID09IEZYRk9OVF9TSElGVEpJU19DSEFSU0VUKSB7Ci0gICAgICAgICAgICBsZXZlbCA9IGdfV2VpZ2h0UG93X1NISUZUSklTW2luZGV4XSAqIDIgKiAoRlhTWVNfYWJzKChpbnQpKGZ0X21hdHJpeC54eCkpICsgRlhTWVNfYWJzKChpbnQpKGZ0X21hdHJpeC54eSkpKSAvIDM2NjU1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGV2ZWwgPSBnX1dlaWdodFBvd18xMVtpbmRleF0gKiAoRlhTWVNfYWJzKChpbnQpKGZ0X21hdHJpeC54eCkpICsgRlhTWVNfYWJzKChpbnQpKGZ0X21hdHJpeC54eSkpKSAvIDM2NjU1OwotICAgICAgICB9Ci0gICAgICAgIEZYRlRfT3V0bGluZV9FbWJvbGRlbihGWEZUX0dldF9HbHlwaF9PdXRsaW5lKG1fRmFjZSksIGxldmVsKTsKKyAgICBpZiAoc2tldykgeworICAgICAgc2tldyA9IHNrZXcgPD0gLUFOR0xFU0tFV19BUlJBWV9TSVpFID8gLTU4IDogLWdfQW5nbGVTa2V3Wy1za2V3XTsKKyAgICAgIGlmIChwRm9udC0+SXNWZXJ0aWNhbCgpKSB7CisgICAgICAgIGZ0X21hdHJpeC55eCArPSBmdF9tYXRyaXgueXkgKiBza2V3IC8gMTAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZnRfbWF0cml4Lnh5ICs9IC1mdF9tYXRyaXgueHggKiBza2V3IC8gMTAwOworICAgICAgfQogICAgIH0KLSAgICBGWEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyKENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+bV9GVExpYnJhcnksIEZUX0xDRF9GSUxURVJfREVGQVVMVCk7Ci0gICAgZXJyb3IgPSBGWEZUX1JlbmRlcl9HbHlwaChtX0ZhY2UsIGFudGlfYWxpYXMpOworICAgIGlmIChwU3Vic3RGb250LT5tX1N1YnN0RmxhZ3MgJiBGWEZPTlRfU1VCU1RfTU0pIHsKKyAgICAgIHBGb250LT5BZGp1c3RNTVBhcmFtcyhnbHlwaF9pbmRleCwgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0KTsKKyAgICB9CisgIH0KKyAgU2NvcGVkRm9udFRyYW5zZm9ybSBzY29wZWRfdHJhbnNmb3JtKG1fRmFjZSwgJmZ0X21hdHJpeCk7CisgIGludCBsb2FkX2ZsYWdzID0gKG1fRmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TRk5UKQorICAgICAgICAgICAgICAgICAgICAgICA/IEZYRlRfTE9BRF9OT19CSVRNQVAKKyAgICAgICAgICAgICAgICAgICAgICAgOiAoRlhGVF9MT0FEX05PX0JJVE1BUCB8IEZUX0xPQURfTk9fSElOVElORyk7CisgIGludCBlcnJvciA9IEZYRlRfTG9hZF9HbHlwaChtX0ZhY2UsIGdseXBoX2luZGV4LCBsb2FkX2ZsYWdzKTsKKyAgaWYgKGVycm9yKSB7CisgICAgLy8gaWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQsIHRyeSB0byByZWxvYWQgZ2x5cGhzIHdpdGhvdXQgaGludGluZy4KKyAgICBpZiAobG9hZF9mbGFncyAmIEZUX0xPQURfTk9fSElOVElORyB8fCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbG9hZF9mbGFncyB8PSBGVF9MT0FEX05PX0hJTlRJTkc7CisgICAgZXJyb3IgPSBGWEZUX0xvYWRfR2x5cGgobV9GYWNlLCBnbHlwaF9pbmRleCwgbG9hZF9mbGFncyk7CisKICAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgaW50IGJtd2lkdGggPSBGWEZUX0dldF9CaXRtYXBfV2lkdGgoRlhGVF9HZXRfR2x5cGhfQml0bWFwKG1fRmFjZSkpOwotICAgIGludCBibWhlaWdodCA9IEZYRlRfR2V0X0JpdG1hcF9Sb3dzKEZYRlRfR2V0X0dseXBoX0JpdG1hcChtX0ZhY2UpKTsKLSAgICBpZiAoYm13aWR0aCA+IDIwNDggfHwgYm1oZWlnaHQgPiAyMDQ4KSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICB9CisgIGludCB3ZWlnaHQgPSAwOworICBpZiAoYlVzZUNKS1N1YkZvbnQpIHsKKyAgICB3ZWlnaHQgPSBwU3Vic3RGb250LT5tX1dlaWdodENKSzsKKyAgfSBlbHNlIHsKKyAgICB3ZWlnaHQgPSBwU3Vic3RGb250ID8gcFN1YnN0Rm9udC0+bV9XZWlnaHQgOiAwOworICB9CisgIGlmIChwU3Vic3RGb250ICYmICEocFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX01NKSAmJgorICAgICAgd2VpZ2h0ID4gNDAwKSB7CisgICAgaW50IGluZGV4ID0gKHdlaWdodCAtIDQwMCkgLyAxMDsKKyAgICBpZiAoaW5kZXggPj0gV0VJR0hUUE9XX0FSUkFZX1NJWkUpIHsKKyAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpbnQgZGliX3dpZHRoID0gYm13aWR0aDsKLSAgICBDRlhfR2x5cGhCaXRtYXAqIHBHbHlwaEJpdG1hcCA9IG5ldyBDRlhfR2x5cGhCaXRtYXA7Ci0gICAgcEdseXBoQml0bWFwLT5tX0JpdG1hcC5DcmVhdGUoZGliX3dpZHRoLCBibWhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnRpX2FsaWFzID09IEZYRlRfUkVOREVSX01PREVfTU9OTyA/IEZYRElCXzFicHBNYXNrIDogRlhESUJfOGJwcE1hc2spOwotICAgIHBHbHlwaEJpdG1hcC0+bV9MZWZ0ID0gRlhGVF9HZXRfR2x5cGhfQml0bWFwTGVmdChtX0ZhY2UpOwotICAgIHBHbHlwaEJpdG1hcC0+bV9Ub3AgPSBGWEZUX0dldF9HbHlwaF9CaXRtYXBUb3AobV9GYWNlKTsKLSAgICBpbnQgZGVzdF9waXRjaCA9IHBHbHlwaEJpdG1hcC0+bV9CaXRtYXAuR2V0UGl0Y2goKTsKLSAgICBpbnQgc3JjX3BpdGNoID0gRlhGVF9HZXRfQml0bWFwX1BpdGNoKEZYRlRfR2V0X0dseXBoX0JpdG1hcChtX0ZhY2UpKTsKLSAgICBGWF9CWVRFKiBwRGVzdEJ1ZiA9IHBHbHlwaEJpdG1hcC0+bV9CaXRtYXAuR2V0QnVmZmVyKCk7Ci0gICAgRlhfQllURSogcFNyY0J1ZiA9IChGWF9CWVRFKilGWEZUX0dldF9CaXRtYXBfQnVmZmVyKEZYRlRfR2V0X0dseXBoX0JpdG1hcChtX0ZhY2UpKTsKLSAgICBpZiAoYW50aV9hbGlhcyAhPSBGWEZUX1JFTkRFUl9NT0RFX01PTk8gJiYgRlhGVF9HZXRfQml0bWFwX1BpeGVsTW9kZShGWEZUX0dldF9HbHlwaF9CaXRtYXAobV9GYWNlKSkgPT0gRlhGVF9QSVhFTF9NT0RFX01PTk8pIHsKLSAgICAgICAgaW50IGJ5dGVzID0gYW50aV9hbGlhcyA9PSBGWEZUX1JFTkRFUl9NT0RFX0xDRCA/IDMgOiAxOwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgYm1oZWlnaHQ7IGkrKykKLSAgICAgICAgICAgIGZvcihpbnQgbiA9IDA7IG4gPCBibXdpZHRoOyBuKyspIHsKLSAgICAgICAgICAgICAgICBGWF9CWVRFIGRhdGEgPSAocFNyY0J1ZltpICogc3JjX3BpdGNoICsgbiAvIDhdICYgKDB4ODAgPj4gKG4gJSA4KSkpID8gMjU1IDogMDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8IGJ5dGVzOyBiICsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBEZXN0QnVmW2kgKiBkZXN0X3BpdGNoICsgbiAqIGJ5dGVzICsgYl0gPSBkYXRhOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICBpbnQgbGV2ZWwgPSAwOworICAgIGlmIChwU3Vic3RGb250LT5tX0NoYXJzZXQgPT0gRlhGT05UX1NISUZUSklTX0NIQVJTRVQpIHsKKyAgICAgIGxldmVsID0KKyAgICAgICAgICBnX1dlaWdodFBvd19TSElGVEpJU1tpbmRleF0gKiAyICoKKyAgICAgICAgICAoRlhTWVNfYWJzKChpbnQpKGZ0X21hdHJpeC54eCkpICsgRlhTWVNfYWJzKChpbnQpKGZ0X21hdHJpeC54eSkpKSAvCisgICAgICAgICAgMzY2NTU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgRlhTWVNfbWVtc2V0MzIocERlc3RCdWYsIDAsIGRlc3RfcGl0Y2ggKiBibWhlaWdodCk7Ci0gICAgICAgIGlmIChhbnRpX2FsaWFzID09IEZYRlRfUkVOREVSX01PREVfTU9OTyAmJiBGWEZUX0dldF9CaXRtYXBfUGl4ZWxNb2RlKEZYRlRfR2V0X0dseXBoX0JpdG1hcChtX0ZhY2UpKSA9PSBGWEZUX1BJWEVMX01PREVfTU9OTykgewotICAgICAgICAgICAgaW50IHJvd2J5dGVzID0gRlhTWVNfYWJzKHNyY19waXRjaCkgPiBkZXN0X3BpdGNoID8gZGVzdF9waXRjaCA6IEZYU1lTX2FicyhzcmNfcGl0Y2gpOwotICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgYm1oZWlnaHQ7IHJvdyArKykgewotICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweTMyKHBEZXN0QnVmICsgcm93ICogZGVzdF9waXRjaCwgcFNyY0J1ZiArIHJvdyAqIHNyY19waXRjaCwgcm93Ynl0ZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgX0NvbnRyYXN0QWRqdXN0KHBTcmNCdWYsIHBEZXN0QnVmLCBibXdpZHRoLCBibWhlaWdodCwgc3JjX3BpdGNoLCBkZXN0X3BpdGNoKTsKLSAgICAgICAgICAgIF9HYW1tYUFkanVzdChwRGVzdEJ1ZiwgYm13aWR0aCwgYm1oZWlnaHQsIGRlc3RfcGl0Y2gsIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldFRleHRHYW1tYVRhYmxlKCkpOworICAgICAgbGV2ZWwgPSBnX1dlaWdodFBvd18xMVtpbmRleF0gKiAoRlhTWVNfYWJzKChpbnQpKGZ0X21hdHJpeC54eCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX2FicygoaW50KShmdF9tYXRyaXgueHkpKSkgLworICAgICAgICAgICAgICAzNjY1NTsKKyAgICB9CisgICAgRlhGVF9PdXRsaW5lX0VtYm9sZGVuKEZYRlRfR2V0X0dseXBoX091dGxpbmUobV9GYWNlKSwgbGV2ZWwpOworICB9CisgIEZYRlRfTGlicmFyeV9TZXRMY2RGaWx0ZXIoQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5HZXRGVExpYnJhcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9MQ0RfRklMVEVSX0RFRkFVTFQpOworICBlcnJvciA9IEZYRlRfUmVuZGVyX0dseXBoKG1fRmFjZSwgYW50aV9hbGlhcyk7CisgIGlmIChlcnJvcikgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGludCBibXdpZHRoID0gRlhGVF9HZXRfQml0bWFwX1dpZHRoKEZYRlRfR2V0X0dseXBoX0JpdG1hcChtX0ZhY2UpKTsKKyAgaW50IGJtaGVpZ2h0ID0gRlhGVF9HZXRfQml0bWFwX1Jvd3MoRlhGVF9HZXRfR2x5cGhfQml0bWFwKG1fRmFjZSkpOworICBpZiAoYm13aWR0aCA+IDIwNDggfHwgYm1oZWlnaHQgPiAyMDQ4KSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaW50IGRpYl93aWR0aCA9IGJtd2lkdGg7CisgIENGWF9HbHlwaEJpdG1hcCogcEdseXBoQml0bWFwID0gbmV3IENGWF9HbHlwaEJpdG1hcDsKKyAgcEdseXBoQml0bWFwLT5tX0JpdG1hcC5DcmVhdGUoCisgICAgICBkaWJfd2lkdGgsIGJtaGVpZ2h0LAorICAgICAgYW50aV9hbGlhcyA9PSBGWEZUX1JFTkRFUl9NT0RFX01PTk8gPyBGWERJQl8xYnBwTWFzayA6IEZYRElCXzhicHBNYXNrKTsKKyAgcEdseXBoQml0bWFwLT5tX0xlZnQgPSBGWEZUX0dldF9HbHlwaF9CaXRtYXBMZWZ0KG1fRmFjZSk7CisgIHBHbHlwaEJpdG1hcC0+bV9Ub3AgPSBGWEZUX0dldF9HbHlwaF9CaXRtYXBUb3AobV9GYWNlKTsKKyAgaW50IGRlc3RfcGl0Y2ggPSBwR2x5cGhCaXRtYXAtPm1fQml0bWFwLkdldFBpdGNoKCk7CisgIGludCBzcmNfcGl0Y2ggPSBGWEZUX0dldF9CaXRtYXBfUGl0Y2goRlhGVF9HZXRfR2x5cGhfQml0bWFwKG1fRmFjZSkpOworICB1aW50OF90KiBwRGVzdEJ1ZiA9IHBHbHlwaEJpdG1hcC0+bV9CaXRtYXAuR2V0QnVmZmVyKCk7CisgIHVpbnQ4X3QqIHBTcmNCdWYgPQorICAgICAgKHVpbnQ4X3QqKUZYRlRfR2V0X0JpdG1hcF9CdWZmZXIoRlhGVF9HZXRfR2x5cGhfQml0bWFwKG1fRmFjZSkpOworICBpZiAoYW50aV9hbGlhcyAhPSBGWEZUX1JFTkRFUl9NT0RFX01PTk8gJiYKKyAgICAgIEZYRlRfR2V0X0JpdG1hcF9QaXhlbE1vZGUoRlhGVF9HZXRfR2x5cGhfQml0bWFwKG1fRmFjZSkpID09CisgICAgICAgICAgRlhGVF9QSVhFTF9NT0RFX01PTk8pIHsKKyAgICBpbnQgYnl0ZXMgPSBhbnRpX2FsaWFzID09IEZYRlRfUkVOREVSX01PREVfTENEID8gMyA6IDE7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBibWhlaWdodDsgaSsrKQorICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBibXdpZHRoOyBuKyspIHsKKyAgICAgICAgdWludDhfdCBkYXRhID0KKyAgICAgICAgICAgIChwU3JjQnVmW2kgKiBzcmNfcGl0Y2ggKyBuIC8gOF0gJiAoMHg4MCA+PiAobiAlIDgpKSkgPyAyNTUgOiAwOworICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8IGJ5dGVzOyBiKyspIHsKKyAgICAgICAgICBwRGVzdEJ1ZltpICogZGVzdF9waXRjaCArIG4gKiBieXRlcyArIGJdID0gZGF0YTsKICAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcEdseXBoQml0bWFwOwotfQotRlhfQk9PTCBfT3V0cHV0R2x5cGgodm9pZCogZGliLCBpbnQgeCwgaW50IHksIENGWF9Gb250KiBwRm9udCwKLSAgICAgICAgICAgICAgICAgICAgIGludCBnbHlwaF9pbmRleCwgRlhfQVJHQiBhcmdiKQotewotICAgIENGWF9ESUJpdG1hcCogcERpYiA9IChDRlhfRElCaXRtYXAqKWRpYjsKLSAgICBGWEZUX0ZhY2UgZmFjZSA9IHBGb250LT5HZXRGYWNlKCk7Ci0gICAgaW50IGVycm9yID0gRlhGVF9Mb2FkX0dseXBoKGZhY2UsIGdseXBoX2luZGV4LCBGWEZUX0xPQURfTk9fQklUTUFQKTsKLSAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBlcnJvciA9IEZYRlRfUmVuZGVyX0dseXBoKGZhY2UsIEZYRlRfUkVOREVSX01PREVfTk9STUFMKTsKLSAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpbnQgYm13aWR0aCA9IEZYRlRfR2V0X0JpdG1hcF9XaWR0aChGWEZUX0dldF9HbHlwaF9CaXRtYXAoZmFjZSkpOwotICAgIGludCBibWhlaWdodCA9IEZYRlRfR2V0X0JpdG1hcF9Sb3dzKEZYRlRfR2V0X0dseXBoX0JpdG1hcChmYWNlKSk7Ci0gICAgaW50IGxlZnQgPSBGWEZUX0dldF9HbHlwaF9CaXRtYXBMZWZ0KGZhY2UpOwotICAgIGludCB0b3AgPSBGWEZUX0dldF9HbHlwaF9CaXRtYXBUb3AoZmFjZSk7Ci0gICAgRlhfTFBDQllURSBzcmNfYnVmID0gKEZYX0xQQ0JZVEUpRlhGVF9HZXRfQml0bWFwX0J1ZmZlcihGWEZUX0dldF9HbHlwaF9CaXRtYXAoZmFjZSkpOwotICAgIGludCBzcmNfcGl0Y2ggPSBGWEZUX0dldF9CaXRtYXBfUGl0Y2goRlhGVF9HZXRfR2x5cGhfQml0bWFwKGZhY2UpKTsKLSAgICBDRlhfRElCaXRtYXAgbWFzazsKLSAgICBtYXNrLkNyZWF0ZShibXdpZHRoLCBibWhlaWdodCwgRlhESUJfOGJwcE1hc2spOwotICAgIEZYX0xQQllURSBkZXN0X2J1ZiA9IG1hc2suR2V0QnVmZmVyKCk7Ci0gICAgaW50IGRlc3RfcGl0Y2ggPSBtYXNrLkdldFBpdGNoKCk7Ci0gICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgYm1oZWlnaHQ7IHJvdyArKykgewotICAgICAgICBGWF9MUENCWVRFIHNyY19zY2FuID0gc3JjX2J1ZiArIHJvdyAqIHNyY19waXRjaDsKLSAgICAgICAgRlhfTFBCWVRFIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICAgICAgRlhTWVNfbWVtY3B5MzIoZGVzdF9zY2FuLCBzcmNfc2NhbiwgZGVzdF9waXRjaCk7Ci0gICAgfQotICAgIHBEaWItPkNvbXBvc2l0ZU1hc2soeCArIGxlZnQsIHkgLSB0b3AsIGJtd2lkdGgsIGJtaGVpZ2h0LCAmbWFzaywgYXJnYiwgMCwgMCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIE91dHB1dFRleHQodm9pZCogZGliLCBpbnQgeCwgaW50IHksIENGWF9Gb250KiBwRm9udCwgZG91YmxlIGZvbnRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4KiBwVGV4dF9tYXRyaXgsIHVuc2lnbmVkIHNob3J0IGNvbnN0KiB0ZXh0LCB1bnNpZ25lZCBsb25nIGFyZ2IpCi17Ci0gICAgaWYgKCFwRm9udCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYRlRfRmFjZSBmYWNlID0gcEZvbnQtPkdldEZhY2UoKTsKLSAgICBGWEZUX1NlbGVjdF9DaGFybWFwKHBGb250LT5tX0ZhY2UsIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSk7Ci0gICAgaWYgKHBUZXh0X21hdHJpeCkgewotICAgICAgICBGWEZUX01hdHJpeCAgZnRfbWF0cml4OwotICAgICAgICBmdF9tYXRyaXgueHggPSAoc2lnbmVkIGxvbmcpKHBUZXh0X21hdHJpeC0+YSAvIDY0ICogNjU1MzYpOwotICAgICAgICBmdF9tYXRyaXgueHkgPSAoc2lnbmVkIGxvbmcpKHBUZXh0X21hdHJpeC0+YyAvIDY0ICogNjU1MzYpOwotICAgICAgICBmdF9tYXRyaXgueXggPSAoc2lnbmVkIGxvbmcpKHBUZXh0X21hdHJpeC0+YiAvIDY0ICogNjU1MzYpOwotICAgICAgICBmdF9tYXRyaXgueXkgPSAoc2lnbmVkIGxvbmcpKHBUZXh0X21hdHJpeC0+ZCAvIDY0ICogNjU1MzYpOwotICAgICAgICBGWEZUX1NldF9UcmFuc2Zvcm0oZmFjZSwgJmZ0X21hdHJpeCwgMCk7Ci0gICAgfQotICAgIEZYX0ZMT0FUIHhfcG9zID0gMDsKLSAgICBmb3IgKDsgKnRleHQgIT0gMDsgdGV4dCArKykgewotICAgICAgICBGWF9XQ0hBUiB1bmljb2RlID0gKnRleHQ7Ci0gICAgICAgIGludCBnbHlwaF9pbmRleCA9IEZYRlRfR2V0X0NoYXJfSW5kZXgocEZvbnQtPm1fRmFjZSwgdW5pY29kZSk7Ci0gICAgICAgIGlmIChnbHlwaF9pbmRleCA8PSAwKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgZXJyID0gRlhGVF9Mb2FkX0dseXBoKHBGb250LT5tX0ZhY2UsIGdseXBoX2luZGV4LCBGWEZUX0xPQURfTk9fU0NBTEUgfCBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKTsKLSAgICAgICAgaWYgKGVycikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHcgPSBGWEZUX0dldF9HbHlwaF9Ib3JpQWR2YW5jZShwRm9udC0+bV9GYWNlKTsKLSAgICAgICAgaW50IGVtID0gRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKHBGb250LT5tX0ZhY2UpOwotICAgICAgICBGWF9GTE9BVCB4MSwgeTE7Ci0gICAgICAgIHBUZXh0X21hdHJpeC0+VHJhbnNmb3JtKHhfcG9zLCAwLCB4MSwgeTEpOwotICAgICAgICBfT3V0cHV0R2x5cGgoZGliLCAoaW50KXgxICsgeCwgKGludCkgLSB5MSArIHksIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsIGFyZ2IpOwotICAgICAgICB4X3BvcyArPSAoRlhfRkxPQVQpdyAvIGVtOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgT3V0cHV0R2x5cGgodm9pZCogZGliLCBpbnQgeCwgaW50IHksIENGWF9Gb250KiBwRm9udCwgZG91YmxlIGZvbnRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgdW5zaWduZWQgbG9uZyBnbHlwaF9pbmRleCwgdW5zaWduZWQgbG9uZyBhcmdiKQotewotICAgIEZYRlRfTWF0cml4ICBmdF9tYXRyaXg7Ci0gICAgaWYgKHBNYXRyaXgpIHsKLSAgICAgICAgZnRfbWF0cml4Lnh4ID0gKHNpZ25lZCBsb25nKShwTWF0cml4LT5hICogZm9udF9zaXplIC8gNjQgKiA2NTUzNik7Ci0gICAgICAgIGZ0X21hdHJpeC54eSA9IChzaWduZWQgbG9uZykocE1hdHJpeC0+YyAqIGZvbnRfc2l6ZSAvIDY0ICogNjU1MzYpOwotICAgICAgICBmdF9tYXRyaXgueXggPSAoc2lnbmVkIGxvbmcpKHBNYXRyaXgtPmIgKiBmb250X3NpemUgLyA2NCAqIDY1NTM2KTsKLSAgICAgICAgZnRfbWF0cml4Lnl5ID0gKHNpZ25lZCBsb25nKShwTWF0cml4LT5kICogZm9udF9zaXplIC8gNjQgKiA2NTUzNik7CisgICAgICB9CisgIH0gZWxzZSB7CisgICAgRlhTWVNfbWVtc2V0KHBEZXN0QnVmLCAwLCBkZXN0X3BpdGNoICogYm1oZWlnaHQpOworICAgIGlmIChhbnRpX2FsaWFzID09IEZYRlRfUkVOREVSX01PREVfTU9OTyAmJgorICAgICAgICBGWEZUX0dldF9CaXRtYXBfUGl4ZWxNb2RlKEZYRlRfR2V0X0dseXBoX0JpdG1hcChtX0ZhY2UpKSA9PQorICAgICAgICAgICAgRlhGVF9QSVhFTF9NT0RFX01PTk8pIHsKKyAgICAgIGludCByb3dieXRlcyA9CisgICAgICAgICAgRlhTWVNfYWJzKHNyY19waXRjaCkgPiBkZXN0X3BpdGNoID8gZGVzdF9waXRjaCA6IEZYU1lTX2FicyhzcmNfcGl0Y2gpOworICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgYm1oZWlnaHQ7IHJvdysrKSB7CisgICAgICAgIEZYU1lTX21lbWNweShwRGVzdEJ1ZiArIHJvdyAqIGRlc3RfcGl0Y2gsIHBTcmNCdWYgKyByb3cgKiBzcmNfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICByb3dieXRlcyk7CisgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZnRfbWF0cml4Lnh4ID0gKHNpZ25lZCBsb25nKShmb250X3NpemUgLyA2NCAqIDY1NTM2KTsKLSAgICAgICAgZnRfbWF0cml4Lnh5ID0gZnRfbWF0cml4Lnl4ID0gMDsKLSAgICAgICAgZnRfbWF0cml4Lnl5ID0gKHNpZ25lZCBsb25nKShmb250X3NpemUgLyA2NCAqIDY1NTM2KTsKKyAgICAgIF9Db250cmFzdEFkanVzdChwU3JjQnVmLCBwRGVzdEJ1ZiwgYm13aWR0aCwgYm1oZWlnaHQsIHNyY19waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0X3BpdGNoKTsKKyAgICAgIF9HYW1tYUFkanVzdChwRGVzdEJ1ZiwgYm13aWR0aCwgYm1oZWlnaHQsIGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0VGV4dEdhbW1hVGFibGUoKSk7CiAgICAgfQotICAgIEZYRlRfU2V0X1RyYW5zZm9ybShwRm9udC0+bV9GYWNlLCAmZnRfbWF0cml4LCAwKTsKLSAgICBGWF9CT09MIHJldCA9IF9PdXRwdXRHbHlwaChkaWIsIHgsIHksIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LCBhcmdiKTsKLSAgICByZXR1cm4gcmV0OworICB9CisgIHJldHVybiBwR2x5cGhCaXRtYXA7CiB9Ci1jb25zdCBDRlhfUGF0aERhdGEqIENGWF9GYWNlQ2FjaGU6OkxvYWRHbHlwaFBhdGgoQ0ZYX0ZvbnQqIHBGb250LCBGWF9EV09SRCBnbHlwaF9pbmRleCwgaW50IGRlc3Rfd2lkdGgpCi17Ci0gICAgaWYgKG1fRmFjZSA9PSBOVUxMIHx8IGdseXBoX2luZGV4ID09IChGWF9EV09SRCkgLSAxKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDRlhfUGF0aERhdGEqIHBHbHlwaFBhdGggPSBOVUxMOwotICAgIEZYX0xQVk9JRCBrZXk7Ci0gICAgaWYgKHBGb250LT5HZXRTdWJzdEZvbnQoKSkKLSAgICAgICAga2V5ID0gKEZYX0xQVk9JRCkoRlhfVUlOVFBUUikoZ2x5cGhfaW5kZXggKyAoKHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9XZWlnaHQgLyAxNikgPDwgMTUpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwRm9udC0+R2V0U3Vic3RGb250KCktPm1fSXRhbGljQW5nbGUgLyAyKSA8PCAyMSkgKyAoKGRlc3Rfd2lkdGggLyAxNikgPDwgMjUpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBGb250LT5Jc1ZlcnRpY2FsKCkgPDwgMzEpKTsKLSAgICBlbHNlIHsKLSAgICAgICAga2V5ID0gKEZYX0xQVk9JRCkoRlhfVUlOVFBUUilnbHlwaF9pbmRleDsKLSAgICB9Ci0gICAgaWYgKG1fUGF0aE1hcC5Mb29rdXAoa2V5LCAoRlhfTFBWT0lEJilwR2x5cGhQYXRoKSkgewotICAgICAgICByZXR1cm4gcEdseXBoUGF0aDsKLSAgICB9Ci0gICAgcEdseXBoUGF0aCA9IHBGb250LT5Mb2FkR2x5cGhQYXRoKGdseXBoX2luZGV4LCBkZXN0X3dpZHRoKTsKLSAgICBtX1BhdGhNYXAuU2V0QXQoa2V5LCBwR2x5cGhQYXRoKTsKLSAgICByZXR1cm4gcEdseXBoUGF0aDsKK2NvbnN0IENGWF9QYXRoRGF0YSogQ0ZYX0ZhY2VDYWNoZTo6TG9hZEdseXBoUGF0aChDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgpIHsKKyAgaWYgKCFtX0ZhY2UgfHwgZ2x5cGhfaW5kZXggPT0gKEZYX0RXT1JEKS0xKQorICAgIHJldHVybiBudWxscHRyOworCisgIEZYX0RXT1JEIGtleSA9IGdseXBoX2luZGV4OworICBpZiAocEZvbnQtPkdldFN1YnN0Rm9udCgpKSB7CisgICAga2V5ICs9ICgoKHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9XZWlnaHQgLyAxNikgPDwgMTUpICsKKyAgICAgICAgICAgICgocEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX0l0YWxpY0FuZ2xlIC8gMikgPDwgMjEpICsKKyAgICAgICAgICAgICgoZGVzdF93aWR0aCAvIDE2KSA8PCAyNSkgKyAocEZvbnQtPklzVmVydGljYWwoKSA8PCAzMSkpOworICB9CisgIGF1dG8gaXQgPSBtX1BhdGhNYXAuZmluZChrZXkpOworICBpZiAoaXQgIT0gbV9QYXRoTWFwLmVuZCgpKQorICAgIHJldHVybiBpdC0+c2Vjb25kOworCisgIENGWF9QYXRoRGF0YSogcEdseXBoUGF0aCA9IHBGb250LT5Mb2FkR2x5cGhQYXRoKGdseXBoX2luZGV4LCBkZXN0X3dpZHRoKTsKKyAgbV9QYXRoTWFwW2tleV0gPSBwR2x5cGhQYXRoOworICByZXR1cm4gcEdseXBoUGF0aDsKIH0KIHR5cGVkZWYgc3RydWN0IHsKLSAgICBGWF9CT09MCQkJbV9iQ291bnQ7Ci0gICAgaW50CQkJCW1fUG9pbnRDb3VudDsKLSAgICBGWF9QQVRIUE9JTlQqCW1fcFBvaW50czsKLSAgICBpbnQJCQkJbV9DdXJYOwotICAgIGludAkJCQltX0N1clk7Ci0gICAgRlhfRkxPQVQJCW1fQ29vcmRVbml0OworICBGWF9CT09MIG1fYkNvdW50OworICBpbnQgbV9Qb2ludENvdW50OworICBGWF9QQVRIUE9JTlQqIG1fcFBvaW50czsKKyAgaW50IG1fQ3VyWDsKKyAgaW50IG1fQ3VyWTsKKyAgRlhfRkxPQVQgbV9Db29yZFVuaXQ7CiB9IE9VVExJTkVfUEFSQU1TOwotdm9pZCBfT3V0bGluZV9DaGVja0VtcHR5Q29udG91cihPVVRMSU5FX1BBUkFNUyogcGFyYW0pCi17Ci0gICAgaWYgKHBhcmFtLT5tX1BvaW50Q291bnQgPj0gMiAmJiBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSAyXS5tX0ZsYWcgPT0gRlhQVF9NT1ZFVE8gJiYKLSAgICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDJdLm1fUG9pbnRYID09IHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDFdLm1fUG9pbnRYICYmCi0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSAyXS5tX1BvaW50WSA9PSBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSAxXS5tX1BvaW50WSkgewotICAgICAgICBwYXJhbS0+bV9Qb2ludENvdW50IC09IDI7Ci0gICAgfQotICAgIGlmIChwYXJhbS0+bV9Qb2ludENvdW50ID49IDQgJiYgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50IC0gNF0ubV9GbGFnID09IEZYUFRfTU9WRVRPICYmCi0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSAzXS5tX0ZsYWcgPT0gRlhQVF9CRVpJRVJUTyAmJgotICAgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50IC0gM10ubV9Qb2ludFggPT0gcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50IC0gNF0ubV9Qb2ludFggJiYKLSAgICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDNdLm1fUG9pbnRZID09IHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDRdLm1fUG9pbnRZICYmCi0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSAyXS5tX1BvaW50WCA9PSBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSA0XS5tX1BvaW50WCAmJgotICAgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50IC0gMl0ubV9Qb2ludFkgPT0gcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50IC0gNF0ubV9Qb2ludFkgJiYKLSAgICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDFdLm1fUG9pbnRYID09IHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDRdLm1fUG9pbnRYICYmCi0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSAxXS5tX1BvaW50WSA9PSBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSA0XS5tX1BvaW50WSkgewotICAgICAgICBwYXJhbS0+bV9Qb2ludENvdW50IC09IDQ7Ci0gICAgfQordm9pZCBfT3V0bGluZV9DaGVja0VtcHR5Q29udG91cihPVVRMSU5FX1BBUkFNUyogcGFyYW0pIHsKKyAgaWYgKHBhcmFtLT5tX1BvaW50Q291bnQgPj0gMiAmJgorICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50IC0gMl0ubV9GbGFnID09IEZYUFRfTU9WRVRPICYmCisgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSAyXS5tX1BvaW50WCA9PQorICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDFdLm1fUG9pbnRYICYmCisgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgLSAyXS5tX1BvaW50WSA9PQorICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDFdLm1fUG9pbnRZKSB7CisgICAgcGFyYW0tPm1fUG9pbnRDb3VudCAtPSAyOworICB9CisgIGlmIChwYXJhbS0+bV9Qb2ludENvdW50ID49IDQgJiYKKyAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDRdLm1fRmxhZyA9PSBGWFBUX01PVkVUTyAmJgorICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50IC0gM10ubV9GbGFnID09IEZYUFRfQkVaSUVSVE8gJiYKKyAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDNdLm1fUG9pbnRYID09CisgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50IC0gNF0ubV9Qb2ludFggJiYKKyAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDNdLm1fUG9pbnRZID09CisgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50IC0gNF0ubV9Qb2ludFkgJiYKKyAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDJdLm1fUG9pbnRYID09CisgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50IC0gNF0ubV9Qb2ludFggJiYKKyAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDJdLm1fUG9pbnRZID09CisgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50IC0gNF0ubV9Qb2ludFkgJiYKKyAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDFdLm1fUG9pbnRYID09CisgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50IC0gNF0ubV9Qb2ludFggJiYKKyAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDFdLm1fUG9pbnRZID09CisgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50IC0gNF0ubV9Qb2ludFkpIHsKKyAgICBwYXJhbS0+bV9Qb2ludENvdW50IC09IDQ7CisgIH0KIH0KIGV4dGVybiAiQyIgewotICAgIHN0YXRpYyBpbnQgX091dGxpbmVfTW92ZVRvKGNvbnN0IEZYRlRfVmVjdG9yKiB0bywgdm9pZCogdXNlcikKLSAgICB7Ci0gICAgICAgIE9VVExJTkVfUEFSQU1TKiBwYXJhbSA9IChPVVRMSU5FX1BBUkFNUyopdXNlcjsKLSAgICAgICAgaWYgKCFwYXJhbS0+bV9iQ291bnQpIHsKLSAgICAgICAgICAgIF9PdXRsaW5lX0NoZWNrRW1wdHlDb250b3VyKHBhcmFtKTsKLSAgICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudF0ubV9Qb2ludFggPSB0by0+eCAvIHBhcmFtLT5tX0Nvb3JkVW5pdDsKLSAgICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudF0ubV9Qb2ludFkgPSB0by0+eSAvIHBhcmFtLT5tX0Nvb3JkVW5pdDsKLSAgICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudF0ubV9GbGFnID0gRlhQVF9NT1ZFVE87Ci0gICAgICAgICAgICBwYXJhbS0+bV9DdXJYID0gdG8tPng7Ci0gICAgICAgICAgICBwYXJhbS0+bV9DdXJZID0gdG8tPnk7Ci0gICAgICAgICAgICBpZiAocGFyYW0tPm1fUG9pbnRDb3VudCkgewotICAgICAgICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDFdLm1fRmxhZyB8PSBGWFBUX0NMT1NFRklHVVJFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBhcmFtLT5tX1BvaW50Q291bnQgKys7Ci0gICAgICAgIHJldHVybiAwOworc3RhdGljIGludCBfT3V0bGluZV9Nb3ZlVG8oY29uc3QgRlhGVF9WZWN0b3IqIHRvLCB2b2lkKiB1c2VyKSB7CisgIE9VVExJTkVfUEFSQU1TKiBwYXJhbSA9IChPVVRMSU5FX1BBUkFNUyopdXNlcjsKKyAgaWYgKCFwYXJhbS0+bV9iQ291bnQpIHsKKyAgICBfT3V0bGluZV9DaGVja0VtcHR5Q29udG91cihwYXJhbSk7CisgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50XS5tX1BvaW50WCA9IHRvLT54IC8gcGFyYW0tPm1fQ29vcmRVbml0OworICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudF0ubV9Qb2ludFkgPSB0by0+eSAvIHBhcmFtLT5tX0Nvb3JkVW5pdDsKKyAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnRdLm1fRmxhZyA9IEZYUFRfTU9WRVRPOworICAgIHBhcmFtLT5tX0N1clggPSB0by0+eDsKKyAgICBwYXJhbS0+bV9DdXJZID0gdG8tPnk7CisgICAgaWYgKHBhcmFtLT5tX1BvaW50Q291bnQpIHsKKyAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCAtIDFdLm1fRmxhZyB8PSBGWFBUX0NMT1NFRklHVVJFOwogICAgIH0KLX07Ci1leHRlcm4gIkMiIHsKLSAgICBzdGF0aWMgaW50IF9PdXRsaW5lX0xpbmVUbyhjb25zdCBGWEZUX1ZlY3RvciogdG8sIHZvaWQqIHVzZXIpCi0gICAgewotICAgICAgICBPVVRMSU5FX1BBUkFNUyogcGFyYW0gPSAoT1VUTElORV9QQVJBTVMqKXVzZXI7Ci0gICAgICAgIGlmICghcGFyYW0tPm1fYkNvdW50KSB7Ci0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnRdLm1fUG9pbnRYID0gdG8tPnggLyBwYXJhbS0+bV9Db29yZFVuaXQ7Ci0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnRdLm1fUG9pbnRZID0gdG8tPnkgLyBwYXJhbS0+bV9Db29yZFVuaXQ7Ci0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnRdLm1fRmxhZyA9IEZYUFRfTElORVRPOwotICAgICAgICAgICAgcGFyYW0tPm1fQ3VyWCA9IHRvLT54OwotICAgICAgICAgICAgcGFyYW0tPm1fQ3VyWSA9IHRvLT55OwotICAgICAgICB9Ci0gICAgICAgIHBhcmFtLT5tX1BvaW50Q291bnQgKys7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX07Ci1leHRlcm4gIkMiIHsKLSAgICBzdGF0aWMgaW50IF9PdXRsaW5lX0NvbmljVG8oY29uc3QgRlhGVF9WZWN0b3IqIGNvbnRyb2wsIGNvbnN0IEZYRlRfVmVjdG9yKiB0bywgdm9pZCogdXNlcikKLSAgICB7Ci0gICAgICAgIE9VVExJTkVfUEFSQU1TKiBwYXJhbSA9IChPVVRMSU5FX1BBUkFNUyopdXNlcjsKLSAgICAgICAgaWYgKCFwYXJhbS0+bV9iQ291bnQpIHsKLSAgICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudF0ubV9Qb2ludFggPSAocGFyYW0tPm1fQ3VyWCArIChjb250cm9sLT54IC0gcGFyYW0tPm1fQ3VyWCkgKiAyIC8gMykgLyBwYXJhbS0+bV9Db29yZFVuaXQ7Ci0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnRdLm1fUG9pbnRZID0gKHBhcmFtLT5tX0N1clkgKyAoY29udHJvbC0+eSAtIHBhcmFtLT5tX0N1clkpICogMiAvIDMpIC8gcGFyYW0tPm1fQ29vcmRVbml0OwotICAgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50XS5tX0ZsYWcgPSBGWFBUX0JFWklFUlRPOwotICAgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50ICsgMV0ubV9Qb2ludFggPSAoY29udHJvbC0+eCArICh0by0+eCAtIGNvbnRyb2wtPngpIC8gMykgLyBwYXJhbS0+bV9Db29yZFVuaXQ7Ci0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgKyAxXS5tX1BvaW50WSA9IChjb250cm9sLT55ICsgKHRvLT55IC0gY29udHJvbC0+eSkgLyAzKSAvIHBhcmFtLT5tX0Nvb3JkVW5pdDsKLSAgICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCArIDFdLm1fRmxhZyA9IEZYUFRfQkVaSUVSVE87Ci0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgKyAyXS5tX1BvaW50WCA9IHRvLT54IC8gcGFyYW0tPm1fQ29vcmRVbml0OwotICAgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50ICsgMl0ubV9Qb2ludFkgPSB0by0+eSAvIHBhcmFtLT5tX0Nvb3JkVW5pdDsKLSAgICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCArIDJdLm1fRmxhZyA9IEZYUFRfQkVaSUVSVE87Ci0gICAgICAgICAgICBwYXJhbS0+bV9DdXJYID0gdG8tPng7Ci0gICAgICAgICAgICBwYXJhbS0+bV9DdXJZID0gdG8tPnk7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyYW0tPm1fUG9pbnRDb3VudCArPSAzOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19OwotZXh0ZXJuICJDIiB7Ci0gICAgc3RhdGljIGludCBfT3V0bGluZV9DdWJpY1RvKGNvbnN0IEZYRlRfVmVjdG9yKiBjb250cm9sMSwgY29uc3QgRlhGVF9WZWN0b3IqIGNvbnRyb2wyLCBjb25zdCBGWEZUX1ZlY3RvciogdG8sIHZvaWQqIHVzZXIpCi0gICAgewotICAgICAgICBPVVRMSU5FX1BBUkFNUyogcGFyYW0gPSAoT1VUTElORV9QQVJBTVMqKXVzZXI7Ci0gICAgICAgIGlmICghcGFyYW0tPm1fYkNvdW50KSB7Ci0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnRdLm1fUG9pbnRYID0gY29udHJvbDEtPnggLyBwYXJhbS0+bV9Db29yZFVuaXQ7Ci0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnRdLm1fUG9pbnRZID0gY29udHJvbDEtPnkgLyBwYXJhbS0+bV9Db29yZFVuaXQ7Ci0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnRdLm1fRmxhZyA9IEZYUFRfQkVaSUVSVE87Ci0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgKyAxXS5tX1BvaW50WCA9IGNvbnRyb2wyLT54IC8gcGFyYW0tPm1fQ29vcmRVbml0OwotICAgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50ICsgMV0ubV9Qb2ludFkgPSBjb250cm9sMi0+eSAvIHBhcmFtLT5tX0Nvb3JkVW5pdDsKLSAgICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCArIDFdLm1fRmxhZyA9IEZYUFRfQkVaSUVSVE87Ci0gICAgICAgICAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgKyAyXS5tX1BvaW50WCA9IHRvLT54IC8gcGFyYW0tPm1fQ29vcmRVbml0OwotICAgICAgICAgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50ICsgMl0ubV9Qb2ludFkgPSB0by0+eSAvIHBhcmFtLT5tX0Nvb3JkVW5pdDsKLSAgICAgICAgICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCArIDJdLm1fRmxhZyA9IEZYUFRfQkVaSUVSVE87Ci0gICAgICAgICAgICBwYXJhbS0+bV9DdXJYID0gdG8tPng7Ci0gICAgICAgICAgICBwYXJhbS0+bV9DdXJZID0gdG8tPnk7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyYW0tPm1fUG9pbnRDb3VudCArPSAzOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19OwotQ0ZYX1BhdGhEYXRhKiBDRlhfRm9udDo6TG9hZEdseXBoUGF0aChGWF9EV09SRCBnbHlwaF9pbmRleCwgaW50IGRlc3Rfd2lkdGgpCi17Ci0gICAgaWYgKG1fRmFjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBGWEZUX1NldF9QaXhlbF9TaXplcyhtX0ZhY2UsIDAsIDY0KTsKLSAgICBGWEZUX01hdHJpeCAgZnRfbWF0cml4ID0gezY1NTM2LCAwLCAwLCA2NTUzNn07Ci0gICAgaWYgKG1fcFN1YnN0Rm9udCkgewotICAgICAgICBpZiAobV9wU3Vic3RGb250LT5tX0l0YWxpY0FuZ2xlKSB7Ci0gICAgICAgICAgICBpbnQgc2tldyA9IG1fcFN1YnN0Rm9udC0+bV9JdGFsaWNBbmdsZTsKLSAgICAgICAgICAgIHNrZXcgPSBza2V3IDw9IC1BTkdMRVNLRVdfQVJSQVlfU0laRSA/IC01OCA6IC1nX0FuZ2xlU2tld1stc2tld107Ci0gICAgICAgICAgICBpZiAobV9iVmVydGljYWwpIHsKLSAgICAgICAgICAgICAgICBmdF9tYXRyaXgueXggKz0gZnRfbWF0cml4Lnl5ICogc2tldyAvIDEwMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZnRfbWF0cml4Lnh5ICs9IC1mdF9tYXRyaXgueHggKiBza2V3IC8gMTAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtX3BTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyAmIEZYRk9OVF9TVUJTVF9NTSkgewotICAgICAgICAgICAgQWRqdXN0TU1QYXJhbXMoZ2x5cGhfaW5kZXgsIGRlc3Rfd2lkdGgsIG1fcFN1YnN0Rm9udC0+bV9XZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotICAgIEZYRlRfU2V0X1RyYW5zZm9ybShtX0ZhY2UsICZmdF9tYXRyaXgsIDApOwotICAgIGludCBsb2FkX2ZsYWdzID0gKG1fRmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TRk5UKSA/IEZYRlRfTE9BRF9OT19CSVRNQVAgOiBGWEZUX0xPQURfTk9fQklUTUFQIHwgRlRfTE9BRF9OT19ISU5USU5HOwotICAgIGludCBlcnJvciA9IEZYRlRfTG9hZF9HbHlwaChtX0ZhY2UsIGdseXBoX2luZGV4LCBsb2FkX2ZsYWdzKTsKLSAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChtX3BTdWJzdEZvbnQgJiYgIShtX3BTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyAmIEZYRk9OVF9TVUJTVF9NTSkgJiYgbV9wU3Vic3RGb250LT5tX1dlaWdodCA+IDQwMCkgewotICAgICAgICBpbnQgaW5kZXggPSAobV9wU3Vic3RGb250LT5tX1dlaWdodCAtIDQwMCkgLyAxMDsKLSAgICAgICAgaWYgKGluZGV4ID49IFdFSUdIVFBPV19BUlJBWV9TSVpFKQotICAgICAgICAgICAgaW5kZXggPSBXRUlHSFRQT1dfQVJSQVlfU0laRSAtIDE7Ci0gICAgICAgIGludCBsZXZlbCA9IDA7Ci0gICAgICAgIGlmIChtX3BTdWJzdEZvbnQtPm1fQ2hhcnNldCA9PSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVCkgewotICAgICAgICAgICAgbGV2ZWwgPSBnX1dlaWdodFBvd19TSElGVEpJU1tpbmRleF0gKiAyICogNjU1MzYgLyAzNjY1NTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxldmVsID0gZ19XZWlnaHRQb3dbaW5kZXhdICogMjsKLSAgICAgICAgfQotICAgICAgICBGWEZUX091dGxpbmVfRW1ib2xkZW4oRlhGVF9HZXRfR2x5cGhfT3V0bGluZShtX0ZhY2UpLCBsZXZlbCk7Ci0gICAgfQotICAgIEZYRlRfT3V0bGluZV9GdW5jcyBmdW5jczsKLSAgICBmdW5jcy5tb3ZlX3RvID0gX091dGxpbmVfTW92ZVRvOwotICAgIGZ1bmNzLmxpbmVfdG8gPSBfT3V0bGluZV9MaW5lVG87Ci0gICAgZnVuY3MuY29uaWNfdG8gPSBfT3V0bGluZV9Db25pY1RvOwotICAgIGZ1bmNzLmN1YmljX3RvID0gX091dGxpbmVfQ3ViaWNUbzsKLSAgICBmdW5jcy5zaGlmdCA9IDA7Ci0gICAgZnVuY3MuZGVsdGEgPSAwOwotICAgIE9VVExJTkVfUEFSQU1TIHBhcmFtczsKLSAgICBwYXJhbXMubV9iQ291bnQgPSBUUlVFOwotICAgIHBhcmFtcy5tX1BvaW50Q291bnQgPSAwOwotICAgIEZYRlRfT3V0bGluZV9EZWNvbXBvc2UoRlhGVF9HZXRfR2x5cGhfT3V0bGluZShtX0ZhY2UpLCAmZnVuY3MsICZwYXJhbXMpOwotICAgIGlmIChwYXJhbXMubV9Qb2ludENvdW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENGWF9QYXRoRGF0YSogcFBhdGggPSBuZXcgQ0ZYX1BhdGhEYXRhOwotICAgIHBQYXRoLT5TZXRQb2ludENvdW50KHBhcmFtcy5tX1BvaW50Q291bnQpOwotICAgIHBhcmFtcy5tX2JDb3VudCA9IEZBTFNFOwotICAgIHBhcmFtcy5tX1BvaW50Q291bnQgPSAwOwotICAgIHBhcmFtcy5tX3BQb2ludHMgPSBwUGF0aC0+R2V0UG9pbnRzKCk7Ci0gICAgcGFyYW1zLm1fQ3VyWCA9IHBhcmFtcy5tX0N1clkgPSAwOwotICAgIHBhcmFtcy5tX0Nvb3JkVW5pdCA9IDY0ICogNjQuMDsKLSAgICBGWEZUX091dGxpbmVfRGVjb21wb3NlKEZYRlRfR2V0X0dseXBoX091dGxpbmUobV9GYWNlKSwgJmZ1bmNzLCAmcGFyYW1zKTsKLSAgICBfT3V0bGluZV9DaGVja0VtcHR5Q29udG91cigmcGFyYW1zKTsKLSAgICBwUGF0aC0+VHJpbVBvaW50cyhwYXJhbXMubV9Qb2ludENvdW50KTsKLSAgICBpZiAocGFyYW1zLm1fUG9pbnRDb3VudCkgewotICAgICAgICBwUGF0aC0+R2V0UG9pbnRzKClbcGFyYW1zLm1fUG9pbnRDb3VudCAtIDFdLm1fRmxhZyB8PSBGWFBUX0NMT1NFRklHVVJFOwotICAgIH0KLSAgICByZXR1cm4gcFBhdGg7CisgIH0KKyAgcGFyYW0tPm1fUG9pbnRDb3VudCsrOworICByZXR1cm4gMDsKIH0KLXZvaWQgX0NGWF9VbmlxdWVLZXlHZW46OkdlbmVyYXRlKGludCBjb3VudCwgLi4uKQotewotICAgIHZhX2xpc3QgYXJnTGlzdDsKLSAgICB2YV9zdGFydChhcmdMaXN0LCBjb3VudCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgewotICAgICAgICBpbnQgcCA9IHZhX2FyZyhhcmdMaXN0LCBpbnQpOwotICAgICAgICAoKEZYX0RXT1JEKiltX0tleSlbaV0gPSBwOworfTsKK2V4dGVybiAiQyIgeworc3RhdGljIGludCBfT3V0bGluZV9MaW5lVG8oY29uc3QgRlhGVF9WZWN0b3IqIHRvLCB2b2lkKiB1c2VyKSB7CisgIE9VVExJTkVfUEFSQU1TKiBwYXJhbSA9IChPVVRMSU5FX1BBUkFNUyopdXNlcjsKKyAgaWYgKCFwYXJhbS0+bV9iQ291bnQpIHsKKyAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnRdLm1fUG9pbnRYID0gdG8tPnggLyBwYXJhbS0+bV9Db29yZFVuaXQ7CisgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50XS5tX1BvaW50WSA9IHRvLT55IC8gcGFyYW0tPm1fQ29vcmRVbml0OworICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudF0ubV9GbGFnID0gRlhQVF9MSU5FVE87CisgICAgcGFyYW0tPm1fQ3VyWCA9IHRvLT54OworICAgIHBhcmFtLT5tX0N1clkgPSB0by0+eTsKKyAgfQorICBwYXJhbS0+bV9Qb2ludENvdW50Kys7CisgIHJldHVybiAwOworfQorfTsKK2V4dGVybiAiQyIgeworc3RhdGljIGludCBfT3V0bGluZV9Db25pY1RvKGNvbnN0IEZYRlRfVmVjdG9yKiBjb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYRlRfVmVjdG9yKiB0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyKSB7CisgIE9VVExJTkVfUEFSQU1TKiBwYXJhbSA9IChPVVRMSU5FX1BBUkFNUyopdXNlcjsKKyAgaWYgKCFwYXJhbS0+bV9iQ291bnQpIHsKKyAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnRdLm1fUG9pbnRYID0KKyAgICAgICAgKHBhcmFtLT5tX0N1clggKyAoY29udHJvbC0+eCAtIHBhcmFtLT5tX0N1clgpICogMiAvIDMpIC8KKyAgICAgICAgcGFyYW0tPm1fQ29vcmRVbml0OworICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudF0ubV9Qb2ludFkgPQorICAgICAgICAocGFyYW0tPm1fQ3VyWSArIChjb250cm9sLT55IC0gcGFyYW0tPm1fQ3VyWSkgKiAyIC8gMykgLworICAgICAgICBwYXJhbS0+bV9Db29yZFVuaXQ7CisgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50XS5tX0ZsYWcgPSBGWFBUX0JFWklFUlRPOworICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCArIDFdLm1fUG9pbnRYID0KKyAgICAgICAgKGNvbnRyb2wtPnggKyAodG8tPnggLSBjb250cm9sLT54KSAvIDMpIC8gcGFyYW0tPm1fQ29vcmRVbml0OworICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCArIDFdLm1fUG9pbnRZID0KKyAgICAgICAgKGNvbnRyb2wtPnkgKyAodG8tPnkgLSBjb250cm9sLT55KSAvIDMpIC8gcGFyYW0tPm1fQ29vcmRVbml0OworICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCArIDFdLm1fRmxhZyA9IEZYUFRfQkVaSUVSVE87CisgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50ICsgMl0ubV9Qb2ludFggPQorICAgICAgICB0by0+eCAvIHBhcmFtLT5tX0Nvb3JkVW5pdDsKKyAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgKyAyXS5tX1BvaW50WSA9CisgICAgICAgIHRvLT55IC8gcGFyYW0tPm1fQ29vcmRVbml0OworICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCArIDJdLm1fRmxhZyA9IEZYUFRfQkVaSUVSVE87CisgICAgcGFyYW0tPm1fQ3VyWCA9IHRvLT54OworICAgIHBhcmFtLT5tX0N1clkgPSB0by0+eTsKKyAgfQorICBwYXJhbS0+bV9Qb2ludENvdW50ICs9IDM7CisgIHJldHVybiAwOworfQorfTsKK2V4dGVybiAiQyIgeworc3RhdGljIGludCBfT3V0bGluZV9DdWJpY1RvKGNvbnN0IEZYRlRfVmVjdG9yKiBjb250cm9sMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWEZUX1ZlY3RvciogY29udHJvbDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhGVF9WZWN0b3IqIHRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIpIHsKKyAgT1VUTElORV9QQVJBTVMqIHBhcmFtID0gKE9VVExJTkVfUEFSQU1TKil1c2VyOworICBpZiAoIXBhcmFtLT5tX2JDb3VudCkgeworICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudF0ubV9Qb2ludFggPQorICAgICAgICBjb250cm9sMS0+eCAvIHBhcmFtLT5tX0Nvb3JkVW5pdDsKKyAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnRdLm1fUG9pbnRZID0KKyAgICAgICAgY29udHJvbDEtPnkgLyBwYXJhbS0+bV9Db29yZFVuaXQ7CisgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50XS5tX0ZsYWcgPSBGWFBUX0JFWklFUlRPOworICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCArIDFdLm1fUG9pbnRYID0KKyAgICAgICAgY29udHJvbDItPnggLyBwYXJhbS0+bV9Db29yZFVuaXQ7CisgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50ICsgMV0ubV9Qb2ludFkgPQorICAgICAgICBjb250cm9sMi0+eSAvIHBhcmFtLT5tX0Nvb3JkVW5pdDsKKyAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgKyAxXS5tX0ZsYWcgPSBGWFBUX0JFWklFUlRPOworICAgIHBhcmFtLT5tX3BQb2ludHNbcGFyYW0tPm1fUG9pbnRDb3VudCArIDJdLm1fUG9pbnRYID0KKyAgICAgICAgdG8tPnggLyBwYXJhbS0+bV9Db29yZFVuaXQ7CisgICAgcGFyYW0tPm1fcFBvaW50c1twYXJhbS0+bV9Qb2ludENvdW50ICsgMl0ubV9Qb2ludFkgPQorICAgICAgICB0by0+eSAvIHBhcmFtLT5tX0Nvb3JkVW5pdDsKKyAgICBwYXJhbS0+bV9wUG9pbnRzW3BhcmFtLT5tX1BvaW50Q291bnQgKyAyXS5tX0ZsYWcgPSBGWFBUX0JFWklFUlRPOworICAgIHBhcmFtLT5tX0N1clggPSB0by0+eDsKKyAgICBwYXJhbS0+bV9DdXJZID0gdG8tPnk7CisgIH0KKyAgcGFyYW0tPm1fUG9pbnRDb3VudCArPSAzOworICByZXR1cm4gMDsKK30KK307CitDRlhfUGF0aERhdGEqIENGWF9Gb250OjpMb2FkR2x5cGhQYXRoKEZYX0RXT1JEIGdseXBoX2luZGV4LCBpbnQgZGVzdF93aWR0aCkgeworICBpZiAoIW1fRmFjZSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEZYRlRfU2V0X1BpeGVsX1NpemVzKG1fRmFjZSwgMCwgNjQpOworICBGWEZUX01hdHJpeCBmdF9tYXRyaXggPSB7NjU1MzYsIDAsIDAsIDY1NTM2fTsKKyAgaWYgKG1fcFN1YnN0Rm9udCkgeworICAgIGlmIChtX3BTdWJzdEZvbnQtPm1fSXRhbGljQW5nbGUpIHsKKyAgICAgIGludCBza2V3ID0gbV9wU3Vic3RGb250LT5tX0l0YWxpY0FuZ2xlOworICAgICAgc2tldyA9IHNrZXcgPD0gLUFOR0xFU0tFV19BUlJBWV9TSVpFID8gLTU4IDogLWdfQW5nbGVTa2V3Wy1za2V3XTsKKyAgICAgIGlmIChtX2JWZXJ0aWNhbCkgeworICAgICAgICBmdF9tYXRyaXgueXggKz0gZnRfbWF0cml4Lnl5ICogc2tldyAvIDEwMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZ0X21hdHJpeC54eSArPSAtZnRfbWF0cml4Lnh4ICogc2tldyAvIDEwMDsKKyAgICAgIH0KICAgICB9Ci0gICAgdmFfZW5kKGFyZ0xpc3QpOwotICAgIG1fS2V5TGVuID0gY291bnQgKiBzaXplb2YoRlhfRFdPUkQpOworICAgIGlmIChtX3BTdWJzdEZvbnQtPm1fU3Vic3RGbGFncyAmIEZYRk9OVF9TVUJTVF9NTSkgeworICAgICAgQWRqdXN0TU1QYXJhbXMoZ2x5cGhfaW5kZXgsIGRlc3Rfd2lkdGgsIG1fcFN1YnN0Rm9udC0+bV9XZWlnaHQpOworICAgIH0KKyAgfQorICBTY29wZWRGb250VHJhbnNmb3JtIHNjb3BlZF90cmFuc2Zvcm0obV9GYWNlLCAmZnRfbWF0cml4KTsKKyAgaW50IGxvYWRfZmxhZ3MgPSBGWEZUX0xPQURfTk9fQklUTUFQOworICBpZiAoIShtX0ZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfU0ZOVCkgfHwgIUZUX0lTX1RSSUNLWShtX0ZhY2UpKSB7CisgICAgbG9hZF9mbGFncyB8PSBGVF9MT0FEX05PX0hJTlRJTkc7CisgIH0KKyAgaW50IGVycm9yID0gRlhGVF9Mb2FkX0dseXBoKG1fRmFjZSwgZ2x5cGhfaW5kZXgsIGxvYWRfZmxhZ3MpOworICBpZiAoZXJyb3IpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAobV9wU3Vic3RGb250ICYmICEobV9wU3Vic3RGb250LT5tX1N1YnN0RmxhZ3MgJiBGWEZPTlRfU1VCU1RfTU0pICYmCisgICAgICBtX3BTdWJzdEZvbnQtPm1fV2VpZ2h0ID4gNDAwKSB7CisgICAgaW50IGluZGV4ID0gKG1fcFN1YnN0Rm9udC0+bV9XZWlnaHQgLSA0MDApIC8gMTA7CisgICAgaWYgKGluZGV4ID49IFdFSUdIVFBPV19BUlJBWV9TSVpFKQorICAgICAgaW5kZXggPSBXRUlHSFRQT1dfQVJSQVlfU0laRSAtIDE7CisgICAgaW50IGxldmVsID0gMDsKKyAgICBpZiAobV9wU3Vic3RGb250LT5tX0NoYXJzZXQgPT0gRlhGT05UX1NISUZUSklTX0NIQVJTRVQpIHsKKyAgICAgIGxldmVsID0gZ19XZWlnaHRQb3dfU0hJRlRKSVNbaW5kZXhdICogMiAqIDY1NTM2IC8gMzY2NTU7CisgICAgfSBlbHNlIHsKKyAgICAgIGxldmVsID0gZ19XZWlnaHRQb3dbaW5kZXhdICogMjsKKyAgICB9CisgICAgRlhGVF9PdXRsaW5lX0VtYm9sZGVuKEZYRlRfR2V0X0dseXBoX091dGxpbmUobV9GYWNlKSwgbGV2ZWwpOworICB9CisgIEZYRlRfT3V0bGluZV9GdW5jcyBmdW5jczsKKyAgZnVuY3MubW92ZV90byA9IF9PdXRsaW5lX01vdmVUbzsKKyAgZnVuY3MubGluZV90byA9IF9PdXRsaW5lX0xpbmVUbzsKKyAgZnVuY3MuY29uaWNfdG8gPSBfT3V0bGluZV9Db25pY1RvOworICBmdW5jcy5jdWJpY190byA9IF9PdXRsaW5lX0N1YmljVG87CisgIGZ1bmNzLnNoaWZ0ID0gMDsKKyAgZnVuY3MuZGVsdGEgPSAwOworICBPVVRMSU5FX1BBUkFNUyBwYXJhbXM7CisgIHBhcmFtcy5tX2JDb3VudCA9IFRSVUU7CisgIHBhcmFtcy5tX1BvaW50Q291bnQgPSAwOworICBGWEZUX091dGxpbmVfRGVjb21wb3NlKEZYRlRfR2V0X0dseXBoX091dGxpbmUobV9GYWNlKSwgJmZ1bmNzLCAmcGFyYW1zKTsKKyAgaWYgKHBhcmFtcy5tX1BvaW50Q291bnQgPT0gMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENGWF9QYXRoRGF0YSogcFBhdGggPSBuZXcgQ0ZYX1BhdGhEYXRhOworICBwUGF0aC0+U2V0UG9pbnRDb3VudChwYXJhbXMubV9Qb2ludENvdW50KTsKKyAgcGFyYW1zLm1fYkNvdW50ID0gRkFMU0U7CisgIHBhcmFtcy5tX1BvaW50Q291bnQgPSAwOworICBwYXJhbXMubV9wUG9pbnRzID0gcFBhdGgtPkdldFBvaW50cygpOworICBwYXJhbXMubV9DdXJYID0gcGFyYW1zLm1fQ3VyWSA9IDA7CisgIHBhcmFtcy5tX0Nvb3JkVW5pdCA9IDY0ICogNjQuMDsKKyAgRlhGVF9PdXRsaW5lX0RlY29tcG9zZShGWEZUX0dldF9HbHlwaF9PdXRsaW5lKG1fRmFjZSksICZmdW5jcywgJnBhcmFtcyk7CisgIF9PdXRsaW5lX0NoZWNrRW1wdHlDb250b3VyKCZwYXJhbXMpOworICBwUGF0aC0+VHJpbVBvaW50cyhwYXJhbXMubV9Qb2ludENvdW50KTsKKyAgaWYgKHBhcmFtcy5tX1BvaW50Q291bnQpIHsKKyAgICBwUGF0aC0+R2V0UG9pbnRzKClbcGFyYW1zLm1fUG9pbnRDb3VudCAtIDFdLm1fRmxhZyB8PSBGWFBUX0NMT1NFRklHVVJFOworICB9CisgIHJldHVybiBwUGF0aDsKK30KK3ZvaWQgX0NGWF9VbmlxdWVLZXlHZW46OkdlbmVyYXRlKGludCBjb3VudCwgLi4uKSB7CisgIHZhX2xpc3QgYXJnTGlzdDsKKyAgdmFfc3RhcnQoYXJnTGlzdCwgY291bnQpOworICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBpbnQgcCA9IHZhX2FyZyhhcmdMaXN0LCBpbnQpOworICAgICgoRlhfRFdPUkQqKW1fS2V5KVtpXSA9IHA7CisgIH0KKyAgdmFfZW5kKGFyZ0xpc3QpOworICBtX0tleUxlbiA9IGNvdW50ICogc2l6ZW9mKEZYX0RXT1JEKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvZ2UvdGV4dF9pbnQuaCBiL2NvcmUvc3JjL2Z4Z2UvZ2UvdGV4dF9pbnQuaAppbmRleCAzNDQ5NmU4Li41YTY5MTY3IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL2dlL3RleHRfaW50LmgKKysrIGIvY29yZS9zcmMvZnhnZS9nZS90ZXh0X2ludC5oCkBAIC0xLDEwNSArMSw4NCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIENPUkVfU1JDX0ZYR0VfR0VfVEVYVF9JTlRfSF8KICNkZWZpbmUgQ09SRV9TUkNfRlhHRV9HRV9URVhUX0lOVF9IXwogCisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZm9udC5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2ZyZWV0eXBlLmgiCisKIHN0cnVjdCBfQ0ZYX1VuaXF1ZUtleUdlbiB7Ci0gICAgdm9pZAkJR2VuZXJhdGUoaW50IGNvdW50LCAuLi4pOwotICAgIEZYX0NIQVIJCW1fS2V5WzEyOF07Ci0gICAgaW50CQkJbV9LZXlMZW47CisgIHZvaWQgR2VuZXJhdGUoaW50IGNvdW50LCAuLi4pOworICBGWF9DSEFSIG1fS2V5WzEyOF07CisgIGludCBtX0tleUxlbjsKIH07Ci1jbGFzcyBDRlhfU2l6ZUdseXBoQ2FjaGUgCi17Ci1wdWJsaWM6Ci0gICAgQ0ZYX1NpemVHbHlwaENhY2hlKCkKLSAgICB7Ci0gICAgICAgIG1fR2x5cGhNYXAuSW5pdEhhc2hUYWJsZSgyNTMpOwotICAgIH0KLSAgICB+Q0ZYX1NpemVHbHlwaENhY2hlKCk7Ci0gICAgQ0ZYX01hcFB0clRvUHRyCQkJbV9HbHlwaE1hcDsKK2NsYXNzIENGWF9TaXplR2x5cGhDYWNoZSB7CisgcHVibGljOgorICBDRlhfU2l6ZUdseXBoQ2FjaGUoKSB7fQorICB+Q0ZYX1NpemVHbHlwaENhY2hlKCk7CisgIHN0ZDo6bWFwPEZYX0RXT1JELCBDRlhfR2x5cGhCaXRtYXAqPiBtX0dseXBoTWFwOwogfTsKLWNsYXNzIENUVEZvbnREZXNjIAotewotcHVibGljOgotICAgIENUVEZvbnREZXNjKCkKLSAgICB7Ci0gICAgICAgIG1fVHlwZSA9IDA7Ci0gICAgICAgIG1fcEZvbnREYXRhID0gTlVMTDsKLSAgICAgICAgbV9SZWZDb3VudCA9IDA7Ci0gICAgfQotICAgIH5DVFRGb250RGVzYygpOwotICAgIEZYX0JPT0wJCQlSZWxlYXNlRmFjZShGWEZUX0ZhY2UgZmFjZSk7Ci0gICAgaW50CQkJCW1fVHlwZTsKLSAgICB1bmlvbiB7Ci0gICAgICAgIHN0cnVjdCB7Ci0gICAgICAgICAgICBGWF9CT09MCQltX2JJdGFsaWM7Ci0gICAgICAgICAgICBGWF9CT09MCQltX2JCb2xkOwotICAgICAgICAgICAgRlhGVF9GYWNlCW1fcEZhY2U7Ci0gICAgICAgIH0gbV9TaW5nbGVGYWNlOwotICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgRlhGVF9GYWNlCW1fcEZhY2VzWzE2XTsKLSAgICAgICAgfSBtX1RUQ0ZhY2U7Ci0gICAgfTsKLSAgICBGWF9CWVRFKgkJbV9wRm9udERhdGE7Ci0gICAgaW50CQkJCW1fUmVmQ291bnQ7CitjbGFzcyBDVFRGb250RGVzYyB7CisgcHVibGljOgorICBDVFRGb250RGVzYygpIHsKKyAgICBtX1R5cGUgPSAwOworICAgIG1fcEZvbnREYXRhID0gTlVMTDsKKyAgICBtX1JlZkNvdW50ID0gMDsKKyAgfQorICB+Q1RURm9udERlc2MoKTsKKyAgLy8gcmV0IDwgMCwgcmVsZWFzZWZhY2Ugbm90IGFwcHJvcHJpYXRlIGZvciB0aGlzIG9iamVjdC4KKyAgLy8gcmV0ID09IDAsIG9iamVjdCByZWxlYXNlZAorICAvLyByZXQgPiAwLCBvYmplY3Qgc3RpbGwgYWxpdmUsIG90aGVyIHJlZmVycmVycy4KKyAgaW50IFJlbGVhc2VGYWNlKEZYRlRfRmFjZSBmYWNlKTsKKyAgaW50IG1fVHlwZTsKKyAgdW5pb24geworICAgIHN0cnVjdCB7CisgICAgICBGWF9CT09MIG1fYkl0YWxpYzsKKyAgICAgIEZYX0JPT0wgbV9iQm9sZDsKKyAgICAgIEZYRlRfRmFjZSBtX3BGYWNlOworICAgIH0gbV9TaW5nbGVGYWNlOworICAgIHN0cnVjdCB7CisgICAgICBGWEZUX0ZhY2UgbV9wRmFjZXNbMTZdOworICAgIH0gbV9UVENGYWNlOworICB9OworICB1aW50OF90KiBtX3BGb250RGF0YTsKKyAgaW50IG1fUmVmQ291bnQ7CiB9OwotY2xhc3MgQ0ZYX1VuaWNvZGVFbmNvZGluZyA6IHB1YmxpYyBJRlhfRm9udEVuY29kaW5nCi17Ci1wdWJsaWM6Ci0gICAgQ0ZYX1VuaWNvZGVFbmNvZGluZyhDRlhfRm9udCogcEZvbnQpOwotICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdseXBoRnJvbUNoYXJDb2RlRXgoRlhfRFdPUkQgY2hhcmNvZGUsIGludCBlbmNvZGluZyA9IEVOQ09ESU5HX1VOSUNPREUpOwotcHJpdmF0ZToKLSAgICBDRlhfRm9udCoJCQltX3BGb250OwotICAgIHZpcnR1YWwgRlhfRFdPUkQJCUdseXBoRnJvbUNoYXJDb2RlKEZYX0RXT1JEIGNoYXJjb2RlKTsKLSAgICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCVVuaWNvZGVGcm9tQ2hhckNvZGUoRlhfRFdPUkQgY2hhcmNvZGUpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKEZYX1dDSEFSKWNoYXJjb2RlKTsKLSAgICB9Ci0gICAgdmlydHVhbCBGWF9EV09SRAkJQ2hhckNvZGVGcm9tVW5pY29kZShGWF9XQ0hBUiBVbmljb2RlKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIFVuaWNvZGU7Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUlzVW5pY29kZUNvbXBhdGlibGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotfTsKLSNkZWZpbmUgQ0hBUlNFVF9GTEFHX0FOU0kJCTEKLSNkZWZpbmUgQ0hBUlNFVF9GTEFHX1NZTUJPTAkJMgotI2RlZmluZSBDSEFSU0VUX0ZMQUdfU0hJRlRKSVMJNAotI2RlZmluZSBDSEFSU0VUX0ZMQUdfQklHNQkJOAotI2RlZmluZSBDSEFSU0VUX0ZMQUdfR0IJCQkxNgotI2RlZmluZSBDSEFSU0VUX0ZMQUdfS09SRUFOCQkzMgotY2xhc3MgQ0ZvbnRGYWNlSW5mbyAKLXsKLXB1YmxpYzoKLSAgICBDRlhfQnl0ZVN0cmluZwkJbV9GaWxlUGF0aDsKLSAgICBDRlhfQnl0ZVN0cmluZwkJbV9GYWNlTmFtZTsKLSAgICBGWF9EV09SRAkJCW1fU3R5bGVzOwotICAgIEZYX0RXT1JECQkJbV9DaGFyc2V0czsKLSAgICBGWF9EV09SRAkJCW1fRm9udE9mZnNldDsKLSAgICBGWF9EV09SRAkJCW1fRmlsZVNpemU7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcJCW1fRm9udFRhYmxlczsKLX07Ci1jbGFzcyBDRm9udEZpbGVGYWNlSW5mbyAKLXsKLXB1YmxpYzoKLSAgICBDRm9udEZpbGVGYWNlSW5mbygpOwotICAgIH5DRm9udEZpbGVGYWNlSW5mbygpOwotICAgIElGWF9GaWxlU3RyZWFtKgkJbV9wRmlsZTsKLSAgICBGWEZUX0ZhY2UJCQltX0ZhY2U7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcJCW1fRmFjZU5hbWU7Ci0gICAgRlhfRFdPUkQJCQltX0NoYXJzZXRzOwotICAgIEZYX0RXT1JECQkJbV9GaWxlU2l6ZTsKLSAgICBGWF9EV09SRAkJCW1fRm9udE9mZnNldDsKLSAgICBpbnQJCQkJCW1fV2VpZ2h0OwotICAgIEZYX0JPT0wJCQkJbV9iSXRhbGljOwotICAgIGludAkJCQkJbV9QaXRjaEZhbWlseTsKLSAgICBDRlhfQnl0ZVN0cmluZwkJbV9Gb250VGFibGVzOworCisjZGVmaW5lIENIQVJTRVRfRkxBR19BTlNJIDEKKyNkZWZpbmUgQ0hBUlNFVF9GTEFHX1NZTUJPTCAyCisjZGVmaW5lIENIQVJTRVRfRkxBR19TSElGVEpJUyA0CisjZGVmaW5lIENIQVJTRVRfRkxBR19CSUc1IDgKKyNkZWZpbmUgQ0hBUlNFVF9GTEFHX0dCIDE2CisjZGVmaW5lIENIQVJTRVRfRkxBR19LT1JFQU4gMzIKKworY2xhc3MgQ0ZYX0ZvbnRGYWNlSW5mbyB7CisgcHVibGljOgorICBDRlhfRm9udEZhY2VJbmZvKENGWF9CeXRlU3RyaW5nIGZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGZhY2VOYW1lLAorICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGZvbnRUYWJsZXMsCisgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZm9udE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxlU2l6ZSkKKyAgICAgIDogbV9GaWxlUGF0aChmaWxlUGF0aCksCisgICAgICAgIG1fRmFjZU5hbWUoZmFjZU5hbWUpLAorICAgICAgICBtX0ZvbnRUYWJsZXMoZm9udFRhYmxlcyksCisgICAgICAgIG1fRm9udE9mZnNldChmb250T2Zmc2V0KSwKKyAgICAgICAgbV9GaWxlU2l6ZShmaWxlU2l6ZSksCisgICAgICAgIG1fU3R5bGVzKDApLAorICAgICAgICBtX0NoYXJzZXRzKDApIHt9CisKKyAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcgbV9GaWxlUGF0aDsKKyAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcgbV9GYWNlTmFtZTsKKyAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcgbV9Gb250VGFibGVzOworICBjb25zdCBGWF9EV09SRCBtX0ZvbnRPZmZzZXQ7CisgIGNvbnN0IEZYX0RXT1JEIG1fRmlsZVNpemU7CisgIEZYX0RXT1JEIG1fU3R5bGVzOworICBGWF9EV09SRCBtX0NoYXJzZXRzOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX1NSQ19GWEdFX0dFX1RFWFRfSU5UX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL3NraWEvZnhfc2tpYV9ibGl0dGVyX25ldy5jcHAgYi9jb3JlL3NyYy9meGdlL3NraWEvZnhfc2tpYV9ibGl0dGVyX25ldy5jcHAKaW5kZXggYTEwNzQ4NS4uODUzOTFjYiAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfYmxpdHRlcl9uZXcuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2JsaXR0ZXJfbmV3LmNwcApAQCAtMiwxNjA5ICsyLDE4NDkgQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9nZS5oIgorCiAvLyNkZWZpbmUgX1NLSUFfU1VQUE9SVF8KICNpZiBkZWZpbmVkKF9TS0lBX1NVUFBPUlRfKQotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIgogI2luY2x1ZGUgIlNrQmxpdHRlci5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCiAjaW5jbHVkZSAiZnhfc2tpYV9ibGl0dGVyX25ldy5oIgotCS8vIFdlIHVzZSBvdXIgb3duIHJlbmRlcmVyIGhlcmUgdG8gbWFrZSBpdCBzaW1wbGUKLQl2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OmJsaXRBbnRpSChpbnQgeCwgaW50IHksIGNvbnN0IFNrQWxwaGEgYW50aWFsaWFzW10sIGNvbnN0IGludDE2X3QgcnVuc1tdKQotCXsKLQkJRlhTWVNfYXNzZXJ0KG1fQWxwaGEpOwotCQlpZiAobV9wT3JpRGV2aWNlID09IE5VTEwgJiYgY29tcG9zaXRlX3NwYW4gPT0gTlVMTCkgcmV0dXJuOwotCQlpZiAoeSA8IG1fQ2xpcEJveC50b3AgfHwgeSA+PSBtX0NsaXBCb3guYm90dG9tKSByZXR1cm47Ci0JCXdoaWxlICgxKQotCQl7Ci0JCQlpbnQgd2lkdGggPSBydW5zWzBdOwotCQkJU2tBU1NFUlQod2lkdGggPj0gMCk7Ci0JCQlpZiAod2lkdGggPD0gMCkgCi0JCQkJcmV0dXJuOwotCQkJdW5zaWduZWQgYWEgPSBhbnRpYWxpYXNbMF07Ci0JCQlpZiAoYWEpCi0JCQkJKHRoaXMtPipjb21wb3NpdGVfc3BhbikobV9wRGVzdFNjYW4sIG1fcE9yaVNjYW4sIDAsIHgsIHdpZHRoLCB5LCBhYSwgbV9DbGlwQm94LnRvcCwgbV9DbGlwQm94LmxlZnQsIG1fQ2xpcEJveC5yaWdodCwgbV9wQ2xpcFNjYW4sIG1fcERlc3RFeHRyYUFscGhhU2Nhbik7Ci0JCQlydW5zICs9IHdpZHRoOwotCQkJYW50aWFsaWFzICs9IHdpZHRoOwotCQkJeCArPSB3aWR0aDsKLQkJfQotCX0KIAotCXZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6YmxpdEgoaW50IHgsIGludCB5LCBpbnQgd2lkdGgpCi0JewotCQlGWFNZU19hc3NlcnQobV9BbHBoYSAmJiB3aWR0aCk7Ci0JCWlmICh5IDwgbV9DbGlwQm94LnRvcCB8fCB5ID49IG1fQ2xpcEJveC5ib3R0b20pIHJldHVybjsKLQkJKHRoaXMtPipjb21wb3NpdGVfc3BhbikobV9wRGVzdFNjYW4sIG1fcE9yaVNjYW4sIDAsIHgsIHdpZHRoLCB5LCAyNTUsIG1fQ2xpcEJveC50b3AsIG1fQ2xpcEJveC5sZWZ0LCBtX0NsaXBCb3gucmlnaHQsIG1fcENsaXBTY2FuLCBtX3BEZXN0RXh0cmFBbHBoYVNjYW4pOwotCX0KKy8vIFdlIHVzZSBvdXIgb3duIHJlbmRlcmVyIGhlcmUgdG8gbWFrZSBpdCBzaW1wbGUKK3ZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6YmxpdEFudGlIKGludCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTa0FscGhhIGFudGlhbGlhc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBydW5zW10pIHsKKyAgRlhTWVNfYXNzZXJ0KG1fQWxwaGEpOworICBpZiAoIW1fcE9yaURldmljZSAmJiAhY29tcG9zaXRlX3NwYW4pCisgICAgcmV0dXJuOworICBpZiAoeSA8IG1fQ2xpcEJveC50b3AgfHwgeSA+PSBtX0NsaXBCb3guYm90dG9tKQorICAgIHJldHVybjsKKyAgd2hpbGUgKDEpIHsKKyAgICBpbnQgd2lkdGggPSBydW5zWzBdOworICAgIFNrQVNTRVJUKHdpZHRoID49IDApOworICAgIGlmICh3aWR0aCA8PSAwKQorICAgICAgcmV0dXJuOworICAgIHVuc2lnbmVkIGFhID0gYW50aWFsaWFzWzBdOworICAgIGlmIChhYSkKKyAgICAgICgqY29tcG9zaXRlX3NwYW4pKG1fcERlc3RTY2FuLCBtX3BPcmlTY2FuLCAwLCB4LCB3aWR0aCwgeSwgYWEsCisgICAgICAgICAgICAgICAgICAgICAgICBtX0NsaXBCb3gudG9wLCBtX0NsaXBCb3gubGVmdCwgbV9DbGlwQm94LnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ2xpcFNjYW4sIG1fcERlc3RFeHRyYUFscGhhU2Nhbik7CisgICAgcnVucyArPSB3aWR0aDsKKyAgICBhbnRpYWxpYXMgKz0gd2lkdGg7CisgICAgeCArPSB3aWR0aDsKKyAgfQorfQogCi0Jdm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpibGl0VihpbnQgeCwgaW50IHksIGludCBoZWlnaHQsIFNrQWxwaGEgYWxwaGEpCi0JewotCQlGWFNZU19hc3NlcnQobV9BbHBoYSAmJiBhbHBoYSk7Ci0JCWlmIChhbHBoYSA9PSAyNTUpIHsKLQkJCXRoaXMtPmJsaXRSZWN0KHgsIHksIDEsIGhlaWdodCk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQxNl90IHJ1bnNbMl07Ci0JCQlydW5zWzBdID0gMTsKLQkJCXJ1bnNbMV0gPSAwOwotCQkJd2hpbGUgKC0taGVpZ2h0ID49IDApIHsKLQkJCQlpZiAoeSA+PSBtX0NsaXBCb3guYm90dG9tKQotCQkJCQlyZXR1cm47Ci0JCQkJdGhpcy0+YmxpdEFudGlIKHgsIHkgKyssICZhbHBoYSwgcnVucyk7Ci0JCQl9Ci0JCX0KLQl9Ci0Jdm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpibGl0UmVjdChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkKLQl7Ci0JCUZYU1lTX2Fzc2VydChtX0FscGhhICYmIHdpZHRoKTsKLQkJd2hpbGUgKC0taGVpZ2h0ID49IDApewotCQkJaWYgKHkgPj0gbV9DbGlwQm94LmJvdHRvbSkKLQkJCQlyZXR1cm47Ci0JCQlibGl0SCh4LCB5ICsrLCB3aWR0aCk7Ci0JCX0KLQl9Cit2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OmJsaXRIKGludCB4LCBpbnQgeSwgaW50IHdpZHRoKSB7CisgIEZYU1lTX2Fzc2VydChtX0FscGhhICYmIHdpZHRoKTsKKyAgaWYgKHkgPCBtX0NsaXBCb3gudG9wIHx8IHkgPj0gbV9DbGlwQm94LmJvdHRvbSkKKyAgICByZXR1cm47CisgICgqY29tcG9zaXRlX3NwYW4pKG1fcERlc3RTY2FuLCBtX3BPcmlTY2FuLCAwLCB4LCB3aWR0aCwgeSwgMjU1LCBtX0NsaXBCb3gudG9wLAorICAgICAgICAgICAgICAgICAgICBtX0NsaXBCb3gubGVmdCwgbV9DbGlwQm94LnJpZ2h0LCBtX3BDbGlwU2NhbiwKKyAgICAgICAgICAgICAgICAgICAgbV9wRGVzdEV4dHJhQWxwaGFTY2FuKTsKK30KIAotCXZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6YmxpdEFudGlSZWN0KGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa0FscGhhIGxlZnRBbHBoYSwgU2tBbHBoYSByaWdodEFscGhhKSAKLQl7Ci0JCWJsaXRWKHgrKywgeSwgaGVpZ2h0LCBsZWZ0QWxwaGEpOwotCQlpZiAod2lkdGggPiAwKSB7Ci0JCQlibGl0UmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLQkJCXggKz0gd2lkdGg7Ci0JCX0KLQkJYmxpdFYoeCwgeSwgaGVpZ2h0LCByaWdodEFscGhhKTsKLQl9Ci0JLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCXZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbjFicHBfMChGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUEJZVEUgb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCBGWF9CWVRFIGNvdmVyX3NjYW4sIAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgRlhfTFBCWVRFIGNsaXBfc2NhbiwgCi0JCQlGWF9MUEJZVEUgZGVzdF9leHRyYV9hbHBoYV9zY2FuKQotCXsKLQkJQVNTRVJUKCFtX2JSZ2JCeXRlT3JkZXIpOwotCQlBU1NFUlQoIW1fcERldmljZS0+SXNDbXlrSW1hZ2UoKSk7Ci0JCWRlc3Rfc2NhbiA9IChGWF9CWVRFKiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdC84OwotCQlpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLQkJaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotCQlpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkgcmV0dXJuOyAvLyBkbyBub3RoaW5nLgotCQlkZXN0X3NjYW4gKz0gY29sX3N0YXJ0Lzg7Cit2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OmJsaXRWKGludCB4LCBpbnQgeSwgaW50IGhlaWdodCwgU2tBbHBoYSBhbHBoYSkgeworICBGWFNZU19hc3NlcnQobV9BbHBoYSAmJiBhbHBoYSk7CisgIGlmIChhbHBoYSA9PSAyNTUpIHsKKyAgICBibGl0UmVjdCh4LCB5LCAxLCBoZWlnaHQpOworICB9IGVsc2UgeworICAgIGludDE2X3QgcnVuc1syXTsKKyAgICBydW5zWzBdID0gMTsKKyAgICBydW5zWzFdID0gMDsKKyAgICB3aGlsZSAoLS1oZWlnaHQgPj0gMCkgeworICAgICAgaWYgKHkgPj0gbV9DbGlwQm94LmJvdHRvbSkKKyAgICAgICAgcmV0dXJuOworICAgICAgYmxpdEFudGlIKHgsIHkrKywgJmFscGhhLCBydW5zKTsKKyAgICB9CisgIH0KK30KK3ZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6YmxpdFJlY3QoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgRlhTWVNfYXNzZXJ0KG1fQWxwaGEgJiYgd2lkdGgpOworICB3aGlsZSAoLS1oZWlnaHQgPj0gMCkgeworICAgIGlmICh5ID49IG1fQ2xpcEJveC5ib3R0b20pCisgICAgICByZXR1cm47CisgICAgYmxpdEgoeCwgeSsrLCB3aWR0aCk7CisgIH0KK30KIAotCQlpbnQgaW5kZXggPSAwOwotCQlpZiAobV9wRGV2aWNlLT5HZXRQYWxldHRlKCkgPT0gTlVMTCkgCi0JCQlpbmRleCA9ICgoRlhfQllURSltX0NvbG9yID09IDB4ZmYpID8gMSA6IDA7Ci0JCWVsc2UgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpICsrKQotCQkJCWlmIChGWEFSR0JfVE9ESUIobV9wRGV2aWNlLT5HZXRQYWxldHRlKClbaV0pID09IG1fQ29sb3IpIAotCQkJCQlpbmRleCA9IGk7Ci0JCX0gCi0JCUZYX0xQQllURSBkZXN0X3NjYW4xID0gZGVzdF9zY2FuOwotCQlpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gLyAyNTU7Ci0JCWZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0JCQlpZiAoc3JjX2FscGhhKSB7Ci0JCQkJaWYgKCFpbmRleCkKLQkJCQkJKmRlc3Rfc2NhbjEgJj0gfigxIDw8ICg3IC0gKGNvbCtzcGFuX2xlZnQpJTgpKTsKLQkJCQllbHNlCi0JCQkJCSpkZXN0X3NjYW4xfD0gMSA8PCAoNyAtIChjb2wrc3Bhbl9sZWZ0KSU4KTsKLQkJCX0gCi0JCQlkZXN0X3NjYW4xID0gZGVzdF9zY2FuKyhzcGFuX2xlZnQlOCtjb2wtY29sX3N0YXJ0KzEpLzg7Ci0JCX0KLQl9Ci0Jdm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuMWJwcF80KEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQllURSBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIEZYX0JZVEUgY292ZXJfc2NhbiwgCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCBGWF9MUEJZVEUgY2xpcF9zY2FuLCAKLQkJCUZYX0xQQllURSBkZXN0X2V4dHJhX2FscGhhX3NjYW4pCi0JewotCQlBU1NFUlQoIW1fYlJnYkJ5dGVPcmRlcik7Ci0JCUFTU0VSVCghbV9wRGV2aWNlLT5Jc0NteWtJbWFnZSgpKTsKLQkJZGVzdF9zY2FuID0gKEZYX0JZVEUqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgc3Bhbl9sZWZ0Lzg7Ci0JCWNsaXBfc2NhbiA9IChGWF9CWVRFKiltX3BDbGlwTWFzay0+R2V0U2NhbmxpbmUoc3Bhbl90b3AtY2xpcF90b3ApIC0gY2xpcF9sZWZ0ICsgc3Bhbl9sZWZ0OwotCQlpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLQkJaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotCQlpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkgcmV0dXJuOyAvLyBkbyBub3RoaW5nLgotCQlkZXN0X3NjYW4gKz0gY29sX3N0YXJ0Lzg7Cit2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OmJsaXRBbnRpUmVjdChpbnQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrQWxwaGEgbGVmdEFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tBbHBoYSByaWdodEFscGhhKSB7CisgIGJsaXRWKHgrKywgeSwgaGVpZ2h0LCBsZWZ0QWxwaGEpOworICBpZiAod2lkdGggPiAwKSB7CisgICAgYmxpdFJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCk7CisgICAgeCArPSB3aWR0aDsKKyAgfQorICBibGl0Vih4LCB5LCBoZWlnaHQsIHJpZ2h0QWxwaGEpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuMWJwcF8wKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgeworICBBU1NFUlQoIW1fYlJnYkJ5dGVPcmRlcik7CisgIEFTU0VSVCghbV9wRGV2aWNlLT5Jc0NteWtJbWFnZSgpKTsKKyAgZGVzdF9zY2FuID0gKHVpbnQ4X3QqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgc3Bhbl9sZWZ0IC8gODsKKyAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7CisgIGludCBjb2xfZW5kID0KKyAgICAgIChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7CisgIGlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KQorICAgIHJldHVybjsgIC8vIGRvIG5vdGhpbmcuCisgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgLyA4OwogCi0JCWludCBpbmRleCA9IDA7Ci0JCWlmIChtX3BEZXZpY2UtPkdldFBhbGV0dGUoKSA9PSBOVUxMKSAKLQkJCWluZGV4ID0gKChGWF9CWVRFKW1fQ29sb3IgPT0gMHhmZikgPyAxIDogMDsKLQkJZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkgKyspCi0JCQkJaWYgKEZYQVJHQl9UT0RJQihtX3BEZXZpY2UtPkdldFBhbGV0dGUoKVtpXSkgPT0gbV9Db2xvcikgCi0JCQkJCWluZGV4ID0gaTsKLQkJfSAKLQkJRlhfTFBCWVRFIGRlc3Rfc2NhbjEgPSBkZXN0X3NjYW47Ci0JCWludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKLQkJZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLQkJCWludCBzcmNfYWxwaGExID0gc3JjX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0JCQlpZiAoc3JjX2FscGhhMSkgewotCQkJCWlmICghaW5kZXgpCi0JCQkJCSpkZXN0X3NjYW4xICY9IH4oMSA8PCAoNyAtIChjb2wrc3Bhbl9sZWZ0KSU4KSk7Ci0JCQkJZWxzZQotCQkJCQkqZGVzdF9zY2FuMXw9IDEgPDwgKDcgLSAoY29sK3NwYW5fbGVmdCklOCk7Ci0JCQl9IAotCQkJZGVzdF9zY2FuMSA9IGRlc3Rfc2Nhbisoc3Bhbl9sZWZ0JTgrY29sLWNvbF9zdGFydCsxKS84OwotCQl9Ci0JfQotCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCXZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkdyYXlfMihGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUEJZVEUgb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCBGWF9CWVRFIGNvdmVyX3NjYW4sIAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgRlhfTFBCWVRFIGNsaXBfc2NhbiwgCi0JCQlGWF9MUEJZVEUgZGVzdF9leHRyYV9hbHBoYV9zY2FuKQotCXsKLQkJQVNTRVJUKCFtX3BEZXZpY2UtPklzQ215a0ltYWdlKCkpOwotCQlBU1NFUlQoIW1fYlJnYkJ5dGVPcmRlcik7Ci0JCWRlc3Rfc2NhbiA9IChGWF9CWVRFKiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdDsKLQkJaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7Ci0JCWludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKLQkJaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpIHJldHVybjsgLy8gZG8gbm90aGluZy4KLQkJZGVzdF9zY2FuICs9IGNvbF9zdGFydDsKLQkJaWYgKGNvdmVyX3NjYW4gPT0gMjU1ICYmIG1fQWxwaGEgPT0gMjU1KSB7Ci0JCQlGWFNZU19tZW1zZXQzMihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKG1fR3JheSwgbV9HcmF5LCBtX0dyYXksIG1fR3JheSksIGNvbF9lbmQgLSBjb2xfc3RhcnQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKLQkJZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyYXksIHNyY19hbHBoYSk7Ci0JCQlkZXN0X3NjYW4rKzsKLQkJfQotCX0KLQl2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5HcmF5XzMoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBCWVRFIG9yaV9zY2FuLGludCBCcHAsCi0JCQlpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgRlhfQllURSBjb3Zlcl9zY2FuLCAKLQkJCWludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIEZYX0xQQllURSBjbGlwX3NjYW4sIAotCQkJRlhfTFBCWVRFIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikKLQl7Ci0JCUFTU0VSVCghbV9wRGV2aWNlLT5Jc0NteWtJbWFnZSgpKTsKLQkJQVNTRVJUKCFtX2JSZ2JCeXRlT3JkZXIpOwotCQlkZXN0X3NjYW4gPSAoRlhfQllURSopbV9wRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyBzcGFuX2xlZnQ7Ci0JCW9yaV9zY2FuICA9IChGWF9CWVRFKiltX3BPcmlEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdDsKLQkJaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7Ci0JCWludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKLQkJaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpIHJldHVybjsgLy8gZG8gbm90aGluZy4KLQkJZGVzdF9zY2FuICs9IGNvbF9zdGFydDsKLQkJb3JpX3NjYW4gKz0gY29sX3N0YXJ0OwotCQlpZiAobV9BbHBoYSA9PSAyNTUgJiYgY292ZXJfc2NhbiA9PSAyNTUpIHsKLQkJCUZYU1lTX21lbXNldDMyKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0UobV9HcmF5LCBtX0dyYXksIG1fR3JheSwgbV9HcmF5KSwgY29sX2VuZCAtIGNvbF9zdGFydCk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgc3JjX2FscGhhID0gbV9BbHBoYTsKKyAgaW50IGluZGV4ID0gMDsKKyAgaWYgKG1fcERldmljZS0+R2V0UGFsZXR0ZSgpKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgIGlmIChGWEFSR0JfVE9ESUIobV9wRGV2aWNlLT5HZXRQYWxldHRlKClbaV0pID09IG1fQ29sb3IpCisgICAgICAgIGluZGV4ID0gaTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW5kZXggPSAoKHVpbnQ4X3QpbV9Db2xvciA9PSAweGZmKSA/IDEgOiAwOworICB9CisgIHVpbnQ4X3QqIGRlc3Rfc2NhbjEgPSBkZXN0X3NjYW47CisgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKKyAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgIGlmICghaW5kZXgpCisgICAgICAgICpkZXN0X3NjYW4xICY9IH4oMSA8PCAoNyAtIChjb2wgKyBzcGFuX2xlZnQpICUgOCkpOworICAgICAgZWxzZQorICAgICAgICAqZGVzdF9zY2FuMSB8PSAxIDw8ICg3IC0gKGNvbCArIHNwYW5fbGVmdCkgJSA4KTsKKyAgICB9CisgICAgZGVzdF9zY2FuMSA9IGRlc3Rfc2NhbiArIChzcGFuX2xlZnQgJSA4ICsgY29sIC0gY29sX3N0YXJ0ICsgMSkgLyA4OworICB9Cit9Cit2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW4xYnBwXzQodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7CisgIEFTU0VSVCghbV9iUmdiQnl0ZU9yZGVyKTsKKyAgQVNTRVJUKCFtX3BEZXZpY2UtPklzQ215a0ltYWdlKCkpOworICBkZXN0X3NjYW4gPSAodWludDhfdCopbV9wRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyBzcGFuX2xlZnQgLyA4OworICBjbGlwX3NjYW4gPSAodWludDhfdCopbV9wQ2xpcE1hc2stPkdldFNjYW5saW5lKHNwYW5fdG9wIC0gY2xpcF90b3ApIC0KKyAgICAgICAgICAgICAgY2xpcF9sZWZ0ICsgc3Bhbl9sZWZ0OworICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKKyAgaW50IGNvbF9lbmQgPQorICAgICAgKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKKyAgaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpCisgICAgcmV0dXJuOyAgLy8gZG8gbm90aGluZy4KKyAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCAvIDg7CisKKyAgaW50IGluZGV4ID0gMDsKKyAgaWYgKG1fcERldmljZS0+R2V0UGFsZXR0ZSgpKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgIGlmIChGWEFSR0JfVE9ESUIobV9wRGV2aWNlLT5HZXRQYWxldHRlKClbaV0pID09IG1fQ29sb3IpCisgICAgICAgIGluZGV4ID0gaTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW5kZXggPSAoKHVpbnQ4X3QpbV9Db2xvciA9PSAweGZmKSA/IDEgOiAwOworICB9CisgIHVpbnQ4X3QqIGRlc3Rfc2NhbjEgPSBkZXN0X3NjYW47CisgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKKyAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgIGludCBzcmNfYWxwaGExID0gc3JjX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgaWYgKHNyY19hbHBoYTEpIHsKKyAgICAgIGlmICghaW5kZXgpCisgICAgICAgICpkZXN0X3NjYW4xICY9IH4oMSA8PCAoNyAtIChjb2wgKyBzcGFuX2xlZnQpICUgOCkpOworICAgICAgZWxzZQorICAgICAgICAqZGVzdF9zY2FuMSB8PSAxIDw8ICg3IC0gKGNvbCArIHNwYW5fbGVmdCkgJSA4KTsKKyAgICB9CisgICAgZGVzdF9zY2FuMSA9IGRlc3Rfc2NhbiArIChzcGFuX2xlZnQgJSA4ICsgY29sIC0gY29sX3N0YXJ0ICsgMSkgLyA4OworICB9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkdyYXlfMih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKKyAgQVNTRVJUKCFtX3BEZXZpY2UtPklzQ215a0ltYWdlKCkpOworICBBU1NFUlQoIW1fYlJnYkJ5dGVPcmRlcik7CisgIGRlc3Rfc2NhbiA9ICh1aW50OF90KiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdDsKKyAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7CisgIGludCBjb2xfZW5kID0KKyAgICAgIChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7CisgIGlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KQorICAgIHJldHVybjsgIC8vIGRvIG5vdGhpbmcuCisgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQ7CisgIGlmIChjb3Zlcl9zY2FuID09IDI1NSAmJiBtX0FscGhhID09IDI1NSkgeworICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKG1fR3JheSwgbV9HcmF5LCBtX0dyYXksIG1fR3JheSksCisgICAgICAgICAgICAgICAgIGNvbF9lbmQgLSBjb2xfc3RhcnQpOworICAgIHJldHVybjsKKyAgfQorICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gLyAyNTU7CisgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmF5LCBzcmNfYWxwaGEpOworICAgIGRlc3Rfc2NhbisrOworICB9Cit9Cit2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5HcmF5XzModWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7CisgIEFTU0VSVCghbV9wRGV2aWNlLT5Jc0NteWtJbWFnZSgpKTsKKyAgQVNTRVJUKCFtX2JSZ2JCeXRlT3JkZXIpOworICBkZXN0X3NjYW4gPSAodWludDhfdCopbV9wRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyBzcGFuX2xlZnQ7CisgIG9yaV9zY2FuID0gKHVpbnQ4X3QqKW1fcE9yaURldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgc3Bhbl9sZWZ0OworICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKKyAgaW50IGNvbF9lbmQgPQorICAgICAgKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKKyAgaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpCisgICAgcmV0dXJuOyAgLy8gZG8gbm90aGluZy4KKyAgZGVzdF9zY2FuICs9IGNvbF9zdGFydDsKKyAgb3JpX3NjYW4gKz0gY29sX3N0YXJ0OworICBpZiAobV9BbHBoYSA9PSAyNTUgJiYgY292ZXJfc2NhbiA9PSAyNTUpIHsKKyAgICBGWFNZU19tZW1zZXQoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShtX0dyYXksIG1fR3JheSwgbV9HcmF5LCBtX0dyYXkpLAorICAgICAgICAgICAgICAgICBjb2xfZW5kIC0gY29sX3N0YXJ0KTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYTsKICNpZiAxCi0JCQlmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotCQkJCWludCBncmF5ID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JheSwgc3JjX2FscGhhKTsKLQkJCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgY292ZXJfc2Nhbik7Ci0JCQkJZGVzdF9zY2FuICsrOwotCQkJfQorICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgIGludCBncmF5ID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JheSwgc3JjX2FscGhhKTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBjb3Zlcl9zY2FuKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgIH0KICNlbHNlCi0JCQlpZiAobV9iRnVsbENvdmVyKSB7Ci0JCQkJaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLQkJCQkJRlhTWVNfbWVtc2V0KGRlc3Rfc2NhbiwgRlhBUkdCX01BS0UobV9HcmF5LCBtX0dyYXksIG1fR3JheSwgbV9HcmF5KSwgY29sX2VuZCAtIGNvbF9zdGFydCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspCi0JCQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmF5LCBzcmNfYWxwaGEpOwotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotCQkJCQlpbnQgZ3JheSA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyYXksIHNyY19hbHBoYSk7Ci0JCQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBjb3Zlcl9zY2FuKTsKLQkJCQkJZGVzdF9zY2FuKys7Ci0JCQkJfQotCQkJfQorICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKG1fR3JheSwgbV9HcmF5LCBtX0dyYXksIG1fR3JheSksCisgICAgICAgICAgICAgICAgICAgICBjb2xfZW5kIC0gY29sX3N0YXJ0KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyYXksIHNyY19hbHBoYSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgICAgaW50IGdyYXkgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmF5LCBzcmNfYWxwaGEpOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgY292ZXJfc2Nhbik7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgfQorICAgIH0KICNlbmRpZgotCQl9Ci0JfQorICB9Cit9CiAKLQl2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5HcmF5XzYoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBCWVRFIG9yaV9zY2FuLGludCBCcHAsCi0JCQlpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgRlhfQllURSBjb3Zlcl9zY2FuLCAKLQkJCWludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIEZYX0xQQllURSBjbGlwX3NjYW4sIAotCQkJRlhfTFBCWVRFIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikKLQl7Ci0JCUFTU0VSVCghbV9iUmdiQnl0ZU9yZGVyKTsKLQkJZGVzdF9zY2FuID0gKEZYX0JZVEUqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgc3Bhbl9sZWZ0OwotCQljbGlwX3NjYW4gPSAoRlhfQllURSopbV9wQ2xpcE1hc2stPkdldFNjYW5saW5lKHNwYW5fdG9wLWNsaXBfdG9wKSAtIGNsaXBfbGVmdCArIHNwYW5fbGVmdDsKLQkJaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7Ci0JCWludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKLQkJaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpIHJldHVybjsgLy8gZG8gbm90aGluZy4KLQkJZGVzdF9zY2FuICs9IGNvbF9zdGFydDsKLQkJaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OwotCQlmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotCQkJaW50IHNyY19hbHBoYTEgPSBzcmNfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLQkJCWlmICghc3JjX2FscGhhMSkgewotCQkJCWRlc3Rfc2NhbiArKzsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChzcmNfYWxwaGExID09IDI1NSkKLQkJCQkqZGVzdF9zY2FuKysgPSBtX0dyYXk7Ci0JCQllbHNlIHsKLQkJCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmF5LCBzcmNfYWxwaGExKTsKLQkJCQlkZXN0X3NjYW4gKys7Ci0JCQl9Ci0JCX0JCi0JfQordm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuR3JheV82KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgeworICBBU1NFUlQoIW1fYlJnYkJ5dGVPcmRlcik7CisgIGRlc3Rfc2NhbiA9ICh1aW50OF90KiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdDsKKyAgY2xpcF9zY2FuID0gKHVpbnQ4X3QqKW1fcENsaXBNYXNrLT5HZXRTY2FubGluZShzcGFuX3RvcCAtIGNsaXBfdG9wKSAtCisgICAgICAgICAgICAgIGNsaXBfbGVmdCArIHNwYW5fbGVmdDsKKyAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7CisgIGludCBjb2xfZW5kID0KKyAgICAgIChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7CisgIGlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KQorICAgIHJldHVybjsgIC8vIGRvIG5vdGhpbmcuCisgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQ7CisgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKKyAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgIGludCBzcmNfYWxwaGExID0gc3JjX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgaWYgKCFzcmNfYWxwaGExKSB7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoc3JjX2FscGhhMSA9PSAyNTUpCisgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyYXk7CisgICAgZWxzZSB7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmF5LCBzcmNfYWxwaGExKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgIH0KKyAgfQorfQogCi0Jdm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuR3JheV83KEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQllURSBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIEZYX0JZVEUgY292ZXJfc2NhbiwgCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCBGWF9MUEJZVEUgY2xpcF9zY2FuLCAKLQkJCUZYX0xQQllURSBkZXN0X2V4dHJhX2FscGhhX3NjYW4pCi0JewotCQlBU1NFUlQoIW1fcERldmljZS0+SXNDbXlrSW1hZ2UoKSk7Ci0JCWRlc3Rfc2NhbiA9IChGWF9CWVRFKiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdDsKLQkJb3JpX3NjYW4gID0gKEZYX0JZVEUqKW1fcE9yaURldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgc3Bhbl9sZWZ0OwotCQljbGlwX3NjYW4gPSAoRlhfQllURSopbV9wQ2xpcE1hc2stPkdldFNjYW5saW5lKHNwYW5fdG9wLWNsaXBfdG9wKSAtIGNsaXBfbGVmdCArIHNwYW5fbGVmdDsKLQkJaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7Ci0JCWludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKLQkJaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpIHJldHVybjsgLy8gZG8gbm90aGluZy4KLQkJZGVzdF9zY2FuICs9IGNvbF9zdGFydDsKLQkJb3JpX3NjYW4gKz0gY29sX3N0YXJ0Owordm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuR3JheV83KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgeworICBBU1NFUlQoIW1fcERldmljZS0+SXNDbXlrSW1hZ2UoKSk7CisgIGRlc3Rfc2NhbiA9ICh1aW50OF90KiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdDsKKyAgb3JpX3NjYW4gPSAodWludDhfdCopbV9wT3JpRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyBzcGFuX2xlZnQ7CisgIGNsaXBfc2NhbiA9ICh1aW50OF90KiltX3BDbGlwTWFzay0+R2V0U2NhbmxpbmUoc3Bhbl90b3AgLSBjbGlwX3RvcCkgLQorICAgICAgICAgICAgICBjbGlwX2xlZnQgKyBzcGFuX2xlZnQ7CisgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOworICBpbnQgY29sX2VuZCA9CisgICAgICAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOworICBpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkKKyAgICByZXR1cm47ICAvLyBkbyBub3RoaW5nLgorICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0OworICBvcmlfc2NhbiArPSBjb2xfc3RhcnQ7CiAjaWYgMQotCQlmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotCQkJaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLQkJCWlmIChzcmNfYWxwaGEgPT0gMjU1ICYmIGNvdmVyX3NjYW4gPT0gMjU1KSB7Ci0JCQkJKmRlc3Rfc2NhbisrID0gbV9HcmF5OwotCQkJCW9yaV9zY2FuKys7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpbnQgZ3JheSA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyYXksIHNyY19hbHBoYSk7Ci0JCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgY292ZXJfc2Nhbik7Ci0JCQlkZXN0X3NjYW4rKzsKLQkJfQorICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICBpZiAoc3JjX2FscGhhID09IDI1NSAmJiBjb3Zlcl9zY2FuID09IDI1NSkgeworICAgICAgKmRlc3Rfc2NhbisrID0gbV9HcmF5OworICAgICAgb3JpX3NjYW4rKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgZ3JheSA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyYXksIHNyY19hbHBoYSk7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGNvdmVyX3NjYW4pOworICAgIGRlc3Rfc2NhbisrOworICB9CiAKICNlbHNlCi0JCWlmIChtX2JGdWxsQ292ZXIpIHsKLQkJCWZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0JCQkJaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLQkJCQlpZiAoIXNyY19hbHBoYSkgewotCQkJCQlkZXN0X3NjYW4rKzsKLQkJCQkJb3JpX3NjYW4rKzsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChzcmNfYWxwaGEgPT0gMjU1KXsKLQkJCQkJKmRlc3Rfc2NhbisrID0gbV9HcmF5OwotCQkJCQlvcmlfc2NhbisrOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JheSwgc3JjX2FscGhhKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0JCQkJaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLQkJCQlpZiAoc3JjX2FscGhhID09IDI1NSAmJiBjb3Zlcl9zY2FuID09IDI1NSkgewotCQkJCQkqZGVzdF9zY2FuKysgPSBtX0dyYXk7Ci0JCQkJCW9yaV9zY2FuKys7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpbnQgZ3JheSA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyYXksIHNyY19hbHBoYSk7Ci0JCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGNvdmVyX3NjYW4pOwotCQkJCWRlc3Rfc2NhbisrOwotCQkJfQotCQl9CisgIGlmIChtX2JGdWxsQ292ZXIpIHsKKyAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgICAgaWYgKCFzcmNfYWxwaGEpIHsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIG9yaV9zY2FuKys7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9HcmF5OworICAgICAgICBvcmlfc2NhbisrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgICpkZXN0X3NjYW4rKyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyYXksIHNyY19hbHBoYSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSAmJiBjb3Zlcl9zY2FuID09IDI1NSkgeworICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyYXk7CisgICAgICAgIG9yaV9zY2FuKys7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaW50IGdyYXkgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmF5LCBzcmNfYWxwaGEpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGNvdmVyX3NjYW4pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgfQorICB9CiAjZW5kaWYKLQl9Ci0JLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotCXZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkFSR0JfMihGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUEJZVEUgb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCBGWF9CWVRFIGNvdmVyX3NjYW4sIAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgRlhfTFBCWVRFIGNsaXBfc2NhbiwgCi0JCQlGWF9MUEJZVEUgZGVzdF9leHRyYV9hbHBoYV9zY2FuKQotCXsKLQkJZGVzdF9zY2FuID0gKEZYX0JZVEUqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgKHNwYW5fbGVmdDw8Mik7Ci0JCWludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOwotCQlpbnQgY29sX2VuZCA9IChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7Ci0JCWlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KSByZXR1cm47IC8vIGRvIG5vdGhpbmcuCi0JCWRlc3Rfc2NhbiArPSBjb2xfc3RhcnQ8PDI7Ci0JCWlmIChtX0FscGhhID09IDI1NSAmJiBjb3Zlcl9zY2FuID09IDI1NSkgewotCQkJRlhTWVNfbWVtc2V0MzIoZGVzdF9zY2FuLCBtX0NvbG9yLCAoY29sX2VuZCAtIGNvbF9zdGFydCk8PDIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBzcmNfYWxwaGE7Cit2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5BUkdCXzIodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7CisgIGRlc3Rfc2NhbiA9ICh1aW50OF90KiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIChzcGFuX2xlZnQgPDwgMik7CisgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOworICBpbnQgY29sX2VuZCA9CisgICAgICAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOworICBpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkKKyAgICByZXR1cm47ICAvLyBkbyBub3RoaW5nLgorICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0IDw8IDI7CisgIGlmIChtX0FscGhhID09IDI1NSAmJiBjb3Zlcl9zY2FuID09IDI1NSkgeworICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW4sIG1fQ29sb3IsIChjb2xfZW5kIC0gY29sX3N0YXJ0KSA8PCAyKTsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IHNyY19hbHBoYTsKICNpZiAwCi0JCWlmIChtX2JGdWxsQ292ZXIpIHsKLQkJCWlmIChtX0FscGhhID09IDI1NSkgewotCQkJCUZYU1lTX21lbXNldDMyKGRlc3Rfc2NhbiwgbV9Db2xvciwgKGNvbF9lbmQgLSBjb2xfc3RhcnQpPDwyKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJZWxzZSAKKyAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgeworICAgICAgICAgICAgaWYgKG1fQWxwaGEgPT0gMjU1KSB7CisgICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0KGRlc3Rfc2NhbiwgbV9Db2xvciwgKGNvbF9lbmQgLSBjb2xfc3RhcnQpPDwyKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQogI2VuZGlmCi0JCQlzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKLQkJZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLQkJCS8vIERlc3QgZm9ybWF0OiBBcmdiCi0JCQkvLyBjYWxjdWxhdGUgZGVzdGluYXRpb24gYWxwaGEgKGl0J3MgdW5pb24gb2Ygc291cmNlIGFuZCBkZXN0IGFscGhhKQotCQkJaWYgKGRlc3Rfc2NhblszXSA9PSAwKSB7Ci0JCQkJZGVzdF9zY2FuWzNdID0gc3JjX2FscGhhOwotCQkJCSpkZXN0X3NjYW4rKyA9IG1fQmx1ZTsKLQkJCQkqZGVzdF9zY2FuKysgPSBtX0dyZWVuOwotCQkJCSpkZXN0X3NjYW4gPSBtX1JlZDsKLQkJCQlkZXN0X3NjYW4gKz0gMjsgCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlGWF9CWVRFIGRlc3RfYWxwaGEgPSBkZXN0X3NjYW5bM10gKyBzcmNfYWxwaGEgLSBkZXN0X3NjYW5bM10gKiBzcmNfYWxwaGEgLyAyNTU7Ci0JCQlkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOwotCQkJaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhKjI1NS9kZXN0X2FscGhhOwotCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOwotCQkJZGVzdF9zY2FuICsrOwotCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKLQkJCWRlc3Rfc2NhbiArKzsKLQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgYWxwaGFfcmF0aW8pOwotCQkJZGVzdF9zY2FuICs9IDI7Ci0JCX0KLQl9CisgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OworICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgLy8gRGVzdCBmb3JtYXQ6IEFyZ2IKKyAgICAvLyBjYWxjdWxhdGUgZGVzdGluYXRpb24gYWxwaGEgKGl0J3MgdW5pb24gb2Ygc291cmNlIGFuZCBkZXN0IGFscGhhKQorICAgIGlmIChkZXN0X3NjYW5bM10gPT0gMCkgeworICAgICAgZGVzdF9zY2FuWzNdID0gc3JjX2FscGhhOworICAgICAgKmRlc3Rfc2NhbisrID0gbV9CbHVlOworICAgICAgKmRlc3Rfc2NhbisrID0gbV9HcmVlbjsKKyAgICAgICpkZXN0X3NjYW4gPSBtX1JlZDsKKyAgICAgIGRlc3Rfc2NhbiArPSAyOworICAgICAgY29udGludWU7CisgICAgfQorICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9CisgICAgICAgIGRlc3Rfc2NhblszXSArIHNyY19hbHBoYSAtIGRlc3Rfc2NhblszXSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOworICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhbisrOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7CisgICAgZGVzdF9zY2FuKys7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7CisgICAgZGVzdF9zY2FuICs9IDI7CisgIH0KK30KIAotCXZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkFSR0JfMyhGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUEJZVEUgb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCBGWF9CWVRFIGNvdmVyX3NjYW4sIAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgRlhfTFBCWVRFIGNsaXBfc2NhbiwgCi0JCQlGWF9MUEJZVEUgZGVzdF9leHRyYV9hbHBoYV9zY2FuKQotCXsKLQkJQVNTRVJUKCFtX3BEZXZpY2UtPklzQ215a0ltYWdlKCkpOwotCQlkZXN0X3NjYW4gPSAoRlhfQllURSopbV9wRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyAoc3Bhbl9sZWZ0PDwyKTsKLQkJLy9vcmlfc2NhbiAgPSAoRlhfQllURSopbV9wT3JpRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyAoc3Bhbl9sZWZ0PDwyKTsKLQkJaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7Ci0JCWludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKLQkJaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpIHJldHVybjsgLy8gZG8gbm90aGluZy4KLQkJZGVzdF9zY2FuICs9IGNvbF9zdGFydCA8PCAyOwotCQkvL29yaV9zY2FuICs9IGNvbF9zdGFydCA8PCAyOwordm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuQVJHQl8zKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgeworICBBU1NFUlQoIW1fcERldmljZS0+SXNDbXlrSW1hZ2UoKSk7CisgIGRlc3Rfc2NhbiA9ICh1aW50OF90KiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIChzcGFuX2xlZnQgPDwgMik7CisgIC8vIG9yaV9zY2FuICA9ICh1aW50OF90KiltX3BPcmlEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIChzcGFuX2xlZnQ8PDIpOworICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKKyAgaW50IGNvbF9lbmQgPQorICAgICAgKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKKyAgaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpCisgICAgcmV0dXJuOyAgLy8gZG8gbm90aGluZy4KKyAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCA8PCAyOworICAvLyBvcmlfc2NhbiArPSBjb2xfc3RhcnQgPDwgMjsKIAotCQlpZiAobV9BbHBoYSA9PSAyNTUgJiYgY292ZXJfc2NhbiA9PSAyNTUpewotCQkJRlhTWVNfbWVtc2V0MzIoZGVzdF9zY2FuLCBtX0NvbG9yLCAoY29sX2VuZCAtIGNvbF9zdGFydCk8PDIpOwotCQkJcmV0dXJuOwotCQl9CQkKLQkJaWYgKGNvdmVyX3NjYW4gPT0gMjU1KSB7Ci0JCQlpbnQgZHN0X2NvbG9yID0gKDB4MDBmZmZmZmYmbV9Db2xvcil8KG1fQWxwaGE8PDI0KTsKLQkJCUZYU1lTX21lbXNldDMyKGRlc3Rfc2NhbiwgZHN0X2NvbG9yLCAoY29sX2VuZCAtIGNvbF9zdGFydCk8PDIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIERvIG5vdCBuZWVkIG9yaWdpbiBiaXRtYXAsIGJlY2F1c2Ugb2YgbWVyZ2UgaW4gcHVyZSB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kCi0JCWludCBzcmNfYWxwaGFfY292ZXJlZCA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OwotCQlmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgCi0JCXsKLQkJCS8vIHNob3J0Y3V0Ci0JCQlpZiAoZGVzdF9zY2FuWzNdID09IDApIHsKLQkJCQlkZXN0X3NjYW5bM10gPSBzcmNfYWxwaGFfY292ZXJlZDsKLQkJCQkqZGVzdF9zY2FuICsrID0gbV9CbHVlOwotCQkJCSpkZXN0X3NjYW4gKysgPSBtX0dyZWVuOwotCQkJCSpkZXN0X3NjYW4gPSBtX1JlZDsKLQkJCQlkZXN0X3NjYW4gKz0gMjsgCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkvLyBXZSBzaG91bGQgZG8gYWxwaGEgdHJhbnNpdGlvbiBhbmQgY29sb3IgdHJhbnNpdGlvbgotCQkJLy8gYWxwaGEgZmcgICAgICAgICAgY29sb3IgZmcKLQkJCS8vIGFscGhhIGJnICAgICAgICAgIGNvbG9yIGJnCi0JCQkvLyBhbHBoYSBjb3ZlciAgICAgICBjb2xvciBjb3ZlcgotCQkJZGVzdF9zY2FuWzNdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzNdLCBtX0FscGhhLCBjb3Zlcl9zY2FuKTsKLQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGNvdmVyX3NjYW4pOwotCQkJZGVzdF9zY2FuICsrOwotCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGNvdmVyX3NjYW4pOwotCQkJZGVzdF9zY2FuICsrOwotCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBjb3Zlcl9zY2FuKTsKLQkJCWRlc3Rfc2NhbiArPSAyOwotCQl9Ci0JfQotCXZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkFSR0JfNihGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUEJZVEUgb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCBGWF9CWVRFIGNvdmVyX3NjYW4sIAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgRlhfTFBCWVRFIGNsaXBfc2NhbiwgCi0JCQlGWF9MUEJZVEUgZGVzdF9leHRyYV9hbHBoYV9zY2FuKQotCXsKLQkJZGVzdF9zY2FuID0gKEZYX0JZVEUqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgKHNwYW5fbGVmdDw8Mik7Ci0JCWNsaXBfc2NhbiA9IChGWF9CWVRFKiltX3BDbGlwTWFzay0+R2V0U2NhbmxpbmUoc3Bhbl90b3AtY2xpcF90b3ApIC0gY2xpcF9sZWZ0ICsgc3Bhbl9sZWZ0OwotCQlpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLQkJaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotCQlpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkgcmV0dXJuOyAvLyBkbyBub3RoaW5nLgotCQlkZXN0X3NjYW4gKz0gY29sX3N0YXJ0IDw8IDI7CisgIGlmIChtX0FscGhhID09IDI1NSAmJiBjb3Zlcl9zY2FuID09IDI1NSkgeworICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW4sIG1fQ29sb3IsIChjb2xfZW5kIC0gY29sX3N0YXJ0KSA8PCAyKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGNvdmVyX3NjYW4gPT0gMjU1KSB7CisgICAgaW50IGRzdF9jb2xvciA9ICgweDAwZmZmZmZmICYgbV9Db2xvcikgfCAobV9BbHBoYSA8PCAyNCk7CisgICAgRlhTWVNfbWVtc2V0KGRlc3Rfc2NhbiwgZHN0X2NvbG9yLCAoY29sX2VuZCAtIGNvbF9zdGFydCkgPDwgMik7CisgICAgcmV0dXJuOworICB9CisgIC8vIERvIG5vdCBuZWVkIG9yaWdpbiBiaXRtYXAsIGJlY2F1c2Ugb2YgbWVyZ2UgaW4gcHVyZSB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kCisgIGludCBzcmNfYWxwaGFfY292ZXJlZCA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OworICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgLy8gc2hvcnRjdXQKKyAgICBpZiAoZGVzdF9zY2FuWzNdID09IDApIHsKKyAgICAgIGRlc3Rfc2NhblszXSA9IHNyY19hbHBoYV9jb3ZlcmVkOworICAgICAgKmRlc3Rfc2NhbisrID0gbV9CbHVlOworICAgICAgKmRlc3Rfc2NhbisrID0gbV9HcmVlbjsKKyAgICAgICpkZXN0X3NjYW4gPSBtX1JlZDsKKyAgICAgIGRlc3Rfc2NhbiArPSAyOworICAgICAgY29udGludWU7CisgICAgfQorICAgIC8vIFdlIHNob3VsZCBkbyBhbHBoYSB0cmFuc2l0aW9uIGFuZCBjb2xvciB0cmFuc2l0aW9uCisgICAgLy8gYWxwaGEgZmcgICAgICAgICAgY29sb3IgZmcKKyAgICAvLyBhbHBoYSBiZyAgICAgICAgICBjb2xvciBiZworICAgIC8vIGFscGhhIGNvdmVyICAgICAgIGNvbG9yIGNvdmVyCisgICAgZGVzdF9zY2FuWzNdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzNdLCBtX0FscGhhLCBjb3Zlcl9zY2FuKTsKKyAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBjb3Zlcl9zY2FuKTsKKyAgICBkZXN0X3NjYW4rKzsKKyAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgY292ZXJfc2Nhbik7CisgICAgZGVzdF9zY2FuKys7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBjb3Zlcl9zY2FuKTsKKyAgICBkZXN0X3NjYW4gKz0gMjsKKyAgfQorfQordm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuQVJHQl82KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgeworICBkZXN0X3NjYW4gPSAodWludDhfdCopbV9wRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyAoc3Bhbl9sZWZ0IDw8IDIpOworICBjbGlwX3NjYW4gPSAodWludDhfdCopbV9wQ2xpcE1hc2stPkdldFNjYW5saW5lKHNwYW5fdG9wIC0gY2xpcF90b3ApIC0KKyAgICAgICAgICAgICAgY2xpcF9sZWZ0ICsgc3Bhbl9sZWZ0OworICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKKyAgaW50IGNvbF9lbmQgPQorICAgICAgKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKKyAgaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpCisgICAgcmV0dXJuOyAgLy8gZG8gbm90aGluZy4KKyAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCA8PCAyOwogI2lmIDEKLQkJaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OyAKLQkJZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLQkJCWludCBzcmNfYWxwaGExID0gc3JjX2FscGhhKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLQkJCWlmICghc3JjX2FscGhhMSkgewotCQkJCWRlc3Rfc2NhbiArPSA0OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHNyY19hbHBoYTEgPT0gMjU1KSB7Ci0JCQkJKihGWF9EV09SRCopZGVzdF9zY2FuID0gbV9Db2xvcjsKLQkJCQlkZXN0X3NjYW4gKz0gNDsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gRGVzdCBmb3JtYXQ6IEFyZ2IKLQkJCQkvLyBjYWxjdWxhdGUgZGVzdGluYXRpb24gYWxwaGEgKGl0J3MgdW5pb24gb2Ygc291cmNlIGFuZCBkZXN0IGFscGhhKQotCQkJCWlmIChkZXN0X3NjYW5bM10gPT0gMCkgewotCQkJCQlkZXN0X3NjYW5bM10gPSBzcmNfYWxwaGExOwotCQkJCQkqZGVzdF9zY2FuKysgPSBtX0JsdWU7Ci0JCQkJCSpkZXN0X3NjYW4rKyA9IG1fR3JlZW47Ci0JCQkJCSpkZXN0X3NjYW4gPSBtX1JlZDsKLQkJCQkJZGVzdF9zY2FuICs9IDI7IAotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJRlhfQllURSBkZXN0X2FscGhhID0gZGVzdF9zY2FuWzNdICsgc3JjX2FscGhhMSAtIGRlc3Rfc2NhblszXSAqIHNyY19hbHBoYTEgLyAyNTU7Ci0JCQkJZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLQkJCQlpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGExKjI1NS9kZXN0X2FscGhhOwotCQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKLQkJCQlkZXN0X3NjYW4gKys7Ci0JCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKLQkJCQlkZXN0X3NjYW4gKys7Ci0JCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7Ci0JCQkJZGVzdF9zY2FuICs9IDI7Ci0JCQl9Ci0JCX0KKyAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OworICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgaW50IHNyY19hbHBoYTEgPSBzcmNfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICBpZiAoIXNyY19hbHBoYTEpIHsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChzcmNfYWxwaGExID09IDI1NSkgeworICAgICAgKihGWF9EV09SRCopZGVzdF9zY2FuID0gbV9Db2xvcjsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgIH0gZWxzZSB7CisgICAgICAvLyBEZXN0IGZvcm1hdDogQXJnYgorICAgICAgLy8gY2FsY3VsYXRlIGRlc3RpbmF0aW9uIGFscGhhIChpdCdzIHVuaW9uIG9mIHNvdXJjZSBhbmQgZGVzdCBhbHBoYSkKKyAgICAgIGlmIChkZXN0X3NjYW5bM10gPT0gMCkgeworICAgICAgICBkZXN0X3NjYW5bM10gPSBzcmNfYWxwaGExOworICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fR3JlZW47CisgICAgICAgICpkZXN0X3NjYW4gPSBtX1JlZDsKKyAgICAgICAgZGVzdF9zY2FuICs9IDI7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KKyAgICAgICAgICBkZXN0X3NjYW5bM10gKyBzcmNfYWxwaGExIC0gZGVzdF9zY2FuWzNdICogc3JjX2FscGhhMSAvIDI1NTsKKyAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGExICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4gKz0gMjsKKyAgICB9CisgIH0KICNlbHNlCi0JCWlmIChtX2JGdWxsQ292ZXIpIHsKLQkJCWZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0JCQkJaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLQkJCQlpZiAoIXNyY19hbHBoYSkgewotCQkJCQlkZXN0X3NjYW4gKz0gNDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChzcmNfYWxwaGEgPT0gMjU1KXsKLQkJCQkJKihGWF9EV09SRCopZGVzdF9zY2FuID0gbV9Db2xvcjsKLQkJCQkJZGVzdF9zY2FuICs9IDQ7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIERlc3QgZm9ybWF0OiBBcmdiCi0JCQkJCS8vIGNhbGN1bGF0ZSBkZXN0aW5hdGlvbiBhbHBoYSAoaXQncyB1bmlvbiBvZiBzb3VyY2UgYW5kIGRlc3QgYWxwaGEpCi0JCQkJCWlmIChkZXN0X3NjYW5bM10gPT0gMCkgewotCQkJCQkJZGVzdF9zY2FuWzNdID0gc3JjX2FscGhhOwotCQkJCQkJKmRlc3Rfc2NhbisrID0gbV9CbHVlOwotCQkJCQkJKmRlc3Rfc2NhbisrID0gbV9HcmVlbjsKLQkJCQkJCSpkZXN0X3NjYW4gPSBtX1JlZDsKLQkJCQkJCWRlc3Rfc2NhbiArPSAyOyAKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCUZYX0JZVEUgZGVzdF9hbHBoYSA9IGRlc3Rfc2NhblszXSArIHNyY19hbHBoYSAtIGRlc3Rfc2NhblszXSAqIHNyY19hbHBoYSAvIDI1NTsKLQkJCQkJZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLQkJCQkJaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhKjI1NS9kZXN0X2FscGhhOwotCQkJCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBhbHBoYV9yYXRpbyk7Ci0JCQkJCWRlc3Rfc2NhbiArKzsKLQkJCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKLQkJCQkJZGVzdF9zY2FuICsrOwotCQkJCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGFscGhhX3JhdGlvKTsKLQkJCQkJZGVzdF9zY2FuICs9IDI7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OyAKLQkJCWZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0JCQkJaW50IHNyY19hbHBoYTEgPSBzcmNfYWxwaGEqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotCQkJCWlmICghc3JjX2FscGhhMSkgewotCQkJCQlkZXN0X3NjYW4gKz0gNDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChzcmNfYWxwaGExID09IDI1NSkgewotCQkJCQkqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSBtX0NvbG9yOwotCQkJCQlkZXN0X3NjYW4gKz0gNDsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBEZXN0IGZvcm1hdDogQXJnYgotCQkJCQkvLyBjYWxjdWxhdGUgZGVzdGluYXRpb24gYWxwaGEgKGl0J3MgdW5pb24gb2Ygc291cmNlIGFuZCBkZXN0IGFscGhhKQotCQkJCQlpZiAoZGVzdF9zY2FuWzNdID09IDApIHsKLQkJCQkJCWRlc3Rfc2NhblszXSA9IHNyY19hbHBoYTE7Ci0JCQkJCQkqZGVzdF9zY2FuKysgPSBtX0JsdWU7Ci0JCQkJCQkqZGVzdF9zY2FuKysgPSBtX0dyZWVuOwotCQkJCQkJKmRlc3Rfc2NhbiA9IG1fUmVkOwotCQkJCQkJZGVzdF9zY2FuICs9IDI7IAotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJRlhfQllURSBkZXN0X2FscGhhID0gZGVzdF9zY2FuWzNdICsgc3JjX2FscGhhMSAtIGRlc3Rfc2NhblszXSAqIHNyY19hbHBoYTEgLyAyNTU7Ci0JCQkJCWRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0JCQkJCWludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYTEqMjU1L2Rlc3RfYWxwaGE7Ci0JCQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKLQkJCQkJZGVzdF9zY2FuICsrOwotCQkJCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOwotCQkJCQlkZXN0X3NjYW4gKys7Ci0JCQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgYWxwaGFfcmF0aW8pOwotCQkJCQlkZXN0X3NjYW4gKz0gMjsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgaWYgKG1fYkZ1bGxDb3ZlcikgeworICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgICBpZiAoIXNyY19hbHBoYSkgeworICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSBtX0NvbG9yOworICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBEZXN0IGZvcm1hdDogQXJnYgorICAgICAgICAvLyBjYWxjdWxhdGUgZGVzdGluYXRpb24gYWxwaGEgKGl0J3MgdW5pb24gb2Ygc291cmNlIGFuZCBkZXN0IGFscGhhKQorICAgICAgICBpZiAoZGVzdF9zY2FuWzNdID09IDApIHsKKyAgICAgICAgICBkZXN0X3NjYW5bM10gPSBzcmNfYWxwaGE7CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9CbHVlOworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fR3JlZW47CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IG1fUmVkOworICAgICAgICAgIGRlc3Rfc2NhbiArPSAyOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9CisgICAgICAgICAgICBkZXN0X3NjYW5bM10gKyBzcmNfYWxwaGEgLSBkZXN0X3NjYW5bM10gKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgICAgZGVzdF9zY2FuICs9IDI7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKKyAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgICBpbnQgc3JjX2FscGhhMSA9IHNyY19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgICAgaWYgKCFzcmNfYWxwaGExKSB7CisgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNfYWxwaGExID09IDI1NSkgeworICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSBtX0NvbG9yOworICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIERlc3QgZm9ybWF0OiBBcmdiCisgICAgICAgIC8vIGNhbGN1bGF0ZSBkZXN0aW5hdGlvbiBhbHBoYSAoaXQncyB1bmlvbiBvZiBzb3VyY2UgYW5kIGRlc3QgYWxwaGEpCisgICAgICAgIGlmIChkZXN0X3NjYW5bM10gPT0gMCkgeworICAgICAgICAgIGRlc3Rfc2NhblszXSA9IHNyY19hbHBoYTE7CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9CbHVlOworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fR3JlZW47CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IG1fUmVkOworICAgICAgICAgIGRlc3Rfc2NhbiArPSAyOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9CisgICAgICAgICAgICBkZXN0X3NjYW5bM10gKyBzcmNfYWxwaGExIC0gZGVzdF9zY2FuWzNdICogc3JjX2FscGhhMSAvIDI1NTsKKyAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhMSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgICAgZGVzdF9zY2FuICs9IDI7CisgICAgICB9CisgICAgfQorICB9CiAjZW5kaWYKLQl9Cit9CiAKLQl2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5BUkdCXzcoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBCWVRFIG9yaV9zY2FuLGludCBCcHAsCi0JCQlpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgRlhfQllURSBjb3Zlcl9zY2FuLCAKLQkJCWludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIEZYX0xQQllURSBjbGlwX3NjYW4sIAotCQkJRlhfTFBCWVRFIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikKLQl7Ci0JCUFTU0VSVCghbV9wRGV2aWNlLT5Jc0NteWtJbWFnZSgpKTsKLQkJZGVzdF9zY2FuID0gKEZYX0JZVEUqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgKHNwYW5fbGVmdDw8Mik7Ci0JCS8vb3JpX3NjYW4gID0gKEZYX0JZVEUqKW1fcE9yaURldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgKHNwYW5fbGVmdDw8Mik7Ci0JCWNsaXBfc2NhbiA9IChGWF9CWVRFKiltX3BDbGlwTWFzay0+R2V0U2NhbmxpbmUoc3Bhbl90b3AtY2xpcF90b3ApIC0gY2xpcF9sZWZ0ICsgc3Bhbl9sZWZ0OwotCQlpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLQkJaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotCQlpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkgcmV0dXJuOyAvLyBkbyBub3RoaW5nLgotCQlkZXN0X3NjYW4gKz0gY29sX3N0YXJ0IDw8IDI7Ci0JCS8vb3JpX3NjYW4gKz0gY29sX3N0YXJ0IDw8IDI7Ci0JCS8vIERvIG5vdCBuZWVkIG9yaWdpbiBiaXRtYXAsIGJlY2F1c2Ugb2YgbWVyZ2UgaW4gcHVyZSB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kCi0JCWZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSAKLQkJewotCQkJaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLQkJCWludCBzcmNfYWxwaGFfY292ZXJlZCA9IHNyY19hbHBoYSAqIGNvdmVyX3NjYW4gLyAyNTU7Ci0JCQkvLyBzaG9ydGN1dAotCQkJaWYgKHNyY19hbHBoYV9jb3ZlcmVkID09IDApewotCQkJCWRlc3Rfc2NhbiArPSA0OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJLy8gc2hvcnRjdXQKLQkJCWlmIChjb3Zlcl9zY2FuID09IDI1NSB8fCBkZXN0X3NjYW5bM10gPT0gMCkKLQkJCXsKLQkJCQkvLyBvcmlnaW4gYWxwaGEgYWx3YXlzIHplcm8sIGp1c3QgZ2V0IHNyYyBhbHBoYQotCQkJCWRlc3Rfc2NhblszXSA9IHNyY19hbHBoYV9jb3ZlcmVkOwotCQkJCSpkZXN0X3NjYW4gKysgPSBtX0JsdWU7Ci0JCQkJKmRlc3Rfc2NhbiArKyA9IG1fR3JlZW47Ci0JCQkJKmRlc3Rfc2NhbiA9IG1fUmVkOwotCQkJCWRlc3Rfc2NhbiArPSAyOyAKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8vIFdlIHNob3VsZCBkbyBhbHBoYSB0cmFuc2l0aW9uIGFuZCBjb2xvciB0cmFuc2l0aW9uCi0JCQkvLyBhbHBoYSBmZyAgICAgICAgICBjb2xvciBmZwotCQkJLy8gYWxwaGEgYmcgICAgICAgICAgY29sb3IgYmcKLQkJCS8vIGFscGhhIGNvdmVyICAgICAgIGNvbG9yIGNvdmVyCi0JCQlkZXN0X3NjYW5bM10gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bM10sIHNyY19hbHBoYSwgY292ZXJfc2Nhbik7Ci0JCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBjb3Zlcl9zY2FuKTsKLQkJCWRlc3Rfc2NhbiArKzsKLQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBjb3Zlcl9zY2FuKTsKLQkJCWRlc3Rfc2NhbiArKzsKLQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgY292ZXJfc2Nhbik7Ci0JCQlkZXN0X3NjYW4gKz0gMjsKLQkJfQotCX0KLQkKLQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQl2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5SR0IzMl8yKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQllURSBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIEZYX0JZVEUgY292ZXJfc2NhbiwgCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCBGWF9MUEJZVEUgY2xpcF9zY2FuLCAKLQkJCUZYX0xQQllURSBkZXN0X2V4dHJhX2FscGhhX3NjYW4pCi0JewotCQlkZXN0X3NjYW4gPSAoRlhfQllURSopbV9wRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyAoc3Bhbl9sZWZ0PDwyKTsKLQkJaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7Ci0JCWludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKLQkJaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpIHJldHVybjsgLy8gZG8gbm90aGluZy4KLQkJZGVzdF9zY2FuICs9IChjb2xfc3RhcnQgPDwgMik7Ci0JCWlmIChtX0FscGhhID09IDI1NSAmJiBjb3Zlcl9zY2FuID09IDI1NSkgewotCQkJRlhTWVNfbWVtc2V0MzIoZGVzdF9zY2FuLCBtX0NvbG9yLCAoY29sX2VuZCAtIGNvbF9zdGFydCk8PDIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBzcmNfYWxwaGE7Cit2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5BUkdCXzcodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7CisgIEFTU0VSVCghbV9wRGV2aWNlLT5Jc0NteWtJbWFnZSgpKTsKKyAgZGVzdF9zY2FuID0gKHVpbnQ4X3QqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgKHNwYW5fbGVmdCA8PCAyKTsKKyAgLy8gb3JpX3NjYW4gID0gKHVpbnQ4X3QqKW1fcE9yaURldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgKHNwYW5fbGVmdDw8Mik7CisgIGNsaXBfc2NhbiA9ICh1aW50OF90KiltX3BDbGlwTWFzay0+R2V0U2NhbmxpbmUoc3Bhbl90b3AgLSBjbGlwX3RvcCkgLQorICAgICAgICAgICAgICBjbGlwX2xlZnQgKyBzcGFuX2xlZnQ7CisgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOworICBpbnQgY29sX2VuZCA9CisgICAgICAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOworICBpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkKKyAgICByZXR1cm47ICAvLyBkbyBub3RoaW5nLgorICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0IDw8IDI7CisgIC8vIG9yaV9zY2FuICs9IGNvbF9zdGFydCA8PCAyOworICAvLyBEbyBub3QgbmVlZCBvcmlnaW4gYml0bWFwLCBiZWNhdXNlIG9mIG1lcmdlIGluIHB1cmUgdHJhbnNwYXJlbnQgYmFja2dyb3VuZAorICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICBpbnQgc3JjX2FscGhhX2NvdmVyZWQgPSBzcmNfYWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OworICAgIC8vIHNob3J0Y3V0CisgICAgaWYgKHNyY19hbHBoYV9jb3ZlcmVkID09IDApIHsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgY29udGludWU7CisgICAgfQorICAgIC8vIHNob3J0Y3V0CisgICAgaWYgKGNvdmVyX3NjYW4gPT0gMjU1IHx8IGRlc3Rfc2NhblszXSA9PSAwKSB7CisgICAgICAvLyBvcmlnaW4gYWxwaGEgYWx3YXlzIHplcm8sIGp1c3QgZ2V0IHNyYyBhbHBoYQorICAgICAgZGVzdF9zY2FuWzNdID0gc3JjX2FscGhhX2NvdmVyZWQ7CisgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7CisgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOworICAgICAgKmRlc3Rfc2NhbiA9IG1fUmVkOworICAgICAgZGVzdF9zY2FuICs9IDI7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgLy8gV2Ugc2hvdWxkIGRvIGFscGhhIHRyYW5zaXRpb24gYW5kIGNvbG9yIHRyYW5zaXRpb24KKyAgICAvLyBhbHBoYSBmZyAgICAgICAgICBjb2xvciBmZworICAgIC8vIGFscGhhIGJnICAgICAgICAgIGNvbG9yIGJnCisgICAgLy8gYWxwaGEgY292ZXIgICAgICAgY29sb3IgY292ZXIKKyAgICBkZXN0X3NjYW5bM10gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bM10sIHNyY19hbHBoYSwgY292ZXJfc2Nhbik7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgY292ZXJfc2Nhbik7CisgICAgZGVzdF9zY2FuKys7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGNvdmVyX3NjYW4pOworICAgIGRlc3Rfc2NhbisrOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgY292ZXJfc2Nhbik7CisgICAgZGVzdF9zY2FuICs9IDI7CisgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5SR0IzMl8yKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7CisgIGRlc3Rfc2NhbiA9ICh1aW50OF90KiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIChzcGFuX2xlZnQgPDwgMik7CisgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOworICBpbnQgY29sX2VuZCA9CisgICAgICAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOworICBpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkKKyAgICByZXR1cm47ICAvLyBkbyBub3RoaW5nLgorICBkZXN0X3NjYW4gKz0gKGNvbF9zdGFydCA8PCAyKTsKKyAgaWYgKG1fQWxwaGEgPT0gMjU1ICYmIGNvdmVyX3NjYW4gPT0gMjU1KSB7CisgICAgRlhTWVNfbWVtc2V0KGRlc3Rfc2NhbiwgbV9Db2xvciwgKGNvbF9lbmQgLSBjb2xfc3RhcnQpIDw8IDIpOworICAgIHJldHVybjsKKyAgfQorICBpbnQgc3JjX2FscGhhOwogI2lmIDAKLQkJaWYgKG1fYkZ1bGxDb3ZlcikKLQkJCXNyY19hbHBoYSA9IG1fQWxwaGE7Ci0JCWVsc2UgCisgICAgICAgIGlmIChtX2JGdWxsQ292ZXIpCisgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhOworICAgICAgICBlbHNlCiAjZW5kaWYKLQkJCXNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OwotCQlmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotCQkJLy8gRGVzdCBmb3JtYXQ6ICBSZ2IzMgotCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgc3JjX2FscGhhKTsKLQkJCWRlc3Rfc2NhbiArKzsKLQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBzcmNfYWxwaGEpOwotCQkJZGVzdF9zY2FuICsrOwotCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOwotCQkJZGVzdF9zY2FuICs9IDI7Ci0JCX0KLQl9Ci0Jdm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMzJfMyhGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUEJZVEUgb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCBGWF9CWVRFIGNvdmVyX3NjYW4sIAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgRlhfTFBCWVRFIGNsaXBfc2NhbiwgCi0JCQlGWF9MUEJZVEUgZGVzdF9leHRyYV9hbHBoYV9zY2FuKQotCXsKLQkJZGVzdF9zY2FuID0gKEZYX0JZVEUqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgKHNwYW5fbGVmdDw8Mik7Ci0JCW9yaV9zY2FuICA9IChGWF9CWVRFKiltX3BPcmlEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIChzcGFuX2xlZnQ8PDIpOwotCQlpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLQkJaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotCQlpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkgcmV0dXJuOyAvLyBkbyBub3RoaW5nLgotCQlkZXN0X3NjYW4gKz0gY29sX3N0YXJ0IDw8IDI7Ci0JCW9yaV9zY2FuICs9IGNvbF9zdGFydCA8PCAyOwotCQlpZiAobV9BbHBoYSA9PSAyNTUgJiYgY292ZXJfc2NhbiA9PSAyNTUpIHsKLQkJCUZYU1lTX21lbXNldDMyKGRlc3Rfc2NhbiwgbV9Db2xvciwgKGNvbF9lbmQgLSBjb2xfc3RhcnQpPDwyKTsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgc3JjX2FscGhhID0gbV9BbHBoYTsKLQkJZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKKyAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gLyAyNTU7CisgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAvLyBEZXN0IGZvcm1hdDogIFJnYjMyCisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgc3JjX2FscGhhKTsKKyAgICBkZXN0X3NjYW4rKzsKKyAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgc3JjX2FscGhhKTsKKyAgICBkZXN0X3NjYW4rKzsKKyAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIHNyY19hbHBoYSk7CisgICAgZGVzdF9zY2FuICs9IDI7CisgIH0KK30KK3ZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjMyXzModWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKKyAgZGVzdF9zY2FuID0gKHVpbnQ4X3QqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgKHNwYW5fbGVmdCA8PCAyKTsKKyAgb3JpX3NjYW4gPSAodWludDhfdCopbV9wT3JpRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyAoc3Bhbl9sZWZ0IDw8IDIpOworICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKKyAgaW50IGNvbF9lbmQgPQorICAgICAgKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKKyAgaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpCisgICAgcmV0dXJuOyAgLy8gZG8gbm90aGluZy4KKyAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCA8PCAyOworICBvcmlfc2NhbiArPSBjb2xfc3RhcnQgPDwgMjsKKyAgaWYgKG1fQWxwaGEgPT0gMjU1ICYmIGNvdmVyX3NjYW4gPT0gMjU1KSB7CisgICAgRlhTWVNfbWVtc2V0KGRlc3Rfc2NhbiwgbV9Db2xvciwgKGNvbF9lbmQgLSBjb2xfc3RhcnQpIDw8IDIpOworICAgIHJldHVybjsKKyAgfQorICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYTsKKyAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgewogI2lmIDAKLQkJCWlmIChtX2JGdWxsQ292ZXIpIHsKLQkJCQkqZGVzdF9zY2FuKysgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9CbHVlLCBzcmNfYWxwaGEpOwotCQkJCSpkZXN0X3NjYW4rKyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyZWVuLCBzcmNfYWxwaGEpOwotCQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOwotCQkJCWRlc3Rfc2NhbiArPSAyOyBvcmlfc2NhbiArPSAyOwotCQkJCWNvbnRpbnVlOwotCQkJfQorICAgICAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgeworICAgICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0JsdWUsIHNyY19hbHBoYSk7CisgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIHNyY19hbHBoYSk7CisgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbiwgbV9SZWQsIHNyY19hbHBoYSk7CisgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDI7IG9yaV9zY2FuICs9IDI7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAjZW5kaWYKLQkJCWludCBiID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fQmx1ZSwgc3JjX2FscGhhKTsKLQkJCWludCBnID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIHNyY19hbHBoYSk7Ci0JCQlpbnQgciA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbiwgbV9SZWQsIHNyY19hbHBoYSk7Ci0JCQlvcmlfc2NhbiArPSAyOwotCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCAqZGVzdF9zY2FuLCBiLCBjb3Zlcl9zY2FuKTsKLSAJCQlkZXN0X3NjYW4gKys7Ci0JCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZywgY292ZXJfc2Nhbik7Ci0gCQkJZGVzdF9zY2FuICsrOwotCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHIsIGNvdmVyX3NjYW4pOwotCQkJZGVzdF9zY2FuICs9IDI7Ci0JCX0KLQl9Ci0Jdm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMzJfNihGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUEJZVEUgb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCBGWF9CWVRFIGNvdmVyX3NjYW4sIAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgRlhfTFBCWVRFIGNsaXBfc2NhbiwgCi0JCQlGWF9MUEJZVEUgZGVzdF9leHRyYV9hbHBoYV9zY2FuKQotCXsKLQkJZGVzdF9zY2FuID0gKEZYX0JZVEUqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgKHNwYW5fbGVmdDw8Mik7Ci0JCWNsaXBfc2NhbiA9IChGWF9CWVRFKiltX3BDbGlwTWFzay0+R2V0U2NhbmxpbmUoc3Bhbl90b3AtY2xpcF90b3ApIC0gY2xpcF9sZWZ0ICsgc3Bhbl9sZWZ0OwotCQlpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLQkJaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotCQlpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkgcmV0dXJuOyAvLyBkbyBub3RoaW5nLgotCQlkZXN0X3NjYW4gKz0gY29sX3N0YXJ0IDw8IDI7CisgICAgaW50IGIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9CbHVlLCBzcmNfYWxwaGEpOworICAgIGludCBnID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIHNyY19hbHBoYSk7CisgICAgaW50IHIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOworICAgIG9yaV9zY2FuICs9IDI7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGIsIGNvdmVyX3NjYW4pOworICAgIGRlc3Rfc2NhbisrOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBnLCBjb3Zlcl9zY2FuKTsKKyAgICBkZXN0X3NjYW4rKzsKKyAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgciwgY292ZXJfc2Nhbik7CisgICAgZGVzdF9zY2FuICs9IDI7CisgIH0KK30KK3ZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjMyXzYodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKKyAgZGVzdF9zY2FuID0gKHVpbnQ4X3QqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgKHNwYW5fbGVmdCA8PCAyKTsKKyAgY2xpcF9zY2FuID0gKHVpbnQ4X3QqKW1fcENsaXBNYXNrLT5HZXRTY2FubGluZShzcGFuX3RvcCAtIGNsaXBfdG9wKSAtCisgICAgICAgICAgICAgIGNsaXBfbGVmdCArIHNwYW5fbGVmdDsKKyAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7CisgIGludCBjb2xfZW5kID0KKyAgICAgIChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7CisgIGlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KQorICAgIHJldHVybjsgIC8vIGRvIG5vdGhpbmcuCisgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgPDwgMjsKICNpZiAxCi0JCWludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKLQkJZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLQkJCWludCBzcmNfYWxwaGExID0gc3JjX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0JCQlpZiAoIXNyY19hbHBoYTEpIHsKLQkJCQlkZXN0X3NjYW4gKz0gNDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChzcmNfYWxwaGExID09IDI1NSkgewotCQkJCSooRlhfRFdPUkQqKWRlc3Rfc2NhbiA9IG1fQ29sb3I7Ci0JCQkJZGVzdF9zY2FuICs9IDQ7Ci0JCQl9IGVsc2UgewotCQkJCS8vIERlc3QgZm9ybWF0OiBSZ2Igb3IgUmdiMzIKLQkJCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBzcmNfYWxwaGExKTsKLQkJCQlkZXN0X3NjYW4gKys7Ci0JCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIHNyY19hbHBoYTEpOwotCQkJCWRlc3Rfc2NhbiArKzsKLQkJCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIHNyY19hbHBoYTEpOwotCQkJCWRlc3Rfc2NhbiArPSAyOwotCQkJfQkJCQkKLQkJfQorICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gLyAyNTU7CisgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICBpbnQgc3JjX2FscGhhMSA9IHNyY19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgIGlmICghc3JjX2FscGhhMSkgeworICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHNyY19hbHBoYTEgPT0gMjU1KSB7CisgICAgICAqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSBtX0NvbG9yOworICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIERlc3QgZm9ybWF0OiBSZ2Igb3IgUmdiMzIKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIHNyY19hbHBoYTEpOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgc3JjX2FscGhhMSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgc3JjX2FscGhhMSk7CisgICAgICBkZXN0X3NjYW4gKz0gMjsKKyAgICB9CisgIH0KICNlbHNlCi0JCWlmIChtX2JGdWxsQ292ZXIpIHsKLQkJCWZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0JCQkJaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLQkJCQlpZiAoIXNyY19hbHBoYSkgewotCQkJCQlkZXN0X3NjYW4gKz0gNDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChzcmNfYWxwaGEgPT0gMjU1KSB7Ci0JCQkJCSooRlhfRFdPUkQqKWRlc3Rfc2NhbiA9IG1fQ29sb3I7Ci0JCQkJCWRlc3Rfc2NhbiArPSA0OwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIERlc3QgZm9ybWF0OiBSZ2Igb3IgUmdiMzIKLQkJCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgc3JjX2FscGhhKTsKLQkJCQkJZGVzdF9zY2FuICsrOwotCQkJCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgc3JjX2FscGhhKTsKLQkJCQkJZGVzdF9zY2FuICsrOwotCQkJCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIHNyY19hbHBoYSk7Ci0JCQkJCWRlc3Rfc2NhbiArPSAyOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIFJnYjMyCi0JCQlpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gLyAyNTU7Ci0JCQlmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotCQkJCWludCBzcmNfYWxwaGExID0gc3JjX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0JCQkJaWYgKCFzcmNfYWxwaGExKSB7Ci0JCQkJCWRlc3Rfc2NhbiArPSA0OwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKHNyY19hbHBoYTEgPT0gMjU1KSB7Ci0JCQkJCSooRlhfRFdPUkQqKWRlc3Rfc2NhbiA9IG1fQ29sb3I7Ci0JCQkJCWRlc3Rfc2NhbiArPSA0OwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIERlc3QgZm9ybWF0OiBSZ2Igb3IgUmdiMzIKLQkJCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgc3JjX2FscGhhMSk7Ci0JCQkJCWRlc3Rfc2NhbiArKzsKLQkJCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIHNyY19hbHBoYTEpOwotCQkJCQlkZXN0X3NjYW4gKys7Ci0JCQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgc3JjX2FscGhhMSk7Ci0JCQkJCWRlc3Rfc2NhbiArPSAyOwotCQkJCX0JCQkJCi0JCQl9Ci0JCX0JCQkKKyAgaWYgKG1fYkZ1bGxDb3ZlcikgeworICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgICBpZiAoIXNyY19hbHBoYSkgeworICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSBtX0NvbG9yOworICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIERlc3QgZm9ybWF0OiBSZ2Igb3IgUmdiMzIKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgc3JjX2FscGhhKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBzcmNfYWxwaGEpOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOworICAgICAgICBkZXN0X3NjYW4gKz0gMjsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gUmdiMzIKKyAgICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gLyAyNTU7CisgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgaW50IHNyY19hbHBoYTEgPSBzcmNfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgIGlmICghc3JjX2FscGhhMSkgeworICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoc3JjX2FscGhhMSA9PSAyNTUpIHsKKyAgICAgICAgKihGWF9EV09SRCopZGVzdF9zY2FuID0gbV9Db2xvcjsKKyAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBEZXN0IGZvcm1hdDogUmdiIG9yIFJnYjMyCisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIHNyY19hbHBoYTEpOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIHNyY19hbHBoYTEpOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBzcmNfYWxwaGExKTsKKyAgICAgICAgZGVzdF9zY2FuICs9IDI7CisgICAgICB9CisgICAgfQorICB9CiAjZW5kaWYKLQl9Ci0Jdm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMzJfNyhGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUEJZVEUgb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCBGWF9CWVRFIGNvdmVyX3NjYW4sIAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgRlhfTFBCWVRFIGNsaXBfc2NhbiwgCi0JCQlGWF9MUEJZVEUgZGVzdF9leHRyYV9hbHBoYV9zY2FuKQotCXsKLQkJQVNTRVJUKCFtX3BEZXZpY2UtPklzQ215a0ltYWdlKCkpOwotCQlkZXN0X3NjYW4gPSAoRlhfQllURSopbV9wRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyAoc3Bhbl9sZWZ0PDwyKTsKLQkJb3JpX3NjYW4gID0gKEZYX0JZVEUqKW1fcE9yaURldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgKHNwYW5fbGVmdDw8Mik7Ci0JCWNsaXBfc2NhbiA9IChGWF9CWVRFKiltX3BDbGlwTWFzay0+R2V0U2NhbmxpbmUoc3Bhbl90b3AtY2xpcF90b3ApIC0gY2xpcF9sZWZ0ICsgc3Bhbl9sZWZ0OwotCQlpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLQkJaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotCQlpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkgcmV0dXJuOyAvLyBkbyBub3RoaW5nLgotCQlkZXN0X3NjYW4gKz0gY29sX3N0YXJ0IDw8IDI7Ci0JCW9yaV9zY2FuICs9IGNvbF9zdGFydCA8PCAyOworfQordm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMzJfNyh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgeworICBBU1NFUlQoIW1fcERldmljZS0+SXNDbXlrSW1hZ2UoKSk7CisgIGRlc3Rfc2NhbiA9ICh1aW50OF90KiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIChzcGFuX2xlZnQgPDwgMik7CisgIG9yaV9zY2FuID0gKHVpbnQ4X3QqKW1fcE9yaURldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgKHNwYW5fbGVmdCA8PCAyKTsKKyAgY2xpcF9zY2FuID0gKHVpbnQ4X3QqKW1fcENsaXBNYXNrLT5HZXRTY2FubGluZShzcGFuX3RvcCAtIGNsaXBfdG9wKSAtCisgICAgICAgICAgICAgIGNsaXBfbGVmdCArIHNwYW5fbGVmdDsKKyAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7CisgIGludCBjb2xfZW5kID0KKyAgICAgIChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7CisgIGlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KQorICAgIHJldHVybjsgIC8vIGRvIG5vdGhpbmcuCisgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgPDwgMjsKKyAgb3JpX3NjYW4gKz0gY29sX3N0YXJ0IDw8IDI7CiAjaWYgMQotCQlmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotCQkJaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLQkJCWlmIChzcmNfYWxwaGEgPT0gMjU1ICYmIGNvdmVyX3NjYW4gPT0gMjU1KSB7Ci0JCQkJKihGWF9EV09SRCopZGVzdF9zY2FuID0gbV9Db2xvcjsKLQkJCQlkZXN0X3NjYW4gKz0gNDsKLQkJCQlvcmlfc2NhbiArPSA0OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaW50IGIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9CbHVlLCBzcmNfYWxwaGEpOwotCQkJaW50IGcgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmVlbiwgc3JjX2FscGhhKTsKLQkJCWludCByID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuLCBtX1JlZCwgc3JjX2FscGhhKTsKLQkJCW9yaV9zY2FuICs9IDI7Ci0JCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoICpkZXN0X3NjYW4sIGIsIGNvdmVyX3NjYW4pOwotIAkJCWRlc3Rfc2NhbiArKzsKLQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBnLCBjb3Zlcl9zY2FuKTsKLSAJCQlkZXN0X3NjYW4gKys7Ci0JCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgciwgY292ZXJfc2Nhbik7Ci0JCQlkZXN0X3NjYW4gKz0gMjsKLQkJfQorICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICBpZiAoc3JjX2FscGhhID09IDI1NSAmJiBjb3Zlcl9zY2FuID09IDI1NSkgeworICAgICAgKihGWF9EV09SRCopZGVzdF9zY2FuID0gbV9Db2xvcjsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgb3JpX3NjYW4gKz0gNDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgYiA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0JsdWUsIHNyY19hbHBoYSk7CisgICAgaW50IGcgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmVlbiwgc3JjX2FscGhhKTsKKyAgICBpbnQgciA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbiwgbV9SZWQsIHNyY19hbHBoYSk7CisgICAgb3JpX3NjYW4gKz0gMjsKKyAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYiwgY292ZXJfc2Nhbik7CisgICAgZGVzdF9zY2FuKys7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGcsIGNvdmVyX3NjYW4pOworICAgIGRlc3Rfc2NhbisrOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCByLCBjb3Zlcl9zY2FuKTsKKyAgICBkZXN0X3NjYW4gKz0gMjsKKyAgfQogI2Vsc2UKLQkJaWYgKG1fYkZ1bGxDb3ZlcikgewotCQkJZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLQkJCQlpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotCQkJCWlmICghc3JjX2FscGhhKSB7Ci0JCQkJCSooRlhfRFdPUkQqKWRlc3Rfc2NhbiA9ICooRlhfRFdPUkQqKW9yaV9zY2FuOwotCQkJCQlkZXN0X3NjYW4gKz0gNDsKLQkJCQkJb3JpX3NjYW4gKz0gNDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChzcmNfYWxwaGEgPT0gMjU1KSB7Ci0JCQkJCSooRlhfRFdPUkQqKWRlc3Rfc2NhbiA9IG1fQ29sb3I7Ci0JCQkJCWRlc3Rfc2NhbiArPSA0OwotCQkJCQlvcmlfc2NhbiArPSA0OwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fQmx1ZSwgc3JjX2FscGhhKTsKLQkJCQkqZGVzdF9zY2FuKysgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmVlbiwgc3JjX2FscGhhKTsKLQkJCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuLCBtX1JlZCwgc3JjX2FscGhhKTsKLQkJCQlkZXN0X3NjYW4gKz0gMjsgb3JpX3NjYW4gKz0gMjsKLQkJCX0JCQkKLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0JCQkJaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLQkJCQlpZiAoc3JjX2FscGhhID09IDI1NSAmJiBjb3Zlcl9zY2FuID09IDI1NSkgewotCQkJCQkqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSBtX0NvbG9yOwotCQkJCQlkZXN0X3NjYW4gKz0gNDsKLQkJCQkJb3JpX3NjYW4gKz0gNDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWludCBiID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fQmx1ZSwgc3JjX2FscGhhKTsKLQkJCQlpbnQgZyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyZWVuLCBzcmNfYWxwaGEpOwotCQkJCWludCByID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuLCBtX1JlZCwgc3JjX2FscGhhKTsKLQkJCQlvcmlfc2NhbiArPSAyOwotCQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSggKmRlc3Rfc2NhbiwgYiwgY292ZXJfc2Nhbik7Ci0gCQkJCWRlc3Rfc2NhbiArKzsKLQkJCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZywgY292ZXJfc2Nhbik7Ci0gCQkJCWRlc3Rfc2NhbiArKzsKLQkJCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgciwgY292ZXJfc2Nhbik7Ci0JCQkJZGVzdF9zY2FuICs9IDI7Ci0JCQl9Ci0JCX0KKyAgaWYgKG1fYkZ1bGxDb3ZlcikgeworICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgICBpZiAoIXNyY19hbHBoYSkgeworICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSAqKEZYX0RXT1JEKilvcmlfc2NhbjsKKyAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgIG9yaV9zY2FuICs9IDQ7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgKihGWF9EV09SRCopZGVzdF9zY2FuID0gbV9Db2xvcjsKKyAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgIG9yaV9zY2FuICs9IDQ7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fQmx1ZSwgc3JjX2FscGhhKTsKKyAgICAgICpkZXN0X3NjYW4rKyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyZWVuLCBzcmNfYWxwaGEpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbiwgbV9SZWQsIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW4gKz0gMjsKKyAgICAgIG9yaV9zY2FuICs9IDI7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSAmJiBjb3Zlcl9zY2FuID09IDI1NSkgeworICAgICAgICAqKEZYX0RXT1JEKilkZXN0X3NjYW4gPSBtX0NvbG9yOworICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgb3JpX3NjYW4gKz0gNDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpbnQgYiA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0JsdWUsIHNyY19hbHBoYSk7CisgICAgICBpbnQgZyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyZWVuLCBzcmNfYWxwaGEpOworICAgICAgaW50IHIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOworICAgICAgb3JpX3NjYW4gKz0gMjsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBiLCBjb3Zlcl9zY2FuKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGcsIGNvdmVyX3NjYW4pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgciwgY292ZXJfc2Nhbik7CisgICAgICBkZXN0X3NjYW4gKz0gMjsKKyAgICB9CisgIH0KICNlbmRpZgotCX0KLQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQl2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5SR0IyNF8yKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQllURSBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIEZYX0JZVEUgY292ZXJfc2NhbiwgCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCBGWF9MUEJZVEUgY2xpcF9zY2FuLCAKLQkJCUZYX0xQQllURSBkZXN0X2V4dHJhX2FscGhhX3NjYW4pCi0JewotCQlkZXN0X3NjYW4gPSAoRlhfQllURSopbV9wRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyBzcGFuX2xlZnQgKyAoc3Bhbl9sZWZ0PDwxKTsKLQkJaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7Ci0JCWludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKLQkJaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpIHJldHVybjsgLy8gZG8gbm90aGluZy4KLQkJZGVzdF9zY2FuICs9IChjb2xfc3RhcnQ8PDEpK2NvbF9zdGFydDsKLQkJaW50IHNyY19hbHBoYTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMjRfMih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgeworICBkZXN0X3NjYW4gPQorICAgICAgKHVpbnQ4X3QqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgc3Bhbl9sZWZ0ICsgKHNwYW5fbGVmdCA8PCAxKTsKKyAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7CisgIGludCBjb2xfZW5kID0KKyAgICAgIChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7CisgIGlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KQorICAgIHJldHVybjsgIC8vIGRvIG5vdGhpbmcuCisgIGRlc3Rfc2NhbiArPSAoY29sX3N0YXJ0IDw8IDEpICsgY29sX3N0YXJ0OworICBpbnQgc3JjX2FscGhhOwogI2lmIDAKLQkJaWYgKG1fYkZ1bGxDb3ZlcikKLQkJCXNyY19hbHBoYSA9IG1fQWxwaGE7Ci0JCWVsc2UgCisgICAgICAgIGlmIChtX2JGdWxsQ292ZXIpCisgICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhOworICAgICAgICBlbHNlCiAjZW5kaWYKLQkJCXNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OwotCQlpZiAoc3JjX2FscGhhID09IDI1NSkgewotCQkJZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLQkJCQkqZGVzdF9zY2FuKysgPSBtX0JsdWU7Ci0JCQkJKmRlc3Rfc2NhbisrID0gbV9HcmVlbjsKLQkJCQkqZGVzdF9zY2FuKysgPSBtX1JlZDsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgc3JjX2FscGhhKTsKLQkJCWRlc3Rfc2NhbiArKzsKLQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBzcmNfYWxwaGEpOwotCQkJZGVzdF9zY2FuICsrOwotCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOwotCQkJZGVzdF9zY2FuICsrOwotCQl9Ci0JfQotCXZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjI0XzMoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBCWVRFIG9yaV9zY2FuLGludCBCcHAsCi0JCQlpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgRlhfQllURSBjb3Zlcl9zY2FuLCAKLQkJCWludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIEZYX0xQQllURSBjbGlwX3NjYW4sIAotCQkJRlhfTFBCWVRFIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikKLQl7Ci0JCUFTU0VSVCghbV9wRGV2aWNlLT5Jc0NteWtJbWFnZSgpKTsKLQkJZGVzdF9zY2FuID0gKEZYX0JZVEUqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgc3Bhbl9sZWZ0ICsgKHNwYW5fbGVmdDw8MSk7Ci0JCW9yaV9zY2FuICA9IChGWF9CWVRFKiltX3BPcmlEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdCArIChzcGFuX2xlZnQ8PDEpOwotCQlpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLQkJaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotCQlpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkgcmV0dXJuOyAvLyBkbyBub3RoaW5nLgotCQlkZXN0X3NjYW4gKz0gKGNvbF9zdGFydDw8MSkgKyBjb2xfc3RhcnQ7Ci0JCW9yaV9zY2FuICs9IChjb2xfc3RhcnQ8PDEpICsgY29sX3N0YXJ0OwotCQlpZiAobV9BbHBoYSA9PSAyNTUmJmNvdmVyX3NjYW4gPT0gMjU1KSB7Ci0JCQlmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotCQkJCSpkZXN0X3NjYW4gKysgPSBtX0JsdWU7Ci0gCQkJCSpkZXN0X3NjYW4gKysgPSBtX0dyZWVuOwotCQkJCSpkZXN0X3NjYW4gKysgPSBtX1JlZDsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgeworICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKKyAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7CisgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOworICAgICAgKmRlc3Rfc2NhbisrID0gbV9SZWQ7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgc3JjX2FscGhhKTsKKyAgICBkZXN0X3NjYW4rKzsKKyAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgc3JjX2FscGhhKTsKKyAgICBkZXN0X3NjYW4rKzsKKyAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIHNyY19hbHBoYSk7CisgICAgZGVzdF9zY2FuKys7CisgIH0KK30KK3ZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjI0XzModWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKKyAgQVNTRVJUKCFtX3BEZXZpY2UtPklzQ215a0ltYWdlKCkpOworICBkZXN0X3NjYW4gPQorICAgICAgKHVpbnQ4X3QqKW1fcERldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgc3Bhbl9sZWZ0ICsgKHNwYW5fbGVmdCA8PCAxKTsKKyAgb3JpX3NjYW4gPSAodWludDhfdCopbV9wT3JpRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyBzcGFuX2xlZnQgKworICAgICAgICAgICAgIChzcGFuX2xlZnQgPDwgMSk7CisgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOworICBpbnQgY29sX2VuZCA9CisgICAgICAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOworICBpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkKKyAgICByZXR1cm47ICAvLyBkbyBub3RoaW5nLgorICBkZXN0X3NjYW4gKz0gKGNvbF9zdGFydCA8PCAxKSArIGNvbF9zdGFydDsKKyAgb3JpX3NjYW4gKz0gKGNvbF9zdGFydCA8PCAxKSArIGNvbF9zdGFydDsKKyAgaWYgKG1fQWxwaGEgPT0gMjU1ICYmIGNvdmVyX3NjYW4gPT0gMjU1KSB7CisgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgKmRlc3Rfc2NhbisrID0gbV9CbHVlOworICAgICAgKmRlc3Rfc2NhbisrID0gbV9HcmVlbjsKKyAgICAgICpkZXN0X3NjYW4rKyA9IG1fUmVkOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgewogI2lmIDAKLQkJCWlmIChtX2JGdWxsQ292ZXIpIHsKLQkJCQkqZGVzdF9zY2FuKysgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9CbHVlLCBtX0FscGhhKTsKLQkJCQkqZGVzdF9zY2FuKysgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmVlbiwgbV9BbHBoYSk7Ci0JCQkJKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fUmVkLCBtX0FscGhhKTsKLQkJCQljb250aW51ZTsKLQkJCX0KKyAgICAgICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKKyAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9CbHVlLCBtX0FscGhhKTsKKyAgICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmVlbiwgbV9BbHBoYSk7CisgICAgICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fUmVkLCBtX0FscGhhKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KICNlbmRpZgotCQkJaW50IGIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9CbHVlLCBtX0FscGhhKTsKLQkJCWludCBnID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIG1fQWxwaGEpOwotCQkJaW50IHIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9SZWQsIG1fQWxwaGEpOwotCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCAqZGVzdF9zY2FuLCBiLCBjb3Zlcl9zY2FuKTsKLSAJCQlkZXN0X3NjYW4gKys7Ci0JCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZywgY292ZXJfc2Nhbik7Ci0gCQkJZGVzdF9zY2FuICsrOwotCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHIsIGNvdmVyX3NjYW4pOwotCQkJZGVzdF9zY2FuICsrOwotCQl9Ci0JfQotCXZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjI0XzYoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBCWVRFIG9yaV9zY2FuLGludCBCcHAsCi0JCQlpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgRlhfQllURSBjb3Zlcl9zY2FuLCAKLQkJCWludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIEZYX0xQQllURSBjbGlwX3NjYW4sIAotCQkJRlhfTFBCWVRFIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikKLQl7Ci0JCWRlc3Rfc2NhbiA9IChGWF9CWVRFKiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdCsoc3Bhbl9sZWZ0PDwxKTsKLQkJY2xpcF9zY2FuID0gKEZYX0JZVEUqKW1fcENsaXBNYXNrLT5HZXRTY2FubGluZShzcGFuX3RvcC1jbGlwX3RvcCkgLSBjbGlwX2xlZnQgKyBzcGFuX2xlZnQ7Ci0JCWludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOwotCQlpbnQgY29sX2VuZCA9IChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7Ci0JCWlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KSByZXR1cm47IC8vIGRvIG5vdGhpbmcuCi0JCWRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgKyAoY29sX3N0YXJ0IDw8IDEpOworICAgIGludCBiID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fQmx1ZSwgbV9BbHBoYSk7CisgICAgaW50IGcgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmVlbiwgbV9BbHBoYSk7CisgICAgaW50IHIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9SZWQsIG1fQWxwaGEpOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBiLCBjb3Zlcl9zY2FuKTsKKyAgICBkZXN0X3NjYW4rKzsKKyAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZywgY292ZXJfc2Nhbik7CisgICAgZGVzdF9zY2FuKys7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHIsIGNvdmVyX3NjYW4pOworICAgIGRlc3Rfc2NhbisrOworICB9Cit9Cit2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5SR0IyNF82KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7CisgIGRlc3Rfc2NhbiA9CisgICAgICAodWludDhfdCopbV9wRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyBzcGFuX2xlZnQgKyAoc3Bhbl9sZWZ0IDw8IDEpOworICBjbGlwX3NjYW4gPSAodWludDhfdCopbV9wQ2xpcE1hc2stPkdldFNjYW5saW5lKHNwYW5fdG9wIC0gY2xpcF90b3ApIC0KKyAgICAgICAgICAgICAgY2xpcF9sZWZ0ICsgc3Bhbl9sZWZ0OworICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKKyAgaW50IGNvbF9lbmQgPQorICAgICAgKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKKyAgaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpCisgICAgcmV0dXJuOyAgLy8gZG8gbm90aGluZy4KKyAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCArIChjb2xfc3RhcnQgPDwgMSk7CiAjaWYgMQotCQlpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gLzI1NTsKLQkJZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLQkJCWludCBzcmNfYWxwaGExID0gc3JjX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CQotCQkJaWYgKCFzcmNfYWxwaGExKSB7Ci0JCQkJZGVzdF9zY2FuICs9IDM7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoc3JjX2FscGhhMSA9PSAyNTUpIHsKLQkJCQkqZGVzdF9zY2FuKysgPSBtX0JsdWU7Ci0JCQkJKmRlc3Rfc2NhbisrID0gbV9HcmVlbjsKLQkJCQkqZGVzdF9zY2FuKysgPSBtX1JlZDsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gRGVzdCBmb3JtYXQ6IFJnYgotCQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIHNyY19hbHBoYTEpOwotCQkJCWRlc3Rfc2NhbiArKzsKLQkJCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgc3JjX2FscGhhMSk7Ci0JCQkJZGVzdF9zY2FuICsrOwotCQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgc3JjX2FscGhhMSk7Ci0JCQkJZGVzdF9zY2FuICsrOwotCQkJfQotCQl9CisgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKKyAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgIGludCBzcmNfYWxwaGExID0gc3JjX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgaWYgKCFzcmNfYWxwaGExKSB7CisgICAgICBkZXN0X3NjYW4gKz0gMzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoc3JjX2FscGhhMSA9PSAyNTUpIHsKKyAgICAgICpkZXN0X3NjYW4rKyA9IG1fQmx1ZTsKKyAgICAgICpkZXN0X3NjYW4rKyA9IG1fR3JlZW47CisgICAgICAqZGVzdF9zY2FuKysgPSBtX1JlZDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gRGVzdCBmb3JtYXQ6IFJnYgorICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgc3JjX2FscGhhMSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBzcmNfYWxwaGExKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBzcmNfYWxwaGExKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgIH0KKyAgfQogI2Vsc2UKLQkJaWYgKG1fYkZ1bGxDb3ZlcikgewotCQkJZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLQkJCQlpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwkKLQkJCQlpZiAoIXNyY19hbHBoYSkgewotCQkJCQlkZXN0X3NjYW4gKz0gMzsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChzcmNfYWxwaGEgPT0gMjU1KSB7Ci0JCQkJCSpkZXN0X3NjYW4rKyA9IG1fQmx1ZTsKLQkJCQkJKmRlc3Rfc2NhbisrID0gbV9HcmVlbjsKLQkJCQkJKmRlc3Rfc2NhbisrID0gbV9SZWQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gRGVzdCBmb3JtYXQ6IFJnYgotCQkJCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBzcmNfYWxwaGEpOwotCQkJCQlkZXN0X3NjYW4gKys7Ci0JCQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBzcmNfYWxwaGEpOwotCQkJCQlkZXN0X3NjYW4gKys7Ci0JCQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgc3JjX2FscGhhKTsKLQkJCQkJZGVzdF9zY2FuICsrOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvMjU1OwotCQkJZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLQkJCQlpbnQgc3JjX2FscGhhMSA9IHNyY19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwkKLQkJCQlpZiAoIXNyY19hbHBoYTEpIHsKLQkJCQkJZGVzdF9zY2FuICs9IDM7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoc3JjX2FscGhhMSA9PSAyNTUpIHsKLQkJCQkJKmRlc3Rfc2NhbisrID0gbV9CbHVlOwotCQkJCQkqZGVzdF9zY2FuKysgPSBtX0dyZWVuOwotCQkJCQkqZGVzdF9zY2FuKysgPSBtX1JlZDsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBEZXN0IGZvcm1hdDogUmdiCi0JCQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIHNyY19hbHBoYTEpOwotCQkJCQlkZXN0X3NjYW4gKys7Ci0JCQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBzcmNfYWxwaGExKTsKLQkJCQkJZGVzdF9zY2FuICsrOwotCQkJCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIHNyY19hbHBoYTEpOwotCQkJCQlkZXN0X3NjYW4gKys7Ci0JCQkJfQotCQkJfQotCQl9CisgIGlmIChtX2JGdWxsQ292ZXIpIHsKKyAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgICAgaWYgKCFzcmNfYWxwaGEpIHsKKyAgICAgICAgZGVzdF9zY2FuICs9IDM7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9CbHVlOworICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOworICAgICAgICAqZGVzdF9zY2FuKysgPSBtX1JlZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIERlc3QgZm9ybWF0OiBSZ2IKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgc3JjX2FscGhhKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBzcmNfYWxwaGEpOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OworICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGExID0gc3JjX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgICBpZiAoIXNyY19hbHBoYTEpIHsKKyAgICAgICAgZGVzdF9zY2FuICs9IDM7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYTEgPT0gMjU1KSB7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fQmx1ZTsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9HcmVlbjsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9SZWQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBEZXN0IGZvcm1hdDogUmdiCisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIHNyY19hbHBoYTEpOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIHNyY19hbHBoYTEpOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBzcmNfYWxwaGExKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICB9CisgICAgfQorICB9CiAjZW5kaWYKLQl9Ci0Jdm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMjRfNyhGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUEJZVEUgb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCBGWF9CWVRFIGNvdmVyX3NjYW4sIAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgRlhfTFBCWVRFIGNsaXBfc2NhbiwgCi0JCQlGWF9MUEJZVEUgZGVzdF9leHRyYV9hbHBoYV9zY2FuKQotCXsKLQkJQVNTRVJUKCFtX3BEZXZpY2UtPklzQ215a0ltYWdlKCkpOwotCQlkZXN0X3NjYW4gPSAoRlhfQllURSopbV9wRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyBzcGFuX2xlZnQrKHNwYW5fbGVmdDw8MSk7Ci0JCW9yaV9zY2FuICA9IChGWF9CWVRFKiltX3BPcmlEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdCsoc3Bhbl9sZWZ0PDwxKTsKLQkJY2xpcF9zY2FuID0gKEZYX0JZVEUqKW1fcENsaXBNYXNrLT5HZXRTY2FubGluZShzcGFuX3RvcC1jbGlwX3RvcCkgLSBjbGlwX2xlZnQgKyBzcGFuX2xlZnQ7Ci0JCWludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOwotCQlpbnQgY29sX2VuZCA9IChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7Ci0JCWlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KSByZXR1cm47IC8vIGRvIG5vdGhpbmcuCi0JCWRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgKyAoY29sX3N0YXJ0PDwxKTsKLQkJb3JpX3NjYW4gKz0gY29sX3N0YXJ0ICsgKGNvbF9zdGFydDw8MSk7Cit9Cit2b2lkIENGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5SR0IyNF83KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7CisgIEFTU0VSVCghbV9wRGV2aWNlLT5Jc0NteWtJbWFnZSgpKTsKKyAgZGVzdF9zY2FuID0KKyAgICAgICh1aW50OF90KiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdCArIChzcGFuX2xlZnQgPDwgMSk7CisgIG9yaV9zY2FuID0gKHVpbnQ4X3QqKW1fcE9yaURldmljZS0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApICsgc3Bhbl9sZWZ0ICsKKyAgICAgICAgICAgICAoc3Bhbl9sZWZ0IDw8IDEpOworICBjbGlwX3NjYW4gPSAodWludDhfdCopbV9wQ2xpcE1hc2stPkdldFNjYW5saW5lKHNwYW5fdG9wIC0gY2xpcF90b3ApIC0KKyAgICAgICAgICAgICAgY2xpcF9sZWZ0ICsgc3Bhbl9sZWZ0OworICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKKyAgaW50IGNvbF9lbmQgPQorICAgICAgKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKKyAgaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpCisgICAgcmV0dXJuOyAgLy8gZG8gbm90aGluZy4KKyAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCArIChjb2xfc3RhcnQgPDwgMSk7CisgIG9yaV9zY2FuICs9IGNvbF9zdGFydCArIChjb2xfc3RhcnQgPDwgMSk7CiAjaWYgMQotCQlmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotCQkJaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLQkJCWlmIChzcmNfYWxwaGEgPT0gMjU1ICYmIGNvdmVyX3NjYW4gPT0gMjU1KSB7Ci0JCQkJKmRlc3Rfc2NhbisrID0gbV9CbHVlOwotCQkJCSpkZXN0X3NjYW4rKyA9IG1fR3JlZW47Ci0JCQkJKmRlc3Rfc2NhbisrID0gbV9SZWQ7Ci0JCQkJb3JpX3NjYW4gKz0gMzsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWludCBiID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fQmx1ZSwgc3JjX2FscGhhKTsKLQkJCWludCBnID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIHNyY19hbHBoYSk7Ci0JCQlpbnQgciA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX1JlZCwgc3JjX2FscGhhKTsKLQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSggKmRlc3Rfc2NhbiwgYiwgY292ZXJfc2Nhbik7Ci0gCQkJZGVzdF9zY2FuICsrOwotCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGcsIGNvdmVyX3NjYW4pOwotIAkJCWRlc3Rfc2NhbiArKzsKLQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCByLCBjb3Zlcl9zY2FuKTsKLQkJCWRlc3Rfc2NhbiArKzsKLQkJfQorICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICBpZiAoc3JjX2FscGhhID09IDI1NSAmJiBjb3Zlcl9zY2FuID09IDI1NSkgeworICAgICAgKmRlc3Rfc2NhbisrID0gbV9CbHVlOworICAgICAgKmRlc3Rfc2NhbisrID0gbV9HcmVlbjsKKyAgICAgICpkZXN0X3NjYW4rKyA9IG1fUmVkOworICAgICAgb3JpX3NjYW4gKz0gMzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgYiA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0JsdWUsIHNyY19hbHBoYSk7CisgICAgaW50IGcgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmVlbiwgc3JjX2FscGhhKTsKKyAgICBpbnQgciA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX1JlZCwgc3JjX2FscGhhKTsKKyAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYiwgY292ZXJfc2Nhbik7CisgICAgZGVzdF9zY2FuKys7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGcsIGNvdmVyX3NjYW4pOworICAgIGRlc3Rfc2NhbisrOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCByLCBjb3Zlcl9zY2FuKTsKKyAgICBkZXN0X3NjYW4rKzsKKyAgfQogI2Vsc2UKLQkJaWYgKG1fYkZ1bGxDb3ZlcikgeyAKLQkJCWZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0JCQkJaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLQkJCQlpZiAoIXNyY19hbHBoYSl7Ci0JCQkJCSpkZXN0X3NjYW4rKyA9ICpvcmlfc2NhbisrOwotCQkJCQkqZGVzdF9zY2FuKysgPSAqb3JpX3NjYW4rKzsKLQkJCQkJKmRlc3Rfc2NhbisrID0gKm9yaV9zY2FuKys7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoc3JjX2FscGhhID09IDI1NSl7Ci0JCQkJCSpkZXN0X3NjYW4rKyA9IG1fQmx1ZTsKLQkJCQkJKmRlc3Rfc2NhbisrID0gbV9HcmVlbjsKLQkJCQkJKmRlc3Rfc2NhbisrID0gbV9SZWQ7Ci0JCQkJCW9yaV9zY2FuICs9IDM7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkqZGVzdF9zY2FuKysgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9CbHVlLCBzcmNfYWxwaGEpOwotCQkJCSpkZXN0X3NjYW4rKyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyZWVuLCBzcmNfYWxwaGEpOwotCQkJCSpkZXN0X3NjYW4rKyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX1JlZCwgc3JjX2FscGhhKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0JCQkJaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLQkJCQlpZiAoc3JjX2FscGhhID09IDI1NSAmJiBjb3Zlcl9zY2FuID09IDI1NSkgewotCQkJCQkqZGVzdF9zY2FuKysgPSBtX0JsdWU7Ci0JCQkJCSpkZXN0X3NjYW4rKyA9IG1fR3JlZW47Ci0JCQkJCSpkZXN0X3NjYW4rKyA9IG1fUmVkOwotCQkJCQlvcmlfc2NhbiArPSAzOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaW50IGIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9CbHVlLCBzcmNfYWxwaGEpOwotCQkJCWludCBnID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIHNyY19hbHBoYSk7Ci0JCQkJaW50IHIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9SZWQsIHNyY19hbHBoYSk7Ci0JCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCAqZGVzdF9zY2FuLCBiLCBjb3Zlcl9zY2FuKTsKLSAJCQkJZGVzdF9zY2FuICsrOwotCQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBnLCBjb3Zlcl9zY2FuKTsKLSAJCQkJZGVzdF9zY2FuICsrOwotCQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCByLCBjb3Zlcl9zY2FuKTsKLQkJCQlkZXN0X3NjYW4gKys7Ci0JCQl9Ci0JCX0KKyAgaWYgKG1fYkZ1bGxDb3ZlcikgeworICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgICBpZiAoIXNyY19hbHBoYSkgeworICAgICAgICAqZGVzdF9zY2FuKysgPSAqb3JpX3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKm9yaV9zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICpvcmlfc2NhbisrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fQmx1ZTsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9HcmVlbjsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9SZWQ7CisgICAgICAgIG9yaV9zY2FuICs9IDM7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fQmx1ZSwgc3JjX2FscGhhKTsKKyAgICAgICpkZXN0X3NjYW4rKyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyZWVuLCBzcmNfYWxwaGEpOworICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fUmVkLCBzcmNfYWxwaGEpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUgJiYgY292ZXJfc2NhbiA9PSAyNTUpIHsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9CbHVlOworICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOworICAgICAgICAqZGVzdF9zY2FuKysgPSBtX1JlZDsKKyAgICAgICAgb3JpX3NjYW4gKz0gMzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpbnQgYiA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0JsdWUsIHNyY19hbHBoYSk7CisgICAgICBpbnQgZyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyZWVuLCBzcmNfYWxwaGEpOworICAgICAgaW50IHIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9SZWQsIHNyY19hbHBoYSk7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYiwgY292ZXJfc2Nhbik7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBnLCBjb3Zlcl9zY2FuKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHIsIGNvdmVyX3NjYW4pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgfQorICB9CiAjZW5kaWYKLQl9Ci0Jdm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMjRfMTAoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBCWVRFIG9yaV9zY2FuLGludCBCcHAsCi0JCQlpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgRlhfQllURSBjb3Zlcl9zY2FuLCAKLQkJCWludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIEZYX0xQQllURSBjbGlwX3NjYW4sIAotCQkJRlhfTFBCWVRFIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikKLQl7Ci0JCWRlc3Rfc2NhbiA9IChGWF9CWVRFKiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdCsoc3Bhbl9sZWZ0PDwxKTsKLQkJZGVzdF9leHRyYV9hbHBoYV9zY2FuID0gIChGWF9CWVRFKiltX3BEZXZpY2UtPm1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUoc3Bhbl90b3ApK3NwYW5fbGVmdDsKLQkJaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7Ci0JCWludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQgPyBzcGFuX2xlbiA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKLQkJaWYgKGNvbF9lbmQgPCBjb2xfc3RhcnQpIHJldHVybjsgLy8gZG8gbm90aGluZy4KLQkJZGVzdF9zY2FuICs9IGNvbF9zdGFydCsoY29sX3N0YXJ0PDwxKTsKK30KK3ZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjI0XzEwKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKKyAgZGVzdF9zY2FuID0KKyAgICAgICh1aW50OF90KiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdCArIChzcGFuX2xlZnQgPDwgMSk7CisgIGRlc3RfZXh0cmFfYWxwaGFfc2NhbiA9CisgICAgICAodWludDhfdCopbV9wRGV2aWNlLT5tX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdDsKKyAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7CisgIGludCBjb2xfZW5kID0KKyAgICAgIChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7CisgIGlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KQorICAgIHJldHVybjsgIC8vIGRvIG5vdGhpbmcuCisgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgKyAoY29sX3N0YXJ0IDw8IDEpOwogI2lmIDEKLQkJaWYgKG1fQWxwaGEgPT0gMjU1ICYmIGNvdmVyX3NjYW4gPT0gMjU1KSB7Ci0JCQlmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotCQkJCSpkZXN0X3NjYW4rKyA9IChGWF9CWVRFKW1fQmx1ZTsKLQkJCQkqZGVzdF9zY2FuKysgPSAoRlhfQllURSltX0dyZWVuOwotCQkJCSpkZXN0X3NjYW4rKyA9IChGWF9CWVRFKW1fUmVkOwotCQkJCSpkZXN0X2V4dHJhX2FscGhhX3NjYW4rKyA9IDI1NTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gLyAyNTU7Ci0JCWZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0JCQkvLyBEZXN0IGZvcm1hdDogUmdiYQotCQkJLy8gY2FsY3VsYXRlIGRlc3RpbmF0aW9uIGFscGhhIChpdCdzIHVuaW9uIG9mIHNvdXJjZSBhbmQgZGVzdCBhbHBoYSkKLQkJCUZYX0JZVEUgZGVzdF9hbHBoYSA9ICgqZGVzdF9leHRyYV9hbHBoYV9zY2FuKSArIHNyY19hbHBoYSAtIAotCQkJCQkJCQkoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKiBzcmNfYWxwaGEgLyAyNTU7Ci0JCQkqZGVzdF9leHRyYV9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOwotCQkJaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhKjI1NS9kZXN0X2FscGhhOwotCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOwotCQkJZGVzdF9zY2FuICsrOwotCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKLQkJCWRlc3Rfc2NhbiArKzsKLQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgYWxwaGFfcmF0aW8pOwotCQkJZGVzdF9zY2FuICsrOwkJCQotCQl9CisgIGlmIChtX0FscGhhID09IDI1NSAmJiBjb3Zlcl9zY2FuID09IDI1NSkgeworICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KW1fQmx1ZTsKKyAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KW1fR3JlZW47CisgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCltX1JlZDsKKyAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4rKyA9IDI1NTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKKyAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgIC8vIERlc3QgZm9ybWF0OiBSZ2JhCisgICAgLy8gY2FsY3VsYXRlIGRlc3RpbmF0aW9uIGFscGhhIChpdCdzIHVuaW9uIG9mIHNvdXJjZSBhbmQgZGVzdCBhbHBoYSkKKyAgICB1aW50OF90IGRlc3RfYWxwaGEgPSAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKyBzcmNfYWxwaGEgLQorICAgICAgICAgICAgICAgICAgICAgICAgICgqZGVzdF9leHRyYV9hbHBoYV9zY2FuKSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAqZGVzdF9leHRyYV9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhbisrOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7CisgICAgZGVzdF9zY2FuKys7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7CisgICAgZGVzdF9zY2FuKys7CisgIH0KICNlbHNlCi0JCWlmIChtX2JGdWxsQ292ZXIpIHsKLQkJCWlmIChtX0FscGhhID09IDI1NSkgewotCQkJCWZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0JCQkJCSpkZXN0X3NjYW4rKyA9IChGWF9CWVRFKW1fQmx1ZTsKLQkJCQkJKmRlc3Rfc2NhbisrID0gKEZYX0JZVEUpbV9HcmVlbjsKLQkJCQkJKmRlc3Rfc2NhbisrID0gKEZYX0JZVEUpbV9SZWQ7Ci0JCQkJCSpkZXN0X2V4dHJhX2FscGhhX3NjYW4rKyA9IDI1NTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLQkJCQkvLyBEZXN0IGZvcm1hdDogUmdiYQotCQkJCS8vIGNhbGN1bGF0ZSBkZXN0aW5hdGlvbiBhbHBoYSAoaXQncyB1bmlvbiBvZiBzb3VyY2UgYW5kIGRlc3QgYWxwaGEpCi0JCQkJRlhfQllURSBkZXN0X2FscGhhID0gKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICsgbV9BbHBoYSAtIAotCQkJCQkJCQkJKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICogbV9BbHBoYSAvIDI1NTsKLQkJCQkqZGVzdF9leHRyYV9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOwotCQkJCWludCBhbHBoYV9yYXRpbyA9IG1fQWxwaGEqMjU1L2Rlc3RfYWxwaGE7Ci0JCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOwotCQkJCWRlc3Rfc2NhbiArKzsKLQkJCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOwotCQkJCWRlc3Rfc2NhbiArKzsKLQkJCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGFscGhhX3JhdGlvKTsKLQkJCQlkZXN0X3NjYW4gKys7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobV9BbHBoYSA9PSAyNTUgJiYgY292ZXJfc2NhbiA9PSAyNTUpIHsKLQkJCQlmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotCQkJCQkqZGVzdF9zY2FuKysgPSAoRlhfQllURSltX0JsdWU7Ci0JCQkJCSpkZXN0X3NjYW4rKyA9IChGWF9CWVRFKW1fR3JlZW47Ci0JCQkJCSpkZXN0X3NjYW4rKyA9IChGWF9CWVRFKW1fUmVkOwotCQkJCQkqZGVzdF9leHRyYV9hbHBoYV9zY2FuKysgPSAyNTU7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCWludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKLQkJCWZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sICsrKSB7Ci0JCQkJLy8gRGVzdCBmb3JtYXQ6IFJnYmEKLQkJCQkvLyBjYWxjdWxhdGUgZGVzdGluYXRpb24gYWxwaGEgKGl0J3MgdW5pb24gb2Ygc291cmNlIGFuZCBkZXN0IGFscGhhKQotCQkJCUZYX0JZVEUgZGVzdF9hbHBoYSA9ICgqZGVzdF9leHRyYV9hbHBoYV9zY2FuKSArIHNyY19hbHBoYSAtIAotCQkJCQkJCQkJKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICogc3JjX2FscGhhIC8gMjU1OwotCQkJCSpkZXN0X2V4dHJhX2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7Ci0JCQkJaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhKjI1NS9kZXN0X2FscGhhOwotCQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKLQkJCQlkZXN0X3NjYW4gKys7Ci0JCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKLQkJCQlkZXN0X3NjYW4gKys7Ci0JCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7Ci0JCQkJZGVzdF9zY2FuICsrOwkJCQotCQkJfQotCQl9CisgIGlmIChtX2JGdWxsQ292ZXIpIHsKKyAgICBpZiAobV9BbHBoYSA9PSAyNTUpIHsKKyAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9CbHVlOworICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCltX0dyZWVuOworICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCltX1JlZDsKKyAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gMjU1OworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgICAvLyBEZXN0IGZvcm1hdDogUmdiYQorICAgICAgLy8gY2FsY3VsYXRlIGRlc3RpbmF0aW9uIGFscGhhIChpdCdzIHVuaW9uIG9mIHNvdXJjZSBhbmQgZGVzdCBhbHBoYSkKKyAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9ICgqZGVzdF9leHRyYV9hbHBoYV9zY2FuKSArIG1fQWxwaGEgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICogbV9BbHBoYSAvIDI1NTsKKyAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7CisgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBtX0FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKG1fQWxwaGEgPT0gMjU1ICYmIGNvdmVyX3NjYW4gPT0gMjU1KSB7CisgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KW1fQmx1ZTsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9HcmVlbjsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9SZWQ7CisgICAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4rKyA9IDI1NTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OworICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgIC8vIERlc3QgZm9ybWF0OiBSZ2JhCisgICAgICAvLyBjYWxjdWxhdGUgZGVzdGluYXRpb24gYWxwaGEgKGl0J3MgdW5pb24gb2Ygc291cmNlIGFuZCBkZXN0IGFscGhhKQorICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICsgc3JjX2FscGhhIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZGVzdF9leHRyYV9hbHBoYV9zY2FuKSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7CisgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgIH0KKyAgfQogI2VuZGlmCi0JfQotCXZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjI0XzE0KEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQllURSBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIEZYX0JZVEUgY292ZXJfc2NhbiwgCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCBGWF9MUEJZVEUgY2xpcF9zY2FuLCAKLQkJCUZYX0xQQllURSBkZXN0X2V4dHJhX2FscGhhX3NjYW4pCi0JewotCQlkZXN0X3NjYW4gPSAoRlhfQllURSopbV9wRGV2aWNlLT5HZXRTY2FubGluZShzcGFuX3RvcCkgKyBzcGFuX2xlZnQrKHNwYW5fbGVmdDw8MSk7Ci0JCWRlc3RfZXh0cmFfYWxwaGFfc2NhbiA9ICAoRlhfQllURSopbV9wRGV2aWNlLT5tX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKHNwYW5fdG9wKStzcGFuX2xlZnQ7Ci0JCWNsaXBfc2NhbiA9IChGWF9CWVRFKiltX3BDbGlwTWFzay0+R2V0U2NhbmxpbmUoc3Bhbl90b3AtY2xpcF90b3ApIC0gY2xpcF9sZWZ0ICsgc3Bhbl9sZWZ0OwotCQlpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLQkJaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotCQlpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkgcmV0dXJuOyAvLyBkbyBub3RoaW5nLgotCQlkZXN0X3NjYW4gKz0gY29sX3N0YXJ0ICsgKGNvbF9zdGFydCA8PCAxKTsKK30KK3ZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjI0XzE0KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKKyAgZGVzdF9zY2FuID0KKyAgICAgICh1aW50OF90KiltX3BEZXZpY2UtPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdCArIChzcGFuX2xlZnQgPDwgMSk7CisgIGRlc3RfZXh0cmFfYWxwaGFfc2NhbiA9CisgICAgICAodWludDhfdCopbV9wRGV2aWNlLT5tX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKHNwYW5fdG9wKSArIHNwYW5fbGVmdDsKKyAgY2xpcF9zY2FuID0gKHVpbnQ4X3QqKW1fcENsaXBNYXNrLT5HZXRTY2FubGluZShzcGFuX3RvcCAtIGNsaXBfdG9wKSAtCisgICAgICAgICAgICAgIGNsaXBfbGVmdCArIHNwYW5fbGVmdDsKKyAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7CisgIGludCBjb2xfZW5kID0KKyAgICAgIChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7CisgIGlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KQorICAgIHJldHVybjsgIC8vIGRvIG5vdGhpbmcuCisgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgKyAoY29sX3N0YXJ0IDw8IDEpOwogI2lmIDEKLQkJaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OwotCQlmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCArKykgewotCQkJaW50IHNyY19hbHBoYTEgPSBzcmNfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLQkJCWlmICghc3JjX2FscGhhMSkgewotCQkJCWRlc3RfZXh0cmFfYWxwaGFfc2NhbisrOwotCQkJCWRlc3Rfc2NhbiArPSAzOwotCQkJCWNvbnRpbnVlOwotCQkJfQkJCQkKLQkJCWlmIChzcmNfYWxwaGExID09IDI1NSkgewotCQkJCSpkZXN0X3NjYW4rKyA9IChGWF9CWVRFKW1fQmx1ZTsKLQkJCQkqZGVzdF9zY2FuKysgPSAoRlhfQllURSltX0dyZWVuOwotCQkJCSpkZXN0X3NjYW4rKyA9IChGWF9CWVRFKW1fUmVkOwotCQkJCSpkZXN0X2V4dHJhX2FscGhhX3NjYW4rKyA9IChGWF9CWVRFKW1fQWxwaGE7Ci0JCQl9IGVsc2UgewotCQkJCS8vIERlc3QgZm9ybWF0OiBSZ2JhCi0JCQkJLy8gY2FsY3VsYXRlIGRlc3RpbmF0aW9uIGFscGhhIChpdCdzIHVuaW9uIG9mIHNvdXJjZSBhbmQgZGVzdCBhbHBoYSkKLQkJCQlGWF9CWVRFIGRlc3RfYWxwaGEgPSAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKyBzcmNfYWxwaGExIC0gCi0JCQkJCQkJCQkoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKiBzcmNfYWxwaGExIC8gMjU1OwotCQkJCSpkZXN0X2V4dHJhX2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7Ci0JCQkJaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhMSoyNTUvZGVzdF9hbHBoYTsKLQkJCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBhbHBoYV9yYXRpbyk7Ci0JCQkJZGVzdF9zY2FuICsrOwotCQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7Ci0JCQkJZGVzdF9zY2FuICsrOwotCQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgYWxwaGFfcmF0aW8pOwotCQkJCWRlc3Rfc2NhbiArKzsKLQkJCX0KLQkJfQorICBpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gLyAyNTU7CisgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICBpbnQgc3JjX2FscGhhMSA9IHNyY19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgIGlmICghc3JjX2FscGhhMSkgeworICAgICAgZGVzdF9leHRyYV9hbHBoYV9zY2FuKys7CisgICAgICBkZXN0X3NjYW4gKz0gMzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoc3JjX2FscGhhMSA9PSAyNTUpIHsKKyAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KW1fQmx1ZTsKKyAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KW1fR3JlZW47CisgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCltX1JlZDsKKyAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4rKyA9ICh1aW50OF90KW1fQWxwaGE7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIERlc3QgZm9ybWF0OiBSZ2JhCisgICAgICAvLyBjYWxjdWxhdGUgZGVzdGluYXRpb24gYWxwaGEgKGl0J3MgdW5pb24gb2Ygc291cmNlIGFuZCBkZXN0IGFscGhhKQorICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICsgc3JjX2FscGhhMSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKiBzcmNfYWxwaGExIC8gMjU1OworICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKKyAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYTEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgIH0KKyAgfQogI2Vsc2UKLQkJaWYgKG1fYkZ1bGxDb3ZlcikgewotCQkJZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLQkJCQlpbnQgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotCQkJCWlmICghc3JjX2FscGhhKSB7Ci0JCQkJCWRlc3RfZXh0cmFfYWxwaGFfc2NhbisrOwotCQkJCQlkZXN0X3NjYW4gKz0gMzsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChzcmNfYWxwaGEgPT0gMjU1KSB7Ci0JCQkJCSpkZXN0X3NjYW4rKyA9IChGWF9CWVRFKW1fQmx1ZTsKLQkJCQkJKmRlc3Rfc2NhbisrID0gKEZYX0JZVEUpbV9HcmVlbjsKLQkJCQkJKmRlc3Rfc2NhbisrID0gKEZYX0JZVEUpbV9SZWQ7Ci0JCQkJCSpkZXN0X2V4dHJhX2FscGhhX3NjYW4rKyA9IChGWF9CWVRFKW1fQWxwaGE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gRGVzdCBmb3JtYXQ6IFJnYmEKLQkJCQkJLy8gY2FsY3VsYXRlIGRlc3RpbmF0aW9uIGFscGhhIChpdCdzIHVuaW9uIG9mIHNvdXJjZSBhbmQgZGVzdCBhbHBoYSkKLQkJCQkJRlhfQllURSBkZXN0X2FscGhhID0gKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICsgc3JjX2FscGhhIC0gCi0JCQkJCQkJCQkJKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICogc3JjX2FscGhhIC8gMjU1OwotCQkJCQkqZGVzdF9leHRyYV9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOwotCQkJCQlpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEqMjU1L2Rlc3RfYWxwaGE7Ci0JCQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKLQkJCQkJZGVzdF9zY2FuICsrOwotCQkJCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOwotCQkJCQlkZXN0X3NjYW4gKys7Ci0JCQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgYWxwaGFfcmF0aW8pOwotCQkJCQlkZXN0X3NjYW4gKys7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OwotCQkJZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLQkJCQlpbnQgc3JjX2FscGhhMSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0JCQkJaWYgKCFzcmNfYWxwaGExKSB7Ci0JCQkJCWRlc3RfZXh0cmFfYWxwaGFfc2NhbisrOwotCQkJCQlkZXN0X3NjYW4gKz0gMzsKLQkJCQkJY29udGludWU7Ci0JCQkJfQkJCQkKLQkJCQlpZiAoc3JjX2FscGhhMSA9PSAyNTUpIHsKLQkJCQkJKmRlc3Rfc2NhbisrID0gKEZYX0JZVEUpbV9CbHVlOwotCQkJCQkqZGVzdF9zY2FuKysgPSAoRlhfQllURSltX0dyZWVuOwotCQkJCQkqZGVzdF9zY2FuKysgPSAoRlhfQllURSltX1JlZDsKLQkJCQkJKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gKEZYX0JZVEUpbV9BbHBoYTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBEZXN0IGZvcm1hdDogUmdiYQotCQkJCQkvLyBjYWxjdWxhdGUgZGVzdGluYXRpb24gYWxwaGEgKGl0J3MgdW5pb24gb2Ygc291cmNlIGFuZCBkZXN0IGFscGhhKQotCQkJCQlGWF9CWVRFIGRlc3RfYWxwaGEgPSAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKyBzcmNfYWxwaGExIC0gCi0JCQkJCQkJCQkJKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICogc3JjX2FscGhhMSAvIDI1NTsKLQkJCQkJKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKLQkJCQkJaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhMSoyNTUvZGVzdF9hbHBoYTsKLQkJCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOwotCQkJCQlkZXN0X3NjYW4gKys7Ci0JCQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7Ci0JCQkJCWRlc3Rfc2NhbiArKzsKLQkJCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7Ci0JCQkJCWRlc3Rfc2NhbiArKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgaWYgKG1fYkZ1bGxDb3ZlcikgeworICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgICBpZiAoIXNyY19hbHBoYSkgeworICAgICAgICBkZXN0X2V4dHJhX2FscGhhX3NjYW4rKzsKKyAgICAgICAgZGVzdF9zY2FuICs9IDM7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9CbHVlOworICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCltX0dyZWVuOworICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCltX1JlZDsKKyAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gKHVpbnQ4X3QpbV9BbHBoYTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIERlc3QgZm9ybWF0OiBSZ2JhCisgICAgICAgIC8vIGNhbGN1bGF0ZSBkZXN0aW5hdGlvbiBhbHBoYSAoaXQncyB1bmlvbiBvZiBzb3VyY2UgYW5kIGRlc3QgYWxwaGEpCisgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9ICgqZGVzdF9leHRyYV9hbHBoYV9zY2FuKSArIHNyY19hbHBoYSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZGVzdF9leHRyYV9hbHBoYV9zY2FuKSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKKyAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgYWxwaGFfcmF0aW8pOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW50IHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuIC8gMjU1OworICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGExID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgIGlmICghc3JjX2FscGhhMSkgeworICAgICAgICBkZXN0X2V4dHJhX2FscGhhX3NjYW4rKzsKKyAgICAgICAgZGVzdF9zY2FuICs9IDM7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYTEgPT0gMjU1KSB7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KW1fQmx1ZTsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9HcmVlbjsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9SZWQ7CisgICAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4rKyA9ICh1aW50OF90KW1fQWxwaGE7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBEZXN0IGZvcm1hdDogUmdiYQorICAgICAgICAvLyBjYWxjdWxhdGUgZGVzdGluYXRpb24gYWxwaGEgKGl0J3MgdW5pb24gb2Ygc291cmNlIGFuZCBkZXN0IGFscGhhKQorICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKyBzcmNfYWxwaGExIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICogc3JjX2FscGhhMSAvIDI1NTsKKyAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKKyAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhMSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICB9CisgICAgfQorICB9CiAjZW5kaWYKLQl9Ci0JLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotCS8vIEEgZ2VuZXJhbCBhbHBoYSBtZXJnZSBmdW5jdGlvbiAod2l0aCBjbGlwcGluZyBtYXNrKS4gQ215a2EvQ215ayBkZXZpY2UuCi0Jdm9pZCBDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuQ01ZSyhGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUEJZVEUgb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCBGWF9CWVRFIGNvdmVyX3NjYW4sIAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgRlhfTFBCWVRFIGNsaXBfc2NhbiwgCi0JCQlGWF9MUEJZVEUgZGVzdF9leHRyYV9hbHBoYV9zY2FuKQotCXsKLQkJQVNTRVJUKCFtX2JSZ2JCeXRlT3JkZXIpOwotCQkvLyBDbXlrKGEpCi0JCWludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOwotCQlpbnQgY29sX2VuZCA9IChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0ID8gc3Bhbl9sZW4gOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7Ci0JCWlmIChjb2xfZW5kIDwgY29sX3N0YXJ0KSByZXR1cm47IC8vIGRvIG5vdGhpbmcuCi0JCWRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgKiA0OwotCQlCcHA7IC8vIGZvciBhdm9pZCBjb21waWxlIHdhcm5pbmcuCi0JCQotCQlpZiAoZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7Ci0JCQkvLyBDTVlLYQotCQkJZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLQkJCQlpbnQgc3JjX2FscGhhOwotCQkJCWlmIChtX2JGdWxsQ292ZXIpIHsKLQkJCQkJaWYgKGNsaXBfc2NhbikKLQkJCQkJCXNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLQkJCQkJZWxzZQotCQkJCQkJc3JjX2FscGhhID0gbV9BbHBoYTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoY2xpcF9zY2FuKQotCQkJCQkJc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLQkJCQkJZWxzZQotCQkJCQkJc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gLyAyNTU7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChzcmNfYWxwaGEpIHsKLQkJCQkJaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLQkJCQkJCSooRlhfQ01ZSyopZGVzdF9zY2FuID0gbV9Db2xvcjsKLQkJCQkJCSpkZXN0X2V4dHJhX2FscGhhX3NjYW4gPSAoRlhfQllURSltX0FscGhhOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gRGVzdCBmb3JtYXQ6IENteWthCi0JCQkJCQkvLyBjYWxjdWxhdGUgZGVzdGluYXRpb24gYWxwaGEgKGl0J3MgdW5pb24gb2Ygc291cmNlIGFuZCBkZXN0IGFscGhhKQotCQkJCQkJRlhfQllURSBkZXN0X2FscGhhID0gKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICsgc3JjX2FscGhhIC0gCi0JCQkJCQkJKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICogc3JjX2FscGhhIC8gMjU1OwotCQkJCQkJKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKLQkJCQkJCWludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSoyNTUvZGVzdF9hbHBoYTsKLQkJCQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgYWxwaGFfcmF0aW8pOwotCQkJCQkJZGVzdF9zY2FuICsrOwotCQkJCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKLQkJCQkJCWRlc3Rfc2NhbiArKzsKLQkJCQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKLQkJCQkJCWRlc3Rfc2NhbiArKzsKLQkJCQkJCSpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyYXksIGFscGhhX3JhdGlvKTsKLQkJCQkJCWRlc3Rfc2NhbiArKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWRlc3RfZXh0cmFfYWxwaGFfc2NhbisrOwotCQkJCWRlc3Rfc2NhbiArPSA0OwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gQ01ZSwotCQkJZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wgKyspIHsKLQkJCQlpbnQgc3JjX2FscGhhOwotCQkJCWlmIChjbGlwX3NjYW4pCi0JCQkJCXNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuICogY2xpcF9zY2FuW2NvbF0gLyAyNTUgLyAyNTU7Ci0JCQkJZWxzZQotCQkJCQlzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKLQkJCQkKLQkJCQlpZiAoc3JjX2FscGhhKSB7Ci0JCQkJCWlmIChzcmNfYWxwaGEgPT0gMjU1KSB7Ci0JCQkJCQkqKEZYX0NNWUsqKWRlc3Rfc2NhbiA9IG1fQ29sb3I7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBEZXN0IGZvcm1hdDogY215awotCQkJCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOwotCQkJCQkJZGVzdF9zY2FuICsrOwotCQkJCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIHNyY19hbHBoYSk7Ci0JCQkJCQlkZXN0X3NjYW4gKys7Ci0JCQkJCQkqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBzcmNfYWxwaGEpOwotCQkJCQkJZGVzdF9zY2FuICsrOwotCQkJCQkJKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JheSwgc3JjX2FscGhhKTsKLQkJCQkJCWRlc3Rfc2NhbiArKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWRlc3Rfc2NhbiArPSA0OwotCQkJfQotCQl9Ci0JfQorLy8gQSBnZW5lcmFsIGFscGhhIG1lcmdlIGZ1bmN0aW9uICh3aXRoIGNsaXBwaW5nIG1hc2spLiBDbXlrYS9DbXlrIGRldmljZS4KK3ZvaWQgQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkNNWUsodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKKyAgQVNTRVJUKCFtX2JSZ2JCeXRlT3JkZXIpOworICAvLyBDbXlrKGEpCisgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOworICBpbnQgY29sX2VuZCA9CisgICAgICAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOworICBpZiAoY29sX2VuZCA8IGNvbF9zdGFydCkKKyAgICByZXR1cm47ICAvLyBkbyBub3RoaW5nLgorICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0ICogNDsKKyAgQnBwOyAgLy8gZm9yIGF2b2lkIGNvbXBpbGUgd2FybmluZy4KIAotICAgCi0JCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUZYX0JPT0wgQ0ZYX1NraWFSZW5kZXJlcjo6SW5pdChDRlhfRElCaXRtYXAqIHBEZXZpY2UsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLCBGWF9EV09SRCBjb2xvciwgRlhfQk9PTCBiRnVsbENvdmVyLCBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsIAotCQlpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkgLy9UaGUgYWxwaGEgZmxhZyBtdXN0IGJlIGZpbGxfZmxhZyBpZiBleGlzdC4KLQl7Ci0JCW1fcERldmljZSA9IHBEZXZpY2U7Ci0JCW1fcENsaXBSZ24gPSBwQ2xpcFJnbjsKLQkJbV9iUmdiQnl0ZU9yZGVyID0gYlJnYkJ5dGVPcmRlcjsKLQkJbV9wT3JpRGV2aWNlID0gcE9yaURldmljZTsKLQkJbV9wRGVzdFNjYW4gPSBOVUxMOwotCQltX3BEZXN0RXh0cmFBbHBoYVNjYW4gPSBOVUxMOwotCQltX3BPcmlTY2FuID0gTlVMTDsKLQkJbV9wQ2xpcFNjYW4gPSBOVUxMOwotCQljb21wb3NpdGVfc3BhbiA9IE5VTEw7Ci0JCWlmIChtX3BDbGlwUmduKQotCQkJbV9DbGlwQm94ID0gbV9wQ2xpcFJnbi0+R2V0Qm94KCk7Ci0JCWVsc2UgewotCQkJbV9DbGlwQm94LmxlZnQgPSBtX0NsaXBCb3gudG9wID0gMDsKLQkJCW1fQ2xpcEJveC5yaWdodCA9IG1fcERldmljZS0+R2V0V2lkdGgoKTsKLQkJCW1fQ2xpcEJveC5ib3R0b20gPSBtX3BEZXZpY2UtPkdldEhlaWdodCgpOwotCQl9Ci0JCW1fcENsaXBNYXNrID0gTlVMTDsKLQkJaWYgKG1fcENsaXBSZ24gJiYgbV9wQ2xpcFJnbi0+R2V0VHlwZSgpID09IENGWF9DbGlwUmduOjpNYXNrRikKLQkJewotCQkJbV9wQ2xpcE1hc2sgPSBtX3BDbGlwUmduLT5HZXRNYXNrKCk7Ci0JCQltX3BDbGlwU2NhbiA9IG1fcENsaXBNYXNrLT5HZXRCdWZmZXIoKTsKLQkJfQotCQlpZiAobV9wRGV2aWNlLT5tX3BBbHBoYU1hc2spCi0JCQltX3BEZXN0RXh0cmFBbHBoYVNjYW4gPSBtX3BEZXZpY2UtPm1fcEFscGhhTWFzay0+R2V0QnVmZmVyKCk7Ci0JCWlmIChtX3BPcmlEZXZpY2UpCi0JCQltX3BPcmlTY2FuID0gbV9wT3JpRGV2aWNlLT5HZXRCdWZmZXIoKTsKLQkJbV9wRGVzdFNjYW4gPSBtX3BEZXZpY2UtPkdldEJ1ZmZlcigpOwotCQkKLQkJbV9iRnVsbENvdmVyID0gYkZ1bGxDb3ZlcjsKLQkJCi0JCUZYX0JPT0wgYk9iamVjdENNWUsgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpOwotCQlGWF9CT09MIGJEZXZpY2VDTVlLID0gcERldmljZS0+SXNDbXlrSW1hZ2UoKTsKKyAgaWYgKGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgeworICAgIC8vIENNWUthCisgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgaW50IHNyY19hbHBoYTsKKyAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKKyAgICAgICAgaWYgKGNsaXBfc2NhbikKKyAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGNsaXBfc2NhbikKKyAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OworICAgICAgICBlbHNlCisgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW4gLyAyNTU7CisgICAgICB9CiAKLQkJbV9BbHBoYSA9IGJPYmplY3RDTVlLID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShjb2xvcik7CisgICAgICBpZiAoc3JjX2FscGhhKSB7CisgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgICAgICAgKihGWF9DTVlLKilkZXN0X3NjYW4gPSBtX0NvbG9yOworICAgICAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4gPSAodWludDhfdCltX0FscGhhOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIERlc3QgZm9ybWF0OiBDbXlrYQorICAgICAgICAgIC8vIGNhbGN1bGF0ZSBkZXN0aW5hdGlvbiBhbHBoYSAoaXQncyB1bmlvbiBvZiBzb3VyY2UgYW5kIGRlc3QgYWxwaGEpCisgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICsgc3JjX2FscGhhIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKKyAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgYWxwaGFfcmF0aW8pOworICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOworICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyYXksIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZGVzdF9leHRyYV9hbHBoYV9zY2FuKys7CisgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gQ01ZSworICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGE7CisgICAgICBpZiAoY2xpcF9zY2FuKQorICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OworICAgICAgZWxzZQorICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2NhbiAvIDI1NTsKIAotCQlJQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0gTlVMTDsKLQkJLy8gTm8gbGNtcyBlbmdpbmUsIHdlIHNraXAgdGhlIHRyYW5zZm9ybQotCQlpZiAoIUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCkgfHwgIUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpKSAKLQkJCXBJY2NUcmFuc2Zvcm0gPSBOVUxMOwotCQllbHNlCi0JCQlwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0JCQotCQlpZiAobV9wRGV2aWNlLT5HZXRCUFAoKSA9PSA4KSB7IC8vIEdyYXkoYSkgZGV2aWNlCi0JCQlBU1NFUlQoIW1fYlJnYkJ5dGVPcmRlcik7Ci0JCQlpZiAobV9wRGV2aWNlLT5Jc0FscGhhTWFzaygpKSB7Ci0JCQkJLy9BbHBoYSBNYXNrCi0JCQkJbV9HcmF5ID0gMjU1OwotCQkJfSBlbHNlIHsKLQkJCQkvL0dyYXkoYSkgZGV2aWNlCi0JCQkJaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLQkJCQkJRlhfQllURSBncmF5OwotCQkJCQljb2xvciA9IGJPYmplY3RDTVlLID8gRlhDTVlLX1RPRElCKGNvbG9yKSA6IEZYQVJHQl9UT0RJQihjb2xvcik7Ci0JCQkJCXBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LCAoRlhfTFBDQllURSkmY29sb3IsIDEpOwotCQkJCQltX0dyYXkgPSBncmF5OwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChiT2JqZWN0Q01ZSykgewotCQkJCQkJRlhfQllURSByLCBnLCBiOwotCQkJCQkJQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShjb2xvciksIEZYU1lTX0dldE1WYWx1ZShjb2xvciksIEZYU1lTX0dldFlWYWx1ZShjb2xvciksIEZYU1lTX0dldEtWYWx1ZShjb2xvciksIAotCQkJCQkJCXIsIGcsIGIpOwotCQkJCQkJbV9HcmF5ID0gRlhSR0IyR1JBWShyLCBnLCBiKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCW1fR3JheSA9IEZYUkdCMkdSQVkoRlhBUkdCX1IoY29sb3IpLCBGWEFSR0JfRyhjb2xvciksIEZYQVJHQl9CKGNvbG9yKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoYkRldmljZUNNWUspIHsgLy8gQ215ayhhKSBEZXZpY2UKLQkJCQlBU1NFUlQoIW1fYlJnYkJ5dGVPcmRlcik7Ci0JCQkJLy9UT0RPLi4uIG9wdCBmb3IgY215awotCQkJCWNvbXBvc2l0ZV9zcGFuID0gJkNGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5DTVlLOwotCQkJCWlmIChiT2JqZWN0Q01ZSykgeyAKLQkJCQkJbV9Db2xvciA9IEZYQ01ZS19UT0RJQihjb2xvcik7Ci0JCQkJCWlmIChwSWNjVHJhbnNmb3JtKQotCQkJCQkJcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKEZYX0xQQllURSkmbV9Db2xvciwgKEZYX0xQQ0JZVEUpJm1fQ29sb3IsIDEpOwotCQkJCX0gZWxzZSB7IC8vIE9iamVjdCBSR0IKLQkJCQkJaWYgKCFwSWNjVHJhbnNmb3JtKQotCQkJCQkJcmV0dXJuIEZBTFNFOwotCQkJCQljb2xvciA9IEZYQVJHQl9UT0RJQihjb2xvcik7Ci0JCQkJCXBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIChGWF9MUEJZVEUpJm1fQ29sb3IsIChGWF9MUENCWVRFKSZjb2xvciwgMSk7Ci0JCQkJfQotCQkJCW1fUmVkCT0gKChGWF9MUEJZVEUpJm1fQ29sb3IpWzBdOwotCQkJCW1fR3JlZW4gPSAoKEZYX0xQQllURSkmbV9Db2xvcilbMV07Ci0JCQkJbV9CbHVlCT0gKChGWF9MUEJZVEUpJm1fQ29sb3IpWzJdOwotCQkJCW1fR3JheQk9ICgoRlhfTFBCWVRFKSZtX0NvbG9yKVszXTsKLQkJCQlyZXR1cm4gVFJVRTsKLQkJCX0gZWxzZSB7IAotCQkJCWlmIChwSWNjVHJhbnNmb3JtKSB7Ci0JCQkJCWNvbG9yID0gYk9iamVjdENNWUsgPyBGWENNWUtfVE9ESUIoY29sb3IpIDogRlhBUkdCX1RPRElCKGNvbG9yKTsKLQkJCQkJcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKEZYX0xQQllURSkmbV9Db2xvciwgKEZYX0xQQ0JZVEUpJmNvbG9yLCAxKTsKLQkJCQkJKChGWF9MUEJZVEUpJm1fQ29sb3IpWzNdID0gbV9BbHBoYTsKLQkJCQkJbV9SZWQgPSAoKEZYX0xQQllURSkmbV9Db2xvcilbMl07Ci0JCQkJCW1fR3JlZW4gPSAoKEZYX0xQQllURSkmbV9Db2xvcilbMV07Ci0JCQkJCW1fQmx1ZSA9ICgoRlhfTFBCWVRFKSZtX0NvbG9yKVswXTsKLQkJCQkJLy8gTmVlZCBKb2huc29uIHRvIGltcHJvdmVtZW50IGl0LgotCQkJCQlpZiAobV9iUmdiQnl0ZU9yZGVyKSB7Ci0JCQkJCQkvLyBzd2FwCi0JCQkJCQltX1JlZCA9ICgoRlhfTFBCWVRFKSZtX0NvbG9yKVswXTsKLQkJCQkJCW1fQmx1ZSA9ICgoRlhfTFBCWVRFKSZtX0NvbG9yKVsyXTsKLQkJCQkJCW1fQ29sb3IgPSBGWEFSR0JfVE9ESUIobV9Db2xvcik7Ci0JCQkJCQltX0NvbG9yID0gRlhBUkdCX1RPQkdST1JERVJESUIobV9Db2xvcik7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoYk9iamVjdENNWUspIHsKLQkJCQkJCUZYX0JZVEUgciwgZywgYjsKLQkJCQkJCUFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUoY29sb3IpLCBGWFNZU19HZXRNVmFsdWUoY29sb3IpLCBGWFNZU19HZXRZVmFsdWUoY29sb3IpLCBGWFNZU19HZXRLVmFsdWUoY29sb3IpLCAKLQkJCQkJCQlyLCBnLCBiKTsKLQkJCQkJCW1fQ29sb3IgPSBGWEFSR0JfTUFLRShtX0FscGhhLCByLCBnLCBiKTsKLQkJCQkJCWlmIChtX2JSZ2JCeXRlT3JkZXIpewotCQkJCQkJCW1fQ29sb3IgPSBGWEFSR0JfVE9CR1JPUkRFUkRJQihtX0NvbG9yKTsKLQkJCQkJCQltX1JlZCA9IGI7IG1fR3JlZW4gPSBnOyBtX0JsdWUgPSByOy8vCi0JCQkJCQl9ZWxzZSB7Ci0JCQkJCQkJbV9Db2xvciA9IEZYQVJHQl9UT0RJQihtX0NvbG9yKTsKLQkJCQkJCQltX1JlZCA9IHI7IG1fR3JlZW4gPSBnOyBtX0JsdWUgPSBiOy8vCi0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAobV9iUmdiQnl0ZU9yZGVyKXsKLQkJCQkJCQltX0NvbG9yID0gRlhBUkdCX1RPQkdST1JERVJESUIoY29sb3IpOwotCQkJCQkJCUFyZ2JEZWNvZGUoY29sb3IsIG1fQWxwaGEsIG1fQmx1ZSwgbV9HcmVlbiwgbV9SZWQpOyAvLwotCQkJCQkJfWVsc2UgewotCQkJCQkJCW1fQ29sb3IgPSBGWEFSR0JfVE9ESUIoY29sb3IpOwotCQkJCQkJCUFyZ2JEZWNvZGUoY29sb3IsIG1fQWxwaGEsIG1fUmVkLCBtX0dyZWVuLCBtX0JsdWUpOyAKLQkJCQkJCX0JCQkJCQotCQkJCQl9Ci0JCQkJfQkKLQkJCX0KLQkJfQotCQkvLyBHZXQgcGFsZXR0ZSB0cmFuc3BhcmVuY3kgc2VsZWN0b3IKLQkJbV9Qcm9jZXNzRmlsdGVyID0gKG1fcE9yaURldmljZT8gMSA6IDApCS8qIGhhcyBPcmkgRGV2aWNlIGZsYWcgKi8KLQkJCQkJCSsgKG1fcERldmljZS0+R2V0QlBQKCkgPj0gOCA/IDIgOiAwKQkvKiBicHAgZmxhZyAqLwkJCQotCQkJCQkJKyAobV9wQ2xpcE1hc2s/IDQgOiAwKQkJCQkJLyogaGFzIGNsaXAgcmVnaW9uIGZsYWcgKi8KLQkJCQkJCSsgKG1fcERldmljZS0+bV9wQWxwaGFNYXNrPyA4IDogMCk7CQkvKiBoYXMgQWxwaGEgTWFzayBjaGFuZWwgZmxhZyAqLwotCQlzd2l0Y2gobV9Qcm9jZXNzRmlsdGVyKSB7Ci0JCQljYXNlIDA6Ci0JCQkJY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbjFicHBfMDsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCQl7Ci0JCQkJCWlmIChtX3BEZXZpY2UtPkdldEJQUCgpID09IDgpCi0JCQkJCQljb21wb3NpdGVfc3BhbiA9ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuR3JheV8yOwotCQkJCQllbHNlIGlmIChtX3BEZXZpY2UtPkdldEJQUCgpID09IDI0KQotCQkJCQkJY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjI0XzI7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvbXBvc2l0ZV9zcGFuID0gbV9wRGV2aWNlLT5IYXNBbHBoYSgpPyZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuQVJHQl8yIDogJkNGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5SR0IzMl8yOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgMzoKLQkJCQl7Ci0JCQkJCWlmIChtX3BEZXZpY2UtPkdldEJQUCgpID09IDgpCi0JCQkJCQljb21wb3NpdGVfc3BhbiA9ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuR3JheV8zOwotCQkJCQllbHNlIGlmIChtX3BEZXZpY2UtPkdldEJQUCgpID09IDI0KQotCQkJCQkJY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjI0XzM7Ci0JCQkJCWVsc2UgCi0JCQkJCQljb21wb3NpdGVfc3BhbiA9IG1fcERldmljZS0+SGFzQWxwaGEoKT8mQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkFSR0JfMyA6ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMzJfMzsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDQ6Ci0JCQkJY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbjFicHBfNDsKLQkJCQlicmVhazsKLQkJCWNhc2UgNjoKLQkJCQl7Ci0JCQkJCWlmIChtX3BEZXZpY2UtPkdldEJQUCgpID09IDgpCi0JCQkJCQljb21wb3NpdGVfc3BhbiA9ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuR3JheV82OwotCQkJCQllbHNlIGlmIChtX3BEZXZpY2UtPkdldEJQUCgpID09IDI0KQotCQkJCQkJY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjI0XzY7Ci0JCQkJCWVsc2UgCi0JCQkJCQljb21wb3NpdGVfc3BhbiA9IG1fcERldmljZS0+SGFzQWxwaGEoKT8mQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkFSR0JfNiA6ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMzJfNjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDc6Ci0JCQkJewotCQkJCQlpZiAobV9wRGV2aWNlLT5HZXRCUFAoKSA9PSA4KQotCQkJCQkJY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkdyYXlfNzsKLQkJCQkJZWxzZSBpZiAobV9wRGV2aWNlLT5HZXRCUFAoKSA9PSAyNCkKLQkJCQkJCWNvbXBvc2l0ZV9zcGFuID0gJkNGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5SR0IyNF83OwotCQkJCQllbHNlIAotCQkJCQkJY29tcG9zaXRlX3NwYW4gPSBtX3BEZXZpY2UtPkhhc0FscGhhKCk/JkNGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5BUkdCXzcgOiAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjMyXzc7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJY2FzZSA1OgotCQkJY2FzZSA4OgotCQkJY2FzZSA5OgotCQkJY2FzZSAxMToKLQkJCWNhc2UgMTI6Ci0JCQljYXNlIDEzOgotCQkJY2FzZSAxNToKLQkJCQkvL1RPRE8uLi4KLQkJCQlicmVhazsKLQkJCWNhc2UgMTA6Ci0JCQkJY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjI0XzEwOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxNDoKLQkJCQljb21wb3NpdGVfc3BhbiA9ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMjRfMTQ7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNvbXBvc2l0ZV9zcGFuID09IE5VTEwpCi0JCQlyZXR1cm4gRkFMU0U7Ci0JCXJldHVybiBUUlVFOwotCX0KKyAgICAgIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgICAqKEZYX0NNWUsqKWRlc3Rfc2NhbiA9IG1fQ29sb3I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gRGVzdCBmb3JtYXQ6IGNteWsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIHNyY19hbHBoYSk7CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIHNyY19hbHBoYSk7CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgc3JjX2FscGhhKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmF5LCBzcmNfYWxwaGEpOworICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICB9CisgIH0KK30KIAotCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0Jdm9pZCBDRlhfU2tpYUE4UmVuZGVyZXI6OmJsaXRBbnRpSChpbnQgeCwgaW50IHksIGNvbnN0IFNrQWxwaGEgYW50aWFsaWFzW10sIGNvbnN0IGludDE2X3QgcnVuc1tdKQotCXsKLQkJRlhTWVNfYXNzZXJ0KG1fcERldmljZSk7Ci0JCWludCBkc3RfeSA9IHkgLSBtX1RvcDsKLQkJaWYgKGRzdF95IDwgMCB8fCBkc3RfeSA+PSAgbV9wRGV2aWNlLT5HZXRIZWlnaHQoKSkKLQkJCXJldHVybjsKLQkJCi0JCUZYX0xQQllURSBkZXN0X3NjYW4gPSBtX3BEZXZpY2UtPkdldEJ1ZmZlcigpICsgbV9wRGV2aWNlLT5HZXRQaXRjaCgpICogZHN0X3k7Ci0JCUZYX0xQQllURSBkZXN0X3BvcyA9IGRlc3Rfc2NhbjsKLQkJd2hpbGUgKDEpCi0JCXsKLQkJCWlmICh4ID49IG1fZHN0V2lkdGgpIAotCQkJCXJldHVybjsKLQkJCWludCB3aWR0aCA9IHJ1bnNbMF07Ci0JCQlTa0FTU0VSVCh3aWR0aCA+PSAwKTsKLQkJCWlmICh3aWR0aCA8PSAwKSAKLQkJCQlyZXR1cm47Ci0JCQl1bnNpZ25lZCBhYSA9IGFudGlhbGlhc1swXTsKLQkJCWlmIChhYSkgewotCQkJCWludCBjb2xfc3RhcnQgPSB4IDwgbV9MZWZ0ID8gMCA6IHggLSBtX0xlZnQ7Ci0JCQkJaW50IGNvbF9lbmQgPSB4ICsgd2lkdGg7Ci0JCQkJY29sX2VuZCA9IGNvbF9lbmQgPCBtX2RzdFdpZHRoID8gY29sX2VuZCAtIG1fTGVmdDogbV9wRGV2aWNlLT5HZXRXaWR0aCgpOwotCQkJCWludCByZXN1bHQgPSBjb2xfZW5kIC0gY29sX3N0YXJ0OwotCQkJCWlmIChyZXN1bHQgPiAwKSB7Ci0JCQkJCWRlc3RfcG9zID0gZGVzdF9zY2FuICsgY29sX3N0YXJ0OwotCQkJCQlpZiAocmVzdWx0ID49IDQpCi0JCQkJCQlGWFNZU19tZW1zZXQzMihkZXN0X3BvcywgRlhBUkdCX01BS0UoYWEsIGFhLCBhYSwgYWEpLHJlc3VsdCk7Ci0JCQkJCWVsc2UKLQkJCQkJCUZYU1lTX21lbXNldChkZXN0X3BvcyxhYSxyZXN1bHQpOwotCQkJCX0JCQkJCi0JCQl9CQotCQkJcnVucyArPSB3aWR0aDsKLQkJCWFudGlhbGlhcyArPSB3aWR0aDsKLQkJCXggKz0gd2lkdGg7Ci0JCX0KLQl9Ci0Jdm9pZCBDRlhfU2tpYUE4UmVuZGVyZXI6OmJsaXRIKGludCB4LCBpbnQgeSwgaW50IHdpZHRoKQotCXsKLQkJRlhTWVNfYXNzZXJ0KG1fcERldmljZSk7Ci0JCWludCBkc3RfeSA9IHkgLSBtX1RvcDsKLQkJaWYgKGRzdF95IDwgMCB8fCBkc3RfeSA+PSAgbV9wRGV2aWNlLT5HZXRIZWlnaHQoKSkKLQkJCXJldHVybjsKLQkJaWYgKHggPj0gbV9kc3RXaWR0aCkgCi0JCQlyZXR1cm47Ci0JCUZYX0xQQllURSBkZXN0X3NjYW4gPSBtX3BEZXZpY2UtPkdldEJ1ZmZlcigpICsgbV9wRGV2aWNlLT5HZXRQaXRjaCgpICogZHN0X3k7Ci0JCWludCBjb2xfc3RhcnQgPSB4IDwgbV9MZWZ0ID8gMCA6IHggLSBtX0xlZnQ7Ci0JCWludCBjb2xfZW5kID0geCArIHdpZHRoOwotCQljb2xfZW5kID0gY29sX2VuZCA8IG1fZHN0V2lkdGggPyBjb2xfZW5kIC0gbV9MZWZ0OiBtX3BEZXZpY2UtPkdldFdpZHRoKCk7Ci0JCWludCByZXN1bHQgPSBjb2xfZW5kIC0gY29sX3N0YXJ0OwotCQlpZiAocmVzdWx0ID4gMCkgewotCQkJRlhfQllURSogZGVzdF9wb3MgPSBkZXN0X3NjYW4gKyBjb2xfc3RhcnQ7Ci0JCQlpZiAocmVzdWx0ID49IDQpCi0JCQkJRlhTWVNfbWVtc2V0MzIoZGVzdF9wb3MsIDB4ZmZmZmZmZmYscmVzdWx0KTsKLQkJCWVsc2UKLQkJCQlGWFNZU19tZW1zZXQoZGVzdF9wb3MsMjU1LHJlc3VsdCk7Ci0JCX0KLQl9Ci0Jdm9pZCBDRlhfU2tpYUE4UmVuZGVyZXI6OmJsaXRWKGludCB4LCBpbnQgeSwgaW50IGhlaWdodCwgU2tBbHBoYSBhbHBoYSkKLQl7Ci0JCUZYU1lTX2Fzc2VydChhbHBoYSk7Ci0JCWlmIChhbHBoYSA9PSAyNTUpIHsKLQkJCXRoaXMtPmJsaXRSZWN0KHgsIHksIDEsIGhlaWdodCk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQxNl90IHJ1bnNbMl07Ci0JCQlydW5zWzBdID0gMTsKLQkJCXJ1bnNbMV0gPSAwOwotCQkJd2hpbGUgKC0taGVpZ2h0ID49IDApIHsKLQkJCQlpZiAoeSA+PSBtX2RzdEhlaWdodCkKLQkJCQkJcmV0dXJuOwotCQkJCXRoaXMtPmJsaXRBbnRpSCh4LCB5ICsrLCAmYWxwaGEsIHJ1bnMpOwotCQkJfQotCQl9Ci0JfQotCXZvaWQgQ0ZYX1NraWFBOFJlbmRlcmVyOjpibGl0UmVjdChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkKLQl7Ci0JCUZYU1lTX2Fzc2VydChtX3BEZXZpY2UpOwotCQl3aGlsZSAoLS1oZWlnaHQgPj0gMCkgewotCQkJaWYgKHkgPj0gbV9kc3RIZWlnaHQpCi0JCQkJcmV0dXJuOwotCQkJYmxpdEgoeCAsIHkgKyssIHdpZHRoKTsKLQkJfQotCX0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZYX0JPT0wgQ0ZYX1NraWFSZW5kZXJlcjo6SW5pdCgKKyAgICBDRlhfRElCaXRtYXAqIHBEZXZpY2UsCisgICAgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLAorICAgIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwKKyAgICBGWF9EV09SRCBjb2xvciwKKyAgICBGWF9CT09MIGJGdWxsQ292ZXIsCisgICAgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLAorICAgIGludCBhbHBoYV9mbGFnLAorICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pICAvLyBUaGUgYWxwaGEgZmxhZyBtdXN0IGJlIGZpbGxfZmxhZyBpZiBleGlzdC4KK3sKKyAgbV9wRGV2aWNlID0gcERldmljZTsKKyAgbV9wQ2xpcFJnbiA9IHBDbGlwUmduOworICBtX2JSZ2JCeXRlT3JkZXIgPSBiUmdiQnl0ZU9yZGVyOworICBtX3BPcmlEZXZpY2UgPSBwT3JpRGV2aWNlOworICBtX3BEZXN0U2NhbiA9IE5VTEw7CisgIG1fcERlc3RFeHRyYUFscGhhU2NhbiA9IE5VTEw7CisgIG1fcE9yaVNjYW4gPSBOVUxMOworICBtX3BDbGlwU2NhbiA9IE5VTEw7CisgIGNvbXBvc2l0ZV9zcGFuID0gTlVMTDsKKyAgaWYgKG1fcENsaXBSZ24pCisgICAgbV9DbGlwQm94ID0gbV9wQ2xpcFJnbi0+R2V0Qm94KCk7CisgIGVsc2UgeworICAgIG1fQ2xpcEJveC5sZWZ0ID0gbV9DbGlwQm94LnRvcCA9IDA7CisgICAgbV9DbGlwQm94LnJpZ2h0ID0gbV9wRGV2aWNlLT5HZXRXaWR0aCgpOworICAgIG1fQ2xpcEJveC5ib3R0b20gPSBtX3BEZXZpY2UtPkdldEhlaWdodCgpOworICB9CisgIG1fcENsaXBNYXNrID0gTlVMTDsKKyAgaWYgKG1fcENsaXBSZ24gJiYgbV9wQ2xpcFJnbi0+R2V0VHlwZSgpID09IENGWF9DbGlwUmduOjpNYXNrRikgeworICAgIG1fcENsaXBNYXNrID0gbV9wQ2xpcFJnbi0+R2V0TWFzaygpOworICAgIG1fcENsaXBTY2FuID0gbV9wQ2xpcE1hc2stPkdldEJ1ZmZlcigpOworICB9CisgIGlmIChtX3BEZXZpY2UtPm1fcEFscGhhTWFzaykKKyAgICBtX3BEZXN0RXh0cmFBbHBoYVNjYW4gPSBtX3BEZXZpY2UtPm1fcEFscGhhTWFzay0+R2V0QnVmZmVyKCk7CisgIGlmIChtX3BPcmlEZXZpY2UpCisgICAgbV9wT3JpU2NhbiA9IG1fcE9yaURldmljZS0+R2V0QnVmZmVyKCk7CisgIG1fcERlc3RTY2FuID0gbV9wRGV2aWNlLT5HZXRCdWZmZXIoKTsKIAotCXZvaWQgQ0ZYX1NraWFBOFJlbmRlcmVyOjpibGl0QW50aVJlY3QoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrQWxwaGEgbGVmdEFscGhhLCBTa0FscGhhIHJpZ2h0QWxwaGEpIAotCXsKLQkJYmxpdFYoeCsrLCB5LCBoZWlnaHQsIGxlZnRBbHBoYSk7Ci0JCWlmICh3aWR0aCA+IDApIHsKLQkJCWJsaXRSZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQpOwotCQkJeCArPSB3aWR0aDsKLQkJfQotCQlibGl0Vih4LCB5LCBoZWlnaHQsIHJpZ2h0QWxwaGEpOwotCX0KKyAgbV9iRnVsbENvdmVyID0gYkZ1bGxDb3ZlcjsKIAotCUZYX0JPT0wgQ0ZYX1NraWFBOFJlbmRlcmVyOjpJbml0KENGWF9ESUJpdG1hcCogcERldmljZSwgaW50IExlZnQsIGludCBUb3ApCi0JewotCQltX3BEZXZpY2UgPSBwRGV2aWNlOwotCQltX0xlZnQgPSBMZWZ0OwotCQltX1RvcCA9IFRvcDsKLQkJaWYgKHBEZXZpY2UpewotCQkJbV9kc3RXaWR0aCA9IG1fTGVmdCArIHBEZXZpY2UtPkdldFdpZHRoKCk7Ci0JCQltX2RzdEhlaWdodCA9IG1fVG9wICsgcERldmljZS0+R2V0SGVpZ2h0KCk7Ci0JCX0KLQkJcmV0dXJuIFRSVUU7Ci0JfQorICBGWF9CT09MIGJPYmplY3RDTVlLID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKTsKKyAgRlhfQk9PTCBiRGV2aWNlQ01ZSyA9IHBEZXZpY2UtPklzQ215a0ltYWdlKCk7CisKKyAgbV9BbHBoYSA9IGJPYmplY3RDTVlLID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShjb2xvcik7CisKKyAgSUNvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IE5VTEw7CisgIC8vIE5vIGxjbXMgZW5naW5lLCB3ZSBza2lwIHRoZSB0cmFuc2Zvcm0KKyAgaWYgKCFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpIHx8CisgICAgICAhQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCkpCisgICAgcEljY1RyYW5zZm9ybSA9IE5VTEw7CisgIGVsc2UKKyAgICBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7CisKKyAgaWYgKG1fcERldmljZS0+R2V0QlBQKCkgPT0gOCkgeyAgLy8gR3JheShhKSBkZXZpY2UKKyAgICBBU1NFUlQoIW1fYlJnYkJ5dGVPcmRlcik7CisgICAgaWYgKG1fcERldmljZS0+SXNBbHBoYU1hc2soKSkgeworICAgICAgLy8gQWxwaGEgTWFzaworICAgICAgbV9HcmF5ID0gMjU1OworICAgIH0gZWxzZSB7CisgICAgICAvLyBHcmF5KGEpIGRldmljZQorICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKKyAgICAgICAgdWludDhfdCBncmF5OworICAgICAgICBjb2xvciA9IGJPYmplY3RDTVlLID8gRlhDTVlLX1RPRElCKGNvbG9yKSA6IEZYQVJHQl9UT0RJQihjb2xvcik7CisgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopJmNvbG9yLCAxKTsKKyAgICAgICAgbV9HcmF5ID0gZ3JheTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChiT2JqZWN0Q01ZSykgeworICAgICAgICAgIHVpbnQ4X3QgciwgZywgYjsKKyAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0TVZhbHVlKGNvbG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfR2V0WVZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0S1ZhbHVlKGNvbG9yKSwgciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZywgYik7CisgICAgICAgICAgbV9HcmF5ID0gRlhSR0IyR1JBWShyLCBnLCBiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtX0dyYXkgPQorICAgICAgICAgICAgICBGWFJHQjJHUkFZKEZYQVJHQl9SKGNvbG9yKSwgRlhBUkdCX0coY29sb3IpLCBGWEFSR0JfQihjb2xvcikpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChiRGV2aWNlQ01ZSykgeyAgLy8gQ215ayhhKSBEZXZpY2UKKyAgICAgIEFTU0VSVCghbV9iUmdiQnl0ZU9yZGVyKTsKKyAgICAgIC8vIFRPRE8uLi4gb3B0IGZvciBjbXlrCisgICAgICBjb21wb3NpdGVfc3BhbiA9ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuQ01ZSzsKKyAgICAgIGlmIChiT2JqZWN0Q01ZSykgeworICAgICAgICBtX0NvbG9yID0gRlhDTVlLX1RPRElCKGNvbG9yKTsKKyAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pCisgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKHVpbnQ4X3QqKSZtX0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KikmbV9Db2xvciwgMSk7CisgICAgICB9IGVsc2UgeyAgLy8gT2JqZWN0IFJHQgorICAgICAgICBpZiAoIXBJY2NUcmFuc2Zvcm0pCisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICBjb2xvciA9IEZYQVJHQl9UT0RJQihjb2xvcik7CisgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICh1aW50OF90KikmbV9Db2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKSZjb2xvciwgMSk7CisgICAgICB9CisgICAgICBtX1JlZCA9ICgodWludDhfdCopJm1fQ29sb3IpWzBdOworICAgICAgbV9HcmVlbiA9ICgodWludDhfdCopJm1fQ29sb3IpWzFdOworICAgICAgbV9CbHVlID0gKCh1aW50OF90KikmbV9Db2xvcilbMl07CisgICAgICBtX0dyYXkgPSAoKHVpbnQ4X3QqKSZtX0NvbG9yKVszXTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBpZiAocEljY1RyYW5zZm9ybSkgeworICAgICAgY29sb3IgPSBiT2JqZWN0Q01ZSyA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOworICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKHVpbnQ4X3QqKSZtX0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKSZjb2xvciwgMSk7CisgICAgICAoKHVpbnQ4X3QqKSZtX0NvbG9yKVszXSA9IG1fQWxwaGE7CisgICAgICBtX1JlZCA9ICgodWludDhfdCopJm1fQ29sb3IpWzJdOworICAgICAgbV9HcmVlbiA9ICgodWludDhfdCopJm1fQ29sb3IpWzFdOworICAgICAgbV9CbHVlID0gKCh1aW50OF90KikmbV9Db2xvcilbMF07CisgICAgICAvLyBOZWVkIEpvaG5zb24gdG8gaW1wcm92ZW1lbnQgaXQuCisgICAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7CisgICAgICAgIC8vIHN3YXAKKyAgICAgICAgbV9SZWQgPSAoKHVpbnQ4X3QqKSZtX0NvbG9yKVswXTsKKyAgICAgICAgbV9CbHVlID0gKCh1aW50OF90KikmbV9Db2xvcilbMl07CisgICAgICAgIG1fQ29sb3IgPSBGWEFSR0JfVE9ESUIobV9Db2xvcik7CisgICAgICAgIG1fQ29sb3IgPSBGWEFSR0JfVE9CR1JPUkRFUkRJQihtX0NvbG9yKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGJPYmplY3RDTVlLKSB7CisgICAgICAgIHVpbnQ4X3QgciwgZywgYjsKKyAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShjb2xvciksIEZYU1lTX0dldE1WYWx1ZShjb2xvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRZVmFsdWUoY29sb3IpLCBGWFNZU19HZXRLVmFsdWUoY29sb3IpLCByLCBnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYik7CisgICAgICAgIG1fQ29sb3IgPSBGWEFSR0JfTUFLRShtX0FscGhhLCByLCBnLCBiKTsKKyAgICAgICAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgeworICAgICAgICAgIG1fQ29sb3IgPSBGWEFSR0JfVE9CR1JPUkRFUkRJQihtX0NvbG9yKTsKKyAgICAgICAgICBtX1JlZCA9IGI7CisgICAgICAgICAgbV9HcmVlbiA9IGc7CisgICAgICAgICAgbV9CbHVlID0gcjsgIC8vCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbV9Db2xvciA9IEZYQVJHQl9UT0RJQihtX0NvbG9yKTsKKyAgICAgICAgICBtX1JlZCA9IHI7CisgICAgICAgICAgbV9HcmVlbiA9IGc7CisgICAgICAgICAgbV9CbHVlID0gYjsgIC8vCisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKKyAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPQkdST1JERVJESUIoY29sb3IpOworICAgICAgICAgIEFyZ2JEZWNvZGUoY29sb3IsIG1fQWxwaGEsIG1fQmx1ZSwgbV9HcmVlbiwgbV9SZWQpOyAgLy8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPRElCKGNvbG9yKTsKKyAgICAgICAgICBBcmdiRGVjb2RlKGNvbG9yLCBtX0FscGhhLCBtX1JlZCwgbV9HcmVlbiwgbV9CbHVlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAvLyBHZXQgcGFsZXR0ZSB0cmFuc3BhcmVuY3kgc2VsZWN0b3IKKyAgbV9Qcm9jZXNzRmlsdGVyID0KKyAgICAgIChtX3BPcmlEZXZpY2UgPyAxIDogMCkgICAgICAgICAgICAgICAvKiBoYXMgT3JpIERldmljZSBmbGFnICovCisgICAgICArIChtX3BEZXZpY2UtPkdldEJQUCgpID49IDggPyAyIDogMCkgLyogYnBwIGZsYWcgKi8KKyAgICAgICsgKG1fcENsaXBNYXNrID8gNCA6IDApICAgICAgICAgICAgICAvKiBoYXMgY2xpcCByZWdpb24gZmxhZyAqLworICAgICAgKyAobV9wRGV2aWNlLT5tX3BBbHBoYU1hc2sgPyA4IDogMCk7IC8qIGhhcyBBbHBoYSBNYXNrIGNoYW5lbCBmbGFnICovCisgIHN3aXRjaCAobV9Qcm9jZXNzRmlsdGVyKSB7CisgICAgY2FzZSAwOgorICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbjFicHBfMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjogeworICAgICAgaWYgKG1fcERldmljZS0+R2V0QlBQKCkgPT0gOCkKKyAgICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkdyYXlfMjsKKyAgICAgIGVsc2UgaWYgKG1fcERldmljZS0+R2V0QlBQKCkgPT0gMjQpCisgICAgICAgIGNvbXBvc2l0ZV9zcGFuID0gJkNGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5SR0IyNF8yOworICAgICAgZWxzZQorICAgICAgICBjb21wb3NpdGVfc3BhbiA9IG1fcERldmljZS0+SGFzQWxwaGEoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuQVJHQl8yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJkNGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5SR0IzMl8yOworICAgIH0gYnJlYWs7CisgICAgY2FzZSAzOiB7CisgICAgICBpZiAobV9wRGV2aWNlLT5HZXRCUFAoKSA9PSA4KQorICAgICAgICBjb21wb3NpdGVfc3BhbiA9ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuR3JheV8zOworICAgICAgZWxzZSBpZiAobV9wRGV2aWNlLT5HZXRCUFAoKSA9PSAyNCkKKyAgICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjI0XzM7CisgICAgICBlbHNlCisgICAgICAgIGNvbXBvc2l0ZV9zcGFuID0gbV9wRGV2aWNlLT5IYXNBbHBoYSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJkNGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5BUkdCXzMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjMyXzM7CisgICAgfSBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBjb21wb3NpdGVfc3BhbiA9ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuMWJwcF80OworICAgICAgYnJlYWs7CisgICAgY2FzZSA2OiB7CisgICAgICBpZiAobV9wRGV2aWNlLT5HZXRCUFAoKSA9PSA4KQorICAgICAgICBjb21wb3NpdGVfc3BhbiA9ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuR3JheV82OworICAgICAgZWxzZSBpZiAobV9wRGV2aWNlLT5HZXRCUFAoKSA9PSAyNCkKKyAgICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjI0XzY7CisgICAgICBlbHNlCisgICAgICAgIGNvbXBvc2l0ZV9zcGFuID0gbV9wRGV2aWNlLT5IYXNBbHBoYSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJkNGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5BUkdCXzYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhblJHQjMyXzY7CisgICAgfSBicmVhazsKKyAgICBjYXNlIDc6IHsKKyAgICAgIGlmIChtX3BEZXZpY2UtPkdldEJQUCgpID09IDgpCisgICAgICAgIGNvbXBvc2l0ZV9zcGFuID0gJkNGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5HcmF5Xzc7CisgICAgICBlbHNlIGlmIChtX3BEZXZpY2UtPkdldEJQUCgpID09IDI0KQorICAgICAgICBjb21wb3NpdGVfc3BhbiA9ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMjRfNzsKKyAgICAgIGVsc2UKKyAgICAgICAgY29tcG9zaXRlX3NwYW4gPSBtX3BEZXZpY2UtPkhhc0FscGhhKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAmQ0ZYX1NraWFSZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkFSR0JfNworICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMzJfNzsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgMToKKyAgICBjYXNlIDU6CisgICAgY2FzZSA4OgorICAgIGNhc2UgOToKKyAgICBjYXNlIDExOgorICAgIGNhc2UgMTI6CisgICAgY2FzZSAxMzoKKyAgICBjYXNlIDE1OgorICAgICAgLy8gVE9ETy4uLgorICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDoKKyAgICAgIGNvbXBvc2l0ZV9zcGFuID0gJkNGWF9Ta2lhUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5SR0IyNF8xMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTQ6CisgICAgICBjb21wb3NpdGVfc3BhbiA9ICZDRlhfU2tpYVJlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCMjRfMTQ7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gISFjb21wb3NpdGVfc3BhbjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgQ0ZYX1NraWFBOFJlbmRlcmVyOjpibGl0QW50aUgoaW50IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTa0FscGhhIGFudGlhbGlhc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IHJ1bnNbXSkgeworICBGWFNZU19hc3NlcnQobV9wRGV2aWNlKTsKKyAgaW50IGRzdF95ID0geSAtIG1fVG9wOworICBpZiAoZHN0X3kgPCAwIHx8IGRzdF95ID49IG1fcERldmljZS0+R2V0SGVpZ2h0KCkpCisgICAgcmV0dXJuOworCisgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IG1fcERldmljZS0+R2V0QnVmZmVyKCkgKyBtX3BEZXZpY2UtPkdldFBpdGNoKCkgKiBkc3RfeTsKKyAgdWludDhfdCogZGVzdF9wb3MgPSBkZXN0X3NjYW47CisgIHdoaWxlICgxKSB7CisgICAgaWYgKHggPj0gbV9kc3RXaWR0aCkKKyAgICAgIHJldHVybjsKKyAgICBpbnQgd2lkdGggPSBydW5zWzBdOworICAgIFNrQVNTRVJUKHdpZHRoID49IDApOworICAgIGlmICh3aWR0aCA8PSAwKQorICAgICAgcmV0dXJuOworICAgIHVuc2lnbmVkIGFhID0gYW50aWFsaWFzWzBdOworICAgIGlmIChhYSkgeworICAgICAgaW50IGNvbF9zdGFydCA9IHggPCBtX0xlZnQgPyAwIDogeCAtIG1fTGVmdDsKKyAgICAgIGludCBjb2xfZW5kID0geCArIHdpZHRoOworICAgICAgY29sX2VuZCA9IGNvbF9lbmQgPCBtX2RzdFdpZHRoID8gY29sX2VuZCAtIG1fTGVmdCA6IG1fcERldmljZS0+R2V0V2lkdGgoKTsKKyAgICAgIGludCByZXN1bHQgPSBjb2xfZW5kIC0gY29sX3N0YXJ0OworICAgICAgaWYgKHJlc3VsdCA+IDApIHsKKyAgICAgICAgZGVzdF9wb3MgPSBkZXN0X3NjYW4gKyBjb2xfc3RhcnQ7CisgICAgICAgIGlmIChyZXN1bHQgPj0gNCkKKyAgICAgICAgICBGWFNZU19tZW1zZXQoZGVzdF9wb3MsIEZYQVJHQl9NQUtFKGFhLCBhYSwgYWEsIGFhKSwgcmVzdWx0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIEZYU1lTX21lbXNldChkZXN0X3BvcywgYWEsIHJlc3VsdCk7CisgICAgICB9CisgICAgfQorICAgIHJ1bnMgKz0gd2lkdGg7CisgICAgYW50aWFsaWFzICs9IHdpZHRoOworICAgIHggKz0gd2lkdGg7CisgIH0KK30KK3ZvaWQgQ0ZYX1NraWFBOFJlbmRlcmVyOjpibGl0SChpbnQgeCwgaW50IHksIGludCB3aWR0aCkgeworICBGWFNZU19hc3NlcnQobV9wRGV2aWNlKTsKKyAgaW50IGRzdF95ID0geSAtIG1fVG9wOworICBpZiAoZHN0X3kgPCAwIHx8IGRzdF95ID49IG1fcERldmljZS0+R2V0SGVpZ2h0KCkpCisgICAgcmV0dXJuOworICBpZiAoeCA+PSBtX2RzdFdpZHRoKQorICAgIHJldHVybjsKKyAgdWludDhfdCogZGVzdF9zY2FuID0gbV9wRGV2aWNlLT5HZXRCdWZmZXIoKSArIG1fcERldmljZS0+R2V0UGl0Y2goKSAqIGRzdF95OworICBpbnQgY29sX3N0YXJ0ID0geCA8IG1fTGVmdCA/IDAgOiB4IC0gbV9MZWZ0OworICBpbnQgY29sX2VuZCA9IHggKyB3aWR0aDsKKyAgY29sX2VuZCA9IGNvbF9lbmQgPCBtX2RzdFdpZHRoID8gY29sX2VuZCAtIG1fTGVmdCA6IG1fcERldmljZS0+R2V0V2lkdGgoKTsKKyAgaW50IHJlc3VsdCA9IGNvbF9lbmQgLSBjb2xfc3RhcnQ7CisgIGlmIChyZXN1bHQgPiAwKSB7CisgICAgdWludDhfdCogZGVzdF9wb3MgPSBkZXN0X3NjYW4gKyBjb2xfc3RhcnQ7CisgICAgaWYgKHJlc3VsdCA+PSA0KQorICAgICAgRlhTWVNfbWVtc2V0KGRlc3RfcG9zLCAweGZmZmZmZmZmLCByZXN1bHQpOworICAgIGVsc2UKKyAgICAgIEZYU1lTX21lbXNldChkZXN0X3BvcywgMjU1LCByZXN1bHQpOworICB9Cit9Cit2b2lkIENGWF9Ta2lhQThSZW5kZXJlcjo6YmxpdFYoaW50IHgsIGludCB5LCBpbnQgaGVpZ2h0LCBTa0FscGhhIGFscGhhKSB7CisgIEZYU1lTX2Fzc2VydChhbHBoYSk7CisgIGlmIChhbHBoYSA9PSAyNTUpIHsKKyAgICBibGl0UmVjdCh4LCB5LCAxLCBoZWlnaHQpOworICB9IGVsc2UgeworICAgIGludDE2X3QgcnVuc1syXTsKKyAgICBydW5zWzBdID0gMTsKKyAgICBydW5zWzFdID0gMDsKKyAgICB3aGlsZSAoLS1oZWlnaHQgPj0gMCkgeworICAgICAgaWYgKHkgPj0gbV9kc3RIZWlnaHQpCisgICAgICAgIHJldHVybjsKKyAgICAgIGJsaXRBbnRpSCh4LCB5KyssICZhbHBoYSwgcnVucyk7CisgICAgfQorICB9Cit9Cit2b2lkIENGWF9Ta2lhQThSZW5kZXJlcjo6YmxpdFJlY3QoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgRlhTWVNfYXNzZXJ0KG1fcERldmljZSk7CisgIHdoaWxlICgtLWhlaWdodCA+PSAwKSB7CisgICAgaWYgKHkgPj0gbV9kc3RIZWlnaHQpCisgICAgICByZXR1cm47CisgICAgYmxpdEgoeCwgeSsrLCB3aWR0aCk7CisgIH0KK30KKwordm9pZCBDRlhfU2tpYUE4UmVuZGVyZXI6OmJsaXRBbnRpUmVjdChpbnQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tBbHBoYSBsZWZ0QWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrQWxwaGEgcmlnaHRBbHBoYSkgeworICBibGl0Vih4KyssIHksIGhlaWdodCwgbGVmdEFscGhhKTsKKyAgaWYgKHdpZHRoID4gMCkgeworICAgIGJsaXRSZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQpOworICAgIHggKz0gd2lkdGg7CisgIH0KKyAgYmxpdFYoeCwgeSwgaGVpZ2h0LCByaWdodEFscGhhKTsKK30KKworRlhfQk9PTCBDRlhfU2tpYUE4UmVuZGVyZXI6OkluaXQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBpbnQgTGVmdCwgaW50IFRvcCkgeworICBtX3BEZXZpY2UgPSBwRGV2aWNlOworICBtX0xlZnQgPSBMZWZ0OworICBtX1RvcCA9IFRvcDsKKyAgaWYgKHBEZXZpY2UpIHsKKyAgICBtX2RzdFdpZHRoID0gbV9MZWZ0ICsgcERldmljZS0+R2V0V2lkdGgoKTsKKyAgICBtX2RzdEhlaWdodCA9IG1fVG9wICsgcERldmljZS0+R2V0SGVpZ2h0KCk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2JsaXR0ZXJfbmV3LmggYi9jb3JlL3NyYy9meGdlL3NraWEvZnhfc2tpYV9ibGl0dGVyX25ldy5oCmluZGV4IDExOTNlNjQuLjM2YTZiNDMgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2JsaXR0ZXJfbmV3LmgKKysrIGIvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfYmxpdHRlcl9uZXcuaApAQCAtNiwyMjQgKzYsNTE2IEBACiAjZGVmaW5lIENPUkVfU1JDX0ZYR0VfU0tJQV9GWF9TS0lBX0JMSVRURVJfTkVXX0hfCiAKICNpZiBkZWZpbmVkKF9TS0lBX1NVUFBPUlRfKQotY2xhc3MgQ0ZYX1NraWFSZW5kZXJlciA6IHB1YmxpYyBTa0JsaXR0ZXIKLXsKLXByb3RlY3RlZDoKLQlpbnQJCQltX0FscGhhLCAKLQkJCQltX1JlZCwJCS8vIE9yIHRoZSBjb21wbGVtZW50YXJ5LWNvbG9yLCBDeWFuCi0JCQkJbV9HcmVlbiwJLy8gTWFnZW50YQotCQkJCW1fQmx1ZSwJCS8vIFllbGxvdwotCQkJCW1fR3JheTsJCS8vIEJsYWNrCi0JRlhfRFdPUkQJbV9Db2xvcjsJLy8gRlhfQVJHQiBvciBGWF9DTVlLCi0JRlhfQk9PTAkJbV9iRnVsbENvdmVyOwotCWludAkJCW1fUHJvY2Vzc0ZpbHRlcjsKLQlGWF9CT09MICAgICBtX2JSZ2JCeXRlT3JkZXI7Ci0JCi0JRlhfUkVDVAkJCQltX0NsaXBCb3g7Ci0JQ0ZYX0RJQml0bWFwKgkJbV9wRGV2aWNlOwotCUNGWF9ESUJpdG1hcCoJCW1fcE9yaURldmljZTsKLQljb25zdCBDRlhfQ2xpcFJnbioJbV9wQ2xpcFJnbjsKLQljb25zdCBDRlhfRElCaXRtYXAqCW1fcENsaXBNYXNrOworY2xhc3MgQ0ZYX1NraWFSZW5kZXJlciA6IHB1YmxpYyBTa0JsaXR0ZXIgeworIHByb3RlY3RlZDoKKyAgaW50IG1fQWxwaGEsCisgICAgICBtX1JlZCwgICAgICAgICAvLyBPciB0aGUgY29tcGxlbWVudGFyeS1jb2xvciwgQ3lhbgorICAgICAgbV9HcmVlbiwgICAgICAgLy8gTWFnZW50YQorICAgICAgbV9CbHVlLCAgICAgICAgLy8gWWVsbG93CisgICAgICBtX0dyYXk7ICAgICAgICAvLyBCbGFjaworICBGWF9EV09SRCBtX0NvbG9yOyAgLy8gRlhfQVJHQiBvciBGWF9DTVlLCisgIEZYX0JPT0wgbV9iRnVsbENvdmVyOworICBpbnQgbV9Qcm9jZXNzRmlsdGVyOworICBGWF9CT09MIG1fYlJnYkJ5dGVPcmRlcjsKIAotCUZYX0xQQllURSBtX3BEZXN0U2NhbjsKLQlGWF9MUEJZVEUgbV9wRGVzdEV4dHJhQWxwaGFTY2FuOwotCUZYX0xQQllURSBtX3BPcmlTY2FuOwotCUZYX0xQQllURSBtX3BDbGlwU2NhbjsKKyAgRlhfUkVDVCBtX0NsaXBCb3g7CisgIENGWF9ESUJpdG1hcCogbV9wRGV2aWNlOworICBDRlhfRElCaXRtYXAqIG1fcE9yaURldmljZTsKKyAgY29uc3QgQ0ZYX0NsaXBSZ24qIG1fcENsaXBSZ247CisgIGNvbnN0IENGWF9ESUJpdG1hcCogbV9wQ2xpcE1hc2s7CiAKLQl2b2lkIChDRlhfU2tpYVJlbmRlcmVyOjoqY29tcG9zaXRlX3NwYW4pKEZYX0xQQllURSxGWF9MUEJZVEUsaW50LGludCxpbnQsaW50LEZYX0JZVEUsaW50LGludCxpbnQsRlhfTFBCWVRFLEZYX0xQQllURSk7Ci1wdWJsaWM6Ci0gICAgCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHZpcnR1YWwgdm9pZCBibGl0QW50aUgoaW50IHgsIGludCB5LCBjb25zdCBTa0FscGhhIGFudGlhbGlhc1tdLCBjb25zdCBpbnQxNl90IHJ1bnNbXSk7Ci0JdmlydHVhbCB2b2lkIGJsaXRIKGludCB4LCBpbnQgeSwgaW50IHdpZHRoKTsgCi0JdmlydHVhbCB2b2lkIGJsaXRWKGludCB4LCBpbnQgeSwgaW50IGhlaWdodCwgU2tBbHBoYSBhbHBoYSk7Ci0JdmlydHVhbCB2b2lkIGJsaXRSZWN0KGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLQl2aXJ0dWFsCXZvaWQgYmxpdEFudGlSZWN0KGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBTa0FscGhhIGxlZnRBbHBoYSwgU2tBbHBoYSByaWdodEFscGhhKTsKLSAgICAJCi0JLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCS8vIEEgZ2VuZXJhbCBhbHBoYSBtZXJnZSBmdW5jdGlvbiAod2l0aCBjbGlwcGluZyBtYXNrKS4gR3JheSBkZXZpY2UuCi0Jdm9pZCBDb21wb3NpdGVTcGFuMWJwcF8wKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQllURSBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIEZYX0JZVEUgY292ZXJfc2NhbiwgCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCBGWF9MUEJZVEUgY2xpcF9zY2FuLCAKLQkJCUZYX0xQQllURSBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwotCXZvaWQgQ29tcG9zaXRlU3BhbjFicHBfMShGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUEJZVEUgb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCBGWF9CWVRFIGNvdmVyX3NjYW4sIAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgRlhfTFBCWVRFIGNsaXBfc2NhbiwgCi0JCQlGWF9MUEJZVEUgZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKLQl2b2lkIENvbXBvc2l0ZVNwYW4xYnBwXzQoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBCWVRFIG9yaV9zY2FuLGludCBCcHAsCi0JCQlpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgRlhfQllURSBjb3Zlcl9zY2FuLCAKLQkJCWludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIEZYX0xQQllURSBjbGlwX3NjYW4sIAotCQkJRlhfTFBCWVRFIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7Ci0Jdm9pZCBDb21wb3NpdGVTcGFuMWJwcF81KEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQllURSBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIEZYX0JZVEUgY292ZXJfc2NhbiwgCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCBGWF9MUEJZVEUgY2xpcF9zY2FuLCAKLQkJCUZYX0xQQllURSBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwotCXZvaWQgQ29tcG9zaXRlU3BhbjFicHBfOChGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUEJZVEUgb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCBGWF9CWVRFIGNvdmVyX3NjYW4sIAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgRlhfTFBCWVRFIGNsaXBfc2NhbiwgCi0JCQlGWF9MUEJZVEUgZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKLQl2b2lkIENvbXBvc2l0ZVNwYW4xYnBwXzkoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBCWVRFIG9yaV9zY2FuLGludCBCcHAsCi0JCQlpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgRlhfQllURSBjb3Zlcl9zY2FuLCAKLQkJCWludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIEZYX0xQQllURSBjbGlwX3NjYW4sIAotCQkJRlhfTFBCWVRFIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7Ci0Jdm9pZCBDb21wb3NpdGVTcGFuMWJwcF8xMihGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUEJZVEUgb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCBGWF9CWVRFIGNvdmVyX3NjYW4sIAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgRlhfTFBCWVRFIGNsaXBfc2NhbiwgCi0JCQlGWF9MUEJZVEUgZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKLQl2b2lkIENvbXBvc2l0ZVNwYW4xYnBwXzEzKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQllURSBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIEZYX0JZVEUgY292ZXJfc2NhbiwgCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCBGWF9MUEJZVEUgY2xpcF9zY2FuLCAKLQkJCUZYX0xQQllURSBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOworICB1aW50OF90KiBtX3BEZXN0U2NhbjsKKyAgdWludDhfdCogbV9wRGVzdEV4dHJhQWxwaGFTY2FuOworICB1aW50OF90KiBtX3BPcmlTY2FuOworICB1aW50OF90KiBtX3BDbGlwU2NhbjsKIAotCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCQotCS8vIEEgZ2VuZXJhbCBhbHBoYSBtZXJnZSBmdW5jdGlvbiAod2l0aCBjbGlwcGluZyBtYXNrKS4gR3JheSBkZXZpY2UuCi0Jdm9pZCBDb21wb3NpdGVTcGFuR3JheV8yKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQllURSBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIEZYX0JZVEUgY292ZXJfc2NhbiwgCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCBGWF9MUEJZVEUgY2xpcF9zY2FuLCAKLQkJCUZYX0xQQllURSBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOworICB2b2lkIChDRlhfU2tpYVJlbmRlcmVyOjoqY29tcG9zaXRlX3NwYW4pKHVpbnQ4X3QqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKTsKIAotCXZvaWQgQ29tcG9zaXRlU3BhbkdyYXlfMyhGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUEJZVEUgb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCBGWF9CWVRFIGNvdmVyX3NjYW4sIAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgRlhfTFBCWVRFIGNsaXBfc2NhbiwgCi0JCQlGWF9MUEJZVEUgZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKKyBwdWJsaWM6CisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdmlydHVhbCB2b2lkIGJsaXRBbnRpSChpbnQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTa0FscGhhIGFudGlhbGlhc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgcnVuc1tdKTsKKyAgdmlydHVhbCB2b2lkIGJsaXRIKGludCB4LCBpbnQgeSwgaW50IHdpZHRoKTsKKyAgdmlydHVhbCB2b2lkIGJsaXRWKGludCB4LCBpbnQgeSwgaW50IGhlaWdodCwgU2tBbHBoYSBhbHBoYSk7CisgIHZpcnR1YWwgdm9pZCBibGl0UmVjdChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisgIHZpcnR1YWwgdm9pZCBibGl0QW50aVJlY3QoaW50IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tBbHBoYSBsZWZ0QWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tBbHBoYSByaWdodEFscGhhKTsKIAotCXZvaWQgQ29tcG9zaXRlU3BhbkdyYXlfNihGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUEJZVEUgb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCBGWF9CWVRFIGNvdmVyX3NjYW4sIAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgRlhfTFBCWVRFIGNsaXBfc2NhbiwgCi0JCQlGWF9MUEJZVEUgZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAvLyBBIGdlbmVyYWwgYWxwaGEgbWVyZ2UgZnVuY3Rpb24gKHdpdGggY2xpcHBpbmcgbWFzaykuIEdyYXkgZGV2aWNlLgorICB2b2lkIENvbXBvc2l0ZVNwYW4xYnBwXzAodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CisgIHZvaWQgQ29tcG9zaXRlU3BhbjFicHBfMSh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKKyAgdm9pZCBDb21wb3NpdGVTcGFuMWJwcF80KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOworICB2b2lkIENvbXBvc2l0ZVNwYW4xYnBwXzUodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CisgIHZvaWQgQ29tcG9zaXRlU3BhbjFicHBfOCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKKyAgdm9pZCBDb21wb3NpdGVTcGFuMWJwcF85KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOworICB2b2lkIENvbXBvc2l0ZVNwYW4xYnBwXzEyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CisgIHZvaWQgQ29tcG9zaXRlU3BhbjFicHBfMTModWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKIAotCXZvaWQgQ29tcG9zaXRlU3BhbkdyYXlfNyhGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUEJZVEUgb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCBGWF9CWVRFIGNvdmVyX3NjYW4sIAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgRlhfTFBCWVRFIGNsaXBfc2NhbiwgCi0JCQlGWF9MUEJZVEUgZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLQl2b2lkIENvbXBvc2l0ZVNwYW5HcmF5XzEwKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQllURSBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIEZYX0JZVEUgY292ZXJfc2NhbiwgCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCBGWF9MUEJZVEUgY2xpcF9zY2FuLCAKLQkJCUZYX0xQQllURSBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOworICAvLyBBIGdlbmVyYWwgYWxwaGEgbWVyZ2UgZnVuY3Rpb24gKHdpdGggY2xpcHBpbmcgbWFzaykuIEdyYXkgZGV2aWNlLgorICB2b2lkIENvbXBvc2l0ZVNwYW5HcmF5XzIodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CiAKKyAgdm9pZCBDb21wb3NpdGVTcGFuR3JheV8zKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwogCi0Jdm9pZCBDb21wb3NpdGVTcGFuR3JheV8xMShGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUEJZVEUgb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCBGWF9CWVRFIGNvdmVyX3NjYW4sIAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgRlhfTFBCWVRFIGNsaXBfc2NhbiwgCi0JCQlGWF9MUEJZVEUgZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKKyAgdm9pZCBDb21wb3NpdGVTcGFuR3JheV82KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwogCi0Jdm9pZCBDb21wb3NpdGVTcGFuR3JheV8xNChGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUEJZVEUgb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCBGWF9CWVRFIGNvdmVyX3NjYW4sIAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgRlhfTFBCWVRFIGNsaXBfc2NhbiwgCi0JCQlGWF9MUEJZVEUgZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKKyAgdm9pZCBDb21wb3NpdGVTcGFuR3JheV83KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwogCi0Jdm9pZCBDb21wb3NpdGVTcGFuR3JheV8xNShGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUEJZVEUgb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCBGWF9CWVRFIGNvdmVyX3NjYW4sIAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgRlhfTFBCWVRFIGNsaXBfc2NhbiwgCi0JCQlGWF9MUEJZVEUgZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKKyAgdm9pZCBDb21wb3NpdGVTcGFuR3JheV8xMCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwogCi0JLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0Jdm9pZCBDb21wb3NpdGVTcGFuQVJHQl8yKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQllURSBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIEZYX0JZVEUgY292ZXJfc2NhbiwgCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCBGWF9MUEJZVEUgY2xpcF9zY2FuLCAKLQkJCUZYX0xQQllURSBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOworICB2b2lkIENvbXBvc2l0ZVNwYW5HcmF5XzExKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CiAKLQl2b2lkIENvbXBvc2l0ZVNwYW5BUkdCXzMoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBCWVRFIG9yaV9zY2FuLGludCBCcHAsCi0JCQlpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgRlhfQllURSBjb3Zlcl9zY2FuLCAKLQkJCWludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIEZYX0xQQllURSBjbGlwX3NjYW4sIAotCQkJRlhfTFBCWVRFIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CisgIHZvaWQgQ29tcG9zaXRlU3BhbkdyYXlfMTQodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKIAorICB2b2lkIENvbXBvc2l0ZVNwYW5HcmF5XzE1KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CiAKLQl2b2lkIENvbXBvc2l0ZVNwYW5BUkdCXzYoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBCWVRFIG9yaV9zY2FuLGludCBCcHAsCi0JCQlpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgRlhfQllURSBjb3Zlcl9zY2FuLCAKLQkJCWludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIEZYX0xQQllURSBjbGlwX3NjYW4sIAotCQkJRlhfTFBCWVRFIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CisgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB2b2lkIENvbXBvc2l0ZVNwYW5BUkdCXzIodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CiAKKyAgdm9pZCBDb21wb3NpdGVTcGFuQVJHQl8zKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwogCi0Jdm9pZCBDb21wb3NpdGVTcGFuQVJHQl83KEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQllURSBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIEZYX0JZVEUgY292ZXJfc2NhbiwgCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCBGWF9MUEJZVEUgY2xpcF9zY2FuLCAKLQkJCUZYX0xQQllURSBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwotCS8vIC4uLgotCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCXZvaWQgQ29tcG9zaXRlU3BhblJHQjMyXzIoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBCWVRFIG9yaV9zY2FuLGludCBCcHAsCi0JCQlpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgRlhfQllURSBjb3Zlcl9zY2FuLCAKLQkJCWludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIEZYX0xQQllURSBjbGlwX3NjYW4sIAotCQkJRlhfTFBCWVRFIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7Ci0Jdm9pZCBDb21wb3NpdGVTcGFuUkdCMzJfMyhGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUEJZVEUgb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCBGWF9CWVRFIGNvdmVyX3NjYW4sIAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgRlhfTFBCWVRFIGNsaXBfc2NhbiwgCi0JCQlGWF9MUEJZVEUgZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKLQl2b2lkIENvbXBvc2l0ZVNwYW5SR0IzMl82KEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQllURSBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIEZYX0JZVEUgY292ZXJfc2NhbiwgCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCBGWF9MUEJZVEUgY2xpcF9zY2FuLCAKLQkJCUZYX0xQQllURSBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwotCXZvaWQgQ29tcG9zaXRlU3BhblJHQjMyXzcoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBCWVRFIG9yaV9zY2FuLGludCBCcHAsCi0JCQlpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgRlhfQllURSBjb3Zlcl9zY2FuLCAKLQkJCWludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIEZYX0xQQllURSBjbGlwX3NjYW4sIAotCQkJRlhfTFBCWVRFIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7Ci0JCi0JLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICB2b2lkIENvbXBvc2l0ZVNwYW5BUkdCXzYodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CiAKLQl2b2lkIENvbXBvc2l0ZVNwYW5SR0IyNF8yKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQllURSBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIEZYX0JZVEUgY292ZXJfc2NhbiwgCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCBGWF9MUEJZVEUgY2xpcF9zY2FuLCAKLQkJCUZYX0xQQllURSBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwotCXZvaWQgQ29tcG9zaXRlU3BhblJHQjI0XzMoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBCWVRFIG9yaV9zY2FuLGludCBCcHAsCi0JCQlpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgRlhfQllURSBjb3Zlcl9zY2FuLCAKLQkJCWludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIEZYX0xQQllURSBjbGlwX3NjYW4sIAotCQkJRlhfTFBCWVRFIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7Ci0Jdm9pZCBDb21wb3NpdGVTcGFuUkdCMjRfNihGWF9MUEJZVEUgZGVzdF9zY2FuLCBGWF9MUEJZVEUgb3JpX3NjYW4saW50IEJwcCwKLQkJCWludCBzcGFuX2xlZnQsIGludCBzcGFuX2xlbiwgaW50IHNwYW5fdG9wLCBGWF9CWVRFIGNvdmVyX3NjYW4sIAotCQkJaW50IGNsaXBfdG9wLCBpbnQgY2xpcF9sZWZ0LCBpbnQgY2xpcF9yaWdodCwgRlhfTFBCWVRFIGNsaXBfc2NhbiwgCi0JCQlGWF9MUEJZVEUgZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKLQl2b2lkIENvbXBvc2l0ZVNwYW5SR0IyNF83KEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQllURSBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIEZYX0JZVEUgY292ZXJfc2NhbiwgCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCBGWF9MUEJZVEUgY2xpcF9zY2FuLCAKLQkJCUZYX0xQQllURSBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwotCXZvaWQgQ29tcG9zaXRlU3BhblJHQjI0XzEwKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQllURSBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIEZYX0JZVEUgY292ZXJfc2NhbiwgCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCBGWF9MUEJZVEUgY2xpcF9zY2FuLCAKLQkJCUZYX0xQQllURSBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwotCXZvaWQgQ29tcG9zaXRlU3BhblJHQjI0XzExKEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQllURSBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIEZYX0JZVEUgY292ZXJfc2NhbiwgCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCBGWF9MUEJZVEUgY2xpcF9zY2FuLCAKLQkJCUZYX0xQQllURSBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwotCXZvaWQgQ29tcG9zaXRlU3BhblJHQjI0XzE0KEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQllURSBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIEZYX0JZVEUgY292ZXJfc2NhbiwgCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCBGWF9MUEJZVEUgY2xpcF9zY2FuLCAKLQkJCUZYX0xQQllURSBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwotCXZvaWQgQ29tcG9zaXRlU3BhblJHQjI0XzE1KEZYX0xQQllURSBkZXN0X3NjYW4sIEZYX0xQQllURSBvcmlfc2NhbixpbnQgQnBwLAotCQkJaW50IHNwYW5fbGVmdCwgaW50IHNwYW5fbGVuLCBpbnQgc3Bhbl90b3AsIEZYX0JZVEUgY292ZXJfc2NhbiwgCi0JCQlpbnQgY2xpcF90b3AsIGludCBjbGlwX2xlZnQsIGludCBjbGlwX3JpZ2h0LCBGWF9MUEJZVEUgY2xpcF9zY2FuLCAKLQkJCUZYX0xQQllURSBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOworICB2b2lkIENvbXBvc2l0ZVNwYW5BUkdCXzcodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CisgIC8vIC4uLgorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgdm9pZCBDb21wb3NpdGVTcGFuUkdCMzJfMih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOworICB2b2lkIENvbXBvc2l0ZVNwYW5SR0IzMl8zKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CisgIHZvaWQgQ29tcG9zaXRlU3BhblJHQjMyXzYodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKKyAgdm9pZCBDb21wb3NpdGVTcGFuUkdCMzJfNyh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOwogCi0JLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQkKLQkvLyBBIGdlbmVyYWwgYWxwaGEgbWVyZ2UgZnVuY3Rpb24gKHdpdGggY2xpcHBpbmcgbWFzaykuIENteWthL0NteWsgZGV2aWNlLgotCXZvaWQgQ29tcG9zaXRlU3BhbkNNWUsoRlhfTFBCWVRFIGRlc3Rfc2NhbiwgRlhfTFBCWVRFIG9yaV9zY2FuLGludCBCcHAsCi0JCQlpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBzcGFuX3RvcCwgRlhfQllURSBjb3Zlcl9zY2FuLCAKLQkJCWludCBjbGlwX3RvcCwgaW50IGNsaXBfbGVmdCwgaW50IGNsaXBfcmlnaHQsIEZYX0xQQllURSBjbGlwX3NjYW4sIAotCQkJRlhfTFBCWVRFIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7Ci0gICAKLQkKLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JRlhfQk9PTCBJbml0KENGWF9ESUJpdG1hcCogcERldmljZSwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sIEZYX0RXT1JEIGNvbG9yLCBGWF9CT09MIGJGdWxsQ292ZXIsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwgCi0JCWludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOyAvL1RoZSBhbHBoYSBmbGFnIG11c3QgYmUgZmlsbF9mbGFnIGlmIGV4aXN0LgorICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgdm9pZCBDb21wb3NpdGVTcGFuUkdCMjRfMih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOworICB2b2lkIENvbXBvc2l0ZVNwYW5SR0IyNF8zKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CisgIHZvaWQgQ29tcG9zaXRlU3BhblJHQjI0XzYodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKKyAgdm9pZCBDb21wb3NpdGVTcGFuUkdCMjRfNyh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOworICB2b2lkIENvbXBvc2l0ZVNwYW5SR0IyNF8xMCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CisgIHZvaWQgQ29tcG9zaXRlU3BhblJHQjI0XzExKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKTsKKyAgdm9pZCBDb21wb3NpdGVTcGFuUkdCMjRfMTQodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOworICB2b2lkIENvbXBvc2l0ZVNwYW5SR0IyNF8xNSh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CisKKyAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAvLyBBIGdlbmVyYWwgYWxwaGEgbWVyZ2UgZnVuY3Rpb24gKHdpdGggY2xpcHBpbmcgbWFzaykuIENteWthL0NteWsgZGV2aWNlLgorICB2b2lkIENvbXBvc2l0ZVNwYW5DTVlLKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvcmlfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2Nhbik7CisKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBGWF9CT09MIEluaXQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLAorICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLAorICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICBGWF9CT09MIGJGdWxsQ292ZXIsCisgICAgICAgICAgICAgICBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsCisgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0KKyAgICAgICAgICAgICAgICAgICBOVUxMKTsgIC8vIFRoZSBhbHBoYSBmbGFnIG11c3QgYmUgZmlsbF9mbGFnIGlmIGV4aXN0LgogfTsKLWNsYXNzIENGWF9Ta2lhQThSZW5kZXJlciA6IHB1YmxpYyBTa0JsaXR0ZXIKLXsKLXB1YmxpYzoKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgdmlydHVhbCB2b2lkIGJsaXRBbnRpSChpbnQgeCwgaW50IHksIGNvbnN0IFNrQWxwaGEgYW50aWFsaWFzW10sIGNvbnN0IGludDE2X3QgcnVuc1tdKTsKLQl2aXJ0dWFsIHZvaWQgYmxpdEgoaW50IHgsIGludCB5LCBpbnQgd2lkdGgpOyAKLQl2aXJ0dWFsIHZvaWQgYmxpdFYoaW50IHgsIGludCB5LCBpbnQgaGVpZ2h0LCBTa0FscGhhIGFscGhhKTsKLQl2aXJ0dWFsIHZvaWQgYmxpdFJlY3QoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotCXZpcnR1YWwJdm9pZCBibGl0QW50aVJlY3QoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIFNrQWxwaGEgbGVmdEFscGhhLCBTa0FscGhhIHJpZ2h0QWxwaGEpOwotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlGWF9CT09MIEluaXQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlLCBpbnQgTGVmdCwgaW50IFRvcCk7Ci0JQ0ZYX0RJQml0bWFwKiBtX3BEZXZpY2U7Ci0JaW50IG1fTGVmdDsKLQlpbnQgbV9Ub3A7Ci0JaW50IG1fZHN0V2lkdGg7Ci0JaW50IG1fZHN0SGVpZ2h0OworY2xhc3MgQ0ZYX1NraWFBOFJlbmRlcmVyIDogcHVibGljIFNrQmxpdHRlciB7CisgcHVibGljOgorICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZpcnR1YWwgdm9pZCBibGl0QW50aUgoaW50IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tBbHBoYSBhbnRpYWxpYXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IHJ1bnNbXSk7CisgIHZpcnR1YWwgdm9pZCBibGl0SChpbnQgeCwgaW50IHksIGludCB3aWR0aCk7CisgIHZpcnR1YWwgdm9pZCBibGl0VihpbnQgeCwgaW50IHksIGludCBoZWlnaHQsIFNrQWxwaGEgYWxwaGEpOworICB2aXJ0dWFsIHZvaWQgYmxpdFJlY3QoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICB2aXJ0dWFsIHZvaWQgYmxpdEFudGlSZWN0KGludCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrQWxwaGEgbGVmdEFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrQWxwaGEgcmlnaHRBbHBoYSk7CisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgRlhfQk9PTCBJbml0KENGWF9ESUJpdG1hcCogcERldmljZSwgaW50IExlZnQsIGludCBUb3ApOworICBDRlhfRElCaXRtYXAqIG1fcERldmljZTsKKyAgaW50IG1fTGVmdDsKKyAgaW50IG1fVG9wOworICBpbnQgbV9kc3RXaWR0aDsKKyAgaW50IG1fZHN0SGVpZ2h0OwogfTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL3NraWEvZnhfc2tpYV9kZXZpY2UuY3BwIGIvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfZGV2aWNlLmNwcAppbmRleCBhNDgzZWNhLi4yZTAzNzFmIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL3NraWEvZnhfc2tpYV9kZXZpY2UuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2RldmljZS5jcHAKQEAgLTIsMzMgKzIsMTAgQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKLS8vI2RlZmluZSBfU0tJQV9TVVBQT1JUXworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2dlLmgiCisKICNpZiBkZWZpbmVkKF9TS0lBX1NVUFBPUlRfKQotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIgotCi0KLS8vI2RlZmluZSBfRk9YSVRfREVCVUdfCi0vLyNkZWZpbmUgX0ZPWElUX0JFTkNITUFSS18KLQotZXh0ZXJuICJDIiB7Ci0JZXh0ZXJuIHZvaWQgRlhfT1VUUFVUX0xPR19GVU5DKGNvbnN0IGNoYXIqLCAuLi4pOwotCWV4dGVybiBpbnQgRlhfR0VUX1RJQ0tfRlVOQygpOwotfTsKLQotI2lmZGVmIF9GT1hJVF9ERUJVR18KLSNkZWZpbmUgRk9YSVRfREVCVUcxKG1zZykgRlhfT1VUUFVUX0xPR19GVU5DKG1zZykKLSNkZWZpbmUgRk9YSVRfREVCVUcyKG1zZyxwYXJhKSBGWF9PVVRQVVRfTE9HX0ZVTkMobXNnLHBhcmEpCi0jZGVmaW5lIEZPWElUX0RFQlVHMyhtc2cscGFyYTEscGFyYTIpIEZYX09VVFBVVF9MT0dfRlVOQyhtc2cscGFyYTEscGFyYTIpCi0jZGVmaW5lIEZPWElUX0RFQlVHNChtc2cscGFyYTEscGFyYTIscGFyYTMpIEZYX09VVFBVVF9MT0dfRlVOQyhtc2cscGFyYTEscGFyYTIscGFyYTMpCi0jZGVmaW5lIEZPWElUX0RFQlVHNShtc2cscGFyYTEscGFyYTIscGFyYTMscGFyYW00KSBGWF9PVVRQVVRfTE9HX0ZVTkMobXNnLHBhcmExLHBhcmEyLHBhcmEzLHBhcmFtNCkKLSNlbHNlCi0jZGVmaW5lIEZPWElUX0RFQlVHMShtc2cpCi0jZGVmaW5lIEZPWElUX0RFQlVHMihtc2cscGFyYSkKLSNkZWZpbmUgRk9YSVRfREVCVUczKG1zZyxwYXJhMSxwYXJhMikKLSNkZWZpbmUgRk9YSVRfREVCVUc0KG1zZyxwYXJhMSxwYXJhMixwYXJhMykKLSNkZWZpbmUgRk9YSVRfREVCVUc1KG1zZyxwYXJhMSxwYXJhMixwYXJhMyxwYXJhbTQpCi0jZW5kaWYKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIgogCiAjaW5jbHVkZSAiU2tEYXNoUGF0aEVmZmVjdC5oIgogI2luY2x1ZGUgIlNrVExhenkuaCIKQEAgLTM2LDQ5NiArMTMsNjE2IEBACiAjaW5jbHVkZSAiU2tSYXN0ZXJDbGlwLmgiCiAjaW5jbHVkZSAiU2tTdHJva2UuaCIKIAotCisjaW5jbHVkZSAiY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meF9hZ2dfZHJpdmVyLmgiCiAjaW5jbHVkZSAiZnhfc2tpYV9ibGl0dGVyX25ldy5oIgotI2luY2x1ZGUgIi4uL2FnZy9meF9hZ2dfZHJpdmVyLmgiCiAjaW5jbHVkZSAiZnhfc2tpYV9kZXZpY2UuaCIKKworZXh0ZXJuICJDIiB7CitleHRlcm4gdm9pZCBGWF9PVVRQVVRfTE9HX0ZVTkMoY29uc3QgY2hhciosIC4uLik7CitleHRlcm4gaW50IEZYX0dFVF9USUNLX0ZVTkMoKTsKK307CisKKyNpZmRlZiBfRk9YSVRfREVCVUdfCisjZGVmaW5lIEZPWElUX0RFQlVHMShtc2cpIEZYX09VVFBVVF9MT0dfRlVOQyhtc2cpCisjZGVmaW5lIEZPWElUX0RFQlVHMihtc2csIHBhcmEpIEZYX09VVFBVVF9MT0dfRlVOQyhtc2csIHBhcmEpCisjZGVmaW5lIEZPWElUX0RFQlVHMyhtc2csIHBhcmExLCBwYXJhMikgRlhfT1VUUFVUX0xPR19GVU5DKG1zZywgcGFyYTEsIHBhcmEyKQorI2RlZmluZSBGT1hJVF9ERUJVRzQobXNnLCBwYXJhMSwgcGFyYTIsIHBhcmEzKSBcCisgIEZYX09VVFBVVF9MT0dfRlVOQyhtc2csIHBhcmExLCBwYXJhMiwgcGFyYTMpCisjZGVmaW5lIEZPWElUX0RFQlVHNShtc2csIHBhcmExLCBwYXJhMiwgcGFyYTMsIHBhcmFtNCkgXAorICBGWF9PVVRQVVRfTE9HX0ZVTkMobXNnLCBwYXJhMSwgcGFyYTIsIHBhcmEzLCBwYXJhbTQpCisjZWxzZQorI2RlZmluZSBGT1hJVF9ERUJVRzEobXNnKQorI2RlZmluZSBGT1hJVF9ERUJVRzIobXNnLCBwYXJhKQorI2RlZmluZSBGT1hJVF9ERUJVRzMobXNnLCBwYXJhMSwgcGFyYTIpCisjZGVmaW5lIEZPWElUX0RFQlVHNChtc2csIHBhcmExLCBwYXJhMiwgcGFyYTMpCisjZGVmaW5lIEZPWElUX0RFQlVHNShtc2csIHBhcmExLCBwYXJhMiwgcGFyYTMsIHBhcmFtNCkKKyNlbmRpZgorCiAvLy8gUnVuLWxlbmd0aC1lbmNvZGVkIHN1cGVyc2FtcGxpbmcgYW50aWFsaWFzZWQgYmxpdHRlci4KLWNsYXNzIFN1cGVyQmxpdHRlcl9za2lhCi17Ci1wdWJsaWM6Ci0Jc3RhdGljIHZvaWQgRHJhd1BhdGgoY29uc3QgU2tQYXRoJiBzcmNQYXRoLCBTa0JsaXR0ZXIqIGJsaXR0ZXIsICBjb25zdCBTa1Jhc3RlckNsaXAmIHJlY3QsIGNvbnN0IFNrUGFpbnQmIG9yaWdQYWludCk7CitjbGFzcyBTdXBlckJsaXR0ZXJfc2tpYSB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBEcmF3UGF0aChjb25zdCBTa1BhdGgmIHNyY1BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgIFNrQmxpdHRlciogYmxpdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tSYXN0ZXJDbGlwJiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTa1BhaW50JiBvcmlnUGFpbnQpOwogfTsKIEZYX0JPT0wgRnhTa0RyYXdUcmVhdEFzSGFpcmxpbmUoY29uc3QgU2tQYWludCYgcGFpbnQsIFNrU2NhbGFyKiBjb3ZlcmFnZSkgewotCWlmIChTa1BhaW50OjprU3Ryb2tlX1N0eWxlICE9IHBhaW50LmdldFN0eWxlKCkpCi0JCXJldHVybiBGQUxTRTsKLQlGWFNZU19hc3NlcnQoY292ZXJhZ2UpOwotCVNrU2NhbGFyIHN0cm9rZVdpZHRoID0gcGFpbnQuZ2V0U3Ryb2tlV2lkdGgoKTsKLQlpZiAoMCA9PSBzdHJva2VXaWR0aCkgewotCQkqY292ZXJhZ2UgPSBTS19TY2FsYXIxOwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JLy8gaWYgd2UgZ2V0IGhlcmUsIHdlIG5lZWQgdG8gdHJ5IHRvIGZha2UgYSB0aGljay1zdHJva2Ugd2l0aCBhIG1vZHVsYXRlZAotCS8vIGhhaXJsaW5lCi0JaWYgKCFwYWludC5pc0FudGlBbGlhcygpKQotCQlyZXR1cm4gRkFMU0U7Ci0JaWYgKHN0cm9rZVdpZHRoIDw9IFNLX1NjYWxhcjEpIHsKLQkJKmNvdmVyYWdlID0gc3Ryb2tlV2lkdGg7Ci0JCXJldHVybiBUUlVFOwotCX0KLQlyZXR1cm4gRkFMU0U7CisgIGlmIChTa1BhaW50OjprU3Ryb2tlX1N0eWxlICE9IHBhaW50LmdldFN0eWxlKCkpCisgICAgcmV0dXJuIEZBTFNFOworICBGWFNZU19hc3NlcnQoY292ZXJhZ2UpOworICBTa1NjYWxhciBzdHJva2VXaWR0aCA9IHBhaW50LmdldFN0cm9rZVdpZHRoKCk7CisgIGlmICgwID09IHN0cm9rZVdpZHRoKSB7CisgICAgKmNvdmVyYWdlID0gU0tfU2NhbGFyMTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICAvLyBpZiB3ZSBnZXQgaGVyZSwgd2UgbmVlZCB0byB0cnkgdG8gZmFrZSBhIHRoaWNrLXN0cm9rZSB3aXRoIGEgbW9kdWxhdGVkCisgIC8vIGhhaXJsaW5lCisgIGlmICghcGFpbnQuaXNBbnRpQWxpYXMoKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChzdHJva2VXaWR0aCA8PSBTS19TY2FsYXIxKSB7CisgICAgKmNvdmVyYWdlID0gc3Ryb2tlV2lkdGg7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQogCi12b2lkIFN1cGVyQmxpdHRlcl9za2lhOjpEcmF3UGF0aChjb25zdCBTa1BhdGgmIHNyY1BhdGgsIFNrQmxpdHRlciogYmxpdHRlciwgY29uc3QgU2tSYXN0ZXJDbGlwJiByZWN0LCBjb25zdCBTa1BhaW50JiBvcmlnUGFpbnQpIAotewotCVNrUGF0aCoJCXBhdGhQdHIgPSAoU2tQYXRoKikmc3JjUGF0aDsKLQlib29sCQlkb0ZpbGwgPSB0cnVlOwotCVNrUGF0aAkJdG1wUGF0aDsKLQlTa1RDb3B5T25GaXJzdFdyaXRlPFNrUGFpbnQ+IHBhaW50KG9yaWdQYWludCk7Ci0JewotCQlTa1NjYWxhciBjb3ZlcmFnZTsKLQkJaWYgKEZ4U2tEcmF3VHJlYXRBc0hhaXJsaW5lKG9yaWdQYWludCwgJmNvdmVyYWdlKSkgewotCQkJaWYgKFNLX1NjYWxhcjEgPT0gY292ZXJhZ2UpIHsKLQkJCQlwYWludC53cml0YWJsZSgpLT5zZXRTdHJva2VXaWR0aCgwKTsKLQkJCX0gZWxzZSBpZiAoMSkgey8veGZlcm1vZGVTdXBwb3J0c0NvdmVyYWdlQXNBbHBoYSh4ZmVyKSwgd2Ugbm90IHVzZSBibGVuZCBtb2RlIGhlcmUsIHhmZXIgYXdheXMgTlVMTC4KLQkJCQlVOENQVSBuZXdBbHBoYTsKLQkJCQkvLyB0aGlzIGlzIHRoZSBvbGQgdGVjaG5pcXVlLCB3aGljaCB3ZSBwcmVzZXJ2ZSBmb3Igbm93IHNvCi0JCQkJLy8gd2UgZG9uJ3QgY2hhbmdlIHByZXZpb3VzIHJlc3VsdHMgKHRlc3RpbmcpCi0JCQkJLy8gdGhlIG5ldyB3YXkgc2VlbXMgZmluZSwgaXRzIGp1c3QgKGEgdGlueSBiaXQpIGRpZmZlcmVudAotCQkJCWludCBzY2FsZSA9IChpbnQpU2tTY2FsYXJNdWwoY292ZXJhZ2UsIDI1Nik7Ci0JCQkJbmV3QWxwaGEgPSBvcmlnUGFpbnQuZ2V0QWxwaGEoKSAqIHNjYWxlID4+IDg7Ci0JCQkJU2tQYWludCogd3JpdGFibGVQYWludCA9IHBhaW50LndyaXRhYmxlKCk7Ci0JCQkJd3JpdGFibGVQYWludC0+c2V0U3Ryb2tlV2lkdGgoMCk7Ci0JCQkJd3JpdGFibGVQYWludC0+c2V0QWxwaGEobmV3QWxwaGEpOwotCQkJfQotCQl9Ci0JfQotCWlmIChwYWludC0+Z2V0UGF0aEVmZmVjdCgpIHx8IHBhaW50LT5nZXRTdHlsZSgpICE9IFNrUGFpbnQ6OmtGaWxsX1N0eWxlKSB7Ci0JCVNrSVJlY3QgZGV2Qm91bmRzID0gcmVjdC5nZXRCb3VuZHMoKTsKLQkJLy8gb3V0c2V0IHRvIGhhdmUgc2xvcCBmb3IgYW50aWFsYXNpbmcgYW5kIGhhaXJsaW5lcwotCQlkZXZCb3VuZHMub3V0c2V0KDEsIDEpOwotCQlTa1JlY3QgY3VsbFJlY3QgPSBTa1JlY3Q6Ok1ha2UoZGV2Qm91bmRzKTsKLQkJZG9GaWxsID0gcGFpbnQtPmdldEZpbGxQYXRoKCpwYXRoUHRyLCAmdG1wUGF0aCwgJmN1bGxSZWN0KTsKLQkJcGF0aFB0ciA9ICZ0bXBQYXRoOwotCX0KLQkvLyBhdm9pZCBwb3NzaWJseSBhbGxvY2F0aW5nIGEgbmV3IHBhdGggaW4gdHJhbnNmb3JtIGlmIHdlIGNhbgotCVNrUGF0aCogZGV2UGF0aFB0ciA9IHBhdGhQdHI7Ci0Jdm9pZCAoKnByb2MpKGNvbnN0IFNrUGF0aCYsIGNvbnN0IFNrUmFzdGVyQ2xpcCYsIFNrQmxpdHRlciopOwotCWlmIChkb0ZpbGwpIHsKLQkJaWYgKHBhaW50LT5pc0FudGlBbGlhcygpKSB7Ci0JCQlwcm9jID0gU2tTY2FuOjpBbnRpRmlsbFBhdGg7Ci0JCX0gZWxzZSB7Ci0JCQlwcm9jID0gU2tTY2FuOjpGaWxsUGF0aDsKLQkJfQotCX0gZWxzZSB7CS8vIGhhaXJsaW5lCi0JCWlmIChwYWludC0+aXNBbnRpQWxpYXMoKSkgewotCQkJcHJvYyA9IFNrU2Nhbjo6QW50aUhhaXJQYXRoOwotCQl9IGVsc2UgewotCQkJcHJvYyA9IFNrU2Nhbjo6SGFpclBhdGg7Ci0JCX0KLQl9Ci0JcHJvYygqZGV2UGF0aFB0ciwgcmVjdCwgYmxpdHRlcik7Cit2b2lkIFN1cGVyQmxpdHRlcl9za2lhOjpEcmF3UGF0aChjb25zdCBTa1BhdGgmIHNyY1BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa0JsaXR0ZXIqIGJsaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTa1Jhc3RlckNsaXAmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTa1BhaW50JiBvcmlnUGFpbnQpIHsKKyAgU2tQYXRoKiBwYXRoUHRyID0gKFNrUGF0aCopJnNyY1BhdGg7CisgIGJvb2wgZG9GaWxsID0gdHJ1ZTsKKyAgU2tQYXRoIHRtcFBhdGg7CisgIFNrVENvcHlPbkZpcnN0V3JpdGU8U2tQYWludD4gcGFpbnQob3JpZ1BhaW50KTsKKyAgeworICAgIFNrU2NhbGFyIGNvdmVyYWdlOworICAgIGlmIChGeFNrRHJhd1RyZWF0QXNIYWlybGluZShvcmlnUGFpbnQsICZjb3ZlcmFnZSkpIHsKKyAgICAgIGlmIChTS19TY2FsYXIxID09IGNvdmVyYWdlKSB7CisgICAgICAgIHBhaW50LndyaXRhYmxlKCktPnNldFN0cm9rZVdpZHRoKDApOworICAgICAgfSBlbHNlIGlmICgxKSB7ICAvLyB4ZmVybW9kZVN1cHBvcnRzQ292ZXJhZ2VBc0FscGhhKHhmZXIpLCB3ZSBub3QgdXNlCisgICAgICAgICAgICAgICAgICAgICAgIC8vIGJsZW5kIG1vZGUgaGVyZSwgeGZlciBhd2F5cyBOVUxMLgorICAgICAgICBVOENQVSBuZXdBbHBoYTsKKyAgICAgICAgLy8gdGhpcyBpcyB0aGUgb2xkIHRlY2huaXF1ZSwgd2hpY2ggd2UgcHJlc2VydmUgZm9yIG5vdyBzbworICAgICAgICAvLyB3ZSBkb24ndCBjaGFuZ2UgcHJldmlvdXMgcmVzdWx0cyAodGVzdGluZykKKyAgICAgICAgLy8gdGhlIG5ldyB3YXkgc2VlbXMgZmluZSwgaXRzIGp1c3QgKGEgdGlueSBiaXQpIGRpZmZlcmVudAorICAgICAgICBpbnQgc2NhbGUgPSAoaW50KVNrU2NhbGFyTXVsKGNvdmVyYWdlLCAyNTYpOworICAgICAgICBuZXdBbHBoYSA9IG9yaWdQYWludC5nZXRBbHBoYSgpICogc2NhbGUgPj4gODsKKyAgICAgICAgU2tQYWludCogd3JpdGFibGVQYWludCA9IHBhaW50LndyaXRhYmxlKCk7CisgICAgICAgIHdyaXRhYmxlUGFpbnQtPnNldFN0cm9rZVdpZHRoKDApOworICAgICAgICB3cml0YWJsZVBhaW50LT5zZXRBbHBoYShuZXdBbHBoYSk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChwYWludC0+Z2V0UGF0aEVmZmVjdCgpIHx8IHBhaW50LT5nZXRTdHlsZSgpICE9IFNrUGFpbnQ6OmtGaWxsX1N0eWxlKSB7CisgICAgU2tJUmVjdCBkZXZCb3VuZHMgPSByZWN0LmdldEJvdW5kcygpOworICAgIC8vIG91dHNldCB0byBoYXZlIHNsb3AgZm9yIGFudGlhbGFzaW5nIGFuZCBoYWlybGluZXMKKyAgICBkZXZCb3VuZHMub3V0c2V0KDEsIDEpOworICAgIFNrUmVjdCBjdWxsUmVjdCA9IFNrUmVjdDo6TWFrZShkZXZCb3VuZHMpOworICAgIGRvRmlsbCA9IHBhaW50LT5nZXRGaWxsUGF0aCgqcGF0aFB0ciwgJnRtcFBhdGgsICZjdWxsUmVjdCk7CisgICAgcGF0aFB0ciA9ICZ0bXBQYXRoOworICB9CisgIC8vIGF2b2lkIHBvc3NpYmx5IGFsbG9jYXRpbmcgYSBuZXcgcGF0aCBpbiB0cmFuc2Zvcm0gaWYgd2UgY2FuCisgIFNrUGF0aCogZGV2UGF0aFB0ciA9IHBhdGhQdHI7CisgIHZvaWQgKCpwcm9jKShjb25zdCBTa1BhdGgmLCBjb25zdCBTa1Jhc3RlckNsaXAmLCBTa0JsaXR0ZXIqKTsKKyAgaWYgKGRvRmlsbCkgeworICAgIGlmIChwYWludC0+aXNBbnRpQWxpYXMoKSkgeworICAgICAgcHJvYyA9IFNrU2Nhbjo6QW50aUZpbGxQYXRoOworICAgIH0gZWxzZSB7CisgICAgICBwcm9jID0gU2tTY2FuOjpGaWxsUGF0aDsKKyAgICB9CisgIH0gZWxzZSB7ICAvLyBoYWlybGluZQorICAgIGlmIChwYWludC0+aXNBbnRpQWxpYXMoKSkgeworICAgICAgcHJvYyA9IFNrU2Nhbjo6QW50aUhhaXJQYXRoOworICAgIH0gZWxzZSB7CisgICAgICBwcm9jID0gU2tTY2FuOjpIYWlyUGF0aDsKKyAgICB9CisgIH0KKyAgcHJvYygqZGV2UGF0aFB0ciwgcmVjdCwgYmxpdHRlcik7CiB9CiAKLWNsYXNzIENTa2lhX1BhdGhEYXRhIAotewotcHVibGljOgotCUNTa2lhX1BhdGhEYXRhKCkge30KLQl+Q1NraWFfUGF0aERhdGEoKSB7fQotCVNrUGF0aAkJCW1fUGF0aERhdGE7CitjbGFzcyBDU2tpYV9QYXRoRGF0YSB7CisgcHVibGljOgorICBDU2tpYV9QYXRoRGF0YSgpIHt9CisgIH5DU2tpYV9QYXRoRGF0YSgpIHt9CisgIFNrUGF0aCBtX1BhdGhEYXRhOwogCi0Jdm9pZAkJCUJ1aWxkUGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UpOworICB2b2lkIEJ1aWxkUGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UpOwogfTsKIAotdm9pZCBDU2tpYV9QYXRoRGF0YTo6QnVpbGRQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSkKLXsKLQljb25zdCBDRlhfUGF0aERhdGEqIHBGUGF0aCA9IHBQYXRoRGF0YTsKLQlpbnQgblBvaW50cyA9IHBGUGF0aC0+R2V0UG9pbnRDb3VudCgpOwotCUZYX1BBVEhQT0lOVCogcFBvaW50cyA9IHBGUGF0aC0+R2V0UG9pbnRzKCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBuUG9pbnRzOyBpICsrKSB7Ci0JCUZYX0ZJWEZMT0FUIHggPSBwUG9pbnRzW2ldLm1fUG9pbnRYLCB5ID0gcFBvaW50c1tpXS5tX1BvaW50WTsKLQkJaWYgKHBPYmplY3QyRGV2aWNlKSBwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtKHgsIHkpOwotCQlpbnQgcG9pbnRfdHlwZSA9IHBQb2ludHNbaV0ubV9GbGFnICYgRlhQVF9UWVBFOwotCQlpZiAocG9pbnRfdHlwZSA9PSBGWFBUX01PVkVUTykgewotCQkJbV9QYXRoRGF0YS5tb3ZlVG8oeCwgeSk7Ci0JCX0gZWxzZSBpZiAocG9pbnRfdHlwZSA9PSBGWFBUX0xJTkVUTykgewotCQkJaWYgKHBQb2ludHNbaS0xXS5tX0ZsYWcgPT0gRlhQVF9NT1ZFVE8gJiYgKGkgPT0gblBvaW50cy0xIHx8IHBQb2ludHNbaSsxXS5tX0ZsYWcgPT0gRlhQVF9NT1ZFVE8pICYmCi0JCQkJCUZYU1lTX2FicyhwUG9pbnRzW2ldLm1fUG9pbnRYIC0gcFBvaW50c1tpLTFdLm1fUG9pbnRYKSA8IDAuNGYgJiYgRlhTWVNfYWJzKHBQb2ludHNbaV0ubV9Qb2ludFkgLSBwUG9pbnRzW2ktMV0ubV9Qb2ludFkpPCAwLjRmKQotCQkJCS8vIFBERiBsaW5lIGluY2x1ZGVzIHRoZSBkZXN0aW5hdGlvbiBwb2ludCwgdW5saWtlIFdpbmRvd3MgbGluZS4KLQkJCQkvLyBXZSByZWNlaXZlZCBzb21lIFBERiB3aGljaCBhY3R1YWxseSBkcmF3cyB6ZXJvIGxlbmd0aCBsaW5lcy4gVEVTVERPQzogc3VtbWVyIGNoYSBzaG93LnBkZgotCQkJCS8vIFRoZXJlZm9yZSwgd2UgaGF2ZSB0byBleHRlbmQgdGhlIGxpbmUgYnkgMC40IHBpeGVsIGhlcmUuCi0JCQkJLy8gQnV0IG9ubHkgZm9yIHN0YW5kYWxvbmUgc2VnbWVudC4gVEVTVERPQzogYnVnICMxNDM0IC0gbWF6ZS5wZGY7IFRFU1RET0M6IGJ1ZyMxNTA4IGRpNzA0UF9RSUdfMTExLnBkZiAKLQkJCQl4ICs9IDAuNDsKLQkJCS8vIFRPRE86IHdlIHNob3VsZCBhY3R1YWxseSB0ZWxsIHNraWEgdmVydGV4IGdlbmVyYXRvciB0byBwcm9jZXNzIHplcm8gbGVuZ3RoIHN0cm9rZWQgbGluZSAKLQkJCS8vIChvbmx5IGJ1dHRzIGFyZSBkcmF3bikKLQkJCW1fUGF0aERhdGEubGluZVRvKHgsIHkpOwotCQl9IGVsc2UgaWYgKHBvaW50X3R5cGUgPT0gRlhQVF9CRVpJRVJUTykgewotCQkJRlhfRklYRkxPQVQgeDIgPSBwUG9pbnRzW2krMV0ubV9Qb2ludFgsIHkyID0gcFBvaW50c1tpKzFdLm1fUG9pbnRZOwotCQkJRlhfRklYRkxPQVQgeDMgPSBwUG9pbnRzW2krMl0ubV9Qb2ludFgsIHkzID0gcFBvaW50c1tpKzJdLm1fUG9pbnRZOwotCQkJaWYgKHBPYmplY3QyRGV2aWNlKXsKLQkJCQlwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtKHgyLCB5Mik7Ci0JCQkJcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybSh4MywgeTMpOwotCQkJfQotCQkJbV9QYXRoRGF0YS5jdWJpY1RvKHgsIHksIHgyLCB5MiwgeDMsIHkzKTsKLQkJCWkgKz0gMjsKLQkJfQotCQlpZiAocFBvaW50c1tpXS5tX0ZsYWcgJiBGWFBUX0NMT1NFRklHVVJFKSBtX1BhdGhEYXRhLmNsb3NlKCk7Ci0JfQordm9pZCBDU2tpYV9QYXRoRGF0YTo6QnVpbGRQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlKSB7CisgIGNvbnN0IENGWF9QYXRoRGF0YSogcEZQYXRoID0gcFBhdGhEYXRhOworICBpbnQgblBvaW50cyA9IHBGUGF0aC0+R2V0UG9pbnRDb3VudCgpOworICBGWF9QQVRIUE9JTlQqIHBQb2ludHMgPSBwRlBhdGgtPkdldFBvaW50cygpOworICBmb3IgKGludCBpID0gMDsgaSA8IG5Qb2ludHM7IGkrKykgeworICAgIEZYX0ZJWEZMT0FUIHggPSBwUG9pbnRzW2ldLm1fUG9pbnRYLCB5ID0gcFBvaW50c1tpXS5tX1BvaW50WTsKKyAgICBpZiAocE9iamVjdDJEZXZpY2UpCisgICAgICBwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtKHgsIHkpOworICAgIGludCBwb2ludF90eXBlID0gcFBvaW50c1tpXS5tX0ZsYWcgJiBGWFBUX1RZUEU7CisgICAgaWYgKHBvaW50X3R5cGUgPT0gRlhQVF9NT1ZFVE8pIHsKKyAgICAgIG1fUGF0aERhdGEubW92ZVRvKHgsIHkpOworICAgIH0gZWxzZSBpZiAocG9pbnRfdHlwZSA9PSBGWFBUX0xJTkVUTykgeworICAgICAgaWYgKHBQb2ludHNbaSAtIDFdLm1fRmxhZyA9PSBGWFBUX01PVkVUTyAmJgorICAgICAgICAgIChpID09IG5Qb2ludHMgLSAxIHx8IHBQb2ludHNbaSArIDFdLm1fRmxhZyA9PSBGWFBUX01PVkVUTykgJiYKKyAgICAgICAgICBGWFNZU19hYnMocFBvaW50c1tpXS5tX1BvaW50WCAtIHBQb2ludHNbaSAtIDFdLm1fUG9pbnRYKSA8IDAuNGYgJiYKKyAgICAgICAgICBGWFNZU19hYnMocFBvaW50c1tpXS5tX1BvaW50WSAtIHBQb2ludHNbaSAtIDFdLm1fUG9pbnRZKSA8IDAuNGYpCisgICAgICAgIC8vIFBERiBsaW5lIGluY2x1ZGVzIHRoZSBkZXN0aW5hdGlvbiBwb2ludCwgdW5saWtlIFdpbmRvd3MgbGluZS4KKyAgICAgICAgLy8gV2UgcmVjZWl2ZWQgc29tZSBQREYgd2hpY2ggYWN0dWFsbHkgZHJhd3MgemVybyBsZW5ndGggbGluZXMuIFRFU1RET0M6CisgICAgICAgIC8vIHN1bW1lciBjaGEgc2hvdy5wZGYKKyAgICAgICAgLy8gVGhlcmVmb3JlLCB3ZSBoYXZlIHRvIGV4dGVuZCB0aGUgbGluZSBieSAwLjQgcGl4ZWwgaGVyZS4KKyAgICAgICAgLy8gQnV0IG9ubHkgZm9yIHN0YW5kYWxvbmUgc2VnbWVudC4gVEVTVERPQzogYnVnICMxNDM0IC0gbWF6ZS5wZGY7CisgICAgICAgIC8vIFRFU1RET0M6IGJ1ZyMxNTA4IGRpNzA0UF9RSUdfMTExLnBkZgorICAgICAgICB4ICs9IDAuNDsKKyAgICAgIC8vIFRPRE86IHdlIHNob3VsZCBhY3R1YWxseSB0ZWxsIHNraWEgdmVydGV4IGdlbmVyYXRvciB0byBwcm9jZXNzIHplcm8KKyAgICAgIC8vIGxlbmd0aCBzdHJva2VkIGxpbmUKKyAgICAgIC8vIChvbmx5IGJ1dHRzIGFyZSBkcmF3bikKKyAgICAgIG1fUGF0aERhdGEubGluZVRvKHgsIHkpOworICAgIH0gZWxzZSBpZiAocG9pbnRfdHlwZSA9PSBGWFBUX0JFWklFUlRPKSB7CisgICAgICBGWF9GSVhGTE9BVCB4MiA9IHBQb2ludHNbaSArIDFdLm1fUG9pbnRYLCB5MiA9IHBQb2ludHNbaSArIDFdLm1fUG9pbnRZOworICAgICAgRlhfRklYRkxPQVQgeDMgPSBwUG9pbnRzW2kgKyAyXS5tX1BvaW50WCwgeTMgPSBwUG9pbnRzW2kgKyAyXS5tX1BvaW50WTsKKyAgICAgIGlmIChwT2JqZWN0MkRldmljZSkgeworICAgICAgICBwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtKHgyLCB5Mik7CisgICAgICAgIHBPYmplY3QyRGV2aWNlLT5UcmFuc2Zvcm0oeDMsIHkzKTsKKyAgICAgIH0KKyAgICAgIG1fUGF0aERhdGEuY3ViaWNUbyh4LCB5LCB4MiwgeTIsIHgzLCB5Myk7CisgICAgICBpICs9IDI7CisgICAgfQorICAgIGlmIChwUG9pbnRzW2ldLm1fRmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpCisgICAgICBtX1BhdGhEYXRhLmNsb3NlKCk7CisgIH0KIH0KIAogLy8gY29udmVydCBhIHN0cm9raW5nIHBhdGggdG8gc2NhbmxpbmVzCi1zdGF0aWMgdm9pZCBTa1Jhc3Rlcml6ZVN0cm9rZShTa1BhaW50JiBzcGFpbnQsIFNrUGF0aCogZHN0UGF0aERhdGEsIFNrUGF0aCYgcGF0aF9kYXRhLCAKLQkJCQkJIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotCQkJCQkgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwgRlhfRklYRkxPQVQgc2NhbGUgPSBGSVg4X09ORSwgCi0JCQkJCSBGWF9CT09MIGJTdHJva2VBZGp1c3QgPSBGQUxTRSwgRlhfQk9PTCBiVGV4dE1vZGUgPSBGQUxTRSkKLXsKLQlTa1BhaW50OjpDYXAgY2FwOwotCXN3aXRjaCAocEdyYXBoU3RhdGUtPm1fTGluZUNhcCkgewotCQljYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcFJvdW5kOgotCQkJY2FwID0gU2tQYWludDo6a1JvdW5kX0NhcDsKLQkJCWJyZWFrOwotCQljYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcFNxdWFyZToKLQkJCWNhcCA9IFNrUGFpbnQ6OmtTcXVhcmVfQ2FwOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQljYXAgPSBTa1BhaW50OjprQnV0dF9DYXA7Ci0JCQlicmVhazsKLQl9Ci0JU2tQYWludDo6Sm9pbiBqb2luOwotCXN3aXRjaCAocEdyYXBoU3RhdGUtPm1fTGluZUpvaW4pIHsKLQkJY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luUm91bmQ6Ci0JCQlqb2luID0gU2tQYWludDo6a1JvdW5kX0pvaW47Ci0JCQlicmVhazsKLQkJY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luQmV2ZWw6Ci0JCQlqb2luID0gU2tQYWludDo6a0JldmVsX0pvaW47Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWpvaW4gPSBTa1BhaW50OjprTWl0ZXJfSm9pbjsKLQkJCWJyZWFrOwotCX0KLQlGWF9GSVhGTE9BVCB3aWR0aCA9IHBHcmFwaFN0YXRlLT5tX0xpbmVXaWR0aCpzY2FsZTsKLQlGWF9GSVhGTE9BVCB1bml0ID0gZml4MzJfdG9fOChmaXhkaXZfOF84X3RvXzMyKEZJWDhfT05FLCAocE9iamVjdDJEZXZpY2UtPkdldFhVbml0KCkgKyBwT2JqZWN0MkRldmljZS0+R2V0WVVuaXQoKSkgLyAyKSk7Ci0JaWYgKHdpZHRoIDw9IHVuaXQpIHdpZHRoID0gdW5pdDsKK3N0YXRpYyB2b2lkIFNrUmFzdGVyaXplU3Ryb2tlKFNrUGFpbnQmIHNwYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrUGF0aCogZHN0UGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1BhdGgmIHBhdGhfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJWEZMT0FUIHNjYWxlID0gRklYOF9PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdHJva2VBZGp1c3QgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRleHRNb2RlID0gRkFMU0UpIHsKKyAgU2tQYWludDo6Q2FwIGNhcDsKKyAgc3dpdGNoIChwR3JhcGhTdGF0ZS0+bV9MaW5lQ2FwKSB7CisgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBSb3VuZDoKKyAgICAgIGNhcCA9IFNrUGFpbnQ6OmtSb3VuZF9DYXA7CisgICAgICBicmVhazsKKyAgICBjYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcFNxdWFyZToKKyAgICAgIGNhcCA9IFNrUGFpbnQ6OmtTcXVhcmVfQ2FwOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGNhcCA9IFNrUGFpbnQ6OmtCdXR0X0NhcDsKKyAgICAgIGJyZWFrOworICB9CisgIFNrUGFpbnQ6OkpvaW4gam9pbjsKKyAgc3dpdGNoIChwR3JhcGhTdGF0ZS0+bV9MaW5lSm9pbikgeworICAgIGNhc2UgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pblJvdW5kOgorICAgICAgam9pbiA9IFNrUGFpbnQ6OmtSb3VuZF9Kb2luOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luQmV2ZWw6CisgICAgICBqb2luID0gU2tQYWludDo6a0JldmVsX0pvaW47CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgam9pbiA9IFNrUGFpbnQ6OmtNaXRlcl9Kb2luOworICAgICAgYnJlYWs7CisgIH0KKyAgRlhfRklYRkxPQVQgd2lkdGggPSBwR3JhcGhTdGF0ZS0+bV9MaW5lV2lkdGggKiBzY2FsZTsKKyAgRlhfRklYRkxPQVQgdW5pdCA9IGZpeDMyX3RvXzgoZml4ZGl2XzhfOF90b18zMigKKyAgICAgIEZJWDhfT05FLCAocE9iamVjdDJEZXZpY2UtPkdldFhVbml0KCkgKyBwT2JqZWN0MkRldmljZS0+R2V0WVVuaXQoKSkgLyAyKSk7CisgIGlmICh3aWR0aCA8PSB1bml0KQorICAgIHdpZHRoID0gdW5pdDsKIAotCWlmIChwR3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXkgPT0gTlVMTCkgewotCQlTa1N0cm9rZSBzdHJva2VyOwotCQlzdHJva2VyLnNldENhcChjYXApOwotCQlzdHJva2VyLnNldEpvaW4oam9pbik7Ci0JCXN0cm9rZXIuc2V0TWl0ZXJMaW1pdChwR3JhcGhTdGF0ZS0+bV9NaXRlckxpbWl0KTsKLQkJc3Ryb2tlci5zZXRXaWR0aCh3aWR0aCk7Ci0JCXN0cm9rZXIuc2V0RG9GaWxsKEZBTFNFKTsKLQkJc3Ryb2tlci5zdHJva2VQYXRoKHBhdGhfZGF0YSwgZHN0UGF0aERhdGEpOwotCQlTa01hdHJpeCBzbWF0cml4OyAKLQkJc21hdHJpeC5zZXRBbGwocE9iamVjdDJEZXZpY2UtPmEsIHBPYmplY3QyRGV2aWNlLT5jLCBwT2JqZWN0MkRldmljZS0+ZSwgcE9iamVjdDJEZXZpY2UtPmIsIHBPYmplY3QyRGV2aWNlLT5kLCBwT2JqZWN0MkRldmljZS0+ZiwgMCwgMCwgMSk7Ci0JCWRzdFBhdGhEYXRhLT50cmFuc2Zvcm0oc21hdHJpeCk7Ci0JfSBlbHNlIHsKLQkJaW50IGNvdW50ID0gKHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudCsxKS8yOwotCQlTa1NjYWxhciogaW50ZXJ2YWxzID0gRlhfQWxsb2MyRChTa1NjYWxhciwgY291bnQsIHNpemVvZihTa1NjYWxhcikpOwotCQkvLyBTZXQgZGFzaCBwYXR0ZXJuCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkgKyspIHsKLQkJCUZYX0ZJWEZMT0FUIG9uID0gcEdyYXBoU3RhdGUtPm1fRGFzaEFycmF5W2kqMl07Ci0JCQlpZiAob24gPD0gMC4wMDAwMDFmKSBvbiA9IEZJWDhfT05FLzEwOwotCQkJRlhfRklYRkxPQVQgb2ZmID0gaSoyKzEgPT0gcEdyYXBoU3RhdGUtPm1fRGFzaENvdW50ID8gb24gOgotCQkJCQlwR3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXlbaSoyKzFdOwotCQkJaWYgKG9mZiA8IDApIG9mZiA9IDA7CQkKLQkJCWludGVydmFsc1tpKjJdPW9uKnNjYWxlOwotCQkJaW50ZXJ2YWxzW2kqMisxXT1vZmYqc2NhbGU7Ci0JCX0KLQkJU2tEYXNoUGF0aEVmZmVjdCogcEVmZmVjdCA9IG5ldyBTa0Rhc2hQYXRoRWZmZWN0KGludGVydmFscyxjb3VudCoyLCBwR3JhcGhTdGF0ZS0+bV9EYXNoUGhhc2Uqc2NhbGUpOwotCQlzcGFpbnQuc2V0UGF0aEVmZmVjdChwRWZmZWN0KS0+dW5yZWYoKTsKLQkJc3BhaW50LnNldFN0cm9rZVdpZHRoKHdpZHRoKTsKLQkJc3BhaW50LnNldFN0cm9rZU1pdGVyKHBHcmFwaFN0YXRlLT5tX01pdGVyTGltaXQpOwotCQlzcGFpbnQuc2V0U3Ryb2tlQ2FwKGNhcCk7Ci0JCXNwYWludC5zZXRTdHJva2VKb2luKGpvaW4pOwotCQlzcGFpbnQuZ2V0RmlsbFBhdGgocGF0aF9kYXRhLCBkc3RQYXRoRGF0YSk7Ci0JCVNrTWF0cml4IHNtYXRyaXg7IAotCQlzbWF0cml4LnNldEFsbChwT2JqZWN0MkRldmljZS0+YSwgcE9iamVjdDJEZXZpY2UtPmMsIHBPYmplY3QyRGV2aWNlLT5lLCBwT2JqZWN0MkRldmljZS0+YiwgcE9iamVjdDJEZXZpY2UtPmQsIHBPYmplY3QyRGV2aWNlLT5mLCAwLCAwLCAxKTsKLQkJZHN0UGF0aERhdGEtPnRyYW5zZm9ybShzbWF0cml4KTsKLQkJRlhfRnJlZShpbnRlcnZhbHMpOwotCX0KKyAgaWYgKHBHcmFwaFN0YXRlLT5tX0Rhc2hBcnJheSkgeworICAgIGludCBjb3VudCA9IChwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQgKyAxKSAvIDI7CisgICAgU2tTY2FsYXIqIGludGVydmFscyA9IEZYX0FsbG9jMkQoU2tTY2FsYXIsIGNvdW50LCBzaXplb2YoU2tTY2FsYXIpKTsKKyAgICAvLyBTZXQgZGFzaCBwYXR0ZXJuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICBGWF9GSVhGTE9BVCBvbiA9IHBHcmFwaFN0YXRlLT5tX0Rhc2hBcnJheVtpICogMl07CisgICAgICBpZiAob24gPD0gMC4wMDAwMDFmKQorICAgICAgICBvbiA9IEZJWDhfT05FIC8gMTA7CisgICAgICBGWF9GSVhGTE9BVCBvZmYgPSBpICogMiArIDEgPT0gcEdyYXBoU3RhdGUtPm1fRGFzaENvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcEdyYXBoU3RhdGUtPm1fRGFzaEFycmF5W2kgKiAyICsgMV07CisgICAgICBpZiAob2ZmIDwgMCkKKyAgICAgICAgb2ZmID0gMDsKKyAgICAgIGludGVydmFsc1tpICogMl0gPSBvbiAqIHNjYWxlOworICAgICAgaW50ZXJ2YWxzW2kgKiAyICsgMV0gPSBvZmYgKiBzY2FsZTsKKyAgICB9CisgICAgU2tEYXNoUGF0aEVmZmVjdCogcEVmZmVjdCA9IG5ldyBTa0Rhc2hQYXRoRWZmZWN0KAorICAgICAgICBpbnRlcnZhbHMsIGNvdW50ICogMiwgcEdyYXBoU3RhdGUtPm1fRGFzaFBoYXNlICogc2NhbGUpOworICAgIHNwYWludC5zZXRQYXRoRWZmZWN0KHBFZmZlY3QpLT51bnJlZigpOworICAgIHNwYWludC5zZXRTdHJva2VXaWR0aCh3aWR0aCk7CisgICAgc3BhaW50LnNldFN0cm9rZU1pdGVyKHBHcmFwaFN0YXRlLT5tX01pdGVyTGltaXQpOworICAgIHNwYWludC5zZXRTdHJva2VDYXAoY2FwKTsKKyAgICBzcGFpbnQuc2V0U3Ryb2tlSm9pbihqb2luKTsKKyAgICBzcGFpbnQuZ2V0RmlsbFBhdGgocGF0aF9kYXRhLCBkc3RQYXRoRGF0YSk7CisgICAgU2tNYXRyaXggc21hdHJpeDsKKyAgICBzbWF0cml4LnNldEFsbChwT2JqZWN0MkRldmljZS0+YSwgcE9iamVjdDJEZXZpY2UtPmMsIHBPYmplY3QyRGV2aWNlLT5lLAorICAgICAgICAgICAgICAgICAgIHBPYmplY3QyRGV2aWNlLT5iLCBwT2JqZWN0MkRldmljZS0+ZCwgcE9iamVjdDJEZXZpY2UtPmYsIDAsCisgICAgICAgICAgICAgICAgICAgMCwgMSk7CisgICAgZHN0UGF0aERhdGEtPnRyYW5zZm9ybShzbWF0cml4KTsKKyAgICBGWF9GcmVlKGludGVydmFscyk7CisgIH0gZWxzZSB7CisgICAgU2tTdHJva2Ugc3Ryb2tlcjsKKyAgICBzdHJva2VyLnNldENhcChjYXApOworICAgIHN0cm9rZXIuc2V0Sm9pbihqb2luKTsKKyAgICBzdHJva2VyLnNldE1pdGVyTGltaXQocEdyYXBoU3RhdGUtPm1fTWl0ZXJMaW1pdCk7CisgICAgc3Ryb2tlci5zZXRXaWR0aCh3aWR0aCk7CisgICAgc3Ryb2tlci5zZXREb0ZpbGwoRkFMU0UpOworICAgIHN0cm9rZXIuc3Ryb2tlUGF0aChwYXRoX2RhdGEsIGRzdFBhdGhEYXRhKTsKKyAgICBTa01hdHJpeCBzbWF0cml4OworICAgIHNtYXRyaXguc2V0QWxsKHBPYmplY3QyRGV2aWNlLT5hLCBwT2JqZWN0MkRldmljZS0+YywgcE9iamVjdDJEZXZpY2UtPmUsCisgICAgICAgICAgICAgICAgICAgcE9iamVjdDJEZXZpY2UtPmIsIHBPYmplY3QyRGV2aWNlLT5kLCBwT2JqZWN0MkRldmljZS0+ZiwgMCwKKyAgICAgICAgICAgICAgICAgICAwLCAxKTsKKyAgICBkc3RQYXRoRGF0YS0+dHJhbnNmb3JtKHNtYXRyaXgpOworICB9CiB9CiAKLUNGWF9Ta2lhRGV2aWNlRHJpdmVyOjpDRlhfU2tpYURldmljZURyaXZlcihDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkaXRoZXJfYml0cywgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQpCi17Ci0JbV9wQWdnRHJpdmVyID0gbmV3IENGWF9BZ2dEZXZpY2VEcml2ZXIocEJpdG1hcCwgZGl0aGVyX2JpdHMsIGJSZ2JCeXRlT3JkZXIsIHBPcmlEZXZpY2UsIGJHcm91cEtub2Nrb3V0KTsKK0NGWF9Ta2lhRGV2aWNlRHJpdmVyOjpDRlhfU2tpYURldmljZURyaXZlcihDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpdGhlcl9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiR3JvdXBLbm9ja291dCkgeworICBtX3BBZ2dEcml2ZXIgPSBuZXcgQ0ZYX0FnZ0RldmljZURyaXZlcihwQml0bWFwLCBkaXRoZXJfYml0cywgYlJnYkJ5dGVPcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9yaURldmljZSwgYkdyb3VwS25vY2tvdXQpOwogfQotQ0ZYX1NraWFEZXZpY2VEcml2ZXI6On5DRlhfU2tpYURldmljZURyaXZlcigpCi17Ci0JaWYgKG1fcEFnZ0RyaXZlcikgZGVsZXRlIG1fcEFnZ0RyaXZlcjsKK0NGWF9Ta2lhRGV2aWNlRHJpdmVyOjp+Q0ZYX1NraWFEZXZpY2VEcml2ZXIoKSB7CisgIGRlbGV0ZSBtX3BBZ2dEcml2ZXI7CiB9Ci1GWF9CT09MIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLCBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsIENGWF9Gb250KiBwRm9udCwKLQkJQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwgRlhfRklYRkxPQVQgZm9udF9zaXplLCBGWF9EV09SRCBjb2xvciwgCi0JCWludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotCXJldHVybiBtX3BBZ2dEcml2ZXItPkRyYXdEZXZpY2VUZXh0KG5DaGFycywgcENoYXJQb3MsIHBGb250LHBDYWNoZSwgcE9iamVjdDJEZXZpY2UsIGZvbnRfc2l6ZSwgY29sb3IsIAotCQlhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKK0ZYX0JPT0wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkRyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udENhY2hlKiBwQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJWEZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIHJldHVybiBtX3BBZ2dEcml2ZXItPkRyYXdEZXZpY2VUZXh0KG5DaGFycywgcENoYXJQb3MsIHBGb250LCBwQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmplY3QyRGV2aWNlLCBmb250X3NpemUsIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKIH0KLWludCBDRlhfU2tpYURldmljZURyaXZlcjo6R2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCkKLXsKLQlyZXR1cm4gbV9wQWdnRHJpdmVyLT5HZXREZXZpY2VDYXBzKGNhcHNfaWQpOworaW50IENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpHZXREZXZpY2VDYXBzKGludCBjYXBzX2lkKSB7CisgIHJldHVybiBtX3BBZ2dEcml2ZXItPkdldERldmljZUNhcHMoY2Fwc19pZCk7CiB9Ci12b2lkIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpTYXZlU3RhdGUoKQotewotCW1fcEFnZ0RyaXZlci0+U2F2ZVN0YXRlKCk7CQordm9pZCBDRlhfU2tpYURldmljZURyaXZlcjo6U2F2ZVN0YXRlKCkgeworICBtX3BBZ2dEcml2ZXItPlNhdmVTdGF0ZSgpOwogfQogCi12b2lkIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkKQotewotCW1fcEFnZ0RyaXZlci0+UmVzdG9yZVN0YXRlKGJLZWVwU2F2ZWQpOwordm9pZCBDRlhfU2tpYURldmljZURyaXZlcjo6UmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCkgeworICBtX3BBZ2dEcml2ZXItPlJlc3RvcmVTdGF0ZShiS2VlcFNhdmVkKTsKIH0KLXZvaWQgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlNldENsaXBNYXNrKHJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEmIHJhc3Rlcml6ZXIpCi17Ci0JbV9wQWdnRHJpdmVyLT5TZXRDbGlwTWFzayhyYXN0ZXJpemVyKTsKK3ZvaWQgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlNldENsaXBNYXNrKHJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEmIHJhc3Rlcml6ZXIpIHsKKyAgbV9wQWdnRHJpdmVyLT5TZXRDbGlwTWFzayhyYXN0ZXJpemVyKTsKIH0KLXZvaWQgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlNldENsaXBNYXNrKFNrUGF0aCYgc2tQYXRoLCBTa1BhaW50KiBzcGFpbnQpCi17CQotCVNrSVJlY3QgY2xpcF9ib3g7Ci0JY2xpcF9ib3guc2V0KDAsIDAsIGZpeDBfdG9fOChHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpKSwgZml4MF90b184KEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKSk7Ci0JY2xpcF9ib3guaW50ZXJzZWN0KG1fcEFnZ0RyaXZlci0+bV9wQ2xpcFJnbi0+R2V0Qm94KCkubGVmdCwgbV9wQWdnRHJpdmVyLT5tX3BDbGlwUmduLT5HZXRCb3goKS50b3AsCi0JCW1fcEFnZ0RyaXZlci0+bV9wQ2xpcFJnbi0+R2V0Qm94KCkucmlnaHQsIG1fcEFnZ0RyaXZlci0+bV9wQ2xpcFJnbi0+R2V0Qm94KCkuYm90dG9tKTsKK3ZvaWQgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlNldENsaXBNYXNrKFNrUGF0aCYgc2tQYXRoLCBTa1BhaW50KiBzcGFpbnQpIHsKKyAgU2tJUmVjdCBjbGlwX2JveDsKKyAgY2xpcF9ib3guc2V0KDAsIDAsIGZpeDBfdG9fOChHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpKSwKKyAgICAgICAgICAgICAgIGZpeDBfdG9fOChHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSkpOworICBjbGlwX2JveC5pbnRlcnNlY3QobV9wQWdnRHJpdmVyLT5tX3BDbGlwUmduLT5HZXRCb3goKS5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgbV9wQWdnRHJpdmVyLT5tX3BDbGlwUmduLT5HZXRCb3goKS50b3AsCisgICAgICAgICAgICAgICAgICAgICBtX3BBZ2dEcml2ZXItPm1fcENsaXBSZ24tPkdldEJveCgpLnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgbV9wQWdnRHJpdmVyLT5tX3BDbGlwUmduLT5HZXRCb3goKS5ib3R0b20pOwogCi0JU2tQYXRoKiBwYXRoUHRyID0gJnNrUGF0aDsKKyAgU2tQYXRoKiBwYXRoUHRyID0gJnNrUGF0aDsKIAotCVNrUmVjdCBwYXRoX3JlY3QgPSBza1BhdGguZ2V0Qm91bmRzKCk7CisgIFNrUmVjdCBwYXRoX3JlY3QgPSBza1BhdGguZ2V0Qm91bmRzKCk7CiAKLQljbGlwX2JveC5pbnRlcnNlY3QoRlhTWVNfZmxvb3IocGF0aF9yZWN0LmZMZWZ0KSwgRlhTWVNfZmxvb3IocGF0aF9yZWN0LmZUb3ApLCBGWFNZU19mbG9vcihwYXRoX3JlY3QuZlJpZ2h0KSsxLCBGWFNZU19mbG9vcihwYXRoX3JlY3QuZkJvdHRvbSkrMSk7Ci0JQ0ZYX0RJQml0bWFwUmVmIG1hc2s7Ci0JQ0ZYX0RJQml0bWFwKiBwVGhpc0xheWVyID0gbWFzay5OZXcoKTsKLQlwVGhpc0xheWVyLT5DcmVhdGUoY2xpcF9ib3gud2lkdGgoKSwgY2xpcF9ib3guaGVpZ2h0KCksIEZYRElCXzhicHBNYXNrKTsKLQlwVGhpc0xheWVyLT5DbGVhcigwKTsKKyAgY2xpcF9ib3guaW50ZXJzZWN0KEZYU1lTX2Zsb29yKHBhdGhfcmVjdC5mTGVmdCksIEZYU1lTX2Zsb29yKHBhdGhfcmVjdC5mVG9wKSwKKyAgICAgICAgICAgICAgICAgICAgIEZYU1lTX2Zsb29yKHBhdGhfcmVjdC5mUmlnaHQpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgIEZYU1lTX2Zsb29yKHBhdGhfcmVjdC5mQm90dG9tKSArIDEpOworICBDRlhfRElCaXRtYXBSZWYgbWFzazsKKyAgQ0ZYX0RJQml0bWFwKiBwVGhpc0xheWVyID0gbWFzay5OZXcoKTsKKyAgcFRoaXNMYXllci0+Q3JlYXRlKGNsaXBfYm94LndpZHRoKCksIGNsaXBfYm94LmhlaWdodCgpLCBGWERJQl84YnBwTWFzayk7CisgIHBUaGlzTGF5ZXItPkNsZWFyKDApOwogCi0JQ0ZYX1NraWFBOFJlbmRlcmVyIHJlbmRlcjsKLQlyZW5kZXIuSW5pdChwVGhpc0xheWVyLCBjbGlwX2JveC5mTGVmdCwgY2xpcF9ib3guZlRvcCk7CisgIENGWF9Ta2lhQThSZW5kZXJlciByZW5kZXI7CisgIHJlbmRlci5Jbml0KHBUaGlzTGF5ZXIsIGNsaXBfYm94LmZMZWZ0LCBjbGlwX2JveC5mVG9wKTsKIAotCVNrUmFzdGVyQ2xpcCByYXN0ZXJDbGlwKGNsaXBfYm94KTsKLQlTdXBlckJsaXR0ZXJfc2tpYTo6RHJhd1BhdGgoc2tQYXRoLCAoU2tCbGl0dGVyKikmcmVuZGVyLCByYXN0ZXJDbGlwLCAqc3BhaW50KTsKLQkKLQkvLyBGaW5hbGx5LCB3ZSBoYXZlIGdvdCB0aGUgbWFzayB0aGF0IHdlIG5lZWQsIGludGVyc2VjdCB3aXRoIGN1cnJlbnQgY2xpcCByZWdpb24KLQltX3BBZ2dEcml2ZXItPm1fcENsaXBSZ24tPkludGVyc2VjdE1hc2tGKGNsaXBfYm94LmZMZWZ0LCBjbGlwX2JveC5mVG9wLCBtYXNrKTsKKyAgU2tSYXN0ZXJDbGlwIHJhc3RlckNsaXAoY2xpcF9ib3gpOworICBTdXBlckJsaXR0ZXJfc2tpYTo6RHJhd1BhdGgoc2tQYXRoLCAoU2tCbGl0dGVyKikmcmVuZGVyLCByYXN0ZXJDbGlwLCAqc3BhaW50KTsKIAorICAvLyBGaW5hbGx5LCB3ZSBoYXZlIGdvdCB0aGUgbWFzayB0aGF0IHdlIG5lZWQsIGludGVyc2VjdCB3aXRoIGN1cnJlbnQgY2xpcAorICAvLyByZWdpb24KKyAgbV9wQWdnRHJpdmVyLT5tX3BDbGlwUmduLT5JbnRlcnNlY3RNYXNrRihjbGlwX2JveC5mTGVmdCwgY2xpcF9ib3guZlRvcCwgbWFzayk7CiB9Ci1GWF9CT09MIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAkvLyBwYXRoIGluZm8KLQkJCQkJCWNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAkvLyBvcHRpb25hbCB0cmFuc2Zvcm1hdGlvbgotCQkJCQkJaW50IGZpbGxfbW9kZQkvLyBmaWxsIG1vZGUsIFdJTkRJTkcgb3IgQUxURVJOQVRFCi0JCQkJCQkpCi17Ci0JaWYgKG1fcEFnZ0RyaXZlci0+bV9wQ2xpcFJnbiA9PSBOVUxMKQotCQltX3BBZ2dEcml2ZXItPm1fcENsaXBSZ24gPSBuZXcgQ0ZYX0NsaXBSZ24oR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKSwgR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpOworRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6U2V0Q2xpcF9QYXRoRmlsbCgKKyAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwgICAgIC8vIHBhdGggaW5mbworICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLCAgLy8gb3B0aW9uYWwgdHJhbnNmb3JtYXRpb24KKyAgICBpbnQgZmlsbF9tb2RlICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbGwgbW9kZSwgV0lORElORyBvciBBTFRFUk5BVEUKKyAgICApIHsKKyAgaWYgKCFtX3BBZ2dEcml2ZXItPm1fcENsaXBSZ24pIHsKKyAgICBtX3BBZ2dEcml2ZXItPm1fcENsaXBSZ24gPSBuZXcgQ0ZYX0NsaXBSZ24oCisgICAgICAgIEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCksIEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKTsKKyAgfQogCi0JaWYgKHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID09IDUgfHwgcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgPT0gNCkgewotCQlDRlhfRmxvYXRSZWN0IHJlY3RmOwotCQlpZiAocFBhdGhEYXRhLT5Jc1JlY3QocE9iamVjdDJEZXZpY2UsICZyZWN0ZikpIHsKLQkJCXJlY3RmLkludGVyc2VjdChDRlhfRmxvYXRSZWN0KDAsIDAsIChGWF9GSVhGTE9BVClHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpLCAoRlhfRklYRkxPQVQpR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpKTsKLQkJCUZYX1JFQ1QgcmVjdCA9IHJlY3RmLkdldE91dHRlclJlY3QoKTsKLQkJCW1fcEFnZ0RyaXZlci0+bV9wQ2xpcFJnbi0+SW50ZXJzZWN0UmVjdChyZWN0KTsKLQkJCXJldHVybiBUUlVFOwotCQl9Ci0JfQotCUNTa2lhX1BhdGhEYXRhIHBhdGhfZGF0YTsKLQlwYXRoX2RhdGEuQnVpbGRQYXRoKHBQYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UpOwotCXBhdGhfZGF0YS5tX1BhdGhEYXRhLmNsb3NlKCk7Ci0JcGF0aF9kYXRhLm1fUGF0aERhdGEuc2V0RmlsbFR5cGUoKGZpbGxfbW9kZSYzKSA9PSBGWEZJTExfV0lORElORz8gU2tQYXRoOjprV2luZGluZ19GaWxsVHlwZTpTa1BhdGg6OmtFdmVuT2RkX0ZpbGxUeXBlKTsKKyAgaWYgKHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID09IDUgfHwgcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgPT0gNCkgeworICAgIENGWF9GbG9hdFJlY3QgcmVjdGY7CisgICAgaWYgKHBQYXRoRGF0YS0+SXNSZWN0KHBPYmplY3QyRGV2aWNlLCAmcmVjdGYpKSB7CisgICAgICByZWN0Zi5JbnRlcnNlY3QoCisgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdCgwLCAwLCAoRlhfRklYRkxPQVQpR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GSVhGTE9BVClHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSkpOworICAgICAgRlhfUkVDVCByZWN0ID0gcmVjdGYuR2V0T3V0dGVyUmVjdCgpOworICAgICAgbV9wQWdnRHJpdmVyLT5tX3BDbGlwUmduLT5JbnRlcnNlY3RSZWN0KHJlY3QpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIENTa2lhX1BhdGhEYXRhIHBhdGhfZGF0YTsKKyAgcGF0aF9kYXRhLkJ1aWxkUGF0aChwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlKTsKKyAgcGF0aF9kYXRhLm1fUGF0aERhdGEuY2xvc2UoKTsKKyAgcGF0aF9kYXRhLm1fUGF0aERhdGEuc2V0RmlsbFR5cGUoKGZpbGxfbW9kZSAmIDMpID09IEZYRklMTF9XSU5ESU5HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFNrUGF0aDo6a1dpbmRpbmdfRmlsbFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU2tQYXRoOjprRXZlbk9kZF9GaWxsVHlwZSk7CiAKLQlTa1BhaW50IHNwYWludDsKLQlzcGFpbnQuc2V0Q29sb3IoMHhmZmZmZmZmZik7Ci0Jc3BhaW50LnNldEFudGlBbGlhcyhUUlVFKTsKLQlzcGFpbnQuc2V0U3R5bGUoU2tQYWludDo6a0ZpbGxfU3R5bGUpOworICBTa1BhaW50IHNwYWludDsKKyAgc3BhaW50LnNldENvbG9yKDB4ZmZmZmZmZmYpOworICBzcGFpbnQuc2V0QW50aUFsaWFzKFRSVUUpOworICBzcGFpbnQuc2V0U3R5bGUoU2tQYWludDo6a0ZpbGxfU3R5bGUpOwogCi0JU2V0Q2xpcE1hc2socGF0aF9kYXRhLm1fUGF0aERhdGEsICZzcGFpbnQpOworICBTZXRDbGlwTWFzayhwYXRoX2RhdGEubV9QYXRoRGF0YSwgJnNwYWludCk7CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwJLy8gcGF0aCBpbmZvCi0JCQkJCQljb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwJLy8gb3B0aW9uYWwgdHJhbnNmb3JtYXRpb24KLQkJCQkJCWNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUJLy8gZ3JhcGhpYyBzdGF0ZSwgZm9yIHBlbiBhdHRyaWJ1dGVzCi0JCQkJCSkKLXsKLQlpZiAobV9wQWdnRHJpdmVyLT5tX3BDbGlwUmduID09IE5VTEwpCi0JCW1fcEFnZ0RyaXZlci0+bV9wQ2xpcFJnbiA9IG5ldyBDRlhfQ2xpcFJnbihHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpLCBHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSk7CitGWF9CT09MIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhTdHJva2UoCisgICAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsICAgICAgICAgLy8gcGF0aCBpbmZvCisgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsICAgICAgLy8gb3B0aW9uYWwgdHJhbnNmb3JtYXRpb24KKyAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlICAvLyBncmFwaGljIHN0YXRlLCBmb3IgcGVuIGF0dHJpYnV0ZXMKKyAgICApIHsKKyAgaWYgKCFtX3BBZ2dEcml2ZXItPm1fcENsaXBSZ24pIHsKKyAgICBtX3BBZ2dEcml2ZXItPm1fcENsaXBSZ24gPSBuZXcgQ0ZYX0NsaXBSZ24oCisgICAgICAgIEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCksIEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKTsKKyAgfQogCi0JLy8gYnVpbGQgcGF0aCBkYXRhCi0JQ1NraWFfUGF0aERhdGEgcGF0aF9kYXRhOwotCXBhdGhfZGF0YS5CdWlsZFBhdGgocFBhdGhEYXRhLCBOVUxMKTsKLQlwYXRoX2RhdGEubV9QYXRoRGF0YS5zZXRGaWxsVHlwZShTa1BhdGg6OmtXaW5kaW5nX0ZpbGxUeXBlKTsKKyAgLy8gYnVpbGQgcGF0aCBkYXRhCisgIENTa2lhX1BhdGhEYXRhIHBhdGhfZGF0YTsKKyAgcGF0aF9kYXRhLkJ1aWxkUGF0aChwUGF0aERhdGEsIE5VTEwpOworICBwYXRoX2RhdGEubV9QYXRoRGF0YS5zZXRGaWxsVHlwZShTa1BhdGg6OmtXaW5kaW5nX0ZpbGxUeXBlKTsKIAotCVNrUGFpbnQgc3BhaW50OwotCXNwYWludC5zZXRDb2xvcigweGZmZmZmZmZmKTsKLQlzcGFpbnQuc2V0U3R5bGUoU2tQYWludDo6a1N0cm9rZV9TdHlsZSk7Ci0Jc3BhaW50LnNldEFudGlBbGlhcyhUUlVFKTsKKyAgU2tQYWludCBzcGFpbnQ7CisgIHNwYWludC5zZXRDb2xvcigweGZmZmZmZmZmKTsKKyAgc3BhaW50LnNldFN0eWxlKFNrUGFpbnQ6OmtTdHJva2VfU3R5bGUpOworICBzcGFpbnQuc2V0QW50aUFsaWFzKFRSVUUpOwogCi0JU2tQYXRoIGRzdF9wYXRoOwotCVNrUmFzdGVyaXplU3Ryb2tlKHNwYWludCwgJmRzdF9wYXRoLCBwYXRoX2RhdGEubV9QYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UsIHBHcmFwaFN0YXRlLCAxLCBGQUxTRSwgMCk7Ci0Jc3BhaW50LnNldFN0eWxlKFNrUGFpbnQ6OmtGaWxsX1N0eWxlKTsKLQlTZXRDbGlwTWFzayhkc3RfcGF0aCwgJnNwYWludCk7Ci0JCi0JcmV0dXJuIFRSVUU7CisgIFNrUGF0aCBkc3RfcGF0aDsKKyAgU2tSYXN0ZXJpemVTdHJva2Uoc3BhaW50LCAmZHN0X3BhdGgsIHBhdGhfZGF0YS5tX1BhdGhEYXRhLCBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgcEdyYXBoU3RhdGUsIDEsIEZBTFNFLCAwKTsKKyAgc3BhaW50LnNldFN0eWxlKFNrUGFpbnQ6OmtGaWxsX1N0eWxlKTsKKyAgU2V0Q2xpcE1hc2soZHN0X3BhdGgsICZzcGFpbnQpOworCisgIHJldHVybiBUUlVFOwogfQotRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6UmVuZGVyUmFzdGVyaXplcihyYXN0ZXJpemVyX3NjYW5saW5lX2FhJiByYXN0ZXJpemVyLCBGWF9EV09SRCBjb2xvciwgRlhfQk9PTCBiRnVsbENvdmVyLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0LAotCQkJCQkJCQkJCQkgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotCXJldHVybiBtX3BBZ2dEcml2ZXItPlJlbmRlclJhc3Rlcml6ZXIocmFzdGVyaXplciwgY29sb3IsIGJGdWxsQ292ZXIsIGJHcm91cEtub2Nrb3V0LGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOworRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6UmVuZGVyUmFzdGVyaXplcigKKyAgICByYXN0ZXJpemVyX3NjYW5saW5lX2FhJiByYXN0ZXJpemVyLAorICAgIEZYX0RXT1JEIGNvbG9yLAorICAgIEZYX0JPT0wgYkZ1bGxDb3ZlciwKKyAgICBGWF9CT09MIGJHcm91cEtub2Nrb3V0LAorICAgIGludCBhbHBoYV9mbGFnLAorICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgcmV0dXJuIG1fcEFnZ0RyaXZlci0+UmVuZGVyUmFzdGVyaXplcigKKyAgICAgIHJhc3Rlcml6ZXIsIGNvbG9yLCBiRnVsbENvdmVyLCBiR3JvdXBLbm9ja291dCwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiB9Ci1GWF9CT09MCUNGWF9Ta2lhRGV2aWNlRHJpdmVyOjpSZW5kZXJSYXN0ZXJpemVyU2tpYShTa1BhdGgmIHNrUGF0aCwgY29uc3QgU2tQYWludCYgb3JpZ1BhaW50LCBTa0lSZWN0JiByZWN0LCBGWF9EV09SRCBjb2xvciwgRlhfQk9PTCBiRnVsbENvdmVyLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0LCAKLQkJCQkJCQlpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgRlhfQk9PTCBiRmlsbCkKLXsKLQlDRlhfRElCaXRtYXAqIHB0ID0gYkdyb3VwS25vY2tvdXQ/bV9wQWdnRHJpdmVyLT5HZXRCYWNrRHJvcCgpOk5VTEw7Ci0JQ0ZYX1NraWFSZW5kZXJlciByZW5kZXI7Ci0JaWYgKCFyZW5kZXIuSW5pdChtX3BBZ2dEcml2ZXItPm1fcEJpdG1hcCwgcHQsIG1fcEFnZ0RyaXZlci0+bV9wQ2xpcFJnbiwgY29sb3IsIGJGdWxsQ292ZXIsIG1fcEFnZ0RyaXZlci0+bV9iUmdiQnl0ZU9yZGVyLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkKLQkJcmV0dXJuIEZBTFNFOwotCQotCVNrUmFzdGVyQ2xpcCByYXN0ZXJDbGlwKHJlY3QpOwotCVN1cGVyQmxpdHRlcl9za2lhOjpEcmF3UGF0aChza1BhdGgsIChTa0JsaXR0ZXIqKSZyZW5kZXIsICByYXN0ZXJDbGlwLCBvcmlnUGFpbnQpOworRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6UmVuZGVyUmFzdGVyaXplclNraWEoU2tQYXRoJiBza1BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTa1BhaW50JiBvcmlnUGFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa0lSZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGdWxsQ292ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJHcm91cEtub2Nrb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmlsbCkgeworICBDRlhfRElCaXRtYXAqIHB0ID0gYkdyb3VwS25vY2tvdXQgPyBtX3BBZ2dEcml2ZXItPkdldEJhY2tEcm9wKCkgOiBOVUxMOworICBDRlhfU2tpYVJlbmRlcmVyIHJlbmRlcjsKKyAgaWYgKCFyZW5kZXIuSW5pdChtX3BBZ2dEcml2ZXItPm1fcEJpdG1hcCwgcHQsIG1fcEFnZ0RyaXZlci0+bV9wQ2xpcFJnbiwgY29sb3IsCisgICAgICAgICAgICAgICAgICAgYkZ1bGxDb3ZlciwgbV9wQWdnRHJpdmVyLT5tX2JSZ2JCeXRlT3JkZXIsIGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JcmV0dXJuIFRSVUU7Ci0JCisgIFNrUmFzdGVyQ2xpcCByYXN0ZXJDbGlwKHJlY3QpOworICBTdXBlckJsaXR0ZXJfc2tpYTo6RHJhd1BhdGgoc2tQYXRoLCAoU2tCbGl0dGVyKikmcmVuZGVyLCByYXN0ZXJDbGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ1BhaW50KTsKKworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTAlDRlhfU2tpYURldmljZURyaXZlcjo6RHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCS8vIHBhdGggaW5mbwotCQkJCQkJY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCS8vIG9wdGlvbmFsIHRyYW5zZm9ybWF0aW9uCi0JCQkJCQljb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAkvLyBncmFwaGljIHN0YXRlLCBmb3IgcGVuIGF0dHJpYnV0ZXMKLQkJCQkJCUZYX0RXT1JEIGZpbGxfY29sb3IsCQkJLy8gZmlsbCBjb2xvcgotCQkJCQkJRlhfRFdPUkQgc3Ryb2tlX2NvbG9yLAkJCS8vIHN0cm9rZSBjb2xvcgotCQkJCQkJaW50IGZpbGxfbW9kZSwJCQkJCS8vIGZpbGwgbW9kZSwgV0lORElORyBvciBBTFRFUk5BVEUuIDAgZm9yIG5vdCBmaWxsZWQKLQkJCQkJCWludCBhbHBoYV9mbGFnLCAKLQkJCQkJCXZvaWQqIHBJY2NUcmFuc2Zvcm0KLQkJCQkJCSkKLXsKLQlpZiAoR2V0QnVmZmVyKCkgPT0gTlVMTCkgcmV0dXJuIFRSVUU7Ci0JRk9YSVRfREVCVUcxKCJDRlhfU2tpYURldmljZURyaXZlcjo6RHJhd1BhdGg6IGVudGVyaW5nIik7Ci0JU2tJUmVjdCByZWN0OwotCXJlY3Quc2V0KDAsIDAsIEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCksIEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKTsKLQlpZiAoKGZpbGxfbW9kZSAmIDMpICYmIGZpbGxfY29sb3IpIHsKLQkJLy8gV2UgaGF2ZSB0byB0cmFuc2Zvcm0gYmVmb3JlIGJ1aWxkaW5nIHBhdGggZGF0YSwgb3RoZXJ3aXNlIHdlJ2xsIGhhdmUgZmxhdHRpbmcgcHJvYmxlbQotCQkvLyB3aGVuIHdlIGVubGFyZ2UgYSBzbWFsbCBwYXRoIChmbGF0dGVuIGJlZm9yZSB0cmFuc2Zvcm1lZCkKLQkJLy8gVEVTVERPQzogQnVnICM1MTE1IC0gRFNfUzFEaW1wYWN0X2xyLnBkZiAKLQkJLy8gYnVpbGQgcGF0aCBkYXRhCi0JCUNTa2lhX1BhdGhEYXRhIHBhdGhfZGF0YTsKLQkJcGF0aF9kYXRhLkJ1aWxkUGF0aChwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlKTsKLQkJLy9wYXRoX2RhdGEubV9QYXRoRGF0YS5jbG9zZSgpOwotCQlwYXRoX2RhdGEubV9QYXRoRGF0YS5zZXRGaWxsVHlwZSgoZmlsbF9tb2RlJjMpID09IEZYRklMTF9XSU5ESU5HPyBTa1BhdGg6OmtXaW5kaW5nX0ZpbGxUeXBlOlNrUGF0aDo6a0V2ZW5PZGRfRmlsbFR5cGUpOworRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6RHJhd1BhdGgoCisgICAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsICAgICAgICAgIC8vIHBhdGggaW5mbworICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLCAgICAgICAvLyBvcHRpb25hbCB0cmFuc2Zvcm1hdGlvbgorICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsICAvLyBncmFwaGljIHN0YXRlLCBmb3IgcGVuIGF0dHJpYnV0ZXMKKyAgICBGWF9EV09SRCBmaWxsX2NvbG9yLCAgICAgICAgICAgICAgICAgICAgLy8gZmlsbCBjb2xvcgorICAgIEZYX0RXT1JEIHN0cm9rZV9jb2xvciwgICAgICAgICAgICAgICAgICAvLyBzdHJva2UgY29sb3IKKyAgICBpbnQgZmlsbF9tb2RlLCAgLy8gZmlsbCBtb2RlLCBXSU5ESU5HIG9yIEFMVEVSTkFURS4gMCBmb3Igbm90IGZpbGxlZAorICAgIGludCBhbHBoYV9mbGFnLAorICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgaWYgKCFHZXRCdWZmZXIoKSkKKyAgICByZXR1cm4gVFJVRTsKKyAgRk9YSVRfREVCVUcxKCJDRlhfU2tpYURldmljZURyaXZlcjo6RHJhd1BhdGg6IGVudGVyaW5nIik7CisgIFNrSVJlY3QgcmVjdDsKKyAgcmVjdC5zZXQoMCwgMCwgR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKSwKKyAgICAgICAgICAgR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpOworICBpZiAoKGZpbGxfbW9kZSAmIDMpICYmIGZpbGxfY29sb3IpIHsKKyAgICAvLyBXZSBoYXZlIHRvIHRyYW5zZm9ybSBiZWZvcmUgYnVpbGRpbmcgcGF0aCBkYXRhLCBvdGhlcndpc2Ugd2UnbGwgaGF2ZQorICAgIC8vIGZsYXR0aW5nIHByb2JsZW0KKyAgICAvLyB3aGVuIHdlIGVubGFyZ2UgYSBzbWFsbCBwYXRoIChmbGF0dGVuIGJlZm9yZSB0cmFuc2Zvcm1lZCkKKyAgICAvLyBURVNURE9DOiBCdWcgIzUxMTUgLSBEU19TMURpbXBhY3RfbHIucGRmCisgICAgLy8gYnVpbGQgcGF0aCBkYXRhCisgICAgQ1NraWFfUGF0aERhdGEgcGF0aF9kYXRhOworICAgIHBhdGhfZGF0YS5CdWlsZFBhdGgocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSk7CisgICAgLy8gcGF0aF9kYXRhLm1fUGF0aERhdGEuY2xvc2UoKTsKKyAgICBwYXRoX2RhdGEubV9QYXRoRGF0YS5zZXRGaWxsVHlwZSgoZmlsbF9tb2RlICYgMykgPT0gRlhGSUxMX1dJTkRJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBTa1BhdGg6OmtXaW5kaW5nX0ZpbGxUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU2tQYXRoOjprRXZlbk9kZF9GaWxsVHlwZSk7CiAKLQkJU2tQYWludCBzcGFpbnQ7Ci0JCXNwYWludC5zZXRBbnRpQWxpYXMoVFJVRSk7Ci0JCXNwYWludC5zZXRTdHlsZShTa1BhaW50OjprRmlsbF9TdHlsZSk7Ci0JCXNwYWludC5zZXRDb2xvcihmaWxsX2NvbG9yKTsKLQkJaWYgKCFSZW5kZXJSYXN0ZXJpemVyU2tpYShwYXRoX2RhdGEubV9QYXRoRGF0YSwgc3BhaW50LCByZWN0LCBmaWxsX2NvbG9yLCBmaWxsX21vZGUgJiBGWEZJTExfRlVMTENPVkVSLCBGQUxTRSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSkpCi0JCQlyZXR1cm4gRkFMU0U7CQotCX0KKyAgICBTa1BhaW50IHNwYWludDsKKyAgICBzcGFpbnQuc2V0QW50aUFsaWFzKFRSVUUpOworICAgIHNwYWludC5zZXRTdHlsZShTa1BhaW50OjprRmlsbF9TdHlsZSk7CisgICAgc3BhaW50LnNldENvbG9yKGZpbGxfY29sb3IpOworICAgIGlmICghUmVuZGVyUmFzdGVyaXplclNraWEocGF0aF9kYXRhLm1fUGF0aERhdGEsIHNwYWludCwgcmVjdCwgZmlsbF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfbW9kZSAmIEZYRklMTF9GVUxMQ09WRVIsIEZBTFNFLCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSkpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotCWludCBzdHJva2VfYWxwaGEgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpID8gRlhHRVRGTEFHX0FMUEhBX1NUUk9LRShhbHBoYV9mbGFnKSA6IEZYQVJHQl9BKHN0cm9rZV9jb2xvcik7CisgIGludCBzdHJva2VfYWxwaGEgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpCisgICAgICAgICAgICAgICAgICAgICAgICAgPyBGWEdFVEZMQUdfQUxQSEFfU1RST0tFKGFscGhhX2ZsYWcpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiBGWEFSR0JfQShzdHJva2VfY29sb3IpOwogCi0JaWYgKHBHcmFwaFN0YXRlICYmIHN0cm9rZV9hbHBoYSkgewotCQkvLyBXZSBzcGxpdCB0aGUgbWF0cml4IGludG8gdHdvIHBhcnRzOiBmaXJzdCBwYXJ0IGRvaW5nIHRoZSBzY2FsaW5nLCBzbyB3ZSB3b24ndCBoYXZlIHRoZQotCQkvLyBmbGF0bmVzcyBwcm9ibGVtLCBzZWNvbmQgcGFydCBkb2luZyB0aGUgdHJhbnNmb3JtYXRpb24sIHNvIHdlIGRvbid0IGhhdmUgc3Ryb2tpbmcgZ2VvIHByb2JsZW0uCi0JCS8vIFRFU1RET0M6IEJ1ZyAjNTI1MyAtIHRlc3RbMV0ucGRmIAotCQlDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDEsIG1hdHJpeDI7Ci0JCWlmIChwT2JqZWN0MkRldmljZSkgewotCQkJbWF0cml4MS5hID0gRlhTWVNfZmFicyhwT2JqZWN0MkRldmljZS0+YSkgPiBGWFNZU19mYWJzKHBPYmplY3QyRGV2aWNlLT5iKSA/Ci0JCQkJCUZYU1lTX2ZhYnMocE9iamVjdDJEZXZpY2UtPmEpIDogRlhTWVNfZmFicyhwT2JqZWN0MkRldmljZS0+Yik7Ci0JCQltYXRyaXgxLmQgPSBtYXRyaXgxLmE7Ly9GWFNZU19mYWJzKHBPYmplY3QyRGV2aWNlLT5jKSA+IEZYU1lTX2ZhYnMocE9iamVjdDJEZXZpY2UtPmQpID8KLQkJCQkJLy9wT2JqZWN0MkRldmljZS0+YyA6IHBPYmplY3QyRGV2aWNlLT5kOwotCQkJbWF0cml4Mi5TZXQocE9iamVjdDJEZXZpY2UtPmEvbWF0cml4MS5hLCBwT2JqZWN0MkRldmljZS0+Yi9tYXRyaXgxLmEsIAotCQkJCQlwT2JqZWN0MkRldmljZS0+Yy9tYXRyaXgxLmQsIHBPYmplY3QyRGV2aWNlLT5kL21hdHJpeDEuZCwgCi0JCQkJCXBPYmplY3QyRGV2aWNlLT5lLCBwT2JqZWN0MkRldmljZS0+Zik7Ci0JCX0KLQkJLy8gYnVpbGQgcGF0aCBkYXRhCi0JCUNTa2lhX1BhdGhEYXRhIHBhdGhfZGF0YTsKLQkJcGF0aF9kYXRhLkJ1aWxkUGF0aChwUGF0aERhdGEsICZtYXRyaXgxKTsKLQkJcGF0aF9kYXRhLm1fUGF0aERhdGEuc2V0RmlsbFR5cGUoU2tQYXRoOjprV2luZGluZ19GaWxsVHlwZSk7CisgIGlmIChwR3JhcGhTdGF0ZSAmJiBzdHJva2VfYWxwaGEpIHsKKyAgICAvLyBXZSBzcGxpdCB0aGUgbWF0cml4IGludG8gdHdvIHBhcnRzOiBmaXJzdCBwYXJ0IGRvaW5nIHRoZSBzY2FsaW5nLCBzbyB3ZQorICAgIC8vIHdvbid0IGhhdmUgdGhlCisgICAgLy8gZmxhdG5lc3MgcHJvYmxlbSwgc2Vjb25kIHBhcnQgZG9pbmcgdGhlIHRyYW5zZm9ybWF0aW9uLCBzbyB3ZSBkb24ndCBoYXZlCisgICAgLy8gc3Ryb2tpbmcgZ2VvIHByb2JsZW0uCisgICAgLy8gVEVTVERPQzogQnVnICM1MjUzIC0gdGVzdFsxXS5wZGYKKyAgICBDRlhfTWF0cml4IG1hdHJpeDEsIG1hdHJpeDI7CisgICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7CisgICAgICBtYXRyaXgxLmEgPSBGWFNZU19mYWJzKHBPYmplY3QyRGV2aWNlLT5hKSA+IEZYU1lTX2ZhYnMocE9iamVjdDJEZXZpY2UtPmIpCisgICAgICAgICAgICAgICAgICAgICAgPyBGWFNZU19mYWJzKHBPYmplY3QyRGV2aWNlLT5hKQorICAgICAgICAgICAgICAgICAgICAgIDogRlhTWVNfZmFicyhwT2JqZWN0MkRldmljZS0+Yik7CisgICAgICBtYXRyaXgxLmQgPSBtYXRyaXgxLmE7ICAvLyBGWFNZU19mYWJzKHBPYmplY3QyRGV2aWNlLT5jKSA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGWFNZU19mYWJzKHBPYmplY3QyRGV2aWNlLT5kKSA/CisgICAgICAvLyBwT2JqZWN0MkRldmljZS0+YyA6IHBPYmplY3QyRGV2aWNlLT5kOworICAgICAgbWF0cml4Mi5TZXQocE9iamVjdDJEZXZpY2UtPmEgLyBtYXRyaXgxLmEsIHBPYmplY3QyRGV2aWNlLT5iIC8gbWF0cml4MS5hLAorICAgICAgICAgICAgICAgICAgcE9iamVjdDJEZXZpY2UtPmMgLyBtYXRyaXgxLmQsIHBPYmplY3QyRGV2aWNlLT5kIC8gbWF0cml4MS5kLAorICAgICAgICAgICAgICAgICAgcE9iamVjdDJEZXZpY2UtPmUsIHBPYmplY3QyRGV2aWNlLT5mKTsKKyAgICB9CisgICAgLy8gYnVpbGQgcGF0aCBkYXRhCisgICAgQ1NraWFfUGF0aERhdGEgcGF0aF9kYXRhOworICAgIHBhdGhfZGF0YS5CdWlsZFBhdGgocFBhdGhEYXRhLCAmbWF0cml4MSk7CisgICAgcGF0aF9kYXRhLm1fUGF0aERhdGEuc2V0RmlsbFR5cGUoU2tQYXRoOjprV2luZGluZ19GaWxsVHlwZSk7CiAKLQkJU2tQYWludCBzcGFpbnQ7Ci0JCXNwYWludC5zZXRDb2xvcihzdHJva2VfY29sb3IpOwotCQlzcGFpbnQuc2V0U3R5bGUoU2tQYWludDo6a1N0cm9rZV9TdHlsZSk7Ci0JCXNwYWludC5zZXRBbnRpQWxpYXMoVFJVRSk7Ci0JCVNrUGF0aCBkc3RfcGF0aDsKLQkJU2tSYXN0ZXJpemVTdHJva2Uoc3BhaW50LCAmZHN0X3BhdGgsIHBhdGhfZGF0YS5tX1BhdGhEYXRhLCAmbWF0cml4MiwgcEdyYXBoU3RhdGUsIG1hdHJpeDEuYSwgRkFMU0UsIDApOwotCQlzcGFpbnQuc2V0U3R5bGUoU2tQYWludDo6a0ZpbGxfU3R5bGUpOwotCQlpbnQgZmlsbF9mbGFnID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKTw8OCB8IEZYR0VURkxBR19BTFBIQV9TVFJPS0UoYWxwaGFfZmxhZyk7Ci0JCQotCQlpZiAoIVJlbmRlclJhc3Rlcml6ZXJTa2lhKGRzdF9wYXRoLCBzcGFpbnQsIHJlY3QsIHN0cm9rZV9jb2xvciwgZmlsbF9tb2RlICYgRlhGSUxMX0ZVTExDT1ZFUiwgRkFMU0UsIGZpbGxfZmxhZywgcEljY1RyYW5zZm9ybSwgRkFMU0UpKQotCQkJcmV0dXJuIEZBTFNFOwotCQkJCi0JfQotCQotCXJldHVybiBUUlVFOworICAgIFNrUGFpbnQgc3BhaW50OworICAgIHNwYWludC5zZXRDb2xvcihzdHJva2VfY29sb3IpOworICAgIHNwYWludC5zZXRTdHlsZShTa1BhaW50OjprU3Ryb2tlX1N0eWxlKTsKKyAgICBzcGFpbnQuc2V0QW50aUFsaWFzKFRSVUUpOworICAgIFNrUGF0aCBkc3RfcGF0aDsKKyAgICBTa1Jhc3Rlcml6ZVN0cm9rZShzcGFpbnQsICZkc3RfcGF0aCwgcGF0aF9kYXRhLm1fUGF0aERhdGEsICZtYXRyaXgyLAorICAgICAgICAgICAgICAgICAgICAgIHBHcmFwaFN0YXRlLCBtYXRyaXgxLmEsIEZBTFNFLCAwKTsKKyAgICBzcGFpbnQuc2V0U3R5bGUoU2tQYWludDo6a0ZpbGxfU3R5bGUpOworICAgIGludCBmaWxsX2ZsYWcgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpIDw8IDggfAorICAgICAgICAgICAgICAgICAgICBGWEdFVEZMQUdfQUxQSEFfU1RST0tFKGFscGhhX2ZsYWcpOworCisgICAgaWYgKCFSZW5kZXJSYXN0ZXJpemVyU2tpYShkc3RfcGF0aCwgc3BhaW50LCByZWN0LCBzdHJva2VfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX21vZGUgJiBGWEZJTExfRlVMTENPVkVSLCBGQUxTRSwgZmlsbF9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSwgRkFMU0UpKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlNldFBpeGVsKGludCB4LCBpbnQgeSwgRlhfRFdPUkQgY29sb3IsCi0JCQkJCQlpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLQlyZXR1cm4gbV9wQWdnRHJpdmVyLT5TZXRQaXhlbCh4LCB5LCBjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CitGWF9CT09MIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpTZXRQaXhlbChpbnQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgcmV0dXJuIG1fcEFnZ0RyaXZlci0+U2V0UGl4ZWwoeCwgeSwgY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwogfQogCi1GWF9CT09MIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgZmlsbF9jb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0JcmV0dXJuIG1fcEFnZ0RyaXZlci0+RmlsbFJlY3QocFJlY3QsIGZpbGxfY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOworRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6RmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIHJldHVybiBtX3BBZ2dEcml2ZXItPkZpbGxSZWN0KHBSZWN0LCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKIH0KIAotRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6R2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCkKLXsKLQlyZXR1cm4gbV9wQWdnRHJpdmVyLT5HZXRDbGlwQm94KHBSZWN0KTsKK0ZYX0JPT0wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpIHsKKyAgcmV0dXJuIG1fcEFnZ0RyaXZlci0+R2V0Q2xpcEJveChwUmVjdCk7CiB9CiAKLUZYX0JPT0wJQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBGWF9CT09MIGJERWRnZSkKLXsKLQlyZXR1cm4gbV9wQWdnRHJpdmVyLT5HZXRESUJpdHMocEJpdG1hcCwgbGVmdCwgdG9wLCBwSWNjVHJhbnNmb3JtLCBiREVkZ2UpOworRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6R2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiREVkZ2UpIHsKKyAgcmV0dXJuIG1fcEFnZ0RyaXZlci0+R2V0RElCaXRzKHBCaXRtYXAsIGxlZnQsIHRvcCwgcEljY1RyYW5zZm9ybSwgYkRFZGdlKTsKIH0KIAotRlhfQk9PTAlDRlhfU2tpYURldmljZURyaXZlcjo6U2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGFyZ2IsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGJsZW5kX3R5cGUsIAotCQkJCQkJCQkJICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0JcmV0dXJuIG1fcEFnZ0RyaXZlci0+U2V0RElCaXRzKHBCaXRtYXAsIGFyZ2IsIHBTcmNSZWN0LCBsZWZ0LCB0b3AsIGJsZW5kX3R5cGUsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOworRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6U2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgcmV0dXJuIG1fcEFnZ0RyaXZlci0+U2V0RElCaXRzKHBCaXRtYXAsIGFyZ2IsIHBTcmNSZWN0LCBsZWZ0LCB0b3AsIGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKIH0KIAotRlhfQk9PTAlDRlhfU2tpYURldmljZURyaXZlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBhcmdiLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIAotCQkJCQkJCWludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgRlhfRFdPUkQgZmxhZ3MsIAotCQkJCQkJCWludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotCXJldHVybiBtX3BBZ2dEcml2ZXItPlN0cmV0Y2hESUJpdHMocFNvdXJjZSwgYXJnYiwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgCi0JCQkJCQkJZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIHBDbGlwUmVjdCwgZmxhZ3MsIAotCQkJCQkJCWFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOworRlhfQk9PTCBDRlhfU2tpYURldmljZURyaXZlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIHJldHVybiBtX3BBZ2dEcml2ZXItPlN0cmV0Y2hESUJpdHMocFNvdXJjZSwgYXJnYiwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgcENsaXBSZWN0LCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKIH0KIAotRlhfQk9PTAlDRlhfU2tpYURldmljZURyaXZlcjo6U3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgYXJnYiwgCi0JCQkJCQljb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCByZW5kZXJfZmxhZ3MsIEZYX0xQVk9JRCYgaGFuZGxlLCAKLQkJCQkJCWludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotCXJldHVybiBtX3BBZ2dEcml2ZXItPlN0YXJ0RElCaXRzKHBTb3VyY2UsIGJpdG1hcF9hbHBoYSwgYXJnYiwgCi0JCQkJCQlwTWF0cml4LCByZW5kZXJfZmxhZ3MsIGhhbmRsZSwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CitGWF9CT09MIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgcmVuZGVyX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICByZXR1cm4gbV9wQWdnRHJpdmVyLT5TdGFydERJQml0cyhwU291cmNlLCBiaXRtYXBfYWxwaGEsIGFyZ2IsIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcl9mbGFncywgaGFuZGxlLCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtKTsKIH0KIAotRlhfQk9PTAlDRlhfU2tpYURldmljZURyaXZlcjo6Q29udGludWVESUJpdHMoRlhfTFBWT0lEIHBIYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKQotewotCXJldHVybiBtX3BBZ2dEcml2ZXItPkNvbnRpbnVlRElCaXRzKHBIYW5kbGUsIHBQYXVzZSk7CitGWF9CT09MIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpDb250aW51ZURJQml0cyh2b2lkKiBwSGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSkgeworICByZXR1cm4gbV9wQWdnRHJpdmVyLT5Db250aW51ZURJQml0cyhwSGFuZGxlLCBwUGF1c2UpOwogfQogCi12b2lkIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpDYW5jZWxESUJpdHMoRlhfTFBWT0lEIHBIYW5kbGUpCi17Ci0JbV9wQWdnRHJpdmVyLT5DYW5jZWxESUJpdHMocEhhbmRsZSk7Cit2b2lkIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpDYW5jZWxESUJpdHModm9pZCogcEhhbmRsZSkgeworICBtX3BBZ2dEcml2ZXItPkNhbmNlbERJQml0cyhwSGFuZGxlKTsKIH0KIAotQ0ZYX1NraWFEZXZpY2U6OkNGWF9Ta2lhRGV2aWNlKCkKLXsKLQltX2JPd25lZEJpdG1hcCA9IEZBTFNFOworQ0ZYX1NraWFEZXZpY2U6OkNGWF9Ta2lhRGV2aWNlKCkgeworICBtX2JPd25lZEJpdG1hcCA9IEZBTFNFOwogfQogCi1GWF9CT09MIENGWF9Ta2lhRGV2aWNlOjpBdHRhY2goQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGl0aGVyX2JpdHMsIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciwgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0KQotewotCWlmIChwQml0bWFwID09IE5VTEwpIAotCQlyZXR1cm4gRkFMU0U7Ci0JU2V0Qml0bWFwKHBCaXRtYXApOwotCUNGWF9Ta2lhRGV2aWNlRHJpdmVyKiBwRHJpdmVyID0gbmV3IENGWF9Ta2lhRGV2aWNlRHJpdmVyKHBCaXRtYXAsIGRpdGhlcl9iaXRzLCBiUmdiQnl0ZU9yZGVyLCBwT3JpRGV2aWNlLCBiR3JvdXBLbm9ja291dCk7Ci0JU2V0RGV2aWNlRHJpdmVyKHBEcml2ZXIpOwotCXJldHVybiBUUlVFOworRlhfQk9PTCBDRlhfU2tpYURldmljZTo6QXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGl0aGVyX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJHcm91cEtub2Nrb3V0KSB7CisgIGlmICghcEJpdG1hcCkKKyAgICByZXR1cm4gRkFMU0U7CisgIFNldEJpdG1hcChwQml0bWFwKTsKKyAgQ0ZYX1NraWFEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPSBuZXcgQ0ZYX1NraWFEZXZpY2VEcml2ZXIoCisgICAgICBwQml0bWFwLCBkaXRoZXJfYml0cywgYlJnYkJ5dGVPcmRlciwgcE9yaURldmljZSwgYkdyb3VwS25vY2tvdXQpOworICBTZXREZXZpY2VEcml2ZXIocERyaXZlcik7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIENGWF9Ta2lhRGV2aWNlOjpDcmVhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGWERJQl9Gb3JtYXQgZm9ybWF0LCBpbnQgZGl0aGVyX2JpdHMsIENGWF9ESUJpdG1hcCogcE9yaURldmljZSkKLXsKLQltX2JPd25lZEJpdG1hcCA9IFRSVUU7Ci0JQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsKLQlpZiAoIXBCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpKSB7Ci0JCWRlbGV0ZSBwQml0bWFwOwotCQlyZXR1cm4gRkFMU0U7Ci0JfSAKLQlTZXRCaXRtYXAocEJpdG1hcCk7Ci0JQ0ZYX1NraWFEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPSAgbmV3IENGWF9Ta2lhRGV2aWNlRHJpdmVyKHBCaXRtYXAsIGRpdGhlcl9iaXRzLCBGQUxTRSwgcE9yaURldmljZSwgRkFMU0UpOwotCVNldERldmljZURyaXZlcihwRHJpdmVyKTsKLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgQ0ZYX1NraWFEZXZpY2U6OkNyZWF0ZShpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXRoZXJfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UpIHsKKyAgbV9iT3duZWRCaXRtYXAgPSBUUlVFOworICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOworICBpZiAoIXBCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpKSB7CisgICAgZGVsZXRlIHBCaXRtYXA7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIFNldEJpdG1hcChwQml0bWFwKTsKKyAgQ0ZYX1NraWFEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPQorICAgICAgbmV3IENGWF9Ta2lhRGV2aWNlRHJpdmVyKHBCaXRtYXAsIGRpdGhlcl9iaXRzLCBGQUxTRSwgcE9yaURldmljZSwgRkFMU0UpOworICBTZXREZXZpY2VEcml2ZXIocERyaXZlcik7CisgIHJldHVybiBUUlVFOwogfQotQ0ZYX1NraWFEZXZpY2U6On5DRlhfU2tpYURldmljZSgpCi17Ci0JaWYgKG1fYk93bmVkQml0bWFwICYmIEdldEJpdG1hcCgpKSBkZWxldGUgR2V0Qml0bWFwKCk7CitDRlhfU2tpYURldmljZTo6fkNGWF9Ta2lhRGV2aWNlKCkgeworICBpZiAobV9iT3duZWRCaXRtYXAgJiYgR2V0Qml0bWFwKCkpCisgICAgZGVsZXRlIEdldEJpdG1hcCgpOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2Uvc2tpYS9meF9za2lhX2RldmljZS5oIGIvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfZGV2aWNlLmgKaW5kZXggN2FlMDE5Yy4uMDEzOTYyZCAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfZGV2aWNlLmgKKysrIGIvY29yZS9zcmMvZnhnZS9za2lhL2Z4X3NraWFfZGV2aWNlLmgKQEAgLTYsODUgKzYsMTQxIEBACiAjZGVmaW5lIENPUkVfU1JDX0ZYR0VfU0tJQV9GWF9TS0lBX0RFVklDRV9IXwogCiAjaWYgZGVmaW5lZChfU0tJQV9TVVBQT1JUXykKLWNsYXNzIENGWF9Ta2lhRGV2aWNlRHJpdmVyIDogcHVibGljIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIKLXsKLXB1YmxpYzoKLQlDRlhfU2tpYURldmljZURyaXZlcihDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkaXRoZXJfYml0cywgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyLCBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQpOwotCXZpcnR1YWwgfkNGWF9Ta2lhRGV2aWNlRHJpdmVyKCk7CitjbGFzcyBDRlhfU2tpYURldmljZURyaXZlciA6IHB1YmxpYyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyIHsKKyBwdWJsaWM6CisgIENGWF9Ta2lhRGV2aWNlRHJpdmVyKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpdGhlcl9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZ2JCeXRlT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiR3JvdXBLbm9ja291dCk7CisgIH5DRlhfU2tpYURldmljZURyaXZlcigpIG92ZXJyaWRlOwogCi0JLyoqIE9wdGlvbnMgKi8KLQl2aXJ0dWFsIGludAkJCUdldERldmljZUNhcHMoaW50IGNhcHNfaWQpOwotCQotCS8qKiBTYXZlIGFuZCByZXN0b3JlIGFsbCBncmFwaGljIHN0YXRlcyAqLwotCXZpcnR1YWwgdm9pZAkJU2F2ZVN0YXRlKCk7Ci0JdmlydHVhbCB2b2lkCQlSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkKTsKLQkKLQkvKiogU2V0IGNsaXBwaW5nIHBhdGggdXNpbmcgZmlsbGVkIHJlZ2lvbiAqLwotCXZpcnR1YWwgRlhfQk9PTAkJU2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwJLy8gcGF0aCBpbmZvCi0JCQkJCQkJY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCS8vIG9wdGlvbmFsIHRyYW5zZm9ybWF0aW9uCi0JCQkJCQkJaW50IGZpbGxfbW9kZQkvLyBmaWxsIG1vZGUsIFdJTkRJTkcgb3IgQUxURVJOQVRFCi0JCQkJCQkJKTsKLQkKLQkvKiogU2V0IGNsaXBwaW5nIHBhdGggdXNpbmcgc3Ryb2tlZCByZWdpb24gKi8KLQl2aXJ0dWFsIEZYX0JPT0wJCVNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwJLy8gcGF0aCBpbmZvCi0JCQkJCQkJY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCS8vIG9wdGlvbmFsIHRyYW5zZm9ybWF0aW9uCi0JCQkJCQkJY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZQkvLyBncmFwaGljIHN0YXRlLCBmb3IgcGVuIGF0dHJpYnV0ZXMKLQkJCQkJCQkpOwotCQotCS8qKiBEcmF3IGEgcGF0aCAqLwotCXZpcnR1YWwgRlhfQk9PTAkJRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCi0JCQkJCQljb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLQkJCQkJCWNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCi0JCQkJCQlGWF9EV09SRCBmaWxsX2NvbG9yLAotCQkJCQkJRlhfRFdPUkQgc3Ryb2tlX2NvbG9yLAotCQkJCQkJaW50IGZpbGxfbW9kZSwKLQkJCQkJCWludCBhbHBoYV9mbGFnID0gMCwgCi0JCQkJCQl2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTAotCQkJCQkJCSk7Ci0JCi0JdmlydHVhbCBGWF9CT09MCQlTZXRQaXhlbChpbnQgeCwgaW50IHksIEZYX0RXT1JEIGNvbG9yLAotCQkJCQkJaW50IGFscGhhX2ZsYWcgPSAwLCB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7Ci0JCi0JdmlydHVhbCBGWF9CT09MCQlGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgZmlsbF9jb2xvciwgCi0JCQkJCQlpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKLQkKLQkvKiogRHJhdyBhIHNpbmdsZSBwaXhlbCAoZGV2aWNlIGRlcGVuZGFudCkgbGluZSAqLwotCXZpcnR1YWwgRlhfQk9PTAkJRHJhd0Nvc21ldGljTGluZShGWF9GSVhGTE9BVCB4MSwgRlhfRklYRkxPQVQgeTEsIEZYX0ZJWEZMT0FUIHgyLCBGWF9GSVhGTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsIAotCQkJCQkJCWludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkgeyByZXR1cm4gRkFMU0U7IH0KLQkKLQl2aXJ0dWFsIEZYX0JPT0wJCUdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpOwotCQotCS8qKiBMb2FkIGRldmljZSBidWZmZXIgaW50byBhIERJQiAqLwotCXZpcnR1YWwgRlhfQk9PTAkJR2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLCBGWF9CT09MIGJERWRnZSA9IEZBTFNFKTsKKyAgLyoqIE9wdGlvbnMgKi8KKyAgdmlydHVhbCBpbnQgR2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCk7CiAKLQl2aXJ0dWFsIENGWF9ESUJpdG1hcCogICBHZXRCYWNrRHJvcCgpIHsgcmV0dXJuIG1fcEFnZ0RyaXZlci0+R2V0QmFja0Ryb3AoKTsgfQotCQotCXZpcnR1YWwgRlhfQk9PTAkJU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgCi0JCQkJCQlpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsIGludCBibGVuZF90eXBlLCAKLQkJCQkJCWludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwotCXZpcnR1YWwgRlhfQk9PTAkJU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLCAKLQkJCQlpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIEZYX0RXT1JEIGZsYWdzLCAKLQkJCQlpbnQgYWxwaGFfZmxhZyA9IDAsIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKLQkKLQl2aXJ0dWFsIEZYX0JPT0wJCVN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLCAKLQkJCQljb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBmbGFncywgRlhfTFBWT0lEJiBoYW5kbGUsIAotCQkJCWludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwotCXZpcnR1YWwgRlhfQk9PTAkJQ29udGludWVESUJpdHMoRlhfTFBWT0lEIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpOwotCXZpcnR1YWwgdm9pZAkJQ2FuY2VsRElCaXRzKEZYX0xQVk9JRCBoYW5kbGUpOwotCQotCXZpcnR1YWwgRlhfQk9PTCAgICAgRHJhd0RldmljZVRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCi0JCQkJCQlDRlhfRm9udENhY2hlKiBwQ2FjaGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLCBGWF9GSVhGTE9BVCBmb250X3NpemUsIEZYX0RXT1JEIGNvbG9yLCAKLQkJCQkJCWludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOwotCQotCXZpcnR1YWwgRlhfQk9PTAkJUmVuZGVyUmFzdGVyaXplcihyYXN0ZXJpemVyX3NjYW5saW5lX2FhJiByYXN0ZXJpemVyLCBGWF9EV09SRCBjb2xvciwgRlhfQk9PTCBiRnVsbENvdmVyLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0LCAKLQkJCQkJCQlpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0JdmlydHVhbCBGWF9CT09MCQlSZW5kZXJSYXN0ZXJpemVyU2tpYShTa1BhdGgmIHNrUGF0aCwgY29uc3QgU2tQYWludCYgb3JpZ1BhaW50LCBTa0lSZWN0JiByZWN0LCBGWF9EV09SRCBjb2xvciwgRlhfQk9PTCBiRnVsbENvdmVyLCBGWF9CT09MIGJHcm91cEtub2Nrb3V0LCAKLQkJCQkJCQlpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgRlhfQk9PTCBiRmlsbCA9IFRSVUUpOwotCXZvaWQJCQkJU2V0Q2xpcE1hc2socmFzdGVyaXplcl9zY2FubGluZV9hYSYgcmFzdGVyaXplcik7Ci0Jdm9pZAkJCQlTZXRDbGlwTWFzayhTa1BhdGgmIHNrUGF0aCwgU2tQYWludCogc3BhaW50KTsKLQl2aXJ0dWFsCUZYX0xQQllURQlHZXRCdWZmZXIoKSBjb25zdCB7cmV0dXJuIG1fcEFnZ0RyaXZlci0+R2V0QnVmZmVyKCk7fQorICAvKiogU2F2ZSBhbmQgcmVzdG9yZSBhbGwgZ3JhcGhpYyBzdGF0ZXMgKi8KKyAgdmlydHVhbCB2b2lkIFNhdmVTdGF0ZSgpOworICB2aXJ0dWFsIHZvaWQgUmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCk7CiAKLQlDRlhfQWdnRGV2aWNlRHJpdmVyKiBtX3BBZ2dEcml2ZXI7CisgIC8qKiBTZXQgY2xpcHBpbmcgcGF0aCB1c2luZyBmaWxsZWQgcmVnaW9uICovCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRDbGlwX1BhdGhGaWxsKAorICAgICAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsICAgICAvLyBwYXRoIGluZm8KKyAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLCAgLy8gb3B0aW9uYWwgdHJhbnNmb3JtYXRpb24KKyAgICAgIGludCBmaWxsX21vZGUgICAgICAgICAgICAgICAgICAgICAgLy8gZmlsbCBtb2RlLCBXSU5ESU5HIG9yIEFMVEVSTkFURQorICAgICAgKTsKKworICAvKiogU2V0IGNsaXBwaW5nIHBhdGggdXNpbmcgc3Ryb2tlZCByZWdpb24gKi8KKyAgdmlydHVhbCBGWF9CT09MIFNldENsaXBfUGF0aFN0cm9rZSgKKyAgICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLCAgICAgLy8gcGF0aCBpbmZvCisgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwgIC8vIG9wdGlvbmFsIHRyYW5zZm9ybWF0aW9uCisgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqCisgICAgICAgICAgcEdyYXBoU3RhdGUgIC8vIGdyYXBoaWMgc3RhdGUsIGZvciBwZW4gYXR0cmlidXRlcworICAgICAgKTsKKworICAvKiogRHJhdyBhIHBhdGggKi8KKyAgdmlydHVhbCBGWF9CT09MIERyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0cm9rZV9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CisKKyAgdmlydHVhbCBGWF9CT09MIFNldFBpeGVsKGludCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKworICB2aXJ0dWFsIEZYX0JPT0wgRmlsbFJlY3QoY29uc3QgRlhfUkVDVCogcFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOworCisgIC8qKiBEcmF3IGEgc2luZ2xlIHBpeGVsIChkZXZpY2UgZGVwZW5kYW50KSBsaW5lICovCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3Q29zbWV0aWNMaW5lKEZYX0ZJWEZMT0FUIHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSVhGTE9BVCB5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklYRkxPQVQgeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJWEZMT0FUIHkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgdmlydHVhbCBGWF9CT09MIEdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpOworCisgIC8qKiBMb2FkIGRldmljZSBidWZmZXIgaW50byBhIERJQiAqLworICB2aXJ0dWFsIEZYX0JPT0wgR2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRFZGdlID0gRkFMU0UpOworCisgIHZpcnR1YWwgQ0ZYX0RJQml0bWFwKiBHZXRCYWNrRHJvcCgpIHsgcmV0dXJuIG1fcEFnZ0RyaXZlci0+R2V0QmFja0Ryb3AoKTsgfQorCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwpOworICB2aXJ0dWFsIEZYX0JPT0wgU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKworICB2aXJ0dWFsIEZYX0JPT0wgU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCk7CisgIHZpcnR1YWwgRlhfQk9PTCBDb250aW51ZURJQml0cyh2b2lkKiBoYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgdmlydHVhbCB2b2lkIENhbmNlbERJQml0cyh2b2lkKiBoYW5kbGUpOworCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSVhGTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBOVUxMKTsKKworICB2aXJ0dWFsIEZYX0JPT0wgUmVuZGVyUmFzdGVyaXplcihyYXN0ZXJpemVyX3NjYW5saW5lX2FhJiByYXN0ZXJpemVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRnVsbENvdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJHcm91cEtub2Nrb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSk7CisgIHZpcnR1YWwgRlhfQk9PTCBSZW5kZXJSYXN0ZXJpemVyU2tpYShTa1BhdGgmIHNrUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNrUGFpbnQmIG9yaWdQYWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrSVJlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZ1bGxDb3ZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkdyb3VwS25vY2tvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGaWxsID0gVFJVRSk7CisgIHZvaWQgU2V0Q2xpcE1hc2socmFzdGVyaXplcl9zY2FubGluZV9hYSYgcmFzdGVyaXplcik7CisgIHZvaWQgU2V0Q2xpcE1hc2soU2tQYXRoJiBza1BhdGgsIFNrUGFpbnQqIHNwYWludCk7CisgIHZpcnR1YWwgdWludDhfdCogR2V0QnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbV9wQWdnRHJpdmVyLT5HZXRCdWZmZXIoKTsgfQorCisgIENGWF9BZ2dEZXZpY2VEcml2ZXIqIG1fcEFnZ0RyaXZlcjsKIH07CiAjZW5kaWYgIC8vIGRlZmluZWQoX1NLSUFfU1VQUE9SVF8pCiAKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZHdyaXRlX2ludC5oIGIvY29yZS9zcmMvZnhnZS93aW4zMi9kd3JpdGVfaW50LmgKaW5kZXggZDk1ZjExNS4uMjA2Y2RmNSAxMDA2NDQKLS0tIGEvY29yZS9zcmMvZnhnZS93aW4zMi9kd3JpdGVfaW50LmgKKysrIGIvY29yZS9zcmMvZnhnZS93aW4zMi9kd3JpdGVfaW50LmgKQEAgLTEsNjEgKzEsNjYgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBDT1JFX1NSQ19GWEdFX1dJTjMyX0RXUklURV9JTlRfSF8KICNkZWZpbmUgQ09SRV9TUkNfRlhHRV9XSU4zMl9EV1JJVEVfSU5UX0hfCiAKICNpZm5kZWYgREVDTFNQRUNfVVVJRAotI2lmIChfTVNDX1ZFUiA+PSAxMTAwKSAmJiBkZWZpbmVkIChfX2NwbHVzcGx1cykKLSNkZWZpbmUgREVDTFNQRUNfVVVJRCh4KSAgICBfX2RlY2xzcGVjKHV1aWQoeCkpCisjaWYgKF9NU0NfVkVSID49IDExMDApICYmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIERFQ0xTUEVDX1VVSUQoeCkgX19kZWNsc3BlYyh1dWlkKHgpKQogI2Vsc2UKICNkZWZpbmUgREVDTFNQRUNfVVVJRCh4KQogI2VuZGlmCiAjZW5kaWYKICNpZm5kZWYgREVDTFNQRUNfTk9WVEFCTEUKICNpZiAoX01TQ19WRVIgPj0gMTEwMCkgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKLSNkZWZpbmUgREVDTFNQRUNfTk9WVEFCTEUgICBfX2RlY2xzcGVjKG5vdnRhYmxlKQorI2RlZmluZSBERUNMU1BFQ19OT1ZUQUJMRSBfX2RlY2xzcGVjKG5vdnRhYmxlKQogI2Vsc2UKICNkZWZpbmUgREVDTFNQRUNfTk9WVEFCTEUKICNlbmRpZgogI2VuZGlmCi0jaWYoV0lOVkVSIDwgMHgwNTAwKQorI2lmIChXSU5WRVIgPCAweDA1MDApCiAjaWZuZGVmIF9NQUMKIERFQ0xBUkVfSEFORExFKEhNT05JVE9SKTsKICNlbmRpZgogI2VuZGlmCi1jbGFzcyBDRFdyaXRlRXh0Ci17Ci1wdWJsaWM6Ci0gICAgQ0RXcml0ZUV4dCgpOwotICAgIH5DRFdyaXRlRXh0KCk7CitjbGFzcyBDRFdyaXRlRXh0IHsKKyBwdWJsaWM6CisgIENEV3JpdGVFeHQoKTsKKyAgfkNEV3JpdGVFeHQoKTsKIAotICAgIHZvaWQJCQlMb2FkKCk7Ci0gICAgdm9pZCAgICAgICAgICAgIFVubG9hZCgpOworICB2b2lkIExvYWQoKTsKKyAgdm9pZCBVbmxvYWQoKTsKIAotICAgIEZYX0JPT0wJCQlJc0F2YWlsYWJsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wRFdyaXRlRmFjdG9yeSAhPSBOVUxMOwotICAgIH0KKyAgRlhfQk9PTCBJc0F2YWlsYWJsZSgpIHsgcmV0dXJuIG1fcERXcml0ZUZhY3RvcnkgIT0gTlVMTDsgfQogCi0gICAgdm9pZCoJCQlEd0NyZWF0ZUZvbnRGYWNlRnJvbVN0cmVhbShGWF9MUEJZVEUgcERhdGEsIEZYX0RXT1JEIHNpemUsIGludCBzaW11bGF0aW9uX3N0eWxlKTsKLSAgICBGWF9CT09MICAgICAgICAgRHdDcmVhdGVSZW5kZXJpbmdUYXJnZXQoQ0ZYX0RJQml0bWFwKiBwU3JjLCB2b2lkKiogcmVuZGVyVGFyZ2V0KTsKLSAgICB2b2lkICAgICAgICAgICAgRHdEZWxldGVSZW5kZXJpbmdUYXJnZXQodm9pZCogcmVuZGVyVGFyZ2V0KTsKLSAgICBGWF9CT09MCQkJRHdSZW5kaW5nU3RyaW5nKHZvaWQqIHJlbmRlclRhcmdldCwgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLCBGWF9SRUNUJiBzdHJpbmdSZWN0LCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZm9udCwgRlhfRkxPQVQgZm9udF9zaXplLCBGWF9BUkdCIHRleHRfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ2x5cGhfY291bnQsIHVuc2lnbmVkIHNob3J0KiBnbHlwaF9pbmRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYmFzZWxpbmVPcmlnaW5YLCBGWF9GTE9BVCBiYXNlbGluZU9yaWdpblksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBnbHlwaF9vZmZzZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIGdseXBoX2FkdmFuY2VzKTsKLSAgICB2b2lkCQkJRHdEZWxldGVGb250KHZvaWQqIHBGb250KTsKKyAgdm9pZCogRHdDcmVhdGVGb250RmFjZUZyb21TdHJlYW0odWludDhfdCogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaW11bGF0aW9uX3N0eWxlKTsKKyAgRlhfQk9PTCBEd0NyZWF0ZVJlbmRlcmluZ1RhcmdldChDRlhfRElCaXRtYXAqIHBTcmMsIHZvaWQqKiByZW5kZXJUYXJnZXQpOworICB2b2lkIER3RGVsZXRlUmVuZGVyaW5nVGFyZ2V0KHZvaWQqIHJlbmRlclRhcmdldCk7CisgIEZYX0JPT0wgRHdSZW5kaW5nU3RyaW5nKHZvaWQqIHJlbmRlclRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9SRUNUJiBzdHJpbmdSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBmb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgdGV4dF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdseXBoX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCogZ2x5cGhfaW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYmFzZWxpbmVPcmlnaW5YLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBiYXNlbGluZU9yaWdpblksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGdseXBoX29mZnNldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBnbHlwaF9hZHZhbmNlcyk7CisgIHZvaWQgRHdEZWxldGVGb250KHZvaWQqIHBGb250KTsKIAotcHJvdGVjdGVkOgotICAgIHZvaWQqCQkJbV9oTW9kdWxlOwotICAgIHZvaWQqCQkJbV9wRFdyaXRlRmFjdG9yeTsKLSAgICB2b2lkKgkJICAgIG1fcER3Rm9udENvbnRleHQ7Ci0gICAgdm9pZCoJICAgICAgICBtX3BEd1RleHRSZW5kZXJlcjsKKyBwcm90ZWN0ZWQ6CisgIHZvaWQqIG1faE1vZHVsZTsKKyAgdm9pZCogbV9wRFdyaXRlRmFjdG9yeTsKKyAgdm9pZCogbV9wRHdGb250Q29udGV4dDsKKyAgdm9pZCogbV9wRHdUZXh0UmVuZGVyZXI7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfU1JDX0ZYR0VfV0lOMzJfRFdSSVRFX0lOVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9kZXZpY2UuY3BwIGIvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9kZXZpY2UuY3BwCmluZGV4IDA3MTdmYjEuLmMzNDZkMWIgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZGV2aWNlLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX2RldmljZS5jcHAKQEAgLTEsMTcwICsxLDE4MyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGdlL2Z4X2dlLmgiCi0jaWYgX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lONjRfCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGdlL2Z4X2dlX3dpbjMyLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKKworI2lmIF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjY0X0RFU0tUT1BfCiAjaW5jbHVkZSA8Y3J0ZGJnLmg+Ci0jaW5jbHVkZSAiLi4vYWdnL2luY2x1ZGUvZnhmeF9hZ2dfY2xpcF9saWFuZ19iYXJza3kuaCIKKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9nZV93aW4zMi5oIgorI2luY2x1ZGUgImNvcmUvc3JjL2Z4Z2UvYWdnL2luY2x1ZGUvZnhfYWdnX2RyaXZlci5oIgorI2luY2x1ZGUgImNvcmUvc3JjL2Z4Z2UvZGliL2RpYl9pbnQuaCIKKyNpbmNsdWRlICJjb3JlL3NyYy9meGdlL2dlL3RleHRfaW50LmgiCiAjaW5jbHVkZSAiZHdyaXRlX2ludC5oIgogI2luY2x1ZGUgIndpbjMyX2ludC5oIgotI2luY2x1ZGUgIi4uL2dlL3RleHRfaW50LmgiCi0jaW5jbHVkZSAiLi4vZGliL2RpYl9pbnQuaCIKLSNpbmNsdWRlICIuLi9hZ2cvaW5jbHVkZS9meF9hZ2dfZHJpdmVyLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGdlL2Z4X2ZyZWV0eXBlLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCi1jbGFzcyBDV2luMzJGb250SW5mbyBGWF9GSU5BTCA6IHB1YmxpYyBJRlhfU3lzdGVtRm9udEluZm8KLXsKLXB1YmxpYzoKLSAgICBDV2luMzJGb250SW5mbygpOwotICAgIH5DV2luMzJGb250SW5mbygpOwotICAgIHZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpOwotICAgIHZpcnR1YWwJRlhfQk9PTAkJRW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKTsKLSAgICB2aXJ0dWFsIHZvaWQqCQlNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIEZYX0xQQ1NUUiBmYWNlLCBGWF9CT09MJiBiRXhhY3QpOwotICAgIHZpcnR1YWwgdm9pZCoJCUdldEZvbnQoRlhfTFBDU1RSIGZhY2UpCi0gICAgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdmlydHVhbCBGWF9EV09SRAlHZXRGb250RGF0YSh2b2lkKiBoRm9udCwgRlhfRFdPUkQgdGFibGUsIEZYX0xQQllURSBidWZmZXIsIEZYX0RXT1JEIHNpemUpOwotICAgIHZpcnR1YWwgdm9pZAkJRGVsZXRlRm9udCh2b2lkKiBoRm9udCk7Ci0gICAgdmlydHVhbAlGWF9CT09MCQlHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJR2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCk7Ci0gICAgRlhfQk9PTAkJCQlJc09wZW5UeXBlRnJvbURpdihjb25zdCBMT0dGT05UQSAqcGxmKTsKLSAgICBGWF9CT09MCQkJCUlzU3VwcG9ydEZvbnRGb3JtRGl2KGNvbnN0IExPR0ZPTlRBKiBwbGYpOwotICAgIHZvaWQJCQkJQWRkSW5zdGFsbGVkRm9udChjb25zdCBMT0dGT05UQSAqcGxmLCBGWF9EV09SRCBGb250VHlwZSk7Ci0gICAgdm9pZAkJCQlHZXRHQlByZWZlcmVuY2UoQ0ZYX0J5dGVTdHJpbmcmIGZhY2UsIGludCB3ZWlnaHQsIGludCBwaWN0aF9mYW1pbHkpOwotICAgIHZvaWQJCQkJR2V0SmFwYW5lc2VQcmVmZXJlbmNlKENGWF9CeXRlU3RyaW5nJiBmYWNlLCBpbnQgd2VpZ2h0LCBpbnQgcGljdGhfZmFtaWx5KTsKLSAgICBDRlhfQnl0ZVN0cmluZwkJRmluZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOwotICAgIEhEQwkJCQkJbV9oREM7Ci0gICAgQ0ZYX0ZvbnRNYXBwZXIqCQltX3BNYXBwZXI7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcJCW1fTGFzdEZhbWlseTsKLSAgICBDRlhfQnl0ZVN0cmluZwkJbV9LYWlUaSwgbV9GYW5nU29uZzsKKworY2xhc3MgQ0ZYX1dpbjMyRmFsbGJhY2tGb250SW5mbyBmaW5hbCA6IHB1YmxpYyBDRlhfRm9sZGVyRm9udEluZm8geworIHB1YmxpYzoKKyAgdm9pZCogTWFwRm9udChpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgIEZYX0JPT0wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfZmFtaWx5LAorICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwKKyAgICAgICAgICAgICAgICBpbnQmIGlFeGFjdCkgb3ZlcnJpZGU7CiB9OwotQ1dpbjMyRm9udEluZm86OkNXaW4zMkZvbnRJbmZvKCkKLXsKLSAgICBtX2hEQyA9IENyZWF0ZUNvbXBhdGlibGVEQyhOVUxMKTsKK2NsYXNzIENGWF9XaW4zMkZvbnRJbmZvIGZpbmFsIDogcHVibGljIElGWF9TeXN0ZW1Gb250SW5mbyB7CisgcHVibGljOgorICBDRlhfV2luMzJGb250SW5mbygpOworICB+Q0ZYX1dpbjMyRm9udEluZm8oKSBvdmVycmlkZTsKKworICAvLyBJRlhfU3lzdGVtRm9udEluZm8KKyAgdm9pZCBSZWxlYXNlKCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgRW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKSBvdmVycmlkZTsKKyAgdm9pZCogTWFwRm9udChpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgIEZYX0JPT0wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfZmFtaWx5LAorICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGZhY2UsCisgICAgICAgICAgICAgICAgaW50JiBpRXhhY3QpIG92ZXJyaWRlOworICB2b2lkKiBHZXRGb250KGNvbnN0IEZYX0NIQVIqIGZhY2UpIG92ZXJyaWRlIHsgcmV0dXJuIE5VTEw7IH0KKyAgRlhfRFdPUkQgR2V0Rm9udERhdGEodm9pZCogaEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHNpemUpIG92ZXJyaWRlOworICBGWF9CT09MIEdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgR2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCkgb3ZlcnJpZGU7CisgIHZvaWQgRGVsZXRlRm9udCh2b2lkKiBoRm9udCkgb3ZlcnJpZGU7CisKKyAgRlhfQk9PTCBJc09wZW5UeXBlRnJvbURpdihjb25zdCBMT0dGT05UQSogcGxmKTsKKyAgRlhfQk9PTCBJc1N1cHBvcnRGb250Rm9ybURpdihjb25zdCBMT0dGT05UQSogcGxmKTsKKyAgdm9pZCBBZGRJbnN0YWxsZWRGb250KGNvbnN0IExPR0ZPTlRBKiBwbGYsIEZYX0RXT1JEIEZvbnRUeXBlKTsKKyAgdm9pZCBHZXRHQlByZWZlcmVuY2UoQ0ZYX0J5dGVTdHJpbmcmIGZhY2UsIGludCB3ZWlnaHQsIGludCBwaWN0aF9mYW1pbHkpOworICB2b2lkIEdldEphcGFuZXNlUHJlZmVyZW5jZShDRlhfQnl0ZVN0cmluZyYgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpY3RoX2ZhbWlseSk7CisgIENGWF9CeXRlU3RyaW5nIEZpbmRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKTsKKyAgSERDIG1faERDOworICBDRlhfRm9udE1hcHBlciogbV9wTWFwcGVyOworICBDRlhfQnl0ZVN0cmluZyBtX0xhc3RGYW1pbHk7CisgIENGWF9CeXRlU3RyaW5nIG1fS2FpVGksIG1fRmFuZ1Nvbmc7Cit9OworCitDRlhfV2luMzJGb250SW5mbzo6Q0ZYX1dpbjMyRm9udEluZm8oKSB7CisgIG1faERDID0gQ3JlYXRlQ29tcGF0aWJsZURDKE5VTEwpOwogfQotQ1dpbjMyRm9udEluZm86On5DV2luMzJGb250SW5mbygpCi17Ci0gICAgbV9wTWFwcGVyID0gTlVMTDsKK0NGWF9XaW4zMkZvbnRJbmZvOjp+Q0ZYX1dpbjMyRm9udEluZm8oKSB7CisgIG1fcE1hcHBlciA9IE5VTEw7CiB9Ci12b2lkIENXaW4zMkZvbnRJbmZvOjpSZWxlYXNlKCkKLXsKLSAgICBEZWxldGVEQyhtX2hEQyk7Ci0gICAgZGVsZXRlIHRoaXM7Cit2b2lkIENGWF9XaW4zMkZvbnRJbmZvOjpSZWxlYXNlKCkgeworICBEZWxldGVEQyhtX2hEQyk7CisgIGRlbGV0ZSB0aGlzOwogfQotI2RlZmluZSBUVF9NQUtFX1RBRyh4MSwgeDIsIHgzLCB4NCkgKCgoRlhfRFdPUkQpeDE8PDI0KXwoKEZYX0RXT1JEKXgyPDwxNil8KChGWF9EV09SRCl4Mzw8OCl8KEZYX0RXT1JEKXg0KQotRlhfQk9PTCBDV2luMzJGb250SW5mbzo6SXNPcGVuVHlwZUZyb21EaXYoY29uc3QgTE9HRk9OVEEgKnBsZikKLXsKLSAgICBIRk9OVCBoRm9udCA9IENyZWF0ZUZvbnRJbmRpcmVjdEEocGxmKTsKLSAgICBGWF9CT09MIHJldCA9IEZBTFNFOwotICAgIEZYX0RXT1JEIGZvbnRfc2l6ZSAgPSBHZXRGb250RGF0YShoRm9udCwgMCwgTlVMTCwgMCk7Ci0gICAgaWYgKGZvbnRfc2l6ZSAhPSBHRElfRVJST1IgJiYgZm9udF9zaXplID49IHNpemVvZihGWF9EV09SRCkpIHsKLSAgICAgICAgRlhfRFdPUkQgbFZlcnNpb24gPSAwOwotICAgICAgICBHZXRGb250RGF0YShoRm9udCwgMCwgKEZYX0JZVEUqKSgmbFZlcnNpb24pLCBzaXplb2YoRlhfRFdPUkQpKTsKLSAgICAgICAgbFZlcnNpb24gPSAoKChGWF9EV09SRCkoRlhfQllURSkobFZlcnNpb24pKSA8PCAyNCkgfCAoKEZYX0RXT1JEKSgoRlhfQllURSkobFZlcnNpb24gPj4gOCkpKSA8PCAxNiB8Ci0gICAgICAgICAgICAgICAgICAgKChGWF9EV09SRCkoKEZYX0JZVEUpKGxWZXJzaW9uID4+IDE2KSkpIDw8IDggfCAoKEZYX0JZVEUpKGxWZXJzaW9uID4+IDI0KSk7Ci0gICAgICAgIGlmIChsVmVyc2lvbiA9PSBUVF9NQUtFX1RBRygnTycsICdUJywgJ1QnLCAnTycpIHx8Ci0gICAgICAgICAgICAgICAgbFZlcnNpb24gPT0gMHgwMDAxMDAwMCB8fAotICAgICAgICAgICAgICAgIGxWZXJzaW9uID09IFRUX01BS0VfVEFHKCd0JywgJ3QnLCAnYycsICdmJykgfHwKLSAgICAgICAgICAgICAgICBsVmVyc2lvbiA9PSBUVF9NQUtFX1RBRygndCcsICdyJywgJ3UnLCAnZScpIHx8Ci0gICAgICAgICAgICAgICAgbFZlcnNpb24gPT0gMHgwMDAyMDAwMCkgewotICAgICAgICAgICAgcmV0ID0gVFJVRTsKLSAgICAgICAgfQorI2RlZmluZSBUVF9NQUtFX1RBRyh4MSwgeDIsIHgzLCB4NCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKEZYX0RXT1JEKXgxIDw8IDI0KSB8ICgoRlhfRFdPUkQpeDIgPDwgMTYpIHwgKChGWF9EV09SRCl4MyA8PCA4KSB8IFwKKyAgIChGWF9EV09SRCl4NCkKK0ZYX0JPT0wgQ0ZYX1dpbjMyRm9udEluZm86OklzT3BlblR5cGVGcm9tRGl2KGNvbnN0IExPR0ZPTlRBKiBwbGYpIHsKKyAgSEZPTlQgaEZvbnQgPSBDcmVhdGVGb250SW5kaXJlY3RBKHBsZik7CisgIEZYX0JPT0wgcmV0ID0gRkFMU0U7CisgIEZYX0RXT1JEIGZvbnRfc2l6ZSA9IEdldEZvbnREYXRhKGhGb250LCAwLCBOVUxMLCAwKTsKKyAgaWYgKGZvbnRfc2l6ZSAhPSBHRElfRVJST1IgJiYgZm9udF9zaXplID49IHNpemVvZihGWF9EV09SRCkpIHsKKyAgICBGWF9EV09SRCBsVmVyc2lvbiA9IDA7CisgICAgR2V0Rm9udERhdGEoaEZvbnQsIDAsICh1aW50OF90KikoJmxWZXJzaW9uKSwgc2l6ZW9mKEZYX0RXT1JEKSk7CisgICAgbFZlcnNpb24gPSAoKChGWF9EV09SRCkodWludDhfdCkobFZlcnNpb24pKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgKChGWF9EV09SRCkoKHVpbnQ4X3QpKGxWZXJzaW9uID4+IDgpKSkgPDwgMTYgfAorICAgICAgICAgICAgICAgKChGWF9EV09SRCkoKHVpbnQ4X3QpKGxWZXJzaW9uID4+IDE2KSkpIDw8IDggfAorICAgICAgICAgICAgICAgKCh1aW50OF90KShsVmVyc2lvbiA+PiAyNCkpOworICAgIGlmIChsVmVyc2lvbiA9PSBUVF9NQUtFX1RBRygnTycsICdUJywgJ1QnLCAnTycpIHx8IGxWZXJzaW9uID09IDB4MDAwMTAwMDAgfHwKKyAgICAgICAgbFZlcnNpb24gPT0gVFRfTUFLRV9UQUcoJ3QnLCAndCcsICdjJywgJ2YnKSB8fAorICAgICAgICBsVmVyc2lvbiA9PSBUVF9NQUtFX1RBRygndCcsICdyJywgJ3UnLCAnZScpIHx8IGxWZXJzaW9uID09IDB4MDAwMjAwMDApIHsKKyAgICAgIHJldCA9IFRSVUU7CiAgICAgfQotICAgIERlbGV0ZUZvbnQoaEZvbnQpOwotICAgIHJldHVybiByZXQ7CisgIH0KKyAgRGVsZXRlRm9udChoRm9udCk7CisgIHJldHVybiByZXQ7CiB9Ci1GWF9CT09MIENXaW4zMkZvbnRJbmZvOjpJc1N1cHBvcnRGb250Rm9ybURpdihjb25zdCBMT0dGT05UQSogcGxmKQotewotICAgIEhGT05UIGhGb250ID0gQ3JlYXRlRm9udEluZGlyZWN0QShwbGYpOwotICAgIEZYX0JPT0wgcmV0ID0gRkFMU0U7Ci0gICAgRlhfRFdPUkQgZm9udF9zaXplICA9IEdldEZvbnREYXRhKGhGb250LCAwLCBOVUxMLCAwKTsKLSAgICBpZiAoZm9udF9zaXplICE9IEdESV9FUlJPUiAmJiBmb250X3NpemUgPj0gc2l6ZW9mKEZYX0RXT1JEKSkgewotICAgICAgICBGWF9EV09SRCBsVmVyc2lvbiA9IDA7Ci0gICAgICAgIEdldEZvbnREYXRhKGhGb250LCAwLCAoRlhfQllURSopKCZsVmVyc2lvbiksIHNpemVvZihGWF9EV09SRCkpOwotICAgICAgICBsVmVyc2lvbiA9ICgoKEZYX0RXT1JEKShGWF9CWVRFKShsVmVyc2lvbikpIDw8IDI0KSB8ICgoRlhfRFdPUkQpKChGWF9CWVRFKShsVmVyc2lvbiA+PiA4KSkpIDw8IDE2IHwKLSAgICAgICAgICAgICAgICAgICAoKEZYX0RXT1JEKSgoRlhfQllURSkobFZlcnNpb24gPj4gMTYpKSkgPDwgOCB8ICgoRlhfQllURSkobFZlcnNpb24gPj4gMjQpKTsKLSAgICAgICAgaWYgKGxWZXJzaW9uID09IFRUX01BS0VfVEFHKCdPJywgJ1QnLCAnVCcsICdPJykgfHwKLSAgICAgICAgICAgICAgICBsVmVyc2lvbiA9PSAweDAwMDEwMDAwIHx8Ci0gICAgICAgICAgICAgICAgbFZlcnNpb24gPT0gVFRfTUFLRV9UQUcoJ3QnLCAndCcsICdjJywgJ2YnKSB8fAotICAgICAgICAgICAgICAgIGxWZXJzaW9uID09IFRUX01BS0VfVEFHKCd0JywgJ3InLCAndScsICdlJykgfHwKLSAgICAgICAgICAgICAgICBsVmVyc2lvbiA9PSAweDAwMDIwMDAwKSB7Ci0gICAgICAgICAgICByZXQgPSBUUlVFOwotICAgICAgICB9IGVsc2UgaWYgKChsVmVyc2lvbiAmIDB4RkZGRjAwMDApID09IFRUX01BS0VfVEFHKDB4ODAsIDB4MDEsIDB4MDAsIDB4MDApIHx8Ci0gICAgICAgICAgICAgICAgICAgKGxWZXJzaW9uICYgMHhGRkZGMDAwMCkgPT0gVFRfTUFLRV9UQUcoJyUnLCAnIScsIDAsIDApKSB7Ci0gICAgICAgICAgICByZXQgPSBUUlVFOwotICAgICAgICB9CitGWF9CT09MIENGWF9XaW4zMkZvbnRJbmZvOjpJc1N1cHBvcnRGb250Rm9ybURpdihjb25zdCBMT0dGT05UQSogcGxmKSB7CisgIEhGT05UIGhGb250ID0gQ3JlYXRlRm9udEluZGlyZWN0QShwbGYpOworICBGWF9CT09MIHJldCA9IEZBTFNFOworICBGWF9EV09SRCBmb250X3NpemUgPSBHZXRGb250RGF0YShoRm9udCwgMCwgTlVMTCwgMCk7CisgIGlmIChmb250X3NpemUgIT0gR0RJX0VSUk9SICYmIGZvbnRfc2l6ZSA+PSBzaXplb2YoRlhfRFdPUkQpKSB7CisgICAgRlhfRFdPUkQgbFZlcnNpb24gPSAwOworICAgIEdldEZvbnREYXRhKGhGb250LCAwLCAodWludDhfdCopKCZsVmVyc2lvbiksIHNpemVvZihGWF9EV09SRCkpOworICAgIGxWZXJzaW9uID0gKCgoRlhfRFdPUkQpKHVpbnQ4X3QpKGxWZXJzaW9uKSkgPDwgMjQpIHwKKyAgICAgICAgICAgICAgICgoRlhfRFdPUkQpKCh1aW50OF90KShsVmVyc2lvbiA+PiA4KSkpIDw8IDE2IHwKKyAgICAgICAgICAgICAgICgoRlhfRFdPUkQpKCh1aW50OF90KShsVmVyc2lvbiA+PiAxNikpKSA8PCA4IHwKKyAgICAgICAgICAgICAgICgodWludDhfdCkobFZlcnNpb24gPj4gMjQpKTsKKyAgICBpZiAobFZlcnNpb24gPT0gVFRfTUFLRV9UQUcoJ08nLCAnVCcsICdUJywgJ08nKSB8fCBsVmVyc2lvbiA9PSAweDAwMDEwMDAwIHx8CisgICAgICAgIGxWZXJzaW9uID09IFRUX01BS0VfVEFHKCd0JywgJ3QnLCAnYycsICdmJykgfHwKKyAgICAgICAgbFZlcnNpb24gPT0gVFRfTUFLRV9UQUcoJ3QnLCAncicsICd1JywgJ2UnKSB8fCBsVmVyc2lvbiA9PSAweDAwMDIwMDAwKSB7CisgICAgICByZXQgPSBUUlVFOworICAgIH0gZWxzZSBpZiAoKGxWZXJzaW9uICYgMHhGRkZGMDAwMCkgPT0gVFRfTUFLRV9UQUcoMHg4MCwgMHgwMSwgMHgwMCwgMHgwMCkgfHwKKyAgICAgICAgICAgICAgIChsVmVyc2lvbiAmIDB4RkZGRjAwMDApID09IFRUX01BS0VfVEFHKCclJywgJyEnLCAwLCAwKSkgeworICAgICAgcmV0ID0gVFJVRTsKICAgICB9Ci0gICAgRGVsZXRlRm9udChoRm9udCk7Ci0gICAgcmV0dXJuIHJldDsKKyAgfQorICBEZWxldGVGb250KGhGb250KTsKKyAgcmV0dXJuIHJldDsKIH0KLXZvaWQgQ1dpbjMyRm9udEluZm86OkFkZEluc3RhbGxlZEZvbnQoY29uc3QgTE9HRk9OVEEgKnBsZiwgRlhfRFdPUkQgRm9udFR5cGUpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZShwbGYtPmxmRmFjZU5hbWUsIC0xKTsKLSAgICBpZiAobmFtZVswXSA9PSAnQCcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobmFtZSA9PSBtX0xhc3RGYW1pbHkpIHsKLSAgICAgICAgbV9wTWFwcGVyLT5BZGRJbnN0YWxsZWRGb250KG5hbWUsIHBsZi0+bGZDaGFyU2V0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoIShGb250VHlwZSAmIFRSVUVUWVBFX0ZPTlRUWVBFKSAmJiAhKEZvbnRUeXBlICYgREVWSUNFX0ZPTlRUWVBFKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICghKEZvbnRUeXBlICYgVFJVRVRZUEVfRk9OVFRZUEUpKSB7Ci0gICAgICAgIGlmICghSXNTdXBwb3J0Rm9udEZvcm1EaXYocGxmKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQordm9pZCBDRlhfV2luMzJGb250SW5mbzo6QWRkSW5zdGFsbGVkRm9udChjb25zdCBMT0dGT05UQSogcGxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBGb250VHlwZSkgeworICBDRlhfQnl0ZVN0cmluZyBuYW1lKHBsZi0+bGZGYWNlTmFtZSk7CisgIGlmIChuYW1lWzBdID09ICdAJykgeworICAgIHJldHVybjsKKyAgfQorICBpZiAobmFtZSA9PSBtX0xhc3RGYW1pbHkpIHsKICAgICBtX3BNYXBwZXItPkFkZEluc3RhbGxlZEZvbnQobmFtZSwgcGxmLT5sZkNoYXJTZXQpOwotICAgIG1fTGFzdEZhbWlseSA9IG5hbWU7Ci19Ci1zdGF0aWMgaW50IENBTExCQUNLIEZvbnRFbnVtUHJvYygKLSAgICBjb25zdCBMT0dGT05UQSAqcGxmLAotICAgIGNvbnN0IFRFWFRNRVRSSUNBICpscG50bWUsCi0gICAgRlhfRFdPUkQgRm9udFR5cGUsCi0gICAgTFBBUkFNIGxQYXJhbQotKQotewotICAgIENXaW4zMkZvbnRJbmZvKiBwRm9udEluZm8gPSAoQ1dpbjMyRm9udEluZm8qKWxQYXJhbTsKLSAgICBpZiAocEZvbnRJbmZvLT5tX3BNYXBwZXItPkdldEZvbnRFbnVtZXJhdG9yKCkpIHsKLSAgICAgICAgcEZvbnRJbmZvLT5tX3BNYXBwZXItPkdldEZvbnRFbnVtZXJhdG9yKCktPkhpdEZvbnQoKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCEoRm9udFR5cGUgJiBUUlVFVFlQRV9GT05UVFlQRSkgJiYgIShGb250VHlwZSAmIERFVklDRV9GT05UVFlQRSkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCEoRm9udFR5cGUgJiBUUlVFVFlQRV9GT05UVFlQRSkpIHsKKyAgICBpZiAoIUlzU3VwcG9ydEZvbnRGb3JtRGl2KHBsZikpIHsKKyAgICAgIHJldHVybjsKICAgICB9Ci0gICAgcEZvbnRJbmZvLT5BZGRJbnN0YWxsZWRGb250KHBsZiwgRm9udFR5cGUpOwotICAgIHJldHVybiAxOworICB9CisgIG1fcE1hcHBlci0+QWRkSW5zdGFsbGVkRm9udChuYW1lLCBwbGYtPmxmQ2hhclNldCk7CisgIG1fTGFzdEZhbWlseSA9IG5hbWU7CiB9Ci1GWF9CT09MIENXaW4zMkZvbnRJbmZvOjpFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpCi17Ci0gICAgbV9wTWFwcGVyID0gcE1hcHBlcjsKLSAgICBMT0dGT05UQSBsZjsKLSAgICBGWFNZU19tZW1zZXQzMigmbGYsIDAsIHNpemVvZihMT0dGT05UQSkpOwotICAgIGxmLmxmQ2hhclNldCA9IERFRkFVTFRfQ0hBUlNFVDsKLSAgICBsZi5sZkZhY2VOYW1lWzBdID0gMDsKLSAgICBsZi5sZlBpdGNoQW5kRmFtaWx5ID0gMDsKLSAgICBFbnVtRm9udEZhbWlsaWVzRXhBKG1faERDLCAmbGYsIChGT05URU5VTVBST0NBKUZvbnRFbnVtUHJvYywgKEZYX1VJTlRQVFIpdGhpcywgMCk7Ci0gICAgaWYgKHBNYXBwZXItPkdldEZvbnRFbnVtZXJhdG9yKCkpIHsKLSAgICAgICAgcE1hcHBlci0+R2V0Rm9udEVudW1lcmF0b3IoKS0+RmluaXNoKCk7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOworc3RhdGljIGludCBDQUxMQkFDSyBGb250RW51bVByb2MoY29uc3QgTE9HRk9OVEEqIHBsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRFWFRNRVRSSUNBKiBscG50bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBGb250VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0pIHsKKyAgQ0ZYX1dpbjMyRm9udEluZm8qIHBGb250SW5mbyA9IChDRlhfV2luMzJGb250SW5mbyopbFBhcmFtOworICBpZiAocEZvbnRJbmZvLT5tX3BNYXBwZXItPkdldEZvbnRFbnVtZXJhdG9yKCkpIHsKKyAgICBwRm9udEluZm8tPm1fcE1hcHBlci0+R2V0Rm9udEVudW1lcmF0b3IoKS0+SGl0Rm9udCgpOworICB9CisgIHBGb250SW5mby0+QWRkSW5zdGFsbGVkRm9udChwbGYsIEZvbnRUeXBlKTsKKyAgcmV0dXJuIDE7Cit9CitGWF9CT09MIENGWF9XaW4zMkZvbnRJbmZvOjpFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpIHsKKyAgbV9wTWFwcGVyID0gcE1hcHBlcjsKKyAgTE9HRk9OVEEgbGY7CisgIEZYU1lTX21lbXNldCgmbGYsIDAsIHNpemVvZihMT0dGT05UQSkpOworICBsZi5sZkNoYXJTZXQgPSBERUZBVUxUX0NIQVJTRVQ7CisgIGxmLmxmRmFjZU5hbWVbMF0gPSAwOworICBsZi5sZlBpdGNoQW5kRmFtaWx5ID0gMDsKKyAgRW51bUZvbnRGYW1pbGllc0V4QShtX2hEQywgJmxmLCAoRk9OVEVOVU1QUk9DQSlGb250RW51bVByb2MsICh1aW50cHRyX3QpIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgMCk7CisgIGlmIChwTWFwcGVyLT5HZXRGb250RW51bWVyYXRvcigpKSB7CisgICAgcE1hcHBlci0+R2V0Rm9udEVudW1lcmF0b3IoKS0+RmluaXNoKCk7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CiBzdGF0aWMgY29uc3Qgc3RydWN0IHsKLSAgICBGWF9MUENTVFIJbV9wRmFjZU5hbWU7Ci0gICAgRlhfTFBDU1RSCW1fcFZhcmlhbnROYW1lOwotfQotVmFyaWFudE5hbWVzW10gPSB7CisgIGNvbnN0IEZYX0NIQVIqIG1fcEZhY2VOYW1lOworICBjb25zdCBGWF9DSEFSKiBtX3BWYXJpYW50TmFtZTsKK30gVmFyaWFudE5hbWVzW10gPSB7CiAgICAgeyJERkthaS1TQiIsICJceDE5XHg2QVx4NzdceDY5XHhENFx4OUEifSwKIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IHsKLSAgICBGWF9MUENTVFIJbV9wTmFtZTsKLSAgICBGWF9MUENTVFIJbV9wV2luTmFtZTsKLSAgICBGWF9CT09MCQltX2JCb2xkOwotICAgIEZYX0JPT0wJCW1fYkl0YWxpYzsKLX0KLUJhc2UxNFN1YnN0c1tdID0geworICBjb25zdCBGWF9DSEFSKiBtX3BOYW1lOworICBjb25zdCBGWF9DSEFSKiBtX3BXaW5OYW1lOworICBGWF9CT09MIG1fYkJvbGQ7CisgIEZYX0JPT0wgbV9iSXRhbGljOworfSBCYXNlMTRTdWJzdHNbXSA9IHsKICAgICB7IkNvdXJpZXIiLCAiQ291cmllciBOZXciLCBGQUxTRSwgRkFMU0V9LAogICAgIHsiQ291cmllci1Cb2xkIiwgIkNvdXJpZXIgTmV3IiwgVFJVRSwgRkFMU0V9LAogICAgIHsiQ291cmllci1Cb2xkT2JsaXF1ZSIsICJDb3VyaWVyIE5ldyIsIFRSVUUsIFRSVUV9LApAQCAtMTc4LDEwMjYgKzE5MSwxMTc0IEBACiAgICAgeyJUaW1lcy1Cb2xkSXRhbGljIiwgIlRpbWVzIE5ldyBSb21hbiIsIFRSVUUsIFRSVUV9LAogICAgIHsiVGltZXMtSXRhbGljIiwgIlRpbWVzIE5ldyBSb21hbiIsIEZBTFNFLCBUUlVFfSwKIH07Ci1DRlhfQnl0ZVN0cmluZyBDV2luMzJGb250SW5mbzo6RmluZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpCi17Ci0gICAgaWYgKG1fcE1hcHBlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOworQ0ZYX0J5dGVTdHJpbmcgQ0ZYX1dpbjMyRm9udEluZm86OkZpbmRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKSB7CisgIGlmICghbV9wTWFwcGVyKSB7CisgICAgcmV0dXJuIG5hbWU7CisgIH0KKyAgaW50IG5Gb250cyA9IG1fcE1hcHBlci0+bV9JbnN0YWxsZWRUVEZvbnRzLkdldFNpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuRm9udHM7IGkrKykgeworICAgIENGWF9CeXRlU3RyaW5nIHRoaXNuYW1lID0gbV9wTWFwcGVyLT5tX0luc3RhbGxlZFRURm9udHNbaV07CisgICAgaWYgKHRoaXNuYW1lWzBdID09ICcgJykgeworICAgICAgaWYgKHRoaXNuYW1lLk1pZCgxLCBuYW1lLkdldExlbmd0aCgpKSA9PSBuYW1lKSB7CisgICAgICAgIHJldHVybiBtX3BNYXBwZXItPm1fSW5zdGFsbGVkVFRGb250c1tpICsgMV07CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0aGlzbmFtZS5MZWZ0KG5hbWUuR2V0TGVuZ3RoKCkpID09IG5hbWUpIHsKKyAgICAgIHJldHVybiBtX3BNYXBwZXItPm1fSW5zdGFsbGVkVFRGb250c1tpXTsKICAgICB9Ci0gICAgaW50IG5Gb250cyA9IG1fcE1hcHBlci0+bV9JbnN0YWxsZWRUVEZvbnRzLkdldFNpemUoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Gb250czsgaSArKykgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyB0aGlzbmFtZSA9IG1fcE1hcHBlci0+bV9JbnN0YWxsZWRUVEZvbnRzW2ldOwotICAgICAgICBpZiAodGhpc25hbWVbMF0gPT0gJyAnKSB7Ci0gICAgICAgICAgICBpZiAodGhpc25hbWUuTWlkKDEsIG5hbWUuR2V0TGVuZ3RoKCkpID09IG5hbWUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbV9wTWFwcGVyLT5tX0luc3RhbGxlZFRURm9udHNbaSArIDFdOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHRoaXNuYW1lLkxlZnQobmFtZS5HZXRMZW5ndGgoKSkgPT0gbmFtZSkgewotICAgICAgICAgICAgcmV0dXJuIG1fcE1hcHBlci0+bV9JbnN0YWxsZWRUVEZvbnRzW2ldOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOworICB9CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOworfQordm9pZCogQ0ZYX1dpbjMyRmFsbGJhY2tGb250SW5mbzo6TWFwRm9udChpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJdGFsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBjc3RyX2ZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgaUV4YWN0KSB7CisgIHZvaWQqIGZvbnQgPSBHZXRTdWJzdEZvbnQoY3N0cl9mYWNlKTsKKyAgaWYgKGZvbnQpIHsKKyAgICBpRXhhY3QgPSAxOworICAgIHJldHVybiBmb250OworICB9CisgIEZYX0JPT0wgYkNKSyA9IFRSVUU7CisgIHN3aXRjaCAoY2hhcnNldCkgeworICAgIGNhc2UgRlhGT05UX1NISUZUSklTX0NIQVJTRVQ6CisgICAgY2FzZSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQ6CisgICAgY2FzZSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVDoKKyAgICBjYXNlIEZYRk9OVF9IQU5HRVVMX0NIQVJTRVQ6CisgICAgZGVmYXVsdDoKKyAgICAgIGJDSksgPSBGQUxTRTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBGaW5kRm9udCh3ZWlnaHQsIGJJdGFsaWMsIGNoYXJzZXQsIHBpdGNoX2ZhbWlseSwgY3N0cl9mYWNlLCAhYkNKSyk7CiB9CiBzdHJ1Y3QgX0ZvbnROYW1lTWFwIHsKLSAgICBGWF9MUENTVFIJbV9wU3ViRm9udE5hbWU7Ci0gICAgRlhfTFBDU1RSCW1fcFNyY0ZvbnROYW1lOworICBjb25zdCBGWF9DSEFSKiBtX3BTdWJGb250TmFtZTsKKyAgY29uc3QgRlhfQ0hBUiogbV9wU3JjRm9udE5hbWU7CiB9OwogY29uc3QgX0ZvbnROYW1lTWFwIGdfSnBGb250TmFtZU1hcFtdID0gewogICAgIHsiTVMgTWluY2hvIiwgIkhlaXNlaW1pbi1XMyJ9LAogICAgIHsiTVMgR290aGljIiwgIkp1bjEwMS1MaWdodCJ9LAogfTsKIGV4dGVybiAiQyIgewotICAgIHN0YXRpYyBpbnQgY29tcGFyZVN0cmluZyhjb25zdCB2b2lkKiBrZXksIGNvbnN0IHZvaWQqIGVsZW1lbnQpCi0gICAgewotICAgICAgICByZXR1cm4gRlhTWVNfc3RyaWNtcCgoRlhfTFBDU1RSKWtleSwgKChfRm9udE5hbWVNYXAqKWVsZW1lbnQpLT5tX3BTcmNGb250TmFtZSk7Ci0gICAgfQorc3RhdGljIGludCBjb21wYXJlU3RyaW5nKGNvbnN0IHZvaWQqIGtleSwgY29uc3Qgdm9pZCogZWxlbWVudCkgeworICByZXR1cm4gRlhTWVNfc3RyaWNtcCgoY29uc3QgRlhfQ0hBUiopa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAoKF9Gb250TmFtZU1hcCopZWxlbWVudCktPm1fcFNyY0ZvbnROYW1lKTsKIH0KLUZYX0JPT0wgX0dldFN1YkZvbnROYW1lKENGWF9CeXRlU3RyaW5nJiBuYW1lKQotewotICAgIGludCBzaXplID0gc2l6ZW9mIGdfSnBGb250TmFtZU1hcDsKLSAgICB2b2lkKiBwRm9udG5hbWVNYXAgPSAodm9pZCopZ19KcEZvbnROYW1lTWFwOwotICAgIF9Gb250TmFtZU1hcCogZm91bmQgPSAoX0ZvbnROYW1lTWFwKilGWFNZU19ic2VhcmNoKG5hbWUuY19zdHIoKSwgcEZvbnRuYW1lTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIC8gc2l6ZW9mIChfRm9udE5hbWVNYXApLCBzaXplb2YgKF9Gb250TmFtZU1hcCksIGNvbXBhcmVTdHJpbmcpOwotICAgIGlmIChmb3VuZCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgbmFtZSA9IGZvdW5kLT5tX3BTdWJGb250TmFtZTsKLSAgICByZXR1cm4gVFJVRTsKIH0KLXZvaWQgQ1dpbjMyRm9udEluZm86OkdldEdCUHJlZmVyZW5jZShDRlhfQnl0ZVN0cmluZyYgZmFjZSwgaW50IHdlaWdodCwgaW50IHBpY3RoX2ZhbWlseSkKLXsKLSAgICBpZiAoZmFjZS5GaW5kKCJLYWlUaSIpID49IDAgfHwgZmFjZS5GaW5kKCJceGJmXHhhYyIpID49IDApIHsKLSAgICAgICAgaWYgKG1fS2FpVGkuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBtX0thaVRpID0gRmluZEZvbnQoIkthaVRpIik7Ci0gICAgICAgICAgICBpZiAobV9LYWlUaS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtX0thaVRpID0gIlNpbVN1biI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmFjZSA9IG1fS2FpVGk7Ci0gICAgfSBlbHNlIGlmIChmYWNlLkZpbmQoIkZhbmdTb25nIikgPj0gMCB8fCBmYWNlLkZpbmQoIlx4YjdceGMyXHhjYlx4Y2UiKSA+PSAwKSB7Ci0gICAgICAgIGlmIChtX0ZhbmdTb25nLklzRW1wdHkoKSkgewotICAgICAgICAgICAgbV9GYW5nU29uZyA9IEZpbmRGb250KCJGYW5nU29uZyIpOwotICAgICAgICAgICAgaWYgKG1fRmFuZ1NvbmcuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbV9GYW5nU29uZyA9ICJTaW1TdW4iOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZhY2UgPSBtX0ZhbmdTb25nOwotICAgIH0gZWxzZSBpZiAoZmFjZS5GaW5kKCJTaW1TdW4iKSA+PSAwIHx8IGZhY2UuRmluZCgiXHhjYlx4Y2UiKSA+PSAwKSB7Ci0gICAgICAgIGZhY2UgPSAiU2ltU3VuIjsKLSAgICB9IGVsc2UgaWYgKGZhY2UuRmluZCgiU2ltSGVpIikgPj0gMCB8fCBmYWNlLkZpbmQoIlx4YmFceGRhIikgPj0gMCkgewotICAgICAgICBmYWNlID0gIlNpbUhlaSI7Ci0gICAgfSBlbHNlIGlmICghKHBpY3RoX2ZhbWlseSAmIEZGX1JPTUFOKSAmJiB3ZWlnaHQgPiA1NTApIHsKLSAgICAgICAgZmFjZSA9ICJTaW1IZWkiOworRlhfQk9PTCBfR2V0U3ViRm9udE5hbWUoQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpIHsKKyAgaW50IHNpemUgPSBzaXplb2YgZ19KcEZvbnROYW1lTWFwOworICB2b2lkKiBwRm9udG5hbWVNYXAgPSAodm9pZCopZ19KcEZvbnROYW1lTWFwOworICBfRm9udE5hbWVNYXAqIGZvdW5kID0gKF9Gb250TmFtZU1hcCopRlhTWVNfYnNlYXJjaCgKKyAgICAgIG5hbWUuY19zdHIoKSwgcEZvbnRuYW1lTWFwLCBzaXplIC8gc2l6ZW9mKF9Gb250TmFtZU1hcCksCisgICAgICBzaXplb2YoX0ZvbnROYW1lTWFwKSwgY29tcGFyZVN0cmluZyk7CisgIGlmICghZm91bmQpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbmFtZSA9IGZvdW5kLT5tX3BTdWJGb250TmFtZTsKKyAgcmV0dXJuIFRSVUU7Cit9Cit2b2lkIENGWF9XaW4zMkZvbnRJbmZvOjpHZXRHQlByZWZlcmVuY2UoQ0ZYX0J5dGVTdHJpbmcmIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGljdGhfZmFtaWx5KSB7CisgIGlmIChmYWNlLkZpbmQoIkthaVRpIikgPj0gMCB8fCBmYWNlLkZpbmQoIlx4YmZceGFjIikgPj0gMCkgeworICAgIGlmIChtX0thaVRpLklzRW1wdHkoKSkgeworICAgICAgbV9LYWlUaSA9IEZpbmRGb250KCJLYWlUaSIpOworICAgICAgaWYgKG1fS2FpVGkuSXNFbXB0eSgpKSB7CisgICAgICAgIG1fS2FpVGkgPSAiU2ltU3VuIjsKKyAgICAgIH0KKyAgICB9CisgICAgZmFjZSA9IG1fS2FpVGk7CisgIH0gZWxzZSBpZiAoZmFjZS5GaW5kKCJGYW5nU29uZyIpID49IDAgfHwgZmFjZS5GaW5kKCJceGI3XHhjMlx4Y2JceGNlIikgPj0gMCkgeworICAgIGlmIChtX0ZhbmdTb25nLklzRW1wdHkoKSkgeworICAgICAgbV9GYW5nU29uZyA9IEZpbmRGb250KCJGYW5nU29uZyIpOworICAgICAgaWYgKG1fRmFuZ1NvbmcuSXNFbXB0eSgpKSB7CisgICAgICAgIG1fRmFuZ1NvbmcgPSAiU2ltU3VuIjsKKyAgICAgIH0KKyAgICB9CisgICAgZmFjZSA9IG1fRmFuZ1Nvbmc7CisgIH0gZWxzZSBpZiAoZmFjZS5GaW5kKCJTaW1TdW4iKSA+PSAwIHx8IGZhY2UuRmluZCgiXHhjYlx4Y2UiKSA+PSAwKSB7CisgICAgZmFjZSA9ICJTaW1TdW4iOworICB9IGVsc2UgaWYgKGZhY2UuRmluZCgiU2ltSGVpIikgPj0gMCB8fCBmYWNlLkZpbmQoIlx4YmFceGRhIikgPj0gMCkgeworICAgIGZhY2UgPSAiU2ltSGVpIjsKKyAgfSBlbHNlIGlmICghKHBpY3RoX2ZhbWlseSAmIEZGX1JPTUFOKSAmJiB3ZWlnaHQgPiA1NTApIHsKKyAgICBmYWNlID0gIlNpbUhlaSI7CisgIH0gZWxzZSB7CisgICAgZmFjZSA9ICJTaW1TdW4iOworICB9Cit9Cit2b2lkIENGWF9XaW4zMkZvbnRJbmZvOjpHZXRKYXBhbmVzZVByZWZlcmVuY2UoQ0ZYX0J5dGVTdHJpbmcmIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGljdGhfZmFtaWx5KSB7CisgIGlmIChmYWNlLkZpbmQoIkdvdGhpYyIpID49IDAgfHwKKyAgICAgIGZhY2UuRmluZCgiXHg4M1x4NTNceDgzXHg1Nlx4ODNceDYyXHg4M1x4NGUiKSA+PSAwKSB7CisgICAgaWYgKGZhY2UuRmluZCgiUEdvdGhpYyIpID49IDAgfHwKKyAgICAgICAgZmFjZS5GaW5kKCJceDgyXHg2Zlx4ODNceDUzXHg4M1x4NTZceDgzXHg2Mlx4ODNceDRlIikgPj0gMCkgeworICAgICAgZmFjZSA9ICJNUyBQR290aGljIjsKKyAgICB9IGVsc2UgaWYgKGZhY2UuRmluZCgiVUkgR290aGljIikgPj0gMCkgeworICAgICAgZmFjZSA9ICJNUyBVSSBHb3RoaWMiOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGZhY2UgPSAiU2ltU3VuIjsKLSAgICB9Ci19Ci12b2lkIENXaW4zMkZvbnRJbmZvOjpHZXRKYXBhbmVzZVByZWZlcmVuY2UoQ0ZYX0J5dGVTdHJpbmcmIGZhY2UsIGludCB3ZWlnaHQsIGludCBwaWN0aF9mYW1pbHkpCi17Ci0gICAgaWYgKGZhY2UuRmluZCgiR290aGljIikgPj0gMCB8fCBmYWNlLkZpbmQoIlx4ODNceDUzXHg4M1x4NTZceDgzXHg2Mlx4ODNceDRlIikgPj0gMCkgewotICAgICAgICBpZiAoZmFjZS5GaW5kKCJQR290aGljIikgPj0gMCB8fCBmYWNlLkZpbmQoIlx4ODJceDZmXHg4M1x4NTNceDgzXHg1Nlx4ODNceDYyXHg4M1x4NGUiKSA+PSAwKSB7Ci0gICAgICAgICAgICBmYWNlID0gIk1TIFBHb3RoaWMiOwotICAgICAgICB9IGVsc2UgaWYgKGZhY2UuRmluZCgiVUkgR290aGljIikgPj0gMCkgewotICAgICAgICAgICAgZmFjZSA9ICJNUyBVSSBHb3RoaWMiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGZhY2UuRmluZCgiSEdTR290aGljTSIpID49IDAgfHwgZmFjZS5GaW5kKCJIR01hcnVHb3RoaWNNUFJPIikgPj0gMCkgewotICAgICAgICAgICAgICAgIGZhY2UgPSAiTVMgUEdvdGhpYyI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZhY2UgPSAiTVMgR290aGljIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChmYWNlLkZpbmQoIk1pbmNobyIpID49IDAgfHwgZmFjZS5GaW5kKCJceDk2XHhiZVx4OTJceGE5IikgPj0gMCkgewotICAgICAgICBpZiAoZmFjZS5GaW5kKCJQTWluY2hvIikgPj0gMCB8fCBmYWNlLkZpbmQoIlx4ODJceDZmXHg5Nlx4YmVceDkyXHhhOSIpID49IDApIHsKLSAgICAgICAgICAgIGZhY2UgPSAiTVMgUE1pbmNobyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmYWNlID0gIk1TIE1pbmNobyI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoX0dldFN1YkZvbnROYW1lKGZhY2UpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCEocGljdGhfZmFtaWx5ICYgRkZfUk9NQU4pICYmIHdlaWdodCA+IDQwMCkgeworICAgICAgaWYgKGZhY2UuRmluZCgiSEdTR290aGljTSIpID49IDAgfHwgZmFjZS5GaW5kKCJIR01hcnVHb3RoaWNNUFJPIikgPj0gMCkgewogICAgICAgICBmYWNlID0gIk1TIFBHb3RoaWMiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmFjZSA9ICJNUyBHb3RoaWMiOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGZhY2UuRmluZCgiTWluY2hvIikgPj0gMCB8fCBmYWNlLkZpbmQoIlx4OTZceGJlXHg5Mlx4YTkiKSA+PSAwKSB7CisgICAgaWYgKGZhY2UuRmluZCgiUE1pbmNobyIpID49IDAgfHwKKyAgICAgICAgZmFjZS5GaW5kKCJceDgyXHg2Zlx4OTZceGJlXHg5Mlx4YTkiKSA+PSAwKSB7CisgICAgICBmYWNlID0gIk1TIFBNaW5jaG8iOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGZhY2UgPSAiTVMgUE1pbmNobyI7CisgICAgICBmYWNlID0gIk1TIE1pbmNobyI7CiAgICAgfQorICAgIHJldHVybjsKKyAgfQorICBpZiAoX0dldFN1YkZvbnROYW1lKGZhY2UpKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmICghKHBpY3RoX2ZhbWlseSAmIEZGX1JPTUFOKSAmJiB3ZWlnaHQgPiA0MDApIHsKKyAgICBmYWNlID0gIk1TIFBHb3RoaWMiOworICB9IGVsc2UgeworICAgIGZhY2UgPSAiTVMgUE1pbmNobyI7CisgIH0KIH0KLXZvaWQqIENXaW4zMkZvbnRJbmZvOjpNYXBGb250KGludCB3ZWlnaHQsIEZYX0JPT0wgYkl0YWxpYywgaW50IGNoYXJzZXQsIGludCBwaXRjaF9mYW1pbHksIEZYX0xQQ1NUUiBjc3RyX2ZhY2UsIEZYX0JPT0wmIGJFeGFjdCkKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBmYWNlID0gY3N0cl9mYWNlOwotICAgIGludCBpQmFzZUZvbnQ7Ci0gICAgZm9yIChpQmFzZUZvbnQgPSAwOyBpQmFzZUZvbnQgPCAxMjsgaUJhc2VGb250ICsrKQotICAgICAgICBpZiAoZmFjZSA9PSBDRlhfQnl0ZVN0cmluZ0MoQmFzZTE0U3Vic3RzW2lCYXNlRm9udF0ubV9wTmFtZSkpIHsKLSAgICAgICAgICAgIGZhY2UgPSBCYXNlMTRTdWJzdHNbaUJhc2VGb250XS5tX3BXaW5OYW1lOwotICAgICAgICAgICAgd2VpZ2h0ID0gQmFzZTE0U3Vic3RzW2lCYXNlRm9udF0ubV9iQm9sZCA/IEZXX0JPTEQgOiBGV19OT1JNQUw7Ci0gICAgICAgICAgICBiSXRhbGljID0gQmFzZTE0U3Vic3RzW2lCYXNlRm9udF0ubV9iSXRhbGljOwotICAgICAgICAgICAgYkV4YWN0ID0gVFJVRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgaWYgKGNoYXJzZXQgPT0gQU5TSV9DSEFSU0VUIHx8IGNoYXJzZXQgPT0gU1lNQk9MX0NIQVJTRVQpIHsKLSAgICAgICAgY2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVDsKK3ZvaWQqIENGWF9XaW4zMkZvbnRJbmZvOjpNYXBGb250KGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJdGFsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBjc3RyX2ZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGlFeGFjdCkgeworICBDRlhfQnl0ZVN0cmluZyBmYWNlID0gY3N0cl9mYWNlOworICBpbnQgaUJhc2VGb250OworICBmb3IgKGlCYXNlRm9udCA9IDA7IGlCYXNlRm9udCA8IDEyOyBpQmFzZUZvbnQrKykKKyAgICBpZiAoZmFjZSA9PSBDRlhfQnl0ZVN0cmluZ0MoQmFzZTE0U3Vic3RzW2lCYXNlRm9udF0ubV9wTmFtZSkpIHsKKyAgICAgIGZhY2UgPSBCYXNlMTRTdWJzdHNbaUJhc2VGb250XS5tX3BXaW5OYW1lOworICAgICAgd2VpZ2h0ID0gQmFzZTE0U3Vic3RzW2lCYXNlRm9udF0ubV9iQm9sZCA/IEZXX0JPTEQgOiBGV19OT1JNQUw7CisgICAgICBiSXRhbGljID0gQmFzZTE0U3Vic3RzW2lCYXNlRm9udF0ubV9iSXRhbGljOworICAgICAgaUV4YWN0ID0gVFJVRTsKKyAgICAgIGJyZWFrOwogICAgIH0KLSAgICBpbnQgc3Vic3RfcGl0Y2hfZmFtaWx5ID0gcGl0Y2hfZmFtaWx5OwotICAgIHN3aXRjaCAoY2hhcnNldCkgewotICAgICAgICBjYXNlIFNISUZUSklTX0NIQVJTRVQ6Ci0gICAgICAgICAgICBzdWJzdF9waXRjaF9mYW1pbHkgPSBGRl9ST01BTjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENISU5FU0VCSUc1X0NIQVJTRVQ6Ci0gICAgICAgIGNhc2UgSEFOR1VMX0NIQVJTRVQ6Ci0gICAgICAgIGNhc2UgR0IyMzEyX0NIQVJTRVQ6Ci0gICAgICAgICAgICBzdWJzdF9waXRjaF9mYW1pbHkgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIEhGT05UIGhGb250ID0gOjpDcmVhdGVGb250QSgtMTAsIDAsIDAsIDAsIHdlaWdodCwgYkl0YWxpYywgMCwgMCwgY2hhcnNldCwgT1VUX1RUX09OTFlfUFJFQ0lTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBzdWJzdF9waXRjaF9mYW1pbHksIGZhY2UpOwotICAgIGNoYXIgZmFjZWJ1ZlsxMDBdOwotICAgIEhGT05UIGhPbGRGb250ID0gKEhGT05UKTo6U2VsZWN0T2JqZWN0KG1faERDLCBoRm9udCk7Ci0gICAgaW50IHJldCA9IDo6R2V0VGV4dEZhY2VBKG1faERDLCAxMDAsIGZhY2VidWYpOwotICAgIDo6U2VsZWN0T2JqZWN0KG1faERDLCBoT2xkRm9udCk7Ci0gICAgaWYgKGZhY2UuRXF1YWxOb0Nhc2UoZmFjZWJ1ZikpIHsKLSAgICAgICAgcmV0dXJuIGhGb250OwotICAgIH0KLSAgICBpbnQgaUNvdW50ID0gc2l6ZW9mKFZhcmlhbnROYW1lcykgLyBzaXplb2YoVmFyaWFudE5hbWVzWzBdKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgKytpKSB7Ci0gICAgICAgIGlmIChmYWNlID09IFZhcmlhbnROYW1lc1tpXS5tX3BGYWNlTmFtZSkgewotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGYWNlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChmYWNlYnVmKTsKLSAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0KiBwTmFtZSA9IChjb25zdCB1bnNpZ25lZCBzaG9ydCopVmFyaWFudE5hbWVzW2ldLm1fcFZhcmlhbnROYW1lOwotICAgICAgICAgICAgRlhfU1RSU0laRSBsZW4gPSBDRlhfV2lkZVN0cmluZzo6V1N0cmluZ0xlbmd0aChwTmFtZSk7Ci0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c05hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUocE5hbWUsIGxlbik7Ci0gICAgICAgICAgICBpZiAod3NGYWNlID09IHdzTmFtZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBoRm9udDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICA6OkRlbGV0ZU9iamVjdChoRm9udCk7Ci0gICAgaWYgKGNoYXJzZXQgPT0gREVGQVVMVF9DSEFSU0VUKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBzd2l0Y2ggKGNoYXJzZXQpIHsKLSAgICAgICAgY2FzZSBTSElGVEpJU19DSEFSU0VUOgotICAgICAgICAgICAgR2V0SmFwYW5lc2VQcmVmZXJlbmNlKGZhY2UsIHdlaWdodCwgcGl0Y2hfZmFtaWx5KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdCMjMxMl9DSEFSU0VUOgotICAgICAgICAgICAgR2V0R0JQcmVmZXJlbmNlKGZhY2UsIHdlaWdodCwgcGl0Y2hfZmFtaWx5KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEhBTkdVTF9DSEFSU0VUOgotICAgICAgICAgICAgZmFjZSA9ICJHdWxpbSI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDSElORVNFQklHNV9DSEFSU0VUOgotICAgICAgICAgICAgaWYgKGZhY2UuRmluZCgiTVN1bmciKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgZmFjZSA9ICJNaW5nTGlVIjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmFjZSA9ICJQTWluZ0xpVSI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaEZvbnQgPSA6OkNyZWF0ZUZvbnRBKC0xMCwgMCwgMCwgMCwgd2VpZ2h0LCBiSXRhbGljLCAwLCAwLCBjaGFyc2V0LCBPVVRfVFRfT05MWV9QUkVDSVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIHN1YnN0X3BpdGNoX2ZhbWlseSwgZmFjZSk7CisgIGlmIChjaGFyc2V0ID09IEFOU0lfQ0hBUlNFVCB8fCBjaGFyc2V0ID09IFNZTUJPTF9DSEFSU0VUKSB7CisgICAgY2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVDsKKyAgfQorICBpbnQgc3Vic3RfcGl0Y2hfZmFtaWx5ID0gcGl0Y2hfZmFtaWx5OworICBzd2l0Y2ggKGNoYXJzZXQpIHsKKyAgICBjYXNlIFNISUZUSklTX0NIQVJTRVQ6CisgICAgICBzdWJzdF9waXRjaF9mYW1pbHkgPSBGRl9ST01BTjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0hJTkVTRUJJRzVfQ0hBUlNFVDoKKyAgICBjYXNlIEhBTkdVTF9DSEFSU0VUOgorICAgIGNhc2UgR0IyMzEyX0NIQVJTRVQ6CisgICAgICBzdWJzdF9waXRjaF9mYW1pbHkgPSAwOworICAgICAgYnJlYWs7CisgIH0KKyAgSEZPTlQgaEZvbnQgPQorICAgICAgOjpDcmVhdGVGb250QSgtMTAsIDAsIDAsIDAsIHdlaWdodCwgYkl0YWxpYywgMCwgMCwgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgT1VUX1RUX09OTFlfUFJFQ0lTLCAwLCAwLCBzdWJzdF9waXRjaF9mYW1pbHksIGZhY2UpOworICBjaGFyIGZhY2VidWZbMTAwXTsKKyAgSEZPTlQgaE9sZEZvbnQgPSAoSEZPTlQpOjpTZWxlY3RPYmplY3QobV9oREMsIGhGb250KTsKKyAgOjpHZXRUZXh0RmFjZUEobV9oREMsIDEwMCwgZmFjZWJ1Zik7CisgIDo6U2VsZWN0T2JqZWN0KG1faERDLCBoT2xkRm9udCk7CisgIGlmIChmYWNlLkVxdWFsTm9DYXNlKGZhY2VidWYpKSB7CiAgICAgcmV0dXJuIGhGb250OwotfQotdm9pZCBDV2luMzJGb250SW5mbzo6RGVsZXRlRm9udCh2b2lkKiBoRm9udCkKLXsKLSAgICA6OkRlbGV0ZU9iamVjdChoRm9udCk7Ci19Ci1GWF9EV09SRCBDV2luMzJGb250SW5mbzo6R2V0Rm9udERhdGEodm9pZCogaEZvbnQsIEZYX0RXT1JEIHRhYmxlLCBGWF9MUEJZVEUgYnVmZmVyLCBGWF9EV09SRCBzaXplKQotewotICAgIEhGT05UIGhPbGRGb250ID0gKEhGT05UKTo6U2VsZWN0T2JqZWN0KG1faERDLCAoSEZPTlQpaEZvbnQpOwotICAgIHRhYmxlID0gRlhEV09SRF9GUk9NX01TQkZJUlNUKHRhYmxlKTsKLSAgICBzaXplID0gOjpHZXRGb250RGF0YShtX2hEQywgdGFibGUsIDAsIGJ1ZmZlciwgc2l6ZSk7Ci0gICAgOjpTZWxlY3RPYmplY3QobV9oREMsIGhPbGRGb250KTsKLSAgICBpZiAoc2l6ZSA9PSBHRElfRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIDA7CisgIH0KKyAgaW50IGlDb3VudCA9IHNpemVvZihWYXJpYW50TmFtZXMpIC8gc2l6ZW9mKFZhcmlhbnROYW1lc1swXSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyArK2kpIHsKKyAgICBpZiAoZmFjZSA9PSBWYXJpYW50TmFtZXNbaV0ubV9wRmFjZU5hbWUpIHsKKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzRmFjZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoZmFjZWJ1Zik7CisgICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCogcE5hbWUgPQorICAgICAgICAgIChjb25zdCB1bnNpZ25lZCBzaG9ydCopVmFyaWFudE5hbWVzW2ldLm1fcFZhcmlhbnROYW1lOworICAgICAgRlhfU1RSU0laRSBsZW4gPSBDRlhfV2lkZVN0cmluZzo6V1N0cmluZ0xlbmd0aChwTmFtZSk7CisgICAgICBDRlhfV2lkZVN0cmluZyB3c05hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUocE5hbWUsIGxlbik7CisgICAgICBpZiAod3NGYWNlID09IHdzTmFtZSkgeworICAgICAgICByZXR1cm4gaEZvbnQ7CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiBzaXplOworICB9CisgIDo6RGVsZXRlT2JqZWN0KGhGb250KTsKKyAgaWYgKGNoYXJzZXQgPT0gREVGQVVMVF9DSEFSU0VUKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgc3dpdGNoIChjaGFyc2V0KSB7CisgICAgY2FzZSBTSElGVEpJU19DSEFSU0VUOgorICAgICAgR2V0SmFwYW5lc2VQcmVmZXJlbmNlKGZhY2UsIHdlaWdodCwgcGl0Y2hfZmFtaWx5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0IyMzEyX0NIQVJTRVQ6CisgICAgICBHZXRHQlByZWZlcmVuY2UoZmFjZSwgd2VpZ2h0LCBwaXRjaF9mYW1pbHkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBIQU5HVUxfQ0hBUlNFVDoKKyAgICAgIGZhY2UgPSAiR3VsaW0iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDSElORVNFQklHNV9DSEFSU0VUOgorICAgICAgaWYgKGZhY2UuRmluZCgiTVN1bmciKSA+PSAwKSB7CisgICAgICAgIGZhY2UgPSAiTWluZ0xpVSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBmYWNlID0gIlBNaW5nTGlVIjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9CisgIGhGb250ID0gOjpDcmVhdGVGb250QSgtMTAsIDAsIDAsIDAsIHdlaWdodCwgYkl0YWxpYywgMCwgMCwgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9VVF9UVF9PTkxZX1BSRUNJUywgMCwgMCwgc3Vic3RfcGl0Y2hfZmFtaWx5LCBmYWNlKTsKKyAgcmV0dXJuIGhGb250OwogfQotRlhfQk9PTCBDV2luMzJGb250SW5mbzo6R2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKQotewotICAgIGNoYXIgZmFjZWJ1ZlsxMDBdOwotICAgIEhGT05UIGhPbGRGb250ID0gKEhGT05UKTo6U2VsZWN0T2JqZWN0KG1faERDLCAoSEZPTlQpaEZvbnQpOwotICAgIGludCByZXQgPSA6OkdldFRleHRGYWNlQShtX2hEQywgMTAwLCBmYWNlYnVmKTsKLSAgICA6OlNlbGVjdE9iamVjdChtX2hEQywgaE9sZEZvbnQpOwotICAgIGlmIChyZXQgPT0gMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIG5hbWUgPSBmYWNlYnVmOwotICAgIHJldHVybiBUUlVFOwordm9pZCBDRlhfV2luMzJGb250SW5mbzo6RGVsZXRlRm9udCh2b2lkKiBoRm9udCkgeworICA6OkRlbGV0ZU9iamVjdChoRm9udCk7CiB9Ci1GWF9CT09MIENXaW4zMkZvbnRJbmZvOjpHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KQotewotICAgIFRFWFRNRVRSSUMgdG07Ci0gICAgSEZPTlQgaE9sZEZvbnQgPSAoSEZPTlQpOjpTZWxlY3RPYmplY3QobV9oREMsIChIRk9OVCloRm9udCk7Ci0gICAgOjpHZXRUZXh0TWV0cmljcyhtX2hEQywgJnRtKTsKLSAgICA6OlNlbGVjdE9iamVjdChtX2hEQywgaE9sZEZvbnQpOwotICAgIGNoYXJzZXQgPSB0bS50bUNoYXJTZXQ7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1JRlhfU3lzdGVtRm9udEluZm8qIElGWF9TeXN0ZW1Gb250SW5mbzo6Q3JlYXRlRGVmYXVsdCgpCi17Ci0gICAgcmV0dXJuIG5ldyBDV2luMzJGb250SW5mbzsKLX0KLXZvaWQgQ0ZYX0dFTW9kdWxlOjpJbml0UGxhdGZvcm0oKQotewotICAgIENXaW4zMlBsYXRmb3JtKiBwUGxhdGZvcm1EYXRhID0gbmV3IENXaW4zMlBsYXRmb3JtOwotICAgIE9TVkVSU0lPTklORk8gdmVyOwotICAgIHZlci5kd09TVmVyc2lvbkluZm9TaXplID0gc2l6ZW9mKHZlcik7Ci0gICAgR2V0VmVyc2lvbkV4KCZ2ZXIpOwotICAgIHBQbGF0Zm9ybURhdGEtPm1fYkhhbGZUb25lID0gdmVyLmR3TWFqb3JWZXJzaW9uID49IDU7Ci0gICAgcFBsYXRmb3JtRGF0YS0+bV9HZGlwbHVzRXh0LkxvYWQoKTsKLSAgICBtX3BQbGF0Zm9ybURhdGEgPSBwUGxhdGZvcm1EYXRhOwotICAgIG1fcEZvbnRNZ3ItPlNldFN5c3RlbUZvbnRJbmZvKElGWF9TeXN0ZW1Gb250SW5mbzo6Q3JlYXRlRGVmYXVsdCgpKTsKLX0KLXZvaWQgQ0ZYX0dFTW9kdWxlOjpEZXN0cm95UGxhdGZvcm0oKQotewotICAgIGlmIChtX3BQbGF0Zm9ybURhdGEpIHsKLSAgICAgICAgZGVsZXRlIChDV2luMzJQbGF0Zm9ybSopbV9wUGxhdGZvcm1EYXRhOwotICAgIH0KLSAgICBtX3BQbGF0Zm9ybURhdGEgPSBOVUxMOwotfQotQ0dkaURldmljZURyaXZlcjo6Q0dkaURldmljZURyaXZlcihIREMgaERDLCBpbnQgZGV2aWNlX2NsYXNzKQotewotICAgIG1faERDID0gaERDOwotICAgIG1fRGV2aWNlQ2xhc3MgPSBkZXZpY2VfY2xhc3M7Ci0gICAgQ1dpbjMyUGxhdGZvcm0qIHBQbGF0Zm9ybSA9IChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCk7Ci0gICAgU2V0U3RyZXRjaEJsdE1vZGUoaERDLCBwUGxhdGZvcm0tPm1fYkhhbGZUb25lID8gSEFMRlRPTkUgOiBDT0xPUk9OQ09MT1IpOwotICAgIGlmIChHZXRPYmplY3RUeXBlKG1faERDKSA9PSBPQkpfTUVNREMpIHsKLSAgICAgICAgSEJJVE1BUCBoQml0bWFwID0gQ3JlYXRlQml0bWFwKDEsIDEsIDEsIDEsIE5VTEwpOwotICAgICAgICBoQml0bWFwID0gKEhCSVRNQVApU2VsZWN0T2JqZWN0KG1faERDLCBoQml0bWFwKTsKLSAgICAgICAgQklUTUFQIGJpdG1hcDsKLSAgICAgICAgR2V0T2JqZWN0KGhCaXRtYXAsIHNpemVvZiBiaXRtYXAsICZiaXRtYXApOwotICAgICAgICBtX25CaXRzUGVyUGl4ZWwgPSBiaXRtYXAuYm1CaXRzUGl4ZWw7Ci0gICAgICAgIG1fV2lkdGggPSBiaXRtYXAuYm1XaWR0aDsKLSAgICAgICAgbV9IZWlnaHQgPSBhYnMoYml0bWFwLmJtSGVpZ2h0KTsKLSAgICAgICAgaEJpdG1hcCA9IChIQklUTUFQKVNlbGVjdE9iamVjdChtX2hEQywgaEJpdG1hcCk7Ci0gICAgICAgIERlbGV0ZU9iamVjdChoQml0bWFwKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX25CaXRzUGVyUGl4ZWwgPSA6OkdldERldmljZUNhcHMobV9oREMsIEJJVFNQSVhFTCk7Ci0gICAgICAgIG1fV2lkdGggPSA6OkdldERldmljZUNhcHMobV9oREMsIEhPUlpSRVMpOwotICAgICAgICBtX0hlaWdodCA9IDo6R2V0RGV2aWNlQ2FwcyhtX2hEQywgVkVSVFJFUyk7Ci0gICAgfQotICAgIGlmIChtX0RldmljZUNsYXNzICE9IEZYRENfRElTUExBWSkgewotICAgICAgICBtX1JlbmRlckNhcHMgPSBGWFJDX0JJVF9NQVNLOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fUmVuZGVyQ2FwcyA9IEZYUkNfR0VUX0JJVFMgfCBGWFJDX0JJVF9NQVNLOwotICAgIH0KLX0KLWludCBDR2RpRGV2aWNlRHJpdmVyOjpHZXREZXZpY2VDYXBzKGludCBjYXBzX2lkKQotewotICAgIHN3aXRjaCAoY2Fwc19pZCkgewotICAgICAgICBjYXNlIEZYRENfREVWSUNFX0NMQVNTOgotICAgICAgICAgICAgcmV0dXJuIG1fRGV2aWNlQ2xhc3M7Ci0gICAgICAgIGNhc2UgRlhEQ19QSVhFTF9XSURUSDoKLSAgICAgICAgICAgIHJldHVybiBtX1dpZHRoOwotICAgICAgICBjYXNlIEZYRENfUElYRUxfSEVJR0hUOgotICAgICAgICAgICAgcmV0dXJuIG1fSGVpZ2h0OwotICAgICAgICBjYXNlIEZYRENfQklUU19QSVhFTDoKLSAgICAgICAgICAgIHJldHVybiBtX25CaXRzUGVyUGl4ZWw7Ci0gICAgICAgIGNhc2UgRlhEQ19SRU5ERVJfQ0FQUzoKLSAgICAgICAgICAgIHJldHVybiBtX1JlbmRlckNhcHM7Ci0gICAgfQorRlhfRFdPUkQgQ0ZYX1dpbjMyRm9udEluZm86OkdldEZvbnREYXRhKHZvaWQqIGhGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplKSB7CisgIEhGT05UIGhPbGRGb250ID0gKEhGT05UKTo6U2VsZWN0T2JqZWN0KG1faERDLCAoSEZPTlQpaEZvbnQpOworICB0YWJsZSA9IEZYRFdPUkRfRlJPTV9NU0JGSVJTVCh0YWJsZSk7CisgIHNpemUgPSA6OkdldEZvbnREYXRhKG1faERDLCB0YWJsZSwgMCwgYnVmZmVyLCBzaXplKTsKKyAgOjpTZWxlY3RPYmplY3QobV9oREMsIGhPbGRGb250KTsKKyAgaWYgKHNpemUgPT0gR0RJX0VSUk9SKSB7CiAgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIHNpemU7CiB9Ci1GWF9MUFZPSUQgQ0dkaURldmljZURyaXZlcjo6R2V0Q2xpcFJnbigpCi17Ci0gICAgSFJHTiBoQ2xpcFJnbiA9IENyZWF0ZVJlY3RSZ24oMCwgMCwgMSwgMSk7Ci0gICAgaWYgKDo6R2V0Q2xpcFJnbihtX2hEQywgaENsaXBSZ24pID09IDApIHsKLSAgICAgICAgRGVsZXRlT2JqZWN0KGhDbGlwUmduKTsKLSAgICAgICAgaENsaXBSZ24gPSBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gKEZYX0xQVk9JRCloQ2xpcFJnbjsKK0ZYX0JPT0wgQ0ZYX1dpbjMyRm9udEluZm86OkdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkgeworICBjaGFyIGZhY2VidWZbMTAwXTsKKyAgSEZPTlQgaE9sZEZvbnQgPSAoSEZPTlQpOjpTZWxlY3RPYmplY3QobV9oREMsIChIRk9OVCloRm9udCk7CisgIGludCByZXQgPSA6OkdldFRleHRGYWNlQShtX2hEQywgMTAwLCBmYWNlYnVmKTsKKyAgOjpTZWxlY3RPYmplY3QobV9oREMsIGhPbGRGb250KTsKKyAgaWYgKHJldCA9PSAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG5hbWUgPSBmYWNlYnVmOworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6R0RJX1NldERJQml0cyhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAxLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgaWYgKG1fRGV2aWNlQ2xhc3MgPT0gRlhEQ19QUklOVEVSKSB7Ci0gICAgICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IHBCaXRtYXAxLT5GbGlwSW1hZ2UoRkFMU0UsIFRSVUUpOwotICAgICAgICBpZiAocEJpdG1hcCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChwQml0bWFwLT5Jc0NteWtJbWFnZSgpIHx8IHBJY2NUcmFuc2Zvcm0pICYmCi0gICAgICAgICAgICAgICAgIXBCaXRtYXAtPkNvbnZlcnRGb3JtYXQoRlhESUJfUmdiLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGludCB3aWR0aCA9IHBTcmNSZWN0LT5XaWR0aCgpLCBoZWlnaHQgPSBwU3JjUmVjdC0+SGVpZ2h0KCk7Ci0gICAgICAgIGludCBwaXRjaCA9IHBCaXRtYXAtPkdldFBpdGNoKCk7Ci0gICAgICAgIExQQllURSBwQnVmZmVyID0gcEJpdG1hcC0+R2V0QnVmZmVyKCk7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGluZm8gPSBDRlhfV2luZG93c0RJQjo6R2V0Qml0bWFwSW5mbyhwQml0bWFwKTsKLSAgICAgICAgKChCSVRNQVBJTkZPSEVBREVSKilpbmZvLmNfc3RyKCkpLT5iaUhlaWdodCAqPSAtMTsKLSAgICAgICAgRlhfUkVDVCBkc3RfcmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgZHN0X3JlY3QuSW50ZXJzZWN0KDAsIDAsIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpKTsKLSAgICAgICAgaW50IGRzdF93aWR0aCA9IGRzdF9yZWN0LldpZHRoKCk7Ci0gICAgICAgIGludCBkc3RfaGVpZ2h0ID0gZHN0X3JlY3QuSGVpZ2h0KCk7Ci0gICAgICAgIDo6U3RyZXRjaERJQml0cyhtX2hEQywgbGVmdCwgdG9wLCBkc3Rfd2lkdGgsIGRzdF9oZWlnaHQsCi0gICAgICAgICAgICAwLCAwLCBkc3Rfd2lkdGgsIGRzdF9oZWlnaHQsIHBCdWZmZXIsIChCSVRNQVBJTkZPKilpbmZvLmNfc3RyKCksIERJQl9SR0JfQ09MT1JTLCBTUkNDT1BZKTsKLSAgICAgICAgZGVsZXRlIHBCaXRtYXA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gKENGWF9ESUJpdG1hcCopcEJpdG1hcDE7Ci0gICAgICAgIGlmICgocEJpdG1hcC0+SXNDbXlrSW1hZ2UoKSB8fCBwSWNjVHJhbnNmb3JtKSAmJgotICAgICAgICAgICAgICAgIChwQml0bWFwID0gcEJpdG1hcC0+Q2xvbmVDb252ZXJ0KEZYRElCX1JnYiwgTlVMTCwgcEljY1RyYW5zZm9ybSkpID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpbnQgd2lkdGggPSBwU3JjUmVjdC0+V2lkdGgoKSwgaGVpZ2h0ID0gcFNyY1JlY3QtPkhlaWdodCgpOwotICAgICAgICBpbnQgcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpOwotICAgICAgICBMUEJZVEUgcEJ1ZmZlciA9IHBCaXRtYXAtPkdldEJ1ZmZlcigpOwotICAgICAgICBDRlhfQnl0ZVN0cmluZyBpbmZvID0gQ0ZYX1dpbmRvd3NESUI6OkdldEJpdG1hcEluZm8ocEJpdG1hcCk7Ci0gICAgICAgIDo6U2V0RElCaXRzVG9EZXZpY2UobV9oREMsIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCwgcFNyY1JlY3QtPmxlZnQsIHBCaXRtYXAtPkdldEhlaWdodCgpIC0gcFNyY1JlY3QtPmJvdHRvbSwKLSAgICAgICAgICAgIDAsIHBCaXRtYXAtPkdldEhlaWdodCgpLCBwQnVmZmVyLCAoQklUTUFQSU5GTyopaW5mby5jX3N0cigpLCBESUJfUkdCX0NPTE9SUyk7Ci0gICAgICAgIGlmIChwQml0bWFwICE9IHBCaXRtYXAxKSB7Ci0gICAgICAgICAgICBkZWxldGUgcEJpdG1hcDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKK0ZYX0JPT0wgQ0ZYX1dpbjMyRm9udEluZm86OkdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpIHsKKyAgVEVYVE1FVFJJQyB0bTsKKyAgSEZPTlQgaE9sZEZvbnQgPSAoSEZPTlQpOjpTZWxlY3RPYmplY3QobV9oREMsIChIRk9OVCloRm9udCk7CisgIDo6R2V0VGV4dE1ldHJpY3MobV9oREMsICZ0bSk7CisgIDo6U2VsZWN0T2JqZWN0KG1faERDLCBoT2xkRm9udCk7CisgIGNoYXJzZXQgPSB0bS50bUNoYXJTZXQ7CisgIHJldHVybiBUUlVFOwogfQotRlhfQk9PTCBDR2RpRGV2aWNlRHJpdmVyOjpHRElfU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAxLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCi0gICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIEZYX0RXT1JEIGZsYWdzLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IChDRlhfRElCaXRtYXAqKXBCaXRtYXAxOwotICAgIGlmIChwQml0bWFwID09IE5VTEwgfHwgZGVzdF93aWR0aCA9PSAwICB8fCBkZXN0X2hlaWdodCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKK0lGWF9TeXN0ZW1Gb250SW5mbyogSUZYX1N5c3RlbUZvbnRJbmZvOjpDcmVhdGVEZWZhdWx0KGNvbnN0IGNoYXIqKiBwVW51c2VkKSB7CisgIEhEQyBoZGMgPSA6OkdldERDKE5VTEwpOworICBpZiAoaGRjKSB7CisgICAgOjpSZWxlYXNlREMoTlVMTCwgaGRjKTsKKyAgICByZXR1cm4gbmV3IENGWF9XaW4zMkZvbnRJbmZvOworICB9CisgIC8vIElmIEdESSBpcyBkaXNhYmxlZCB0aGVuIEdldERDIGZvciB0aGUgZGVza3RvcCB3aWxsIGZhaWwuIFNlbGVjdCB0aGUKKyAgLy8gZmFsbGJhY2sgZm9udCBpbmZvcm1hdGlvbiBjbGFzcyBpZiBHREkgaXMgZGlzYWJsZWQuCisgIENGWF9XaW4zMkZhbGxiYWNrRm9udEluZm8qIHBJbmZvRmFsbGJhY2sgPSBuZXcgQ0ZYX1dpbjMyRmFsbGJhY2tGb250SW5mbzsKKyAgLy8gQ29uc3RydWN0IHRoZSBmb250IHBhdGggbWFudWFsbHksIFNIR2V0S25vd25Gb2xkZXJQYXRoIHdvbid0IHdvcmsgdW5kZXIKKyAgLy8gYSByZXN0cmljdGl2ZSBzYW5kYm94LgorICBDSEFSIHdpbmRvd3NfcGF0aFtNQVhfUEFUSF0gPSB7fTsKKyAgRFdPUkQgcGF0aF9sZW4gPSA6OkdldFdpbmRvd3NEaXJlY3RvcnlBKHdpbmRvd3NfcGF0aCwgTUFYX1BBVEgpOworICBpZiAocGF0aF9sZW4gPiAwICYmIHBhdGhfbGVuIDwgTUFYX1BBVEgpIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBmb250c19wYXRoKHdpbmRvd3NfcGF0aCk7CisgICAgZm9udHNfcGF0aCArPSAiXFxGb250cyI7CisgICAgcEluZm9GYWxsYmFjay0+QWRkUGF0aChmb250c19wYXRoKTsKKyAgfQorICByZXR1cm4gcEluZm9GYWxsYmFjazsKK30KK3ZvaWQgQ0ZYX0dFTW9kdWxlOjpJbml0UGxhdGZvcm0oKSB7CisgIENXaW4zMlBsYXRmb3JtKiBwUGxhdGZvcm1EYXRhID0gbmV3IENXaW4zMlBsYXRmb3JtOworICBPU1ZFUlNJT05JTkZPIHZlcjsKKyAgdmVyLmR3T1NWZXJzaW9uSW5mb1NpemUgPSBzaXplb2YodmVyKTsKKyAgR2V0VmVyc2lvbkV4KCZ2ZXIpOworICBwUGxhdGZvcm1EYXRhLT5tX2JIYWxmVG9uZSA9IHZlci5kd01ham9yVmVyc2lvbiA+PSA1OworICBwUGxhdGZvcm1EYXRhLT5tX0dkaXBsdXNFeHQuTG9hZCgpOworICBtX3BQbGF0Zm9ybURhdGEgPSBwUGxhdGZvcm1EYXRhOworICBtX3BGb250TWdyLT5TZXRTeXN0ZW1Gb250SW5mbyhJRlhfU3lzdGVtRm9udEluZm86OkNyZWF0ZURlZmF1bHQobnVsbHB0cikpOworfQordm9pZCBDRlhfR0VNb2R1bGU6OkRlc3Ryb3lQbGF0Zm9ybSgpIHsKKyAgZGVsZXRlIChDV2luMzJQbGF0Zm9ybSopbV9wUGxhdGZvcm1EYXRhOworICBtX3BQbGF0Zm9ybURhdGEgPSBOVUxMOworfQorQ0dkaURldmljZURyaXZlcjo6Q0dkaURldmljZURyaXZlcihIREMgaERDLCBpbnQgZGV2aWNlX2NsYXNzKSB7CisgIG1faERDID0gaERDOworICBtX0RldmljZUNsYXNzID0gZGV2aWNlX2NsYXNzOworICBDV2luMzJQbGF0Zm9ybSogcFBsYXRmb3JtID0KKyAgICAgIChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCk7CisgIFNldFN0cmV0Y2hCbHRNb2RlKGhEQywgcFBsYXRmb3JtLT5tX2JIYWxmVG9uZSA/IEhBTEZUT05FIDogQ09MT1JPTkNPTE9SKTsKKyAgaWYgKEdldE9iamVjdFR5cGUobV9oREMpID09IE9CSl9NRU1EQykgeworICAgIEhCSVRNQVAgaEJpdG1hcCA9IENyZWF0ZUJpdG1hcCgxLCAxLCAxLCAxLCBOVUxMKTsKKyAgICBoQml0bWFwID0gKEhCSVRNQVApU2VsZWN0T2JqZWN0KG1faERDLCBoQml0bWFwKTsKKyAgICBCSVRNQVAgYml0bWFwOworICAgIEdldE9iamVjdChoQml0bWFwLCBzaXplb2YgYml0bWFwLCAmYml0bWFwKTsKKyAgICBtX25CaXRzUGVyUGl4ZWwgPSBiaXRtYXAuYm1CaXRzUGl4ZWw7CisgICAgbV9XaWR0aCA9IGJpdG1hcC5ibVdpZHRoOworICAgIG1fSGVpZ2h0ID0gYWJzKGJpdG1hcC5ibUhlaWdodCk7CisgICAgaEJpdG1hcCA9IChIQklUTUFQKVNlbGVjdE9iamVjdChtX2hEQywgaEJpdG1hcCk7CisgICAgRGVsZXRlT2JqZWN0KGhCaXRtYXApOworICB9IGVsc2UgeworICAgIG1fbkJpdHNQZXJQaXhlbCA9IDo6R2V0RGV2aWNlQ2FwcyhtX2hEQywgQklUU1BJWEVMKTsKKyAgICBtX1dpZHRoID0gOjpHZXREZXZpY2VDYXBzKG1faERDLCBIT1JaUkVTKTsKKyAgICBtX0hlaWdodCA9IDo6R2V0RGV2aWNlQ2FwcyhtX2hEQywgVkVSVFJFUyk7CisgIH0KKyAgaWYgKG1fRGV2aWNlQ2xhc3MgIT0gRlhEQ19ESVNQTEFZKSB7CisgICAgbV9SZW5kZXJDYXBzID0gRlhSQ19CSVRfTUFTSzsKKyAgfSBlbHNlIHsKKyAgICBtX1JlbmRlckNhcHMgPSBGWFJDX0dFVF9CSVRTIHwgRlhSQ19CSVRfTUFTSzsKKyAgfQorfQoraW50IENHZGlEZXZpY2VEcml2ZXI6OkdldERldmljZUNhcHMoaW50IGNhcHNfaWQpIHsKKyAgc3dpdGNoIChjYXBzX2lkKSB7CisgICAgY2FzZSBGWERDX0RFVklDRV9DTEFTUzoKKyAgICAgIHJldHVybiBtX0RldmljZUNsYXNzOworICAgIGNhc2UgRlhEQ19QSVhFTF9XSURUSDoKKyAgICAgIHJldHVybiBtX1dpZHRoOworICAgIGNhc2UgRlhEQ19QSVhFTF9IRUlHSFQ6CisgICAgICByZXR1cm4gbV9IZWlnaHQ7CisgICAgY2FzZSBGWERDX0JJVFNfUElYRUw6CisgICAgICByZXR1cm4gbV9uQml0c1BlclBpeGVsOworICAgIGNhc2UgRlhEQ19SRU5ERVJfQ0FQUzoKKyAgICAgIHJldHVybiBtX1JlbmRlckNhcHM7CisgIH0KKyAgcmV0dXJuIDA7Cit9Cit2b2lkKiBDR2RpRGV2aWNlRHJpdmVyOjpHZXRDbGlwUmduKCkgeworICBIUkdOIGhDbGlwUmduID0gQ3JlYXRlUmVjdFJnbigwLCAwLCAxLCAxKTsKKyAgaWYgKDo6R2V0Q2xpcFJnbihtX2hEQywgaENsaXBSZ24pID09IDApIHsKKyAgICBEZWxldGVPYmplY3QoaENsaXBSZ24pOworICAgIGhDbGlwUmduID0gTlVMTDsKKyAgfQorICByZXR1cm4gKHZvaWQqKWhDbGlwUmduOworfQorRlhfQk9PTCBDR2RpRGV2aWNlRHJpdmVyOjpHRElfU2V0RElCaXRzKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIGlmIChtX0RldmljZUNsYXNzID09IEZYRENfUFJJTlRFUikgeworICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IHBCaXRtYXAxLT5GbGlwSW1hZ2UoRkFMU0UsIFRSVUUpOworICAgIGlmICghcEJpdG1hcCkgeworICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAoKHBCaXRtYXAtPklzQ215a0ltYWdlKCkgfHwgcEljY1RyYW5zZm9ybSkgJiYKLSAgICAgICAgICAgICFwQml0bWFwLT5Db252ZXJ0Rm9ybWF0KEZYRElCX1JnYiwgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAhcEJpdG1hcC0+Q29udmVydEZvcm1hdChGWERJQl9SZ2IsIHBJY2NUcmFuc2Zvcm0pKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQorICAgIGludCB3aWR0aCA9IHBTcmNSZWN0LT5XaWR0aCgpLCBoZWlnaHQgPSBwU3JjUmVjdC0+SGVpZ2h0KCk7CisgICAgTFBCWVRFIHBCdWZmZXIgPSBwQml0bWFwLT5HZXRCdWZmZXIoKTsKICAgICBDRlhfQnl0ZVN0cmluZyBpbmZvID0gQ0ZYX1dpbmRvd3NESUI6OkdldEJpdG1hcEluZm8ocEJpdG1hcCk7Ci0gICAgaWYgKChGWF9JTlQ2NClhYnMoZGVzdF93aWR0aCkgKiBhYnMoZGVzdF9oZWlnaHQpIDwgKEZYX0lOVDY0KXBCaXRtYXAxLT5HZXRXaWR0aCgpICogcEJpdG1hcDEtPkdldEhlaWdodCgpICogNCB8fAotICAgICAgICAgICAgKGZsYWdzICYgRlhESUJfSU5URVJQT0wpIHx8IChmbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpKSB7Ci0gICAgICAgIFNldFN0cmV0Y2hCbHRNb2RlKG1faERDLCBIQUxGVE9ORSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgU2V0U3RyZXRjaEJsdE1vZGUobV9oREMsIENPTE9ST05DT0xPUik7Ci0gICAgfQotICAgIENGWF9ESUJpdG1hcCogcFRvU3RyZWNoQml0bWFwID0gcEJpdG1hcDsKLSAgICBib29sIGRlbCA9IGZhbHNlOwotICAgIGlmIChtX0RldmljZUNsYXNzID09IEZYRENfUFJJTlRFUiAmJiAoKEZYX0lOVDY0KXBCaXRtYXAtPkdldFdpZHRoKCkgKiBwQml0bWFwLT5HZXRIZWlnaHQoKSA+IChGWF9JTlQ2NClhYnMoZGVzdF93aWR0aCkgKiBhYnMoZGVzdF9oZWlnaHQpKSkgewotICAgICAgICBwVG9TdHJlY2hCaXRtYXAgPSBwQml0bWFwLT5TdHJldGNoVG8oZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQpOwotICAgICAgICBkZWwgPSB0cnVlOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyB0b1N0cmVjaEJpdG1hcEluZm8gPSBDRlhfV2luZG93c0RJQjo6R2V0Qml0bWFwSW5mbyhwVG9TdHJlY2hCaXRtYXApOwotICAgIDo6U3RyZXRjaERJQml0cyhtX2hEQywgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgIDAsIDAsIHBUb1N0cmVjaEJpdG1hcC0+R2V0V2lkdGgoKSwgcFRvU3RyZWNoQml0bWFwLT5HZXRIZWlnaHQoKSwgcFRvU3RyZWNoQml0bWFwLT5HZXRCdWZmZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgKEJJVE1BUElORk8qKXRvU3RyZWNoQml0bWFwSW5mby5jX3N0cigpLCBESUJfUkdCX0NPTE9SUywgU1JDQ09QWSk7Ci0gICAgaWYgKGRlbCkgewotICAgICAgICBkZWxldGUgcFRvU3RyZWNoQml0bWFwOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6R0RJX1N0cmV0Y2hCaXRNYXNrKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcDEsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKLSAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgRlhfRFdPUkQgYml0bWFwX2NvbG9yLCBGWF9EV09SRCBmbGFncywKLSAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17CisgICAgKChCSVRNQVBJTkZPSEVBREVSKilpbmZvLmNfc3RyKCkpLT5iaUhlaWdodCAqPSAtMTsKKyAgICBGWF9SRUNUIGRzdF9yZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgIGRzdF9yZWN0LkludGVyc2VjdCgwLCAwLCBwQml0bWFwLT5HZXRXaWR0aCgpLCBwQml0bWFwLT5HZXRIZWlnaHQoKSk7CisgICAgaW50IGRzdF93aWR0aCA9IGRzdF9yZWN0LldpZHRoKCk7CisgICAgaW50IGRzdF9oZWlnaHQgPSBkc3RfcmVjdC5IZWlnaHQoKTsKKyAgICA6OlN0cmV0Y2hESUJpdHMobV9oREMsIGxlZnQsIHRvcCwgZHN0X3dpZHRoLCBkc3RfaGVpZ2h0LCAwLCAwLCBkc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGRzdF9oZWlnaHQsIHBCdWZmZXIsIChCSVRNQVBJTkZPKilpbmZvLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgIERJQl9SR0JfQ09MT1JTLCBTUkNDT1BZKTsKKyAgICBkZWxldGUgcEJpdG1hcDsKKyAgfSBlbHNlIHsKICAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSAoQ0ZYX0RJQml0bWFwKilwQml0bWFwMTsKLSAgICBpZiAocEJpdG1hcCA9PSBOVUxMIHx8IGRlc3Rfd2lkdGggPT0gMCAgfHwgZGVzdF9oZWlnaHQgPT0gMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKChwQml0bWFwLT5Jc0NteWtJbWFnZSgpIHx8IHBJY2NUcmFuc2Zvcm0pICYmCisgICAgICAgIChwQml0bWFwID0gcEJpdG1hcC0+Q2xvbmVDb252ZXJ0KEZYRElCX1JnYiwgTlVMTCwgcEljY1RyYW5zZm9ybSkpID09CisgICAgICAgICAgICBOVUxMKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIF9Db2xvcjJBcmdiKGJpdG1hcF9jb2xvciwgYml0bWFwX2NvbG9yLCBhbHBoYV9mbGFnIHwgKDEgPDwgMjQpLCBwSWNjVHJhbnNmb3JtKTsKLSAgICBpbnQgd2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpLCBoZWlnaHQgPSBwQml0bWFwLT5HZXRIZWlnaHQoKTsKLSAgICBzdHJ1Y3QgewotICAgICAgICBCSVRNQVBJTkZPSEVBREVSCWJtaUhlYWRlcjsKLSAgICAgICAgRlhfRFdPUkQJCQlibWlDb2xvcnNbMl07Ci0gICAgfSBibWk7Ci0gICAgRlhTWVNfbWVtc2V0MzIoJmJtaS5ibWlIZWFkZXIsIDAsIHNpemVvZiAoQklUTUFQSU5GT0hFQURFUikpOwotICAgIGJtaS5ibWlIZWFkZXIuYmlTaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOwotICAgIGJtaS5ibWlIZWFkZXIuYmlCaXRDb3VudCA9IDE7Ci0gICAgYm1pLmJtaUhlYWRlci5iaUNvbXByZXNzaW9uID0gQklfUkdCOwotICAgIGJtaS5ibWlIZWFkZXIuYmlIZWlnaHQgPSAtaGVpZ2h0OwotICAgIGJtaS5ibWlIZWFkZXIuYmlQbGFuZXMgPSAxOwotICAgIGJtaS5ibWlIZWFkZXIuYmlXaWR0aCA9IHdpZHRoOwotICAgIGlmIChtX25CaXRzUGVyUGl4ZWwgIT0gMSkgewotICAgICAgICBTZXRTdHJldGNoQmx0TW9kZShtX2hEQywgSEFMRlRPTkUpOworICAgIGludCB3aWR0aCA9IHBTcmNSZWN0LT5XaWR0aCgpLCBoZWlnaHQgPSBwU3JjUmVjdC0+SGVpZ2h0KCk7CisgICAgTFBCWVRFIHBCdWZmZXIgPSBwQml0bWFwLT5HZXRCdWZmZXIoKTsKKyAgICBDRlhfQnl0ZVN0cmluZyBpbmZvID0gQ0ZYX1dpbmRvd3NESUI6OkdldEJpdG1hcEluZm8ocEJpdG1hcCk7CisgICAgOjpTZXRESUJpdHNUb0RldmljZShtX2hEQywgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0LCBwU3JjUmVjdC0+bGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAtPkdldEhlaWdodCgpIC0gcFNyY1JlY3QtPmJvdHRvbSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAtPkdldEhlaWdodCgpLCBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgKEJJVE1BUElORk8qKWluZm8uY19zdHIoKSwgRElCX1JHQl9DT0xPUlMpOworICAgIGlmIChwQml0bWFwICE9IHBCaXRtYXAxKSB7CisgICAgICBkZWxldGUgcEJpdG1hcDsKICAgICB9Ci0gICAgYm1pLmJtaUNvbG9yc1swXSA9IDB4ZmZmZmZmOwotICAgIGJtaS5ibWlDb2xvcnNbMV0gPSAwOwotCi0gICAgSEJSVVNIIGhQYXR0ZXJuID0gQ3JlYXRlU29saWRCcnVzaChiaXRtYXBfY29sb3IgJiAweGZmZmZmZik7Ci0gICAgSEJSVVNIIGhPbGQgPSAoSEJSVVNIKVNlbGVjdE9iamVjdChtX2hEQywgaFBhdHRlcm4pOwotCi0gICAgCi0gICAgLy8gSW4gUERGLCB3aGVuIGltYWdlIG1hc2sgaXMgMSwgdXNlIGRldmljZSBiaXRtYXA7IHdoZW4gbWFzayBpcyAwLCB1c2UgYnJ1c2ggYml0bWFwLgotICAgIC8vIEEgY29tcGxldGUgbGlzdCBvZiB0aGUgYm9vbGVuIG9wZXJhdGlvbnMgaXMgYXMgZm9sbG93czoKLQotICAgIC8qIFAoYml0bWFwX2NvbG9yKSAgICBTKEltYWdlTWFzaykgICAgRChEZXZpY2VCaXRtYXApICAgIFJlc3VsdAotICAgICAqICAgICAgICAwICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgIDAKLSAgICAgKiAgICAgICAgMCAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAwCi0gICAgICogICAgICAgIDAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgMAotICAgICAqICAgICAgICAwICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgIDEKLSAgICAgKiAgICAgICAgMSAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAxCi0gICAgICogICAgICAgIDEgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgMQotICAgICAqICAgICAgICAxICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgIDAKLSAgICAgKiAgICAgICAgMSAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAxCi0gICAgICovCi0gICAgLy8gVGhlIGJvb2xlbiBjb2RlcyBpcyBCOC4gQmFzZWQgb24gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2FhOTMyMTA2LmFzcHgsIHRoZSBST1AzIGNvZGUgaXMgMHhCODA3NEEKLQotICAgIDo6U3RyZXRjaERJQml0cyhtX2hEQywgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgIDAsIDAsIHdpZHRoLCBoZWlnaHQsIHBCaXRtYXAtPkdldEJ1ZmZlcigpLCAoQklUTUFQSU5GTyopJmJtaSwgRElCX1JHQl9DT0xPUlMsIDB4QjgwNzRBKTsKLQotICAgIFNlbGVjdE9iamVjdChtX2hEQywgaE9sZCk7Ci0gICAgRGVsZXRlT2JqZWN0KGhQYXR0ZXJuKTsKLQotICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBUUlVFOwogfQotQk9PTCBDR2RpRGV2aWNlRHJpdmVyOjpHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KQotewotICAgIHJldHVybiA6OkdldENsaXBCb3gobV9oREMsIChSRUNUKilwUmVjdCk7CitGWF9CT09MIENHZGlEZXZpY2VEcml2ZXI6OkdESV9TdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gKENGWF9ESUJpdG1hcCopcEJpdG1hcDE7CisgIGlmICghcEJpdG1hcCB8fCBkZXN0X3dpZHRoID09IDAgfHwgZGVzdF9oZWlnaHQgPT0gMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoKHBCaXRtYXAtPklzQ215a0ltYWdlKCkgfHwgcEljY1RyYW5zZm9ybSkgJiYKKyAgICAgICFwQml0bWFwLT5Db252ZXJ0Rm9ybWF0KEZYRElCX1JnYiwgcEljY1RyYW5zZm9ybSkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0ZYX0J5dGVTdHJpbmcgaW5mbyA9IENGWF9XaW5kb3dzRElCOjpHZXRCaXRtYXBJbmZvKHBCaXRtYXApOworICBpZiAoKGludDY0X3QpYWJzKGRlc3Rfd2lkdGgpICogYWJzKGRlc3RfaGVpZ2h0KSA8CisgICAgICAgICAgKGludDY0X3QpcEJpdG1hcDEtPkdldFdpZHRoKCkgKiBwQml0bWFwMS0+R2V0SGVpZ2h0KCkgKiA0IHx8CisgICAgICAoZmxhZ3MgJiBGWERJQl9JTlRFUlBPTCkgfHwgKGZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkpIHsKKyAgICBTZXRTdHJldGNoQmx0TW9kZShtX2hEQywgSEFMRlRPTkUpOworICB9IGVsc2UgeworICAgIFNldFN0cmV0Y2hCbHRNb2RlKG1faERDLCBDT0xPUk9OQ09MT1IpOworICB9CisgIENGWF9ESUJpdG1hcCogcFRvU3RyZWNoQml0bWFwID0gcEJpdG1hcDsKKyAgYm9vbCBkZWwgPSBmYWxzZTsKKyAgaWYgKG1fRGV2aWNlQ2xhc3MgPT0gRlhEQ19QUklOVEVSICYmCisgICAgICAoKGludDY0X3QpcEJpdG1hcC0+R2V0V2lkdGgoKSAqIHBCaXRtYXAtPkdldEhlaWdodCgpID4KKyAgICAgICAoaW50NjRfdClhYnMoZGVzdF93aWR0aCkgKiBhYnMoZGVzdF9oZWlnaHQpKSkgeworICAgIHBUb1N0cmVjaEJpdG1hcCA9IHBCaXRtYXAtPlN0cmV0Y2hUbyhkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCk7CisgICAgZGVsID0gdHJ1ZTsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyB0b1N0cmVjaEJpdG1hcEluZm8gPQorICAgICAgQ0ZYX1dpbmRvd3NESUI6OkdldEJpdG1hcEluZm8ocFRvU3RyZWNoQml0bWFwKTsKKyAgOjpTdHJldGNoRElCaXRzKG1faERDLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgIHBUb1N0cmVjaEJpdG1hcC0+R2V0V2lkdGgoKSwgcFRvU3RyZWNoQml0bWFwLT5HZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgIHBUb1N0cmVjaEJpdG1hcC0+R2V0QnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAoQklUTUFQSU5GTyopdG9TdHJlY2hCaXRtYXBJbmZvLmNfc3RyKCksIERJQl9SR0JfQ09MT1JTLAorICAgICAgICAgICAgICAgICAgU1JDQ09QWSk7CisgIGlmIChkZWwpIHsKKyAgICBkZWxldGUgcFRvU3RyZWNoQml0bWFwOworICB9CisgIHJldHVybiBUUlVFOwogfQotRlhfQk9PTCBDR2RpRGV2aWNlRHJpdmVyOjpTZXRDbGlwUmduKEZYX0xQVk9JRCBoUmduKQotewotICAgIDo6U2VsZWN0Q2xpcFJnbihtX2hEQywgKEhSR04paFJnbik7Ci0gICAgcmV0dXJuIFRSVUU7CitGWF9CT09MIENHZGlEZXZpY2VEcml2ZXI6OkdESV9TdHJldGNoQml0TWFzayhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgYml0bWFwX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gKENGWF9ESUJpdG1hcCopcEJpdG1hcDE7CisgIGlmICghcEJpdG1hcCB8fCBkZXN0X3dpZHRoID09IDAgfHwgZGVzdF9oZWlnaHQgPT0gMCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBfQ29sb3IyQXJnYihiaXRtYXBfY29sb3IsIGJpdG1hcF9jb2xvciwgYWxwaGFfZmxhZyB8ICgxIDw8IDI0KSwKKyAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSk7CisgIGludCB3aWR0aCA9IHBCaXRtYXAtPkdldFdpZHRoKCksIGhlaWdodCA9IHBCaXRtYXAtPkdldEhlaWdodCgpOworICBzdHJ1Y3QgeworICAgIEJJVE1BUElORk9IRUFERVIgYm1pSGVhZGVyOworICAgIEZYX0RXT1JEIGJtaUNvbG9yc1syXTsKKyAgfSBibWk7CisgIEZYU1lTX21lbXNldCgmYm1pLmJtaUhlYWRlciwgMCwgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKTsKKyAgYm1pLmJtaUhlYWRlci5iaVNpemUgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7CisgIGJtaS5ibWlIZWFkZXIuYmlCaXRDb3VudCA9IDE7CisgIGJtaS5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiA9IEJJX1JHQjsKKyAgYm1pLmJtaUhlYWRlci5iaUhlaWdodCA9IC1oZWlnaHQ7CisgIGJtaS5ibWlIZWFkZXIuYmlQbGFuZXMgPSAxOworICBibWkuYm1pSGVhZGVyLmJpV2lkdGggPSB3aWR0aDsKKyAgaWYgKG1fbkJpdHNQZXJQaXhlbCAhPSAxKSB7CisgICAgU2V0U3RyZXRjaEJsdE1vZGUobV9oREMsIEhBTEZUT05FKTsKKyAgfQorICBibWkuYm1pQ29sb3JzWzBdID0gMHhmZmZmZmY7CisgIGJtaS5ibWlDb2xvcnNbMV0gPSAwOworCisgIEhCUlVTSCBoUGF0dGVybiA9IENyZWF0ZVNvbGlkQnJ1c2goYml0bWFwX2NvbG9yICYgMHhmZmZmZmYpOworICBIQlJVU0ggaE9sZCA9IChIQlJVU0gpU2VsZWN0T2JqZWN0KG1faERDLCBoUGF0dGVybik7CisKKyAgLy8gSW4gUERGLCB3aGVuIGltYWdlIG1hc2sgaXMgMSwgdXNlIGRldmljZSBiaXRtYXA7IHdoZW4gbWFzayBpcyAwLCB1c2UgYnJ1c2gKKyAgLy8gYml0bWFwLgorICAvLyBBIGNvbXBsZXRlIGxpc3Qgb2YgdGhlIGJvb2xlbiBvcGVyYXRpb25zIGlzIGFzIGZvbGxvd3M6CisKKyAgLyogUChiaXRtYXBfY29sb3IpICAgIFMoSW1hZ2VNYXNrKSAgICBEKERldmljZUJpdG1hcCkgICAgUmVzdWx0CisgICAqICAgICAgICAwICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgIDAKKyAgICogICAgICAgIDAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgMAorICAgKiAgICAgICAgMCAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAwCisgICAqICAgICAgICAwICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgIDEKKyAgICogICAgICAgIDEgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgMQorICAgKiAgICAgICAgMSAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAxCisgICAqICAgICAgICAxICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgIDAKKyAgICogICAgICAgIDEgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgMQorICAgKi8KKyAgLy8gVGhlIGJvb2xlbiBjb2RlcyBpcyBCOC4gQmFzZWQgb24KKyAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2FhOTMyMTA2LmFzcHgsIHRoZSBST1AzIGNvZGUgaXMKKyAgLy8gMHhCODA3NEEKKworICA6OlN0cmV0Y2hESUJpdHMobV9oREMsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCAwLCAwLAorICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgcEJpdG1hcC0+R2V0QnVmZmVyKCksIChCSVRNQVBJTkZPKikmYm1pLAorICAgICAgICAgICAgICAgICAgRElCX1JHQl9DT0xPUlMsIDB4QjgwNzRBKTsKKworICBTZWxlY3RPYmplY3QobV9oREMsIGhPbGQpOworICBEZWxldGVPYmplY3QoaFBhdHRlcm4pOworCisgIHJldHVybiBUUlVFOwogfQotc3RhdGljIEhQRU4gX0NyZWF0ZVBlbihjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCBhcmdiKQotewotICAgIEZYX0ZMT0FUIHdpZHRoOwotICAgIEZYX0ZMT0FUIHNjYWxlID0gMS5mOwotICAgIGlmIChwTWF0cml4KQotICAgICAgICBzY2FsZSA9IEZYU1lTX2ZhYnMocE1hdHJpeC0+YSkgPiBGWFNZU19mYWJzKHBNYXRyaXgtPmIpID8KLSAgICAgICAgICAgICAgICBGWFNZU19mYWJzKHBNYXRyaXgtPmEpIDogRlhTWVNfZmFicyhwTWF0cml4LT5iKTsKLSAgICBpZiAocEdyYXBoU3RhdGUpIHsKLSAgICAgICAgd2lkdGggPSBzY2FsZSAqIHBHcmFwaFN0YXRlLT5tX0xpbmVXaWR0aDsKK0ZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6R2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCkgeworICByZXR1cm4gOjpHZXRDbGlwQm94KG1faERDLCAoUkVDVCopcFJlY3QpOworfQorRlhfQk9PTCBDR2RpRGV2aWNlRHJpdmVyOjpTZXRDbGlwUmduKHZvaWQqIGhSZ24pIHsKKyAgOjpTZWxlY3RDbGlwUmduKG1faERDLCAoSFJHTiloUmduKTsKKyAgcmV0dXJuIFRSVUU7Cit9CitzdGF0aWMgSFBFTiBfQ3JlYXRlUGVuKGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGFyZ2IpIHsKKyAgRlhfRkxPQVQgd2lkdGg7CisgIEZYX0ZMT0FUIHNjYWxlID0gMS5mOworICBpZiAocE1hdHJpeCkKKyAgICBzY2FsZSA9IEZYU1lTX2ZhYnMocE1hdHJpeC0+YSkgPiBGWFNZU19mYWJzKHBNYXRyaXgtPmIpCisgICAgICAgICAgICAgICAgPyBGWFNZU19mYWJzKHBNYXRyaXgtPmEpCisgICAgICAgICAgICAgICAgOiBGWFNZU19mYWJzKHBNYXRyaXgtPmIpOworICBpZiAocEdyYXBoU3RhdGUpIHsKKyAgICB3aWR0aCA9IHNjYWxlICogcEdyYXBoU3RhdGUtPm1fTGluZVdpZHRoOworICB9IGVsc2UgeworICAgIHdpZHRoID0gMS4wZjsKKyAgfQorICBGWF9EV09SRCBQZW5TdHlsZSA9IFBTX0dFT01FVFJJQzsKKyAgaWYgKHdpZHRoIDwgMSkgeworICAgIHdpZHRoID0gMTsKKyAgfQorICBpZiAocEdyYXBoU3RhdGUtPm1fRGFzaENvdW50KSB7CisgICAgUGVuU3R5bGUgfD0gUFNfVVNFUlNUWUxFOworICB9IGVsc2UgeworICAgIFBlblN0eWxlIHw9IFBTX1NPTElEOworICB9CisgIHN3aXRjaCAocEdyYXBoU3RhdGUtPm1fTGluZUNhcCkgeworICAgIGNhc2UgMDoKKyAgICAgIFBlblN0eWxlIHw9IFBTX0VORENBUF9GTEFUOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgUGVuU3R5bGUgfD0gUFNfRU5EQ0FQX1JPVU5EOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgUGVuU3R5bGUgfD0gUFNfRU5EQ0FQX1NRVUFSRTsKKyAgICAgIGJyZWFrOworICB9CisgIHN3aXRjaCAocEdyYXBoU3RhdGUtPm1fTGluZUpvaW4pIHsKKyAgICBjYXNlIDA6CisgICAgICBQZW5TdHlsZSB8PSBQU19KT0lOX01JVEVSOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgUGVuU3R5bGUgfD0gUFNfSk9JTl9ST1VORDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIFBlblN0eWxlIHw9IFBTX0pPSU5fQkVWRUw7CisgICAgICBicmVhazsKKyAgfQorICBpbnQgYTsKKyAgRlhfQ09MT1JSRUYgcmdiOworICBBcmdiRGVjb2RlKGFyZ2IsIGEsIHJnYik7CisgIExPR0JSVVNIIGxiOworICBsYi5sYkNvbG9yID0gcmdiOworICBsYi5sYlN0eWxlID0gQlNfU09MSUQ7CisgIGxiLmxiSGF0Y2ggPSAwOworICBGWF9EV09SRCogcERhc2ggPSBOVUxMOworICBpZiAocEdyYXBoU3RhdGUtPm1fRGFzaENvdW50KSB7CisgICAgcERhc2ggPSBGWF9BbGxvYyhGWF9EV09SRCwgcEdyYXBoU3RhdGUtPm1fRGFzaENvdW50KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudDsgaSsrKSB7CisgICAgICBwRGFzaFtpXSA9IEZYU1lTX3JvdW5kKAorICAgICAgICAgIHBNYXRyaXggPyBwTWF0cml4LT5UcmFuc2Zvcm1EaXN0YW5jZShwR3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXlbaV0pCisgICAgICAgICAgICAgICAgICA6IHBHcmFwaFN0YXRlLT5tX0Rhc2hBcnJheVtpXSk7CisgICAgICBpZiAocERhc2hbaV0gPCAxKSB7CisgICAgICAgIHBEYXNoW2ldID0gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgSFBFTiBoUGVuID0gRXh0Q3JlYXRlUGVuKFBlblN0eWxlLCAoRFdPUkQpRlhTWVNfY2VpbCh3aWR0aCksICZsYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudCwgKGNvbnN0IERXT1JEKilwRGFzaCk7CisgIEZYX0ZyZWUocERhc2gpOworICByZXR1cm4gaFBlbjsKK30KK3N0YXRpYyBIQlJVU0ggX0NyZWF0ZUJydXNoKEZYX0RXT1JEIGFyZ2IpIHsKKyAgaW50IGE7CisgIEZYX0NPTE9SUkVGIHJnYjsKKyAgQXJnYkRlY29kZShhcmdiLCBhLCByZ2IpOworICByZXR1cm4gQ3JlYXRlU29saWRCcnVzaChyZ2IpOworfQorc3RhdGljIHZvaWQgX1NldFBhdGhUb0RDKEhEQyBoREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgeworICBCZWdpblBhdGgoaERDKTsKKyAgaW50IG5Qb2ludHMgPSBwUGF0aERhdGEtPkdldFBvaW50Q291bnQoKTsKKyAgRlhfUEFUSFBPSU5UKiBwUG9pbnRzID0gcFBhdGhEYXRhLT5HZXRQb2ludHMoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuUG9pbnRzOyBpKyspIHsKKyAgICBGWF9GTE9BVCBwb3N4ID0gcFBvaW50c1tpXS5tX1BvaW50WCwgcG9zeSA9IHBQb2ludHNbaV0ubV9Qb2ludFk7CisgICAgaWYgKHBNYXRyaXgpIHsKKyAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybShwb3N4LCBwb3N5KTsKKyAgICB9CisgICAgaW50IHNjcmVlbl94ID0gRlhTWVNfcm91bmQocG9zeCksIHNjcmVlbl95ID0gRlhTWVNfcm91bmQocG9zeSk7CisgICAgaW50IHBvaW50X3R5cGUgPSBwUG9pbnRzW2ldLm1fRmxhZyAmIEZYUFRfVFlQRTsKKyAgICBpZiAocG9pbnRfdHlwZSA9PSBQVF9NT1ZFVE8pIHsKKyAgICAgIE1vdmVUb0V4KGhEQywgc2NyZWVuX3gsIHNjcmVlbl95LCBOVUxMKTsKKyAgICB9IGVsc2UgaWYgKHBvaW50X3R5cGUgPT0gUFRfTElORVRPKSB7CisgICAgICBpZiAocFBvaW50c1tpXS5tX1BvaW50WSA9PSBwUG9pbnRzW2kgLSAxXS5tX1BvaW50WSAmJgorICAgICAgICAgIHBQb2ludHNbaV0ubV9Qb2ludFggPT0gcFBvaW50c1tpIC0gMV0ubV9Qb2ludFgpIHsKKyAgICAgICAgc2NyZWVuX3grKzsKKyAgICAgIH0KKyAgICAgIExpbmVUbyhoREMsIHNjcmVlbl94LCBzY3JlZW5feSk7CisgICAgfSBlbHNlIGlmIChwb2ludF90eXBlID09IFBUX0JFWklFUlRPKSB7CisgICAgICBQT0lOVCBscHB0WzNdOworICAgICAgbHBwdFswXS54ID0gc2NyZWVuX3g7CisgICAgICBscHB0WzBdLnkgPSBzY3JlZW5feTsKKyAgICAgIHBvc3ggPSBwUG9pbnRzW2kgKyAxXS5tX1BvaW50WDsKKyAgICAgIHBvc3kgPSBwUG9pbnRzW2kgKyAxXS5tX1BvaW50WTsKKyAgICAgIGlmIChwTWF0cml4KSB7CisgICAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybShwb3N4LCBwb3N5KTsKKyAgICAgIH0KKyAgICAgIGxwcHRbMV0ueCA9IEZYU1lTX3JvdW5kKHBvc3gpOworICAgICAgbHBwdFsxXS55ID0gRlhTWVNfcm91bmQocG9zeSk7CisgICAgICBwb3N4ID0gcFBvaW50c1tpICsgMl0ubV9Qb2ludFg7CisgICAgICBwb3N5ID0gcFBvaW50c1tpICsgMl0ubV9Qb2ludFk7CisgICAgICBpZiAocE1hdHJpeCkgeworICAgICAgICBwTWF0cml4LT5UcmFuc2Zvcm0ocG9zeCwgcG9zeSk7CisgICAgICB9CisgICAgICBscHB0WzJdLnggPSBGWFNZU19yb3VuZChwb3N4KTsKKyAgICAgIGxwcHRbMl0ueSA9IEZYU1lTX3JvdW5kKHBvc3kpOworICAgICAgUG9seUJlemllclRvKGhEQywgbHBwdCwgMyk7CisgICAgICBpICs9IDI7CisgICAgfQorICAgIGlmIChwUG9pbnRzW2ldLm1fRmxhZyAmIFBUX0NMT1NFRklHVVJFKSB7CisgICAgICBDbG9zZUZpZ3VyZShoREMpOworICAgIH0KKyAgfQorICBFbmRQYXRoKGhEQyk7Cit9Cit2b2lkIENHZGlEZXZpY2VEcml2ZXI6OkRyYXdMaW5lKEZYX0ZMT0FUIHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkyKSB7CisgIGludCBmbGFnMSA9ICh4MSA8IDApIHwgKCh4MSA+IG1fV2lkdGgpIDw8IDEpIHwgKCh5MSA8IDApIDw8IDIpIHwKKyAgICAgICAgICAgICAgKCh5MSA+IG1fSGVpZ2h0KSA8PCAzKTsKKyAgaW50IGZsYWcyID0gKHgyIDwgMCkgfCAoKHgyID4gbV9XaWR0aCkgPDwgMSkgfCAoKHkyIDwgMCkgPDwgMikgfAorICAgICAgICAgICAgICAoKHkyID4gbV9IZWlnaHQpIDw8IDMpOworICBpZiAoZmxhZzEgJiBmbGFnMikgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoZmxhZzEgfHwgZmxhZzIpIHsKKyAgICBhZ2c6OnJlY3RfYmFzZTxGWF9GTE9BVD4gcmVjdCgwLjBmLCAwLjBmLCAoRlhfRkxPQVQpKG1fV2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCkobV9IZWlnaHQpKTsKKyAgICBGWF9GTE9BVCB4WzJdLCB5WzJdOworICAgIGludCBucCA9IGFnZzo6Y2xpcF9saWFuZ19iYXJza3k8RlhfRkxPQVQ+KHgxLCB5MSwgeDIsIHkyLCByZWN0LCB4LCB5KTsKKyAgICBpZiAobnAgPT0gMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobnAgPT0gMSkgeworICAgICAgeDIgPSB4WzBdOworICAgICAgeTIgPSB5WzBdOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHdpZHRoID0gMS4wZjsKKyAgICAgIHgxID0geFswXTsKKyAgICAgIHkxID0geVswXTsKKyAgICAgIHgyID0geFtucCAtIDFdOworICAgICAgeTIgPSB5W25wIC0gMV07CiAgICAgfQotICAgIEZYX0RXT1JEIFBlblN0eWxlID0gUFNfR0VPTUVUUklDOwotICAgIGlmICh3aWR0aCA8IDEpIHsKLSAgICAgICAgd2lkdGggPSAxOwotICAgIH0KLSAgICBpZihwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQpIHsKLSAgICAgICAgUGVuU3R5bGUgfD0gUFNfVVNFUlNUWUxFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFBlblN0eWxlIHw9IFBTX1NPTElEOwotICAgIH0KLSAgICBzd2l0Y2gocEdyYXBoU3RhdGUtPm1fTGluZUNhcCkgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBQZW5TdHlsZSB8PSBQU19FTkRDQVBfRkxBVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBQZW5TdHlsZSB8PSBQU19FTkRDQVBfUk9VTkQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgUGVuU3R5bGUgfD0gUFNfRU5EQ0FQX1NRVUFSRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBzd2l0Y2gocEdyYXBoU3RhdGUtPm1fTGluZUpvaW4pIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgUGVuU3R5bGUgfD0gUFNfSk9JTl9NSVRFUjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBQZW5TdHlsZSB8PSBQU19KT0lOX1JPVU5EOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIFBlblN0eWxlIHw9IFBTX0pPSU5fQkVWRUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaW50IGE7Ci0gICAgRlhfQ09MT1JSRUYgcmdiOwotICAgIEFyZ2JEZWNvZGUoYXJnYiwgYSwgcmdiKTsKLSAgICBMT0dCUlVTSCBsYjsKLSAgICBsYi5sYkNvbG9yID0gcmdiOwotICAgIGxiLmxiU3R5bGUgPSBCU19TT0xJRDsKLSAgICBsYi5sYkhhdGNoID0gMDsKLSAgICBGWF9EV09SRCogcERhc2ggPSBOVUxMOwotICAgIGlmIChwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQpIHsKLSAgICAgICAgcERhc2ggPSBGWF9BbGxvYyhGWF9EV09SRCwgcEdyYXBoU3RhdGUtPm1fRGFzaENvdW50KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIHBEYXNoW2ldID0gRlhTWVNfcm91bmQocE1hdHJpeCA/IHBNYXRyaXgtPlRyYW5zZm9ybURpc3RhbmNlKHBHcmFwaFN0YXRlLT5tX0Rhc2hBcnJheVtpXSkgOiBwR3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXlbaV0pOwotICAgICAgICAgICAgaWYgKHBEYXNoW2ldIDwgMSkgewotICAgICAgICAgICAgICAgIHBEYXNoW2ldID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBIUEVOIGhQZW4gPSBFeHRDcmVhdGVQZW4oUGVuU3R5bGUsIChEV09SRClGWFNZU19jZWlsKHdpZHRoKSwgJmxiLCBwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQsIChjb25zdCBEV09SRCopcERhc2gpOwotICAgIGlmIChwRGFzaCkgewotICAgICAgICBGWF9GcmVlKHBEYXNoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGhQZW47CisgIH0KKyAgTW92ZVRvRXgobV9oREMsIEZYU1lTX3JvdW5kKHgxKSwgRlhTWVNfcm91bmQoeTEpLCBOVUxMKTsKKyAgTGluZVRvKG1faERDLCBGWFNZU19yb3VuZCh4MiksIEZYU1lTX3JvdW5kKHkyKSk7CiB9Ci1zdGF0aWMgSEJSVVNIIF9DcmVhdGVCcnVzaChGWF9EV09SRCBhcmdiKQotewotICAgIGludCBhOwotICAgIEZYX0NPTE9SUkVGIHJnYjsKLSAgICBBcmdiRGVjb2RlKGFyZ2IsIGEsIHJnYik7Ci0gICAgcmV0dXJuIENyZWF0ZVNvbGlkQnJ1c2gocmdiKTsKLX0KLXN0YXRpYyB2b2lkIF9TZXRQYXRoVG9EQyhIREMgaERDLCBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCkKLXsKLSAgICBCZWdpblBhdGgoaERDKTsKLSAgICBpbnQgblBvaW50cyA9IHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpOwotICAgIEZYX1BBVEhQT0lOVCogcFBvaW50cyA9IHBQYXRoRGF0YS0+R2V0UG9pbnRzKCk7Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IG5Qb2ludHM7IGkrKykgewotICAgICAgICBGWF9GTE9BVCBwb3N4ID0gcFBvaW50c1tpXS5tX1BvaW50WCwgcG9zeSA9IHBQb2ludHNbaV0ubV9Qb2ludFk7Ci0gICAgICAgIGlmIChwTWF0cml4KSB7Ci0gICAgICAgICAgICBwTWF0cml4LT5UcmFuc2Zvcm0ocG9zeCwgcG9zeSk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHNjcmVlbl94ID0gRlhTWVNfcm91bmQocG9zeCksIHNjcmVlbl95ID0gRlhTWVNfcm91bmQocG9zeSk7Ci0gICAgICAgIGludCBwb2ludF90eXBlID0gcFBvaW50c1tpXS5tX0ZsYWcgJiBGWFBUX1RZUEU7Ci0gICAgICAgIGlmKHBvaW50X3R5cGUgPT0gUFRfTU9WRVRPKSB7Ci0gICAgICAgICAgICBNb3ZlVG9FeChoREMsIHNjcmVlbl94LCBzY3JlZW5feSwgTlVMTCk7Ci0gICAgICAgIH0gZWxzZSBpZihwb2ludF90eXBlID09IFBUX0xJTkVUTykgewotICAgICAgICAgICAgaWYgKHBQb2ludHNbaV0ubV9Qb2ludFkgPT0gcFBvaW50c1tpIC0gMV0ubV9Qb2ludFkgJiYgcFBvaW50c1tpXS5tX1BvaW50WCA9PSBwUG9pbnRzW2kgLSAxXS5tX1BvaW50WCkgewotICAgICAgICAgICAgICAgIHNjcmVlbl94ICsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGluZVRvKGhEQywgc2NyZWVuX3gsIHNjcmVlbl95KTsKLSAgICAgICAgfSBlbHNlIGlmKHBvaW50X3R5cGUgPT0gUFRfQkVaSUVSVE8pIHsKLSAgICAgICAgICAgIFBPSU5UIGxwcHRbM107Ci0gICAgICAgICAgICBscHB0WzBdLnggPSBzY3JlZW5feDsKLSAgICAgICAgICAgIGxwcHRbMF0ueSA9IHNjcmVlbl95OwotICAgICAgICAgICAgcG9zeCA9IHBQb2ludHNbaSArIDFdLm1fUG9pbnRYOwotICAgICAgICAgICAgcG9zeSA9IHBQb2ludHNbaSArIDFdLm1fUG9pbnRZOwotICAgICAgICAgICAgaWYgKHBNYXRyaXgpIHsKLSAgICAgICAgICAgICAgICBwTWF0cml4LT5UcmFuc2Zvcm0ocG9zeCwgcG9zeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBscHB0WzFdLnggPSBGWFNZU19yb3VuZChwb3N4KTsKLSAgICAgICAgICAgIGxwcHRbMV0ueSA9IEZYU1lTX3JvdW5kKHBvc3kpOwotICAgICAgICAgICAgcG9zeCA9IHBQb2ludHNbaSArIDJdLm1fUG9pbnRYOwotICAgICAgICAgICAgcG9zeSA9IHBQb2ludHNbaSArIDJdLm1fUG9pbnRZOwotICAgICAgICAgICAgaWYgKHBNYXRyaXgpIHsKLSAgICAgICAgICAgICAgICBwTWF0cml4LT5UcmFuc2Zvcm0ocG9zeCwgcG9zeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBscHB0WzJdLnggPSBGWFNZU19yb3VuZChwb3N4KTsKLSAgICAgICAgICAgIGxwcHRbMl0ueSA9IEZYU1lTX3JvdW5kKHBvc3kpOwotICAgICAgICAgICAgUG9seUJlemllclRvKGhEQywgbHBwdCwgMyk7Ci0gICAgICAgICAgICBpICs9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBQb2ludHNbaV0ubV9GbGFnICYgUFRfQ0xPU0VGSUdVUkUpIHsKLSAgICAgICAgICAgIENsb3NlRmlndXJlKGhEQyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRW5kUGF0aChoREMpOwotfQotdm9pZCBDR2RpRGV2aWNlRHJpdmVyOjpEcmF3TGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MikKLXsKLSAgICBpbnQgZmxhZzEgPSAoeDEgPCAwKSB8ICgoeDEgPiBtX1dpZHRoKSA8PCAxKSB8ICgoeTEgPCAwKSA8PCAyKSB8ICgoeTEgPiBtX0hlaWdodCkgPDwgMyk7Ci0gICAgaW50IGZsYWcyID0gKHgyIDwgMCkgfCAoKHgyID4gbV9XaWR0aCkgPDwgMSkgfCAoKHkyIDwgMCkgPDwgMikgfCAoKHkyID4gbV9IZWlnaHQpIDw8IDMpOwotICAgIGlmIChmbGFnMSAmIGZsYWcyKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGZsYWcxIHx8IGZsYWcyKSB7Ci0gICAgICAgIGFnZzo6cmVjdF9iYXNlPEZYX0ZMT0FUPiByZWN0KDAuMGYsIDAuMGYsIChGWF9GTE9BVCkobV9XaWR0aCksIChGWF9GTE9BVCkobV9IZWlnaHQpKTsKLSAgICAgICAgRlhfRkxPQVQgeFsyXSwgeVsyXTsKLSAgICAgICAgaW50IG5wID0gYWdnOjpjbGlwX2xpYW5nX2JhcnNreTxGWF9GTE9BVD4oeDEsIHkxLCB4MiwgeTIsIHJlY3QsIHgsIHkpOwotICAgICAgICBpZiAobnAgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChucCA9PSAxKSB7Ci0gICAgICAgICAgICB4MiA9IHhbMF07Ci0gICAgICAgICAgICB5MiA9IHlbMF07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB4MSA9IHhbMF07Ci0gICAgICAgICAgICB5MSA9IHlbMF07Ci0gICAgICAgICAgICB4MiA9IHhbbnAgLSAxXTsKLSAgICAgICAgICAgIHkyID0geVtucCAtIDFdOwotICAgICAgICB9Ci0gICAgfQotICAgIE1vdmVUb0V4KG1faERDLCBGWFNZU19yb3VuZCh4MSksIEZYU1lTX3JvdW5kKHkxKSwgTlVMTCk7Ci0gICAgTGluZVRvKG1faERDLCBGWFNZU19yb3VuZCh4MiksIEZYU1lTX3JvdW5kKHkyKSk7Ci19Ci1zdGF0aWMgRlhfQk9PTCBfTWF0cml4Tm9TY2FsZWQoY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCkKLXsKLSAgICByZXR1cm4gcE1hdHJpeC0+R2V0QSgpID09IDEuMGYgJiYgcE1hdHJpeC0+R2V0QigpID09IDAgJiYgcE1hdHJpeC0+R2V0QygpID09IDAgJiYgcE1hdHJpeC0+R2V0RCgpID09IDEuMGY7CitzdGF0aWMgRlhfQk9PTCBfTWF0cml4Tm9TY2FsZWQoY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgeworICByZXR1cm4gcE1hdHJpeC0+R2V0QSgpID09IDEuMGYgJiYgcE1hdHJpeC0+R2V0QigpID09IDAgJiYKKyAgICAgICAgIHBNYXRyaXgtPkdldEMoKSA9PSAwICYmIHBNYXRyaXgtPkdldEQoKSA9PSAxLjBmOwogfQogRlhfQk9PTCBDR2RpRGV2aWNlRHJpdmVyOjpEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3Ryb2tlX2NvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50CWJsZW5kX3R5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgaWYgKGJsZW5kX3R5cGUgIT0gRlhESUJfQkxFTkRfTk9STUFMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgaWYgKGJsZW5kX3R5cGUgIT0gRlhESUJfQkxFTkRfTk9STUFMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIF9Db2xvcjJBcmdiKGZpbGxfY29sb3IsIGZpbGxfY29sb3IsIGFscGhhX2ZsYWcgfCAoMSA8PCAyNCksIHBJY2NUcmFuc2Zvcm0pOworICBfQ29sb3IyQXJnYihzdHJva2VfY29sb3IsIHN0cm9rZV9jb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CisgIENXaW4zMlBsYXRmb3JtKiBwUGxhdGZvcm0gPQorICAgICAgKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKTsKKyAgaWYgKCEocEdyYXBoU3RhdGUgfHwgc3Ryb2tlX2NvbG9yID09IDApICYmCisgICAgICAhcFBsYXRmb3JtLT5tX0dkaXBsdXNFeHQuSXNBdmFpbGFibGUoKSkgeworICAgIENGWF9GbG9hdFJlY3QgYmJveF9mID0gcFBhdGhEYXRhLT5HZXRCb3VuZGluZ0JveCgpOworICAgIGlmIChwTWF0cml4KSB7CisgICAgICBiYm94X2YuVHJhbnNmb3JtKHBNYXRyaXgpOwogICAgIH0KLSAgICBfQ29sb3IyQXJnYihmaWxsX2NvbG9yLCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnIHwgKDEgPDwgMjQpLCBwSWNjVHJhbnNmb3JtKTsKLSAgICBfQ29sb3IyQXJnYihzdHJva2VfY29sb3IsIHN0cm9rZV9jb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci0gICAgQ1dpbjMyUGxhdGZvcm0qIHBQbGF0Zm9ybSA9IChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCk7Ci0gICAgaWYgKChwR3JhcGhTdGF0ZSA9PSBOVUxMIHx8IHN0cm9rZV9jb2xvciA9PSAwKSAmJiAhcFBsYXRmb3JtLT5tX0dkaXBsdXNFeHQuSXNBdmFpbGFibGUoKSkgewotICAgICAgICBDRlhfRmxvYXRSZWN0IGJib3hfZiA9IHBQYXRoRGF0YS0+R2V0Qm91bmRpbmdCb3goKTsKLSAgICAgICAgaWYgKHBNYXRyaXgpIHsKLSAgICAgICAgICAgIGJib3hfZi5UcmFuc2Zvcm0ocE1hdHJpeCk7CisgICAgRlhfUkVDVCBiYm94ID0gYmJveF9mLkdldElubmVyUmVjdCgpOworICAgIGlmIChiYm94LldpZHRoKCkgPD0gMCkgeworICAgICAgcmV0dXJuIERyYXdDb3NtZXRpY0xpbmUoKEZYX0ZMT0FUKShiYm94LmxlZnQpLCAoRlhfRkxPQVQpKGJib3gudG9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCkoYmJveC5sZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCkoYmJveC5ib3R0b20gKyAxKSwgZmlsbF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIEZYRElCX0JMRU5EX05PUk1BTCk7CisgICAgfSBlbHNlIGlmIChiYm94LkhlaWdodCgpIDw9IDApIHsKKyAgICAgIHJldHVybiBEcmF3Q29zbWV0aWNMaW5lKChGWF9GTE9BVCkoYmJveC5sZWZ0KSwgKEZYX0ZMT0FUKShiYm94LnRvcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKGJib3gucmlnaHQgKyAxKSwgKEZYX0ZMT0FUKShiYm94LnRvcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfQkxFTkRfTk9STUFMKTsKKyAgICB9CisgIH0KKyAgaW50IGZpbGxfYWxwaGEgPSBGWEFSR0JfQShmaWxsX2NvbG9yKTsKKyAgaW50IHN0cm9rZV9hbHBoYSA9IEZYQVJHQl9BKHN0cm9rZV9jb2xvcik7CisgIEZYX0JPT0wgYkRyYXdBbHBoYSA9IChmaWxsX2FscGhhID4gMCAmJiBmaWxsX2FscGhhIDwgMjU1KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAoc3Ryb2tlX2FscGhhID4gMCAmJiBzdHJva2VfYWxwaGEgPCAyNTUgJiYgcEdyYXBoU3RhdGUpOworICBpZiAoIXBQbGF0Zm9ybS0+bV9HZGlwbHVzRXh0LklzQXZhaWxhYmxlKCkgJiYgYkRyYXdBbHBoYSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAocFBsYXRmb3JtLT5tX0dkaXBsdXNFeHQuSXNBdmFpbGFibGUoKSkgeworICAgIGlmIChiRHJhd0FscGhhIHx8CisgICAgICAgICgobV9EZXZpY2VDbGFzcyAhPSBGWERDX1BSSU5URVIgJiYgIShmaWxsX21vZGUgJiBGWEZJTExfRlVMTENPVkVSKSkgfHwKKyAgICAgICAgIChwR3JhcGhTdGF0ZSAmJiBwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQpKSkgeworICAgICAgaWYgKCEoKE5VTEwgPT0gcE1hdHJpeCB8fCBfTWF0cml4Tm9TY2FsZWQocE1hdHJpeCkpICYmIHBHcmFwaFN0YXRlICYmCisgICAgICAgICAgICBwR3JhcGhTdGF0ZS0+bV9MaW5lV2lkdGggPT0gMS5mICYmCisgICAgICAgICAgICAocFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgPT0gNSB8fAorICAgICAgICAgICAgIHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID09IDQpICYmCisgICAgICAgICAgICBwUGF0aERhdGEtPklzUmVjdCgpKSkgeworICAgICAgICBpZiAocFBsYXRmb3JtLT5tX0dkaXBsdXNFeHQuRHJhd1BhdGgobV9oREMsIHBQYXRoRGF0YSwgcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBHcmFwaFN0YXRlLCBmaWxsX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlX2NvbG9yLCBmaWxsX21vZGUpKSB7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgIH0KLSAgICAgICAgRlhfUkVDVCBiYm94ID0gYmJveF9mLkdldElubmVyUmVjdCgpOwotICAgICAgICBpZiAoYmJveC5XaWR0aCgpIDw9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBEcmF3Q29zbWV0aWNMaW5lKChGWF9GTE9BVCkoYmJveC5sZWZ0KSwgKEZYX0ZMT0FUKShiYm94LnRvcCksIChGWF9GTE9BVCkoYmJveC5sZWZ0KSwgKEZYX0ZMT0FUKShiYm94LmJvdHRvbSArIDEpLCBmaWxsX2NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgRlhESUJfQkxFTkRfTk9STUFMKTsKLSAgICAgICAgfSBlbHNlIGlmIChiYm94LkhlaWdodCgpIDw9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBEcmF3Q29zbWV0aWNMaW5lKChGWF9GTE9BVCkoYmJveC5sZWZ0KSwgKEZYX0ZMT0FUKShiYm94LnRvcCksIChGWF9GTE9BVCkoYmJveC5yaWdodCArIDEpLCAoRlhfRkxPQVQpKGJib3gudG9wKSwgZmlsbF9jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIEZYRElCX0JMRU5EX05PUk1BTCk7Ci0gICAgICAgIH0KKyAgICAgIH0KICAgICB9Ci0gICAgaW50IGZpbGxfYWxwaGEgPSBGWEFSR0JfQShmaWxsX2NvbG9yKTsKLSAgICBpbnQgc3Ryb2tlX2FscGhhID0gRlhBUkdCX0Eoc3Ryb2tlX2NvbG9yKTsKLSAgICBGWF9CT09MIGJEcmF3QWxwaGEgPSAoZmlsbF9hbHBoYSA+IDAgJiYgZmlsbF9hbHBoYSA8IDI1NSkgfHwgKHN0cm9rZV9hbHBoYSA+IDAgJiYgc3Ryb2tlX2FscGhhIDwgMjU1ICYmIHBHcmFwaFN0YXRlKTsKLSAgICBpZiAoIXBQbGF0Zm9ybS0+bV9HZGlwbHVzRXh0LklzQXZhaWxhYmxlKCkgJiYgYkRyYXdBbHBoYSkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW50IG9sZF9maWxsX21vZGUgPSBmaWxsX21vZGU7CisgIGZpbGxfbW9kZSAmPSAzOworICBIUEVOIGhQZW4gPSBOVUxMOworICBIQlJVU0ggaEJydXNoID0gTlVMTDsKKyAgaWYgKHBHcmFwaFN0YXRlICYmIHN0cm9rZV9hbHBoYSkgeworICAgIFNldE1pdGVyTGltaXQobV9oREMsIHBHcmFwaFN0YXRlLT5tX01pdGVyTGltaXQsIE5VTEwpOworICAgIGhQZW4gPSBfQ3JlYXRlUGVuKHBHcmFwaFN0YXRlLCBwTWF0cml4LCBzdHJva2VfY29sb3IpOworICAgIGhQZW4gPSAoSFBFTilTZWxlY3RPYmplY3QobV9oREMsIGhQZW4pOworICB9CisgIGlmIChmaWxsX21vZGUgJiYgZmlsbF9hbHBoYSkgeworICAgIFNldFBvbHlGaWxsTW9kZShtX2hEQywgZmlsbF9tb2RlKTsKKyAgICBoQnJ1c2ggPSBfQ3JlYXRlQnJ1c2goZmlsbF9jb2xvcik7CisgICAgaEJydXNoID0gKEhCUlVTSClTZWxlY3RPYmplY3QobV9oREMsIGhCcnVzaCk7CisgIH0KKyAgaWYgKHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID09IDIgJiYgcEdyYXBoU3RhdGUgJiYKKyAgICAgIHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudCkgeworICAgIEZYX0ZMT0FUIHgxID0gcFBhdGhEYXRhLT5HZXRQb2ludFgoMCksIHkxID0gcFBhdGhEYXRhLT5HZXRQb2ludFkoMCk7CisgICAgaWYgKHBNYXRyaXgpIHsKKyAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybSh4MSwgeTEpOwogICAgIH0KLSAgICBpZiAocFBsYXRmb3JtLT5tX0dkaXBsdXNFeHQuSXNBdmFpbGFibGUoKSkgewotICAgICAgICBpZiAoYkRyYXdBbHBoYSB8fCAoKG1fRGV2aWNlQ2xhc3MgIT0gRlhEQ19QUklOVEVSICYmICEoZmlsbF9tb2RlICYgRlhGSUxMX0ZVTExDT1ZFUikpIHx8IHBHcmFwaFN0YXRlICYmIHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudCkpIHsKLSAgICAgICAgICAgIGlmICggISgoTlVMTCA9PSBwTWF0cml4IHx8IF9NYXRyaXhOb1NjYWxlZChwTWF0cml4KSkgJiYKLSAgICAgICAgICAgICAgICAgICAgcEdyYXBoU3RhdGUgJiYgcEdyYXBoU3RhdGUtPm1fTGluZVdpZHRoID09IDEuZiAmJgotICAgICAgICAgICAgICAgICAgICAocFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgPT0gNSB8fCBwUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSA9PSA0KSAmJgotICAgICAgICAgICAgICAgICAgICBwUGF0aERhdGEtPklzUmVjdCgpKSApIHsKLSAgICAgICAgICAgICAgICBpZiAocFBsYXRmb3JtLT5tX0dkaXBsdXNFeHQuRHJhd1BhdGgobV9oREMsIHBQYXRoRGF0YSwgcE1hdHJpeCwgcEdyYXBoU3RhdGUsIGZpbGxfY29sb3IsIHN0cm9rZV9jb2xvciwgZmlsbF9tb2RlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICBGWF9GTE9BVCB4MiA9IHBQYXRoRGF0YS0+R2V0UG9pbnRYKDEpLCB5MiA9IHBQYXRoRGF0YS0+R2V0UG9pbnRZKDEpOworICAgIGlmIChwTWF0cml4KSB7CisgICAgICBwTWF0cml4LT5UcmFuc2Zvcm0oeDIsIHkyKTsKICAgICB9Ci0gICAgaW50IG9sZF9maWxsX21vZGUgPSBmaWxsX21vZGU7Ci0gICAgZmlsbF9tb2RlICY9IDM7Ci0gICAgSFBFTiBoUGVuID0gTlVMTDsKLSAgICBIQlJVU0ggaEJydXNoID0gTlVMTDsKKyAgICBEcmF3TGluZSh4MSwgeTEsIHgyLCB5Mik7CisgIH0gZWxzZSB7CisgICAgX1NldFBhdGhUb0RDKG1faERDLCBwUGF0aERhdGEsIHBNYXRyaXgpOwogICAgIGlmIChwR3JhcGhTdGF0ZSAmJiBzdHJva2VfYWxwaGEpIHsKLSAgICAgICAgU2V0TWl0ZXJMaW1pdChtX2hEQywgcEdyYXBoU3RhdGUtPm1fTWl0ZXJMaW1pdCwgTlVMTCk7Ci0gICAgICAgIGhQZW4gPSBfQ3JlYXRlUGVuKHBHcmFwaFN0YXRlLCBwTWF0cml4LCBzdHJva2VfY29sb3IpOwotICAgICAgICBoUGVuID0gKEhQRU4pU2VsZWN0T2JqZWN0KG1faERDLCBoUGVuKTsKLSAgICB9Ci0gICAgaWYgKGZpbGxfbW9kZSAmJiBmaWxsX2FscGhhKSB7Ci0gICAgICAgIFNldFBvbHlGaWxsTW9kZShtX2hEQywgZmlsbF9tb2RlKTsKLSAgICAgICAgaEJydXNoID0gX0NyZWF0ZUJydXNoKGZpbGxfY29sb3IpOwotICAgICAgICBoQnJ1c2ggPSAoSEJSVVNIKVNlbGVjdE9iamVjdChtX2hEQywgaEJydXNoKTsKLSAgICB9Ci0gICAgaWYgKHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID09IDIgJiYgcEdyYXBoU3RhdGUgJiYgcEdyYXBoU3RhdGUtPm1fRGFzaENvdW50KSB7Ci0gICAgICAgIEZYX0ZMT0FUIHgxID0gcFBhdGhEYXRhLT5HZXRQb2ludFgoMCksIHkxID0gcFBhdGhEYXRhLT5HZXRQb2ludFkoMCk7Ci0gICAgICAgIGlmIChwTWF0cml4KSB7Ci0gICAgICAgICAgICBwTWF0cml4LT5UcmFuc2Zvcm0oeDEsIHkxKTsKKyAgICAgIGlmIChmaWxsX21vZGUgJiYgZmlsbF9hbHBoYSkgeworICAgICAgICBpZiAob2xkX2ZpbGxfbW9kZSAmIEZYX0ZJTExfVEVYVF9NT0RFKSB7CisgICAgICAgICAgU3Ryb2tlQW5kRmlsbFBhdGgobV9oREMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEZpbGxQYXRoKG1faERDKTsKKyAgICAgICAgICBfU2V0UGF0aFRvREMobV9oREMsIHBQYXRoRGF0YSwgcE1hdHJpeCk7CisgICAgICAgICAgU3Ryb2tlUGF0aChtX2hEQyk7CiAgICAgICAgIH0KLSAgICAgICAgRlhfRkxPQVQgeDIgPSBwUGF0aERhdGEtPkdldFBvaW50WCgxKSwgeTIgPSBwUGF0aERhdGEtPkdldFBvaW50WSgxKTsKLSAgICAgICAgaWYgKHBNYXRyaXgpIHsKLSAgICAgICAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybSh4MiwgeTIpOwotICAgICAgICB9Ci0gICAgICAgIERyYXdMaW5lKHgxLCB5MSwgeDIsIHkyKTsKLSAgICB9IGVsc2UgewotICAgICAgICBfU2V0UGF0aFRvREMobV9oREMsIHBQYXRoRGF0YSwgcE1hdHJpeCk7Ci0gICAgICAgIGlmIChwR3JhcGhTdGF0ZSAmJiBzdHJva2VfYWxwaGEpIHsKLSAgICAgICAgICAgIGlmIChmaWxsX21vZGUgJiYgZmlsbF9hbHBoYSkgewotICAgICAgICAgICAgICAgIGlmIChvbGRfZmlsbF9tb2RlICYgRlhfRklMTF9URVhUX01PREUpIHsKLSAgICAgICAgICAgICAgICAgICAgU3Ryb2tlQW5kRmlsbFBhdGgobV9oREMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGxQYXRoKG1faERDKTsKLSAgICAgICAgICAgICAgICAgICAgX1NldFBhdGhUb0RDKG1faERDLCBwUGF0aERhdGEsIHBNYXRyaXgpOwotICAgICAgICAgICAgICAgICAgICBTdHJva2VQYXRoKG1faERDKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cm9rZVBhdGgobV9oREMpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGZpbGxfbW9kZSAmJiBmaWxsX2FscGhhKSB7Ci0gICAgICAgICAgICBGaWxsUGF0aChtX2hEQyk7Ci0gICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFN0cm9rZVBhdGgobV9oREMpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoZmlsbF9tb2RlICYmIGZpbGxfYWxwaGEpIHsKKyAgICAgIEZpbGxQYXRoKG1faERDKTsKICAgICB9Ci0gICAgaWYgKGhQZW4pIHsKLSAgICAgICAgaFBlbiA9IChIUEVOKVNlbGVjdE9iamVjdChtX2hEQywgaFBlbik7Ci0gICAgICAgIERlbGV0ZU9iamVjdChoUGVuKTsKLSAgICB9Ci0gICAgaWYgKGhCcnVzaCkgewotICAgICAgICBoQnJ1c2ggPSAoSEJSVVNIKVNlbGVjdE9iamVjdChtX2hEQywgaEJydXNoKTsKLSAgICAgICAgRGVsZXRlT2JqZWN0KGhCcnVzaCk7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDR2RpRGV2aWNlRHJpdmVyOjpGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgRlhfRFdPUkQgZmlsbF9jb2xvciwgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQotewotICAgIGlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIF9Db2xvcjJBcmdiKGZpbGxfY29sb3IsIGZpbGxfY29sb3IsIGFscGhhX2ZsYWcgfCAoMSA8PCAyNCksIHBJY2NUcmFuc2Zvcm0pOwotICAgIGludCBhbHBoYTsKLSAgICBGWF9DT0xPUlJFRiByZ2I7Ci0gICAgQXJnYkRlY29kZShmaWxsX2NvbG9yLCBhbHBoYSwgcmdiKTsKLSAgICBpZiAoYWxwaGEgPT0gMCkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgaWYgKGFscGhhIDwgMjU1KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgSEJSVVNIIGhCcnVzaCA9IENyZWF0ZVNvbGlkQnJ1c2gocmdiKTsKLSAgICA6OkZpbGxSZWN0KG1faERDLCAoUkVDVCopcFJlY3QsIGhCcnVzaCk7CisgIH0KKyAgaWYgKGhQZW4pIHsKKyAgICBoUGVuID0gKEhQRU4pU2VsZWN0T2JqZWN0KG1faERDLCBoUGVuKTsKKyAgICBEZWxldGVPYmplY3QoaFBlbik7CisgIH0KKyAgaWYgKGhCcnVzaCkgeworICAgIGhCcnVzaCA9IChIQlJVU0gpU2VsZWN0T2JqZWN0KG1faERDLCBoQnJ1c2gpOwogICAgIERlbGV0ZU9iamVjdChoQnJ1c2gpOworICB9CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDR2RpRGV2aWNlRHJpdmVyOjpGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7CisgIGlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBfQ29sb3IyQXJnYihmaWxsX2NvbG9yLCBmaWxsX2NvbG9yLCBhbHBoYV9mbGFnIHwgKDEgPDwgMjQpLCBwSWNjVHJhbnNmb3JtKTsKKyAgaW50IGFscGhhOworICBGWF9DT0xPUlJFRiByZ2I7CisgIEFyZ2JEZWNvZGUoZmlsbF9jb2xvciwgYWxwaGEsIHJnYik7CisgIGlmIChhbHBoYSA9PSAwKSB7CiAgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKGFscGhhIDwgMjU1KSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEhCUlVTSCBoQnJ1c2ggPSBDcmVhdGVTb2xpZEJydXNoKHJnYik7CisgIDo6RmlsbFJlY3QobV9oREMsIChSRUNUKilwUmVjdCwgaEJydXNoKTsKKyAgRGVsZXRlT2JqZWN0KGhCcnVzaCk7CisgIHJldHVybiBUUlVFOwogfQogRlhfQk9PTCBDR2RpRGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAotICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAotICAgICAgICBpbnQgZmlsbF9tb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgaWYgKHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID09IDUpIHsKLSAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0ZjsKLSAgICAgICAgaWYgKHBQYXRoRGF0YS0+SXNSZWN0KHBNYXRyaXgsICZyZWN0ZikpIHsKLSAgICAgICAgICAgIEZYX1JFQ1QgcmVjdCA9IHJlY3RmLkdldE91dHRlclJlY3QoKTsKLSAgICAgICAgICAgIEludGVyc2VjdENsaXBSZWN0KG1faERDLCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSkgeworICBpZiAocFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgPT0gNSkgeworICAgIENGWF9GbG9hdFJlY3QgcmVjdGY7CisgICAgaWYgKHBQYXRoRGF0YS0+SXNSZWN0KHBNYXRyaXgsICZyZWN0ZikpIHsKKyAgICAgIEZYX1JFQ1QgcmVjdCA9IHJlY3RmLkdldE91dHRlclJlY3QoKTsKKyAgICAgIEludGVyc2VjdENsaXBSZWN0KG1faERDLCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7CisgICAgICByZXR1cm4gVFJVRTsKICAgICB9Ci0gICAgX1NldFBhdGhUb0RDKG1faERDLCBwUGF0aERhdGEsIHBNYXRyaXgpOwotICAgIFNldFBvbHlGaWxsTW9kZShtX2hEQywgZmlsbF9tb2RlICYgMyk7Ci0gICAgU2VsZWN0Q2xpcFBhdGgobV9oREMsIFJHTl9BTkQpOwotICAgIHJldHVybiBUUlVFOworICB9CisgIF9TZXRQYXRoVG9EQyhtX2hEQywgcFBhdGhEYXRhLCBwTWF0cml4KTsKKyAgU2V0UG9seUZpbGxNb2RlKG1faERDLCBmaWxsX21vZGUgJiAzKTsKKyAgU2VsZWN0Q2xpcFBhdGgobV9oREMsIFJHTl9BTkQpOworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6U2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAotICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAotICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICBIUEVOIGhQZW4gPSBfQ3JlYXRlUGVuKHBHcmFwaFN0YXRlLCBwTWF0cml4LCAweGZmMDAwMDAwKTsKLSAgICBoUGVuID0gKEhQRU4pU2VsZWN0T2JqZWN0KG1faERDLCBoUGVuKTsKLSAgICBfU2V0UGF0aFRvREMobV9oREMsIHBQYXRoRGF0YSwgcE1hdHJpeCk7Ci0gICAgV2lkZW5QYXRoKG1faERDKTsKLSAgICBTZXRQb2x5RmlsbE1vZGUobV9oREMsIFdJTkRJTkcpOwotICAgIEZYX0JPT0wgcmV0ID0gU2VsZWN0Q2xpcFBhdGgobV9oREMsIFJHTl9BTkQpOwotICAgIGhQZW4gPSAoSFBFTilTZWxlY3RPYmplY3QobV9oREMsIGhQZW4pOwotICAgIERlbGV0ZU9iamVjdChoUGVuKTsKLSAgICByZXR1cm4gcmV0OworRlhfQk9PTCBDR2RpRGV2aWNlRHJpdmVyOjpTZXRDbGlwX1BhdGhTdHJva2UoCisgICAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKKyAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlKSB7CisgIEhQRU4gaFBlbiA9IF9DcmVhdGVQZW4ocEdyYXBoU3RhdGUsIHBNYXRyaXgsIDB4ZmYwMDAwMDApOworICBoUGVuID0gKEhQRU4pU2VsZWN0T2JqZWN0KG1faERDLCBoUGVuKTsKKyAgX1NldFBhdGhUb0RDKG1faERDLCBwUGF0aERhdGEsIHBNYXRyaXgpOworICBXaWRlblBhdGgobV9oREMpOworICBTZXRQb2x5RmlsbE1vZGUobV9oREMsIFdJTkRJTkcpOworICBGWF9CT09MIHJldCA9IFNlbGVjdENsaXBQYXRoKG1faERDLCBSR05fQU5EKTsKKyAgaFBlbiA9IChIUEVOKVNlbGVjdE9iamVjdChtX2hEQywgaFBlbik7CisgIERlbGV0ZU9iamVjdChoUGVuKTsKKyAgcmV0dXJuIHJldDsKIH0KLUZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6RHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsCi0gICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQJYmxlbmRfdHlwZSkKLXsKLSAgICBpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBfQ29sb3IyQXJnYihjb2xvciwgY29sb3IsIGFscGhhX2ZsYWcgfCAoMSA8PCAyNCksIHBJY2NUcmFuc2Zvcm0pOwotICAgIGludCBhOwotICAgIEZYX0NPTE9SUkVGIHJnYjsKLSAgICBBcmdiRGVjb2RlKGNvbG9yLCBhLCByZ2IpOwotICAgIGlmIChhID09IDApIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIEhQRU4gaFBlbiA9IENyZWF0ZVBlbihQU19TT0xJRCwgMSwgcmdiKTsKLSAgICBoUGVuID0gKEhQRU4pU2VsZWN0T2JqZWN0KG1faERDLCBoUGVuKTsKLSAgICBNb3ZlVG9FeChtX2hEQywgRlhTWVNfcm91bmQoeDEpLCBGWFNZU19yb3VuZCh5MSksIE5VTEwpOwotICAgIExpbmVUbyhtX2hEQywgRlhTWVNfcm91bmQoeDIpLCBGWFNZU19yb3VuZCh5MikpOwotICAgIGhQZW4gPSAoSFBFTilTZWxlY3RPYmplY3QobV9oREMsIGhQZW4pOwotICAgIERlbGV0ZU9iamVjdChoUGVuKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6RGVsZXRlRGV2aWNlUmduKEZYX0xQVk9JRCBwUmduKQotewotICAgIERlbGV0ZU9iamVjdCgoSEdESU9CSilwUmduKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUNHZGlEaXNwbGF5RHJpdmVyOjpDR2RpRGlzcGxheURyaXZlcihIREMgaERDKSA6IENHZGlEZXZpY2VEcml2ZXIoaERDLCBGWERDX0RJU1BMQVkpCi17Ci0gICAgQ1dpbjMyUGxhdGZvcm0qIHBQbGF0Zm9ybSA9IChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCk7Ci0gICAgaWYgKHBQbGF0Zm9ybS0+bV9HZGlwbHVzRXh0LklzQXZhaWxhYmxlKCkpIHsKLSAgICAgICAgbV9SZW5kZXJDYXBzIHw9IEZYUkNfQUxQSEFfUEFUSCB8IEZYUkNfQUxQSEFfSU1BR0U7Ci0gICAgfQotfQotRlhfQk9PTCBDR2RpRGlzcGxheURyaXZlcjo6R2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3AsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIEZYX0JPT0wgYkRFZGdlKQotewotICAgIEZYX0JPT0wgcmV0ID0gRkFMU0U7Ci0gICAgaW50IHdpZHRoID0gcEJpdG1hcC0+R2V0V2lkdGgoKTsKLSAgICBpbnQgaGVpZ2h0ID0gcEJpdG1hcC0+R2V0SGVpZ2h0KCk7Ci0gICAgSEJJVE1BUCBoYm1wID0gQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcChtX2hEQywgd2lkdGgsIGhlaWdodCk7Ci0gICAgSERDIGhEQ01lbW9yeSA9IENyZWF0ZUNvbXBhdGlibGVEQyhtX2hEQyk7Ci0gICAgSEJJVE1BUCBob2xkYm1wICA9IChIQklUTUFQKVNlbGVjdE9iamVjdChoRENNZW1vcnksIGhibXApOwotICAgIEJpdEJsdChoRENNZW1vcnksIDAsIDAsIHdpZHRoLCBoZWlnaHQsIG1faERDLCBsZWZ0LCB0b3AsIFNSQ0NPUFkpOwotICAgIFNlbGVjdE9iamVjdChoRENNZW1vcnksIGhvbGRibXApOwotICAgIEJJVE1BUElORk8gYm1pOwotICAgIEZYU1lTX21lbXNldDMyKCZibWksIDAsIHNpemVvZiBibWkpOwotICAgIGJtaS5ibWlIZWFkZXIuYmlTaXplID0gc2l6ZW9mIGJtaS5ibWlIZWFkZXI7Ci0gICAgYm1pLmJtaUhlYWRlci5iaUJpdENvdW50ID0gcEJpdG1hcC0+R2V0QlBQKCk7Ci0gICAgYm1pLmJtaUhlYWRlci5iaUhlaWdodCA9IC1oZWlnaHQ7Ci0gICAgYm1pLmJtaUhlYWRlci5iaVBsYW5lcyA9IDE7Ci0gICAgYm1pLmJtaUhlYWRlci5iaVdpZHRoID0gd2lkdGg7Ci0gICAgaWYgKCFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpIHx8ICFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKSkgewotICAgICAgICBwSWNjVHJhbnNmb3JtID0gTlVMTDsKLSAgICB9Ci0gICAgaWYgKHBCaXRtYXAtPkdldEJQUCgpID4gOCAmJiAhcEJpdG1hcC0+SXNDbXlrSW1hZ2UoKSAmJiBwSWNjVHJhbnNmb3JtID09IE5VTEwpIHsKLSAgICAgICAgcmV0ID0gOjpHZXRESUJpdHMoaERDTWVtb3J5LCBoYm1wLCAwLCBoZWlnaHQsIHBCaXRtYXAtPkdldEJ1ZmZlcigpLCAmYm1pLCBESUJfUkdCX0NPTE9SUykgPT0gaGVpZ2h0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIENGWF9ESUJpdG1hcCBiaXRtYXA7Ci0gICAgICAgIGlmIChiaXRtYXAuQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCX1JnYikpIHsKLSAgICAgICAgICAgIGJtaS5ibWlIZWFkZXIuYmlCaXRDb3VudCA9IDI0OwotICAgICAgICAgICAgOjpHZXRESUJpdHMoaERDTWVtb3J5LCBoYm1wLCAwLCBoZWlnaHQsIGJpdG1hcC5HZXRCdWZmZXIoKSwgJmJtaSwgRElCX1JHQl9DT0xPUlMpOwotICAgICAgICAgICAgcmV0ID0gcEJpdG1hcC0+VHJhbnNmZXJCaXRtYXAoMCwgMCwgd2lkdGgsIGhlaWdodCwgJmJpdG1hcCwgMCwgMCwgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocEJpdG1hcC0+SGFzQWxwaGEoKSAmJiByZXQpIHsKLSAgICAgICAgcEJpdG1hcC0+TG9hZENoYW5uZWwoRlhESUJfQWxwaGEsIDB4ZmYpOwotICAgIH0KLSAgICBEZWxldGVPYmplY3QoaGJtcCk7Ci0gICAgRGVsZXRlT2JqZWN0KGhEQ01lbW9yeSk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLUZYX0JPT0wgQ0dkaURpc3BsYXlEcml2ZXI6OlNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBBU1NFUlQoYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9OT1JNQUwpOwotICAgIGlmIChwU291cmNlLT5Jc0FscGhhTWFzaygpKSB7Ci0gICAgICAgIGludCB3aWR0aCA9IHBTb3VyY2UtPkdldFdpZHRoKCksIGhlaWdodCA9IHBTb3VyY2UtPkdldEhlaWdodCgpOwotICAgICAgICBpbnQgYWxwaGEgPSBGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShjb2xvcik7Ci0gICAgICAgIEZYX0JPT0wgYkdESSA9IHBTb3VyY2UtPkdldEJQUCgpID09IDEgJiYgYWxwaGEgPT0gMjU1OwotICAgICAgICBpZiAoIWJHREkpIHsKLSAgICAgICAgICAgIENGWF9ESUJpdG1hcCBiYWNrZ3JvdW5kOwotICAgICAgICAgICAgaWYgKCFiYWNrZ3JvdW5kLkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9SZ2IzMikgfHwKLSAgICAgICAgICAgICAgICAgICAgIUdldERJQml0cygmYmFja2dyb3VuZCwgbGVmdCwgdG9wLCBOVUxMKSB8fAotICAgICAgICAgICAgICAgICAgICAhYmFja2dyb3VuZC5Db21wb3NpdGVNYXNrKDAsIDAsIHdpZHRoLCBoZWlnaHQsIHBTb3VyY2UsIGNvbG9yLCAwLCAwLCBGWERJQl9CTEVORF9OT1JNQUwsIE5VTEwsIEZBTFNFLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICByZXR1cm4gU2V0RElCaXRzKCZiYWNrZ3JvdW5kLCAwLCAmc3JjX3JlY3QsIGxlZnQsIHRvcCwgRlhESUJfQkxFTkRfTk9STUFMLCAwLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBGWF9SRUNUIGNsaXBfcmVjdChsZWZ0LCB0b3AsIGxlZnQgKyBwU3JjUmVjdC0+V2lkdGgoKSwgdG9wICsgcFNyY1JlY3QtPkhlaWdodCgpKTsKLSAgICAgICAgcmV0dXJuIFN0cmV0Y2hESUJpdHMocFNvdXJjZSwgY29sb3IsIGxlZnQgLSBwU3JjUmVjdC0+bGVmdCwgdG9wIC0gcFNyY1JlY3QtPnRvcCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsaXBfcmVjdCwgMCwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgRlhESUJfQkxFTkRfTk9STUFMKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgd2lkdGggPSBwU3JjUmVjdC0+V2lkdGgoKSwgaGVpZ2h0ID0gcFNyY1JlY3QtPkhlaWdodCgpOwotICAgICAgICBpZiAocFNvdXJjZS0+SGFzQWxwaGEoKSkgewotICAgICAgICAgICAgQ0ZYX0RJQml0bWFwIGJpdG1hcDsKLSAgICAgICAgICAgIGlmICghYml0bWFwLkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9SZ2IpIHx8Ci0gICAgICAgICAgICAgICAgICAgICFHZXRESUJpdHMoJmJpdG1hcCwgbGVmdCwgdG9wLCBOVUxMKSB8fAotICAgICAgICAgICAgICAgICAgICAhYml0bWFwLkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCB3aWR0aCwgaGVpZ2h0LCBwU291cmNlLCBwU3JjUmVjdC0+bGVmdCwgcFNyY1JlY3QtPnRvcCwgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMLCBGQUxTRSwgcEljY1RyYW5zZm9ybSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgcmV0dXJuIFNldERJQml0cygmYml0bWFwLCAwLCAmc3JjX3JlY3QsIGxlZnQsIHRvcCwgRlhESUJfQkxFTkRfTk9STUFMLCAwLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBDRlhfRElCRXh0cmFjdG9yIHRlbXAocFNvdXJjZSk7Ci0gICAgICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IHRlbXA7Ci0gICAgICAgIGlmIChwQml0bWFwKSB7Ci0gICAgICAgICAgICByZXR1cm4gR0RJX1NldERJQml0cyhwQml0bWFwLCBwU3JjUmVjdCwgbGVmdCwgdG9wLCBwSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgfQotICAgIH0KK0ZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6RHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7CisgIGlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkgewogICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBfQ29sb3IyQXJnYihjb2xvciwgY29sb3IsIGFscGhhX2ZsYWcgfCAoMSA8PCAyNCksIHBJY2NUcmFuc2Zvcm0pOworICBpbnQgYTsKKyAgRlhfQ09MT1JSRUYgcmdiOworICBBcmdiRGVjb2RlKGNvbG9yLCBhLCByZ2IpOworICBpZiAoYSA9PSAwKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgSFBFTiBoUGVuID0gQ3JlYXRlUGVuKFBTX1NPTElELCAxLCByZ2IpOworICBoUGVuID0gKEhQRU4pU2VsZWN0T2JqZWN0KG1faERDLCBoUGVuKTsKKyAgTW92ZVRvRXgobV9oREMsIEZYU1lTX3JvdW5kKHgxKSwgRlhTWVNfcm91bmQoeTEpLCBOVUxMKTsKKyAgTGluZVRvKG1faERDLCBGWFNZU19yb3VuZCh4MiksIEZYU1lTX3JvdW5kKHkyKSk7CisgIGhQZW4gPSAoSFBFTilTZWxlY3RPYmplY3QobV9oREMsIGhQZW4pOworICBEZWxldGVPYmplY3QoaFBlbik7CisgIHJldHVybiBUUlVFOwogfQotRlhfQk9PTCBDR2RpRGlzcGxheURyaXZlcjo6VXNlRm94aXRTdHJldGNoRW5naW5lKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCi0gICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgaW50IHJlbmRlcl9mbGFncywKLSAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQotewotICAgIEZYX1JFQ1QgYml0bWFwX2NsaXAgPSAqcENsaXBSZWN0OwotICAgIGlmIChkZXN0X3dpZHRoIDwgMCkgewotICAgICAgICBkZXN0X2xlZnQgKz0gZGVzdF93aWR0aDsKK0ZYX0JPT0wgQ0dkaURldmljZURyaXZlcjo6RGVsZXRlRGV2aWNlUmduKHZvaWQqIHBSZ24pIHsKKyAgRGVsZXRlT2JqZWN0KChIR0RJT0JKKXBSZ24pOworICByZXR1cm4gVFJVRTsKK30KK0NHZGlEaXNwbGF5RHJpdmVyOjpDR2RpRGlzcGxheURyaXZlcihIREMgaERDKQorICAgIDogQ0dkaURldmljZURyaXZlcihoREMsIEZYRENfRElTUExBWSkgeworICBDV2luMzJQbGF0Zm9ybSogcFBsYXRmb3JtID0KKyAgICAgIChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCk7CisgIGlmIChwUGxhdGZvcm0tPm1fR2RpcGx1c0V4dC5Jc0F2YWlsYWJsZSgpKSB7CisgICAgbV9SZW5kZXJDYXBzIHw9IEZYUkNfQUxQSEFfUEFUSCB8IEZYUkNfQUxQSEFfSU1BR0U7CisgIH0KK30KK0ZYX0JPT0wgQ0dkaURpc3BsYXlEcml2ZXI6OkdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRFZGdlKSB7CisgIEZYX0JPT0wgcmV0ID0gRkFMU0U7CisgIGludCB3aWR0aCA9IHBCaXRtYXAtPkdldFdpZHRoKCk7CisgIGludCBoZWlnaHQgPSBwQml0bWFwLT5HZXRIZWlnaHQoKTsKKyAgSEJJVE1BUCBoYm1wID0gQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcChtX2hEQywgd2lkdGgsIGhlaWdodCk7CisgIEhEQyBoRENNZW1vcnkgPSBDcmVhdGVDb21wYXRpYmxlREMobV9oREMpOworICBIQklUTUFQIGhvbGRibXAgPSAoSEJJVE1BUClTZWxlY3RPYmplY3QoaERDTWVtb3J5LCBoYm1wKTsKKyAgQml0Qmx0KGhEQ01lbW9yeSwgMCwgMCwgd2lkdGgsIGhlaWdodCwgbV9oREMsIGxlZnQsIHRvcCwgU1JDQ09QWSk7CisgIFNlbGVjdE9iamVjdChoRENNZW1vcnksIGhvbGRibXApOworICBCSVRNQVBJTkZPIGJtaTsKKyAgRlhTWVNfbWVtc2V0KCZibWksIDAsIHNpemVvZiBibWkpOworICBibWkuYm1pSGVhZGVyLmJpU2l6ZSA9IHNpemVvZiBibWkuYm1pSGVhZGVyOworICBibWkuYm1pSGVhZGVyLmJpQml0Q291bnQgPSBwQml0bWFwLT5HZXRCUFAoKTsKKyAgYm1pLmJtaUhlYWRlci5iaUhlaWdodCA9IC1oZWlnaHQ7CisgIGJtaS5ibWlIZWFkZXIuYmlQbGFuZXMgPSAxOworICBibWkuYm1pSGVhZGVyLmJpV2lkdGggPSB3aWR0aDsKKyAgaWYgKCFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpIHx8CisgICAgICAhQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCkpIHsKKyAgICBwSWNjVHJhbnNmb3JtID0gTlVMTDsKKyAgfQorICBpZiAocEJpdG1hcC0+R2V0QlBQKCkgPiA4ICYmICFwQml0bWFwLT5Jc0NteWtJbWFnZSgpICYmICFwSWNjVHJhbnNmb3JtKSB7CisgICAgcmV0ID0gOjpHZXRESUJpdHMoaERDTWVtb3J5LCBoYm1wLCAwLCBoZWlnaHQsIHBCaXRtYXAtPkdldEJ1ZmZlcigpLCAmYm1pLAorICAgICAgICAgICAgICAgICAgICAgIERJQl9SR0JfQ09MT1JTKSA9PSBoZWlnaHQ7CisgIH0gZWxzZSB7CisgICAgQ0ZYX0RJQml0bWFwIGJpdG1hcDsKKyAgICBpZiAoYml0bWFwLkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9SZ2IpKSB7CisgICAgICBibWkuYm1pSGVhZGVyLmJpQml0Q291bnQgPSAyNDsKKyAgICAgIDo6R2V0RElCaXRzKGhEQ01lbW9yeSwgaGJtcCwgMCwgaGVpZ2h0LCBiaXRtYXAuR2V0QnVmZmVyKCksICZibWksCisgICAgICAgICAgICAgICAgICBESUJfUkdCX0NPTE9SUyk7CisgICAgICByZXQgPSBwQml0bWFwLT5UcmFuc2ZlckJpdG1hcCgwLCAwLCB3aWR0aCwgaGVpZ2h0LCAmYml0bWFwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldCA9IEZBTFNFOwogICAgIH0KLSAgICBpZiAoZGVzdF9oZWlnaHQgPCAwKSB7Ci0gICAgICAgIGRlc3RfdG9wICs9IGRlc3RfaGVpZ2h0OworICB9CisgIGlmIChwQml0bWFwLT5IYXNBbHBoYSgpICYmIHJldCkgeworICAgIHBCaXRtYXAtPkxvYWRDaGFubmVsKEZYRElCX0FscGhhLCAweGZmKTsKKyAgfQorICBEZWxldGVPYmplY3QoaGJtcCk7CisgIERlbGV0ZU9iamVjdChoRENNZW1vcnkpOworICByZXR1cm4gcmV0OworfQorRlhfQk9PTCBDR2RpRGlzcGxheURyaXZlcjo6U2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIEFTU0VSVChibGVuZF90eXBlID09IEZYRElCX0JMRU5EX05PUk1BTCk7CisgIGlmIChwU291cmNlLT5Jc0FscGhhTWFzaygpKSB7CisgICAgaW50IHdpZHRoID0gcFNvdXJjZS0+R2V0V2lkdGgoKSwgaGVpZ2h0ID0gcFNvdXJjZS0+R2V0SGVpZ2h0KCk7CisgICAgaW50IGFscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKQorICAgICAgICAgICAgICAgICAgICA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpCisgICAgICAgICAgICAgICAgICAgIDogRlhBUkdCX0EoY29sb3IpOworICAgIEZYX0JPT0wgYkdESSA9IHBTb3VyY2UtPkdldEJQUCgpID09IDEgJiYgYWxwaGEgPT0gMjU1OworICAgIGlmICghYkdESSkgeworICAgICAgQ0ZYX0RJQml0bWFwIGJhY2tncm91bmQ7CisgICAgICBpZiAoIWJhY2tncm91bmQuQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCX1JnYjMyKSB8fAorICAgICAgICAgICFHZXRESUJpdHMoJmJhY2tncm91bmQsIGxlZnQsIHRvcCwgTlVMTCkgfHwKKyAgICAgICAgICAhYmFja2dyb3VuZC5Db21wb3NpdGVNYXNrKDAsIDAsIHdpZHRoLCBoZWlnaHQsIHBTb3VyY2UsIGNvbG9yLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMLCBGQUxTRSwgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJY2NUcmFuc2Zvcm0pKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgICByZXR1cm4gU2V0RElCaXRzKCZiYWNrZ3JvdW5kLCAwLCAmc3JjX3JlY3QsIGxlZnQsIHRvcCwgRlhESUJfQkxFTkRfTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMKTsKICAgICB9Ci0gICAgYml0bWFwX2NsaXAuT2Zmc2V0KC1kZXN0X2xlZnQsIC1kZXN0X3RvcCk7Ci0gICAgQ0ZYX0RJQml0bWFwKiBwU3RyZXRjaGVkID0gcFNvdXJjZS0+U3RyZXRjaFRvKGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCByZW5kZXJfZmxhZ3MsICZiaXRtYXBfY2xpcCk7Ci0gICAgaWYgKHBTdHJldGNoZWQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVFJVRTsKKyAgICBGWF9SRUNUIGNsaXBfcmVjdChsZWZ0LCB0b3AsIGxlZnQgKyBwU3JjUmVjdC0+V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICB0b3AgKyBwU3JjUmVjdC0+SGVpZ2h0KCkpOworICAgIHJldHVybiBTdHJldGNoRElCaXRzKHBTb3VyY2UsIGNvbG9yLCBsZWZ0IC0gcFNyY1JlY3QtPmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdG9wIC0gcFNyY1JlY3QtPnRvcCwgd2lkdGgsIGhlaWdodCwgJmNsaXBfcmVjdCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBGWERJQl9CTEVORF9OT1JNQUwpOworICB9CisgIGludCB3aWR0aCA9IHBTcmNSZWN0LT5XaWR0aCgpLCBoZWlnaHQgPSBwU3JjUmVjdC0+SGVpZ2h0KCk7CisgIGlmIChwU291cmNlLT5IYXNBbHBoYSgpKSB7CisgICAgQ0ZYX0RJQml0bWFwIGJpdG1hcDsKKyAgICBpZiAoIWJpdG1hcC5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfUmdiKSB8fAorICAgICAgICAhR2V0RElCaXRzKCZiaXRtYXAsIGxlZnQsIHRvcCwgTlVMTCkgfHwKKyAgICAgICAgIWJpdG1hcC5Db21wb3NpdGVCaXRtYXAoMCwgMCwgd2lkdGgsIGhlaWdodCwgcFNvdXJjZSwgcFNyY1JlY3QtPmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNSZWN0LT50b3AsIEZYRElCX0JMRU5EX05PUk1BTCwgTlVMTCwgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJY2NUcmFuc2Zvcm0pKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgcFN0cmV0Y2hlZC0+R2V0V2lkdGgoKSwgcFN0cmV0Y2hlZC0+R2V0SGVpZ2h0KCkpOwotICAgIEZYX0JPT0wgcmV0ID0gU2V0RElCaXRzKHBTdHJldGNoZWQsIGNvbG9yLCAmc3JjX3JlY3QsIHBDbGlwUmVjdC0+bGVmdCwgcENsaXBSZWN0LT50b3AsIEZYRElCX0JMRU5EX05PUk1BTCwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CisgICAgRlhfUkVDVCBzcmNfcmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICByZXR1cm4gU2V0RElCaXRzKCZiaXRtYXAsIDAsICZzcmNfcmVjdCwgbGVmdCwgdG9wLCBGWERJQl9CTEVORF9OT1JNQUwsIDAsCisgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgfQorICBDRlhfRElCRXh0cmFjdG9yIHRlbXAocFNvdXJjZSk7CisgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IHRlbXA7CisgIGlmIChwQml0bWFwKSB7CisgICAgcmV0dXJuIEdESV9TZXRESUJpdHMocEJpdG1hcCwgcFNyY1JlY3QsIGxlZnQsIHRvcCwgcEljY1RyYW5zZm9ybSk7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorRlhfQk9PTCBDR2RpRGlzcGxheURyaXZlcjo6VXNlRm94aXRTdHJldGNoRW5naW5lKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVuZGVyX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgRlhfUkVDVCBiaXRtYXBfY2xpcCA9ICpwQ2xpcFJlY3Q7CisgIGlmIChkZXN0X3dpZHRoIDwgMCkgeworICAgIGRlc3RfbGVmdCArPSBkZXN0X3dpZHRoOworICB9CisgIGlmIChkZXN0X2hlaWdodCA8IDApIHsKKyAgICBkZXN0X3RvcCArPSBkZXN0X2hlaWdodDsKKyAgfQorICBiaXRtYXBfY2xpcC5PZmZzZXQoLWRlc3RfbGVmdCwgLWRlc3RfdG9wKTsKKyAgQ0ZYX0RJQml0bWFwKiBwU3RyZXRjaGVkID0KKyAgICAgIHBTb3VyY2UtPlN0cmV0Y2hUbyhkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgcmVuZGVyX2ZsYWdzLCAmYml0bWFwX2NsaXApOworICBpZiAoIXBTdHJldGNoZWQpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIHBTdHJldGNoZWQtPkdldFdpZHRoKCksIHBTdHJldGNoZWQtPkdldEhlaWdodCgpKTsKKyAgRlhfQk9PTCByZXQgPQorICAgICAgU2V0RElCaXRzKHBTdHJldGNoZWQsIGNvbG9yLCAmc3JjX3JlY3QsIHBDbGlwUmVjdC0+bGVmdCwgcENsaXBSZWN0LT50b3AsCisgICAgICAgICAgICAgICAgRlhESUJfQkxFTkRfTk9STUFMLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKKyAgZGVsZXRlIHBTdHJldGNoZWQ7CisgIHJldHVybiByZXQ7Cit9CitGWF9CT09MIENHZGlEaXNwbGF5RHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgeworICBBU1NFUlQocFNvdXJjZSAmJiBwQ2xpcFJlY3QpOworICBpZiAoZmxhZ3MgfHwgZGVzdF93aWR0aCA+IDEwMDAwIHx8IGRlc3Rfd2lkdGggPCAtMTAwMDAgfHwKKyAgICAgIGRlc3RfaGVpZ2h0ID4gMTAwMDAgfHwgZGVzdF9oZWlnaHQgPCAtMTAwMDApIHsKKyAgICByZXR1cm4gVXNlRm94aXRTdHJldGNoRW5naW5lKHBTb3VyY2UsIGNvbG9yLCBkZXN0X2xlZnQsIGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIHBDbGlwUmVjdCwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKTsKKyAgfQorICBpZiAocFNvdXJjZS0+SXNBbHBoYU1hc2soKSkgeworICAgIEZYX1JFQ1QgaW1hZ2VfcmVjdDsKKyAgICBpbWFnZV9yZWN0LmxlZnQgPSBkZXN0X3dpZHRoID4gMCA/IGRlc3RfbGVmdCA6IGRlc3RfbGVmdCArIGRlc3Rfd2lkdGg7CisgICAgaW1hZ2VfcmVjdC5yaWdodCA9IGRlc3Rfd2lkdGggPiAwID8gZGVzdF9sZWZ0ICsgZGVzdF93aWR0aCA6IGRlc3RfbGVmdDsKKyAgICBpbWFnZV9yZWN0LnRvcCA9IGRlc3RfaGVpZ2h0ID4gMCA/IGRlc3RfdG9wIDogZGVzdF90b3AgKyBkZXN0X2hlaWdodDsKKyAgICBpbWFnZV9yZWN0LmJvdHRvbSA9IGRlc3RfaGVpZ2h0ID4gMCA/IGRlc3RfdG9wICsgZGVzdF9oZWlnaHQgOiBkZXN0X3RvcDsKKyAgICBGWF9SRUNUIGNsaXBfcmVjdCA9IGltYWdlX3JlY3Q7CisgICAgY2xpcF9yZWN0LkludGVyc2VjdCgqcENsaXBSZWN0KTsKKyAgICBjbGlwX3JlY3QuT2Zmc2V0KC1pbWFnZV9yZWN0LmxlZnQsIC1pbWFnZV9yZWN0LnRvcCk7CisgICAgaW50IGNsaXBfd2lkdGggPSBjbGlwX3JlY3QuV2lkdGgoKSwgY2xpcF9oZWlnaHQgPSBjbGlwX3JlY3QuSGVpZ2h0KCk7CisgICAgQ0ZYX0RJQml0bWFwKiBwU3RyZXRjaGVkID0KKyAgICAgICAgcFNvdXJjZS0+U3RyZXRjaFRvKGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBmbGFncywgJmNsaXBfcmVjdCk7CisgICAgaWYgKCFwU3RyZXRjaGVkKSB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgQ0ZYX0RJQml0bWFwIGJhY2tncm91bmQ7CisgICAgaWYgKCFiYWNrZ3JvdW5kLkNyZWF0ZShjbGlwX3dpZHRoLCBjbGlwX2hlaWdodCwgRlhESUJfUmdiMzIpIHx8CisgICAgICAgICFHZXRESUJpdHMoJmJhY2tncm91bmQsIGltYWdlX3JlY3QubGVmdCArIGNsaXBfcmVjdC5sZWZ0LAorICAgICAgICAgICAgICAgICAgIGltYWdlX3JlY3QudG9wICsgY2xpcF9yZWN0LnRvcCwgTlVMTCkgfHwKKyAgICAgICAgIWJhY2tncm91bmQuQ29tcG9zaXRlTWFzaygwLCAwLCBjbGlwX3dpZHRoLCBjbGlwX2hlaWdodCwgcFN0cmV0Y2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciwgMCwgMCwgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMLCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgeworICAgICAgZGVsZXRlIHBTdHJldGNoZWQ7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgY2xpcF93aWR0aCwgY2xpcF9oZWlnaHQpOworICAgIEZYX0JPT0wgcmV0ID0KKyAgICAgICAgU2V0RElCaXRzKCZiYWNrZ3JvdW5kLCAwLCAmc3JjX3JlY3QsIGltYWdlX3JlY3QubGVmdCArIGNsaXBfcmVjdC5sZWZ0LAorICAgICAgICAgICAgICAgICAgaW1hZ2VfcmVjdC50b3AgKyBjbGlwX3JlY3QudG9wLCBGWERJQl9CTEVORF9OT1JNQUwsIDAsIE5VTEwpOwogICAgIGRlbGV0ZSBwU3RyZXRjaGVkOwogICAgIHJldHVybiByZXQ7CisgIH0KKyAgaWYgKHBTb3VyY2UtPkhhc0FscGhhKCkpIHsKKyAgICBDV2luMzJQbGF0Zm9ybSogcFBsYXRmb3JtID0KKyAgICAgICAgKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKTsKKyAgICBpZiAocFBsYXRmb3JtLT5tX0dkaXBsdXNFeHQuSXNBdmFpbGFibGUoKSAmJiAhcEljY1RyYW5zZm9ybSAmJgorICAgICAgICAhcFNvdXJjZS0+SXNDbXlrSW1hZ2UoKSkgeworICAgICAgQ0ZYX0RJQkV4dHJhY3RvciB0ZW1wKHBTb3VyY2UpOworICAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gdGVtcDsKKyAgICAgIGlmICghcEJpdG1hcCkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICByZXR1cm4gcFBsYXRmb3JtLT5tX0dkaXBsdXNFeHQuU3RyZXRjaERJQml0cygKKyAgICAgICAgICBtX2hEQywgcEJpdG1hcCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsCisgICAgICAgICAgcENsaXBSZWN0LCBmbGFncyk7CisgICAgfQorICAgIHJldHVybiBVc2VGb3hpdFN0cmV0Y2hFbmdpbmUocFNvdXJjZSwgY29sb3IsIGRlc3RfbGVmdCwgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgcENsaXBSZWN0LCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX3R5cGUpOworICB9CisgIENGWF9ESUJFeHRyYWN0b3IgdGVtcChwU291cmNlKTsKKyAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gdGVtcDsKKyAgaWYgKHBCaXRtYXApIHsKKyAgICByZXR1cm4gR0RJX1N0cmV0Y2hESUJpdHMocEJpdG1hcCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9oZWlnaHQsIGZsYWdzLCBwSWNjVHJhbnNmb3JtKTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1GWF9CT09MIENHZGlEaXNwbGF5RHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCi0gICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgRlhfRFdPUkQgZmxhZ3MsCi0gICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKLXsKLSAgICBBU1NFUlQocFNvdXJjZSAhPSBOVUxMICYmIHBDbGlwUmVjdCAhPSBOVUxMKTsKLSAgICBpZiAoZmxhZ3MgfHwgZGVzdF93aWR0aCA+IDEwMDAwIHx8IGRlc3Rfd2lkdGggPCAtMTAwMDAgfHwgZGVzdF9oZWlnaHQgPiAxMDAwMCB8fCBkZXN0X2hlaWdodCA8IC0xMDAwMCkKLSAgICAgICAgcmV0dXJuIFVzZUZveGl0U3RyZXRjaEVuZ2luZShwU291cmNlLCBjb2xvciwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBSZWN0LCBmbGFncywgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSk7Ci0gICAgaWYgKHBTb3VyY2UtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgRlhfUkVDVCBpbWFnZV9yZWN0OwotICAgICAgICBpbWFnZV9yZWN0LmxlZnQgPSBkZXN0X3dpZHRoID4gMCA/IGRlc3RfbGVmdCA6IGRlc3RfbGVmdCArIGRlc3Rfd2lkdGg7Ci0gICAgICAgIGltYWdlX3JlY3QucmlnaHQgPSBkZXN0X3dpZHRoID4gMCA/IGRlc3RfbGVmdCArIGRlc3Rfd2lkdGggOiBkZXN0X2xlZnQ7Ci0gICAgICAgIGltYWdlX3JlY3QudG9wID0gZGVzdF9oZWlnaHQgPiAwID8gZGVzdF90b3AgOiBkZXN0X3RvcCArIGRlc3RfaGVpZ2h0OwotICAgICAgICBpbWFnZV9yZWN0LmJvdHRvbSA9IGRlc3RfaGVpZ2h0ID4gMCA/IGRlc3RfdG9wICsgZGVzdF9oZWlnaHQgOiBkZXN0X3RvcDsKLSAgICAgICAgRlhfUkVDVCBjbGlwX3JlY3QgPSBpbWFnZV9yZWN0OwotICAgICAgICBjbGlwX3JlY3QuSW50ZXJzZWN0KCpwQ2xpcFJlY3QpOwotICAgICAgICBjbGlwX3JlY3QuT2Zmc2V0KC1pbWFnZV9yZWN0LmxlZnQsIC1pbWFnZV9yZWN0LnRvcCk7Ci0gICAgICAgIGludCBjbGlwX3dpZHRoID0gY2xpcF9yZWN0LldpZHRoKCksIGNsaXBfaGVpZ2h0ID0gY2xpcF9yZWN0LkhlaWdodCgpOwotICAgICAgICBDRlhfRElCaXRtYXAqIHBTdHJldGNoZWQgPSBwU291cmNlLT5TdHJldGNoVG8oZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIGZsYWdzLCAmY2xpcF9yZWN0KTsKLSAgICAgICAgaWYgKHBTdHJldGNoZWQgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0RJQml0bWFwIGJhY2tncm91bmQ7Ci0gICAgICAgIGlmICghYmFja2dyb3VuZC5DcmVhdGUoY2xpcF93aWR0aCwgY2xpcF9oZWlnaHQsIEZYRElCX1JnYjMyKSB8fAotICAgICAgICAgICAgICAgICFHZXRESUJpdHMoJmJhY2tncm91bmQsIGltYWdlX3JlY3QubGVmdCArIGNsaXBfcmVjdC5sZWZ0LCBpbWFnZV9yZWN0LnRvcCArIGNsaXBfcmVjdC50b3AsIE5VTEwpIHx8Ci0gICAgICAgICAgICAgICAgIWJhY2tncm91bmQuQ29tcG9zaXRlTWFzaygwLCAwLCBjbGlwX3dpZHRoLCBjbGlwX2hlaWdodCwgcFN0cmV0Y2hlZCwgY29sb3IsIDAsIDAsIEZYRElCX0JMRU5EX05PUk1BTCwgTlVMTCwgRkFMU0UsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgICAgICAgICBkZWxldGUgcFN0cmV0Y2hlZDsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIGNsaXBfd2lkdGgsIGNsaXBfaGVpZ2h0KTsKLSAgICAgICAgRlhfQk9PTCByZXQgPSBTZXRESUJpdHMoJmJhY2tncm91bmQsIDAsICZzcmNfcmVjdCwgaW1hZ2VfcmVjdC5sZWZ0ICsgY2xpcF9yZWN0LmxlZnQsIGltYWdlX3JlY3QudG9wICsgY2xpcF9yZWN0LnRvcCwgRlhESUJfQkxFTkRfTk9STUFMLCAwLCBOVUxMKTsKLSAgICAgICAgZGVsZXRlIHBTdHJldGNoZWQ7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHBTb3VyY2UtPkhhc0FscGhhKCkpIHsKLSAgICAgICAgICAgIENXaW4zMlBsYXRmb3JtKiBwUGxhdGZvcm0gPSAoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpOwotICAgICAgICAgICAgaWYgKHBQbGF0Zm9ybS0+bV9HZGlwbHVzRXh0LklzQXZhaWxhYmxlKCkgJiYgcEljY1RyYW5zZm9ybSA9PSBOVUxMICYmICFwU291cmNlLT5Jc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgICAgICAgICAgQ0ZYX0RJQkV4dHJhY3RvciB0ZW1wKHBTb3VyY2UpOwotICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IHRlbXA7Ci0gICAgICAgICAgICAgICAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBwUGxhdGZvcm0tPm1fR2RpcGx1c0V4dC5TdHJldGNoRElCaXRzKG1faERDLCBwQml0bWFwLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgcENsaXBSZWN0LCBmbGFncyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gVXNlRm94aXRTdHJldGNoRW5naW5lKHBTb3VyY2UsIGNvbG9yLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaXBSZWN0LCBmbGFncywgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0RJQkV4dHJhY3RvciB0ZW1wKHBTb3VyY2UpOwotICAgICAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSB0ZW1wOwotICAgICAgICBpZiAocEJpdG1hcCkgewotICAgICAgICAgICAgcmV0dXJuIEdESV9TdHJldGNoRElCaXRzKHBCaXRtYXAsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBmbGFncywgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgIH0KKyNkZWZpbmUgR0VUX1BTX0ZFQVRVUkVTRVRUSU5HIDQxMjEKKyNkZWZpbmUgRkVBVFVSRVNFVFRJTkdfUFNMRVZFTCAyCitpbnQgR2V0UFNMZXZlbChIREMgaERDKSB7CisgIGludCBkZXZpY2VfdHlwZSA9IDo6R2V0RGV2aWNlQ2FwcyhoREMsIFRFQ0hOT0xPR1kpOworICBpZiAoZGV2aWNlX3R5cGUgIT0gRFRfUkFTUFJJTlRFUikgeworICAgIHJldHVybiAwOworICB9CisgIEZYX0RXT1JEIGVzYyA9IEdFVF9QU19GRUFUVVJFU0VUVElORzsKKyAgaWYgKEV4dEVzY2FwZShoREMsIFFVRVJZRVNDU1VQUE9SVCwgc2l6ZW9mIGVzYywgKGNoYXIqKSZlc2MsIDAsIE5VTEwpKSB7CisgICAgaW50IHBhcmFtID0gRkVBVFVSRVNFVFRJTkdfUFNMRVZFTDsKKyAgICBpZiAoRXh0RXNjYXBlKGhEQywgR0VUX1BTX0ZFQVRVUkVTRVRUSU5HLCBzaXplb2YoaW50KSwgKGNoYXIqKSZwYXJhbSwKKyAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpLCAoY2hhciopJnBhcmFtKSA+IDApIHsKKyAgICAgIHJldHVybiBwYXJhbTsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotI2RlZmluZSBHRVRfUFNfRkVBVFVSRVNFVFRJTkcgICAgICAgIDQxMjEKLSNkZWZpbmUgRkVBVFVSRVNFVFRJTkdfUFNMRVZFTCAgICAgICAyCi1pbnQgR2V0UFNMZXZlbChIREMgaERDKQotewotICAgIGludCBkZXZpY2VfdHlwZSA9IDo6R2V0RGV2aWNlQ2FwcyhoREMsIFRFQ0hOT0xPR1kpOwotICAgIGlmIChkZXZpY2VfdHlwZSAhPSBEVF9SQVNQUklOVEVSKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBGWF9EV09SRCBlc2MgPSBHRVRfUFNfRkVBVFVSRVNFVFRJTkc7CisgIH0KKyAgZXNjID0gUE9TVFNDUklQVF9JREVOVElGWTsKKyAgaWYgKEV4dEVzY2FwZShoREMsIFFVRVJZRVNDU1VQUE9SVCwgc2l6ZW9mIGVzYywgKGNoYXIqKSZlc2MsIDAsIE5VTEwpID09IDApIHsKKyAgICBlc2MgPSBQT1NUU0NSSVBUX0RBVEE7CiAgICAgaWYgKEV4dEVzY2FwZShoREMsIFFVRVJZRVNDU1VQUE9SVCwgc2l6ZW9mIGVzYywgKGNoYXIqKSZlc2MsIDAsIE5VTEwpKSB7Ci0gICAgICAgIGludCBwYXJhbSA9IEZFQVRVUkVTRVRUSU5HX1BTTEVWRUw7Ci0gICAgICAgIGlmIChFeHRFc2NhcGUoaERDLCBHRVRfUFNfRkVBVFVSRVNFVFRJTkcsIHNpemVvZihpbnQpLCAoY2hhciopJnBhcmFtLCBzaXplb2YoaW50KSwgKGNoYXIqKSZwYXJhbSkgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyYW07Ci0gICAgICAgIH0KKyAgICAgIHJldHVybiAyOwogICAgIH0KLSAgICBlc2MgPSBQT1NUU0NSSVBUX0lERU5USUZZOwotICAgIGlmIChFeHRFc2NhcGUoaERDLCBRVUVSWUVTQ1NVUFBPUlQsIHNpemVvZiBlc2MsIChjaGFyKikmZXNjLCAwLCBOVUxMKSA9PSAwKSB7Ci0gICAgICAgIGVzYyA9IFBPU1RTQ1JJUFRfREFUQTsKLSAgICAgICAgaWYgKEV4dEVzY2FwZShoREMsIFFVRVJZRVNDU1VQUE9SVCwgc2l6ZW9mIGVzYywgKGNoYXIqKSZlc2MsIDAsIE5VTEwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZXNjID0gUFNJREVOVF9HRElDRU5UUklDOwotICAgIGlmIChFeHRFc2NhcGUoaERDLCBQT1NUU0NSSVBUX0lERU5USUZZLCBzaXplb2YoRlhfRFdPUkQpLCAoY2hhciopJmVzYywgMCwgTlVMTCkgPD0gMCkgewotICAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0gICAgZXNjID0gR0VUX1BTX0ZFQVRVUkVTRVRUSU5HOwotICAgIGlmIChFeHRFc2NhcGUoaERDLCBRVUVSWUVTQ1NVUFBPUlQsIHNpemVvZiBlc2MsIChjaGFyKikmZXNjLCAwLCBOVUxMKSkgewotICAgICAgICBpbnQgcGFyYW0gPSBGRUFUVVJFU0VUVElOR19QU0xFVkVMOwotICAgICAgICBpZiAoRXh0RXNjYXBlKGhEQywgR0VUX1BTX0ZFQVRVUkVTRVRUSU5HLCBzaXplb2YoaW50KSwgKGNoYXIqKSZwYXJhbSwgc2l6ZW9mKGludCksIChjaGFyKikmcGFyYW0pID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmFtOwotICAgICAgICB9Ci0gICAgfQorICAgIHJldHVybiAwOworICB9CisgIGVzYyA9IFBTSURFTlRfR0RJQ0VOVFJJQzsKKyAgaWYgKEV4dEVzY2FwZShoREMsIFBPU1RTQ1JJUFRfSURFTlRJRlksIHNpemVvZihGWF9EV09SRCksIChjaGFyKikmZXNjLCAwLAorICAgICAgICAgICAgICAgIE5VTEwpIDw9IDApIHsKICAgICByZXR1cm4gMjsKKyAgfQorICBlc2MgPSBHRVRfUFNfRkVBVFVSRVNFVFRJTkc7CisgIGlmIChFeHRFc2NhcGUoaERDLCBRVUVSWUVTQ1NVUFBPUlQsIHNpemVvZiBlc2MsIChjaGFyKikmZXNjLCAwLCBOVUxMKSkgeworICAgIGludCBwYXJhbSA9IEZFQVRVUkVTRVRUSU5HX1BTTEVWRUw7CisgICAgaWYgKEV4dEVzY2FwZShoREMsIEdFVF9QU19GRUFUVVJFU0VUVElORywgc2l6ZW9mKGludCksIChjaGFyKikmcGFyYW0sCisgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSwgKGNoYXIqKSZwYXJhbSkgPiAwKSB7CisgICAgICByZXR1cm4gcGFyYW07CisgICAgfQorICB9CisgIHJldHVybiAyOwogfQogaW50IENGWF9XaW5kb3dzRGV2aWNlOjptX3BzTGV2ZWwgPSAyOwotQ0ZYX1dpbmRvd3NEZXZpY2U6OkNGWF9XaW5kb3dzRGV2aWNlKEhEQyBoREMsIEZYX0JPT0wgYkNteWtPdXRwdXQsIEZYX0JPT0wgYkZvcmNlUFNPdXRwdXQsIGludCBwc0xldmVsKQotewotICAgIG1fYkZvcmNlUFNPdXRwdXQgPSBiRm9yY2VQU091dHB1dDsKLSAgICBtX3BzTGV2ZWwgPSBwc0xldmVsOwotICAgIGlmIChiRm9yY2VQU091dHB1dCkgewotICAgICAgICBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyKiBwRHJpdmVyID0gbmV3IENQU1ByaW50ZXJEcml2ZXI7Ci0gICAgICAgICgoQ1BTUHJpbnRlckRyaXZlciopcERyaXZlciktPkluaXQoaERDLCBwc0xldmVsLCBiQ215a091dHB1dCk7Ci0gICAgICAgIFNldERldmljZURyaXZlcihwRHJpdmVyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBTZXREZXZpY2VEcml2ZXIoQ3JlYXRlRHJpdmVyKGhEQywgYkNteWtPdXRwdXQpKTsKLX0KLUhEQyBDRlhfV2luZG93c0RldmljZTo6R2V0REMoKSBjb25zdAotewotICAgIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIgKnBSREQgPSBHZXREZXZpY2VEcml2ZXIoKTsKLSAgICBpZiAoIXBSREQpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiAoSERDKXBSREQtPkdldFBsYXRmb3JtU3VyZmFjZSgpOwotfQotSUZYX1JlbmRlckRldmljZURyaXZlciogQ0ZYX1dpbmRvd3NEZXZpY2U6OkNyZWF0ZURyaXZlcihIREMgaERDLCBGWF9CT09MIGJDbXlrT3V0cHV0KQotewotICAgIGludCBkZXZpY2VfdHlwZSA9IDo6R2V0RGV2aWNlQ2FwcyhoREMsIFRFQ0hOT0xPR1kpOwotICAgIGludCBvYmpfdHlwZSA9IDo6R2V0T2JqZWN0VHlwZShoREMpOwotICAgIGludCBkZXZpY2VfY2xhc3M7Ci0gICAgaWYgKGRldmljZV90eXBlID09IERUX1JBU1BSSU5URVIgfHwgZGV2aWNlX3R5cGUgPT0gRFRfUExPVFRFUiB8fCBvYmpfdHlwZSA9PSBPQkpfRU5ITUVUQURDKSB7Ci0gICAgICAgIGRldmljZV9jbGFzcyA9IEZYRENfUFJJTlRFUjsKLSAgICB9IGVsc2UgewotICAgICAgICBkZXZpY2VfY2xhc3MgPSBGWERDX0RJU1BMQVk7Ci0gICAgfQotICAgIGlmIChkZXZpY2VfY2xhc3MgPT0gRlhEQ19QUklOVEVSKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ0dkaVByaW50ZXJEcml2ZXIoaERDKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBDR2RpRGlzcGxheURyaXZlcihoREMpOwotfQotQ0ZYX1dpbkJpdG1hcERldmljZTo6Q0ZYX1dpbkJpdG1hcERldmljZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZYRElCX0Zvcm1hdCBmb3JtYXQpCi17Ci0gICAgQklUTUFQSU5GT0hFQURFUiBibWloOwotICAgIEZYU1lTX21lbXNldDMyKCZibWloLCAwLCBzaXplb2YgKEJJVE1BUElORk9IRUFERVIpKTsKLSAgICBibWloLmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKLSAgICBibWloLmJpQml0Q291bnQgPSBmb3JtYXQgJiAweGZmOwotICAgIGJtaWguYmlIZWlnaHQgPSAtaGVpZ2h0OwotICAgIGJtaWguYmlQbGFuZXMgPSAxOwotICAgIGJtaWguYmlXaWR0aCA9IHdpZHRoOwotICAgIEZYX0xQQllURSBwQnVmZmVyOwotICAgIG1faEJpdG1hcCA9IENyZWF0ZURJQlNlY3Rpb24oTlVMTCwgKEJJVE1BUElORk8qKSZibWloLCBESUJfUkdCX0NPTE9SUywgKEZYX0xQVk9JRCopJnBCdWZmZXIsIE5VTEwsIDApOwotICAgIGlmIChtX2hCaXRtYXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7Ci0gICAgcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgcEJ1ZmZlcik7Ci0gICAgU2V0Qml0bWFwKHBCaXRtYXApOwotICAgIG1faERDID0gOjpDcmVhdGVDb21wYXRpYmxlREMoTlVMTCk7Ci0gICAgbV9oT2xkQml0bWFwID0gKEhCSVRNQVApU2VsZWN0T2JqZWN0KG1faERDLCBtX2hCaXRtYXApOwotICAgIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPSBuZXcgQ0dkaURpc3BsYXlEcml2ZXIobV9oREMpOworQ0ZYX1dpbmRvd3NEZXZpY2U6OkNGWF9XaW5kb3dzRGV2aWNlKEhEQyBoREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ215a091dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGb3JjZVBTT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwc0xldmVsKSB7CisgIG1fYkZvcmNlUFNPdXRwdXQgPSBiRm9yY2VQU091dHB1dDsKKyAgbV9wc0xldmVsID0gcHNMZXZlbDsKKyAgaWYgKGJGb3JjZVBTT3V0cHV0KSB7CisgICAgSUZYX1JlbmRlckRldmljZURyaXZlciogcERyaXZlciA9IG5ldyBDUFNQcmludGVyRHJpdmVyOworICAgICgoQ1BTUHJpbnRlckRyaXZlciopcERyaXZlciktPkluaXQoaERDLCBwc0xldmVsLCBiQ215a091dHB1dCk7CiAgICAgU2V0RGV2aWNlRHJpdmVyKHBEcml2ZXIpOworICAgIHJldHVybjsKKyAgfQorICBTZXREZXZpY2VEcml2ZXIoQ3JlYXRlRHJpdmVyKGhEQywgYkNteWtPdXRwdXQpKTsKIH0KLUNGWF9XaW5CaXRtYXBEZXZpY2U6On5DRlhfV2luQml0bWFwRGV2aWNlKCkKLXsKLSAgICBpZiAobV9oREMpIHsKLSAgICAgICAgU2VsZWN0T2JqZWN0KG1faERDLCBtX2hPbGRCaXRtYXApOwotICAgICAgICBEZWxldGVEQyhtX2hEQyk7Ci0gICAgfQotICAgIGlmIChtX2hCaXRtYXApIHsKLSAgICAgICAgRGVsZXRlT2JqZWN0KG1faEJpdG1hcCk7Ci0gICAgfQotICAgIGRlbGV0ZSBHZXRCaXRtYXAoKTsKK0hEQyBDRlhfV2luZG93c0RldmljZTo6R2V0REMoKSBjb25zdCB7CisgIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIHBSREQgPSBHZXREZXZpY2VEcml2ZXIoKTsKKyAgaWYgKCFwUkREKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIChIREMpcFJERC0+R2V0UGxhdGZvcm1TdXJmYWNlKCk7CiB9Ci0jZW5kaWYKK0lGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIENGWF9XaW5kb3dzRGV2aWNlOjpDcmVhdGVEcml2ZXIoSERDIGhEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ215a091dHB1dCkgeworICBpbnQgZGV2aWNlX3R5cGUgPSA6OkdldERldmljZUNhcHMoaERDLCBURUNITk9MT0dZKTsKKyAgaW50IG9ial90eXBlID0gOjpHZXRPYmplY3RUeXBlKGhEQyk7CisgIGludCBkZXZpY2VfY2xhc3M7CisgIGlmIChkZXZpY2VfdHlwZSA9PSBEVF9SQVNQUklOVEVSIHx8IGRldmljZV90eXBlID09IERUX1BMT1RURVIgfHwKKyAgICAgIG9ial90eXBlID09IE9CSl9FTkhNRVRBREMpIHsKKyAgICBkZXZpY2VfY2xhc3MgPSBGWERDX1BSSU5URVI7CisgIH0gZWxzZSB7CisgICAgZGV2aWNlX2NsYXNzID0gRlhEQ19ESVNQTEFZOworICB9CisgIGlmIChkZXZpY2VfY2xhc3MgPT0gRlhEQ19QUklOVEVSKSB7CisgICAgcmV0dXJuIG5ldyBDR2RpUHJpbnRlckRyaXZlcihoREMpOworICB9CisgIHJldHVybiBuZXcgQ0dkaURpc3BsYXlEcml2ZXIoaERDKTsKK30KK0NGWF9XaW5CaXRtYXBEZXZpY2U6OkNGWF9XaW5CaXRtYXBEZXZpY2UoaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgZm9ybWF0KSB7CisgIEJJVE1BUElORk9IRUFERVIgYm1paDsKKyAgRlhTWVNfbWVtc2V0KCZibWloLCAwLCBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpOworICBibWloLmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKKyAgYm1paC5iaUJpdENvdW50ID0gZm9ybWF0ICYgMHhmZjsKKyAgYm1paC5iaUhlaWdodCA9IC1oZWlnaHQ7CisgIGJtaWguYmlQbGFuZXMgPSAxOworICBibWloLmJpV2lkdGggPSB3aWR0aDsKKyAgdWludDhfdCogcEJ1ZmZlcjsKKyAgbV9oQml0bWFwID0gQ3JlYXRlRElCU2VjdGlvbihOVUxMLCAoQklUTUFQSU5GTyopJmJtaWgsIERJQl9SR0JfQ09MT1JTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiopJnBCdWZmZXIsIE5VTEwsIDApOworICBpZiAoIW1faEJpdG1hcCkgeworICAgIHJldHVybjsKKyAgfQorICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOworICBwQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgZm9ybWF0LCBwQnVmZmVyKTsKKyAgU2V0Qml0bWFwKHBCaXRtYXApOworICBtX2hEQyA9IDo6Q3JlYXRlQ29tcGF0aWJsZURDKE5VTEwpOworICBtX2hPbGRCaXRtYXAgPSAoSEJJVE1BUClTZWxlY3RPYmplY3QobV9oREMsIG1faEJpdG1hcCk7CisgIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIHBEcml2ZXIgPSBuZXcgQ0dkaURpc3BsYXlEcml2ZXIobV9oREMpOworICBTZXREZXZpY2VEcml2ZXIocERyaXZlcik7Cit9CitDRlhfV2luQml0bWFwRGV2aWNlOjp+Q0ZYX1dpbkJpdG1hcERldmljZSgpIHsKKyAgaWYgKG1faERDKSB7CisgICAgU2VsZWN0T2JqZWN0KG1faERDLCBtX2hPbGRCaXRtYXApOworICAgIERlbGV0ZURDKG1faERDKTsKKyAgfQorICBpZiAobV9oQml0bWFwKSB7CisgICAgRGVsZXRlT2JqZWN0KG1faEJpdG1hcCk7CisgIH0KKyAgZGVsZXRlIEdldEJpdG1hcCgpOworfQorCisjZW5kaWYgIC8vIF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjY0XwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9kaWIuY3BwIGIvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9kaWIuY3BwCmluZGV4IDQ2YWJkYjMuLjFmZGYzYWUgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZGliLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX2RpYi5jcHAKQEAgLTEsMjgyICsxLDI4OSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGdlL2Z4X2dlLmgiCi0jaWYgX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgIF9GWF9PU18gPT0gX0ZYX1dJTjY0XworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2dlLmgiCisKKyNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU42NF9ERVNLVE9QXwogI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZ2Vfd2luMzIuaCIKKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2dlX3dpbjMyLmgiCiAjaW5jbHVkZSAid2luMzJfaW50LmgiCi1DRlhfQnl0ZVN0cmluZyBDRlhfV2luZG93c0RJQjo6R2V0Qml0bWFwSW5mbyhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXApCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0OwotICAgIGludCBsZW4gPSBzaXplb2YgKEJJVE1BUElORk9IRUFERVIpOwotICAgIGlmIChwQml0bWFwLT5HZXRCUFAoKSA9PSAxIHx8IHBCaXRtYXAtPkdldEJQUCgpID09IDgpIHsKLSAgICAgICAgbGVuICs9IHNpemVvZiAoRFdPUkQpICogKGludCkoMSA8PCBwQml0bWFwLT5HZXRCUFAoKSk7Ci0gICAgfQotICAgIEJJVE1BUElORk9IRUFERVIqIHBibWloID0gKEJJVE1BUElORk9IRUFERVIqKXJlc3VsdC5HZXRCdWZmZXIobGVuKTsKLSAgICBGWFNZU19tZW1zZXQzMihwYm1paCwgMCwgc2l6ZW9mIChCSVRNQVBJTkZPSEVBREVSKSk7Ci0gICAgcGJtaWgtPmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKLSAgICBwYm1paC0+YmlCaXRDb3VudCA9IHBCaXRtYXAtPkdldEJQUCgpOwotICAgIHBibWloLT5iaUNvbXByZXNzaW9uID0gQklfUkdCOwotICAgIHBibWloLT5iaUhlaWdodCA9IC0oaW50KXBCaXRtYXAtPkdldEhlaWdodCgpOwotICAgIHBibWloLT5iaVBsYW5lcyA9IDE7Ci0gICAgcGJtaWgtPmJpV2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpOwotICAgIGlmIChwQml0bWFwLT5HZXRCUFAoKSA9PSA4KSB7Ci0gICAgICAgIEZYX0RXT1JEKiBwUGFsZXR0ZSA9IChGWF9EV09SRCopKHBibWloICsgMSk7Ci0gICAgICAgIGlmIChwQml0bWFwLT5HZXRQYWxldHRlKCkgPT0gTlVMTCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKLSAgICAgICAgICAgICAgICBwUGFsZXR0ZVtpXSA9IGkgKiAweDAxMDEwMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpICsrKSB7Ci0gICAgICAgICAgICAgICAgcFBhbGV0dGVbaV0gPSBwQml0bWFwLT5HZXRQYWxldHRlKClbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBCaXRtYXAtPkdldEJQUCgpID09IDEpIHsKLSAgICAgICAgRlhfRFdPUkQqIHBQYWxldHRlID0gKEZYX0RXT1JEKikocGJtaWggKyAxKTsKLSAgICAgICAgaWYgKHBCaXRtYXAtPkdldFBhbGV0dGUoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBwUGFsZXR0ZVswXSA9IDA7Ci0gICAgICAgICAgICBwUGFsZXR0ZVsxXSA9IDB4ZmZmZmZmOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcFBhbGV0dGVbMF0gPSBwQml0bWFwLT5HZXRQYWxldHRlKClbMF07Ci0gICAgICAgICAgICBwUGFsZXR0ZVsxXSA9IHBCaXRtYXAtPkdldFBhbGV0dGUoKVsxXTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXN1bHQuUmVsZWFzZUJ1ZmZlcihsZW4pOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci1DRlhfRElCaXRtYXAqIF9GWF9XaW5kb3dzRElCX0xvYWRGcm9tQnVmKEJJVE1BUElORk8qIHBibWksIExQVk9JRCBwRGF0YSwgRlhfQk9PTCBiQWxwaGEpCi17Ci0gICAgaW50IHdpZHRoID0gcGJtaS0+Ym1pSGVhZGVyLmJpV2lkdGg7Ci0gICAgaW50IGhlaWdodCA9IHBibWktPmJtaUhlYWRlci5iaUhlaWdodDsKLSAgICBCT09MIGJCb3R0b21VcCA9IFRSVUU7Ci0gICAgaWYgKGhlaWdodCA8IDApIHsKLSAgICAgICAgaGVpZ2h0ID0gLWhlaWdodDsKLSAgICAgICAgYkJvdHRvbVVwID0gRkFMU0U7Ci0gICAgfQotICAgIGludCBwaXRjaCA9ICh3aWR0aCAqIHBibWktPmJtaUhlYWRlci5iaUJpdENvdW50ICsgMzEpIC8gMzIgKiA0OwotICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7Ci0gICAgRlhESUJfRm9ybWF0IGZvcm1hdCA9IGJBbHBoYSA/IChGWERJQl9Gb3JtYXQpKHBibWktPmJtaUhlYWRlci5iaUJpdENvdW50ICsgMHgyMDApIDogKEZYRElCX0Zvcm1hdClwYm1pLT5ibWlIZWFkZXIuYmlCaXRDb3VudDsKLSAgICBGWF9CT09MIHJldCA9IHBCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpOwotICAgIGlmICghcmV0KSB7Ci0gICAgICAgIGRlbGV0ZSBwQml0bWFwOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgRlhTWVNfbWVtY3B5MzIocEJpdG1hcC0+R2V0QnVmZmVyKCksIHBEYXRhLCBwaXRjaCAqIGhlaWdodCk7Ci0gICAgaWYgKGJCb3R0b21VcCkgewotICAgICAgICBGWF9MUEJZVEUgdGVtcF9idWYgPSBGWF9BbGxvYyhGWF9CWVRFLCBwaXRjaCk7Ci0gICAgICAgIGludCB0b3AgPSAwLCBib3R0b20gPSBoZWlnaHQgLSAxOwotICAgICAgICB3aGlsZSAodG9wIDwgYm90dG9tKSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkzMih0ZW1wX2J1ZiwgcEJpdG1hcC0+R2V0QnVmZmVyKCkgKyB0b3AgKiBwaXRjaCwgcGl0Y2gpOwotICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIocEJpdG1hcC0+R2V0QnVmZmVyKCkgKyB0b3AgKiBwaXRjaCwgcEJpdG1hcC0+R2V0QnVmZmVyKCkgKyBib3R0b20gKiBwaXRjaCwgcGl0Y2gpOwotICAgICAgICAgICAgRlhTWVNfbWVtY3B5MzIocEJpdG1hcC0+R2V0QnVmZmVyKCkgKyBib3R0b20gKiBwaXRjaCwgdGVtcF9idWYsIHBpdGNoKTsKLSAgICAgICAgICAgIHRvcCArKzsKLSAgICAgICAgICAgIGJvdHRvbSAtLTsKLSAgICAgICAgfQotICAgICAgICBGWF9GcmVlKHRlbXBfYnVmKTsKLSAgICAgICAgdGVtcF9idWYgPSBOVUxMOwotICAgIH0KLSAgICBpZiAocGJtaS0+Ym1pSGVhZGVyLmJpQml0Q291bnQgPT0gMSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkgKyspIHsKLSAgICAgICAgICAgIHBCaXRtYXAtPlNldFBhbGV0dGVFbnRyeShpLCAoKEZYX0RXT1JEKilwYm1pLT5ibWlDb2xvcnMpW2ldIHwgMHhmZjAwMDAwMCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHBibWktPmJtaUhlYWRlci5iaUJpdENvdW50ID09IDgpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKLSAgICAgICAgICAgIHBCaXRtYXAtPlNldFBhbGV0dGVFbnRyeShpLCAoKEZYX0RXT1JEKilwYm1pLT5ibWlDb2xvcnMpW2ldIHwgMHhmZjAwMDAwMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHBCaXRtYXA7Ci19Ci1DRlhfRElCaXRtYXAqIENGWF9XaW5kb3dzRElCOjpMb2FkRnJvbUJ1ZihCSVRNQVBJTkZPKiBwYm1pLCBMUFZPSUQgcERhdGEpCi17Ci0gICAgcmV0dXJuIF9GWF9XaW5kb3dzRElCX0xvYWRGcm9tQnVmKHBibWksIHBEYXRhLCBGQUxTRSk7Ci19Ci1IQklUTUFQCUNGWF9XaW5kb3dzRElCOjpHZXREREJpdG1hcChjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIEhEQyBoREMpCi17Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgaW5mbyA9IEdldEJpdG1hcEluZm8ocEJpdG1hcCk7Ci0gICAgSEJJVE1BUCBoQml0bWFwID0gTlVMTDsKLSAgICBoQml0bWFwID0gQ3JlYXRlRElCaXRtYXAoaERDLCAoQklUTUFQSU5GT0hFQURFUiopaW5mby5jX3N0cigpLCBDQk1fSU5JVCwKLSAgICAgICAgcEJpdG1hcC0+R2V0QnVmZmVyKCksIChCSVRNQVBJTkZPKilpbmZvLmNfc3RyKCksIERJQl9SR0JfQ09MT1JTKTsKLSAgICByZXR1cm4gaEJpdG1hcDsKLX0KLXZvaWQgR2V0Qml0bWFwU2l6ZShIQklUTUFQIGhCaXRtYXAsIGludCYgdywgaW50JiBoKQotewotICAgIEJJVE1BUCBibXA7Ci0gICAgR2V0T2JqZWN0KGhCaXRtYXAsIHNpemVvZiBibXAsICZibXApOwotICAgIHcgPSBibXAuYm1XaWR0aDsKLSAgICBoID0gYm1wLmJtSGVpZ2h0OwotfQotQ0ZYX0RJQml0bWFwKiBDRlhfV2luZG93c0RJQjo6TG9hZEZyb21GaWxlKEZYX0xQQ1dTVFIgZmlsZW5hbWUpCi17Ci0gICAgQ1dpbjMyUGxhdGZvcm0qIHBQbGF0Zm9ybSA9IChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCk7Ci0gICAgaWYgKHBQbGF0Zm9ybS0+bV9HZGlwbHVzRXh0LklzQXZhaWxhYmxlKCkpIHsKLSAgICAgICAgV0lORElCX09wZW5fQXJnc18gYXJnczsKLSAgICAgICAgYXJncy5mbGFncyA9IFdJTkRJQl9PUEVOX1BBVEhOQU1FOwotICAgICAgICBhcmdzLnBhdGhfbmFtZSA9IGZpbGVuYW1lOwotICAgICAgICByZXR1cm4gcFBsYXRmb3JtLT5tX0dkaXBsdXNFeHQuTG9hZERJQml0bWFwKGFyZ3MpOwotICAgIH0KLSAgICBIQklUTUFQIGhCaXRtYXAgPSAoSEJJVE1BUClMb2FkSW1hZ2VXKE5VTEwsICh3Y2hhcl90KilmaWxlbmFtZSwgSU1BR0VfQklUTUFQLCAwLCAwLCBMUl9MT0FERlJPTUZJTEUpOwotICAgIGlmIChoQml0bWFwID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIEhEQyBoREMgPSBDcmVhdGVDb21wYXRpYmxlREMoTlVMTCk7Ci0gICAgaW50IHdpZHRoLCBoZWlnaHQ7Ci0gICAgR2V0Qml0bWFwU2l6ZShoQml0bWFwLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7Ci0gICAgaWYgKCFwRElCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9SZ2IpKSB7Ci0gICAgICAgIGRlbGV0ZSBwRElCaXRtYXA7Ci0gICAgICAgIERlbGV0ZURDKGhEQyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBpbmZvID0gR2V0Qml0bWFwSW5mbyhwRElCaXRtYXApOwotICAgIGludCByZXQgPSBHZXRESUJpdHMoaERDLCBoQml0bWFwLCAwLCBoZWlnaHQsIHBESUJpdG1hcC0+R2V0QnVmZmVyKCksIChCSVRNQVBJTkZPKilpbmZvLmNfc3RyKCksIERJQl9SR0JfQ09MT1JTKTsKLSAgICBpZiAoIXJldCkgewotICAgICAgICBpZiAocERJQml0bWFwKSB7Ci0gICAgICAgICAgICBkZWxldGUgcERJQml0bWFwOwotICAgICAgICB9Ci0gICAgICAgIHBESUJpdG1hcCA9IE5VTEw7Ci0gICAgfQotICAgIERlbGV0ZURDKGhEQyk7Ci0gICAgcmV0dXJuIHBESUJpdG1hcDsKLX0KLUNGWF9ESUJpdG1hcCogQ0ZYX1dpbmRvd3NESUI6OkxvYWRESUJpdG1hcChXSU5ESUJfT3Blbl9BcmdzXyBhcmdzKQotewotICAgIENXaW4zMlBsYXRmb3JtKiBwUGxhdGZvcm0gPSAoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpOwotICAgIGlmIChwUGxhdGZvcm0tPm1fR2RpcGx1c0V4dC5Jc0F2YWlsYWJsZSgpKSB7Ci0gICAgICAgIHJldHVybiBwUGxhdGZvcm0tPm1fR2RpcGx1c0V4dC5Mb2FkRElCaXRtYXAoYXJncyk7Ci0gICAgfSBlbHNlIGlmIChhcmdzLmZsYWdzID09IFdJTkRJQl9PUEVOX01FTU9SWSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgSEJJVE1BUCBoQml0bWFwID0gKEhCSVRNQVApTG9hZEltYWdlVyhOVUxMLCAod2NoYXJfdCopYXJncy5wYXRoX25hbWUsIElNQUdFX0JJVE1BUCwgMCwgMCwgTFJfTE9BREZST01GSUxFKTsKLSAgICBpZiAoaEJpdG1hcCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBIREMgaERDID0gQ3JlYXRlQ29tcGF0aWJsZURDKE5VTEwpOwotICAgIGludCB3aWR0aCwgaGVpZ2h0OwotICAgIEdldEJpdG1hcFNpemUoaEJpdG1hcCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOwotICAgIGlmICghcERJQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfUmdiKSkgewotICAgICAgICBkZWxldGUgcERJQml0bWFwOwotICAgICAgICBEZWxldGVEQyhoREMpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgaW5mbyA9IEdldEJpdG1hcEluZm8ocERJQml0bWFwKTsKLSAgICBpbnQgcmV0ID0gR2V0RElCaXRzKGhEQywgaEJpdG1hcCwgMCwgaGVpZ2h0LCBwRElCaXRtYXAtPkdldEJ1ZmZlcigpLCAoQklUTUFQSU5GTyopaW5mby5jX3N0cigpLCBESUJfUkdCX0NPTE9SUyk7Ci0gICAgaWYgKCFyZXQpIHsKLSAgICAgICAgaWYgKHBESUJpdG1hcCkgewotICAgICAgICAgICAgZGVsZXRlIHBESUJpdG1hcDsKLSAgICAgICAgfQotICAgICAgICBwRElCaXRtYXAgPSBOVUxMOwotICAgIH0KLSAgICBEZWxldGVEQyhoREMpOwotICAgIHJldHVybiBwRElCaXRtYXA7Ci19Ci1DRlhfRElCaXRtYXAqIENGWF9XaW5kb3dzRElCOjpMb2FkRnJvbUREQihIREMgaERDLCBIQklUTUFQIGhCaXRtYXAsIEZYX0RXT1JEKiBwUGFsZXR0ZSwgRlhfRFdPUkQgcGFsc2l6ZSkKLXsKLSAgICBGWF9CT09MIGJDcmVhdGVkREMgPSBoREMgPT0gTlVMTDsKLSAgICBpZiAoaERDID09IE5VTEwpIHsKLSAgICAgICAgaERDID0gQ3JlYXRlQ29tcGF0aWJsZURDKE5VTEwpOwotICAgIH0KLSAgICBCSVRNQVBJTkZPSEVBREVSIGJtaWg7Ci0gICAgRlhTWVNfbWVtc2V0MzIoJmJtaWgsIDAsIHNpemVvZiBibWloKTsKLSAgICBibWloLmJpU2l6ZSA9IHNpemVvZiBibWloOwotICAgIEdldERJQml0cyhoREMsIGhCaXRtYXAsIDAsIDAsIE5VTEwsIChCSVRNQVBJTkZPKikmYm1paCwgRElCX1JHQl9DT0xPUlMpOwotICAgIGludCB3aWR0aCA9IGJtaWguYmlXaWR0aDsKLSAgICBpbnQgaGVpZ2h0ID0gYWJzKGJtaWguYmlIZWlnaHQpOwotICAgIGJtaWguYmlIZWlnaHQgPSAtaGVpZ2h0OwotICAgIGJtaWguYmlDb21wcmVzc2lvbiA9IEJJX1JHQjsKLSAgICBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7Ci0gICAgaW50IHJldCA9IDA7Ci0gICAgaWYgKGJtaWguYmlCaXRDb3VudCA9PSAxIHx8IGJtaWguYmlCaXRDb3VudCA9PSA4KSB7Ci0gICAgICAgIGludCBzaXplID0gc2l6ZW9mIChCSVRNQVBJTkZPSEVBREVSKSArIDg7Ci0gICAgICAgIGlmIChibWloLmJpQml0Q291bnQgPT0gOCkgewotICAgICAgICAgICAgc2l6ZSArPSBzaXplb2YgKEZYX0RXT1JEKSAqIDI1NDsKLSAgICAgICAgfQotICAgICAgICBCSVRNQVBJTkZPKiBwYm1paCA9IChCSVRNQVBJTkZPKilGWF9BbGxvYyhGWF9CWVRFLCBzaXplKTsKLSAgICAgICAgcGJtaWgtPmJtaUhlYWRlci5iaVNpemUgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7Ci0gICAgICAgIHBibWloLT5ibWlIZWFkZXIuYmlCaXRDb3VudCA9IGJtaWguYmlCaXRDb3VudDsKLSAgICAgICAgcGJtaWgtPmJtaUhlYWRlci5iaUNvbXByZXNzaW9uID0gQklfUkdCOwotICAgICAgICBwYm1paC0+Ym1pSGVhZGVyLmJpSGVpZ2h0ID0gLWhlaWdodDsKLSAgICAgICAgcGJtaWgtPmJtaUhlYWRlci5iaVBsYW5lcyA9IDE7Ci0gICAgICAgIHBibWloLT5ibWlIZWFkZXIuYmlXaWR0aCA9IGJtaWguYmlXaWR0aDsKLSAgICAgICAgaWYgKCFwRElCaXRtYXAtPkNyZWF0ZShibWloLmJpV2lkdGgsIGhlaWdodCwgYm1paC5iaUJpdENvdW50ID09IDEgPyBGWERJQl8xYnBwUmdiIDogRlhESUJfOGJwcFJnYikpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBwRElCaXRtYXA7Ci0gICAgICAgICAgICBGWF9GcmVlKHBibWloKTsKLSAgICAgICAgICAgIGlmIChiQ3JlYXRlZERDKSB7Ci0gICAgICAgICAgICAgICAgRGVsZXRlREMoaERDKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHJldCA9IEdldERJQml0cyhoREMsIGhCaXRtYXAsIDAsIGhlaWdodCwgcERJQml0bWFwLT5HZXRCdWZmZXIoKSwgKEJJVE1BUElORk8qKXBibWloLCBESUJfUkdCX0NPTE9SUyk7Ci0gICAgICAgIEZYX0ZyZWUocGJtaWgpOwotICAgICAgICBwYm1paCA9IE5VTEw7Ci0gICAgICAgIHBESUJpdG1hcC0+Q29weVBhbGV0dGUocFBhbGV0dGUsIHBhbHNpemUpOworCitDRlhfQnl0ZVN0cmluZyBDRlhfV2luZG93c0RJQjo6R2V0Qml0bWFwSW5mbyhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXApIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0OworICBpbnQgbGVuID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOworICBpZiAocEJpdG1hcC0+R2V0QlBQKCkgPT0gMSB8fCBwQml0bWFwLT5HZXRCUFAoKSA9PSA4KSB7CisgICAgbGVuICs9IHNpemVvZihEV09SRCkgKiAoaW50KSgxIDw8IHBCaXRtYXAtPkdldEJQUCgpKTsKKyAgfQorICBCSVRNQVBJTkZPSEVBREVSKiBwYm1paCA9IChCSVRNQVBJTkZPSEVBREVSKilyZXN1bHQuR2V0QnVmZmVyKGxlbik7CisgIEZYU1lTX21lbXNldChwYm1paCwgMCwgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKTsKKyAgcGJtaWgtPmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKKyAgcGJtaWgtPmJpQml0Q291bnQgPSBwQml0bWFwLT5HZXRCUFAoKTsKKyAgcGJtaWgtPmJpQ29tcHJlc3Npb24gPSBCSV9SR0I7CisgIHBibWloLT5iaUhlaWdodCA9IC0oaW50KXBCaXRtYXAtPkdldEhlaWdodCgpOworICBwYm1paC0+YmlQbGFuZXMgPSAxOworICBwYm1paC0+YmlXaWR0aCA9IHBCaXRtYXAtPkdldFdpZHRoKCk7CisgIGlmIChwQml0bWFwLT5HZXRCUFAoKSA9PSA4KSB7CisgICAgRlhfRFdPUkQqIHBQYWxldHRlID0gKEZYX0RXT1JEKikocGJtaWggKyAxKTsKKyAgICBpZiAocEJpdG1hcC0+R2V0UGFsZXR0ZSgpKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIHBQYWxldHRlW2ldID0gcEJpdG1hcC0+R2V0UGFsZXR0ZSgpW2ldOworICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChibWloLmJpQml0Q291bnQgPD0gMjQpIHsKLSAgICAgICAgICAgIGJtaWguYmlCaXRDb3VudCA9IDI0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYm1paC5iaUJpdENvdW50ID0gMzI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwRElCaXRtYXAtPkNyZWF0ZShibWloLmJpV2lkdGgsIGhlaWdodCwgYm1paC5iaUJpdENvdW50ID09IDI0ID8gRlhESUJfUmdiIDogRlhESUJfUmdiMzIpKSB7Ci0gICAgICAgICAgICBkZWxldGUgcERJQml0bWFwOwotICAgICAgICAgICAgaWYgKGJDcmVhdGVkREMpIHsKLSAgICAgICAgICAgICAgICBEZWxldGVEQyhoREMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0ID0gR2V0RElCaXRzKGhEQywgaEJpdG1hcCwgMCwgaGVpZ2h0LCBwRElCaXRtYXAtPkdldEJ1ZmZlcigpLCAoQklUTUFQSU5GTyopJmJtaWgsIERJQl9SR0JfQ09MT1JTKTsKLSAgICAgICAgaWYgKHJldCAhPSAwICYmIGJtaWguYmlCaXRDb3VudCA9PSAzMikgewotICAgICAgICAgICAgaW50IHBpdGNoID0gcERJQml0bWFwLT5HZXRQaXRjaCgpOwotICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3cgKyspIHsKLSAgICAgICAgICAgICAgICBGWF9CWVRFKiBkZXN0X3NjYW4gPSAoRlhfQllURSopKHBESUJpdG1hcC0+R2V0QnVmZmVyKCkgKyByb3cgKiBwaXRjaCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IDI1NTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIHBQYWxldHRlW2ldID0gaSAqIDB4MDEwMTAxOworICAgICAgfQogICAgIH0KLSAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgaWYgKHBESUJpdG1hcCkgewotICAgICAgICAgICAgZGVsZXRlIHBESUJpdG1hcDsKLSAgICAgICAgfQotICAgICAgICBwRElCaXRtYXAgPSBOVUxMOworICB9CisgIGlmIChwQml0bWFwLT5HZXRCUFAoKSA9PSAxKSB7CisgICAgRlhfRFdPUkQqIHBQYWxldHRlID0gKEZYX0RXT1JEKikocGJtaWggKyAxKTsKKyAgICBpZiAocEJpdG1hcC0+R2V0UGFsZXR0ZSgpKSB7CisgICAgICBwUGFsZXR0ZVswXSA9IHBCaXRtYXAtPkdldFBhbGV0dGUoKVswXTsKKyAgICAgIHBQYWxldHRlWzFdID0gcEJpdG1hcC0+R2V0UGFsZXR0ZSgpWzFdOworICAgIH0gZWxzZSB7CisgICAgICBwUGFsZXR0ZVswXSA9IDA7CisgICAgICBwUGFsZXR0ZVsxXSA9IDB4ZmZmZmZmOwogICAgIH0KLSAgICBpZiAoYkNyZWF0ZWREQykgeworICB9CisgIHJlc3VsdC5SZWxlYXNlQnVmZmVyKGxlbik7CisgIHJldHVybiByZXN1bHQ7Cit9CitDRlhfRElCaXRtYXAqIF9GWF9XaW5kb3dzRElCX0xvYWRGcm9tQnVmKEJJVE1BUElORk8qIHBibWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWxwaGEpIHsKKyAgaW50IHdpZHRoID0gcGJtaS0+Ym1pSGVhZGVyLmJpV2lkdGg7CisgIGludCBoZWlnaHQgPSBwYm1pLT5ibWlIZWFkZXIuYmlIZWlnaHQ7CisgIEJPT0wgYkJvdHRvbVVwID0gVFJVRTsKKyAgaWYgKGhlaWdodCA8IDApIHsKKyAgICBoZWlnaHQgPSAtaGVpZ2h0OworICAgIGJCb3R0b21VcCA9IEZBTFNFOworICB9CisgIGludCBwaXRjaCA9ICh3aWR0aCAqIHBibWktPmJtaUhlYWRlci5iaUJpdENvdW50ICsgMzEpIC8gMzIgKiA0OworICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOworICBGWERJQl9Gb3JtYXQgZm9ybWF0ID0gYkFscGhhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoRlhESUJfRm9ybWF0KShwYm1pLT5ibWlIZWFkZXIuYmlCaXRDb3VudCArIDB4MjAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKEZYRElCX0Zvcm1hdClwYm1pLT5ibWlIZWFkZXIuYmlCaXRDb3VudDsKKyAgRlhfQk9PTCByZXQgPSBwQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgZm9ybWF0KTsKKyAgaWYgKCFyZXQpIHsKKyAgICBkZWxldGUgcEJpdG1hcDsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBGWFNZU19tZW1jcHkocEJpdG1hcC0+R2V0QnVmZmVyKCksIHBEYXRhLCBwaXRjaCAqIGhlaWdodCk7CisgIGlmIChiQm90dG9tVXApIHsKKyAgICB1aW50OF90KiB0ZW1wX2J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHBpdGNoKTsKKyAgICBpbnQgdG9wID0gMCwgYm90dG9tID0gaGVpZ2h0IC0gMTsKKyAgICB3aGlsZSAodG9wIDwgYm90dG9tKSB7CisgICAgICBGWFNZU19tZW1jcHkodGVtcF9idWYsIHBCaXRtYXAtPkdldEJ1ZmZlcigpICsgdG9wICogcGl0Y2gsIHBpdGNoKTsKKyAgICAgIEZYU1lTX21lbWNweShwQml0bWFwLT5HZXRCdWZmZXIoKSArIHRvcCAqIHBpdGNoLAorICAgICAgICAgICAgICAgICAgIHBCaXRtYXAtPkdldEJ1ZmZlcigpICsgYm90dG9tICogcGl0Y2gsIHBpdGNoKTsKKyAgICAgIEZYU1lTX21lbWNweShwQml0bWFwLT5HZXRCdWZmZXIoKSArIGJvdHRvbSAqIHBpdGNoLCB0ZW1wX2J1ZiwgcGl0Y2gpOworICAgICAgdG9wKys7CisgICAgICBib3R0b20tLTsKKyAgICB9CisgICAgRlhfRnJlZSh0ZW1wX2J1Zik7CisgICAgdGVtcF9idWYgPSBOVUxMOworICB9CisgIGlmIChwYm1pLT5ibWlIZWFkZXIuYmlCaXRDb3VudCA9PSAxKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgIHBCaXRtYXAtPlNldFBhbGV0dGVFbnRyeShpLCAoKEZYX0RXT1JEKilwYm1pLT5ibWlDb2xvcnMpW2ldIHwgMHhmZjAwMDAwMCk7CisgICAgfQorICB9IGVsc2UgaWYgKHBibWktPmJtaUhlYWRlci5iaUJpdENvdW50ID09IDgpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICBwQml0bWFwLT5TZXRQYWxldHRlRW50cnkoaSwgKChGWF9EV09SRCopcGJtaS0+Ym1pQ29sb3JzKVtpXSB8IDB4ZmYwMDAwMDApOworICAgIH0KKyAgfQorICByZXR1cm4gcEJpdG1hcDsKK30KK0NGWF9ESUJpdG1hcCogQ0ZYX1dpbmRvd3NESUI6OkxvYWRGcm9tQnVmKEJJVE1BUElORk8qIHBibWksIExQVk9JRCBwRGF0YSkgeworICByZXR1cm4gX0ZYX1dpbmRvd3NESUJfTG9hZEZyb21CdWYocGJtaSwgcERhdGEsIEZBTFNFKTsKK30KK0hCSVRNQVAgQ0ZYX1dpbmRvd3NESUI6OkdldEREQml0bWFwKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgSERDIGhEQykgeworICBDRlhfQnl0ZVN0cmluZyBpbmZvID0gR2V0Qml0bWFwSW5mbyhwQml0bWFwKTsKKyAgSEJJVE1BUCBoQml0bWFwID0gTlVMTDsKKyAgaEJpdG1hcCA9IENyZWF0ZURJQml0bWFwKGhEQywgKEJJVE1BUElORk9IRUFERVIqKWluZm8uY19zdHIoKSwgQ0JNX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwLT5HZXRCdWZmZXIoKSwgKEJJVE1BUElORk8qKWluZm8uY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERJQl9SR0JfQ09MT1JTKTsKKyAgcmV0dXJuIGhCaXRtYXA7Cit9Cit2b2lkIEdldEJpdG1hcFNpemUoSEJJVE1BUCBoQml0bWFwLCBpbnQmIHcsIGludCYgaCkgeworICBCSVRNQVAgYm1wOworICBHZXRPYmplY3QoaEJpdG1hcCwgc2l6ZW9mIGJtcCwgJmJtcCk7CisgIHcgPSBibXAuYm1XaWR0aDsKKyAgaCA9IGJtcC5ibUhlaWdodDsKK30KK0NGWF9ESUJpdG1hcCogQ0ZYX1dpbmRvd3NESUI6OkxvYWRGcm9tRmlsZShjb25zdCBGWF9XQ0hBUiogZmlsZW5hbWUpIHsKKyAgQ1dpbjMyUGxhdGZvcm0qIHBQbGF0Zm9ybSA9CisgICAgICAoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpOworICBpZiAocFBsYXRmb3JtLT5tX0dkaXBsdXNFeHQuSXNBdmFpbGFibGUoKSkgeworICAgIFdJTkRJQl9PcGVuX0FyZ3NfIGFyZ3M7CisgICAgYXJncy5mbGFncyA9IFdJTkRJQl9PUEVOX1BBVEhOQU1FOworICAgIGFyZ3MucGF0aF9uYW1lID0gZmlsZW5hbWU7CisgICAgcmV0dXJuIHBQbGF0Zm9ybS0+bV9HZGlwbHVzRXh0LkxvYWRESUJpdG1hcChhcmdzKTsKKyAgfQorICBIQklUTUFQIGhCaXRtYXAgPSAoSEJJVE1BUClMb2FkSW1hZ2VXKE5VTEwsICh3Y2hhcl90KilmaWxlbmFtZSwgSU1BR0VfQklUTUFQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIExSX0xPQURGUk9NRklMRSk7CisgIGlmICghaEJpdG1hcCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEhEQyBoREMgPSBDcmVhdGVDb21wYXRpYmxlREMoTlVMTCk7CisgIGludCB3aWR0aCwgaGVpZ2h0OworICBHZXRCaXRtYXBTaXplKGhCaXRtYXAsIHdpZHRoLCBoZWlnaHQpOworICBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7CisgIGlmICghcERJQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfUmdiKSkgeworICAgIGRlbGV0ZSBwRElCaXRtYXA7CisgICAgRGVsZXRlREMoaERDKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDRlhfQnl0ZVN0cmluZyBpbmZvID0gR2V0Qml0bWFwSW5mbyhwRElCaXRtYXApOworICBpbnQgcmV0ID0gR2V0RElCaXRzKGhEQywgaEJpdG1hcCwgMCwgaGVpZ2h0LCBwRElCaXRtYXAtPkdldEJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgIChCSVRNQVBJTkZPKilpbmZvLmNfc3RyKCksIERJQl9SR0JfQ09MT1JTKTsKKyAgaWYgKCFyZXQpIHsKKyAgICBkZWxldGUgcERJQml0bWFwOworICAgIHBESUJpdG1hcCA9IE5VTEw7CisgIH0KKyAgRGVsZXRlREMoaERDKTsKKyAgcmV0dXJuIHBESUJpdG1hcDsKK30KK0NGWF9ESUJpdG1hcCogQ0ZYX1dpbmRvd3NESUI6OkxvYWRESUJpdG1hcChXSU5ESUJfT3Blbl9BcmdzXyBhcmdzKSB7CisgIENXaW4zMlBsYXRmb3JtKiBwUGxhdGZvcm0gPQorICAgICAgKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKTsKKyAgaWYgKHBQbGF0Zm9ybS0+bV9HZGlwbHVzRXh0LklzQXZhaWxhYmxlKCkpIHsKKyAgICByZXR1cm4gcFBsYXRmb3JtLT5tX0dkaXBsdXNFeHQuTG9hZERJQml0bWFwKGFyZ3MpOworICB9CisgIGlmIChhcmdzLmZsYWdzID09IFdJTkRJQl9PUEVOX01FTU9SWSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEhCSVRNQVAgaEJpdG1hcCA9IChIQklUTUFQKUxvYWRJbWFnZVcoTlVMTCwgKHdjaGFyX3QqKWFyZ3MucGF0aF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQUdFX0JJVE1BUCwgMCwgMCwgTFJfTE9BREZST01GSUxFKTsKKyAgaWYgKCFoQml0bWFwKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgSERDIGhEQyA9IENyZWF0ZUNvbXBhdGlibGVEQyhOVUxMKTsKKyAgaW50IHdpZHRoLCBoZWlnaHQ7CisgIEdldEJpdG1hcFNpemUoaEJpdG1hcCwgd2lkdGgsIGhlaWdodCk7CisgIENGWF9ESUJpdG1hcCogcERJQml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsKKyAgaWYgKCFwRElCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9SZ2IpKSB7CisgICAgZGVsZXRlIHBESUJpdG1hcDsKKyAgICBEZWxldGVEQyhoREMpOworICAgIHJldHVybiBOVUxMOworICB9CisgIENGWF9CeXRlU3RyaW5nIGluZm8gPSBHZXRCaXRtYXBJbmZvKHBESUJpdG1hcCk7CisgIGludCByZXQgPSBHZXRESUJpdHMoaERDLCBoQml0bWFwLCAwLCBoZWlnaHQsIHBESUJpdG1hcC0+R2V0QnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgKEJJVE1BUElORk8qKWluZm8uY19zdHIoKSwgRElCX1JHQl9DT0xPUlMpOworICBpZiAoIXJldCkgeworICAgIGRlbGV0ZSBwRElCaXRtYXA7CisgICAgcERJQml0bWFwID0gTlVMTDsKKyAgfQorICBEZWxldGVEQyhoREMpOworICByZXR1cm4gcERJQml0bWFwOworfQorQ0ZYX0RJQml0bWFwKiBDRlhfV2luZG93c0RJQjo6TG9hZEZyb21EREIoSERDIGhEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhCSVRNQVAgaEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwUGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHBhbHNpemUpIHsKKyAgRlhfQk9PTCBiQ3JlYXRlZERDID0gIWhEQzsKKyAgaWYgKGJDcmVhdGVkREMpIHsKKyAgICBoREMgPSBDcmVhdGVDb21wYXRpYmxlREMoTlVMTCk7CisgIH0KKyAgQklUTUFQSU5GT0hFQURFUiBibWloOworICBGWFNZU19tZW1zZXQoJmJtaWgsIDAsIHNpemVvZiBibWloKTsKKyAgYm1paC5iaVNpemUgPSBzaXplb2YgYm1paDsKKyAgR2V0RElCaXRzKGhEQywgaEJpdG1hcCwgMCwgMCwgTlVMTCwgKEJJVE1BUElORk8qKSZibWloLCBESUJfUkdCX0NPTE9SUyk7CisgIGludCB3aWR0aCA9IGJtaWguYmlXaWR0aDsKKyAgaW50IGhlaWdodCA9IGFicyhibWloLmJpSGVpZ2h0KTsKKyAgYm1paC5iaUhlaWdodCA9IC1oZWlnaHQ7CisgIGJtaWguYmlDb21wcmVzc2lvbiA9IEJJX1JHQjsKKyAgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOworICBpbnQgcmV0ID0gMDsKKyAgaWYgKGJtaWguYmlCaXRDb3VudCA9PSAxIHx8IGJtaWguYmlCaXRDb3VudCA9PSA4KSB7CisgICAgaW50IHNpemUgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUikgKyA4OworICAgIGlmIChibWloLmJpQml0Q291bnQgPT0gOCkgeworICAgICAgc2l6ZSArPSBzaXplb2YoRlhfRFdPUkQpICogMjU0OworICAgIH0KKyAgICBCSVRNQVBJTkZPKiBwYm1paCA9IChCSVRNQVBJTkZPKilGWF9BbGxvYyh1aW50OF90LCBzaXplKTsKKyAgICBwYm1paC0+Ym1pSGVhZGVyLmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKKyAgICBwYm1paC0+Ym1pSGVhZGVyLmJpQml0Q291bnQgPSBibWloLmJpQml0Q291bnQ7CisgICAgcGJtaWgtPmJtaUhlYWRlci5iaUNvbXByZXNzaW9uID0gQklfUkdCOworICAgIHBibWloLT5ibWlIZWFkZXIuYmlIZWlnaHQgPSAtaGVpZ2h0OworICAgIHBibWloLT5ibWlIZWFkZXIuYmlQbGFuZXMgPSAxOworICAgIHBibWloLT5ibWlIZWFkZXIuYmlXaWR0aCA9IGJtaWguYmlXaWR0aDsKKyAgICBpZiAoIXBESUJpdG1hcC0+Q3JlYXRlKGJtaWguYmlXaWR0aCwgaGVpZ2h0LCBibWloLmJpQml0Q291bnQgPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEZYRElCXzFicHBSZ2IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGWERJQl84YnBwUmdiKSkgeworICAgICAgZGVsZXRlIHBESUJpdG1hcDsKKyAgICAgIEZYX0ZyZWUocGJtaWgpOworICAgICAgaWYgKGJDcmVhdGVkREMpIHsKICAgICAgICAgRGVsZXRlREMoaERDKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICByZXR1cm4gcERJQml0bWFwOworICAgIHJldCA9IEdldERJQml0cyhoREMsIGhCaXRtYXAsIDAsIGhlaWdodCwgcERJQml0bWFwLT5HZXRCdWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgKEJJVE1BUElORk8qKXBibWloLCBESUJfUkdCX0NPTE9SUyk7CisgICAgRlhfRnJlZShwYm1paCk7CisgICAgcGJtaWggPSBOVUxMOworICAgIHBESUJpdG1hcC0+Q29weVBhbGV0dGUocFBhbGV0dGUsIHBhbHNpemUpOworICB9IGVsc2UgeworICAgIGlmIChibWloLmJpQml0Q291bnQgPD0gMjQpIHsKKyAgICAgIGJtaWguYmlCaXRDb3VudCA9IDI0OworICAgIH0gZWxzZSB7CisgICAgICBibWloLmJpQml0Q291bnQgPSAzMjsKKyAgICB9CisgICAgaWYgKCFwRElCaXRtYXAtPkNyZWF0ZShibWloLmJpV2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtaWguYmlCaXRDb3VudCA9PSAyNCA/IEZYRElCX1JnYiA6IEZYRElCX1JnYjMyKSkgeworICAgICAgZGVsZXRlIHBESUJpdG1hcDsKKyAgICAgIGlmIChiQ3JlYXRlZERDKSB7CisgICAgICAgIERlbGV0ZURDKGhEQyk7CisgICAgICB9CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0ID0gR2V0RElCaXRzKGhEQywgaEJpdG1hcCwgMCwgaGVpZ2h0LCBwRElCaXRtYXAtPkdldEJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAoQklUTUFQSU5GTyopJmJtaWgsIERJQl9SR0JfQ09MT1JTKTsKKyAgICBpZiAocmV0ICE9IDAgJiYgYm1paC5iaUJpdENvdW50ID09IDMyKSB7CisgICAgICBpbnQgcGl0Y2ggPSBwRElCaXRtYXAtPkdldFBpdGNoKCk7CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9ICh1aW50OF90KikocERJQml0bWFwLT5HZXRCdWZmZXIoKSArIHJvdyAqIHBpdGNoKTsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgZGVzdF9zY2FuWzNdID0gMjU1OworICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChyZXQgPT0gMCkgeworICAgIGRlbGV0ZSBwRElCaXRtYXA7CisgICAgcERJQml0bWFwID0gTlVMTDsKKyAgfQorICBpZiAoYkNyZWF0ZWREQykgeworICAgIERlbGV0ZURDKGhEQyk7CisgIH0KKyAgcmV0dXJuIHBESUJpdG1hcDsKIH0KLUNGWF9XaW5kb3dzRElCOjpDRlhfV2luZG93c0RJQihIREMgaERDLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi17Ci0gICAgQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCX1JnYiwgKEZYX0xQQllURSkxKTsKLSAgICBCSVRNQVBJTkZPSEVBREVSIGJtaWg7Ci0gICAgRlhTWVNfbWVtc2V0MzIoJmJtaWgsIDAsIHNpemVvZiBibWloKTsKLSAgICBibWloLmJpU2l6ZSA9IHNpemVvZiBibWloOwotICAgIGJtaWguYmlCaXRDb3VudCA9IDI0OwotICAgIGJtaWguYmlIZWlnaHQgPSAtaGVpZ2h0OwotICAgIGJtaWguYmlQbGFuZXMgPSAxOwotICAgIGJtaWguYmlXaWR0aCA9IHdpZHRoOwotICAgIG1faEJpdG1hcCA9IENyZWF0ZURJQlNlY3Rpb24oaERDLCAoQklUTUFQSU5GTyopJmJtaWgsIERJQl9SR0JfQ09MT1JTLCAoTFBWT0lEKikmbV9wQnVmZmVyLCBOVUxMLCAwKTsKLSAgICBtX2hNZW1EQyA9IENyZWF0ZUNvbXBhdGlibGVEQyhoREMpOwotICAgIG1faE9sZEJpdG1hcCA9IChIQklUTUFQKVNlbGVjdE9iamVjdChtX2hNZW1EQywgbV9oQml0bWFwKTsKK0NGWF9XaW5kb3dzRElCOjpDRlhfV2luZG93c0RJQihIREMgaERDLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCX1JnYiwgKHVpbnQ4X3QqKTEpOworICBCSVRNQVBJTkZPSEVBREVSIGJtaWg7CisgIEZYU1lTX21lbXNldCgmYm1paCwgMCwgc2l6ZW9mIGJtaWgpOworICBibWloLmJpU2l6ZSA9IHNpemVvZiBibWloOworICBibWloLmJpQml0Q291bnQgPSAyNDsKKyAgYm1paC5iaUhlaWdodCA9IC1oZWlnaHQ7CisgIGJtaWguYmlQbGFuZXMgPSAxOworICBibWloLmJpV2lkdGggPSB3aWR0aDsKKyAgbV9oQml0bWFwID0gQ3JlYXRlRElCU2VjdGlvbihoREMsIChCSVRNQVBJTkZPKikmYm1paCwgRElCX1JHQl9DT0xPUlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRCopJm1fcEJ1ZmZlciwgTlVMTCwgMCk7CisgIG1faE1lbURDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGhEQyk7CisgIG1faE9sZEJpdG1hcCA9IChIQklUTUFQKVNlbGVjdE9iamVjdChtX2hNZW1EQywgbV9oQml0bWFwKTsKIH0KLUNGWF9XaW5kb3dzRElCOjp+Q0ZYX1dpbmRvd3NESUIoKQotewotICAgIFNlbGVjdE9iamVjdChtX2hNZW1EQywgbV9oT2xkQml0bWFwKTsKLSAgICBEZWxldGVEQyhtX2hNZW1EQyk7Ci0gICAgRGVsZXRlT2JqZWN0KG1faEJpdG1hcCk7CitDRlhfV2luZG93c0RJQjo6fkNGWF9XaW5kb3dzRElCKCkgeworICBTZWxlY3RPYmplY3QobV9oTWVtREMsIG1faE9sZEJpdG1hcCk7CisgIERlbGV0ZURDKG1faE1lbURDKTsKKyAgRGVsZXRlT2JqZWN0KG1faEJpdG1hcCk7CiB9Ci12b2lkIENGWF9XaW5kb3dzRElCOjpMb2FkRnJvbURldmljZShIREMgaERDLCBpbnQgbGVmdCwgaW50IHRvcCkKLXsKLSAgICA6OkJpdEJsdChtX2hNZW1EQywgMCwgMCwgbV9XaWR0aCwgbV9IZWlnaHQsIGhEQywgbGVmdCwgdG9wLCBTUkNDT1BZKTsKK3ZvaWQgQ0ZYX1dpbmRvd3NESUI6OkxvYWRGcm9tRGV2aWNlKEhEQyBoREMsIGludCBsZWZ0LCBpbnQgdG9wKSB7CisgIDo6Qml0Qmx0KG1faE1lbURDLCAwLCAwLCBtX1dpZHRoLCBtX0hlaWdodCwgaERDLCBsZWZ0LCB0b3AsIFNSQ0NPUFkpOwogfQotdm9pZCBDRlhfV2luZG93c0RJQjo6U2V0VG9EZXZpY2UoSERDIGhEQywgaW50IGxlZnQsIGludCB0b3ApCi17Ci0gICAgOjpCaXRCbHQoaERDLCBsZWZ0LCB0b3AsIG1fV2lkdGgsIG1fSGVpZ2h0LCBtX2hNZW1EQywgMCwgMCwgU1JDQ09QWSk7Cit2b2lkIENGWF9XaW5kb3dzRElCOjpTZXRUb0RldmljZShIREMgaERDLCBpbnQgbGVmdCwgaW50IHRvcCkgeworICA6OkJpdEJsdChoREMsIGxlZnQsIHRvcCwgbV9XaWR0aCwgbV9IZWlnaHQsIG1faE1lbURDLCAwLCAwLCBTUkNDT1BZKTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9kd3JpdGUuY3BwIGIvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9kd3JpdGUuY3BwCmluZGV4IDdhMTdjNGEuLjllNTZlZTcgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZHdyaXRlLmNwcAorKysgYi9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX2R3cml0ZS5jcHAKQEAgLTEsNDEwICsxLDM3MyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGdlL2Z4X2dlLmgiCi0jaWYgX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lONjRfCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGdlL2Z4X2dlX3dpbjMyLmgiCi0jaW5jbHVkZSAiZHdyaXRlX2ludC5oIgotI2luY2x1ZGUgPGR3cml0ZS5oPgotdHlwZWRlZiBIUkVTVUxUICAoX19zdGRjYWxsICpGdW5jVHlwZV9EV3JpdGVDcmVhdGVGYWN0b3J5KShfX2luIERXUklURV9GQUNUT1JZX1RZUEUsIF9faW4gUkVGSUlELCBfX291dCBJVW5rbm93biAqKik7Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgSW50ZXJmYWNlVHlwZT4KLWlubGluZSB2b2lkIFNhZmVSZWxlYXNlKEludGVyZmFjZVR5cGUqKiBjdXJyZW50T2JqZWN0KQotewotICAgIGlmICgqY3VycmVudE9iamVjdCAhPSBOVUxMKSB7Ci0gICAgICAgICgqY3VycmVudE9iamVjdCktPlJlbGVhc2UoKTsKLSAgICAgICAgKmN1cnJlbnRPYmplY3QgPSBOVUxMOwotICAgIH0KLX0KLXRlbXBsYXRlIDx0eXBlbmFtZSBJbnRlcmZhY2VUeXBlPgotaW5saW5lIEludGVyZmFjZVR5cGUqIFNhZmVBY3F1aXJlKEludGVyZmFjZVR5cGUqIG5ld09iamVjdCkKLXsKLSAgICBpZiAobmV3T2JqZWN0ICE9IE5VTEwpIHsKLSAgICAgICAgbmV3T2JqZWN0LT5BZGRSZWYoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ld09iamVjdDsKLX0KLWNsYXNzIENEd0ZvbnRGaWxlU3RyZWFtIEZYX0ZJTkFMIDogcHVibGljIElEV3JpdGVGb250RmlsZVN0cmVhbQotewotcHVibGljOgotICAgIGV4cGxpY2l0IENEd0ZvbnRGaWxlU3RyZWFtKHZvaWQgY29uc3QqIGZvbnRGaWxlUmVmZXJlbmNlS2V5LCBVSU5UMzIgZm9udEZpbGVSZWZlcmVuY2VLZXlTaXplKTsKLSAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgUXVlcnlJbnRlcmZhY2UoUkVGSUlEIGlpZCwgdm9pZCoqIHBwdk9iamVjdCk7Ci0gICAgdmlydHVhbCBVTE9ORyAgIFNURE1FVEhPRENBTExUWVBFIEFkZFJlZigpOwotICAgIHZpcnR1YWwgVUxPTkcgICBTVERNRVRIT0RDQUxMVFlQRSBSZWxlYXNlKCk7Ci0gICAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIFJlYWRGaWxlRnJhZ21lbnQodm9pZCBjb25zdCoqIGZyYWdtZW50U3RhcnQsIFVJTlQ2NCBmaWxlT2Zmc2V0LCBVSU5UNjQgZnJhZ21lbnRTaXplLCBPVVQgdm9pZCoqIGZyYWdtZW50Q29udGV4dCk7Ci0gICAgdmlydHVhbCB2b2lkICAgIFNURE1FVEhPRENBTExUWVBFIFJlbGVhc2VGaWxlRnJhZ21lbnQodm9pZCogZnJhZ21lbnRDb250ZXh0KTsKLSAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgR2V0RmlsZVNpemUoT1VUIFVJTlQ2NCogZmlsZVNpemUpOwotICAgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBHZXRMYXN0V3JpdGVUaW1lKE9VVCBVSU5UNjQqIGxhc3RXcml0ZVRpbWUpOwotICAgIGJvb2wgSXNJbml0aWFsaXplZCgpCi0gICAgewotICAgICAgICByZXR1cm4gcmVzb3VyY2VQdHJfICE9IE5VTEw7Ci0gICAgfQotcHJpdmF0ZToKLSAgICBVTE9ORyByZWZDb3VudF87Ci0gICAgdm9pZCBjb25zdCogcmVzb3VyY2VQdHJfOwotICAgIERXT1JEIHJlc291cmNlU2l6ZV87Ci19OwotY2xhc3MgQ0R3Rm9udEZpbGVMb2FkZXIgRlhfRklOQUwgOiBwdWJsaWMgSURXcml0ZUZvbnRGaWxlTG9hZGVyCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIFF1ZXJ5SW50ZXJmYWNlKFJFRklJRCBpaWQsIHZvaWQqKiBwcHZPYmplY3QpOwotICAgIHZpcnR1YWwgVUxPTkcgU1RETUVUSE9EQ0FMTFRZUEUgQWRkUmVmKCk7Ci0gICAgdmlydHVhbCBVTE9ORyBTVERNRVRIT0RDQUxMVFlQRSBSZWxlYXNlKCk7Ci0gICAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIENyZWF0ZVN0cmVhbUZyb21LZXkodm9pZCBjb25zdCogZm9udEZpbGVSZWZlcmVuY2VLZXksIFVJTlQzMiBmb250RmlsZVJlZmVyZW5jZUtleVNpemUsIE9VVCBJRFdyaXRlRm9udEZpbGVTdHJlYW0qKiBmb250RmlsZVN0cmVhbSk7CisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKIAotICAgIHN0YXRpYyBJRFdyaXRlRm9udEZpbGVMb2FkZXIqIEdldExvYWRlcigpCi0gICAgewotICAgICAgICBpZiAoaW5zdGFuY2VfID09IE5VTEwpIHsKLSAgICAgICAgICAgIGluc3RhbmNlXyA9IG5ldyBDRHdGb250RmlsZUxvYWRlcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnN0YW5jZV87CisjaWYgX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lONjRfREVTS1RPUF8KKyNpbmNsdWRlIDxkd3JpdGUuaD4KKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2dlX3dpbjMyLmgiCisjaW5jbHVkZSAiZHdyaXRlX2ludC5oIgorCit0eXBlZGVmIEhSRVNVTFQoX19zdGRjYWxsKiBGdW5jVHlwZV9EV3JpdGVDcmVhdGVGYWN0b3J5KSgKKyAgICBfX2luIERXUklURV9GQUNUT1JZX1RZUEUsCisgICAgX19pbiBSRUZJSUQsCisgICAgX19vdXQgSVVua25vd24qKik7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW50ZXJmYWNlVHlwZT4KK2lubGluZSB2b2lkIFNhZmVSZWxlYXNlKEludGVyZmFjZVR5cGUqKiBjdXJyZW50T2JqZWN0KSB7CisgIGlmICgqY3VycmVudE9iamVjdCkgeworICAgICgqY3VycmVudE9iamVjdCktPlJlbGVhc2UoKTsKKyAgICAqY3VycmVudE9iamVjdCA9IE5VTEw7CisgIH0KK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBJbnRlcmZhY2VUeXBlPgoraW5saW5lIEludGVyZmFjZVR5cGUqIFNhZmVBY3F1aXJlKEludGVyZmFjZVR5cGUqIG5ld09iamVjdCkgeworICBpZiAobmV3T2JqZWN0KSB7CisgICAgbmV3T2JqZWN0LT5BZGRSZWYoKTsKKyAgfQorICByZXR1cm4gbmV3T2JqZWN0OworfQorY2xhc3MgQ0R3Rm9udEZpbGVTdHJlYW0gZmluYWwgOiBwdWJsaWMgSURXcml0ZUZvbnRGaWxlU3RyZWFtIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENEd0ZvbnRGaWxlU3RyZWFtKHZvaWQgY29uc3QqIGZvbnRGaWxlUmVmZXJlbmNlS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgZm9udEZpbGVSZWZlcmVuY2VLZXlTaXplKTsKKyAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIFF1ZXJ5SW50ZXJmYWNlKFJFRklJRCBpaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogcHB2T2JqZWN0KTsKKyAgdmlydHVhbCBVTE9ORyBTVERNRVRIT0RDQUxMVFlQRSBBZGRSZWYoKTsKKyAgdmlydHVhbCBVTE9ORyBTVERNRVRIT0RDQUxMVFlQRSBSZWxlYXNlKCk7CisgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRQorICBSZWFkRmlsZUZyYWdtZW50KHZvaWQgY29uc3QqKiBmcmFnbWVudFN0YXJ0LAorICAgICAgICAgICAgICAgICAgIFVJTlQ2NCBmaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIFVJTlQ2NCBmcmFnbWVudFNpemUsCisgICAgICAgICAgICAgICAgICAgT1VUIHZvaWQqKiBmcmFnbWVudENvbnRleHQpOworICB2aXJ0dWFsIHZvaWQgU1RETUVUSE9EQ0FMTFRZUEUgUmVsZWFzZUZpbGVGcmFnbWVudCh2b2lkKiBmcmFnbWVudENvbnRleHQpOworICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgR2V0RmlsZVNpemUoT1VUIFVJTlQ2NCogZmlsZVNpemUpOworICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgR2V0TGFzdFdyaXRlVGltZShPVVQgVUlOVDY0KiBsYXN0V3JpdGVUaW1lKTsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgeyByZXR1cm4gcmVzb3VyY2VQdHJfICE9IE5VTEw7IH0KKworIHByaXZhdGU6CisgIFVMT05HIHJlZkNvdW50XzsKKyAgdm9pZCBjb25zdCogcmVzb3VyY2VQdHJfOworICBEV09SRCByZXNvdXJjZVNpemVfOworfTsKK2NsYXNzIENEd0ZvbnRGaWxlTG9hZGVyIGZpbmFsIDogcHVibGljIElEV3JpdGVGb250RmlsZUxvYWRlciB7CisgcHVibGljOgorICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgUXVlcnlJbnRlcmZhY2UoUkVGSUlEIGlpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBwcHZPYmplY3QpOworICB2aXJ0dWFsIFVMT05HIFNURE1FVEhPRENBTExUWVBFIEFkZFJlZigpOworICB2aXJ0dWFsIFVMT05HIFNURE1FVEhPRENBTExUWVBFIFJlbGVhc2UoKTsKKyAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFCisgIENyZWF0ZVN0cmVhbUZyb21LZXkodm9pZCBjb25zdCogZm9udEZpbGVSZWZlcmVuY2VLZXksCisgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGZvbnRGaWxlUmVmZXJlbmNlS2V5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBPVVQgSURXcml0ZUZvbnRGaWxlU3RyZWFtKiogZm9udEZpbGVTdHJlYW0pOworCisgIHN0YXRpYyBJRFdyaXRlRm9udEZpbGVMb2FkZXIqIEdldExvYWRlcigpIHsKKyAgICBpZiAoIWluc3RhbmNlXykgeworICAgICAgaW5zdGFuY2VfID0gbmV3IENEd0ZvbnRGaWxlTG9hZGVyKCk7CiAgICAgfQotICAgIHN0YXRpYyBib29sIElzTG9hZGVySW5pdGlhbGl6ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluc3RhbmNlXyAhPSBOVUxMOwotICAgIH0KLXByaXZhdGU6Ci0gICAgQ0R3Rm9udEZpbGVMb2FkZXIoKTsKLSAgICBVTE9ORyByZWZDb3VudF87Ci0gICAgc3RhdGljIElEV3JpdGVGb250RmlsZUxvYWRlciogaW5zdGFuY2VfOworICAgIHJldHVybiBpbnN0YW5jZV87CisgIH0KKyAgc3RhdGljIGJvb2wgSXNMb2FkZXJJbml0aWFsaXplZCgpIHsgcmV0dXJuIGluc3RhbmNlXyAhPSBOVUxMOyB9CisKKyBwcml2YXRlOgorICBDRHdGb250RmlsZUxvYWRlcigpOworICBVTE9ORyByZWZDb3VudF87CisgIHN0YXRpYyBJRFdyaXRlRm9udEZpbGVMb2FkZXIqIGluc3RhbmNlXzsKIH07Ci1jbGFzcyBDRHdGb250Q29udGV4dCAKLXsKLXB1YmxpYzoKLSAgICBDRHdGb250Q29udGV4dChJRFdyaXRlRmFjdG9yeSogZHdyaXRlRmFjdG9yeSk7Ci0gICAgfkNEd0ZvbnRDb250ZXh0KCk7Ci0gICAgSFJFU1VMVCBJbml0aWFsaXplKCk7Ci1wcml2YXRlOgotICAgIENEd0ZvbnRDb250ZXh0KENEd0ZvbnRDb250ZXh0IGNvbnN0Jik7Ci0gICAgdm9pZCBvcGVyYXRvcj0oQ0R3Rm9udENvbnRleHQgY29uc3QmKTsKLSAgICBIUkVTVUxUIGhyXzsKLSAgICBJRFdyaXRlRmFjdG9yeSogZHdyaXRlRmFjdG9yeV87CitjbGFzcyBDRHdGb250Q29udGV4dCB7CisgcHVibGljOgorICBDRHdGb250Q29udGV4dChJRFdyaXRlRmFjdG9yeSogZHdyaXRlRmFjdG9yeSk7CisgIH5DRHdGb250Q29udGV4dCgpOworICBIUkVTVUxUIEluaXRpYWxpemUoKTsKKworIHByaXZhdGU6CisgIENEd0ZvbnRDb250ZXh0KENEd0ZvbnRDb250ZXh0IGNvbnN0Jik7CisgIHZvaWQgb3BlcmF0b3I9KENEd0ZvbnRDb250ZXh0IGNvbnN0Jik7CisgIEhSRVNVTFQgaHJfOworICBJRFdyaXRlRmFjdG9yeSogZHdyaXRlRmFjdG9yeV87CiB9OwotY2xhc3MgQ0R3R2RpVGV4dFJlbmRlcmVyIAotewotcHVibGljOgotICAgIENEd0dkaVRleHRSZW5kZXJlcigKLSAgICAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAotICAgICAgICBJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0KiBiaXRtYXBSZW5kZXJUYXJnZXQsCi0gICAgICAgIElEV3JpdGVSZW5kZXJpbmdQYXJhbXMqIHJlbmRlcmluZ1BhcmFtcwotICAgICk7Ci0gICAgQ0R3R2RpVGV4dFJlbmRlcmVyOjp+Q0R3R2RpVGV4dFJlbmRlcmVyKCk7Ci0gICAgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBEcmF3R2x5cGhSdW4oCi0gICAgICAgIGNvbnN0IEZYX1JFQ1QmIHRleHRfYmJveCwKLSAgICAgICAgX19pbl9vcHQgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLAotICAgICAgICBfX2luX29wdCBEV1JJVEVfTUFUUklYIGNvbnN0KiBwTWF0cml4LAotICAgICAgICBGTE9BVCBiYXNlbGluZU9yaWdpblgsCi0gICAgICAgIEZMT0FUIGJhc2VsaW5lT3JpZ2luWSwKLSAgICAgICAgRFdSSVRFX01FQVNVUklOR19NT0RFIG1lYXN1cmluZ01vZGUsCi0gICAgICAgIF9faW4gRFdSSVRFX0dMWVBIX1JVTiBjb25zdCogZ2x5cGhSdW4sCi0gICAgICAgIGNvbnN0IENPTE9SUkVGJiB0ZXh0Q29sb3IKLSAgICApOwotcHJpdmF0ZToKLSAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXBfOwotICAgIElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQqIHBSZW5kZXJUYXJnZXRfOwotICAgIElEV3JpdGVSZW5kZXJpbmdQYXJhbXMqIHBSZW5kZXJpbmdQYXJhbXNfOworY2xhc3MgQ0R3R2RpVGV4dFJlbmRlcmVyIHsKKyBwdWJsaWM6CisgIENEd0dkaVRleHRSZW5kZXJlcihDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICBJRFdyaXRlQml0bWFwUmVuZGVyVGFyZ2V0KiBiaXRtYXBSZW5kZXJUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICBJRFdyaXRlUmVuZGVyaW5nUGFyYW1zKiByZW5kZXJpbmdQYXJhbXMpOworICB+Q0R3R2RpVGV4dFJlbmRlcmVyKCk7CisgIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgRHJhd0dseXBoUnVuKGNvbnN0IEZYX1JFQ1QmIHRleHRfYmJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pbl9vcHQgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2luX29wdCBEV1JJVEVfTUFUUklYIGNvbnN0KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTE9BVCBiYXNlbGluZU9yaWdpblgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMT0FUIGJhc2VsaW5lT3JpZ2luWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdSSVRFX01FQVNVUklOR19NT0RFIG1lYXN1cmluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faW4gRFdSSVRFX0dMWVBIX1JVTiBjb25zdCogZ2x5cGhSdW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPTE9SUkVGJiB0ZXh0Q29sb3IpOworCisgcHJpdmF0ZToKKyAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwXzsKKyAgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldCogcFJlbmRlclRhcmdldF87CisgIElEV3JpdGVSZW5kZXJpbmdQYXJhbXMqIHBSZW5kZXJpbmdQYXJhbXNfOwogfTsKLUNEV3JpdGVFeHQ6OkNEV3JpdGVFeHQoKQotewotICAgIG1faE1vZHVsZSA9IE5VTEw7Ci0gICAgbV9wRFdyaXRlRmFjdG9yeSA9IE5VTEw7CitDRFdyaXRlRXh0OjpDRFdyaXRlRXh0KCkgeworICBtX2hNb2R1bGUgPSBOVUxMOworICBtX3BEV3JpdGVGYWN0b3J5ID0gTlVMTDsKKyAgbV9wRHdGb250Q29udGV4dCA9IE5VTEw7CisgIG1fcER3VGV4dFJlbmRlcmVyID0gTlVMTDsKK30KK3ZvaWQgQ0RXcml0ZUV4dDo6TG9hZCgpIHt9Cit2b2lkIENEV3JpdGVFeHQ6OlVubG9hZCgpIHsKKyAgaWYgKG1fcER3Rm9udENvbnRleHQpIHsKKyAgICBkZWxldGUgKENEd0ZvbnRDb250ZXh0KiltX3BEd0ZvbnRDb250ZXh0OwogICAgIG1fcER3Rm9udENvbnRleHQgPSBOVUxMOwotICAgIG1fcER3VGV4dFJlbmRlcmVyID0gTlVMTDsKKyAgfQorICBTYWZlUmVsZWFzZSgoSURXcml0ZUZhY3RvcnkqKikmbV9wRFdyaXRlRmFjdG9yeSk7CiB9Ci12b2lkIENEV3JpdGVFeHQ6OkxvYWQoKQoteworQ0RXcml0ZUV4dDo6fkNEV3JpdGVFeHQoKSB7CisgIFVubG9hZCgpOwogfQotdm9pZCBDRFdyaXRlRXh0OjpVbmxvYWQoKQotewotICAgIGlmIChtX3BEd0ZvbnRDb250ZXh0KSB7Ci0gICAgICAgIGRlbGV0ZSAoQ0R3Rm9udENvbnRleHQqKW1fcER3Rm9udENvbnRleHQ7Ci0gICAgICAgIG1fcER3Rm9udENvbnRleHQgPSBOVUxMOwotICAgIH0KLSAgICBTYWZlUmVsZWFzZSgoSURXcml0ZUZhY3RvcnkqKikmbV9wRFdyaXRlRmFjdG9yeSk7Ci19Ci1DRFdyaXRlRXh0Ojp+Q0RXcml0ZUV4dCgpCi17Ci0gICAgVW5sb2FkKCk7Ci19Ci1MUFZPSUQJQ0RXcml0ZUV4dDo6RHdDcmVhdGVGb250RmFjZUZyb21TdHJlYW0oRlhfTFBCWVRFIHBEYXRhLCBGWF9EV09SRCBzaXplLCBpbnQgc2ltdWxhdGlvbl9zdHlsZSkKLXsKLSAgICBJRFdyaXRlRmFjdG9yeSogcER3RmFjdG9yeSA9IChJRFdyaXRlRmFjdG9yeSopbV9wRFdyaXRlRmFjdG9yeTsKLSAgICBJRFdyaXRlRm9udEZpbGUqIHBEd0ZvbnRGaWxlID0gTlVMTDsKLSAgICBJRFdyaXRlRm9udEZhY2UqIHBEd0ZvbnRGYWNlID0gTlVMTDsKLSAgICBCT09MIGlzU3VwcG9ydGVkRm9udFR5cGUgPSBGQUxTRTsKLSAgICBEV1JJVEVfRk9OVF9GSUxFX1RZUEUgZm9udEZpbGVUeXBlOwotICAgIERXUklURV9GT05UX0ZBQ0VfVFlQRSBmb250RmFjZVR5cGU7Ci0gICAgVUlOVDMyIG51bWJlck9mRmFjZXM7Ci0gICAgRFdSSVRFX0ZPTlRfU0lNVUxBVElPTlMgZm9udFN0eWxlID0gKERXUklURV9GT05UX1NJTVVMQVRJT05TKShzaW11bGF0aW9uX3N0eWxlICYgMyk7Ci0gICAgSFJFU1VMVCBociA9IFNfT0s7Ci0gICAgaHIgPSBwRHdGYWN0b3J5LT5DcmVhdGVDdXN0b21Gb250RmlsZVJlZmVyZW5jZSgKLSAgICAgICAgICAgICAodm9pZCBjb25zdCopcERhdGEsCi0gICAgICAgICAgICAgKFVJTlQzMilzaXplLAotICAgICAgICAgICAgIENEd0ZvbnRGaWxlTG9hZGVyOjpHZXRMb2FkZXIoKSwKLSAgICAgICAgICAgICAmcER3Rm9udEZpbGUKLSAgICAgICAgICk7Ci0gICAgaWYgKEZBSUxFRChocikpIHsKLSAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgIGhyID0gcER3Rm9udEZpbGUtPkFuYWx5emUoCi0gICAgICAgICAgICAgJmlzU3VwcG9ydGVkRm9udFR5cGUsCi0gICAgICAgICAgICAgJmZvbnRGaWxlVHlwZSwKLSAgICAgICAgICAgICAmZm9udEZhY2VUeXBlLAotICAgICAgICAgICAgICZudW1iZXJPZkZhY2VzCi0gICAgICAgICApOwotICAgIGlmIChGQUlMRUQoaHIpIHx8ICFpc1N1cHBvcnRlZEZvbnRUeXBlIHx8IGZvbnRGYWNlVHlwZSA9PSBEV1JJVEVfRk9OVF9GQUNFX1RZUEVfVU5LTk9XTikgewotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgaHIgPSBwRHdGYWN0b3J5LT5DcmVhdGVGb250RmFjZSgKLSAgICAgICAgICAgICBmb250RmFjZVR5cGUsCi0gICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAmcER3Rm9udEZpbGUsCi0gICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICBmb250U3R5bGUsCi0gICAgICAgICAgICAgJnBEd0ZvbnRGYWNlCi0gICAgICAgICApOwotICAgIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLSAgICBTYWZlUmVsZWFzZSgmcER3Rm9udEZpbGUpOwotICAgIHJldHVybiBwRHdGb250RmFjZTsKK0xQVk9JRCBDRFdyaXRlRXh0OjpEd0NyZWF0ZUZvbnRGYWNlRnJvbVN0cmVhbSh1aW50OF90KiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaW11bGF0aW9uX3N0eWxlKSB7CisgIElEV3JpdGVGYWN0b3J5KiBwRHdGYWN0b3J5ID0gKElEV3JpdGVGYWN0b3J5KiltX3BEV3JpdGVGYWN0b3J5OworICBJRFdyaXRlRm9udEZpbGUqIHBEd0ZvbnRGaWxlID0gTlVMTDsKKyAgSURXcml0ZUZvbnRGYWNlKiBwRHdGb250RmFjZSA9IE5VTEw7CisgIEJPT0wgaXNTdXBwb3J0ZWRGb250VHlwZSA9IEZBTFNFOworICBEV1JJVEVfRk9OVF9GSUxFX1RZUEUgZm9udEZpbGVUeXBlOworICBEV1JJVEVfRk9OVF9GQUNFX1RZUEUgZm9udEZhY2VUeXBlOworICBVSU5UMzIgbnVtYmVyT2ZGYWNlczsKKyAgRFdSSVRFX0ZPTlRfU0lNVUxBVElPTlMgZm9udFN0eWxlID0KKyAgICAgIChEV1JJVEVfRk9OVF9TSU1VTEFUSU9OUykoc2ltdWxhdGlvbl9zdHlsZSAmIDMpOworICBIUkVTVUxUIGhyID0gU19PSzsKKyAgaHIgPSBwRHdGYWN0b3J5LT5DcmVhdGVDdXN0b21Gb250RmlsZVJlZmVyZW5jZSgKKyAgICAgICh2b2lkIGNvbnN0KilwRGF0YSwgKFVJTlQzMilzaXplLCBDRHdGb250RmlsZUxvYWRlcjo6R2V0TG9hZGVyKCksCisgICAgICAmcER3Rm9udEZpbGUpOworICBpZiAoRkFJTEVEKGhyKSkgeworICAgIGdvdG8gZmFpbGVkOworICB9CisgIGhyID0gcER3Rm9udEZpbGUtPkFuYWx5emUoJmlzU3VwcG9ydGVkRm9udFR5cGUsICZmb250RmlsZVR5cGUsICZmb250RmFjZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bWJlck9mRmFjZXMpOworICBpZiAoRkFJTEVEKGhyKSB8fCAhaXNTdXBwb3J0ZWRGb250VHlwZSB8fAorICAgICAgZm9udEZhY2VUeXBlID09IERXUklURV9GT05UX0ZBQ0VfVFlQRV9VTktOT1dOKSB7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKyAgaHIgPSBwRHdGYWN0b3J5LT5DcmVhdGVGb250RmFjZShmb250RmFjZVR5cGUsIDEsICZwRHdGb250RmlsZSwgMCwgZm9udFN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRHdGb250RmFjZSk7CisgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKyAgU2FmZVJlbGVhc2UoJnBEd0ZvbnRGaWxlKTsKKyAgcmV0dXJuIHBEd0ZvbnRGYWNlOwogZmFpbGVkOgotICAgIFNhZmVSZWxlYXNlKCZwRHdGb250RmlsZSk7Ci0gICAgcmV0dXJuIE5VTEw7CisgIFNhZmVSZWxlYXNlKCZwRHdGb250RmlsZSk7CisgIHJldHVybiBOVUxMOwogfQotRlhfQk9PTCBDRFdyaXRlRXh0OjpEd0NyZWF0ZVJlbmRlcmluZ1RhcmdldChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIHZvaWQqKiByZW5kZXJUYXJnZXQpCi17Ci0gICAgaWYgKHBCaXRtYXAtPkdldEZvcm1hdCgpID4gRlhESUJfQXJnYikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIElEV3JpdGVGYWN0b3J5KiBwRHdGYWN0b3J5ID0gKElEV3JpdGVGYWN0b3J5KiltX3BEV3JpdGVGYWN0b3J5OwotICAgIElEV3JpdGVHZGlJbnRlcm9wKiBwR2RpSW50ZXJvcCA9IE5VTEw7Ci0gICAgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldCogcEJpdG1hcFJlbmRlclRhcmdldCA9IE5VTEw7Ci0gICAgSURXcml0ZVJlbmRlcmluZ1BhcmFtcyogcFJlbmRlcmluZ1BhcmFtcyA9IE5VTEw7Ci0gICAgSFJFU1VMVCBociA9IFNfT0s7Ci0gICAgaHIgPSBwRHdGYWN0b3J5LT5HZXRHZGlJbnRlcm9wKCZwR2RpSW50ZXJvcCk7Ci0gICAgaWYgKEZBSUxFRChocikpIHsKLSAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgIGhyID0gcEdkaUludGVyb3AtPkNyZWF0ZUJpdG1hcFJlbmRlclRhcmdldChOVUxMLCBwQml0bWFwLT5HZXRXaWR0aCgpLCBwQml0bWFwLT5HZXRIZWlnaHQoKSwKLSAgICAgICAgICAgICZwQml0bWFwUmVuZGVyVGFyZ2V0KTsKLSAgICBpZiAoRkFJTEVEKGhyKSkgewotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgaHIgPSBwRHdGYWN0b3J5LT5DcmVhdGVDdXN0b21SZW5kZXJpbmdQYXJhbXMoCi0gICAgICAgICAgICAgMS4wZiwKLSAgICAgICAgICAgICAwLjBmLAotICAgICAgICAgICAgIDEuMGYsCi0gICAgICAgICAgICAgRFdSSVRFX1BJWEVMX0dFT01FVFJZX1JHQiwKLSAgICAgICAgICAgICBEV1JJVEVfUkVOREVSSU5HX01PREVfREVGQVVMVCwKLSAgICAgICAgICAgICAmcFJlbmRlcmluZ1BhcmFtcwotICAgICAgICAgKTsKLSAgICBpZiAoRkFJTEVEKGhyKSkgewotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgaHIgPSBwQml0bWFwUmVuZGVyVGFyZ2V0LT5TZXRQaXhlbHNQZXJEaXAoMS4wZik7Ci0gICAgaWYgKEZBSUxFRChocikpIHsKLSAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgICooQ0R3R2RpVGV4dFJlbmRlcmVyKiopcmVuZGVyVGFyZ2V0ID0gbmV3IENEd0dkaVRleHRSZW5kZXJlcihwQml0bWFwLCBwQml0bWFwUmVuZGVyVGFyZ2V0LCBwUmVuZGVyaW5nUGFyYW1zKTsKLSAgICBTYWZlUmVsZWFzZSgmcEdkaUludGVyb3ApOwotICAgIFNhZmVSZWxlYXNlKCZwQml0bWFwUmVuZGVyVGFyZ2V0KTsKLSAgICBTYWZlUmVsZWFzZSgmcFJlbmRlcmluZ1BhcmFtcyk7Ci0gICAgcmV0dXJuIFRSVUU7Ci1mYWlsZWQ6Ci0gICAgU2FmZVJlbGVhc2UoJnBHZGlJbnRlcm9wKTsKLSAgICBTYWZlUmVsZWFzZSgmcEJpdG1hcFJlbmRlclRhcmdldCk7Ci0gICAgU2FmZVJlbGVhc2UoJnBSZW5kZXJpbmdQYXJhbXMpOworRlhfQk9PTCBDRFdyaXRlRXh0OjpEd0NyZWF0ZVJlbmRlcmluZ1RhcmdldChDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiByZW5kZXJUYXJnZXQpIHsKKyAgaWYgKHBCaXRtYXAtPkdldEZvcm1hdCgpID4gRlhESUJfQXJnYikgewogICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBJRFdyaXRlRmFjdG9yeSogcER3RmFjdG9yeSA9IChJRFdyaXRlRmFjdG9yeSopbV9wRFdyaXRlRmFjdG9yeTsKKyAgSURXcml0ZUdkaUludGVyb3AqIHBHZGlJbnRlcm9wID0gTlVMTDsKKyAgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldCogcEJpdG1hcFJlbmRlclRhcmdldCA9IE5VTEw7CisgIElEV3JpdGVSZW5kZXJpbmdQYXJhbXMqIHBSZW5kZXJpbmdQYXJhbXMgPSBOVUxMOworICBIUkVTVUxUIGhyID0gU19PSzsKKyAgaHIgPSBwRHdGYWN0b3J5LT5HZXRHZGlJbnRlcm9wKCZwR2RpSW50ZXJvcCk7CisgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKyAgaHIgPSBwR2RpSW50ZXJvcC0+Q3JlYXRlQml0bWFwUmVuZGVyVGFyZ2V0KAorICAgICAgTlVMTCwgcEJpdG1hcC0+R2V0V2lkdGgoKSwgcEJpdG1hcC0+R2V0SGVpZ2h0KCksICZwQml0bWFwUmVuZGVyVGFyZ2V0KTsKKyAgaWYgKEZBSUxFRChocikpIHsKKyAgICBnb3RvIGZhaWxlZDsKKyAgfQorICBociA9IHBEd0ZhY3RvcnktPkNyZWF0ZUN1c3RvbVJlbmRlcmluZ1BhcmFtcygKKyAgICAgIDEuMGYsIDAuMGYsIDEuMGYsIERXUklURV9QSVhFTF9HRU9NRVRSWV9SR0IsCisgICAgICBEV1JJVEVfUkVOREVSSU5HX01PREVfREVGQVVMVCwgJnBSZW5kZXJpbmdQYXJhbXMpOworICBpZiAoRkFJTEVEKGhyKSkgeworICAgIGdvdG8gZmFpbGVkOworICB9CisgIGhyID0gcEJpdG1hcFJlbmRlclRhcmdldC0+U2V0UGl4ZWxzUGVyRGlwKDEuMGYpOworICBpZiAoRkFJTEVEKGhyKSkgeworICAgIGdvdG8gZmFpbGVkOworICB9CisgICooQ0R3R2RpVGV4dFJlbmRlcmVyKiopcmVuZGVyVGFyZ2V0ID0KKyAgICAgIG5ldyBDRHdHZGlUZXh0UmVuZGVyZXIocEJpdG1hcCwgcEJpdG1hcFJlbmRlclRhcmdldCwgcFJlbmRlcmluZ1BhcmFtcyk7CisgIFNhZmVSZWxlYXNlKCZwR2RpSW50ZXJvcCk7CisgIFNhZmVSZWxlYXNlKCZwQml0bWFwUmVuZGVyVGFyZ2V0KTsKKyAgU2FmZVJlbGVhc2UoJnBSZW5kZXJpbmdQYXJhbXMpOworICByZXR1cm4gVFJVRTsKK2ZhaWxlZDoKKyAgU2FmZVJlbGVhc2UoJnBHZGlJbnRlcm9wKTsKKyAgU2FmZVJlbGVhc2UoJnBCaXRtYXBSZW5kZXJUYXJnZXQpOworICBTYWZlUmVsZWFzZSgmcFJlbmRlcmluZ1BhcmFtcyk7CisgIHJldHVybiBGQUxTRTsKIH0KLUZYX0JPT0wJQ0RXcml0ZUV4dDo6RHdSZW5kaW5nU3RyaW5nKHZvaWQqIHJlbmRlclRhcmdldCwgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLCBGWF9SRUNUJiBzdHJpbmdSZWN0LCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZm9udCwgRlhfRkxPQVQgZm9udF9zaXplLCBGWF9BUkdCIHRleHRfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ2x5cGhfY291bnQsIHVuc2lnbmVkIHNob3J0KiBnbHlwaF9pbmRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYmFzZWxpbmVPcmlnaW5YLCBGWF9GTE9BVCBiYXNlbGluZU9yaWdpblksCitGWF9CT09MIENEV3JpdGVFeHQ6OkR3UmVuZGluZ1N0cmluZyh2b2lkKiByZW5kZXJUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9SRUNUJiBzdHJpbmdSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIHRleHRfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ2x5cGhfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCogZ2x5cGhfaW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJhc2VsaW5lT3JpZ2luWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJhc2VsaW5lT3JpZ2luWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGdseXBoX29mZnNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogZ2x5cGhfYWR2YW5jZXMpCi17Ci0gICAgaWYgKHJlbmRlclRhcmdldCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBDRHdHZGlUZXh0UmVuZGVyZXIqIHBUZXh0UmVuZGVyZXIgPSAoQ0R3R2RpVGV4dFJlbmRlcmVyKilyZW5kZXJUYXJnZXQ7Ci0gICAgRFdSSVRFX01BVFJJWCB0cmFuc2Zvcm07Ci0gICAgRFdSSVRFX0dMWVBIX1JVTiBnbHlwaFJ1bjsKLSAgICBIUkVTVUxUIGhyID0gU19PSzsKLSAgICBpZiAocE1hdHJpeCkgewotICAgICAgICB0cmFuc2Zvcm0ubTExID0gcE1hdHJpeC0+YTsKLSAgICAgICAgdHJhbnNmb3JtLm0xMiA9IHBNYXRyaXgtPmI7Ci0gICAgICAgIHRyYW5zZm9ybS5tMjEgPSBwTWF0cml4LT5jOwotICAgICAgICB0cmFuc2Zvcm0ubTIyID0gcE1hdHJpeC0+ZDsKLSAgICAgICAgdHJhbnNmb3JtLmR4ID0gcE1hdHJpeC0+ZTsKLSAgICAgICAgdHJhbnNmb3JtLmR5ID0gcE1hdHJpeC0+ZjsKLSAgICB9Ci0gICAgZ2x5cGhSdW4uZm9udEZhY2UgPSAoSURXcml0ZUZvbnRGYWNlKilmb250OwotICAgIGdseXBoUnVuLmZvbnRFbVNpemUgPSBmb250X3NpemU7Ci0gICAgZ2x5cGhSdW4uZ2x5cGhDb3VudCA9IGdseXBoX2NvdW50OwotICAgIGdseXBoUnVuLmdseXBoSW5kaWNlcyA9IGdseXBoX2luZGljZXM7Ci0gICAgZ2x5cGhSdW4uZ2x5cGhBZHZhbmNlcyA9IGdseXBoX2FkdmFuY2VzOwotICAgIGdseXBoUnVuLmdseXBoT2Zmc2V0cyA9IChEV1JJVEVfR0xZUEhfT0ZGU0VUKilnbHlwaF9vZmZzZXRzOwotICAgIGdseXBoUnVuLmlzU2lkZXdheXMgPSBGQUxTRTsKLSAgICBnbHlwaFJ1bi5iaWRpTGV2ZWwgPSAwOwotICAgIGhyID0gcFRleHRSZW5kZXJlci0+RHJhd0dseXBoUnVuKAotICAgICAgICAgICAgIHN0cmluZ1JlY3QsCi0gICAgICAgICAgICAgcENsaXBSZ24sCi0gICAgICAgICAgICAgcE1hdHJpeCA/ICZ0cmFuc2Zvcm0gOiBOVUxMLAotICAgICAgICAgICAgIGJhc2VsaW5lT3JpZ2luWCwgYmFzZWxpbmVPcmlnaW5ZLAotICAgICAgICAgICAgIERXUklURV9NRUFTVVJJTkdfTU9ERV9OQVRVUkFMLAotICAgICAgICAgICAgICZnbHlwaFJ1biwKLSAgICAgICAgICAgICBSR0IoRlhBUkdCX1IodGV4dF9jb2xvciksIEZYQVJHQl9HKHRleHRfY29sb3IpLCBGWEFSR0JfQih0ZXh0X2NvbG9yKSkKLSAgICAgICAgICk7Ci0gICAgcmV0dXJuIFNVQ0NFRURFRChocikgPyBUUlVFIDogRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogZ2x5cGhfYWR2YW5jZXMpIHsKKyAgaWYgKCFyZW5kZXJUYXJnZXQpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBDRHdHZGlUZXh0UmVuZGVyZXIqIHBUZXh0UmVuZGVyZXIgPSAoQ0R3R2RpVGV4dFJlbmRlcmVyKilyZW5kZXJUYXJnZXQ7CisgIERXUklURV9NQVRSSVggdHJhbnNmb3JtOworICBEV1JJVEVfR0xZUEhfUlVOIGdseXBoUnVuOworICBIUkVTVUxUIGhyID0gU19PSzsKKyAgaWYgKHBNYXRyaXgpIHsKKyAgICB0cmFuc2Zvcm0ubTExID0gcE1hdHJpeC0+YTsKKyAgICB0cmFuc2Zvcm0ubTEyID0gcE1hdHJpeC0+YjsKKyAgICB0cmFuc2Zvcm0ubTIxID0gcE1hdHJpeC0+YzsKKyAgICB0cmFuc2Zvcm0ubTIyID0gcE1hdHJpeC0+ZDsKKyAgICB0cmFuc2Zvcm0uZHggPSBwTWF0cml4LT5lOworICAgIHRyYW5zZm9ybS5keSA9IHBNYXRyaXgtPmY7CisgIH0KKyAgZ2x5cGhSdW4uZm9udEZhY2UgPSAoSURXcml0ZUZvbnRGYWNlKilmb250OworICBnbHlwaFJ1bi5mb250RW1TaXplID0gZm9udF9zaXplOworICBnbHlwaFJ1bi5nbHlwaENvdW50ID0gZ2x5cGhfY291bnQ7CisgIGdseXBoUnVuLmdseXBoSW5kaWNlcyA9IGdseXBoX2luZGljZXM7CisgIGdseXBoUnVuLmdseXBoQWR2YW5jZXMgPSBnbHlwaF9hZHZhbmNlczsKKyAgZ2x5cGhSdW4uZ2x5cGhPZmZzZXRzID0gKERXUklURV9HTFlQSF9PRkZTRVQqKWdseXBoX29mZnNldHM7CisgIGdseXBoUnVuLmlzU2lkZXdheXMgPSBGQUxTRTsKKyAgZ2x5cGhSdW4uYmlkaUxldmVsID0gMDsKKyAgaHIgPSBwVGV4dFJlbmRlcmVyLT5EcmF3R2x5cGhSdW4oCisgICAgICBzdHJpbmdSZWN0LCBwQ2xpcFJnbiwgcE1hdHJpeCA/ICZ0cmFuc2Zvcm0gOiBOVUxMLCBiYXNlbGluZU9yaWdpblgsCisgICAgICBiYXNlbGluZU9yaWdpblksIERXUklURV9NRUFTVVJJTkdfTU9ERV9OQVRVUkFMLCAmZ2x5cGhSdW4sCisgICAgICBSR0IoRlhBUkdCX1IodGV4dF9jb2xvciksIEZYQVJHQl9HKHRleHRfY29sb3IpLCBGWEFSR0JfQih0ZXh0X2NvbG9yKSkpOworICByZXR1cm4gU1VDQ0VFREVEKGhyKTsKIH0KLXZvaWQgQ0RXcml0ZUV4dDo6RHdEZWxldGVSZW5kZXJpbmdUYXJnZXQodm9pZCogcmVuZGVyVGFyZ2V0KQotewotICAgIGlmIChyZW5kZXJUYXJnZXQpIHsKLSAgICAgICAgZGVsZXRlIChDRHdHZGlUZXh0UmVuZGVyZXIqKXJlbmRlclRhcmdldDsKLSAgICB9Cit2b2lkIENEV3JpdGVFeHQ6OkR3RGVsZXRlUmVuZGVyaW5nVGFyZ2V0KHZvaWQqIHJlbmRlclRhcmdldCkgeworICBkZWxldGUgKENEd0dkaVRleHRSZW5kZXJlciopcmVuZGVyVGFyZ2V0OwogfQotdm9pZCBDRFdyaXRlRXh0OjpEd0RlbGV0ZUZvbnQodm9pZCogcEZvbnQpCi17Ci0gICAgaWYgKHBGb250KSB7Ci0gICAgICAgIFNhZmVSZWxlYXNlKChJRFdyaXRlRm9udEZhY2UqKikmcEZvbnQpOwotICAgIH0KK3ZvaWQgQ0RXcml0ZUV4dDo6RHdEZWxldGVGb250KHZvaWQqIHBGb250KSB7CisgIGlmIChwRm9udCkgeworICAgIFNhZmVSZWxlYXNlKChJRFdyaXRlRm9udEZhY2UqKikmcEZvbnQpOworICB9CiB9Ci1DRHdGb250RmlsZVN0cmVhbTo6Q0R3Rm9udEZpbGVTdHJlYW0odm9pZCBjb25zdCogZm9udEZpbGVSZWZlcmVuY2VLZXksIFVJTlQzMiBmb250RmlsZVJlZmVyZW5jZUtleVNpemUpCi17Ci0gICAgcmVmQ291bnRfID0gMDsKLSAgICByZXNvdXJjZVB0cl8gPSBmb250RmlsZVJlZmVyZW5jZUtleTsKLSAgICByZXNvdXJjZVNpemVfID0gZm9udEZpbGVSZWZlcmVuY2VLZXlTaXplOworQ0R3Rm9udEZpbGVTdHJlYW06OkNEd0ZvbnRGaWxlU3RyZWFtKHZvaWQgY29uc3QqIGZvbnRGaWxlUmVmZXJlbmNlS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBmb250RmlsZVJlZmVyZW5jZUtleVNpemUpIHsKKyAgcmVmQ291bnRfID0gMDsKKyAgcmVzb3VyY2VQdHJfID0gZm9udEZpbGVSZWZlcmVuY2VLZXk7CisgIHJlc291cmNlU2l6ZV8gPSBmb250RmlsZVJlZmVyZW5jZUtleVNpemU7CiB9Ci1IUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIENEd0ZvbnRGaWxlU3RyZWFtOjpRdWVyeUludGVyZmFjZShSRUZJSUQgaWlkLCB2b2lkKiogcHB2T2JqZWN0KQotewotICAgIGlmIChpaWQgPT0gSUlEX0lVbmtub3duIHx8IGlpZCA9PSBfX3V1aWRvZihJRFdyaXRlRm9udEZpbGVTdHJlYW0pKSB7Ci0gICAgICAgICpwcHZPYmplY3QgPSB0aGlzOwotICAgICAgICBBZGRSZWYoKTsKLSAgICAgICAgcmV0dXJuIFNfT0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKnBwdk9iamVjdCA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBFX05PSU5URVJGQUNFOwotICAgIH0KLX0KLVVMT05HIFNURE1FVEhPRENBTExUWVBFIENEd0ZvbnRGaWxlU3RyZWFtOjpBZGRSZWYoKQotewotICAgIHJldHVybiBJbnRlcmxvY2tlZEluY3JlbWVudCgobG9uZyopKCZyZWZDb3VudF8pKTsKLX0KLVVMT05HIFNURE1FVEhPRENBTExUWVBFIENEd0ZvbnRGaWxlU3RyZWFtOjpSZWxlYXNlKCkKLXsKLSAgICBVTE9ORyBuZXdDb3VudCA9IEludGVybG9ja2VkRGVjcmVtZW50KChsb25nKikoJnJlZkNvdW50XykpOwotICAgIGlmIChuZXdDb3VudCA9PSAwKSB7Ci0gICAgICAgIGRlbGV0ZSB0aGlzOwotICAgIH0KLSAgICByZXR1cm4gbmV3Q291bnQ7Ci19Ci1IUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIENEd0ZvbnRGaWxlU3RyZWFtOjpSZWFkRmlsZUZyYWdtZW50KAotICAgIHZvaWQgY29uc3QqKiBmcmFnbWVudFN0YXJ0LAotICAgIFVJTlQ2NCBmaWxlT2Zmc2V0LAotICAgIFVJTlQ2NCBmcmFnbWVudFNpemUsCi0gICAgT1VUIHZvaWQqKiBmcmFnbWVudENvbnRleHQKLSkKLXsKLSAgICBpZiAoZmlsZU9mZnNldCA8PSByZXNvdXJjZVNpemVfICYmCi0gICAgICAgICAgICBmcmFnbWVudFNpemUgPD0gcmVzb3VyY2VTaXplXyAtIGZpbGVPZmZzZXQpIHsKLSAgICAgICAgKmZyYWdtZW50U3RhcnQgPSBzdGF0aWNfY2FzdDxGWF9CWVRFIGNvbnN0Kj4ocmVzb3VyY2VQdHJfKSArIHN0YXRpY19jYXN0PHNpemVfdD4oZmlsZU9mZnNldCk7Ci0gICAgICAgICpmcmFnbWVudENvbnRleHQgPSBOVUxMOwotICAgICAgICByZXR1cm4gU19PSzsKLSAgICB9IGVsc2UgewotICAgICAgICAqZnJhZ21lbnRTdGFydCA9IE5VTEw7Ci0gICAgICAgICpmcmFnbWVudENvbnRleHQgPSBOVUxMOwotICAgICAgICByZXR1cm4gRV9GQUlMOwotICAgIH0KLX0KLXZvaWQgU1RETUVUSE9EQ0FMTFRZUEUgQ0R3Rm9udEZpbGVTdHJlYW06OlJlbGVhc2VGaWxlRnJhZ21lbnQodm9pZCogZnJhZ21lbnRDb250ZXh0KQotewotfQotSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBDRHdGb250RmlsZVN0cmVhbTo6R2V0RmlsZVNpemUoT1VUIFVJTlQ2NCogZmlsZVNpemUpCi17Ci0gICAgKmZpbGVTaXplID0gcmVzb3VyY2VTaXplXzsKK0hSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgQ0R3Rm9udEZpbGVTdHJlYW06OlF1ZXJ5SW50ZXJmYWNlKFJFRklJRCBpaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogcHB2T2JqZWN0KSB7CisgIGlmIChpaWQgPT0gSUlEX0lVbmtub3duIHx8IGlpZCA9PSBfX3V1aWRvZihJRFdyaXRlRm9udEZpbGVTdHJlYW0pKSB7CisgICAgKnBwdk9iamVjdCA9IHRoaXM7CisgICAgQWRkUmVmKCk7CiAgICAgcmV0dXJuIFNfT0s7CisgIH0KKyAgKnBwdk9iamVjdCA9IE5VTEw7CisgIHJldHVybiBFX05PSU5URVJGQUNFOwogfQotSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBDRHdGb250RmlsZVN0cmVhbTo6R2V0TGFzdFdyaXRlVGltZShPVVQgVUlOVDY0KiBsYXN0V3JpdGVUaW1lKQotewotICAgICpsYXN0V3JpdGVUaW1lID0gMDsKLSAgICByZXR1cm4gRV9OT1RJTVBMOworVUxPTkcgU1RETUVUSE9EQ0FMTFRZUEUgQ0R3Rm9udEZpbGVTdHJlYW06OkFkZFJlZigpIHsKKyAgcmV0dXJuIEludGVybG9ja2VkSW5jcmVtZW50KChsb25nKikoJnJlZkNvdW50XykpOworfQorVUxPTkcgU1RETUVUSE9EQ0FMTFRZUEUgQ0R3Rm9udEZpbGVTdHJlYW06OlJlbGVhc2UoKSB7CisgIFVMT05HIG5ld0NvdW50ID0gSW50ZXJsb2NrZWREZWNyZW1lbnQoKGxvbmcqKSgmcmVmQ291bnRfKSk7CisgIGlmIChuZXdDb3VudCA9PSAwKSB7CisgICAgZGVsZXRlIHRoaXM7CisgIH0KKyAgcmV0dXJuIG5ld0NvdW50OworfQorSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRQorQ0R3Rm9udEZpbGVTdHJlYW06OlJlYWRGaWxlRnJhZ21lbnQodm9pZCBjb25zdCoqIGZyYWdtZW50U3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UNjQgZmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQ2NCBmcmFnbWVudFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVQgdm9pZCoqIGZyYWdtZW50Q29udGV4dCkgeworICBpZiAoZmlsZU9mZnNldCA8PSByZXNvdXJjZVNpemVfICYmCisgICAgICBmcmFnbWVudFNpemUgPD0gcmVzb3VyY2VTaXplXyAtIGZpbGVPZmZzZXQpIHsKKyAgICAqZnJhZ21lbnRTdGFydCA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgY29uc3QqPihyZXNvdXJjZVB0cl8pICsKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4oZmlsZU9mZnNldCk7CisgICAgKmZyYWdtZW50Q29udGV4dCA9IE5VTEw7CisgICAgcmV0dXJuIFNfT0s7CisgIH0KKyAgKmZyYWdtZW50U3RhcnQgPSBOVUxMOworICAqZnJhZ21lbnRDb250ZXh0ID0gTlVMTDsKKyAgcmV0dXJuIEVfRkFJTDsKK30KK3ZvaWQgU1RETUVUSE9EQ0FMTFRZUEUKK0NEd0ZvbnRGaWxlU3RyZWFtOjpSZWxlYXNlRmlsZUZyYWdtZW50KHZvaWQqIGZyYWdtZW50Q29udGV4dCkge30KK0hSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgQ0R3Rm9udEZpbGVTdHJlYW06OkdldEZpbGVTaXplKE9VVCBVSU5UNjQqIGZpbGVTaXplKSB7CisgICpmaWxlU2l6ZSA9IHJlc291cmNlU2l6ZV87CisgIHJldHVybiBTX09LOworfQorSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRQorQ0R3Rm9udEZpbGVTdHJlYW06OkdldExhc3RXcml0ZVRpbWUoT1VUIFVJTlQ2NCogbGFzdFdyaXRlVGltZSkgeworICAqbGFzdFdyaXRlVGltZSA9IDA7CisgIHJldHVybiBFX05PVElNUEw7CiB9CiBJRFdyaXRlRm9udEZpbGVMb2FkZXIqIENEd0ZvbnRGaWxlTG9hZGVyOjppbnN0YW5jZV8gPSBOVUxMOwotQ0R3Rm9udEZpbGVMb2FkZXI6OkNEd0ZvbnRGaWxlTG9hZGVyKCkgOgotICAgIHJlZkNvdW50XygwKQoteworQ0R3Rm9udEZpbGVMb2FkZXI6OkNEd0ZvbnRGaWxlTG9hZGVyKCkgOiByZWZDb3VudF8oMCkge30KK0hSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgQ0R3Rm9udEZpbGVMb2FkZXI6OlF1ZXJ5SW50ZXJmYWNlKFJFRklJRCBpaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogcHB2T2JqZWN0KSB7CisgIGlmIChpaWQgPT0gSUlEX0lVbmtub3duIHx8IGlpZCA9PSBfX3V1aWRvZihJRFdyaXRlRm9udEZpbGVMb2FkZXIpKSB7CisgICAgKnBwdk9iamVjdCA9IHRoaXM7CisgICAgQWRkUmVmKCk7CisgICAgcmV0dXJuIFNfT0s7CisgIH0KKyAgKnBwdk9iamVjdCA9IE5VTEw7CisgIHJldHVybiBFX05PSU5URVJGQUNFOwogfQotSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBDRHdGb250RmlsZUxvYWRlcjo6UXVlcnlJbnRlcmZhY2UoUkVGSUlEIGlpZCwgdm9pZCoqIHBwdk9iamVjdCkKLXsKLSAgICBpZiAoaWlkID09IElJRF9JVW5rbm93biB8fCBpaWQgPT0gX191dWlkb2YoSURXcml0ZUZvbnRGaWxlTG9hZGVyKSkgewotICAgICAgICAqcHB2T2JqZWN0ID0gdGhpczsKLSAgICAgICAgQWRkUmVmKCk7Ci0gICAgICAgIHJldHVybiBTX09LOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpwcHZPYmplY3QgPSBOVUxMOwotICAgICAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKLSAgICB9CitVTE9ORyBTVERNRVRIT0RDQUxMVFlQRSBDRHdGb250RmlsZUxvYWRlcjo6QWRkUmVmKCkgeworICByZXR1cm4gSW50ZXJsb2NrZWRJbmNyZW1lbnQoKGxvbmcqKSgmcmVmQ291bnRfKSk7CiB9Ci1VTE9ORyBTVERNRVRIT0RDQUxMVFlQRSBDRHdGb250RmlsZUxvYWRlcjo6QWRkUmVmKCkKLXsKLSAgICByZXR1cm4gSW50ZXJsb2NrZWRJbmNyZW1lbnQoKGxvbmcqKSgmcmVmQ291bnRfKSk7Ci19Ci1VTE9ORyBTVERNRVRIT0RDQUxMVFlQRSBDRHdGb250RmlsZUxvYWRlcjo6UmVsZWFzZSgpCi17Ci0gICAgVUxPTkcgbmV3Q291bnQgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgobG9uZyopKCZyZWZDb3VudF8pKTsKLSAgICBpZiAobmV3Q291bnQgPT0gMCkgewotICAgICAgICBpbnN0YW5jZV8gPSBOVUxMOwotICAgICAgICBkZWxldGUgdGhpczsKLSAgICB9Ci0gICAgcmV0dXJuIG5ld0NvdW50OworVUxPTkcgU1RETUVUSE9EQ0FMTFRZUEUgQ0R3Rm9udEZpbGVMb2FkZXI6OlJlbGVhc2UoKSB7CisgIFVMT05HIG5ld0NvdW50ID0gSW50ZXJsb2NrZWREZWNyZW1lbnQoKGxvbmcqKSgmcmVmQ291bnRfKSk7CisgIGlmIChuZXdDb3VudCA9PSAwKSB7CisgICAgaW5zdGFuY2VfID0gTlVMTDsKKyAgICBkZWxldGUgdGhpczsKKyAgfQorICByZXR1cm4gbmV3Q291bnQ7CiB9CiBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIENEd0ZvbnRGaWxlTG9hZGVyOjpDcmVhdGVTdHJlYW1Gcm9tS2V5KAogICAgIHZvaWQgY29uc3QqIGZvbnRGaWxlUmVmZXJlbmNlS2V5LAogICAgIFVJTlQzMiBmb250RmlsZVJlZmVyZW5jZUtleVNpemUsCi0gICAgT1VUIElEV3JpdGVGb250RmlsZVN0cmVhbSoqIGZvbnRGaWxlU3RyZWFtCi0pCi17Ci0gICAgKmZvbnRGaWxlU3RyZWFtID0gTlVMTDsKLSAgICBDRHdGb250RmlsZVN0cmVhbSogc3RyZWFtID0gbmV3IENEd0ZvbnRGaWxlU3RyZWFtKGZvbnRGaWxlUmVmZXJlbmNlS2V5LCBmb250RmlsZVJlZmVyZW5jZUtleVNpemUpOwotICAgIGlmICghc3RyZWFtLT5Jc0luaXRpYWxpemVkKCkpIHsKLSAgICAgICAgZGVsZXRlIHN0cmVhbTsKLSAgICAgICAgcmV0dXJuIEVfRkFJTDsKLSAgICB9Ci0gICAgKmZvbnRGaWxlU3RyZWFtID0gU2FmZUFjcXVpcmUoc3RyZWFtKTsKLSAgICByZXR1cm4gU19PSzsKKyAgICBPVVQgSURXcml0ZUZvbnRGaWxlU3RyZWFtKiogZm9udEZpbGVTdHJlYW0pIHsKKyAgKmZvbnRGaWxlU3RyZWFtID0gTlVMTDsKKyAgQ0R3Rm9udEZpbGVTdHJlYW0qIHN0cmVhbSA9CisgICAgICBuZXcgQ0R3Rm9udEZpbGVTdHJlYW0oZm9udEZpbGVSZWZlcmVuY2VLZXksIGZvbnRGaWxlUmVmZXJlbmNlS2V5U2l6ZSk7CisgIGlmICghc3RyZWFtLT5Jc0luaXRpYWxpemVkKCkpIHsKKyAgICBkZWxldGUgc3RyZWFtOworICAgIHJldHVybiBFX0ZBSUw7CisgIH0KKyAgKmZvbnRGaWxlU3RyZWFtID0gU2FmZUFjcXVpcmUoc3RyZWFtKTsKKyAgcmV0dXJuIFNfT0s7CiB9Ci1DRHdGb250Q29udGV4dDo6Q0R3Rm9udENvbnRleHQoSURXcml0ZUZhY3RvcnkqIGR3cml0ZUZhY3RvcnkpIDoKLSAgICBocl8oU19GQUxTRSksCi0gICAgZHdyaXRlRmFjdG9yeV8oU2FmZUFjcXVpcmUoZHdyaXRlRmFjdG9yeSkpCi17CitDRHdGb250Q29udGV4dDo6Q0R3Rm9udENvbnRleHQoSURXcml0ZUZhY3RvcnkqIGR3cml0ZUZhY3RvcnkpCisgICAgOiBocl8oU19GQUxTRSksIGR3cml0ZUZhY3RvcnlfKFNhZmVBY3F1aXJlKGR3cml0ZUZhY3RvcnkpKSB7fQorQ0R3Rm9udENvbnRleHQ6On5DRHdGb250Q29udGV4dCgpIHsKKyAgaWYgKGR3cml0ZUZhY3RvcnlfICYmIGhyXyA9PSBTX09LKSB7CisgICAgZHdyaXRlRmFjdG9yeV8tPlVucmVnaXN0ZXJGb250RmlsZUxvYWRlcihDRHdGb250RmlsZUxvYWRlcjo6R2V0TG9hZGVyKCkpOworICB9CisgIFNhZmVSZWxlYXNlKCZkd3JpdGVGYWN0b3J5Xyk7CiB9Ci1DRHdGb250Q29udGV4dDo6fkNEd0ZvbnRDb250ZXh0KCkKLXsKLSAgICBpZihkd3JpdGVGYWN0b3J5XyAmJiBocl8gPT0gU19PSykgewotICAgICAgICBkd3JpdGVGYWN0b3J5Xy0+VW5yZWdpc3RlckZvbnRGaWxlTG9hZGVyKENEd0ZvbnRGaWxlTG9hZGVyOjpHZXRMb2FkZXIoKSk7Ci0gICAgfQotICAgIFNhZmVSZWxlYXNlKCZkd3JpdGVGYWN0b3J5Xyk7CitIUkVTVUxUIENEd0ZvbnRDb250ZXh0OjpJbml0aWFsaXplKCkgeworICBpZiAoaHJfID09IFNfRkFMU0UpIHsKKyAgICByZXR1cm4gaHJfID0gZHdyaXRlRmFjdG9yeV8tPlJlZ2lzdGVyRm9udEZpbGVMb2FkZXIoCisgICAgICAgICAgICAgICBDRHdGb250RmlsZUxvYWRlcjo6R2V0TG9hZGVyKCkpOworICB9CisgIHJldHVybiBocl87CiB9Ci1IUkVTVUxUIENEd0ZvbnRDb250ZXh0OjpJbml0aWFsaXplKCkKLXsKLSAgICBpZiAoaHJfID09IFNfRkFMU0UpIHsKLSAgICAgICAgcmV0dXJuIGhyXyA9IGR3cml0ZUZhY3RvcnlfLT5SZWdpc3RlckZvbnRGaWxlTG9hZGVyKENEd0ZvbnRGaWxlTG9hZGVyOjpHZXRMb2FkZXIoKSk7Ci0gICAgfQotICAgIHJldHVybiBocl87Ci19Ci1DRHdHZGlUZXh0UmVuZGVyZXI6OkNEd0dkaVRleHRSZW5kZXJlcihDRlhfRElCaXRtYXAqIHBCaXRtYXAsIElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQqIGJpdG1hcFJlbmRlclRhcmdldCwgSURXcml0ZVJlbmRlcmluZ1BhcmFtcyogcmVuZGVyaW5nUGFyYW1zKToKLSAgICBwQml0bWFwXyhwQml0bWFwKSwKLSAgICBwUmVuZGVyVGFyZ2V0XyhTYWZlQWNxdWlyZShiaXRtYXBSZW5kZXJUYXJnZXQpKSwKLSAgICBwUmVuZGVyaW5nUGFyYW1zXyhTYWZlQWNxdWlyZShyZW5kZXJpbmdQYXJhbXMpKQotewotfQotQ0R3R2RpVGV4dFJlbmRlcmVyOjp+Q0R3R2RpVGV4dFJlbmRlcmVyKCkKLXsKLSAgICBTYWZlUmVsZWFzZSgmcFJlbmRlclRhcmdldF8pOwotICAgIFNhZmVSZWxlYXNlKCZwUmVuZGVyaW5nUGFyYW1zXyk7CitDRHdHZGlUZXh0UmVuZGVyZXI6OkNEd0dkaVRleHRSZW5kZXJlcigKKyAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldCogYml0bWFwUmVuZGVyVGFyZ2V0LAorICAgIElEV3JpdGVSZW5kZXJpbmdQYXJhbXMqIHJlbmRlcmluZ1BhcmFtcykKKyAgICA6IHBCaXRtYXBfKHBCaXRtYXApLAorICAgICAgcFJlbmRlclRhcmdldF8oU2FmZUFjcXVpcmUoYml0bWFwUmVuZGVyVGFyZ2V0KSksCisgICAgICBwUmVuZGVyaW5nUGFyYW1zXyhTYWZlQWNxdWlyZShyZW5kZXJpbmdQYXJhbXMpKSB7fQorQ0R3R2RpVGV4dFJlbmRlcmVyOjp+Q0R3R2RpVGV4dFJlbmRlcmVyKCkgeworICBTYWZlUmVsZWFzZSgmcFJlbmRlclRhcmdldF8pOworICBTYWZlUmVsZWFzZSgmcFJlbmRlcmluZ1BhcmFtc18pOwogfQogU1RETUVUSE9ESU1QIENEd0dkaVRleHRSZW5kZXJlcjo6RHJhd0dseXBoUnVuKAogICAgIGNvbnN0IEZYX1JFQ1QmIHRleHRfYmJveCwKQEAgLTQxNCw2MCArMzc3LDM0IEBACiAgICAgRkxPQVQgYmFzZWxpbmVPcmlnaW5ZLAogICAgIERXUklURV9NRUFTVVJJTkdfTU9ERSBtZWFzdXJpbmdNb2RlLAogICAgIF9faW4gRFdSSVRFX0dMWVBIX1JVTiBjb25zdCogZ2x5cGhSdW4sCi0gICAgY29uc3QgQ09MT1JSRUYmIHRleHRDb2xvcgotKQotewotICAgIEhSRVNVTFQgaHIgPSBTX09LOwotICAgIGlmIChwTWF0cml4KSB7Ci0gICAgICAgIGhyID0gcFJlbmRlclRhcmdldF8tPlNldEN1cnJlbnRUcmFuc2Zvcm0ocE1hdHJpeCk7Ci0gICAgICAgIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gaHI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgSERDIGhEQyA9IHBSZW5kZXJUYXJnZXRfLT5HZXRNZW1vcnlEQygpOwotICAgIEhCSVRNQVAgaEJpdG1hcCA9IChIQklUTUFQKTo6R2V0Q3VycmVudE9iamVjdChoREMsIE9CSl9CSVRNQVApOwotICAgIEJJVE1BUCBiaXRtYXA7Ci0gICAgR2V0T2JqZWN0KGhCaXRtYXAsIHNpemVvZiBiaXRtYXAsICZiaXRtYXApOwotICAgIENGWF9ESUJpdG1hcCBkaWI7Ci0gICAgZGliLkNyZWF0ZSgKLSAgICAgICAgYml0bWFwLmJtV2lkdGgsCi0gICAgICAgIGJpdG1hcC5ibUhlaWdodCwKLSAgICAgICAgYml0bWFwLmJtQml0c1BpeGVsID09IDI0ID8gRlhESUJfUmdiIDogRlhESUJfUmdiMzIsCi0gICAgICAgIChGWF9MUEJZVEUpYml0bWFwLmJtQml0cwotICAgICk7Ci0gICAgZGliLkNvbXBvc2l0ZUJpdG1hcCgKLSAgICAgICAgdGV4dF9iYm94LmxlZnQsCi0gICAgICAgIHRleHRfYmJveC50b3AsCi0gICAgICAgIHRleHRfYmJveC5XaWR0aCgpLAotICAgICAgICB0ZXh0X2Jib3guSGVpZ2h0KCksCi0gICAgICAgIHBCaXRtYXBfLAotICAgICAgICB0ZXh0X2Jib3gubGVmdCwKLSAgICAgICAgdGV4dF9iYm94LnRvcCwKLSAgICAgICAgRlhESUJfQkxFTkRfTk9STUFMLAotICAgICAgICBOVUxMCi0gICAgKTsKLSAgICBociA9IHBSZW5kZXJUYXJnZXRfLT5EcmF3R2x5cGhSdW4oCi0gICAgICAgICAgICAgYmFzZWxpbmVPcmlnaW5YLAotICAgICAgICAgICAgIGJhc2VsaW5lT3JpZ2luWSwKLSAgICAgICAgICAgICBtZWFzdXJpbmdNb2RlLAotICAgICAgICAgICAgIGdseXBoUnVuLAotICAgICAgICAgICAgIHBSZW5kZXJpbmdQYXJhbXNfLAotICAgICAgICAgICAgIHRleHRDb2xvcgotICAgICAgICAgKTsKKyAgICBjb25zdCBDT0xPUlJFRiYgdGV4dENvbG9yKSB7CisgIEhSRVNVTFQgaHIgPSBTX09LOworICBpZiAocE1hdHJpeCkgeworICAgIGhyID0gcFJlbmRlclRhcmdldF8tPlNldEN1cnJlbnRUcmFuc2Zvcm0ocE1hdHJpeCk7CiAgICAgaWYgKEZBSUxFRChocikpIHsKLSAgICAgICAgcmV0dXJuIGhyOworICAgICAgcmV0dXJuIGhyOwogICAgIH0KLSAgICBwQml0bWFwXy0+Q29tcG9zaXRlQml0bWFwKAotICAgICAgICB0ZXh0X2Jib3gubGVmdCwKLSAgICAgICAgdGV4dF9iYm94LnRvcCwKLSAgICAgICAgdGV4dF9iYm94LldpZHRoKCksCi0gICAgICAgIHRleHRfYmJveC5IZWlnaHQoKSwKLSAgICAgICAgJmRpYiwKLSAgICAgICAgdGV4dF9iYm94LmxlZnQsCi0gICAgICAgIHRleHRfYmJveC50b3AsCi0gICAgICAgIEZYRElCX0JMRU5EX05PUk1BTCwKLSAgICAgICAgcENsaXBSZ24KLSAgICApOworICB9CisgIEhEQyBoREMgPSBwUmVuZGVyVGFyZ2V0Xy0+R2V0TWVtb3J5REMoKTsKKyAgSEJJVE1BUCBoQml0bWFwID0gKEhCSVRNQVApOjpHZXRDdXJyZW50T2JqZWN0KGhEQywgT0JKX0JJVE1BUCk7CisgIEJJVE1BUCBiaXRtYXA7CisgIEdldE9iamVjdChoQml0bWFwLCBzaXplb2YgYml0bWFwLCAmYml0bWFwKTsKKyAgQ0ZYX0RJQml0bWFwIGRpYjsKKyAgZGliLkNyZWF0ZShiaXRtYXAuYm1XaWR0aCwgYml0bWFwLmJtSGVpZ2h0LAorICAgICAgICAgICAgIGJpdG1hcC5ibUJpdHNQaXhlbCA9PSAyNCA/IEZYRElCX1JnYiA6IEZYRElCX1JnYjMyLAorICAgICAgICAgICAgICh1aW50OF90KiliaXRtYXAuYm1CaXRzKTsKKyAgZGliLkNvbXBvc2l0ZUJpdG1hcCh0ZXh0X2Jib3gubGVmdCwgdGV4dF9iYm94LnRvcCwgdGV4dF9iYm94LldpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgdGV4dF9iYm94LkhlaWdodCgpLCBwQml0bWFwXywgdGV4dF9iYm94LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgdGV4dF9iYm94LnRvcCwgRlhESUJfQkxFTkRfTk9STUFMLCBOVUxMKTsKKyAgaHIgPSBwUmVuZGVyVGFyZ2V0Xy0+RHJhd0dseXBoUnVuKGJhc2VsaW5lT3JpZ2luWCwgYmFzZWxpbmVPcmlnaW5ZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyaW5nTW9kZSwgZ2x5cGhSdW4sIHBSZW5kZXJpbmdQYXJhbXNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dENvbG9yKTsKKyAgaWYgKEZBSUxFRChocikpIHsKICAgICByZXR1cm4gaHI7CisgIH0KKyAgcEJpdG1hcF8tPkNvbXBvc2l0ZUJpdG1hcCh0ZXh0X2Jib3gubGVmdCwgdGV4dF9iYm94LnRvcCwgdGV4dF9iYm94LldpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9iYm94LkhlaWdodCgpLCAmZGliLCB0ZXh0X2Jib3gubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2Jib3gudG9wLCBGWERJQl9CTEVORF9OT1JNQUwsIHBDbGlwUmduKTsKKyAgcmV0dXJuIGhyOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX2dkaXBleHQuY3BwIGIvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9nZGlwZXh0LmNwcAppbmRleCA2N2FhMTYyLi4xZTRmODk1IDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX2dkaXBleHQuY3BwCisrKyBiL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZ2RpcGV4dC5jcHAKQEAgLTEsMTEwICsxLDEwOSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vLi4vaW5jbHVkZS9meGdlL2Z4X2dlLmgiCi0jaWYgX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lONjRfCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKKworI2lmIF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjY0X0RFU0tUT1BfCiAjaW5jbHVkZSA8d2luZG93cy5oPgogI2luY2x1ZGUgPGFsZ29yaXRobT4KKwogbmFtZXNwYWNlIEdkaXBsdXMgewotICB1c2luZyBzdGQ6Om1pbjsKLSAgdXNpbmcgc3RkOjptYXg7Cit1c2luZyBzdGQ6Om1pbjsKK3VzaW5nIHN0ZDo6bWF4OwogfSAgLy8gbmFtZXNwYWNlIEdkaXBsdXMKKwogI2luY2x1ZGUgPGdkaXBsdXMuaD4KLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZ2Vfd2luMzIuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9nZV93aW4zMi5oIgogI2luY2x1ZGUgIndpbjMyX2ludC5oIgorCiB1c2luZyBuYW1lc3BhY2UgR2RpcGx1czsKIHVzaW5nIG5hbWVzcGFjZSBHZGlwbHVzOjpEbGxFeHBvcnRzOwotI2RlZmluZSBHZGlGaWxsVHlwZTJHZGlwKGZpbGxfdHlwZSkgKGZpbGxfdHlwZSA9PSBBTFRFUk5BVEUgPyBGaWxsTW9kZUFsdGVybmF0ZSA6IEZpbGxNb2RlV2luZGluZykKLXN0YXRpYyBDb21iaW5lTW9kZSBHZGlDb21iaW5lTW9kZTJHZGlwKGludCBtb2RlKQotewotICAgIHN3aXRjaCAobW9kZSkgewotICAgICAgICBjYXNlIFJHTl9BTkQ6Ci0gICAgICAgICAgICByZXR1cm4gQ29tYmluZU1vZGVJbnRlcnNlY3Q7Ci0gICAgfQotICAgIHJldHVybiBDb21iaW5lTW9kZUludGVyc2VjdDsKLX0KKworI2RlZmluZSBHZGlGaWxsVHlwZTJHZGlwKGZpbGxfdHlwZSkgXAorICAoZmlsbF90eXBlID09IEFMVEVSTkFURSA/IEZpbGxNb2RlQWx0ZXJuYXRlIDogRmlsbE1vZGVXaW5kaW5nKQorCiBlbnVtIHsKLSAgICBGdW5jSWRfR2RpcENyZWF0ZVBhdGgyLAotICAgIEZ1bmNJZF9HZGlwU2V0UGVuRGFzaFN0eWxlLAotICAgIEZ1bmNJZF9HZGlwU2V0UGVuRGFzaEFycmF5LAotICAgIEZ1bmNJZF9HZGlwU2V0UGVuRGFzaENhcDE5NzgxOSwKLSAgICBGdW5jSWRfR2RpcFNldFBlbkxpbmVKb2luLAotICAgIEZ1bmNJZF9HZGlwU2V0UGVuV2lkdGgsCi0gICAgRnVuY0lkX0dkaXBDcmVhdGVGcm9tSERDLAotICAgIEZ1bmNJZF9HZGlwU2V0UGFnZVVuaXQsCi0gICAgRnVuY0lkX0dkaXBTZXRTbW9vdGhpbmdNb2RlLAotICAgIEZ1bmNJZF9HZGlwQ3JlYXRlU29saWRGaWxsLAotICAgIEZ1bmNJZF9HZGlwRmlsbFBhdGgsCi0gICAgRnVuY0lkX0dkaXBEZWxldGVCcnVzaCwKLSAgICBGdW5jSWRfR2RpcENyZWF0ZVBlbjEsCi0gICAgRnVuY0lkX0dkaXBTZXRQZW5NaXRlckxpbWl0LAotICAgIEZ1bmNJZF9HZGlwRHJhd1BhdGgsCi0gICAgRnVuY0lkX0dkaXBEZWxldGVQZW4sCi0gICAgRnVuY0lkX0dkaXBEZWxldGVQYXRoLAotICAgIEZ1bmNJZF9HZGlwRGVsZXRlR3JhcGhpY3MsCi0gICAgRnVuY0lkX0dkaXBDcmVhdGVCaXRtYXBGcm9tRmlsZUlDTSwKLSAgICBGdW5jSWRfR2RpcENyZWF0ZUJpdG1hcEZyb21TdHJlYW1JQ00sCi0gICAgRnVuY0lkX0dkaXBHZXRJbWFnZUhlaWdodCwKLSAgICBGdW5jSWRfR2RpcEdldEltYWdlV2lkdGgsCi0gICAgRnVuY0lkX0dkaXBHZXRJbWFnZVBpeGVsRm9ybWF0LAotICAgIEZ1bmNJZF9HZGlwQml0bWFwTG9ja0JpdHMsCi0gICAgRnVuY0lkX0dkaXBHZXRJbWFnZVBhbGV0dGVTaXplLAotICAgIEZ1bmNJZF9HZGlwR2V0SW1hZ2VQYWxldHRlLAotICAgIEZ1bmNJZF9HZGlwQml0bWFwVW5sb2NrQml0cywKLSAgICBGdW5jSWRfR2RpcERpc3Bvc2VJbWFnZSwKLSAgICBGdW5jSWRfR2RpcEZpbGxSZWN0YW5nbGUsCi0gICAgRnVuY0lkX0dkaXBDcmVhdGVCaXRtYXBGcm9tU2NhbjAsCi0gICAgRnVuY0lkX0dkaXBTZXRJbWFnZVBhbGV0dGUsCi0gICAgRnVuY0lkX0dkaXBTZXRJbnRlcnBvbGF0aW9uTW9kZSwKLSAgICBGdW5jSWRfR2RpcERyYXdJbWFnZVBvaW50c0ksCi0gICAgRnVuY0lkX0dkaXBDcmVhdGVCaXRtYXBGcm9tR2RpRGliLAotICAgIEZ1bmNJZF9HZGlwbHVzU3RhcnR1cCwKLSAgICBGdW5jSWRfR2RpcERyYXdMaW5lSSwKLSAgICBGdW5jSWRfR2RpcFJlc2V0Q2xpcCwKLSAgICBGdW5jSWRfR2RpcENyZWF0ZVBhdGgsCi0gICAgRnVuY0lkX0dkaXBBZGRQYXRoUGF0aCwKLSAgICBGdW5jSWRfR2RpcFNldFBhdGhGaWxsTW9kZSwKLSAgICBGdW5jSWRfR2RpcFNldENsaXBQYXRoLAotICAgIEZ1bmNJZF9HZGlwR2V0Q2xpcCwKLSAgICBGdW5jSWRfR2RpcENyZWF0ZVJlZ2lvbiwKLSAgICBGdW5jSWRfR2RpcEdldENsaXBCb3VuZHNJLAotICAgIEZ1bmNJZF9HZGlwU2V0Q2xpcFJlZ2lvbiwKLSAgICBGdW5jSWRfR2RpcFdpZGVuUGF0aCwKLSAgICBGdW5jSWRfR2RpcEFkZFBhdGhMaW5lLAotICAgIEZ1bmNJZF9HZGlwQWRkUGF0aFJlY3RhbmdsZSwKLSAgICBGdW5jSWRfR2RpcERlbGV0ZVJlZ2lvbiwKLSAgICBGdW5jSWRfR2RpcEdldERDLAotICAgIEZ1bmNJZF9HZGlwUmVsZWFzZURDLAotICAgIEZ1bmNJZF9HZGlwU2V0UGVuTGluZUNhcDE5NzgxOSwKLSAgICBGdW5jSWRfR2RpcFNldFBlbkRhc2hPZmZzZXQsCi0gICAgRnVuY0lkX0dkaXBSZXNldFBhdGgsCi0gICAgRnVuY0lkX0dkaXBDcmVhdGVSZWdpb25QYXRoLAotICAgIEZ1bmNJZF9HZGlwQ3JlYXRlRm9udCwKLSAgICBGdW5jSWRfR2RpcEdldEZvbnRTaXplLAotICAgIEZ1bmNJZF9HZGlwQ3JlYXRlRm9udEZhbWlseUZyb21OYW1lLAotICAgIEZ1bmNJZF9HZGlwU2V0VGV4dFJlbmRlcmluZ0hpbnQsCi0gICAgRnVuY0lkX0dkaXBEcmF3RHJpdmVyU3RyaW5nLAotICAgIEZ1bmNJZF9HZGlwQ3JlYXRlTWF0cml4MiwKLSAgICBGdW5jSWRfR2RpcERlbGV0ZU1hdHJpeCwKLSAgICBGdW5jSWRfR2RpcFNldFdvcmxkVHJhbnNmb3JtLAotICAgIEZ1bmNJZF9HZGlwUmVzZXRXb3JsZFRyYW5zZm9ybSwKLSAgICBGdW5jSWRfR2RpcERlbGV0ZUZvbnRGYW1pbHksCi0gICAgRnVuY0lkX0dkaXBEZWxldGVGb250LAotICAgIEZ1bmNJZF9HZGlwTmV3UHJpdmF0ZUZvbnRDb2xsZWN0aW9uLAotICAgIEZ1bmNJZF9HZGlwRGVsZXRlUHJpdmF0ZUZvbnRDb2xsZWN0aW9uLAotICAgIEZ1bmNJZF9HZGlwUHJpdmF0ZUFkZE1lbW9yeUZvbnQsCi0gICAgRnVuY0lkX0dkaXBHZXRGb250Q29sbGVjdGlvbkZhbWlseUxpc3QsCi0gICAgRnVuY0lkX0dkaXBHZXRGb250Q29sbGVjdGlvbkZhbWlseUNvdW50LAotICAgIEZ1bmNJZF9HZGlwU2V0VGV4dENvbnRyYXN0LAotICAgIEZ1bmNJZF9HZGlwU2V0UGl4ZWxPZmZzZXRNb2RlLAotICAgIEZ1bmNJZF9HZGlwR2V0SW1hZ2VHcmFwaGljc0NvbnRleHQsCi0gICAgRnVuY0lkX0dkaXBEcmF3SW1hZ2VJLAotICAgIEZ1bmNJZF9HZGlwRHJhd0ltYWdlUmVjdEksCi0gICAgRnVuY0lkX0dkaXBEcmF3U3RyaW5nLAotICAgIEZ1bmNJZF9HZGlwU2V0UGVuVHJhbnNmb3JtLAorICBGdW5jSWRfR2RpcENyZWF0ZVBhdGgyLAorICBGdW5jSWRfR2RpcFNldFBlbkRhc2hTdHlsZSwKKyAgRnVuY0lkX0dkaXBTZXRQZW5EYXNoQXJyYXksCisgIEZ1bmNJZF9HZGlwU2V0UGVuRGFzaENhcDE5NzgxOSwKKyAgRnVuY0lkX0dkaXBTZXRQZW5MaW5lSm9pbiwKKyAgRnVuY0lkX0dkaXBTZXRQZW5XaWR0aCwKKyAgRnVuY0lkX0dkaXBDcmVhdGVGcm9tSERDLAorICBGdW5jSWRfR2RpcFNldFBhZ2VVbml0LAorICBGdW5jSWRfR2RpcFNldFNtb290aGluZ01vZGUsCisgIEZ1bmNJZF9HZGlwQ3JlYXRlU29saWRGaWxsLAorICBGdW5jSWRfR2RpcEZpbGxQYXRoLAorICBGdW5jSWRfR2RpcERlbGV0ZUJydXNoLAorICBGdW5jSWRfR2RpcENyZWF0ZVBlbjEsCisgIEZ1bmNJZF9HZGlwU2V0UGVuTWl0ZXJMaW1pdCwKKyAgRnVuY0lkX0dkaXBEcmF3UGF0aCwKKyAgRnVuY0lkX0dkaXBEZWxldGVQZW4sCisgIEZ1bmNJZF9HZGlwRGVsZXRlUGF0aCwKKyAgRnVuY0lkX0dkaXBEZWxldGVHcmFwaGljcywKKyAgRnVuY0lkX0dkaXBDcmVhdGVCaXRtYXBGcm9tRmlsZUlDTSwKKyAgRnVuY0lkX0dkaXBDcmVhdGVCaXRtYXBGcm9tU3RyZWFtSUNNLAorICBGdW5jSWRfR2RpcEdldEltYWdlSGVpZ2h0LAorICBGdW5jSWRfR2RpcEdldEltYWdlV2lkdGgsCisgIEZ1bmNJZF9HZGlwR2V0SW1hZ2VQaXhlbEZvcm1hdCwKKyAgRnVuY0lkX0dkaXBCaXRtYXBMb2NrQml0cywKKyAgRnVuY0lkX0dkaXBHZXRJbWFnZVBhbGV0dGVTaXplLAorICBGdW5jSWRfR2RpcEdldEltYWdlUGFsZXR0ZSwKKyAgRnVuY0lkX0dkaXBCaXRtYXBVbmxvY2tCaXRzLAorICBGdW5jSWRfR2RpcERpc3Bvc2VJbWFnZSwKKyAgRnVuY0lkX0dkaXBGaWxsUmVjdGFuZ2xlLAorICBGdW5jSWRfR2RpcENyZWF0ZUJpdG1hcEZyb21TY2FuMCwKKyAgRnVuY0lkX0dkaXBTZXRJbWFnZVBhbGV0dGUsCisgIEZ1bmNJZF9HZGlwU2V0SW50ZXJwb2xhdGlvbk1vZGUsCisgIEZ1bmNJZF9HZGlwRHJhd0ltYWdlUG9pbnRzSSwKKyAgRnVuY0lkX0dkaXBDcmVhdGVCaXRtYXBGcm9tR2RpRGliLAorICBGdW5jSWRfR2RpcGx1c1N0YXJ0dXAsCisgIEZ1bmNJZF9HZGlwRHJhd0xpbmVJLAorICBGdW5jSWRfR2RpcFJlc2V0Q2xpcCwKKyAgRnVuY0lkX0dkaXBDcmVhdGVQYXRoLAorICBGdW5jSWRfR2RpcEFkZFBhdGhQYXRoLAorICBGdW5jSWRfR2RpcFNldFBhdGhGaWxsTW9kZSwKKyAgRnVuY0lkX0dkaXBTZXRDbGlwUGF0aCwKKyAgRnVuY0lkX0dkaXBHZXRDbGlwLAorICBGdW5jSWRfR2RpcENyZWF0ZVJlZ2lvbiwKKyAgRnVuY0lkX0dkaXBHZXRDbGlwQm91bmRzSSwKKyAgRnVuY0lkX0dkaXBTZXRDbGlwUmVnaW9uLAorICBGdW5jSWRfR2RpcFdpZGVuUGF0aCwKKyAgRnVuY0lkX0dkaXBBZGRQYXRoTGluZSwKKyAgRnVuY0lkX0dkaXBBZGRQYXRoUmVjdGFuZ2xlLAorICBGdW5jSWRfR2RpcERlbGV0ZVJlZ2lvbiwKKyAgRnVuY0lkX0dkaXBHZXREQywKKyAgRnVuY0lkX0dkaXBSZWxlYXNlREMsCisgIEZ1bmNJZF9HZGlwU2V0UGVuTGluZUNhcDE5NzgxOSwKKyAgRnVuY0lkX0dkaXBTZXRQZW5EYXNoT2Zmc2V0LAorICBGdW5jSWRfR2RpcFJlc2V0UGF0aCwKKyAgRnVuY0lkX0dkaXBDcmVhdGVSZWdpb25QYXRoLAorICBGdW5jSWRfR2RpcENyZWF0ZUZvbnQsCisgIEZ1bmNJZF9HZGlwR2V0Rm9udFNpemUsCisgIEZ1bmNJZF9HZGlwQ3JlYXRlRm9udEZhbWlseUZyb21OYW1lLAorICBGdW5jSWRfR2RpcFNldFRleHRSZW5kZXJpbmdIaW50LAorICBGdW5jSWRfR2RpcERyYXdEcml2ZXJTdHJpbmcsCisgIEZ1bmNJZF9HZGlwQ3JlYXRlTWF0cml4MiwKKyAgRnVuY0lkX0dkaXBEZWxldGVNYXRyaXgsCisgIEZ1bmNJZF9HZGlwU2V0V29ybGRUcmFuc2Zvcm0sCisgIEZ1bmNJZF9HZGlwUmVzZXRXb3JsZFRyYW5zZm9ybSwKKyAgRnVuY0lkX0dkaXBEZWxldGVGb250RmFtaWx5LAorICBGdW5jSWRfR2RpcERlbGV0ZUZvbnQsCisgIEZ1bmNJZF9HZGlwTmV3UHJpdmF0ZUZvbnRDb2xsZWN0aW9uLAorICBGdW5jSWRfR2RpcERlbGV0ZVByaXZhdGVGb250Q29sbGVjdGlvbiwKKyAgRnVuY0lkX0dkaXBQcml2YXRlQWRkTWVtb3J5Rm9udCwKKyAgRnVuY0lkX0dkaXBHZXRGb250Q29sbGVjdGlvbkZhbWlseUxpc3QsCisgIEZ1bmNJZF9HZGlwR2V0Rm9udENvbGxlY3Rpb25GYW1pbHlDb3VudCwKKyAgRnVuY0lkX0dkaXBTZXRUZXh0Q29udHJhc3QsCisgIEZ1bmNJZF9HZGlwU2V0UGl4ZWxPZmZzZXRNb2RlLAorICBGdW5jSWRfR2RpcEdldEltYWdlR3JhcGhpY3NDb250ZXh0LAorICBGdW5jSWRfR2RpcERyYXdJbWFnZUksCisgIEZ1bmNJZF9HZGlwRHJhd0ltYWdlUmVjdEksCisgIEZ1bmNJZF9HZGlwRHJhd1N0cmluZywKKyAgRnVuY0lkX0dkaXBTZXRQZW5UcmFuc2Zvcm0sCiB9Owogc3RhdGljIExQQ1NUUiBnX0dkaXBGdW5jTmFtZXNbXSA9IHsKICAgICAiR2RpcENyZWF0ZVBhdGgyIiwKQEAgLTE4NiwxMDY5ICsxODUsMTMzMiBAQAogICAgICJHZGlwRHJhd1N0cmluZyIsCiAgICAgIkdkaXBTZXRQZW5UcmFuc2Zvcm0iLAogfTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBDcmVhdGVQYXRoMikoR0RJUENPTlNUIEdwUG9pbnRGKiwgR0RJUENPTlNUIEJZVEUqLCBJTlQsIEdwRmlsbE1vZGUsIEdwUGF0aCAqKnBhdGgpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcFNldFBlbkRhc2hTdHlsZSkoR3BQZW4gKnBlbiwgR3BEYXNoU3R5bGUgZGFzaHN0eWxlKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBTZXRQZW5EYXNoQXJyYXkpKEdwUGVuICpwZW4sIEdESVBDT05TVCBSRUFMICpkYXNoLCBJTlQgY291bnQpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcFNldFBlbkRhc2hDYXAxOTc4MTkpKEdwUGVuICpwZW4sIEdwRGFzaENhcCBkYXNoQ2FwKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBTZXRQZW5MaW5lSm9pbikoR3BQZW4gKnBlbiwgR3BMaW5lSm9pbiBsaW5lSm9pbik7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwU2V0UGVuV2lkdGgpKEdwUGVuICpwZW4sIFJFQUwgd2lkdGgpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcENyZWF0ZUZyb21IREMpKEhEQyBoZGMsIEdwR3JhcGhpY3MgKipncmFwaGljcyk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwU2V0UGFnZVVuaXQpKEdwR3JhcGhpY3MgKmdyYXBoaWNzLCBHcFVuaXQgdW5pdCk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwU2V0U21vb3RoaW5nTW9kZSkoR3BHcmFwaGljcyAqZ3JhcGhpY3MsIFNtb290aGluZ01vZGUgc21vb3RoaW5nTW9kZSk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwQ3JlYXRlU29saWRGaWxsKShBUkdCIGNvbG9yLCBHcFNvbGlkRmlsbCAqKmJydXNoKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBGaWxsUGF0aCkoR3BHcmFwaGljcyAqZ3JhcGhpY3MsIEdwQnJ1c2ggKmJydXNoLCBHcFBhdGggKnBhdGgpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcERlbGV0ZUJydXNoKShHcEJydXNoICpicnVzaCk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwQ3JlYXRlUGVuMSkoQVJHQiBjb2xvciwgUkVBTCB3aWR0aCwgR3BVbml0IHVuaXQsIEdwUGVuICoqcGVuKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBTZXRQZW5NaXRlckxpbWl0KShHcFBlbiAqcGVuLCBSRUFMIG1pdGVyTGltaXQpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcERyYXdQYXRoKShHcEdyYXBoaWNzICpncmFwaGljcywgR3BQZW4gKnBlbiwgR3BQYXRoICpwYXRoKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBEZWxldGVQZW4pKEdwUGVuICpwZW4pOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcERlbGV0ZVBhdGgpKEdwUGF0aCogcGF0aCk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwRGVsZXRlR3JhcGhpY3MpKEdwR3JhcGhpY3MgKmdyYXBoaWNzKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBDcmVhdGVCaXRtYXBGcm9tRmlsZUlDTSkoR0RJUENPTlNUIFdDSEFSKiBmaWxlbmFtZSwgR3BCaXRtYXAgKipiaXRtYXApOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcENyZWF0ZUJpdG1hcEZyb21TdHJlYW1JQ00pKElTdHJlYW0qIHN0cmVhbSwgR3BCaXRtYXAgKipiaXRtYXApOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcEdldEltYWdlV2lkdGgpKEdwSW1hZ2UgKmltYWdlLCBVSU5UICp3aWR0aCk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwR2V0SW1hZ2VIZWlnaHQpKEdwSW1hZ2UgKmltYWdlLCBVSU5UICpoZWlnaHQpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcEdldEltYWdlUGl4ZWxGb3JtYXQpKEdwSW1hZ2UgKmltYWdlLCBQaXhlbEZvcm1hdCAqZm9ybWF0KTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBCaXRtYXBMb2NrQml0cykoR3BCaXRtYXAqIGJpdG1hcCwgR0RJUENPTlNUIEdwUmVjdCogcmVjdCwgVUlOVCBmbGFncywgUGl4ZWxGb3JtYXQgZm9ybWF0LCBCaXRtYXBEYXRhKiBsb2NrZWRCaXRtYXBEYXRhKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBHZXRJbWFnZVBhbGV0dGUpKEdwSW1hZ2UgKmltYWdlLCBDb2xvclBhbGV0dGUgKnBhbGV0dGUsIElOVCBzaXplKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBHZXRJbWFnZVBhbGV0dGVTaXplKShHcEltYWdlICppbWFnZSwgSU5UICpzaXplKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBCaXRtYXBVbmxvY2tCaXRzKShHcEJpdG1hcCogYml0bWFwLCBCaXRtYXBEYXRhKiBsb2NrZWRCaXRtYXBEYXRhKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBEaXNwb3NlSW1hZ2UpKEdwSW1hZ2UgKmltYWdlKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBGaWxsUmVjdGFuZ2xlKShHcEdyYXBoaWNzICpncmFwaGljcywgR3BCcnVzaCAqYnJ1c2gsIFJFQUwgeCwgUkVBTCB5LCBSRUFMIHdpZHRoLCBSRUFMIGhlaWdodCk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwQ3JlYXRlQml0bWFwRnJvbVNjYW4wKShJTlQgd2lkdGgsIElOVCBoZWlnaHQsIElOVCBzdHJpZGUsIFBpeGVsRm9ybWF0IGZvcm1hdCwgQllURSogc2NhbjAsIEdwQml0bWFwKiogYml0bWFwKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBTZXRJbWFnZVBhbGV0dGUpKEdwSW1hZ2UgKmltYWdlLCBHRElQQ09OU1QgQ29sb3JQYWxldHRlICpwYWxldHRlKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBTZXRJbnRlcnBvbGF0aW9uTW9kZSkoR3BHcmFwaGljcyAqZ3JhcGhpY3MsIEludGVycG9sYXRpb25Nb2RlIGludGVycG9sYXRpb25Nb2RlKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBEcmF3SW1hZ2VQb2ludHNJKShHcEdyYXBoaWNzICpncmFwaGljcywgR3BJbWFnZSAqaW1hZ2UsIEdESVBDT05TVCBHcFBvaW50ICpkc3Rwb2ludHMsIElOVCBjb3VudCk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwQ3JlYXRlQml0bWFwRnJvbUdkaURpYikoR0RJUENPTlNUIEJJVE1BUElORk8qIGdkaUJpdG1hcEluZm8sIFZPSUQqIGdkaUJpdG1hcERhdGEsIEdwQml0bWFwKiogYml0bWFwKTsKLXR5cGVkZWYgU3RhdHVzIChXSU5BUEkgKkZ1bmNUeXBlX0dkaXBsdXNTdGFydHVwKShPVVQgRlhfVUlOVFBUUiAqdG9rZW4sIGNvbnN0IEdkaXBsdXNTdGFydHVwSW5wdXQgKmlucHV0LCBPVVQgR2RpcGx1c1N0YXJ0dXBPdXRwdXQgKm91dHB1dCk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwRHJhd0xpbmVJKShHcEdyYXBoaWNzICpncmFwaGljcywgR3BQZW4gKnBlbiwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBSZXNldENsaXApKEdwR3JhcGhpY3MgKmdyYXBoaWNzKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBDcmVhdGVQYXRoKShHcEZpbGxNb2RlIGJydXNoTW9kZSwgR3BQYXRoICoqcGF0aCk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwQWRkUGF0aFBhdGgpKEdwUGF0aCAqcGF0aCwgR0RJUENPTlNUIEdwUGF0aCogYWRkaW5nUGF0aCwgQk9PTCBjb25uZWN0KTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBTZXRQYXRoRmlsbE1vZGUpKEdwUGF0aCAqcGF0aCwgR3BGaWxsTW9kZSBmaWxsbW9kZSk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwU2V0Q2xpcFBhdGgpKEdwR3JhcGhpY3MgKmdyYXBoaWNzLCBHcFBhdGggKnBhdGgsIENvbWJpbmVNb2RlIGNvbWJpbmVNb2RlKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBHZXRDbGlwKShHcEdyYXBoaWNzICpncmFwaGljcywgR3BSZWdpb24gKnJlZ2lvbik7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwQ3JlYXRlUmVnaW9uKShHcFJlZ2lvbiAqKnJlZ2lvbik7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwR2V0Q2xpcEJvdW5kc0kpKEdwR3JhcGhpY3MgKmdyYXBoaWNzLCBHcFJlY3QgKnJlY3QpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcFNldENsaXBSZWdpb24pKEdwR3JhcGhpY3MgKmdyYXBoaWNzLCBHcFJlZ2lvbiAqcmVnaW9uLCBDb21iaW5lTW9kZSBjb21iaW5lTW9kZSk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwV2lkZW5QYXRoKShHcFBhdGggKm5hdGl2ZVBhdGgsIEdwUGVuICpwZW4sIEdwTWF0cml4ICptYXRyaXgsIFJFQUwgZmxhdG5lc3MpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcEFkZFBhdGhMaW5lKShHcFBhdGggKnBhdGgsIFJFQUwgeDEsIFJFQUwgeTEsIFJFQUwgeDIsIFJFQUwgeTIpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcEFkZFBhdGhSZWN0YW5nbGUpKEdwUGF0aCAqcGF0aCwgUkVBTCB4LCBSRUFMIHksIFJFQUwgd2lkdGgsIFJFQUwgaGVpZ2h0KTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBEZWxldGVSZWdpb24pKEdwUmVnaW9uICpyZWdpb24pOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcEdldERDKShHcEdyYXBoaWNzKiBncmFwaGljcywgSERDICogaGRjKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBSZWxlYXNlREMpKEdwR3JhcGhpY3MqIGdyYXBoaWNzLCBIREMgaGRjKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBTZXRQZW5MaW5lQ2FwMTk3ODE5KShHcFBlbiAqcGVuLCBHcExpbmVDYXAgc3RhcnRDYXAsIEdwTGluZUNhcCBlbmRDYXAsIEdwRGFzaENhcCBkYXNoQ2FwKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBTZXRQZW5EYXNoT2Zmc2V0KShHcFBlbiAqcGVuLCBSRUFMIG9mZnNldCk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwUmVzZXRQYXRoKShHcFBhdGggKnBhdGgpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcENyZWF0ZVJlZ2lvblBhdGgpKEdwUGF0aCAqcGF0aCwgR3BSZWdpb24gKipyZWdpb24pOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcENyZWF0ZUZvbnQpKEdESVBDT05TVCBHcEZvbnRGYW1pbHkgKmZvbnRGYW1pbHksIFJFQUwgZW1TaXplLCBJTlQgc3R5bGUsIFVuaXQgdW5pdCwgR3BGb250ICoqZm9udCk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwR2V0Rm9udFNpemUpKEdwRm9udCAqZm9udCwgUkVBTCAqc2l6ZSk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwQ3JlYXRlRm9udEZhbWlseUZyb21OYW1lKShHRElQQ09OU1QgV0NIQVIgKm5hbWUsIEdwRm9udENvbGxlY3Rpb24gKmZvbnRDb2xsZWN0aW9uLCBHcEZvbnRGYW1pbHkgKipGb250RmFtaWx5KTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBTZXRUZXh0UmVuZGVyaW5nSGludCkoR3BHcmFwaGljcyAqZ3JhcGhpY3MsIFRleHRSZW5kZXJpbmdIaW50IG1vZGUpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcERyYXdEcml2ZXJTdHJpbmcpKEdwR3JhcGhpY3MgKmdyYXBoaWNzLCBHRElQQ09OU1QgVUlOVDE2ICp0ZXh0LCBJTlQgbGVuZ3RoLCBHRElQQ09OU1QgR3BGb250ICpmb250LCBHRElQQ09OU1QgR3BCcnVzaCAqYnJ1c2gsIEdESVBDT05TVCBQb2ludEYgKnBvc2l0aW9ucywgSU5UIGZsYWdzLCBHRElQQ09OU1QgR3BNYXRyaXggKm1hdHJpeCk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwQ3JlYXRlTWF0cml4MikoUkVBTCBtMTEsIFJFQUwgbTEyLCBSRUFMIG0yMSwgUkVBTCBtMjIsIFJFQUwgZHgsIFJFQUwgZHksIEdwTWF0cml4ICoqbWF0cml4KTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBEZWxldGVNYXRyaXgpKEdwTWF0cml4ICptYXRyaXgpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcFNldFdvcmxkVHJhbnNmb3JtKShHcEdyYXBoaWNzICpncmFwaGljcywgR3BNYXRyaXggKm1hdHJpeCk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwUmVzZXRXb3JsZFRyYW5zZm9ybSkoR3BHcmFwaGljcyAqZ3JhcGhpY3MpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcERlbGV0ZUZvbnRGYW1pbHkpKEdwRm9udEZhbWlseSAqRm9udEZhbWlseSk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwRGVsZXRlRm9udCkoR3BGb250KiBmb250KTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBOZXdQcml2YXRlRm9udENvbGxlY3Rpb24pKEdwRm9udENvbGxlY3Rpb24qKiBmb250Q29sbGVjdGlvbik7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwRGVsZXRlUHJpdmF0ZUZvbnRDb2xsZWN0aW9uKShHcEZvbnRDb2xsZWN0aW9uKiogZm9udENvbGxlY3Rpb24pOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcFByaXZhdGVBZGRNZW1vcnlGb250KShHcEZvbnRDb2xsZWN0aW9uKiBmb250Q29sbGVjdGlvbiwgR0RJUENPTlNUIHZvaWQqIG1lbW9yeSwgSU5UIGxlbmd0aCk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwR2V0Rm9udENvbGxlY3Rpb25GYW1pbHlMaXN0KShHcEZvbnRDb2xsZWN0aW9uKiBmb250Q29sbGVjdGlvbiwgSU5UIG51bVNvdWdodCwgR3BGb250RmFtaWx5KiBncGZhbWlsaWVzW10sIElOVCogbnVtRm91bmQpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcEdldEZvbnRDb2xsZWN0aW9uRmFtaWx5Q291bnQpKEdwRm9udENvbGxlY3Rpb24qIGZvbnRDb2xsZWN0aW9uLCBJTlQqIG51bUZvdW5kKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBTZXRUZXh0Q29udHJhc3QpKEdwR3JhcGhpY3MgKmdyYXBoaWNzLCBVSU5UIGNvbnRyYXN0KTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBTZXRQaXhlbE9mZnNldE1vZGUpKEdwR3JhcGhpY3MqIGdyYXBoaWNzLCBQaXhlbE9mZnNldE1vZGUgcGl4ZWxPZmZzZXRNb2RlKTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBHZXRJbWFnZUdyYXBoaWNzQ29udGV4dCkoR3BJbWFnZSAqaW1hZ2UsIEdwR3JhcGhpY3MgKipncmFwaGljcyk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwRHJhd0ltYWdlSSkoR3BHcmFwaGljcyAqZ3JhcGhpY3MsIEdwSW1hZ2UgKmltYWdlLCBJTlQgeCwgSU5UIHkpOwotdHlwZWRlZiBHcFN0YXR1cyAoV0lOR0RJUEFQSSAqRnVuY1R5cGVfR2RpcERyYXdJbWFnZVJlY3RJKShHcEdyYXBoaWNzICpncmFwaGljcywgR3BJbWFnZSAqaW1hZ2UsIElOVCB4LCBJTlQgeSwgSU5UIHdpZHRoLCBJTlQgaGVpZ2h0KTsKLXR5cGVkZWYgR3BTdGF0dXMgKFdJTkdESVBBUEkgKkZ1bmNUeXBlX0dkaXBEcmF3U3RyaW5nKShHcEdyYXBoaWNzICpncmFwaGljcywgR0RJUENPTlNUIFdDSEFSICpzdHJpbmcsIElOVCBsZW5ndGgsIEdESVBDT05TVCBHcEZvbnQgKmZvbnQsIEdESVBDT05TVCBSZWN0RiAqbGF5b3V0UmVjdCwgR0RJUENPTlNUIEdwU3RyaW5nRm9ybWF0ICpzdHJpbmdGb3JtYXQsIEdESVBDT05TVCBHcEJydXNoICpicnVzaCk7Ci10eXBlZGVmIEdwU3RhdHVzIChXSU5HRElQQVBJICpGdW5jVHlwZV9HZGlwU2V0UGVuVHJhbnNmb3JtKShHcFBlbiAqcGVuLCBHcE1hdHJpeCAqbWF0cml4KTsKLSNkZWZpbmUgQ2FsbEZ1bmMoZnVuY25hbWUpICgoRnVuY1R5cGVfIyNmdW5jbmFtZSlHZGlwbHVzRXh0Lm1fRnVuY3Rpb25zW0Z1bmNJZF8jI2Z1bmNuYW1lXSkKLXR5cGVkZWYgSEFORExFICAgKF9fc3RkY2FsbCAqRnVuY1R5cGVfR2RpQWRkRm9udE1lbVJlc291cmNlRXgpKFBWT0lEIHBiRm9udCwgRFdPUkQgY2JGb250LCBQVk9JRCBwZHYsIERXT1JEICpwY0ZvbnRzKTsKLXR5cGVkZWYgQk9PTCAgICAgKF9fc3RkY2FsbCAqRnVuY1R5cGVfR2RpUmVtb3ZlRm9udE1lbVJlc291cmNlRXgpKEhBTkRMRSBoYW5kbGUpOwotdm9pZCogQ0dkaXBsdXNFeHQ6OkdkaUFkZEZvbnRNZW1SZXNvdXJjZUV4KHZvaWQgKnBGb250ZGF0YSwgRlhfRFdPUkQgc2l6ZSwgdm9pZCogcGR2LCBGWF9EV09SRCogbnVtX2ZhY2UpCi17Ci0gICAgaWYgKG1fcEdkaUFkZEZvbnRNZW1SZXNvdXJjZUV4KSB7Ci0gICAgICAgIHJldHVybiAoKEZ1bmNUeXBlX0dkaUFkZEZvbnRNZW1SZXNvdXJjZUV4KW1fcEdkaUFkZEZvbnRNZW1SZXNvdXJjZUV4KSgoUFZPSUQpcEZvbnRkYXRhLCAoRFdPUkQpc2l6ZSwgKFBWT0lEKXBkdiwgKERXT1JEKiludW1fZmFjZSk7Ci0gICAgfQordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwQ3JlYXRlUGF0aDIpKEdESVBDT05TVCBHcFBvaW50RiosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0RJUENPTlNUIEJZVEUqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcEZpbGxNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwUGF0aCoqIHBhdGgpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwU2V0UGVuRGFzaFN0eWxlKSgKKyAgICBHcFBlbiogcGVuLAorICAgIEdwRGFzaFN0eWxlIGRhc2hzdHlsZSk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBTZXRQZW5EYXNoQXJyYXkpKEdwUGVuKiBwZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdESVBDT05TVCBSRUFMKiBkYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY291bnQpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwU2V0UGVuRGFzaENhcDE5NzgxOSkoCisgICAgR3BQZW4qIHBlbiwKKyAgICBHcERhc2hDYXAgZGFzaENhcCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBTZXRQZW5MaW5lSm9pbikoR3BQZW4qIHBlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcExpbmVKb2luIGxpbmVKb2luKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcFNldFBlbldpZHRoKShHcFBlbiogcGVuLCBSRUFMIHdpZHRoKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcENyZWF0ZUZyb21IREMpKEhEQyBoZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcEdyYXBoaWNzKiogZ3JhcGhpY3MpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwU2V0UGFnZVVuaXQpKEdwR3JhcGhpY3MqIGdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwVW5pdCB1bml0KTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcFNldFNtb290aGluZ01vZGUpKAorICAgIEdwR3JhcGhpY3MqIGdyYXBoaWNzLAorICAgIFNtb290aGluZ01vZGUgc21vb3RoaW5nTW9kZSk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBDcmVhdGVTb2xpZEZpbGwpKEFSR0IgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwU29saWRGaWxsKiogYnJ1c2gpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwRmlsbFBhdGgpKEdwR3JhcGhpY3MqIGdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwQnJ1c2gqIGJydXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwUGF0aCogcGF0aCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBEZWxldGVCcnVzaCkoR3BCcnVzaCogYnJ1c2gpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwQ3JlYXRlUGVuMSkoQVJHQiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcFVuaXQgdW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwUGVuKiogcGVuKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcFNldFBlbk1pdGVyTGltaXQpKEdwUGVuKiBwZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFMIG1pdGVyTGltaXQpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwRHJhd1BhdGgpKEdwR3JhcGhpY3MqIGdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwUGVuKiBwZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BQYXRoKiBwYXRoKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcERlbGV0ZVBlbikoR3BQZW4qIHBlbik7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBEZWxldGVQYXRoKShHcFBhdGgqIHBhdGgpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwRGVsZXRlR3JhcGhpY3MpKEdwR3JhcGhpY3MqIGdyYXBoaWNzKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcENyZWF0ZUJpdG1hcEZyb21GaWxlSUNNKSgKKyAgICBHRElQQ09OU1QgV0NIQVIqIGZpbGVuYW1lLAorICAgIEdwQml0bWFwKiogYml0bWFwKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcENyZWF0ZUJpdG1hcEZyb21TdHJlYW1JQ00pKAorICAgIElTdHJlYW0qIHN0cmVhbSwKKyAgICBHcEJpdG1hcCoqIGJpdG1hcCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBHZXRJbWFnZVdpZHRoKShHcEltYWdlKiBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQqIHdpZHRoKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcEdldEltYWdlSGVpZ2h0KShHcEltYWdlKiBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UKiBoZWlnaHQpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwR2V0SW1hZ2VQaXhlbEZvcm1hdCkoCisgICAgR3BJbWFnZSogaW1hZ2UsCisgICAgUGl4ZWxGb3JtYXQqIGZvcm1hdCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBCaXRtYXBMb2NrQml0cykoCisgICAgR3BCaXRtYXAqIGJpdG1hcCwKKyAgICBHRElQQ09OU1QgR3BSZWN0KiByZWN0LAorICAgIFVJTlQgZmxhZ3MsCisgICAgUGl4ZWxGb3JtYXQgZm9ybWF0LAorICAgIEJpdG1hcERhdGEqIGxvY2tlZEJpdG1hcERhdGEpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwR2V0SW1hZ2VQYWxldHRlKSgKKyAgICBHcEltYWdlKiBpbWFnZSwKKyAgICBDb2xvclBhbGV0dGUqIHBhbGV0dGUsCisgICAgSU5UIHNpemUpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwR2V0SW1hZ2VQYWxldHRlU2l6ZSkoR3BJbWFnZSogaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQqIHNpemUpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwQml0bWFwVW5sb2NrQml0cykoCisgICAgR3BCaXRtYXAqIGJpdG1hcCwKKyAgICBCaXRtYXBEYXRhKiBsb2NrZWRCaXRtYXBEYXRhKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcERpc3Bvc2VJbWFnZSkoR3BJbWFnZSogaW1hZ2UpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwRmlsbFJlY3RhbmdsZSkoR3BHcmFwaGljcyogZ3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcEJydXNoKiBicnVzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUwgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUwgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFMIGhlaWdodCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBDcmVhdGVCaXRtYXBGcm9tU2NhbjApKAorICAgIElOVCB3aWR0aCwKKyAgICBJTlQgaGVpZ2h0LAorICAgIElOVCBzdHJpZGUsCisgICAgUGl4ZWxGb3JtYXQgZm9ybWF0LAorICAgIEJZVEUqIHNjYW4wLAorICAgIEdwQml0bWFwKiogYml0bWFwKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcFNldEltYWdlUGFsZXR0ZSkoCisgICAgR3BJbWFnZSogaW1hZ2UsCisgICAgR0RJUENPTlNUIENvbG9yUGFsZXR0ZSogcGFsZXR0ZSk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBTZXRJbnRlcnBvbGF0aW9uTW9kZSkoCisgICAgR3BHcmFwaGljcyogZ3JhcGhpY3MsCisgICAgSW50ZXJwb2xhdGlvbk1vZGUgaW50ZXJwb2xhdGlvbk1vZGUpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwRHJhd0ltYWdlUG9pbnRzSSkoCisgICAgR3BHcmFwaGljcyogZ3JhcGhpY3MsCisgICAgR3BJbWFnZSogaW1hZ2UsCisgICAgR0RJUENPTlNUIEdwUG9pbnQqIGRzdHBvaW50cywKKyAgICBJTlQgY291bnQpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwQ3JlYXRlQml0bWFwRnJvbUdkaURpYikoCisgICAgR0RJUENPTlNUIEJJVE1BUElORk8qIGdkaUJpdG1hcEluZm8sCisgICAgVk9JRCogZ2RpQml0bWFwRGF0YSwKKyAgICBHcEJpdG1hcCoqIGJpdG1hcCk7Cit0eXBlZGVmIFN0YXR1cyhXSU5BUEkqIEZ1bmNUeXBlX0dkaXBsdXNTdGFydHVwKSgKKyAgICBPVVQgdWludHB0cl90KiB0b2tlbiwKKyAgICBjb25zdCBHZGlwbHVzU3RhcnR1cElucHV0KiBpbnB1dCwKKyAgICBPVVQgR2RpcGx1c1N0YXJ0dXBPdXRwdXQqIG91dHB1dCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBEcmF3TGluZUkpKEdwR3JhcGhpY3MqIGdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcFBlbiogcGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeTIpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwUmVzZXRDbGlwKShHcEdyYXBoaWNzKiBncmFwaGljcyk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBDcmVhdGVQYXRoKShHcEZpbGxNb2RlIGJydXNoTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwUGF0aCoqIHBhdGgpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwQWRkUGF0aFBhdGgpKAorICAgIEdwUGF0aCogcGF0aCwKKyAgICBHRElQQ09OU1QgR3BQYXRoKiBhZGRpbmdQYXRoLAorICAgIEJPT0wgY29ubmVjdCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBTZXRQYXRoRmlsbE1vZGUpKEdwUGF0aCogcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BGaWxsTW9kZSBmaWxsbW9kZSk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBTZXRDbGlwUGF0aCkoR3BHcmFwaGljcyogZ3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BQYXRoKiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbWJpbmVNb2RlIGNvbWJpbmVNb2RlKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcEdldENsaXApKEdwR3JhcGhpY3MqIGdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BSZWdpb24qIHJlZ2lvbik7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBDcmVhdGVSZWdpb24pKEdwUmVnaW9uKiogcmVnaW9uKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcEdldENsaXBCb3VuZHNJKShHcEdyYXBoaWNzKiBncmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcFJlY3QqIHJlY3QpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwU2V0Q2xpcFJlZ2lvbikoCisgICAgR3BHcmFwaGljcyogZ3JhcGhpY3MsCisgICAgR3BSZWdpb24qIHJlZ2lvbiwKKyAgICBDb21iaW5lTW9kZSBjb21iaW5lTW9kZSk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBXaWRlblBhdGgpKEdwUGF0aCogbmF0aXZlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BQZW4qIHBlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BNYXRyaXgqIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBTCBmbGF0bmVzcyk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBBZGRQYXRoTGluZSkoR3BQYXRoKiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUwgeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBTCB5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFMIHgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUwgeTIpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwQWRkUGF0aFJlY3RhbmdsZSkoR3BQYXRoKiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBTCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBTCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBTCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUwgaGVpZ2h0KTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcERlbGV0ZVJlZ2lvbikoR3BSZWdpb24qIHJlZ2lvbik7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBHZXREQykoR3BHcmFwaGljcyogZ3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSERDKiBoZGMpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwUmVsZWFzZURDKShHcEdyYXBoaWNzKiBncmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSERDIGhkYyk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBTZXRQZW5MaW5lQ2FwMTk3ODE5KSgKKyAgICBHcFBlbiogcGVuLAorICAgIEdwTGluZUNhcCBzdGFydENhcCwKKyAgICBHcExpbmVDYXAgZW5kQ2FwLAorICAgIEdwRGFzaENhcCBkYXNoQ2FwKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcFNldFBlbkRhc2hPZmZzZXQpKEdwUGVuKiBwZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFMIG9mZnNldCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBSZXNldFBhdGgpKEdwUGF0aCogcGF0aCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBDcmVhdGVSZWdpb25QYXRoKShHcFBhdGgqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcFJlZ2lvbioqIHJlZ2lvbik7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBDcmVhdGVGb250KSgKKyAgICBHRElQQ09OU1QgR3BGb250RmFtaWx5KiBmb250RmFtaWx5LAorICAgIFJFQUwgZW1TaXplLAorICAgIElOVCBzdHlsZSwKKyAgICBVbml0IHVuaXQsCisgICAgR3BGb250KiogZm9udCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBHZXRGb250U2l6ZSkoR3BGb250KiBmb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUwqIHNpemUpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwQ3JlYXRlRm9udEZhbWlseUZyb21OYW1lKSgKKyAgICBHRElQQ09OU1QgV0NIQVIqIG5hbWUsCisgICAgR3BGb250Q29sbGVjdGlvbiogZm9udENvbGxlY3Rpb24sCisgICAgR3BGb250RmFtaWx5KiogRm9udEZhbWlseSk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBTZXRUZXh0UmVuZGVyaW5nSGludCkoCisgICAgR3BHcmFwaGljcyogZ3JhcGhpY3MsCisgICAgVGV4dFJlbmRlcmluZ0hpbnQgbW9kZSk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBEcmF3RHJpdmVyU3RyaW5nKSgKKyAgICBHcEdyYXBoaWNzKiBncmFwaGljcywKKyAgICBHRElQQ09OU1QgVUlOVDE2KiB0ZXh0LAorICAgIElOVCBsZW5ndGgsCisgICAgR0RJUENPTlNUIEdwRm9udCogZm9udCwKKyAgICBHRElQQ09OU1QgR3BCcnVzaCogYnJ1c2gsCisgICAgR0RJUENPTlNUIFBvaW50RiogcG9zaXRpb25zLAorICAgIElOVCBmbGFncywKKyAgICBHRElQQ09OU1QgR3BNYXRyaXgqIG1hdHJpeCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBDcmVhdGVNYXRyaXgyKShSRUFMIG0xMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUwgbTEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBTCBtMjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFMIG0yMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUwgZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFMIGR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BNYXRyaXgqKiBtYXRyaXgpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwRGVsZXRlTWF0cml4KShHcE1hdHJpeCogbWF0cml4KTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcFNldFdvcmxkVHJhbnNmb3JtKSgKKyAgICBHcEdyYXBoaWNzKiBncmFwaGljcywKKyAgICBHcE1hdHJpeCogbWF0cml4KTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcFJlc2V0V29ybGRUcmFuc2Zvcm0pKAorICAgIEdwR3JhcGhpY3MqIGdyYXBoaWNzKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcERlbGV0ZUZvbnRGYW1pbHkpKAorICAgIEdwRm9udEZhbWlseSogRm9udEZhbWlseSk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBEZWxldGVGb250KShHcEZvbnQqIGZvbnQpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwTmV3UHJpdmF0ZUZvbnRDb2xsZWN0aW9uKSgKKyAgICBHcEZvbnRDb2xsZWN0aW9uKiogZm9udENvbGxlY3Rpb24pOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwRGVsZXRlUHJpdmF0ZUZvbnRDb2xsZWN0aW9uKSgKKyAgICBHcEZvbnRDb2xsZWN0aW9uKiogZm9udENvbGxlY3Rpb24pOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwUHJpdmF0ZUFkZE1lbW9yeUZvbnQpKAorICAgIEdwRm9udENvbGxlY3Rpb24qIGZvbnRDb2xsZWN0aW9uLAorICAgIEdESVBDT05TVCB2b2lkKiBtZW1vcnksCisgICAgSU5UIGxlbmd0aCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBHZXRGb250Q29sbGVjdGlvbkZhbWlseUxpc3QpKAorICAgIEdwRm9udENvbGxlY3Rpb24qIGZvbnRDb2xsZWN0aW9uLAorICAgIElOVCBudW1Tb3VnaHQsCisgICAgR3BGb250RmFtaWx5KiBncGZhbWlsaWVzW10sCisgICAgSU5UKiBudW1Gb3VuZCk7Cit0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBHZXRGb250Q29sbGVjdGlvbkZhbWlseUNvdW50KSgKKyAgICBHcEZvbnRDb2xsZWN0aW9uKiBmb250Q29sbGVjdGlvbiwKKyAgICBJTlQqIG51bUZvdW5kKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcFNldFRleHRDb250cmFzdCkoR3BHcmFwaGljcyogZ3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgY29udHJhc3QpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwU2V0UGl4ZWxPZmZzZXRNb2RlKSgKKyAgICBHcEdyYXBoaWNzKiBncmFwaGljcywKKyAgICBQaXhlbE9mZnNldE1vZGUgcGl4ZWxPZmZzZXRNb2RlKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcEdldEltYWdlR3JhcGhpY3NDb250ZXh0KSgKKyAgICBHcEltYWdlKiBpbWFnZSwKKyAgICBHcEdyYXBoaWNzKiogZ3JhcGhpY3MpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwRHJhd0ltYWdlSSkoR3BHcmFwaGljcyogZ3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcEltYWdlKiBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHkpOwordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwRHJhd0ltYWdlUmVjdEkpKEdwR3JhcGhpY3MqIGdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwSW1hZ2UqIGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgaGVpZ2h0KTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcERyYXdTdHJpbmcpKAorICAgIEdwR3JhcGhpY3MqIGdyYXBoaWNzLAorICAgIEdESVBDT05TVCBXQ0hBUiogc3RyaW5nLAorICAgIElOVCBsZW5ndGgsCisgICAgR0RJUENPTlNUIEdwRm9udCogZm9udCwKKyAgICBHRElQQ09OU1QgUmVjdEYqIGxheW91dFJlY3QsCisgICAgR0RJUENPTlNUIEdwU3RyaW5nRm9ybWF0KiBzdHJpbmdGb3JtYXQsCisgICAgR0RJUENPTlNUIEdwQnJ1c2gqIGJydXNoKTsKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcFNldFBlblRyYW5zZm9ybSkoR3BQZW4qIHBlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BNYXRyaXgqIG1hdHJpeCk7CisjZGVmaW5lIENhbGxGdW5jKGZ1bmNuYW1lKSBcCisgICgoRnVuY1R5cGVfIyNmdW5jbmFtZSlHZGlwbHVzRXh0Lm1fRnVuY3Rpb25zW0Z1bmNJZF8jI2Z1bmNuYW1lXSkKK3R5cGVkZWYgSEFORExFKF9fc3RkY2FsbCogRnVuY1R5cGVfR2RpQWRkRm9udE1lbVJlc291cmNlRXgpKFBWT0lEIHBiRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGNiRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBWT0lEIHBkdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEKiBwY0ZvbnRzKTsKK3R5cGVkZWYgQk9PTChfX3N0ZGNhbGwqIEZ1bmNUeXBlX0dkaVJlbW92ZUZvbnRNZW1SZXNvdXJjZUV4KShIQU5ETEUgaGFuZGxlKTsKK3ZvaWQqIENHZGlwbHVzRXh0OjpHZGlBZGRGb250TWVtUmVzb3VyY2VFeCh2b2lkKiBwRm9udGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwZHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIG51bV9mYWNlKSB7CisgIGlmIChtX3BHZGlBZGRGb250TWVtUmVzb3VyY2VFeCkgeworICAgIHJldHVybiAoKEZ1bmNUeXBlX0dkaUFkZEZvbnRNZW1SZXNvdXJjZUV4KW1fcEdkaUFkZEZvbnRNZW1SZXNvdXJjZUV4KSgKKyAgICAgICAgKFBWT0lEKXBGb250ZGF0YSwgKERXT1JEKXNpemUsIChQVk9JRClwZHYsIChEV09SRCopbnVtX2ZhY2UpOworICB9CisgIHJldHVybiBOVUxMOworfQorRlhfQk9PTCBDR2RpcGx1c0V4dDo6R2RpUmVtb3ZlRm9udE1lbVJlc291cmNlRXgodm9pZCogaGFuZGxlKSB7CisgIGlmIChtX3BHZGlSZW1vdmVGb250TWVtUmVzb3Vyc2VFeCkgeworICAgIHJldHVybiAoKEZ1bmNUeXBlX0dkaVJlbW92ZUZvbnRNZW1SZXNvdXJjZUV4KW1fcEdkaVJlbW92ZUZvbnRNZW1SZXNvdXJzZUV4KSgKKyAgICAgICAgKEhBTkRMRSloYW5kbGUpOworICB9CisgIHJldHVybiBGQUxTRTsKK30KK3N0YXRpYyBHcEJydXNoKiBfR2RpcENyZWF0ZUJydXNoKERXT1JEIGFyZ2IpIHsKKyAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQorICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CisgIEdwU29saWRGaWxsKiBzb2xpZEJydXNoID0gTlVMTDsKKyAgQ2FsbEZ1bmMoR2RpcENyZWF0ZVNvbGlkRmlsbCkoKEFSR0IpYXJnYiwgJnNvbGlkQnJ1c2gpOworICByZXR1cm4gc29saWRCcnVzaDsKK30KK3N0YXRpYyBDRlhfRElCaXRtYXAqIF9TdHJldGNoTW9ub1RvR3JheShpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QqIHBDbGlwUmVjdCkgeworICBGWF9CT09MIGJGbGlwWCA9IGRlc3Rfd2lkdGggPCAwOworICBpZiAoYkZsaXBYKSB7CisgICAgZGVzdF93aWR0aCA9IC1kZXN0X3dpZHRoOworICB9CisgIEZYX0JPT0wgYkZsaXBZID0gZGVzdF9oZWlnaHQgPCAwOworICBpZiAoYkZsaXBZKSB7CisgICAgZGVzdF9oZWlnaHQgPSAtZGVzdF9oZWlnaHQ7CisgIH0KKyAgaW50IHJlc3VsdF93aWR0aCA9IHBDbGlwUmVjdC0+V2lkdGgoKTsKKyAgaW50IHJlc3VsdF9oZWlnaHQgPSBwQ2xpcFJlY3QtPkhlaWdodCgpOworICBpbnQgcmVzdWx0X3BpdGNoID0gKHJlc3VsdF93aWR0aCArIDMpIC8gNCAqIDQ7CisgIENGWF9ESUJpdG1hcCogcFN0cmV0Y2hlZCA9IG5ldyBDRlhfRElCaXRtYXA7CisgIGlmICghcFN0cmV0Y2hlZC0+Q3JlYXRlKHJlc3VsdF93aWR0aCwgcmVzdWx0X2hlaWdodCwgRlhESUJfOGJwcFJnYikpIHsKKyAgICBkZWxldGUgcFN0cmV0Y2hlZDsKICAgICByZXR1cm4gTlVMTDsKLX0KLUZYX0JPT0wgQ0dkaXBsdXNFeHQ6OkdkaVJlbW92ZUZvbnRNZW1SZXNvdXJjZUV4KHZvaWQqIGhhbmRsZSkKLXsKLSAgICBpZiAobV9wR2RpUmVtb3ZlRm9udE1lbVJlc291cnNlRXgpIHsKLSAgICAgICAgcmV0dXJuICgoRnVuY1R5cGVfR2RpUmVtb3ZlRm9udE1lbVJlc291cmNlRXgpbV9wR2RpUmVtb3ZlRm9udE1lbVJlc291cnNlRXgpKChIQU5ETEUpaGFuZGxlKTsKKyAgfQorICBMUEJZVEUgZGVzdF9idWYgPSBwU3RyZXRjaGVkLT5HZXRCdWZmZXIoKTsKKyAgaW50IHNyY193aWR0aCA9IHBTb3VyY2UtPkdldFdpZHRoKCk7CisgIGludCBzcmNfaGVpZ2h0ID0gcFNvdXJjZS0+R2V0SGVpZ2h0KCk7CisgIGludCB5X3VuaXQgPSBzcmNfaGVpZ2h0IC8gZGVzdF9oZWlnaHQ7CisgIGludCB4X3VuaXQgPSBzcmNfd2lkdGggLyBkZXN0X3dpZHRoOworICBpbnQgYXJlYV91bml0ID0geV91bml0ICogeF91bml0OworICBMUEJZVEUgc3JjX2J1ZiA9IHBTb3VyY2UtPkdldEJ1ZmZlcigpOworICBpbnQgc3JjX3BpdGNoID0gcFNvdXJjZS0+R2V0UGl0Y2goKTsKKyAgZm9yIChpbnQgZGVzdF95ID0gMDsgZGVzdF95IDwgcmVzdWx0X2hlaWdodDsgZGVzdF95KyspIHsKKyAgICBMUEJZVEUgZGVzdF9zY2FuID0gZGVzdF9idWYgKyBkZXN0X3kgKiByZXN1bHRfcGl0Y2g7CisgICAgaW50IHNyY195X3N0YXJ0ID0gYkZsaXBZID8gKGRlc3RfaGVpZ2h0IC0gMSAtIGRlc3RfeSAtIHBDbGlwUmVjdC0+dG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChkZXN0X3kgKyBwQ2xpcFJlY3QtPnRvcCk7CisgICAgc3JjX3lfc3RhcnQgPSBzcmNfeV9zdGFydCAqIHNyY19oZWlnaHQgLyBkZXN0X2hlaWdodDsKKyAgICBMUEJZVEUgc3JjX3NjYW4gPSBzcmNfYnVmICsgc3JjX3lfc3RhcnQgKiBzcmNfcGl0Y2g7CisgICAgZm9yIChpbnQgZGVzdF94ID0gMDsgZGVzdF94IDwgcmVzdWx0X3dpZHRoOyBkZXN0X3grKykgeworICAgICAgaW50IHN1bSA9IDA7CisgICAgICBpbnQgc3JjX3hfc3RhcnQgPSBiRmxpcFggPyAoZGVzdF93aWR0aCAtIDEgLSBkZXN0X3ggLSBwQ2xpcFJlY3QtPmxlZnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZGVzdF94ICsgcENsaXBSZWN0LT5sZWZ0KTsKKyAgICAgIHNyY194X3N0YXJ0ID0gc3JjX3hfc3RhcnQgKiBzcmNfd2lkdGggLyBkZXN0X3dpZHRoOworICAgICAgaW50IHNyY194X2VuZCA9IHNyY194X3N0YXJ0ICsgeF91bml0OworICAgICAgTFBCWVRFIHNyY19saW5lID0gc3JjX3NjYW47CisgICAgICBmb3IgKGludCBzcmNfeSA9IDA7IHNyY195IDwgeV91bml0OyBzcmNfeSsrKSB7CisgICAgICAgIGZvciAoaW50IHNyY194ID0gc3JjX3hfc3RhcnQ7IHNyY194IDwgc3JjX3hfZW5kOyBzcmNfeCsrKSB7CisgICAgICAgICAgaWYgKCEoc3JjX2xpbmVbc3JjX3ggLyA4XSAmICgxIDw8ICg3IC0gc3JjX3ggJSA4KSkpKSB7CisgICAgICAgICAgICBzdW0gKz0gMjU1OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzcmNfbGluZSArPSBzcmNfcGl0Y2g7CisgICAgICB9CisgICAgICBkZXN0X3NjYW5bZGVzdF94XSA9IDI1NSAtIHN1bSAvIGFyZWFfdW5pdDsKICAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBwU3RyZXRjaGVkOwogfQotc3RhdGljIEdwQnJ1c2gqIF9HZGlwQ3JlYXRlQnJ1c2goRFdPUkQgYXJnYikKLXsKLSAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICAgIEdwU29saWRGaWxsKiBzb2xpZEJydXNoID0gTlVMTDsKK3N0YXRpYyB2b2lkIE91dHB1dEltYWdlTWFzayhHcEdyYXBoaWNzKiBwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCBiTW9ub0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QpIHsKKyAgQVNTRVJUKHBCaXRtYXAtPkdldEJQUCgpID09IDEpOworICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9CisgICAgICAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKKyAgaW50IHNyY193aWR0aCA9IHBCaXRtYXAtPkdldFdpZHRoKCksIHNyY19oZWlnaHQgPSBwQml0bWFwLT5HZXRIZWlnaHQoKTsKKyAgaW50IHNyY19waXRjaCA9IHBCaXRtYXAtPkdldFBpdGNoKCk7CisgIHVpbnQ4X3QqIHNjYW4wID0gcEJpdG1hcC0+R2V0QnVmZmVyKCk7CisgIGlmIChzcmNfd2lkdGggPT0gMSAmJiBzcmNfaGVpZ2h0ID09IDEpIHsKKyAgICBpZiAoKHNjYW4wWzBdICYgMHg4MCkgPT0gMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBHcFNvbGlkRmlsbCogc29saWRCcnVzaDsKICAgICBDYWxsRnVuYyhHZGlwQ3JlYXRlU29saWRGaWxsKSgoQVJHQilhcmdiLCAmc29saWRCcnVzaCk7Ci0gICAgcmV0dXJuIHNvbGlkQnJ1c2g7Ci19Ci1zdGF0aWMgQ0ZYX0RJQml0bWFwKiBfU3RyZXRjaE1vbm9Ub0dyYXkoaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBTb3VyY2UsIEZYX1JFQ1QqIHBDbGlwUmVjdCkKLXsKLSAgICBGWF9CT09MIGJGbGlwWCA9IGRlc3Rfd2lkdGggPCAwOwotICAgIGlmIChiRmxpcFgpIHsKLSAgICAgICAgZGVzdF93aWR0aCA9IC1kZXN0X3dpZHRoOwotICAgIH0KLSAgICBGWF9CT09MIGJGbGlwWSA9IGRlc3RfaGVpZ2h0IDwgMDsKLSAgICBpZiAoYkZsaXBZKSB7Ci0gICAgICAgIGRlc3RfaGVpZ2h0ID0gLWRlc3RfaGVpZ2h0OwotICAgIH0KLSAgICBpbnQgcmVzdWx0X3dpZHRoID0gcENsaXBSZWN0LT5XaWR0aCgpOwotICAgIGludCByZXN1bHRfaGVpZ2h0ID0gcENsaXBSZWN0LT5IZWlnaHQoKTsKLSAgICBpbnQgcmVzdWx0X3BpdGNoID0gKHJlc3VsdF93aWR0aCArIDMpIC8gNCAqIDQ7Ci0gICAgQ0ZYX0RJQml0bWFwKiBwU3RyZXRjaGVkID0gbmV3IENGWF9ESUJpdG1hcDsKLSAgICBpZiAoIXBTdHJldGNoZWQtPkNyZWF0ZShyZXN1bHRfd2lkdGgsIHJlc3VsdF9oZWlnaHQsIEZYRElCXzhicHBSZ2IpKSB7Ci0gICAgICAgIGRlbGV0ZSBwU3RyZXRjaGVkOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgTFBCWVRFIGRlc3RfYnVmID0gcFN0cmV0Y2hlZC0+R2V0QnVmZmVyKCk7Ci0gICAgaW50IHNyY193aWR0aCA9IHBTb3VyY2UtPkdldFdpZHRoKCk7Ci0gICAgaW50IHNyY19oZWlnaHQgPSBwU291cmNlLT5HZXRIZWlnaHQoKTsKLSAgICBpbnQgc3JjX2NvdW50ID0gc3JjX3dpZHRoICogc3JjX2hlaWdodDsKLSAgICBpbnQgZGVzdF9jb3VudCA9IGRlc3Rfd2lkdGggKiBkZXN0X2hlaWdodDsKLSAgICBpbnQgcmF0aW8gPSAyNTUgKiBkZXN0X2NvdW50IC8gc3JjX2NvdW50OwotICAgIGludCB5X3VuaXQgPSBzcmNfaGVpZ2h0IC8gZGVzdF9oZWlnaHQ7Ci0gICAgaW50IHhfdW5pdCA9IHNyY193aWR0aCAvIGRlc3Rfd2lkdGg7Ci0gICAgaW50IGFyZWFfdW5pdCA9IHlfdW5pdCAqIHhfdW5pdDsKLSAgICBMUEJZVEUgc3JjX2J1ZiA9IHBTb3VyY2UtPkdldEJ1ZmZlcigpOwotICAgIGludCBzcmNfcGl0Y2ggPSBwU291cmNlLT5HZXRQaXRjaCgpOwotICAgIGZvciAoaW50IGRlc3RfeSA9IDA7IGRlc3RfeSA8IHJlc3VsdF9oZWlnaHQ7IGRlc3RfeSArKykgewotICAgICAgICBMUEJZVEUgZGVzdF9zY2FuID0gZGVzdF9idWYgKyBkZXN0X3kgKiByZXN1bHRfcGl0Y2g7Ci0gICAgICAgIGludCBzcmNfeV9zdGFydCA9IGJGbGlwWSA/IChkZXN0X2hlaWdodCAtIDEgLSBkZXN0X3kgLSBwQ2xpcFJlY3QtPnRvcCkgOiAoZGVzdF95ICsgcENsaXBSZWN0LT50b3ApOwotICAgICAgICBzcmNfeV9zdGFydCA9IHNyY195X3N0YXJ0ICogc3JjX2hlaWdodCAvIGRlc3RfaGVpZ2h0OwotICAgICAgICBMUEJZVEUgc3JjX3NjYW4gPSBzcmNfYnVmICsgc3JjX3lfc3RhcnQgKiBzcmNfcGl0Y2g7Ci0gICAgICAgIGZvciAoaW50IGRlc3RfeCA9IDA7IGRlc3RfeCA8IHJlc3VsdF93aWR0aDsgZGVzdF94ICsrKSB7Ci0gICAgICAgICAgICBpbnQgc3VtID0gMDsKLSAgICAgICAgICAgIGludCBzcmNfeF9zdGFydCA9IGJGbGlwWCA/IChkZXN0X3dpZHRoIC0gMSAtIGRlc3RfeCAtIHBDbGlwUmVjdC0+bGVmdCkgOiAoZGVzdF94ICsgcENsaXBSZWN0LT5sZWZ0KTsKLSAgICAgICAgICAgIHNyY194X3N0YXJ0ID0gc3JjX3hfc3RhcnQgKiBzcmNfd2lkdGggLyBkZXN0X3dpZHRoOwotICAgICAgICAgICAgaW50IHNyY194X2VuZCA9IHNyY194X3N0YXJ0ICsgeF91bml0OwotICAgICAgICAgICAgTFBCWVRFIHNyY19saW5lID0gc3JjX3NjYW47Ci0gICAgICAgICAgICBmb3IgKGludCBzcmNfeSA9IDA7IHNyY195IDwgeV91bml0OyBzcmNfeSArKykgewotICAgICAgICAgICAgICAgIGZvciAoaW50IHNyY194ID0gc3JjX3hfc3RhcnQ7IHNyY194IDwgc3JjX3hfZW5kOyBzcmNfeCArKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIShzcmNfbGluZVtzcmNfeCAvIDhdICYgKDEgPDwgKDcgLSBzcmNfeCAlIDgpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3JjX2xpbmUgKz0gc3JjX3BpdGNoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfeF0gPSAyNTUgLSBzdW0gLyBhcmVhX3VuaXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHBTdHJldGNoZWQ7Ci19Ci1zdGF0aWMgdm9pZCBPdXRwdXRJbWFnZU1hc2soR3BHcmFwaGljcyogcEdyYXBoaWNzLCBCT09MIGJNb25vRGV2aWNlLCBjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBGWF9BUkdCIGFyZ2IsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCkKLXsKLSAgICBBU1NFUlQocEJpdG1hcC0+R2V0QlBQKCkgPT0gMSk7Ci0gICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKLSAgICBpbnQgc3JjX3dpZHRoID0gcEJpdG1hcC0+R2V0V2lkdGgoKSwgc3JjX2hlaWdodCA9IHBCaXRtYXAtPkdldEhlaWdodCgpOwotICAgIGludCBzcmNfcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpOwotICAgIEZYX0xQQllURSBzY2FuMCA9IHBCaXRtYXAtPkdldEJ1ZmZlcigpOwotICAgIGlmIChzcmNfd2lkdGggPT0gMSAmJiBzcmNfaGVpZ2h0ID09IDEpIHsKLSAgICAgICAgaWYgKChzY2FuMFswXSAmIDB4ODApID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBHcFNvbGlkRmlsbCogc29saWRCcnVzaDsKLSAgICAgICAgQ2FsbEZ1bmMoR2RpcENyZWF0ZVNvbGlkRmlsbCkoKEFSR0IpYXJnYiwgJnNvbGlkQnJ1c2gpOwotICAgICAgICBpZiAoZGVzdF93aWR0aCA8IDApIHsKLSAgICAgICAgICAgIGRlc3Rfd2lkdGggPSAtZGVzdF93aWR0aDsKLSAgICAgICAgICAgIGRlc3RfbGVmdCAtPSBkZXN0X3dpZHRoOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZXN0X2hlaWdodCA8IDApIHsKLSAgICAgICAgICAgIGRlc3RfaGVpZ2h0ID0gLWRlc3RfaGVpZ2h0OwotICAgICAgICAgICAgZGVzdF90b3AgLT0gZGVzdF9oZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgQ2FsbEZ1bmMoR2RpcEZpbGxSZWN0YW5nbGUpKHBHcmFwaGljcywgc29saWRCcnVzaCwgKGZsb2F0KWRlc3RfbGVmdCwgKGZsb2F0KWRlc3RfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KWRlc3Rfd2lkdGgsIChmbG9hdClkZXN0X2hlaWdodCk7Ci0gICAgICAgIENhbGxGdW5jKEdkaXBEZWxldGVCcnVzaCkoc29saWRCcnVzaCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCFiTW9ub0RldmljZSAmJiBhYnMoZGVzdF93aWR0aCkgPCBzcmNfd2lkdGggJiYgYWJzKGRlc3RfaGVpZ2h0KSA8IHNyY19oZWlnaHQpIHsKLSAgICAgICAgRlhfUkVDVCBpbWFnZV9yZWN0KGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3RfbGVmdCArIGRlc3Rfd2lkdGgsIGRlc3RfdG9wICsgZGVzdF9oZWlnaHQpOwotICAgICAgICBpbWFnZV9yZWN0Lk5vcm1hbGl6ZSgpOwotICAgICAgICBGWF9SRUNUIGltYWdlX2NsaXAgPSBpbWFnZV9yZWN0OwotICAgICAgICBpbWFnZV9jbGlwLkludGVyc2VjdCgqcENsaXBSZWN0KTsKLSAgICAgICAgaWYgKGltYWdlX2NsaXAuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW1hZ2VfY2xpcC5PZmZzZXQoLWltYWdlX3JlY3QubGVmdCwgLWltYWdlX3JlY3QudG9wKTsKLSAgICAgICAgQ0ZYX0RJQml0bWFwKiBwU3RyZXRjaGVkID0gTlVMTDsKLSAgICAgICAgaWYgKHNyY193aWR0aCAqIHNyY19oZWlnaHQgPiAxMDAwMCkgewotICAgICAgICAgICAgcFN0cmV0Y2hlZCA9IF9TdHJldGNoTW9ub1RvR3JheShkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgcEJpdG1hcCwgJmltYWdlX2NsaXApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcFN0cmV0Y2hlZCA9IHBCaXRtYXAtPlN0cmV0Y2hUbyhkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgRkFMU0UsICZpbWFnZV9jbGlwKTsKLSAgICAgICAgfQotICAgICAgICBHcEJpdG1hcCogYml0bWFwOwotICAgICAgICBDYWxsRnVuYyhHZGlwQ3JlYXRlQml0bWFwRnJvbVNjYW4wKShpbWFnZV9jbGlwLldpZHRoKCksIGltYWdlX2NsaXAuSGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbWFnZV9jbGlwLldpZHRoKCkgKyAzKSAvIDQgKiA0LCBQaXhlbEZvcm1hdDhicHBJbmRleGVkLCBwU3RyZXRjaGVkLT5HZXRCdWZmZXIoKSwgJmJpdG1hcCk7Ci0gICAgICAgIGludCBhLCByLCBnLCBiOwotICAgICAgICBBcmdiRGVjb2RlKGFyZ2IsIGEsIHIsIGcsIGIpOwotICAgICAgICBVSU5UIHBhbFsyNThdOwotICAgICAgICBwYWxbMF0gPSAwOwotICAgICAgICBwYWxbMV0gPSAyNTY7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpICsrKSB7Ci0gICAgICAgICAgICBwYWxbaSArIDJdID0gQXJnYkVuY29kZShpICogYSAvIDI1NSwgciwgZywgYik7Ci0gICAgICAgIH0KLSAgICAgICAgQ2FsbEZ1bmMoR2RpcFNldEltYWdlUGFsZXR0ZSkoYml0bWFwLCAoQ29sb3JQYWxldHRlKilwYWwpOwotICAgICAgICBDYWxsRnVuYyhHZGlwRHJhd0ltYWdlSSkocEdyYXBoaWNzLCBiaXRtYXAsIGltYWdlX3JlY3QubGVmdCArIGltYWdlX2NsaXAubGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3JlY3QudG9wICsgaW1hZ2VfY2xpcC50b3ApOwotICAgICAgICBDYWxsRnVuYyhHZGlwRGlzcG9zZUltYWdlKShiaXRtYXApOwotICAgICAgICBkZWxldGUgcFN0cmV0Y2hlZDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBHcEJpdG1hcCogYml0bWFwOwotICAgIENhbGxGdW5jKEdkaXBDcmVhdGVCaXRtYXBGcm9tU2NhbjApKHNyY193aWR0aCwgc3JjX2hlaWdodCwgc3JjX3BpdGNoLCBQaXhlbEZvcm1hdDFicHBJbmRleGVkLCBzY2FuMCwgJmJpdG1hcCk7Ci0gICAgVUlOVCBwYWxldHRlWzRdID0geyBQYWxldHRlRmxhZ3NIYXNBbHBoYSwgMiwgMCwgYXJnYiB9OwotICAgIENhbGxGdW5jKEdkaXBTZXRJbWFnZVBhbGV0dGUpKGJpdG1hcCwgKENvbG9yUGFsZXR0ZSopcGFsZXR0ZSk7Ci0gICAgUG9pbnQgZGVzdGluYXRpb25Qb2ludHNbXSA9IHsKLSAgICAgICAgUG9pbnQoZGVzdF9sZWZ0LCBkZXN0X3RvcCksCi0gICAgICAgIFBvaW50KGRlc3RfbGVmdCArIGRlc3Rfd2lkdGgsIGRlc3RfdG9wKSwKLSAgICAgICAgUG9pbnQoZGVzdF9sZWZ0LCBkZXN0X3RvcCArIGRlc3RfaGVpZ2h0KQotICAgIH07Ci0gICAgQ2FsbEZ1bmMoR2RpcERyYXdJbWFnZVBvaW50c0kpKHBHcmFwaGljcywgYml0bWFwLCBkZXN0aW5hdGlvblBvaW50cywgMyk7Ci0gICAgQ2FsbEZ1bmMoR2RpcERpc3Bvc2VJbWFnZSkoYml0bWFwKTsKLX0KLXN0YXRpYyB2b2lkIE91dHB1dEltYWdlKEdwR3JhcGhpY3MqIHBHcmFwaGljcywgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCkKLXsKLSAgICBpbnQgc3JjX3dpZHRoID0gcFNyY1JlY3QtPldpZHRoKCksIHNyY19oZWlnaHQgPSBwU3JjUmVjdC0+SGVpZ2h0KCk7Ci0gICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKLSAgICBpZiAocEJpdG1hcC0+R2V0QlBQKCkgPT0gMSAmJiAocFNyY1JlY3QtPmxlZnQgJSA4KSkgewotICAgICAgICBGWF9SRUNUIG5ld19yZWN0KDAsIDAsIHNyY193aWR0aCwgc3JjX2hlaWdodCk7Ci0gICAgICAgIENGWF9ESUJpdG1hcCogcENsb25lZCA9IHBCaXRtYXAtPkNsb25lKHBTcmNSZWN0KTsKLSAgICAgICAgaWYgKCFwQ2xvbmVkKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgT3V0cHV0SW1hZ2UocEdyYXBoaWNzLCBwQ2xvbmVkLCAmbmV3X3JlY3QsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0KTsKLSAgICAgICAgZGVsZXRlIHBDbG9uZWQ7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IHNyY19waXRjaCA9IHBCaXRtYXAtPkdldFBpdGNoKCk7Ci0gICAgRlhfTFBCWVRFIHNjYW4wID0gcEJpdG1hcC0+R2V0QnVmZmVyKCkgKyBwU3JjUmVjdC0+dG9wICogc3JjX3BpdGNoICsgcEJpdG1hcC0+R2V0QlBQKCkgKiBwU3JjUmVjdC0+bGVmdCAvIDg7Ci0gICAgR3BCaXRtYXAqIGJpdG1hcCA9IE5VTEw7Ci0gICAgc3dpdGNoIChwQml0bWFwLT5HZXRGb3JtYXQoKSkgewotICAgICAgICBjYXNlIEZYRElCX0FyZ2I6Ci0gICAgICAgICAgICBDYWxsRnVuYyhHZGlwQ3JlYXRlQml0bWFwRnJvbVNjYW4wKShzcmNfd2lkdGgsIHNyY19oZWlnaHQsIHNyY19waXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0MzJicHBBUkdCLCBzY2FuMCwgJmJpdG1hcCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWERJQl9SZ2IzMjoKLSAgICAgICAgICAgIENhbGxGdW5jKEdkaXBDcmVhdGVCaXRtYXBGcm9tU2NhbjApKHNyY193aWR0aCwgc3JjX2hlaWdodCwgc3JjX3BpdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQzMmJwcFJHQiwgc2NhbjAsICZiaXRtYXApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhESUJfUmdiOgotICAgICAgICAgICAgQ2FsbEZ1bmMoR2RpcENyZWF0ZUJpdG1hcEZyb21TY2FuMCkoc3JjX3dpZHRoLCBzcmNfaGVpZ2h0LCBzcmNfcGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdDI0YnBwUkdCLCBzY2FuMCwgJmJpdG1hcCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWERJQl84YnBwUmdiOiB7Ci0gICAgICAgICAgICAgICAgQ2FsbEZ1bmMoR2RpcENyZWF0ZUJpdG1hcEZyb21TY2FuMCkoc3JjX3dpZHRoLCBzcmNfaGVpZ2h0LCBzcmNfcGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQ4YnBwSW5kZXhlZCwgc2NhbjAsICZiaXRtYXApOwotICAgICAgICAgICAgICAgIFVJTlQgcGFsWzI1OF07Ci0gICAgICAgICAgICAgICAgcGFsWzBdID0gMDsKLSAgICAgICAgICAgICAgICBwYWxbMV0gPSAyNTY7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcGFsW2kgKyAyXSA9IHBCaXRtYXAtPkdldFBhbGV0dGVFbnRyeShpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ2FsbEZ1bmMoR2RpcFNldEltYWdlUGFsZXR0ZSkoYml0bWFwLCAoQ29sb3JQYWxldHRlKilwYWwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBjYXNlIEZYRElCXzFicHBSZ2I6IHsKLSAgICAgICAgICAgICAgICBDYWxsRnVuYyhHZGlwQ3JlYXRlQml0bWFwRnJvbVNjYW4wKShzcmNfd2lkdGgsIHNyY19oZWlnaHQsIHNyY19waXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdDFicHBJbmRleGVkLCBzY2FuMCwgJmJpdG1hcCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9CisgICAgaWYgKGRlc3Rfd2lkdGggPCAwKSB7CisgICAgICBkZXN0X3dpZHRoID0gLWRlc3Rfd2lkdGg7CisgICAgICBkZXN0X2xlZnQgLT0gZGVzdF93aWR0aDsKICAgICB9CiAgICAgaWYgKGRlc3RfaGVpZ2h0IDwgMCkgewotICAgICAgICBkZXN0X2hlaWdodCAtLTsKKyAgICAgIGRlc3RfaGVpZ2h0ID0gLWRlc3RfaGVpZ2h0OworICAgICAgZGVzdF90b3AgLT0gZGVzdF9oZWlnaHQ7CiAgICAgfQotICAgIGlmIChkZXN0X3dpZHRoIDwgMCkgewotICAgICAgICBkZXN0X3dpZHRoIC0tOworICAgIENhbGxGdW5jKEdkaXBGaWxsUmVjdGFuZ2xlKShwR3JhcGhpY3MsIHNvbGlkQnJ1c2gsIChmbG9hdClkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdClkZXN0X3RvcCwgKGZsb2F0KWRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdClkZXN0X2hlaWdodCk7CisgICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZUJydXNoKShzb2xpZEJydXNoKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFiTW9ub0RldmljZSAmJiBhYnMoZGVzdF93aWR0aCkgPCBzcmNfd2lkdGggJiYKKyAgICAgIGFicyhkZXN0X2hlaWdodCkgPCBzcmNfaGVpZ2h0KSB7CisgICAgRlhfUkVDVCBpbWFnZV9yZWN0KGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3RfbGVmdCArIGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfdG9wICsgZGVzdF9oZWlnaHQpOworICAgIGltYWdlX3JlY3QuTm9ybWFsaXplKCk7CisgICAgRlhfUkVDVCBpbWFnZV9jbGlwID0gaW1hZ2VfcmVjdDsKKyAgICBpbWFnZV9jbGlwLkludGVyc2VjdCgqcENsaXBSZWN0KTsKKyAgICBpZiAoaW1hZ2VfY2xpcC5Jc0VtcHR5KCkpIHsKKyAgICAgIHJldHVybjsKICAgICB9Ci0gICAgUG9pbnQgZGVzdGluYXRpb25Qb2ludHNbXSA9IHsKLSAgICAgICAgUG9pbnQoZGVzdF9sZWZ0LCBkZXN0X3RvcCksCi0gICAgICAgIFBvaW50KGRlc3RfbGVmdCArIGRlc3Rfd2lkdGgsIGRlc3RfdG9wKSwKLSAgICAgICAgUG9pbnQoZGVzdF9sZWZ0LCBkZXN0X3RvcCArIGRlc3RfaGVpZ2h0KQotICAgIH07Ci0gICAgQ2FsbEZ1bmMoR2RpcERyYXdJbWFnZVBvaW50c0kpKHBHcmFwaGljcywgYml0bWFwLCBkZXN0aW5hdGlvblBvaW50cywgMyk7CisgICAgaW1hZ2VfY2xpcC5PZmZzZXQoLWltYWdlX3JlY3QubGVmdCwgLWltYWdlX3JlY3QudG9wKTsKKyAgICBDRlhfRElCaXRtYXAqIHBTdHJldGNoZWQgPSBOVUxMOworICAgIGlmIChzcmNfd2lkdGggKiBzcmNfaGVpZ2h0ID4gMTAwMDApIHsKKyAgICAgIHBTdHJldGNoZWQgPQorICAgICAgICAgIF9TdHJldGNoTW9ub1RvR3JheShkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgcEJpdG1hcCwgJmltYWdlX2NsaXApOworICAgIH0gZWxzZSB7CisgICAgICBwU3RyZXRjaGVkID0KKyAgICAgICAgICBwQml0bWFwLT5TdHJldGNoVG8oZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIEZBTFNFLCAmaW1hZ2VfY2xpcCk7CisgICAgfQorICAgIEdwQml0bWFwKiBiaXRtYXA7CisgICAgQ2FsbEZ1bmMoR2RpcENyZWF0ZUJpdG1hcEZyb21TY2FuMCkoaW1hZ2VfY2xpcC5XaWR0aCgpLCBpbWFnZV9jbGlwLkhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbWFnZV9jbGlwLldpZHRoKCkgKyAzKSAvIDQgKiA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0OGJwcEluZGV4ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmV0Y2hlZC0+R2V0QnVmZmVyKCksICZiaXRtYXApOworICAgIGludCBhLCByLCBnLCBiOworICAgIEFyZ2JEZWNvZGUoYXJnYiwgYSwgciwgZywgYik7CisgICAgVUlOVCBwYWxbMjU4XTsKKyAgICBwYWxbMF0gPSAwOworICAgIHBhbFsxXSA9IDI1NjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICBwYWxbaSArIDJdID0gQXJnYkVuY29kZShpICogYSAvIDI1NSwgciwgZywgYik7CisgICAgfQorICAgIENhbGxGdW5jKEdkaXBTZXRJbWFnZVBhbGV0dGUpKGJpdG1hcCwgKENvbG9yUGFsZXR0ZSopcGFsKTsKKyAgICBDYWxsRnVuYyhHZGlwRHJhd0ltYWdlSSkocEdyYXBoaWNzLCBiaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3JlY3QubGVmdCArIGltYWdlX2NsaXAubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfcmVjdC50b3AgKyBpbWFnZV9jbGlwLnRvcCk7CiAgICAgQ2FsbEZ1bmMoR2RpcERpc3Bvc2VJbWFnZSkoYml0bWFwKTsKKyAgICBkZWxldGUgcFN0cmV0Y2hlZDsKKyAgICByZXR1cm47CisgIH0KKyAgR3BCaXRtYXAqIGJpdG1hcDsKKyAgQ2FsbEZ1bmMoR2RpcENyZWF0ZUJpdG1hcEZyb21TY2FuMCkoc3JjX3dpZHRoLCBzcmNfaGVpZ2h0LCBzcmNfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0MWJwcEluZGV4ZWQsIHNjYW4wLCAmYml0bWFwKTsKKyAgVUlOVCBwYWxldHRlWzRdID0ge1BhbGV0dGVGbGFnc0hhc0FscGhhLCAyLCAwLCBhcmdifTsKKyAgQ2FsbEZ1bmMoR2RpcFNldEltYWdlUGFsZXR0ZSkoYml0bWFwLCAoQ29sb3JQYWxldHRlKilwYWxldHRlKTsKKyAgUG9pbnQgZGVzdGluYXRpb25Qb2ludHNbXSA9IHtQb2ludChkZXN0X2xlZnQsIGRlc3RfdG9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludChkZXN0X2xlZnQgKyBkZXN0X3dpZHRoLCBkZXN0X3RvcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnQoZGVzdF9sZWZ0LCBkZXN0X3RvcCArIGRlc3RfaGVpZ2h0KX07CisgIENhbGxGdW5jKEdkaXBEcmF3SW1hZ2VQb2ludHNJKShwR3JhcGhpY3MsIGJpdG1hcCwgZGVzdGluYXRpb25Qb2ludHMsIDMpOworICBDYWxsRnVuYyhHZGlwRGlzcG9zZUltYWdlKShiaXRtYXApOwogfQotQ0dkaXBsdXNFeHQ6OkNHZGlwbHVzRXh0KCkKLXsKLSAgICBtX2hNb2R1bGUgPSBOVUxMOwotICAgIG1fR2RpTW9kdWxlID0gTlVMTDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemVvZiBnX0dkaXBGdW5jTmFtZXMgLyBzaXplb2YoTFBDU1RSKTsgaSArKykgewotICAgICAgICBtX0Z1bmN0aW9uc1tpXSA9IE5VTEw7CitzdGF0aWMgdm9pZCBPdXRwdXRJbWFnZShHcEdyYXBoaWNzKiBwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCkgeworICBpbnQgc3JjX3dpZHRoID0gcFNyY1JlY3QtPldpZHRoKCksIHNyY19oZWlnaHQgPSBwU3JjUmVjdC0+SGVpZ2h0KCk7CisgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KKyAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OworICBpZiAocEJpdG1hcC0+R2V0QlBQKCkgPT0gMSAmJiAocFNyY1JlY3QtPmxlZnQgJSA4KSkgeworICAgIEZYX1JFQ1QgbmV3X3JlY3QoMCwgMCwgc3JjX3dpZHRoLCBzcmNfaGVpZ2h0KTsKKyAgICBDRlhfRElCaXRtYXAqIHBDbG9uZWQgPSBwQml0bWFwLT5DbG9uZShwU3JjUmVjdCk7CisgICAgaWYgKCFwQ2xvbmVkKSB7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIG1fcEdkaUFkZEZvbnRNZW1SZXNvdXJjZUV4ID0gTlVMTDsKLSAgICBtX3BHZGlSZW1vdmVGb250TWVtUmVzb3Vyc2VFeCA9IE5VTEw7CisgICAgT3V0cHV0SW1hZ2UocEdyYXBoaWNzLCBwQ2xvbmVkLCAmbmV3X3JlY3QsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgZGVzdF9oZWlnaHQpOworICAgIGRlbGV0ZSBwQ2xvbmVkOworICAgIHJldHVybjsKKyAgfQorICBpbnQgc3JjX3BpdGNoID0gcEJpdG1hcC0+R2V0UGl0Y2goKTsKKyAgdWludDhfdCogc2NhbjAgPSBwQml0bWFwLT5HZXRCdWZmZXIoKSArIHBTcmNSZWN0LT50b3AgKiBzcmNfcGl0Y2ggKworICAgICAgICAgICAgICAgICAgIHBCaXRtYXAtPkdldEJQUCgpICogcFNyY1JlY3QtPmxlZnQgLyA4OworICBHcEJpdG1hcCogYml0bWFwID0gTlVMTDsKKyAgc3dpdGNoIChwQml0bWFwLT5HZXRGb3JtYXQoKSkgeworICAgIGNhc2UgRlhESUJfQXJnYjoKKyAgICAgIENhbGxGdW5jKEdkaXBDcmVhdGVCaXRtYXBGcm9tU2NhbjApKHNyY193aWR0aCwgc3JjX2hlaWdodCwgc3JjX3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQzMmJwcEFSR0IsIHNjYW4wLCAmYml0bWFwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfUmdiMzI6CisgICAgICBDYWxsRnVuYyhHZGlwQ3JlYXRlQml0bWFwRnJvbVNjYW4wKShzcmNfd2lkdGgsIHNyY19oZWlnaHQsIHNyY19waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0MzJicHBSR0IsIHNjYW4wLCAmYml0bWFwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfUmdiOgorICAgICAgQ2FsbEZ1bmMoR2RpcENyZWF0ZUJpdG1hcEZyb21TY2FuMCkoc3JjX3dpZHRoLCBzcmNfaGVpZ2h0LCBzcmNfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdDI0YnBwUkdCLCBzY2FuMCwgJmJpdG1hcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCXzhicHBSZ2I6IHsKKyAgICAgIENhbGxGdW5jKEdkaXBDcmVhdGVCaXRtYXBGcm9tU2NhbjApKHNyY193aWR0aCwgc3JjX2hlaWdodCwgc3JjX3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQ4YnBwSW5kZXhlZCwgc2NhbjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYml0bWFwKTsKKyAgICAgIFVJTlQgcGFsWzI1OF07CisgICAgICBwYWxbMF0gPSAwOworICAgICAgcGFsWzFdID0gMjU2OworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBwYWxbaSArIDJdID0gcEJpdG1hcC0+R2V0UGFsZXR0ZUVudHJ5KGkpOworICAgICAgfQorICAgICAgQ2FsbEZ1bmMoR2RpcFNldEltYWdlUGFsZXR0ZSkoYml0bWFwLCAoQ29sb3JQYWxldHRlKilwYWwpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRlhESUJfMWJwcFJnYjogeworICAgICAgQ2FsbEZ1bmMoR2RpcENyZWF0ZUJpdG1hcEZyb21TY2FuMCkoc3JjX3dpZHRoLCBzcmNfaGVpZ2h0LCBzcmNfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdDFicHBJbmRleGVkLCBzY2FuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiaXRtYXApOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChkZXN0X2hlaWdodCA8IDApIHsKKyAgICBkZXN0X2hlaWdodC0tOworICB9CisgIGlmIChkZXN0X3dpZHRoIDwgMCkgeworICAgIGRlc3Rfd2lkdGgtLTsKKyAgfQorICBQb2ludCBkZXN0aW5hdGlvblBvaW50c1tdID0ge1BvaW50KGRlc3RfbGVmdCwgZGVzdF90b3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50KGRlc3RfbGVmdCArIGRlc3Rfd2lkdGgsIGRlc3RfdG9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludChkZXN0X2xlZnQsIGRlc3RfdG9wICsgZGVzdF9oZWlnaHQpfTsKKyAgQ2FsbEZ1bmMoR2RpcERyYXdJbWFnZVBvaW50c0kpKHBHcmFwaGljcywgYml0bWFwLCBkZXN0aW5hdGlvblBvaW50cywgMyk7CisgIENhbGxGdW5jKEdkaXBEaXNwb3NlSW1hZ2UpKGJpdG1hcCk7CiB9Ci12b2lkIENHZGlwbHVzRXh0OjpMb2FkKCkKLXsKLSAgICBDRlhfQnl0ZVN0cmluZyBzdHJQbHVzUGF0aCA9ICIiOwotICAgIEZYX0NIQVIgYnVmW01BWF9QQVRIXTsKLSAgICBHZXRTeXN0ZW1EaXJlY3RvcnlBKGJ1ZiwgTUFYX1BBVEgpOwotICAgIHN0clBsdXNQYXRoICs9IGJ1ZjsKLSAgICBzdHJQbHVzUGF0aCArPSAiXFwiOwotICAgIHN0clBsdXNQYXRoICs9ICJHRElQTFVTLkRMTCI7Ci0gICAgbV9oTW9kdWxlID0gTG9hZExpYnJhcnlBKHN0clBsdXNQYXRoKTsKLSAgICBpZiAobV9oTW9kdWxlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemVvZiBnX0dkaXBGdW5jTmFtZXMgLyBzaXplb2YoTFBDU1RSKTsgaSArKykgewotICAgICAgICBtX0Z1bmN0aW9uc1tpXSA9IEdldFByb2NBZGRyZXNzKG1faE1vZHVsZSwgZ19HZGlwRnVuY05hbWVzW2ldKTsKLSAgICAgICAgaWYgKG1fRnVuY3Rpb25zW2ldID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1faE1vZHVsZSA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRlhfVUlOVFBUUiBnZGlwbHVzVG9rZW47Ci0gICAgR2RpcGx1c1N0YXJ0dXBJbnB1dCBnZGlwbHVzU3RhcnR1cElucHV0OwotICAgICgoRnVuY1R5cGVfR2RpcGx1c1N0YXJ0dXApbV9GdW5jdGlvbnNbRnVuY0lkX0dkaXBsdXNTdGFydHVwXSkoJmdkaXBsdXNUb2tlbiwgJmdkaXBsdXNTdGFydHVwSW5wdXQsIE5VTEwpOwotICAgIG1fR2RpTW9kdWxlID0gTG9hZExpYnJhcnlBKCJHREkzMi5ETEwiKTsKLSAgICBpZiAobV9HZGlNb2R1bGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fcEdkaUFkZEZvbnRNZW1SZXNvdXJjZUV4ID0gR2V0UHJvY0FkZHJlc3MobV9HZGlNb2R1bGUsICJBZGRGb250TWVtUmVzb3VyY2VFeCIpOwotICAgIG1fcEdkaVJlbW92ZUZvbnRNZW1SZXNvdXJzZUV4ID0gR2V0UHJvY0FkZHJlc3MobV9HZGlNb2R1bGUsICJSZW1vdmVGb250TWVtUmVzb3VyY2VFeCIpOworQ0dkaXBsdXNFeHQ6OkNHZGlwbHVzRXh0KCkgeworICBtX2hNb2R1bGUgPSBOVUxMOworICBtX0dkaU1vZHVsZSA9IE5VTEw7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZW9mIGdfR2RpcEZ1bmNOYW1lcyAvIHNpemVvZihMUENTVFIpOyBpKyspIHsKKyAgICBtX0Z1bmN0aW9uc1tpXSA9IE5VTEw7CisgIH0KKyAgbV9wR2RpQWRkRm9udE1lbVJlc291cmNlRXggPSBOVUxMOworICBtX3BHZGlSZW1vdmVGb250TWVtUmVzb3Vyc2VFeCA9IE5VTEw7CiB9Ci1DR2RpcGx1c0V4dDo6fkNHZGlwbHVzRXh0KCkKLXsKLX0KLUxQVk9JRCBDR2RpcGx1c0V4dDo6TG9hZE1lbUZvbnQoTFBCWVRFIHBEYXRhLCBGWF9EV09SRCBzaXplKQotewotICAgIEdwRm9udENvbGxlY3Rpb24qIHBDb2xsZWN0aW9uID0gTlVMTDsKLSAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICAgIENhbGxGdW5jKEdkaXBOZXdQcml2YXRlRm9udENvbGxlY3Rpb24pKCZwQ29sbGVjdGlvbik7Ci0gICAgR3BTdGF0dXMgc3RhdHVzID0gQ2FsbEZ1bmMoR2RpcFByaXZhdGVBZGRNZW1vcnlGb250KShwQ29sbGVjdGlvbiwgcERhdGEsIHNpemUpOwotICAgIGlmIChzdGF0dXMgPT0gT2spIHsKLSAgICAgICAgcmV0dXJuIHBDb2xsZWN0aW9uOwordm9pZCBDR2RpcGx1c0V4dDo6TG9hZCgpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgc3RyUGx1c1BhdGggPSAiIjsKKyAgRlhfQ0hBUiBidWZbTUFYX1BBVEhdOworICBHZXRTeXN0ZW1EaXJlY3RvcnlBKGJ1ZiwgTUFYX1BBVEgpOworICBzdHJQbHVzUGF0aCArPSBidWY7CisgIHN0clBsdXNQYXRoICs9ICJcXCI7CisgIHN0clBsdXNQYXRoICs9ICJHRElQTFVTLkRMTCI7CisgIG1faE1vZHVsZSA9IExvYWRMaWJyYXJ5QShzdHJQbHVzUGF0aCk7CisgIGlmICghbV9oTW9kdWxlKSB7CisgICAgcmV0dXJuOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZW9mIGdfR2RpcEZ1bmNOYW1lcyAvIHNpemVvZihMUENTVFIpOyBpKyspIHsKKyAgICBtX0Z1bmN0aW9uc1tpXSA9IEdldFByb2NBZGRyZXNzKG1faE1vZHVsZSwgZ19HZGlwRnVuY05hbWVzW2ldKTsKKyAgICBpZiAoIW1fRnVuY3Rpb25zW2ldKSB7CisgICAgICBtX2hNb2R1bGUgPSBOVUxMOworICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBDYWxsRnVuYyhHZGlwRGVsZXRlUHJpdmF0ZUZvbnRDb2xsZWN0aW9uKSgmcENvbGxlY3Rpb24pOworICB9CisgIHVpbnRwdHJfdCBnZGlwbHVzVG9rZW47CisgIEdkaXBsdXNTdGFydHVwSW5wdXQgZ2RpcGx1c1N0YXJ0dXBJbnB1dDsKKyAgKChGdW5jVHlwZV9HZGlwbHVzU3RhcnR1cCltX0Z1bmN0aW9uc1tGdW5jSWRfR2RpcGx1c1N0YXJ0dXBdKSgKKyAgICAgICZnZGlwbHVzVG9rZW4sICZnZGlwbHVzU3RhcnR1cElucHV0LCBOVUxMKTsKKyAgbV9HZGlNb2R1bGUgPSBMb2FkTGlicmFyeUEoIkdESTMyLkRMTCIpOworICBpZiAoIW1fR2RpTW9kdWxlKSB7CisgICAgcmV0dXJuOworICB9CisgIG1fcEdkaUFkZEZvbnRNZW1SZXNvdXJjZUV4ID0KKyAgICAgIEdldFByb2NBZGRyZXNzKG1fR2RpTW9kdWxlLCAiQWRkRm9udE1lbVJlc291cmNlRXgiKTsKKyAgbV9wR2RpUmVtb3ZlRm9udE1lbVJlc291cnNlRXggPQorICAgICAgR2V0UHJvY0FkZHJlc3MobV9HZGlNb2R1bGUsICJSZW1vdmVGb250TWVtUmVzb3VyY2VFeCIpOworfQorQ0dkaXBsdXNFeHQ6On5DR2RpcGx1c0V4dCgpIHt9CitMUFZPSUQgQ0dkaXBsdXNFeHQ6OkxvYWRNZW1Gb250KExQQllURSBwRGF0YSwgRlhfRFdPUkQgc2l6ZSkgeworICBHcEZvbnRDb2xsZWN0aW9uKiBwQ29sbGVjdGlvbiA9IE5VTEw7CisgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KKyAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OworICBDYWxsRnVuYyhHZGlwTmV3UHJpdmF0ZUZvbnRDb2xsZWN0aW9uKSgmcENvbGxlY3Rpb24pOworICBHcFN0YXR1cyBzdGF0dXMgPQorICAgICAgQ2FsbEZ1bmMoR2RpcFByaXZhdGVBZGRNZW1vcnlGb250KShwQ29sbGVjdGlvbiwgcERhdGEsIHNpemUpOworICBpZiAoc3RhdHVzID09IE9rKSB7CisgICAgcmV0dXJuIHBDb2xsZWN0aW9uOworICB9CisgIENhbGxGdW5jKEdkaXBEZWxldGVQcml2YXRlRm9udENvbGxlY3Rpb24pKCZwQ29sbGVjdGlvbik7CisgIHJldHVybiBOVUxMOworfQordm9pZCBDR2RpcGx1c0V4dDo6RGVsZXRlTWVtRm9udChMUFZPSUQgcENvbGxlY3Rpb24pIHsKKyAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQorICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CisgIENhbGxGdW5jKEdkaXBEZWxldGVQcml2YXRlRm9udENvbGxlY3Rpb24pKChHcEZvbnRDb2xsZWN0aW9uKiopJnBDb2xsZWN0aW9uKTsKK30KK0ZYX0JPT0wgQ0dkaXBsdXNFeHQ6OkdkaXBDcmVhdGVCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCB2b2lkKiogYml0bWFwKSB7CisgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KKyAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OworICBQaXhlbEZvcm1hdCBmb3JtYXQ7CisgIHN3aXRjaCAocEJpdG1hcC0+R2V0Rm9ybWF0KCkpIHsKKyAgICBjYXNlIEZYRElCX1JnYjoKKyAgICAgIGZvcm1hdCA9IFBpeGVsRm9ybWF0MjRicHBSR0I7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCX1JnYjMyOgorICAgICAgZm9ybWF0ID0gUGl4ZWxGb3JtYXQzMmJwcFJHQjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfQXJnYjoKKyAgICAgIGZvcm1hdCA9IFBpeGVsRm9ybWF0MzJicHBBUkdCOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBHcFN0YXR1cyBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwQ3JlYXRlQml0bWFwRnJvbVNjYW4wKSgKKyAgICAgIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpLCBwQml0bWFwLT5HZXRQaXRjaCgpLCBmb3JtYXQsCisgICAgICBwQml0bWFwLT5HZXRCdWZmZXIoKSwgKEdwQml0bWFwKiopYml0bWFwKTsKKyAgaWYgKHN0YXR1cyA9PSBPaykgeworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKK30KK0ZYX0JPT0wgQ0dkaXBsdXNFeHQ6OkdkaXBDcmVhdGVGcm9tSW1hZ2Uodm9pZCogYml0bWFwLCB2b2lkKiogZ3JhcGhpY3MpIHsKKyAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQorICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CisgIEdwU3RhdHVzIHN0YXR1cyA9IENhbGxGdW5jKEdkaXBHZXRJbWFnZUdyYXBoaWNzQ29udGV4dCkoCisgICAgICAoR3BCaXRtYXAqKWJpdG1hcCwgKEdwR3JhcGhpY3MqKilncmFwaGljcyk7CisgIGlmIChzdGF0dXMgPT0gT2spIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIENHZGlwbHVzRXh0OjpHZGlwQ3JlYXRlRm9udEZhbWlseUZyb21OYW1lKGNvbnN0IEZYX1dDSEFSKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwRm9udENvbGxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBwRmFtaWx5KSB7CisgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KKyAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OworICBHcFN0YXR1cyBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwQ3JlYXRlRm9udEZhbWlseUZyb21OYW1lKSgKKyAgICAgIChHRElQQ09OU1QgV0NIQVIqKW5hbWUsIChHcEZvbnRDb2xsZWN0aW9uKilwRm9udENvbGxlY3Rpb24sCisgICAgICAoR3BGb250RmFtaWx5KiopcEZhbWlseSk7CisgIGlmIChzdGF0dXMgPT0gT2spIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIENHZGlwbHVzRXh0OjpHZGlwQ3JlYXRlRm9udEZyb21GYW1pbHkodm9pZCogcEZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbnRzdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogcEZvbnQpIHsKKyAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQorICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CisgIEdwU3RhdHVzIHN0YXR1cyA9CisgICAgICBDYWxsRnVuYyhHZGlwQ3JlYXRlRm9udCkoKEdwRm9udEZhbWlseSopcEZhbWlseSwgZm9udF9zaXplLCBmb250c3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pdChmbGFnKSwgKEdwRm9udCoqKXBGb250KTsKKyAgaWYgKHN0YXR1cyA9PSBPaykgeworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKK30KK3ZvaWQgQ0dkaXBsdXNFeHQ6OkdkaXBHZXRGb250U2l6ZSh2b2lkKiBwRm9udCwgRlhfRkxPQVQqIHNpemUpIHsKKyAgUkVBTCBnZXRfc2l6ZTsKKyAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQorICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CisgIEdwU3RhdHVzIHN0YXR1cyA9IENhbGxGdW5jKEdkaXBHZXRGb250U2l6ZSkoKEdwRm9udCopcEZvbnQsIChSRUFMKikmZ2V0X3NpemUpOworICBpZiAoc3RhdHVzID09IE9rKSB7CisgICAgKnNpemUgPSAoRlhfRkxPQVQpZ2V0X3NpemU7CisgIH0gZWxzZSB7CisgICAgKnNpemUgPSAwOworICB9Cit9Cit2b2lkIENHZGlwbHVzRXh0OjpHZGlwU2V0VGV4dFJlbmRlcmluZ0hpbnQodm9pZCogZ3JhcGhpY3MsIGludCBtb2RlKSB7CisgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KKyAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OworICBDYWxsRnVuYyhHZGlwU2V0VGV4dFJlbmRlcmluZ0hpbnQpKChHcEdyYXBoaWNzKilncmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVGV4dFJlbmRlcmluZ0hpbnQpbW9kZSk7Cit9Cit2b2lkIENHZGlwbHVzRXh0OjpHZGlwU2V0UGFnZVVuaXQodm9pZCogZ3JhcGhpY3MsIEZYX0RXT1JEIHVuaXQpIHsKKyAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQorICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CisgIENhbGxGdW5jKEdkaXBTZXRQYWdlVW5pdCkoKEdwR3JhcGhpY3MqKWdyYXBoaWNzLCAoR3BVbml0KXVuaXQpOworfQorRlhfQk9PTCBDR2RpcGx1c0V4dDo6R2RpcERyYXdEcml2ZXJTdHJpbmcodm9pZCogZ3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCogdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBmb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnJ1c2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwb3NpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBtYXRyaXgpIHsKKyAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQorICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CisgIEdwU3RhdHVzIHN0YXR1cyA9IENhbGxGdW5jKEdkaXBEcmF3RHJpdmVyU3RyaW5nKSgKKyAgICAgIChHcEdyYXBoaWNzKilncmFwaGljcywgKEdESVBDT05TVCBVSU5UMTYqKXRleHQsIChJTlQpbGVuZ3RoLAorICAgICAgKEdESVBDT05TVCBHcEZvbnQqKWZvbnQsIChHRElQQ09OU1QgR3BCcnVzaCopYnJ1c2gsCisgICAgICAoR0RJUENPTlNUIFBvaW50RiopcG9zaXRpb25zLCAoSU5UKWZsYWdzLCAoR0RJUENPTlNUIEdwTWF0cml4KiltYXRyaXgpOworICBpZiAoc3RhdHVzID09IE9rKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQordm9pZCBDR2RpcGx1c0V4dDo6R2RpcENyZWF0ZUJydXNoKEZYX0RXT1JEIGZpbGxfYXJnYiwgdm9pZCoqIHBCcnVzaCkgeworICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9CisgICAgICAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKKyAgQ2FsbEZ1bmMoR2RpcENyZWF0ZVNvbGlkRmlsbCkoKEFSR0IpZmlsbF9hcmdiLCAoR3BTb2xpZEZpbGwqKilwQnJ1c2gpOworfQordm9pZCBDR2RpcGx1c0V4dDo6R2RpcERlbGV0ZUJydXNoKHZvaWQqIHBCcnVzaCkgeworICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9CisgICAgICAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKKyAgQ2FsbEZ1bmMoR2RpcERlbGV0ZUJydXNoKSgoR3BTb2xpZEZpbGwqKXBCcnVzaCk7Cit9Cit2b2lkKiBDR2RpcGx1c0V4dDo6R2RpcENyZWF0ZUZvbnRGcm9tQ29sbGVjdGlvbih2b2lkKiBwRm9udENvbGxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9udHN0eWxlKSB7CisgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KKyAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OworICBpbnQgbnVtRmFtaWxpZXMgPSAwOworICBHcFN0YXR1cyBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwR2V0Rm9udENvbGxlY3Rpb25GYW1pbHlDb3VudCkoCisgICAgICAoR3BGb250Q29sbGVjdGlvbiopcEZvbnRDb2xsZWN0aW9uLCAmbnVtRmFtaWxpZXMpOworICBpZiAoc3RhdHVzICE9IE9rKSB7CiAgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgR3BGb250RmFtaWx5KiBmYW1pbHlfbGlzdFsxXTsKKyAgc3RhdHVzID0gQ2FsbEZ1bmMoR2RpcEdldEZvbnRDb2xsZWN0aW9uRmFtaWx5TGlzdCkoCisgICAgICAoR3BGb250Q29sbGVjdGlvbiopcEZvbnRDb2xsZWN0aW9uLCAxLCBmYW1pbHlfbGlzdCwgJm51bUZhbWlsaWVzKTsKKyAgaWYgKHN0YXR1cyAhPSBPaykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEdwRm9udCogcEZvbnQgPSBOVUxMOworICBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwQ3JlYXRlRm9udCkoZmFtaWx5X2xpc3RbMF0sIGZvbnRfc2l6ZSwgZm9udHN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pdFBpeGVsLCAmcEZvbnQpOworICBpZiAoc3RhdHVzICE9IE9rKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIHBGb250OwogfQotdm9pZCBDR2RpcGx1c0V4dDo6RGVsZXRlTWVtRm9udChMUFZPSUQgcENvbGxlY3Rpb24pCi17Ci0gICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKLSAgICBDYWxsRnVuYyhHZGlwRGVsZXRlUHJpdmF0ZUZvbnRDb2xsZWN0aW9uKSgoR3BGb250Q29sbGVjdGlvbioqKSZwQ29sbGVjdGlvbik7Cit2b2lkIENHZGlwbHVzRXh0OjpHZGlwQ3JlYXRlTWF0cml4KEZYX0ZMT0FUIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBtYXRyaXgpIHsKKyAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQorICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CisgIENhbGxGdW5jKEdkaXBDcmVhdGVNYXRyaXgyKShhLCBiLCBjLCBkLCBlLCBmLCAoR3BNYXRyaXgqKiltYXRyaXgpOwogfQotRlhfQk9PTCBDR2RpcGx1c0V4dDo6R2RpcENyZWF0ZUJpdG1hcChDRlhfRElCaXRtYXAqIHBCaXRtYXAsIHZvaWQqKmJpdG1hcCkKLXsKLSAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICAgIFBpeGVsRm9ybWF0IGZvcm1hdDsKLSAgICBzd2l0Y2ggKHBCaXRtYXAtPkdldEZvcm1hdCgpKSB7Ci0gICAgICAgIGNhc2UgRlhESUJfUmdiOgotICAgICAgICAgICAgZm9ybWF0ID0gUGl4ZWxGb3JtYXQyNGJwcFJHQjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCX1JnYjMyOgotICAgICAgICAgICAgZm9ybWF0ID0gUGl4ZWxGb3JtYXQzMmJwcFJHQjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCX0FyZ2I6Ci0gICAgICAgICAgICBmb3JtYXQgPSBQaXhlbEZvcm1hdDMyYnBwQVJHQjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwordm9pZCBDR2RpcGx1c0V4dDo6R2RpcERlbGV0ZU1hdHJpeCh2b2lkKiBtYXRyaXgpIHsKKyAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQorICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CisgIENhbGxGdW5jKEdkaXBEZWxldGVNYXRyaXgpKChHcE1hdHJpeCopbWF0cml4KTsKK30KK3ZvaWQgQ0dkaXBsdXNFeHQ6OkdkaXBEZWxldGVGb250RmFtaWx5KHZvaWQqIHBGYW1pbHkpIHsKKyAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQorICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CisgIENhbGxGdW5jKEdkaXBEZWxldGVGb250RmFtaWx5KSgoR3BGb250RmFtaWx5KilwRmFtaWx5KTsKK30KK3ZvaWQgQ0dkaXBsdXNFeHQ6OkdkaXBEZWxldGVGb250KHZvaWQqIHBGb250KSB7CisgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KKyAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OworICBDYWxsRnVuYyhHZGlwRGVsZXRlRm9udCkoKEdwRm9udCopcEZvbnQpOworfQordm9pZCBDR2RpcGx1c0V4dDo6R2RpcFNldFdvcmxkVHJhbnNmb3JtKHZvaWQqIGdyYXBoaWNzLCB2b2lkKiBwTWF0cml4KSB7CisgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KKyAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OworICBDYWxsRnVuYyhHZGlwU2V0V29ybGRUcmFuc2Zvcm0pKChHcEdyYXBoaWNzKilncmFwaGljcywgKEdwTWF0cml4KilwTWF0cml4KTsKK30KK3ZvaWQgQ0dkaXBsdXNFeHQ6OkdkaXBEaXNwb3NlSW1hZ2Uodm9pZCogYml0bWFwKSB7CisgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KKyAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OworICBDYWxsRnVuYyhHZGlwRGlzcG9zZUltYWdlKSgoR3BCaXRtYXAqKWJpdG1hcCk7Cit9Cit2b2lkIENHZGlwbHVzRXh0OjpHZGlwRGVsZXRlR3JhcGhpY3Modm9pZCogZ3JhcGhpY3MpIHsKKyAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQorICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CisgIENhbGxGdW5jKEdkaXBEZWxldGVHcmFwaGljcykoKEdwR3JhcGhpY3MqKWdyYXBoaWNzKTsKK30KK0ZYX0JPT0wgQ0dkaXBsdXNFeHQ6OlN0cmV0Y2hCaXRNYXNrKEhEQyBoREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MIGJNb25vRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykgeworICBBU1NFUlQocEJpdG1hcC0+R2V0QlBQKCkgPT0gMSk7CisgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KKyAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OworICBHcEdyYXBoaWNzKiBwR3JhcGhpY3MgPSBOVUxMOworICBDYWxsRnVuYyhHZGlwQ3JlYXRlRnJvbUhEQykoaERDLCAmcEdyYXBoaWNzKTsKKyAgQ2FsbEZ1bmMoR2RpcFNldFBhZ2VVbml0KShwR3JhcGhpY3MsIFVuaXRQaXhlbCk7CisgIGlmIChmbGFncyAmIEZYRElCX05PU01PT1RIKSB7CisgICAgQ2FsbEZ1bmMoR2RpcFNldEludGVycG9sYXRpb25Nb2RlKShwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnBvbGF0aW9uTW9kZU5lYXJlc3ROZWlnaGJvcik7CisgIH0gZWxzZSB7CisgICAgQ2FsbEZ1bmMoR2RpcFNldEludGVycG9sYXRpb25Nb2RlKShwR3JhcGhpY3MsIEludGVycG9sYXRpb25Nb2RlSGlnaFF1YWxpdHkpOworICB9CisgIE91dHB1dEltYWdlTWFzayhwR3JhcGhpY3MsIGJNb25vRGV2aWNlLCBwQml0bWFwLCBkZXN0X2xlZnQsIGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIGFyZ2IsIHBDbGlwUmVjdCk7CisgIENhbGxGdW5jKEdkaXBEZWxldGVHcmFwaGljcykocEdyYXBoaWNzKTsKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENHZGlwbHVzRXh0OjpTdHJldGNoRElCaXRzKEhEQyBoREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykgeworICBHcEdyYXBoaWNzKiBwR3JhcGhpY3M7CisgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KKyAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OworICBDYWxsRnVuYyhHZGlwQ3JlYXRlRnJvbUhEQykoaERDLCAmcEdyYXBoaWNzKTsKKyAgQ2FsbEZ1bmMoR2RpcFNldFBhZ2VVbml0KShwR3JhcGhpY3MsIFVuaXRQaXhlbCk7CisgIGlmIChmbGFncyAmIEZYRElCX05PU01PT1RIKSB7CisgICAgQ2FsbEZ1bmMoR2RpcFNldEludGVycG9sYXRpb25Nb2RlKShwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnBvbGF0aW9uTW9kZU5lYXJlc3ROZWlnaGJvcik7CisgIH0gZWxzZSBpZiAocEJpdG1hcC0+R2V0V2lkdGgoKSA+IGFicyhkZXN0X3dpZHRoKSAvIDIgfHwKKyAgICAgICAgICAgICBwQml0bWFwLT5HZXRIZWlnaHQoKSA+IGFicyhkZXN0X2hlaWdodCkgLyAyKSB7CisgICAgQ2FsbEZ1bmMoR2RpcFNldEludGVycG9sYXRpb25Nb2RlKShwR3JhcGhpY3MsIEludGVycG9sYXRpb25Nb2RlSGlnaFF1YWxpdHkpOworICB9IGVsc2UgeworICAgIENhbGxGdW5jKEdkaXBTZXRJbnRlcnBvbGF0aW9uTW9kZSkocEdyYXBoaWNzLCBJbnRlcnBvbGF0aW9uTW9kZUJpbGluZWFyKTsKKyAgfQorICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpKTsKKyAgT3V0cHV0SW1hZ2UocEdyYXBoaWNzLCBwQml0bWFwLCAmc3JjX3JlY3QsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgIGRlc3RfaGVpZ2h0KTsKKyAgQ2FsbEZ1bmMoR2RpcERlbGV0ZUdyYXBoaWNzKShwR3JhcGhpY3MpOworICBDYWxsRnVuYyhHZGlwRGVsZXRlR3JhcGhpY3MpKHBHcmFwaGljcyk7CisgIHJldHVybiBUUlVFOworfQorc3RhdGljIEdwUGVuKiBfR2RpcENyZWF0ZVBlbihjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUZXh0TW9kZSA9IEZBTFNFKSB7CisgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KKyAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OworICBGWF9GTE9BVCB3aWR0aCA9IHBHcmFwaFN0YXRlID8gcEdyYXBoU3RhdGUtPm1fTGluZVdpZHRoIDogMS4wZjsKKyAgaWYgKCFiVGV4dE1vZGUpIHsKKyAgICBGWF9GTE9BVCB1bml0ID0KKyAgICAgICAgcE1hdHJpeAorICAgICAgICAgICAgPyBGWFNZU19EaXYoMS4wZiwgKHBNYXRyaXgtPkdldFhVbml0KCkgKyBwTWF0cml4LT5HZXRZVW5pdCgpKSAvIDIpCisgICAgICAgICAgICA6IDEuMGY7CisgICAgaWYgKHdpZHRoIDwgdW5pdCkgeworICAgICAgd2lkdGggPSB1bml0OwogICAgIH0KLSAgICBHcFN0YXR1cyBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwQ3JlYXRlQml0bWFwRnJvbVNjYW4wKShwQml0bWFwLT5HZXRXaWR0aCgpLCBwQml0bWFwLT5HZXRIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwLT5HZXRQaXRjaCgpLCBmb3JtYXQsIHBCaXRtYXAtPkdldEJ1ZmZlcigpLCAoR3BCaXRtYXAqKiliaXRtYXApOwotICAgIGlmIChzdGF0dXMgPT0gT2spIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLUZYX0JPT0wgQ0dkaXBsdXNFeHQ6OkdkaXBDcmVhdGVGcm9tSW1hZ2Uodm9pZCogYml0bWFwLCB2b2lkKiogZ3JhcGhpY3MpCi17Ci0gICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKLSAgICBHcFN0YXR1cyBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwR2V0SW1hZ2VHcmFwaGljc0NvbnRleHQpKChHcEJpdG1hcCopYml0bWFwLCAoR3BHcmFwaGljcyoqKWdyYXBoaWNzKTsKLSAgICBpZiAoc3RhdHVzID09IE9rKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci1GWF9CT09MIENHZGlwbHVzRXh0OjpHZGlwQ3JlYXRlRm9udEZhbWlseUZyb21OYW1lKEZYX0xQQ1dTVFIgbmFtZSwgdm9pZCogcEZvbnRDb2xsZWN0aW9uLCB2b2lkKipwRmFtaWx5KQotewotICAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0gKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7Ci0gICAgR3BTdGF0dXMgc3RhdHVzID0gQ2FsbEZ1bmMoR2RpcENyZWF0ZUZvbnRGYW1pbHlGcm9tTmFtZSkoKEdESVBDT05TVCBXQ0hBUiAqKW5hbWUsIChHcEZvbnRDb2xsZWN0aW9uKilwRm9udENvbGxlY3Rpb24sIChHcEZvbnRGYW1pbHkqKilwRmFtaWx5KTsKLSAgICBpZiAoc3RhdHVzID09IE9rKSB7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci1GWF9CT09MIENHZGlwbHVzRXh0OjpHZGlwQ3JlYXRlRm9udEZyb21GYW1pbHkodm9pZCogcEZhbWlseSwgRlhfRkxPQVQgZm9udF9zaXplLCBpbnQgZm9udHN0eWxlLCBpbnQgZmxhZywgdm9pZCoqIHBGb250KQotewotICAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0gKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7Ci0gICAgR3BTdGF0dXMgc3RhdHVzID0gQ2FsbEZ1bmMoR2RpcENyZWF0ZUZvbnQpKChHcEZvbnRGYW1pbHkqKXBGYW1pbHksIGZvbnRfc2l6ZSwgZm9udHN0eWxlLCBVbml0KGZsYWcpLCAoR3BGb250KiopcEZvbnQpOwotICAgIGlmIChzdGF0dXMgPT0gT2spIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLXZvaWQgQ0dkaXBsdXNFeHQ6OkdkaXBHZXRGb250U2l6ZSh2b2lkICpwRm9udCwgRlhfRkxPQVQgKnNpemUpCi17Ci0gICAgUkVBTCBnZXRfc2l6ZTsKLSAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICAgIEdwU3RhdHVzIHN0YXR1cyA9IENhbGxGdW5jKEdkaXBHZXRGb250U2l6ZSkoKEdwRm9udCAqKXBGb250LCAoUkVBTCopJmdldF9zaXplKTsKLSAgICBpZiAoc3RhdHVzID09IE9rKSB7Ci0gICAgICAgICpzaXplID0gKEZYX0ZMT0FUKWdldF9zaXplOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpzaXplID0gMDsKLSAgICB9Ci19Ci12b2lkIENHZGlwbHVzRXh0OjpHZGlwU2V0VGV4dFJlbmRlcmluZ0hpbnQodm9pZCogZ3JhcGhpY3MsIGludCBtb2RlKQotewotICAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0gKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7Ci0gICAgQ2FsbEZ1bmMoR2RpcFNldFRleHRSZW5kZXJpbmdIaW50KSgoR3BHcmFwaGljcyopZ3JhcGhpY3MsIChUZXh0UmVuZGVyaW5nSGludCltb2RlKTsKLX0KLXZvaWQgQ0dkaXBsdXNFeHQ6OkdkaXBTZXRQYWdlVW5pdCh2b2lkKiBncmFwaGljcywgRlhfRFdPUkQgdW5pdCkKLXsKLSAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICAgIENhbGxGdW5jKEdkaXBTZXRQYWdlVW5pdCkoKEdwR3JhcGhpY3MqKWdyYXBoaWNzLCAoR3BVbml0KXVuaXQpOwotfQotRlhfQk9PTCBDR2RpcGx1c0V4dDo6R2RpcERyYXdEcml2ZXJTdHJpbmcodm9pZCAqZ3JhcGhpY3MsICB1bnNpZ25lZCBzaG9ydCAqdGV4dCwgaW50IGxlbmd0aCwKLSAgICAgICAgdm9pZCAqZm9udCwgdm9pZCogYnJ1c2gsIHZvaWQgKnBvc2l0aW9ucywgaW50IGZsYWdzLCBjb25zdCB2b2lkICptYXRyaXgpCi17Ci0gICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKLSAgICBHcFN0YXR1cyBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwRHJhd0RyaXZlclN0cmluZykoKEdwR3JhcGhpY3MqKWdyYXBoaWNzLCAoR0RJUENPTlNUIFVJTlQxNiAqKXRleHQsIChJTlQpbGVuZ3RoLCAoR0RJUENPTlNUIEdwRm9udCAqKWZvbnQsIChHRElQQ09OU1QgR3BCcnVzaCopYnJ1c2gsCi0gICAgICAgICAgICAgICAgICAgICAgKEdESVBDT05TVCBQb2ludEYgKilwb3NpdGlvbnMsIChJTlQpZmxhZ3MsIChHRElQQ09OU1QgR3BNYXRyaXggKiltYXRyaXgpOwotICAgIGlmIChzdGF0dXMgPT0gT2spIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLXZvaWQgQ0dkaXBsdXNFeHQ6OkdkaXBDcmVhdGVCcnVzaChGWF9EV09SRCBmaWxsX2FyZ2IsIHZvaWQqKiBwQnJ1c2gpCi17Ci0gICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKLSAgICBDYWxsRnVuYyhHZGlwQ3JlYXRlU29saWRGaWxsKSgoQVJHQilmaWxsX2FyZ2IsIChHcFNvbGlkRmlsbCoqKXBCcnVzaCk7Ci19Ci12b2lkIENHZGlwbHVzRXh0OjpHZGlwRGVsZXRlQnJ1c2godm9pZCogcEJydXNoKQotewotICAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0gKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7Ci0gICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZUJydXNoKSgoR3BTb2xpZEZpbGwqKXBCcnVzaCk7Ci19Ci12b2lkKiBDR2RpcGx1c0V4dDo6R2RpcENyZWF0ZUZvbnRGcm9tQ29sbGVjdGlvbih2b2lkKiBwRm9udENvbGxlY3Rpb24sIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgaW50IGZvbnRzdHlsZSkKLXsKLSAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICAgIGludCBudW1GYW1pbGllcyA9IDA7Ci0gICAgR3BTdGF0dXMgc3RhdHVzID0gQ2FsbEZ1bmMoR2RpcEdldEZvbnRDb2xsZWN0aW9uRmFtaWx5Q291bnQpKChHcEZvbnRDb2xsZWN0aW9uKilwRm9udENvbGxlY3Rpb24sICZudW1GYW1pbGllcyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPaykgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgR3BGb250RmFtaWx5KiBmYW1pbHlfbGlzdFsxXTsKLSAgICBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwR2V0Rm9udENvbGxlY3Rpb25GYW1pbHlMaXN0KSgoR3BGb250Q29sbGVjdGlvbiopcEZvbnRDb2xsZWN0aW9uLCAxLCBmYW1pbHlfbGlzdCwgJm51bUZhbWlsaWVzKTsKLSAgICBpZiAoc3RhdHVzICE9IE9rKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBHcEZvbnQqIHBGb250ID0gTlVMTDsKLSAgICBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwQ3JlYXRlRm9udCkoZmFtaWx5X2xpc3RbMF0sIGZvbnRfc2l6ZSwgZm9udHN0eWxlLCBVbml0UGl4ZWwsICZwRm9udCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPaykgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIHBGb250OwotfQotdm9pZCBDR2RpcGx1c0V4dDo6R2RpcENyZWF0ZU1hdHJpeChGWF9GTE9BVCBhLCBGWF9GTE9BVCBiLCBGWF9GTE9BVCBjLCBGWF9GTE9BVCBkLCBGWF9GTE9BVCBlLCBGWF9GTE9BVCBmLCB2b2lkKiogbWF0cml4KQotewotICAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0gKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7Ci0gICAgQ2FsbEZ1bmMoR2RpcENyZWF0ZU1hdHJpeDIpKGEsIGIsIGMsIGQsIGUsIGYsIChHcE1hdHJpeCoqKW1hdHJpeCk7Ci19Ci12b2lkIENHZGlwbHVzRXh0OjpHZGlwRGVsZXRlTWF0cml4KHZvaWQqIG1hdHJpeCkKLXsKLSAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICAgIENhbGxGdW5jKEdkaXBEZWxldGVNYXRyaXgpKChHcE1hdHJpeCopbWF0cml4KTsKLX0KLXZvaWQgQ0dkaXBsdXNFeHQ6OkdkaXBEZWxldGVGb250RmFtaWx5KHZvaWQqIHBGYW1pbHkpCi17Ci0gICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKLSAgICBDYWxsRnVuYyhHZGlwRGVsZXRlRm9udEZhbWlseSkoKEdwRm9udEZhbWlseSopcEZhbWlseSk7Ci19Ci12b2lkIENHZGlwbHVzRXh0OjpHZGlwRGVsZXRlRm9udCh2b2lkKiBwRm9udCkKLXsKLSAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICAgIENhbGxGdW5jKEdkaXBEZWxldGVGb250KSgoR3BGb250KilwRm9udCk7Ci19Ci12b2lkIENHZGlwbHVzRXh0OjpHZGlwU2V0V29ybGRUcmFuc2Zvcm0odm9pZCogZ3JhcGhpY3MsIHZvaWQqIHBNYXRyaXgpCi17Ci0gICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKLSAgICBDYWxsRnVuYyhHZGlwU2V0V29ybGRUcmFuc2Zvcm0pKChHcEdyYXBoaWNzKilncmFwaGljcywgKEdwTWF0cml4KilwTWF0cml4KTsKLX0KLXZvaWQgQ0dkaXBsdXNFeHQ6OkdkaXBEaXNwb3NlSW1hZ2Uodm9pZCogYml0bWFwKQotewotICAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0gKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7Ci0gICAgQ2FsbEZ1bmMoR2RpcERpc3Bvc2VJbWFnZSkoKEdwQml0bWFwKiliaXRtYXApOwotfQotdm9pZCBDR2RpcGx1c0V4dDo6R2RpcERlbGV0ZUdyYXBoaWNzKHZvaWQqIGdyYXBoaWNzKQotewotICAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0gKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7Ci0gICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZUdyYXBoaWNzKSgoR3BHcmFwaGljcyopZ3JhcGhpY3MpOwotfQotRlhfQk9PTCBDR2RpcGx1c0V4dDo6U3RyZXRjaEJpdE1hc2soSERDIGhEQywgQk9PTCBiTW9ub0RldmljZSwgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBGWF9EV09SRCBhcmdiLCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIGludCBmbGFncykKLXsKLSAgICBBU1NFUlQocEJpdG1hcC0+R2V0QlBQKCkgPT0gMSk7Ci0gICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKLSAgICBHcEdyYXBoaWNzKiBwR3JhcGhpY3MgPSBOVUxMOwotICAgIENhbGxGdW5jKEdkaXBDcmVhdGVGcm9tSERDKShoREMsICZwR3JhcGhpY3MpOwotICAgIENhbGxGdW5jKEdkaXBTZXRQYWdlVW5pdCkocEdyYXBoaWNzLCBVbml0UGl4ZWwpOwotICAgIGlmIChmbGFncyAmIEZYRElCX05PU01PT1RIKSB7Ci0gICAgICAgIENhbGxGdW5jKEdkaXBTZXRJbnRlcnBvbGF0aW9uTW9kZSkocEdyYXBoaWNzLCBJbnRlcnBvbGF0aW9uTW9kZU5lYXJlc3ROZWlnaGJvcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQ2FsbEZ1bmMoR2RpcFNldEludGVycG9sYXRpb25Nb2RlKShwR3JhcGhpY3MsIEludGVycG9sYXRpb25Nb2RlSGlnaFF1YWxpdHkpOwotICAgIH0KLSAgICBPdXRwdXRJbWFnZU1hc2socEdyYXBoaWNzLCBiTW9ub0RldmljZSwgcEJpdG1hcCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIGFyZ2IsIHBDbGlwUmVjdCk7Ci0gICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZUdyYXBoaWNzKShwR3JhcGhpY3MpOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTCBDR2RpcGx1c0V4dDo6U3RyZXRjaERJQml0cyhIREMgaERDLCBjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBpbnQgZmxhZ3MpCi17Ci0gICAgR3BHcmFwaGljcyogcEdyYXBoaWNzOwotICAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0gKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7Ci0gICAgQ2FsbEZ1bmMoR2RpcENyZWF0ZUZyb21IREMpKGhEQywgJnBHcmFwaGljcyk7Ci0gICAgQ2FsbEZ1bmMoR2RpcFNldFBhZ2VVbml0KShwR3JhcGhpY3MsIFVuaXRQaXhlbCk7Ci0gICAgaWYgKGZsYWdzICYgRlhESUJfTk9TTU9PVEgpIHsKLSAgICAgICAgQ2FsbEZ1bmMoR2RpcFNldEludGVycG9sYXRpb25Nb2RlKShwR3JhcGhpY3MsIEludGVycG9sYXRpb25Nb2RlTmVhcmVzdE5laWdoYm9yKTsKLSAgICB9IGVsc2UgaWYgKHBCaXRtYXAtPkdldFdpZHRoKCkgPiBhYnMoZGVzdF93aWR0aCkgLyAyIHx8IHBCaXRtYXAtPkdldEhlaWdodCgpID4gYWJzKGRlc3RfaGVpZ2h0KSAvIDIpIHsKLSAgICAgICAgQ2FsbEZ1bmMoR2RpcFNldEludGVycG9sYXRpb25Nb2RlKShwR3JhcGhpY3MsIEludGVycG9sYXRpb25Nb2RlSGlnaFF1YWxpdHkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIENhbGxGdW5jKEdkaXBTZXRJbnRlcnBvbGF0aW9uTW9kZSkocEdyYXBoaWNzLCBJbnRlcnBvbGF0aW9uTW9kZUJpbGluZWFyKTsKLSAgICB9Ci0gICAgRlhfUkVDVCBzcmNfcmVjdCgwLCAwLCBwQml0bWFwLT5HZXRXaWR0aCgpLCBwQml0bWFwLT5HZXRIZWlnaHQoKSk7Ci0gICAgT3V0cHV0SW1hZ2UocEdyYXBoaWNzLCBwQml0bWFwLCAmc3JjX3JlY3QsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0KTsKLSAgICBDYWxsRnVuYyhHZGlwRGVsZXRlR3JhcGhpY3MpKHBHcmFwaGljcyk7Ci0gICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZUdyYXBoaWNzKShwR3JhcGhpY3MpOwotICAgIHJldHVybiBUUlVFOwotfQotc3RhdGljIEdwUGVuKiBfR2RpcENyZWF0ZVBlbihjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBEV09SRCBhcmdiLCBGWF9CT09MIGJUZXh0TW9kZSA9IEZBTFNFKQotewotICAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0gKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7Ci0gICAgRlhfRkxPQVQgd2lkdGggPSBwR3JhcGhTdGF0ZSA/IHBHcmFwaFN0YXRlLT5tX0xpbmVXaWR0aCA6IDEuMGY7Ci0gICAgaWYgKCFiVGV4dE1vZGUpIHsKLSAgICAgICAgRlhfRkxPQVQgdW5pdCA9IHBNYXRyaXggPT0gTlVMTCA/IDEuMGYgOiBGWFNZU19EaXYoMS4wZiwgKHBNYXRyaXgtPkdldFhVbml0KCkgKyBwTWF0cml4LT5HZXRZVW5pdCgpKSAvIDIpOwotICAgICAgICBpZiAod2lkdGggPCB1bml0KSB7Ci0gICAgICAgICAgICB3aWR0aCA9IHVuaXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgR3BQZW4qIHBQZW4gPSBOVUxMOwotICAgIENhbGxGdW5jKEdkaXBDcmVhdGVQZW4xKSgoQVJHQilhcmdiLCB3aWR0aCwgVW5pdFdvcmxkLCAmcFBlbik7Ci0gICAgTGluZUNhcCBsaW5lQ2FwOwotICAgIERhc2hDYXAgZGFzaENhcCA9IERhc2hDYXBGbGF0OwotICAgIEZYX0JPT0wgYkRhc2hFeHRlbmQgPSBGQUxTRTsKLSAgICBzd2l0Y2gocEdyYXBoU3RhdGUtPm1fTGluZUNhcCkgewotICAgICAgICBjYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcEJ1dHQ6Ci0gICAgICAgICAgICBsaW5lQ2FwID0gTGluZUNhcEZsYXQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBSb3VuZDoKLSAgICAgICAgICAgIGxpbmVDYXAgPSBMaW5lQ2FwUm91bmQ7Ci0gICAgICAgICAgICBkYXNoQ2FwID0gRGFzaENhcFJvdW5kOwotICAgICAgICAgICAgYkRhc2hFeHRlbmQgPSBUUlVFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwU3F1YXJlOgotICAgICAgICAgICAgbGluZUNhcCA9IExpbmVDYXBTcXVhcmU7Ci0gICAgICAgICAgICBiRGFzaEV4dGVuZCA9IFRSVUU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgQ2FsbEZ1bmMoR2RpcFNldFBlbkxpbmVDYXAxOTc4MTkpKHBQZW4sIGxpbmVDYXAsIGxpbmVDYXAsIGRhc2hDYXApOwotICAgIExpbmVKb2luIGxpbmVKb2luOwotICAgIHN3aXRjaChwR3JhcGhTdGF0ZS0+bV9MaW5lSm9pbikgewotICAgICAgICBjYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUpvaW5NaXRlcjoKLSAgICAgICAgICAgIGxpbmVKb2luID0gTGluZUpvaW5NaXRlckNsaXBwZWQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luUm91bmQ6Ci0gICAgICAgICAgICBsaW5lSm9pbiA9IExpbmVKb2luUm91bmQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luQmV2ZWw6Ci0gICAgICAgICAgICBsaW5lSm9pbiA9IExpbmVKb2luQmV2ZWw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgQ2FsbEZ1bmMoR2RpcFNldFBlbkxpbmVKb2luKShwUGVuLCBsaW5lSm9pbik7Ci0gICAgaWYocEdyYXBoU3RhdGUtPm1fRGFzaENvdW50KSB7Ci0gICAgICAgIEZYX0ZMT0FUKiBwRGFzaEFycmF5ID0gRlhfQWxsb2MoRlhfRkxPQVQsIHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudCArIHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudCAlIDIpOwotICAgICAgICBpbnQgbkNvdW50ID0gMDsKLSAgICAgICAgRlhfRkxPQVQgb25fbGVmdG92ZXIgPSAwLCBvZmZfbGVmdG92ZXIgPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudDsgaSArPSAyKSB7Ci0gICAgICAgICAgICBGWF9GTE9BVCBvbl9waGFzZSA9IHBHcmFwaFN0YXRlLT5tX0Rhc2hBcnJheVtpXTsKLSAgICAgICAgICAgIEZYX0ZMT0FUIG9mZl9waGFzZTsKLSAgICAgICAgICAgIGlmIChpID09IHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudCAtIDEpIHsKLSAgICAgICAgICAgICAgICBvZmZfcGhhc2UgPSBvbl9waGFzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb2ZmX3BoYXNlID0gcEdyYXBoU3RhdGUtPm1fRGFzaEFycmF5W2kgKyAxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9uX3BoYXNlIC89IHdpZHRoOwotICAgICAgICAgICAgb2ZmX3BoYXNlIC89IHdpZHRoOwotICAgICAgICAgICAgaWYgKG9uX3BoYXNlICsgb2ZmX3BoYXNlIDw9IDAuMDAwMDJmKSB7Ci0gICAgICAgICAgICAgICAgb25fcGhhc2UgPSAxLjBmIC8gMTA7Ci0gICAgICAgICAgICAgICAgb2ZmX3BoYXNlID0gMS4wZiAvIDEwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJEYXNoRXh0ZW5kKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9mZl9waGFzZSA8IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgb2ZmX3BoYXNlID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBvZmZfcGhhc2UgLT0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb25fcGhhc2UgKz0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvbl9waGFzZSA9PSAwIHx8IG9mZl9waGFzZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5Db3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uX2xlZnRvdmVyICs9IG9uX3BoYXNlOwotICAgICAgICAgICAgICAgICAgICBvZmZfbGVmdG92ZXIgKz0gb2ZmX3BoYXNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBEYXNoQXJyYXlbbkNvdW50IC0gMl0gKz0gb25fcGhhc2U7Ci0gICAgICAgICAgICAgICAgICAgIHBEYXNoQXJyYXlbbkNvdW50IC0gMV0gKz0gb2ZmX3BoYXNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcERhc2hBcnJheVtuQ291bnQrK10gPSBvbl9waGFzZSArIG9uX2xlZnRvdmVyOwotICAgICAgICAgICAgICAgIG9uX2xlZnRvdmVyID0gMDsKLSAgICAgICAgICAgICAgICBwRGFzaEFycmF5W25Db3VudCsrXSA9IG9mZl9waGFzZSArIG9mZl9sZWZ0b3ZlcjsKLSAgICAgICAgICAgICAgICBvZmZfbGVmdG92ZXIgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIENhbGxGdW5jKEdkaXBTZXRQZW5EYXNoQXJyYXkpKHBQZW4sIHBEYXNoQXJyYXksIG5Db3VudCk7Ci0gICAgICAgIEZYX0ZMT0FUIHBoYXNlID0gcEdyYXBoU3RhdGUtPm1fRGFzaFBoYXNlOwotICAgICAgICBpZiAoYkRhc2hFeHRlbmQpCi0gICAgICAgICAgICBpZiAocGhhc2UgPCAwLjVmKSB7Ci0gICAgICAgICAgICAgICAgcGhhc2UgPSAwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwaGFzZSAtPSAwLjVmOwotICAgICAgICAgICAgfQotICAgICAgICBDYWxsRnVuYyhHZGlwU2V0UGVuRGFzaE9mZnNldCkocFBlbiwgcGhhc2UpOwotICAgICAgICBGWF9GcmVlKHBEYXNoQXJyYXkpOwotICAgICAgICBwRGFzaEFycmF5ID0gTlVMTDsKLSAgICB9Ci0gICAgQ2FsbEZ1bmMoR2RpcFNldFBlbk1pdGVyTGltaXQpKHBQZW4sIHBHcmFwaFN0YXRlLT5tX01pdGVyTGltaXQpOwotICAgIHJldHVybiBwUGVuOwotfQotc3RhdGljIEJPT0wgSXNTbWFsbFRyaWFuZ2xlKFBvaW50RiogcG9pbnRzLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBpbnQmIHYxLCBpbnQmIHYyKQotewotICAgIGludCBwYWlyc1tdID0gezEsIDIsIDAsIDIsIDAsIDF9OwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSArKykgewotICAgICAgICBpbnQgcGFpcjEgPSBwYWlyc1tpICogMl07Ci0gICAgICAgIGludCBwYWlyMiA9IHBhaXJzW2kgKiAyICsgMV07Ci0gICAgICAgIEZYX0ZMT0FUIHgxID0gcG9pbnRzW3BhaXIxXS5YLCB4MiA9IHBvaW50c1twYWlyMl0uWDsKLSAgICAgICAgRlhfRkxPQVQgeTEgPSBwb2ludHNbcGFpcjFdLlksIHkyID0gcG9pbnRzW3BhaXIyXS5ZOwotICAgICAgICBpZiAocE1hdHJpeCkgewotICAgICAgICAgICAgcE1hdHJpeC0+VHJhbnNmb3JtKHgxLCB5MSk7Ci0gICAgICAgICAgICBwTWF0cml4LT5UcmFuc2Zvcm0oeDIsIHkyKTsKLSAgICAgICAgfQotICAgICAgICBGWF9GTE9BVCBkeCA9IHgxIC0geDI7Ci0gICAgICAgIEZYX0ZMT0FUIGR5ID0geTEgLSB5MjsKLSAgICAgICAgRlhfRkxPQVQgZGlzdGFuY2Vfc3F1YXJlID0gRlhTWVNfTXVsKGR4LCBkeCkgKyBGWFNZU19NdWwoZHksIGR5KTsKLSAgICAgICAgaWYgKGRpc3RhbmNlX3NxdWFyZSA8ICgxLjBmICogMiArIDEuMGYgLyA0KSkgewotICAgICAgICAgICAgdjEgPSBpOwotICAgICAgICAgICAgdjIgPSBwYWlyMTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLUJPT0wgQ0dkaXBsdXNFeHQ6OkRyYXdQYXRoKEhEQyBoREMsIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9hcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc3Ryb2tlX2FyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICBpbnQgblBvaW50cyA9IHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpOwotICAgIGlmIChuUG9pbnRzID09IDApIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIEZYX1BBVEhQT0lOVCogcFBvaW50cyA9IHBQYXRoRGF0YS0+R2V0UG9pbnRzKCk7Ci0gICAgR3BHcmFwaGljcyogcEdyYXBoaWNzID0gTlVMTDsKLSAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICAgIENhbGxGdW5jKEdkaXBDcmVhdGVGcm9tSERDKShoREMsICZwR3JhcGhpY3MpOwotICAgIENhbGxGdW5jKEdkaXBTZXRQYWdlVW5pdCkocEdyYXBoaWNzLCBVbml0UGl4ZWwpOwotICAgIENhbGxGdW5jKEdkaXBTZXRQaXhlbE9mZnNldE1vZGUpKHBHcmFwaGljcywgUGl4ZWxPZmZzZXRNb2RlSGFsZik7Ci0gICAgR3BNYXRyaXgqIHBNYXRyaXggPSBOVUxMOwotICAgIGlmIChwT2JqZWN0MkRldmljZSkgewotICAgICAgICBDYWxsRnVuYyhHZGlwQ3JlYXRlTWF0cml4MikocE9iamVjdDJEZXZpY2UtPmEsIHBPYmplY3QyRGV2aWNlLT5iLCBwT2JqZWN0MkRldmljZS0+YywgcE9iamVjdDJEZXZpY2UtPmQsIHBPYmplY3QyRGV2aWNlLT5lLCBwT2JqZWN0MkRldmljZS0+ZiwgJnBNYXRyaXgpOwotICAgICAgICBDYWxsRnVuYyhHZGlwU2V0V29ybGRUcmFuc2Zvcm0pKHBHcmFwaGljcywgcE1hdHJpeCk7Ci0gICAgfQotICAgIFBvaW50RiAqcG9pbnRzID0gRlhfQWxsb2MoUG9pbnRGLCBuUG9pbnRzKTsKLSAgICBCWVRFICogdHlwZXMgID0gRlhfQWxsb2MoQllURSwgblBvaW50cyk7Ci0gICAgaW50IG5TdWJQYXRoZXMgPSAwOwotICAgIEZYX0JPT0wgYlN1YkNsb3NlID0gRkFMU0U7Ci0gICAgaW50IHBvc19zdWJjbG9zZSA9IDA7Ci0gICAgRlhfQk9PTCBiU21vb3RoID0gRkFMU0U7Ci0gICAgaW50IHN0YXJ0cG9pbnQgPSAwOwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuUG9pbnRzOyBpKyspIHsKLSAgICAgICAgcG9pbnRzW2ldLlggPSBwUG9pbnRzW2ldLm1fUG9pbnRYOwotICAgICAgICBwb2ludHNbaV0uWSA9IHBQb2ludHNbaV0ubV9Qb2ludFk7Ci0gICAgICAgIEZYX0ZMT0FUIHgsIHk7Ci0gICAgICAgIGlmIChwT2JqZWN0MkRldmljZSkgewotICAgICAgICAgICAgcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybShwUG9pbnRzW2ldLm1fUG9pbnRYLCBwUG9pbnRzW2ldLm1fUG9pbnRZLCB4LCB5KTsKKyAgfQorICBHcFBlbiogcFBlbiA9IE5VTEw7CisgIENhbGxGdW5jKEdkaXBDcmVhdGVQZW4xKSgoQVJHQilhcmdiLCB3aWR0aCwgVW5pdFdvcmxkLCAmcFBlbik7CisgIExpbmVDYXAgbGluZUNhcDsKKyAgRGFzaENhcCBkYXNoQ2FwID0gRGFzaENhcEZsYXQ7CisgIEZYX0JPT0wgYkRhc2hFeHRlbmQgPSBGQUxTRTsKKyAgc3dpdGNoIChwR3JhcGhTdGF0ZS0+bV9MaW5lQ2FwKSB7CisgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBCdXR0OgorICAgICAgbGluZUNhcCA9IExpbmVDYXBGbGF0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBSb3VuZDoKKyAgICAgIGxpbmVDYXAgPSBMaW5lQ2FwUm91bmQ7CisgICAgICBkYXNoQ2FwID0gRGFzaENhcFJvdW5kOworICAgICAgYkRhc2hFeHRlbmQgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBTcXVhcmU6CisgICAgICBsaW5lQ2FwID0gTGluZUNhcFNxdWFyZTsKKyAgICAgIGJEYXNoRXh0ZW5kID0gVFJVRTsKKyAgICAgIGJyZWFrOworICB9CisgIENhbGxGdW5jKEdkaXBTZXRQZW5MaW5lQ2FwMTk3ODE5KShwUGVuLCBsaW5lQ2FwLCBsaW5lQ2FwLCBkYXNoQ2FwKTsKKyAgTGluZUpvaW4gbGluZUpvaW47CisgIHN3aXRjaCAocEdyYXBoU3RhdGUtPm1fTGluZUpvaW4pIHsKKyAgICBjYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUpvaW5NaXRlcjoKKyAgICAgIGxpbmVKb2luID0gTGluZUpvaW5NaXRlckNsaXBwZWQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUpvaW5Sb3VuZDoKKyAgICAgIGxpbmVKb2luID0gTGluZUpvaW5Sb3VuZDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pbkJldmVsOgorICAgICAgbGluZUpvaW4gPSBMaW5lSm9pbkJldmVsOworICAgICAgYnJlYWs7CisgIH0KKyAgQ2FsbEZ1bmMoR2RpcFNldFBlbkxpbmVKb2luKShwUGVuLCBsaW5lSm9pbik7CisgIGlmIChwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQpIHsKKyAgICBGWF9GTE9BVCogcERhc2hBcnJheSA9IEZYX0FsbG9jKAorICAgICAgICBGWF9GTE9BVCwgcEdyYXBoU3RhdGUtPm1fRGFzaENvdW50ICsgcEdyYXBoU3RhdGUtPm1fRGFzaENvdW50ICUgMik7CisgICAgaW50IG5Db3VudCA9IDA7CisgICAgRlhfRkxPQVQgb25fbGVmdG92ZXIgPSAwLCBvZmZfbGVmdG92ZXIgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcEdyYXBoU3RhdGUtPm1fRGFzaENvdW50OyBpICs9IDIpIHsKKyAgICAgIEZYX0ZMT0FUIG9uX3BoYXNlID0gcEdyYXBoU3RhdGUtPm1fRGFzaEFycmF5W2ldOworICAgICAgRlhfRkxPQVQgb2ZmX3BoYXNlOworICAgICAgaWYgKGkgPT0gcEdyYXBoU3RhdGUtPm1fRGFzaENvdW50IC0gMSkgeworICAgICAgICBvZmZfcGhhc2UgPSBvbl9waGFzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG9mZl9waGFzZSA9IHBHcmFwaFN0YXRlLT5tX0Rhc2hBcnJheVtpICsgMV07CisgICAgICB9CisgICAgICBvbl9waGFzZSAvPSB3aWR0aDsKKyAgICAgIG9mZl9waGFzZSAvPSB3aWR0aDsKKyAgICAgIGlmIChvbl9waGFzZSArIG9mZl9waGFzZSA8PSAwLjAwMDAyZikgeworICAgICAgICBvbl9waGFzZSA9IDEuMGYgLyAxMDsKKyAgICAgICAgb2ZmX3BoYXNlID0gMS4wZiAvIDEwOworICAgICAgfQorICAgICAgaWYgKGJEYXNoRXh0ZW5kKSB7CisgICAgICAgIGlmIChvZmZfcGhhc2UgPCAxKSB7CisgICAgICAgICAgb2ZmX3BoYXNlID0gMDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHggPSBwUG9pbnRzW2ldLm1fUG9pbnRYOwotICAgICAgICAgICAgeSA9IHBQb2ludHNbaV0ubV9Qb2ludFk7CisgICAgICAgICAgb2ZmX3BoYXNlIC09IDE7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHggPiA1MDAwMCAqIDEuMGYpIHsKLSAgICAgICAgICAgIHBvaW50c1tpXS5YID0gNTAwMDAgKiAxLjBmOwotICAgICAgICB9Ci0gICAgICAgIGlmICh4IDwgLTUwMDAwICogMS4wZikgewotICAgICAgICAgICAgcG9pbnRzW2ldLlggPSAtNTAwMDAgKiAxLjBmOwotICAgICAgICB9Ci0gICAgICAgIGlmICh5ID4gNTAwMDAgKiAxLjBmKSB7Ci0gICAgICAgICAgICBwb2ludHNbaV0uWSA9IDUwMDAwICogMS4wZjsKLSAgICAgICAgfQotICAgICAgICBpZiAoeSA8IC01MDAwMCAqIDEuMGYpIHsKLSAgICAgICAgICAgIHBvaW50c1tpXS5ZID0gLTUwMDAwICogMS4wZjsKLSAgICAgICAgfQotICAgICAgICBpbnQgcG9pbnRfdHlwZSA9IHBQb2ludHNbaV0ubV9GbGFnICYgRlhQVF9UWVBFOwotICAgICAgICBpZihwb2ludF90eXBlID09IEZYUFRfTU9WRVRPKSB7Ci0gICAgICAgICAgICB0eXBlc1tpXSA9IFBhdGhQb2ludFR5cGVTdGFydDsKLSAgICAgICAgICAgIG5TdWJQYXRoZXMgKys7Ci0gICAgICAgICAgICBiU3ViQ2xvc2UgPSBGQUxTRTsKLSAgICAgICAgICAgIHN0YXJ0cG9pbnQgPSBpOwotICAgICAgICB9IGVsc2UgaWYgKHBvaW50X3R5cGUgPT0gRlhQVF9MSU5FVE8pIHsKLSAgICAgICAgICAgIHR5cGVzW2ldID0gUGF0aFBvaW50VHlwZUxpbmU7Ci0gICAgICAgICAgICBpZiAocFBvaW50c1tpIC0gMV0ubV9GbGFnID09IEZYUFRfTU9WRVRPICYmIChpID09IG5Qb2ludHMgLSAxIHx8IHBQb2ludHNbaSArIDFdLm1fRmxhZyA9PSBGWFBUX01PVkVUTykgJiYKLSAgICAgICAgICAgICAgICAgICAgcG9pbnRzW2ldLlkgPT0gcG9pbnRzW2kgLSAxXS5ZICYmIHBvaW50c1tpXS5YID09IHBvaW50c1tpIC0gMV0uWCkgewotICAgICAgICAgICAgICAgIHBvaW50c1tpXS5YICs9IDAuMDFmOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFiU21vb3RoICYmIHBvaW50c1tpXS5YICE9IHBvaW50c1tpIC0gMV0uWCAmJiBwb2ludHNbaV0uWSAhPSBwb2ludHNbaSAtIDFdLlkpIHsKLSAgICAgICAgICAgICAgICBiU21vb3RoID0gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwb2ludF90eXBlID09IEZYUFRfQkVaSUVSVE8pCXsKLSAgICAgICAgICAgIHR5cGVzW2ldID0gUGF0aFBvaW50VHlwZUJlemllcjsKLSAgICAgICAgICAgIGJTbW9vdGggPSBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwUG9pbnRzW2ldLm1fRmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpIHsKLSAgICAgICAgICAgIGlmIChiU3ViQ2xvc2UpIHsKLSAgICAgICAgICAgICAgICB0eXBlc1twb3Nfc3ViY2xvc2VdICY9IH5QYXRoUG9pbnRUeXBlQ2xvc2VTdWJwYXRoOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBiU3ViQ2xvc2UgPSBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcG9zX3N1YmNsb3NlID0gaTsKLSAgICAgICAgICAgIHR5cGVzW2ldIHw9IFBhdGhQb2ludFR5cGVDbG9zZVN1YnBhdGg7Ci0gICAgICAgICAgICBpZiAoIWJTbW9vdGggJiYgcG9pbnRzW2ldLlggIT0gcG9pbnRzW3N0YXJ0cG9pbnRdLlggJiYgcG9pbnRzW2ldLlkgIT0gcG9pbnRzW3N0YXJ0cG9pbnRdLlkpIHsKLSAgICAgICAgICAgICAgICBiU21vb3RoID0gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoZmlsbF9tb2RlICYgRlhGSUxMX05PUEFUSFNNT09USCkgewotICAgICAgICBiU21vb3RoID0gRkFMU0U7Ci0gICAgICAgIENhbGxGdW5jKEdkaXBTZXRTbW9vdGhpbmdNb2RlKShwR3JhcGhpY3MsIFNtb290aGluZ01vZGVOb25lKTsKLSAgICB9IGVsc2UgaWYgKCEoZmlsbF9tb2RlICYgRlhGSUxMX0ZVTExDT1ZFUikpIHsKLSAgICAgICAgaWYgKCFiU21vb3RoICYmIChmaWxsX21vZGUgJiAzKSkgewotICAgICAgICAgICAgYlNtb290aCA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJTbW9vdGggfHwgcEdyYXBoU3RhdGUgJiYgcEdyYXBoU3RhdGUtPm1fTGluZVdpZHRoID4gMikgewotICAgICAgICAgICAgQ2FsbEZ1bmMoR2RpcFNldFNtb290aGluZ01vZGUpKHBHcmFwaGljcywgU21vb3RoaW5nTW9kZUFudGlBbGlhcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaW50IG5ld19maWxsX21vZGUgPSBmaWxsX21vZGUgJiAzOwotICAgIGlmIChuUG9pbnRzID09IDQgJiYgcEdyYXBoU3RhdGUgPT0gTlVMTCkgewotICAgICAgICBpbnQgdjEsIHYyOwotICAgICAgICBpZiAoSXNTbWFsbFRyaWFuZ2xlKHBvaW50cywgcE9iamVjdDJEZXZpY2UsIHYxLCB2MikpIHsKLSAgICAgICAgICAgIEdwUGVuKiBwUGVuID0gTlVMTDsKLSAgICAgICAgICAgIENhbGxGdW5jKEdkaXBDcmVhdGVQZW4xKShmaWxsX2FyZ2IsIDEuMGYsIFVuaXRQaXhlbCwgJnBQZW4pOwotICAgICAgICAgICAgQ2FsbEZ1bmMoR2RpcERyYXdMaW5lSSkocEdyYXBoaWNzLCBwUGVuLCBGWFNZU19yb3VuZChwb2ludHNbdjFdLlgpLCBGWFNZU19yb3VuZChwb2ludHNbdjFdLlkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQocG9pbnRzW3YyXS5YKSwgRlhTWVNfcm91bmQocG9pbnRzW3YyXS5ZKSk7Ci0gICAgICAgICAgICBDYWxsRnVuYyhHZGlwRGVsZXRlUGVuKShwUGVuKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIEdwUGF0aCogcEdwUGF0aCA9IE5VTEw7Ci0gICAgQ2FsbEZ1bmMoR2RpcENyZWF0ZVBhdGgyKShwb2ludHMsIHR5cGVzLCBuUG9pbnRzLCBHZGlGaWxsVHlwZTJHZGlwKG5ld19maWxsX21vZGUpLCAmcEdwUGF0aCk7Ci0gICAgaWYgKCFwR3BQYXRoKSB7Ci0gICAgICAgIGlmIChwTWF0cml4KSB7Ci0gICAgICAgICAgICBDYWxsRnVuYyhHZGlwRGVsZXRlTWF0cml4KShwTWF0cml4KTsKLSAgICAgICAgfQotICAgICAgICBGWF9GcmVlKHBvaW50cyk7Ci0gICAgICAgIEZYX0ZyZWUodHlwZXMpOwotICAgICAgICBDYWxsRnVuYyhHZGlwRGVsZXRlR3JhcGhpY3MpKHBHcmFwaGljcyk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKG5ld19maWxsX21vZGUpIHsKLSAgICAgICAgR3BCcnVzaCogcEJydXNoID0gX0dkaXBDcmVhdGVCcnVzaChmaWxsX2FyZ2IpOwotICAgICAgICBDYWxsRnVuYyhHZGlwU2V0UGF0aEZpbGxNb2RlKShwR3BQYXRoLCBHZGlGaWxsVHlwZTJHZGlwKG5ld19maWxsX21vZGUpKTsKLSAgICAgICAgQ2FsbEZ1bmMoR2RpcEZpbGxQYXRoKShwR3JhcGhpY3MsIHBCcnVzaCwgcEdwUGF0aCk7Ci0gICAgICAgIENhbGxGdW5jKEdkaXBEZWxldGVCcnVzaCkocEJydXNoKTsKLSAgICB9Ci0gICAgaWYgKHBHcmFwaFN0YXRlICYmIHN0cm9rZV9hcmdiKSB7Ci0gICAgICAgIEdwUGVuKiBwUGVuID0gX0dkaXBDcmVhdGVQZW4ocEdyYXBoU3RhdGUsIHBPYmplY3QyRGV2aWNlLCBzdHJva2VfYXJnYiwgZmlsbF9tb2RlICYgRlhfU1RST0tFX1RFWFRfTU9ERSk7Ci0gICAgICAgIGlmIChuU3ViUGF0aGVzID09IDEpIHsKLSAgICAgICAgICAgIENhbGxGdW5jKEdkaXBEcmF3UGF0aCkocEdyYXBoaWNzLCBwUGVuLCBwR3BQYXRoKTsKKyAgICAgICAgb25fcGhhc2UgKz0gMTsKKyAgICAgIH0KKyAgICAgIGlmIChvbl9waGFzZSA9PSAwIHx8IG9mZl9waGFzZSA9PSAwKSB7CisgICAgICAgIGlmIChuQ291bnQgPT0gMCkgeworICAgICAgICAgIG9uX2xlZnRvdmVyICs9IG9uX3BoYXNlOworICAgICAgICAgIG9mZl9sZWZ0b3ZlciArPSBvZmZfcGhhc2U7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgaVN0YXJ0ID0gMDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgblBvaW50czsgaSArKykgewotICAgICAgICAgICAgICAgIGlmIChpID09IG5Qb2ludHMgLSAxIHx8IHR5cGVzW2kgKyAxXSA9PSBQYXRoUG9pbnRUeXBlU3RhcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgR3BQYXRoKiBwU3ViUGF0aDsKLSAgICAgICAgICAgICAgICAgICAgQ2FsbEZ1bmMoR2RpcENyZWF0ZVBhdGgyKShwb2ludHMgKyBpU3RhcnQsIHR5cGVzICsgaVN0YXJ0LCBpIC0gaVN0YXJ0ICsgMSwgR2RpRmlsbFR5cGUyR2RpcChuZXdfZmlsbF9tb2RlKSwgJnBTdWJQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgaVN0YXJ0ID0gaSArIDE7Ci0gICAgICAgICAgICAgICAgICAgIENhbGxGdW5jKEdkaXBEcmF3UGF0aCkocEdyYXBoaWNzLCBwUGVuLCBwU3ViUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgIENhbGxGdW5jKEdkaXBEZWxldGVQYXRoKShwU3ViUGF0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgIHBEYXNoQXJyYXlbbkNvdW50IC0gMl0gKz0gb25fcGhhc2U7CisgICAgICAgICAgcERhc2hBcnJheVtuQ291bnQgLSAxXSArPSBvZmZfcGhhc2U7CiAgICAgICAgIH0KLSAgICAgICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZVBlbikocFBlbik7CisgICAgICB9IGVsc2UgeworICAgICAgICBwRGFzaEFycmF5W25Db3VudCsrXSA9IG9uX3BoYXNlICsgb25fbGVmdG92ZXI7CisgICAgICAgIG9uX2xlZnRvdmVyID0gMDsKKyAgICAgICAgcERhc2hBcnJheVtuQ291bnQrK10gPSBvZmZfcGhhc2UgKyBvZmZfbGVmdG92ZXI7CisgICAgICAgIG9mZl9sZWZ0b3ZlciA9IDA7CisgICAgICB9CiAgICAgfQorICAgIENhbGxGdW5jKEdkaXBTZXRQZW5EYXNoQXJyYXkpKHBQZW4sIHBEYXNoQXJyYXksIG5Db3VudCk7CisgICAgRlhfRkxPQVQgcGhhc2UgPSBwR3JhcGhTdGF0ZS0+bV9EYXNoUGhhc2U7CisgICAgaWYgKGJEYXNoRXh0ZW5kKSB7CisgICAgICBpZiAocGhhc2UgPCAwLjVmKSB7CisgICAgICAgIHBoYXNlID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBoYXNlIC09IDAuNWY7CisgICAgICB9CisgICAgfQorICAgIENhbGxGdW5jKEdkaXBTZXRQZW5EYXNoT2Zmc2V0KShwUGVuLCBwaGFzZSk7CisgICAgRlhfRnJlZShwRGFzaEFycmF5KTsKKyAgICBwRGFzaEFycmF5ID0gTlVMTDsKKyAgfQorICBDYWxsRnVuYyhHZGlwU2V0UGVuTWl0ZXJMaW1pdCkocFBlbiwgcEdyYXBoU3RhdGUtPm1fTWl0ZXJMaW1pdCk7CisgIHJldHVybiBwUGVuOworfQorc3RhdGljIEZYX0JPT0wgSXNTbWFsbFRyaWFuZ2xlKFBvaW50RiogcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHYyKSB7CisgIGludCBwYWlyc1tdID0gezEsIDIsIDAsIDIsIDAsIDF9OworICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgIGludCBwYWlyMSA9IHBhaXJzW2kgKiAyXTsKKyAgICBpbnQgcGFpcjIgPSBwYWlyc1tpICogMiArIDFdOworICAgIEZYX0ZMT0FUIHgxID0gcG9pbnRzW3BhaXIxXS5YLCB4MiA9IHBvaW50c1twYWlyMl0uWDsKKyAgICBGWF9GTE9BVCB5MSA9IHBvaW50c1twYWlyMV0uWSwgeTIgPSBwb2ludHNbcGFpcjJdLlk7CiAgICAgaWYgKHBNYXRyaXgpIHsKLSAgICAgICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZU1hdHJpeCkocE1hdHJpeCk7CisgICAgICBwTWF0cml4LT5UcmFuc2Zvcm0oeDEsIHkxKTsKKyAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybSh4MiwgeTIpOworICAgIH0KKyAgICBGWF9GTE9BVCBkeCA9IHgxIC0geDI7CisgICAgRlhfRkxPQVQgZHkgPSB5MSAtIHkyOworICAgIEZYX0ZMT0FUIGRpc3RhbmNlX3NxdWFyZSA9IEZYU1lTX011bChkeCwgZHgpICsgRlhTWVNfTXVsKGR5LCBkeSk7CisgICAgaWYgKGRpc3RhbmNlX3NxdWFyZSA8ICgxLjBmICogMiArIDEuMGYgLyA0KSkgeworICAgICAgdjEgPSBpOworICAgICAgdjIgPSBwYWlyMTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIENHZGlwbHVzRXh0OjpEcmF3UGF0aChIREMgaERDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2FyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzdHJva2VfYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUpIHsKKyAgaW50IG5Qb2ludHMgPSBwUGF0aERhdGEtPkdldFBvaW50Q291bnQoKTsKKyAgaWYgKG5Qb2ludHMgPT0gMCkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIEZYX1BBVEhQT0lOVCogcFBvaW50cyA9IHBQYXRoRGF0YS0+R2V0UG9pbnRzKCk7CisgIEdwR3JhcGhpY3MqIHBHcmFwaGljcyA9IE5VTEw7CisgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KKyAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OworICBDYWxsRnVuYyhHZGlwQ3JlYXRlRnJvbUhEQykoaERDLCAmcEdyYXBoaWNzKTsKKyAgQ2FsbEZ1bmMoR2RpcFNldFBhZ2VVbml0KShwR3JhcGhpY3MsIFVuaXRQaXhlbCk7CisgIENhbGxGdW5jKEdkaXBTZXRQaXhlbE9mZnNldE1vZGUpKHBHcmFwaGljcywgUGl4ZWxPZmZzZXRNb2RlSGFsZik7CisgIEdwTWF0cml4KiBwTWF0cml4ID0gTlVMTDsKKyAgaWYgKHBPYmplY3QyRGV2aWNlKSB7CisgICAgQ2FsbEZ1bmMoR2RpcENyZWF0ZU1hdHJpeDIpKHBPYmplY3QyRGV2aWNlLT5hLCBwT2JqZWN0MkRldmljZS0+YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9iamVjdDJEZXZpY2UtPmMsIHBPYmplY3QyRGV2aWNlLT5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0MkRldmljZS0+ZSwgcE9iamVjdDJEZXZpY2UtPmYsICZwTWF0cml4KTsKKyAgICBDYWxsRnVuYyhHZGlwU2V0V29ybGRUcmFuc2Zvcm0pKHBHcmFwaGljcywgcE1hdHJpeCk7CisgIH0KKyAgUG9pbnRGKiBwb2ludHMgPSBGWF9BbGxvYyhQb2ludEYsIG5Qb2ludHMpOworICBCWVRFKiB0eXBlcyA9IEZYX0FsbG9jKEJZVEUsIG5Qb2ludHMpOworICBpbnQgblN1YlBhdGhlcyA9IDA7CisgIEZYX0JPT0wgYlN1YkNsb3NlID0gRkFMU0U7CisgIGludCBwb3Nfc3ViY2xvc2UgPSAwOworICBGWF9CT09MIGJTbW9vdGggPSBGQUxTRTsKKyAgaW50IHN0YXJ0cG9pbnQgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IG5Qb2ludHM7IGkrKykgeworICAgIHBvaW50c1tpXS5YID0gcFBvaW50c1tpXS5tX1BvaW50WDsKKyAgICBwb2ludHNbaV0uWSA9IHBQb2ludHNbaV0ubV9Qb2ludFk7CisgICAgRlhfRkxPQVQgeCwgeTsKKyAgICBpZiAocE9iamVjdDJEZXZpY2UpIHsKKyAgICAgIHBPYmplY3QyRGV2aWNlLT5UcmFuc2Zvcm0ocFBvaW50c1tpXS5tX1BvaW50WCwgcFBvaW50c1tpXS5tX1BvaW50WSwgeCwgeSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHggPSBwUG9pbnRzW2ldLm1fUG9pbnRYOworICAgICAgeSA9IHBQb2ludHNbaV0ubV9Qb2ludFk7CisgICAgfQorICAgIGlmICh4ID4gNTAwMDAgKiAxLjBmKSB7CisgICAgICBwb2ludHNbaV0uWCA9IDUwMDAwICogMS4wZjsKKyAgICB9CisgICAgaWYgKHggPCAtNTAwMDAgKiAxLjBmKSB7CisgICAgICBwb2ludHNbaV0uWCA9IC01MDAwMCAqIDEuMGY7CisgICAgfQorICAgIGlmICh5ID4gNTAwMDAgKiAxLjBmKSB7CisgICAgICBwb2ludHNbaV0uWSA9IDUwMDAwICogMS4wZjsKKyAgICB9CisgICAgaWYgKHkgPCAtNTAwMDAgKiAxLjBmKSB7CisgICAgICBwb2ludHNbaV0uWSA9IC01MDAwMCAqIDEuMGY7CisgICAgfQorICAgIGludCBwb2ludF90eXBlID0gcFBvaW50c1tpXS5tX0ZsYWcgJiBGWFBUX1RZUEU7CisgICAgaWYgKHBvaW50X3R5cGUgPT0gRlhQVF9NT1ZFVE8pIHsKKyAgICAgIHR5cGVzW2ldID0gUGF0aFBvaW50VHlwZVN0YXJ0OworICAgICAgblN1YlBhdGhlcysrOworICAgICAgYlN1YkNsb3NlID0gRkFMU0U7CisgICAgICBzdGFydHBvaW50ID0gaTsKKyAgICB9IGVsc2UgaWYgKHBvaW50X3R5cGUgPT0gRlhQVF9MSU5FVE8pIHsKKyAgICAgIHR5cGVzW2ldID0gUGF0aFBvaW50VHlwZUxpbmU7CisgICAgICBpZiAocFBvaW50c1tpIC0gMV0ubV9GbGFnID09IEZYUFRfTU9WRVRPICYmCisgICAgICAgICAgKGkgPT0gblBvaW50cyAtIDEgfHwgcFBvaW50c1tpICsgMV0ubV9GbGFnID09IEZYUFRfTU9WRVRPKSAmJgorICAgICAgICAgIHBvaW50c1tpXS5ZID09IHBvaW50c1tpIC0gMV0uWSAmJiBwb2ludHNbaV0uWCA9PSBwb2ludHNbaSAtIDFdLlgpIHsKKyAgICAgICAgcG9pbnRzW2ldLlggKz0gMC4wMWY7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKCFiU21vb3RoICYmIHBvaW50c1tpXS5YICE9IHBvaW50c1tpIC0gMV0uWCAmJgorICAgICAgICAgIHBvaW50c1tpXS5ZICE9IHBvaW50c1tpIC0gMV0uWSkgeworICAgICAgICBiU21vb3RoID0gVFJVRTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHBvaW50X3R5cGUgPT0gRlhQVF9CRVpJRVJUTykgeworICAgICAgdHlwZXNbaV0gPSBQYXRoUG9pbnRUeXBlQmV6aWVyOworICAgICAgYlNtb290aCA9IFRSVUU7CisgICAgfQorICAgIGlmIChwUG9pbnRzW2ldLm1fRmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpIHsKKyAgICAgIGlmIChiU3ViQ2xvc2UpIHsKKyAgICAgICAgdHlwZXNbcG9zX3N1YmNsb3NlXSAmPSB+UGF0aFBvaW50VHlwZUNsb3NlU3VicGF0aDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJTdWJDbG9zZSA9IFRSVUU7CisgICAgICB9CisgICAgICBwb3Nfc3ViY2xvc2UgPSBpOworICAgICAgdHlwZXNbaV0gfD0gUGF0aFBvaW50VHlwZUNsb3NlU3VicGF0aDsKKyAgICAgIGlmICghYlNtb290aCAmJiBwb2ludHNbaV0uWCAhPSBwb2ludHNbc3RhcnRwb2ludF0uWCAmJgorICAgICAgICAgIHBvaW50c1tpXS5ZICE9IHBvaW50c1tzdGFydHBvaW50XS5ZKSB7CisgICAgICAgIGJTbW9vdGggPSBUUlVFOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoZmlsbF9tb2RlICYgRlhGSUxMX05PUEFUSFNNT09USCkgeworICAgIGJTbW9vdGggPSBGQUxTRTsKKyAgICBDYWxsRnVuYyhHZGlwU2V0U21vb3RoaW5nTW9kZSkocEdyYXBoaWNzLCBTbW9vdGhpbmdNb2RlTm9uZSk7CisgIH0gZWxzZSBpZiAoIShmaWxsX21vZGUgJiBGWEZJTExfRlVMTENPVkVSKSkgeworICAgIGlmICghYlNtb290aCAmJiAoZmlsbF9tb2RlICYgMykpIHsKKyAgICAgIGJTbW9vdGggPSBUUlVFOworICAgIH0KKyAgICBpZiAoYlNtb290aCB8fCAocEdyYXBoU3RhdGUgJiYgcEdyYXBoU3RhdGUtPm1fTGluZVdpZHRoID4gMikpIHsKKyAgICAgIENhbGxGdW5jKEdkaXBTZXRTbW9vdGhpbmdNb2RlKShwR3JhcGhpY3MsIFNtb290aGluZ01vZGVBbnRpQWxpYXMpOworICAgIH0KKyAgfQorICBpbnQgbmV3X2ZpbGxfbW9kZSA9IGZpbGxfbW9kZSAmIDM7CisgIGlmIChuUG9pbnRzID09IDQgJiYgIXBHcmFwaFN0YXRlKSB7CisgICAgaW50IHYxLCB2MjsKKyAgICBpZiAoSXNTbWFsbFRyaWFuZ2xlKHBvaW50cywgcE9iamVjdDJEZXZpY2UsIHYxLCB2MikpIHsKKyAgICAgIEdwUGVuKiBwUGVuID0gTlVMTDsKKyAgICAgIENhbGxGdW5jKEdkaXBDcmVhdGVQZW4xKShmaWxsX2FyZ2IsIDEuMGYsIFVuaXRQaXhlbCwgJnBQZW4pOworICAgICAgQ2FsbEZ1bmMoR2RpcERyYXdMaW5lSSkoCisgICAgICAgICAgcEdyYXBoaWNzLCBwUGVuLCBGWFNZU19yb3VuZChwb2ludHNbdjFdLlgpLCBGWFNZU19yb3VuZChwb2ludHNbdjFdLlkpLAorICAgICAgICAgIEZYU1lTX3JvdW5kKHBvaW50c1t2Ml0uWCksIEZYU1lTX3JvdW5kKHBvaW50c1t2Ml0uWSkpOworICAgICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZVBlbikocFBlbik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgR3BQYXRoKiBwR3BQYXRoID0gTlVMTDsKKyAgQ2FsbEZ1bmMoR2RpcENyZWF0ZVBhdGgyKShwb2ludHMsIHR5cGVzLCBuUG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdkaUZpbGxUeXBlMkdkaXAobmV3X2ZpbGxfbW9kZSksICZwR3BQYXRoKTsKKyAgaWYgKCFwR3BQYXRoKSB7CisgICAgaWYgKHBNYXRyaXgpIHsKKyAgICAgIENhbGxGdW5jKEdkaXBEZWxldGVNYXRyaXgpKHBNYXRyaXgpOwogICAgIH0KICAgICBGWF9GcmVlKHBvaW50cyk7CiAgICAgRlhfRnJlZSh0eXBlcyk7Ci0gICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZVBhdGgpKHBHcFBhdGgpOwogICAgIENhbGxGdW5jKEdkaXBEZWxldGVHcmFwaGljcykocEdyYXBoaWNzKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKG5ld19maWxsX21vZGUpIHsKKyAgICBHcEJydXNoKiBwQnJ1c2ggPSBfR2RpcENyZWF0ZUJydXNoKGZpbGxfYXJnYik7CisgICAgQ2FsbEZ1bmMoR2RpcFNldFBhdGhGaWxsTW9kZSkocEdwUGF0aCwgR2RpRmlsbFR5cGUyR2RpcChuZXdfZmlsbF9tb2RlKSk7CisgICAgQ2FsbEZ1bmMoR2RpcEZpbGxQYXRoKShwR3JhcGhpY3MsIHBCcnVzaCwgcEdwUGF0aCk7CisgICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZUJydXNoKShwQnJ1c2gpOworICB9CisgIGlmIChwR3JhcGhTdGF0ZSAmJiBzdHJva2VfYXJnYikgeworICAgIEdwUGVuKiBwUGVuID0gX0dkaXBDcmVhdGVQZW4ocEdyYXBoU3RhdGUsIHBPYmplY3QyRGV2aWNlLCBzdHJva2VfYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfbW9kZSAmIEZYX1NUUk9LRV9URVhUX01PREUpOworICAgIGlmIChuU3ViUGF0aGVzID09IDEpIHsKKyAgICAgIENhbGxGdW5jKEdkaXBEcmF3UGF0aCkocEdyYXBoaWNzLCBwUGVuLCBwR3BQYXRoKTsKKyAgICB9IGVsc2UgeworICAgICAgaW50IGlTdGFydCA9IDA7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Qb2ludHM7IGkrKykgeworICAgICAgICBpZiAoaSA9PSBuUG9pbnRzIC0gMSB8fCB0eXBlc1tpICsgMV0gPT0gUGF0aFBvaW50VHlwZVN0YXJ0KSB7CisgICAgICAgICAgR3BQYXRoKiBwU3ViUGF0aDsKKyAgICAgICAgICBDYWxsRnVuYyhHZGlwQ3JlYXRlUGF0aDIpKHBvaW50cyArIGlTdGFydCwgdHlwZXMgKyBpU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpIC0gaVN0YXJ0ICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdkaUZpbGxUeXBlMkdkaXAobmV3X2ZpbGxfbW9kZSksICZwU3ViUGF0aCk7CisgICAgICAgICAgaVN0YXJ0ID0gaSArIDE7CisgICAgICAgICAgQ2FsbEZ1bmMoR2RpcERyYXdQYXRoKShwR3JhcGhpY3MsIHBQZW4sIHBTdWJQYXRoKTsKKyAgICAgICAgICBDYWxsRnVuYyhHZGlwRGVsZXRlUGF0aCkocFN1YlBhdGgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIENhbGxGdW5jKEdkaXBEZWxldGVQZW4pKHBQZW4pOworICB9CisgIGlmIChwTWF0cml4KSB7CisgICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZU1hdHJpeCkocE1hdHJpeCk7CisgIH0KKyAgRlhfRnJlZShwb2ludHMpOworICBGWF9GcmVlKHR5cGVzKTsKKyAgQ2FsbEZ1bmMoR2RpcERlbGV0ZVBhdGgpKHBHcFBhdGgpOworICBDYWxsRnVuYyhHZGlwRGVsZXRlR3JhcGhpY3MpKHBHcmFwaGljcyk7CisgIHJldHVybiBUUlVFOwogfQotY2xhc3MgR3BTdHJlYW0gRlhfRklOQUwgOiBwdWJsaWMgSVN0cmVhbQotewotICAgIExPTkcJbV9SZWZDb3VudDsKLSAgICBpbnQgICAgIG1fUmVhZFBvczsKLSAgICBDRlhfQnl0ZVRleHRCdWYJbV9JbnRlclN0cmVhbTsKLXB1YmxpYzoKLSAgICBHcFN0cmVhbSgpCi0gICAgewotICAgICAgICBtX1JlZkNvdW50ID0gMTsKLSAgICAgICAgbV9SZWFkUG9zID0gMDsKK2NsYXNzIEdwU3RyZWFtIGZpbmFsIDogcHVibGljIElTdHJlYW0geworICBMT05HIG1fUmVmQ291bnQ7CisgIGludCBtX1JlYWRQb3M7CisgIENGWF9CeXRlVGV4dEJ1ZiBtX0ludGVyU3RyZWFtOworCisgcHVibGljOgorICBHcFN0cmVhbSgpIHsKKyAgICBtX1JlZkNvdW50ID0gMTsKKyAgICBtX1JlYWRQb3MgPSAwOworICB9CisgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBRdWVyeUludGVyZmFjZShSRUZJSUQgaWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIHBwdk9iamVjdCkgeworICAgIGlmIChpaWQgPT0gX191dWlkb2YoSVVua25vd24pIHx8IGlpZCA9PSBfX3V1aWRvZihJU3RyZWFtKSB8fAorICAgICAgICBpaWQgPT0gX191dWlkb2YoSVNlcXVlbnRpYWxTdHJlYW0pKSB7CisgICAgICAqcHB2T2JqZWN0ID0gc3RhdGljX2Nhc3Q8SVN0cmVhbSo+KHRoaXMpOworICAgICAgQWRkUmVmKCk7CisgICAgICByZXR1cm4gU19PSzsKICAgICB9Ci0gICAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFCi0gICAgUXVlcnlJbnRlcmZhY2UoUkVGSUlEIGlpZCwgdm9pZCAqKiBwcHZPYmplY3QpCi0gICAgewotICAgICAgICBpZiAoaWlkID09IF9fdXVpZG9mKElVbmtub3duKSB8fCBpaWQgPT0gX191dWlkb2YoSVN0cmVhbSkgfHwKLSAgICAgICAgICAgICAgICBpaWQgPT0gX191dWlkb2YoSVNlcXVlbnRpYWxTdHJlYW0pKQl7Ci0gICAgICAgICAgICAqcHB2T2JqZWN0ID0gc3RhdGljX2Nhc3Q8SVN0cmVhbSo+KHRoaXMpOwotICAgICAgICAgICAgQWRkUmVmKCk7Ci0gICAgICAgICAgICByZXR1cm4gU19PSzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBFX05PSU5URVJGQUNFOwotICAgICAgICB9CisgICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7CisgIH0KKyAgdmlydHVhbCBVTE9ORyBTVERNRVRIT0RDQUxMVFlQRSBBZGRSZWYodm9pZCkgeworICAgIHJldHVybiAoVUxPTkcpSW50ZXJsb2NrZWRJbmNyZW1lbnQoJm1fUmVmQ291bnQpOworICB9CisgIHZpcnR1YWwgVUxPTkcgU1RETUVUSE9EQ0FMTFRZUEUgUmVsZWFzZSh2b2lkKSB7CisgICAgVUxPTkcgcmVzID0gKFVMT05HKUludGVybG9ja2VkRGVjcmVtZW50KCZtX1JlZkNvdW50KTsKKyAgICBpZiAocmVzID09IDApIHsKKyAgICAgIGRlbGV0ZSB0aGlzOwogICAgIH0KLSAgICB2aXJ0dWFsIFVMT05HIFNURE1FVEhPRENBTExUWVBFIEFkZFJlZih2b2lkKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChVTE9ORylJbnRlcmxvY2tlZEluY3JlbWVudCgmbV9SZWZDb3VudCk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorCisgcHVibGljOgorICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgUmVhZCh2b2lkKiBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HIGNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyogcGNiUmVhZCkgeworICAgIHNpemVfdCBieXRlc19sZWZ0OworICAgIHNpemVfdCBieXRlc19vdXQ7CisgICAgaWYgKHBjYlJlYWQpIHsKKyAgICAgICpwY2JSZWFkID0gMDsKICAgICB9Ci0gICAgdmlydHVhbCBVTE9ORyBTVERNRVRIT0RDQUxMVFlQRSBSZWxlYXNlKHZvaWQpCi0gICAgewotICAgICAgICBVTE9ORyByZXMgPSAoVUxPTkcpIEludGVybG9ja2VkRGVjcmVtZW50KCZtX1JlZkNvdW50KTsKLSAgICAgICAgaWYgKHJlcyA9PSAwKSB7Ci0gICAgICAgICAgICBkZWxldGUgdGhpczsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzOworICAgIGlmIChtX1JlYWRQb3MgPT0gbV9JbnRlclN0cmVhbS5HZXRMZW5ndGgoKSkgeworICAgICAgcmV0dXJuIEhSRVNVTFRfRlJPTV9XSU4zMihFUlJPUl9FTkRfT0ZfTUVESUEpOwogICAgIH0KLXB1YmxpYzoKLSAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgUmVhZCh2b2lkKiBPdXRwdXQsIFVMT05HIGNiLCBVTE9ORyogcGNiUmVhZCkKLSAgICB7Ci0gICAgICAgIHNpemVfdAlieXRlc19sZWZ0OwotICAgICAgICBzaXplX3QJYnl0ZXNfb3V0OwotICAgICAgICBpZiAocGNiUmVhZCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAqcGNiUmVhZCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fUmVhZFBvcyA9PSBtX0ludGVyU3RyZWFtLkdldExlbmd0aCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSFJFU1VMVF9GUk9NX1dJTjMyKEVSUk9SX0VORF9PRl9NRURJQSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZXNfbGVmdCA9IG1fSW50ZXJTdHJlYW0uR2V0TGVuZ3RoKCkgLSBtX1JlYWRQb3M7Ci0gICAgICAgIGJ5dGVzX291dCA9IEZYX01JTihjYiwgYnl0ZXNfbGVmdCk7Ci0gICAgICAgIEZYU1lTX21lbWNweTMyKE91dHB1dCwgbV9JbnRlclN0cmVhbS5HZXRCdWZmZXIoKSArIG1fUmVhZFBvcywgYnl0ZXNfb3V0KTsKLSAgICAgICAgbV9SZWFkUG9zICs9IChGWF9JTlQzMilieXRlc19vdXQ7Ci0gICAgICAgIGlmIChwY2JSZWFkICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpwY2JSZWFkID0gKFVMT05HKWJ5dGVzX291dDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gU19PSzsKKyAgICBieXRlc19sZWZ0ID0gbV9JbnRlclN0cmVhbS5HZXRMZW5ndGgoKSAtIG1fUmVhZFBvczsKKyAgICBieXRlc19vdXQgPSBGWF9NSU4oY2IsIGJ5dGVzX2xlZnQpOworICAgIEZYU1lTX21lbWNweShPdXRwdXQsIG1fSW50ZXJTdHJlYW0uR2V0QnVmZmVyKCkgKyBtX1JlYWRQb3MsIGJ5dGVzX291dCk7CisgICAgbV9SZWFkUG9zICs9IChpbnQzMl90KWJ5dGVzX291dDsKKyAgICBpZiAocGNiUmVhZCkgeworICAgICAgKnBjYlJlYWQgPSAoVUxPTkcpYnl0ZXNfb3V0OwogICAgIH0KLSAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgV3JpdGUodm9pZCBjb25zdCogSW5wdXQsIFVMT05HIGNiLCBVTE9ORyogcGNiV3JpdHRlbikKLSAgICB7Ci0gICAgICAgIGlmIChjYiA8PSAwKSB7Ci0gICAgICAgICAgICBpZiAocGNiV3JpdHRlbiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgKnBjYldyaXR0ZW4gPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFNfT0s7Ci0gICAgICAgIH0KLSAgICAgICAgbV9JbnRlclN0cmVhbS5JbnNlcnRCbG9jayhtX0ludGVyU3RyZWFtLkdldExlbmd0aCgpLCBJbnB1dCwgY2IpOwotICAgICAgICBpZiAocGNiV3JpdHRlbiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAqcGNiV3JpdHRlbiA9IGNiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBTX09LOworICAgIHJldHVybiBTX09LOworICB9CisgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBXcml0ZSh2b2lkIGNvbnN0KiBJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HIGNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcqIHBjYldyaXR0ZW4pIHsKKyAgICBpZiAoY2IgPD0gMCkgeworICAgICAgaWYgKHBjYldyaXR0ZW4pIHsKKyAgICAgICAgKnBjYldyaXR0ZW4gPSAwOworICAgICAgfQorICAgICAgcmV0dXJuIFNfT0s7CiAgICAgfQotcHVibGljOgotICAgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBTZXRTaXplKFVMQVJHRV9JTlRFR0VSKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEVfTk9USU1QTDsKKyAgICBtX0ludGVyU3RyZWFtLkluc2VydEJsb2NrKG1fSW50ZXJTdHJlYW0uR2V0TGVuZ3RoKCksIElucHV0LCBjYik7CisgICAgaWYgKHBjYldyaXR0ZW4pIHsKKyAgICAgICpwY2JXcml0dGVuID0gY2I7CiAgICAgfQotICAgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBDb3B5VG8oSVN0cmVhbSosIFVMQVJHRV9JTlRFR0VSLCBVTEFSR0VfSU5URUdFUiosIFVMQVJHRV9JTlRFR0VSKikKLSAgICB7Ci0gICAgICAgIHJldHVybiBFX05PVElNUEw7CisgICAgcmV0dXJuIFNfT0s7CisgIH0KKworIHB1YmxpYzoKKyAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIFNldFNpemUoVUxBUkdFX0lOVEVHRVIpIHsKKyAgICByZXR1cm4gRV9OT1RJTVBMOworICB9CisgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBDb3B5VG8oSVN0cmVhbSosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxBUkdFX0lOVEVHRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxBUkdFX0lOVEVHRVIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMQVJHRV9JTlRFR0VSKikgeworICAgIHJldHVybiBFX05PVElNUEw7CisgIH0KKyAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIENvbW1pdChEV09SRCkgeyByZXR1cm4gRV9OT1RJTVBMOyB9CisgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBSZXZlcnQodm9pZCkgeyByZXR1cm4gRV9OT1RJTVBMOyB9CisgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBMb2NrUmVnaW9uKFVMQVJHRV9JTlRFR0VSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTEFSR0VfSU5URUdFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQpIHsKKyAgICByZXR1cm4gRV9OT1RJTVBMOworICB9CisgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBVbmxvY2tSZWdpb24oVUxBUkdFX0lOVEVHRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxBUkdFX0lOVEVHRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQpIHsKKyAgICByZXR1cm4gRV9OT1RJTVBMOworICB9CisgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBDbG9uZShJU3RyZWFtKiopIHsgcmV0dXJuIEVfTk9USU1QTDsgfQorICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgU2VlayhMQVJHRV9JTlRFR0VSIGxpRGlzdGFuY2VUb01vdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3T3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTEFSR0VfSU5URUdFUiogbHBOZXdGaWxlUG9pbnRlcikgeworICAgIGxvbmcgc3RhcnQgPSAwOworICAgIGxvbmcgbmV3X3JlYWRfcG9zaXRpb247CisgICAgc3dpdGNoIChkd09yaWdpbikgeworICAgICAgY2FzZSBTVFJFQU1fU0VFS19TRVQ6CisgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNUUkVBTV9TRUVLX0NVUjoKKyAgICAgICAgc3RhcnQgPSBtX1JlYWRQb3M7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTVFJFQU1fU0VFS19FTkQ6CisgICAgICAgIHN0YXJ0ID0gbV9JbnRlclN0cmVhbS5HZXRMZW5ndGgoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gU1RHX0VfSU5WQUxJREZVTkNUSU9OOworICAgICAgICBicmVhazsKICAgICB9Ci0gICAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIENvbW1pdChEV09SRCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFX05PVElNUEw7CisgICAgbmV3X3JlYWRfcG9zaXRpb24gPSBzdGFydCArIChsb25nKWxpRGlzdGFuY2VUb01vdmUuUXVhZFBhcnQ7CisgICAgaWYgKG5ld19yZWFkX3Bvc2l0aW9uIDwgMCB8fAorICAgICAgICBuZXdfcmVhZF9wb3NpdGlvbiA+IG1fSW50ZXJTdHJlYW0uR2V0TGVuZ3RoKCkpIHsKKyAgICAgIHJldHVybiBTVEdfRV9TRUVLRVJST1I7CiAgICAgfQotICAgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBSZXZlcnQodm9pZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFX05PVElNUEw7CisgICAgbV9SZWFkUG9zID0gbmV3X3JlYWRfcG9zaXRpb247CisgICAgaWYgKGxwTmV3RmlsZVBvaW50ZXIpIHsKKyAgICAgIGxwTmV3RmlsZVBvaW50ZXItPlF1YWRQYXJ0ID0gbV9SZWFkUG9zOwogICAgIH0KLSAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgTG9ja1JlZ2lvbihVTEFSR0VfSU5URUdFUiwgVUxBUkdFX0lOVEVHRVIsIERXT1JEKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEVfTk9USU1QTDsKKyAgICByZXR1cm4gU19PSzsKKyAgfQorICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgU3RhdChTVEFUU1RHKiBwU3RhdHN0ZywgRFdPUkQgZ3JmU3RhdEZsYWcpIHsKKyAgICBpZiAoIXBTdGF0c3RnKSB7CisgICAgICByZXR1cm4gU1RHX0VfSU5WQUxJREZVTkNUSU9OOwogICAgIH0KLSAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgVW5sb2NrUmVnaW9uKFVMQVJHRV9JTlRFR0VSLCBVTEFSR0VfSU5URUdFUiwgRFdPUkQpCi0gICAgewotICAgICAgICByZXR1cm4gRV9OT1RJTVBMOwotICAgIH0KLSAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgQ2xvbmUoSVN0cmVhbSAqKikKLSAgICB7Ci0gICAgICAgIHJldHVybiBFX05PVElNUEw7Ci0gICAgfQotICAgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBTZWVrKExBUkdFX0lOVEVHRVIgbGlEaXN0YW5jZVRvTW92ZSwgRFdPUkQgZHdPcmlnaW4sIFVMQVJHRV9JTlRFR0VSKiBscE5ld0ZpbGVQb2ludGVyKQotICAgIHsKLSAgICAgICAgbG9uZwlzdGFydCA9IDA7Ci0gICAgICAgIGxvbmcJbmV3X3JlYWRfcG9zaXRpb247Ci0gICAgICAgIHN3aXRjaChkd09yaWdpbikgewotICAgICAgICAgICAgY2FzZSBTVFJFQU1fU0VFS19TRVQ6Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTVFJFQU1fU0VFS19DVVI6Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBtX1JlYWRQb3M7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNUUkVBTV9TRUVLX0VORDoKLSAgICAgICAgICAgICAgICBzdGFydCA9IG1fSW50ZXJTdHJlYW0uR2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBTVEdfRV9JTlZBTElERlVOQ1RJT047Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbmV3X3JlYWRfcG9zaXRpb24gPSBzdGFydCArIChsb25nKWxpRGlzdGFuY2VUb01vdmUuUXVhZFBhcnQ7Ci0gICAgICAgIGlmIChuZXdfcmVhZF9wb3NpdGlvbiA8IDAgfHwgbmV3X3JlYWRfcG9zaXRpb24gPiBtX0ludGVyU3RyZWFtLkdldExlbmd0aCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gU1RHX0VfU0VFS0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIG1fUmVhZFBvcyA9IG5ld19yZWFkX3Bvc2l0aW9uOwotICAgICAgICBpZiAobHBOZXdGaWxlUG9pbnRlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBscE5ld0ZpbGVQb2ludGVyLT5RdWFkUGFydCA9IG1fUmVhZFBvczsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gU19PSzsKLSAgICB9Ci0gICAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIFN0YXQoU1RBVFNURyogcFN0YXRzdGcsIERXT1JEIGdyZlN0YXRGbGFnKQotICAgIHsKLSAgICAgICAgaWYgKHBTdGF0c3RnID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBTVEdfRV9JTlZBTElERlVOQ1RJT047Ci0gICAgICAgIH0KLSAgICAgICAgWmVyb01lbW9yeShwU3RhdHN0Zywgc2l6ZW9mKFNUQVRTVEcpKTsKLSAgICAgICAgcFN0YXRzdGctPmNiU2l6ZS5RdWFkUGFydCA9IG1fSW50ZXJTdHJlYW0uR2V0TGVuZ3RoKCk7Ci0gICAgICAgIHJldHVybiBTX09LOwotICAgIH0KKyAgICBaZXJvTWVtb3J5KHBTdGF0c3RnLCBzaXplb2YoU1RBVFNURykpOworICAgIHBTdGF0c3RnLT5jYlNpemUuUXVhZFBhcnQgPSBtX0ludGVyU3RyZWFtLkdldExlbmd0aCgpOworICAgIHJldHVybiBTX09LOworICB9CiB9OwogdHlwZWRlZiBzdHJ1Y3QgewotICAgIEJJVE1BUElORk8qCQlwYm1pOwotICAgIGludAkJCQlTdHJpZGU7Ci0gICAgTFBCWVRFCQkJcFNjYW4wOwotICAgIEdwQml0bWFwKgkJcEJpdG1hcDsKLSAgICBCaXRtYXBEYXRhKgkJcEJpdG1hcERhdGE7Ci0gICAgR3BTdHJlYW0qICAgICAgIHBTdHJlYW07CisgIEJJVE1BUElORk8qIHBibWk7CisgIGludCBTdHJpZGU7CisgIExQQllURSBwU2NhbjA7CisgIEdwQml0bWFwKiBwQml0bWFwOworICBCaXRtYXBEYXRhKiBwQml0bWFwRGF0YTsKKyAgR3BTdHJlYW0qIHBTdHJlYW07CiB9IFBSRVZJRVczX0RJQklUTUFQOwotc3RhdGljIFBSRVZJRVczX0RJQklUTUFQKiBMb2FkRElCaXRtYXAoV0lORElCX09wZW5fQXJnc18gYXJncykKLXsKLSAgICBHcEJpdG1hcCogcEJpdG1hcDsKLSAgICBHcFN0cmVhbSogcFN0cmVhbSA9IE5VTEw7Ci0gICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPSAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKLSAgICBTdGF0dXMgc3RhdHVzID0gT2s7Ci0gICAgaWYgKGFyZ3MuZmxhZ3MgPT0gV0lORElCX09QRU5fUEFUSE5BTUUpIHsKLSAgICAgICAgc3RhdHVzID0gQ2FsbEZ1bmMoR2RpcENyZWF0ZUJpdG1hcEZyb21GaWxlSUNNKSgod2NoYXJfdCopYXJncy5wYXRoX25hbWUsICZwQml0bWFwKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoYXJncy5tZW1vcnlfc2l6ZSA9PSAwIHx8ICFhcmdzLm1lbW9yeV9iYXNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBwU3RyZWFtID0gbmV3IEdwU3RyZWFtOwotICAgICAgICBwU3RyZWFtLT5Xcml0ZShhcmdzLm1lbW9yeV9iYXNlLCAoVUxPTkcpYXJncy5tZW1vcnlfc2l6ZSwgTlVMTCk7Ci0gICAgICAgIHN0YXR1cyA9IENhbGxGdW5jKEdkaXBDcmVhdGVCaXRtYXBGcm9tU3RyZWFtSUNNKShwU3RyZWFtLCAmcEJpdG1hcCk7CitzdGF0aWMgUFJFVklFVzNfRElCSVRNQVAqIExvYWRESUJpdG1hcChXSU5ESUJfT3Blbl9BcmdzXyBhcmdzKSB7CisgIEdwQml0bWFwKiBwQml0bWFwOworICBHcFN0cmVhbSogcFN0cmVhbSA9IE5VTEw7CisgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KKyAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OworICBTdGF0dXMgc3RhdHVzID0gT2s7CisgIGlmIChhcmdzLmZsYWdzID09IFdJTkRJQl9PUEVOX1BBVEhOQU1FKSB7CisgICAgc3RhdHVzID0gQ2FsbEZ1bmMoR2RpcENyZWF0ZUJpdG1hcEZyb21GaWxlSUNNKSgod2NoYXJfdCopYXJncy5wYXRoX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEJpdG1hcCk7CisgIH0gZWxzZSB7CisgICAgaWYgKGFyZ3MubWVtb3J5X3NpemUgPT0gMCB8fCAhYXJncy5tZW1vcnlfYmFzZSkgeworICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGlmIChzdGF0dXMgIT0gT2spIHsKLSAgICAgICAgaWYgKHBTdHJlYW0pIHsKLSAgICAgICAgICAgIHBTdHJlYW0tPlJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwU3RyZWFtID0gbmV3IEdwU3RyZWFtOworICAgIHBTdHJlYW0tPldyaXRlKGFyZ3MubWVtb3J5X2Jhc2UsIChVTE9ORylhcmdzLm1lbW9yeV9zaXplLCBOVUxMKTsKKyAgICBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwQ3JlYXRlQml0bWFwRnJvbVN0cmVhbUlDTSkocFN0cmVhbSwgJnBCaXRtYXApOworICB9CisgIGlmIChzdGF0dXMgIT0gT2spIHsKKyAgICBpZiAocFN0cmVhbSkgeworICAgICAgcFN0cmVhbS0+UmVsZWFzZSgpOwogICAgIH0KLSAgICBVSU5UIGhlaWdodCwgd2lkdGg7Ci0gICAgQ2FsbEZ1bmMoR2RpcEdldEltYWdlSGVpZ2h0KShwQml0bWFwLCAmaGVpZ2h0KTsKLSAgICBDYWxsRnVuYyhHZGlwR2V0SW1hZ2VXaWR0aCkocEJpdG1hcCwgJndpZHRoKTsKLSAgICBQaXhlbEZvcm1hdCBwaXhlbF9mb3JtYXQ7Ci0gICAgQ2FsbEZ1bmMoR2RpcEdldEltYWdlUGl4ZWxGb3JtYXQpKHBCaXRtYXAsICZwaXhlbF9mb3JtYXQpOwotICAgIGludCBpbmZvX3NpemUgPSBzaXplb2YoQklUTUFQSU5GT0hFQURFUik7Ci0gICAgaW50IGJwcCA9IDI0OwotICAgIGludCBkZXN0X3BpeGVsX2Zvcm1hdCA9IFBpeGVsRm9ybWF0MjRicHBSR0I7Ci0gICAgaWYgKHBpeGVsX2Zvcm1hdCA9PSBQaXhlbEZvcm1hdDFicHBJbmRleGVkKSB7Ci0gICAgICAgIGluZm9fc2l6ZSArPSA4OwotICAgICAgICBicHAgPSAxOwotICAgICAgICBkZXN0X3BpeGVsX2Zvcm1hdCA9IFBpeGVsRm9ybWF0MWJwcEluZGV4ZWQ7Ci0gICAgfSBlbHNlIGlmIChwaXhlbF9mb3JtYXQgPT0gUGl4ZWxGb3JtYXQ4YnBwSW5kZXhlZCkgewotICAgICAgICBpbmZvX3NpemUgKz0gMTAyNDsKLSAgICAgICAgYnBwID0gODsKLSAgICAgICAgZGVzdF9waXhlbF9mb3JtYXQgPSBQaXhlbEZvcm1hdDhicHBJbmRleGVkOwotICAgIH0gZWxzZSBpZiAocGl4ZWxfZm9ybWF0ID09IFBpeGVsRm9ybWF0MzJicHBBUkdCKSB7Ci0gICAgICAgIGJwcCA9IDMyOwotICAgICAgICBkZXN0X3BpeGVsX2Zvcm1hdCA9IFBpeGVsRm9ybWF0MzJicHBBUkdCOworICAgIHJldHVybiBOVUxMOworICB9CisgIFVJTlQgaGVpZ2h0LCB3aWR0aDsKKyAgQ2FsbEZ1bmMoR2RpcEdldEltYWdlSGVpZ2h0KShwQml0bWFwLCAmaGVpZ2h0KTsKKyAgQ2FsbEZ1bmMoR2RpcEdldEltYWdlV2lkdGgpKHBCaXRtYXAsICZ3aWR0aCk7CisgIFBpeGVsRm9ybWF0IHBpeGVsX2Zvcm1hdDsKKyAgQ2FsbEZ1bmMoR2RpcEdldEltYWdlUGl4ZWxGb3JtYXQpKHBCaXRtYXAsICZwaXhlbF9mb3JtYXQpOworICBpbnQgaW5mb19zaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOworICBpbnQgYnBwID0gMjQ7CisgIGludCBkZXN0X3BpeGVsX2Zvcm1hdCA9IFBpeGVsRm9ybWF0MjRicHBSR0I7CisgIGlmIChwaXhlbF9mb3JtYXQgPT0gUGl4ZWxGb3JtYXQxYnBwSW5kZXhlZCkgeworICAgIGluZm9fc2l6ZSArPSA4OworICAgIGJwcCA9IDE7CisgICAgZGVzdF9waXhlbF9mb3JtYXQgPSBQaXhlbEZvcm1hdDFicHBJbmRleGVkOworICB9IGVsc2UgaWYgKHBpeGVsX2Zvcm1hdCA9PSBQaXhlbEZvcm1hdDhicHBJbmRleGVkKSB7CisgICAgaW5mb19zaXplICs9IDEwMjQ7CisgICAgYnBwID0gODsKKyAgICBkZXN0X3BpeGVsX2Zvcm1hdCA9IFBpeGVsRm9ybWF0OGJwcEluZGV4ZWQ7CisgIH0gZWxzZSBpZiAocGl4ZWxfZm9ybWF0ID09IFBpeGVsRm9ybWF0MzJicHBBUkdCKSB7CisgICAgYnBwID0gMzI7CisgICAgZGVzdF9waXhlbF9mb3JtYXQgPSBQaXhlbEZvcm1hdDMyYnBwQVJHQjsKKyAgfQorICBMUEJZVEUgYnVmID0gRlhfQWxsb2MoQllURSwgaW5mb19zaXplKTsKKyAgQklUTUFQSU5GT0hFQURFUiogcGJtaWggPSAoQklUTUFQSU5GT0hFQURFUiopYnVmOworICBwYm1paC0+YmlCaXRDb3VudCA9IGJwcDsKKyAgcGJtaWgtPmJpQ29tcHJlc3Npb24gPSBCSV9SR0I7CisgIHBibWloLT5iaUhlaWdodCA9IC0oaW50KWhlaWdodDsKKyAgcGJtaWgtPmJpUGxhbmVzID0gMTsKKyAgcGJtaWgtPmJpV2lkdGggPSB3aWR0aDsKKyAgUmVjdCByZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICBCaXRtYXBEYXRhKiBwQml0bWFwRGF0YSA9IEZYX0FsbG9jKEJpdG1hcERhdGEsIDEpOworICBDYWxsRnVuYyhHZGlwQml0bWFwTG9ja0JpdHMpKHBCaXRtYXAsICZyZWN0LCBJbWFnZUxvY2tNb2RlUmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3BpeGVsX2Zvcm1hdCwgcEJpdG1hcERhdGEpOworICBpZiAocGl4ZWxfZm9ybWF0ID09IFBpeGVsRm9ybWF0MWJwcEluZGV4ZWQgfHwKKyAgICAgIHBpeGVsX2Zvcm1hdCA9PSBQaXhlbEZvcm1hdDhicHBJbmRleGVkKSB7CisgICAgRFdPUkQqIHBwYWwgPSAoRFdPUkQqKShidWYgKyBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpOworICAgIHN0cnVjdCB7CisgICAgICBVSU5UIGZsYWdzOworICAgICAgVUlOVCBDb3VudDsKKyAgICAgIERXT1JEIEVudHJpZXNbMjU2XTsKKyAgICB9IHBhbDsKKyAgICBpbnQgc2l6ZSA9IDA7CisgICAgQ2FsbEZ1bmMoR2RpcEdldEltYWdlUGFsZXR0ZVNpemUpKHBCaXRtYXAsICZzaXplKTsKKyAgICBDYWxsRnVuYyhHZGlwR2V0SW1hZ2VQYWxldHRlKShwQml0bWFwLCAoQ29sb3JQYWxldHRlKikmcGFsLCBzaXplKTsKKyAgICBpbnQgZW50cmllcyA9IHBpeGVsX2Zvcm1hdCA9PSBQaXhlbEZvcm1hdDFicHBJbmRleGVkID8gMiA6IDI1NjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXM7IGkrKykgeworICAgICAgcHBhbFtpXSA9IHBhbC5FbnRyaWVzW2ldICYgMHgwMGZmZmZmZjsKICAgICB9Ci0gICAgTFBCWVRFIGJ1ZiA9IEZYX0FsbG9jKEJZVEUsIGluZm9fc2l6ZSk7Ci0gICAgQklUTUFQSU5GT0hFQURFUiogcGJtaWggPSAoQklUTUFQSU5GT0hFQURFUiopYnVmOwotICAgIHBibWloLT5iaUJpdENvdW50ID0gYnBwOwotICAgIHBibWloLT5iaUNvbXByZXNzaW9uID0gQklfUkdCOwotICAgIHBibWloLT5iaUhlaWdodCA9IC0oaW50KWhlaWdodDsKLSAgICBwYm1paC0+YmlQbGFuZXMgPSAxOwotICAgIHBibWloLT5iaVdpZHRoID0gd2lkdGg7Ci0gICAgUmVjdCByZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotICAgIEJpdG1hcERhdGEqIHBCaXRtYXBEYXRhID0gRlhfQWxsb2MoQml0bWFwRGF0YSwgMSk7Ci0gICAgQ2FsbEZ1bmMoR2RpcEJpdG1hcExvY2tCaXRzKShwQml0bWFwLCAmcmVjdCwgSW1hZ2VMb2NrTW9kZVJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3BpeGVsX2Zvcm1hdCwgcEJpdG1hcERhdGEpOwotICAgIGlmIChwaXhlbF9mb3JtYXQgPT0gUGl4ZWxGb3JtYXQxYnBwSW5kZXhlZCB8fCBwaXhlbF9mb3JtYXQgPT0gUGl4ZWxGb3JtYXQ4YnBwSW5kZXhlZCkgewotICAgICAgICBEV09SRCogcHBhbCA9IChEV09SRCopKGJ1ZiArIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSk7Ci0gICAgICAgIHN0cnVjdCB7Ci0gICAgICAgICAgICBVSU5UIGZsYWdzOwotICAgICAgICAgICAgVUlOVCBDb3VudDsKLSAgICAgICAgICAgIERXT1JEIEVudHJpZXNbMjU2XTsKLSAgICAgICAgfSBwYWw7Ci0gICAgICAgIGludCBzaXplID0gMDsKLSAgICAgICAgQ2FsbEZ1bmMoR2RpcEdldEltYWdlUGFsZXR0ZVNpemUpKHBCaXRtYXAsICZzaXplKTsKLSAgICAgICAgQ2FsbEZ1bmMoR2RpcEdldEltYWdlUGFsZXR0ZSkocEJpdG1hcCwgKENvbG9yUGFsZXR0ZSopJnBhbCwgc2l6ZSk7Ci0gICAgICAgIGludCBlbnRyaWVzID0gcGl4ZWxfZm9ybWF0ID09IFBpeGVsRm9ybWF0MWJwcEluZGV4ZWQgPyAyIDogMjU2OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXM7IGkgKyspIHsKLSAgICAgICAgICAgIHBwYWxbaV0gPSBwYWwuRW50cmllc1tpXSAmIDB4MDBmZmZmZmY7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgUFJFVklFVzNfRElCSVRNQVAqIHBJbmZvID0gRlhfQWxsb2MoUFJFVklFVzNfRElCSVRNQVAsIDEpOwotICAgIHBJbmZvLT5wYm1pID0gKEJJVE1BUElORk8qKWJ1ZjsKLSAgICBwSW5mby0+cFNjYW4wID0gKExQQllURSlwQml0bWFwRGF0YS0+U2NhbjA7Ci0gICAgcEluZm8tPlN0cmlkZSA9IHBCaXRtYXBEYXRhLT5TdHJpZGU7Ci0gICAgcEluZm8tPnBCaXRtYXAgPSBwQml0bWFwOwotICAgIHBJbmZvLT5wQml0bWFwRGF0YSA9IHBCaXRtYXBEYXRhOwotICAgIHBJbmZvLT5wU3RyZWFtID0gcFN0cmVhbTsKLSAgICByZXR1cm4gcEluZm87CisgIH0KKyAgUFJFVklFVzNfRElCSVRNQVAqIHBJbmZvID0gRlhfQWxsb2MoUFJFVklFVzNfRElCSVRNQVAsIDEpOworICBwSW5mby0+cGJtaSA9IChCSVRNQVBJTkZPKilidWY7CisgIHBJbmZvLT5wU2NhbjAgPSAoTFBCWVRFKXBCaXRtYXBEYXRhLT5TY2FuMDsKKyAgcEluZm8tPlN0cmlkZSA9IHBCaXRtYXBEYXRhLT5TdHJpZGU7CisgIHBJbmZvLT5wQml0bWFwID0gcEJpdG1hcDsKKyAgcEluZm8tPnBCaXRtYXBEYXRhID0gcEJpdG1hcERhdGE7CisgIHBJbmZvLT5wU3RyZWFtID0gcFN0cmVhbTsKKyAgcmV0dXJuIHBJbmZvOwogfQotc3RhdGljIHZvaWQgRnJlZURJQml0bWFwKFBSRVZJRVczX0RJQklUTUFQKiBwSW5mbykKLXsKLSAgICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9ICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICAgIENhbGxGdW5jKEdkaXBCaXRtYXBVbmxvY2tCaXRzKShwSW5mby0+cEJpdG1hcCwgcEluZm8tPnBCaXRtYXBEYXRhKTsKLSAgICBDYWxsRnVuYyhHZGlwRGlzcG9zZUltYWdlKShwSW5mby0+cEJpdG1hcCk7Ci0gICAgRlhfRnJlZShwSW5mby0+cEJpdG1hcERhdGEpOwotICAgIEZYX0ZyZWUoKExQQllURSlwSW5mby0+cGJtaSk7Ci0gICAgaWYgKHBJbmZvLT5wU3RyZWFtKSB7Ci0gICAgICAgIHBJbmZvLT5wU3RyZWFtLT5SZWxlYXNlKCk7Ci0gICAgfQotICAgIEZYX0ZyZWUocEluZm8pOworc3RhdGljIHZvaWQgRnJlZURJQml0bWFwKFBSRVZJRVczX0RJQklUTUFQKiBwSW5mbykgeworICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9CisgICAgICAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKKyAgQ2FsbEZ1bmMoR2RpcEJpdG1hcFVubG9ja0JpdHMpKHBJbmZvLT5wQml0bWFwLCBwSW5mby0+cEJpdG1hcERhdGEpOworICBDYWxsRnVuYyhHZGlwRGlzcG9zZUltYWdlKShwSW5mby0+cEJpdG1hcCk7CisgIEZYX0ZyZWUocEluZm8tPnBCaXRtYXBEYXRhKTsKKyAgRlhfRnJlZSgoTFBCWVRFKXBJbmZvLT5wYm1pKTsKKyAgaWYgKHBJbmZvLT5wU3RyZWFtKSB7CisgICAgcEluZm8tPnBTdHJlYW0tPlJlbGVhc2UoKTsKKyAgfQorICBGWF9GcmVlKHBJbmZvKTsKIH0KLUNGWF9ESUJpdG1hcCogX0ZYX1dpbmRvd3NESUJfTG9hZEZyb21CdWYoQklUTUFQSU5GTyogcGJtaSwgTFBWT0lEIHBEYXRhLCBGWF9CT09MIGJBbHBoYSk7Ci1DRlhfRElCaXRtYXAqIENHZGlwbHVzRXh0OjpMb2FkRElCaXRtYXAoV0lORElCX09wZW5fQXJnc18gYXJncykKLXsKLSAgICBQUkVWSUVXM19ESUJJVE1BUCogcEluZm8gPSA6OkxvYWRESUJpdG1hcChhcmdzKTsKLSAgICBpZiAocEluZm8gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKK0NGWF9ESUJpdG1hcCogX0ZYX1dpbmRvd3NESUJfTG9hZEZyb21CdWYoQklUTUFQSU5GTyogcGJtaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBbHBoYSk7CitDRlhfRElCaXRtYXAqIENHZGlwbHVzRXh0OjpMb2FkRElCaXRtYXAoV0lORElCX09wZW5fQXJnc18gYXJncykgeworICBQUkVWSUVXM19ESUJJVE1BUCogcEluZm8gPSA6OkxvYWRESUJpdG1hcChhcmdzKTsKKyAgaWYgKCFwSW5mbykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGludCBoZWlnaHQgPSBhYnMocEluZm8tPnBibWktPmJtaUhlYWRlci5iaUhlaWdodCk7CisgIGludCB3aWR0aCA9IHBJbmZvLT5wYm1pLT5ibWlIZWFkZXIuYmlXaWR0aDsKKyAgaW50IGRlc3RfcGl0Y2ggPSAod2lkdGggKiBwSW5mby0+cGJtaS0+Ym1pSGVhZGVyLmJpQml0Q291bnQgKyAzMSkgLyAzMiAqIDQ7CisgIExQQllURSBwRGF0YSA9IEZYX0FsbG9jMkQoQllURSwgZGVzdF9waXRjaCwgaGVpZ2h0KTsKKyAgaWYgKGRlc3RfcGl0Y2ggPT0gcEluZm8tPlN0cmlkZSkgeworICAgIEZYU1lTX21lbWNweShwRGF0YSwgcEluZm8tPnBTY2FuMCwgZGVzdF9waXRjaCAqIGhlaWdodCk7CisgIH0gZWxzZSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgRlhTWVNfbWVtY3B5KHBEYXRhICsgZGVzdF9waXRjaCAqIGksIHBJbmZvLT5wU2NhbjAgKyBwSW5mby0+U3RyaWRlICogaSwKKyAgICAgICAgICAgICAgICAgICBkZXN0X3BpdGNoKTsKICAgICB9Ci0gICAgaW50IGhlaWdodCA9IGFicyhwSW5mby0+cGJtaS0+Ym1pSGVhZGVyLmJpSGVpZ2h0KTsKLSAgICBpbnQgd2lkdGggPSBwSW5mby0+cGJtaS0+Ym1pSGVhZGVyLmJpV2lkdGg7Ci0gICAgaW50IGRlc3RfcGl0Y2ggPSAod2lkdGggKiBwSW5mby0+cGJtaS0+Ym1pSGVhZGVyLmJpQml0Q291bnQgKyAzMSkgLyAzMiAqIDQ7Ci0gICAgTFBCWVRFIHBEYXRhID0gRlhfQWxsb2MyRChCWVRFLCBkZXN0X3BpdGNoLCBoZWlnaHQpOwotICAgIGlmIChkZXN0X3BpdGNoID09IHBJbmZvLT5TdHJpZGUpIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5MzIocERhdGEsIHBJbmZvLT5wU2NhbjAsIGRlc3RfcGl0Y2ggKiBoZWlnaHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVpZ2h0OyBpICsrKSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkzMihwRGF0YSArIGRlc3RfcGl0Y2ggKiBpLCBwSW5mby0+cFNjYW4wICsgcEluZm8tPlN0cmlkZSAqIGksIGRlc3RfcGl0Y2gpOwotICAgICAgICB9Ci0gICAgfQotICAgIENGWF9ESUJpdG1hcCogcERJQml0bWFwID0gX0ZYX1dpbmRvd3NESUJfTG9hZEZyb21CdWYocEluZm8tPnBibWksIHBEYXRhLCBwSW5mby0+cGJtaS0+Ym1pSGVhZGVyLmJpQml0Q291bnQgPT0gMzIpOwotICAgIEZYX0ZyZWUocERhdGEpOwotICAgIEZyZWVESUJpdG1hcChwSW5mbyk7Ci0gICAgcmV0dXJuIHBESUJpdG1hcDsKKyAgfQorICBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCA9IF9GWF9XaW5kb3dzRElCX0xvYWRGcm9tQnVmKAorICAgICAgcEluZm8tPnBibWksIHBEYXRhLCBwSW5mby0+cGJtaS0+Ym1pSGVhZGVyLmJpQml0Q291bnQgPT0gMzIpOworICBGWF9GcmVlKHBEYXRhKTsKKyAgRnJlZURJQml0bWFwKHBJbmZvKTsKKyAgcmV0dXJuIHBESUJpdG1hcDsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS93aW4zMi9meF93aW4zMl9wcmludC5jcHAgYi9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX3ByaW50LmNwcAppbmRleCA2NzA2MjJhLi4wYzAwYTdiIDEwMDY0NAotLS0gYS9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX3ByaW50LmNwcAorKysgYi9jb3JlL3NyYy9meGdlL3dpbjMyL2Z4X3dpbjMyX3ByaW50LmNwcApAQCAtMSw0MTQgKzEsNDc0IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZ2UuaCIKLSNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU42NF8KKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9nZS5oIgorCisjaWYgX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lONjRfREVTS1RPUF8KKwogI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2Z4Z2UvZnhfZ2Vfd2luMzIuaCIKKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2ZyZWV0eXBlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2Vfd2luMzIuaCIKKyNpbmNsdWRlICJjb3JlL3NyYy9meGdlL2RpYi9kaWJfaW50LmgiCisjaW5jbHVkZSAiY29yZS9zcmMvZnhnZS9nZS90ZXh0X2ludC5oIgogI2luY2x1ZGUgIndpbjMyX2ludC5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvZnhnZS9meF9mcmVldHlwZS5oIgotI2luY2x1ZGUgIi4uL2dlL3RleHRfaW50LmgiCi0jaW5jbHVkZSAiLi4vZGliL2RpYl9pbnQuaCIKKwogI2RlZmluZSBTSVpFVEhSRVNIT0xEIDEwMDAKICNkZWZpbmUgT1VUUFVUUFNMRU4gNDA5NgotQ0dkaVByaW50ZXJEcml2ZXI6OkNHZGlQcmludGVyRHJpdmVyKEhEQyBoREMpIDogQ0dkaURldmljZURyaXZlcihoREMsIEZYRENfUFJJTlRFUikKLXsKLSAgICBtX0hvcnpTaXplID0gOjpHZXREZXZpY2VDYXBzKG1faERDLCBIT1JaU0laRSk7Ci0gICAgbV9WZXJ0U2l6ZSA9IDo6R2V0RGV2aWNlQ2FwcyhtX2hEQywgVkVSVFNJWkUpOwotICAgIG1fYlN1cHBvcnRST1AgPSBUUlVFOworQ0dkaVByaW50ZXJEcml2ZXI6OkNHZGlQcmludGVyRHJpdmVyKEhEQyBoREMpCisgICAgOiBDR2RpRGV2aWNlRHJpdmVyKGhEQywgRlhEQ19QUklOVEVSKSB7CisgIG1fSG9yelNpemUgPSA6OkdldERldmljZUNhcHMobV9oREMsIEhPUlpTSVpFKTsKKyAgbV9WZXJ0U2l6ZSA9IDo6R2V0RGV2aWNlQ2FwcyhtX2hEQywgVkVSVFNJWkUpOworICBtX2JTdXBwb3J0Uk9QID0gVFJVRTsKIH0KLWludCBDR2RpUHJpbnRlckRyaXZlcjo6R2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCkKLXsKLSAgICBpZiAoY2Fwc19pZCA9PSBGWERDX0hPUlpfU0laRSkgewotICAgICAgICByZXR1cm4gbV9Ib3J6U2l6ZTsKLSAgICB9Ci0gICAgaWYgKGNhcHNfaWQgPT0gRlhEQ19WRVJUX1NJWkUpIHsKLSAgICAgICAgcmV0dXJuIG1fVmVydFNpemU7Ci0gICAgfQotICAgIHJldHVybiBDR2RpRGV2aWNlRHJpdmVyOjpHZXREZXZpY2VDYXBzKGNhcHNfaWQpOworaW50IENHZGlQcmludGVyRHJpdmVyOjpHZXREZXZpY2VDYXBzKGludCBjYXBzX2lkKSB7CisgIGlmIChjYXBzX2lkID09IEZYRENfSE9SWl9TSVpFKSB7CisgICAgcmV0dXJuIG1fSG9yelNpemU7CisgIH0KKyAgaWYgKGNhcHNfaWQgPT0gRlhEQ19WRVJUX1NJWkUpIHsKKyAgICByZXR1cm4gbV9WZXJ0U2l6ZTsKKyAgfQorICByZXR1cm4gQ0dkaURldmljZURyaXZlcjo6R2V0RGV2aWNlQ2FwcyhjYXBzX2lkKTsKIH0KLUZYX0JPT0wgQ0dkaVByaW50ZXJEcml2ZXI6OlNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSkKLXsKLSAgICBpZiAocFNvdXJjZS0+SXNBbHBoYU1hc2soKSkgewotICAgICAgICBGWF9SRUNUIGNsaXBfcmVjdChsZWZ0LCB0b3AsIGxlZnQgKyBwU3JjUmVjdC0+V2lkdGgoKSwgdG9wICsgcFNyY1JlY3QtPkhlaWdodCgpKTsKLSAgICAgICAgcmV0dXJuIFN0cmV0Y2hESUJpdHMocFNvdXJjZSwgY29sb3IsIGxlZnQgLSBwU3JjUmVjdC0+bGVmdCwgdG9wIC0gcFNyY1JlY3QtPnRvcCwgcFNvdXJjZS0+R2V0V2lkdGgoKSwgcFNvdXJjZS0+R2V0SGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGlwX3JlY3QsIDAsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIEZYRElCX0JMRU5EX05PUk1BTCk7CitGWF9CT09MIENHZGlQcmludGVyRHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKKyAgaWYgKHBTb3VyY2UtPklzQWxwaGFNYXNrKCkpIHsKKyAgICBGWF9SRUNUIGNsaXBfcmVjdChsZWZ0LCB0b3AsIGxlZnQgKyBwU3JjUmVjdC0+V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICB0b3AgKyBwU3JjUmVjdC0+SGVpZ2h0KCkpOworICAgIHJldHVybiBTdHJldGNoRElCaXRzKHBTb3VyY2UsIGNvbG9yLCBsZWZ0IC0gcFNyY1JlY3QtPmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdG9wIC0gcFNyY1JlY3QtPnRvcCwgcFNvdXJjZS0+R2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwU291cmNlLT5HZXRIZWlnaHQoKSwgJmNsaXBfcmVjdCwgMCwgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwSWNjVHJhbnNmb3JtLCBGWERJQl9CTEVORF9OT1JNQUwpOworICB9CisgIEFTU0VSVChwU291cmNlICYmICFwU291cmNlLT5Jc0FscGhhTWFzaygpICYmIHBTcmNSZWN0KTsKKyAgQVNTRVJUKGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTk9STUFMKTsKKyAgaWYgKHBTb3VyY2UtPkhhc0FscGhhKCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0ZYX0RJQkV4dHJhY3RvciB0ZW1wKHBTb3VyY2UpOworICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSB0ZW1wOworICBpZiAoIXBCaXRtYXApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIEdESV9TZXRESUJpdHMocEJpdG1hcCwgcFNyY1JlY3QsIGxlZnQsIHRvcCwgcEljY1RyYW5zZm9ybSk7Cit9CitGWF9CT09MIENHZGlQcmludGVyRHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgeworICBpZiAocFNvdXJjZS0+SXNBbHBoYU1hc2soKSkgeworICAgIGludCBhbHBoYSA9IEZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZykKKyAgICAgICAgICAgICAgICAgICAgPyBGWEdFVEZMQUdfQUxQSEFfRklMTChhbHBoYV9mbGFnKQorICAgICAgICAgICAgICAgICAgICA6IEZYQVJHQl9BKGNvbG9yKTsKKyAgICBpZiAocFNvdXJjZS0+R2V0QlBQKCkgIT0gMSB8fCBhbHBoYSAhPSAyNTUgfHwgIW1fYlN1cHBvcnRST1ApIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgQVNTRVJUKHBTb3VyY2UgIT0gTlVMTCAmJiAhcFNvdXJjZS0+SXNBbHBoYU1hc2soKSAmJiBwU3JjUmVjdCAhPSBOVUxMKTsKLSAgICBBU1NFUlQoYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9OT1JNQUwpOwotICAgIGlmIChwU291cmNlLT5IYXNBbHBoYSgpKSB7CisgICAgaWYgKGRlc3Rfd2lkdGggPCAwIHx8IGRlc3RfaGVpZ2h0IDwgMCkgeworICAgICAgQ0ZYX0RJQml0bWFwKiBwRmxpcHBlZCA9CisgICAgICAgICAgcFNvdXJjZS0+RmxpcEltYWdlKGRlc3Rfd2lkdGggPCAwLCBkZXN0X2hlaWdodCA8IDApOworICAgICAgaWYgKCFwRmxpcHBlZCkgewogICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBpZiAoZGVzdF93aWR0aCA8IDApIHsKKyAgICAgICAgZGVzdF9sZWZ0ICs9IGRlc3Rfd2lkdGg7CisgICAgICB9CisgICAgICBpZiAoZGVzdF9oZWlnaHQgPCAwKSB7CisgICAgICAgIGRlc3RfdG9wICs9IGRlc3RfaGVpZ2h0OworICAgICAgfQorICAgICAgRlhfQk9PTCByZXQgPSBHRElfU3RyZXRjaEJpdE1hc2socEZsaXBwZWQsIGRlc3RfbGVmdCwgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnMoZGVzdF93aWR0aCksIGFicyhkZXN0X2hlaWdodCksIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOworICAgICAgZGVsZXRlIHBGbGlwcGVkOworICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAgICAgQ0ZYX0RJQkV4dHJhY3RvciB0ZW1wKHBTb3VyY2UpOwogICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IHRlbXA7Ci0gICAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFwQml0bWFwKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIHJldHVybiBHRElfU2V0RElCaXRzKHBCaXRtYXAsIHBTcmNSZWN0LCBsZWZ0LCB0b3AsIHBJY2NUcmFuc2Zvcm0pOwotfQotRlhfQk9PTCBDR2RpUHJpbnRlckRyaXZlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAotICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIEZYX0RXT1JEIGZsYWdzLAotICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpCi17Ci0gICAgaWYgKHBTb3VyY2UtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgaW50IGFscGhhID0gRlhHRVRGTEFHX0NPTE9SVFlQRShhbHBoYV9mbGFnKSA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpIDogRlhBUkdCX0EoY29sb3IpOwotICAgICAgICBpZiAocFNvdXJjZS0+R2V0QlBQKCkgIT0gMSB8fCBhbHBoYSAhPSAyNTUgfHwgIW1fYlN1cHBvcnRST1ApIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGVzdF93aWR0aCA8IDAgfHwgZGVzdF9oZWlnaHQgPCAwKSB7Ci0gICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBGbGlwcGVkID0gcFNvdXJjZS0+RmxpcEltYWdlKGRlc3Rfd2lkdGggPCAwLCBkZXN0X2hlaWdodCA8IDApOwotICAgICAgICAgICAgaWYgKHBGbGlwcGVkID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGVzdF93aWR0aCA8IDApIHsKLSAgICAgICAgICAgICAgICBkZXN0X2xlZnQgKz0gZGVzdF93aWR0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkZXN0X2hlaWdodCA8IDApIHsKLSAgICAgICAgICAgICAgICBkZXN0X3RvcCArPSBkZXN0X2hlaWdodDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX0JPT0wgcmV0ID0gR0RJX1N0cmV0Y2hCaXRNYXNrKHBGbGlwcGVkLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBhYnMoZGVzdF93aWR0aCksIGFicyhkZXN0X2hlaWdodCksIGNvbG9yLCBmbGFncywgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgICAgICBkZWxldGUgcEZsaXBwZWQ7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgICAgIENGWF9ESUJFeHRyYWN0b3IgdGVtcChwU291cmNlKTsKLSAgICAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gdGVtcDsKLSAgICAgICAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBHRElfU3RyZXRjaEJpdE1hc2socEJpdG1hcCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIGNvbG9yLCBmbGFncywgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQVNTRVJUKHBTb3VyY2UgIT0gTlVMTCk7Ci0gICAgICAgIGlmIChwU291cmNlLT5IYXNBbHBoYSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlc3Rfd2lkdGggPCAwIHx8IGRlc3RfaGVpZ2h0IDwgMCkgewotICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwRmxpcHBlZCA9IHBTb3VyY2UtPkZsaXBJbWFnZShkZXN0X3dpZHRoIDwgMCwgZGVzdF9oZWlnaHQgPCAwKTsKLSAgICAgICAgICAgIGlmIChwRmxpcHBlZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRlc3Rfd2lkdGggPCAwKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9sZWZ0ICs9IGRlc3Rfd2lkdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGVzdF9oZWlnaHQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF90b3AgKz0gZGVzdF9oZWlnaHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9CT09MIHJldCA9IEdESV9TdHJldGNoRElCaXRzKHBGbGlwcGVkLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBhYnMoZGVzdF93aWR0aCksIGFicyhkZXN0X2hlaWdodCksIGZsYWdzLCBwSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgICAgIGRlbGV0ZSBwRmxpcHBlZDsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0RJQkV4dHJhY3RvciB0ZW1wKHBTb3VyY2UpOwotICAgICAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSB0ZW1wOwotICAgICAgICBpZiAocEJpdG1hcCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEdESV9TdHJldGNoRElCaXRzKHBCaXRtYXAsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBmbGFncywgcEljY1RyYW5zZm9ybSk7Ci0gICAgfQotfQotc3RhdGljIENGWF9ESUJpdG1hcCogVHJhbnNmb3JtMWJwcEJpdG1hcChjb25zdCBDRlhfRElCU291cmNlKiBwU3JjLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwRGVzdE1hdHJpeCkKLXsKLSAgICBBU1NFUlQocFNyYy0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfMWJwcFJnYiB8fCBwU3JjLT5HZXRGb3JtYXQoKSA9PSBGWERJQl8xYnBwTWFzayB8fCBwU3JjLT5HZXRGb3JtYXQoKSA9PSBGWERJQl8xYnBwQ215ayk7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCB1bml0X3JlY3QgPSBwRGVzdE1hdHJpeC0+R2V0VW5pdFJlY3QoKTsKLSAgICBGWF9SRUNUIGZ1bGxfcmVjdCA9IHVuaXRfcmVjdC5HZXRPdXR0ZXJSZWN0KCk7Ci0gICAgaW50IGZ1bGxfbGVmdCA9IGZ1bGxfcmVjdC5sZWZ0OwotICAgIGludCBmdWxsX3RvcCA9IGZ1bGxfcmVjdC50b3A7Ci0gICAgQ0ZYX0RJQkV4dHJhY3RvciBzcmNfYml0bWFwKHBTcmMpOwotICAgIENGWF9ESUJpdG1hcCogcFNyY0JpdG1hcCA9IHNyY19iaXRtYXA7Ci0gICAgaWYgKHBTcmNCaXRtYXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaW50IHNyY193aWR0aCA9IHBTcmNCaXRtYXAtPkdldFdpZHRoKCksIHNyY19oZWlnaHQgPSBwU3JjQml0bWFwLT5HZXRIZWlnaHQoKTsKLSAgICBGWF9MUEJZVEUgc3JjX2J1ZiA9IHBTcmNCaXRtYXAtPkdldEJ1ZmZlcigpOwotICAgIEZYX0RXT1JEIHNyY19waXRjaCA9IHBTcmNCaXRtYXAtPkdldFBpdGNoKCk7Ci0gICAgRlhfRkxPQVQgZGVzdF9hcmVhID0gcERlc3RNYXRyaXgtPkdldFVuaXRBcmVhKCk7Ci0gICAgRlhfRkxPQVQgYXJlYV9zY2FsZSA9IEZYU1lTX0RpdigoRlhfRkxPQVQpKHNyY193aWR0aCAqIHNyY19oZWlnaHQpLCBkZXN0X2FyZWEpOwotICAgIEZYX0ZMT0FUIHNpemVfc2NhbGUgPSBGWFNZU19zcXJ0KGFyZWFfc2NhbGUpOwotICAgIENGWF9BZmZpbmVNYXRyaXggYWRqdXN0ZWRfbWF0cml4KCpwRGVzdE1hdHJpeCk7Ci0gICAgYWRqdXN0ZWRfbWF0cml4LlNjYWxlKHNpemVfc2NhbGUsIHNpemVfc2NhbGUpOwotICAgIENGWF9GbG9hdFJlY3QgcmVzdWx0X3JlY3RfZiA9IGFkanVzdGVkX21hdHJpeC5HZXRVbml0UmVjdCgpOwotICAgIEZYX1JFQ1QgcmVzdWx0X3JlY3QgPSByZXN1bHRfcmVjdF9mLkdldE91dHRlclJlY3QoKTsKLSAgICBDRlhfQWZmaW5lTWF0cml4IHNyYzJyZXN1bHQ7Ci0gICAgc3JjMnJlc3VsdC5lID0gYWRqdXN0ZWRfbWF0cml4LmMgKyBhZGp1c3RlZF9tYXRyaXguZTsKLSAgICBzcmMycmVzdWx0LmYgPSBhZGp1c3RlZF9tYXRyaXguZCArIGFkanVzdGVkX21hdHJpeC5mOwotICAgIHNyYzJyZXN1bHQuYSA9IGFkanVzdGVkX21hdHJpeC5hIC8gcFNyY0JpdG1hcC0+R2V0V2lkdGgoKTsKLSAgICBzcmMycmVzdWx0LmIgPSBhZGp1c3RlZF9tYXRyaXguYiAvIHBTcmNCaXRtYXAtPkdldFdpZHRoKCk7Ci0gICAgc3JjMnJlc3VsdC5jID0gLWFkanVzdGVkX21hdHJpeC5jIC8gcFNyY0JpdG1hcC0+R2V0SGVpZ2h0KCk7Ci0gICAgc3JjMnJlc3VsdC5kID0gLWFkanVzdGVkX21hdHJpeC5kIC8gcFNyY0JpdG1hcC0+R2V0SGVpZ2h0KCk7Ci0gICAgc3JjMnJlc3VsdC5UcmFuc2xhdGVJKC1yZXN1bHRfcmVjdC5sZWZ0LCAtcmVzdWx0X3JlY3QudG9wKTsKLSAgICBDRlhfQWZmaW5lTWF0cml4IHJlc3VsdDJzcmM7Ci0gICAgcmVzdWx0MnNyYy5TZXRSZXZlcnNlKHNyYzJyZXN1bHQpOwotICAgIENQREZfRml4ZWRNYXRyaXggcmVzdWx0MnNyY19maXgocmVzdWx0MnNyYywgOCk7Ci0gICAgaW50IHJlc3VsdF93aWR0aCA9IHJlc3VsdF9yZWN0LldpZHRoKCk7Ci0gICAgaW50IHJlc3VsdF9oZWlnaHQgPSByZXN1bHRfcmVjdC5IZWlnaHQoKTsKLSAgICBDRlhfRElCaXRtYXAqIHBUZW1wQml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsKLSAgICBpZiAoIXBUZW1wQml0bWFwLT5DcmVhdGUocmVzdWx0X3dpZHRoLCByZXN1bHRfaGVpZ2h0LCBwU3JjLT5HZXRGb3JtYXQoKSkpIHsKLSAgICAgICAgZGVsZXRlIHBUZW1wQml0bWFwOwotICAgICAgICBpZiAocFNyY0JpdG1hcCAhPSBzcmNfYml0bWFwKSB7Ci0gICAgICAgICAgICBkZWxldGUgcFNyY0JpdG1hcDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcFRlbXBCaXRtYXAtPkNvcHlQYWxldHRlKHBTcmMtPkdldFBhbGV0dGUoKSk7Ci0gICAgRlhfTFBCWVRFIGRlc3RfYnVmID0gcFRlbXBCaXRtYXAtPkdldEJ1ZmZlcigpOwotICAgIGludCBkZXN0X3BpdGNoID0gcFRlbXBCaXRtYXAtPkdldFBpdGNoKCk7Ci0gICAgRlhTWVNfbWVtc2V0OChkZXN0X2J1ZiwgcFNyYy0+SXNBbHBoYU1hc2soKSA/IDAgOiAweGZmLCBkZXN0X3BpdGNoICogcmVzdWx0X2hlaWdodCk7Ci0gICAgaWYgKHBTcmNCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgZm9yIChpbnQgZGVzdF95ID0gMDsgZGVzdF95IDwgcmVzdWx0X2hlaWdodDsgZGVzdF95ICsrKSB7Ci0gICAgICAgICAgICBGWF9MUEJZVEUgZGVzdF9zY2FuID0gZGVzdF9idWYgKyBkZXN0X3kgKiBkZXN0X3BpdGNoOwotICAgICAgICAgICAgZm9yIChpbnQgZGVzdF94ID0gMDsgZGVzdF94IDwgcmVzdWx0X3dpZHRoOyBkZXN0X3ggKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgc3JjX3gsIHNyY195OwotICAgICAgICAgICAgICAgIHJlc3VsdDJzcmNfZml4LlRyYW5zZm9ybShkZXN0X3gsIGRlc3RfeSwgc3JjX3gsIHNyY195KTsKLSAgICAgICAgICAgICAgICBpZiAoc3JjX3ggPCAwIHx8IHNyY194ID49IHNyY193aWR0aCB8fCBzcmNfeSA8IDAgfHwgc3JjX3kgPj0gc3JjX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCEoKHNyY19idWYgKyBzcmNfcGl0Y2ggKiBzcmNfeSlbc3JjX3ggLyA4XSAmICgxIDw8ICg3IC0gc3JjX3ggJSA4KSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5bZGVzdF94IC8gOF0gfD0gMSA8PCAoNyAtIGRlc3RfeCAlIDgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQgZGVzdF95ID0gMDsgZGVzdF95IDwgcmVzdWx0X2hlaWdodDsgZGVzdF95ICsrKSB7Ci0gICAgICAgICAgICBGWF9MUEJZVEUgZGVzdF9zY2FuID0gZGVzdF9idWYgKyBkZXN0X3kgKiBkZXN0X3BpdGNoOwotICAgICAgICAgICAgZm9yIChpbnQgZGVzdF94ID0gMDsgZGVzdF94IDwgcmVzdWx0X3dpZHRoOyBkZXN0X3ggKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgc3JjX3gsIHNyY195OwotICAgICAgICAgICAgICAgIHJlc3VsdDJzcmNfZml4LlRyYW5zZm9ybShkZXN0X3gsIGRlc3RfeSwgc3JjX3gsIHNyY195KTsKLSAgICAgICAgICAgICAgICBpZiAoc3JjX3ggPCAwIHx8IHNyY194ID49IHNyY193aWR0aCB8fCBzcmNfeSA8IDAgfHwgc3JjX3kgPj0gc3JjX2hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChzcmNfYnVmICsgc3JjX3BpdGNoICogc3JjX3kpW3NyY194IC8gOF0gJiAoMSA8PCAoNyAtIHNyY194ICUgOCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0X3NjYW5bZGVzdF94IC8gOF0gJj0gfigxIDw8ICg3IC0gZGVzdF94ICUgOCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwU3JjQml0bWFwICE9IHNyY19iaXRtYXApIHsKLSAgICAgICAgZGVsZXRlIHBTcmNCaXRtYXA7Ci0gICAgfQotICAgIHJldHVybiBwVGVtcEJpdG1hcDsKLX0KLUZYX0JPT0wJQ0dkaVByaW50ZXJEcml2ZXI6OlN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgcmVuZGVyX2ZsYWdzLCBGWF9MUFZPSUQmIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKLXsKLSAgICBpZiAoYml0bWFwX2FscGhhIDwgMjU1IHx8IHBTb3VyY2UtPkhhc0FscGhhKCkgfHwgKHBTb3VyY2UtPklzQWxwaGFNYXNrKCkgJiYgKHBTb3VyY2UtPkdldEJQUCgpICE9IDEgfHwgIW1fYlN1cHBvcnRST1ApKSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENGWF9GbG9hdFJlY3QgdW5pdF9yZWN0ID0gcE1hdHJpeC0+R2V0VW5pdFJlY3QoKTsKLSAgICBGWF9SRUNUIGZ1bGxfcmVjdCA9IHVuaXRfcmVjdC5HZXRPdXR0ZXJSZWN0KCk7Ci0gICAgaWYgKEZYU1lTX2ZhYnMocE1hdHJpeC0+YikgPCAwLjVmICYmIHBNYXRyaXgtPmEgIT0gMCAmJiBGWFNZU19mYWJzKHBNYXRyaXgtPmMpIDwgMC41ZiAmJiBwTWF0cml4LT5kICE9IDApIHsKLSAgICAgICAgRlhfQk9PTCBiRmxpcFggPSBwTWF0cml4LT5hIDwgMDsKLSAgICAgICAgRlhfQk9PTCBiRmxpcFkgPSBwTWF0cml4LT5kID4gMDsKLSAgICAgICAgcmV0dXJuIFN0cmV0Y2hESUJpdHMocFNvdXJjZSwgY29sb3IsIGJGbGlwWCA/IGZ1bGxfcmVjdC5yaWdodCA6IGZ1bGxfcmVjdC5sZWZ0LCBiRmxpcFkgPyBmdWxsX3JlY3QuYm90dG9tIDogZnVsbF9yZWN0LnRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZsaXBYID8gLWZ1bGxfcmVjdC5XaWR0aCgpIDogZnVsbF9yZWN0LldpZHRoKCksIGJGbGlwWSA/IC1mdWxsX3JlY3QuSGVpZ2h0KCkgOiBmdWxsX3JlY3QuSGVpZ2h0KCksIE5VTEwsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIGJsZW5kX3R5cGUpOwotICAgIH0KLSAgICBpZiAoRlhTWVNfZmFicyhwTWF0cml4LT5hKSA8IDAuNWYgJiYgRlhTWVNfZmFicyhwTWF0cml4LT5kKSA8IDAuNWYpIHsKLSAgICAgICAgQ0ZYX0RJQml0bWFwKiBwVHJhbnNmb3JtZWQgPSBwU291cmNlLT5Td2FwWFkocE1hdHJpeC0+YyA+IDAsIHBNYXRyaXgtPmIgPCAwKTsKLSAgICAgICAgaWYgKHBUcmFuc2Zvcm1lZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfQk9PTCByZXQgPSBTdHJldGNoRElCaXRzKHBUcmFuc2Zvcm1lZCwgY29sb3IsIGZ1bGxfcmVjdC5sZWZ0LCBmdWxsX3JlY3QudG9wLCBmdWxsX3JlY3QuV2lkdGgoKSwgZnVsbF9yZWN0LkhlaWdodCgpLCBOVUxMLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSk7Ci0gICAgICAgIGRlbGV0ZSBwVHJhbnNmb3JtZWQ7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGlmIChwU291cmNlLT5HZXRCUFAoKSA9PSAxKSB7Ci0gICAgICAgIENGWF9ESUJpdG1hcCogcFRyYW5zZm9ybWVkID0gVHJhbnNmb3JtMWJwcEJpdG1hcChwU291cmNlLCBwTWF0cml4KTsKLSAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0gPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIFNhdmVTdGF0ZSgpOwotICAgICAgICBDRlhfUGF0aERhdGEgcGF0aDsKLSAgICAgICAgcGF0aC5BcHBlbmRSZWN0KDAsIDAsIDEuMGYsIDEuMGYpOwotICAgICAgICBTZXRDbGlwX1BhdGhGaWxsKCZwYXRoLCBwTWF0cml4LCBXSU5ESU5HKTsKLSAgICAgICAgRlhfQk9PTCByZXQgPSBTdHJldGNoRElCaXRzKHBUcmFuc2Zvcm1lZCwgY29sb3IsIGZ1bGxfcmVjdC5sZWZ0LCBmdWxsX3JlY3QudG9wLCBmdWxsX3JlY3QuV2lkdGgoKSwgZnVsbF9yZWN0LkhlaWdodCgpLCBOVUxMLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSk7Ci0gICAgICAgIFJlc3RvcmVTdGF0ZSgpOwotICAgICAgICBkZWxldGUgcFRyYW5zZm9ybWVkOwotICAgICAgICBoYW5kbGUgPSBOVUxMOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KKyAgICByZXR1cm4gR0RJX1N0cmV0Y2hCaXRNYXNrKHBCaXRtYXAsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2hlaWdodCwgY29sb3IsIGZsYWdzLCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSk7CisgIH0KKyAgaWYgKHBTb3VyY2UtPkhhc0FscGhhKCkpIHsKICAgICByZXR1cm4gRkFMU0U7Ci19Ci1DUFNPdXRwdXQ6OkNQU091dHB1dChIREMgaERDKQotewotICAgIG1faERDID0gaERDOwotICAgIG1fcEJ1ZiA9IE5VTEw7Ci19Ci1DUFNPdXRwdXQ6On5DUFNPdXRwdXQoKQotewotICAgIGlmIChtX3BCdWYpIHsKLSAgICAgICAgRlhfRnJlZShtX3BCdWYpOworICB9CisgIGlmIChkZXN0X3dpZHRoIDwgMCB8fCBkZXN0X2hlaWdodCA8IDApIHsKKyAgICBDRlhfRElCaXRtYXAqIHBGbGlwcGVkID0KKyAgICAgICAgcFNvdXJjZS0+RmxpcEltYWdlKGRlc3Rfd2lkdGggPCAwLCBkZXN0X2hlaWdodCA8IDApOworICAgIGlmICghcEZsaXBwZWQpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci19Ci12b2lkIENQU091dHB1dDo6SW5pdCgpCi17Ci0gICAgbV9wQnVmID0gRlhfQWxsb2MoRlhfQ0hBUiwgMTAyNik7Ci19Ci12b2lkIENQU091dHB1dDo6T3V0cHV0UFMoRlhfTFBDU1RSIHN0cmluZywgaW50IGxlbikKLXsKLSAgICBpZiAobGVuIDwgMCkgewotICAgICAgICBsZW4gPSAoaW50KUZYU1lTX3N0cmxlbihzdHJpbmcpOworICAgIGlmIChkZXN0X3dpZHRoIDwgMCkgeworICAgICAgZGVzdF9sZWZ0ICs9IGRlc3Rfd2lkdGg7CiAgICAgfQotICAgIGludCBzZW50X2xlbiA9IDA7Ci0gICAgd2hpbGUgKGxlbiA+IDApIHsKLSAgICAgICAgaW50IHNlbmRfbGVuID0gbGVuID4gMTAyNCA/IDEwMjQgOiBsZW47Ci0gICAgICAgICooRlhfV09SRCopbV9wQnVmID0gc2VuZF9sZW47Ci0gICAgICAgIEZYU1lTX21lbWNweShtX3BCdWYgKyAyLCBzdHJpbmcgKyBzZW50X2xlbiwgc2VuZF9sZW4pOwotICAgICAgICBpbnQgcmV0ID0gRXh0RXNjYXBlKG1faERDLCBQQVNTVEhST1VHSCwgc2VuZF9sZW4gKyAyLCBtX3BCdWYsIDAsIE5VTEwpOwotICAgICAgICBzZW50X2xlbiArPSBzZW5kX2xlbjsKLSAgICAgICAgbGVuIC09IHNlbmRfbGVuOworICAgIGlmIChkZXN0X2hlaWdodCA8IDApIHsKKyAgICAgIGRlc3RfdG9wICs9IGRlc3RfaGVpZ2h0OwogICAgIH0KKyAgICBGWF9CT09MIHJldCA9CisgICAgICAgIEdESV9TdHJldGNoRElCaXRzKHBGbGlwcGVkLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBhYnMoZGVzdF93aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFicyhkZXN0X2hlaWdodCksIGZsYWdzLCBwSWNjVHJhbnNmb3JtKTsKKyAgICBkZWxldGUgcEZsaXBwZWQ7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICBDRlhfRElCRXh0cmFjdG9yIHRlbXAocFNvdXJjZSk7CisgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IHRlbXA7CisgIGlmICghcEJpdG1hcCkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gR0RJX1N0cmV0Y2hESUJpdHMocEJpdG1hcCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfaGVpZ2h0LCBmbGFncywgcEljY1RyYW5zZm9ybSk7CiB9Ci1DUFNQcmludGVyRHJpdmVyOjpDUFNQcmludGVyRHJpdmVyKCkKLXsKLSAgICBtX3BQU091dHB1dCA9IE5VTEw7Ci0gICAgbV9iQ215a091dHB1dCA9IEZBTFNFOwotfQotQ1BTUHJpbnRlckRyaXZlcjo6fkNQU1ByaW50ZXJEcml2ZXIoKQotewotICAgIEVuZFJlbmRlcmluZygpOwotICAgIGlmIChtX3BQU091dHB1dCkgewotICAgICAgICBkZWxldGUgbV9wUFNPdXRwdXQ7CitzdGF0aWMgQ0ZYX0RJQml0bWFwKiBUcmFuc2Zvcm0xYnBwQml0bWFwKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBEZXN0TWF0cml4KSB7CisgIEFTU0VSVChwU3JjLT5HZXRGb3JtYXQoKSA9PSBGWERJQl8xYnBwUmdiIHx8CisgICAgICAgICBwU3JjLT5HZXRGb3JtYXQoKSA9PSBGWERJQl8xYnBwTWFzayB8fAorICAgICAgICAgcFNyYy0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfMWJwcENteWspOworICBDRlhfRElCRXh0cmFjdG9yIHNyY19iaXRtYXAocFNyYyk7CisgIENGWF9ESUJpdG1hcCogcFNyY0JpdG1hcCA9IHNyY19iaXRtYXA7CisgIGlmICghcFNyY0JpdG1hcCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGludCBzcmNfd2lkdGggPSBwU3JjQml0bWFwLT5HZXRXaWR0aCgpLCBzcmNfaGVpZ2h0ID0gcFNyY0JpdG1hcC0+R2V0SGVpZ2h0KCk7CisgIHVpbnQ4X3QqIHNyY19idWYgPSBwU3JjQml0bWFwLT5HZXRCdWZmZXIoKTsKKyAgRlhfRFdPUkQgc3JjX3BpdGNoID0gcFNyY0JpdG1hcC0+R2V0UGl0Y2goKTsKKyAgRlhfRkxPQVQgZGVzdF9hcmVhID0gcERlc3RNYXRyaXgtPkdldFVuaXRBcmVhKCk7CisgIEZYX0ZMT0FUIGFyZWFfc2NhbGUgPQorICAgICAgRlhTWVNfRGl2KChGWF9GTE9BVCkoc3JjX3dpZHRoICogc3JjX2hlaWdodCksIGRlc3RfYXJlYSk7CisgIEZYX0ZMT0FUIHNpemVfc2NhbGUgPSBGWFNZU19zcXJ0KGFyZWFfc2NhbGUpOworICBDRlhfTWF0cml4IGFkanVzdGVkX21hdHJpeCgqcERlc3RNYXRyaXgpOworICBhZGp1c3RlZF9tYXRyaXguU2NhbGUoc2l6ZV9zY2FsZSwgc2l6ZV9zY2FsZSk7CisgIENGWF9GbG9hdFJlY3QgcmVzdWx0X3JlY3RfZiA9IGFkanVzdGVkX21hdHJpeC5HZXRVbml0UmVjdCgpOworICBGWF9SRUNUIHJlc3VsdF9yZWN0ID0gcmVzdWx0X3JlY3RfZi5HZXRPdXR0ZXJSZWN0KCk7CisgIENGWF9NYXRyaXggc3JjMnJlc3VsdDsKKyAgc3JjMnJlc3VsdC5lID0gYWRqdXN0ZWRfbWF0cml4LmMgKyBhZGp1c3RlZF9tYXRyaXguZTsKKyAgc3JjMnJlc3VsdC5mID0gYWRqdXN0ZWRfbWF0cml4LmQgKyBhZGp1c3RlZF9tYXRyaXguZjsKKyAgc3JjMnJlc3VsdC5hID0gYWRqdXN0ZWRfbWF0cml4LmEgLyBwU3JjQml0bWFwLT5HZXRXaWR0aCgpOworICBzcmMycmVzdWx0LmIgPSBhZGp1c3RlZF9tYXRyaXguYiAvIHBTcmNCaXRtYXAtPkdldFdpZHRoKCk7CisgIHNyYzJyZXN1bHQuYyA9IC1hZGp1c3RlZF9tYXRyaXguYyAvIHBTcmNCaXRtYXAtPkdldEhlaWdodCgpOworICBzcmMycmVzdWx0LmQgPSAtYWRqdXN0ZWRfbWF0cml4LmQgLyBwU3JjQml0bWFwLT5HZXRIZWlnaHQoKTsKKyAgc3JjMnJlc3VsdC5UcmFuc2xhdGVJKC1yZXN1bHRfcmVjdC5sZWZ0LCAtcmVzdWx0X3JlY3QudG9wKTsKKyAgQ0ZYX01hdHJpeCByZXN1bHQyc3JjOworICByZXN1bHQyc3JjLlNldFJldmVyc2Uoc3JjMnJlc3VsdCk7CisgIENQREZfRml4ZWRNYXRyaXggcmVzdWx0MnNyY19maXgocmVzdWx0MnNyYywgOCk7CisgIGludCByZXN1bHRfd2lkdGggPSByZXN1bHRfcmVjdC5XaWR0aCgpOworICBpbnQgcmVzdWx0X2hlaWdodCA9IHJlc3VsdF9yZWN0LkhlaWdodCgpOworICBDRlhfRElCaXRtYXAqIHBUZW1wQml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsKKyAgaWYgKCFwVGVtcEJpdG1hcC0+Q3JlYXRlKHJlc3VsdF93aWR0aCwgcmVzdWx0X2hlaWdodCwgcFNyYy0+R2V0Rm9ybWF0KCkpKSB7CisgICAgZGVsZXRlIHBUZW1wQml0bWFwOworICAgIGlmIChwU3JjQml0bWFwICE9IHNyY19iaXRtYXApIHsKKyAgICAgIGRlbGV0ZSBwU3JjQml0bWFwOwogICAgIH0KLX0KLUZYX0JPT0wgQ1BTUHJpbnRlckRyaXZlcjo6SW5pdChIREMgaERDLCBpbnQgcHNsZXZlbCwgRlhfQk9PTCBiQ215a091dHB1dCkKLXsKLSAgICBtX2hEQyA9IGhEQzsKLSAgICBtX0hvcnpTaXplID0gOjpHZXREZXZpY2VDYXBzKG1faERDLCBIT1JaU0laRSk7Ci0gICAgbV9WZXJ0U2l6ZSA9IDo6R2V0RGV2aWNlQ2FwcyhtX2hEQywgVkVSVFNJWkUpOwotICAgIG1fV2lkdGggPSA6OkdldERldmljZUNhcHMobV9oREMsIEhPUlpSRVMpOwotICAgIG1fSGVpZ2h0ID0gOjpHZXREZXZpY2VDYXBzKG1faERDLCBWRVJUUkVTKTsKLSAgICBtX25CaXRzUGVyUGl4ZWwgPSA6OkdldERldmljZUNhcHMobV9oREMsIEJJVFNQSVhFTCk7Ci0gICAgbV9wUFNPdXRwdXQgPSBuZXcgQ1BTT3V0cHV0KGhEQyk7Ci0gICAgKChDUFNPdXRwdXQqKW1fcFBTT3V0cHV0KS0+SW5pdCgpOwotICAgIG1fUFNSZW5kZXJlci5Jbml0KG1fcFBTT3V0cHV0LCBwc2xldmVsLCBtX1dpZHRoLCBtX0hlaWdodCwgYkNteWtPdXRwdXQpOwotICAgIG1fYkNteWtPdXRwdXQgPSBiQ215a091dHB1dDsKLSAgICBIUkdOIGhSZ24gPSA6OkNyZWF0ZVJlY3RSZ24oMCwgMCwgMSwgMSk7Ci0gICAgaW50IHJldCA9IDo6R2V0Q2xpcFJnbihoREMsIGhSZ24pOwotICAgIGlmIChyZXQgPT0gMSkgewotICAgICAgICByZXQgPSA6OkdldFJlZ2lvbkRhdGEoaFJnbiwgMCwgTlVMTCk7Ci0gICAgICAgIGlmIChyZXQpIHsKLSAgICAgICAgICAgIFJHTkRBVEEqIHBEYXRhID0gKFJHTkRBVEEqKUZYX0FsbG9jKEZYX0JZVEUsIHJldCk7Ci0gICAgICAgICAgICByZXQgPSA6OkdldFJlZ2lvbkRhdGEoaFJnbiwgcmV0LCBwRGF0YSk7Ci0gICAgICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGg7Ci0gICAgICAgICAgICAgICAgcGF0aC5BbGxvY1BvaW50Q291bnQocERhdGEtPnJkaC5uQ291bnQgKiA1KTsKLSAgICAgICAgICAgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcERhdGEtPnJkaC5uQ291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgICAgICAgICAgUkVDVCogcFJlY3QgPSAoUkVDVCopKHBEYXRhLT5CdWZmZXIgKyBwRGF0YS0+cmRoLm5SZ25TaXplICogaSk7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGguQXBwZW5kUmVjdCgoRlhfRkxPQVQpcFJlY3QtPmxlZnQsIChGWF9GTE9BVClwUmVjdC0+Ym90dG9tLCAoRlhfRkxPQVQpcFJlY3QtPnJpZ2h0LCAoRlhfRkxPQVQpcFJlY3QtPnRvcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1fUFNSZW5kZXJlci5TZXRDbGlwX1BhdGhGaWxsKCZwYXRoLCBOVUxMLCBGWEZJTExfV0lORElORyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9GcmVlKHBEYXRhKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBwVGVtcEJpdG1hcC0+Q29weVBhbGV0dGUocFNyYy0+R2V0UGFsZXR0ZSgpKTsKKyAgdWludDhfdCogZGVzdF9idWYgPSBwVGVtcEJpdG1hcC0+R2V0QnVmZmVyKCk7CisgIGludCBkZXN0X3BpdGNoID0gcFRlbXBCaXRtYXAtPkdldFBpdGNoKCk7CisgIEZYU1lTX21lbXNldChkZXN0X2J1ZiwgcFNyYy0+SXNBbHBoYU1hc2soKSA/IDAgOiAweGZmLAorICAgICAgICAgICAgICAgZGVzdF9waXRjaCAqIHJlc3VsdF9oZWlnaHQpOworICBpZiAocFNyY0JpdG1hcC0+SXNBbHBoYU1hc2soKSkgeworICAgIGZvciAoaW50IGRlc3RfeSA9IDA7IGRlc3RfeSA8IHJlc3VsdF9oZWlnaHQ7IGRlc3RfeSsrKSB7CisgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIGRlc3RfeSAqIGRlc3RfcGl0Y2g7CisgICAgICBmb3IgKGludCBkZXN0X3ggPSAwOyBkZXN0X3ggPCByZXN1bHRfd2lkdGg7IGRlc3RfeCsrKSB7CisgICAgICAgIGludCBzcmNfeCwgc3JjX3k7CisgICAgICAgIHJlc3VsdDJzcmNfZml4LlRyYW5zZm9ybShkZXN0X3gsIGRlc3RfeSwgc3JjX3gsIHNyY195KTsKKyAgICAgICAgaWYgKHNyY194IDwgMCB8fCBzcmNfeCA+PSBzcmNfd2lkdGggfHwgc3JjX3kgPCAwIHx8CisgICAgICAgICAgICBzcmNfeSA+PSBzcmNfaGVpZ2h0KSB7CisgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKCEoKHNyY19idWYgKyBzcmNfcGl0Y2ggKiBzcmNfeSlbc3JjX3ggLyA4XSAmCisgICAgICAgICAgICAgICgxIDw8ICg3IC0gc3JjX3ggJSA4KSkpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZGVzdF9zY2FuW2Rlc3RfeCAvIDhdIHw9IDEgPDwgKDcgLSBkZXN0X3ggJSA4KTsKKyAgICAgIH0KICAgICB9Ci0gICAgOjpEZWxldGVPYmplY3QoaFJnbik7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1pbnQgQ1BTUHJpbnRlckRyaXZlcjo6R2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCkKLXsKLSAgICBzd2l0Y2ggKGNhcHNfaWQpIHsKLSAgICAgICAgY2FzZSBGWERDX0RFVklDRV9DTEFTUzoKLSAgICAgICAgICAgIHJldHVybiBGWERDX1BSSU5URVI7Ci0gICAgICAgIGNhc2UgRlhEQ19QSVhFTF9XSURUSDoKLSAgICAgICAgICAgIHJldHVybiBtX1dpZHRoOwotICAgICAgICBjYXNlIEZYRENfUElYRUxfSEVJR0hUOgotICAgICAgICAgICAgcmV0dXJuIG1fSGVpZ2h0OwotICAgICAgICBjYXNlIEZYRENfQklUU19QSVhFTDoKLSAgICAgICAgICAgIHJldHVybiBtX25CaXRzUGVyUGl4ZWw7Ci0gICAgICAgIGNhc2UgRlhEQ19SRU5ERVJfQ0FQUzoKLSAgICAgICAgICAgIHJldHVybiBtX2JDbXlrT3V0cHV0ID8gRlhSQ19CSVRfTUFTSyB8IEZYUkNfQ01ZS19PVVRQVVQgOiBGWFJDX0JJVF9NQVNLOwotICAgICAgICBjYXNlIEZYRENfSE9SWl9TSVpFOgotICAgICAgICAgICAgcmV0dXJuIG1fSG9yelNpemU7Ci0gICAgICAgIGNhc2UgRlhEQ19WRVJUX1NJWkU6Ci0gICAgICAgICAgICByZXR1cm4gbV9WZXJ0U2l6ZTsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCBkZXN0X3kgPSAwOyBkZXN0X3kgPCByZXN1bHRfaGVpZ2h0OyBkZXN0X3krKykgeworICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyBkZXN0X3kgKiBkZXN0X3BpdGNoOworICAgICAgZm9yIChpbnQgZGVzdF94ID0gMDsgZGVzdF94IDwgcmVzdWx0X3dpZHRoOyBkZXN0X3grKykgeworICAgICAgICBpbnQgc3JjX3gsIHNyY195OworICAgICAgICByZXN1bHQyc3JjX2ZpeC5UcmFuc2Zvcm0oZGVzdF94LCBkZXN0X3ksIHNyY194LCBzcmNfeSk7CisgICAgICAgIGlmIChzcmNfeCA8IDAgfHwgc3JjX3ggPj0gc3JjX3dpZHRoIHx8IHNyY195IDwgMCB8fAorICAgICAgICAgICAgc3JjX3kgPj0gc3JjX2hlaWdodCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgoc3JjX2J1ZiArIHNyY19waXRjaCAqIHNyY195KVtzcmNfeCAvIDhdICYgKDEgPDwgKDcgLSBzcmNfeCAlIDgpKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGRlc3Rfc2NhbltkZXN0X3ggLyA4XSAmPSB+KDEgPDwgKDcgLSBkZXN0X3ggJSA4KSk7CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiAwOworICB9CisgIGlmIChwU3JjQml0bWFwICE9IHNyY19iaXRtYXApIHsKKyAgICBkZWxldGUgcFNyY0JpdG1hcDsKKyAgfQorICByZXR1cm4gcFRlbXBCaXRtYXA7CiB9Ci1GWF9CT09MIENQU1ByaW50ZXJEcml2ZXI6OlN0YXJ0UmVuZGVyaW5nKCkKLXsKLSAgICByZXR1cm4gbV9QU1JlbmRlcmVyLlN0YXJ0UmVuZGVyaW5nKCk7Ci19Ci12b2lkIENQU1ByaW50ZXJEcml2ZXI6OkVuZFJlbmRlcmluZygpCi17Ci0gICAgbV9QU1JlbmRlcmVyLkVuZFJlbmRlcmluZygpOwotfQotdm9pZCBDUFNQcmludGVyRHJpdmVyOjpTYXZlU3RhdGUoKQotewotICAgIG1fUFNSZW5kZXJlci5TYXZlU3RhdGUoKTsKLX0KLXZvaWQgQ1BTUHJpbnRlckRyaXZlcjo6UmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCkKLXsKLSAgICBtX1BTUmVuZGVyZXIuUmVzdG9yZVN0YXRlKGJLZWVwU2F2ZWQpOwotfQotRlhfQk9PTAlDUFNQcmludGVyRHJpdmVyOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgaW50IGZpbGxfbW9kZSkKLXsKLSAgICBtX1BTUmVuZGVyZXIuU2V0Q2xpcF9QYXRoRmlsbChwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlLCBmaWxsX21vZGUpOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTAlDUFNQcmludGVyRHJpdmVyOjpTZXRDbGlwX1BhdGhTdHJva2UoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCi0gICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlKQotewotICAgIG1fUFNSZW5kZXJlci5TZXRDbGlwX1BhdGhTdHJva2UocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSwgcEdyYXBoU3RhdGUpOwotICAgIHJldHVybiBUUlVFOwotfQotRlhfQk9PTAlDUFNQcmludGVyRHJpdmVyOjpEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsIEZYX0FSR0IgZmlsbF9jb2xvciwgRlhfQVJHQiBzdHJva2VfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUsIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSkKLXsKLSAgICBpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDR2RpUHJpbnRlckRyaXZlcjo6U3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCByZW5kZXJfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgaWYgKGJpdG1hcF9hbHBoYSA8IDI1NSB8fCBwU291cmNlLT5IYXNBbHBoYSgpIHx8CisgICAgICAocFNvdXJjZS0+SXNBbHBoYU1hc2soKSAmJiAocFNvdXJjZS0+R2V0QlBQKCkgIT0gMSB8fCAhbV9iU3VwcG9ydFJPUCkpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENGWF9GbG9hdFJlY3QgdW5pdF9yZWN0ID0gcE1hdHJpeC0+R2V0VW5pdFJlY3QoKTsKKyAgRlhfUkVDVCBmdWxsX3JlY3QgPSB1bml0X3JlY3QuR2V0T3V0dGVyUmVjdCgpOworICBpZiAoRlhTWVNfZmFicyhwTWF0cml4LT5iKSA8IDAuNWYgJiYgcE1hdHJpeC0+YSAhPSAwICYmCisgICAgICBGWFNZU19mYWJzKHBNYXRyaXgtPmMpIDwgMC41ZiAmJiBwTWF0cml4LT5kICE9IDApIHsKKyAgICBGWF9CT09MIGJGbGlwWCA9IHBNYXRyaXgtPmEgPCAwOworICAgIEZYX0JPT0wgYkZsaXBZID0gcE1hdHJpeC0+ZCA+IDA7CisgICAgcmV0dXJuIFN0cmV0Y2hESUJpdHMocFNvdXJjZSwgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgYkZsaXBYID8gZnVsbF9yZWN0LnJpZ2h0IDogZnVsbF9yZWN0LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYkZsaXBZID8gZnVsbF9yZWN0LmJvdHRvbSA6IGZ1bGxfcmVjdC50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgYkZsaXBYID8gLWZ1bGxfcmVjdC5XaWR0aCgpIDogZnVsbF9yZWN0LldpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgYkZsaXBZID8gLWZ1bGxfcmVjdC5IZWlnaHQoKSA6IGZ1bGxfcmVjdC5IZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKTsKKyAgfQorICBpZiAoRlhTWVNfZmFicyhwTWF0cml4LT5hKSA8IDAuNWYgJiYgRlhTWVNfZmFicyhwTWF0cml4LT5kKSA8IDAuNWYpIHsKKyAgICBDRlhfRElCaXRtYXAqIHBUcmFuc2Zvcm1lZCA9CisgICAgICAgIHBTb3VyY2UtPlN3YXBYWShwTWF0cml4LT5jID4gMCwgcE1hdHJpeC0+YiA8IDApOworICAgIGlmICghcFRyYW5zZm9ybWVkKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIHJldHVybiBtX1BTUmVuZGVyZXIuRHJhd1BhdGgocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSwgcEdyYXBoU3RhdGUsIGZpbGxfY29sb3IsIHN0cm9rZV9jb2xvciwgZmlsbF9tb2RlICYgMywgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7Ci19Ci1GWF9CT09MIENQU1ByaW50ZXJEcml2ZXI6OkdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpCi17Ci0gICAgKnBSZWN0ID0gbV9QU1JlbmRlcmVyLkdldENsaXBCb3goKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wgQ1BTUHJpbnRlckRyaXZlcjo6U2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsIGludCBibGVuZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0pCi17Ci0gICAgaWYgKGJsZW5kX3R5cGUgIT0gRlhESUJfQkxFTkRfTk9STUFMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKKyAgICBGWF9CT09MIHJldCA9IFN0cmV0Y2hESUJpdHMoCisgICAgICAgIHBUcmFuc2Zvcm1lZCwgY29sb3IsIGZ1bGxfcmVjdC5sZWZ0LCBmdWxsX3JlY3QudG9wLCBmdWxsX3JlY3QuV2lkdGgoKSwKKyAgICAgICAgZnVsbF9yZWN0LkhlaWdodCgpLCBOVUxMLCAwLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtLCBibGVuZF90eXBlKTsKKyAgICBkZWxldGUgcFRyYW5zZm9ybWVkOworICAgIHJldHVybiByZXQ7CisgIH0KKyAgaWYgKHBTb3VyY2UtPkdldEJQUCgpID09IDEpIHsKKyAgICBDRlhfRElCaXRtYXAqIHBUcmFuc2Zvcm1lZCA9IFRyYW5zZm9ybTFicHBCaXRtYXAocFNvdXJjZSwgcE1hdHJpeCk7CisgICAgaWYgKCFwSWNjVHJhbnNmb3JtKSB7CisgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIHJldHVybiBtX1BTUmVuZGVyZXIuU2V0RElCaXRzKHBCaXRtYXAsIGNvbG9yLCBsZWZ0LCB0b3AsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwotfQotRlhfQk9PTCBDUFNQcmludGVyRHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIEZYX0RXT1JEIGNvbG9yLCBpbnQgZGVzdF9sZWZ0LCBpbnQgZGVzdF90b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBGWF9EV09SRCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpCi17Ci0gICAgaWYgKGJsZW5kX3R5cGUgIT0gRlhESUJfQkxFTkRfTk9STUFMKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIG1fUFNSZW5kZXJlci5TdHJldGNoRElCaXRzKHBCaXRtYXAsIGNvbG9yLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgZmxhZ3MsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOwotfQotRlhfQk9PTAlDUFNQcmludGVyRHJpdmVyOjpTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgYml0bWFwX2FscGhhLCBGWF9EV09SRCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgRlhfRFdPUkQgcmVuZGVyX2ZsYWdzLCBGWF9MUFZPSUQmIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKQotewotICAgIGlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChiaXRtYXBfYWxwaGEgPCAyNTUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KKyAgICBTYXZlU3RhdGUoKTsKKyAgICBDRlhfUGF0aERhdGEgcGF0aDsKKyAgICBwYXRoLkFwcGVuZFJlY3QoMCwgMCwgMS4wZiwgMS4wZik7CisgICAgU2V0Q2xpcF9QYXRoRmlsbCgmcGF0aCwgcE1hdHJpeCwgV0lORElORyk7CisgICAgRlhfQk9PTCByZXQgPSBTdHJldGNoRElCaXRzKAorICAgICAgICBwVHJhbnNmb3JtZWQsIGNvbG9yLCBmdWxsX3JlY3QubGVmdCwgZnVsbF9yZWN0LnRvcCwgZnVsbF9yZWN0LldpZHRoKCksCisgICAgICAgIGZ1bGxfcmVjdC5IZWlnaHQoKSwgTlVMTCwgMCwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSwgYmxlbmRfdHlwZSk7CisgICAgUmVzdG9yZVN0YXRlKCk7CisgICAgZGVsZXRlIHBUcmFuc2Zvcm1lZDsKICAgICBoYW5kbGUgPSBOVUxMOwotICAgIHJldHVybiBtX1BTUmVuZGVyZXIuRHJhd0RJQml0cyhwQml0bWFwLCBjb2xvciwgcE1hdHJpeCwgcmVuZGVyX2ZsYWdzLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKKyAgICByZXR1cm4gcmV0OworICB9CisgIHJldHVybiBGQUxTRTsKIH0KLUZYX0JPT0wJQ1BTUHJpbnRlckRyaXZlcjo6RHJhd0RldmljZVRleHQoaW50IG5DaGFycywgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLCBDRlhfRm9udCogcEZvbnQsCi0gICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsIEZYX0ZMT0FUIGZvbnRfc2l6ZSwgRlhfRFdPUkQgY29sb3IsCi0gICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKQotewotICAgIHJldHVybiBtX1BTUmVuZGVyZXIuRHJhd1RleHQobkNoYXJzLCBwQ2hhclBvcywgcEZvbnQsIHBDYWNoZSwgcE9iamVjdDJEZXZpY2UsIGZvbnRfc2l6ZSwgY29sb3IsIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOworQ1BTT3V0cHV0OjpDUFNPdXRwdXQoSERDIGhEQykgeworICBtX2hEQyA9IGhEQzsKKyAgbV9wQnVmID0gTlVMTDsKK30KK0NQU091dHB1dDo6fkNQU091dHB1dCgpIHsKKyAgRlhfRnJlZShtX3BCdWYpOworfQordm9pZCBDUFNPdXRwdXQ6OkluaXQoKSB7CisgIG1fcEJ1ZiA9IEZYX0FsbG9jKEZYX0NIQVIsIDEwMjYpOworfQordm9pZCBDUFNPdXRwdXQ6Ok91dHB1dFBTKGNvbnN0IEZYX0NIQVIqIHN0cmluZywgaW50IGxlbikgeworICBpZiAobGVuIDwgMCkgeworICAgIGxlbiA9IChpbnQpRlhTWVNfc3RybGVuKHN0cmluZyk7CisgIH0KKyAgaW50IHNlbnRfbGVuID0gMDsKKyAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICBpbnQgc2VuZF9sZW4gPSBsZW4gPiAxMDI0ID8gMTAyNCA6IGxlbjsKKyAgICAqKEZYX1dPUkQqKW1fcEJ1ZiA9IHNlbmRfbGVuOworICAgIEZYU1lTX21lbWNweShtX3BCdWYgKyAyLCBzdHJpbmcgKyBzZW50X2xlbiwgc2VuZF9sZW4pOworICAgIEV4dEVzY2FwZShtX2hEQywgUEFTU1RIUk9VR0gsIHNlbmRfbGVuICsgMiwgbV9wQnVmLCAwLCBOVUxMKTsKKyAgICBzZW50X2xlbiArPSBzZW5kX2xlbjsKKyAgICBsZW4gLT0gc2VuZF9sZW47CisgIH0KK30KK0NQU1ByaW50ZXJEcml2ZXI6OkNQU1ByaW50ZXJEcml2ZXIoKSB7CisgIG1fcFBTT3V0cHV0ID0gTlVMTDsKKyAgbV9iQ215a091dHB1dCA9IEZBTFNFOworfQorQ1BTUHJpbnRlckRyaXZlcjo6fkNQU1ByaW50ZXJEcml2ZXIoKSB7CisgIEVuZFJlbmRlcmluZygpOworICBkZWxldGUgbV9wUFNPdXRwdXQ7Cit9CitGWF9CT09MIENQU1ByaW50ZXJEcml2ZXI6OkluaXQoSERDIGhEQywgaW50IHBzbGV2ZWwsIEZYX0JPT0wgYkNteWtPdXRwdXQpIHsKKyAgbV9oREMgPSBoREM7CisgIG1fSG9yelNpemUgPSA6OkdldERldmljZUNhcHMobV9oREMsIEhPUlpTSVpFKTsKKyAgbV9WZXJ0U2l6ZSA9IDo6R2V0RGV2aWNlQ2FwcyhtX2hEQywgVkVSVFNJWkUpOworICBtX1dpZHRoID0gOjpHZXREZXZpY2VDYXBzKG1faERDLCBIT1JaUkVTKTsKKyAgbV9IZWlnaHQgPSA6OkdldERldmljZUNhcHMobV9oREMsIFZFUlRSRVMpOworICBtX25CaXRzUGVyUGl4ZWwgPSA6OkdldERldmljZUNhcHMobV9oREMsIEJJVFNQSVhFTCk7CisgIG1fcFBTT3V0cHV0ID0gbmV3IENQU091dHB1dChoREMpOworICAoKENQU091dHB1dCopbV9wUFNPdXRwdXQpLT5Jbml0KCk7CisgIG1fUFNSZW5kZXJlci5Jbml0KG1fcFBTT3V0cHV0LCBwc2xldmVsLCBtX1dpZHRoLCBtX0hlaWdodCwgYkNteWtPdXRwdXQpOworICBtX2JDbXlrT3V0cHV0ID0gYkNteWtPdXRwdXQ7CisgIEhSR04gaFJnbiA9IDo6Q3JlYXRlUmVjdFJnbigwLCAwLCAxLCAxKTsKKyAgaW50IHJldCA9IDo6R2V0Q2xpcFJnbihoREMsIGhSZ24pOworICBpZiAocmV0ID09IDEpIHsKKyAgICByZXQgPSA6OkdldFJlZ2lvbkRhdGEoaFJnbiwgMCwgTlVMTCk7CisgICAgaWYgKHJldCkgeworICAgICAgUkdOREFUQSogcERhdGEgPSAoUkdOREFUQSopRlhfQWxsb2ModWludDhfdCwgcmV0KTsKKyAgICAgIHJldCA9IDo6R2V0UmVnaW9uRGF0YShoUmduLCByZXQsIHBEYXRhKTsKKyAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGg7CisgICAgICAgIHBhdGguQWxsb2NQb2ludENvdW50KHBEYXRhLT5yZGgubkNvdW50ICogNSk7CisgICAgICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwRGF0YS0+cmRoLm5Db3VudDsgaSsrKSB7CisgICAgICAgICAgUkVDVCogcFJlY3QgPSAoUkVDVCopKHBEYXRhLT5CdWZmZXIgKyBwRGF0YS0+cmRoLm5SZ25TaXplICogaSk7CisgICAgICAgICAgcGF0aC5BcHBlbmRSZWN0KChGWF9GTE9BVClwUmVjdC0+bGVmdCwgKEZYX0ZMT0FUKXBSZWN0LT5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClwUmVjdC0+cmlnaHQsIChGWF9GTE9BVClwUmVjdC0+dG9wKTsKKyAgICAgICAgfQorICAgICAgICBtX1BTUmVuZGVyZXIuU2V0Q2xpcF9QYXRoRmlsbCgmcGF0aCwgTlVMTCwgRlhGSUxMX1dJTkRJTkcpOworICAgICAgfQorICAgICAgRlhfRnJlZShwRGF0YSk7CisgICAgfQorICB9CisgIDo6RGVsZXRlT2JqZWN0KGhSZ24pOworICByZXR1cm4gVFJVRTsKK30KK2ludCBDUFNQcmludGVyRHJpdmVyOjpHZXREZXZpY2VDYXBzKGludCBjYXBzX2lkKSB7CisgIHN3aXRjaCAoY2Fwc19pZCkgeworICAgIGNhc2UgRlhEQ19ERVZJQ0VfQ0xBU1M6CisgICAgICByZXR1cm4gRlhEQ19QUklOVEVSOworICAgIGNhc2UgRlhEQ19QSVhFTF9XSURUSDoKKyAgICAgIHJldHVybiBtX1dpZHRoOworICAgIGNhc2UgRlhEQ19QSVhFTF9IRUlHSFQ6CisgICAgICByZXR1cm4gbV9IZWlnaHQ7CisgICAgY2FzZSBGWERDX0JJVFNfUElYRUw6CisgICAgICByZXR1cm4gbV9uQml0c1BlclBpeGVsOworICAgIGNhc2UgRlhEQ19SRU5ERVJfQ0FQUzoKKyAgICAgIHJldHVybiBtX2JDbXlrT3V0cHV0ID8gRlhSQ19CSVRfTUFTSyB8IEZYUkNfQ01ZS19PVVRQVVQgOiBGWFJDX0JJVF9NQVNLOworICAgIGNhc2UgRlhEQ19IT1JaX1NJWkU6CisgICAgICByZXR1cm4gbV9Ib3J6U2l6ZTsKKyAgICBjYXNlIEZYRENfVkVSVF9TSVpFOgorICAgICAgcmV0dXJuIG1fVmVydFNpemU7CisgIH0KKyAgcmV0dXJuIDA7Cit9CitGWF9CT09MIENQU1ByaW50ZXJEcml2ZXI6OlN0YXJ0UmVuZGVyaW5nKCkgeworICByZXR1cm4gbV9QU1JlbmRlcmVyLlN0YXJ0UmVuZGVyaW5nKCk7Cit9Cit2b2lkIENQU1ByaW50ZXJEcml2ZXI6OkVuZFJlbmRlcmluZygpIHsKKyAgbV9QU1JlbmRlcmVyLkVuZFJlbmRlcmluZygpOworfQordm9pZCBDUFNQcmludGVyRHJpdmVyOjpTYXZlU3RhdGUoKSB7CisgIG1fUFNSZW5kZXJlci5TYXZlU3RhdGUoKTsKK30KK3ZvaWQgQ1BTUHJpbnRlckRyaXZlcjo6UmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCkgeworICBtX1BTUmVuZGVyZXIuUmVzdG9yZVN0YXRlKGJLZWVwU2F2ZWQpOworfQorRlhfQk9PTCBDUFNQcmludGVyRHJpdmVyOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUpIHsKKyAgbV9QU1JlbmRlcmVyLlNldENsaXBfUGF0aEZpbGwocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSwgZmlsbF9tb2RlKTsKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENQU1ByaW50ZXJEcml2ZXI6OlNldENsaXBfUGF0aFN0cm9rZSgKKyAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlKSB7CisgIG1fUFNSZW5kZXJlci5TZXRDbGlwX1BhdGhTdHJva2UocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSwgcEdyYXBoU3RhdGUpOworICByZXR1cm4gVFJVRTsKK30KK0ZYX0JPT0wgQ1BTUHJpbnRlckRyaXZlcjo6RHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGZpbGxfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0Igc3Ryb2tlX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgaWYgKGJsZW5kX3R5cGUgIT0gRlhESUJfQkxFTkRfTk9STUFMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBtX1BTUmVuZGVyZXIuRHJhd1BhdGgocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSwgcEdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9jb2xvciwgc3Ryb2tlX2NvbG9yLCBmaWxsX21vZGUgJiAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pOworfQorRlhfQk9PTCBDUFNQcmludGVyRHJpdmVyOjpHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KSB7CisgICpwUmVjdCA9IG1fUFNSZW5kZXJlci5HZXRDbGlwQm94KCk7CisgIHJldHVybiBUUlVFOworfQorRlhfQk9PTCBDUFNQcmludGVyRHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgeworICBpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIG1fUFNSZW5kZXJlci5TZXRESUJpdHMocEJpdG1hcCwgY29sb3IsIGxlZnQsIHRvcCwgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSk7Cit9CitGWF9CT09MIENQU1ByaW50ZXJEcml2ZXI6OlN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgaWYgKGJsZW5kX3R5cGUgIT0gRlhESUJfQkxFTkRfTk9STUFMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBtX1BTUmVuZGVyZXIuU3RyZXRjaERJQml0cyhwQml0bWFwLCBjb2xvciwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBmbGFncywgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJY2NUcmFuc2Zvcm0pOworfQorRlhfQk9PTCBDUFNQcmludGVyRHJpdmVyOjpTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgcmVuZGVyX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgaWYgKGJsZW5kX3R5cGUgIT0gRlhESUJfQkxFTkRfTk9STUFMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmIChiaXRtYXBfYWxwaGEgPCAyNTUpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaGFuZGxlID0gTlVMTDsKKyAgcmV0dXJuIG1fUFNSZW5kZXJlci5EcmF3RElCaXRzKHBCaXRtYXAsIGNvbG9yLCBwTWF0cml4LCByZW5kZXJfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKTsKK30KK0ZYX0JPT0wgQ1BTUHJpbnRlckRyaXZlcjo6RHJhd0RldmljZVRleHQoaW50IG5DaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7CisgIHJldHVybiBtX1BTUmVuZGVyZXIuRHJhd1RleHQobkNoYXJzLCBwQ2hhclBvcywgcEZvbnQsIHBDYWNoZSwgcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udF9zaXplLCBjb2xvciwgYWxwaGFfZmxhZywgcEljY1RyYW5zZm9ybSk7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvd2luMzJfaW50LmggYi9jb3JlL3NyYy9meGdlL3dpbjMyL3dpbjMyX2ludC5oCmluZGV4IDdjNWMwNzIuLjA2MTY0NzYgMTAwNjQ0Ci0tLSBhL2NvcmUvc3JjL2Z4Z2Uvd2luMzIvd2luMzJfaW50LmgKKysrIGIvY29yZS9zcmMvZnhnZS93aW4zMi93aW4zMl9pbnQuaApAQCAtMSwyNDIgKzEsMzY5IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKICNpZm5kZWYgQ09SRV9TUkNfRlhHRV9XSU4zMl9XSU4zMl9JTlRfSF8KICNkZWZpbmUgQ09SRV9TUkNfRlhHRV9XSU4zMl9XSU4zMl9JTlRfSF8KIAotc3RydWN0ICBXSU5ESUJfT3Blbl9BcmdzXzsKLWNsYXNzIENHZGlwbHVzRXh0Ci17Ci1wdWJsaWM6Ci0gICAgQ0dkaXBsdXNFeHQoKTsKLSAgICB+Q0dkaXBsdXNFeHQoKTsKLSAgICB2b2lkCQkJTG9hZCgpOwotICAgIEZYX0JPT0wJCQlJc0F2YWlsYWJsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9oTW9kdWxlICE9IE5VTEw7Ci0gICAgfQotICAgIEZYX0JPT0wJCQlTdHJldGNoQml0TWFzayhIREMgaERDLCBCT09MIGJNb25vRGV2aWNlLCBjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsIGludCBkZXN0X2hlaWdodCwgRlhfRFdPUkQgYXJnYiwgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LCBpbnQgZmxhZ3MpOwotICAgIEZYX0JPT0wJCQlTdHJldGNoRElCaXRzKEhEQyBoREMsIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgaW50IGZsYWdzKTsKLSAgICBGWF9CT09MCQkJRHJhd1BhdGgoSERDIGhEQywgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2FyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0cm9rZV9hcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlCi0gICAgICAgICAgICAgICAgICAgICAgKTsKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9nZS5oIgogCi0gICAgdm9pZCoJCQlMb2FkTWVtRm9udChGWF9CWVRFKiBwRGF0YSwgRlhfRFdPUkQgc2l6ZSk7Ci0gICAgdm9pZAkJCURlbGV0ZU1lbUZvbnQodm9pZCogcEZvbnRDb2xsZWN0aW9uKTsKLSAgICBGWF9CT09MICAgICAgICAgR2RpcENyZWF0ZUZyb21JbWFnZSh2b2lkKiBiaXRtYXAsIHZvaWQqKiBncmFwaGljcyk7Ci0gICAgdm9pZCAgICAgICAgICAgIEdkaXBEZWxldGVHcmFwaGljcyh2b2lkKiBncmFwaGljcyk7Ci0gICAgdm9pZCAgICAgICAgICAgIEdkaXBTZXRUZXh0UmVuZGVyaW5nSGludCh2b2lkKiBncmFwaGljcywgaW50IG1vZGUpOwotICAgIHZvaWQgICAgICAgICAgICBHZGlwU2V0UGFnZVVuaXQodm9pZCogZ3JhcGhpY3MsIEZYX0RXT1JEIHVuaXQpOwotICAgIHZvaWQgICAgICAgICAgICBHZGlwU2V0V29ybGRUcmFuc2Zvcm0odm9pZCogZ3JhcGhpY3MsIHZvaWQqIHBNYXRyaXgpOwotICAgIEZYX0JPT0wgICAgICAgICBHZGlwRHJhd0RyaXZlclN0cmluZyh2b2lkICpncmFwaGljcywgIHVuc2lnbmVkIHNob3J0ICp0ZXh0LCBpbnQgbGVuZ3RoLCB2b2lkICpmb250LCB2b2lkKiBicnVzaCwgdm9pZCAqcG9zaXRpb25zLCBpbnQgZmxhZ3MsIGNvbnN0IHZvaWQgKm1hdHJpeCk7Ci0gICAgdm9pZCAgICAgICAgICAgIEdkaXBDcmVhdGVCcnVzaChGWF9EV09SRCBmaWxsX2FyZ2IsIHZvaWQqKiBwQnJ1c2gpOwotICAgIHZvaWQgICAgICAgICAgICBHZGlwRGVsZXRlQnJ1c2godm9pZCogcEJydXNoKTsKLSAgICB2b2lkICAgICAgICAgICAgR2RpcENyZWF0ZU1hdHJpeChGWF9GTE9BVCBhLCBGWF9GTE9BVCBiLCBGWF9GTE9BVCBjLCBGWF9GTE9BVCBkLCBGWF9GTE9BVCBlLCBGWF9GTE9BVCBmLCB2b2lkKiogbWF0cml4KTsKLSAgICB2b2lkICAgICAgICAgICAgR2RpcERlbGV0ZU1hdHJpeCh2b2lkKiBtYXRyaXgpOwotICAgIEZYX0JPT0wgICAgICAgICBHZGlwQ3JlYXRlRm9udEZhbWlseUZyb21OYW1lKEZYX0xQQ1dTVFIgbmFtZSwgdm9pZCogcEZvbnRDb2xsZWN0aW9uLCB2b2lkKipwRmFtaWx5KTsKLSAgICB2b2lkICAgICAgICAgICAgR2RpcERlbGV0ZUZvbnRGYW1pbHkodm9pZCogcEZhbWlseSk7Ci0gICAgRlhfQk9PTCAgICAgICAgIEdkaXBDcmVhdGVGb250RnJvbUZhbWlseSh2b2lkKiBwRmFtaWx5LCBGWF9GTE9BVCBmb250X3NpemUsIGludCBmb250c3R5bGUsIGludCBmbGFnLCB2b2lkKiogcEZvbnQpOwotICAgIHZvaWQqICAgICAgICAgICBHZGlwQ3JlYXRlRm9udEZyb21Db2xsZWN0aW9uKHZvaWQqIHBGb250Q29sbGVjdGlvbiwgRlhfRkxPQVQgZm9udF9zaXplLCBpbnQgZm9udHN0eWxlKTsKLSAgICB2b2lkICAgICAgICAgICAgR2RpcERlbGV0ZUZvbnQodm9pZCogcEZvbnQpOwotICAgIEZYX0JPT0wgICAgICAgICBHZGlwQ3JlYXRlQml0bWFwKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgdm9pZCoqYml0bWFwKTsKLSAgICB2b2lkICAgICAgICAgICAgR2RpcERpc3Bvc2VJbWFnZSh2b2lkKiBiaXRtYXApOwotICAgIHZvaWQgICAgICAgICAgICBHZGlwR2V0Rm9udFNpemUodm9pZCAqcEZvbnQsIEZYX0ZMT0FUICpzaXplKTsKLSAgICB2b2lkKiAgICAgICAgICAgR2RpQWRkRm9udE1lbVJlc291cmNlRXgodm9pZCAqcEZvbnRkYXRhLCBGWF9EV09SRCBzaXplLCB2b2lkKiBwZHYsIEZYX0RXT1JEKiBudW1fZmFjZSk7Ci0gICAgRlhfQk9PTCAgICAgICAgIEdkaVJlbW92ZUZvbnRNZW1SZXNvdXJjZUV4KHZvaWQqIGhhbmRsZSk7Ci0gICAgdm9pZCoJCQltX0Z1bmN0aW9uc1sxMDBdOwotICAgIHZvaWQqICAgICAgICAgICBtX3BHZGlBZGRGb250TWVtUmVzb3VyY2VFeDsKLSAgICB2b2lkKiAgICAgICAgICAgbV9wR2RpUmVtb3ZlRm9udE1lbVJlc291cnNlRXg7Ci0gICAgQ0ZYX0RJQml0bWFwKglMb2FkRElCaXRtYXAoV0lORElCX09wZW5fQXJnc18gYXJncyk7Ci1wcm90ZWN0ZWQ6Ci0gICAgSE1PRFVMRQkJCW1faE1vZHVsZTsKLSAgICBITU9EVUxFICAgICAgICAgbV9HZGlNb2R1bGU7CitzdHJ1Y3QgV0lORElCX09wZW5fQXJnc187CitjbGFzcyBDR2RpcGx1c0V4dCB7CisgcHVibGljOgorICBDR2RpcGx1c0V4dCgpOworICB+Q0dkaXBsdXNFeHQoKTsKKyAgdm9pZCBMb2FkKCk7CisgIEZYX0JPT0wgSXNBdmFpbGFibGUoKSB7IHJldHVybiBtX2hNb2R1bGUgIT0gTlVMTDsgfQorICBGWF9CT09MIFN0cmV0Y2hCaXRNYXNrKEhEQyBoREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCBiTW9ub0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyk7CisgIEZYX0JPT0wgU3RyZXRjaERJQml0cyhIREMgaERDLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKKyAgRlhfQk9PTCBEcmF3UGF0aChIREMgaERDLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9hcmdiLAorICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0cm9rZV9hcmdiLAorICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUpOworCisgIHZvaWQqIExvYWRNZW1Gb250KHVpbnQ4X3QqIHBEYXRhLCBGWF9EV09SRCBzaXplKTsKKyAgdm9pZCBEZWxldGVNZW1Gb250KHZvaWQqIHBGb250Q29sbGVjdGlvbik7CisgIEZYX0JPT0wgR2RpcENyZWF0ZUZyb21JbWFnZSh2b2lkKiBiaXRtYXAsIHZvaWQqKiBncmFwaGljcyk7CisgIHZvaWQgR2RpcERlbGV0ZUdyYXBoaWNzKHZvaWQqIGdyYXBoaWNzKTsKKyAgdm9pZCBHZGlwU2V0VGV4dFJlbmRlcmluZ0hpbnQodm9pZCogZ3JhcGhpY3MsIGludCBtb2RlKTsKKyAgdm9pZCBHZGlwU2V0UGFnZVVuaXQodm9pZCogZ3JhcGhpY3MsIEZYX0RXT1JEIHVuaXQpOworICB2b2lkIEdkaXBTZXRXb3JsZFRyYW5zZm9ybSh2b2lkKiBncmFwaGljcywgdm9pZCogcE1hdHJpeCk7CisgIEZYX0JPT0wgR2RpcERyYXdEcml2ZXJTdHJpbmcodm9pZCogZ3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQqIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBmb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJydXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBvc2l0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogbWF0cml4KTsKKyAgdm9pZCBHZGlwQ3JlYXRlQnJ1c2goRlhfRFdPUkQgZmlsbF9hcmdiLCB2b2lkKiogcEJydXNoKTsKKyAgdm9pZCBHZGlwRGVsZXRlQnJ1c2godm9pZCogcEJydXNoKTsKKyAgdm9pZCBHZGlwQ3JlYXRlTWF0cml4KEZYX0ZMT0FUIGEsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGQsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBlLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBtYXRyaXgpOworICB2b2lkIEdkaXBEZWxldGVNYXRyaXgodm9pZCogbWF0cml4KTsKKyAgRlhfQk9PTCBHZGlwQ3JlYXRlRm9udEZhbWlseUZyb21OYW1lKGNvbnN0IEZYX1dDSEFSKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEZvbnRDb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIHBGYW1pbHkpOworICB2b2lkIEdkaXBEZWxldGVGb250RmFtaWx5KHZvaWQqIHBGYW1pbHkpOworICBGWF9CT09MIEdkaXBDcmVhdGVGb250RnJvbUZhbWlseSh2b2lkKiBwRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb250c3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogcEZvbnQpOworICB2b2lkKiBHZGlwQ3JlYXRlRm9udEZyb21Db2xsZWN0aW9uKHZvaWQqIHBGb250Q29sbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbnRzdHlsZSk7CisgIHZvaWQgR2RpcERlbGV0ZUZvbnQodm9pZCogcEZvbnQpOworICBGWF9CT09MIEdkaXBDcmVhdGVCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCB2b2lkKiogYml0bWFwKTsKKyAgdm9pZCBHZGlwRGlzcG9zZUltYWdlKHZvaWQqIGJpdG1hcCk7CisgIHZvaWQgR2RpcEdldEZvbnRTaXplKHZvaWQqIHBGb250LCBGWF9GTE9BVCogc2l6ZSk7CisgIHZvaWQqIEdkaUFkZEZvbnRNZW1SZXNvdXJjZUV4KHZvaWQqIHBGb250ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogbnVtX2ZhY2UpOworICBGWF9CT09MIEdkaVJlbW92ZUZvbnRNZW1SZXNvdXJjZUV4KHZvaWQqIGhhbmRsZSk7CisgIHZvaWQqIG1fRnVuY3Rpb25zWzEwMF07CisgIHZvaWQqIG1fcEdkaUFkZEZvbnRNZW1SZXNvdXJjZUV4OworICB2b2lkKiBtX3BHZGlSZW1vdmVGb250TWVtUmVzb3Vyc2VFeDsKKyAgQ0ZYX0RJQml0bWFwKiBMb2FkRElCaXRtYXAoV0lORElCX09wZW5fQXJnc18gYXJncyk7CisKKyBwcm90ZWN0ZWQ6CisgIEhNT0RVTEUgbV9oTW9kdWxlOworICBITU9EVUxFIG1fR2RpTW9kdWxlOwogfTsKICNpbmNsdWRlICJkd3JpdGVfaW50LmgiCi1jbGFzcyBDV2luMzJQbGF0Zm9ybSAKLXsKLXB1YmxpYzoKLSAgICBGWF9CT09MCQkJbV9iSGFsZlRvbmU7Ci0gICAgQ0dkaXBsdXNFeHQJCW1fR2RpcGx1c0V4dDsKLSAgICBDRFdyaXRlRXh0ICAgICAgbV9EV3JpdGVFeHQ7CitjbGFzcyBDV2luMzJQbGF0Zm9ybSB7CisgcHVibGljOgorICBGWF9CT09MIG1fYkhhbGZUb25lOworICBDR2RpcGx1c0V4dCBtX0dkaXBsdXNFeHQ7CisgIENEV3JpdGVFeHQgbV9EV3JpdGVFeHQ7CiB9OwotY2xhc3MgQ0dkaURldmljZURyaXZlciA6IHB1YmxpYyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyCi17Ci1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBpbnQJCUdldERldmljZUNhcHMoaW50IGNhcHNfaWQpOwotICAgIHZpcnR1YWwgdm9pZAlTYXZlU3RhdGUoKQotICAgIHsKLSAgICAgICAgU2F2ZURDKG1faERDKTsKKworY2xhc3MgQ0dkaURldmljZURyaXZlciA6IHB1YmxpYyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyIHsKKyBwcm90ZWN0ZWQ6CisgIC8vIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIKKyAgaW50IEdldERldmljZUNhcHMoaW50IGNhcHNfaWQpIG92ZXJyaWRlOworICB2b2lkIFNhdmVTdGF0ZSgpIG92ZXJyaWRlIHsgU2F2ZURDKG1faERDKTsgfQorICB2b2lkIFJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQgPSBGQUxTRSkgb3ZlcnJpZGUgeworICAgIFJlc3RvcmVEQyhtX2hEQywgLTEpOworICAgIGlmIChiS2VlcFNhdmVkKSB7CisgICAgICBTYXZlREMobV9oREMpOwogICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQJUmVzdG9yZVN0YXRlKEZYX0JPT0wgYktlZXBTYXZlZCA9IEZBTFNFKQotICAgIHsKLSAgICAgICAgUmVzdG9yZURDKG1faERDLCAtMSk7Ci0gICAgICAgIGlmIChiS2VlcFNhdmVkKSB7Ci0gICAgICAgICAgICBTYXZlREMobV9oREMpOwotICAgICAgICB9Ci0gICAgfQotICAgIHZpcnR1YWwgRlhfQk9PTAlTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgdmlydHVhbCBGWF9CT09MCVNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIHZpcnR1YWwgRlhfQk9PTAlEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0cm9rZV9jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwKKyAgfQorICBGWF9CT09MIFNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUpIG92ZXJyaWRlOworICBGWF9CT09MIFNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUpIG92ZXJyaWRlOworICBGWF9CT09MIERyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzdHJva2VfY29sb3IsCisgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwKKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLAorICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIG92ZXJyaWRlOworICBGWF9CT09MIERyYXdDb3NtZXRpY0xpbmUoRlhfRkxPQVQgeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KSBvdmVycmlkZTsKKyAgdm9pZCogR2V0UGxhdGZvcm1TdXJmYWNlKCkgb3ZlcnJpZGUgeyByZXR1cm4gKHZvaWQqKW1faERDOyB9CisKKyAgdmlydHVhbCB2b2lkKiBHZXRDbGlwUmduKCk7CisgIHZpcnR1YWwgRlhfQk9PTCBTZXRDbGlwUmduKHZvaWQqIHBSZ24pOworICB2aXJ0dWFsIEZYX0JPT0wgRGVsZXRlRGV2aWNlUmduKHZvaWQqIHBSZ24pOworICB2aXJ0dWFsIHZvaWQgRHJhd0xpbmUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIpOworCisgIEZYX0JPT0wgR0RJX1NldERJQml0cyhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pOworICBGWF9CT09MIEdESV9TdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSk7CisgIEZYX0JPT0wgR0RJX1N0cmV0Y2hCaXRNYXNrKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBiaXRtYXBfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50CWJsZW5kX3R5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIHZpcnR1YWwgRlhfQk9PTCBGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmlsbF9jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJRHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwgRlhfRFdPUkQgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKTsKLSAgICB2aXJ0dWFsIEZYX0xQVk9JRCBHZXRDbGlwUmduKCkgOwotICAgIHZpcnR1YWwgRlhfQk9PTCBTZXRDbGlwUmduKEZYX0xQVk9JRCBwUmduKSA7Ci0gICAgdmlydHVhbCBGWF9CT09MIEdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpOwotICAgIHZpcnR1YWwgRlhfQk9PTCBEZWxldGVEZXZpY2VSZ24oRlhfTFBWT0lEIHBSZ24pOwotICAgIHZpcnR1YWwgdm9pZAlEcmF3TGluZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5Mik7Ci0gICAgdmlydHVhbCB2b2lkKglHZXRQbGF0Zm9ybVN1cmZhY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICh2b2lkKiltX2hEQzsKLSAgICB9Ci0gICAgRlhfQk9PTAkJCUdESV9TZXRESUJpdHMoY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwgaW50IGxlZnQsIGludCB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0gICAgRlhfQk9PTAkJCUdESV9TdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBGWF9EV09SRCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0gICAgRlhfQk9PTAkJCUdESV9TdHJldGNoQml0TWFzayhjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIEZYX0RXT1JEIGJpdG1hcF9jb2xvciwgRlhfRFdPUkQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0gICAgSERDCQkJCW1faERDOwotICAgIGludAkJCQltX1dpZHRoLCBtX0hlaWdodCwgbV9uQml0c1BlclBpeGVsOwotICAgIGludAkJCQltX0RldmljZUNsYXNzLCBtX1JlbmRlckNhcHM7Ci0gICAgQ0dkaURldmljZURyaXZlcihIREMgaERDLCBpbnQgZGV2aWNlX2NsYXNzKTsKLSAgICB+Q0dkaURldmljZURyaXZlcigpIHt9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pOworICBIREMgbV9oREM7CisgIGludCBtX1dpZHRoLCBtX0hlaWdodCwgbV9uQml0c1BlclBpeGVsOworICBpbnQgbV9EZXZpY2VDbGFzcywgbV9SZW5kZXJDYXBzOworICBDR2RpRGV2aWNlRHJpdmVyKEhEQyBoREMsIGludCBkZXZpY2VfY2xhc3MpOworICB+Q0dkaURldmljZURyaXZlcigpIG92ZXJyaWRlIHt9CiB9OwotY2xhc3MgQ0dkaURpc3BsYXlEcml2ZXIgOiBwdWJsaWMgQ0dkaURldmljZURyaXZlcgotewotcHVibGljOgotICAgIENHZGlEaXNwbGF5RHJpdmVyKEhEQyBoREMpOwotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgRlhfQk9PTCBHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIEZYX0JPT0wgYkRFZGdlID0gRkFMU0UpOwotICAgIHZpcnR1YWwgRlhfQk9PTCBTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0gICAgdmlydHVhbCBGWF9CT09MIFN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIEZYX0RXT1JEIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCVN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCByZW5kZXJfZmxhZ3MsIEZYX0xQVk9JRCYgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpCi0gICAgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX0JPT0wJCQlVc2VGb3hpdFN0cmV0Y2hFbmdpbmUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgaW50IHJlbmRlcl9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKKworY2xhc3MgQ0dkaURpc3BsYXlEcml2ZXIgOiBwdWJsaWMgQ0dkaURldmljZURyaXZlciB7CisgcHVibGljOgorICBDR2RpRGlzcGxheURyaXZlcihIREMgaERDKTsKKworIHByb3RlY3RlZDoKKyAgdmlydHVhbCBGWF9CT09MIEdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJERWRnZSA9IEZBTFNFKTsKKyAgdmlydHVhbCBGWF9CT09MIFNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSk7CisgIHZpcnR1YWwgRlhfQk9PTCBTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSk7CisgIHZpcnR1YWwgRlhfQk9PTCBTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHJlbmRlcl9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9CT09MIFVzZUZveGl0U3RyZXRjaEVuZ2luZShjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZW5kZXJfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKIH07Ci1jbGFzcyBDR2RpUHJpbnRlckRyaXZlciA6IHB1YmxpYyBDR2RpRGV2aWNlRHJpdmVyCi17Ci1wdWJsaWM6Ci0gICAgQ0dkaVByaW50ZXJEcml2ZXIoSERDIGhEQyk7Ci1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBpbnQJCUdldERldmljZUNhcHMoaW50IGNhcHNfaWQpOwotICAgIHZpcnR1YWwgRlhfQk9PTCBTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0gICAgdmlydHVhbCBGWF9CT09MIFN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgRlhfRFdPUkQgY29sb3IsIGludCBkZXN0X2xlZnQsIGludCBkZXN0X3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwgaW50IGRlc3RfaGVpZ2h0LCBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsIEZYX0RXT1JEIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MCVN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsIGludCBiaXRtYXBfYWxwaGEsIEZYX0RXT1JEIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBGWF9EV09SRCByZW5kZXJfZmxhZ3MsIEZYX0xQVk9JRCYgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSwgaW50IGJsZW5kX3R5cGUpOwotICAgIGludAkJCQltX0hvcnpTaXplLCBtX1ZlcnRTaXplOwotICAgIEZYX0JPT0wJCQltX2JTdXBwb3J0Uk9QOworY2xhc3MgQ0dkaVByaW50ZXJEcml2ZXIgOiBwdWJsaWMgQ0dkaURldmljZURyaXZlciB7CisgcHVibGljOgorICBDR2RpUHJpbnRlckRyaXZlcihIREMgaERDKTsKKworIHByb3RlY3RlZDoKKyAgdmlydHVhbCBpbnQgR2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCk7CisgIHZpcnR1YWwgRlhfQk9PTCBTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pOworICB2aXJ0dWFsIEZYX0JPT0wgU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpOworICB2aXJ0dWFsIEZYX0JPT0wgU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCByZW5kZXJfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpOworICBpbnQgbV9Ib3J6U2l6ZSwgbV9WZXJ0U2l6ZTsKKyAgRlhfQk9PTCBtX2JTdXBwb3J0Uk9QOwogfTsKLWNsYXNzIENQU091dHB1dCA6IHB1YmxpYyBJRlhfUFNPdXRwdXQKLXsKLXB1YmxpYzoKLSAgICBDUFNPdXRwdXQoSERDIGhEQyk7Ci0gICAgdmlydHVhbCB+Q1BTT3V0cHV0KCk7Ci0gICAgdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpCi0gICAgewotICAgICAgICBkZWxldGUgdGhpczsKLSAgICB9Ci0gICAgdm9pZCBJbml0KCk7Ci0gICAgdmlydHVhbCB2b2lkCU91dHB1dFBTKEZYX0xQQ1NUUiBzdHJpbmcsIGludCBsZW4pOwotICAgIEhEQwkJCQltX2hEQzsKLSAgICBGWF9MUFNUUiAgICAgICAgbV9wQnVmOworCitjbGFzcyBDUFNPdXRwdXQgOiBwdWJsaWMgSUZYX1BTT3V0cHV0IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENQU091dHB1dChIREMgaERDKTsKKyAgfkNQU091dHB1dCgpIG92ZXJyaWRlOworCisgIC8vIElGWF9QU091dHB1dAorICB2b2lkIFJlbGVhc2UoKSBvdmVycmlkZSB7IGRlbGV0ZSB0aGlzOyB9CisgIHZvaWQgT3V0cHV0UFMoY29uc3QgRlhfQ0hBUiogc3RyaW5nLCBpbnQgbGVuKSBvdmVycmlkZTsKKworICB2b2lkIEluaXQoKTsKKworICBIREMgbV9oREM7CisgIEZYX0NIQVIqIG1fcEJ1ZjsKIH07Ci1jbGFzcyBDUFNQcmludGVyRHJpdmVyIDogcHVibGljIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIKLXsKLXB1YmxpYzoKLSAgICBDUFNQcmludGVyRHJpdmVyKCk7Ci0gICAgRlhfQk9PTAkJCUluaXQoSERDIGhEQywgaW50IHBzX2xldmVsLCBGWF9CT09MIGJDbXlrT3V0cHV0KTsKLSAgICB+Q1BTUHJpbnRlckRyaXZlcigpOwotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgRlhfQk9PTCBJc1BTUHJpbnREcml2ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIHZpcnR1YWwgaW50CQlHZXREZXZpY2VDYXBzKGludCBjYXBzX2lkKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJU3RhcnRSZW5kZXJpbmcoKTsKLSAgICB2aXJ0dWFsIHZvaWQJRW5kUmVuZGVyaW5nKCk7Ci0gICAgdmlydHVhbCB2b2lkCVNhdmVTdGF0ZSgpOwotICAgIHZpcnR1YWwgdm9pZAlSZXN0b3JlU3RhdGUoRlhfQk9PTCBiS2VlcFNhdmVkID0gRkFMU0UpOwotICAgIHZpcnR1YWwgRlhfQk9PTAlTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgdmlydHVhbCBGWF9CT09MCVNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIHZpcnR1YWwgRlhfQk9PTAlEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpbGxfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0cm9rZV9jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wgR2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCk7Ci0gICAgdmlydHVhbCBGWF9CT09MIFNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgYmxlbmRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wgU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBGWF9EV09SRCBjb2xvciwgaW50IGRlc3RfbGVmdCwgaW50IGRlc3RfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLCBpbnQgZGVzdF9oZWlnaHQsIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwgRlhfRFdPUkQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsIHZvaWQqIHBJY2NUcmFuc2Zvcm0sIGludCBibGVuZF90eXBlKTsKLSAgICB2aXJ0dWFsIEZYX0JPT0wJU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwgaW50IGJpdG1hcF9hbHBoYSwgRlhfRFdPUkQgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIEZYX0RXT1JEIHJlbmRlcl9mbGFncywgRlhfTFBWT0lEJiBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLCB2b2lkKiBwSWNjVHJhbnNmb3JtLCBpbnQgYmxlbmRfdHlwZSk7Ci0gICAgdmlydHVhbCBGWF9CT09MIERyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywgQ0ZYX0ZvbnQqIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udENhY2hlKiBwQ2FjaGUsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBPYmplY3QyRGV2aWNlLCBGWF9GTE9BVCBmb250X3NpemUsIEZYX0RXT1JEIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7Ci0gICAgdmlydHVhbCB2b2lkKglHZXRQbGF0Zm9ybVN1cmZhY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICh2b2lkKiltX2hEQzsKLSAgICB9Ci0gICAgSERDCQkJCW1faERDOwotICAgIEZYX0JPT0wJCQltX2JDbXlrT3V0cHV0OwotICAgIGludAkJCQltX1dpZHRoLCBtX0hlaWdodCwgbV9uQml0c1BlclBpeGVsOwotICAgIGludAkJCQltX0hvcnpTaXplLCBtX1ZlcnRTaXplOwotICAgIENQU091dHB1dCoJCW1fcFBTT3V0cHV0OwotICAgIENGWF9QU1JlbmRlcmVyCW1fUFNSZW5kZXJlcjsKKworY2xhc3MgQ1BTUHJpbnRlckRyaXZlciA6IHB1YmxpYyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyIHsKKyBwdWJsaWM6CisgIENQU1ByaW50ZXJEcml2ZXIoKTsKKyAgRlhfQk9PTCBJbml0KEhEQyBoREMsIGludCBwc19sZXZlbCwgRlhfQk9PTCBiQ215a091dHB1dCk7CisgIH5DUFNQcmludGVyRHJpdmVyKCkgb3ZlcnJpZGU7CisKKyBwcm90ZWN0ZWQ6CisgIC8vIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIKKyAgaW50IEdldERldmljZUNhcHMoaW50IGNhcHNfaWQpOworICBGWF9CT09MIElzUFNQcmludERyaXZlcigpIG92ZXJyaWRlIHsgcmV0dXJuIFRSVUU7IH0KKyAgRlhfQk9PTCBTdGFydFJlbmRlcmluZygpIG92ZXJyaWRlOworICB2b2lkIEVuZFJlbmRlcmluZygpIG92ZXJyaWRlOworICB2b2lkIFNhdmVTdGF0ZSgpIG92ZXJyaWRlOworICB2b2lkIFJlc3RvcmVTdGF0ZShGWF9CT09MIGJLZWVwU2F2ZWQgPSBGQUxTRSkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgU2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBmaWxsX2NvbG9yLAorICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIHN0cm9rZV9jb2xvciwKKyAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlLAorICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIG92ZXJyaWRlOworICBGWF9CT09MIEdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpIG92ZXJyaWRlOworICBGWF9CT09MIFNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIG92ZXJyaWRlOworICBGWF9CT09MIFN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgcmVuZGVyX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgRHJhd0RldmljZVRleHQoaW50IG5DaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250Q2FjaGUqIHBDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgb3ZlcnJpZGU7CisgIHZvaWQqIEdldFBsYXRmb3JtU3VyZmFjZSgpIG92ZXJyaWRlIHsgcmV0dXJuICh2b2lkKiltX2hEQzsgfQorCisgIEhEQyBtX2hEQzsKKyAgRlhfQk9PTCBtX2JDbXlrT3V0cHV0OworICBpbnQgbV9XaWR0aCwgbV9IZWlnaHQsIG1fbkJpdHNQZXJQaXhlbDsKKyAgaW50IG1fSG9yelNpemUsIG1fVmVydFNpemU7CisgIENQU091dHB1dCogbV9wUFNPdXRwdXQ7CisgIENGWF9QU1JlbmRlcmVyIG1fUFNSZW5kZXJlcjsKIH07Ci12b2lkIF9Db2xvcjJBcmdiKEZYX0FSR0ImIGFyZ2IsIEZYX0RXT1JEIGNvbG9yLCBpbnQgYWxwaGFfZmxhZywgdm9pZCogcEljY1RyYW5zZm9ybSk7Cit2b2lkIF9Db2xvcjJBcmdiKEZYX0FSR0ImIGFyZ2IsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGNvbG9yLAorICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKKyAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSk7CiAKICNlbmRpZiAgLy8gQ09SRV9TUkNfRlhHRV9XSU4zMl9XSU4zMl9JTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL3JlZmxvdy9hdXRvcmVmbG93LmNwcCBiL2NvcmUvc3JjL3JlZmxvdy9hdXRvcmVmbG93LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEwMTc1NS4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9yZWZsb3cvYXV0b3JlZmxvdy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NzcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgImF1dG9yZWZsb3cuaCIKLSNkZWZpbmUgYXBwcm9hY2h0byhhLGIsYykgKEZYU1lTX2ZhYnMoKGZsb2F0KSgoYSktKGIpKSk+KGMpID8gMCA6IDEpCi1pbnQgRlBERl9Qcm9jZXNzSW50ZXJPYmooY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwUHJldk9iaiwgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqKQotewotICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwotICAgIEZYX1JFQ1QgUHJlUmVjdCA9IHBQcmV2T2JqLT5HZXRCQm94KCZtYXRyaXgpOwotICAgIEZYX1JFQ1QgcmVjdCA9IHBPYmotPkdldEJCb3goJm1hdHJpeCk7Ci0gICAgaW50IGZsYWcgPSAwOwotICAgIGlmKFByZVJlY3QudG9wID4gcmVjdC5ib3R0b20pIHsKLSAgICAgICAgZmxhZyA9IDA7Ci0gICAgfSBlbHNlIGlmKHJlY3QudG9wID4gUHJlUmVjdC5ib3R0b20pIHsKLSAgICAgICAgZmxhZyA9IDE7Ci0gICAgfSBlbHNlIGlmKFByZVJlY3QucmlnaHQgPCByZWN0LmxlZnQpIHsKLSAgICAgICAgZmxhZyA9IDA7Ci0gICAgfSBlbHNlIGlmKFByZVJlY3QubGVmdCA+IHJlY3QucmlnaHQpIHsKLSAgICAgICAgZmxhZyA9IDE7Ci0gICAgfSBlbHNlIGlmKHBPYmotPm1fVHlwZSAhPSBQREZQQUdFX1RFWFQpIHsKLSAgICAgICAgZmxhZyA9IDE7Ci0gICAgfSBlbHNlIGlmKHBQcmV2T2JqLT5tX1R5cGUgIT0gUERGUEFHRV9URVhUKSB7Ci0gICAgICAgIGZsYWcgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKChQcmVSZWN0LnRvcCA8IHJlY3QudG9wICYmIFByZVJlY3QuYm90dG9tID4gcmVjdC5ib3R0b20pIHx8Ci0gICAgICAgICAgICAgICAgKFByZVJlY3QudG9wID4gcmVjdC50b3AgJiYgUHJlUmVjdC5ib3R0b20gPCByZWN0LmJvdHRvbSkpIHsKLSAgICAgICAgICAgIGlmKFByZVJlY3QubGVmdCA+IHJlY3QubGVmdCkgewotICAgICAgICAgICAgICAgIGZsYWcgPSAxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmbGFnID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENQREZfVGV4dE9iamVjdCogcFByZXZUZXh0T2JqID0gKENQREZfVGV4dE9iamVjdCogKXBQcmV2T2JqOwotICAgICAgICAgICAgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiA9IChDUERGX1RleHRPYmplY3QqIClwT2JqOwotICAgICAgICAgICAgQ1BERl9UZXh0T2JqZWN0SXRlbSBpdGVtLCBwcmV2SXRlbTsKLSAgICAgICAgICAgIHBQcmV2VGV4dE9iai0+R2V0SXRlbUluZm8oMCwgJnByZXZJdGVtKTsKLSAgICAgICAgICAgIHBUZXh0T2JqLT5HZXRJdGVtSW5mbygwLCAmaXRlbSk7Ci0gICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4IFRleHRNYXRyaXg7Ci0gICAgICAgICAgICBwVGV4dE9iai0+R2V0VGV4dE1hdHJpeCgmVGV4dE1hdHJpeCk7Ci0gICAgICAgICAgICBGWF9GTE9BVCBvcmlnaW5YLCBvcmlnaW5ZLCBwcmV2T3JpZ2luWCwgcHJlT3JpZ2luWTsKLSAgICAgICAgICAgIFRleHRNYXRyaXguVHJhbnNmb3JtKGl0ZW0ubV9PcmlnaW5YLCBpdGVtLm1fT3JpZ2luWSwgb3JpZ2luWCwgb3JpZ2luWSk7Ci0gICAgICAgICAgICBwUHJldlRleHRPYmotPkdldFRleHRNYXRyaXgoJlRleHRNYXRyaXgpOwotICAgICAgICAgICAgVGV4dE1hdHJpeC5UcmFuc2Zvcm0ocHJldkl0ZW0ubV9PcmlnaW5YLCBwcmV2SXRlbS5tX09yaWdpblksIHByZXZPcmlnaW5YLCBwcmVPcmlnaW5ZKTsKLSAgICAgICAgICAgIGlmKHByZU9yaWdpblkgPiBvcmlnaW5ZKSB7Ci0gICAgICAgICAgICAgICAgZmxhZyA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZsYWcgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmbGFnOwotfQotdm9pZCBDUERGX0F1dG9SZWZsb3dMYXlvdXRQcm92aWRlcjo6Q29udmVyMkFwcHJlY2VPcmRlcihjb25zdCBDUERGX1BhZ2VPYmplY3RzKiBwU3RyZWFtT3JkZXJPYmpzLCBDUERGX1BhZ2VPYmplY3RzKiBwQXBwcmFjZU9yZGVyT2JqcykKLXsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBwU3RyZWFtT3JkZXJPYmpzLT5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCk7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXg7Ci0gICAgd2hpbGUocG9zKSB7Ci0gICAgICAgIENQREZfUGFnZU9iamVjdCogcE9iaiA9IHBTdHJlYW1PcmRlck9ianMtPkdldE5leHRPYmplY3QocG9zKTsKLSAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXg7Ci0gICAgICAgIGlmKHBPYmotPm1fVHlwZSAhPSBQREZQQUdFX1RFWFQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIEZYX1BPU0lUSU9OIHBvczEgPSBwQXBwcmFjZU9yZGVyT2Jqcy0+R2V0TGFzdE9iamVjdFBvc2l0aW9uKCk7Ci0gICAgICAgIHdoaWxlKHBvczEpIHsKLSAgICAgICAgICAgIENQREZfUGFnZU9iamVjdCogcFRlbXBPYmogPSBwQXBwcmFjZU9yZGVyT2Jqcy0+R2V0UHJldk9iamVjdChwb3MxKTsKLSAgICAgICAgICAgIGlmKEZQREZfUHJvY2Vzc0ludGVyT2JqKHBPYmosIHBUZW1wT2JqKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgaWYoIXBvczEpIHsKLSAgICAgICAgICAgICAgICAgICAgcG9zMSA9IHBBcHByYWNlT3JkZXJPYmpzLT5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcEFwcHJhY2VPcmRlck9ianMtPkdldE5leHRPYmplY3QocG9zMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBBcHByYWNlT3JkZXJPYmpzLT5JbnNlcnRPYmplY3QocG9zMSwgcE9iaik7Ci0gICAgfQotICAgIHBvcyA9IHBTdHJlYW1PcmRlck9ianMtPkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKTsKLSAgICB3aGlsZShwb3MpIHsKLSAgICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwT2JqID0gcFN0cmVhbU9yZGVyT2Jqcy0+R2V0TmV4dE9iamVjdChwb3MpOwotICAgICAgICBpZihwT2JqLT5tX1R5cGUgIT0gUERGUEFHRV9JTUFHRSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfUE9TSVRJT04gcG9zMSA9IHBBcHByYWNlT3JkZXJPYmpzLT5HZXRMYXN0T2JqZWN0UG9zaXRpb24oKTsKLSAgICAgICAgd2hpbGUocG9zMSkgewotICAgICAgICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwVGVtcE9iaiA9IHBBcHByYWNlT3JkZXJPYmpzLT5HZXRQcmV2T2JqZWN0KHBvczEpOwotICAgICAgICAgICAgaWYoRlBERl9Qcm9jZXNzSW50ZXJPYmoocE9iaiwgcFRlbXBPYmopID09IDEpIHsKLSAgICAgICAgICAgICAgICBpZighcG9zMSkgewotICAgICAgICAgICAgICAgICAgICBwb3MxID0gcEFwcHJhY2VPcmRlck9ianMtPkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwQXBwcmFjZU9yZGVyT2Jqcy0+R2V0TmV4dE9iamVjdChwb3MxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcEFwcHJhY2VPcmRlck9ianMtPkluc2VydE9iamVjdChwb3MxLCBwT2JqKTsKLSAgICB9Ci19Ci1JUERGX0xheW91dFByb3ZpZGVyKiBJUERGX0xheW91dFByb3ZpZGVyOjpDcmVhdGVfTGF5b3V0UHJvdmlkZXJfQXV0b1JlZmxvdyhDUERGX1BhZ2VPYmplY3RzKiBwUGFnZSwgRlhfQk9PTCBiUmVhZE9yZGVyKQotewotICAgIHJldHVybiBuZXcgQ1BERl9BdXRvUmVmbG93TGF5b3V0UHJvdmlkZXIocFBhZ2UsIGJSZWFkT3JkZXIpOwotfQotQ1BERl9BdXRvUmVmbG93RWxlbWVudDo6Q1BERl9BdXRvUmVmbG93RWxlbWVudChMYXlvdXRUeXBlIGxheW91dFR5cGUgLCBDUERGX0F1dG9SZWZsb3dFbGVtZW50KiBwUGFyZW50KQotewotICAgIG1fRWxtVHlwZSA9IGxheW91dFR5cGU7Ci0gICAgbV9wUGFyZW50RWxtID0gcFBhcmVudDsKLSAgICBpZihwUGFyZW50KSB7Ci0gICAgICAgIHBQYXJlbnQtPm1fQ2hpbGRBcnJheS5BZGQodGhpcyk7Ci0gICAgfQotICAgIG1fU3BhY2VCZWZvcmUgPSAwOwotfQotQ1BERl9BdXRvUmVmbG93RWxlbWVudDo6fkNQREZfQXV0b1JlZmxvd0VsZW1lbnQoKQotewotICAgIG1fQ2hpbGRBcnJheS5SZW1vdmVBbGwoKTsKLSAgICBtX09iakFycmF5LlJlbW92ZUFsbCgpOwotfQotaW50CUNQREZfQXV0b1JlZmxvd0VsZW1lbnQ6OkNvdW50QXR0clZhbHVlcyhMYXlvdXRBdHRyIGF0dHJfdHlwZSkKLXsKLSAgICByZXR1cm4gMTsKLX0KLUxheW91dEVudW0gQ1BERl9BdXRvUmVmbG93RWxlbWVudDo6R2V0RW51bUF0dHIoTGF5b3V0QXR0ciBhdHRyX3R5cGUsIGludCBpbmRleCApCi17Ci0gICAgcmV0dXJuIExheW91dEludmFsaWQ7Ci19Ci1GWF9GTE9BVAlDUERGX0F1dG9SZWZsb3dFbGVtZW50OjpHZXROdW1iZXJBdHRyKExheW91dEF0dHIgYXR0cl90eXBlLCBpbnQgaW5kZXggKQotewotICAgIHN3aXRjaCAoYXR0cl90eXBlKSB7Ci0gICAgICAgIGNhc2UgTGF5b3V0U3BhY2VCZWZvcmU6Ci0gICAgICAgICAgICByZXR1cm4gbV9TcGFjZUJlZm9yZTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLUZYX0NPTE9SUkVGCUNQREZfQXV0b1JlZmxvd0VsZW1lbnQ6OkdldENvbG9yQXR0cihMYXlvdXRBdHRyIGF0dHJfdHlwZSwgaW50IGluZGV4ICkKLXsKLSAgICByZXR1cm4gMDsKLX0KLSNkZWZpbmUgV3JpdGluZ01vZGVfVU5LTk9XCTAKLSNkZWZpbmUgV3JpdGluZ01vZGVfTFJUQgkxCi0jZGVmaW5lIFdyaXRpbmdNb2RlX1JMVEIJMgotI2RlZmluZSBXcml0aW5nTW9kZV9UQlJMCTMKLUNQREZfQXV0b1JlZmxvd0xheW91dFByb3ZpZGVyOjpDUERGX0F1dG9SZWZsb3dMYXlvdXRQcm92aWRlcihDUERGX1BhZ2VPYmplY3RzKiBwUGFnZSwgRlhfQk9PTCBiUmVhZE9yZGVyKQotewotICAgIG1fcFBERlBhZ2UgPSAoQ1BERl9QYWdlKilwUGFnZTsKLSAgICBGWF9GTE9BVCB3aWR0aCA9IG1fcFBERlBhZ2UtPkdldFBhZ2VXaWR0aCgpOwotICAgIEZYX0ZMT0FUIGhlaWdodCA9IG1fcFBERlBhZ2UtPkdldFBhZ2VIZWlnaHQoKTsKLSAgICBtX3BQREZQYWdlLT5HZXREaXNwbGF5TWF0cml4KG1fUERGRGlzcGxheU1hdHJpeCwgMCwgMCwgKGludCkobV9wUERGUGFnZS0+R2V0UGFnZVdpZHRoKCkpLCAoaW50KShtX3BQREZQYWdlLT5HZXRQYWdlSGVpZ2h0KCkpLCAwKTsKLSAgICBtX2JSZWFkT3JkZXIgPSBiUmVhZE9yZGVyOwotICAgIG1fU3RhdHVzID0gTGF5b3V0UmVhZHk7Ci0gICAgbV9wUm9vdCA9IE5VTEw7Ci0gICAgbV9wQ3VyckVsbSA9IE5VTEw7Ci0gICAgbV9wUHJlT2JqID0gTlVMTDsKLSAgICBtX1N0ZXAgPSAwOwotICAgIG1fV3JpdGluZ01vZGUgPSBXcml0aW5nTW9kZV9VTktOT1c7Ci19Ci1DUERGX0F1dG9SZWZsb3dMYXlvdXRQcm92aWRlcjo6fkNQREZfQXV0b1JlZmxvd0xheW91dFByb3ZpZGVyKCkKLXsKLSAgICBtX3BQREZQYWdlID0gTlVMTDsKLSAgICBSZWxlYXNlRWxtKG1fcFJvb3QpOwotfQotdm9pZCBDUERGX0F1dG9SZWZsb3dMYXlvdXRQcm92aWRlcjo6UmVsZWFzZUVsbShDUERGX0F1dG9SZWZsb3dFbGVtZW50KiYgcEVsbSwgRlhfQk9PTCBiUmVsZWFzZUNoaWxkcmVuKQotewotICAgIGlmKGJSZWxlYXNlQ2hpbGRyZW4pIHsKLSAgICAgICAgaW50IGNvdW50ID0gcEVsbS0+Q291bnRDaGlsZHJlbigpOwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgQ1BERl9BdXRvUmVmbG93RWxlbWVudCogcENoaWxkID0gKENQREZfQXV0b1JlZmxvd0VsZW1lbnQqKXBFbG0tPkdldENoaWxkKGkpOwotICAgICAgICAgICAgUmVsZWFzZUVsbShwQ2hpbGQpOwotICAgICAgICB9Ci0gICAgfQotICAgIGRlbGV0ZSBwRWxtOwotICAgIHBFbG0gPSBOVUxMOwotfQotdm9pZCBDUERGX0F1dG9SZWZsb3dMYXlvdXRQcm92aWRlcjo6QWRkT2JqZWN0QXJyYXkoQ1BERl9BdXRvUmVmbG93RWxlbWVudCogcEVsbSwgQ0ZYX1B0ckxpc3QmIE9iakxpc3QpCi17Ci0gICAgaWYoIXBFbG0pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9QT1NJVElPTiBwb3MgPSBPYmpMaXN0LkdldEhlYWRQb3NpdGlvbigpOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgcEVsbS0+bV9PYmpBcnJheS5BZGQoKENQREZfUGFnZU9iamVjdCopT2JqTGlzdC5HZXROZXh0KHBvcykpOwotICAgIH0KLX0KLXZvaWQgQ1BERl9BdXRvUmVmbG93TGF5b3V0UHJvdmlkZXI6OkdlbmVyYXRlU3RydWN0VHJlZSgpCi17Ci0gICAgaWYgKG1fU3RlcCA8IEFVVE9SRUZMT1dfU1RFUF9HRU5FUkFURUxJTkUpIHsKLSAgICAgICAgR2VuZXJhdGVMaW5lKG1fY2VsbEFycmF5KTsKLSAgICAgICAgaWYobV9jZWxsQXJyYXkuR2V0U2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIG1fU3RhdHVzID0gTGF5b3V0RXJyb3I7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYobV9wUGF1c2UgJiYgbV9wUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgIG1fU3RlcCA9IEFVVE9SRUZMT1dfU1RFUF9HRU5FUkFURUxJTkU7Ci0gICAgICAgICAgICBtX1N0YXR1cyA9IExheW91dFRvQmVDb250aW51ZWQ7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fU3RlcCA8IEFVVE9SRUZMT1dfU1RFUF9HRU5FUkFURVBhcmFncmFwaCkgewotICAgICAgICBHZW5lcmF0ZVBhcmFncmFwaChtX2NlbGxBcnJheSk7Ci0gICAgICAgIGlmKG1fcFBhdXNlICYmIG1fcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7Ci0gICAgICAgICAgICBtX1N0ZXAgPSBBVVRPUkVGTE9XX1NURVBfR0VORVJBVEVQYXJhZ3JhcGg7Ci0gICAgICAgICAgICBtX1N0YXR1cyA9IExheW91dFRvQmVDb250aW51ZWQ7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fU3RlcCA8IEFVVE9SRUZMT1dfU1RFUF9DUkVBVEVFTEVNRU5UKSB7Ci0gICAgICAgIENyZWF0ZUVsZW1lbnQoKTsKLSAgICAgICAgaWYobV9wUGF1c2UgJiYgbV9wUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgIG1fU3RlcCA9IEFVVE9SRUZMT1dfU1RFUF9DUkVBVEVFTEVNRU5UOwotICAgICAgICAgICAgbV9TdGF0dXMgPSBMYXlvdXRUb0JlQ29udGludWVkOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtX1N0ZXAgPCBBVVRPUkVGTE9XX1NURVBfUkVNT1ZFREFUQSkgewotICAgICAgICBpbnQgY291bnQgPSBtX2NlbGxBcnJheS5HZXRTaXplKCk7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBDUkZfQ0VMTCogcENlbGwgPSAoQ1JGX0NFTEwqKW1fY2VsbEFycmF5LkdldEF0KGkpOwotICAgICAgICAgICAgaWYocENlbGwpIHsKLSAgICAgICAgICAgICAgICBwQ2VsbC0+bV9PYmpMaXN0LlJlbW92ZUFsbCgpOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBwQ2VsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX2NlbGxBcnJheS5SZW1vdmVBbGwoKTsKLSAgICAgICAgaWYobV9wUGF1c2UgJiYgbV9wUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgIG1fU3RlcCA9IEFVVE9SRUZMT1dfU1RFUF9SRU1PVkVEQVRBOwotICAgICAgICAgICAgbV9TdGF0dXMgPSBMYXlvdXRUb0JlQ29udGludWVkOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotICAgIG1fU3RlcCA9IEFVVE9SRUZMT1dfU1RFUF9SRU1PVkVEQVRBOwotICAgIG1fU3RhdHVzID0gTGF5b3V0RmluaXNoZWQ7Ci0gICAgcmV0dXJuOwotfQotdm9pZCBDUERGX0F1dG9SZWZsb3dMYXlvdXRQcm92aWRlcjo6Q3JlYXRlRWxlbWVudCgpCi17Ci0gICAgaW50IGNvdW50ID0gbV9jZWxsQXJyYXkuR2V0U2l6ZSgpOwotICAgIENSRl9DRUxMKiBwbGFzdENlbGwgPSBOVUxMOwotICAgIENSRl9DRUxMKiBwQ2VsbCA9IE5VTEw7Ci0gICAgQ1JGX0NFTEwqIHBOZXh0Q2VsbCA9IE5VTEw7Ci0gICAgQ1BERl9BdXRvUmVmbG93RWxlbWVudCogcFBhcmVudCA9IG1fcFJvb3Q7Ci0gICAgQ1BERl9BdXRvUmVmbG93RWxlbWVudCogcEN1cnJFbG0gPSBOVUxMOwotICAgIGludCBpOwotICAgIGZvcihpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgcENlbGwgPSAoQ1JGX0NFTEwqKW1fY2VsbEFycmF5LkdldEF0KGkpOwotICAgICAgICBpZighcENlbGwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmKGkgPCBjb3VudCAtIDEpIHsKLSAgICAgICAgICAgIHBOZXh0Q2VsbCA9IChDUkZfQ0VMTCopbV9jZWxsQXJyYXkuR2V0QXQoaSArIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcE5leHRDZWxsID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBwQ3VyckVsbSA9IG5ldyBDUERGX0F1dG9SZWZsb3dFbGVtZW50KExheW91dFBhcmFncmFwaCwgcFBhcmVudCk7Ci0gICAgICAgIGlmKHBDdXJyRWxtLT5HZXRUeXBlKCkgPT0gTGF5b3V0UGFyYWdyYXBoICYmIHBsYXN0Q2VsbCkgewotICAgICAgICAgICAgaW50IFNwYWNlQmVmb3JlID0gMDsKLSAgICAgICAgICAgIGlmKHBDZWxsLT5tX0NlbGxXcml0aW5nTW9kZSAhPSBwbGFzdENlbGwtPm1fQ2VsbFdyaXRpbmdNb2RlICkgewotICAgICAgICAgICAgICAgIFNwYWNlQmVmb3JlID0gMjA7Ci0gICAgICAgICAgICB9IGVsc2UgaWYocENlbGwtPm1fQ2VsbFdyaXRpbmdNb2RlID09IFdyaXRpbmdNb2RlX0xSVEIpIHsKLSAgICAgICAgICAgICAgICBTcGFjZUJlZm9yZSA9IHBsYXN0Q2VsbC0+bV9CQm94LmJvdHRvbSAtIHBDZWxsLT5tX0JCb3gudG9wOwotICAgICAgICAgICAgfSBlbHNlIGlmKHBDZWxsLT5tX0NlbGxXcml0aW5nTW9kZSA9PSBXcml0aW5nTW9kZV9UQlJMKSB7Ci0gICAgICAgICAgICAgICAgU3BhY2VCZWZvcmUgPSBwbGFzdENlbGwtPm1fQkJveC5sZWZ0IC0gcENlbGwtPm1fQkJveC5yaWdodDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKFNwYWNlQmVmb3JlID4gMCkgewotICAgICAgICAgICAgICAgIHBDdXJyRWxtLT5tX1NwYWNlQmVmb3JlID0gU3BhY2VCZWZvcmUgPiA1MCA/IDUwLjBmIDogU3BhY2VCZWZvcmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQWRkT2JqZWN0QXJyYXkocEN1cnJFbG0sIHBDZWxsLT5tX09iakxpc3QpOwotICAgICAgICBwbGFzdENlbGwgPSBwQ2VsbDsKLSAgICB9Ci19Ci12b2lkIENQREZfQXV0b1JlZmxvd0xheW91dFByb3ZpZGVyOjpHZW5lcmF0ZVBhcmFncmFwaChDRlhfUHRyQXJyYXkmIGNlbGxBcnJheSkKLXsKLSAgICBpbnQgY291bnQgPSBjZWxsQXJyYXkuR2V0U2l6ZSgpOwotICAgIGlmKGNvdW50IDw9IDEpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUkZfQ0VMTCogcGxhc3RDZWxsID0gKENSRl9DRUxMKiljZWxsQXJyYXkuR2V0QXQoMCk7Ci0gICAgaWYocGxhc3RDZWxsLT5tX0JCb3guSGVpZ2h0KCkgPiBwbGFzdENlbGwtPm1fQkJveC5XaWR0aCgpKSB7Ci0gICAgICAgIG1fV3JpdGluZ01vZGUgPSBXcml0aW5nTW9kZV9UQlJMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fV3JpdGluZ01vZGUgPSBXcml0aW5nTW9kZV9MUlRCOwotICAgIH0KLSAgICBGWF9CT09MIGJFbmZvcmNlID0gRkFMU0U7Ci0gICAgaW50IGkgPSAwOwotICAgIGZvcihpID0gMTsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgQ1JGX0NFTEwqIHBDZWxsID0gKENSRl9DRUxMKiljZWxsQXJyYXkuR2V0QXQoaSk7Ci0gICAgICAgIGlmKCFwQ2VsbCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGMgPSBwQ2VsbC0+bV9PYmpMaXN0LkdldENvdW50KCk7Ci0gICAgICAgIEZYX0JPT0wgYk1lcmdlID0gRkFMU0U7Ci0gICAgICAgIEZYX1BPU0lUSU9OIHBvczEgPSBwbGFzdENlbGwtPm1fT2JqTGlzdC5HZXRUYWlsUG9zaXRpb24oKTsKLSAgICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwTGFzdE9iaiA9IChDUERGX1BhZ2VPYmplY3QqKXBsYXN0Q2VsbC0+bV9PYmpMaXN0LkdldFByZXYocG9zMSk7Ci0gICAgICAgIHBvczEgPSBwQ2VsbC0+bV9PYmpMaXN0LkdldEhlYWRQb3NpdGlvbigpOwotICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBDdXJPYmogPSAoQ1BERl9QYWdlT2JqZWN0KilwQ2VsbC0+bV9PYmpMaXN0LkdldE5leHQocG9zMSk7Ci0gICAgICAgIGludCBXcml0aW5nTW9kZSA9IEdldFJlY3RFbmQocENlbGwtPm1fQkJveCk7Ci0gICAgICAgIGlmKHBDZWxsLT5tX0NlbGxXcml0aW5nTW9kZSA9PSBXcml0aW5nTW9kZV9VTktOT1cpIHsKLSAgICAgICAgICAgIGlmKHBDZWxsLT5tX0JCb3guSGVpZ2h0KCkgPiBwQ2VsbC0+bV9CQm94LldpZHRoKCkpIHsKLSAgICAgICAgICAgICAgICBwQ2VsbC0+bV9DZWxsV3JpdGluZ01vZGUgPSBXcml0aW5nTW9kZV9UQlJMOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwQ2VsbC0+bV9DZWxsV3JpdGluZ01vZGUgPSBXcml0aW5nTW9kZV9MUlRCOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFdyaXRpbmdNb2RlID0gcENlbGwtPm1fQ2VsbFdyaXRpbmdNb2RlOwotICAgICAgICBpZihXcml0aW5nTW9kZSA9PSBXcml0aW5nTW9kZV9MUlRCICYmIChtX1N0eWxlLm1fTGFuZ3VhZ2UgJiBMUF9MYW5nX0NoaW5lc2VQUkMgfHwgbV9TdHlsZS5tX0xhbmd1YWdlICYgTFBfTGFuZ19DaGluZXNlVGFpd2FuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1fU3R5bGUubV9MYW5ndWFnZSAmIExQX0xhbmdfSmFwYW5lc2UgfHwgbV9TdHlsZS5tX0xhbmd1YWdlICYgTFBfTGFuZ19Lb3JlYW4pKSB7Ci0gICAgICAgICAgICBpZihwQ3VyT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9URVhUKSB7Ci0gICAgICAgICAgICAgICAgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dDsKLSAgICAgICAgICAgICAgICBwVGV4dCA9IChDUERGX1RleHRPYmplY3QqKXBDdXJPYmo7Ci0gICAgICAgICAgICAgICAgaWYocFRleHQtPkNvdW50SXRlbXMoKSkgewotICAgICAgICAgICAgICAgICAgICBDUERGX1RleHRPYmplY3RJdGVtIGl0ZW07Ci0gICAgICAgICAgICAgICAgICAgIHBUZXh0LT5HZXRJdGVtSW5mbygwLCAmaXRlbSk7Ci0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHN0ciA9IHBUZXh0LT5HZXRGb250KCktPlVuaWNvZGVGcm9tQ2hhckNvZGUoaXRlbS5tX0NoYXJDb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgdW5pY29kZSA9IHN0ci5HZXRBdCgwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYodW5pY29kZSA9PSAzMikgewotICAgICAgICAgICAgICAgICAgICAgICAgcGxhc3RDZWxsID0gcENlbGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiTWVyZ2UgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJFbmZvcmNlID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihtX1dyaXRpbmdNb2RlID09IFdyaXRpbmdNb2RlKSB7Ci0gICAgICAgICAgICBpZihiRW5mb3JjZSkgewotICAgICAgICAgICAgICAgIGJNZXJnZSA9IEZBTFNFOwotICAgICAgICAgICAgICAgIGJFbmZvcmNlID0gRkFMU0U7Ci0gICAgICAgICAgICAgICAgaWYocEN1ck9iai0+bV9UeXBlID09IFBERlBBR0VfVEVYVCkgewotICAgICAgICAgICAgICAgICAgICBDUERGX1RleHRPYmplY3QqIHBUZXh0OwotICAgICAgICAgICAgICAgICAgICBwVGV4dCA9IChDUERGX1RleHRPYmplY3QqKXBDdXJPYmo7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHBUZXh0LT5Db3VudEl0ZW1zKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENQREZfVGV4dE9iamVjdEl0ZW0gaXRlbTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBUZXh0LT5HZXRJdGVtSW5mbygwLCAmaXRlbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzdHIgPSBwVGV4dC0+R2V0Rm9udCgpLT5Vbmljb2RlRnJvbUNoYXJDb2RlKGl0ZW0ubV9DaGFyQ29kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiB1bmljb2RlID0gc3RyLkdldEF0KDApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYodW5pY29kZSA+IDk2ICYmIHVuaWNvZGUgPCAxMjMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWVyZ2UgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlID0gKENQREZfSW1hZ2VPYmplY3QqKXBDdXJPYmo7Ci0gICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QgaW1hZ2VCQm94ID0gcEltYWdlLT5HZXRCQm94KCZtX1BERkRpc3BsYXlNYXRyaXgpOwotICAgICAgICAgICAgICAgICAgICBpZihHZXRSZWN0RW5kKHBsYXN0Q2VsbC0+bV9CQm94KSAtIEdldFJlY3RFbmQocENlbGwtPm1fQkJveCkgPCBHZXRSZWN0V2lkdGgoaW1hZ2VCQm94KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYk1lcmdlID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYoIWFwcHJvYWNodG8oR2V0UmVjdFN0YXJ0KHBDZWxsLT5tX0JCb3gpLCBHZXRSZWN0U3RhcnQocGxhc3RDZWxsLT5tX0JCb3gpLCBHZXRSZWN0SGVpZ2h0KHBDZWxsLT5tX0JCb3gpIC8gNCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoYXBwcm9hY2h0byhHZXRSZWN0U3RhcnQocGxhc3RDZWxsLT5tX0JCb3gpLCBHZXRSZWN0U3RhcnQocENlbGwtPm1fQkJveCksIEdldFJlY3RIZWlnaHQocENlbGwtPm1fQkJveCkgKiAyLjMpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0UmVjdFN0YXJ0KHBsYXN0Q2VsbC0+bV9CQm94KSAtIEdldFJlY3RTdGFydChwQ2VsbC0+bV9CQm94KSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBDdXJPYmotPm1fVHlwZSA9PSBQREZQQUdFX1RFWFQgfHwgcExhc3RPYmotPm1fVHlwZSA9PSBQREZQQUdFX1RFWFQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1RleHRPYmplY3QqIHBUZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBDdXJPYmotPm1fVHlwZSA9PSBQREZQQUdFX1RFWFQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRleHQgPSAoQ1BERl9UZXh0T2JqZWN0KilwQ3VyT2JqOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZXh0ID0gKENQREZfVGV4dE9iamVjdCopcExhc3RPYmo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfVGV4dE9iamVjdEl0ZW0gaXRlbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGV4dC0+R2V0SXRlbUluZm8oMCwgJml0ZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHN0ciA9IHBUZXh0LT5HZXRGb250KCktPlVuaWNvZGVGcm9tQ2hhckNvZGUoaXRlbS5tX0NoYXJDb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiB1bmljb2RlID0gc3RyLkdldEF0KDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHVuaWNvZGUgPiAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1lcmdlID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYoIWFwcHJvYWNodG8oR2V0UmVjdEVuZChwQ2VsbC0+bV9CQm94KSwgR2V0UmVjdEVuZChwbGFzdENlbGwtPm1fQkJveCksIEdldFJlY3RIZWlnaHQocENlbGwtPm1fQkJveCkgKiAzKSkgewotICAgICAgICAgICAgICAgICAgICBGWF9SRUNUIHJlY3QgPSBwTGFzdE9iai0+R2V0QkJveCgmbV9QREZEaXNwbGF5TWF0cml4KTsKLSAgICAgICAgICAgICAgICAgICAgaWYoYXBwcm9hY2h0byhHZXRSZWN0U3RhcnQocENlbGwtPm1fQkJveCksIEdldFJlY3RTdGFydChwbGFzdENlbGwtPm1fQkJveCksIEdldFJlY3RIZWlnaHQocENlbGwtPm1fQkJveCkgLyA0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoR2V0UmVjdEVuZChyZWN0KSAtIEdldFJlY3RFbmQocENlbGwtPm1fQkJveCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1lcmdlID0gVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRW5mb3JjZSA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoR2V0UmVjdEVuZChyZWN0KSAtIEdldFJlY3RFbmQocENlbGwtPm1fQkJveCkgPD0gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFJlY3RFbmQocmVjdCkgLSBHZXRSZWN0RW5kKHBDZWxsLT5tX0JCb3gpID4gR2V0UmVjdEhlaWdodChwQ2VsbC0+bV9CQm94KSAqIC0zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocEN1ck9iai0+bV9UeXBlID09IFBERlBBR0VfVEVYVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1RleHRPYmplY3QqIHBUZXh0ID0gKENQREZfVGV4dE9iamVjdCopcEN1ck9iajsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9UZXh0T2JqZWN0SXRlbSBpdGVtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGV4dC0+R2V0SXRlbUluZm8oMCwgJml0ZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzdHIgPSBwVGV4dC0+R2V0Rm9udCgpLT5Vbmljb2RlRnJvbUNoYXJDb2RlKGl0ZW0ubV9DaGFyQ29kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIHVuaWNvZGUgPSBzdHIuR2V0QXQoMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHVuaWNvZGUgPiA5NiAmJiB1bmljb2RlIDwgMTIzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWVyZ2UgPSBUUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYk1lcmdlID0gVFJVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX1dyaXRpbmdNb2RlID0gV3JpdGluZ01vZGU7Ci0gICAgICAgICAgICBiRW5mb3JjZSA9IEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmKGJNZXJnZSkgewotICAgICAgICAgICAgaWYoR2V0UmVjdEVuZChwbGFzdENlbGwtPm1fQkJveCkgLSBHZXRSZWN0RW5kKHBDZWxsLT5tX0JCb3gpID4gMzApIHsKLSAgICAgICAgICAgICAgICBiRW5mb3JjZSA9IFRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9QT1NJVElPTiBwb3MgPSBwQ2VsbC0+bV9PYmpMaXN0LkdldEhlYWRQb3NpdGlvbigpOwotICAgICAgICAgICAgd2hpbGUocG9zKSB7Ci0gICAgICAgICAgICAgICAgcGxhc3RDZWxsLT5tX09iakxpc3QuQWRkVGFpbChwQ2VsbC0+bV9PYmpMaXN0LkdldE5leHQocG9zKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwbGFzdENlbGwtPm1fQkJveC5VbmlvbihwQ2VsbC0+bV9CQm94KTsKLSAgICAgICAgICAgIHBDZWxsLT5tX09iakxpc3QuUmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICBkZWxldGUgcENlbGw7Ci0gICAgICAgICAgICBjZWxsQXJyYXkuUmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICBpLS07Ci0gICAgICAgICAgICBjb3VudC0tOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGxhc3RDZWxsID0gcENlbGw7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci12b2lkIENQREZfQXV0b1JlZmxvd0xheW91dFByb3ZpZGVyOjpQcm9jZXNzT2JqKENGWF9QdHJBcnJheSYgY2VsbEFycmF5LCBDUERGX1BhZ2VPYmplY3QqIHBPYmosIENGWF9BZmZpbmVNYXRyaXggbWF0cml4KQotewotfQotRlhfSU5UMzIgQ1BERl9BdXRvUmVmbG93TGF5b3V0UHJvdmlkZXI6OkxvZ2ljUHJlT2JqKENQREZfUGFnZU9iamVjdCogcE9iaikKLXsKLSAgICBDUERGX1BhZ2VPYmplY3QqIHBQcmVPYmogPSBtX3BQcmVPYmo7Ci0gICAgbV9wUHJlT2JqID0gcE9iajsKLSAgICBpZighcFByZU9iaikgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYocFByZU9iai0+bV9UeXBlICE9IHBPYmotPm1fVHlwZSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByY0N1ck9iaihwT2JqLT5tX0xlZnQsIHBPYmotPm1fQm90dG9tLCBwT2JqLT5tX1JpZ2h0LCBwT2JqLT5tX1RvcCk7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByY1ByZU9iaihwUHJlT2JqLT5tX0xlZnQsIHBQcmVPYmotPm1fQm90dG9tLCBwUHJlT2JqLT5tX1JpZ2h0LCBwUHJlT2JqLT5tX1RvcCk7Ci0gICAgaWYocE9iai0+bV9UeXBlID09IFBERlBBR0VfSU1BR0UpIHsKLSAgICAgICAgaWYocmNQcmVPYmouQ29udGFpbnMocmNDdXJPYmopKSB7Ci0gICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgfQotICAgICAgICBpZihyY0N1ck9iai5Db250YWlucyhyY1ByZU9iaikpIHsKLSAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZihwT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9URVhUKSB7Ci0gICAgICAgIGlmKCEoKHJjUHJlT2JqLmJvdHRvbSA+IHJjQ3VyT2JqLnRvcCkgfHwgKHJjUHJlT2JqLnRvcCA8IHJjQ3VyT2JqLmJvdHRvbSkpKSB7Ci0gICAgICAgICAgICBGWF9GTE9BVCBoZWlnaHQgPSBGWF9NSU4ocmNQcmVPYmouSGVpZ2h0KCksIHJjQ3VyT2JqLkhlaWdodCgpKTsKLSAgICAgICAgICAgIGlmKChyY0N1ck9iai5sZWZ0IC0gcmNQcmVPYmoucmlnaHQpID4gaGVpZ2h0IC8gMykgewotICAgICAgICAgICAgICAgIHJldHVybiAzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKEZYU1lTX2ZhYnMocmNQcmVPYmouV2lkdGgoKSAtIHJjQ3VyT2JqLldpZHRoKCkpID49IDIgfHwgRlhTWVNfZmFicyhyY1ByZU9iai5IZWlnaHQoKSAtIHJjQ3VyT2JqLkhlaWdodCgpKSA+PSAyICkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9UZXh0T2JqZWN0KiBwUHJlVGV4dE9iaiA9IChDUERGX1RleHRPYmplY3QqKXBQcmVPYmo7Ci0gICAgICAgIENQREZfVGV4dE9iamVjdCogcEN1clRleHRPYmogPSAoQ1BERl9UZXh0T2JqZWN0KilwT2JqOwotICAgICAgICBpbnQgblByZUNvdW50ID0gcFByZVRleHRPYmotPkNvdW50SXRlbXMoKTsKLSAgICAgICAgaW50IG5DdXJDb3VudCA9IHBDdXJUZXh0T2JqLT5Db3VudEl0ZW1zKCk7Ci0gICAgICAgIGlmIChuUHJlQ291bnQgIT0gbkN1ckNvdW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBGWF9CT09MIGJTYW1lID0gVFJVRTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuUHJlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgQ1BERl9UZXh0T2JqZWN0SXRlbSBpdGVtUGVyLCBpdGVtQ3VyOwotICAgICAgICAgICAgcFByZVRleHRPYmotPkdldEl0ZW1JbmZvKGksICZpdGVtUGVyKTsKLSAgICAgICAgICAgIHBDdXJUZXh0T2JqLT5HZXRJdGVtSW5mbyhpLCAmaXRlbUN1cik7Ci0gICAgICAgICAgICBpZiAoaXRlbUN1ci5tX0NoYXJDb2RlICE9IGl0ZW1QZXIubV9DaGFyQ29kZSkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGl0ZW1DdXIubV9PcmlnaW5YICE9IGl0ZW1QZXIubV9PcmlnaW5YKSB7Ci0gICAgICAgICAgICAgICAgYlNhbWUgPSBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpdGVtQ3VyLm1fT3JpZ2luWSAhPSBpdGVtUGVyLm1fT3JpZ2luWSkgewotICAgICAgICAgICAgICAgIGJTYW1lID0gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYocmNQcmVPYmoubGVmdCA9PSByY0N1ck9iai5sZWZ0ICYmIHJjUHJlT2JqLnRvcCA9PSByY0N1ck9iai50b3ApIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGlmKEZYU1lTX2ZhYnMocmNQcmVPYmoubGVmdCAtIHJjQ3VyT2JqLmxlZnQpIDwgcmNQcmVPYmouV2lkdGgoKSAvIDMKLSAgICAgICAgICAgICAgICAmJiBGWFNZU19mYWJzKHJjUHJlT2JqLnRvcCAtIHJjQ3VyT2JqLnRvcCkgPCByY1ByZU9iai5IZWlnaHQoKSAvIDMpIHsKLSAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotdm9pZCBDUERGX0F1dG9SZWZsb3dMYXlvdXRQcm92aWRlcjo6R2VuZXJhdGVMaW5lKENGWF9QdHJBcnJheSYgY2VsbEFycmF5KQotewotICAgIENSRl9DRUxMKiBwQ2VsbCA9IE5VTEw7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXg7Ci0gICAgRlhfUE9TSVRJT04gcG9zID0gbV9wUERGUGFnZS0+R2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpOwotICAgIGlmKCFwb3MpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9GTE9BVCBQREZXaWR0aCA9IG1fcFBERlBhZ2UtPkdldFBhZ2VXaWR0aCgpOwotICAgIEZYX0ZMT0FUIFBERkhlaWdodCA9IG1fcFBERlBhZ2UtPkdldFBhZ2VIZWlnaHQoKTsKLSAgICBtX3BQREZQYWdlLT5HZXREaXNwbGF5TWF0cml4KG1fUERGRGlzcGxheU1hdHJpeCwgMCwgMCwgKGludClQREZXaWR0aCwgKGludClQREZIZWlnaHQsIDApOwotICAgIENQREZfUGFnZU9iamVjdCogcFBlck9iaiA9IE5VTEw7Ci0gICAgaW50IGEgPSAwOwotICAgIENGWF9GbG9hdFJlY3QgcGFnZUJCb3ggPSBtX3BQREZQYWdlLT5tX0JCb3g7Ci0gICAgRlhfRkxPQVQgUHJldlggPSAwICwgUHJldlkgPSAwLCBQb3NYLCBQb3NZOwotICAgIHdoaWxlKHBvcykgewotICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBPYmogPSBtX3BQREZQYWdlLT5HZXROZXh0T2JqZWN0KHBvcyk7Ci0gICAgICAgIGlmKCFwT2JqIHx8IHBPYmotPm1fVHlwZSA9PSBQREZQQUdFX1BBVEgpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludCBsb2dpYyA9IExvZ2ljUHJlT2JqKHBPYmopOwotICAgICAgICBpZihsb2dpYyA9PSAyKSB7Ci0gICAgICAgICAgICBpZihwQ2VsbCkgewotICAgICAgICAgICAgICAgIHBDZWxsLT5tX09iakxpc3QuU2V0QXQocENlbGwtPm1fT2JqTGlzdC5HZXRUYWlsUG9zaXRpb24oKSwgcE9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocE9iai0+bV9UeXBlID09IFBERlBBR0VfVEVYVCkgewotICAgICAgICAgICAgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiA9IChDUERGX1RleHRPYmplY3QqKXBPYmo7Ci0gICAgICAgICAgICBpbnQgdGV4dG1vZGUgPSBwVGV4dE9iai0+bV9UZXh0U3RhdGUuR2V0T2JqZWN0KCktPm1fVGV4dE1vZGU7Ci0gICAgICAgICAgICBpZihtX1N0eWxlLm1fYklnbm9yZUludmlzaWJsZVRleHQgJiYgcFRleHRPYmotPm1fVGV4dFN0YXRlLkdldE9iamVjdCgpLT5tX1RleHRNb2RlID09IDMpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFBvc1ggPSBwVGV4dE9iai0+R2V0UG9zWCgpOwotICAgICAgICAgICAgUG9zWSA9IHBUZXh0T2JqLT5HZXRQb3NZKCk7Ci0gICAgICAgICAgICBtX1BERkRpc3BsYXlNYXRyaXguVHJhbnNmb3JtKFBvc1gsIFBvc1kpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgUG9zWCA9IDA7Ci0gICAgICAgICAgICBQb3NZID0gMDsKLSAgICAgICAgfQotICAgICAgICBGWF9CT09MIGJOZXdMaW5lID0gVFJVRTsKLSAgICAgICAgRlhfUkVDVCBPYmpCQm94ID0gcE9iai0+R2V0QkJveCgmbV9QREZEaXNwbGF5TWF0cml4KTsKLSAgICAgICAgaWYoT2JqQkJveC5sZWZ0ID4gUERGV2lkdGggfHwgT2JqQkJveC5yaWdodCA8IDAgfHwKLSAgICAgICAgICAgICAgICBPYmpCQm94LmJvdHRvbSA8IDAgfHwgT2JqQkJveC50b3AgPiBQREZIZWlnaHQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmKE9iakJCb3guSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBhKys7Ci0gICAgICAgIGlmKCFwQ2VsbCkgewotICAgICAgICAgICAgYk5ld0xpbmUgPSBUUlVFOwotICAgICAgICAgICAgbV9Xcml0aW5nTW9kZSA9IEdldFdyaXRpbmdNb2RlKE5VTEwsIHBPYmopOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IFdyaXRpbmdNb2RlID0gR2V0V3JpdGluZ01vZGUocFBlck9iaiwgcE9iaik7Ci0gICAgICAgICAgICBpZihtX1dyaXRpbmdNb2RlID09IFdyaXRpbmdNb2RlIHx8IG1fV3JpdGluZ01vZGUgPT0gV3JpdGluZ01vZGVfVU5LTk9XIHx8IFdyaXRpbmdNb2RlID09IFdyaXRpbmdNb2RlX1VOS05PVykgewotICAgICAgICAgICAgICAgIGlmKFdyaXRpbmdNb2RlICE9IFdyaXRpbmdNb2RlX1VOS05PVykgewotICAgICAgICAgICAgICAgICAgICBtX1dyaXRpbmdNb2RlID0gV3JpdGluZ01vZGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKG1fV3JpdGluZ01vZGUgPT0gV3JpdGluZ01vZGVfVEJSTCkgewotICAgICAgICAgICAgICAgICAgICBpZighKEdldFJlY3RCb3R0b20oT2JqQkJveCkgPiBHZXRSZWN0VG9wKHBDZWxsLT5tX0JCb3gpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0UmVjdFRvcChPYmpCQm94KSA8IEdldFJlY3RCb3R0b20ocENlbGwtPm1fQkJveCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiTmV3TGluZSA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIShHZXRSZWN0Qm90dG9tKE9iakJCb3gpIDwgR2V0UmVjdFRvcChwQ2VsbC0+bV9CQm94KSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFJlY3RUb3AoT2JqQkJveCkgPiBHZXRSZWN0Qm90dG9tKHBDZWxsLT5tX0JCb3gpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYk5ld0xpbmUgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocE9iai0+bV9UeXBlID09IFBERlBBR0VfVEVYVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoRlhTWVNfZmFicyhQcmV2WSAtIFBvc1kpIDwgMSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTmV3TGluZSA9IEZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX1dyaXRpbmdNb2RlID0gV3JpdGluZ01vZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcFBlck9iaiA9IHBPYmo7Ci0gICAgICAgIGlmKGJOZXdMaW5lKSB7Ci0gICAgICAgICAgICBpbnQgYyA9IHBDZWxsID8gcENlbGwtPm1fT2JqTGlzdC5HZXRDb3VudCgpIDogMDsKLSAgICAgICAgICAgIHBDZWxsID0gbmV3IENSRl9DRUxMOwotICAgICAgICAgICAgcENlbGwtPm1fQ2VsbFdyaXRpbmdNb2RlID0gbV9Xcml0aW5nTW9kZTsKLSAgICAgICAgICAgIHBDZWxsLT5tX0JCb3ggPSBPYmpCQm94OwotICAgICAgICAgICAgaWYocE9iai0+bV9UeXBlID09IFBERlBBR0VfVEVYVCkgewotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHggPSAoKENQREZfVGV4dE9iamVjdCopcE9iaiktPkdldFBvc1goKSwgeSA9ICgoQ1BERl9UZXh0T2JqZWN0KilwT2JqKS0+R2V0UG9zWSgpOwotICAgICAgICAgICAgICAgIG1fUERGRGlzcGxheU1hdHJpeC5UcmFuc2Zvcm0oeCwgeSk7Ci0gICAgICAgICAgICAgICAgaWYoeCA8IE9iakJCb3gubGVmdCkgewotICAgICAgICAgICAgICAgICAgICBwQ2VsbC0+bV9CQm94LmxlZnQgPSAoaW50KXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcENlbGwtPm1fT2JqTGlzdC5BZGRUYWlsKHBPYmopOwotICAgICAgICAgICAgY2VsbEFycmF5LkFkZChwQ2VsbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwQ2VsbC0+bV9PYmpMaXN0LkFkZFRhaWwocE9iaik7Ci0gICAgICAgICAgICBwQ2VsbC0+bV9CQm94LlVuaW9uKE9iakJCb3gpOwotICAgICAgICB9Ci0gICAgICAgIFByZXZYID0gUG9zWDsKLSAgICAgICAgUHJldlkgPSBQb3NZOwotICAgIH0KLX0KLUZYX0ZMT0FUIENQREZfQXV0b1JlZmxvd0xheW91dFByb3ZpZGVyOjpHZXRMYXlvdXRPcmRlckhlaWdodChDUERGX1BhZ2VPYmplY3QqIHBDdXJPYmopCi17Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByY0N1ck9iaihwQ3VyT2JqLT5tX0xlZnQsIHBDdXJPYmotPm1fQm90dG9tLCBwQ3VyT2JqLT5tX1JpZ2h0LCBwQ3VyT2JqLT5tX1RvcCk7Ci0gICAgaWYgKG1fV3JpdGluZ01vZGUgPT0gV3JpdGluZ01vZGVfVEJSTCkgewotICAgICAgICByZXR1cm4gcmNDdXJPYmouV2lkdGgoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJjQ3VyT2JqLkhlaWdodCgpOwotfQotRlhfRkxPQVQgQ1BERl9BdXRvUmVmbG93TGF5b3V0UHJvdmlkZXI6OkdldExheW91dE9yZGVyV2lkdGgoQ1BERl9QYWdlT2JqZWN0KiBwQ3VyT2JqKQotewotICAgIENGWF9GbG9hdFJlY3QgcmNDdXJPYmoocEN1ck9iai0+bV9MZWZ0LCBwQ3VyT2JqLT5tX0JvdHRvbSwgcEN1ck9iai0+bV9SaWdodCwgcEN1ck9iai0+bV9Ub3ApOwotICAgIGlmIChtX1dyaXRpbmdNb2RlID09IFdyaXRpbmdNb2RlX1RCUkwpIHsKLSAgICAgICAgcmV0dXJuIHJjQ3VyT2JqLkhlaWdodCgpOwotICAgIH0KLSAgICByZXR1cm4gcmNDdXJPYmouV2lkdGgoKTsKLX0KLWludCBDUERGX0F1dG9SZWZsb3dMYXlvdXRQcm92aWRlcjo6IEdldFJlY3RXaWR0aChGWF9SRUNUIHJlY3QpCi17Ci0gICAgaWYobV9Xcml0aW5nTW9kZSA9PSBXcml0aW5nTW9kZV9UQlJMKSB7Ci0gICAgICAgIHJldHVybiByZWN0LkhlaWdodCgpOwotICAgIH0KLSAgICByZXR1cm4gcmVjdC5XaWR0aCgpOwotfQotaW50IENQREZfQXV0b1JlZmxvd0xheW91dFByb3ZpZGVyOjogR2V0UmVjdEhlaWdodChGWF9SRUNUIHJlY3QpCi17Ci0gICAgaWYobV9Xcml0aW5nTW9kZSA9PSBXcml0aW5nTW9kZV9UQlJMKSB7Ci0gICAgICAgIHJldHVybiByZWN0LldpZHRoKCk7Ci0gICAgfQotICAgIHJldHVybiByZWN0LkhlaWdodCgpOwotfQotaW50IENQREZfQXV0b1JlZmxvd0xheW91dFByb3ZpZGVyOjogR2V0UmVjdFN0YXJ0KEZYX1JFQ1QgcmVjdCkKLXsKLSAgICBpZihtX1dyaXRpbmdNb2RlID09IFdyaXRpbmdNb2RlX1RCUkwpIHsKLSAgICAgICAgcmV0dXJuIHJlY3QudG9wOwotICAgIH0KLSAgICByZXR1cm4gcmVjdC5sZWZ0OwotfQotaW50IENQREZfQXV0b1JlZmxvd0xheW91dFByb3ZpZGVyOjogR2V0UmVjdEVuZChGWF9SRUNUIHJlY3QpCi17Ci0gICAgaWYobV9Xcml0aW5nTW9kZSA9PSBXcml0aW5nTW9kZV9UQlJMKSB7Ci0gICAgICAgIHJldHVybiByZWN0LmJvdHRvbTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlY3QucmlnaHQ7Ci19Ci1pbnQgQ1BERl9BdXRvUmVmbG93TGF5b3V0UHJvdmlkZXI6OiBHZXRSZWN0VG9wKEZYX1JFQ1QgcmVjdCkKLXsKLSAgICBpZihtX1dyaXRpbmdNb2RlID09IFdyaXRpbmdNb2RlX1RCUkwpIHsKLSAgICAgICAgcmV0dXJuIHJlY3QucmlnaHQ7Ci0gICAgfQotICAgIHJldHVybiByZWN0LnRvcDsKLX0KLWludCBDUERGX0F1dG9SZWZsb3dMYXlvdXRQcm92aWRlcjo6IEdldFJlY3RCb3R0b20oRlhfUkVDVCByZWN0KQotewotICAgIGlmKG1fV3JpdGluZ01vZGUgPT0gV3JpdGluZ01vZGVfVEJSTCkgewotICAgICAgICByZXR1cm4gcmVjdC5sZWZ0OwotICAgIH0KLSAgICByZXR1cm4gcmVjdC5ib3R0b207Ci19Ci1pbnQgQ1BERl9BdXRvUmVmbG93TGF5b3V0UHJvdmlkZXI6OkdldFdyaXRpbmdNb2RlKENQREZfUGFnZU9iamVjdCogcFByZU9iaiwgQ1BERl9QYWdlT2JqZWN0KiBwQ3VyT2JqKQotewotICAgIENGWF9GbG9hdFJlY3QgcmNDdXJPYmoocEN1ck9iai0+bV9MZWZ0LCBwQ3VyT2JqLT5tX0JvdHRvbSwgcEN1ck9iai0+bV9SaWdodCwgcEN1ck9iai0+bV9Ub3ApOwotICAgIGlmKHBDdXJPYmotPm1fVHlwZSA9PSBQREZQQUdFX1RFWFQpIHsKLSAgICAgICAgQ1BERl9UZXh0T2JqZWN0KiBwdGV4dE9iaiA9IChDUERGX1RleHRPYmplY3QqIClwQ3VyT2JqOwotICAgICAgICBpbnQgY291bnQgPSBwdGV4dE9iai0+Q291bnRJdGVtcygpOwotICAgICAgICBpZihjb3VudCA+IDEpIHsKLSAgICAgICAgICAgIENQREZfVGV4dE9iamVjdEl0ZW0gSXRlbTEsIEl0ZW0yOwotICAgICAgICAgICAgcHRleHRPYmotPkdldEl0ZW1JbmZvKDAsICZJdGVtMSk7Ci0gICAgICAgICAgICBwdGV4dE9iai0+R2V0SXRlbUluZm8oY291bnQgLSAxLCAmSXRlbTIpOwotICAgICAgICAgICAgaWYoSXRlbTIubV9DaGFyQ29kZSA9PSAtMSAmJiBjb3VudCA+IDIpIHsKLSAgICAgICAgICAgICAgICBwdGV4dE9iai0+R2V0SXRlbUluZm8oMiwgJkl0ZW0yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXggdGV4dE1hdHJpeDsKLSAgICAgICAgICAgIHB0ZXh0T2JqLT5HZXRUZXh0TWF0cml4KCZ0ZXh0TWF0cml4KTsKLSAgICAgICAgICAgIHRleHRNYXRyaXguVHJhbnNmb3JtKEl0ZW0xLm1fT3JpZ2luWCwgSXRlbTEubV9PcmlnaW5ZKTsKLSAgICAgICAgICAgIHRleHRNYXRyaXguVHJhbnNmb3JtKEl0ZW0yLm1fT3JpZ2luWCwgSXRlbTIubV9PcmlnaW5ZKTsKLSAgICAgICAgICAgIEZYX0ZMT0FUIGR4ID0gRlhTWVNfZmFicyhJdGVtMS5tX09yaWdpblggLSBJdGVtMi5tX09yaWdpblgpOwotICAgICAgICAgICAgRlhfRkxPQVQgZHkgPSBGWFNZU19mYWJzKEl0ZW0xLm1fT3JpZ2luWSAtIEl0ZW0yLm1fT3JpZ2luWSk7Ci0gICAgICAgICAgICByZXR1cm4gZHggPj0gZHkgPyBXcml0aW5nTW9kZV9MUlRCIDogV3JpdGluZ01vZGVfVEJSTDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmKG1fV3JpdGluZ01vZGUgIT0gV3JpdGluZ01vZGVfVU5LTk9XKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1fV3JpdGluZ01vZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYocFByZU9iaikgewotICAgICAgICBGWF9GTE9BVCB0aHJlc2hvbGQgPSByY0N1ck9iai5XaWR0aCgpIC8gNDsKLSAgICAgICAgaWYobV9Xcml0aW5nTW9kZSA9PSBXcml0aW5nTW9kZV9MUlRCKSB7Ci0gICAgICAgICAgICBpZihGWFNZU19mYWJzKHBQcmVPYmotPm1fQm90dG9tIC0gcEN1ck9iai0+bV9Cb3R0b20pIDwgdGhyZXNob2xkICogMgotICAgICAgICAgICAgICAgICAgICAmJiBGWFNZU19mYWJzKHBQcmVPYmotPm1fVG9wIC0gcEN1ck9iai0+bV9Ub3ApIDwgdGhyZXNob2xkICogMikgewotICAgICAgICAgICAgICAgIHJldHVybiBtX1dyaXRpbmdNb2RlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfRkxPQVQgbWlkID0gKHBDdXJPYmotPm1fQm90dG9tICsgcEN1ck9iai0+bV9Ub3ApIC8gMjsKLSAgICAgICAgICAgIGlmKG1pZCA+IHBQcmVPYmotPm1fQm90dG9tICYmIG1pZCA8IHBQcmVPYmotPm1fVG9wICYmIHBDdXJPYmotPm1fUmlnaHQgPiBwUHJlT2JqLT5tX1JpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1fV3JpdGluZ01vZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZihtX1dyaXRpbmdNb2RlID09IFdyaXRpbmdNb2RlX1RCUkwpIHsKLSAgICAgICAgICAgIGlmKEZYU1lTX2ZhYnMocFByZU9iai0+bV9MZWZ0IC0gcEN1ck9iai0+bV9MZWZ0KSA8IHRocmVzaG9sZCAqIDIKLSAgICAgICAgICAgICAgICAgICAgJiYgRlhTWVNfZmFicyhwUHJlT2JqLT5tX1JpZ2h0IC0gcEN1ck9iai0+bV9SaWdodCkgPCB0aHJlc2hvbGQgKiAyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1fV3JpdGluZ01vZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9GTE9BVCBtaWQgPSAocEN1ck9iai0+bV9SaWdodCArIHBDdXJPYmotPm1fTGVmdCkgLyAyOwotICAgICAgICAgICAgaWYobWlkID4gcFByZU9iai0+bV9MZWZ0ICYmIG1pZCA8IHBQcmVPYmotPm1fUmlnaHQgJiYgcEN1ck9iai0+bV9Cb3R0b20gPCBwUHJlT2JqLT5tX0JvdHRvbSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtX1dyaXRpbmdNb2RlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKEZYU1lTX2ZhYnMocFByZU9iai0+bV9MZWZ0IC0gcEN1ck9iai0+bV9MZWZ0KSA8IHRocmVzaG9sZCAmJgotICAgICAgICAgICAgICAgIEZYU1lTX2ZhYnMocFByZU9iai0+bV9Cb3R0b20gLSBwQ3VyT2JqLT5tX0JvdHRvbSkgPiB0aHJlc2hvbGQgKiAyKSB7Ci0gICAgICAgICAgICByZXR1cm4gV3JpdGluZ01vZGVfVEJSTDsKLSAgICAgICAgfQotICAgICAgICBpZihGWFNZU19mYWJzKHBQcmVPYmotPm1fTGVmdCAtIHBDdXJPYmotPm1fTGVmdCkgPiB0aHJlc2hvbGQgJiYKLSAgICAgICAgICAgICAgICBGWFNZU19mYWJzKHBQcmVPYmotPm1fQm90dG9tIC0gcEN1ck9iai0+bV9Cb3R0b20pIDwgdGhyZXNob2xkICogMikgewotICAgICAgICAgICAgcmV0dXJuIFdyaXRpbmdNb2RlX0xSVEI7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgaWYocFByZU9iai0+bV9UeXBlID09IFBERlBBR0VfVEVYVCkgewotICAgICAgICAgICAgQ1BERl9UZXh0T2JqZWN0KiBwdGV4dE9iaiA9IChDUERGX1RleHRPYmplY3QqIClwQ3VyT2JqOwotICAgICAgICAgICAgY291bnQgPSBwdGV4dE9iai0+Q291bnRJdGVtcygpOwotICAgICAgICB9Ci0gICAgICAgIGlmKHBQcmVPYmotPm1fVHlwZSAhPSBQREZQQUdFX1RFWFQgfHwgY291bnQgPT0gMSkgewotICAgICAgICAgICAgaWYocEN1ck9iai0+bV9MZWZ0ID4gcFByZU9iai0+bV9SaWdodCkgewotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG1pZCA9IChwQ3VyT2JqLT5tX1RvcCArIHBDdXJPYmotPm1fQm90dG9tKSAvIDI7Ci0gICAgICAgICAgICAgICAgaWYobWlkIDwgcFByZU9iai0+bV9Ub3AgJiYgbWlkID4gcFByZU9iai0+bV9Cb3R0b20pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdyaXRpbmdNb2RlX0xSVEI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocEN1ck9iai0+bV9Ub3AgPCBwUHJlT2JqLT5tX0JvdHRvbSkgewotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG1pZCA9IChwQ3VyT2JqLT5tX0xlZnQgKyBwQ3VyT2JqLT5tX1JpZ2h0KSAvIDI7Ci0gICAgICAgICAgICAgICAgaWYobWlkIDwgcFByZU9iai0+bV9SaWdodCAmJiBtaWQgPiBwUHJlT2JqLT5tX0xlZnQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdyaXRpbmdNb2RlX1RCUkw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBXcml0aW5nTW9kZV9VTktOT1c7Ci19Ci1MYXlvdXRTdGF0dXMgQ1BERl9BdXRvUmVmbG93TGF5b3V0UHJvdmlkZXI6OlN0YXJ0TG9hZChJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBtX3BQYXVzZSA9IHBQYXVzZTsKLSAgICBtX3BSb290ID0gbmV3IENQREZfQXV0b1JlZmxvd0VsZW1lbnQoTGF5b3V0RG9jdW1lbnQpOwotICAgIG1fU3RlcCA9IDA7Ci0gICAgcmV0dXJuIENvbnRpbnVlKCk7Ci19Ci1MYXlvdXRTdGF0dXMgQ1BERl9BdXRvUmVmbG93TGF5b3V0UHJvdmlkZXI6OkNvbnRpbnVlKCkKLXsKLSAgICBHZW5lcmF0ZVN0cnVjdFRyZWUoKTsKLSAgICByZXR1cm4gbV9TdGF0dXM7Ci19Ci1pbnQJQ1BERl9BdXRvUmVmbG93TGF5b3V0UHJvdmlkZXI6OkdldFBvc2l0aW9uKCkKLXsKLSAgICBpZihtX1N0ZXAgPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbV9TdGVwICogMTAwIC8gQVVUT1JFRkxPV19TVEVQX1JFTU9WRURBVEE7Ci0gICAgfQotfQotRlhfRkxPQVQgQ1BERl9BdXRvUmVmbG93TGF5b3V0UHJvdmlkZXI6OkdldE9iak1pbkNlbGwoQ1BERl9QYWdlT2JqZWN0KiBwT2JqKQotewotICAgIGlmKCFwT2JqKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZihwT2JqLT5tX1R5cGUgIT0gUERGUEFHRV9URVhUKSB7Ci0gICAgICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwotICAgICAgICBGWF9SRUNUIHJlY3QgPSBwT2JqLT5HZXRCQm94KCZtYXRyaXgpOwotICAgICAgICByZXR1cm4gKEZYX0ZMT0FUKShyZWN0LldpZHRoKCkpOwotICAgIH0KLSAgICBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqID0gKENQREZfVGV4dE9iamVjdCogKXBPYmo7Ci0gICAgaW50IGNvdW50ID0gcFRleHRPYmotPkNvdW50SXRlbXMoKTsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBDUERGX1RleHRPYmplY3RJdGVtIEl0ZW07Ci0gICAgICAgIHBUZXh0T2JqLT5HZXRJdGVtSW5mbyhpLCAmSXRlbSk7Ci0gICAgICAgIGlmKEl0ZW0ubV9DaGFyQ29kZSA9PSAtMSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoKEl0ZW0ubV9DaGFyQ29kZSA+IDQ3ICYmIEl0ZW0ubV9DaGFyQ29kZSA8IDU4KSB8fCAoSXRlbS5tX0NoYXJDb2RlID4gNjQgJiYgSXRlbS5tX0NoYXJDb2RlIDwgOTEpCi0gICAgICAgICAgICAgICAgfHwgKEl0ZW0ubV9DaGFyQ29kZSA+IDk2ICYmIEl0ZW0ubV9DaGFyQ29kZSA8IDEyMykpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmKEl0ZW0ubV9DaGFyQ29kZSA+IDEyNyB8fCAoSXRlbS5tX0NoYXJDb2RlID4gMzIgJiYgSXRlbS5tX0NoYXJDb2RlIDwgMzUpIHx8IEl0ZW0ubV9DaGFyQ29kZSA9PSAzNyB8fAotICAgICAgICAgICAgICAgIChJdGVtLm1fQ2hhckNvZGUgPiAzOCAmJiBJdGVtLm1fQ2hhckNvZGUgPCA0MikgfHwgSXRlbS5tX0NoYXJDb2RlID09IDQ0IHx8IEl0ZW0ubV9DaGFyQ29kZSA9PSA0NiB8fAotICAgICAgICAgICAgICAgIEl0ZW0ubV9DaGFyQ29kZSA9PSA1OCB8fCBJdGVtLm1fQ2hhckNvZGUgPT0gNTkgfHwgSXRlbS5tX0NoYXJDb2RlID09IDYzIHx8IEl0ZW0ubV9DaGFyQ29kZSA9PSA5MykgewotICAgICAgICAgICAgaWYoaSA9PSBjb3VudCAtIDEpIHsKLSAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKLSAgICAgICAgICAgICAgICBGWF9SRUNUIHJlY3QgPSBwT2JqLT5HZXRCQm94KCZtYXRyaXgpOwotICAgICAgICAgICAgICAgIHJldHVybiAoRlhfRkxPQVQpKHJlY3QuV2lkdGgoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBUZXh0T2JqLT5HZXRJdGVtSW5mbyhpICsgMSwgJkl0ZW0pOwotICAgICAgICAgICAgICAgIHJldHVybiBJdGVtLm1fT3JpZ2luWDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSXRlbS5tX09yaWdpblg7Ci0gICAgfQotICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwotICAgIEZYX1JFQ1QgcmVjdCA9IHBPYmotPkdldEJCb3goJm1hdHJpeCk7Ci0gICAgcmV0dXJuIChGWF9GTE9BVCkocmVjdC5XaWR0aCgpKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL3JlZmxvdy9hdXRvcmVmbG93LmggYi9jb3JlL3NyYy9yZWZsb3cvYXV0b3JlZmxvdy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWFlYmNmLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL3JlZmxvdy9hdXRvcmVmbG93LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBDT1JFX1NSQ19SRUZMT1dfQVVUT1JFRkxPV19IXwotI2RlZmluZSBDT1JFX1NSQ19SRUZMT1dfQVVUT1JFRkxPV19IXwotCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9yZWZsb3cvcmVmbG93ZW5naW5lLmgiCi0jaW5jbHVkZSAicmVmbG93ZWRwYWdlLmgiCi0KLWNsYXNzIENQREZfQXV0b1JlZmxvd0VsZW1lbnQ7Ci1jbGFzcyBDUERGX0F1dG9SZWZsb3dMYXlvdXRQcm92aWRlcjsKLXR5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9BdXRvUmVmbG93RWxlbWVudCo+IENBUl9FbG1QdHJBcnJheTsKLXR5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9QYWdlT2JqZWN0Kj4gQ0FSX09ialB0ckFycmF5OwotY2xhc3MgQ1JGX0NFTEwgCi17Ci1wdWJsaWM6Ci0gICAgQ1JGX0NFTEwoKSB7IH07Ci0gICAgfkNSRl9DRUxMKCkgeyB9OwotICAgIENGWF9QdHJMaXN0CQltX09iakxpc3Q7Ci0gICAgaW50CQkJbV9DZWxsV3JpdGluZ01vZGU7Ci0gICAgRlhfUkVDVAkJbV9CQm94OwotfTsKLWNsYXNzIENQREZfQXV0b1JlZmxvd0VsZW1lbnQgOiBwdWJsaWMgSVBERl9MYXlvdXRFbGVtZW50Ci17Ci1wdWJsaWM6Ci0gICAgQ1BERl9BdXRvUmVmbG93RWxlbWVudChMYXlvdXRUeXBlIGxheW91dFR5cGUgPSBMYXlvdXRVbmtub3duICwgQ1BERl9BdXRvUmVmbG93RWxlbWVudCogcFBhcmVudCA9IE5VTEwpIDsKLSAgICB+Q1BERl9BdXRvUmVmbG93RWxlbWVudCgpOwotICAgIExheW91dFR5cGUgR2V0VHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9FbG1UeXBlOwotICAgIH0KLSAgICB2b2lkCUdldFJlY3QoQ0ZYX0Zsb2F0UmVjdCYgcmNSZWN0KSB7fTsKLQotICAgIGludCAgQ291bnRBdHRyVmFsdWVzKExheW91dEF0dHIgYXR0cl90eXBlKTsKLSAgICBMYXlvdXRFbnVtICBHZXRFbnVtQXR0cihMYXlvdXRBdHRyIGF0dHJfdHlwZSwgaW50IGluZGV4KTsKLSAgICBGWF9GTE9BVCBHZXROdW1iZXJBdHRyKExheW91dEF0dHIgYXR0cl90eXBlLCBpbnQgaW5kZXgpOwotICAgIEZYX0NPTE9SUkVGIEdldENvbG9yQXR0cihMYXlvdXRBdHRyIGF0dHJfdHlwZSwgaW50IGluZGV4KTsKLQotICAgIGludCAgQ291bnRDaGlsZHJlbigpCi0gICAgewotICAgICAgICByZXR1cm4gbV9DaGlsZEFycmF5LkdldFNpemUoKTsKLSAgICB9Ci0gICAgSVBERl9MYXlvdXRFbGVtZW50KiBHZXRDaGlsZChpbnQgaW5kZXgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9DaGlsZEFycmF5LkdldEF0KGluZGV4KTsKLSAgICB9Ci0KLSAgICBJUERGX0xheW91dEVsZW1lbnQqIEdldFBhcmVudCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wUGFyZW50RWxtOwotICAgIH0KLSAgICBpbnQJCUNvdW50T2JqZWN0cygpCi0gICAgewotICAgICAgICByZXR1cm4gbV9PYmpBcnJheS5HZXRTaXplKCk7Ci0gICAgfQotICAgIENQREZfUGFnZU9iamVjdCoJR2V0T2JqZWN0KGludCBpbmRleCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX09iakFycmF5LkdldEF0KGluZGV4KTsKLSAgICB9Ci0gICAgQ1BERl9BdXRvUmVmbG93RWxlbWVudCogbV9wUGFyZW50RWxtOwotICAgIExheW91dFR5cGUJCW1fRWxtVHlwZTsKLSAgICBDQVJfRWxtUHRyQXJyYXkgbV9DaGlsZEFycmF5OwotICAgIENBUl9PYmpQdHJBcnJheSBtX09iakFycmF5OwotICAgIEZYX0ZMT0FUCQltX1NwYWNlQmVmb3JlOwotfTsKLSNkZWZpbmUgQVVUT1JFRkxPV19TVEVQX0dFTkVSQVRFTElORQkJMQotI2RlZmluZSBBVVRPUkVGTE9XX1NURVBfR0VORVJBVEVQYXJhZ3JhcGgJMgotI2RlZmluZSBBVVRPUkVGTE9XX1NURVBfQ1JFQVRFRUxFTUVOVAkJMwotI2RlZmluZSBBVVRPUkVGTE9XX1NURVBfUkVNT1ZFREFUQQkJCTQKLWNsYXNzIENQREZfQXV0b1JlZmxvd0xheW91dFByb3ZpZGVyIDogcHVibGljIElQREZfTGF5b3V0UHJvdmlkZXIKLXsKLXB1YmxpYzoKLSAgICBDUERGX0F1dG9SZWZsb3dMYXlvdXRQcm92aWRlcihDUERGX1BhZ2VPYmplY3RzKiBwUGFnZSwgRlhfQk9PTCBiUmVhZE9yZGVyKTsKLSAgICB+Q1BERl9BdXRvUmVmbG93TGF5b3V0UHJvdmlkZXIoKTsKLSAgICB2b2lkCVNldExheW91dFByb3ZpZGVyU3R5bGUoTEFZT1VUUFJPVklERVJfU1RZTEUgU3R5bGUpCi0gICAgewotICAgICAgICBtX1N0eWxlID0gU3R5bGU7Ci0gICAgfQotICAgIExheW91dFN0YXR1cyBTdGFydExvYWQoSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKTsKLSAgICBMYXlvdXRTdGF0dXMgQ29udGludWUoKTsKLSAgICBpbnQJIAkJR2V0UG9zaXRpb24oKTsKLSAgICBJUERGX0xheW91dEVsZW1lbnQqIEdldFJvb3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcFJvb3Q7Ci0gICAgfQotICAgIEZYX0ZMT0FUIEdldE9iak1pbkNlbGwoQ1BERl9QYWdlT2JqZWN0KiBwT2JqKTsKLSAgICB2b2lkIENvbnZlcjJBcHByZWNlT3JkZXIoY29uc3QgQ1BERl9QYWdlT2JqZWN0cyogcFN0cmVhbU9yZGVyT2JqcywgQ1BERl9QYWdlT2JqZWN0cyogcEFwcHJhY2VPcmRlck9ianMpOwotICAgIHZvaWQJUmVsZWFzZUVsbShDUERGX0F1dG9SZWZsb3dFbGVtZW50KiYgcEVsbSwgRlhfQk9PTCBiUmVsZWFzZUNoaWxkcmVuID0gVFJVRSk7Ci0gICAgdm9pZCBHZW5lcmF0ZUNlbGwoKTsKLSAgICB2b2lkIEdlbmVyYXRlU3RydWN0VHJlZSgpOwotICAgIHZvaWQgR2VuZXJhdGVMaW5lKENGWF9QdHJBcnJheSYgY2VsbEFycmF5KTsKLSAgICB2b2lkIEdlbmVyYXRlUGFyYWdyYXBoKENGWF9QdHJBcnJheSYgY2VsbEFycmF5KTsKLSAgICB2b2lkIENyZWF0ZUVsZW1lbnQoKTsKLSAgICB2b2lkIEFkZE9iamVjdEFycmF5KENQREZfQXV0b1JlZmxvd0VsZW1lbnQqIHBFbG0sIENGWF9QdHJMaXN0JiBPYmpMaXN0KTsKLSAgICBGWF9GTE9BVCBHZXRMYXlvdXRPcmRlckhlaWdodChDUERGX1BhZ2VPYmplY3QqIHBDdXJPYmopOwotICAgIEZYX0ZMT0FUIEdldExheW91dE9yZGVyV2lkdGgoQ1BERl9QYWdlT2JqZWN0KiBwQ3VyT2JqKTsKLSAgICBpbnQgR2V0V3JpdGluZ01vZGUoQ1BERl9QYWdlT2JqZWN0KiBwUHJlT2JqLCBDUERGX1BhZ2VPYmplY3QqIHBDdXJPYmopOwotICAgIGludCBHZXRSZWN0U3RhcnQoRlhfUkVDVCByZWN0KTsKLSAgICBpbnQgR2V0UmVjdEVuZChGWF9SRUNUIHJlY3QpOwotICAgIGludCBHZXRSZWN0VG9wKEZYX1JFQ1QgcmVjdCk7Ci0gICAgaW50IEdldFJlY3RCb3R0b20oRlhfUkVDVCByZWN0KTsKLSAgICBpbnQgR2V0UmVjdEhlaWdodChGWF9SRUNUIHJlY3QpOwotICAgIGludCBHZXRSZWN0V2lkdGgoRlhfUkVDVCByZWN0KTsKLSAgICB2b2lkIFByb2Nlc3NPYmooQ0ZYX1B0ckFycmF5JiBjZWxsQXJyYXksIENQREZfUGFnZU9iamVjdCogcE9iaiwgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXgpOwotICAgIEZYX0lOVDMyIExvZ2ljUHJlT2JqKENQREZfUGFnZU9iamVjdCogcE9iaik7Ci0KLSAgICBDUERGX0F1dG9SZWZsb3dFbGVtZW50KiBtX3BSb290OwotICAgIENQREZfQXV0b1JlZmxvd0VsZW1lbnQqIG1fcEN1cnJFbG07Ci0gICAgQ1BERl9QYWdlKgltX3BQREZQYWdlOwotICAgIElGWF9QYXVzZSoJbV9wUGF1c2U7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBtX1BERkRpc3BsYXlNYXRyaXg7Ci0gICAgQ1BERl9QYWdlT2JqZWN0KiBtX3BQcmVPYmo7Ci0gICAgTGF5b3V0U3RhdHVzIG1fU3RhdHVzOwotICAgIGludCBtX1dyaXRpbmdNb2RlOwotICAgIENGWF9QdHJBcnJheSBtX0NlbGxBcnJheTsKLSAgICBGWF9CT09MCQkgbV9iUmVhZE9yZGVyOwotICAgIExBWU9VVFBST1ZJREVSX1NUWUxFIG1fU3R5bGU7Ci0gICAgQ0ZYX1B0ckFycmF5IG1fY2VsbEFycmF5OwotICAgIGludAkJCW1fU3RlcDsKLX07Ci0KLSNlbmRpZiAgLy8gQ09SRV9TUkNfUkVGTE9XX0FVVE9SRUZMT1dfSF8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL3JlZmxvdy9sYXlvdXRwcm9jZXNzb3JfcmVmbG93LmNwcCBiL2NvcmUvc3JjL3JlZmxvdy9sYXlvdXRwcm9jZXNzb3JfcmVmbG93LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4ZDMwMS4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9yZWZsb3cvbGF5b3V0cHJvY2Vzc29yX3JlZmxvdy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3JlZmxvdy9yZWZsb3dlbmdpbmUuaCIKLSNpbmNsdWRlICJyZWZsb3dlZHBhZ2UuaCIKLSNpbmNsdWRlICJsYXlvdXRwcm92aWRlcl90YWdnZWRwZGYuaCIKLUlQREZfTGF5b3V0UHJvY2Vzc29yKiBJUERGX0xheW91dFByb2Nlc3Nvcjo6Q3JlYXRlX0xheW91dFByb2Nlc3Nvcl9SZWZsb3coRlhfRkxPQVQgVG9wSW5kZW50LCBGWF9GTE9BVCBmV2lkdGgsIEZYX0ZMT0FUIGZIZWlnaHQsIHZvaWQqIHBSZWZsb3dlZFBhZ2UsIGludCBmbGFncywgRlhfRkxPQVQgbGluZVNwYWNlICkKLXsKLSAgICBpZihwUmVmbG93ZWRQYWdlID09IE5VTEwgfHwgZldpZHRoIDw9IDIwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDUERGX0xheW91dFByb2Nlc3Nvcl9SZWZsb3cqIHBSZWZsb3dFbmdpbmUgPSBuZXcgQ1BERl9MYXlvdXRQcm9jZXNzb3JfUmVmbG93KCk7Ci0gICAgcFJlZmxvd0VuZ2luZS0+SW5pdChUb3BJbmRlbnQsIGZXaWR0aCwgZkhlaWdodCwgKENQREZfUmVmbG93ZWRQYWdlKilwUmVmbG93ZWRQYWdlLCBmbGFncywgbGluZVNwYWNlKTsKLSAgICByZXR1cm4gcFJlZmxvd0VuZ2luZTsKLX0KLUNQREZfTGF5b3V0UHJvY2Vzc29yX1JlZmxvdzo6Q1BERl9MYXlvdXRQcm9jZXNzb3JfUmVmbG93KCkKLXsKLSAgICBtX3BQYXVzZSA9IE5VTEw7Ci0gICAgbV9wTGF5b3V0RWxlbWVudCA9IE5VTEw7Ci0gICAgbV9mUmVmV2lkdGggPSAwOwotICAgIG1fZlJlZldpZHRoID0gMDsKLSAgICBtX2ZDdXJyTGluZVdpZHRoID0gMDsKLSAgICBtX2ZDdXJyTGluZUhlaWdodCA9IDA7Ci0gICAgbV9iSWxsdXN0cmF0aW9uID0gRkFMU0U7Ci0gICAgbV9wUHJlT2JqID0gTlVMTDsKLSAgICBtX3BDdXJyTGluZSA9IG5ldyBDUkZfRGF0YVB0ckFycmF5KDUwKTsKLSAgICBtX3BUZW1wTGluZSA9IG5ldyBDUkZfRGF0YVB0ckFycmF5KDUwKTsKLSAgICBtX1N0YXJ0SW5kZW50ID0gMDsKLSAgICBtX1BhdXNlUG9zaXRpb24gPSAwOwotfQotQ1BERl9MYXlvdXRQcm9jZXNzb3JfUmVmbG93Ojp+Q1BERl9MYXlvdXRQcm9jZXNzb3JfUmVmbG93KCkKLXsKLSAgICBpZiAobV9wQ3VyckxpbmUpIHsKLSAgICAgICAgbV9wQ3VyckxpbmUtPlJlbW92ZUFsbCgpOwotICAgICAgICBkZWxldGUgbV9wQ3VyckxpbmU7Ci0gICAgfQotICAgIG1fcEN1cnJMaW5lID0gTlVMTDsKLSAgICBpZiAobV9wVGVtcExpbmUpIHsKLSAgICAgICAgbV9wVGVtcExpbmUtPlJlbW92ZUFsbCgpOwotICAgICAgICBkZWxldGUgbV9wVGVtcExpbmU7Ci0gICAgfQotICAgIG1fcFRlbXBMaW5lID0gTlVMTDsKLX0KLXZvaWQgQ1BERl9MYXlvdXRQcm9jZXNzb3JfUmVmbG93OjpJbml0KEZYX0ZMT0FUIFRvcEluZGVudCwgRlhfRkxPQVQgZldpZHRoLCBGWF9GTE9BVCBmSGVpZ2h0LCBDUERGX1JlZmxvd2VkUGFnZSogcFJlZmxvd2VkUGFnZSwgaW50IGZsYWdzLCBGWF9GTE9BVCBsaW5lU3BhY2UpCi17Ci0gICAgbV9wTGF5b3V0RWxlbWVudCA9IE5VTEw7Ci0gICAgbV9Ub3BJbmRlbnQgPSBUb3BJbmRlbnQ7Ci0gICAgbV9TdGF0dXMgPSBMYXlvdXRSZWFkeTsKLSAgICBtX2ZsYWdzID0gZmxhZ3M7Ci0gICAgbV9wUmVmbG93ZWRQYWdlID0gcFJlZmxvd2VkUGFnZTsKLSAgICBtX2ZTY3JlZW5IZWlnaHQgPSBmSGVpZ2h0OwotICAgIG1fZlJlZldpZHRoID0gZldpZHRoOwotICAgIG1fZkN1cnJMaW5lSGVpZ2h0ID0gMDsKLSAgICBtX2ZDdXJyTGluZVdpZHRoID0gMDsKLSAgICBtX2ZMaW5lU3BhY2UgPSBsaW5lU3BhY2U7Ci0gICAgcFJlZmxvd2VkUGFnZS0+bV9QYWdlV2lkdGggPSBmV2lkdGg7Ci0gICAgcFJlZmxvd2VkUGFnZS0+bV9QYWdlSGVpZ2h0ID0gVG9wSW5kZW50OwotfQotdm9pZCBDUERGX0xheW91dFByb2Nlc3Nvcl9SZWZsb3c6OkZpdFBhZ2VNb2RlKCkKLXsKLSAgICBpZihtX2ZsYWdzICYgUkZfUEFSU0VSX1BBR0VNT0RFICYmIG1fZlNjcmVlbkhlaWdodCA+IDIwKSB7Ci0gICAgICAgIGZsb2F0IGZpdFBhZ2VIZWlnaHQgPSBtX2ZTY3JlZW5IZWlnaHQ7Ci0gICAgICAgIENQREZfUmVmbG93ZWRQYWdlKiBwUkZQYWdlID0gbV9wUmVmbG93ZWRQYWdlOwotICAgICAgICBpbnQgY291bnQgPSBwUkZQYWdlLT5tX3BSZWZsb3dlZC0+R2V0U2l6ZSgpOwotICAgICAgICBDRlhfV29yZEFycmF5IGR5OwotICAgICAgICBkeS5BZGQoMCk7Ci0gICAgICAgIGludCBwb3MgPSAwOwotICAgICAgICBpbnQgc2NyZWVuQ291bnQgPSAxOwotICAgICAgICBGWF9GTE9BVCBoID0gcFJGUGFnZS0+R2V0UGFnZUhlaWdodCgpOwotICAgICAgICB3aGlsZSAoaCA+IHNjcmVlbkNvdW50ICogZml0UGFnZUhlaWdodCkgewotICAgICAgICAgICAgRlhfRkxPQVQgdGVtcFBhZ2VIZWlnaHQgPSBzY3JlZW5Db3VudCAqIGZpdFBhZ2VIZWlnaHQ7Ci0gICAgICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgICAgICBGWF9GTE9BVCB0ZW1wRHkgPSAwOwotICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBDUkZfRGF0YSogcERhdGEgPSAoKnBSRlBhZ2UtPm1fcFJlZmxvd2VkKVtpXTsKLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBwb3NZOwotICAgICAgICAgICAgICAgIHBvc1kgPSBwRGF0YS0+bV9Qb3NZOwotICAgICAgICAgICAgICAgIGlmKEZYU1lTX2ZhYnMocG9zWSkgPiB0ZW1wUGFnZUhlaWdodCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfZmFicyhwb3NZICsgcERhdGEtPm1fSGVpZ2h0KSA8IHRlbXBQYWdlSGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGogPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaiA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYocERhdGEtPm1fSGVpZ2h0ID4gZml0UGFnZUhlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgem9vbTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHNwYWNlaCA9IHNjcmVlbkNvdW50ICogZml0UGFnZUhlaWdodCArIHBvc1kgKyBwRGF0YS0+bV9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihzcGFjZWggPCBmaXRQYWdlSGVpZ2h0IC8gMyAqIDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZWggPSBmaXRQYWdlSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgem9vbSA9IHNwYWNlaCAvIHBEYXRhLT5tX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBEeSA9IHNwYWNlaCAtIHBEYXRhLT5tX0hlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5tX0hlaWdodCA9IHNwYWNlaDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5tX1dpZHRoICo9IHpvb207Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkeSA9IHBEYXRhLT5tX1Bvc1kgKyBwRGF0YS0+bV9IZWlnaHQgKyB0ZW1wUGFnZUhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgaWYoZHkgPiB0ZW1wRHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBEeSA9IGR5OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKEZYU1lTX2ZhYnMocG9zWSArIHBEYXRhLT5tX0hlaWdodCkgPiB0ZW1wUGFnZUhlaWdodCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IoOyBqIDwgY291bnQ7IGorKykgewotICAgICAgICAgICAgICAgIENSRl9EYXRhKiBwRGF0YSA9ICgqcFJGUGFnZS0+bV9wUmVmbG93ZWQpW2pdOwotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHBvc1k7Ci0gICAgICAgICAgICAgICAgcG9zWSA9IHBEYXRhLT5tX1Bvc1k7Ci0gICAgICAgICAgICAgICAgaWYoRlhTWVNfZmFicyhwb3NZKSA+IHRlbXBQYWdlSGVpZ2h0ICkgewotICAgICAgICAgICAgICAgICAgICBwRGF0YS0+bV9Qb3NZIC09IHRlbXBEeTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYocERhdGEtPm1fSGVpZ2h0ID49IGZpdFBhZ2VIZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgcERhdGEtPm1fSGVpZ2h0ID0gZml0UGFnZUhlaWdodCAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHBEYXRhLT5HZXRUeXBlKCkgPT0gQ1JGX0RhdGE6OlRleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENSRl9DaGFyRGF0YSogcENoYXJEYXRhID0gKENSRl9DaGFyRGF0YSopcERhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQ2hhckRhdGEtPm1fcENoYXJTdGF0ZS0+bV9mRm9udFNpemUgPSBwRGF0YS0+bV9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwUkZQYWdlLT5tX1BhZ2VIZWlnaHQgKz0gdGVtcER5OwotICAgICAgICAgICAgaCArPSB0ZW1wRHk7Ci0gICAgICAgICAgICBzY3JlZW5Db3VudCsrOwotICAgICAgICB9Ci0gICAgfQotfQotTGF5b3V0U3RhdHVzIENQREZfTGF5b3V0UHJvY2Vzc29yX1JlZmxvdzo6U3RhcnRQcm9jZXNzKElQREZfTGF5b3V0RWxlbWVudCogcEVsZW1lbnQsIElGWF9QYXVzZSogcFBhdXNlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwUERGTWF0cml4KQotewotICAgIGlmKCFwRWxlbWVudCkgewotICAgICAgICByZXR1cm4gTGF5b3V0RXJyb3I7Ci0gICAgfQotICAgIG1fcFBhdXNlID0gcFBhdXNlOwotICAgIG1fUERGTWF0cml4ID0gKnBQREZNYXRyaXg7Ci0gICAgbV9wUm9vdEVsZW1lbnQgPSBwRWxlbWVudDsKLSAgICBQcm9jZXNzRWxlbWVudChtX3BSb290RWxlbWVudCwgbV9mUmVmV2lkdGgpOwotICAgIGlmKG1fU3RhdHVzID09IExheW91dFRvQmVDb250aW51ZWQpIHsKLSAgICAgICAgcmV0dXJuIExheW91dFRvQmVDb250aW51ZWQ7Ci0gICAgfQotICAgIG1fU3RhdHVzID0gTGF5b3V0RmluaXNoZWQ7Ci0gICAgRml0UGFnZU1vZGUoKTsKLSAgICByZXR1cm4gTGF5b3V0RmluaXNoZWQ7Ci19Ci1MYXlvdXRTdGF0dXMgQ1BERl9MYXlvdXRQcm9jZXNzb3JfUmVmbG93OjpDb250aW51ZSgpCi17Ci0gICAgaW50IHNpemUgPSBtX3BSZWZsb3dlZFBhZ2UtPm1fcFJlZmxvd2VkLT5HZXRTaXplKCk7Ci0gICAgUHJvY2Vzc0VsZW1lbnQobV9wUm9vdEVsZW1lbnQsIG1fQ3VyclJlZldpZHRoKTsKLSAgICBzaXplID0gbV9wUmVmbG93ZWRQYWdlLT5tX3BSZWZsb3dlZC0+R2V0U2l6ZSgpOwotICAgIGlmKG1fU3RhdHVzID09IExheW91dFJlYWR5KSB7Ci0gICAgICAgIG1fU3RhdHVzID0gTGF5b3V0RmluaXNoZWQ7Ci0gICAgICAgIEZpdFBhZ2VNb2RlKCk7Ci0gICAgfQotICAgIHJldHVybiBtX1N0YXR1czsKLX0KLWludCBDUERGX0xheW91dFByb2Nlc3Nvcl9SZWZsb3c6OkdldFBvc2l0aW9uKCkKLXsKLSAgICByZXR1cm4gbV9QYXVzZVBvc2l0aW9uOwotfQotRlhfQk9PTAlDUERGX0xheW91dFByb2Nlc3Nvcl9SZWZsb3c6OklzQ2FuQnJlYWtBZnRlcihGWF9EV09SRCB1bmljb2RlKQotewotICAgIGlmKHVuaWNvZGUgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBzd2l0Y2godW5pY29kZSkgewotICAgICAgICBjYXNlIDQwOgotICAgICAgICBjYXNlIDkxOgotICAgICAgICBjYXNlIDEyMzoKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYodW5pY29kZSA+PSAyNTYpIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfSBlbHNlIGlmKHVuaWNvZGUgPj0gNDggJiYgdW5pY29kZSA8PSA1NykgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfSBlbHNlIGlmKHVuaWNvZGUgPj0gNjQgJiYgdW5pY29kZSA8PSA5MCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfSBlbHNlIGlmKHVuaWNvZGUgPj0gOTcgJiYgdW5pY29kZSA8PSAxMjIpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wJQ1BERl9MYXlvdXRQcm9jZXNzb3JfUmVmbG93OjpJc0NhbkJyZWFrQmVmb3JlKEZYX0RXT1JEIHVuaWNvZGUpCi17Ci0gICAgaWYodW5pY29kZSA9PSAtMSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHN3aXRjaCh1bmljb2RlKSB7Ci0gICAgICAgIGNhc2UgMzM6Ci0gICAgICAgIGNhc2UgNDE6Ci0gICAgICAgIGNhc2UgNDQ6Ci0gICAgICAgIGNhc2UgNDY6Ci0gICAgICAgIGNhc2UgNTk6Ci0gICAgICAgIGNhc2UgNjM6Ci0gICAgICAgIGNhc2UgOTM6Ci0gICAgICAgIGNhc2UgMTI1OgotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZih1bmljb2RlID49IDI1NikgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9IGVsc2UgaWYodW5pY29kZSA+PSA0OCAmJiB1bmljb2RlIDw9IDU3KSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9IGVsc2UgaWYodW5pY29kZSA+PSA2NCAmJiB1bmljb2RlIDw9IDkwKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9IGVsc2UgaWYodW5pY29kZSA+PSA5NyAmJiB1bmljb2RlIDw9IDEyMikgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotdm9pZCBDUERGX0xheW91dFByb2Nlc3Nvcl9SZWZsb3c6OlByb2Nlc3NUYWJsZShGWF9GTE9BVCBkeCkKLXsKLSAgICBpZihtX3BSZWZsb3dlZFBhZ2UtPm1fcFJlZmxvd2VkLT5HZXRTaXplKCkgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENSRl9UYWJsZSogcFRhYmxlID0gbV9UYWJsZUFycmF5LkdldEF0KG1fVGFibGVBcnJheS5HZXRTaXplKCkgLSAxKTsKLSAgICBpbnQgcm93Q291bnQgPSBwVGFibGUtPm1fbkNlbGwuR2V0U2l6ZSgpOwotICAgIGludCBuID0gMDsKLSAgICBGWF9GTE9BVCogZHlSb3cgPSBGWF9BbGxvYyhGWF9GTE9BVCwgcm93Q291bnQgKyAxKTsKLSAgICBGWFNZU19tZW1zZXQzMihkeVJvdywgMCwgc2l6ZW9mKEZYX0ZMT0FUKSAqIChyb3dDb3VudCArIDEpKTsKLSAgICBkeVJvd1swXSA9IDAgOwotICAgIGR5Um93WzBdID0gLSBwVGFibGUtPm1fUmVmbG93UGFnZUhlaWdodDsKLSAgICBpbnQgdGFibGVDb2xDb3VudCA9IDA7Ci0gICAgaW50IGk7Ci0gICAgZm9yKGkgPSAwOyBpIDwgcm93Q291bnQ7IGkrKykgewotICAgICAgICBpbnQgY29sQ291bnQgPSBwVGFibGUtPm1fbkNlbGwuR2V0QXQoaSk7Ci0gICAgICAgIGlmKGNvbENvdW50ID4gdGFibGVDb2xDb3VudCkgewotICAgICAgICAgICAgdGFibGVDb2xDb3VudCA9IGNvbENvdW50OwotICAgICAgICB9Ci0gICAgfQotICAgIGludCBjZWxsQ291bnQgPSB0YWJsZUNvbENvdW50ICogcm93Q291bnQ7Ci0gICAgUkZfVGFibGVDZWxsKiogcFZpcnR1YWxUYWJsZSA9IEZYX0FsbG9jKFJGX1RhYmxlQ2VsbCosIGNlbGxDb3VudCk7Ci0gICAgRlhTWVNfbWVtc2V0MzIocFZpcnR1YWxUYWJsZSwgMCwgc2l6ZW9mKFJGX1RhYmxlQ2VsbCopICogY2VsbENvdW50KTsKLSAgICBmb3IoaSA9IDA7IGkgPCByb3dDb3VudDsgaSsrKSB7Ci0gICAgICAgIGludCBjb2xDb3VudCA9IHBUYWJsZS0+bV9uQ2VsbC5HZXRBdChpKTsKLSAgICAgICAgRlhfRkxPQVQgcm93V2lkdGggPSAwOwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIGludCBzID0gcFRhYmxlLT5tX3BDZWxsQXJyYXkuR2V0U2l6ZSgpOwotICAgICAgICBmb3IoaiA9IDA7IGogPCBjb2xDb3VudDsgaisrKSB7Ci0gICAgICAgICAgICBSRl9UYWJsZUNlbGwqIHBDZWxsID0gKFJGX1RhYmxlQ2VsbCopcFRhYmxlLT5tX3BDZWxsQXJyYXkuR2V0QXQobisrKTsKLSAgICAgICAgICAgIGlmKHBDZWxsLT5tX0VuZFBvcyA8IHBDZWxsLT5tX0JlZ2luUG9zKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgcG9zID0gaSAqIHRhYmxlQ29sQ291bnQ7Ci0gICAgICAgICAgICB3aGlsZShwb3MgPCBjZWxsQ291bnQgJiYgcFZpcnR1YWxUYWJsZVtwb3NdICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBwb3MrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHBvcyA+PSAoaSArIDEpICogdGFibGVDb2xDb3VudCkgewotICAgICAgICAgICAgICAgIHBvcyA9IGkgKiB0YWJsZUNvbENvdW50ICsgajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBSb3dTcGFuID0gcENlbGwtPm1fUm93U3BhbjsKLSAgICAgICAgICAgIGludCBDb2xTcGFuID0gcENlbGwtPm1fQ29sU3BhbjsKLSAgICAgICAgICAgIGlmKFJvd1NwYW4gKyBpID4gcm93Q291bnQpIHsKLSAgICAgICAgICAgICAgICBSb3dTcGFuID0gcm93Q291bnQgLSBpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoQ29sU3BhbiArIGogPiBjb2xDb3VudCkgewotICAgICAgICAgICAgICAgIENvbFNwYW4gPSBjb2xDb3VudCAtIGo7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IoaW50IG0gPSAwOyBtIDwgUm93U3BhbjsgbSsrKSB7Ci0gICAgICAgICAgICAgICAgZm9yKGludCBubiA9IDA7IG5uIDwgQ29sU3Bhbjsgbm4rKykgewotICAgICAgICAgICAgICAgICAgICBpZihwb3MgKyBubiA+PSBjZWxsQ291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBWaXJ0dWFsVGFibGVbcG9zICsgbm5dID0gcENlbGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBvcyArPSB0YWJsZUNvbENvdW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRlhfRkxPQVQgZHhDZWxsID0gZHg7Ci0gICAgICAgICAgICBmb3IocG9zID0gaSAqIHRhYmxlQ29sQ291bnQ7IHBWaXJ0dWFsVGFibGVbcG9zXSAhPSBwQ2VsbCAmJiBwb3MgPCBjZWxsQ291bnQ7IHBvcysrKSB7Ci0gICAgICAgICAgICAgICAgZHhDZWxsICs9IChwVmlydHVhbFRhYmxlW3Bvc10pLT5tX01heFdpZHRoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ1JGX0RhdGEqIHBEYXRhID0gKCptX3BSZWZsb3dlZFBhZ2UtPm1fcFJlZmxvd2VkKVtwQ2VsbC0+bV9CZWdpblBvc107Ci0gICAgICAgICAgICBGWF9GTE9BVCBkeSA9IGR5Um93W2ldIC0gcERhdGEtPm1fSGVpZ2h0IC0gcERhdGEtPm1fUG9zWTsKLSAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4KDEsIDAsIDAsIDEsIGR4Q2VsbCwgZHkpOwotICAgICAgICAgICAgVHJhbnNmb3JtKCZtYXRyaXgsIG1fcFJlZmxvd2VkUGFnZS0+bV9wUmVmbG93ZWQsIHBDZWxsLT5tX0JlZ2luUG9zLCBwQ2VsbC0+bV9FbmRQb3MgLSBwQ2VsbC0+bV9CZWdpblBvcyArIDEpOwotICAgICAgICAgICAgaWYocENlbGwtPm1fUm93U3BhbiArIGkgPD0gcm93Q291bnQpIHsKLSAgICAgICAgICAgICAgICBpZihGWFNZU19mYWJzKGR5Um93W3BDZWxsLT5tX1Jvd1NwYW4gKyBpXSkgPCBGWFNZU19mYWJzKGR5Um93W2ldIC0gcENlbGwtPm1fQ2VsbEhlaWdodCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZHlSb3dbcENlbGwtPm1fUm93U3BhbiArIGldID0gZHlSb3dbaV0gLSBwQ2VsbC0+bV9DZWxsSGVpZ2h0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBuID0gMDsKLSAgICBmb3IoaSA9IDA7IGkgPCByb3dDb3VudDsgaSsrKSB7Ci0gICAgICAgIGludCBjb2xDb3VudCA9IHBUYWJsZS0+bV9uQ2VsbC5HZXRBdChpKTsKLSAgICAgICAgZm9yKGludCBqID0gMDsgaiA8IGNvbENvdW50OyBqKyspIHsKLSAgICAgICAgICAgIFJGX1RhYmxlQ2VsbCogcENlbGwgPSAoUkZfVGFibGVDZWxsKilwVGFibGUtPm1fcENlbGxBcnJheS5HZXRBdChuKyspOwotICAgICAgICAgICAgc3dpdGNoKHBDZWxsLT5tX0Jsb2NrQWxpZ24pIHsKLSAgICAgICAgICAgICAgICBjYXNlIExheW91dEFmdGVyOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkeSA9IGR5Um93W2kgKyBwQ2VsbC0+bV9Sb3dTcGFuXSAtIHBDZWxsLT5tX0NlbGxIZWlnaHQgLSBkeVJvd1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4KDEsIDAsIDAsIDEsIDAsIGR5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybSgmbWF0cml4LCBtX3BSZWZsb3dlZFBhZ2UtPm1fcFJlZmxvd2VkLCBwQ2VsbC0+bV9CZWdpblBvcywgcENlbGwtPm1fRW5kUG9zIC0gcENlbGwtPm1fQmVnaW5Qb3MgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIExheW91dE1pZGRsZToKLSAgICAgICAgICAgICAgICBjYXNlIExheW91dEp1c3RpZnk6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGR5ID0gKGR5Um93W2kgKyBwQ2VsbC0+bV9Sb3dTcGFuXSArIHBDZWxsLT5tX0NlbGxIZWlnaHQgLSBkeVJvd1tpXSkgLyAyOwotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXgoMSwgMCwgMCwgMSwgMCwgZHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtKCZtYXRyaXgsIG1fcFJlZmxvd2VkUGFnZS0+bV9wUmVmbG93ZWQsIHBDZWxsLT5tX0JlZ2luUG9zLCBwQ2VsbC0+bV9FbmRQb3MgLSBwQ2VsbC0+bV9CZWdpblBvcyArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBDUkZfRGF0YSogcERhdGEgPSAoKm1fcFJlZmxvd2VkUGFnZS0+bV9wUmVmbG93ZWQpW21fcFJlZmxvd2VkUGFnZS0+bV9wUmVmbG93ZWQtPkdldFNpemUoKSAtIDFdOwotICAgIG1fcFJlZmxvd2VkUGFnZS0+bV9QYWdlSGVpZ2h0ID0gLSBkeVJvd1tyb3dDb3VudF0gKyBwRGF0YS0+bV9IZWlnaHQ7Ci0gICAgRlhfRnJlZShwVmlydHVhbFRhYmxlKTsKLSAgICBGWF9GcmVlKGR5Um93KTsKLSAgICBpbnQgc2l6ZSA9IHBUYWJsZS0+bV9wQ2VsbEFycmF5LkdldFNpemUoKTsKLSAgICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgUkZfVGFibGVDZWxsKiBwQ2VsbCA9IHBUYWJsZS0+bV9wQ2VsbEFycmF5LkdldEF0KGkpOwotICAgICAgICBGWF9GcmVlKHBDZWxsKTsKLSAgICB9Ci0gICAgcFRhYmxlLT5tX3BDZWxsQXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgcFRhYmxlLT5tX25DZWxsLlJlbW92ZUFsbCgpOwotICAgIGludCBzID0gc2l6ZW9mKENSRl9UYWJsZSk7Ci0gICAgZGVsZXRlIHBUYWJsZTsKLSAgICBtX1RhYmxlQXJyYXkuUmVtb3ZlQXQobV9UYWJsZUFycmF5LkdldFNpemUoKSAtIDEpOwotfQotQ0ZYX0Zsb2F0UmVjdCBDUERGX0xheW91dFByb2Nlc3Nvcl9SZWZsb3c6OkdldEVsbUJCb3goSVBERl9MYXlvdXRFbGVtZW50KiBwRWxlbWVudCkKLXsKLSAgICBDRlhfRmxvYXRSZWN0IHJlY3Q7Ci0gICAgaW50IG9iakNvdW50ID0gcEVsZW1lbnQtPkNvdW50T2JqZWN0cygpOwotICAgIGludCBjb3VudCA9IHBFbGVtZW50LT5Db3VudENoaWxkcmVuKCk7Ci0gICAgaWYob2JqQ291bnQgPT0gMCAmJiBjb3VudCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiByZWN0OwotICAgIH0KLSAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKLSAgICBpbnQgaTsKLSAgICBmb3IoaSA9IDA7IGkgPCBvYmpDb3VudDsgaSsrKSB7Ci0gICAgICAgIENQREZfUGFnZU9iamVjdCogcE9iaiA9IHBFbGVtZW50LT5HZXRPYmplY3QoMCk7Ci0gICAgICAgIGlmKCFwT2JqKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiggcmVjdC5IZWlnaHQoKSA9PSAwICkgewotICAgICAgICAgICAgcmVjdCA9IHBPYmotPkdldEJCb3goJm1hdHJpeCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZWN0LlVuaW9uKHBPYmotPkdldEJCb3goJm1hdHJpeCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIGZvcihpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgSVBERl9MYXlvdXRFbGVtZW50KiBwQ2hpbGRFbGVtZW50ID0gcEVsZW1lbnQtPkdldENoaWxkKGkpOwotICAgICAgICBpZiggcmVjdC5IZWlnaHQoKSA9PSAwICkgewotICAgICAgICAgICAgcmVjdCA9IEdldEVsbUJCb3gocENoaWxkRWxlbWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZWN0LlVuaW9uKEdldEVsbUJCb3gocENoaWxkRWxlbWVudCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZWN0OwotfQotRlhfRkxPQVQgQ1BERl9MYXlvdXRQcm9jZXNzb3JfUmVmbG93OjpHZXRFbG1XaWR0aChJUERGX0xheW91dEVsZW1lbnQqIHBFbGVtZW50KQotewotICAgIGlmKCFwRWxlbWVudCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgTGF5b3V0VHlwZSBsYXlvdXRUeXBlID0gcEVsZW1lbnQtPkdldFR5cGUoKTsKLSAgICBGWF9GTE9BVCB3aWR0aCA9IDA7Ci0gICAgaWYobGF5b3V0VHlwZSA9PSBMYXlvdXRUYWJsZSB8fCBsYXlvdXRUeXBlID09IExheW91dFRhYmxlRGF0YUNlbGwgfHwgbGF5b3V0VHlwZSA9PSBMYXlvdXRUYWJsZUhlYWRlckNlbGwpIHsKLSAgICAgICAgd2lkdGggPSBwRWxlbWVudC0+R2V0TnVtYmVyQXR0cihMYXlvdXRXaWR0aCk7Ci0gICAgICAgIGlmKHdpZHRoID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIHdpZHRoOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmKCBsYXlvdXRUeXBlID09IExheW91dFRhYmxlUm93KSB7Ci0gICAgICAgIGludCBjb3VudCA9IHBFbGVtZW50LT5Db3VudENoaWxkcmVuKCk7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBJUERGX0xheW91dEVsZW1lbnQqIHBFbG0gPSBwRWxlbWVudC0+R2V0Q2hpbGQoaSk7Ci0gICAgICAgICAgICB3aWR0aCArPSBwRWxtLT5HZXROdW1iZXJBdHRyKExheW91dFdpZHRoKTsKLSAgICAgICAgfQotICAgICAgICBpZih3aWR0aCA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiB3aWR0aDsKLSAgICAgICAgfQotICAgIH0KLSAgICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBHZXRFbG1CQm94KHBFbGVtZW50KTsKLSAgICByZXR1cm4gcmVjdC5XaWR0aCgpOwotfQotRlhfQk9PTCBHZXRJbnRlcnNlY3Rpb24oRlhfRkxPQVQgbG93MSwgRlhfRkxPQVQgaGlnaDEsIEZYX0ZMT0FUIGxvdzIsIEZYX0ZMT0FUIGhpZ2gyLAotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGludGVybG93LCBGWF9GTE9BVCYgaW50ZXJoaWdoKTsKLUZYX0JPT0wgSXNTYW1lTGluZShGWF9CT09MIGJIb3Jpem9udGFsLCBDRlhfRmxvYXRSZWN0IFJlY3QxLCBDRlhfRmxvYXRSZWN0IFJlY3QyKQotewotICAgIGlmKGJIb3Jpem9udGFsKSB7Ci0gICAgICAgIEZYX0ZMT0FUIGludGVyX3RvcCwgaW50ZXJfYm90dG9tOwotICAgICAgICBpZiAoIUdldEludGVyc2VjdGlvbihSZWN0MS5ib3R0b20sIFJlY3QxLnRvcCwgUmVjdDIuYm90dG9tLCBSZWN0Mi50b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyX2JvdHRvbSwgaW50ZXJfdG9wKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIEZYX0ZMT0FUIGxpbmVIZWlnaHQgPSBSZWN0MS50b3AgLSBSZWN0MS5ib3R0b207Ci0gICAgICAgIGlmKGxpbmVIZWlnaHQgPiAyMCAmJiBsaW5lSGVpZ2h0ID4gUmVjdDIuSGVpZ2h0KCkgKiAyKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYobGluZUhlaWdodCA+IDUgJiYgUmVjdDIuSGVpZ2h0KCkgLyAyID4gbGluZUhlaWdodCkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIEZYX0ZMT0FUIGludGVyX2ggPSBpbnRlcl90b3AgLSBpbnRlcl9ib3R0b207Ci0gICAgICAgIGlmIChpbnRlcl9oIDwgKGxpbmVIZWlnaHQpIC8gMiAmJiBpbnRlcl9oIDwgUmVjdDIuSGVpZ2h0KCkgLyAyKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBGWF9GTE9BVCBpbnRlcl9sZWZ0LCBpbnRlcl9yaWdodDsKLSAgICAgICAgaWYoIUdldEludGVyc2VjdGlvbihSZWN0MS5sZWZ0LCBSZWN0MS5yaWdodCwgUmVjdDIubGVmdCwgUmVjdDIucmlnaHQsIGludGVyX2xlZnQsIGludGVyX3JpZ2h0KSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIEZYX0ZMT0FUIGludGVyX3cgPSBpbnRlcl9yaWdodCAtIGludGVyX2xlZnQ7Ci0gICAgICAgIGlmIChpbnRlcl93IDwgKFJlY3QxLnJpZ2h0IC0gUmVjdDEubGVmdCkgLyAyICYmIGludGVyX3cgPCAoUmVjdDIucmlnaHQgLSBSZWN0Mi5sZWZ0KSAvIDIpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0lOVDMyIElzQ2FuTWVyZ2VQYXJhZ3JhcGgoSVBERl9MYXlvdXRFbGVtZW50KiBwUHJldkVsZW1lbnQsIElQREZfTGF5b3V0RWxlbWVudCogcE5leHRFbGVtZW50KQotewotICAgIEZYX0lOVDMyIGFuYWxvZ2lhbCA9IDEwMDsKLSAgICBGWF9JTlQzMiBuUHJldk9iaiA9IHBQcmV2RWxlbWVudC0+Q291bnRPYmplY3RzKCksIGk7Ci0gICAgQ1BERl9QYWdlT2JqZWN0KiBwUHJldk9iaiA9IE5VTEw7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCBwcmV2UmVjdCwgcmVjdDsKLSAgICBDRlhfUHRyQXJyYXkgcHJldkxpbmUsIGxpbmU7Ci0gICAgRlhfQk9PTCBiUGFyYWdyYXBoU3RhcnQgPSBGQUxTRTsKLSAgICBmb3IoaSA9IDA7IGkgPCBuUHJldk9iajsgaSsrKSB7Ci0gICAgICAgIENQREZfUGFnZU9iamVjdCogcE9iaiA9IHBQcmV2RWxlbWVudC0+R2V0T2JqZWN0KGkpOwotICAgICAgICBpZighcFByZXZPYmopIHsKLSAgICAgICAgICAgIHBQcmV2T2JqID0gcE9iajsKLSAgICAgICAgICAgIHJlY3QgPSBDRlhfRmxvYXRSZWN0KHBPYmotPm1fTGVmdCwgcE9iai0+bV9Cb3R0b20sIHBPYmotPm1fUmlnaHQsIHBPYmotPm1fVG9wKTsKLSAgICAgICAgICAgIGxpbmUuQWRkKHBPYmopOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0Zsb2F0UmVjdCBvYmpSZWN0ID0gQ0ZYX0Zsb2F0UmVjdChwT2JqLT5tX0xlZnQsIHBPYmotPm1fQm90dG9tLCBwT2JqLT5tX1JpZ2h0LCBwT2JqLT5tX1RvcCk7Ci0gICAgICAgIGlmKElzU2FtZUxpbmUoVFJVRSwgcmVjdCwgb2JqUmVjdCkpIHsKLSAgICAgICAgICAgIGxpbmUuQWRkKHBPYmopOwotICAgICAgICAgICAgcmVjdC5VbmlvbihvYmpSZWN0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByZXZMaW5lLlJlbW92ZUFsbCgpOwotICAgICAgICAgICAgcHJldkxpbmUuQXBwZW5kKGxpbmUpOwotICAgICAgICAgICAgcHJldlJlY3QgPSByZWN0OwotICAgICAgICAgICAgbGluZS5SZW1vdmVBbGwoKTsKLSAgICAgICAgICAgIGxpbmUuQWRkKHBPYmopOwotICAgICAgICAgICAgcmVjdCA9IG9ialJlY3Q7Ci0gICAgICAgICAgICBpZighYlBhcmFncmFwaFN0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByZXZSZWN0LmxlZnQgPiByZWN0LmxlZnQgKyByZWN0LkhlaWdodCgpICogMS41KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJQYXJhZ3JhcGhTdGFydCA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmKHByZXZMaW5lLkdldFNpemUoKSkgewotICAgICAgICBpZihGWFNZU19mYWJzKHJlY3QucmlnaHQgLSBwcmV2UmVjdC5yaWdodCkgPiByZWN0LkhlaWdodCgpKSB7Ci0gICAgICAgICAgICBhbmFsb2dpYWwgLT0gNTA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQ1BERl9QYWdlT2JqZWN0KiBwT2JqID0gcFByZXZFbGVtZW50LT5HZXRPYmplY3QoblByZXZPYmogLSAxKTsKLSAgICBpZihwT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9URVhUKSB7Ci0gICAgICAgIENQREZfVGV4dE9iamVjdCogcFRleHQgPSAoQ1BERl9UZXh0T2JqZWN0KilwT2JqOwotICAgICAgICBGWF9JTlQzMiBuSXRlbSA9IHBUZXh0LT5Db3VudEl0ZW1zKCk7Ci0gICAgICAgIENQREZfVGV4dE9iamVjdEl0ZW0gaXRlbTsKLSAgICAgICAgcFRleHQtPkdldEl0ZW1JbmZvKG5JdGVtIC0gMSwgJml0ZW0pOwotICAgICAgICBDRlhfV2lkZVN0cmluZyB3U3RyID0gcFRleHQtPkdldEZvbnQoKS0+VW5pY29kZUZyb21DaGFyQ29kZShpdGVtLm1fQ2hhckNvZGUpOwotICAgICAgICBpZih3U3RyLklzRW1wdHkoKSkgewotICAgICAgICAgICAgd1N0ciA9IChGWF9XQ0hBUilpdGVtLm1fQ2hhckNvZGU7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfV0NIQVIgd2NoID0gd1N0ci5HZXRBdCh3U3RyLkdldExlbmd0aCgpIC0gMSk7Ci0gICAgICAgIHN3aXRjaCh3Y2gpIHsKLSAgICAgICAgICAgIGNhc2UgJy4nOgotICAgICAgICAgICAgY2FzZSAxMjI5MDoKLSAgICAgICAgICAgIGNhc2UgNjUzMTE6Ci0gICAgICAgICAgICBjYXNlIDYzOgotICAgICAgICAgICAgY2FzZSAzMzoKLSAgICAgICAgICAgIGNhc2UgNjUyODE6Ci0gICAgICAgICAgICAgICAgYW5hbG9naWFsIC09IDUwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHByZXZMaW5lLlJlbW92ZUFsbCgpOwotICAgIHByZXZMaW5lLkFwcGVuZChsaW5lKTsKLSAgICBsaW5lLlJlbW92ZUFsbCgpOwotICAgIEZYX0lOVDMyIG5OZXh0T2JqID0gcE5leHRFbGVtZW50LT5Db3VudE9iamVjdHMoKTsKLSAgICBwUHJldk9iaiA9IE5VTEw7Ci0gICAgRlhfQk9PTCBiRmlyc3QgPSBUUlVFOwotICAgIGZvcihpID0gMDsgaSA8IG5OZXh0T2JqOyBpKyspIHsKLSAgICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwT2JqID0gcE5leHRFbGVtZW50LT5HZXRPYmplY3QoaSk7Ci0gICAgICAgIGlmKCFwUHJldk9iaikgewotICAgICAgICAgICAgcFByZXZPYmogPSBwT2JqOwotICAgICAgICAgICAgcmVjdCA9IENGWF9GbG9hdFJlY3QocE9iai0+bV9MZWZ0LCBwT2JqLT5tX0JvdHRvbSwgcE9iai0+bV9SaWdodCwgcE9iai0+bV9Ub3ApOwotICAgICAgICAgICAgbGluZS5BZGQocE9iaik7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDRlhfRmxvYXRSZWN0IG9ialJlY3QgPSBDRlhfRmxvYXRSZWN0KHBPYmotPm1fTGVmdCwgcE9iai0+bV9Cb3R0b20sIHBPYmotPm1fUmlnaHQsIHBPYmotPm1fVG9wKTsKLSAgICAgICAgaWYoSXNTYW1lTGluZShUUlVFLCByZWN0LCBvYmpSZWN0KSkgewotICAgICAgICAgICAgbGluZS5BZGQocE9iaik7Ci0gICAgICAgICAgICByZWN0LlVuaW9uKG9ialJlY3QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYoRlhTWVNfZmFicyhyZWN0LnJpZ2h0IC0gcHJldlJlY3QucmlnaHQpIDwgcmVjdC5IZWlnaHQoKSAmJiBGWFNZU19mYWJzKHJlY3QubGVmdCAtIHByZXZSZWN0LmxlZnQpIDwgcmVjdC5IZWlnaHQoKSkgewotICAgICAgICAgICAgICAgIGFuYWxvZ2lhbCArPSA1MDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByZXZMaW5lLlJlbW92ZUFsbCgpOwotICAgICAgICAgICAgcHJldkxpbmUuQXBwZW5kKGxpbmUpOwotICAgICAgICAgICAgcHJldlJlY3QgPSByZWN0OwotICAgICAgICAgICAgbGluZS5SZW1vdmVBbGwoKTsKLSAgICAgICAgICAgIGxpbmUuQWRkKHBPYmopOwotICAgICAgICAgICAgcmVjdCA9IG9ialJlY3Q7Ci0gICAgICAgICAgICBpZighYkZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiRmlyc3QgPSBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZihwcmV2TGluZS5HZXRTaXplKCkpIHsKLSAgICAgICAgaWYoYlBhcmFncmFwaFN0YXJ0KSB7Ci0gICAgICAgICAgICBpZihwcmV2UmVjdC5sZWZ0IC0gcmVjdC5sZWZ0ID4gcmVjdC5IZWlnaHQoKSAmJiBwcmV2UmVjdC5sZWZ0IC0gcmVjdC5sZWZ0IDwgcmVjdC5IZWlnaHQoKSAqIDMpIHsKLSAgICAgICAgICAgICAgICBhbmFsb2dpYWwgLT0gNTA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZihGWFNZU19mYWJzKHByZXZSZWN0LmxlZnQgLSByZWN0LmxlZnQpIDwgcmVjdC5IZWlnaHQoKSkgewotICAgICAgICAgICAgICAgIGFuYWxvZ2lhbCAtPSA1MDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYW5hbG9naWFsOwotfQotdm9pZCBDUERGX0xheW91dFByb2Nlc3Nvcl9SZWZsb3c6OlByb2Nlc3NFbGVtZW50KElQREZfTGF5b3V0RWxlbWVudCogcEVsZW1lbnQsIEZYX0ZMT0FUIHJlZmxvd1dpZHRoKQotewotICAgIGlmKHBFbGVtZW50ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZihtX1N0YXR1cyA9PSBMYXlvdXRSZWFkeSkgewotICAgICAgICBMYXlvdXRUeXBlIGxheW91dFR5cGUgPSBwRWxlbWVudC0+R2V0VHlwZSgpOwotICAgICAgICBGWF9JTlQzMiBFbGVtZW50VHlwZSA9IEdldEVsZW1lbnRUeXBlcyhsYXlvdXRUeXBlKTsKLSAgICAgICAgc3dpdGNoKEVsZW1lbnRUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFNTVF9JRToKLSAgICAgICAgICAgICAgICBtX2JJbGx1c3RyYXRpb24gPSBUUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTU1RfQkxTRToKLSAgICAgICAgICAgICAgICBGaW5pc2hlZEN1cnJMaW5lKCk7Ci0gICAgICAgICAgICAgICAgRlhfRkxPQVQgU3RhcnRJbmRlbnQgPSAwOwotICAgICAgICAgICAgICAgIGlmKElQREZfTGF5b3V0RWxlbWVudCogcFBhcmVudCA9IHBFbGVtZW50LT5HZXRQYXJlbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBTdGFydEluZGVudCA9IHBQYXJlbnQtPkdldE51bWJlckF0dHIoTGF5b3V0U3RhcnRJbmRlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBjdXJyU3RhcnRJbmRlbnQgPSBwRWxlbWVudC0+R2V0TnVtYmVyQXR0cihMYXlvdXRTdGFydEluZGVudCk7Ci0gICAgICAgICAgICAgICAgbV9TdGFydEluZGVudCA9IENvbnZlcldpZHRoKGN1cnJTdGFydEluZGVudCk7Ci0gICAgICAgICAgICAgICAgRlhfRkxPQVQgd2lkdGggPSByZWZsb3dXaWR0aDsKLSAgICAgICAgICAgICAgICBpZihTdGFydEluZGVudCAhPSBjdXJyU3RhcnRJbmRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVmbG93V2lkdGggLT0gbV9TdGFydEluZGVudDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhfRkxPQVQgc3BhY2VCZWZvcmUgPSBwRWxlbWVudC0+R2V0TnVtYmVyQXR0cihMYXlvdXRTcGFjZUJlZm9yZSk7Ci0gICAgICAgICAgICAgICAgbV9wUmVmbG93ZWRQYWdlLT5tX1BhZ2VIZWlnaHQgKz0gc3BhY2VCZWZvcmU7Ci0gICAgICAgICAgICAgICAgbV9UZXh0QWxpZ24gPSBwRWxlbWVudC0+R2V0RW51bUF0dHIoTGF5b3V0VGV4dEFsaWduKTsKLSAgICAgICAgICAgICAgICBpZihJUERGX0xheW91dEVsZW1lbnQqIHBQYXJlbnQgPSBwRWxlbWVudC0+R2V0UGFyZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RhcnRJbmRlbnQgPSBwUGFyZW50LT5HZXROdW1iZXJBdHRyKExheW91dEVuZEluZGVudCk7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGN1cnJFbmRJbmRlbnQgPSBwRWxlbWVudC0+R2V0TnVtYmVyQXR0cihMYXlvdXRFbmRJbmRlbnQpOwotICAgICAgICAgICAgICAgICAgICBpZihTdGFydEluZGVudCAhPSBjdXJyU3RhcnRJbmRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZmxvd1dpZHRoIC09IENvbnZlcldpZHRoKGN1cnJFbmRJbmRlbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKHJlZmxvd1dpZHRoICogMiA8IHdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZmxvd1dpZHRoID0gd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIG1fU3RhcnRJbmRlbnQgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2gobGF5b3V0VHlwZSkgewotICAgICAgICAgICAgY2FzZSBMYXlvdXRUYWJsZTogewotICAgICAgICAgICAgICAgICAgICBDUkZfVGFibGUqIHBUYWJsZSA9IG5ldyBDUkZfVGFibGU7Ci0gICAgICAgICAgICAgICAgICAgIG1fVGFibGVBcnJheS5BZGQocFRhYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgcFRhYmxlLT5tX1JlZmxvd1BhZ2VIZWlnaHQgPSBtX3BSZWZsb3dlZFBhZ2UtPm1fUGFnZUhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgcFRhYmxlLT5tX1RhYmxlV2lkdGggPSBHZXRFbG1XaWR0aChwRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgTGF5b3V0VGFibGVSb3c6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIW1fVGFibGVBcnJheS5HZXRTaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IHBFbGVtZW50LT5Db3VudENoaWxkcmVuKCk7Ci0gICAgICAgICAgICAgICAgICAgIENSRl9UYWJsZSogcFRhYmxlID0gbV9UYWJsZUFycmF5LkdldEF0KG1fVGFibGVBcnJheS5HZXRTaXplKCkgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGYgPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgSVBERl9MYXlvdXRFbGVtZW50KiBwQ2hpbGRFbGVtZW50ID0gcEVsZW1lbnQtPkdldENoaWxkKGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0VHlwZSB0eXBlID0gcENoaWxkRWxlbWVudC0+R2V0VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZSA9PSBMYXlvdXRUYWJsZURhdGFDZWxsIHx8IHR5cGUgPT0gTGF5b3V0VGFibGVIZWFkZXJDZWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZisrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBUYWJsZS0+bV9uQ2VsbC5BZGQoZik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgTGF5b3V0VGFibGVEYXRhQ2VsbDoKLSAgICAgICAgICAgIGNhc2UgTGF5b3V0VGFibGVIZWFkZXJDZWxsOiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCFtX1RhYmxlQXJyYXkuR2V0U2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBSRl9UYWJsZUNlbGwqIHBDZWxsID0gRlhfQWxsb2MoUkZfVGFibGVDZWxsLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0MzIocENlbGwsIDAgLCBzaXplb2YoUkZfVGFibGVDZWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgIENSRl9UYWJsZSogcFRhYmxlID0gbV9UYWJsZUFycmF5LkdldEF0KG1fVGFibGVBcnJheS5HZXRTaXplKCkgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHBvcyA9IHBUYWJsZS0+bV9uQ2VsbC5HZXRTaXplKCkgLSAxOwotICAgICAgICAgICAgICAgICAgICBwQ2VsbC0+bV9CZWdpblBvcyA9IG1fcFJlZmxvd2VkUGFnZS0+bV9wUmVmbG93ZWQtPkdldFNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY2VsbFdpZHRoID0gcEVsZW1lbnQtPkdldE51bWJlckF0dHIoTGF5b3V0V2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBpZihjZWxsV2lkdGggPT0gMCB8fCBwQ2VsbC0+bV9NYXhXaWR0aCA+IHBUYWJsZS0+bV9UYWJsZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDUkZfVGFibGUqIHBUYWJsZSA9IG1fVGFibGVBcnJheS5HZXRBdChtX1RhYmxlQXJyYXkuR2V0U2l6ZSgpIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQ2VsbC0+bV9NYXhXaWR0aCA9IHJlZmxvd1dpZHRoIC8gcFRhYmxlLT5tX25DZWxsLkdldEF0KHBUYWJsZS0+bV9uQ2VsbC5HZXRTaXplKCkgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDZWxsLT5tX01heFdpZHRoID0gcEVsZW1lbnQtPkdldE51bWJlckF0dHIoTGF5b3V0V2lkdGgpICogcmVmbG93V2lkdGggLyBwVGFibGUtPm1fVGFibGVXaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQ2VsbC0+bV9Db2xTcGFuID0gKGludCkocEVsZW1lbnQtPkdldE51bWJlckF0dHIoTGF5b3V0Q29sU3BhbikpOwotICAgICAgICAgICAgICAgICAgICBwQ2VsbC0+bV9Sb3dTcGFuID0gKGludCkocEVsZW1lbnQtPkdldE51bWJlckF0dHIoTGF5b3V0Um93U3BhbikpOwotICAgICAgICAgICAgICAgICAgICBpZighcENlbGwtPm1fQ29sU3BhbikgewotICAgICAgICAgICAgICAgICAgICAgICAgcENlbGwtPm1fQ29sU3BhbiA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoIXBDZWxsLT5tX1Jvd1NwYW4gKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQ2VsbC0+bV9Sb3dTcGFuID0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwQ2VsbC0+bV9CbG9ja0FsaWduID0gcEVsZW1lbnQtPkdldEVudW1BdHRyKExheW91dEJsb2NrQWxpZ24pOwotICAgICAgICAgICAgICAgICAgICBtX1RleHRBbGlnbiA9IHBFbGVtZW50LT5HZXRFbnVtQXR0cihMYXlvdXRJbmxpbmVBbGlnbik7Ci0gICAgICAgICAgICAgICAgICAgIHBDZWxsLT5tX1Bvc1ggPSAwOwotICAgICAgICAgICAgICAgICAgICBwQ2VsbC0+bV9Qb3NZID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcmVmbG93V2lkdGggPSBwQ2VsbC0+bV9NYXhXaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgcFRhYmxlLT5tX3BDZWxsQXJyYXkuQWRkKHBDZWxsKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtX2ZMaW5lSGVpZ2h0ID0gcEVsZW1lbnQtPkdldE51bWJlckF0dHIoTGF5b3V0TGluZUhlaWdodCk7Ci0gICAgICAgIGludCBSZWZsb3dlZFNpemUgPSBtX3BSZWZsb3dlZFBhZ2UtPm1fcFJlZmxvd2VkLT5HZXRTaXplKCk7Ci0gICAgICAgIGlmKHBFbGVtZW50LT5Db3VudE9iamVjdHMoKSkgewotICAgICAgICAgICAgUHJvY2Vzc09ianMocEVsZW1lbnQsIHJlZmxvd1dpZHRoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpbnQgY291bnQgPSBwRWxlbWVudC0+Q291bnRDaGlsZHJlbigpOwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIElQREZfTGF5b3V0RWxlbWVudCogcENoaWxkRWxlbWVudCA9IHBFbGVtZW50LT5HZXRDaGlsZChpKTsKLSAgICAgICAgUHJvY2Vzc0VsZW1lbnQocENoaWxkRWxlbWVudCwgcmVmbG93V2lkdGgpOwotICAgICAgICBpZihtX3BQYXVzZSAmJiBtX3BSb290RWxlbWVudCA9PSBwRWxlbWVudCAmJiBtX1N0YXR1cyAhPSBMYXlvdXRUb0JlQ29udGludWVkICkgewotICAgICAgICAgICAgaWYobV9wUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgICAgICBtX3BMYXlvdXRFbGVtZW50ID0gcENoaWxkRWxlbWVudDsKLSAgICAgICAgICAgICAgICBtX1N0YXR1cyA9IExheW91dFRvQmVDb250aW51ZWQ7Ci0gICAgICAgICAgICAgICAgbV9DdXJyUmVmV2lkdGggPSByZWZsb3dXaWR0aDsKLSAgICAgICAgICAgICAgICBtX1BhdXNlUG9zaXRpb24gPSAoaSArIDEpICogMTAwIC8gKGNvdW50ICsgMSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihtX1N0YXR1cyA9PSBMYXlvdXRUb0JlQ29udGludWVkICYmIG1fcExheW91dEVsZW1lbnQgPT0gcENoaWxkRWxlbWVudCkgewotICAgICAgICAgICAgbV9TdGF0dXMgPSBMYXlvdXRSZWFkeTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZihtX1N0YXR1cyA9PSBMYXlvdXRSZWFkeSkgewotICAgICAgICBGWF9GTE9BVCBkeCA9IDA7Ci0gICAgICAgIExheW91dFR5cGUgbGF5b3V0VHlwZSA9IHBFbGVtZW50LT5HZXRUeXBlKCk7Ci0gICAgICAgIEZYX0lOVDMyIEVsZW1lbnRUeXBlID0gR2V0RWxlbWVudFR5cGVzKGxheW91dFR5cGUpOwotICAgICAgICBzd2l0Y2goRWxlbWVudFR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgU1NUX0lFOgotICAgICAgICAgICAgICAgIG1fYklsbHVzdHJhdGlvbiA9IEZBTFNFOwotICAgICAgICAgICAgICAgIEZpbmlzaGVkQ3VyckxpbmUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU1NUX0JMU0U6Ci0gICAgICAgICAgICAgICAgRmluaXNoZWRDdXJyTGluZSgpOwotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIFN0YXJ0SW5kZW50ID0gMDsKLSAgICAgICAgICAgICAgICBpZihJUERGX0xheW91dEVsZW1lbnQqIHBQYXJlbnQgPSBwRWxlbWVudC0+R2V0UGFyZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RhcnRJbmRlbnQgPSBwUGFyZW50LT5HZXROdW1iZXJBdHRyKExheW91dFN0YXJ0SW5kZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRlhfRkxPQVQgY3VyclN0YXJ0SW5kZW50ID0gcEVsZW1lbnQtPkdldE51bWJlckF0dHIoTGF5b3V0U3RhcnRJbmRlbnQpOwotICAgICAgICAgICAgICAgIGlmKFN0YXJ0SW5kZW50ICE9IGN1cnJTdGFydEluZGVudCkgewotICAgICAgICAgICAgICAgICAgICByZWZsb3dXaWR0aCArPSBDb252ZXJXaWR0aChjdXJyU3RhcnRJbmRlbnQpOwotICAgICAgICAgICAgICAgICAgICBkeCArPSBDb252ZXJXaWR0aChjdXJyU3RhcnRJbmRlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBzcGFjZUFmdGVyID0gcEVsZW1lbnQtPkdldE51bWJlckF0dHIoTGF5b3V0U3BhY2VBZnRlcik7Ci0gICAgICAgICAgICAgICAgbV9wUmVmbG93ZWRQYWdlLT5tX1BhZ2VIZWlnaHQgKz0gc3BhY2VBZnRlcjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2gobGF5b3V0VHlwZSkgewotICAgICAgICAgICAgY2FzZSBMYXlvdXRUYWJsZURhdGFDZWxsOgotICAgICAgICAgICAgY2FzZSBMYXlvdXRUYWJsZUhlYWRlckNlbGw6IHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIW1fVGFibGVBcnJheS5HZXRTaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIENSRl9UYWJsZSogcFRhYmxlID0gbV9UYWJsZUFycmF5LkdldEF0KG1fVGFibGVBcnJheS5HZXRTaXplKCkgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgUkZfVGFibGVDZWxsKiBwQ2VsbCA9IHBUYWJsZS0+bV9wQ2VsbEFycmF5LkdldEF0KHBUYWJsZS0+bV9wQ2VsbEFycmF5LkdldFNpemUoKSAtIDEpOwotICAgICAgICAgICAgICAgICAgICBwQ2VsbC0+bV9FbmRQb3MgPSBtX3BSZWZsb3dlZFBhZ2UtPm1fcFJlZmxvd2VkLT5HZXRTaXplKCkgLSAxOwotICAgICAgICAgICAgICAgICAgICBpZihwQ2VsbC0+bV9FbmRQb3MgPCBwQ2VsbC0+bV9CZWdpblBvcykgewotICAgICAgICAgICAgICAgICAgICAgICAgcENlbGwtPm1fQ2VsbEhlaWdodCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDUkZfRGF0YSogcEJlZ2luRGF0YSA9ICgqbV9wUmVmbG93ZWRQYWdlLT5tX3BSZWZsb3dlZClbcENlbGwtPm1fQmVnaW5Qb3NdOwotICAgICAgICAgICAgICAgICAgICAgICAgQ1JGX0RhdGEqIHBFbmREYXRhID0gKCptX3BSZWZsb3dlZFBhZ2UtPm1fcFJlZmxvd2VkKVtwQ2VsbC0+bV9FbmRQb3NdOwotICAgICAgICAgICAgICAgICAgICAgICAgcENlbGwtPm1fQ2VsbEhlaWdodCA9IHBCZWdpbkRhdGEtPm1fSGVpZ2h0ID4gcEVuZERhdGEtPm1fSGVpZ2h0ID8gcEJlZ2luRGF0YS0+bV9IZWlnaHQgOiBwRW5kRGF0YS0+bV9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwQ2VsbC0+bV9DZWxsSGVpZ2h0IC09IHBFbmREYXRhLT5tX1Bvc1kgLSBwQmVnaW5EYXRhLT5tX1Bvc1k7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBMYXlvdXRUYWJsZVJvdzogewotICAgICAgICAgICAgICAgICAgICBpZighbV9UYWJsZUFycmF5LkdldFNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQ1JGX1RhYmxlKiBwVGFibGUgPSBtX1RhYmxlQXJyYXkuR2V0QXQobV9UYWJsZUFycmF5LkdldFNpemUoKSAtIDEpOwotICAgICAgICAgICAgICAgICAgICBpZihwVGFibGUtPm1fbkNvbCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwVGFibGUtPm1fbkNvbCA9IHBUYWJsZS0+bV9wQ2VsbEFycmF5LkdldFNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIExheW91dFRhYmxlOiB7Ci0gICAgICAgICAgICAgICAgICAgIFByb2Nlc3NUYWJsZShkeCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaWYoZHgpIHsKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXgoMSwgMCwgMCwgMSwgZHgsIDApOwotICAgICAgICAgICAgICAgICAgICBpbnQgUmVmbG93ZWRTaXplID0gbV9wUmVmbG93ZWRQYWdlLT5tX3BSZWZsb3dlZC0+R2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm0oJm1hdHJpeCwgbV9wUmVmbG93ZWRQYWdlLT5tX3BSZWZsb3dlZCwgUmVmbG93ZWRTaXplLCBtX3BSZWZsb3dlZFBhZ2UtPm1fcFJlZmxvd2VkLT5HZXRTaXplKCkgLSBSZWZsb3dlZFNpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZihtX3BSb290RWxlbWVudCA9PSBwRWxlbWVudCkgewotICAgICAgICBtX1BhdXNlUG9zaXRpb24gPSAxMDA7Ci0gICAgfQotfQotRlhfSU5UMzIgQ1BERl9MYXlvdXRQcm9jZXNzb3JfUmVmbG93OjpHZXRFbGVtZW50VHlwZXMoTGF5b3V0VHlwZSBsYXlvdXRUeXBlKQotewotICAgIHN3aXRjaChsYXlvdXRUeXBlKSB7Ci0gICAgICAgIGNhc2UgTGF5b3V0UGFyYWdyYXBoOgotICAgICAgICBjYXNlIExheW91dEhlYWRpbmc6Ci0gICAgICAgIGNhc2UgTGF5b3V0SGVhZGluZzE6Ci0gICAgICAgIGNhc2UgTGF5b3V0SGVhZGluZzI6Ci0gICAgICAgIGNhc2UgTGF5b3V0SGVhZGluZzM6Ci0gICAgICAgIGNhc2UgTGF5b3V0SGVhZGluZzQ6Ci0gICAgICAgIGNhc2UgTGF5b3V0SGVhZGluZzU6Ci0gICAgICAgIGNhc2UgTGF5b3V0SGVhZGluZzY6Ci0gICAgICAgIGNhc2UgTGF5b3V0TGlzdDoKLSAgICAgICAgY2FzZSBMYXlvdXRMaXN0SXRlbToKLSAgICAgICAgY2FzZSBMYXlvdXRMaXN0TGFiZWw6Ci0gICAgICAgIGNhc2UgTGF5b3V0TGlzdEJvZHk6Ci0gICAgICAgIGNhc2UgTGF5b3V0VGFibGU6Ci0gICAgICAgIGNhc2UgTGF5b3V0VGFibGVIZWFkZXJDZWxsOgotICAgICAgICBjYXNlIExheW91dFRhYmxlRGF0YUNlbGw6Ci0gICAgICAgIGNhc2UgTGF5b3V0VGFibGVSb3c6Ci0gICAgICAgIGNhc2UgTGF5b3V0VGFibGVIZWFkZXJHcm91cDoKLSAgICAgICAgY2FzZSBMYXlvdXRUYWJsZUJvZHlHcm91cDoKLSAgICAgICAgY2FzZSBMYXlvdXRUYWJsZUZvb3RHcm91cDoKLSAgICAgICAgY2FzZSBMYXlvdXRUT0NJOgotICAgICAgICBjYXNlIExheW91dENhcHRpb246Ci0gICAgICAgICAgICByZXR1cm4gU1NUX0JMU0U7Ci0gICAgICAgIGNhc2UgTGF5b3V0RmlndXJlOgotICAgICAgICBjYXNlIExheW91dEZvcm11bGE6Ci0gICAgICAgIGNhc2UgTGF5b3V0Rm9ybToKLSAgICAgICAgICAgIHJldHVybiBTU1RfSUU7Ci0gICAgICAgIGNhc2UgTGF5b3V0U3BhbjoKLSAgICAgICAgY2FzZSBMYXlvdXRRdW90ZToKLSAgICAgICAgY2FzZSBMYXlvdXROb3RlOgotICAgICAgICBjYXNlIExheW91dFJlZmVyZW5jZToKLSAgICAgICAgY2FzZSBMYXlvdXRCaWJFbnRyeToKLSAgICAgICAgY2FzZSBMYXlvdXRDb2RlOgotICAgICAgICBjYXNlIExheW91dExpbms6Ci0gICAgICAgIGNhc2UgTGF5b3V0QW5ub3Q6Ci0gICAgICAgIGNhc2UgTGF5b3V0UnVieToKLSAgICAgICAgY2FzZSBMYXlvdXRXYXJpY2h1OgotICAgICAgICAgICAgcmV0dXJuIFNTVF9JTFNFOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIFNTVF9HRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotRlhfRkxPQVQJQ1BERl9MYXlvdXRQcm9jZXNzb3JfUmVmbG93OjpDb252ZXJXaWR0aChGWF9GTE9BVCB3aWR0aCkKLXsKLSAgICByZXR1cm4gd2lkdGg7Ci19Ci12b2lkIENQREZfTGF5b3V0UHJvY2Vzc29yX1JlZmxvdzo6UHJvY2Vzc09iamVjdChDUERGX1BhZ2VPYmplY3QqIHBPYmosIEZYX0ZMT0FUIHJlZmxvd1dpZHRoLCBDRlhfQWZmaW5lTWF0cml4IG9iak1hdHJpeCkKLXsKLSAgICBpZighcE9iaikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmKHBPYmotPm1fVHlwZSA9PSBQREZQQUdFX1RFWFQpIHsKLSAgICAgICAgUHJvY2Vzc1RleHRPYmplY3QoIChDUERGX1RleHRPYmplY3QgKilwT2JqLCByZWZsb3dXaWR0aCwgb2JqTWF0cml4KTsKLSAgICB9IGVsc2UgaWYocE9iai0+bV9UeXBlID09IFBERlBBR0VfSU1BR0UpIHsKLSAgICAgICAgaWYoIShtX2ZsYWdzICYgUkZfUEFSU0VSX0lNQUdFKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIENQREZfUGFnZU9iamVjdHMqIHBPYmpzID0gbmV3IENQREZfUGFnZU9iamVjdHMoRkFMU0UpOwotICAgICAgICBGWF9QT1NJVElPTiBwb3MgPSBwT2Jqcy0+R2V0TGFzdE9iamVjdFBvc2l0aW9uKCk7Ci0gICAgICAgIHBvcyA9IHBPYmpzLT5JbnNlcnRPYmplY3QocG9zLCBwT2JqKTsKLSAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXg7Ci0gICAgICAgIEZYX1JFQ1QgcmVjdCA9IHBPYmotPkdldEJCb3goJm1hdHJpeCk7Ci0gICAgICAgIENQREZfSW1hZ2VPYmplY3QqIEltYWdlT2JqID0gKENQREZfSW1hZ2VPYmplY3QqKXBPYmo7Ci0gICAgICAgIFByb2Nlc3NVbml0YXJ5T2JqcyhwT2JqcywgcmVmbG93V2lkdGgsIG9iak1hdHJpeCk7Ci0gICAgICAgIGRlbGV0ZSBwT2JqczsKLSAgICB9IGVsc2UgaWYocE9iai0+bV9UeXBlID09IFBERlBBR0VfUEFUSCkgewotICAgIH0gZWxzZSBpZihwT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9GT1JNKSB7Ci0gICAgICAgIENQREZfRm9ybU9iamVjdCogcEZvcm0gPSAoQ1BERl9Gb3JtT2JqZWN0KilwT2JqOwotICAgICAgICBGWF9QT1NJVElPTiBwb3MgPSBwRm9ybS0+bV9wRm9ybS0+R2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpOwotICAgICAgICBvYmpNYXRyaXguQ29uY2F0KHBGb3JtLT5tX0Zvcm1NYXRyaXgpOwotICAgICAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBPYmoxID0gcEZvcm0tPm1fcEZvcm0tPkdldE5leHRPYmplY3QocG9zKTsKLSAgICAgICAgICAgIFByb2Nlc3NPYmplY3QocE9iajEsIHJlZmxvd1dpZHRoLCBvYmpNYXRyaXgpOwotICAgICAgICB9Ci0gICAgfQotfQotdm9pZCBDUERGX0xheW91dFByb2Nlc3Nvcl9SZWZsb3c6OlByb2Nlc3NPYmpzKElQREZfTGF5b3V0RWxlbWVudCogcEVsZW1lbnQsIEZYX0ZMT0FUIHJlZmxvd1dpZHRoKQotewotICAgIG1fZkN1cnJNYXhXaWR0aCA9IHJlZmxvd1dpZHRoOwotICAgIGludCBPYmpDb3VudCA9IHBFbGVtZW50LT5Db3VudE9iamVjdHMoKTsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgT2JqQ291bnQ7IGkrKykgewotICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBPYmogPSBwRWxlbWVudC0+R2V0T2JqZWN0KGkpOwotICAgICAgICBQcm9jZXNzT2JqZWN0KHBPYmosIHJlZmxvd1dpZHRoLCBtX1BERk1hdHJpeCk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgIH0KLX0KLXZvaWQgQ1BERl9MYXlvdXRQcm9jZXNzb3JfUmVmbG93OjpBZGRUZW1wMkN1cnJMaW5lKGludCBiZWdpbiwgaW50IGNvdW50KQotewotICAgIGlmKGJlZ2luIDwgMCB8fCBjb3VudCA8PSAwIHx8ICFtX3BSZWZsb3dlZFBhZ2UgfHwgIW1fcFJlZmxvd2VkUGFnZS0+bV9wUmVmbG93ZWQgfHwgIW1fcFRlbXBMaW5lKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgewotICAgICAgICBjb3VudCArPSBiZWdpbjsKLSAgICB9Ci0gICAgaW50IHNpemUgPSBtX3BSZWZsb3dlZFBhZ2UtPm1fcFJlZmxvd2VkLT5HZXRTaXplKCk7Ci0gICAgaW50IHRlbXBzID0gbV9wVGVtcExpbmUtPkdldFNpemUoKTsKLSAgICBmb3IoaW50IGkgPSBiZWdpbjsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgQ1JGX0RhdGEqIHBEYXRhID0gKCptX3BUZW1wTGluZSlbaV07Ci0gICAgICAgIEFkZERhdGEyQ3VyckxpbmUocERhdGEpOwotICAgIH0KLX0KLXZvaWQgQ1BERl9MYXlvdXRQcm9jZXNzb3JfUmVmbG93OjpBZGREYXRhMkN1cnJMaW5lKENSRl9EYXRhKiBwRGF0YSkKLXsKLSAgICBpZihwRGF0YSA9PSBOVUxMIHx8IG1fcEN1cnJMaW5lID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX3BDdXJyTGluZS0+QWRkKHBEYXRhKTsKLSAgICBtX2ZDdXJyTGluZVdpZHRoID0gcERhdGEtPm1fUG9zWCArIHBEYXRhLT5tX1dpZHRoOwotICAgIGlmKHBEYXRhLT5tX0hlaWdodCA+IG1fZkN1cnJMaW5lSGVpZ2h0KSB7Ci0gICAgICAgIG1fZkN1cnJMaW5lSGVpZ2h0ID0gcERhdGEtPm1fSGVpZ2h0OwotICAgIH0KLX0KLXZvaWQgQ1BERl9MYXlvdXRQcm9jZXNzb3JfUmVmbG93OjpVcGRhdGVDdXJyTGluZSgpCi17Ci19Ci12b2lkIENQREZfTGF5b3V0UHJvY2Vzc29yX1JlZmxvdzo6VHJhbnNmb3JtKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIENSRl9EYXRhUHRyQXJyYXkqIHBEYXRhQXJyYXksIGludCBiZWdpblBvcywgaW50IGNvdW50KQotewotICAgIGlmICghcERhdGFBcnJheSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmKGNvdW50ID09IDApIHsKLSAgICAgICAgY291bnQgPSBwRGF0YUFycmF5LT5HZXRTaXplKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY291bnQgKz0gYmVnaW5Qb3M7Ci0gICAgfQotICAgIGZvcihpbnQgaSA9IGJlZ2luUG9zOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBDUkZfRGF0YSogcERhdGEgPSAoKnBEYXRhQXJyYXkpW2ldOwotICAgICAgICBUcmFuc2Zvcm0ocE1hdHJpeCwgcERhdGEpOwotICAgIH0KLX0KLXZvaWQgQ1BERl9MYXlvdXRQcm9jZXNzb3JfUmVmbG93OjpUcmFuc2Zvcm0oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgQ1JGX0RhdGEqIHBEYXRhKQotewotICAgIGlmKHBEYXRhLT5HZXRUeXBlKCkgPT0gQ1JGX0RhdGE6OlBhdGgpIHsKLSAgICAgICAgQ1JGX1BhdGhEYXRhKiBwUGF0aERhdGEgPSAoQ1JGX1BhdGhEYXRhKilwRGF0YTsKLSAgICAgICAgcFBhdGhEYXRhLT5tX3BQYXRoMkRldmljZS5Db25jYXQoKnBNYXRyaXgpOwotICAgIH0KLSAgICBwTWF0cml4LT5UcmFuc2Zvcm0ocERhdGEtPm1fUG9zWCwgcERhdGEtPm1fUG9zWSwgcERhdGEtPm1fUG9zWCwgcERhdGEtPm1fUG9zWSk7Ci19Ci1GWF9CT09MIENQREZfTGF5b3V0UHJvY2Vzc29yX1JlZmxvdzo6RmluaXNoZWRDdXJyTGluZSgpCi17Ci0gICAgaWYgKE5VTEwgPT0gbV9wQ3VyckxpbmUpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpbnQgY291bnQgPSBtX3BDdXJyTGluZS0+R2V0U2l6ZSgpOwotICAgIGlmKGNvdW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBpZihtX2ZMaW5lSGVpZ2h0ID4gbV9mQ3VyckxpbmVIZWlnaHQpIHsKLSAgICAgICAgbV9mQ3VyckxpbmVIZWlnaHQgPSBtX2ZMaW5lSGVpZ2h0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fZkN1cnJMaW5lSGVpZ2h0ICs9IDI7Ci0gICAgfQotICAgIGlmKG1fcFJlZmxvd2VkUGFnZS0+bV9wUmVmbG93ZWQtPkdldFNpemUoKSA+IDApIHsKLSAgICAgICAgbV9mQ3VyckxpbmVIZWlnaHQgKz0gbV9mTGluZVNwYWNlOwotICAgIH0KLSAgICBGWF9GTE9BVCBoZWlnaHQgPSBtX3BSZWZsb3dlZFBhZ2UtPm1fUGFnZUhlaWdodCArIG1fZkN1cnJMaW5lSGVpZ2h0OwotICAgIEZYX0ZMT0FUIGxpbmVIZWlnaHQgPSBtX2ZMaW5lSGVpZ2h0OwotICAgIGlmKGxpbmVIZWlnaHQgPT0gMCkgewotICAgICAgICBsaW5lSGVpZ2h0ID0gbV9mQ3VyckxpbmVIZWlnaHQ7Ci0gICAgfQotICAgIEZYX0ZMT0FUIGR4ID0gMDsKLSAgICBzd2l0Y2gobV9UZXh0QWxpZ24pIHsKLSAgICAgICAgY2FzZSBMYXlvdXRDZW50ZXI6Ci0gICAgICAgICAgICBkeCA9IChtX2ZDdXJyTWF4V2lkdGggLSBtX2ZDdXJyTGluZVdpZHRoKSAvIDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMYXlvdXRFbmQ6Ci0gICAgICAgICAgICBkeCA9IG1fZkN1cnJNYXhXaWR0aCAtIG1fZkN1cnJMaW5lV2lkdGg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMYXlvdXRKdXN0aWZ5OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgRlhfRkxPQVQgZHkgPSAtIGhlaWdodDsKLSAgICBpbnQgcmVmZWRTaXplID0gbV9wUmVmbG93ZWRQYWdlLT5tX3BSZWZsb3dlZC0+R2V0U2l6ZSgpOwotICAgIGlmKGNvdW50ID09IDEzKSB7Ci0gICAgICAgIGludCBhID0gMDsKLSAgICB9Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgQ1JGX0RhdGEqIHBEYXRhID0gKCptX3BDdXJyTGluZSlbaV07Ci0gICAgICAgIG1fcFJlZmxvd2VkUGFnZS0+bV9wUmVmbG93ZWQtPkFkZChwRGF0YSk7Ci0gICAgICAgIEZYX0ZMT0FUIHggPSBtX1N0YXJ0SW5kZW50ICsgZHggKiAobV9UZXh0QWxpZ24gPT0gTGF5b3V0SnVzdGlmeSA/IGkgKyAxIDogMSk7Ci0gICAgICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4KDEsIDAsIDAsIDEsIHgsIGR5KTsKLSAgICAgICAgVHJhbnNmb3JtKCZtYXRyaXgsIHBEYXRhKTsKLSAgICB9Ci0gICAgbV9wQ3VyckxpbmUtPlJlbW92ZUFsbCgpOwotICAgIG1fZkN1cnJMaW5lV2lkdGggPSAwOwotICAgIG1fcFJlZmxvd2VkUGFnZS0+bV9QYWdlSGVpZ2h0ICs9IG1fZkN1cnJMaW5lSGVpZ2h0OwotICAgIG1fZkN1cnJMaW5lSGVpZ2h0ID0gMDsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUNSRl9DaGFyU3RhdGUqIENQREZfTGF5b3V0UHJvY2Vzc29yX1JlZmxvdzo6R2V0Q2hhclN0YXRlKENQREZfVGV4dE9iamVjdCogcE9iaiwgQ1BERl9Gb250KiBwRm9udCwgRlhfRkxPQVQgZkhlaWdodCwgRlhfQVJHQiBjb2xvcikKLXsKLSAgICBpZiAoTlVMTCA9PSBtX3BSZWZsb3dlZFBhZ2UtPm1fcENoYXJTdGF0ZSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaW50IGNvdW50ID0gbV9wUmVmbG93ZWRQYWdlLT5tX3BDaGFyU3RhdGUtPkdldFNpemUoKTsKLSAgICBmb3IoaW50IGkgPSBjb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgIENSRl9DaGFyU3RhdGUqIHBTdGF0ZSA9IChDUkZfQ2hhclN0YXRlKiltX3BSZWZsb3dlZFBhZ2UtPm1fcENoYXJTdGF0ZS0+R2V0QXQoaSk7Ci0gICAgICAgIGlmKHBTdGF0ZS0+bV9Db2xvciA9PSBjb2xvciAmJiBwU3RhdGUtPm1fZkZvbnRTaXplID09IGZIZWlnaHQgJiYgcFN0YXRlLT5tX3BGb250ID09IHBGb250ICYmIHBTdGF0ZS0+bV9wVGV4dE9iaiA9PSBwT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gcFN0YXRlOwotICAgICAgICB9Ci0gICAgfQotICAgIENSRl9DaGFyU3RhdGUgcFN0YXRlOwotICAgIHBTdGF0ZS5tX3BUZXh0T2JqID0gcE9iajsKLSAgICBwU3RhdGUubV9Db2xvciA9IGNvbG9yOwotICAgIHBTdGF0ZS5tX3BGb250ID0gcEZvbnQ7Ci0gICAgcFN0YXRlLm1fZkZvbnRTaXplID0gZkhlaWdodDsKLSAgICBpbnQgYXNjZW50ID0gcEZvbnQtPkdldFR5cGVBc2NlbnQoKTsKLSAgICBpbnQgZGVzY2VudCA9IHBGb250LT5HZXRUeXBlRGVzY2VudCgpOwotICAgIHBTdGF0ZS5tX2ZBc2NlbnQgPSBhc2NlbnQgKiBmSGVpZ2h0IC8gKGFzY2VudCAtIGRlc2NlbnQpOwotICAgIGlmKGRlc2NlbnQgPT0gMCkgewotICAgICAgICBwU3RhdGUubV9mRGVzY2VudCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcFN0YXRlLm1fZkRlc2NlbnQgPSBkZXNjZW50ICogZkhlaWdodCAvIChhc2NlbnQgLSBkZXNjZW50KTsKLSAgICB9Ci0gICAgcFN0YXRlLm1fYlZlcnQgPSBGQUxTRTsKLSAgICBDUERGX0NJREZvbnQgKnBDSURGb250ID0gcEZvbnQtPkdldENJREZvbnQoKTsKLSAgICBpZihwQ0lERm9udCkgewotICAgICAgICBwU3RhdGUubV9iVmVydCA9IHBDSURGb250LT5Jc1ZlcnRXcml0aW5nKCk7Ci0gICAgfQotICAgIG1fcFJlZmxvd2VkUGFnZS0+bV9wQ2hhclN0YXRlLT5BZGQocFN0YXRlKTsKLSAgICByZXR1cm4gKENSRl9DaGFyU3RhdGUqKW1fcFJlZmxvd2VkUGFnZS0+bV9wQ2hhclN0YXRlLT5HZXRBdChjb3VudCk7Ci19Ci1pbnQgQ1BERl9MYXlvdXRQcm9jZXNzb3JfUmVmbG93OjpHZXRDaGFyV2lkdGgoRlhfRFdPUkQgY2hhckNvZGUsIENQREZfRm9udCogcEZvbnQpIGNvbnN0Ci17Ci0gICAgaWYoY2hhckNvZGUgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGludCB3ID0gcEZvbnQtPkdldENoYXJXaWR0aEYoY2hhckNvZGUpOwotICAgIGlmKHcgPT0gMCkgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBzdHI7Ci0gICAgICAgIHBGb250LT5BcHBlbmRDaGFyKHN0ciwgY2hhckNvZGUpOwotICAgICAgICB3ID0gcEZvbnQtPkdldFN0cmluZ1dpZHRoKHN0ciwgMSk7Ci0gICAgICAgIGlmKHcgPT0gMCkgewotICAgICAgICAgICAgRlhfUkVDVCBCQm94OwotICAgICAgICAgICAgcEZvbnQtPkdldENoYXJCQm94KGNoYXJDb2RlLCBCQm94KTsKLSAgICAgICAgICAgIHcgPSBCQm94LnJpZ2h0IC0gQkJveC5sZWZ0OwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB3OwotfQotdm9pZCBDUERGX0xheW91dFByb2Nlc3Nvcl9SZWZsb3c6OkNyZWF0ZVJGRGF0YShDUERGX1BhZ2VPYmplY3QqIHBPYmosIENGWF9BZmZpbmVNYXRyaXgqIHBPYmpNYXRyaXgpCi17Ci0gICAgaWYgKE5VTEwgPT0gbV9wUmVmbG93ZWRQYWdlLT5tX3BNZW1vcnlQb29sKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYocE9iai0+bV9UeXBlID09IFBERlBBR0VfVEVYVCkgewotICAgICAgICBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqID0gKENQREZfVGV4dE9iamVjdCogKXBPYmo7Ci0gICAgICAgIGludCBjb3VudCA9IHBUZXh0T2JqLT5Db3VudEl0ZW1zKCk7Ci0gICAgICAgIGlmKCFjb3VudCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmKGNvdW50ID09IDEpIHsKLSAgICAgICAgICAgIENQREZfVGV4dE9iamVjdEl0ZW0gSXRlbTsKLSAgICAgICAgICAgIHBUZXh0T2JqLT5HZXRJdGVtSW5mbygwLCAmSXRlbSk7Ci0gICAgICAgICAgICBpZihJdGVtLm1fQ2hhckNvZGUgPT0gNDkpIHsKLSAgICAgICAgICAgICAgICBpbnQgYSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9Gb250ICogcEZvbnQgPSBwVGV4dE9iai0+R2V0Rm9udCgpOwotICAgICAgICBGWF9GTE9BVCBmcyA9IHBUZXh0T2JqLT5HZXRGb250U2l6ZSgpOwotICAgICAgICBGWF9GTE9BVCogcG1hdHJpeCA9IHBUZXh0T2JqLT5tX1RleHRTdGF0ZS5HZXRNYXRyaXgoKTsKLSAgICAgICAgRlhfRkxPQVQgbWF0cml4MSA9IHBtYXRyaXhbMV07Ci0gICAgICAgIGlmKHBtYXRyaXhbMl0gPT0gMCkgewotICAgICAgICAgICAgbWF0cml4MSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCB0ZXh0TWF0cml4KHBtYXRyaXhbMF0sIG1hdHJpeDEsIHBtYXRyaXhbMl0sIHBtYXRyaXhbM10sIDAsIDApOwotICAgICAgICBGWF9GTE9BVCBoZWlnaHQgPSBGWFNZU19mYWJzKHRleHRNYXRyaXguVHJhbnNmb3JtRGlzdGFuY2UoZnMpKTsKLSAgICAgICAgaWYocE9iak1hdHJpeCkgewotICAgICAgICAgICAgaGVpZ2h0ID0gRlhTWVNfZmFicyhwT2JqTWF0cml4LT5UcmFuc2Zvcm1EaXN0YW5jZShoZWlnaHQpKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgciA9IDAsIGcgPSAwLCBiID0gMDsKLSAgICAgICAgcFRleHRPYmotPm1fQ29sb3JTdGF0ZS5HZXRGaWxsQ29sb3IoKS0+R2V0UkdCKHIsIGcsIGIpOwotICAgICAgICBGWF9BUkdCIGNvbCA9IHIgKiAweDEwMDAwOwotICAgICAgICBjb2wgKz0gZyAqIDB4MTAwOwotICAgICAgICBjb2wgKz0gYjsKLSAgICAgICAgQ1JGX0NoYXJTdGF0ZSogcFN0YXRlID0gR2V0Q2hhclN0YXRlKHBUZXh0T2JqLCBwRm9udCwgaGVpZ2h0LCBjb2wpOwotICAgICAgICBGWF9GTE9BVCBkeCA9IDAsIGR5ID0gMDsKLSAgICAgICAgRlhfUkVDVCBPYmpCQm94OwotICAgICAgICBpZihwT2JqTWF0cml4KSB7Ci0gICAgICAgICAgICBPYmpCQm94ID0gcFRleHRPYmotPkdldEJCb3gocE9iak1hdHJpeCk7Ci0gICAgICAgICAgICBkeCA9IChmbG9hdClPYmpCQm94LmxlZnQ7Ci0gICAgICAgICAgICBkeSA9IChmbG9hdClPYmpCQm94LmJvdHRvbTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwotICAgICAgICAgICAgT2JqQkJveCA9IHBUZXh0T2JqLT5HZXRCQm94KCZtYXRyaXgpOwotICAgICAgICB9Ci0gICAgICAgIEZYX0ZMT0FUIG9ialdpZHRoID0gMDsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyOwotICAgICAgICBGWF9CT09MIGJPcmRlciA9IFRSVUU7Ci0gICAgICAgIENGWF9QdHJBcnJheSB0ZW1wQXJyYXk7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgQ1BERl9UZXh0T2JqZWN0SXRlbSBJdGVtOwotICAgICAgICBwVGV4dE9iai0+R2V0SXRlbUluZm8oaSwgJkl0ZW0pOwotICAgICAgICBkeCA9IEl0ZW0ubV9PcmlnaW5YOwotICAgICAgICBkeSA9IEl0ZW0ubV9PcmlnaW5ZOwotICAgICAgICB0ZXh0TWF0cml4LlRyYW5zZm9ybShJdGVtLm1fT3JpZ2luWCwgSXRlbS5tX09yaWdpblksIGR4LCBkeSk7Ci0gICAgICAgIENSRl9DaGFyRGF0YSogcExhc3REYXRhID0gTlVMTDsKLSAgICAgICAgRlhfRkxPQVQgaG9yelNjYWxlID0gcFRleHRPYmotPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplVigpIC8gcFRleHRPYmotPm1fVGV4dFN0YXRlLkdldEZvbnRTaXplSCgpOwotICAgICAgICB3aGlsZShpIDwgY291bnQpIHsKLSAgICAgICAgICAgIHBUZXh0T2JqLT5HZXRJdGVtSW5mbyhpLCAmSXRlbSk7Ci0gICAgICAgICAgICBpZihJdGVtLm1fQ2hhckNvZGUgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9GTE9BVCBPcmlnaW5YLCBPcmlnaW5ZOwotICAgICAgICAgICAgdGV4dE1hdHJpeC5UcmFuc2Zvcm0oSXRlbS5tX09yaWdpblgsIEl0ZW0ubV9PcmlnaW5ZLCBPcmlnaW5YLCBPcmlnaW5ZKTsKLSAgICAgICAgICAgIENSRl9DaGFyRGF0YSogcERhdGEgPSAoQ1JGX0NoYXJEYXRhKiltX3BSZWZsb3dlZFBhZ2UtPm1fcE1lbW9yeVBvb2wtPkFsbG9jKHNpemVvZihDUkZfQ2hhckRhdGEpKTsKLSAgICAgICAgICAgIGlmIChOVUxMID09IHBEYXRhKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwRGF0YS0+bV9UeXBlID0gQ1JGX0RhdGE6OlRleHQ7Ci0gICAgICAgICAgICBpZihGWFNZU19mYWJzKE9yaWdpblkgLSBkeSkgPiBGWFNZU19mYWJzKE9yaWdpblggLSBkeCkpIHsKLSAgICAgICAgICAgICAgICBwRGF0YS0+bV9Qb3NZID0gZHk7Ci0gICAgICAgICAgICAgICAgcERhdGEtPm1fUG9zWCA9IHBMYXN0RGF0YS0+bV9Qb3NYICsgcExhc3REYXRhLT5tX1dpZHRoICsgdGV4dE1hdHJpeC5UcmFuc2Zvcm1EaXN0YW5jZShwVGV4dE9iai0+bV9UZXh0U3RhdGUuR2V0T2JqZWN0KCktPm1fQ2hhclNwYWNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcERhdGEtPm1fUG9zWSA9IE9yaWdpblk7Ci0gICAgICAgICAgICAgICAgcERhdGEtPm1fUG9zWCA9IE9yaWdpblg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IHRlbXBBcnJheS5HZXRTaXplKCk7Ci0gICAgICAgICAgICBpZihzaXplICYmIHBEYXRhLT5tX1Bvc1ggPCBwTGFzdERhdGEtPm1fUG9zWCApIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNpemU7IGorKykgewotICAgICAgICAgICAgICAgICAgICBDUkZfQ2hhckRhdGEqIHBEYXRhMSA9IChDUkZfQ2hhckRhdGEqKXRlbXBBcnJheS5HZXRBdChqKTsKLSAgICAgICAgICAgICAgICAgICAgaWYocERhdGExLT5tX1Bvc1ggPiBwRGF0YS0+bV9Qb3NYKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQXJyYXkuSW5zZXJ0QXQoaiwgcERhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRlbXBBcnJheS5BZGQocERhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcExhc3REYXRhID0gcERhdGE7Ci0gICAgICAgICAgICBwRGF0YS0+bV9DaGFyQ29kZSA9IEl0ZW0ubV9DaGFyQ29kZTsKLSAgICAgICAgICAgIHBEYXRhLT5tX0hlaWdodCA9IEZYU1lTX2ZhYnMoaGVpZ2h0KTsKLSAgICAgICAgICAgIGludCB3ID0gR2V0Q2hhcldpZHRoKEl0ZW0ubV9DaGFyQ29kZSwgcEZvbnQpOwotICAgICAgICAgICAgcERhdGEtPm1fV2lkdGggPSBGWFNZU19mYWJzKGZzICogdGV4dE1hdHJpeC5UcmFuc2Zvcm1EaXN0YW5jZSgoRlhfRkxPQVQpdykgLyAxMDAwKTsKLSAgICAgICAgICAgIGlmKGhvcnpTY2FsZSkgewotICAgICAgICAgICAgICAgIHBEYXRhLT5tX1dpZHRoIC89IGhvcnpTY2FsZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBEYXRhLT5tX3BDaGFyU3RhdGUgPSBwU3RhdGU7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICAgICAgY291bnQgPSB0ZW1wQXJyYXkuR2V0U2l6ZSgpOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvdW50OyBqKyspIHsKLSAgICAgICAgICAgIENSRl9DaGFyRGF0YSogcERhdGEgPSAoQ1JGX0NoYXJEYXRhKil0ZW1wQXJyYXkuR2V0QXQoaik7Ci0gICAgICAgICAgICBpZiAobV9wVGVtcExpbmUpIHsKLSAgICAgICAgICAgICAgICBtX3BUZW1wTGluZS0+QWRkKHBEYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0ZW1wQXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgfSBlbHNlIGlmKHBPYmotPm1fVHlwZSA9PSBQREZQQUdFX0lNQUdFKSB7Ci0gICAgICAgIENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiA9IChDUERGX0ltYWdlT2JqZWN0KiApcE9iajsKLSAgICAgICAgQ1JGX0ltYWdlRGF0YSogcFJGSW1hZ2UgPSAoQ1JGX0ltYWdlRGF0YSopbV9wUmVmbG93ZWRQYWdlLT5tX3BNZW1vcnlQb29sLT5BbGxvYyhzaXplb2YoQ1JGX0ltYWdlRGF0YSkpOwotICAgICAgICBpZiAoTlVMTCA9PSBwUkZJbWFnZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHBSRkltYWdlLT5tX3BCaXRtYXAgPSBOVUxMOwotICAgICAgICBwUkZJbWFnZS0+bV9UeXBlID0gQ1JGX0RhdGE6OkltYWdlOwotICAgICAgICBpZiAobV9wVGVtcExpbmUpIHsKLSAgICAgICAgICAgIG1fcFRlbXBMaW5lLT5BZGQocFJGSW1hZ2UpOwotICAgICAgICB9Ci0gICAgICAgIENQREZfSW1hZ2UgKnBJbWFnZSA9IHBJbWFnZU9iai0+bV9wSW1hZ2U7Ci0gICAgICAgIGlmICghcEltYWdlLT5tX3BESUJTb3VyY2UgfHwgIXBJbWFnZS0+bV9wTWFzaykgewotICAgICAgICAgICAgaWYocEltYWdlLT5TdGFydExvYWRESUJTb3VyY2UobV9wUmVmbG93ZWRQYWdlLT5HZXRGb3JtUmVzRGljdChwSW1hZ2VPYmopLCBtX3BSZWZsb3dlZFBhZ2UtPm1fcFBERlBhZ2UtPm1fcFJlc291cmNlcywgMCwgMCwgVFJVRSkpIHsKLSAgICAgICAgICAgICAgICBwSW1hZ2UtPkNvbnRpbnVlKE5VTEwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIENGWF9ESUJTb3VyY2UqIHBEaWJTb3VyY2UgPSBwSW1hZ2UtPkRldGFjaEJpdG1hcCgpOwotICAgICAgICBpZiAocERpYlNvdXJjZSkgewotICAgICAgICAgICAgcFJGSW1hZ2UtPm1fcEJpdG1hcCA9IHBEaWJTb3VyY2UtPkNsb25lKCk7Ci0gICAgICAgICAgICBkZWxldGUgcERpYlNvdXJjZTsKLSAgICAgICAgfQotICAgICAgICBDRlhfRElCU291cmNlKiBwTWFzayA9IHBJbWFnZS0+RGV0YWNoTWFzaygpOwotICAgICAgICBpZiAocE1hc2spIHsKLSAgICAgICAgICAgIGlmICghcE1hc2stPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBNYXNrQm1wID0gcE1hc2stPkNsb25lKCk7Ci0gICAgICAgICAgICAgICAgcE1hc2tCbXAtPkNvbnZlcnRGb3JtYXQoRlhESUJfOGJwcE1hc2spOwotICAgICAgICAgICAgICAgIHBSRkltYWdlLT5tX3BCaXRtYXAtPk11bHRpcGx5QWxwaGEocE1hc2tCbXApOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBwTWFza0JtcDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcFJGSW1hZ2UtPm1fcEJpdG1hcC0+TXVsdGlwbHlBbHBoYShwTWFzayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWxldGUgcE1hc2s7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0Zsb2F0UmVjdCBPYmpCQm94OwotICAgICAgICBpZihwT2JqTWF0cml4KSB7Ci0gICAgICAgICAgICBPYmpCQm94ID0gcEltYWdlT2JqLT5HZXRCQm94KHBPYmpNYXRyaXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXg7Ci0gICAgICAgICAgICBPYmpCQm94ID0gcEltYWdlT2JqLT5HZXRCQm94KCZtYXRyaXgpOwotICAgICAgICB9Ci0gICAgICAgIHBSRkltYWdlLT5tX1dpZHRoID0gT2JqQkJveC5XaWR0aCgpOwotICAgICAgICBwUkZJbWFnZS0+bV9IZWlnaHQgPSBPYmpCQm94LkhlaWdodCgpOwotICAgICAgICBwUkZJbWFnZS0+bV9Qb3NYID0gMDsKLSAgICAgICAgcFJGSW1hZ2UtPm1fUG9zWSA9IDA7Ci0gICAgICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4KDEsIDAsIDAsIC0xLCAwLCAwKTsKLSAgICAgICAgbWF0cml4LkNvbmNhdChwSW1hZ2VPYmotPm1fTWF0cml4KTsKLSAgICAgICAgbWF0cml4LkNvbmNhdCgqcE9iak1hdHJpeCk7Ci0gICAgICAgIHBSRkltYWdlLT5tX01hdHJpeC5TZXQobWF0cml4LmEgPT0gMCA/IDAgOiBtYXRyaXguYSAvIEZYU1lTX2ZhYnMobWF0cml4LmEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeC5iID09IDAgPyAwIDogbWF0cml4LmIgLyBGWFNZU19mYWJzKG1hdHJpeC5iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXguYyA9PSAwID8gMCA6IG1hdHJpeC5jIC8gRlhTWVNfZmFicyhtYXRyaXguYyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LmQgPT0gMCA/IDAgOiBtYXRyaXguZCAvIEZYU1lTX2ZhYnMobWF0cml4LmQpLCAwLCAwKTsKLSAgICB9IGVsc2UgaWYocE9iai0+bV9UeXBlID09IFBERlBBR0VfUEFUSCkgewotICAgIH0KLX0KLUZYX0ZMT0FUIENQREZfTGF5b3V0UHJvY2Vzc29yX1JlZmxvdzo6IEdldERhdGFzV2lkdGgoaW50IGJlZ2luUG9zLCBpbnQgZW5kcG9zKQotewotICAgIGlmKGVuZHBvcyA8IGJlZ2luUG9zIHx8ICFtX3BUZW1wTGluZSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYoZW5kcG9zID4gbV9wVGVtcExpbmUtPkdldFNpemUoKSAtIDEpIHsKLSAgICAgICAgZW5kcG9zID0gbV9wVGVtcExpbmUtPkdldFNpemUoKSAtIDE7Ci0gICAgfQotICAgIENSRl9EYXRhKiBwQmVnaW5EYXRhID0gKCptX3BUZW1wTGluZSlbYmVnaW5Qb3NdOwotICAgIENSRl9EYXRhKiBwRW5kRGF0YSA9ICgqbV9wVGVtcExpbmUpW2VuZHBvc107Ci0gICAgcmV0dXJuIHBFbmREYXRhLT5tX1Bvc1ggLSBwQmVnaW5EYXRhLT5tX1Bvc1ggKyBwRW5kRGF0YS0+bV9XaWR0aDsKLX0KLUZYX1dDSEFSIENQREZfTGF5b3V0UHJvY2Vzc29yX1JlZmxvdzo6R2V0UHJlQ2hhcigpCi17Ci0gICAgaWYgKE5VTEwgPT0gbV9wQ3VyckxpbmUpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpbnQgaW5kZXggPSBtX3BDdXJyTGluZS0+R2V0U2l6ZSgpIC0gMTsKLSAgICBDUkZfQ2hhckRhdGEqIHBDaGFyRGF0YSA9IE5VTEw7Ci0gICAgd2hpbGUgKGluZGV4ID49IDAgJiYgIXBDaGFyRGF0YSkgewotICAgICAgICBDUkZfRGF0YSogcERhdGEgPSAoKm1fcEN1cnJMaW5lKVtpbmRleF07Ci0gICAgICAgIGlmKHBEYXRhLT5HZXRUeXBlKCkgPT0gQ1JGX0RhdGE6OlRleHQpIHsKLSAgICAgICAgICAgIHBDaGFyRGF0YSA9IChDUkZfQ2hhckRhdGEqKXBEYXRhOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGluZGV4IC0tOwotICAgIH0KLSAgICBpZihtX3BSZWZsb3dlZFBhZ2UpIHsKLSAgICAgICAgaW5kZXggPSBtX3BSZWZsb3dlZFBhZ2UtPm1fcFJlZmxvd2VkLT5HZXRTaXplKCkgLSAxOwotICAgIH0KLSAgICB3aGlsZSghcENoYXJEYXRhICYmIGluZGV4ID49IDApIHsKLSAgICAgICAgQ1JGX0RhdGEqIHBEYXRhID0gKCptX3BSZWZsb3dlZFBhZ2UtPm1fcFJlZmxvd2VkKVtpbmRleF07Ci0gICAgICAgIGlmKHBEYXRhLT5HZXRUeXBlKCkgPT0gQ1JGX0RhdGE6OlRleHQpIHsKLSAgICAgICAgICAgIHBDaGFyRGF0YSA9IChDUkZfQ2hhckRhdGEqKXBEYXRhOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGluZGV4IC0tOwotICAgIH0KLSAgICBpZihwQ2hhckRhdGEpIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyID0gcENoYXJEYXRhLT5tX3BDaGFyU3RhdGUtPm1fcEZvbnQtPlVuaWNvZGVGcm9tQ2hhckNvZGUocENoYXJEYXRhLT5tX0NoYXJDb2RlKTsKLSAgICAgICAgcmV0dXJuIHN0ci5HZXRBdCgwKTsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotaW50IENQREZfTGF5b3V0UHJvY2Vzc29yX1JlZmxvdzo6UHJvY2Vzc0luc2VydE9iamVjdChDUERGX1RleHRPYmplY3QqIHBPYmosIENGWF9BZmZpbmVNYXRyaXggZm9ybU1hdHJpeCkKLXsKLSAgICBpZighcE9iaiB8fCAhbV9wUHJlT2JqIHx8ICFtX3BDdXJyTGluZSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYobV9wQ3VyckxpbmUtPkdldFNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBDUERGX1RleHRPYmplY3RJdGVtIGl0ZW07Ci0gICAgaW50IG5JdGVtID0gbV9wUHJlT2JqLT5Db3VudEl0ZW1zKCk7Ci0gICAgbV9wUHJlT2JqLT5HZXRJdGVtSW5mbyhuSXRlbSAtIDEsICZpdGVtKTsKLSAgICBGWF9GTE9BVCBsYXN0X3BvcyA9IGl0ZW0ubV9PcmlnaW5YOwotICAgIEZYX0ZMT0FUIGxhc3Rfd2lkdGggPSBHZXRDaGFyV2lkdGgoaXRlbS5tX0NoYXJDb2RlLCBtX3BQcmVPYmotPkdldEZvbnQoKSkgKiBtX3BQcmVPYmotPkdldEZvbnRTaXplKCkgLyAxMDAwOwotICAgIGxhc3Rfd2lkdGggPSBGWFNZU19mYWJzKGxhc3Rfd2lkdGgpOwotICAgIHBPYmotPkdldEl0ZW1JbmZvKDAsICZpdGVtKTsKLSAgICBGWF9GTE9BVCB0aGlzX3dpZHRoID0gR2V0Q2hhcldpZHRoKGl0ZW0ubV9DaGFyQ29kZSwgcE9iai0+R2V0Rm9udCgpKSAqIHBPYmotPkdldEZvbnRTaXplKCkgLyAxMDAwOwotICAgIHRoaXNfd2lkdGggPSBGWFNZU19mYWJzKHRoaXNfd2lkdGgpOwotICAgIEZYX0ZMT0FUIHRocmVzaG9sZCA9IGxhc3Rfd2lkdGggPiB0aGlzX3dpZHRoID8gbGFzdF93aWR0aCAvIDQgOiB0aGlzX3dpZHRoIC8gNDsKLSAgICBDRlhfQWZmaW5lTWF0cml4IHByZXZfbWF0cml4LCBwcmV2X3JldmVyc2U7Ci0gICAgbV9wUHJlT2JqLT5HZXRUZXh0TWF0cml4KCZwcmV2X21hdHJpeCk7Ci0gICAgcHJldl9tYXRyaXguQ29uY2F0KG1fcGVyTWF0cml4KTsKLSAgICBwcmV2X3JldmVyc2UuU2V0UmV2ZXJzZShwcmV2X21hdHJpeCk7Ci0gICAgRlhfRkxPQVQgeCA9IHBPYmotPkdldFBvc1goKSwgeSA9IHBPYmotPkdldFBvc1koKTsKLSAgICBmb3JtTWF0cml4LlRyYW5zZm9ybSh4LCB5KTsKLSAgICBwcmV2X3JldmVyc2UuVHJhbnNmb3JtKHgsIHkpOwotICAgIEZYX1dDSEFSIHByZUNoYXIgID0gR2V0UHJlQ2hhcigpOwotICAgIENGWF9XaWRlU3RyaW5nIHdzdHJJdGVtID0gcE9iai0+R2V0Rm9udCgpLT5Vbmljb2RlRnJvbUNoYXJDb2RlKGl0ZW0ubV9DaGFyQ29kZSk7Ci0gICAgRlhfV0NIQVIgY3VyQ2hhciA9IHdzdHJJdGVtLkdldEF0KDApOwotICAgIGlmIChGWFNZU19mYWJzKHkpID4gdGhyZXNob2xkICogMikgewotICAgICAgICBpZiAocHJlQ2hhciA9PSBMJy0nKSB7Ci0gICAgICAgICAgICByZXR1cm4gMzsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJlQ2hhciAhPSBMJyAnKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0gICAgaWYgKCh4IC0gbGFzdF9wb3MgLSBsYXN0X3dpZHRoKSA+IHRocmVzaG9sZCAmJiBjdXJDaGFyICE9IEwnICcgJiYgcHJlQ2hhciAhPSBMJyAnKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLUZYX0lOVDMyIENQREZfTGF5b3V0UHJvY2Vzc29yX1JlZmxvdzo6TG9naWNQcmVPYmooQ1BERl9UZXh0T2JqZWN0KiBwT2JqKQotewotICAgIENQREZfVGV4dE9iamVjdCogcFByZU9iaiA9IG1fcFByZU9iajsKLSAgICBtX3BQcmVPYmogPSBwT2JqOwotICAgIGlmKCFwT2JqIHx8ICFwUHJlT2JqKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBDUERGX1RleHRPYmplY3RJdGVtIGl0ZW07Ci0gICAgcFByZU9iai0+R2V0SXRlbUluZm8ocFByZU9iai0+Q291bnRJdGVtcygpIC0gMSwgJml0ZW0pOwotICAgIEZYX0ZMT0FUIGxhc3RfcG9zID0gaXRlbS5tX09yaWdpblg7Ci0gICAgRlhfRkxPQVQgbGFzdF93aWR0aCA9IHBQcmVPYmotPkdldEZvbnQoKS0+R2V0Q2hhcldpZHRoRihpdGVtLm1fQ2hhckNvZGUpICogcFByZU9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDA7Ci0gICAgbGFzdF93aWR0aCA9IEZYU1lTX2ZhYnMobGFzdF93aWR0aCk7Ci0gICAgcE9iai0+R2V0SXRlbUluZm8oMCwgJml0ZW0pOwotICAgIEZYX0ZMT0FUIHRoaXNfd2lkdGggPSBwT2JqLT5HZXRGb250KCktPkdldENoYXJXaWR0aEYoaXRlbS5tX0NoYXJDb2RlKSAqIHBPYmotPkdldEZvbnRTaXplKCkgLyAxMDAwOwotICAgIHRoaXNfd2lkdGggPSBGWFNZU19mYWJzKHRoaXNfd2lkdGgpOwotICAgIEZYX0ZMT0FUIHRocmVzaG9sZCA9IGxhc3Rfd2lkdGggPiB0aGlzX3dpZHRoID8gbGFzdF93aWR0aCAvIDQgOiB0aGlzX3dpZHRoIC8gNDsKLSAgICBDRlhfQWZmaW5lTWF0cml4IHByZXZfbWF0cml4LCBwcmV2X3JldmVyc2U7Ci0gICAgcFByZU9iai0+R2V0VGV4dE1hdHJpeCgmcHJldl9tYXRyaXgpOwotICAgIHByZXZfcmV2ZXJzZS5TZXRSZXZlcnNlKHByZXZfbWF0cml4KTsKLSAgICBGWF9GTE9BVCB4ID0gcE9iai0+R2V0UG9zWCgpLCB5ID0gcE9iai0+R2V0UG9zWSgpOwotICAgIHByZXZfcmV2ZXJzZS5UcmFuc2Zvcm0oeCwgeSk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3N0ckl0ZW0gPSBwT2JqLT5HZXRGb250KCktPlVuaWNvZGVGcm9tQ2hhckNvZGUoaXRlbS5tX0NoYXJDb2RlKTsKLSAgICBGWF9XQ0hBUiBjdXJDaGFyID0gd3N0ckl0ZW0uR2V0QXQoMCk7Ci0gICAgaWYgKEZYU1lTX2ZhYnMoeSkgPiB0aHJlc2hvbGQgKiAyKSB7Ci0gICAgICAgIHJldHVybiAyOwotICAgIH0KLSAgICBGWF9XQ0hBUiBwcmVDaGFyID0gMDsKLSAgICBpZiAoRlhTWVNfZmFicyhsYXN0X3BvcyArIGxhc3Rfd2lkdGggLSB4KSA+IHRocmVzaG9sZCAmJiBjdXJDaGFyICE9IEwnICcpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiAwOwotICAgIG1fcFByZU9iaiA9IHBPYmo7Ci0gICAgaWYoIXBQcmVPYmopIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmKHBQcmVPYmotPm1fVHlwZSAhPSBwT2JqLT5tX1R5cGUpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENGWF9GbG9hdFJlY3QgcmNDdXJPYmoocE9iai0+bV9MZWZ0LCBwT2JqLT5tX0JvdHRvbSwgcE9iai0+bV9SaWdodCwgcE9iai0+bV9Ub3ApOwotICAgIENGWF9GbG9hdFJlY3QgcmNQcmVPYmoocFByZU9iai0+bV9MZWZ0LCBwUHJlT2JqLT5tX0JvdHRvbSwgcFByZU9iai0+bV9SaWdodCwgcFByZU9iai0+bV9Ub3ApOwotICAgIGlmKHBPYmotPm1fVHlwZSA9PSBQREZQQUdFX0lNQUdFKSB7Ci0gICAgICAgIGlmKHJjUHJlT2JqLkNvbnRhaW5zKHJjQ3VyT2JqKSkgewotICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYocmNDdXJPYmouQ29udGFpbnMocmNQcmVPYmopKSB7Ci0gICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYocE9iai0+bV9UeXBlID09IFBERlBBR0VfVEVYVCkgewotICAgICAgICBpZighKChyY1ByZU9iai5ib3R0b20gPiByY0N1ck9iai50b3ApIHx8IChyY1ByZU9iai50b3AgPCByY0N1ck9iai5ib3R0b20pKSkgewotICAgICAgICAgICAgRlhfRkxPQVQgaGVpZ2h0ID0gRlhfTUlOKHJjUHJlT2JqLkhlaWdodCgpLCByY0N1ck9iai5IZWlnaHQoKSk7Ci0gICAgICAgICAgICBpZigocmNDdXJPYmoubGVmdCAtIHJjUHJlT2JqLnJpZ2h0KSA+IGhlaWdodCAvIDMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihGWFNZU19mYWJzKHJjUHJlT2JqLldpZHRoKCkgLSByY0N1ck9iai5XaWR0aCgpKSA+PSAyIHx8IEZYU1lTX2ZhYnMocmNQcmVPYmouSGVpZ2h0KCkgLSByY0N1ck9iai5IZWlnaHQoKSkgPj0gMiApIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIENQREZfVGV4dE9iamVjdCogcFByZVRleHRPYmogPSAoQ1BERl9UZXh0T2JqZWN0KilwUHJlT2JqOwotICAgICAgICBDUERGX1RleHRPYmplY3QqIHBDdXJUZXh0T2JqID0gKENQREZfVGV4dE9iamVjdCopcE9iajsKLSAgICAgICAgaW50IG5QcmVDb3VudCA9IHBQcmVUZXh0T2JqLT5Db3VudEl0ZW1zKCk7Ci0gICAgICAgIGludCBuQ3VyQ291bnQgPSBwQ3VyVGV4dE9iai0+Q291bnRJdGVtcygpOwotICAgICAgICBpZiAoblByZUNvdW50ICE9IG5DdXJDb3VudCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfQk9PTCBiU2FtZSA9IFRSVUU7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgblByZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIENQREZfVGV4dE9iamVjdEl0ZW0gaXRlbVBlciwgaXRlbUN1cjsKLSAgICAgICAgICAgIHBQcmVUZXh0T2JqLT5HZXRJdGVtSW5mbyhpLCAmaXRlbVBlcik7Ci0gICAgICAgICAgICBwQ3VyVGV4dE9iai0+R2V0SXRlbUluZm8oaSwgJml0ZW1DdXIpOwotICAgICAgICAgICAgaWYgKGl0ZW1DdXIubV9DaGFyQ29kZSAhPSBpdGVtUGVyLm1fQ2hhckNvZGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpdGVtQ3VyLm1fT3JpZ2luWCAhPSBpdGVtUGVyLm1fT3JpZ2luWCkgewotICAgICAgICAgICAgICAgIGJTYW1lID0gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaXRlbUN1ci5tX09yaWdpblkgIT0gaXRlbVBlci5tX09yaWdpblkpIHsKLSAgICAgICAgICAgICAgICBiU2FtZSA9IEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKHJjUHJlT2JqLmxlZnQgPT0gcmNDdXJPYmoubGVmdCAmJiByY1ByZU9iai50b3AgPT0gcmNDdXJPYmoudG9wKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBpZihGWFNZU19mYWJzKHJjUHJlT2JqLmxlZnQgLSByY0N1ck9iai5sZWZ0KSA8IHJjUHJlT2JqLldpZHRoKCkgLyAzCi0gICAgICAgICAgICAgICAgJiYgRlhTWVNfZmFicyhyY1ByZU9iai50b3AgLSByY0N1ck9iai50b3ApIDwgcmNQcmVPYmouSGVpZ2h0KCkgLyAzKSB7Ci0gICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLUZYX0JPT0wgQ1BERl9MYXlvdXRQcm9jZXNzb3JfUmVmbG93OjpJc1NhbWVUZXh0T2JqZWN0KENQREZfVGV4dE9iamVjdCogcFRleHRPYmoxLCBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMikKLXsKLSAgICBpZiAoIXBUZXh0T2JqMSB8fCAhcFRleHRPYmoyKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByY1ByZU9iaihwVGV4dE9iajItPm1fTGVmdCwgcFRleHRPYmoyLT5tX0JvdHRvbSwgcFRleHRPYmoyLT5tX1JpZ2h0LCBwVGV4dE9iajItPm1fVG9wKTsKLSAgICBDRlhfRmxvYXRSZWN0IHJjQ3VyT2JqKHBUZXh0T2JqMS0+bV9MZWZ0LCBwVGV4dE9iajEtPm1fQm90dG9tLCBwVGV4dE9iajEtPm1fUmlnaHQsIHBUZXh0T2JqMS0+bV9Ub3ApOwotICAgIGlmIChyY1ByZU9iai5Jc0VtcHR5KCkgJiYgcmNDdXJPYmouSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKCFyY1ByZU9iai5Jc0VtcHR5KCkgfHwgIXJjQ3VyT2JqLklzRW1wdHkoKSkgewotICAgICAgICByY1ByZU9iai5JbnRlcnNlY3QocmNDdXJPYmopOwotICAgICAgICBpZiAocmNQcmVPYmouSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEZYU1lTX2ZhYnMocmNQcmVPYmouV2lkdGgoKSAtIHJjQ3VyT2JqLldpZHRoKCkpID4gcmNDdXJPYmouV2lkdGgoKSAvIDIpIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAocFRleHRPYmoyLT5HZXRGb250U2l6ZSgpICE9IHBUZXh0T2JqMS0+R2V0Rm9udFNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIGludCBuUHJlQ291bnQgPSBwVGV4dE9iajItPkNvdW50SXRlbXMoKTsKLSAgICBpbnQgbkN1ckNvdW50ID0gcFRleHRPYmoxLT5Db3VudEl0ZW1zKCk7Ci0gICAgaWYgKG5QcmVDb3VudCAhPSBuQ3VyQ291bnQpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5QcmVDb3VudDsgaSsrKSB7Ci0gICAgICAgIENQREZfVGV4dE9iamVjdEl0ZW0gaXRlbVBlciwgaXRlbUN1cjsKLSAgICAgICAgcFRleHRPYmoyLT5HZXRJdGVtSW5mbyhpLCAmaXRlbVBlcik7Ci0gICAgICAgIHBUZXh0T2JqMS0+R2V0SXRlbUluZm8oaSwgJml0ZW1DdXIpOwotICAgICAgICBpZiAoaXRlbUN1ci5tX0NoYXJDb2RlICE9IGl0ZW1QZXIubV9DaGFyQ29kZSkgewotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotdm9pZCBDUERGX0xheW91dFByb2Nlc3Nvcl9SZWZsb3c6OlByb2Nlc3NUZXh0T2JqZWN0KENQREZfVGV4dE9iamVjdCAqcFRleHRPYmosIEZYX0ZMT0FUIHJlZmxvd1dpZHRoLCBDRlhfQWZmaW5lTWF0cml4IG9iak1hdHJpeCkKLXsKLSAgICBpZihyZWZsb3dXaWR0aCA8IDAgfHwgIW1fcEN1cnJMaW5lIHx8ICFtX3BUZW1wTGluZSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmKElzU2FtZVRleHRPYmplY3QocFRleHRPYmosIG1fcFByZU9iaikpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX1BhZ2VPYmplY3QqIHBQcmVPYmogPSBtX3BQcmVPYmo7Ci0gICAgRlhfSU5UMzIgbG9naWMgPSBQcm9jZXNzSW5zZXJ0T2JqZWN0KHBUZXh0T2JqLCBvYmpNYXRyaXgpOwotICAgIG1fcFByZU9iaiA9IHBUZXh0T2JqOwotICAgIG1fcGVyTWF0cml4LkNvcHkob2JqTWF0cml4KTsKLSAgICBpbnQgc2l6ZSA9IG1fcFRlbXBMaW5lLT5HZXRTaXplKCk7Ci0gICAgaW50IGN1cnMgPSBtX3BDdXJyTGluZS0+R2V0U2l6ZSgpOwotICAgIENyZWF0ZVJGRGF0YShwVGV4dE9iaik7Ci0gICAgc2l6ZSA9IG1fcFRlbXBMaW5lLT5HZXRTaXplKCk7Ci0gICAgaW50IHJlZHMgPSBtX3BSZWZsb3dlZFBhZ2UtPm1fcFJlZmxvd2VkLT5HZXRTaXplKCk7Ci0gICAgaWYoc2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYobG9naWMgPT0gMSkgewotICAgICAgICBtX2ZDdXJyTGluZVdpZHRoICs9IHBUZXh0T2JqLT5HZXRCQm94KCZvYmpNYXRyaXgpLkhlaWdodCgpIC8gMzsKLSAgICB9IGVsc2UgaWYobG9naWMgPT0gMyAmJiBjdXJzKSB7Ci0gICAgICAgIG1fZkN1cnJMaW5lV2lkdGggLT0gKCptX3BDdXJyTGluZSlbY3VycyAtIDFdLT5tX1dpZHRoOwotICAgICAgICBtX3BDdXJyTGluZS0+RGVsZXRlKGN1cnMgLSAxKTsKLSAgICB9Ci0gICAgaW50IGJlZ2luUG9zID0gMCwgZW5kUG9zID0gbV9wVGVtcExpbmUtPkdldFNpemUoKSAtIDE7Ci0gICAgd2hpbGUoYmVnaW5Qb3MgPD0gZW5kUG9zKSB7Ci0gICAgICAgIGludCB0ZW1wQmVnaW5Qb3MgPSBiZWdpblBvczsKLSAgICAgICAgaW50IHRlbXBFbmRQb3MgPSBlbmRQb3M7Ci0gICAgICAgIEZYX0ZMT0FUIGFsbF93aWR0aCA9IEdldERhdGFzV2lkdGgoIGJlZ2luUG9zLCBlbmRQb3MpOwotICAgICAgICBpZihhbGxfd2lkdGggPCByZWZsb3dXaWR0aCAtIG1fZkN1cnJMaW5lV2lkdGgpIHsKLSAgICAgICAgICAgIENSRl9DaGFyRGF0YSogcEJlZ2luRGF0YSA9IChDUkZfQ2hhckRhdGEqKSgqbV9wVGVtcExpbmUpW2JlZ2luUG9zXTsKLSAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4KDEsIDAsIDAsIDEsIC1wQmVnaW5EYXRhLT5tX1Bvc1ggKyBtX2ZDdXJyTGluZVdpZHRoLCAtcEJlZ2luRGF0YS0+bV9Qb3NZKTsKLSAgICAgICAgICAgIFRyYW5zZm9ybSgmbWF0cml4LCBtX3BUZW1wTGluZSwgYmVnaW5Qb3MsIGVuZFBvcyAtIGJlZ2luUG9zICsgMSk7Ci0gICAgICAgICAgICBBZGRUZW1wMkN1cnJMaW5lKGJlZ2luUG9zLCBlbmRQb3MgLSBiZWdpblBvcyArIDEpOwotICAgICAgICAgICAgbV9wVGVtcExpbmUtPlJlbW92ZUFsbCgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGludAltaWRQb3MgOwotICAgICAgICBpZih0ZW1wQmVnaW5Qb3MgPj0gdGVtcEVuZFBvcyAmJiB0ZW1wRW5kUG9zICE9IDApIHsKLSAgICAgICAgICAgIG1pZFBvcyA9IHRlbXBFbmRQb3M7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3aGlsZSAodGVtcEJlZ2luUG9zIDwgdGVtcEVuZFBvcyApIHsKLSAgICAgICAgICAgICAgICBtaWRQb3MgPSAodGVtcEVuZFBvcyAtIHRlbXBCZWdpblBvcykgLyAyICsgdGVtcEJlZ2luUG9zOwotICAgICAgICAgICAgICAgIGlmKG1pZFBvcyA9PSB0ZW1wQmVnaW5Qb3MgfHwgbWlkUG9zID09IHRlbXBFbmRQb3MpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHcgPSBHZXREYXRhc1dpZHRoKCBiZWdpblBvcywgbWlkUG9zKTsKLSAgICAgICAgICAgICAgICBpZih3IDwgcmVmbG93V2lkdGggLSBtX2ZDdXJyTGluZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBCZWdpblBvcyA9IG1pZFBvczsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0ZW1wRW5kUG9zID0gbWlkUG9zOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1pZFBvcyA9IHRlbXBCZWdpblBvczsKLSAgICAgICAgICAgIGlmKG1pZFBvcyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgRlhfRkxPQVQgdyA9IEdldERhdGFzV2lkdGgoIGJlZ2luUG9zLCAxKTsKLSAgICAgICAgICAgICAgICBpZih3ID4gcmVmbG93V2lkdGggLSBtX2ZDdXJyTGluZVdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1pZFBvcyA9IC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihtaWRQb3MgPT0gLTEpIHsKLSAgICAgICAgICAgIGludCBjb3VudCA9IG1fcEN1cnJMaW5lLT5HZXRTaXplKCk7Ci0gICAgICAgICAgICBpZihjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbWlkUG9zID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnQgZiA9IC0xOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGZvcihpID0gbWlkUG9zOyBpID49IGJlZ2luUG9zOyBpLS0pIHsKLSAgICAgICAgICAgIENSRl9DaGFyRGF0YSogcERhdGEgPSAoQ1JGX0NoYXJEYXRhKikoKm1fcFRlbXBMaW5lKVtpXTsKLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIFdzdHIgPSBwRGF0YS0+bV9wQ2hhclN0YXRlLT5tX3BGb250LT5Vbmljb2RlRnJvbUNoYXJDb2RlKHBEYXRhLT5tX0NoYXJDb2RlKTsKLSAgICAgICAgICAgIEZYX1dDSEFSIGNoYSA9IFdzdHIuR2V0QXQoMCk7Ci0gICAgICAgICAgICBpZihpIDwgbV9wVGVtcExpbmUtPkdldFNpemUoKSAtIDEpIHsKLSAgICAgICAgICAgICAgICBDUkZfQ2hhckRhdGEqIHBOZXh0RGF0YSA9IChDUkZfQ2hhckRhdGEqKSgqbV9wVGVtcExpbmUpW2kgKyAxXTsKLSAgICAgICAgICAgICAgICBpZihwTmV4dERhdGEtPm1fUG9zWCAtIChwRGF0YS0+bV9Qb3NYICsgcERhdGEtPm1fV2lkdGgpID49IHBEYXRhLT5tX0hlaWdodCAvIDQpIHsKLSAgICAgICAgICAgICAgICAgICAgZiA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihmID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgaWYoSXNDYW5CcmVha0FmdGVyKChGWF9EV09SRCljaGEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGYgPSBpOwotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKElzQ2FuQnJlYWtCZWZvcmUoKEZYX0RXT1JEKWNoYSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZiA9IGkgLSAxOwotICAgICAgICAgICAgICAgICAgICBpZihmIDwgYmVnaW5Qb3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGYgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGYgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBDUkZfQ2hhckRhdGEqIHBCZWdpbkRhdGEgPSAoQ1JGX0NoYXJEYXRhKikoKm1fcFRlbXBMaW5lKVtiZWdpblBvc107Ci0gICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXgoMSwgMCwgMCwgMSwgLXBCZWdpbkRhdGEtPm1fUG9zWCArIG1fZkN1cnJMaW5lV2lkdGgsIC1wQmVnaW5EYXRhLT5tX1Bvc1kpOwotICAgICAgICAgICAgICAgIFRyYW5zZm9ybSgmbWF0cml4LCBtX3BUZW1wTGluZSwgYmVnaW5Qb3MsIGYgLSBiZWdpblBvcyArIDEpOwotICAgICAgICAgICAgICAgIENSRl9EYXRhKiBwRGF0YSA9ICgqbV9wVGVtcExpbmUpWzBdOwotICAgICAgICAgICAgICAgIEFkZFRlbXAyQ3VyckxpbmUoYmVnaW5Qb3MsIGYgLSBiZWdpblBvcyArIDEpOwotICAgICAgICAgICAgICAgIGJlZ2luUG9zID0gaTsKLSAgICAgICAgICAgICAgICBGaW5pc2hlZEN1cnJMaW5lKCk7Ci0gICAgICAgICAgICAgICAgZiA9IDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYoZiA9PSAtMSAmJiBpIDwgYmVnaW5Qb3MpIHsKLSAgICAgICAgICAgIGlmKCBtX3BDdXJyTGluZS0+R2V0U2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gbV9wQ3VyckxpbmUtPkdldFNpemUoKTsKLSAgICAgICAgICAgICAgICBmID0gLTE7Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpID0gY291bnQgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgICAgICBDUkZfRGF0YSogcERhdGEgPSAoKm1fcEN1cnJMaW5lKVtpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYocERhdGEtPkdldFR5cGUoKSAhPSBDUkZfRGF0YTo6VGV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGkgKyAxOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1JGX0NoYXJEYXRhKiBwQ2hhckRhdGEgPSAoQ1JGX0NoYXJEYXRhKilwRGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIFdzdHIgPSBwQ2hhckRhdGEtPm1fcENoYXJTdGF0ZS0+bV9wRm9udC0+VW5pY29kZUZyb21DaGFyQ29kZShwQ2hhckRhdGEtPm1fQ2hhckNvZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgY2hhID0gV3N0ci5HZXRBdCgwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKElzQ2FuQnJlYWtBZnRlcihjaGEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGkgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihJc0NhbkJyZWFrQmVmb3JlKGNoYSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gaTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGYgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZihmICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGaW5pc2hlZEN1cnJMaW5lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihmIDwgY291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVmbG93ZENvdW50ID0gbV9wUmVmbG93ZWRQYWdlLT5tX3BSZWZsb3dlZC0+R2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3MgPSByZWZsb3dkQ291bnQgKyBmIC0gY291bnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JGX0NoYXJEYXRhKiBwRGF0YSA9IChDUkZfQ2hhckRhdGEqKSgqbV9wUmVmbG93ZWRQYWdlLT5tX3BSZWZsb3dlZClbcG9zXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeCgxLCAwLCAwLCAxLCAtcERhdGEtPm1fUG9zWCArIG1fZkN1cnJMaW5lV2lkdGgsIC1wRGF0YS0+bV9Qb3NZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm0oJm1hdHJpeCwgbV9wUmVmbG93ZWRQYWdlLT5tX3BSZWZsb3dlZCwgcG9zLCByZWZsb3dkQ291bnQgLSBwb3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpbnQgaiA9IHBvczsgaiA8IHJlZmxvd2RDb3VudDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZERhdGEyQ3VyckxpbmUoKCptX3BSZWZsb3dlZFBhZ2UtPm1fcFJlZmxvd2VkKVtqXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlZmxvd2VkUGFnZS0+bV9wUmVmbG93ZWQtPkRlbGV0ZShwb3MsIGNvdW50IC0gZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9naWMgPT0gMykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZDdXJyTGluZVdpZHRoICs9IHBUZXh0T2JqLT5HZXRCQm94KCZvYmpNYXRyaXgpLkhlaWdodCgpIC8gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGYgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBDUkZfQ2hhckRhdGEqIHBEYXRhID0gKENSRl9DaGFyRGF0YSopKCptX3BUZW1wTGluZSlbYmVnaW5Qb3NdOwotICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4KDEsIDAsIDAsIDEsIC1wRGF0YS0+bV9Qb3NYICsgbV9mQ3VyckxpbmVXaWR0aCwgLXBEYXRhLT5tX1Bvc1kpOwotICAgICAgICAgICAgICAgIGlmKGJlZ2luUG9zID09IG1pZFBvcykgewotICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm0oJm1hdHJpeCwgcERhdGEpOwotICAgICAgICAgICAgICAgICAgICBGWF9SRUNUIHJlY3Q7Ci0gICAgICAgICAgICAgICAgICAgIHBEYXRhLT5tX3BDaGFyU3RhdGUtPm1fcEZvbnQtPkdldEZvbnRCQm94KHJlY3QpOwotICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcG1hdHJpeCA9IHBUZXh0T2JqLT5tX1RleHRTdGF0ZS5HZXRNYXRyaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCB0ZXh0TWF0cml4KHBtYXRyaXhbMF0sIHBtYXRyaXhbMV0sIHBtYXRyaXhbMl0sIHBtYXRyaXhbM10sIDAsIDApOwotICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB3aWR0aCA9IHBEYXRhLT5tX0hlaWdodCAqIChyZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0KSAvIDEwMDA7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGYgPSAocmVmbG93V2lkdGggLSBtX2ZDdXJyTGluZVdpZHRoKSAvIHdpZHRoOwotICAgICAgICAgICAgICAgICAgICBwRGF0YS0+bV9Qb3NZICo9IGY7Ci0gICAgICAgICAgICAgICAgICAgIHBEYXRhLT5tX1dpZHRoICo9IGY7Ci0gICAgICAgICAgICAgICAgICAgIHBEYXRhLT5tX0hlaWdodCAqPSBmOwotICAgICAgICAgICAgICAgICAgICBwRGF0YS0+bV9wQ2hhclN0YXRlID0gR2V0Q2hhclN0YXRlKHBEYXRhLT5tX3BDaGFyU3RhdGUtPm1fcFRleHRPYmosIHBEYXRhLT5tX3BDaGFyU3RhdGUtPm1fcEZvbnQsIHBEYXRhLT5tX0hlaWdodCwgcERhdGEtPm1fcENoYXJTdGF0ZS0+bV9Db2xvcik7Ci0gICAgICAgICAgICAgICAgICAgIEFkZERhdGEyQ3VyckxpbmUocERhdGEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihpbnQgbSA9IGJlZ2luUG9zOyBtIDw9IG1pZFBvczsgbSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDUkZfQ2hhckRhdGEqIHBEYXRhID0gKENSRl9DaGFyRGF0YSopKCptX3BUZW1wTGluZSlbbV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm0oJm1hdHJpeCwgcERhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgQWRkRGF0YTJDdXJyTGluZShwRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRmluaXNoZWRDdXJyTGluZSgpOwotICAgICAgICAgICAgICAgIGJlZ2luUG9zID0gbWlkUG9zICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBtX3BUZW1wTGluZS0+UmVtb3ZlQWxsKCk7Ci0gICAgcmV0dXJuOwotfQotdm9pZCBDUERGX0xheW91dFByb2Nlc3Nvcl9SZWZsb3c6OlByb2Nlc3NVbml0YXJ5T2JqcyhDUERGX1BhZ2VPYmplY3RzICpwT2JqcywgRlhfRkxPQVQgcmVmbG93V2lkdGgsIENGWF9BZmZpbmVNYXRyaXggb2JqTWF0cml4KQotewotICAgIGlmKCFwT2JqcykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENGWF9GbG9hdFJlY3QgT2JqQkJveCA9IHBPYmpzLT5DYWxjQm91bmRpbmdCb3goKTsKLSAgICBvYmpNYXRyaXguVHJhbnNmb3JtUmVjdChPYmpCQm94KTsKLSAgICBGWF9GTE9BVCBPYmpXaWR0aCA9IE9iakJCb3guV2lkdGgoKTsKLSAgICBGWF9GTE9BVCBPYmpIZWlnaHQgPSBPYmpCQm94LkhlaWdodCgpOwotICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwotICAgIGlmKE9ialdpZHRoIDw9IHJlZmxvd1dpZHRoIC0gbV9mQ3VyckxpbmVXaWR0aCkgewotICAgICAgICBtYXRyaXguU2V0KDEsIDAsIDAsIDEsIG1fZkN1cnJMaW5lV2lkdGggLCAwKTsKLSAgICB9IGVsc2UgaWYoT2JqV2lkdGggPD0gcmVmbG93V2lkdGgpIHsKLSAgICAgICAgRmluaXNoZWRDdXJyTGluZSgpOwotICAgICAgICBtYXRyaXguU2V0KDEsIDAsIDAsIDEsIDAsIDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEZpbmlzaGVkQ3VyckxpbmUoKTsKLSAgICAgICAgRlhfRkxPQVQgZiA9IHJlZmxvd1dpZHRoIC8gT2JqV2lkdGggOwotICAgICAgICBtYXRyaXguU2V0KGYsIDAsIDAsIGYsIDAsIDApOwotICAgIH0KLSAgICBDRlhfQWZmaW5lTWF0cml4IHRlbXBNYXRyaXggPSBtYXRyaXg7Ci0gICAgbWF0cml4LkNvbmNhdChvYmpNYXRyaXgpOwotICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBPYmpzLT5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCk7Ci0gICAgd2hpbGUocG9zKSB7Ci0gICAgICAgIENQREZfUGFnZU9iamVjdCogcE9iaiA9IHBPYmpzLT5HZXROZXh0T2JqZWN0KHBvcyk7Ci0gICAgICAgIGlmKHBPYmotPm1fVHlwZSA9PSBQREZQQUdFX1RFWFQpIHsKLSAgICAgICAgICAgIEZYX0lOVDMyIHJldCA9IExvZ2ljUHJlT2JqKChDUERGX1RleHRPYmplY3QqKXBPYmopOwotICAgICAgICAgICAgaWYocmV0ID09IDEgfHwgcmV0ID09IDIpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBDcmVhdGVSRkRhdGEocE9iaiwgJm1hdHJpeCk7Ci0gICAgfQotICAgIGlmIChtX3BUZW1wTGluZSkgewotICAgICAgICBUcmFuc2Zvcm0oJnRlbXBNYXRyaXgsIG1fcFRlbXBMaW5lLCAwLCBtX3BUZW1wTGluZS0+R2V0U2l6ZSgpKTsKLSAgICAgICAgQWRkVGVtcDJDdXJyTGluZSgwLCBtX3BUZW1wTGluZS0+R2V0U2l6ZSgpKTsKLSAgICAgICAgbV9wVGVtcExpbmUtPlJlbW92ZUFsbCgpOwotICAgIH0KLX0KLXZvaWQgQ1BERl9MYXlvdXRQcm9jZXNzb3JfUmVmbG93OjpQcm9jZXNzUGF0aE9iamVjdChDUERGX1BhdGhPYmplY3QgKnBPYmosIEZYX0ZMT0FUIHJlZmxvd1dpZHRoKQotewotfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvcmVmbG93L2xheW91dHByb3ZpZGVyX3RhZ2dlZHBkZi5jcHAgYi9jb3JlL3NyYy9yZWZsb3cvbGF5b3V0cHJvdmlkZXJfdGFnZ2VkcGRmLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE1YTIyYi4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9yZWZsb3cvbGF5b3V0cHJvdmlkZXJfdGFnZ2VkcGRmLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc2OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAibGF5b3V0cHJvdmlkZXJfdGFnZ2VkcGRmLmgiCi1DUERGX0xheW91dEVsZW1lbnQ6OkNQREZfTGF5b3V0RWxlbWVudCgpCi17Ci0gICAgbV9wVGFnZ2VkRWxlbWVudCA9IE5VTEw7Ci0gICAgbV9wUGFyZW50RWxlbWVudCA9IE5VTEw7Ci19Ci1DUERGX0xheW91dEVsZW1lbnQ6On5DUERGX0xheW91dEVsZW1lbnQoKQotewotICAgIG1fT2JqQXJyYXkuUmVtb3ZlQWxsKCk7Ci0gICAgaW50IHNpemUgPSBtX0NoaWxkQXJyYXkuR2V0U2l6ZSgpOwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgQ1BERl9MYXlvdXRFbGVtZW50KiBwQ2hpbGQgPSAoQ1BERl9MYXlvdXRFbGVtZW50KiltX0NoaWxkQXJyYXkuR2V0QXQoaSk7Ci0gICAgICAgIGRlbGV0ZSBwQ2hpbGQ7Ci0gICAgICAgIHBDaGlsZCA9IE5VTEw7Ci0gICAgfQotICAgIG1fQ2hpbGRBcnJheS5SZW1vdmVBbGwoKTsKLX0KLUxheW91dFR5cGUgQ1BERl9MYXlvdXRFbGVtZW50OjpDb252ZXJ0TGF5b3V0VHlwZShGWF9CU1RSIG5hbWUpCi17Ci0gICAgaWYobmFtZSA9PSAoY29uc3QgY2hhciopKCJEb2N1bWVudCIpKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXREb2N1bWVudDsKLSAgICB9IGVsc2UgaWYobmFtZSA9PSAoY29uc3QgY2hhciopKCJQYXJ0IikpIHsKLSAgICAgICAgcmV0dXJuIExheW91dFBhcnQ7Ci0gICAgfSBlbHNlIGlmKG5hbWUgPT0gKGNvbnN0IGNoYXIqKSgiQXJ0IikpIHsKLSAgICAgICAgcmV0dXJuIExheW91dEFydDsKLSAgICB9IGVsc2UgaWYobmFtZSA9PSAoY29uc3QgY2hhciopKCJTZWN0IikpIHsKLSAgICAgICAgcmV0dXJuIExheW91dFNlY3Q7Ci0gICAgfSBlbHNlIGlmKG5hbWUgPT0gKGNvbnN0IGNoYXIqKSgiRGl2IikpIHsKLSAgICAgICAgcmV0dXJuIExheW91dERpdjsKLSAgICB9IGVsc2UgaWYobmFtZSA9PSAoY29uc3QgY2hhciopKCJCbG9ja1F1b3RlIikpIHsKLSAgICAgICAgcmV0dXJuIExheW91dEJsb2NrUXVvdGU7Ci0gICAgfSBlbHNlIGlmKG5hbWUgPT0gKGNvbnN0IGNoYXIqKSgiQ2FwdGlvbiIpKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRDYXB0aW9uOwotICAgIH0gZWxzZSBpZihuYW1lID09IChjb25zdCBjaGFyKikoIlRPQyIpKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRUT0M7Ci0gICAgfSBlbHNlIGlmKG5hbWUgPT0gKGNvbnN0IGNoYXIqKSgiVE9DSSIpKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRUT0NJOwotICAgIH0gZWxzZSBpZihuYW1lID09IChjb25zdCBjaGFyKikoIkluZGV4IikpIHsKLSAgICAgICAgcmV0dXJuIExheW91dEluZGV4OwotICAgIH0gZWxzZSBpZihuYW1lID09IChjb25zdCBjaGFyKikoIk5vblN0cnVjdCIpKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXROb25TdHJ1Y3Q7Ci0gICAgfSBlbHNlIGlmKG5hbWUgPT0gKGNvbnN0IGNoYXIqKSgiUHJpdmF0ZSIpKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRQcml2YXRlOwotICAgIH0gZWxzZSBpZihuYW1lID09IChjb25zdCBjaGFyKikoIlAiKSkgewotICAgICAgICByZXR1cm4gTGF5b3V0UGFyYWdyYXBoOwotICAgIH0gZWxzZSBpZihuYW1lID09IChjb25zdCBjaGFyKikoIkgiKSkgewotICAgICAgICByZXR1cm4gTGF5b3V0SGVhZGluZzsKLSAgICB9IGVsc2UgaWYobmFtZSA9PSAoY29uc3QgY2hhciopKCJIMSIpKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRIZWFkaW5nMTsKLSAgICB9IGVsc2UgaWYobmFtZSA9PSAoY29uc3QgY2hhciopKCJIMiIpKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRIZWFkaW5nMjsKLSAgICB9IGVsc2UgaWYobmFtZSA9PSAoY29uc3QgY2hhciopKCJIMyIpKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRIZWFkaW5nMzsKLSAgICB9IGVsc2UgaWYobmFtZSA9PSAoY29uc3QgY2hhciopKCJINCIpKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRIZWFkaW5nNDsKLSAgICB9IGVsc2UgaWYobmFtZSA9PSAoY29uc3QgY2hhciopKCJINSIpKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRIZWFkaW5nNTsKLSAgICB9IGVsc2UgaWYobmFtZSA9PSAoY29uc3QgY2hhciopKCJINiIpKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRIZWFkaW5nNjsKLSAgICB9IGVsc2UgaWYobmFtZSA9PSAoY29uc3QgY2hhciopKCJMIikpIHsKLSAgICAgICAgcmV0dXJuIExheW91dExpc3Q7Ci0gICAgfSBlbHNlIGlmKG5hbWUgPT0gKGNvbnN0IGNoYXIqKSgiTEkiKSkgewotICAgICAgICByZXR1cm4gTGF5b3V0TGlzdEl0ZW07Ci0gICAgfSBlbHNlIGlmKG5hbWUgPT0gKGNvbnN0IGNoYXIqKSgiTGJsIikpIHsKLSAgICAgICAgcmV0dXJuIExheW91dExpc3RMYWJlbDsKLSAgICB9IGVsc2UgaWYobmFtZSA9PSAoY29uc3QgY2hhciopKCJMQm9keSIpKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRMaXN0Qm9keTsKLSAgICB9IGVsc2UgaWYobmFtZSA9PSAoY29uc3QgY2hhciopKCJUYWJsZSIpKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRUYWJsZTsKLSAgICB9IGVsc2UgaWYobmFtZSA9PSAoY29uc3QgY2hhciopKCJUUiIpKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRUYWJsZVJvdzsKLSAgICB9IGVsc2UgaWYobmFtZSA9PSAoY29uc3QgY2hhciopKCJUSCIpKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRUYWJsZUhlYWRlckNlbGw7Ci0gICAgfSBlbHNlIGlmKG5hbWUgPT0gKGNvbnN0IGNoYXIqKSgiVEQiKSkgewotICAgICAgICByZXR1cm4gTGF5b3V0VGFibGVEYXRhQ2VsbDsKLSAgICB9IGVsc2UgaWYobmFtZSA9PSAoY29uc3QgY2hhciopKCJUSGVhZCIpKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRUYWJsZUhlYWRlckdyb3VwOwotICAgIH0gZWxzZSBpZihuYW1lID09IChjb25zdCBjaGFyKikoIlRCb2R5IikpIHsKLSAgICAgICAgcmV0dXJuIExheW91dFRhYmxlQm9keUdyb3VwOwotICAgIH0gZWxzZSBpZihuYW1lID09IChjb25zdCBjaGFyKikoIlRGb290IikpIHsKLSAgICAgICAgcmV0dXJuIExheW91dFRhYmxlRm9vdEdyb3VwOwotICAgIH0gZWxzZSBpZihuYW1lID09IChjb25zdCBjaGFyKikoIlNwYW4iKSkgewotICAgICAgICByZXR1cm4gTGF5b3V0U3BhbjsKLSAgICB9IGVsc2UgaWYobmFtZSA9PSAoY29uc3QgY2hhciopKCJRdW90ZSIpKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRRdW90ZTsKLSAgICB9IGVsc2UgaWYobmFtZSA9PSAoY29uc3QgY2hhciopKCJOb3RlIikpIHsKLSAgICAgICAgcmV0dXJuIExheW91dE5vdGU7Ci0gICAgfSBlbHNlIGlmKG5hbWUgPT0gKGNvbnN0IGNoYXIqKSgiUmVmZXJlbmNlIikpIHsKLSAgICAgICAgcmV0dXJuIExheW91dFJlZmVyZW5jZTsKLSAgICB9IGVsc2UgaWYobmFtZSA9PSAoY29uc3QgY2hhciopKCJCaWJFbnRyeSIpKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRCaWJFbnRyeTsKLSAgICB9IGVsc2UgaWYobmFtZSA9PSAoY29uc3QgY2hhciopKCJDb2RlIikpIHsKLSAgICAgICAgcmV0dXJuIExheW91dENvZGU7Ci0gICAgfSBlbHNlIGlmKG5hbWUgPT0gKGNvbnN0IGNoYXIqKSgiTGluayIpKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRMaW5rOwotICAgIH0gZWxzZSBpZihuYW1lID09IChjb25zdCBjaGFyKikoIkFubm90IikpIHsKLSAgICAgICAgcmV0dXJuIExheW91dEFubm90OwotICAgIH0gZWxzZSBpZihuYW1lID09IChjb25zdCBjaGFyKikoIlJ1YnkiKSkgewotICAgICAgICByZXR1cm4gTGF5b3V0UnVieTsKLSAgICB9IGVsc2UgaWYobmFtZSA9PSAoY29uc3QgY2hhciopKCJSQiIpKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRSdWJ5QmFzZTsKLSAgICB9IGVsc2UgaWYobmFtZSA9PSAoY29uc3QgY2hhciopKCJSVCIpKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRSdWJ5QW5ub3Q7Ci0gICAgfSBlbHNlIGlmKG5hbWUgPT0gKGNvbnN0IGNoYXIqKSgiUlAiKSkgewotICAgICAgICByZXR1cm4gTGF5b3V0UnVieVB1bmM7Ci0gICAgfSBlbHNlIGlmKG5hbWUgPT0gKGNvbnN0IGNoYXIqKSgiV2FyaWNodSIpKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRXYXJpY2h1OwotICAgIH0gZWxzZSBpZihuYW1lID09IChjb25zdCBjaGFyKikoIldUIikpIHsKLSAgICAgICAgcmV0dXJuIExheW91dFdhcmljaHVUZXh0OwotICAgIH0gZWxzZSBpZihuYW1lID09IChjb25zdCBjaGFyKikoIldQIikpIHsKLSAgICAgICAgcmV0dXJuIExheW91dFdhcmljaHVQdW5jOwotICAgIH0gZWxzZSBpZihuYW1lID09IChjb25zdCBjaGFyKikoIkZpZ3VyZSIpKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRGaWd1cmU7Ci0gICAgfSBlbHNlIGlmKG5hbWUgPT0gKGNvbnN0IGNoYXIqKSgiRm9ybXVsYSIpKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRGb3JtdWxhOwotICAgIH0gZWxzZSBpZihuYW1lID09IChjb25zdCBjaGFyKikoIkZvcm0iKSkgewotICAgICAgICByZXR1cm4gTGF5b3V0Rm9ybTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gTGF5b3V0VW5rbm93bjsKLSAgICB9Ci19Ci1DRlhfQnl0ZVN0cmluZ0MgQ1BERl9MYXlvdXRFbGVtZW50OjpDb252ZXJ0TGF5b3V0VHlwZShMYXlvdXRUeXBlIHR5cGUpCi17Ci0gICAgRlhfQlNUUiBuYW1lID0gIiI7Ci0gICAgaWYodHlwZSA9PSBMYXlvdXRBcmlmYWN0KSB7Ci0gICAgICAgIHJldHVybiAiQXJpZmFjdCI7Ci0gICAgfSBlbHNlIGlmKCB0eXBlID09IExheW91dERvY3VtZW50KSB7Ci0gICAgICAgIHJldHVybiAiRG9jdW1lbnQiOwotICAgIH0gZWxzZSBpZiggdHlwZSA9PSBMYXlvdXRQYXJ0KSB7Ci0gICAgICAgIHJldHVybiAiUGFydCI7Ci0gICAgfSBlbHNlIGlmKCB0eXBlID09IExheW91dEFydCkgewotICAgICAgICByZXR1cm4gIkFydCI7Ci0gICAgfSBlbHNlIGlmKCB0eXBlID09IExheW91dFNlY3QpIHsKLSAgICAgICAgcmV0dXJuICJTZWN0IjsKLSAgICB9IGVsc2UgaWYoIHR5cGUgPT0gTGF5b3V0RGl2KSB7Ci0gICAgICAgIHJldHVybiAiRGl2IjsKLSAgICB9IGVsc2UgaWYoIHR5cGUgPT0gTGF5b3V0QmxvY2tRdW90ZSkgewotICAgICAgICByZXR1cm4gIkJsb2NrUXVvdGUiOwotICAgIH0gZWxzZSBpZiggdHlwZSA9PSBMYXlvdXRDYXB0aW9uKSB7Ci0gICAgICAgIHJldHVybiAiQ2FwdGlvbiI7Ci0gICAgfSBlbHNlIGlmKCB0eXBlID09IExheW91dFRPQykgewotICAgICAgICByZXR1cm4gIlRPQyI7Ci0gICAgfSBlbHNlIGlmKCB0eXBlID09IExheW91dFRPQ0kpIHsKLSAgICAgICAgcmV0dXJuICJUT0NJIjsKLSAgICB9IGVsc2UgaWYoIHR5cGUgPT0gTGF5b3V0SW5kZXgpIHsKLSAgICAgICAgcmV0dXJuICJJbmRleCI7Ci0gICAgfSBlbHNlIGlmKCB0eXBlID09IExheW91dE5vblN0cnVjdCkgewotICAgICAgICByZXR1cm4gIk5vblN0cnVjdCI7Ci0gICAgfSBlbHNlIGlmKCB0eXBlID09IExheW91dFByaXZhdGUpIHsKLSAgICAgICAgcmV0dXJuICJQcml2YXRlIjsKLSAgICB9IGVsc2UgaWYoIHR5cGUgPT0gTGF5b3V0UGFyYWdyYXBoKSB7Ci0gICAgICAgIHJldHVybiAiUCI7Ci0gICAgfSBlbHNlIGlmKCB0eXBlID09IExheW91dEhlYWRpbmcpIHsKLSAgICAgICAgcmV0dXJuICJIIjsKLSAgICB9IGVsc2UgaWYoIHR5cGUgPT0gTGF5b3V0SGVhZGluZzEpIHsKLSAgICAgICAgcmV0dXJuICJIMSI7Ci0gICAgfSBlbHNlIGlmKCB0eXBlID09IExheW91dEhlYWRpbmcyKSB7Ci0gICAgICAgIHJldHVybiAiSDIiOwotICAgIH0gZWxzZSBpZiggdHlwZSA9PSBMYXlvdXRIZWFkaW5nMykgewotICAgICAgICByZXR1cm4gIkgzIjsKLSAgICB9IGVsc2UgaWYoIHR5cGUgPT0gTGF5b3V0SGVhZGluZzQpIHsKLSAgICAgICAgcmV0dXJuICJINCI7Ci0gICAgfSBlbHNlIGlmKCB0eXBlID09IExheW91dEhlYWRpbmc1KSB7Ci0gICAgICAgIHJldHVybiAiSDUiOwotICAgIH0gZWxzZSBpZiggdHlwZSA9PSBMYXlvdXRIZWFkaW5nNikgewotICAgICAgICByZXR1cm4gIkg2IjsKLSAgICB9IGVsc2UgaWYoIHR5cGUgPT0gTGF5b3V0TGlzdCkgewotICAgICAgICByZXR1cm4gIkwiOwotICAgIH0gZWxzZSBpZiggdHlwZSA9PSBMYXlvdXRMaXN0SXRlbSkgewotICAgICAgICByZXR1cm4gIkxJIjsKLSAgICB9IGVsc2UgaWYoIHR5cGUgPT0gTGF5b3V0TGlzdExhYmVsKSB7Ci0gICAgICAgIHJldHVybiAiTGJsIjsKLSAgICB9IGVsc2UgaWYoIHR5cGUgPT0gTGF5b3V0TGlzdEJvZHkpIHsKLSAgICAgICAgcmV0dXJuICJMQm9keSI7Ci0gICAgfSBlbHNlIGlmKCB0eXBlID09IExheW91dFRhYmxlKSB7Ci0gICAgICAgIHJldHVybiAiVGFibGUiOwotICAgIH0gZWxzZSBpZiggdHlwZSA9PSBMYXlvdXRUYWJsZVJvdykgewotICAgICAgICByZXR1cm4gIlRSIjsKLSAgICB9IGVsc2UgaWYoIHR5cGUgPT0gTGF5b3V0VGFibGVIZWFkZXJDZWxsKSB7Ci0gICAgICAgIHJldHVybiAiVEgiOwotICAgIH0gZWxzZSBpZiggdHlwZSA9PSBMYXlvdXRUYWJsZURhdGFDZWxsKSB7Ci0gICAgICAgIHJldHVybiAiVEQiOwotICAgIH0gZWxzZSBpZiggdHlwZSA9PSBMYXlvdXRUYWJsZUhlYWRlckdyb3VwKSB7Ci0gICAgICAgIHJldHVybiAiVEhlYWQiOwotICAgIH0gZWxzZSBpZiggdHlwZSA9PSBMYXlvdXRUYWJsZUJvZHlHcm91cCkgewotICAgICAgICByZXR1cm4gIlRCb2R5IjsKLSAgICB9IGVsc2UgaWYoIHR5cGUgPT0gTGF5b3V0VGFibGVGb290R3JvdXApIHsKLSAgICAgICAgcmV0dXJuICJURm9vdCI7Ci0gICAgfSBlbHNlIGlmKCB0eXBlID09IExheW91dFNwYW4pIHsKLSAgICAgICAgcmV0dXJuICJTcGFuIjsKLSAgICB9IGVsc2UgaWYoIHR5cGUgPT0gTGF5b3V0UXVvdGUpIHsKLSAgICAgICAgcmV0dXJuICJRdW90ZSI7Ci0gICAgfSBlbHNlIGlmKCB0eXBlID09IExheW91dE5vdGUpIHsKLSAgICAgICAgcmV0dXJuICJOb3RlIjsKLSAgICB9IGVsc2UgaWYoIHR5cGUgPT0gTGF5b3V0UmVmZXJlbmNlKSB7Ci0gICAgICAgIHJldHVybiAiUmVmZXJlbmNlIjsKLSAgICB9IGVsc2UgaWYoIHR5cGUgPT0gTGF5b3V0QmliRW50cnkpIHsKLSAgICAgICAgcmV0dXJuICJCaWJFbnRyeSI7Ci0gICAgfSBlbHNlIGlmKCB0eXBlID09IExheW91dENvZGUpIHsKLSAgICAgICAgcmV0dXJuICJDb2RlIjsKLSAgICB9IGVsc2UgaWYoIHR5cGUgPT0gTGF5b3V0TGluaykgewotICAgICAgICByZXR1cm4gIkxpbmsiOwotICAgIH0gZWxzZSBpZiggdHlwZSA9PSBMYXlvdXRBbm5vdCkgewotICAgICAgICByZXR1cm4gIkFubm90IjsKLSAgICB9IGVsc2UgaWYoIHR5cGUgPT0gTGF5b3V0UnVieSkgewotICAgICAgICByZXR1cm4gIlJ1YnkiOwotICAgIH0gZWxzZSBpZiggdHlwZSA9PSBMYXlvdXRSdWJ5QmFzZSkgewotICAgICAgICByZXR1cm4gIlJCIjsKLSAgICB9IGVsc2UgaWYoIHR5cGUgPT0gTGF5b3V0UnVieUFubm90KSB7Ci0gICAgICAgIHJldHVybiAiUlQiOwotICAgIH0gZWxzZSBpZiggdHlwZSA9PSBMYXlvdXRSdWJ5UHVuYykgewotICAgICAgICByZXR1cm4gIlJQIjsKLSAgICB9IGVsc2UgaWYoIHR5cGUgPT0gTGF5b3V0V2FyaWNodSkgewotICAgICAgICByZXR1cm4gIldhcmljaHUiOwotICAgIH0gZWxzZSBpZiggdHlwZSA9PSBMYXlvdXRXYXJpY2h1VGV4dCkgewotICAgICAgICByZXR1cm4gIldUIjsKLSAgICB9IGVsc2UgaWYoIHR5cGUgPT0gTGF5b3V0V2FyaWNodVB1bmMpIHsKLSAgICAgICAgcmV0dXJuICJXUCI7Ci0gICAgfSBlbHNlIGlmKCB0eXBlID09IExheW91dEZpZ3VyZSkgewotICAgICAgICByZXR1cm4gIkZpZ3VyZSI7Ci0gICAgfSBlbHNlIGlmKCB0eXBlID09IExheW91dEZvcm11bGEpIHsKLSAgICAgICAgcmV0dXJuICJGb3JtdWxhIjsKLSAgICB9IGVsc2UgaWYoIHR5cGUgPT0gTGF5b3V0Rm9ybSkgewotICAgICAgICByZXR1cm4gIkZvcm0iOwotICAgIH0KLSAgICByZXR1cm4gbmFtZTsKLX0KLUNGWF9CeXRlU3RyaW5nQyBDUERGX0xheW91dEVsZW1lbnQ6OkNvbnZlcnRMYXlvdXRBdHRyKExheW91dEF0dHIgYXR0cikKLXsKLSAgICBzd2l0Y2goYXR0cikgewotICAgICAgICBjYXNlIExheW91dEFydGlmYWN0VHlwZToKLSAgICAgICAgICAgIHJldHVybiAiVHlwZSI7Ci0gICAgICAgIGNhc2UgTGF5b3V0QXJ0aWZhY3RBdHRhY2hlZDoKLSAgICAgICAgICAgIHJldHVybiAiQXR0YWNoZWQiOwotICAgICAgICBjYXNlIExheW91dEFydGlmYWN0U3ViVHlwZToKLSAgICAgICAgICAgIHJldHVybiAiU3VidHlwZSI7Ci0gICAgICAgIGNhc2UgTGF5b3V0UGxhY2VtZW50OgotICAgICAgICAgICAgcmV0dXJuICJQbGFjZW1lbnQiOwotICAgICAgICBjYXNlIExheW91dFdyaXRpbmdNb2RlOgotICAgICAgICAgICAgcmV0dXJuICJXcml0aW5nTW9kZSI7Ci0gICAgICAgIGNhc2UgTGF5b3V0QmFja2dyb3VuZENvbG9yOgotICAgICAgICAgICAgcmV0dXJuICJCYWNrZ3JvdW5kQ29sb3IiOwotICAgICAgICBjYXNlIExheW91dEJvcmRlckNvbG9yOgotICAgICAgICAgICAgcmV0dXJuICJCb3JkZXJDb2xvciI7Ci0gICAgICAgIGNhc2UgTGF5b3V0Qm9yZGVyU3R5bGU6Ci0gICAgICAgICAgICByZXR1cm4gIkJvcmRlclN0eWxlIjsKLSAgICAgICAgY2FzZSBMYXlvdXRCb3JkZXJUaGlja25lc3M6Ci0gICAgICAgICAgICByZXR1cm4gIkJvcmRlclRoaWNrbmVzcyI7Ci0gICAgICAgIGNhc2UgTGF5b3V0UGFkZGluZzoKLSAgICAgICAgICAgIHJldHVybiAiUGFkZGluZyI7Ci0gICAgICAgIGNhc2UgTGF5b3V0Q29sb3I6Ci0gICAgICAgICAgICByZXR1cm4gIkNvbG9yIjsKLSAgICAgICAgY2FzZSBMYXlvdXRTcGFjZUJlZm9yZToKLSAgICAgICAgICAgIHJldHVybiAiU3BhY2VCZWZvcmUiOwotICAgICAgICBjYXNlIExheW91dFNwYWNlQWZ0ZXI6Ci0gICAgICAgICAgICByZXR1cm4gIlNwYWNlQWZ0ZXIiOwotICAgICAgICBjYXNlIExheW91dFN0YXJ0SW5kZW50OgotICAgICAgICAgICAgcmV0dXJuICJTdGFydEluZGVudCI7Ci0gICAgICAgIGNhc2UgTGF5b3V0RW5kSW5kZW50OgotICAgICAgICAgICAgcmV0dXJuICJFbmRJbmRlbnQiOwotICAgICAgICBjYXNlIExheW91dFRleHRJbmRlbnQ6Ci0gICAgICAgICAgICByZXR1cm4gIlRleHRJbmRlbnQiOwotICAgICAgICBjYXNlIExheW91dFRleHRBbGlnbjoKLSAgICAgICAgICAgIHJldHVybiAiVGV4dEFsaWduIjsKLSAgICAgICAgY2FzZSBMYXlvdXRCQm94OgotICAgICAgICAgICAgcmV0dXJuICJCQm94IjsKLSAgICAgICAgY2FzZSBMYXlvdXRXaWR0aDoKLSAgICAgICAgICAgIHJldHVybiAiV2lkdGgiOwotICAgICAgICBjYXNlIExheW91dEhlaWdodDoKLSAgICAgICAgICAgIHJldHVybiAiSGVpZ2h0IjsKLSAgICAgICAgY2FzZSBMYXlvdXRCbG9ja0FsaWduOgotICAgICAgICAgICAgcmV0dXJuICJCbG9ja0FsaWduIjsKLSAgICAgICAgY2FzZSBMYXlvdXRJbmxpbmVBbGlnbjoKLSAgICAgICAgICAgIHJldHVybiAiSW5saW5lQWxpZ24iOwotICAgICAgICBjYXNlIExheW91dFRCb3JkZXJTdHlsZToKLSAgICAgICAgICAgIHJldHVybiAiVEJvcmRlclN0eWxlIjsKLSAgICAgICAgY2FzZSBMYXlvdXRUUGFkZGluZzoKLSAgICAgICAgICAgIHJldHVybiAiVFBhZGRpbmciOwotICAgICAgICBjYXNlIExheW91dEJhc2VsaW5lU2hpZnQ6Ci0gICAgICAgICAgICByZXR1cm4gIkJhc2VsaW5lU2hpZnQiOwotICAgICAgICBjYXNlIExheW91dExpbmVIZWlnaHQ6Ci0gICAgICAgICAgICByZXR1cm4gIkxpbmVIZWlnaHQiOwotICAgICAgICBjYXNlIExheW91dFRleHREZWNvcmF0aW9uQ29sb3I6Ci0gICAgICAgICAgICByZXR1cm4gIlRleHREZWNvcmF0aW9uQ29sb3IiOwotICAgICAgICBjYXNlIExheW91dFRleHREZWNvcmF0aW9uVGhpY2tuZXNzOgotICAgICAgICAgICAgcmV0dXJuICJUZXh0RGVjb3JhdGlvblRoaWNrbmVzcyI7Ci0gICAgICAgIGNhc2UgTGF5b3V0VGV4dERlY29yYXRpb25UeXBlOgotICAgICAgICAgICAgcmV0dXJuICJUZXh0RGVjb3JhdGlvblR5cGUiOwotICAgICAgICBjYXNlIExheW91dFJ1YnlBbGlnbjoKLSAgICAgICAgICAgIHJldHVybiAiUnVieUFsaWduIjsKLSAgICAgICAgY2FzZSBMYXlvdXRSdWJ5UG9zaXRpb246Ci0gICAgICAgICAgICByZXR1cm4gIlJ1YnlQb3NpdGlvbiI7Ci0gICAgICAgIGNhc2UgTGF5b3V0R2x5cGhPcmllbnRhdGlvblZlcnRpY2FsOgotICAgICAgICAgICAgcmV0dXJuICJHbHlwaE9yaWVudGF0aW9uVmVydGljYWwiOwotICAgICAgICBjYXNlIExheW91dENvbHVtbkNvdW50OgotICAgICAgICAgICAgcmV0dXJuICJDb2x1bW5Db3VudCI7Ci0gICAgICAgIGNhc2UgTGF5b3V0Q29sdW1uR2FwOgotICAgICAgICAgICAgcmV0dXJuICJDb2x1bW5HYXAiOwotICAgICAgICBjYXNlIExheW91dENvbHVtbldpZHRoczoKLSAgICAgICAgICAgIHJldHVybiAiQ29sdW1uV2lkdGhzIjsKLSAgICAgICAgY2FzZSBMYXlvdXRMaXN0TnVtYmVyaW5nOgotICAgICAgICAgICAgcmV0dXJuICJMaXN0TnVtYmVyaW5nIjsKLSAgICAgICAgY2FzZSBMYXlvdXRGaWVsZFJvbGU6Ci0gICAgICAgICAgICByZXR1cm4gIlJvbGUiOwotICAgICAgICBjYXNlIExheW91dEZpZWxkQ2hlY2tlZDoKLSAgICAgICAgICAgIHJldHVybiAiY2hlY2tlZCI7Ci0gICAgICAgIGNhc2UgTGF5b3V0RmllbGREZXNjOgotICAgICAgICAgICAgcmV0dXJuICJEZXNjIjsKLSAgICAgICAgY2FzZSBMYXlvdXRSb3dTcGFuOgotICAgICAgICAgICAgcmV0dXJuICJSb3dTcGFuIjsKLSAgICAgICAgY2FzZSBMYXlvdXRDb2xTcGFuOgotICAgICAgICAgICAgcmV0dXJuICJDb2xTcGFuIjsKLSAgICAgICAgY2FzZSBMYXlvdXRUYWJsZUhlYWRlcnM6Ci0gICAgICAgICAgICByZXR1cm4gIkhlYWRlcnMiOwotICAgICAgICBjYXNlIExheW91dFRhYmxlSGVhZGVyU2NvcGU6Ci0gICAgICAgICAgICByZXR1cm4gIlNjb3BlIjsKLSAgICAgICAgY2FzZSBMYXlvdXRUYWJsZVN1bW1hcnk6Ci0gICAgICAgICAgICByZXR1cm4gIlN1bW1hcnkiOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgIH0KLX0KLUxheW91dEVudW0gQ1BERl9MYXlvdXRFbGVtZW50OjpDb252ZXJ0TGF5b3V0RW51bShDRlhfQnl0ZVN0cmluZ0MgRW51bSkKLXsKLSAgICBpZihFbnVtID09ICJCbG9jayIpIHsKLSAgICAgICAgcmV0dXJuIExheW91dEJsb2NrOwotICAgIH0gZWxzZSBpZiAoRW51bSA9PSAiSW5saW5lIikgewotICAgICAgICByZXR1cm4gTGF5b3V0SW5saW5lOwotICAgIH0gZWxzZSBpZiAoRW51bSA9PSAiQmVmb3JlIikgewotICAgICAgICByZXR1cm4gTGF5b3V0QmVmb3JlOwotICAgIH0gZWxzZSBpZiAoRW51bSA9PSAiU3RhcnQiKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRTdGFydDsKLSAgICB9IGVsc2UgaWYgKEVudW0gPT0gIkVuZCIpIHsKLSAgICAgICAgcmV0dXJuIExheW91dEVuZDsKLSAgICB9IGVsc2UgaWYgKEVudW0gPT0gIkxyVGIiKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRMclRiOwotICAgIH0gZWxzZSBpZiAoRW51bSA9PSAiUmxUYiIpIHsKLSAgICAgICAgcmV0dXJuIExheW91dFJsVGI7Ci0gICAgfSBlbHNlIGlmIChFbnVtID09ICJUYlJsIikgewotICAgICAgICByZXR1cm4gTGF5b3V0VGJSbDsKLSAgICB9IGVsc2UgaWYgKEVudW0gPT0gIk5vbmUiKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXROb25lOwotICAgIH0gZWxzZSBpZiAoRW51bSA9PSAiSGlkZGVuIikgewotICAgICAgICByZXR1cm4gTGF5b3V0SGlkZGVuOwotICAgIH0gZWxzZSBpZiAoRW51bSA9PSAiRG90dGVkIikgewotICAgICAgICByZXR1cm4gTGF5b3V0RG90dGVkOwotICAgIH0gZWxzZSBpZiAoRW51bSA9PSAiRGFzaGVkIikgewotICAgICAgICByZXR1cm4gTGF5b3V0RGFzaGVkOwotICAgIH0gZWxzZSBpZiAoRW51bSA9PSAiU29saWQiKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRTb2xpZDsKLSAgICB9IGVsc2UgaWYgKEVudW0gPT0gIkRvdWJsZSIpIHsKLSAgICAgICAgcmV0dXJuIExheW91dERvdWJsZTsKLSAgICB9IGVsc2UgaWYgKEVudW0gPT0gIkdyb292ZSIpIHsKLSAgICAgICAgcmV0dXJuIExheW91dEdyb292ZTsKLSAgICB9IGVsc2UgaWYgKEVudW0gPT0gIlJpZGdlIikgewotICAgICAgICByZXR1cm4gTGF5b3V0UmlkZ2U7Ci0gICAgfSBlbHNlIGlmIChFbnVtID09ICJJbnNldCIpIHsKLSAgICAgICAgcmV0dXJuIExheW91dEluc2V0OwotICAgIH0gZWxzZSBpZiAoRW51bSA9PSAiT3V0c2V0IikgewotICAgICAgICByZXR1cm4gTGF5b3V0T3V0c2V0OwotICAgIH0gZWxzZSBpZiAoRW51bSA9PSAiTm9ybWFsIikgewotICAgICAgICByZXR1cm4gTGF5b3V0Tm9ybWFsOwotICAgIH0gZWxzZSBpZiAoRW51bSA9PSAiQXV0byIpIHsKLSAgICAgICAgcmV0dXJuIExheW91dEF1dG87Ci0gICAgfSBlbHNlIGlmIChFbnVtID09ICJDZW50ZXIiKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRDZW50ZXI7Ci0gICAgfSBlbHNlIGlmIChFbnVtID09ICJKdXN0aWZ5IikgewotICAgICAgICByZXR1cm4gTGF5b3V0SnVzdGlmeTsKLSAgICB9IGVsc2UgaWYgKEVudW0gPT0gIk1pZGRsZSIpIHsKLSAgICAgICAgcmV0dXJuIExheW91dE1pZGRsZTsKLSAgICB9IGVsc2UgaWYgKEVudW0gPT0gIlVuZGVybGluZSIpIHsKLSAgICAgICAgcmV0dXJuIExheW91dFVuZGVybGluZTsKLSAgICB9IGVsc2UgaWYgKEVudW0gPT0gIk92ZXJsaW5lIikgewotICAgICAgICByZXR1cm4gTGF5b3V0T3ZlcmxpbmU7Ci0gICAgfSBlbHNlIGlmIChFbnVtID09ICJMaW5lVGhyb3VnaCIpIHsKLSAgICAgICAgcmV0dXJuIExheW91dExpbmVUaHJvdWdoOwotICAgIH0gZWxzZSBpZiAoRW51bSA9PSAiRGlzdHJpYnV0ZSIpIHsKLSAgICAgICAgcmV0dXJuIExheW91dERpc3RyaWJ1dGU7Ci0gICAgfSBlbHNlIGlmIChFbnVtID09ICJEaXNjIikgewotICAgICAgICByZXR1cm4gTGF5b3V0RGlzYzsKLSAgICB9IGVsc2UgaWYgKEVudW0gPT0gIkNpcmNsZSIpIHsKLSAgICAgICAgcmV0dXJuIExheW91dENpcmNsZTsKLSAgICB9IGVsc2UgaWYgKEVudW0gPT0gIlNxdWFyZSIpIHsKLSAgICAgICAgcmV0dXJuIExheW91dFNxdWFyZTsKLSAgICB9IGVsc2UgaWYgKEVudW0gPT0gIkRlY2ltYWwiKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXREZWNpbWFsOwotICAgIH0gZWxzZSBpZiAoRW51bSA9PSAiVXBwZXJSb21hbiIpIHsKLSAgICAgICAgcmV0dXJuIExheW91dFVwcGVyUm9tYW47Ci0gICAgfSBlbHNlIGlmIChFbnVtID09ICJMb3dlclJvbWFuIikgewotICAgICAgICByZXR1cm4gTGF5b3V0TG93ZXJSb21hbjsKLSAgICB9IGVsc2UgaWYgKEVudW0gPT0gIlVwcGVyQWxwaGEiKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRVcHBlckFscGhhOwotICAgIH0gZWxzZSBpZiAoRW51bSA9PSAiTG93ZXJBbHBoYSIpIHsKLSAgICAgICAgcmV0dXJuIExheW91dExvd2VyQWxwaGE7Ci0gICAgfSBlbHNlIGlmIChFbnVtID09ICJyYiIpIHsKLSAgICAgICAgcmV0dXJuIExheW91dFJCOwotICAgIH0gZWxzZSBpZiAoRW51bSA9PSAiY2IiKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRDQjsKLSAgICB9IGVsc2UgaWYgKEVudW0gPT0gInBiIikgewotICAgICAgICByZXR1cm4gTGF5b3V0UEI7Ci0gICAgfSBlbHNlIGlmIChFbnVtID09ICJ0diIpIHsKLSAgICAgICAgcmV0dXJuIExheW91dFRWOwotICAgIH0gZWxzZSBpZiAoRW51bSA9PSAib24iKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRPbjsKLSAgICB9IGVsc2UgaWYgKEVudW0gPT0gIm9mZiIpIHsKLSAgICAgICAgcmV0dXJuIExheW91dE9mZjsKLSAgICB9IGVsc2UgaWYgKEVudW0gPT0gIm5ldXRyYWwiKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXROZXV0cmFsOwotICAgIH0gZWxzZSBpZiAoRW51bSA9PSAiUm93IikgewotICAgICAgICByZXR1cm4gTGF5b3V0Um93OwotICAgIH0gZWxzZSBpZiAoRW51bSA9PSAiQ29sdW1uIikgewotICAgICAgICByZXR1cm4gTGF5b3V0Q29sdW1uOwotICAgIH0gZWxzZSBpZiAoRW51bSA9PSAiQm90aCIpIHsKLSAgICAgICAgcmV0dXJuIExheW91dEJvdGg7Ci0gICAgfSBlbHNlIGlmIChFbnVtID09ICJMZWZ0IikgewotICAgICAgICByZXR1cm4gTGF5b3V0TGVmdDsKLSAgICB9IGVsc2UgaWYgKEVudW0gPT0gIlRvcCIpIHsKLSAgICAgICAgcmV0dXJuIExheW91dFRvcDsKLSAgICB9IGVsc2UgaWYgKEVudW0gPT0gIkJvdHRvbSIpIHsKLSAgICAgICAgcmV0dXJuIExheW91dEJvdHRvbTsKLSAgICB9IGVsc2UgaWYgKEVudW0gPT0gIlJpZ2h0IikgewotICAgICAgICByZXR1cm4gTGF5b3V0UmlnaHQ7Ci0gICAgfSBlbHNlIGlmIChFbnVtID09ICJQYWdpbmF0aW9uIikgewotICAgICAgICByZXR1cm4gTGF5b3V0UGFnaW5hdGlvbjsKLSAgICB9IGVsc2UgaWYgKEVudW0gPT0gIkxheW91dCIpIHsKLSAgICAgICAgcmV0dXJuIExheW91dExheW91dDsKLSAgICB9IGVsc2UgaWYgKEVudW0gPT0gIlBhZ2UiKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRQYWdlOwotICAgIH0gZWxzZSBpZiAoRW51bSA9PSAiQmFja2dyb3VuZCIpIHsKLSAgICAgICAgcmV0dXJuIExheW91dEJhY2tncm91bmQ7Ci0gICAgfSBlbHNlIGlmIChFbnVtID09ICJIZWFkZXIiKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRIZWFkZXI7Ci0gICAgfSBlbHNlIGlmIChFbnVtID09ICJGb290ZXIiKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRGb290ZXI7Ci0gICAgfSBlbHNlIGlmIChFbnVtID09ICJXYXRlcm1hcmsiKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRXYXRlcm1hcms7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIExheW91dEludmFsaWQ7Ci0gICAgfQotfQotTGF5b3V0VHlwZSBDUERGX0xheW91dEVsZW1lbnQ6OkdldFR5cGUoKQotewotICAgIGlmKCFtX3BUYWdnZWRFbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRVbmtub3duOwotICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gbV9wVGFnZ2VkRWxlbWVudC0+R2V0VHlwZSgpOwotICAgIHJldHVybiB0aGlzLT5Db252ZXJ0TGF5b3V0VHlwZShuYW1lKTsKLX0KLWludAlDUERGX0xheW91dEVsZW1lbnQ6OkNvdW50QXR0clZhbHVlcyhMYXlvdXRBdHRyIGF0dHJfdHlwZSkKLXsKLSAgICBpZighbV9wVGFnZ2VkRWxlbWVudCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgQ1BERl9PYmplY3QqIHBPYmogPSBtX3BUYWdnZWRFbGVtZW50LT5HZXRBdHRyKEdldEF0dHJPd25lcihhdHRyX3R5cGUpLCBDb252ZXJ0TGF5b3V0QXR0cihhdHRyX3R5cGUpLCBJc0luaGVyaXRhYmxlKGF0dHJfdHlwZSkpOwotICAgIGlmKHBPYmopIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotTGF5b3V0RW51bSBDUERGX0xheW91dEVsZW1lbnQ6OkdldEVudW1BdHRyKExheW91dEF0dHIgYXR0cl90eXBlLCBpbnQgaW5kZXgpCi17Ci0gICAgaWYoIW1fcFRhZ2dlZEVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIExheW91dEludmFsaWQ7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nQyBvd25lciA9IEdldEF0dHJPd25lcihhdHRyX3R5cGUpOwotICAgIENGWF9CeXRlU3RyaW5nQyBkZWZhdWx0X3ZhbHVlID0gR2V0RGVmYXVsdE5hbWVWYWx1ZShhdHRyX3R5cGUpOwotICAgIENGWF9CeXRlU3RyaW5nQyBBdHRyTmFtZSA9IENvbnZlcnRMYXlvdXRBdHRyKGF0dHJfdHlwZSk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcJQXR0clZhbHVlID0gbV9wVGFnZ2VkRWxlbWVudC0+R2V0TmFtZShvd25lciwgQXR0ck5hbWUsIGRlZmF1bHRfdmFsdWUsIElzSW5oZXJpdGFibGUoYXR0cl90eXBlKSwgaW5kZXgpOwotICAgIHJldHVybiBDb252ZXJ0TGF5b3V0RW51bShBdHRyVmFsdWUpOwotfQotQ0ZYX0J5dGVTdHJpbmdDIENQREZfTGF5b3V0RWxlbWVudDo6R2V0QXR0ck93bmVyKExheW91dEF0dHIgYXR0cl90eXBlKQotewotICAgIHN3aXRjaChhdHRyX3R5cGUpIHsKLSAgICAgICAgY2FzZSBMYXlvdXRMaXN0TnVtYmVyaW5nOgotICAgICAgICAgICAgcmV0dXJuICJMaXN0IjsKLSAgICAgICAgY2FzZSBMYXlvdXRGaWVsZFJvbGU6Ci0gICAgICAgIGNhc2UgTGF5b3V0RmllbGRDaGVja2VkIDoKLSAgICAgICAgY2FzZSBMYXlvdXRGaWVsZERlc2M6Ci0gICAgICAgICAgICByZXR1cm4gIlByaW50RmllbGQiOwotICAgICAgICBjYXNlIExheW91dFJvd1NwYW46Ci0gICAgICAgIGNhc2UgTGF5b3V0Q29sU3BhbjoKLSAgICAgICAgY2FzZSBMYXlvdXRUYWJsZUhlYWRlcnM6Ci0gICAgICAgIGNhc2UgTGF5b3V0VGFibGVIZWFkZXJTY29wZToKLSAgICAgICAgY2FzZSBMYXlvdXRUYWJsZVN1bW1hcnk6Ci0gICAgICAgICAgICByZXR1cm4gIlRhYmxlIjsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiAiTGF5b3V0IjsKLSAgICB9Ci19Ci1GWF9GTE9BVAlDUERGX0xheW91dEVsZW1lbnQ6OkdldE51bWJlckF0dHIoTGF5b3V0QXR0ciBhdHRyX3R5cGUsIGludCBpbmRleCkKLXsKLSAgICBpZighbV9wVGFnZ2VkRWxlbWVudCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmdDIG93bmVyID0gR2V0QXR0ck93bmVyKGF0dHJfdHlwZSk7Ci0gICAgRlhfRkxPQVQgZGVmYXVsdF92YWx1ZSA9IEdldERlZmF1bHRGbG9hdFZhbHVlKGF0dHJfdHlwZSk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmdDIEF0dHJOYW1lID0gQ29udmVydExheW91dEF0dHIoYXR0cl90eXBlKTsKLSAgICBGWF9GTE9BVCBmID0gbV9wVGFnZ2VkRWxlbWVudC0+R2V0TnVtYmVyKG93bmVyLCBBdHRyTmFtZSwgZGVmYXVsdF92YWx1ZSwgSXNJbmhlcml0YWJsZShhdHRyX3R5cGUpLCBpbmRleCk7Ci0gICAgaWYoYXR0cl90eXBlID09IExheW91dFdpZHRoICYmICFmKSB7Ci0gICAgICAgIGYgPSBtX3BUYWdnZWRFbGVtZW50LT5HZXROdW1iZXIoIlRhYmxlIiwgQXR0ck5hbWUsIGRlZmF1bHRfdmFsdWUsIElzSW5oZXJpdGFibGUoYXR0cl90eXBlKSwgaW5kZXgpOwotICAgIH0KLSAgICByZXR1cm4gZjsKLX0KLUZYX0NPTE9SUkVGCUNQREZfTGF5b3V0RWxlbWVudDo6R2V0Q29sb3JBdHRyKExheW91dEF0dHIgYXR0cl90eXBlLCBpbnQgaW5kZXgpCi17Ci0gICAgaWYoIW1fcFRhZ2dlZEVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENGWF9CeXRlU3RyaW5nQyBvd25lciA9IEdldEF0dHJPd25lcihhdHRyX3R5cGUpOwotICAgIEZYX0NPTE9SUkVGIGRlZmF1bHRfdmFsdWUgPSBHZXREZWZhdWx0Q29sb3JWYWx1ZShhdHRyX3R5cGUpOwotICAgIENGWF9CeXRlU3RyaW5nQyBBdHRyTmFtZSA9IENvbnZlcnRMYXlvdXRBdHRyKGF0dHJfdHlwZSk7Ci0gICAgRlhfQVJHQiBmID0gbV9wVGFnZ2VkRWxlbWVudC0+R2V0Q29sb3Iob3duZXIsIEF0dHJOYW1lLCBkZWZhdWx0X3ZhbHVlLCBJc0luaGVyaXRhYmxlKGF0dHJfdHlwZSksIGluZGV4KTsKLSAgICByZXR1cm4gZjsKLX0KLUZYX0ZMT0FUIENQREZfTGF5b3V0RWxlbWVudDo6R2V0RGVmYXVsdEZsb2F0VmFsdWUoTGF5b3V0QXR0ciBhdHRyX3R5cGUpCi17Ci0gICAgc3dpdGNoKGF0dHJfdHlwZSkgewotICAgICAgICBjYXNlIExheW91dENvbHVtbkNvdW50OgotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIGNhc2UgTGF5b3V0Um93U3BhbjoKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICBjYXNlIExheW91dENvbFNwYW46Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLUZYX0NPTE9SUkVGIENQREZfTGF5b3V0RWxlbWVudDo6R2V0RGVmYXVsdENvbG9yVmFsdWUoTGF5b3V0QXR0ciBhdHRyX3R5cGUpCi17Ci0gICAgcmV0dXJuIC0xOwotfQotQ0ZYX0J5dGVTdHJpbmdDIENQREZfTGF5b3V0RWxlbWVudDo6R2V0RGVmYXVsdE5hbWVWYWx1ZShMYXlvdXRBdHRyIGF0dHJfdHlwZSkKLXsKLSAgICBzd2l0Y2goYXR0cl90eXBlKSB7Ci0gICAgICAgIGNhc2UgTGF5b3V0UGxhY2VtZW50OgotICAgICAgICAgICAgcmV0dXJuICJJbmxpbmUiOwotICAgICAgICBjYXNlIExheW91dFdyaXRpbmdNb2RlOgotICAgICAgICAgICAgcmV0dXJuICJMclRiIjsKLSAgICAgICAgY2FzZSBMYXlvdXRCb3JkZXJTdHlsZToKLSAgICAgICAgICAgIHJldHVybiAiTm9uZSI7Ci0gICAgICAgIGNhc2UgTGF5b3V0VGV4dEFsaWduOgotICAgICAgICAgICAgcmV0dXJuICJTdGFydCI7Ci0gICAgICAgIGNhc2UgTGF5b3V0QmxvY2tBbGlnbjoKLSAgICAgICAgICAgIHJldHVybiAiQmVmb3JlIjsKLSAgICAgICAgY2FzZSBMYXlvdXRJbmxpbmVBbGlnbjoKLSAgICAgICAgICAgIHJldHVybiAiU3RhcnQiOwotICAgICAgICBjYXNlIExheW91dFRCb3JkZXJTdHlsZToKLSAgICAgICAgICAgIHJldHVybiAiTm9uZSI7Ci0gICAgICAgIGNhc2UgTGF5b3V0VGV4dERlY29yYXRpb25UeXBlOgotICAgICAgICAgICAgcmV0dXJuICJOb25lIjsKLSAgICAgICAgY2FzZSBMYXlvdXRSdWJ5QWxpZ246Ci0gICAgICAgICAgICByZXR1cm4gIkRpc3RyaWJ1dGUiOwotICAgICAgICBjYXNlIExheW91dFJ1YnlQb3NpdGlvbjoKLSAgICAgICAgICAgIHJldHVybiAiQmVmb3JlIjsKLSAgICAgICAgY2FzZSBMYXlvdXRHbHlwaE9yaWVudGF0aW9uVmVydGljYWw6Ci0gICAgICAgICAgICByZXR1cm4gIkF1dG8iOwotICAgICAgICBjYXNlIExheW91dExpc3ROdW1iZXJpbmc6Ci0gICAgICAgICAgICByZXR1cm4gIk5vbmUiOwotICAgICAgICBjYXNlIExheW91dEZpZWxkUm9sZToKLSAgICAgICAgICAgIHJldHVybiAiTm9uZSI7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgfQotfQotRlhfQk9PTAlDUERGX0xheW91dEVsZW1lbnQ6OklzSW5oZXJpdGFibGUoTGF5b3V0QXR0ciB0eXBlKQotewotICAgIHN3aXRjaCh0eXBlKSB7Ci0gICAgICAgIGNhc2UgTGF5b3V0V3JpdGluZ01vZGU6Ci0gICAgICAgIGNhc2UgTGF5b3V0VGV4dEFsaWduOgotICAgICAgICBjYXNlIExheW91dEJsb2NrQWxpZ246Ci0gICAgICAgIGNhc2UgTGF5b3V0SW5saW5lQWxpZ246Ci0gICAgICAgIGNhc2UgTGF5b3V0TGluZUhlaWdodDoKLSAgICAgICAgY2FzZSBMYXlvdXRHbHlwaE9yaWVudGF0aW9uVmVydGljYWw6Ci0gICAgICAgIGNhc2UgTGF5b3V0UnVieUFsaWduOgotICAgICAgICBjYXNlIExheW91dFJ1YnlQb3NpdGlvbjoKLSAgICAgICAgY2FzZSBMYXlvdXRCb3JkZXJUaGlja25lc3M6Ci0gICAgICAgIGNhc2UgTGF5b3V0U3RhcnRJbmRlbnQ6Ci0gICAgICAgIGNhc2UgTGF5b3V0RW5kSW5kZW50OgotICAgICAgICBjYXNlIExheW91dFRleHRJbmRlbnQ6Ci0gICAgICAgIGNhc2UgTGF5b3V0VFBhZGRpbmc6Ci0gICAgICAgIGNhc2UgTGF5b3V0VGV4dERlY29yYXRpb25UaGlja25lc3M6Ci0gICAgICAgIGNhc2UgTGF5b3V0Qm9yZGVyQ29sb3I6Ci0gICAgICAgIGNhc2UgTGF5b3V0Q29sb3I6Ci0gICAgICAgIGNhc2UgTGF5b3V0VGV4dERlY29yYXRpb25Db2xvcjoKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLX0KLWludAlDUERGX0xheW91dEVsZW1lbnQ6OkNvdW50Q2hpbGRyZW4oKQotewotICAgIHJldHVybiBtX0NoaWxkQXJyYXkuR2V0U2l6ZSgpOwotfQotSVBERl9MYXlvdXRFbGVtZW50KiBDUERGX0xheW91dEVsZW1lbnQ6OkdldENoaWxkKGludCBpbmRleCkKLXsKLSAgICByZXR1cm4gKElQREZfTGF5b3V0RWxlbWVudCopbV9DaGlsZEFycmF5LkdldEF0KGluZGV4KTsKLX0KLUlQREZfTGF5b3V0RWxlbWVudCogQ1BERl9MYXlvdXRFbGVtZW50OjpHZXRQYXJlbnQoKQotewotICAgIHJldHVybiBtX3BQYXJlbnRFbGVtZW50OwotfQotaW50CUNQREZfTGF5b3V0RWxlbWVudDo6Q291bnRPYmplY3RzKCkKLXsKLSAgICBpZihtX3BUYWdnZWRFbGVtZW50ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENGWF9QdHJBcnJheSogcE9iaiA9ICZtX09iakFycmF5OwotICAgIGludCBzaXplID0gcE9iai0+R2V0U2l6ZSgpOwotICAgIHJldHVybiBzaXplOwotfQotQ1BERl9QYWdlT2JqZWN0KiBDUERGX0xheW91dEVsZW1lbnQ6OkdldE9iamVjdChpbnQgaW5kZXgpCi17Ci0gICAgaWYobV9wVGFnZ2VkRWxlbWVudCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBDRlhfUHRyQXJyYXkgKnBPYmogPSAmbV9PYmpBcnJheTsKLSAgICBpbnQgc2l6ZSA9IHBPYmotPkdldFNpemUoKTsKLSAgICBpZihpbmRleCA8IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIChDUERGX1BhZ2VPYmplY3QqKXBPYmotPkdldEF0KGluZGV4KTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci1GWF9CT09MIENQREZfTGF5b3V0RWxlbWVudDo6QWRkT2JqZWN0KENQREZfUGFnZU9iamVjdCogcE9iaikKLXsKLSAgICByZXR1cm4gbV9PYmpBcnJheS5BZGQocE9iaik7Ci19Ci1JUERGX0xheW91dFByb3ZpZGVyKiBJUERGX0xheW91dFByb3ZpZGVyOjpDcmVhdGVfTGF5b3V0UHJvdmlkZXJfVGFnZ2VkUERGKENQREZfUGFnZU9iamVjdHMqIHBQYWdlKQotewotICAgIGlmKHBQYWdlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIENQREZfTGF5b3V0UHJvdmlkZXJfVGFnZ2VkUERGKiBwUHJvdmlkZXIgPSBuZXcgQ1BERl9MYXlvdXRQcm92aWRlcl9UYWdnZWRQREY7Ci0gICAgcFByb3ZpZGVyLT5Jbml0KHBQYWdlKTsKLSAgICByZXR1cm4gcFByb3ZpZGVyOwotfQotQ1BERl9MYXlvdXRQcm92aWRlcl9UYWdnZWRQREY6OkNQREZfTGF5b3V0UHJvdmlkZXJfVGFnZ2VkUERGKCkKLXsKLSAgICBtX3BQYXVzZSA9IE5VTEw7Ci0gICAgbV9wUm9vdCA9IE5VTEw7Ci0gICAgbV9wUGFnZVRyZWUgPSBOVUxMOwotICAgIG1fcEN1clRhZ2dlZEVsZW1lbnQgPSBOVUxMOwotfQotQ1BERl9MYXlvdXRQcm92aWRlcl9UYWdnZWRQREY6On5DUERGX0xheW91dFByb3ZpZGVyX1RhZ2dlZFBERigpCi17Ci0gICAgbV9wQ3VyVGFnZ2VkRWxlbWVudCA9IE5VTEw7Ci0gICAgbV9wUGF1c2UgPSBOVUxMOwotICAgIGlmKG1fcFJvb3QpIHsKLSAgICAgICAgZGVsZXRlIG1fcFJvb3Q7Ci0gICAgfQotICAgIG1fcFJvb3QgPSBOVUxMOwotICAgIGlmKG1fcFBhZ2VUcmVlKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BQYWdlVHJlZTsKLSAgICB9Ci0gICAgbV9wUGFnZVRyZWUgPSBOVUxMOwotfQotdm9pZCBDUERGX0xheW91dFByb3ZpZGVyX1RhZ2dlZFBERjo6UHJvY2Vzc0VsZW1lbnQoQ1BERl9MYXlvdXRFbGVtZW50KnBQYXJlbnQsIENQREZfU3RydWN0RWxlbWVudCogcFRhZ2dlZEVsZW1lbnQpCi17Ci0gICAgaWYoIXBUYWdnZWRFbGVtZW50KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYoIXBQYXJlbnQpIHsKLSAgICAgICAgbV9TdGF0dXMgPSBMYXlvdXRFcnJvcjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDUERGX0xheW91dEVsZW1lbnQqIHBFbGVtZW50ID0gbmV3IENQREZfTGF5b3V0RWxlbWVudDsKLSAgICBwRWxlbWVudC0+bV9wUGFyZW50RWxlbWVudCA9IHBQYXJlbnQ7Ci0gICAgcEVsZW1lbnQtPm1fcFRhZ2dlZEVsZW1lbnQgPSBwVGFnZ2VkRWxlbWVudDsKLSAgICBwUGFyZW50LT5tX0NoaWxkQXJyYXkuQWRkKHBFbGVtZW50KTsKLSAgICBpbnQgY291bnQgPSBwVGFnZ2VkRWxlbWVudC0+Q291bnRLaWRzKCk7Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgQ1BERl9TdHJ1Y3RLaWQgS2lkID0gcFRhZ2dlZEVsZW1lbnQtPkdldEtpZChpKTsKLSAgICAgICAgc3dpdGNoKEtpZC5tX1R5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgQ1BERl9TdHJ1Y3RLaWQ6OkVsZW1lbnQ6IHsKLSAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc0VsZW1lbnQocEVsZW1lbnQsIEtpZC5tX0VsZW1lbnQubV9wRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKG1fU3RhdHVzICE9IExheW91dFJlYWR5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDUERGX1N0cnVjdEtpZDo6UGFnZUNvbnRlbnQ6IHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gbV9wUGFnZS0+Q291bnRPYmplY3RzKCk7Ci0gICAgICAgICAgICAgICAgICAgIEZYX1BPU0lUSU9OIHBvcyA9IG1fcFBhZ2UtPkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoIXBvcykgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9TdGF0dXMgPSBMYXlvdXRFcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBvcykgewotICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwT2JqID0gbV9wUGFnZS0+R2V0TmV4dE9iamVjdChwb3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBiak1DSUQgPSBwT2JqLT5tX0NvbnRlbnRNYXJrLkdldE1DSUQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKChGWF9EV09SRCkocE9iai0+bV9Db250ZW50TWFyay5HZXRNQ0lEKCkpID09IEtpZC5tX1BhZ2VDb250ZW50Lm1fQ29udGVudElkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVsZW1lbnQtPkFkZE9iamVjdChwT2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1BERl9TdHJ1Y3RLaWQ6OlN0cmVhbUNvbnRlbnQ6Ci0gICAgICAgICAgICBjYXNlIENQREZfU3RydWN0S2lkOjpPYmplY3Q6Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotfQotTGF5b3V0U3RhdHVzIENQREZfTGF5b3V0UHJvdmlkZXJfVGFnZ2VkUERGOjpTdGFydExvYWQoSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgbV9wUGF1c2UgPSBwUGF1c2U7Ci0gICAgaWYobV9wUGFnZS0+bV9wRG9jdW1lbnQgJiYgbV9wUGFnZS0+bV9wRm9ybURpY3QpIHsKLSAgICAgICAgbV9wUGFnZVRyZWUgPSBDUERGX1N0cnVjdFRyZWU6OkxvYWRQYWdlKG1fcFBhZ2UtPm1fcERvY3VtZW50LCBtX3BQYWdlLT5tX3BGb3JtRGljdCk7Ci0gICAgfQotICAgIGlmKCFtX3BQYWdlVHJlZSkgewotICAgICAgICBtX1N0YXR1cyA9IExheW91dEVycm9yOwotICAgICAgICByZXR1cm4gTGF5b3V0RXJyb3I7Ci0gICAgfQotICAgIGludCBjb3VudCA9IG1fcFBhZ2VUcmVlLT5Db3VudFRvcEVsZW1lbnRzKCk7Ci0gICAgaWYoY291bnQgPT0gMCkgewotICAgICAgICBtX1N0YXR1cyA9IExheW91dEVycm9yOwotICAgICAgICByZXR1cm4gTGF5b3V0RXJyb3I7Ci0gICAgfQotICAgIG1fcFJvb3QgPSBuZXcgQ1BERl9MYXlvdXRFbGVtZW50OwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIENQREZfU3RydWN0RWxlbWVudCogcEVsZW1lbnQgPSBtX3BQYWdlVHJlZS0+R2V0VG9wRWxlbWVudChpKTsKLSAgICAgICAgaWYocEVsZW1lbnQpIHsKLSAgICAgICAgICAgIFByb2Nlc3NFbGVtZW50KG1fcFJvb3QsIHBFbGVtZW50KTsKLSAgICAgICAgICAgIGlmKG1fU3RhdHVzICE9IExheW91dFJlYWR5KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1fU3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIG1fcEN1clRhZ2dlZEVsZW1lbnQgPSBOVUxMOwotICAgIG1fU3RhdHVzID0gTGF5b3V0RmluaXNoZWQ7Ci0gICAgcmV0dXJuIExheW91dEZpbmlzaGVkOwotfQotTGF5b3V0U3RhdHVzIENQREZfTGF5b3V0UHJvdmlkZXJfVGFnZ2VkUERGOjpDb250aW51ZSgpCi17Ci0gICAgaWYoIW1fcEN1clRhZ2dlZEVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIExheW91dEVycm9yOwotICAgIH0KLSAgICBpZihtX1N0YXR1cyAhPSBMYXlvdXRUb0JlQ29udGludWVkKSB7Ci0gICAgICAgIHJldHVybiBMYXlvdXRFcnJvcjsKLSAgICB9Ci0gICAgbV9TdGF0dXMgPSBMYXlvdXRSZWFkeTsKLSAgICBpbnQgY291bnQgPSBtX3BQYWdlVHJlZS0+Q291bnRUb3BFbGVtZW50cygpOwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIENQREZfU3RydWN0RWxlbWVudCogcEVsZW1lbnQgPSBtX3BQYWdlVHJlZS0+R2V0VG9wRWxlbWVudChpKTsKLSAgICAgICAgaWYocEVsZW1lbnQpIHsKLSAgICAgICAgICAgIFByb2Nlc3NFbGVtZW50KG1fcFJvb3QsIHBFbGVtZW50KTsKLSAgICAgICAgICAgIGlmKG1fU3RhdHVzICE9IExheW91dFJlYWR5KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1fU3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIG1fcEN1clRhZ2dlZEVsZW1lbnQgPSBOVUxMOwotICAgIG1fU3RhdHVzID0gTGF5b3V0RmluaXNoZWQ7Ci0gICAgcmV0dXJuIExheW91dEZpbmlzaGVkOwotfQotaW50IENQREZfTGF5b3V0UHJvdmlkZXJfVGFnZ2VkUERGOjpHZXRQb3NpdGlvbigpCi17Ci0gICAgaWYobV9Ub3BFbGVtZW50SW5kZXggPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW50IGNvdW50ID0gbV9wUGFnZVRyZWUtPkNvdW50VG9wRWxlbWVudHMoKTsKLSAgICByZXR1cm4gbV9Ub3BFbGVtZW50SW5kZXggLyBjb3VudCAqIDEwMDsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL3JlZmxvdy9sYXlvdXRwcm92aWRlcl90YWdnZWRwZGYuaCBiL2NvcmUvc3JjL3JlZmxvdy9sYXlvdXRwcm92aWRlcl90YWdnZWRwZGYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxMWYxNy4uMDAwMDAwMAotLS0gYS9jb3JlL3NyYy9yZWZsb3cvbGF5b3V0cHJvdmlkZXJfdGFnZ2VkcGRmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfU1JDX1JFRkxPV19MQVlPVVRQUk9WSURFUl9UQUdHRURQREZfSF8KLSNkZWZpbmUgQ09SRV9TUkNfUkVGTE9XX0xBWU9VVFBST1ZJREVSX1RBR0dFRFBERl9IXwotCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9yZWZsb3cvcmVmbG93ZW5naW5lLmgiCi0KLWNsYXNzIENQREZfTGF5b3V0RWxlbWVudCA6IHB1YmxpYyBJUERGX0xheW91dEVsZW1lbnQKLXsKLXB1YmxpYzoKLSAgICBDUERGX0xheW91dEVsZW1lbnQoKTsKLSAgICB+Q1BERl9MYXlvdXRFbGVtZW50KCk7Ci0KLSAgICBMYXlvdXRUeXBlCUdldFR5cGUoKTsKLSAgICB2b2lkCUdldFJlY3QoQ0ZYX0Zsb2F0UmVjdCYgcmNSZWN0KSB7fTsKLQotICAgIGludAkJQ291bnRBdHRyVmFsdWVzKExheW91dEF0dHIgYXR0cl90eXBlKTsKLQotICAgIExheW91dEVudW0JR2V0RW51bUF0dHIoTGF5b3V0QXR0ciBhdHRyX3R5cGUsIGludCBpbmRleCk7Ci0gICAgRlhfRkxPQVQJR2V0TnVtYmVyQXR0cihMYXlvdXRBdHRyIGF0dHJfdHlwZSwgaW50IGluZGV4KTsKLSAgICBGWF9DT0xPUlJFRglHZXRDb2xvckF0dHIoTGF5b3V0QXR0ciBhdHRyX3R5cGUsIGludCBpbmRleCk7Ci0KLSAgICBpbnQJCUNvdW50Q2hpbGRyZW4oKTsKLQotICAgIElQREZfTGF5b3V0RWxlbWVudCogR2V0Q2hpbGQoaW50IGluZGV4KTsKLQotICAgIElQREZfTGF5b3V0RWxlbWVudCogR2V0UGFyZW50KCk7Ci0KLSAgICBpbnQJQ291bnRPYmplY3RzKCk7Ci0gICAgQ1BERl9QYWdlT2JqZWN0KglHZXRPYmplY3QoaW50IGluZGV4KTsKLSAgICBGWF9CT09MIEFkZE9iamVjdChDUERGX1BhZ2VPYmplY3QqIHBPYmopOwotICAgIENQREZfU3RydWN0RWxlbWVudCogbV9wVGFnZ2VkRWxlbWVudDsKLSAgICBDUERGX0xheW91dEVsZW1lbnQqIG1fcFBhcmVudEVsZW1lbnQ7Ci0gICAgQ0ZYX1B0ckFycmF5CW1fQ2hpbGRBcnJheTsKLSAgICBMYXlvdXRUeXBlIENvbnZlcnRMYXlvdXRUeXBlKEZYX0JTVFIgbmFtZSk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmdDIENvbnZlcnRMYXlvdXRUeXBlKExheW91dFR5cGUgdHlwZSk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmdDIENvbnZlcnRMYXlvdXRBdHRyKExheW91dEF0dHIgYXR0cik7Ci0gICAgTGF5b3V0RW51bSBDb252ZXJ0TGF5b3V0RW51bShDRlhfQnl0ZVN0cmluZ0MgRW51bSk7Ci0KLXByb3RlY3RlZDoKLSAgICBGWF9CT09MCQlJc0luaGVyaXRhYmxlKExheW91dEF0dHIgYXR0cl90eXBlKTsKLSAgICBDRlhfQnl0ZVN0cmluZ0MgR2V0QXR0ck93bmVyKExheW91dEF0dHIgYXR0cl90eXBlKTsKLSAgICBDRlhfQnl0ZVN0cmluZ0MgR2V0RGVmYXVsdE5hbWVWYWx1ZShMYXlvdXRBdHRyIGF0dHJfdHlwZSk7Ci0gICAgRlhfRkxPQVQJCUdldERlZmF1bHRGbG9hdFZhbHVlKExheW91dEF0dHIgYXR0cl90eXBlKTsKLSAgICBGWF9DT0xPUlJFRgkJR2V0RGVmYXVsdENvbG9yVmFsdWUoTGF5b3V0QXR0ciBhdHRyX3R5cGUpOwotICAgIENGWF9QdHJBcnJheQltX09iakFycmF5OwotfTsKLWNsYXNzIENQREZfTGF5b3V0UHJvdmlkZXJfVGFnZ2VkUERGIDogcHVibGljIElQREZfTGF5b3V0UHJvdmlkZXIKLXsKLXB1YmxpYzoKLSAgICBDUERGX0xheW91dFByb3ZpZGVyX1RhZ2dlZFBERigpOwotICAgIH5DUERGX0xheW91dFByb3ZpZGVyX1RhZ2dlZFBERigpOwotICAgIHZvaWQJCQlTZXRMYXlvdXRQcm92aWRlclN0eWxlKExBWU9VVFBST1ZJREVSX1NUWUxFIHN0eWxlKSB7fTsKLQotICAgIHZvaWQJSW5pdChDUERGX1BhZ2VPYmplY3RzKiBwUGFnZSkKLSAgICB7Ci0gICAgICAgIG1fcFBhZ2UgPSBwUGFnZTsKLSAgICAgICAgbV9TdGF0dXMgPSBMYXlvdXRSZWFkeTsKLSAgICB9OwotCi0gICAgTGF5b3V0U3RhdHVzCVN0YXJ0TG9hZChJRlhfUGF1c2UqIHBQYXVzZSA9IE5VTEwpOwotICAgIExheW91dFN0YXR1cwlDb250aW51ZSgpOwotICAgIGludAkJIAkJR2V0UG9zaXRpb24oKTsKLQotICAgIElQREZfTGF5b3V0RWxlbWVudCogR2V0Um9vdCgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9wUm9vdDsKLSAgICB9OwotCi1wcm90ZWN0ZWQ6Ci0gICAgdm9pZCBQcm9jZXNzRWxlbWVudChDUERGX0xheW91dEVsZW1lbnQqcFBhcmVudCwgQ1BERl9TdHJ1Y3RFbGVtZW50KiBwVGFnZ2VkRWxlbWVudCk7Ci0gICAgTGF5b3V0U3RhdHVzCW1fU3RhdHVzOwotICAgIENQREZfU3RydWN0RWxlbWVudCogbV9wQ3VyVGFnZ2VkRWxlbWVudDsKLSAgICBDUERGX0xheW91dEVsZW1lbnQqIG1fcFJvb3Q7Ci0gICAgSUZYX1BhdXNlKgkJCW1fcFBhdXNlOwotICAgIENQREZfUGFnZU9iamVjdHMqCW1fcFBhZ2U7Ci0gICAgQ1BERl9TdHJ1Y3RUcmVlKgltX3BQYWdlVHJlZTsKLSAgICBpbnQJCQkJCW1fVG9wRWxlbWVudEluZGV4OwotfTsKLQotI2VuZGlmICAvLyBDT1JFX1NSQ19SRUZMT1dfTEFZT1VUUFJPVklERVJfVEFHR0VEUERGX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9yZWZsb3cvcmVmbG93ZWRwYWdlLmNwcCBiL2NvcmUvc3JjL3JlZmxvdy9yZWZsb3dlZHBhZ2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTI2NjdmLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL3JlZmxvdy9yZWZsb3dlZHBhZ2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjE3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3JlZmxvdy9yZWZsb3dlbmdpbmUuaCIKLSNpbmNsdWRlICJyZWZsb3dlZHBhZ2UuaCIKLUNQREZfUHJvZ3Jlc3NpdmVSZWZsb3dQYWdlUGFyc2VyOjpDUERGX1Byb2dyZXNzaXZlUmVmbG93UGFnZVBhcnNlcigpCi17Ci0gICAgbV9uT2JqUHJvY2Vzc2VkID0gMDsKLSAgICBtX3BSZWZsb3dFbmdpbmUgPSBOVUxMOwotICAgIG1fcFByb3ZpZGVyID0gTlVMTDsKLX0KLUNQREZfUHJvZ3Jlc3NpdmVSZWZsb3dQYWdlUGFyc2VyOjp+Q1BERl9Qcm9ncmVzc2l2ZVJlZmxvd1BhZ2VQYXJzZXIoKQotewotICAgIGlmKG1fcFByb3ZpZGVyKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BQcm92aWRlcjsKLSAgICB9Ci0gICAgbV9wUHJvdmlkZXIgPSBOVUxMOwotICAgIGlmKG1fcFJlZmxvd0VuZ2luZSkgewotICAgICAgICBkZWxldGUgbV9wUmVmbG93RW5naW5lOwotICAgIH0KLSAgICBtX3BSZWZsb3dFbmdpbmUgPSBOVUxMOwotfQotdm9pZCBDUERGX1Byb2dyZXNzaXZlUmVmbG93UGFnZVBhcnNlcjo6SW5pdCgpCi17Ci0gICAgbV9TdGF0dXMgPSBSZWFkeTsKLX0KLUNQREZfUmVmbG93ZWRQYWdlOjpDUERGX1JlZmxvd2VkUGFnZShDRlhfR3Jvd09ubHlQb29sKglwTWVtb3J5UG9vbCkKLXsKLSAgICBtX1BhZ2VXaWR0aCA9IDA7Ci0gICAgbV9QYWdlSGVpZ2h0ID0gMDsKLSAgICBtX2JXYWl0aW5nID0gVFJVRTsKLSAgICBpZihwTWVtb3J5UG9vbCkgewotICAgICAgICBtX3BNZW1vcnlQb29sID0gcE1lbW9yeVBvb2w7Ci0gICAgICAgIG1fYkNyZWF0ZU1lbW9yeVBvb2wgPSBGQUxTRTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX3BNZW1vcnlQb29sID0gbmV3IENGWF9Hcm93T25seVBvb2w7Ci0gICAgICAgIG1fYkNyZWF0ZU1lbW9yeVBvb2wgPSBUUlVFOwotICAgIH0KLSAgICBtX3BDaGFyU3RhdGUgPSBuZXcgQ1JGX0NoYXJTdGF0ZUFycmF5KDEwKTsKLSAgICBtX3BSZWZsb3dlZCA9IG5ldyBDUkZfRGF0YVB0ckFycmF5KDUwMCk7Ci0gICAgbV9wUGFnZUluZm9zID0gTlVMTDsKLX0KLUNQREZfUmVmbG93ZWRQYWdlOjp+Q1BERl9SZWZsb3dlZFBhZ2UoKQotewotICAgIGlmIChtX3BSZWZsb3dlZCkgewotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbV9wUmVmbG93ZWQtPkdldFNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBDUkZfRGF0YSogcERhdGEgPSAoKm1fcFJlZmxvd2VkKVtpXTsKLSAgICAgICAgICAgIGlmKHBEYXRhLT5tX1R5cGUgPT0gQ1JGX0RhdGE6OkltYWdlKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlICgoQ1JGX0ltYWdlRGF0YSopcERhdGEpLT5tX3BCaXRtYXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9wUmVmbG93ZWQtPlJlbW92ZUFsbCgpOwotICAgICAgICBkZWxldGUgbV9wUmVmbG93ZWQ7Ci0gICAgfQotICAgIG1fcFJlZmxvd2VkID0gTlVMTDsKLSAgICBpZiAobV9wQ2hhclN0YXRlKSB7Ci0gICAgICAgIG1fcENoYXJTdGF0ZS0+UmVtb3ZlQWxsKCk7Ci0gICAgICAgIGRlbGV0ZSBtX3BDaGFyU3RhdGU7Ci0gICAgfQotICAgIG1fcENoYXJTdGF0ZSA9IE5VTEw7Ci0gICAgaWYobV9iQ3JlYXRlTWVtb3J5UG9vbCAmJiBtX3BNZW1vcnlQb29sKSB7Ci0gICAgICAgIG1fcE1lbW9yeVBvb2wtPkZyZWVBbGwoKTsKLSAgICB9Ci0gICAgaWYgKG1fcE1lbW9yeVBvb2wpIHsKLSAgICAgICAgZGVsZXRlIG1fcE1lbW9yeVBvb2w7Ci0gICAgfQotICAgIG1fcE1lbW9yeVBvb2wgPSBOVUxMOwotICAgIG1fcFBERlBhZ2UgPSBOVUxMOwotICAgIGlmIChtX3BQYWdlSW5mb3MpIHsKLSAgICAgICAgUmVsZWFzZVBhZ2VPYmpzTWVtYmVyU2hpcCgpOwotICAgIH0KLX0KLUZYX0JPT0wgQ1BERl9SZWZsb3dlZFBhZ2U6OlJldGFpblBhZ2VPYmpzTWVtYmVyU2hpcCgpCi17Ci0gICAgaWYgKE5VTEwgPT0gbV9wUERGUGFnZSkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGlmIChOVUxMID09IG1fcFBhZ2VJbmZvcykgewotICAgICAgICBtX3BQYWdlSW5mb3MgPSBuZXcgQ0ZYX01hcFB0clRvUHRyKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIEZYX1BPU0lUSU9OCXBvcyA9IG1fcFBERlBhZ2UtPkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKTsKLSAgICBpZiAoIXBvcykJewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmogPSBOVUxMOwotICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgcFBhZ2VPYmogPSBtX3BQREZQYWdlLT5HZXROZXh0T2JqZWN0KHBvcyk7Ci0gICAgICAgIE1hcmtQYWdlT2JqTWVtYmVyU2hpcChwUGFnZU9iaiwgTlVMTCk7Ci0gICAgICAgIHBQYWdlT2JqID0gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci12b2lkIENQREZfUmVmbG93ZWRQYWdlOjpNYXJrUGFnZU9iak1lbWJlclNoaXAoQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBDUkZfUGFnZUluZm8qIHBQYXJlbnQpCi17Ci0gICAgaWYgKE5VTEwgPT0gbV9wUGFnZUluZm9zKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1JGX1BhZ2VJbmZvKiBwUGFnZUluZm8gPSBuZXcgQ1JGX1BhZ2VJbmZvKHBPYmosIHBQYXJlbnQpOwotICAgIG1fcFBhZ2VJbmZvcy0+U2V0QXQocE9iaiwgcFBhZ2VJbmZvKTsKLSAgICBpZiAoUERGUEFHRV9GT1JNICE9IHBPYmotPm1fVHlwZSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfRm9ybU9iamVjdCogcEZvcm1PYmogPSAoQ1BERl9Gb3JtT2JqZWN0KilwT2JqOwotICAgIEZYX1BPU0lUSU9OCXBvczsKLSAgICBwb3MgPSBwRm9ybU9iai0+bV9wRm9ybS0+R2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpOwotICAgIGlmICghcG9zKQl7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiA9IE5VTEw7Ci0gICAgd2hpbGUgKHBvcykgewotICAgICAgICBwUGFnZU9iaiA9IHBGb3JtT2JqLT5tX3BGb3JtLT5HZXROZXh0T2JqZWN0KHBvcyk7Ci0gICAgICAgIE1hcmtQYWdlT2JqTWVtYmVyU2hpcChwUGFnZU9iaiwgcFBhZ2VJbmZvKTsKLSAgICAgICAgcFBhZ2VPYmogPSBOVUxMOwotICAgIH0KLX0KLXZvaWQgQ1BERl9SZWZsb3dlZFBhZ2U6OlJlbGVhc2VQYWdlT2Jqc01lbWJlclNoaXAoKQotewotICAgIGlmIChOVUxMID09IG1fcFBhZ2VJbmZvcykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmogPSBOVUxMOwotICAgIENSRl9QYWdlSW5mbyogcFBhZ2VJbmZvID0gTlVMTDsKLSAgICBGWF9QT1NJVElPTiBwb3MgPSBtX3BQYWdlSW5mb3MtPkdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICB3aGlsZSAocG9zKSB7Ci0gICAgICAgIG1fcFBhZ2VJbmZvcy0+R2V0TmV4dEFzc29jKHBvcywgKHZvaWQqJilwUGFnZU9iaiwgKHZvaWQqJilwUGFnZUluZm8pOwotICAgICAgICBkZWxldGUgcFBhZ2VJbmZvOwotICAgIH0KLSAgICBtX3BQYWdlSW5mb3MtPlJlbW92ZUFsbCgpOwotICAgIGRlbGV0ZSBtX3BQYWdlSW5mb3M7Ci0gICAgbV9wUGFnZUluZm9zID0gTlVMTDsKLX0KLUNQREZfRGljdGlvbmFyeSogQ1BERl9SZWZsb3dlZFBhZ2U6OkdldEZvcm1SZXNEaWN0KENQREZfUGFnZU9iamVjdCogcE9iaikKLXsKLSAgICBpZiAoTlVMTCA9PSBtX3BQYWdlSW5mb3MpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChGQUxTRSA9PSBSZXRhaW5QYWdlT2Jqc01lbWJlclNoaXAoKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ1JGX1BhZ2VJbmZvKiBwUGFnZUluZm8gPSAoQ1JGX1BhZ2VJbmZvKiltX3BQYWdlSW5mb3MtPkdldFZhbHVlQXQocE9iaik7Ci0gICAgaWYgKE5VTEwgPT0gcFBhZ2VJbmZvKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gcFBhZ2VJbmZvLT5HZXRGb3JtRGljdCgpOwotfQotdm9pZCBDUERGX1JlZmxvd2VkUGFnZTo6R2V0RGlzcGxheU1hdHJpeChDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgsIEZYX0lOVDMyIHhQb3MsIEZYX0lOVDMyIHlQb3MsIEZYX0lOVDMyIHhTaXplLCBGWF9JTlQzMiB5U2l6ZSwgRlhfSU5UMzIgaVJvdGF0ZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFBhZ2VNYXRyaXgpCi17Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBkaXNwbGF5X21hdHJpeDsKLSAgICBpZihtX1BhZ2VIZWlnaHQgPT0gMCkgewotICAgICAgICBtYXRyaXguU2V0KDEsIDAsIDAsIC0xLCAwLCAwKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBGWF9JTlQzMiB4MCwgeTAsIHgxLCB5MSwgeDIsIHkyOwotICAgIGlSb3RhdGUgJT0gNDsKLSAgICBzd2l0Y2ggKGlSb3RhdGUpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgeDAgPSB4UG9zOwotICAgICAgICAgICAgeTAgPSB5UG9zOwotICAgICAgICAgICAgeDEgPSB4UG9zOwotICAgICAgICAgICAgeTEgPSB5UG9zICsgeVNpemU7Ci0gICAgICAgICAgICB4MiA9IHhQb3MgKyB4U2l6ZTsKLSAgICAgICAgICAgIHkyID0geVBvczsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICB4MCA9IHhQb3M7Ci0gICAgICAgICAgICB5MCA9IHlTaXplICsgeVBvczsKLSAgICAgICAgICAgIHgxID0gIHhQb3MgKyB4U2l6ZTsKLSAgICAgICAgICAgIHkxID0geVBvcyArIHlTaXplOwotICAgICAgICAgICAgeDIgPSB4UG9zOwotICAgICAgICAgICAgeTIgPSB5UG9zOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHgwID0geFNpemUgKyB4UG9zOwotICAgICAgICAgICAgeTAgPSB5U2l6ZSArIHlQb3M7Ci0gICAgICAgICAgICB4MSA9IHhTaXplICsgeFBvcyA7Ci0gICAgICAgICAgICB5MSA9IHlQb3M7Ci0gICAgICAgICAgICB4MiA9IHhQb3M7Ci0gICAgICAgICAgICB5MiA9ICB5U2l6ZSArIHlQb3M7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgeDAgPSB4UG9zICsgeFNpemU7Ci0gICAgICAgICAgICB5MCA9IHlQb3M7Ci0gICAgICAgICAgICB4MSA9IHhQb3M7Ci0gICAgICAgICAgICB5MSA9IHlQb3M7Ci0gICAgICAgICAgICB4MiA9IHhQb3MgKyB4U2l6ZTsKLSAgICAgICAgICAgIHkyID0geVBvcyArIHlTaXplOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRpc3BsYXlfbWF0cml4LlNldChGWFNZU19EaXYoKEZYX0ZMT0FUKSh4MiAtIHgwKSwgbV9QYWdlV2lkdGgpLAotICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19EaXYoKEZYX0ZMT0FUKSh5MiAtIHkwKSwgbV9QYWdlV2lkdGgpLAotICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19EaXYoKEZYX0ZMT0FUKSh4MSAtIHgwKSwgbV9QYWdlSGVpZ2h0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfRGl2KChGWF9GTE9BVCkoeTEgLSB5MCksIG1fUGFnZUhlaWdodCksCi0gICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCkoeDApLCAoRlhfRkxPQVQpKHkwKSk7Ci0gICAgbWF0cml4LlNldCgxLjBmLCAwLjBmLCAwLjBmLCAtMS4wZiwgMC4wZiwgMC4wZik7Ci0gICAgbWF0cml4LkNvbmNhdChkaXNwbGF5X21hdHJpeCk7Ci0gICAgcmV0dXJuOwotfQotRlhfRkxPQVQgQ1BERl9SZWZsb3dlZFBhZ2U6OkdldFBhZ2VIZWlnaHQoKQotewotICAgIHJldHVybiBtX1BhZ2VIZWlnaHQ7Ci19Ci12b2lkIENQREZfUmVmbG93ZWRQYWdlOjpGb2N1c0dldERhdGEoY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXgsIEZYX0lOVDMyIHgsIEZYX0lOVDMyIHksIENGWF9CeXRlU3RyaW5nJiBzdHIpCi17Ci0gICAgaWYgKE5VTEwgPT0gbV9wUmVmbG93ZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDRlhfQWZmaW5lTWF0cml4IHJldk1hdHJpeDsKLSAgICByZXZNYXRyaXguU2V0UmV2ZXJzZShtYXRyaXgpOwotICAgIEZYX0ZMT0FUIHgxLCB5MTsKLSAgICByZXZNYXRyaXguVHJhbnNmb3JtKChmbG9hdCl4LCAoZmxvYXQpeSwgeDEsIHkxKTsKLSAgICBpbnQgY291bnQgPSBtX3BSZWZsb3dlZC0+R2V0U2l6ZSgpOwotICAgIEZYX0ZMT0FUIGR4ID0gMTAwMCwgZHkgPSAxMDAwOwotICAgIEZYX0lOVDMyIHBvcyA9IDA7Ci0gICAgRlhfSU5UMzIgaTsKLSAgICBmb3IoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIENSRl9EYXRhKiBwRGF0YSA9ICgqbV9wUmVmbG93ZWQpW2ldOwotICAgICAgICBGWF9GTE9BVCB0ZW1wZHkgPSBGWFNZU19mYWJzKHBEYXRhLT5tX1Bvc1kgLSB5MSk7Ci0gICAgICAgIGlmKEZYU1lTX2ZhYnModGVtcGR5IC0gZHkpIDwgMSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0ICgwLCBwRGF0YS0+bV9Qb3NZICsgcERhdGEtPm1fSGVpZ2h0LCB0aGlzLT5tX1BhZ2VXaWR0aCwgcERhdGEtPm1fUG9zWSk7Ci0gICAgICAgIGlmKHJlY3QuQ29udGFpbnMoeDEsIHkxKSkgewotICAgICAgICAgICAgcG9zID0gaTsKLSAgICAgICAgICAgIGR4ID0gMDsKLSAgICAgICAgICAgIGR5ID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgaWYodGVtcGR5IDwgZHkpIHsKLSAgICAgICAgICAgIGR5ID0gdGVtcGR5OwotICAgICAgICAgICAgZHggPSBGWFNZU19mYWJzKHBEYXRhLT5tX1Bvc1ggLSB4MSk7Ci0gICAgICAgICAgICBwb3MgPSBpOwotICAgICAgICB9IGVsc2UgaWYgKHRlbXBkeSA9PSBkeSkgewotICAgICAgICAgICAgRlhfRkxPQVQgdGVtcGR4ID0gRlhTWVNfZmFicyhwRGF0YS0+bV9Qb3NYIC0geDEpOwotICAgICAgICAgICAgaWYodGVtcGR4IDwgZHgpIHsKLSAgICAgICAgICAgICAgICBkeCA9IHRlbXBkeDsKLSAgICAgICAgICAgICAgICBwb3MgPSBpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHRlbXBkeSA+IGR5KSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZihkeCAhPSAwIHx8IGR5ICE9IDApIHsKLSAgICAgICAgY291bnQgPSBjb3VudCA8IChwb3MgKyAxMCkgPyBjb3VudCA6IChwb3MgKyAxMCk7Ci0gICAgICAgIGZvcihpID0gMCA+IChwb3MgLSAxMCkgPyAwIDogKHBvcyAtIDEwKTsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIENSRl9EYXRhKiBwRGF0YSA9ICgqbV9wUmVmbG93ZWQpW2ldOwotICAgICAgICAgICAgRlhfRkxPQVQgdGVtcGR5ID0gRlhTWVNfZmFicyhwRGF0YS0+bV9Qb3NZIC0geTEpOwotICAgICAgICAgICAgaWYodGVtcGR5IDwgZHkpIHsKLSAgICAgICAgICAgICAgICBkeSA9IHRlbXBkeTsKLSAgICAgICAgICAgICAgICBkeCA9IEZYU1lTX2ZhYnMocERhdGEtPm1fUG9zWCAtIHgxKTsKLSAgICAgICAgICAgICAgICBwb3MgPSBpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0ZW1wZHkgPT0gZHkpIHsKLSAgICAgICAgICAgICAgICBGWF9GTE9BVCB0ZW1wZHggPSBGWFNZU19mYWJzKHBEYXRhLT5tX1Bvc1ggLSB4MSk7Ci0gICAgICAgICAgICAgICAgaWYodGVtcGR4IDwgZHgpIHsKLSAgICAgICAgICAgICAgICAgICAgZHggPSB0ZW1wZHg7Ci0gICAgICAgICAgICAgICAgICAgIHBvcyA9IGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHN0ci5Gb3JtYXQoIiVkIiwgcG9zKTsKLX0KLUZYX0JPT0wgQ1BERl9SZWZsb3dlZFBhZ2U6OkZvY3VzR2V0UG9zaXRpb24oY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXgsIENGWF9CeXRlU3RyaW5nIHN0ciwgRlhfSU5UMzImIHgsIEZYX0lOVDMyJiB5KQotewotICAgIGlmIChOVUxMID09IG1fcFJlZmxvd2VkKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgRlhfSU5UMzIgcG9zID0gRlhTWVNfYXRvaShzdHIpOwotICAgIGlmKHBvcyA8IDAgfHwgcG9zID49IG1fcFJlZmxvd2VkLT5HZXRTaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDUkZfRGF0YSogcERhdGEgPSAoKm1fcFJlZmxvd2VkKVtwb3NdOwotICAgIEZYX0ZMT0FUIHgxLCB5MTsKLSAgICBtYXRyaXguVHJhbnNmb3JtKHBEYXRhLT5tX1Bvc1gsIHBEYXRhLT5tX1Bvc1kgKyBwRGF0YS0+bV9IZWlnaHQsIHgxLCB5MSk7Ci0gICAgeCA9IChpbnQpeDE7Ci0gICAgeSA9IChpbnQpeTE7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1pbnQgQ1BERl9Qcm9ncmVzc2l2ZVJlZmxvd1BhZ2VQYXJzZXI6OkdldFBvc2l0aW9uKCkKLXsKLSAgICBpZighbV9wUHJvdmlkZXIpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmKCFtX3BSZWZsb3dFbmdpbmUpIHsKLSAgICAgICAgcmV0dXJuIG1fcFByb3ZpZGVyLT5HZXRQb3NpdGlvbigpIC8gMjsKLSAgICB9Ci0gICAgcmV0dXJuIG1fcFByb3ZpZGVyLT5HZXRQb3NpdGlvbigpIC8gMiArIG1fcFJlZmxvd0VuZ2luZS0+R2V0UG9zaXRpb24oKSAvIDI7Ci19Ci12b2lkIENQREZfUHJvZ3Jlc3NpdmVSZWZsb3dQYWdlUGFyc2VyOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkKLXsKLSAgICBpZiAoTlVMTCA9PSBtX3BSZWZsb3dQYWdlKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYobV9TdGF0dXMgIT0gVG9CZUNvbnRpbnVlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fcFBhdXNlID0gcFBhdXNlOwotICAgIGlmKG1fcFJlZmxvd0VuZ2luZSkgewotICAgICAgICBpZihtX3BSZWZsb3dFbmdpbmUtPkNvbnRpbnVlKCkgIT0gTGF5b3V0VG9CZUNvbnRpbnVlZCkgewotICAgICAgICAgICAgbV9TdGF0dXMgPSBEb25lOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYobV9wUHJvdmlkZXItPkNvbnRpbnVlKCkgPT0gTGF5b3V0RmluaXNoZWQpIHsKLSAgICAgICAgICAgIG1fcFJlZmxvd0VuZ2luZSA9IElQREZfTGF5b3V0UHJvY2Vzc29yOjpDcmVhdGVfTGF5b3V0UHJvY2Vzc29yX1JlZmxvdyhtX1RvcEluZGVudCwgbV9SZWZsb3dlZFdpZHRoLCBtX2ZTY3JlZW5IZWlnaHQsIG1fcFJlZmxvd1BhZ2UsIG1fZmxhZ3MsIG1fUGFyc2VTdHlsZS5tX0xpbmVTcGFjZSk7Ci0gICAgICAgICAgICBDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKLSAgICAgICAgICAgIG1fcFBERlBhZ2UtPkdldERpc3BsYXlNYXRyaXgobWF0cml4LCAwLCAwLCAoaW50KShtX3BQREZQYWdlLT5HZXRQYWdlV2lkdGgoKSksIChpbnQpKG1fcFBERlBhZ2UtPkdldFBhZ2VIZWlnaHQoKSksIDApOwotICAgICAgICAgICAgaWYobV9wUmVmbG93RW5naW5lLT5TdGFydFByb2Nlc3MobV9wUHJvdmlkZXItPkdldFJvb3QoKSwgbV9wUGF1c2UsICZtYXRyaXgpICE9IExheW91dFRvQmVDb250aW51ZWQpIHsKLSAgICAgICAgICAgICAgICBtX1N0YXR1cyA9IERvbmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYobV9Ub3BJbmRlbnQgJiYgbV9TdGF0dXMgPT0gRG9uZSkgewotICAgICAgICBtX3BSZWZsb3dQYWdlLT5tX1BhZ2VIZWlnaHQgLT0gbV9Ub3BJbmRlbnQ7Ci0gICAgfQotfQotdm9pZCBDUERGX1Byb2dyZXNzaXZlUmVmbG93UGFnZVBhcnNlcjo6Q2xlYXIoKQotewotICAgIHRoaXMtPkluaXQoKTsKLSAgICByZXR1cm47Ci19Ci1GWF9CT09MIElQREZfUHJvZ3Jlc3NpdmVSZWZsb3dQYWdlUGFyc2VyOjpJc1RhZ2dlZFBhZ2UoQ1BERl9QYWdlT2JqZWN0cypwUGFnZSkKLXsKLSAgICBpZighcFBhZ2UpIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDUERGX1N0cnVjdFRyZWUqIHBQYWdlVHJlZSA9IENQREZfU3RydWN0VHJlZTo6TG9hZFBhZ2UocFBhZ2UtPm1fcERvY3VtZW50LCBwUGFnZS0+bV9wRm9ybURpY3QpOwotICAgIGlmKHBQYWdlVHJlZSkgewotICAgICAgICBpbnQgY291bnQgPSBwUGFnZVRyZWUtPkNvdW50VG9wRWxlbWVudHMoKTsKLSAgICAgICAgaWYoY291bnQpIHsKLSAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQ1BERl9TdHJ1Y3RFbGVtZW50KiBwRWxtID0gcFBhZ2VUcmVlLT5HZXRUb3BFbGVtZW50KGkpOwotICAgICAgICAgICAgICAgIGlmKHBFbG0pIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBQYWdlVHJlZTsKLSAgICAgICAgICAgICAgICAgICAgcFBhZ2VUcmVlID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZSBwUGFnZVRyZWU7Ci0gICAgICAgIHBQYWdlVHJlZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotdm9pZCBDUERGX1Byb2dyZXNzaXZlUmVmbG93UGFnZVBhcnNlcjo6U3RhcnQoSVBERl9SZWZsb3dlZFBhZ2UqIHBSZWZsb3dQYWdlLCBDUERGX1BhZ2UqIHBQYWdlLCBGWF9GTE9BVCB0b3BJbmRlbnQsIEZYX0ZMT0FUIGZXaWR0aCwgRlhfRkxPQVQgZkhlaWdodCwgSUZYX1BhdXNlKiBwUGF1c2UsIGludCBmbGFncykKLXsKLSAgICBpZiAoTlVMTCA9PSBwUmVmbG93UGFnZSkgewotICAgICAgICBtX1N0YXR1cyA9IEZhaWxlZDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX2ZsYWdzID0gZmxhZ3M7Ci0gICAgbV9wUmVmbG93UGFnZSA9IChDUERGX1JlZmxvd2VkUGFnZSopcFJlZmxvd1BhZ2U7Ci0gICAgbV9wUmVmbG93UGFnZS0+bV9wUERGUGFnZSA9IHBQYWdlOwotICAgIG1fcFJlZmxvd1BhZ2UtPlJlbGVhc2VQYWdlT2Jqc01lbWJlclNoaXAoKTsKLSAgICBtX3BQREZQYWdlID0gcFBhZ2U7Ci0gICAgbV9Ub3BJbmRlbnQgPSB0b3BJbmRlbnQ7Ci0gICAgbV9wUGF1c2UgPSBwUGF1c2U7Ci0gICAgbV9mU2NyZWVuSGVpZ2h0ID0gZkhlaWdodDsKLSAgICBtX1JlZmxvd2VkV2lkdGggPSBmV2lkdGg7Ci0gICAgbV9wUHJvdmlkZXIgPSBJUERGX0xheW91dFByb3ZpZGVyOjpDcmVhdGVfTGF5b3V0UHJvdmlkZXJfVGFnZ2VkUERGKG1fcFBERlBhZ2UpOwotICAgIExheW91dFN0YXR1cyBzdGF0dXMgPSBtX3BQcm92aWRlci0+U3RhcnRMb2FkKHBQYXVzZSk7Ci0gICAgaWYoc3RhdHVzID09IExheW91dEVycm9yKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BQcm92aWRlcjsKLSAgICAgICAgbV9wUHJvdmlkZXIgPSBJUERGX0xheW91dFByb3ZpZGVyOjpDcmVhdGVfTGF5b3V0UHJvdmlkZXJfQXV0b1JlZmxvdyhtX3BQREZQYWdlLCBtX2ZsYWdzICYgUkZfUEFSU0VSX1JFQURFUk9SREVSKTsKLSAgICAgICAgaWYgKE5VTEwgPT0gbV9wUHJvdmlkZXIpIHsKLSAgICAgICAgICAgIG1fU3RhdHVzID0gRmFpbGVkOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IG1fcFByb3ZpZGVyLT5TdGFydExvYWQocFBhdXNlKTsKLSAgICB9Ci0gICAgaWYoc3RhdHVzID09IExheW91dEVycm9yKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BQcm92aWRlcjsKLSAgICAgICAgbV9wUHJvdmlkZXIgPSBOVUxMOwotICAgICAgICBtX1N0YXR1cyA9IEZhaWxlZDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZihzdGF0dXMgPT0gTGF5b3V0VG9CZUNvbnRpbnVlZCkgewotICAgICAgICBtX1N0YXR1cyA9IFRvQmVDb250aW51ZWQ7Ci0gICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gTGF5b3V0RmluaXNoZWQpIHsKLSAgICAgICAgbV9wUmVmbG93RW5naW5lID0gSVBERl9MYXlvdXRQcm9jZXNzb3I6OkNyZWF0ZV9MYXlvdXRQcm9jZXNzb3JfUmVmbG93KHRvcEluZGVudCwgZldpZHRoLCBmSGVpZ2h0LCBwUmVmbG93UGFnZSwgbV9mbGFncywgbV9QYXJzZVN0eWxlLm1fTGluZVNwYWNlKTsKLSAgICAgICAgaWYoTlVMTCA9PSBtX3BSZWZsb3dFbmdpbmUpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtX3BQcm92aWRlcjsKLSAgICAgICAgICAgIG1fcFByb3ZpZGVyID0gTlVMTDsKLSAgICAgICAgICAgIG1fU3RhdHVzID0gRmFpbGVkOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4OwotICAgICAgICBwUGFnZS0+R2V0RGlzcGxheU1hdHJpeChtYXRyaXgsIDAsIDAsIChpbnQpKHBQYWdlLT5HZXRQYWdlV2lkdGgoKSksIChpbnQpKHBQYWdlLT5HZXRQYWdlSGVpZ2h0KCkpLCAwKTsKLSAgICAgICAgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXgxID0gcFBhZ2UtPkdldFBhZ2VNYXRyaXgoKTsKLSAgICAgICAgaWYoKHN0YXR1cyA9IG1fcFJlZmxvd0VuZ2luZS0+U3RhcnRQcm9jZXNzKG1fcFByb3ZpZGVyLT5HZXRSb290KCksIHBQYXVzZSwgJm1hdHJpeCkpICE9IExheW91dFRvQmVDb250aW51ZWQpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtX3BSZWZsb3dFbmdpbmU7Ci0gICAgICAgICAgICBtX3BSZWZsb3dFbmdpbmUgPSBOVUxMOwotICAgICAgICAgICAgbV9TdGF0dXMgPSBEb25lOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9TdGF0dXMgPSBUb0JlQ29udGludWVkOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmKHN0YXR1cyAhPSBMYXlvdXRUb0JlQ29udGludWVkKSB7Ci0gICAgICAgIGRlbGV0ZSBtX3BQcm92aWRlcjsKLSAgICAgICAgbV9wUHJvdmlkZXIgPSBOVUxMOwotICAgIH0KLSAgICBpZihtX1RvcEluZGVudCAmJiBtX1N0YXR1cyA9PSBEb25lKSB7Ci0gICAgICAgIG1fcFJlZmxvd1BhZ2UtPm1fUGFnZUhlaWdodCAtPSBtX1RvcEluZGVudDsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQotQ1BERl9Qcm9ncmVzc2l2ZVJlZmxvd1BhZ2VSZW5kZXI6On5DUERGX1Byb2dyZXNzaXZlUmVmbG93UGFnZVJlbmRlcigpCi17Ci0gICAgaWYobV9wRGlzcGxheU1hdHJpeCkgewotICAgICAgICBkZWxldGUgbV9wRGlzcGxheU1hdHJpeDsKLSAgICB9Ci0gICAgbV9wRGlzcGxheU1hdHJpeCA9IE5VTEw7Ci19Ci1DUERGX1Byb2dyZXNzaXZlUmVmbG93UGFnZVJlbmRlcjo6Q1BERl9Qcm9ncmVzc2l2ZVJlZmxvd1BhZ2VSZW5kZXIoKQotewotICAgIG1fU3RhdHVzID0gUmVhZHk7Ci0gICAgbV9wUmVmbG93UGFnZSA9IE5VTEw7Ci0gICAgbV9wRGlzcGxheU1hdHJpeCA9IE5VTEw7Ci0gICAgbV9DdXJyTnVtID0gMDsKLSAgICBtX3BGb250RW5jb2RpbmcgPSBOVUxMOwotICAgIG1fRGlzcGxheUNvbG9yID0gLTE7Ci19Ci1zdGF0aWMgRlhfRkxPQVQgX0NJRFRyYW5zZm9ybVRvRmxvYXQoRlhfQllURSBjaCkKLXsKLSAgICBpZiAoY2ggPCAxMjgpIHsKLSAgICAgICAgcmV0dXJuIGNoICogMS4wZiAvIDEyNzsKLSAgICB9Ci0gICAgcmV0dXJuICgtMjU1ICsgY2gpICogMS4wZiAvIDEyNzsKLX0KLWludAlDUERGX1Byb2dyZXNzaXZlUmVmbG93UGFnZVJlbmRlcjo6R2V0UG9zaXRpb24oKQotewotICAgIGlmKG1fQ3Vyck51bSA9PSAwIHx8IE5VTEwgPT0gbV9wUmVmbG93UGFnZSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW50IHNpemUgPSBtX3BSZWZsb3dQYWdlLT5tX3BSZWZsb3dlZC0+R2V0U2l6ZSgpOwotICAgIGlmKHNpemUgPT0gMCB8fCBtX0N1cnJOdW0gPj0gc2l6ZSkgewotICAgICAgICByZXR1cm4gMTAwOwotICAgIH0KLSAgICByZXR1cm4gKGludCkobV9DdXJyTnVtICogMTAwIC8gc2l6ZSk7Ci19Ci12b2lkIENQREZfUHJvZ3Jlc3NpdmVSZWZsb3dQYWdlUmVuZGVyOjpEaXNwbGF5KElGWF9QYXVzZSogcFBhdXNlKQotewotICAgIGlmIChOVUxMID09IG1fcFJlZmxvd1BhZ2UpIHsKLSAgICAgICAgbV9TdGF0dXMgPSBEb25lOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYX1JFQ1QgY2xpcEJveCA9IG1fcEZYRGV2aWNlLT5HZXRDbGlwQm94KCk7Ci0gICAgaW50IHNpemUgPSBtX3BSZWZsb3dQYWdlLT5tX3BSZWZsb3dlZC0+R2V0U2l6ZSgpOwotICAgIGlmIChzaXplIDwgMSB8fCBOVUxMID09IG1fcERpc3BsYXlNYXRyaXgpIHsKLSAgICAgICAgbV9TdGF0dXMgPSBEb25lOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvcihpbnQgaSA9IG1fQ3Vyck51bTsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBDUkZfRGF0YSogcERhdGEgPSAoKm1fcFJlZmxvd1BhZ2UtPm1fcFJlZmxvd2VkKVtpXTsKLSAgICAgICAgaWYoIXBEYXRhKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDRlhfRmxvYXRSZWN0IHJlY3QgKHBEYXRhLT5tX1Bvc1gsIHBEYXRhLT5tX1Bvc1kgKyBwRGF0YS0+bV9IZWlnaHQsIHBEYXRhLT5tX1Bvc1ggKyBwRGF0YS0+bV9XaWR0aCwgcERhdGEtPm1fUG9zWSk7Ci0gICAgICAgIG1fcERpc3BsYXlNYXRyaXgtPlRyYW5zZm9ybVJlY3QocmVjdCk7Ci0gICAgICAgIGlmKHJlY3QubGVmdCA+IGNsaXBCb3gucmlnaHQgfHwgcmVjdC5yaWdodCA8IGNsaXBCb3gubGVmdCB8fCByZWN0LmJvdHRvbSA+IGNsaXBCb3guYm90dG9tIHx8IHJlY3QudG9wIDwgY2xpcEJveC50b3ApIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmKHBEYXRhLT5HZXRUeXBlKCkgPT0gQ1JGX0RhdGE6OlRleHQpIHsKLSAgICAgICAgICAgIENSRl9DaGFyRGF0YSogcENoYXJEYXRhID0gKENSRl9DaGFyRGF0YSopcERhdGE7Ci0gICAgICAgICAgICBDUERGX0ZvbnQqIHBQREZGb250ID0gcENoYXJEYXRhLT5tX3BDaGFyU3RhdGUtPm1fcEZvbnQ7Ci0gICAgICAgICAgICBpZihwUERGRm9udC0+R2V0Rm9udFR5cGUoKSA9PSBQREZGT05UX1RZUEUzKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9GTE9BVCB4ID0gcERhdGEtPm1fUG9zWCwgeSA9IHBEYXRhLT5tX1Bvc1kgLSBwQ2hhckRhdGEtPm1fcENoYXJTdGF0ZS0+bV9mRGVzY2VudDsKLSAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TIGNoYXJwb3MgOwotICAgICAgICAgICAgY2hhcnBvcy5tX0dseXBoSW5kZXggPSBwUERGRm9udC0+R2x5cGhGcm9tQ2hhckNvZGUocENoYXJEYXRhLT5tX0NoYXJDb2RlKTsKLSAgICAgICAgICAgIGNoYXJwb3MubV9Gb250Q2hhcldpZHRoID0gcFBERkZvbnQtPm1fRm9udC5HZXRHbHlwaFdpZHRoKGNoYXJwb3MubV9HbHlwaEluZGV4KTsKLSAgICAgICAgICAgIGNoYXJwb3MubV9PcmlnaW5YICAgICAgID0geDsKLSAgICAgICAgICAgIGNoYXJwb3MubV9PcmlnaW5ZICAgICAgID0geTsKLSAgICAgICAgICAgIEZYX0ZMT0FUIGNoYXJXID0gcERhdGEtPm1fV2lkdGggKiAxMDAwIC8gcERhdGEtPm1fSGVpZ2h0OwotICAgICAgICAgICAgaWYoY2hhclcgIT0gY2hhcnBvcy5tX0ZvbnRDaGFyV2lkdGgpIHsKLSAgICAgICAgICAgICAgICBjaGFycG9zLm1fYkdseXBoQWRqdXN0ICA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFswXSA9IGNoYXJXIC8gY2hhcnBvcy5tX0ZvbnRDaGFyV2lkdGg7Ci0gICAgICAgICAgICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFsxXSA9IDA7Ci0gICAgICAgICAgICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFsyXSA9IDA7Ci0gICAgICAgICAgICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFszXSA9IDE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNoYXJwb3MubV9iR2x5cGhBZGp1c3QgID0gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9CT09MIGJSZXQgPSBGQUxTRTsKLSAgICAgICAgICAgIGlmKG1fRGlzcGxheUNvbG9yID09IC0xKQotICAgICAgICAgICAgICAgIGJSZXQgPSBtX3BGWERldmljZS0+RHJhd05vcm1hbFRleHQoMSwgJmNoYXJwb3MsICYocFBERkZvbnQtPm1fRm9udCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBwQ2hhckRhdGEtPm1fcENoYXJTdGF0ZS0+bV9mRm9udFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BEaXNwbGF5TWF0cml4LCBwQ2hhckRhdGEtPm1fcENoYXJTdGF0ZS0+bV9Db2xvciArIDB4ZmYwMDAwMDAsIEZYVEVYVF9DTEVBUlRZUEUpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGJSZXQgPSBtX3BGWERldmljZS0+RHJhd05vcm1hbFRleHQoMSwgJmNoYXJwb3MsICYocFBERkZvbnQtPm1fRm9udCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBwQ2hhckRhdGEtPm1fcENoYXJTdGF0ZS0+bV9mRm9udFNpemUsIG1fcERpc3BsYXlNYXRyaXgsIG1fRGlzcGxheUNvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsKLSAgICAgICAgfSBlbHNlIGlmKHBEYXRhLT5HZXRUeXBlKCkgPT0gQ1JGX0RhdGE6OkltYWdlKSB7Ci0gICAgICAgICAgICBDUkZfSW1hZ2VEYXRhKiBwSW1hZ2VEYXRhID0gKENSRl9JbWFnZURhdGEqKXBEYXRhOwotICAgICAgICAgICAgaWYoIXBJbWFnZURhdGEtPm1fcEJpdG1hcCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGxlZnQgPSAwLCB0b3AgPSAwOwotICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwRGlCbXAgPSBOVUxMOwotICAgICAgICAgICAgQ0ZYX0RJQlNvdXJjZSogcERpc3BTb3VyY2UgPSBwSW1hZ2VEYXRhLT5tX3BCaXRtYXA7Ci0gICAgICAgICAgICBpZihwSW1hZ2VEYXRhLT5tX01hdHJpeC5kIDwgMCkgewotICAgICAgICAgICAgICAgIENGWF9BZmZpbmVNYXRyaXggbWF0cml4KHBJbWFnZURhdGEtPm1fTWF0cml4LmEsIDAsIDAsIC1wSW1hZ2VEYXRhLT5tX01hdHJpeC5kLCAwLCAwKTsKLSAgICAgICAgICAgICAgICBpbnQgbGVmdCwgdG9wOwotICAgICAgICAgICAgICAgIHBEaUJtcCA9IHBJbWFnZURhdGEtPm1fcEJpdG1hcC0+VHJhbnNmb3JtVG8oJm1hdHJpeCwgbGVmdCwgdG9wKTsKLSAgICAgICAgICAgICAgICBwRGlzcFNvdXJjZSA9IHBEaUJtcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChOVUxMID09IHBEaXNwU291cmNlKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocERpc3BTb3VyY2UtPkdldEZvcm1hdCgpID09IEZYRElCXzFicHBNYXNrIHx8IHBEaXNwU291cmNlLT5HZXRGb3JtYXQoKSA9PSBGWERJQl84YnBwTWFzaykgewotICAgICAgICAgICAgICAgIG1fcEZYRGV2aWNlLT5TdHJldGNoQml0TWFzayhwRGlzcFNvdXJjZSwgKGludCkocmVjdC5sZWZ0ICsgMC41KSwgKGludCkocmVjdC5ib3R0b20gKyAwLjUpLCAoaW50KShyZWN0LldpZHRoKCkgKyAwLjUpLCAoaW50KShyZWN0LkhlaWdodCgpICsgMC41KSwgMHhmZjAwMDAwMCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fcEZYRGV2aWNlLT5TdHJldGNoRElCaXRzKHBEaXNwU291cmNlLCAoaW50KShyZWN0LmxlZnQgKyAwLjUpLCAoaW50KShyZWN0LmJvdHRvbSArIDAuNSksIChpbnQpKHJlY3QuV2lkdGgoKSArIDAuNSksIChpbnQpKHJlY3QuSGVpZ2h0KCkgKyAwLjUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKG1fcEZYRGV2aWNlLT5HZXRCaXRtYXAoKSAmJiBtX3BGWERldmljZS0+R2V0Qml0bWFwKCktPkdldEZvcm1hdCgpID09IEZYRElCXzhicHBSZ2IgJiYKLSAgICAgICAgICAgICAgICAgICAgbV9wRlhEZXZpY2UtPkdldEJpdG1hcCgpLT5HZXRQYWxldHRlKCkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGludCBuUGFsZXR0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKG1fRGl0aGVyQml0cykgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBuUGFsZXR0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgblBhbGV0dGUgPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgIG5QYWxldHRlID0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBuUGFsZXR0ZSA9IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgICAgICAgICAgblBhbGV0dGUgPSAxNjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBuUGFsZXR0ZSA9IDMyOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgICAgICAgICAgIG5QYWxldHRlID0gNjQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICAgICAgICAgICAgblBhbGV0dGUgPSAxMjg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG5QYWxldHRlID0gMjU2OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKG5QYWxldHRlID49IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiAqIHBhbGV0dGUgPSBGWF9BbGxvYyhGWF9BUkdCLCBuUGFsZXR0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG5QYWxldHRlIC0tOwotICAgICAgICAgICAgICAgICAgICBwYWxldHRlWzBdID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtuUGFsZXR0ZV0gPSAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIERpdGhlciA9IChGWF9GTE9BVCkyNTUgLyAoblBhbGV0dGUpOwotICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAxOyBpIDwgblBhbGV0dGU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZVtpXSA9IChGWF9BUkdCKShEaXRoZXIgKiBpICsgMC41KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBGWF9SRUNUIHRtcFJlY3QgPSByZWN0LkdldE91dHRlclJlY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgbV9wRlhEZXZpY2UtPkdldEJpdG1hcCgpLT5EaXRoZXJGUyhwYWxldHRlLCBuUGFsZXR0ZSArIDEsICZ0bXBSZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgRlhfRnJlZSAocGFsZXR0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocERpQm1wKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIHBEaUJtcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmKHBEYXRhLT5HZXRUeXBlKCkgPT0gQ1JGX0RhdGE6OlBhdGgpIHsKLSAgICAgICAgfQotICAgICAgICBpZighKGkgJSAxMCkpIHsKLSAgICAgICAgICAgIGlmKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgbV9DdXJyTnVtID0gaTsKLSAgICAgICAgICAgICAgICBtX1N0YXR1cyA9IFRvQmVDb250aW51ZWQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIG1fQ3Vyck51bSA9IHNpemU7Ci0gICAgbV9TdGF0dXMgPSBEb25lOwotfQotdm9pZCBDUERGX1Byb2dyZXNzaXZlUmVmbG93UGFnZVJlbmRlcjo6U3RhcnQoSVBERl9SZWZsb3dlZFBhZ2UqIHBSZWZsb3dQYWdlLCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBJRlhfUGF1c2UqIHBQYXVzZSwgaW50IERpdGhlckJpdHMpCi17Ci0gICAgaWYoIXBSZWZsb3dQYWdlIHx8ICFwRGV2aWNlIHx8ICFwTWF0cml4KSB7Ci0gICAgICAgIG1fU3RhdHVzID0gRmFpbGVkOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fRGl0aGVyQml0cyA9IERpdGhlckJpdHM7Ci0gICAgbV9TdGF0dXMgPSBSZWFkeTsKLSAgICBtX0N1cnJOdW0gPSAwOwotICAgIG1fcFJlZmxvd1BhZ2UgPSAoQ1BERl9SZWZsb3dlZFBhZ2UqKXBSZWZsb3dQYWdlOwotICAgIG1fcEZYRGV2aWNlID0gcERldmljZTsKLSAgICBpZihOVUxMID09IG1fcERpc3BsYXlNYXRyaXgpIHsKLSAgICAgICAgbV9wRGlzcGxheU1hdHJpeCA9IG5ldyBDRlhfQWZmaW5lTWF0cml4OwotICAgIH0KLSAgICBtX3BEaXNwbGF5TWF0cml4LT5Db3B5KCpwTWF0cml4KTsKLSAgICBtX1N0YXR1cyA9IFRvQmVDb250aW51ZWQ7Ci0gICAgRGlzcGxheShwUGF1c2UpOwotfQotdm9pZCBDUERGX1Byb2dyZXNzaXZlUmVmbG93UGFnZVJlbmRlcjo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpCi17Ci0gICAgRGlzcGxheShwUGF1c2UpOwotfQotdm9pZCBDUERGX1Byb2dyZXNzaXZlUmVmbG93UGFnZVJlbmRlcjo6U2V0RGlzcGxheUNvbG9yKEZYX0NPTE9SUkVGIGNvbG9yKQotewotICAgIG1fRGlzcGxheUNvbG9yID0gY29sb3I7Ci19Ci12b2lkIENQREZfUHJvZ3Jlc3NpdmVSZWZsb3dQYWdlUmVuZGVyOjpDbGVhcigpCi17Ci0gICAgaWYgKG1fcERpc3BsYXlNYXRyaXgpIHsKLSAgICAgICAgZGVsZXRlIG1fcERpc3BsYXlNYXRyaXg7Ci0gICAgfQotICAgIG1fcERpc3BsYXlNYXRyaXggPSBOVUxMOwotICAgIG1fcFJlZmxvd1BhZ2UgPSBOVUxMOwotICAgIG1fcEZYRGV2aWNlID0gTlVMTDsKLSAgICBtX0N1cnJOdW0gPSAwOwotICAgIG1fU3RhdHVzID0gUmVhZHk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9yZWZsb3cvcmVmbG93ZWRwYWdlLmggYi9jb3JlL3NyYy9yZWZsb3cvcmVmbG93ZWRwYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZWY1NTMuLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvcmVmbG93L3JlZmxvd2VkcGFnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzc0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgQ09SRV9TUkNfUkVGTE9XX1JFRkxPV0VEUEFHRV9IXwotI2RlZmluZSBDT1JFX1NSQ19SRUZMT1dfUkVGTE9XRURQQUdFX0hfCi0KLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3JlZmxvdy9yZWZsb3dlbmdpbmUuaCIKLQotI2RlZmluZSBHRVRfU0lHTkVEKGEpICggKGEpPjAgPyBhL2EgOiAoYT09MCA/IDAgOiAtYS9hKSApCi1jbGFzcyBDUkZfRGF0YTsKLWNsYXNzIENSRl9MaW5lRGF0YTsKLWNsYXNzIENSRl9DaGFyRGF0YTsKLWNsYXNzIENSRl9QYXRoRGF0YTsKLWNsYXNzIENSRl9JbWFnZURhdGE7Ci1jbGFzcyBDUkZfVGFibGU7Ci1jbGFzcyBDUkZfQXR0ck9wZXJhdGlvbjsKLWNsYXNzIENSRl9PcGVyYXRpb25EYXRlOwotY2xhc3MgQ1BERl9SZWZsb3dlZFBhZ2U7Ci1jbGFzcyBDUERGX1JlY3Q7Ci10eXBlZGVmIENGWF9TZWdtZW50ZWRBcnJheTxDUkZfRGF0YSo+IENSRl9EYXRhUHRyQXJyYXk7Ci1jbGFzcyBDUkZfQ2hhclN0YXRlOwotdHlwZWRlZiBDRlhfU2VnbWVudGVkQXJyYXk8Q1JGX0NoYXJTdGF0ZT4gQ1JGX0NoYXJTdGF0ZUFycmF5OwotI2RlZmluZSBTU1RfR0UJCTEKLSNkZWZpbmUgU1NUX0JMU0UJMgotI2RlZmluZSBTU1RfSUxTRQkzCi0jZGVmaW5lIFNTVF9JRQkJNAotY2xhc3MgQ1BERl9MYXlvdXRQcm9jZXNzb3JfUmVmbG93IDogcHVibGljIElQREZfTGF5b3V0UHJvY2Vzc29yCi17Ci1wdWJsaWM6Ci0gICAgQ1BERl9MYXlvdXRQcm9jZXNzb3JfUmVmbG93KCk7Ci0gICAgfkNQREZfTGF5b3V0UHJvY2Vzc29yX1JlZmxvdygpOwotICAgIHZvaWQgSW5pdChGWF9GTE9BVCBUb3BJbmRlbnQsIEZYX0ZMT0FUIGZXaWR0aCwgRlhfRkxPQVQgZkhlaWdodCwgQ1BERl9SZWZsb3dlZFBhZ2UqIHBSZWZsb3dlZFBhZ2UsIGludCBmbGFncywgRlhfRkxPQVQgbGluZVNwYWNlKTsKLQotICAgIExheW91dFN0YXR1cwlTdGFydFByb2Nlc3MoSVBERl9MYXlvdXRFbGVtZW50KiBwRWxlbWVudCwgSUZYX1BhdXNlKiBwUGF1c2UsIGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBQREZNYXRyaXggPSBOVUxMKTsKLSAgICBMYXlvdXRTdGF0dXMJQ29udGludWUoKTsKLSAgICBpbnQJCQkJR2V0UG9zaXRpb24oKTsKLXByb3RlY3RlZDoKLSAgICB2b2lkCUZpdFBhZ2VNb2RlKCk7Ci0gICAgdm9pZAlQcm9jZXNzRWxlbWVudChJUERGX0xheW91dEVsZW1lbnQqIHBFbGVtZW50LCBGWF9GTE9BVCByZWZsb3dXaWR0aCk7Ci0gICAgRlhfRkxPQVQgR2V0RWxtV2lkdGgoSVBERl9MYXlvdXRFbGVtZW50KiBwRWxlbWVudCk7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCBHZXRFbG1CQm94KElQREZfTGF5b3V0RWxlbWVudCogcEVsZW1lbnQpOwotICAgIHZvaWQJUHJvY2Vzc1RhYmxlKEZYX0ZMT0FUIGR4KTsKLSAgICB2b2lkCVByb2Nlc3NPYmpzKElQREZfTGF5b3V0RWxlbWVudCogcEVsZW1lbnQsIEZYX0ZMT0FUIHJlZmxvd1dpZHRoKTsKLSAgICB2b2lkCVByb2Nlc3NPYmplY3QoQ1BERl9QYWdlT2JqZWN0KiBwT2JqLCBGWF9GTE9BVCByZWZsb3dXaWR0aCwgQ0ZYX0FmZmluZU1hdHJpeCBvYmpNYXRyaXgpOwotICAgIHZvaWQJUHJvY2Vzc1RleHRPYmplY3QoQ1BERl9UZXh0T2JqZWN0ICpwT2JqLCBGWF9GTE9BVCByZWZsb3dXaWR0aCwgQ0ZYX0FmZmluZU1hdHJpeCBvYmpNYXRyaXgpOwotICAgIHZvaWQJUHJvY2Vzc1BhdGhPYmplY3QoQ1BERl9QYXRoT2JqZWN0ICpwT2JqLCBGWF9GTE9BVCByZWZsb3dXaWR0aCk7Ci0gICAgdm9pZAlQcm9jZXNzVW5pdGFyeU9ianMoQ1BERl9QYWdlT2JqZWN0cyAqcE9ianMsIEZYX0ZMT0FUIHJlZmxvd1dpZHRoLCBDRlhfQWZmaW5lTWF0cml4IG9iak1hdHJpeCk7Ci0gICAgRlhfSU5UMzIgTG9naWNQcmVPYmooQ1BERl9UZXh0T2JqZWN0KiBwT2JqKTsKLSAgICBpbnQgUHJvY2Vzc0luc2VydE9iamVjdChDUERGX1RleHRPYmplY3QqIHBPYmosIENGWF9BZmZpbmVNYXRyaXggZm9ybU1hdHJpeCk7Ci0gICAgRlhfV0NIQVIgR2V0UHJlQ2hhcigpOwotICAgIEZYX0JPT0wgSXNTYW1lVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqMSwgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iajIpOwotICAgIGludCBHZXRDaGFyV2lkdGgoRlhfRFdPUkQgY2hhckNvZGUsIENQREZfRm9udCogcEZvbnQpIGNvbnN0OwotICAgIEZYX0JPT0wJSXNDYW5CcmVha0FmdGVyKEZYX0RXT1JEIHVuaWNvZGUpOwotICAgIEZYX0JPT0wJSXNDYW5CcmVha0JlZm9yZShGWF9EV09SRCB1bmljb2RlKTsKLSAgICBGWF9JTlQzMiBHZXRFbGVtZW50VHlwZXMoTGF5b3V0VHlwZSBsYXlvdXRUeXBlKTsKLSAgICB2b2lkCQkJCUNyZWF0ZVJGRGF0YShDUERGX1BhZ2VPYmplY3QqIHBPYmosIENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsKLSAgICBDUkZfQ2hhclN0YXRlKgkJR2V0Q2hhclN0YXRlKENQREZfVGV4dE9iamVjdCogcE9iaiwgQ1BERl9Gb250KiBwRm9udCwgRlhfRkxPQVQgZkhlaWdodCwgRlhfQVJHQiBjb2xvcik7Ci0gICAgRlhfRkxPQVQJCUNvbnZlcldpZHRoKEZYX0ZMT0FUIHdpZHRoKTsKLSAgICB2b2lkCUFkZERhdGEyQ3VyckxpbmUoQ1JGX0RhdGEqIHBEYXRhKTsKLSAgICB2b2lkCUFkZFRlbXAyQ3VyckxpbmUoaW50IGJlZ2luLCBpbnQgY291bnQgKTsKLSAgICB2b2lkCVRyYW5zZm9ybShjb25zdCBDRlhfQWZmaW5lTWF0cml4KiBwTWF0cml4LCBDUkZfRGF0YSogcERhdGEpOwotICAgIHZvaWQJVHJhbnNmb3JtKGNvbnN0IENGWF9BZmZpbmVNYXRyaXgqIHBNYXRyaXgsIENSRl9EYXRhUHRyQXJyYXkqIHBEYXRhQXJyYXksIGludCBiZWdpblBvcywgaW50IGNvdW50ID0gMCk7Ci0gICAgRlhfRkxPQVQgR2V0RGF0YXNXaWR0aCggaW50IGJlZ2luUG9zLCBpbnQgZW5kcG9zKTsKLSAgICB2b2lkCVVwZGF0ZUN1cnJMaW5lKCk7Ci0gICAgRlhfQk9PTAlGaW5pc2hlZEN1cnJMaW5lKCk7Ci0gICAgaW50IG1fZmxhZ3M7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBtX1BERk1hdHJpeDsKLSAgICBMYXlvdXRTdGF0dXMJbV9TdGF0dXM7Ci0gICAgQ1BERl9UZXh0T2JqZWN0KiBtX3BQcmVPYmo7Ci0gICAgQ0ZYX0FmZmluZU1hdHJpeCBtX3Blck1hdHJpeDsKLSAgICBJUERGX0xheW91dEVsZW1lbnQqCW1fcExheW91dEVsZW1lbnQ7Ci0gICAgSVBERl9MYXlvdXRFbGVtZW50KiBtX3BSb290RWxlbWVudDsKLSAgICBGWF9GTE9BVAkJbV9DdXJyUmVmV2lkdGg7Ci0gICAgSUZYX1BhdXNlKgkJbV9wUGF1c2U7Ci0gICAgTGF5b3V0RW51bQkJbV9DdXJyV3JpdGluZ01vZGU7Ci0gICAgQ1BERl9SZWZsb3dlZFBhZ2UqCW1fcFJlZmxvd2VkUGFnZTsKLSAgICBGWF9GTE9BVAkJbV9mUmVmV2lkdGg7Ci0gICAgRlhfRkxPQVQJCW1fVG9wSW5kZW50OwotICAgIEZYX0ZMT0FUCQltX2ZMaW5lU3BhY2U7Ci0gICAgRlhfRkxPQVQJCW1fZlNjcmVlbkhlaWdodDsKLSAgICBGWF9GTE9BVAkJbV9mQ3Vyck1heFdpZHRoOwotICAgIEZYX0ZMT0FUCQltX2ZDdXJyTGluZVdpZHRoOwotICAgIEZYX0ZMT0FUCQltX2ZDdXJyTGluZUhlaWdodDsKLSAgICBDUkZfRGF0YVB0ckFycmF5KgltX3BDdXJyTGluZTsKLSAgICBDUkZfRGF0YVB0ckFycmF5KgltX3BUZW1wTGluZTsKLSAgICBGWF9CT09MCQkJbV9iSWxsdXN0cmF0aW9uOwotICAgIEZYX0ZMT0FUCQltX2ZMaW5lSGVpZ2h0OwotICAgIExheW91dEVudW0JCW1fVGV4dEFsaWduOwotICAgIEZYX0ZMT0FUCQltX1N0YXJ0SW5kZW50OwotICAgIENGWF9BcnJheVRlbXBsYXRlPENSRl9UYWJsZSo+IG1fVGFibGVBcnJheTsKLSAgICBpbnQJCQkJbV9QYXVzZVBvc2l0aW9uOwotfTsKLXN0cnVjdCBSRl9UYWJsZUNlbGwgewotICAgIGludAkJCW1fQmVnaW5Qb3M7Ci0gICAgaW50CQkJbV9FbmRQb3M7Ci0gICAgRlhfRkxPQVQgbV9NYXhXaWR0aDsKLSAgICBGWF9GTE9BVCBtX1Bvc1g7Ci0gICAgRlhfRkxPQVQJbV9Qb3NZOwotICAgIEZYX0ZMT0FUCW1fQ2VsbFdpZHRoOwotICAgIEZYX0ZMT0FUIG1fQ2VsbEhlaWdodDsKLSAgICBpbnQJCQltX1Jvd1NwYW47Ci0gICAgaW50CQkJbV9Db2xTcGFuOwotICAgIExheW91dEVudW0JbV9CbG9ja0FsaWduOwotICAgIExheW91dEVudW0JbV9JbmxpbmVBbGlnbjsKLX07Ci10eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPFJGX1RhYmxlQ2VsbCo+IENSRl9UYWJsZUNlbGxBcnJheTsKLWNsYXNzIENSRl9UYWJsZSAKLXsKLXB1YmxpYzoKLSAgICBDUkZfVGFibGUoKQotICAgIHsKLSAgICAgICAgbV9UYWJsZVdpZHRoID0gMDsKLSAgICAgICAgbV9uQ29sID0gMDsKLSAgICB9Ci0gICAgQ1JGX1RhYmxlQ2VsbEFycmF5ICBtX3BDZWxsQXJyYXk7Ci0gICAgQ0ZYX1dvcmRBcnJheQkJbV9uQ2VsbDsKLSAgICBpbnQJCQkJCW1fbkNvbDsKLSAgICBGWF9GTE9BVAkJCW1fVGFibGVXaWR0aDsKLSAgICBGWF9GTE9BVAkJCW1fUmVmbG93UGFnZUhlaWdodDsKLX07Ci1jbGFzcyBDUkZfQ2hhclN0YXRlIAotewotcHVibGljOgotICAgIENQREZfRm9udCoJbV9wRm9udDsKLSAgICBGWF9BUkdCCQltX0NvbG9yOwotICAgIEZYX0JPT0wJCW1fYlZlcnQ7Ci0gICAgRlhfRkxPQVQgbV9mRm9udFNpemU7Ci0gICAgRlhfRkxPQVQgbV9mQXNjZW50OwotICAgIEZYX0ZMT0FUIG1fZkRlc2NlbnQ7Ci0KLSAgICBDUERGX1RleHRPYmplY3QqCW1fcFRleHRPYmo7Ci19OwotY2xhc3MgQ1JGX1BhZ2VJbmZvIAotewotcHVibGljOgotICAgIENSRl9QYWdlSW5mbyhDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqLCBDUkZfUGFnZUluZm8qIHBQYXJlbnQgPSBOVUxMKQotICAgICAgICA6IG1fcFBhZ2VPYmoocFBhZ2VPYmopICwgbV9wUGFyZW50KHBQYXJlbnQpCi0gICAgewotICAgIH0KLSAgICBDUERGX1BhZ2VPYmplY3QqIEdldFBhZ2VPYmooKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fcFBhZ2VPYmo7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogR2V0Rm9ybURpY3QoKQotICAgIHsKLSAgICAgICAgaWYgKE5VTEwgPT0gbV9wUGFyZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBQYXJlbnRPYmogPSBtX3BQYXJlbnQtPkdldFBhZ2VPYmooKTsKLSAgICAgICAgaWYgKE5VTEwgPT0gcFBhcmVudE9iaiB8fCBQREZQQUdFX0ZPUk0gIT0gcFBhcmVudE9iai0+bV9UeXBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKChDUERGX0Zvcm1PYmplY3QqKXBQYXJlbnRPYmopLT5tX3BGb3JtLT5tX3BSZXNvdXJjZXM7Ci0gICAgfQotcHJvdGVjdGVkOgotICAgIENQREZfUGFnZU9iamVjdCoJCW1fcFBhZ2VPYmo7Ci0gICAgQ1JGX1BhZ2VJbmZvKgkJCW1fcFBhcmVudDsKLX07Ci1jbGFzcyBDUERGX1JlZmxvd2VkUGFnZSA6IHB1YmxpYyBJUERGX1JlZmxvd2VkUGFnZSwgcHVibGljIENGWF9Qcml2YXRlRGF0YQotewotcHVibGljOgotCi0gICAgQ1BERl9SZWZsb3dlZFBhZ2UoQ0ZYX0dyb3dPbmx5UG9vbCoJcE1lbW9yeVBvb2wpOwotICAgIH5DUERGX1JlZmxvd2VkUGFnZSgpOwotICAgIENGWF9Qcml2YXRlRGF0YSoJR2V0UHJpdmF0ZURhdGFDdHJsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH07Ci0gICAgdm9pZAkJR2V0RGlzcGxheU1hdHJpeChDRlhfQWZmaW5lTWF0cml4JiBtYXRyaXgsIEZYX0lOVDMyIHhQb3MsIEZYX0lOVDMyIHlQb3MsIEZYX0lOVDMyIHhTaXplLCBGWF9JTlQzMiB5U2l6ZSwgRlhfSU5UMzIgaVJvdGF0ZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcFBhZ2VNYXRyaXgpOwotCi0gICAgRlhfRkxPQVQJR2V0UGFnZUhlaWdodCgpIDsKLSAgICBGWF9GTE9BVAlHZXRQYWdlV2lkdGgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fUGFnZVdpZHRoOwotICAgIH07Ci0gICAgdm9pZAkJRm9jdXNHZXREYXRhKGNvbnN0IENGWF9BZmZpbmVNYXRyaXggbWF0cml4LCBGWF9JTlQzMiB4LCBGWF9JTlQzMiB5LCBDRlhfQnl0ZVN0cmluZyYgc3RyKTsKLSAgICBGWF9CT09MCQlGb2N1c0dldFBvc2l0aW9uKGNvbnN0IENGWF9BZmZpbmVNYXRyaXggbWF0cml4LCBDRlhfQnl0ZVN0cmluZyBzdHIsIEZYX0lOVDMyJiB4LCBGWF9JTlQzMiYgeSk7Ci0gICAgQ1JGX0RhdGFQdHJBcnJheSoJbV9wUmVmbG93ZWQ7Ci0gICAgRlhfRkxPQVQJCQltX1BhZ2VXaWR0aDsKLSAgICBGWF9GTE9BVAkJCW1fUGFnZUhlaWdodDsKLSAgICBGWF9CT09MCQkJCW1fYldhaXRpbmc7Ci0gICAgQ1JGX0NoYXJTdGF0ZUFycmF5KgltX3BDaGFyU3RhdGU7Ci0gICAgQ0ZYX0dyb3dPbmx5UG9vbCoJbV9wTWVtb3J5UG9vbDsKLSAgICBGWF9CT09MCQkJCW1fYkNyZWF0ZU1lbW9yeVBvb2w7Ci0gICAgQ1BERl9QYWdlKgkJCW1fcFBERlBhZ2U7Ci0gICAgRlhfQk9PTAkJCQkJUmV0YWluUGFnZU9ianNNZW1iZXJTaGlwKCk7Ci0gICAgdm9pZAkJCQkJTWFya1BhZ2VPYmpNZW1iZXJTaGlwKENQREZfUGFnZU9iamVjdCogcE9iaiwgQ1JGX1BhZ2VJbmZvKiBwUGFyZW50KTsKLSAgICB2b2lkCQkJCQlSZWxlYXNlUGFnZU9ianNNZW1iZXJTaGlwKCk7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KgkJR2V0Rm9ybVJlc0RpY3QoQ1BERl9QYWdlT2JqZWN0KiBwT2JqKTsKLQotICAgIENGWF9NYXBQdHJUb1B0cioJCW1fcFBhZ2VJbmZvczsKLX07Ci1jbGFzcyBDUERGX1Byb2dyZXNzaXZlUmVmbG93UGFnZVBhcnNlciA6IHB1YmxpYyBJUERGX1Byb2dyZXNzaXZlUmVmbG93UGFnZVBhcnNlcgotewotcHVibGljOgotICAgIENQREZfUHJvZ3Jlc3NpdmVSZWZsb3dQYWdlUGFyc2VyKCk7Ci0gICAgfkNQREZfUHJvZ3Jlc3NpdmVSZWZsb3dQYWdlUGFyc2VyKCkgOwotICAgIHZvaWQJCQlJbml0KCk7Ci0KLSAgICBQYXJzZVN0YXR1cwkJR2V0U3RhdHVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1N0YXR1czsKLSAgICB9OwotCi0gICAgdm9pZAkJCVNldFBhcnNlclN0eWxlKFJGX1BhcnNlU3R5bGUgc3R5bGUpCi0gICAgewotICAgICAgICBtX1BhcnNlU3R5bGUgPSBzdHlsZTsKLSAgICB9OwotICAgIHZvaWQJCQlTdGFydChJUERGX1JlZmxvd2VkUGFnZSogcFJlZmxvd1BhZ2UsIENQREZfUGFnZSogcFBhZ2UsIEZYX0ZMT0FUIFRvcEluZGVudCwgRlhfRkxPQVQgZldpZHRoLCBGWF9GTE9BVCBmSGVpZ2h0LCBJRlhfUGF1c2UqIHBQYXVzZSwgaW50IGZsYWdzKTsKLSAgICB2b2lkCQkJQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOwotICAgIGludAkJCQlHZXRQb3NpdGlvbigpIDsKLQotICAgIHZvaWQJCQlDbGVhcigpOwotICAgIFBhcnNlU3RhdHVzCQltX1N0YXR1czsKLXByb3RlY3RlZDoKLSAgICBSRl9QYXJzZVN0eWxlCQltX1BhcnNlU3R5bGU7Ci0gICAgQ1BERl9QYWdlKgkJCW1fcFBERlBhZ2U7Ci0gICAgSUZYX1BhdXNlKgkJCW1fcFBhdXNlOwotICAgIENQREZfUmVmbG93ZWRQYWdlKgltX3BSZWZsb3dQYWdlOwotICAgIEZYX0ZMT0FUCQkJbV9Ub3BJbmRlbnQ7Ci0gICAgRlhfRkxPQVQJCQltX1JlZmxvd2VkV2lkdGg7Ci0gICAgRlhfRkxPQVQJCQltX2ZTY3JlZW5IZWlnaHQ7Ci0gICAgSVBERl9MYXlvdXRQcm92aWRlcioJbV9wUHJvdmlkZXI7Ci0gICAgSVBERl9MYXlvdXRQcm9jZXNzb3IqCW1fcFJlZmxvd0VuZ2luZTsKLSAgICBpbnQJCQkJCW1fbk9ialByb2Nlc3NlZDsKLSAgICBpbnQgbV9mbGFnczsKLX07Ci1jbGFzcyBDUERGX1Byb2dyZXNzaXZlUmVmbG93UGFnZVJlbmRlciA6IHB1YmxpYyBJUERGX1Byb2dyZXNzaXZlUmVmbG93UGFnZVJlbmRlcgotewotcHVibGljOgotICAgIENQREZfUHJvZ3Jlc3NpdmVSZWZsb3dQYWdlUmVuZGVyKCk7Ci0gICAgfkNQREZfUHJvZ3Jlc3NpdmVSZWZsb3dQYWdlUmVuZGVyKCkgOwotCi0gICAgUmVuZGVyU3RhdHVzCQkJR2V0U3RhdHVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX1N0YXR1czsKLSAgICB9OwotCi0KLSAgICB2b2lkCQlTZXREaXNwbGF5Q29sb3IoRlhfQ09MT1JSRUYgY29sb3IpOwotICAgIHZvaWQJCVN0YXJ0KElQREZfUmVmbG93ZWRQYWdlKiBwUmVmbG93UGFnZSwgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ0ZYX0FmZmluZU1hdHJpeCogcE1hdHJpeCwgSUZYX1BhdXNlKiBwUGF1c2UsIGludCBEaXRoZXJCaXRzKTsKLSAgICB2b2lkCQlDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gICAgaW50CQkJR2V0UG9zaXRpb24oKTsKLQotCi0gICAgdm9pZAkJCQlDbGVhcigpOwotcHJvdGVjdGVkOgotICAgIHZvaWQJCQkJRGlzcGxheShJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gICAgUmVuZGVyU3RhdHVzIG1fU3RhdHVzOwotICAgIENQREZfUmVmbG93ZWRQYWdlKgltX3BSZWZsb3dQYWdlOwotICAgIENGWF9BZmZpbmVNYXRyaXgqCW1fcERpc3BsYXlNYXRyaXg7Ci0gICAgaW50CQkJCQltX0N1cnJOdW07Ci0gICAgSUZYX0ZvbnRFbmNvZGluZyoJbV9wRm9udEVuY29kaW5nOwotICAgIENGWF9SZW5kZXJEZXZpY2UqCW1fcEZYRGV2aWNlOwotICAgIGludAkJCQkJbV9EaXRoZXJCaXRzOwotICAgIEZYX0NPTE9SUkVGCQkJbV9EaXNwbGF5Q29sb3I7Ci0gICAgdHlwZWRlZiBzdHJ1Y3QgQ1JGX1RleHREYXRhQXR0IHsKLSAgICAgICAgQ1JGX1RleHREYXRhQXR0KCkKLSAgICAgICAgewotICAgICAgICAgICAgcEZvbnQgPSBOVUxMOwotICAgICAgICAgICAgZkZvbnRTaXplID0gMC4wZjsKLSAgICAgICAgICAgIENvbG9yID0gMDsKLSAgICAgICAgfQotICAgICAgICBDUkZfVGV4dERhdGFBdHQoQ1BERl9Gb250KiBmb250LCBGWF9GTE9BVCBmb250U2l6ZSwgRlhfQVJHQiBjb2xvcikKLSAgICAgICAgewotICAgICAgICAgICAgcEZvbnQgPSBmb250OwotICAgICAgICAgICAgZkZvbnRTaXplID0gZm9udFNpemU7Ci0gICAgICAgICAgICBDb2xvciA9IGNvbG9yOwotICAgICAgICB9Ci0gICAgICAgIENQREZfRm9udCogIHBGb250OwotICAgICAgICBGWF9GTE9BVCAgICBmRm9udFNpemU7Ci0gICAgICAgIEZYX0FSR0IJCUNvbG9yOwotICAgIH0gQ1JGX1RFWFREQVRBQVRUOwotICAgIGlubGluZSBib29sIGlzVGV4dERhdGFBdHRTYW1lKENSRl9URVhUREFUQUFUVCBkYXRhMSwgQ1JGX1RFWFREQVRBQVRUIGRhdGEyKQotICAgIHsKLSAgICAgICAgaWYgKGRhdGExLnBGb250ICE9IGRhdGEyLnBGb250KSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRhdGExLkNvbG9yICE9IGRhdGEyLkNvbG9yKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZhYnMoZGF0YTEuZkZvbnRTaXplIC0gZGF0YTIuZkZvbnRTaXplKSA+IDAuMGYpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9OwotfTsKLSNkZWZpbmUgVFlQRV9VTktOT1cJCTAKLSNkZWZpbmUgVFlQRV9URVhUCQkxCi0jZGVmaW5lIFRZUEVfUEFUSAkJMgotI2RlZmluZSBUWVBFX0lNQUdFCQkzCi0jZGVmaW5lIFRZUEVfTElORQkJNAotY2xhc3MgQ1JGX0RhdGEgCi17Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiBlbnVtIHtVbmtub3csIFRleHQsIEltYWdlLCBQYXRoLCBMaW5lLCBwYXJhZ3JhcGh9IFJGX0RhdGFUeXBlOwotICAgIENSRl9EYXRhKCkKLSAgICB7Ci0gICAgICAgIG1fVHlwZSA9IFVua25vdzsKLSAgICAgICAgbV9XaWR0aCA9IDA7Ci0gICAgICAgIG1fUG9zWSA9IDA7Ci0gICAgICAgIG1fUG9zWCA9IDA7Ci0gICAgICAgIG1fSGVpZ2h0ID0gMDsKLSAgICB9Ci0gICAgUkZfRGF0YVR5cGUJR2V0VHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbV9UeXBlOwotICAgIH0KLSAgICB2aXJ0dWFsCQl+Q1JGX0RhdGEoKSB7fQotICAgIFJGX0RhdGFUeXBlIAltX1R5cGU7Ci0gICAgRlhfRkxPQVQJbV9Qb3NYOwotICAgIEZYX0ZMT0FUCW1fUG9zWTsKLSAgICBGWF9GTE9BVAltX1dpZHRoOwotICAgIEZYX0ZMT0FUCW1fSGVpZ2h0OwotfTsKLWNsYXNzIENSRl9MaW5lRGF0YSA6IHB1YmxpYyBDUkZfRGF0YQotewotcHVibGljOgotICAgIENSRl9MaW5lRGF0YSgpCi0gICAgewotICAgICAgICBtX1R5cGUgPSBMaW5lOwotICAgIH0KLX07Ci1jbGFzcyBDUkZfQ2hhckRhdGEgOiBwdWJsaWMgQ1JGX0RhdGEKLXsKLXB1YmxpYzoKLSAgICBDUkZfQ2hhckRhdGEoKQotICAgIHsKLSAgICAgICAgbV9UeXBlID0gVGV4dDsKLSAgICAgICAgbV9DaGFyQ29kZSA9IC0xOwotICAgIH0KLSAgICBDUkZfQ2hhclN0YXRlKgltX3BDaGFyU3RhdGU7Ci0gICAgRlhfRFdPUkQJCW1fQ2hhckNvZGU7Ci19OwotY2xhc3MgQ1JGX0ltYWdlRGF0YSA6IHB1YmxpYyBDUkZfRGF0YQotewotcHVibGljOgotICAgIENSRl9JbWFnZURhdGEoKQotICAgIHsKLSAgICAgICAgbV9UeXBlID0gSW1hZ2U7Ci0gICAgICAgIG1fcEJpdG1hcCA9IE5VTEw7Ci0gICAgfQotICAgIH5DUkZfSW1hZ2VEYXRhKCkKLSAgICB7Ci0gICAgICAgIGlmKG1fcEJpdG1hcCkgewotICAgICAgICAgICAgZGVsZXRlIG1fcEJpdG1hcDsKLSAgICAgICAgfQotICAgICAgICBtX3BCaXRtYXAgPSBOVUxMOwotICAgIH0KLSAgICBDRlhfQWZmaW5lTWF0cml4IG1fTWF0cml4OwotICAgIENGWF9ESUJpdG1hcCoJbV9wQml0bWFwOwotfTsKLWNsYXNzIENSRl9QYXRoRGF0YSA6IHB1YmxpYyBDUkZfRGF0YQotewotcHVibGljOgotICAgIENSRl9QYXRoRGF0YSgpCi0gICAgewotICAgICAgICBtX1R5cGUgPSBQYXRoOwotICAgICAgICBtX2JEZWNvcmF0aW9uID0gRkFMU0U7Ci0gICAgfQotICAgIH5DUkZfUGF0aERhdGEoKSB7fTsKLSAgICBGWF9CT09MCQkJbV9iRGVjb3JhdGlvbjsKLSAgICBDUERGX1BhdGgJCQltX3BQYXRoRGF0YTsKLSAgICBDRlhfQWZmaW5lTWF0cml4CW1fcFBhdGgyRGV2aWNlOwotICAgIENQREZfR3JhcGhTdGF0ZQkJbV9wR3JhcGhTdGF0ZTsKLSAgICBGWF9BUkdCCQltX2ZpbGxfYXJnYjsKLSAgICBGWF9BUkdCCQltX3N0cm9rZV9hcmdiOwotICAgIGludAkJCW1fZmlsbF9tb2RlOwotfTsKLQotI2VuZGlmICAvLyBDT1JFX1NSQ19SRUZMT1dfUkVGTE9XRURQQUdFX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9yZWZsb3cvcmVmbG93ZWR0ZXh0cGFnZS5jcHAgYi9jb3JlL3NyYy9yZWZsb3cvcmVmbG93ZWR0ZXh0cGFnZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NDRmNzguLjAwMDAwMDAKLS0tIGEvY29yZS9zcmMvcmVmbG93L3JlZmxvd2VkdGV4dHBhZ2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzk1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlICJyZWZsb3dlZHRleHRwYWdlLmgiCi0KLUlQREZfVGV4dFBhZ2UqCUlQREZfVGV4dFBhZ2U6OkNyZWF0ZVJlZmxvd1RleHRQYWdlKElQREZfUmVmbG93ZWRQYWdlKiBwUmVmUGFnZSkKLXsKLSAgICByZXR1cm4gbmV3IENSRl9UZXh0UGFnZShwUmVmUGFnZSk7Ci19Ci1DUkZfVGV4dFBhZ2U6OkNSRl9UZXh0UGFnZShJUERGX1JlZmxvd2VkUGFnZSogcFJlZlBhZ2UpCi17Ci0gICAgbV9wUmVmUGFnZSA9IChDUERGX1JlZmxvd2VkUGFnZSopKHBSZWZQYWdlKTsKLSAgICBtX3BEYXRhTGlzdCA9IE5VTEw7Ci0gICAgbV9Db3VudEJTQXJyYXkgPSBOVUxMOwotfQotQ1JGX1RleHRQYWdlOjp+Q1JGX1RleHRQYWdlKCkKLXsKLSAgICBpZihtX3BEYXRhTGlzdCkgewotICAgICAgICBkZWxldGUgbV9wRGF0YUxpc3Q7Ci0gICAgICAgIG1fcERhdGFMaXN0ID0gTlVMTDsKLSAgICB9Ci0gICAgaWYobV9Db3VudEJTQXJyYXkpIHsKLSAgICAgICAgZGVsZXRlIG1fQ291bnRCU0FycmF5OwotICAgICAgICBtX0NvdW50QlNBcnJheSA9IE5VTEw7Ci0gICAgfQotfQotRlhfQk9PTCBDUkZfVGV4dFBhZ2U6OlBhcnNlVGV4dFBhZ2UoKQotewotICAgIGlmKCFtX3BSZWZQYWdlKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaW50IGNvdW50ID0gbV9wUmVmUGFnZS0+bV9wUmVmbG93ZWQtPkdldFNpemUoKTsKLSAgICBtX3BEYXRhTGlzdCA9IG5ldyBDUkZfQ2hhckRhdGFQdHJBcnJheShzdGQ6Om1pbihjb3VudCwgNTAwKSk7Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgQ1JGX0RhdGEqIHBEYXRhID0gKCoobV9wUmVmUGFnZS0+bV9wUmVmbG93ZWQpKVtpXTsKLSAgICAgICAgaWYocERhdGEtPkdldFR5cGUoKSA9PSBDUkZfRGF0YTo6VGV4dCkgewotICAgICAgICAgICAgbV9wRGF0YUxpc3QtPkFkZCgoQ1JGX0NoYXJEYXRhKilwRGF0YSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9Db3VudEJTQXJyYXkgPSBuZXcgQ0ZYX0NvdW50QlNJTlQzMkFycmF5KDIwKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLUZYX0JPT0wJQ1JGX1RleHRQYWdlOjpJc1BhcnNlcmVkKCkgY29uc3QKLXsKLSAgICBpZihtX3BEYXRhTGlzdCkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotaW50IENSRl9UZXh0UGFnZTo6Q2hhckluZGV4RnJvbVRleHRJbmRleChpbnQgVGV4dEluZGV4KSBjb25zdAotewotICAgIHJldHVybiBUZXh0SW5kZXg7Ci19Ci1pbnQgQ1JGX1RleHRQYWdlOjpUZXh0SW5kZXhGcm9tQ2hhckluZGV4KGludCBDaGFySW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIENoYXJJbmRleDsKLX0KLQotaW50CUNSRl9UZXh0UGFnZTo6Q291bnRDaGFycygpIGNvbnN0Ci17Ci0gICAgaWYgKE5VTEwgPT0gbV9wRGF0YUxpc3QpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICByZXR1cm4gbV9wRGF0YUxpc3QtPkdldFNpemUoKTsKLX0KLXZvaWQgQ1JGX1RleHRQYWdlOjpHZXRDaGFySW5mbyhpbnQgaW5kZXgsIEZQREZfQ0hBUl9JTkZPICYgaW5mbykgY29uc3QKLXsKLSAgICBpZihpbmRleCA+PSBDb3VudENoYXJzKCkgfHwgaW5kZXggPCAwIHx8ICFtX3BEYXRhTGlzdCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIENSRl9DaGFyRGF0YSogcERhdGEgPSAoKm1fcERhdGFMaXN0KVtpbmRleF07Ci0gICAgRlhfRkxPQVQgUmVsdGl2ZUNvcmRkRHMgPSBwRGF0YS0+bV9wQ2hhclN0YXRlLT5tX2ZEZXNjZW50OwotICAgIEZYX0ZMT0FUIFJlbHRpdmVDb3JkZEFzID0gcERhdGEtPm1fcENoYXJTdGF0ZS0+bV9mQXNjZW50OwotICAgIGluZm8ubV9GbGFnCQk9IENIQVJfTk9STUFMOwotICAgIGluZm8ubV9wVGV4dE9iagk9IHBEYXRhLT5tX3BDaGFyU3RhdGUtPm1fcFRleHRPYmo7Ci0gICAgaW5mby5tX09yaWdpblgJPSBwRGF0YS0+bV9Qb3NYOwotICAgIGluZm8ubV9PcmlnaW5ZCT0gcERhdGEtPm1fUG9zWSAtIFJlbHRpdmVDb3JkZERzOwotICAgIGluZm8ubV9Gb250U2l6ZQk9IHBEYXRhLT5tX3BDaGFyU3RhdGUtPm1fZkZvbnRTaXplOwotICAgIENGWF9GbG9hdFJlY3QgRmxvYXRSZWN0VG1wKHBEYXRhLT5tX1Bvc1gsIHBEYXRhLT5tX1Bvc1ksIHBEYXRhLT5tX1Bvc1ggKyBwRGF0YS0+bV9XaWR0aCwgcERhdGEtPm1fUG9zWSArIFJlbHRpdmVDb3JkZEFzIC0gUmVsdGl2ZUNvcmRkRHMpOwotICAgIGluZm8ubV9DaGFyQm94CT0gRmxvYXRSZWN0VG1wOwotICAgIENGWF9XaWRlU3RyaW5nIHN0ciA9IHBEYXRhLT5tX3BDaGFyU3RhdGUtPm1fcEZvbnQtPlVuaWNvZGVGcm9tQ2hhckNvZGUocERhdGEtPm1fQ2hhckNvZGUpOwotICAgIGlmKCFzdHIuSXNFbXB0eSgpKSB7Ci0gICAgICAgIGluZm8ubV9Vbmljb2RlCT0gc3RyLkdldEF0KDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZm8ubV9Vbmljb2RlID0gLTE7Ci0gICAgfQotICAgIGluZm8ubV9DaGFyY29kZSA9IChGWF9XQ0hBUilwRGF0YS0+bV9DaGFyQ29kZTsKLSAgICBpbmZvLm1fTWF0cml4ID0gQ0ZYX01hdHJpeCgxLCAwLCAwLCAxLCAwLCAwKTsKLX0KLWV4dGVybiBGWF9CT09MIEdldEludGVyc2VjdGlvbihGWF9GTE9BVCBsb3cxLCBGWF9GTE9BVCBoaWdoMSwgRlhfRkxPQVQgbG93MiwgRlhfRkxPQVQgaGlnaDIsIEZYX0ZMT0FUJiBpbnRlcmxvdywgRlhfRkxPQVQmIGludGVyaGlnaCk7Ci1pbmxpbmUgRlhfQk9PTCBfSXNJbnNhbWVsaW5lKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3RBLCBjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0QikKLXsKLSAgICBpZigocmVjdEEudG9wID49IHJlY3RCLmJvdHRvbSAmJiByZWN0Qi50b3AgPj0gcmVjdEEuYm90dG9tKSkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotfQotaW5saW5lIEZYX0JPT0wgX0lzSW50ZXJzZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3RBLCBjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0QikKLXsKLSAgICBGWF9GTE9BVCBpbnRlcmxvdyA9IC4wZiwgaW50ZXJoaWdoID0gLjBmOwotICAgIGlmKEdldEludGVyc2VjdGlvbihyZWN0QS5ib3R0b20sIHJlY3RBLnRvcCwgcmVjdEIuYm90dG9tLCByZWN0Qi50b3AsIGludGVybG93LCBpbnRlcmhpZ2gpKSB7Ci0gICAgICAgIGlmKEdldEludGVyc2VjdGlvbihyZWN0QS5sZWZ0LCByZWN0QS5yaWdodCwgcmVjdEIubGVmdCwgcmVjdEIucmlnaHQsIGludGVybG93LCBpbnRlcmhpZ2gpKSB7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci12b2lkIENSRl9UZXh0UGFnZTo6R2V0UmVjdEFycmF5KGludCBzdGFydCwgaW50IG5Db3VudCwgQ0ZYX1JlY3RBcnJheSYgcmVjdEFycmF5KSBjb25zdAotewotICAgIGludCBpbmRleGxlbiA9IHN0YXJ0ICsgbkNvdW50OwotICAgIEZQREZfQ0hBUl9JTkZPIGluZm87Ci0gICAgRlhfQk9PTCBic3RhcnQgPSBUUlVFOwotICAgIENGWF9GbG9hdFJlY3QgcmVjdHRtcDsKLSAgICBpbnQgaTsKLSAgICBmb3IoaSA9IHN0YXJ0OyBpIDwgaW5kZXhsZW47IGkrKykgewotICAgICAgICBHZXRDaGFySW5mbyhpLCBpbmZvKTsKLSAgICAgICAgaWYoYnN0YXJ0KSB7Ci0gICAgICAgICAgICByZWN0dG1wID0gaW5mby5tX0NoYXJCb3g7Ci0gICAgICAgICAgICBic3RhcnQgPSBGQUxTRTsKLSAgICAgICAgfSBlbHNlIGlmKF9Jc0luc2FtZWxpbmUocmVjdHRtcCwgaW5mby5tX0NoYXJCb3gpKSB7Ci0gICAgICAgICAgICByZWN0dG1wLnJpZ2h0ID0gaW5mby5tX0NoYXJCb3gucmlnaHQ7Ci0gICAgICAgICAgICBpZihpbmZvLm1fQ2hhckJveC50b3AgPiByZWN0dG1wLnRvcCkgewotICAgICAgICAgICAgICAgIHJlY3R0bXAudG9wID0gaW5mby5tX0NoYXJCb3gudG9wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoaW5mby5tX0NoYXJCb3guYm90dG9tIDwgcmVjdHRtcC5ib3R0b20pIHsKLSAgICAgICAgICAgICAgICByZWN0dG1wLmJvdHRvbSA9IGluZm8ubV9DaGFyQm94LmJvdHRvbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlY3RBcnJheS5BZGQocmVjdHRtcCk7Ci0gICAgICAgICAgICByZWN0dG1wID0gaW5mby5tX0NoYXJCb3g7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmVjdEFycmF5LkFkZChyZWN0dG1wKTsKLX0KLWlubGluZSBGWF9GTE9BVCBfR2V0RGlzdGFuY2UoQ0ZYX0Zsb2F0UmVjdCBmbG9hdFJlY3QsIENQREZfUG9pbnQgcG9pbnQpCi17Ci0gICAgaWYoZmxvYXRSZWN0LnJpZ2h0IDwgcG9pbnQueCAmJiBmbG9hdFJlY3QuYm90dG9tID4gcG9pbnQueSkgewotICAgICAgICByZXR1cm4gRlhTWVNfc3FydChGWFNZU19wb3cocG9pbnQueCAtIGZsb2F0UmVjdC5yaWdodCwgMikgKyBGWFNZU19wb3coZmxvYXRSZWN0LmJvdHRvbSAtIHBvaW50LnksIDIpKTsKLSAgICB9Ci0gICAgaWYgKGZsb2F0UmVjdC5yaWdodCA8IHBvaW50LnggJiYgZmxvYXRSZWN0LnRvcCA8IHBvaW50LnkpIHsKLSAgICAgICAgcmV0dXJuIEZYU1lTX3NxcnQoRlhTWVNfcG93KHBvaW50LnggLSBmbG9hdFJlY3QucmlnaHQsIDIpICsgRlhTWVNfcG93KHBvaW50LnkgLSBmbG9hdFJlY3QudG9wLCAyKSk7Ci0gICAgfQotICAgIGlmKGZsb2F0UmVjdC5sZWZ0ID4gcG9pbnQueCAmJiBmbG9hdFJlY3QuYm90dG9tID4gcG9pbnQueSkgewotICAgICAgICByZXR1cm4gRlhTWVNfc3FydChGWFNZU19wb3coZmxvYXRSZWN0LmJvdHRvbSAtIHBvaW50LnksIDIpICsgRlhTWVNfcG93KGZsb2F0UmVjdC5sZWZ0IC0gcG9pbnQueCwgMikpOwotICAgIH0KLSAgICBpZigoZmxvYXRSZWN0LnJpZ2h0ID4gcG9pbnQueCB8fCBGWFNZU19mYWJzKGZsb2F0UmVjdC5yaWdodCAtIHBvaW50LngpIDw9IDAuMDAwMWYpICYmCi0gICAgICAgICAgICAoZmxvYXRSZWN0LmxlZnQgPCBwb2ludC54IHx8IEZYU1lTX2ZhYnMoZmxvYXRSZWN0LmxlZnQgLSBwb2ludC54KSA8PSAwLjAwMDFmKSAmJiBmbG9hdFJlY3QuYm90dG9tID4gcG9pbnQueSkgewotICAgICAgICByZXR1cm4gRlhTWVNfZmFicyhmbG9hdFJlY3QuYm90dG9tIC0gcG9pbnQueSk7Ci0gICAgfQotICAgIGlmKGZsb2F0UmVjdC5sZWZ0ID4gcG9pbnQueCAmJiAoZmxvYXRSZWN0LmJvdHRvbSA8IHBvaW50LnkgfHwgRlhTWVNfZmFicyhmbG9hdFJlY3QuYm90dG9tIC0gcG9pbnQueSkgPD0gMC4wMDAxZikgJiYKLSAgICAgICAgICAgIChmbG9hdFJlY3QudG9wID4gcG9pbnQueSB8fCBGWFNZU19mYWJzKGZsb2F0UmVjdC50b3AgLSBwb2ludC55KSA8PSAwLjAwMDFmKSkgewotICAgICAgICByZXR1cm4gRlhTWVNfZmFicyhmbG9hdFJlY3QubGVmdCAtIHBvaW50LngpOwotICAgIH0KLSAgICBpZihmbG9hdFJlY3QubGVmdCA+IHBvaW50LnggJiYgZmxvYXRSZWN0LnRvcCA8IHBvaW50LnkpIHsKLSAgICAgICAgcmV0dXJuIEZYU1lTX3NxcnQoRlhTWVNfcG93KGZsb2F0UmVjdC5sZWZ0IC0gcG9pbnQueCwgMikgKyBGWFNZU19wb3cocG9pbnQueSAtIGZsb2F0UmVjdC50b3AsIDIpKTsKLSAgICB9Ci0gICAgaWYgKChmbG9hdFJlY3QubGVmdCA8IHBvaW50LnggfHwgRlhTWVNfZmFicyhmbG9hdFJlY3QubGVmdCAtIHBvaW50LngpIDw9IDAuMDAwMWYpICYmCi0gICAgICAgICAgICAoZmxvYXRSZWN0LnJpZ2h0ID4gcG9pbnQueCB8fCBGWFNZU19mYWJzKGZsb2F0UmVjdC5yaWdodCAtIHBvaW50LngpIDw9IDAuMDAwMWYpICYmIGZsb2F0UmVjdC50b3AgPCBwb2ludC55KSB7Ci0gICAgICAgIHJldHVybiBGWFNZU19mYWJzKHBvaW50LnkgLSBmbG9hdFJlY3QudG9wKTsKLSAgICB9Ci0gICAgaWYoZmxvYXRSZWN0LnJpZ2h0IDwgcG9pbnQueCAmJiAoZmxvYXRSZWN0LnRvcCA+IHBvaW50LnkgfHwgRlhTWVNfZmFicyhmbG9hdFJlY3QudG9wIC0gcG9pbnQueSkgPD0gMC4wMDAxZikgJiYKLSAgICAgICAgICAgIChmbG9hdFJlY3QuYm90dG9tIDwgcG9pbnQueSB8fCBGWFNZU19mYWJzKGZsb2F0UmVjdC5ib3R0b20gLSBwb2ludC55KSA8PSAwLjAwMDFmKSkgewotICAgICAgICByZXR1cm4gcG9pbnQueCAtIGZsb2F0UmVjdC5yaWdodDsKLSAgICB9Ci0gICAgcmV0dXJuIC4wZjsKLX0KLWludCBDUkZfVGV4dFBhZ2U6OkdldEluZGV4QXRQb3MoQ1BERl9Qb2ludCBwb2ludCwgRlhfRkxPQVQgeFRvcmVsYW5jZSwgRlhfRkxPQVQgeVRvcmVsYW5jZSkgY29uc3QKLXsKLSAgICBpbnQgaW5kZXggPSAtMSwgaSA9IDAsIGogPSAwOwotICAgIEZQREZfQ0hBUl9JTkZPIGluZm87Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByZWN0VG1wOwotICAgIEZYX0ZMT0FUIE1pbkRpc3RhbmNlID0gMTAwMCwgRGlzdGFuY2VUbXAgPSAwOwotICAgIEZYX0ZMT0FUIHJlY3RfYm90dG9tID0gcG9pbnQueCAtIHhUb3JlbGFuY2U7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCBUb3JlbGFuY2VSZWN0KHJlY3RfYm90dG9tIDw9IDAgPyAwIDogcmVjdF9ib3R0b20sIHBvaW50LnkgLSB5VG9yZWxhbmNlLCBwb2ludC54ICsgeFRvcmVsYW5jZSwgcG9pbnQueSArIHlUb3JlbGFuY2UpOwotICAgIGludCBjb3VudCA9IENvdW50Q2hhcnMoKTsKLSAgICBmb3IoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIEdldENoYXJJbmZvKGksIGluZm8pOwotICAgICAgICByZWN0VG1wID0gaW5mby5tX0NoYXJCb3g7Ci0gICAgICAgIGlmKHJlY3RUbXAuQ29udGFpbnMocG9pbnQueCwgcG9pbnQueSkpIHsKLSAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgaWYoX0lzSW50ZXJzZWN0KHJlY3RUbXAsIFRvcmVsYW5jZVJlY3QpKSB7Ci0gICAgICAgICAgICBEaXN0YW5jZVRtcCA9IF9HZXREaXN0YW5jZShyZWN0VG1wLCBwb2ludCk7Ci0gICAgICAgICAgICBpZihEaXN0YW5jZVRtcCA8IE1pbkRpc3RhbmNlKSB7Ci0gICAgICAgICAgICAgICAgTWluRGlzdGFuY2UgPSBEaXN0YW5jZVRtcDsKLSAgICAgICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGluZGV4OwotfQotaW50IENSRl9UZXh0UGFnZTo6R2V0SW5kZXhBdFBvcyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBGWF9GTE9BVCB4VG9yZWxhbmNlLCBGWF9GTE9BVCB5VG9yZWxhbmNlKSBjb25zdAotewotICAgIGludCBpbmRleCA9IDA7Ci0gICAgQ1BERl9Qb2ludCBwb2ludCh4LCB5KTsKLSAgICBpZigoaW5kZXggPSBHZXRJbmRleEF0UG9zKHBvaW50LCB4VG9yZWxhbmNlLCB5VG9yZWxhbmNlKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotfQotaW50IENSRl9UZXh0UGFnZTo6R2V0T3JkZXJCeURpcmVjdGlvbihpbnQgaW5kZXgsIGludCBkaXJlY3Rpb24pIGNvbnN0Ci17Ci0gICAgcmV0dXJuIC0xOwotfQotQ0ZYX1dpZGVTdHJpbmcgQ1JGX1RleHRQYWdlOjpHZXRUZXh0QnlSZWN0KENGWF9GbG9hdFJlY3QgcmVjdCkgY29uc3QKLXsKLSAgICBpbnQgY291bnQ7Ci0gICAgRlBERl9DSEFSX0lORk8gaW5mbzsKLSAgICBDRlhfV2lkZVN0cmluZyBzdHI7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCAgUmVjdHRtcDsKLSAgICBGWF9CT09MIGJzdGFydCA9IFRSVUU7Ci0gICAgY291bnQgPSBDb3VudENoYXJzKCk7Ci0gICAgaWYocmVjdC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIEwiIjsKLSAgICB9Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgR2V0Q2hhckluZm8oaSwgaW5mbyk7Ci0gICAgICAgIGlmKF9Jc0ludGVyc2VjdChyZWN0LCBpbmZvLm1fQ2hhckJveCkpIHsKLSAgICAgICAgICAgIGlmKGJzdGFydCkgewotICAgICAgICAgICAgICAgIFJlY3R0bXAgPSBpbmZvLm1fQ2hhckJveDsKLSAgICAgICAgICAgICAgICBzdHIgKz0gaW5mby5tX1VuaWNvZGU7Ci0gICAgICAgICAgICAgICAgYnN0YXJ0ID0gRkFMU0U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoX0lzSW5zYW1lbGluZShSZWN0dG1wLCBpbmZvLm1fQ2hhckJveCkpIHsKLSAgICAgICAgICAgICAgICBzdHIgKz0gaW5mby5tX1VuaWNvZGU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0ciArPSBMIlxyXG4iOwotICAgICAgICAgICAgICAgIFJlY3R0bXAgPSBpbmZvLm1fQ2hhckJveDsKLSAgICAgICAgICAgICAgICBzdHIgKz0gaW5mby5tX1VuaWNvZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYoc3RyLklzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gTCIiOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBzdHI7Ci0gICAgfQotfQotdm9pZCBDUkZfVGV4dFBhZ2U6OkdldFJlY3RzQXJyYXlCeVJlY3QoQ0ZYX0Zsb2F0UmVjdCByZWN0LCBDRlhfUmVjdEFycmF5JiByZXNSZWN0QXJyYXkpIGNvbnN0Ci17Ci0gICAgaW50IGNvdW50LCBpOwotICAgIEZYX0JPT0wgYnN0YXJ0ID0gVFJVRTsKLSAgICBGUERGX0NIQVJfSU5GTyBpbmZvOwotICAgIENGWF9GbG9hdFJlY3QgcmVjdHRtcDsKLSAgICBjb3VudCA9IENvdW50Q2hhcnMoKTsKLSAgICBmb3IoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIEdldENoYXJJbmZvKGksIGluZm8pOwotICAgICAgICBpZihfSXNJbnRlcnNlY3QocmVjdCwgaW5mby5tX0NoYXJCb3gpKSB7Ci0gICAgICAgICAgICBpZihic3RhcnQpIHsKLSAgICAgICAgICAgICAgICByZWN0dG1wID0gaW5mby5tX0NoYXJCb3g7Ci0gICAgICAgICAgICAgICAgYnN0YXJ0ID0gRkFMU0U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoX0lzSW5zYW1lbGluZShyZWN0dG1wLCBpbmZvLm1fQ2hhckJveCkpIHsKLSAgICAgICAgICAgICAgICByZWN0dG1wLnJpZ2h0ID0gaW5mby5tX0NoYXJCb3gucmlnaHQ7Ci0gICAgICAgICAgICAgICAgaWYoaW5mby5tX0NoYXJCb3gudG9wID4gcmVjdHRtcC50b3ApIHsKLSAgICAgICAgICAgICAgICAgICAgcmVjdHRtcC50b3AgPSBpbmZvLm1fQ2hhckJveC50b3A7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKGluZm8ubV9DaGFyQm94LmJvdHRvbSA8IHJlY3R0bXAuYm90dG9tKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlY3R0bXAuYm90dG9tID0gaW5mby5tX0NoYXJCb3guYm90dG9tOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzUmVjdEFycmF5LkFkZChyZWN0dG1wKTsKLSAgICAgICAgICAgICAgICByZWN0dG1wID0gaW5mby5tX0NoYXJCb3g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmVzUmVjdEFycmF5LkFkZChyZWN0dG1wKTsKLX0KLWludCBDUkZfVGV4dFBhZ2U6OkNvdW50UmVjdHMoaW50IHN0YXJ0LCBpbnQgbkNvdW50KQotewotICAgIG1fcmVjdEFycmF5LlJlbW92ZUFsbCgpOwotICAgIEdldFJlY3RBcnJheShzdGFydCwgbkNvdW50LCBtX3JlY3RBcnJheSk7Ci0gICAgcmV0dXJuIG1fcmVjdEFycmF5LkdldFNpemUoKTsKLX0KLXZvaWQgQ1JGX1RleHRQYWdlOjpHZXRSZWN0KGludCByZWN0SW5kZXgsIEZYX0ZMT0FUJiBsZWZ0LCBGWF9GTE9BVCYgdG9wLCBGWF9GTE9BVCYgcmlnaHQsIEZYX0ZMT0FUICZib3R0b20pIGNvbnN0Ci17Ci0gICAgaWYobV9yZWN0QXJyYXkuR2V0U2l6ZSgpIDw9IHJlY3RJbmRleCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxlZnQgICA9IG1fcmVjdEFycmF5W3JlY3RJbmRleF0ubGVmdDsKLSAgICB0b3AgICAgPSBtX3JlY3RBcnJheVtyZWN0SW5kZXhdLnRvcDsKLSAgICByaWdodCAgPSBtX3JlY3RBcnJheVtyZWN0SW5kZXhdLnJpZ2h0OwotICAgIGJvdHRvbSA9IG1fcmVjdEFycmF5W3JlY3RJbmRleF0uYm90dG9tOwotfQotRlhfQk9PTCBDUkZfVGV4dFBhZ2U6OkdldEJhc2VsaW5lUm90YXRlKGludCByZWN0SW5kZXgsIGludCYgUm90YXRlKQotewotICAgIFJvdGF0ZSA9IDA7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci1GWF9CT09MIENSRl9UZXh0UGFnZTo6R2V0QmFzZWxpbmVSb3RhdGUoQ0ZYX0Zsb2F0UmVjdCByZWN0LCBpbnQmIFJvdGF0ZSkKLXsKLSAgICBSb3RhdGUgPSAwOwotICAgIHJldHVybiBUUlVFOwotfQotaW50IENSRl9UZXh0UGFnZTo6Q291bnRCb3VuZGVkU2VnbWVudHMoRlhfRkxPQVQgbGVmdCwgRlhfRkxPQVQgdG9wLCBGWF9GTE9BVCByaWdodCwgRlhfRkxPQVQgYm90dG9tLCBGWF9CT09MIGJDb250YWlucykKLXsKLSAgICBpZiAoIW1fQ291bnRCU0FycmF5KSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgbV9Db3VudEJTQXJyYXktPlJlbW92ZUFsbCgpOwotICAgIENGWF9GbG9hdFJlY3QgZmxvYXRyZWN0KGxlZnQsIGJvdHRvbSwgcmlnaHQsIHRvcCk7Ci0gICAgaW50IHRvdGFsY291bnQsIGksIGogPSAwLCBjb3VudHRtcCA9IDA7Ci0gICAgRlhfQk9PTCBic3RhcnQgPSBUUlVFOwotICAgIEZQREZfQ0hBUl9JTkZPIGluZm87Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByZWN0dG1wOwotICAgIHRvdGFsY291bnQgPSBDb3VudENoYXJzKCk7Ci0gICAgZm9yKGkgPSAwOyBpIDwgdG90YWxjb3VudDsgaSsrKSB7Ci0gICAgICAgIEdldENoYXJJbmZvKGksIGluZm8pOwotICAgICAgICBpZihfSXNJbnRlcnNlY3QoZmxvYXRyZWN0LCBpbmZvLm1fQ2hhckJveCkpIHsKLSAgICAgICAgICAgIGlmKGJzdGFydCkgewotICAgICAgICAgICAgICAgIG1fQ291bnRCU0FycmF5LT5BZGQoaSk7Ci0gICAgICAgICAgICAgICAgY291bnR0bXAgPSAxOwotICAgICAgICAgICAgICAgIHJlY3R0bXAgPSBpbmZvLm1fQ2hhckJveDsKLSAgICAgICAgICAgICAgICBic3RhcnQgPSBGQUxTRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZihfSXNJbnNhbWVsaW5lKHJlY3R0bXAsIGluZm8ubV9DaGFyQm94KSkgewotICAgICAgICAgICAgICAgIHJlY3R0bXAucmlnaHQgPSBpbmZvLm1fQ2hhckJveC5yaWdodDsKLSAgICAgICAgICAgICAgICBpZihpbmZvLm1fQ2hhckJveC50b3AgPiByZWN0dG1wLnRvcCkgewotICAgICAgICAgICAgICAgICAgICByZWN0dG1wLnRvcCA9IGluZm8ubV9DaGFyQm94LnRvcDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoaW5mby5tX0NoYXJCb3guYm90dG9tIDwgcmVjdHRtcC5ib3R0b20pIHsKLSAgICAgICAgICAgICAgICAgICAgcmVjdHRtcC5ib3R0b20gPSBpbmZvLm1fQ2hhckJveC5ib3R0b207Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvdW50dG1wICsrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX0NvdW50QlNBcnJheS0+QWRkKGNvdW50dG1wKTsKLSAgICAgICAgICAgICAgICBtX0NvdW50QlNBcnJheS0+QWRkKGkpOwotICAgICAgICAgICAgICAgIGNvdW50dG1wID0gMTsKLSAgICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICAgICAgcmVjdHRtcCA9IGluZm8ubV9DaGFyQm94OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIG1fQ291bnRCU0FycmF5LT5BZGQoY291bnR0bXApOwotICAgIGorKzsKLSAgICByZXR1cm4gajsKLX0KLXZvaWQgQ1JGX1RleHRQYWdlOjpHZXRCb3VuZGVkU2VnbWVudChpbnQgaW5kZXgsIGludCYgc3RhcnQsIGludCYgY291bnQpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX0NvdW50QlNBcnJheSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmKG1fQ291bnRCU0FycmF5LT5HZXRTaXplKCkgPD0gaW5kZXggKiAyKSB7Ci0gICAgICAgIHN0YXJ0ID0gMDsKLSAgICAgICAgY291bnQgPSAwOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN0YXJ0ID0gKihpbnQgKiltX0NvdW50QlNBcnJheS0+R2V0QXQoaW5kZXggKiAyKTsKLSAgICBjb3VudCA9ICooaW50ICopbV9Db3VudEJTQXJyYXktPkdldEF0KGluZGV4ICogMiArIDEpOwotfQotCi1pbnQgQ1JGX1RleHRQYWdlOjpHZXRXb3JkQnJlYWsoaW50IGluZGV4LCBpbnQgZGlyZWN0aW9uKSBjb25zdAotewotICAgIHJldHVybiAtMTsKLX0KLUNGWF9XaWRlU3RyaW5nIENSRl9UZXh0UGFnZTo6R2V0UGFnZVRleHQoaW50IHN0YXJ0LCBpbnQgbkNvdW50ICkgY29uc3QKLXsKLSAgICBpZihuQ291bnQgPT0gLTEpIHsKLSAgICAgICAgbkNvdW50ID0gQ291bnRDaGFycygpOwotICAgICAgICBzdGFydCA9IDA7Ci0gICAgfSBlbHNlIGlmKG5Db3VudCA8IDEpIHsKLSAgICAgICAgcmV0dXJuIEwiIjsKLSAgICB9IGVsc2UgaWYoc3RhcnQgPj0gQ291bnRDaGFycygpKSB7Ci0gICAgICAgIHJldHVybiBMIiI7Ci0gICAgfQotICAgIGludCBpLCBpbmRleCA9IHN0YXJ0ICsgbkNvdW50OwotICAgIEZQREZfQ0hBUl9JTkZPIGluZm87Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc3RyOwotICAgIENGWF9GbG9hdFJlY3QgcmVjdHRtcDsKLSAgICBGWF9CT09MIGJzdGFydCA9IFRSVUU7Ci0gICAgZm9yKGkgPSBzdGFydDsgaSA8IGluZGV4OyBpKyspIHsKLSAgICAgICAgR2V0Q2hhckluZm8oaSwgaW5mbyk7Ci0gICAgICAgIGlmKGJzdGFydCkgewotICAgICAgICAgICAgcmVjdHRtcCA9IGluZm8ubV9DaGFyQm94OwotICAgICAgICAgICAgc3RyICs9IGluZm8ubV9Vbmljb2RlOwotICAgICAgICAgICAgYnN0YXJ0ID0gRkFMU0U7Ci0gICAgICAgIH0gZWxzZSBpZiAoX0lzSW5zYW1lbGluZShyZWN0dG1wLCBpbmZvLm1fQ2hhckJveCkpIHsKLSAgICAgICAgICAgIHN0ciArPSBpbmZvLm1fVW5pY29kZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0ciArPSBMIlxyXG4iOwotICAgICAgICAgICAgcmVjdHRtcCA9IGluZm8ubV9DaGFyQm94OwotICAgICAgICAgICAgc3RyICs9IGluZm8ubV9Vbmljb2RlOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmKHN0ci5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIEwiIjsKLSAgICB9Ci0gICAgcmV0dXJuIHN0cjsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL3JlZmxvdy9yZWZsb3dlZHRleHRwYWdlLmggYi9jb3JlL3NyYy9yZWZsb3cvcmVmbG93ZWR0ZXh0cGFnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODhjZWVkLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL3JlZmxvdy9yZWZsb3dlZHRleHRwYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfU1JDX1JFRkxPV19SRUZMT1dFRFRFWFRQQUdFX0hfCi0jZGVmaW5lIENPUkVfU1JDX1JFRkxPV19SRUZMT1dFRFRFWFRQQUdFX0hfCi0KLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3JlZmxvdy9yZWZsb3dlbmdpbmUuaCIKLSNpbmNsdWRlICIuLi8uLi9zcmMvcmVmbG93L3JlZmxvd2VkcGFnZS5oIgotCi10eXBlZGVmIENGWF9TZWdtZW50ZWRBcnJheTxDUkZfQ2hhckRhdGEqPiBDUkZfQ2hhckRhdGFQdHJBcnJheTsKLXR5cGVkZWYgQ0ZYX1NlZ21lbnRlZEFycmF5PEZYX0lOVDMyPiBDRlhfQ291bnRCU0lOVDMyQXJyYXk7Ci1jbGFzcyBDUkZfVGV4dFBhZ2UgOiBwdWJsaWMgSVBERl9UZXh0UGFnZQotewotcHVibGljOgotICAgIENSRl9UZXh0UGFnZShJUERGX1JlZmxvd2VkUGFnZSogcFJlZlBhZ2UpOwotCi0gICAgdmlydHVhbCB+Q1JGX1RleHRQYWdlKCkgOwotICAgIEZYX0JPT0wJCQlQYXJzZVRleHRQYWdlKCk7Ci0gICAgdm9pZAkJCU5vcm1hbGl6ZU9iamVjdHMoRlhfQk9PTCBiTm9ybWFsaXplKQotICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH07Ci0KLSAgICBGWF9CT09MCQkJSXNQYXJzZXJlZCgpIGNvbnN0OwotcHVibGljOgotCi0gICAgaW50IENoYXJJbmRleEZyb21UZXh0SW5kZXgoaW50IFRleHRJbmRleCkgY29uc3Q7Ci0KLSAgICBpbnQgVGV4dEluZGV4RnJvbUNoYXJJbmRleChpbnQgQ2hhckluZGV4KSBjb25zdDsKLQotCi0gICAgaW50CQkJCUNvdW50Q2hhcnMoKSBjb25zdDsKLQotICAgIHZpcnR1YWwJdm9pZAlHZXRDaGFySW5mbyhpbnQgaW5kZXgsIEZQREZfQ0hBUl9JTkZPICYgaW5mbykgY29uc3Q7Ci0KLSAgICB2b2lkCQkJR2V0UmVjdEFycmF5KGludCBzdGFydCwgaW50IG5Db3VudCwgQ0ZYX1JlY3RBcnJheSYgcmVjdEFycmF5KSBjb25zdDsKLQotCi0gICAgaW50CQkJCUdldEluZGV4QXRQb3MoQ1BERl9Qb2ludCBwb2ludCwgRlhfRkxPQVQgeFRvcmVsYW5jZSwgRlhfRkxPQVQgeVRvcmVsYW5jZSkgY29uc3Q7Ci0KLSAgICBpbnQJCQkJR2V0SW5kZXhBdFBvcyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCBGWF9GTE9BVCB4VG9yZWxhbmNlLCBGWF9GTE9BVCB5VG9yZWxhbmNlKSBjb25zdDsKLQotICAgIHZpcnR1YWwJaW50CQkJCUdldE9yZGVyQnlEaXJlY3Rpb24oaW50IGluZGV4LCBpbnQgZGlyZWN0aW9uKSBjb25zdDsKLQotICAgIENGWF9XaWRlU3RyaW5nCUdldFRleHRCeVJlY3QoQ0ZYX0Zsb2F0UmVjdCByZWN0KSBjb25zdDsKLQotICAgIHZvaWQJCQlHZXRSZWN0c0FycmF5QnlSZWN0KENGWF9GbG9hdFJlY3QgcmVjdCwgQ0ZYX1JlY3RBcnJheSYgcmVzUmVjdEFycmF5KSBjb25zdDsKLQotCi0gICAgaW50CQkJCUNvdW50UmVjdHMoaW50IHN0YXJ0LCBpbnQgbkNvdW50KTsKLQotICAgIHZpcnR1YWwJdm9pZAkJCUdldFJlY3QoaW50IHJlY3RJbmRleCwgRlhfRkxPQVQmIGxlZnQsIEZYX0ZMT0FUJiB0b3AsIEZYX0ZMT0FUJiByaWdodCwgRlhfRkxPQVQgJmJvdHRvbSkgY29uc3Q7Ci0gICAgdmlydHVhbAlGWF9CT09MCQkJR2V0QmFzZWxpbmVSb3RhdGUoaW50IHJlY3RJbmRleCwgaW50JiBSb3RhdGUpOwotICAgIHZpcnR1YWwgRlhfQk9PTAkJCUdldEJhc2VsaW5lUm90YXRlKENGWF9GbG9hdFJlY3QgcmVjdCwgaW50JiBSb3RhdGUpOwotCi0gICAgdmlydHVhbAlpbnQJCQkJQ291bnRCb3VuZGVkU2VnbWVudHMoRlhfRkxPQVQgbGVmdCwgRlhfRkxPQVQgdG9wLCBGWF9GTE9BVCByaWdodCwgRlhfRkxPQVQgYm90dG9tLCBGWF9CT09MIGJDb250YWlucyA9IEZBTFNFKTsKLQotICAgIHZpcnR1YWwJdm9pZAkJCUdldEJvdW5kZWRTZWdtZW50KGludCBpbmRleCwgaW50JiBzdGFydCwgaW50JiBjb3VudCkgY29uc3Q7Ci0KLQotICAgIGludAkJCQlHZXRXb3JkQnJlYWsoaW50IGluZGV4LCBpbnQgZGlyZWN0aW9uKSBjb25zdDsKLQotICAgIENGWF9XaWRlU3RyaW5nCUdldFBhZ2VUZXh0KGludCBzdGFydCwgaW50IG5Db3VudCA9IC0xICkgY29uc3Q7Ci1wcml2YXRlOgotICAgIENQREZfUmVmbG93ZWRQYWdlKgkJbV9wUmVmUGFnZTsKLSAgICBDUkZfQ2hhckRhdGFQdHJBcnJheSoJbV9wRGF0YUxpc3Q7Ci0gICAgQ0ZYX1JlY3RBcnJheQkJCW1fcmVjdEFycmF5OwotICAgIENGWF9Db3VudEJTSU5UMzJBcnJheSoJbV9Db3VudEJTQXJyYXk7Ci19OwotCi0jZW5kaWYgIC8vIENPUkVfU1JDX1JFRkxPV19SRUZMT1dFRFRFWFRQQUdFX0hfCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9yZWZsb3cvcmVmbG93ZW5naW5lLmNwcCBiL2NvcmUvc3JjL3JlZmxvdy9yZWZsb3dlbmdpbmUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Zjc2NmNhLi4wMDAwMDAwCi0tLSBhL2NvcmUvc3JjL3JlZmxvdy9yZWZsb3dlbmdpbmUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcmVmbG93L3JlZmxvd2VuZ2luZS5oIgotI2luY2x1ZGUgInJlZmxvd2VkcGFnZS5oIgotSVBERl9SZWZsb3dlZFBhZ2UqIElQREZfUmVmbG93ZWRQYWdlOjpDcmVhdGUoKQotewotICAgIHJldHVybiBuZXcgQ1BERl9SZWZsb3dlZFBhZ2UoTlVMTCk7Ci19Ci1JUERGX1JlZmxvd2VkUGFnZSogQ3JlYXRlX1JlZmxvd1BhZ2UoKQotewotICAgIHJldHVybiBJUERGX1JlZmxvd2VkUGFnZTo6Q3JlYXRlKCk7Ci19Ci1JUERGX1Byb2dyZXNzaXZlUmVmbG93UGFnZVBhcnNlciogQ3JlYXRlX1JlZmxvd1BhZ2VQYXJzZXIoKQotewotICAgIHJldHVybiBJUERGX1Byb2dyZXNzaXZlUmVmbG93UGFnZVBhcnNlcjo6Q3JlYXRlKCk7Ci19Ci1JUERGX1Byb2dyZXNzaXZlUmVmbG93UGFnZVBhcnNlciogSVBERl9Qcm9ncmVzc2l2ZVJlZmxvd1BhZ2VQYXJzZXI6OkNyZWF0ZSgpCi17Ci0gICAgQ1BERl9Qcm9ncmVzc2l2ZVJlZmxvd1BhZ2VQYXJzZXIqIHBQYXJzZXIgPSBuZXcgQ1BERl9Qcm9ncmVzc2l2ZVJlZmxvd1BhZ2VQYXJzZXI7Ci0gICAgcFBhcnNlci0+SW5pdCgpOwotICAgIHJldHVybiBwUGFyc2VyOwotfQotSVBERl9Qcm9ncmVzc2l2ZVJlZmxvd1BhZ2VSZW5kZXIqIENyZWF0ZV9SZWZsb3dQYWdlUmVuZGVyKCkKLXsKLSAgICByZXR1cm4gSVBERl9Qcm9ncmVzc2l2ZVJlZmxvd1BhZ2VSZW5kZXI6OkNyZWF0ZSgpOwotfQotSVBERl9Qcm9ncmVzc2l2ZVJlZmxvd1BhZ2VSZW5kZXIqIElQREZfUHJvZ3Jlc3NpdmVSZWZsb3dQYWdlUmVuZGVyOjpDcmVhdGUoKQotewotICAgIHJldHVybiBuZXcgQ1BERl9Qcm9ncmVzc2l2ZVJlZmxvd1BhZ2VSZW5kZXI7Ci19CmRpZmYgLS1naXQgYS9kb2NzL09XTkVSUyBiL2RvY3MvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZThmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL09XTkVSUwpAQCAtMCwwICsxIEBACisqCmRpZmYgLS1naXQgYS9kb2NzL2RvY3VtZW50YXRpb24ubWQgYi9kb2NzL2RvY3VtZW50YXRpb24ubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM5MTA2NQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZG9jdW1lbnRhdGlvbi5tZApAQCAtMCwwICsxLDEwIEBACisjIEludHJvZHVjdGlvbgorCitGb3IgQVBJIGRvY3VtZW50YXRpb24sIHNlZQoraHR0cDovL2NkbjAxLmZveGl0c29mdHdhcmUuY29tL3B1Yi9mb3hpdC9tYW51YWwvZW51L0ZveGl0UERGX1NESzIwX0d1aWRlLnBkZgorCitZb3UgY2FuIHNlYXJjaCB0aGUgc291cmNlIGNvZGUgdGhyb3VnaAoraHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9jb2Rlc2VhcmNoI3NlYXJjaC8mcT1maWxlOnRoaXJkX3BhcnR5L3BkZml1bSZzcT1wYWNrYWdlOmNocm9taXVtJnR5cGU9Y3MKKworQSBzYW1wbGUgY29uc3VtZXIgb2YgdGhpcyBsaWJyYXJ5IGlzIENocm9taXVtJ3MgUERGIHBsdWdpbi4gWW91IGNhbiBzZWUgdGhlCitzb3VyY2UgZm9yIGl0IGF0IGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMvKy9tYXN0ZXIvcGRmLy4KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvQW5kcm9pZC5tayBiL2ZwZGZzZGsvQW5kcm9pZC5tawppbmRleCBiNDYyZjY0Li4xYjBmYzk4IDEwMDY0NAotLS0gYS9mcGRmc2RrL0FuZHJvaWQubWsKKysrIGIvZnBkZnNkay9BbmRyb2lkLm1rCkBAIC0xLDQzICsxLDcgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorQkFTRV9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiAKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gbGlicGRmaXVtCi0KLUxPQ0FMX0FSTV9NT0RFIDo9IGFybQotTE9DQUxfTkRLX1NUTF9WQVJJQU5UIDo9IGdudXN0bF9zdGF0aWMKLQotTE9DQUxfQ0ZMQUdTICs9IC1PMyAtZnN0cmljdC1hbGlhc2luZyAtZnByZWZldGNoLWxvb3AtYXJyYXlzIC1mZXhjZXB0aW9ucwotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbm9uLXZpcnR1YWwtZHRvciAtV2FsbAotTE9DQUxfQ0ZMQUdTICs9IC1ERk9YSVRfQ0hST01FX0JVSUxECi0KLSMgTWFzayBzb21lIHdhcm5pbmdzLiBUaGVzZSBhcmUgYmVuaWduLCBidXQgd2UgcHJvYmFibHkgd2FudCB0byBmaXggdGhlbQotIyB1cHN0cmVhbSBhdCBzb21lIHBvaW50LgotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tdW51c2VkLXBhcmFtZXRlciBcCi0gICAgICAgICAgICAgICAgLVduby1zaWduLWNvbXBhcmUKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJwZGZpdW1jb3JlCi0KLSMgVE9ETzogZmlndXJlIG91dCB3aHkgdHVybmluZyBvbiBleGNlcHRpb25zIHJlcXVpcmVzIG1hbnVhbGx5IGxpbmtpbmcgbGliZGwKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliZGwgbGliZnQyCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgc3JjL2ZwZGZkb2MuY3BwIFwKLSAgICBzcmMvZnBkZmVkaXRpbWcuY3BwIFwKLSAgICBzcmMvZnBkZmVkaXRwYWdlLmNwcCBcCi0gICAgc3JjL2ZwZGZwcG8uY3BwIFwKLSAgICBzcmMvZnBkZnNhdmUuY3BwIFwKLSAgICBzcmMvZnBkZnRleHQuY3BwIFwKLSAgICBzcmMvZnBkZnZpZXcuY3BwIFwKLSAgICBzcmMvZnBkZl9kYXRhYXZhaWwuY3BwIFwKLSAgICBzcmMvZnBkZl9leHQuY3BwIFwKLSAgICBzcmMvZnBkZl9mbGF0dGVuLmNwcCBcCi0gICAgc3JjL2ZwZGZfcHJvZ3Jlc3NpdmUuY3BwIFwKLSAgICBzcmMvZnBkZl9zZWFyY2hleC5jcHAgXAotICAgIHNyYy9mcGRmX3RyYW5zZm9ybXBhZ2UuY3BwIFwKLSAgICBzcmMvZnNka19yZW5kZXJjb250ZXh0LmNwcAotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICBleHRlcm5hbC9wZGZpdW0vY29yZS9pbmNsdWRlCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKK2luY2x1ZGUgJChCQVNFX1BBVEgpL3BkZml1bS5taworaW5jbHVkZSAkKEJBU0VfUEFUSCkvcGRmaXVtZm9ybWZpbGxlci5taworaW5jbHVkZSAkKEJBU0VfUEFUSCkvcGRmaXVtZnhlZGl0Lm1rCitpbmNsdWRlICQoQkFTRV9QQVRIKS9wZGZpdW1qYXZhc2NyaXB0Lm1rCitpbmNsdWRlICQoQkFTRV9QQVRIKS9wZGZpdW1wZGZ3aW5kb3cubWsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvREVQUyBiL2ZwZGZzZGsvREVQUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODhhMzk2Ci0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9ERVBTCkBAIC0wLDAgKzEsNyBAQAoraW5jbHVkZV9ydWxlcyA9IFsKKyAgJytjb3JlL2luY2x1ZGUnLAorICAnK2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCcsCisgICcrcHVibGljJywKKyAgJyt2OCcsCisgICcreGZhL2luY2x1ZGUnLAorXQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NCQV9Gb250bWFwLmggYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfQ0JBX0ZvbnRtYXAuaAppbmRleCA1ZTU5NjY1Li5jM2UyZTk5IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfQ0JBX0ZvbnRtYXAuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfQ0JBX0ZvbnRtYXAuaApAQCAtMSw1MCArMSw0NiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIEZQREZTREtfSU5DTFVERV9GT1JNRklMTEVSX0ZGTF9DQkFfRk9OVE1BUF9IXwogI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfRk9STUZJTExFUl9GRkxfQ0JBX0ZPTlRNQVBfSF8KIAotI2luY2x1ZGUgIi4uL3BkZndpbmRvdy9QV0xfRm9udE1hcC5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ZvbnRNYXAuaCIKIAogY2xhc3MgQ1BERl9EaWN0aW9uYXJ5OwogY2xhc3MgQ1BERlNES19Bbm5vdDsKIAotY2xhc3MgQ0JBX0ZvbnRNYXAgOiBwdWJsaWMgQ1BXTF9Gb250TWFwCi17Ci1wdWJsaWM6Ci0JQ0JBX0ZvbnRNYXAoQ1BERlNES19Bbm5vdCogcEFubm90LCBJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpOwotCUNCQV9Gb250TWFwKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0LCBJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpOworY2xhc3MgQ0JBX0ZvbnRNYXAgOiBwdWJsaWMgQ1BXTF9Gb250TWFwIHsKKyBwdWJsaWM6CisgIENCQV9Gb250TWFwKENQREZTREtfQW5ub3QqIHBBbm5vdCwgSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyKTsKKyAgfkNCQV9Gb250TWFwKCkgb3ZlcnJpZGU7CiAKLQl2aXJ0dWFsIH5DQkFfRm9udE1hcCgpOworICB2b2lkIFNldERlZmF1bHRGb250KENQREZfRm9udCogcEZvbnQsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUpOwogCi0JdmlydHVhbCB2b2lkCQkJCUluaXRpYWwoRlhfTFBDU1RSIGZvbnRuYW1lID0gTlVMTCk7CisgIHZvaWQgUmVzZXQoKTsKKyAgdm9pZCBTZXRBUFR5cGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNBUFR5cGUpOwogCi1wdWJsaWM6Ci0Jdm9pZAkJCQkJCVNldERlZmF1bHRGb250KENQREZfRm9udCAqIHBGb250LCBjb25zdCBDRlhfQnl0ZVN0cmluZyAmIHNGb250TmFtZSk7CisgcHJpdmF0ZToKKyAgLy8gQ1BXTF9Gb250TWFwOgorICB2b2lkIEluaXRpYWxpemUoKSBvdmVycmlkZTsKKyAgQ1BERl9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBvdmVycmlkZTsKKyAgQ1BERl9Gb250KiBGaW5kRm9udFNhbWVDaGFyc2V0KENGWF9CeXRlU3RyaW5nJiBzRm9udEFsaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhcnNldCkgb3ZlcnJpZGU7CisgIHZvaWQgQWRkZWRGb250KENQREZfRm9udCogcEZvbnQsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udEFsaWFzKSBvdmVycmlkZTsKIAotCXZvaWQJCQkJCQlSZXNldCgpOwotCXZvaWQJCQkJCQlTZXRBUFR5cGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNBUFR5cGUpOworICBDUERGX0ZvbnQqIEZpbmRSZXNGb250U2FtZUNoYXJzZXQoQ1BERl9EaWN0aW9uYXJ5KiBwUmVzRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzRm9udEFsaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhcnNldCk7CisgIENQREZfRm9udCogR2V0QW5ub3REZWZhdWx0Rm9udChDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKKyAgdm9pZCBBZGRGb250VG9Bbm5vdERpY3QoQ1BERl9Gb250KiBwRm9udCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNBbGlhcyk7CiAKLXByb3RlY3RlZDoKLQl2aXJ0dWFsIENQREZfRm9udCoJCQlGaW5kRm9udFNhbWVDaGFyc2V0KENGWF9CeXRlU3RyaW5nJiBzRm9udEFsaWFzLCBGWF9JTlQzMiBuQ2hhcnNldCk7Ci0JdmlydHVhbCB2b2lkCQkJCUFkZGVkRm9udChDUERGX0ZvbnQqIHBGb250LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcyk7Ci0JdmlydHVhbCBDUERGX0RvY3VtZW50KgkJR2V0RG9jdW1lbnQoKTsKLXByaXZhdGU6Ci0JQ1BERl9Gb250KgkJCQkJRmluZFJlc0ZvbnRTYW1lQ2hhcnNldChDUERGX0RpY3Rpb25hcnkqIHBSZXNEaWN0LCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcywKLQkJCQkJCQkJCUZYX0lOVDMyIG5DaGFyc2V0KTsKLQlDUERGX0ZvbnQqCQkJCQlHZXRBbm5vdERlZmF1bHRGb250KENGWF9CeXRlU3RyaW5nICZjc05hbWVUYWcpOwotCXZvaWQJCQkJCQlBZGRGb250VG9Bbm5vdERpY3QoQ1BERl9Gb250KiBwRm9udCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNBbGlhcyk7Ci0KLXByaXZhdGU6Ci0JQ1BERl9Eb2N1bWVudCoJCQkJbV9wRG9jdW1lbnQ7Ci0JQ1BERl9EaWN0aW9uYXJ5KgkJCW1fcEFubm90RGljdDsKLQlDUERGX0ZvbnQqCQkJCQltX3BEZWZhdWx0Rm9udDsKLQlDRlhfQnl0ZVN0cmluZwkJCQltX3NEZWZhdWx0Rm9udE5hbWU7Ci0JCi0JQ0ZYX0J5dGVTdHJpbmcJCQkJbV9zQVBUeXBlOworICBDUERGX0RvY3VtZW50KiBtX3BEb2N1bWVudDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BBbm5vdERpY3Q7CisgIENQREZfRm9udCogbV9wRGVmYXVsdEZvbnQ7CisgIENGWF9CeXRlU3RyaW5nIG1fc0RlZmF1bHRGb250TmFtZTsKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9zQVBUeXBlOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfRk9STUZJTExFUl9GRkxfQ0JBX0ZPTlRNQVBfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9DaGVja0JveC5oIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NoZWNrQm94LmgKaW5kZXggYmFjMWI5My4uMjdhZjE2YiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NoZWNrQm94LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NoZWNrQm94LmgKQEAgLTEsNyArMSw3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgRlBERlNES19JTkNMVURFX0ZPUk1GSUxMRVJfRkZMX0NIRUNLQk9YX0hfCkBAIC05LDIxICs5LDI0IEBACiAKICNpbmNsdWRlICJGRkxfRm9ybUZpbGxlci5oIgogCi1jbGFzcyBDRkZMX0NoZWNrQm94IDogcHVibGljIENGRkxfQnV0dG9uCi17Ci1wdWJsaWM6Ci0JQ0ZGTF9DaGVja0JveChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX1dpZGdldCogcFdpZGdldCk7Ci0JdmlydHVhbCB+Q0ZGTF9DaGVja0JveCgpOworY2xhc3MgQ0ZGTF9DaGVja0JveCA6IHB1YmxpYyBDRkZMX0J1dHRvbiB7CisgcHVibGljOgorICBDRkZMX0NoZWNrQm94KENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KTsKKyAgfkNGRkxfQ2hlY2tCb3goKSBvdmVycmlkZTsKIAotCXZpcnR1YWwgQ1BXTF9XbmQqCQkJTmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7Ci0KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuS2V5Q29kZSwgRlhfVUlOVCBuRmxhZ3MpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCi0JdmlydHVhbCBGWF9CT09MCQkJCUlzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKLQl2aXJ0dWFsIHZvaWQJCQkJU2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKyAgLy8gQ0ZGTF9CdXR0b24KKyAgQ1BXTF9XbmQqIE5ld1BERldpbmRvdyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgb3ZlcnJpZGU7CisgIEZYX0JPT0wgT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuS2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MpIG92ZXJyaWRlOworICBGWF9CT09MIE9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBvdmVycmlkZTsKKyAgRlhfQk9PTCBJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgb3ZlcnJpZGU7CisgIHZvaWQgU2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSBvdmVycmlkZTsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0ZPUk1GSUxMRVJfRkZMX0NIRUNLQk9YX0hfCi0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Db21ib0JveC5oIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NvbWJvQm94LmgKaW5kZXggNTJmY2ViZC4uNWMzNjc3OSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NvbWJvQm94LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NvbWJvQm94LmgKQEAgLTEsNzIgKzEsNzAgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBGUERGU0RLX0lOQ0xVREVfRk9STUZJTExFUl9GRkxfQ09NQk9CT1hfSF8KICNkZWZpbmUgRlBERlNES19JTkNMVURFX0ZPUk1GSUxMRVJfRkZMX0NPTUJPQk9YX0hfCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyaW5nLmgiCiAjaW5jbHVkZSAiRkZMX0Zvcm1GaWxsZXIuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyaW5nLmgiCiAKIGNsYXNzIENCQV9Gb250TWFwOwogY2xhc3MgQ1BERlNES19Eb2N1bWVudDsKIAotc3RydWN0IEZGTF9Db21ib0JveFN0YXRlCi17Ci0JaW50IG5JbmRleDsKLQlpbnQgblN0YXJ0OwotCWludCBuRW5kOwotCUNGWF9XaWRlU3RyaW5nIHNWYWx1ZTsKK3N0cnVjdCBGRkxfQ29tYm9Cb3hTdGF0ZSB7CisgIGludCBuSW5kZXg7CisgIGludCBuU3RhcnQ7CisgIGludCBuRW5kOworICBDRlhfV2lkZVN0cmluZyBzVmFsdWU7CiB9OwogCi1jbGFzcyBDRkZMX0NvbWJvQm94IDogcHVibGljIENGRkxfRm9ybUZpbGxlciwgcHVibGljIElQV0xfRm9jdXNIYW5kbGVyLCBwdWJsaWMgSVBXTF9FZGl0X05vdGlmeQotewotcHVibGljOgotCUNGRkxfQ29tYm9Cb3goQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19Bbm5vdCogcFdpZGdldCk7Ci0JdmlydHVhbCB+Q0ZGTF9Db21ib0JveCgpOwotCQotCXZpcnR1YWwJUFdMX0NSRUFURVBBUkFNCQlHZXRDcmVhdGVQYXJhbSgpOwotCXZpcnR1YWwgQ1BXTF9XbmQqCQkJTmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CitjbGFzcyBDRkZMX0NvbWJvQm94IDogcHVibGljIENGRkxfRm9ybUZpbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSVBXTF9Gb2N1c0hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgcHVibGljIElQV0xfRWRpdF9Ob3RpZnkgeworIHB1YmxpYzoKKyAgQ0ZGTF9Db21ib0JveChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwV2lkZ2V0KTsKKyAgfkNGRkxfQ29tYm9Cb3goKSBvdmVycmlkZTsKIAotCQotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncyk7Ci0JCi0JdmlydHVhbCBGWF9CT09MCQkJCUlzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKLQl2aXJ0dWFsIHZvaWQJCQkJU2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKLQkKLSAJdmlydHVhbCB2b2lkCQkJCUdldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIFBERlNES19GaWVsZEFjdGlvbiYgZmEpOwotIAl2aXJ0dWFsIHZvaWQJCQkJU2V0QWN0aW9uRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSk7Ci0gCXZpcnR1YWwgRlhfQk9PTAkJCQlJc0FjdGlvbkRhdGFDaGFuZ2VkKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU9sZCwgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU5ldyk7Ci0JdmlydHVhbCB2b2lkCQkJCVNhdmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwotCXZpcnR1YWwgdm9pZAkJCQlSZXN0b3JlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKLQkKLQl2aXJ0dWFsIENQV0xfV25kKgkJCVJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCBiUmVzdG9yZVZhbHVlKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25LZXlTdHJva2UoRlhfQk9PTCBiS2V5RG93biwgRlhfVUlOVCBuRmxhZyk7Ci0JCi1wdWJsaWM6Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2V0Rm9jdXMoQ1BXTF9XbmQqIHBXbmQpOwotCXZpcnR1YWwgdm9pZAkJCQlPbktpbGxGb2N1cyhDUFdMX1duZCogcFduZCk7Ci0JCi1wdWJsaWM6Ci0JdmlydHVhbCB2b2lkCQkJCU9uQWRkVW5kbyhDUFdMX0VkaXQqIHBFZGl0KTsKLQkKLXB1YmxpYzoKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQ2FuQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOyAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQ2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7IAotCXZpcnR1YWwgRlhfQk9PTAkJCQlDYW5QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOyAKLQkKLQl2aXJ0dWFsIHZvaWQJCQkJRG9Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7IAotCXZpcnR1YWwgdm9pZAkJCQlEb0N1dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOyAKLQl2aXJ0dWFsIHZvaWQJCQkJRG9QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOyAKLQkKLXByaXZhdGU6Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJR2V0U2VsZWN0RXhwb3J0VGV4dCgpOworICAvLyBDRkZMX0Zvcm1GaWxsZXI6CisgIFBXTF9DUkVBVEVQQVJBTSBHZXRDcmVhdGVQYXJhbSgpIG92ZXJyaWRlOworICBDUFdMX1duZCogTmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSBvdmVycmlkZTsKKyAgRlhfQk9PTCBPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncykgb3ZlcnJpZGU7CisgIEZYX0JPT0wgSXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIG92ZXJyaWRlOworICB2b2lkIFNhdmVEYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgb3ZlcnJpZGU7CisgIHZvaWQgR2V0QWN0aW9uRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24mIGZhKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmEpIG92ZXJyaWRlOworICBGWF9CT09MIElzQWN0aW9uRGF0YUNoYW5nZWQoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFOZXcpIG92ZXJyaWRlOworICB2b2lkIFNhdmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIG92ZXJyaWRlOworICB2b2lkIFJlc3RvcmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIG92ZXJyaWRlOworICBDUFdMX1duZCogUmVzZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVzdG9yZVZhbHVlKSBvdmVycmlkZTsKIAotcHJpdmF0ZToKLQlDQkFfRm9udE1hcCoJCQkJbV9wRm9udE1hcDsKLQlGRkxfQ29tYm9Cb3hTdGF0ZQkJCQltX1N0YXRlOworICAvLyBJUFdMX0ZvY3VzSGFuZGxlcjoKKyAgdm9pZCBPblNldEZvY3VzKENQV0xfV25kKiBwV25kKSBvdmVycmlkZTsKKyAgdm9pZCBPbktpbGxGb2N1cyhDUFdMX1duZCogcFduZCkgb3ZlcnJpZGU7CisKKyAgLy8gSVBXTF9FZGl0X05vdGlmeToKKyAgdm9pZCBPbkFkZFVuZG8oQ1BXTF9FZGl0KiBwRWRpdCkgb3ZlcnJpZGU7CisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICAvLyBDRkZMX0Zvcm1GaWxsZXI6CisgIEZYX0JPT0wgSXNGaWVsZEZ1bGwoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSBvdmVycmlkZTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworIHByaXZhdGU6CisgIENGWF9XaWRlU3RyaW5nIEdldFNlbGVjdEV4cG9ydFRleHQoKTsKKworICBDQkFfRm9udE1hcCogbV9wRm9udE1hcDsKKyAgRkZMX0NvbWJvQm94U3RhdGUgbV9TdGF0ZTsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0ZPUk1GSUxMRVJfRkZMX0NPTUJPQk9YX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5oIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuaAppbmRleCAyNTkyOWU0Li5jYjE0Mzk3IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Gb3JtRmlsbGVyLmgKQEAgLTEsMTc2ICsxLDE5OSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIEZQREZTREtfSU5DTFVERV9GT1JNRklMTEVSX0ZGTF9GT1JNRklMTEVSX0hfCiAjZGVmaW5lIEZQREZTREtfSU5DTFVERV9GT1JNRklMTEVSX0ZGTF9GT1JNRklMTEVSX0hfCiAKLSNpbmNsdWRlICJGRkxfSUZvcm1GaWxsZXIuaCIKLSNpbmNsdWRlICJGRkxfQ0JBX0ZvbnRtYXAuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfQ0JBX0ZvbnRtYXAuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfSUZvcm1GaWxsZXIuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnNka19iYXNlZm9ybS5oIgogCi1jbGFzcyBDUERGU0RLX0Fubm90OwotY2xhc3MgQ0ZGTF9Gb3JtRmlsbGVyOwotY2xhc3MgQ0ZGTF9Ob3RpZnk7CiBjbGFzcyBDUERGRG9jX0Vudmlyb25tZW50OwotY2xhc3MgQ1BERlNES19QYWdlVmlldzsKK2NsYXNzIENQREZTREtfQW5ub3Q7CiBjbGFzcyBDUERGU0RLX0RvY3VtZW50OworY2xhc3MgQ1BERlNES19QYWdlVmlldzsKIGNsYXNzIENQREZTREtfV2lkZ2V0OwogCitjbGFzcyBDRkZMX0Zvcm1GaWxsZXIgOiBwdWJsaWMgSVBXTF9Qcm92aWRlciwgcHVibGljIENQV0xfVGltZXJIYW5kbGVyIHsKKyBwdWJsaWM6CisgIENGRkxfRm9ybUZpbGxlcihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOworICB+Q0ZGTF9Gb3JtRmlsbGVyKCkgb3ZlcnJpZGU7CiAKLSNkZWZpbmUgQ0ZGTF9QYWdlVmlldzJQREZXaW5kb3cJCUNGWF9NYXBQdHJUZW1wbGF0ZTxDUERGU0RLX1BhZ2VWaWV3KiwgQ1BXTF9XbmQqPgorICB2aXJ0dWFsIEZYX1JFQ1QgR2V0Vmlld0JCb3goQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90KTsKKyAgdmlydHVhbCB2b2lkIE9uRHJhdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpOworICB2aXJ0dWFsIHZvaWQgT25EcmF3RGVhY3RpdmUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpOwogCi1zdHJ1Y3QgRkZMX0tleVN0cm9rZURhdGEKLXsKLQlDRlhfV2lkZVN0cmluZwkJc3dWYWx1ZTsKLQlGWF9CT09MCQkJCWJGdWxsOwotCWludAkJCQkJblNlbFN0YXJ0OwotCWludAkJCQkJblNlbEVuZDsKKyAgdmlydHVhbCB2b2lkIE9uQ3JlYXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCk7CisgIHZpcnR1YWwgdm9pZCBPbkxvYWQoQ1BERlNES19Bbm5vdCogcEFubm90KTsKKyAgdmlydHVhbCB2b2lkIE9uRGVsZXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCk7CisKKyAgdmlydHVhbCB2b2lkIE9uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCk7CisgIHZpcnR1YWwgdm9pZCBPbk1vdXNlRXhpdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCk7CisKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICB2aXJ0dWFsIEZYX0JPT0wgT25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZpcnR1YWwgRlhfQk9PTCBPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKworICB2aXJ0dWFsIEZYX0JPT0wgT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5LZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKTsKKworICB2b2lkIFNldEZvY3VzRm9yQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnKTsKKyAgdm9pZCBLaWxsRm9jdXNGb3JBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWcpOworCisgIC8vIENQV0xfVGltZXJIYW5kbGVyCisgIHZvaWQgVGltZXJQcm9jKCkgb3ZlcnJpZGU7CisgIElGWF9TeXN0ZW1IYW5kbGVyKiBHZXRTeXN0ZW1IYW5kbGVyKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8gSVBXTF9Qcm92aWRlcgorICBDRlhfTWF0cml4IEdldFdpbmRvd01hdHJpeCh2b2lkKiBwQXR0YWNoZWREYXRhKSBvdmVycmlkZTsKKyAgQ0ZYX1dpZGVTdHJpbmcgTG9hZFBvcHVwTWVudVN0cmluZyhpbnQgbkluZGV4KSBvdmVycmlkZTsKKworICB2aXJ0dWFsIHZvaWQgR2V0QWN0aW9uRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSk7CisgIHZpcnR1YWwgdm9pZCBTZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhKTsKKyAgdmlydHVhbCBGWF9CT09MIElzQWN0aW9uRGF0YUNoYW5nZWQoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhTmV3KTsKKworICB2aXJ0dWFsIHZvaWQgU2F2ZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CisgIHZpcnR1YWwgdm9pZCBSZXN0b3JlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKworICB2aXJ0dWFsIENQV0xfV25kKiBSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSk7CisKKyAgQ0ZYX01hdHJpeCBHZXRDdXJNYXRyaXgoKTsKKworICBDUERGX1JlY3QgRkZMdG9QV0woY29uc3QgQ1BERl9SZWN0JiByZWN0KTsKKyAgQ1BERl9SZWN0IFBXTHRvRkZMKGNvbnN0IENQREZfUmVjdCYgcmVjdCk7CisgIENQREZfUG9pbnQgRkZMdG9QV0woY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICBDUERGX1BvaW50IFBXTHRvRkZMKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKworICBDUERGX1BvaW50IFduZHRvUFdMKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgY29uc3QgQ1BERl9Qb2ludCYgcHQpOworICBDUERGX1JlY3QgRkZMdG9XbmQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBjb25zdCBDUERGX1JlY3QmIHJlY3QpOworCisgIHZvaWQgU2V0V2luZG93UmVjdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGNvbnN0IENQREZfUmVjdCYgcmNXaW5kb3cpOworICBDUERGX1JlY3QgR2V0V2luZG93UmVjdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworCisgIEZYX0JPT0wgQ29tbWl0RGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX1VJTlQgbkZsYWcpOworICB2aXJ0dWFsIEZYX0JPT0wgSXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworICB2aXJ0dWFsIHZvaWQgU2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIHZpcnR1YWwgRlhfQk9PTCBJc0ZpZWxkRnVsbChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCisgIENQV0xfV25kKiBHZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MIGJOZXcpOworICB2b2lkIERlc3Ryb3lQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKyAgdm9pZCBFc2NhcGVGaWxsZXIoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MIGJEZXN0cm95UERGV2luZG93KTsKKworICB2aXJ0dWFsIFBXTF9DUkVBVEVQQVJBTSBHZXRDcmVhdGVQYXJhbSgpOworICB2aXJ0dWFsIENQV0xfV25kKiBOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgPSAwOworICB2aXJ0dWFsIENQREZfUmVjdCBHZXRGb2N1c0JveChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworCisgIEZYX0JPT0wgSXNWYWxpZCgpIGNvbnN0OworICBDUERGX1JlY3QgR2V0UERGV2luZG93UmVjdCgpIGNvbnN0OworCisgIENQREZTREtfUGFnZVZpZXcqIEdldEN1clBhZ2VWaWV3KCk7CisgIHZvaWQgU2V0Q2hhbmdlTWFyaygpOworCisgIHZpcnR1YWwgdm9pZCBJbnZhbGlkYXRlUmVjdChkb3VibGUgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYm90dG9tKTsKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogR2V0QXBwKCkgeyByZXR1cm4gbV9wQXBwOyB9CisgIENQREZTREtfQW5ub3QqIEdldFNES0Fubm90KCkgeyByZXR1cm4gbV9wQW5ub3Q7IH0KKworIHByb3RlY3RlZDoKKyAgdXNpbmcgQ0ZGTF9QYWdlVmlldzJQREZXaW5kb3cgPSBzdGQ6Om1hcDxDUERGU0RLX1BhZ2VWaWV3KiwgQ1BXTF9XbmQqPjsKKworICBDUERGRG9jX0Vudmlyb25tZW50KiBtX3BBcHA7CisgIENQREZTREtfV2lkZ2V0KiBtX3BXaWRnZXQ7CisgIENQREZTREtfQW5ub3QqIG1fcEFubm90OworCisgIEZYX0JPT0wgbV9iVmFsaWQ7CisgIENGRkxfUGFnZVZpZXcyUERGV2luZG93IG1fTWFwczsKKyAgQ1BERl9Qb2ludCBtX3B0T2xkUG9zOwogfTsKIAorY2xhc3MgQ0ZGTF9CdXR0b24gOiBwdWJsaWMgQ0ZGTF9Gb3JtRmlsbGVyIHsKKyBwdWJsaWM6CisgIENGRkxfQnV0dG9uKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsIENQREZTREtfQW5ub3QqIHBXaWRnZXQpOworICB+Q0ZGTF9CdXR0b24oKSBvdmVycmlkZTsKIAorICAvLyBDRkZMX0Zvcm1GaWxsZXIKKyAgdm9pZCBPbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QpIG92ZXJyaWRlOworICB2b2lkIE9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KSBvdmVycmlkZTsKKyAgRlhfQk9PTCBPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIG92ZXJyaWRlOworICBGWF9CT09MIE9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIG92ZXJyaWRlOworICBGWF9CT09MIE9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIG92ZXJyaWRlOworICB2b2lkIE9uRHJhdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKSBvdmVycmlkZTsKKyAgdm9pZCBPbkRyYXdEZWFjdGl2ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpIG92ZXJyaWRlOwogCi1jbGFzcyBDRkZMX0Zvcm1GaWxsZXIgOiAvKnB1YmxpYyBJQkFfQW5ub3RGaWxsZXIsKi8gcHVibGljIElQV0xfUHJvdmlkZXIsIHB1YmxpYyBDUFdMX1RpbWVySGFuZGxlcgotewotcHVibGljOgotCUNGRkxfRm9ybUZpbGxlcihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOwotCXZpcnR1YWwgfkNGRkxfRm9ybUZpbGxlcigpOwotCi0JdmlydHVhbCBGWF9SRUNUCQkJCUdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25EcmF3KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgLypIREMgaERDLCovIENQREZTREtfQW5ub3QqIHBBbm5vdCwgCi0JCQkJCQkJCQlDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAotCQkJCQkJCQkJLypjb25zdCBDUmVjdCYgcmNXaW5kb3csICovRlhfRFdPUkQgZHdGbGFncyk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRHJhd0RlYWN0aXZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgLypIREMgaERDLCovIENQREZTREtfQW5ub3QqIHBBbm5vdCwgCi0JCQkJCQkJCUNGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0JCQkJCQkJCS8qY29uc3QgQ1JlY3QmIHJjV2luZG93LCAqL0ZYX0RXT1JEIGR3RmxhZ3MpOwotCi0JdmlydHVhbCB2b2lkCQkJCU9uQ3JlYXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uTG9hZChDUERGU0RLX0Fubm90KiBwQW5ub3QpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkRlbGV0ZShDUERGU0RLX0Fubm90KiBwQW5ub3QpOwotCi0JdmlydHVhbCB2b2lkCQkJCU9uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KTsKLQotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPblJCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuS2V5Q29kZSwgRlhfVUlOVCBuRmxhZ3MpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncyk7Ci0KLQl2aXJ0dWFsCXZvaWQJCQkJT25EZVNlbGVjdGVkKENQREZTREtfQW5ub3QqIHBBbm5vdCk7Ci0JdmlydHVhbAl2b2lkCQkJCU9uU2VsZWN0ZWQoQ1BERlNES19Bbm5vdCogcEFubm90KTsKLQotCXZpcnR1YWwgRlhfQk9PTAkJCQlPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZyk7Ci0KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQ2FuQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOyAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQ2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7IAotCXZpcnR1YWwgRlhfQk9PTAkJCQlDYW5QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOyAKLQotCXZpcnR1YWwgdm9pZAkJCQlEb0NvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsgCi0JdmlydHVhbCB2b2lkCQkJCURvQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7IAotCXZpcnR1YWwgdm9pZAkJCQlEb1Bhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7IAotCi1wdWJsaWM6IC8vQ1BXTF9UaW1lckhhbmRsZXIKLQl2aXJ0dWFsIHZvaWQJCQkJVGltZXJQcm9jKCk7Ci0JdmlydHVhbCBJRlhfU3lzdGVtSGFuZGxlcioJR2V0U3lzdGVtSGFuZGxlcigpIGNvbnN0OwotCi1wdWJsaWM6Ci0JdmlydHVhbCBDUERGX01hdHJpeAkJCUdldFdpbmRvd01hdHJpeCh2b2lkKiBwQXR0YWNoZWREYXRhKTsKLQl2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCQlMb2FkUG9wdXBNZW51U3RyaW5nKGludCBuSW5kZXgpOwotCi0gCXZpcnR1YWwgdm9pZAkJCQlHZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAotIAkJCQkJCQkJCVBERlNES19GaWVsZEFjdGlvbiYgZmEpOwotIAl2aXJ0dWFsIHZvaWQJCQkJU2V0QWN0aW9uRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgCi0gCQkJCQkJCQkJY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSk7Ci0gCXZpcnR1YWwgRlhfQk9PTAkJCQlJc0FjdGlvbkRhdGFDaGFuZ2VkKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU9sZCwgCi0gCQkJCQkJCQkJY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU5ldyk7Ci0KLQl2aXJ0dWFsIHZvaWQJCQkJU2F2ZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7Ci0JdmlydHVhbCB2b2lkCQkJCVJlc3RvcmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwotCi0JdmlydHVhbCBDUFdMX1duZCogCQkJUmVzZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MIGJSZXN0b3JlVmFsdWUpOwotCi0JdmlydHVhbCB2b2lkCQkJCU9uS2V5U3Ryb2tlKEZYX0JPT0wgYktleURvd24pOwotCi0JQ1BERl9NYXRyaXgJCQkJCUdldEN1ck1hdHJpeCgpOwotCi0JQ1BERl9SZWN0CQkJCQlGRkx0b1BXTChjb25zdCBDUERGX1JlY3QmIHJlY3QpOwotCUNQREZfUmVjdAkJCQkJUFdMdG9GRkwoY29uc3QgQ1BERl9SZWN0JiByZWN0KTsKLQlDUERGX1BvaW50CQkJCQlGRkx0b1BXTChjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JQ1BERl9Qb2ludAkJCQkJUFdMdG9GRkwoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCi0JQ1BERl9Qb2ludAkJCQkJV25kdG9QV0woQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBjb25zdCBDUERGX1BvaW50JiBwdCk7Ci0JQ1BERl9SZWN0CQkJCQlGRkx0b1duZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGNvbnN0IENQREZfUmVjdCYgcmVjdCk7Ci0KLQl2b2lkCQkJCQkJU2V0V2luZG93UmVjdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGNvbnN0IENQREZfUmVjdCYgcmNXaW5kb3cpOwotCUNQREZfUmVjdAkJCQkJR2V0V2luZG93UmVjdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwotCi0Jc3RhdGljIHZvaWQJCQkJCUZGTF9GcmVlRGF0YSh2b2lkKiBwRGF0YSk7Ci0KLQlGWF9CT09MCQkJCQkJQ29tbWl0RGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX1VJTlQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7Ci0JdmlydHVhbCB2b2lkCQkJCVNhdmVEYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7Ci0KLQl2aXJ0dWFsIHZvaWQJCQkJR2V0S2V5U3Ryb2tlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZGTF9LZXlTdHJva2VEYXRhJiBkYXRhKTsKLQotcHVibGljOgotCUNQV0xfV25kKgkJCQkJR2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCBiTmV3KTsKLQl2b2lkCQkJCQkJRGVzdHJveVBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwotCXZvaWQJCQkJCQlFc2NhcGVGaWxsZXIoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MIGJEZXN0cm95UERGV2luZG93KTsKLQotCXZpcnR1YWwJUFdMX0NSRUFURVBBUkFNCQlHZXRDcmVhdGVQYXJhbSgpOwotCXZpcnR1YWwgQ1BXTF9XbmQqCQkJTmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgPSAwOwotCXZpcnR1YWwgQ1BERl9SZWN0CQkJR2V0Rm9jdXNCb3goQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKLQotcHVibGljOgotCUZYX0JPT0wJCQkJCQlJc1ZhbGlkKCkgY29uc3Q7Ci0JQ1BERl9SZWN0CQkJCQlHZXRQREZXaW5kb3dSZWN0KCkgY29uc3Q7Ci0KLQlDUERGU0RLX1BhZ2VWaWV3KgkJCUdldEN1clBhZ2VWaWV3KCk7Ci0Jdm9pZAkJCQkJCVNldENoYW5nZU1hcmsoKTsKLQotCXZpcnR1YWwgdm9pZAkJCQlJbnZhbGlkYXRlUmVjdChkb3VibGUgbGVmdCwgZG91YmxlIHRvcCwgZG91YmxlIHJpZ2h0LCBkb3VibGUgYm90dG9tKTsKLQlDUERGRG9jX0Vudmlyb25tZW50KgkJR2V0QXBwKCl7cmV0dXJuIG1fcEFwcDt9Ci0JQ1BERlNES19Bbm5vdCoJCQkJR2V0U0RLQW5ub3QoKSB7cmV0dXJuIG1fcEFubm90O30JCi1wcm90ZWN0ZWQ6Ci0JQ1BERkRvY19FbnZpcm9ubWVudCoJCW1fcEFwcDsKLQlDUERGU0RLX1dpZGdldCoJCQkJbV9wV2lkZ2V0OwotCUNQREZTREtfQW5ub3QqCQkJCW1fcEFubm90OwotCi0JRlhfQk9PTAkJCQkJCW1fYlZhbGlkOwotCUNGRkxfUGFnZVZpZXcyUERGV2luZG93CQltX01hcHM7Ci0JQ1BERl9Qb2ludAkJCQkJbV9wdE9sZFBvczsKLX07Ci0KLWNsYXNzIENGRkxfQnV0dG9uIDogcHVibGljIENGRkxfRm9ybUZpbGxlcgotewotcHVibGljOgotCUNGRkxfQnV0dG9uKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsIENQREZTREtfQW5ub3QqIHBXaWRnZXQpOwotCXZpcnR1YWwgfkNGRkxfQnV0dG9uKCk7Ci0KLQl2aXJ0dWFsIHZvaWQJCQkJT25Nb3VzZUVudGVyKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRHJhdyhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcvKiwgSERDIGhEQyovLCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIAotCQkJCQkJCQlDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAotCQkJCQkJCQkvKmNvbnN0IENSZWN0JiByY1dpbmRvdywqLyBGWF9EV09SRCBkd0ZsYWdzKTsKLQotCXZpcnR1YWwJdm9pZAkJCQlPbkRyYXdEZWFjdGl2ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIC8qSERDIGhEQywqLyBDUERGU0RLX0Fubm90KiBwQW5ub3QsIAotCQkJCQkJCQlDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAotCQkJCQkJCQkvKmNvbnN0IENSZWN0JiByY1dpbmRvdywgKi9GWF9EV09SRCBkd0ZsYWdzKTsKLXByb3RlY3RlZDoKLQlGWF9CT09MCQkJCQkJbV9iTW91c2VJbjsKLQlGWF9CT09MCQkJCQkJbV9iTW91c2VEb3duOworIHByb3RlY3RlZDoKKyAgRlhfQk9PTCBtX2JNb3VzZUluOworICBGWF9CT09MIG1fYk1vdXNlRG93bjsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0ZPUk1GSUxMRVJfRkZMX0ZPUk1GSUxMRVJfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9JRm9ybUZpbGxlci5oIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmgKaW5kZXggY2NjZjg0Zi4uOTNlNzUwNSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmgKQEAgLTEsMTQ1ICsxLDE4NyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIEZQREZTREtfSU5DTFVERV9GT1JNRklMTEVSX0ZGTF9JRk9STUZJTExFUl9IXwogI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfRk9STUZJTExFUl9GRkxfSUZPUk1GSUxMRVJfSF8KIAotI2luY2x1ZGUgIkZvcm1GaWxsZXIuaCIKKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnNka19kZWZpbmUuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9FZGl0LmgiCiAKIGNsYXNzIENGRkxfRm9ybUZpbGxlcjsKIGNsYXNzIENGRkxfUHJpdmF0ZURhdGE7CitjbGFzcyBDUERGRG9jX0Vudmlyb25tZW50OworY2xhc3MgQ1BERlNES19Bbm5vdDsKK2NsYXNzIENQREZTREtfUGFnZVZpZXc7CitjbGFzcyBDUERGU0RLX1dpZGdldDsKIAotI2RlZmluZSBDRkZMX1dpZGdldDJGaWxsZXIJCUNGWF9NYXBQdHJUZW1wbGF0ZTxDUERGU0RLX0Fubm90KiwgQ0ZGTF9Gb3JtRmlsbGVyKj4KK2NsYXNzIENGRkxfSUZvcm1GaWxsZXIgOiBwdWJsaWMgSVBXTF9GaWxsZXJfTm90aWZ5IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENGRkxfSUZvcm1GaWxsZXIoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCk7CisgIH5DRkZMX0lGb3JtRmlsbGVyKCkgb3ZlcnJpZGU7CiAKLS8vICNkZWZpbmUgSXNBTFRwcmVzc2VkKCkJCQkoR2V0S2V5U3RhdGUoVktfTUVOVSkgPCAwKQotLy8gI2RlZmluZSBJc0NUUkxwcmVzc2VkKCkJCQkoR2V0S2V5U3RhdGUoVktfQ09OVFJPTCkgPCAwKQotLy8gI2RlZmluZSBJc1NISUZUcHJlc3NlZCgpCQkoR2V0S2V5U3RhdGUoVktfU0hJRlQpJjB4ODAwMCkKLS8vICNkZWZpbmUgSXNJTlNFUlRwcmVzc2VkKCkJCShHZXRLZXlTdGF0ZShWS19JTlNFUlQpICYgMHgwMSkJCi0vLyAjZGVmaW5lIFZLX1NISUZUICAgICAgICAgIDB4MTAKLS8vICNkZWZpbmUgVktfQ09OVFJPTCAgICAgICAgMHgxMQotLy8gI2RlZmluZSBWS19NRU5VICAgICAgICAgICAweDEyCi0vLyAjZGVmaW5lIFZLX1JFVFVSTiAgICAgICAgIDB4MEQKLS8vICNkZWZpbmUgVktfU1BBQ0UgICAgICAgICAgMHgyMAotLy8gI2RlZmluZSBWS19FU0NBUEUgICAgICAgICAweDFCCisgIHZpcnR1YWwgRlhfQk9PTCBBbm5vdF9IaXRUZXN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BvaW50IHBvaW50KTsKKyAgdmlydHVhbCBGWF9SRUNUIEdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCk7CisgIHZpcnR1YWwgdm9pZCBPbkRyYXcoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKTsKIAorICB2aXJ0dWFsIHZvaWQgT25DcmVhdGUoQ1BERlNES19Bbm5vdCogcEFubm90KTsKKyAgdmlydHVhbCB2b2lkIE9uTG9hZChDUERGU0RLX0Fubm90KiBwQW5ub3QpOworICB2aXJ0dWFsIHZvaWQgT25EZWxldGUoQ1BERlNES19Bbm5vdCogcEFubm90KTsKIAorICB2aXJ0dWFsIHZvaWQgT25Nb3VzZUVudGVyKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZyk7CisgIHZpcnR1YWwgdm9pZCBPbk1vdXNlRXhpdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFnKTsKIAotY2xhc3MgQ0ZGTF9JRm9ybUZpbGxlciA6LyogcHVibGljIElCQV9Bbm5vdEZpbGxlciwgKi9wdWJsaWMgSVBXTF9GaWxsZXJfTm90aWZ5Ly8sIAotLy8JcHVibGljIElVbmRvX0V2ZW50SGFuZGxlciwgcHVibGljIElDbGlwYm9hcmRfSGFuZGxlcgotewotcHVibGljOgotCUNGRkxfSUZvcm1GaWxsZXIoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCk7Ci0JdmlydHVhbCB+Q0ZGTF9JRm9ybUZpbGxlcigpOworICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICB2aXJ0dWFsIEZYX0JPT0wgT25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCB6RGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICB2aXJ0dWFsIEZYX0JPT0wgT25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCUFubm90X0hpdFRlc3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LENQREZTREtfQW5ub3QqIHBBbm5vdCwgQ1BERl9Qb2ludCBwb2ludCk7Ci0JdmlydHVhbCBGWF9SRUNUCQkJCUdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25EcmF3KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgLypIREMgaERDLCovIENQREZTREtfQW5ub3QqIHBBbm5vdCwgCi0JCQkJCQkJCQlDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAotCQkJCQkJCQkJLypjb25zdCBDUmVjdCYgcmNXaW5kb3csKi8gRlhfRFdPUkQgZHdGbGFncyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbktleUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MpOworICB2aXJ0dWFsIEZYX0JPT0wgT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpOwogCisgIHZpcnR1YWwgRlhfQk9PTCBPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWcpOwogCi0JdmlydHVhbCB2b2lkCQkJCU9uQ3JlYXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uTG9hZChDUERGU0RLX0Fubm90KiBwQW5ub3QpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkRlbGV0ZShDUERGU0RLX0Fubm90KiBwQW5ub3QpOworICBDRkZMX0Zvcm1GaWxsZXIqIEdldEZvcm1GaWxsZXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9CT09MIGJSZWdpc3Rlcik7CisgIHZvaWQgUmVtb3ZlRm9ybUZpbGxlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpOwogCi0JdmlydHVhbCB2b2lkCQkJCU9uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZyk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnKTsKKyAgc3RhdGljIEZYX0JPT0wgSXNWaXNpYmxlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KTsKKyAgc3RhdGljIEZYX0JPT0wgSXNSZWFkT25seShDUERGU0RLX1dpZGdldCogcFdpZGdldCk7CisgIHN0YXRpYyBGWF9CT09MIElzRmlsbGluZ0FsbG93ZWQoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQpOworICBzdGF0aWMgRlhfQk9PTCBJc1ZhbGlkQW5ub3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90KTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPblJCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZvaWQgT25LZXlTdHJva2VDb21taXQoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZyk7CisgIHZvaWQgT25WYWxpZGF0ZShDUERGU0RLX1dpZGdldCogcFdpZGdldCwKKyAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSQywKKyAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbktleUNvZGUsIEZYX1VJTlQgbkZsYWdzKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpOworICB2b2lkIE9uQ2FsY3VsYXRlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRXhpdCwKKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZyk7CisgIHZvaWQgT25Gb3JtYXQoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsCisgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKTsKKyAgdm9pZCBPbkJ1dHRvblVwKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlJlc2V0LAorICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkV4aXQsCisgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFnKTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICB2b2lkIE9uQ2xpY2soQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsCisgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICBGWF9CT09MJiBiUmVzZXQsCisgICAgICAgICAgICAgICBGWF9CT09MJiBiRXhpdCwKKyAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWcpOworICB2b2lkIE9uRnVsbChDUERGU0RLX1dpZGdldCogcFdpZGdldCwKKyAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICBGWF9CT09MJiBiUmVzZXQsCisgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFnKTsKKyAgdm9pZCBPblByZU9wZW4oQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsCisgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlJlc2V0LAorICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRXhpdCwKKyAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZyk7CisgIHZvaWQgT25Qb3N0T3BlbihDUERGU0RLX1dpZGdldCogcFdpZGdldCwKKyAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSZXNldCwKKyAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZyk7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKLQl2aXJ0dWFsCXZvaWQJCQkJT25EZVNlbGVjdGVkKENQREZTREtfQW5ub3QqIHBBbm5vdCk7Ci0JdmlydHVhbAl2b2lkCQkJCU9uU2VsZWN0ZWQoQ1BERlNES19Bbm5vdCogcEFubm90KTsKKyBwcml2YXRlOgorICB1c2luZyBDRkZMX1dpZGdldDJGaWxsZXIgPSBzdGQ6Om1hcDxDUERGU0RLX0Fubm90KiwgQ0ZGTF9Gb3JtRmlsbGVyKj47CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsRlhfVUlOVCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZyk7CisgIC8vIElQV0xfRmlsbGVyX05vdGlmeToKKyAgdm9pZCBRdWVyeVdoZXJlUG9wdXAodm9pZCogcFByaXZhdGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUG9wdXBNaW4sCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQb3B1cE1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgblJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZQb3B1cFJldCkgb3ZlcnJpZGU7CisgIHZvaWQgT25CZWZvcmVLZXlTdHJva2Uodm9pZCogcFByaXZhdGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuU2VsU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5TZWxFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiS2V5RG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkV4aXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIG92ZXJyaWRlOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIHZvaWQgT25Qb3B1cFByZU9wZW4odm9pZCogcFByaXZhdGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSBvdmVycmlkZTsKKyAgdm9pZCBPblBvcHVwUG9zdE9wZW4odm9pZCogcFByaXZhdGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIG92ZXJyaWRlOworICB2b2lkIFNldEZvY3VzQW5ub3RUYWIoQ1BERlNES19Bbm5vdCogcFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNhbWVGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5leHQpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICB2b2lkIFVuUmVnaXN0ZXJGb3JtRmlsbGVyKENQREZTREtfQW5ub3QqIHBBbm5vdCk7CiAKLXB1YmxpYzoKLQl2aXJ0dWFsIHZvaWQJCQkJUXVlcnlXaGVyZVBvcHVwKHZvaWQqIHBQcml2YXRlRGF0YSwgRlhfRkxPQVQgZlBvcHVwTWluLEZYX0ZMT0FUIGZQb3B1cE1heCwgRlhfSU5UMzIgJiBuUmV0LCBGWF9GTE9BVCAmIGZQb3B1cFJldCk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uQmVmb3JlS2V5U3Ryb2tlKEZYX0JPT0wgYkVkaXRPckxpc3QsIHZvaWQqIHBQcml2YXRlRGF0YSwgRlhfSU5UMzIgbktleUNvZGUsCi0JCQkJCQkJCQkJQ0ZYX1dpZGVTdHJpbmcgJiBzdHJDaGFuZ2UsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwgCi0JCQkJCQkJCQkJaW50IG5TZWxTdGFydCwgaW50IG5TZWxFbmQsCi0JCQkJCQkJCQkJRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCAmIGJSQywgRlhfQk9PTCAmIGJFeGl0LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uQWZ0ZXJLZXlTdHJva2UoRlhfQk9PTCBiRWRpdE9yTGlzdCwgdm9pZCogcFByaXZhdGVEYXRhLCBGWF9CT09MICYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKSA7Ci0KLQl2aXJ0dWFsIHZvaWQJCQkJT25TZXRXaW5kb3dSZWN0KHZvaWQqIHBQcml2YXRlRGF0YSwgY29uc3QgQ1BERl9SZWN0ICYgcmNXaW5kb3cpOwotCXZpcnR1YWwgdm9pZAkJCQlPbktleVN0cm9rZShGWF9CT09MIGJFZGl0T3JMaXN0LCB2b2lkKiBwUHJpdmF0ZURhdGEsIEZYX0lOVDMyIG5LZXlDb2RlLCBDRlhfV2lkZVN0cmluZyAmIHN0ckNoYW5nZSwgCi0JCQkJCQkJCQljb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsIEZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgJiBiUkMsIEZYX0JPT0wgJiBiRXhpdCk7Ci0KLXB1YmxpYzoKLQl2aXJ0dWFsIHZvaWQJCQkJQmVmb3JlVW5kbyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCXZpcnR1YWwgdm9pZAkJCQlCZWZvcmVSZWRvKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0JdmlydHVhbCB2b2lkCQkJCUFmdGVyVW5kbyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCXZpcnR1YWwgdm9pZAkJCQlBZnRlclJlZG8oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQotcHVibGljOgotCXZpcnR1YWwgRlhfQk9PTAkJCQlDYW5Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7IAotCXZpcnR1YWwgRlhfQk9PTAkJCQlDYW5DdXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsgCi0JdmlydHVhbCBGWF9CT09MCQkJCUNhblBhc3RlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7IAotCi0JdmlydHVhbCB2b2lkCQkJCURvQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOyAKLQl2aXJ0dWFsIHZvaWQJCQkJRG9DdXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsgCi0JdmlydHVhbCB2b2lkCQkJCURvUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsgCi0KLXB1YmxpYzoKLQlDRkZMX0Zvcm1GaWxsZXIqCQkJR2V0Rm9ybUZpbGxlcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0JPT0wgYlJlZ2lzdGVyKTsKLQl2b2lkCQkJCQkJUmVtb3ZlRm9ybUZpbGxlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpOwotCi0Jc3RhdGljIEZYX0JPT0wJCQkJSXNWaXNpYmxlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KTsKLQlzdGF0aWMgRlhfQk9PTAkJCQlJc1JlYWRPbmx5KENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KTsKLQlzdGF0aWMgRlhfQk9PTAkJCQlJc0ZpbGxpbmdBbGxvd2VkKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KTsKLSAJc3RhdGljIEZYX0JPT0wJCQkJSXNWYWxpZEFubm90KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KTsKLQotCXZvaWQJCQkJCQlPbktleVN0cm9rZUNvbW1pdChDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MJiBiUkMsIEZYX0JPT0wmIGJFeGl0LCBGWF9EV09SRCBuRmxhZyk7Ci0Jdm9pZAkJCQkJCU9uVmFsaWRhdGUoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCYgYlJDLCBGWF9CT09MJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOwotCi0Jdm9pZAkJCQkJCU9uQ2FsY3VsYXRlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJFeGl0LCBGWF9EV09SRCBuRmxhZyk7Ci0Jdm9pZAkJCQkJCU9uRm9ybWF0KENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJFeGl0LCBGWF9EV09SRCBuRmxhZyk7Ci0Jdm9pZAkJCQkJCU9uQnV0dG9uVXAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCYgYlJlc2V0LCBGWF9CT09MJiBiRXhpdCxGWF9VSU5UIG5GbGFnKTsKLS8vIAlzdGF0aWMgTFJFU1VMVCBDQUxMQkFDSwkJRkZMX1duZFByb2MoCi0vLyAJCQkJCQkJCQkgIGludCBjb2RlLCAgICAgICAvLyBob29rIGNvZGUKLS8vIAkJCQkJCQkJCSAgV1BBUkFNIHdQYXJhbSwgIC8vIHZpcnR1YWwta2V5IGNvZGUKLS8vIAkJCQkJCQkJCSAgTFBBUkFNIGxQYXJhbSAgIC8vIGtleXN0cm9rZS1tZXNzYWdlIGluZm9ybWF0aW9uCi0vLyAJCQkJCQkJCQkJKTsKLS8vIAlzdGF0aWMgTVNHCQkJCQlHZXRMYXN0TWVzc2FnZSgpOwotCXN0YXRpYyBpbnQJCQkJCUdldENvbW1pdEtleSgpOwotCXN0YXRpYyBGWF9CT09MCQkJCUdldEtleURvd24oKTsKLQotCi1wdWJsaWM6Ci0vLyAJc3RhdGljIE1TRwkJCQkJZ19Nc2c7Ci0vLyAJc3RhdGljIEhIT09LCQkJCW1faG9va1NoZWV0OwotCi1wcml2YXRlOgotCXZvaWQJCQkJCQlVblJlZ2lzdGVyRm9ybUZpbGxlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpOwotCXZvaWQJCQkJCQlTZXRGb2N1c0Fubm90VGFiKENQREZTREtfQW5ub3QqIHBXaWRnZXQsIEZYX0JPT0wgYlNhbWVGaWVsZCwgRlhfQk9PTCBiTmV4dCk7Ci0KLXByaXZhdGU6Ci0JQ1BERkRvY19FbnZpcm9ubWVudCoJCQkJbV9wQXBwOwotCUNGRkxfV2lkZ2V0MkZpbGxlcgkJCW1fTWFwczsKLQlGWF9CT09MCQkJCQkJbV9iTm90aWZ5aW5nOworICBDUERGRG9jX0Vudmlyb25tZW50KiBtX3BBcHA7CisgIENGRkxfV2lkZ2V0MkZpbGxlciBtX01hcHM7CisgIEZYX0JPT0wgbV9iTm90aWZ5aW5nOwogfTsKIAotY2xhc3MgQ0ZGTF9Qcml2YXRlRGF0YQotewotcHVibGljOgotCUNQREZTREtfV2lkZ2V0KgkJCXBXaWRnZXQ7Ci0JQ1BERlNES19QYWdlVmlldyoJcFBhZ2VWaWV3OwotCWludAkJCQkJbldpZGdldEFnZTsKLQlpbnQJCQkJCW5WYWx1ZUFnZTsKK2NsYXNzIENGRkxfUHJpdmF0ZURhdGEgeworIHB1YmxpYzoKKyAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQ7CisgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldzsKKyAgaW50IG5XaWRnZXRBZ2U7CisgIGludCBuVmFsdWVBZ2U7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9GT1JNRklMTEVSX0ZGTF9JRk9STUZJTExFUl9IXwotCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfTGlzdEJveC5oIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0xpc3RCb3guaAppbmRleCBiOTVhZDcyLi4yMjdmMDYyIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfTGlzdEJveC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9MaXN0Qm94LmgKQEAgLTEsNDYgKzEsNDUgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBGUERGU0RLX0lOQ0xVREVfRk9STUZJTExFUl9GRkxfTElTVEJPWF9IXwogI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfRk9STUZJTExFUl9GRkxfTElTVEJPWF9IXwogCisjaW5jbHVkZSA8c2V0PgorCiAjaW5jbHVkZSAiRkZMX0Zvcm1GaWxsZXIuaCIKIAotY2xhc3MgIENCQV9Gb250TWFwOworY2xhc3MgQ0JBX0ZvbnRNYXA7CiAKLWNsYXNzIENGRkxfTGlzdEJveCA6IHB1YmxpYyBDRkZMX0Zvcm1GaWxsZXIKLXsKLXB1YmxpYzoKLQlDRkZMX0xpc3RCb3goQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19Bbm5vdCogcFdpZGdldCk7Ci0JdmlydHVhbCB+Q0ZGTF9MaXN0Qm94KCk7CitjbGFzcyBDRkZMX0xpc3RCb3ggOiBwdWJsaWMgQ0ZGTF9Gb3JtRmlsbGVyIHsKKyBwdWJsaWM6CisgIENGRkxfTGlzdEJveChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwV2lkZ2V0KTsKKyAgfkNGRkxfTGlzdEJveCgpIG92ZXJyaWRlOwogCi0JdmlydHVhbAlQV0xfQ1JFQVRFUEFSQU0JCUdldENyZWF0ZVBhcmFtKCk7Ci0JdmlydHVhbCBDUFdMX1duZCoJCQlOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKKyAgLy8gQ0ZGTF9Gb3JtRmlsbGVyCisgIFBXTF9DUkVBVEVQQVJBTSBHZXRDcmVhdGVQYXJhbSgpIG92ZXJyaWRlOworICBDUFdMX1duZCogTmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSBvdmVycmlkZTsKKyAgRlhfQk9PTCBPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncykgb3ZlcnJpZGU7CisgIEZYX0JPT0wgSXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIG92ZXJyaWRlOworICB2b2lkIFNhdmVEYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgb3ZlcnJpZGU7CisgIHZvaWQgR2V0QWN0aW9uRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24mIGZhKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmEpIG92ZXJyaWRlOworICB2b2lkIFNhdmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIG92ZXJyaWRlOworICB2b2lkIFJlc3RvcmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIG92ZXJyaWRlOworICBDUFdMX1duZCogUmVzZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVzdG9yZVZhbHVlKSBvdmVycmlkZTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncyk7Ci0KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwotCXZpcnR1YWwgdm9pZAkJCQlTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwotCi0gCXZpcnR1YWwgdm9pZAkJCQlHZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAotIAkJCQkJCQkJCVBERlNES19GaWVsZEFjdGlvbiYgZmEpOwotIAl2aXJ0dWFsIHZvaWQJCQkJU2V0QWN0aW9uRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgCi0gCQkJCQkJCQkJY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSk7Ci0KLQl2aXJ0dWFsIHZvaWQJCQkJU2F2ZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7Ci0JdmlydHVhbCB2b2lkCQkJCVJlc3RvcmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwotCi0JdmlydHVhbCBDUFdMX1duZCoJCQlSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uS2V5U3Ryb2tlKEZYX0JPT0wgYktleURvd24sIEZYX0RXT1JEIG5GbGFnKTsKLQotcHJpdmF0ZToKLQlDQkFfRm9udE1hcCoJCQkJCW1fcEZvbnRNYXA7Ci0JQ0ZYX01hcFB0clRlbXBsYXRlPGludCwgdm9pZCo+CW1fT3JpZ2luU2VsZWN0aW9uczsKLQlDRlhfQXJyYXlUZW1wbGF0ZTxpbnQ+CQkJbV9TdGF0ZTsKKyBwcml2YXRlOgorICBDQkFfRm9udE1hcCogbV9wRm9udE1hcDsKKyAgc3RkOjpzZXQ8aW50PiBtX09yaWdpblNlbGVjdGlvbnM7CisgIENGWF9BcnJheVRlbXBsYXRlPGludD4gbV9TdGF0ZTsKIH07CiAKLQogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfRk9STUZJTExFUl9GRkxfTElTVEJPWF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX05vdGlmeS5oIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX05vdGlmeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWY0MzQxLi4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Ob3RpZnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19JTkNMVURFX0ZPUk1GSUxMRVJfRkZMX05PVElGWV9IXwotI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfRk9STUZJTExFUl9GRkxfTk9USUZZX0hfCi0KLSNpbmNsdWRlICIuLi8uLi8uLi9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2NvcmUvaW5jbHVkZS9meGNydC9meF9zdHJpbmcuaCIKLQotY2xhc3MgQ0ZGTF9Gb3JtRmlsbGVyOwotY2xhc3MgQ1BERl9Gb3JtRmllbGQ7Ci0KLWNsYXNzIENGRkxfTm90aWZ5Ci17Ci1wdWJsaWM6Ci0JQ0ZGTF9Ob3RpZnkoQ0ZGTF9Gb3JtRmlsbGVyICogcEZvcm1GaWxsZXIpOwkKLQl2aXJ0dWFsIH5DRkZMX05vdGlmeSgpOwotCi1wdWJsaWM6Ci0JRlhfQk9PTAkJCQkJCQkJCU9uU2V0Rm9jdXMoRlhfQk9PTCAmIGJFeGl0KTsKLQlGWF9CT09MCQkJCQkJCQkJT25Nb3VzZUVudGVyKEZYX0JPT0wgJiBiRXhpdCk7Ci0JRlhfQk9PTAkJCQkJCQkJCU9uTW91c2VEb3duKEZYX0JPT0wgJiBiRXhpdCk7Ci0JRlhfQk9PTAkJCQkJCQkJCU9uTW91c2VVcChGWF9CT09MICYgYkV4aXQpOwkKLQlGWF9CT09MCQkJCQkJCQkJT25Nb3VzZUV4aXQoRlhfQk9PTCAmIGJFeGl0KTsJCi0JRlhfQk9PTAkJCQkJCQkJCU9uS2lsbEZvY3VzKEZYX0JPT0wgJiBiRXhpdCk7Ci0KLQlGWF9CT09MCQkJCQkJCQkJT25DYWxjdWxhdGUoKTsKLQlGWF9CT09MCQkJCQkJCQkJT25Gb3JtYXQoaW50IGlDb21taXRLZXkpOwotCUZYX0JPT0wJCQkJCQkJCQlPblZhbGlkYXRlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBDRlhfV2lkZVN0cmluZyYgc3RyVmFsdWUsIENGWF9XaWRlU3RyaW5nICYgc3RyQ2hhbmdlLCAKLQkJCQkJCQkJCQkJICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBGWF9CT09MIGJLZXlEb3duLCBGWF9CT09MIGJNb2RpZmllciwKLQkJCQkJCQkJCQkJICAgRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgJiBiUkMpOwotCUZYX0JPT0wJCQkJCQkJCQlPbktleVN0cm9rZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgaW50IG5Db21taXRLZXksIENGWF9XaWRlU3RyaW5nJiBzdHJWYWx1ZSwgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwgCi0JCQkJCQkJCQkJCSAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwgRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCBiTW9kaWZpZXIsCi0JCQkJCQkJCQkJCSAgIEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJXaWxsQ29tbWl0LCBGWF9CT09MIGJGaWVsZEZ1bGwsIAotCQkJCQkJCQkJCQkgICBpbnQmIG5TZWxTdGFydCwgaW50JiBuU2VsRW5kLCBGWF9CT09MJiBiUkMpOwotCi0Jdm9pZAkJCQkJCQkJCUJlZm9yZU5vdGlmeSgpOwotCXZvaWQJCQkJCQkJCQlBZnRlck5vdGlmeSgpOwotCUZYX0JPT0wJCQkJCQkJCQlJc05vdGlmeWluZygpIGNvbnN0IHtyZXR1cm4gbV9uTm90aWZ5RmxhZyA+IDA7fQotCi1wcml2YXRlOgotIAlGWF9CT09MCQkJCQkJCQkJRG9BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCwgRlhfQk9PTCAmIGJFeGl0KTsKLSAJRlhfQk9PTAkJCQkJCQkJCUZpbmRBQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCxDUERGX0FjdGlvbiAmIGFjdGlvbik7Ci0gCUZYX0JPT0wJCQkJCQkJCQlGaW5kQUFjdGlvbihDUERGX0FBY3Rpb24gYWFjdGlvbixDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsQ1BERl9BY3Rpb24gJiBhY3Rpb24pOwotIAlGWF9CT09MCQkJCQkJCQkJRXhlY3V0ZUFjdGlvblRyZWUoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULCBDUERGX0FjdGlvbiAmIGFjdGlvbiwgRlhfQk9PTCYgYkV4aXQpOwotIAlGWF9CT09MCQkJCQkJCQkJRXhlY3V0ZUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsQ1BERl9BY3Rpb24gJiBhY3Rpb24sRlhfQk9PTCYgYkV4aXQpOwotCi0JRlhfQk9PTAkJCQkJCQkJCW1fYkRvQWN0aW9uaW5nOwotCUZYX0lOVDMyCQkJCQkJCQltX25Ob3RpZnlGbGFnOwotfTsKLQotI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfRk9STUZJTExFUl9GRkxfTk9USUZZX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfUHVzaEJ1dHRvbi5oIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1B1c2hCdXR0b24uaAppbmRleCA0Y2Y2MWE4Li4xM2Q2MDg1IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfUHVzaEJ1dHRvbi5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9QdXNoQnV0dG9uLmgKQEAgLTEsNyArMSw3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgRlBERlNES19JTkNMVURFX0ZPUk1GSUxMRVJfRkZMX1BVU0hCVVRUT05fSF8KQEAgLTksMTggKzksMjAgQEAKIAogI2luY2x1ZGUgIkZGTF9Gb3JtRmlsbGVyLmgiCiAKLWNsYXNzIENGRkxfUHVzaEJ1dHRvbiA6IHB1YmxpYyBDRkZMX0J1dHRvbgotewotcHVibGljOgotCUNGRkxfUHVzaEJ1dHRvbihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOwotCXZpcnR1YWwgfkNGRkxfUHVzaEJ1dHRvbigpOworY2xhc3MgQ0ZGTF9QdXNoQnV0dG9uIDogcHVibGljIENGRkxfQnV0dG9uIHsKKyBwdWJsaWM6CisgIENGRkxfUHVzaEJ1dHRvbihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOworICB+Q0ZGTF9QdXNoQnV0dG9uKCkgb3ZlcnJpZGU7CiAKLQl2aXJ0dWFsIENQV0xfV25kKgkJCU5ld1BERldpbmRvdyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwLCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwotCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25EcmF3KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgIENQREZTREtfQW5ub3QqIHBBbm5vdCwgCi0JCQkJCQkJCQlDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAotCQkJCQkJCQkJRlhfRFdPUkQgZHdGbGFncyk7CisgIC8vIENGRkxfQnV0dG9uCisgIENQV0xfV25kKiBOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIG92ZXJyaWRlOworICBGWF9CT09MIE9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKSBvdmVycmlkZTsKKyAgdm9pZCBPbkRyYXcoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncykgb3ZlcnJpZGU7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9GT1JNRklMTEVSX0ZGTF9QVVNIQlVUVE9OX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfUmFkaW9CdXR0b24uaCBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9SYWRpb0J1dHRvbi5oCmluZGV4IDhkYmE5MzMuLjNhODI4MDMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9SYWRpb0J1dHRvbi5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9SYWRpb0J1dHRvbi5oCkBAIC0xLDcgKzEsNyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIEZQREZTREtfSU5DTFVERV9GT1JNRklMTEVSX0ZGTF9SQURJT0JVVFRPTl9IXwpAQCAtOSwxOCArOSwyNCBAQAogCiAjaW5jbHVkZSAiRkZMX0Zvcm1GaWxsZXIuaCIKIAotY2xhc3MgQ0ZGTF9SYWRpb0J1dHRvbiA6IHB1YmxpYyBDRkZMX0J1dHRvbgotewotcHVibGljOgotCUNGRkxfUmFkaW9CdXR0b24oQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19Bbm5vdCogcEFubm90KTsKLQl2aXJ0dWFsIH5DRkZMX1JhZGlvQnV0dG9uKCk7Ci0JCi0JdmlydHVhbCBDUFdMX1duZCoJCQlOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKLSAgCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5LZXlDb2RlLCBGWF9VSU5UIG5GbGFncyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUlzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKLQl2aXJ0dWFsIHZvaWQJCQkJU2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKK2NsYXNzIENGRkxfUmFkaW9CdXR0b24gOiBwdWJsaWMgQ0ZGTF9CdXR0b24geworIHB1YmxpYzoKKyAgQ0ZGTF9SYWRpb0J1dHRvbihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOworICB+Q0ZGTF9SYWRpb0J1dHRvbigpIG92ZXJyaWRlOworCisgIC8vIENGRkxfQnV0dG9uCisgIENQV0xfV25kKiBOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIG92ZXJyaWRlOworICBGWF9CT09MIE9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbktleUNvZGUsCisgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncykgb3ZlcnJpZGU7CisgIEZYX0JPT0wgT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgSXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIG92ZXJyaWRlOworICB2b2lkIFNhdmVEYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgb3ZlcnJpZGU7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9GT1JNRklMTEVSX0ZGTF9SQURJT0JVVFRPTl9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1RleHRGaWVsZC5oIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1RleHRGaWVsZC5oCmluZGV4IDI1MjUwNzcuLjEyYWMxNWEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9UZXh0RmllbGQuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfVGV4dEZpZWxkLmgKQEAgLTEsNyArMSw3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgRlBERlNES19JTkNMVURFX0ZPUk1GSUxMRVJfRkZMX1RFWFRGSUVMRF9IXwpAQCAtOSw2NSArOSw2MSBAQAogCiAjaW5jbHVkZSAiRkZMX0Zvcm1GaWxsZXIuaCIKIAotI2RlZmluZSBCRl9BTElHTl9MRUZUCQkJMAotI2RlZmluZSBCRl9BTElHTl9NSURETEUJCQkxCi0jZGVmaW5lIEJGX0FMSUdOX1JJR0hUCQkJMgorI2RlZmluZSBCRl9BTElHTl9MRUZUIDAKKyNkZWZpbmUgQkZfQUxJR05fTUlERExFIDEKKyNkZWZpbmUgQkZfQUxJR05fUklHSFQgMgogCiBjbGFzcyBDQkFfRm9udE1hcDsKIAotc3RydWN0IEZGTF9UZXh0RmllbGRTdGF0ZQotewotCWludCBuU3RhcnQ7Ci0JaW50IG5FbmQ7Ci0JQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlOworc3RydWN0IEZGTF9UZXh0RmllbGRTdGF0ZSB7CisgIGludCBuU3RhcnQ7CisgIGludCBuRW5kOworICBDRlhfV2lkZVN0cmluZyBzVmFsdWU7CiB9OwogCi1jbGFzcyBDRkZMX1RleHRGaWVsZCA6IHB1YmxpYyBDRkZMX0Zvcm1GaWxsZXIsIHB1YmxpYyBJUFdMX0ZvY3VzSGFuZGxlciwgcHVibGljIElQV0xfRWRpdF9Ob3RpZnkKLXsKLXB1YmxpYzoKLQlDRkZMX1RleHRGaWVsZChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOwotCXZpcnR1YWwgfkNGRkxfVGV4dEZpZWxkKCk7Ci0JCi0JdmlydHVhbAlQV0xfQ1JFQVRFUEFSQU0JCUdldENyZWF0ZVBhcmFtKCk7Ci0JdmlydHVhbCBDUFdMX1duZCoJCQlOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKK2NsYXNzIENGRkxfVGV4dEZpZWxkIDogcHVibGljIENGRkxfRm9ybUZpbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIElQV0xfRm9jdXNIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSVBXTF9FZGl0X05vdGlmeSB7CisgcHVibGljOgorICBDRkZMX1RleHRGaWVsZChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOworICB+Q0ZGTF9UZXh0RmllbGQoKSBvdmVycmlkZTsKIAotCQotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncyk7Ci0JCi0JdmlydHVhbCBGWF9CT09MCQkJCUlzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKLQl2aXJ0dWFsIHZvaWQJCQkJU2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKLQkKLSAJdmlydHVhbCB2b2lkCQkJCUdldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCi0gCQkJCQkJCQkJCQkJUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSk7Ci0gCXZpcnR1YWwgdm9pZAkJCQlTZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCAKLQkJCQkJCQkJCWNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmEpOwotIAl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNBY3Rpb25EYXRhQ2hhbmdlZChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFPbGQsIAotIAkJCQkJCQkJCQkJCWNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFOZXcpOwotCXZpcnR1YWwgdm9pZAkJCQlTYXZlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKLQl2aXJ0dWFsIHZvaWQJCQkJUmVzdG9yZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7Ci0JCi0JdmlydHVhbCBDUFdMX1duZCoJCQlSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSk7Ci0JCi1wdWJsaWM6Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2V0Rm9jdXMoQ1BXTF9XbmQqIHBXbmQpOwotCXZpcnR1YWwgdm9pZAkJCQlPbktpbGxGb2N1cyhDUFdMX1duZCogcFduZCk7Ci0JCi1wdWJsaWM6Ci0JdmlydHVhbCB2b2lkCQkJCU9uQWRkVW5kbyhDUFdMX0VkaXQqIHBFZGl0KTsKLQkKLXB1YmxpYzoKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQ2FuQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOyAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQ2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7IAotCXZpcnR1YWwgRlhfQk9PTAkJCQlDYW5QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOyAKLQkKLQl2aXJ0dWFsIHZvaWQJCQkJRG9Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7IAotCXZpcnR1YWwgdm9pZAkJCQlEb0N1dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOyAKLQl2aXJ0dWFsIHZvaWQJCQkJRG9QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOyAKLQkKLXByaXZhdGU6Ci0JQ0JBX0ZvbnRNYXAqCQkJCW1fcEZvbnRNYXA7Ci0JRkZMX1RleHRGaWVsZFN0YXRlCQkJbV9TdGF0ZTsKKyAgLy8gQ0ZGTF9Gb3JtRmlsbGVyOgorICBQV0xfQ1JFQVRFUEFSQU0gR2V0Q3JlYXRlUGFyYW0oKSBvdmVycmlkZTsKKyAgQ1BXTF9XbmQqIE5ld1BERldpbmRvdyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgb3ZlcnJpZGU7CisgIEZYX0JPT0wgT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpIG92ZXJyaWRlOworICBGWF9CT09MIElzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSBvdmVycmlkZTsKKyAgdm9pZCBTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIG92ZXJyaWRlOworICB2b2lkIEdldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSkgb3ZlcnJpZGU7CisgIHZvaWQgU2V0QWN0aW9uRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBJc0FjdGlvbkRhdGFDaGFuZ2VkKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFPbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhTmV3KSBvdmVycmlkZTsKKyAgdm9pZCBTYXZlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSBvdmVycmlkZTsKKyAgdm9pZCBSZXN0b3JlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSBvdmVycmlkZTsKKyAgQ1BXTF9XbmQqIFJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSkgb3ZlcnJpZGU7CiAKKyAgLy8gSVBXTF9Gb2N1c0hhbmRsZXI6CisgIHZvaWQgT25TZXRGb2N1cyhDUFdMX1duZCogcFduZCkgb3ZlcnJpZGU7CisgIHZvaWQgT25LaWxsRm9jdXMoQ1BXTF9XbmQqIHBXbmQpIG92ZXJyaWRlOworCisgIC8vIElQV0xfRWRpdF9Ob3RpZnk6CisgIHZvaWQgT25BZGRVbmRvKENQV0xfRWRpdCogcEVkaXQpIG92ZXJyaWRlOworCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgLy8gQ0ZGTF9Gb3JtRmlsbGVyOgorICBGWF9CT09MIElzRmllbGRGdWxsKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgb3ZlcnJpZGU7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKKyBwcml2YXRlOgorICBDQkFfRm9udE1hcCogbV9wRm9udE1hcDsKKyAgRkZMX1RleHRGaWVsZFN0YXRlIG1fU3RhdGU7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9GT1JNRklMTEVSX0ZGTF9URVhURklFTERfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9VdGlscy5oIGIvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMDZhMzQuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIEZQREZTREtfSU5DTFVERV9GT1JNRklMTEVSX0ZGTF9VVElMU19IXwotI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfRk9STUZJTExFUl9GRkxfVVRJTFNfSF8KLQotI2luY2x1ZGUgIi4uLy4uLy4uL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFyc2VyLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X21lbW9yeS5oIgotCi0jZGVmaW5lIEZGTF9CQVNFX1VTRVJVTklUCQkJKDEuMGYgLyA3Mi4wZikKLQotY2xhc3MgQ0ZGTF9VdGlscwotewotcHVibGljOgotCXN0YXRpYyBDUERGX1JlY3QJCQkJTWF4UmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0MSxjb25zdCBDUERGX1JlY3QgJiByZWN0Mik7Ci0Jc3RhdGljIENQREZfUmVjdAkJCQlJbmZsYXRlUmVjdChjb25zdCBDUERGX1JlY3QgJiBjclJlY3QsIGNvbnN0IEZYX0ZMT0FUICYgZlNpemUpOwotCXN0YXRpYyBDUERGX1JlY3QJCQkJRGVmbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0ICYgY3JSZWN0LCBjb25zdCBGWF9GTE9BVCAmIGZTaXplKTsKLQlzdGF0aWMgRlhfQk9PTAkJCQkJVHJhY2VPYmplY3QoQ1BERl9PYmplY3QqIHBPYmopOwotfTsKLQotI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfRk9STUZJTExFUl9GRkxfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0Zvcm1GaWxsZXIuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0Zvcm1GaWxsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRjYTFmZi4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9Gb3JtRmlsbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19JTkNMVURFX0ZPUk1GSUxMRVJfRk9STUZJTExFUl9IXwotI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfRk9STUZJTExFUl9GT1JNRklMTEVSX0hfCi0KLSNpbmNsdWRlICIuLi8uLi8uLi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl92dC5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2NvcmUvaW5jbHVkZS9meGNydC9meF94bWwuaCIKLSNpbmNsdWRlICIuLi9mc2RrX21nci5oIgotI2luY2x1ZGUgIi4uL2Z4ZWRpdC9meF9lZGl0LmgiCi0jaW5jbHVkZSAiLi4vcGRmd2luZG93L0lQREZXaW5kb3cuaCIKLQotI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfRk9STUZJTExFUl9GT1JNRklMTEVSX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2FwcC5oIGIvZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9hcHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjVhOTAzCi0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9hcHAuaApAQCAtMCwwICsxLDk3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgRlBERlhGQV9BUFBfSF8NCisjZGVmaW5lIEZQREZYRkFfQVBQX0hfDQorDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z4ZmEvZnhmYS5oIg0KKw0KK2NsYXNzIElGWEpTX1J1bnRpbWU7DQorDQorY2xhc3MgQ1BERlhGQV9BcHAgOiBwdWJsaWMgSVhGQV9BcHBQcm92aWRlciB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBDUERGWEZBX0FwcCogR2V0SW5zdGFuY2UoKTsNCisgIHN0YXRpYyB2b2lkIFJlbGVhc2VJbnN0YW5jZSgpOw0KKw0KKyAgQ1BERlhGQV9BcHAoKTsNCisgIH5DUERGWEZBX0FwcCgpIG92ZXJyaWRlOw0KKw0KKyAgRlhfQk9PTCBJbml0aWFsaXplKCk7DQorICBJWEZBX0FwcCogR2V0WEZBQXBwKCkgeyByZXR1cm4gbV9wWEZBQXBwOyB9DQorDQorICBGWF9CT09MIEFkZEZvcm1GaWxsRW52KENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYpOw0KKyAgRlhfQk9PTCBSZW1vdmVGb3JtRmlsbEVudihDUERGRG9jX0Vudmlyb25tZW50KiBwRW52KTsNCisNCisgIEZYX0JPT0wgSXNKYXZhU2NyaXB0SW5pdGlhbGl6ZWQoKSBjb25zdCB7IHJldHVybiBtX2JKYXZhU2NyaXB0SW5pdGlhbGl6ZWQ7IH0NCisgIHZvaWQgU2V0SmF2YVNjcmlwdEluaXRpYWxpemVkKEZYX0JPT0wgYkluaXRpYWxpemVkKSB7DQorICAgIG1fYkphdmFTY3JpcHRJbml0aWFsaXplZCA9IGJJbml0aWFsaXplZDsNCisgIH0NCisNCisgIEZYSlNFX0hSVU5USU1FIEdldEpTRVJ1bnRpbWUoKSBjb25zdCB7IHJldHVybiBtX2hKU0VSdW50aW1lOyB9DQorDQorICAvLyBJRlhBX0FwcFByb3ZpZGVyOg0KKyAgdm9pZCBHZXRBcHBUeXBlKENGWF9XaWRlU3RyaW5nJiB3c0FwcFR5cGUpIG92ZXJyaWRlOw0KKyAgdm9pZCBTZXRBcHBUeXBlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NBcHBUeXBlKSBvdmVycmlkZTsNCisNCisgIHZvaWQgR2V0TGFuZ3VhZ2UoQ0ZYX1dpZGVTdHJpbmcmIHdzTGFuZ3VhZ2UpIG92ZXJyaWRlOw0KKyAgdm9pZCBHZXRQbGF0Zm9ybShDRlhfV2lkZVN0cmluZyYgd3NQbGF0Zm9ybSkgb3ZlcnJpZGU7DQorICB2b2lkIEdldFZhcmlhdGlvbihDRlhfV2lkZVN0cmluZyYgd3NWYXJpYXRpb24pIG92ZXJyaWRlOw0KKyAgdm9pZCBHZXRWZXJzaW9uKENGWF9XaWRlU3RyaW5nJiB3c1ZlcnNpb24pIG92ZXJyaWRlOw0KKyAgdm9pZCBHZXRGb3hpdFZlcnNpb24oQ0ZYX1dpZGVTdHJpbmcmIHdzRm94aXRWZXJzaW9uKSBvdmVycmlkZSB7DQorICAgIHdzRm94aXRWZXJzaW9uID0gTCI3LjAiOw0KKyAgfQ0KKw0KKyAgdm9pZCBHZXRBcHBOYW1lKENGWF9XaWRlU3RyaW5nJiB3c05hbWUpIG92ZXJyaWRlOw0KKyAgdm9pZCBHZXRGb3hpdEFwcE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzRm94aXROYW1lKSBvdmVycmlkZSB7DQorICAgIHdzRm94aXROYW1lID0gTCJGb3hpdCI7DQorICB9DQorDQorICB2b2lkIEJlZXAoRlhfRFdPUkQgZHdUeXBlKSBvdmVycmlkZTsNCisgIGludDMyX3QgTXNnQm94KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NNZXNzYWdlLA0KKyAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RpdGxlLA0KKyAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdJY29uVHlwZSwNCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3QnV0dG9uVHlwZSkgb3ZlcnJpZGU7DQorICB2b2lkIFJlc3BvbnNlKENGWF9XaWRlU3RyaW5nJiB3c0Fuc3dlciwNCisgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1F1ZXN0aW9uLA0KKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVGl0bGUsDQorICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NEZWZhdWx0QW5zd2VyLA0KKyAgICAgICAgICAgICAgICBGWF9CT09MIGJNYXJrKSBvdmVycmlkZTsNCisNCisgIGludDMyX3QgR2V0RG9jdW1lbnRDb3VudEluQmF0Y2goKSBvdmVycmlkZTsNCisgIGludDMyX3QgR2V0Q3VyRG9jdW1lbnRJbkJhdGNoKCkgb3ZlcnJpZGU7DQorDQorICBJRlhfRmlsZVJlYWQqIERvd25sb2FkVVJMKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NVUkwpIG92ZXJyaWRlOw0KKyAgRlhfQk9PTCBQb3N0UmVxdWVzdFVSTChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVVJMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NvbnRlbnRUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRW5jb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzSGVhZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NSZXNwb25zZSkgb3ZlcnJpZGU7DQorICBGWF9CT09MIFB1dFJlcXVlc3RVUkwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1VSTCwNCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRW5jb2RlKSBvdmVycmlkZTsNCisNCisgIHZvaWQgTG9hZFN0cmluZyhpbnQzMl90IGlTdHJpbmdJRCwgQ0ZYX1dpZGVTdHJpbmcmIHdzU3RyaW5nKSBvdmVycmlkZTsNCisgIEZYX0JPT0wgU2hvd0ZpbGVEaWFsb2coY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RpdGxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRmlsdGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0FycmF5JiB3c1BhdGhBcnIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk9wZW4pIG92ZXJyaWRlOw0KKyAgSUZXTF9BZGFwdGVyVGltZXJNZ3IqIEdldFRpbWVyTWdyKCkgb3ZlcnJpZGU7DQorDQorICBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGRG9jX0Vudmlyb25tZW50Kj4gbV9wRW52TGlzdDsNCisNCisgcHJvdGVjdGVkOg0KKyAgc3RhdGljIENQREZYRkFfQXBwKiBnX3BBcHA7DQorDQorICBGWF9CT09MIG1fYkphdmFTY3JpcHRJbml0aWFsaXplZDsNCisgIElYRkFfQXBwKiBtX3BYRkFBcHA7DQorICBJWEZBX0ZvbnRNZ3IqIG1fcEZvbnRNZ3I7DQorICBGWEpTRV9IUlVOVElNRSBtX2hKU0VSdW50aW1lOw0KKyAgSUZYSlNfUnVudGltZSogbV9wSlNSdW50aW1lOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV9jc0FwcFR5cGU7DQorfTsNCisNCisjZW5kaWYgIC8vIEZQREZYRkFfQVBQX0hfDQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9kb2MuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfZG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlMjJhNwotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfZG9jLmgKQEAgLTAsMCArMSwyMjggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBGUERGWEZBX0RPQ19IXw0KKyNkZWZpbmUgRlBERlhGQV9ET0NfSF8NCisNCisjaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z4ZmEvZnhmYS5oIg0KKw0KK2NsYXNzIENQREZYRkFfQXBwOw0KK2NsYXNzIENQREZYRkFfRG9jdW1lbnQ7DQorY2xhc3MgQ1BERlhGQV9QYWdlOw0KK2NsYXNzIENQREZTREtfRG9jdW1lbnQ7DQorY2xhc3MgQ1BERkRvY19FbnZpcm9ubWVudDsNCitjbGFzcyBJSlNfUnVudGltZTsNCitjbGFzcyBJSlNfQ29udGV4dDsNCitjbGFzcyBJWEZBX0RvY0hhbmRsZXI7DQorDQorY2xhc3MgQ1BERlhGQV9Eb2N1bWVudCA6IHB1YmxpYyBJWEZBX0RvY1Byb3ZpZGVyIHsNCisgcHVibGljOg0KKyAgQ1BERlhGQV9Eb2N1bWVudChDUERGX0RvY3VtZW50KiBwUERGRG9jLCBDUERGWEZBX0FwcCogcFByb3ZpZGVyKTsNCisgIH5DUERGWEZBX0RvY3VtZW50KCk7DQorDQorICBGWF9CT09MIExvYWRYRkFEb2MoKTsNCisgIENQREZYRkFfQXBwKiBHZXRBcHAoKSB7IHJldHVybiBtX3BBcHA7IH0NCisgIENQREZfRG9jdW1lbnQqIEdldFBERkRvYygpIHsgcmV0dXJuIG1fcFBERkRvYzsgfQ0KKyAgSVhGQV9Eb2MqIEdldFhGQURvYygpIHsgcmV0dXJuIG1fcFhGQURvYzsgfQ0KKyAgSVhGQV9Eb2NWaWV3KiBHZXRYRkFEb2NWaWV3KCkgeyByZXR1cm4gbV9wWEZBRG9jVmlldzsgfQ0KKw0KKyAgaW50IEdldFBhZ2VDb3VudCgpOw0KKyAgQ1BERlhGQV9QYWdlKiBHZXRQYWdlKGludCBwYWdlX2luZGV4KTsNCisgIENQREZYRkFfUGFnZSogR2V0UGFnZShJWEZBX1BhZ2VWaWV3KiBwUGFnZSk7DQorICB2b2lkIFJlbW92ZVBhZ2UoQ1BERlhGQV9QYWdlKiBwYWdlKTsNCisgIGludCBHZXREb2NUeXBlKCkgeyByZXR1cm4gbV9pRG9jVHlwZTsgfQ0KKw0KKyAgQ1BERlNES19Eb2N1bWVudCogR2V0U0RLRG9jdW1lbnQoQ1BERkRvY19FbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KTsNCisNCisgIHZvaWQgRlhSZWN0MlBERlJlY3QoY29uc3QgQ0ZYX1JlY3RGJiBmeFJlY3RGLCBDUERGX1JlY3QmIHBkZlJlY3QpOw0KKw0KKyAgdmlydHVhbCB2b2lkIFNldENoYW5nZU1hcmsoSVhGQV9Eb2MqIGhEb2MpOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldENoYW5nZU1hcmsoSVhGQV9Eb2MqIGhEb2MpOw0KKyAgLy8gdXNlZCBpbiBkeW5hbWljIHhmYSwgZHdGbGFncyByZWZlciB0byBYRkFfSU5WQUxJREFURV9YWFggbWFjcm9zLg0KKyAgdmlydHVhbCB2b2lkIEludmFsaWRhdGVSZWN0KElYRkFfUGFnZVZpZXcqIHBQYWdlVmlldywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSAwKTsNCisgIC8vIHVzZWQgaW4gc3RhdGljIHhmYSwgZHdGbGFncyByZWZlciB0byBYRkFfSU5WQUxJREFURV9YWFggbWFjcm9zLg0KKyAgdmlydHVhbCB2b2lkIEludmFsaWRhdGVSZWN0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBGWF9EV09SRCBkd0ZsYWdzID0gMCk7DQorICAvLyBzaG93IG9yIGhpZGUgY2FyZXQNCisgIHZpcnR1YWwgdm9pZCBEaXNwbGF5Q2FyZXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZpc2libGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJ0QW5jaG9yKTsNCisgIC8vIGR3UG9zOiAoMDpib3R0b20gMTp0b3ApDQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0UG9wdXBQb3MoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1pblBvcHVwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNYXhQb3B1cCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0QW5jaG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRQb3B1cCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUG9wdXBNZW51KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGIHB0UG9wdXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3RFeGNsdWRlID0gTlVMTCk7DQorDQorICAvLyBkd0ZsYWdzIFhGQV9QQUdFVklFV0VWRU5UX0FkZGVkLCBYRkFfUEFHRVZJRVdFVkVOVF9SZW1vdmluZw0KKyAgdmlydHVhbCB2b2lkIFBhZ2VWaWV3RXZlbnQoSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9EV09SRCBkd0ZsYWdzKTsNCisgIC8vIGR3RXZlbnQgcmVmZXIgdG8gWEZBX1dJREdFVEVWRU5UX1hYWA0KKyAgdmlydHVhbCB2b2lkIFdpZGdldEV2ZW50KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0RGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0V2ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbSA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEFkZGl0aW9uYWwgPSBOVUxMKTsNCisNCisgIC8vIHJldHVybiB0cnVlIGlmIHJlbmRlciBpdC4NCisgIHZpcnR1YWwgRlhfQk9PTCBSZW5kZXJDdXN0b21XaWRnZXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0VUkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKw0KKyAgLy8gaG9zdCBtZXRob2QNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudFBhZ2VzKElYRkFfRG9jKiBoRG9jKTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDdXJyZW50UGFnZShJWEZBX0RvYyogaERvYyk7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q3VycmVudFBhZ2UoSVhGQV9Eb2MqIGhEb2MsIGludDMyX3QgaUN1clBhZ2UpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzQ2FsY3VsYXRpb25zRW5hYmxlZChJWEZBX0RvYyogaERvYyk7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q2FsY3VsYXRpb25zRW5hYmxlZChJWEZBX0RvYyogaERvYywgRlhfQk9PTCBiRW5hYmxlZCk7DQorICB2aXJ0dWFsIHZvaWQgR2V0VGl0bGUoSVhGQV9Eb2MqIGhEb2MsIENGWF9XaWRlU3RyaW5nJiB3c1RpdGxlKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRUaXRsZShJWEZBX0RvYyogaERvYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RpdGxlKTsNCisgIHZpcnR1YWwgdm9pZCBFeHBvcnREYXRhKElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZpbGVQYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiWERQID0gVFJVRSk7DQorICB2aXJ0dWFsIHZvaWQgSW1wb3J0RGF0YShJWEZBX0RvYyogaERvYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZpbGVQYXRoKTsNCisgIHZpcnR1YWwgdm9pZCBHb3RvVVJMKElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBic1VSTCwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFwcGVuZCA9IFRSVUUpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzVmFsaWRhdGlvbnNFbmFibGVkKElYRkFfRG9jKiBoRG9jKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRWYWxpZGF0aW9uc0VuYWJsZWQoSVhGQV9Eb2MqIGhEb2MsIEZYX0JPT0wgYkVuYWJsZWQpOw0KKyAgdmlydHVhbCB2b2lkIFNldEZvY3VzV2lkZ2V0KElYRkFfRG9jKiBoRG9jLCBJWEZBX1dpZGdldCogaFdpZGdldCk7DQorICB2aXJ0dWFsIHZvaWQgUHJpbnQoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnRQYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkVuZFBhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdPcHRpb25zKTsNCisNCisgIC8vIExheW91dFBzZXVkbyBtZXRob2QNCisgIHZpcnR1YWwgaW50MzJfdCBBYnNQYWdlQ291bnRJbkJhdGNoKElYRkFfRG9jKiBoRG9jKSB7IHJldHVybiAwOyB9DQorICB2aXJ0dWFsIGludDMyX3QgQWJzUGFnZUluQmF0Y2goSVhGQV9Eb2MqIGhEb2MsIElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgdmlydHVhbCBpbnQzMl90IFNoZWV0Q291bnRJbkJhdGNoKElYRkFfRG9jKiBoRG9jKSB7IHJldHVybiAwOyB9DQorICB2aXJ0dWFsIGludDMyX3QgU2hlZXRJbkJhdGNoKElYRkFfRG9jKiBoRG9jLCBJWEZBX1dpZGdldCogaFdpZGdldCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisNCisgIC8vIFNpZ25hdHVyZVBzZXVkb01vZGVsIG1ldGhvZA0KKyAgLy8gVE9ETzoNCisgIHZpcnR1YWwgaW50MzJfdCBWZXJpZnkoDQorICAgICAgSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgQ1hGQV9Ob2RlKiBwU2lnTm9kZSwNCisgICAgICBGWF9CT09MDQorICAgICAgICAgIGJVc2VkID0gVFJVRSAvKiwgU2VjdXJpdHlIYW5kbGVyKiBwSGFuZGxlciwgU2lnbmF0dXJlSW5mbyAmaW5mbyovKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgdmlydHVhbCBGWF9CT09MIFNpZ24oDQorICAgICAgSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgQ1hGQV9Ob2RlTGlzdCogcE5vZGVMaXN0LA0KKyAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NFeHByZXNzaW9uLA0KKyAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NYTUxJZGVudCwNCisgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUgPSBGWF9XU1RSQyhMIm9wZW4iKSwNCisgICAgICBGWF9CT09MDQorICAgICAgICAgIGJVc2VkID0gVFJVRSAvKiwgU2VjdXJpdHlIYW5kbGVyKiBwSGFuZGxlciA9IE5VTEwsIFNpZ25hdHVyZUluZm8gJmluZm8qLykgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHZpcnR1YWwgQ1hGQV9Ob2RlTGlzdCogRW51bWVyYXRlKElYRkFfRG9jKiBoRG9jKSB7IHJldHVybiAwOyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2xlYXIoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwU2lnTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDbGVhcmVkID0gVFJVRSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisNCisgIC8vIEdldCBkb2N1bWVudCBwYXRoDQorICB2aXJ0dWFsIHZvaWQgR2V0VVJMKElYRkFfRG9jKiBoRG9jLCBDRlhfV2lkZVN0cmluZyYgd3NEb2NVUkwpOw0KKyAgdmlydHVhbCBGWF9BUkdCIEdldEhpZ2hsaWdodENvbG9yKElYRkFfRG9jKiBoRG9jKTsNCisgIHZpcnR1YWwgdm9pZCBBZGREb1JlY29yZChJWEZBX1dpZGdldCogaFdpZGdldCk7DQorICAvKioNCisgICAqU3VibWl0IGRhdGEgdG8gZW1haWwsIGh0dHAsIGZ0cC4NCisgICAqIEBwYXJhbVtpbl0gaERvYyBUaGUgZG9jdW1lbnQgaGFuZGxlci4NCisgICAqIEBwYXJhbVtpbl0gZUZvcm1hdCBEZXRlcm1pbmVzIHRoZSBmb3JtYXQgaW4gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZQ0KKyAgICpzdWJtaXR0ZWQuIFhGQV9BVFRSSUJVVEVFTlVNX1hkcCwgWEZBX0FUVFJJQlVURUVOVU1fWG1sLi4uDQorICAgKiBAcGFyYW1baW5dIHdzVGFyZ2V0IFRoZSBVUkwgdG8gd2hpY2ggdGhlIGRhdGEgd2lsbCBiZSBzdWJtaXR0ZWQuDQorICAgKiBAcGFyYW1baW5dIGVFbmNvZGluZyBUaGUgZW5jb2Rpbmcgb2YgdGV4dCBjb250ZW50Lg0KKyAgICogQHBhcmFtW2luXSBwWERQQ29udGVudCBDb250cm9scyB3aGF0IHN1YnNldCBvZiB0aGUgZGF0YSBpcyBzdWJtaXR0ZWQsIHVzZWQNCisgICAqb25seSB3aGVuIHRoZSBmb3JtYXQgcHJvcGVydHkgaXMgeGRwLg0KKyAgICogQHBhcmFtW2luXSBiRW1iZWRQREYsIHNwZWNpZmllcyB3aGV0aGVyIFBERiBpcyBlbWJlZGRlZCBpbiB0aGUgc3VibWl0dGVkDQorICAgKmNvbnRlbnQgb3Igbm90Lg0KKyAgICovDQorICB2aXJ0dWFsIEZYX0JPT0wgU3VibWl0RGF0YShJWEZBX0RvYyogaERvYywgQ1hGQV9TdWJtaXQgc3VibWl0KTsNCisNCisgIHZpcnR1YWwgRlhfQk9PTCBDaGVja1dvcmQoSVhGQV9Eb2MqIGhEb2MsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc1dvcmQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgdmlydHVhbCBGWF9CT09MIEdldFN1Z2dlc3RXb3JkcyhJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzV29yZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdBcnJheSYgc1N1Z2dlc3QpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKw0KKyAgLy8gR2V0IFBERiBqYXZhc2NyaXB0IG9iamVjdCwgc2V0IHRoZSBvYmplY3QgdG8gaFZhbHVlLg0KKyAgdmlydHVhbCBGWF9CT09MIEdldFBERlNjcmlwdE9iamVjdChJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB1dGY4TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorDQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0R2xvYmFsUHJvcGVydHkoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldEdsb2JhbFByb3BlcnR5KElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCisgIHZpcnR1YWwgQ1BERl9Eb2N1bWVudCogT3BlblBERihJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRmlsZVJlYWQqIHBGaWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRha2VPdmVyRmlsZSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisNCisgIHZpcnR1YWwgSUZYX0ZpbGVSZWFkKiBPcGVuTGlua2VkRmlsZShJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NMaW5rKTsNCisNCisgIEZYX0JPT0wgX0dldEhWYWx1ZUJ5TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHV0ZjhOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUpTX1J1bnRpbWUqIHJ1blRpbWUpOw0KKyAgRlhfQk9PTCBfT25CZWZvcmVOb3RpZnlTdW1iaXQoKTsNCisgIHZvaWQgX09uQWZ0ZXJOb3RpZnlTdW1iaXQoKTsNCisgIEZYX0JPT0wgX05vdGlmeVN1Ym1pdChGWF9CT09MIGJQcmV2T3JQb3N0KTsNCisgIEZYX0JPT0wgX1N1Ym1pdERhdGEoSVhGQV9Eb2MqIGhEb2MsIENYRkFfU3VibWl0IHN1Ym1pdCk7DQorICBGWF9CT09MIF9NYWlsVG9JbmZvKENGWF9XaWRlU3RyaW5nJiBjc1VSTCwNCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGNzVG9BZGRyZXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgY3NDQ0FkZHJlc3MsDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBjc0JDQ0FkZHJlc3MsDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBjc1N1YmplY3QsDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBjc01zZyk7DQorICBGWF9CT09MIF9FeHBvcnRTdWJtaXRGaWxlKEZQREZfRklMRUhBTkRMRVIqIHBwRmlsZUhhbmRsZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBlbmNvZGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RXT1JEIGZsYWcgPSAweDAxMTExMTExKTsNCisgIHZvaWQgX1RvWEZBQ29udGVudEZsYWdzKENGWF9XaWRlU3RyaW5nIGNzU3JjQ29udGVudCwgRlBERl9EV09SRCYgZmxhZyk7DQorICB2b2lkIF9DbGVhckNoYW5nZU1hcmsoKTsNCisNCisgcHJpdmF0ZToNCisgIHZvaWQgQ2xvc2VYRkFEb2MoSVhGQV9Eb2NIYW5kbGVyKiBwRG9jKSB7DQorICAgIGlmIChwRG9jKSB7DQorICAgICAgcERvYy0+Q2xvc2VEb2MobV9wWEZBRG9jKTsNCisgICAgICBwRG9jLT5SZWxlYXNlRG9jKG1fcFhGQURvYyk7DQorICAgICAgbV9wWEZBRG9jID0gTlVMTDsNCisgICAgICBtX3BYRkFEb2NWaWV3ID0gTlVMTDsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgaW50IG1faURvY1R5cGU7DQorICBDUERGX0RvY3VtZW50KiBtX3BQREZEb2M7DQorICBDUERGU0RLX0RvY3VtZW50KiBtX3BTREtEb2M7DQorICBJWEZBX0RvYyogbV9wWEZBRG9jOw0KKyAgSVhGQV9Eb2NWaWV3KiBtX3BYRkFEb2NWaWV3Ow0KKyAgQ1BERlhGQV9BcHAqIG1fcEFwcDsNCisgIElKU19Db250ZXh0KiBtX3BKU0NvbnRleHQ7DQorICBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGWEZBX1BhZ2UqPiBtX1hGQVBhZ2VMaXN0Ow0KK307DQorDQorI2VuZGlmICAvLyBGUERGWEZBX0RPQ19IXw0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfcGFnZS5oIGIvZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9wYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg4YmE5ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfcGFnZS5oCkBAIC0wLDAgKzEsNjUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlBERlhGQV9QQUdFVklFV19IXw0KKyNkZWZpbmUgX0ZQREZYRkFfUEFHRVZJRVdfSF8NCisNCitjbGFzcyBDUERGWEZBX1BhZ2Ugew0KKyBwdWJsaWM6DQorICBDUERGWEZBX1BhZ2UoQ1BERlhGQV9Eb2N1bWVudCogcERvYywgaW50IHBhZ2VfaW5kZXgpOw0KKyAgfkNQREZYRkFfUGFnZSgpOw0KKw0KKyAgdm9pZCBSZWxlYXNlKCk7DQorICB2b2lkIEFkZFJlZigpIHsgbV9pUmVmKys7IH0NCisgIEZYX0JPT0wgTG9hZFBhZ2UoKTsNCisgIEZYX0JPT0wgTG9hZFBERlBhZ2UoQ1BERl9EaWN0aW9uYXJ5KiBwYWdlRGljdCk7DQorICBDUERGWEZBX0RvY3VtZW50KiBHZXREb2N1bWVudCgpIHsgcmV0dXJuIG1fcERvY3VtZW50OyB9DQorICBpbnQgR2V0UGFnZUluZGV4KCkgeyByZXR1cm4gbV9pUGFnZUluZGV4OyB9DQorICBDUERGX1BhZ2UqIEdldFBERlBhZ2UoKSB7IHJldHVybiBtX3BQREZQYWdlOyB9DQorICBJWEZBX1BhZ2VWaWV3KiBHZXRYRkFQYWdlVmlldygpIHsgcmV0dXJuIG1fcFhGQVBhZ2VWaWV3OyB9DQorDQorICBGWF9GTE9BVCBHZXRQYWdlV2lkdGgoKTsNCisgIEZYX0ZMT0FUIEdldFBhZ2VIZWlnaHQoKTsNCisNCisgIHZvaWQgRGV2aWNlVG9QYWdlKGludCBzdGFydF94LA0KKyAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksDQorICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LA0KKyAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwNCisgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsDQorICAgICAgICAgICAgICAgICAgICBpbnQgZGV2aWNlX3gsDQorICAgICAgICAgICAgICAgICAgICBpbnQgZGV2aWNlX3ksDQorICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBhZ2VfeCwNCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcGFnZV95KTsNCisgIHZvaWQgUGFnZVRvRGV2aWNlKGludCBzdGFydF94LA0KKyAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksDQorICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LA0KKyAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwNCisgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsDQorICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LA0KKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSwNCisgICAgICAgICAgICAgICAgICAgIGludCogZGV2aWNlX3gsDQorICAgICAgICAgICAgICAgICAgICBpbnQqIGRldmljZV95KTsNCisNCisgIHZvaWQgR2V0RGlzcGxheU1hdHJpeChDRlhfTWF0cml4JiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB5U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaVJvdGF0ZSkgY29uc3Q7DQorDQorIHByb3RlY3RlZDoNCisgIEZYX0JPT0wgTG9hZFBERlBhZ2UoKTsNCisgIEZYX0JPT0wgTG9hZFhGQVBhZ2VWaWV3KCk7DQorDQorIHByaXZhdGU6DQorICBDUERGX1BhZ2UqIG1fcFBERlBhZ2U7DQorICBJWEZBX1BhZ2VWaWV3KiBtX3BYRkFQYWdlVmlldzsNCisgIGludCBtX2lQYWdlSW5kZXg7DQorICBDUERGWEZBX0RvY3VtZW50KiBtX3BEb2N1bWVudDsNCisgIGludCBtX2lSZWY7DQorfTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX3V0aWwuaCBiL2ZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NGQwMzAKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX3V0aWwuaApAQCAtMCwwICsxLDQwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgRlBERlNES19JTkNMVURFX0ZQREZYRkFfRlBERlhGQV9VVElMX0hfDQorI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfRlBERlhGQV9GUERGWEZBX1VUSUxfSF8NCisNCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJ0aW1lcm1nci5oIg0KKw0KKyNkZWZpbmUgSlNfU1RSX1ZJRVdFUlRZUEVfU1RBTkRBUkQgTCJFeGNoYW5nZSINCisjZGVmaW5lIEpTX1NUUl9MQU5HVUFOR0UgTCJFTlUiDQorI2RlZmluZSBKU19TVFJfVklFV0VSVkFSSUFUSU9OIEwiRnVsbCINCisjZGVmaW5lIEpTX1NUUl9WSUVXRVJWRVJTSU9OX1hGQSBMIjExIg0KKw0KK2NsYXNzIENYRkFfRldMQWRhcHRlclRpbWVyTWdyIDogcHVibGljIElGV0xfQWRhcHRlclRpbWVyTWdyIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GV0xBZGFwdGVyVGltZXJNZ3IoQ1BERkRvY19FbnZpcm9ubWVudCogcEVudikgOiBtX3BFbnYocEVudikge30NCisgIHZpcnR1YWwgRldMX0VSUiBTdGFydChJRldMX1RpbWVyKiBwVGltZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdFbGFwc2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hUSU1FUiYgaFRpbWVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkltbWVkaWF0ZWx5ID0gVFJVRSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU3RvcChGV0xfSFRJTUVSIGhUaW1lcik7DQorDQorIHByb3RlY3RlZDoNCisgIHN0YXRpYyB2b2lkIFRpbWVyUHJvYyhpbnQzMl90IGlkRXZlbnQpOw0KKw0KKyAgc3RhdGljIENGWF9QdHJBcnJheSBtc190aW1lckFycmF5Ow0KKyAgQ1BERkRvY19FbnZpcm9ubWVudCogbV9wRW52Ow0KK307DQorDQorY2xhc3MgQ0ZXTF9UaW1lckluZm8gew0KKyBwdWJsaWM6DQorICBDRldMX1RpbWVySW5mbygpIDogcFRpbWVyKG51bGxwdHIpIHt9DQorICB1aW50MzJfdCB1SURFdmVudDsNCisgIElGV0xfVGltZXIqIHBUaW1lcjsNCit9Ow0KKw0KKyNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0ZQREZYRkFfRlBERlhGQV9VVElMX0hfDQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYWN0aW9uaGFuZGxlci5oIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYWN0aW9uaGFuZGxlci5oCmluZGV4IDJiMzhhNWQuLjMzZjEyN2QgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2FjdGlvbmhhbmRsZXIuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnNka19hY3Rpb25oYW5kbGVyLmgKQEAgLTEsODggKzEsMTIzIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgRlBERlNES19JTkNMVURFX0ZTREtfQUNUSU9OSEFORExFUl9IXwogI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfRlNES19BQ1RJT05IQU5ETEVSX0hfCiAKLSNpbmNsdWRlICIuLi8uLi9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oIgotI2luY2x1ZGUgIi4uLy4uL2NvcmUvaW5jbHVkZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zdHJpbmcuaCIKICNpbmNsdWRlICJmc2RrX2Jhc2Vmb3JtLmgiCiAKIGNsYXNzIENGWF9QdHJMaXN0OwotY2xhc3MgQ1BERkRvY19FbnZpcm9ubWVudDsKIGNsYXNzIENQREZTREtfQW5ub3Q7CiBjbGFzcyBDUERGU0RLX0RvY3VtZW50OwogY2xhc3MgQ1BERl9Cb29rbWFyazsKIGNsYXNzIENQREZfRGljdGlvbmFyeTsKLWNsYXNzIElGWEpTX1J1bnRpbWU7CiAKLWNsYXNzIENQREZTREtfRm9ybUFjdGlvbkhhbmRsZXIKLXsKLXB1YmxpYzoKLQlGWF9CT09MCURvQWN0aW9uX0hpZGUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQlGWF9CT09MCURvQWN0aW9uX1N1Ym1pdEZvcm0oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQlGWF9CT09MCURvQWN0aW9uX1Jlc2V0Rm9ybShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCUZYX0JPT0wJRG9BY3Rpb25fSW1wb3J0RGF0YShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworY2xhc3MgQ1BERlNES19Gb3JtQWN0aW9uSGFuZGxlciB7CisgcHVibGljOgorICBGWF9CT09MIERvQWN0aW9uX0hpZGUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKyAgRlhfQk9PTCBEb0FjdGlvbl9TdWJtaXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworICBGWF9CT09MIERvQWN0aW9uX1Jlc2V0Rm9ybShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworICBGWF9CT09MIERvQWN0aW9uX0ltcG9ydERhdGEoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CiB9OwogCi1jbGFzcyBDUERGU0RLX01lZGlhQWN0aW9uSGFuZGxlcgotewotcHVibGljOgotCUZYX0JPT0wJRG9BY3Rpb25fUmVuZGl0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7Ci0JRlhfQk9PTAlEb0FjdGlvbl9Tb3VuZChjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotCUZYX0JPT0wJRG9BY3Rpb25fTW92aWUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLX07CitjbGFzcyBDUERGU0RLX0FjdGlvbkhhbmRsZXIgeworIHB1YmxpYzoKKyAgQ1BERlNES19BY3Rpb25IYW5kbGVyKCk7CiAKLWNsYXNzICBDUERGU0RLX0FjdGlvbkhhbmRsZXIgLyo6IHB1YmxpYyBDUmVhZGVyX0FjdGlvbkhhbmRsZXIqLwotewotcHVibGljOgotCUNQREZTREtfQWN0aW9uSGFuZGxlcihDUERGRG9jX0Vudmlyb25tZW50KiBwRXZpKTsKLQl2aXJ0dWFsIH5DUERGU0RLX0FjdGlvbkhhbmRsZXIoKTsKLQkKLQl2aXJ0dWFsIHZvaWQJCURlc3Ryb3koKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCURvQWN0aW9uX0RvY09wZW4oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LyosIENQREZTREtfRG9jVmlldyAqcERvY1ZpZXcqLyk7Ci0JdmlydHVhbCBGWF9CT09MCQlEb0FjdGlvbl9KYXZhU2NyaXB0KGNvbnN0IENQREZfQWN0aW9uJiBKc0FjdGlvbixDRlhfV2lkZVN0cmluZyBjc0pTTmFtZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LyosIENSZWFkZXJfRG9jVmlldyAqcERvY1ZpZXcqLyk7Ci0JdmlydHVhbCBGWF9CT09MCQlEb0FjdGlvbl9QYWdlKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIGVudW0gQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlVHlwZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LyosIENSZWFkZXJfRG9jVmlldyAqcERvY1ZpZXcqLyk7Ci0JdmlydHVhbCBGWF9CT09MCQlEb0FjdGlvbl9Eb2N1bWVudChjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBlbnVtIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZVR5cGUsIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudC8qLCBDUmVhZGVyX0RvY1ZpZXcgKnBEb2NWaWV3Ki8pOwotCXZpcnR1YWwgRlhfQk9PTAkJRG9BY3Rpb25fQm9va01hcmsoQ1BERl9Cb29rbWFyayAqcEJvb2tNYXJrLCBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudC8qLCBDUmVhZGVyX0RvY1ZpZXcgKnBEb2NWaWV3Ki8pOwkKLQl2aXJ0dWFsIEZYX0JPT0wJCURvQWN0aW9uX1NjcmVlbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwvKiBDUmVhZGVyX0RvY1ZpZXcgKnBEb2NWaWV3LCovIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZpcnR1YWwgRlhfQk9PTAkJRG9BY3Rpb25fTGluayhjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQvKiwgQ1JlYWRlcl9Eb2NWaWV3ICpwRG9jVmlldyovKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCURvQWN0aW9uX0ZpZWxkKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCAvKkNSZWFkZXJfRG9jVmlldyAqcERvY1ZpZXcsKi8gQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSk7Ci0JdmlydHVhbCBGWF9CT09MCQlEb0FjdGlvbl9GaWVsZEphdmFTY3JpcHQoY29uc3QgQ1BERl9BY3Rpb24mIEpzQWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSk7Ci1wdWJsaWM6Ci0Jdm9pZAkJCQlTZXRGb3JtQWN0aW9uSGFuZGxlcihDUERGU0RLX0Zvcm1BY3Rpb25IYW5kbGVyKiBwSGFuZGxlcik7Ci0Jdm9pZAkJCQlTZXRNZWRpYUFjdGlvbkhhbmRsZXIoQ1BERlNES19NZWRpYUFjdGlvbkhhbmRsZXIqIHBIYW5kbGVyKTsKLQkKLXByaXZhdGU6Ci0JRlhfQk9PTAkJCQlFeGVjdXRlRG9jdW1lbnRPcGVuQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgLypDUmVhZGVyX0RvY1ZpZXcgKnBEb2NWaWV3LCovIENGWF9QdHJMaXN0JiBsaXN0KTsKLQlGWF9CT09MCQkJCUV4ZWN1dGVEb2N1bWVudFBhZ2VBY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIC8qQ1JlYWRlcl9Eb2NWaWV3ICpwRG9jVmlldywqLyBDRlhfUHRyTGlzdCYgbGlzdCk7Ci0JRlhfQk9PTAkJCQlFeGVjdXRlRmllbGRBY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIC8qQ1JlYWRlcl9Eb2NWaWV3KiBwRG9jVmlldywqLyBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhLCBDRlhfUHRyTGlzdCYgbGlzdCk7Ci0JRlhfQk9PTAkJCQlFeGVjdXRlU2NyZWVuQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCAvKkNSZWFkZXJfRG9jVmlldyogcERvY1ZpZXcsKi8gQ1BERlNES19Bbm5vdCogcFNjcmVlbiwgQ0ZYX1B0ckxpc3QmIGxpc3QpOwotCUZYX0JPT0wJCQkJRXhlY3V0ZUJvb2tNYXJrKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgLypDUmVhZGVyX0RvY1ZpZXcqIHBEb2NWaWV3LCovIENQREZfQm9va21hcmsqIHBCb29rbWFyaywgQ0ZYX1B0ckxpc3QmIGxpc3QpOwotCUZYX0JPT0wJCQkJRXhlY3V0ZUxpbmtBY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCAvKkNSZWFkZXJfRG9jVmlldyogcERvY1ZpZXcsKi8gQ0ZYX1B0ckxpc3QmIGxpc3QpOwotCQotCXZvaWQJCQkJRG9BY3Rpb25fTm9Kcyhjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQvKiwgQ1JlYWRlcl9Eb2NWaWV3KiBwRG9jVmlldyovKTsKLQl2b2lkCQkJCVJ1bkRvY3VtZW50UGFnZUphdmFTY3JpcHQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQpOwotCXZvaWQJCQkJUnVuRG9jdW1lbnRPcGVuSmF2YVNjcmlwdChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzU2NyaXB0TmFtZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCk7Ci0Jdm9pZAkJCQlSdW5GaWVsZEphdmFTY3JpcHQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQpOwotCQotcHJpdmF0ZToKLQlGWF9CT09MCQkJCUlzVmFsaWRGaWVsZChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCk7Ci0JRlhfQk9PTAkJCQlJc1ZhbGlkRG9jVmlldyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQvKiwgQ1JlYWRlcl9Eb2NWaWV3KiBwRG9jVmlldyovKTsKLQkKLQl2b2lkCQkJCURvQWN0aW9uX0dvVG8oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCAvKkNSZWFkZXJfRG9jVmlldyAqcERvY1ZpZXcsKi8gY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbik7Ci0Jdm9pZAkJCQlEb0FjdGlvbl9Hb1RvUihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOwotCXZvaWQJCQkJRG9BY3Rpb25fTGF1bmNoKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbik7Ci0Jdm9pZAkJCQlEb0FjdGlvbl9VUkkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKTsKLQl2b2lkCQkJCURvQWN0aW9uX05hbWVkKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbik7Ci0Jdm9pZAkJCQlEb0FjdGlvbl9TZXRPQ0dTdGF0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIC8qQ1JlYWRlcl9Eb2NWaWV3KiBwRG9jVmlldywqLyBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKTsKLQkKLXByaXZhdGU6Ci0JQ1BERlNES19Gb3JtQWN0aW9uSGFuZGxlcioJCW1fcEZvcm1BY3Rpb25IYW5kbGVyOwotCUNQREZTREtfTWVkaWFBY3Rpb25IYW5kbGVyKgkJbV9wTWVkaWFBY3Rpb25IYW5kbGVyOworICBGWF9CT09MIERvQWN0aW9uX0RvY09wZW4oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisgIEZYX0JPT0wgRG9BY3Rpb25fSmF2YVNjcmlwdChjb25zdCBDUERGX0FjdGlvbiYgSnNBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc0pTTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisgIEZYX0JPT0wgRG9BY3Rpb25fUGFnZShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKyAgRlhfQk9PTCBEb0FjdGlvbl9Eb2N1bWVudChjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworICBGWF9CT09MIERvQWN0aW9uX0Jvb2tNYXJrKENQREZfQm9va21hcmsqIHBCb29rTWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworICBGWF9CT09MIERvQWN0aW9uX1NjcmVlbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisgIEZYX0JPT0wgRG9BY3Rpb25fTGluayhjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworICBGWF9CT09MIERvQWN0aW9uX0ZpZWxkKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEpOworICBGWF9CT09MIERvQWN0aW9uX0ZpZWxkSmF2YVNjcmlwdChjb25zdCBDUERGX0FjdGlvbiYgSnNBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhKTsKKworIHByaXZhdGU6CisgIEZYX0JPT0wgRXhlY3V0ZURvY3VtZW50T3BlbkFjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckxpc3QmIGxpc3QpOworICBGWF9CT09MIEV4ZWN1dGVEb2N1bWVudFBhZ2VBY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJMaXN0JiBsaXN0KTsKKyAgRlhfQk9PTCBFeGVjdXRlRmllbGRBY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJMaXN0JiBsaXN0KTsKKyAgRlhfQk9PTCBFeGVjdXRlU2NyZWVuQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckxpc3QmIGxpc3QpOworICBGWF9CT09MIEV4ZWN1dGVCb29rTWFyayhjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQm9va21hcmsqIHBCb29rbWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckxpc3QmIGxpc3QpOworICBGWF9CT09MIEV4ZWN1dGVMaW5rQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJMaXN0JiBsaXN0KTsKKworICB2b2lkIERvQWN0aW9uX05vSnMoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKyAgdm9pZCBSdW5Eb2N1bWVudFBhZ2VKYXZhU2NyaXB0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQpOworICB2b2lkIFJ1bkRvY3VtZW50T3BlbkphdmFTY3JpcHQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNTY3JpcHROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCk7CisgIHZvaWQgUnVuRmllbGRKYXZhU2NyaXB0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0KTsKKworICBGWF9CT09MIElzVmFsaWRGaWVsZChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCk7CisgIEZYX0JPT0wgSXNWYWxpZERvY1ZpZXcoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKKworICB2b2lkIERvQWN0aW9uX0dvVG8oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKTsKKyAgdm9pZCBEb0FjdGlvbl9Hb1RvUihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOworICB2b2lkIERvQWN0aW9uX0xhdW5jaChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOworICB2b2lkIERvQWN0aW9uX1VSSShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOworICB2b2lkIERvQWN0aW9uX05hbWVkKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbik7CisgIHZvaWQgRG9BY3Rpb25fU2V0T0NHU3RhdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGU0RLX0Zvcm1BY3Rpb25IYW5kbGVyPiBtX3BGb3JtQWN0aW9uSGFuZGxlcjsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0ZTREtfQUNUSU9OSEFORExFUl9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYW5ub3RoYW5kbGVyLmggYi9mcGRmc2RrL2luY2x1ZGUvZnNka19hbm5vdGhhbmRsZXIuaAppbmRleCBlMDRmMDlkLi45NWIxMWQxIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZnNka19hbm5vdGhhbmRsZXIuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnNka19hbm5vdGhhbmRsZXIuaApAQCAtMSwxMyArMSwyMCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIEZQREZTREtfSU5DTFVERV9GU0RLX0FOTk9USEFORExFUl9IXwogI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfRlNES19BTk5PVEhBTkRMRVJfSF8KIAotI2luY2x1ZGUgIi4uLy4uL2NvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisjZGVmaW5lIEZTREtfWEZBV0lER0VUX1RZUEVOQU1FICJYRkFXaWRnZXQiCisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKIGNsYXNzIENGRkxfSUZvcm1GaWxsZXI7CiBjbGFzcyBDRlhfUmVuZGVyRGV2aWNlOwpAQCAtMTUsMjQxICsyMiw0NDggQEAKIGNsYXNzIENQREZTREtfQW5ub3Q7CiBjbGFzcyBDUERGU0RLX1BhZ2VWaWV3OwogY2xhc3MgQ1BERl9Bbm5vdDsKLWNsYXNzIENQREZfTWF0cml4OworY2xhc3MgQ0ZYX01hdHJpeDsKIGNsYXNzIENQREZfUG9pbnQ7Ci1jbGFzcyBDUERGX1JlY3Q7CiAKLWNsYXNzIElQREZTREtfQW5ub3RIYW5kbGVyCi17CitjbGFzcyBJUERGU0RLX0Fubm90SGFuZGxlciB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JUERGU0RLX0Fubm90SGFuZGxlcigpIHt9CiAKLXB1YmxpYzoKLQl2aXJ0dWFsIH5JUERGU0RLX0Fubm90SGFuZGxlcigpIHt9OworICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIEdldFR5cGUoKSA9IDA7CiAKLQl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQlHZXRUeXBlKCkgPSAwOworICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIEdldE5hbWUoKSA9IDA7CiAKLQl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQlHZXROYW1lKCkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgQ2FuQW5zd2VyKENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCUNhbkFuc3dlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpID0gMDsKLQkKKyAgdmlydHVhbCBDUERGU0RLX0Fubm90KiBOZXdBbm5vdChDUERGX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2UpID0gMDsKIAotCXZpcnR1YWwgQ1BERlNES19Bbm5vdCoJCU5ld0Fubm90KENQREZfQW5ub3QqIHBBbm5vdCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2UpID0gMDsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICB2aXJ0dWFsIENQREZTREtfQW5ub3QqIE5ld0Fubm90KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlKSA9IDA7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKLQl2aXJ0dWFsIHZvaWQJCQkJUmVsZWFzZUFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOworICB2aXJ0dWFsIHZvaWQgUmVsZWFzZUFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOwogCi0JdmlydHVhbCB2b2lkCQkJCURlbGV0ZUFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOwotCQorICB2aXJ0dWFsIHZvaWQgRGVsZXRlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KSA9IDA7CiAKLQl2aXJ0dWFsIENQREZfUmVjdAkJCQlHZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOwotCQotCXZpcnR1YWwgRlhfQk9PTAkJCQlIaXRUZXN0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgPSAwOwotCQorICB2aXJ0dWFsIENQREZfUmVjdCBHZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOwogCi0JdmlydHVhbCB2b2lkCQkJCU9uRHJhdyhDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgCi0JCUNGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0JCUZYX0RXT1JEIGR3RmxhZ3MpID0gMDsKLQkKLQl2aXJ0dWFsIHZvaWQJCQkJT25EcmF3U2xlZXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIAotCQlDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAotCQljb25zdCBDUERGX1JlY3QmIHJjV2luZG93LCBGWF9EV09SRCBkd0ZsYWdzKSA9IDA7Ci0JCisgIHZpcnR1YWwgRlhfQk9PTCBIaXRUZXN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgPSAwOwogCi0JCisgIHZpcnR1YWwgdm9pZCBPbkRyYXcoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKSA9IDA7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJT25DcmVhdGUoQ1BERlNES19Bbm5vdCogcEFubm90KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPbkRyYXdTbGVlcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiByY1dpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpID0gMDsKIAotCXZpcnR1YWwgdm9pZAkJCQlPbkxvYWQoQ1BERlNES19Bbm5vdCogcEFubm90KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPbkNyZWF0ZShDUERGU0RLX0Fubm90KiBwQW5ub3QpID0gMDsKIAotCXZpcnR1YWwgdm9pZAkJCQlPbkRlbGV0ZShDUERGU0RLX0Fubm90KiBwQW5ub3QpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uTG9hZChDUERGU0RLX0Fubm90KiBwQW5ub3QpID0gMDsKIAotCXZpcnR1YWwgdm9pZAkJCQlPblJlbGVhc2UoQ1BERlNES19Bbm5vdCogcEFubm90KSA9IDA7Ci0JCisgIHZpcnR1YWwgdm9pZCBPbkRlbGV0ZShDUERGU0RLX0Fubm90KiBwQW5ub3QpID0gMDsKIAotCXZpcnR1YWwgdm9pZAkJCQlPbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykgPSAwOwotCQorICB2aXJ0dWFsIHZvaWQgT25SZWxlYXNlKENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25SQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7Ci0vL2J5IHdqbS4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFncykgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZykgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktleVVwKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpID0wIDsKKyAgdmlydHVhbCB2b2lkIE9uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPbk1vdXNlRXhpdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgPSAwOwogCi0JdmlydHVhbAl2b2lkCQkJCU9uRGVTZWxlY3RlZChDUERGU0RLX0Fubm90KiBwQW5ub3QpID0gMDsKLQl2aXJ0dWFsCXZvaWQJCQkJT25TZWxlY3RlZChDUERGU0RLX0Fubm90KiBwQW5ub3QpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBPblJCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgT25SQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisgIC8vIGJ5IHdqbS4KKyAgdmlydHVhbCBGWF9CT09MIE9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZykgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgT25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKSA9IDA7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKSA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uRGVTZWxlY3RlZChDUERGU0RLX0Fubm90KiBwQW5ub3QpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uU2VsZWN0ZWQoQ1BERlNES19Bbm5vdCogcEFubm90KSA9IDA7CiAKKyAgdmlydHVhbCBGWF9CT09MIE9uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgT25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykgPSAwOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIHZpcnR1YWwgRlhfQk9PTCBPblhGQUNoYW5nZWRGb2N1cyhDUERGU0RLX0Fubm90KiBwT2xkQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwTmV3QW5ub3QpID0gMDsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIH07CiAKK2NsYXNzIENQREZTREtfQkZBbm5vdEhhbmRsZXIgOiBwdWJsaWMgSVBERlNES19Bbm5vdEhhbmRsZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1BERlNES19CRkFubm90SGFuZGxlcihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKQorICAgICAgOiBtX3BBcHAocEFwcCksIG1fcEZvcm1GaWxsZXIoTlVMTCkge30KKyAgfkNQREZTREtfQkZBbm5vdEhhbmRsZXIoKSBvdmVycmlkZSB7fQogCi1jbGFzcyBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOnB1YmxpYyBJUERGU0RLX0Fubm90SGFuZGxlcgotewotcHVibGljOgotCUNQREZTREtfQkZBbm5vdEhhbmRsZXIoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCkgOiBtX3BBcHAocEFwcCksIG1fcEZvcm1GaWxsZXIoTlVMTCkge30KLQl2aXJ0dWFsCX5DUERGU0RLX0JGQW5ub3RIYW5kbGVyKCkge30KLXB1YmxpYzoKKyAgLy8gSVBERlNES19Bbm5vdEhhbmRsZXIKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0VHlwZSgpIG92ZXJyaWRlIHsgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCJXaWRnZXQiKTsgfQorICBDRlhfQnl0ZVN0cmluZyBHZXROYW1lKCkgb3ZlcnJpZGUgeyByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoIldpZGdldEhhbmRsZXIiKTsgfQorICBGWF9CT09MIENhbkFuc3dlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpIG92ZXJyaWRlOworICBDUERGU0RLX0Fubm90KiBOZXdBbm5vdChDUERGX0Fubm90KiBwQW5ub3QsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlKSBvdmVycmlkZTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBDUERGU0RLX0Fubm90KiBOZXdBbm5vdChJWEZBX1dpZGdldCogaFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2UpIG92ZXJyaWRlOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICB2b2lkIFJlbGVhc2VBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpIG92ZXJyaWRlOworICB2b2lkIERlbGV0ZUFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCkgb3ZlcnJpZGUge30KKyAgQ1BERl9SZWN0IEdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgSGl0VGVzdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgb3ZlcnJpZGU7CisgIHZvaWQgT25EcmF3KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpIG92ZXJyaWRlOworICB2b2lkIE9uRHJhd1NsZWVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiByY1dpbmRvdywKKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKSBvdmVycmlkZSB7fQorICB2b2lkIE9uQ3JlYXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCkgb3ZlcnJpZGU7CisgIHZvaWQgT25Mb2FkKENQREZTREtfQW5ub3QqIHBBbm5vdCkgb3ZlcnJpZGU7CisgIHZvaWQgT25EZWxldGUoQ1BERlNES19Bbm5vdCogcEFubm90KSBvdmVycmlkZSB7fQorICB2b2lkIE9uUmVsZWFzZShDUERGU0RLX0Fubm90KiBwQW5ub3QpIG92ZXJyaWRlIHt9CisgIHZvaWQgT25Nb3VzZUVudGVyKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgb3ZlcnJpZGU7CisgIHZvaWQgT25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgb3ZlcnJpZGU7CisgIEZYX0JPT0wgT25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIG92ZXJyaWRlOworICBGWF9CT09MIE9uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgT25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIG92ZXJyaWRlOworICBGWF9CT09MIE9uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCB6RGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBvdmVycmlkZTsKKyAgRlhfQk9PTCBPblJCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBvdmVycmlkZTsKKyAgRlhfQk9PTCBPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgT25SQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIEZYX0JPT0wgT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkNoYXIsCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncykgb3ZlcnJpZGU7CisgIEZYX0JPT0wgT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpIG92ZXJyaWRlOworICBGWF9CT09MIE9uS2V5VXAoQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZykgb3ZlcnJpZGU7CisgIHZvaWQgT25EZVNlbGVjdGVkKENQREZTREtfQW5ub3QqIHBBbm5vdCkgb3ZlcnJpZGUge30KKyAgdm9pZCBPblNlbGVjdGVkKENQREZTREtfQW5ub3QqIHBBbm5vdCkgb3ZlcnJpZGUge30KKyAgRlhfQk9PTCBPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpIG92ZXJyaWRlOworICBGWF9CT09MIE9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpIG92ZXJyaWRlOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIEZYX0JPT0wgT25YRkFDaGFuZ2VkRm9jdXMoQ1BERlNES19Bbm5vdCogcE9sZEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBOZXdBbm5vdCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBUUlVFOworICB9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKLQl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQlHZXRUeXBlKCkgIHtyZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoIldpZGdldCIpO30KKyAgdm9pZCBTZXRGb3JtRmlsbGVyKENGRkxfSUZvcm1GaWxsZXIqIHBGaWxsZXIpIHsgbV9wRm9ybUZpbGxlciA9IHBGaWxsZXI7IH0KKyAgQ0ZGTF9JRm9ybUZpbGxlciogR2V0Rm9ybUZpbGxlcigpIHsgcmV0dXJuIG1fcEZvcm1GaWxsZXI7IH0KIAotCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldE5hbWUoKSAge3JldHVybiBDRlhfQnl0ZVN0cmluZygiV2lkZ2V0SGFuZGxlciIpO30KLQkKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQ2FuQW5zd2VyKENQREZTREtfQW5ub3QqIHBBbm5vdCk7Ci0KLQl2aXJ0dWFsIENQREZTREtfQW5ub3QqCQlOZXdBbm5vdChDUERGX0Fubm90KiBwQW5ub3QsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlKTsKLQotCXZpcnR1YWwgdm9pZAkJCQlSZWxlYXNlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KSAgOwotCi0JdmlydHVhbCB2b2lkCQkJCURlbGV0ZUFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCkge30KLQkKLQotCXZpcnR1YWwgQ1BERl9SZWN0CQkJCUdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KSA7Ci0JCi0JdmlydHVhbCBGWF9CT09MCQkJCUhpdFRlc3QoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQkKLQotCXZpcnR1YWwgdm9pZAkJCQlPbkRyYXcoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIAotCQlDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAotCQkgRlhfRFdPUkQgZHdGbGFncykgOwotCQotCXZpcnR1YWwgdm9pZAkJCQlPbkRyYXdTbGVlcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgCi0JCUNGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0JCWNvbnN0IENQREZfUmVjdCYgcmNXaW5kb3csIEZYX0RXT1JEIGR3RmxhZ3MpIHt9Ci0JCi0KLQl2aXJ0dWFsIHZvaWQJCQkJT25DcmVhdGUoQ1BERlNES19Bbm5vdCogcEFubm90KSA7Ci0KLQl2aXJ0dWFsIHZvaWQJCQkJT25Mb2FkKENQREZTREtfQW5ub3QqIHBBbm5vdCkgOwotCi0JdmlydHVhbCB2b2lkCQkJCU9uRGVsZXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCkge30KLQotCXZpcnR1YWwgdm9pZAkJCQlPblJlbGVhc2UoQ1BERlNES19Bbm5vdCogcEFubm90KSB7fQotCQotCi0JdmlydHVhbCB2b2lkCQkJCU9uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpIDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKSA7Ci0JCi0KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPblJCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHtyZXR1cm4gRkFMU0U7fQotCQotLy9ieSB3am0uCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZ3MpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uS2V5VXAoQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZyk7Ci0KLQl2aXJ0dWFsCXZvaWQJCQkJT25EZVNlbGVjdGVkKENQREZTREtfQW5ub3QqIHBBbm5vdCkge30KLQl2aXJ0dWFsCXZvaWQJCQkJT25TZWxlY3RlZChDUERGU0RLX0Fubm90KiBwQW5ub3QpIHt9Ci0KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZyk7Ci0KLQl2b2lkCQkJCQkJU2V0Rm9ybUZpbGxlcihDRkZMX0lGb3JtRmlsbGVyKiBwRmlsbGVyKXttX3BGb3JtRmlsbGVyID0gcEZpbGxlcjt9Ci0JQ0ZGTF9JRm9ybUZpbGxlcioJCQlHZXRGb3JtRmlsbGVyKCkge3JldHVybiBtX3BGb3JtRmlsbGVyO30KLXByaXZhdGU6Ci0KLQlDUERGRG9jX0Vudmlyb25tZW50KgkJbV9wQXBwOwotCUNGRkxfSUZvcm1GaWxsZXIqCQkJbV9wRm9ybUZpbGxlcjsKKyBwcml2YXRlOgorICBDUERGRG9jX0Vudmlyb25tZW50KiBtX3BBcHA7CisgIENGRkxfSUZvcm1GaWxsZXIqIG1fcEZvcm1GaWxsZXI7CiB9OwogCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK2NsYXNzIENQREZTREtfWEZBQW5ub3RIYW5kbGVyIDogcHVibGljIElQREZTREtfQW5ub3RIYW5kbGVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENQREZTREtfWEZBQW5ub3RIYW5kbGVyKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApOworICB+Q1BERlNES19YRkFBbm5vdEhhbmRsZXIoKSB7fQorCisgcHVibGljOgorICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIEdldFR5cGUoKSB7IHJldHVybiBGU0RLX1hGQVdJREdFVF9UWVBFTkFNRTsgfQorCisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0TmFtZSgpIHsgcmV0dXJuICJYRkFXaWRnZXRIYW5kbGVyIjsgfQorCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5BbnN3ZXIoQ1BERlNES19Bbm5vdCogcEFubm90KTsKKworICB2aXJ0dWFsIENQREZTREtfQW5ub3QqIE5ld0Fubm90KENQREZfQW5ub3QqIHBBbm5vdCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2UpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHZpcnR1YWwgQ1BERlNES19Bbm5vdCogTmV3QW5ub3QoSVhGQV9XaWRnZXQqIHBBbm5vdCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2UpOworCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KTsKKworICB2aXJ0dWFsIHZvaWQgRGVsZXRlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KSB7fQorCisgIHZpcnR1YWwgQ1BERl9SZWN0IEdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90KTsKKworICB2aXJ0dWFsIEZYX0JPT0wgSGl0VGVzdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCisgIHZpcnR1YWwgdm9pZCBPbkRyYXcoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKTsKKworICB2aXJ0dWFsIHZvaWQgT25EcmF3U2xlZXAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgcmNXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKSB7fQorCisgIHZpcnR1YWwgdm9pZCBPbkNyZWF0ZShDUERGU0RLX0Fubm90KiBwQW5ub3QpIHt9CisKKyAgdmlydHVhbCB2b2lkIE9uTG9hZChDUERGU0RLX0Fubm90KiBwQW5ub3QpIHt9CisKKyAgdmlydHVhbCB2b2lkIE9uRGVsZXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCkge30KKworICB2aXJ0dWFsIHZvaWQgT25SZWxlYXNlKENQREZTREtfQW5ub3QqIHBBbm5vdCkge30KKworICB2aXJ0dWFsIHZvaWQgT25Nb3VzZUVudGVyKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpOworICB2aXJ0dWFsIHZvaWQgT25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpOworCisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICB2aXJ0dWFsIEZYX0JPT0wgT25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICB2aXJ0dWFsIEZYX0JPT0wgT25SQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgLy8gYnkgd2ptLgorICB2aXJ0dWFsIEZYX0JPT0wgT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MpOworICB2aXJ0dWFsIEZYX0JPT0wgT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpOworICB2aXJ0dWFsIEZYX0JPT0wgT25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKKworICB2aXJ0dWFsIHZvaWQgT25EZVNlbGVjdGVkKENQREZTREtfQW5ub3QqIHBBbm5vdCkge30KKyAgdmlydHVhbCB2b2lkIE9uU2VsZWN0ZWQoQ1BERlNES19Bbm5vdCogcEFubm90KSB7fQorCisgIHZpcnR1YWwgRlhfQk9PTCBPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpOworICB2aXJ0dWFsIEZYX0JPT0wgT25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPblhGQUNoYW5nZWRGb2N1cyhDUERGU0RLX0Fubm90KiBwT2xkQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwTmV3QW5ub3QpOworCisgcHJpdmF0ZToKKyAgSVhGQV9XaWRnZXRIYW5kbGVyKiBHZXRYRkFXaWRnZXRIYW5kbGVyKENQREZTREtfQW5ub3QqIHBBbm5vdCk7CisgIEZYX0RXT1JEIEdldEZXTEZsYWdzKEZYX0RXT1JEIGR3RmxhZyk7CisKKyBwcml2YXRlOgorICBDUERGRG9jX0Vudmlyb25tZW50KiBtX3BBcHA7Cit9OworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCiAjZGVmaW5lIENCQV9Bbm5vdEhhbmRsZXJBcnJheSBDRlhfQXJyYXlUZW1wbGF0ZTxJUERGU0RLX0Fubm90SGFuZGxlcio+Ci1jbGFzcyBDUERGU0RLX0Fubm90SGFuZGxlck1ncgotewotcHVibGljOgotCS8vIERlc3Ryb3kgdGhlIGhhbmRsZXIKLQlDUERGU0RLX0Fubm90SGFuZGxlck1ncihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKTsKLQl2aXJ0dWFsIH5DUERGU0RLX0Fubm90SGFuZGxlck1ncigpIDsKK2NsYXNzIENQREZTREtfQW5ub3RIYW5kbGVyTWdyIHsKKyBwdWJsaWM6CisgIC8vIERlc3Ryb3kgdGhlIGhhbmRsZXIKKyAgZXhwbGljaXQgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCk7CisgIHZpcnR1YWwgfkNQREZTREtfQW5ub3RIYW5kbGVyTWdyKCk7CiAKLXB1YmxpYzoKLQl2b2lkCQkJCQkJUmVnaXN0ZXJBbm5vdEhhbmRsZXIoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIpOwotCXZvaWQJCQkJCQlVblJlZ2lzdGVyQW5ub3RIYW5kbGVyKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyKTsKKyBwdWJsaWM6CisgIHZvaWQgUmVnaXN0ZXJBbm5vdEhhbmRsZXIoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIpOworICB2b2lkIFVuUmVnaXN0ZXJBbm5vdEhhbmRsZXIoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIpOwogCi0JdmlydHVhbCBDUERGU0RLX0Fubm90KgkJTmV3QW5ub3QoQ1BERl9Bbm5vdCAqIHBBbm5vdCwgQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3KTsKLQl2aXJ0dWFsIHZvaWQJCQkJUmVsZWFzZUFubm90KENQREZTREtfQW5ub3QgKiBwQW5ub3QpOwotCQotCXZpcnR1YWwgdm9pZAkJCQlBbm5vdF9PbkNyZWF0ZShDUERGU0RLX0Fubm90KiBwQW5ub3QpOwotCXZpcnR1YWwgdm9pZAkJCQlBbm5vdF9PbkxvYWQoQ1BERlNES19Bbm5vdCogcEFubm90KTsKLXB1YmxpYzoKLQlJUERGU0RLX0Fubm90SGFuZGxlcioJCUdldEFubm90SGFuZGxlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpIGNvbnN0OwotCXZpcnR1YWwgdm9pZAkJCQlBbm5vdF9PbkRyYXcoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsCi0JCUNGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsRlhfRFdPUkQgZHdGbGFncyk7CisgIHZpcnR1YWwgQ1BERlNES19Bbm5vdCogTmV3QW5ub3QoQ1BERl9Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgdmlydHVhbCBDUERGU0RLX0Fubm90KiBOZXdBbm5vdChJWEZBX1dpZGdldCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KTsKIAotCXZpcnR1YWwgdm9pZAkJCQlBbm5vdF9Pbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MpOwotCXZpcnR1YWwgdm9pZAkJCQlBbm5vdF9Pbk1vdXNlRXhpdChDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncyk7CisgIHZpcnR1YWwgdm9pZCBBbm5vdF9PbkNyZWF0ZShDUERGU0RLX0Fubm90KiBwQW5ub3QpOworICB2aXJ0dWFsIHZvaWQgQW5ub3RfT25Mb2FkKENQREZTREtfQW5ub3QqIHBBbm5vdCk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlBbm5vdF9PbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlBbm5vdF9PbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQkKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlBbm5vdF9PblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworIHB1YmxpYzoKKyAgSVBERlNES19Bbm5vdEhhbmRsZXIqIEdldEFubm90SGFuZGxlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgQW5ub3RfT25EcmF3KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncyk7CiAKKyAgdmlydHVhbCB2b2lkIEFubm90X09uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncyk7CisgIHZpcnR1YWwgdm9pZCBBbm5vdF9Pbk1vdXNlRXhpdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCUFubm90X09uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZ3MpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlBbm5vdF9PbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUFubm90X09uS2V5VXAoQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBBbm5vdF9PbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIEFubm90X09uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIEFubm90X09uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBBbm5vdF9Pbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZpcnR1YWwgRlhfQk9PTCBBbm5vdF9Pbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBGWF9CT09MIEFubm90X09uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICB2aXJ0dWFsIEZYX0JPT0wgQW5ub3RfT25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwogCi0JdmlydHVhbCBDUERGX1JlY3QJCQlBbm5vdF9PbkdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQW5ub3RfT25IaXRUZXN0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZpcnR1YWwgRlhfQk9PTCBBbm5vdF9PbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5DaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncyk7CisgIHZpcnR1YWwgRlhfQk9PTCBBbm5vdF9PbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuS2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZsYWcpOworICB2aXJ0dWFsIEZYX0JPT0wgQW5ub3RfT25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKTsKIAotcHJpdmF0ZToKLQlJUERGU0RLX0Fubm90SGFuZGxlcioJCQlHZXRBbm5vdEhhbmRsZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNUeXBlKSBjb25zdDsKLQlDUERGU0RLX0Fubm90KgkJCQlHZXROZXh0QW5ub3QoQ1BERlNES19Bbm5vdCogcFNES0Fubm90LEZYX0JPT0wgYk5leHQpOwotcHJpdmF0ZToKLQlDQkFfQW5ub3RIYW5kbGVyQXJyYXkJCW1fSGFuZGxlcnM7Ci0JQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cgkJbV9tYXBUeXBlMkhhbmRsZXI7Ci0JQ1BERkRvY19FbnZpcm9ubWVudCoJCW1fcEFwcDsKKyAgdmlydHVhbCBGWF9CT09MIEFubm90X09uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBBbm5vdF9PbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKTsKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIHZpcnR1YWwgRlhfQk9PTCBBbm5vdF9PbkNoYW5nZUZvY3VzKENQREZTREtfQW5ub3QqIHBTZXRBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEtpbGxBbm5vdCk7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKKyAgdmlydHVhbCBDUERGX1JlY3QgQW5ub3RfT25HZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90KTsKKyAgdmlydHVhbCBGWF9CT09MIEFubm90X09uSGl0VGVzdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKworIHByaXZhdGU6CisgIElQREZTREtfQW5ub3RIYW5kbGVyKiBHZXRBbm5vdEhhbmRsZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNUeXBlKSBjb25zdDsKKyAgQ1BERlNES19Bbm5vdCogR2V0TmV4dEFubm90KENQREZTREtfQW5ub3QqIHBTREtBbm5vdCwgRlhfQk9PTCBiTmV4dCk7CisKKyBwcml2YXRlOgorICBDQkFfQW5ub3RIYW5kbGVyQXJyYXkgbV9IYW5kbGVyczsKKyAgc3RkOjptYXA8Q0ZYX0J5dGVTdHJpbmcsIElQREZTREtfQW5ub3RIYW5kbGVyKj4gbV9tYXBUeXBlMkhhbmRsZXI7CisgIENQREZEb2NfRW52aXJvbm1lbnQqIG1fcEFwcDsKIH07CiAKLS8vI2RlZmluZSBDQkZfUGFnZTJBY2Nlc3NpYmxlCSBDRlhfTWFwUHRyVGVtcGxhdGU8Q1BERlNES19QYWdlVmlldyosIElBY2Nlc3NpYmxlKj4KK2NsYXNzIENQREZTREtfQW5ub3RJdGVyYXRvciB7CisgcHVibGljOgorICBDUERGU0RLX0Fubm90SXRlcmF0b3IoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBib29sIGJSZXZlcnNlKTsKKyAgfkNQREZTREtfQW5ub3RJdGVyYXRvcigpOwogCi10eXBlZGVmIGludCAoKkFJX0NPTVBBUkUpIChDUERGU0RLX0Fubm90KiBwMSwgQ1BERlNES19Bbm5vdCogcDIpOworICBDUERGU0RLX0Fubm90KiBOZXh0KCk7CiAKLWNsYXNzIENQREZTREtfQW5ub3RJdGVyYXRvcgotewotcHVibGljOgotICAgIENQREZTREtfQW5ub3RJdGVyYXRvcihDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBGWF9CT09MIGJSZXZlcnNlLAotCQlGWF9CT09MIGJJZ25vcmVUb3Btb3N0PUZBTFNFLEZYX0JPT0wgYkNpcmNsZT1GQUxTRSxDRlhfUHRyQXJyYXkqIHBMaXN0PU5VTEwpOwotICAgIHZpcnR1YWwgfkNQREZTREtfQW5ub3RJdGVyYXRvcigpIHsgfQorIHByaXZhdGU6CisgIENQREZTREtfQW5ub3QqIE5leHRBbm5vdCgpOworICBDUERGU0RLX0Fubm90KiBQcmV2QW5ub3QoKTsKIAotCXZpcnR1YWwgQ1BERlNES19Bbm5vdCoJTmV4dCAoY29uc3QgQ1BERlNES19Bbm5vdCogcEN1cnJlbnQpIDsKLQl2aXJ0dWFsIENQREZTREtfQW5ub3QqCVByZXYgKGNvbnN0IENQREZTREtfQW5ub3QqIHBDdXJyZW50KSA7CQotCXZpcnR1YWwgQ1BERlNES19Bbm5vdCoJTmV4dChpbnQmIGluZGV4ICkgOwotCXZpcnR1YWwgQ1BERlNES19Bbm5vdCoJUHJldihpbnQmIGluZGV4ICkgOwotCXZpcnR1YWwgaW50ICAgICAgICAgICAgIENvdW50KCl7cmV0dXJuIG1fcEl0ZXJhdG9yQW5ub3RMaXN0LkdldFNpemUoKTt9Ci0KLQl2aXJ0dWFsIEZYX0JPT0wgICAgICAgICBJbml0SXRlcmF0b3JBbm5vdExpc3QoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldyxDRlhfUHRyQXJyYXkqIHBMaXN0PU5VTEwpOwotCi0Jdm9pZAkJCQkJSW5zZXJ0U29ydChDRlhfUHRyQXJyYXkgJmFycmF5TGlzdCwgQUlfQ09NUEFSRSBwQ29tcGFyZSk7Ci0KLXByb3RlY3RlZDoKLQlDUERGU0RLX0Fubm90KglOZXh0QW5ub3QgKGNvbnN0IENQREZTREtfQW5ub3QqIHBDdXJyZW50KSA7Ci0JQ1BERlNES19Bbm5vdCoJUHJldkFubm90IChjb25zdCBDUERGU0RLX0Fubm90KiBwQ3VycmVudCkgOwotCUNQREZTREtfQW5ub3QqCU5leHRBbm5vdChpbnQmIGluZGV4ICkgOwotCUNQREZTREtfQW5ub3QqCVByZXZBbm5vdChpbnQmIGluZGV4ICkgOwotCi0JQ0ZYX1B0ckFycmF5CSAgICAgbV9wSXRlcmF0b3JBbm5vdExpc3Q7Ci0JRlhfQk9PTAkJCSAgICAgbV9iUmV2ZXJzZTsKLQlGWF9CT09MICAgICAgICAgICAgICBtX2JJZ25vcmVUb3Btb3N0OwotCUZYX0JPT0wgICAgICAgICAgICAgIG1fYkNpcmNsZTsKKyAgc3RkOjp2ZWN0b3I8Q1BERlNES19Bbm5vdCo+IG1faXRlcmF0b3JBbm5vdExpc3Q7CisgIGNvbnN0IGJvb2wgbV9iUmV2ZXJzZTsKKyAgc2l6ZV90IG1fcG9zOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfRlNES19BTk5PVEhBTkRMRVJfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Jhc2Vhbm5vdC5oIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYmFzZWFubm90LmgKaW5kZXggZGJkN2UwMC4uNDljMjVkZSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYmFzZWFubm90LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYmFzZWFubm90LmgKQEAgLTEsNyArMSw3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgRlBERlNES19JTkNMVURFX0ZTREtfQkFTRUFOTk9UX0hfCkBAIC0xMywxODEgKzEzLDIxMCBAQAogI2luY2x1ZGUgPGN0aW1lPgogI2VuZGlmCiAKLSNpbmNsdWRlICIuLi8uLi9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oIgotI2luY2x1ZGUgIi4uLy4uL2NvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgotI2luY2x1ZGUgImZ4X3N5c3RlbWhhbmRsZXIuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mc2RrX2RlZmluZS5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9meF9zeXN0ZW1oYW5kbGVyLmgiCiAKIGNsYXNzIENQREZTREtfUGFnZVZpZXc7CiBjbGFzcyBDUERGX0Fubm90OwogY2xhc3MgQ1BERl9QYWdlOwotY2xhc3MgQ1BERl9SZWN0OwotY2xhc3MgQ1BERl9NYXRyaXg7CitjbGFzcyBDRlhfTWF0cml4OwogY2xhc3MgQ1BERl9SZW5kZXJPcHRpb25zOwogY2xhc3MgQ0ZYX1JlbmRlckRldmljZTsKIAotI2RlZmluZSBDRlhfSW50QXJyYXkJCQkJQ0ZYX0FycmF5VGVtcGxhdGU8aW50PgorI2RlZmluZSBDRlhfSW50QXJyYXkgQ0ZYX0FycmF5VGVtcGxhdGU8aW50PgogCi1jbGFzcyAgQ1BERlNES19EYXRlVGltZSAKLXsKLXB1YmxpYzoKLQlDUERGU0RLX0RhdGVUaW1lKCk7Ci0JQ1BERlNES19EYXRlVGltZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgZHRTdHIpOwotCUNQREZTREtfRGF0ZVRpbWUoY29uc3QgQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpOwotCUNQREZTREtfRGF0ZVRpbWUoY29uc3QgRlhfU1lTVEVNVElNRSYgc3QpOwotCQotCQotCUNQREZTREtfRGF0ZVRpbWUmCW9wZXJhdG9yID0gKGNvbnN0IENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKLQlDUERGU0RLX0RhdGVUaW1lJglvcGVyYXRvciA9IChjb25zdCBGWF9TWVNURU1USU1FJiBzdCk7Ci0JRlhfQk9PTAkJCQlvcGVyYXRvciA9PSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpOwotCUZYX0JPT0wJCQkJb3BlcmF0b3IgIT0gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKLQlGWF9CT09MCQkJCW9wZXJhdG9yID4gKENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKLQlGWF9CT09MCQkJCW9wZXJhdG9yID49IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSk7Ci0JRlhfQk9PTAkJCQlvcGVyYXRvciA8IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSk7Ci0JRlhfQk9PTAkJCQlvcGVyYXRvciA8PSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpOwkKLQkJCQkJCW9wZXJhdG9yIHRpbWVfdCgpOwotCQotCUNQREZTREtfRGF0ZVRpbWUmCUZyb21QREZEYXRlVGltZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgZHRTdHIpOwotCUNGWF9CeXRlU3RyaW5nCQlUb0NvbW1vbkRhdGVUaW1lU3RyaW5nKCk7Ci0JQ0ZYX0J5dGVTdHJpbmcJCVRvUERGRGF0ZVRpbWVTdHJpbmcoKTsKLQl2b2lkCQkJCVRvU3lzdGVtVGltZShGWF9TWVNURU1USU1FJiBzdCk7Ci0JQ1BERlNES19EYXRlVGltZQlUb0dNVCgpOwotCUNQREZTREtfRGF0ZVRpbWUmCUFkZERheXMoc2hvcnQgZGF5cyk7Ci0JQ1BERlNES19EYXRlVGltZSYJQWRkU2Vjb25kcyhpbnQgc2Vjb25kcyk7Ci0JCi0Jdm9pZAkJCQlSZXNldERhdGVUaW1lKCk7Ci0JCi0Jc3RydWN0IEZYX0RBVEVUSU1FCi0JewotCQlGWF9TSE9SVAl5ZWFyOwotCQlGWF9CWVRFCQltb250aDsKLQkJRlhfQllURQkJZGF5OwotCQlGWF9CWVRFCQlob3VyOwotCQlGWF9CWVRFCQltaW51dGU7Ci0JCUZYX0JZVEUJCXNlY29uZDsKLQkJRlhfSU5UOCAJdHpIb3VyOwotCQlGWF9CWVRFCQl0ek1pbnV0ZTsKLQl9ZHQ7CitjbGFzcyBDUERGU0RLX0RhdGVUaW1lIHsKKyBwdWJsaWM6CisgIENQREZTREtfRGF0ZVRpbWUoKTsKKyAgQ1BERlNES19EYXRlVGltZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgZHRTdHIpOworICBDUERGU0RLX0RhdGVUaW1lKGNvbnN0IENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKKyAgQ1BERlNES19EYXRlVGltZShjb25zdCBGWF9TWVNURU1USU1FJiBzdCk7CisKKyAgQ1BERlNES19EYXRlVGltZSYgb3BlcmF0b3I9KGNvbnN0IENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKKyAgQ1BERlNES19EYXRlVGltZSYgb3BlcmF0b3I9KGNvbnN0IEZYX1NZU1RFTVRJTUUmIHN0KTsKKyAgRlhfQk9PTCBvcGVyYXRvcj09KENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKKyAgRlhfQk9PTCBvcGVyYXRvciE9KENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKKyAgRlhfQk9PTCBvcGVyYXRvcj4oQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpOworICBGWF9CT09MIG9wZXJhdG9yPj0oQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpOworICBGWF9CT09MIG9wZXJhdG9yPChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSk7CisgIEZYX0JPT0wgb3BlcmF0b3I8PShDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSk7CisgIG9wZXJhdG9yIHRpbWVfdCgpOworCisgIENQREZTREtfRGF0ZVRpbWUmIEZyb21QREZEYXRlVGltZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgZHRTdHIpOworICBDRlhfQnl0ZVN0cmluZyBUb0NvbW1vbkRhdGVUaW1lU3RyaW5nKCk7CisgIENGWF9CeXRlU3RyaW5nIFRvUERGRGF0ZVRpbWVTdHJpbmcoKTsKKyAgdm9pZCBUb1N5c3RlbVRpbWUoRlhfU1lTVEVNVElNRSYgc3QpOworICBDUERGU0RLX0RhdGVUaW1lIFRvR01UKCk7CisgIENQREZTREtfRGF0ZVRpbWUmIEFkZERheXMoc2hvcnQgZGF5cyk7CisgIENQREZTREtfRGF0ZVRpbWUmIEFkZFNlY29uZHMoaW50IHNlY29uZHMpOworCisgIHZvaWQgUmVzZXREYXRlVGltZSgpOworCisgIHN0cnVjdCBGWF9EQVRFVElNRSB7CisgICAgaW50MTZfdCB5ZWFyOworICAgIHVpbnQ4X3QgbW9udGg7CisgICAgdWludDhfdCBkYXk7CisgICAgdWludDhfdCBob3VyOworICAgIHVpbnQ4X3QgbWludXRlOworICAgIHVpbnQ4X3Qgc2Vjb25kOworICAgIGludDhfdCB0ekhvdXI7CisgICAgdWludDhfdCB0ek1pbnV0ZTsKKyAgfSBkdDsKIH07CiAKLWNsYXNzIENQREZTREtfQW5ub3QKLXsKLXB1YmxpYzoKLQlDUERGU0RLX0Fubm90KENQREZfQW5ub3QqIHBBbm5vdCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKLQl2aXJ0dWFsIH5DUERGU0RLX0Fubm90KCk7Ci1wdWJsaWM6Ci0JdmlydHVhbCBGWF9GTE9BVAkJCUdldE1pbldpZHRoKCkgY29uc3Q7Ci0JdmlydHVhbCBGWF9GTE9BVAkJCUdldE1pbkhlaWdodCgpIGNvbnN0OwotCS8vZGVmaW5lIGxheW91dCBvcmRlciB0byA1LgotCXZpcnR1YWwgaW50CQkJCQlHZXRMYXlvdXRPcmRlcigpIGNvbnN0IHsgcmV0dXJuIDU7IH0KK2NsYXNzIENQREZTREtfQW5ub3QgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1BERlNES19Bbm5vdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworICB2aXJ0dWFsIH5DUERGU0RLX0Fubm90KCkge30KIAotcHVibGljOgotCUNQREZfQW5ub3QqCQkJCQlHZXRQREZBbm5vdCgpOwotCQotCXZvaWQJCQkJCQlTZXRQYWdlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7Ci0JQ1BERlNES19QYWdlVmlldyoJCQlHZXRQYWdlVmlldygpOwkKLQlGWF9EV09SRAkJCQkJR2V0RmxhZ3MoKTsKLQkKLQkvLyBUYWIgT3JkZXIJCi0JaW50CQkJCQkJCUdldFRhYk9yZGVyKCk7Ci0Jdm9pZAkJCQkJCVNldFRhYk9yZGVyKGludCBpVGFiT3JkZXIpOwotCQotCS8vIFNlbGVjdGlvbgotCUZYX0JPT0wJCQkJCQlJc1NlbGVjdGVkKCk7Ci0Jdm9pZAkJCQkJCVNldFNlbGVjdGVkKEZYX0JPT0wgYlNlbGVjdGVkKTsKLQkKLQlDRlhfQnl0ZVN0cmluZwkJCQlHZXRUeXBlKCkgY29uc3Q7Ci0JdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0U3ViVHlwZSgpIGNvbnN0OworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIHZpcnR1YWwgRlhfQk9PTCBJc1hGQUZpZWxkKCkgeyByZXR1cm4gRkFMU0U7IH0KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAotCUNQREZfUGFnZSoJCQkJCUdldFBERlBhZ2UoKTsKKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRNaW5XaWR0aCgpIGNvbnN0OworICB2aXJ0dWFsIEZYX0ZMT0FUIEdldE1pbkhlaWdodCgpIGNvbnN0OworICAvLyBkZWZpbmUgbGF5b3V0IG9yZGVyIHRvIDUuCisgIHZpcnR1YWwgaW50IEdldExheW91dE9yZGVyKCkgY29uc3QgeyByZXR1cm4gNTsgfQogCi1wdWJsaWM6Ci0JQ1BERl9EaWN0aW9uYXJ5KgkJCUdldEFubm90RGljdCgpIGNvbnN0OwotCQotCXZvaWQJCQkJCQlTZXRSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdCk7Ci0JQ1BERl9SZWN0CQkJCQlHZXRSZWN0KCkgY29uc3Q7Ci0JCi0Jdm9pZAkJCQkJCVNldENvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzQ29udGVudHMpOwotCUNGWF9XaWRlU3RyaW5nCQkJCUdldENvbnRlbnRzKCkgY29uc3Q7Ci0JCi0Jdm9pZAkJCQkJCVNldEFubm90TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc05hbWUpOwotCUNGWF9XaWRlU3RyaW5nCQkJCUdldEFubm90TmFtZSgpIGNvbnN0OwotCQotCXZvaWQJCQkJCQlTZXRNb2RpZmllZERhdGUoY29uc3QgRlhfU1lTVEVNVElNRSYgc3QpOwotCUZYX1NZU1RFTVRJTUUJCQkJR2V0TW9kaWZpZWREYXRlKCkgY29uc3Q7CisgIHZpcnR1YWwgQ1BERl9Bbm5vdCogR2V0UERGQW5ub3QoKSBjb25zdCB7IHJldHVybiBudWxscHRyOyB9CiAKLQl2b2lkCQkJCQkJU2V0RmxhZ3MoaW50IG5GbGFncyk7Ci0JaW50CQkJCQkJCUdldEZsYWdzKCkgY29uc3Q7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgdmlydHVhbCBJWEZBX1dpZGdldCogR2V0WEZBV2lkZ2V0KCkgY29uc3QgeyByZXR1cm4gbnVsbHB0cjsgfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCi0Jdm9pZAkJCQkJCVNldEFwcFN0YXRlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpOwotCUNGWF9CeXRlU3RyaW5nCQkJCUdldEFwcFN0YXRlKCkgY29uc3Q7Ci0JCi0Jdm9pZAkJCQkJCVNldFN0cnVjdFBhcmVudChpbnQga2V5KTsKLQlpbnQJCQkJCQkJR2V0U3RydWN0UGFyZW50KCkgY29uc3Q7Ci0JCi0JLy9ib3JkZXIKLQl2b2lkCQkJCQkJU2V0Qm9yZGVyV2lkdGgoaW50IG5XaWR0aCk7Ci0JaW50CQkJCQkJCUdldEJvcmRlcldpZHRoKCkgY29uc3Q7Ci0JCi0JLy9CQlNfU09MSUQKLQkvL0JCU19EQVNICi0JLy9CQlNfQkVWRUxFRAotCS8vQkJTX0lOU0VUCi0JLy9CQlNfVU5ERVJMSU5FCi0JCi0Jdm9pZAkJCQkJCVNldEJvcmRlclN0eWxlKGludCBuU3R5bGUpOwotCWludAkJCQkJCQlHZXRCb3JkZXJTdHlsZSgpIGNvbnN0OwotCQotCXZvaWQJCQkJCQlTZXRCb3JkZXJEYXNoKGNvbnN0IENGWF9JbnRBcnJheSYgYXJyYXkpOwotCXZvaWQJCQkJCQlHZXRCb3JkZXJEYXNoKENGWF9JbnRBcnJheSYgYXJyYXkpIGNvbnN0OwotCQotCS8vVGhlIGJhY2tncm91bmQgb2YgdGhlIGFubm90YXRpb24ncyBpY29uIHdoZW4gY2xvc2VkCi0JLy9UaGUgdGl0bGUgYmFyIG9mIHRoZSBhbm5vdGF0aW9uJ3MgcG9wLXVwIHdpbmRvdwotCS8vVGhlIGJvcmRlciBvZiBhIGxpbmsgYW5ub3RhdGlvbgotCQotCXZvaWQJCQkJCQlTZXRDb2xvcihGWF9DT0xPUlJFRiBjb2xvcik7Ci0Jdm9pZAkJCQkJCVJlbW92ZUNvbG9yKCk7Ci0JRlhfQk9PTAkJCQkJCUdldENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3Q7Ci0JCi0JRlhfQk9PTAkJCQkJCUlzVmlzaWJsZSgpIGNvbnN0OwotCS8vYWN0aW9uCisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuICIiOyB9CisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0U3ViVHlwZSgpIGNvbnN0IHsgcmV0dXJuICIiOyB9CiAKLQlDUERGX0FjdGlvbgkJCQkJR2V0QWN0aW9uKCkgY29uc3Q7Ci0Jdm9pZAkJCQkJCVNldEFjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYSk7Ci0Jdm9pZAkJCQkJCVJlbW92ZUFjdGlvbigpOwotCQotCUNQREZfQUFjdGlvbgkJCQlHZXRBQWN0aW9uKCkgY29uc3Q7Ci0Jdm9pZAkJCQkJCVNldEFBY3Rpb24oY29uc3QgQ1BERl9BQWN0aW9uJiBhYSk7Ci0Jdm9pZAkJCQkJCVJlbW92ZUFBY3Rpb24oKTsKLQkKLQl2aXJ0dWFsIENQREZfQWN0aW9uCQkJR2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQpOwotCQotcHVibGljOgotCUZYX0JPT0wJCQkJCQlJc0FwcGVhcmFuY2VWYWxpZCgpOwotCUZYX0JPT0wJCQkJCQlJc0FwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlKTsKLQl2b2lkCQkJCQkJRHJhd0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKLQkJQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSwgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyk7Ci0Jdm9pZAkJCQkJCURyYXdCb3JkZXIoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKLQkJY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyk7Ci0JCi0Jdm9pZAkJCQkJCUNsZWFyQ2FjaGVkQVAoKTsKLQkKLQl2b2lkCQkJCQkJV3JpdGVBcHBlYXJhbmNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQVBUeXBlLCBjb25zdCBDUERGX1JlY3QmIHJjQkJveCwgCi0JCWNvbnN0IENQREZfTWF0cml4JiBtYXRyaXgsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQ29udGVudHMsCi0JCWNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQVBTdGF0ZSA9ICIiKTsKKyAgdmlydHVhbCB2b2lkIFNldFJlY3QoY29uc3QgQ1BERl9SZWN0JiByZWN0KSB7fQorICB2aXJ0dWFsIENQREZfUmVjdCBHZXRSZWN0KCkgY29uc3QgeyByZXR1cm4gQ1BERl9SZWN0KCk7IH0KIAotcHVibGljOgotCXZpcnR1YWwgdm9pZAkJCUFubm90X09uRHJhdyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpOwotcHVibGljOgorICB2aXJ0dWFsIHZvaWQgQW5ub3RfT25EcmF3KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpIHt9CiAKKyAgVW5kZXJseWluZ1BhZ2VUeXBlKiBHZXRVbmRlcmx5aW5nUGFnZSgpOworICBDUERGX1BhZ2UqIEdldFBERlBhZ2UoKTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBDUERGWEZBX1BhZ2UqIEdldFBERlhGQVBhZ2UoKTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAotcHJpdmF0ZToKLQlGWF9CT09MIENyZWF0ZUZvcm1GaWxsZXIoKTsKLXByb3RlY3RlZDoKLQlDUERGX0Fubm90KgkJCW1fcEFubm90OwotCUNQREZTREtfUGFnZVZpZXcqCW1fcFBhZ2VWaWV3OwotCUZYX0JPT0wJCQkJbV9iU2VsZWN0ZWQ7Ci0JaW50CQkJCQltX25UYWJPcmRlcjsKLQkKKyAgdm9pZCBTZXRQYWdlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgeyBtX3BQYWdlVmlldyA9IHBQYWdlVmlldzsgfQorICBDUERGU0RLX1BhZ2VWaWV3KiBHZXRQYWdlVmlldygpIGNvbnN0IHsgcmV0dXJuIG1fcFBhZ2VWaWV3OyB9CisKKyAgLy8gVGFiIE9yZGVyCisgIGludCBHZXRUYWJPcmRlcigpOworICB2b2lkIFNldFRhYk9yZGVyKGludCBpVGFiT3JkZXIpOworCisgIC8vIFNlbGVjdGlvbgorICBGWF9CT09MIElzU2VsZWN0ZWQoKTsKKyAgdm9pZCBTZXRTZWxlY3RlZChGWF9CT09MIGJTZWxlY3RlZCk7CisKKyBwcm90ZWN0ZWQ6CisgIENQREZTREtfUGFnZVZpZXcqIG1fcFBhZ2VWaWV3OworICBGWF9CT09MIG1fYlNlbGVjdGVkOworICBpbnQgbV9uVGFiT3JkZXI7Cit9OworCitjbGFzcyBDUERGU0RLX0JBQW5ub3QgOiBwdWJsaWMgQ1BERlNES19Bbm5vdCB7CisgcHVibGljOgorICBDUERGU0RLX0JBQW5ub3QoQ1BERl9Bbm5vdCogcEFubm90LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworICB+Q1BERlNES19CQUFubm90KCkgb3ZlcnJpZGUge30KKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIEZYX0JPT0wgSXNYRkFGaWVsZCgpIG92ZXJyaWRlOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCisgIENGWF9CeXRlU3RyaW5nIEdldFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0U3ViVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNldFJlY3QoY29uc3QgQ1BERl9SZWN0JiByZWN0KSBvdmVycmlkZTsKKyAgQ1BERl9SZWN0IEdldFJlY3QoKSBjb25zdCBvdmVycmlkZTsKKyAgQ1BERl9Bbm5vdCogR2V0UERGQW5ub3QoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBBbm5vdF9PbkRyYXcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKSBvdmVycmlkZTsKKworICBDUERGX0RpY3Rpb25hcnkqIEdldEFubm90RGljdCgpIGNvbnN0OworCisgIHZvaWQgU2V0Q29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNDb250ZW50cyk7CisgIENGWF9XaWRlU3RyaW5nIEdldENvbnRlbnRzKCkgY29uc3Q7CisKKyAgdm9pZCBTZXRBbm5vdE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNOYW1lKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0QW5ub3ROYW1lKCkgY29uc3Q7CisKKyAgdm9pZCBTZXRNb2RpZmllZERhdGUoY29uc3QgRlhfU1lTVEVNVElNRSYgc3QpOworICBGWF9TWVNURU1USU1FIEdldE1vZGlmaWVkRGF0ZSgpIGNvbnN0OworCisgIHZvaWQgU2V0RmxhZ3MoaW50IG5GbGFncyk7CisgIGludCBHZXRGbGFncygpIGNvbnN0OworCisgIHZvaWQgU2V0QXBwU3RhdGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cik7CisgIENGWF9CeXRlU3RyaW5nIEdldEFwcFN0YXRlKCkgY29uc3Q7CisKKyAgdm9pZCBTZXRTdHJ1Y3RQYXJlbnQoaW50IGtleSk7CisgIGludCBHZXRTdHJ1Y3RQYXJlbnQoKSBjb25zdDsKKworICAvLyBib3JkZXIKKyAgdm9pZCBTZXRCb3JkZXJXaWR0aChpbnQgbldpZHRoKTsKKyAgaW50IEdldEJvcmRlcldpZHRoKCkgY29uc3Q7CisKKyAgLy8gQkJTX1NPTElECisgIC8vIEJCU19EQVNICisgIC8vIEJCU19CRVZFTEVECisgIC8vIEJCU19JTlNFVAorICAvLyBCQlNfVU5ERVJMSU5FCisKKyAgdm9pZCBTZXRCb3JkZXJTdHlsZShpbnQgblN0eWxlKTsKKyAgaW50IEdldEJvcmRlclN0eWxlKCkgY29uc3Q7CisKKyAgdm9pZCBTZXRCb3JkZXJEYXNoKGNvbnN0IENGWF9JbnRBcnJheSYgYXJyYXkpOworICB2b2lkIEdldEJvcmRlckRhc2goQ0ZYX0ludEFycmF5JiBhcnJheSkgY29uc3Q7CisKKyAgLy8gVGhlIGJhY2tncm91bmQgb2YgdGhlIGFubm90YXRpb24ncyBpY29uIHdoZW4gY2xvc2VkCisgIC8vIFRoZSB0aXRsZSBiYXIgb2YgdGhlIGFubm90YXRpb24ncyBwb3AtdXAgd2luZG93CisgIC8vIFRoZSBib3JkZXIgb2YgYSBsaW5rIGFubm90YXRpb24KKworICB2b2lkIFNldENvbG9yKEZYX0NPTE9SUkVGIGNvbG9yKTsKKyAgdm9pZCBSZW1vdmVDb2xvcigpOworICBGWF9CT09MIEdldENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3Q7CisKKyAgRlhfQk9PTCBJc1Zpc2libGUoKSBjb25zdDsKKyAgLy8gYWN0aW9uCisKKyAgQ1BERl9BY3Rpb24gR2V0QWN0aW9uKCkgY29uc3Q7CisgIHZvaWQgU2V0QWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhKTsKKyAgdm9pZCBSZW1vdmVBY3Rpb24oKTsKKworICBDUERGX0FBY3Rpb24gR2V0QUFjdGlvbigpIGNvbnN0OworICB2b2lkIFNldEFBY3Rpb24oY29uc3QgQ1BERl9BQWN0aW9uJiBhYSk7CisgIHZvaWQgUmVtb3ZlQUFjdGlvbigpOworCisgIHZpcnR1YWwgQ1BERl9BY3Rpb24gR2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQpOworCisgIHZpcnR1YWwgRlhfQk9PTCBJc0FwcGVhcmFuY2VWYWxpZCgpOworICB2aXJ0dWFsIEZYX0JPT0wgSXNBcHBlYXJhbmNlVmFsaWQoQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSk7CisgIHZpcnR1YWwgdm9pZCBEcmF3QXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpOworICB2b2lkIERyYXdCb3JkZXIoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpOworCisgIHZvaWQgQ2xlYXJDYWNoZWRBUCgpOworCisgIHZvaWQgV3JpdGVBcHBlYXJhbmNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQVBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJjQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0NvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0FQU3RhdGUgPSAiIik7CisKKyBwcm90ZWN0ZWQ6CisgIENQREZfQW5ub3QqIG1fcEFubm90OworCisgcHJpdmF0ZToKKyAgRlhfQk9PTCBDcmVhdGVGb3JtRmlsbGVyKCk7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9GU0RLX0JBU0VBTk5PVF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYmFzZWZvcm0uaCBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2Jhc2Vmb3JtLmgKaW5kZXggODVhYjNlNi4uMDIzZWE3NCAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfYmFzZWZvcm0uaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnNka19iYXNlZm9ybS5oCkBAIC0xLDcgKzEsNyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIEZQREZTREtfSU5DTFVERV9GU0RLX0JBU0VGT1JNX0hfCkBAIC0xMywxMCArMTMsMTIgQEAKICNpbmNsdWRlIDxjdGltZT4KICNlbmRpZgogCi0jaW5jbHVkZSAiLi4vLi4vY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYXJzZXIuaCIKLSNpbmNsdWRlICIuLi8uLi9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oIgotI2luY2x1ZGUgIi4uLy4uL2NvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgotI2luY2x1ZGUgIi4uLy4uL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2RpYi5oIgorI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFyc2VyLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9kb2MuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9kaWIuaCIKICNpbmNsdWRlICJmc2RrX2Jhc2Vhbm5vdC5oIgogCiBjbGFzcyBDRkZMX0Zvcm1GaWxsZXI7CkBAIC0yOSwyNjAgKzMxLDM3NyBAQAogY2xhc3MgQ1BERl9Gb3JtRmllbGQ7CiBzdHJ1Y3QgQ1BXTF9Db2xvcjsKIAotdHlwZWRlZiBzdHJ1Y3QgX1BERlNES19GaWVsZEFjdGlvbgotewotCV9QREZTREtfRmllbGRBY3Rpb24oKQotCXsKLQkJYk1vZGlmaWVyID0gRkFMU0U7Ci0JCWJTaGlmdCA9IEZBTFNFOwotCQluQ29tbWl0S2V5ID0gMDsKLQkJYktleURvd24gPSBGQUxTRTsKLQkJblNlbEVuZCA9IG5TZWxTdGFydCA9IDA7Ci0JCWJXaWxsQ29tbWl0ID0gRkFMU0U7Ci0JCWJGaWVsZEZ1bGwgPSBGQUxTRTsKLQkJYlJDID0gVFJVRTsKLQl9Ci0JCi0JRlhfQk9PTAkJCQkJYk1vZGlmaWVyOwkJLy9pbgotCUZYX0JPT0wJCQkJCWJTaGlmdDsJCQkvL2luCi0JaW50CQkJCQkJbkNvbW1pdEtleTsJCS8vaW4KLQlDRlhfV2lkZVN0cmluZwkJCXNDaGFuZ2U7CQkvL2luW291dF0KLQlDRlhfV2lkZVN0cmluZwkJCXNDaGFuZ2VFeDsJCS8vaW4KLQlGWF9CT09MCQkJCQliS2V5RG93bjsJCS8vaW4KLQlpbnQJCQkJCQluU2VsRW5kOwkJLy9pbltvdXRdCi0JaW50CQkJCQkJblNlbFN0YXJ0OwkJLy9pbltvdXRdCi0JQ0ZYX1dpZGVTdHJpbmcJCQlzVmFsdWU7CQkJLy9pbltvdXRdCi0JRlhfQk9PTAkJCQkJYldpbGxDb21taXQ7CS8vaW4KLQlGWF9CT09MCQkJCQliRmllbGRGdWxsOwkJLy9pbgotCUZYX0JPT0wJCQkJCWJSQzsJCQkvL2luW291dF0KLX1QREZTREtfRmllbGRBY3Rpb247Ci1jbGFzcyBDUERGU0RLX1dpZGdldDpwdWJsaWMgQ1BERlNES19Bbm5vdAotewotcHVibGljOgotCUNQREZTREtfV2lkZ2V0KENQREZfQW5ub3QqIHBBbm5vdCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSk7Ci0JdmlydHVhbCB+Q1BERlNES19XaWRnZXQoKTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQordHlwZWRlZiBlbnVtIF9QREZTREtfWEZBQUFjdGlvblR5cGUgeworICBQREZTREtfWEZBX0NsaWNrID0gMCwKKyAgUERGU0RLX1hGQV9GdWxsLAorICBQREZTREtfWEZBX1ByZU9wZW4sCisgIFBERlNES19YRkFfUG9zdE9wZW4KK30gUERGU0RLX1hGQUFBY3Rpb25UeXBlOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCi0JdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJCUdldFN1YlR5cGUoKSBjb25zdDsKLQkKLQl2aXJ0dWFsIENQREZfQWN0aW9uCQkJCUdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFUKTsKK3R5cGVkZWYgc3RydWN0IF9QREZTREtfRmllbGRBY3Rpb24geworICBfUERGU0RLX0ZpZWxkQWN0aW9uKCkgeworICAgIGJNb2RpZmllciA9IEZBTFNFOworICAgIGJTaGlmdCA9IEZBTFNFOworICAgIG5Db21taXRLZXkgPSAwOworICAgIGJLZXlEb3duID0gRkFMU0U7CisgICAgblNlbEVuZCA9IG5TZWxTdGFydCA9IDA7CisgICAgYldpbGxDb21taXQgPSBGQUxTRTsKKyAgICBiRmllbGRGdWxsID0gRkFMU0U7CisgICAgYlJDID0gVFJVRTsKKyAgfQogCi0JaW50CQkJCQkJCQlHZXRGaWVsZFR5cGUoKSBjb25zdDsKLQkvL2RlZmluZSBsYXlvdXQgb3JkZXIgdG8gMi4KLQl2aXJ0dWFsIGludAkJCQkJCUdldExheW91dE9yZGVyKCkgY29uc3Qge3JldHVybiAyO30KLQkvKgotCUZJRUxERkxBR19SRUFET05MWQotCUZJRUxERkxBR19SRVFVSVJFRAotCUZJRUxERkxBR19OT0VYUE9SVAotCSovCi0JCi0JaW50CQkJCQkJCQlHZXRGaWVsZEZsYWdzKCkgY29uc3Q7Ci0JaW50CQkJCQkJCQlHZXRSb3RhdGUoKSBjb25zdDsKKyAgRlhfQk9PTCBiTW9kaWZpZXI7ICAgICAgICAgLy8gaW4KKyAgRlhfQk9PTCBiU2hpZnQ7ICAgICAgICAgICAgLy8gaW4KKyAgaW50IG5Db21taXRLZXk7ICAgICAgICAgICAgLy8gaW4KKyAgQ0ZYX1dpZGVTdHJpbmcgc0NoYW5nZTsgICAgLy8gaW5bb3V0XQorICBDRlhfV2lkZVN0cmluZyBzQ2hhbmdlRXg7ICAvLyBpbgorICBGWF9CT09MIGJLZXlEb3duOyAgICAgICAgICAvLyBpbgorICBpbnQgblNlbEVuZDsgICAgICAgICAgICAgICAvLyBpbltvdXRdCisgIGludCBuU2VsU3RhcnQ7ICAgICAgICAgICAgIC8vIGluW291dF0KKyAgQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlOyAgICAgLy8gaW5bb3V0XQorICBGWF9CT09MIGJXaWxsQ29tbWl0OyAgICAgICAvLyBpbgorICBGWF9CT09MIGJGaWVsZEZ1bGw7ICAgICAgICAvLyBpbgorICBGWF9CT09MIGJSQzsgICAgICAgICAgICAgICAvLyBpbltvdXRdCit9IFBERlNES19GaWVsZEFjdGlvbjsKIAotCUZYX0JPT0wJCQkJCQkJR2V0RmlsbENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlHZXRCb3JkZXJDb2xvcihGWF9DT0xPUlJFRiYgY29sb3IpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJR2V0VGV4dENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3Q7Ci0JRlhfRkxPQVQJCQkJCQlHZXRGb250U2l6ZSgpIGNvbnN0OworY2xhc3MgQ1BERlNES19XaWRnZXQgOiBwdWJsaWMgQ1BERlNES19CQUFubm90IHsKKyBwdWJsaWM6CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgSVhGQV9XaWRnZXQqIEdldE1peFhGQVdpZGdldCgpIGNvbnN0OworICBJWEZBX1dpZGdldCogR2V0R3JvdXBNaXhYRkFXaWRnZXQoKTsKKyAgSVhGQV9XaWRnZXRIYW5kbGVyKiBHZXRYRkFXaWRnZXRIYW5kbGVyKCkgY29uc3Q7CiAKLQlpbnQJCQkJCQkJCUdldFNlbGVjdGVkSW5kZXgoaW50IG5JbmRleCkgY29uc3Q7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldFZhbHVlKCkgY29uc3Q7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldERlZmF1bHRWYWx1ZSgpIGNvbnN0OwotCUNGWF9XaWRlU3RyaW5nCQkJCQlHZXRPcHRpb25MYWJlbChpbnQgbkluZGV4KSBjb25zdDsKLQlpbnQJCQkJCQkJCUNvdW50T3B0aW9ucygpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJSXNPcHRpb25TZWxlY3RlZChpbnQgbkluZGV4KSBjb25zdDsKLQlpbnQJCQkJCQkJCUdldFRvcFZpc2libGVJbmRleCgpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJSXNDaGVja2VkKCkgY29uc3Q7Ci0JLyoKLQlCRl9BTElHTl9MRUZUCi0JQkZfQUxJR05fTUlEREwKLQlCRl9BTElHTl9SSUdIVAotCSovCi0JaW50CQkJCQkJCQlHZXRBbGlnbm1lbnQoKSBjb25zdDsKLQlpbnQJCQkJCQkJCUdldE1heExlbigpIGNvbnN0OwotCUNGWF9XaWRlU3RyaW5nCQkJCQlHZXRBbHRlcm5hdGVOYW1lKCkgY29uc3Q7CisgIEZYX0JPT0wgSGFzWEZBQUFjdGlvbihQREZTREtfWEZBQUFjdGlvblR5cGUgZVhGQUFBVCk7CisgIEZYX0JPT0wgT25YRkFBQWN0aW9uKFBERlNES19YRkFBQWN0aW9uVHlwZSBlWEZBQUFULAorICAgICAgICAgICAgICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAKLS8vU2V0IFByb3BlcnRpZXMuCi0Jdm9pZAkJCQkJCQlTZXRDaGVjayhGWF9CT09MIGJDaGVja2VkLCBGWF9CT09MIGJOb3RpZnkpOwotCXZvaWQJCQkJCQkJU2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNWYWx1ZSwgRlhfQk9PTCBiTm90aWZ5KTsKLQl2b2lkCQkJCQkJCVNldERlZmF1bHRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc1ZhbHVlKTsKLQl2b2lkCQkJCQkJCVNldE9wdGlvblNlbGVjdGlvbihpbnQgaW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkLCBGWF9CT09MIGJOb3RpZnkpOwotCXZvaWQJCQkJCQkJQ2xlYXJTZWxlY3Rpb24oRlhfQk9PTCBiTm90aWZ5KTsKLQl2b2lkCQkJCQkJCVNldFRvcFZpc2libGVJbmRleChpbnQgaW5kZXgpOworICB2b2lkIFN5bmNocm9uaXplKEZYX0JPT0wgYlN5bmNocm9uaXplRWxzZSk7CisgIHZvaWQgU3luY2hyb25pemVYRkFWYWx1ZSgpOworICB2b2lkIFN5bmNocm9uaXplWEZBSXRlbXMoKTsKIAotCXZvaWQJCQkJCQkJUmVzZXRBcHBlYXJhbmNlKEZYX0xQQ1dTVFIgc1ZhbHVlLCBGWF9CT09MIGJWYWx1ZUNoYW5nZWQpOwotCXZvaWQJCQkJCQkJUmVzZXRGaWVsZEFwcGVhcmFuY2UoRlhfQk9PTCBiVmFsdWVDaGFuZ2VkKTsKLQl2b2lkCQkJCQkJCVVwZGF0ZUZpZWxkKCk7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJCU9uRm9ybWF0KGludCBuQ29tbWl0S2V5LCBGWF9CT09MJiBiRm9ybWF0ZWQpOwotCQotLy9NZXNzYWdlLgotIAlGWF9CT09MCQkJCQkJCU9uQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSwgCi0JCQkJCQkJCQkJCQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworICBzdGF0aWMgdm9pZCBTeW5jaHJvbml6ZVhGQVZhbHVlKElYRkFfRG9jVmlldyogcFhGQURvY1ZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhGQV9XaWRnZXQqIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sKTsKKyAgc3RhdGljIHZvaWQgU3luY2hyb25pemVYRkFJdGVtcyhJWEZBX0RvY1ZpZXcqIHBYRkFEb2NWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYRkFfV2lkZ2V0KiBoV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCk7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKLQlDUERGU0RLX0ludGVyRm9ybSoJCQkJR2V0SW50ZXJGb3JtKCkgY29uc3Qge3JldHVybiBtX3BJbnRlckZvcm07fQotCUNQREZfRm9ybUZpZWxkKgkJCQkJR2V0Rm9ybUZpZWxkKCkgY29uc3Q7Ci0JQ1BERl9Gb3JtQ29udHJvbCoJCQkJR2V0Rm9ybUNvbnRyb2woKSBjb25zdDsKLQlzdGF0aWMgQ1BERl9Gb3JtQ29udHJvbCoJCUdldEZvcm1Db250cm9sKENQREZfSW50ZXJGb3JtKiBwSW50ZXJGb3JtLCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpOworICBDUERGU0RLX1dpZGdldChDUERGX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0pOworICB+Q1BERlNES19XaWRnZXQoKSBvdmVycmlkZTsKIAotCXZvaWQJCQkJCQkJRHJhd1NoYWRvdyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwotCQotCXZvaWQJCQkJCQkJU2V0QXBwTW9kaWZpZWQoKTsKLQl2b2lkCQkJCQkJCUNsZWFyQXBwTW9kaWZpZWQoKTsKLQlGWF9CT09MCQkJCQkJCUlzQXBwTW9kaWZpZWQoKSBjb25zdDsKLQkKLQlGWF9JTlQzMgkJCQkJCUdldEFwcGVhcmFuY2VBZ2UoKSBjb25zdDsKLQlGWF9JTlQzMgkJCQkJCUdldFZhbHVlQWdlKCkgY29uc3Q7Ci0JCi1wcml2YXRlOgotCXZvaWQJCQkJCQkJUmVzZXRBcHBlYXJhbmNlX1B1c2hCdXR0b24oKTsKLQl2b2lkCQkJCQkJCVJlc2V0QXBwZWFyYW5jZV9DaGVja0JveCgpOwotCXZvaWQJCQkJCQkJUmVzZXRBcHBlYXJhbmNlX1JhZGlvQnV0dG9uKCk7Ci0Jdm9pZAkJCQkJCQlSZXNldEFwcGVhcmFuY2VfQ29tYm9Cb3goRlhfTFBDV1NUUiBzVmFsdWUpOwotCXZvaWQJCQkJCQkJUmVzZXRBcHBlYXJhbmNlX0xpc3RCb3goKTsKLQl2b2lkCQkJCQkJCVJlc2V0QXBwZWFyYW5jZV9UZXh0RmllbGQoRlhfTFBDV1NUUiBzVmFsdWUpOwotCQotCUNQREZfUmVjdAkJCQkJCUdldENsaWVudFJlY3QoKSBjb25zdDsKLQlDUERGX1JlY3QJCQkJCQlHZXRSb3RhdGVkUmVjdCgpIGNvbnN0OwotCQotCUNGWF9CeXRlU3RyaW5nCQkJCQlHZXRCYWNrZ3JvdW5kQXBwU3RyZWFtKCkgY29uc3Q7Ci0JQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldEJvcmRlckFwcFN0cmVhbSgpIGNvbnN0OwotCUNQREZfTWF0cml4CQkJCQkJR2V0TWF0cml4KCkgY29uc3Q7Ci0JCi0JQ1BXTF9Db2xvcgkJCQkJCUdldFRleHRQV0xDb2xvcigpIGNvbnN0OwotCUNQV0xfQ29sb3IJCQkJCQlHZXRCb3JkZXJQV0xDb2xvcigpIGNvbnN0OwotCUNQV0xfQ29sb3IJCQkJCQlHZXRGaWxsUFdMQ29sb3IoKSBjb25zdDsKLQkKLQl2b2lkCQkJCQkJCUFkZEltYWdlVG9BcHBlYXJhbmNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQVBUeXBlLCBDUERGX1N0cmVhbSogcEltYWdlKTsKLQl2b2lkCQkJCQkJCVJlbW92ZUFwcGVhcmFuY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNBUFR5cGUpOwotcHVibGljOgotCUZYX0JPT0wJCQkJCQkJSXNXaWRnZXRBcHBlYXJhbmNlVmFsaWQoQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSk7Ci0Jdm9pZAkJCQkJCQlEcmF3QXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBjb25zdCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAotCQlDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlLCBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKTsKLXB1YmxpYzoKLQlGWF9CT09MCQkJCQkJCUhpdFRlc3QoRlhfRkxPQVQgcGFnZVgsIEZYX0ZMT0FUIHBhZ2VZKTsKLXByaXZhdGU6Ci0JQ1BERlNES19JbnRlckZvcm0qCQkJCW1fcEludGVyRm9ybTsKLQlGWF9CT09MCQkJCQkJCW1fYkFwcE1vZGlmaWVkOwotCUZYX0lOVDMyCQkJCQkJbV9uQXBwQWdlOwotCUZYX0lOVDMyCQkJCQkJbV9uVmFsdWVBZ2U7CisgIC8vIENQREZTREtfQW5ub3QKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0U3ViVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworICBDUERGX0FjdGlvbiBHZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgSXNBcHBlYXJhbmNlVmFsaWQoKSBvdmVycmlkZTsKKworICBpbnQgR2V0TGF5b3V0T3JkZXIoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAyOyB9CisKKyAgaW50IEdldEZpZWxkVHlwZSgpIGNvbnN0OworCisgIC8vIFBvc3NpYmxlIHZhbHVlcyBmcm9tIFBERiAzMjAwMC0xOjIwMDgsIHRhYmxlIDIyMS4KKyAgLy8gRklFTERGTEFHX1JFQURPTkxZCisgIC8vIEZJRUxERkxBR19SRVFVSVJFRAorICAvLyBGSUVMREZMQUdfTk9FWFBPUlQKKyAgaW50IEdldEZpZWxkRmxhZ3MoKSBjb25zdDsKKyAgaW50IEdldFJvdGF0ZSgpIGNvbnN0OworCisgIEZYX0JPT0wgR2V0RmlsbENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3Q7CisgIEZYX0JPT0wgR2V0Qm9yZGVyQ29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdDsKKyAgRlhfQk9PTCBHZXRUZXh0Q29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdDsKKyAgRlhfRkxPQVQgR2V0Rm9udFNpemUoKSBjb25zdDsKKworICBpbnQgR2V0U2VsZWN0ZWRJbmRleChpbnQgbkluZGV4KSBjb25zdDsKKyNpZm5kZWYgUERGX0VOQUJMRV9YRkEKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0VmFsdWUoKSBjb25zdDsKKyNlbHNlCisgIENGWF9XaWRlU3RyaW5nIEdldFZhbHVlKEZYX0JPT0wgYkRpc3BsYXkgPSBUUlVFKSBjb25zdDsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0RGVmYXVsdFZhbHVlKCkgY29uc3Q7CisgIENGWF9XaWRlU3RyaW5nIEdldE9wdGlvbkxhYmVsKGludCBuSW5kZXgpIGNvbnN0OworICBpbnQgQ291bnRPcHRpb25zKCkgY29uc3Q7CisgIEZYX0JPT0wgSXNPcHRpb25TZWxlY3RlZChpbnQgbkluZGV4KSBjb25zdDsKKyAgaW50IEdldFRvcFZpc2libGVJbmRleCgpIGNvbnN0OworICBGWF9CT09MIElzQ2hlY2tlZCgpIGNvbnN0OworICAvKgorICBCRl9BTElHTl9MRUZUCisgIEJGX0FMSUdOX01JRERMCisgIEJGX0FMSUdOX1JJR0hUCisgICovCisgIGludCBHZXRBbGlnbm1lbnQoKSBjb25zdDsKKyAgaW50IEdldE1heExlbigpIGNvbnN0OworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIENGWF9XaWRlU3RyaW5nIEdldE5hbWUoKSBjb25zdDsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0QWx0ZXJuYXRlTmFtZSgpIGNvbnN0OworCisgIC8vIFNldCBQcm9wZXJ0aWVzLgorICB2b2lkIFNldENoZWNrKEZYX0JPT0wgYkNoZWNrZWQsIEZYX0JPT0wgYk5vdGlmeSk7CisgIHZvaWQgU2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNWYWx1ZSwgRlhfQk9PTCBiTm90aWZ5KTsKKyAgdm9pZCBTZXREZWZhdWx0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNWYWx1ZSk7CisgIHZvaWQgU2V0T3B0aW9uU2VsZWN0aW9uKGludCBpbmRleCwgRlhfQk9PTCBiU2VsZWN0ZWQsIEZYX0JPT0wgYk5vdGlmeSk7CisgIHZvaWQgQ2xlYXJTZWxlY3Rpb24oRlhfQk9PTCBiTm90aWZ5KTsKKyAgdm9pZCBTZXRUb3BWaXNpYmxlSW5kZXgoaW50IGluZGV4KTsKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIHZvaWQgUmVzZXRBcHBlYXJhbmNlKEZYX0JPT0wgYlZhbHVlQ2hhbmdlZCk7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisgIHZvaWQgUmVzZXRBcHBlYXJhbmNlKGNvbnN0IEZYX1dDSEFSKiBzVmFsdWUsIEZYX0JPT0wgYlZhbHVlQ2hhbmdlZCk7CisgIHZvaWQgUmVzZXRGaWVsZEFwcGVhcmFuY2UoRlhfQk9PTCBiVmFsdWVDaGFuZ2VkKTsKKyAgdm9pZCBVcGRhdGVGaWVsZCgpOworICBDRlhfV2lkZVN0cmluZyBPbkZvcm1hdChGWF9CT09MJiBiRm9ybWF0ZWQpOworCisgIC8vIE1lc3NhZ2UuCisgIEZYX0JPT0wgT25BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworCisgIENQREZTREtfSW50ZXJGb3JtKiBHZXRJbnRlckZvcm0oKSBjb25zdCB7IHJldHVybiBtX3BJbnRlckZvcm07IH0KKyAgQ1BERl9Gb3JtRmllbGQqIEdldEZvcm1GaWVsZCgpIGNvbnN0OworICBDUERGX0Zvcm1Db250cm9sKiBHZXRGb3JtQ29udHJvbCgpIGNvbnN0OworICBzdGF0aWMgQ1BERl9Gb3JtQ29udHJvbCogR2V0Rm9ybUNvbnRyb2woQ1BERl9JbnRlckZvcm0qIHBJbnRlckZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpOworCisgIHZvaWQgRHJhd1NoYWRvdyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOworCisgIHZvaWQgU2V0QXBwTW9kaWZpZWQoKTsKKyAgdm9pZCBDbGVhckFwcE1vZGlmaWVkKCk7CisgIEZYX0JPT0wgSXNBcHBNb2RpZmllZCgpIGNvbnN0OworCisgIGludDMyX3QgR2V0QXBwZWFyYW5jZUFnZSgpIGNvbnN0OworICBpbnQzMl90IEdldFZhbHVlQWdlKCkgY29uc3Q7CisKKyBwcml2YXRlOgorICB2b2lkIFJlc2V0QXBwZWFyYW5jZV9QdXNoQnV0dG9uKCk7CisgIHZvaWQgUmVzZXRBcHBlYXJhbmNlX0NoZWNrQm94KCk7CisgIHZvaWQgUmVzZXRBcHBlYXJhbmNlX1JhZGlvQnV0dG9uKCk7CisgIHZvaWQgUmVzZXRBcHBlYXJhbmNlX0NvbWJvQm94KGNvbnN0IEZYX1dDSEFSKiBzVmFsdWUpOworICB2b2lkIFJlc2V0QXBwZWFyYW5jZV9MaXN0Qm94KCk7CisgIHZvaWQgUmVzZXRBcHBlYXJhbmNlX1RleHRGaWVsZChjb25zdCBGWF9XQ0hBUiogc1ZhbHVlKTsKKworICBDUERGX1JlY3QgR2V0Q2xpZW50UmVjdCgpIGNvbnN0OworICBDUERGX1JlY3QgR2V0Um90YXRlZFJlY3QoKSBjb25zdDsKKworICBDRlhfQnl0ZVN0cmluZyBHZXRCYWNrZ3JvdW5kQXBwU3RyZWFtKCkgY29uc3Q7CisgIENGWF9CeXRlU3RyaW5nIEdldEJvcmRlckFwcFN0cmVhbSgpIGNvbnN0OworICBDRlhfTWF0cml4IEdldE1hdHJpeCgpIGNvbnN0OworCisgIENQV0xfQ29sb3IgR2V0VGV4dFBXTENvbG9yKCkgY29uc3Q7CisgIENQV0xfQ29sb3IgR2V0Qm9yZGVyUFdMQ29sb3IoKSBjb25zdDsKKyAgQ1BXTF9Db2xvciBHZXRGaWxsUFdMQ29sb3IoKSBjb25zdDsKKworICB2b2lkIEFkZEltYWdlVG9BcHBlYXJhbmNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQVBUeXBlLCBDUERGX1N0cmVhbSogcEltYWdlKTsKKyAgdm9pZCBSZW1vdmVBcHBlYXJhbmNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQVBUeXBlKTsKKworIHB1YmxpYzoKKyAgRlhfQk9PTCBJc1dpZGdldEFwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlKTsKKyAgdm9pZCBEcmF3QXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICBDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpIG92ZXJyaWRlOworCisgIEZYX0JPT0wgSGl0VGVzdChGWF9GTE9BVCBwYWdlWCwgRlhfRkxPQVQgcGFnZVkpOworCisjaWZuZGVmIFBERl9FTkFCTEVfWEZBCisgcHJpdmF0ZToKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgQ1BERlNES19JbnRlckZvcm0qIG1fcEludGVyRm9ybTsKKyAgRlhfQk9PTCBtX2JBcHBNb2RpZmllZDsKKyAgaW50MzJfdCBtX25BcHBBZ2U7CisgIGludDMyX3QgbV9uVmFsdWVBZ2U7CisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBtdXRhYmxlIElYRkFfV2lkZ2V0KiBtX2hNaXhYRkFXaWRnZXQ7CisgIG11dGFibGUgSVhGQV9XaWRnZXRIYW5kbGVyKiBtX3BXaWRnZXRIYW5kbGVyOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogfTsKIAotI2RlZmluZSBDUERGU0RLX1dpZGdldE1hcAkJCQlDRlhfTWFwUHRyVGVtcGxhdGU8Q1BERl9Gb3JtQ29udHJvbCosIENQREZTREtfV2lkZ2V0Kj4KKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorY2xhc3MgQ1BERlNES19YRkFXaWRnZXQgOiBwdWJsaWMgQ1BERlNES19Bbm5vdCB7CisgcHVibGljOgorICBDUERGU0RLX1hGQVdpZGdldChJWEZBX1dpZGdldCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtKTsKKyAgfkNQREZTREtfWEZBV2lkZ2V0KCkgb3ZlcnJpZGUge30KIAotY2xhc3MgQ1BERlNES19JbnRlckZvcm0gOiBwdWJsaWMgQ1BERl9Gb3JtTm90aWZ5Ci17Ci1wdWJsaWM6Ci0JQ1BERlNES19JbnRlckZvcm0oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KTsKLQl2aXJ0dWFsIH5DUERGU0RLX0ludGVyRm9ybSgpOwotCQotcHVibGljOgotCXZpcnR1YWwgdm9pZAkJCQkJRGVzdHJveSgpOwotCXZpcnR1YWwgQ1BERl9JbnRlckZvcm0qCQkJR2V0SW50ZXJGb3JtKCk7Ci0JCi0JQ1BERlNES19Eb2N1bWVudCoJCQkJR2V0RG9jdW1lbnQoKTsKLQlGWF9CT09MCQkJCQkJCUhpZ2hsaWdodFdpZGdldHMoKTsKLQkKLQlDUERGU0RLX1dpZGdldCoJCQkJCUdldFNpYmxpbmcoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIEZYX0JPT0wgYk5leHQpIGNvbnN0OwotCUNQREZTREtfV2lkZ2V0KgkJCQkJR2V0V2lkZ2V0KENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sKSBjb25zdDsKLQl2b2lkCQkJCQkJCUdldFdpZGdldHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNGaWVsZE5hbWUsIENGWF9QdHJBcnJheSYgd2lkZ2V0cyk7Ci0Jdm9pZAkJCQkJCQlHZXRXaWRnZXRzKENQREZfRm9ybUZpZWxkKiBwRmllbGQsIENGWF9QdHJBcnJheSYgd2lkZ2V0cyk7Ci0JCi0Jdm9pZAkJCQkJCQlBZGRNYXAoQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wsIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KTsKLQl2b2lkCQkJCQkJCVJlbW92ZU1hcChDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCk7Ci0JCi0Jdm9pZAkJCQkJCQlFbmFibGVDYWxjdWxhdGUoRlhfQk9PTCBiRW5hYmxlZCk7Ci0JRlhfQk9PTAkJCQkJCQlJc0NhbGN1bGF0ZUVuYWJsZWQoKSBjb25zdDsKKyAgRlhfQk9PTCBJc1hGQUZpZWxkKCkgb3ZlcnJpZGU7CisgIElYRkFfV2lkZ2V0KiBHZXRYRkFXaWRnZXQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtX2hYRkFXaWRnZXQ7IH0KKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0VHlwZSgpIGNvbnN0IG92ZXJyaWRlOworICBDRlhfQnl0ZVN0cmluZyBHZXRTdWJUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gIiI7IH0KKyAgQ0ZYX0Zsb2F0UmVjdCBHZXRSZWN0KCkgY29uc3Qgb3ZlcnJpZGU7CiAKLSNpZmRlZiBfV0lOMzIKLQlDUERGX1N0cmVhbSoJCQkJCUxvYWRJbWFnZUZyb21GaWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRmlsZSk7Ci0jZW5kaWYKKyAgQ1BERlNES19JbnRlckZvcm0qIEdldEludGVyRm9ybSgpIHsgcmV0dXJuIG1fcEludGVyRm9ybTsgfQogCi0Jdm9pZAkJCQkJCQlPbktleVN0cm9rZUNvbW1pdChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIGNzVmFsdWUsIEZYX0JPT0wmIGJSQyk7Ci0Jdm9pZAkJCQkJCQlPblZhbGlkYXRlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSwgRlhfQk9PTCYgYlJDKTsKLQl2b2lkCQkJCQkJCU9uQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gTlVMTCk7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJCU9uRm9ybWF0KENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBpbnQgbkNvbW1pdEtleSwgRlhfQk9PTCYgYkZvcm1hdGVkKTsKLQkKLQl2b2lkCQkJCQkJCVJlc2V0RmllbGRBcHBlYXJhbmNlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBGWF9MUENXU1RSIHNWYWx1ZSwgRlhfQk9PTCBiVmFsdWVDaGFuZ2VkKTsKLQl2b2lkCQkJCQkJCVVwZGF0ZUZpZWxkKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkKTsKLQkKLXB1YmxpYzoKLQlGWF9CT09MCQkJCQkJCURvQWN0aW9uX0hpZGUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbik7Ci0JRlhfQk9PTAkJCQkJCQlEb0FjdGlvbl9TdWJtaXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOwotCUZYX0JPT0wJCQkJCQkJRG9BY3Rpb25fUmVzZXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOwotCUZYX0JPT0wJCQkJCQkJRG9BY3Rpb25fSW1wb3J0RGF0YShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKTsKLQkKLQl2b2lkCQkJCQkJCUdldEZpZWxkRnJvbU9iamVjdHMoY29uc3QgQ0ZYX1B0ckFycmF5JiBvYmplY3RzLCBDRlhfUHRyQXJyYXkmIGZpZWxkcyk7Ci0JRlhfQk9PTAkJCQkJCQlJc1ZhbGlkRmllbGQoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0KTsKLQlGWF9CT09MCQkJCQkJCVN1Ym1pdEZpZWxkcyhjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NEZXN0aW5hdGlvbiwgY29uc3QgQ0ZYX1B0ckFycmF5JiBmaWVsZHMsIAotCQlGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlLCBGWF9CT09MIGJVcmxFbmNvZGVkKTsKLQlGWF9CT09MCQkJCQkJCVN1Ym1pdEZvcm0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNEZXN0aW5hdGlvbiwgRlhfQk9PTCBiVXJsRW5jb2RlZCk7Ci0JRlhfQk9PTAkJCQkJCQlFeHBvcnRGb3JtVG9GREZUZXh0QnVmKENGWF9CeXRlVGV4dEJ1ZiYgdGV4dEJ1Zik7Ci0JRlhfQk9PTAkJCQkJCQlFeHBvcnRGaWVsZHNUb0ZERlRleHRCdWYoY29uc3QgQ0ZYX1B0ckFycmF5JiBmaWVsZHMsRlhfQk9PTCBiSW5jbHVkZU9yRXhjbHVkZSwgQ0ZYX0J5dGVUZXh0QnVmJiB0ZXh0QnVmKTsKLQlDRlhfV2lkZVN0cmluZwkJCQkJR2V0VGVtcG9yYXJ5RmlsZU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNGaWxlRXh0KTsKLQkKLXByaXZhdGU6Ci0JdmlydHVhbCBpbnQJCQkJCQlCZWZvcmVWYWx1ZUNoYW5nZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSk7Ci0JdmlydHVhbCBpbnQJCQkJCQlBZnRlclZhbHVlQ2hhbmdlKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQpOwotCXZpcnR1YWwgaW50CQkJCQkJQmVmb3JlU2VsZWN0aW9uQ2hhbmdlKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQsIENGWF9XaWRlU3RyaW5nJiBjc1ZhbHVlKTsKLQl2aXJ0dWFsIGludAkJCQkJCUFmdGVyU2VsZWN0aW9uQ2hhbmdlKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQpOwotCXZpcnR1YWwgaW50CQkJCQkJQWZ0ZXJDaGVja2VkU3RhdHVzQ2hhbmdlKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQsIGNvbnN0IENGWF9CeXRlQXJyYXkmIHN0YXR1c0FycmF5KTsKLQl2aXJ0dWFsIGludAkJCQkJCUJlZm9yZUZvcm1SZXNldChjb25zdCBDUERGX0ludGVyRm9ybSogcEZvcm0pOwotCXZpcnR1YWwgaW50CQkJCQkJQWZ0ZXJGb3JtUmVzZXQoY29uc3QgQ1BERl9JbnRlckZvcm0qIHBGb3JtKTsKLQl2aXJ0dWFsIGludAkJCQkJCUJlZm9yZUZvcm1JbXBvcnREYXRhKGNvbnN0IENQREZfSW50ZXJGb3JtKiBwRm9ybSk7Ci0JdmlydHVhbCBpbnQJCQkJCQlBZnRlckZvcm1JbXBvcnREYXRhKGNvbnN0IENQREZfSW50ZXJGb3JtKiBwRm9ybSk7Ci0JCi1wcml2YXRlOgotCUZYX0JPT0wJCQkJCQkJRkRGVG9VUkxFbmNvZGVkRGF0YShDRlhfV2lkZVN0cmluZyBjc0ZERkZpbGUsIENGWF9XaWRlU3RyaW5nIGNzVHh0RmlsZSk7Ci0JRlhfQk9PTAkJCQkJCQlGREZUb1VSTEVuY29kZWREYXRhKEZYX0xQQllURSYgcEJ1ZiwgRlhfU1RSU0laRSYgbkJ1ZlNpemUpOwotCWludAkJCQkJCQkJR2V0UGFnZUluZGV4QnlBbm5vdERpY3QoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpIGNvbnN0OwotCXZvaWQJCQkJCQkJRG9GREZCdWZmZXIoQ0ZYX0J5dGVTdHJpbmcgc0J1ZmZlcik7Ci0JCi1wcml2YXRlOgotCUNQREZTREtfRG9jdW1lbnQqCQkJCW1fcERvY3VtZW50OwotCUNQREZfSW50ZXJGb3JtKgkJCQkJbV9wSW50ZXJGb3JtOwotCUNQREZTREtfV2lkZ2V0TWFwCQkJCW1fTWFwOwotCUZYX0JPT0wJCQkJCQkJbV9iQ2FsY3VsYXRlOwotCUZYX0JPT0wJCQkJCQkJbV9iQnVzeTsKKyBwcml2YXRlOgorICBDUERGU0RLX0ludGVyRm9ybSogbV9wSW50ZXJGb3JtOworICBJWEZBX1dpZGdldCogbV9oWEZBV2lkZ2V0OworfTsKKyNkZWZpbmUgQ1BERlNES19YRkFXaWRnZXRNYXAgXAorICBDRlhfTWFwUHRyVGVtcGxhdGU8SVhGQV9XaWRnZXQqLCBDUERGU0RLX1hGQVdpZGdldCo+CisjZGVmaW5lIENQREZTREtfRmllbGRTeW5jaHJvbml6ZU1hcCBDRlhfTWFwUHRyVGVtcGxhdGU8Q1BERl9Gb3JtRmllbGQqLCBpbnQ+CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKLXB1YmxpYzoKLQlGWF9CT09MIElzTmVlZEhpZ2hMaWdodChpbnQgbkZpZWxkVHlwZSk7Ci0Jdm9pZCAgICBSZW1vdmVBbGxIaWdoTGlnaHQoKTsKLQl2b2lkICAgIFNldEhpZ2hsaWdodEFscGhhKEZYX0JZVEUgYWxwaGEpIHttX2lIaWdobGlnaHRBbHBoYSA9IGFscGhhO30KLQlGWF9CWVRFIEdldEhpZ2hsaWdodEFscGhhKCkge3JldHVybiBtX2lIaWdobGlnaHRBbHBoYTt9Ci0Jdm9pZCAgICBTZXRIaWdobGlnaHRDb2xvcihGWF9DT0xPUlJFRiBjbHIsIGludCBuRmllbGRUeXBlKTsKLQlGWF9DT0xPUlJFRiBHZXRIaWdobGlnaHRDb2xvcihpbnQgbkZpZWxkVHlwZSk7Ci1wcml2YXRlOgotCUZYX0NPTE9SUkVGIG1fYUhpZ2hsaWdodENvbG9yWzZdOwotCUZYX0JZVEUgbV9pSGlnaGxpZ2h0QWxwaGE7Ci0JRlhfQk9PTAltX2JOZWVkSGlnaHRsaWdodFs2XTsKK2NsYXNzIENQREZTREtfSW50ZXJGb3JtIDogcHVibGljIENQREZfRm9ybU5vdGlmeSB7CisgcHVibGljOgorICBleHBsaWNpdCBDUERGU0RLX0ludGVyRm9ybShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpOworICB+Q1BERlNES19JbnRlckZvcm0oKSBvdmVycmlkZTsKKworICBDUERGX0ludGVyRm9ybSogR2V0SW50ZXJGb3JtKCkgY29uc3QgeyByZXR1cm4gbV9wSW50ZXJGb3JtOyB9CisgIENQREZTREtfRG9jdW1lbnQqIEdldERvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9wRG9jdW1lbnQ7IH0KKworICBGWF9CT09MIEhpZ2hsaWdodFdpZGdldHMoKTsKKworICBDUERGU0RLX1dpZGdldCogR2V0U2libGluZyhDUERGU0RLX1dpZGdldCogcFdpZGdldCwgRlhfQk9PTCBiTmV4dCkgY29uc3Q7CisgIENQREZTREtfV2lkZ2V0KiBHZXRXaWRnZXQoQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wpIGNvbnN0OworICB2b2lkIEdldFdpZGdldHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDUERGU0RLX1dpZGdldCo+KiB3aWRnZXRzKSBjb25zdDsKKyAgdm9pZCBHZXRXaWRnZXRzKENQREZfRm9ybUZpZWxkKiBwRmllbGQsCisgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDUERGU0RLX1dpZGdldCo+KiB3aWRnZXRzKSBjb25zdDsKKworICB2b2lkIEFkZE1hcChDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCwgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQpOworICB2b2lkIFJlbW92ZU1hcChDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCk7CisKKyAgdm9pZCBFbmFibGVDYWxjdWxhdGUoRlhfQk9PTCBiRW5hYmxlZCk7CisgIEZYX0JPT0wgSXNDYWxjdWxhdGVFbmFibGVkKCkgY29uc3Q7CisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICB2b2lkIEFkZFhGQU1hcChJWEZBX1dpZGdldCogaFdpZGdldCwgQ1BERlNES19YRkFXaWRnZXQqIHBXaWRnZXQpOworICB2b2lkIFJlbW92ZVhGQU1hcChJWEZBX1dpZGdldCogaFdpZGdldCk7CisgIENQREZTREtfWEZBV2lkZ2V0KiBHZXRYRkFXaWRnZXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQpOworICB2b2lkIFhmYUVuYWJsZUNhbGN1bGF0ZShGWF9CT09MIGJFbmFibGVkKTsKKyAgRlhfQk9PTCBJc1hmYUNhbGN1bGF0ZUVuYWJsZWQoKSBjb25zdDsKKyAgRlhfQk9PTCBJc1hmYVZhbGlkYXRpb25zRW5hYmxlZCgpOworICB2b2lkIFhmYVNldFZhbGlkYXRpb25zRW5hYmxlZChGWF9CT09MIGJFbmFibGVkKTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworICB2b2lkIE9uS2V5U3Ryb2tlQ29tbWl0KENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBjc1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSQyk7CisgIHZvaWQgT25WYWxpZGF0ZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKKyAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBjc1ZhbHVlLAorICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlJDKTsKKyAgdm9pZCBPbkNhbGN1bGF0ZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IE5VTEwpOworICBDRlhfV2lkZVN0cmluZyBPbkZvcm1hdChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgRlhfQk9PTCYgYkZvcm1hdGVkKTsKKworICB2b2lkIFJlc2V0RmllbGRBcHBlYXJhbmNlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBzVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmFsdWVDaGFuZ2VkKTsKKyAgdm9pZCBVcGRhdGVGaWVsZChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCk7CisKKyAgRlhfQk9PTCBEb0FjdGlvbl9IaWRlKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOworICBGWF9CT09MIERvQWN0aW9uX1N1Ym1pdEZvcm0oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbik7CisgIEZYX0JPT0wgRG9BY3Rpb25fUmVzZXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pOworICBGWF9CT09MIERvQWN0aW9uX0ltcG9ydERhdGEoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbik7CisKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBHZXRGaWVsZEZyb21PYmplY3RzKAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q1BERl9PYmplY3QqPiYgb2JqZWN0cykgY29uc3Q7CisgIEZYX0JPT0wgSXNWYWxpZEZpZWxkKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCk7CisgIEZYX0JPT0wgU3VibWl0RmllbGRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0Rlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+JiBmaWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVybEVuY29kZWQpOworICBGWF9CT09MIFN1Ym1pdEZvcm0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNEZXN0aW5hdGlvbiwgRlhfQk9PTCBiVXJsRW5jb2RlZCk7CisgIEZYX0JPT0wgRXhwb3J0Rm9ybVRvRkRGVGV4dEJ1ZihDRlhfQnl0ZVRleHRCdWYmIHRleHRCdWYpOworICBGWF9CT09MIEV4cG9ydEZpZWxkc1RvRkRGVGV4dEJ1Zihjb25zdCBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+JiBmaWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkluY2x1ZGVPckV4Y2x1ZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiYgdGV4dEJ1Zik7CisgIENGWF9XaWRlU3RyaW5nIEdldFRlbXBvcmFyeUZpbGVOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRmlsZUV4dCk7CisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICB2b2lkIFN5bmNocm9uaXplRmllbGQoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIEZYX0JPT0wgYlN5bmNocm9uaXplRWxzZSk7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKKyBwcml2YXRlOgorICAvLyBDUERGX0Zvcm1Ob3RpZnkKKyAgaW50IEJlZm9yZVZhbHVlQ2hhbmdlKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSkgb3ZlcnJpZGU7CisgIGludCBBZnRlclZhbHVlQ2hhbmdlKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQpIG92ZXJyaWRlOworICBpbnQgQmVmb3JlU2VsZWN0aW9uQ2hhbmdlKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGNzVmFsdWUpIG92ZXJyaWRlOworICBpbnQgQWZ0ZXJTZWxlY3Rpb25DaGFuZ2UoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCkgb3ZlcnJpZGU7CisgIGludCBBZnRlckNoZWNrZWRTdGF0dXNDaGFuZ2UoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZUFycmF5JiBzdGF0dXNBcnJheSkgb3ZlcnJpZGU7CisgIGludCBCZWZvcmVGb3JtUmVzZXQoY29uc3QgQ1BERl9JbnRlckZvcm0qIHBGb3JtKSBvdmVycmlkZTsKKyAgaW50IEFmdGVyRm9ybVJlc2V0KGNvbnN0IENQREZfSW50ZXJGb3JtKiBwRm9ybSkgb3ZlcnJpZGU7CisgIGludCBCZWZvcmVGb3JtSW1wb3J0RGF0YShjb25zdCBDUERGX0ludGVyRm9ybSogcEZvcm0pIG92ZXJyaWRlOworICBpbnQgQWZ0ZXJGb3JtSW1wb3J0RGF0YShjb25zdCBDUERGX0ludGVyRm9ybSogcEZvcm0pIG92ZXJyaWRlOworCisgIEZYX0JPT0wgRkRGVG9VUkxFbmNvZGVkRGF0YShDRlhfV2lkZVN0cmluZyBjc0ZERkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc1R4dEZpbGUpOworICBGWF9CT09MIEZERlRvVVJMRW5jb2RlZERhdGEodWludDhfdComIHBCdWYsIEZYX1NUUlNJWkUmIG5CdWZTaXplKTsKKyAgaW50IEdldFBhZ2VJbmRleEJ5QW5ub3REaWN0KENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkgY29uc3Q7CisKKyAgdXNpbmcgQ1BERlNES19XaWRnZXRNYXAgPSBzdGQ6Om1hcDxDUERGX0Zvcm1Db250cm9sKiwgQ1BERlNES19XaWRnZXQqPjsKKworICBDUERGU0RLX0RvY3VtZW50KiBtX3BEb2N1bWVudDsKKyAgQ1BERl9JbnRlckZvcm0qIG1fcEludGVyRm9ybTsKKyAgQ1BERlNES19XaWRnZXRNYXAgbV9NYXA7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgQ1BERlNES19YRkFXaWRnZXRNYXAgbV9YRkFNYXA7CisgIENQREZTREtfRmllbGRTeW5jaHJvbml6ZU1hcCBtX0ZpZWxkU3luY2hyb25pemVNYXA7CisgIEZYX0JPT0wgbV9iWGZhQ2FsY3VsYXRlOworICBGWF9CT09MIG1fYlhmYVZhbGlkYXRpb25zRW5hYmxlZDsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgRlhfQk9PTCBtX2JDYWxjdWxhdGU7CisgIEZYX0JPT0wgbV9iQnVzeTsKKworIHB1YmxpYzoKKyAgRlhfQk9PTCBJc05lZWRIaWdoTGlnaHQoaW50IG5GaWVsZFR5cGUpOworICB2b2lkIFJlbW92ZUFsbEhpZ2hMaWdodCgpOworICB2b2lkIFNldEhpZ2hsaWdodEFscGhhKHVpbnQ4X3QgYWxwaGEpIHsgbV9pSGlnaGxpZ2h0QWxwaGEgPSBhbHBoYTsgfQorICB1aW50OF90IEdldEhpZ2hsaWdodEFscGhhKCkgeyByZXR1cm4gbV9pSGlnaGxpZ2h0QWxwaGE7IH0KKyAgdm9pZCBTZXRIaWdobGlnaHRDb2xvcihGWF9DT0xPUlJFRiBjbHIsIGludCBuRmllbGRUeXBlKTsKKyAgRlhfQ09MT1JSRUYgR2V0SGlnaGxpZ2h0Q29sb3IoaW50IG5GaWVsZFR5cGUpOworCisgcHJpdmF0ZToKKyNpZm5kZWYgUERGX0VOQUJMRV9YRkEKKyAgc3RhdGljIGNvbnN0IGludCBrTnVtRmllbGRUeXBlcyA9IDY7CisjZWxzZSAgIC8vIFBERl9FTkFCTEVfWEZBCisgIHN0YXRpYyBjb25zdCBpbnQga051bUZpZWxkVHlwZXMgPSA3OworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCisgIEZYX0NPTE9SUkVGIG1fYUhpZ2hsaWdodENvbG9yW2tOdW1GaWVsZFR5cGVzXTsKKyAgdWludDhfdCBtX2lIaWdobGlnaHRBbHBoYTsKKyAgRlhfQk9PTCBtX2JOZWVkSGlnaHRsaWdodFtrTnVtRmllbGRUeXBlc107CiB9OwogCi0jZGVmaW5lIEJBSV9TVFJVQ1RVUkUJCTAKLSNkZWZpbmUgQkFJX1JPVwkJCQkxCi0jZGVmaW5lIEJBSV9DT0xVTU4JCQkyCisjZGVmaW5lIEJBSV9TVFJVQ1RVUkUgMAorI2RlZmluZSBCQUlfUk9XIDEKKyNkZWZpbmUgQkFJX0NPTFVNTiAyCiAKLSNkZWZpbmUgQ1BERlNES19Bbm5vdHMJCQkJQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERlNES19Bbm5vdCo+Ci0jZGVmaW5lIENQREZTREtfU29ydEFubm90cwkJCUNHV19BcnJheVRlbXBsYXRlPENQREZTREtfQW5ub3QqPgotY2xhc3MgQ0JBX0Fubm90SXRlcmF0b3IKLXsKLXB1YmxpYzoKLQlDQkFfQW5ub3RJdGVyYXRvcihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzVHlwZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNTdWJUeXBlKTsKLQl+Q0JBX0Fubm90SXRlcmF0b3IoKTsKKyNkZWZpbmUgQ1BERlNES19Bbm5vdHMgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERlNES19Bbm5vdCo+CisjZGVmaW5lIENQREZTREtfU29ydEFubm90cyBDR1dfQXJyYXlUZW1wbGF0ZTxDUERGU0RLX0Fubm90Kj4KK2NsYXNzIENCQV9Bbm5vdEl0ZXJhdG9yIHsKKyBwdWJsaWM6CisgIENCQV9Bbm5vdEl0ZXJhdG9yKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNUeXBlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc1N1YlR5cGUpOworICB+Q0JBX0Fubm90SXRlcmF0b3IoKTsKIAotCUNQREZTREtfQW5ub3QqCQkJCUdldEZpcnN0QW5ub3QoKTsKLQlDUERGU0RLX0Fubm90KgkJCQlHZXRMYXN0QW5ub3QoKTsKLQlDUERGU0RLX0Fubm90KgkJCQlHZXROZXh0QW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KTsKLQlDUERGU0RLX0Fubm90KgkJCQlHZXRQcmV2QW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KTsKKyAgQ1BERlNES19Bbm5vdCogR2V0Rmlyc3RBbm5vdCgpOworICBDUERGU0RLX0Fubm90KiBHZXRMYXN0QW5ub3QoKTsKKyAgQ1BERlNES19Bbm5vdCogR2V0TmV4dEFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCk7CisgIENQREZTREtfQW5ub3QqIEdldFByZXZBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpOwogCi1wcml2YXRlOgotCXZvaWQJCQkJCQkJCUdlbmVyYXRlUmVzdWx0cygpOwotCXN0YXRpYyBpbnQJCQkJCQkJQ29tcGFyZUJ5TGVmdChDUERGU0RLX0Fubm90KiBwMSwgQ1BERlNES19Bbm5vdCogcDIpOwotCXN0YXRpYyBpbnQJCQkJCQkJQ29tcGFyZUJ5VG9wKENQREZTREtfQW5ub3QqIHAxLCBDUERGU0RLX0Fubm90KiBwMik7Ci0Jc3RhdGljIENQREZfUmVjdAkJCQkJR2V0QW5ub3RSZWN0KENQREZTREtfQW5ub3QqIHBBbm5vdCk7CisgcHJpdmF0ZToKKyAgdm9pZCBHZW5lcmF0ZVJlc3VsdHMoKTsKKyAgc3RhdGljIGludCBDb21wYXJlQnlMZWZ0KENQREZTREtfQW5ub3QqIHAxLCBDUERGU0RLX0Fubm90KiBwMik7CisgIHN0YXRpYyBpbnQgQ29tcGFyZUJ5VG9wKENQREZTREtfQW5ub3QqIHAxLCBDUERGU0RLX0Fubm90KiBwMik7CisgIHN0YXRpYyBDUERGX1JlY3QgR2V0QW5ub3RSZWN0KENQREZTREtfQW5ub3QqIHBBbm5vdCk7CiAKLQlDUERGU0RLX1BhZ2VWaWV3KgkJCQkJbV9wUGFnZVZpZXc7Ci0JQ0ZYX0J5dGVTdHJpbmcJCQkJCQltX3NUeXBlOwotCUNGWF9CeXRlU3RyaW5nCQkJCQkJbV9zU3ViVHlwZTsKLQlpbnQJCQkJCQkJCQltX25UYWJzOwotCUNQREZTREtfQW5ub3RzCQkJCQkJbV9Bbm5vdHM7CisgIENQREZTREtfUGFnZVZpZXcqIG1fcFBhZ2VWaWV3OworICBDRlhfQnl0ZVN0cmluZyBtX3NUeXBlOworICBDRlhfQnl0ZVN0cmluZyBtX3NTdWJUeXBlOworICBpbnQgbV9uVGFiczsKKyAgQ1BERlNES19Bbm5vdHMgbV9Bbm5vdHM7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9GU0RLX0JBU0VGT1JNX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnNka19jb21tb24uaCBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2NvbW1vbi5oCmluZGV4IGJjN2NiY2IuLjI3OTA0OGIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2NvbW1vbi5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2NvbW1vbi5oCkBAIC0xLDQ1ICsxLDQ1IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgRlBERlNES19JTkNMVURFX0ZTREtfQ09NTU9OX0hfCiAjZGVmaW5lIEZQREZTREtfSU5DTFVERV9GU0RLX0NPTU1PTl9IXwogCi0jZGVmaW5lIEJGRlRfU0lHTkFUVVJFCQkJCSJTaWduYXR1cmUiCisjZGVmaW5lIEJGRlRfU0lHTkFUVVJFICJTaWduYXR1cmUiCiAKLS8vZm9yIGFsbCBmaWVsZHMKLSNkZWZpbmUgRklFTERGTEFHX1JFQURPTkxZCQkJCQkxCi0jZGVmaW5lIEZJRUxERkxBR19SRVFVSVJFRAkJCQkJMgotI2RlZmluZSBGSUVMREZMQUdfTk9FWFBPUlQJCQkJCTQKLS8vZm9yIHRleHQgZmllbGRzCi0jZGVmaW5lIEZJRUxERkxBR19NVUxUSUxJTkUJCQkJCSgxPDwxMikKLSNkZWZpbmUgRklFTERGTEFHX1BBU1NXT1JECQkJCQkoMTw8MTMpCi0jZGVmaW5lIEZJRUxERkxBR19GSUxFU0VMRUNUCQkJCSgxPDwyMCkKLSNkZWZpbmUgRklFTERGTEFHX0RPTk9UU1BFTExDSEVDSwkJCSgxPDwyMikKLSNkZWZpbmUgRklFTERGTEFHX0RPTk9UU0NST0xMCQkJCSgxPDwyMykKLSNkZWZpbmUgRklFTERGTEFHX0NPTUIJCQkJCQkoMTw8MjQpCi0jZGVmaW5lIEZJRUxERkxBR19SSUNIVEVYVAkJCQkJKDE8PDI1KQotLy9mb3IgYnV0dG9uIGZpbGVkcwotI2RlZmluZSBGSUVMREZMQUdfTk9UT0dHTEVUT09GRgkJCQkoMTw8MTQpCi0jZGVmaW5lIEZJRUxERkxBR19SQURJTwkJCQkJCSgxPDwxNSkKLSNkZWZpbmUgRklFTERGTEFHX1BVU0hCVVRUT04JCQkJKDE8PDE2KQotI2RlZmluZSBGSUVMREZMQUdfUkFESU9TSU5VTklTT04JCQkoMTw8MjUpCi0vL2ZvciBjaG9pY2UgZmllbGRzCi0jZGVmaW5lIEZJRUxERkxBR19DT01CTwkJCQkJCSgxPDwxNykKLSNkZWZpbmUgRklFTERGTEFHX0VESVQJCQkJCQkoMTw8MTgpCi0jZGVmaW5lIEZJRUxERkxBR19TT1JUCQkJCQkJKDE8PDE5KQotI2RlZmluZSBGSUVMREZMQUdfTVVMVElTRUxFQ1QJCQkJKDE8PDIxKQorLy8gZm9yIGFsbCBmaWVsZHMKKyNkZWZpbmUgRklFTERGTEFHX1JFQURPTkxZIDEKKyNkZWZpbmUgRklFTERGTEFHX1JFUVVJUkVEIDIKKyNkZWZpbmUgRklFTERGTEFHX05PRVhQT1JUIDQKKy8vIGZvciB0ZXh0IGZpZWxkcworI2RlZmluZSBGSUVMREZMQUdfTVVMVElMSU5FICgxIDw8IDEyKQorI2RlZmluZSBGSUVMREZMQUdfUEFTU1dPUkQgKDEgPDwgMTMpCisjZGVmaW5lIEZJRUxERkxBR19GSUxFU0VMRUNUICgxIDw8IDIwKQorI2RlZmluZSBGSUVMREZMQUdfRE9OT1RTUEVMTENIRUNLICgxIDw8IDIyKQorI2RlZmluZSBGSUVMREZMQUdfRE9OT1RTQ1JPTEwgKDEgPDwgMjMpCisjZGVmaW5lIEZJRUxERkxBR19DT01CICgxIDw8IDI0KQorI2RlZmluZSBGSUVMREZMQUdfUklDSFRFWFQgKDEgPDwgMjUpCisvLyBmb3IgYnV0dG9uIGZpbGVkcworI2RlZmluZSBGSUVMREZMQUdfTk9UT0dHTEVUT09GRiAoMSA8PCAxNCkKKyNkZWZpbmUgRklFTERGTEFHX1JBRElPICgxIDw8IDE1KQorI2RlZmluZSBGSUVMREZMQUdfUFVTSEJVVFRPTiAoMSA8PCAxNikKKyNkZWZpbmUgRklFTERGTEFHX1JBRElPU0lOVU5JU09OICgxIDw8IDI1KQorLy8gZm9yIGNob2ljZSBmaWVsZHMKKyNkZWZpbmUgRklFTERGTEFHX0NPTUJPICgxIDw8IDE3KQorI2RlZmluZSBGSUVMREZMQUdfRURJVCAoMSA8PCAxOCkKKyNkZWZpbmUgRklFTERGTEFHX1NPUlQgKDEgPDwgMTkpCisjZGVmaW5lIEZJRUxERkxBR19NVUxUSVNFTEVDVCAoMSA8PCAyMSkKICNpZm5kZWYgRklFTERGTEFHX0RPTk9UU1BFTExDSEVDSwotI2RlZmluZSBGSUVMREZMQUdfRE9OT1RTUEVMTENIRUNLCQkoMTw8MjIpCisjZGVmaW5lIEZJRUxERkxBR19ET05PVFNQRUxMQ0hFQ0sgKDEgPDwgMjIpCiAjZW5kaWYKLSNkZWZpbmUgRklFTERGTEFHX0NPTU1JVE9OU0VMQ0hBTkdFCQkJKDE8PDI2KQorI2RlZmluZSBGSUVMREZMQUdfQ09NTUlUT05TRUxDSEFOR0UgKDEgPDwgMjYpCiAKLSNkZWZpbmUgQkJTX1NPTElECQkJCQkwCi0jZGVmaW5lIEJCU19EQVNICQkJCQkxCi0jZGVmaW5lIEJCU19CRVZFTEVECQkJCQkyCi0jZGVmaW5lIEJCU19JTlNFVAkJCQkJMwotI2RlZmluZSBCQlNfVU5ERVJMSU5FCQkJCTQKKyNkZWZpbmUgQkJTX1NPTElEIDAKKyNkZWZpbmUgQkJTX0RBU0ggMQorI2RlZmluZSBCQlNfQkVWRUxFRCAyCisjZGVmaW5lIEJCU19JTlNFVCAzCisjZGVmaW5lIEJCU19VTkRFUkxJTkUgNAogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9GU0RLX0NPTU1PTl9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfZGVmaW5lLmggYi9mcGRmc2RrL2luY2x1ZGUvZnNka19kZWZpbmUuaAppbmRleCA4YTgzOWFiLi43MDhlODE3IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZnNka19kZWZpbmUuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnNka19kZWZpbmUuaApAQCAtMSw5MCArMSwxNDAgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBGUERGU0RLX0lOQ0xVREVfRlNES19ERUZJTkVfSF8KICNkZWZpbmUgRlBERlNES19JTkNMVURFX0ZTREtfREVGSU5FX0hfCiAKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZW9iai5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFyc2VyLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZW5kZXIuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfdnQuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9nZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2dlX3dpbjMyLmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiCisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfZG9jLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9wYWdlLmgiCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJ0aW1lcm1nci5oIgorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z4YmFyY29kZS9CQ19CYXJDb2RlLmgiCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZnhmYS9meGZhLmgiCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZnhncmFwaGljcy9meF9ncmFwaGljcy5oIgorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z4anNlL2Z4anNlLmgiCisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKICNpZmRlZiBfV0lOMzIKICNpbmNsdWRlIDx0Y2hhci5oPgogI2luY2x1ZGUgPG1hdGguaD4KICNlbmRpZgogCi0jaW5jbHVkZSAiLi4vLi4vY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYXJzZXIuaCIgCi0jaW5jbHVkZSAiLi4vLi4vY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZmFwaS5oIiAKLSNpbmNsdWRlICIuLi8uLi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhcnNlci5oIiAKLSNpbmNsdWRlICIuLi8uLi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX21vZHVsZS5oIiAKLSNpbmNsdWRlICIuLi8uLi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3JlbmRlci5oIiAKLSNpbmNsdWRlICIuLi8uLi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhZ2VvYmouaCIgCi0jaW5jbHVkZSAiLi4vLi4vY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9zZXJpYWwuaCIgCisvLyBDb252ZXJ0IGEgI0ZYX0FSR0IgdG8gYSAjRlhfQ09MT1JSRUYuCisjZGVmaW5lIEZYX0FSR0JUT0NPTE9SUkVGKGFyZ2IpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKChGWF9EV09SRClhcmdiICYgMHgwMEZGMDAwMCkgPj4gMTYpIHwgKChGWF9EV09SRClhcmdiICYgMHgwMDAwRkYwMCkgfCBcCisgICAoKChGWF9EV09SRClhcmdiICYgMHgwMDAwMDBGRikgPDwgMTYpKQogCi0jaW5jbHVkZSAiLi4vLi4vY29yZS9pbmNsdWRlL2ZwZGZ0ZXh0L2ZwZGZfdGV4dC5oIgorLy8gQ29udmVydCBhICNGWF9DT0xPUlJFRiB0byBhICNGWF9BUkdCLgorI2RlZmluZSBGWF9DT0xPUlJFRlRPQVJHQihyZ2IpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoRlhfRFdPUkQpMHhGRjAwMDAwMCB8ICgoKEZYX0RXT1JEKXJnYiAmIDB4MDAwMDAwRkYpIDw8IDE2KSB8IFwKKyAgICgoRlhfRFdPUkQpcmdiICYgMHgwMDAwRkYwMCkgfCAoKChGWF9EV09SRClyZ2IgJiAweDAwRkYwMDAwKSA+PiAxNikpCiAKLSNpbmNsdWRlICIuLi8uLi9jb3JlL2luY2x1ZGUvZnhnZS9meF9nZV93aW4zMi5oIgotI2luY2x1ZGUgIi4uLy4uL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlLmgiCit0eXBlZGVmIHVuc2lnbmVkIGludCBGWF9VSU5UOworY2xhc3MgQ1JlbmRlckNvbnRleHQ7CitjbGFzcyBJRlNES19QQVVTRV9BZGFwdGVyOwogCi0jaW5jbHVkZSAiLi4vLi4vY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWMuaCIKK2NsYXNzIENQREZfQ3VzdG9tQWNjZXNzIGZpbmFsIDogcHVibGljIElGWF9GaWxlUmVhZCB7CisgcHVibGljOgorICBleHBsaWNpdCBDUERGX0N1c3RvbUFjY2VzcyhGUERGX0ZJTEVBQ0NFU1MqIHBGaWxlQWNjZXNzKTsKKyAgfkNQREZfQ3VzdG9tQWNjZXNzKCkgb3ZlcnJpZGUge30KIAotI2luY2x1ZGUgIi4uLy4uL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgiIAotI2luY2x1ZGUgIi4uLy4uL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfdnQuaCIgCisgIC8vIElGWF9GaWxlUmVhZAorICBGWF9GSUxFU0laRSBHZXRTaXplKCkgb3ZlcnJpZGUgeyByZXR1cm4gbV9GaWxlQWNjZXNzLm1fRmlsZUxlbjsgfQorICB2b2lkIFJlbGVhc2UoKSBvdmVycmlkZSB7IGRlbGV0ZSB0aGlzOyB9CisgIEZYX0JPT0wgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CiAKLSNpbmNsdWRlICIuLi8uLi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfeG1sLmgiIAorI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0RnVsbFBhdGgoKSB7IHJldHVybiAiIjsgfQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0Qnl0ZShGWF9EV09SRCBwb3MsIHVpbnQ4X3QmIGNoKTsKKyAgdmlydHVhbCBGWF9CT09MIEdldEJsb2NrKEZYX0RXT1JEIHBvcywgdWludDhfdCogcEJ1ZiwgRlhfRFdPUkQgc2l6ZSk7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKLQotI2lmbmRlZiBGWF9HZXRBVmFsdWUKLS8qKiBAYnJpZWYgSXQgcmV0cmlldmVzIGFuIGludGVuc2l0eSB2YWx1ZSBmb3IgdGhlIGFscGhhIGNvbXBvbmVudCBvZiBhICNGWF9BUkdCIHZhbHVlLiAqLwotI2RlZmluZSBGWF9HZXRBVmFsdWUoYXJnYikJCQkoKGFyZ2IgJiAweEZGMDAwMDAwKSA+PiAyNCkKLSNlbmRpZgotCi0jaWZuZGVmIEZYX0dldFJWYWx1ZQotLyoqIEBicmllZiBJdCByZXRyaWV2ZXMgYW4gaW50ZW5zaXR5IHZhbHVlIGZvciB0aGUgcmVkIGNvbXBvbmVudCBvZiBhICNGWF9BUkdCIHZhbHVlLiAqLwotI2RlZmluZSBGWF9HZXRSVmFsdWUoYXJnYikJCQkoKGFyZ2IgJiAweDAwRkYwMDAwKSA+PiAxNikKLSNlbmRpZgotCi0jaWZuZGVmIEZYX0dldEdWYWx1ZQotLyoqIEBicmllZiBJdCByZXRyaWV2ZXMgYW4gaW50ZW5zaXR5IHZhbHVlIGZvciB0aGUgZ3JlZW4gY29tcG9uZW50IG9mIGEgI0ZYX0FSR0IgdmFsdWUuICovCi0jZGVmaW5lIEZYX0dldEdWYWx1ZShhcmdiKQkJCSgoYXJnYiAmIDB4MDAwMEZGMDApID4+IDgpCi0jZW5kaWYKLQotI2lmbmRlZiBGWF9HZXRCVmFsdWUKLS8qKiBAYnJpZWYgSXQgcmV0cmlldmVzIGFuIGludGVuc2l0eSB2YWx1ZSBmb3IgdGhlIGJsdWUgY29tcG9uZW50IG9mIGEgI0ZYX0FSR0IgdmFsdWUuICovCi0jZGVmaW5lIEZYX0dldEJWYWx1ZShhcmdiKQkJCShhcmdiICYgMHgwMDAwMDBGRikKLSNlbmRpZgotCi0jaWZuZGVmIEZYX0FSR0JUT0NPTE9SUkVGCi0vKiogQGJyaWVmIENvbnZlcnQgYSAjRlhfQVJHQiB0byBhICNGWF9DT0xPUlJFRi4gKi8KLSNkZWZpbmUgRlhfQVJHQlRPQ09MT1JSRUYoYXJnYikJCSgoKChGWF9EV09SRClhcmdiICYgMHgwMEZGMDAwMCkgPj4gMTYpfCgoRlhfRFdPUkQpYXJnYiAmIDB4MDAwMEZGMDApfCgoKEZYX0RXT1JEKWFyZ2IgJiAweDAwMDAwMEZGKSA8PCAxNikpCi0jZW5kaWYKLQotI2lmbmRlZiBGWF9DT0xPUlJFRlRPQVJHQgotLyoqIEBicmllZiBDb252ZXJ0IGEgI0ZYX0NPTE9SUkVGIHRvIGEgI0ZYX0FSR0IuICovCi0jZGVmaW5lIEZYX0NPTE9SUkVGVE9BUkdCKHJnYikJCSgoRlhfRFdPUkQpMHhGRjAwMDAwMHwoKChGWF9EV09SRClyZ2IgJiAweDAwMDAwMEZGKSA8PCAxNil8KChGWF9EV09SRClyZ2IgJiAweDAwMDBGRjAwKXwoKChGWF9EV09SRClyZ2IgJiAweDAwRkYwMDAwKSA+PiAxNikpCi0jZW5kaWYKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgRlhfVUlOVDsJCi0KLSNpbmNsdWRlICIuLi8uLi9wdWJsaWMvZnBkZnZpZXcuaCIKLQotY2xhc3MgQ1BERl9DdXN0b21BY2Nlc3MgRlhfRklOQUwgOiBwdWJsaWMgSUZYX0ZpbGVSZWFkCi17Ci1wdWJsaWM6Ci0JQ1BERl9DdXN0b21BY2Nlc3MoRlBERl9GSUxFQUNDRVNTKiBwRmlsZUFjY2Vzcyk7Ci0JfkNQREZfQ3VzdG9tQWNjZXNzKCkge30KLQotCXZpcnR1YWwgRlhfRklMRVNJWkUJR2V0U2l6ZSgpIEZYX09WRVJSSURFIHsgcmV0dXJuIG1fRmlsZUFjY2Vzcy5tX0ZpbGVMZW47IH0KLQotCXZpcnR1YWwgdm9pZAkJUmVsZWFzZSgpIEZYX09WRVJSSURFIHsgZGVsZXRlIHRoaXM7IH0KLQotCXZpcnR1YWwgRlhfQk9PTAkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgRlhfT1ZFUlJJREU7Ci0KLXByaXZhdGU6Ci0JRlBERl9GSUxFQUNDRVNTCQltX0ZpbGVBY2Nlc3M7CisgcHJpdmF0ZToKKyAgRlBERl9GSUxFQUNDRVNTIG1fRmlsZUFjY2VzczsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICB1aW50OF90IG1fQnVmZmVyWzUxMl07CisgIEZYX0RXT1JEIG1fQnVmZmVyT2Zmc2V0OworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogfTsKIAotdm9pZAkJRlNES19TZXRTYW5kQm94UG9saWN5KEZQREZfRFdPUkQgcG9saWN5LCBGUERGX0JPT0wgZW5hYmxlKTsKLUZQREZfQk9PTAlGU0RLX0lzU2FuZEJveFBvbGljeUVuYWJsZWQoRlBERl9EV09SRCBwb2xpY3kpOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCitjbGFzcyBDRlBERl9GaWxlU3RyZWFtIDogcHVibGljIElGWF9GaWxlU3RyZWFtIHsKKyBwdWJsaWM6CisgIENGUERGX0ZpbGVTdHJlYW0oRlBERl9GSUxFSEFORExFUiogcEZTKTsKKyAgdmlydHVhbCB+Q0ZQREZfRmlsZVN0cmVhbSgpIHt9CiAKKyAgdmlydHVhbCBJRlhfRmlsZVN0cmVhbSogUmV0YWluKCk7CisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCk7CisKKyAgdmlydHVhbCBGWF9GSUxFU0laRSBHZXRTaXplKCk7CisgIHZpcnR1YWwgRlhfQk9PTCBJc0VPRigpOworICB2aXJ0dWFsIEZYX0ZJTEVTSVpFIEdldFBvc2l0aW9uKCkgeyByZXR1cm4gbV9uQ3VyUG9zOyB9CisgIHZpcnR1YWwgdm9pZCBTZXRQb3NpdGlvbihGWF9GSUxFU0laRSBwb3MpIHsgbV9uQ3VyUG9zID0gcG9zOyB9CisgIHZpcnR1YWwgRlhfQk9PTCBSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKTsKKyAgdmlydHVhbCBzaXplX3QgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOworICB2aXJ0dWFsIEZYX0JPT0wgV3JpdGVCbG9jayhjb25zdCB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpOworICB2aXJ0dWFsIEZYX0JPT0wgRmx1c2goKTsKKworIHByb3RlY3RlZDoKKyAgRlBERl9GSUxFSEFORExFUiogbV9wRlM7CisgIEZYX0ZJTEVTSVpFIG1fbkN1clBvczsKK307CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKKy8vIE9iamVjdCB0eXBlcyBmb3IgcHVibGljIEZQREZfIHR5cGVzOyB0aGVzZSBjb3JyZXNwb25kIHRvIG5leHQgbGF5ZXIgZG93bgorLy8gZnJvbSBmcGRmc2RrLiBGb3IgbWFzdGVyLCB0aGVzZSBhcmUgQ1BERl8gdHlwZXMsIGJ1dCBmb3IgWEZBLCB0aGVzZSBhcmUKKy8vIENQREZYRkFfIHR5cGVzLgorI2lmbmRlZiBQREZfRU5BQkxFX1hGQQordXNpbmcgVW5kZXJseWluZ0RvY3VtZW50VHlwZSA9IENQREZfRG9jdW1lbnQ7Cit1c2luZyBVbmRlcmx5aW5nUGFnZVR5cGUgPSBDUERGX1BhZ2U7CisjZWxzZSAgIC8vIFBERl9FTkFCTEVfWEZBCit1c2luZyBVbmRlcmx5aW5nRG9jdW1lbnRUeXBlID0gQ1BERlhGQV9Eb2N1bWVudDsKK3VzaW5nIFVuZGVybHlpbmdQYWdlVHlwZSA9IENQREZYRkFfUGFnZTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworLy8gQ29udmVyc2lvbnMgdG8vZnJvbSB1bmRlcmx5aW5nIHR5cGVzLgorVW5kZXJseWluZ0RvY3VtZW50VHlwZSogVW5kZXJseWluZ0Zyb21GUERGRG9jdW1lbnQoRlBERl9ET0NVTUVOVCBkb2MpOworRlBERl9ET0NVTUVOVCBGUERGRG9jdW1lbnRGcm9tVW5kZXJseWluZyhVbmRlcmx5aW5nRG9jdW1lbnRUeXBlKiBkb2MpOworCitVbmRlcmx5aW5nUGFnZVR5cGUqIFVuZGVybHlpbmdGcm9tRlBERlBhZ2UoRlBERl9QQUdFIHBhZ2UpOworCisvLyBDb252ZXJzaW9ucyB0by9mcm9tIEZQREZfIHR5cGVzLgorQ1BERl9Eb2N1bWVudCogQ1BERkRvY3VtZW50RnJvbUZQREZEb2N1bWVudChGUERGX0RPQ1VNRU5UIGRvYyk7CitGUERGX0RPQ1VNRU5UIEZQREZEb2N1bWVudEZyb21DUERGRG9jdW1lbnQoQ1BERl9Eb2N1bWVudCogZG9jKTsKKworQ1BERl9QYWdlKiBDUERGUGFnZUZyb21GUERGUGFnZShGUERGX1BBR0UgcGFnZSk7CisKK3ZvaWQgRHJvcENvbnRleHQodm9pZCogZGF0YSk7Cit2b2lkIEZTREtfU2V0U2FuZEJveFBvbGljeShGUERGX0RXT1JEIHBvbGljeSwgRlBERl9CT09MIGVuYWJsZSk7CitGUERGX0JPT0wgRlNES19Jc1NhbmRCb3hQb2xpY3lFbmFibGVkKEZQREZfRFdPUkQgcG9saWN5KTsKK3ZvaWQgRlBERl9SZW5kZXJQYWdlX1JldGFpbChDUmVuZGVyQ29udGV4dCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5lZWRUb1Jlc3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZTREtfUEFVU0VfQWRhcHRlciogcGF1c2UpOworCit2b2lkIENoZWNrVW5TdXBwb3J0RXJyb3IoQ1BERl9Eb2N1bWVudCogcERvYywgRlhfRFdPUkQgZXJyX2NvZGUpOwordm9pZCBDaGVja1VuU3VwcG9ydEFubm90KENQREZfRG9jdW1lbnQqIHBEb2MsIGNvbnN0IENQREZfQW5ub3QqIHBQREZBbm5vdCk7Cit2b2lkIFByb2Nlc3NQYXJzZUVycm9yKEZYX0RXT1JEIGVycl9jb2RlKTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfRlNES19ERUZJTkVfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX21nci5oIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfbWdyLmgKaW5kZXggNGI3Y2M1Ni4uNTFmMTY5MSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfbWdyLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2ZzZGtfbWdyLmgKQEAgLTcsNTU2ICs3LDczNSBAQAogI2lmbmRlZiBGUERGU0RLX0lOQ0xVREVfRlNES19NR1JfSF8KICNkZWZpbmUgRlBERlNES19JTkNMVURFX0ZTREtfTUdSX0hfCiAKLSNpbmNsdWRlICIuLi8uLi9wdWJsaWMvZnBkZl9mb3JtZmlsbC5oIgotI2luY2x1ZGUgIi4uLy4uL3B1YmxpYy9mcGRmX2Z3bGV2ZW50LmgiIC8vIGNyb3NzIHBsYXRmb3JtIGtleWNvZGUgYW5kIGV2ZW50cyBkZWZpbmUuCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmdGV4dC9mcGRmX3RleHQuaCIKKyNpbmNsdWRlICJmc2RrX2FjdGlvbmhhbmRsZXIuaCIKKyNpbmNsdWRlICJmc2RrX2Fubm90aGFuZGxlci5oIgorI2luY2x1ZGUgImZzZGtfYmFzZWFubm90LmgiCisjaW5jbHVkZSAiZnNka19iYXNlZm9ybS5oIgogI2luY2x1ZGUgImZzZGtfY29tbW9uLmgiCiAjaW5jbHVkZSAiZnNka19kZWZpbmUuaCIKICNpbmNsdWRlICJmeF9zeXN0ZW1oYW5kbGVyLmgiCi0jaW5jbHVkZSAiZnNka19iYXNlYW5ub3QuaCIKLSNpbmNsdWRlICJmc2RrX2Jhc2Vmb3JtLmgiCi0jaW5jbHVkZSAiZnNka19hbm5vdGhhbmRsZXIuaCIKLSNpbmNsdWRlICJmc2RrX2FjdGlvbmhhbmRsZXIuaCIKKyNpbmNsdWRlICJqYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZfZm9ybWZpbGwuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9md2xldmVudC5oIiAgLy8gY3Jvc3MgcGxhdGZvcm0ga2V5Y29kZSBhbmQgZXZlbnRzIGRlZmluZS4KIAotY2xhc3MgQ1BERlNES19Eb2N1bWVudDsKLWNsYXNzIENQREZTREtfUGFnZVZpZXc7Ci1jbGFzcyBDUERGU0RLX0Fubm90OworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9kb2MuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX3BhZ2UuaCIKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKwogY2xhc3MgQ0ZGTF9JRm9ybUZpbGxlcjsKK2NsYXNzIENQREZTREtfQWN0aW9uSGFuZGxlcjsKK2NsYXNzIENQREZTREtfQW5ub3Q7CitjbGFzcyBDUERGU0RLX0RvY3VtZW50OworY2xhc3MgQ1BERlNES19JbnRlckZvcm07CitjbGFzcyBDUERGU0RLX1BhZ2VWaWV3OwogY2xhc3MgQ1BERlNES19XaWRnZXQ7CiBjbGFzcyBJRlhfU3lzdGVtSGFuZGxlcjsKLWNsYXNzIENQREZTREtfQWN0aW9uSGFuZGxlcjsKLWNsYXNzIENKU19SdW50aW1lRmFjdG9yeTsKIAotI2luY2x1ZGUgImphdmFzY3JpcHQvSUphdmFTY3JpcHQuaCIKK2NsYXNzIENQREZEb2NfRW52aXJvbm1lbnQgZmluYWwgeworIHB1YmxpYzoKKyAgQ1BERkRvY19FbnZpcm9ubWVudChVbmRlcmx5aW5nRG9jdW1lbnRUeXBlKiBwRG9jLCBGUERGX0ZPUk1GSUxMSU5GTyogcEZGaW5mbyk7CisgIH5DUERGRG9jX0Vudmlyb25tZW50KCk7CiAKLWNsYXNzIENQREZEb2NfRW52aXJvbm1lbnQgRlhfRklOQUwKLXsKLXB1YmxpYzoKLQlDUERGRG9jX0Vudmlyb25tZW50KENQREZfRG9jdW1lbnQgKiBwRG9jKTsKLQl+Q1BERkRvY19FbnZpcm9ubWVudCgpOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIHZvaWQgUmVsZWFzZSgpIHsKKyAgICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5SZWxlYXNlKQorICAgICAgbV9wSW5mby0+UmVsZWFzZShtX3BJbmZvKTsKKyAgICBkZWxldGUgdGhpczsKKyAgfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCi0JaW50IFJlZ0FwcEhhbmRsZShGUERGX0ZPUk1GSUxMSU5GTyogcEZGaW5mbyk7CisgIHZvaWQgRkZJX0ludmFsaWRhdGUoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGJvdHRvbSkgeworICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9JbnZhbGlkYXRlKQorICAgICAgbV9wSW5mby0+RkZJX0ludmFsaWRhdGUobV9wSW5mbywgcGFnZSwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgfQogCi0Jdm9pZCBGRklfSW52YWxpZGF0ZShGUERGX1BBR0UgcGFnZSwgZG91YmxlIGxlZnQsIGRvdWJsZSB0b3AsIGRvdWJsZSByaWdodCwgZG91YmxlIGJvdHRvbSkKLQl7Ci0JCWlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9JbnZhbGlkYXRlKQotCQl7Ci0JCQltX3BJbmZvLT5GRklfSW52YWxpZGF0ZShtX3BJbmZvLCBwYWdlLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOwotCQl9Ci0JfQotCXZvaWQgRkZJX091dHB1dFNlbGVjdGVkUmVjdChGUERGX1BBR0UgcGFnZSwgZG91YmxlIGxlZnQsIGRvdWJsZSB0b3AsIGRvdWJsZSByaWdodCwgZG91YmxlIGJvdHRvbSkKLQl7Ci0JCWlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9PdXRwdXRTZWxlY3RlZFJlY3QpCi0JCXsKLQkJCW1fcEluZm8tPkZGSV9PdXRwdXRTZWxlY3RlZFJlY3QobV9wSW5mbywgcGFnZSwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKLQkJfQotCX0KKyAgdm9pZCBGRklfT3V0cHV0U2VsZWN0ZWRSZWN0KEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGJvdHRvbSkgeworICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9PdXRwdXRTZWxlY3RlZFJlY3QpCisgICAgICBtX3BJbmZvLT5GRklfT3V0cHV0U2VsZWN0ZWRSZWN0KG1fcEluZm8sIHBhZ2UsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgIH0KIAotCXZvaWQgRkZJX1NldEN1cnNvcihpbnQgbkN1cnNvclR5cGUpCi0JewotCQlpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfU2V0Q3Vyc29yKQotCQl7Ci0JCQltX3BJbmZvLT5GRklfU2V0Q3Vyc29yKG1fcEluZm8sIG5DdXJzb3JUeXBlKTsKLQkJfQotCX0KKyAgdm9pZCBGRklfU2V0Q3Vyc29yKGludCBuQ3Vyc29yVHlwZSkgeworICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9TZXRDdXJzb3IpCisgICAgICBtX3BJbmZvLT5GRklfU2V0Q3Vyc29yKG1fcEluZm8sIG5DdXJzb3JUeXBlKTsKKyAgfQogCi0JaW50ICBGRklfU2V0VGltZXIoaW50IHVFbGFwc2UsIFRpbWVyQ2FsbGJhY2sgbHBUaW1lckZ1bmMpCi0JewotCQlpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfU2V0VGltZXIpCi0JCXsKLQkJCXJldHVybiBtX3BJbmZvLT5GRklfU2V0VGltZXIobV9wSW5mbywgdUVsYXBzZSwgbHBUaW1lckZ1bmMpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9CisgIGludCBGRklfU2V0VGltZXIoaW50IHVFbGFwc2UsIFRpbWVyQ2FsbGJhY2sgbHBUaW1lckZ1bmMpIHsKKyAgICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfU2V0VGltZXIpCisgICAgICByZXR1cm4gbV9wSW5mby0+RkZJX1NldFRpbWVyKG1fcEluZm8sIHVFbGFwc2UsIGxwVGltZXJGdW5jKTsKKyAgICByZXR1cm4gLTE7CisgIH0KIAotCXZvaWQgRkZJX0tpbGxUaW1lcihpbnQgblRpbWVySUQpCi0JewotCQlpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfS2lsbFRpbWVyKQotCQl7Ci0JCQltX3BJbmZvLT5GRklfS2lsbFRpbWVyKG1fcEluZm8sIG5UaW1lcklEKTsKLQkJfQotCX0KLQlGWF9TWVNURU1USU1FIEZGSV9HZXRMb2NhbFRpbWUoKQotCXsKLQkJRlhfU1lTVEVNVElNRSBmeHRpbWU7Ci0JCWlmKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0dldExvY2FsVGltZSkKLQkJewotCQkJRlBERl9TWVNURU1USU1FIHN5c3RpbWUgPSBtX3BJbmZvLT5GRklfR2V0TG9jYWxUaW1lKG1fcEluZm8pOwotCQkJZnh0aW1lLndEYXkgPSBzeXN0aW1lLndEYXk7Ci0JCQlmeHRpbWUud0RheU9mV2VlayA9IHN5c3RpbWUud0RheU9mV2VlazsKLQkJCWZ4dGltZS53SG91ciA9IHN5c3RpbWUud0hvdXI7Ci0JCQlmeHRpbWUud01pbGxpc2Vjb25kcyA9IHN5c3RpbWUud01pbGxpc2Vjb25kczsKLQkJCWZ4dGltZS53TWludXRlID0gc3lzdGltZS53TWludXRlOwotCQkJZnh0aW1lLndNb250aCA9IHN5c3RpbWUud01vbnRoOwotCQkJZnh0aW1lLndTZWNvbmQgPSBzeXN0aW1lLndTZWNvbmQ7Ci0JCQlmeHRpbWUud1llYXIgPSBzeXN0aW1lLndZZWFyOwotCQl9Ci0JCXJldHVybiBmeHRpbWU7Ci0JfQorICB2b2lkIEZGSV9LaWxsVGltZXIoaW50IG5UaW1lcklEKSB7CisgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0tpbGxUaW1lcikKKyAgICAgIG1fcEluZm8tPkZGSV9LaWxsVGltZXIobV9wSW5mbywgblRpbWVySUQpOworICB9CiAKLQl2b2lkIEZGSV9PbkNoYW5nZSgpCi0JewotCQlpZihtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9PbkNoYW5nZSkKLQkJewotCQkJbV9wSW5mby0+RkZJX09uQ2hhbmdlKG1fcEluZm8pOwotCQl9Ci0JfQorICBGWF9TWVNURU1USU1FIEZGSV9HZXRMb2NhbFRpbWUoKSBjb25zdCB7CisgICAgRlhfU1lTVEVNVElNRSBmeHRpbWU7CisgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0dldExvY2FsVGltZSkgeworICAgICAgRlBERl9TWVNURU1USU1FIHN5c3RpbWUgPSBtX3BJbmZvLT5GRklfR2V0TG9jYWxUaW1lKG1fcEluZm8pOworICAgICAgZnh0aW1lLndEYXkgPSBzeXN0aW1lLndEYXk7CisgICAgICBmeHRpbWUud0RheU9mV2VlayA9IHN5c3RpbWUud0RheU9mV2VlazsKKyAgICAgIGZ4dGltZS53SG91ciA9IHN5c3RpbWUud0hvdXI7CisgICAgICBmeHRpbWUud01pbGxpc2Vjb25kcyA9IHN5c3RpbWUud01pbGxpc2Vjb25kczsKKyAgICAgIGZ4dGltZS53TWludXRlID0gc3lzdGltZS53TWludXRlOworICAgICAgZnh0aW1lLndNb250aCA9IHN5c3RpbWUud01vbnRoOworICAgICAgZnh0aW1lLndTZWNvbmQgPSBzeXN0aW1lLndTZWNvbmQ7CisgICAgICBmeHRpbWUud1llYXIgPSBzeXN0aW1lLndZZWFyOworICAgIH0KKyAgICByZXR1cm4gZnh0aW1lOworICB9CiAKLQlGWF9CT09MCUZGSV9Jc1NISUZUS2V5RG93bihGWF9EV09SRCBuRmxhZykKLQl7CisgIHZvaWQgRkZJX09uQ2hhbmdlKCkgeworICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9PbkNoYW5nZSkKKyAgICAgIG1fcEluZm8tPkZGSV9PbkNoYW5nZShtX3BJbmZvKTsKKyAgfQogCi0JCXJldHVybiAobkZsYWcgJiBGV0xfRVZFTlRGTEFHX1NoaWZ0S2V5KSAhPSAwOwotCX0KLQlGWF9CT09MCUZGSV9Jc0NUUkxLZXlEb3duKEZYX0RXT1JEIG5GbGFnKQotCXsKKyAgRlhfQk9PTCBGRklfSXNTSElGVEtleURvd24oRlhfRFdPUkQgbkZsYWcpIGNvbnN0IHsKKyAgICByZXR1cm4gKG5GbGFnICYgRldMX0VWRU5URkxBR19TaGlmdEtleSkgIT0gMDsKKyAgfQogCi0JCXJldHVybiAobkZsYWcgJiBGV0xfRVZFTlRGTEFHX0NvbnRyb2xLZXkpICE9IDA7Ci0JfQotCUZYX0JPT0wJRkZJX0lzQUxUS2V5RG93bihGWF9EV09SRCBuRmxhZykKLQl7CisgIEZYX0JPT0wgRkZJX0lzQ1RSTEtleURvd24oRlhfRFdPUkQgbkZsYWcpIGNvbnN0IHsKKyAgICByZXR1cm4gKG5GbGFnICYgRldMX0VWRU5URkxBR19Db250cm9sS2V5KSAhPSAwOworICB9CiAKLQkJcmV0dXJuIChuRmxhZyAmIEZXTF9FVkVOVEZMQUdfQWx0S2V5KSAhPSAwOwotCX0KLQlGWF9CT09MCUZGSV9Jc0lOU0VSVEtleURvd24oRlhfRFdPUkQgbkZsYWcpCi0JewotCQlyZXR1cm4gRkFMU0U7Ci0JfQorICBGWF9CT09MIEZGSV9Jc0FMVEtleURvd24oRlhfRFdPUkQgbkZsYWcpIGNvbnN0IHsKKyAgICByZXR1cm4gKG5GbGFnICYgRldMX0VWRU5URkxBR19BbHRLZXkpICE9IDA7CisgIH0KIAotCWludCBKU19hcHBBbGVydChGWF9MUENXU1RSIE1zZywgRlhfTFBDV1NUUiBUaXRsZSwgRlhfVUlOVCBUeXBlLCBGWF9VSU5UIEljb24pCi0JewotCQlpZihtX3BJbmZvICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+YXBwX2FsZXJ0KQotCQl7Ci0JCQlDRlhfQnl0ZVN0cmluZyBic01zZyA9IENGWF9XaWRlU3RyaW5nKE1zZykuVVRGMTZMRV9FbmNvZGUoKTsKLQkJCUNGWF9CeXRlU3RyaW5nIGJzVGl0bGUgPSBDRlhfV2lkZVN0cmluZyhUaXRsZSkuVVRGMTZMRV9FbmNvZGUoKTsKLQkJCUZQREZfV0lERVNUUklORyBwTXNnID0gKEZQREZfV0lERVNUUklORylic01zZy5HZXRCdWZmZXIoYnNNc2cuR2V0TGVuZ3RoKCkpOwotCQkJRlBERl9XSURFU1RSSU5HIHBUaXRsZSA9IChGUERGX1dJREVTVFJJTkcpYnNUaXRsZS5HZXRCdWZmZXIoYnNUaXRsZS5HZXRMZW5ndGgoKSk7Ci0JCQlpbnQgcmV0ID0gbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+YXBwX2FsZXJ0KG1fcEluZm8tPm1fcEpzUGxhdGZvcm0sIHBNc2csIHBUaXRsZSwgVHlwZSwgSWNvbik7Ci0JCQlic01zZy5SZWxlYXNlQnVmZmVyKCk7Ci0JCQlic1RpdGxlLlJlbGVhc2VCdWZmZXIoKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KKyAgRlhfQk9PTCBGRklfSXNJTlNFUlRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSBjb25zdCB7IHJldHVybiBGQUxTRTsgfQogCi0JaW50IEpTX2FwcFJlc3BvbnNlKEZYX0xQQ1dTVFIgUXVlc3Rpb24sIEZYX0xQQ1dTVFIgVGl0bGUsIEZYX0xQQ1dTVFIgRGVmYXVsdCwgRlhfTFBDV1NUUiBjTGFiZWwsIEZQREZfQk9PTCBiUGFzc3dvcmQsIHZvaWQqIHJlc3BvbnNlLCBpbnQgbGVuZ3RoKQotCXsKLQkJaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybSAmJiBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5hcHBfcmVzcG9uc2UpCi0JCXsKLQkJCUNGWF9CeXRlU3RyaW5nIGJzUXVlc3Rpb24gPSBDRlhfV2lkZVN0cmluZyhRdWVzdGlvbikuVVRGMTZMRV9FbmNvZGUoKTsKLQkJCUNGWF9CeXRlU3RyaW5nIGJzVGl0bGUgPSBDRlhfV2lkZVN0cmluZyhUaXRsZSkuVVRGMTZMRV9FbmNvZGUoKTsKLQkJCUNGWF9CeXRlU3RyaW5nIGJzRGVmYXVsdCA9IENGWF9XaWRlU3RyaW5nKERlZmF1bHQpLlVURjE2TEVfRW5jb2RlKCk7Ci0JCQlDRlhfQnl0ZVN0cmluZyBic0xhYmVsID0gQ0ZYX1dpZGVTdHJpbmcoY0xhYmVsKS5VVEYxNkxFX0VuY29kZSgpOwotCQkJRlBERl9XSURFU1RSSU5HIHBRdWVzdGlvbiA9IChGUERGX1dJREVTVFJJTkcpYnNRdWVzdGlvbi5HZXRCdWZmZXIoYnNRdWVzdGlvbi5HZXRMZW5ndGgoKSk7Ci0JCQlGUERGX1dJREVTVFJJTkcgcFRpdGxlID0gKEZQREZfV0lERVNUUklORylic1RpdGxlLkdldEJ1ZmZlcihic1RpdGxlLkdldExlbmd0aCgpKTsKLQkJCUZQREZfV0lERVNUUklORyBwRGVmYXVsdCA9IChGUERGX1dJREVTVFJJTkcpYnNEZWZhdWx0LkdldEJ1ZmZlcihic0RlZmF1bHQuR2V0TGVuZ3RoKCkpOwotCQkJRlBERl9XSURFU1RSSU5HIHBMYWJlbCA9IChGUERGX1dJREVTVFJJTkcpYnNMYWJlbC5HZXRCdWZmZXIoYnNMYWJlbC5HZXRMZW5ndGgoKSk7Ci0JCQlpbnQgcmV0ID0gbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+YXBwX3Jlc3BvbnNlKG1fcEluZm8tPm1fcEpzUGxhdGZvcm0sIHBRdWVzdGlvbiwgcFRpdGxlLAotCQkJCXBEZWZhdWx0LCBwTGFiZWwsIGJQYXNzd29yZCwgcmVzcG9uc2UsIGxlbmd0aCk7Ci0JCQlic1F1ZXN0aW9uLlJlbGVhc2VCdWZmZXIoKTsKLQkJCWJzVGl0bGUuUmVsZWFzZUJ1ZmZlcigpOwotCQkJYnNEZWZhdWx0LlJlbGVhc2VCdWZmZXIoKTsKLQkJCWJzTGFiZWwuUmVsZWFzZUJ1ZmZlcigpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQorICBpbnQgSlNfYXBwQWxlcnQoY29uc3QgRlhfV0NIQVIqIE1zZywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBUaXRsZSwKKyAgICAgICAgICAgICAgICAgIEZYX1VJTlQgVHlwZSwKKyAgICAgICAgICAgICAgICAgIEZYX1VJTlQgSWNvbik7CisgIGludCBKU19hcHBSZXNwb25zZShjb25zdCBGWF9XQ0hBUiogUXVlc3Rpb24sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogVGl0bGUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBjTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wgYlBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCogcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKTsKIAotCXZvaWQgSlNfYXBwQmVlcChpbnQgblR5cGUpCi0JewotCQlpZihtX3BJbmZvICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+YXBwX2JlZXApCi0JCXsKLQkJCW1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPmFwcF9iZWVwKG1fcEluZm8tPm1fcEpzUGxhdGZvcm0sIG5UeXBlKTsKLQkJfQotCX0KKyAgdm9pZCBKU19hcHBCZWVwKGludCBuVHlwZSkgeworICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+YXBwX2JlZXApCisgICAgICBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5hcHBfYmVlcChtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLCBuVHlwZSk7CisgIH0KIAotCUNGWF9XaWRlU3RyaW5nIEpTX2ZpZWxkQnJvd3NlKCkKLQl7Ci0JCWlmIChtX3BJbmZvICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+RmllbGRfYnJvd3NlKQotCQl7Ci0JCQlpbnQgblJlcXVpcmVkTGVuID0gbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+RmllbGRfYnJvd3NlKG1fcEluZm8tPm1fcEpzUGxhdGZvcm0sIE5VTEwsIDApOwotCQkJaWYgKG5SZXF1aXJlZExlbiA8PSAwKQotCQkJCXJldHVybiBMIiI7CisgIENGWF9XaWRlU3RyaW5nIEpTX2ZpZWxkQnJvd3NlKCk7CisgIENGWF9XaWRlU3RyaW5nIEpTX2RvY0dldEZpbGVQYXRoKCk7CiAKLQkJCWNoYXIqIHBidWZmID0gbmV3IGNoYXJbblJlcXVpcmVkTGVuXTsKLQkJCWlmICghcGJ1ZmYpCi0JCQkJcmV0dXJuIEwiIjsKKyAgdm9pZCBKU19kb2NTdWJtaXRGb3JtKHZvaWQqIGZvcm1EYXRhLCBpbnQgbGVuZ3RoLCBjb25zdCBGWF9XQ0hBUiogVVJMKTsKKyAgdm9pZCBKU19kb2NtYWlsRm9ybSh2b2lkKiBtYWlsRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiVUksCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIFRvLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBTdWJqZWN0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBDQywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogQkNDLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBNc2cpOwogCi0JCQltZW1zZXQocGJ1ZmYsIDAsIG5SZXF1aXJlZExlbik7Ci0JCQlpbnQgbkFjdHVhbExlbiA9IG1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPkZpZWxkX2Jyb3dzZShtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLCBwYnVmZiwgblJlcXVpcmVkTGVuKTsKLQkJCWlmIChuQWN0dWFsTGVuIDw9IDAgfHwgbkFjdHVhbExlbiA+IG5SZXF1aXJlZExlbikKLQkJCXsKLQkJCQlkZWxldGVbXSBwYnVmZjsKLQkJCQlyZXR1cm4gTCIiOwotCQkJfQotCQkJQ0ZYX0J5dGVTdHJpbmcgYnNSZXQgPSBDRlhfQnl0ZVN0cmluZyhwYnVmZiwgbkFjdHVhbExlbik7Ci0JCQlDRlhfV2lkZVN0cmluZyB3c1JldCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoYnNSZXQpOwotCQkJZGVsZXRlW10gcGJ1ZmY7Ci0JCQlyZXR1cm4gd3NSZXQ7Ci0JCX0KLQkJcmV0dXJuIEwiIjsKLQl9CisgIHZvaWQgSlNfZG9jcHJpbnQoRlBERl9CT09MIGJVSSwKKyAgICAgICAgICAgICAgICAgICBpbnQgblN0YXJ0LAorICAgICAgICAgICAgICAgICAgIGludCBuRW5kLAorICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiU2lsZW50LAorICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiU2hyaW5rVG9GaXQsCisgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIGJQcmludEFzSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIGJSZXZlcnNlLAorICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiQW5ub3RhdGlvbnMpIHsKKyAgICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPkRvY19wcmludCkKKyAgICAgIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPkRvY19wcmludChtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLCBiVUksIG5TdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuRW5kLCBiU2lsZW50LCBiU2hyaW5rVG9GaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlByaW50QXNJbWFnZSwgYlJldmVyc2UsIGJBbm5vdGF0aW9ucyk7CisgIH0KIAotCUNGWF9XaWRlU3RyaW5nIEpTX2RvY0dldEZpbGVQYXRoKCkKLQl7Ci0JCWlmIChtX3BJbmZvICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+RG9jX2dldEZpbGVQYXRoKQotCQl7Ci0JCQlpbnQgblJlcXVpcmVkTGVuID0gbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+RG9jX2dldEZpbGVQYXRoKG1fcEluZm8tPm1fcEpzUGxhdGZvcm0sIE5VTEwsIDApOwotCQkJaWYgKG5SZXF1aXJlZExlbiA8PSAwKQotCQkJCXJldHVybiBMIiI7CisgIHZvaWQgSlNfZG9jZ290b1BhZ2UoaW50IG5QYWdlTnVtKSB7CisgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybSAmJgorICAgICAgICBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5Eb2NfZ290b1BhZ2UpCisgICAgICBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5Eb2NfZ290b1BhZ2UobV9wSW5mby0+bV9wSnNQbGF0Zm9ybSwgblBhZ2VOdW0pOworICB9CiAKLQkJCWNoYXIqIHBidWZmID0gbmV3IGNoYXJbblJlcXVpcmVkTGVuXTsKLQkJCWlmICghcGJ1ZmYpCi0JCQkJcmV0dXJuIEwiIjsKKyAgRlBERl9QQUdFIEZGSV9HZXRQYWdlKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIGludCBuUGFnZUluZGV4KSB7CisgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0dldFBhZ2UpCisgICAgICByZXR1cm4gbV9wSW5mby0+RkZJX0dldFBhZ2UobV9wSW5mbywgZG9jdW1lbnQsIG5QYWdlSW5kZXgpOworICAgIHJldHVybiBOVUxMOworICB9CiAKLQkJCW1lbXNldChwYnVmZiwgMCwgblJlcXVpcmVkTGVuKTsKLQkJCWludCBuQWN0dWFsTGVuID0gbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+RG9jX2dldEZpbGVQYXRoKG1fcEluZm8tPm1fcEpzUGxhdGZvcm0sIHBidWZmLCBuUmVxdWlyZWRMZW4pOwotCQkJaWYgKG5BY3R1YWxMZW4gPD0gMCB8fCBuQWN0dWFsTGVuID4gblJlcXVpcmVkTGVuKQotCQkJewotCQkJCWRlbGV0ZVtdIHBidWZmOwotCQkJCXJldHVybiBMIiI7Ci0JCQl9Ci0JCQlDRlhfQnl0ZVN0cmluZyBic1JldCA9IENGWF9CeXRlU3RyaW5nKHBidWZmLCBuQWN0dWFsTGVuKTsKLQkJCUNGWF9XaWRlU3RyaW5nIHdzUmV0ID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChic1JldCk7Ci0JCQlkZWxldGVbXSBwYnVmZjsKLQkJCXJldHVybiB3c1JldDsKLQkJfQotCQlyZXR1cm4gTCIiOwotCX0KKyAgRlBERl9QQUdFIEZGSV9HZXRDdXJyZW50UGFnZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50KSB7CisgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0dldEN1cnJlbnRQYWdlKQorICAgICAgcmV0dXJuIG1fcEluZm8tPkZGSV9HZXRDdXJyZW50UGFnZShtX3BJbmZvLCBkb2N1bWVudCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KIAotCXZvaWQgSlNfZG9jU3VibWl0Rm9ybSh2b2lkKiBmb3JtRGF0YSwgaW50IGxlbmd0aCwgRlhfTFBDV1NUUiBVUkwpCi0JewotCQlpZihtX3BJbmZvICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+RG9jX3N1Ym1pdEZvcm0pCi0JCXsKLQkJCUNGWF9CeXRlU3RyaW5nIGJzRGVzdGluYXRpb24gPSBDRlhfV2lkZVN0cmluZyhVUkwpLlVURjE2TEVfRW5jb2RlKCk7Ci0JCQlGUERGX1dJREVTVFJJTkcgcERlc3RpbmF0aW9uID0gKEZQREZfV0lERVNUUklORylic0Rlc3RpbmF0aW9uLkdldEJ1ZmZlcihic0Rlc3RpbmF0aW9uLkdldExlbmd0aCgpKTsKLQkJCW1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPkRvY19zdWJtaXRGb3JtKG1fcEluZm8tPm1fcEpzUGxhdGZvcm0sIGZvcm1EYXRhLCBsZW5ndGgsIHBEZXN0aW5hdGlvbik7Ci0JCQlic0Rlc3RpbmF0aW9uLlJlbGVhc2VCdWZmZXIoKTsKLQkJfQotCX0KKyAgaW50IEZGSV9HZXRSb3RhdGlvbihGUERGX1BBR0UgcGFnZSkgeworICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9HZXRSb3RhdGlvbikKKyAgICAgIHJldHVybiBtX3BJbmZvLT5GRklfR2V0Um90YXRpb24obV9wSW5mbywgcGFnZSk7CisgICAgcmV0dXJuIDA7CisgIH0KIAotCXZvaWQgSlNfZG9jbWFpbEZvcm0odm9pZCogbWFpbERhdGEsIGludCBsZW5ndGgsIEZQREZfQk9PTCBiVUksRlhfTFBDV1NUUiBUbywgRlhfTFBDV1NUUiBTdWJqZWN0LCBGWF9MUENXU1RSIENDLCBGWF9MUENXU1RSIEJDQywgRlhfTFBDV1NUUiBNc2cpCi0JewotCQlpZihtX3BJbmZvICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+RG9jX21haWwpCi0JCXsKLQkJCUNGWF9CeXRlU3RyaW5nIGJzVG8gPSBDRlhfV2lkZVN0cmluZyhUbykuVVRGMTZMRV9FbmNvZGUoKTsKLQkJCUNGWF9CeXRlU3RyaW5nIGJzQ0MgPSBDRlhfV2lkZVN0cmluZyhTdWJqZWN0KS5VVEYxNkxFX0VuY29kZSgpOwotCQkJQ0ZYX0J5dGVTdHJpbmcgYnNCY2MgPSBDRlhfV2lkZVN0cmluZyhCQ0MpLlVURjE2TEVfRW5jb2RlKCk7Ci0JCQlDRlhfQnl0ZVN0cmluZyBic1N1YmplY3QgPSBDRlhfV2lkZVN0cmluZyhTdWJqZWN0KS5VVEYxNkxFX0VuY29kZSgpOwotCQkJQ0ZYX0J5dGVTdHJpbmcgYnNNc2cgPSBDRlhfV2lkZVN0cmluZyhNc2cpLlVURjE2TEVfRW5jb2RlKCk7Ci0JCQlGUERGX1dJREVTVFJJTkcgcFRvID0gKEZQREZfV0lERVNUUklORylic1RvLkdldEJ1ZmZlcihic1RvLkdldExlbmd0aCgpKTsKLQkJCUZQREZfV0lERVNUUklORyBwQ0MgPSAoRlBERl9XSURFU1RSSU5HKWJzQ0MuR2V0QnVmZmVyKGJzQ0MuR2V0TGVuZ3RoKCkpOwotCQkJRlBERl9XSURFU1RSSU5HIHBCY2MgPSAoRlBERl9XSURFU1RSSU5HKWJzQmNjLkdldEJ1ZmZlcihic0JjYy5HZXRMZW5ndGgoKSk7Ci0JCQlGUERGX1dJREVTVFJJTkcgcFN1YmplY3QgPSAoRlBERl9XSURFU1RSSU5HKWJzU3ViamVjdC5HZXRCdWZmZXIoYnNTdWJqZWN0LkdldExlbmd0aCgpKTsKLQkJCUZQREZfV0lERVNUUklORyBwTXNnID0gKEZQREZfV0lERVNUUklORylic01zZy5HZXRCdWZmZXIoYnNNc2cuR2V0TGVuZ3RoKCkpOwotCQkJbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+RG9jX21haWwobV9wSW5mby0+bV9wSnNQbGF0Zm9ybSwgbWFpbERhdGEsIGxlbmd0aCwgYlVJLCBwVG8sIHBTdWJqZWN0LAotCQkJCXBDQywgcEJjYywgcE1zZyk7Ci0JCQlic1RvLlJlbGVhc2VCdWZmZXIoKTsKLQkJCWJzQ0MuUmVsZWFzZUJ1ZmZlcigpOwotCQkJYnNCY2MuUmVsZWFzZUJ1ZmZlcigpOwotCQkJYnNTdWJqZWN0LlJlbGVhc2VCdWZmZXIoKTsKLQkJCWJzTXNnLlJlbGVhc2VCdWZmZXIoKTsKLQkJfQotCX0KKyAgdm9pZCBGRklfRXhlY3V0ZU5hbWVkQWN0aW9uKGNvbnN0IEZYX0NIQVIqIG5hbWVkQWN0aW9uKSB7CisgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0V4ZWN1dGVOYW1lZEFjdGlvbikKKyAgICAgIG1fcEluZm8tPkZGSV9FeGVjdXRlTmFtZWRBY3Rpb24obV9wSW5mbywgbmFtZWRBY3Rpb24pOworICB9CiAKLQl2b2lkIEpTX2RvY3ByaW50KEZQREZfQk9PTCBiVUkgLCBpbnQgblN0YXJ0LCBpbnQgbkVuZCwgRlBERl9CT09MIGJTaWxlbnQgLEZQREZfQk9PTCBiU2hyaW5rVG9GaXQsRlBERl9CT09MIGJQcmludEFzSW1hZ2UgLEZQREZfQk9PTCBiUmV2ZXJzZSAsRlBERl9CT09MIGJBbm5vdGF0aW9ucykKLQl7Ci0JCWlmKG1fcEluZm8gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybSAmJiBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5Eb2NfcHJpbnQpCi0JCXsKLQkJCW1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPkRvY19wcmludChtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLCBiVUksIG5TdGFydCwgbkVuZCwgYlNpbGVudCwgYlNocmlua1RvRml0LCBiUHJpbnRBc0ltYWdlLCBiUmV2ZXJzZSwgYkFubm90YXRpb25zKTsKLQkJfQotCX0KLQl2b2lkIEpTX2RvY2dvdG9QYWdlKGludCBuUGFnZU51bSkKLQl7Ci0JCWlmKG1fcEluZm8gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybSAmJiBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5Eb2NfZ290b1BhZ2UpCi0JCXsKLQkJCW1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPkRvY19nb3RvUGFnZShtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLCBuUGFnZU51bSk7Ci0JCX0KLQl9CisgIHZvaWQgRkZJX09uU2V0RmllbGRJbnB1dEZvY3VzKHZvaWQqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgZm9jdXNUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RXT1JEIG5UZXh0TGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGb2N1cykgeworICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9TZXRUZXh0RmllbGRGb2N1cykKKyAgICAgIG1fcEluZm8tPkZGSV9TZXRUZXh0RmllbGRGb2N1cyhtX3BJbmZvLCBmb2N1c1RleHQsIG5UZXh0TGVuLCBiRm9jdXMpOworICB9CiAKLQlGUERGX1BBR0UJRkZJX0dldFBhZ2UoRlBERl9ET0NVTUVOVCBkb2N1bWVudCxpbnQgblBhZ2VJbmRleCkKLQl7Ci0JCWlmKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0dldFBhZ2UpCi0JCXsKLQkJCXJldHVybiBtX3BJbmZvLT5GRklfR2V0UGFnZShtX3BJbmZvLCBkb2N1bWVudCwgblBhZ2VJbmRleCk7Ci0JCX0KLQkJcmV0dXJuIE5VTEw7Ci0JfQorICB2b2lkIEZGSV9Eb1VSSUFjdGlvbihjb25zdCBGWF9DSEFSKiBic1VSSSkgeworICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9Eb1VSSUFjdGlvbikKKyAgICAgIG1fcEluZm8tPkZGSV9Eb1VSSUFjdGlvbihtX3BJbmZvLCBic1VSSSk7CisgIH0KIAotCUZQREZfUEFHRSBGRklfR2V0Q3VycmVudFBhZ2UoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkKLQl7Ci0JCWlmKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0dldEN1cnJlbnRQYWdlKQotCQl7Ci0JCQlyZXR1cm4gbV9wSW5mby0+RkZJX0dldEN1cnJlbnRQYWdlKG1fcEluZm8sIGRvY3VtZW50KTsKLQkJfQotCQlyZXR1cm4gTlVMTDsKLQl9CisgIHZvaWQgRkZJX0RvR29Ub0FjdGlvbihpbnQgblBhZ2VJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB6b29tTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBmUG9zQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZU9mQXJyYXkpIHsKKyAgICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfRG9Hb1RvQWN0aW9uKQorICAgICAgbV9wSW5mby0+RkZJX0RvR29Ub0FjdGlvbihtX3BJbmZvLCBuUGFnZUluZGV4LCB6b29tTW9kZSwgZlBvc0FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplT2ZBcnJheSk7CisgIH0KIAotCWludCAJRkZJX0dldFJvdGF0aW9uKEZQREZfUEFHRSBwYWdlKQotCXsKLQkJaWYobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfR2V0Um90YXRpb24pCi0JCXsKLQkJCXJldHVybiBtX3BJbmZvLT5GRklfR2V0Um90YXRpb24obV9wSW5mbywgcGFnZSk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCXZvaWQJRkZJX0V4ZWN1dGVOYW1lZEFjdGlvbihGWF9MUENTVFIgbmFtZWRBY3Rpb24pCi0JewotCQlpZihtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9FeGVjdXRlTmFtZWRBY3Rpb24pCi0JCXsKLQkJCW1fcEluZm8tPkZGSV9FeGVjdXRlTmFtZWRBY3Rpb24obV9wSW5mbywgbmFtZWRBY3Rpb24pOwotCQl9Ci0JfQotCXZvaWQJRkZJX09uU2V0RmllbGRJbnB1dEZvY3VzKHZvaWQqIGZpZWxkLEZQREZfV0lERVNUUklORyBmb2N1c1RleHQsIEZQREZfRFdPUkQgblRleHRMZW4sIEZYX0JPT0wgYkZvY3VzKQotCXsKLQkJaWYobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfU2V0VGV4dEZpZWxkRm9jdXMpCi0JCXsKLQkJCW1fcEluZm8tPkZGSV9TZXRUZXh0RmllbGRGb2N1cyhtX3BJbmZvLCBmb2N1c1RleHQsIG5UZXh0TGVuLCBiRm9jdXMpOwotCQl9Ci0JfQorI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIHZvaWQgRkZJX0Rpc3BsYXlDYXJldChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiVmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBib3R0b20pIHsKKyAgICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfRGlzcGxheUNhcmV0KQorICAgICAgbV9wSW5mby0+RkZJX0Rpc3BsYXlDYXJldChtX3BJbmZvLCBwYWdlLCBiVmlzaWJsZSwgbGVmdCwgdG9wLCByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tKTsKKyAgfQogCi0Jdm9pZAlGRklfRG9VUklBY3Rpb24oRlhfTFBDU1RSIGJzVVJJKQotCXsKLQkJaWYobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfRG9VUklBY3Rpb24pCi0JCXsKLQkJCW1fcEluZm8tPkZGSV9Eb1VSSUFjdGlvbihtX3BJbmZvLCBic1VSSSk7Ci0JCX0KLQl9CisgIGludCBGRklfR2V0Q3VycmVudFBhZ2VJbmRleChGUERGX0RPQ1VNRU5UIGRvY3VtZW50KSB7CisgICAgaWYgKCFtX3BJbmZvIHx8ICFtX3BJbmZvLT5GRklfR2V0Q3VycmVudFBhZ2VJbmRleCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gbV9wSW5mby0+RkZJX0dldEN1cnJlbnRQYWdlSW5kZXgobV9wSW5mbywgZG9jdW1lbnQpOworICB9CiAKLQl2b2lkCUZGSV9Eb0dvVG9BY3Rpb24oaW50IG5QYWdlSW5kZXgsIGludCB6b29tTW9kZSwgZmxvYXQqIGZQb3NBcnJheSwgaW50IHNpemVPZkFycmF5KQotCXsKLQkJaWYobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfRG9Hb1RvQWN0aW9uKQotCQl7Ci0JCQltX3BJbmZvLT5GRklfRG9Hb1RvQWN0aW9uKG1fcEluZm8sIG5QYWdlSW5kZXgsIHpvb21Nb2RlLCBmUG9zQXJyYXksIHNpemVPZkFycmF5KTsKLQkJfQotCX0KKyAgdm9pZCBGRklfU2V0Q3VycmVudFBhZ2UoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgaW50IGlDdXJQYWdlKSB7CisgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX1NldEN1cnJlbnRQYWdlKQorICAgICAgbV9wSW5mby0+RkZJX1NldEN1cnJlbnRQYWdlKG1fcEluZm8sIGRvY3VtZW50LCBpQ3VyUGFnZSk7CisgIH0KIAotCUZYX0JPT0wJCQkJSXNKU0luaXRpYXRlZCgpOworICBDRlhfV2lkZVN0cmluZyBGRklfR2V0QXBwTmFtZSgpIGNvbnN0IHsgcmV0dXJuIENGWF9XaWRlU3RyaW5nKEwiQWNyb2JhdCIpOyB9CiAKLQl2b2lkCQkJCVNldEN1cnJlbnREb2MoQ1BERlNES19Eb2N1bWVudCogcEZYRG9jKSB7bV9wU0RLRG9jID0gcEZYRG9jO30KLQlDUERGU0RLX0RvY3VtZW50KglHZXRDdXJyZW50RG9jKCk7Ci0JQ1BERl9Eb2N1bWVudCoJCUdldFBERkRvY3VtZW50KCkge3JldHVybiBtX3BQREZEb2M7fQorICBDRlhfV2lkZVN0cmluZyBGRklfR2V0UGxhdGZvcm0oKSB7CisgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0dldFBsYXRmb3JtKSB7CisgICAgICBpbnQgblJlcXVpcmVkTGVuID0gbV9wSW5mby0+RkZJX0dldFBsYXRmb3JtKG1fcEluZm8sIE5VTEwsIDApOworICAgICAgaWYgKG5SZXF1aXJlZExlbiA8PSAwKQorICAgICAgICByZXR1cm4gTCIiOwogCi0JQ0ZYX0J5dGVTdHJpbmcJCUdldEFwcE5hbWUoKSB7cmV0dXJuICIiO30KKyAgICAgIGNoYXIqIHBidWZmID0gbmV3IGNoYXJbblJlcXVpcmVkTGVuXTsKKyAgICAgIG1lbXNldChwYnVmZiwgMCwgblJlcXVpcmVkTGVuKTsKKyAgICAgIGludCBuQWN0dWFsTGVuID0gbV9wSW5mby0+RkZJX0dldFBsYXRmb3JtKG1fcEluZm8sIHBidWZmLCBuUmVxdWlyZWRMZW4pOworICAgICAgaWYgKG5BY3R1YWxMZW4gPD0gMCB8fCBuQWN0dWFsTGVuID4gblJlcXVpcmVkTGVuKSB7CisgICAgICAgIGRlbGV0ZVtdIHBidWZmOworICAgICAgICByZXR1cm4gTCIiOworICAgICAgfQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNSZXQgPSBDRlhfQnl0ZVN0cmluZyhwYnVmZiwgbkFjdHVhbExlbik7CisgICAgICBDRlhfV2lkZVN0cmluZyB3c1JldCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGMTZMRSgKKyAgICAgICAgICAodW5zaWduZWQgc2hvcnQqKWJzUmV0LkdldEJ1ZmZlcihic1JldC5HZXRMZW5ndGgoKSksCisgICAgICAgICAgYnNSZXQuR2V0TGVuZ3RoKCkgLyBzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKKyAgICAgIGRlbGV0ZVtdIHBidWZmOworICAgICAgcmV0dXJuIHdzUmV0OworICAgIH0KKyAgICByZXR1cm4gTCIiOworICB9CiAKLQlDRkZMX0lGb3JtRmlsbGVyKglHZXRJRm9ybUZpbGxlcigpOwotCUlGWF9TeXN0ZW1IYW5kbGVyKglHZXRTeXNIYW5kbGVyKCkge3JldHVybiBtX3BTeXNIYW5kbGVyO30KKyAgdm9pZCBGRklfR290b1VSTChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NVUkwsCisgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQXBwZW5kKSB7CisgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0dvdG9VUkwpIHsKKyAgICAgIENGWF9CeXRlU3RyaW5nIGJzVG8gPSBDRlhfV2lkZVN0cmluZyh3c1VSTCkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICAgIEZQREZfV0lERVNUUklORyBwVG8gPSAoRlBERl9XSURFU1RSSU5HKWJzVG8uR2V0QnVmZmVyKHdzVVJMLkdldExlbmd0aCgpKTsKKyAgICAgIG1fcEluZm8tPkZGSV9Hb3RvVVJMKG1fcEluZm8sIGRvY3VtZW50LCBwVG8pOworICAgICAgYnNUby5SZWxlYXNlQnVmZmVyKCk7CisgICAgfQorICB9CiAKLQlDUERGU0RLX0Fubm90SGFuZGxlck1nciogR2V0QW5ub3RIYW5kbGVyTWdyKCk7Ci0JSUZYSlNfUnVudGltZSoJR2V0SlNSdW50aW1lKCk7Ci0JQ1BERlNES19BY3Rpb25IYW5kbGVyKiBHZXRBY3Rpb25IYW5kZXIoKTsKLQlGUERGX0ZPUk1GSUxMSU5GTyogR2V0Rm9ybUZpbGxJbmZvKCkge3JldHVybiBtX3BJbmZvO30KKyAgdm9pZCBGRklfR2V0VVJMKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIENGWF9XaWRlU3RyaW5nJiB3c1VSTCkgeworICAgIHdzVVJMID0gQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgfQogCi1wcml2YXRlOgotCUNQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBtX3BBbm5vdEhhbmRsZXJNZ3I7Ci0JQ1BERlNES19BY3Rpb25IYW5kbGVyKgltX3BBY3Rpb25IYW5kbGVyOwotCUlGWEpTX1J1bnRpbWUqCW1fcEpTUnVudGltZTsKLQlGUERGX0ZPUk1GSUxMSU5GTyoJbV9wSW5mbzsKLQlDUERGU0RLX0RvY3VtZW50KiBtX3BTREtEb2M7Ci0JQ1BERl9Eb2N1bWVudCogbV9wUERGRG9jOworICB2b2lkIEZGSV9BZGREb1JlY29yZChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX1dJREdFVCBoV2lkZ2V0KSB7fQorICB2b2lkIEZGSV9QYWdlRXZlbnQoRlBERl9QQUdFIHBhZ2UsIEZQREZfRFdPUkQgZmxhZykge30KIAotCUNGRkxfSUZvcm1GaWxsZXIqIG1fcElGb3JtRmlsbGVyOwotCUlGWF9TeXN0ZW1IYW5kbGVyKiBtX3BTeXNIYW5kbGVyOworICB2b2lkIEZGSV9HZXRQYWdlVmlld1JlY3QoRlBERl9QQUdFIHBhZ2UsIEZTX1JFQ1RGJiBkc3RSZWN0KSB7CisgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0dldFBhZ2VWaWV3UmVjdCkgeworICAgICAgZG91YmxlIGxlZnQ7CisgICAgICBkb3VibGUgdG9wOworICAgICAgZG91YmxlIHJpZ2h0OworICAgICAgZG91YmxlIGJvdHRvbTsKKyAgICAgIG1fcEluZm8tPkZGSV9HZXRQYWdlVmlld1JlY3QobV9wSW5mbywgcGFnZSwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSk7CiAKLXB1YmxpYzoKLQlDSlNfUnVudGltZUZhY3RvcnkqICBtX3BKU1J1bnRpbWVGYWN0b3J5OworICAgICAgZHN0UmVjdC5sZWZ0ID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGxlZnQpOworICAgICAgZHN0UmVjdC50b3AgPSBzdGF0aWNfY2FzdDxmbG9hdD4odG9wIDwgYm90dG9tID8gYm90dG9tIDogdG9wKTsKKyAgICAgIGRzdFJlY3QuYm90dG9tID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHRvcCA8IGJvdHRvbSA/IHRvcCA6IGJvdHRvbSk7CisgICAgICBkc3RSZWN0LnJpZ2h0ID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHJpZ2h0KTsKKyAgICB9CisgIH0KKworICBGWF9CT09MIEZGSV9Qb3B1cE1lbnUoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREdFVCBoV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lbnVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RiBwdFBvcHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiogcFJlY3RFeGNsdWRlKSB7CisgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX1BvcHVwTWVudSkKKyAgICAgIHJldHVybiBtX3BJbmZvLT5GRklfUG9wdXBNZW51KG1fcEluZm8sIHBhZ2UsIGhXaWRnZXQsIG1lbnVGbGFnLCBwdFBvcHVwLngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdFBvcHVwLnkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHZvaWQgRkZJX0FsZXJ0KEZQREZfV0lERVNUUklORyBNc2csCisgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBUaXRsZSwKKyAgICAgICAgICAgICAgICAgaW50IFR5cGUsCisgICAgICAgICAgICAgICAgIGludCBJY29uKSB7CisgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybSAmJiBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5hcHBfYWxlcnQpCisgICAgICBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5hcHBfYWxlcnQobV9wSW5mby0+bV9wSnNQbGF0Zm9ybSwgTXNnLCBUaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlLCBJY29uKTsKKyAgfQorCisgIHZvaWQgRkZJX0VtYWlsVG8oRlBERl9GSUxFSEFORExFUiogZmlsZUhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHBUbywKKyAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgcFN1YmplY3QsCisgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHBDQywKKyAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgcEJjYywKKyAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgcE1zZykgeworICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9FbWFpbFRvKQorICAgICAgbV9wSW5mby0+RkZJX0VtYWlsVG8obV9wSW5mbywgZmlsZUhhbmRsZXIsIHBUbywgcFN1YmplY3QsIHBDQywgcEJjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNc2cpOworICB9CisKKyAgdm9pZCBGRklfVXBsb2FkVG8oRlBERl9GSUxFSEFORExFUiogZmlsZUhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgIGludCBmaWxlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHVwbG9hZFRvKSB7CisgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX1VwbG9hZFRvKQorICAgICAgbV9wSW5mby0+RkZJX1VwbG9hZFRvKG1fcEluZm8sIGZpbGVIYW5kbGVyLCBmaWxlRmxhZywgdXBsb2FkVG8pOworICB9CisKKyAgRlBERl9GSUxFSEFORExFUiogRkZJX09wZW5GaWxlKGludCBmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyB3c1VSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1vZGUpIHsKKyAgICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfT3BlbkZpbGUpCisgICAgICByZXR1cm4gbV9wSW5mby0+RkZJX09wZW5GaWxlKG1fcEluZm8sIGZpbGVUeXBlLCB3c1VSTCwgbW9kZSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBDRlhfV2lkZVN0cmluZyBGRklfR2V0RmlsZVBhdGgoRlBERl9GSUxFSEFORExFUiogcEZpbGVIYW5kbGVyKSBjb25zdCB7CisgICAgcmV0dXJuIEwiIjsKKyAgfQorCisgIGludCBGRklfR2V0RG9jdW1lbnRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKyAgaW50IEZGSV9HZXRDdXJEb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKworICBJRlhfRmlsZVJlYWQqIEZGSV9Eb3dubG9hZEZyb21VUkwoY29uc3QgRlhfV0NIQVIqIHVybCkgeworICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9Eb3dubG9hZEZyb21VUkwpIHsKKyAgICAgIENGWF9CeXRlU3RyaW5nIGJzdHJVUkwgPSBDRlhfV2lkZVN0cmluZyh1cmwpLlVURjE2TEVfRW5jb2RlKCk7CisgICAgICBGUERGX1dJREVTVFJJTkcgd3NVUkwgPQorICAgICAgICAgIChGUERGX1dJREVTVFJJTkcpYnN0clVSTC5HZXRCdWZmZXIoYnN0clVSTC5HZXRMZW5ndGgoKSk7CisKKyAgICAgIEZQREZfTFBGSUxFSEFORExFUiBmaWxlSGFuZGxlciA9CisgICAgICAgICAgbV9wSW5mby0+RkZJX0Rvd25sb2FkRnJvbVVSTChtX3BJbmZvLCB3c1VSTCk7CisKKyAgICAgIHJldHVybiBuZXcgQ0ZQREZfRmlsZVN0cmVhbShmaWxlSGFuZGxlcik7CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9CisKKyAgQ0ZYX1dpZGVTdHJpbmcgRkZJX1Bvc3RSZXF1ZXN0VVJMKGNvbnN0IEZYX1dDSEFSKiB3c1VSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiB3c0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogd3NDb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiB3c0VuY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiB3c0hlYWRlcikgeworICAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9Qb3N0UmVxdWVzdFVSTCkgeworICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNVUkwgPSBDRlhfV2lkZVN0cmluZyh3c1VSTCkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICAgIEZQREZfV0lERVNUUklORyBVUkwgPSAoRlBERl9XSURFU1RSSU5HKWJzVVJMLkdldEJ1ZmZlcihic1VSTC5HZXRMZW5ndGgoKSk7CisKKyAgICAgIENGWF9CeXRlU3RyaW5nIGJzRGF0YSA9IENGWF9XaWRlU3RyaW5nKHdzRGF0YSkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICAgIEZQREZfV0lERVNUUklORyBkYXRhID0KKyAgICAgICAgICAoRlBERl9XSURFU1RSSU5HKWJzRGF0YS5HZXRCdWZmZXIoYnNEYXRhLkdldExlbmd0aCgpKTsKKworICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNDb250ZW50VHlwZSA9CisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcod3NDb250ZW50VHlwZSkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICAgIEZQREZfV0lERVNUUklORyBjb250ZW50VHlwZSA9CisgICAgICAgICAgKEZQREZfV0lERVNUUklORylic0NvbnRlbnRUeXBlLkdldEJ1ZmZlcihic0NvbnRlbnRUeXBlLkdldExlbmd0aCgpKTsKKworICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNFbmNvZGUgPSBDRlhfV2lkZVN0cmluZyh3c0VuY29kZSkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICAgIEZQREZfV0lERVNUUklORyBlbmNvZGUgPQorICAgICAgICAgIChGUERGX1dJREVTVFJJTkcpYnNFbmNvZGUuR2V0QnVmZmVyKGJzRW5jb2RlLkdldExlbmd0aCgpKTsKKworICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNIZWFkZXIgPSBDRlhfV2lkZVN0cmluZyh3c0hlYWRlcikuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICAgIEZQREZfV0lERVNUUklORyBoZWFkZXIgPQorICAgICAgICAgIChGUERGX1dJREVTVFJJTkcpYnNIZWFkZXIuR2V0QnVmZmVyKGJzSGVhZGVyLkdldExlbmd0aCgpKTsKKworICAgICAgRlBERl9CU1RSIHJlc3BvbmU7CisgICAgICBGUERGX0JTdHJfSW5pdCgmcmVzcG9uZSk7CisgICAgICBtX3BJbmZvLT5GRklfUG9zdFJlcXVlc3RVUkwobV9wSW5mbywgVVJMLCBkYXRhLCBjb250ZW50VHlwZSwgZW5jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciwgJnJlc3BvbmUpOworCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1JldCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGMTZMRSgKKyAgICAgICAgICAodW5zaWduZWQgc2hvcnQqKXJlc3BvbmUuc3RyLCByZXNwb25lLmxlbiAvIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOworICAgICAgRlBERl9CU3RyX0NsZWFyKCZyZXNwb25lKTsKKworICAgICAgcmV0dXJuIHdzUmV0OworICAgIH0KKyAgICByZXR1cm4gTCIiOworICB9CisKKyAgRlBERl9CT09MIEZGSV9QdXRSZXF1ZXN0VVJMKGNvbnN0IEZYX1dDSEFSKiB3c1VSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiB3c0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogd3NFbmNvZGUpIHsKKyAgICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfUHV0UmVxdWVzdFVSTCkgeworICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNVUkwgPSBDRlhfV2lkZVN0cmluZyh3c1VSTCkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICAgIEZQREZfV0lERVNUUklORyBVUkwgPSAoRlBERl9XSURFU1RSSU5HKWJzVVJMLkdldEJ1ZmZlcihic1VSTC5HZXRMZW5ndGgoKSk7CisKKyAgICAgIENGWF9CeXRlU3RyaW5nIGJzRGF0YSA9IENGWF9XaWRlU3RyaW5nKHdzRGF0YSkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICAgIEZQREZfV0lERVNUUklORyBkYXRhID0KKyAgICAgICAgICAoRlBERl9XSURFU1RSSU5HKWJzRGF0YS5HZXRCdWZmZXIoYnNEYXRhLkdldExlbmd0aCgpKTsKKworICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNFbmNvZGUgPSBDRlhfV2lkZVN0cmluZyh3c0VuY29kZSkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICAgIEZQREZfV0lERVNUUklORyBlbmNvZGUgPQorICAgICAgICAgIChGUERGX1dJREVTVFJJTkcpYnNFbmNvZGUuR2V0QnVmZmVyKGJzRW5jb2RlLkdldExlbmd0aCgpKTsKKworICAgICAgcmV0dXJuIG1fcEluZm8tPkZGSV9QdXRSZXF1ZXN0VVJMKG1fcEluZm8sIFVSTCwgZGF0YSwgZW5jb2RlKTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgRlBERl9CT09MIEZGSV9TaG93RmlsZURpYWxvZyhjb25zdCBGWF9XQ0hBUiogd3NUaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogd3NGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSYgd3NQYXRoQXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk9wZW4pIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBDRlhfV2lkZVN0cmluZyBGRklfR2V0TGFuZ3VhZ2UoKSB7CisgICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0dldExhbmd1YWdlKSB7CisgICAgICBpbnQgblJlcXVpcmVkTGVuID0gbV9wSW5mby0+RkZJX0dldExhbmd1YWdlKG1fcEluZm8sIE5VTEwsIDApOworICAgICAgaWYgKG5SZXF1aXJlZExlbiA8PSAwKQorICAgICAgICByZXR1cm4gTCIiOworCisgICAgICBjaGFyKiBwYnVmZiA9IG5ldyBjaGFyW25SZXF1aXJlZExlbl07CisgICAgICBtZW1zZXQocGJ1ZmYsIDAsIG5SZXF1aXJlZExlbik7CisgICAgICBpbnQgbkFjdHVhbExlbiA9IG1fcEluZm8tPkZGSV9HZXRMYW5ndWFnZShtX3BJbmZvLCBwYnVmZiwgblJlcXVpcmVkTGVuKTsKKyAgICAgIGlmIChuQWN0dWFsTGVuIDw9IDAgfHwgbkFjdHVhbExlbiA+IG5SZXF1aXJlZExlbikgeworICAgICAgICBkZWxldGVbXSBwYnVmZjsKKyAgICAgICAgcmV0dXJuIEwiIjsKKyAgICAgIH0KKyAgICAgIENGWF9CeXRlU3RyaW5nIGJzUmV0ID0gQ0ZYX0J5dGVTdHJpbmcocGJ1ZmYsIG5BY3R1YWxMZW4pOworICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXQgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoCisgICAgICAgICAgKHVuc2lnbmVkIHNob3J0Kilic1JldC5HZXRCdWZmZXIoYnNSZXQuR2V0TGVuZ3RoKCkpLAorICAgICAgICAgIGJzUmV0LkdldExlbmd0aCgpIC8gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CisgICAgICBkZWxldGVbXSBwYnVmZjsKKyAgICAgIHJldHVybiB3c1JldDsKKyAgICB9CisgICAgcmV0dXJuIEwiIjsKKyAgfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCisgIEZYX0JPT0wgSXNKU0luaXRpYXRlZCgpIGNvbnN0IHsgcmV0dXJuIG1fcEluZm8gJiYgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybTsgfQorICB2b2lkIFNldFNES0RvY3VtZW50KENQREZTREtfRG9jdW1lbnQqIHBGWERvYykgeyBtX3BTREtEb2MgPSBwRlhEb2M7IH0KKyAgQ1BERlNES19Eb2N1bWVudCogR2V0U0RLRG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BTREtEb2M7IH0KKyAgVW5kZXJseWluZ0RvY3VtZW50VHlwZSogR2V0VW5kZXJseWluZ0RvY3VtZW50KCkgY29uc3QgeworICAgIHJldHVybiBtX3BVbmRlcmx5aW5nRG9jOworICB9CisgIENGWF9CeXRlU3RyaW5nIEdldEFwcE5hbWUoKSBjb25zdCB7IHJldHVybiAiIjsgfQorICBJRlhfU3lzdGVtSGFuZGxlciogR2V0U3lzSGFuZGxlcigpIGNvbnN0IHsgcmV0dXJuIG1fcFN5c0hhbmRsZXIuZ2V0KCk7IH0KKyAgRlBERl9GT1JNRklMTElORk8qIEdldEZvcm1GaWxsSW5mbygpIGNvbnN0IHsgcmV0dXJuIG1fcEluZm87IH0KKworICBDRkZMX0lGb3JtRmlsbGVyKiBHZXRJRm9ybUZpbGxlcigpOyAgICAgICAgICAgICAvLyBDcmVhdGVzIGlmIG5vdCBwcmVzZW50LgorICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogR2V0QW5ub3RIYW5kbGVyTWdyKCk7ICAvLyBDcmVhdGVzIGlmIG5vdCBwcmVzZW50LgorICBJSlNfUnVudGltZSogR2V0SlNSdW50aW1lKCk7ICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGVzIGlmIG5vdCBwcmVzZW50LgorICBDUERGU0RLX0FjdGlvbkhhbmRsZXIqIEdldEFjdGlvbkhhbmRlcigpOyAgICAgICAvLyBDcmVhdGVzIGlmIG5vdCBwcmVzZW50LgorCisgcHJpdmF0ZToKKyAgc3RkOjp1bmlxdWVfcHRyPENQREZTREtfQW5ub3RIYW5kbGVyTWdyPiBtX3BBbm5vdEhhbmRsZXJNZ3I7CisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGU0RLX0FjdGlvbkhhbmRsZXI+IG1fcEFjdGlvbkhhbmRsZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxJSlNfUnVudGltZT4gbV9wSlNSdW50aW1lOworICBGUERGX0ZPUk1GSUxMSU5GTyogY29uc3QgbV9wSW5mbzsKKyAgQ1BERlNES19Eb2N1bWVudCogbV9wU0RLRG9jOworICBVbmRlcmx5aW5nRG9jdW1lbnRUeXBlKiBjb25zdCBtX3BVbmRlcmx5aW5nRG9jOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZGTF9JRm9ybUZpbGxlcj4gbV9wSUZvcm1GaWxsZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxJRlhfU3lzdGVtSGFuZGxlcj4gbV9wU3lzSGFuZGxlcjsKIH07CiAKK2NsYXNzIENQREZTREtfRG9jdW1lbnQgeworIHB1YmxpYzoKKyAgQ1BERlNES19Eb2N1bWVudChVbmRlcmx5aW5nRG9jdW1lbnRUeXBlKiBwRG9jLCBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52KTsKKyAgfkNQREZTREtfRG9jdW1lbnQoKTsKIAorICBDUERGU0RLX0ludGVyRm9ybSogR2V0SW50ZXJGb3JtKCk7CiAKLWNsYXNzIENQREZTREtfSW50ZXJGb3JtOwotY2xhc3MgQ1BERlNES19Eb2N1bWVudAotewotcHVibGljOgotCUNQREZTREtfRG9jdW1lbnQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudik7Ci0JfkNQREZTREtfRG9jdW1lbnQoKTsKKyAgLy8gR2V0cyB0aGUgZG9jdW1lbnQgb2JqZWN0IGZvciB0aGUgbmV4dCBsYXllciBkb3duOyBmb3IgbWFzdGVyIHRoaXMgaXMKKyAgLy8gYSBDUERGX0RvY3VtZW50LCBidXQgZm9yIFhGQSBpdCBpcyBhIENQREZYRkFfRG9jdW1lbnQuCisgIFVuZGVybHlpbmdEb2N1bWVudFR5cGUqIEdldFVuZGVybHlpbmdEb2N1bWVudCgpIGNvbnN0IHsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICAgIHJldHVybiBHZXRYRkFEb2N1bWVudCgpOworI2Vsc2UgICAvLyBQREZfRU5BQkxFX1hGQQorICAgIHJldHVybiBHZXRQREZEb2N1bWVudCgpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICB9CiAKLQlDUERGU0RLX0ludGVyRm9ybSoJCUdldEludGVyRm9ybSgpIDsKLQlDUERGX0RvY3VtZW50KgkJCUdldERvY3VtZW50KCkge3JldHVybiBtX3BEb2M7fQorICAvLyBHZXRzIHRoZSBDUERGX0RvY3VtZW50LCBlaXRoZXIgZGlyZWN0bHkgaW4gbWFzdGVyLCBvciBmcm9tIHRoZQorICAvLyBDUERGWEZBX0RvY3VtZW50IGZvciBYRkEuCisgIENQREZfRG9jdW1lbnQqIEdldFBERkRvY3VtZW50KCkgY29uc3QgeworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgICAgcmV0dXJuIG1fcERvYyA/IG1fcERvYy0+R2V0UERGRG9jKCkgOiBudWxscHRyOworI2Vsc2UgICAvLyBQREZfRU5BQkxFX1hGQQorICAgIHJldHVybiBtX3BEb2M7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisgIH0KIAotCXZvaWQJCQkJCUluaXRQYWdlVmlldygpOwotCXZvaWQJCQkJCUFkZFBhZ2VWaWV3KENQREZfUGFnZSogcFBERlBhZ2UsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7Ci0JQ1BERlNES19QYWdlVmlldyoJCUdldFBhZ2VWaWV3KENQREZfUGFnZSogcFBERlBhZ2UsIEZYX0JPT0wgUmVOZXcgPSBUUlVFKTsKLQlDUERGU0RLX1BhZ2VWaWV3KgkJR2V0UGFnZVZpZXcoaW50IG5JbmRleCk7Ci0JQ1BERlNES19QYWdlVmlldyoJCUdldEN1cnJlbnRWaWV3KCk7Ci0Jdm9pZAkJCQkJUmVNb3ZlUGFnZVZpZXcoQ1BERl9QYWdlKiBwUERGUGFnZSk7Ci0Jdm9pZAkJCQkJVXBkYXRlQWxsVmlld3MoQ1BERlNES19QYWdlVmlldyogcFNlbmRlciwgQ1BERlNES19Bbm5vdCogcEFubm90KTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICAvLyBHZXRzIHRoZSBYRkEgZG9jdW1lbnQgZGlyZWN0bHkgKFhGQS1vbmx5KS4KKyAgQ1BERlhGQV9Eb2N1bWVudCogR2V0WEZBRG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BEb2M7IH0KIAotCUNQREZTREtfQW5ub3QqCQkJR2V0Rm9jdXNBbm5vdCgpOworICBpbnQgR2V0UGFnZVZpZXdDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fcGFnZU1hcC5zaXplKCk7IH0KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAotCUlGWEpTX1J1bnRpbWUgKgkJCUdldEpzUnVudGltZSgpOworICBDUERGU0RLX1BhZ2VWaWV3KiBHZXRQYWdlVmlldyhVbmRlcmx5aW5nUGFnZVR5cGUqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIFJlTmV3ID0gVFJVRSk7CisgIENQREZTREtfUGFnZVZpZXcqIEdldFBhZ2VWaWV3KGludCBuSW5kZXgpOworICBDUERGU0RLX1BhZ2VWaWV3KiBHZXRDdXJyZW50VmlldygpOworICB2b2lkIFJlbW92ZVBhZ2VWaWV3KFVuZGVybHlpbmdQYWdlVHlwZSogcFBhZ2UpOworICB2b2lkIFVwZGF0ZUFsbFZpZXdzKENQREZTREtfUGFnZVZpZXcqIHBTZW5kZXIsIENQREZTREtfQW5ub3QqIHBBbm5vdCk7CiAKLQlGWF9CT09MCQkJCQlTZXRGb2N1c0Fubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZyA9IDApOwotCUZYX0JPT0wJCQkJCUtpbGxGb2N1c0Fubm90KEZYX1VJTlQgbkZsYWcgPSAwKTsKKyAgQ1BERlNES19Bbm5vdCogR2V0Rm9jdXNBbm5vdCgpOwogCi0JRlhfQk9PTAkJCQkJRXh0cmFjdFBhZ2VzKGNvbnN0IENGWF9Xb3JkQXJyYXkgJmFyckV4dHJhUGFnZXMsIENQREZfRG9jdW1lbnQqIHBEc3REb2MpOwotCUZYX0JPT0wJCQkJCUluc2VydFBhZ2VzKGludCBuSW5zZXJ0QXQsIGNvbnN0IENQREZfRG9jdW1lbnQqIHBTcmNEb2MsIGNvbnN0IENGWF9Xb3JkQXJyYXkgJmFyclNyY1BhZ2VzKTsKLQlGWF9CT09MCQkJCQlEZWxldGVQYWdlcyhpbnQgblN0YXJ0LCBpbnQgbkNvdW50KTsKLQlGWF9CT09MCQkJCQlSZXBsYWNlUGFnZXMoaW50IG5QYWdlLCBjb25zdCBDUERGX0RvY3VtZW50KiBwU3JjRG9jLCBjb25zdCBDRlhfV29yZEFycmF5ICZhcnJTcmNQYWdlcyk7CisgIElKU19SdW50aW1lKiBHZXRKc1J1bnRpbWUoKTsKIAotCXZvaWQJCQkJCU9uQ2xvc2VEb2N1bWVudCgpOworICBGWF9CT09MIFNldEZvY3VzQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFnID0gMCk7CisgIEZYX0JPT0wgS2lsbEZvY3VzQW5ub3QoRlhfVUlOVCBuRmxhZyA9IDApOwogCi0JaW50CQkJCQkJR2V0UGFnZUNvdW50KCkge3JldHVybiBtX3BEb2MtPkdldFBhZ2VDb3VudCgpO30KLQlGWF9CT09MCQkJCQlHZXRQZXJtaXNzaW9ucyhpbnQgbkZsYWcpOwotCUZYX0JPT0wJCQkJCUdldENoYW5nZU1hcmsoKSB7cmV0dXJuIG1fYkNoYW5nZU1hc2s7fQotCXZvaWQJCQkJCVNldENoYW5nZU1hcmsoKSB7bV9iQ2hhbmdlTWFzayA9IFRSVUU7fQotCXZvaWQJCQkJCUNsZWFyQ2hhbmdlTWFyaygpIHttX2JDaGFuZ2VNYXNrPSBGQUxTRTt9Ci0JQ0ZYX1dpZGVTdHJpbmcJCQlHZXRQYXRoKCkgOwotCUNQREZfUGFnZSoJCQkJR2V0UGFnZShpbnQgbkluZGV4KTsKLQlDUERGRG9jX0Vudmlyb25tZW50ICoJR2V0RW52KCkge3JldHVybiBtX3BFbnY7IH0KLQl2b2lkCQkJCSAgICBQcm9jSmF2YXNjcmlwdEZ1bigpOwotCUZYX0JPT0wJCQkJCVByb2NPcGVuQWN0aW9uKCk7Ci0JQ1BERl9PQ0NvbnRleHQqCQkJR2V0T0NDb250ZXh0KCk7Ci1wcml2YXRlOgotCUNGWF9NYXBQdHJUZW1wbGF0ZTxDUERGX1BhZ2UqLCBDUERGU0RLX1BhZ2VWaWV3Kj4gbV9wYWdlTWFwOwotCUNQREZfRG9jdW1lbnQqCQkJbV9wRG9jOwotCUNQREZTREtfSW50ZXJGb3JtKgkJbV9wSW50ZXJGb3JtOwotCUNQREZTREtfQW5ub3QqCQkJbV9wRm9jdXNBbm5vdDsKLQlDUERGRG9jX0Vudmlyb25tZW50ICoJbV9wRW52OwotCUNQREZfT0NDb250ZXh0ICoJCW1fcE9jY29udGVudDsKLQlGWF9CT09MCQkJCQltX2JDaGFuZ2VNYXNrOworICBGWF9CT09MIEV4dHJhY3RQYWdlcyhjb25zdCBDRlhfV29yZEFycmF5JiBhcnJFeHRyYVBhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRHN0RG9jKTsKKyAgRlhfQk9PTCBJbnNlcnRQYWdlcyhpbnQgbkluc2VydEF0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfRG9jdW1lbnQqIHBTcmNEb2MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dvcmRBcnJheSYgYXJyU3JjUGFnZXMpOworICBGWF9CT09MIFJlcGxhY2VQYWdlcyhpbnQgblBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfRG9jdW1lbnQqIHBTcmNEb2MsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Xb3JkQXJyYXkmIGFyclNyY1BhZ2VzKTsKKworICB2b2lkIE9uQ2xvc2VEb2N1bWVudCgpOworCisgIGludCBHZXRQYWdlQ291bnQoKSB7IHJldHVybiBtX3BEb2MtPkdldFBhZ2VDb3VudCgpOyB9CisgIEZYX0JPT0wgR2V0UGVybWlzc2lvbnMoaW50IG5GbGFnKTsKKyAgRlhfQk9PTCBHZXRDaGFuZ2VNYXJrKCkgeyByZXR1cm4gbV9iQ2hhbmdlTWFzazsgfQorICB2b2lkIFNldENoYW5nZU1hcmsoKSB7IG1fYkNoYW5nZU1hc2sgPSBUUlVFOyB9CisgIHZvaWQgQ2xlYXJDaGFuZ2VNYXJrKCkgeyBtX2JDaGFuZ2VNYXNrID0gRkFMU0U7IH0KKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0UGF0aCgpOworICBVbmRlcmx5aW5nUGFnZVR5cGUqIEdldFBhZ2UoaW50IG5JbmRleCk7CisgIENQREZEb2NfRW52aXJvbm1lbnQqIEdldEVudigpIHsgcmV0dXJuIG1fcEVudjsgfQorICB2b2lkIFByb2NKYXZhc2NyaXB0RnVuKCk7CisgIEZYX0JPT0wgUHJvY09wZW5BY3Rpb24oKTsKKyAgQ1BERl9PQ0NvbnRleHQqIEdldE9DQ29udGV4dCgpOworCisgcHJpdmF0ZToKKyAgc3RkOjptYXA8VW5kZXJseWluZ1BhZ2VUeXBlKiwgQ1BERlNES19QYWdlVmlldyo+IG1fcGFnZU1hcDsKKyAgVW5kZXJseWluZ0RvY3VtZW50VHlwZSogbV9wRG9jOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERlNES19JbnRlckZvcm0+IG1fcEludGVyRm9ybTsKKyAgQ1BERlNES19Bbm5vdCogbV9wRm9jdXNBbm5vdDsKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogbV9wRW52OworICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PQ0NvbnRleHQ+IG1fcE9jY29udGVudDsKKyAgRlhfQk9PTCBtX2JDaGFuZ2VNYXNrOworICBGWF9CT09MIG1fYkJlaW5nRGVzdHJveWVkOwogfTsKLWNsYXNzIENQREZTREtfUGFnZVZpZXcgRlhfRklOQUwKLXsKLXB1YmxpYzoKLQlDUERGU0RLX1BhZ2VWaWV3KENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MsQ1BERl9QYWdlKiBwYWdlKTsKLQl+Q1BERlNES19QYWdlVmlldygpOwotCXZvaWQgUGFnZVZpZXdfT25EcmF3KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykgOwotCUNQREZfQW5ub3QqCQkJCQkJR2V0UERGQW5ub3RBdFBvaW50KEZYX0ZMT0FUIHBhZ2VYLCBGWF9GTE9BVCBwYWdlWSk7Ci0JQ1BERlNES19Bbm5vdCoJCQkJCUdldEZYQW5ub3RBdFBvaW50KEZYX0ZMT0FUIHBhZ2VYLCBGWF9GTE9BVCBwYWdlWSk7Ci0JQ1BERl9Bbm5vdCoJCQkJCQlHZXRQREZXaWRnZXRBdFBvaW50KEZYX0ZMT0FUIHBhZ2VYLCBGWF9GTE9BVCBwYWdlWSk7Ci0JQ1BERlNES19Bbm5vdCoJCQkJCUdldEZYV2lkZ2V0QXRQb2ludChGWF9GTE9BVCBwYWdlWCwgRlhfRkxPQVQgcGFnZVkpOwotCUNQREZTREtfQW5ub3QqCQkJCQlHZXRGb2N1c0Fubm90KCkgOwotCXZvaWQJCQkJCQkJU2V0Rm9jdXNBbm5vdChDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QsRlhfVUlOVCBuRmxhZyA9IDApIHttX3BTREtEb2MtPlNldEZvY3VzQW5ub3QocFNES0Fubm90LCBuRmxhZyk7fQotCUZYX0JPT0wJCQkJCQkJS2lsbEZvY3VzQW5ub3QoRlhfVUlOVCBuRmxhZyA9IDApIHtyZXR1cm4gbV9wU0RLRG9jLT5LaWxsRm9jdXNBbm5vdChuRmxhZyk7fQotCUZYX0JPT0wJCQkJCQkJQW5ub3RfSGFzQXBwZWFyYW5jZShDUERGX0Fubm90KiBwQW5ub3QpOworY2xhc3MgQ1BERlNES19QYWdlVmlldyBmaW5hbCB7CisgcHVibGljOgorICBDUERGU0RLX1BhZ2VWaWV3KENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MsIFVuZGVybHlpbmdQYWdlVHlwZSogcGFnZSk7CisgIH5DUERGU0RLX1BhZ2VWaWV3KCk7CiAKLQlDUERGU0RLX0Fubm90KgkJCQkJQWRkQW5ub3QoQ1BERl9EaWN0aW9uYXJ5ICogcERpY3QpOwotCUNQREZTREtfQW5ub3QqCQkJCQlBZGRBbm5vdChGWF9MUENTVFIgbHBTdWJUeXBlLENQREZfRGljdGlvbmFyeSAqIHBEaWN0KTsKLQlDUERGU0RLX0Fubm90KgkJCQkJQWRkQW5ub3QoQ1BERl9Bbm5vdCAqIHBQREZBbm5vdCk7Ci0gICAgICAgIEZYX0JPT0wJCQkJCQlEZWxldGVBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpOwotCWludAkJCQkJCQkJQ291bnRBbm5vdHMoKTsKLQlDUERGU0RLX0Fubm90KgkJCQkJR2V0QW5ub3QoaW50IG5JbmRleCk7Ci0JQ1BERlNES19Bbm5vdCoJCQkJICAgIEdldEFubm90QnlEaWN0KENQREZfRGljdGlvbmFyeSAqIHBEaWN0KTsKLQlDUERGX1BhZ2UqCQkJCQkJR2V0UERGUGFnZSgpe3JldHVybiBtX3BhZ2U7fQotCUNQREZfRG9jdW1lbnQqCQkJCQlHZXRQREZEb2N1bWVudCgpOwotCUNQREZTREtfRG9jdW1lbnQqCQkJCUdldFNES0RvY3VtZW50KCkge3JldHVybiBtX3BTREtEb2M7fQotCUZYX0JPT0wJCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9VSU5UIG5GbGFnKTsKLQlGWF9CT09MCQkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX1VJTlQgbkZsYWcpOwotCUZYX0JPT0wJCQkJCU9uQ2hhcihpbnQgbkNoYXIsIEZYX1VJTlQgbkZsYWcpOwotCUZYX0JPT0wJCQkJCU9uS2V5RG93bihpbnQgbktleUNvZGUsIGludCBuRmxhZyk7Ci0JRlhfQk9PTAkJCQkJT25LZXlVcChpbnQgbktleUNvZGUsIGludCBuRmxhZyk7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgdm9pZCBQYWdlVmlld19PbkRyYXcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUJiBwQ2xpcCk7CisjZWxzZSAgIC8vIFBERl9FTkFCTEVfWEZBCisgIHZvaWQgUGFnZVZpZXdfT25EcmF3KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyk7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKLQlGWF9CT09MCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIGludCBuRmxhZyk7Ci0JRlhfQk9PTAkJCQkJT25Nb3VzZVdoZWVsKGRvdWJsZSBkZWx0YVgsIGRvdWJsZSBkZWx0YVksY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIGludCBuRmxhZyk7Ci0JRlhfQk9PTAkJCQkJSXNWYWxpZEFubm90KEZYX0xQVk9JRCBwKTsKLQl2b2lkCQkJCQlHZXRDdXJyZW50TWF0cml4KENQREZfTWF0cml4JiBtYXRyaXgpIHttYXRyaXggPSBtX2N1ck1hdHJpeDt9Ci0Jdm9pZAkJCQkJVXBkYXRlUmVjdHMoQ0ZYX1JlY3RBcnJheSYgcmVjdHMpOwotCXZvaWQJCQkJCQkJVXBkYXRlVmlldyhDUERGU0RLX0Fubm90KiBwQW5ub3QpOwotCUNGWF9QdHJBcnJheSoJCQkJCUdldEFubm90TGlzdCgpeyByZXR1cm4gJm1fZnhBbm5vdEFycmF5OyB9CisgIGNvbnN0IENQREZfQW5ub3QqIEdldFBERkFubm90QXRQb2ludChGWF9GTE9BVCBwYWdlWCwgRlhfRkxPQVQgcGFnZVkpOworICBDUERGU0RLX0Fubm90KiBHZXRGWEFubm90QXRQb2ludChGWF9GTE9BVCBwYWdlWCwgRlhfRkxPQVQgcGFnZVkpOworICBjb25zdCBDUERGX0Fubm90KiBHZXRQREZXaWRnZXRBdFBvaW50KEZYX0ZMT0FUIHBhZ2VYLCBGWF9GTE9BVCBwYWdlWSk7CisgIENQREZTREtfQW5ub3QqIEdldEZYV2lkZ2V0QXRQb2ludChGWF9GTE9BVCBwYWdlWCwgRlhfRkxPQVQgcGFnZVkpOworICBDUERGU0RLX0Fubm90KiBHZXRGb2N1c0Fubm90KCk7CisgIHZvaWQgU2V0Rm9jdXNBbm5vdChDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QsIEZYX1VJTlQgbkZsYWcgPSAwKSB7CisgICAgbV9wU0RLRG9jLT5TZXRGb2N1c0Fubm90KHBTREtBbm5vdCwgbkZsYWcpOworICB9CisgIEZYX0JPT0wgS2lsbEZvY3VzQW5ub3QoRlhfVUlOVCBuRmxhZyA9IDApIHsKKyAgICByZXR1cm4gbV9wU0RLRG9jLT5LaWxsRm9jdXNBbm5vdChuRmxhZyk7CisgIH0KKyAgdm9pZCBLaWxsRm9jdXNBbm5vdElmTmVlZGVkKCk7CisgIEZYX0JPT0wgQW5ub3RfSGFzQXBwZWFyYW5jZShDUERGX0Fubm90KiBwQW5ub3QpOwogCi0JaW50CQkJCQkJR2V0UGFnZUluZGV4KCk7Ci0Jdm9pZAkJCQkJCQlMb2FkRlhBbm5vdHMoKTsKKyAgQ1BERlNES19Bbm5vdCogQWRkQW5ub3QoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7CisgIENQREZTREtfQW5ub3QqIEFkZEFubm90KGNvbnN0IEZYX0NIQVIqIGxwU3ViVHlwZSwgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7CisgIENQREZTREtfQW5ub3QqIEFkZEFubm90KENQREZfQW5ub3QqIHBQREZBbm5vdCk7CiAKLSAgICAgICAgdm9pZCBTZXRWYWxpZChGWF9CT09MIGJWYWxpZCkge21fYlZhbGlkID0gYlZhbGlkO30KLSAgICAgICAgRlhfQk9PTCBJc1ZhbGlkKCkge3JldHVybiBtX2JWYWxpZDt9Ci0gICAgICAgIHZvaWQgU2V0TG9jayhGWF9CT09MIGJMb2NrZWQpIHttX2JMb2NrZWQ9IGJMb2NrZWQ7fQotICAgICAgICBGWF9CT09MIElzTG9ja2VkKCkge3JldHVybiBtX2JMb2NrZWQ7fQotICAgICAgICB2b2lkIFRha2VPdmVyUGFnZSgpIHttX2JUYWtlT3ZlclBhZ2UgPSBUUlVFO30KLXByaXZhdGU6Ci0Jdm9pZCBQYWdlVmlld19PbkhpZ2hsaWdodEZvcm1GaWVsZHMoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQpOwotICAgICAgICBDUERGX01hdHJpeCBtX2N1ck1hdHJpeDsKLQlDUERGX1BhZ2UqIG1fcGFnZTsKLQlDUERGX0Fubm90TGlzdCogbV9wQW5ub3RMaXN0OwotCS8vQ1BERlNES19Bbm5vdCogbV9wRm9jdXNBbm5vdDsKLQlDRlhfUHRyQXJyYXkgIG1fZnhBbm5vdEFycmF5OwotCUNQREZTREtfRG9jdW1lbnQqIG1fcFNES0RvYzsKLQlDUERGU0RLX1dpZGdldCogbV9DYXB0dXJlV2lkZ2V0OwotCUZYX0JPT0wgbV9iRW50ZXJXaWRnZXQ7Ci0JRlhfQk9PTCBtX2JFeGl0V2lkZ2V0OwotCUZYX0JPT0wgbV9iT25XaWRnZXQ7Ci0JRlhfQk9PTCBtX2JWYWxpZDsKLSAgICAgICAgRlhfQk9PTCBtX2JMb2NrZWQ7Ci0gICAgICAgIEZYX0JPT0wgbV9iVGFrZU92ZXJQYWdlOworICBGWF9CT09MIERlbGV0ZUFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCk7CisgIHNpemVfdCBDb3VudEFubm90cygpIGNvbnN0OworICBDUERGU0RLX0Fubm90KiBHZXRBbm5vdChzaXplX3QgbkluZGV4KTsKKyAgQ1BERlNES19Bbm5vdCogR2V0QW5ub3RCeURpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7CisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBDUERGU0RLX0Fubm90KiBBZGRBbm5vdChJWEZBX1dpZGdldCogcFBERkFubm90KTsKKyAgQ1BERlNES19Bbm5vdCogR2V0QW5ub3RCeVhGQVdpZGdldChJWEZBX1dpZGdldCogaFdpZGdldCk7CisgIENQREZYRkFfUGFnZSogR2V0UERGWEZBUGFnZSgpIHsgcmV0dXJuIG1fcGFnZTsgfQorICBDUERGX1BhZ2UqIEdldFBERlBhZ2UoKTsKKyNlbHNlCisgIENQREZfUGFnZSogR2V0UERGUGFnZSgpIHsgcmV0dXJuIG1fcGFnZTsgfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCisgIENQREZfRG9jdW1lbnQqIEdldFBERkRvY3VtZW50KCk7CisgIENQREZTREtfRG9jdW1lbnQqIEdldFNES0RvY3VtZW50KCkgeyByZXR1cm4gbV9wU0RLRG9jOyB9CisgIEZYX0JPT0wgT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfVUlOVCBuRmxhZyk7CisgIEZYX0JPT0wgT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX1VJTlQgbkZsYWcpOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIEZYX0JPT0wgT25SQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfVUlOVCBuRmxhZyk7CisgIEZYX0JPT0wgT25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX1VJTlQgbkZsYWcpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICBGWF9CT09MIE9uQ2hhcihpbnQgbkNoYXIsIEZYX1VJTlQgbkZsYWcpOworICBGWF9CT09MIE9uS2V5RG93bihpbnQgbktleUNvZGUsIGludCBuRmxhZyk7CisgIEZYX0JPT0wgT25LZXlVcChpbnQgbktleUNvZGUsIGludCBuRmxhZyk7CisKKyAgRlhfQk9PTCBPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50JiBwb2ludCwgaW50IG5GbGFnKTsKKyAgRlhfQk9PTCBPbk1vdXNlV2hlZWwoZG91YmxlIGRlbHRhWCwKKyAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRlbHRhWSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBuRmxhZyk7CisgIGJvb2wgSXNWYWxpZEFubm90KGNvbnN0IENQREZfQW5ub3QqIHApIGNvbnN0OworICB2b2lkIEdldEN1cnJlbnRNYXRyaXgoQ0ZYX01hdHJpeCYgbWF0cml4KSB7IG1hdHJpeCA9IG1fY3VyTWF0cml4OyB9CisgIHZvaWQgVXBkYXRlUmVjdHMoQ0ZYX1JlY3RBcnJheSYgcmVjdHMpOworICB2b2lkIFVwZGF0ZVZpZXcoQ1BERlNES19Bbm5vdCogcEFubm90KTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Q1BERlNES19Bbm5vdCo+JiBHZXRBbm5vdExpc3QoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fZnhBbm5vdEFycmF5OworICB9CisKKyAgaW50IEdldFBhZ2VJbmRleCgpOworICB2b2lkIExvYWRGWEFubm90cygpOworICB2b2lkIFNldFZhbGlkKEZYX0JPT0wgYlZhbGlkKSB7IG1fYlZhbGlkID0gYlZhbGlkOyB9CisgIEZYX0JPT0wgSXNWYWxpZCgpIHsgcmV0dXJuIG1fYlZhbGlkOyB9CisgIHZvaWQgU2V0TG9jayhGWF9CT09MIGJMb2NrZWQpIHsgbV9iTG9ja2VkID0gYkxvY2tlZDsgfQorICBGWF9CT09MIElzTG9ja2VkKCkgeyByZXR1cm4gbV9iTG9ja2VkOyB9CisjaWZuZGVmIFBERl9FTkFCTEVfWEZBCisgIHZvaWQgVGFrZU92ZXJQYWdlKCkgeyBtX2JUYWtlT3ZlclBhZ2UgPSBUUlVFOyB9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKKyBwcml2YXRlOgorICB2b2lkIFBhZ2VWaWV3X09uSGlnaGxpZ2h0Rm9ybUZpZWxkcyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCk7CisKKyAgQ0ZYX01hdHJpeCBtX2N1ck1hdHJpeDsKKyAgVW5kZXJseWluZ1BhZ2VUeXBlKiBtX3BhZ2U7CisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0Fubm90TGlzdD4gbV9wQW5ub3RMaXN0OworICBzdGQ6OnZlY3RvcjxDUERGU0RLX0Fubm90Kj4gbV9meEFubm90QXJyYXk7CisgIENQREZTREtfRG9jdW1lbnQqIG1fcFNES0RvYzsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBDUERGU0RLX0Fubm90KiBtX0NhcHR1cmVXaWRnZXQ7CisjZWxzZSAgLy8gUERGX0VOQUJMRV9YRkEKKyAgQ1BERlNES19XaWRnZXQqIG1fQ2FwdHVyZVdpZGdldDsKKyAgRlhfQk9PTCBtX2JUYWtlT3ZlclBhZ2U7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisgIEZYX0JPT0wgbV9iRW50ZXJXaWRnZXQ7CisgIEZYX0JPT0wgbV9iRXhpdFdpZGdldDsKKyAgRlhfQk9PTCBtX2JPbldpZGdldDsKKyAgRlhfQk9PTCBtX2JWYWxpZDsKKyAgRlhfQk9PTCBtX2JMb2NrZWQ7CiB9OwogCit0ZW1wbGF0ZSA8Y2xhc3MgVFlQRT4KK2NsYXNzIENHV19BcnJheVRlbXBsYXRlIDogcHVibGljIENGWF9BcnJheVRlbXBsYXRlPFRZUEU+IHsKKyBwdWJsaWM6CisgIENHV19BcnJheVRlbXBsYXRlKCkge30KKyAgfkNHV19BcnJheVRlbXBsYXRlKCkge30KIAotdGVtcGxhdGU8Y2xhc3MgVFlQRT4KLWNsYXNzIENHV19BcnJheVRlbXBsYXRlIDogcHVibGljIENGWF9BcnJheVRlbXBsYXRlPFRZUEU+Ci17Ci1wdWJsaWM6Ci0JQ0dXX0FycmF5VGVtcGxhdGUoKXt9Ci0JdmlydHVhbCB+Q0dXX0FycmF5VGVtcGxhdGUoKXt9CisgIHR5cGVkZWYgaW50ICgqTFBfQ09NUEFSRSkoVFlQRSBwMSwgVFlQRSBwMik7CiAKLQl0eXBlZGVmIGludCAoKkxQX0NPTVBBUkUpKFRZUEUgcDEsIFRZUEUgcDIpOworICB2b2lkIFNvcnQoTFBfQ09NUEFSRSBwQ29tcGFyZSwgRlhfQk9PTCBiQXNjZW50ID0gVFJVRSkgeworICAgIGludCBuU2l6ZSA9IHRoaXMtPkdldFNpemUoKTsKKyAgICBRdWlja1NvcnQoMCwgblNpemUgLSAxLCBiQXNjZW50LCBwQ29tcGFyZSk7CisgIH0KIAotCXZvaWQgU29ydChMUF9DT01QQVJFIHBDb21wYXJlLCBGWF9CT09MIGJBc2NlbnQgPSBUUlVFKQotCXsKLQkJaW50IG5TaXplID0gdGhpcy0+R2V0U2l6ZSgpOwotCQlRdWlja1NvcnQoMCwgblNpemUgLTEsIGJBc2NlbnQsIHBDb21wYXJlKTsKLQl9CisgcHJpdmF0ZToKKyAgdm9pZCBRdWlja1NvcnQoRlhfVUlOVCBuU3RhcnRQb3MsCisgICAgICAgICAgICAgICAgIEZYX1VJTlQgblN0b3BQb3MsCisgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFzY2VuZCwKKyAgICAgICAgICAgICAgICAgTFBfQ09NUEFSRSBwQ29tcGFyZSkgeworICAgIGlmIChuU3RhcnRQb3MgPj0gblN0b3BQb3MpCisgICAgICByZXR1cm47CiAKLXByaXZhdGU6Ci0Jdm9pZCBRdWlja1NvcnQoRlhfVUlOVCBuU3RhcnRQb3MsIEZYX1VJTlQgblN0b3BQb3MsIEZYX0JPT0wgYkFzY2VuZCwgTFBfQ09NUEFSRSBwQ29tcGFyZSkKLQl7Ci0JCWlmIChuU3RhcnRQb3MgPj0gblN0b3BQb3MpIHJldHVybjsKKyAgICBpZiAoKG5TdG9wUG9zIC0gblN0YXJ0UG9zKSA9PSAxKSB7CisgICAgICBUWVBFIFZhbHVlMSA9IHRoaXMtPkdldEF0KG5TdGFydFBvcyk7CisgICAgICBUWVBFIFZhbHVlMiA9IHRoaXMtPkdldEF0KG5TdG9wUG9zKTsKIAotCQlpZiAoKG5TdG9wUG9zIC0gblN0YXJ0UG9zKSA9PSAxKQotCQl7Ci0JCQlUWVBFIFZhbHVlMSA9IHRoaXMtPkdldEF0KG5TdGFydFBvcyk7Ci0JCQlUWVBFIFZhbHVlMiA9IHRoaXMtPkdldEF0KG5TdG9wUG9zKTsKKyAgICAgIGludCBpR3JlYXRlID0gKCpwQ29tcGFyZSkoVmFsdWUxLCBWYWx1ZTIpOworICAgICAgaWYgKChiQXNjZW5kICYmIGlHcmVhdGUgPiAwKSB8fCAoIWJBc2NlbmQgJiYgaUdyZWF0ZSA8IDApKSB7CisgICAgICAgIHRoaXMtPlNldEF0KG5TdGFydFBvcywgVmFsdWUyKTsKKyAgICAgICAgdGhpcy0+U2V0QXQoblN0b3BQb3MsIFZhbHVlMSk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQogCi0JCQlpbnQgaUdyZWF0ZSA9ICgqcENvbXBhcmUpKFZhbHVlMSwgVmFsdWUyKTsKLQkJCWlmICgoYkFzY2VuZCAmJiBpR3JlYXRlID4gMCkgfHwgKCFiQXNjZW5kICYmIGlHcmVhdGUgPCAwKSkKLQkJCXsKLQkJCQl0aGlzLT5TZXRBdChuU3RhcnRQb3MsIFZhbHVlMik7Ci0JCQkJdGhpcy0+U2V0QXQoblN0b3BQb3MsIFZhbHVlMSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KKyAgICBGWF9VSU5UIG0gPSBuU3RhcnRQb3MgKyAoblN0b3BQb3MgLSBuU3RhcnRQb3MpIC8gMjsKKyAgICBGWF9VSU5UIGkgPSBuU3RhcnRQb3M7CiAKLQkJRlhfVUlOVCBtID0gblN0YXJ0UG9zICsgKG5TdG9wUG9zIC0gblN0YXJ0UG9zKSAvIDI7Ci0JCUZYX1VJTlQgaSA9IG5TdGFydFBvczsKKyAgICBUWVBFIFZhbHVlID0gdGhpcy0+R2V0QXQobSk7CiAKLQkJVFlQRSBWYWx1ZSA9IHRoaXMtPkdldEF0KG0pOworICAgIHdoaWxlIChpIDwgbSkgeworICAgICAgVFlQRSB0ZW1wID0gdGhpcy0+R2V0QXQoaSk7CiAKLQkJd2hpbGUgKGkgPCBtKQotCQl7Ci0JCQlUWVBFIHRlbXAgPSB0aGlzLT5HZXRBdChpKTsKKyAgICAgIGludCBpR3JlYXRlID0gKCpwQ29tcGFyZSkodGVtcCwgVmFsdWUpOworICAgICAgaWYgKChiQXNjZW5kICYmIGlHcmVhdGUgPiAwKSB8fCAoIWJBc2NlbmQgJiYgaUdyZWF0ZSA8IDApKSB7CisgICAgICAgIHRoaXMtPkluc2VydEF0KG0gKyAxLCB0ZW1wKTsKKyAgICAgICAgdGhpcy0+UmVtb3ZlQXQoaSk7CisgICAgICAgIG0tLTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGkrKzsKKyAgICAgIH0KKyAgICB9CiAKLQkJCWludCBpR3JlYXRlID0gKCpwQ29tcGFyZSkodGVtcCwgVmFsdWUpOwotCQkJaWYgKChiQXNjZW5kICYmIGlHcmVhdGUgPiAwKSB8fCAoIWJBc2NlbmQgJiYgaUdyZWF0ZSA8IDApKQotCQkJewotCQkJCXRoaXMtPkluc2VydEF0KG0rMSwgdGVtcCk7Ci0JCQkJdGhpcy0+UmVtb3ZlQXQoaSk7Ci0JCQkJbS0tOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWkrKzsKLQkJCX0KLQkJfQorICAgIEZYX1VJTlQgaiA9IG5TdG9wUG9zOwogCi0JCUZYX1VJTlQgaiA9IG5TdG9wUG9zOworICAgIHdoaWxlIChqID4gbSkgeworICAgICAgVFlQRSB0ZW1wID0gdGhpcy0+R2V0QXQoaik7CiAKLQkJd2hpbGUgKGogPiBtKQotCQl7Ci0JCQlUWVBFIHRlbXAgPSB0aGlzLT5HZXRBdChqKTsKKyAgICAgIGludCBpR3JlYXRlID0gKCpwQ29tcGFyZSkodGVtcCwgVmFsdWUpOworICAgICAgaWYgKChiQXNjZW5kICYmIGlHcmVhdGUgPCAwKSB8fCAoIWJBc2NlbmQgJiYgaUdyZWF0ZSA+IDApKSB7CisgICAgICAgIHRoaXMtPlJlbW92ZUF0KGopOworICAgICAgICB0aGlzLT5JbnNlcnRBdChtLCB0ZW1wKTsKKyAgICAgICAgbSsrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgai0tOworICAgICAgfQorICAgIH0KIAotCQkJaW50IGlHcmVhdGUgPSAoKnBDb21wYXJlKSh0ZW1wLCBWYWx1ZSk7Ci0JCQlpZiAoKGJBc2NlbmQgJiYgaUdyZWF0ZSA8IDApIHx8ICghYkFzY2VuZCAmJiBpR3JlYXRlID4gMCkpCi0JCQl7Ci0JCQkJdGhpcy0+UmVtb3ZlQXQoaik7Ci0JCQkJdGhpcy0+SW5zZXJ0QXQobSwgdGVtcCk7Ci0JCQkJbSsrOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWotLTsKLQkJCX0KLQkJfQotCi0JCWlmIChuU3RhcnRQb3MgPCBtKSBRdWlja1NvcnQoblN0YXJ0UG9zLCBtLCBiQXNjZW5kLCBwQ29tcGFyZSk7Ci0JCWlmIChuU3RvcFBvcyA+IG0pIFF1aWNrU29ydChtLCBuU3RvcFBvcywgYkFzY2VuZCwgcENvbXBhcmUpOwotCX0KKyAgICBpZiAoblN0YXJ0UG9zIDwgbSkKKyAgICAgIFF1aWNrU29ydChuU3RhcnRQb3MsIG0sIGJBc2NlbmQsIHBDb21wYXJlKTsKKyAgICBpZiAoblN0b3BQb3MgPiBtKQorICAgICAgUXVpY2tTb3J0KG0sIG5TdG9wUG9zLCBiQXNjZW5kLCBwQ29tcGFyZSk7CisgIH0KIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0ZTREtfTUdSX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnNka19yZW5kZXJjb250ZXh0LmggYi9mcGRmc2RrL2luY2x1ZGUvZnNka19yZW5kZXJjb250ZXh0LmgKaW5kZXggZmZmNzAzMS4uOGMwMDdiNSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2ZzZGtfcmVuZGVyY29udGV4dC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9mc2RrX3JlbmRlcmNvbnRleHQuaApAQCAtMSw0MyArMSw0MyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIEZQREZTREtfSU5DTFVERV9GU0RLX1JFTkRFUkNPTlRFWFRfSF8KICNkZWZpbmUgRlBERlNES19JTkNMVURFX0ZTREtfUkVOREVSQ09OVEVYVF9IXwogCi0jaW5jbHVkZSAiLi4vLi4vcHVibGljL2ZwZGZfcHJvZ3Jlc3NpdmUuaCIKICNpbmNsdWRlICJmc2RrX2RlZmluZS5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX3Byb2dyZXNzaXZlLmgiCiAKIC8vIEV2ZXJ5dGhpbmcgYWJvdXQgcmVuZGVyaW5nIGlzIHB1dCBoZXJlOiBmb3IgT09NIHJlY292ZXJ5Ci1jbGFzcyBDUmVuZGVyQ29udGV4dCAKLXsKLXB1YmxpYzoKLQlDUmVuZGVyQ29udGV4dCgpIHsgQ2xlYXIoKTsgfQotCX5DUmVuZGVyQ29udGV4dCgpOwotCQotCXZvaWQgQ2xlYXIoKTsKLQkKLQlDRlhfUmVuZGVyRGV2aWNlKgkJbV9wRGV2aWNlOwotCUNQREZfUmVuZGVyQ29udGV4dCoJCW1fcENvbnRleHQ7Ci0JQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyKgltX3BSZW5kZXJlcjsKLQlDUERGX0Fubm90TGlzdCoJCQltX3BBbm5vdHM7Ci0JQ1BERl9SZW5kZXJPcHRpb25zKgkJbV9wT3B0aW9uczsKK2NsYXNzIENSZW5kZXJDb250ZXh0IHsKKyBwdWJsaWM6CisgIENSZW5kZXJDb250ZXh0KCkgeyBDbGVhcigpOyB9CisgIH5DUmVuZGVyQ29udGV4dCgpOworCisgIHZvaWQgQ2xlYXIoKTsKKworICBDRlhfUmVuZGVyRGV2aWNlKiBtX3BEZXZpY2U7CisgIENQREZfUmVuZGVyQ29udGV4dCogbV9wQ29udGV4dDsKKyAgQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyKiBtX3BSZW5kZXJlcjsKKyAgQ1BERl9Bbm5vdExpc3QqIG1fcEFubm90czsKKyAgQ1BERl9SZW5kZXJPcHRpb25zKiBtX3BPcHRpb25zOwogI2lmZGVmIF9XSU4zMl9XQ0UKLQlDRlhfRElCaXRtYXAqCW1fcEJpdG1hcDsKLQlIQklUTUFQCQkJbV9oQml0bWFwOworICBDRlhfRElCaXRtYXAqIG1fcEJpdG1hcDsKKyAgSEJJVE1BUCBtX2hCaXRtYXA7CiAjZW5kaWYKIH07CiAKLWNsYXNzIElGU0RLX1BBVVNFX0FkYXB0ZXIgOiBwdWJsaWMgSUZYX1BhdXNlCi17Ci1wdWJsaWM6Ci0JSUZTREtfUEFVU0VfQWRhcHRlcihJRlNES19QQVVTRSogSVBhdXNlICk7Ci0JRlhfQk9PTCBOZWVkVG9QYXVzZU5vdygpOwotCQotcHJpdmF0ZToKLQlJRlNES19QQVVTRSogbV9JUGF1c2U7CitjbGFzcyBJRlNES19QQVVTRV9BZGFwdGVyIDogcHVibGljIElGWF9QYXVzZSB7CisgcHVibGljOgorICBleHBsaWNpdCBJRlNES19QQVVTRV9BZGFwdGVyKElGU0RLX1BBVVNFKiBJUGF1c2UpOworICB+SUZTREtfUEFVU0VfQWRhcHRlcigpIG92ZXJyaWRlOworCisgIEZYX0JPT0wgTmVlZFRvUGF1c2VOb3coKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIElGU0RLX1BBVVNFKiBtX0lQYXVzZTsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0ZTREtfUkVOREVSQ09OVEVYVF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Z4X3N5c3RlbWhhbmRsZXIuaCBiL2ZwZGZzZGsvaW5jbHVkZS9meF9zeXN0ZW1oYW5kbGVyLmgKaW5kZXggZjhkZjcyMy4uMjI0ZTA3NSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Z4X3N5c3RlbWhhbmRsZXIuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnhfc3lzdGVtaGFuZGxlci5oCkBAIC0xLDE5ICsxLDI1IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgRlBERlNES19JTkNMVURFX0ZYX1NZU1RFTUhBTkRMRVJfSF8KICNkZWZpbmUgRlBERlNES19JTkNMVURFX0ZYX1NZU1RFTUhBTkRMRVJfSF8KIAotdHlwZWRlZiBGWF9MUFZPSUQJCQkJRlhfSFdORDsKLXR5cGVkZWYgRlhfTFBWT0lECQkJCUZYX0hNRU5VOwotdHlwZWRlZiB2b2lkCQkJCQkoKlRpbWVyQ2FsbGJhY2spKEZYX0lOVDMyIGlkRXZlbnQpOworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFyc2VyLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgogCi10eXBlZGVmIHN0cnVjdCBfRlhfU1lTVEVNVElNRSAKLXsKLSAgICBfRlhfU1lTVEVNVElNRSgpCitjbGFzcyBDUERGX0RvY3VtZW50OworY2xhc3MgQ1BERl9Gb250OworCit0eXBlZGVmIHZvaWQqIEZYX0hXTkQ7Cit0eXBlZGVmIHZvaWQqIEZYX0hNRU5VOwordHlwZWRlZiB2b2lkICgqVGltZXJDYWxsYmFjaykoaW50MzJfdCBpZEV2ZW50KTsKKwordHlwZWRlZiBzdHJ1Y3QgX0ZYX1NZU1RFTVRJTUUgeworICBfRlhfU1lTVEVNVElNRSgpCiAgICAgICA6IHdZZWFyKDApLAogICAgICAgICB3TW9udGgoMCksCiAgICAgICAgIHdEYXlPZldlZWsoMCksCkBAIC0yMiw3MiArMjgsODAgQEAKICAgICAgICAgd01pbnV0ZSgwKSwKICAgICAgICAgd1NlY29uZCgwKSwKICAgICAgICAgd01pbGxpc2Vjb25kcygwKSB7fQotICAgIEZYX1dPUkQgd1llYXI7Ci0gICAgRlhfV09SRCB3TW9udGg7Ci0gICAgRlhfV09SRCB3RGF5T2ZXZWVrOwotICAgIEZYX1dPUkQgd0RheTsKLSAgICBGWF9XT1JEIHdIb3VyOwotICAgIEZYX1dPUkQgd01pbnV0ZTsKLSAgICBGWF9XT1JEIHdTZWNvbmQ7Ci0gICAgRlhfV09SRCB3TWlsbGlzZWNvbmRzOwotfUZYX1NZU1RFTVRJTUU7CisgIEZYX1dPUkQgd1llYXI7CisgIEZYX1dPUkQgd01vbnRoOworICBGWF9XT1JEIHdEYXlPZldlZWs7CisgIEZYX1dPUkQgd0RheTsKKyAgRlhfV09SRCB3SG91cjsKKyAgRlhfV09SRCB3TWludXRlOworICBGWF9XT1JEIHdTZWNvbmQ7CisgIEZYX1dPUkQgd01pbGxpc2Vjb25kczsKK30gRlhfU1lTVEVNVElNRTsKIAotLy9jdXJzb3Igc3R5bGUKLSNkZWZpbmUgRlhDVF9BUlJPVwkJCQkwCi0jZGVmaW5lIEZYQ1RfTkVTVwkJCQkxCi0jZGVmaW5lIEZYQ1RfTldTRQkJCQkyCi0jZGVmaW5lIEZYQ1RfVkJFQU0JCQkJMwotI2RlZmluZSBGWENUX0hCRUFNCQkJCTQKLSNkZWZpbmUgRlhDVF9IQU5ECQkJCTUKKy8vIGN1cnNvciBzdHlsZQorI2RlZmluZSBGWENUX0FSUk9XIDAKKyNkZWZpbmUgRlhDVF9ORVNXIDEKKyNkZWZpbmUgRlhDVF9OV1NFIDIKKyNkZWZpbmUgRlhDVF9WQkVBTSAzCisjZGVmaW5lIEZYQ1RfSEJFQU0gNAorI2RlZmluZSBGWENUX0hBTkQgNQogCi1jbGFzcyBJRlhfU3lzdGVtSGFuZGxlcgotewotcHVibGljOgotCXZpcnR1YWwgfklGWF9TeXN0ZW1IYW5kbGVyKCkge30KLQl2aXJ0dWFsIHZvaWQJCQkJSW52YWxpZGF0ZVJlY3QoRlhfSFdORCBoV25kLCBGWF9SRUNUIHJlY3QpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQJCQkJT3V0cHV0U2VsZWN0ZWRSZWN0KHZvaWQqIHBGb3JtRmlsbGVyLCBDUERGX1JlY3QmcmVjdCkgPSAwOworY2xhc3MgSUZYX1N5c3RlbUhhbmRsZXIgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SUZYX1N5c3RlbUhhbmRsZXIoKSB7fQorICB2aXJ0dWFsIHZvaWQgSW52YWxpZGF0ZVJlY3QoRlhfSFdORCBoV25kLCBGWF9SRUNUIHJlY3QpID0gMDsKKyAgdmlydHVhbCB2b2lkIE91dHB1dFNlbGVjdGVkUmVjdCh2b2lkKiBwRm9ybUZpbGxlciwgQ1BERl9SZWN0JiByZWN0KSA9IDA7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNTZWxlY3Rpb25JbXBsZW1lbnRlZCgpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIElzU2VsZWN0aW9uSW1wbGVtZW50ZWQoKSA9IDA7CiAKLQl2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCQlHZXRDbGlwYm9hcmRUZXh0KEZYX0hXTkQgaFduZCkgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlTZXRDbGlwYm9hcmRUZXh0KEZYX0hXTkQgaFduZCwgQ0ZYX1dpZGVTdHJpbmcgc3RyaW5nKSA9IDA7Ci0JCi0JdmlydHVhbCB2b2lkCQkJCUNsaWVudFRvU2NyZWVuKEZYX0hXTkQgaFduZCwgRlhfSU5UMzImIHgsIEZYX0lOVDMyJiB5KSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCVNjcmVlblRvQ2xpZW50KEZYX0hXTkQgaFduZCwgRlhfSU5UMzImIHgsIEZYX0lOVDMyJiB5KSA9IDA7CisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0Q2xpcGJvYXJkVGV4dChGWF9IV05EIGhXbmQpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIFNldENsaXBib2FyZFRleHQoRlhfSFdORCBoV25kLCBDRlhfV2lkZVN0cmluZyBzdHJpbmcpID0gMDsKIAotCS8qY3Vyc29yIHN0eWxlCi0JRlhDVF9BUlJPVwkKLQlGWENUX05FU1cJCQotCUZYQ1RfTldTRQkJCi0JRlhDVF9WQkVBTQkJCi0JRlhDVF9IQkVBTQkJCi0JRlhDVF9IQU5ECi0JKi8KLQl2aXJ0dWFsIHZvaWQJCQkJU2V0Q3Vyc29yKEZYX0lOVDMyIG5DdXJzb3JUeXBlKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBDbGllbnRUb1NjcmVlbihGWF9IV05EIGhXbmQsIGludDMyX3QmIHgsIGludDMyX3QmIHkpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNjcmVlblRvQ2xpZW50KEZYX0hXTkQgaFduZCwgaW50MzJfdCYgeCwgaW50MzJfdCYgeSkgPSAwOwogCi0JdmlydHVhbCBGWF9ITUVOVQkJCUNyZWF0ZVBvcHVwTWVudSgpID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJQXBwZW5kTWVudUl0ZW0oRlhfSE1FTlUgaE1lbnUsIEZYX0lOVDMyIG5JRE5ld0l0ZW0sIENGWF9XaWRlU3RyaW5nIHN0cmluZykgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlFbmFibGVNZW51SXRlbShGWF9ITUVOVSBoTWVudSwgRlhfSU5UMzIgbklESXRlbSwgRlhfQk9PTCBiRW5hYmxlZCkgPSAwOwotCXZpcnR1YWwgRlhfSU5UMzIJCQlUcmFja1BvcHVwTWVudShGWF9ITUVOVSBoTWVudSwgRlhfSU5UMzIgeCwgRlhfSU5UMzIgeSwgRlhfSFdORCBoUGFyZW50KSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCURlc3Ryb3lNZW51KEZYX0hNRU5VIGhNZW51KSA9IDA7CisgIC8qY3Vyc29yIHN0eWxlCisgIEZYQ1RfQVJST1cKKyAgRlhDVF9ORVNXCisgIEZYQ1RfTldTRQorICBGWENUX1ZCRUFNCisgIEZYQ1RfSEJFQU0KKyAgRlhDVF9IQU5ECisgICovCisgIHZpcnR1YWwgdm9pZCBTZXRDdXJzb3IoaW50MzJfdCBuQ3Vyc29yVHlwZSkgPSAwOwogCi0JdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0TmF0aXZlVHJ1ZVR5cGVGb250KEZYX0lOVDMyIG5DaGFyc2V0KSA9IDA7Ci0JdmlydHVhbCBGWF9CT09MCQkJCUZpbmROYXRpdmVUcnVlVHlwZUZvbnQoRlhfSU5UMzIgbkNoYXJzZXQsIENGWF9CeXRlU3RyaW5nIHNGb250RmFjZU5hbWUpID0gMDsKLQl2aXJ0dWFsIENQREZfRm9udCoJCQlBZGROYXRpdmVUcnVlVHlwZUZvbnRUb1BERihDUERGX0RvY3VtZW50KiBwRG9jLCBDRlhfQnl0ZVN0cmluZyBzRm9udEZhY2VOYW1lLCBGWF9CWVRFIG5DaGFyc2V0KSA9IDA7CisgIHZpcnR1YWwgRlhfSE1FTlUgQ3JlYXRlUG9wdXBNZW51KCkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgQXBwZW5kTWVudUl0ZW0oRlhfSE1FTlUgaE1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JRE5ld0l0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzdHJpbmcpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIEVuYWJsZU1lbnVJdGVtKEZYX0hNRU5VIGhNZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSURJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRW5hYmxlZCkgPSAwOworICB2aXJ0dWFsIGludDMyX3QgVHJhY2tQb3B1cE1lbnUoRlhfSE1FTlUgaE1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9IV05EIGhQYXJlbnQpID0gMDsKKyAgdmlydHVhbCB2b2lkIERlc3Ryb3lNZW51KEZYX0hNRU5VIGhNZW51KSA9IDA7CiAKLQl2aXJ0dWFsIEZYX0lOVDMyCQkJU2V0VGltZXIoRlhfSU5UMzIgdUVsYXBzZSwgVGltZXJDYWxsYmFjayBscFRpbWVyRnVuYykgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQlLaWxsVGltZXIoRlhfSU5UMzIgbklEKSA9IDA7CisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0TmF0aXZlVHJ1ZVR5cGVGb250KGludDMyX3QgbkNoYXJzZXQpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIEZpbmROYXRpdmVUcnVlVHlwZUZvbnQoaW50MzJfdCBuQ2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnRGYWNlTmFtZSkgPSAwOworICB2aXJ0dWFsIENQREZfRm9udCogQWRkTmF0aXZlVHJ1ZVR5cGVGb250VG9QREYoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNGb250RmFjZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG5DaGFyc2V0KSA9IDA7CiAKKyAgdmlydHVhbCBpbnQzMl90IFNldFRpbWVyKGludDMyX3QgdUVsYXBzZSwgVGltZXJDYWxsYmFjayBscFRpbWVyRnVuYykgPSAwOworICB2aXJ0dWFsIHZvaWQgS2lsbFRpbWVyKGludDMyX3QgbklEKSA9IDA7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNTSElGVEtleURvd24oRlhfRFdPUkQgbkZsYWcpID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNDVFJMS2V5RG93bihGWF9EV09SRCBuRmxhZykgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlJc0FMVEtleURvd24oRlhfRFdPUkQgbkZsYWcpID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNJTlNFUlRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBJc1NISUZUS2V5RG93bihGWF9EV09SRCBuRmxhZykgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgSXNDVFJMS2V5RG93bihGWF9EV09SRCBuRmxhZykgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgSXNBTFRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBJc0lOU0VSVEtleURvd24oRlhfRFdPUkQgbkZsYWcpID0gMDsKIAotCXZpcnR1YWwJRlhfU1lTVEVNVElNRQkJR2V0TG9jYWxUaW1lKCkgPSAwOworICB2aXJ0dWFsIEZYX1NZU1RFTVRJTUUgR2V0TG9jYWxUaW1lKCkgPSAwOwogCi0JdmlydHVhbCBGWF9JTlQzMgkJCUdldENoYXJTZXQoKSA9IDA7CQotCXZpcnR1YWwgdm9pZCAJCQkJU2V0Q2hhclNldChGWF9JTlQzMiBuQ2hhclNldCkgPSAwOworICB2aXJ0dWFsIGludDMyX3QgR2V0Q2hhclNldCgpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldENoYXJTZXQoaW50MzJfdCBuQ2hhclNldCkgPSAwOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfRlhfU1lTVEVNSEFORExFUl9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meF9lZGl0LmggYi9mcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4X2VkaXQuaAppbmRleCAzMWVkZTA1Li5hOGY1YmJhIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4X2VkaXQuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4X2VkaXQuaApAQCAtMSwyMSArMSwyMSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIEZQREZTREtfSU5DTFVERV9GWEVESVRfRlhfRURJVF9IXwogI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfRlhFRElUX0ZYX0VESVRfSF8KIAotI2luY2x1ZGUgIi4uLy4uLy4uL2NvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2NvcmUvaW5jbHVkZS9meGdlL2Z4X2RpYi5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFyc2VyLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZGliLmgiCiAKIGNsYXNzIENGWF9SZW5kZXJEZXZpY2U7CiBjbGFzcyBDUERGX0ZvbnQ7Ci1jbGFzcyBDUERGX01hdHJpeDsKK2NsYXNzIENGWF9NYXRyaXg7CiBjbGFzcyBDUERGX1BhZ2VPYmplY3RzOwogY2xhc3MgQ1BERl9Qb2ludDsKLWNsYXNzIENQREZfUmVjdDsKIGNsYXNzIENQREZfVGV4dE9iamVjdDsKIGNsYXNzIElGWF9FZGl0OwogY2xhc3MgSUZYX0VkaXRfRm9udE1hcDsKQEAgLTM1LDQ2MSArMzUsNTQyIEBACiBzdHJ1Y3QgQ1BWVF9Xb3JkUHJvcHM7CiBzdHJ1Y3QgQ1BWVF9Xb3JkUmFuZ2U7CiAKLSNkZWZpbmUgUFZUV09SRF9TVFlMRV9OT1JNQUwJCQkJMHgwMDAwTAotI2RlZmluZSBQVlRXT1JEX1NUWUxFX0hJR0hMSUdIVAkJCQkweDAwMDFMCi0jZGVmaW5lIFBWVFdPUkRfU1RZTEVfVU5ERVJMSU5FCQkJCTB4MDAwMkwKLSNkZWZpbmUgUFZUV09SRF9TVFlMRV9DUk9TU09VVAkJCQkweDAwMDRMCi0jZGVmaW5lIFBWVFdPUkRfU1RZTEVfU1FVSUdHTFkJCQkJMHgwMDA4TAotI2RlZmluZSBQVlRXT1JEX1NUWUxFX0RVQUxDUk9TU09VVAkJCTB4MDAxMEwKLSNkZWZpbmUgUFZUV09SRF9TVFlMRV9CT0xECQkJCQkweDAwMjBMCi0jZGVmaW5lIFBWVFdPUkRfU1RZTEVfSVRBTElDCQkJCTB4MDA0MEwKKyNkZWZpbmUgUFZUV09SRF9TVFlMRV9OT1JNQUwgMHgwMDAwTAorI2RlZmluZSBQVlRXT1JEX1NUWUxFX0hJR0hMSUdIVCAweDAwMDFMCisjZGVmaW5lIFBWVFdPUkRfU1RZTEVfVU5ERVJMSU5FIDB4MDAwMkwKKyNkZWZpbmUgUFZUV09SRF9TVFlMRV9DUk9TU09VVCAweDAwMDRMCisjZGVmaW5lIFBWVFdPUkRfU1RZTEVfU1FVSUdHTFkgMHgwMDA4TAorI2RlZmluZSBQVlRXT1JEX1NUWUxFX0RVQUxDUk9TU09VVCAweDAwMTBMCisjZGVmaW5lIFBWVFdPUkRfU1RZTEVfQk9MRCAweDAwMjBMCisjZGVmaW5lIFBWVFdPUkRfU1RZTEVfSVRBTElDIDB4MDA0MEwKIAotI2RlZmluZSBGWF9FRElUX0lTTEFUSU5XT1JEKHUpCSh1ID09IDB4MkQgfHwgKHUgPD0gMHgwMDVBICYmIHUgPj0gMHgwMDQxKSB8fCAodSA8PSAweDAwN0EgJiYgdSA+PSAweDAwNjEpIHx8ICh1IDw9IDB4MDJBRiAmJiB1ID49IDB4MDBDMCkpCi0KLSNpZmRlZiBGWF9SRUFERVJfRExMCi0JI2lmZGVmIEZYRVRfRVhQT1JUCi0JCSNkZWZpbmUgRlhFVF9DTEFTUyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLQkjZWxzZQotCQkjZGVmaW5lIEZYRVRfQ0xBU1MKLQkjZW5kaWYKLSNlbHNlCi0JI2RlZmluZSBGWEVUX0NMQVNTCi0jZW5kaWYKKyNkZWZpbmUgRlhfRURJVF9JU0xBVElOV09SRCh1KSAgICAgICAgICAgICAgICAgIFwKKyAgKHUgPT0gMHgyRCB8fCAodSA8PSAweDAwNUEgJiYgdSA+PSAweDAwNDEpIHx8IFwKKyAgICh1IDw9IDB4MDA3QSAmJiB1ID49IDB4MDA2MSkgfHwgKHUgPD0gMHgwMkFGICYmIHUgPj0gMHgwMEMwKSkKIAogI2lmbmRlZiBERUZBVUxUX0NIQVJTRVQKLSNkZWZpbmUgREVGQVVMVF9DSEFSU0VUICAgICAgICAgMQotI2VuZGlmIAorI2RlZmluZSBERUZBVUxUX0NIQVJTRVQgMQorI2VuZGlmCiAKLWNsYXNzIElGWF9FZGl0X0ZvbnRNYXAKLXsKLXB1YmxpYzoKLSAgICAgICAgdmlydHVhbCB+SUZYX0VkaXRfRm9udE1hcCgpIHsgfQotCS8vbWFwIGEgZm9udGluZGV4IHRvIHBkZiBmb250LgotCXZpcnR1YWwgQ1BERl9Gb250ICoJCQkJCQlHZXRQREZGb250KEZYX0lOVDMyIG5Gb250SW5kZXgpID0gMDsKLQkvL2dldCB0aGUgYWxpYXMgb2YgYSBwZGYgZm9udC4KLQl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRQREZGb250QWxpYXMoRlhfSU5UMzIgbkZvbnRJbmRleCkgPSAwOwotCS8vZ2V0IHRoZSBpbmRleCBvZiBhIGZvbnQgdGhhdCBjYW4gc2hvdyBhIHdvcmQuCi0JdmlydHVhbCBGWF9JTlQzMgkJCQkJCUdldFdvcmRGb250SW5kZXgoRlhfV09SRCB3b3JkLCBGWF9JTlQzMiBjaGFyc2V0LCBGWF9JTlQzMiBuRm9udEluZGV4KSA9IDA7Ci0JLy9nZXQgdGhlIGNoYXJjb2RlIG9mIHdvcmQgZnJvbSB1bmljb2RlCi0JdmlydHVhbCBGWF9JTlQzMgkJCQkJCUNoYXJDb2RlRnJvbVVuaWNvZGUoRlhfSU5UMzIgbkZvbnRJbmRleCwgRlhfV09SRCB3b3JkKSA9IDA7Ci0JLy9nZXQgdGhlIGNoYXJzZXQgb2YgdW5pY29kZQotCXZpcnR1YWwgRlhfSU5UMzIJCQkJCQlDaGFyU2V0RnJvbVVuaWNvZGUoRlhfV09SRCB3b3JkLCBGWF9JTlQzMiBuT2xkQ2hhcnNldCkgPSAwOworY2xhc3MgSUZYX0VkaXRfRm9udE1hcCB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JRlhfRWRpdF9Gb250TWFwKCkge30KKyAgLy8gbWFwIGEgZm9udGluZGV4IHRvIHBkZiBmb250LgorICB2aXJ0dWFsIENQREZfRm9udCogR2V0UERGRm9udChpbnQzMl90IG5Gb250SW5kZXgpID0gMDsKKyAgLy8gZ2V0IHRoZSBhbGlhcyBvZiBhIHBkZiBmb250LgorICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIEdldFBERkZvbnRBbGlhcyhpbnQzMl90IG5Gb250SW5kZXgpID0gMDsKKyAgLy8gZ2V0IHRoZSBpbmRleCBvZiBhIGZvbnQgdGhhdCBjYW4gc2hvdyBhIHdvcmQuCisgIHZpcnR1YWwgaW50MzJfdCBHZXRXb3JkRm9udEluZGV4KEZYX1dPUkQgd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Gb250SW5kZXgpID0gMDsKKyAgLy8gZ2V0IHRoZSBjaGFyY29kZSBvZiB3b3JkIGZyb20gdW5pY29kZQorICB2aXJ0dWFsIGludDMyX3QgQ2hhckNvZGVGcm9tVW5pY29kZShpbnQzMl90IG5Gb250SW5kZXgsIEZYX1dPUkQgd29yZCkgPSAwOworICAvLyBnZXQgdGhlIGNoYXJzZXQgb2YgdW5pY29kZQorICB2aXJ0dWFsIGludDMyX3QgQ2hhclNldEZyb21Vbmljb2RlKEZYX1dPUkQgd29yZCwgaW50MzJfdCBuT2xkQ2hhcnNldCkgPSAwOwogfTsKIAotY2xhc3MgSUZYX0VkaXRfTm90aWZ5Ci17Ci1wdWJsaWM6Ci0gICAgICAgIHZpcnR1YWwgfklGWF9FZGl0X05vdGlmeSgpIHsgfQotCS8vc2V0IHRoZSBob3Jpem9udGFsIHNjcm9sbGJhciBpbmZvcm1hdGlvbi4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJSU9uU2V0U2Nyb2xsSW5mb1goRlhfRkxPQVQgZlBsYXRlTWluLCBGWF9GTE9BVCBmUGxhdGVNYXgsIAotCQkJCQkJCQkJCQkJRlhfRkxPQVQgZkNvbnRlbnRNaW4sIEZYX0ZMT0FUIGZDb250ZW50TWF4LCAKLQkJCQkJCQkJCQkJCUZYX0ZMT0FUIGZTbWFsbFN0ZXAsIEZYX0ZMT0FUIGZCaWdTdGVwKSA9IDA7Ci0JLy9zZXQgdGhlIHZlcnRpY2FsIHNjcm9sbGJhciBpbmZvcm1hdGlvbi4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJSU9uU2V0U2Nyb2xsSW5mb1koRlhfRkxPQVQgZlBsYXRlTWluLCBGWF9GTE9BVCBmUGxhdGVNYXgsIAotCQkJCQkJCQkJCQkJRlhfRkxPQVQgZkNvbnRlbnRNaW4sIEZYX0ZMT0FUIGZDb250ZW50TWF4LCAKLQkJCQkJCQkJCQkJCUZYX0ZMT0FUIGZTbWFsbFN0ZXAsIEZYX0ZMT0FUIGZCaWdTdGVwKSA9IDA7Ci0JLy9zZXQgdGhlIHBvc2l0aW9uIG9mIGhvcml6b250YWwgc2Nyb2xsYmFyLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlJT25TZXRTY3JvbGxQb3NYKEZYX0ZMT0FUIGZ4KSA9IDA7Ci0JLy9zZXQgdGhlIHBvc2l0aW9uIG9mIHZlcnRpY2FsIHNjcm9sbGJhci4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJSU9uU2V0U2Nyb2xsUG9zWShGWF9GTE9BVCBmeSkgPSAwOwotCS8vc2V0IHRoZSBjYXJldCBpbmZvcm1hdGlvbi4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJSU9uU2V0Q2FyZXQoRlhfQk9PTCBiVmlzaWJsZSxjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLGNvbnN0IENQREZfUG9pbnQgJiBwdEZvb3QsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgPSAwOwotCS8vaWYgdGhlIGNhcmV0IHBvc2l0aW9uIGlzIGNoYW5nZWQgLHNlbmQgdGhlIGluZm9ybWF0aW9uIG9mIGN1cnJlbnQgcG9zdGlvbiB0byB1c2VyLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlJT25DYXJldENoYW5nZShjb25zdCBDUFZUX1NlY1Byb3BzICYgc2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICYgd29yZFByb3BzKSA9IDA7Ci0JLy9pZiB0aGUgdGV4dCBhcmVhIGlzIGNoYW5nZWQsIHNlbmQgdGhlIGluZm9ybWF0aW9uIHRvIHVzZXIuCi0JdmlydHVhbCB2b2lkCQkJCQkJCUlPbkNvbnRlbnRDaGFuZ2UoY29uc3QgQ1BERl9SZWN0JiByY0NvbnRlbnQpID0gMDsKLQkvL0ludmFsaWRhdGUgdGhlIHJlY3RhbmdsZSByZWxhdGl2ZSB0byB0aGUgYm91bmRpbmcgYm94IG9mIGVkaXQuCi0JdmlydHVhbCB2b2lkCQkJCQkJCUlPbkludmFsaWRhdGVSZWN0KENQREZfUmVjdCAqIHBSZWN0KSA9IDA7CitjbGFzcyBJRlhfRWRpdF9Ob3RpZnkgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SUZYX0VkaXRfTm90aWZ5KCkge30KKyAgLy8gc2V0IHRoZSBob3Jpem9udGFsIHNjcm9sbGJhciBpbmZvcm1hdGlvbi4KKyAgdmlydHVhbCB2b2lkIElPblNldFNjcm9sbEluZm9YKEZYX0ZMT0FUIGZQbGF0ZU1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQbGF0ZU1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNvbnRlbnRNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU21hbGxTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkJpZ1N0ZXApID0gMDsKKyAgLy8gc2V0IHRoZSB2ZXJ0aWNhbCBzY3JvbGxiYXIgaW5mb3JtYXRpb24uCisgIHZpcnR1YWwgdm9pZCBJT25TZXRTY3JvbGxJbmZvWShGWF9GTE9BVCBmUGxhdGVNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGxhdGVNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29udGVudE1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50TWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNtYWxsU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZCaWdTdGVwKSA9IDA7CisgIC8vIHNldCB0aGUgcG9zaXRpb24gb2YgaG9yaXpvbnRhbCBzY3JvbGxiYXIuCisgIHZpcnR1YWwgdm9pZCBJT25TZXRTY3JvbGxQb3NYKEZYX0ZMT0FUIGZ4KSA9IDA7CisgIC8vIHNldCB0aGUgcG9zaXRpb24gb2YgdmVydGljYWwgc2Nyb2xsYmFyLgorICB2aXJ0dWFsIHZvaWQgSU9uU2V0U2Nyb2xsUG9zWShGWF9GTE9BVCBmeSkgPSAwOworICAvLyBzZXQgdGhlIGNhcmV0IGluZm9ybWF0aW9uLgorICB2aXJ0dWFsIHZvaWQgSU9uU2V0Q2FyZXQoRlhfQk9PTCBiVmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0SGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0Rm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgPSAwOworICAvLyBpZiB0aGUgY2FyZXQgcG9zaXRpb24gaXMgY2hhbmdlZCAsc2VuZCB0aGUgaW5mb3JtYXRpb24gb2YgY3VycmVudCBwb3N0aW9uCisgIC8vIHRvIHVzZXIuCisgIHZpcnR1YWwgdm9pZCBJT25DYXJldENoYW5nZShjb25zdCBDUFZUX1NlY1Byb3BzJiBzZWNQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzJiB3b3JkUHJvcHMpID0gMDsKKyAgLy8gaWYgdGhlIHRleHQgYXJlYSBpcyBjaGFuZ2VkLCBzZW5kIHRoZSBpbmZvcm1hdGlvbiB0byB1c2VyLgorICB2aXJ0dWFsIHZvaWQgSU9uQ29udGVudENoYW5nZShjb25zdCBDUERGX1JlY3QmIHJjQ29udGVudCkgPSAwOworICAvLyBJbnZhbGlkYXRlIHRoZSByZWN0YW5nbGUgcmVsYXRpdmUgdG8gdGhlIGJvdW5kaW5nIGJveCBvZiBlZGl0LgorICB2aXJ0dWFsIHZvaWQgSU9uSW52YWxpZGF0ZVJlY3QoQ1BERl9SZWN0KiBwUmVjdCkgPSAwOwogfTsKIAotY2xhc3MgSUZYX0VkaXRfT3ByTm90aWZ5Ci17Ci1wdWJsaWM6Ci0gICAgICAgIHZpcnR1YWwgfklGWF9FZGl0X09wck5vdGlmeSgpIHsgfQorY2xhc3MgSUZYX0VkaXRfT3ByTm90aWZ5IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklGWF9FZGl0X09wck5vdGlmeSgpIHt9CiAKLQkvL09wclR5cGU6IDAKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25JbnNlcnRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSA9IDA7Ci0JLy9PcHJUeXBlOiAxCi0JdmlydHVhbCB2b2lkCQkJCQkJCU9uSW5zZXJ0UmV0dXJuKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSA9IDA7Ci0JLy9PcHJUeXBlOiAyCi0JdmlydHVhbCB2b2lkCQkJCQkJCU9uQmFja1NwYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSA9IDA7Ci0JLy9PcHJUeXBlOiAzCi0JdmlydHVhbCB2b2lkCQkJCQkJCU9uRGVsZXRlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSA9IDA7Ci0JLy9PcHJUeXBlOiA0Ci0JdmlydHVhbCB2b2lkCQkJCQkJCU9uQ2xlYXIoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpID0gMDsKLQkvL09wclR5cGU6IDUKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25JbnNlcnRUZXh0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSA9IDA7Ci0JLy9PcHJUeXBlOiA2Ci0JdmlydHVhbCB2b2lkCQkJCQkJCU9uU2V0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkgPSAwOwotCS8vCi0JdmlydHVhbCB2b2lkCQkJCQkJCU9uQWRkVW5kbyhJRlhfRWRpdF9VbmRvSXRlbSogcFVuZG9JdGVtKSA9IDA7CisgIC8vIE9wclR5cGU6IDAKKyAgdmlydHVhbCB2b2lkIE9uSW5zZXJ0V29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSA9IDA7CisgIC8vIE9wclR5cGU6IDEKKyAgdmlydHVhbCB2b2lkIE9uSW5zZXJ0UmV0dXJuKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkgPSAwOworICAvLyBPcHJUeXBlOiAyCisgIHZpcnR1YWwgdm9pZCBPbkJhY2tTcGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpID0gMDsKKyAgLy8gT3ByVHlwZTogMworICB2aXJ0dWFsIHZvaWQgT25EZWxldGUoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSA9IDA7CisgIC8vIE9wclR5cGU6IDQKKyAgdmlydHVhbCB2b2lkIE9uQ2xlYXIoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpID0gMDsKKyAgLy8gT3ByVHlwZTogNQorICB2aXJ0dWFsIHZvaWQgT25JbnNlcnRUZXh0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpID0gMDsKKyAgLy8gT3ByVHlwZTogNgorICB2aXJ0dWFsIHZvaWQgT25TZXRUZXh0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpID0gMDsKKyAgLy8KKyAgdmlydHVhbCB2b2lkIE9uQWRkVW5kbyhJRlhfRWRpdF9VbmRvSXRlbSogcFVuZG9JdGVtKSA9IDA7CiB9OwogCi1jbGFzcyBJRlhfRWRpdF9JdGVyYXRvcgotewotcHVibGljOgotCXZpcnR1YWwgfklGWF9FZGl0X0l0ZXJhdG9yKCkgIHt9Ci1wdWJsaWM6Ci0JLy9tb3ZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBuZXh0IHdvcmQuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCU5leHRXb3JkKCkgPSAwOwotCS8vbW92ZSB0aGUgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgbmV4dCBsaW5lLgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlOZXh0TGluZSgpID0gMDsKLQkvL21vdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gdGhlIG5leHQgc2VjdGlvbi4gCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCU5leHRTZWN0aW9uKCkgPSAwOworY2xhc3MgSUZYX0VkaXRfSXRlcmF0b3IgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SUZYX0VkaXRfSXRlcmF0b3IoKSB7fQogCi0JLy9tb3ZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBwcmV2aW91cyB3b3JkLgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlQcmV2V29yZCgpID0gMDsKLQkvL21vdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gdGhlIHByZXZpb3VzIGxpbmUuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCVByZXZMaW5lKCkgPSAwOwotCS8vbW92ZSB0aGUgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgcHJldmlvdXMgc2VjdGlvbi4gCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCVByZXZTZWN0aW9uKCkgPSAwOworIHB1YmxpYzoKKyAgLy8gbW92ZSB0aGUgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgbmV4dCB3b3JkLgorICB2aXJ0dWFsIEZYX0JPT0wgTmV4dFdvcmQoKSA9IDA7CisgIC8vIG1vdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gdGhlIG5leHQgbGluZS4KKyAgdmlydHVhbCBGWF9CT09MIE5leHRMaW5lKCkgPSAwOworICAvLyBtb3ZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBuZXh0IHNlY3Rpb24uCisgIHZpcnR1YWwgRlhfQk9PTCBOZXh0U2VjdGlvbigpID0gMDsKIAotCS8vZ2V0IHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgY3VycmVudCB3b3JkLgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlHZXRXb3JkKENQVlRfV29yZCAmIHdvcmQpIGNvbnN0ID0gMDsKLQkvL2dldCB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIGN1cnJlbnQgbGluZS4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJR2V0TGluZShDUFZUX0xpbmUgJiBsaW5lKSBjb25zdCA9IDA7Ci0JLy9nZXQgdGhlIGluZm9ybWF0aW9uIG9mIHRoZSBjdXJyZW50IHNlY3Rpb24uCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCUdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uICYgc2VjdGlvbikgY29uc3QgPSAwOwotCS8vc2V0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBdChGWF9JTlQzMiBuV29yZEluZGV4KSA9IDA7Ci0JLy9zZXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldEF0KGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpID0gMDsKLQkvL2dldCB0aGUgY3VycmVudCBwb3NpdGlvbi4KLQl2aXJ0dWFsIGNvbnN0IENQVlRfV29yZFBsYWNlICYJCQlHZXRBdCgpIGNvbnN0ID0gMDsKKyAgLy8gbW92ZSB0aGUgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgcHJldmlvdXMgd29yZC4KKyAgdmlydHVhbCBGWF9CT09MIFByZXZXb3JkKCkgPSAwOworICAvLyBtb3ZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBwcmV2aW91cyBsaW5lLgorICB2aXJ0dWFsIEZYX0JPT0wgUHJldkxpbmUoKSA9IDA7CisgIC8vIG1vdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gdGhlIHByZXZpb3VzIHNlY3Rpb24uCisgIHZpcnR1YWwgRlhfQk9PTCBQcmV2U2VjdGlvbigpID0gMDsKIAotCS8vZ2V0IHRoZSBlZGl0IHdoaWNoIHRoaXMgaXRlcmF0b3IgYmVsb25ncyB0bwotCXZpcnR1YWwgSUZYX0VkaXQqCQkJCQkJR2V0RWRpdCgpIGNvbnN0ID0gMDsKKyAgLy8gZ2V0IHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgY3VycmVudCB3b3JkLgorICB2aXJ0dWFsIEZYX0JPT0wgR2V0V29yZChDUFZUX1dvcmQmIHdvcmQpIGNvbnN0ID0gMDsKKyAgLy8gZ2V0IHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgY3VycmVudCBsaW5lLgorICB2aXJ0dWFsIEZYX0JPT0wgR2V0TGluZShDUFZUX0xpbmUmIGxpbmUpIGNvbnN0ID0gMDsKKyAgLy8gZ2V0IHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgY3VycmVudCBzZWN0aW9uLgorICB2aXJ0dWFsIEZYX0JPT0wgR2V0U2VjdGlvbihDUFZUX1NlY3Rpb24mIHNlY3Rpb24pIGNvbnN0ID0gMDsKKyAgLy8gc2V0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICB2aXJ0dWFsIHZvaWQgU2V0QXQoaW50MzJfdCBuV29yZEluZGV4KSA9IDA7CisgIC8vIHNldCB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAgdmlydHVhbCB2b2lkIFNldEF0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgPSAwOworICAvLyBnZXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgIHZpcnR1YWwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIEdldEF0KCkgY29uc3QgPSAwOworCisgIC8vIGdldCB0aGUgZWRpdCB3aGljaCB0aGlzIGl0ZXJhdG9yIGJlbG9uZ3MgdG8KKyAgdmlydHVhbCBJRlhfRWRpdCogR2V0RWRpdCgpIGNvbnN0ID0gMDsKIH07CiAKLWNsYXNzIElGWF9FZGl0X1VuZG9JdGVtCi17Ci1wdWJsaWM6Ci0JdmlydHVhbCB+SUZYX0VkaXRfVW5kb0l0ZW0oKSB7IH0KK2NsYXNzIElGWF9FZGl0X1VuZG9JdGVtIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklGWF9FZGl0X1VuZG9JdGVtKCkge30KIAotCXZpcnR1YWwgdm9pZAkJCQkJCQlVbmRvKCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCQlSZWRvKCkgPSAwOwotCXZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldFVuZG9UaXRsZSgpID0gMDsKKyAgdmlydHVhbCB2b2lkIFVuZG8oKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBSZWRvKCkgPSAwOworICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIEdldFVuZG9UaXRsZSgpID0gMDsKIH07CiAKLWNsYXNzIEZYRVRfQ0xBU1MgSUZYX0VkaXQKLXsKLXB1YmxpYzoKLQlzdGF0aWMgSUZYX0VkaXQqCQkJCQkJTmV3RWRpdCgpOwotCXN0YXRpYwl2b2lkCQkJCQkJCURlbEVkaXQoSUZYX0VkaXQqIHBFZGl0KTsKK2NsYXNzIElGWF9FZGl0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBJRlhfRWRpdCogTmV3RWRpdCgpOworICBzdGF0aWMgdm9pZCBEZWxFZGl0KElGWF9FZGl0KiBwRWRpdCk7CiAKLSAgICAgICAgLy9zZXQgYSBJRlhfRWRpdF9Gb250TWFwIHBvaW50ZXIgaW1wbGVtZW50ZWQgYnkgdXNlci4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0Rm9udE1hcChJRlhfRWRpdF9Gb250TWFwKiBwRm9udE1hcCkgPSAwOwotCS8vaWYgdXNlciBkb24ndCBsaWtlIHRvIHVzZSBGb250TWFwLCBpbXBsZW1lbnQgVlRQcm92aWRlciBhbmQgc2V0IGl0IGRpcmVjdGx5LgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRWVFByb3ZpZGVyKElQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyKiBwUHJvdmlkZXIpID0gMDsKLQkvL3NldCBhIElGWF9FZGl0X05vdGlmeSBwb2ludGVyIGltcGxlbWVudGVkIGJ5IHVzZXIuCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldE5vdGlmeShJRlhfRWRpdF9Ob3RpZnkgKiBwTm90aWZ5KSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJCVNldE9wck5vdGlmeShJRlhfRWRpdF9PcHJOb3RpZnkqIHBPcHJOb3RpZnkpID0gMDsKLQkvL2dldCBhIHBvaW50ZXIgYWxsb2NhdGVkIGJ5IENQREZfRWRpdCwgYnkgdGhpcyBwb2ludGVyLCB1c2VyIGNhbiBpdGVyYXRlIHRoZSBjb250ZW50cyBvZiBlZGl0LCBidXQgZG9uJ3QgbmVlZCB0byByZWxlYXNlLgotCXZpcnR1YWwgSUZYX0VkaXRfSXRlcmF0b3IqCQkJCUdldEl0ZXJhdG9yKCkgPSAwOwotCS8vZ2V0IGEgVlQgcG9pbnRlciByZWxhdGl2ZSB0byB0aGlzIGVkaXQuCi0JdmlydHVhbCBJUERGX1ZhcmlhYmxlVGV4dCoJCQkJR2V0VmFyaWFibGVUZXh0KCkgPSAwOwotCS8vZ2V0IHRoZSBJRlhfRWRpdF9Gb250TWFwIHBvaW50ZXIgc2V0IGJ5IHVzZXIuCi0JdmlydHVhbCBJRlhfRWRpdF9Gb250TWFwKgkJCQlHZXRGb250TWFwKCkgPSAwOworICAvLyBzZXQgYSBJRlhfRWRpdF9Gb250TWFwIHBvaW50ZXIgaW1wbGVtZW50ZWQgYnkgdXNlci4KKyAgdmlydHVhbCB2b2lkIFNldEZvbnRNYXAoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXApID0gMDsKKyAgLy8gaWYgdXNlciBkb24ndCBsaWtlIHRvIHVzZSBGb250TWFwLCBpbXBsZW1lbnQgVlRQcm92aWRlciBhbmQgc2V0IGl0CisgIC8vIGRpcmVjdGx5LgorICB2aXJ0dWFsIHZvaWQgU2V0VlRQcm92aWRlcihJUERGX1ZhcmlhYmxlVGV4dF9Qcm92aWRlciogcFByb3ZpZGVyKSA9IDA7CisgIC8vIHNldCBhIElGWF9FZGl0X05vdGlmeSBwb2ludGVyIGltcGxlbWVudGVkIGJ5IHVzZXIuCisgIHZpcnR1YWwgdm9pZCBTZXROb3RpZnkoSUZYX0VkaXRfTm90aWZ5KiBwTm90aWZ5KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRPcHJOb3RpZnkoSUZYX0VkaXRfT3ByTm90aWZ5KiBwT3ByTm90aWZ5KSA9IDA7CisgIC8vIGdldCBhIHBvaW50ZXIgYWxsb2NhdGVkIGJ5IENQREZfRWRpdCwgYnkgdGhpcyBwb2ludGVyLCB1c2VyIGNhbiBpdGVyYXRlIHRoZQorICAvLyBjb250ZW50cyBvZiBlZGl0LCBidXQgZG9uJ3QgbmVlZCB0byByZWxlYXNlLgorICB2aXJ0dWFsIElGWF9FZGl0X0l0ZXJhdG9yKiBHZXRJdGVyYXRvcigpID0gMDsKKyAgLy8gZ2V0IGEgVlQgcG9pbnRlciByZWxhdGl2ZSB0byB0aGlzIGVkaXQuCisgIHZpcnR1YWwgSVBERl9WYXJpYWJsZVRleHQqIEdldFZhcmlhYmxlVGV4dCgpID0gMDsKKyAgLy8gZ2V0IHRoZSBJRlhfRWRpdF9Gb250TWFwIHBvaW50ZXIgc2V0IGJ5IHVzZXIuCisgIHZpcnR1YWwgSUZYX0VkaXRfRm9udE1hcCogR2V0Rm9udE1hcCgpID0gMDsKIAotCS8vaW5pdGlhbGl6ZSB0aGUgZWRpdC4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJSW5pdGlhbGl6ZSgpID0gMDsKKyAgLy8gaW5pdGlhbGl6ZSB0aGUgZWRpdC4KKyAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoKSA9IDA7CiAKLQkvL3NldCB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSB0ZXh0IGFyZWEuCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0LCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKLQkvL3NldCB0aGUgc2Nyb2xsIG9yaWdpbgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRTY3JvbGxQb3MoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSA9IDA7CisgIC8vIHNldCB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSB0ZXh0IGFyZWEuCisgIHZpcnR1YWwgdm9pZCBTZXRQbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0JiByZWN0LCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKKyAgLy8gc2V0IHRoZSBzY3JvbGwgb3JpZ2luCisgIHZpcnR1YWwgdm9pZCBTZXRTY3JvbGxQb3MoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpID0gMDsKIAotCS8vc2V0IHRoZSBob3Jpem9udGFsIHRleHQgYWxpZ25tZW50IGluIHRleHQgYm94LCBuRm9ybWF0ICgwOmxlZnQgMTptaWRkbGUgMjpyaWdodCkuCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldEFsaWdubWVudEgoRlhfSU5UMzIgbkZvcm1hdCA9IDAsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOwotCS8vc2V0IHRoZSB2ZXJ0aWNhbCB0ZXh0IGFsaWdubWVudCBpbiB0ZXh0IGJveCwgbkZvcm1hdCAoMDp0b3AgMTpjZW50ZXIgMjpib3R0b20pLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBbGlnbm1lbnRWKEZYX0lOVDMyIG5Gb3JtYXQgPSAwLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKLQkvL2lmIHRoZSB0ZXh0IGlzIHNob3duIGluIHNlY3JldCAsIHNldCBhIGNoYXJhY3RlciBmb3Igc3Vic3RpdHV0ZS4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0UGFzc3dvcmRDaGFyKEZYX1dPUkQgd1N1YldvcmQgPSAnKicsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOwotCS8vc2V0IHRoZSBtYXhpbWFsIGNvdW50IG9mIHdvcmRzIG9mIHRoZSB0ZXh0LgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRMaW1pdENoYXIoRlhfSU5UMzIgbkxpbWl0Q2hhciA9IDAsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOwotCS8vaWYgc2V0IHRoZSBjb3VudCBvZiBjaGFyQXJyYXkgLCB0aGVuIGFsbCB3b3JkcyBpcyBzaG93biBpbiBlcXVhbCBzcGFjZS4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0Q2hhckFycmF5KEZYX0lOVDMyIG5DaGFyQXJyYXkgPSAwLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKLQkvL3NldCB0aGUgc3BhY2Ugb2YgdHdvIGNoYXJhY3RlcnMuCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlID0gMC4wZiwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7Ci0JLy9zZXQgdGhlIGhvcml6b250YWwgc2NhbGUgb2YgYWxsIGNoYXJhY3RlcnMuCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldEhvcnpTY2FsZShGWF9JTlQzMiBuSG9yelNjYWxlID0gMTAwLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKLQkvL3NldCB0aGUgbGVhZGluZyBvZiBhbGwgbGluZXMKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKLQkvL2lmIHNldCwgQ1JMRiBpcyBhbGxvd2VkLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRNdWx0aUxpbmUoRlhfQk9PTCBiTXVsdGlMaW5lID0gVFJVRSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7Ci0JLy9pZiBzZXQsIGFsbCB3b3JkcyBhdXRvIGZpdCB0aGUgd2lkdGggb2YgdGhlIGJvdW5kaW5nIGJveC4JCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldEF1dG9SZXR1cm4oRlhfQk9PTCBiQXV0byA9IFRSVUUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOwotCS8vaWYgc2V0LCBhIGZvbnQgc2l6ZSBpcyBjYWxjdWxhdGVkIHRvIGZ1bGwgZml0IHRoZSBib3VuZGluZyBib3guCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldEF1dG9Gb250U2l6ZShGWF9CT09MIGJBdXRvID0gVFJVRSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7Ci0JLy9pcyBzZXQsIHRoZSB0ZXh0IGlzIGFsbG93ZWQgdG8gc2Nyb2xsLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRBdXRvU2Nyb2xsKEZYX0JPT0wgYkF1dG8gPSBUUlVFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKLQkvL3NldCB0aGUgZm9udCBzaXplIG9mIGFsbCB3b3Jkcy4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKLQkvL3RoZSB0ZXh0IGlzIGFsbG93ZWQgdG8gYXV0by1zY3JvbGwsIGFsbG93IHRoZSB0ZXh0IG92ZXJmbG93PwotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRUZXh0T3ZlcmZsb3coRlhfQk9PTCBiQWxsb3dlZCA9IEZBTFNFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKKyAgLy8gc2V0IHRoZSBob3Jpem9udGFsIHRleHQgYWxpZ25tZW50IGluIHRleHQgYm94LCBuRm9ybWF0ICgwOmxlZnQgMTptaWRkbGUKKyAgLy8gMjpyaWdodCkuCisgIHZpcnR1YWwgdm9pZCBTZXRBbGlnbm1lbnRIKGludDMyX3QgbkZvcm1hdCA9IDAsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworICAvLyBzZXQgdGhlIHZlcnRpY2FsIHRleHQgYWxpZ25tZW50IGluIHRleHQgYm94LCBuRm9ybWF0ICgwOnRvcCAxOmNlbnRlcgorICAvLyAyOmJvdHRvbSkuCisgIHZpcnR1YWwgdm9pZCBTZXRBbGlnbm1lbnRWKGludDMyX3QgbkZvcm1hdCA9IDAsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworICAvLyBpZiB0aGUgdGV4dCBpcyBzaG93biBpbiBzZWNyZXQgLCBzZXQgYSBjaGFyYWN0ZXIgZm9yIHN1YnN0aXR1dGUuCisgIHZpcnR1YWwgdm9pZCBTZXRQYXNzd29yZENoYXIoRlhfV09SRCB3U3ViV29yZCA9ICcqJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKKyAgLy8gc2V0IHRoZSBtYXhpbWFsIGNvdW50IG9mIHdvcmRzIG9mIHRoZSB0ZXh0LgorICB2aXJ0dWFsIHZvaWQgU2V0TGltaXRDaGFyKGludDMyX3QgbkxpbWl0Q2hhciA9IDAsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworICAvLyBpZiBzZXQgdGhlIGNvdW50IG9mIGNoYXJBcnJheSAsIHRoZW4gYWxsIHdvcmRzIGlzIHNob3duIGluIGVxdWFsIHNwYWNlLgorICB2aXJ0dWFsIHZvaWQgU2V0Q2hhckFycmF5KGludDMyX3QgbkNoYXJBcnJheSA9IDAsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworICAvLyBzZXQgdGhlIHNwYWNlIG9mIHR3byBjaGFyYWN0ZXJzLgorICB2aXJ0dWFsIHZvaWQgU2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UgPSAwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworICAvLyBzZXQgdGhlIGhvcml6b250YWwgc2NhbGUgb2YgYWxsIGNoYXJhY3RlcnMuCisgIHZpcnR1YWwgdm9pZCBTZXRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlID0gMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworICAvLyBzZXQgdGhlIGxlYWRpbmcgb2YgYWxsIGxpbmVzCisgIHZpcnR1YWwgdm9pZCBTZXRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworICAvLyBpZiBzZXQsIENSTEYgaXMgYWxsb3dlZC4KKyAgdmlydHVhbCB2b2lkIFNldE11bHRpTGluZShGWF9CT09MIGJNdWx0aUxpbmUgPSBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworICAvLyBpZiBzZXQsIGFsbCB3b3JkcyBhdXRvIGZpdCB0aGUgd2lkdGggb2YgdGhlIGJvdW5kaW5nIGJveC4KKyAgdmlydHVhbCB2b2lkIFNldEF1dG9SZXR1cm4oRlhfQk9PTCBiQXV0byA9IFRSVUUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOworICAvLyBpZiBzZXQsIGEgZm9udCBzaXplIGlzIGNhbGN1bGF0ZWQgdG8gZnVsbCBmaXQgdGhlIGJvdW5kaW5nIGJveC4KKyAgdmlydHVhbCB2b2lkIFNldEF1dG9Gb250U2l6ZShGWF9CT09MIGJBdXRvID0gVFJVRSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSA9IDA7CisgIC8vIGlzIHNldCwgdGhlIHRleHQgaXMgYWxsb3dlZCB0byBzY3JvbGwuCisgIHZpcnR1YWwgdm9pZCBTZXRBdXRvU2Nyb2xsKEZYX0JPT0wgYkF1dG8gPSBUUlVFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKKyAgLy8gc2V0IHRoZSBmb250IHNpemUgb2YgYWxsIHdvcmRzLgorICB2aXJ0dWFsIHZvaWQgU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKKyAgLy8gdGhlIHRleHQgaXMgYWxsb3dlZCB0byBhdXRvLXNjcm9sbCwgYWxsb3cgdGhlIHRleHQgb3ZlcmZsb3c/CisgIHZpcnR1YWwgdm9pZCBTZXRUZXh0T3ZlcmZsb3coRlhfQk9PTCBiQWxsb3dlZCA9IEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgPSAwOwogCi0JLy9xdWVyeSBpZiB0aGUgZWRpdCBpcyByaWNoZWRpdC4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSXNSaWNoVGV4dCgpIGNvbnN0ID0gMDsKLQkvL3NldCB0aGUgZWRpdCBpcyByaWNoZWRpdC4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0UmljaFRleHQoRlhfQk9PTCBiUmljaFRleHQgPSBUUlVFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKLQkvL3NldCB0aGUgZm9udHNpemUgb2Ygc2VsZWN0ZWQgdGV4dC4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJU2V0UmljaEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgPSAwOwkKLQkvL3NldCB0aGUgZm9udGluZGV4IG9mIHNlbGVjdGVkIHRleHQsIHVzZXIgY2FuIGNoYW5nZSB0aGUgZm9udCBvZiBzZWxlY3RlZCB0ZXh0LgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRSaWNoRm9udEluZGV4KEZYX0lOVDMyIG5Gb250SW5kZXgpID0gMDsKLQkvL3NldCB0aGUgdGV4dGNvbG9yIG9mIHNlbGVjdGVkIHRleHQuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCVNldFJpY2hUZXh0Q29sb3IoRlhfQ09MT1JSRUYgZHdDb2xvcikgPSAwOwotCS8vc2V0IHRoZSB0ZXh0IHNjcmlwdCB0eXBlIG9mIHNlbGVjdGVkIHRleHQuICgwOm5vcm1hbCAxOnN1cGVyc2NyaXB0IDI6c3Vic2NyaXB0KQotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRSaWNoVGV4dFNjcmlwdChGWF9JTlQzMiBuU2NyaXB0VHlwZSkgPSAwOwkKLQkvL3NldCB0aGUgYm9sZCBmb250IHN0eWxlIG9mIHNlbGVjdGVkIHRleHQuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCVNldFJpY2hUZXh0Qm9sZChGWF9CT09MIGJCb2xkID0gVFJVRSkgPSAwOwotCS8vc2V0IHRoZSBpdGFsaWMgZm9udCBzdHlsZSBvZiBzZWxlY3RlZCB0ZXh0LgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRSaWNoVGV4dEl0YWxpYyhGWF9CT09MIGJJdGFsaWMgPSBUUlVFKSA9IDA7Ci0JLy9zZXQgdGhlIHVuZGVybGluZSBzdHlsZSBvZiBzZWxlY3RlZCB0ZXh0LgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRSaWNoVGV4dFVuZGVybGluZShGWF9CT09MIGJVbmRlcmxpbmUgPSBUUlVFKSA9IDA7Ci0JLy9zZXQgdGhlIGNyb3Nzb3V0IHN0eWxlIG9mIHNlbGVjdGVkIHRleHQuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCVNldFJpY2hUZXh0Q3Jvc3NvdXQoRlhfQk9PTCBiQ3Jvc3NvdXQgPSBUUlVFKSA9IDA7Ci0JLy9zZXQgdGhlIGNoYXJzcGFjZSBvZiBzZWxlY3RlZCB0ZXh0LCBpbiB1c2VyIGNvb3JkaW5hdGUuCi0JdmlydHVhbAlGWF9CT09MCQkJCQkJCVNldFJpY2hUZXh0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpID0gMDsKLQkvL3NldCB0aGUgaG9yaXpvbnRhbCBzY2FsZSBvZiBzZWxlY3RlZCB0ZXh0LCBkZWZhdWx0IHZhbHVlIGlzIDEwMC4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJU2V0UmljaFRleHRIb3J6U2NhbGUoRlhfSU5UMzIgbkhvcnpTY2FsZSA9IDEwMCkgPSAwOwotCS8vc2V0IHRoZSBsZWFkaW5nIG9mIHNlbGVjdGVkIHNlY3Rpb24sIGluIHVzZXIgY29vcmRpbmF0ZS4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJU2V0UmljaFRleHRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcpID0gMDsKLQkvL3NldCB0aGUgaW5kZW50IG9mIHNlbGVjdGVkIHNlY3Rpb24sIGluIHVzZXIgY29vcmRpbmF0ZS4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJU2V0UmljaFRleHRMaW5lSW5kZW50KEZYX0ZMT0FUIGZMaW5lSW5kZW50KSA9IDA7Ci0JLy9zZXQgdGhlIGFsaWdubWVudCBvZiBzZWxlY3RlZCBzZWN0aW9uLCBuQWxpZ25tZW50KDA6bGVmdCAxOm1pZGRsZSAyOnJpZ2h0KQotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlTZXRSaWNoVGV4dEFsaWdubWVudChGWF9JTlQzMiBuQWxpZ25tZW50KSA9IDA7CisgIC8vIHF1ZXJ5IGlmIHRoZSBlZGl0IGlzIHJpY2hlZGl0LgorICB2aXJ0dWFsIEZYX0JPT0wgSXNSaWNoVGV4dCgpIGNvbnN0ID0gMDsKKyAgLy8gc2V0IHRoZSBlZGl0IGlzIHJpY2hlZGl0LgorICB2aXJ0dWFsIHZvaWQgU2V0UmljaFRleHQoRlhfQk9PTCBiUmljaFRleHQgPSBUUlVFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpID0gMDsKKyAgLy8gc2V0IHRoZSBmb250c2l6ZSBvZiBzZWxlY3RlZCB0ZXh0LgorICB2aXJ0dWFsIEZYX0JPT0wgU2V0UmljaEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgPSAwOworICAvLyBzZXQgdGhlIGZvbnRpbmRleCBvZiBzZWxlY3RlZCB0ZXh0LCB1c2VyIGNhbiBjaGFuZ2UgdGhlIGZvbnQgb2Ygc2VsZWN0ZWQKKyAgLy8gdGV4dC4KKyAgdmlydHVhbCBGWF9CT09MIFNldFJpY2hGb250SW5kZXgoaW50MzJfdCBuRm9udEluZGV4KSA9IDA7CisgIC8vIHNldCB0aGUgdGV4dGNvbG9yIG9mIHNlbGVjdGVkIHRleHQuCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRSaWNoVGV4dENvbG9yKEZYX0NPTE9SUkVGIGR3Q29sb3IpID0gMDsKKyAgLy8gc2V0IHRoZSB0ZXh0IHNjcmlwdCB0eXBlIG9mIHNlbGVjdGVkIHRleHQuICgwOm5vcm1hbCAxOnN1cGVyc2NyaXB0CisgIC8vIDI6c3Vic2NyaXB0KQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0UmljaFRleHRTY3JpcHQoaW50MzJfdCBuU2NyaXB0VHlwZSkgPSAwOworICAvLyBzZXQgdGhlIGJvbGQgZm9udCBzdHlsZSBvZiBzZWxlY3RlZCB0ZXh0LgorICB2aXJ0dWFsIEZYX0JPT0wgU2V0UmljaFRleHRCb2xkKEZYX0JPT0wgYkJvbGQgPSBUUlVFKSA9IDA7CisgIC8vIHNldCB0aGUgaXRhbGljIGZvbnQgc3R5bGUgb2Ygc2VsZWN0ZWQgdGV4dC4KKyAgdmlydHVhbCBGWF9CT09MIFNldFJpY2hUZXh0SXRhbGljKEZYX0JPT0wgYkl0YWxpYyA9IFRSVUUpID0gMDsKKyAgLy8gc2V0IHRoZSB1bmRlcmxpbmUgc3R5bGUgb2Ygc2VsZWN0ZWQgdGV4dC4KKyAgdmlydHVhbCBGWF9CT09MIFNldFJpY2hUZXh0VW5kZXJsaW5lKEZYX0JPT0wgYlVuZGVybGluZSA9IFRSVUUpID0gMDsKKyAgLy8gc2V0IHRoZSBjcm9zc291dCBzdHlsZSBvZiBzZWxlY3RlZCB0ZXh0LgorICB2aXJ0dWFsIEZYX0JPT0wgU2V0UmljaFRleHRDcm9zc291dChGWF9CT09MIGJDcm9zc291dCA9IFRSVUUpID0gMDsKKyAgLy8gc2V0IHRoZSBjaGFyc3BhY2Ugb2Ygc2VsZWN0ZWQgdGV4dCwgaW4gdXNlciBjb29yZGluYXRlLgorICB2aXJ0dWFsIEZYX0JPT0wgU2V0UmljaFRleHRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSkgPSAwOworICAvLyBzZXQgdGhlIGhvcml6b250YWwgc2NhbGUgb2Ygc2VsZWN0ZWQgdGV4dCwgZGVmYXVsdCB2YWx1ZSBpcyAxMDAuCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRSaWNoVGV4dEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUgPSAxMDApID0gMDsKKyAgLy8gc2V0IHRoZSBsZWFkaW5nIG9mIHNlbGVjdGVkIHNlY3Rpb24sIGluIHVzZXIgY29vcmRpbmF0ZS4KKyAgdmlydHVhbCBGWF9CT09MIFNldFJpY2hUZXh0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nKSA9IDA7CisgIC8vIHNldCB0aGUgaW5kZW50IG9mIHNlbGVjdGVkIHNlY3Rpb24sIGluIHVzZXIgY29vcmRpbmF0ZS4KKyAgdmlydHVhbCBGWF9CT09MIFNldFJpY2hUZXh0TGluZUluZGVudChGWF9GTE9BVCBmTGluZUluZGVudCkgPSAwOworICAvLyBzZXQgdGhlIGFsaWdubWVudCBvZiBzZWxlY3RlZCBzZWN0aW9uLCBuQWxpZ25tZW50KDA6bGVmdCAxOm1pZGRsZSAyOnJpZ2h0KQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0UmljaFRleHRBbGlnbm1lbnQoaW50MzJfdCBuQWxpZ25tZW50KSA9IDA7CiAKLQkvL3NldCB0aGUgc2VsZWN0ZWQgcmFuZ2Ugb2YgdGV4dC4KLQkvL2lmIG5TdGFydENoYXIgPT0gMCBhbmQgbkVuZENoYXIgPT0gLTEsIHNlbGVjdCBhbGwgdGhlIHRleHQuCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldFNlbChGWF9JTlQzMiBuU3RhcnRDaGFyLEZYX0lOVDMyIG5FbmRDaGFyKSA9IDA7Ci0JLy9nZXQgdGhlIHNlbGVjdGVkIHJhbmdlIG9mIHRleHQuCi0JdmlydHVhbCB2b2lkCQkJCQkJCUdldFNlbChGWF9JTlQzMiAmIG5TdGFydENoYXIsIEZYX0lOVDMyICYgbkVuZENoYXIpIGNvbnN0ID0gMDsKLQkvL3NlbGVjdCBhbGwgdGhlIHRleHQuCi0JdmlydHVhbAl2b2lkCQkJCQkJCVNlbGVjdEFsbCgpID0gMDsKLQkvL3NldCB0ZXh0IGlzIG5vdCBzZWxlY3RlZC4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2VsZWN0Tm9uZSgpID0gMDsJCQotCS8vZ2V0IHRoZSBjYXJldCBwb3NpdGlvbi4KLQl2aXJ0dWFsIEZYX0lOVDMyCQkJCQkJR2V0Q2FyZXQoKSBjb25zdCA9IDA7Ci0JdmlydHVhbCBDUFZUX1dvcmRQbGFjZQkJCQkJR2V0Q2FyZXRXb3JkUGxhY2UoKSBjb25zdCA9IDA7Ci0JLy9nZXQgdGhlIHN0cmluZyBvZiBzZWxlY3RlZCB0ZXh0LgotCXZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldFNlbFRleHQoKSBjb25zdCA9IDA7Ci0JLy9nZXQgdGhlIHRleHQgY29uZW50Ci0JdmlydHVhbCBDRlhfV2lkZVN0cmluZwkJCQkJR2V0VGV4dCgpIGNvbnN0ID0gMDsKLQkvL3F1ZXJ5IGlmIGFueSB0ZXh0IGlzIHNlbGVjdGVkLgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlJc1NlbGVjdGVkKCkgY29uc3QgPSAwOwkKLQkvL2dldCB0aGUgc2Nyb2xsIG9yaWdpbgotCXZpcnR1YWwgQ1BERl9Qb2ludAkJCQkJCUdldFNjcm9sbFBvcygpIGNvbnN0ID0gMDsKLQkvL2dldCB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSB0ZXh0IGFyZWEuCi0JdmlydHVhbCBDUERGX1JlY3QJCQkJCQlHZXRQbGF0ZVJlY3QoKSBjb25zdCA9IDA7Ci0JLy9nZXQgdGhlIGZhY3QgYXJlYSBvZiB0aGUgdGV4dC4KLQl2aXJ0dWFsIENQREZfUmVjdAkJCQkJCUdldENvbnRlbnRSZWN0KCkgY29uc3QgPSAwOwotCS8vZ2V0IHRoZSB2aXNpYmxlIHdvcmQgcmFuZ2UKLQl2aXJ0dWFsIENQVlRfV29yZFJhbmdlCQkJCQlHZXRWaXNpYmxlV29yZFJhbmdlKCkgY29uc3QgPSAwOwotCS8vZ2V0IHRoZSB3aG9sZSB3b3JkIHJhbmdlCi0JdmlydHVhbCBDUFZUX1dvcmRSYW5nZQkJCQkJR2V0V2hvbGVXb3JkUmFuZ2UoKSBjb25zdCA9IDA7Ci0JLy9nZXQgdGhlIHdvcmQgcmFuZ2Ugb2Ygc2VsZWN0IHRleHQKLQl2aXJ0dWFsIENQVlRfV29yZFJhbmdlCQkJCQlHZXRTZWxlY3RXb3JkUmFuZ2UoKSBjb25zdCA9IDA7CisgIC8vIHNldCB0aGUgc2VsZWN0ZWQgcmFuZ2Ugb2YgdGV4dC4KKyAgLy8gaWYgblN0YXJ0Q2hhciA9PSAwIGFuZCBuRW5kQ2hhciA9PSAtMSwgc2VsZWN0IGFsbCB0aGUgdGV4dC4KKyAgdmlydHVhbCB2b2lkIFNldFNlbChpbnQzMl90IG5TdGFydENoYXIsIGludDMyX3QgbkVuZENoYXIpID0gMDsKKyAgLy8gZ2V0IHRoZSBzZWxlY3RlZCByYW5nZSBvZiB0ZXh0LgorICB2aXJ0dWFsIHZvaWQgR2V0U2VsKGludDMyX3QmIG5TdGFydENoYXIsIGludDMyX3QmIG5FbmRDaGFyKSBjb25zdCA9IDA7CisgIC8vIHNlbGVjdCBhbGwgdGhlIHRleHQuCisgIHZpcnR1YWwgdm9pZCBTZWxlY3RBbGwoKSA9IDA7CisgIC8vIHNldCB0ZXh0IGlzIG5vdCBzZWxlY3RlZC4KKyAgdmlydHVhbCB2b2lkIFNlbGVjdE5vbmUoKSA9IDA7CisgIC8vIGdldCB0aGUgY2FyZXQgcG9zaXRpb24uCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDYXJldCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZSBHZXRDYXJldFdvcmRQbGFjZSgpIGNvbnN0ID0gMDsKKyAgLy8gZ2V0IHRoZSBzdHJpbmcgb2Ygc2VsZWN0ZWQgdGV4dC4KKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBHZXRTZWxUZXh0KCkgY29uc3QgPSAwOworICAvLyBnZXQgdGhlIHRleHQgY29uZW50CisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0VGV4dCgpIGNvbnN0ID0gMDsKKyAgLy8gcXVlcnkgaWYgYW55IHRleHQgaXMgc2VsZWN0ZWQuCisgIHZpcnR1YWwgRlhfQk9PTCBJc1NlbGVjdGVkKCkgY29uc3QgPSAwOworICAvLyBnZXQgdGhlIHNjcm9sbCBvcmlnaW4KKyAgdmlydHVhbCBDUERGX1BvaW50IEdldFNjcm9sbFBvcygpIGNvbnN0ID0gMDsKKyAgLy8gZ2V0IHRoZSBib3VuZGluZyBib3ggb2YgdGhlIHRleHQgYXJlYS4KKyAgdmlydHVhbCBDUERGX1JlY3QgR2V0UGxhdGVSZWN0KCkgY29uc3QgPSAwOworICAvLyBnZXQgdGhlIGZhY3QgYXJlYSBvZiB0aGUgdGV4dC4KKyAgdmlydHVhbCBDUERGX1JlY3QgR2V0Q29udGVudFJlY3QoKSBjb25zdCA9IDA7CisgIC8vIGdldCB0aGUgdmlzaWJsZSB3b3JkIHJhbmdlCisgIHZpcnR1YWwgQ1BWVF9Xb3JkUmFuZ2UgR2V0VmlzaWJsZVdvcmRSYW5nZSgpIGNvbnN0ID0gMDsKKyAgLy8gZ2V0IHRoZSB3aG9sZSB3b3JkIHJhbmdlCisgIHZpcnR1YWwgQ1BWVF9Xb3JkUmFuZ2UgR2V0V2hvbGVXb3JkUmFuZ2UoKSBjb25zdCA9IDA7CisgIC8vIGdldCB0aGUgd29yZCByYW5nZSBvZiBzZWxlY3QgdGV4dAorICB2aXJ0dWFsIENQVlRfV29yZFJhbmdlIEdldFNlbGVjdFdvcmRSYW5nZSgpIGNvbnN0ID0gMDsKIAotCS8vc2VuZCB0aGUgbW91c2Vkb3duIG1lc3NhZ2UgdG8gZWRpdCBmb3IgcmVzcG9uc2UuCi0JLy9pZiBTaGlmdCBrZXkgaXMgaG9sZCwgYlNoaWZ0IGlzIFRSVUUsIGlzIEN0cmwga2V5IGlzIGhvbGQsIGJDdHJsIGlzIFRSVUUuCi0JdmlydHVhbCB2b2lkCQkJCQkJCU9uTW91c2VEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7Ci0JLy9zZW5kIHRoZSBtb3VzZW1vdmUgbWVzc2FnZSB0byBlZGl0IHdoZW4gbW91c2UgZG93biBpcyBUUlVFLgotCXZpcnR1YWwgdm9pZAkJCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOwotCS8vc2VuZCB0aGUgVVAga2V5IG1lc3NhZ2UgdG8gZWRpdC4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19VUChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7Ci0JLy9zZW5kIHRoZSBET1dOIGtleSBtZXNzYWdlIHRvIGVkaXQuCi0JdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfRE9XTihGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7Ci0JLy9zZW5kIHRoZSBMRUZUIGtleSBtZXNzYWdlIHRvIGVkaXQuCi0JdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfTEVGVChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7Ci0JLy9zZW5kIHRoZSBSSUdIVCBrZXkgbWVzc2FnZSB0byBlZGl0LgotCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX1JJR0hUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKLQkvL3NlbmQgdGhlIEhPTUUga2V5IG1lc3NhZ2UgdG8gZWRpdC4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19IT01FKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKLQkvL3NlbmQgdGhlIEVORCBrZXkgbWVzc2FnZSB0byBlZGl0LgotCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX0VORChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7CisgIC8vIHNlbmQgdGhlIG1vdXNlZG93biBtZXNzYWdlIHRvIGVkaXQgZm9yIHJlc3BvbnNlLgorICAvLyBpZiBTaGlmdCBrZXkgaXMgaG9sZCwgYlNoaWZ0IGlzIFRSVUUsIGlzIEN0cmwga2V5IGlzIGhvbGQsIGJDdHJsIGlzIFRSVUUuCisgIHZpcnR1YWwgdm9pZCBPbk1vdXNlRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ3RybCkgPSAwOworICAvLyBzZW5kIHRoZSBtb3VzZW1vdmUgbWVzc2FnZSB0byBlZGl0IHdoZW4gbW91c2UgZG93biBpcyBUUlVFLgorICB2aXJ0dWFsIHZvaWQgT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkN0cmwpID0gMDsKKyAgLy8gc2VuZCB0aGUgVVAga2V5IG1lc3NhZ2UgdG8gZWRpdC4KKyAgdmlydHVhbCB2b2lkIE9uVktfVVAoRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpID0gMDsKKyAgLy8gc2VuZCB0aGUgRE9XTiBrZXkgbWVzc2FnZSB0byBlZGl0LgorICB2aXJ0dWFsIHZvaWQgT25WS19ET1dOKEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJDdHJsKSA9IDA7CisgIC8vIHNlbmQgdGhlIExFRlQga2V5IG1lc3NhZ2UgdG8gZWRpdC4KKyAgdmlydHVhbCB2b2lkIE9uVktfTEVGVChGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgPSAwOworICAvLyBzZW5kIHRoZSBSSUdIVCBrZXkgbWVzc2FnZSB0byBlZGl0LgorICB2aXJ0dWFsIHZvaWQgT25WS19SSUdIVChGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgPSAwOworICAvLyBzZW5kIHRoZSBIT01FIGtleSBtZXNzYWdlIHRvIGVkaXQuCisgIHZpcnR1YWwgdm9pZCBPblZLX0hPTUUoRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpID0gMDsKKyAgLy8gc2VuZCB0aGUgRU5EIGtleSBtZXNzYWdlIHRvIGVkaXQuCisgIHZpcnR1YWwgdm9pZCBPblZLX0VORChGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgPSAwOwogCi0JLy9wdXQgdGV4dCBpbnRvIGVkaXQuCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldFRleHQoRlhfTFBDV1NUUiB0ZXh0LEZYX0lOVDMyIGNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQsCi0JCQkJCQkJCQkJCQkJY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyA9IE5VTEwsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzID0gTlVMTCkgPSAwOwkKLQkvL2luc2VydCBhIHdvcmQgaW50byB0aGUgZWRpdC4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSW5zZXJ0V29yZChGWF9XT1JEIHdvcmQsIEZYX0lOVDMyIGNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpID0gMDsKLQkvL2luc2VydCBhIHJldHVybiBpbnRvIHRoZSBlZGl0LgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlJbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyA9IE5VTEwsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzID0gTlVMTCkgPSAwOwkKLQkvL2luc2VydCB0ZXh0IGludG8gdGhlIGVkaXQuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCUluc2VydFRleHQoRlhfTFBDV1NUUiB0ZXh0LCBGWF9JTlQzMiBjaGFyc2V0ID0gREVGQVVMVF9DSEFSU0VULAotCQkJCQkJCQkJCQkJCWNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMgPSBOVUxMLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpID0gMDsKLQkvL2RvIGJhY2tzcGFjZSBvcGVyYXRpb24uCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCUJhY2tzcGFjZSgpID0gMDsKLQkvL2RvIGRlbGV0ZSBvcGVyYXRpb24uCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCURlbGV0ZSgpID0gMDsJCi0JLy9kZWxldGUgdGhlIHNlbGVjdGVkIHRleHQuCi0JdmlydHVhbCBGWF9CT09MCQkJCQkJCUNsZWFyKCkgPSAwOworICAvLyBwdXQgdGV4dCBpbnRvIGVkaXQuCisgIHZpcnR1YWwgdm9pZCBTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMqIHBTZWNQcm9wcyA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzID0gTlVMTCkgPSAwOworICAvLyBpbnNlcnQgYSB3b3JkIGludG8gdGhlIGVkaXQuCisgIHZpcnR1YWwgRlhfQk9PTCBJbnNlcnRXb3JkKEZYX1dPUkQgd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0ID0gREVGQVVMVF9DSEFSU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcyA9IE5VTEwpID0gMDsKKyAgLy8gaW5zZXJ0IGEgcmV0dXJuIGludG8gdGhlIGVkaXQuCisgIHZpcnR1YWwgRlhfQk9PTCBJbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcyA9IE5VTEwpID0gMDsKKyAgLy8gaW5zZXJ0IHRleHQgaW50byB0aGUgZWRpdC4KKyAgdmlydHVhbCBGWF9CT09MIEluc2VydFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMgPSBOVUxMKSA9IDA7CisgIC8vIGRvIGJhY2tzcGFjZSBvcGVyYXRpb24uCisgIHZpcnR1YWwgRlhfQk9PTCBCYWNrc3BhY2UoKSA9IDA7CisgIC8vIGRvIGRlbGV0ZSBvcGVyYXRpb24uCisgIHZpcnR1YWwgRlhfQk9PTCBEZWxldGUoKSA9IDA7CisgIC8vIGRlbGV0ZSB0aGUgc2VsZWN0ZWQgdGV4dC4KKyAgdmlydHVhbCBGWF9CT09MIENsZWFyKCkgPSAwOwogCi0JLy9kbyBSZWRvIG9wZXJhdGlvbi4KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJUmVkbygpID0gMDsKLQkvL2RvIFVuZG8gb3BlcmF0aW9uLgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlVbmRvKCkgPSAwOwotCS8vbW92ZSBjYXJldAotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRDYXJldChGWF9JTlQzMiBuUG9zKSA9IDA7CisgIC8vIGRvIFJlZG8gb3BlcmF0aW9uLgorICB2aXJ0dWFsIEZYX0JPT0wgUmVkbygpID0gMDsKKyAgLy8gZG8gVW5kbyBvcGVyYXRpb24uCisgIHZpcnR1YWwgRlhfQk9PTCBVbmRvKCkgPSAwOworICAvLyBtb3ZlIGNhcmV0CisgIHZpcnR1YWwgdm9pZCBTZXRDYXJldChpbnQzMl90IG5Qb3MpID0gMDsKIAotCS8vYXJyYW5nZSBhbGwgd29yZHMgb3ZlciBhZ2FpbgotCXZpcnR1YWwgdm9pZAkJCQkJCQlQYWludCgpID0gMDsKLQkKLQkvL2FsbG93IHRvIHJlZnJlc2ggc2NyZWVuPwotCXZpcnR1YWwgdm9pZAkJCQkJCQlFbmFibGVSZWZyZXNoKEZYX0JPT0wgYlJlZnJlc2gpID0gMDsKKyAgLy8gYXJyYW5nZSBhbGwgd29yZHMgb3ZlciBhZ2FpbgorICB2aXJ0dWFsIHZvaWQgUGFpbnQoKSA9IDA7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJUmVmcmVzaFdvcmRSYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IpID0gMDsKKyAgLy8gYWxsb3cgdG8gcmVmcmVzaCBzY3JlZW4/CisgIHZpcnR1YWwgdm9pZCBFbmFibGVSZWZyZXNoKEZYX0JPT0wgYlJlZnJlc2gpID0gMDsKIAotCS8vYWxsb3cgdW5kby9yZWRvPwotCXZpcnR1YWwgdm9pZAkJCQkJCQlFbmFibGVVbmRvKEZYX0JPT0wgYlVuZG8pID0gMDsKKyAgdmlydHVhbCB2b2lkIFJlZnJlc2hXb3JkUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyKSA9IDA7CiAKLQkvL2FsbG93IG5vdGlmeT8KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJRW5hYmxlTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSkgPSAwOworICAvLyBhbGxvdyB1bmRvL3JlZG8/CisgIHZpcnR1YWwgdm9pZCBFbmFibGVVbmRvKEZYX0JPT0wgYlVuZG8pID0gMDsKIAotCS8vYWxsb3cgb3ByIG5vdGlmeT8KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJRW5hYmxlT3ByTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSkgPSAwOworICAvLyBhbGxvdyBub3RpZnk/CisgIHZpcnR1YWwgdm9pZCBFbmFibGVOb3RpZnkoRlhfQk9PTCBiTm90aWZ5KSA9IDA7CiAKLQkvL21hcCB3b3JkIHBsYWNlIHRvIHdvcmQgaW5kZXguCi0JdmlydHVhbCBGWF9JTlQzMgkJCQkJCVdvcmRQbGFjZVRvV29yZEluZGV4KGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0ID0gMDsKLQkvL21hcCB3b3JkIGluZGV4IHRvIHdvcmQgcGxhY2UuCi0JdmlydHVhbCBDUFZUX1dvcmRQbGFjZQkJCQkJV29yZEluZGV4VG9Xb3JkUGxhY2UoRlhfSU5UMzIgaW5kZXgpIGNvbnN0ID0gMDsKKyAgLy8gYWxsb3cgb3ByIG5vdGlmeT8KKyAgdmlydHVhbCB2b2lkIEVuYWJsZU9wck5vdGlmeShGWF9CT09MIGJOb3RpZnkpID0gMDsKIAotCS8vZ2V0IHRoZSBiZWdpbm5pbmcgcG9zaXRpb24gb2YgYSBsaW5lCi0JdmlydHVhbCBDUFZUX1dvcmRQbGFjZQkJCQkJR2V0TGluZUJlZ2luUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QgPSAwOworICAvLyBtYXAgd29yZCBwbGFjZSB0byB3b3JkIGluZGV4LgorICB2aXJ0dWFsIGludDMyX3QgV29yZFBsYWNlVG9Xb3JkSW5kZXgoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCA9IDA7CisgIC8vIG1hcCB3b3JkIGluZGV4IHRvIHdvcmQgcGxhY2UuCisgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UgV29yZEluZGV4VG9Xb3JkUGxhY2UoaW50MzJfdCBpbmRleCkgY29uc3QgPSAwOwogCi0JLy9nZXQgdGhlIGVuZGluZyBwb3NpdGlvbiBvZiBhIGxpbmUKLQl2aXJ0dWFsIENQVlRfV29yZFBsYWNlCQkJCQlHZXRMaW5lRW5kUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QgPSAwOworICAvLyBnZXQgdGhlIGJlZ2lubmluZyBwb3NpdGlvbiBvZiBhIGxpbmUKKyAgdmlydHVhbCBDUFZUX1dvcmRQbGFjZSBHZXRMaW5lQmVnaW5QbGFjZSgKKyAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgPSAwOwogCi0JLy9nZXQgdGhlIGJlZ2lubmluZyBwb3NpdGlvbiBvZiBhIHNlY3Rpb24KLQl2aXJ0dWFsIENQVlRfV29yZFBsYWNlCQkJCQlHZXRTZWN0aW9uQmVnaW5QbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdCA9IDA7CisgIC8vIGdldCB0aGUgZW5kaW5nIHBvc2l0aW9uIG9mIGEgbGluZQorICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlIEdldExpbmVFbmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0ID0gMDsKIAotCS8vZ2V0IHRoZSBlbmRpbmcgcG9zaXRpb24gb2YgYSBzZWN0aW9uCi0JdmlydHVhbCBDUFZUX1dvcmRQbGFjZQkJCQkJR2V0U2VjdGlvbkVuZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0ID0gMDsKKyAgLy8gZ2V0IHRoZSBiZWdpbm5pbmcgcG9zaXRpb24gb2YgYSBzZWN0aW9uCisgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UgR2V0U2VjdGlvbkJlZ2luUGxhY2UoCisgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0ID0gMDsKIAotCS8vc2VhcmNoIGEgd29yZHBsYWNlIGZvcm0gcG9pbnQKLQl2aXJ0dWFsIENQVlRfV29yZFBsYWNlCQkJCQlTZWFyY2hXb3JkUGxhY2UoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0ID0gMDsKKyAgLy8gZ2V0IHRoZSBlbmRpbmcgcG9zaXRpb24gb2YgYSBzZWN0aW9uCisgIHZpcnR1YWwgQ1BWVF9Xb3JkUGxhY2UgR2V0U2VjdGlvbkVuZFBsYWNlKAorICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCA9IDA7CiAKLQkvL2dldCB0aGUgZm9udCBzaXplIG9mIG5vbl9yaWNoIHRleHQgb3IgZGVmYXVsdCBmb250IHNpemUgb2YgcmljaHRleHQuCi0JdmlydHVhbCBGWF9GTE9BVAkJCQkJCUdldEZvbnRTaXplKCkgY29uc3QgPSAwOwotCS8vZ2V0IHRoZSBtYXNrIGNoYXJhY3Rlci4KLQl2aXJ0dWFsIEZYX1dPUkQJCQkJCQkJR2V0UGFzc3dvcmRDaGFyKCkgY29uc3QgPSAwOwotCS8vZ2V0IHRoZSBjb3VudCBvZiBjaGFyQXJyYXkKLQl2aXJ0dWFsIEZYX0lOVDMyCQkJCQkJR2V0Q2hhckFycmF5KCkgY29uc3QgPSAwOwotCS8vZ2V0IHRoZSBob3Jpem9udGFsIHNjYWxlIG9mIGFsbCBjaGFyYWN0ZXJzCi0JdmlydHVhbCBGWF9JTlQzMgkJCQkJCUdldEhvcnpTY2FsZSgpIGNvbnN0ID0gMDsKLQkvL2dldCB0aGUgc3BhY2Ugb2YgdHdvIGNoYXJhY3RlcnMKLQl2aXJ0dWFsIEZYX0ZMT0FUCQkJCQkJR2V0Q2hhclNwYWNlKCkgY29uc3QgPSAwOwotCS8vZ2V0IHRoZSBsYXRpbiB3b3JkcyBvZiBzcGVjaWZpZWQgcmFuZ2UKLQl2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCQkJCQlHZXRSYW5nZVRleHQoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiByYW5nZSkgY29uc3QgPSAwOwotCS8vaXMgdGhlIHRleHQgZnVsbCBpbiBib3VuZGluZyBib3gKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSXNUZXh0RnVsbCgpIGNvbnN0ID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJQ2FuVW5kbygpIGNvbnN0ID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJQ2FuUmVkbygpIGNvbnN0ID0gMDsKLQkvL2lmIHRoZSBjb250ZW50IGlzIGNoYW5nZWQgYWZ0ZXIgc2V0dGV4dD8KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSXNNb2RpZmllZCgpIGNvbnN0ID0gMDsKLQkvL2dldCB0aGUgdG90YWwgd29yZHMgaW4gZWRpdAotCXZpcnR1YWwgRlhfSU5UMzIJCQkJCQlHZXRUb3RhbFdvcmRzKCkgY29uc3QgPSAwOworICAvLyBzZWFyY2ggYSB3b3JkcGxhY2UgZm9ybSBwb2ludAorICB2aXJ0dWFsIENQVlRfV29yZFBsYWNlIFNlYXJjaFdvcmRQbGFjZShjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3QgPSAwOwogCi0JdmlydHVhbCB2b2lkCQkJCQkJCUFkZFVuZG9JdGVtKElGWF9FZGl0X1VuZG9JdGVtKiBwVW5kb0l0ZW0pID0gMDsKKyAgLy8gZ2V0IHRoZSBmb250IHNpemUgb2Ygbm9uX3JpY2ggdGV4dCBvciBkZWZhdWx0IGZvbnQgc2l6ZSBvZiByaWNodGV4dC4KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRGb250U2l6ZSgpIGNvbnN0ID0gMDsKKyAgLy8gZ2V0IHRoZSBtYXNrIGNoYXJhY3Rlci4KKyAgdmlydHVhbCBGWF9XT1JEIEdldFBhc3N3b3JkQ2hhcigpIGNvbnN0ID0gMDsKKyAgLy8gZ2V0IHRoZSBjb3VudCBvZiBjaGFyQXJyYXkKKyAgdmlydHVhbCBpbnQzMl90IEdldENoYXJBcnJheSgpIGNvbnN0ID0gMDsKKyAgLy8gZ2V0IHRoZSBob3Jpem9udGFsIHNjYWxlIG9mIGFsbCBjaGFyYWN0ZXJzCisgIHZpcnR1YWwgaW50MzJfdCBHZXRIb3J6U2NhbGUoKSBjb25zdCA9IDA7CisgIC8vIGdldCB0aGUgc3BhY2Ugb2YgdHdvIGNoYXJhY3RlcnMKKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRDaGFyU3BhY2UoKSBjb25zdCA9IDA7CisgIC8vIGdldCB0aGUgbGF0aW4gd29yZHMgb2Ygc3BlY2lmaWVkIHJhbmdlCisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0UmFuZ2VUZXh0KGNvbnN0IENQVlRfV29yZFJhbmdlJiByYW5nZSkgY29uc3QgPSAwOworICAvLyBpcyB0aGUgdGV4dCBmdWxsIGluIGJvdW5kaW5nIGJveAorICB2aXJ0dWFsIEZYX0JPT0wgSXNUZXh0RnVsbCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIENhblVuZG8oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgRlhfQk9PTCBDYW5SZWRvKCkgY29uc3QgPSAwOworICAvLyBpZiB0aGUgY29udGVudCBpcyBjaGFuZ2VkIGFmdGVyIHNldHRleHQ/CisgIHZpcnR1YWwgRlhfQk9PTCBJc01vZGlmaWVkKCkgY29uc3QgPSAwOworICAvLyBnZXQgdGhlIHRvdGFsIHdvcmRzIGluIGVkaXQKKyAgdmlydHVhbCBpbnQzMl90IEdldFRvdGFsV29yZHMoKSBjb25zdCA9IDA7CiAKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldEVkaXRBcHBlYXJhbmNlU3RyZWFtKElGWF9FZGl0KiBwRWRpdCwgY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0LCAKLQkJCQkJCQkJCQkJCQljb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlID0gTlVMTCwgCi0JCQkJCQkJCQkJCQkJRlhfQk9PTCBiQ29udGludW91cyA9IFRSVUUsIEZYX1dPUkQgU3ViV29yZCA9IDApOwotCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0U2VsZWN0QXBwZWFyYW5jZVN0cmVhbShJRlhfRWRpdCogcEVkaXQsIGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSA9IE5VTEwpOwotCXN0YXRpYyB2b2lkCQkJCQkJCQlEcmF3RWRpdChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLCBJRlhfRWRpdCogcEVkaXQsIEZYX0NPTE9SUkVGIGNyVGV4dEZpbGwsIEZYX0NPTE9SUkVGIGNyVGV4dFN0cm9rZSwKLQkJCQkJCQkJCQkJCQljb25zdCBDUERGX1JlY3QmIHJjQ2xpcCwgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsIElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlciwgdm9pZCogcEZGTERhdGEpOwotCXN0YXRpYyB2b2lkCQkJCQkJCQlEcmF3VW5kZXJsaW5lKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsIElGWF9FZGl0KiBwRWRpdCwgRlhfQ09MT1JSRUYgY29sb3IsCi0JCQkJCQkJCQkJCQkJY29uc3QgQ1BERl9SZWN0JiByY0NsaXAsIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LCBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlKTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJRHJhd1JpY2hFZGl0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsIElGWF9FZGl0KiBwRWRpdCwgIAotCQkJCQkJCQkJCQkJCWNvbnN0IENQREZfUmVjdCYgcmNDbGlwLCBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCUdlbmVyYXRlUGFnZU9iamVjdHMoQ1BERl9QYWdlT2JqZWN0cyogcFBhZ2VPYmplY3RzLCBJRlhfRWRpdCogcEVkaXQsCi0JCQkJCQkJCQkJCQkJY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsIEZYX0NPTE9SUkVGIGNyVGV4dCwgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9UZXh0T2JqZWN0Kj4mIE9iakFycmF5KTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJR2VuZXJhdGVSaWNoUGFnZU9iamVjdHMoQ1BERl9QYWdlT2JqZWN0cyogcFBhZ2VPYmplY3RzLCBJRlhfRWRpdCogcEVkaXQsCi0JCQkJCQkJCQkJCQkJY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsIENGWF9BcnJheVRlbXBsYXRlPENQREZfVGV4dE9iamVjdCo+JiBPYmpBcnJheSk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCUdlbmVyYXRlVW5kZXJsaW5lT2JqZWN0cyhDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9iamVjdHMsIElGWF9FZGl0KiBwRWRpdCwKLQkJCQkJCQkJCQkJCQljb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSwgRlhfQ09MT1JSRUYgY29sb3IpOworICB2aXJ0dWFsIHZvaWQgQWRkVW5kb0l0ZW0oSUZYX0VkaXRfVW5kb0l0ZW0qIHBVbmRvSXRlbSkgPSAwOwogCi1wcm90ZWN0ZWQ6Ci0gICAgfklGWF9FZGl0KCkgeyB9CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRFZGl0QXBwZWFyYW5jZVN0cmVhbSgKKyAgICAgIElGWF9FZGl0KiBwRWRpdCwKKyAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LAorICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSA9IE5VTEwsCisgICAgICBGWF9CT09MIGJDb250aW51b3VzID0gVFJVRSwKKyAgICAgIEZYX1dPUkQgU3ViV29yZCA9IDApOworICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0U2VsZWN0QXBwZWFyYW5jZVN0cmVhbSgKKyAgICAgIElGWF9FZGl0KiBwRWRpdCwKKyAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LAorICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSA9IE5VTEwpOworICBzdGF0aWMgdm9pZCBEcmF3RWRpdChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgIElGWF9FZGl0KiBwRWRpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09MT1JSRUYgY3JUZXh0RmlsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09MT1JSRUYgY3JUZXh0U3Ryb2tlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJjQ2xpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEZGTERhdGEpOworICBzdGF0aWMgdm9pZCBEcmF3VW5kZXJsaW5lKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9FZGl0KiBwRWRpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DT0xPUlJFRiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJjQ2xpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlKTsKKyAgc3RhdGljIHZvaWQgRHJhd1JpY2hFZGl0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRWRpdCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJjQ2xpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSk7CisgIHN0YXRpYyB2b2lkIEdlbmVyYXRlUGFnZU9iamVjdHMoCisgICAgICBDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9iamVjdHMsCisgICAgICBJRlhfRWRpdCogcEVkaXQsCisgICAgICBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwKKyAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsCisgICAgICBGWF9DT0xPUlJFRiBjclRleHQsCisgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX1RleHRPYmplY3QqPiYgT2JqQXJyYXkpOworICBzdGF0aWMgdm9pZCBHZW5lcmF0ZVJpY2hQYWdlT2JqZWN0cygKKyAgICAgIENQREZfUGFnZU9iamVjdHMqIHBQYWdlT2JqZWN0cywKKyAgICAgIElGWF9FZGl0KiBwRWRpdCwKKyAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LAorICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSwKKyAgICAgIENGWF9BcnJheVRlbXBsYXRlPENQREZfVGV4dE9iamVjdCo+JiBPYmpBcnJheSk7CisgIHN0YXRpYyB2b2lkIEdlbmVyYXRlVW5kZXJsaW5lT2JqZWN0cyhDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRWRpdCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DT0xPUlJFRiBjb2xvcik7CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgfklGWF9FZGl0KCkge30KIH07CiAKLWNsYXNzIElGWF9MaXN0X05vdGlmeQotewotcHVibGljOgotICAgICAgICB2aXJ0dWFsIH5JRlhfTGlzdF9Ob3RpZnkoKSB7IH0KLQkvL3NldCB0aGUgaG9yaXpvbnRhbCBzY3JvbGxiYXIgaW5mb3JtYXRpb24uCi0JdmlydHVhbCB2b2lkCQkJCQkJCUlPblNldFNjcm9sbEluZm9YKEZYX0ZMT0FUIGZQbGF0ZU1pbiwgRlhfRkxPQVQgZlBsYXRlTWF4LCAKLQkJCQkJCQkJCQkJCUZYX0ZMT0FUIGZDb250ZW50TWluLCBGWF9GTE9BVCBmQ29udGVudE1heCwgCi0JCQkJCQkJCQkJCQlGWF9GTE9BVCBmU21hbGxTdGVwLCBGWF9GTE9BVCBmQmlnU3RlcCkgPSAwOwotCS8vc2V0IHRoZSB2ZXJ0aWNhbCBzY3JvbGxiYXIgaW5mb3JtYXRpb24uCi0JdmlydHVhbCB2b2lkCQkJCQkJCUlPblNldFNjcm9sbEluZm9ZKEZYX0ZMT0FUIGZQbGF0ZU1pbiwgRlhfRkxPQVQgZlBsYXRlTWF4LCAKLQkJCQkJCQkJCQkJCUZYX0ZMT0FUIGZDb250ZW50TWluLCBGWF9GTE9BVCBmQ29udGVudE1heCwgCi0JCQkJCQkJCQkJCQlGWF9GTE9BVCBmU21hbGxTdGVwLCBGWF9GTE9BVCBmQmlnU3RlcCkgPSAwOwotCS8vc2V0IHRoZSBwb3NpdGlvbiBvZiBob3Jpem9udGFsIHNjcm9sbGJhci4KLQl2aXJ0dWFsIHZvaWQJCQkJCQkJSU9uU2V0U2Nyb2xsUG9zWChGWF9GTE9BVCBmeCkgPSAwOwotCS8vc2V0IHRoZSBwb3NpdGlvbiBvZiB2ZXJ0aWNhbCBzY3JvbGxiYXIuCi0JdmlydHVhbCB2b2lkCQkJCQkJCUlPblNldFNjcm9sbFBvc1koRlhfRkxPQVQgZnkpID0gMDsKLQkvL0ludmFsaWRhdGUgdGhlIHJlY3RhbmdsZSByZWxhdGl2ZSB0byB0aGUgYm91bmRpbmcgYm94IG9mIGVkaXQuCi0JdmlydHVhbCB2b2lkCQkJCQkJCUlPbkludmFsaWRhdGVSZWN0KENQREZfUmVjdCAqIHBSZWN0KSA9IDA7CitjbGFzcyBJRlhfTGlzdF9Ob3RpZnkgeworIHB1YmxpYzoKKyAgLy8gc2V0IHRoZSBob3Jpem9udGFsIHNjcm9sbGJhciBpbmZvcm1hdGlvbi4KKyAgdmlydHVhbCB2b2lkIElPblNldFNjcm9sbEluZm9YKEZYX0ZMT0FUIGZQbGF0ZU1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQbGF0ZU1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNvbnRlbnRNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU21hbGxTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkJpZ1N0ZXApID0gMDsKKyAgLy8gc2V0IHRoZSB2ZXJ0aWNhbCBzY3JvbGxiYXIgaW5mb3JtYXRpb24uCisgIHZpcnR1YWwgdm9pZCBJT25TZXRTY3JvbGxJbmZvWShGWF9GTE9BVCBmUGxhdGVNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGxhdGVNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29udGVudE1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50TWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNtYWxsU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZCaWdTdGVwKSA9IDA7CisgIC8vIHNldCB0aGUgcG9zaXRpb24gb2YgaG9yaXpvbnRhbCBzY3JvbGxiYXIuCisgIHZpcnR1YWwgdm9pZCBJT25TZXRTY3JvbGxQb3NYKEZYX0ZMT0FUIGZ4KSA9IDA7CisgIC8vIHNldCB0aGUgcG9zaXRpb24gb2YgdmVydGljYWwgc2Nyb2xsYmFyLgorICB2aXJ0dWFsIHZvaWQgSU9uU2V0U2Nyb2xsUG9zWShGWF9GTE9BVCBmeSkgPSAwOworICAvLyBJbnZhbGlkYXRlIHRoZSByZWN0YW5nbGUgcmVsYXRpdmUgdG8gdGhlIGJvdW5kaW5nIGJveCBvZiBlZGl0LgorICB2aXJ0dWFsIHZvaWQgSU9uSW52YWxpZGF0ZVJlY3QoQ1BERl9SZWN0KiBwUmVjdCkgPSAwOworCisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIH5JRlhfTGlzdF9Ob3RpZnkoKSB7fQogfTsKIAotY2xhc3MgRlhFVF9DTEFTUyBJRlhfTGlzdAotewotcHVibGljOgotCXN0YXRpYyBJRlhfTGlzdCoJCQkJCQlOZXdMaXN0KCk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCURlbExpc3QoSUZYX0xpc3QqIHBMaXN0KTsKK2NsYXNzIElGWF9MaXN0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBJRlhfTGlzdCogTmV3TGlzdCgpOworICBzdGF0aWMgdm9pZCBEZWxMaXN0KElGWF9MaXN0KiBwTGlzdCk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0Rm9udE1hcChJRlhfRWRpdF9Gb250TWFwICogcEZvbnRNYXApID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0Tm90aWZ5KElGWF9MaXN0X05vdGlmeSAqIHBOb3RpZnkpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldEZvbnRNYXAoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXApID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldE5vdGlmeShJRlhfTGlzdF9Ob3RpZnkqIHBOb3RpZnkpID0gMDsKIAotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRQbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QmIHJlY3QpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgPSAwOwogCi0JdmlydHVhbCBDUERGX1JlY3QJCQkJCQlHZXRQbGF0ZVJlY3QoKSBjb25zdCA9IDA7Ci0JdmlydHVhbCBDUERGX1JlY3QJCQkJCQlHZXRDb250ZW50UmVjdCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBDUERGX1JlY3QgR2V0UGxhdGVSZWN0KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIENQREZfUmVjdCBHZXRDb250ZW50UmVjdCgpIGNvbnN0ID0gMDsKIAotCXZpcnR1YWwgRlhfRkxPQVQJCQkJCQlHZXRGb250U2l6ZSgpIGNvbnN0ID0gMDsKLQl2aXJ0dWFsIElGWF9FZGl0KgkJCQkJCUdldEl0ZW1FZGl0KEZYX0lOVDMyIG5JbmRleCkgY29uc3QgPSAwOwotCXZpcnR1YWwgRlhfSU5UMzIJCQkJCQlHZXRDb3VudCgpIGNvbnN0ID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSXNJdGVtU2VsZWN0ZWQoRlhfSU5UMzIgbkluZGV4KSBjb25zdCA9IDA7Ci0JdmlydHVhbCBGWF9GTE9BVAkJCQkJCUdldEZpcnN0SGVpZ2h0KCkgY29uc3QgPSAwOwotCQotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRNdWx0aXBsZVNlbChGWF9CT09MIGJNdWx0aXBsZSkgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlJc011bHRpcGxlU2VsKCkgY29uc3QgPSAwOwkKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQkJSXNWYWxpZChGWF9JTlQzMiBuSXRlbUluZGV4KSBjb25zdCA9IDA7Ci0JdmlydHVhbCBGWF9JTlQzMgkJCQkJCUZpbmROZXh0KEZYX0lOVDMyIG5JbmRleCxGWF9XQ0hBUiBuQ2hhcikgY29uc3QgPSAwOwkKKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRGb250U2l6ZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBJRlhfRWRpdCogR2V0SXRlbUVkaXQoaW50MzJfdCBuSW5kZXgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBpbnQzMl90IEdldENvdW50KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgSXNJdGVtU2VsZWN0ZWQoaW50MzJfdCBuSW5kZXgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRGaXJzdEhlaWdodCgpIGNvbnN0ID0gMDsKIAotCXZpcnR1YWwgdm9pZAkJCQkJCQlTZXRTY3JvbGxQb3MoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJCVNjcm9sbFRvTGlzdEl0ZW0oRlhfSU5UMzIgbkl0ZW1JbmRleCkgPSAwOwotCXZpcnR1YWwgQ1BERl9SZWN0CQkJCQkJR2V0SXRlbVJlY3QoRlhfSU5UMzIgbkluZGV4KSBjb25zdCA9IDA7Ci0JdmlydHVhbCBGWF9JTlQzMgkJCQkJCUdldENhcmV0KCkgY29uc3QgPSAwOwotCXZpcnR1YWwgRlhfSU5UMzIJCQkJCQlHZXRTZWxlY3QoKSBjb25zdCA9IDA7CQotCXZpcnR1YWwgRlhfSU5UMzIJCQkJCQlHZXRUb3BJdGVtKCkgY29uc3QgPSAwOwotCXZpcnR1YWwgRlhfSU5UMzIJCQkJCQlHZXRJdGVtSW5kZXgoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdCA9IDA7Ci0JdmlydHVhbCBGWF9JTlQzMgkJCQkJCUdldEZpcnN0U2VsZWN0ZWQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRNdWx0aXBsZVNlbChGWF9CT09MIGJNdWx0aXBsZSkgPSAwOworICB2aXJ0dWFsIEZYX0JPT0wgSXNNdWx0aXBsZVNlbCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIElzVmFsaWQoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50MzJfdCBGaW5kTmV4dChpbnQzMl90IG5JbmRleCwgRlhfV0NIQVIgbkNoYXIpIGNvbnN0ID0gMDsKIAotCXZpcnR1YWwgdm9pZAkJCQkJCQlBZGRTdHJpbmcoRlhfTFBDV1NUUiBzdHJpbmcpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJU2V0VG9wSXRlbShGWF9JTlQzMiBuSW5kZXgpID0gMDsJCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNlbGVjdChGWF9JTlQzMiBuSXRlbUluZGV4KSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJCVNldENhcmV0KEZYX0lOVDMyIG5JdGVtSW5kZXgpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJRW1wdHkoKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJCUNhbmNlbCgpID0gMDsKLQl2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCQkJCQlHZXRUZXh0KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0U2Nyb2xsUG9zKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTY3JvbGxUb0xpc3RJdGVtKGludDMyX3Qgbkl0ZW1JbmRleCkgPSAwOworICB2aXJ0dWFsIENQREZfUmVjdCBHZXRJdGVtUmVjdChpbnQzMl90IG5JbmRleCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGludDMyX3QgR2V0Q2FyZXQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50MzJfdCBHZXRTZWxlY3QoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50MzJfdCBHZXRUb3BJdGVtKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGludDMyX3QgR2V0SXRlbUluZGV4KGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50MzJfdCBHZXRGaXJzdFNlbGVjdGVkKCkgY29uc3QgPSAwOwogCisgIHZpcnR1YWwgdm9pZCBBZGRTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHN0cmluZykgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0VG9wSXRlbShpbnQzMl90IG5JbmRleCkgPSAwOworICB2aXJ0dWFsIHZvaWQgU2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCkgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0Q2FyZXQoaW50MzJfdCBuSXRlbUluZGV4KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBFbXB0eSgpID0gMDsKKyAgdmlydHVhbCB2b2lkIENhbmNlbCgpID0gMDsKKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBHZXRUZXh0KCkgY29uc3QgPSAwOwogCi0JdmlydHVhbCB2b2lkCQkJCQkJCU9uTW91c2VEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJCU9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJCU9uVktfVVAoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX0RPV04oRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX0xFRlQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLX1JJR0hUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19IT01FKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25WS19FTkQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCQlPblZLKEZYX0lOVDMyIG5JdGVtSW5kZXgsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkgPSAwOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhcixGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPbk1vdXNlRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ3RybCkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkN0cmwpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uVktfVVAoRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uVktfRE9XTihGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25WS19MRUZUKEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJDdHJsKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPblZLX1JJR0hUKEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJDdHJsKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPblZLX0hPTUUoRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uVktfRU5EKEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJDdHJsKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPblZLKGludDMyX3Qgbkl0ZW1JbmRleCwgRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIE9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgPSAwOwogCi1wcm90ZWN0ZWQ6Ci0gICAgICAgIH5JRlhfTGlzdCgpIHsgfQorIHByb3RlY3RlZDoKKyAgdmlydHVhbCB+SUZYX0xpc3QoKSB7fQogfTsKIAorQ0ZYX0J5dGVTdHJpbmcgR2V0UERGV29yZFN0cmluZyhJRlhfRWRpdF9Gb250TWFwKiBwRm9udE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRm9udEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIFdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgU3ViV29yZCk7CisKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0ZYRURJVF9GWF9FRElUX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfZWRpdC5oIGIvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meGV0X2VkaXQuaAppbmRleCAyMzdhYTY2Li5kMWRmMzgxIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfZWRpdC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhldF9lZGl0LmgKQEAgLTEsODE3ICsxLDgxNiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIEZQREZTREtfSU5DTFVERV9GWEVESVRfRlhFVF9FRElUX0hfCiAjZGVmaW5lIEZQREZTREtfSU5DTFVERV9GWEVESVRfRlhFVF9FRElUX0hfCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3Z0LmgiCi0jaW5jbHVkZSAiZnhfZWRpdC5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfdnQuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4X2VkaXQuaCIKIAotY2xhc3MgQ0ZYX0VkaXRfUGFnZTsKLXN0cnVjdCBDRlhfRWRpdF9MaW5lUmVjdDsKLWNsYXNzIENGWF9FZGl0X0xpbmVSZWN0QXJyYXk7Ci1jbGFzcyBDRlhfRWRpdF9SZWN0QXJyYXk7Ci1jbGFzcyBDRlhfRWRpdF9SZWZyZXNoOwotY2xhc3MgQ0ZYX0VkaXRfU2VsZWN0OwogY2xhc3MgQ0ZYX0VkaXQ7CiBjbGFzcyBDRlhfRWRpdF9JdGVyYXRvcjsKLWNsYXNzIENGWF9FZGl0X1JlZnJlc2g7Ci1jbGFzcyBDRlhfRWRpdF9VbmRvSXRlbTsKLWNsYXNzIENGWF9FZGl0X1VuZG87CiBjbGFzcyBDRlhfRWRpdF9Qcm92aWRlcjsKIAotI2RlZmluZSBGWF9FRElUX0lzRmxvYXRaZXJvKGYpCQkJCQkJKGYgPCAwLjAwMDEgJiYgZiA+IC0wLjAwMDEpCi0jZGVmaW5lIEZYX0VESVRfSXNGbG9hdEVxdWFsKGZhLGZiKQkJCQkJRlhfRURJVF9Jc0Zsb2F0WmVybyhmYSAtIGZiKQotI2RlZmluZSBGWF9FRElUX0lzRmxvYXRCaWdnZXIoZmEsZmIpCQkJCShmYSA+IGZiICYmICFGWF9FRElUX0lzRmxvYXRFcXVhbChmYSxmYikpCi0jZGVmaW5lIEZYX0VESVRfSXNGbG9hdFNtYWxsZXIoZmEsZmIpCQkJCShmYSA8IGZiICYmICFGWF9FRElUX0lzRmxvYXRFcXVhbChmYSxmYikpCi0KLXRlbXBsYXRlPGNsYXNzIFQ+IFQgRlhfRURJVF9NSU4gKGNvbnN0IFQgJiBpLCBjb25zdCBUICYgaikgeyByZXR1cm4gKChpIDwgaikgPyBpIDogaik7IH0KLXRlbXBsYXRlPGNsYXNzIFQ+IFQgRlhfRURJVF9NQVggKGNvbnN0IFQgJiBpLCBjb25zdCBUICYgaikgeyByZXR1cm4gKChpID4gaikgPyBpIDogaik7IH0KLQotI2RlZmluZQlGWF9FRElUX1BJCQkJCQkJCQkJMy4xNDE1OTI2NTM1ODk3OWYKLSNkZWZpbmUgRlhfRURJVF9JVEFMSUNfQU5HRUwJCQkJCQkxMCAqIEZYX0VESVRfUEkgLyAxODAuMGYKLQorI2RlZmluZSBGWF9FRElUX0lzRmxvYXRaZXJvKGYpIChmIDwgMC4wMDAxICYmIGYgPiAtMC4wMDAxKQorI2RlZmluZSBGWF9FRElUX0lzRmxvYXRFcXVhbChmYSwgZmIpIEZYX0VESVRfSXNGbG9hdFplcm8oZmEgLSBmYikKKyNkZWZpbmUgRlhfRURJVF9Jc0Zsb2F0QmlnZ2VyKGZhLCBmYikgKGZhID4gZmIgJiYgIUZYX0VESVRfSXNGbG9hdEVxdWFsKGZhLCBmYikpCisjZGVmaW5lIEZYX0VESVRfSXNGbG9hdFNtYWxsZXIoZmEsIGZiKSBcCisgIChmYSA8IGZiICYmICFGWF9FRElUX0lzRmxvYXRFcXVhbChmYSwgZmIpKQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGWF9FZGl0X1JlZnJlc2ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1lbnVtIFJFRlJFU0hfUExBTl9FCi17Ci0JUlBfQU5BTFlTRSwKLQlSUF9OT0FOQUxZU0UsCi0JUlBfT1BUSU9OQUwKK2VudW0gUkVGUkVTSF9QTEFOX0UgeyBSUF9BTkFMWVNFLCBSUF9OT0FOQUxZU0UsIFJQX09QVElPTkFMIH07CisKK2VudW0gRURJVF9QUk9QU19FIHsKKyAgRVBfTElORUxFQURJTkcsCisgIEVQX0xJTkVJTkRFTlQsCisgIEVQX0FMSUdOTUVOVCwKKyAgRVBfRk9OVElOREVYLAorICBFUF9GT05UU0laRSwKKyAgRVBfV09SRENPTE9SLAorICBFUF9TQ1JJUFRUWVBFLAorICBFUF9VTkRFUkxJTkUsCisgIEVQX0NST1NTT1VULAorICBFUF9DSEFSU1BBQ0UsCisgIEVQX0hPUlpTQ0FMRSwKKyAgRVBfQk9MRCwKKyAgRVBfSVRBTElDCiB9OwogCi1lbnVtIEVESVRfUFJPUFNfRQotewotCUVQX0xJTkVMRUFESU5HLAotCUVQX0xJTkVJTkRFTlQsCi0JRVBfQUxJR05NRU5ULAotCUVQX0ZPTlRJTkRFWCwKLQlFUF9GT05UU0laRSwKLQlFUF9XT1JEQ09MT1IsCi0JRVBfU0NSSVBUVFlQRSwKLQlFUF9VTkRFUkxJTkUsCi0JRVBfQ1JPU1NPVVQsCi0JRVBfQ0hBUlNQQUNFLAotCUVQX0hPUlpTQ0FMRSwKLQlFUF9CT0xELAotCUVQX0lUQUxJQworc3RydWN0IENGWF9FZGl0X0xpbmVSZWN0IHsKKyAgQ0ZYX0VkaXRfTGluZVJlY3QoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyTGluZSwgY29uc3QgQ1BERl9SZWN0JiByY0xpbmUpCisgICAgICA6IG1fd3JMaW5lKHdyTGluZSksIG1fcmNMaW5lKHJjTGluZSkge30KKworICBGWF9CT09MIG9wZXJhdG9yIT0oY29uc3QgQ0ZYX0VkaXRfTGluZVJlY3QmIGxpbmVyZWN0KSBjb25zdCB7CisgICAgcmV0dXJuIEZYU1lTX21lbWNtcCh0aGlzLCAmbGluZXJlY3QsIHNpemVvZihDRlhfRWRpdF9MaW5lUmVjdCkpICE9IDA7CisgIH0KKworICBGWF9CT09MIElzU2FtZUhlaWdodChjb25zdCBDRlhfRWRpdF9MaW5lUmVjdCYgbGluZXJlY3QpIGNvbnN0IHsKKyAgICByZXR1cm4gRlhfRURJVF9Jc0Zsb2F0WmVybygKKyAgICAgICAgKG1fcmNMaW5lLnRvcCAtIG1fcmNMaW5lLmJvdHRvbSkgLQorICAgICAgICAobGluZXJlY3QubV9yY0xpbmUudG9wIC0gbGluZXJlY3QubV9yY0xpbmUuYm90dG9tKSk7CisgIH0KKworICBGWF9CT09MIElzU2FtZVRvcChjb25zdCBDRlhfRWRpdF9MaW5lUmVjdCYgbGluZXJlY3QpIGNvbnN0IHsKKyAgICByZXR1cm4gRlhfRURJVF9Jc0Zsb2F0WmVybyhtX3JjTGluZS50b3AgLSBsaW5lcmVjdC5tX3JjTGluZS50b3ApOworICB9CisKKyAgRlhfQk9PTCBJc1NhbWVMZWZ0KGNvbnN0IENGWF9FZGl0X0xpbmVSZWN0JiBsaW5lcmVjdCkgY29uc3QgeworICAgIHJldHVybiBGWF9FRElUX0lzRmxvYXRaZXJvKG1fcmNMaW5lLmxlZnQgLSBsaW5lcmVjdC5tX3JjTGluZS5sZWZ0KTsKKyAgfQorCisgIEZYX0JPT0wgSXNTYW1lUmlnaHQoY29uc3QgQ0ZYX0VkaXRfTGluZVJlY3QmIGxpbmVyZWN0KSBjb25zdCB7CisgICAgcmV0dXJuIEZYX0VESVRfSXNGbG9hdFplcm8obV9yY0xpbmUucmlnaHQgLSBsaW5lcmVjdC5tX3JjTGluZS5yaWdodCk7CisgIH0KKworICBDUFZUX1dvcmRSYW5nZSBtX3dyTGluZTsKKyAgQ1BERl9SZWN0IG1fcmNMaW5lOwogfTsKIAotc3RydWN0IENGWF9FZGl0X0xpbmVSZWN0Ci17Ci0JQ0ZYX0VkaXRfTGluZVJlY3QoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3ckxpbmUsY29uc3QgQ1BERl9SZWN0ICYgcmNMaW5lKSA6Ci0JCW1fd3JMaW5lKHdyTGluZSksIG1fcmNMaW5lKHJjTGluZSkKLQl7Ci0JfQorY2xhc3MgQ0ZYX0VkaXRfTGluZVJlY3RBcnJheSB7CisgcHVibGljOgorICBDRlhfRWRpdF9MaW5lUmVjdEFycmF5KCkge30KIAotCUZYX0JPT0wgb3BlcmF0b3IgIT0gKGNvbnN0IENGWF9FZGl0X0xpbmVSZWN0ICYgbGluZXJlY3QpIGNvbnN0Ci0JewotCQlyZXR1cm4gRlhTWVNfbWVtY21wKHRoaXMsICZsaW5lcmVjdCwgc2l6ZW9mKENGWF9FZGl0X0xpbmVSZWN0KSkgIT0gMDsKLQl9CisgIHZpcnR1YWwgfkNGWF9FZGl0X0xpbmVSZWN0QXJyYXkoKSB7IEVtcHR5KCk7IH0KIAotCUZYX0JPT0wgSXNTYW1lSGVpZ2h0KGNvbnN0IENGWF9FZGl0X0xpbmVSZWN0ICYgbGluZXJlY3QpIGNvbnN0Ci0JewotCQlyZXR1cm4gRlhfRURJVF9Jc0Zsb2F0WmVybygobV9yY0xpbmUudG9wIC0gbV9yY0xpbmUuYm90dG9tKSAtIChsaW5lcmVjdC5tX3JjTGluZS50b3AgLWxpbmVyZWN0Lm1fcmNMaW5lLmJvdHRvbSkpOwotCX0KKyAgdm9pZCBFbXB0eSgpIHsKKyAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9MaW5lUmVjdHMuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKKyAgICAgIGRlbGV0ZSBtX0xpbmVSZWN0cy5HZXRBdChpKTsKIAotCUZYX0JPT0wgSXNTYW1lVG9wKGNvbnN0IENGWF9FZGl0X0xpbmVSZWN0ICYgbGluZXJlY3QpIGNvbnN0Ci0JewotCQlyZXR1cm4gRlhfRURJVF9Jc0Zsb2F0WmVybyhtX3JjTGluZS50b3AgLSBsaW5lcmVjdC5tX3JjTGluZS50b3ApOwotCX0KKyAgICBtX0xpbmVSZWN0cy5SZW1vdmVBbGwoKTsKKyAgfQogCi0JRlhfQk9PTCBJc1NhbWVMZWZ0KGNvbnN0IENGWF9FZGl0X0xpbmVSZWN0ICYgbGluZXJlY3QpIGNvbnN0Ci0JewotCQlyZXR1cm4gRlhfRURJVF9Jc0Zsb2F0WmVybyhtX3JjTGluZS5sZWZ0IC0gbGluZXJlY3QubV9yY0xpbmUubGVmdCk7Ci0JfQorICB2b2lkIFJlbW92ZUFsbCgpIHsgbV9MaW5lUmVjdHMuUmVtb3ZlQWxsKCk7IH0KIAotCUZYX0JPT0wgSXNTYW1lUmlnaHQoY29uc3QgQ0ZYX0VkaXRfTGluZVJlY3QgJiBsaW5lcmVjdCkgY29uc3QKLQl7Ci0JCXJldHVybiBGWF9FRElUX0lzRmxvYXRaZXJvKG1fcmNMaW5lLnJpZ2h0IC0gbGluZXJlY3QubV9yY0xpbmUucmlnaHQpOwotCX0KKyAgdm9pZCBvcGVyYXRvcj0oQ0ZYX0VkaXRfTGluZVJlY3RBcnJheSYgcmVjdHMpIHsKKyAgICBFbXB0eSgpOworICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSByZWN0cy5HZXRTaXplKCk7IGkgPCBzejsgaSsrKQorICAgICAgbV9MaW5lUmVjdHMuQWRkKHJlY3RzLkdldEF0KGkpKTsKIAotCUNQVlRfV29yZFJhbmdlCQkJCQkJCW1fd3JMaW5lOwotCUNQREZfUmVjdAkJCQkJCQkJbV9yY0xpbmU7CisgICAgcmVjdHMuUmVtb3ZlQWxsKCk7CisgIH0KKworICB2b2lkIEFkZChjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3JMaW5lLCBjb25zdCBDUERGX1JlY3QmIHJjTGluZSkgeworICAgIG1fTGluZVJlY3RzLkFkZChuZXcgQ0ZYX0VkaXRfTGluZVJlY3Qod3JMaW5lLCByY0xpbmUpKTsKKyAgfQorCisgIGludDMyX3QgR2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fTGluZVJlY3RzLkdldFNpemUoKTsgfQorCisgIENGWF9FZGl0X0xpbmVSZWN0KiBHZXRBdChpbnQzMl90IG5JbmRleCkgY29uc3QgeworICAgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBtX0xpbmVSZWN0cy5HZXRTaXplKCkpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBtX0xpbmVSZWN0cy5HZXRBdChuSW5kZXgpOworICB9CisKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q0ZYX0VkaXRfTGluZVJlY3QqPiBtX0xpbmVSZWN0czsKIH07CiAKLWNsYXNzIENGWF9FZGl0X0xpbmVSZWN0QXJyYXkKLXsKLXB1YmxpYzoKLQlDRlhfRWRpdF9MaW5lUmVjdEFycmF5KCkKLQl7Ci0JfQorY2xhc3MgQ0ZYX0VkaXRfUmVjdEFycmF5IHsKKyBwdWJsaWM6CisgIENGWF9FZGl0X1JlY3RBcnJheSgpIHt9CiAKLQl2aXJ0dWFsIH5DRlhfRWRpdF9MaW5lUmVjdEFycmF5KCkKLQl7Ci0JCUVtcHR5KCk7Ci0JfQorICB2aXJ0dWFsIH5DRlhfRWRpdF9SZWN0QXJyYXkoKSB7IEVtcHR5KCk7IH0KIAotCXZvaWQgRW1wdHkoKQotCXsKLQkJZm9yIChGWF9JTlQzMiBpID0gMCwgc3ogPSBtX0xpbmVSZWN0cy5HZXRTaXplKCk7IGkgPCBzejsgaSsrKQotCQkJZGVsZXRlIG1fTGluZVJlY3RzLkdldEF0KGkpOworICB2b2lkIEVtcHR5KCkgeworICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX1JlY3RzLkdldFNpemUoKTsgaSA8IHN6OyBpKyspCisgICAgICBkZWxldGUgbV9SZWN0cy5HZXRBdChpKTsKIAotCQltX0xpbmVSZWN0cy5SZW1vdmVBbGwoKTsKLQl9CisgICAgbV9SZWN0cy5SZW1vdmVBbGwoKTsKKyAgfQogCi0Jdm9pZCBSZW1vdmVBbGwoKQotCXsKLQkJbV9MaW5lUmVjdHMuUmVtb3ZlQWxsKCk7Ci0JfQorICB2b2lkIEFkZChjb25zdCBDUERGX1JlY3QmIHJlY3QpIHsKKyAgICAvLyBjaGVjayBmb3Igb3ZlcmxhcHBlZCBhcmVhCisgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fUmVjdHMuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgICAgQ1BERl9SZWN0KiBwUmVjdCA9IG1fUmVjdHMuR2V0QXQoaSk7CisgICAgICBpZiAocFJlY3QgJiYgcFJlY3QtPkNvbnRhaW5zKHJlY3QpKQorICAgICAgICByZXR1cm47CisgICAgfQogCi0Jdm9pZCBvcGVyYXRvciA9IChDRlhfRWRpdF9MaW5lUmVjdEFycmF5ICYgcmVjdHMpCi0JewotCQlFbXB0eSgpOwotCQlmb3IgKEZYX0lOVDMyIGkgPSAwLCBzeiA9IHJlY3RzLkdldFNpemUoKTsgaSA8IHN6OyBpKyspCi0JCQltX0xpbmVSZWN0cy5BZGQocmVjdHMuR2V0QXQoaSkpOworICAgIG1fUmVjdHMuQWRkKG5ldyBDUERGX1JlY3QocmVjdCkpOworICB9CiAKLQkJcmVjdHMuUmVtb3ZlQWxsKCk7Ci0JfQorICBpbnQzMl90IEdldFNpemUoKSBjb25zdCB7IHJldHVybiBtX1JlY3RzLkdldFNpemUoKTsgfQogCi0Jdm9pZCBBZGQoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3ckxpbmUsY29uc3QgQ1BERl9SZWN0ICYgcmNMaW5lKQotCXsKLQkJaWYgKENGWF9FZGl0X0xpbmVSZWN0ICogcFJlY3QgPSBuZXcgQ0ZYX0VkaXRfTGluZVJlY3Qod3JMaW5lLHJjTGluZSkpCi0JCQltX0xpbmVSZWN0cy5BZGQocFJlY3QpOwotCX0KKyAgQ1BERl9SZWN0KiBHZXRBdChpbnQzMl90IG5JbmRleCkgY29uc3QgeworICAgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBtX1JlY3RzLkdldFNpemUoKSkKKyAgICAgIHJldHVybiBOVUxMOwogCi0JRlhfSU5UMzIgR2V0U2l6ZSgpIGNvbnN0Ci0JewotCQlyZXR1cm4gbV9MaW5lUmVjdHMuR2V0U2l6ZSgpOwotCX0KKyAgICByZXR1cm4gbV9SZWN0cy5HZXRBdChuSW5kZXgpOworICB9CiAKLQlDRlhfRWRpdF9MaW5lUmVjdCAqIEdldEF0KEZYX0lOVDMyIG5JbmRleCkgY29uc3QKLQl7Ci0JCWlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBtX0xpbmVSZWN0cy5HZXRTaXplKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQotCQlyZXR1cm4gbV9MaW5lUmVjdHMuR2V0QXQobkluZGV4KTsKLQl9Ci0KLQlDRlhfQXJyYXlUZW1wbGF0ZTxDRlhfRWRpdF9MaW5lUmVjdCo+CQltX0xpbmVSZWN0czsKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9SZWN0Kj4gbV9SZWN0czsKIH07CiAKLWNsYXNzIENGWF9FZGl0X1JlY3RBcnJheQotewotcHVibGljOgotCUNGWF9FZGl0X1JlY3RBcnJheSgpCi0JewotCX0KK2NsYXNzIENGWF9FZGl0X1JlZnJlc2ggeworIHB1YmxpYzoKKyAgQ0ZYX0VkaXRfUmVmcmVzaCgpOworICB2aXJ0dWFsIH5DRlhfRWRpdF9SZWZyZXNoKCk7CiAKLQl2aXJ0dWFsIH5DRlhfRWRpdF9SZWN0QXJyYXkoKQotCXsKLQkJdGhpcy0+RW1wdHkoKTsKLQl9CisgIHZvaWQgQmVnaW5SZWZyZXNoKCk7CisgIHZvaWQgUHVzaChjb25zdCBDUFZUX1dvcmRSYW5nZSYgbGluZXJhbmdlLCBjb25zdCBDUERGX1JlY3QmIHJlY3QpOworICB2b2lkIE5vQW5hbHlzZSgpOworICB2b2lkIEFuYWx5c2UoaW50MzJfdCBuQWxpZ25tZW50KTsKKyAgdm9pZCBBZGRSZWZyZXNoKGNvbnN0IENQREZfUmVjdCYgcmVjdCk7CisgIGNvbnN0IENGWF9FZGl0X1JlY3RBcnJheSogR2V0UmVmcmVzaFJlY3RzKCkgY29uc3Q7CisgIHZvaWQgRW5kUmVmcmVzaCgpOwogCi0Jdm9pZCBFbXB0eSgpCi0JewotCQlmb3IgKEZYX0lOVDMyIGkgPSAwLCBzeiA9IG1fUmVjdHMuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKLQkJCWRlbGV0ZSBtX1JlY3RzLkdldEF0KGkpOwotCi0JCXRoaXMtPm1fUmVjdHMuUmVtb3ZlQWxsKCk7Ci0JfQotCi0Jdm9pZCBBZGQoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkKLQl7Ci0JCS8vY2hlY2sgZm9yIG92ZXJsYXBlZCBhcmVhCi0JCWZvciAoRlhfSU5UMzIgaSA9IDAsIHN6ID0gbV9SZWN0cy5HZXRTaXplKCk7IGkgPCBzejsgaSsrKQotCQkJaWYgKENQREZfUmVjdCAqIHBSZWN0ID0gbV9SZWN0cy5HZXRBdChpKSkKLQkJCQlpZiAocFJlY3QtPkNvbnRhaW5zKHJlY3QpKXJldHVybjsKLQotCQlpZiAoQ1BERl9SZWN0ICogcE5ld1JlY3QgPSBuZXcgQ1BERl9SZWN0KHJlY3QpKQotCQkJbV9SZWN0cy5BZGQocE5ld1JlY3QpOwotCX0KLQotCUZYX0lOVDMyIEdldFNpemUoKSBjb25zdAotCXsKLQkJcmV0dXJuIG1fUmVjdHMuR2V0U2l6ZSgpOwotCX0KLQotCUNQREZfUmVjdCAqIEdldEF0KEZYX0lOVDMyIG5JbmRleCkgY29uc3QKLQl7Ci0JCWlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBtX1JlY3RzLkdldFNpemUoKSkKLQkJCXJldHVybiBOVUxMOwotCi0JCXJldHVybiBtX1JlY3RzLkdldEF0KG5JbmRleCk7Ci0JfQotCi0JQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9SZWN0Kj4JCQltX1JlY3RzOworIHByaXZhdGU6CisgIENGWF9FZGl0X0xpbmVSZWN0QXJyYXkgbV9OZXdMaW5lUmVjdHM7CisgIENGWF9FZGl0X0xpbmVSZWN0QXJyYXkgbV9PbGRMaW5lUmVjdHM7CisgIENGWF9FZGl0X1JlY3RBcnJheSBtX1JlZnJlc2hSZWN0czsKIH07CiAKLWNsYXNzIENGWF9FZGl0X1JlZnJlc2gKLXsKLXB1YmxpYzoKLQlDRlhfRWRpdF9SZWZyZXNoKCk7Ci0JdmlydHVhbCB+Q0ZYX0VkaXRfUmVmcmVzaCgpOwotCi0Jdm9pZAkJCQkJCQkJCUJlZ2luUmVmcmVzaCgpOwotCXZvaWQJCQkJCQkJCQlQdXNoKGNvbnN0IENQVlRfV29yZFJhbmdlICYgbGluZXJhbmdlLGNvbnN0IENQREZfUmVjdCAmIHJlY3QpOwotCXZvaWQJCQkJCQkJCQlOb0FuYWx5c2UoKTsKLQl2b2lkCQkJCQkJCQkJQW5hbHlzZShGWF9JTlQzMiBuQWxpZ25tZW50KTsKLQl2b2lkCQkJCQkJCQkJQWRkUmVmcmVzaChjb25zdCBDUERGX1JlY3QgJiByZWN0KTsKLQljb25zdCBDRlhfRWRpdF9SZWN0QXJyYXkgKgkJCQlHZXRSZWZyZXNoUmVjdHMoKSBjb25zdDsKLQl2b2lkCQkJCQkJCQkJRW5kUmVmcmVzaCgpOwotCi1wcml2YXRlOgotCUNGWF9FZGl0X0xpbmVSZWN0QXJyYXkJCQkJCW1fTmV3TGluZVJlY3RzOwotCUNGWF9FZGl0X0xpbmVSZWN0QXJyYXkJCQkJCW1fT2xkTGluZVJlY3RzOwotCUNGWF9FZGl0X1JlY3RBcnJheQkJCQkJCW1fUmVmcmVzaFJlY3RzOwotfTsKLQotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGWF9FZGl0X1NlbGVjdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLWNsYXNzIENGWF9FZGl0X1NlbGVjdAotewotcHVibGljOgotCUNGWF9FZGl0X1NlbGVjdCgpCi0JewotCX0KK2NsYXNzIENGWF9FZGl0X1NlbGVjdCB7CisgcHVibGljOgorICBDRlhfRWRpdF9TZWxlY3QoKSB7fQogCi0JQ0ZYX0VkaXRfU2VsZWN0KGNvbnN0IENQVlRfV29yZFBsYWNlICYgYmVnaW4sY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBlbmQpCi0JewotCQlTZXQoYmVnaW4sZW5kKTsKLQl9CisgIENGWF9FZGl0X1NlbGVjdChjb25zdCBDUFZUX1dvcmRQbGFjZSYgYmVnaW4sIGNvbnN0IENQVlRfV29yZFBsYWNlJiBlbmQpIHsKKyAgICBTZXQoYmVnaW4sIGVuZCk7CisgIH0KIAotCUNGWF9FZGl0X1NlbGVjdChjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHJhbmdlKQotCXsKLQkJU2V0KHJhbmdlLkJlZ2luUG9zLHJhbmdlLkVuZFBvcyk7Ci0JfQorICBleHBsaWNpdCBDRlhfRWRpdF9TZWxlY3QoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHJhbmdlKSB7CisgICAgU2V0KHJhbmdlLkJlZ2luUG9zLCByYW5nZS5FbmRQb3MpOworICB9CiAKLQlDUFZUX1dvcmRSYW5nZSBDb252ZXJ0VG9Xb3JkUmFuZ2UoKSBjb25zdAotCXsKLQkJcmV0dXJuIENQVlRfV29yZFJhbmdlKHRoaXMtPkJlZ2luUG9zLHRoaXMtPkVuZFBvcyk7Ci0JfQorICBDUFZUX1dvcmRSYW5nZSBDb252ZXJ0VG9Xb3JkUmFuZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIENQVlRfV29yZFJhbmdlKEJlZ2luUG9zLCBFbmRQb3MpOworICB9CiAKLQl2b2lkIERlZmF1bHQoKQotCXsKLQkJQmVnaW5Qb3MuRGVmYXVsdCgpOwotCQlFbmRQb3MuRGVmYXVsdCgpOwotCX0KKyAgdm9pZCBEZWZhdWx0KCkgeworICAgIEJlZ2luUG9zLkRlZmF1bHQoKTsKKyAgICBFbmRQb3MuRGVmYXVsdCgpOworICB9CiAKLQl2b2lkIFNldChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIGJlZ2luLGNvbnN0IENQVlRfV29yZFBsYWNlICYgZW5kKQotCXsKLQkJdGhpcy0+QmVnaW5Qb3MgPSBiZWdpbjsKLQkJdGhpcy0+RW5kUG9zID0gZW5kOwotCX0KKyAgdm9pZCBTZXQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIGJlZ2luLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgZW5kKSB7CisgICAgQmVnaW5Qb3MgPSBiZWdpbjsKKyAgICBFbmRQb3MgPSBlbmQ7CisgIH0KIAotCXZvaWQgU2V0QmVnaW5Qb3MoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBiZWdpbikKLQl7Ci0JCXRoaXMtPkJlZ2luUG9zID0gYmVnaW47Ci0JfQorICB2b2lkIFNldEJlZ2luUG9zKGNvbnN0IENQVlRfV29yZFBsYWNlJiBiZWdpbikgeyBCZWdpblBvcyA9IGJlZ2luOyB9CiAKLQl2b2lkIFNldEVuZFBvcyhjb25zdCBDUFZUX1dvcmRQbGFjZSAmIGVuZCkKLQl7Ci0JCXRoaXMtPkVuZFBvcyA9IGVuZDsKLQl9CisgIHZvaWQgU2V0RW5kUG9zKGNvbnN0IENQVlRfV29yZFBsYWNlJiBlbmQpIHsgRW5kUG9zID0gZW5kOyB9CiAKLQlGWF9CT09MIElzRXhpc3QoKSBjb25zdAotCXsKLQkJcmV0dXJuIHRoaXMtPkJlZ2luUG9zICE9IHRoaXMtPkVuZFBvczsKLQl9CisgIEZYX0JPT0wgSXNFeGlzdCgpIGNvbnN0IHsgcmV0dXJuIEJlZ2luUG9zICE9IEVuZFBvczsgfQogCi0JRlhfQk9PTCBvcGVyYXRvciAhPSAoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3cikgY29uc3QKLQl7Ci0JCXJldHVybiB3ci5CZWdpblBvcyAhPSB0aGlzLT5CZWdpblBvcyB8fCB3ci5FbmRQb3MgIT0gdGhpcy0+RW5kUG9zOwotCX0KKyAgRlhfQk9PTCBvcGVyYXRvciE9KGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cikgY29uc3QgeworICAgIHJldHVybiB3ci5CZWdpblBvcyAhPSBCZWdpblBvcyB8fCB3ci5FbmRQb3MgIT0gRW5kUG9zOworICB9CiAKLQlDUFZUX1dvcmRQbGFjZSBCZWdpblBvcyxFbmRQb3M7CisgIENQVlRfV29yZFBsYWNlIEJlZ2luUG9zLCBFbmRQb3M7CiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGWF9FZGl0X1VuZG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1jbGFzcyBDRlhfRWRpdF9VbmRvCi17Ci1wdWJsaWM6Ci0JQ0ZYX0VkaXRfVW5kbyhGWF9JTlQzMiBuQnVmc2l6ZSA9IDEwMDAwKTsKLQl2aXJ0dWFsIH5DRlhfRWRpdF9VbmRvKCk7CitjbGFzcyBDRlhfRWRpdF9VbmRvIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENGWF9FZGl0X1VuZG8oaW50MzJfdCBuQnVmc2l6ZSk7CisgIHZpcnR1YWwgfkNGWF9FZGl0X1VuZG8oKTsKIAotCXZvaWQJCQkJCQkJCQlVbmRvKCk7Ci0Jdm9pZAkJCQkJCQkJCVJlZG8oKTsKKyAgdm9pZCBVbmRvKCk7CisgIHZvaWQgUmVkbygpOwogCi0Jdm9pZAkJCQkJCQkJCUFkZEl0ZW0oSUZYX0VkaXRfVW5kb0l0ZW0qIHBJdGVtKTsKKyAgdm9pZCBBZGRJdGVtKElGWF9FZGl0X1VuZG9JdGVtKiBwSXRlbSk7CiAKLQlGWF9CT09MCQkJCQkJCQkJQ2FuVW5kbygpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJCQlDYW5SZWRvKCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQkJCUlzTW9kaWZpZWQoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCQkJSXNXb3JraW5nKCkgY29uc3Q7CisgIEZYX0JPT0wgQ2FuVW5kbygpIGNvbnN0OworICBGWF9CT09MIENhblJlZG8oKSBjb25zdDsKKyAgRlhfQk9PTCBJc01vZGlmaWVkKCkgY29uc3Q7CisgIEZYX0JPT0wgSXNXb3JraW5nKCkgY29uc3Q7CiAKLQl2b2lkCQkJCQkJCQkJUmVzZXQoKTsKKyAgdm9pZCBSZXNldCgpOwogCi0JSUZYX0VkaXRfVW5kb0l0ZW0qCQkJCQkJR2V0SXRlbShGWF9JTlQzMiBuSW5kZXgpOwotCUZYX0lOVDMyCQkJCQkJCQlHZXRJdGVtQ291bnQoKXtyZXR1cm4gbV9VbmRvSXRlbVN0YWNrLkdldFNpemUoKTt9Ci0JRlhfSU5UMzIJCQkJCQkJCUdldEN1clVuZG9Qb3MoKXtyZXR1cm4gbV9uQ3VyVW5kb1Bvczt9CisgIElGWF9FZGl0X1VuZG9JdGVtKiBHZXRJdGVtKGludDMyX3QgbkluZGV4KTsKKyAgaW50MzJfdCBHZXRJdGVtQ291bnQoKSB7IHJldHVybiBtX1VuZG9JdGVtU3RhY2suR2V0U2l6ZSgpOyB9CisgIGludDMyX3QgR2V0Q3VyVW5kb1BvcygpIHsgcmV0dXJuIG1fbkN1clVuZG9Qb3M7IH0KIAotcHJpdmF0ZToKLQl2b2lkCQkJCQkJCQkJU2V0QnVmU2l6ZShGWF9JTlQzMiBuU2l6ZSl7bV9uQnVmU2l6ZSA9IG5TaXplO30KLQlGWF9JTlQzMgkJCQkJCQkJR2V0QnVmU2l6ZSgpe3JldHVybiBtX25CdWZTaXplO30KKyBwcml2YXRlOgorICB2b2lkIFNldEJ1ZlNpemUoaW50MzJfdCBuU2l6ZSkgeyBtX25CdWZTaXplID0gblNpemU7IH0KKyAgaW50MzJfdCBHZXRCdWZTaXplKCkgeyByZXR1cm4gbV9uQnVmU2l6ZTsgfQogCi0Jdm9pZAkJCQkJCQkJCVJlbW92ZUhlYWRzKCk7Ci0Jdm9pZAkJCQkJCQkJCVJlbW92ZVRhaWxzKCk7CisgIHZvaWQgUmVtb3ZlSGVhZHMoKTsKKyAgdm9pZCBSZW1vdmVUYWlscygpOwogCi1wcml2YXRlOgotCUNGWF9BcnJheVRlbXBsYXRlPElGWF9FZGl0X1VuZG9JdGVtKj4JbV9VbmRvSXRlbVN0YWNrOwotCQotCUZYX0lOVDMyCQkJCQkJCQltX25DdXJVbmRvUG9zOwotCUZYX0lOVDMyCQkJCQkJCQltX25CdWZTaXplOwotCUZYX0JPT0wJCQkJCQkJCQltX2JNb2RpZmllZDsgCi0JRlhfQk9PTAkJCQkJCQkJCW1fYlZpcmdpbjsKLQlGWF9CT09MCQkJCQkJCQkJbV9iV29ya2luZzsKKyBwcml2YXRlOgorICBDRlhfQXJyYXlUZW1wbGF0ZTxJRlhfRWRpdF9VbmRvSXRlbSo+IG1fVW5kb0l0ZW1TdGFjazsKKworICBpbnQzMl90IG1fbkN1clVuZG9Qb3M7CisgIGludDMyX3QgbV9uQnVmU2l6ZTsKKyAgRlhfQk9PTCBtX2JNb2RpZmllZDsKKyAgRlhfQk9PTCBtX2JWaXJnaW47CisgIEZYX0JPT0wgbV9iV29ya2luZzsKIH07CiAKLWNsYXNzIENGWF9FZGl0X1VuZG9JdGVtIDogcHVibGljIElGWF9FZGl0X1VuZG9JdGVtCi17Ci1wdWJsaWM6Ci0JQ0ZYX0VkaXRfVW5kb0l0ZW0oKSA6IG1fYkZpcnN0KFRSVUUpLCBtX2JMYXN0KFRSVUUpIHt9CitjbGFzcyBDRlhfRWRpdF9VbmRvSXRlbSA6IHB1YmxpYyBJRlhfRWRpdF9VbmRvSXRlbSB7CisgcHVibGljOgorICBDRlhfRWRpdF9VbmRvSXRlbSgpIDogbV9iRmlyc3QoVFJVRSksIG1fYkxhc3QoVFJVRSkge30KKyAgfkNGWF9FZGl0X1VuZG9JdGVtKCkgb3ZlcnJpZGUge30KIAotCUNGWF9XaWRlU3RyaW5nIEdldFVuZG9UaXRsZSgpIG92ZXJyaWRlIHsgcmV0dXJuIEwiIjsgfQorICBDRlhfV2lkZVN0cmluZyBHZXRVbmRvVGl0bGUoKSBvdmVycmlkZSB7IHJldHVybiBMIiI7IH0KIAotCXZvaWQJCQkJCQkJCQlTZXRGaXJzdChGWF9CT09MIGJGaXJzdCl7bV9iRmlyc3QgPSBiRmlyc3Q7fQotCUZYX0JPT0wJCQkJCQkJCQlJc0ZpcnN0KCl7cmV0dXJuIG1fYkZpcnN0O30KLQl2b2lkCQkJCQkJCQkJU2V0TGFzdChGWF9CT09MIGJMYXN0KXttX2JMYXN0ID0gYkxhc3Q7fQotCUZYX0JPT0wJCQkJCQkJCQlJc0xhc3QoKXtyZXR1cm4gbV9iTGFzdDt9CisgIHZvaWQgU2V0Rmlyc3QoRlhfQk9PTCBiRmlyc3QpIHsgbV9iRmlyc3QgPSBiRmlyc3Q7IH0KKyAgRlhfQk9PTCBJc0ZpcnN0KCkgeyByZXR1cm4gbV9iRmlyc3Q7IH0KKyAgdm9pZCBTZXRMYXN0KEZYX0JPT0wgYkxhc3QpIHsgbV9iTGFzdCA9IGJMYXN0OyB9CisgIEZYX0JPT0wgSXNMYXN0KCkgeyByZXR1cm4gbV9iTGFzdDsgfQogCi1wcml2YXRlOgotCUZYX0JPT0wJCQkJCQkJCQltX2JGaXJzdDsKLQlGWF9CT09MCQkJCQkJCQkJbV9iTGFzdDsKKyBwcml2YXRlOgorICBGWF9CT09MIG1fYkZpcnN0OworICBGWF9CT09MIG1fYkxhc3Q7CiB9OwogCi1jbGFzcyBDRlhfRWRpdF9Hcm91cFVuZG9JdGVtIDogcHVibGljIElGWF9FZGl0X1VuZG9JdGVtCi17Ci1wdWJsaWM6Ci0JQ0ZYX0VkaXRfR3JvdXBVbmRvSXRlbShjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RpdGxlKTsKLQl+Q0ZYX0VkaXRfR3JvdXBVbmRvSXRlbSgpIG92ZXJyaWRlOworY2xhc3MgQ0ZYX0VkaXRfR3JvdXBVbmRvSXRlbSA6IHB1YmxpYyBJRlhfRWRpdF9VbmRvSXRlbSB7CisgcHVibGljOgorICBleHBsaWNpdCBDRlhfRWRpdF9Hcm91cFVuZG9JdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGl0bGUpOworICB+Q0ZYX0VkaXRfR3JvdXBVbmRvSXRlbSgpIG92ZXJyaWRlOwogCi0Jdm9pZAkJCQkJCQlVbmRvKCkgb3ZlcnJpZGU7Ci0Jdm9pZAkJCQkJCQlSZWRvKCkgb3ZlcnJpZGU7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldFVuZG9UaXRsZSgpIG92ZXJyaWRlOworICB2b2lkIFVuZG8oKSBvdmVycmlkZTsKKyAgdm9pZCBSZWRvKCkgb3ZlcnJpZGU7CisgIENGWF9XaWRlU3RyaW5nIEdldFVuZG9UaXRsZSgpIG92ZXJyaWRlOwogCi0Jdm9pZAkJCQkJCQkJCUFkZFVuZG9JdGVtKENGWF9FZGl0X1VuZG9JdGVtKiBwVW5kb0l0ZW0pOwotCXZvaWQJCQkJCQkJCQlVcGRhdGVJdGVtcygpOworICB2b2lkIEFkZFVuZG9JdGVtKENGWF9FZGl0X1VuZG9JdGVtKiBwVW5kb0l0ZW0pOworICB2b2lkIFVwZGF0ZUl0ZW1zKCk7CiAKLXByaXZhdGU6Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJCQkJbV9zVGl0bGU7Ci0JQ0ZYX0FycmF5VGVtcGxhdGU8Q0ZYX0VkaXRfVW5kb0l0ZW0qPgltX0l0ZW1zOworIHByaXZhdGU6CisgIENGWF9XaWRlU3RyaW5nIG1fc1RpdGxlOworICBDRlhfQXJyYXlUZW1wbGF0ZTxDRlhfRWRpdF9VbmRvSXRlbSo+IG1fSXRlbXM7CiB9OwogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGWF9FZGl0X1VuZG9JdGVtIGRlcml2ZWQgY2xhc3NlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGWF9FZGl0X1VuZG9JdGVtIGRlcml2ZWQgY2xhc3NlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1jbGFzcyBDRlhFVV9JbnNlcnRXb3JkIDogcHVibGljIENGWF9FZGl0X1VuZG9JdGVtCi17Ci1wdWJsaWM6Ci0JQ0ZYRVVfSW5zZXJ0V29yZChDRlhfRWRpdCAqIHBFZGl0LCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwT2xkUGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BOZXdQbGFjZSwKLQkJRlhfV09SRCB3b3JkLCBGWF9JTlQzMiBjaGFyc2V0LCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMpOwotCXZpcnR1YWwgfkNGWEVVX0luc2VydFdvcmQoKTsKK2NsYXNzIENGWEVVX0luc2VydFdvcmQgOiBwdWJsaWMgQ0ZYX0VkaXRfVW5kb0l0ZW0geworIHB1YmxpYzoKKyAgQ0ZYRVVfSW5zZXJ0V29yZChDRlhfRWRpdCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwT2xkUGxhY2UsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwTmV3UGxhY2UsCisgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3b3JkLAorICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcyk7CisgIH5DRlhFVV9JbnNlcnRXb3JkKCkgb3ZlcnJpZGU7CiAKLQl2b2lkCQkJCQkJUmVkbygpOwotCXZvaWQJCQkJCQlVbmRvKCk7CisgIC8vIENGWF9FZGl0X1VuZG9JdGVtCisgIHZvaWQgUmVkbygpIG92ZXJyaWRlOworICB2b2lkIFVuZG8oKSBvdmVycmlkZTsKIAotcHJpdmF0ZToKLQlDRlhfRWRpdCoJCQkJCW1fcEVkaXQ7CisgcHJpdmF0ZToKKyAgQ0ZYX0VkaXQqIG1fcEVkaXQ7CiAKLQlDUFZUX1dvcmRQbGFjZQkJCQltX3dwT2xkOwotCUNQVlRfV29yZFBsYWNlCQkJCW1fd3BOZXc7Ci0JRlhfV09SRAkJCQkJCW1fV29yZDsKLQlGWF9JTlQzMgkJCQkJbV9uQ2hhcnNldDsKLQlDUFZUX1dvcmRQcm9wcwkJCQltX1dvcmRQcm9wczsKKyAgQ1BWVF9Xb3JkUGxhY2UgbV93cE9sZDsKKyAgQ1BWVF9Xb3JkUGxhY2UgbV93cE5ldzsKKyAgRlhfV09SRCBtX1dvcmQ7CisgIGludDMyX3QgbV9uQ2hhcnNldDsKKyAgQ1BWVF9Xb3JkUHJvcHMgbV9Xb3JkUHJvcHM7CiB9OwogCi1jbGFzcyBDRlhFVV9JbnNlcnRSZXR1cm4gOiBwdWJsaWMgQ0ZYX0VkaXRfVW5kb0l0ZW0KLXsKLXB1YmxpYzoKLQlDRlhFVV9JbnNlcnRSZXR1cm4oQ0ZYX0VkaXQgKiBwRWRpdCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cE9sZFBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwTmV3UGxhY2UsCi0JCQkJCQkJIGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyk7Ci0JdmlydHVhbCB+Q0ZYRVVfSW5zZXJ0UmV0dXJuKCk7CitjbGFzcyBDRlhFVV9JbnNlcnRSZXR1cm4gOiBwdWJsaWMgQ0ZYX0VkaXRfVW5kb0l0ZW0geworIHB1YmxpYzoKKyAgQ0ZYRVVfSW5zZXJ0UmV0dXJuKENGWF9FZGl0KiBwRWRpdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cE9sZFBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwTmV3UGxhY2UsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcyk7CisgIH5DRlhFVV9JbnNlcnRSZXR1cm4oKSBvdmVycmlkZTsKIAotCXZvaWQJCQkJCQlSZWRvKCk7Ci0Jdm9pZAkJCQkJCVVuZG8oKTsKKyAgLy8gQ0ZYX0VkaXRfVW5kb0l0ZW0KKyAgdm9pZCBSZWRvKCkgb3ZlcnJpZGU7CisgIHZvaWQgVW5kbygpIG92ZXJyaWRlOwogCi1wcml2YXRlOgotCUNGWF9FZGl0ICoJCQkJCW1fcEVkaXQ7CisgcHJpdmF0ZToKKyAgQ0ZYX0VkaXQqIG1fcEVkaXQ7CiAKLQlDUFZUX1dvcmRQbGFjZQkJCQltX3dwT2xkOwotCUNQVlRfV29yZFBsYWNlCQkJCW1fd3BOZXc7Ci0JQ1BWVF9TZWNQcm9wcwkJCQltX1NlY1Byb3BzOwotCUNQVlRfV29yZFByb3BzCQkJCW1fV29yZFByb3BzOworICBDUFZUX1dvcmRQbGFjZSBtX3dwT2xkOworICBDUFZUX1dvcmRQbGFjZSBtX3dwTmV3OworICBDUFZUX1NlY1Byb3BzIG1fU2VjUHJvcHM7CisgIENQVlRfV29yZFByb3BzIG1fV29yZFByb3BzOwogfTsKIAotY2xhc3MgQ0ZYRVVfQmFja3NwYWNlIDogcHVibGljIENGWF9FZGl0X1VuZG9JdGVtCi17Ci1wdWJsaWM6Ci0JQ0ZYRVVfQmFja3NwYWNlKENGWF9FZGl0ICogcEVkaXQsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BPbGRQbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cE5ld1BsYWNlLAotCQkJCQkJRlhfV09SRCB3b3JkLCBGWF9JTlQzMiBjaGFyc2V0LAotCQkJCQkJY29uc3QgQ1BWVF9TZWNQcm9wcyAmIFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAmIFdvcmRQcm9wcyk7Ci0JdmlydHVhbCB+Q0ZYRVVfQmFja3NwYWNlKCk7CitjbGFzcyBDRlhFVV9CYWNrc3BhY2UgOiBwdWJsaWMgQ0ZYX0VkaXRfVW5kb0l0ZW0geworIHB1YmxpYzoKKyAgQ0ZYRVVfQmFja3NwYWNlKENGWF9FZGl0KiBwRWRpdCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cE9sZFBsYWNlLAorICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwTmV3UGxhY2UsCisgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdvcmQsCisgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzJiBTZWNQcm9wcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzJiBXb3JkUHJvcHMpOworICB+Q0ZYRVVfQmFja3NwYWNlKCkgb3ZlcnJpZGU7CiAKLQl2b2lkCQkJCQkJUmVkbygpOwotCXZvaWQJCQkJCQlVbmRvKCk7CisgIC8vIENGWF9FZGl0X1VuZG9JdGVtCisgIHZvaWQgUmVkbygpIG92ZXJyaWRlOworICB2b2lkIFVuZG8oKSBvdmVycmlkZTsKIAotcHJpdmF0ZToKLQlDRlhfRWRpdCAqCQkJCQltX3BFZGl0OworIHByaXZhdGU6CisgIENGWF9FZGl0KiBtX3BFZGl0OwogCi0JQ1BWVF9Xb3JkUGxhY2UJCQkJbV93cE9sZDsKLQlDUFZUX1dvcmRQbGFjZQkJCQltX3dwTmV3OwotCUZYX1dPUkQJCQkJCQltX1dvcmQ7Ci0JRlhfSU5UMzIJCQkJCW1fbkNoYXJzZXQ7Ci0JQ1BWVF9TZWNQcm9wcwkJCQltX1NlY1Byb3BzOwotCUNQVlRfV29yZFByb3BzCQkJCW1fV29yZFByb3BzOworICBDUFZUX1dvcmRQbGFjZSBtX3dwT2xkOworICBDUFZUX1dvcmRQbGFjZSBtX3dwTmV3OworICBGWF9XT1JEIG1fV29yZDsKKyAgaW50MzJfdCBtX25DaGFyc2V0OworICBDUFZUX1NlY1Byb3BzIG1fU2VjUHJvcHM7CisgIENQVlRfV29yZFByb3BzIG1fV29yZFByb3BzOwogfTsKIAotY2xhc3MgQ0ZYRVVfRGVsZXRlIDogcHVibGljIENGWF9FZGl0X1VuZG9JdGVtCi17Ci1wdWJsaWM6Ci0JQ0ZYRVVfRGVsZXRlKENGWF9FZGl0ICogcEVkaXQsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BPbGRQbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cE5ld1BsYWNlLAotCQkJCQkJRlhfV09SRCB3b3JkLCBGWF9JTlQzMiBjaGFyc2V0LAotCQkJCQkJY29uc3QgQ1BWVF9TZWNQcm9wcyAmIFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAmIFdvcmRQcm9wcywgRlhfQk9PTCBiU2VjRW5kKTsKLQl2aXJ0dWFsIH5DRlhFVV9EZWxldGUoKTsKK2NsYXNzIENGWEVVX0RlbGV0ZSA6IHB1YmxpYyBDRlhfRWRpdF9VbmRvSXRlbSB7CisgcHVibGljOgorICBDRlhFVV9EZWxldGUoQ0ZYX0VkaXQqIHBFZGl0LAorICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwT2xkUGxhY2UsCisgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BOZXdQbGFjZSwKKyAgICAgICAgICAgICAgIEZYX1dPUkQgd29yZCwKKyAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKKyAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMmIFNlY1Byb3BzLAorICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMmIFdvcmRQcm9wcywKKyAgICAgICAgICAgICAgIEZYX0JPT0wgYlNlY0VuZCk7CisgIH5DRlhFVV9EZWxldGUoKSBvdmVycmlkZTsKIAotCXZvaWQJCQkJCQlSZWRvKCk7Ci0Jdm9pZAkJCQkJCVVuZG8oKTsKKyAgLy8gQ0ZYX0VkaXRfVW5kb0l0ZW0KKyAgdm9pZCBSZWRvKCkgb3ZlcnJpZGU7CisgIHZvaWQgVW5kbygpIG92ZXJyaWRlOwogCi1wcml2YXRlOgotCUNGWF9FZGl0ICoJCQkJCW1fcEVkaXQ7CisgcHJpdmF0ZToKKyAgQ0ZYX0VkaXQqIG1fcEVkaXQ7CiAKLQlDUFZUX1dvcmRQbGFjZQkJCQltX3dwT2xkOwotCUNQVlRfV29yZFBsYWNlCQkJCW1fd3BOZXc7Ci0JRlhfV09SRAkJCQkJCW1fV29yZDsKLQlGWF9JTlQzMgkJCQkJbV9uQ2hhcnNldDsKLQlDUFZUX1NlY1Byb3BzCQkJCW1fU2VjUHJvcHM7Ci0JQ1BWVF9Xb3JkUHJvcHMJCQkJbV9Xb3JkUHJvcHM7Ci0JRlhfQk9PTAkJCQkJCW1fYlNlY0VuZDsKKyAgQ1BWVF9Xb3JkUGxhY2UgbV93cE9sZDsKKyAgQ1BWVF9Xb3JkUGxhY2UgbV93cE5ldzsKKyAgRlhfV09SRCBtX1dvcmQ7CisgIGludDMyX3QgbV9uQ2hhcnNldDsKKyAgQ1BWVF9TZWNQcm9wcyBtX1NlY1Byb3BzOworICBDUFZUX1dvcmRQcm9wcyBtX1dvcmRQcm9wczsKKyAgRlhfQk9PTCBtX2JTZWNFbmQ7CiB9OwogCi1jbGFzcyBDRlhFVV9DbGVhciA6IHB1YmxpYyBDRlhfRWRpdF9VbmRvSXRlbQotewotcHVibGljOgotCUNGWEVVX0NsZWFyKENGWF9FZGl0ICogcEVkaXQsIGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3JTZWwsIGNvbnN0IENGWF9XaWRlU3RyaW5nICYgc3dUZXh0KTsKLQl2aXJ0dWFsIH5DRlhFVV9DbGVhcigpOworY2xhc3MgQ0ZYRVVfQ2xlYXIgOiBwdWJsaWMgQ0ZYX0VkaXRfVW5kb0l0ZW0geworIHB1YmxpYzoKKyAgQ0ZYRVVfQ2xlYXIoQ0ZYX0VkaXQqIHBFZGl0LAorICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3JTZWwsCisgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd1RleHQpOworICB+Q0ZYRVVfQ2xlYXIoKSBvdmVycmlkZTsKIAotCXZvaWQJCQkJCQlSZWRvKCk7Ci0Jdm9pZAkJCQkJCVVuZG8oKTsKKyAgLy8gQ0ZYX0VkaXRfVW5kb0l0ZW0KKyAgdm9pZCBSZWRvKCkgb3ZlcnJpZGU7CisgIHZvaWQgVW5kbygpIG92ZXJyaWRlOwogCi1wcml2YXRlOgotCUNGWF9FZGl0KgkJCQkJbV9wRWRpdDsKKyBwcml2YXRlOgorICBDRlhfRWRpdCogbV9wRWRpdDsKIAotCUNQVlRfV29yZFJhbmdlCQkJCW1fd3JTZWw7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJbV9zd1RleHQ7CisgIENQVlRfV29yZFJhbmdlIG1fd3JTZWw7CisgIENGWF9XaWRlU3RyaW5nIG1fc3dUZXh0OwogfTsKIAotY2xhc3MgQ0ZYRVVfQ2xlYXJSaWNoIDogcHVibGljIENGWF9FZGl0X1VuZG9JdGVtCi17Ci1wdWJsaWM6Ci0JQ0ZYRVVfQ2xlYXJSaWNoKENGWF9FZGl0ICogcEVkaXQsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BPbGRQbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cE5ld1BsYWNlLAotCQkJCQkJY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3clNlbCwKLQkJCQkJICAgRlhfV09SRCB3b3JkLCBGWF9JTlQzMiBjaGFyc2V0LAotCQkJCQkgICBjb25zdCBDUFZUX1NlY1Byb3BzICYgU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICYgV29yZFByb3BzKTsKLQl2aXJ0dWFsIH5DRlhFVV9DbGVhclJpY2goKTsKK2NsYXNzIENGWEVVX0NsZWFyUmljaCA6IHB1YmxpYyBDRlhfRWRpdF9VbmRvSXRlbSB7CisgcHVibGljOgorICBDRlhFVV9DbGVhclJpY2goQ0ZYX0VkaXQqIHBFZGl0LAorICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwT2xkUGxhY2UsCisgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BOZXdQbGFjZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlJiB3clNlbCwKKyAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd29yZCwKKyAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMmIFNlY1Byb3BzLAorICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMmIFdvcmRQcm9wcyk7CisgIH5DRlhFVV9DbGVhclJpY2goKSBvdmVycmlkZTsKIAotCXZvaWQJCQkJCQlSZWRvKCk7Ci0Jdm9pZAkJCQkJCVVuZG8oKTsKKyAgLy8gQ0ZYX0VkaXRfVW5kb0l0ZW0KKyAgdm9pZCBSZWRvKCkgb3ZlcnJpZGU7CisgIHZvaWQgVW5kbygpIG92ZXJyaWRlOwogCi1wcml2YXRlOgotCUNGWF9FZGl0ICoJCQkJCW1fcEVkaXQ7CisgcHJpdmF0ZToKKyAgQ0ZYX0VkaXQqIG1fcEVkaXQ7CiAKLQlDUFZUX1dvcmRQbGFjZQkJCQltX3dwT2xkOwotCUNQVlRfV29yZFBsYWNlCQkJCW1fd3BOZXc7Ci0JQ1BWVF9Xb3JkUmFuZ2UJCQkJbV93clNlbDsKLQlGWF9XT1JECQkJCQkJbV9Xb3JkOwotCUZYX0lOVDMyCQkJCQltX25DaGFyc2V0OwotCUNQVlRfU2VjUHJvcHMJCQkJbV9TZWNQcm9wczsKLQlDUFZUX1dvcmRQcm9wcwkJCQltX1dvcmRQcm9wczsKKyAgQ1BWVF9Xb3JkUGxhY2UgbV93cE9sZDsKKyAgQ1BWVF9Xb3JkUGxhY2UgbV93cE5ldzsKKyAgQ1BWVF9Xb3JkUmFuZ2UgbV93clNlbDsKKyAgRlhfV09SRCBtX1dvcmQ7CisgIGludDMyX3QgbV9uQ2hhcnNldDsKKyAgQ1BWVF9TZWNQcm9wcyBtX1NlY1Byb3BzOworICBDUFZUX1dvcmRQcm9wcyBtX1dvcmRQcm9wczsKIH07CiAKLWNsYXNzIENGWEVVX0luc2VydFRleHQgOiBwdWJsaWMgQ0ZYX0VkaXRfVW5kb0l0ZW0KLXsKLXB1YmxpYzoKLQlDRlhFVV9JbnNlcnRUZXh0KENGWF9FZGl0ICogcEVkaXQsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BPbGRQbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cE5ld1BsYWNlLAotCQkJCQkJICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiBzd1RleHQsIEZYX0lOVDMyIGNoYXJzZXQsCi0JCQkJCQkgICBjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMpOwotCXZpcnR1YWwgfkNGWEVVX0luc2VydFRleHQoKTsKK2NsYXNzIENGWEVVX0luc2VydFRleHQgOiBwdWJsaWMgQ0ZYX0VkaXRfVW5kb0l0ZW0geworIHB1YmxpYzoKKyAgQ0ZYRVVfSW5zZXJ0VGV4dChDRlhfRWRpdCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwT2xkUGxhY2UsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwTmV3UGxhY2UsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3VGV4dCwKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzKTsKKyAgfkNGWEVVX0luc2VydFRleHQoKSBvdmVycmlkZTsKIAotCXZvaWQJCQkJCQlSZWRvKCk7Ci0Jdm9pZAkJCQkJCVVuZG8oKTsKKyAgLy8gQ0ZYX0VkaXRfVW5kb0l0ZW0KKyAgdm9pZCBSZWRvKCkgb3ZlcnJpZGU7CisgIHZvaWQgVW5kbygpIG92ZXJyaWRlOwogCi1wcml2YXRlOgotCUNGWF9FZGl0ICoJCQkJCW1fcEVkaXQ7CisgcHJpdmF0ZToKKyAgQ0ZYX0VkaXQqIG1fcEVkaXQ7CiAKLQlDUFZUX1dvcmRQbGFjZQkJCQltX3dwT2xkOwotCUNQVlRfV29yZFBsYWNlCQkJCW1fd3BOZXc7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJbV9zd1RleHQ7Ci0JRlhfSU5UMzIJCQkJCW1fbkNoYXJzZXQ7Ci0JQ1BWVF9TZWNQcm9wcwkJCQltX1NlY1Byb3BzOwotCUNQVlRfV29yZFByb3BzCQkJCW1fV29yZFByb3BzOworICBDUFZUX1dvcmRQbGFjZSBtX3dwT2xkOworICBDUFZUX1dvcmRQbGFjZSBtX3dwTmV3OworICBDRlhfV2lkZVN0cmluZyBtX3N3VGV4dDsKKyAgaW50MzJfdCBtX25DaGFyc2V0OworICBDUFZUX1NlY1Byb3BzIG1fU2VjUHJvcHM7CisgIENQVlRfV29yZFByb3BzIG1fV29yZFByb3BzOwogfTsKIAotY2xhc3MgQ0ZYRVVfU2V0U2VjUHJvcHMgOiBwdWJsaWMgQ0ZYX0VkaXRfVW5kb0l0ZW0KLXsKLXB1YmxpYzoKLQlDRlhFVV9TZXRTZWNQcm9wcyhDRlhfRWRpdCAqIHBFZGl0LCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlLCBFRElUX1BST1BTX0UgZXAsIAotCQljb25zdCBDUFZUX1NlY1Byb3BzICYgb2xkc2VjcHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICYgb2xkd29yZHByb3BzLCAKLQkJY29uc3QgQ1BWVF9TZWNQcm9wcyAmIG5ld3NlY3Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAmIG5ld3dvcmRwcm9wcywgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiByYW5nZSk7Ci0JdmlydHVhbCB+Q0ZYRVVfU2V0U2VjUHJvcHMoKTsKK2NsYXNzIENGWEVVX1NldFNlY1Byb3BzIDogcHVibGljIENGWF9FZGl0X1VuZG9JdGVtIHsKKyBwdWJsaWM6CisgIENGWEVVX1NldFNlY1Byb3BzKENGWF9FZGl0KiBwRWRpdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICBFRElUX1BST1BTX0UgZXAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMmIG9sZHNlY3Byb3BzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyYgb2xkd29yZHByb3BzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzJiBuZXdzZWNwcm9wcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMmIG5ld3dvcmRwcm9wcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHJhbmdlKTsKKyAgfkNGWEVVX1NldFNlY1Byb3BzKCkgb3ZlcnJpZGU7CiAKLQl2b2lkCQkJCQkJUmVkbygpOwotCXZvaWQJCQkJCQlVbmRvKCk7CisgIC8vIENGWF9FZGl0X1VuZG9JdGVtCisgIHZvaWQgUmVkbygpIG92ZXJyaWRlOworICB2b2lkIFVuZG8oKSBvdmVycmlkZTsKIAotcHJpdmF0ZToKLQlDRlhfRWRpdCAqCQkJCQltX3BFZGl0OwotCUNQVlRfV29yZFBsYWNlCQkJCW1fd3BQbGFjZTsKLQlDUFZUX1dvcmRSYW5nZQkJCQltX3dyUGxhY2U7Ci0JRURJVF9QUk9QU19FCQkJCW1fZVByb3BzOworIHByaXZhdGU6CisgIENGWF9FZGl0KiBtX3BFZGl0OworICBDUFZUX1dvcmRQbGFjZSBtX3dwUGxhY2U7CisgIENQVlRfV29yZFJhbmdlIG1fd3JQbGFjZTsKKyAgRURJVF9QUk9QU19FIG1fZVByb3BzOwogCi0JQ1BWVF9TZWNQcm9wcwkJCQltX09sZFNlY1Byb3BzOwotCUNQVlRfU2VjUHJvcHMJCQkJbV9OZXdTZWNQcm9wczsKLQlDUFZUX1dvcmRQcm9wcwkJCQltX09sZFdvcmRQcm9wczsKLQlDUFZUX1dvcmRQcm9wcwkJCQltX05ld1dvcmRQcm9wczsJCisgIENQVlRfU2VjUHJvcHMgbV9PbGRTZWNQcm9wczsKKyAgQ1BWVF9TZWNQcm9wcyBtX05ld1NlY1Byb3BzOworICBDUFZUX1dvcmRQcm9wcyBtX09sZFdvcmRQcm9wczsKKyAgQ1BWVF9Xb3JkUHJvcHMgbV9OZXdXb3JkUHJvcHM7CiB9OwogCi1jbGFzcyBDRlhFVV9TZXRXb3JkUHJvcHMgOiBwdWJsaWMgQ0ZYX0VkaXRfVW5kb0l0ZW0KLXsKLXB1YmxpYzoKLQlDRlhFVV9TZXRXb3JkUHJvcHMoQ0ZYX0VkaXQgKiBwRWRpdCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgRURJVF9QUk9QU19FIGVwLCAKLQkJY29uc3QgQ1BWVF9Xb3JkUHJvcHMgJiBvbGRwcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgJiBuZXdwcm9wcywgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiByYW5nZSk7Ci0JdmlydHVhbCB+Q0ZYRVVfU2V0V29yZFByb3BzKCk7CitjbGFzcyBDRlhFVV9TZXRXb3JkUHJvcHMgOiBwdWJsaWMgQ0ZYX0VkaXRfVW5kb0l0ZW0geworIHB1YmxpYzoKKyAgQ0ZYRVVfU2V0V29yZFByb3BzKENGWF9FZGl0KiBwRWRpdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgIEVESVRfUFJPUFNfRSBlcCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzJiBvbGRwcm9wcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzJiBuZXdwcm9wcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlJiByYW5nZSk7CisgIH5DRlhFVV9TZXRXb3JkUHJvcHMoKSBvdmVycmlkZTsKIAotCXZvaWQJCQkJCQlSZWRvKCk7Ci0Jdm9pZAkJCQkJCVVuZG8oKTsKKyAgLy8gQ0ZYX0VkaXRfVW5kb0l0ZW0KKyAgdm9pZCBSZWRvKCkgb3ZlcnJpZGU7CisgIHZvaWQgVW5kbygpIG92ZXJyaWRlOwogCi1wcml2YXRlOgotCUNGWF9FZGl0ICoJCQkJCW1fcEVkaXQ7Ci0JQ1BWVF9Xb3JkUGxhY2UJCQkJbV93cFBsYWNlOwotCUNQVlRfV29yZFJhbmdlCQkJCW1fd3JQbGFjZTsKLQlFRElUX1BST1BTX0UJCQkJbV9lUHJvcHM7Ci0JCi0JQ1BWVF9Xb3JkUHJvcHMJCQkJbV9PbGRXb3JkUHJvcHM7Ci0JQ1BWVF9Xb3JkUHJvcHMJCQkJbV9OZXdXb3JkUHJvcHM7CQorIHByaXZhdGU6CisgIENGWF9FZGl0KiBtX3BFZGl0OworICBDUFZUX1dvcmRQbGFjZSBtX3dwUGxhY2U7CisgIENQVlRfV29yZFJhbmdlIG1fd3JQbGFjZTsKKyAgRURJVF9QUk9QU19FIG1fZVByb3BzOworCisgIENQVlRfV29yZFByb3BzIG1fT2xkV29yZFByb3BzOworICBDUFZUX1dvcmRQcm9wcyBtX05ld1dvcmRQcm9wczsKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0ZYX0VkaXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1jbGFzcyBDRlhfRWRpdCA6IHB1YmxpYyBJRlhfRWRpdAotewotCWZyaWVuZCBjbGFzcyBDRlhfRWRpdF9JdGVyYXRvcjsKLQlmcmllbmQgY2xhc3MgQ0ZYRVVfSW5zZXJ0V29yZDsKLQlmcmllbmQgY2xhc3MgQ0ZYRVVfSW5zZXJ0UmV0dXJuOwotCWZyaWVuZCBjbGFzcyBDRlhFVV9CYWNrc3BhY2U7Ci0JZnJpZW5kIGNsYXNzIENGWEVVX0RlbGV0ZTsKLQlmcmllbmQgY2xhc3MgQ0ZYRVVfQ2xlYXI7Ci0JZnJpZW5kIGNsYXNzIENGWEVVX0NsZWFyUmljaDsKLQlmcmllbmQgY2xhc3MgQ0ZYRVVfU2V0U2VjUHJvcHM7Ci0JZnJpZW5kIGNsYXNzIENGWEVVX1NldFdvcmRQcm9wczsJCi0JZnJpZW5kIGNsYXNzIENGWEVVX0luc2VydFRleHQ7CitjbGFzcyBDRlhfRWRpdCA6IHB1YmxpYyBJRlhfRWRpdCB7CisgIGZyaWVuZCBjbGFzcyBDRlhfRWRpdF9JdGVyYXRvcjsKKyAgZnJpZW5kIGNsYXNzIENGWEVVX0luc2VydFdvcmQ7CisgIGZyaWVuZCBjbGFzcyBDRlhFVV9JbnNlcnRSZXR1cm47CisgIGZyaWVuZCBjbGFzcyBDRlhFVV9CYWNrc3BhY2U7CisgIGZyaWVuZCBjbGFzcyBDRlhFVV9EZWxldGU7CisgIGZyaWVuZCBjbGFzcyBDRlhFVV9DbGVhcjsKKyAgZnJpZW5kIGNsYXNzIENGWEVVX0NsZWFyUmljaDsKKyAgZnJpZW5kIGNsYXNzIENGWEVVX1NldFNlY1Byb3BzOworICBmcmllbmQgY2xhc3MgQ0ZYRVVfU2V0V29yZFByb3BzOworICBmcmllbmQgY2xhc3MgQ0ZYRVVfSW5zZXJ0VGV4dDsKIAotcHVibGljOgotCUNGWF9FZGl0KElQREZfVmFyaWFibGVUZXh0ICogcFZUKTsKLQl2aXJ0dWFsIH5DRlhfRWRpdCgpOworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0ZYX0VkaXQoSVBERl9WYXJpYWJsZVRleHQqIHBWVCk7CisgIH5DRlhfRWRpdCgpIG92ZXJyaWRlOwogCi0Jdm9pZAkJCQkJCQkJCVNldEZvbnRNYXAoSUZYX0VkaXRfRm9udE1hcCAqIHBGb250TWFwKTsJCi0Jdm9pZAkJCQkJCQkJCVNldFZUUHJvdmlkZXIoSVBERl9WYXJpYWJsZVRleHRfUHJvdmlkZXIqIHBQcm92aWRlcik7Ci0Jdm9pZAkJCQkJCQkJCVNldE5vdGlmeShJRlhfRWRpdF9Ob3RpZnkgKiBwTm90aWZ5KTsKLQl2b2lkCQkJCQkJCQkJU2V0T3ByTm90aWZ5KElGWF9FZGl0X09wck5vdGlmeSogcE9wck5vdGlmeSk7Ci0JSUZYX0VkaXRfSXRlcmF0b3IqCQkJCQkJR2V0SXRlcmF0b3IoKTsKLQlJUERGX1ZhcmlhYmxlVGV4dCAqCQkJCQkJR2V0VmFyaWFibGVUZXh0KCk7Ci0JSUZYX0VkaXRfRm9udE1hcCoJCQkJCQlHZXRGb250TWFwKCk7CisgIC8vIElGWF9FZGl0CisgIHZvaWQgU2V0Rm9udE1hcChJRlhfRWRpdF9Gb250TWFwKiBwRm9udE1hcCkgb3ZlcnJpZGU7CisgIHZvaWQgU2V0VlRQcm92aWRlcihJUERGX1ZhcmlhYmxlVGV4dF9Qcm92aWRlciogcFByb3ZpZGVyKSBvdmVycmlkZTsKKyAgdm9pZCBTZXROb3RpZnkoSUZYX0VkaXRfTm90aWZ5KiBwTm90aWZ5KSBvdmVycmlkZTsKKyAgdm9pZCBTZXRPcHJOb3RpZnkoSUZYX0VkaXRfT3ByTm90aWZ5KiBwT3ByTm90aWZ5KSBvdmVycmlkZTsKKyAgSUZYX0VkaXRfSXRlcmF0b3IqIEdldEl0ZXJhdG9yKCkgb3ZlcnJpZGU7CisgIElQREZfVmFyaWFibGVUZXh0KiBHZXRWYXJpYWJsZVRleHQoKSBvdmVycmlkZTsKKyAgSUZYX0VkaXRfRm9udE1hcCogR2V0Rm9udE1hcCgpIG92ZXJyaWRlOworICB2b2lkIEluaXRpYWxpemUoKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRQbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0JiByZWN0LCBGWF9CT09MIGJQYWludCA9IFRSVUUpIG92ZXJyaWRlOworICB2b2lkIFNldFNjcm9sbFBvcyhjb25zdCBDUERGX1BvaW50JiBwb2ludCkgb3ZlcnJpZGU7CisgIHZvaWQgU2V0QWxpZ25tZW50SChpbnQzMl90IG5Gb3JtYXQgPSAwLCBGWF9CT09MIGJQYWludCA9IFRSVUUpIG92ZXJyaWRlOworICB2b2lkIFNldEFsaWdubWVudFYoaW50MzJfdCBuRm9ybWF0ID0gMCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRQYXNzd29yZENoYXIoRlhfV09SRCB3U3ViV29yZCA9ICcqJywgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRMaW1pdENoYXIoaW50MzJfdCBuTGltaXRDaGFyID0gMCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRDaGFyQXJyYXkoaW50MzJfdCBuQ2hhckFycmF5ID0gMCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSA9IDAuMGYsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgb3ZlcnJpZGU7CisgIHZvaWQgU2V0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZSA9IDEwMCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgb3ZlcnJpZGU7CisgIHZvaWQgU2V0TXVsdGlMaW5lKEZYX0JPT0wgYk11bHRpTGluZSA9IFRSVUUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgb3ZlcnJpZGU7CisgIHZvaWQgU2V0QXV0b1JldHVybihGWF9CT09MIGJBdXRvID0gVFJVRSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRBdXRvRm9udFNpemUoRlhfQk9PTCBiQXV0byA9IFRSVUUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgb3ZlcnJpZGU7CisgIHZvaWQgU2V0QXV0b1Njcm9sbChGWF9CT09MIGJBdXRvID0gVFJVRSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSkgb3ZlcnJpZGU7CisgIHZvaWQgU2V0VGV4dE92ZXJmbG93KEZYX0JPT0wgYkFsbG93ZWQgPSBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBJc1JpY2hUZXh0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2V0UmljaFRleHQoRlhfQk9PTCBiUmljaFRleHQgPSBUUlVFLCBGWF9CT09MIGJQYWludCA9IFRSVUUpIG92ZXJyaWRlOworICBGWF9CT09MIFNldFJpY2hGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpIG92ZXJyaWRlOworICBGWF9CT09MIFNldFJpY2hGb250SW5kZXgoaW50MzJfdCBuRm9udEluZGV4KSBvdmVycmlkZTsKKyAgRlhfQk9PTCBTZXRSaWNoVGV4dENvbG9yKEZYX0NPTE9SUkVGIGR3Q29sb3IpIG92ZXJyaWRlOworICBGWF9CT09MIFNldFJpY2hUZXh0U2NyaXB0KGludDMyX3QgblNjcmlwdFR5cGUpIG92ZXJyaWRlOworICBGWF9CT09MIFNldFJpY2hUZXh0Qm9sZChGWF9CT09MIGJCb2xkID0gVFJVRSkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgU2V0UmljaFRleHRJdGFsaWMoRlhfQk9PTCBiSXRhbGljID0gVFJVRSkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgU2V0UmljaFRleHRVbmRlcmxpbmUoRlhfQk9PTCBiVW5kZXJsaW5lID0gVFJVRSkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgU2V0UmljaFRleHRDcm9zc291dChGWF9CT09MIGJDcm9zc291dCA9IFRSVUUpIG92ZXJyaWRlOworICBGWF9CT09MIFNldFJpY2hUZXh0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpIG92ZXJyaWRlOworICBGWF9CT09MIFNldFJpY2hUZXh0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZSA9IDEwMCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgU2V0UmljaFRleHRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcpIG92ZXJyaWRlOworICBGWF9CT09MIFNldFJpY2hUZXh0TGluZUluZGVudChGWF9GTE9BVCBmTGluZUluZGVudCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgU2V0UmljaFRleHRBbGlnbm1lbnQoaW50MzJfdCBuQWxpZ25tZW50KSBvdmVycmlkZTsKKyAgdm9pZCBPbk1vdXNlRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDdHJsKSBvdmVycmlkZTsKKyAgdm9pZCBPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDdHJsKSBvdmVycmlkZTsKKyAgdm9pZCBPblZLX1VQKEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJDdHJsKSBvdmVycmlkZTsKKyAgdm9pZCBPblZLX0RPV04oRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpIG92ZXJyaWRlOworICB2b2lkIE9uVktfTEVGVChGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgb3ZlcnJpZGU7CisgIHZvaWQgT25WS19SSUdIVChGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgb3ZlcnJpZGU7CisgIHZvaWQgT25WS19IT01FKEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJDdHJsKSBvdmVycmlkZTsKKyAgdm9pZCBPblZLX0VORChGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgb3ZlcnJpZGU7CisgIHZvaWQgU2V0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCwKKyAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVCwKKyAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMqIHBTZWNQcm9wcyA9IE5VTEwsCisgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcyA9IE5VTEwpIG92ZXJyaWRlOworICBGWF9CT09MIEluc2VydFdvcmQoRlhfV09SRCB3b3JkLAorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0ID0gREVGQVVMVF9DSEFSU0VULAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMgPSBOVUxMKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBJbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMgPSBOVUxMKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBCYWNrc3BhY2UoKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBEZWxldGUoKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBDbGVhcigpIG92ZXJyaWRlOworICBGWF9CT09MIEluc2VydFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMgPSBOVUxMKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBSZWRvKCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgVW5kbygpIG92ZXJyaWRlOworICBpbnQzMl90IFdvcmRQbGFjZVRvV29yZEluZGV4KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3Qgb3ZlcnJpZGU7CisgIENQVlRfV29yZFBsYWNlIFdvcmRJbmRleFRvV29yZFBsYWNlKGludDMyX3QgaW5kZXgpIGNvbnN0IG92ZXJyaWRlOworICBDUFZUX1dvcmRQbGFjZSBHZXRMaW5lQmVnaW5QbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IG92ZXJyaWRlOworICBDUFZUX1dvcmRQbGFjZSBHZXRMaW5lRW5kUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCBvdmVycmlkZTsKKyAgQ1BWVF9Xb3JkUGxhY2UgR2V0U2VjdGlvbkJlZ2luUGxhY2UoCisgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IG92ZXJyaWRlOworICBDUFZUX1dvcmRQbGFjZSBHZXRTZWN0aW9uRW5kUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCBvdmVycmlkZTsKKyAgQ1BWVF9Xb3JkUGxhY2UgU2VhcmNoV29yZFBsYWNlKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdCBvdmVycmlkZTsKKyAgaW50MzJfdCBHZXRDYXJldCgpIGNvbnN0IG92ZXJyaWRlOworICBDUFZUX1dvcmRQbGFjZSBHZXRDYXJldFdvcmRQbGFjZSgpIGNvbnN0IG92ZXJyaWRlOworICBDRlhfV2lkZVN0cmluZyBHZXRTZWxUZXh0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIENGWF9XaWRlU3RyaW5nIEdldFRleHQoKSBjb25zdCBvdmVycmlkZTsKKyAgRlhfRkxPQVQgR2V0Rm9udFNpemUoKSBjb25zdCBvdmVycmlkZTsKKyAgRlhfV09SRCBHZXRQYXNzd29yZENoYXIoKSBjb25zdCBvdmVycmlkZTsKKyAgQ1BERl9Qb2ludCBHZXRTY3JvbGxQb3MoKSBjb25zdCBvdmVycmlkZTsKKyAgaW50MzJfdCBHZXRDaGFyQXJyYXkoKSBjb25zdCBvdmVycmlkZTsKKyAgQ1BERl9SZWN0IEdldFBsYXRlUmVjdCgpIGNvbnN0IG92ZXJyaWRlOworICBDUERGX1JlY3QgR2V0Q29udGVudFJlY3QoKSBjb25zdCBvdmVycmlkZTsKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0UmFuZ2VUZXh0KGNvbnN0IENQVlRfV29yZFJhbmdlJiByYW5nZSkgY29uc3Qgb3ZlcnJpZGU7CisgIGludDMyX3QgR2V0SG9yelNjYWxlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIEZYX0ZMT0FUIEdldENoYXJTcGFjZSgpIGNvbnN0IG92ZXJyaWRlOworICBpbnQzMl90IEdldFRvdGFsV29yZHMoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXRTZWwoaW50MzJfdCBuU3RhcnRDaGFyLCBpbnQzMl90IG5FbmRDaGFyKSBvdmVycmlkZTsKKyAgdm9pZCBHZXRTZWwoaW50MzJfdCYgblN0YXJ0Q2hhciwgaW50MzJfdCYgbkVuZENoYXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNlbGVjdEFsbCgpIG92ZXJyaWRlOworICB2b2lkIFNlbGVjdE5vbmUoKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBJc1NlbGVjdGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgUGFpbnQoKSBvdmVycmlkZTsKKyAgdm9pZCBFbmFibGVOb3RpZnkoRlhfQk9PTCBiTm90aWZ5KSBvdmVycmlkZTsKKyAgdm9pZCBFbmFibGVSZWZyZXNoKEZYX0JPT0wgYlJlZnJlc2gpIG92ZXJyaWRlOworICB2b2lkIFJlZnJlc2hXb3JkUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRDYXJldChpbnQzMl90IG5Qb3MpIG92ZXJyaWRlOworICBDUFZUX1dvcmRSYW5nZSBHZXRXaG9sZVdvcmRSYW5nZSgpIGNvbnN0IG92ZXJyaWRlOworICBDUFZUX1dvcmRSYW5nZSBHZXRTZWxlY3RXb3JkUmFuZ2UoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBFbmFibGVVbmRvKEZYX0JPT0wgYlVuZG8pIG92ZXJyaWRlOworICB2b2lkIEVuYWJsZU9wck5vdGlmeShGWF9CT09MIGJOb3RpZnkpIG92ZXJyaWRlOworICBGWF9CT09MIElzVGV4dEZ1bGwoKSBjb25zdCBvdmVycmlkZTsKKyAgRlhfQk9PTCBJc1RleHRPdmVyZmxvdygpIGNvbnN0OworICBGWF9CT09MIENhblVuZG8oKSBjb25zdCBvdmVycmlkZTsKKyAgRlhfQk9PTCBDYW5SZWRvKCkgY29uc3Qgb3ZlcnJpZGU7CisgIEZYX0JPT0wgSXNNb2RpZmllZCgpIGNvbnN0IG92ZXJyaWRlOworICBDUFZUX1dvcmRSYW5nZSBHZXRWaXNpYmxlV29yZFJhbmdlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgQWRkVW5kb0l0ZW0oSUZYX0VkaXRfVW5kb0l0ZW0qIHBVbmRvSXRlbSkgb3ZlcnJpZGU7CiAKLQl2b2lkCQkJCQkJCQkJSW5pdGlhbGl6ZSgpOwotCXZvaWQJCQkJCQkJCQlTZXRQbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKLQl2b2lkCQkJCQkJCQkJU2V0U2Nyb2xsUG9zKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCk7CisgIEZYX0JPT0wgRW1wdHkoKTsKIAotCXZvaWQJCQkJCQkJCQlTZXRBbGlnbm1lbnRIKEZYX0lOVDMyIG5Gb3JtYXQgPSAwLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwotCXZvaWQJCQkJCQkJCQlTZXRBbGlnbm1lbnRWKEZYX0lOVDMyIG5Gb3JtYXQgPSAwLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwotCXZvaWQJCQkJCQkJCQlTZXRQYXNzd29yZENoYXIoRlhfV09SRCB3U3ViV29yZCA9ICcqJywgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKLQl2b2lkCQkJCQkJCQkJU2V0TGltaXRDaGFyKEZYX0lOVDMyIG5MaW1pdENoYXIgPSAwLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOwotCXZvaWQJCQkJCQkJCQlTZXRDaGFyQXJyYXkoRlhfSU5UMzIgbkNoYXJBcnJheSA9IDAsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7Ci0Jdm9pZAkJCQkJCQkJCVNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlID0gMC4wZiwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKLQl2b2lkCQkJCQkJCQkJU2V0SG9yelNjYWxlKEZYX0lOVDMyIG5Ib3J6U2NhbGUgPSAxMDAsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7Ci0Jdm9pZAkJCQkJCQkJCVNldExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZywgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKLQl2b2lkCQkJCQkJCQkJU2V0TXVsdGlMaW5lKEZYX0JPT0wgYk11bHRpTGluZSA9IFRSVUUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7Ci0Jdm9pZAkJCQkJCQkJCVNldEF1dG9SZXR1cm4oRlhfQk9PTCBiQXV0byA9IFRSVUUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7Ci0Jdm9pZAkJCQkJCQkJCVNldEF1dG9Gb250U2l6ZShGWF9CT09MIGJBdXRvID0gVFJVRSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsJCi0Jdm9pZAkJCQkJCQkJCVNldEF1dG9TY3JvbGwoRlhfQk9PTCBiQXV0byA9IFRSVUUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7CQotCXZvaWQJCQkJCQkJCQlTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7Ci0Jdm9pZAkJCQkJCQkJCVNldFRleHRPdmVyZmxvdyhGWF9CT09MIGJBbGxvd2VkID0gRkFMU0UsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7CisgIENQVlRfV29yZFBsYWNlIERvSW5zZXJ0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMqIHBTZWNQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzKTsKKyAgaW50MzJfdCBHZXRDaGFyU2V0RnJvbVVuaWNvZGUoRlhfV09SRCB3b3JkLCBpbnQzMl90IG5PbGRDaGFyc2V0KTsKIAotCUZYX0JPT0wJCQkJCQkJCQlJc1JpY2hUZXh0KCkgY29uc3Q7Ci0Jdm9pZAkJCQkJCQkJCVNldFJpY2hUZXh0KEZYX0JPT0wgYlJpY2hUZXh0ID0gVFJVRSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKLQlGWF9CT09MCQkJCQkJCQkJU2V0UmljaEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSk7CQotCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoRm9udEluZGV4KEZYX0lOVDMyIG5Gb250SW5kZXgpOwotCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoVGV4dENvbG9yKEZYX0NPTE9SUkVGIGR3Q29sb3IpOwotCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoVGV4dFNjcmlwdChGWF9JTlQzMiBuU2NyaXB0VHlwZSk7Ci0JRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hUZXh0Qm9sZChGWF9CT09MIGJCb2xkID0gVFJVRSk7CQotCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoVGV4dEl0YWxpYyhGWF9CT09MIGJJdGFsaWMgPSBUUlVFKTsKLQlGWF9CT09MCQkJCQkJCQkJU2V0UmljaFRleHRVbmRlcmxpbmUoRlhfQk9PTCBiVW5kZXJsaW5lID0gVFJVRSk7Ci0JRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hUZXh0Q3Jvc3NvdXQoRlhfQk9PTCBiQ3Jvc3NvdXQgPSBUUlVFKTsKLQlGWF9CT09MCQkJCQkJCQkJU2V0UmljaFRleHRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSk7Ci0JRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hUZXh0SG9yelNjYWxlKEZYX0lOVDMyIG5Ib3J6U2NhbGUgPSAxMDApOwotCUZYX0JPT0wJCQkJCQkJCQlTZXRSaWNoVGV4dExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZyk7Ci0JRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hUZXh0TGluZUluZGVudChGWF9GTE9BVCBmTGluZUluZGVudCk7Ci0JRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hUZXh0QWxpZ25tZW50KEZYX0lOVDMyIG5BbGlnbm1lbnQpOworICBpbnQzMl90IEdldFRvdGFsTGluZXMoKSBjb25zdDsKIAotCXZvaWQJCQkJCQkJCQlPbk1vdXNlRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7Ci0Jdm9pZAkJCQkJCQkJCU9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKLQl2b2lkCQkJCQkJCQkJT25WS19VUChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKLQl2b2lkCQkJCQkJCQkJT25WS19ET1dOKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOwotCXZvaWQJCQkJCQkJCQlPblZLX0xFRlQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7Ci0Jdm9pZAkJCQkJCQkJCU9uVktfUklHSFQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7Ci0Jdm9pZAkJCQkJCQkJCU9uVktfSE9NRShGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKLQl2b2lkCQkJCQkJCQkJT25WS19FTkQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7CisgcHJpdmF0ZToKKyAgdm9pZCBTZXRTZWwoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIGJlZ2luLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgZW5kKTsKIAotCXZvaWQJCQkJCQkJCQlTZXRUZXh0KEZYX0xQQ1dTVFIgdGV4dCxGWF9JTlQzMiBjaGFyc2V0ID0gREVGQVVMVF9DSEFSU0VULAotCQkJCQkJCQkJCQkJCWNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMgPSBOVUxMLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpOwkKLQlGWF9CT09MCQkJCQkJCQkJSW5zZXJ0V29yZChGWF9XT1JEIHdvcmQsIEZYX0lOVDMyIGNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyA9IE5VTEwpOwotCUZYX0JPT0wJCQkJCQkJCQlJbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyA9IE5VTEwsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzID0gTlVMTCk7Ci0JRlhfQk9PTAkJCQkJCQkJCUJhY2tzcGFjZSgpOwotCUZYX0JPT0wJCQkJCQkJCQlEZWxldGUoKTsJCQotCUZYX0JPT0wJCQkJCQkJCQlDbGVhcigpOwotCUZYX0JPT0wJCQkJCQkJCQlFbXB0eSgpOwotCUZYX0JPT0wJCQkJCQkJCQlJbnNlcnRUZXh0KEZYX0xQQ1dTVFIgdGV4dCwgRlhfSU5UMzIgY2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVCwKLQkJCQkJCQkJCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzID0gTlVMTCxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMgPSBOVUxMKTsKLQlGWF9CT09MCQkJCQkJCQkJUmVkbygpOwotCUZYX0JPT0wJCQkJCQkJCQlVbmRvKCk7CQotCUNQVlRfV29yZFBsYWNlCQkJCQkJCURvSW5zZXJ0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIEZYX0xQQ1dTVFIgdGV4dCwgRlhfSU5UMzIgY2hhcnNldCwgCi0JCQkJCQkJCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMpOwotCUZYX0lOVDMyCQkJCQkJCQlHZXRDaGFyU2V0RnJvbVVuaWNvZGUoRlhfV09SRCB3b3JkLCBGWF9JTlQzMiBuT2xkQ2hhcnNldCk7CisgIHZvaWQgUmVhcnJhbmdlQWxsKCk7CisgIHZvaWQgUmVhcnJhbmdlUGFydChjb25zdCBDUFZUX1dvcmRSYW5nZSYgcmFuZ2UpOworICB2b2lkIFNjcm9sbFRvQ2FyZXQoKTsKKyAgdm9pZCBTZXRTY3JvbGxJbmZvKCk7CisgIHZvaWQgU2V0U2Nyb2xsUG9zWChGWF9GTE9BVCBmeCk7CisgIHZvaWQgU2V0U2Nyb2xsUG9zWShGWF9GTE9BVCBmeSk7CisgIHZvaWQgU2V0U2Nyb2xsTGltaXQoKTsKKyAgdm9pZCBTZXRDb250ZW50Q2hhbmdlZCgpOwogCi0JRlhfSU5UMzIJCQkJCQkJCVdvcmRQbGFjZVRvV29yZEluZGV4KGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0OwotCUNQVlRfV29yZFBsYWNlCQkJCQkJCVdvcmRJbmRleFRvV29yZFBsYWNlKEZYX0lOVDMyIGluZGV4KSBjb25zdDsJCisgIHZvaWQgU2V0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCwKKyAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKKyAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMqIHBTZWNQcm9wcywKKyAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzLAorICAgICAgICAgICAgICAgRlhfQk9PTCBiQWRkVW5kbywKKyAgICAgICAgICAgICAgIEZYX0JPT0wgYlBhaW50KTsKKyAgRlhfQk9PTCBJbnNlcnRXb3JkKEZYX1dPUkQgd29yZCwKKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzLAorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWRkVW5kbywKKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlBhaW50KTsKKyAgRlhfQk9PTCBJbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWRkVW5kbywKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGFpbnQpOworICBGWF9CT09MIEJhY2tzcGFjZShGWF9CT09MIGJBZGRVbmRvLCBGWF9CT09MIGJQYWludCk7CisgIEZYX0JPT0wgRGVsZXRlKEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KTsKKyAgRlhfQk9PTCBDbGVhcihGWF9CT09MIGJBZGRVbmRvLCBGWF9CT09MIGJQYWludCk7CisgIEZYX0JPT0wgSW5zZXJ0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMqIHBTZWNQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzLAorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWRkVW5kbywKKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlBhaW50KTsKKyAgRlhfQk9PTCBTZXRSaWNoVGV4dFByb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcyk7CisgIEZYX0JPT0wgU2V0U2VjUHJvcHMoRURJVF9QUk9QU19FIGVQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlJiB3ciwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBZGRVbmRvKTsKKyAgRlhfQk9PTCBTZXRXb3JkUHJvcHMoRURJVF9QUk9QU19FIGVQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBZGRVbmRvKTsKKyAgdm9pZCBQYWludFNldFByb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsIGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cik7CisgIHZvaWQgUGFpbnRJbnNlcnRUZXh0KGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cE9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwTmV3KTsKIAotCUNQVlRfV29yZFBsYWNlCQkJCQkJCUdldExpbmVCZWdpblBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0OwotCUNQVlRfV29yZFBsYWNlCQkJCQkJCUdldExpbmVFbmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdDsKLQlDUFZUX1dvcmRQbGFjZQkJCQkJCQlHZXRTZWN0aW9uQmVnaW5QbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdDsKLQlDUFZUX1dvcmRQbGFjZQkJCQkJCQlHZXRTZWN0aW9uRW5kUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3Q7Ci0JQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJU2VhcmNoV29yZFBsYWNlKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdDsKKyAgaW5saW5lIENQREZfUG9pbnQgVlRUb0VkaXQoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0OworICBpbmxpbmUgQ1BERl9Qb2ludCBFZGl0VG9WVChjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3Q7CisgIGlubGluZSBDUERGX1JlY3QgVlRUb0VkaXQoY29uc3QgQ1BERl9SZWN0JiByZWN0KSBjb25zdDsKKyAgaW5saW5lIENQREZfUmVjdCBFZGl0VG9WVChjb25zdCBDUERGX1JlY3QmIHJlY3QpIGNvbnN0OwogCi0JRlhfSU5UMzIJCQkJCQkJCUdldENhcmV0KCkgY29uc3Q7Ci0JQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJR2V0Q2FyZXRXb3JkUGxhY2UoKSBjb25zdDsKLQlDRlhfV2lkZVN0cmluZwkJCQkJCQlHZXRTZWxUZXh0KCkgY29uc3Q7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJCQkJR2V0VGV4dCgpIGNvbnN0OwotCUZYX0ZMT0FUCQkJCQkJCQlHZXRGb250U2l6ZSgpIGNvbnN0OwotCUZYX1dPUkQJCQkJCQkJCQlHZXRQYXNzd29yZENoYXIoKSBjb25zdDsKLQlDUERGX1BvaW50CQkJCQkJCQlHZXRTY3JvbGxQb3MoKSBjb25zdDsKLQlGWF9JTlQzMgkJCQkJCQkJR2V0Q2hhckFycmF5KCkgY29uc3Q7Ci0JQ1BERl9SZWN0CQkJCQkJCQlHZXRQbGF0ZVJlY3QoKSBjb25zdDsKLQlDUERGX1JlY3QJCQkJCQkJCUdldENvbnRlbnRSZWN0KCkgY29uc3Q7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJCQkJR2V0UmFuZ2VUZXh0KGNvbnN0IENQVlRfV29yZFJhbmdlICYgcmFuZ2UpIGNvbnN0OwotCUZYX0lOVDMyCQkJCQkJCQlHZXRIb3J6U2NhbGUoKSBjb25zdDsKLQlGWF9GTE9BVAkJCQkJCQkJR2V0Q2hhclNwYWNlKCkgY29uc3Q7Ci0JRlhfSU5UMzIJCQkJCQkJCUdldFRvdGFsV29yZHMoKSBjb25zdDsKLQlGWF9JTlQzMgkJCQkJCQkJR2V0VG90YWxMaW5lcygpIGNvbnN0OworICB2b2lkIFJlZnJlc2goUkVGUkVTSF9QTEFOX0UgZVBsYW4sCisgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlMSA9IE5VTEwsCisgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlMiA9IE5VTEwpOworICB2b2lkIFJlZnJlc2hQdXNoTGluZVJlY3RzKGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cik7CisgIHZvaWQgUmVmcmVzaFB1c2hSYW5kb21SZWN0cyhjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IpOwogCi0Jdm9pZAkJCQkJCQkJCVNldFNlbChGWF9JTlQzMiBuU3RhcnRDaGFyLEZYX0lOVDMyIG5FbmRDaGFyKTsKLQl2b2lkCQkJCQkJCQkJR2V0U2VsKEZYX0lOVDMyICYgblN0YXJ0Q2hhciwgRlhfSU5UMzIgJiBuRW5kQ2hhcikgY29uc3Q7CisgIHZvaWQgU2V0Q2FyZXQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKTsKKyAgdm9pZCBTZXRDYXJldEluZm8oKTsKKyAgdm9pZCBTZXRDYXJldE9yaWdpbigpOworICB2b2lkIFNldENhcmV0Q2hhbmdlKCk7CiAKLXByaXZhdGU6Ci0Jdm9pZAkJCQkJCQkJCVNlbGVjdEFsbCgpOwotCXZvaWQJCQkJCQkJCQlTZWxlY3ROb25lKCk7Ci0Jdm9pZAkJCQkJCQkJCVNldFNlbChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIGJlZ2luLGNvbnN0IENQVlRfV29yZFBsYWNlICYgZW5kKTsKLQlGWF9CT09MCQkJCQkJCQkJSXNTZWxlY3RlZCgpIGNvbnN0OworICBDUFZUX1dvcmRSYW5nZSBHZXRMYXRpbldvcmRzUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdDsKKyAgQ1BWVF9Xb3JkUmFuZ2UgQ29tYmluZVdvcmRSYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cjIpOwogCi0Jdm9pZAkJCQkJCQkJCVJlYXJyYW5nZUFsbCgpOwotCXZvaWQJCQkJCQkJCQlSZWFycmFuZ2VQYXJ0KGNvbnN0IENQVlRfV29yZFJhbmdlICYgcmFuZ2UpOwotCXZvaWQJCQkJCQkJCQlQYWludCgpOwotCXZvaWQJCQkJCQkJCQlTY3JvbGxUb0NhcmV0KCk7Ci0Jdm9pZAkJCQkJCQkJCVNldFNjcm9sbEluZm8oKTsKLQl2b2lkCQkJCQkJCQkJU2V0U2Nyb2xsUG9zWChGWF9GTE9BVCBmeCk7Ci0Jdm9pZAkJCQkJCQkJCVNldFNjcm9sbFBvc1koRlhfRkxPQVQgZnkpOwotCXZvaWQJCQkJCQkJCQlTZXRTY3JvbGxMaW1pdCgpOwotCXZvaWQJCQkJCQkJCQlTZXRDb250ZW50Q2hhbmdlZCgpOwotCXZvaWQJCQkJCQkJCQlFbmFibGVOb3RpZnkoRlhfQk9PTCBiTm90aWZ5KTsKIAotCXZvaWQJCQkJCQkJCQlTZXRUZXh0KEZYX0xQQ1dTVFIgdGV4dCxGWF9JTlQzMiBjaGFyc2V0LAotCQkJCQkJCQkJCQkJCWNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KTsJCi0JRlhfQk9PTAkJCQkJCQkJCUluc2VydFdvcmQoRlhfV09SRCB3b3JkLCBGWF9JTlQzMiBjaGFyc2V0LCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpOwotCUZYX0JPT0wJCQkJCQkJCQlJbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpOwotCUZYX0JPT0wJCQkJCQkJCQlCYWNrc3BhY2UoRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpOwotCUZYX0JPT0wJCQkJCQkJCQlEZWxldGUoRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpOwkJCi0JRlhfQk9PTAkJCQkJCQkJCUNsZWFyKEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KTsKLQlGWF9CT09MCQkJCQkJCQkJSW5zZXJ0VGV4dChGWF9MUENXU1RSIHRleHQsIEZYX0lOVDMyIGNoYXJzZXQsCi0JCQkJCQkJCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyxGWF9CT09MIGJBZGRVbmRvLCBGWF9CT09MIGJQYWludCk7Ci0JRlhfQk9PTAkJCQkJCQkJCVNldFJpY2hUZXh0UHJvcHMoRURJVF9QUk9QU19FIGVQcm9wcywKLQkJCQkJCQkJCQkJCWNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyk7Ci0JRlhfQk9PTAkJCQkJCQkJCVNldFNlY1Byb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIAotCQkJCQkJCQkJCQkJY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLCBjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyLCBGWF9CT09MIGJBZGRVbmRvKTsKLQlGWF9CT09MCQkJCQkJCQkJU2V0V29yZFByb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIAotCQkJCQkJCQkJCQkJY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzLCBjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyLCBGWF9CT09MIGJBZGRVbmRvKTsKLQl2b2lkCQkJCQkJCQkJUGFpbnRTZXRQcm9wcyhFRElUX1BST1BTX0UgZVByb3BzLCBjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyKTsKLQl2b2lkCQkJCQkJCQkJUGFpbnRJbnNlcnRUZXh0KGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BPbGQsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BOZXcpOworICB2b2lkIEJlZ2luR3JvdXBVbmRvKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGl0bGUpOworICB2b2lkIEVuZEdyb3VwVW5kbygpOworICB2b2lkIEFkZEVkaXRVbmRvSXRlbShDRlhfRWRpdF9VbmRvSXRlbSogcEVkaXRVbmRvSXRlbSk7CiAKLQlpbmxpbmUgQ1BERl9Qb2ludAkJCQkJCVZUVG9FZGl0KGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3Q7Ci0JaW5saW5lIENQREZfUG9pbnQJCQkJCQlFZGl0VG9WVChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0OwotCWlubGluZSBDUERGX1JlY3QJCQkJCQlWVFRvRWRpdChjb25zdCBDUERGX1JlY3QgJiByZWN0KSBjb25zdDsKLQlpbmxpbmUgQ1BERl9SZWN0CQkJCQkJRWRpdFRvVlQoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkgY29uc3Q7CisgIHZvaWQgU2V0UGFnZUluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKTsKKyAgQ1BWVF9Xb3JkUGxhY2UgU2VhcmNoUGFnZUVuZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cFBhZ2VCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdDsKKyAgRlhfRkxPQVQgR2V0TGluZVRvcChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0OworICBGWF9GTE9BVCBHZXRMaW5lQm90dG9tKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3Q7CiAKLQl2b2lkCQkJCQkJCQkJRW5hYmxlUmVmcmVzaChGWF9CT09MIGJSZWZyZXNoKTsKLQl2b2lkCQkJCQkJCQkJUmVmcmVzaChSRUZSRVNIX1BMQU5fRSBlUGxhbixjb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBSYW5nZTEgPSBOVUxMLGNvbnN0IENQVlRfV29yZFJhbmdlICogcFJhbmdlMiA9IE5VTEwpOwotCXZvaWQJCQkJCQkJCQlSZWZyZXNoUHVzaExpbmVSZWN0cyhjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyKTsKLQl2b2lkCQkJCQkJCQkJUmVmcmVzaFB1c2hSYW5kb21SZWN0cyhjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyKTsKLQl2b2lkCQkJCQkJCQkJUmVmcmVzaFdvcmRSYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IpOworIHByaXZhdGU6CisgIElQREZfVmFyaWFibGVUZXh0KiBtX3BWVDsKKyAgSUZYX0VkaXRfTm90aWZ5KiBtX3BOb3RpZnk7CisgIElGWF9FZGl0X09wck5vdGlmeSogbV9wT3ByTm90aWZ5OworICBDRlhfRWRpdF9Qcm92aWRlciogbV9wVlRQcm92aWRlOwogCi0Jdm9pZAkJCQkJCQkJCVNldENhcmV0KEZYX0lOVDMyIG5Qb3MpOwotCXZvaWQJCQkJCQkJCQlTZXRDYXJldChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKTsKLQl2b2lkCQkJCQkJCQkJU2V0Q2FyZXRJbmZvKCk7Ci0Jdm9pZAkJCQkJCQkJCVNldENhcmV0T3JpZ2luKCk7Ci0Jdm9pZAkJCQkJCQkJCVNldENhcmV0Q2hhbmdlKCk7CisgIENQVlRfV29yZFBsYWNlIG1fd3BDYXJldDsKKyAgQ1BWVF9Xb3JkUGxhY2UgbV93cE9sZENhcmV0OworICBDRlhfRWRpdF9TZWxlY3QgbV9TZWxTdGF0ZTsKIAotCUNQVlRfV29yZFJhbmdlCQkJCQkJCUdldFdob2xlV29yZFJhbmdlKCkgY29uc3Q7Ci0JQ1BWVF9Xb3JkUmFuZ2UJCQkJCQkJR2V0VmlzaWJsZVdvcmRSYW5nZSgpIGNvbnN0OwotCUNQVlRfV29yZFJhbmdlCQkJCQkJCUdldExhdGluV29yZHNSYW5nZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdDsKLQlDUFZUX1dvcmRSYW5nZQkJCQkJCQlDb21iaW5lV29yZFJhbmdlKGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IxLCBjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyMik7Ci0JQ1BWVF9Xb3JkUmFuZ2UJCQkJCQkJR2V0U2VsZWN0V29yZFJhbmdlKCkgY29uc3Q7Ci0KLQl2b2lkCQkJCQkJCQkJRW5hYmxlVW5kbyhGWF9CT09MIGJVbmRvKTsKLQl2b2lkCQkJCQkJCQkJRW5hYmxlT3ByTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSk7Ci0KLQlGWF9CT09MCQkJCQkJCQkJSXNUZXh0RnVsbCgpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJCQlJc1RleHRPdmVyZmxvdygpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJCQlDYW5VbmRvKCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQkJCUNhblJlZG8oKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCQkJSXNNb2RpZmllZCgpIGNvbnN0OwotCi0Jdm9pZAkJCQkJCQkJCUJlZ2luR3JvdXBVbmRvKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGl0bGUpOwotCXZvaWQJCQkJCQkJCQlFbmRHcm91cFVuZG8oKTsKLQl2b2lkCQkJCQkJCQkJQWRkRWRpdFVuZG9JdGVtKENGWF9FZGl0X1VuZG9JdGVtKiBwRWRpdFVuZG9JdGVtKTsKLQl2b2lkCQkJCQkJCQkJQWRkVW5kb0l0ZW0oSUZYX0VkaXRfVW5kb0l0ZW0qIHBVbmRvSXRlbSk7Ci0KLQl2b2lkCQkJCQkJCQkJU2V0UGFnZUluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKTsKLQlDUFZUX1dvcmRQbGFjZQkJCQkJCQlTZWFyY2hQYWdlRW5kUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwUGFnZUJlZ2luLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3Q7Ci0JRlhfRkxPQVQJCQkJCQkJCUdldExpbmVUb3AoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdDsKLQlGWF9GTE9BVAkJCQkJCQkJR2V0TGluZUJvdHRvbShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0OwotCi1wcml2YXRlOgkKLQlJUERGX1ZhcmlhYmxlVGV4dCoJCQkJCQltX3BWVDsKLQlJRlhfRWRpdF9Ob3RpZnkqCQkJCQkJbV9wTm90aWZ5OwotCUlGWF9FZGl0X09wck5vdGlmeSoJCQkJCQltX3BPcHJOb3RpZnk7Ci0JQ0ZYX0VkaXRfUHJvdmlkZXIqCQkJCQkJbV9wVlRQcm92aWRlOwotCi0JQ1BWVF9Xb3JkUGxhY2UJCQkJCQkJbV93cENhcmV0OwotCUNQVlRfV29yZFBsYWNlCQkJCQkJCW1fd3BPbGRDYXJldDsKLQlDRlhfRWRpdF9TZWxlY3QJCQkJCQkJbV9TZWxTdGF0ZTsKLQotCUNQREZfUG9pbnQJCQkJCQkJCW1fcHRTY3JvbGxQb3M7Ci0JQ1BERl9Qb2ludAkJCQkJCQkJbV9wdFJlZnJlc2hTY3JvbGxQb3M7Ci0JRlhfQk9PTAkJCQkJCQkJCW1fYkVuYWJsZVNjcm9sbDsJCi0JSUZYX0VkaXRfSXRlcmF0b3IgKgkJCQkJCW1fcEl0ZXJhdG9yOwkKLQlDRlhfRWRpdF9SZWZyZXNoCQkJCQkJbV9SZWZyZXNoOwotCUNQREZfUG9pbnQJCQkJCQkJCW1fcHRDYXJldDsKLQlDRlhfRWRpdF9VbmRvCQkJCQkJCW1fVW5kbzsKLQlGWF9JTlQzMgkJCQkJCQkJbV9uQWxpZ25tZW50OwotCUZYX0JPT0wJCQkJCQkJCQltX2JOb3RpZnlGbGFnOwotCUZYX0JPT0wJCQkJCQkJCQltX2JFbmFibGVPdmVyZmxvdzsKLQlGWF9CT09MCQkJCQkJCQkJbV9iRW5hYmxlUmVmcmVzaDsKLQlDUERGX1JlY3QJCQkJCQkJCW1fcmNPbGRDb250ZW50OwotCUZYX0JPT0wJCQkJCQkJCQltX2JFbmFibGVVbmRvOwotCUZYX0JPT0wJCQkJCQkJCQltX2JOb3RpZnk7Ci0JRlhfQk9PTAkJCQkJCQkJCW1fYk9wck5vdGlmeTsKLQlDRlhfRWRpdF9Hcm91cFVuZG9JdGVtKgkJCQkJbV9wR3JvdXBVbmRvSXRlbTsKKyAgQ1BERl9Qb2ludCBtX3B0U2Nyb2xsUG9zOworICBDUERGX1BvaW50IG1fcHRSZWZyZXNoU2Nyb2xsUG9zOworICBGWF9CT09MIG1fYkVuYWJsZVNjcm9sbDsKKyAgSUZYX0VkaXRfSXRlcmF0b3IqIG1fcEl0ZXJhdG9yOworICBDRlhfRWRpdF9SZWZyZXNoIG1fUmVmcmVzaDsKKyAgQ1BERl9Qb2ludCBtX3B0Q2FyZXQ7CisgIENGWF9FZGl0X1VuZG8gbV9VbmRvOworICBpbnQzMl90IG1fbkFsaWdubWVudDsKKyAgRlhfQk9PTCBtX2JOb3RpZnlGbGFnOworICBGWF9CT09MIG1fYkVuYWJsZU92ZXJmbG93OworICBGWF9CT09MIG1fYkVuYWJsZVJlZnJlc2g7CisgIENQREZfUmVjdCBtX3JjT2xkQ29udGVudDsKKyAgRlhfQk9PTCBtX2JFbmFibGVVbmRvOworICBGWF9CT09MIG1fYk5vdGlmeTsKKyAgRlhfQk9PTCBtX2JPcHJOb3RpZnk7CisgIENGWF9FZGl0X0dyb3VwVW5kb0l0ZW0qIG1fcEdyb3VwVW5kb0l0ZW07CiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGWF9FZGl0X0l0ZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotY2xhc3MgQ0ZYX0VkaXRfSXRlcmF0b3IgOiBwdWJsaWMgSUZYX0VkaXRfSXRlcmF0b3IKLXsKLXB1YmxpYzoKLQlDRlhfRWRpdF9JdGVyYXRvcihDRlhfRWRpdCAqIHBFZGl0LElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogcFZUSXRlcmF0b3IpOwotCXZpcnR1YWwgfkNGWF9FZGl0X0l0ZXJhdG9yKCk7CitjbGFzcyBDRlhfRWRpdF9JdGVyYXRvciA6IHB1YmxpYyBJRlhfRWRpdF9JdGVyYXRvciB7CisgcHVibGljOgorICBDRlhfRWRpdF9JdGVyYXRvcihDRlhfRWRpdCogcEVkaXQsIElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKiBwVlRJdGVyYXRvcik7CisgIH5DRlhfRWRpdF9JdGVyYXRvcigpIG92ZXJyaWRlOwogCi0JRlhfQk9PTAkJCQkJCQkJCU5leHRXb3JkKCk7Ci0JRlhfQk9PTAkJCQkJCQkJCU5leHRMaW5lKCk7Ci0JRlhfQk9PTAkJCQkJCQkJCU5leHRTZWN0aW9uKCk7Ci0JRlhfQk9PTAkJCQkJCQkJCVByZXZXb3JkKCk7Ci0JRlhfQk9PTAkJCQkJCQkJCVByZXZMaW5lKCk7Ci0JRlhfQk9PTAkJCQkJCQkJCVByZXZTZWN0aW9uKCk7CisgIC8vIElGWF9FZGl0X0l0ZXJhdG9yCisgIEZYX0JPT0wgTmV4dFdvcmQoKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBOZXh0TGluZSgpIG92ZXJyaWRlOworICBGWF9CT09MIE5leHRTZWN0aW9uKCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgUHJldldvcmQoKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBQcmV2TGluZSgpIG92ZXJyaWRlOworICBGWF9CT09MIFByZXZTZWN0aW9uKCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgR2V0V29yZChDUFZUX1dvcmQmIHdvcmQpIGNvbnN0IG92ZXJyaWRlOworICBGWF9CT09MIEdldExpbmUoQ1BWVF9MaW5lJiBsaW5lKSBjb25zdCBvdmVycmlkZTsKKyAgRlhfQk9PTCBHZXRTZWN0aW9uKENQVlRfU2VjdGlvbiYgc2VjdGlvbikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2V0QXQoaW50MzJfdCBuV29yZEluZGV4KSBvdmVycmlkZTsKKyAgdm9pZCBTZXRBdChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIG92ZXJyaWRlOworICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgR2V0QXQoKSBjb25zdCBvdmVycmlkZTsKKyAgSUZYX0VkaXQqIEdldEVkaXQoKSBjb25zdCBvdmVycmlkZTsKIAotCUZYX0JPT0wJCQkJCQkJCQlHZXRXb3JkKENQVlRfV29yZCAmIHdvcmQpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJCQlHZXRMaW5lKENQVlRfTGluZSAmIGxpbmUpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJCQlHZXRTZWN0aW9uKENQVlRfU2VjdGlvbiAmIHNlY3Rpb24pIGNvbnN0OwotCXZvaWQJCQkJCQkJCQlTZXRBdChGWF9JTlQzMiBuV29yZEluZGV4KTsKLQl2b2lkCQkJCQkJCQkJU2V0QXQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSk7Ci0JY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJgkJCQkJR2V0QXQoKSBjb25zdDsKLQlJRlhfRWRpdCoJCQkJCQkJCUdldEVkaXQoKSBjb25zdDsKLQotcHJpdmF0ZToKLQlDRlhfRWRpdCAqCQkJCQkJCQltX3BFZGl0OwotCUlQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKgkJCQltX3BWVEl0ZXJhdG9yOworIHByaXZhdGU6CisgIENGWF9FZGl0KiBtX3BFZGl0OworICBJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciogbV9wVlRJdGVyYXRvcjsKIH07CiAKLWNsYXNzIENGWF9FZGl0X1Byb3ZpZGVyIDogcHVibGljIElQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyCi17Ci1wdWJsaWM6Ci0JQ0ZYX0VkaXRfUHJvdmlkZXIoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXApOwotCXZpcnR1YWwgfkNGWF9FZGl0X1Byb3ZpZGVyKCk7CitjbGFzcyBDRlhfRWRpdF9Qcm92aWRlciA6IHB1YmxpYyBJUERGX1ZhcmlhYmxlVGV4dF9Qcm92aWRlciB7CisgcHVibGljOgorICBleHBsaWNpdCBDRlhfRWRpdF9Qcm92aWRlcihJRlhfRWRpdF9Gb250TWFwKiBwRm9udE1hcCk7CisgIH5DRlhfRWRpdF9Qcm92aWRlcigpIG92ZXJyaWRlOwogCi0JSUZYX0VkaXRfRm9udE1hcCoJCQlHZXRGb250TWFwKCk7CisgIElGWF9FZGl0X0ZvbnRNYXAqIEdldEZvbnRNYXAoKTsKIAotCUZYX0lOVDMyCQkJCQlHZXRDaGFyV2lkdGgoRlhfSU5UMzIgbkZvbnRJbmRleCwgRlhfV09SRCB3b3JkLCBGWF9JTlQzMiBuV29yZFN0eWxlKTsKLQlGWF9JTlQzMgkJCQkJR2V0VHlwZUFzY2VudChGWF9JTlQzMiBuRm9udEluZGV4KTsKLQlGWF9JTlQzMgkJCQkJR2V0VHlwZURlc2NlbnQoRlhfSU5UMzIgbkZvbnRJbmRleCk7Ci0JRlhfSU5UMzIJCQkJCUdldFdvcmRGb250SW5kZXgoRlhfV09SRCB3b3JkLCBGWF9JTlQzMiBjaGFyc2V0LCBGWF9JTlQzMiBuRm9udEluZGV4KTsKLQlGWF9JTlQzMgkJCQkJR2V0RGVmYXVsdEZvbnRJbmRleCgpOwotCUZYX0JPT0wJCQkJCQlJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpOworICAvLyBJUERGX1ZhcmlhYmxlVGV4dF9Qcm92aWRlcjoKKyAgaW50MzJfdCBHZXRDaGFyV2lkdGgoaW50MzJfdCBuRm9udEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbldvcmRTdHlsZSkgb3ZlcnJpZGU7CisgIGludDMyX3QgR2V0VHlwZUFzY2VudChpbnQzMl90IG5Gb250SW5kZXgpIG92ZXJyaWRlOworICBpbnQzMl90IEdldFR5cGVEZXNjZW50KGludDMyX3QgbkZvbnRJbmRleCkgb3ZlcnJpZGU7CisgIGludDMyX3QgR2V0V29yZEZvbnRJbmRleChGWF9XT1JEIHdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Gb250SW5kZXgpIG92ZXJyaWRlOworICBpbnQzMl90IEdldERlZmF1bHRGb250SW5kZXgoKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpIG92ZXJyaWRlOwogCi1wcml2YXRlOgotCUlGWF9FZGl0X0ZvbnRNYXAqCQkJbV9wRm9udE1hcDsKKyBwcml2YXRlOgorICBJRlhfRWRpdF9Gb250TWFwKiBtX3BGb250TWFwOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfRlhFRElUX0ZYRVRfRURJVF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meGV0X2xpc3QuaCBiL2ZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhldF9saXN0LmgKaW5kZXggNWM2ODllZC4uMjcwMGI5MiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meGV0X2xpc3QuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfbGlzdC5oCkBAIC03LDM1NyArNywzMzggQEAKICNpZm5kZWYgRlBERlNES19JTkNMVURFX0ZYRURJVF9GWEVUX0xJU1RfSF8KICNkZWZpbmUgRlBERlNES19JTkNMVURFX0ZYRURJVF9GWEVUX0xJU1RfSF8KIAotI2luY2x1ZGUgIi4uLy4uLy4uL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFyc2VyLmgiICAvLyBGb3IgQ1BERl9Qb2ludC4KKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhcnNlci5oIiAgLy8gRm9yIENQREZfUG9pbnQuCiAjaW5jbHVkZSAiZnhfZWRpdC5oIgogCiBjbGFzcyBJRlhfRWRpdDsKIAotY2xhc3MgQ0xTVF9TaXplCi17Ci1wdWJsaWM6Ci0JQ0xTVF9TaXplKCkgOiB4KDAuMGYpLCB5KDAuMGYpCi0JewotCX0KK2NsYXNzIENMU1RfU2l6ZSB7CisgcHVibGljOgorICBDTFNUX1NpemUoKSA6IHgoMC4wZiksIHkoMC4wZikge30KIAotCUNMU1RfU2l6ZShGWF9GTE9BVCB4LEZYX0ZMT0FUIHkpCi0JewotCQl0aGlzLT54ID0geDsKLQkJdGhpcy0+eSA9IHk7Ci0JfQorICBDTFNUX1NpemUoRlhfRkxPQVQgb3RoZXJfeCwgRlhfRkxPQVQgb3RoZXJfeSkgeworICAgIHggPSBvdGhlcl94OworICAgIHkgPSBvdGhlcl95OworICB9CiAKLQl2b2lkIERlZmF1bHQoKQotCXsKLQkJeCA9IDAuMGY7Ci0JCXkgPSAwLjBmOwotCX0KKyAgdm9pZCBEZWZhdWx0KCkgeworICAgIHggPSAwLjBmOworICAgIHkgPSAwLjBmOworICB9CiAKLQlGWF9CT09MIG9wZXJhdG9yICE9IChjb25zdCBDTFNUX1NpemUgJiBzaXplKSBjb25zdAotCXsKLQkJcmV0dXJuIEZYU1lTX21lbWNtcCh0aGlzLCAmc2l6ZSwgc2l6ZW9mKENMU1RfU2l6ZSkpICE9IDA7Ci0JfQorICBGWF9CT09MIG9wZXJhdG9yIT0oY29uc3QgQ0xTVF9TaXplJiBzaXplKSBjb25zdCB7CisgICAgcmV0dXJuIEZYU1lTX21lbWNtcCh0aGlzLCAmc2l6ZSwgc2l6ZW9mKENMU1RfU2l6ZSkpICE9IDA7CisgIH0KIAotCUZYX0ZMT0FUIHgseTsKKyAgRlhfRkxPQVQgeCwgeTsKIH07CiAKLWNsYXNzIENMU1RfUmVjdCA6IHB1YmxpYyBDUERGX1JlY3QKLXsKLXB1YmxpYzoKLQlDTFNUX1JlY3QoKQotCXsKLQkJbGVmdCA9IHRvcCA9IHJpZ2h0ID0gYm90dG9tID0gMC4wZjsKLQl9CitjbGFzcyBDTFNUX1JlY3QgOiBwdWJsaWMgQ1BERl9SZWN0IHsKKyBwdWJsaWM6CisgIENMU1RfUmVjdCgpIHsgbGVmdCA9IHRvcCA9IHJpZ2h0ID0gYm90dG9tID0gMC4wZjsgfQogCi0JQ0xTVF9SZWN0KEZYX0ZMT0FUIGxlZnQsRlhfRkxPQVQgdG9wLAotCQkJCQkJRlhfRkxPQVQgcmlnaHQsRlhfRkxPQVQgYm90dG9tKQotCXsKLQkJdGhpcy0+bGVmdCA9IGxlZnQ7Ci0JCXRoaXMtPnRvcCA9IHRvcDsKLQkJdGhpcy0+cmlnaHQgPSByaWdodDsKLQkJdGhpcy0+Ym90dG9tID0gYm90dG9tOwotCX0KKyAgQ0xTVF9SZWN0KEZYX0ZMT0FUIG90aGVyX2xlZnQsCisgICAgICAgICAgICBGWF9GTE9BVCBvdGhlcl90b3AsCisgICAgICAgICAgICBGWF9GTE9BVCBvdGhlcl9yaWdodCwKKyAgICAgICAgICAgIEZYX0ZMT0FUIG90aGVyX2JvdHRvbSkgeworICAgIGxlZnQgPSBvdGhlcl9sZWZ0OworICAgIHRvcCA9IG90aGVyX3RvcDsKKyAgICByaWdodCA9IG90aGVyX3JpZ2h0OworICAgIGJvdHRvbSA9IG90aGVyX2JvdHRvbTsKKyAgfQogCi0JQ0xTVF9SZWN0KGNvbnN0IENQREZfUmVjdCAmIHJlY3QpCi0JewotCQl0aGlzLT5sZWZ0ID0gcmVjdC5sZWZ0OwotCQl0aGlzLT50b3AgPSByZWN0LnRvcDsKLQkJdGhpcy0+cmlnaHQgPSByZWN0LnJpZ2h0OwotCQl0aGlzLT5ib3R0b20gPSByZWN0LmJvdHRvbTsKLQl9CisgIENMU1RfUmVjdChjb25zdCBDUERGX1JlY3QmIHJlY3QpIHsKKyAgICBsZWZ0ID0gcmVjdC5sZWZ0OworICAgIHRvcCA9IHJlY3QudG9wOworICAgIHJpZ2h0ID0gcmVjdC5yaWdodDsKKyAgICBib3R0b20gPSByZWN0LmJvdHRvbTsKKyAgfQogCi0Jdm9pZCBEZWZhdWx0KCkKLQl7Ci0JCWxlZnQgPSB0b3AgPSByaWdodCA9IGJvdHRvbSA9IDAuMGY7Ci0JfQorICB+Q0xTVF9SZWN0KCkge30KIAotCWNvbnN0IENMU1RfUmVjdCBvcGVyYXRvciA9IChjb25zdCBDUERGX1JlY3QgJiByZWN0KQotCXsKLQkJdGhpcy0+bGVmdCA9IHJlY3QubGVmdDsKLQkJdGhpcy0+dG9wID0gcmVjdC50b3A7Ci0JCXRoaXMtPnJpZ2h0ID0gcmVjdC5yaWdodDsKLQkJdGhpcy0+Ym90dG9tID0gcmVjdC5ib3R0b207CisgIHZvaWQgRGVmYXVsdCgpIHsgbGVmdCA9IHRvcCA9IHJpZ2h0ID0gYm90dG9tID0gMC4wZjsgfQogCi0JCXJldHVybiAqdGhpczsKLQl9CisgIGNvbnN0IENMU1RfUmVjdCBvcGVyYXRvcj0oY29uc3QgQ1BERl9SZWN0JiByZWN0KSB7CisgICAgbGVmdCA9IHJlY3QubGVmdDsKKyAgICB0b3AgPSByZWN0LnRvcDsKKyAgICByaWdodCA9IHJlY3QucmlnaHQ7CisgICAgYm90dG9tID0gcmVjdC5ib3R0b207CiAKLQlGWF9CT09MIG9wZXJhdG9yID09IChjb25zdCBDTFNUX1JlY3QgJiByZWN0KSBjb25zdAotCXsKLQkJcmV0dXJuIEZYU1lTX21lbWNtcCh0aGlzLCAmcmVjdCwgc2l6ZW9mKENMU1RfUmVjdCkpID09IDA7Ci0JfQorICAgIHJldHVybiAqdGhpczsKKyAgfQogCi0JRlhfQk9PTCBvcGVyYXRvciAhPSAoY29uc3QgQ0xTVF9SZWN0ICYgcmVjdCkgY29uc3QKLQl7Ci0JCXJldHVybiBGWFNZU19tZW1jbXAodGhpcywgJnJlY3QsIHNpemVvZihDTFNUX1JlY3QpKSAhPSAwOwotCX0KKyAgRlhfQk9PTCBvcGVyYXRvcj09KGNvbnN0IENMU1RfUmVjdCYgcmVjdCkgY29uc3QgeworICAgIHJldHVybiBGWFNZU19tZW1jbXAodGhpcywgJnJlY3QsIHNpemVvZihDTFNUX1JlY3QpKSA9PSAwOworICB9CiAKLQlGWF9GTE9BVCBXaWR0aCgpIGNvbnN0Ci0JewotCQlyZXR1cm4gdGhpcy0+cmlnaHQgLSB0aGlzLT5sZWZ0OwotCX0KKyAgRlhfQk9PTCBvcGVyYXRvciE9KGNvbnN0IENMU1RfUmVjdCYgcmVjdCkgY29uc3QgeworICAgIHJldHVybiBGWFNZU19tZW1jbXAodGhpcywgJnJlY3QsIHNpemVvZihDTFNUX1JlY3QpKSAhPSAwOworICB9CiAKLQlGWF9GTE9BVCBIZWlnaHQoKSBjb25zdAotCXsKLQkJaWYgKHRoaXMtPnRvcCA+IHRoaXMtPmJvdHRvbSkKLQkJCXJldHVybiB0aGlzLT50b3AgLSB0aGlzLT5ib3R0b207Ci0JCWVsc2UKLQkJCXJldHVybiB0aGlzLT5ib3R0b20gLSB0aGlzLT50b3A7Ci0JfQorICBGWF9GTE9BVCBXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIHJpZ2h0IC0gbGVmdDsgfQogCi0JQ1BERl9Qb2ludCBMZWZ0VG9wKCkgY29uc3QKLQl7Ci0JCXJldHVybiBDUERGX1BvaW50KGxlZnQsdG9wKTsKLQl9CisgIEZYX0ZMT0FUIEhlaWdodCgpIGNvbnN0IHsKKyAgICBpZiAodG9wID4gYm90dG9tKQorICAgICAgcmV0dXJuIHRvcCAtIGJvdHRvbTsKKyAgICByZXR1cm4gYm90dG9tIC0gdG9wOworICB9CiAKLQlDUERGX1BvaW50IFJpZ2h0Qm90dG9tKCkgY29uc3QKLQl7Ci0JCXJldHVybiBDUERGX1BvaW50KHJpZ2h0LGJvdHRvbSk7Ci0JfQorICBDUERGX1BvaW50IExlZnRUb3AoKSBjb25zdCB7IHJldHVybiBDUERGX1BvaW50KGxlZnQsIHRvcCk7IH0KIAotCWNvbnN0IENMU1RfUmVjdCBvcGVyYXRvciArPSAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KQotCXsKLQkJdGhpcy0+bGVmdCArPSBwb2ludC54OwotCQl0aGlzLT5yaWdodCArPSBwb2ludC54OwotCQl0aGlzLT50b3AgKz0gcG9pbnQueTsKLQkJdGhpcy0+Ym90dG9tICs9IHBvaW50Lnk7CisgIENQREZfUG9pbnQgUmlnaHRCb3R0b20oKSBjb25zdCB7IHJldHVybiBDUERGX1BvaW50KHJpZ2h0LCBib3R0b20pOyB9CiAKLQkJcmV0dXJuICp0aGlzOwotCX0KKyAgY29uc3QgQ0xTVF9SZWN0IG9wZXJhdG9yKz0oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgICBsZWZ0ICs9IHBvaW50Lng7CisgICAgcmlnaHQgKz0gcG9pbnQueDsKKyAgICB0b3AgKz0gcG9pbnQueTsKKyAgICBib3R0b20gKz0gcG9pbnQueTsKIAotCWNvbnN0IENMU1RfUmVjdCBvcGVyYXRvciAtPSAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KQotCXsKLQkJdGhpcy0+bGVmdCAtPSBwb2ludC54OwotCQl0aGlzLT5yaWdodCAtPSBwb2ludC54OwotCQl0aGlzLT50b3AgLT0gcG9pbnQueTsKLQkJdGhpcy0+Ym90dG9tIC09IHBvaW50Lnk7CisgICAgcmV0dXJuICp0aGlzOworICB9CiAKLQkJcmV0dXJuICp0aGlzOwotCX0KKyAgY29uc3QgQ0xTVF9SZWN0IG9wZXJhdG9yLT0oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgICBsZWZ0IC09IHBvaW50Lng7CisgICAgcmlnaHQgLT0gcG9pbnQueDsKKyAgICB0b3AgLT0gcG9pbnQueTsKKyAgICBib3R0b20gLT0gcG9pbnQueTsKIAotCUNMU1RfUmVjdCBvcGVyYXRvciArIChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0Ci0JewotCQlyZXR1cm4gQ0xTVF9SZWN0KGxlZnQgKyBwb2ludC54LAotCQkJCQl0b3AgKyBwb2ludC55LAotCQkJCQlyaWdodCArIHBvaW50LngsCi0JCQkJCWJvdHRvbSArIHBvaW50LnkpOwotCX0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KIAotCUNMU1RfUmVjdCBvcGVyYXRvciAtIChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0Ci0JewotCQlyZXR1cm4gQ0xTVF9SZWN0KGxlZnQgLSBwb2ludC54LAotCQkJCQl0b3AgLSBwb2ludC55LAotCQkJCQlyaWdodCAtIHBvaW50LngsCi0JCQkJCWJvdHRvbSAtIHBvaW50LnkpOwotCX0KKyAgQ0xTVF9SZWN0IG9wZXJhdG9yKyhjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3QgeworICAgIHJldHVybiBDTFNUX1JlY3QobGVmdCArIHBvaW50LngsIHRvcCArIHBvaW50LnksIHJpZ2h0ICsgcG9pbnQueCwKKyAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSArIHBvaW50LnkpOworICB9CisKKyAgQ0xTVF9SZWN0IG9wZXJhdG9yLShjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3QgeworICAgIHJldHVybiBDTFNUX1JlY3QobGVmdCAtIHBvaW50LngsIHRvcCAtIHBvaW50LnksIHJpZ2h0IC0gcG9pbnQueCwKKyAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSAtIHBvaW50LnkpOworICB9CiB9OwogCi1jbGFzcyBDRlhfTGlzdEl0ZW0KLXsKLXB1YmxpYzoKLQlDRlhfTGlzdEl0ZW0oKTsKLQl2aXJ0dWFsIH5DRlhfTGlzdEl0ZW0oKTsKK2NsYXNzIENGWF9MaXN0SXRlbSB7CisgcHVibGljOgorICBDRlhfTGlzdEl0ZW0oKTsKKyAgdmlydHVhbCB+Q0ZYX0xpc3RJdGVtKCk7CiAKLQl2b2lkCQkJCQkJCVNldEZvbnRNYXAoSUZYX0VkaXRfRm9udE1hcCAqIHBGb250TWFwKTsKLQlJRlhfRWRpdF9JdGVyYXRvcioJCQkJR2V0SXRlcmF0b3IoKSBjb25zdDsKLQlJRlhfRWRpdCoJCQkJCQlHZXRFZGl0KCkgY29uc3Q7CisgIHZvaWQgU2V0Rm9udE1hcChJRlhfRWRpdF9Gb250TWFwKiBwRm9udE1hcCk7CisgIElGWF9FZGl0X0l0ZXJhdG9yKiBHZXRJdGVyYXRvcigpIGNvbnN0OworICBJRlhfRWRpdCogR2V0RWRpdCgpIGNvbnN0OwogCi1wdWJsaWM6Ci0Jdm9pZAkJCQkJCQlTZXRSZWN0KGNvbnN0IENMU1RfUmVjdCAmIHJlY3QpOwotCXZvaWQJCQkJCQkJU2V0U2VsZWN0KEZYX0JPT0wgYlNlbGVjdGVkKTsKLQl2b2lkCQkJCQkJCVNldENhcmV0KEZYX0JPT0wgYkNhcmV0KTsKLQl2b2lkCQkJCQkJCVNldFRleHQoRlhfTFBDV1NUUiB0ZXh0KTsKLQl2b2lkCQkJCQkJCVNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSk7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldFRleHQoKSBjb25zdDsKKyBwdWJsaWM6CisgIHZvaWQgU2V0UmVjdChjb25zdCBDTFNUX1JlY3QmIHJlY3QpOworICB2b2lkIFNldFNlbGVjdChGWF9CT09MIGJTZWxlY3RlZCk7CisgIHZvaWQgU2V0Q2FyZXQoRlhfQk9PTCBiQ2FyZXQpOworICB2b2lkIFNldFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQpOworICB2b2lkIFNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSk7CisgIENGWF9XaWRlU3RyaW5nIEdldFRleHQoKSBjb25zdDsKIAotCUNMU1RfUmVjdAkJCQkJCUdldFJlY3QoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUlzU2VsZWN0ZWQoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUlzQ2FyZXQoKSBjb25zdDsKLQlGWF9GTE9BVAkJCQkJCUdldEl0ZW1IZWlnaHQoKSBjb25zdDsKLQlGWF9XT1JECQkJCQkJCUdldEZpcnN0Q2hhcigpIGNvbnN0OworICBDTFNUX1JlY3QgR2V0UmVjdCgpIGNvbnN0OworICBGWF9CT09MIElzU2VsZWN0ZWQoKSBjb25zdDsKKyAgRlhfQk9PTCBJc0NhcmV0KCkgY29uc3Q7CisgIEZYX0ZMT0FUIEdldEl0ZW1IZWlnaHQoKSBjb25zdDsKKyAgRlhfV09SRCBHZXRGaXJzdENoYXIoKSBjb25zdDsKIAotcHJpdmF0ZToKLQlJRlhfRWRpdCoJCQkJCQltX3BFZGl0OwotCUZYX0JPT0wJCQkJCQkJbV9iU2VsZWN0ZWQ7Ci0JRlhfQk9PTAkJCQkJCQltX2JDYXJldDsKLQlDTFNUX1JlY3QJCQkJCQltX3JjTGlzdEl0ZW07CisgcHJpdmF0ZToKKyAgSUZYX0VkaXQqIG1fcEVkaXQ7CisgIEZYX0JPT0wgbV9iU2VsZWN0ZWQ7CisgIEZYX0JPT0wgbV9iQ2FyZXQ7CisgIENMU1RfUmVjdCBtX3JjTGlzdEl0ZW07CiB9OwogCi1jbGFzcyBDRlhfTGlzdENvbnRhaW5lcgotewotcHVibGljOgotCUNGWF9MaXN0Q29udGFpbmVyKCkgOiBtX3JjUGxhdGUoMC4wZiwwLjBmLDAuMGYsMC4wZiksIG1fcmNDb250ZW50KDAuMGYsMC4wZiwwLjBmLDAuMGYpe30KLQl2aXJ0dWFsIH5DRlhfTGlzdENvbnRhaW5lcigpe30KLQl2aXJ0dWFsIHZvaWQJCQkJCVNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0KXttX3JjUGxhdGUgPSByZWN0O30KLQlDUERGX1JlY3QJCQkJCQlHZXRQbGF0ZVJlY3QoKSBjb25zdHtyZXR1cm4gbV9yY1BsYXRlO30KLQl2b2lkCQkJCQkJCVNldENvbnRlbnRSZWN0KGNvbnN0IENMU1RfUmVjdCAmIHJlY3Qpe21fcmNDb250ZW50ID0gcmVjdDt9Ci0JQ0xTVF9SZWN0CQkJCQkJR2V0Q29udGVudFJlY3QoKSBjb25zdHtyZXR1cm4gbV9yY0NvbnRlbnQ7fQotCUNQREZfUG9pbnQJCQkJCQlHZXRCVFBvaW50KCkgY29uc3R7cmV0dXJuIENQREZfUG9pbnQobV9yY1BsYXRlLmxlZnQsbV9yY1BsYXRlLnRvcCk7fQotCUNQREZfUG9pbnQJCQkJCQlHZXRFVFBvaW50KCkgY29uc3R7cmV0dXJuIENQREZfUG9pbnQobV9yY1BsYXRlLnJpZ2h0LG1fcmNQbGF0ZS5ib3R0b20pO30KLXB1YmxpYzoKLQlDUERGX1BvaW50CQkJCQkJSW5uZXJUb091dGVyKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3R7cmV0dXJuIENQREZfUG9pbnQocG9pbnQueCArIEdldEJUUG9pbnQoKS54LEdldEJUUG9pbnQoKS55IC0gcG9pbnQueSk7fQotCUNQREZfUG9pbnQJCQkJCQlPdXRlclRvSW5uZXIoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdHtyZXR1cm4gQ1BERl9Qb2ludChwb2ludC54IC0gR2V0QlRQb2ludCgpLngsR2V0QlRQb2ludCgpLnkgLSBwb2ludC55KTt9Ci0JQ1BERl9SZWN0CQkJCQkJSW5uZXJUb091dGVyKGNvbnN0IENMU1RfUmVjdCAmIHJlY3QpIGNvbnN0e0NQREZfUG9pbnQgcHRMZWZ0VG9wID0gSW5uZXJUb091dGVyKENQREZfUG9pbnQocmVjdC5sZWZ0LHJlY3QudG9wKSk7Ci0JCQkJCQkJCQkJCQkJCQkJCQkJQ1BERl9Qb2ludCBwdFJpZ2h0Qm90dG9tID0gSW5uZXJUb091dGVyKENQREZfUG9pbnQocmVjdC5yaWdodCxyZWN0LmJvdHRvbSkpOwotCQkJCQkJCQkJCQkJCQkJCQkJCXJldHVybiBDUERGX1JlY3QocHRMZWZ0VG9wLngscHRSaWdodEJvdHRvbS55LHB0UmlnaHRCb3R0b20ueCxwdExlZnRUb3AueSk7fQotCUNMU1RfUmVjdAkJCQkJCU91dGVyVG9Jbm5lcihjb25zdCBDUERGX1JlY3QgJiByZWN0KSBjb25zdHtDUERGX1BvaW50IHB0TGVmdFRvcCA9IE91dGVyVG9Jbm5lcihDUERGX1BvaW50KHJlY3QubGVmdCxyZWN0LnRvcCkpOwotCQkJCQkJCQkJCQkJCQkJCQkJCUNQREZfUG9pbnQgcHRSaWdodEJvdHRvbSA9IE91dGVyVG9Jbm5lcihDUERGX1BvaW50KHJlY3QucmlnaHQscmVjdC5ib3R0b20pKTsKLQkJCQkJCQkJCQkJCQkJCQkJCQlyZXR1cm4gQ0xTVF9SZWN0KHB0TGVmdFRvcC54LHB0TGVmdFRvcC55LHB0UmlnaHRCb3R0b20ueCxwdFJpZ2h0Qm90dG9tLnkpO30KLXByaXZhdGU6Ci0JQ1BERl9SZWN0CQkJCQkJbV9yY1BsYXRlOwotCUNMU1RfUmVjdAkJCQkJCW1fcmNDb250ZW50OwkJLy9wb3NpdGl2ZSBmb3JldmVyIQorY2xhc3MgQ0ZYX0xpc3RDb250YWluZXIgeworIHB1YmxpYzoKKyAgQ0ZYX0xpc3RDb250YWluZXIoKQorICAgICAgOiBtX3JjUGxhdGUoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiksCisgICAgICAgIG1fcmNDb250ZW50KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpIHt9CisgIHZpcnR1YWwgfkNGWF9MaXN0Q29udGFpbmVyKCkge30KKyAgdmlydHVhbCB2b2lkIFNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QmIHJlY3QpIHsgbV9yY1BsYXRlID0gcmVjdDsgfQorICBDUERGX1JlY3QgR2V0UGxhdGVSZWN0KCkgY29uc3QgeyByZXR1cm4gbV9yY1BsYXRlOyB9CisgIHZvaWQgU2V0Q29udGVudFJlY3QoY29uc3QgQ0xTVF9SZWN0JiByZWN0KSB7IG1fcmNDb250ZW50ID0gcmVjdDsgfQorICBDTFNUX1JlY3QgR2V0Q29udGVudFJlY3QoKSBjb25zdCB7IHJldHVybiBtX3JjQ29udGVudDsgfQorICBDUERGX1BvaW50IEdldEJUUG9pbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIENQREZfUG9pbnQobV9yY1BsYXRlLmxlZnQsIG1fcmNQbGF0ZS50b3ApOworICB9CisgIENQREZfUG9pbnQgR2V0RVRQb2ludCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ1BERl9Qb2ludChtX3JjUGxhdGUucmlnaHQsIG1fcmNQbGF0ZS5ib3R0b20pOworICB9CisKKyBwdWJsaWM6CisgIENQREZfUG9pbnQgSW5uZXJUb091dGVyKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdCB7CisgICAgcmV0dXJuIENQREZfUG9pbnQocG9pbnQueCArIEdldEJUUG9pbnQoKS54LCBHZXRCVFBvaW50KCkueSAtIHBvaW50LnkpOworICB9CisgIENQREZfUG9pbnQgT3V0ZXJUb0lubmVyKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdCB7CisgICAgcmV0dXJuIENQREZfUG9pbnQocG9pbnQueCAtIEdldEJUUG9pbnQoKS54LCBHZXRCVFBvaW50KCkueSAtIHBvaW50LnkpOworICB9CisgIENQREZfUmVjdCBJbm5lclRvT3V0ZXIoY29uc3QgQ0xTVF9SZWN0JiByZWN0KSBjb25zdCB7CisgICAgQ1BERl9Qb2ludCBwdExlZnRUb3AgPSBJbm5lclRvT3V0ZXIoQ1BERl9Qb2ludChyZWN0LmxlZnQsIHJlY3QudG9wKSk7CisgICAgQ1BERl9Qb2ludCBwdFJpZ2h0Qm90dG9tID0KKyAgICAgICAgSW5uZXJUb091dGVyKENQREZfUG9pbnQocmVjdC5yaWdodCwgcmVjdC5ib3R0b20pKTsKKyAgICByZXR1cm4gQ1BERl9SZWN0KHB0TGVmdFRvcC54LCBwdFJpZ2h0Qm90dG9tLnksIHB0UmlnaHRCb3R0b20ueCwKKyAgICAgICAgICAgICAgICAgICAgIHB0TGVmdFRvcC55KTsKKyAgfQorICBDTFNUX1JlY3QgT3V0ZXJUb0lubmVyKGNvbnN0IENQREZfUmVjdCYgcmVjdCkgY29uc3QgeworICAgIENQREZfUG9pbnQgcHRMZWZ0VG9wID0gT3V0ZXJUb0lubmVyKENQREZfUG9pbnQocmVjdC5sZWZ0LCByZWN0LnRvcCkpOworICAgIENQREZfUG9pbnQgcHRSaWdodEJvdHRvbSA9CisgICAgICAgIE91dGVyVG9Jbm5lcihDUERGX1BvaW50KHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKSk7CisgICAgcmV0dXJuIENMU1RfUmVjdChwdExlZnRUb3AueCwgcHRMZWZ0VG9wLnksIHB0UmlnaHRCb3R0b20ueCwKKyAgICAgICAgICAgICAgICAgICAgIHB0UmlnaHRCb3R0b20ueSk7CisgIH0KKworIHByaXZhdGU6CisgIENQREZfUmVjdCBtX3JjUGxhdGU7CisgIENMU1RfUmVjdCBtX3JjQ29udGVudDsgIC8vIHBvc2l0aXZlIGZvcmV2ZXIhCiB9OwogCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBjbGFzcyBDTFNUX0FycmF5VGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT4KLXsKLXB1YmxpYzoKLQlGWF9CT09MIElzRW1wdHkoKSB7IHJldHVybiBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0U2l6ZSgpIDw9IDA7IH0KLQlUWVBFIEdldEF0KEZYX0lOVDMyIG5JbmRleCkgY29uc3QgeyBpZiAobkluZGV4ID49IDAgJiYgbkluZGV4IDwgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OkdldFNpemUoKSkgcmV0dXJuIENGWF9BcnJheVRlbXBsYXRlPFRZUEU+OjpHZXRBdChuSW5kZXgpOyByZXR1cm4gTlVMTDt9Ci0Jdm9pZCBSZW1vdmVBdChGWF9JTlQzMiBuSW5kZXgpe2lmIChuSW5kZXggPj0gMCAmJiBuSW5kZXggPCBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0U2l6ZSgpKSBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6UmVtb3ZlQXQobkluZGV4KTt9Cit0ZW1wbGF0ZSA8Y2xhc3MgVFlQRT4KK2NsYXNzIENMU1RfQXJyYXlUZW1wbGF0ZSA6IHB1YmxpYyBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPiB7CisgcHVibGljOgorICBGWF9CT09MIElzRW1wdHkoKSB7IHJldHVybiBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0U2l6ZSgpIDw9IDA7IH0KKyAgVFlQRSBHZXRBdChpbnQzMl90IG5JbmRleCkgY29uc3QgeworICAgIGlmIChuSW5kZXggPj0gMCAmJiBuSW5kZXggPCBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0U2l6ZSgpKQorICAgICAgcmV0dXJuIENGWF9BcnJheVRlbXBsYXRlPFRZUEU+OjpHZXRBdChuSW5kZXgpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHZvaWQgUmVtb3ZlQXQoaW50MzJfdCBuSW5kZXgpIHsKKyAgICBpZiAobkluZGV4ID49IDAgJiYgbkluZGV4IDwgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OkdldFNpemUoKSkKKyAgICAgIENGWF9BcnJheVRlbXBsYXRlPFRZUEU+OjpSZW1vdmVBdChuSW5kZXgpOworICB9CiB9OwogCi1jbGFzcyBDRlhfTGlzdCA6IHByb3RlY3RlZCBDRlhfTGlzdENvbnRhaW5lciAsIHB1YmxpYyBJRlhfTGlzdAotewotcHVibGljOgotCUNGWF9MaXN0KCk7Ci0JdmlydHVhbCB+Q0ZYX0xpc3QoKTsKK2NsYXNzIENGWF9MaXN0IDogcHJvdGVjdGVkIENGWF9MaXN0Q29udGFpbmVyLCBwdWJsaWMgSUZYX0xpc3QgeworIHB1YmxpYzoKKyAgQ0ZYX0xpc3QoKTsKKyAgfkNGWF9MaXN0KCkgb3ZlcnJpZGU7CiAKLXB1YmxpYzoKLQl2aXJ0dWFsIHZvaWQJCQkJCVNldEZvbnRNYXAoSUZYX0VkaXRfRm9udE1hcCAqIHBGb250TWFwKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCVNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSk7CisgIC8vIElGWF9MaXN0OgorICB2b2lkIFNldEZvbnRNYXAoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXApIG92ZXJyaWRlOworICB2b2lkIFNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgb3ZlcnJpZGU7CisgIENQREZfUmVjdCBHZXRQbGF0ZVJlY3QoKSBjb25zdCBvdmVycmlkZTsKKyAgQ1BERl9SZWN0IEdldENvbnRlbnRSZWN0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIEZYX0ZMT0FUIEdldEZvbnRTaXplKCkgY29uc3Qgb3ZlcnJpZGU7CisgIElGWF9FZGl0KiBHZXRJdGVtRWRpdChpbnQzMl90IG5JbmRleCkgY29uc3Qgb3ZlcnJpZGU7CisgIGludDMyX3QgR2V0Q291bnQoKSBjb25zdCBvdmVycmlkZTsKKyAgRlhfQk9PTCBJc0l0ZW1TZWxlY3RlZChpbnQzMl90IG5JbmRleCkgY29uc3Qgb3ZlcnJpZGU7CisgIEZYX0ZMT0FUIEdldEZpcnN0SGVpZ2h0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2V0TXVsdGlwbGVTZWwoRlhfQk9PTCBiTXVsdGlwbGUpIG92ZXJyaWRlOworICBGWF9CT09MIElzTXVsdGlwbGVTZWwoKSBjb25zdCBvdmVycmlkZTsKKyAgRlhfQk9PTCBJc1ZhbGlkKGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3Qgb3ZlcnJpZGU7CisgIGludDMyX3QgRmluZE5leHQoaW50MzJfdCBuSW5kZXgsIEZYX1dDSEFSIG5DaGFyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBFbXB0eSgpIG92ZXJyaWRlOworICBDUERGX1JlY3QgR2V0SXRlbVJlY3QoaW50MzJfdCBuSW5kZXgpIGNvbnN0IG92ZXJyaWRlOworICBpbnQzMl90IEdldEl0ZW1JbmRleChjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3Qgb3ZlcnJpZGU7CisgIGludDMyX3QgR2V0Rmlyc3RTZWxlY3RlZCgpIGNvbnN0IG92ZXJyaWRlOwogCi0JdmlydHVhbCBDUERGX1JlY3QJCQkJR2V0UGxhdGVSZWN0KCkgY29uc3Q7Ci0JdmlydHVhbCBDUERGX1JlY3QJCQkJR2V0Q29udGVudFJlY3QoKSBjb25zdDsKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgQWRkSXRlbShjb25zdCBGWF9XQ0hBUiogc3RyKTsKKyAgdmlydHVhbCB2b2lkIFJlQXJyYW5nZShpbnQzMl90IG5JdGVtSW5kZXgpOworICBDRlhfV2lkZVN0cmluZyBHZXRJdGVtVGV4dChpbnQzMl90IG5JbmRleCkgY29uc3Q7CisgIHZvaWQgU2V0SXRlbVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkKTsKKyAgdm9pZCBTZXRJdGVtQ2FyZXQoaW50MzJfdCBuSXRlbUluZGV4LCBGWF9CT09MIGJDYXJldCk7CisgIGludDMyX3QgR2V0TGFzdFNlbGVjdGVkKCkgY29uc3Q7CisgIEZYX1dDSEFSIFRvdXBwZXIoRlhfV0NIQVIgYykgY29uc3Q7CiAKLQl2aXJ0dWFsIEZYX0ZMT0FUCQkJCUdldEZvbnRTaXplKCkgY29uc3Q7Ci0JdmlydHVhbCBJRlhfRWRpdCoJCQkJR2V0SXRlbUVkaXQoRlhfSU5UMzIgbkluZGV4KSBjb25zdDsKLQl2aXJ0dWFsIEZYX0lOVDMyCQkJCUdldENvdW50KCkgY29uc3Q7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlJc0l0ZW1TZWxlY3RlZChGWF9JTlQzMiBuSW5kZXgpIGNvbnN0OwotCXZpcnR1YWwgRlhfRkxPQVQJCQkJR2V0Rmlyc3RIZWlnaHQoKSBjb25zdDsKLQotCXZpcnR1YWwgdm9pZAkJCQkJU2V0TXVsdGlwbGVTZWwoRlhfQk9PTCBiTXVsdGlwbGUpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJSXNNdWx0aXBsZVNlbCgpIGNvbnN0OwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJSXNWYWxpZChGWF9JTlQzMiBuSXRlbUluZGV4KSBjb25zdDsKLQl2aXJ0dWFsIEZYX0lOVDMyCQkJCUZpbmROZXh0KEZYX0lOVDMyIG5JbmRleCxGWF9XQ0hBUiBuQ2hhcikgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLQl2aXJ0dWFsIHZvaWQJCQkJCUVtcHR5KCk7Ci0KLQl2b2lkCQkJCQkJCUFkZEl0ZW0oRlhfTFBDV1NUUiBzdHIpOwotCXZpcnR1YWwgdm9pZAkJCQkJUmVBcnJhbmdlKEZYX0lOVDMyIG5JdGVtSW5kZXgpOwotCi0JdmlydHVhbCBDUERGX1JlY3QJCQkJR2V0SXRlbVJlY3QoRlhfSU5UMzIgbkluZGV4KSBjb25zdDsKLQlDRlhfV2lkZVN0cmluZwkJCQkJR2V0SXRlbVRleHQoRlhfSU5UMzIgbkluZGV4KSBjb25zdDsKLQotCXZvaWQJCQkJCQkJU2V0SXRlbVNlbGVjdChGWF9JTlQzMiBuSXRlbUluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCk7Ci0Jdm9pZAkJCQkJCQlTZXRJdGVtQ2FyZXQoRlhfSU5UMzIgbkl0ZW1JbmRleCwgRlhfQk9PTCBiQ2FyZXQpOwotCi0JdmlydHVhbCBGWF9JTlQzMgkJCQlHZXRJdGVtSW5kZXgoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdDsKLQlGWF9JTlQzMgkJCQkJCUdldEZpcnN0U2VsZWN0ZWQoKSBjb25zdDsKLQlGWF9JTlQzMgkJCQkJCUdldExhc3RTZWxlY3RlZCgpIGNvbnN0OwotCUZYX1dDSEFSCQkJCQkJVG91cHBlcihGWF9XQ0hBUiBjKSBjb25zdDsKLQotcHJpdmF0ZToKLQlDTFNUX0FycmF5VGVtcGxhdGU8Q0ZYX0xpc3RJdGVtKj4JbV9hTGlzdEl0ZW1zOwotCUZYX0ZMT0FUCQkJCQkJCW1fZkZvbnRTaXplOwotCUlGWF9FZGl0X0ZvbnRNYXAqCQkJCQltX3BGb250TWFwOwotCUZYX0JPT0wJCQkJCQkJCW1fYk11bHRpcGxlOworIHByaXZhdGU6CisgIENMU1RfQXJyYXlUZW1wbGF0ZTxDRlhfTGlzdEl0ZW0qPiBtX2FMaXN0SXRlbXM7CisgIEZYX0ZMT0FUIG1fZkZvbnRTaXplOworICBJRlhfRWRpdF9Gb250TWFwKiBtX3BGb250TWFwOworICBGWF9CT09MIG1fYk11bHRpcGxlOwogfTsKIAotc3RydWN0IENQTFNUX1NlbGVjdF9JdGVtCi17Ci0JQ1BMU1RfU2VsZWN0X0l0ZW0oRlhfSU5UMzIgbkl0ZW1JbmRleCxGWF9JTlQzMiBuU3RhdGUpCi0JewotCQl0aGlzLT5uSXRlbUluZGV4ID0gbkl0ZW1JbmRleDsKLQkJdGhpcy0+blN0YXRlID0gblN0YXRlOwotCX0KK3N0cnVjdCBDUExTVF9TZWxlY3RfSXRlbSB7CisgIENQTFNUX1NlbGVjdF9JdGVtKGludDMyX3Qgb3RoZXJfbkl0ZW1JbmRleCwgaW50MzJfdCBvdGhlcl9uU3RhdGUpIHsKKyAgICBuSXRlbUluZGV4ID0gb3RoZXJfbkl0ZW1JbmRleDsKKyAgICBuU3RhdGUgPSBvdGhlcl9uU3RhdGU7CisgIH0KIAotCUZYX0lOVDMyCQluSXRlbUluZGV4OwotCUZYX0lOVDMyCQluU3RhdGU7IC8vMDpub3JtYWwgc2VsZWN0IC0xOnRvIGRlc2VsZWN0IDE6IHRvIHNlbGVjdAorICBpbnQzMl90IG5JdGVtSW5kZXg7CisgIGludDMyX3QgblN0YXRlOyAgLy8gMDpub3JtYWwgc2VsZWN0IC0xOnRvIGRlc2VsZWN0IDE6IHRvIHNlbGVjdAogfTsKIAotY2xhc3MgQ1BMU1RfU2VsZWN0Ci17Ci1wdWJsaWM6Ci0JQ1BMU1RfU2VsZWN0KCk7Ci0JdmlydHVhbCB+Q1BMU1RfU2VsZWN0KCk7CitjbGFzcyBDUExTVF9TZWxlY3QgeworIHB1YmxpYzoKKyAgQ1BMU1RfU2VsZWN0KCk7CisgIHZpcnR1YWwgfkNQTFNUX1NlbGVjdCgpOwogCi1wdWJsaWM6Ci0Jdm9pZAkJCQkJCQlBZGQoRlhfSU5UMzIgbkl0ZW1JbmRleCk7Ci0Jdm9pZAkJCQkJCQlBZGQoRlhfSU5UMzIgbkJlZ2luSW5kZXgsIEZYX0lOVDMyIG5FbmRJbmRleCk7Ci0Jdm9pZAkJCQkJCQlTdWIoRlhfSU5UMzIgbkl0ZW1JbmRleCk7Ci0Jdm9pZAkJCQkJCQlTdWIoRlhfSU5UMzIgbkJlZ2luSW5kZXgsIEZYX0lOVDMyIG5FbmRJbmRleCk7Ci0JRlhfQk9PTAkJCQkJCQlJc0V4aXN0KEZYX0lOVDMyIG5JdGVtSW5kZXgpIGNvbnN0OwotCUZYX0lOVDMyCQkJCQkJRmluZChGWF9JTlQzMiBuSXRlbUluZGV4KSBjb25zdDsKLQlGWF9JTlQzMgkJCQkJCUdldENvdW50KCkgY29uc3Q7Ci0JRlhfSU5UMzIJCQkJCQlHZXRJdGVtSW5kZXgoRlhfSU5UMzIgbkluZGV4KSBjb25zdDsKLQlGWF9JTlQzMgkJCQkJCUdldFN0YXRlKEZYX0lOVDMyIG5JbmRleCkgY29uc3Q7Ci0Jdm9pZAkJCQkJCQlEb25lKCk7Ci0Jdm9pZAkJCQkJCQlEZXNlbGVjdEFsbCgpOworIHB1YmxpYzoKKyAgdm9pZCBBZGQoaW50MzJfdCBuSXRlbUluZGV4KTsKKyAgdm9pZCBBZGQoaW50MzJfdCBuQmVnaW5JbmRleCwgaW50MzJfdCBuRW5kSW5kZXgpOworICB2b2lkIFN1YihpbnQzMl90IG5JdGVtSW5kZXgpOworICB2b2lkIFN1YihpbnQzMl90IG5CZWdpbkluZGV4LCBpbnQzMl90IG5FbmRJbmRleCk7CisgIEZYX0JPT0wgSXNFeGlzdChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OworICBpbnQzMl90IEZpbmQoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdDsKKyAgaW50MzJfdCBHZXRDb3VudCgpIGNvbnN0OworICBpbnQzMl90IEdldEl0ZW1JbmRleChpbnQzMl90IG5JbmRleCkgY29uc3Q7CisgIGludDMyX3QgR2V0U3RhdGUoaW50MzJfdCBuSW5kZXgpIGNvbnN0OworICB2b2lkIERvbmUoKTsKKyAgdm9pZCBEZXNlbGVjdEFsbCgpOwogCi1wcml2YXRlOgotCUNGWF9BcnJheVRlbXBsYXRlPENQTFNUX1NlbGVjdF9JdGVtKj4JbV9hSXRlbXM7CisgcHJpdmF0ZToKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BMU1RfU2VsZWN0X0l0ZW0qPiBtX2FJdGVtczsKIH07CiAKLWNsYXNzIENGWF9MaXN0Q3RybCA6IHB1YmxpYyBDRlhfTGlzdAotewotcHVibGljOgotCUNGWF9MaXN0Q3RybCgpOwotCXZpcnR1YWwgfkNGWF9MaXN0Q3RybCgpOworY2xhc3MgQ0ZYX0xpc3RDdHJsIDogcHVibGljIENGWF9MaXN0IHsKKyBwdWJsaWM6CisgIENGWF9MaXN0Q3RybCgpOworICB+Q0ZYX0xpc3RDdHJsKCkgb3ZlcnJpZGU7CiAKLXB1YmxpYzoKLQl2b2lkCQkJCQkJCVNldE5vdGlmeShJRlhfTGlzdF9Ob3RpZnkgKiBwTm90aWZ5KTsKKyAgLy8gQ0ZYX0xpc3QKKyAgdm9pZCBTZXROb3RpZnkoSUZYX0xpc3RfTm90aWZ5KiBwTm90aWZ5KSBvdmVycmlkZTsKKyAgdm9pZCBPbk1vdXNlRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDdHJsKSBvdmVycmlkZTsKKyAgdm9pZCBPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDdHJsKSBvdmVycmlkZTsKKyAgdm9pZCBPblZLX1VQKEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJDdHJsKSBvdmVycmlkZTsKKyAgdm9pZCBPblZLX0RPV04oRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpIG92ZXJyaWRlOworICB2b2lkIE9uVktfTEVGVChGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgb3ZlcnJpZGU7CisgIHZvaWQgT25WS19SSUdIVChGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgb3ZlcnJpZGU7CisgIHZvaWQgT25WS19IT01FKEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJDdHJsKSBvdmVycmlkZTsKKyAgdm9pZCBPblZLX0VORChGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgb3ZlcnJpZGU7CisgIHZvaWQgT25WSyhpbnQzMl90IG5JdGVtSW5kZXgsIEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJDdHJsKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpIG92ZXJyaWRlOworICB2b2lkIFNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QmIHJlY3QpIG92ZXJyaWRlOworICB2b2lkIFNldFNjcm9sbFBvcyhjb25zdCBDUERGX1BvaW50JiBwb2ludCkgb3ZlcnJpZGU7CisgIHZvaWQgU2Nyb2xsVG9MaXN0SXRlbShpbnQzMl90IG5JdGVtSW5kZXgpIG92ZXJyaWRlOworICBDUERGX1JlY3QgR2V0SXRlbVJlY3QoaW50MzJfdCBuSW5kZXgpIGNvbnN0IG92ZXJyaWRlOworICBpbnQzMl90IEdldENhcmV0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbV9uQ2FyZXRJbmRleDsgfQorICBpbnQzMl90IEdldFNlbGVjdCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1fblNlbEl0ZW07IH0KKyAgaW50MzJfdCBHZXRUb3BJdGVtKCkgY29uc3Qgb3ZlcnJpZGU7CisgIENQREZfUmVjdCBHZXRDb250ZW50UmVjdCgpIGNvbnN0IG92ZXJyaWRlOworICBpbnQzMl90IEdldEl0ZW1JbmRleChjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgQWRkU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBzdHJpbmcpIG92ZXJyaWRlOworICB2b2lkIFNldFRvcEl0ZW0oaW50MzJfdCBuSW5kZXgpIG92ZXJyaWRlOworICB2b2lkIFNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgpIG92ZXJyaWRlOworICB2b2lkIFNldENhcmV0KGludDMyX3Qgbkl0ZW1JbmRleCkgb3ZlcnJpZGU7CisgIHZvaWQgRW1wdHkoKSBvdmVycmlkZTsKKyAgdm9pZCBDYW5jZWwoKSBvdmVycmlkZTsKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0VGV4dCgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFJlQXJyYW5nZShpbnQzMl90IG5JdGVtSW5kZXgpIG92ZXJyaWRlOwogCi0Jdm9pZAkJCQkJCQlPbk1vdXNlRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7Ci0Jdm9pZAkJCQkJCQlPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7Ci0Jdm9pZAkJCQkJCQlPblZLX1VQKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOwotCXZvaWQJCQkJCQkJT25WS19ET1dOKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOwotCXZvaWQJCQkJCQkJT25WS19MRUZUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOwotCXZvaWQJCQkJCQkJT25WS19SSUdIVChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKLQl2b2lkCQkJCQkJCU9uVktfSE9NRShGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKTsKLQl2b2lkCQkJCQkJCU9uVktfRU5EKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOwotCXZvaWQJCQkJCQkJT25WSyhGWF9JTlQzMiBuSXRlbUluZGV4LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpOwotCUZYX0JPT0wJCQkJCQkJT25DaGFyKEZYX1dPUkQgbkNoYXIsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCk7CisgIHZpcnR1YWwgQ1BERl9Qb2ludCBJblRvT3V0KGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdDsKKyAgdmlydHVhbCBDUERGX1BvaW50IE91dFRvSW4oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0OworICB2aXJ0dWFsIENQREZfUmVjdCBJblRvT3V0KGNvbnN0IENQREZfUmVjdCYgcmVjdCkgY29uc3Q7CisgIHZpcnR1YWwgQ1BERl9SZWN0IE91dFRvSW4oY29uc3QgQ1BERl9SZWN0JiByZWN0KSBjb25zdDsKIAotCXZpcnR1YWwgQ1BERl9Qb2ludAkJCQlJblRvT3V0KGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3Q7Ci0JdmlydHVhbCBDUERGX1BvaW50CQkJCU91dFRvSW4oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdDsKLQl2aXJ0dWFsIENQREZfUmVjdAkJCQlJblRvT3V0KGNvbnN0IENQREZfUmVjdCAmIHJlY3QpIGNvbnN0OwotCXZpcnR1YWwgQ1BERl9SZWN0CQkJCU91dFRvSW4oY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkgY29uc3Q7CisgcHJpdmF0ZToKKyAgdm9pZCBTZXRNdWx0aXBsZVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkKTsKKyAgdm9pZCBTZXRTaW5nbGVTZWxlY3QoaW50MzJfdCBuSXRlbUluZGV4KTsKKyAgdm9pZCBJbnZhbGlkYXRlSXRlbShpbnQzMl90IG5JdGVtSW5kZXgpOworICB2b2lkIFNlbGVjdEl0ZW1zKCk7CisgIEZYX0JPT0wgSXNJdGVtVmlzaWJsZShpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OworICB2b2lkIFNldFNjcm9sbEluZm8oKTsKKyAgdm9pZCBTZXRTY3JvbGxQb3NZKEZYX0ZMT0FUIGZ5KTsKIAotCXZpcnR1YWwgdm9pZAkJCQkJU2V0UGxhdGVSZWN0KGNvbnN0IENQREZfUmVjdCAmIHJlY3QpOwotCXZvaWQJCQkJCQkJU2V0U2Nyb2xsUG9zKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCk7Ci0Jdm9pZAkJCQkJCQlTY3JvbGxUb0xpc3RJdGVtKEZYX0lOVDMyIG5JdGVtSW5kZXgpOwotCXZpcnR1YWwgQ1BERl9SZWN0CQkJCUdldEl0ZW1SZWN0KEZYX0lOVDMyIG5JbmRleCkgY29uc3Q7Ci0JRlhfSU5UMzIJCQkJCQlHZXRDYXJldCgpIGNvbnN0IHtyZXR1cm4gbV9uQ2FyZXRJbmRleDt9Ci0JRlhfSU5UMzIJCQkJCQlHZXRTZWxlY3QoKSBjb25zdCB7cmV0dXJuIG1fblNlbEl0ZW07fQotCUZYX0lOVDMyCQkJCQkJR2V0VG9wSXRlbSgpIGNvbnN0OwotCXZpcnR1YWwgQ1BERl9SZWN0CQkJCUdldENvbnRlbnRSZWN0KCkgY29uc3Q7Ci0JdmlydHVhbCBGWF9JTlQzMgkJCQlHZXRJdGVtSW5kZXgoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdDsKLQotCXZvaWQJCQkJCQkJQWRkU3RyaW5nKEZYX0xQQ1dTVFIgc3RyaW5nKTsKLQl2b2lkCQkJCQkJCVNldFRvcEl0ZW0oRlhfSU5UMzIgbkluZGV4KTsKLQl2b2lkCQkJCQkJCVNlbGVjdChGWF9JTlQzMiBuSXRlbUluZGV4KTsKLQl2aXJ0dWFsIHZvaWQJCQkJCVNldENhcmV0KEZYX0lOVDMyIG5JdGVtSW5kZXgpOwotCXZpcnR1YWwgdm9pZAkJCQkJRW1wdHkoKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCUNhbmNlbCgpOwotCUNGWF9XaWRlU3RyaW5nCQkJCQlHZXRUZXh0KCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0Jdm9pZAkJCQkJCQlTZXRNdWx0aXBsZVNlbGVjdChGWF9JTlQzMiBuSXRlbUluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCk7Ci0Jdm9pZAkJCQkJCQlTZXRTaW5nbGVTZWxlY3QoRlhfSU5UMzIgbkl0ZW1JbmRleCk7Ci0Jdm9pZAkJCQkJCQlJbnZhbGlkYXRlSXRlbShGWF9JTlQzMiBuSXRlbUluZGV4KTsKLQl2b2lkCQkJCQkJCVNlbGVjdEl0ZW1zKCk7Ci0JRlhfQk9PTAkJCQkJCQlJc0l0ZW1WaXNpYmxlKEZYX0lOVDMyIG5JdGVtSW5kZXgpIGNvbnN0OwotCXZvaWQJCQkJCQkJU2V0U2Nyb2xsSW5mbygpOwotCXZvaWQJCQkJCQkJU2V0U2Nyb2xsUG9zWShGWF9GTE9BVCBmeSk7Ci0JdmlydHVhbCB2b2lkCQkJCQlSZUFycmFuZ2UoRlhfSU5UMzIgbkl0ZW1JbmRleCk7Ci0KLXByaXZhdGU6Ci0JSUZYX0xpc3RfTm90aWZ5KgkJCQltX3BOb3RpZnk7Ci0JRlhfQk9PTAkJCQkJCQltX2JOb3RpZnlGbGFnOwotCUNQREZfUG9pbnQJCQkJCQltX3B0U2Nyb2xsUG9zOwotCUNQTFNUX1NlbGVjdAkJCQkJbV9hU2VsSXRlbXM7CS8vZm9yIG11bHRpcGxlCi0JRlhfSU5UMzIJCQkJCQltX25TZWxJdGVtOwkJLy9mb3Igc2luZ2xlCi0JRlhfSU5UMzIJCQkJCQltX25Gb290SW5kZXg7CS8vZm9yIG11bHRpcGxlCi0JRlhfQk9PTAkJCQkJCQltX2JDdHJsU2VsOwkJLy9mb3IgbXVsdGlwbGUKLQlGWF9JTlQzMgkJCQkJCW1fbkNhcmV0SW5kZXg7CS8vZm9yIG11bHRpcGxlCisgcHJpdmF0ZToKKyAgSUZYX0xpc3RfTm90aWZ5KiBtX3BOb3RpZnk7CisgIEZYX0JPT0wgbV9iTm90aWZ5RmxhZzsKKyAgQ1BERl9Qb2ludCBtX3B0U2Nyb2xsUG9zOworICBDUExTVF9TZWxlY3QgbV9hU2VsSXRlbXM7ICAvLyBmb3IgbXVsdGlwbGUKKyAgaW50MzJfdCBtX25TZWxJdGVtOyAgICAgICAgLy8gZm9yIHNpbmdsZQorICBpbnQzMl90IG1fbkZvb3RJbmRleDsgICAgICAvLyBmb3IgbXVsdGlwbGUKKyAgRlhfQk9PTCBtX2JDdHJsU2VsOyAgICAgICAgLy8gZm9yIG11bHRpcGxlCisgIGludDMyX3QgbV9uQ2FyZXRJbmRleDsgICAgIC8vIGZvciBtdWx0aXBsZQogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfRlhFRElUX0ZYRVRfTElTVF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meGV0X3N0dWIuaCBiL2ZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhldF9zdHViLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZTJmMGMuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meGV0X3N0dWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBGUERGU0RLX0lOQ0xVREVfRlhFRElUX0ZYRVRfU1RVQl9IXwotI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfRlhFRElUX0ZYRVRfU1RVQl9IXwotCi0jaW5jbHVkZSAiLi4vLi4vLi4vY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3JlbmRlci5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFnZW9iai5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfdnQuaCIKLSNpbmNsdWRlICIuLi9meF9zeXN0ZW1oYW5kbGVyLmgiCi0KLSNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0ZYRURJVF9GWEVUX1NUVUJfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0NvbnN0cy5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvQ29uc3RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZGRjNTIuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvQ29uc3RzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBGUERGU0RLX0lOQ0xVREVfSkFWQVNDUklQVF9DT05TVFNfSF8KLSNkZWZpbmUgRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfQ09OU1RTX0hfCi0KLSNpbmNsdWRlICJKU19EZWZpbmUuaCIKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGJvcmRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotY2xhc3MgQ0pTX0JvcmRlciA6IHB1YmxpYyBDSlNfT2JqZWN0Ci17Ci1wdWJsaWM6Ci0JQ0pTX0JvcmRlcihKU0ZYT2JqZWN0ICBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge307Ci0JdmlydHVhbCB+Q0pTX0JvcmRlcih2b2lkKXt9OwotCi0JREVDTEFSRV9KU19DTEFTU19DT05TVCgpOwotfTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRpc3BsYXkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLWNsYXNzIENKU19EaXNwbGF5IDogcHVibGljIENKU19PYmplY3QKLXsKLXB1YmxpYzoKLQlDSlNfRGlzcGxheShKU0ZYT2JqZWN0ICBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge307Ci0JdmlydHVhbCB+Q0pTX0Rpc3BsYXkodm9pZCl7fTsKLQotCURFQ0xBUkVfSlNfQ0xBU1NfQ09OU1QoKTsKLX07Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBmb250IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1jbGFzcyBDSlNfRm9udCA6IHB1YmxpYyBDSlNfT2JqZWN0Ci17Ci1wdWJsaWM6Ci0JQ0pTX0ZvbnQoSlNGWE9iamVjdCAgcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9OwotCXZpcnR1YWwgfkNKU19Gb250KHZvaWQpe307Ci0KLQlERUNMQVJFX0pTX0NMQVNTX0NPTlNUKCk7Ci19OwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGlnaGxpZ2h0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1jbGFzcyBDSlNfSGlnaGxpZ2h0IDogcHVibGljIENKU19PYmplY3QKLXsKLXB1YmxpYzoKLQlDSlNfSGlnaGxpZ2h0KEpTRlhPYmplY3QgIHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fTsKLQl2aXJ0dWFsIH5DSlNfSGlnaGxpZ2h0KHZvaWQpe307Ci0KLQlERUNMQVJFX0pTX0NMQVNTX0NPTlNUKCk7Ci19OwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcG9zaXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLWNsYXNzIENKU19Qb3NpdGlvbiA6IHB1YmxpYyBDSlNfT2JqZWN0Ci17Ci1wdWJsaWM6Ci0JQ0pTX1Bvc2l0aW9uKEpTRlhPYmplY3QgIHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fTsKLQl2aXJ0dWFsIH5DSlNfUG9zaXRpb24odm9pZCl7fTsKLQotCURFQ0xBUkVfSlNfQ0xBU1NfQ09OU1QoKTsKLX07Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzY2FsZUhvdyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotY2xhc3MgQ0pTX1NjYWxlSG93IDogcHVibGljIENKU19PYmplY3QKLXsKLXB1YmxpYzoKLQlDSlNfU2NhbGVIb3coSlNGWE9iamVjdCAgcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9OwotCXZpcnR1YWwgfkNKU19TY2FsZUhvdyh2b2lkKXt9OwotCi0JREVDTEFSRV9KU19DTEFTU19DT05TVCgpOwotfTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNjYWxlV2hlbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotY2xhc3MgQ0pTX1NjYWxlV2hlbiA6IHB1YmxpYyBDSlNfT2JqZWN0Ci17Ci1wdWJsaWM6Ci0JQ0pTX1NjYWxlV2hlbihKU0ZYT2JqZWN0ICBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge307Ci0JdmlydHVhbCB+Q0pTX1NjYWxlV2hlbih2b2lkKXt9OwotCi0JREVDTEFSRV9KU19DTEFTU19DT05TVCgpOwotfTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHN0eWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1jbGFzcyBDSlNfU3R5bGUgOiBwdWJsaWMgQ0pTX09iamVjdAotewotcHVibGljOgotCUNKU19TdHlsZShKU0ZYT2JqZWN0ICBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge307Ci0JdmlydHVhbCB+Q0pTX1N0eWxlKHZvaWQpe307Ci0KLQlERUNMQVJFX0pTX0NMQVNTX0NPTlNUKCk7Ci19OwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gem9vbXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLWNsYXNzIENKU19ab29tdHlwZSA6IHB1YmxpYyBDSlNfT2JqZWN0Ci17Ci1wdWJsaWM6Ci0JQ0pTX1pvb210eXBlKEpTRlhPYmplY3QgIHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fTsKLQl2aXJ0dWFsIH5DSlNfWm9vbXR5cGUodm9pZCl7fTsKLQotCURFQ0xBUkVfSlNfQ0xBU1NfQ09OU1QoKTsKLX07Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDSlNfR2xvYmFsQ29uc3RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1jbGFzcyBDSlNfR2xvYmFsQ29uc3RzIDogcHVibGljIENKU19PYmplY3QKLXsKLXB1YmxpYzoKLQlzdGF0aWMgaW50CQkJCUluaXQoSUpTX1J1bnRpbWUqIHBSdW50aW1lKTsKLX07Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDSlNfR2xvYmFsQXJyYXlzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1jbGFzcyBDSlNfR2xvYmFsQXJyYXlzIDogcHVibGljIENKU19PYmplY3QKLXsKLXB1YmxpYzoKLQlzdGF0aWMgaW50CQkJCUluaXQoSUpTX1J1bnRpbWUqIHBSdW50aW1lKTsKLX07Ci0KLSNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfQ09OU1RTX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9Eb2N1bWVudC5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvRG9jdW1lbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIxZGRiOC4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9Eb2N1bWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfRE9DVU1FTlRfSF8KLSNkZWZpbmUgRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfRE9DVU1FTlRfSF8KLQotI2luY2x1ZGUgIkpTX0RlZmluZS5oIgotCi1jbGFzcyBQcmludFBhcmFtc09iaiA6IHB1YmxpYyBDSlNfRW1iZWRPYmoKLXsKLXB1YmxpYzoKLQlQcmludFBhcmFtc09iaihDSlNfT2JqZWN0KiBwSlNPYmplY3QpOwotCXZpcnR1YWwgflByaW50UGFyYW1zT2JqKCl7fQotCQotcHVibGljOgotCUZYX0JPT0wgYlVJOwotCWludCBuU3RhcnQ7Ci0JaW50IG5FbmQ7Ci0JRlhfQk9PTCBiU2lsZW50OwotCUZYX0JPT0wgYlNocmlua1RvRml0OwotCUZYX0JPT0wgYlByaW50QXNJbWFnZTsKLQlGWF9CT09MIGJSZXZlcnNlOwotCUZYX0JPT0wgYkFubm90YXRpb25zOwotfTsKLQotY2xhc3MgQ0pTX1ByaW50UGFyYW1zT2JqIDogcHVibGljIENKU19PYmplY3QKLXsKLXB1YmxpYzoKLQlDSlNfUHJpbnRQYXJhbXNPYmooSlNGWE9iamVjdCBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge30KLQl2aXJ0dWFsIH5DSlNfUHJpbnRQYXJhbXNPYmooKXt9Ci0JCi0JREVDTEFSRV9KU19DTEFTUyhDSlNfUHJpbnRQYXJhbXNPYmopOwotfTsKLQotCi1jbGFzcyBJY29uOwotY2xhc3MgRmllbGQ7Ci0KLXN0cnVjdCBJY29uRWxlbWVudAotewotCUljb25FbGVtZW50KCkgOiBJY29uTmFtZShMIiIpLCBOZXh0SWNvbihOVUxMKSwgSWNvblN0cmVhbShOVUxMKSB7fQotCXZpcnR1YWwgfkljb25FbGVtZW50KCkKLQl7Ci0JfQotCUNGWF9XaWRlU3RyaW5nCUljb25OYW1lOwotCUljb25FbGVtZW50KglOZXh0SWNvbjsKLQlJY29uKgkJCUljb25TdHJlYW07Ci19OwotCi1jbGFzcyBJY29uVHJlZQotewotcHVibGljOgotCUljb25UcmVlKCk6bV9wSGVhZChOVUxMKSwgbV9wRW5kKE5VTEwpLCBtX2lMZW5ndGgoMCkKLQl7Ci0KLQl9Ci0KLQl2aXJ0dWFsIH5JY29uVHJlZSgpCi0JewotCX0KLQotcHVibGljOgotCXZvaWQJCQlJbnNlcnRJY29uRWxlbWVudChJY29uRWxlbWVudCogcE5ld0ljb24pOwotCXZvaWQJCQlEZWxldGVJY29uRWxlbWVudChDRlhfV2lkZVN0cmluZyBzd0ljb25OYW1lKTsKLQl2b2lkCQkJRGVsZXRlSWNvblRyZWUoKTsKLQlpbnQJCQkJR2V0TGVuZ3RoKCk7Ci0JSWNvbkVsZW1lbnQqCW9wZXJhdG9yW10oaW50IGlJbmRleCk7Ci0KLXByaXZhdGU6Ci0JSWNvbkVsZW1lbnQqCW1fcEhlYWQ7Ci0JSWNvbkVsZW1lbnQqCW1fcEVuZDsKLQlpbnQJCQkJbV9pTGVuZ3RoOwotfTsKLQotc3RydWN0IENKU19EZWxheURhdGE7Ci1zdHJ1Y3QgQ0pTX0RlbGF5QW5ub3Q7Ci1zdHJ1Y3QgQ0pTX0Fubm90T2JqOwotCi1jbGFzcyBEb2N1bWVudCA6IHB1YmxpYyBDSlNfRW1iZWRPYmoKLXsKLXB1YmxpYzoKLQlEb2N1bWVudChDSlNfT2JqZWN0KiBwSlNPYmplY3QpOwotCXZpcnR1YWwgfkRvY3VtZW50KCk7Ci0KLXB1YmxpYzoKLQlGWF9CT09MCUFEQkUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWF1dGhvcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJYmFzZVVSTChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJYm9va21hcmtSb290KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAljYWxjdWxhdGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCUNvbGxhYihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJY3JlYXRpb25EYXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAljcmVhdG9yKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlkZWxheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZGlydHkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWRvY3VtZW50RmlsZU5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGV4dGVybmFsKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlmaWxlc2l6ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJaWNvbnMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWluZm8oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWtleXdvcmRzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlsYXlvdXQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCW1lZGlhKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAltb2REYXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAltb3VzZVgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCW1vdXNlWShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJbnVtRmllbGRzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAludW1QYWdlcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJcGFnZU51bShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJcGFnZVdpbmRvd1JlY3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCXBhdGgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCXByb2R1Y2VyKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlzdWJqZWN0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAl0aXRsZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJem9vbShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJem9vbVR5cGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQotCUZYX0JPT0wgYWRkQW5ub3QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlhZGRGaWVsZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWFkZExpbmsoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlhZGRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJY2FsY3VsYXRlTm93KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJY2xvc2VEb2MoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAljcmVhdGVEYXRhT2JqZWN0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZGVsZXRlUGFnZXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlleHBvcnRBc1RleHQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlleHBvcnRBc0ZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWV4cG9ydEFzWEZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGV4dHJhY3RQYWdlcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWdldEFubm90KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZ2V0QW5ub3RzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZ2V0QW5ub3QzRChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWdldEFubm90czNEKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZ2V0RmllbGQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlnZXRJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZ2V0TGlua3MoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlnZXROdGhGaWVsZE5hbWUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlnZXRPQ0dzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZ2V0UGFnZUJveChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWdldFBhZ2VOdGhXb3JkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJZ2V0UGFnZU50aFdvcmRRdWFkcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCWdldFBhZ2VOdW1Xb3JkcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGdldFByaW50UGFyYW1zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZ2V0VVJMKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJaW1wb3J0QW5GREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlpbXBvcnRBblhGREYoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlpbXBvcnRUZXh0RGF0YShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGluc2VydFBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJbWFpbEZvcm0oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlwcmludChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCXJlbW92ZUZpZWxkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgcmVwbGFjZVBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJcmVzZXRGb3JtKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJc2F2ZUFzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJc3VibWl0Rm9ybShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCW1haWxEb2MoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAlyZW1vdmVJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCQotcHVibGljOgotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRhY2hEb2MoQ1BERlNES19Eb2N1bWVudCogcERvYyk7Ci0JQ1BERlNES19Eb2N1bWVudCogICAgICAgICAgICAgICAgICAgICAgIEdldFJlYWRlckRvYygpOwotCXN0YXRpYyBGWF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRyYWN0RmlsZU5hbWUoQ1BERlNES19Eb2N1bWVudCogcERvYywgQ0ZYX0J5dGVTdHJpbmcmIHN0ckZpbGVOYW1lKTsKLQlzdGF0aWMgRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmFjdEZvbGRlck5hbWUoQ1BERlNES19Eb2N1bWVudCogcERvYywgQ0ZYX0J5dGVTdHJpbmcmIHN0ckZvbGRlck5hbWUpOwotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGREZWxheURhdGEoQ0pTX0RlbGF5RGF0YSogcERhdGEpOwotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb0ZpZWxkRGVsYXkoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4KTsKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkRGVsYXlBbm5vdERhdGEoQ0pTX0Fubm90T2JqICpwRGF0YSk7Ci0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvQW5ub3REZWxheSgpOwotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRJc29sYXRlKHY4OjpJc29sYXRlKiBpc29sYXRlKSB7bV9pc29sYXRlID0gaXNvbGF0ZTt9Ci0JQ0pTX0RvY3VtZW50KiAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldENKU0RvYygpIGNvbnN0OyAKLQotcHJpdmF0ZToKLQlDRlhfV2lkZVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgUmV2ZXJzYWxTdHIoQ0ZYX1dpZGVTdHJpbmcgY2JGcm9tKTsKLQlDRlhfV2lkZVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3V0U3RyaW5nKENGWF9XaWRlU3RyaW5nIGNiRnJvbSk7Ci0JYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzRW5jbG9zZWRJblJlY3QoQ0ZYX0Zsb2F0UmVjdCByZWN0LCBDRlhfRmxvYXRSZWN0IExpbmtSZWN0KTsKLQlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRXb3JkcyhDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqKTsKLQlDRlhfV2lkZVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0T2JqV29yZFN0cihDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqLCBpbnQgbldvcmRJbmRleCk7Ci0JRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlclBhcmFtcyhKU09iamVjdCAqcE9iaixDSlNfQW5ub3RPYmomIGFubm90b2JqKTsKLQotCXY4OjpJc29sYXRlKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lzb2xhdGU7Ci0JSWNvblRyZWUqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEljb25UcmVlOwotCUNQREZTREtfRG9jdW1lbnQqICAgICAgICAgICAgICAgICAgICAgICBtX3BEb2N1bWVudDsKLQlDRlhfV2lkZVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jd0Jhc2VVUkw7Ci0JRlhfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkRlbGF5OwotCUNGWF9BcnJheVRlbXBsYXRlPENKU19EZWxheURhdGEqPiAgICAgICBtX0RlbGF5RGF0YTsKLQlDRlhfQXJyYXlUZW1wbGF0ZTxDSlNfQW5ub3RPYmoqPiAgICAgICAgbV9EZWxheUFubm90RGF0YTsKLX07Ci0KLWNsYXNzIENKU19Eb2N1bWVudCA6IHB1YmxpYyBDSlNfT2JqZWN0Ci17Ci1wdWJsaWM6Ci0JQ0pTX0RvY3VtZW50KEpTRlhPYmplY3QgcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9OwotCXZpcnR1YWwgfkNKU19Eb2N1bWVudCgpe307Ci0KLQl2aXJ0dWFsIEZYX0JPT0wJSW5pdEluc3RhbmNlKElGWEpTX0NvbnRleHQqIGNjKTsJCi0KLQlERUNMQVJFX0pTX0NMQVNTKENKU19Eb2N1bWVudCk7Ci0KLQlKU19TVEFUSUNfUFJPUChBREJFLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX1BST1AoYXV0aG9yLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX1BST1AoYmFzZVVSTCwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKGJvb2ttYXJrUm9vdCwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKGNhbGN1bGF0ZSwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKENvbGxhYiwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKGNyZWF0aW9uRGF0ZSwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKGNyZWF0b3IsIERvY3VtZW50KTsKLQlKU19TVEFUSUNfUFJPUChkZWxheSwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKGRpcnR5LCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX1BST1AoZG9jdW1lbnRGaWxlTmFtZSwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKGV4dGVybmFsLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX1BST1AoZmlsZXNpemUsIERvY3VtZW50KTsKLQlKU19TVEFUSUNfUFJPUChpY29ucywgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKGluZm8sIERvY3VtZW50KTsKLQlKU19TVEFUSUNfUFJPUChrZXl3b3JkcywgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKGxheW91dCwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKG1lZGlhLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX1BST1AobW9kRGF0ZSwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKG1vdXNlWCwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKG1vdXNlWSwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKG51bUZpZWxkcywgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKG51bVBhZ2VzLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX1BST1AocGFnZU51bSwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKHBhZ2VXaW5kb3dSZWN0LCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX1BST1AocGF0aCwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKHByb2R1Y2VyLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX1BST1Aoc3ViamVjdCwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKHRpdGxlLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX1BST1Aoem9vbSwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19QUk9QKHpvb21UeXBlLCBEb2N1bWVudCk7Ci0KLQlKU19TVEFUSUNfTUVUSE9EKGFkZEFubm90LERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKGFkZEZpZWxkLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX01FVEhPRChhZGRMaW5rLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX01FVEhPRChhZGRJY29uLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX01FVEhPRChjYWxjdWxhdGVOb3csIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKGNsb3NlRG9jLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX01FVEhPRChjcmVhdGVEYXRhT2JqZWN0LCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX01FVEhPRChkZWxldGVQYWdlcywgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0QoZXhwb3J0QXNUZXh0LCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX01FVEhPRChleHBvcnRBc0ZERiwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0QoZXhwb3J0QXNYRkRGLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX01FVEhPRChleHRyYWN0UGFnZXMsIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKGdldEFubm90LCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX01FVEhPRChnZXRBbm5vdHMsIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKGdldEFubm90M0QsIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKGdldEFubm90czNELCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX01FVEhPRChnZXRGaWVsZCwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0QoZ2V0SWNvbiwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0QoZ2V0TGlua3MsIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKGdldE50aEZpZWxkTmFtZSwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0QoZ2V0T0NHcywgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0QoZ2V0UGFnZUJveCwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0QoZ2V0UGFnZU50aFdvcmQsIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKGdldFBhZ2VOdGhXb3JkUXVhZHMsIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKGdldFBhZ2VOdW1Xb3JkcywgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0QoZ2V0UHJpbnRQYXJhbXMsIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKGdldFVSTCwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0QoaW1wb3J0QW5GREYsIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKGltcG9ydEFuWEZERiwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0QoaW1wb3J0VGV4dERhdGEsIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKGluc2VydFBhZ2VzLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX01FVEhPRChtYWlsRm9ybSwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0QocHJpbnQsIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKHJlbW92ZUZpZWxkLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX01FVEhPRChyZXBsYWNlUGFnZXMsIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKHJlbW92ZUljb24sIERvY3VtZW50KTsKLQlKU19TVEFUSUNfTUVUSE9EKHJlc2V0Rm9ybSwgRG9jdW1lbnQpOwotCUpTX1NUQVRJQ19NRVRIT0Qoc2F2ZUFzLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX01FVEhPRChzdWJtaXRGb3JtLCBEb2N1bWVudCk7Ci0JSlNfU1RBVElDX01FVEhPRChtYWlsRG9jLCBEb2N1bWVudCk7Ci19OwotCi0jZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0RPQ1VNRU5UX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9GaWVsZC5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvRmllbGQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRhMDhiNi4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9GaWVsZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfRklFTERfSF8KLSNkZWZpbmUgRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfRklFTERfSF8KLQotI2luY2x1ZGUgPHN0cmluZz4gIC8vIEZvciBzdGQ6OndzdHJpbmcuCi0KLS8vIFRPRE8odHNlcGV6KTogaW5jbHVkZSBQV0xfV25kLmggZm9yIFBXTF9Db2xvciBhZnRlciBmaXhpbmcgaXRzIElXWVUuCi0jaW5jbHVkZSAiSlNfRGVmaW5lLmgiCi0KLWNsYXNzIERvY3VtZW50OwotCi1lbnVtIEZJRUxEX1BST1AKLXsKLQlGUF9BTElHTk1FTlQsCi0JRlBfQk9SREVSU1RZTEUsCi0JRlBfQlVUVE9OQUxJR05YLAotCUZQX0JVVFRPTkFMSUdOWSwKLQlGUF9CVVRUT05GSVRCT1VORFMsCi0JRlBfQlVUVE9OUE9TSVRJT04sCi0JRlBfQlVUVE9OU0NBTEVIT1csCi0JRlBfQlVUVE9OU0NBTEVXSEVOLAotCUZQX0NBTENPUkRFUklOREVYLAotCUZQX0NIQVJMSU1JVCwKLQlGUF9DT01CLAotCUZQX0NPTU1JVE9OU0VMQ0hBTkdFLAotCUZQX0NVUlJFTlRWQUxVRUlORElDRVMsCi0JRlBfREVGQVVMVFZBTFVFLAotCUZQX0RPTk9UU0NST0xMLAotCUZQX0RJU1BMQVksCi0JRlBfRklMTENPTE9SLAotCUZQX0hJRERFTiwKLQlGUF9ISUdITElHSFQsCi0JRlBfTElORVdJRFRILAotCUZQX01VTFRJTElORSwKLQlGUF9NVUxUSVBMRVNFTEVDVElPTiwKLQlGUF9QQVNTV09SRCwKLQlGUF9SRUNULAotCUZQX1JJQ0hURVhULAotCUZQX1JJQ0hWQUxVRSwKLQlGUF9ST1RBVElPTiwKLQlGUF9TVFJPS0VDT0xPUiwKLQlGUF9TVFlMRSwKLQlGUF9URVhUQ09MT1IsCi0JRlBfVEVYVEZPTlQsCi0JRlBfVEVYVFNJWkUsCi0JRlBfVVNFUk5BTUUsCi0JRlBfVkFMVUUKLX07Ci0KLWNsYXNzIENKU19XaWRlU3RyaW5nQXJyYXkKLXsKLXB1YmxpYzoKLQlDSlNfV2lkZVN0cmluZ0FycmF5KCl7fQotCXZpcnR1YWwgfkNKU19XaWRlU3RyaW5nQXJyYXkoKQotCXsKLQkJZm9yIChpbnQgaT0wLHN6PW1fRGF0YS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQkJCWRlbGV0ZSBtX0RhdGEuR2V0QXQoaSk7Ci0JCW1fRGF0YS5SZW1vdmVBbGwoKTsKLQl9Ci0KLQl2b2lkIEFkZChjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nKQotCXsKLQkJbV9EYXRhLkFkZChuZXcgQ0ZYX1dpZGVTdHJpbmcoc3RyaW5nKSk7Ci0JfQotCi0JaW50IEdldFNpemUoKSBjb25zdAotCXsKLQkJcmV0dXJuIG1fRGF0YS5HZXRTaXplKCk7Ci0JfQotCi0JQ0ZYX1dpZGVTdHJpbmcgR2V0QXQoaW50IGkpIGNvbnN0Ci0JewotCQlyZXR1cm4gKm1fRGF0YS5HZXRBdChpKTsKLQl9Ci0KLXByaXZhdGU6Ci0JQ0ZYX0FycmF5VGVtcGxhdGU8Q0ZYX1dpZGVTdHJpbmcqPgltX0RhdGE7Ci19OwotCi1zdHJ1Y3QgQ0pTX0RlbGF5RGF0YQotewotCUNGWF9XaWRlU3RyaW5nCQkJc0ZpZWxkTmFtZTsKLQlpbnQJCQkJCQluQ29udHJvbEluZGV4OwotCWVudW0gRklFTERfUFJPUAkJCWVQcm9wOwotCUZYX0lOVDMyCQkJCW51bTsKLQlib29sCQkJCQliOwotCUNGWF9CeXRlU3RyaW5nCQkJc3RyaW5nOwotCUNGWF9XaWRlU3RyaW5nCQkJd2lkZXN0cmluZzsKLQlDUERGX1JlY3QJCQkJcmVjdDsKLQlDUFdMX0NvbG9yCQkJCWNvbG9yOwotCUNGWF9EV29yZEFycmF5CQkJd29yZGFycmF5OwotCUNKU19XaWRlU3RyaW5nQXJyYXkJCXdpZGVzdHJpbmdhcnJheTsKLX07Ci0KLWNsYXNzIEZpZWxkIDogcHVibGljIENKU19FbWJlZE9iagotewotcHVibGljOgotCUZpZWxkKENKU19PYmplY3QqIHBKU09iamVjdCk7CQotCXZpcnR1YWwgfkZpZWxkKHZvaWQpOwotCi0gICAgRlhfQk9PTCBhbGlnbm1lbnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgICBGWF9CT09MIGJvcmRlclN0eWxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBidXR0b25BbGlnblgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGJ1dHRvbkFsaWduWShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgYnV0dG9uRml0Qm91bmRzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBidXR0b25Qb3NpdGlvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgYnV0dG9uU2NhbGVIb3coSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgICBGWF9CT09MIGJ1dHRvblNjYWxlV2hlbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgY2FsY09yZGVySW5kZXgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGNoYXJMaW1pdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgY29tYihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgY29tbWl0T25TZWxDaGFuZ2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGN1cnJlbnRWYWx1ZUluZGljZXMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgICBGWF9CT09MIGRlZmF1bHRTdHlsZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZGVmYXVsdFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBkb05vdFNjcm9sbChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZG9Ob3RTcGVsbENoZWNrKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBkZWxheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZGlzcGxheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICAgIEZYX0JPT0wgZG9jKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBlZGl0YWJsZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZXhwb3J0VmFsdWVzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBmaWxlU2VsZWN0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBmaWxsQ29sb3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGhpZGRlbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICAgIEZYX0JPT0wgaGlnaGxpZ2h0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBsaW5lV2lkdGgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIG11bHRpbGluZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgbXVsdGlwbGVTZWxlY3Rpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIG5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIG51bUl0ZW1zKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gICAgRlhfQk9PTCBwYWdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBwYXNzd29yZChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgcHJpbnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHJhZGlvc0luVW5pc29uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCByZWFkb25seShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgcmVjdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICAgIEZYX0JPT0wgcmVxdWlyZWQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHJpY2hUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCByaWNoVmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHJvdGF0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzdHJva2VDb2xvcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc3R5bGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHN1Ym1pdE5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHRleHRDb2xvcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgdGV4dEZvbnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHRleHRTaXplKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCB0eXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCB1c2VyTmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgdmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHZhbHVlQXNTdHJpbmcoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHNvdXJjZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCi0JRlhfQk9PTCBicm93c2VGb3JGaWxlVG9TdWJtaXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBidXR0b25HZXRDYXB0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgYnV0dG9uR2V0SWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGJ1dHRvbkltcG9ydEljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBidXR0b25TZXRDYXB0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgYnV0dG9uU2V0SWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGNoZWNrVGhpc0JveChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGNsZWFySXRlbXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBkZWZhdWx0SXNDaGVja2VkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZGVsZXRlSXRlbUF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZ2V0QXJyYXkoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBnZXRJdGVtQXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBnZXRMb2NrKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgaW5zZXJ0SXRlbUF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgaXNCb3hDaGVja2VkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgaXNEZWZhdWx0Q2hlY2tlZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHNldEFjdGlvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHNldEZvY3VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc2V0SXRlbXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzZXRMb2NrKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc2lnbmF0dXJlR2V0TW9kaWZpY2F0aW9ucyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHNpZ25hdHVyZUdldFNlZWRWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHNpZ25hdHVyZUluZm8oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzaWduYXR1cmVTZXRTZWVkVmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzaWduYXR1cmVTaWduKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc2lnbmF0dXJlVmFsaWRhdGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0KLXB1YmxpYzoKLQlzdGF0aWMgdm9pZCBTZXRBbGlnbm1lbnQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKTsKLSAgICBzdGF0aWMgdm9pZCBTZXRCb3JkZXJTdHlsZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpOwotCXN0YXRpYyB2b2lkIFNldEJ1dHRvbkFsaWduWChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpOwotCXN0YXRpYyB2b2lkIFNldEJ1dHRvbkFsaWduWShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpOwotCXN0YXRpYyB2b2lkIFNldEJ1dHRvbkZpdEJvdW5kcyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGJvb2wgYik7Ci0Jc3RhdGljIHZvaWQgU2V0QnV0dG9uUG9zaXRpb24oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKTsKLQlzdGF0aWMgdm9pZCBTZXRCdXR0b25TY2FsZUhvdyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpOwotICAgIHN0YXRpYyB2b2lkIFNldEJ1dHRvblNjYWxlV2hlbihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpOwotCXN0YXRpYyB2b2lkIFNldENhbGNPcmRlckluZGV4KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgaW50IG51bWJlcik7Ci0Jc3RhdGljIHZvaWQgU2V0Q2hhckxpbWl0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgaW50IG51bWJlcik7Ci0Jc3RhdGljIHZvaWQgU2V0Q29tYihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGJvb2wgYik7Ci0Jc3RhdGljIHZvaWQgU2V0Q29tbWl0T25TZWxDaGFuZ2UoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBib29sIGIpOwotCXN0YXRpYyB2b2lkIFNldEN1cnJlbnRWYWx1ZUluZGljZXMoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBjb25zdCBDRlhfRFdvcmRBcnJheSYgYXJyYXkpOwotICAgIHN0YXRpYyB2b2lkIFNldERlZmF1bHRTdHlsZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgpOwotCXN0YXRpYyB2b2lkIFNldERlZmF1bHRWYWx1ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcpOwotCXN0YXRpYyB2b2lkIFNldERvTm90U2Nyb2xsKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgYm9vbCBiKTsKLQlzdGF0aWMgdm9pZCBTZXREaXNwbGF5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgaW50IG51bWJlcik7Ci0Jc3RhdGljIHZvaWQgU2V0RmlsbENvbG9yKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOwotCXN0YXRpYyB2b2lkIFNldEhpZGRlbihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGJvb2wgYik7Ci0gICAgc3RhdGljIHZvaWQgU2V0SGlnaGxpZ2h0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZyk7Ci0Jc3RhdGljIHZvaWQgU2V0TGluZVdpZHRoKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgaW50IG51bWJlcik7Ci0Jc3RhdGljIHZvaWQgU2V0TXVsdGlsaW5lKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgYm9vbCBiKTsKLQlzdGF0aWMgdm9pZCBTZXRNdWx0aXBsZVNlbGVjdGlvbihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGJvb2wgYik7Ci0Jc3RhdGljIHZvaWQgU2V0UGFzc3dvcmQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBib29sIGIpOwotCXN0YXRpYyB2b2lkIFNldFJlY3QoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBjb25zdCBDUERGX1JlY3QmIHJlY3QpOwotCXN0YXRpYyB2b2lkIFNldFJpY2hUZXh0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgYm9vbCBiKTsKLQlzdGF0aWMgdm9pZCBTZXRSaWNoVmFsdWUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4KTsKLQlzdGF0aWMgdm9pZCBTZXRSb3RhdGlvbihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpOwotCXN0YXRpYyB2b2lkIFNldFN0cm9rZUNvbG9yKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOwotCXN0YXRpYyB2b2lkIFNldFN0eWxlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZyk7Ci0Jc3RhdGljIHZvaWQgU2V0VGV4dENvbG9yKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOwotCXN0YXRpYyB2b2lkIFNldFRleHRGb250KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZyk7Ci0Jc3RhdGljIHZvaWQgU2V0VGV4dFNpemUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKTsKLQlzdGF0aWMgdm9pZCBTZXRVc2VyTmFtZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcpOwotCXN0YXRpYyB2b2lkIFNldFZhbHVlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgY29uc3QgQ0pTX1dpZGVTdHJpbmdBcnJheSYgc3RyQXJyYXkpOwotCi1wdWJsaWM6Ci0Jc3RhdGljIHZvaWQJCQkJCQkJQWRkRmllbGQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBpbnQgblBhZ2VJbmRleCwgaW50IG5GaWVsZFR5cGUsIAotCQkJCQkJCQkJCQljb25zdCBDRlhfV2lkZVN0cmluZyYgc05hbWUsIGNvbnN0IENQREZfUmVjdCYgcmNDb29yZHMpOwotcHVibGljOgotCXN0YXRpYyB2b2lkCQkJCQkJCVVwZGF0ZUZvcm1GaWVsZChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCAKLQkJCQkJCQkJCQkJRlhfQk9PTCBiQ2hhbmdlTWFyaywgRlhfQk9PTCBiUmVzZXRBUCwgRlhfQk9PTCBiUmVmcmVzaCk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJVXBkYXRlRm9ybUNvbnRyb2woQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wsIAotCQkJCQkJCQkJCQlGWF9CT09MIGJDaGFuZ2VNYXJrLCBGWF9CT09MIGJSZXNldEFQLCBGWF9CT09MIGJSZWZyZXNoKTsKLQotCXN0YXRpYyBDUERGU0RLX1dpZGdldCoJCQkJCUdldFdpZGdldChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJR2V0Rm9ybUZpZWxkcyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSwgQ0ZYX1B0ckFycmF5JiBGaWVsZHNBcnJheSk7Ci0KLQlzdGF0aWMgdm9pZAkJCQkJCQlEb0RlbGF5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0pTX0RlbGF5RGF0YSogcERhdGEpOwotCi1wdWJsaWM6Ci0JRlhfQk9PTAkJCQkJCQkJQXR0YWNoRmllbGQoRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lKTsKLQl2b2lkCQkJCQkJCQlTZXREZWxheShGWF9CT09MIGJEZWxheSk7Ci0Jdm9pZAkJCQkJCQkJU2V0SXNvbGF0ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSkge21faXNvbGF0ZSA9IGlzb2xhdGU7fQotcHJvdGVjdGVkOgotCXZvaWQJCQkJCQkJCVBhcnNlRmllbGROYW1lKGNvbnN0IHN0ZDo6d3N0cmluZyAmc3RyRmllbGROYW1lUGFyc2VkLHN0ZDo6d3N0cmluZyAmc3RyRmllbGROYW1lLGludCAmIGlDb250cm9sTm8pOwotCXZvaWQJCQkJCQkJCUdldEZvcm1GaWVsZHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lLCBDRlhfUHRyQXJyYXkmIEZpZWxkc0FycmF5KTsKLQlDUERGX0Zvcm1Db250cm9sKiAJCQkJCUdldFNtYXJ0RmllbGRDb250cm9sKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkKTsKLQlGWF9CT09MCQkJCQkJCQlWYWx1ZUlzT2NjdXIoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENGWF9XaWRlU3RyaW5nIGNzT3B0TGFiZWwpOwotCi0Jdm9pZAkJCQkJCQkJQWRkRGVsYXlfSW50KGVudW0gRklFTERfUFJPUCBwcm9wLCBGWF9JTlQzMiBuKTsKLQl2b2lkCQkJCQkJCQlBZGREZWxheV9Cb29sKGVudW0gRklFTERfUFJPUCBwcm9wLGJvb2wgYik7Ci0Jdm9pZAkJCQkJCQkJQWRkRGVsYXlfU3RyaW5nKGVudW0gRklFTERfUFJPUCBwcm9wLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKTsKLQl2b2lkCQkJCQkJCQlBZGREZWxheV9XaWRlU3RyaW5nKGVudW0gRklFTERfUFJPUCBwcm9wLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nKTsKLQl2b2lkCQkJCQkJCQlBZGREZWxheV9SZWN0KGVudW0gRklFTERfUFJPUCBwcm9wLCBjb25zdCBDUERGX1JlY3QmIHJlY3QpOwotCXZvaWQJCQkJCQkJCUFkZERlbGF5X0NvbG9yKGVudW0gRklFTERfUFJPUCBwcm9wLCBjb25zdCBDUFdMX0NvbG9yJiBjb2xvcik7Ci0Jdm9pZAkJCQkJCQkJQWRkRGVsYXlfV29yZEFycmF5KGVudW0gRklFTERfUFJPUCBwcm9wLCBjb25zdCBDRlhfRFdvcmRBcnJheSYgYXJyYXkpOwotCXZvaWQJCQkJCQkJCUFkZERlbGF5X1dpZGVTdHJpbmdBcnJheShlbnVtIEZJRUxEX1BST1AgcHJvcCwgY29uc3QgQ0pTX1dpZGVTdHJpbmdBcnJheSYgYXJyYXkpOwotCi0Jdm9pZAkJCQkJCQkJRG9EZWxheSgpOwotcHVibGljOgotCURvY3VtZW50KgkJCQkJCQltX3BKU0RvYzsKLQlDUERGU0RLX0RvY3VtZW50KgkJCQkJbV9wRG9jdW1lbnQ7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJCQltX0ZpZWxkTmFtZTsKLQlpbnQJCQkJCQkJCQltX25Gb3JtQ29udHJvbEluZGV4OwotCUZYX0JPT0wJCQkJCQkJCW1fYkNhblNldDsKLQotCUZYX0JPT0wJCQkJCQkJCW1fYkRlbGF5OwotCXY4OjpJc29sYXRlKgkJCQkJCQltX2lzb2xhdGU7Ci19OwotCi1jbGFzcyBDSlNfRmllbGQgOiBwdWJsaWMgQ0pTX09iamVjdAotewotcHVibGljOgotCUNKU19GaWVsZChKU0ZYT2JqZWN0IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fTsKLQl2aXJ0dWFsIH5DSlNfRmllbGQodm9pZCl7fTsKLQotCXZpcnR1YWwgRlhfQk9PTAlJbml0SW5zdGFuY2UoSUZYSlNfQ29udGV4dCogY2MpOwotCi0JREVDTEFSRV9KU19DTEFTUyhDSlNfRmllbGQpOwotCi0gICAgSlNfU1RBVElDX1BST1AoYWxpZ25tZW50LCBGaWVsZCk7Ci0gICAgSlNfU1RBVElDX1BST1AoYm9yZGVyU3R5bGUsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChidXR0b25BbGlnblgsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChidXR0b25BbGlnblksIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChidXR0b25GaXRCb3VuZHMsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChidXR0b25Qb3NpdGlvbiwgRmllbGQpOwotCUpTX1NUQVRJQ19QUk9QKGJ1dHRvblNjYWxlSG93LCBGaWVsZCk7Ci0gICAgSlNfU1RBVElDX1BST1AoYnV0dG9uU2NhbGVXaGVuLCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AoY2FsY09yZGVySW5kZXgsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChjaGFyTGltaXQsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChjb21iLCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AoY29tbWl0T25TZWxDaGFuZ2UsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChjdXJyZW50VmFsdWVJbmRpY2VzLCBGaWVsZCk7Ci0gICAgSlNfU1RBVElDX1BST1AoZGVmYXVsdFN0eWxlLCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AoZGVmYXVsdFZhbHVlLCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AoZG9Ob3RTY3JvbGwsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChkb05vdFNwZWxsQ2hlY2ssIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChkZWxheSwgRmllbGQpOwotCUpTX1NUQVRJQ19QUk9QKGRpc3BsYXksIEZpZWxkKTsKLSAgICBKU19TVEFUSUNfUFJPUChkb2MsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChlZGl0YWJsZSwgRmllbGQpOwotCUpTX1NUQVRJQ19QUk9QKGV4cG9ydFZhbHVlcywgRmllbGQpOwotCUpTX1NUQVRJQ19QUk9QKGZpbGVTZWxlY3QsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChmaWxsQ29sb3IsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChoaWRkZW4sIEZpZWxkKTsKLSAgICBKU19TVEFUSUNfUFJPUChoaWdobGlnaHQsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChsaW5lV2lkdGgsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChtdWx0aWxpbmUsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChtdWx0aXBsZVNlbGVjdGlvbiwgRmllbGQpOwotCUpTX1NUQVRJQ19QUk9QKG5hbWUsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChudW1JdGVtcywgRmllbGQpOwotICAgIEpTX1NUQVRJQ19QUk9QKHBhZ2UsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChwYXNzd29yZCwgRmllbGQpOwotCUpTX1NUQVRJQ19QUk9QKHByaW50LCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AocmFkaW9zSW5Vbmlzb24sIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChyZWFkb25seSwgRmllbGQpOwotCUpTX1NUQVRJQ19QUk9QKHJlY3QsIEZpZWxkKTsKLSAgICBKU19TVEFUSUNfUFJPUChyZXF1aXJlZCwgRmllbGQpOwotCUpTX1NUQVRJQ19QUk9QKHJpY2hUZXh0LCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AocmljaFZhbHVlLCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1Aocm90YXRpb24sIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChzdHJva2VDb2xvciwgRmllbGQpOwotCUpTX1NUQVRJQ19QUk9QKHN0eWxlLCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1Aoc3VibWl0TmFtZSwgRmllbGQpOwotCUpTX1NUQVRJQ19QUk9QKHRleHRDb2xvciwgRmllbGQpOwotCUpTX1NUQVRJQ19QUk9QKHRleHRGb250LCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AodGV4dFNpemUsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUCh0eXBlLCBGaWVsZCk7Ci0JSlNfU1RBVElDX1BST1AodXNlck5hbWUsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUCh2YWx1ZSwgRmllbGQpOwotCUpTX1NUQVRJQ19QUk9QKHZhbHVlQXNTdHJpbmcsIEZpZWxkKTsKLQlKU19TVEFUSUNfUFJPUChzb3VyY2UsIEZpZWxkKTsKLQotCUpTX1NUQVRJQ19NRVRIT0QoYnJvd3NlRm9yRmlsZVRvU3VibWl0LCBGaWVsZCk7Ci0JSlNfU1RBVElDX01FVEhPRChidXR0b25HZXRDYXB0aW9uLCBGaWVsZCk7Ci0JSlNfU1RBVElDX01FVEhPRChidXR0b25HZXRJY29uLCBGaWVsZCk7Ci0JSlNfU1RBVElDX01FVEhPRChidXR0b25JbXBvcnRJY29uLCBGaWVsZCk7Ci0JSlNfU1RBVElDX01FVEhPRChidXR0b25TZXRDYXB0aW9uLCBGaWVsZCk7Ci0JSlNfU1RBVElDX01FVEhPRChidXR0b25TZXRJY29uLCBGaWVsZCk7Ci0JSlNfU1RBVElDX01FVEhPRChjaGVja1RoaXNCb3gsIEZpZWxkKTsKLQlKU19TVEFUSUNfTUVUSE9EKGNsZWFySXRlbXMsIEZpZWxkKTsKLSAJSlNfU1RBVElDX01FVEhPRChkZWZhdWx0SXNDaGVja2VkLCBGaWVsZCk7Ci0JSlNfU1RBVElDX01FVEhPRChkZWxldGVJdGVtQXQsIEZpZWxkKTsKLQlKU19TVEFUSUNfTUVUSE9EKGdldEFycmF5LCBGaWVsZCk7Ci0JSlNfU1RBVElDX01FVEhPRChnZXRJdGVtQXQsIEZpZWxkKTsKLQlKU19TVEFUSUNfTUVUSE9EKGdldExvY2ssIEZpZWxkKTsKLQlKU19TVEFUSUNfTUVUSE9EKGluc2VydEl0ZW1BdCwgRmllbGQpOwotCUpTX1NUQVRJQ19NRVRIT0QoaXNCb3hDaGVja2VkLCBGaWVsZCk7Ci0JSlNfU1RBVElDX01FVEhPRChpc0RlZmF1bHRDaGVja2VkLCBGaWVsZCk7Ci0JSlNfU1RBVElDX01FVEhPRChzZXRBY3Rpb24sIEZpZWxkKTsKLQlKU19TVEFUSUNfTUVUSE9EKHNldEZvY3VzLCBGaWVsZCk7Ci0JSlNfU1RBVElDX01FVEhPRChzZXRJdGVtcywgRmllbGQpOwotCUpTX1NUQVRJQ19NRVRIT0Qoc2V0TG9jaywgRmllbGQpOwotCUpTX1NUQVRJQ19NRVRIT0Qoc2lnbmF0dXJlR2V0TW9kaWZpY2F0aW9ucywgRmllbGQpOwotCUpTX1NUQVRJQ19NRVRIT0Qoc2lnbmF0dXJlR2V0U2VlZFZhbHVlLCBGaWVsZCk7Ci0JSlNfU1RBVElDX01FVEhPRChzaWduYXR1cmVJbmZvLCBGaWVsZCk7Ci0JSlNfU1RBVElDX01FVEhPRChzaWduYXR1cmVTZXRTZWVkVmFsdWUsIEZpZWxkKTsKLQlKU19TVEFUSUNfTUVUSE9EKHNpZ25hdHVyZVNpZ24sIEZpZWxkKTsKLQlKU19TVEFUSUNfTUVUSE9EKHNpZ25hdHVyZVZhbGlkYXRlLCBGaWVsZCk7Ci19OwotCi0jZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0ZJRUxEX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaAppbmRleCAwOTAwMTA5Li42YjE1NDY3IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgKQEAgLTEsMTEyICsxLDE2NiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0lKQVZBU0NSSVBUX0hfCiAjZGVmaW5lIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0lKQVZBU0NSSVBUX0hfCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgogCi1jbGFzcyBDUERGX0Jvb2ttYXJrOwotY2xhc3MgQ1BERl9Gb3JtRmllbGQ7Ci1jbGFzcyBDUERGU0RLX0Fubm90OwotY2xhc3MgQ1BERlNES19Eb2N1bWVudDsKLQotY2xhc3MgSUZYSlNfQ29udGV4dAotewotcHVibGljOgotICAgICAgICB2aXJ0dWFsIH5JRlhKU19Db250ZXh0KCkgeyB9Ci0JdmlydHVhbCBGWF9CT09MCQkJCUNvbXBpbGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwgQ0ZYX1dpZGVTdHJpbmcmIGluZm8pID0gMDsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJUnVuU2NyaXB0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKSA9IDA7Ci0KLQl2aXJ0dWFsIHZvaWQJCQkJT25BcHBfSW5pdCgpID0gMDsKLQotCXZpcnR1YWwgdm9pZAkJCQlPbkRvY19PcGVuKENQREZTREtfRG9jdW1lbnQqIHBEb2MsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJUYXJnZXROYW1lKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRG9jX1dpbGxQcmludChDUERGU0RLX0RvY3VtZW50KiBwRG9jKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRG9jX0RpZFByaW50KENQREZTREtfRG9jdW1lbnQqIHBEb2MpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25Eb2NfV2lsbFNhdmUoQ1BERlNES19Eb2N1bWVudCogcERvYykgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQlPbkRvY19EaWRTYXZlKENQREZTREtfRG9jdW1lbnQqIHBEb2MpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25Eb2NfV2lsbENsb3NlKENQREZTREtfRG9jdW1lbnQqIHBEb2MpID0gMDsKLQotCXZpcnR1YWwgdm9pZAkJCQlPblBhZ2VfT3BlbihDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uUGFnZV9DbG9zZShDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uUGFnZV9JblZpZXcoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQlPblBhZ2VfT3V0VmlldyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KSA9IDA7Ci0KLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VVcChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfQmx1cihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpID0gMDsKLQotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX0NhbGN1bGF0ZShDUERGX0Zvcm1GaWVsZCogcFNvdXJjZSwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCYgYlJjKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfRm9ybWF0KGludCBuQ29tbWl0S2V5LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MIGJXaWxsQ29tbWl0KSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfS2V5c3Ryb2tlKGludCBuQ29tbWl0S2V5LCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCi0JCQkJCQkJCQlGWF9CT09MIEtleURvd24sIEZYX0JPT0wgYk1vZGlmaWVyLCBpbnQgJm5TZWxFbmQsaW50ICZuU2VsU3RhcnQsIEZYX0JPT0wgYlNoaWZ0LAotCQkJCQkJCQkJQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCBiV2lsbENvbW1pdCwgCi0JCQkJCQkJCQlGWF9CT09MIGJGaWVsZEZ1bGwsIEZYX0JPT0wgJmJSYykgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX1ZhbGlkYXRlKENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwgRlhfQk9PTCBiS2V5RG93biwKLQkJCQkJCQkJCUZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCYgYlJjKSA9IDA7Ci0KLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX0JsdXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX09wZW4oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX0Nsb3NlKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX01vdXNlVXAoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fSW5WaWV3KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9PdXRWaWV3KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOwotCi0JdmlydHVhbCB2b2lkCQkJCU9uQm9va21hcmtfTW91c2VVcChDUERGX0Jvb2ttYXJrKiBwQm9va01hcmspID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25MaW5rX01vdXNlVXAoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCkgPSAwOwotCi0JdmlydHVhbCB2b2lkCQkJCU9uTWVudV9FeGVjKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nICYpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25CYXRjaEV4ZWMoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQlPbkNvbnNvbGVfRXhlYygpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25FeHRlcm5hbF9FeGVjKCkgPSAwOwotCi0JdmlydHVhbCB2b2lkCQkJCUVuYWJsZU1lc3NhZ2VCb3goRlhfQk9PTCBiRW5hYmxlKSA9IDA7Ci19OwotCi1jbGFzcyBJRlhKU19SdW50aW1lCi17Ci1wdWJsaWM6Ci0JdmlydHVhbCBJRlhKU19Db250ZXh0KgkJTmV3Q29udGV4dCgpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJUmVsZWFzZUNvbnRleHQoSUZYSlNfQ29udGV4dCAqIHBDb250ZXh0KSA9IDA7Ci0JdmlydHVhbCBJRlhKU19Db250ZXh0KgkJR2V0Q3VycmVudENvbnRleHQoKSA9IDA7Ci0KLQl2aXJ0dWFsIHZvaWQJCQkJU2V0UmVhZGVyRG9jdW1lbnQoQ1BERlNES19Eb2N1bWVudCogcFJlYWRlckRvYykgPSAwOwotCXZpcnR1YWwJQ1BERlNES19Eb2N1bWVudCoJR2V0UmVhZGVyRG9jdW1lbnQoKSA9IDA7Ci0KLXByb3RlY3RlZDoKLSAgICAgICAgIH5JRlhKU19SdW50aW1lKCkgeyB9Ci19OworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZnhqc2UvZnhqc2UuaCIKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAogY2xhc3MgQ1BERkRvY19FbnZpcm9ubWVudDsKLWNsYXNzIENKU19HbG9iYWxEYXRhOworY2xhc3MgQ1BERlNES19Bbm5vdDsKK2NsYXNzIENQREZTREtfRG9jdW1lbnQ7CitjbGFzcyBDUERGX0Jvb2ttYXJrOworY2xhc3MgQ1BERl9Gb3JtRmllbGQ7CiAKLWNsYXNzIENKU19SdW50aW1lRmFjdG9yeQotewotcHVibGljOgotCUNKU19SdW50aW1lRmFjdG9yeSgpOm1fYkluaXQoRkFMU0UpLG1fblJlZigwKSxtX3BHbG9iYWxEYXRhKE5VTEwpLG1fbkdsb2JhbERhdGFDb3VudCgwKSB7fQotCX5DSlNfUnVudGltZUZhY3RvcnkoKTsKLQlJRlhKU19SdW50aW1lKgkJCQkJTmV3SlNSdW50aW1lKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApOwotCXZvaWQJCQkJCQkJRGVsZXRlSlNSdW50aW1lKElGWEpTX1J1bnRpbWUqIHBSdW50aW1lKTsKLQl2b2lkCQkJCQkJCUFkZFJlZigpOwotCXZvaWQJCQkJCQkJUmVsZWFzZSgpOworLy8gUmVjb3JkcyB0aGUgZGV0YWlscyBvZiBhbiBldmVudCBhbmQgdHJpZ2dlcnMgSlMgZXhlY3V0aW9uIGZvciBpdC4KK2NsYXNzIElKU19Db250ZXh0IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgRlhfQk9PTCBSdW5TY3JpcHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyogaW5mbykgPSAwOwogCi0JQ0pTX0dsb2JhbERhdGEqCQkJCQlOZXdHbG9iYWxEYXRhKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApOwotCXZvaWQJCQkJCQkJUmVsZWFzZUdsb2JhbERhdGEoKTsKLXByaXZhdGU6Ci0JRlhfQk9PTCBtX2JJbml0OwotCWludCBtX25SZWY7Ci0JQ0pTX0dsb2JhbERhdGEqCQkJCQltX3BHbG9iYWxEYXRhOwotCUZYX0lOVDMyCQkJCQkJbV9uR2xvYmFsRGF0YUNvdW50OworICB2aXJ0dWFsIHZvaWQgT25BcHBfSW5pdCgpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgT25Eb2NfT3BlbihDUERGU0RLX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyVGFyZ2V0TmFtZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25Eb2NfV2lsbFByaW50KENQREZTREtfRG9jdW1lbnQqIHBEb2MpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uRG9jX0RpZFByaW50KENQREZTREtfRG9jdW1lbnQqIHBEb2MpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uRG9jX1dpbGxTYXZlKENQREZTREtfRG9jdW1lbnQqIHBEb2MpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uRG9jX0RpZFNhdmUoQ1BERlNES19Eb2N1bWVudCogcERvYykgPSAwOworICB2aXJ0dWFsIHZvaWQgT25Eb2NfV2lsbENsb3NlKENQREZTREtfRG9jdW1lbnQqIHBEb2MpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgT25QYWdlX09wZW4oQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25QYWdlX0Nsb3NlKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uUGFnZV9JblZpZXcoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25QYWdlX091dFZpZXcoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCkgPSAwOworCisgIHZpcnR1YWwgdm9pZCBPbkZpZWxkX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uRmllbGRfTW91c2VFbnRlcihGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25GaWVsZF9Nb3VzZUV4aXQoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPbkZpZWxkX01vdXNlVXAoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uRmllbGRfRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPbkZpZWxkX0JsdXIoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIE9uRmllbGRfQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUmMpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uRmllbGRfRm9ybWF0KENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiV2lsbENvbW1pdCkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25GaWVsZF9LZXlzdHJva2UoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgS2V5RG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBuU2VsRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBuU2VsU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiV2lsbENvbW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpZWxkRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSYykgPSAwOworICB2aXJ0dWFsIHZvaWQgT25GaWVsZF9WYWxpZGF0ZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYktleURvd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlJjKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIE9uU2NyZWVuX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPblNjcmVlbl9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOworICB2aXJ0dWFsIHZvaWQgT25TY3JlZW5fT3BlbihGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uU2NyZWVuX0Nsb3NlKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPblNjcmVlbl9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOworICB2aXJ0dWFsIHZvaWQgT25TY3JlZW5fTW91c2VVcChGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uU2NyZWVuX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPblNjcmVlbl9Nb3VzZUV4aXQoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOworICB2aXJ0dWFsIHZvaWQgT25TY3JlZW5fSW5WaWV3KEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uU2NyZWVuX091dFZpZXcoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIE9uQm9va21hcmtfTW91c2VVcChDUERGX0Jvb2ttYXJrKiBwQm9va01hcmspID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uTGlua19Nb3VzZVVwKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgT25NZW51X0V4ZWMoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJikgPSAwOworICB2aXJ0dWFsIHZvaWQgT25CYXRjaEV4ZWMoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25Db25zb2xlX0V4ZWMoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPbkV4dGVybmFsX0V4ZWMoKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIEVuYWJsZU1lc3NhZ2VCb3goRlhfQk9PTCBiRW5hYmxlKSA9IDA7CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgfklKU19Db250ZXh0KCkge30KK307CisKKy8vIE93bnMgdGhlIEZKWFMgb2JqZWN0cyBuZWVkZWQgdG8gYWN0dWFsbHkgZXhlY3V0ZSBKUy4KK2NsYXNzIElKU19SdW50aW1lIHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUodW5zaWduZWQgaW50IHNsb3QsIHZvaWQqIGlzb2xhdGUpOworICBzdGF0aWMgSUpTX1J1bnRpbWUqIENyZWF0ZShDUERGRG9jX0Vudmlyb25tZW50KiBwRW52KTsKKyAgdmlydHVhbCB+SUpTX1J1bnRpbWUoKSB7fQorCisgIHZpcnR1YWwgSUpTX0NvbnRleHQqIE5ld0NvbnRleHQoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlQ29udGV4dChJSlNfQ29udGV4dCogcENvbnRleHQpID0gMDsKKyAgdmlydHVhbCBJSlNfQ29udGV4dCogR2V0Q3VycmVudENvbnRleHQoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRSZWFkZXJEb2N1bWVudChDUERGU0RLX0RvY3VtZW50KiBwUmVhZGVyRG9jKSA9IDA7CisgIHZpcnR1YWwgQ1BERlNES19Eb2N1bWVudCogR2V0UmVhZGVyRG9jdW1lbnQoKSA9IDA7CisgIHZpcnR1YWwgaW50IEV4ZWN1dGUoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHNjcmlwdCwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyogaW5mbykgPSAwOworCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgdmlydHVhbCBGWF9CT09MIEdldEhWYWx1ZUJ5TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHV0ZjhOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpID0gMDsKKyAgdmlydHVhbCBGWF9CT09MIFNldEhWYWx1ZUJ5TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHV0ZjhOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpID0gMDsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworIHByb3RlY3RlZDoKKyAgSUpTX1J1bnRpbWUoKSB7fQogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfSkFWQVNDUklQVF9JSkFWQVNDUklQVF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSWNvbi5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSWNvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGEzYmI4Li4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0ljb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfSUNPTl9IXwotI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfSkFWQVNDUklQVF9JQ09OX0hfCi0KLSNpbmNsdWRlICJKU19EZWZpbmUuaCIKLQotY2xhc3MgSWNvbiA6IHB1YmxpYyBDSlNfRW1iZWRPYmoKLXsKLXB1YmxpYzoKLQlJY29uKENKU19PYmplY3QqIHBKU09iamVjdCk7Ci0JdmlydHVhbCB+SWNvbigpOwotCUZYX0JPT0wgbmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXZvaWQJCQkJU2V0U3RyZWFtKENQREZfU3RyZWFtKiBwSWNvblN0cmVhbSk7Ci0JQ1BERl9TdHJlYW0qCQlHZXRTdHJlYW0oKTsKLQl2b2lkCQkJCVNldEljb25OYW1lKENGWF9XaWRlU3RyaW5nIG5hbWUpOwotCUNGWF9XaWRlU3RyaW5nCQlHZXRJY29uTmFtZSgpOwotCi1wcml2YXRlOgotCUNQREZfU3RyZWFtKgkJbV9wSWNvblN0cmVhbTsKLQlDRlhfV2lkZVN0cmluZwkJbV9zd0ljb25OYW1lOwotfTsKLQotY2xhc3MgQ0pTX0ljb24gOiBwdWJsaWMgQ0pTX09iamVjdAotewotcHVibGljOgotCUNKU19JY29uKEpTRlhPYmplY3QgcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3Qpe307Ci0JdmlydHVhbCB+Q0pTX0ljb24oKXt9OwotCi1wdWJsaWM6Ci0JREVDTEFSRV9KU19DTEFTUyhDSlNfSWNvbik7Ci0KLQlKU19TVEFUSUNfUFJPUChuYW1lLCBJY29uKTsKLX07Ci0KLSNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfSUNPTl9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTFlM2ExLi4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0NvbnRleHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfSlNfQ09OVEVYVF9IXwotI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfSkFWQVNDUklQVF9KU19DT05URVhUX0hfCi0KLSNpbmNsdWRlICIuLi8uLi8uLi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgIklKYXZhU2NyaXB0LmgiCi0KLWNsYXNzIENKU19FdmVudEhhbmRsZXI7Ci1jbGFzcyBDSlNfUnVudGltZTsKLQotY2xhc3MgQ0pTX0NvbnRleHQgOiBwdWJsaWMgSUZYSlNfQ29udGV4dAotewotcHVibGljOgotCUNKU19Db250ZXh0KENKU19SdW50aW1lKiBwUnVudGltZSk7Ci0JdmlydHVhbCB+Q0pTX0NvbnRleHQoKTsKLQotcHVibGljOgotCXZpcnR1YWwgRlhfQk9PTAkJCQlDb21waWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJUnVuU2NyaXB0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKTsKLQotcHVibGljOgotCXZpcnR1YWwgdm9pZAkJCQlPbkFwcF9Jbml0KCk7Ci0KLQl2aXJ0dWFsIHZvaWQJCQkJT25Eb2NfT3BlbihDUERGU0RLX0RvY3VtZW50KiBwRG9jLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyVGFyZ2V0TmFtZSk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRG9jX1dpbGxQcmludChDUERGU0RLX0RvY3VtZW50KiBwRG9jKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25Eb2NfRGlkUHJpbnQoQ1BERlNES19Eb2N1bWVudCogcERvYyk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRG9jX1dpbGxTYXZlKENQREZTREtfRG9jdW1lbnQqIHBEb2MpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkRvY19EaWRTYXZlKENQREZTREtfRG9jdW1lbnQqIHBEb2MpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkRvY19XaWxsQ2xvc2UoQ1BERlNES19Eb2N1bWVudCogcERvYyk7Ci0KLQl2aXJ0dWFsIHZvaWQJCQkJT25QYWdlX09wZW4oQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uUGFnZV9DbG9zZShDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25QYWdlX0luVmlldyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25QYWdlX091dFZpZXcoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCk7Ci0JCi0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VEb3duKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQgKnBUYXJnZXQpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfTW91c2VFeGl0KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQgKnBUYXJnZXQpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkZpZWxkX01vdXNlVXAoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSk7Ci0KLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9DYWxjdWxhdGUoQ1BERl9Gb3JtRmllbGQqIHBTb3VyY2UsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wmIGJSYyk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfRm9ybWF0KGludCBuQ29tbWl0S2V5LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MIGJXaWxsQ29tbWl0KTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25GaWVsZF9LZXlzdHJva2UoaW50IG5Db21taXRLZXksIENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKLQkJCQkJCQkJCUZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgYk1vZGlmaWVyLCBpbnQgJm5TZWxFbmQsaW50ICZuU2VsU3RhcnQsIEZYX0JPT0wgYlNoaWZ0LAotCQkJCQkJCQkJQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCBiV2lsbENvbW1pdCwgCi0JCQkJCQkJCQlGWF9CT09MIGJGaWVsZEZ1bGwsIEZYX0JPT0wgJmJSYyk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uRmllbGRfVmFsaWRhdGUoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBGWF9CT09MIGJLZXlEb3duLAotCQkJCQkJCQkJRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MJiBiUmMpOwotCi0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX0JsdXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fT3BlbihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9DbG9zZShGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fTW91c2VVcChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9Nb3VzZUVudGVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0JdmlydHVhbCB2b2lkCQkJCU9uU2NyZWVuX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZpcnR1YWwgdm9pZAkJCQlPblNjcmVlbl9JblZpZXcoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2aXJ0dWFsIHZvaWQJCQkJT25TY3JlZW5fT3V0VmlldyhGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCi0JdmlydHVhbCB2b2lkCQkJCU9uQm9va21hcmtfTW91c2VVcChDUERGX0Jvb2ttYXJrKiBwQm9va01hcmspOwotCXZpcnR1YWwgdm9pZAkJCQlPbkxpbmtfTW91c2VVcChDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KTsKLQotCXZpcnR1YWwgdm9pZAkJCQlPbk1lbnVfRXhlYyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyVGFyZ2V0TmFtZSk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uQmF0Y2hFeGVjKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkNvbnNvbGVfRXhlYygpOwotCXZpcnR1YWwgdm9pZAkJCQlPbkV4dGVybmFsX0V4ZWMoKTsKLQotCXZpcnR1YWwgdm9pZAkJCQlFbmFibGVNZXNzYWdlQm94KEZYX0JPT0wgYkVuYWJsZSkge21fYk1zZ0JveEVuYWJsZSA9IGJFbmFibGU7fQotCUZYX0JPT0wJCQkJCQlJc01zZ0JveEVuYWJsZWQoKSBjb25zdCB7cmV0dXJuIG1fYk1zZ0JveEVuYWJsZTt9Ci0KLXB1YmxpYzoKLQlDUERGRG9jX0Vudmlyb25tZW50KgkJCUdldFJlYWRlckFwcCgpOwotCUNKU19SdW50aW1lKgkJCQlHZXRKU1J1bnRpbWUoKXtyZXR1cm4gbV9wUnVudGltZTt9Ci0KLQlGWF9CT09MCQkJCQkJRG9Kb2IoaW50IG5Nb2RlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LCBDRlhfV2lkZVN0cmluZyYgaW5mbyk7Ci0KLQlDSlNfRXZlbnRIYW5kbGVyKgkJCUdldEV2ZW50SGFuZGxlcigpe3JldHVybiBtX3BFdmVudEhhbmRsZXI7fTsJCi0JQ1BERlNES19Eb2N1bWVudCoJCQlHZXRSZWFkZXJEb2N1bWVudCgpOwotCi1wcml2YXRlOgotCUNKU19SdW50aW1lKgkJCQltX3BSdW50aW1lOwkKLQlDSlNfRXZlbnRIYW5kbGVyKgkJCW1fcEV2ZW50SGFuZGxlcjsJCi0KLQlGWF9CT09MCQkJCQkJbV9iQnVzeTsJCi0JRlhfQk9PTAkJCQkJCW1fYk1zZ0JveEVuYWJsZTsKLX07Ci0KLSNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfSlNfQ09OVEVYVF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRGVmaW5lLmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19EZWZpbmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjNTBmMy4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19EZWZpbmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0pTX0RFRklORV9IXwotI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfSkFWQVNDUklQVF9KU19ERUZJTkVfSF8KLQotI2luY2x1ZGUgIi4uL2pzYXBpL2Z4anNfdjguaCIKLSNpbmNsdWRlICJyZXNvdXJjZS5oIgotI2luY2x1ZGUgIkpTX09iamVjdC5oIgotI2luY2x1ZGUgIkpTX1ZhbHVlLmgiCi0KLXN0cnVjdCBKU0NvbnN0U3BlYwotewotCWNvbnN0IHdjaGFyX3QqIHBOYW1lOwotCWRvdWJsZSBudW1iZXI7Ci0JY29uc3Qgd2NoYXJfdCogc3RyaW5nOwotCUZYX0JZVEUgdDsgLy8wOmRvdWJsZSAxOnN0cgotfTsKLQotc3RydWN0IEpTUHJvcGVydHlTcGVjCi17Ci0JY29uc3Qgd2NoYXJfdCogcE5hbWU7Ci0Jdjg6OkFjY2Vzc29yR2V0dGVyQ2FsbGJhY2sgcFByb3BHZXQ7Ci0Jdjg6OkFjY2Vzc29yU2V0dGVyQ2FsbGJhY2sgcFByb3BQdXQ7Ci19OwotCi1zdHJ1Y3QgSlNNZXRob2RTcGVjCi17Ci0JY29uc3Qgd2NoYXJfdCogcE5hbWU7Ci0Jdjg6OkZ1bmN0aW9uQ2FsbGJhY2sgcE1ldGhvZENhbGw7Ci19OwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBQVUJMSUMgREVGSU5FIFNQRUMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBKU19XSURFU1RSSU5HKHdpZGVzdHJpbmcpIEwjIyN3aWRlc3RyaW5nCi0KLSNkZWZpbmUgQkVHSU5fSlNfU1RBVElDX0NPTlNUKGpzX2NsYXNzX25hbWUpIEpTQ29uc3RTcGVjIGpzX2NsYXNzX25hbWU6OkpTX0NsYXNzX0NvbnN0c1tdID0gewotI2RlZmluZSBKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKGNvbnN0X25hbWUsIHBWYWx1ZSkge0pTX1dJREVTVFJJTkcoY29uc3RfbmFtZSksIHBWYWx1ZSwgTCIiLCAwfSwKLSNkZWZpbmUgSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhjb25zdF9uYW1lLCBwVmFsdWUpIHtKU19XSURFU1RSSU5HKGNvbnN0X25hbWUpLCAwLCBKU19XSURFU1RSSU5HKHBWYWx1ZSksIDF9LAotI2RlZmluZSBFTkRfSlNfU1RBVElDX0NPTlNUKCkgezAsIDAsIDAsIDB9fTsKLQotI2RlZmluZSBCRUdJTl9KU19TVEFUSUNfUFJPUChqc19jbGFzc19uYW1lKSBKU1Byb3BlcnR5U3BlYyBqc19jbGFzc19uYW1lOjpKU19DbGFzc19Qcm9wZXJ0aWVzW10gPSB7Ci0jZGVmaW5lIEpTX1NUQVRJQ19QUk9QX0VOVFJZKHByb3BfbmFtZSkge0pTX1dJREVTVFJJTkcocHJvcF9uYW1lKSwgZ2V0XyMjcHJvcF9uYW1lIyNfc3RhdGljLCBzZXRfIyNwcm9wX25hbWUjI19zdGF0aWN9LAotI2RlZmluZSBFTkRfSlNfU1RBVElDX1BST1AoKSB7MCwgMCwgMH19OwotCi0jZGVmaW5lIEJFR0lOX0pTX1NUQVRJQ19NRVRIT0QoanNfY2xhc3NfbmFtZSkgSlNNZXRob2RTcGVjIGpzX2NsYXNzX25hbWU6OkpTX0NsYXNzX01ldGhvZHNbXSA9IHsKLSNkZWZpbmUgSlNfU1RBVElDX01FVEhPRF9FTlRSWShtZXRob2RfbmFtZSkge0pTX1dJREVTVFJJTkcobWV0aG9kX25hbWUpLCBtZXRob2RfbmFtZSMjX3N0YXRpY30sCi0jZGVmaW5lIEVORF9KU19TVEFUSUNfTUVUSE9EKCkgezAsIDB9fTsKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBQUk9QIENBTExCQUNLID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLXRlbXBsYXRlIDxjbGFzcyBDLCBGWF9CT09MIChDOjoqTSkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKT4KLXZvaWQgSlNQcm9wR2V0dGVyKGNvbnN0IGNoYXIqIHByb3BfbmFtZV9zdHJpbmcsCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjbGFzc19uYW1lX3N0cmluZywKLSAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7Ci0gIHY4OjpJc29sYXRlKiBpc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7Ci0gIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IGlzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCk7Ci0gIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHYgPSBjb250ZXh0LT5HZXRFbWJlZGRlckRhdGEoMSk7Ci0gIHY4OjpMb2NhbDx2ODo6RXh0ZXJuYWw+IGZpZWxkID0gdjg6OkxvY2FsPHY4OjpFeHRlcm5hbD46OkNhc3Qodik7Ci0gIElGWEpTX1J1bnRpbWUqIHBSdW50aW1lID0gKElGWEpTX1J1bnRpbWUqKWZpZWxkLT5WYWx1ZSgpOwotICBJRlhKU19Db250ZXh0KiBwQ29udGV4dCA9IHBSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpOwotICBDSlNfT2JqZWN0KiBwSlNPYmogPSAoQ0pTX09iamVjdCopSlNfR2V0UHJpdmF0ZShpc29sYXRlLGluZm8uSG9sZGVyKCkpOwotICBDKiBwT2JqID0gcmVpbnRlcnByZXRfY2FzdDxDKj4ocEpTT2JqLT5HZXRFbWJlZE9iamVjdCgpKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgc0Vycm9yOwotICBDSlNfUHJvcFZhbHVlIHZhbHVlKGlzb2xhdGUpOwotICB2YWx1ZS5TdGFydEdldHRpbmcoKTsKLSAgaWYgKCEocE9iai0+Kk0pKHBDb250ZXh0LCB2YWx1ZSwgc0Vycm9yKSkgewotICAgIEpTX0Vycm9yKGlzb2xhdGUsIEpTRm9ybWF0RXJyb3JTdHJpbmcoY2xhc3NfbmFtZV9zdHJpbmcsIHByb3BfbmFtZV9zdHJpbmcsIHNFcnJvcikpOwotICAgIHJldHVybjsKLSAgfQotICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KCh2ODo6TG9jYWw8djg6OlZhbHVlPil2YWx1ZSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBDLCBGWF9CT09MIChDOjoqTSkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKT4KLXZvaWQgSlNQcm9wU2V0dGVyKGNvbnN0IGNoYXIqIHByb3BfbmFtZV9zdHJpbmcsCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjbGFzc19uYW1lX3N0cmluZywKLSAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlLAotICAgICAgICAgICAgICAgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHZvaWQ+JiBpbmZvKSB7Ci0gIHY4OjpJc29sYXRlKiBpc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7Ci0gIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IGlzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCk7Ci0gIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHYgPSBjb250ZXh0LT5HZXRFbWJlZGRlckRhdGEoMSk7Ci0gIHY4OjpMb2NhbDx2ODo6RXh0ZXJuYWw+IGZpZWxkID0gdjg6OkxvY2FsPHY4OjpFeHRlcm5hbD46OkNhc3Qodik7Ci0gIElGWEpTX1J1bnRpbWUqIHBSdW50aW1lID0gKElGWEpTX1J1bnRpbWUqKWZpZWxkLT5WYWx1ZSgpOwotICBJRlhKU19Db250ZXh0KiBwQ29udGV4dCA9IHBSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpOwotICBDSlNfT2JqZWN0KiBwSlNPYmogPSAoQ0pTX09iamVjdCopSlNfR2V0UHJpdmF0ZShpc29sYXRlLGluZm8uSG9sZGVyKCkpOwotICBDKiBwT2JqID0gcmVpbnRlcnByZXRfY2FzdDxDKj4ocEpTT2JqLT5HZXRFbWJlZE9iamVjdCgpKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgc0Vycm9yOwotICBDSlNfUHJvcFZhbHVlIHByb3BWYWx1ZShDSlNfVmFsdWUoaXNvbGF0ZSwgdmFsdWUsIFZUX3Vua25vd24pKTsKLSAgcHJvcFZhbHVlLlN0YXJ0U2V0dGluZygpOwotICBpZiAoIShwT2JqLT4qTSkocENvbnRleHQsIHByb3BWYWx1ZSwgc0Vycm9yKSkgewotICAgICAgSlNfRXJyb3IoaXNvbGF0ZSwgSlNGb3JtYXRFcnJvclN0cmluZyhjbGFzc19uYW1lX3N0cmluZywgcHJvcF9uYW1lX3N0cmluZywgc0Vycm9yKSk7Ci0gIH0KLX0KLQotI2RlZmluZSBKU19TVEFUSUNfUFJPUChwcm9wX25hbWUsIGNsYXNzX25hbWUpIFwKLSAgc3RhdGljIHZvaWQgZ2V0XyMjcHJvcF9uYW1lIyNfc3RhdGljKCBcCi0gICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksIFwKLSAgICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7IFwKLSAgICBKU1Byb3BHZXR0ZXI8Y2xhc3NfbmFtZSwgJmNsYXNzX25hbWU6OnByb3BfbmFtZT4oIFwKLSAgICAgICAgI3Byb3BfbmFtZSwgI2NsYXNzX25hbWUsIHByb3BlcnR5LCBpbmZvKTsgXAotICB9IFwKLSAgc3RhdGljIHZvaWQgc2V0XyMjcHJvcF9uYW1lIyNfc3RhdGljKCBcCi0gICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksIFwKLSAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlLCBcCi0gICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88dm9pZD4mIGluZm8pIHsgXAotICAgIEpTUHJvcFNldHRlcjxjbGFzc19uYW1lLCAmY2xhc3NfbmFtZTo6cHJvcF9uYW1lPiggXAotICAgICAgICAjcHJvcF9uYW1lLCAjY2xhc3NfbmFtZSwgcHJvcGVydHksIHZhbHVlLCBpbmZvKTsgXAotICB9Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE1FVEhPRCBDQUxMQkFDSyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLXRlbXBsYXRlIDxjbGFzcyBDLCBGWF9CT09MIChDOjoqTSkoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik+Ci12b2lkIEpTTWV0aG9kKGNvbnN0IGNoYXIqIG1ldGhvZF9uYW1lX3N0cmluZywKLSAgICAgICAgICAgICAgY29uc3QgY2hhciogY2xhc3NfbmFtZV9zdHJpbmcsCi0gICAgICAgICAgICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7Ci0gIHY4OjpJc29sYXRlKiBpc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7Ci0gIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IGlzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCk7Ci0gIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHYgPSBjb250ZXh0LT5HZXRFbWJlZGRlckRhdGEoMSk7Ci0gIHY4OjpMb2NhbDx2ODo6RXh0ZXJuYWw+IGZpZWxkID0gdjg6OkxvY2FsPHY4OjpFeHRlcm5hbD46OkNhc3Qodik7Ci0gIElGWEpTX1J1bnRpbWUqIHBSdW50aW1lID0gKElGWEpTX1J1bnRpbWUqKWZpZWxkLT5WYWx1ZSgpOwotICBJRlhKU19Db250ZXh0KiBjYyA9IHBSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpOwotICBDSlNfUGFyYW1ldGVycyBwYXJhbWV0ZXJzOwotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaTwodW5zaWduZWQgaW50KWluZm8uTGVuZ3RoKCk7IGkrKykgewotICAgIHBhcmFtZXRlcnMucHVzaF9iYWNrKENKU19WYWx1ZShpc29sYXRlLCBpbmZvW2ldLCBWVF91bmtub3duKSk7Ci0gIH0KLSAgQ0pTX1ZhbHVlIHZhbHVlUmVzKGlzb2xhdGUpOwotICBDSlNfT2JqZWN0KiBwSlNPYmogPSAoQ0pTX09iamVjdCAqKUpTX0dldFByaXZhdGUoaXNvbGF0ZSxpbmZvLkhvbGRlcigpKTsKLSAgQyogcE9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Qyo+KHBKU09iai0+R2V0RW1iZWRPYmplY3QoKSk7Ci0gIENGWF9XaWRlU3RyaW5nIHNFcnJvcjsKLSAgaWYgKCEocE9iai0+Kk0pKGNjLCBwYXJhbWV0ZXJzLCB2YWx1ZVJlcywgc0Vycm9yKSkgewotICAgICAgSlNfRXJyb3IoaXNvbGF0ZSwgSlNGb3JtYXRFcnJvclN0cmluZyhjbGFzc19uYW1lX3N0cmluZywgbWV0aG9kX25hbWVfc3RyaW5nLCBzRXJyb3IpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldCh2YWx1ZVJlcy5Ub1Y4VmFsdWUoKSk7Ci19Ci0KLSNkZWZpbmUgSlNfU1RBVElDX01FVEhPRChtZXRob2RfbmFtZSwgY2xhc3NfbmFtZSkgXAotICBzdGF0aWMgdm9pZCBtZXRob2RfbmFtZSMjX3N0YXRpYyggXAotICAgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsgICAgXAotICAgIEpTTWV0aG9kPGNsYXNzX25hbWUsICZjbGFzc19uYW1lOjptZXRob2RfbmFtZT4oIFwKLSAgICAgICAgI21ldGhvZF9uYW1lLCAjY2xhc3NfbmFtZSwgaW5mbyk7IFwKLSAgfQotCi0jZGVmaW5lIEpTX1NQRUNJQUxfU1RBVElDX01FVEhPRChtZXRob2RfbmFtZSwgY2xhc3NfYWx0ZXJuYXRlLCBjbGFzc19uYW1lKSBcCi0gIHN0YXRpYyB2b2lkIG1ldGhvZF9uYW1lIyNfc3RhdGljKCBcCi0gICAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgeyAgICBcCi0gICAgSlNNZXRob2Q8Y2xhc3NfYWx0ZXJuYXRlLCAmY2xhc3NfYWx0ZXJuYXRlOjptZXRob2RfbmFtZT4oIFwKLSAgICAgICAgI21ldGhvZF9uYW1lLCAjY2xhc3NfbmFtZSwgaW5mbyk7IFwKLSAgfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEpTIENMQVNTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLSNkZWZpbmUgREVDTEFSRV9KU19DTEFTUyhqc19jbGFzc19uYW1lKSBcCi0Jc3RhdGljIHZvaWQgSlNDb25zdHJ1Y3RvcihJRlhKU19Db250ZXh0KiBjYywgSlNGWE9iamVjdCBvYmosSlNGWE9iamVjdCBnbG9iYWwpO1wKLQlzdGF0aWMgdm9pZCBKU0Rlc3RydWN0b3IoSlNGWE9iamVjdCBvYmopO1wKLQlzdGF0aWMgaW50IEluaXQoSUpTX1J1bnRpbWUqIHBSdW50aW1lLCBGWEpTT0JKVFlQRSBlT2JqVHlwZSk7XAotCXN0YXRpYyBKU0NvbnN0U3BlYyBKU19DbGFzc19Db25zdHNbXTtcCi0Jc3RhdGljIEpTUHJvcGVydHlTcGVjIEpTX0NsYXNzX1Byb3BlcnRpZXNbXTtcCi0Jc3RhdGljIEpTTWV0aG9kU3BlYwlKU19DbGFzc19NZXRob2RzW107XAotCXN0YXRpYyBjb25zdCB3Y2hhcl90KiBtX3BDbGFzc05hbWUKLQotI2RlZmluZSBJTVBMRU1FTlRfSlNfQ0xBU1NfUklDSChqc19jbGFzc19uYW1lLCBjbGFzc19hbHRlcm5hdGUsIGNsYXNzX25hbWUpIFwKLWNvbnN0IHdjaGFyX3QqIGpzX2NsYXNzX25hbWU6Om1fcENsYXNzTmFtZSA9IEpTX1dJREVTVFJJTkcoY2xhc3NfbmFtZSk7XAotdm9pZCBqc19jbGFzc19uYW1lOjpKU0NvbnN0cnVjdG9yKElGWEpTX0NvbnRleHQqIGNjLCBKU0ZYT2JqZWN0IG9iaiwgSlNGWE9iamVjdCBnbG9iYWwpXAote1wKLQlDSlNfT2JqZWN0KiBwT2JqID0gbmV3IGpzX2NsYXNzX25hbWUob2JqKTtcCi0JcE9iai0+U2V0RW1iZWRPYmplY3QobmV3IGNsYXNzX2FsdGVybmF0ZShwT2JqKSk7XAotCUpTX1NldFByaXZhdGUoTlVMTCxvYmosKHZvaWQqKXBPYmopOyBcCi0JcE9iai0+SW5pdEluc3RhbmNlKGNjKTtcCi19XAotXAotdm9pZCBqc19jbGFzc19uYW1lOjpKU0Rlc3RydWN0b3IoSlNGWE9iamVjdCBvYmopIFwKLXtcCi0JanNfY2xhc3NfbmFtZSogcE9iaiA9IChqc19jbGFzc19uYW1lKilKU19HZXRQcml2YXRlKE5VTEwsb2JqKTtcCi0JQVNTRVJUKHBPYmogIT0gTlVMTCk7XAotCXBPYmotPkV4aXRJbnN0YW5jZSgpO1wKLQlkZWxldGUgcE9iajtcCi19XAotXAotaW50IGpzX2NsYXNzX25hbWU6OkluaXQoSUpTX1J1bnRpbWUqIHBSdW50aW1lLCBGWEpTT0JKVFlQRSBlT2JqVHlwZSlcCi17XAotCWludCBuT2JqRGVmbklEID0gSlNfRGVmaW5lT2JqKHBSdW50aW1lLCBqc19jbGFzc19uYW1lOjptX3BDbGFzc05hbWUsIGVPYmpUeXBlLCBKU0NvbnN0cnVjdG9yLCBKU0Rlc3RydWN0b3IsIDApO1wKLQlpZiAobk9iakRlZm5JRCA+PSAwKVwKLQl7XAotCQlmb3IgKGludCBqPTAsIHN6aj1zaXplb2YoSlNfQ2xhc3NfUHJvcGVydGllcykvc2l6ZW9mKEpTUHJvcGVydHlTcGVjKS0xOyBqPHN6ajsgaisrKVwKLQkJe1wKLQkJCWlmIChKU19EZWZpbmVPYmpQcm9wZXJ0eShwUnVudGltZSwgbk9iakRlZm5JRCwgSlNfQ2xhc3NfUHJvcGVydGllc1tqXS5wTmFtZSwgSlNfQ2xhc3NfUHJvcGVydGllc1tqXS5wUHJvcEdldCwgSlNfQ2xhc3NfUHJvcGVydGllc1tqXS5wUHJvcFB1dCkgPCAwKSByZXR1cm4gLTE7XAotCQl9XAotCQlmb3IgKGludCBrPTAsIHN6az1zaXplb2YoSlNfQ2xhc3NfTWV0aG9kcykvc2l6ZW9mKEpTTWV0aG9kU3BlYyktMTsgazxzems7IGsrKylcCi0JCXtcCi0JCQlpZiAoSlNfRGVmaW5lT2JqTWV0aG9kKHBSdW50aW1lLCBuT2JqRGVmbklELEpTX0NsYXNzX01ldGhvZHNba10ucE5hbWUsIEpTX0NsYXNzX01ldGhvZHNba10ucE1ldGhvZENhbGwpIDwgMCkgcmV0dXJuIC0xO1wKLQkJfVwKLQkJcmV0dXJuIG5PYmpEZWZuSUQ7XAotCX1cCi0JcmV0dXJuIC0xO1wKLX0KLQotI2RlZmluZSBJTVBMRU1FTlRfSlNfQ0xBU1MoanNfY2xhc3NfbmFtZSwgY2xhc3NfbmFtZSkgSU1QTEVNRU5UX0pTX0NMQVNTX1JJQ0goanNfY2xhc3NfbmFtZSwgY2xhc3NfbmFtZSwgY2xhc3NfbmFtZSkKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDT05TVCBDTEFTUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0jZGVmaW5lIERFQ0xBUkVfSlNfQ0xBU1NfQ09OU1QoKSBcCi0Jc3RhdGljIGludCBJbml0KElKU19SdW50aW1lKiBwUnVudGltZSwgRlhKU09CSlRZUEUgZU9ialR5cGUpO1wKLQlzdGF0aWMgSlNDb25zdFNwZWMgSlNfQ2xhc3NfQ29uc3RzW107XAotCXN0YXRpYyBjb25zdCB3Y2hhcl90KiBtX3BDbGFzc05hbWUKLQotI2RlZmluZSBJTVBMRU1FTlRfSlNfQ0xBU1NfQ09OU1QoanNfY2xhc3NfbmFtZSwgY2xhc3NfbmFtZSkgXAotY29uc3Qgd2NoYXJfdCoganNfY2xhc3NfbmFtZTo6bV9wQ2xhc3NOYW1lID0gSlNfV0lERVNUUklORyhjbGFzc19uYW1lKTtcCi1pbnQganNfY2xhc3NfbmFtZTo6SW5pdChJSlNfUnVudGltZSogcFJ1bnRpbWUsIEZYSlNPQkpUWVBFIGVPYmpUeXBlKVwKLXtcCi0JaW50IG5PYmpEZWZuSUQgPSBKU19EZWZpbmVPYmoocFJ1bnRpbWUsIGpzX2NsYXNzX25hbWU6Om1fcENsYXNzTmFtZSwgZU9ialR5cGUsIE5VTEwsIE5VTEwsIDApO1wKLQlpZiAobk9iakRlZm5JRCA+PTApXAotCXtcCi0JCWZvciAoaW50IGk9MCwgc3o9c2l6ZW9mKEpTX0NsYXNzX0NvbnN0cykvc2l6ZW9mKEpTQ29uc3RTcGVjKS0xOyBpPHN6OyBpKyspXAotCQl7XAotCQkJaWYgKEpTX0NsYXNzX0NvbnN0c1tpXS50ID09IDApXAotCQkJe1wKLQkJCQlpZiAoSlNfRGVmaW5lT2JqQ29uc3QocFJ1bnRpbWUsIG5PYmpEZWZuSUQsIEpTX0NsYXNzX0NvbnN0c1tpXS5wTmFtZSwgSlNfTmV3TnVtYmVyKHBSdW50aW1lLEpTX0NsYXNzX0NvbnN0c1tpXS5udW1iZXIpKSA8IDApIHJldHVybiAtMTtcCi0JCQl9XAotCQkJZWxzZVwKLQkJCXtcCi0JCQlpZiAoSlNfRGVmaW5lT2JqQ29uc3QocFJ1bnRpbWUsIG5PYmpEZWZuSUQsIEpTX0NsYXNzX0NvbnN0c1tpXS5wTmFtZSwgSlNfTmV3U3RyaW5nKHBSdW50aW1lLEpTX0NsYXNzX0NvbnN0c1tpXS5zdHJpbmcpKSA8IDApIHJldHVybiAtMTtcCi0JCQl9XAotCQl9XAotCQlyZXR1cm4gbk9iakRlZm5JRDtcCi0JfVwKLQlyZXR1cm4gLTE7XAotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNQRUNJQUwgSlMgQ0xBU1MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotdGVtcGxhdGUgPGNsYXNzIEFsdD4KLXZvaWQgSlNTcGVjaWFsUHJvcFF1ZXJ5KGNvbnN0IGNoYXIgKiwgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6SW50ZWdlcj4mIGluZm8pIHsKLSAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSBpbmZvLkdldElzb2xhdGUoKTsKLSAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIHV0ZjhfdmFsdWUocHJvcGVydHkpOwotICBDRlhfV2lkZVN0cmluZyBwcm9wbmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOCgqdXRmOF92YWx1ZSwgdXRmOF92YWx1ZS5sZW5ndGgoKSk7Ci0gIENKU19PYmplY3QqIHBKU09iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0pTX09iamVjdCo+KEpTX0dldFByaXZhdGUoaXNvbGF0ZSwgaW5mby5Ib2xkZXIoKSkpOwotICBBbHQqIHBPYmogPSByZWludGVycHJldF9jYXN0PEFsdCo+KHBKU09iai0+R2V0RW1iZWRPYmplY3QoKSk7Ci0gIEZYX0JPT0wgYlJldCA9IHBPYmotPlF1ZXJ5UHJvcGVydHkocHJvcG5hbWUuY19zdHIoKSk7Ci0gIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQoYlJldCA/IDQgOiAwKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIEFsdD4KLXZvaWQgSlNTcGVjaWFsUHJvcEdldChjb25zdCBjaGFyKiBjbGFzc19uYW1lLAotICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgewotICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IGluZm8uR2V0SXNvbGF0ZSgpOwotICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBpc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOwotICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2ID0gY29udGV4dC0+R2V0RW1iZWRkZXJEYXRhKDEpOwotICB2ODo6TG9jYWw8djg6OkV4dGVybmFsPiBmaWVsZCA9IHY4OjpMb2NhbDx2ODo6RXh0ZXJuYWw+OjpDYXN0KHYpOwotICBJRlhKU19SdW50aW1lKiBwUnVudGltZSA9IChJRlhKU19SdW50aW1lKilmaWVsZC0+VmFsdWUoKTsKLSAgSUZYSlNfQ29udGV4dCogcFJ1bnRpbWVDb250ZXh0ID0gcFJ1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCk7Ci0gIENKU19PYmplY3QqIHBKU09iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0pTX09iamVjdCo+KEpTX0dldFByaXZhdGUoaXNvbGF0ZSwgaW5mby5Ib2xkZXIoKSkpOwotICBBbHQqIHBPYmogPSByZWludGVycHJldF9jYXN0PEFsdCo+KHBKU09iai0+R2V0RW1iZWRPYmplY3QoKSk7Ci0gIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSB1dGY4X3ZhbHVlKHByb3BlcnR5KTsKLSAgQ0ZYX1dpZGVTdHJpbmcgcHJvcG5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoKnV0ZjhfdmFsdWUsIHV0ZjhfdmFsdWUubGVuZ3RoKCkpOwotICBDRlhfV2lkZVN0cmluZyBzRXJyb3I7Ci0gIENKU19Qcm9wVmFsdWUgdmFsdWUoaXNvbGF0ZSk7Ci0gIHZhbHVlLlN0YXJ0R2V0dGluZygpOwotICBpZiAoIXBPYmotPkRvUHJvcGVydHkocFJ1bnRpbWVDb250ZXh0LCBwcm9wbmFtZS5jX3N0cigpLCB2YWx1ZSwgc0Vycm9yKSkgewotICAgICAgSlNfRXJyb3IoaXNvbGF0ZSwgSlNGb3JtYXRFcnJvclN0cmluZyhjbGFzc19uYW1lLCAiR2V0UHJvcGVydHkiLCBzRXJyb3IpKTsKLSAgICAgIHJldHVybjsKLSAgfQotICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KCh2ODo6TG9jYWw8djg6OlZhbHVlPil2YWx1ZSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBBbHQ+Ci12b2lkIEpTU3BlY2lhbFByb3BQdXQoY29uc3QgY2hhciogY2xhc3NfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsKLSAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSBpbmZvLkdldElzb2xhdGUoKTsKLSAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gaXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKTsKLSAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdiA9IGNvbnRleHQtPkdldEVtYmVkZGVyRGF0YSgxKTsKLSAgdjg6OkxvY2FsPHY4OjpFeHRlcm5hbD4gZmllbGQgPSB2ODo6TG9jYWw8djg6OkV4dGVybmFsPjo6Q2FzdCh2KTsKLSAgSUZYSlNfUnVudGltZSogcFJ1bnRpbWUgPSAoSUZYSlNfUnVudGltZSopZmllbGQtPlZhbHVlKCk7Ci0gIElGWEpTX0NvbnRleHQqIHBSdW50aW1lQ29udGV4dCA9IHBSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpOwotICBDSlNfT2JqZWN0KiBwSlNPYmogPSByZWludGVycHJldF9jYXN0PENKU19PYmplY3QqPihKU19HZXRQcml2YXRlKGlzb2xhdGUsIGluZm8uSG9sZGVyKCkpKTsKLSAgQWx0KiBwT2JqID0gcmVpbnRlcnByZXRfY2FzdDxBbHQqPihwSlNPYmotPkdldEVtYmVkT2JqZWN0KCkpOwotICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgdXRmOF92YWx1ZShwcm9wZXJ0eSk7Ci0gIENGWF9XaWRlU3RyaW5nIHByb3BuYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KCp1dGY4X3ZhbHVlLCB1dGY4X3ZhbHVlLmxlbmd0aCgpKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgc0Vycm9yOwotICBDSlNfUHJvcFZhbHVlIFByb3BWYWx1ZShDSlNfVmFsdWUoaXNvbGF0ZSx2YWx1ZSxWVF91bmtub3duKSk7Ci0gIFByb3BWYWx1ZS5TdGFydFNldHRpbmcoKTsKLSAgaWYgKCFwT2JqLT5Eb1Byb3BlcnR5KHBSdW50aW1lQ29udGV4dCwgcHJvcG5hbWUuY19zdHIoKSwgUHJvcFZhbHVlLCBzRXJyb3IpKSB7Ci0gICAgICBKU19FcnJvcihpc29sYXRlLCBKU0Zvcm1hdEVycm9yU3RyaW5nKGNsYXNzX25hbWUsICJQdXRQcm9wZXJ0eSIsIHNFcnJvcikpOwotICB9Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBBbHQ+Ci12b2lkIEpTU3BlY2lhbFByb3BEZWwoY29uc3QgY2hhciogY2xhc3NfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpCb29sZWFuPiYgaW5mbykgewotICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IGluZm8uR2V0SXNvbGF0ZSgpOwotICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBpc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOwotICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2ID0gY29udGV4dC0+R2V0RW1iZWRkZXJEYXRhKDEpOwotICB2ODo6TG9jYWw8djg6OkV4dGVybmFsPiBmaWVsZCA9IHY4OjpMb2NhbDx2ODo6RXh0ZXJuYWw+OjpDYXN0KHYpOwotICBJRlhKU19SdW50aW1lKiBwUnVudGltZSA9IChJRlhKU19SdW50aW1lKilmaWVsZC0+VmFsdWUoKTsKLSAgSUZYSlNfQ29udGV4dCogcFJ1bnRpbWVDb250ZXh0ID0gcFJ1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCk7Ci0gIENKU19PYmplY3QqIHBKU09iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0pTX09iamVjdCo+KEpTX0dldFByaXZhdGUoaXNvbGF0ZSwgaW5mby5Ib2xkZXIoKSkpOwotICBBbHQqIHBPYmogPSByZWludGVycHJldF9jYXN0PEFsdCo+KHBKU09iai0+R2V0RW1iZWRPYmplY3QoKSk7Ci0gIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSB1dGY4X3ZhbHVlKHByb3BlcnR5KTsKLSAgQ0ZYX1dpZGVTdHJpbmcgcHJvcG5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoKnV0ZjhfdmFsdWUsIHV0ZjhfdmFsdWUubGVuZ3RoKCkpOwotICBDRlhfV2lkZVN0cmluZyBzRXJyb3I7Ci0gIGlmICghcE9iai0+RGVsUHJvcGVydHkocFJ1bnRpbWVDb250ZXh0LCBwcm9wbmFtZS5jX3N0cigpLCBzRXJyb3IpKSB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY2JOYW1lOwotICAgIGNiTmFtZS5Gb3JtYXQoIiVzLiVzIiwgY2xhc3NfbmFtZSwgIkRlbFByb3BlcnR5Iik7Ci0gICAgLy8gUHJvYmFibHkgYSBtaXNzaW5nIGNhbGwgdG8gSlNfRXJyb3IoKS4KLSAgfQotfQotCi0jZGVmaW5lIERFQ0xBUkVfU1BFQ0lBTF9KU19DTEFTUyhqc19jbGFzc19uYW1lKSBcCi0Jc3RhdGljIHZvaWQgSlNDb25zdHJ1Y3RvcihJRlhKU19Db250ZXh0KiBjYywgSlNGWE9iamVjdCBvYmosIEpTRlhPYmplY3QgZ2xvYmFsKTtcCi0Jc3RhdGljIHZvaWQgSlNEZXN0cnVjdG9yKEpTRlhPYmplY3Qgb2JqKTtcCi0Jc3RhdGljIEpTQ29uc3RTcGVjIEpTX0NsYXNzX0NvbnN0c1tdO1wKLQlzdGF0aWMgSlNQcm9wZXJ0eVNwZWMgSlNfQ2xhc3NfUHJvcGVydGllc1tdO1wKLQlzdGF0aWMgSlNNZXRob2RTcGVjCUpTX0NsYXNzX01ldGhvZHNbXTtcCi0Jc3RhdGljIGludCBJbml0KElKU19SdW50aW1lKiBwUnVudGltZSwgRlhKU09CSlRZUEUgZU9ialR5cGUpO1wKLQlzdGF0aWMgY29uc3Qgd2NoYXJfdCogbV9wQ2xhc3NOYW1lO1wKLQlzdGF0aWMgdm9pZCBxdWVyeXByb3BfIyNqc19jbGFzc19uYW1lIyNfc3RhdGljKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSxjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OkludGVnZXI+JiBpbmZvKTtcCi0Jc3RhdGljIHZvaWQgZ2V0cHJvcF8jI2pzX2NsYXNzX25hbWUjI19zdGF0aWModjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LCBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbyk7XAotCXN0YXRpYyB2b2lkIHB1dHByb3BfIyNqc19jbGFzc19uYW1lIyNfc3RhdGljKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSx2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWx1ZSxjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbyk7XAotCXN0YXRpYyB2b2lkIGRlbHByb3BfIyNqc19jbGFzc19uYW1lIyNfc3RhdGljKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSxjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OkJvb2xlYW4+JiBpbmZvKQotCi0jZGVmaW5lIElNUExFTUVOVF9TUEVDSUFMX0pTX0NMQVNTKGpzX2NsYXNzX25hbWUsIGNsYXNzX2FsdGVybmF0ZSwgY2xhc3NfbmFtZSkgXAotY29uc3Qgd2NoYXJfdCAqIGpzX2NsYXNzX25hbWU6Om1fcENsYXNzTmFtZSA9IEpTX1dJREVTVFJJTkcoY2xhc3NfbmFtZSk7XAotdm9pZCBqc19jbGFzc19uYW1lOjpxdWVyeXByb3BfIyNqc19jbGFzc19uYW1lIyNfc3RhdGljKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSxjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OkludGVnZXI+JiBpbmZvKSB7IFwKLSAgSlNTcGVjaWFsUHJvcFF1ZXJ5PGNsYXNzX2FsdGVybmF0ZT4oI2NsYXNzX25hbWUsIHByb3BlcnR5LCBpbmZvKTsgICAgIFwKLX1cCi12b2lkIGpzX2NsYXNzX25hbWU6OmdldHByb3BfIyNqc19jbGFzc19uYW1lIyNfc3RhdGljKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsgXAotICBKU1NwZWNpYWxQcm9wR2V0PGNsYXNzX2FsdGVybmF0ZT4oI2NsYXNzX25hbWUsIHByb3BlcnR5LCBpbmZvKTsgXAotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotdm9pZCBqc19jbGFzc19uYW1lOjpwdXRwcm9wXyMjanNfY2xhc3NfbmFtZSMjX3N0YXRpYyh2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWUsY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHtcCi0gIEpTU3BlY2lhbFByb3BQdXQ8Y2xhc3NfYWx0ZXJuYXRlPigjY2xhc3NfbmFtZSwgcHJvcGVydHksIHZhbHVlLCBpbmZvKTsgXAotfVwKLXZvaWQganNfY2xhc3NfbmFtZTo6ZGVscHJvcF8jI2pzX2NsYXNzX25hbWUjI19zdGF0aWModjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6Qm9vbGVhbj4mIGluZm8pIHsgXAotICBKU1NwZWNpYWxQcm9wRGVsPGNsYXNzX2FsdGVybmF0ZT4oI2NsYXNzX25hbWUsIHByb3BlcnR5LCBpbmZvKTsgXAotfSBcCi12b2lkIGpzX2NsYXNzX25hbWU6OkpTQ29uc3RydWN0b3IoSUZYSlNfQ29udGV4dCogY2MsIEpTRlhPYmplY3QgIG9iaixKU0ZYT2JqZWN0ICBnbG9iYWwpXAote1wKLQlDSlNfT2JqZWN0KiBwT2JqID0gbmV3IGpzX2NsYXNzX25hbWUob2JqKTtcCi0JcE9iai0+U2V0RW1iZWRPYmplY3QobmV3IGNsYXNzX2FsdGVybmF0ZShwT2JqKSk7XAotCUpTX1NldFByaXZhdGUoTlVMTCxvYmosICh2b2lkKilwT2JqKTsgXAotCXBPYmotPkluaXRJbnN0YW5jZShjYyk7XAotfVwKLVwKLXZvaWQganNfY2xhc3NfbmFtZTo6SlNEZXN0cnVjdG9yKEpTRlhPYmplY3Qgb2JqKSBcCi17XAotCWpzX2NsYXNzX25hbWUqIHBPYmogPSAoanNfY2xhc3NfbmFtZSopSlNfR2V0UHJpdmF0ZShOVUxMLG9iaik7XAotCUFTU0VSVChwT2JqICE9IE5VTEwpO1wKLQlwT2JqLT5FeGl0SW5zdGFuY2UoKTtcCi0JZGVsZXRlIHBPYmo7XAotfVwKLVwKLWludCBqc19jbGFzc19uYW1lOjpJbml0KElKU19SdW50aW1lKiBwUnVudGltZSwgRlhKU09CSlRZUEUgZU9ialR5cGUpXAote1wKLVwKLQlpbnQgbk9iakRlZm5JRCA9IEpTX0RlZmluZU9iaihwUnVudGltZSwganNfY2xhc3NfbmFtZTo6bV9wQ2xhc3NOYW1lLCBlT2JqVHlwZSwgSlNDb25zdHJ1Y3RvciwgSlNEZXN0cnVjdG9yLCAwKTtcCi1cCi0JaWYgKG5PYmpEZWZuSUQgPj0gMClcCi0Je1wKLQkJZm9yIChpbnQgaj0wLCBzemo9c2l6ZW9mKEpTX0NsYXNzX1Byb3BlcnRpZXMpL3NpemVvZihKU1Byb3BlcnR5U3BlYyktMTsgajxzemo7IGorKylcCi0JCXtcCi0JCQlpZiAoSlNfRGVmaW5lT2JqUHJvcGVydHkocFJ1bnRpbWUsIG5PYmpEZWZuSUQsIEpTX0NsYXNzX1Byb3BlcnRpZXNbal0ucE5hbWUsIEpTX0NsYXNzX1Byb3BlcnRpZXNbal0ucFByb3BHZXQsSlNfQ2xhc3NfUHJvcGVydGllc1tqXS5wUHJvcFB1dCk8MClyZXR1cm4gLTE7XAotCQl9XAotXAotCQlmb3IgKGludCBrPTAsIHN6az1zaXplb2YoSlNfQ2xhc3NfTWV0aG9kcykvc2l6ZW9mKEpTTWV0aG9kU3BlYyktMTsgazxzems7IGsrKylcCi0JCXtcCi0JCQlpZiAoSlNfRGVmaW5lT2JqTWV0aG9kKHBSdW50aW1lLCBuT2JqRGVmbklELEpTX0NsYXNzX01ldGhvZHNba10ucE5hbWUsSlNfQ2xhc3NfTWV0aG9kc1trXS5wTWV0aG9kQ2FsbCk8MClyZXR1cm4gLTE7XAotCQl9XAotCQlpZiAoSlNfRGVmaW5lT2JqQWxsUHJvcGVydGllcyhwUnVudGltZSwgbk9iakRlZm5JRCwganNfY2xhc3NfbmFtZTo6cXVlcnlwcm9wXyMjanNfY2xhc3NfbmFtZSMjX3N0YXRpYywganNfY2xhc3NfbmFtZTo6Z2V0cHJvcF8jI2pzX2NsYXNzX25hbWUjI19zdGF0aWMsanNfY2xhc3NfbmFtZTo6cHV0cHJvcF8jI2pzX2NsYXNzX25hbWUjI19zdGF0aWMsanNfY2xhc3NfbmFtZTo6ZGVscHJvcF8jI2pzX2NsYXNzX25hbWUjI19zdGF0aWMpPDApIHJldHVybiAtMTtcCi1cCi0JCXJldHVybiBuT2JqRGVmbklEO1wKLQl9XAotXAotCXJldHVybiAtMTtcCi19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gR0xPQkFMIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotdGVtcGxhdGUgPEZYX0JPT0wgKCpGKShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKT4KLXZvaWQgSlNHbG9iYWxGdW5jKGNvbnN0IGNoYXIgKmZ1bmNfbmFtZV9zdHJpbmcsCi0gICAgICAgICAgICAgICAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgewotICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IGluZm8uR2V0SXNvbGF0ZSgpOwotICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBpc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOwotICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2ID0gY29udGV4dC0+R2V0RW1iZWRkZXJEYXRhKDEpOwotICB2ODo6TG9jYWw8djg6OkV4dGVybmFsPiBmaWVsZCA9IHY4OjpMb2NhbDx2ODo6RXh0ZXJuYWw+OjpDYXN0KHYpOwotICBJRlhKU19SdW50aW1lKiBwUnVudGltZSA9IChJRlhKU19SdW50aW1lKilmaWVsZC0+VmFsdWUoKTsKLSAgSUZYSlNfQ29udGV4dCogY2MgPSBwUnVudGltZS0+R2V0Q3VycmVudENvbnRleHQoKTsKLSAgQ0pTX1BhcmFtZXRlcnMgcGFyYW1ldGVyczsKLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGk8KHVuc2lnbmVkIGludClpbmZvLkxlbmd0aCgpOyBpKyspIHsKLSAgICBwYXJhbWV0ZXJzLnB1c2hfYmFjayhDSlNfVmFsdWUoaXNvbGF0ZSwgaW5mb1tpXSwgVlRfdW5rbm93bikpOwotICB9Ci0gIENKU19WYWx1ZSB2YWx1ZVJlcyhpc29sYXRlKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgc0Vycm9yOwotICBpZiAoISgqRikoY2MsIHBhcmFtZXRlcnMsIHZhbHVlUmVzLCBzRXJyb3IpKQotICB7Ci0gICAgICBKU19FcnJvcihpc29sYXRlLCBKU0Zvcm1hdEVycm9yU3RyaW5nKGZ1bmNfbmFtZV9zdHJpbmcsIG51bGxwdHIsIHNFcnJvcikpOwotICAgIHJldHVybjsKLSAgfQotICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KHZhbHVlUmVzLlRvVjhWYWx1ZSgpKTsKLX0KLQotI2RlZmluZSBKU19TVEFUSUNfR0xPQkFMX0ZVTihmdW5fbmFtZSkgXAotICBzdGF0aWMgdm9pZCBmdW5fbmFtZSMjX3N0YXRpYyhjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgeyBcCi0gICAgSlNHbG9iYWxGdW5jPGZ1bl9uYW1lPigjZnVuX25hbWUsIGluZm8pOyBcCi0gIH0KLQotI2RlZmluZSBKU19TVEFUSUNfREVDTEFSRV9HTE9CQUxfRlVOKCkgXAotc3RhdGljIEpTTWV0aG9kU3BlYwlnbG9iYWxfbWV0aG9kc1tdOyBcCi1zdGF0aWMgaW50IEluaXQoSUpTX1J1bnRpbWUqIHBSdW50aW1lKQotCi0jZGVmaW5lIEJFR0lOX0pTX1NUQVRJQ19HTE9CQUxfRlVOKGpzX2NsYXNzX25hbWUpIFwKLUpTTWV0aG9kU3BlYyBqc19jbGFzc19uYW1lOjpnbG9iYWxfbWV0aG9kc1tdID0gewotCi0jZGVmaW5lIEpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKG1ldGhvZF9uYW1lKSBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKG1ldGhvZF9uYW1lKQotCi0jZGVmaW5lIEVORF9KU19TVEFUSUNfR0xPQkFMX0ZVTigpIEVORF9KU19TVEFUSUNfTUVUSE9EKCkKLQotI2RlZmluZSBJTVBMRU1FTlRfSlNfU1RBVElDX0dMT0JBTF9GVU4oanNfY2xhc3NfbmFtZSkgXAotaW50IGpzX2NsYXNzX25hbWU6OkluaXQoSUpTX1J1bnRpbWUqIHBSdW50aW1lKVwKLXtcCi0JZm9yIChpbnQgaT0wLCBzej1zaXplb2YoanNfY2xhc3NfbmFtZTo6Z2xvYmFsX21ldGhvZHMpL3NpemVvZihKU01ldGhvZFNwZWMpLTE7IGk8c3o7IGkrKylcCi0Je1wKLQkJaWYgKEpTX0RlZmluZUdsb2JhbE1ldGhvZChwUnVudGltZSxcCi0JCQkJanNfY2xhc3NfbmFtZTo6Z2xvYmFsX21ldGhvZHNbaV0ucE5hbWUsXAotCQkJCWpzX2NsYXNzX25hbWU6Omdsb2JhbF9tZXRob2RzW2ldLnBNZXRob2RDYWxsXAotCQkJCSkgPCAwXAotCQkJKXJldHVybiAtMTtcCi0JfVwKLQlyZXR1cm4gMDtcCi19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gR0xPQkFMIENPTlNUUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBERUZJTkVfR0xPQkFMX0NPTlNUKHBSdW50aW1lLCBjb25zdF9uYW1lICwgY29uc3RfdmFsdWUpXAotaWYgKEpTX0RlZmluZUdsb2JhbENvbnN0KHBSdW50aW1lLEpTX1dJREVTVFJJTkcoY29uc3RfbmFtZSksSlNfTmV3U3RyaW5nKHBSdW50aW1lLEpTX1dJREVTVFJJTkcoY29uc3RfdmFsdWUpKSkpIHJldHVybiAtMQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEdMT0JBTCBBUlJBWVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotI2RlZmluZSBERUZJTkVfR0xPQkFMX0FSUkFZKHBSdW50aW1lKVwKLWludCBzaXplID0gRlhfQXJyYXlTaXplKEFycmF5Q29udGVudCk7XAotXAotQ0pTX0FycmF5IGFycmF5KHBSdW50aW1lKTtcCi1mb3IgKGludCBpPTA7IGk8c2l6ZTsgaSsrKSBhcnJheS5TZXRFbGVtZW50KGksQ0pTX1ZhbHVlKHBSdW50aW1lLEFycmF5Q29udGVudFtpXSkpO1wKLVwKLUNKU19Qcm9wVmFsdWUgcHJvcChwUnVudGltZSk7XAotcHJvcCA8PCBhcnJheTtcCi1pZiAoSlNfRGVmaW5lR2xvYmFsQ29uc3QocFJ1bnRpbWUsIChjb25zdCB3Y2hhcl90KilBcnJheU5hbWUsIHByb3AuVG9WOFZhbHVlKCkpIDwgMClcCi0JcmV0dXJuIC0xCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0jZGVmaW5lIFZBTFVFX05BTUVfU1RSSU5HCQlMInN0cmluZyIKLSNkZWZpbmUgVkFMVUVfTkFNRV9OVU1CRVIJCUwibnVtYmVyIgotI2RlZmluZSBWQUxVRV9OQU1FX0JPT0xFQU4JCUwiYm9vbGVhbiIKLSNkZWZpbmUgVkFMVUVfTkFNRV9EQVRFCQkJTCJkYXRlIgotI2RlZmluZSBWQUxVRV9OQU1FX09CSkVDVAkJTCJvYmplY3QiCi0jZGVmaW5lIFZBTFVFX05BTUVfRlhPQkoJCUwiZnhvYmoiCi0jZGVmaW5lIFZBTFVFX05BTUVfTlVMTAkJCUwibnVsbCIKLSNkZWZpbmUgVkFMVUVfTkFNRV9VTkRFRklORUQJTCJ1bmRlZmluZWQiCi0KLUZYSlNWQUxVRVRZUEUgR0VUX1ZBTFVFX1RZUEUodjg6OkxvY2FsPHY4OjpWYWx1ZT4gcCk7Ci0KLSNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfSlNfREVGSU5FX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmNkYmU4Li4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfSlNfRVZFTlRIQU5ETEVSX0hfCi0jZGVmaW5lIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0pTX0VWRU5USEFORExFUl9IXwotCi0jaW5jbHVkZSAiLi4vLi4vLi4vY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2NvcmUvaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaCIKLQotY2xhc3MgQ0pTX0NvbnRleHQ7Ci1jbGFzcyBDUERGU0RLX0Fubm90OwotY2xhc3MgQ1BERlNES19Eb2N1bWVudDsKLWNsYXNzIENQREZfQm9va21hcms7Ci1jbGFzcyBDUERGX0Zvcm1GaWVsZDsKLWNsYXNzIEZpZWxkOwotCi1lbnVtIEpTX0VWRU5UX1QKLXsKLQlKRVRfVU5LTk9XTiwKLQlKRVRfQVBQX0lOSVQsCi0JSkVUX0RPQ19PUEVOLAotCUpFVF9ET0NfV0lMTFBSSU5ULAotCUpFVF9ET0NfRElEUFJJTlQsCi0JSkVUX0RPQ19XSUxMU0FWRSwKLQlKRVRfRE9DX0RJRFNBVkUsCi0JSkVUX0RPQ19XSUxMQ0xPU0UsCi0JSkVUX1BBR0VfT1BFTiwKLQlKRVRfUEFHRV9DTE9TRSwKLQlKRVRfUEFHRV9JTlZJRVcsCi0JSkVUX1BBR0VfT1VUVklFVywKLQlKRVRfRklFTERfTU9VU0VET1dOLAotCUpFVF9GSUVMRF9NT1VTRVVQLAotCUpFVF9GSUVMRF9NT1VTRUVOVEVSLAotCUpFVF9GSUVMRF9NT1VTRUVYSVQsCi0JSkVUX0ZJRUxEX0ZPQ1VTLAotCUpFVF9GSUVMRF9CTFVSLAotCUpFVF9GSUVMRF9LRVlTVFJPS0UsCi0JSkVUX0ZJRUxEX1ZBTElEQVRFLAotCUpFVF9GSUVMRF9DQUxDVUxBVEUsCi0JSkVUX0ZJRUxEX0ZPUk1BVCwKLQlKRVRfU0NSRUVOX0ZPQ1VTLAotCUpFVF9TQ1JFRU5fQkxVUiwKLQlKRVRfU0NSRUVOX09QRU4sCi0JSkVUX1NDUkVFTl9DTE9TRSwKLQlKRVRfU0NSRUVOX01PVVNFRE9XTiwKLQlKRVRfU0NSRUVOX01PVVNFVVAsCi0JSkVUX1NDUkVFTl9NT1VTRUVOVEVSLAotCUpFVF9TQ1JFRU5fTU9VU0VFWElULAotCUpFVF9TQ1JFRU5fSU5WSUVXLAotCUpFVF9TQ1JFRU5fT1VUVklFVywKLQlKRVRfQkFUQ0hfRVhFQywKLQlKRVRfTUVOVV9FWEVDLAotCUpFVF9DT05TT0xFX0VYRUMsCi0JSkVUX0VYVEVSTkFMX0VYRUMsCi0JSkVUX0JPT0tNQVJLX01PVVNFVVAsCi0JSkVUX0xJTktfTU9VU0VVUAotfTsKLQotY2xhc3MgQ0pTX0V2ZW50SGFuZGxlcgotewotcHVibGljOgotCUNKU19FdmVudEhhbmRsZXIoQ0pTX0NvbnRleHQgKiBwQ29udGV4dCk7Ci0JdmlydHVhbCB+Q0pTX0V2ZW50SGFuZGxlcigpOwotCi0Jdm9pZAkJCQkJT25BcHBfSW5pdCgpOwotCi0Jdm9pZAkJCQkJT25Eb2NfT3BlbihDUERGU0RLX0RvY3VtZW50KiBwRG9jLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyVGFyZ2V0TmFtZSk7Ci0Jdm9pZAkJCQkJT25Eb2NfV2lsbFByaW50KENQREZTREtfRG9jdW1lbnQqIHBEb2MpOwotCXZvaWQJCQkJCU9uRG9jX0RpZFByaW50KENQREZTREtfRG9jdW1lbnQqIHBEb2MpOwotCXZvaWQJCQkJCU9uRG9jX1dpbGxTYXZlKENQREZTREtfRG9jdW1lbnQqIHBEb2MpOwotCXZvaWQJCQkJCU9uRG9jX0RpZFNhdmUoQ1BERlNES19Eb2N1bWVudCogcERvYyk7Ci0Jdm9pZAkJCQkJT25Eb2NfV2lsbENsb3NlKENQREZTREtfRG9jdW1lbnQqIHBEb2MpOwotCi0Jdm9pZAkJCQkJT25QYWdlX09wZW4oQ1BERlNES19Eb2N1bWVudCogcERvYyk7Ci0Jdm9pZAkJCQkJT25QYWdlX0Nsb3NlKENQREZTREtfRG9jdW1lbnQqIHBEb2MpOwotCXZvaWQJCQkJCU9uUGFnZV9JblZpZXcoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCk7Ci0Jdm9pZAkJCQkJT25QYWdlX091dFZpZXcoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCk7Ci0JCi0Jdm9pZAkJCQkJT25GaWVsZF9DYWxjdWxhdGUoQ1BERl9Gb3JtRmllbGQqIHBTb3VyY2UsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wmIGJSYyk7Ci0Jdm9pZAkJCQkJT25GaWVsZF9Gb3JtYXQoaW50IG5Db21taXRLZXksIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wgYldpbGxDb21taXQpOwotCXZvaWQJCQkJCU9uRmllbGRfS2V5c3Ryb2tlKGludCBuQ29tbWl0S2V5LCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCi0JCQkJCQkJCUZYX0JPT0wgS2V5RG93biwgRlhfQk9PTCBiTW9kaWZpZXIsIGludCAmblNlbEVuZCxpbnQgJm5TZWxTdGFydCwgRlhfQk9PTCBiU2hpZnQsCi0JCQkJCQkJCUNQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wgYldpbGxDb21taXQsIAotCQkJCQkJCQlGWF9CT09MIGJGaWVsZEZ1bGwsIEZYX0JPT0wgJmJSYyk7Ci0Jdm9pZAkJCQkJT25GaWVsZF9WYWxpZGF0ZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsIEZYX0JPT0wgYktleURvd24sCi0JCQkJCQkJCUZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCYgYlJjKTsKLQotCXZvaWQJCQkJCU9uRmllbGRfTW91c2VEb3duKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQgKnBUYXJnZXQpOwotCXZvaWQJCQkJCU9uRmllbGRfTW91c2VFbnRlcihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KTsKLQl2b2lkCQkJCQlPbkZpZWxkX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KTsKLQl2b2lkCQkJCQlPbkZpZWxkX01vdXNlVXAoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCAqcFRhcmdldCk7Ci0Jdm9pZAkJCQkJT25GaWVsZF9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSk7Ci0Jdm9pZAkJCQkJT25GaWVsZF9Gb2N1cyhGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpOwotCi0Jdm9pZAkJCQkJT25TY3JlZW5fRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2b2lkCQkJCQlPblNjcmVlbl9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0Jdm9pZAkJCQkJT25TY3JlZW5fT3BlbihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZvaWQJCQkJCU9uU2NyZWVuX0Nsb3NlKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0Jdm9pZAkJCQkJT25TY3JlZW5fTW91c2VEb3duKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0Jdm9pZAkJCQkJT25TY3JlZW5fTW91c2VVcChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCXZvaWQJCQkJCU9uU2NyZWVuX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2b2lkCQkJCQlPblNjcmVlbl9Nb3VzZUV4aXQoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2b2lkCQkJCQlPblNjcmVlbl9JblZpZXcoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLQl2b2lkCQkJCQlPblNjcmVlbl9PdXRWaWV3KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0KLQl2b2lkCQkJCQlPbkJvb2ttYXJrX01vdXNlVXAoQ1BERl9Cb29rbWFyayogcEJvb2tNYXJrKTsKLQl2b2lkCQkJCQlPbkxpbmtfTW91c2VVcChDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KTsKLQotCXZvaWQJCQkJCU9uTWVudV9FeGVjKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJUYXJnZXROYW1lKTsKLQl2b2lkCQkJCQlPbkJhdGNoRXhlYyhDUERGU0RLX0RvY3VtZW50ICpwVGFyZ2V0KTsKLQl2b2lkCQkJCQlPbkNvbnNvbGVfRXhlYygpOwotCXZvaWQJCQkJCU9uRXh0ZXJuYWxfRXhlYygpOwotCi1wdWJsaWM6Ci0gICAgdm9pZAkJCQkJSW5pdGlhbChKU19FVkVOVF9UIHR5cGUpOwotCXZvaWQJCQkJCURlc3Ryb3koKTsKLQlGWF9CT09MCQkJCQlJc1ZhbGlkKCk7Ci0KLQkKLQlDRlhfV2lkZVN0cmluZyYJCQlDaGFuZ2UoKTsKLQlDRlhfV2lkZVN0cmluZwkJCUNoYW5nZUV4KCk7Ci0JaW50CQkJCQkJQ29tbWl0S2V5KCk7Ci0JRlhfQk9PTAkJCQkJRmllbGRGdWxsKCk7Ci0JRlhfQk9PTAkJCQkJS2V5RG93bigpOwotCUZYX0JPT0wJCQkJCU1vZGlmaWVyKCk7Ci0JRlhfTFBDV1NUUgkJCQlOYW1lKCk7Ci0JRlhfTFBDV1NUUgkJCQlUeXBlKCk7Ci0JRlhfQk9PTCYJCQkJUmMoKTsKLQlpbnQmCQkJCQlTZWxFbmQoKTsKLQlpbnQmCQkJCQlTZWxTdGFydCgpOwotCUZYX0JPT0wJCQkJCVNoaWZ0KCk7Ci0JRmllbGQqCQkJCQlTb3VyY2UoKTsKLQlGaWVsZCoJCQkJCVRhcmdldF9GaWVsZCgpOwotCUNGWF9XaWRlU3RyaW5nJgkJCVZhbHVlKCk7Ci0JRlhfQk9PTAkJCQkJV2lsbENvbW1pdCgpOwotCUNGWF9XaWRlU3RyaW5nCQkJVGFyZ2V0TmFtZSgpOwotCi0JSlNfRVZFTlRfVAkJCQlFdmVudFR5cGUoKSB7cmV0dXJuIG1fZUV2ZW50VHlwZTt9OwkKLQotcHVibGljOgotCUNKU19Db250ZXh0KgkJCW1fcEpTQ29udGV4dDsKLQlKU19FVkVOVF9UCQkJCW1fZUV2ZW50VHlwZTsKLQlGWF9CT09MCQkJCQltX2JWYWxpZDsKLQotCUNGWF9XaWRlU3RyaW5nCQkJbV9zdHJUYXJnZXROYW1lOwotCUNGWF9XaWRlU3RyaW5nCQkJbV9zdHJTb3VyY2VOYW1lOwotCUNGWF9XaWRlU3RyaW5nKgkJCW1fcFdpZGVTdHJDaGFuZ2U7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQltX1dpZGVTdHJDaGFuZ2VEdTsKLQlDRlhfV2lkZVN0cmluZwkJCW1fV2lkZVN0ckNoYW5nZUV4OwotCWludAkJCQkJCW1fbkNvbW1pdEtleTsKLQlGWF9CT09MCQkJCQltX2JLZXlEb3duOwotCUZYX0JPT0wJCQkJCW1fYk1vZGlmaWVyOwotCUZYX0JPT0wJCQkJCW1fYlNoaWZ0OwotCWludCoJCQkJCW1fcElTZWxFbmQ7Ci0JaW50CQkJCQkJbV9uU2VsRW5kRHU7Ci0JaW50KgkJCQkJbV9wSVNlbFN0YXJ0OwotCWludAkJCQkJCW1fblNlbFN0YXJ0RHU7Ci0JRlhfQk9PTAkJCQkJbV9iV2lsbENvbW1pdDsKLQlDRlhfV2lkZVN0cmluZyoJCQltX3BWYWx1ZTsKLQlGWF9CT09MCQkJCQltX2JGaWVsZEZ1bGw7Ci0JRlhfQk9PTCoJCQkJbV9wYlJjOwotCUZYX0JPT0wJCQkJCW1fYlJjRHU7Ci0KLQlDUERGU0RLX0RvY3VtZW50KgkJbV9wU291cmNlRG9jOwotCUNQREZfQm9va21hcmsqCQkJbV9wVGFyZ2V0Qm9va01hcms7Ci0JQ1BERlNES19Eb2N1bWVudCoJCW1fcFRhcmdldERvYzsKLQlDUERGU0RLX0Fubm90KgkJCW1fcFRhcmdldEFubm90OwotfTsKLQotI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfSkFWQVNDUklQVF9KU19FVkVOVEhBTkRMRVJfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc2ZmY4Yy4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19HbG9iYWxEYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0pTX0dMT0JBTERBVEFfSF8KLSNkZWZpbmUgRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfSlNfR0xPQkFMREFUQV9IXwotCi0jaW5jbHVkZSAiLi4vLi4vLi4vY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0KLSNkZWZpbmUgSlNfR0xPQkFMREFUQV9UWVBFX05VTUJFUgkJMAotI2RlZmluZSBKU19HTE9CQUxEQVRBX1RZUEVfQk9PTEVBTgkJMQotI2RlZmluZSBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HCQkyCi0jZGVmaW5lIEpTX0dMT0JBTERBVEFfVFlQRV9PQkpFQ1QJCTMKLSNkZWZpbmUgSlNfR0xPQkFMREFUQV9UWVBFX05VTEwJCQk0Ci0KLWNsYXNzIENKU19LZXlWYWx1ZTsKLWNsYXNzIENQREZEb2NfRW52aXJvbm1lbnQ7Ci0KLWNsYXNzIENKU19HbG9iYWxWYXJpYWJsZUFycmF5Ci17Ci1wdWJsaWM6Ci0JQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkoKTsKLQl2aXJ0dWFsIH5DSlNfR2xvYmFsVmFyaWFibGVBcnJheSgpOwotCi0Jdm9pZAkJCUFkZChDSlNfS2V5VmFsdWUqIHApOwotCWludAkJCQlDb3VudCgpIGNvbnN0OwotCUNKU19LZXlWYWx1ZSoJR2V0QXQoaW50IGluZGV4KSBjb25zdDsKLQl2b2lkCQkJQ29weShjb25zdCBDSlNfR2xvYmFsVmFyaWFibGVBcnJheSYgYXJyYXkpOwotCi0Jdm9pZAkJCUVtcHR5KCk7Ci0KLXByaXZhdGU6Ci0JQ0ZYX0FycmF5VGVtcGxhdGU8Q0pTX0tleVZhbHVlKj4gYXJyYXk7Ci19OwotCi1jbGFzcyBDSlNfS2V5VmFsdWUKLXsKLXB1YmxpYzoKLQlDSlNfS2V5VmFsdWUoKXt9Ci0JdmlydHVhbCB+Q0pTX0tleVZhbHVlKCl7fQotCi0JQ0ZYX0J5dGVTdHJpbmcJCQkJCXNLZXk7Ci0JaW50CQkJCQkJCQluVHlwZTsgLy8wOmludCAxOmJvb2wgMjpzdHJpbmcgMzpvYmoKLQlkb3VibGUJCQkJCQkJZERhdGE7Ci0JYm9vbAkJCQkJCQliRGF0YTsKLQlDRlhfQnl0ZVN0cmluZwkJCQkJc0RhdGE7Ci0JQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkJCQlvYmpEYXRhOwotfTsKLQotY2xhc3MgQ0pTX0dsb2JhbERhdGFfRWxlbWVudAotewotcHVibGljOgotCUNKU19HbG9iYWxEYXRhX0VsZW1lbnQoKXt9Ci0JdmlydHVhbCB+Q0pTX0dsb2JhbERhdGFfRWxlbWVudCgpe30KLQotCUNKU19LZXlWYWx1ZQkJCWRhdGE7Ci0JRlhfQk9PTAkJCQkJYlBlcnNpc3RlbnQ7Ci19OwotCi1jbGFzcyBDSlNfR2xvYmFsRGF0YQotewotcHVibGljOgotCUNKU19HbG9iYWxEYXRhKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApOwotCXZpcnR1YWwgfkNKU19HbG9iYWxEYXRhKCk7Ci0KLXB1YmxpYzoKLQl2b2lkCQkJCQkJCQlTZXRHbG9iYWxWYXJpYWJsZU51bWJlcihGWF9MUENTVFIgcHJvcG5hbWUsIGRvdWJsZSBkRGF0YSk7Ci0Jdm9pZAkJCQkJCQkJU2V0R2xvYmFsVmFyaWFibGVCb29sZWFuKEZYX0xQQ1NUUiBwcm9wbmFtZSwgYm9vbCBiRGF0YSk7Ci0Jdm9pZAkJCQkJCQkJU2V0R2xvYmFsVmFyaWFibGVTdHJpbmcoRlhfTFBDU1RSIHByb3BuYW1lLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0RhdGEpOwotCXZvaWQJCQkJCQkJCVNldEdsb2JhbFZhcmlhYmxlT2JqZWN0KEZYX0xQQ1NUUiBwcm9wbmFtZSwgY29uc3QgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkmIGFycmF5KTsKLQl2b2lkCQkJCQkJCQlTZXRHbG9iYWxWYXJpYWJsZU51bGwoRlhfTFBDU1RSIHByb3BuYW1lKTsKLQotCUZYX0JPT0wJCQkJCQkJCVNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChGWF9MUENTVFIgcHJvcG5hbWUsIEZYX0JPT0wgYlBlcnNpc3RlbnQpOwotCUZYX0JPT0wJCQkJCQkJCURlbGV0ZUdsb2JhbFZhcmlhYmxlKEZYX0xQQ1NUUiBwcm9wbmFtZSk7Ci0JCi0JRlhfSU5UMzIJCQkJCQkJR2V0U2l6ZSgpIGNvbnN0OwotCUNKU19HbG9iYWxEYXRhX0VsZW1lbnQqCQkJCUdldEF0KGludCBpbmRleCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0Jdm9pZAkJCQkJCQkJTG9hZEdsb2JhbFBlcnNpc3RlbnRWYXJpYWJsZXMoKTsKLQl2b2lkCQkJCQkJCQlTYXZlR2xvYmFsUGVyc2lzaXRlbnRWYXJpYWJsZXMoKTsKLQkKLQlDSlNfR2xvYmFsRGF0YV9FbGVtZW50KgkJCQlHZXRHbG9iYWxWYXJpYWJsZShGWF9MUENTVFIgcHJvcG5hbWUpOwkKLQlpbnQJCQkJCQkJCQlGaW5kR2xvYmFsVmFyaWFibGUoRlhfTFBDU1RSIHByb3BuYW1lKTsKLQotCXZvaWQJCQkJCQkJCUxvYWRGaWxlQnVmZmVyKEZYX0xQQ1dTVFIgc0ZpbGVQYXRoLCBGWF9MUEJZVEUmIHBCdWZmZXIsIEZYX0lOVDMyJiBuTGVuZ3RoKTsKLQl2b2lkCQkJCQkJCQlXcml0ZUZpbGVCdWZmZXIoRlhfTFBDV1NUUiBzRmlsZVBhdGgsIEZYX0xQQ1NUUiBwQnVmZmVyLCBGWF9JTlQzMiBuTGVuZ3RoKTsKLQl2b2lkCQkJCQkJCQlNYWtlQnl0ZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgQ0pTX0tleVZhbHVlKiBwRGF0YSwgQ0ZYX0JpbmFyeUJ1ZiYgc0RhdGEpOwotCi1wcml2YXRlOgotCUNGWF9BcnJheVRlbXBsYXRlPENKU19HbG9iYWxEYXRhX0VsZW1lbnQqPgltX2FycmF5R2xvYmFsRGF0YTsKLQlDRlhfV2lkZVN0cmluZwkJCQkJCQkJbV9zRmlsZVBhdGg7Ci19OwotCi0jZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0pTX0dMT0JBTERBVEFfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX09iamVjdC5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MjhmMmUuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0pTX09CSkVDVF9IXwotI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfSkFWQVNDUklQVF9KU19PQkpFQ1RfSF8KLQotI2luY2x1ZGUgIi4uL2ZzZGtfZGVmaW5lLmgiICAvLyBGb3IgRlhfVUlOVAotI2luY2x1ZGUgIi4uL2ZzZGtfbWdyLmgiICAvLyBGb3IgQ1BERkRvY19FbnZpcm9ubWVudAotI2luY2x1ZGUgIi4uL2Z4X3N5c3RlbWhhbmRsZXIuaCIgIC8vIEZvciBJRlhfU3lzdGVtSGFuZGxlcgotI2luY2x1ZGUgIi4uL2pzYXBpL2Z4anNfdjguaCIKLQotY2xhc3MgQ1BERlNES19QYWdlVmlldzsKLWNsYXNzIENKU19PYmplY3Q7Ci1jbGFzcyBDSlNfVGltZXI7Ci1jbGFzcyBDSlNfQ29udGV4dDsKLQotY2xhc3MgQ0pTX0VtYmVkT2JqIAotewotcHVibGljOgotCUNKU19FbWJlZE9iaihDSlNfT2JqZWN0KiBwSlNPYmplY3QpOwotCXZpcnR1YWwgfkNKU19FbWJlZE9iaigpOwotCi0JdmlydHVhbCB2b2lkCQkJCVRpbWVyUHJvYyhDSlNfVGltZXIqIHBUaW1lcil7fTsKLQotCUNKU19UaW1lcioJCQkJCUJlZ2luVGltZXIoQ1BERkRvY19FbnZpcm9ubWVudCAqIHBBcHAsIEZYX1VJTlQgbkVsYXBzZSk7Ci0Jdm9pZAkJCQkJCUVuZFRpbWVyKENKU19UaW1lciogcFRpbWVyKTsKLQotCUNKU19PYmplY3QqCQkJCQlHZXRKU09iamVjdCgpe3JldHVybiBtX3BKU09iamVjdDt9OwotCW9wZXJhdG9yCQkJCQlDSlNfT2JqZWN0KiAoKXtyZXR1cm4gbV9wSlNPYmplY3Q7fTsKLQotCUNQREZTREtfUGFnZVZpZXcgKgkJCUpTR2V0UGFnZVZpZXcoSUZYSlNfQ29udGV4dCogY2MpOwotCWludAkJCQkJCQlNc2dCb3goQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9MUENXU1RSIHN3TXNnLCBGWF9MUENXU1RSIHN3VGl0bGUgPSBOVUxMLCBGWF9VSU5UIG5UeXBlID0gMCwgRlhfVUlOVCBuSWNvbiA9IDApOwotCXZvaWQJCQkJCQlBbGVydChDSlNfQ29udGV4dCogcENvbnRleHQsIEZYX0xQQ1dTVFIgc3dNc2cpOwotCi1wcm90ZWN0ZWQ6Ci0JQ0pTX09iamVjdCoJCQkJCW1fcEpTT2JqZWN0OwotfTsKLQotY2xhc3MgQ0pTX09iamVjdCAKLXsKLXB1YmxpYzoKLQlDSlNfT2JqZWN0KEpTRlhPYmplY3QgcE9iamVjdCk7Ci0JdmlydHVhbCB+Q0pTX09iamVjdCh2b2lkKTsKLQotCXZvaWQJCQkJCQlNYWtlV2VhaygpOwotICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwb3NlKCk7Ci0KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJSXNUeXBlKEZYX0xQQ1NUUiBzQ2xhc3NOYW1lKXtyZXR1cm4gVFJVRTt9OwotCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldENsYXNzTmFtZSgpe3JldHVybiAiIjt9OwotCi0JdmlydHVhbCBGWF9CT09MCQkJCUluaXRJbnN0YW5jZShJRlhKU19Db250ZXh0KiBjYyl7cmV0dXJuIFRSVUU7fTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJRXhpdEluc3RhbmNlKCl7cmV0dXJuIFRSVUU7fTsKLQotCW9wZXJhdG9yCQkJCQlKU0ZYT2JqZWN0ICgpIHtyZXR1cm4gdjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpOZXcobV9wSXNvbGF0ZSwgbV9wT2JqZWN0KTt9Ci0Jb3BlcmF0b3IJCQkJCUNKU19FbWJlZE9iaiogKCl7cmV0dXJuIG1fcEVtYmVkT2JqO307Ci0KLQl2b2lkCQkJCQkJU2V0RW1iZWRPYmplY3QoQ0pTX0VtYmVkT2JqKiBwT2JqKXttX3BFbWJlZE9iaiA9IHBPYmo7fTsKLQlDSlNfRW1iZWRPYmogKgkJCQlHZXRFbWJlZE9iamVjdCgpe3JldHVybiBtX3BFbWJlZE9iajt9OwotCi0Jc3RhdGljIENQREZTREtfUGFnZVZpZXcgKglKU0dldFBhZ2VWaWV3KElGWEpTX0NvbnRleHQqIGNjKTsKLQlzdGF0aWMgaW50CQkJCQlNc2dCb3goQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9MUENXU1RSIHN3TXNnLCBGWF9MUENXU1RSIHN3VGl0bGUgPSBOVUxMLCBGWF9VSU5UIG5UeXBlID0gMCxGWF9VSU5UIG5JY29uID0gMCk7Ci0Jc3RhdGljIHZvaWQJCQkJCUFsZXJ0KENKU19Db250ZXh0KiBwQ29udGV4dCwgRlhfTFBDV1NUUiBzd01zZyk7Ci0KLQl2ODo6SXNvbGF0ZSoJCQkJCUdldElzb2xhdGUoKSB7cmV0dXJuIG1fcElzb2xhdGU7fQotcHJvdGVjdGVkOgotCUNKU19FbWJlZE9iaiAqCQkJCW1fcEVtYmVkT2JqOwotCXY4OjpHbG9iYWw8djg6Ok9iamVjdD4JCQltX3BPYmplY3Q7Ci0Jdjg6Oklzb2xhdGUqCQkJCQltX3BJc29sYXRlOwotfTsKLQotc3RydWN0IEpTX1RJTUVSX01BUAotewotCUZYX1VJTlQgbklEOwotCUNKU19UaW1lciAqIHBUaW1lcjsKLX07Ci0KLXR5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8SlNfVElNRVJfTUFQKj4JQ1RpbWVyTWFwQXJyYXk7Ci0KLXN0cnVjdCBKU19USU1FUl9NQVBBUlJBWQotewotcHVibGljOgotCUpTX1RJTUVSX01BUEFSUkFZKCkKLQl7Ci0JfQotCi0JfkpTX1RJTUVSX01BUEFSUkFZKCkKLQl7Ci0JCVJlc2V0KCk7Ci0JfQotCi0Jdm9pZCBSZXNldCgpCi0JewotCQlmb3IgKGludCBpPTAsc3o9bV9BcnJheS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQkJCWRlbGV0ZSBtX0FycmF5LkdldEF0KGkpOwotCi0JCW1fQXJyYXkuUmVtb3ZlQWxsKCk7Ci0JfQotCi0Jdm9pZCBTZXRBdChGWF9VSU5UIG5JbmRleCxDSlNfVGltZXIgKiBwVGltZXIpCi0JewotCQlpbnQgaSA9IEZpbmQobkluZGV4KTsKLQotCQlpZiAoaT49MCkKLQkJewotCQkJaWYgKEpTX1RJTUVSX01BUCAqIHBNYXAgPSBtX0FycmF5LkdldEF0KGkpKQotCQkJCXBNYXAtPnBUaW1lciA9IHBUaW1lcjsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChKU19USU1FUl9NQVAgKiBwTWFwID0gbmV3IEpTX1RJTUVSX01BUCkKLQkJCXsKLQkJCQlwTWFwLT5uSUQgPSBuSW5kZXg7Ci0JCQkJcE1hcC0+cFRpbWVyID0gcFRpbWVyOwotCQkJCW1fQXJyYXkuQWRkKHBNYXApOwotCQkJfQotCQl9Ci0JfQotCi0JQ0pTX1RpbWVyICogR2V0QXQoRlhfVUlOVCBuSW5kZXgpCi0JewotCQlpbnQgaSA9IEZpbmQobkluZGV4KTsKLQotCQlpZiAoaT49MCkKLQkJewotCQkJaWYgKEpTX1RJTUVSX01BUCAqIHBNYXAgPSBtX0FycmF5LkdldEF0KGkpKQotCQkJCXJldHVybiBwTWFwLT5wVGltZXI7Ci0JCX0KLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0Jdm9pZCBSZW1vdmVBdChGWF9VSU5UIG5JbmRleCkKLQl7Ci0JCWludCBpID0gRmluZChuSW5kZXgpOwotCi0JCWlmIChpPj0wKQotCQl7Ci0JCQlkZWxldGUgbV9BcnJheS5HZXRBdChpKTsKLQkJCW1fQXJyYXkuUmVtb3ZlQXQoaSk7Ci0JCX0KLQkJLy9UbyBwcmV2ZW50IHBvdGVudGlhbCBmYWtlIG1lbW9yeSBsZWFrIHJlcG9ydGVkIGJ5IHZjNi4KLQkJaWYobV9BcnJheS5HZXRTaXplKCkgPT0gMCkKLQkJCW1fQXJyYXkuUmVtb3ZlQWxsKCk7Ci0JfQotCi0JaW50IEZpbmQoRlhfVUlOVCBuSW5kZXgpCi0JewotCQlmb3IgKGludCBpPTAsc3o9bV9BcnJheS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQkJewotCQkJaWYgKEpTX1RJTUVSX01BUCAqIHBNYXAgPSBtX0FycmF5LkdldEF0KGkpKQotCQkJewotCQkJCWlmIChwTWFwLT5uSUQgPT0gbkluZGV4KQotCQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQlDVGltZXJNYXBBcnJheQkJbV9BcnJheTsKLX07Ci0KLUpTX1RJTUVSX01BUEFSUkFZJiBHZXRUaW1lTWFwKCk7Ci0KLWNsYXNzIENKU19SdW50aW1lOwotCi1jbGFzcyBDSlNfVGltZXIKLXsKLXB1YmxpYzoKLQlDSlNfVGltZXIoQ0pTX0VtYmVkT2JqICogcE9iaixDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKToKLQkJbV9uVGltZXJJRCgwKSwKLQkJbV9wRW1iZWRPYmoocE9iaiksCi0JCW1fYlByb2Nlc3NpbmcoRkFMU0UpLAotCQltX2R3U3RhcnRUaW1lKDApLAotCQltX2R3VGltZU91dCgwKSwKLQkJbV9kd0VsYXBzZSgwKSwKLQkJbV9wUnVudGltZShOVUxMKSwKLQkJbV9uVHlwZSgwKSwKLQkJbV9wQXBwKHBBcHApCi0JewotCX0KLQotCXZpcnR1YWwgfkNKU19UaW1lcigpCi0JewotCQlLaWxsSlNUaW1lcigpOwotCX0KLQotcHVibGljOgotCUZYX1VJTlQgU2V0SlNUaW1lcihGWF9VSU5UIG5FbGFwc2UpCi0JewotCQlpZiAobV9uVGltZXJJRClLaWxsSlNUaW1lcigpOwotCQlJRlhfU3lzdGVtSGFuZGxlciogcEhhbmRsZXIgPSBtX3BBcHAtPkdldFN5c0hhbmRsZXIoKTsKLQkJbV9uVGltZXJJRCA9IHBIYW5kbGVyLT5TZXRUaW1lcihuRWxhcHNlLFRpbWVyUHJvYyk7Ci0JCUdldFRpbWVNYXAoKS5TZXRBdChtX25UaW1lcklELHRoaXMpOwotCQltX2R3RWxhcHNlID0gbkVsYXBzZTsKLQkJcmV0dXJuIG1fblRpbWVySUQ7Ci0JfTsKLQotCXZvaWQgS2lsbEpTVGltZXIoKQotCXsKLQkJaWYgKG1fblRpbWVySUQpCi0JCXsKLQkJCUlGWF9TeXN0ZW1IYW5kbGVyKiBwSGFuZGxlciA9IG1fcEFwcC0+R2V0U3lzSGFuZGxlcigpOwotCQkJcEhhbmRsZXItPktpbGxUaW1lcihtX25UaW1lcklEKTsKLQkJCUdldFRpbWVNYXAoKS5SZW1vdmVBdChtX25UaW1lcklEKTsKLQkJCW1fblRpbWVySUQgPSAwOwotCQl9Ci0JfTsKLQotCXZvaWQgU2V0VHlwZShpbnQgblR5cGUpCi0JewotCQltX25UeXBlID0gblR5cGU7Ci0JfQotCi0JaW50IEdldFR5cGUoKSBjb25zdAotCXsKLQkJcmV0dXJuIG1fblR5cGU7Ci0JfQotCi0Jdm9pZCBTZXRTdGFydFRpbWUoRlhfRFdPUkQgZHdTdGFydFRpbWUpCi0JewotCQltX2R3U3RhcnRUaW1lID0gZHdTdGFydFRpbWU7Ci0JfQotCi0JRlhfRFdPUkQgR2V0U3RhcnRUaW1lKCkgY29uc3QKLQl7Ci0JCXJldHVybiBtX2R3U3RhcnRUaW1lOwotCX0KLQotCXZvaWQgU2V0VGltZU91dChGWF9EV09SRCBkd1RpbWVPdXQpCi0JewotCQltX2R3VGltZU91dCA9IGR3VGltZU91dDsKLQl9Ci0KLQlGWF9EV09SRCBHZXRUaW1lT3V0KCkgY29uc3QKLQl7Ci0JCXJldHVybiBtX2R3VGltZU91dDsKLQl9Ci0KLQl2b2lkIFNldFJ1bnRpbWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKQotCXsKLQkJbV9wUnVudGltZSA9IHBSdW50aW1lOwotCX0KLQotCUNKU19SdW50aW1lKiBHZXRSdW50aW1lKCkgY29uc3QKLQl7Ci0JCXJldHVybiBtX3BSdW50aW1lOwotCX0KLQotCXZvaWQgU2V0SlNjcmlwdChjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0KQotCXsKLQkJbV9zd0pTY3JpcHQgPSBzY3JpcHQ7Ci0JfQotCi0JQ0ZYX1dpZGVTdHJpbmcgR2V0SlNjcmlwdCgpIGNvbnN0Ci0JewotCQlyZXR1cm4gbV9zd0pTY3JpcHQ7Ci0JfQotCi0Jc3RhdGljIHZvaWQgVGltZXJQcm9jKGludCBpZEV2ZW50KQotCXsKLQkJaWYgKENKU19UaW1lciAqIHBUaW1lciA9IEdldFRpbWVNYXAoKS5HZXRBdChpZEV2ZW50KSkKLQkJewotCQkJaWYgKCFwVGltZXItPm1fYlByb2Nlc3NpbmcpCi0JCQl7Ci0JCQkJcFRpbWVyLT5tX2JQcm9jZXNzaW5nID0gVFJVRTsKLQkJCQlpZiAocFRpbWVyLT5tX3BFbWJlZE9iaikgcFRpbWVyLT5tX3BFbWJlZE9iai0+VGltZXJQcm9jKHBUaW1lcik7Ci0JCQkJcFRpbWVyLT5tX2JQcm9jZXNzaW5nID0gRkFMU0U7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkvLwlUUkFDRShMIkJVU1khXG4iKTsKLQkJCX0KLQkJfQotCX07Ci0KLXByaXZhdGU6Ci0JRlhfVUlOVAkJCQkJCQltX25UaW1lcklEOwotCUNKU19FbWJlZE9iaioJCQkJCW1fcEVtYmVkT2JqOwotCUZYX0JPT0wJCQkJCQkJbV9iUHJvY2Vzc2luZzsKLQotCS8vZGF0YQotCUZYX0RXT1JECQkJCQkJCW1fZHdTdGFydFRpbWU7Ci0JRlhfRFdPUkQJCQkJCQkJbV9kd1RpbWVPdXQ7Ci0JRlhfRFdPUkQJCQkJCQltX2R3RWxhcHNlOwotCUNKU19SdW50aW1lKgkJCQkJbV9wUnVudGltZTsKLQlDRlhfV2lkZVN0cmluZwkJCQkJbV9zd0pTY3JpcHQ7Ci0JaW50CQkJCQkJCQltX25UeXBlOyAvLzA6SW50ZXJ2YWw7IDE6VGltZU91dAotCi0JQ1BERkRvY19FbnZpcm9ubWVudCoJCQltX3BBcHA7Ci19OwotCi0jZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0pTX09CSkVDVF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfUnVudGltZS5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfUnVudGltZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzNlY2UzLi4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfSlNfUlVOVElNRV9IXwotI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfSkFWQVNDUklQVF9KU19SVU5USU1FX0hfCi0KLSNpbmNsdWRlICIuLi8uLi8uLi90aGlyZF9wYXJ0eS9iYXNlL25vbnN0ZF91bmlxdWVfcHRyLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0jaW5jbHVkZSAiLi4vanNhcGkvZnhqc192OC5oIgotI2luY2x1ZGUgIklKYXZhU2NyaXB0LmgiCi0jaW5jbHVkZSAiSlNfRXZlbnRIYW5kbGVyLmgiCi0KLWNsYXNzIENKU19Db250ZXh0OwotCi1jbGFzcyBDSlNfQXJyYXlCdWZmZXJBbGxvY2F0b3IgOiBwdWJsaWMgdjg6OkFycmF5QnVmZmVyOjpBbGxvY2F0b3IgewotICAgIHZvaWQqIEFsbG9jYXRlKHNpemVfdCBsZW5ndGgpIG92ZXJyaWRlOwotICAgIHZvaWQqIEFsbG9jYXRlVW5pbml0aWFsaXplZChzaXplX3QgbGVuZ3RoKSBvdmVycmlkZTsKLSAgICB2b2lkIEZyZWUodm9pZCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgb3ZlcnJpZGU7Ci19OwotCi1jbGFzcyBDSlNfRmllbGRFdmVudAotewotcHVibGljOgotCUNGWF9XaWRlU3RyaW5nCQlzVGFyZ2V0TmFtZTsKLQlKU19FVkVOVF9UCQkJZUV2ZW50VHlwZTsKLQlDSlNfRmllbGRFdmVudCoJCXBOZXh0OwotfTsKLQotY2xhc3MgQ0pTX1J1bnRpbWUgOiBwdWJsaWMgSUZYSlNfUnVudGltZQotewotcHVibGljOgotCUNKU19SdW50aW1lKENQREZEb2NfRW52aXJvbm1lbnQgKiBwQXBwKTsKLQl2aXJ0dWFsIH5DSlNfUnVudGltZSgpOwotCi0JdmlydHVhbCBJRlhKU19Db250ZXh0ICoJCQkJCU5ld0NvbnRleHQoKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJUmVsZWFzZUNvbnRleHQoSUZYSlNfQ29udGV4dCAqIHBDb250ZXh0KTsKLQl2aXJ0dWFsIElGWEpTX0NvbnRleHQqCQkJCQlHZXRDdXJyZW50Q29udGV4dCgpOwotCi0JdmlydHVhbCB2b2lkCQkJCQkJCVNldFJlYWRlckRvY3VtZW50KENQREZTREtfRG9jdW1lbnQgKnBSZWFkZXJEb2MpOwotCXZpcnR1YWwgQ1BERlNES19Eb2N1bWVudCAqCQkJCUdldFJlYWRlckRvY3VtZW50KCl7cmV0dXJuIG1fcERvY3VtZW50O30KLQotCUNQREZEb2NfRW52aXJvbm1lbnQgKgkJCQkJCQlHZXRSZWFkZXJBcHAoKXtyZXR1cm4gbV9wQXBwO30KLQotCUZYX0JPT0wJCQkJCQkJCQlJbml0SlNPYmplY3RzKCk7Ci0KLQlGWF9CT09MCQkJCQkJCQkJQWRkRXZlbnRUb0xvb3AoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNUYXJnZXROYW1lLCBKU19FVkVOVF9UIGVFdmVudFR5cGUpOwotCXZvaWQJCQkJCQkJCQlSZW1vdmVFdmVudEluTG9vcChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RhcmdldE5hbWUsIEpTX0VWRU5UX1QgZUV2ZW50VHlwZSk7Ci0Jdm9pZAkJCQkJCQkJCVJlbW92ZUV2ZW50c0luTG9vcChDSlNfRmllbGRFdmVudCogcFN0YXJ0KTsKLQotCXZvaWQJCQkJCQkJCQlCZWdpbkJsb2NrKCl7bV9iQmxvY2tpbmcgPSBUUlVFO30KLQl2b2lkCQkJCQkJCQkJRW5kQmxvY2soKXttX2JCbG9ja2luZyA9IEZBTFNFO30KLQlGWF9CT09MCQkJCQkJCQkJSXNCbG9ja2luZygpe3JldHVybiBtX2JCbG9ja2luZzt9Ci0KLQlvcGVyYXRvcgkJCQkJCQkJSUpTX1J1bnRpbWUqKCkge3JldHVybiAoSUpTX1J1bnRpbWUqKW1faXNvbGF0ZTt9Ci0Jdjg6Oklzb2xhdGUqCQkJCQkJCQlHZXRJc29sYXRlKCl7cmV0dXJuIG1faXNvbGF0ZTt9OwotCXZvaWQJCQkJCQkJCQlTZXRJc29sYXRlKHY4OjpJc29sYXRlKiBpc29sYXRlKXttX2lzb2xhdGUgPSBpc29sYXRlO30KLQotCXY4OjpMb2NhbDx2ODo6Q29udGV4dD4JCQkJCQkJTmV3SlNDb250ZXh0KCk7Ci1wcm90ZWN0ZWQ6Ci0JQ0ZYX0FycmF5VGVtcGxhdGU8Q0pTX0NvbnRleHQqPgkJbV9Db250ZXh0QXJyYXk7Ci0JQ1BERkRvY19FbnZpcm9ubWVudCoJCQkJCQkJbV9wQXBwOwotCUNQREZTREtfRG9jdW1lbnQqCQkJCQkJbV9wRG9jdW1lbnQ7Ci0JRlhfQk9PTAkJCQkJCQkJCW1fYkJsb2NraW5nOwotCUZYX0JPT0wJCQkJCQkJCQltX2JSZWdpc3RlcmVkOwotCUNKU19GaWVsZEV2ZW50KgkJCQkJCQltX3BGaWVsZEV2ZW50UGF0aDsKLQotCXY4OjpJc29sYXRlKiBtX2lzb2xhdGU7Ci0Jbm9uc3RkOjp1bmlxdWVfcHRyPENKU19BcnJheUJ1ZmZlckFsbG9jYXRvcj4gbV9wQXJyYXlCdWZmZXJBbGxvY2F0b3I7Ci0Jdjg6Okdsb2JhbDx2ODo6Q29udGV4dD4gbV9jb250ZXh0OwotfTsKLQotI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfSkFWQVNDUklQVF9KU19SVU5USU1FX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19WYWx1ZS5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfVmFsdWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ1YjczNi4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19WYWx1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfSlNfVkFMVUVfSF8KLSNkZWZpbmUgRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfSlNfVkFMVUVfSF8KLQotI2luY2x1ZGUgIi4uLy4uLy4uL2NvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgotI2luY2x1ZGUgIi4uL2pzYXBpL2Z4anNfdjguaCIKLQotY2xhc3MgQ0pTX0FycmF5OwotY2xhc3MgQ0pTX0RhdGU7Ci1jbGFzcyBDSlNfRG9jdW1lbnQ7Ci1jbGFzcyBDSlNfT2JqZWN0OwotCi1jbGFzcyBDSlNfVmFsdWUKLXsKLXB1YmxpYzoKLQlDSlNfVmFsdWUodjg6Oklzb2xhdGUqIGlzb2xhdGUpOwotCUNKU19WYWx1ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlLEZYSlNWQUxVRVRZUEUgdCk7Ci0JQ0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBjb25zdCBpbnQgJmlWYWx1ZSk7Ci0JQ0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBjb25zdCBkb3VibGUgJmRWYWx1ZSk7Ci0JQ0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBjb25zdCBmbG9hdCAmZlZhbHVlKTsKLQlDSlNfVmFsdWUodjg6Oklzb2xhdGUqIGlzb2xhdGUsIGNvbnN0IGJvb2wgJmJWYWx1ZSk7Ci0JQ0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBKU0ZYT2JqZWN0KTsKLQlDSlNfVmFsdWUodjg6Oklzb2xhdGUqIGlzb2xhdGUsIENKU19PYmplY3QqKTsKLSAgIAlDSlNfVmFsdWUodjg6Oklzb2xhdGUqIGlzb2xhdGUsIENKU19Eb2N1bWVudCopOwotCUNKU19WYWx1ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgRlhfTFBDU1RSIHBTdHIpOwotCUNKU19WYWx1ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgRlhfTFBDV1NUUiBwV3N0cik7Ci0JQ0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBDSlNfQXJyYXkmIGFycmF5KTsKLQotCX5DSlNfVmFsdWUoKTsKLQotCXZvaWQgU2V0TnVsbCgpOwotICAgIHZvaWQgQXR0YWNoKHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSxGWEpTVkFMVUVUWVBFIHQpOwotCXZvaWQgQXR0YWNoKENKU19WYWx1ZSAqcFZhbHVlKTsKLQl2b2lkIERldGFjaCgpOwotCi0KLQlpbnQgVG9JbnQoKSBjb25zdDsKLQlib29sIFRvQm9vbCgpIGNvbnN0OwotCWRvdWJsZSBUb0RvdWJsZSgpIGNvbnN0OwotCWZsb2F0ICBUb0Zsb2F0KCkgY29uc3Q7Ci0JQ0pTX09iamVjdCogVG9DSlNPYmplY3QoKSBjb25zdDsKLQlDRlhfV2lkZVN0cmluZyBUb0NGWFdpZGVTdHJpbmcoKSBjb25zdDsKLQlDRlhfQnl0ZVN0cmluZyBUb0NGWEJ5dGVTdHJpbmcoKSBjb25zdDsKLQl2ODo6TG9jYWw8djg6Ok9iamVjdD4gVG9WOE9iamVjdCgpIGNvbnN0OwotCXY4OjpMb2NhbDx2ODo6QXJyYXk+IFRvVjhBcnJheSgpIGNvbnN0OwotCXY4OjpMb2NhbDx2ODo6VmFsdWU+IFRvVjhWYWx1ZSgpIGNvbnN0OwotCi0Jdm9pZCBvcGVyYXRvciA9IChpbnQgaVZhbHVlKTsKLQl2b2lkIG9wZXJhdG9yID0gKGJvb2wgYlZhbHVlKTsKLQl2b2lkIG9wZXJhdG9yID0gKGRvdWJsZSk7Ci0Jdm9pZCBvcGVyYXRvciA9IChmbG9hdCk7Ci0Jdm9pZCBvcGVyYXRvciA9IChDSlNfT2JqZWN0Kik7Ci0Jdm9pZCBvcGVyYXRvciA9IChDSlNfRG9jdW1lbnQqKTsKLQl2b2lkIG9wZXJhdG9yID0gKHY4OjpMb2NhbDx2ODo6T2JqZWN0Pik7Ci0Jdm9pZCBvcGVyYXRvciA9IChDSlNfQXJyYXkgJik7Ci0Jdm9pZCBvcGVyYXRvciA9IChDSlNfRGF0ZSAmKTsKLQl2b2lkIG9wZXJhdG9yID0gKEZYX0xQQ1dTVFIgcFdzdHIpOwotCXZvaWQgb3BlcmF0b3IgPSAoRlhfTFBDU1RSIHBTdHIpOwotCXZvaWQgb3BlcmF0b3IgPSAoQ0pTX1ZhbHVlIHZhbHVlKTsKLQotCUZYX0JPT0wgSXNBcnJheU9iamVjdCgpIGNvbnN0OwotCUZYX0JPT0wJSXNEYXRlT2JqZWN0KCkgY29uc3Q7Ci0JRlhKU1ZBTFVFVFlQRSBHZXRUeXBlKCkgY29uc3Q7Ci0KLQlGWF9CT09MIENvbnZlcnRUb0FycmF5KENKU19BcnJheSAmKSBjb25zdDsKLQlGWF9CT09MIENvbnZlcnRUb0RhdGUoQ0pTX0RhdGUgJikgY29uc3Q7Ci0KLQl2ODo6SXNvbGF0ZSogR2V0SXNvbGF0ZSgpIHtyZXR1cm4gbV9pc29sYXRlO30KLXByb3RlY3RlZDoKLQl2ODo6TG9jYWw8djg6OlZhbHVlPiBtX3BWYWx1ZTsKLQlGWEpTVkFMVUVUWVBFIG1fZVR5cGU7Ci0Jdjg6Oklzb2xhdGUqIG1faXNvbGF0ZTsKLX07Ci0KLWNsYXNzIENKU19QYXJhbWV0ZXJzIDogcHVibGljIENGWF9BcnJheVRlbXBsYXRlPENKU19WYWx1ZT4KLXsKLXB1YmxpYzoKLQl2b2lkIHB1c2hfYmFjayhjb25zdCBDSlNfVmFsdWUmIG5ld0VsZW1lbnQpIHsKLQkJQ0ZYX0FycmF5VGVtcGxhdGU8Q0pTX1ZhbHVlPjo6QWRkKG5ld0VsZW1lbnQpOwotCX0KLQlpbnQgc2l6ZSgpIGNvbnN0IHsKLQkJcmV0dXJuIENGWF9BcnJheVRlbXBsYXRlPENKU19WYWx1ZT46OkdldFNpemUoKTsKLQl9Ci19OwotCi1jbGFzcyBDSlNfUHJvcFZhbHVlOiBwdWJsaWMgQ0pTX1ZhbHVlCi17Ci1wdWJsaWM6Ci0JQ0pTX1Byb3BWYWx1ZShjb25zdCBDSlNfVmFsdWUmKTsKLQlDSlNfUHJvcFZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlKTsKLQl+Q0pTX1Byb3BWYWx1ZSgpOwotcHVibGljOgotCUZYX0JPT0wgSXNTZXR0aW5nKCk7Ci0JRlhfQk9PTCBJc0dldHRpbmcoKTsKLQl2b2lkIG9wZXJhdG9yPDwoaW50KTsKLQl2b2lkIG9wZXJhdG9yPj4oaW50JikgY29uc3Q7Ci0Jdm9pZCBvcGVyYXRvcjw8KGJvb2wpOwotCXZvaWQgb3BlcmF0b3I+Pihib29sJikgY29uc3Q7Ci0Jdm9pZCBvcGVyYXRvcjw8KGRvdWJsZSk7Ci0Jdm9pZCBvcGVyYXRvcj4+KGRvdWJsZSYpIGNvbnN0OwotCXZvaWQgb3BlcmF0b3I8PChDSlNfT2JqZWN0KiBwT2JqKTsKLQl2b2lkIG9wZXJhdG9yPj4oQ0pTX09iamVjdComIHBwT2JqKSBjb25zdDsKLQl2b2lkIG9wZXJhdG9yPDwoQ0pTX0RvY3VtZW50KiBwSnNEb2MpOwotCXZvaWQgb3BlcmF0b3I+PihDSlNfRG9jdW1lbnQqJiBwcEpzRG9jKSBjb25zdDsKLQl2b2lkIG9wZXJhdG9yPDwoQ0ZYX0J5dGVTdHJpbmcpOwotCXZvaWQgb3BlcmF0b3I+PihDRlhfQnl0ZVN0cmluZyYpIGNvbnN0OwotCXZvaWQgb3BlcmF0b3I8PChDRlhfV2lkZVN0cmluZyk7Ci0Jdm9pZCBvcGVyYXRvcj4+KENGWF9XaWRlU3RyaW5nJikgY29uc3Q7Ci0Jdm9pZCBvcGVyYXRvcjw8KEZYX0xQQ1dTVFIgY19zdHJpbmcpOwotCXZvaWQgb3BlcmF0b3I8PChKU0ZYT2JqZWN0KTsKLQl2b2lkIG9wZXJhdG9yPj4oSlNGWE9iamVjdCYpIGNvbnN0OwotCXZvaWQgb3BlcmF0b3I+PihDSlNfQXJyYXkmIGFycmF5KSBjb25zdDsKLQl2b2lkIG9wZXJhdG9yPDwoQ0pTX0FycmF5JiBhcnJheSk7Ci0Jdm9pZCBvcGVyYXRvcjw8KENKU19EYXRlJiBkYXRlKTsKLQl2b2lkIG9wZXJhdG9yPj4oQ0pTX0RhdGUmIGRhdGUpIGNvbnN0OwotCW9wZXJhdG9yIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCkgY29uc3Q7Ci0Jdm9pZCBTdGFydFNldHRpbmcoKTsKLQl2b2lkIFN0YXJ0R2V0dGluZygpOwotcHJpdmF0ZToKLQlGWF9CT09MIG1fYklzU2V0dGluZzsKLX07Ci0KLWNsYXNzIENKU19BcnJheQotewotcHVibGljOgotCUNKU19BcnJheSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSk7Ci0JdmlydHVhbCB+Q0pTX0FycmF5KCk7Ci0KLQl2b2lkIEF0dGFjaCh2ODo6TG9jYWw8djg6OkFycmF5PiBwQXJyYXkpOwotCXZvaWQgR2V0RWxlbWVudCh1bnNpZ25lZCBpbmRleCxDSlNfVmFsdWUgJnZhbHVlKTsKLQl2b2lkIFNldEVsZW1lbnQodW5zaWduZWQgaW5kZXgsQ0pTX1ZhbHVlIHZhbHVlKTsKLSAgICBpbnQgR2V0TGVuZ3RoKCk7Ci0JRlhfQk9PTCBJc0F0dGFjaGVkKCk7Ci0Jb3BlcmF0b3Igdjg6OkxvY2FsPHY4OjpBcnJheT4oKTsKLQotCXY4OjpJc29sYXRlKiBHZXRJc29sYXRlKCkge3JldHVybiBtX2lzb2xhdGU7fQotcHJpdmF0ZToKLQl2ODo6TG9jYWw8djg6OkFycmF5PiBtX3BBcnJheTsKLQl2ODo6SXNvbGF0ZSogbV9pc29sYXRlOwotfTsKLQotY2xhc3MgQ0pTX0RhdGUKLXsKLWZyaWVuZCBjbGFzcyBDSlNfVmFsdWU7Ci1wdWJsaWM6Ci0JQ0pTX0RhdGUodjg6Oklzb2xhdGUqIGlzb2xhdGUpOwotCUNKU19EYXRlKHY4OjpJc29sYXRlKiBpc29sYXRlLGRvdWJsZSBkTXNlY190aW1lKTsKLQlDSlNfRGF0ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSxpbnQgeWVhciwgaW50IG1vbiwgaW50IGRheSxpbnQgaG91ciwgaW50IG1pbiwgaW50IHNlYyk7Ci0JdmlydHVhbCB+Q0pTX0RhdGUoKTsKLQl2b2lkIEF0dGFjaCh2ODo6TG9jYWw8djg6OlZhbHVlPiBwRGF0ZSk7Ci0KLQlpbnQgICAgIEdldFllYXIoKTsKLQl2b2lkICAgIFNldFllYXIoaW50IGlZZWFyKTsKLQotCWludCAgICAgR2V0TW9udGgoKTsKLQl2b2lkICAgIFNldE1vbnRoKGludCBpTW9udGgpOwotCi0JaW50ICAgICBHZXREYXkoKTsKLQl2b2lkICAgIFNldERheShpbnQgaURheSk7Ci0KLQlpbnQgICAgIEdldEhvdXJzKCk7Ci0Jdm9pZCAgICBTZXRIb3VycyhpbnQgaUhvdXJzKTsKLQotCWludCAgICAgR2V0TWludXRlcygpOwotCXZvaWQgICAgU2V0TWludXRlcyhpbnQgbWludXRlcyk7Ci0KLQlpbnQgICAgIEdldFNlY29uZHMoKTsKLQl2b2lkICAgIFNldFNlY29uZHMoaW50IHNlY29uZHMpOwotCi0Jb3BlcmF0b3Igdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKLQlvcGVyYXRvciBkb3VibGUoKSBjb25zdDsKLQotCUNGWF9XaWRlU3RyaW5nCVRvU3RyaW5nKCkgY29uc3Q7Ci0KLQlzdGF0aWMgZG91YmxlCU1ha2VEYXRlKGludCB5ZWFyLCBpbnQgbW9uLCBpbnQgbWRheSxpbnQgaG91ciwgaW50IG1pbiwgaW50IHNlYyxpbnQgbXMpOwotCi0JRlhfQk9PTAlJc1ZhbGlkRGF0ZSgpOwotCi1wcm90ZWN0ZWQ6Ci0Jdjg6OkxvY2FsPHY4OjpWYWx1ZT4gbV9wRGF0ZTsKLQl2ODo6SXNvbGF0ZSogbV9pc29sYXRlOwotfTsKLQotI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfSkFWQVNDUklQVF9KU19WQUxVRV9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSmF2YVNjcmlwdC5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSmF2YVNjcmlwdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmNiOWJhLi4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0phdmFTY3JpcHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBGUERGU0RLX0lOQ0xVREVfSkFWQVNDUklQVF9KQVZBU0NSSVBUX0hfCi0jZGVmaW5lIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0pBVkFTQ1JJUFRfSF8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICIuLi8uLi8uLi9jb3JlL2luY2x1ZGUvZmRybS9meF9jcnlwdC5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlb2JqLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9zZXJpYWwuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfdnQuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfeG1sLmgiCi0jaW5jbHVkZSAiLi4vZnNka19tZ3IuaCIKLSNpbmNsdWRlICIuLi9meF9zeXN0ZW1oYW5kbGVyLmgiCi0jaW5jbHVkZSAiLi4vZnhlZGl0L2Z4X2VkaXQuaCIKLSNpbmNsdWRlICIuLi9qc2FwaS9meGpzX3Y4LmgiCi0jaW5jbHVkZSAiLi4vcGRmd2luZG93L0lQREZXaW5kb3cuaCIKLQotI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfSkFWQVNDUklQVF9KQVZBU0NSSVBUX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NWFlMWYuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvUHVibGljTWV0aG9kcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfUFVCTElDTUVUSE9EU19IXwotI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfSkFWQVNDUklQVF9QVUJMSUNNRVRIT0RTX0hfCi0KLSNpbmNsdWRlICJKU19EZWZpbmUuaCIKLQotY2xhc3MgQ0pTX1B1YmxpY01ldGhvZHMgOiBwdWJsaWMgQ0pTX09iamVjdAotewotcHVibGljOgotCUNKU19QdWJsaWNNZXRob2RzKEpTRlhPYmplY3QgIHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fTsKLQl2aXJ0dWFsIH5DSlNfUHVibGljTWV0aG9kcyh2b2lkKXt9OwotCi1wdWJsaWM6Ci0Jc3RhdGljIEZYX0JPT0wgQUZOdW1iZXJfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGTnVtYmVyX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgRlhfQk9PTCBBRlBlcmNlbnRfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGUGVyY2VudF9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIEZYX0JPT0wgQUZEYXRlX0Zvcm1hdEV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGRGF0ZV9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgRlhfQk9PTCBBRkRhdGVfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGRGF0ZV9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIEZYX0JPT0wgQUZUaW1lX0Zvcm1hdEV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOyAvLwotCXN0YXRpYyBGWF9CT09MIEFGVGltZV9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgRlhfQk9PTCBBRlRpbWVfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGVGltZV9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIEZYX0JPT0wgQUZTcGVjaWFsX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgRlhfQk9PTCBBRlNwZWNpYWxfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGU3BlY2lhbF9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsvLwotCXN0YXRpYyBGWF9CT09MIEFGU2ltcGxlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGTWFrZU51bWJlcihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgRlhfQk9PTCBBRlNpbXBsZV9DYWxjdWxhdGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0Jc3RhdGljIEZYX0JPT0wgQUZSYW5nZV9WYWxpZGF0ZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlzdGF0aWMgRlhfQk9PTCBBRk1lcmdlQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOyAKLQlzdGF0aWMgRlhfQk9PTCBBRlBhcnNlRGF0ZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCXN0YXRpYyBGWF9CT09MIEFGRXh0cmFjdE51bXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0KLXB1YmxpYzoKLQlKU19TVEFUSUNfR0xPQkFMX0ZVTihBRk51bWJlcl9Gb3JtYXQpOwotCUpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGTnVtYmVyX0tleXN0cm9rZSk7Ci0JSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZQZXJjZW50X0Zvcm1hdCk7Ci0JSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZQZXJjZW50X0tleXN0cm9rZSk7Ci0JSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZEYXRlX0Zvcm1hdEV4KTsKLQlKU19TVEFUSUNfR0xPQkFMX0ZVTihBRkRhdGVfS2V5c3Ryb2tlRXgpOwotCUpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGRGF0ZV9Gb3JtYXQpOwotCUpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGRGF0ZV9LZXlzdHJva2UpOwotCUpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGVGltZV9Gb3JtYXRFeCk7Ci0JSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZUaW1lX0tleXN0cm9rZUV4KTsKLQlKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlRpbWVfRm9ybWF0KTsKLQlKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlRpbWVfS2V5c3Ryb2tlKTsKLQlKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlNwZWNpYWxfRm9ybWF0KTsKLQlKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlNwZWNpYWxfS2V5c3Ryb2tlKTsKLQlKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlNwZWNpYWxfS2V5c3Ryb2tlRXgpOwotCUpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGU2ltcGxlKTsKLQlKU19TVEFUSUNfR0xPQkFMX0ZVTihBRk1ha2VOdW1iZXIpOwkKLQlKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlNpbXBsZV9DYWxjdWxhdGUpOwotCUpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGUmFuZ2VfVmFsaWRhdGUpOwotCUpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGTWVyZ2VDaGFuZ2UpOwotCUpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGUGFyc2VEYXRlRXgpOwotCUpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGRXh0cmFjdE51bXMpOwotCi0JSlNfU1RBVElDX0RFQ0xBUkVfR0xPQkFMX0ZVTigpOwotCQotcHVibGljOgotCXN0YXRpYyBpbnQJCQkJUGFyc2VTdHJpbmdJbnRlZ2VyKGNvbnN0IENGWF9XaWRlU3RyaW5nICYgc3RyaW5nLGludCBuU3RhcnQsaW50ICYgblNraXAsIGludCBuTWF4U3RlcCk7Ci0Jc3RhdGljIENGWF9XaWRlU3RyaW5nCVBhcnNlU3RyaW5nU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcsIGludCBuU3RhcnQsIGludCYgblNraXApOwotCXN0YXRpYyBkb3VibGUJCQlNYWtlUmVndWxhckRhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiB2YWx1ZSxjb25zdCBDRlhfV2lkZVN0cmluZyAmIGZvcm1hdCwgRlhfQk9PTCYgYldyb25nRm9ybWF0KTsKLQlzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcJTWFrZUZvcm1hdERhdGUoZG91YmxlIGREYXRlLGNvbnN0IENGWF9XaWRlU3RyaW5nICYgZm9ybWF0KTsKLQlzdGF0aWMgRlhfQk9PTAkJCUNvbnZlcnRTdHJpbmdUb051bWJlcihGWF9MUENXU1RSIHN3U291cmNlLCBkb3VibGUgJiBkUmV0LCBGWF9CT09MICYgYkRvdCk7Ci0Jc3RhdGljIGRvdWJsZQkJCVBhcnNlU3RyaW5nVG9OdW1iZXIoRlhfTFBDV1NUUiBzd1NvdXJjZSk7Ci0Jc3RhdGljIGRvdWJsZQkJCVBhcnNlTm9ybWFsRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmIHZhbHVlLCBGWF9CT09MJiBiV3JvbmdGb3JtYXQpOwotCXN0YXRpYyBkb3VibGUgICAgICAgICAgIE1ha2VJbnRlckRhdGUoQ0ZYX1dpZGVTdHJpbmcgc3RyVmFsdWUpOwotCXN0YXRpYyBkb3VibGUJCQlQYXJzZU51bWJlcihGWF9MUENXU1RSIHN3U291cmNlLCBGWF9CT09MJiBiQWxsRGlnaXRzLCBGWF9CT09MJiBiRG90LCBGWF9CT09MJiBiU2lnbiwgRlhfQk9PTCYgYktYSlMpOwotCi1wdWJsaWM6Ci0Jc3RhdGljIENGWF9XaWRlU3RyaW5nCVN0ckxUcmltKEZYX0xQQ1dTVFIgcFN0cik7Ci0Jc3RhdGljIENGWF9XaWRlU3RyaW5nCVN0clJUcmltKEZYX0xQQ1dTVFIgcFN0cik7Ci0Jc3RhdGljIENGWF9XaWRlU3RyaW5nCVN0clRyaW0oRlhfTFBDV1NUUiBwU3RyKTsKLQotCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwlTdHJMVHJpbShGWF9MUENTVFIgcFN0cik7Ci0Jc3RhdGljIENGWF9CeXRlU3RyaW5nCVN0clJUcmltKEZYX0xQQ1NUUiBwU3RyKTsKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJU3RyVHJpbShGWF9MUENTVFIgcFN0cik7Ci0KLQlzdGF0aWMgRlhfQk9PTAkJCUlzTnVtYmVyKEZYX0xQQ1NUUiBzdHJpbmcpOwotCXN0YXRpYyBGWF9CT09MCQkJSXNOdW1iZXIoRlhfTFBDV1NUUiBzdHJpbmcpOwotCi0Jc3RhdGljIEZYX0JPT0wJCQlJc0RpZ2l0KGNoYXIgY2gpOwotCXN0YXRpYyBGWF9CT09MCQkJSXNEaWdpdCh3Y2hhcl90IGNoKTsKLQlzdGF0aWMgRlhfQk9PTAkJCUlzQWxwaGFiZXRpYyh3Y2hhcl90IGNoKTsKLQlzdGF0aWMgRlhfQk9PTAkJCUlzQWxwaGFOdW1lcmljKHdjaGFyX3QgY2gpOwotCi0Jc3RhdGljIEZYX0JPT0wJCQltYXNrU2F0aXNmaWVkKHdjaGFyX3QgY19DaGFuZ2Usd2NoYXJfdCBjX01hc2spOwotCXN0YXRpYyBGWF9CT09MCQkJaXNSZXNlcnZlZE1hc2tDaGFyKHdjaGFyX3QgY2gpOwotCi0Jc3RhdGljIGRvdWJsZQkJCUFGX1NpbXBsZShGWF9MUENXU1RSIHNGdWN0aW9uLCBkb3VibGUgZFZhbHVlMSwgZG91YmxlIGRWYWx1ZTIpOwotCXN0YXRpYyBDSlNfQXJyYXkJCUFGX01ha2VBcnJheUZyb21MaXN0KHY4OjpJc29sYXRlKiBpc29sYXRlLCBDSlNfVmFsdWUgdmFsKTsKLX07Ci0KLSNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfUFVCTElDTUVUSE9EU19IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvYXBwLmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9hcHAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U1MWY3My4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9hcHAuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0FQUF9IXwotI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfSkFWQVNDUklQVF9BUFBfSF8KLQotI2luY2x1ZGUgIkpTX0RlZmluZS5oIgotCi1jbGFzcyBDSlNfUnVudGltZTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUaW1lck9iaiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLWNsYXNzIENKU19UaW1lcjsKLQotY2xhc3MgVGltZXJPYmogOiBwdWJsaWMgQ0pTX0VtYmVkT2JqCi17Ci1wdWJsaWM6Ci0JVGltZXJPYmooQ0pTX09iamVjdCogcEpTT2JqZWN0KTsKLQl2aXJ0dWFsIH5UaW1lck9iaigpOwotCQotcHVibGljOgotCXZvaWQJCQlTZXRUaW1lcihDSlNfVGltZXIqIHBUaW1lcik7Ci0JQ0pTX1RpbWVyKgkJR2V0VGltZXIoKSBjb25zdDsKLQkKLXByaXZhdGU6Ci0JQ0pTX1RpbWVyKgkJbV9wVGltZXI7Ci19OwotCi1jbGFzcyBDSlNfVGltZXJPYmogOiBwdWJsaWMgQ0pTX09iamVjdAotewotcHVibGljOgotCUNKU19UaW1lck9iaihKU0ZYT2JqZWN0IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQotCXZpcnR1YWwgfkNKU19UaW1lck9iaigpe30KLQkKLQlERUNMQVJFX0pTX0NMQVNTKENKU19UaW1lck9iaik7Ci19OwotCi0KLS8vIHN0cnVjdCBBUFBfTUVOVUlURU1fQVJSQVk7Ci0vLyAKLS8vIHN0cnVjdCBBUFBfTUVOVUlURU0KLS8vIHsKLS8vIAlBUFBfTUVOVUlURU0oKSA6IG9TdWJNZW51KE5VTEwpLCBjTmFtZShMIiIpLCBjUmV0dXJuKEwiIiksIGJNYXJrZWQoZmFsc2UpLCBiRW5hYmxlZCh0cnVlKQotLy8gCXsKLS8vIAl9Ci0vLyAJQ0ZYX1dpZGVTdHJpbmcgY05hbWU7Ci0vLyAJQ0ZYX1dpZGVTdHJpbmcgY1JldHVybjsKLS8vIAlBUFBfTUVOVUlURU1fQVJSQVkqIG9TdWJNZW51OwotLy8gCWJvb2wgYk1hcmtlZDsKLS8vIAlib29sIGJFbmFibGVkOwotLy8gfTsKLQotLy8gc3RydWN0IEFQUF9NRU5VSVRFTV9BUlJBWQotLy8gewotLy8gCUFQUF9NRU5VSVRFTV9BUlJBWSgpIDogbV9oTWVudShOVUxMKSwgcENvbnRlbnRzKE5VTEwpLCBuU2l6ZSgwKQotLy8gCXsKLS8vIAotLy8gCX0KLS8vIAlBUFBfTUVOVUlURU0gKiBwQ29udGVudHM7Ci0vLyAJSE1FTlUgbV9oTWVudTsKLS8vIAlpbnQJblNpemU7Ci0vLyB9OwotCi0vLyBzdHJ1Y3QgQVBQX01FTlU7Ci0vLyBzdHJ1Y3QgQVBQX01FTlVfQVJSQVkKLS8vIHsKLS8vIAlBUFBfTUVOVV9BUlJBWSgpOgotLy8gICAgIHBDb250ZW50KE5VTEwpCi0vLyAJewotLy8gCX0KLS8vIAotLy8gCUFQUF9NRU5VKiBwQ29udGVudDsKLS8vIH07Ci0KLS8vIHN0cnVjdCBBUFBfTUVOVQotLy8gewotLy8gCUFQUF9NRU5VKCk6YlN1Yk1lbnUoZmFsc2UpLCAKLS8vIAlTdWJNZW51SXRlbXMoTlVMTCksCi0vLyAJY3dNZW51SXRlbU5hbWUoTCIiKSwKLS8vIAloTWVudShOVUxMKSwKLS8vIAlpU2l6ZSgwKQotLy8gCXsKLS8vIAotLy8gCX0KLS8vIAotLy8gCUFQUF9NRU5VKENGWF9XaWRlU3RyaW5nICZjd05hbWUpOgotLy8gCWN3TWVudUl0ZW1OYW1lKGN3TmFtZSksCi0vLyAJYlN1Yk1lbnUoZmFsc2UpLAotLy8gCVN1Yk1lbnVJdGVtcyhOVUxMKSwKLS8vIAloTWVudShOVUxMKSwKLS8vIAlpU2l6ZSgwKQotLy8gCXsKLS8vIAotLy8gCX0KLS8vIAkKLS8vIAlDRlhfV2lkZVN0cmluZyBjd01lbnVJdGVtTmFtZTsKLS8vIAlib29sIGJTdWJNZW51OwkKLS8vIAlBUFBfTUVOVV9BUlJBWSogU3ViTWVudUl0ZW1zOwotLy8gCWludCBpU2l6ZTsKLS8vIAlITUVOVSBoTWVudTsKLS8vIH07Ci0KLWNsYXNzIGFwcCA6IHB1YmxpYyBDSlNfRW1iZWRPYmoKLXsKLXB1YmxpYzoKLQlhcHAoQ0pTX09iamVjdCAqIHBKU09iamVjdCk7Ci0JdmlydHVhbCB+YXBwKCk7Ci0KLXB1YmxpYzoKLQlGWF9CT09MCQkJCQkJYWN0aXZlRG9jcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQljYWxjdWxhdGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJZm9ybXNWZXJzaW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCWZzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCWZ1bGxzY3JlZW4oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJbGFuZ3VhZ2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJbWVkaWEoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJcGxhdGZvcm0oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJcnVudGltZUhpZ2hsaWdodChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQl2aWV3ZXJUeXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCXZpZXdlclZhcmlhdGlvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQl2aWV3ZXJWZXJzaW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CQotCi0KLQlGWF9CT09MCQkJCQkJYWxlcnQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCWJlZXAoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCWJyb3dzZUZvckRvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJY2xlYXJJbnRlcnZhbChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJY2xlYXJUaW1lT3V0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQlleGVjRGlhbG9nKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQlleGVjTWVudUl0ZW0oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCWZpbmRDb21wb25lbnQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCWdvQmFjayhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJZ29Gb3J3YXJkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQlsYXVuY2hVUkwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCW1haWxNc2coSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCW5ld0ZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJbmV3RG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQlvcGVuRG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQlvcGVuRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQlwb3BVcE1lbnVFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJcG9wVXBNZW51KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wJCQkJCQlyZXNwb25zZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJc2V0SW50ZXJ2YWwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTAkJCQkJCXNldFRpbWVPdXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0KLXByaXZhdGU6Ci0vLwlGWF9EV09SRAkJCQkJQXBwR2V0VGlja0NvdW50KCk7IAotCXZvaWQJCQkJCQlUaW1lclByb2MoQ0pTX1RpbWVyKiBwVGltZXIpOwotCXZvaWQJCQkJCQlSdW5Kc1NjcmlwdChDSlNfUnVudGltZSAqIHBSdW50aW1lLGNvbnN0IENGWF9XaWRlU3RyaW5nICYgd3NTY3JpcHQpOwotLy8Jdm9pZAkJCQkJCVBhcnNlUG9wdXBNZW51T2JqKEFQUF9NRU5VSVRFTSAqIHBwTWVudUl0ZW0sSlNPYmplY3QgKiBwT2JqKTsKLS8vCXZvaWQJCQkJCQlEZWxldGVNZW51SXRlbXMoQVBQX01FTlVJVEVNX0FSUkFZICogcE1lbnVJdGVtcyk7Ci0vLyAJdm9pZAkJCQkJCUFkZE1lbnVJdGVtKEFQUF9NRU5VSVRFTV9BUlJBWSAqIHBNZW51SXRlbXMsIEhNRU5VIGhNZW51LCBNRU5VSVRFTUlORk8gTWVudUl0ZW1JbmZvKTsKLS8vIAl2b2lkCQkJCQkJSW5pdE1lbnVJdGVtSW5mbyhNRU5VSVRFTUlORk8mIE1lbnVJdGVtSW5mbyk7Ci0vLyAJdm9pZAkJCQkJCURlc3Ryb3lQb3BVcE1lbnUoKTsKLQotLy8gCXZvaWQJCQkJCQlQYXJzZXJNZW51SXRlbShBUFBfTUVOVSogcEhlYWQsIGNvbnN0IENKU19QYXJhbWV0ZXJzJnBhcmFtcyk7Ci0vLyAJdm9pZAkJCQkJCUFkZEl0ZW1Ub01lbnUoQVBQX01FTlUqIHBIZWFkLCBITUVOVSBoTWVudSwgTUVOVUlURU1JTkZPIE1lbnVJdGVtSW5mbyk7Ci0vLyAJdm9pZAkJCQkJCURlc3Ryb3lNZW51SXRlbXMoQVBQX01FTlUqIHBIZWFkKTsKLQotcHVibGljOgotCXN0YXRpYyBDRlhfV2lkZVN0cmluZwkJU3lzUGF0aFRvUERGUGF0aChjb25zdCBDRlhfV2lkZVN0cmluZyYgc09sZFBhdGgpOwotCi1wcml2YXRlOgotCi0JYm9vbAkJCQkJCW1fYkNhbGN1bGF0ZTsJCi0JYm9vbAkJCQkJCW1fYlJ1bnRpbWVIaWdoTGlnaHQ7Ci0KLQlDRlhfQXJyYXlUZW1wbGF0ZTxDSlNfVGltZXIqPgltX2FUaW1lcjsKLS8vCUFQUF9NRU5VKgkJCQkJbV9wTWVudUhlYWQ7Ci0JCi1wdWJsaWM6Ci0vLwlzdGF0aWMgQ1JlYWRlcl9BcHAqIHNfQXBwOwotfTsKLQotY2xhc3MgQ0pTX0FwcCA6IHB1YmxpYyBDSlNfT2JqZWN0Ci17Ci1wdWJsaWM6Ci0JQ0pTX0FwcChKU0ZYT2JqZWN0ICBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge307Ci0JdmlydHVhbCB+Q0pTX0FwcCh2b2lkKXt9OwotCi0JREVDTEFSRV9KU19DTEFTUyhDSlNfQXBwKTsKLQotCUpTX1NUQVRJQ19QUk9QKGFjdGl2ZURvY3MsIGFwcCk7Ci0JSlNfU1RBVElDX1BST1AoY2FsY3VsYXRlLCBhcHApOwotCUpTX1NUQVRJQ19QUk9QKGZvcm1zVmVyc2lvbiwgYXBwKTsKLQlKU19TVEFUSUNfUFJPUChmcywgYXBwKTsKLQlKU19TVEFUSUNfUFJPUChmdWxsc2NyZWVuLCBhcHApOwotCUpTX1NUQVRJQ19QUk9QKGxhbmd1YWdlLCBhcHApOwotCUpTX1NUQVRJQ19QUk9QKG1lZGlhLCBhcHApOwotCUpTX1NUQVRJQ19QUk9QKHBsYXRmb3JtLCBhcHApOwotCUpTX1NUQVRJQ19QUk9QKHJ1bnRpbWVIaWdobGlnaHQsIGFwcCk7Ci0JSlNfU1RBVElDX1BST1Aodmlld2VyVHlwZSwgYXBwKTsKLQlKU19TVEFUSUNfUFJPUCh2aWV3ZXJWYXJpYXRpb24sIGFwcCk7Ci0JSlNfU1RBVElDX1BST1Aodmlld2VyVmVyc2lvbiwgYXBwKTsJCi0KLQlKU19TVEFUSUNfTUVUSE9EKGFsZXJ0LCBhcHApOwotCUpTX1NUQVRJQ19NRVRIT0QoYmVlcCwgYXBwKTsKLQlKU19TVEFUSUNfTUVUSE9EKGJyb3dzZUZvckRvYywgYXBwKTsKLQlKU19TVEFUSUNfTUVUSE9EKGNsZWFySW50ZXJ2YWwsIGFwcCk7Ci0JSlNfU1RBVElDX01FVEhPRChjbGVhclRpbWVPdXQsIGFwcCk7Ci0JSlNfU1RBVElDX01FVEhPRChleGVjRGlhbG9nLCBhcHApOwotCUpTX1NUQVRJQ19NRVRIT0QoZXhlY01lbnVJdGVtLCBhcHApOwotCUpTX1NUQVRJQ19NRVRIT0QoZmluZENvbXBvbmVudCwgYXBwKTsKLQlKU19TVEFUSUNfTUVUSE9EKGdvQmFjaywgYXBwKTsKLQlKU19TVEFUSUNfTUVUSE9EKGdvRm9yd2FyZCwgYXBwKTsKLQlKU19TVEFUSUNfTUVUSE9EKGxhdW5jaFVSTCwgYXBwKTsKLQlKU19TVEFUSUNfTUVUSE9EKG1haWxNc2csIGFwcCk7Ci0JSlNfU1RBVElDX01FVEhPRChuZXdGREYsIGFwcCk7Ci0JSlNfU1RBVElDX01FVEhPRChuZXdEb2MsIGFwcCk7Ci0JSlNfU1RBVElDX01FVEhPRChvcGVuRG9jLCBhcHApOwotCUpTX1NUQVRJQ19NRVRIT0Qob3BlbkZERiwgYXBwKTsKLQlKU19TVEFUSUNfTUVUSE9EKHBvcFVwTWVudUV4LCBhcHApOwotCUpTX1NUQVRJQ19NRVRIT0QocG9wVXBNZW51LCBhcHApOwotCUpTX1NUQVRJQ19NRVRIT0QocmVzcG9uc2UsIGFwcCk7Ci0JSlNfU1RBVElDX01FVEhPRChzZXRJbnRlcnZhbCwgYXBwKTsKLQlKU19TVEFUSUNfTUVUSE9EKHNldFRpbWVPdXQsIGFwcCk7Ci0KLX07Ci0KLSNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfQVBQX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9jb2xvci5oIGIvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvY29sb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFhYjc2Zi4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9jb2xvci5oCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBGUERGU0RLX0lOQ0xVREVfSkFWQVNDUklQVF9DT0xPUl9IXwotI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfSkFWQVNDUklQVF9DT0xPUl9IXwotCi0jaW5jbHVkZSAiSlNfRGVmaW5lLmgiCi0vLyBUT0RPKHRzZXBleik6IGluY2x1ZGUgQ1BXTF9Db2xvci5oIG9uY2UgaXRzIG93biBJV1lVIGlzIGZpeGVkLgotCi1jbGFzcyBjb2xvciA6IHB1YmxpYyBDSlNfRW1iZWRPYmoKLXsKLXB1YmxpYzoKLQljb2xvcihDSlNfT2JqZWN0KiBwSlNPYmplY3QpOwotCXZpcnR1YWwgfmNvbG9yKHZvaWQpOwotCi0JRlhfQk9PTCBibGFjayhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgYmx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgY3lhbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwkKLQlGWF9CT09MIGRrR3JheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZ3JheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZ3JlZW4oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGx0R3JheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgbWFnZW50YShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgcmVkKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CQotCUZYX0JPT0wgdHJhbnNwYXJlbnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHdoaXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCB5ZWxsb3coSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQotCUZYX0JPT0wgY29udmVydChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGVxdWFsKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCi1wdWJsaWM6ICAKLQlzdGF0aWMgdm9pZAkJQ29udmVydFBXTENvbG9yVG9BcnJheShjb25zdCBDUFdMX0NvbG9yJiBjb2xvciwgQ0pTX0FycmF5JiBhcnJheSk7Ci0Jc3RhdGljIHZvaWQJCUNvbnZlcnRBcnJheVRvUFdMQ29sb3IoQ0pTX0FycmF5JiBhcnJheSwgQ1BXTF9Db2xvciYgY29sb3IpOwotCi1wcml2YXRlOgotCUNQV0xfQ29sb3IJCW1fY3JUcmFuc3BhcmVudDsKLQlDUFdMX0NvbG9yCQltX2NyQmxhY2s7Ci0JQ1BXTF9Db2xvcgkJbV9jcldoaXRlOwotCUNQV0xfQ29sb3IJCW1fY3JSZWQ7Ci0JQ1BXTF9Db2xvcgkJbV9jckdyZWVuOwotCUNQV0xfQ29sb3IJCW1fY3JCbHVlOwotCUNQV0xfQ29sb3IJCW1fY3JDeWFuOwotCUNQV0xfQ29sb3IJCW1fY3JNYWdlbnRhOwotCUNQV0xfQ29sb3IJCW1fY3JZZWxsb3c7Ci0JQ1BXTF9Db2xvcgkJbV9jckRLR3JheTsKLQlDUFdMX0NvbG9yCQltX2NyR3JheTsKLQlDUFdMX0NvbG9yCQltX2NyTFRHcmF5OwotfTsKLQotY2xhc3MgQ0pTX0NvbG9yIDogcHVibGljIENKU19PYmplY3QKLXsKLXB1YmxpYzoKLQlDSlNfQ29sb3IoSlNGWE9iamVjdCAgcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9OwotCXZpcnR1YWwgfkNKU19Db2xvcih2b2lkKXt9OwotCi0JREVDTEFSRV9KU19DTEFTUyhDSlNfQ29sb3IpOwotCi0JSlNfU1RBVElDX1BST1AoYmxhY2ssIGNvbG9yKTsKLQlKU19TVEFUSUNfUFJPUChibHVlLCBjb2xvcik7Ci0JSlNfU1RBVElDX1BST1AoY3lhbiwgY29sb3IpOwkKLQlKU19TVEFUSUNfUFJPUChka0dyYXksIGNvbG9yKTsKLQlKU19TVEFUSUNfUFJPUChncmF5LCBjb2xvcik7Ci0JSlNfU1RBVElDX1BST1AoZ3JlZW4sIGNvbG9yKTsKLQlKU19TVEFUSUNfUFJPUChsdEdyYXksIGNvbG9yKTsKLQlKU19TVEFUSUNfUFJPUChtYWdlbnRhLCBjb2xvcik7Ci0JSlNfU1RBVElDX1BST1AocmVkLCBjb2xvcik7CQotCUpTX1NUQVRJQ19QUk9QKHRyYW5zcGFyZW50LCBjb2xvcik7Ci0JSlNfU1RBVElDX1BST1Aod2hpdGUsIGNvbG9yKTsKLQlKU19TVEFUSUNfUFJPUCh5ZWxsb3csIGNvbG9yKTsKLQotCUpTX1NUQVRJQ19NRVRIT0QoY29udmVydCxjb2xvcik7Ci0JSlNfU1RBVElDX01FVEhPRChlcXVhbCxjb2xvcik7Ci0KLX07Ci0KLSNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfQ09MT1JfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2NvbnNvbGUuaCBiL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2NvbnNvbGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5ZWE0MS4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9jb25zb2xlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0NPTlNPTEVfSF8KLSNkZWZpbmUgRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfQ09OU09MRV9IXwotCi0jaW5jbHVkZSAiSlNfRGVmaW5lLmgiCi0KLWNsYXNzIGNvbnNvbGUgOiBwdWJsaWMgQ0pTX0VtYmVkT2JqCi17Ci1wdWJsaWM6Ci0JY29uc29sZShDSlNfT2JqZWN0KiBwSlNPYmplY3QpOwotCXZpcnR1YWwgfmNvbnNvbGUodm9pZCk7Ci0KLXB1YmxpYzoKLQlGWF9CT09MIGNsZWFyKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgaGlkZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHByaW50bG4oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzaG93KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotfTsKLQotY2xhc3MgQ0pTX0NvbnNvbGUgOiBwdWJsaWMgQ0pTX09iamVjdCAgCi17Ci1wdWJsaWM6Ci0JQ0pTX0NvbnNvbGUoSlNGWE9iamVjdCBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge307Ci0JdmlydHVhbCB+Q0pTX0NvbnNvbGUodm9pZCl7fTsKLQotCURFQ0xBUkVfSlNfQ0xBU1MoQ0pTX0NvbnNvbGUpOwotCi0JSlNfU1RBVElDX01FVEhPRChjbGVhciwgY29uc29sZSk7Ci0JSlNfU1RBVElDX01FVEhPRChoaWRlLCBjb25zb2xlKTsKLQlKU19TVEFUSUNfTUVUSE9EKHByaW50bG4sIGNvbnNvbGUpOwotCUpTX1NUQVRJQ19NRVRIT0Qoc2hvdywgY29uc29sZSk7Ci19OwotCi0jZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0NPTlNPTEVfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2V2ZW50LmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9ldmVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDNkZWY5Li4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2V2ZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0VWRU5UX0hfCi0jZGVmaW5lIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0VWRU5UX0hfCi0KLSNpbmNsdWRlICJKU19EZWZpbmUuaCIKLQotY2xhc3MgZXZlbnQgOiBwdWJsaWMgQ0pTX0VtYmVkT2JqCi17Ci1wdWJsaWM6Ci0JZXZlbnQoQ0pTX09iamVjdCAqIHBKU09iamVjdCk7Ci0JdmlydHVhbCB+ZXZlbnQodm9pZCk7Ci0KLXB1YmxpYzoKLQlGWF9CT09MIGNoYW5nZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgY2hhbmdlRXgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIGNvbW1pdEtleShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgZmllbGRGdWxsKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBrZXlEb3duKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBtb2RpZmllcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgbmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgcmMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHJpY2hDaGFuZ2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHJpY2hDaGFuZ2VFeChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgcmljaFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzZWxFbmQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHNlbFN0YXJ0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCBzaGlmdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgc291cmNlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCB0YXJnZXQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHRhcmdldE5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHR5cGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCB3aWxsQ29tbWl0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0KLX07Ci0KLWNsYXNzIENKU19FdmVudCA6IHB1YmxpYyBDSlNfT2JqZWN0Ci17Ci1wdWJsaWM6Ci0JQ0pTX0V2ZW50KEpTRlhPYmplY3QgIHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fTsKLQl2aXJ0dWFsIH5DSlNfRXZlbnQodm9pZCl7fTsKLQotCURFQ0xBUkVfSlNfQ0xBU1MoQ0pTX0V2ZW50KTsKLQotCUpTX1NUQVRJQ19QUk9QKGNoYW5nZSwgZXZlbnQpOwotCUpTX1NUQVRJQ19QUk9QKGNoYW5nZUV4LCBldmVudCk7Ci0JSlNfU1RBVElDX1BST1AoY29tbWl0S2V5LCBldmVudCk7Ci0JSlNfU1RBVElDX1BST1AoZmllbGRGdWxsLCBldmVudCk7Ci0JSlNfU1RBVElDX1BST1Aoa2V5RG93biwgZXZlbnQpOwotCUpTX1NUQVRJQ19QUk9QKG1vZGlmaWVyLCBldmVudCk7Ci0JSlNfU1RBVElDX1BST1AobmFtZSwgZXZlbnQpOwotCUpTX1NUQVRJQ19QUk9QKHJjLCBldmVudCk7Ci0JSlNfU1RBVElDX1BST1AocmljaENoYW5nZSwgZXZlbnQpOwotCUpTX1NUQVRJQ19QUk9QKHJpY2hDaGFuZ2VFeCwgZXZlbnQpOwotCUpTX1NUQVRJQ19QUk9QKHJpY2hWYWx1ZSwgZXZlbnQpOwotCUpTX1NUQVRJQ19QUk9QKHNlbEVuZCwgZXZlbnQpOwotCUpTX1NUQVRJQ19QUk9QKHNlbFN0YXJ0LCBldmVudCk7Ci0JSlNfU1RBVElDX1BST1Aoc2hpZnQsIGV2ZW50KTsKLQlKU19TVEFUSUNfUFJPUChzb3VyY2UsIGV2ZW50KTsKLQlKU19TVEFUSUNfUFJPUCh0YXJnZXQsIGV2ZW50KTsKLQlKU19TVEFUSUNfUFJPUCh0YXJnZXROYW1lLCBldmVudCk7Ci0JSlNfU1RBVElDX1BST1AodHlwZSwgZXZlbnQpOwotCUpTX1NUQVRJQ19QUk9QKHZhbHVlLCBldmVudCk7Ci0JSlNfU1RBVElDX1BST1Aod2lsbENvbW1pdCwgZXZlbnQpOwotfTsKLQotI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfSkFWQVNDUklQVF9FVkVOVF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvZ2xvYmFsLmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9nbG9iYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFjOTNkOC4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9nbG9iYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfR0xPQkFMX0hfCi0jZGVmaW5lIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0dMT0JBTF9IXwotCi0jaW5jbHVkZSAiSlNfRGVmaW5lLmgiCi0KLWNsYXNzIENKU19HbG9iYWxEYXRhOwotY2xhc3MgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXk7Ci1jbGFzcyBDSlNfS2V5VmFsdWU7Ci0KLXN0cnVjdCBqc19nbG9iYWxfZGF0YQotewotCWpzX2dsb2JhbF9kYXRhKCkKLQl7Ci0JCW5UeXBlID0gMDsKLQkJZERhdGEgPSAwOwotCQliRGF0YSA9IEZBTFNFOwotCQlzRGF0YSA9ICIiOwotCQliUGVyc2lzdGVudCA9IEZBTFNFOwotCQliRGVsZXRlZCA9IEZBTFNFOwotCX0KLQotCX5qc19nbG9iYWxfZGF0YSgpCi0JewotCQlwRGF0YS5SZXNldCgpOwotCX0KLQlpbnQJCQkJCW5UeXBlOyAvLzA6aW50IDE6Ym9vbCAyOnN0cmluZyAzOm9iagotCWRvdWJsZQkJCQlkRGF0YTsKLQlib29sCQkJCWJEYXRhOwotCUNGWF9CeXRlU3RyaW5nCQlzRGF0YTsKLQl2ODo6R2xvYmFsPHY4OjpPYmplY3Q+ICBwRGF0YTsKLQlib29sCQkJCWJQZXJzaXN0ZW50OwotCWJvb2wJCQkJYkRlbGV0ZWQ7Ci19OwotCi1jbGFzcyBnbG9iYWxfYWx0ZXJuYXRlIDogcHVibGljIENKU19FbWJlZE9iagotewotcHVibGljOgotCWdsb2JhbF9hbHRlcm5hdGUoQ0pTX09iamVjdCogcEpTT2JqZWN0KTsKLQl2aXJ0dWFsIH5nbG9iYWxfYWx0ZXJuYXRlKCk7Ci0KLXB1YmxpYzoKLQlGWF9CT09MCQkJCQkJc2V0UGVyc2lzdGVudChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQotcHVibGljOgotCUZYX0JPT0wJCQkJCQlRdWVyeVByb3BlcnR5KEZYX0xQQ1dTVFIgcHJvcG5hbWUpOwotCUZYX0JPT0wJCQkJCQlEb1Byb3BlcnR5KElGWEpTX0NvbnRleHQqIGNjLCBGWF9MUENXU1RSIHByb3BuYW1lLCBDSlNfUHJvcFZhbHVlICYgdnAsIENGWF9XaWRlU3RyaW5nICYgc0Vycm9yKTsKLQlGWF9CT09MCQkJCQkJRGVsUHJvcGVydHkoSUZYSlNfQ29udGV4dCogY2MsIEZYX0xQQ1dTVFIgcHJvcG5hbWUsIENGWF9XaWRlU3RyaW5nICYgc0Vycm9yKTsKLQotCXZvaWQJCQkJCQlJbml0aWFsKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApOwotCi1wcml2YXRlOgotCXZvaWQJCQkJCQlVcGRhdGVHbG9iYWxQZXJzaXN0ZW50VmFyaWFibGVzKCk7Ci0Jdm9pZAkJCQkJCUNvbW1pdEdsb2JhbFBlcnNpc2l0ZW50VmFyaWFibGVzKCk7Ci0Jdm9pZAkJCQkJCURlc3Ryb3lHbG9iYWxQZXJzaXNpdGVudFZhcmlhYmxlcygpOwotCUZYX0JPT0wJCQkJCQlTZXRHbG9iYWxWYXJpYWJsZXMoRlhfTFBDU1RSIHByb3BuYW1lLCBpbnQgblR5cGUsIAotCQkJCQkJCQkJZG91YmxlIGREYXRhLCBib29sIGJEYXRhLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0RhdGEsIEpTT2JqZWN0IHBEYXRhLCBib29sIGJEZWZhdWx0UGVyc2lzdGVudCk7Ci0KLQl2b2lkCQkJCQkJT2JqZWN0VG9BcnJheSh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkmIGFycmF5KTsKLQl2b2lkCQkJCQkJUHV0T2JqZWN0UHJvcGVydHkodjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iaiwgQ0pTX0tleVZhbHVlKiBwRGF0YSk7Ci0KLXByaXZhdGU6Ci0JQ0ZYX01hcEJ5dGVTdHJpbmdUb1B0cgkJbV9tYXBHbG9iYWw7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJbV9zRmlsZVBhdGg7Ci0JQ0pTX0dsb2JhbERhdGEqCQkJCW1fcEdsb2JhbERhdGE7Ci0JQ1BERkRvY19FbnZpcm9ubWVudCoJCQkJbV9wQXBwOwotfTsKLQotCi1jbGFzcyBDSlNfR2xvYmFsIDogcHVibGljIENKU19PYmplY3QKLXsKLXB1YmxpYzoKLQlDSlNfR2xvYmFsKEpTRlhPYmplY3QgcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9OwotCXZpcnR1YWwgfkNKU19HbG9iYWwodm9pZCl7fTsKLQotCXZpcnR1YWwgRlhfQk9PTAlJbml0SW5zdGFuY2UoSUZYSlNfQ29udGV4dCogY2MpOwkKLQotCURFQ0xBUkVfU1BFQ0lBTF9KU19DTEFTUyhDSlNfR2xvYmFsKTsKLQotCUpTX1NQRUNJQUxfU1RBVElDX01FVEhPRChzZXRQZXJzaXN0ZW50LCBnbG9iYWxfYWx0ZXJuYXRlLCBnbG9iYWwpOwotCi19OwotCi0jZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX0dMT0JBTF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvcmVwb3J0LmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9yZXBvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcwNWFkYS4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9yZXBvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfUkVQT1JUX0hfCi0jZGVmaW5lIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX1JFUE9SVF9IXwotCi0jaW5jbHVkZSAiSlNfRGVmaW5lLmgiCi0KLWNsYXNzIFJlcG9ydCA6IHB1YmxpYyBDSlNfRW1iZWRPYmoKLXsKLXB1YmxpYzoKLQlSZXBvcnQoQ0pTX09iamVjdCAqIHBKU09iamVjdCk7Ci0JdmlydHVhbCB+UmVwb3J0KCk7Ci0KLXB1YmxpYzoKLQlGWF9CT09MIHNhdmUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0JRlhfQk9PTCB3cml0ZVRleHQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci19OwotCi1jbGFzcyBDSlNfUmVwb3J0IDogcHVibGljIENKU19PYmplY3QKLXsKLXB1YmxpYzoKLQlDSlNfUmVwb3J0KEpTRlhPYmplY3QgIHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KXt9OwotCXZpcnR1YWwgfkNKU19SZXBvcnQoKXt9OwotCi1wdWJsaWM6Ci0JREVDTEFSRV9KU19DTEFTUyhDSlNfUmVwb3J0KTsKLQotCUpTX1NUQVRJQ19NRVRIT0Qoc2F2ZSwgUmVwb3J0KQotCUpTX1NUQVRJQ19NRVRIT0Qod3JpdGVUZXh0LCBSZXBvcnQpOwotfTsKLQotI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfSkFWQVNDUklQVF9SRVBPUlRfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L3Jlc291cmNlLmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9yZXNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODAxMWYyLi4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L3Jlc291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfUkVTT1VSQ0VfSF8KLSNkZWZpbmUgRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfUkVTT1VSQ0VfSF8KLQotI2luY2x1ZGUgIi4uLy4uLy4uL2NvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIiAgLy8gRm9yIENGWF9XaWRlU3RyaW5nLgotI2luY2x1ZGUgIi4uL2ZzZGtfZGVmaW5lLmgiICAvLyBGb3IgRlhfVUlOVC4KLQotY2xhc3MgQ0pTX0NvbnRleHQ7Ci0KLSNkZWZpbmUgSURTX1NUUklOR19KU0FMRVJUICAgICAgICAgICAgICAyNTYxMwotI2RlZmluZSBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUiAgICAgICAgIDI1NjE0Ci0jZGVmaW5lIElEU19TVFJJTkdfSlNBRk5VTUJFUl9LRVlTVFJPS0UgMjU2MTUKLSNkZWZpbmUgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcgICAgICAyNTYxNwotI2RlZmluZSBJRFNfU1RSSU5HX0pTUEFSU0VEQVRFICAgICAgICAgIDI1NjE4Ci0jZGVmaW5lIElEU19TVFJJTkdfSlNSQU5HRTEgICAgICAgICAgICAgMjU2MTkKLSNkZWZpbmUgSURTX1NUUklOR19KU1JBTkdFMiAgICAgICAgICAgICAyNTYyMAotI2RlZmluZSBJRFNfU1RSSU5HX0pTUkFOR0UzICAgICAgICAgICAgIDI1NjIxCi0jZGVmaW5lIElEU19TVFJJTkdfTk9UU1VQUE9SVCAgICAgICAgICAgMjU2MjcKLSNkZWZpbmUgSURTX1NUUklOR19KU0JVU1kgICAgICAgICAgICAgICAyNTYyOAotI2RlZmluZSBJRFNfU1RSSU5HX0pTRVZFTlQgICAgICAgICAgICAgIDI1NjI5Ci0jZGVmaW5lIElEU19TVFJJTkdfUlVOICAgICAgICAgICAgICAgICAgMjU2MzAKLSNkZWZpbmUgSURTX1NUUklOR19KU1BSSU5UMSAgICAgICAgICAgICAyNTYzMgotI2RlZmluZSBJRFNfU1RSSU5HX0pTUFJJTlQyICAgICAgICAgICAgIDI1NjMzCi0jZGVmaW5lIElEU19TVFJJTkdfSlNOT0dMT0JBTCAgICAgICAgICAgMjU2MzUKLSNkZWZpbmUgSURTX1NUUklOR19KU1JFQURPTkxZICAgICAgICAgICAyNTYzNgotI2RlZmluZSBJRFNfU1RSSU5HX0pTVFlQRUVSUk9SICAgICAgICAgIDI1NjM3Ci0jZGVmaW5lIElEU19TVFJJTkdfSlNWQUxVRUVSUk9SICAgICAgICAgMjU2MzgKLQotQ0ZYX1dpZGVTdHJpbmcgSlNHZXRTdHJpbmdGcm9tSUQoQ0pTX0NvbnRleHQqIHBDb250ZXh0LCBGWF9VSU5UIGlkKTsKLUNGWF9XaWRlU3RyaW5nIEpTRm9ybWF0RXJyb3JTdHJpbmcoY29uc3QgY2hhciogY2xhc3NfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJvcGVydHlfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGRldGFpbHMpOwotCi0jZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX1JFU09VUkNFX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC91dGlsLmggYi9mcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC91dGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MjEwNjcuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvdXRpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBGUERGU0RLX0lOQ0xVREVfSkFWQVNDUklQVF9VVElMX0hfCi0jZGVmaW5lIEZQREZTREtfSU5DTFVERV9KQVZBU0NSSVBUX1VUSUxfSF8KLQotI2luY2x1ZGUgPHN0cmluZz4gIC8vIEZvciBzdGQ6OndzdHJpbmcuCi0KLSNpbmNsdWRlICJKU19EZWZpbmUuaCIKLQotY2xhc3MgdXRpbCA6IHB1YmxpYyBDSlNfRW1iZWRPYmoKLXsKLXB1YmxpYzoKLQl1dGlsKENKU19PYmplY3QgKiBwSlNPYmplY3QpOwotCXZpcnR1YWwgfnV0aWwodm9pZCk7Ci0KLXB1YmxpYzoKLQlGWF9CT09MIHByaW50ZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHByaW50ZihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHByaW50eChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQlGWF9CT09MIHNjYW5kKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCUZYX0JPT0wgYnl0ZVRvQ2hhcihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQotcHVibGljOgotCXN0YXRpYyB2b2lkCQlwcmludGQoY29uc3Qgc3RkOjp3c3RyaW5nICZjRm9ybWF0LENKU19EYXRlIERhdGUsYm9vbCBiWEZBUGljdHVyZSwgc3RkOjp3c3RyaW5nICZjUHVycG9zZSk7Ci0Jc3RhdGljIHZvaWQJCXByaW50eChjb25zdCBzdGQ6OnN0cmluZyAmY0Zvcm1hdCxjb25zdCBzdGQ6OnN0cmluZyAmY1NvdXJjZSwgc3RkOjpzdHJpbmcgJmNQdXJwb3NlKTsKLQlzdGF0aWMgaW50CQlQYXJzdERhdGFUeXBlKHN0ZDo6d3N0cmluZyogc0Zvcm1hdCk7Ci19OwotCi1jbGFzcyBDSlNfVXRpbCA6IHB1YmxpYyBDSlNfT2JqZWN0Ci17Ci1wdWJsaWM6Ci0JQ0pTX1V0aWwoSlNGWE9iamVjdCAgcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9OwotCXZpcnR1YWwgfkNKU19VdGlsKHZvaWQpe307Ci0KLQlERUNMQVJFX0pTX0NMQVNTKENKU19VdGlsKTsKLQotCUpTX1NUQVRJQ19NRVRIT0QocHJpbnRkLCB1dGlsKTsKLQlKU19TVEFUSUNfTUVUSE9EKHByaW50ZiwgdXRpbCk7Ci0JSlNfU1RBVElDX01FVEhPRChwcmludHgsIHV0aWwpOwotCUpTX1NUQVRJQ19NRVRIT0Qoc2NhbmQsIHV0aWwpOwotCUpTX1NUQVRJQ19NRVRIT0QoYnl0ZVRvQ2hhciwgdXRpbCk7Ci19OwotCi1GWF9JTlQ2NCBGWF9hdG9pNjQoY29uc3QgY2hhciAqbnB0cik7Ci0KLSNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0pBVkFTQ1JJUFRfVVRJTF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL2pzYXBpL2Z4anNfdjguaCBiL2ZwZGZzZGsvaW5jbHVkZS9qc2FwaS9meGpzX3Y4LmgKaW5kZXggZjVkNjk5Mi4uYjA4NDVhMyAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL2pzYXBpL2Z4anNfdjguaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvanNhcGkvZnhqc192OC5oCkBAIC00LDEzNiArNCwyNDUgQEAKIAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotLy8gUERGaXVtIHdyYXBwZXIgYXJvdW5kIFY4IEFQSXMuIFBERml1bSBjb2RlIHNob3VsZCBpbmNsdWRlIHRoaXMgZmlsZSByYXRoZXIKLS8vIHRoYW4gaW5jbHVkaW5nIFY4IGhlYWRlcnMgZGlyZWN0bHkuCisvLyBGWEpTX1Y4IGlzIGEgbGF5ZXIgdGhhdCBtYWtlcyBpdCBlYXNpZXIgdG8gZGVmaW5lIG5hdGl2ZSBvYmplY3RzIGluIFY4LCBidXQKKy8vIGhhcyBubyBrbm93bGVkZ2Ugb2YgUERGLXNwZWNpZmljIG5hdGl2ZSBvYmplY3RzLiBJdCBjb3VsZCBpbiB0aGVvcnkgYmUgdXNlZAorLy8gdG8gaW1wbGVtZW50IG90aGVyIHNldHMgb2YgbmF0aXZlIG9iamVjdHMuCisKKy8vIFBERml1bSBjb2RlIHNob3VsZCBpbmNsdWRlIHRoaXMgZmlsZSByYXRoZXIgdGhhbiBpbmNsdWRpbmcgVjggaGVhZGVycworLy8gZGlyZWN0bHkuCiAKICNpZm5kZWYgRlBERlNES19JTkNMVURFX0pTQVBJX0ZYSlNfVjhfSF8KICNkZWZpbmUgRlBERlNES19JTkNMVURFX0pTQVBJX0ZYSlNfVjhfSF8KIAogI2luY2x1ZGUgPHY4Lmg+Ci0jaW5jbHVkZSAiLi4vLi4vLi4vY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmluZy5oIiAgLy8gRm9yIENGWF9XaWRlU3RyaW5nCiAKLXR5cGVkZWYgdjg6OlZhbHVlCQkJSlNWYWx1ZTsKLXR5cGVkZWYgdjg6OkxvY2FsPHY4OjpPYmplY3Q+CUpTT2JqZWN0OwotdHlwZWRlZiB2ODo6TG9jYWw8djg6Ok9iamVjdD4JSlNGWE9iamVjdDsKKyNpbmNsdWRlIDx2ZWN0b3I+CiAKLWVudW0gRlhKU09CSlRZUEUKLXsKLQlKU19EWU5BTUlDID0gMCwKLQlKU19TVEFUSUMgPSAxLAorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zdHJpbmcuaCIKKworY2xhc3MgQ0ZYSlNfT2JqRGVmaW5pdGlvbjsKKworLy8gRlhKU19WOCBwbGFjZXMgbm8gcmVzdHJpY3Rpb25zIG9uIHRoZXNlIHR3byBjbGFzc2VzOyBpdCBtZXJlbHkgcGFzc2VzIHRoZW0KKy8vIG9uIHRvIGNhbGxlci1wcm92aWRlZCBtZXRob2RzLgorY2xhc3MgSUpTX0NvbnRleHQ7ICAvLyBBIGRlc2NyaXB0aW9uIG9mIHRoZSBldmVudCB0aGF0IGNhdXNlZCBKUyBleGVjdXRpb24uCitjbGFzcyBJSlNfUnVudGltZTsgIC8vIEEgbmF0aXZlIHJ1bnRpbWUsIHR5cGljYWxseSBvd25zIHRoZSB2ODo6Q29udGV4dC4KKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisvLyBGWEpTX1Y4IHBsYWNlcyBubyBpbnRlcnByZWF0aW9uIG9uIHRoaXMgY2FsYXNzOyBpdCBtZXJlbHkgcGFzc2VzIGl0CisvLyBhbG9uZyB0byBYRkEuCitjbGFzcyBDRlhKU0VfUnVudGltZURhdGE7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKK2VudW0gRlhKU09CSlRZUEUgeworICBGWEpTT0JKVFlQRV9EWU5BTUlDID0gMCwgIC8vIENyZWF0ZWQgYnkgbmF0aXZlIG1ldGhvZCBhbmQgcmV0dXJuZWQgdG8gSlMuCisgIEZYSlNPQkpUWVBFX1NUQVRJQywgICAgICAgLy8gQ3JlYXRlZCBieSBpbml0IGFuZCBodW5nIG9mZiBvZiBnbG9iYWwgb2JqZWN0LgorICBGWEpTT0JKVFlQRV9HTE9CQUwsICAgICAgIC8vIFRoZSBnbG9iYWwgb2JqZWN0IGl0c2VsZiAobWF5IG9ubHkgYXBwZWFyIG9uY2UpLgogfTsKIAotZW51bSBGWEpTVkFMVUVUWVBFCi17Ci0JVlRfdW5rbm93biwKLQlWVF9zdHJpbmcsCi0JVlRfbnVtYmVyLAotCVZUX2Jvb2xlYW4sCi0JVlRfZGF0ZSwKLQlWVF9vYmplY3QsCi0JVlRfZnhvYmplY3QsCi0JVlRfbnVsbCwKLQlWVF91bmRlZmluZWQKK3N0cnVjdCBGWEpTRXJyIHsKKyAgY29uc3Qgd2NoYXJfdCogbWVzc2FnZTsKKyAgY29uc3Qgd2NoYXJfdCogc3JjbGluZTsKKyAgdW5zaWduZWQgbGlubnVtOwogfTsKIAotc3RydWN0IEZYSlNFcnIKLXsKLQljb25zdCB3Y2hhcl90KiBtZXNzYWdlOwotICAgIGNvbnN0IHdjaGFyX3QqIHNyY2xpbmU7Ci0gICAgdW5zaWduZWQgbGlubnVtOworY2xhc3MgRlhKU19QZXJJc29sYXRlRGF0YSB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBTZXRVcCh2ODo6SXNvbGF0ZSogcElzb2xhdGUpOworICBzdGF0aWMgRlhKU19QZXJJc29sYXRlRGF0YSogR2V0KHY4OjpJc29sYXRlKiBwSXNvbGF0ZSk7CisKKyAgc3RkOjp2ZWN0b3I8Q0ZYSlNfT2JqRGVmaW5pdGlvbio+IG1fT2JqZWN0RGVmbkFycmF5OworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIENGWEpTRV9SdW50aW1lRGF0YSogbV9wRlhKU0VSdW50aW1lRGF0YTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworIHByb3RlY3RlZDoKKyNpZm5kZWYgUERGX0VOQUJMRV9YRkEKKyAgRlhKU19QZXJJc29sYXRlRGF0YSgpIHt9CisjZWxzZSAgLy8gUERGX0VOQUJMRV9YRkEKKyAgRlhKU19QZXJJc29sYXRlRGF0YSgpIDogbV9wRlhKU0VSdW50aW1lRGF0YShudWxscHRyKSB7fQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogfTsKIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFQSSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2V4dGVybiBjb25zdCB3Y2hhcl90IGtGWEpTVmFsdWVOYW1lU3RyaW5nW107CitleHRlcm4gY29uc3Qgd2NoYXJfdCBrRlhKU1ZhbHVlTmFtZU51bWJlcltdOworZXh0ZXJuIGNvbnN0IHdjaGFyX3Qga0ZYSlNWYWx1ZU5hbWVCb29sZWFuW107CitleHRlcm4gY29uc3Qgd2NoYXJfdCBrRlhKU1ZhbHVlTmFtZURhdGVbXTsKK2V4dGVybiBjb25zdCB3Y2hhcl90IGtGWEpTVmFsdWVOYW1lT2JqZWN0W107CitleHRlcm4gY29uc3Qgd2NoYXJfdCBrRlhKU1ZhbHVlTmFtZUZ4b2JqW107CitleHRlcm4gY29uc3Qgd2NoYXJfdCBrRlhKU1ZhbHVlTmFtZU51bGxbXTsKK2V4dGVybiBjb25zdCB3Y2hhcl90IGtGWEpTVmFsdWVOYW1lVW5kZWZpbmVkW107CiAKLXR5cGVkZWYgdjg6Oklzb2xhdGUgSUpTX1J1bnRpbWU7Ci1jbGFzcyBJRlhKU19Db250ZXh0OwotY2xhc3MgSUZYSlNfUnVudGltZTsKK2NsYXNzIEZYSlNfQXJyYXlCdWZmZXJBbGxvY2F0b3IgOiBwdWJsaWMgdjg6OkFycmF5QnVmZmVyOjpBbGxvY2F0b3IgeworICB2b2lkKiBBbGxvY2F0ZShzaXplX3QgbGVuZ3RoKSBvdmVycmlkZTsKKyAgdm9pZCogQWxsb2NhdGVVbmluaXRpYWxpemVkKHNpemVfdCBsZW5ndGgpIG92ZXJyaWRlOworICB2b2lkIEZyZWUodm9pZCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgb3ZlcnJpZGU7Cit9OwogCi10eXBlZGVmIHZvaWQgKCpMUF9DT05TVFJVQ1RPUikoSUZYSlNfQ29udGV4dCogY2MsIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmosIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBnbG9iYWwpOwotdHlwZWRlZiB2b2lkICgqTFBfREVTVFJVQ1RPUikodjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iaik7Cit1c2luZyBGWEpTX0NPTlNUUlVDVE9SID0gdm9pZCAoKikoSUpTX1J1bnRpbWUqIGNjLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqKTsKK3VzaW5nIEZYSlNfREVTVFJVQ1RPUiA9IHZvaWQgKCopKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmopOwogCisvLyBDYWxsIGJlZm9yZSBtYWtpbmcgRlhKU19QcmVwYXJlSXNvbGF0ZSBjYWxsLgordm9pZCBGWEpTX0luaXRpYWxpemUodW5zaWduZWQgaW50IGVtYmVkZGVyRGF0YVNsb3QsIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSk7Cit2b2lkIEZYSlNfUmVsZWFzZSgpOwogCi1pbnQJCQkJCQkJCUpTX0RlZmluZU9iaihJSlNfUnVudGltZSogcEpTUnVudGltZSwgY29uc3Qgd2NoYXJfdCogc09iak5hbWUsIEZYSlNPQkpUWVBFIGVPYmpUeXBlLCBMUF9DT05TVFJVQ1RPUiBwQ29uc3RydWN0b3IsIExQX0RFU1RSVUNUT1IgcERlc3RydWN0b3IsIHVuc2lnbmVkIGJBcHBseU5ldyk7Ci1pbnQJCQkJCQkJCUpTX0RlZmluZU9iak1ldGhvZChJSlNfUnVudGltZSogcEpTUnVudGltZSwgaW50IG5PYmpEZWZuSUQsIGNvbnN0IHdjaGFyX3QqIHNNZXRob2ROYW1lLCB2ODo6RnVuY3Rpb25DYWxsYmFjayBwTWV0aG9kQ2FsbCk7Ci1pbnQJCQkJCQkJCUpTX0RlZmluZU9ialByb3BlcnR5KElKU19SdW50aW1lKiBwSlNSdW50aW1lLCBpbnQgbk9iakRlZm5JRCwgY29uc3Qgd2NoYXJfdCogc1Byb3BOYW1lLCB2ODo6QWNjZXNzb3JHZXR0ZXJDYWxsYmFjayBwUHJvcEdldCwgdjg6OkFjY2Vzc29yU2V0dGVyQ2FsbGJhY2sgcFByb3BQdXQpOwotaW50CQkJCQkJCQlKU19EZWZpbmVPYmpBbGxQcm9wZXJ0aWVzKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCBpbnQgbk9iakRlZm5JRCwgdjg6Ok5hbWVkUHJvcGVydHlRdWVyeUNhbGxiYWNrIHBQcm9wUXVyZXksIHY4OjpOYW1lZFByb3BlcnR5R2V0dGVyQ2FsbGJhY2sgcFByb3BHZXQsIHY4OjpOYW1lZFByb3BlcnR5U2V0dGVyQ2FsbGJhY2sgcFByb3BQdXQsIHY4OjpOYW1lZFByb3BlcnR5RGVsZXRlckNhbGxiYWNrIHBQcm9wRGVsKTsKLWludAkJCQkJCQkJSlNfRGVmaW5lT2JqQ29uc3QoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIGludCBuT2JqRGVmbklELCBjb25zdCB3Y2hhcl90KiBzQ29uc3ROYW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBwRGVmYXVsdCk7Ci1pbnQJCQkJCQkJCUpTX0RlZmluZUdsb2JhbE1ldGhvZChJSlNfUnVudGltZSogcEpTUnVudGltZSwgY29uc3Qgd2NoYXJfdCogc01ldGhvZE5hbWUsIHY4OjpGdW5jdGlvbkNhbGxiYWNrIHBNZXRob2RDYWxsKTsKLWludAkJCQkJCQkJSlNfRGVmaW5lR2xvYmFsQ29uc3QoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIGNvbnN0IHdjaGFyX3QqIHNDb25zdE5hbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBEZWZhdWx0KTsKKy8vIEdldHMgdGhlIGdsb2JhbCBpc29sYXRlIHNldCBieSBGWEpTX0luaXRpYWxpemUoKSwgb3IgbWFrZXMgYSBuZXcgb25lIGVhY2gKKy8vIHRpbWUgaWYgdGhlcmUgaXMgbm8gc3VjaCBpc29sYXRlLiBSZXR1cm5zIHRydWUgaWYgYSBuZXcgaXNvbGF0ZSBoYWQgdG8gYmUKKy8vIGNyZWF0ZWQuCitib29sIEZYSlNfR2V0SXNvbGF0ZSh2ODo6SXNvbGF0ZSoqIHBSZXN1bHRJc29sYXRlKTsKIAotdm9pZAkJCQkJCQlKU19Jbml0aWFsUnVudGltZShJSlNfUnVudGltZSogcEpTUnVudGltZSxJRlhKU19SdW50aW1lKiBwRlhSdW50aW1lLCBJRlhKU19Db250ZXh0KiBjb250ZXh0LCB2ODo6R2xvYmFsPHY4OjpDb250ZXh0PiYgdjhQZXJzaXN0ZW50Q29udGV4dCk7Ci12b2lkCQkJCQkJCUpTX1JlbGVhc2VSdW50aW1lKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCB2ODo6R2xvYmFsPHY4OjpDb250ZXh0PiYgdjhQZXJzaXN0ZW50Q29udGV4dCk7Ci12b2lkCQkJCQkJCUpTX0luaXRpYWwoKTsKLXZvaWQJCQkJCQkJSlNfUmVsZWFzZSgpOwotaW50CQkJCQkJCQlKU19QYXJzZShJSlNfUnVudGltZSogcEpTUnVudGltZSwgSUZYSlNfQ29udGV4dCogcEpTQ29udGV4dCwgY29uc3Qgd2NoYXJfdCogc2NyaXB0LCBsb25nIGxlbmd0aCwgRlhKU0VyciogcGVycm9yKTsKLWludAkJCQkJCQkJSlNfRXhlY3V0ZShJSlNfUnVudGltZSogcEpTUnVudGltZSwgSUZYSlNfQ29udGV4dCogcEpTQ29udGV4dCwgY29uc3Qgd2NoYXJfdCogc2NyaXB0LCBsb25nIGxlbmd0aCwgRlhKU0VyciogcGVycm9yKTsKLXY4OjpMb2NhbDx2ODo6T2JqZWN0PgkJCUpTX05ld0Z4RHluYW1pY09iaihJSlNfUnVudGltZSogcEpTUnVudGltZSwgSUZYSlNfQ29udGV4dCogcEpTQ29udGV4dCwgaW50IG5PYmpEZWZuSUQpOwotdjg6OkxvY2FsPHY4OjpPYmplY3Q+CQkJSlNfR2V0U3RhdGljT2JqKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCBpbnQgbk9iakRlZm5JRCk7Ci12b2lkCQkJCQkJCUpTX1NldFRoaXNPYmooSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIGludCBuVGhpc09iaklEKTsKLXY4OjpMb2NhbDx2ODo6T2JqZWN0PgkJCUpTX0dldFRoaXNPYmooSUpTX1J1bnRpbWUgKiBwSlNSdW50aW1lKTsKLWludAkJCQkJCQkJSlNfR2V0T2JqRGVmbklEKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqKTsKLUlKU19SdW50aW1lKgkJCQkJSlNfR2V0UnVudGltZSh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaik7Ci1pbnQJCQkJCQkJCUpTX0dldE9iakRlZm5JRChJSlNfUnVudGltZSAqIHBKU1J1bnRpbWUsIGNvbnN0IHdjaGFyX3QqIHBPYmpOYW1lKTsKLXZvaWQJCQkJCQkJSlNfRXJyb3Iodjg6Oklzb2xhdGUqIGlzb2xhdGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBtZXNzYWdlKTsKLXVuc2lnbmVkCQkJCQkJSlNfQ2FsY0hhc2goY29uc3Qgd2NoYXJfdCogbWFpbiwgdW5zaWduZWQgbkxlbik7Ci11bnNpZ25lZAkJCQkJCUpTX0NhbGNIYXNoKGNvbnN0IHdjaGFyX3QqIG1haW4pOwotY29uc3Qgd2NoYXJfdCoJCQkJCUpTX0dldFR5cGVvZih2ODo6TG9jYWw8djg6OlZhbHVlPiBwT2JqKTsKLXZvaWQJCQkJCQkJSlNfU2V0UHJpdmF0ZShJSlNfUnVudGltZSogcEpTUnVudGltZSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosIHZvaWQqIHApOwotdm9pZCoJCQkJCQkJSlNfR2V0UHJpdmF0ZShJSlNfUnVudGltZSogcEpTUnVudGltZSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopOwotdm9pZAkJCQkJCQlKU19TZXRQcml2YXRlKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLCB2b2lkKiBwKTsKLXZvaWQqCQkJCQkJCUpTX0dldFByaXZhdGUodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopOwotdm9pZAkJCQkJCQlKU19GcmVlUHJpdmF0ZSh2b2lkKiBwKTsKLXZvaWQJCQkJCQkJSlNfRnJlZVByaXZhdGUodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopOwotdjg6OkxvY2FsPHY4OjpWYWx1ZT4JCQlKU19HZXRPYmplY3RWYWx1ZSh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaik7Ci12ODo6TG9jYWw8djg6OlZhbHVlPgkJCUpTX0dldE9iamVjdEVsZW1lbnQoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLGNvbnN0IHdjaGFyX3QqIFByb3BlcnR5TmFtZSk7Ci12ODo6TG9jYWw8djg6OkFycmF5PgkJCUpTX0dldE9iamVjdEVsZW1lbnROYW1lcyhJSlNfUnVudGltZSogcEpTUnVudGltZSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopOwotdm9pZAkJCQkJCQlKU19QdXRPYmplY3RTdHJpbmcoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosIGNvbnN0IHdjaGFyX3QqIFByb3BlcnR5TmFtZSwgY29uc3Qgd2NoYXJfdCogc1ZhbHVlKTsKLXZvaWQJCQkJCQkJSlNfUHV0T2JqZWN0TnVtYmVyKElKU19SdW50aW1lKiBwSlNSdW50aW1lLHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLCBjb25zdCB3Y2hhcl90KiBQcm9wZXJ0eU5hbWUsIGludCBuVmFsdWUpOwotdm9pZAkJCQkJCQlKU19QdXRPYmplY3ROdW1iZXIoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosIGNvbnN0IHdjaGFyX3QqIFByb3BlcnR5TmFtZSwgZmxvYXQgZlZhbHVlKTsKLXZvaWQJCQkJCQkJSlNfUHV0T2JqZWN0TnVtYmVyKElKU19SdW50aW1lKiBwSlNSdW50aW1lLHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLCBjb25zdCB3Y2hhcl90KiBQcm9wZXJ0eU5hbWUsIGRvdWJsZSBkVmFsdWUpOwotdm9pZAkJCQkJCQlKU19QdXRPYmplY3RCb29sZWFuKElKU19SdW50aW1lKiBwSlNSdW50aW1lLHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLCBjb25zdCB3Y2hhcl90KiBQcm9wZXJ0eU5hbWUsIGJvb2wgYlZhbHVlKTsKLXZvaWQJCQkJCQkJSlNfUHV0T2JqZWN0T2JqZWN0KElKU19SdW50aW1lKiBwSlNSdW50aW1lLHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLCBjb25zdCB3Y2hhcl90KiBQcm9wZXJ0eU5hbWUsIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwUHV0KTsKLXZvaWQJCQkJCQkJSlNfUHV0T2JqZWN0TnVsbChJSlNfUnVudGltZSogcEpTUnVudGltZSx2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lKTsKLXVuc2lnbmVkCQkJCQkJSlNfUHV0QXJyYXlFbGVtZW50KElKU19SdW50aW1lKiBwSlNSdW50aW1lLCB2ODo6TG9jYWw8djg6OkFycmF5PiBwQXJyYXksdW5zaWduZWQgaW5kZXgsdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlLEZYSlNWQUxVRVRZUEUgZVR5cGUpOwotdjg6OkxvY2FsPHY4OjpWYWx1ZT4JCQlKU19HZXRBcnJheUVsZW1lbnQoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIHY4OjpMb2NhbDx2ODo6QXJyYXk+IHBBcnJheSx1bnNpZ25lZCBpbmRleCk7Ci11bnNpZ25lZAkJCQkJCUpTX0dldEFycmF5TGVuZ3RoKHY4OjpMb2NhbDx2ODo6QXJyYXk+IHBBcnJheSk7Ci12ODo6TG9jYWw8djg6OlZhbHVlPgkJCUpTX0dldExpc3RWYWx1ZShJSlNfUnVudGltZSogcEpTUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcExpc3QsIGludCBpbmRleCk7CisvLyBHZXQgdGhlIGdsb2JhbCBpc29sYXRlJ3MgcmVmIGNvdW50Lgorc2l6ZV90IEZYSlNfR2xvYmFsSXNvbGF0ZVJlZkNvdW50KCk7CiAKKy8vIENhbGwgYmVmb3JlIG1ha2luZyBGWEpTX0RlZmluZSogY2FsbHMuIFJlc291cmNlcyBhbGxvY2F0ZWQgaGVyZSBhcmUgY2xlYXJlZAorLy8gYXMgcGFydCBvZiBGWEpTX1JlbGVhc2VSdW50aW1lKCkuCit2b2lkIEZYSlNfUHJlcGFyZUlzb2xhdGUodjg6Oklzb2xhdGUqIHBJc29sYXRlKTsKIAotdjg6OkxvY2FsPHY4OjpBcnJheT4JCQlKU19OZXdBcnJheShJSlNfUnVudGltZSogcEpTUnVudGltZSk7Ci12ODo6TG9jYWw8djg6OlZhbHVlPgkJCUpTX05ld051bWJlcihJSlNfUnVudGltZSogcEpTUnVudGltZSxpbnQgbnVtYmVyKTsKLXY4OjpMb2NhbDx2ODo6VmFsdWU+CQkJSlNfTmV3TnVtYmVyKElKU19SdW50aW1lKiBwSlNSdW50aW1lLGRvdWJsZSBudW1iZXIpOwotdjg6OkxvY2FsPHY4OjpWYWx1ZT4JCQlKU19OZXdOdW1iZXIoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsZmxvYXQgbnVtYmVyKTsKLXY4OjpMb2NhbDx2ODo6VmFsdWU+CQkJSlNfTmV3Qm9vbGVhbihJSlNfUnVudGltZSogcEpTUnVudGltZSxib29sIGIpOwotdjg6OkxvY2FsPHY4OjpWYWx1ZT4JCQlKU19OZXdPYmplY3QoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopOwotdjg6OkxvY2FsPHY4OjpWYWx1ZT4JCQlKU19OZXdPYmplY3QyKElKU19SdW50aW1lKiBwSlNSdW50aW1lLHY4OjpMb2NhbDx2ODo6QXJyYXk+IHBPYmopOwotdjg6OkxvY2FsPHY4OjpWYWx1ZT4JCQlKU19OZXdTdHJpbmcoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsY29uc3Qgd2NoYXJfdCogc3RyaW5nKTsKLXY4OjpMb2NhbDx2ODo6VmFsdWU+CQkJSlNfTmV3U3RyaW5nKElKU19SdW50aW1lKiBwSlNSdW50aW1lLGNvbnN0IHdjaGFyX3QqIHN0cmluZywgdW5zaWduZWQgbkxlbik7Ci12ODo6TG9jYWw8djg6OlZhbHVlPgkJCUpTX05ld051bGwoKTsKLXY4OjpMb2NhbDx2ODo6VmFsdWU+CQkJSlNfTmV3RGF0ZShJSlNfUnVudGltZSogcEpTUnVudGltZSxkb3VibGUgZCk7Ci12ODo6TG9jYWw8djg6OlZhbHVlPgkJCUpTX05ld1ZhbHVlKElKU19SdW50aW1lKiBwSlNSdW50aW1lKTsKKy8vIENhbGwgYmVmb3JlIG1ha2luZyBKU19EZWZpbmUqIGNhbGxzLiBSZXNvdXJjZXMgYWxsb2NhdGVkIGhlcmUgYXJlIGNsZWFyZWQKKy8vIGFzIHBhcnQgb2YgSlNfUmVsZWFzZVJ1bnRpbWUoKS4KK3ZvaWQgSlNfUHJlcGFyZUlzb2xhdGUodjg6Oklzb2xhdGUqIHBJc29sYXRlKTsKIAorLy8gQWx3YXlzIHJldHVybnMgYSB2YWxpZCwgbmV3bHktY3JlYXRlZCBvYmpEZWZuSUQuCitpbnQgRlhKU19EZWZpbmVPYmoodjg6Oklzb2xhdGUqIHBJc29sYXRlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHNPYmpOYW1lLAorICAgICAgICAgICAgICAgICAgIEZYSlNPQkpUWVBFIGVPYmpUeXBlLAorICAgICAgICAgICAgICAgICAgIEZYSlNfQ09OU1RSVUNUT1IgcENvbnN0cnVjdG9yLAorICAgICAgICAgICAgICAgICAgIEZYSlNfREVTVFJVQ1RPUiBwRGVzdHJ1Y3Rvcik7CiAKLWludAkJCQkJCQkJSlNfVG9JbnQzMihJSlNfUnVudGltZSogcEpTUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKTsKLWJvb2wJCQkJCQkJSlNfVG9Cb29sZWFuKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpOwotZG91YmxlCQkJCQkJCUpTX1RvTnVtYmVyKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpOwotdjg6OkxvY2FsPHY4OjpPYmplY3Q+CQkJSlNfVG9PYmplY3QoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSk7Ci1DRlhfV2lkZVN0cmluZwkJCQkJSlNfVG9TdHJpbmcoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSk7Ci12ODo6TG9jYWw8djg6OkFycmF5PgkJCUpTX1RvQXJyYXkoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSk7Ci12b2lkCQkJCQkJCUpTX1ZhbHVlQ29weSh2ODo6TG9jYWw8djg6OlZhbHVlPiYgcFRvLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBwRnJvbSk7Cit2b2lkIEZYSlNfRGVmaW5lT2JqTWV0aG9kKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5PYmpEZWZuSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHNNZXRob2ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6RnVuY3Rpb25DYWxsYmFjayBwTWV0aG9kQ2FsbCk7Cit2b2lkIEZYSlNfRGVmaW5lT2JqUHJvcGVydHkodjg6Oklzb2xhdGUqIHBJc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuT2JqRGVmbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHNQcm9wTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6QWNjZXNzb3JHZXR0ZXJDYWxsYmFjayBwUHJvcEdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6QWNjZXNzb3JTZXR0ZXJDYWxsYmFjayBwUHJvcFB1dCk7Cit2b2lkIEZYSlNfRGVmaW5lT2JqQWxsUHJvcGVydGllcyh2ODo6SXNvbGF0ZSogcElzb2xhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbk9iakRlZm5JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpOYW1lZFByb3BlcnR5UXVlcnlDYWxsYmFjayBwUHJvcFF1cmV5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5hbWVkUHJvcGVydHlHZXR0ZXJDYWxsYmFjayBwUHJvcEdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpOYW1lZFByb3BlcnR5U2V0dGVyQ2FsbGJhY2sgcFByb3BQdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TmFtZWRQcm9wZXJ0eURlbGV0ZXJDYWxsYmFjayBwUHJvcERlbCk7Cit2b2lkIEZYSlNfRGVmaW5lT2JqQ29uc3Qodjg6Oklzb2xhdGUqIHBJc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuT2JqRGVmbklELAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHNDb25zdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcERlZmF1bHQpOwordm9pZCBGWEpTX0RlZmluZUdsb2JhbE1ldGhvZCh2ODo6SXNvbGF0ZSogcElzb2xhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHNNZXRob2ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6RnVuY3Rpb25DYWxsYmFjayBwTWV0aG9kQ2FsbCk7Cit2b2lkIEZYSlNfRGVmaW5lR2xvYmFsQ29uc3Qodjg6Oklzb2xhdGUqIHBJc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHNDb25zdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcERlZmF1bHQpOwogCi1kb3VibGUJCQkJCQkJSlNfR2V0RGF0ZVRpbWUoKTsKLWludAkJCQkJCQkJSlNfR2V0WWVhckZyb21UaW1lKGRvdWJsZSBkdCk7Ci1pbnQJCQkJCQkJCUpTX0dldE1vbnRoRnJvbVRpbWUoZG91YmxlIGR0KTsKLWludAkJCQkJCQkJSlNfR2V0RGF5RnJvbVRpbWUoZG91YmxlIGR0KTsKLWludAkJCQkJCQkJSlNfR2V0SG91ckZyb21UaW1lKGRvdWJsZSBkdCk7Ci1pbnQJCQkJCQkJCUpTX0dldE1pbkZyb21UaW1lKGRvdWJsZSBkdCk7Ci1pbnQJCQkJCQkJCUpTX0dldFNlY0Zyb21UaW1lKGRvdWJsZSBkdCk7Ci1kb3VibGUJCQkJCQkJSlNfRGF0ZVBhcnNlKGNvbnN0IHdjaGFyX3QqIHN0cmluZyk7Ci1kb3VibGUJCQkJCQkJSlNfTWFrZURheShpbnQgblllYXIsIGludCBuTW9udGgsIGludCBuRGF5KTsKLWRvdWJsZQkJCQkJCQlKU19NYWtlVGltZShpbnQgbkhvdXIsIGludCBuTWluLCBpbnQgblNlYywgaW50IG5Ncyk7Ci1kb3VibGUJCQkJCQkJSlNfTWFrZURhdGUoZG91YmxlIGRheSwgZG91YmxlIHRpbWUpOwotYm9vbAkJCQkJCQlKU19Qb3J0SXNOYW4oZG91YmxlIGQpOwotZG91YmxlCQkJCQkJCUpTX0xvY2FsVGltZShkb3VibGUgZCk7CisvLyBDYWxsZWQgYWZ0ZXIgRlhKU19EZWZpbmUqIGNhbGxzIG1hZGUuCit2b2lkIEZYSlNfSW5pdGlhbGl6ZVJ1bnRpbWUoCisgICAgdjg6Oklzb2xhdGUqIHBJc29sYXRlLAorICAgIElKU19SdW50aW1lKiBwSVJ1bnRpbWUsCisgICAgdjg6Okdsb2JhbDx2ODo6Q29udGV4dD4qIHBWOFBlcnNpc3RlbnRDb250ZXh0LAorICAgIHN0ZDo6dmVjdG9yPHY4OjpHbG9iYWw8djg6Ok9iamVjdD4qPiogcFN0YXRpY09iamVjdHMpOwordm9pZCBGWEpTX1JlbGVhc2VSdW50aW1lKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6R2xvYmFsPHY4OjpDb250ZXh0PiogcFY4UGVyc2lzdGVudENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8djg6Okdsb2JhbDx2ODo6T2JqZWN0Pio+KiBwU3RhdGljT2JqZWN0cyk7CitJSlNfUnVudGltZSogRlhKU19HZXRSdW50aW1lRnJvbUlzb2xhdGUodjg6Oklzb2xhdGUqIHBJc29sYXRlKTsKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisvLyBDYWxsZWQgYXMgcGFydCBvZiBGWEpTX0luaXRpYWxpemVSdW50aW1lLCBleHBvc2VkIHNvIFBERiBjYW4gbWFrZSBpdHMKKy8vIG93biBjb250ZXh0cyBjb21wYXRpYmxlIHdpdGggWEZBIG9yIHZpY2UgdmVyc2EuCit2b2lkIEZYSlNfU2V0UnVudGltZUZvclY4Q29udGV4dCh2ODo6TG9jYWw8djg6OkNvbnRleHQ+IHY4Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElKU19SdW50aW1lKiBwSVJ1bnRpbWUpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCisvLyBDYWxsZWQgYWZ0ZXIgRlhKU19Jbml0aWFsaXplUnVudGltZSBjYWxsIG1hZGUuCitpbnQgRlhKU19FeGVjdXRlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgSUpTX0NvbnRleHQqIHBKU0NvbnRleHQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHNjcmlwdCwKKyAgICAgICAgICAgICAgICAgRlhKU0VyciogcGVycm9yKTsKKwordjg6OkxvY2FsPHY4OjpPYmplY3Q+IEZYSlNfTmV3RnhEeW5hbWljT2JqKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSlNfUnVudGltZSogcEpTQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbk9iakRlZm5JRCk7Cit2ODo6TG9jYWw8djg6Ok9iamVjdD4gRlhKU19HZXRUaGlzT2JqKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSk7CitpbnQgRlhKU19HZXRPYmpEZWZuSUQodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopOworY29uc3Qgd2NoYXJfdCogRlhKU19HZXRUeXBlb2Yodjg6OkxvY2FsPHY4OjpWYWx1ZT4gcE9iaik7CisKK3ZvaWQgRlhKU19TZXRQcml2YXRlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCogcCk7Cit2b2lkKiBGWEpTX0dldFByaXZhdGUodjg6Oklzb2xhdGUqIHBJc29sYXRlLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaik7Cit2b2lkIEZYSlNfRnJlZVByaXZhdGUodm9pZCogcCk7Cit2b2lkIEZYSlNfRnJlZVByaXZhdGUodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopOworCit2b2lkIEZYSlNfRXJyb3Iodjg6Oklzb2xhdGUqIGlzb2xhdGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBtZXNzYWdlKTsKK3Y4OjpMb2NhbDx2ODo6U3RyaW5nPiBGWEpTX1dTVG9KU1N0cmluZyh2ODo6SXNvbGF0ZSogcElzb2xhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBMZW4gPSAtMSk7CisKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IEZYSlNfR2V0T2JqZWN0RWxlbWVudCh2ODo6SXNvbGF0ZSogcElzb2xhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lKTsKK3Y4OjpMb2NhbDx2ODo6QXJyYXk+IEZYSlNfR2V0T2JqZWN0RWxlbWVudE5hbWVzKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqKTsKKwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gRlhKU19HZXRBcnJheUVsZW1lbnQodjg6Oklzb2xhdGUqIHBJc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpBcnJheT4gcEFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW5kZXgpOwordW5zaWduZWQgRlhKU19HZXRBcnJheUxlbmd0aCh2ODo6TG9jYWw8djg6OkFycmF5PiBwQXJyYXkpOworCit2b2lkIEZYSlNfUHV0T2JqZWN0U3RyaW5nKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIFByb3BlcnR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogc1ZhbHVlKTsKK3ZvaWQgRlhKU19QdXRPYmplY3ROdW1iZXIodjg6Oklzb2xhdGUqIHBJc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblZhbHVlKTsKK3ZvaWQgRlhKU19QdXRPYmplY3ROdW1iZXIodjg6Oklzb2xhdGUqIHBJc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmVmFsdWUpOwordm9pZCBGWEpTX1B1dE9iamVjdE51bWJlcih2ODo6SXNvbGF0ZSogcElzb2xhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBQcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkVmFsdWUpOwordm9pZCBGWEpTX1B1dE9iamVjdEJvb2xlYW4odjg6Oklzb2xhdGUqIHBJc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBQcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJWYWx1ZSk7Cit2b2lkIEZYSlNfUHV0T2JqZWN0T2JqZWN0KHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIFByb3BlcnR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBQdXQpOwordm9pZCBGWEpTX1B1dE9iamVjdE51bGwodjg6Oklzb2xhdGUqIHBJc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBQcm9wZXJ0eU5hbWUpOwordW5zaWduZWQgRlhKU19QdXRBcnJheUVsZW1lbnQodjg6Oklzb2xhdGUqIHBJc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpBcnJheT4gcEFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpOworCit2ODo6TG9jYWw8djg6OkFycmF5PiBGWEpTX05ld0FycmF5KHY4OjpJc29sYXRlKiBwSXNvbGF0ZSk7Cit2ODo6TG9jYWw8djg6OlZhbHVlPiBGWEpTX05ld051bWJlcih2ODo6SXNvbGF0ZSogcElzb2xhdGUsIGludCBudW1iZXIpOwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gRlhKU19OZXdOdW1iZXIodjg6Oklzb2xhdGUqIHBJc29sYXRlLCBkb3VibGUgbnVtYmVyKTsKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IEZYSlNfTmV3TnVtYmVyKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwgZmxvYXQgbnVtYmVyKTsKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IEZYSlNfTmV3Qm9vbGVhbih2ODo6SXNvbGF0ZSogcElzb2xhdGUsIGJvb2wgYik7Cit2ODo6TG9jYWw8djg6OlZhbHVlPiBGWEpTX05ld09iamVjdCh2ODo6SXNvbGF0ZSogcElzb2xhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaik7Cit2ODo6TG9jYWw8djg6OlZhbHVlPiBGWEpTX05ld09iamVjdDIodjg6Oklzb2xhdGUqIHBJc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IHBPYmopOwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gRlhKU19OZXdTdHJpbmcodjg6Oklzb2xhdGUqIHBJc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogc3RyaW5nKTsKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IEZYSlNfTmV3TnVsbCgpOwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gRlhKU19OZXdEYXRlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwgZG91YmxlIGQpOworCitpbnQgRlhKU19Ub0ludDMyKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKTsKK2Jvb2wgRlhKU19Ub0Jvb2xlYW4odjg6Oklzb2xhdGUqIHBJc29sYXRlLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpOworZG91YmxlIEZYSlNfVG9OdW1iZXIodjg6Oklzb2xhdGUqIHBJc29sYXRlLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpOwordjg6OkxvY2FsPHY4OjpPYmplY3Q+IEZYSlNfVG9PYmplY3Qodjg6Oklzb2xhdGUqIHBJc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKTsKK0NGWF9XaWRlU3RyaW5nIEZYSlNfVG9TdHJpbmcodjg6Oklzb2xhdGUqIHBJc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpOwordjg6OkxvY2FsPHY4OjpBcnJheT4gRlhKU19Ub0FycmF5KHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpOwordm9pZCBGWEpTX1ZhbHVlQ29weSh2ODo6TG9jYWw8djg6OlZhbHVlPiYgcFRvLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBwRnJvbSk7CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX0pTQVBJX0ZYSlNfVjhfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvSVBERldpbmRvdy5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9JUERGV2luZG93LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxOTFjYWMuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9JUERGV2luZG93LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIEZQREZTREtfSU5DTFVERV9QREZXSU5ET1dfSVBERldJTkRPV19IXwotI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX0lQREZXSU5ET1dfSF8KLQotI2luY2x1ZGUgIlBXTF9CdXR0b24uaCIKLSNpbmNsdWRlICJQV0xfQ2FyZXQuaCIKLSNpbmNsdWRlICJQV0xfQ29tYm9Cb3guaCIKLSNpbmNsdWRlICJQV0xfRWRpdC5oIgotI2luY2x1ZGUgIlBXTF9FZGl0Q3RybC5oIgotI2luY2x1ZGUgIlBXTF9Gb250TWFwLmgiCi0jaW5jbHVkZSAiUFdMX0ljb24uaCIKLSNpbmNsdWRlICJQV0xfSWNvbkxpc3QuaCIKLSNpbmNsdWRlICJQV0xfTGFiZWwuaCIKLSNpbmNsdWRlICJQV0xfTGlzdEJveC5oIgotI2luY2x1ZGUgIlBXTF9MaXN0Q3RybC5oIgotI2luY2x1ZGUgIlBXTF9Ob3RlLmgiCi0jaW5jbHVkZSAiUFdMX1Njcm9sbEJhci5oIgotI2luY2x1ZGUgIlBXTF9TaWduYXR1cmUuaCIKLSNpbmNsdWRlICJQV0xfU3BlY2lhbEJ1dHRvbi5oIgotI2luY2x1ZGUgIlBXTF9VdGlscy5oIgotI2luY2x1ZGUgIlBXTF9XbmQuaCIKLQotI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX0lQREZXSU5ET1dfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUERGV2luZG93LmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BERldpbmRvdy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2QxZTAyLi4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUERGV2luZG93LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19JTkNMVURFX1BERldJTkRPV19QREZXSU5ET1dfSF8KLSNkZWZpbmUgRlBERlNES19JTkNMVURFX1BERldJTkRPV19QREZXSU5ET1dfSF8KLQotI2luY2x1ZGUgIi4uLy4uLy4uL2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl9kb2MuaCIKLSNpbmNsdWRlICIuLi8uLi8uLi9jb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3Z0LmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3htbC5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL3B1YmxpYy9mcGRmX2Z3bGV2ZW50LmgiCi0jaW5jbHVkZSAiLi4vZnhfc3lzdGVtaGFuZGxlci5oIgotI2luY2x1ZGUgIi4uL2Z4ZWRpdC9meF9lZGl0LmgiCi0KLSNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX1BERldJTkRPV19QREZXSU5ET1dfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0J1dHRvbi5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQnV0dG9uLmgKaW5kZXggOTE0MWNmMC4uMjhhMDI2YyAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQnV0dG9uLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQnV0dG9uLmgKQEAgLTEsNyArMSw3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgRlBERlNES19JTkNMVURFX1BERldJTkRPV19QV0xfQlVUVE9OX0hfCkBAIC05LDE5ICs5LDE5IEBACiAKICNpbmNsdWRlICJQV0xfV25kLmgiCiAKLWNsYXNzIFBXTF9DTEFTUyBDUFdMX0J1dHRvbiA6IHB1YmxpYyBDUFdMX1duZAotewotcHVibGljOgotCUNQV0xfQnV0dG9uKCk7Ci0JdmlydHVhbCB+Q1BXTF9CdXR0b24oKTsKK2NsYXNzIENQV0xfQnV0dG9uIDogcHVibGljIENQV0xfV25kIHsKKyBwdWJsaWM6CisgIENQV0xfQnV0dG9uKCk7CisgIH5DUFdMX0J1dHRvbigpIG92ZXJyaWRlOwogCi0JdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0Q2xhc3NOYW1lKCkgY29uc3Q7Ci0JdmlydHVhbCB2b2lkCQkJCU9uQ3JlYXRlKFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgIC8vIENQV0xfV25kCisgIENGWF9CeXRlU3RyaW5nIEdldENsYXNzTmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIE9uQ3JlYXRlKFBXTF9DUkVBVEVQQVJBTSYgY3ApIG92ZXJyaWRlOworICBGWF9CT09MIE9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIG92ZXJyaWRlOwogCi1wcm90ZWN0ZWQ6Ci0JRlhfQk9PTAkJCQkJCW1fYk1vdXNlRG93bjsKKyBwcm90ZWN0ZWQ6CisgIEZYX0JPT0wgbV9iTW91c2VEb3duOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9CVVRUT05fSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0NhcmV0LmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9DYXJldC5oCmluZGV4IGI4MjdmMTguLmMyYTJjYWYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0NhcmV0LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQ2FyZXQuaApAQCAtMSw3ICsxLDcgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9DQVJFVF9IXwpAQCAtOSw0NSArOSw0NSBAQAogCiAjaW5jbHVkZSAiUFdMX1duZC5oIgogCi1zdHJ1Y3QgUFdMX0NBUkVUX0lORk8KLXsKLXB1YmxpYzoKLQlQV0xfQ0FSRVRfSU5GTygpIDogYlZpc2libGUoRkFMU0UpLCBwdEhlYWQoMCwwKSwgcHRGb290KDAsMCkKLQl7Ci0JfQorc3RydWN0IFBXTF9DQVJFVF9JTkZPIHsKKyBwdWJsaWM6CisgIFBXTF9DQVJFVF9JTkZPKCkgOiBiVmlzaWJsZShGQUxTRSksIHB0SGVhZCgwLCAwKSwgcHRGb290KDAsIDApIHt9CiAKLQlGWF9CT09MCQkJCQkJYlZpc2libGU7Ci0JQ1BERl9Qb2ludAkJCQkJcHRIZWFkOwotCUNQREZfUG9pbnQJCQkJCXB0Rm9vdDsKKyAgRlhfQk9PTCBiVmlzaWJsZTsKKyAgQ1BERl9Qb2ludCBwdEhlYWQ7CisgIENQREZfUG9pbnQgcHRGb290OwogfTsKIAorY2xhc3MgQ1BXTF9DYXJldCA6IHB1YmxpYyBDUFdMX1duZCB7CisgcHVibGljOgorICBDUFdMX0NhcmV0KCk7CisgIH5DUFdMX0NhcmV0KCkgb3ZlcnJpZGU7CiAKLWNsYXNzIENQV0xfQ2FyZXQgOiBwdWJsaWMgQ1BXTF9XbmQKLXsKLXB1YmxpYzoKLQlDUFdMX0NhcmV0KCk7Ci0JdmlydHVhbCB+Q1BXTF9DYXJldCgpOworICAvLyBDUFdMX1duZAorICBDRlhfQnl0ZVN0cmluZyBHZXRDbGFzc05hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYmIHNBcHBTdHJlYW0pIG92ZXJyaWRlOworICB2b2lkIERyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UpIG92ZXJyaWRlOworICB2b2lkIEludmFsaWRhdGVSZWN0KENQREZfUmVjdCogcFJlY3QgPSBOVUxMKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRWaXNpYmxlKEZYX0JPT0wgYlZpc2libGUpIG92ZXJyaWRlIHt9CisgIHZvaWQgVGltZXJQcm9jKCkgb3ZlcnJpZGU7CiAKLQl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQlHZXRDbGFzc05hbWUoKSBjb25zdDsKLQl2aXJ0dWFsIHZvaWQJCQkJR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSk7Ci0JdmlydHVhbCB2b2lkCQkJCURyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKLQl2aXJ0dWFsIHZvaWQJCQkJSW52YWxpZGF0ZVJlY3QoQ1BERl9SZWN0ICogcFJlY3QgPSBOVUxMKTsKLQl2aXJ0dWFsIHZvaWQJCQkJU2V0VmlzaWJsZShGWF9CT09MIGJWaXNpYmxlKSB7fQotCXZpcnR1YWwJdm9pZAkJCQlUaW1lclByb2MoKTsKLQl2b2lkCQkJCQkJU2V0Q2FyZXQoRlhfQk9PTCBiVmlzaWJsZSwgY29uc3QgQ1BERl9Qb2ludCAmIHB0SGVhZCwgY29uc3QgQ1BERl9Qb2ludCAmIHB0Rm9vdCk7CQotCUNGWF9CeXRlU3RyaW5nCQkJCUdldENhcmV0QXBwZWFyYW5jZVN0cmVhbShjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQpOwotCXZvaWQJCQkJCQlTZXRJbnZhbGlkUmVjdChDUERGX1JlY3QgcmMpIHttX3JjSW52YWxpZCA9IHJjO30KKyAgdm9pZCBTZXRDYXJldChGWF9CT09MIGJWaXNpYmxlLAorICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0SGVhZCwKKyAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdEZvb3QpOworICBDRlhfQnl0ZVN0cmluZyBHZXRDYXJldEFwcGVhcmFuY2VTdHJlYW0oY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQpOworICB2b2lkIFNldEludmFsaWRSZWN0KENQREZfUmVjdCByYykgeyBtX3JjSW52YWxpZCA9IHJjOyB9CiAKLXByaXZhdGU6Ci0Jdm9pZAkJCQkJCUdldENhcmV0QXBwKENGWF9CeXRlVGV4dEJ1ZiAmIHNBcHBTdHJlYW0sY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0KTsKLQlDUERGX1JlY3QJCQkJCUdldENhcmV0UmVjdCgpIGNvbnN0OworIHByaXZhdGU6CisgIHZvaWQgR2V0Q2FyZXRBcHAoQ0ZYX0J5dGVUZXh0QnVmJiBzQXBwU3RyZWFtLCBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCk7CisgIENQREZfUmVjdCBHZXRDYXJldFJlY3QoKSBjb25zdDsKIAotCUZYX0JPT0wJCQkJCQltX2JGbGFzaDsKLQlDUERGX1BvaW50CQkJCQltX3B0SGVhZDsKLQlDUERGX1BvaW50CQkJCQltX3B0Rm9vdDsKLQlGWF9GTE9BVAkJCQkJbV9mV2lkdGg7Ci0JRlhfSU5UMzIJCQkJCW1fbkRlbGF5OwotCUNQREZfUmVjdAkJCQkJbV9yY0ludmFsaWQ7CisgIEZYX0JPT0wgbV9iRmxhc2g7CisgIENQREZfUG9pbnQgbV9wdEhlYWQ7CisgIENQREZfUG9pbnQgbV9wdEZvb3Q7CisgIEZYX0ZMT0FUIG1fZldpZHRoOworICBpbnQzMl90IG1fbkRlbGF5OworICBDUERGX1JlY3QgbV9yY0ludmFsaWQ7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9QREZXSU5ET1dfUFdMX0NBUkVUX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Db21ib0JveC5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQ29tYm9Cb3guaAppbmRleCA4MjZmNGRjLi5iMTc0ZjAyIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Db21ib0JveC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0NvbWJvQm94LmgKQEAgLTEsNyArMSw3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgRlBERlNES19JTkNMVURFX1BERldJTkRPV19QV0xfQ09NQk9CT1hfSF8KQEAgLTExLDEwOCArMTEsOTYgQEAKICNpbmNsdWRlICJQV0xfTGlzdEJveC5oIgogI2luY2x1ZGUgIlBXTF9XbmQuaCIKIAotY2xhc3MgQ1BXTF9DQkVkaXQgOiBwdWJsaWMgQ1BXTF9FZGl0Ci17Ci1wdWJsaWM6Ci0JQ1BXTF9DQkVkaXQoKXt9OwotCXZpcnR1YWwgfkNQV0xfQ0JFZGl0KCl7fTsKK2NsYXNzIENQV0xfQ0JFZGl0IDogcHVibGljIENQV0xfRWRpdCB7CisgcHVibGljOgorICBDUFdMX0NCRWRpdCgpIHt9CisgIH5DUFdMX0NCRWRpdCgpIG92ZXJyaWRlIHt9CiB9OwogCi1jbGFzcyBQV0xfQ0xBU1MgQ1BXTF9DQkxpc3RCb3ggOiBwdWJsaWMgQ1BXTF9MaXN0Qm94Ci17Ci1wdWJsaWM6Ci0JQ1BXTF9DQkxpc3RCb3goKXt9OwotCXZpcnR1YWwgfkNQV0xfQ0JMaXN0Qm94KCl7fTsKK2NsYXNzIENQV0xfQ0JMaXN0Qm94IDogcHVibGljIENQV0xfTGlzdEJveCB7CisgcHVibGljOgorICBDUFdMX0NCTGlzdEJveCgpIHt9CisgIH5DUFdMX0NCTGlzdEJveCgpIG92ZXJyaWRlIHt9CiAKLXB1YmxpYzoKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgIC8vIENQV0xfTGlzdEJveAorICBGWF9CT09MIE9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgb3ZlcnJpZGU7CiAKLQlGWF9CT09MCQkJCU9uS2V5RG93bldpdGhFeGl0KEZYX1dPUkQgbkNoYXIsIEZYX0JPT0wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOwotCUZYX0JPT0wJCQkJT25DaGFyV2l0aEV4aXQoRlhfV09SRCBuQ2hhciwgRlhfQk9PTCAmIGJFeGl0LCBGWF9EV09SRCBuRmxhZyk7CisgIEZYX0JPT0wgT25LZXlEb3duV2l0aEV4aXQoRlhfV09SRCBuQ2hhciwgRlhfQk9PTCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKTsKKyAgRlhfQk9PTCBPbkNoYXJXaXRoRXhpdChGWF9XT1JEIG5DaGFyLCBGWF9CT09MJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpOwogfTsKIAotI2RlZmluZSBQV0xfQ09NQk9CT1hfQlVUVE9OX1dJRFRICQkxMworI2RlZmluZSBQV0xfQ09NQk9CT1hfQlVUVE9OX1dJRFRIIDEzCiAKLWNsYXNzIENQV0xfQ0JCdXR0b24gOiBwdWJsaWMgQ1BXTF9XbmQKLXsKLXB1YmxpYzoKLQlDUFdMX0NCQnV0dG9uKCl7fTsKLQl2aXJ0dWFsIH5DUFdMX0NCQnV0dG9uKCl7fTsKK2NsYXNzIENQV0xfQ0JCdXR0b24gOiBwdWJsaWMgQ1BXTF9XbmQgeworIHB1YmxpYzoKKyAgQ1BXTF9DQkJ1dHRvbigpIHt9CisgIH5DUFdMX0NCQnV0dG9uKCkgb3ZlcnJpZGUge30KIAotcHVibGljOgotCXZpcnR1YWwgdm9pZAkJCQlHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKTsKLQl2aXJ0dWFsIHZvaWQJCQkJRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpOwotCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCisgIC8vIENQV0xfV25kCisgIHZvaWQgR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmJiBzQXBwU3RyZWFtKSBvdmVycmlkZTsKKyAgdm9pZCBEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgb3ZlcnJpZGU7CisgIEZYX0JPT0wgT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSBvdmVycmlkZTsKIH07CiAKLWNsYXNzIFBXTF9DTEFTUyBDUFdMX0NvbWJvQm94IDogcHVibGljIENQV0xfV25kICAKLXsKLXB1YmxpYzoKLQlDUFdMX0NvbWJvQm94KCk7Ci0Jb3BlcmF0b3IgQ1BXTF9FZGl0KiAoKQkJe3JldHVybiBtX3BFZGl0O30KK2NsYXNzIENQV0xfQ29tYm9Cb3ggOiBwdWJsaWMgQ1BXTF9XbmQgeworIHB1YmxpYzoKKyAgQ1BXTF9Db21ib0JveCgpOworICB+Q1BXTF9Db21ib0JveCgpIG92ZXJyaWRlIHt9CiAKLXB1YmxpYzoKLQl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQlHZXRDbGFzc05hbWUoKSBjb25zdDsKLQl2aXJ0dWFsIHZvaWQJCQkJT25DcmVhdGUoUFdMX0NSRUFURVBBUkFNICYgY3ApOworICBDUFdMX0VkaXQqIEdldEVkaXQoKSBjb25zdCB7IHJldHVybiBtX3BFZGl0OyB9CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsJCi0JdmlydHVhbCBGWF9CT09MCQkJCU9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7CisgIC8vIENQV0xfV25kOgorICBDRlhfQnl0ZVN0cmluZyBHZXRDbGFzc05hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBPbkNyZWF0ZShQV0xfQ1JFQVRFUEFSQU0mIGNwKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpIG92ZXJyaWRlOworICBGWF9CT09MIE9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykgb3ZlcnJpZGU7CisgIHZvaWQgT25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgbXNnLAorICAgICAgICAgICAgICAgIGludHB0cl90IHdQYXJhbSA9IDAsCisgICAgICAgICAgICAgICAgaW50cHRyX3QgbFBhcmFtID0gMCkgb3ZlcnJpZGU7CisgIHZvaWQgQ3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCkgb3ZlcnJpZGU7CisgIHZvaWQgUmVQb3NDaGlsZFduZCgpIG92ZXJyaWRlOworICBDUERGX1JlY3QgR2V0Rm9jdXNSZWN0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2V0Rm9jdXMoKSBvdmVycmlkZTsKKyAgdm9pZCBLaWxsRm9jdXMoKSBvdmVycmlkZTsKIAotCXZpcnR1YWwgdm9pZAkJCQlPbk5vdGlmeShDUFdMX1duZCogcFduZCwgRlhfRFdPUkQgbXNnLCBGWF9JTlRQVFIgd1BhcmFtID0gMCwgRlhfSU5UUFRSIGxQYXJhbSA9IDApOworICB2b2lkIFNldEZpbGxlck5vdGlmeShJUFdMX0ZpbGxlcl9Ob3RpZnkqIHBOb3RpZnkpOwogCi0JdmlydHVhbCB2b2lkCQkJCUNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKLQl2aXJ0dWFsIHZvaWQJCQkJUmVQb3NDaGlsZFduZCgpOworICBDRlhfV2lkZVN0cmluZyBHZXRUZXh0KCkgY29uc3Q7CisgIHZvaWQgU2V0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCk7CiAKLQl2aXJ0dWFsIENQREZfUmVjdAkJCUdldEZvY3VzUmVjdCgpIGNvbnN0OwotCQotCXZpcnR1YWwgdm9pZAkJCQlTZXRGb2N1cygpOwotCXZpcnR1YWwgdm9pZAkJCQlLaWxsRm9jdXMoKTsKKyAgdm9pZCBBZGRTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHN0cmluZyk7CisgIGludDMyX3QgR2V0U2VsZWN0KCkgY29uc3Q7CisgIHZvaWQgU2V0U2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCk7CiAKLQlGWF9CT09MCQkJCQkJSXNNb2RpZmllZCgpIGNvbnN0OworICB2b2lkIFNldEVkaXRTZWwoaW50MzJfdCBuU3RhcnRDaGFyLCBpbnQzMl90IG5FbmRDaGFyKTsKKyAgdm9pZCBHZXRFZGl0U2VsKGludDMyX3QmIG5TdGFydENoYXIsIGludDMyX3QmIG5FbmRDaGFyKSBjb25zdDsKKyAgdm9pZCBDbGVhcigpOworICB2b2lkIFNlbGVjdEFsbCgpOworICBGWF9CT09MIElzUG9wdXAoKSBjb25zdDsKIAotcHVibGljOgkKLQl2b2lkCQkJCQkJU2V0RmlsbGVyTm90aWZ5KElQV0xfRmlsbGVyX05vdGlmeSogcE5vdGlmeSk7CisgIHZvaWQgU2V0U2VsZWN0VGV4dCgpOwogCi0JQ0ZYX1dpZGVTdHJpbmcJCQkJR2V0VGV4dCgpIGNvbnN0OwotCXZvaWQJCQkJCQlTZXRUZXh0KEZYX0xQQ1dTVFIgdGV4dCk7CisgIHZvaWQgQXR0YWNoRkZMRGF0YSh2b2lkKiBwRGF0YSkgeyBtX3BGb3JtRmlsbGVyID0gcERhdGE7IH0KIAotCXZvaWQJCQkJCQlBZGRTdHJpbmcoRlhfTFBDV1NUUiBzdHJpbmcpOwotCUZYX0lOVDMyCQkJCQlHZXRTZWxlY3QoKSBjb25zdDsKLQl2b2lkCQkJCQkJU2V0U2VsZWN0KEZYX0lOVDMyIG5JdGVtSW5kZXgpOworIHByaXZhdGU6CisgIHZvaWQgQ3JlYXRlRWRpdChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKTsKKyAgdm9pZCBDcmVhdGVCdXR0b24oY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCk7CisgIHZvaWQgQ3JlYXRlTGlzdEJveChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKTsKKyAgdm9pZCBTZXRQb3B1cChGWF9CT09MIGJQb3B1cCk7CiAKLQl2b2lkCQkJCQkJU2V0RWRpdFNlbChGWF9JTlQzMiBuU3RhcnRDaGFyLEZYX0lOVDMyIG5FbmRDaGFyKTsKLQl2b2lkCQkJCQkJR2V0RWRpdFNlbChGWF9JTlQzMiAmIG5TdGFydENoYXIsIEZYX0lOVDMyICYgbkVuZENoYXIgKSBjb25zdDsKLQl2b2lkCQkJCQkJQ2xlYXIoKTsKLQl2b2lkCQkJCQkJU2VsZWN0QWxsKCk7Ci0JRlhfQk9PTAkJCQkJCUlzUG9wdXAoKSBjb25zdDsKKyAgQ1BXTF9DQkVkaXQqIG1fcEVkaXQ7CisgIENQV0xfQ0JCdXR0b24qIG1fcEJ1dHRvbjsKKyAgQ1BXTF9DQkxpc3RCb3gqIG1fcExpc3Q7CisgIEZYX0JPT0wgbV9iUG9wdXA7CisgIENQREZfUmVjdCBtX3JjT2xkV2luZG93OworICBpbnQzMl90IG1fblBvcHVwV2hlcmU7CisgIGludDMyX3QgbV9uU2VsZWN0SXRlbTsKKyAgSVBXTF9GaWxsZXJfTm90aWZ5KiBtX3BGaWxsZXJOb3RpZnk7CiAKLQl2b2lkCQkJCQkJU2V0U2VsZWN0VGV4dCgpOwotCi1wcml2YXRlOgkKLQl2b2lkCQkJCQkJQ3JlYXRlRWRpdChjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7Ci0Jdm9pZAkJCQkJCUNyZWF0ZUJ1dHRvbihjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7Ci0Jdm9pZAkJCQkJCUNyZWF0ZUxpc3RCb3goY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApOwotCi0Jdm9pZAkJCQkJCVNldFBvcHVwKEZYX0JPT0wgYlBvcHVwKTsKLQkKLXByaXZhdGU6Ci0JQ1BXTF9DQkVkaXQqCQkJCW1fcEVkaXQ7Ci0JQ1BXTF9DQkJ1dHRvbioJCQkJbV9wQnV0dG9uOwotCUNQV0xfQ0JMaXN0Qm94KgkJCQltX3BMaXN0OwotCi0JRlhfQk9PTAkJCQkJCW1fYlBvcHVwOwotCUNQREZfUmVjdAkJCQkJbV9yY09sZFdpbmRvdzsKLQlGWF9JTlQzMgkJCQkJbV9uUG9wdXBXaGVyZTsKLQlGWF9JTlQzMgkJCQkJbV9uU2VsZWN0SXRlbTsKLQlJUFdMX0ZpbGxlcl9Ob3RpZnkqCQkJbV9wRmlsbGVyTm90aWZ5OwotCi1wdWJsaWM6Ci0Jdm9pZAkJCQkJCQlBdHRhY2hGRkxEYXRhKHZvaWQqIHBEYXRhKSB7bV9wRm9ybUZpbGxlciA9IHBEYXRhO30KLXByaXZhdGU6Ci0Jdm9pZCoJCQkJCQkJbV9wRm9ybUZpbGxlcjsKKyAgdm9pZCogbV9wRm9ybUZpbGxlcjsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX1BERldJTkRPV19QV0xfQ09NQk9CT1hfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXQuaCBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXQuaAppbmRleCA5YTEzM2QxLi5lN2JlMTU2IDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9FZGl0LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRWRpdC5oCkBAIC0xLDE0MiArMSwxNzEgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9FRElUX0hfCiAjZGVmaW5lIEZQREZTREtfSU5DTFVERV9QREZXSU5ET1dfUFdMX0VESVRfSF8KIAotI2luY2x1ZGUgIi4uLy4uLy4uL2NvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgotI2luY2x1ZGUgIlBXTF9FZGl0Q3RybC5oIgotI2luY2x1ZGUgIlBXTF9XbmQuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4X2VkaXQuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9FZGl0Q3RybC5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oIgogCi1jbGFzcyBDUFdMX0VkaXQ7Ci1jbGFzcyBJUFdMX0ZpbGxlcl9Ob3RpZnk7CiBjbGFzcyBJUFdMX1NwZWxsQ2hlY2s7CiAKLWNsYXNzIElQV0xfRmlsbGVyX05vdGlmeQotewotcHVibGljOgotICAgICAgICB2aXJ0dWFsIH5JUFdMX0ZpbGxlcl9Ob3RpZnkoKSB7IH0KLQl2aXJ0dWFsIHZvaWQJCQkJCVF1ZXJ5V2hlcmVQb3B1cCh2b2lkKiBwUHJpdmF0ZURhdGEsIEZYX0ZMT0FUIGZQb3B1cE1pbixGWF9GTE9BVCBmUG9wdXBNYXgsIAotCQkJCQkJCQkJCUZYX0lOVDMyICYgblJldCwgRlhfRkxPQVQgJiBmUG9wdXBSZXQpID0gMDsgLy9uUmV0OiAoMDpib3R0b20gMTp0b3ApCi0JdmlydHVhbCB2b2lkCQkJCQlPbkJlZm9yZUtleVN0cm9rZShGWF9CT09MIGJFZGl0T3JMaXN0LCB2b2lkKiBwUHJpdmF0ZURhdGEsIEZYX0lOVDMyIG5LZXlDb2RlLAotCQkJCQkJCQkJCUNGWF9XaWRlU3RyaW5nICYgc3RyQ2hhbmdlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsIAotCQkJCQkJCQkJCWludCBuU2VsU3RhcnQsIGludCBuU2VsRW5kLAotCQkJCQkJCQkJCUZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgJiBiUkMsIEZYX0JPT0wgJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCU9uQWZ0ZXJLZXlTdHJva2UoRlhfQk9PTCBiRWRpdE9yTGlzdCwgdm9pZCogcFByaXZhdGVEYXRhLCBGWF9CT09MICYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKSA9IDA7CitjbGFzcyBJUFdMX0ZpbGxlcl9Ob3RpZnkgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SVBXTF9GaWxsZXJfTm90aWZ5KCkge30KKyAgdmlydHVhbCB2b2lkIFF1ZXJ5V2hlcmVQb3B1cCgKKyAgICAgIHZvaWQqIHBQcml2YXRlRGF0YSwKKyAgICAgIEZYX0ZMT0FUIGZQb3B1cE1pbiwKKyAgICAgIEZYX0ZMT0FUIGZQb3B1cE1heCwKKyAgICAgIGludDMyX3QmIG5SZXQsCisgICAgICBGWF9GTE9BVCYgZlBvcHVwUmV0KSA9IDA7ICAvLyBuUmV0OiAoMDpib3R0b20gMTp0b3ApCisgIHZpcnR1YWwgdm9pZCBPbkJlZm9yZUtleVN0cm9rZSh2b2lkKiBwUHJpdmF0ZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5TZWxTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuU2VsRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiS2V5RG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpID0gMDsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICB2aXJ0dWFsIHZvaWQgT25Qb3B1cFByZU9wZW4odm9pZCogcFByaXZhdGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkV4aXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgPSAwOworICB2aXJ0dWFsIHZvaWQgT25Qb3B1cFBvc3RPcGVuKHZvaWQqIHBQcml2YXRlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgPSAwOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogfTsKIAotY2xhc3MgUFdMX0NMQVNTIENQV0xfRWRpdCA6IHB1YmxpYyBDUFdMX0VkaXRDdHJsLCBwdWJsaWMgSUZYX0VkaXRfT3ByTm90aWZ5Ci17Ci1wdWJsaWM6Ci0JQ1BXTF9FZGl0KCk7Ci0JdmlydHVhbCB+Q1BXTF9FZGl0KCk7CitjbGFzcyBDUFdMX0VkaXQgOiBwdWJsaWMgQ1BXTF9FZGl0Q3RybCwgcHVibGljIElGWF9FZGl0X09wck5vdGlmeSB7CisgcHVibGljOgorICBDUFdMX0VkaXQoKTsKKyAgfkNQV0xfRWRpdCgpIG92ZXJyaWRlOwogCi1wdWJsaWM6Ci0JdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJCUdldENsYXNzTmFtZSgpIGNvbnN0OwotCXZpcnR1YWwgdm9pZAkJCQkJT25EZXN0cm95KCk7Ci0JdmlydHVhbCB2b2lkCQkJCQlPbkNyZWF0ZWQoKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCVJlUG9zQ2hpbGRXbmQoKTsKLQl2aXJ0dWFsIENQREZfUmVjdAkJCQlHZXRDbGllbnRSZWN0KCkgY29uc3Q7CisgIC8vIENQV0xfRWRpdEN0cmwKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0Q2xhc3NOYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgT25EZXN0cm95KCkgb3ZlcnJpZGU7CisgIHZvaWQgT25DcmVhdGVkKCkgb3ZlcnJpZGU7CisgIHZvaWQgUmVQb3NDaGlsZFduZCgpIG92ZXJyaWRlOworICBDUERGX1JlY3QgR2V0Q2xpZW50UmVjdCgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIEdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiYgc0FwcFN0cmVhbSkgb3ZlcnJpZGU7CisgIHZvaWQgRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIG92ZXJyaWRlOworICBGWF9CT09MIE9uTEJ1dHRvbkRibENsayhjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIG92ZXJyaWRlOworICBGWF9CT09MIE9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgb3ZlcnJpZGU7CisgIEZYX0JPT0wgT25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpIG92ZXJyaWRlOworICBGWF9CT09MIE9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykgb3ZlcnJpZGU7CisgIENQREZfUmVjdCBHZXRGb2N1c1JlY3QoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBPblNldEZvY3VzKCkgb3ZlcnJpZGU7CisgIHZvaWQgT25LaWxsRm9jdXMoKSBvdmVycmlkZTsKIAotCXZpcnR1YWwgdm9pZAkJCQkJR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSk7Ci0JdmlydHVhbCB2b2lkCQkJCQlEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7CisgIHZvaWQgU2V0QWxpZ25Gb3JtYXRIKFBXTF9FRElUX0FMSUdORk9STUFUX0ggbkZvcm1hdCA9IFBFQUhfTEVGVCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsgIC8vIDA6bGVmdCAxOnJpZ2h0IDI6bWlkZGxlCisgIHZvaWQgU2V0QWxpZ25Gb3JtYXRWKFBXTF9FRElUX0FMSUdORk9STUFUX1YgbkZvcm1hdCA9IFBFQVZfVE9QLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQYWludCA9IFRSVUUpOyAgLy8gMDp0b3AgMTpib3R0b20gMjpjZW50ZXIKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTEJ1dHRvbkRibENsayhjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgIHZvaWQgU2V0Q2hhckFycmF5KGludDMyX3QgbkNoYXJBcnJheSk7CisgIHZvaWQgU2V0TGltaXRDaGFyKGludDMyX3QgbkxpbWl0Q2hhcik7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworICB2b2lkIFNldEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7CisgIHZvaWQgU2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7CiAKLQl2aXJ0dWFsIENQREZfUmVjdAkJCQlHZXRGb2N1c1JlY3QoKSBjb25zdDsKKyAgdm9pZCBTZXRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7CiAKLXB1YmxpYzoJCQotCXZvaWQJCQkJCQkJU2V0QWxpZ25Gb3JtYXRIKFBXTF9FRElUX0FMSUdORk9STUFUX0ggbkZvcm1hdCA9IFBFQUhfTEVGVCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsJLy8wOmxlZnQgMTpyaWdodCAyOm1pZGRsZSAKLQl2b2lkCQkJCQkJCVNldEFsaWduRm9ybWF0VihQV0xfRURJVF9BTElHTkZPUk1BVF9WIG5Gb3JtYXQgPSBQRUFWX1RPUCwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsJLy8wOnRvcCAxOmJvdHRvbSAyOmNlbnRlcgorICB2b2lkIEVuYWJsZVNwZWxsQ2hlY2soRlhfQk9PTCBiRW5hYmxlZCk7CiAKLQl2b2lkCQkJCQkJCVNldENoYXJBcnJheShGWF9JTlQzMiBuQ2hhckFycmF5KTsKLQl2b2lkCQkJCQkJCVNldExpbWl0Q2hhcihGWF9JTlQzMiBuTGltaXRDaGFyKTsKKyAgRlhfQk9PTCBDYW5TZWxlY3RBbGwoKSBjb25zdDsKKyAgRlhfQk9PTCBDYW5DbGVhcigpIGNvbnN0OworICBGWF9CT09MIENhbkNvcHkoKSBjb25zdDsKKyAgRlhfQk9PTCBDYW5DdXQoKSBjb25zdDsKKyAgRlhfQk9PTCBDYW5QYXN0ZSgpIGNvbnN0OwogCi0Jdm9pZAkJCQkJCQlTZXRIb3J6U2NhbGUoRlhfSU5UMzIgbkhvcnpTY2FsZSwgRlhfQk9PTCBiUGFpbnQgPSBUUlVFKTsKLQl2b2lkCQkJCQkJCVNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlLCBGWF9CT09MIGJQYWludCA9IFRSVUUpOworICB2aXJ0dWFsIHZvaWQgQ29weVRleHQoKTsKKyAgdmlydHVhbCB2b2lkIFBhc3RlVGV4dCgpOworICB2aXJ0dWFsIHZvaWQgQ3V0VGV4dCgpOwogCi0Jdm9pZAkJCQkJCQlTZXRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcsIEZYX0JPT0wgYlBhaW50ID0gVFJVRSk7CisgIHZpcnR1YWwgdm9pZCBTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiBjc1RleHQpOworICB2b2lkIFJlcGxhY2VTZWwoY29uc3QgRlhfV0NIQVIqIGNzVGV4dCk7CiAKLQl2b2lkCQkJCQkJCUVuYWJsZVNwZWxsQ2hlY2soRlhfQk9PTCBiRW5hYmxlZCk7CisgIENGWF9CeXRlU3RyaW5nIEdldFRleHRBcHBlYXJhbmNlU3RyZWFtKGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0KSBjb25zdDsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0Q2FyZXRBcHBlYXJhbmNlU3RyZWFtKGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0KSBjb25zdDsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0U2VsZWN0QXBwZWFyYW5jZVN0cmVhbShjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCkgY29uc3Q7CiAKLQlGWF9CT09MCQkJCQkJCUNhblNlbGVjdEFsbCgpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJQ2FuQ2xlYXIoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUNhbkNvcHkoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUNhbkN1dCgpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJQ2FuUGFzdGUoKSBjb25zdDsKKyAgRlhfQk9PTCBJc1RleHRGdWxsKCkgY29uc3Q7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJCUNvcHlUZXh0KCk7Ci0JdmlydHVhbCB2b2lkCQkJCQlQYXN0ZVRleHQoKTsKLQl2aXJ0dWFsIHZvaWQgCQkJCQlDdXRUZXh0KCk7CisgIHN0YXRpYyBGWF9GTE9BVCBHZXRDaGFyQXJyYXlBdXRvRm9udFNpemUoQ1BERl9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJjUGxhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhckFycmF5KTsKIAotCXZpcnR1YWwgdm9pZAkJCQkJU2V0VGV4dChGWF9MUENXU1RSIGNzVGV4dCk7Ci0Jdm9pZAkJCQkJCQlSZXBsYWNlU2VsKEZYX0xQQ1dTVFIgY3NUZXh0KTsKKyAgdm9pZCBTZXRGaWxsZXJOb3RpZnkoSVBXTF9GaWxsZXJfTm90aWZ5KiBwTm90aWZ5KSB7CisgICAgbV9wRmlsbGVyTm90aWZ5ID0gcE5vdGlmeTsKKyAgfQogCi0JQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldFRleHRBcHBlYXJhbmNlU3RyZWFtKGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCkgY29uc3Q7Ci0JQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldENhcmV0QXBwZWFyYW5jZVN0cmVhbShjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQpIGNvbnN0OwkKLQlDRlhfQnl0ZVN0cmluZwkJCQkJR2V0U2VsZWN0QXBwZWFyYW5jZVN0cmVhbShjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlUGFnZU9iamVjdHMoQ1BERl9QYWdlT2JqZWN0cyogcFBhZ2VPYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX1RleHRPYmplY3QqPiYgT2JqQXJyYXkpOworICB2b2lkIEdlbmVyYXRlUGFnZU9iamVjdHMoQ1BERl9QYWdlT2JqZWN0cyogcFBhZ2VPYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQpOwogCi0JRlhfQk9PTAkJCQkJCQlJc1RleHRGdWxsKCkgY29uc3Q7CQorIHByb3RlY3RlZDoKKyAgLy8gSUZYX0VkaXRfT3ByTm90aWZ5CisgIHZvaWQgT25JbnNlcnRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSBvdmVycmlkZTsKKyAgdm9pZCBPbkluc2VydFJldHVybihjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSBvdmVycmlkZTsKKyAgdm9pZCBPbkJhY2tTcGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSBvdmVycmlkZTsKKyAgdm9pZCBPbkRlbGV0ZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSBvdmVycmlkZTsKKyAgdm9pZCBPbkNsZWFyKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkgb3ZlcnJpZGU7CisgIHZvaWQgT25TZXRUZXh0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSBvdmVycmlkZTsKKyAgdm9pZCBPbkluc2VydFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpIG92ZXJyaWRlOworICB2b2lkIE9uQWRkVW5kbyhJRlhfRWRpdF9VbmRvSXRlbSogcFVuZG9JdGVtKSBvdmVycmlkZTsKIAotCXN0YXRpYyBGWF9GTE9BVAkJCQkJR2V0Q2hhckFycmF5QXV0b0ZvbnRTaXplKENQREZfRm9udCogcEZvbnQsIGNvbnN0IENQREZfUmVjdCYgcmNQbGF0ZSwgRlhfSU5UMzIgbkNoYXJBcnJheSk7CisgcHJpdmF0ZToKKyAgQ1BWVF9Xb3JkUmFuZ2UgR2V0U2VsZWN0V29yZFJhbmdlKCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBTaG93VlNjcm9sbEJhcihGWF9CT09MIGJTaG93KTsKKyAgRlhfQk9PTCBJc1ZTY3JvbGxCYXJWaXNpYmxlKCkgY29uc3Q7CisgIHZvaWQgU2V0UGFyYW1CeUZsYWcoKTsKIAotCXZvaWQJCQkJCQkJU2V0RmlsbGVyTm90aWZ5KElQV0xfRmlsbGVyX05vdGlmeSogcE5vdGlmeSkge21fcEZpbGxlck5vdGlmeSA9IHBOb3RpZnk7fQorICBGWF9GTE9BVCBHZXRDaGFyQXJyYXlBdXRvRm9udFNpemUoaW50MzJfdCBuQ2hhckFycmF5KTsKKyAgQ1BERl9Qb2ludCBHZXRXb3JkUmlnaHRCb3R0b21Qb2ludChjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BXb3JkKTsKIAotCXZvaWQJCQkJCQkJR2VuZXJhdGVQYWdlT2JqZWN0cyhDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9iamVjdHMsIAotCQkJCQkJCQkJCWNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LCBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX1RleHRPYmplY3QqPiYgT2JqQXJyYXkpOwotCXZvaWQJCQkJCQkJR2VuZXJhdGVQYWdlT2JqZWN0cyhDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9iamVjdHMsIAotCQkJCQkJCQkJCWNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0KTsKKyAgQ1BWVF9Xb3JkUmFuZ2UgQ29tYmluZVdvcmRSYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cjIpOworICBDUFZUX1dvcmRSYW5nZSBHZXRMYXRpbldvcmRzUmFuZ2UoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0OworICBDUFZUX1dvcmRSYW5nZSBHZXRMYXRpbldvcmRzUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdDsKKyAgQ1BWVF9Xb3JkUmFuZ2UgR2V0QXJhYmljV29yZHNSYW5nZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0OworICBDUFZUX1dvcmRSYW5nZSBHZXRTYW1lV29yZHNSYW5nZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxhdGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBcmFiaWMpIGNvbnN0OwogCi1wcm90ZWN0ZWQ6Ci0JdmlydHVhbCB2b2lkCQkJCQlPblNldEZvY3VzKCk7Ci0JdmlydHVhbCB2b2lkCQkJCQlPbktpbGxGb2N1cygpOworIHB1YmxpYzoKKyAgRlhfQk9PTCBJc1Byb2NlZWR0b09uQ2hhcihGWF9XT1JEIG5LZXlDb2RlLCBGWF9EV09SRCBuRmxhZyk7CiAKLXByb3RlY3RlZDoKLQl2aXJ0dWFsIHZvaWQJCQkJCU9uSW5zZXJ0V29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSk7Ci0JdmlydHVhbCB2b2lkCQkJCQlPbkluc2VydFJldHVybihjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSk7Ci0JdmlydHVhbCB2b2lkCQkJCQlPbkJhY2tTcGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSk7Ci0JdmlydHVhbCB2b2lkCQkJCQlPbkRlbGV0ZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSk7Ci0JdmlydHVhbCB2b2lkCQkJCQlPbkNsZWFyKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCU9uU2V0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSk7Ci0JdmlydHVhbCB2b2lkCQkJCQlPbkluc2VydFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpOwotCXZpcnR1YWwgdm9pZAkJCQkJT25BZGRVbmRvKElGWF9FZGl0X1VuZG9JdGVtKiBwVW5kb0l0ZW0pOworIHByaXZhdGU6CisgIElQV0xfRmlsbGVyX05vdGlmeSogbV9wRmlsbGVyTm90aWZ5OworICBJUFdMX1NwZWxsQ2hlY2sqIG1fcFNwZWxsQ2hlY2s7CisgIEZYX0JPT0wgbV9iRm9jdXM7CisgIENQREZfUmVjdCBtX3JjT2xkV2luZG93OwogCi1wcml2YXRlOgkKLQlDUFZUX1dvcmRSYW5nZQkJCQkJR2V0U2VsZWN0V29yZFJhbmdlKCkgY29uc3Q7Ci0JdmlydHVhbCB2b2lkCQkJCQlTaG93VlNjcm9sbEJhcihGWF9CT09MIGJTaG93KTsKLQlGWF9CT09MCQkJCQkJCUlzVlNjcm9sbEJhclZpc2libGUoKSBjb25zdDsKLQl2b2lkCQkJCQkJCVNldFBhcmFtQnlGbGFnKCk7CisgcHVibGljOgorICB2b2lkIEF0dGFjaEZGTERhdGEodm9pZCogcERhdGEpIHsgbV9wRm9ybUZpbGxlciA9IHBEYXRhOyB9CiAKLQlGWF9GTE9BVAkJCQkJCUdldENoYXJBcnJheUF1dG9Gb250U2l6ZShGWF9JTlQzMiBuQ2hhckFycmF5KTsKLQlDUERGX1BvaW50CQkJCQkJR2V0V29yZFJpZ2h0Qm90dG9tUG9pbnQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwV29yZCk7Ci0KLQlDUFZUX1dvcmRSYW5nZQkJCQkJQ29tYmluZVdvcmRSYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IxLCBjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IyKTsKLQlDUFZUX1dvcmRSYW5nZQkJCQkJR2V0TGF0aW5Xb3Jkc1JhbmdlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3Q7Ci0JQ1BWVF9Xb3JkUmFuZ2UJCQkJCUdldExhdGluV29yZHNSYW5nZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdDsKLQlDUFZUX1dvcmRSYW5nZQkJCQkJR2V0QXJhYmljV29yZHNSYW5nZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdDsKLQlDUFZUX1dvcmRSYW5nZQkJCQkJR2V0U2FtZVdvcmRzUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgRlhfQk9PTCBiTGF0aW4sIEZYX0JPT0wgYkFyYWJpYykgY29uc3Q7Ci0KLQl2b2lkCQkJCQkJCUFqdXN0QXJhYmljV29yZHMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyKTsKLXB1YmxpYzoKLQlGWF9CT09MCQkJCQkJCUlzUHJvY2VlZHRvT25DaGFyKEZYX1dPUkQgbktleUNvZGUsIEZYX0RXT1JEIG5GbGFnKTsKLXByaXZhdGU6Ci0JSVBXTF9GaWxsZXJfTm90aWZ5KgkJCQltX3BGaWxsZXJOb3RpZnk7Ci0JSVBXTF9TcGVsbENoZWNrKgkJCQltX3BTcGVsbENoZWNrOwotCUZYX0JPT0wJCQkJCQkJbV9iRm9jdXM7Ci0JQ1BERl9SZWN0CQkJCQkJbV9yY09sZFdpbmRvdzsKLXB1YmxpYzoKLQl2b2lkCQkJCQkJCUF0dGFjaEZGTERhdGEodm9pZCogcERhdGEpIHttX3BGb3JtRmlsbGVyID0gcERhdGE7fQotcHJpdmF0ZToKLQl2b2lkKgkJCQkJCQltX3BGb3JtRmlsbGVyOworIHByaXZhdGU6CisgIHZvaWQqIG1fcEZvcm1GaWxsZXI7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9QREZXSU5ET1dfUFdMX0VESVRfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9FZGl0Q3RybC5oCmluZGV4IDYwMGMzNDguLjBkNWM5MzEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRWRpdEN0cmwuaApAQCAtMSwxNSArMSwxNSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIEZQREZTREtfSU5DTFVERV9QREZXSU5ET1dfUFdMX0VESVRDVFJMX0hfCiAjZGVmaW5lIEZQREZTREtfSU5DTFVERV9QREZXSU5ET1dfUFdMX0VESVRDVFJMX0hfCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyaW5nLmgiCi0jaW5jbHVkZSAiLi4vZnhlZGl0L2Z4X2VkaXQuaCIKICNpbmNsdWRlICJQV0xfV25kLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhfZWRpdC5oIgogCiBjbGFzcyBDUFdMX0NhcmV0OwogY2xhc3MgQ1BXTF9FZGl0OwpAQCAtMTgsMTU5ICsxOCwxNjQgQEAKIGNsYXNzIElQV0xfRWRpdF9Ob3RpZnk7CiBzdHJ1Y3QgQ1BWVF9Xb3JkUGxhY2U7CiAKLWVudW0gUFdMX0VESVRfQUxJR05GT1JNQVRfSAotewotCVBFQUhfTEVGVCA9IDAsCi0JUEVBSF9NSURETEUsCi0JUEVBSF9SSUdIVAorZW51bSBQV0xfRURJVF9BTElHTkZPUk1BVF9IIHsgUEVBSF9MRUZUID0gMCwgUEVBSF9NSURETEUsIFBFQUhfUklHSFQgfTsKKworZW51bSBQV0xfRURJVF9BTElHTkZPUk1BVF9WIHsgUEVBVl9UT1AgPSAwLCBQRUFWX0NFTlRFUiwgUEVBVl9CT1RUT00gfTsKKworY2xhc3MgSVBXTF9FZGl0X05vdGlmeSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JUFdMX0VkaXRfTm90aWZ5KCkge30KKyAgLy8gd2hlbiB0aGUgcG9zaXRpb24gb2YgY2FyZXQgaXMgY2hhbmdlZCBpbiBlZGl0CisgIHZpcnR1YWwgdm9pZCBPbkNhcmV0TW92ZShpbnQzMl90IHgxLCBpbnQzMl90IHkxLCBpbnQzMl90IHgyLCBpbnQzMl90IHkyKSB7fQorICB2aXJ0dWFsIHZvaWQgT25Db250ZW50Q2hhbmdlKGNvbnN0IENQREZfUmVjdCYgcmNDb250ZW50KSB7fQorICAvLyBPcHJUeXBlOiAwIEluc2VydFdvcmQKKyAgLy8gMSBJbnNlcnRSZXR1cm4KKyAgLy8gMiBCYWNrU3BhY2UKKyAgLy8gMyBEZWxldGUKKyAgLy8gNCBDbGVhcgorICAvLyA1IEluc2VydFRleHQKKyAgLy8gNiBTZXRUZXh0CisgIHZpcnR1YWwgdm9pZCBPbkluc2VydFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkge30KKyAgdmlydHVhbCB2b2lkIE9uSW5zZXJ0UmV0dXJuKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkge30KKyAgdmlydHVhbCB2b2lkIE9uQmFja1NwYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkge30KKyAgdmlydHVhbCB2b2lkIE9uRGVsZXRlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkge30KKyAgdmlydHVhbCB2b2lkIE9uQ2xlYXIoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpIHt9CisgIHZpcnR1YWwgdm9pZCBPbkluc2VydFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkge30KKyAgdmlydHVhbCB2b2lkIE9uU2V0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSB7fQorICB2aXJ0dWFsIHZvaWQgT25BZGRVbmRvKENQV0xfRWRpdCogcEVkaXQpIHt9CiB9OwogCi1lbnVtIFBXTF9FRElUX0FMSUdORk9STUFUX1YKLXsKLQlQRUFWX1RPUCA9IDAsCi0JUEVBVl9DRU5URVIsCi0JUEVBVl9CT1RUT00KLX07CitjbGFzcyBDUFdMX0VkaXRDdHJsIDogcHVibGljIENQV0xfV25kLCBwdWJsaWMgSUZYX0VkaXRfTm90aWZ5IHsKKyAgZnJpZW5kIGNsYXNzIENQV0xfRWRpdF9Ob3RpZnk7CiAKLWNsYXNzIElQV0xfRWRpdF9Ob3RpZnkKLXsKLXB1YmxpYzoKLSAgICAgICAgdmlydHVhbCB+SVBXTF9FZGl0X05vdGlmeSgpIHsgfQotCS8vd2hlbiB0aGUgcG9zaXRpb24gb2YgY2FyZXQgaXMgY2hhbmdlZCBpbiBlZGl0Ci0JdmlydHVhbCB2b2lkCQkJCQlPbkNhcmV0TW92ZShGWF9JTlQzMiB4MSwgRlhfSU5UMzIgeTEsIEZYX0lOVDMyIHgyLCBGWF9JTlQzMiB5Mikge30KLQl2aXJ0dWFsIHZvaWQJCQkJCU9uQ29udGVudENoYW5nZShjb25zdCBDUERGX1JlY3QmIHJjQ29udGVudCl7fQotCS8vT3ByVHlwZTogMCBJbnNlcnRXb3JkCi0JLy8xIEluc2VydFJldHVybgotCS8vMiBCYWNrU3BhY2UKLQkvLzMgRGVsZXRlCi0JLy80IENsZWFyCi0JLy81IEluc2VydFRleHQKLQkvLzYgU2V0VGV4dAotCXZpcnR1YWwgdm9pZAkJCQkJT25JbnNlcnRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKXt9Ci0JdmlydHVhbCB2b2lkCQkJCQlPbkluc2VydFJldHVybihjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSl7fQotCXZpcnR1YWwgdm9pZAkJCQkJT25CYWNrU3BhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2Upe30KLQl2aXJ0dWFsIHZvaWQJCQkJCU9uRGVsZXRlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKXt9Ci0JdmlydHVhbCB2b2lkCQkJCQlPbkNsZWFyKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKXt9Ci0JdmlydHVhbCB2b2lkCQkJCQlPbkluc2VydFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2Upe30KLQl2aXJ0dWFsIHZvaWQJCQkJCU9uU2V0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSl7fQotCXZpcnR1YWwgdm9pZAkJCQkJT25BZGRVbmRvKENQV0xfRWRpdCogcEVkaXQpIHt9Ci19OworIHB1YmxpYzoKKyAgQ1BXTF9FZGl0Q3RybCgpOworICB+Q1BXTF9FZGl0Q3RybCgpIG92ZXJyaWRlOwogCi1jbGFzcyBQV0xfQ0xBU1MgQ1BXTF9FZGl0Q3RybCA6IHB1YmxpYyBDUFdMX1duZCwgcHVibGljIElGWF9FZGl0X05vdGlmeQotewotCWZyaWVuZCBjbGFzcyBDUFdMX0VkaXRfTm90aWZ5OworICBDUERGX1JlY3QgR2V0Q29udGVudFJlY3QoKSBjb25zdDsKKyAgdm9pZCBHZXRDYXJldFBvcyhpbnQzMl90JiB4LCBpbnQzMl90JiB5KSBjb25zdDsKIAotcHVibGljOgotCUNQV0xfRWRpdEN0cmwoKTsKLQl2aXJ0dWFsIH5DUFdMX0VkaXRDdHJsKCk7CisgIENGWF9XaWRlU3RyaW5nIEdldFRleHQoKSBjb25zdDsKKyAgdm9pZCBTZXRTZWwoaW50MzJfdCBuU3RhcnRDaGFyLCBpbnQzMl90IG5FbmRDaGFyKTsKKyAgdm9pZCBHZXRTZWwoaW50MzJfdCYgblN0YXJ0Q2hhciwgaW50MzJfdCYgbkVuZENoYXIpIGNvbnN0OworICB2b2lkIEdldFRleHRSYW5nZShjb25zdCBDUERGX1JlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5TdGFydENoYXIsCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5FbmRDaGFyKSBjb25zdDsKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0VGV4dChpbnQzMl90JiBuU3RhcnRDaGFyLCBpbnQzMl90JiBuRW5kQ2hhcikgY29uc3Q7CisgIHZvaWQgQ2xlYXIoKTsKKyAgdm9pZCBTZWxlY3RBbGwoKTsKIAotcHVibGljOgotCXZpcnR1YWwgdm9pZAkJCQkJT25DcmVhdGUoUFdMX0NSRUFURVBBUkFNICYgY3ApOwotCXZpcnR1YWwgdm9pZAkJCQkJT25DcmVhdGVkKCk7CisgIGludDMyX3QgR2V0Q2FyZXQoKSBjb25zdDsKKyAgdm9pZCBTZXRDYXJldChpbnQzMl90IG5Qb3MpOworICBpbnQzMl90IEdldFRvdGFsV29yZHMoKSBjb25zdDsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwkKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwkKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgdm9pZAkJCQkJT25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgRlhfSU5UUFRSIHdQYXJhbSA9IDAsIEZYX0lOVFBUUiBsUGFyYW0gPSAwKTsKKyAgdm9pZCBQYWludCgpOwogCi0JdmlydHVhbCB2b2lkCQkJCQlDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7Ci0JdmlydHVhbCB2b2lkCQkJCQlSZVBvc0NoaWxkV25kKCk7CQotCXZpcnR1YWwgdm9pZAkJCQkJU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsKLQl2aXJ0dWFsIEZYX0ZMT0FUCQkJCUdldEZvbnRTaXplKCkgY29uc3Q7Ci0JCi1wdWJsaWM6Ci0JdmlydHVhbCB2b2lkCQkJCQlTZXRUZXh0KEZYX0xQQ1dTVFIgY3NUZXh0KTsKKyAgdm9pZCBFbmFibGVSZWZyZXNoKEZYX0JPT0wgYlJlZnJlc2gpOworICBDUERGX1BvaW50IEdldFNjcm9sbFBvcygpIGNvbnN0OworICB2b2lkIFNldFNjcm9sbFBvcyhjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJCUNvcHlUZXh0KCk7Ci0JdmlydHVhbCB2b2lkCQkJCQlQYXN0ZVRleHQoKTsKLQl2aXJ0dWFsIHZvaWQgCQkJCQlDdXRUZXh0KCk7CisgIHZvaWQgU2V0RWRpdE5vdGlmeShJUFdMX0VkaXRfTm90aWZ5KiBwTm90aWZ5KSB7IG1fcEVkaXROb3RpZnkgPSBwTm90aWZ5OyB9CiAKLQlDUERGX1JlY3QJCQkJCQlHZXRDb250ZW50UmVjdCgpIGNvbnN0OwotCXZvaWQJCQkJCQkJR2V0Q2FyZXRQb3MoRlhfSU5UMzImIHgsIEZYX0lOVDMyJiB5KSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUlzTW9kaWZpZWQoKSBjb25zdDsKKyAgdm9pZCBTZXRDaGFyU2V0KHVpbnQ4X3QgbkNoYXJTZXQpIHsgbV9uQ2hhclNldCA9IG5DaGFyU2V0OyB9CisgIGludDMyX3QgR2V0Q2hhclNldCgpIGNvbnN0OwogCi0JQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldFRleHQoKSBjb25zdDsKLQl2b2lkCQkJCQkJCVNldFNlbChGWF9JTlQzMiBuU3RhcnRDaGFyLEZYX0lOVDMyIG5FbmRDaGFyKTsKLQl2b2lkCQkJCQkJCUdldFNlbChGWF9JTlQzMiAmIG5TdGFydENoYXIsIEZYX0lOVDMyICYgbkVuZENoYXIgKSBjb25zdDsKLQl2b2lkCQkJCQkJCUdldFRleHRSYW5nZShjb25zdCBDUERGX1JlY3QmIHJlY3QsIEZYX0lOVDMyICYgblN0YXJ0Q2hhciwgRlhfSU5UMzIgJiBuRW5kQ2hhcikgY29uc3Q7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJCUdldFRleHQoRlhfSU5UMzIgJiBuU3RhcnRDaGFyLCBGWF9JTlQzMiAmIG5FbmRDaGFyKSBjb25zdDsKLQl2b2lkCQkJCQkJCUNsZWFyKCk7Ci0Jdm9pZAkJCQkJCQlTZWxlY3RBbGwoKTsKKyAgdm9pZCBTZXRDb2RlUGFnZShpbnQzMl90IG5Db2RlUGFnZSkgeyBtX25Db2RlUGFnZSA9IG5Db2RlUGFnZTsgfQorICBpbnQzMl90IEdldENvZGVQYWdlKCkgY29uc3QgeyByZXR1cm4gbV9uQ29kZVBhZ2U7IH0KIAotCUZYX0lOVDMyCQkJCQkJR2V0Q2FyZXQoKSBjb25zdDsKLQl2b2lkCQkJCQkJCVNldENhcmV0KEZYX0lOVDMyIG5Qb3MpOwotCUZYX0lOVDMyCQkJCQkJR2V0VG90YWxXb3JkcygpIGNvbnN0OworICBDUERGX0ZvbnQqIEdldENhcmV0Rm9udCgpIGNvbnN0OworICBGWF9GTE9BVCBHZXRDYXJldEZvbnRTaXplKCkgY29uc3Q7CiAKLQl2b2lkCQkJCQkJCVBhaW50KCk7CisgIEZYX0JPT0wgQ2FuVW5kbygpIGNvbnN0OworICBGWF9CT09MIENhblJlZG8oKSBjb25zdDsKKyAgdm9pZCBSZWRvKCk7CisgIHZvaWQgVW5kbygpOwogCi0Jdm9pZAkJCQkJCQlFbmFibGVSZWZyZXNoKEZYX0JPT0wgYlJlZnJlc2gpOwkKLQlDUERGX1BvaW50CQkJCQkJR2V0U2Nyb2xsUG9zKCkgY29uc3Q7Ci0Jdm9pZAkJCQkJCQlTZXRTY3JvbGxQb3MoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICB2b2lkIFNldFJlYWR5VG9JbnB1dCgpOwogCi0Jdm9pZAkJCQkJCQlTZXRFZGl0Tm90aWZ5KElQV0xfRWRpdF9Ob3RpZnkqIHBOb3RpZnkpIHttX3BFZGl0Tm90aWZ5ID0gcE5vdGlmeTt9CQorICAvLyBDUFdMX1duZAorICB2b2lkIE9uQ3JlYXRlKFBXTF9DUkVBVEVQQVJBTSYgY3ApIG92ZXJyaWRlOworICB2b2lkIE9uQ3JlYXRlZCgpIG92ZXJyaWRlOworICBGWF9CT09MIE9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykgb3ZlcnJpZGU7CisgIEZYX0JPT0wgT25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgb3ZlcnJpZGU7CisgIEZYX0JPT0wgT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIG92ZXJyaWRlOworICB2b2lkIE9uTm90aWZ5KENQV0xfV25kKiBwV25kLAorICAgICAgICAgICAgICAgIEZYX0RXT1JEIG1zZywKKyAgICAgICAgICAgICAgICBpbnRwdHJfdCB3UGFyYW0gPSAwLAorICAgICAgICAgICAgICAgIGludHB0cl90IGxQYXJhbSA9IDApIG92ZXJyaWRlOworICB2b2lkIENyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApIG92ZXJyaWRlOworICB2b2lkIFJlUG9zQ2hpbGRXbmQoKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpIG92ZXJyaWRlOworICBGWF9GTE9BVCBHZXRGb250U2l6ZSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNldEN1cnNvcigpIG92ZXJyaWRlOwogCi0Jdm9pZAkJCQkJCQlTZXRDaGFyU2V0KEZYX0JZVEUgbkNoYXJTZXQpe21fbkNoYXJTZXQgPSBuQ2hhclNldDt9Ci0JRlhfSU5UMzIJCQkJCQlHZXRDaGFyU2V0KCkgY29uc3Q7CisgcHJvdGVjdGVkOgorICAvLyBJRlhfRWRpdF9Ob3RpZnkKKyAgdm9pZCBJT25TZXRTY3JvbGxJbmZvWChGWF9GTE9BVCBmUGxhdGVNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBsYXRlTWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50TWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTbWFsbFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkJpZ1N0ZXApIG92ZXJyaWRlIHt9CisgIHZvaWQgSU9uU2V0U2Nyb2xsSW5mb1koRlhfRkxPQVQgZlBsYXRlTWluLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQbGF0ZU1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29udGVudE1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29udGVudE1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU21hbGxTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZCaWdTdGVwKSBvdmVycmlkZTsKKyAgdm9pZCBJT25TZXRTY3JvbGxQb3NYKEZYX0ZMT0FUIGZ4KSBvdmVycmlkZSB7fQorICB2b2lkIElPblNldFNjcm9sbFBvc1koRlhfRkxPQVQgZnkpIG92ZXJyaWRlOworICB2b2lkIElPblNldENhcmV0KEZYX0JPT0wgYlZpc2libGUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRIZWFkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0Rm9vdCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIG92ZXJyaWRlOworICB2b2lkIElPbkNhcmV0Q2hhbmdlKGNvbnN0IENQVlRfU2VjUHJvcHMmIHNlY1Byb3BzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzJiB3b3JkUHJvcHMpIG92ZXJyaWRlOworICB2b2lkIElPbkNvbnRlbnRDaGFuZ2UoY29uc3QgQ1BERl9SZWN0JiByY0NvbnRlbnQpIG92ZXJyaWRlOworICB2b2lkIElPbkludmFsaWRhdGVSZWN0KENQREZfUmVjdCogcFJlY3QpIG92ZXJyaWRlOwogCi0Jdm9pZAkJCQkJCQlTZXRDb2RlUGFnZShGWF9JTlQzMiBuQ29kZVBhZ2Upe21fbkNvZGVQYWdlID0gbkNvZGVQYWdlO30KLQlGWF9JTlQzMgkJCQkJCUdldENvZGVQYWdlKCkgY29uc3Qge3JldHVybiBtX25Db2RlUGFnZTt9CisgIHZvaWQgSW5zZXJ0VGV4dChjb25zdCBGWF9XQ0hBUiogY3NUZXh0KTsKKyAgdm9pZCBTZXRUZXh0KGNvbnN0IEZYX1dDSEFSKiBjc1RleHQpOworICB2b2lkIENvcHlUZXh0KCk7CisgIHZvaWQgUGFzdGVUZXh0KCk7CisgIHZvaWQgQ3V0VGV4dCgpOworICB2b2lkIFNob3dWU2Nyb2xsQmFyKEZYX0JPT0wgYlNob3cpOworICB2b2lkIEluc2VydFdvcmQoRlhfV09SRCB3b3JkLCBpbnQzMl90IG5DaGFyc2V0KTsKKyAgdm9pZCBJbnNlcnRSZXR1cm4oKTsKIAotCUNQREZfRm9udCAqCQkJCQkJR2V0Q2FyZXRGb250KCkgY29uc3Q7Ci0JRlhfRkxPQVQJCQkJCQlHZXRDYXJldEZvbnRTaXplKCkgY29uc3Q7CisgIEZYX0JPT0wgSXNXbmRIb3JWKCk7CiAKLQlGWF9CT09MCQkJCQkJCUNhblVuZG8oKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUNhblJlZG8oKSBjb25zdDsKLQl2b2lkCQkJCQkJCVJlZG8oKTsKLQl2b2lkCQkJCQkJCVVuZG8oKTsKKyAgdm9pZCBEZWxldGUoKTsKKyAgdm9pZCBCYWNrc3BhY2UoKTsKIAotCXZvaWQJCQkJCQkJU2V0UmVhZHlUb0lucHV0KCk7Ci1wcm90ZWN0ZWQ6Ci0JdmlydHVhbCB2b2lkCQkJCQlTaG93VlNjcm9sbEJhcihGWF9CT09MIGJTaG93KTsKKyAgdm9pZCBHZXRDYXJldEluZm8oQ1BERl9Qb2ludCYgcHRIZWFkLCBDUERGX1BvaW50JiBwdEZvb3QpIGNvbnN0OworICB2b2lkIFNldENhcmV0KEZYX0JPT0wgYlZpc2libGUsCisgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRIZWFkLAorICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0Rm9vdCk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJCUluc2VydFdvcmQoRlhfV09SRCB3b3JkLCBGWF9JTlQzMiBuQ2hhcnNldCk7Ci0JdmlydHVhbCB2b2lkCQkJCQlJbnNlcnRSZXR1cm4oKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCUluc2VydFRleHQoRlhfTFBDV1NUUiBjc1RleHQpOworICB2b2lkIFNldEVkaXRDYXJldChGWF9CT09MIGJWaXNpYmxlKTsKIAotCXZpcnR1YWwgdm9pZAkJCQkJU2V0Q3Vyc29yKCk7Ci0JRlhfQk9PTAkJCQkJCQlJc1duZEhvclYoKTsKKyBwcml2YXRlOgorICB2b2lkIENyZWF0ZUVkaXRDYXJldChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKTsKIAotCXZvaWQJCQkJCQkJRGVsZXRlKCk7Ci0Jdm9pZAkJCQkJCQlCYWNrc3BhY2UoKTsKKyBwcm90ZWN0ZWQ6CisgIElGWF9FZGl0KiBtX3BFZGl0OworICBDUFdMX0NhcmV0KiBtX3BFZGl0Q2FyZXQ7CisgIEZYX0JPT0wgbV9iTW91c2VEb3duOworICBJUFdMX0VkaXRfTm90aWZ5KiBtX3BFZGl0Tm90aWZ5OwogCi1wcm90ZWN0ZWQ6Ci0Jdm9pZAkJCQkJCQlHZXRDYXJldEluZm8oQ1BERl9Qb2ludCAmIHB0SGVhZCwgQ1BERl9Qb2ludCAmIHB0Rm9vdCkgY29uc3Q7Ci0Jdm9pZAkJCQkJCQlTZXRDYXJldChGWF9CT09MIGJWaXNpYmxlLCBjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLCBjb25zdCBDUERGX1BvaW50ICYgcHRGb290KTsKLQkKLQl2b2lkCQkJCQkJCVNldEVkaXRDYXJldChGWF9CT09MIGJWaXNpYmxlKTsKLQotcHJvdGVjdGVkOgotCXZpcnR1YWwgdm9pZAkJCQkJSU9uU2V0U2Nyb2xsSW5mb1goRlhfRkxPQVQgZlBsYXRlTWluLCBGWF9GTE9BVCBmUGxhdGVNYXgsIAotCQkJCQkJCQkJCQkJRlhfRkxPQVQgZkNvbnRlbnRNaW4sIEZYX0ZMT0FUIGZDb250ZW50TWF4LCAKLQkJCQkJCQkJCQkJCUZYX0ZMT0FUIGZTbWFsbFN0ZXAsIEZYX0ZMT0FUIGZCaWdTdGVwKXt9Ci0JdmlydHVhbCB2b2lkCQkJCQlJT25TZXRTY3JvbGxJbmZvWShGWF9GTE9BVCBmUGxhdGVNaW4sIEZYX0ZMT0FUIGZQbGF0ZU1heCwgCi0JCQkJCQkJCQkJCQlGWF9GTE9BVCBmQ29udGVudE1pbiwgRlhfRkxPQVQgZkNvbnRlbnRNYXgsIAotCQkJCQkJCQkJCQkJRlhfRkxPQVQgZlNtYWxsU3RlcCwgRlhfRkxPQVQgZkJpZ1N0ZXApOwotCXZpcnR1YWwgdm9pZAkJCQkJSU9uU2V0U2Nyb2xsUG9zWChGWF9GTE9BVCBmeCl7fQotCXZpcnR1YWwgdm9pZAkJCQkJSU9uU2V0U2Nyb2xsUG9zWShGWF9GTE9BVCBmeSk7Ci0JdmlydHVhbCB2b2lkCQkJCQlJT25TZXRDYXJldChGWF9CT09MIGJWaXNpYmxlLGNvbnN0IENQREZfUG9pbnQgJiBwdEhlYWQsY29uc3QgQ1BERl9Qb2ludCAmIHB0Rm9vdCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCUlPbkNhcmV0Q2hhbmdlKGNvbnN0IENQVlRfU2VjUHJvcHMgJiBzZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgJiB3b3JkUHJvcHMpOwotCXZpcnR1YWwgdm9pZAkJCQkJSU9uQ29udGVudENoYW5nZShjb25zdCBDUERGX1JlY3QmIHJjQ29udGVudCk7Ci0JdmlydHVhbCB2b2lkCQkJCQlJT25JbnZhbGlkYXRlUmVjdChDUERGX1JlY3QgKiBwUmVjdCk7Ci0KLXByaXZhdGU6Ci0Jdm9pZAkJCQkJCQlDcmVhdGVFZGl0Q2FyZXQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApOwotCi1wcm90ZWN0ZWQ6Ci0JSUZYX0VkaXQqCQkJCQkJbV9wRWRpdDsKLQlDUFdMX0NhcmV0KgkJCQkJCW1fcEVkaXRDYXJldDsKLQlGWF9CT09MCQkJCQkJCW1fYk1vdXNlRG93bjsKLQlJUFdMX0VkaXRfTm90aWZ5KgkJCQltX3BFZGl0Tm90aWZ5OwkKLQotcHJpdmF0ZToKLQlGWF9JTlQzMgkJCQkJCW1fbkNoYXJTZXQ7Ci0JRlhfSU5UMzIJCQkJCQltX25Db2RlUGFnZTsKKyBwcml2YXRlOgorICBpbnQzMl90IG1fbkNoYXJTZXQ7CisgIGludDMyX3QgbV9uQ29kZVBhZ2U7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9QREZXSU5ET1dfUFdMX0VESVRDVFJMX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Gb250TWFwLmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Gb250TWFwLmgKaW5kZXggY2RjZTg2Mi4uYzhjODcyMiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRm9udE1hcC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ZvbnRNYXAuaApAQCAtMSwxMzkgKzEsMTM3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgRlBERlNES19JTkNMVURFX1BERldJTkRPV19QV0xfRk9OVE1BUF9IXwogI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9GT05UTUFQX0hfCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9wdWJsaWMvZnBkZl9zeXNmb250aW5mby5oIgotI2luY2x1ZGUgIi4uL2Z4ZWRpdC9meF9lZGl0LmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meF9lZGl0LmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZfc3lzZm9udGluZm8uaCIKIAogY2xhc3MgQ1BERl9Eb2N1bWVudDsKIGNsYXNzIElGWF9TeXN0ZW1IYW5kbGVyOwogCi1zdHJ1Y3QgQ1BXTF9Gb250TWFwX0RhdGEKLXsKLQlDUERGX0ZvbnQqCQkJcEZvbnQ7Ci0JRlhfSU5UMzIJCQluQ2hhcnNldDsKLQlDRlhfQnl0ZVN0cmluZwkJc0ZvbnROYW1lOworc3RydWN0IENQV0xfRm9udE1hcF9EYXRhIHsKKyAgQ1BERl9Gb250KiBwRm9udDsKKyAgaW50MzJfdCBuQ2hhcnNldDsKKyAgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnROYW1lOwogfTsKIAotc3RydWN0IENQV0xfRm9udE1hcF9OYXRpdmUKLXsKLQlGWF9JTlQzMgkJCW5DaGFyc2V0OwotCUNGWF9CeXRlU3RyaW5nCQlzRm9udE5hbWU7CitzdHJ1Y3QgQ1BXTF9Gb250TWFwX05hdGl2ZSB7CisgIGludDMyX3QgbkNoYXJzZXQ7CisgIENGWF9CeXRlU3RyaW5nIHNGb250TmFtZTsKIH07CiAKICNpZm5kZWYgQU5TSV9DSEFSU0VUCiAKLSNkZWZpbmUgQU5TSV9DSEFSU0VUICAgICAgICAgICAgMAotI2RlZmluZSBERUZBVUxUX0NIQVJTRVQgICAgICAgICAxCi0jZGVmaW5lIFNZTUJPTF9DSEFSU0VUICAgICAgICAgIDIKLSNkZWZpbmUgU0hJRlRKSVNfQ0hBUlNFVCAgICAgICAgMTI4Ci0jZGVmaW5lIEhBTkdFVUxfQ0hBUlNFVCAgICAgICAgIDEyOQotI2RlZmluZSBIQU5HVUxfQ0hBUlNFVCAgICAgICAgICAxMjkKLSNkZWZpbmUgR0IyMzEyX0NIQVJTRVQgICAgICAgICAgMTM0Ci0jZGVmaW5lIENISU5FU0VCSUc1X0NIQVJTRVQgICAgIDEzNgotI2RlZmluZSBPRU1fQ0hBUlNFVCAgICAgICAgICAgICAyNTUKLSNkZWZpbmUgSk9IQUJfQ0hBUlNFVCAgICAgICAgICAgMTMwCi0jZGVmaW5lIEhFQlJFV19DSEFSU0VUICAgICAgICAgIDE3NwotI2RlZmluZSBBUkFCSUNfQ0hBUlNFVCAgICAgICAgICAxNzgKLSNkZWZpbmUgR1JFRUtfQ0hBUlNFVCAgICAgICAgICAgMTYxCi0jZGVmaW5lIFRVUktJU0hfQ0hBUlNFVCAgICAgICAgIDE2MgotI2RlZmluZSBWSUVUTkFNRVNFX0NIQVJTRVQgICAgICAxNjMKLSNkZWZpbmUgVEhBSV9DSEFSU0VUICAgICAgICAgICAgMjIyCi0jZGVmaW5lIEVBU1RFVVJPUEVfQ0hBUlNFVCAgICAgIDIzOAotI2RlZmluZSBSVVNTSUFOX0NIQVJTRVQgICAgICAgICAyMDQKLSNkZWZpbmUgQkFMVElDX0NIQVJTRVQgICAgICAgICAgMTg2CisjZGVmaW5lIEFOU0lfQ0hBUlNFVCAwCisjZGVmaW5lIERFRkFVTFRfQ0hBUlNFVCAxCisjZGVmaW5lIFNZTUJPTF9DSEFSU0VUIDIKKyNkZWZpbmUgU0hJRlRKSVNfQ0hBUlNFVCAxMjgKKyNkZWZpbmUgSEFOR0VVTF9DSEFSU0VUIDEyOQorI2RlZmluZSBIQU5HVUxfQ0hBUlNFVCAxMjkKKyNkZWZpbmUgR0IyMzEyX0NIQVJTRVQgMTM0CisjZGVmaW5lIENISU5FU0VCSUc1X0NIQVJTRVQgMTM2CisjZGVmaW5lIE9FTV9DSEFSU0VUIDI1NQorI2RlZmluZSBKT0hBQl9DSEFSU0VUIDEzMAorI2RlZmluZSBIRUJSRVdfQ0hBUlNFVCAxNzcKKyNkZWZpbmUgQVJBQklDX0NIQVJTRVQgMTc4CisjZGVmaW5lIEdSRUVLX0NIQVJTRVQgMTYxCisjZGVmaW5lIFRVUktJU0hfQ0hBUlNFVCAxNjIKKyNkZWZpbmUgVklFVE5BTUVTRV9DSEFSU0VUIDE2MworI2RlZmluZSBUSEFJX0NIQVJTRVQgMjIyCisjZGVmaW5lIEVBU1RFVVJPUEVfQ0hBUlNFVCAyMzgKKyNkZWZpbmUgUlVTU0lBTl9DSEFSU0VUIDIwNAorI2RlZmluZSBCQUxUSUNfQ0hBUlNFVCAxODYKIAogI2VuZGlmCiAKLSNpZm5kZWYgUFdMX0NMQVNTCitjbGFzcyBDUFdMX0ZvbnRNYXAgOiBwdWJsaWMgSUZYX0VkaXRfRm9udE1hcCB7CisgcHVibGljOgorICBDUFdMX0ZvbnRNYXAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyKTsKKyAgfkNQV0xfRm9udE1hcCgpIG92ZXJyaWRlOwogCi0JI2lmZGVmIEZYX1JFQURFUl9ETEwKLQkJI2RlZmluZSBQV0xfQ0xBU1MJCV9fZGVjbHNwZWMoZGxsZXhwb3J0KQotCSNlbHNlCi0JCSNkZWZpbmUgUFdMX0NMQVNTCi0JI2VuZGlmCi0jZW5kaWYKKyAgLy8gSUZYX0VkaXRfRm9udE1hcAorICBDUERGX0ZvbnQqIEdldFBERkZvbnQoaW50MzJfdCBuRm9udEluZGV4KSBvdmVycmlkZTsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0UERGRm9udEFsaWFzKGludDMyX3QgbkZvbnRJbmRleCkgb3ZlcnJpZGU7CisgIGludDMyX3QgR2V0V29yZEZvbnRJbmRleChGWF9XT1JEIHdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRm9udEluZGV4KSBvdmVycmlkZTsKKyAgaW50MzJfdCBDaGFyQ29kZUZyb21Vbmljb2RlKGludDMyX3QgbkZvbnRJbmRleCwgRlhfV09SRCB3b3JkKSBvdmVycmlkZTsKKyAgaW50MzJfdCBDaGFyU2V0RnJvbVVuaWNvZGUoRlhfV09SRCB3b3JkLCBpbnQzMl90IG5PbGRDaGFyc2V0KSBvdmVycmlkZTsKIAotY2xhc3MgUFdMX0NMQVNTIENQV0xfRm9udE1hcCA6IHB1YmxpYyBJRlhfRWRpdF9Gb250TWFwCi17Ci1wdWJsaWM6Ci0JQ1BXTF9Gb250TWFwKElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlcik7Ci0JdmlydHVhbCB+Q1BXTF9Gb250TWFwKCk7CisgIHZvaWQgU2V0U3lzdGVtSGFuZGxlcihJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpOworICBpbnQzMl90IEdldEZvbnRNYXBDb3VudCgpIGNvbnN0OworICBjb25zdCBDUFdMX0ZvbnRNYXBfRGF0YSogR2V0Rm9udE1hcERhdGEoaW50MzJfdCBuSW5kZXgpIGNvbnN0OworICBzdGF0aWMgaW50MzJfdCBHZXROYXRpdmVDaGFyc2V0KCk7CisgIENGWF9CeXRlU3RyaW5nIEdldE5hdGl2ZUZvbnROYW1lKGludDMyX3QgbkNoYXJzZXQpOwogCi0JdmlydHVhbCBDUERGX0ZvbnQqCQkJCQkJCUdldFBERkZvbnQoRlhfSU5UMzIgbkZvbnRJbmRleCk7Ci0JdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJCQkJCUdldFBERkZvbnRBbGlhcyhGWF9JTlQzMiBuRm9udEluZGV4KTsKLQl2aXJ0dWFsIEZYX0lOVDMyCQkJCQkJCUdldFdvcmRGb250SW5kZXgoRlhfV09SRCB3b3JkLCBGWF9JTlQzMiBuQ2hhcnNldCwgRlhfSU5UMzIgbkZvbnRJbmRleCk7Ci0JdmlydHVhbCBGWF9JTlQzMgkJCQkJCQlDaGFyQ29kZUZyb21Vbmljb2RlKEZYX0lOVDMyIG5Gb250SW5kZXgsIEZYX1dPUkQgd29yZCk7Ci0JdmlydHVhbCBGWF9JTlQzMgkJCQkJCQlDaGFyU2V0RnJvbVVuaWNvZGUoRlhfV09SRCB3b3JkLCBGWF9JTlQzMiBuT2xkQ2hhcnNldCk7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXREZWZhdWx0Rm9udEJ5Q2hhcnNldChpbnQzMl90IG5DaGFyc2V0KTsKIAotcHVibGljOgotCXZpcnR1YWwgdm9pZAkJCQkJCQkJSW5pdGlhbChGWF9MUENTVFIgZm9udG5hbWUgPSBOVUxMKTsKLQl2b2lkCQkJCQkJCQkJCVNldFN5c3RlbUhhbmRsZXIoSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyKTsKKyAgQ1BERl9Gb250KiBBZGRGb250VG9Eb2N1bWVudChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBuQ2hhcnNldCk7CisgIHN0YXRpYyBGWF9CT09MIElzU3RhbmRhcmRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUpOworICBDUERGX0ZvbnQqIEFkZFN0YW5kYXJkRm9udChDUERGX0RvY3VtZW50KiBwRG9jLCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lKTsKKyAgQ1BERl9Gb250KiBBZGRTeXN0ZW1Gb250KENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBuQ2hhcnNldCk7CiAKLQlGWF9JTlQzMgkJCQkJCQkJCUdldEZvbnRNYXBDb3VudCgpIGNvbnN0OwotCWNvbnN0IENQV0xfRm9udE1hcF9EYXRhKgkJCQkJR2V0Rm9udE1hcERhdGEoRlhfSU5UMzIgbkluZGV4KSBjb25zdDsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKCk7CisgIHZpcnR1YWwgQ1BERl9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKTsKKyAgdmlydHVhbCBDUERGX0ZvbnQqIEZpbmRGb250U2FtZUNoYXJzZXQoQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJzZXQpOworICB2aXJ0dWFsIHZvaWQgQWRkZWRGb250KENQREZfRm9udCogcEZvbnQsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udEFsaWFzKTsKIAotcHVibGljOgotCXN0YXRpYyBGWF9JTlQzMgkJCQkJCQkJR2V0TmF0aXZlQ2hhcnNldCgpOwotCUNGWF9CeXRlU3RyaW5nCQkJCQkJCQlHZXROYXRpdmVGb250TmFtZShGWF9JTlQzMiBuQ2hhcnNldCk7CisgIEZYX0JPT0wgS25vd1dvcmQoaW50MzJfdCBuRm9udEluZGV4LCBGWF9XT1JEIHdvcmQpOwogCi0Jc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQkJR2V0RGVmYXVsdEZvbnRCeUNoYXJzZXQoRlhfSU5UMzIgbkNoYXJzZXQpOworICB2b2lkIEVtcHR5KCk7CisgIGludDMyX3QgR2V0Rm9udEluZGV4KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpbmQpOworICBpbnQzMl90IEdldFBXTEZvbnRJbmRleChGWF9XT1JEIHdvcmQsIGludDMyX3QgbkNoYXJzZXQpOworICBpbnQzMl90IEFkZEZvbnREYXRhKENQREZfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMsCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVCk7CiAKLQlDUERGX0ZvbnQqCQkJCQkJCQkJQWRkRm9udFRvRG9jdW1lbnQoQ1BERl9Eb2N1bWVudCogcERvYywgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwgRlhfQllURSBuQ2hhcnNldCk7Ci0Jc3RhdGljIEZYX0JPT0wJCQkJCQkJCUlzU3RhbmRhcmRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUpOwkJCQkJCQkKLQlDUERGX0ZvbnQqCQkJCQkJCQkJQWRkU3RhbmRhcmRGb250KENQREZfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUpOwotCUNQREZfRm9udCoJCQkJCQkJCQlBZGRTeXN0ZW1Gb250KENQREZfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsIAotCQkJCQkJCQkJCQkJCUZYX0JZVEUgbkNoYXJzZXQpOworICBDRlhfQnl0ZVN0cmluZyBFbmNvZGVGb250QWxpYXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJzZXQpOworICBDRlhfQnl0ZVN0cmluZyBFbmNvZGVGb250QWxpYXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSk7CiAKLXByb3RlY3RlZDoKLQl2aXJ0dWFsIENQREZfRm9udCoJCQkJCQkJRmluZEZvbnRTYW1lQ2hhcnNldChDRlhfQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcywgRlhfSU5UMzIgbkNoYXJzZXQpOwotCXZpcnR1YWwgdm9pZAkJCQkJCQkJQWRkZWRGb250KENQREZfRm9udCogcEZvbnQsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udEFsaWFzKTsKLQlGWF9CT09MCQkJCQkJCQkJCUtub3dXb3JkKEZYX0lOVDMyIG5Gb250SW5kZXgsIEZYX1dPUkQgd29yZCk7CisgcHJpdmF0ZToKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0Rm9udE5hbWUoaW50MzJfdCBuRm9udEluZGV4KTsKKyAgaW50MzJfdCBGaW5kRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lLAorICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQpOwogCi0JdmlydHVhbCBDUERGX0RvY3VtZW50KgkJCQkJCUdldERvY3VtZW50KCk7CisgIENGWF9CeXRlU3RyaW5nIEdldE5hdGl2ZUZvbnQoaW50MzJfdCBuQ2hhcnNldCk7CiAKLQl2b2lkCQkJCQkJCQkJCUVtcHR5KCk7Ci0JRlhfSU5UMzIJCQkJCQkJCQlHZXRGb250SW5kZXgoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwgRlhfSU5UMzIgbkNoYXJzZXQsIEZYX0JPT0wgYkZpbmQpOwotCUZYX0lOVDMyCQkJCQkJCQkJR2V0UFdMRm9udEluZGV4KEZYX1dPUkQgd29yZCwgRlhfSU5UMzIgbkNoYXJzZXQpOwotCUZYX0lOVDMyCQkJCQkJCQkJQWRkRm9udERhdGEoQ1BERl9Gb250KiBwRm9udCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMsIEZYX0lOVDMyIG5DaGFyc2V0ID0gREVGQVVMVF9DSEFSU0VUKTsKKyBwdWJsaWM6CisgIHVzaW5nIENoYXJzZXRGb250TWFwID0gRlBERl9DaGFyc2V0Rm9udE1hcDsKKyAgc3RhdGljIGNvbnN0IENoYXJzZXRGb250TWFwIGRlZmF1bHRUVEZNYXBbXTsKIAotCUNGWF9CeXRlU3RyaW5nCQkJCQkJCQlFbmNvZGVGb250QWxpYXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwgRlhfSU5UMzIgbkNoYXJzZXQpOwotCUNGWF9CeXRlU3RyaW5nCQkJCQkJCQlFbmNvZGVGb250QWxpYXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSk7CisgcHJvdGVjdGVkOgorICBDRlhfQXJyYXlUZW1wbGF0ZTxDUFdMX0ZvbnRNYXBfRGF0YSo+IG1fYURhdGE7CisgIENGWF9BcnJheVRlbXBsYXRlPENQV0xfRm9udE1hcF9OYXRpdmUqPiBtX2FOYXRpdmVGb250OwogCi1wcml2YXRlOgotCUNGWF9CeXRlU3RyaW5nCQkJCQkJCQlHZXRGb250TmFtZShGWF9JTlQzMiBuRm9udEluZGV4KTsKLQlGWF9JTlQzMgkJCQkJCQkJCUZpbmRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsIEZYX0lOVDMyIG5DaGFyc2V0ID0gREVGQVVMVF9DSEFSU0VUKTsKLQotCUNGWF9CeXRlU3RyaW5nCQkJCQkJCQlHZXROYXRpdmVGb250KEZYX0lOVDMyIG5DaGFyc2V0KTsKLQotcHVibGljOgotICAgIHVzaW5nIENoYXJzZXRGb250TWFwID0gRlBERl9DaGFyc2V0Rm9udE1hcDsKLQlzdGF0aWMgY29uc3QgQ2hhcnNldEZvbnRNYXAJCQkJCWRlZmF1bHRUVEZNYXBbXTsKLQotcHJvdGVjdGVkOgotCUNGWF9BcnJheVRlbXBsYXRlPENQV0xfRm9udE1hcF9EYXRhKj4JCW1fYURhdGE7Ci0JQ0ZYX0FycmF5VGVtcGxhdGU8Q1BXTF9Gb250TWFwX05hdGl2ZSo+CQltX2FOYXRpdmVGb250OwotCi1wcml2YXRlOgotCUNQREZfRG9jdW1lbnQqCQkJCQkJCQltX3BQREZEb2M7Ci0JSUZYX1N5c3RlbUhhbmRsZXIqCQkJCQkJCW1fcFN5c3RlbUhhbmRsZXI7CisgcHJpdmF0ZToKKyAgQ1BERl9Eb2N1bWVudCogbV9wUERGRG9jOworICBJRlhfU3lzdGVtSGFuZGxlciogbV9wU3lzdGVtSGFuZGxlcjsKIH07CiAKLWNsYXNzIFBXTF9DTEFTUyBDUFdMX0RvY0ZvbnRNYXAgOiBwdWJsaWMgQ1BXTF9Gb250TWFwCi17Ci1wdWJsaWM6Ci0JQ1BXTF9Eb2NGb250TWFwKElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlciwgQ1BERl9Eb2N1bWVudCogcEF0dGFjaGVkRG9jKTsKLQl2aXJ0dWFsIH5DUFdMX0RvY0ZvbnRNYXAoKTsKK2NsYXNzIENQV0xfRG9jRm9udE1hcCA6IHB1YmxpYyBDUFdMX0ZvbnRNYXAgeworIHB1YmxpYzoKKyAgQ1BXTF9Eb2NGb250TWFwKElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBBdHRhY2hlZERvYyk7CisgIH5DUFdMX0RvY0ZvbnRNYXAoKSBvdmVycmlkZTsKIAotCXZpcnR1YWwgQ1BERl9Eb2N1bWVudCoJCQkJCQlHZXREb2N1bWVudCgpOworIHByaXZhdGU6CisgIC8vIENQV0xfRm9udE1hcDoKKyAgQ1BERl9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBvdmVycmlkZTsKIAotcHJpdmF0ZToKLQlDUERGX0RvY3VtZW50KgkJCQkJCQkJbV9wQXR0YWNoZWREb2M7CisgIENQREZfRG9jdW1lbnQqIG1fcEF0dGFjaGVkRG9jOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9GT05UTUFQX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9JY29uLmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9JY29uLmgKaW5kZXggY2I1NmE5OS4uMGQyNTk2ZiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfSWNvbi5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ljb24uaApAQCAtMSw2MCArMSw1OCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIEZQREZTREtfSU5DTFVERV9QREZXSU5ET1dfUFdMX0lDT05fSF8KICNkZWZpbmUgRlBERlNES19JTkNMVURFX1BERldJTkRPV19QV0xfSUNPTl9IXwogCi0jaW5jbHVkZSAiLi4vLi4vLi4vY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmluZy5oIgogI2luY2x1ZGUgIlBXTF9XbmQuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyaW5nLmgiCiAKLWNsYXNzIFBXTF9DTEFTUyBDUFdMX0ltYWdlIDogcHVibGljIENQV0xfV25kCi17Ci1wdWJsaWM6Ci0JQ1BXTF9JbWFnZSgpOwotCXZpcnR1YWwgfkNQV0xfSW1hZ2UoKTsKK2NsYXNzIENQV0xfSW1hZ2UgOiBwdWJsaWMgQ1BXTF9XbmQgeworIHB1YmxpYzoKKyAgQ1BXTF9JbWFnZSgpOworICB+Q1BXTF9JbWFnZSgpIG92ZXJyaWRlOwogCi0JdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJCUdldEltYWdlQXBwU3RyZWFtKCk7CisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0SW1hZ2VBcHBTdHJlYW0oKTsKIAotCXZpcnR1YWwgdm9pZAkJCQkJR2V0U2NhbGUoRlhfRkxPQVQgJiBmSFNjYWxlLEZYX0ZMT0FUICYgZlZTY2FsZSk7Ci0JdmlydHVhbCB2b2lkCQkJCQlHZXRJbWFnZU9mZnNldChGWF9GTE9BVCAmIHgsRlhfRkxPQVQgJiB5KTsKLQl2aXJ0dWFsIENQREZfU3RyZWFtICoJCQlHZXRQREZTdHJlYW0oKTsKKyAgdmlydHVhbCB2b2lkIEdldFNjYWxlKEZYX0ZMT0FUJiBmSFNjYWxlLCBGWF9GTE9BVCYgZlZTY2FsZSk7CisgIHZpcnR1YWwgdm9pZCBHZXRJbWFnZU9mZnNldChGWF9GTE9BVCYgeCwgRlhfRkxPQVQmIHkpOworICB2aXJ0dWFsIENQREZfU3RyZWFtKiBHZXRQREZTdHJlYW0oKTsKIAotcHVibGljOgotCXZvaWQJCQkJCQkJU2V0UERGU3RyZWFtKENQREZfU3RyZWFtKiBwU3RyZWFtKTsJCi0Jdm9pZAkJCQkJCQlHZXRJbWFnZVNpemUoRlhfRkxPQVQgJiBmV2lkdGgsRlhfRkxPQVQgJiBmSGVpZ2h0KTsKLQlDUERGX01hdHJpeAkJCQkJCUdldEltYWdlTWF0cml4KCk7Ci0JQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldEltYWdlQWxpYXMoKTsKLQl2b2lkCQkJCQkJCVNldEltYWdlQWxpYXMoRlhfTFBDU1RSIHNJbWFnZUFsaWFzKTsKKyBwdWJsaWM6CisgIHZvaWQgU2V0UERGU3RyZWFtKENQREZfU3RyZWFtKiBwU3RyZWFtKTsKKyAgdm9pZCBHZXRJbWFnZVNpemUoRlhfRkxPQVQmIGZXaWR0aCwgRlhfRkxPQVQmIGZIZWlnaHQpOworICBDRlhfTWF0cml4IEdldEltYWdlTWF0cml4KCk7CisgIENGWF9CeXRlU3RyaW5nIEdldEltYWdlQWxpYXMoKTsKKyAgdm9pZCBTZXRJbWFnZUFsaWFzKGNvbnN0IEZYX0NIQVIqIHNJbWFnZUFsaWFzKTsKIAotcHJvdGVjdGVkOgotCUNQREZfU3RyZWFtKgkJCQkJbV9wUERGU3RyZWFtOwotCUNGWF9CeXRlU3RyaW5nCQkJCQltX3NJbWFnZUFsaWFzOworIHByb3RlY3RlZDoKKyAgQ1BERl9TdHJlYW0qIG1fcFBERlN0cmVhbTsKKyAgQ0ZYX0J5dGVTdHJpbmcgbV9zSW1hZ2VBbGlhczsKIH07CiAKLWNsYXNzIFBXTF9DTEFTUyBDUFdMX0ljb24gOiBwdWJsaWMgQ1BXTF9JbWFnZSAKLXsKLXB1YmxpYzoKLQlDUFdMX0ljb24oKTsKLQl2aXJ0dWFsIH5DUFdMX0ljb24oKTsKK2NsYXNzIENQV0xfSWNvbiA6IHB1YmxpYyBDUFdMX0ltYWdlIHsKKyBwdWJsaWM6CisgIENQV0xfSWNvbigpOworICB+Q1BXTF9JY29uKCkgb3ZlcnJpZGU7CiAKLQl2aXJ0dWFsIENQREZfSWNvbkZpdCAqCQkJR2V0SWNvbkZpdCgpe3JldHVybiBtX3BJY29uRml0O307CisgIHZpcnR1YWwgQ1BERl9JY29uRml0KiBHZXRJY29uRml0KCkgeyByZXR1cm4gbV9wSWNvbkZpdDsgfQogCi0JdmlydHVhbCB2b2lkCQkJCQlHZXRTY2FsZShGWF9GTE9BVCAmIGZIU2NhbGUsRlhfRkxPQVQgJiBmVlNjYWxlKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCUdldEltYWdlT2Zmc2V0KEZYX0ZMT0FUICYgeCxGWF9GTE9BVCAmIHkpOworICAvLyBDUFdMX0ltYWdlCisgIHZvaWQgR2V0U2NhbGUoRlhfRkxPQVQmIGZIU2NhbGUsIEZYX0ZMT0FUJiBmVlNjYWxlKSBvdmVycmlkZTsKKyAgdm9pZCBHZXRJbWFnZU9mZnNldChGWF9GTE9BVCYgeCwgRlhfRkxPQVQmIHkpIG92ZXJyaWRlOwogCi0JRlhfSU5UMzIJCQkJCQlHZXRTY2FsZU1ldGhvZCgpOwotCUZYX0JPT0wJCQkJCQkJSXNQcm9wb3J0aW9uYWxTY2FsZSgpOwotCXZvaWQJCQkJCQkJR2V0SWNvblBvc2l0aW9uKEZYX0ZMT0FUICYgZkxlZnQsIEZYX0ZMT0FUICYgZkJvdHRvbSk7Ci0JRlhfQk9PTAkJCQkJCQlHZXRGaXR0aW5nQm91bmRzKCk7CisgIGludDMyX3QgR2V0U2NhbGVNZXRob2QoKTsKKyAgRlhfQk9PTCBJc1Byb3BvcnRpb25hbFNjYWxlKCk7CisgIHZvaWQgR2V0SWNvblBvc2l0aW9uKEZYX0ZMT0FUJiBmTGVmdCwgRlhfRkxPQVQmIGZCb3R0b20pOworICBGWF9CT09MIEdldEZpdHRpbmdCb3VuZHMoKTsKIAotCXZvaWQJCQkJCQkJU2V0SWNvbkZpdChDUERGX0ljb25GaXQgKiBwSWNvbkZpdCl7bV9wSWNvbkZpdCA9IHBJY29uRml0O307CisgIHZvaWQgU2V0SWNvbkZpdChDUERGX0ljb25GaXQqIHBJY29uRml0KSB7IG1fcEljb25GaXQgPSBwSWNvbkZpdDsgfQogCi1wcml2YXRlOgotCUNQREZfSWNvbkZpdCAqCQkJCQltX3BJY29uRml0OworIHByaXZhdGU6CisgIENQREZfSWNvbkZpdCogbV9wSWNvbkZpdDsKIH07CiAKLQogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9JQ09OX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9JY29uTGlzdC5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfSWNvbkxpc3QuaAppbmRleCBkMDc0Yjc2Li4wYTIxYmJlIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9JY29uTGlzdC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ljb25MaXN0LmgKQEAgLTEsMTUgKzEsMTUgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9JQ09OTElTVF9IXwogI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9JQ09OTElTVF9IXwogCi0jaW5jbHVkZSAiLi4vLi4vLi4vY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmluZy5oIgogI2luY2x1ZGUgIlBXTF9MaXN0Q3RybC5oIgogI2luY2x1ZGUgIlBXTF9XbmQuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyaW5nLmgiCiAKIGNsYXNzIElQV0xfSWNvbkxpc3RfTm90aWZ5OwogY2xhc3MgQ1BXTF9JY29uTGlzdF9JdGVtOwpAQCAtMTcsMTEyICsxNywxMTMgQEAKIGNsYXNzIENQV0xfSWNvbkxpc3Q7CiBjbGFzcyBDUFdMX0xhYmVsOwogCi1jbGFzcyBJUFdMX0ljb25MaXN0X05vdGlmeQotewotcHVibGljOgotICAgICAgICB2aXJ0dWFsIH5JUFdMX0ljb25MaXN0X05vdGlmeSgpIHsgfQotCXZpcnR1YWwgdm9pZAkJCQkJCU9uTm90ZUxpc3RTZWxDaGFuZ2VkKEZYX0lOVDMyIG5JdGVtSW5kZXgpID0gMDsKK2NsYXNzIElQV0xfSWNvbkxpc3RfTm90aWZ5IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklQV0xfSWNvbkxpc3RfTm90aWZ5KCkge30KKyAgdmlydHVhbCB2b2lkIE9uTm90ZUxpc3RTZWxDaGFuZ2VkKGludDMyX3Qgbkl0ZW1JbmRleCkgPSAwOwogfTsKIAotY2xhc3MgQ1BXTF9JY29uTGlzdF9JdGVtIDogcHVibGljIENQV0xfV25kCi17Ci1wdWJsaWM6Ci0JQ1BXTF9JY29uTGlzdF9JdGVtKCk7Ci0JdmlydHVhbCB+Q1BXTF9JY29uTGlzdF9JdGVtKCk7CitjbGFzcyBDUFdMX0ljb25MaXN0X0l0ZW0gOiBwdWJsaWMgQ1BXTF9XbmQgeworIHB1YmxpYzoKKyAgQ1BXTF9JY29uTGlzdF9JdGVtKCk7CisgIH5DUFdMX0ljb25MaXN0X0l0ZW0oKSBvdmVycmlkZTsKIAotCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCQkJR2V0Q2xhc3NOYW1lKCkgY29uc3Q7Ci0JdmlydHVhbCB2b2lkCQkJCQkJQ3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApOwotCXZpcnR1YWwgdm9pZAkJCQkJCVJlUG9zQ2hpbGRXbmQoKTsKKyAgdm9pZCBTZXRTZWxlY3QoRlhfQk9PTCBiU2VsZWN0ZWQpOworICBGWF9CT09MIElzU2VsZWN0ZWQoKSBjb25zdDsKKyAgdm9pZCBTZXREYXRhKHZvaWQqIHBEYXRhKTsKKyAgdm9pZCBTZXRJY29uKGludDMyX3Qgbkljb25JbmRleCk7CisgIHZvaWQgU2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKTsKKyAgdm9pZCBTZXRJY29uRmlsbENvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0VGV4dCgpIGNvbnN0OwogCi0Jdm9pZAkJCQkJCQkJU2V0U2VsZWN0KEZYX0JPT0wgYlNlbGVjdGVkKTsKLQlGWF9CT09MCQkJCQkJCQlJc1NlbGVjdGVkKCkgY29uc3Q7Ci0Jdm9pZAkJCQkJCQkJU2V0RGF0YSh2b2lkKiBwRGF0YSk7Ci0Jdm9pZAkJCQkJCQkJU2V0SWNvbihGWF9JTlQzMiBuSWNvbkluZGV4KTsKLQl2b2lkCQkJCQkJCQlTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpOwotCXZvaWQJCQkJCQkJCVNldEljb25GaWxsQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOwotCUNGWF9XaWRlU3RyaW5nCQkJCQkJR2V0VGV4dCgpIGNvbnN0OworIHByb3RlY3RlZDoKKyAgLy8gQ1BXTF9XbmQKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0Q2xhc3NOYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgQ3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCkgb3ZlcnJpZGU7CisgIHZvaWQgUmVQb3NDaGlsZFduZCgpIG92ZXJyaWRlOworICBGWF9GTE9BVCBHZXRJdGVtSGVpZ2h0KEZYX0ZMT0FUIGZMaW1pdFdpZHRoKSBvdmVycmlkZTsKKyAgdm9pZCBEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlKSBvdmVycmlkZTsKKyAgdm9pZCBPbkVuYWJsZWQoKSBvdmVycmlkZTsKKyAgdm9pZCBPbkRpc2FibGVkKCkgb3ZlcnJpZGU7CiAKLXByb3RlY3RlZDoKLQl2aXJ0dWFsIEZYX0ZMT0FUCQkJCQlHZXRJdGVtSGVpZ2h0KEZYX0ZMT0FUIGZMaW1pdFdpZHRoKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7Ci0KLQl2aXJ0dWFsIHZvaWQJCQkJCQlPbkVuYWJsZWQoKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlPbkRpc2FibGVkKCk7Ci0KLXByaXZhdGU6Ci0JRlhfSU5UMzIJCQkJCQkJbV9uSWNvbkluZGV4OwotCXZvaWQqCQkJCQkJCQltX3BEYXRhOwotCUZYX0JPT0wJCQkJCQkJCW1fYlNlbGVjdGVkOwotCUNQV0xfTGFiZWwqCQkJCQkJCW1fcFRleHQ7Ci0JQ1BXTF9Db2xvcgkJCQkJCQltX2NySWNvbjsKKyBwcml2YXRlOgorICBpbnQzMl90IG1fbkljb25JbmRleDsKKyAgdm9pZCogbV9wRGF0YTsKKyAgRlhfQk9PTCBtX2JTZWxlY3RlZDsKKyAgQ1BXTF9MYWJlbCogbV9wVGV4dDsKKyAgQ1BXTF9Db2xvciBtX2NySWNvbjsKIH07CiAKLWNsYXNzIENQV0xfSWNvbkxpc3RfQ29udGVudCA6IHB1YmxpYyBDUFdMX0xpc3RDdHJsCi17Ci1wdWJsaWM6Ci0JQ1BXTF9JY29uTGlzdF9Db250ZW50KEZYX0lOVDMyIG5MaXN0Q291bnQpOwotCXZpcnR1YWwgfkNQV0xfSWNvbkxpc3RfQ29udGVudCgpOworY2xhc3MgQ1BXTF9JY29uTGlzdF9Db250ZW50IDogcHVibGljIENQV0xfTGlzdEN0cmwgeworIHB1YmxpYzoKKyAgQ1BXTF9JY29uTGlzdF9Db250ZW50KGludDMyX3Qgbkxpc3RDb3VudCk7CisgIH5DUFdMX0ljb25MaXN0X0NvbnRlbnQoKSBvdmVycmlkZTsKIAotCXZvaWQJCQkJCQkJCVNldFNlbGVjdChGWF9JTlQzMiBuSW5kZXgpOwotCUZYX0lOVDMyCQkJCQkJCUdldFNlbGVjdCgpIGNvbnN0OwotCXZvaWQJCQkJCQkJCVNldE5vdGlmeShJUFdMX0ljb25MaXN0X05vdGlmeSogcE5vdGlmeSk7Ci0Jdm9pZAkJCQkJCQkJRW5hYmxlTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSk7Ci0Jdm9pZAkJCQkJCQkJU2V0TGlzdERhdGEoRlhfSU5UMzIgbkl0ZW1JbmRleCwgdm9pZCogcERhdGEpOwotCXZvaWQJCQkJCQkJCVNldExpc3RJY29uKEZYX0lOVDMyIG5JdGVtSW5kZXgsIEZYX0lOVDMyIG5JY29uSW5kZXgpOwotCXZvaWQJCQkJCQkJCVNldExpc3RTdHJpbmcoRlhfSU5UMzIgbkl0ZW1JbmRleCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7Ci0Jdm9pZAkJCQkJCQkJU2V0SWNvbkZpbGxDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcik7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJCQlHZXRMaXN0U3RyaW5nKEZYX0lOVDMyIG5JdGVtSW5kZXgpIGNvbnN0OwotCUlQV0xfSWNvbkxpc3RfTm90aWZ5KgkJCQlHZXROb3RpZnkoKSBjb25zdDsKLQl2b2lkCQkJCQkJCQlTY3JvbGxUb0l0ZW0oRlhfSU5UMzIgbkl0ZW1JbmRleCk7CisgIHZvaWQgU2V0U2VsZWN0KGludDMyX3QgbkluZGV4KTsKKyAgaW50MzJfdCBHZXRTZWxlY3QoKSBjb25zdDsKKyAgdm9pZCBTZXROb3RpZnkoSVBXTF9JY29uTGlzdF9Ob3RpZnkqIHBOb3RpZnkpOworICB2b2lkIEVuYWJsZU5vdGlmeShGWF9CT09MIGJOb3RpZnkpOworICB2b2lkIFNldExpc3REYXRhKGludDMyX3Qgbkl0ZW1JbmRleCwgdm9pZCogcERhdGEpOworICB2b2lkIFNldExpc3RJY29uKGludDMyX3Qgbkl0ZW1JbmRleCwgaW50MzJfdCBuSWNvbkluZGV4KTsKKyAgdm9pZCBTZXRMaXN0U3RyaW5nKGludDMyX3Qgbkl0ZW1JbmRleCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7CisgIHZvaWQgU2V0SWNvbkZpbGxDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcik7CisgIENGWF9XaWRlU3RyaW5nIEdldExpc3RTdHJpbmcoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdDsKKyAgSVBXTF9JY29uTGlzdF9Ob3RpZnkqIEdldE5vdGlmeSgpIGNvbnN0OworICB2b2lkIFNjcm9sbFRvSXRlbShpbnQzMl90IG5JdGVtSW5kZXgpOwogCi1wcm90ZWN0ZWQ6Ci0JdmlydHVhbCB2b2lkCQkJCQkJQ3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKKyBwcm90ZWN0ZWQ6CisgIC8vIENQV0xfTGlzdEN0cmwKKyAgdm9pZCBDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgb3ZlcnJpZGU7CisgIEZYX0JPT0wgT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIG92ZXJyaWRlOworICBGWF9CT09MIE9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykgb3ZlcnJpZGU7CiAKLXByaXZhdGU6Ci0JQ1BXTF9JY29uTGlzdF9JdGVtKgkJCQkJR2V0TGlzdEl0ZW0oRlhfSU5UMzIgbkl0ZW1JbmRleCkgY29uc3Q7Ci0Jdm9pZAkJCQkJCQkJU2VsZWN0SXRlbShGWF9JTlQzMiBuSXRlbUluZGV4LCBGWF9CT09MIGJTZWxlY3QpOwotCUZYX0lOVDMyCQkJCQkJCUZpbmRJdGVtSW5kZXgoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCQotCUZYX0JPT0wJCQkJCQkJCW1fblNlbGVjdEluZGV4OwotCUlQV0xfSWNvbkxpc3RfTm90aWZ5KgkJCQltX3BOb3RpZnk7Ci0JRlhfQk9PTAkJCQkJCQkJbV9iRW5hYmxlTm90aWZ5OwotCUZYX0JPT0wJCQkJCQkJCW1fYk1vdXNlRG93bjsKLQlGWF9JTlQzMgkJCQkJCQltX25MaXN0Q291bnQ7CisgcHJpdmF0ZToKKyAgQ1BXTF9JY29uTGlzdF9JdGVtKiBHZXRMaXN0SXRlbShpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OworICB2b2lkIFNlbGVjdEl0ZW0oaW50MzJfdCBuSXRlbUluZGV4LCBGWF9CT09MIGJTZWxlY3QpOworICBpbnQzMl90IEZpbmRJdGVtSW5kZXgoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworCisgIGludDMyX3QgbV9uU2VsZWN0SW5kZXg7CisgIElQV0xfSWNvbkxpc3RfTm90aWZ5KiBtX3BOb3RpZnk7CisgIEZYX0JPT0wgbV9iRW5hYmxlTm90aWZ5OworICBGWF9CT09MIG1fYk1vdXNlRG93bjsKKyAgaW50MzJfdCBtX25MaXN0Q291bnQ7CiB9OwogCi1jbGFzcyBQV0xfQ0xBU1MgQ1BXTF9JY29uTGlzdCA6IHB1YmxpYyBDUFdMX1duZAotewotcHVibGljOgotCUNQV0xfSWNvbkxpc3QoRlhfSU5UMzIgbkxpc3RDb3VudCk7Ci0JdmlydHVhbCB+Q1BXTF9JY29uTGlzdCgpOworY2xhc3MgQ1BXTF9JY29uTGlzdCA6IHB1YmxpYyBDUFdMX1duZCB7CisgcHVibGljOgorICBDUFdMX0ljb25MaXN0KGludDMyX3Qgbkxpc3RDb3VudCk7CisgIH5DUFdMX0ljb25MaXN0KCkgb3ZlcnJpZGU7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQlPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdm9pZCBTZXRTZWxlY3QoaW50MzJfdCBuSW5kZXgpOworICB2b2lkIFNldFRvcEl0ZW0oaW50MzJfdCBuSW5kZXgpOworICBpbnQzMl90IEdldFNlbGVjdCgpIGNvbnN0OworICB2b2lkIFNldE5vdGlmeShJUFdMX0ljb25MaXN0X05vdGlmeSogcE5vdGlmeSk7CisgIHZvaWQgRW5hYmxlTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSk7CisgIHZvaWQgU2V0TGlzdERhdGEoaW50MzJfdCBuSXRlbUluZGV4LCB2b2lkKiBwRGF0YSk7CisgIHZvaWQgU2V0TGlzdEljb24oaW50MzJfdCBuSXRlbUluZGV4LCBpbnQzMl90IG5JY29uSW5kZXgpOworICB2b2lkIFNldExpc3RTdHJpbmcoaW50MzJfdCBuSXRlbUluZGV4LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKTsKKyAgdm9pZCBTZXRJY29uRmlsbENvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0TGlzdFN0cmluZyhpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OwogCi0Jdm9pZAkJCQkJCQkJU2V0U2VsZWN0KEZYX0lOVDMyIG5JbmRleCk7Ci0Jdm9pZAkJCQkJCQkJU2V0VG9wSXRlbShGWF9JTlQzMiBuSW5kZXgpOwotCUZYX0lOVDMyCQkJCQkJCUdldFNlbGVjdCgpIGNvbnN0OwotCXZvaWQJCQkJCQkJCVNldE5vdGlmeShJUFdMX0ljb25MaXN0X05vdGlmeSogcE5vdGlmeSk7Ci0Jdm9pZAkJCQkJCQkJRW5hYmxlTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSk7Ci0Jdm9pZAkJCQkJCQkJU2V0TGlzdERhdGEoRlhfSU5UMzIgbkl0ZW1JbmRleCwgdm9pZCogcERhdGEpOwotCXZvaWQJCQkJCQkJCVNldExpc3RJY29uKEZYX0lOVDMyIG5JdGVtSW5kZXgsIEZYX0lOVDMyIG5JY29uSW5kZXgpOwotCXZvaWQJCQkJCQkJCVNldExpc3RTdHJpbmcoRlhfSU5UMzIgbkl0ZW1JbmRleCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7Ci0Jdm9pZAkJCQkJCQkJU2V0SWNvbkZpbGxDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcik7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJCQlHZXRMaXN0U3RyaW5nKEZYX0lOVDMyIG5JdGVtSW5kZXgpIGNvbnN0OworIHByb3RlY3RlZDoKKyAgLy8gQ1BXTF9XbmQKKyAgRlhfQk9PTCBPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIG92ZXJyaWRlOworICB2b2lkIE9uQ3JlYXRlZCgpIG92ZXJyaWRlOworICB2b2lkIFJlUG9zQ2hpbGRXbmQoKSBvdmVycmlkZTsKKyAgdm9pZCBDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKSBvdmVycmlkZTsKKyAgdm9pZCBPbk5vdGlmeShDUFdMX1duZCogcFduZCwKKyAgICAgICAgICAgICAgICBGWF9EV09SRCBtc2csCisgICAgICAgICAgICAgICAgaW50cHRyX3Qgd1BhcmFtID0gMCwKKyAgICAgICAgICAgICAgICBpbnRwdHJfdCBsUGFyYW0gPSAwKSBvdmVycmlkZTsKIAotcHJvdGVjdGVkOgotCXZpcnR1YWwgdm9pZAkJCQkJCU9uQ3JlYXRlZCgpOwotCXZpcnR1YWwgdm9pZAkJCQkJCVJlUG9zQ2hpbGRXbmQoKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7Ci0JCi0JdmlydHVhbCB2b2lkCQkJCQkJT25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgRlhfSU5UUFRSIHdQYXJhbSA9IDAsIEZYX0lOVFBUUiBsUGFyYW0gPSAwKTsKLQotcHJpdmF0ZToKLQlDUFdMX0ljb25MaXN0X0NvbnRlbnQqCQkJCW1fcExpc3RDb250ZW50OwotCUZYX0lOVDMyCQkJCQkJCW1fbkxpc3RDb3VudDsKKyBwcml2YXRlOgorICBDUFdMX0ljb25MaXN0X0NvbnRlbnQqIG1fcExpc3RDb250ZW50OworICBpbnQzMl90IG1fbkxpc3RDb3VudDsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX1BERldJTkRPV19QV0xfSUNPTkxJU1RfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0xhYmVsLmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9MYWJlbC5oCmluZGV4IGY3MjRhMGEuLmFiYTg0ZmIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0xhYmVsLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGFiZWwuaApAQCAtMSw3ICsxLDcgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9MQUJFTF9IXwpAQCAtMTEsMzUgKzExLDM1IEBACiAKIGNsYXNzIElGWF9FZGl0OwogCi1jbGFzcyBQV0xfQ0xBU1MgQ1BXTF9MYWJlbCA6IHB1YmxpYyBDUFdMX1duZAotewotcHVibGljOgotCUNQV0xfTGFiZWwoKTsKLQl2aXJ0dWFsIH5DUFdMX0xhYmVsKCk7CitjbGFzcyBDUFdMX0xhYmVsIDogcHVibGljIENQV0xfV25kIHsKKyBwdWJsaWM6CisgIENQV0xfTGFiZWwoKTsKKyAgfkNQV0xfTGFiZWwoKSBvdmVycmlkZTsKIAotCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCQlHZXRDbGFzc05hbWUoKSBjb25zdDsKLQl2aXJ0dWFsIHZvaWQJCQkJCVNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSk7Ci0JdmlydHVhbCBGWF9GTE9BVAkJCQlHZXRGb250U2l6ZSgpIGNvbnN0OworICB2b2lkIFNldFRleHQoY29uc3QgRlhfV0NIQVIqIGNzVGV4dCk7CisgIENGWF9XaWRlU3RyaW5nIEdldFRleHQoKSBjb25zdDsKKyAgdm9pZCBTZXRMaW1pdENoYXIoaW50MzJfdCBuTGltaXRDaGFyKTsKKyAgdm9pZCBTZXRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlKTsKKyAgdm9pZCBTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSk7CisgIENQREZfUmVjdCBHZXRDb250ZW50UmVjdCgpIGNvbnN0OworICBpbnQzMl90IEdldFRvdGFsV29yZHMoKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0VGV4dEFwcGVhcmFuY2VTdHJlYW0oY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQpIGNvbnN0OwogCi0Jdm9pZAkJCQkJCQlTZXRUZXh0KEZYX0xQQ1dTVFIgY3NUZXh0KTsKLQlDRlhfV2lkZVN0cmluZwkJCQkJR2V0VGV4dCgpIGNvbnN0OwotCXZvaWQJCQkJCQkJU2V0TGltaXRDaGFyKEZYX0lOVDMyIG5MaW1pdENoYXIpOwotCXZvaWQJCQkJCQkJU2V0SG9yelNjYWxlKEZYX0lOVDMyIG5Ib3J6U2NhbGUpOwotCXZvaWQJCQkJCQkJU2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpOwotCUNQREZfUmVjdAkJCQkJCUdldENvbnRlbnRSZWN0KCkgY29uc3Q7Ci0JRlhfSU5UMzIJCQkJCQlHZXRUb3RhbFdvcmRzKCk7Ci0JQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldFRleHRBcHBlYXJhbmNlU3RyZWFtKGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCkgY29uc3Q7CisgcHJvdGVjdGVkOgorICAvLyBDUFdMX1duZAorICBDRlhfQnl0ZVN0cmluZyBHZXRDbGFzc05hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpIG92ZXJyaWRlOworICBGWF9GTE9BVCBHZXRGb250U2l6ZSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIE9uQ3JlYXRlZCgpIG92ZXJyaWRlOworICB2b2lkIERyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UpIG92ZXJyaWRlOworICB2b2lkIEdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiYgc0FwcFN0cmVhbSkgb3ZlcnJpZGU7CisgIHZvaWQgUmVQb3NDaGlsZFduZCgpIG92ZXJyaWRlOwogCi1wcm90ZWN0ZWQ6Ci0JdmlydHVhbCB2b2lkCQkJCQlPbkNyZWF0ZWQoKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCURyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCUdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiAmIHNBcHBTdHJlYW0pOwotCXZpcnR1YWwgdm9pZAkJCQkJUmVQb3NDaGlsZFduZCgpOworIHByaXZhdGU6CisgIHZvaWQgU2V0UGFyYW1CeUZsYWcoKTsKIAotcHJpdmF0ZToKLQl2b2lkCQkJCQkJCVNldFBhcmFtQnlGbGFnKCk7Ci0KLQlJRlhfRWRpdCoJCQkJCQltX3BFZGl0OworICBJRlhfRWRpdCogbV9wRWRpdDsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX1BERldJTkRPV19QV0xfTEFCRUxfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0xpc3RCb3guaCBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0xpc3RCb3guaAppbmRleCBlOGU5MDM2Li44MDdmMTFlIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9MaXN0Qm94LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGlzdEJveC5oCkBAIC0xLDEwNCArMSwxMjMgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9MSVNUQk9YX0hfCiAjZGVmaW5lIEZQREZTREtfSU5DTFVERV9QREZXSU5ET1dfUFdMX0xJU1RCT1hfSF8KIAotI2luY2x1ZGUgIi4uL2Z4ZWRpdC9meF9lZGl0LmgiCiAjaW5jbHVkZSAiUFdMX1duZC5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhfZWRpdC5oIgogCiBjbGFzcyBDUERGX0xpc3RDdHJsOwogY2xhc3MgQ1BXTF9MaXN0X05vdGlmeTsKIGNsYXNzIENQV0xfTGlzdEJveDsKIGNsYXNzIElQV0xfRmlsbGVyX05vdGlmeTsKIAotY2xhc3MgQ1BXTF9MaXN0X05vdGlmeSA6IHB1YmxpYyBJRlhfTGlzdF9Ob3RpZnkKLXsKLXB1YmxpYzoKLQlDUFdMX0xpc3RfTm90aWZ5KENQV0xfTGlzdEJveCAqIHBMaXN0KTsKLQl2aXJ0dWFsIH5DUFdMX0xpc3RfTm90aWZ5KCk7CitjbGFzcyBDUFdMX0xpc3RfTm90aWZ5IDogcHVibGljIElGWF9MaXN0X05vdGlmeSB7CisgcHVibGljOgorICBDUFdMX0xpc3RfTm90aWZ5KENQV0xfTGlzdEJveCogcExpc3QpOworICB+Q1BXTF9MaXN0X05vdGlmeSgpIG92ZXJyaWRlOwogCi0Jdm9pZAkJCQkJCQlJT25TZXRTY3JvbGxJbmZvWChGWF9GTE9BVCBmUGxhdGVNaW4sIEZYX0ZMT0FUIGZQbGF0ZU1heCwgCi0JCQkJCQkJCQkJCQlGWF9GTE9BVCBmQ29udGVudE1pbiwgRlhfRkxPQVQgZkNvbnRlbnRNYXgsIAotCQkJCQkJCQkJCQkJRlhfRkxPQVQgZlNtYWxsU3RlcCwgRlhfRkxPQVQgZkJpZ1N0ZXApe30KLQl2b2lkCQkJCQkJCUlPblNldFNjcm9sbEluZm9ZKEZYX0ZMT0FUIGZQbGF0ZU1pbiwgRlhfRkxPQVQgZlBsYXRlTWF4LCAKLQkJCQkJCQkJCQkJCUZYX0ZMT0FUIGZDb250ZW50TWluLCBGWF9GTE9BVCBmQ29udGVudE1heCwgCi0JCQkJCQkJCQkJCQlGWF9GTE9BVCBmU21hbGxTdGVwLCBGWF9GTE9BVCBmQmlnU3RlcCk7Ci0Jdm9pZAkJCQkJCQlJT25TZXRTY3JvbGxQb3NYKEZYX0ZMT0FUIGZ4KXt9Ci0Jdm9pZAkJCQkJCQlJT25TZXRTY3JvbGxQb3NZKEZYX0ZMT0FUIGZ5KTsKLQl2b2lkCQkJCQkJCUlPblNldENhcmV0KEZYX0JPT0wgYlZpc2libGUsY29uc3QgQ1BERl9Qb2ludCAmIHB0SGVhZCxjb25zdCBDUERGX1BvaW50ICYgcHRGb290LCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpOwotCXZvaWQJCQkJCQkJSU9uQ2FyZXRDaGFuZ2UoY29uc3QgQ1BWVF9TZWNQcm9wcyAmIHNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAmIHdvcmRQcm9wcyk7Ci0Jdm9pZAkJCQkJCQlJT25JbnZhbGlkYXRlUmVjdChDUERGX1JlY3QgKiBwUmVjdCk7CisgIC8vIElGWF9MaXN0X05vdGlmeQorICB2b2lkIElPblNldFNjcm9sbEluZm9YKEZYX0ZMT0FUIGZQbGF0ZU1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGxhdGVNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNvbnRlbnRNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNvbnRlbnRNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNtYWxsU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQmlnU3RlcCkgb3ZlcnJpZGUge30KKyAgdm9pZCBJT25TZXRTY3JvbGxJbmZvWShGWF9GTE9BVCBmUGxhdGVNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBsYXRlTWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50TWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTbWFsbFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkJpZ1N0ZXApIG92ZXJyaWRlOworICB2b2lkIElPblNldFNjcm9sbFBvc1goRlhfRkxPQVQgZngpIG92ZXJyaWRlIHt9CisgIHZvaWQgSU9uU2V0U2Nyb2xsUG9zWShGWF9GTE9BVCBmeSkgb3ZlcnJpZGU7CisgIHZvaWQgSU9uSW52YWxpZGF0ZVJlY3QoQ1BERl9SZWN0KiBwUmVjdCkgb3ZlcnJpZGU7CiAKLXByaXZhdGU6Ci0JQ1BXTF9MaXN0Qm94KgkJCQkJbV9wTGlzdDsJCisgIHZvaWQgSU9uU2V0Q2FyZXQoRlhfQk9PTCBiVmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdEhlYWQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRGb290LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSk7CisgIHZvaWQgSU9uQ2FyZXRDaGFuZ2UoY29uc3QgQ1BWVF9TZWNQcm9wcyYgc2VjUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMmIHdvcmRQcm9wcyk7CisKKyBwcml2YXRlOgorICBDUFdMX0xpc3RCb3gqIG1fcExpc3Q7CiB9OwogCi1jbGFzcyBQV0xfQ0xBU1MgQ1BXTF9MaXN0Qm94IDogcHVibGljIENQV0xfV25kCi17Ci1wdWJsaWM6Ci0JQ1BXTF9MaXN0Qm94KCk7Ci0JdmlydHVhbCB+Q1BXTF9MaXN0Qm94KCk7CitjbGFzcyBDUFdMX0xpc3RCb3ggOiBwdWJsaWMgQ1BXTF9XbmQgeworIHB1YmxpYzoKKyAgQ1BXTF9MaXN0Qm94KCk7CisgIH5DUFdMX0xpc3RCb3goKSBvdmVycmlkZTsKIAotCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCQlHZXRDbGFzc05hbWUoKSBjb25zdDsKLQl2aXJ0dWFsIHZvaWQJCQkJCU9uQ3JlYXRlZCgpOwotCXZpcnR1YWwgdm9pZAkJCQkJT25EZXN0cm95KCk7Ci0JdmlydHVhbCB2b2lkCQkJCQlHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCURyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKKyAgLy8gQ1BXTF9XbmQKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0Q2xhc3NOYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgT25DcmVhdGVkKCkgb3ZlcnJpZGU7CisgIHZvaWQgT25EZXN0cm95KCkgb3ZlcnJpZGU7CisgIHZvaWQgR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmJiBzQXBwU3RyZWFtKSBvdmVycmlkZTsKKyAgdm9pZCBEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpIG92ZXJyaWRlOworICBGWF9CT09MIE9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykgb3ZlcnJpZGU7CisgIEZYX0JPT0wgT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIG92ZXJyaWRlOworICBGWF9CT09MIE9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgb3ZlcnJpZGU7CisgIEZYX0JPT0wgT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIG92ZXJyaWRlOworICB2b2lkIEtpbGxGb2N1cygpIG92ZXJyaWRlOworICB2b2lkIE9uTm90aWZ5KENQV0xfV25kKiBwV25kLAorICAgICAgICAgICAgICAgIEZYX0RXT1JEIG1zZywKKyAgICAgICAgICAgICAgICBpbnRwdHJfdCB3UGFyYW0gPSAwLAorICAgICAgICAgICAgICAgIGludHB0cl90IGxQYXJhbSA9IDApIG92ZXJyaWRlOworICB2b2lkIFJlUG9zQ2hpbGRXbmQoKSBvdmVycmlkZTsKKyAgQ1BERl9SZWN0IEdldEZvY3VzUmVjdCgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgb3ZlcnJpZGU7CisgIEZYX0ZMT0FUIEdldEZvbnRTaXplKCkgY29uc3Qgb3ZlcnJpZGU7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCUtpbGxGb2N1cygpOworICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIEdldFRleHQoKSBjb25zdDsKIAotCXZpcnR1YWwgdm9pZAkJCQkJT25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgRlhfSU5UUFRSIHdQYXJhbSA9IDAsIEZYX0lOVFBUUiBsUGFyYW0gPSAwKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCVJlUG9zQ2hpbGRXbmQoKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCVNldFRleHQoRlhfTFBDV1NUUiBjc1RleHQsRlhfQk9PTCBiUmVmcmVzaCA9IFRSVUUpOwotCXZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcJCQlHZXRUZXh0KCkgY29uc3Q7CQotCXZpcnR1YWwgQ1BERl9SZWN0CQkJCUdldEZvY3VzUmVjdCgpIGNvbnN0OwotCXZpcnR1YWwgdm9pZAkJCQkJU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsKLQl2aXJ0dWFsIEZYX0ZMT0FUCQkJCUdldEZvbnRTaXplKCkgY29uc3Q7CisgIHZvaWQgT25Ob3RpZnlTZWxDaGFuZ2VkKEZYX0JPT0wgYktleURvd24sIEZYX0JPT0wmIGJFeGl0LCBGWF9EV09SRCBuRmxhZyk7CiAKLQl2b2lkCQkJCQkJCU9uTm90aWZ5U2VsQ2hhbmdlZChGWF9CT09MIGJLZXlEb3duLCBGWF9CT09MICYgYkV4aXQgLCBGWF9EV09SRCBuRmxhZyk7CisgIHZvaWQgQWRkU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBzdHJpbmcpOworICB2b2lkIFNldFRvcFZpc2libGVJbmRleChpbnQzMl90IG5JdGVtSW5kZXgpOworICB2b2lkIFNjcm9sbFRvTGlzdEl0ZW0oaW50MzJfdCBuSXRlbUluZGV4KTsKKyAgdm9pZCBSZXNldENvbnRlbnQoKTsKKyAgdm9pZCBSZXNldCgpOworICB2b2lkIFNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgpOworICB2b2lkIFNldENhcmV0KGludDMyX3Qgbkl0ZW1JbmRleCk7CisgIHZvaWQgU2V0SG92ZXJTZWwoRlhfQk9PTCBiSG92ZXJTZWwpOwogCi0Jdm9pZAkJCQkJCQlBZGRTdHJpbmcoRlhfTFBDV1NUUiBzdHJpbmcpOwkKLQl2b2lkCQkJCQkJCVNldFRvcFZpc2libGVJbmRleChGWF9JTlQzMiBuSXRlbUluZGV4KTsKLQl2b2lkCQkJCQkJCVNjcm9sbFRvTGlzdEl0ZW0oRlhfSU5UMzIgbkl0ZW1JbmRleCk7Ci0Jdm9pZAkJCQkJCQlSZXNldENvbnRlbnQoKTsKLQl2b2lkCQkJCQkJCVJlc2V0KCk7Ci0Jdm9pZAkJCQkJCQlTZWxlY3QoRlhfSU5UMzIgbkl0ZW1JbmRleCk7Ci0Jdm9pZAkJCQkJCQlTZXRDYXJldChGWF9JTlQzMiBuSXRlbUluZGV4KTsKLQl2b2lkCQkJCQkJCVNldEhvdmVyU2VsKEZYX0JPT0wgYkhvdmVyU2VsKTsKLQkKLQlGWF9JTlQzMgkJCQkJCUdldENvdW50KCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlJc011bHRpcGxlU2VsKCkgY29uc3Q7Ci0JRlhfSU5UMzIJCQkJCQlHZXRDYXJldEluZGV4KCkgY29uc3Q7Ci0JRlhfSU5UMzIJCQkJCQlHZXRDdXJTZWwoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUlzSXRlbVNlbGVjdGVkKEZYX0lOVDMyIG5JdGVtSW5kZXgpIGNvbnN0OwotCUZYX0lOVDMyCQkJCQkJR2V0VG9wVmlzaWJsZUluZGV4KCkgY29uc3Q7Ci0JRlhfSU5UMzIJCQkJCQlGaW5kTmV4dChGWF9JTlQzMiBuSW5kZXgsRlhfV0NIQVIgbkNoYXIpIGNvbnN0OwotCUNQREZfUmVjdAkJCQkJCUdldENvbnRlbnRSZWN0KCkgY29uc3Q7CQotCUZYX0ZMT0FUCQkJCQkJR2V0Rmlyc3RIZWlnaHQoKSBjb25zdDsKLQlDUERGX1JlY3QJCQkJCQlHZXRMaXN0UmVjdCgpIGNvbnN0OworICBpbnQzMl90IEdldENvdW50KCkgY29uc3Q7CisgIEZYX0JPT0wgSXNNdWx0aXBsZVNlbCgpIGNvbnN0OworICBpbnQzMl90IEdldENhcmV0SW5kZXgoKSBjb25zdDsKKyAgaW50MzJfdCBHZXRDdXJTZWwoKSBjb25zdDsKKyAgRlhfQk9PTCBJc0l0ZW1TZWxlY3RlZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OworICBpbnQzMl90IEdldFRvcFZpc2libGVJbmRleCgpIGNvbnN0OworICBpbnQzMl90IEZpbmROZXh0KGludDMyX3QgbkluZGV4LCBGWF9XQ0hBUiBuQ2hhcikgY29uc3Q7CisgIENQREZfUmVjdCBHZXRDb250ZW50UmVjdCgpIGNvbnN0OworICBGWF9GTE9BVCBHZXRGaXJzdEhlaWdodCgpIGNvbnN0OworICBDUERGX1JlY3QgR2V0TGlzdFJlY3QoKSBjb25zdDsKIAotCXZvaWQJCQkJCQkJU2V0RmlsbGVyTm90aWZ5KElQV0xfRmlsbGVyX05vdGlmeSogcE5vdGlmeSkge21fcEZpbGxlck5vdGlmeSA9IHBOb3RpZnk7fQorICB2b2lkIFNldEZpbGxlck5vdGlmeShJUFdMX0ZpbGxlcl9Ob3RpZnkqIHBOb3RpZnkpIHsKKyAgICBtX3BGaWxsZXJOb3RpZnkgPSBwTm90aWZ5OworICB9CiAKLXByb3RlY3RlZDoKLQlJRlhfTGlzdCoJCQkJCQltX3BMaXN0OwotCUNQV0xfTGlzdF9Ob3RpZnkqCQkJCW1fcExpc3ROb3RpZnk7Ci0JRlhfQk9PTAkJCQkJCQltX2JNb3VzZURvd247Ci0JRlhfQk9PTAkJCQkJCQltX2JIb3ZlclNlbDsKLQlJUFdMX0ZpbGxlcl9Ob3RpZnkqCQkJCW1fcEZpbGxlck5vdGlmeTsKLXB1YmxpYzoKLQl2b2lkCQkJCQkJCUF0dGFjaEZGTERhdGEodm9pZCogcERhdGEpIHttX3BGb3JtRmlsbGVyID0gcERhdGE7fQotcHJpdmF0ZToKLQl2b2lkKgkJCQkJCQltX3BGb3JtRmlsbGVyOworIHByb3RlY3RlZDoKKyAgSUZYX0xpc3QqIG1fcExpc3Q7CisgIENQV0xfTGlzdF9Ob3RpZnkqIG1fcExpc3ROb3RpZnk7CisgIEZYX0JPT0wgbV9iTW91c2VEb3duOworICBGWF9CT09MIG1fYkhvdmVyU2VsOworICBJUFdMX0ZpbGxlcl9Ob3RpZnkqIG1fcEZpbGxlck5vdGlmeTsKKworIHB1YmxpYzoKKyAgdm9pZCBBdHRhY2hGRkxEYXRhKHZvaWQqIHBEYXRhKSB7IG1fcEZvcm1GaWxsZXIgPSBwRGF0YTsgfQorCisgcHJpdmF0ZToKKyAgdm9pZCogbV9wRm9ybUZpbGxlcjsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX1BERldJTkRPV19QV0xfTElTVEJPWF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGlzdEN0cmwuaCBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0xpc3RDdHJsLmgKaW5kZXggNjVkZjdhZS4uNGM5NmQ0MyAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGlzdEN0cmwuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9MaXN0Q3RybC5oCkBAIC0xLDcgKzEsNyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIEZQREZTREtfSU5DTFVERV9QREZXSU5ET1dfUFdMX0xJU1RDVFJMX0hfCkBAIC05LDM5ICs5LDQwIEBACiAKICNpbmNsdWRlICJQV0xfV25kLmgiCiAKLWNsYXNzIENQV0xfTGlzdEN0cmwgOiBwdWJsaWMgQ1BXTF9XbmQKLXsKLXB1YmxpYzoKLQlDUFdMX0xpc3RDdHJsKCk7Ci0JdmlydHVhbCB+Q1BXTF9MaXN0Q3RybCgpOworY2xhc3MgQ1BXTF9MaXN0Q3RybCA6IHB1YmxpYyBDUFdMX1duZCB7CisgcHVibGljOgorICBDUFdMX0xpc3RDdHJsKCk7CisgIH5DUFdMX0xpc3RDdHJsKCkgb3ZlcnJpZGU7CiAKLQl2b2lkCQkJCQkJCQlTZXRTY3JvbGxQb3MoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCUNQREZfUG9pbnQJCQkJCQkJR2V0U2Nyb2xsUG9zKCkgY29uc3Q7Ci0JQ1BERl9SZWN0CQkJCQkJCUdldFNjcm9sbEFyZWEoKSBjb25zdDsKLQl2b2lkCQkJCQkJCQlTZXRJdGVtU3BhY2UoRlhfRkxPQVQgZlNwYWNlKTsKLQl2b2lkCQkJCQkJCQlTZXRUb3BTcGFjZShGWF9GTE9BVCBmU3BhY2UpOwotCXZvaWQJCQkJCQkJCVNldEJvdHRvbVNwYWNlKEZYX0ZMT0FUIGZTcGFjZSk7Ci0Jdm9pZAkJCQkJCQkJUmVzZXRGYWNlKCk7Ci0Jdm9pZAkJCQkJCQkJUmVzZXRDb250ZW50KEZYX0lOVDMyIG5TdGFydCk7Ci0JRlhfSU5UMzIJCQkJCQkJR2V0SXRlbUluZGV4KENQV0xfV25kKiBwSXRlbSk7Ci0JRlhfRkxPQVQJCQkJCQkJR2V0Q29udGVudHNIZWlnaHQoRlhfRkxPQVQgZkxpbWl0V2lkdGgpOwotCUNQREZfUG9pbnQJCQkJCQkJSW5Ub091dChjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3Q7Ci0JQ1BERl9Qb2ludAkJCQkJCQlPdXRUb0luKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdDsKLQlDUERGX1JlY3QJCQkJCQkJSW5Ub091dChjb25zdCBDUERGX1JlY3QmIHJlY3QpIGNvbnN0OwotCUNQREZfUmVjdAkJCQkJCQlPdXRUb0luKGNvbnN0IENQREZfUmVjdCYgcmVjdCkgY29uc3Q7CisgIHZvaWQgU2V0U2Nyb2xsUG9zKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgQ1BERl9Qb2ludCBHZXRTY3JvbGxQb3MoKSBjb25zdDsKKyAgQ1BERl9SZWN0IEdldFNjcm9sbEFyZWEoKSBjb25zdDsKKyAgdm9pZCBTZXRJdGVtU3BhY2UoRlhfRkxPQVQgZlNwYWNlKTsKKyAgdm9pZCBTZXRUb3BTcGFjZShGWF9GTE9BVCBmU3BhY2UpOworICB2b2lkIFNldEJvdHRvbVNwYWNlKEZYX0ZMT0FUIGZTcGFjZSk7CisgIHZvaWQgUmVzZXRGYWNlKCk7CisgIHZvaWQgUmVzZXRDb250ZW50KGludDMyX3QgblN0YXJ0KTsKKyAgaW50MzJfdCBHZXRJdGVtSW5kZXgoQ1BXTF9XbmQqIHBJdGVtKTsKKyAgRlhfRkxPQVQgR2V0Q29udGVudHNIZWlnaHQoRlhfRkxPQVQgZkxpbWl0V2lkdGgpOworICBDUERGX1BvaW50IEluVG9PdXQoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0OworICBDUERGX1BvaW50IE91dFRvSW4oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0OworICBDUERGX1JlY3QgSW5Ub091dChjb25zdCBDUERGX1JlY3QmIHJlY3QpIGNvbnN0OworICBDUERGX1JlY3QgT3V0VG9Jbihjb25zdCBDUERGX1JlY3QmIHJlY3QpIGNvbnN0OwogCi1wcm90ZWN0ZWQ6Ci0JdmlydHVhbCB2b2lkCQkJCQkJUmVQb3NDaGlsZFduZCgpOwotCXZpcnR1YWwgdm9pZAkJCQkJCURyYXdDaGlsZEFwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7CisgcHJvdGVjdGVkOgorICAvLyBDUFdMX1duZAorICB2b2lkIFJlUG9zQ2hpbGRXbmQoKSBvdmVycmlkZTsKKyAgdm9pZCBEcmF3Q2hpbGRBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UpIG92ZXJyaWRlOwogCi1wcml2YXRlOgotCXZvaWQJCQkJCQkJCVJlc2V0QWxsKEZYX0JPT0wgYk1vdmUsRlhfSU5UMzIgblN0YXJ0KTsKKyBwcml2YXRlOgorICB2b2lkIFJlc2V0QWxsKEZYX0JPT0wgYk1vdmUsIGludDMyX3QgblN0YXJ0KTsKIAotCUNQREZfUmVjdAkJCQkJCQltX3JjQ29udGVudDsKLQlDUERGX1BvaW50CQkJCQkJCW1fcHRTY3JvbGw7Ci0JRlhfRkxPQVQJCQkJCQkJbV9mSXRlbVNwYWNlOwotCUZYX0ZMT0FUCQkJCQkJCW1fZlRvcFNwYWNlOwotCUZYX0ZMT0FUCQkJCQkJCW1fZkJvdHRvbVNwYWNlOworICBDUERGX1JlY3QgbV9yY0NvbnRlbnQ7CisgIENQREZfUG9pbnQgbV9wdFNjcm9sbDsKKyAgRlhfRkxPQVQgbV9mSXRlbVNwYWNlOworICBGWF9GTE9BVCBtX2ZUb3BTcGFjZTsKKyAgRlhfRkxPQVQgbV9mQm90dG9tU3BhY2U7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9QREZXSU5ET1dfUFdMX0xJU1RDVFJMX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Ob3RlLmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Ob3RlLmgKaW5kZXggYzVjZGM0ZC4uOTk0NmY0NCAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTm90ZS5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX05vdGUuaApAQCAtMSw3ICsxLDcgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2lmbmRlZiBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9OT1RFX0hfCkBAIC0yOCwzMzMgKzI4LDMyNCBAQAogY2xhc3MgSVBXTF9Ob3RlTm90aWZ5OwogY2xhc3MgSVBvcHVwX05vdGU7CiAKLWNsYXNzIElQV0xfTm90ZU5vdGlmeQotewotcHVibGljOgotCXZpcnR1YWwgfklQV0xfTm90ZU5vdGlmeSgpIHsgfQotCXZpcnR1YWwgdm9pZAkJCQkJCU9uTm90ZU1vdmUoY29uc3QgRlhfUkVDVCYgcnRXaW4pID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlPbk5vdGVTaG93KEZYX0JPT0wgYlNob3cpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlPbk5vdGVBY3RpdmF0ZShGWF9CT09MIGJBY3RpdmUpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlPbk5vdGVDbG9zZSgpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlPbkl0ZW1DcmVhdGUoSVBXTF9Ob3RlSXRlbSogcEl0ZW0pID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlPbkl0ZW1EZWxldGUoSVBXTF9Ob3RlSXRlbSogcEl0ZW0pID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlPblNldEF1dGhvck5hbWUoSVBXTF9Ob3RlSXRlbSogcEl0ZW0pID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlPblNldEJrQ29sb3IoSVBXTF9Ob3RlSXRlbSogcEl0ZW0pID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlPblNldENvbnRlbnRzKElQV0xfTm90ZUl0ZW0qIHBJdGVtKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJT25TZXREYXRlVGltZShJUFdMX05vdGVJdGVtKiBwSXRlbSkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCU9uU2V0U3ViamVjdE5hbWUoSVBXTF9Ob3RlSXRlbSogcEl0ZW0pID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlPblBvcHVwTWVudShGWF9JTlQzMiB4LCBGWF9JTlQzMiB5KSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJT25Qb3B1cE1lbnUoSVBXTF9Ob3RlSXRlbSogcEl0ZW0sIEZYX0lOVDMyIHgsIEZYX0lOVDMyIHkpID0gMDsKK2NsYXNzIElQV0xfTm90ZU5vdGlmeSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JUFdMX05vdGVOb3RpZnkoKSB7fQorICB2aXJ0dWFsIHZvaWQgT25Ob3RlTW92ZShjb25zdCBGWF9SRUNUJiBydFdpbikgPSAwOworICB2aXJ0dWFsIHZvaWQgT25Ob3RlU2hvdyhGWF9CT09MIGJTaG93KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPbk5vdGVBY3RpdmF0ZShGWF9CT09MIGJBY3RpdmUpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uTm90ZUNsb3NlKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25JdGVtQ3JlYXRlKElQV0xfTm90ZUl0ZW0qIHBJdGVtKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPbkl0ZW1EZWxldGUoSVBXTF9Ob3RlSXRlbSogcEl0ZW0pID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uU2V0QXV0aG9yTmFtZShJUFdMX05vdGVJdGVtKiBwSXRlbSkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25TZXRCa0NvbG9yKElQV0xfTm90ZUl0ZW0qIHBJdGVtKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPblNldENvbnRlbnRzKElQV0xfTm90ZUl0ZW0qIHBJdGVtKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPblNldERhdGVUaW1lKElQV0xfTm90ZUl0ZW0qIHBJdGVtKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPblNldFN1YmplY3ROYW1lKElQV0xfTm90ZUl0ZW0qIHBJdGVtKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPblBvcHVwTWVudShpbnQzMl90IHgsIGludDMyX3QgeSkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25Qb3B1cE1lbnUoSVBXTF9Ob3RlSXRlbSogcEl0ZW0sIGludDMyX3QgeCwgaW50MzJfdCB5KSA9IDA7CiB9OwogCi1jbGFzcyBJUFdMX05vdGVIYW5kbGVyCi17Ci1wdWJsaWM6Ci0JdmlydHVhbCB+SVBXTF9Ob3RlSGFuZGxlcigpIHsgfQotCXZpcnR1YWwgdm9pZAkJCQkJCU9uTm90ZUNvbG9yQ2hhbmdlZChjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikgPSAwOworY2xhc3MgSVBXTF9Ob3RlSGFuZGxlciB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JUFdMX05vdGVIYW5kbGVyKCkge30KKyAgdmlydHVhbCB2b2lkIE9uTm90ZUNvbG9yQ2hhbmdlZChjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikgPSAwOwogfTsKIAotY2xhc3MgSVBXTF9Ob3RlSXRlbQotewotcHVibGljOgotCXZpcnR1YWwgfklQV0xfTm90ZUl0ZW0oKSB7IH0KLQl2aXJ0dWFsIHZvaWQJCQkJCQlTZXRQcml2YXRlRGF0YSh2b2lkKiBwRGF0YSkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCVNldEJrQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlTZXRTdWJqZWN0TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc05hbWUpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlTZXRBdXRob3JOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzTmFtZSkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCVNldERhdGVUaW1lKEZYX1NZU1RFTVRJTUUgdGltZSkgPSAwOwotCXZpcnR1YWwgdm9pZAkJCQkJCVNldENvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzQ29udGVudHMpID0gMDsKK2NsYXNzIElQV0xfTm90ZUl0ZW0geworIHB1YmxpYzoKKyAgdmlydHVhbCB+SVBXTF9Ob3RlSXRlbSgpIHt9CisgIHZpcnR1YWwgdm9pZCBTZXRQcml2YXRlRGF0YSh2b2lkKiBwRGF0YSkgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0QmtDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0U3ViamVjdE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNOYW1lKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRBdXRob3JOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzTmFtZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0RGF0ZVRpbWUoRlhfU1lTVEVNVElNRSB0aW1lKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc0NvbnRlbnRzKSA9IDA7CiAKLQl2aXJ0dWFsIElQV0xfTm90ZUl0ZW0qCQkJCUNyZWF0ZVN1Ykl0ZW0oKSA9IDA7Ci0JdmlydHVhbCBGWF9JTlQzMgkJCQkJQ291bnRTdWJJdGVtcygpIGNvbnN0ID0gMDsKLQl2aXJ0dWFsIElQV0xfTm90ZUl0ZW0qCQkJCUdldFN1Ykl0ZW1zKEZYX0lOVDMyIGluZGV4KSBjb25zdCA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJRGVsZXRlU3ViSXRlbShJUFdMX05vdGVJdGVtKiBwTm90ZUl0ZW0pID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlTZXRGb2N1cygpID0gMDsKLQkKLQl2aXJ0dWFsIElQV0xfTm90ZUl0ZW0qCQkJCUdldFBhcmVudEl0ZW0oKSBjb25zdCA9IDA7Ci0JdmlydHVhbCB2b2lkKgkJCQkJCUdldFByaXZhdGVEYXRhKCkgY29uc3QgPSAwOwotCXZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcJCQkJR2V0QXV0aG9yTmFtZSgpIGNvbnN0ID0gMDsKLQl2aXJ0dWFsIENQV0xfQ29sb3IJCQkJCUdldEJrQ29sb3IoKSBjb25zdCA9IDA7Ci0JdmlydHVhbCBDRlhfV2lkZVN0cmluZwkJCQlHZXRDb250ZW50cygpIGNvbnN0ID0gMDsKLQl2aXJ0dWFsIEZYX1NZU1RFTVRJTUUJCQkJR2V0RGF0ZVRpbWUoKSBjb25zdCA9IDA7Ci0JdmlydHVhbCBDRlhfV2lkZVN0cmluZwkJCQlHZXRTdWJqZWN0TmFtZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBJUFdMX05vdGVJdGVtKiBDcmVhdGVTdWJJdGVtKCkgPSAwOworICB2aXJ0dWFsIGludDMyX3QgQ291bnRTdWJJdGVtcygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBJUFdMX05vdGVJdGVtKiBHZXRTdWJJdGVtcyhpbnQzMl90IGluZGV4KSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBEZWxldGVTdWJJdGVtKElQV0xfTm90ZUl0ZW0qIHBOb3RlSXRlbSkgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0Rm9jdXMoKSA9IDA7CiAKLQl2aXJ0dWFsIENQV0xfRWRpdCoJCQkJCUdldEVkaXQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgSVBXTF9Ob3RlSXRlbSogR2V0UGFyZW50SXRlbSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkKiBHZXRQcml2YXRlRGF0YSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBHZXRBdXRob3JOYW1lKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIENQV0xfQ29sb3IgR2V0QmtDb2xvcigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBHZXRDb250ZW50cygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBGWF9TWVNURU1USU1FIEdldERhdGVUaW1lKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIEdldFN1YmplY3ROYW1lKCkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgQ1BXTF9FZGl0KiBHZXRFZGl0KCkgY29uc3QgPSAwOwogfTsKIAotY2xhc3MgUFdMX0NMQVNTIENQV0xfTm90ZV9JY29uIDogcHVibGljIENQV0xfV25kCi17Ci1wdWJsaWM6Ci0JQ1BXTF9Ob3RlX0ljb24oKTsKLQl2aXJ0dWFsIH5DUFdMX05vdGVfSWNvbigpOworY2xhc3MgQ1BXTF9Ob3RlX0ljb24gOiBwdWJsaWMgQ1BXTF9XbmQgeworIHB1YmxpYzoKKyAgQ1BXTF9Ob3RlX0ljb24oKTsKKyAgfkNQV0xfTm90ZV9JY29uKCkgb3ZlcnJpZGU7CiAKLQl2b2lkCQkJCQkJCQlTZXRJY29uVHlwZShGWF9JTlQzMiBuVHlwZSk7CisgIHZvaWQgU2V0SWNvblR5cGUoaW50MzJfdCBuVHlwZSk7CiAKLXB1YmxpYzoKKyBwcm90ZWN0ZWQ6CisgIC8vIENQV0xfV25kCisgIHZvaWQgRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSkgb3ZlcnJpZGU7CiAKLXByb3RlY3RlZDoKLQl2aXJ0dWFsIHZvaWQJCQkJCQlEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7Ci0KLXByaXZhdGU6Ci0JRlhfSU5UMzIJCQkJCQkJbV9uVHlwZTsKKyBwcml2YXRlOgorICBpbnQzMl90IG1fblR5cGU7CiB9OwogCi1jbGFzcyBDUFdMX05vdGVfQ2xvc2VCb3ggOiBwdWJsaWMgQ1BXTF9CdXR0b24KLXsKLXB1YmxpYzoKLQlDUFdMX05vdGVfQ2xvc2VCb3goKTsKLQl2aXJ0dWFsIH5DUFdMX05vdGVfQ2xvc2VCb3goKTsKK2NsYXNzIENQV0xfTm90ZV9DbG9zZUJveCA6IHB1YmxpYyBDUFdMX0J1dHRvbiB7CisgcHVibGljOgorICBDUFdMX05vdGVfQ2xvc2VCb3goKTsKKyAgfkNQV0xfTm90ZV9DbG9zZUJveCgpIG92ZXJyaWRlOwogCi1wcm90ZWN0ZWQ6Ci0JdmlydHVhbCB2b2lkCQkJCQkJRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgcHJvdGVjdGVkOgorICAvLyBDUFdMX0J1dHRvbgorICB2b2lkIERyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UpIG92ZXJyaWRlOworICBGWF9CT09MIE9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIG92ZXJyaWRlOwogCi1wcml2YXRlOgotCUZYX0JPT0wJCQkJCQkJCW1fYk1vdXNlRG93bjsKKyBwcml2YXRlOgorICBGWF9CT09MIG1fYk1vdXNlRG93bjsKIH07CiAKLWNsYXNzIENQV0xfTm90ZV9MQkJveCA6IHB1YmxpYyBDUFdMX1duZAotewotcHVibGljOgotCUNQV0xfTm90ZV9MQkJveCgpOwotCXZpcnR1YWwgfkNQV0xfTm90ZV9MQkJveCgpOworY2xhc3MgQ1BXTF9Ob3RlX0xCQm94IDogcHVibGljIENQV0xfV25kIHsKKyBwdWJsaWM6CisgIENQV0xfTm90ZV9MQkJveCgpOworICB+Q1BXTF9Ob3RlX0xCQm94KCkgb3ZlcnJpZGU7CiAKLXByb3RlY3RlZDoKLQl2aXJ0dWFsIHZvaWQJCQkJCQlEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7CisgcHJvdGVjdGVkOgorICAvLyBDUFdMX1duZAorICB2b2lkIERyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UpIG92ZXJyaWRlOwogfTsKIAotY2xhc3MgQ1BXTF9Ob3RlX1JCQm94IDogcHVibGljIENQV0xfV25kCi17Ci1wdWJsaWM6Ci0JQ1BXTF9Ob3RlX1JCQm94KCk7Ci0JdmlydHVhbCB+Q1BXTF9Ob3RlX1JCQm94KCk7CitjbGFzcyBDUFdMX05vdGVfUkJCb3ggOiBwdWJsaWMgQ1BXTF9XbmQgeworIHB1YmxpYzoKKyAgQ1BXTF9Ob3RlX1JCQm94KCk7CisgIH5DUFdMX05vdGVfUkJCb3goKSBvdmVycmlkZTsKIAotcHJvdGVjdGVkOgotCXZpcnR1YWwgdm9pZAkJCQkJCURyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKKyBwcm90ZWN0ZWQ6CisgIC8vIENQV0xfV25kCisgIHZvaWQgRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSkgb3ZlcnJpZGU7CiB9OwogCi1jbGFzcyBDUFdMX05vdGVfRWRpdCA6IHB1YmxpYyBDUFdMX0VkaXQKLXsKLXB1YmxpYzoKLQlDUFdMX05vdGVfRWRpdCgpOwotCXZpcnR1YWwgfkNQV0xfTm90ZV9FZGl0KCk7CitjbGFzcyBDUFdMX05vdGVfRWRpdCA6IHB1YmxpYyBDUFdMX0VkaXQgeworIHB1YmxpYzoKKyAgQ1BXTF9Ob3RlX0VkaXQoKTsKKyAgfkNQV0xfTm90ZV9FZGl0KCkgb3ZlcnJpZGU7CiAKLQl2b2lkCQkJCQkJCQlFbmFibGVOb3RpZnkoRlhfQk9PTCBiRW5hYmxlKSB7bV9iRW5hYmxlTm90aWZ5ID0gYkVuYWJsZTt9Ci0JdmlydHVhbCBGWF9GTE9BVAkJCQkJR2V0SXRlbUhlaWdodChGWF9GTE9BVCBmTGltaXRXaWR0aCk7Ci0JRlhfRkxPQVQJCQkJCQkJR2V0SXRlbUxlZnRNYXJnaW4oKTsKLQlGWF9GTE9BVAkJCQkJCQlHZXRJdGVtUmlnaHRNYXJnaW4oKTsKKyAgdm9pZCBFbmFibGVOb3RpZnkoRlhfQk9PTCBiRW5hYmxlKSB7IG1fYkVuYWJsZU5vdGlmeSA9IGJFbmFibGU7IH0KIAotCXZpcnR1YWwgdm9pZAkJCQkJCVNldFRleHQoRlhfTFBDV1NUUiBjc1RleHQpOworICAvLyBDUFdMX0VkaXQKKyAgRlhfRkxPQVQgR2V0SXRlbUxlZnRNYXJnaW4oKSBvdmVycmlkZTsKKyAgRlhfRkxPQVQgR2V0SXRlbVJpZ2h0TWFyZ2luKCkgb3ZlcnJpZGU7CisgIEZYX0ZMT0FUIEdldEl0ZW1IZWlnaHQoRlhfRkxPQVQgZkxpbWl0V2lkdGgpIG92ZXJyaWRlOworICB2b2lkIFNldFRleHQoY29uc3QgRlhfV0NIQVIqIGNzVGV4dCkgb3ZlcnJpZGU7CisgIHZvaWQgT25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgbXNnLAorICAgICAgICAgICAgICAgIGludHB0cl90IHdQYXJhbSA9IDAsCisgICAgICAgICAgICAgICAgaW50cHRyX3QgbFBhcmFtID0gMCkgb3ZlcnJpZGU7CisgIHZvaWQgUmVQb3NDaGlsZFduZCgpIG92ZXJyaWRlOworICB2b2lkIE9uU2V0Rm9jdXMoKSBvdmVycmlkZTsKKyAgdm9pZCBPbktpbGxGb2N1cygpIG92ZXJyaWRlOwogCi1wcm90ZWN0ZWQ6Ci0JdmlydHVhbCB2b2lkCQkJCQkJT25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgRlhfSU5UUFRSIHdQYXJhbSA9IDAsIEZYX0lOVFBUUiBsUGFyYW0gPSAwKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlSZVBvc0NoaWxkV25kKCk7Ci0JdmlydHVhbCB2b2lkCQkJCQkJT25TZXRGb2N1cygpOwotCXZpcnR1YWwgdm9pZAkJCQkJCU9uS2lsbEZvY3VzKCk7CQotCi1wcml2YXRlOgotCUZYX0JPT0wJCQkJCQkJCW1fYkVuYWJsZU5vdGlmeTsKLQlGWF9GTE9BVAkJCQkJCQltX2ZPbGRJdGVtSGVpZ2h0OwotCUZYX0JPT0wJCQkJCQkJCW1fYlNpemVDaGFuZ2VkOwotCUZYX0ZMT0FUCQkJCQkJCW1fZk9sZE1pbjsKLQlGWF9GTE9BVAkJCQkJCQltX2ZPbGRNYXg7CisgcHJpdmF0ZToKKyAgRlhfQk9PTCBtX2JFbmFibGVOb3RpZnk7CisgIEZYX0ZMT0FUIG1fZk9sZEl0ZW1IZWlnaHQ7CisgIEZYX0JPT0wgbV9iU2l6ZUNoYW5nZWQ7CisgIEZYX0ZMT0FUIG1fZk9sZE1pbjsKKyAgRlhfRkxPQVQgbV9mT2xkTWF4OwogfTsKIAotY2xhc3MgQ1BXTF9Ob3RlX09wdGlvbnMgOiBwdWJsaWMgQ1BXTF9XbmQKLXsKLXB1YmxpYzoKLQlDUFdMX05vdGVfT3B0aW9ucygpOwotCXZpcnR1YWwgfkNQV0xfTm90ZV9PcHRpb25zKCk7CitjbGFzcyBDUFdMX05vdGVfT3B0aW9ucyA6IHB1YmxpYyBDUFdMX1duZCB7CisgcHVibGljOgorICBDUFdMX05vdGVfT3B0aW9ucygpOworICB+Q1BXTF9Ob3RlX09wdGlvbnMoKSBvdmVycmlkZTsKIAotCUNQREZfUmVjdAkJCQkJCQlHZXRDb250ZW50UmVjdCgpIGNvbnN0OwotCXZpcnR1YWwgdm9pZAkJCQkJCVNldFRleHRDb2xvcihjb25zdCBDUFdMX0NvbG9yICYgY29sb3IpOwotCXZvaWQJCQkJCQkJCVNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNUZXh0KTsKKyAgQ1BERl9SZWN0IEdldENvbnRlbnRSZWN0KCkgY29uc3Q7CisgIHZvaWQgU2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RleHQpOwogCi1wcm90ZWN0ZWQ6Ci0JdmlydHVhbCB2b2lkCQkJCQkJUmVQb3NDaGlsZFduZCgpOwotCXZpcnR1YWwgdm9pZAkJCQkJCUNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7CisgIC8vIENQV0xfV25kCisgIHZvaWQgUmVQb3NDaGlsZFduZCgpIG92ZXJyaWRlOworICB2b2lkIENyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApIG92ZXJyaWRlOworICB2b2lkIERyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UpIG92ZXJyaWRlOworICB2b2lkIFNldFRleHRDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikgb3ZlcnJpZGU7CiAKLXByaXZhdGU6Ci0JQ1BXTF9MYWJlbCoJCQkJCQkJbV9wVGV4dDsKKyBwcml2YXRlOgorICBDUFdMX0xhYmVsKiBtX3BUZXh0OwogfTsKIAotY2xhc3MgQ1BXTF9Ob3RlX0NvbnRlbnRzIDogcHVibGljIENQV0xfTGlzdEN0cmwKLXsKLXB1YmxpYzoKLQlDUFdMX05vdGVfQ29udGVudHMoKTsKLQl2aXJ0dWFsIH5DUFdMX05vdGVfQ29udGVudHMoKTsKK2NsYXNzIENQV0xfTm90ZV9Db250ZW50cyA6IHB1YmxpYyBDUFdMX0xpc3RDdHJsIHsKKyBwdWJsaWM6CisgIENQV0xfTm90ZV9Db250ZW50cygpOworICB+Q1BXTF9Ob3RlX0NvbnRlbnRzKCkgb3ZlcnJpZGU7CiAKLQl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQkJCUdldENsYXNzTmFtZSgpIGNvbnN0OwotCXZpcnR1YWwgdm9pZAkJCQkJCU9uTm90aWZ5KENQV0xfV25kKiBwV25kLCBGWF9EV09SRCBtc2csIEZYX0lOVFBUUiB3UGFyYW0gPSAwLCBGWF9JTlRQVFIgbFBhcmFtID0gMCk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworICB2b2lkIFNldEVkaXRGb2N1cyhGWF9CT09MIGJMYXN0KTsKKyAgQ1BXTF9FZGl0KiBHZXRFZGl0KCkgY29uc3Q7CiAKLQl2b2lkCQkJCQkJCQlTZXRFZGl0Rm9jdXMoRlhfQk9PTCBiTGFzdCk7Ci0JQ1BXTF9FZGl0KgkJCQkJCQlHZXRFZGl0KCkgY29uc3Q7CisgIHZvaWQgU2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RleHQpOworICBDRlhfV2lkZVN0cmluZyBHZXRUZXh0KCkgY29uc3Q7CiAKLXB1YmxpYzoKLQl2b2lkCQkJCQkJCQlTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGV4dCk7Ci0JQ0ZYX1dpZGVTdHJpbmcJCQkJCQlHZXRUZXh0KCkgY29uc3Q7CisgIENQV0xfTm90ZUl0ZW0qIENyZWF0ZVN1Ykl0ZW0oKTsKKyAgdm9pZCBEZWxldGVTdWJJdGVtKElQV0xfTm90ZUl0ZW0qIHBOb3RlSXRlbSk7CisgIGludDMyX3QgQ291bnRTdWJJdGVtcygpIGNvbnN0OworICBJUFdMX05vdGVJdGVtKiBHZXRTdWJJdGVtcyhpbnQzMl90IGluZGV4KSBjb25zdDsKIAotCUNQV0xfTm90ZUl0ZW0qCQkJCQkJQ3JlYXRlU3ViSXRlbSgpOwotCXZvaWQJCQkJCQkJCURlbGV0ZVN1Ykl0ZW0oSVBXTF9Ob3RlSXRlbSogcE5vdGVJdGVtKTsKLQlGWF9JTlQzMgkJCQkJCQlDb3VudFN1Ykl0ZW1zKCkgY29uc3Q7Ci0JSVBXTF9Ob3RlSXRlbSoJCQkJCQlHZXRTdWJJdGVtcyhGWF9JTlQzMiBpbmRleCkgY29uc3Q7CisgIHZpcnR1YWwgSVBXTF9Ob3RlSXRlbSogR2V0SGl0Tm90ZUl0ZW0oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICB2b2lkIEVuYWJsZVJlYWQoRlhfQk9PTCBiRW5hYmxlZCk7CisgIHZvaWQgRW5hYmxlTW9kaWZ5KEZYX0JPT0wgYkVuYWJsZWQpOwogCi0JdmlydHVhbCBJUFdMX05vdGVJdGVtKgkJCQlHZXRIaXROb3RlSXRlbShjb25zdCBDUERGX1BvaW50JiBwb2ludCk7Ci0Jdm9pZAkJCQkJCQkJRW5hYmxlUmVhZChGWF9CT09MIGJFbmFibGVkKTsKLQl2b2lkCQkJCQkJCQlFbmFibGVNb2RpZnkoRlhfQk9PTCBiRW5hYmxlZCk7CisgIC8vIENQV0xfTGlzdEN0cmwKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0Q2xhc3NOYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgT25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgbXNnLAorICAgICAgICAgICAgICAgIGludHB0cl90IHdQYXJhbSA9IDAsCisgICAgICAgICAgICAgICAgaW50cHRyX3QgbFBhcmFtID0gMCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIG92ZXJyaWRlOworICB2b2lkIENyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApIG92ZXJyaWRlOwogCi1wcm90ZWN0ZWQ6Ci0JdmlydHVhbCB2b2lkCQkJCQkJQ3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApOwotCi1wcml2YXRlOgotCUNQV0xfTm90ZV9FZGl0KgkJCQkJCW1fcEVkaXQ7CisgcHJpdmF0ZToKKyAgQ1BXTF9Ob3RlX0VkaXQqIG1fcEVkaXQ7CiB9OwogCi1jbGFzcyBQV0xfQ0xBU1MgQ1BXTF9Ob3RlSXRlbSA6IHB1YmxpYyBDUFdMX1duZCwgcHVibGljIElQV0xfTm90ZUl0ZW0gCi17Ci1wdWJsaWM6Ci0JQ1BXTF9Ob3RlSXRlbSgpOwotCXZpcnR1YWwgfkNQV0xfTm90ZUl0ZW0oKTsKK2NsYXNzIENQV0xfTm90ZUl0ZW0gOiBwdWJsaWMgQ1BXTF9XbmQsIHB1YmxpYyBJUFdMX05vdGVJdGVtIHsKKyBwdWJsaWM6CisgIENQV0xfTm90ZUl0ZW0oKTsKKyAgfkNQV0xfTm90ZUl0ZW0oKSBvdmVycmlkZTsKIAotcHVibGljOgotCXZpcnR1YWwgdm9pZAkJCQkJCVNldFByaXZhdGVEYXRhKHZvaWQqIHBEYXRhKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlTZXRCa0NvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlTZXRTdWJqZWN0TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc05hbWUpOwotCXZpcnR1YWwgdm9pZAkJCQkJCVNldEF1dGhvck5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNOYW1lKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlTZXREYXRlVGltZShGWF9TWVNURU1USU1FIHRpbWUpOwotCXZpcnR1YWwgdm9pZAkJCQkJCVNldENvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzQ29udGVudHMpOworICB2aXJ0dWFsIElQV0xfTm90ZUl0ZW0qIEdldEhpdE5vdGVJdGVtKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdmlydHVhbCBJUFdMX05vdGVJdGVtKiBHZXRGb2N1c2VkTm90ZUl0ZW0oKSBjb25zdDsKIAotCXZpcnR1YWwgSVBXTF9Ob3RlSXRlbSoJCQkJQ3JlYXRlU3ViSXRlbSgpOwotCXZpcnR1YWwgRlhfSU5UMzIJCQkJCUNvdW50U3ViSXRlbXMoKSBjb25zdDsKLQl2aXJ0dWFsIElQV0xfTm90ZUl0ZW0qCQkJCUdldFN1Ykl0ZW1zKEZYX0lOVDMyIGluZGV4KSBjb25zdDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlEZWxldGVTdWJJdGVtKElQV0xfTm90ZUl0ZW0qIHBOb3RlSXRlbSk7Ci0JdmlydHVhbCB2b2lkCQkJCQkJU2V0Rm9jdXMoKXtTZXROb3RlRm9jdXMoRkFMU0UpO30KKyAgdmlydHVhbCBGWF9CT09MIElzVG9wSXRlbSgpIGNvbnN0IHsgcmV0dXJuIEZBTFNFOyB9CiAKLQl2aXJ0dWFsIElQV0xfTm90ZUl0ZW0qCQkJCUdldFBhcmVudEl0ZW0oKSBjb25zdDsKLQl2aXJ0dWFsIHZvaWQqCQkJCQkJR2V0UHJpdmF0ZURhdGEoKSBjb25zdDsKLQl2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCQkJCUdldEF1dGhvck5hbWUoKSBjb25zdDsKLQl2aXJ0dWFsIENQV0xfQ29sb3IJCQkJCUdldEJrQ29sb3IoKSBjb25zdDsKLQl2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCQkJCUdldENvbnRlbnRzKCkgY29uc3Q7Ci0JdmlydHVhbCBGWF9TWVNURU1USU1FCQkJCUdldERhdGVUaW1lKCkgY29uc3Q7Ci0JdmlydHVhbCBDRlhfV2lkZVN0cmluZwkJCQlHZXRTdWJqZWN0TmFtZSgpIGNvbnN0OwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCUlzVG9wSXRlbSgpIGNvbnN0IHsgcmV0dXJuIEZBTFNFO30KLQl2aXJ0dWFsIENQV0xfRWRpdCoJCQkJCUdldEVkaXQoKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIFJlc2V0U3ViamVjdE5hbWUoaW50MzJfdCBuSXRlbUluZGV4KTsKKyAgdm9pZCBFbmFibGVSZWFkKEZYX0JPT0wgYkVuYWJsZWQpOworICB2b2lkIEVuYWJsZU1vZGlmeShGWF9CT09MIGJFbmFibGVkKTsKIAotcHVibGljOgotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCU9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQlPblJCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQkJCUdldENsYXNzTmFtZSgpIGNvbnN0OwotCXZpcnR1YWwgSVBXTF9Ob3RlSXRlbSoJCQkJR2V0SGl0Tm90ZUl0ZW0oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwotCXZpcnR1YWwgSVBXTF9Ob3RlSXRlbSoJCQkJR2V0Rm9jdXNlZE5vdGVJdGVtKCkgY29uc3Q7CisgIHZvaWQgT25Db250ZW50c1ZhbGlkYXRlKCk7CisgIHZvaWQgT25DcmVhdGVOb3RlSXRlbSgpOwogCi0JdmlydHVhbCB2b2lkCQkJCQkJUmVzZXRTdWJqZWN0TmFtZShGWF9JTlQzMiBuSXRlbUluZGV4KTsKLQl2b2lkCQkJCQkJCQlFbmFibGVSZWFkKEZYX0JPT0wgYkVuYWJsZWQpOwotCXZvaWQJCQkJCQkJCUVuYWJsZU1vZGlmeShGWF9CT09MIGJFbmFibGVkKTsKKyAgLy8gSVBXTF9Ob3RlSXRlbQorICB2b2lkIFNldFByaXZhdGVEYXRhKHZvaWQqIHBEYXRhKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRCa0NvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRTdWJqZWN0TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc05hbWUpIG92ZXJyaWRlOworICB2b2lkIFNldEF1dGhvck5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNOYW1lKSBvdmVycmlkZTsKKyAgdm9pZCBTZXREYXRlVGltZShGWF9TWVNURU1USU1FIHRpbWUpIG92ZXJyaWRlOworICB2b2lkIFNldENvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzQ29udGVudHMpIG92ZXJyaWRlOworICBJUFdMX05vdGVJdGVtKiBDcmVhdGVTdWJJdGVtKCkgb3ZlcnJpZGU7CisgIGludDMyX3QgQ291bnRTdWJJdGVtcygpIGNvbnN0IG92ZXJyaWRlOworICBJUFdMX05vdGVJdGVtKiBHZXRTdWJJdGVtcyhpbnQzMl90IGluZGV4KSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBEZWxldGVTdWJJdGVtKElQV0xfTm90ZUl0ZW0qIHBOb3RlSXRlbSkgb3ZlcnJpZGU7CisgIHZvaWQgU2V0Rm9jdXMoKSBvdmVycmlkZSB7IFNldE5vdGVGb2N1cyhGQUxTRSk7IH0KKyAgSVBXTF9Ob3RlSXRlbSogR2V0UGFyZW50SXRlbSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkKiBHZXRQcml2YXRlRGF0YSgpIGNvbnN0IG92ZXJyaWRlOworICBDRlhfV2lkZVN0cmluZyBHZXRBdXRob3JOYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIENQV0xfQ29sb3IgR2V0QmtDb2xvcigpIGNvbnN0IG92ZXJyaWRlOworICBDRlhfV2lkZVN0cmluZyBHZXRDb250ZW50cygpIGNvbnN0IG92ZXJyaWRlOworICBGWF9TWVNURU1USU1FIEdldERhdGVUaW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIENGWF9XaWRlU3RyaW5nIEdldFN1YmplY3ROYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIENQV0xfRWRpdCogR2V0RWRpdCgpIGNvbnN0IG92ZXJyaWRlOwogCi1wcm90ZWN0ZWQ6Ci0JdmlydHVhbCB2b2lkCQkJCQkJUmVQb3NDaGlsZFduZCgpOwotCXZpcnR1YWwgdm9pZAkJCQkJCUNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKKyBwcm90ZWN0ZWQ6CisgIC8vIENQV0xfV25kCisgIEZYX0JPT0wgT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIG92ZXJyaWRlOworICBGWF9CT09MIE9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgb3ZlcnJpZGU7CisgIENGWF9CeXRlU3RyaW5nIEdldENsYXNzTmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFJlUG9zQ2hpbGRXbmQoKSBvdmVycmlkZTsKKyAgdm9pZCBDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKSBvdmVycmlkZTsKKyAgdm9pZCBPbk5vdGlmeShDUFdMX1duZCogcFduZCwKKyAgICAgICAgICAgICAgICBGWF9EV09SRCBtc2csCisgICAgICAgICAgICAgICAgaW50cHRyX3Qgd1BhcmFtID0gMCwKKyAgICAgICAgICAgICAgICBpbnRwdHJfdCBsUGFyYW0gPSAwKSBvdmVycmlkZTsKKyAgRlhfRkxPQVQgR2V0SXRlbUhlaWdodChGWF9GTE9BVCBmTGltaXRXaWR0aCkgb3ZlcnJpZGU7CisgIEZYX0ZMT0FUIEdldEl0ZW1MZWZ0TWFyZ2luKCkgb3ZlcnJpZGU7CisgIEZYX0ZMT0FUIEdldEl0ZW1SaWdodE1hcmdpbigpIG92ZXJyaWRlOwogCi0JdmlydHVhbCB2b2lkCQkJCQkJT25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgRlhfSU5UUFRSIHdQYXJhbSA9IDAsIEZYX0lOVFBUUiBsUGFyYW0gPSAwKTsKKyAgQ1BXTF9Ob3RlSXRlbSogQ3JlYXRlTm90ZUl0ZW0oKTsKKyAgQ1BXTF9Ob3RlSXRlbSogR2V0UGFyZW50Tm90ZUl0ZW0oKSBjb25zdDsKIAotcHVibGljOgotCXZpcnR1YWwgRlhfRkxPQVQJCQkJCUdldEl0ZW1IZWlnaHQoRlhfRkxPQVQgZkxpbWl0V2lkdGgpOwotCXZpcnR1YWwgRlhfRkxPQVQJCQkJCUdldEl0ZW1MZWZ0TWFyZ2luKCk7Ci0JdmlydHVhbCBGWF9GTE9BVAkJCQkJR2V0SXRlbVJpZ2h0TWFyZ2luKCk7Ci0JQ1BXTF9Ob3RlSXRlbSoJCQkJCQlDcmVhdGVOb3RlSXRlbSgpOwotCUNQV0xfTm90ZUl0ZW0qCQkJCQkJR2V0UGFyZW50Tm90ZUl0ZW0oKSBjb25zdDsKKyAgdm9pZCBTZXROb3RlRm9jdXMoRlhfQk9PTCBiTGFzdCk7CisgIHZvaWQgUG9wdXBOb3RlSXRlbU1lbnUoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwogCi0Jdm9pZAkJCQkJCQkJU2V0Tm90ZUZvY3VzKEZYX0JPT0wgYkxhc3QpOwotCXZvaWQJCQkJCQkJCU9uQ29udGVudHNWYWxpZGF0ZSgpOwotCQotCXZvaWQJCQkJCQkJCU9uQ3JlYXRlTm90ZUl0ZW0oKTsKKyAgdmlydHVhbCBjb25zdCBDUFdMX05vdGUqIEdldE5vdGUoKSBjb25zdDsKKyAgdmlydHVhbCBJUFdMX05vdGVOb3RpZnkqIEdldE5vdGVOb3RpZnkoKSBjb25zdDsKIAotcHJvdGVjdGVkOgotCXZvaWQJCQkJCQkJCVBvcHVwTm90ZUl0ZW1NZW51KGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyBwcm90ZWN0ZWQ6CisgIENQV0xfTGFiZWwqIG1fcFN1YmplY3Q7CisgIENQV0xfTGFiZWwqIG1fcERhdGVUaW1lOworICBDUFdMX05vdGVfQ29udGVudHMqIG1fcENvbnRlbnRzOwogCi0JdmlydHVhbCBjb25zdCBDUFdMX05vdGUqCQkJR2V0Tm90ZSgpIGNvbnN0OwotCXZpcnR1YWwgSVBXTF9Ob3RlTm90aWZ5KgkJCUdldE5vdGVOb3RpZnkoKSBjb25zdDsKKyBwcml2YXRlOgorICB2b2lkKiBtX3BQcml2YXRlRGF0YTsKKyAgRlhfU1lTVEVNVElNRSBtX2R0Tm90ZTsKKyAgQ0ZYX1dpZGVTdHJpbmcgbV9zQXV0aG9yOwogCi1wcm90ZWN0ZWQ6Ci0JQ1BXTF9MYWJlbCoJCQkJCQkJbV9wU3ViamVjdDsKLQlDUFdMX0xhYmVsKgkJCQkJCQltX3BEYXRlVGltZTsKLQlDUFdMX05vdGVfQ29udGVudHMqCQkJCQltX3BDb250ZW50czsKLQotcHJpdmF0ZToKLQl2b2lkKgkJCQkJCQkJbV9wUHJpdmF0ZURhdGE7Ci0JRlhfU1lTVEVNVElNRQkJCQkJCW1fZHROb3RlOwotCUNGWF9XaWRlU3RyaW5nCQkJCQkJbV9zQXV0aG9yOwotCi0JRlhfRkxPQVQJCQkJCQkJbV9mT2xkSXRlbUhlaWdodDsKLQlGWF9CT09MCQkJCQkJCQltX2JTaXplQ2hhbmdlZDsKLQlGWF9CT09MCQkJCQkJCQltX2JBbGxvd01vZGlmeTsKKyAgRlhfRkxPQVQgbV9mT2xkSXRlbUhlaWdodDsKKyAgRlhfQk9PTCBtX2JTaXplQ2hhbmdlZDsKKyAgRlhfQk9PTCBtX2JBbGxvd01vZGlmeTsKIH07CiAKLWNsYXNzIFBXTF9DTEFTUyBDUFdMX05vdGUgOiBwdWJsaWMgQ1BXTF9Ob3RlSXRlbQotewotcHVibGljOgotCUNQV0xfTm90ZShJUG9wdXBfTm90ZSogcFBvcHVwTm90ZSwgSVBXTF9Ob3RlTm90aWZ5KiBwTm90ZU5vdGlmeSwgSVBXTF9Ob3RlSGFuZGxlciogcE5vdGVIYW5kbGVyKTsKLQl2aXJ0dWFsIH5DUFdMX05vdGUoKTsKK2NsYXNzIENQV0xfTm90ZSA6IHB1YmxpYyBDUFdMX05vdGVJdGVtIHsKKyBwdWJsaWM6CisgIENQV0xfTm90ZShJUG9wdXBfTm90ZSogcFBvcHVwTm90ZSwKKyAgICAgICAgICAgIElQV0xfTm90ZU5vdGlmeSogcE5vdGVOb3RpZnksCisgICAgICAgICAgICBJUFdMX05vdGVIYW5kbGVyKiBwTm90ZUhhbmRsZXIpOworICB+Q1BXTF9Ob3RlKCkgb3ZlcnJpZGU7CiAKLXB1YmxpYzoKLQl2aXJ0dWFsIHZvaWQJCQkJCQlTZXRTdWJqZWN0TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc05hbWUpOwotCXZpcnR1YWwgdm9pZAkJCQkJCVNldEF1dGhvck5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNOYW1lKTsKLQl2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCQkJCUdldEF1dGhvck5hbWUoKSBjb25zdDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlTZXRCa0NvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCQlSZXNldFN1YmplY3ROYW1lKEZYX0lOVDMyIG5JdGVtSW5kZXgpe30KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQlJc1RvcEl0ZW0oKSBjb25zdCB7cmV0dXJuIFRSVUU7fQotCXZpcnR1YWwgY29uc3QgQ1BXTF9Ob3RlKgkJCUdldE5vdGUoKSBjb25zdDsKLQl2aXJ0dWFsIElQV0xfTm90ZU5vdGlmeSoJCQlHZXROb3RlTm90aWZ5KCkgY29uc3Q7CisgIElQV0xfTm90ZUl0ZW0qIFJlcGx5KCk7CisgIHZvaWQgRW5hYmxlTm90aWZ5KEZYX0JPT0wgYkVuYWJsZWQpOworICB2b2lkIFNldEljb25UeXBlKGludDMyX3QgblR5cGUpOworICB2b2lkIFNldE9wdGlvbnNUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGV4dCk7CisgIHZvaWQgRW5hYmxlUmVhZChGWF9CT09MIGJFbmFibGVkKTsKKyAgdm9pZCBFbmFibGVNb2RpZnkoRlhfQk9PTCBiRW5hYmxlZCk7CiAKLXB1YmxpYzoKLQlJUFdMX05vdGVJdGVtKgkJCQkJCVJlcGx5KCk7Ci0Jdm9pZAkJCQkJCQkJRW5hYmxlTm90aWZ5KEZYX0JPT0wgYkVuYWJsZWQpOwotCXZvaWQJCQkJCQkJCVNldEljb25UeXBlKEZYX0lOVDMyIG5UeXBlKTsKLQl2b2lkCQkJCQkJCQlTZXRPcHRpb25zVGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RleHQpOwotCXZvaWQJCQkJCQkJCUVuYWJsZVJlYWQoRlhfQk9PTCBiRW5hYmxlZCk7Ci0Jdm9pZAkJCQkJCQkJRW5hYmxlTW9kaWZ5KEZYX0JPT0wgYkVuYWJsZWQpOworICBDRlhfV2lkZVN0cmluZyBHZXRSZXBseVN0cmluZygpIGNvbnN0OworICB2b2lkIFNldFJlcGx5U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcpOwogCi0JQ0ZYX1dpZGVTdHJpbmcJCQkJCQlHZXRSZXBseVN0cmluZygpIGNvbnN0OwotCXZvaWQJCQkJCQkJCVNldFJlcGx5U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcpOworICAvLyBDUFdMX05vdGVJdGVtCisgIHZvaWQgU2V0U3ViamVjdE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNOYW1lKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRBdXRob3JOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzTmFtZSkgb3ZlcnJpZGU7CisgIENGWF9XaWRlU3RyaW5nIEdldEF1dGhvck5hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXRCa0NvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKSBvdmVycmlkZTsKKyAgdm9pZCBSZXNldFN1YmplY3ROYW1lKGludDMyX3Qgbkl0ZW1JbmRleCkgb3ZlcnJpZGUge30KKyAgRlhfQk9PTCBJc1RvcEl0ZW0oKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBUUlVFOyB9CisgIGNvbnN0IENQV0xfTm90ZSogR2V0Tm90ZSgpIGNvbnN0IG92ZXJyaWRlOworICBJUFdMX05vdGVOb3RpZnkqIEdldE5vdGVOb3RpZnkoKSBjb25zdCBvdmVycmlkZTsKKyAgRlhfQk9PTCBPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgb3ZlcnJpZGU7CisgIEZYX0JPT0wgT25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIG92ZXJyaWRlOworICB2b2lkIFJlUG9zQ2hpbGRXbmQoKSBvdmVycmlkZTsKKyAgdm9pZCBDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKSBvdmVycmlkZTsKKyAgdm9pZCBPbk5vdGlmeShDUFdMX1duZCogcFduZCwKKyAgICAgICAgICAgICAgICBGWF9EV09SRCBtc2csCisgICAgICAgICAgICAgICAgaW50cHRyX3Qgd1BhcmFtID0gMCwKKyAgICAgICAgICAgICAgICBpbnRwdHJfdCBsUGFyYW0gPSAwKSBvdmVycmlkZTsKIAotCS8vMC1ub3JtYWwgLyAxLWNhcHRpb24gLyAyLWxlZnRib3R0b20gY29ybmVyIC8gMy1yaWdodGJvdHRvbSBjb3JuZXIgLyA0LWNsb3NlIC8gNS1vcHRpb25zIAotCUZYX0lOVDMyCQkJCQkJCU5vdGVIaXRUZXN0KGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdDsKLQlDUERGX1JlY3QJCQkJCQkJR2V0Q2FwdGlvblJlY3QoKSBjb25zdCB7cmV0dXJuIG1fcmNDYXB0aW9uO30KLQlJUG9wdXBfTm90ZSoJCQkJCQlHZXRQb3B1cE5vdGUoKSBjb25zdCB7cmV0dXJuIG1fcFBvcHVwTm90ZTt9CisgcHJvdGVjdGVkOgorICBGWF9CT09MIFJlc2V0U2Nyb2xsQmFyKCk7CisgIHZvaWQgUmVQb3NOb3RlQ2hpbGRyZW4oKTsKKyAgRlhfQk9PTCBTY3JvbGxCYXJTaG91bGRWaXNpYmxlKCk7CiAKLXB1YmxpYzoKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCQlPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCU9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCU9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCi1wcm90ZWN0ZWQ6Ci0JdmlydHVhbCB2b2lkCQkJCQkJUmVQb3NDaGlsZFduZCgpOwotCXZpcnR1YWwgdm9pZAkJCQkJCUNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKLQotCXZpcnR1YWwgdm9pZAkJCQkJCU9uTm90aWZ5KENQV0xfV25kKiBwV25kLCBGWF9EV09SRCBtc2csIEZYX0lOVFBUUiB3UGFyYW0gPSAwLCBGWF9JTlRQVFIgbFBhcmFtID0gMCk7Ci0KLQlGWF9CT09MCQkJCQkJCQlSZXNldFNjcm9sbEJhcigpOwotCXZvaWQJCQkJCQkJCVJlUG9zTm90ZUNoaWxkcmVuKCk7Ci0JRlhfQk9PTAkJCQkJCQkJU2Nyb2xsQmFyU2hvdWxkVmlzaWJsZSgpOwotCi1wcml2YXRlOgotCUNQV0xfTGFiZWwqCQkJCQkJCW1fcEF1dGhvcjsKLQlDUFdMX05vdGVfSWNvbioJCQkJCQltX3BJY29uOwotCUNQV0xfTm90ZV9DbG9zZUJveCoJCQkJCW1fcENsb3NlQm94OwotCUNQV0xfTm90ZV9MQkJveCoJCQkJCW1fcExCQm94OwotCUNQV0xfTm90ZV9SQkJveCoJCQkJCW1fcFJCQm94OwotCUNQV0xfU2Nyb2xsQmFyKgkJCQkJCW1fcENvbnRlbnRzQmFyOwkKLQlDUFdMX05vdGVfT3B0aW9ucyoJCQkJCW1fcE9wdGlvbnM7Ci0JSVBXTF9Ob3RlTm90aWZ5KgkJCQkJbV9wTm90ZU5vdGlmeTsKLQlGWF9CT09MCQkJCQkJCQltX2JSZXNpemluZzsKLQlQV0xfU0NST0xMX0lORk8JCQkJCQltX09sZFNjcm9sbEluZm87Ci0JQ1BERl9SZWN0CQkJCQkJCW1fcmNDYXB0aW9uOwotCUZYX0JPT0wJCQkJCQkJCW1fYkVuYWxibGVOb3RpZnk7Ci0JSVBvcHVwX05vdGUqCQkJCQkJbV9wUG9wdXBOb3RlOwotCUNGWF9XaWRlU3RyaW5nCQkJCQkJbV9zUmVwbHlTdHJpbmc7CisgcHJpdmF0ZToKKyAgQ1BXTF9MYWJlbCogbV9wQXV0aG9yOworICBDUFdMX05vdGVfSWNvbiogbV9wSWNvbjsKKyAgQ1BXTF9Ob3RlX0Nsb3NlQm94KiBtX3BDbG9zZUJveDsKKyAgQ1BXTF9Ob3RlX0xCQm94KiBtX3BMQkJveDsKKyAgQ1BXTF9Ob3RlX1JCQm94KiBtX3BSQkJveDsKKyAgQ1BXTF9TY3JvbGxCYXIqIG1fcENvbnRlbnRzQmFyOworICBDUFdMX05vdGVfT3B0aW9ucyogbV9wT3B0aW9uczsKKyAgSVBXTF9Ob3RlTm90aWZ5KiBtX3BOb3RlTm90aWZ5OworICBGWF9CT09MIG1fYlJlc2l6aW5nOworICBQV0xfU0NST0xMX0lORk8gbV9PbGRTY3JvbGxJbmZvOworICBGWF9CT09MIG1fYkVuYWJsZU5vdGlmeTsKKyAgQ0ZYX1dpZGVTdHJpbmcgbV9zUmVwbHlTdHJpbmc7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9QREZXSU5ET1dfUFdMX05PVEVfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1Njcm9sbEJhci5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU2Nyb2xsQmFyLmgKaW5kZXggMmYwNDczZi4uODkxMDc5ZSAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU2Nyb2xsQmFyLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU2Nyb2xsQmFyLmgKQEAgLTEsNyArMSw3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgRlBERlNES19JTkNMVURFX1BERldJTkRPV19QV0xfU0NST0xMQkFSX0hfCkBAIC0xMiwxNTUgKzEyLDE0NiBAQAogY2xhc3MgQ1BXTF9TQkJ1dHRvbjsKIGNsYXNzIENQV0xfU2Nyb2xsQmFyOwogCi1zdHJ1Y3QgUFdMX1NDUk9MTF9JTkZPCi17Ci1wdWJsaWM6Ci0JUFdMX1NDUk9MTF9JTkZPKCkgOiBmQ29udGVudE1pbigwLjBmKSwgZkNvbnRlbnRNYXgoMC4wZiksIGZQbGF0ZVdpZHRoKDAuMGYpLCBmQmlnU3RlcCgwLjBmKSwgZlNtYWxsU3RlcCgwLjBmKQotCXsKLQl9Ci0JRlhfRkxPQVQJCQkJCWZDb250ZW50TWluOwotCUZYX0ZMT0FUCQkJCQlmQ29udGVudE1heDsJCi0JRlhfRkxPQVQJCQkJCWZQbGF0ZVdpZHRoOwkKLQlGWF9GTE9BVAkJCQkJZkJpZ1N0ZXA7Ci0JRlhfRkxPQVQJCQkJCWZTbWFsbFN0ZXA7CitzdHJ1Y3QgUFdMX1NDUk9MTF9JTkZPIHsKKyBwdWJsaWM6CisgIFBXTF9TQ1JPTExfSU5GTygpCisgICAgICA6IGZDb250ZW50TWluKDAuMGYpLAorICAgICAgICBmQ29udGVudE1heCgwLjBmKSwKKyAgICAgICAgZlBsYXRlV2lkdGgoMC4wZiksCisgICAgICAgIGZCaWdTdGVwKDAuMGYpLAorICAgICAgICBmU21hbGxTdGVwKDAuMGYpIHt9CisgIEZYX0ZMT0FUIGZDb250ZW50TWluOworICBGWF9GTE9BVCBmQ29udGVudE1heDsKKyAgRlhfRkxPQVQgZlBsYXRlV2lkdGg7CisgIEZYX0ZMT0FUIGZCaWdTdGVwOworICBGWF9GTE9BVCBmU21hbGxTdGVwOwogfTsKIAotZW51bSBQV0xfU0NST0xMQkFSX1RZUEUKLXsKLQlTQlRfSFNDUk9MTCwKLQlTQlRfVlNDUk9MTAorZW51bSBQV0xfU0NST0xMQkFSX1RZUEUgeyBTQlRfSFNDUk9MTCwgU0JUX1ZTQ1JPTEwgfTsKKworZW51bSBQV0xfU0JCVVRUT05fVFlQRSB7IFBTQlRfTUlOLCBQU0JUX01BWCwgUFNCVF9QT1MgfTsKKworY2xhc3MgQ1BXTF9TQkJ1dHRvbiA6IHB1YmxpYyBDUFdMX1duZCB7CisgcHVibGljOgorICBDUFdMX1NCQnV0dG9uKFBXTF9TQ1JPTExCQVJfVFlQRSBlU2Nyb2xsQmFyVHlwZSwKKyAgICAgICAgICAgICAgICBQV0xfU0JCVVRUT05fVFlQRSBlQnV0dG9uVHlwZSk7CisgIH5DUFdMX1NCQnV0dG9uKCkgb3ZlcnJpZGU7CisKKyAgLy8gQ1BXTF9XbmQKKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0Q2xhc3NOYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgT25DcmVhdGUoUFdMX0NSRUFURVBBUkFNJiBjcCkgb3ZlcnJpZGU7CisgIHZvaWQgR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmJiBzQXBwU3RyZWFtKSBvdmVycmlkZTsKKyAgdm9pZCBEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgb3ZlcnJpZGU7CisgIEZYX0JPT0wgT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIG92ZXJyaWRlOworCisgcHJvdGVjdGVkOgorICBQV0xfU0NST0xMQkFSX1RZUEUgbV9lU2Nyb2xsQmFyVHlwZTsKKyAgUFdMX1NCQlVUVE9OX1RZUEUgbV9lU0JCdXR0b25UeXBlOworCisgIEZYX0JPT0wgbV9iTW91c2VEb3duOwogfTsKIAotZW51bSBQV0xfU0JCVVRUT05fVFlQRQotewotCVBTQlRfTUlOLAotCVBTQlRfTUFYLAotCVBTQlRfUE9TCitzdHJ1Y3QgUFdMX0ZMT0FUUkFOR0UgeworIHB1YmxpYzoKKyAgUFdMX0ZMT0FUUkFOR0UoKTsKKyAgUFdMX0ZMT0FUUkFOR0UoRlhfRkxPQVQgbWluLCBGWF9GTE9BVCBtYXgpOworICB2b2lkIERlZmF1bHQoKTsKKyAgdm9pZCBTZXQoRlhfRkxPQVQgbWluLCBGWF9GTE9BVCBtYXgpOworICBGWF9CT09MIEluKEZYX0ZMT0FUIHgpIGNvbnN0OworICBGWF9GTE9BVCBHZXRXaWR0aCgpIGNvbnN0OworCisgIEZYX0ZMT0FUIGZNaW4sIGZNYXg7CiB9OwogCi1jbGFzcyBDUFdMX1NCQnV0dG9uIDogcHVibGljIENQV0xfV25kICAKLXsKLXB1YmxpYzoKLQlDUFdMX1NCQnV0dG9uKFBXTF9TQ1JPTExCQVJfVFlQRSBlU2Nyb2xsQmFyVHlwZSxQV0xfU0JCVVRUT05fVFlQRSBlQnV0dG9uVHlwZSk7Ci0JdmlydHVhbCB+Q1BXTF9TQkJ1dHRvbigpOworc3RydWN0IFBXTF9TQ1JPTExfUFJJVkFURURBVEEgeworIHB1YmxpYzoKKyAgUFdMX1NDUk9MTF9QUklWQVRFREFUQSgpOwogCi1wdWJsaWM6Ci0JdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0Q2xhc3NOYW1lKCkgY29uc3Q7Ci0JdmlydHVhbCB2b2lkCQkJCU9uQ3JlYXRlKFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKLQl2aXJ0dWFsIHZvaWQJCQkJR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSk7Ci0JdmlydHVhbCB2b2lkCQkJCURyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworICB2b2lkIERlZmF1bHQoKTsKKyAgdm9pZCBTZXRTY3JvbGxSYW5nZShGWF9GTE9BVCBtaW4sIEZYX0ZMT0FUIG1heCk7CisgIHZvaWQgU2V0Q2xpZW50V2lkdGgoRlhfRkxPQVQgd2lkdGgpOworICB2b2lkIFNldFNtYWxsU3RlcChGWF9GTE9BVCBzdGVwKTsKKyAgdm9pZCBTZXRCaWdTdGVwKEZYX0ZMT0FUIHN0ZXApOworICBGWF9CT09MIFNldFBvcyhGWF9GTE9BVCBwb3MpOwogCi1wcm90ZWN0ZWQ6Ci0JUFdMX1NDUk9MTEJBUl9UWVBFCQkJbV9lU2Nyb2xsQmFyVHlwZTsKLQlQV0xfU0JCVVRUT05fVFlQRQkJCW1fZVNCQnV0dG9uVHlwZTsKKyAgdm9pZCBBZGRTbWFsbCgpOworICB2b2lkIFN1YlNtYWxsKCk7CisgIHZvaWQgQWRkQmlnKCk7CisgIHZvaWQgU3ViQmlnKCk7CiAKLQlGWF9CT09MCQkJCQkJbV9iTW91c2VEb3duOworICBQV0xfRkxPQVRSQU5HRSBTY3JvbGxSYW5nZTsKKyAgRlhfRkxPQVQgZkNsaWVudFdpZHRoOworICBGWF9GTE9BVCBmU2Nyb2xsUG9zOworICBGWF9GTE9BVCBmQmlnU3RlcDsKKyAgRlhfRkxPQVQgZlNtYWxsU3RlcDsKIH07CiAKLXN0cnVjdCBQV0xfRkxPQVRSQU5HRQotewotcHVibGljOgotCVBXTF9GTE9BVFJBTkdFKCk7Ci0JUFdMX0ZMT0FUUkFOR0UoRlhfRkxPQVQgbWluLEZYX0ZMT0FUIG1heCk7Ci0Jdm9pZCBEZWZhdWx0KCk7Ci0Jdm9pZCBTZXQoRlhfRkxPQVQgbWluLEZYX0ZMT0FUIG1heCk7Ci0JRlhfQk9PTAlJbihGWF9GTE9BVCB4KSBjb25zdDsKLQlGWF9GTE9BVCBHZXRXaWR0aCgpIGNvbnN0OworY2xhc3MgQ1BXTF9TY3JvbGxCYXIgOiBwdWJsaWMgQ1BXTF9XbmQgeworIHB1YmxpYzoKKyAgQ1BXTF9TY3JvbGxCYXIoUFdMX1NDUk9MTEJBUl9UWVBFIHNiVHlwZSA9IFNCVF9IU0NST0xMKTsKKyAgfkNQV0xfU2Nyb2xsQmFyKCkgb3ZlcnJpZGU7CiAKLQlGWF9GTE9BVCBmTWluLGZNYXg7Ci19OworICAvLyBDUFdMX1duZAorICBDRlhfQnl0ZVN0cmluZyBHZXRDbGFzc05hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBPbkNyZWF0ZShQV0xfQ1JFQVRFUEFSQU0mIGNwKSBvdmVycmlkZTsKKyAgdm9pZCBSZVBvc0NoaWxkV25kKCkgb3ZlcnJpZGU7CisgIHZvaWQgR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmJiBzQXBwU3RyZWFtKSBvdmVycmlkZTsKKyAgdm9pZCBEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgb3ZlcnJpZGU7CisgIEZYX0JPT0wgT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSBvdmVycmlkZTsKKyAgdm9pZCBPbk5vdGlmeShDUFdMX1duZCogcFduZCwKKyAgICAgICAgICAgICAgICBGWF9EV09SRCBtc2csCisgICAgICAgICAgICAgICAgaW50cHRyX3Qgd1BhcmFtID0gMCwKKyAgICAgICAgICAgICAgICBpbnRwdHJfdCBsUGFyYW0gPSAwKSBvdmVycmlkZTsKKyAgdm9pZCBDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKSBvdmVycmlkZTsKKyAgdm9pZCBUaW1lclByb2MoKSBvdmVycmlkZTsKIAotc3RydWN0IFBXTF9TQ1JPTExfUFJJVkFURURBVEEKLXsKLXB1YmxpYzoKLQlQV0xfU0NST0xMX1BSSVZBVEVEQVRBKCk7CisgIEZYX0ZMT0FUIEdldFNjcm9sbEJhcldpZHRoKCkgY29uc3Q7CisgIFBXTF9TQ1JPTExCQVJfVFlQRSBHZXRTY3JvbGxCYXJUeXBlKCkgY29uc3QgeyByZXR1cm4gbV9zYlR5cGU7IH0KIAotCXZvaWQgRGVmYXVsdCgpOwotCXZvaWQgU2V0U2Nyb2xsUmFuZ2UoRlhfRkxPQVQgbWluLEZYX0ZMT0FUIG1heCk7Ci0Jdm9pZCBTZXRDbGllbnRXaWR0aChGWF9GTE9BVCB3aWR0aCk7Ci0Jdm9pZCBTZXRTbWFsbFN0ZXAoRlhfRkxPQVQgc3RlcCk7Ci0Jdm9pZCBTZXRCaWdTdGVwKEZYX0ZMT0FUIHN0ZXApOwotCUZYX0JPT0wgU2V0UG9zKEZYX0ZMT0FUIHBvcyk7CisgIHZvaWQgU2V0Tm90aWZ5Rm9yZXZlcihGWF9CT09MIGJGb3JldmVyKSB7IG1fYk5vdGlmeUZvcmV2ZXIgPSBiRm9yZXZlcjsgfQogCi0Jdm9pZCBBZGRTbWFsbCgpOwotCXZvaWQgU3ViU21hbGwoKTsKLQl2b2lkIEFkZEJpZygpOwotCXZvaWQgU3ViQmlnKCk7CisgcHJvdGVjdGVkOgorICB2b2lkIFNldFNjcm9sbFJhbmdlKEZYX0ZMT0FUIGZNaW4sIEZYX0ZMT0FUIGZNYXgsIEZYX0ZMT0FUIGZDbGllbnRXaWR0aCk7CisgIHZvaWQgU2V0U2Nyb2xsUG9zKEZYX0ZMT0FUIGZQb3MpOworICB2b2lkIE1vdmVQb3NCdXR0b24oRlhfQk9PTCBiUmVmcmVzaCk7CisgIHZvaWQgU2V0U2Nyb2xsU3RlcChGWF9GTE9BVCBmQmlnU3RlcCwgRlhfRkxPQVQgZlNtYWxsU3RlcCk7CisgIHZvaWQgTm90aWZ5U2Nyb2xsV2luZG93KCk7CisgIENQREZfUmVjdCBHZXRTY3JvbGxBcmVhKCkgY29uc3Q7CiAKLQlQV0xfRkxPQVRSQU5HRQkJCQlTY3JvbGxSYW5nZTsKLQlGWF9GTE9BVAkJCQkJZkNsaWVudFdpZHRoOwotCUZYX0ZMT0FUCQkJCQlmU2Nyb2xsUG9zOwotCUZYX0ZMT0FUCQkJCQlmQmlnU3RlcDsKLQlGWF9GTE9BVAkJCQkJZlNtYWxsU3RlcDsKLX07CisgcHJpdmF0ZToKKyAgdm9pZCBDcmVhdGVCdXR0b25zKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApOwogCi1jbGFzcyBDUFdMX1Njcm9sbEJhciA6IHB1YmxpYyBDUFdMX1duZCAgCi17Ci1wdWJsaWM6Ci0JQ1BXTF9TY3JvbGxCYXIoUFdMX1NDUk9MTEJBUl9UWVBFIHNiVHlwZSA9IFNCVF9IU0NST0xMKTsKLQl2aXJ0dWFsIH5DUFdMX1Njcm9sbEJhcigpOworICB2b2lkIE9uTWluQnV0dG9uTEJEb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdm9pZCBPbk1pbkJ1dHRvbkxCVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICB2b2lkIE9uTWluQnV0dG9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKIAotcHVibGljOgotCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldENsYXNzTmFtZSgpIGNvbnN0OwotCXZpcnR1YWwgdm9pZAkJCQlPbkNyZWF0ZShQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7Ci0JdmlydHVhbCB2b2lkCQkJCVJlUG9zQ2hpbGRXbmQoKTsKLQl2aXJ0dWFsIHZvaWQJCQkJR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSk7Ci0JdmlydHVhbCB2b2lkCQkJCURyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKKyAgdm9pZCBPbk1heEJ1dHRvbkxCRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZvaWQgT25NYXhCdXR0b25MQlVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KTsKKyAgdm9pZCBPbk1heEJ1dHRvbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCB2b2lkCQkJCU9uTm90aWZ5KENQV0xfV25kKiBwV25kLCBGWF9EV09SRCBtc2csIEZYX0lOVFBUUiB3UGFyYW0gPSAwLCBGWF9JTlRQVFIgbFBhcmFtID0gMCk7CisgIHZvaWQgT25Qb3NCdXR0b25MQkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOworICB2b2lkIE9uUG9zQnV0dG9uTEJVcChjb25zdCBDUERGX1BvaW50JiBwb2ludCk7CisgIHZvaWQgT25Qb3NCdXR0b25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpOwogCi0JdmlydHVhbCB2b2lkCQkJCUNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKLQkKLQlGWF9GTE9BVAkJCQkJR2V0U2Nyb2xsQmFyV2lkdGgoKSBjb25zdDsJCi0JUFdMX1NDUk9MTEJBUl9UWVBFCQkJR2V0U2Nyb2xsQmFyVHlwZSgpIGNvbnN0IHtyZXR1cm4gbV9zYlR5cGU7fTsKKyAgRlhfRkxPQVQgVHJ1ZVRvRmFjZShGWF9GTE9BVCk7CisgIEZYX0ZMT0FUIEZhY2VUb1RydWUoRlhfRkxPQVQpOwogCi0Jdm9pZAkJCQkJCVNldE5vdGlmeUZvcmV2ZXIoRlhfQk9PTCBiRm9yZXZlcikge21fYk5vdGlmeUZvcmV2ZXIgPSBiRm9yZXZlcjt9Ci0KLXByb3RlY3RlZDoJCQkKLQl2b2lkCQkJCQkJU2V0U2Nyb2xsUmFuZ2UoRlhfRkxPQVQgZk1pbixGWF9GTE9BVCBmTWF4LEZYX0ZMT0FUIGZDbGllbnRXaWR0aCk7Ci0Jdm9pZAkJCQkJCVNldFNjcm9sbFBvcyhGWF9GTE9BVCBmUG9zKTsKLQl2b2lkCQkJCQkJTW92ZVBvc0J1dHRvbihGWF9CT09MIGJSZWZyZXNoKTsKLQl2b2lkCQkJCQkJU2V0U2Nyb2xsU3RlcChGWF9GTE9BVCBmQmlnU3RlcCxGWF9GTE9BVCBmU21hbGxTdGVwKTsKLQl2b2lkCQkJCQkJTm90aWZ5U2Nyb2xsV2luZG93KCk7Ci0JQ1BERl9SZWN0CQkJCQlHZXRTY3JvbGxBcmVhKCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0Jdm9pZAkJCQkJCUNyZWF0ZUJ1dHRvbnMoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApOwotCi0Jdm9pZAkJCQkJCU9uTWluQnV0dG9uTEJEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCk7Ci0Jdm9pZAkJCQkJCU9uTWluQnV0dG9uTEJVcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpOwotCXZvaWQJCQkJCQlPbk1pbkJ1dHRvbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpOwotCi0Jdm9pZAkJCQkJCU9uTWF4QnV0dG9uTEJEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCk7Ci0Jdm9pZAkJCQkJCU9uTWF4QnV0dG9uTEJVcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpOwotCXZvaWQJCQkJCQlPbk1heEJ1dHRvbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpOwotCi0Jdm9pZAkJCQkJCU9uUG9zQnV0dG9uTEJEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCk7Ci0Jdm9pZAkJCQkJCU9uUG9zQnV0dG9uTEJVcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpOwotCXZvaWQJCQkJCQlPblBvc0J1dHRvbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpOwotCi0JRlhfRkxPQVQJCQkJCVRydWVUb0ZhY2UoRlhfRkxPQVQpOwotCUZYX0ZMT0FUCQkJCQlGYWNlVG9UcnVlKEZYX0ZMT0FUKTsKLQotCXZpcnR1YWwJdm9pZAkJCQlUaW1lclByb2MoKTsKLQotcHJpdmF0ZToKLQlQV0xfU0NST0xMQkFSX1RZUEUJCQltX3NiVHlwZTsKLQlQV0xfU0NST0xMX0lORk8JCQkJbV9PcmlnaW5JbmZvOwotCUNQV0xfU0JCdXR0b24qCQkJCW1fcE1pbkJ1dHRvbjsKLQlDUFdMX1NCQnV0dG9uKgkJCQltX3BNYXhCdXR0b247Ci0JQ1BXTF9TQkJ1dHRvbioJCQkJbV9wUG9zQnV0dG9uOwotCVBXTF9TQ1JPTExfUFJJVkFURURBVEEJCW1fc0RhdGE7Ci0JRlhfQk9PTAkJCQkJCW1fYk1vdXNlRG93bjsJCi0JRlhfQk9PTAkJCQkJCW1fYk1pbk9yTWF4OwotCUZYX0JPT0wJCQkJCQltX2JOb3RpZnlGb3JldmVyOwotCUZYX0ZMT0FUCQkJCQltX25PbGRQb3M7Ci0JRlhfRkxPQVQJCQkJCW1fZk9sZFBvc0J1dHRvbjsKKyAgUFdMX1NDUk9MTEJBUl9UWVBFIG1fc2JUeXBlOworICBQV0xfU0NST0xMX0lORk8gbV9PcmlnaW5JbmZvOworICBDUFdMX1NCQnV0dG9uKiBtX3BNaW5CdXR0b247CisgIENQV0xfU0JCdXR0b24qIG1fcE1heEJ1dHRvbjsKKyAgQ1BXTF9TQkJ1dHRvbiogbV9wUG9zQnV0dG9uOworICBQV0xfU0NST0xMX1BSSVZBVEVEQVRBIG1fc0RhdGE7CisgIEZYX0JPT0wgbV9iTW91c2VEb3duOworICBGWF9CT09MIG1fYk1pbk9yTWF4OworICBGWF9CT09MIG1fYk5vdGlmeUZvcmV2ZXI7CisgIEZYX0ZMT0FUIG1fbk9sZFBvczsKKyAgRlhfRkxPQVQgbV9mT2xkUG9zQnV0dG9uOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9TQ1JPTExCQVJfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1NpZ25hdHVyZS5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU2lnbmF0dXJlLmgKaW5kZXggYmRjMTQwNi4uMGRiZDkwNiAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU2lnbmF0dXJlLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU2lnbmF0dXJlLmgKQEAgLTEsNyArMSw3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgRlBERlNES19JTkNMVURFX1BERldJTkRPV19QV0xfU0lHTkFUVVJFX0hfCkBAIC0xMyw1NSArMTMsNTUgQEAKIGNsYXNzIENGWF9ESUJTb3VyY2U7CiBjbGFzcyBDUFdMX0xhYmVsOwogCi1jbGFzcyBDUFdMX1NpZ25hdHVyZV9JbWFnZSA6IHB1YmxpYyBDUFdMX0ltYWdlCi17Ci1wdWJsaWM6Ci0JQ1BXTF9TaWduYXR1cmVfSW1hZ2UoKTsKLQl2aXJ0dWFsIH5DUFdMX1NpZ25hdHVyZV9JbWFnZSgpOworY2xhc3MgQ1BXTF9TaWduYXR1cmVfSW1hZ2UgOiBwdWJsaWMgQ1BXTF9JbWFnZSB7CisgcHVibGljOgorICBDUFdMX1NpZ25hdHVyZV9JbWFnZSgpOworICB+Q1BXTF9TaWduYXR1cmVfSW1hZ2UoKSBvdmVycmlkZTsKIAotCXZvaWQJCQkJCQkJCVNldEltYWdlKENGWF9ESUJTb3VyY2UqIHBJbWFnZSk7Ci0JQ0ZYX0RJQlNvdXJjZSoJCQkJCQlHZXRJbWFnZSgpOworICB2b2lkIFNldEltYWdlKENGWF9ESUJTb3VyY2UqIHBJbWFnZSk7CisgIENGWF9ESUJTb3VyY2UqIEdldEltYWdlKCk7CiAKLXByb3RlY3RlZDoKLQl2aXJ0dWFsIHZvaWQJCQkJCQlEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7Ci0JdmlydHVhbCB2b2lkCQkJCQkJR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSk7CisgcHJvdGVjdGVkOgorICAvLyBDUFdMX0ltYWdlCisgIHZvaWQgRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSkgb3ZlcnJpZGU7CisgIHZvaWQgR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmJiBzQXBwU3RyZWFtKSBvdmVycmlkZTsKKyAgdm9pZCBHZXRTY2FsZShGWF9GTE9BVCYgZkhTY2FsZSwgRlhfRkxPQVQmIGZWU2NhbGUpIG92ZXJyaWRlOwogCi0JdmlydHVhbCB2b2lkCQkJCQkJR2V0U2NhbGUoRlhfRkxPQVQgJiBmSFNjYWxlLEZYX0ZMT0FUICYgZlZTY2FsZSk7Ci0KLXByaXZhdGU6Ci0JQ0ZYX0RJQlNvdXJjZSoJCQkJCQltX3BJbWFnZTsKKyBwcml2YXRlOgorICBDRlhfRElCU291cmNlKiBtX3BJbWFnZTsKIH07CiAKLWNsYXNzIFBXTF9DTEFTUyBDUFdMX1NpZ25hdHVyZSA6IHB1YmxpYyBDUFdMX1duZAotewotcHVibGljOgotCUNQV0xfU2lnbmF0dXJlKCk7Ci0JdmlydHVhbCB+Q1BXTF9TaWduYXR1cmUoKTsKK2NsYXNzIENQV0xfU2lnbmF0dXJlIDogcHVibGljIENQV0xfV25kIHsKKyBwdWJsaWM6CisgIENQV0xfU2lnbmF0dXJlKCk7CisgIH5DUFdMX1NpZ25hdHVyZSgpIG92ZXJyaWRlOwogCi0Jdm9pZAkJCQkJCQkJU2V0VGV4dChGWF9MUENXU1RSIHNUZXh0KTsKLQl2b2lkCQkJCQkJCQlTZXREZXNjcmlwdGlvbihGWF9MUENXU1RSIHN0cmluZyk7Ci0Jdm9pZAkJCQkJCQkJU2V0SW1hZ2UoQ0ZYX0RJQlNvdXJjZSogcEltYWdlKTsKLQl2b2lkCQkJCQkJCQlTZXRJbWFnZVN0cmVhbShDUERGX1N0cmVhbSAqIHBTdHJlYW0sIEZYX0xQQ1NUUiBzSW1hZ2VBbGlhcyk7CisgIHZvaWQgU2V0VGV4dChjb25zdCBGWF9XQ0hBUiogc1RleHQpOworICB2b2lkIFNldERlc2NyaXB0aW9uKGNvbnN0IEZYX1dDSEFSKiBzdHJpbmcpOworICB2b2lkIFNldEltYWdlKENGWF9ESUJTb3VyY2UqIHBJbWFnZSk7CisgIHZvaWQgU2V0SW1hZ2VTdHJlYW0oQ1BERl9TdHJlYW0qIHBTdHJlYW0sIGNvbnN0IEZYX0NIQVIqIHNJbWFnZUFsaWFzKTsKIAotCXZvaWQJCQkJCQkJCVNldFRleHRGbGFnKEZYX0JPT0wgYlRleHRFeGlzdCk7Ci0Jdm9pZAkJCQkJCQkJU2V0SW1hZ2VGbGFnKEZYX0JPT0wgYkltYWdlRXhpc3QpOwotCXZvaWQJCQkJCQkJCVNldEZveGl0RmxhZyhGWF9CT09MIGJGbGFnRXhpc3QpOworICB2b2lkIFNldFRleHRGbGFnKEZYX0JPT0wgYlRleHRFeGlzdCk7CisgIHZvaWQgU2V0SW1hZ2VGbGFnKEZYX0JPT0wgYkltYWdlRXhpc3QpOworICB2b2lkIFNldEZveGl0RmxhZyhGWF9CT09MIGJGbGFnRXhpc3QpOwogCi1wcm90ZWN0ZWQ6Ci0JdmlydHVhbCB2b2lkCQkJCQkJUmVQb3NDaGlsZFduZCgpOwotCXZpcnR1YWwgdm9pZAkJCQkJCUNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKKyBwcm90ZWN0ZWQ6CisgIC8vIENQV0xfV25kCisgIHZvaWQgUmVQb3NDaGlsZFduZCgpIG92ZXJyaWRlOworICB2b2lkIENyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApIG92ZXJyaWRlOworICB2b2lkIERyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UpIG92ZXJyaWRlOworICB2b2lkIEdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiYgc0FwcFN0cmVhbSkgb3ZlcnJpZGU7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJCQlEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7Ci0JdmlydHVhbCB2b2lkCQkJCQkJR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSk7CisgcHJpdmF0ZToKKyAgQ1BXTF9MYWJlbCogbV9wVGV4dDsKKyAgQ1BXTF9MYWJlbCogbV9wRGVzY3JpcHRpb247CisgIENQV0xfU2lnbmF0dXJlX0ltYWdlKiBtX3BJbWFnZTsKIAotcHJpdmF0ZToKLQlDUFdMX0xhYmVsKgkJCQkJCQltX3BUZXh0OwotCUNQV0xfTGFiZWwqCQkJCQkJCW1fcERlc2NyaXB0aW9uOwotCUNQV0xfU2lnbmF0dXJlX0ltYWdlKgkJCQltX3BJbWFnZTsKLQotCUZYX0JPT0wJCQkJCQkJCW1fYlRleHRFeGlzdDsKLQlGWF9CT09MCQkJCQkJCQltX2JJbWFnZUV4aXN0OwotCUZYX0JPT0wJCQkJCQkJCW1fYkZsYWdFeGlzdDsKKyAgRlhfQk9PTCBtX2JUZXh0RXhpc3Q7CisgIEZYX0JPT0wgbV9iSW1hZ2VFeGlzdDsKKyAgRlhfQk9PTCBtX2JGbGFnRXhpc3Q7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfSU5DTFVERV9QREZXSU5ET1dfUFdMX1NJR05BVFVSRV9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU3BlY2lhbEJ1dHRvbi5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU3BlY2lhbEJ1dHRvbi5oCmluZGV4IDliNGZmZDIuLmE2MmQxOGQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1NwZWNpYWxCdXR0b24uaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TcGVjaWFsQnV0dG9uLmgKQEAgLTEsNyArMSw3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgRlBERlNES19JTkNMVURFX1BERldJTkRPV19QV0xfU1BFQ0lBTEJVVFRPTl9IXwpAQCAtOSw0OCArOSw0OCBAQAogCiAjaW5jbHVkZSAiUFdMX0J1dHRvbi5oIgogCi1jbGFzcyBQV0xfQ0xBU1MgQ1BXTF9QdXNoQnV0dG9uIDogcHVibGljIENQV0xfQnV0dG9uCi17Ci1wdWJsaWM6Ci0JQ1BXTF9QdXNoQnV0dG9uKCk7Ci0JdmlydHVhbCB+Q1BXTF9QdXNoQnV0dG9uKCk7CitjbGFzcyBDUFdMX1B1c2hCdXR0b24gOiBwdWJsaWMgQ1BXTF9CdXR0b24geworIHB1YmxpYzoKKyAgQ1BXTF9QdXNoQnV0dG9uKCk7CisgIH5DUFdMX1B1c2hCdXR0b24oKSBvdmVycmlkZTsKIAotCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldENsYXNzTmFtZSgpIGNvbnN0OwotCXZpcnR1YWwgQ1BERl9SZWN0CQkJR2V0Rm9jdXNSZWN0KCkgY29uc3Q7CisgIC8vIENQV0xfQnV0dG9uCisgIENGWF9CeXRlU3RyaW5nIEdldENsYXNzTmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICBDUERGX1JlY3QgR2V0Rm9jdXNSZWN0KCkgY29uc3Qgb3ZlcnJpZGU7CiB9OwogCi1jbGFzcyBQV0xfQ0xBU1MgQ1BXTF9DaGVja0JveCA6IHB1YmxpYyBDUFdMX0J1dHRvbgotewotcHVibGljOgotCUNQV0xfQ2hlY2tCb3goKTsKLQl2aXJ0dWFsIH5DUFdMX0NoZWNrQm94KCk7CitjbGFzcyBDUFdMX0NoZWNrQm94IDogcHVibGljIENQV0xfQnV0dG9uIHsKKyBwdWJsaWM6CisgIENQV0xfQ2hlY2tCb3goKTsKKyAgfkNQV0xfQ2hlY2tCb3goKSBvdmVycmlkZTsKIAotCXZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcJCUdldENsYXNzTmFtZSgpIGNvbnN0OwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJT25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKKyAgLy8gQ1BXTF9CdXR0b24KKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0Q2xhc3NOYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIEZYX0JPT0wgT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSBvdmVycmlkZTsKKyAgRlhfQk9PTCBPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpIG92ZXJyaWRlOwogCi0Jdm9pZAkJCQkJCVNldENoZWNrKEZYX0JPT0wgYkNoZWNrKTsKLQlGWF9CT09MCQkJCQkJSXNDaGVja2VkKCkgY29uc3Q7CisgIHZvaWQgU2V0Q2hlY2soRlhfQk9PTCBiQ2hlY2spOworICBGWF9CT09MIElzQ2hlY2tlZCgpIGNvbnN0OwogCi1wcml2YXRlOgotCUZYX0JPT0wJCQkJCQltX2JDaGVja2VkOworIHByaXZhdGU6CisgIEZYX0JPT0wgbV9iQ2hlY2tlZDsKIH07CiAKLWNsYXNzIFBXTF9DTEFTUyBDUFdMX1JhZGlvQnV0dG9uIDogcHVibGljIENQV0xfQnV0dG9uCi17Ci1wdWJsaWM6Ci0JQ1BXTF9SYWRpb0J1dHRvbigpOwotCXZpcnR1YWwgfkNQV0xfUmFkaW9CdXR0b24oKTsKK2NsYXNzIENQV0xfUmFkaW9CdXR0b24gOiBwdWJsaWMgQ1BXTF9CdXR0b24geworIHB1YmxpYzoKKyAgQ1BXTF9SYWRpb0J1dHRvbigpOworICB+Q1BXTF9SYWRpb0J1dHRvbigpIG92ZXJyaWRlOwogCi0JdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJR2V0Q2xhc3NOYW1lKCkgY29uc3Q7Ci0JdmlydHVhbCBGWF9CT09MCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworICAvLyBDUFdMX0J1dHRvbgorICBDRlhfQnl0ZVN0cmluZyBHZXRDbGFzc05hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgRlhfQk9PTCBPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIG92ZXJyaWRlOworICBGWF9CT09MIE9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykgb3ZlcnJpZGU7CiAKLQl2b2lkCQkJCQkJU2V0Q2hlY2soRlhfQk9PTCBiQ2hlY2spOwotCUZYX0JPT0wJCQkJCQlJc0NoZWNrZWQoKSBjb25zdDsKKyAgdm9pZCBTZXRDaGVjayhGWF9CT09MIGJDaGVjayk7CisgIEZYX0JPT0wgSXNDaGVja2VkKCkgY29uc3Q7CiAKLXByaXZhdGU6Ci0JRlhfQk9PTAkJCQkJCW1fYkNoZWNrZWQ7CisgcHJpdmF0ZToKKyAgRlhfQk9PTCBtX2JDaGVja2VkOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9TUEVDSUFMQlVUVE9OX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfVXRpbHMuaAppbmRleCA1MTUxNGYyLi5lZjg3ZWEzIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1V0aWxzLmgKQEAgLTEsMjQzICsxLDQxMiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIEZQREZTREtfSU5DTFVERV9QREZXSU5ET1dfUFdMX1VUSUxTX0hfCiAjZGVmaW5lIEZQREZTREtfSU5DTFVERV9QREZXSU5ET1dfUFdMX1VUSUxTX0hfCiAKLSNpbmNsdWRlICIuLi8uLi8uLi9jb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3BhcnNlci5oIiAgLy8gRm9yIENQREZfUG9pbnQuCi0jaW5jbHVkZSAiLi4vLi4vLi4vY29yZS9pbmNsdWRlL2ZwZGZkb2MvZnBkZl92dC5oIiAgLy8gRm9yIENQVlRfV29yZFJhbmdlLgotI2luY2x1ZGUgIi4uL2Z4ZWRpdC9meF9lZGl0LmgiCiAjaW5jbHVkZSAiUFdMX1duZC5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFyc2VyLmgiICAvLyBGb3IgQ1BERl9Qb2ludC4KKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX3Z0LmgiICAgICAgLy8gRm9yIENQVlRfV29yZFJhbmdlLgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhfZWRpdC5oIgogCiBjbGFzcyBDRlhfUGF0aERhdGE7CiBzdHJ1Y3QgQ1BXTF9Db2xvcjsKIAotdGVtcGxhdGU8Y2xhc3MgVD4gVCBQV0xfTUlOIChjb25zdCBUICYgaSwgY29uc3QgVCAmIGopIHsgcmV0dXJuICgoaSA8IGopID8gaSA6IGopOyB9Ci10ZW1wbGF0ZTxjbGFzcyBUPiBUIFBXTF9NQVggKGNvbnN0IFQgJiBpLCBjb25zdCBUICYgaikgeyByZXR1cm4gKChpID4gaikgPyBpIDogaik7IH0KK3RlbXBsYXRlIDxjbGFzcyBUPgorVCBQV0xfTUlOKGNvbnN0IFQmIGksIGNvbnN0IFQmIGopIHsKKyAgcmV0dXJuICgoaSA8IGopID8gaSA6IGopOworfQordGVtcGxhdGUgPGNsYXNzIFQ+CitUIFBXTF9NQVgoY29uc3QgVCYgaSwgY29uc3QgVCYgaikgeworICByZXR1cm4gKChpID4gaikgPyBpIDogaik7Cit9CiAKLSNkZWZpbmUgUFdMX1BERjJXSU4oY29sb3IpCQkJCQkoRlhfQllURShjb2xvcioyNTUpKQotI2RlZmluZSBQV0xfV0lOMlBERihjb2xvcikJCQkJCSgoRlhfRkxPQVQpKChGWF9GTE9BVCljb2xvci8yNTUuMGYpKQorI2RlZmluZSBQV0xfUERGMldJTihjb2xvcikgKHVpbnQ4X3QoY29sb3IgKiAyNTUpKQorI2RlZmluZSBQV0xfV0lOMlBERihjb2xvcikgKChGWF9GTE9BVCkoKEZYX0ZMT0FUKWNvbG9yIC8gMjU1LjBmKSkKIAotI2RlZmluZSBQV0xfTUFLRURXT1JEKGxvdyxoaWdoKQkJCQkoKEZYX0RXT1JEKSgoRlhfV09SRCkobG93KSB8IChGWF9EV09SRCkoKChGWF9XT1JEKShoaWdoKSk8PDE2KSkpIAotI2RlZmluZSBQV0xfR0VUTE9XV09SRChkd29yZCkJCQkJKChGWF9XT1JEKShkd29yZCkpCi0jZGVmaW5lIFBXTF9HRVRISUdIV09SRChkd29yZCkJCQkJKChGWF9XT1JEKShkd29yZD4+MTYpKQorI2RlZmluZSBQV0xfTUFLRURXT1JEKGxvdywgaGlnaCkgXAorICAoKEZYX0RXT1JEKSgoRlhfV09SRCkobG93KSB8IChGWF9EV09SRCkoKChGWF9XT1JEKShoaWdoKSkgPDwgMTYpKSkKKyNkZWZpbmUgUFdMX0dFVExPV1dPUkQoZHdvcmQpICgoRlhfV09SRCkoZHdvcmQpKQorI2RlZmluZSBQV0xfR0VUSElHSFdPUkQoZHdvcmQpICgoRlhfV09SRCkoZHdvcmQgPj4gMTYpKQogCi0jZGVmaW5lIFBXTF9JQ09OVFlQRV9DSEVDS01BUksJCQkJMAotI2RlZmluZSBQV0xfSUNPTlRZUEVfQ0lSQ0xFCQkJCQkxCi0jZGVmaW5lIFBXTF9JQ09OVFlQRV9DT01NRU5UCQkJCTIKLSNkZWZpbmUgUFdMX0lDT05UWVBFX0NST1NTCQkJCQkzCi0jZGVmaW5lIFBXTF9JQ09OVFlQRV9IRUxQCQkJCQk0Ci0jZGVmaW5lIFBXTF9JQ09OVFlQRV9JTlNFUlRURVhUCQkJCTUKLSNkZWZpbmUgUFdMX0lDT05UWVBFX0tFWQkJCQkJNgotI2RlZmluZSBQV0xfSUNPTlRZUEVfTkVXUEFSQUdSQVBICQkJNwotI2RlZmluZSBQV0xfSUNPTlRZUEVfVEVYVE5PVEUJCQkJOAotI2RlZmluZSBQV0xfSUNPTlRZUEVfUEFSQUdSQVBICQkJCTkKLSNkZWZpbmUgUFdMX0lDT05UWVBFX1JJR0hUQVJST1cJCQkJMTAKLSNkZWZpbmUgUFdMX0lDT05UWVBFX1JJR0hUUE9JTlRFUgkJCTExCi0jZGVmaW5lIFBXTF9JQ09OVFlQRV9TVEFSCQkJCQkxMgotI2RlZmluZSBQV0xfSUNPTlRZUEVfVVBBUlJPVwkJCQkxMwotI2RlZmluZSBQV0xfSUNPTlRZUEVfVVBMRUZUQVJST1cJCQkxNAorI2RlZmluZSBQV0xfSUNPTlRZUEVfQ0hFQ0tNQVJLIDAKKyNkZWZpbmUgUFdMX0lDT05UWVBFX0NJUkNMRSAxCisjZGVmaW5lIFBXTF9JQ09OVFlQRV9DT01NRU5UIDIKKyNkZWZpbmUgUFdMX0lDT05UWVBFX0NST1NTIDMKKyNkZWZpbmUgUFdMX0lDT05UWVBFX0hFTFAgNAorI2RlZmluZSBQV0xfSUNPTlRZUEVfSU5TRVJUVEVYVCA1CisjZGVmaW5lIFBXTF9JQ09OVFlQRV9LRVkgNgorI2RlZmluZSBQV0xfSUNPTlRZUEVfTkVXUEFSQUdSQVBIIDcKKyNkZWZpbmUgUFdMX0lDT05UWVBFX1RFWFROT1RFIDgKKyNkZWZpbmUgUFdMX0lDT05UWVBFX1BBUkFHUkFQSCA5CisjZGVmaW5lIFBXTF9JQ09OVFlQRV9SSUdIVEFSUk9XIDEwCisjZGVmaW5lIFBXTF9JQ09OVFlQRV9SSUdIVFBPSU5URVIgMTEKKyNkZWZpbmUgUFdMX0lDT05UWVBFX1NUQVIgMTIKKyNkZWZpbmUgUFdMX0lDT05UWVBFX1VQQVJST1cgMTMKKyNkZWZpbmUgUFdMX0lDT05UWVBFX1VQTEVGVEFSUk9XIDE0CiAKLSNkZWZpbmUgUFdMX0lDT05UWVBFX0dSQVBICQkJCQkxNQotI2RlZmluZSBQV0xfSUNPTlRZUEVfUEFQRVJDTElQCQkJCTE2Ci0jZGVmaW5lIFBXTF9JQ09OVFlQRV9BVFRBQ0hNRU5UCQkJCTE3Ci0jZGVmaW5lIFBXTF9JQ09OVFlQRV9UQUcJCQkJCTE4CisjZGVmaW5lIFBXTF9JQ09OVFlQRV9HUkFQSCAxNQorI2RlZmluZSBQV0xfSUNPTlRZUEVfUEFQRVJDTElQIDE2CisjZGVmaW5lIFBXTF9JQ09OVFlQRV9BVFRBQ0hNRU5UIDE3CisjZGVmaW5lIFBXTF9JQ09OVFlQRV9UQUcgMTgKIAotI2RlZmluZSBQV0xfSUNPTlRZUEVfRk9YSVQJCQkJCTE5CisjZGVmaW5lIFBXTF9JQ09OVFlQRV9GT1hJVCAxOQogCi0jZGVmaW5lIFBXTF9JQ09OVFlQRV9VTktOT1dOCQkJCS0xCisjZGVmaW5lIFBXTF9JQ09OVFlQRV9VTktOT1dOIC0xCiAKLS8vY2hlY2tib3ggJiByYWRpb2J1dHRvbiBzdHlsZQotI2RlZmluZSBQQ1NfQ0hFQ0sJCQkJCQkJMAotI2RlZmluZSBQQ1NfQ0lSQ0xFCQkJCQkJCTEKLSNkZWZpbmUgUENTX0NST1NTCQkJCQkJCTIKLSNkZWZpbmUgUENTX0RJQU1PTkQJCQkJCQkJMwotI2RlZmluZSBQQ1NfU1FVQVJFCQkJCQkJCTQKLSNkZWZpbmUgUENTX1NUQVIJCQkJCQkJNQorLy8gY2hlY2tib3ggJiByYWRpb2J1dHRvbiBzdHlsZQorI2RlZmluZSBQQ1NfQ0hFQ0sgMAorI2RlZmluZSBQQ1NfQ0lSQ0xFIDEKKyNkZWZpbmUgUENTX0NST1NTIDIKKyNkZWZpbmUgUENTX0RJQU1PTkQgMworI2RlZmluZSBQQ1NfU1FVQVJFIDQKKyNkZWZpbmUgUENTX1NUQVIgNQogCi0jZGVmaW5lCVBXTF9QSQkJCQkJCQkJMy4xNDE1OTI2NTM1ODk3OWYKLSNkZWZpbmUgUFdMX0JFWklFUgkJCQkJCQkwLjU1MjI4NDc0OTgzMDhmCisjZGVmaW5lIFBXTF9QSSAzLjE0MTU5MjY1MzU4OTc5ZgorI2RlZmluZSBQV0xfQkVaSUVSIDAuNTUyMjg0NzQ5ODMwOGYKIAotLy9wdXNoYnV0dG9uIGxheW91dCBzdHlsZQotI2RlZmluZSBQUEJMX0xBQkVMCQkJCQkJCTAKLSNkZWZpbmUgUFBCTF9JQ09OCQkJCQkJCTEKLSNkZWZpbmUgUFBCTF9JQ09OVE9QTEFCRUxCT1RUT00JCQkJMgotI2RlZmluZQlQUEJMX0xBQkVMVE9QSUNPTkJPVFRPTQkJCQkzCi0jZGVmaW5lCVBQQkxfSUNPTkxFRlRMQUJFTFJJR0hUCQkJCTQKLSNkZWZpbmUgUFBCTF9MQUJFTExFRlRJQ09OUklHSFQJCQkJNQotI2RlZmluZSBQUEJMX0xBQkVMT1ZFUklDT04JCQkJCTYKKy8vIHB1c2hidXR0b24gbGF5b3V0IHN0eWxlCisjZGVmaW5lIFBQQkxfTEFCRUwgMAorI2RlZmluZSBQUEJMX0lDT04gMQorI2RlZmluZSBQUEJMX0lDT05UT1BMQUJFTEJPVFRPTSAyCisjZGVmaW5lIFBQQkxfTEFCRUxUT1BJQ09OQk9UVE9NIDMKKyNkZWZpbmUgUFBCTF9JQ09OTEVGVExBQkVMUklHSFQgNAorI2RlZmluZSBQUEJMX0xBQkVMTEVGVElDT05SSUdIVCA1CisjZGVmaW5lIFBQQkxfTEFCRUxPVkVSSUNPTiA2CiAKLWNsYXNzIENQV0xfUG9pbnQgOiBwdWJsaWMgQ1BERl9Qb2ludAotewotcHVibGljOgotCUNQV0xfUG9pbnQoKSA6IENQREZfUG9pbnQoMC4wZiwwLjBmKXt9Ci0JQ1BXTF9Qb2ludChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIDogQ1BERl9Qb2ludChmeCxmeSkge30KLQlDUFdMX1BvaW50KGNvbnN0IENQV0xfUG9pbnQmIHBvaW50KSA6IENQREZfUG9pbnQocG9pbnQueCwgcG9pbnQueSkge30KK2NsYXNzIENQV0xfUG9pbnQgOiBwdWJsaWMgQ1BERl9Qb2ludCB7CisgcHVibGljOgorICBDUFdMX1BvaW50KCkgOiBDUERGX1BvaW50KDAuMGYsIDAuMGYpIHt9CisgIENQV0xfUG9pbnQoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSA6IENQREZfUG9pbnQoZngsIGZ5KSB7fQorICBDUFdMX1BvaW50KGNvbnN0IENQV0xfUG9pbnQmIHBvaW50KSA6IENQREZfUG9pbnQocG9pbnQueCwgcG9pbnQueSkge30KIH07CiAKLWVudW0gUFdMX1BBVEhEQVRBX1RZUEUKLXsKLQlQV0xQVF9NT1ZFVE8sCi0JUFdMUFRfTElORVRPLAotCVBXTFBUX0JFWklFUlRPLAotCVBXTFBUX1VOS05PV04KK2VudW0gUFdMX1BBVEhEQVRBX1RZUEUgeworICBQV0xQVF9NT1ZFVE8sCisgIFBXTFBUX0xJTkVUTywKKyAgUFdMUFRfQkVaSUVSVE8sCisgIFBXTFBUX1VOS05PV04KIH07CiAKLWVudW0gUFdMX1BBVEhfVFlQRQotewotCVBXTFBUX1BBVEhEQVRBLAotCVBXTFBUX1NUUkVBTQotfTsKK2VudW0gUFdMX1BBVEhfVFlQRSB7IFBXTFBUX1BBVEhEQVRBLCBQV0xQVF9TVFJFQU0gfTsKIAotY2xhc3MgQ1BXTF9QYXRoRGF0YQotewotcHVibGljOgotCUNQV0xfUGF0aERhdGEoKSA6IHBvaW50KCksIHR5cGUoUFdMUFRfVU5LTk9XTil7fQotCUNQV0xfUGF0aERhdGEoY29uc3QgQ1BXTF9Qb2ludCYgcHQsIFBXTF9QQVRIREFUQV9UWVBFIHRwKSA6IHBvaW50KHB0KSwgdHlwZSh0cCkge30KK2NsYXNzIENQV0xfUGF0aERhdGEgeworIHB1YmxpYzoKKyAgQ1BXTF9QYXRoRGF0YSgpIDogcG9pbnQoKSwgdHlwZShQV0xQVF9VTktOT1dOKSB7fQorICBDUFdMX1BhdGhEYXRhKGNvbnN0IENQV0xfUG9pbnQmIHB0LCBQV0xfUEFUSERBVEFfVFlQRSB0cCkKKyAgICAgIDogcG9pbnQocHQpLCB0eXBlKHRwKSB7fQogCi0JQ1BXTF9Qb2ludAkJCQkJCQkJcG9pbnQ7Ci0JUFdMX1BBVEhEQVRBX1RZUEUJCQkJCQl0eXBlOworICBDUFdMX1BvaW50IHBvaW50OworICBQV0xfUEFUSERBVEFfVFlQRSB0eXBlOwogfTsKIAogY2xhc3MgSVBXTF9TcGVsbENoZWNrOwogCi1jbGFzcyBQV0xfQ0xBU1MgQ1BXTF9VdGlscwotewotcHVibGljOgotCXN0YXRpYyBDUERGX1JlY3QJCQkJCQlJbmZsYXRlUmVjdChjb25zdCBDUERGX1JlY3QmIHJjUmVjdCwgRlhfRkxPQVQgZlNpemUpOwotCXN0YXRpYyBDUERGX1JlY3QJCQkJCQlEZWZsYXRlUmVjdChjb25zdCBDUERGX1JlY3QmIHJjUmVjdCwgRlhfRkxPQVQgZlNpemUpOwotCXN0YXRpYyBGWF9CT09MCQkJCQkJCUludGVyc2VjdFJlY3QoY29uc3QgQ1BERl9SZWN0JiByZWN0MSwgY29uc3QgQ1BERl9SZWN0JiByZWN0Mik7Ci0Jc3RhdGljIEZYX0JPT0wJCQkJCQkJQ29udGFpbnNSZWN0KGNvbnN0IENQREZfUmVjdCYgcmNQYXJlbnQsIGNvbnN0IENQREZfUmVjdCYgcmNDaGlsZCk7Ci0Jc3RhdGljIENQREZfUmVjdAkJCQkJCVNjYWxlUmVjdChjb25zdCBDUERGX1JlY3QmIHJjUmVjdCxGWF9GTE9BVCBmU2NhbGUpOwotCXN0YXRpYyBDUFZUX1dvcmRSYW5nZQkJCQkJT3ZlcmxhcFdvcmRSYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IxLCBjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IyKTsKLQlzdGF0aWMgQ1BERl9SZWN0CQkJCQkJR2V0Q2VudGVyU3F1YXJlKGNvbnN0IENQREZfUmVjdCAmIHJlY3QpOwotCXN0YXRpYyBDUFdMX0NvbG9yCQkJCQkJU3Vic3RyYWN0Q29sb3IoY29uc3QgQ1BXTF9Db2xvciAmIHNDb2xvcixGWF9GTE9BVCBmQ29sb3JTdWIpOwotCXN0YXRpYyBDUFdMX0NvbG9yCQkJCQkJRGV2aWRlQ29sb3IoY29uc3QgQ1BXTF9Db2xvciAmIHNDb2xvcixGWF9GTE9BVCBmQ29sb3JEZXZpZGUpOwotCXN0YXRpYyBDUERGX1JlY3QJCQkJCQlNYXhSZWN0KGNvbnN0IENQREZfUmVjdCAmIHJlY3QxLGNvbnN0IENQREZfUmVjdCAmIHJlY3QyKTsKLQlzdGF0aWMgQ1BERl9SZWN0CQkJCQkJT2Zmc2V0UmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0LEZYX0ZMT0FUIHgsRlhfRkxPQVQgeSk7Ci0Jc3RhdGljIENQREZfUG9pbnQJCQkJCQlPZmZzZXRQb2ludChjb25zdCAgQ1BERl9Qb2ludCAmIHBvaW50LEZYX0ZMT0FUIHgsRlhfRkxPQVQgeSk7Ci0Jc3RhdGljIEZYX0NPTE9SUkVGCQkJCQkJUFdMQ29sb3JUb0ZYQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IsIEZYX0lOVDMyIG5UcmFuc3BhcmFuY3kgPSAyNTUpOwotCXN0YXRpYyBGWF9CT09MCQkJCQkJCUlzQmxhY2tPcldoaXRlKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKTsKLQlzdGF0aWMgQ1BXTF9Db2xvcgkJCQkJCUdldFJldmVyc2VDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcik7CitjbGFzcyBDUFdMX1V0aWxzIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBDUERGX1JlY3QgSW5mbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0JiByY1JlY3QsIEZYX0ZMT0FUIGZTaXplKTsKKyAgc3RhdGljIENQREZfUmVjdCBEZWZsYXRlUmVjdChjb25zdCBDUERGX1JlY3QmIHJjUmVjdCwgRlhfRkxPQVQgZlNpemUpOworICBzdGF0aWMgRlhfQk9PTCBJbnRlcnNlY3RSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdDEsIGNvbnN0IENQREZfUmVjdCYgcmVjdDIpOworICBzdGF0aWMgRlhfQk9PTCBDb250YWluc1JlY3QoY29uc3QgQ1BERl9SZWN0JiByY1BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgcmNDaGlsZCk7CisgIHN0YXRpYyBDUERGX1JlY3QgU2NhbGVSZWN0KGNvbnN0IENQREZfUmVjdCYgcmNSZWN0LCBGWF9GTE9BVCBmU2NhbGUpOworICBzdGF0aWMgQ1BWVF9Xb3JkUmFuZ2UgT3ZlcmxhcFdvcmRSYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IyKTsKKyAgc3RhdGljIENQREZfUmVjdCBHZXRDZW50ZXJTcXVhcmUoY29uc3QgQ1BERl9SZWN0JiByZWN0KTsKKyAgc3RhdGljIENQV0xfQ29sb3IgU3Vic3RyYWN0Q29sb3IoY29uc3QgQ1BXTF9Db2xvciYgc0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29sb3JTdWIpOworICBzdGF0aWMgQ1BXTF9Db2xvciBEZXZpZGVDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBzQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb2xvckRldmlkZSk7CisgIHN0YXRpYyBDUERGX1JlY3QgTWF4UmVjdChjb25zdCBDUERGX1JlY3QmIHJlY3QxLCBjb25zdCBDUERGX1JlY3QmIHJlY3QyKTsKKyAgc3RhdGljIENQREZfUmVjdCBPZmZzZXRSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdCwgRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSk7CisgIHN0YXRpYyBDUERGX1BvaW50IE9mZnNldFBvaW50KGNvbnN0IENQREZfUG9pbnQmIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5KTsKKyAgc3RhdGljIEZYX0NPTE9SUkVGIFBXTENvbG9yVG9GWENvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuVHJhbnNwYXJhbmN5ID0gMjU1KTsKKyAgc3RhdGljIEZYX0JPT0wgSXNCbGFja09yV2hpdGUoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOworICBzdGF0aWMgQ1BXTF9Db2xvciBHZXRSZXZlcnNlQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOwogCi0Jc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRDb2xvckFwcFN0cmVhbShjb25zdCBDUFdMX0NvbG9yICYgY29sb3IsY29uc3QgRlhfQk9PTCAmIGJGaWxsT3JTdHJva2UgPSBUUlVFKTsKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldEJvcmRlckFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QgJiByZWN0LCBGWF9GTE9BVCBmV2lkdGgsCi0JCQkJCQkJCQkJCQljb25zdCBDUFdMX0NvbG9yICYgY29sb3IsIGNvbnN0IENQV0xfQ29sb3IgJiBjckxlZnRUb3AsIGNvbnN0IENQV0xfQ29sb3IgJiBjclJpZ2h0Qm90dG9tLAotCQkJCQkJCQkJCQkJRlhfSU5UMzIgblN0eWxlLCBjb25zdCBDUFdMX0Rhc2ggJiBkYXNoKTsKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldENpcmNsZUJvcmRlckFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QgJiByZWN0LCBGWF9GTE9BVCBmV2lkdGgsCi0JCQkJCQkJCQkJCQljb25zdCBDUFdMX0NvbG9yICYgY29sb3IsIGNvbnN0IENQV0xfQ29sb3IgJiBjckxlZnRUb3AsIGNvbnN0IENQV0xfQ29sb3IgJiBjclJpZ2h0Qm90dG9tLAotCQkJCQkJCQkJCQkJRlhfSU5UMzIgblN0eWxlLCBjb25zdCBDUFdMX0Rhc2ggJiBkYXNoKTsKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldFJlY3RGaWxsQXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCAmIHJlY3QsY29uc3QgQ1BXTF9Db2xvciAmIGNvbG9yKTsKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldENpcmNsZUZpbGxBcHBTdHJlYW0oY29uc3QgQ1BERl9SZWN0ICYgcmVjdCxjb25zdCBDUFdMX0NvbG9yICYgY29sb3IpOworICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0Q29sb3JBcHBTdHJlYW0oY29uc3QgQ1BXTF9Db2xvciYgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9CT09MJiBiRmlsbE9yU3Ryb2tlID0gVFJVRSk7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRCb3JkZXJBcHBTdHJlYW0oY29uc3QgQ1BERl9SZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjckxlZnRUb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JSaWdodEJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0Rhc2gmIGRhc2gpOworICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0Q2lyY2xlQm9yZGVyQXBwU3RyZWFtKAorICAgICAgY29uc3QgQ1BERl9SZWN0JiByZWN0LAorICAgICAgRlhfRkxPQVQgZldpZHRoLAorICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IsCisgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjckxlZnRUb3AsCisgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjclJpZ2h0Qm90dG9tLAorICAgICAgaW50MzJfdCBuU3R5bGUsCisgICAgICBjb25zdCBDUFdMX0Rhc2gmIGRhc2gpOworICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0UmVjdEZpbGxBcHBTdHJlYW0oY29uc3QgQ1BERl9SZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOworICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0Q2lyY2xlRmlsbEFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKTsKIAotCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0UHVzaEJ1dHRvbkFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsCi0JCQkJCQkJCQkJCQkJCUlGWF9FZGl0X0ZvbnRNYXAgKiBwRm9udE1hcCwKLQkJCQkJCQkJCQkJCQkJQ1BERl9TdHJlYW0gKiBwSWNvblN0cmVhbSwKLQkJCQkJCQkJCQkJCQkJQ1BERl9JY29uRml0ICYgSWNvbkZpdCwKLQkJCQkJCQkJCQkJCQkJY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiBzTGFiZWwsCQkJCQkJCQkJCQkJCQkKLQkJCQkJCQkJCQkJCQkJY29uc3QgQ1BXTF9Db2xvciAmIGNyVGV4dCwKLQkJCQkJCQkJCQkJCQkJRlhfRkxPQVQgZkZvbnRTaXplLAotCQkJCQkJCQkJCQkJCQlGWF9JTlQzMiBuTGF5T3V0KTsKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldENoZWNrQm94QXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCAmIHJjQkJveCwKLQkJCQkJCQkJCQkJCQkJRlhfSU5UMzIgblN0eWxlLAotCQkJCQkJCQkJCQkJCQljb25zdCBDUFdMX0NvbG9yICYgY3JUZXh0KTsKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldFJhZGlvQnV0dG9uQXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCAmIHJjQkJveCwKLQkJCQkJCQkJCQkJCQkJRlhfSU5UMzIgblN0eWxlLAotCQkJCQkJCQkJCQkJCQljb25zdCBDUFdMX0NvbG9yICYgY3JUZXh0KTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldFB1c2hCdXR0b25BcHBTdHJlYW0oY29uc3QgQ1BERl9SZWN0JiByY0JCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9FZGl0X0ZvbnRNYXAqIHBGb250TWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1N0cmVhbSogcEljb25TdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfSWNvbkZpdCYgSWNvbkZpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNMYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkxheU91dCk7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRDaGVja0JveEFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QmIHJjQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0KTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldFJhZGlvQnV0dG9uQXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCYgcmNCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjclRleHQpOwogCi0Jc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRFZGl0QXBwU3RyZWFtKElGWF9FZGl0KiBwRWRpdCwgY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0LCBjb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBSYW5nZSA9IE5VTEwsIAotCQkJCQkJCQkJCQkJCQlGWF9CT09MIGJDb250aW51b3VzID0gVFJVRSwgRlhfV09SRCBTdWJXb3JkID0gMCk7Ci0Jc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRFZGl0U2VsQXBwU3RyZWFtKElGWF9FZGl0KiBwRWRpdCwgY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0LAotCQkJCQkJCQkJCQkJCQljb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBSYW5nZSA9IE5VTEwpOwotCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0U3BlbGxDaGVja0FwcFN0cmVhbShJRlhfRWRpdCogcEVkaXQsIElQV0xfU3BlbGxDaGVjayogcFNwZWxsQ2hlY2ssCi0JCQkJCQkJCQkJCQkJCWNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCwKLQkJCQkJCQkJCQkJCQkJY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgKiBwUmFuZ2UgPSBOVUxMKTsKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldFRleHRBcHBTdHJlYW0oY29uc3QgQ1BERl9SZWN0ICYgcmNCQm94LElGWF9FZGl0X0ZvbnRNYXAgKiBwRm9udE1hcCwKLQkJCQkJCQkJCQkJCQkJY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiBzVGV4dCwgRlhfSU5UMzIgbkFsaWdubWVudEgsIEZYX0lOVDMyIG5BbGlnbm1lbnRWLAotCQkJCQkJCQkJCQkJCQlGWF9GTE9BVCBmRm9udFNpemUsIEZYX0JPT0wgYk11bHRpTGluZSwgRlhfQk9PTCBiQXV0b1JldHVybiwgY29uc3QgQ1BXTF9Db2xvciAmIGNyVGV4dCk7Ci0Jc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXREcm9wQnV0dG9uQXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCAmIHJjQkJveCk7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRFZGl0QXBwU3RyZWFtKElGWF9FZGl0KiBwRWRpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDb250aW51b3VzID0gVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCBTdWJXb3JkID0gMCk7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRFZGl0U2VsQXBwU3RyZWFtKAorICAgICAgSUZYX0VkaXQqIHBFZGl0LAorICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsCisgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlID0gTlVMTCk7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRTcGVsbENoZWNrQXBwU3RyZWFtKAorICAgICAgSUZYX0VkaXQqIHBFZGl0LAorICAgICAgSVBXTF9TcGVsbENoZWNrKiBwU3BlbGxDaGVjaywKKyAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LAorICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSA9IE5VTEwpOworICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0VGV4dEFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QmIHJjQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQWxpZ25tZW50SCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQWxpZ25tZW50ViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJNdWx0aUxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkF1dG9SZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyVGV4dCk7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXREcm9wQnV0dG9uQXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCYgcmNCQm94KTsKIAotCXN0YXRpYyB2b2lkCQkJCQkJCQlEcmF3RmlsbFJlY3QoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSxjb25zdCBDUERGX1JlY3QgJiByZWN0LAotCQkJCQkJCQkJCQkJCQljb25zdCBDUFdMX0NvbG9yICYgY29sb3IsIEZYX0lOVDMyIG5UcmFuc3BhcmFuY3kpOwotCXN0YXRpYyB2b2lkCQkJCQkJCQlEcmF3RmlsbFJlY3QoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKLQkJCQkJCQkJCQkJCQkJY29uc3QgQ1BERl9SZWN0ICYgcmVjdCxjb25zdCBGWF9DT0xPUlJFRiAmIGNvbG9yKTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJRHJhd1N0cm9rZVJlY3QoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSxjb25zdCBDUERGX1JlY3QgJiByZWN0LAotCQkJCQkJCQkJCQkJCQljb25zdCBGWF9DT0xPUlJFRiAmIGNvbG9yLCBGWF9GTE9BVCBmV2lkdGgpOwotCXN0YXRpYyB2b2lkCQkJCQkJCQlEcmF3U3Ryb2tlTGluZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAotCQkJCQkJCQkJCQkJCQljb25zdCBDUERGX1BvaW50ICYgcHRNb3ZlVG8sIGNvbnN0IENQREZfUG9pbnQgJiBwdExpbmVUbywgY29uc3QgRlhfQ09MT1JSRUYgJiBjb2xvciwgRlhfRkxPQVQgZldpZHRoKTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJRHJhd0JvcmRlcihDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAotCQkJCQkJCQkJCQkJY29uc3QgQ1BERl9SZWN0ICYgcmVjdCwgRlhfRkxPQVQgZldpZHRoLAotCQkJCQkJCQkJCQkJY29uc3QgQ1BXTF9Db2xvciAmIGNvbG9yLCBjb25zdCBDUFdMX0NvbG9yICYgY3JMZWZ0VG9wLCBjb25zdCBDUFdMX0NvbG9yICYgY3JSaWdodEJvdHRvbSwKLQkJCQkJCQkJCQkJCUZYX0lOVDMyIG5TdHlsZSwgY29uc3QgQ1BXTF9EYXNoICYgZGFzaCwgRlhfSU5UMzIgblRyYW5zcGFyYW5jeSk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCURyYXdGaWxsQXJlYShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAotCQkJCQkJCQkJCQkJCQljb25zdCBDUERGX1BvaW50KiBwUHRzLCBGWF9JTlQzMiBuQ291bnQsIGNvbnN0IEZYX0NPTE9SUkVGJiBjb2xvcik7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCURyYXdTaGFkb3coQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKLQkJCQkJCQkJCQkJCQkJRlhfQk9PTCBiVmVydGljYWwsIEZYX0JPT0wgYkhvcml6b250YWwsIENQREZfUmVjdCByZWN0LAotCQkJCQkJCQkJCQkJCQlGWF9JTlQzMiBuVHJhbnNwYXJhbmN5LCBGWF9JTlQzMiBuU3RhcnRHcmF5LCBGWF9JTlQzMiBuRW5kR3JheSk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCURyYXdFZGl0U3BlbGxDaGVjayhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLCBJRlhfRWRpdCogcEVkaXQsIAotCQkJCQkJCQkJCQkJCQljb25zdCBDUERGX1JlY3QmIHJjQ2xpcCwgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsIAotCQkJCQkJCQkJCQkJCQlJUFdMX1NwZWxsQ2hlY2sqIHBTcGVsbENoZWNrKTsKLXB1YmxpYzoKLQlzdGF0aWMgdm9pZAkJCQkJCQkJQ29udmVydENNWUsyUkdCKEZYX0ZMT0FUIGRDLEZYX0ZMT0FUIGRNLEZYX0ZMT0FUIGRZLEZYX0ZMT0FUIGRLLEZYX0ZMT0FUICZkUixGWF9GTE9BVCAmZEcsRlhfRkxPQVQgJmRCKTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJQ29udmVydFJHQjJDTVlLKEZYX0ZMT0FUIGRSLEZYX0ZMT0FUIGRHLEZYX0ZMT0FUIGRCLEZYX0ZMT0FUICZkQyxGWF9GTE9BVCAmZE0sRlhfRkxPQVQgJmRZLEZYX0ZMT0FUICZkSyk7Ci0JCi0Jc3RhdGljIHZvaWQJCQkJCQkJCUNvbnZlcnRSR0IyR1JBWShGWF9GTE9BVCBkUixGWF9GTE9BVCBkRyxGWF9GTE9BVCBkQixGWF9GTE9BVCAmZEdyYXkpOwotCXN0YXRpYyB2b2lkCQkJCQkJCQlDb252ZXJ0R1JBWTJSR0IoRlhfRkxPQVQgZEdyYXksRlhfRkxPQVQgJmRSLEZYX0ZMT0FUICZkRyxGWF9GTE9BVCAmZEIpOworICBzdGF0aWMgdm9pZCBEcmF3RmlsbFJlY3QoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuVHJhbnNwYXJhbmN5KTsKKyAgc3RhdGljIHZvaWQgRHJhd0ZpbGxSZWN0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DT0xPUlJFRiYgY29sb3IpOworICBzdGF0aWMgdm9pZCBEcmF3U3Ryb2tlUmVjdChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ09MT1JSRUYmIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGgpOworICBzdGF0aWMgdm9pZCBEcmF3U3Ryb2tlTGluZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0TW92ZVRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdExpbmVUbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ09MT1JSRUYmIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGgpOworICBzdGF0aWMgdm9pZCBEcmF3Qm9yZGVyKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JMZWZ0VG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyUmlnaHRCb3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuVHJhbnNwYXJhbmN5KTsKKyAgc3RhdGljIHZvaWQgRHJhd0ZpbGxBcmVhKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50KiBwUHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DT0xPUlJFRiYgY29sb3IpOworICBzdGF0aWMgdm9pZCBEcmF3U2hhZG93KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZlcnRpY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkhvcml6b250YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZWN0IHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuVHJhbnNwYXJhbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0R3JheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5FbmRHcmF5KTsKKyAgc3RhdGljIHZvaWQgRHJhd0VkaXRTcGVsbENoZWNrKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRWRpdCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJjQ2xpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQV0xfU3BlbGxDaGVjayogcFNwZWxsQ2hlY2spOwogCi0Jc3RhdGljIHZvaWQJCQkJCQkJCUNvbnZlcnRDTVlLMkdSQVkoRlhfRkxPQVQgZEMsRlhfRkxPQVQgZE0sRlhfRkxPQVQgZFksRlhfRkxPQVQgZEssRlhfRkxPQVQgJmRHcmF5KTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJQ29udmVydEdSQVkyQ01ZSyhGWF9GTE9BVCBkR3JheSxGWF9GTE9BVCAmZEMsRlhfRkxPQVQgJmRNLEZYX0ZMT0FUICZkWSxGWF9GTE9BVCAmZEspOworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgQ29udmVydENNWUsyUkdCKEZYX0ZMT0FUIGRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGRHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGRCKTsKKyAgc3RhdGljIHZvaWQgQ29udmVydFJHQjJDTVlLKEZYX0ZMT0FUIGRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBkQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBkTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBkWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBkSyk7CiAKLQlzdGF0aWMgdm9pZAkJCQkJCQkJUFdMQ29sb3JUb0FSR0IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IsIEZYX0lOVDMyJiBhbHBoYSwgRlhfRkxPQVQmIHJlZCwgRlhfRkxPQVQmIGdyZWVuLCBGWF9GTE9BVCYgYmx1ZSk7CisgIHN0YXRpYyB2b2lkIENvbnZlcnRSR0IyR1JBWShGWF9GTE9BVCBkUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZEdyYXkpOworICBzdGF0aWMgdm9pZCBDb252ZXJ0R1JBWTJSR0IoRlhfRkxPQVQgZEdyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZEIpOwogCi1wdWJsaWM6Ci0Jc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRJY29uQXBwU3RyZWFtKEZYX0lOVDMyIG5UeXBlLCBjb25zdCBDUERGX1JlY3QmIHJlY3QsIGNvbnN0IENQV0xfQ29sb3ImIGNyRmlsbCwgCi0JCQkJCQkJCQkJCQljb25zdCBDUFdMX0NvbG9yJiBjclN0cm9rZSA9IFBXTF9ERUZBVUxUX0JMQUNLQ09MT1IpOwotCXN0YXRpYyB2b2lkCQkJCQkJCQlEcmF3SWNvbkFwcFN0cmVhbShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAotCQkJCQkJCQkJCQkJRlhfSU5UMzIgblR5cGUsIGNvbnN0IENQREZfUmVjdCAmIHJlY3QsIGNvbnN0IENQV0xfQ29sb3ImIGNyRmlsbCwgCi0JCQkJCQkJCQkJCQljb25zdCBDUFdMX0NvbG9yJiBjclN0cm9rZSwgY29uc3QgRlhfSU5UMzIgblRyYW5zcGFyYW5jeSk7CisgIHN0YXRpYyB2b2lkIENvbnZlcnRDTVlLMkdSQVkoRlhfRkxPQVQgZEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZEssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGRHcmF5KTsKKyAgc3RhdGljIHZvaWQgQ29udmVydEdSQVkyQ01ZSyhGWF9GTE9BVCBkR3JheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBkWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZEspOwogCi1wcml2YXRlOgotCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0QXBwU3RyZWFtRnJvbUFycmF5KGNvbnN0IENQV0xfUGF0aERhdGEqIHBQYXRoRGF0YSwgRlhfSU5UMzIgbkNvdW50KTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJR2V0UGF0aERhdGFGcm9tQXJyYXkoQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUFdMX1BhdGhEYXRhKiBwUGF0aERhdGEsIEZYX0lOVDMyIG5Db3VudCk7CisgIHN0YXRpYyB2b2lkIFBXTENvbG9yVG9BUkdCKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgYmx1ZSk7CiAKLQlzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcJCQkJCUdldEFwcFN0cmVhbV9DaGVjayhjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsIGNvbnN0IENQV0xfQ29sb3IgJiBjclRleHQpOwotCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0QXBwU3RyZWFtX0NpcmNsZShjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsIGNvbnN0IENQV0xfQ29sb3IgJiBjclRleHQpOwotCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0QXBwU3RyZWFtX0Nyb3NzKGNvbnN0IENQREZfUmVjdCAmIHJjQkJveCwgY29uc3QgQ1BXTF9Db2xvciAmIGNyVGV4dCk7Ci0Jc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRBcHBTdHJlYW1fRGlhbW9uZChjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsIGNvbnN0IENQV0xfQ29sb3IgJiBjclRleHQpOwotCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0QXBwU3RyZWFtX1NxdWFyZShjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsIGNvbnN0IENQV0xfQ29sb3IgJiBjclRleHQpOwotCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0QXBwU3RyZWFtX1N0YXIoY29uc3QgQ1BERl9SZWN0ICYgcmNCQm94LCBjb25zdCBDUFdMX0NvbG9yICYgY3JUZXh0KTsKKyBwdWJsaWM6CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRJY29uQXBwU3RyZWFtKAorICAgICAgaW50MzJfdCBuVHlwZSwKKyAgICAgIGNvbnN0IENQREZfUmVjdCYgcmVjdCwKKyAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyRmlsbCwKKyAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyU3Ryb2tlID0gUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUik7CisgIHN0YXRpYyB2b2lkIERyYXdJY29uQXBwU3RyZWFtKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjckZpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyU3Ryb2tlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IG5UcmFuc3BhcmFuY3kpOwogCi0Jc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRBUF9DaGVjayhjb25zdCBDUERGX1JlY3QgJiBjckJCb3gpOwotCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0QVBfQ2lyY2xlKGNvbnN0IENQREZfUmVjdCAmIGNyQkJveCk7Ci0Jc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRBUF9Dcm9zcyhjb25zdCBDUERGX1JlY3QgJiBjckJCb3gpOwotCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0QVBfRGlhbW9uZChjb25zdCBDUERGX1JlY3QgJiBjckJCb3gpOwotCXN0YXRpYyBDRlhfQnl0ZVN0cmluZwkJCQkJR2V0QVBfU3F1YXJlKGNvbnN0IENQREZfUmVjdCAmIGNyQkJveCk7Ci0Jc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRBUF9TdGFyKGNvbnN0IENQREZfUmVjdCAmIGNyQkJveCk7Ci0Jc3RhdGljIENGWF9CeXRlU3RyaW5nCQkJCQlHZXRBUF9IYWxmQ2lyY2xlKGNvbnN0IENQREZfUmVjdCAmIGNyQkJveCxGWF9GTE9BVCBmUm90YXRlKTsKKyBwcml2YXRlOgorICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0QXBwU3RyZWFtRnJvbUFycmF5KGNvbnN0IENQV0xfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCk7CisgIHN0YXRpYyB2b2lkIEdldFBhdGhEYXRhRnJvbUFycmF5KENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCk7CiAKLQlzdGF0aWMgdm9pZAkJCQkJCQkJR2V0R3JhcGhpY3NfQ2hlY2ttYXJrKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCUdldEdyYXBoaWNzX0NpcmNsZShDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLCBDRlhfUGF0aERhdGEmIHBhdGgsIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LCBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpOwotCXN0YXRpYyB2b2lkCQkJCQkJCQlHZXRHcmFwaGljc19Db21tZW50KENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCUdldEdyYXBoaWNzX0Nyb3NzKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCUdldEdyYXBoaWNzX0hlbHAoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJR2V0R3JhcGhpY3NfSW5zZXJ0VGV4dChDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLCBDRlhfUGF0aERhdGEmIHBhdGgsIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LCBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpOwotCXN0YXRpYyB2b2lkCQkJCQkJCQlHZXRHcmFwaGljc19LZXkoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJR2V0R3JhcGhpY3NfTmV3UGFyYWdyYXBoKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCUdldEdyYXBoaWNzX1RleHROb3RlKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCUdldEdyYXBoaWNzX1BhcmFncmFwaChDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLCBDRlhfUGF0aERhdGEmIHBhdGgsIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LCBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpOwotCXN0YXRpYyB2b2lkCQkJCQkJCQlHZXRHcmFwaGljc19SaWdodEFycm93KENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCUdldEdyYXBoaWNzX1JpZ2h0UG9pbnRlcihDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLCBDRlhfUGF0aERhdGEmIHBhdGgsIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LCBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpOwotCXN0YXRpYyB2b2lkCQkJCQkJCQlHZXRHcmFwaGljc19TdGFyKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCUdldEdyYXBoaWNzX1VwQXJyb3coQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJR2V0R3JhcGhpY3NfVXBMZWZ0QXJyb3coQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJR2V0R3JhcGhpY3NfR3JhcGgoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJR2V0R3JhcGhpY3NfUGFwZXJjbGlwKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCUdldEdyYXBoaWNzX0F0dGFjaG1lbnQoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKLQlzdGF0aWMgdm9pZAkJCQkJCQkJR2V0R3JhcGhpY3NfVGFnKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7Ci0Jc3RhdGljIHZvaWQJCQkJCQkJCUdldEdyYXBoaWNzX0ZveGl0KENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRBcHBTdHJlYW1fQ2hlY2soY29uc3QgQ1BERl9SZWN0JiByY0JCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0KTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldEFwcFN0cmVhbV9DaXJjbGUoY29uc3QgQ1BERl9SZWN0JiByY0JCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyVGV4dCk7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRBcHBTdHJlYW1fQ3Jvc3MoY29uc3QgQ1BERl9SZWN0JiByY0JCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0KTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldEFwcFN0cmVhbV9EaWFtb25kKGNvbnN0IENQREZfUmVjdCYgcmNCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0KTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldEFwcFN0cmVhbV9TcXVhcmUoY29uc3QgQ1BERl9SZWN0JiByY0JCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyVGV4dCk7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRBcHBTdHJlYW1fU3Rhcihjb25zdCBDUERGX1JlY3QmIHJjQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyVGV4dCk7CisKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldEFQX0NoZWNrKGNvbnN0IENQREZfUmVjdCYgY3JCQm94KTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldEFQX0NpcmNsZShjb25zdCBDUERGX1JlY3QmIGNyQkJveCk7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRBUF9Dcm9zcyhjb25zdCBDUERGX1JlY3QmIGNyQkJveCk7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRBUF9EaWFtb25kKGNvbnN0IENQREZfUmVjdCYgY3JCQm94KTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldEFQX1NxdWFyZShjb25zdCBDUERGX1JlY3QmIGNyQkJveCk7CisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRBUF9TdGFyKGNvbnN0IENQREZfUmVjdCYgY3JCQm94KTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldEFQX0hhbGZDaXJjbGUoY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZSb3RhdGUpOworCisgIHN0YXRpYyB2b2lkIEdldEdyYXBoaWNzX0NoZWNrbWFyayhDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpOworICBzdGF0aWMgdm9pZCBHZXRHcmFwaGljc19DaXJjbGUoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKKyAgc3RhdGljIHZvaWQgR2V0R3JhcGhpY3NfQ29tbWVudChDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpOworICBzdGF0aWMgdm9pZCBHZXRHcmFwaGljc19Dcm9zcyhDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpOworICBzdGF0aWMgdm9pZCBHZXRHcmFwaGljc19IZWxwKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7CisgIHN0YXRpYyB2b2lkIEdldEdyYXBoaWNzX0luc2VydFRleHQoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKKyAgc3RhdGljIHZvaWQgR2V0R3JhcGhpY3NfS2V5KENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7CisgIHN0YXRpYyB2b2lkIEdldEdyYXBoaWNzX05ld1BhcmFncmFwaChDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpOworICBzdGF0aWMgdm9pZCBHZXRHcmFwaGljc19UZXh0Tm90ZShDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpOworICBzdGF0aWMgdm9pZCBHZXRHcmFwaGljc19QYXJhZ3JhcGgoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKKyAgc3RhdGljIHZvaWQgR2V0R3JhcGhpY3NfUmlnaHRBcnJvdyhDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpOworICBzdGF0aWMgdm9pZCBHZXRHcmFwaGljc19SaWdodFBvaW50ZXIoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKTsKKyAgc3RhdGljIHZvaWQgR2V0R3JhcGhpY3NfU3RhcihDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpOworICBzdGF0aWMgdm9pZCBHZXRHcmFwaGljc19VcEFycm93KENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7CisgIHN0YXRpYyB2b2lkIEdldEdyYXBoaWNzX1VwTGVmdEFycm93KENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7CisgIHN0YXRpYyB2b2lkIEdldEdyYXBoaWNzX0dyYXBoKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7CisgIHN0YXRpYyB2b2lkIEdldEdyYXBoaWNzX1BhcGVyY2xpcChDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpOworICBzdGF0aWMgdm9pZCBHZXRHcmFwaGljc19BdHRhY2htZW50KENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSk7CisgIHN0YXRpYyB2b2lkIEdldEdyYXBoaWNzX1RhZyhDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpOworICBzdGF0aWMgdm9pZCBHZXRHcmFwaGljc19Gb3hpdChDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9VVElMU19IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfV25kLmggYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9XbmQuaAppbmRleCA0ZmExYzc2Li4wNTgwNTdiIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9XbmQuaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9XbmQuaApAQCAtMSwxNSArMSwxNSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaWZuZGVmIEZQREZTREtfSU5DTFVERV9QREZXSU5ET1dfUFdMX1dORF9IXwogI2RlZmluZSBGUERGU0RLX0lOQ0xVREVfUERGV0lORE9XX1BXTF9XTkRfSF8KIAotI2luY2x1ZGUgIi4uLy4uLy4uL2NvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgiCi0jaW5jbHVkZSAiLi4vZnhfc3lzdGVtaGFuZGxlci5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2Z4X3N5c3RlbWhhbmRsZXIuaCIKIAogY2xhc3MgQ1BXTF9Nc2dDb250cm9sOwogY2xhc3MgQ1BXTF9TY3JvbGxCYXI7CkBAIC0yMSw0NTcgKzIxLDQ0OSBAQAogY2xhc3MgSVBXTF9Qcm92aWRlcjsKIGNsYXNzIElQV0xfU3BlbGxDaGVjazsKIAotI2lmZGVmIEZYX1JFQURFUl9ETEwKLQkjaWZkZWYgUFdMX0VYUE9SVAotCQkJI2RlZmluZSBQV0xfQ0xBU1MJCV9fZGVjbHNwZWMoZGxsZXhwb3J0KQotCQkJI2RlZmluZSBQV0xfRlVOQ1RJT04JUFdMX0NMQVNTCQotCQkjZWxzZQotCQkJI2RlZmluZSBQV0xfQ0xBU1MKLQkJCSNkZWZpbmUgUFdMX0ZVTkNUSU9OCi0JI2VuZGlmCi0jZWxzZQotCSNkZWZpbmUgUFdMX0NMQVNTCi0JI2RlZmluZSBQV0xfRlVOQ1RJT04KLSNlbmRpZgorLy8gd2luZG93IHN0eWxlcworI2RlZmluZSBQV1NfQ0hJTEQgMHg4MDAwMDAwMEwKKyNkZWZpbmUgUFdTX0JPUkRFUiAweDQwMDAwMDAwTAorI2RlZmluZSBQV1NfQkFDS0dST1VORCAweDIwMDAwMDAwTAorI2RlZmluZSBQV1NfSFNDUk9MTCAweDEwMDAwMDAwTAorI2RlZmluZSBQV1NfVlNDUk9MTCAweDA4MDAwMDAwTAorI2RlZmluZSBQV1NfVklTSUJMRSAweDA0MDAwMDAwTAorI2RlZmluZSBQV1NfRElTQUJMRSAweDAyMDAwMDAwTAorI2RlZmluZSBQV1NfUkVBRE9OTFkgMHgwMTAwMDAwMEwKKyNkZWZpbmUgUFdTX0FVVE9GT05UU0laRSAweDAwODAwMDAwTAorI2RlZmluZSBQV1NfQVVUT1RSQU5TUEFSRU5UIDB4MDA0MDAwMDBMCisjZGVmaW5lIFBXU19OT1JFRlJFU0hDTElQIDB4MDAyMDAwMDBMCiAKLS8vd2luZG93IHN0eWxlcwotI2RlZmluZSBQV1NfQ0hJTEQJCQkJCQkJMHg4MDAwMDAwMEwKLSNkZWZpbmUgUFdTX0JPUkRFUgkJCQkJCQkweDQwMDAwMDAwTAotI2RlZmluZSBQV1NfQkFDS0dST1VORAkJCQkJCTB4MjAwMDAwMDBMCi0jZGVmaW5lIFBXU19IU0NST0xMCQkJCQkJCTB4MTAwMDAwMDBMCi0jZGVmaW5lIFBXU19WU0NST0xMCQkJCQkJCTB4MDgwMDAwMDBMCi0jZGVmaW5lIFBXU19WSVNJQkxFCQkJCQkJCTB4MDQwMDAwMDBMCi0jZGVmaW5lIFBXU19ESVNBQkxFCQkJCQkJCTB4MDIwMDAwMDBMCi0jZGVmaW5lIFBXU19SRUFET05MWQkJCQkJCTB4MDEwMDAwMDBMCi0jZGVmaW5lIFBXU19BVVRPRk9OVFNJWkUJCQkJCTB4MDA4MDAwMDBMCi0jZGVmaW5lIFBXU19BVVRPVFJBTlNQQVJFTlQJCQkJCTB4MDA0MDAwMDBMCi0jZGVmaW5lIFBXU19OT1JFRlJFU0hDTElQCQkJCQkweDAwMjAwMDAwTAorLy8gZWRpdCBhbmQgbGFiZWwgc3R5bGVzCisjZGVmaW5lIFBFU19NVUxUSUxJTkUgMHgwMDAxTAorI2RlZmluZSBQRVNfUEFTU1dPUkQgMHgwMDAyTAorI2RlZmluZSBQRVNfTEVGVCAweDAwMDRMCisjZGVmaW5lIFBFU19SSUdIVCAweDAwMDhMCisjZGVmaW5lIFBFU19NSURETEUgMHgwMDEwTAorI2RlZmluZSBQRVNfVE9QIDB4MDAyMEwKKyNkZWZpbmUgUEVTX0JPVFRPTSAweDAwNDBMCisjZGVmaW5lIFBFU19DRU5URVIgMHgwMDgwTAorI2RlZmluZSBQRVNfQ0hBUkFSUkFZIDB4MDEwMEwKKyNkZWZpbmUgUEVTX0FVVE9TQ1JPTEwgMHgwMjAwTAorI2RlZmluZSBQRVNfQVVUT1JFVFVSTiAweDA0MDBMCisjZGVmaW5lIFBFU19VTkRPIDB4MDgwMEwKKyNkZWZpbmUgUEVTX1JJQ0ggMHgxMDAwTAorI2RlZmluZSBQRVNfU1BFTExDSEVDSyAweDIwMDBMCisjZGVmaW5lIFBFU19URVhUT1ZFUkZMT1cgMHg0MDAwTAorI2RlZmluZSBQRVNfTk9SRUFEIDB4ODAwMEwKIAotLy9lZGl0IGFuZCBsYWJlbCBzdHlsZXMKLSNkZWZpbmUgUEVTX01VTFRJTElORQkJCQkJCTB4MDAwMUwKLSNkZWZpbmUgUEVTX1BBU1NXT1JECQkJCQkJMHgwMDAyTAotI2RlZmluZSBQRVNfTEVGVAkJCQkJCQkweDAwMDRMCi0jZGVmaW5lIFBFU19SSUdIVAkJCQkJCQkweDAwMDhMCi0jZGVmaW5lIFBFU19NSURETEUJCQkJCQkJMHgwMDEwTAotI2RlZmluZSBQRVNfVE9QCQkJCQkJCQkweDAwMjBMCi0jZGVmaW5lIFBFU19CT1RUT00JCQkJCQkJMHgwMDQwTAotI2RlZmluZSBQRVNfQ0VOVEVSCQkJCQkJCTB4MDA4MEwKLSNkZWZpbmUgUEVTX0NIQVJBUlJBWQkJCQkJCTB4MDEwMEwKLSNkZWZpbmUgUEVTX0FVVE9TQ1JPTEwJCQkJCQkweDAyMDBMCi0jZGVmaW5lIFBFU19BVVRPUkVUVVJOCQkJCQkJMHgwNDAwTAotI2RlZmluZSBQRVNfVU5ETwkJCQkJCQkweDA4MDBMCi0jZGVmaW5lIFBFU19SSUNICQkJCQkJCTB4MTAwMEwKLSNkZWZpbmUgUEVTX1NQRUxMQ0hFQ0sJCQkJCQkweDIwMDBMCi0jZGVmaW5lIFBFU19URVhUT1ZFUkZMT1cJCQkJCTB4NDAwMEwKLSNkZWZpbmUgUEVTX05PUkVBRAkJCQkJCQkweDgwMDBMCisvLyBsaXN0Ym94IHN0eWxlcworI2RlZmluZSBQTEJTX01VTFRJUExFU0VMIDB4MDAwMUwKKyNkZWZpbmUgUExCU19IT1ZFUlNFTCAweDAwMDhMCiAKLS8vbGlzdGJveCBzdHlsZXMKLSNkZWZpbmUgUExCU19NVUxUSVBMRVNFTAkJCQkJMHgwMDAxTAotI2RlZmluZSBQTEJTX0hPVkVSU0VMCQkJCQkJMHgwMDA4TAorLy8gY29tYm9ib3ggc3R5bGVzCisjZGVmaW5lIFBDQlNfQUxMT1dDVVNUT01URVhUIDB4MDAwMUwKIAotLy9jb21ib2JveCBzdHlsZXMKLSNkZWZpbmUgUENCU19BTExPV0NVU1RPTVRFWFQJCQkJMHgwMDAxTAorLy8gcmljaGVkaXQgc3R5bGVzCisjZGVmaW5lIFBSRVNfTVVMVElMSU5FIDB4MDAwMUwKKyNkZWZpbmUgUFJFU19BVVRPUkVUVVJOIDB4MDAwMkwKKyNkZWZpbmUgUFJFU19BVVRPU0NST0xMIDB4MDAwNEwKKyNkZWZpbmUgUFJFU19TUEVMTENIRUNLIDB4MDAwOEwKKyNkZWZpbmUgUFJFU19VTkRPIDB4MDEwMEwKKyNkZWZpbmUgUFJFU19NVUxUSVBBR0VTIDB4MDIwMEwKKyNkZWZpbmUgUFJFU19URVhUT1ZFUkZMT1cgMHgwNDAwTAogCi0vL3JpY2hlZGl0IHN0eWxlcwotI2RlZmluZSBQUkVTX01VTFRJTElORQkJCQkJCTB4MDAwMUwKLSNkZWZpbmUgUFJFU19BVVRPUkVUVVJOCQkJCQkJMHgwMDAyTAotI2RlZmluZSBQUkVTX0FVVE9TQ1JPTEwJCQkJCQkweDAwMDRMCi0jZGVmaW5lIFBSRVNfU1BFTExDSEVDSwkJCQkJCTB4MDAwOEwKLSNkZWZpbmUgUFJFU19VTkRPCQkJCQkJCTB4MDEwMEwKLSNkZWZpbmUgUFJFU19NVUxUSVBBR0VTCQkJCQkJMHgwMjAwTAotI2RlZmluZSBQUkVTX1RFWFRPVkVSRkxPVwkJCQkJMHgwNDAwTAorLy8gYm9yZGVyIHN0eWxlCisjZGVmaW5lIFBCU19TT0xJRCAwCisjZGVmaW5lIFBCU19EQVNIIDEKKyNkZWZpbmUgUEJTX0JFVkVMRUQgMgorI2RlZmluZSBQQlNfSU5TRVQgMworI2RlZmluZSBQQlNfVU5ERVJMSU5FRCA0CisjZGVmaW5lIFBCU19TSEFET1cgNQogCi0vL2JvcmRlciBzdHlsZQotI2RlZmluZSBQQlNfU09MSUQJCQkJCQkJMAotI2RlZmluZSBQQlNfREFTSAkJCQkJCQkxCi0jZGVmaW5lIFBCU19CRVZFTEVECQkJCQkJCTIKLSNkZWZpbmUgUEJTX0lOU0VUCQkJCQkJCTMKLSNkZWZpbmUgUEJTX1VOREVSTElORUQJCQkJCQk0Ci0jZGVmaW5lIFBCU19TSEFET1cJCQkJCQkJNQorLy8gbm90aWZpY2F0aW9uIG1lc3NhZ2VzCisjZGVmaW5lIFBOTV9BRERDSElMRCAweDAwMDAwMDAwTAorI2RlZmluZSBQTk1fUkVNT1ZFQ0hJTEQgMHgwMDAwMDAwMUwKKyNkZWZpbmUgUE5NX1NFVFNDUk9MTElORk8gMHgwMDAwMDAwMkwKKyNkZWZpbmUgUE5NX1NFVFNDUk9MTFBPUyAweDAwMDAwMDAzTAorI2RlZmluZSBQTk1fU0NST0xMV0lORE9XIDB4MDAwMDAwMDRMCisjZGVmaW5lIFBOTV9MQlVUVE9ORE9XTiAweDAwMDAwMDA1TAorI2RlZmluZSBQTk1fTEJVVFRPTlVQIDB4MDAwMDAwMDZMCisjZGVmaW5lIFBOTV9NT1VTRU1PVkUgMHgwMDAwMDAwN0wKKyNkZWZpbmUgUE5NX05PVEVSRVNFVCAweDAwMDAwMDA4TAorI2RlZmluZSBQTk1fU0VUQ0FSRVRJTkZPIDB4MDAwMDAwMDlMCisjZGVmaW5lIFBOTV9TRUxDSEFOR0VEIDB4MDAwMDAwMEFMCisjZGVmaW5lIFBOTV9OT1RFRURJVENIQU5HRUQgMHgwMDAwMDAwQkwKIAotLy9ub3RpZmljYXRpb24gbWVzc2FnZXMKLSNkZWZpbmUgUE5NX0FERENISUxECQkJCQkJMHgwMDAwMDAwMEwKLSNkZWZpbmUgUE5NX1JFTU9WRUNISUxECQkJCQkJMHgwMDAwMDAwMUwKLSNkZWZpbmUgUE5NX1NFVFNDUk9MTElORk8JCQkJCTB4MDAwMDAwMDJMCi0jZGVmaW5lIFBOTV9TRVRTQ1JPTExQT1MJCQkJCTB4MDAwMDAwMDNMCi0jZGVmaW5lIFBOTV9TQ1JPTExXSU5ET1cJCQkJCTB4MDAwMDAwMDRMCi0jZGVmaW5lIFBOTV9MQlVUVE9ORE9XTgkJCQkJCTB4MDAwMDAwMDVMCi0jZGVmaW5lIFBOTV9MQlVUVE9OVVAJCQkJCQkweDAwMDAwMDA2TAotI2RlZmluZSBQTk1fTU9VU0VNT1ZFCQkJCQkJMHgwMDAwMDAwN0wKLSNkZWZpbmUJUE5NX05PVEVSRVNFVAkJCQkJCTB4MDAwMDAwMDhMCi0jZGVmaW5lIFBOTV9TRVRDQVJFVElORk8JCQkJCTB4MDAwMDAwMDlMCi0jZGVmaW5lIFBOTV9TRUxDSEFOR0VECQkJCQkJMHgwMDAwMDAwQUwKLSNkZWZpbmUJUE5NX05PVEVFRElUQ0hBTkdFRAkJCQkJMHgwMDAwMDAwQkwKKyNkZWZpbmUgUFdMX0NMQVNTTkFNRV9FRElUICJDUFdMX0VkaXQiCiAKLSNkZWZpbmUgUFdMX0NMQVNTTkFNRV9FRElUCQkJCQkiQ1BXTF9FZGl0Igorc3RydWN0IENQV0xfRGFzaCB7CisgIENQV0xfRGFzaChpbnQzMl90IGRhc2gsIGludDMyX3QgZ2FwLCBpbnQzMl90IHBoYXNlKQorICAgICAgOiBuRGFzaChkYXNoKSwgbkdhcChnYXApLCBuUGhhc2UocGhhc2UpIHt9CiAKLXN0cnVjdCBDUFdMX0Rhc2gKLXsKLQlDUFdMX0Rhc2goRlhfSU5UMzIgZGFzaCwgRlhfSU5UMzIgZ2FwLCBGWF9JTlQzMiBwaGFzZSkgOiBuRGFzaChkYXNoKSwgbkdhcChnYXApLCBuUGhhc2UocGhhc2UpCi0Je30KLQotCUZYX0lOVDMyCQkJbkRhc2g7Ci0JRlhfSU5UMzIJCQluR2FwOwotCUZYX0lOVDMyCQkJblBoYXNlOworICBpbnQzMl90IG5EYXNoOworICBpbnQzMl90IG5HYXA7CisgIGludDMyX3QgblBoYXNlOwogfTsKIAotc3RydWN0IFBXTF9DTEFTUyBDUFdMX0NvbG9yCi17Ci0JQ1BXTF9Db2xvcihGWF9JTlQzMiB0eXBlID0gQ09MT1JUWVBFX1RSQU5TUEFSRU5ULCBGWF9GTE9BVCBjb2xvcjEgPSAwLjBmLCBGWF9GTE9BVCBjb2xvcjIgPSAwLjBmLCBGWF9GTE9BVCBjb2xvcjMgPSAwLjBmLCBGWF9GTE9BVCBjb2xvcjQgPSAwLjBmKQotCQk6IG5Db2xvclR5cGUodHlwZSksIGZDb2xvcjEoY29sb3IxKSwgZkNvbG9yMihjb2xvcjIpLCBmQ29sb3IzKGNvbG9yMyksIGZDb2xvcjQoY29sb3I0KQotCXt9CitzdHJ1Y3QgQ1BXTF9Db2xvciB7CisgIENQV0xfQ29sb3IoaW50MzJfdCB0eXBlID0gQ09MT1JUWVBFX1RSQU5TUEFSRU5ULAorICAgICAgICAgICAgIEZYX0ZMT0FUIGNvbG9yMSA9IDAuMGYsCisgICAgICAgICAgICAgRlhfRkxPQVQgY29sb3IyID0gMC4wZiwKKyAgICAgICAgICAgICBGWF9GTE9BVCBjb2xvcjMgPSAwLjBmLAorICAgICAgICAgICAgIEZYX0ZMT0FUIGNvbG9yNCA9IDAuMGYpCisgICAgICA6IG5Db2xvclR5cGUodHlwZSksCisgICAgICAgIGZDb2xvcjEoY29sb3IxKSwKKyAgICAgICAgZkNvbG9yMihjb2xvcjIpLAorICAgICAgICBmQ29sb3IzKGNvbG9yMyksCisgICAgICAgIGZDb2xvcjQoY29sb3I0KSB7fQogCi0JQ1BXTF9Db2xvcihGWF9JTlQzMiByLCBGWF9JTlQzMiBnLCBGWF9JTlQzMiBiKSA6Ci0JCW5Db2xvclR5cGUoQ09MT1JUWVBFX1JHQiksIGZDb2xvcjEoci8yNTUuMGYpLCBmQ29sb3IyKGcvMjU1LjBmKSwgZkNvbG9yMyhiLzI1NS4wZiksIGZDb2xvcjQoMCkKLQl7fQotCQotCXZvaWQgQ29udmVydENvbG9yVHlwZShGWF9JTlQzMiBuQ29sb3JUeXBlKTsKKyAgQ1BXTF9Db2xvcihpbnQzMl90IHIsIGludDMyX3QgZywgaW50MzJfdCBiKQorICAgICAgOiBuQ29sb3JUeXBlKENPTE9SVFlQRV9SR0IpLAorICAgICAgICBmQ29sb3IxKHIgLyAyNTUuMGYpLAorICAgICAgICBmQ29sb3IyKGcgLyAyNTUuMGYpLAorICAgICAgICBmQ29sb3IzKGIgLyAyNTUuMGYpLAorICAgICAgICBmQ29sb3I0KDApIHt9CiAKLQkvKgotCUNPTE9SVFlQRV9UUkFOU1BBUkVOVAotCUNPTE9SVFlQRV9SR0IKLQlDT0xPUlRZUEVfQ01ZSwotCUNPTE9SVFlQRV9HUkFZCi0JKi8KLQlGWF9JTlQzMgkJCQkJbkNvbG9yVHlwZTsgCi0JRlhfRkxPQVQJCQkJCWZDb2xvcjEsZkNvbG9yMixmQ29sb3IzLGZDb2xvcjQ7CisgIHZvaWQgQ29udmVydENvbG9yVHlwZShpbnQzMl90IG90aGVyX25Db2xvclR5cGUpOworCisgIC8qCisgIENPTE9SVFlQRV9UUkFOU1BBUkVOVAorICBDT0xPUlRZUEVfUkdCCisgIENPTE9SVFlQRV9DTVlLCisgIENPTE9SVFlQRV9HUkFZCisgICovCisgIGludDMyX3QgbkNvbG9yVHlwZTsKKyAgRlhfRkxPQVQgZkNvbG9yMSwgZkNvbG9yMiwgZkNvbG9yMywgZkNvbG9yNDsKIH07CiAKLWlubGluZSBGWF9CT09MIG9wZXJhdG9yID09IChjb25zdCBDUFdMX0NvbG9yICZjMSwgY29uc3QgQ1BXTF9Db2xvciAmYzIpCi17Ci0JcmV0dXJuIGMxLm5Db2xvclR5cGUgPT0gYzIubkNvbG9yVHlwZSAmJiAKLQkJYzEuZkNvbG9yMSAtIGMyLmZDb2xvcjEgPCAwLjAwMDEgJiYgYzEuZkNvbG9yMSAtIGMyLmZDb2xvcjEgPiAtMC4wMDAxICYmCi0JCWMxLmZDb2xvcjIgLSBjMi5mQ29sb3IyIDwgMC4wMDAxICYmIGMxLmZDb2xvcjIgLSBjMi5mQ29sb3IyID4gLTAuMDAwMSAmJgotCQljMS5mQ29sb3IzIC0gYzIuZkNvbG9yMyA8IDAuMDAwMSAmJiBjMS5mQ29sb3IzIC0gYzIuZkNvbG9yMyA+IC0wLjAwMDEgJiYKLQkJYzEuZkNvbG9yNCAtIGMyLmZDb2xvcjQgPCAwLjAwMDEgJiYgYzEuZkNvbG9yNCAtIGMyLmZDb2xvcjQgPiAtMC4wMDAxOworaW5saW5lIEZYX0JPT0wgb3BlcmF0b3I9PShjb25zdCBDUFdMX0NvbG9yJiBjMSwgY29uc3QgQ1BXTF9Db2xvciYgYzIpIHsKKyAgcmV0dXJuIGMxLm5Db2xvclR5cGUgPT0gYzIubkNvbG9yVHlwZSAmJiBjMS5mQ29sb3IxIC0gYzIuZkNvbG9yMSA8IDAuMDAwMSAmJgorICAgICAgICAgYzEuZkNvbG9yMSAtIGMyLmZDb2xvcjEgPiAtMC4wMDAxICYmCisgICAgICAgICBjMS5mQ29sb3IyIC0gYzIuZkNvbG9yMiA8IDAuMDAwMSAmJgorICAgICAgICAgYzEuZkNvbG9yMiAtIGMyLmZDb2xvcjIgPiAtMC4wMDAxICYmCisgICAgICAgICBjMS5mQ29sb3IzIC0gYzIuZkNvbG9yMyA8IDAuMDAwMSAmJgorICAgICAgICAgYzEuZkNvbG9yMyAtIGMyLmZDb2xvcjMgPiAtMC4wMDAxICYmCisgICAgICAgICBjMS5mQ29sb3I0IC0gYzIuZkNvbG9yNCA8IDAuMDAwMSAmJiBjMS5mQ29sb3I0IC0gYzIuZkNvbG9yNCA+IC0wLjAwMDE7CiB9CiAKLWlubGluZSBGWF9CT09MIG9wZXJhdG9yICE9IChjb25zdCBDUFdMX0NvbG9yICZjMSwgY29uc3QgQ1BXTF9Db2xvciAmYzIpCi17Ci0JcmV0dXJuICFvcGVyYXRvciA9PSAoYzEsIGMyKTsKK2lubGluZSBGWF9CT09MIG9wZXJhdG9yIT0oY29uc3QgQ1BXTF9Db2xvciYgYzEsIGNvbnN0IENQV0xfQ29sb3ImIGMyKSB7CisgIHJldHVybiAhb3BlcmF0b3I9PShjMSwgYzIpOwogfQogCi0jZGVmaW5lIFBXTF9TQ1JPTExCQVJfV0lEVEgJCQkJCTEyLjBmCi0jZGVmaW5lIFBXTF9TQ1JPTExCQVJfQlVUVE9OX1dJRFRICQkJOS4wZgotI2RlZmluZSBQV0xfU0NST0xMQkFSX1BPU0JVVFRPTl9NSU5XSURUSAkyLjBmCi0jZGVmaW5lIFBXTF9TQ1JPTExCQVJfVFJBTlNQQVJBTkNZCQkJMTUwCi0jZGVmaW5lIFBXTF9TQ1JPTExCQVJfQktDT0xPUgkJCQlDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsMjIwLjBmLzI1NS4wZiwyMjAuMGYvMjU1LjBmLDIyMC4wZi8yNTUuMGYpCi0jZGVmaW5lIFBXTF9ERUZBVUxUX1NFTFRFWFRDT0xPUgkJCUNQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwxLDEsMSkKLSNkZWZpbmUgUFdMX0RFRkFVTFRfU0VMQkFDS0NPTE9SCQkJQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLDAsNTEuMGYvMjU1LjBmLDExMy4wZi8yNTUuMGYpCi0jZGVmaW5lIFBXTF9ERUZBVUxUX0JBQ0tDT0xPUgkJCQlQV0xfREVGQVVMVF9TRUxURVhUQ09MT1IKLSNkZWZpbmUgUFdMX0RFRkFVTFRfVEVYVENPTE9SCQkJCUNQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwwLDAsMCkKLSNkZWZpbmUgUFdMX0RFRkFVTFRfRk9OVFNJWkUJCQkJOS4wZgotI2RlZmluZSBQV0xfREVGQVVMVF9CTEFDS0NPTE9SCQkJCUNQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksMCkKLSNkZWZpbmUgUFdMX0RFRkFVTFRfV0hJVEVDT0xPUgkJCQlDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLDEpCi0jZGVmaW5lIFBXTF9ERUZBVUxUX0hFQVZZR1JBWUNPTE9SCQkJQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwwLjUwKQotI2RlZmluZSBQV0xfREVGQVVMVF9MSUdIVEdSQVlDT0xPUgkJCUNQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksMC43NSkKLSNkZWZpbmUgUFdMX1RSSUFOR0xFX0hBTEZMRU4JCQkJMi4wZgotI2RlZmluZQlQV0xfQ0JCVVRUT05fVFJJQU5HTEVfSEFMRkxFTgkJMy4wZgotI2RlZmluZSBQV0xfSU5WQUxJREFURV9JTkZMQVRFCQkJCTIKKyNkZWZpbmUgUFdMX1NDUk9MTEJBUl9XSURUSCAxMi4wZgorI2RlZmluZSBQV0xfU0NST0xMQkFSX0JVVFRPTl9XSURUSCA5LjBmCisjZGVmaW5lIFBXTF9TQ1JPTExCQVJfUE9TQlVUVE9OX01JTldJRFRIIDIuMGYKKyNkZWZpbmUgUFdMX1NDUk9MTEJBUl9UUkFOU1BBUkFOQ1kgMTUwCisjZGVmaW5lIFBXTF9TQ1JPTExCQVJfQktDT0xPUiBcCisgIENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgMjIwLjBmIC8gMjU1LjBmLCAyMjAuMGYgLyAyNTUuMGYsIDIyMC4wZiAvIDI1NS4wZikKKyNkZWZpbmUgUFdMX0RFRkFVTFRfU0VMVEVYVENPTE9SIENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgMSwgMSwgMSkKKyNkZWZpbmUgUFdMX0RFRkFVTFRfU0VMQkFDS0NPTE9SIFwKKyAgQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLCAwLCA1MS4wZiAvIDI1NS4wZiwgMTEzLjBmIC8gMjU1LjBmKQorI2RlZmluZSBQV0xfREVGQVVMVF9CQUNLQ09MT1IgUFdMX0RFRkFVTFRfU0VMVEVYVENPTE9SCisjZGVmaW5lIFBXTF9ERUZBVUxUX1RFWFRDT0xPUiBDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsIDAsIDAsIDApCisjZGVmaW5lIFBXTF9ERUZBVUxUX0ZPTlRTSVpFIDkuMGYKKyNkZWZpbmUgUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUiBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwKQorI2RlZmluZSBQV0xfREVGQVVMVF9XSElURUNPTE9SIENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDEpCisjZGVmaW5lIFBXTF9ERUZBVUxUX0hFQVZZR1JBWUNPTE9SIENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDAuNTApCisjZGVmaW5lIFBXTF9ERUZBVUxUX0xJR0hUR1JBWUNPTE9SIENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDAuNzUpCisjZGVmaW5lIFBXTF9UUklBTkdMRV9IQUxGTEVOIDIuMGYKKyNkZWZpbmUgUFdMX0NCQlVUVE9OX1RSSUFOR0xFX0hBTEZMRU4gMy4wZgorI2RlZmluZSBQV0xfSU5WQUxJREFURV9JTkZMQVRFIDIKIAotY2xhc3MgSVBXTF9TcGVsbENoZWNrCi17Ci1wdWJsaWM6Ci0gICAgICAgIHZpcnR1YWwgfklQV0xfU3BlbGxDaGVjaygpIHsgfQotCXZpcnR1YWwgRlhfQk9PTAkJCQkJCQlDaGVja1dvcmQoRlhfTFBDU1RSIHNXb3JkKSA9IDA7Ci0JdmlydHVhbCB2b2lkCQkJCQkJCVN1Z2dlc3RXb3JkcyhGWF9MUENTVFIgc1dvcmQsIENGWF9CeXRlU3RyaW5nQXJyYXkgJiBzU3VnZ2VzdCkgPSAwOwkKK2NsYXNzIElQV0xfU3BlbGxDaGVjayB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JUFdMX1NwZWxsQ2hlY2soKSB7fQorICB2aXJ0dWFsIEZYX0JPT0wgQ2hlY2tXb3JkKGNvbnN0IEZYX0NIQVIqIHNXb3JkKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTdWdnZXN0V29yZHMoY29uc3QgRlhfQ0hBUiogc1dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdBcnJheSYgc1N1Z2dlc3QpID0gMDsKIH07CiAKLWNsYXNzIElQV0xfUHJvdmlkZXIKLXsKLXB1YmxpYzoKLSAgICAgICAgdmlydHVhbCB+SVBXTF9Qcm92aWRlcigpIHsgfQorY2xhc3MgSVBXTF9Qcm92aWRlciB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JUFdMX1Byb3ZpZGVyKCkge30KIAotCS8vZ2V0IGEgbWF0cml4IHdoaWNoIG1hcCB1c2VyIHNwYWNlIHRvIENXbmQgY2xpZW50IHNwYWNlCi0JdmlydHVhbCBDUERGX01hdHJpeAkJCQkJCUdldFdpbmRvd01hdHJpeCh2b2lkKiBwQXR0YWNoZWREYXRhKSA9IDA7CisgIC8vIGdldCBhIG1hdHJpeCB3aGljaCBtYXAgdXNlciBzcGFjZSB0byBDV25kIGNsaWVudCBzcGFjZQorICB2aXJ0dWFsIENGWF9NYXRyaXggR2V0V2luZG93TWF0cml4KHZvaWQqIHBBdHRhY2hlZERhdGEpID0gMDsKIAotCS8qCi0JMCBMIiZVbmRvXHRDdHJsK1oiCi0JMSBMIiZSZWRvXHRDdHJsK1NoaWZ0K1oiCi0JMiBMIkN1JnRcdEN0cmwrWCIKLQkzIEwiJkNvcHlcdEN0cmwrQyIKLQk0IEwiJlBhc3RlXHRDdHJsK1YiCi0JNSBMIiZEZWxldGUiCi0JNiAgTCImU2VsZWN0IEFsbFx0Q3RybCtBIgotCSovCi0JdmlydHVhbCBDRlhfV2lkZVN0cmluZwkJCQkJTG9hZFBvcHVwTWVudVN0cmluZyhGWF9JTlQzMiBuSW5kZXgpID0gMDsKKyAgLyoKKyAgMCBMIiZVbmRvXHRDdHJsK1oiCisgIDEgTCImUmVkb1x0Q3RybCtTaGlmdCtaIgorICAyIEwiQ3UmdFx0Q3RybCtYIgorICAzIEwiJkNvcHlcdEN0cmwrQyIKKyAgNCBMIiZQYXN0ZVx0Q3RybCtWIgorICA1IEwiJkRlbGV0ZSIKKyAgNiAgTCImU2VsZWN0IEFsbFx0Q3RybCtBIgorICAqLworICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIExvYWRQb3B1cE1lbnVTdHJpbmcoaW50MzJfdCBuSW5kZXgpID0gMDsKIH07CiAKLWNsYXNzIElQV0xfRm9jdXNIYW5kbGVyCi17Ci1wdWJsaWM6Ci0gICAgICAgIHZpcnR1YWwgfklQV0xfRm9jdXNIYW5kbGVyKCkgeyB9Ci0JdmlydHVhbCB2b2lkCQkJCQkJCU9uU2V0Rm9jdXMoQ1BXTF9XbmQqIHBXbmQpID0gMDsKLQl2aXJ0dWFsIHZvaWQJCQkJCQkJT25LaWxsRm9jdXMoQ1BXTF9XbmQqIHBXbmQpID0gMDsKK2NsYXNzIElQV0xfRm9jdXNIYW5kbGVyIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklQV0xfRm9jdXNIYW5kbGVyKCkge30KKyAgdmlydHVhbCB2b2lkIE9uU2V0Rm9jdXMoQ1BXTF9XbmQqIHBXbmQpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uS2lsbEZvY3VzKENQV0xfV25kKiBwV25kKSA9IDA7CiB9OwogCi1zdHJ1Y3QgUFdMX0NSRUFURVBBUkFNCi17Ci1wdWJsaWM6Ci0JUFdMX0NSRUFURVBBUkFNKCkgOiByY1JlY3RXbmQoMCwwLDAsMCksCi0JCXBTeXN0ZW1IYW5kbGVyKE5VTEwpLAotCQlwRm9udE1hcChOVUxMKSwKLQkJcFByb3ZpZGVyKE5VTEwpLAotCQlwRm9jdXNIYW5kbGVyKE5VTEwpLAotCQlkd0ZsYWdzKDApLAotCQlzQmFja2dyb3VuZENvbG9yKCksCi0JCWhBdHRhY2hlZFduZChOVUxMKSwKLQkJcFNwZWxsQ2hlY2soTlVMTCksCi0JCW5Cb3JkZXJTdHlsZShQQlNfU09MSUQpLAotCQlkd0JvcmRlcldpZHRoKDEpLAotCQlzQm9yZGVyQ29sb3IoKSwKLQkJc1RleHRDb2xvcigpLAotCQlzVGV4dFN0cm9rZUNvbG9yKCksCi0JCW5UcmFuc3BhcmVuY3koMjU1KSwKLQkJZkZvbnRTaXplKFBXTF9ERUZBVUxUX0ZPTlRTSVpFKSwKLQkJc0Rhc2goMywwLDApLAkKLQkJcEF0dGFjaGVkRGF0YShOVUxMKSwKLQkJcFBhcmVudFduZChOVUxMKSwKLQkJcE1zZ0NvbnRyb2woTlVMTCksCi0JCWVDdXJzb3JUeXBlKEZYQ1RfQVJST1cpLAotCQltdENoaWxkKDEsMCwwLDEsMCwwKQotCXsKLQl9CitzdHJ1Y3QgUFdMX0NSRUFURVBBUkFNIHsKKyBwdWJsaWM6CisgIFBXTF9DUkVBVEVQQVJBTSgpCisgICAgICA6IHJjUmVjdFduZCgwLCAwLCAwLCAwKSwKKyAgICAgICAgcFN5c3RlbUhhbmRsZXIoTlVMTCksCisgICAgICAgIHBGb250TWFwKE5VTEwpLAorICAgICAgICBwUHJvdmlkZXIoTlVMTCksCisgICAgICAgIHBGb2N1c0hhbmRsZXIoTlVMTCksCisgICAgICAgIGR3RmxhZ3MoMCksCisgICAgICAgIHNCYWNrZ3JvdW5kQ29sb3IoKSwKKyAgICAgICAgaEF0dGFjaGVkV25kKE5VTEwpLAorICAgICAgICBwU3BlbGxDaGVjayhOVUxMKSwKKyAgICAgICAgbkJvcmRlclN0eWxlKFBCU19TT0xJRCksCisgICAgICAgIGR3Qm9yZGVyV2lkdGgoMSksCisgICAgICAgIHNCb3JkZXJDb2xvcigpLAorICAgICAgICBzVGV4dENvbG9yKCksCisgICAgICAgIHNUZXh0U3Ryb2tlQ29sb3IoKSwKKyAgICAgICAgblRyYW5zcGFyZW5jeSgyNTUpLAorICAgICAgICBmRm9udFNpemUoUFdMX0RFRkFVTFRfRk9OVFNJWkUpLAorICAgICAgICBzRGFzaCgzLCAwLCAwKSwKKyAgICAgICAgcEF0dGFjaGVkRGF0YShOVUxMKSwKKyAgICAgICAgcFBhcmVudFduZChOVUxMKSwKKyAgICAgICAgcE1zZ0NvbnRyb2woTlVMTCksCisgICAgICAgIGVDdXJzb3JUeXBlKEZYQ1RfQVJST1cpLAorICAgICAgICBtdENoaWxkKDEsIDAsIDAsIDEsIDAsIDApIHt9CiAKLQlDUERGX1JlY3QJCQkJcmNSZWN0V25kOwkJCQkvL3JlcXVpcmVkCQotCUlGWF9TeXN0ZW1IYW5kbGVyKgkJcFN5c3RlbUhhbmRsZXI7CQkJLy9yZXF1aXJlZAotCUlGWF9FZGl0X0ZvbnRNYXAqCQlwRm9udE1hcDsJCQkJLy9yZXF1aXJlZCBmb3IgdGV4dCB3aW5kb3cKLQlJUFdMX1Byb3ZpZGVyKgkJCXBQcm92aWRlcjsJCQkJLy9yZXF1aXJlZCBmb3Igc2VsZiBjb29yZGluYXRlCi0JSVBXTF9Gb2N1c0hhbmRsZXIqCQlwRm9jdXNIYW5kbGVyOwkJCS8vb3B0aW9uYWwKLQlGWF9EV09SRAkJCQlkd0ZsYWdzOwkJCQkvL29wdGlvbmFsCi0JQ1BXTF9Db2xvcgkJCQlzQmFja2dyb3VuZENvbG9yOwkJLy9vcHRpb25hbAotCUZYX0hXTkQJCQkJCWhBdHRhY2hlZFduZDsJCQkvL3JlcXVpcmVkIGZvciBuby1yZWFkZXIgZnJhbWV3b3JrCi0JSVBXTF9TcGVsbENoZWNrKgkJcFNwZWxsQ2hlY2s7CQkJLy9yZXF1aXJlZCBmb3Igc3BlbGxjaGVja2luZwotCUZYX0lOVDMyCQkJCW5Cb3JkZXJTdHlsZTsJCQkvL29wdGlvbmFsCi0JRlhfSU5UMzIJCQkJZHdCb3JkZXJXaWR0aDsJCQkvL29wdGlvbmFsCi0JQ1BXTF9Db2xvcgkJCQlzQm9yZGVyQ29sb3I7CQkJLy9vcHRpb25hbAotCUNQV0xfQ29sb3IJCQkJc1RleHRDb2xvcjsJCQkJLy9vcHRpb25hbAotCUNQV0xfQ29sb3IJCQkJc1RleHRTdHJva2VDb2xvcjsJCS8vb3B0aW9uYWwKLQlGWF9JTlQzMgkJCQluVHJhbnNwYXJlbmN5OwkJCS8vb3B0aW9uYWwKLQlGWF9GTE9BVAkJCQlmRm9udFNpemU7CQkJCS8vb3B0aW9uYWwKLQlDUFdMX0Rhc2gJCQkJc0Rhc2g7CQkJCQkvL29wdGlvbmFsCi0Jdm9pZCoJCQkJCXBBdHRhY2hlZERhdGE7CQkJLy9vcHRpb25hbAotCUNQV0xfV25kKgkJCQlwUGFyZW50V25kOwkJCQkvL2lnbm9yZQotCUNQV0xfTXNnQ29udHJvbCoJCXBNc2dDb250cm9sOwkJCS8vaWdub3JlCi0JRlhfSU5UMzIJCQkJZUN1cnNvclR5cGU7CQkJLy9pZ25vcmUKLQlDUERGX01hdHJpeAkJCQltdENoaWxkOwkJCQkvL2lnbm9yZQorICBDUERGX1JlY3QgcmNSZWN0V25kOyAgICAgICAgICAgICAgICAvLyByZXF1aXJlZAorICBJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXI7ICAvLyByZXF1aXJlZAorICBJRlhfRWRpdF9Gb250TWFwKiBwRm9udE1hcDsgICAgICAgICAvLyByZXF1aXJlZCBmb3IgdGV4dCB3aW5kb3cKKyAgSVBXTF9Qcm92aWRlciogcFByb3ZpZGVyOyAgICAgICAgICAgLy8gcmVxdWlyZWQgZm9yIHNlbGYgY29vcmRpbmF0ZQorICBJUFdMX0ZvY3VzSGFuZGxlciogcEZvY3VzSGFuZGxlcjsgICAvLyBvcHRpb25hbAorICBGWF9EV09SRCBkd0ZsYWdzOyAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25hbAorICBDUFdMX0NvbG9yIHNCYWNrZ3JvdW5kQ29sb3I7ICAgICAgICAvLyBvcHRpb25hbAorICBGWF9IV05EIGhBdHRhY2hlZFduZDsgICAgICAgICAgICAgICAvLyByZXF1aXJlZCBmb3Igbm8tcmVhZGVyIGZyYW1ld29yaworICBJUFdMX1NwZWxsQ2hlY2sqIHBTcGVsbENoZWNrOyAgICAgICAvLyByZXF1aXJlZCBmb3Igc3BlbGxjaGVja2luZworICBpbnQzMl90IG5Cb3JkZXJTdHlsZTsgICAgICAgICAgICAgICAvLyBvcHRpb25hbAorICBpbnQzMl90IGR3Qm9yZGVyV2lkdGg7ICAgICAgICAgICAgICAvLyBvcHRpb25hbAorICBDUFdMX0NvbG9yIHNCb3JkZXJDb2xvcjsgICAgICAgICAgICAvLyBvcHRpb25hbAorICBDUFdMX0NvbG9yIHNUZXh0Q29sb3I7ICAgICAgICAgICAgICAvLyBvcHRpb25hbAorICBDUFdMX0NvbG9yIHNUZXh0U3Ryb2tlQ29sb3I7ICAgICAgICAvLyBvcHRpb25hbAorICBpbnQzMl90IG5UcmFuc3BhcmVuY3k7ICAgICAgICAgICAgICAvLyBvcHRpb25hbAorICBGWF9GTE9BVCBmRm9udFNpemU7ICAgICAgICAgICAgICAgICAvLyBvcHRpb25hbAorICBDUFdMX0Rhc2ggc0Rhc2g7ICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25hbAorICB2b2lkKiBwQXR0YWNoZWREYXRhOyAgICAgICAgICAgICAgICAvLyBvcHRpb25hbAorICBDUFdMX1duZCogcFBhcmVudFduZDsgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgQ1BXTF9Nc2dDb250cm9sKiBwTXNnQ29udHJvbDsgICAgICAgLy8gaWdub3JlCisgIGludDMyX3QgZUN1cnNvclR5cGU7ICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICBDRlhfTWF0cml4IG10Q2hpbGQ7ICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKIH07CiAKLWNsYXNzIENQV0xfVGltZXIKLXsKLXB1YmxpYzoKLQlDUFdMX1RpbWVyKENQV0xfVGltZXJIYW5kbGVyKiBwQXR0YWNoZWQsIElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlcik7Ci0JdmlydHVhbCB+Q1BXTF9UaW1lcigpOworY2xhc3MgQ1BXTF9UaW1lciB7CisgcHVibGljOgorICBDUFdMX1RpbWVyKENQV0xfVGltZXJIYW5kbGVyKiBwQXR0YWNoZWQsIElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlcik7CisgIHZpcnR1YWwgfkNQV0xfVGltZXIoKTsKIAotCUZYX0lOVDMyCQkJCQkJCVNldFBXTFRpbWVyKEZYX0lOVDMyIG5FbGFwc2UpOwotCXZvaWQJCQkJCQkJCUtpbGxQV0xUaW1lcigpOwotCXN0YXRpYyB2b2lkIAkJCQkJCVRpbWVyUHJvYyhGWF9JTlQzMiBpZEV2ZW50KTsKKyAgaW50MzJfdCBTZXRQV0xUaW1lcihpbnQzMl90IG5FbGFwc2UpOworICB2b2lkIEtpbGxQV0xUaW1lcigpOworICBzdGF0aWMgdm9pZCBUaW1lclByb2MoaW50MzJfdCBpZEV2ZW50KTsKIAotcHJpdmF0ZToKLQlGWF9JTlQzMgkJCQkJCQltX25UaW1lcklEOwkKLQlDUFdMX1RpbWVySGFuZGxlcioJCQkJCW1fcEF0dGFjaGVkOwotCUlGWF9TeXN0ZW1IYW5kbGVyKgkJCQkJbV9wU3lzdGVtSGFuZGxlcjsKKyBwcml2YXRlOgorICBpbnQzMl90IG1fblRpbWVySUQ7CisgIENQV0xfVGltZXJIYW5kbGVyKiBtX3BBdHRhY2hlZDsKKyAgSUZYX1N5c3RlbUhhbmRsZXIqIG1fcFN5c3RlbUhhbmRsZXI7CiB9OwogCi1jbGFzcyBQV0xfQ0xBU1MgQ1BXTF9UaW1lckhhbmRsZXIKLXsKLXB1YmxpYzoKLQlDUFdMX1RpbWVySGFuZGxlcigpOwotCXZpcnR1YWwgfkNQV0xfVGltZXJIYW5kbGVyKCk7CitjbGFzcyBDUFdMX1RpbWVySGFuZGxlciB7CisgcHVibGljOgorICBDUFdMX1RpbWVySGFuZGxlcigpOworICB2aXJ0dWFsIH5DUFdMX1RpbWVySGFuZGxlcigpOwogCi0Jdm9pZAkJCQkJCQkJQmVnaW5UaW1lcihGWF9JTlQzMiBuRWxhcHNlKTsKLQl2b2lkCQkJCQkJCQlFbmRUaW1lcigpOwotCXZpcnR1YWwgdm9pZAkJCQkJCVRpbWVyUHJvYygpOwotCXZpcnR1YWwgSUZYX1N5c3RlbUhhbmRsZXIqCQkJR2V0U3lzdGVtSGFuZGxlcigpIGNvbnN0ID0gMDsKKyAgdm9pZCBCZWdpblRpbWVyKGludDMyX3QgbkVsYXBzZSk7CisgIHZvaWQgRW5kVGltZXIoKTsKKyAgdmlydHVhbCB2b2lkIFRpbWVyUHJvYygpOworICB2aXJ0dWFsIElGWF9TeXN0ZW1IYW5kbGVyKiBHZXRTeXN0ZW1IYW5kbGVyKCkgY29uc3QgPSAwOwogCi1wcml2YXRlOgotCUNQV0xfVGltZXIqCQkJCQkJCW1fcFRpbWVyOworIHByaXZhdGU6CisgIENQV0xfVGltZXIqIG1fcFRpbWVyOwogfTsKIAotY2xhc3MgUFdMX0NMQVNTIENQV0xfV25kIDogcHVibGljIENQV0xfVGltZXJIYW5kbGVyCi17Ci0JZnJpZW5kIGNsYXNzIENQV0xfTXNnQ29udHJvbDsKLXB1YmxpYzoKLQlDUFdMX1duZCgpOwotCXZpcnR1YWwgfkNQV0xfV25kKCk7CitjbGFzcyBDUFdMX1duZCA6IHB1YmxpYyBDUFdMX1RpbWVySGFuZGxlciB7CisgIGZyaWVuZCBjbGFzcyBDUFdMX01zZ0NvbnRyb2w7CiAKLQl2b2lkCQkJCQkJCUNyZWF0ZShjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCk7Ci0JdmlydHVhbCBDRlhfQnl0ZVN0cmluZwkJCUdldENsYXNzTmFtZSgpIGNvbnN0OwkKLQl2b2lkCQkJCQkJCURlc3Ryb3koKTsKLQl2b2lkCQkJCQkJCU1vdmUoY29uc3QgQ1BERl9SZWN0ICYgcmNOZXcsRlhfQk9PTCBiUmVzZXQsRlhfQk9PTCBiUmVmcmVzaCk7Ci0JdmlydHVhbCB2b2lkCQkJCQlJbnZhbGlkYXRlUmVjdChDUERGX1JlY3QqIHBSZWN0ID0gTlVMTCk7CisgcHVibGljOgorICBDUFdMX1duZCgpOworICB+Q1BXTF9XbmQoKSBvdmVycmlkZTsKIAotCXZvaWQJCQkJCQkJR2V0QXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVN0cmluZyAmIHNBcHBTdHJlYW0pOwotCXZvaWQJCQkJCQkJRHJhd0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7CisgIHZvaWQgQ3JlYXRlKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApOworICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIEdldENsYXNzTmFtZSgpIGNvbnN0OworICB2b2lkIEludmFsaWRhdGVGb2N1c0hhbmRsZXIoSVBXTF9Gb2N1c0hhbmRsZXIqIGhhbmRsZXIpOworICB2b2lkIEludmFsaWRhdGVQcm92aWRlcihJUFdMX1Byb3ZpZGVyKiBwcm92aWRlcik7CisgIHZvaWQgRGVzdHJveSgpOworICB2b2lkIE1vdmUoY29uc3QgQ1BERl9SZWN0JiByY05ldywgRlhfQk9PTCBiUmVzZXQsIEZYX0JPT0wgYlJlZnJlc2gpOworICB2aXJ0dWFsIHZvaWQgSW52YWxpZGF0ZVJlY3QoQ1BERl9SZWN0KiBwUmVjdCA9IE5VTEwpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCQlPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25LZXlVcChGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25MQnV0dG9uRGJsQ2xrKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25NQnV0dG9uRGJsQ2xrKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25NQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uTUJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25SQnV0dG9uRGJsQ2xrKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25SQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKLQl2aXJ0dWFsIEZYX0JPT0wJCQkJCU9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQkJT25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7Ci0JdmlydHVhbCBGWF9CT09MCQkJCQlPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdm9pZCBEcmF3QXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UpOwogCi0JdmlydHVhbCB2b2lkCQkJCQlTZXRGb2N1cygpOwotCXZpcnR1YWwgdm9pZAkJCQkJS2lsbEZvY3VzKCk7Ci0Jdm9pZAkJCQkJCQlTZXRDYXB0dXJlKCk7Ci0Jdm9pZAkJCQkJCQlSZWxlYXNlQ2FwdHVyZSgpOworICB2aXJ0dWFsIEZYX0JPT0wgT25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uS2V5VXAoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpOworICB2aXJ0dWFsIEZYX0JPT0wgT25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRibENsayhjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uTUJ1dHRvbkRibENsayhjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworICB2aXJ0dWFsIEZYX0JPT0wgT25NQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworICB2aXJ0dWFsIEZYX0JPT0wgT25NQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKTsKKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZyk7CisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpOworICB2aXJ0dWFsIEZYX0JPT0wgT25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZyk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJCU9uTm90aWZ5KENQV0xfV25kKiBwV25kLCBGWF9EV09SRCBtc2csIEZYX0lOVFBUUiB3UGFyYW0gPSAwLCBGWF9JTlRQVFIgbFBhcmFtID0gMCk7Ci0JdmlydHVhbCB2b2lkCQkJCQlTZXRUZXh0Q29sb3IoY29uc3QgQ1BXTF9Db2xvciAmIGNvbG9yKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCVNldFRleHRTdHJva2VDb2xvcihjb25zdCBDUFdMX0NvbG9yICYgY29sb3IpOwotCXZpcnR1YWwgdm9pZAkJCQkJU2V0VmlzaWJsZShGWF9CT09MIGJWaXNpYmxlKTsKKyAgdmlydHVhbCB2b2lkIFNldEZvY3VzKCk7CisgIHZpcnR1YWwgdm9pZCBLaWxsRm9jdXMoKTsKKyAgdm9pZCBTZXRDYXB0dXJlKCk7CisgIHZvaWQgUmVsZWFzZUNhcHR1cmUoKTsKIAotCXZpcnR1YWwgQ1BERl9SZWN0CQkJCUdldEZvY3VzUmVjdCgpIGNvbnN0OwotCXZpcnR1YWwgQ1BXTF9Db2xvcgkJCQlHZXRCYWNrZ3JvdW5kQ29sb3IoKSBjb25zdDsKLQl2aXJ0dWFsIENQV0xfQ29sb3IJCQkJR2V0Qm9yZGVyQ29sb3IoKSBjb25zdDsKLQl2aXJ0dWFsIENQV0xfQ29sb3IJCQkJR2V0VGV4dENvbG9yKCkgY29uc3Q7Ci0JdmlydHVhbCBDUFdMX0NvbG9yCQkJCUdldFRleHRTdHJva2VDb2xvcigpIGNvbnN0OwotCXZpcnR1YWwgRlhfRkxPQVQJCQkJR2V0Rm9udFNpemUoKSBjb25zdDsKLQl2aXJ0dWFsIEZYX0lOVDMyCQkJCUdldElubmVyQm9yZGVyV2lkdGgoKSBjb25zdDsKLQl2aXJ0dWFsIENQV0xfQ29sb3IJCQkJR2V0Qm9yZGVyTGVmdFRvcENvbG9yKEZYX0lOVDMyIG5Cb3JkZXJTdHlsZSkgY29uc3Q7Ci0JdmlydHVhbCBDUFdMX0NvbG9yCQkJCUdldEJvcmRlclJpZ2h0Qm90dG9tQ29sb3IoRlhfSU5UMzIgbkJvcmRlclN0eWxlKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIE9uTm90aWZ5KENQV0xfV25kKiBwV25kLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3Qgd1BhcmFtID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IGxQYXJhbSA9IDApOworICB2aXJ0dWFsIHZvaWQgU2V0VGV4dENvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKTsKKyAgdmlydHVhbCB2b2lkIFNldFRleHRTdHJva2VDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcik7CisgIHZpcnR1YWwgdm9pZCBTZXRWaXNpYmxlKEZYX0JPT0wgYlZpc2libGUpOwogCi0JdmlydHVhbCBGWF9CT09MCQkJCQlJc01vZGlmaWVkKCkgY29uc3Qge3JldHVybiBGQUxTRTt9CisgIHZpcnR1YWwgQ1BERl9SZWN0IEdldEZvY3VzUmVjdCgpIGNvbnN0OworICB2aXJ0dWFsIENQV0xfQ29sb3IgR2V0QmFja2dyb3VuZENvbG9yKCkgY29uc3Q7CisgIHZpcnR1YWwgQ1BXTF9Db2xvciBHZXRCb3JkZXJDb2xvcigpIGNvbnN0OworICB2aXJ0dWFsIENQV0xfQ29sb3IgR2V0VGV4dENvbG9yKCkgY29uc3Q7CisgIHZpcnR1YWwgQ1BXTF9Db2xvciBHZXRUZXh0U3Ryb2tlQ29sb3IoKSBjb25zdDsKKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRGb250U2l6ZSgpIGNvbnN0OworICB2aXJ0dWFsIGludDMyX3QgR2V0SW5uZXJCb3JkZXJXaWR0aCgpIGNvbnN0OworICB2aXJ0dWFsIENQV0xfQ29sb3IgR2V0Qm9yZGVyTGVmdFRvcENvbG9yKGludDMyX3QgbkJvcmRlclN0eWxlKSBjb25zdDsKKyAgdmlydHVhbCBDUFdMX0NvbG9yIEdldEJvcmRlclJpZ2h0Qm90dG9tQ29sb3IoaW50MzJfdCBuQm9yZGVyU3R5bGUpIGNvbnN0OwogCi0JdmlydHVhbCB2b2lkCQkJCQlTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpOwkKKyAgdmlydHVhbCB2b2lkIFNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSk7CiAKLQl2b2lkCQkJCQkJCVNldEJhY2tncm91bmRDb2xvcihjb25zdCBDUFdMX0NvbG9yICYgY29sb3IpOwkJCi0Jdm9pZAkJCQkJCQlTZXRCb3JkZXJDb2xvcihjb25zdCBDUFdMX0NvbG9yICYgY29sb3IpOwotCXZvaWQJCQkJCQkJU2V0Qm9yZGVyV2lkdGgoRlhfSU5UMzIgbkJvcmRlcldpZHRoKTsKLQl2b2lkCQkJCQkJCVNldENsaXBSZWN0KGNvbnN0IENQREZfUmVjdCAmIHJlY3QpOwotCXZvaWQJCQkJCQkJU2V0Qm9yZGVyU3R5bGUoRlhfSU5UMzIgZUJvcmRlclN0eWxlKTsJCi0Jdm9pZAkJCQkJCQlTZXRCb3JkZXJEYXNoKGNvbnN0IENQV0xfRGFzaCAmIHNEYXNoKTsKKyAgdm9pZCBTZXRCYWNrZ3JvdW5kQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOworICB2b2lkIFNldENsaXBSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdCk7CisgIHZvaWQgU2V0Qm9yZGVyU3R5bGUoaW50MzJfdCBlQm9yZGVyU3R5bGUpOwogCi0JQ1BERl9SZWN0CQkJCQkJR2V0T3JpZ2luV2luZG93UmVjdCgpIGNvbnN0OwotCXZpcnR1YWwgQ1BERl9SZWN0CQkJCUdldFdpbmRvd1JlY3QoKSBjb25zdDsKLQl2aXJ0dWFsIENQREZfUmVjdAkJCQlHZXRDbGllbnRSZWN0KCkgY29uc3Q7Ci0JQ1BERl9Qb2ludAkJCQkJCUdldENlbnRlclBvaW50KCkgY29uc3Q7Ci0JQ1BERl9SZWN0CQkJCQkJR2V0Q2xpZW50Q2VudGVyU3F1YXJlKCkgY29uc3Q7Ci0JQ1BERl9SZWN0CQkJCQkJR2V0V2luZG93Q2VudGVyU3F1YXJlKCkgY29uc3Q7CQkKLQlGWF9JTlQzMgkJCQkJCUdldEJvcmRlcldpZHRoKCkgY29uc3Q7CQkKLQlGWF9CT09MCQkJCQkJCUlzVmlzaWJsZSgpIGNvbnN0IHtyZXR1cm4gbV9iVmlzaWJsZTt9CQotCUZYX0JPT0wJCQkJCQkJSGFzRmxhZyhGWF9EV09SRCBkd0ZsYWdzKSBjb25zdDsKLQl2b2lkCQkJCQkJCUFkZEZsYWcoRlhfRFdPUkQgZHdGbGFncyk7Ci0Jdm9pZAkJCQkJCQlSZW1vdmVGbGFnKEZYX0RXT1JEIGR3RmxhZ3MpOwotCUNQREZfUmVjdAkJCQkJCUdldENsaXBSZWN0KCkgY29uc3Q7CQkKLQlDUFdMX1duZCoJCQkJCQlHZXRQYXJlbnRXaW5kb3coKSBjb25zdDsJCQotCUZYX0lOVDMyCQkJCQkJR2V0Qm9yZGVyU3R5bGUoKSBjb25zdDsJCi0JQ1BXTF9EYXNoCQkJCQkJR2V0Qm9yZGVyRGFzaCgpIGNvbnN0OwotCXZvaWQqCQkJCQkJCUdldEF0dGFjaGVkRGF0YSgpIGNvbnN0OwotCQotCUZYX0JPT0wJCQkJCQkJV25kSGl0VGVzdChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJQ2xpZW50SGl0VGVzdChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJSXNDYXB0dXJlTW91c2UoKSBjb25zdDsKKyAgdmlydHVhbCBDUERGX1JlY3QgR2V0V2luZG93UmVjdCgpIGNvbnN0OworICB2aXJ0dWFsIENQREZfUmVjdCBHZXRDbGllbnRSZWN0KCkgY29uc3Q7CisgIENQREZfUG9pbnQgR2V0Q2VudGVyUG9pbnQoKSBjb25zdDsKKyAgaW50MzJfdCBHZXRCb3JkZXJXaWR0aCgpIGNvbnN0OworICBGWF9CT09MIElzVmlzaWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1fYlZpc2libGU7IH0KKyAgRlhfQk9PTCBIYXNGbGFnKEZYX0RXT1JEIGR3RmxhZ3MpIGNvbnN0OworICB2b2lkIEFkZEZsYWcoRlhfRFdPUkQgZHdGbGFncyk7CisgIHZvaWQgUmVtb3ZlRmxhZyhGWF9EV09SRCBkd0ZsYWdzKTsKKyAgY29uc3QgQ1BERl9SZWN0JiBHZXRDbGlwUmVjdCgpIGNvbnN0OworICBDUFdMX1duZCogR2V0UGFyZW50V2luZG93KCkgY29uc3Q7CisgIGludDMyX3QgR2V0Qm9yZGVyU3R5bGUoKSBjb25zdDsKKyAgY29uc3QgQ1BXTF9EYXNoJiBHZXRCb3JkZXJEYXNoKCkgY29uc3Q7CisgIHZvaWQqIEdldEF0dGFjaGVkRGF0YSgpIGNvbnN0OwogCi0JY29uc3QgQ1BXTF9XbmQqCQkJCQlHZXRGb2N1c2VkKCkgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlJc0ZvY3VzZWQoKSBjb25zdDsKLQlGWF9CT09MCQkJCQkJCUlzUmVhZE9ubHkoKSBjb25zdDsKLQlDUFdMX1Njcm9sbEJhcioJCQkJCUdldFZTY3JvbGxCYXIoKSBjb25zdDsKKyAgRlhfQk9PTCBXbmRIaXRUZXN0KGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdDsKKyAgRlhfQk9PTCBDbGllbnRIaXRUZXN0KGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdDsKKyAgRlhfQk9PTCBJc0NhcHR1cmVNb3VzZSgpIGNvbnN0OwogCi0JSUZYX0VkaXRfRm9udE1hcCoJCQkJR2V0Rm9udE1hcCgpIGNvbnN0OwotCUlQV0xfUHJvdmlkZXIqCQkJCQlHZXRQcm92aWRlcigpIGNvbnN0OwotCXZpcnR1YWwgSUZYX1N5c3RlbUhhbmRsZXIqCQlHZXRTeXN0ZW1IYW5kbGVyKCkgY29uc3Q7Ci0JSVBXTF9Gb2N1c0hhbmRsZXIqCQkJCUdldEZvY3VzSGFuZGxlcigpIGNvbnN0OwotCQotCUZYX0lOVDMyCQkJCQkJR2V0VHJhbnNwYXJlbmN5KCk7Ci0Jdm9pZAkJCQkJCQlTZXRUcmFuc3BhcmVuY3koRlhfSU5UMzIgblRyYW5zcGFyZW5jeSk7CisgIGNvbnN0IENQV0xfV25kKiBHZXRGb2N1c2VkKCkgY29uc3Q7CisgIEZYX0JPT0wgSXNGb2N1c2VkKCkgY29uc3Q7CisgIEZYX0JPT0wgSXNSZWFkT25seSgpIGNvbnN0OworICBDUFdMX1Njcm9sbEJhciogR2V0VlNjcm9sbEJhcigpIGNvbnN0OwogCi0JQ1BERl9NYXRyaXgJCQkJCQlHZXRDaGlsZFRvUm9vdCgpIGNvbnN0OwotCUNQREZfTWF0cml4CQkJCQkJR2V0Q2hpbGRNYXRyaXgoKSBjb25zdDsKLQl2b2lkCQkJCQkJCVNldENoaWxkTWF0cml4KGNvbnN0IENQREZfTWF0cml4JiBtdCk7Ci0JQ1BERl9NYXRyaXgJCQkJCQlHZXRXaW5kb3dNYXRyaXgoKSBjb25zdDsKKyAgSUZYX0VkaXRfRm9udE1hcCogR2V0Rm9udE1hcCgpIGNvbnN0OworICBJUFdMX1Byb3ZpZGVyKiBHZXRQcm92aWRlcigpIGNvbnN0OworICBJUFdMX0ZvY3VzSGFuZGxlciogR2V0Rm9jdXNIYW5kbGVyKCkgY29uc3Q7CiAKLQl2aXJ0dWFsIENQREZfUG9pbnQJCQkJQ2hpbGRUb1BhcmVudChjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3Q7Ci0JdmlydHVhbCBDUERGX1JlY3QJCQkJQ2hpbGRUb1BhcmVudChjb25zdCBDUERGX1JlY3QmIHJlY3QpIGNvbnN0OwotCXZpcnR1YWwgQ1BERl9Qb2ludAkJCQlQYXJlbnRUb0NoaWxkKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdDsKLQl2aXJ0dWFsIENQREZfUmVjdAkJCQlQYXJlbnRUb0NoaWxkKGNvbnN0IENQREZfUmVjdCYgcmVjdCkgY29uc3Q7CisgIGludDMyX3QgR2V0VHJhbnNwYXJlbmN5KCk7CisgIHZvaWQgU2V0VHJhbnNwYXJlbmN5KGludDMyX3QgblRyYW5zcGFyZW5jeSk7CiAKLQkvL3Rob3NlIG1ldGhvZHMgb25seSBpbXBsZW1lbnRlZCBieSBsaXN0Y3RybCBpdGVtCi0JdmlydHVhbCBGWF9GTE9BVAkJCQlHZXRJdGVtSGVpZ2h0KEZYX0ZMT0FUIGZMaW1pdFdpZHRoKSB7cmV0dXJuIDA7fSAKLQl2aXJ0dWFsIEZYX0ZMT0FUCQkJCUdldEl0ZW1MZWZ0TWFyZ2luKCkge3JldHVybiAwO30gCi0JdmlydHVhbCBGWF9GTE9BVAkJCQlHZXRJdGVtUmlnaHRNYXJnaW4oKSB7cmV0dXJuIDA7fSAKKyAgQ0ZYX01hdHJpeCBHZXRDaGlsZFRvUm9vdCgpIGNvbnN0OworICBDRlhfTWF0cml4IEdldENoaWxkTWF0cml4KCkgY29uc3Q7CisgIHZvaWQgU2V0Q2hpbGRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCYgbXQpOworICBDRlhfTWF0cml4IEdldFdpbmRvd01hdHJpeCgpIGNvbnN0OwogCi0Jdm9pZAkJCQkJCQlFbmFibGVXaW5kb3coRlhfQk9PTCBiRW5hYmxlKTsKLQlGWF9CT09MCQkJCQkJCUlzRW5hYmxlZCgpOwotCXZpcnR1YWwgdm9pZAkJCQkJU2V0Q3Vyc29yKCk7CisgIHZpcnR1YWwgQ1BERl9Qb2ludCBDaGlsZFRvUGFyZW50KGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdDsKKyAgdmlydHVhbCBDUERGX1JlY3QgQ2hpbGRUb1BhcmVudChjb25zdCBDUERGX1JlY3QmIHJlY3QpIGNvbnN0OworICB2aXJ0dWFsIENQREZfUG9pbnQgUGFyZW50VG9DaGlsZChjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3Q7CisgIHZpcnR1YWwgQ1BERl9SZWN0IFBhcmVudFRvQ2hpbGQoY29uc3QgQ1BERl9SZWN0JiByZWN0KSBjb25zdDsKIAotcHJvdGVjdGVkOgkKLQl2aXJ0dWFsIHZvaWQJCQkJCUNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCVJlUG9zQ2hpbGRXbmQoKTsKLQl2b2lkCQkJCQkJCUdldEFwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSk7Ci0JdmlydHVhbCB2b2lkCQkJCQlHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCUdldENoaWxkQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKTsKKyAgLy8gdGhvc2UgbWV0aG9kcyBvbmx5IGltcGxlbWVudGVkIGJ5IGxpc3RjdHJsIGl0ZW0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRJdGVtSGVpZ2h0KEZYX0ZMT0FUIGZMaW1pdFdpZHRoKSB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0SXRlbUxlZnRNYXJnaW4oKSB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0SXRlbVJpZ2h0TWFyZ2luKCkgeyByZXR1cm4gMDsgfQogCi0JdmlydHVhbCB2b2lkCQkJCQlEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSk7Ci0JdmlydHVhbCB2b2lkCQkJCQlEcmF3Q2hpbGRBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpOworICB2b2lkIEVuYWJsZVdpbmRvdyhGWF9CT09MIGJFbmFibGUpOworICBGWF9CT09MIElzRW5hYmxlZCgpOworICB2aXJ0dWFsIHZvaWQgU2V0Q3Vyc29yKCk7CiAKLQl2aXJ0dWFsIHZvaWQJCQkJCU9uQ3JlYXRlKFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCU9uQ3JlYXRlZCgpOwotCXZpcnR1YWwgdm9pZAkJCQkJT25EZXN0cm95KCk7CisgcHJvdGVjdGVkOgorICAvLyBDUFdMX1RpbWVySGFuZGxlcgorICBJRlhfU3lzdGVtSGFuZGxlciogR2V0U3lzdGVtSGFuZGxlcigpIGNvbnN0IG92ZXJyaWRlOwogCi0JdmlydHVhbCB2b2lkCQkJCQlPblNldEZvY3VzKCk7Ci0JdmlydHVhbCB2b2lkCQkJCQlPbktpbGxGb2N1cygpOworICB2aXJ0dWFsIHZvaWQgQ3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCk7CisgIHZpcnR1YWwgdm9pZCBSZVBvc0NoaWxkV25kKCk7CisgIHZvaWQgR2V0QXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYmIHNBcHBTdHJlYW0pOworICB2aXJ0dWFsIHZvaWQgR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmJiBzQXBwU3RyZWFtKTsKKyAgdmlydHVhbCB2b2lkIEdldENoaWxkQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYmIHNBcHBTdHJlYW0pOwogCi0JdmlydHVhbCB2b2lkCQkJCQlPbkVuYWJsZWQoKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCU9uRGlzYWJsZWQoKTsKKyAgdmlydHVhbCB2b2lkIERyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSk7CisgIHZpcnR1YWwgdm9pZCBEcmF3Q2hpbGRBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSk7CiAKLQl2b2lkCQkJCQkJCVNldE5vdGlmeUZsYWcoRlhfQk9PTCBiTm90aWZ5aW5nID0gVFJVRSl7bV9iTm90aWZ5aW5nID0gYk5vdGlmeWluZzt9OwotIAotCUZYX0JPT0wJCQkJCQkJSXNWYWxpZCgpIGNvbnN0OwotCVBXTF9DUkVBVEVQQVJBTQkJCQkJR2V0Q3JlYXRpb25QYXJhbSgpIGNvbnN0OwkJCi0JRlhfQk9PTAkJCQkJCQlJc05vdGlmeWluZygpIGNvbnN0IHtyZXR1cm4gbV9iTm90aWZ5aW5nO30JCi0JCi0Jdm9pZAkJCQkJCQlJbnZhbGlkYXRlUmVjdE1vdmUoY29uc3QgQ1BERl9SZWN0ICYgcmNPbGQsIGNvbnN0IENQREZfUmVjdCAmIHJjTmV3KTsKKyAgdmlydHVhbCB2b2lkIE9uQ3JlYXRlKFBXTF9DUkVBVEVQQVJBTSYgY3ApOworICB2aXJ0dWFsIHZvaWQgT25DcmVhdGVkKCk7CisgIHZpcnR1YWwgdm9pZCBPbkRlc3Ryb3koKTsKIAotCXZvaWQJCQkJCQkJUFdMdG9XbmQoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9JTlQzMiYgeCwgRlhfSU5UMzImIHkpIGNvbnN0OwotCUZYX1JFQ1QJCQkJCQkJUFdMdG9XbmQoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkgY29uc3Q7CQotCUZYX0hXTkQJCQkJCQkJR2V0QXR0YWNoZWRIV25kKCkgY29uc3Q7Ci0JCi0JRlhfQk9PTAkJCQkJCQlJc1duZENhcHR1cmVNb3VzZShjb25zdCBDUFdMX1duZCAqIHBXbmQpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJSXNXbmRDYXB0dXJlS2V5Ym9hcmQoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdDsJCi0JY29uc3QgQ1BXTF9XbmQqCQkJCQlHZXRSb290V25kKCkgY29uc3Q7CQorICB2aXJ0dWFsIHZvaWQgT25TZXRGb2N1cygpOworICB2aXJ0dWFsIHZvaWQgT25LaWxsRm9jdXMoKTsKIAotCUZYX0JPT0wJCQkJCQkJSXNDVFJMcHJlc3NlZChGWF9EV09SRCBuRmxhZykgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlJc1NISUZUcHJlc3NlZChGWF9EV09SRCBuRmxhZykgY29uc3Q7Ci0JRlhfQk9PTAkJCQkJCQlJc0FMVHByZXNzZWQoRlhfRFdPUkQgbkZsYWcpIGNvbnN0OwotCUZYX0JPT0wJCQkJCQkJSXNJTlNFUlRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIE9uRW5hYmxlZCgpOworICB2aXJ0dWFsIHZvaWQgT25EaXNhYmxlZCgpOwogCi1wcml2YXRlOgotCXZvaWQJCQkJCQkJQWRkQ2hpbGQoQ1BXTF9XbmQgKiBwV25kKTsKLQl2b2lkCQkJCQkJCVJlbW92ZUNoaWxkKENQV0xfV25kICogcFduZCk7CisgIHZvaWQgU2V0Tm90aWZ5RmxhZyhGWF9CT09MIGJOb3RpZnlpbmcgPSBUUlVFKSB7IG1fYk5vdGlmeWluZyA9IGJOb3RpZnlpbmc7IH0KIAotCXZvaWQJCQkJCQkJQ3JlYXRlU2Nyb2xsQmFyKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKTsKLQl2b2lkCQkJCQkJCUNyZWF0ZVZTY3JvbGxCYXIoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApOwkKKyAgRlhfQk9PTCBJc1ZhbGlkKCkgY29uc3Q7CisgIGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgR2V0Q3JlYXRpb25QYXJhbSgpIGNvbnN0OworICBGWF9CT09MIElzTm90aWZ5aW5nKCkgY29uc3QgeyByZXR1cm4gbV9iTm90aWZ5aW5nOyB9CiAKLQl2b2lkCQkJCQkJCUFqdXN0U3R5bGUoKTsJCi0Jdm9pZAkJCQkJCQlDcmVhdGVNc2dDb250cm9sKCk7Ci0Jdm9pZAkJCQkJCQlEZXN0cm95TXNnQ29udHJvbCgpOwotCQotCUNQV0xfTXNnQ29udHJvbCoJCQkJR2V0TXNnQ29udHJvbCgpIGNvbnN0OwkKLQkKLXByb3RlY3RlZDoKLQlDRlhfQXJyYXlUZW1wbGF0ZTxDUFdMX1duZCo+CW1fYUNoaWxkcmVuOworICB2b2lkIEludmFsaWRhdGVSZWN0TW92ZShjb25zdCBDUERGX1JlY3QmIHJjT2xkLCBjb25zdCBDUERGX1JlY3QmIHJjTmV3KTsKIAotcHJpdmF0ZToKLQlQV0xfQ1JFQVRFUEFSQU0JCQkJCW1fc1ByaXZhdGVQYXJhbTsKLQkKLQlDUFdMX1Njcm9sbEJhcioJCQkJCW1fcFZTY3JvbGxCYXI7CisgIHZvaWQgUFdMdG9XbmQoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIGludDMyX3QmIHgsIGludDMyX3QmIHkpIGNvbnN0OworICBGWF9SRUNUIFBXTHRvV25kKGNvbnN0IENQREZfUmVjdCYgcmVjdCkgY29uc3Q7CisgIEZYX0hXTkQgR2V0QXR0YWNoZWRIV25kKCkgY29uc3Q7CiAKLQlDUERGX1JlY3QJCQkJCQltX3JjV2luZG93OwotCUNQREZfUmVjdAkJCQkJCW1fcmNDbGlwOworICBGWF9CT09MIElzV25kQ2FwdHVyZU1vdXNlKGNvbnN0IENQV0xfV25kKiBwV25kKSBjb25zdDsKKyAgRlhfQk9PTCBJc1duZENhcHR1cmVLZXlib2FyZChjb25zdCBDUFdMX1duZCogcFduZCkgY29uc3Q7CisgIGNvbnN0IENQV0xfV25kKiBHZXRSb290V25kKCkgY29uc3Q7CiAKLQlGWF9CT09MCQkJCQkJCW1fYkNyZWF0ZWQ7CQkJCi0JRlhfQk9PTAkJCQkJCQltX2JWaXNpYmxlOwotCUZYX0JPT0wJCQkJCQkJbV9iTm90aWZ5aW5nOwkKLQlGWF9CT09MCQkJCQkJCW1fYkVuYWJsZWQ7CisgIEZYX0JPT0wgSXNDVFJMcHJlc3NlZChGWF9EV09SRCBuRmxhZykgY29uc3Q7CisgIEZYX0JPT0wgSXNTSElGVHByZXNzZWQoRlhfRFdPUkQgbkZsYWcpIGNvbnN0OworICBGWF9CT09MIElzQUxUcHJlc3NlZChGWF9EV09SRCBuRmxhZykgY29uc3Q7CisgIEZYX0JPT0wgSXNJTlNFUlRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdDsKKworIHByaXZhdGU6CisgIHZvaWQgQWRkQ2hpbGQoQ1BXTF9XbmQqIHBXbmQpOworICB2b2lkIFJlbW92ZUNoaWxkKENQV0xfV25kKiBwV25kKTsKKworICB2b2lkIENyZWF0ZVNjcm9sbEJhcihjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKTsKKyAgdm9pZCBDcmVhdGVWU2Nyb2xsQmFyKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApOworCisgIHZvaWQgQWRqdXN0U3R5bGUoKTsKKyAgdm9pZCBDcmVhdGVNc2dDb250cm9sKCk7CisgIHZvaWQgRGVzdHJveU1zZ0NvbnRyb2woKTsKKworICBDUFdMX01zZ0NvbnRyb2wqIEdldE1zZ0NvbnRyb2woKSBjb25zdDsKKworIHByb3RlY3RlZDoKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BXTF9XbmQqPiBtX2FDaGlsZHJlbjsKKworIHByaXZhdGU6CisgIFBXTF9DUkVBVEVQQVJBTSBtX3NQcml2YXRlUGFyYW07CisKKyAgQ1BXTF9TY3JvbGxCYXIqIG1fcFZTY3JvbGxCYXI7CisKKyAgQ1BERl9SZWN0IG1fcmNXaW5kb3c7CisgIENQREZfUmVjdCBtX3JjQ2xpcDsKKworICBGWF9CT09MIG1fYkNyZWF0ZWQ7CisgIEZYX0JPT0wgbV9iVmlzaWJsZTsKKyAgRlhfQk9PTCBtX2JOb3RpZnlpbmc7CisgIEZYX0JPT0wgbV9iRW5hYmxlZDsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19JTkNMVURFX1BERldJTkRPV19QV0xfV05EX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3BkZml1bS5tayBiL2ZwZGZzZGsvcGRmaXVtLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZGM3ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL3BkZml1bS5tawpAQCAtMCwwICsxLDY5IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJwZGZpdW0KKworTE9DQUxfQVJNX01PREUgOj0gYXJtCitMT0NBTF9OREtfU1RMX1ZBUklBTlQgOj0gZ251c3RsX3N0YXRpYworCitMT0NBTF9DRkxBR1MgKz0gLU8zIC1mc3RyaWN0LWFsaWFzaW5nIC1mcHJlZmV0Y2gtbG9vcC1hcnJheXMgLWZleGNlcHRpb25zCitMT0NBTF9DRkxBR1MgKz0gLVduby1ub24tdmlydHVhbC1kdG9yIC1XYWxsIC1ET1BKX1NUQVRJQyBcCisgICAgICAgICAgICAgICAgLURWOF9ERVBSRUNBVElPTl9XQVJOSU5HUyAtRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCisKKyMgTWFzayBzb21lIHdhcm5pbmdzLiBUaGVzZSBhcmUgYmVuaWduLCBidXQgd2UgcHJvYmFibHkgd2FudCB0byBmaXggdGhlbQorIyB1cHN0cmVhbSBhdCBzb21lIHBvaW50LgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tc2lnbi1jb21wYXJlIC1Xbm8tdW51c2VkLXBhcmFtZXRlcgorTE9DQUxfQ0xBTkdfQ0ZMQUdTICs9IC1Xbm8tc2lnbi1jb21wYXJlCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlicGRmaXVtZm9ybWZpbGxlciBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnBkZml1bXBkZndpbmRvdyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnBkZml1bWphdmFzY3JpcHQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJwZGZpdW1mcGRmYXBpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicGRmaXVtZnhnZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnBkZml1bWZ4ZWRpdCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnBkZml1bWZwZGZ0ZXh0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicGRmaXVtZnhjcnQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJwZGZpdW1meGNvZGVjIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicGRmaXVtZnBkZmRvYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnBkZml1bWZkcm0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJwZGZpdW1hZ2cyMyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnBkZml1bWJpZ2ludCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnBkZml1bWxjbXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJwZGZpdW1qcGVnIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicGRmaXVtb3BlbmpwZWcgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJwZGZpdW16bGliCisKKworIyBUT0RPOiBmaWd1cmUgb3V0IHdoeSB0dXJuaW5nIG9uIGV4Y2VwdGlvbnMgcmVxdWlyZXMgbWFudWFsbHkgbGlua2luZyBsaWJkbAorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJkbCBsaWJmdDIKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBzcmMvZnBkZl9kYXRhYXZhaWwuY3BwIFwKKyAgICBzcmMvZnBkZl9leHQuY3BwIFwKKyAgICBzcmMvZnBkZl9mbGF0dGVuLmNwcCBcCisgICAgc3JjL2ZwZGZfcHJvZ3Jlc3NpdmUuY3BwIFwKKyAgICBzcmMvZnBkZl9zZWFyY2hleC5jcHAgXAorICAgIHNyYy9mcGRmX3N5c2ZvbnRpbmZvLmNwcCBcCisgICAgc3JjL2ZwZGZfdHJhbnNmb3JtcGFnZS5jcHAgXAorICAgIHNyYy9mcGRmZG9jLmNwcCBcCisgICAgc3JjL2ZwZGZlZGl0aW1nLmNwcCBcCisgICAgc3JjL2ZwZGZlZGl0cGFnZS5jcHAgXAorICAgIHNyYy9mcGRmZm9ybWZpbGwuY3BwIFwKKyAgICBzcmMvZnBkZnBwby5jcHAgXAorICAgIHNyYy9mcGRmc2F2ZS5jcHAgXAorICAgIHNyYy9mcGRmdGV4dC5jcHAgXAorICAgIHNyYy9mcGRmdmlldy5jcHAgXAorICAgIHNyYy9mc2RrX2FjdGlvbmhhbmRsZXIuY3BwIFwKKyAgICBzcmMvZnNka19hbm5vdGhhbmRsZXIuY3BwIFwKKyAgICBzcmMvZnNka19iYXNlYW5ub3QuY3BwIFwKKyAgICBzcmMvZnNka19iYXNlZm9ybS5jcHAgXAorICAgIHNyYy9mc2RrX21nci5jcHAgXAorICAgIHNyYy9mc2RrX3JlbmRlcmNvbnRleHQuY3BwCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgIGV4dGVybmFsL3BkZml1bSBcCisgICAgZXh0ZXJuYWwvZnJlZXR5cGUvaW5jbHVkZSBcCisgICAgZXh0ZXJuYWwvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZQorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9mcGRmc2RrL3BkZml1bWZvcm1maWxsZXIubWsgYi9mcGRmc2RrL3BkZml1bWZvcm1maWxsZXIubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVhYmZhZgotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvcGRmaXVtZm9ybWZpbGxlci5tawpAQCAtMCwwICsxLDM1IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRTo9IGxpYnBkZml1bWZvcm1maWxsZXIKKworTE9DQUxfQVJNX01PREUgOj0gYXJtCitMT0NBTF9OREtfU1RMX1ZBUklBTlQgOj0gZ251c3RsX3N0YXRpYworCitMT0NBTF9DRkxBR1MgKz0gLU8zIC1mc3RyaWN0LWFsaWFzaW5nIC1mcHJlZmV0Y2gtbG9vcC1hcnJheXMgLWZleGNlcHRpb25zCitMT0NBTF9DRkxBR1MgKz0gLVduby1ub24tdmlydHVhbC1kdG9yIC1XYWxsIC1ET1BKX1NUQVRJQyBcCisgICAgICAgICAgICAgICAgLURWOF9ERVBSRUNBVElPTl9XQVJOSU5HUyAtRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCisKKyMgTWFzayBzb21lIHdhcm5pbmdzLiBUaGVzZSBhcmUgYmVuaWduLCBidXQgd2UgcHJvYmFibHkgd2FudCB0byBmaXggdGhlbQorIyB1cHN0cmVhbSBhdCBzb21lIHBvaW50LgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tc2lnbi1jb21wYXJlIC1Xbm8tdW51c2VkLXBhcmFtZXRlcgorTE9DQUxfQ0xBTkdfQ0ZMQUdTICs9IC1Xbm8tc2lnbi1jb21wYXJlCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgc3JjL2Zvcm1maWxsZXIvRkZMX0NCQV9Gb250bWFwLmNwcCBcCisgICAgc3JjL2Zvcm1maWxsZXIvRkZMX0NoZWNrQm94LmNwcCBcCisgICAgc3JjL2Zvcm1maWxsZXIvRkZMX0NvbWJvQm94LmNwcCBcCisgICAgc3JjL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuY3BwIFwKKyAgICBzcmMvZm9ybWZpbGxlci9GRkxfSUZvcm1GaWxsZXIuY3BwIFwKKyAgICBzcmMvZm9ybWZpbGxlci9GRkxfTGlzdEJveC5jcHAgXAorICAgIHNyYy9mb3JtZmlsbGVyL0ZGTF9QdXNoQnV0dG9uLmNwcCBcCisgICAgc3JjL2Zvcm1maWxsZXIvRkZMX1JhZGlvQnV0dG9uLmNwcCBcCisgICAgc3JjL2Zvcm1maWxsZXIvRkZMX1RleHRGaWVsZC5jcHAKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgZXh0ZXJuYWwvcGRmaXVtIFwKKyAgICBleHRlcm5hbC9mcmVldHlwZS9pbmNsdWRlIFwKKyAgICBleHRlcm5hbC9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvcGRmaXVtZnhlZGl0Lm1rIGIvZnBkZnNkay9wZGZpdW1meGVkaXQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE1MWFmOAotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvcGRmaXVtZnhlZGl0Lm1rCkBAIC0wLDAgKzEsMzAgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFOj0gbGlicGRmaXVtZnhlZGl0CisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorTE9DQUxfTkRLX1NUTF9WQVJJQU5UIDo9IGdudXN0bF9zdGF0aWMKKworTE9DQUxfQ0ZMQUdTICs9IC1PMyAtZnN0cmljdC1hbGlhc2luZyAtZnByZWZldGNoLWxvb3AtYXJyYXlzIC1mZXhjZXB0aW9ucworTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbm9uLXZpcnR1YWwtZHRvciAtV2FsbCAtRE9QSl9TVEFUSUMgXAorICAgICAgICAgICAgICAgIC1EVjhfREVQUkVDQVRJT05fV0FSTklOR1MgLURfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUworCisjIE1hc2sgc29tZSB3YXJuaW5ncy4gVGhlc2UgYXJlIGJlbmlnbiwgYnV0IHdlIHByb2JhYmx5IHdhbnQgdG8gZml4IHRoZW0KKyMgdXBzdHJlYW0gYXQgc29tZSBwb2ludC4KK0xPQ0FMX0NGTEFHUyArPSAtV25vLXNpZ24tY29tcGFyZSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX0NMQU5HX0NGTEFHUyArPSAtV25vLXNpZ24tY29tcGFyZQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIHNyYy9meGVkaXQvZnhldF9hcC5jcHAgXAorICAgIHNyYy9meGVkaXQvZnhldF9lZGl0LmNwcCBcCisgICAgc3JjL2Z4ZWRpdC9meGV0X2xpc3QuY3BwIFwKKyAgICBzcmMvZnhlZGl0L2Z4ZXRfbW9kdWxlLmNwcCBcCisgICAgc3JjL2Z4ZWRpdC9meGV0X3BhZ2VvYmpzLmNwcAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICBleHRlcm5hbC9wZGZpdW0gXAorICAgIGV4dGVybmFsL2ZyZWV0eXBlL2luY2x1ZGUgXAorICAgIGV4dGVybmFsL2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvcGRmaXVtamF2YXNjcmlwdC5tayBiL2ZwZGZzZGsvcGRmaXVtamF2YXNjcmlwdC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjM5ZjczCi0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9wZGZpdW1qYXZhc2NyaXB0Lm1rCkBAIC0wLDAgKzEsMjcgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFOj0gbGlicGRmaXVtamF2YXNjcmlwdAorCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KK0xPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBnbnVzdGxfc3RhdGljCisKK0xPQ0FMX0NGTEFHUyArPSAtTzMgLWZzdHJpY3QtYWxpYXNpbmcgLWZwcmVmZXRjaC1sb29wLWFycmF5cyAtZmV4Y2VwdGlvbnMKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW5vbi12aXJ0dWFsLWR0b3IgLVdhbGwgLURPUEpfU1RBVElDIFwKKyAgICAgICAgICAgICAgICAtRFY4X0RFUFJFQ0FUSU9OX1dBUk5JTkdTIC1EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKKworIyBNYXNrIHNvbWUgd2FybmluZ3MuIFRoZXNlIGFyZSBiZW5pZ24sIGJ1dCB3ZSBwcm9iYWJseSB3YW50IHRvIGZpeCB0aGVtCisjIHVwc3RyZWFtIGF0IHNvbWUgcG9pbnQuCitMT0NBTF9DRkxBR1MgKz0gLVduby1zaWduLWNvbXBhcmUgLVduby11bnVzZWQtcGFyYW1ldGVyCitMT0NBTF9DTEFOR19DRkxBR1MgKz0gLVduby1zaWduLWNvbXBhcmUKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBzcmMvamF2YXNjcmlwdC9KU19SdW50aW1lX1N0dWIuY3BwCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgIGV4dGVybmFsL3BkZml1bSBcCisgICAgZXh0ZXJuYWwvZnJlZXR5cGUvaW5jbHVkZSBcCisgICAgZXh0ZXJuYWwvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZQorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9mcGRmc2RrL3BkZml1bXBkZndpbmRvdy5tayBiL2ZwZGZzZGsvcGRmaXVtcGRmd2luZG93Lm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MzJiYTQKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL3BkZml1bXBkZndpbmRvdy5tawpAQCAtMCwwICsxLDQzIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRTo9IGxpYnBkZml1bXBkZndpbmRvdworCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KK0xPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBnbnVzdGxfc3RhdGljCisKK0xPQ0FMX0NGTEFHUyArPSAtTzMgLWZzdHJpY3QtYWxpYXNpbmcgLWZwcmVmZXRjaC1sb29wLWFycmF5cyAtZmV4Y2VwdGlvbnMKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW5vbi12aXJ0dWFsLWR0b3IgLVdhbGwgLURPUEpfU1RBVElDIFwKKyAgICAgICAgICAgICAgICAtRFY4X0RFUFJFQ0FUSU9OX1dBUk5JTkdTIC1EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKKworIyBNYXNrIHNvbWUgd2FybmluZ3MuIFRoZXNlIGFyZSBiZW5pZ24sIGJ1dCB3ZSBwcm9iYWJseSB3YW50IHRvIGZpeCB0aGVtCisjIHVwc3RyZWFtIGF0IHNvbWUgcG9pbnQuCitMT0NBTF9DRkxBR1MgKz0gLVduby1zaWduLWNvbXBhcmUgLVduby11bnVzZWQtcGFyYW1ldGVyCitMT0NBTF9DTEFOR19DRkxBR1MgKz0gLVduby1zaWduLWNvbXBhcmUKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBzcmMvcGRmd2luZG93L1BXTF9CdXR0b24uY3BwIFwKKyAgICBzcmMvcGRmd2luZG93L1BXTF9DYXJldC5jcHAgXAorICAgIHNyYy9wZGZ3aW5kb3cvUFdMX0NvbWJvQm94LmNwcCBcCisgICAgc3JjL3BkZndpbmRvdy9QV0xfRWRpdC5jcHAgXAorICAgIHNyYy9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmNwcCBcCisgICAgc3JjL3BkZndpbmRvdy9QV0xfRm9udE1hcC5jcHAgXAorICAgIHNyYy9wZGZ3aW5kb3cvUFdMX0ljb24uY3BwIFwKKyAgICBzcmMvcGRmd2luZG93L1BXTF9JY29uTGlzdC5jcHAgXAorICAgIHNyYy9wZGZ3aW5kb3cvUFdMX0xhYmVsLmNwcCBcCisgICAgc3JjL3BkZndpbmRvdy9QV0xfTGlzdEJveC5jcHAgXAorICAgIHNyYy9wZGZ3aW5kb3cvUFdMX0xpc3RDdHJsLmNwcCBcCisgICAgc3JjL3BkZndpbmRvdy9QV0xfTm90ZS5jcHAgXAorICAgIHNyYy9wZGZ3aW5kb3cvUFdMX1Njcm9sbEJhci5jcHAgXAorICAgIHNyYy9wZGZ3aW5kb3cvUFdMX1NpZ25hdHVyZS5jcHAgXAorICAgIHNyYy9wZGZ3aW5kb3cvUFdMX1NwZWNpYWxCdXR0b24uY3BwIFwKKyAgICBzcmMvcGRmd2luZG93L1BXTF9VdGlscy5jcHAgXAorICAgIHNyYy9wZGZ3aW5kb3cvUFdMX1duZC5jcHAKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgZXh0ZXJuYWwvcGRmaXVtIFwKKyAgICBleHRlcm5hbC9mcmVldHlwZS9pbmNsdWRlIFwKKyAgICBleHRlcm5hbC9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NCQV9Gb250bWFwLmNwcCBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NCQV9Gb250bWFwLmNwcAppbmRleCBhZDVhMTY3Li45MjUzNTYzIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9DQkFfRm9udG1hcC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfQ0JBX0ZvbnRtYXAuY3BwCkBAIC0xLDMwMiArMSwyNzEgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9Gb3JtRmlsbGVyLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9DQkFfRm9udG1hcC5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9DQkFfRm9udG1hcC5oIgogCi1DQkFfRm9udE1hcDo6Q0JBX0ZvbnRNYXAoQ1BERlNES19Bbm5vdCogcEFubm90LCBJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpIDoKLQlDUFdMX0ZvbnRNYXAocFN5c3RlbUhhbmRsZXIpLAotCW1fcERvY3VtZW50KE5VTEwpLAotCW1fcEFubm90RGljdChOVUxMKSwKLQltX3BEZWZhdWx0Rm9udChOVUxMKSwKLQltX3NBUFR5cGUoIk4iKQotewotCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZzZGtfYmFzZWFubm90LmgiCiAKLQlDUERGX1BhZ2UqIHBQYWdlID0gcEFubm90LT5HZXRQREZQYWdlKCk7CitDQkFfRm9udE1hcDo6Q0JBX0ZvbnRNYXAoQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlcikKKyAgICA6IENQV0xfRm9udE1hcChwU3lzdGVtSGFuZGxlciksCisgICAgICBtX3BEb2N1bWVudChOVUxMKSwKKyAgICAgIG1fcEFubm90RGljdChOVUxMKSwKKyAgICAgIG1fcERlZmF1bHRGb250KE5VTEwpLAorICAgICAgbV9zQVBUeXBlKCJOIikgeworICBDUERGX1BhZ2UqIHBQYWdlID0gcEFubm90LT5HZXRQREZQYWdlKCk7CiAKLQltX3BEb2N1bWVudCA9IHBQYWdlLT5tX3BEb2N1bWVudDsKLQltX3BBbm5vdERpY3QgPSBwQW5ub3QtPkdldFBERkFubm90KCktPm1fcEFubm90RGljdDsKKyAgbV9wRG9jdW1lbnQgPSBwUGFnZS0+bV9wRG9jdW1lbnQ7CisgIG1fcEFubm90RGljdCA9IHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0QW5ub3REaWN0KCk7CisgIEluaXRpYWxpemUoKTsKIH0KIAotQ0JBX0ZvbnRNYXA6OkNCQV9Gb250TWFwKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0LCAKLQkJCQkJCSBJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpIDoKLQlDUFdMX0ZvbnRNYXAocFN5c3RlbUhhbmRsZXIpLAotCW1fcERvY3VtZW50KHBEb2N1bWVudCksCi0JbV9wQW5ub3REaWN0KHBBbm5vdERpY3QpLAotCW1fcERlZmF1bHRGb250KE5VTEwpLAotCW1fc0FQVHlwZSgiTiIpCi17CitDQkFfRm9udE1hcDo6fkNCQV9Gb250TWFwKCkge30KKwordm9pZCBDQkFfRm9udE1hcDo6UmVzZXQoKSB7CisgIEVtcHR5KCk7CisgIG1fcERlZmF1bHRGb250ID0gTlVMTDsKKyAgbV9zRGVmYXVsdEZvbnROYW1lID0gIiI7CiB9CiAKLUNCQV9Gb250TWFwOjp+Q0JBX0ZvbnRNYXAoKQotewordm9pZCBDQkFfRm9udE1hcDo6SW5pdGlhbGl6ZSgpIHsKKyAgaW50MzJfdCBuQ2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVDsKKworICBpZiAoIW1fcERlZmF1bHRGb250KSB7CisgICAgbV9wRGVmYXVsdEZvbnQgPSBHZXRBbm5vdERlZmF1bHRGb250KG1fc0RlZmF1bHRGb250TmFtZSk7CisgICAgaWYgKG1fcERlZmF1bHRGb250KSB7CisgICAgICBpZiAoY29uc3QgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCA9IG1fcERlZmF1bHRGb250LT5HZXRTdWJzdEZvbnQoKSkgeworICAgICAgICBuQ2hhcnNldCA9IHBTdWJzdEZvbnQtPm1fQ2hhcnNldDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtX3NEZWZhdWx0Rm9udE5hbWUgPT0gIldpbmdkaW5ncyIgfHwKKyAgICAgICAgICAgIG1fc0RlZmF1bHRGb250TmFtZSA9PSAiV2luZ2RpbmdzMiIgfHwKKyAgICAgICAgICAgIG1fc0RlZmF1bHRGb250TmFtZSA9PSAiV2luZ2RpbmdzMyIgfHwKKyAgICAgICAgICAgIG1fc0RlZmF1bHRGb250TmFtZSA9PSAiV2ViZGluZ3MiKQorICAgICAgICAgIG5DaGFyc2V0ID0gU1lNQk9MX0NIQVJTRVQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBuQ2hhcnNldCA9IEFOU0lfQ0hBUlNFVDsKKyAgICAgIH0KKyAgICAgIEFkZEZvbnREYXRhKG1fcERlZmF1bHRGb250LCBtX3NEZWZhdWx0Rm9udE5hbWUsIG5DaGFyc2V0KTsKKyAgICAgIEFkZEZvbnRUb0Fubm90RGljdChtX3BEZWZhdWx0Rm9udCwgbV9zRGVmYXVsdEZvbnROYW1lKTsKKyAgICB9CisgIH0KKworICBpZiAobkNoYXJzZXQgIT0gQU5TSV9DSEFSU0VUKQorICAgIENQV0xfRm9udE1hcDo6SW5pdGlhbGl6ZSgpOwogfQogCi12b2lkIENCQV9Gb250TWFwOjpSZXNldCgpCi17Ci0JRW1wdHkoKTsKLQltX3BEZWZhdWx0Rm9udCA9IE5VTEw7Ci0JbV9zRGVmYXVsdEZvbnROYW1lID0gIiI7Cit2b2lkIENCQV9Gb250TWFwOjpTZXREZWZhdWx0Rm9udChDUERGX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSkgeworICBBU1NFUlQocEZvbnQgIT0gTlVMTCk7CisKKyAgaWYgKG1fcERlZmF1bHRGb250KQorICAgIHJldHVybjsKKworICBtX3BEZWZhdWx0Rm9udCA9IHBGb250OworICBtX3NEZWZhdWx0Rm9udE5hbWUgPSBzRm9udE5hbWU7CisKKyAgaW50MzJfdCBuQ2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVDsKKyAgaWYgKGNvbnN0IENGWF9TdWJzdEZvbnQqIHBTdWJzdEZvbnQgPSBtX3BEZWZhdWx0Rm9udC0+R2V0U3Vic3RGb250KCkpCisgICAgbkNoYXJzZXQgPSBwU3Vic3RGb250LT5tX0NoYXJzZXQ7CisgIEFkZEZvbnREYXRhKG1fcERlZmF1bHRGb250LCBtX3NEZWZhdWx0Rm9udE5hbWUsIG5DaGFyc2V0KTsKIH0KIAotdm9pZCBDQkFfRm9udE1hcDo6SW5pdGlhbChGWF9MUENTVFIgZm9udG5hbWUpCi17Ci0JRlhfSU5UMzIgbkNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQ7CitDUERGX0ZvbnQqIENCQV9Gb250TWFwOjpGaW5kRm9udFNhbWVDaGFyc2V0KENGWF9CeXRlU3RyaW5nJiBzRm9udEFsaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DaGFyc2V0KSB7CisgIEFTU0VSVChtX3BBbm5vdERpY3QgIT0gTlVMTCk7CiAKLQlpZiAoIW1fcERlZmF1bHRGb250KQotCXsKLQkJbV9wRGVmYXVsdEZvbnQgPSBHZXRBbm5vdERlZmF1bHRGb250KG1fc0RlZmF1bHRGb250TmFtZSk7CQotCQlpZiAobV9wRGVmYXVsdEZvbnQpCi0JCXsKLQkJCWlmIChjb25zdCBDRlhfU3Vic3RGb250KiBwU3Vic3RGb250ID0gbV9wRGVmYXVsdEZvbnQtPkdldFN1YnN0Rm9udCgpKQotCQkJCW5DaGFyc2V0ID0gcFN1YnN0Rm9udC0+bV9DaGFyc2V0OwotCQkJZWxzZQotCQkJewotCQkJCWlmIChtX3NEZWZhdWx0Rm9udE5hbWUgPT0gIldpbmdkaW5ncyIgfHwgbV9zRGVmYXVsdEZvbnROYW1lID09ICJXaW5nZGluZ3MyIiB8fAotCQkJCQltX3NEZWZhdWx0Rm9udE5hbWUgPT0gIldpbmdkaW5nczMiIHx8IG1fc0RlZmF1bHRGb250TmFtZSA9PSAiV2ViZGluZ3MiKQotCQkJCQkJbkNoYXJzZXQgPSBTWU1CT0xfQ0hBUlNFVDsKLQkJCQllbHNlCi0JCQkJCW5DaGFyc2V0ID0gQU5TSV9DSEFSU0VUOwotCQkJfQotCQkJQWRkRm9udERhdGEobV9wRGVmYXVsdEZvbnQsIG1fc0RlZmF1bHRGb250TmFtZSwgbkNoYXJzZXQpOwotCQkJQWRkRm9udFRvQW5ub3REaWN0KG1fcERlZmF1bHRGb250LCBtX3NEZWZhdWx0Rm9udE5hbWUpOwotCQl9Ci0JfQorICBpZiAobV9wQW5ub3REaWN0LT5HZXRTdHJpbmcoIlN1YnR5cGUiKSA9PSAiV2lkZ2V0IikgeworICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCA9IEdldERvY3VtZW50KCk7CisgICAgQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKIAotCWlmIChuQ2hhcnNldCAhPSBBTlNJX0NIQVJTRVQpCi0JCUNQV0xfRm9udE1hcDo6SW5pdGlhbChmb250bmFtZSk7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdERpY3QgPSBwRG9jdW1lbnQtPkdldFJvb3QoKTsKKyAgICBpZiAoIXBSb290RGljdCkKKyAgICAgIHJldHVybiBOVUxMOworCisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQWNyb0Zvcm1EaWN0ID0gcFJvb3REaWN0LT5HZXREaWN0KCJBY3JvRm9ybSIpOworICAgIGlmICghcEFjcm9Gb3JtRGljdCkKKyAgICAgIHJldHVybiBOVUxMOworCisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRFJEaWN0ID0gcEFjcm9Gb3JtRGljdC0+R2V0RGljdCgiRFIiKTsKKyAgICBpZiAoIXBEUkRpY3QpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBGaW5kUmVzRm9udFNhbWVDaGFyc2V0KHBEUkRpY3QsIHNGb250QWxpYXMsIG5DaGFyc2V0KTsKKyAgfQorCisgIHJldHVybiBOVUxMOwogfQogCi12b2lkIENCQV9Gb250TWFwOjpTZXREZWZhdWx0Rm9udChDUERGX0ZvbnQgKiBwRm9udCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJiBzRm9udE5hbWUpCi17Ci0JQVNTRVJUKHBGb250ICE9IE5VTEwpOwotCi0JaWYgKG1fcERlZmF1bHRGb250KSByZXR1cm47Ci0KLQltX3BEZWZhdWx0Rm9udCA9IHBGb250OwotCW1fc0RlZmF1bHRGb250TmFtZSA9IHNGb250TmFtZTsKLQotLy8JaWYgKG1fc0RlZmF1bHRGb250TmFtZS5Jc0VtcHR5KCkpCi0vLwkJbV9zRGVmYXVsdEZvbnROYW1lID0gcEZvbnQtPkdldEZvbnRUeXBlTmFtZSgpOwotCi0JRlhfSU5UMzIgbkNoYXJzZXQgPSBERUZBVUxUX0NIQVJTRVQ7Ci0JaWYgKGNvbnN0IENGWF9TdWJzdEZvbnQqIHBTdWJzdEZvbnQgPSBtX3BEZWZhdWx0Rm9udC0+R2V0U3Vic3RGb250KCkpCi0JCW5DaGFyc2V0ID0gcFN1YnN0Rm9udC0+bV9DaGFyc2V0OwotCUFkZEZvbnREYXRhKG1fcERlZmF1bHRGb250LCBtX3NEZWZhdWx0Rm9udE5hbWUsIG5DaGFyc2V0KTsKK0NQREZfRG9jdW1lbnQqIENCQV9Gb250TWFwOjpHZXREb2N1bWVudCgpIHsKKyAgcmV0dXJuIG1fcERvY3VtZW50OwogfQogCi1DUERGX0ZvbnQqIENCQV9Gb250TWFwOjpGaW5kRm9udFNhbWVDaGFyc2V0KENGWF9CeXRlU3RyaW5nJiBzRm9udEFsaWFzLCBGWF9JTlQzMiBuQ2hhcnNldCkKLXsKLQlBU1NFUlQobV9wQW5ub3REaWN0ICE9IE5VTEwpOworQ1BERl9Gb250KiBDQkFfRm9udE1hcDo6RmluZFJlc0ZvbnRTYW1lQ2hhcnNldChDUERGX0RpY3Rpb25hcnkqIHBSZXNEaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhcnNldCkgeworICBpZiAoIXBSZXNEaWN0KQorICAgIHJldHVybiBOVUxMOwogCi0JaWYgKG1fcEFubm90RGljdC0+R2V0U3RyaW5nKCJTdWJ0eXBlIikgPT0gIldpZGdldCIpCi0JewotCQlDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBHZXREb2N1bWVudCgpOwotCQlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOworICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBHZXREb2N1bWVudCgpOworICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwogCi0JCUNQREZfRGljdGlvbmFyeSAqIHBSb290RGljdCA9IHBEb2N1bWVudC0+R2V0Um9vdCgpOwotCQlpZiAoIXBSb290RGljdCkgcmV0dXJuIE5VTEw7CisgIENQREZfRGljdGlvbmFyeSogcEZvbnRzID0gcFJlc0RpY3QtPkdldERpY3QoIkZvbnQiKTsKKyAgaWYgKCFwRm9udHMpCisgICAgcmV0dXJuIE5VTEw7CiAKLQkJQ1BERl9EaWN0aW9uYXJ5KiBwQWNyb0Zvcm1EaWN0ID0gcFJvb3REaWN0LT5HZXREaWN0KCJBY3JvRm9ybSIpOwotCQlpZiAoIXBBY3JvRm9ybURpY3QpIHJldHVybiBOVUxMOworICBDUERGX0ZvbnQqIHBGaW5kID0gTlVMTDsKIAotCQlDUERGX0RpY3Rpb25hcnkgKiBwRFJEaWN0ID0gcEFjcm9Gb3JtRGljdC0+R2V0RGljdCgiRFIiKTsKLQkJaWYgKCFwRFJEaWN0KSByZXR1cm4gTlVMTDsKKyAgZm9yIChjb25zdCBhdXRvJiBpdCA6ICpwRm9udHMpIHsKKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NLZXkgPSBpdC5maXJzdDsKKyAgICBDUERGX09iamVjdCogcE9iaiA9IGl0LnNlY29uZDsKKyAgICBpZiAoIXBPYmopCisgICAgICBjb250aW51ZTsKIAotCQlyZXR1cm4gRmluZFJlc0ZvbnRTYW1lQ2hhcnNldChwRFJEaWN0LCBzRm9udEFsaWFzLCBuQ2hhcnNldCk7Ci0JfQorICAgIENQREZfRGljdGlvbmFyeSogcEVsZW1lbnQgPSBUb0RpY3Rpb25hcnkocE9iai0+R2V0RGlyZWN0KCkpOworICAgIGlmICghcEVsZW1lbnQpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAocEVsZW1lbnQtPkdldFN0cmluZygiVHlwZSIpICE9ICJGb250IikKKyAgICAgIGNvbnRpbnVlOwogCi0JcmV0dXJuIE5VTEw7CisgICAgQ1BERl9Gb250KiBwRm9udCA9IHBEb2N1bWVudC0+TG9hZEZvbnQocEVsZW1lbnQpOworICAgIGlmICghcEZvbnQpCisgICAgICBjb250aW51ZTsKKyAgICBjb25zdCBDRlhfU3Vic3RGb250KiBwU3Vic3QgPSBwRm9udC0+R2V0U3Vic3RGb250KCk7CisgICAgaWYgKCFwU3Vic3QpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAocFN1YnN0LT5tX0NoYXJzZXQgPT0gbkNoYXJzZXQpIHsKKyAgICAgIHNGb250QWxpYXMgPSBjc0tleTsKKyAgICAgIHBGaW5kID0gcEZvbnQ7CisgICAgfQorICB9CisgIHJldHVybiBwRmluZDsKIH0KIAotQ1BERl9Eb2N1bWVudCogQ0JBX0ZvbnRNYXA6OkdldERvY3VtZW50KCkKLXsKLQlyZXR1cm4gbV9wRG9jdW1lbnQ7Cit2b2lkIENCQV9Gb250TWFwOjpBZGRlZEZvbnQoQ1BERl9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcykgeworICBBZGRGb250VG9Bbm5vdERpY3QocEZvbnQsIHNGb250QWxpYXMpOwogfQogCi1DUERGX0ZvbnQqIENCQV9Gb250TWFwOjpGaW5kUmVzRm9udFNhbWVDaGFyc2V0KENQREZfRGljdGlvbmFyeSogcFJlc0RpY3QsIENGWF9CeXRlU3RyaW5nJiBzRm9udEFsaWFzLCAKLQkJCQkJCQkJCQkJCQlGWF9JTlQzMiBuQ2hhcnNldCkKLXsKLQlpZiAoIXBSZXNEaWN0KSByZXR1cm4gTlVMTDsKK3ZvaWQgQ0JBX0ZvbnRNYXA6OkFkZEZvbnRUb0Fubm90RGljdChDUERGX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQWxpYXMpIHsKKyAgaWYgKCFwRm9udCkKKyAgICByZXR1cm47CiAKLQlDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBHZXREb2N1bWVudCgpOwotCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CisgIEFTU0VSVChtX3BBbm5vdERpY3QgIT0gTlVMTCk7CisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKIAotCUNQREZfRGljdGlvbmFyeSogcEZvbnRzID0gcFJlc0RpY3QtPkdldERpY3QoIkZvbnQiKTsKLQlpZiAocEZvbnRzID09IE5VTEwpIHJldHVybiBOVUxMOworICBDUERGX0RpY3Rpb25hcnkqIHBBUERpY3QgPSBtX3BBbm5vdERpY3QtPkdldERpY3QoIkFQIik7CiAKLQlDUERGX0ZvbnQqIHBGaW5kID0gTlVMTDsKKyAgaWYgKCFwQVBEaWN0KSB7CisgICAgcEFQRGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgICAgbV9wQW5ub3REaWN0LT5TZXRBdCgiQVAiLCBwQVBEaWN0KTsKKyAgfQogCi0JRlhfUE9TSVRJT04gcG9zID0gcEZvbnRzLT5HZXRTdGFydFBvcygpOwotCXdoaWxlIChwb3MpCi0JewotCQlDUERGX09iamVjdCogcE9iaiA9IE5VTEw7Ci0JCUNGWF9CeXRlU3RyaW5nIGNzS2V5OwotCQlwT2JqID0gcEZvbnRzLT5HZXROZXh0RWxlbWVudChwb3MsIGNzS2V5KTsKLQkJaWYgKHBPYmogPT0gTlVMTCkgY29udGludWU7CisgIC8vIHRvIGF2b2lkIGNoZWNrYm94IGFuZCByYWRpb2J1dHRvbgorICBDUERGX09iamVjdCogcE9iamVjdCA9IHBBUERpY3QtPkdldEVsZW1lbnQobV9zQVBUeXBlKTsKKyAgaWYgKFRvRGljdGlvbmFyeShwT2JqZWN0KSkKKyAgICByZXR1cm47CiAKLQkJQ1BERl9PYmplY3QqIHBEaXJlY3QgPSBwT2JqLT5HZXREaXJlY3QoKTsKLQkJaWYgKHBEaXJlY3QgPT0gTlVMTCB8fCBwRGlyZWN0LT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIGNvbnRpbnVlOworICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IHBBUERpY3QtPkdldFN0cmVhbShtX3NBUFR5cGUpOworICBpZiAoIXBTdHJlYW0pIHsKKyAgICBwU3RyZWFtID0gbmV3IENQREZfU3RyZWFtKE5VTEwsIDAsIE5VTEwpOworICAgIGludDMyX3Qgb2JqbnVtID0gbV9wRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBTdHJlYW0pOworICAgIHBBUERpY3QtPlNldEF0UmVmZXJlbmNlKG1fc0FQVHlwZSwgbV9wRG9jdW1lbnQsIG9iam51bSk7CisgIH0KIAotCQlDUERGX0RpY3Rpb25hcnkqIHBFbGVtZW50ID0gKENQREZfRGljdGlvbmFyeSopcERpcmVjdDsKLQkJaWYgKHBFbGVtZW50LT5HZXRTdHJpbmcoIlR5cGUiKSAhPSAiRm9udCIpIGNvbnRpbnVlOworICBDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1EaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOwogCi0JCUNQREZfRm9udCogcEZvbnQgPSBwRG9jdW1lbnQtPkxvYWRGb250KHBFbGVtZW50KTsKLQkJaWYgKHBGb250ID09IE5VTEwpIGNvbnRpbnVlOwotCQljb25zdCBDRlhfU3Vic3RGb250KiBwU3Vic3QgPSBwRm9udC0+R2V0U3Vic3RGb250KCk7Ci0JCWlmIChwU3Vic3QgPT0gTlVMTCkgY29udGludWU7Ci0JCWlmIChwU3Vic3QtPm1fQ2hhcnNldCA9PSBuQ2hhcnNldCkKLQkJewotCQkJc0ZvbnRBbGlhcyA9IGNzS2V5OwotCQkJcEZpbmQgPSBwRm9udDsKLQkJfQotCX0KLQlyZXR1cm4gcEZpbmQ7CisgIGlmICghcFN0cmVhbURpY3QpIHsKKyAgICBwU3RyZWFtRGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgICAgcFN0cmVhbS0+SW5pdFN0cmVhbShOVUxMLCAwLCBwU3RyZWFtRGljdCk7CisgIH0KKworICBpZiAocFN0cmVhbURpY3QpIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1SZXNMaXN0ID0gcFN0cmVhbURpY3QtPkdldERpY3QoIlJlc291cmNlcyIpOworICAgIGlmICghcFN0cmVhbVJlc0xpc3QpIHsKKyAgICAgIHBTdHJlYW1SZXNMaXN0ID0gbmV3IENQREZfRGljdGlvbmFyeSgpOworICAgICAgcFN0cmVhbURpY3QtPlNldEF0KCJSZXNvdXJjZXMiLCBwU3RyZWFtUmVzTGlzdCk7CisgICAgfQorCisgICAgaWYgKHBTdHJlYW1SZXNMaXN0KSB7CisgICAgICBDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1SZXNGb250TGlzdCA9IHBTdHJlYW1SZXNMaXN0LT5HZXREaWN0KCJGb250Iik7CisgICAgICBpZiAoIXBTdHJlYW1SZXNGb250TGlzdCkgeworICAgICAgICBwU3RyZWFtUmVzRm9udExpc3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICAgICAgICBpbnQzMl90IG9iam51bSA9IG1fcERvY3VtZW50LT5BZGRJbmRpcmVjdE9iamVjdChwU3RyZWFtUmVzRm9udExpc3QpOworICAgICAgICBwU3RyZWFtUmVzTGlzdC0+U2V0QXRSZWZlcmVuY2UoIkZvbnQiLCBtX3BEb2N1bWVudCwgb2JqbnVtKTsKKyAgICAgIH0KKyAgICAgIGlmICghcFN0cmVhbVJlc0ZvbnRMaXN0LT5LZXlFeGlzdChzQWxpYXMpKQorICAgICAgICBwU3RyZWFtUmVzRm9udExpc3QtPlNldEF0UmVmZXJlbmNlKHNBbGlhcywgbV9wRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvbnQtPkdldEZvbnREaWN0KCkpOworICAgIH0KKyAgfQogfQogCi12b2lkIENCQV9Gb250TWFwOjpBZGRlZEZvbnQoQ1BERl9Gb250KiBwRm9udCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMpCi17Ci0JQWRkRm9udFRvQW5ub3REaWN0KHBGb250LCBzRm9udEFsaWFzKTsKK0NQREZfRm9udCogQ0JBX0ZvbnRNYXA6OkdldEFubm90RGVmYXVsdEZvbnQoQ0ZYX0J5dGVTdHJpbmcmIHNBbGlhcykgeworICBBU1NFUlQobV9wQW5ub3REaWN0ICE9IE5VTEwpOworICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQWNyb0Zvcm1EaWN0ID0gTlVMTDsKKworICBGWF9CT09MIGJXaWRnZXQgPSAobV9wQW5ub3REaWN0LT5HZXRTdHJpbmcoIlN1YnR5cGUiKSA9PSAiV2lkZ2V0Iik7CisKKyAgaWYgKGJXaWRnZXQpIHsKKyAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdERpY3QgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpKQorICAgICAgcEFjcm9Gb3JtRGljdCA9IHBSb290RGljdC0+R2V0RGljdCgiQWNyb0Zvcm0iKTsKKyAgfQorCisgIENGWF9CeXRlU3RyaW5nIHNEQTsKKyAgQ1BERl9PYmplY3QqIHBPYmo7CisgIGlmICgocE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcEFubm90RGljdCwgIkRBIikpKQorICAgIHNEQSA9IHBPYmotPkdldFN0cmluZygpOworCisgIGlmIChiV2lkZ2V0KSB7CisgICAgaWYgKHNEQS5Jc0VtcHR5KCkpIHsKKyAgICAgIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihwQWNyb0Zvcm1EaWN0LCAiREEiKTsKKyAgICAgIHNEQSA9IHBPYmogPyBwT2JqLT5HZXRTdHJpbmcoKSA6IENGWF9CeXRlU3RyaW5nKCk7CisgICAgfQorICB9CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QgPSBOVUxMOworCisgIGlmICghc0RBLklzRW1wdHkoKSkgeworICAgIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChzREEpOworICAgIHN5bnRheC5GaW5kVGFnUGFyYW0oIlRmIiwgMik7CisgICAgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnROYW1lID0gc3ludGF4LkdldFdvcmQoKTsKKyAgICBzQWxpYXMgPSBQREZfTmFtZURlY29kZShzRm9udE5hbWUpLk1pZCgxKTsKKworICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBEUkRpY3QgPSBtX3BBbm5vdERpY3QtPkdldERpY3QoIkRSIikpCisgICAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRFJGb250RGljdCA9IHBEUkRpY3QtPkdldERpY3QoIkZvbnQiKSkKKyAgICAgICAgcEZvbnREaWN0ID0gcERSRm9udERpY3QtPkdldERpY3Qoc0FsaWFzKTsKKworICAgIGlmICghcEZvbnREaWN0KQorICAgICAgaWYgKENQREZfRGljdGlvbmFyeSogcEFQRGljdCA9IG1fcEFubm90RGljdC0+R2V0RGljdCgiQVAiKSkKKyAgICAgICAgaWYgKENQREZfRGljdGlvbmFyeSogcE5vcm1hbERpY3QgPSBwQVBEaWN0LT5HZXREaWN0KCJOIikpCisgICAgICAgICAgaWYgKENQREZfRGljdGlvbmFyeSogcE5vcm1hbFJlc0RpY3QgPQorICAgICAgICAgICAgICAgICAgcE5vcm1hbERpY3QtPkdldERpY3QoIlJlc291cmNlcyIpKQorICAgICAgICAgICAgaWYgKENQREZfRGljdGlvbmFyeSogcFJlc0ZvbnREaWN0ID0gcE5vcm1hbFJlc0RpY3QtPkdldERpY3QoIkZvbnQiKSkKKyAgICAgICAgICAgICAgcEZvbnREaWN0ID0gcFJlc0ZvbnREaWN0LT5HZXREaWN0KHNBbGlhcyk7CisKKyAgICBpZiAoYldpZGdldCkgeworICAgICAgaWYgKCFwRm9udERpY3QpIHsKKyAgICAgICAgaWYgKHBBY3JvRm9ybURpY3QpIHsKKyAgICAgICAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRFJEaWN0ID0gcEFjcm9Gb3JtRGljdC0+R2V0RGljdCgiRFIiKSkKKyAgICAgICAgICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBEUkZvbnREaWN0ID0gcERSRGljdC0+R2V0RGljdCgiRm9udCIpKQorICAgICAgICAgICAgICBwRm9udERpY3QgPSBwRFJGb250RGljdC0+R2V0RGljdChzQWxpYXMpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHBGb250RGljdCA/IG1fcERvY3VtZW50LT5Mb2FkRm9udChwRm9udERpY3QpIDogbnVsbHB0cjsKIH0KIAotdm9pZCBDQkFfRm9udE1hcDo6QWRkRm9udFRvQW5ub3REaWN0KENQREZfRm9udCogcEZvbnQsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQWxpYXMpCi17Ci0JaWYgKCFwRm9udCkJcmV0dXJuOwordm9pZCBDQkFfRm9udE1hcDo6U2V0QVBUeXBlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQVBUeXBlKSB7CisgIG1fc0FQVHlwZSA9IHNBUFR5cGU7CiAKLQlBU1NFUlQobV9wQW5ub3REaWN0ICE9IE5VTEwpOwotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQotCUNQREZfRGljdGlvbmFyeSogcEFQRGljdCA9IG1fcEFubm90RGljdC0+R2V0RGljdCgiQVAiKTsKLQotCWlmIChwQVBEaWN0ID09IE5VTEwpCi0JewotCQlwQVBEaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKLQkJbV9wQW5ub3REaWN0LT5TZXRBdCgiQVAiLCBwQVBEaWN0KTsKLQl9Ci0KLQkvL3RvIGF2b2lkIGNoZWNrYm94IGFuZCByYWRpb2J1dHRvbgotCUNQREZfT2JqZWN0KiBwT2JqZWN0ID0gcEFQRGljdC0+R2V0RWxlbWVudChtX3NBUFR5cGUpOwotCWlmIChwT2JqZWN0ICYmIHBPYmplY3QtPkdldFR5cGUoKSA9PSBQREZPQkpfRElDVElPTkFSWSkKLQkJcmV0dXJuOwotCi0JQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwQVBEaWN0LT5HZXRTdHJlYW0obV9zQVBUeXBlKTsKLQlpZiAocFN0cmVhbSA9PSBOVUxMKQotCXsKLQkJcFN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbShOVUxMLCAwLCBOVUxMKTsKLQkJRlhfSU5UMzIgb2JqbnVtID0gbV9wRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBTdHJlYW0pOwotCQlwQVBEaWN0LT5TZXRBdFJlZmVyZW5jZShtX3NBUFR5cGUsIG1fcERvY3VtZW50LCBvYmpudW0pOwotCX0KLQotCUNQREZfRGljdGlvbmFyeSAqIHBTdHJlYW1EaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOwotCi0JaWYgKCFwU3RyZWFtRGljdCkKLQl7Ci0JCXBTdHJlYW1EaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKLQkJcFN0cmVhbS0+SW5pdFN0cmVhbShOVUxMLCAwLCBwU3RyZWFtRGljdCk7Ci0JfQotCi0JaWYgKHBTdHJlYW1EaWN0KQotCXsKLQkJQ1BERl9EaWN0aW9uYXJ5KiBwU3RyZWFtUmVzTGlzdCA9IHBTdHJlYW1EaWN0LT5HZXREaWN0KCJSZXNvdXJjZXMiKTsKLQkJaWYgKCFwU3RyZWFtUmVzTGlzdCkKLQkJewotCQkJcFN0cmVhbVJlc0xpc3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5KCk7Ci0JCQlwU3RyZWFtRGljdC0+U2V0QXQoIlJlc291cmNlcyIsIHBTdHJlYW1SZXNMaXN0KTsKLQkJfQotCi0JCWlmIChwU3RyZWFtUmVzTGlzdCkgCi0JCXsKLQkJCUNQREZfRGljdGlvbmFyeSogcFN0cmVhbVJlc0ZvbnRMaXN0ID0gcFN0cmVhbVJlc0xpc3QtPkdldERpY3QoIkZvbnQiKTsKLQkJCWlmICghcFN0cmVhbVJlc0ZvbnRMaXN0KSAKLQkJCXsKLQkJCQlwU3RyZWFtUmVzRm9udExpc3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotCQkJCUZYX0lOVDMyIG9iam51bSA9IG1fcERvY3VtZW50LT5BZGRJbmRpcmVjdE9iamVjdChwU3RyZWFtUmVzRm9udExpc3QpOwotCQkJCXBTdHJlYW1SZXNMaXN0LT5TZXRBdFJlZmVyZW5jZSgiRm9udCIsIG1fcERvY3VtZW50LCBvYmpudW0pOwotCQkJfQotCQkJaWYgKCFwU3RyZWFtUmVzRm9udExpc3QtPktleUV4aXN0KHNBbGlhcykpCi0JCQkJcFN0cmVhbVJlc0ZvbnRMaXN0LT5TZXRBdFJlZmVyZW5jZShzQWxpYXMsIG1fcERvY3VtZW50LCBwRm9udC0+R2V0Rm9udERpY3QoKSk7Ci0JCX0KLQl9CisgIFJlc2V0KCk7CisgIEluaXRpYWxpemUoKTsKIH0KLQotQ1BERl9Gb250KiBDQkFfRm9udE1hcDo6R2V0QW5ub3REZWZhdWx0Rm9udChDRlhfQnl0ZVN0cmluZyAmc0FsaWFzKQotewotCUFTU0VSVChtX3BBbm5vdERpY3QgIT0gTlVMTCk7Ci0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0JQ1BERl9EaWN0aW9uYXJ5KiBwQWNyb0Zvcm1EaWN0ID0gTlVMTDsKLQotCUZYX0JPT0wgYldpZGdldCA9IChtX3BBbm5vdERpY3QtPkdldFN0cmluZygiU3VidHlwZSIpID09ICJXaWRnZXQiKTsKLQotCWlmIChiV2lkZ2V0KQotCXsKLQkJaWYgKENQREZfRGljdGlvbmFyeSAqIHBSb290RGljdCA9IG1fcERvY3VtZW50LT5HZXRSb290KCkpCi0JCQlwQWNyb0Zvcm1EaWN0ID0gcFJvb3REaWN0LT5HZXREaWN0KCJBY3JvRm9ybSIpOwotCX0KLQkKLQlDRlhfQnl0ZVN0cmluZyBzREE7Ci0JQ1BERl9PYmplY3QqIHBPYmo7Ci0JaWYgKChwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wQW5ub3REaWN0LCAiREEiKSkpCi0JCXNEQSA9IHBPYmotPkdldFN0cmluZygpOwotCi0JaWYgKGJXaWRnZXQpCi0JewotCQlpZiAoc0RBLklzRW1wdHkoKSkKLQkJewotCQkJcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKHBBY3JvRm9ybURpY3QsICJEQSIpOwotCQkJc0RBID0gcE9iaiA/IHBPYmotPkdldFN0cmluZygpIDogQ0ZYX0J5dGVTdHJpbmcoKTsKLQkJfQotCX0KLQkKLQlDUERGX0RpY3Rpb25hcnkgKiBwRm9udERpY3QgPSBOVUxMOwkKLQotCWlmICghc0RBLklzRW1wdHkoKSkKLQl7Ci0JCUNQREZfU2ltcGxlUGFyc2VyIHN5bnRheChzREEpOwotCQlzeW50YXguRmluZFRhZ1BhcmFtKCJUZiIsIDIpOwotCQlDRlhfQnl0ZVN0cmluZyBzRm9udE5hbWUgPSBzeW50YXguR2V0V29yZCgpOwotCQlzQWxpYXMgPSBQREZfTmFtZURlY29kZShzRm9udE5hbWUpLk1pZCgxKTsKLQotCQlpZiAoQ1BERl9EaWN0aW9uYXJ5ICogcERSRGljdCA9IG1fcEFubm90RGljdC0+R2V0RGljdCgiRFIiKSkKLQkJCWlmIChDUERGX0RpY3Rpb25hcnkqIHBEUkZvbnREaWN0ID0gcERSRGljdC0+R2V0RGljdCgiRm9udCIpKQotCQkJCXBGb250RGljdCA9IHBEUkZvbnREaWN0LT5HZXREaWN0KHNBbGlhcyk7Ci0KLQkJaWYgKCFwRm9udERpY3QpCi0JCQlpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwQVBEaWN0ID0gbV9wQW5ub3REaWN0LT5HZXREaWN0KCJBUCIpKQotCQkJCWlmIChDUERGX0RpY3Rpb25hcnkqIHBOb3JtYWxEaWN0ID0gcEFQRGljdC0+R2V0RGljdCgiTiIpKQotCQkJCQlpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwTm9ybWFsUmVzRGljdCA9IHBOb3JtYWxEaWN0LT5HZXREaWN0KCJSZXNvdXJjZXMiKSkKLQkJCQkJCWlmIChDUERGX0RpY3Rpb25hcnkqIHBSZXNGb250RGljdCA9IHBOb3JtYWxSZXNEaWN0LT5HZXREaWN0KCJGb250IikpCi0JCQkJCQkJcEZvbnREaWN0ID0gcFJlc0ZvbnREaWN0LT5HZXREaWN0KHNBbGlhcyk7Ci0KLQkJaWYgKGJXaWRnZXQpCi0JCXsJCQkKLQkJCWlmICghcEZvbnREaWN0KQotCQkJewotCQkJCWlmIChwQWNyb0Zvcm1EaWN0KQotCQkJCXsKLQkJCQkJaWYgKENQREZfRGljdGlvbmFyeSAqIHBEUkRpY3QgPSBwQWNyb0Zvcm1EaWN0LT5HZXREaWN0KCJEUiIpKQotCQkJCQkJaWYgKENQREZfRGljdGlvbmFyeSogcERSRm9udERpY3QgPSBwRFJEaWN0LT5HZXREaWN0KCJGb250IikpCi0JCQkJCQkJcEZvbnREaWN0ID0gcERSRm9udERpY3QtPkdldERpY3Qoc0FsaWFzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAocEZvbnREaWN0KQotCQlyZXR1cm4gbV9wRG9jdW1lbnQtPkxvYWRGb250KHBGb250RGljdCk7Ci0JZWxzZQotCQlyZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBDQkFfRm9udE1hcDo6U2V0QVBUeXBlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQVBUeXBlKQotewotCW1fc0FQVHlwZSA9IHNBUFR5cGU7Ci0KLQlSZXNldCgpOwotCUluaXRpYWwoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfQ2hlY2tCb3guY3BwIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfQ2hlY2tCb3guY3BwCmluZGV4IGY4MDM1YzcuLmMyZTFiMjAgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NoZWNrQm94LmNwcAorKysgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9DaGVja0JveC5jcHAKQEAgLTEsMTQ0ICsxLDExOCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mb3JtZmlsbGVyL0Zvcm1GaWxsZXIuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NoZWNrQm94LmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NoZWNrQm94LmgiCiAKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mc2RrX21nci5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1NwZWNpYWxCdXR0b24uaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9md2xldmVudC5oIgogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGRkxfQ2hlY2tCb3ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworQ0ZGTF9DaGVja0JveDo6Q0ZGTF9DaGVja0JveChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX1dpZGdldCogcFdpZGdldCkKKyAgICA6IENGRkxfQnV0dG9uKHBBcHAsIHBXaWRnZXQpIHt9CiAKLUNGRkxfQ2hlY2tCb3g6OkNGRkxfQ2hlY2tCb3goQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQpIDoKLQlDRkZMX0J1dHRvbihwQXBwLCBwV2lkZ2V0KQoteworQ0ZGTF9DaGVja0JveDo6fkNGRkxfQ2hlY2tCb3goKSB7fQorCitDUFdMX1duZCogQ0ZGTF9DaGVja0JveDo6TmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgeworICBDUFdMX0NoZWNrQm94KiBwV25kID0gbmV3IENQV0xfQ2hlY2tCb3goKTsKKyAgcFduZC0+Q3JlYXRlKGNwKTsKKyAgcFduZC0+U2V0Q2hlY2sobV9wV2lkZ2V0LT5Jc0NoZWNrZWQoKSk7CisgIHJldHVybiBwV25kOwogfQogCi1DRkZMX0NoZWNrQm94Ojp+Q0ZGTF9DaGVja0JveCgpCi17CitGWF9CT09MIENGRkxfQ2hlY2tCb3g6Ok9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5LZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MpIHsKKyAgc3dpdGNoIChuS2V5Q29kZSkgeworICAgIGNhc2UgRldMX1ZLRVlfUmV0dXJuOgorICAgIGNhc2UgRldMX1ZLRVlfU3BhY2U6CisgICAgICByZXR1cm4gVFJVRTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIENGRkxfRm9ybUZpbGxlcjo6T25LZXlEb3duKHBBbm5vdCwgbktleUNvZGUsIG5GbGFncyk7CisgIH0KK30KK0ZYX0JPT0wgQ0ZGTF9DaGVja0JveDo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncykgeworICBzd2l0Y2ggKG5DaGFyKSB7CisgICAgY2FzZSBGV0xfVktFWV9SZXR1cm46CisgICAgY2FzZSBGV0xfVktFWV9TcGFjZTogeworICAgICAgQ0ZGTF9JRm9ybUZpbGxlciogcElGb3JtRmlsbGVyID0gbV9wQXBwLT5HZXRJRm9ybUZpbGxlcigpOworICAgICAgQVNTRVJUKHBJRm9ybUZpbGxlcik7CisKKyAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBBbm5vdC0+R2V0UGFnZVZpZXcoKTsKKyAgICAgIEFTU0VSVChwUGFnZVZpZXcpOworCisgICAgICBGWF9CT09MIGJSZXNldCA9IEZBTFNFOworICAgICAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOworCisgICAgICBwSUZvcm1GaWxsZXItPk9uQnV0dG9uVXAobV9wV2lkZ2V0LCBwUGFnZVZpZXcsIGJSZXNldCwgYkV4aXQsIG5GbGFncyk7CisKKyAgICAgIGlmIChiUmVzZXQpCisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgaWYgKGJFeGl0KQorICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKKworICAgICAgaWYgKENQV0xfQ2hlY2tCb3gqIHBXbmQgPSAoQ1BXTF9DaGVja0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCisgICAgICAgIHBXbmQtPlNldENoZWNrKCFwV25kLT5Jc0NoZWNrZWQoKSk7CisKKyAgICAgIENvbW1pdERhdGEocFBhZ2VWaWV3LCBuRmxhZ3MpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKKyAgfQogfQogCi1DUFdMX1duZCogQ0ZGTF9DaGVja0JveDo6TmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKLXsKLQlDUFdMX0NoZWNrQm94KiBwV25kID0gbmV3IENQV0xfQ2hlY2tCb3goKTsKLQlwV25kLT5DcmVhdGUoY3ApOworRlhfQk9PTCBDRkZMX0NoZWNrQm94OjpPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIENGRkxfQnV0dG9uOjpPbkxCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CiAKLQlBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwotCXBXbmQtPlNldENoZWNrKG1fcFdpZGdldC0+SXNDaGVja2VkKCkpOwotCQotCXJldHVybiBwV25kOworICBpZiAoSXNWYWxpZCgpKSB7CisgICAgaWYgKENQV0xfQ2hlY2tCb3gqIHBXbmQgPSAoQ1BXTF9DaGVja0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpIHsKKyAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7CisgICAgICBwV25kLT5TZXRDaGVjayghcFdpZGdldC0+SXNDaGVja2VkKCkpOworICAgIH0KKworICAgIGlmICghQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFncykpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTAlDRkZMX0NoZWNrQm94OjpPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5LZXlDb2RlLCBGWF9VSU5UIG5GbGFncykKLXsKLQlzd2l0Y2ggKG5LZXlDb2RlKQotCXsKLQljYXNlIEZXTF9WS0VZX1JldHVybjoKLQljYXNlIEZXTF9WS0VZX1NwYWNlOgotCQlyZXR1cm4gVFJVRTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gQ0ZGTF9Gb3JtRmlsbGVyOjpPbktleURvd24ocEFubm90LCBuS2V5Q29kZSwgbkZsYWdzKTsKLQl9Ci19Ci1GWF9CT09MCUNGRkxfQ2hlY2tCb3g6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQotewotCXN3aXRjaCAobkNoYXIpCi0JewotCWNhc2UgRldMX1ZLRVlfUmV0dXJuOgkKLQljYXNlIEZXTF9WS0VZX1NwYWNlOgotCQl7Ci0JCQlDRkZMX0lGb3JtRmlsbGVyKiBwSUZvcm1GaWxsZXIgPSBtX3BBcHAtPkdldElGb3JtRmlsbGVyKCk7Ci0JCQlBU1NFUlQocElGb3JtRmlsbGVyICE9IE5VTEwpOwotCi0JCQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwQW5ub3QtPkdldFBhZ2VWaWV3KCk7Ci0JCQlBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwotCi0JCQlGWF9CT09MIGJSZXNldCA9IEZBTFNFOwotCQkJRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwotCi0JCQlwSUZvcm1GaWxsZXItPk9uQnV0dG9uVXAobV9wV2lkZ2V0LCBwUGFnZVZpZXcsIGJSZXNldCwgYkV4aXQsbkZsYWdzKTsKLQotCQkJaWYgKGJSZXNldCkgcmV0dXJuIFRSVUU7Ci0JCQlpZiAoYkV4aXQpIHJldHVybiBUUlVFOwotCi0JCQlDRkZMX0Zvcm1GaWxsZXI6Ok9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOwotCi0JCQlpZiAoQ1BXTF9DaGVja0JveCAqIHBXbmQgPSAoQ1BXTF9DaGVja0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCi0JCQkJcFduZC0+U2V0Q2hlY2soIXBXbmQtPklzQ2hlY2tlZCgpKTsKLQotCQkJQ29tbWl0RGF0YShwUGFnZVZpZXcsbkZsYWdzKTsKLQkJCXJldHVybiBUUlVFOwotCQl9Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIENGRkxfRm9ybUZpbGxlcjo6T25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFncyk7Ci0JfQorRlhfQk9PTCBDRkZMX0NoZWNrQm94OjpJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgeworICBDUFdMX0NoZWNrQm94KiBwV25kID0gKENQV0xfQ2hlY2tCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKTsKKyAgcmV0dXJuIHBXbmQgJiYgcFduZC0+SXNDaGVja2VkKCkgIT0gbV9wV2lkZ2V0LT5Jc0NoZWNrZWQoKTsKIH0KIAotRlhfQk9PTCBDRkZMX0NoZWNrQm94OjpPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotCUNGRkxfQnV0dG9uOjpPbkxCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7Cit2b2lkIENGRkxfQ2hlY2tCb3g6OlNhdmVEYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgeworICBpZiAoQ1BXTF9DaGVja0JveCogcFduZCA9IChDUFdMX0NoZWNrQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpIHsKKyAgICBGWF9CT09MIGJOZXdDaGVja2VkID0gcFduZC0+SXNDaGVja2VkKCk7CiAKLQlpZiAoSXNWYWxpZCgpKQotCXsKLQkJaWYgKENQV0xfQ2hlY2tCb3ggKiBwV25kID0gKENQV0xfQ2hlY2tCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpKQotCQl7Ci0JCQlDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwotCQkJcFduZC0+U2V0Q2hlY2soIXBXaWRnZXQtPklzQ2hlY2tlZCgpKTsKLQkJLy8JcFduZC0+U2V0Q2hlY2soIXBXbmQtPklzQ2hlY2tlZCgpKTsKLQkJfQorICAgIGlmIChiTmV3Q2hlY2tlZCkgeworICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcFdpZGdldC0+R2V0Rm9ybUZpZWxkKCk7CisgICAgICBBU1NFUlQocEZpZWxkICE9IE5VTEwpOwogCi0JCWlmICghQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFncykpIHJldHVybiBGQUxTRTsKLQl9CisgICAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gcEZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICAgIGlmIChDUERGX0Zvcm1Db250cm9sKiBwQ3RybCA9IHBGaWVsZC0+R2V0Q29udHJvbChpKSkgeworICAgICAgICAgIGlmIChwQ3RybC0+SXNDaGVja2VkKCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KIAotCXJldHVybiBUUlVFOwotfQotCi1GWF9CT09MCUNGRkxfQ2hlY2tCb3g6OklzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQotewotCi0JQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKLQotCWlmIChDUFdMX0NoZWNrQm94KiBwV25kID0gKENQV0xfQ2hlY2tCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLQl7Ci0JCXJldHVybiBwV25kLT5Jc0NoZWNrZWQoKSAhPSBtX3BXaWRnZXQtPklzQ2hlY2tlZCgpOwotCX0KLQotCXJldHVybiBGQUxTRTsKLX0KLQotdm9pZCBDRkZMX0NoZWNrQm94OjpTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCi17Ci0KLQlBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwotCi0JaWYgKENQV0xfQ2hlY2tCb3gqIHBXbmQgPSAoQ1BXTF9DaGVja0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQotCXsKLQkJCi0JCUZYX0JPT0wgYk5ld0NoZWNrZWQgPSBwV25kLT5Jc0NoZWNrZWQoKTsKLQkJCi0KLQkJaWYgKGJOZXdDaGVja2VkKQotCQl7Ci0JCQlDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gbV9wV2lkZ2V0LT5HZXRGb3JtRmllbGQoKTsKLQkJCUFTU0VSVChwRmllbGQgIT0gTlVMTCk7Ci0KLQkJCWZvciAoRlhfSU5UMzIgaT0wLHN6PXBGaWVsZC0+Q291bnRDb250cm9scygpOyBpPHN6OyBpKyspCi0JCQl7Ci0JCQkJaWYgKENQREZfRm9ybUNvbnRyb2wqIHBDdHJsID0gcEZpZWxkLT5HZXRDb250cm9sKGkpKQotCQkJCXsKLQkJCQkJaWYgKHBDdHJsLT5Jc0NoZWNrZWQoKSkKLQkJCQkJewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQltX3BXaWRnZXQtPlNldENoZWNrKGJOZXdDaGVja2VkLCBGQUxTRSk7Ci0JCW1fcFdpZGdldC0+VXBkYXRlRmllbGQoKTsKLQkJU2V0Q2hhbmdlTWFyaygpOwotCX0KLQorICAgIG1fcFdpZGdldC0+U2V0Q2hlY2soYk5ld0NoZWNrZWQsIEZBTFNFKTsKKyAgICBtX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7CisgICAgU2V0Q2hhbmdlTWFyaygpOworICB9CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9Db21ib0JveC5jcHAgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9Db21ib0JveC5jcHAKaW5kZXggMDEyZWQ0YS4uNWU4OGE1ZCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfQ29tYm9Cb3guY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NvbWJvQm94LmNwcApAQCAtMSw0MzcgKzEsMzAyIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Zvcm1maWxsZXIvRm9ybUZpbGxlci5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfSUZvcm1GaWxsZXIuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NCQV9Gb250bWFwLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Db21ib0JveC5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Db21ib0JveC5oIgogCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NCQV9Gb250bWFwLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfSUZvcm1GaWxsZXIuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnNka19jb21tb24uaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnNka19tZ3IuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Db21ib0JveC5oIgogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGRkxfQ29tYm9Cb3ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1DRkZMX0NvbWJvQm94OjpDRkZMX0NvbWJvQm94KENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsIENQREZTREtfQW5ub3QqIHBBbm5vdCkgOgotCUNGRkxfRm9ybUZpbGxlcihwQXBwLCBwQW5ub3QpLCBtX3BGb250TWFwKCBOVUxMICkKLXsKLQkvL21fcEZvbnRNYXAgPSBuZXcgQ0JBX0ZvbnRNYXAoIHBBbm5vdCwgR2V0U3lzdGVtSGFuZGxlcigpICk7Ci0gICAgICAgIG1fU3RhdGUubkluZGV4ID0gMDsKLSAgICAgICAgbV9TdGF0ZS5uU3RhcnQgPSAwOwotICAgICAgICBtX1N0YXRlLm5FbmQgICA9IDA7CitDRkZMX0NvbWJvQm94OjpDRkZMX0NvbWJvQm94KENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsIENQREZTREtfQW5ub3QqIHBBbm5vdCkKKyAgICA6IENGRkxfRm9ybUZpbGxlcihwQXBwLCBwQW5ub3QpLCBtX3BGb250TWFwKE5VTEwpIHsKKyAgbV9TdGF0ZS5uSW5kZXggPSAwOworICBtX1N0YXRlLm5TdGFydCA9IDA7CisgIG1fU3RhdGUubkVuZCA9IDA7CiB9CiAKLUNGRkxfQ29tYm9Cb3g6On5DRkZMX0NvbWJvQm94KCkKLXsKLQlpZiAobV9wRm9udE1hcCkKLQl7Ci0JCWRlbGV0ZSBtX3BGb250TWFwOwotCQltX3BGb250TWFwID0gTlVMTDsKLQl9Ci0KLS8vIAlmb3IgKGludCBpPTAsc3o9bV9JTUJveC5HZXRTaXplKCk7IGk8c3o7IGkrKykKLS8vIAl7Ci0vLyAJCWRlbGV0ZSBtX0lNQm94LkdldEF0KGkpOwotLy8gCX0KLS8vIAotLy8gCW1fSU1Cb3guUmVtb3ZlQWxsKCk7CitDRkZMX0NvbWJvQm94Ojp+Q0ZGTF9Db21ib0JveCgpIHsKKyAgZm9yIChjb25zdCBhdXRvJiBpdCA6IG1fTWFwcykKKyAgICBpdC5zZWNvbmQtPkludmFsaWRhdGVGb2N1c0hhbmRsZXIodGhpcyk7CisgIGRlbGV0ZSBtX3BGb250TWFwOwogfQogCi1QV0xfQ1JFQVRFUEFSQU0gQ0ZGTF9Db21ib0JveDo6R2V0Q3JlYXRlUGFyYW0oKQotewotCVBXTF9DUkVBVEVQQVJBTSBjcCA9IENGRkxfRm9ybUZpbGxlcjo6R2V0Q3JlYXRlUGFyYW0oKTsKK1BXTF9DUkVBVEVQQVJBTSBDRkZMX0NvbWJvQm94OjpHZXRDcmVhdGVQYXJhbSgpIHsKKyAgUFdMX0NSRUFURVBBUkFNIGNwID0gQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRDcmVhdGVQYXJhbSgpOwogCi0JQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKKyAgaW50IG5GbGFncyA9IG1fcFdpZGdldC0+R2V0RmllbGRGbGFncygpOworICBpZiAobkZsYWdzICYgRklFTERGTEFHX0VESVQpIHsKKyAgICBjcC5kd0ZsYWdzIHw9IFBDQlNfQUxMT1dDVVNUT01URVhUOworICB9CiAKLQlpbnQgbkZsYWdzID0gbV9wV2lkZ2V0LT5HZXRGaWVsZEZsYWdzKCk7Ci0JCi0JaWYgKG5GbGFncyAmIEZJRUxERkxBR19FRElUKQotCXsJCQotCQljcC5kd0ZsYWdzIHw9IFBDQlNfQUxMT1dDVVNUT01URVhUOwotCX0KKyAgaWYgKCFtX3BGb250TWFwKQorICAgIG1fcEZvbnRNYXAgPSBuZXcgQ0JBX0ZvbnRNYXAobV9wV2lkZ2V0LCBHZXRTeXN0ZW1IYW5kbGVyKCkpOworICBjcC5wRm9udE1hcCA9IG1fcEZvbnRNYXA7CisgIGNwLnBGb2N1c0hhbmRsZXIgPSB0aGlzOwogCi0JLyoKLQlpZiAobkZsYWdzICYgRklFTERGTEFHX0NPTU1JVE9OU0VMQ0hBTkdFKQotCXsJCQotCQltX2JDb21taXRPblNlbGVjdENoYW5nZSA9IFRSVUU7Ci0JfQotCSovCi0KLQlpZiAoIW1fcEZvbnRNYXApCi0JewotCQlBU1NFUlQodGhpcy0+bV9wQXBwICE9IE5VTEwpOwotCQltX3BGb250TWFwID0gbmV3IENCQV9Gb250TWFwKG1fcFdpZGdldCwgR2V0U3lzdGVtSGFuZGxlcigpKTsKLQkJbV9wRm9udE1hcC0+SW5pdGlhbCgpOwotCX0KLQotCWNwLnBGb250TWFwID0gbV9wRm9udE1hcDsKLQljcC5wRm9jdXNIYW5kbGVyID0gdGhpczsKLQotCXJldHVybiBjcDsKKyAgcmV0dXJuIGNwOwogfQogCi1DUFdMX1duZCogQ0ZGTF9Db21ib0JveDo6TmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKLXsKLQlDUFdMX0NvbWJvQm94ICogcFduZCA9IG5ldyBDUFdMX0NvbWJvQm94KCk7Ci0JcFduZC0+QXR0YWNoRkZMRGF0YSh0aGlzKTsKLQlwV25kLT5DcmVhdGUoY3ApOworQ1BXTF9XbmQqIENGRkxfQ29tYm9Cb3g6Ok5ld1BERldpbmRvdyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKKyAgQ1BXTF9Db21ib0JveCogcFduZCA9IG5ldyBDUFdMX0NvbWJvQm94KCk7CisgIHBXbmQtPkF0dGFjaEZGTERhdGEodGhpcyk7CisgIHBXbmQtPkNyZWF0ZShjcCk7CiAKLQlDRkZMX0lGb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IG1fcEFwcC0+R2V0SUZvcm1GaWxsZXIoKTsKLQlwV25kLT5TZXRGaWxsZXJOb3RpZnkocEZvcm1GaWxsZXIpOworICBDRkZMX0lGb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IG1fcEFwcC0+R2V0SUZvcm1GaWxsZXIoKTsKKyAgcFduZC0+U2V0RmlsbGVyTm90aWZ5KHBGb3JtRmlsbGVyKTsKIAotCUZYX0lOVDMyIG5DdXJTZWwgPSBtX3BXaWRnZXQtPkdldFNlbGVjdGVkSW5kZXgoMCk7Ci0JQ0ZYX1dpZGVTdHJpbmcgc3dUZXh0OwotCWlmIChuQ3VyU2VsIDwgMCkKLQkJc3dUZXh0ID0gbV9wV2lkZ2V0LT5HZXRWYWx1ZSgpOwotCWVsc2UKLQkJc3dUZXh0ID0gbV9wV2lkZ2V0LT5HZXRPcHRpb25MYWJlbChuQ3VyU2VsKTsKKyAgaW50MzJfdCBuQ3VyU2VsID0gbV9wV2lkZ2V0LT5HZXRTZWxlY3RlZEluZGV4KDApOworICBDRlhfV2lkZVN0cmluZyBzd1RleHQ7CisgIGlmIChuQ3VyU2VsIDwgMCkKKyAgICBzd1RleHQgPSBtX3BXaWRnZXQtPkdldFZhbHVlKCk7CisgIGVsc2UKKyAgICBzd1RleHQgPSBtX3BXaWRnZXQtPkdldE9wdGlvbkxhYmVsKG5DdXJTZWwpOwogCi0JZm9yIChGWF9JTlQzMiBpPTAsc3o9bV9wV2lkZ2V0LT5Db3VudE9wdGlvbnMoKTsgaTxzejsgaSsrKQotCXsKLQkJcFduZC0+QWRkU3RyaW5nKG1fcFdpZGdldC0+R2V0T3B0aW9uTGFiZWwoaSkuY19zdHIoKSk7Ci0JfQorICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9wV2lkZ2V0LT5Db3VudE9wdGlvbnMoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBwV25kLT5BZGRTdHJpbmcobV9wV2lkZ2V0LT5HZXRPcHRpb25MYWJlbChpKS5jX3N0cigpKTsKKyAgfQogCi0JcFduZC0+U2V0U2VsZWN0KG5DdXJTZWwpOwotCXBXbmQtPlNldFRleHQoc3dUZXh0LmNfc3RyKCkpOwotCXJldHVybiBwV25kOworICBwV25kLT5TZXRTZWxlY3QobkN1clNlbCk7CisgIHBXbmQtPlNldFRleHQoc3dUZXh0LmNfc3RyKCkpOworICByZXR1cm4gcFduZDsKIH0KIAotCi1GWF9CT09MCUNGRkxfQ29tYm9Cb3g6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQotewotCXJldHVybiBDRkZMX0Zvcm1GaWxsZXI6Ok9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOworRlhfQk9PTCBDRkZMX0NvbWJvQm94OjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzKSB7CisgIHJldHVybiBDRkZMX0Zvcm1GaWxsZXI6Ok9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOwogfQogCi1GWF9CT09MCUNGRkxfQ29tYm9Cb3g6OklzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQotewotCWlmIChDUFdMX0NvbWJvQm94ICogcFduZCA9IChDUFdMX0NvbWJvQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCi0JewotCQlGWF9JTlQzMiBuQ3VyU2VsID0gcFduZC0+R2V0U2VsZWN0KCk7CitGWF9CT09MIENGRkxfQ29tYm9Cb3g6OklzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CisgIENQV0xfQ29tYm9Cb3gqIHBXbmQgPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpOworICBpZiAoIXBXbmQpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CisgIGludDMyX3QgbkN1clNlbCA9IHBXbmQtPkdldFNlbGVjdCgpOworICBpZiAoIShtX3BXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19FRElUKSkKKyAgICByZXR1cm4gbkN1clNlbCAhPSBtX3BXaWRnZXQtPkdldFNlbGVjdGVkSW5kZXgoMCk7CiAKLQkJaWYgKG1fcFdpZGdldC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0VESVQpCi0JCXsKLQkJCWlmIChuQ3VyU2VsID49IDApCi0JCQl7Ci0JCQkJcmV0dXJuIG5DdXJTZWwgIT0gbV9wV2lkZ2V0LT5HZXRTZWxlY3RlZEluZGV4KDApOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXJldHVybiBwV25kLT5HZXRUZXh0KCkgIT0gbV9wV2lkZ2V0LT5HZXRWYWx1ZSgpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJcmV0dXJuIG5DdXJTZWwgIT0gbV9wV2lkZ2V0LT5HZXRTZWxlY3RlZEluZGV4KDApOwotCQl9Ci0JfQotCQotCXJldHVybiBGQUxTRTsKKyAgaWYgKG5DdXJTZWwgPj0gMCkKKyAgICByZXR1cm4gbkN1clNlbCAhPSBtX3BXaWRnZXQtPkdldFNlbGVjdGVkSW5kZXgoMCk7CisKKyAgcmV0dXJuIHBXbmQtPkdldFRleHQoKSAhPSBtX3BXaWRnZXQtPkdldFZhbHVlKCk7CiB9CiAKLXZvaWQgQ0ZGTF9Db21ib0JveDo6U2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQotewotCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7Cit2b2lkIENGRkxfQ29tYm9Cb3g6OlNhdmVEYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgeworICBDUFdMX0NvbWJvQm94KiBwV25kID0KKyAgICAgIHN0YXRpY19jYXN0PENQV0xfQ29tYm9Cb3gqPihHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpOworICBpZiAoIXBXbmQpCisgICAgcmV0dXJuOwogCi0JaWYgKENQV0xfQ29tYm9Cb3gqIHBXbmQgPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQotCXsKLQkJQ0ZYX1dpZGVTdHJpbmcgc3dUZXh0ID0gcFduZC0+R2V0VGV4dCgpOwotCQlGWF9JTlQzMiBuQ3VyU2VsID0gcFduZC0+R2V0U2VsZWN0KCk7CisgIENGWF9XaWRlU3RyaW5nIHN3VGV4dCA9IHBXbmQtPkdldFRleHQoKTsKKyAgaW50MzJfdCBuQ3VyU2VsID0gcFduZC0+R2V0U2VsZWN0KCk7CiAKLQkJLy9tYW50aXM6MDAwNDE1NwotCQlGWF9CT09MIGJTZXRWYWx1ZSA9IFRSVUU7CisgIGJvb2wgYlNldFZhbHVlID0gZmFsc2U7CiAKLQkJaWYgKG1fcFdpZGdldC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0VESVQpCi0JCXsKLQkJCWlmIChuQ3VyU2VsID49IDApCi0JCQl7Ci0JCQkJaWYgKHN3VGV4dCAhPSBtX3BXaWRnZXQtPkdldE9wdGlvbkxhYmVsKG5DdXJTZWwpKQotCQkJCQliU2V0VmFsdWUgPSBUUlVFOwotCQkJCWVsc2UKLQkJCQkJYlNldFZhbHVlID0gRkFMU0U7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJYlNldFZhbHVlID0gVFJVRTsKLQkJfQotCQllbHNlCi0JCQliU2V0VmFsdWUgPSBGQUxTRTsKKyAgaWYgKG1fcFdpZGdldC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0VESVQpCisgICAgYlNldFZhbHVlID0gKG5DdXJTZWwgPCAwKSB8fCAoc3dUZXh0ICE9IG1fcFdpZGdldC0+R2V0T3B0aW9uTGFiZWwobkN1clNlbCkpOwogCi0JCUNGWF9XaWRlU3RyaW5nIHNPbGRWYWx1ZTsKLQkJCisgIGlmIChiU2V0VmFsdWUpIHsKKyAgICBtX3BXaWRnZXQtPlNldFZhbHVlKHN3VGV4dCwgRkFMU0UpOworICB9IGVsc2UgeworICAgIG1fcFdpZGdldC0+R2V0U2VsZWN0ZWRJbmRleCgwKTsKKyAgICBtX3BXaWRnZXQtPlNldE9wdGlvblNlbGVjdGlvbihuQ3VyU2VsLCBUUlVFLCBGQUxTRSk7CisgIH0KIAotCQlpZiAoYlNldFZhbHVlKQotCQl7Ci0JCQlzT2xkVmFsdWUgPSBtX3BXaWRnZXQtPkdldFZhbHVlKCk7Ci0JCQltX3BXaWRnZXQtPlNldFZhbHVlKHN3VGV4dCwgRkFMU0UpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJbV9wV2lkZ2V0LT5HZXRTZWxlY3RlZEluZGV4KDApOwotCQkJbV9wV2lkZ2V0LT5TZXRPcHRpb25TZWxlY3Rpb24obkN1clNlbCwgVFJVRSwgRkFMU0UpOwotCQl9CisgIG1fcFdpZGdldC0+UmVzZXRGaWVsZEFwcGVhcmFuY2UoVFJVRSk7CisgIG1fcFdpZGdldC0+VXBkYXRlRmllbGQoKTsKKyAgU2V0Q2hhbmdlTWFyaygpOwogCi0JCW1fcFdpZGdldC0+UmVzZXRGaWVsZEFwcGVhcmFuY2UoVFJVRSk7Ci0JCW1fcFdpZGdldC0+VXBkYXRlRmllbGQoKTsKLQkJU2V0Q2hhbmdlTWFyaygpOwotCi0JCW1fcFdpZGdldC0+R2V0UERGUGFnZSgpOwotCQkKLQotCX0KKyAgbV9wV2lkZ2V0LT5HZXRQREZQYWdlKCk7CiB9CiAKLSB2b2lkIENGRkxfQ29tYm9Cb3g6OkdldEFjdGlvbkRhdGEoIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBQREZTREtfRmllbGRBY3Rpb24mIGZhKQotewotCXN3aXRjaCAodHlwZSkKLQl7Ci0JY2FzZSBDUERGX0FBY3Rpb246OktleVN0cm9rZToKLQkJaWYgKENQV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9IChDUFdMX0NvbWJvQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCi0JCXsKLQkJCWlmIChDUFdMX0VkaXQqIHBFZGl0ID0gKENQV0xfRWRpdCopKnBDb21ib0JveCkKLQkJCXsKLQkJCQlmYS5iRmllbGRGdWxsID0gcEVkaXQtPklzVGV4dEZ1bGwoKTsJCi0JCQkJaW50IG5TZWxTdGFydCA9IDA7Ci0JCQkJaW50IG5TZWxFbmQgPSAwOwotCQkJCXBFZGl0LT5HZXRTZWwoblNlbFN0YXJ0LCBuU2VsRW5kKTsKLQkJCQlmYS5uU2VsRW5kID0gblNlbEVuZDsKLQkJCQlmYS5uU2VsU3RhcnQgPSBuU2VsU3RhcnQ7Ci0JCQkJZmEuc1ZhbHVlID0gcEVkaXQtPkdldFRleHQoKTsKLQkJCQlmYS5zQ2hhbmdlRXggPSBHZXRTZWxlY3RFeHBvcnRUZXh0KCk7Cit2b2lkIENGRkxfQ29tYm9Cb3g6OkdldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24mIGZhKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2U6CisgICAgICBpZiAoQ1BXTF9Db21ib0JveCogcENvbWJvQm94ID0KKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1BXTF9Db21ib0JveCo+KEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkpIHsKKyAgICAgICAgaWYgKENQV0xfRWRpdCogcEVkaXQgPSBwQ29tYm9Cb3gtPkdldEVkaXQoKSkgeworICAgICAgICAgIGZhLmJGaWVsZEZ1bGwgPSBwRWRpdC0+SXNUZXh0RnVsbCgpOworICAgICAgICAgIGludCBuU2VsU3RhcnQgPSAwOworICAgICAgICAgIGludCBuU2VsRW5kID0gMDsKKyAgICAgICAgICBwRWRpdC0+R2V0U2VsKG5TZWxTdGFydCwgblNlbEVuZCk7CisgICAgICAgICAgZmEublNlbEVuZCA9IG5TZWxFbmQ7CisgICAgICAgICAgZmEublNlbFN0YXJ0ID0gblNlbFN0YXJ0OworICAgICAgICAgIGZhLnNWYWx1ZSA9IHBFZGl0LT5HZXRUZXh0KCk7CisgICAgICAgICAgZmEuc0NoYW5nZUV4ID0gR2V0U2VsZWN0RXhwb3J0VGV4dCgpOwogCi0JCQkJaWYgKGZhLmJGaWVsZEZ1bGwpCi0JCQkJewotCQkJCQlmYS5zQ2hhbmdlID0gTCIiOwotCQkJCQlmYS5zQ2hhbmdlRXggPSBMIiI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZToKLQkJaWYgKENQV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9IChDUFdMX0NvbWJvQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCi0JCXsKLQkJCWlmIChDUFdMX0VkaXQqIHBFZGl0ID0gKENQV0xfRWRpdCopKnBDb21ib0JveCkKLQkJCXsKLQkJCQlmYS5zVmFsdWUgPSBwRWRpdC0+R2V0VGV4dCgpOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQ1BERl9BQWN0aW9uOjpMb3NlRm9jdXM6Ci0JY2FzZSBDUERGX0FBY3Rpb246OkdldEZvY3VzOgotCQlBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwotCQlmYS5zVmFsdWUgPSBtX3BXaWRnZXQtPkdldFZhbHVlKCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KKyAgICAgICAgICBpZiAoZmEuYkZpZWxkRnVsbCkgeworICAgICAgICAgICAgZmEuc0NoYW5nZSA9IEwiIjsKKyAgICAgICAgICAgIGZhLnNDaGFuZ2VFeCA9IEwiIjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZToKKyAgICAgIGlmIChDUFdMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPQorICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDUFdMX0NvbWJvQm94Kj4oR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKSkgeworICAgICAgICBpZiAoQ1BXTF9FZGl0KiBwRWRpdCA9IHBDb21ib0JveC0+R2V0RWRpdCgpKSB7CisgICAgICAgICAgZmEuc1ZhbHVlID0gcEVkaXQtPkdldFRleHQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FBY3Rpb246Okxvc2VGb2N1czoKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6R2V0Rm9jdXM6CisgICAgICBmYS5zVmFsdWUgPSBtX3BXaWRnZXQtPkdldFZhbHVlKCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KIH0KIAotCi0KLXZvaWQgQ0ZGTF9Db21ib0JveDo6U2V0QWN0aW9uRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgCi0JCQkJCQkJCQljb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhKQotewotCXN3aXRjaCAodHlwZSkKLQl7Ci0JY2FzZSBDUERGX0FBY3Rpb246OktleVN0cm9rZToKLQkJaWYgKENQV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9IChDUFdMX0NvbWJvQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCi0JCXsKLQkJCWlmIChDUFdMX0VkaXQqIHBFZGl0ID0gKENQV0xfRWRpdCopKnBDb21ib0JveCkKLQkJCXsKLQkJCQlwRWRpdC0+U2V0U2VsKGZhLm5TZWxTdGFydCwgZmEublNlbEVuZCk7Ci0JCQkJcEVkaXQtPlJlcGxhY2VTZWwoZmEuc0NoYW5nZS5jX3N0cigpKTsKLQkJCX0KLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Cit2b2lkIENGRkxfQ29tYm9Cb3g6OlNldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2U6CisgICAgICBpZiAoQ1BXTF9Db21ib0JveCogcENvbWJvQm94ID0KKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1BXTF9Db21ib0JveCo+KEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkpIHsKKyAgICAgICAgaWYgKENQV0xfRWRpdCogcEVkaXQgPSBwQ29tYm9Cb3gtPkdldEVkaXQoKSkgeworICAgICAgICAgIHBFZGl0LT5TZXRTZWwoZmEublNlbFN0YXJ0LCBmYS5uU2VsRW5kKTsKKyAgICAgICAgICBwRWRpdC0+UmVwbGFjZVNlbChmYS5zQ2hhbmdlLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KIH0KIAotRlhfQk9PTAlDRkZMX0NvbWJvQm94OjpJc0FjdGlvbkRhdGFDaGFuZ2VkKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU9sZCwgCi0JCQkJCQkJCQljb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhTmV3KQotewotCXN3aXRjaCAodHlwZSkKLQl7Ci0JY2FzZSBDUERGX0FBY3Rpb246OktleVN0cm9rZToKLQkJcmV0dXJuICghZmFPbGQuYkZpZWxkRnVsbCAmJiBmYU9sZC5uU2VsRW5kICE9IGZhTmV3Lm5TZWxFbmQpIHx8IGZhT2xkLm5TZWxTdGFydCAhPSBmYU5ldy5uU2VsU3RhcnQgfHwKLQkJCWZhT2xkLnNDaGFuZ2UgIT0gZmFOZXcuc0NoYW5nZTsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9CitGWF9CT09MIENGRkxfQ29tYm9Cb3g6OklzQWN0aW9uRGF0YUNoYW5nZWQoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFPbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU5ldykgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlOgorICAgICAgcmV0dXJuICghZmFPbGQuYkZpZWxkRnVsbCAmJiBmYU9sZC5uU2VsRW5kICE9IGZhTmV3Lm5TZWxFbmQpIHx8CisgICAgICAgICAgICAgZmFPbGQublNlbFN0YXJ0ICE9IGZhTmV3Lm5TZWxTdGFydCB8fAorICAgICAgICAgICAgIGZhT2xkLnNDaGFuZ2UgIT0gZmFOZXcuc0NoYW5nZTsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KIAotCXJldHVybiBGQUxTRTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi12b2lkIENGRkxfQ29tYm9Cb3g6OlNhdmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCi17Ci0JQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKK3ZvaWQgQ0ZGTF9Db21ib0JveDo6U2F2ZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgeworICBBU1NFUlQocFBhZ2VWaWV3KTsKIAotCWlmIChDUFdMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQotCXsKLQkJbV9TdGF0ZS5uSW5kZXggPSBwQ29tYm9Cb3gtPkdldFNlbGVjdCgpOworICBpZiAoQ1BXTF9Db21ib0JveCogcENvbWJvQm94ID0KKyAgICAgICAgICBzdGF0aWNfY2FzdDxDUFdMX0NvbWJvQm94Kj4oR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKSkgeworICAgIG1fU3RhdGUubkluZGV4ID0gcENvbWJvQm94LT5HZXRTZWxlY3QoKTsKIAotCQlpZiAoQ1BXTF9FZGl0KiBwRWRpdCA9IChDUFdMX0VkaXQqKSpwQ29tYm9Cb3gpCi0JCXsKLQkJCXBFZGl0LT5HZXRTZWwobV9TdGF0ZS5uU3RhcnQsIG1fU3RhdGUubkVuZCk7Ci0JCQltX1N0YXRlLnNWYWx1ZSA9IHBFZGl0LT5HZXRUZXh0KCk7Ci0JCX0KLQl9CisgICAgaWYgKENQV0xfRWRpdCogcEVkaXQgPSBwQ29tYm9Cb3gtPkdldEVkaXQoKSkgeworICAgICAgcEVkaXQtPkdldFNlbChtX1N0YXRlLm5TdGFydCwgbV9TdGF0ZS5uRW5kKTsKKyAgICAgIG1fU3RhdGUuc1ZhbHVlID0gcEVkaXQtPkdldFRleHQoKTsKKyAgICB9CisgIH0KIH0KIAotdm9pZCBDRkZMX0NvbWJvQm94OjpSZXN0b3JlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQotewotCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Cit2b2lkIENGRkxfQ29tYm9Cb3g6OlJlc3RvcmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKKyAgQVNTRVJUKHBQYWdlVmlldyk7CiAKLQlpZiAoQ1BXTF9Db21ib0JveCogcENvbWJvQm94ID0gKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpKQotCXsKLQkJaWYgKG1fU3RhdGUubkluZGV4ID49IDApCi0JCQlwQ29tYm9Cb3gtPlNldFNlbGVjdChtX1N0YXRlLm5JbmRleCk7Ci0JCWVsc2UKLQkJewotCQkJaWYgKENQV0xfRWRpdCogcEVkaXQgPSAoQ1BXTF9FZGl0KikqcENvbWJvQm94KQotCQkJewotCQkJCXBFZGl0LT5TZXRUZXh0KG1fU3RhdGUuc1ZhbHVlLmNfc3RyKCkpOwotCQkJCXBFZGl0LT5TZXRTZWwobV9TdGF0ZS5uU3RhcnQsIG1fU3RhdGUubkVuZCk7Ci0JCQl9Ci0JCX0KLQl9CisgIGlmIChDUFdMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPQorICAgICAgICAgIHN0YXRpY19jYXN0PENQV0xfQ29tYm9Cb3gqPihHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKSkpIHsKKyAgICBpZiAobV9TdGF0ZS5uSW5kZXggPj0gMCkgeworICAgICAgcENvbWJvQm94LT5TZXRTZWxlY3QobV9TdGF0ZS5uSW5kZXgpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoQ1BXTF9FZGl0KiBwRWRpdCA9IHBDb21ib0JveC0+R2V0RWRpdCgpKSB7CisgICAgICAgIHBFZGl0LT5TZXRUZXh0KG1fU3RhdGUuc1ZhbHVlLmNfc3RyKCkpOworICAgICAgICBwRWRpdC0+U2V0U2VsKG1fU3RhdGUublN0YXJ0LCBtX1N0YXRlLm5FbmQpOworICAgICAgfQorICAgIH0KKyAgfQogfQogCi1DUFdMX1duZCogQ0ZGTF9Db21ib0JveDo6UmVzZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MIGJSZXN0b3JlVmFsdWUpCi17Ci0JaWYgKGJSZXN0b3JlVmFsdWUpCi0JCVNhdmVTdGF0ZShwUGFnZVZpZXcpOwotCQotCURlc3Ryb3lQREZXaW5kb3cocFBhZ2VWaWV3KTsKLQkKLQlDUFdMX1duZCogcFJldCA9IE5VTEw7Ci0JCi0JaWYgKGJSZXN0b3JlVmFsdWUpCi0JewotCQlSZXN0b3JlU3RhdGUocFBhZ2VWaWV3KTsKLQkJcFJldCA9IHRoaXMtPkdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKTsKLQl9Ci0JZWxzZQotCQlwUmV0ID0gdGhpcy0+R2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSk7Ci0JCi0JbV9wV2lkZ2V0LT5VcGRhdGVGaWVsZCgpOwotCQotCXJldHVybiBwUmV0OworQ1BXTF9XbmQqIENGRkxfQ29tYm9Cb3g6OlJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZXN0b3JlVmFsdWUpIHsKKyAgaWYgKGJSZXN0b3JlVmFsdWUpCisgICAgU2F2ZVN0YXRlKHBQYWdlVmlldyk7CisKKyAgRGVzdHJveVBERldpbmRvdyhwUGFnZVZpZXcpOworCisgIENQV0xfV25kKiBwUmV0ID0gTlVMTDsKKworICBpZiAoYlJlc3RvcmVWYWx1ZSkgeworICAgIFJlc3RvcmVTdGF0ZShwUGFnZVZpZXcpOworICAgIHBSZXQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7CisgIH0gZWxzZSB7CisgICAgcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpOworICB9CisKKyAgbV9wV2lkZ2V0LT5VcGRhdGVGaWVsZCgpOworCisgIHJldHVybiBwUmV0OwogfQogCi12b2lkIENGRkxfQ29tYm9Cb3g6Ok9uS2V5U3Ryb2tlKEZYX0JPT0wgYktleURvd24sIEZYX1VJTlQgbkZsYWcpCi17Ci0JQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKLQkKLQlpbnQgbkZsYWdzID0gbV9wV2lkZ2V0LT5HZXRGaWVsZEZsYWdzKCk7Ci0JCi0JaWYgKG5GbGFncyAmIEZJRUxERkxBR19DT01NSVRPTlNFTENIQU5HRSkKLQl7Ci0JCWlmIChtX2JWYWxpZCkKLQkJewotCQkJQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gdGhpcy0+R2V0Q3VyUGFnZVZpZXcoKTsKLQkJCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK0ZYX0JPT0wgQ0ZGTF9Db21ib0JveDo6SXNGaWVsZEZ1bGwoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CisgIGlmIChDUFdMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPQorICAgICAgICAgIHN0YXRpY19jYXN0PENQV0xfQ29tYm9Cb3gqPihHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpKSB7CisgICAgaWYgKENQV0xfRWRpdCogcEVkaXQgPSBwQ29tYm9Cb3gtPkdldEVkaXQoKSkKKyAgICAgIHJldHVybiBwRWRpdC0+SXNUZXh0RnVsbCgpOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAotCQkJaWYgKENvbW1pdERhdGEocFBhZ2VWaWV3LCBuRmxhZykpCi0JCQl7Ci0JCQkJRGVzdHJveVBERldpbmRvdyhwUGFnZVZpZXcpOwotCQkJCW1fYlZhbGlkID0gRkFMU0U7Ci0JCQl9Ci0JCX0KLQl9Cit2b2lkIENGRkxfQ29tYm9Cb3g6Ok9uU2V0Rm9jdXMoQ1BXTF9XbmQqIHBXbmQpIHsKKyAgQVNTRVJUKG1fcEFwcCk7CisKKyAgaWYgKHBXbmQtPkdldENsYXNzTmFtZSgpID09IFBXTF9DTEFTU05BTUVfRURJVCkgeworICAgIENQV0xfRWRpdCogcEVkaXQgPSAoQ1BXTF9FZGl0KilwV25kOworICAgIHBFZGl0LT5TZXRDaGFyU2V0KDEzNCk7CisgICAgcEVkaXQtPlNldENvZGVQYWdlKDkzNik7CisKKyAgICBwRWRpdC0+U2V0UmVhZHlUb0lucHV0KCk7CisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0ID0gcEVkaXQtPkdldFRleHQoKTsKKyAgICBpbnQgbkNoYXJhY3RlcnMgPSB3c1RleHQuR2V0TGVuZ3RoKCk7CisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNVVEZUZXh0ID0gd3NUZXh0LlVURjE2TEVfRW5jb2RlKCk7CisgICAgdW5zaWduZWQgc2hvcnQqIHBCdWZmZXIgPSAodW5zaWduZWQgc2hvcnQqKWJzVVRGVGV4dC5jX3N0cigpOworICAgIG1fcEFwcC0+RkZJX09uU2V0RmllbGRJbnB1dEZvY3VzKG1fcFdpZGdldC0+R2V0Rm9ybUZpZWxkKCksIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNoYXJhY3RlcnMsIFRSVUUpOworCisgICAgcEVkaXQtPlNldEVkaXROb3RpZnkodGhpcyk7CisgIH0KIH0KIAotdm9pZCBDRkZMX0NvbWJvQm94OjpPblNldEZvY3VzKENQV0xfV25kKiBwV25kKQotewotCUFTU0VSVChtX3BBcHAgIT0gTlVMTCk7Ci0KLQlBU1NFUlQocFduZCAhPSBOVUxMKTsKLQotCWlmIChwV25kLT5HZXRDbGFzc05hbWUoKSA9PSBQV0xfQ0xBU1NOQU1FX0VESVQpCi0JewotCQlDUFdMX0VkaXQqIHBFZGl0ID0gKENQV0xfRWRpdCopcFduZDsKLQkJcEVkaXQtPlNldENoYXJTZXQoMTM0KTsKLQkJcEVkaXQtPlNldENvZGVQYWdlKDkzNik7Ci0KLQkJcEVkaXQtPlNldFJlYWR5VG9JbnB1dCgpOwotCQlDRlhfV2lkZVN0cmluZyB3c1RleHQgPSBwRWRpdC0+R2V0VGV4dCgpOwotCQlpbnQgbkNoYXJhY3RlcnMgPSB3c1RleHQuR2V0TGVuZ3RoKCk7Ci0JCUNGWF9CeXRlU3RyaW5nIGJzVVRGVGV4dCA9IHdzVGV4dC5VVEYxNkxFX0VuY29kZSgpOwotCQl1bnNpZ25lZCBzaG9ydCogcEJ1ZmZlciA9ICh1bnNpZ25lZCBzaG9ydCopYnNVVEZUZXh0LmNfc3RyKCk7Ci0JCW1fcEFwcC0+RkZJX09uU2V0RmllbGRJbnB1dEZvY3VzKG1fcFdpZGdldC0+R2V0Rm9ybUZpZWxkKCksIHBCdWZmZXIsIG5DaGFyYWN0ZXJzLCBUUlVFKTsKLQotIAkJcEVkaXQtPlNldEVkaXROb3RpZnkodGhpcyk7Ci0JfQordm9pZCBDRkZMX0NvbWJvQm94OjpPbktpbGxGb2N1cyhDUFdMX1duZCogcFduZCkgeworICBBU1NFUlQobV9wQXBwKTsKIH0KIAotdm9pZCBDRkZMX0NvbWJvQm94OjpPbktpbGxGb2N1cyhDUFdMX1duZCogcFduZCkKLXsKLQlBU1NFUlQobV9wQXBwICE9IE5VTEwpOwordm9pZCBDRkZMX0NvbWJvQm94OjpPbkFkZFVuZG8oQ1BXTF9FZGl0KiBwRWRpdCkgeworICBBU1NFUlQocEVkaXQpOwogfQogCi1GWF9CT09MCUNGRkxfQ29tYm9Cb3g6OkNhbkNvcHkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQotewotCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CitDRlhfV2lkZVN0cmluZyBDRkZMX0NvbWJvQm94OjpHZXRTZWxlY3RFeHBvcnRUZXh0KCkgeworICBDRlhfV2lkZVN0cmluZyBzd1JldDsKIAotCXJldHVybiBGQUxTRTsKLX0KKyAgaW50IG5FeHBvcnQgPSAtMTsKKyAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gR2V0Q3VyUGFnZVZpZXcoKTsKKyAgaWYgKENQV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9CisgICAgICAgICAgKENQV0xfQ29tYm9Cb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgIG5FeHBvcnQgPSBwQ29tYm9Cb3gtPkdldFNlbGVjdCgpOworICB9CiAKLUZYX0JPT0wgQ0ZGTF9Db21ib0JveDo6Q2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLQlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOworICBpZiAobkV4cG9ydCA+PSAwKSB7CisgICAgaWYgKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gbV9wV2lkZ2V0LT5HZXRGb3JtRmllbGQoKSkgeworICAgICAgc3dSZXQgPSBwRm9ybUZpZWxkLT5HZXRPcHRpb25WYWx1ZShuRXhwb3J0KTsKKyAgICAgIGlmIChzd1JldC5Jc0VtcHR5KCkpCisgICAgICAgIHN3UmV0ID0gcEZvcm1GaWVsZC0+R2V0T3B0aW9uTGFiZWwobkV4cG9ydCk7CisgICAgfQorICB9CiAKLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wJQ0ZGTF9Db21ib0JveDo6Q2FuUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQotewotCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLXZvaWQgQ0ZGTF9Db21ib0JveDo6RG9Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLQlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwotfQotCi12b2lkIENGRkxfQ29tYm9Cb3g6OkRvQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLQlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwotfQotCi12b2lkIENGRkxfQ29tYm9Cb3g6OkRvUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQotewotCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7Ci19Ci0KLXZvaWQgQ0ZGTF9Db21ib0JveDo6T25BZGRVbmRvKENQV0xfRWRpdCogcEVkaXQpCi17Ci0JQVNTRVJUKHBFZGl0ICE9IE5VTEwpOwotfQotCi1DRlhfV2lkZVN0cmluZyBDRkZMX0NvbWJvQm94OjpHZXRTZWxlY3RFeHBvcnRUZXh0KCkKLXsKLQlDRlhfV2lkZVN0cmluZyBzd1JldDsKLQkKLQlpbnQgbkV4cG9ydCA9IC0xOwotCUNQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KCk7Ci0JaWYgKENQV0xfQ29tYm9Cb3ggKiBwQ29tYm9Cb3ggPSAoQ1BXTF9Db21ib0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQotCXsKLQkJbkV4cG9ydCA9IHBDb21ib0JveC0+R2V0U2VsZWN0KCk7Ci0JfQotCQotCWlmIChuRXhwb3J0ID49IDApCi0JewotCQlpZiAoQ1BERl9Gb3JtRmllbGQgKiBwRm9ybUZpZWxkID0gbV9wV2lkZ2V0LT5HZXRGb3JtRmllbGQoKSkKLQkJewotCQkJc3dSZXQgPSBwRm9ybUZpZWxkLT5HZXRPcHRpb25WYWx1ZShuRXhwb3J0KTsKLQkJCWlmIChzd1JldC5Jc0VtcHR5KCkpCi0JCQkJc3dSZXQgPSBwRm9ybUZpZWxkLT5HZXRPcHRpb25MYWJlbChuRXhwb3J0KTsKLQkJfQotCX0KLQkKLQlyZXR1cm4gc3dSZXQ7CisgIHJldHVybiBzd1JldDsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuY3BwIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5jcHAKaW5kZXggNTMwYjgwYy4uY2U3M2Y3ZCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5jcHAKKysrIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5jcHAKQEAgLTEsOTI1ICsxLDcyNyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuaCIKIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfTm90aWZ5LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9DQkFfRm9udG1hcC5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9DQkFfRm9udG1hcC5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mc2RrX2NvbW1vbi5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mc2RrX21nci5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1V0aWxzLmgiCiAKLSNkZWZpbmUgR2V0UmVkKHJnYikJCQkoKEZYX0JZVEUpKHJnYikpCi0jZGVmaW5lIEdldEdyZWVuKHJnYikJCSgoRlhfQllURSkoKChGWF9XT1JEKShyZ2IpKSA+PiA4KSkKLSNkZWZpbmUgR2V0Qmx1ZShyZ2IpCQkoKEZYX0JZVEUpKChyZ2IpPj4xNikpCisjZGVmaW5lIEdldFJlZChyZ2IpICgodWludDhfdCkocmdiKSkKKyNkZWZpbmUgR2V0R3JlZW4ocmdiKSAoKHVpbnQ4X3QpKCgoRlhfV09SRCkocmdiKSkgPj4gOCkpCisjZGVmaW5lIEdldEJsdWUocmdiKSAoKHVpbnQ4X3QpKChyZ2IpID4+IDE2KSkKIAotI2RlZmluZSBGRkxfSElOVF9FTEFQU0UJCTgwMAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGRkxfRm9ybUZpbGxlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIEZGTF9ISU5UX0VMQVBTRSA4MDAKIAotQ0ZGTF9Gb3JtRmlsbGVyOjpDRkZMX0Zvcm1GaWxsZXIoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19Bbm5vdCogcEFubm90KQotCTptX3BBcHAocEFwcCksCi0JbV9wQW5ub3QocEFubm90KSwKLQltX2JWYWxpZChGQUxTRSksCi0JbV9wdE9sZFBvcygwLDApCi17IAotCW1fcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopIHBBbm5vdDsKK0NGRkxfRm9ybUZpbGxlcjo6Q0ZGTF9Gb3JtRmlsbGVyKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QpCisgICAgOiBtX3BBcHAocEFwcCksIG1fcEFubm90KHBBbm5vdCksIG1fYlZhbGlkKEZBTFNFKSwgbV9wdE9sZFBvcygwLCAwKSB7CisgIG1fcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwogfQogCi1DRkZMX0Zvcm1GaWxsZXI6On5DRkZMX0Zvcm1GaWxsZXIoKQotewotCUZYX1BPU0lUSU9OIHBvcyA9IG1fTWFwcy5HZXRTdGFydFBvc2l0aW9uKCk7Ci0Jd2hpbGUgKHBvcykKLQl7Ci0JCUNQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcgPSBOVUxMOwotCQlDUFdMX1duZCogcFduZCA9IE5VTEw7Ci0JCW1fTWFwcy5HZXROZXh0QXNzb2MocG9zLCBwUGFnZVZpZXcsIHBXbmQpOwotCi0JCWlmIChwV25kKQotCQl7Ci0JCQlDRkZMX1ByaXZhdGVEYXRhKiBwRGF0YSA9IChDRkZMX1ByaXZhdGVEYXRhKilwV25kLT5HZXRBdHRhY2hlZERhdGEoKTsKLQkJCXBXbmQtPkRlc3Ryb3koKTsKLQkJCWRlbGV0ZSBwV25kOwotCQkJZGVsZXRlIHBEYXRhOwotCQl9Ci0JfQotCW1fTWFwcy5SZW1vdmVBbGwoKTsKLQorQ0ZGTF9Gb3JtRmlsbGVyOjp+Q0ZGTF9Gb3JtRmlsbGVyKCkgeworICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogbV9NYXBzKSB7CisgICAgQ1BXTF9XbmQqIHBXbmQgPSBpdC5zZWNvbmQ7CisgICAgQ0ZGTF9Qcml2YXRlRGF0YSogcERhdGEgPSAoQ0ZGTF9Qcml2YXRlRGF0YSopcFduZC0+R2V0QXR0YWNoZWREYXRhKCk7CisgICAgcFduZC0+SW52YWxpZGF0ZVByb3ZpZGVyKHRoaXMpOworICAgIHBXbmQtPkRlc3Ryb3koKTsKKyAgICBkZWxldGUgcFduZDsKKyAgICBkZWxldGUgcERhdGE7CisgIH0KKyAgbV9NYXBzLmNsZWFyKCk7CiB9CiAKLXZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpTZXRXaW5kb3dSZWN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgY29uc3QgQ1BERl9SZWN0JiByY1dpbmRvdykKLXsKLQlpZiAoQ1BXTF9XbmQqIHBXbmQgPSB0aGlzLT5HZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCi0JewotCQlwV25kLT5Nb3ZlKENQREZfUmVjdChyY1dpbmRvdyksIFRSVUUsIEZBTFNFKTsKLQl9Cit2b2lkIENGRkxfRm9ybUZpbGxlcjo6U2V0V2luZG93UmVjdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJjV2luZG93KSB7CisgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgIHBXbmQtPk1vdmUoQ1BERl9SZWN0KHJjV2luZG93KSwgVFJVRSwgRkFMU0UpOworICB9CiB9CiAKLUNQREZfUmVjdCBDRkZMX0Zvcm1GaWxsZXI6OkdldFdpbmRvd1JlY3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQotewotCWlmIChDUFdMX1duZCogcFduZCA9IHRoaXMtPkdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLQl7Ci0JCXJldHVybiBwV25kLT5HZXRXaW5kb3dSZWN0KCk7Ci0JfQorQ1BERl9SZWN0IENGRkxfRm9ybUZpbGxlcjo6R2V0V2luZG93UmVjdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKKyAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKSB7CisgICAgcmV0dXJuIHBXbmQtPkdldFdpbmRvd1JlY3QoKTsKKyAgfQogCi0JcmV0dXJuIENQREZfUmVjdCgwLDAsMCwwKTsKKyAgcmV0dXJuIENQREZfUmVjdCgwLCAwLCAwLCAwKTsKIH0KIAotRlhfUkVDVCBDRkZMX0Zvcm1GaWxsZXI6OkdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KQotewotCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Ci0JQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKK0ZYX1JFQ1QgQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIEFTU0VSVChwUGFnZVZpZXcpOworICBBU1NFUlQocEFubm90KTsKIAotCUNQREZfUmVjdCByY0Fubm90ID0gbV9wV2lkZ2V0LT5HZXRSZWN0KCk7CisgIENQREZfUmVjdCByY0Fubm90ID0gbV9wV2lkZ2V0LT5HZXRSZWN0KCk7CiAKLQlpZiAoQ1BXTF9XbmQqIHBXbmQgPSB0aGlzLT5HZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCi0JewotCQlDUERGX1JlY3QgcmNXaW5kb3cgPSBwV25kLT5HZXRXaW5kb3dSZWN0KCk7Ci0JCXJjQW5ub3QgPSBQV0x0b0ZGTChyY1dpbmRvdyk7Ci0JfQorICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpIHsKKyAgICBDUERGX1JlY3QgcmNXaW5kb3cgPSBwV25kLT5HZXRXaW5kb3dSZWN0KCk7CisgICAgcmNBbm5vdCA9IFBXTHRvRkZMKHJjV2luZG93KTsKKyAgfQogCi0JQ1BERl9SZWN0IHJjV2luID0gcmNBbm5vdDsKLS8vCXBQYWdlVmlldy0+RG9jVG9XaW5kb3cocmNBbm5vdCwgcmNXaW4pOworICBDUERGX1JlY3QgcmNXaW4gPSByY0Fubm90OwogCi0JQ1BERl9SZWN0IHJjRm9jdXMgPSB0aGlzLT5HZXRGb2N1c0JveChwUGFnZVZpZXcpOwotCWlmICghcmNGb2N1cy5Jc0VtcHR5KCkpCi0JCXJjV2luLlVuaW9uKHJjRm9jdXMpOworICBDUERGX1JlY3QgcmNGb2N1cyA9IEdldEZvY3VzQm94KHBQYWdlVmlldyk7CisgIGlmICghcmNGb2N1cy5Jc0VtcHR5KCkpCisgICAgcmNXaW4uVW5pb24ocmNGb2N1cyk7CiAKLQlDUERGX1JlY3QgcmVjdCA9IENQV0xfVXRpbHM6OkluZmxhdGVSZWN0KHJjV2luLDEpOworICBDUERGX1JlY3QgcmVjdCA9IENQV0xfVXRpbHM6OkluZmxhdGVSZWN0KHJjV2luLCAxKTsKIAotCXJldHVybiByZWN0LkdldE91dHRlclJlY3QoKTsKKyAgcmV0dXJuIHJlY3QuR2V0T3V0dGVyUmVjdCgpOwogfQogCi12b2lkIENGRkxfRm9ybUZpbGxlcjo6T25EcmF3KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgLypIREMgaERDLCovIENQREZTREtfQW5ub3QqIHBBbm5vdCwgCi0JCQkJCQlDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAotCQkJCQkJLypjb25zdCBDUmVjdCYgcmNXaW5kb3csKi8gRlhfRFdPUkQgZHdGbGFncykKLXsKLQlBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwordm9pZCBDRkZMX0Zvcm1GaWxsZXI6Ok9uRHJhdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKSB7CisgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CiAKLQlpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQotCXsKLQkJQ1BERl9NYXRyaXggbXQgPSB0aGlzLT5HZXRDdXJNYXRyaXgoKTsKLQkJbXQuQ29uY2F0KCpwVXNlcjJEZXZpY2UpOwotCQlwV25kLT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCZtdCk7Ci0JfQotCWVsc2UKLQl7Ci0JCUNQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7Ci0JCWlmIChDRkZMX0lGb3JtRmlsbGVyOjpJc1Zpc2libGUocFdpZGdldCkpCi0JCQlwV2lkZ2V0LT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIENQREZfQW5ub3Q6Ok5vcm1hbCwgTlVMTCk7Ci0JfQorICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpIHsKKyAgICBDRlhfTWF0cml4IG10ID0gR2V0Q3VyTWF0cml4KCk7CisgICAgbXQuQ29uY2F0KCpwVXNlcjJEZXZpY2UpOworICAgIHBXbmQtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsICZtdCk7CisgIH0gZWxzZSB7CisgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKKyAgICBpZiAoQ0ZGTF9JRm9ybUZpbGxlcjo6SXNWaXNpYmxlKHBXaWRnZXQpKQorICAgICAgcFdpZGdldC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsIE5VTEwpOworICB9CiB9CiAKLXZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpPbkRyYXdEZWFjdGl2ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIC8qSERDIGhEQywqLyBDUERGU0RLX0Fubm90KiBwQW5ub3QsIAotCQkJCQkJQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKLQkJCQkJCS8qY29uc3QgQ1JlY3QmIHJjV2luZG93LCovIEZYX0RXT1JEIGR3RmxhZ3MpCi17Ci0JQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQkKLQlDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwotCQotCXBXaWRnZXQtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgQ1BERl9Bbm5vdDo6Tm9ybWFsLCBOVUxMKTsKK3ZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpPbkRyYXdEZWFjdGl2ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpIHsKKyAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKKyAgcFdpZGdldC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsIE5VTEwpOwogfQogCit2b2lkIENGRkxfRm9ybUZpbGxlcjo6T25DcmVhdGUoQ1BERlNES19Bbm5vdCogcEFubm90KSB7fQogCi12b2lkIENGRkxfRm9ybUZpbGxlcjo6T25DcmVhdGUoQ1BERlNES19Bbm5vdCogcEFubm90KQotewotfQordm9pZCBDRkZMX0Zvcm1GaWxsZXI6Ok9uTG9hZChDUERGU0RLX0Fubm90KiBwQW5ub3QpIHt9CiAKLXZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpPbkxvYWQoQ1BERlNES19Bbm5vdCogcEFubm90KQotewotfQordm9pZCBDRkZMX0Zvcm1GaWxsZXI6Ok9uRGVsZXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCkge30KIAotdm9pZCBDRkZMX0Zvcm1GaWxsZXI6Ok9uRGVsZXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCkKLXsKLX0KK3ZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpPbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QpIHt9CiAKLXZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpPbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpCi17Cit2b2lkIENGRkxfRm9ybUZpbGxlcjo6T25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCkgeworICBFbmRUaW1lcigpOworICBBU1NFUlQobV9wV2lkZ2V0KTsKIH0KIAotdm9pZCBDRkZMX0Zvcm1GaWxsZXI6Ok9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KQotewotCUVuZFRpbWVyKCk7Ci0JQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKLX0KK0ZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpIHsKKyAgICBtX2JWYWxpZCA9IFRSVUU7CisgICAgRlhfUkVDVCByZWN0ID0gR2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBwQW5ub3QpOworICAgIEludmFsaWRhdGVSZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKTsKIAotRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6Ok9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLQlpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCi0JewkJCi0JCW1fYlZhbGlkID0gVFJVRTsKLQkJRlhfUkVDVCByZWN0ID0gdGhpcy0+R2V0Vmlld0JCb3gocFBhZ2VWaWV3LHBBbm5vdCk7Ci0JCXRoaXMtPkludmFsaWRhdGVSZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKTsKLQotIAkJaWYoIXJlY3QuQ29udGFpbnMoKGludClwb2ludC54LCAoaW50KXBvaW50LnkpKQotICAJCQlyZXR1cm4gRkFMU0U7CisgICAgaWYgKCFyZWN0LkNvbnRhaW5zKChpbnQpcG9pbnQueCwgKGludClwb2ludC55KSkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlyZXR1cm4gcFduZC0+T25MQnV0dG9uRG93bihXbmR0b1BXTChwUGFnZVZpZXcsIHBvaW50KSxuRmxhZ3MpOwotCX0KKyAgICByZXR1cm4gcFduZC0+T25MQnV0dG9uRG93bihXbmR0b1BXTChwUGFnZVZpZXcsIHBvaW50KSwgbkZsYWdzKTsKKyAgfQogCi0JcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wJQ0ZGTF9Gb3JtRmlsbGVyOjpPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotCWlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCi0JewkKLQkJRlhfUkVDVCByY0ZGTCA9ICB0aGlzLT5HZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdCk7Ci0JCXRoaXMtPkludmFsaWRhdGVSZWN0KHJjRkZMLmxlZnQsIHJjRkZMLnRvcCwgcmNGRkwucmlnaHQsIHJjRkZMLmJvdHRvbSk7Ci0JCXBXbmQtPk9uTEJ1dHRvblVwKFduZHRvUFdMKHBQYWdlVmlldywgcG9pbnQpLG5GbGFncyk7Ci0JCXJldHVybiBUUlVFOwotCX0KK0ZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgIEZYX1JFQ1QgcmNGRkwgPSBHZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdCk7CisgICAgSW52YWxpZGF0ZVJlY3QocmNGRkwubGVmdCwgcmNGRkwudG9wLCByY0ZGTC5yaWdodCwgcmNGRkwuYm90dG9tKTsKKyAgICBwV25kLT5PbkxCdXR0b25VcChXbmR0b1BXTChwUGFnZVZpZXcsIHBvaW50KSwgbkZsYWdzKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQogCi0JcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wJQ0ZGTF9Gb3JtRmlsbGVyOjpPbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLQlpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQotCXsJCQkJCi0JCXBXbmQtPk9uTEJ1dHRvbkRibENsayhXbmR0b1BXTChwUGFnZVZpZXcsIHBvaW50KSxuRmxhZ3MpOwotCQlyZXR1cm4gVFJVRTsKLQl9CitGWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKSB7CisgICAgcFduZC0+T25MQnV0dG9uRGJsQ2xrKFduZHRvUFdMKHBQYWdlVmlldywgcG9pbnQpLCBuRmxhZ3MpOworICAgIHJldHVybiBUUlVFOworICB9CiAKLQlyZXR1cm4gRkFMU0U7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6Ok9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0JaWYgKChtX3B0T2xkUG9zLnggIT0gcG9pbnQueCkgfHwgKG1fcHRPbGRQb3MueSAhPSBwb2ludC55KSkKLQl7Ci0JCW1fcHRPbGRQb3MgPSBwb2ludDsKLQl9CitGWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBpZiAoKG1fcHRPbGRQb3MueCAhPSBwb2ludC54KSB8fCAobV9wdE9sZFBvcy55ICE9IHBvaW50LnkpKSB7CisgICAgbV9wdE9sZFBvcyA9IHBvaW50OworICB9CiAKLQlpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQotCXsJCQkJCi0JCXBXbmQtPk9uTW91c2VNb3ZlKFduZHRvUFdMKHBQYWdlVmlldywgcG9pbnQpLG5GbGFncyk7Ci0JCXJldHVybiBUUlVFOwotCX0KKyAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKSB7CisgICAgcFduZC0+T25Nb3VzZU1vdmUoV25kdG9QV0wocFBhZ2VWaWV3LCBwb2ludCksIG5GbGFncyk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KIAotCXJldHVybiBGQUxTRTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLQlpZiAoIUlzVmFsaWQoKSkgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6Ok9uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHpEZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgaWYgKCFJc1ZhbGlkKCkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpKQotCXsJCQkJCi0JCXJldHVybiBwV25kLT5Pbk1vdXNlV2hlZWwoekRlbHRhLCBXbmR0b1BXTChwUGFnZVZpZXcsIHBvaW50KSxuRmxhZ3MpOwotCX0KKyAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpIHsKKyAgICByZXR1cm4gcFduZC0+T25Nb3VzZVdoZWVsKHpEZWx0YSwgV25kdG9QV0wocFBhZ2VWaWV3LCBwb2ludCksIG5GbGFncyk7CisgIH0KIAotCXJldHVybiBGQUxTRTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotCWlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKSkKLQl7CQkJCQotCQlwV25kLT5PblJCdXR0b25Eb3duKFduZHRvUFdMKHBQYWdlVmlldywgcG9pbnQpLG5GbGFncyk7Ci0JCXJldHVybiBUUlVFOwotCX0KK0ZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpPblJCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpIHsKKyAgICBwV25kLT5PblJCdXR0b25Eb3duKFduZHRvUFdMKHBQYWdlVmlldywgcG9pbnQpLCBuRmxhZ3MpOworICAgIHJldHVybiBUUlVFOworICB9CiAKLQlyZXR1cm4gRkFMU0U7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTAlDRkZMX0Zvcm1GaWxsZXI6Ok9uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0JaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLQl7CQkJCQotCQlwV25kLT5PblJCdXR0b25VcChXbmR0b1BXTChwUGFnZVZpZXcsIHBvaW50KSxuRmxhZ3MpOwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0KLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wJQ0ZGTF9Gb3JtRmlsbGVyOjpPblJCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLQlpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQotCXsJCQkJCi0JCXBXbmQtPk9uUkJ1dHRvbkRibENsayhXbmR0b1BXTChwUGFnZVZpZXcsIHBvaW50KSxuRmxhZ3MpOwotCQlyZXR1cm4gVFJVRTsKLQl9CitGWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpIHsKKyAgICBwV25kLT5PblJCdXR0b25VcChXbmR0b1BXTChwUGFnZVZpZXcsIHBvaW50KSwgbkZsYWdzKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQogCi0JcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5LZXlDb2RlLCBGWF9VSU5UIG5GbGFncykKLXsKLQlpZiAoSXNWYWxpZCgpKQotCXsKLQkJQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gdGhpcy0+R2V0Q3VyUGFnZVZpZXcoKTsKLQkJQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKK0ZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5LZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncykgeworICBpZiAoSXNWYWxpZCgpKSB7CisgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gR2V0Q3VyUGFnZVZpZXcoKTsKKyAgICBBU1NFUlQocFBhZ2VWaWV3KTsKIAotCQlpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQotCQl7CQkJCQotCQkJcmV0dXJuIHBXbmQtPk9uS2V5RG93bihuS2V5Q29kZSxuRmxhZ3MpOwotCQl9Ci0JfQorICAgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgICAgcmV0dXJuIHBXbmQtPk9uS2V5RG93bihuS2V5Q29kZSwgbkZsYWdzKTsKKyAgICB9CisgIH0KIAotCXJldHVybiBGQUxTRTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MCUNGRkxfRm9ybUZpbGxlcjo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuQ2hhciwgRlhfVUlOVCBuRmxhZ3MpCi17Ci0JaWYgKElzVmFsaWQoKSkKLQl7Ci0JCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHRoaXMtPkdldEN1clBhZ2VWaWV3KCk7Ci0JCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CitGWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MpIHsKKyAgaWYgKElzVmFsaWQoKSkgeworICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KCk7CisgICAgQVNTRVJUKHBQYWdlVmlldyk7CiAKLQkJaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLQkJewkJCQkKLQkJCXJldHVybiBwV25kLT5PbkNoYXIobkNoYXIsbkZsYWdzKTsKLQkJfQotCX0KKyAgICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpIHsKKyAgICAgIHJldHVybiBwV25kLT5PbkNoYXIobkNoYXIsIG5GbGFncyk7CisgICAgfQorICB9CiAKLQlyZXR1cm4gRkFMU0U7CisgIHJldHVybiBGQUxTRTsKIH0KIAotdm9pZCBDRkZMX0Zvcm1GaWxsZXI6Ok9uRGVTZWxlY3RlZChDUERGU0RLX0Fubm90KiBwQW5ub3QpCi17Ci0JQVNTRVJUKEZBTFNFKTsKLX0KK3ZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpTZXRGb2N1c0ZvckFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZykgeworICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OworICBVbmRlcmx5aW5nUGFnZVR5cGUqIHBQYWdlID0gcFdpZGdldC0+R2V0VW5kZXJseWluZ1BhZ2UoKTsKKyAgQ1BERlNES19Eb2N1bWVudCogcERvYyA9IG1fcEFwcC0+R2V0U0RLRG9jdW1lbnQoKTsKKyAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcERvYy0+R2V0UGFnZVZpZXcocFBhZ2UpOworICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKSkKKyAgICBwV25kLT5TZXRGb2N1cygpOwogCi12b2lkIENGRkxfRm9ybUZpbGxlcjo6T25TZWxlY3RlZChDUERGU0RLX0Fubm90KiBwQW5ub3QpCi17Ci0JQVNTRVJUKEZBTFNFKTsKKyAgbV9iVmFsaWQgPSBUUlVFOworICBGWF9SRUNUIHJjUmVjdCA9IEdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KTsKKyAgSW52YWxpZGF0ZVJlY3QocmNSZWN0LmxlZnQsIHJjUmVjdC50b3AsIHJjUmVjdC5yaWdodCwgcmNSZWN0LmJvdHRvbSk7CiB9CiAKLUZYX0JPT0wJQ0ZGTF9Gb3JtRmlsbGVyOjpPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZykKLXsKLQlDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwotCi0JQ1BERl9QYWdlICogcFBhZ2UgPSBwV2lkZ2V0LT5HZXRQREZQYWdlKCk7Ci0gCUNQREZTREtfRG9jdW1lbnQgKiBwRG9jID0gbV9wQXBwLT5HZXRDdXJyZW50RG9jKCk7Ci0JQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcERvYy0+R2V0UGFnZVZpZXcocFBhZ2UpOwotIAlBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwordm9pZCBDRkZMX0Zvcm1GaWxsZXI6OktpbGxGb2N1c0ZvckFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZykgeworICBpZiAoIUlzVmFsaWQoKSkKKyAgICByZXR1cm47CiAKLSAJCisgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KCk7CisgIGlmICghcFBhZ2VWaWV3KQorICAgIHJldHVybjsKIAotCUNQV0xfV25kICogcFduZCA9IE5VTEw7Ci0JaWYgKCAocFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpKSkKLQl7CQkJCQotCQlwV25kLT5TZXRGb2N1cygpOwotCX0KKyAgQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFnKTsKIAotCW1fYlZhbGlkID0gVFJVRTsKLQkKLQkKLQkKKyAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQorICAgIHBXbmQtPktpbGxGb2N1cygpOwogCi0JbV9iVmFsaWQgPSBUUlVFOwotCUZYX1JFQ1QgcmNSZWN0ID0gdGhpcy0+R2V0Vmlld0JCb3gocFBhZ2VWaWV3LHBBbm5vdCk7Ci0JdGhpcy0+SW52YWxpZGF0ZVJlY3QocmNSZWN0LmxlZnQsIHJjUmVjdC50b3AsIHJjUmVjdC5yaWdodCwgcmNSZWN0LmJvdHRvbSk7Ci0JCi0JcmV0dXJuIFRSVUU7CisgIEZYX0JPT0wgYkRlc3Ryb3lQREZXaW5kb3c7CisgIHN3aXRjaCAobV9wV2lkZ2V0LT5HZXRGaWVsZFR5cGUoKSkgeworICAgIGNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046CisgICAgY2FzZSBGSUVMRFRZUEVfQ0hFQ0tCT1g6CisgICAgY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046CisgICAgICBiRGVzdHJveVBERldpbmRvdyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYkRlc3Ryb3lQREZXaW5kb3cgPSBGQUxTRTsKKyAgICAgIGJyZWFrOworICB9CisgIEVzY2FwZUZpbGxlcihwUGFnZVZpZXcsIGJEZXN0cm95UERGV2luZG93KTsKIH0KIAotRlhfQk9PTAlDRkZMX0Zvcm1GaWxsZXI6Ok9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZykKLXsKLQlpZiAoSXNWYWxpZCgpKQotCXsKLQkJQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gdGhpcy0+R2V0Q3VyUGFnZVZpZXcoKTsKLQkJQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKLQotCQlDb21taXREYXRhKHBQYWdlVmlldywgbkZsYWcpOwotCi0JCWlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLQkJewkJCQkKLQkJCXBXbmQtPktpbGxGb2N1cygpOwotCQl9Ci0JCQotCQlzd2l0Y2ggKG1fcFdpZGdldC0+R2V0RmllbGRUeXBlKCkpCi0JCXsKLQkJY2FzZSBGSUVMRFRZUEVfUFVTSEJVVFRPTjoKLQkJY2FzZSBGSUVMRFRZUEVfQ0hFQ0tCT1g6Ci0JCWNhc2UgRklFTERUWVBFX1JBRElPQlVUVE9OOgotCQkJRXNjYXBlRmlsbGVyKHBQYWdlVmlldywgVFJVRSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCUVzY2FwZUZpbGxlcihwUGFnZVZpZXcsIEZBTFNFKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIFRSVUU7CitGWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6SXNWYWxpZCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fYlZhbGlkOwogfQogCi1GWF9CT09MCUNGRkxfRm9ybUZpbGxlcjo6SXNWYWxpZCgpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fYlZhbGlkOwotfQotCi1QV0xfQ1JFQVRFUEFSQU0JQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRDcmVhdGVQYXJhbSgpCi17Ci0JQVNTRVJUKG1fcEFwcCAhPSBOVUxMKTsKLQotCVBXTF9DUkVBVEVQQVJBTSBjcDsKLQotCWNwLnBQYXJlbnRXbmQgPSBOVUxMOwkKLQljcC5wUHJvdmlkZXIgPSB0aGlzOwotCWNwLnJjUmVjdFduZCA9IEdldFBERldpbmRvd1JlY3QoKTsKLQkKLQlGWF9EV09SRCBkd0NyZWF0ZUZsYWdzID0gUFdTX0JPUkRFUiB8IFBXU19CQUNLR1JPVU5EIHwgUFdTX1ZJU0lCTEU7Ci0KLQlBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOworUFdMX0NSRUFURVBBUkFNIENGRkxfRm9ybUZpbGxlcjo6R2V0Q3JlYXRlUGFyYW0oKSB7CisgIEFTU0VSVChtX3BBcHApOwogCisgIFBXTF9DUkVBVEVQQVJBTSBjcDsKKyAgY3AucFBhcmVudFduZCA9IE5VTEw7CisgIGNwLnBQcm92aWRlciA9IHRoaXM7CisgIGNwLnJjUmVjdFduZCA9IEdldFBERldpbmRvd1JlY3QoKTsKIAotCUZYX0RXT1JEIGR3RmllbGRGbGFnID0gbV9wV2lkZ2V0LT5HZXRGaWVsZEZsYWdzKCk7CisgIEZYX0RXT1JEIGR3Q3JlYXRlRmxhZ3MgPSBQV1NfQk9SREVSIHwgUFdTX0JBQ0tHUk9VTkQgfCBQV1NfVklTSUJMRTsKKyAgRlhfRFdPUkQgZHdGaWVsZEZsYWcgPSBtX3BXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKTsKKyAgaWYgKGR3RmllbGRGbGFnICYgRklFTERGTEFHX1JFQURPTkxZKSB7CisgICAgZHdDcmVhdGVGbGFncyB8PSBQV1NfUkVBRE9OTFk7CisgIH0KIAotCWlmIChkd0ZpZWxkRmxhZyAmIEZJRUxERkxBR19SRUFET05MWSkKLQl7CQkKLQkJZHdDcmVhdGVGbGFncyB8PSBQV1NfUkVBRE9OTFk7Ci0JfQorICBGWF9DT0xPUlJFRiBjb2xvcjsKKyAgaWYgKG1fcFdpZGdldC0+R2V0RmlsbENvbG9yKGNvbG9yKSkgeworICAgIGNwLnNCYWNrZ3JvdW5kQ29sb3IgPQorICAgICAgICBDUFdMX0NvbG9yKEdldFJlZChjb2xvciksIEdldEdyZWVuKGNvbG9yKSwgR2V0Qmx1ZShjb2xvcikpOworICB9CiAKLQlGWF9DT0xPUlJFRiBjb2xvcjsKLQlpZiAobV9wV2lkZ2V0LT5HZXRGaWxsQ29sb3IoY29sb3IpKQotCXsKLQkJY3Auc0JhY2tncm91bmRDb2xvciA9IENQV0xfQ29sb3IoR2V0UmVkKGNvbG9yKSwgR2V0R3JlZW4oY29sb3IpLCBHZXRCbHVlKGNvbG9yKSk7Ci0JfQorICBpZiAobV9wV2lkZ2V0LT5HZXRCb3JkZXJDb2xvcihjb2xvcikpIHsKKyAgICBjcC5zQm9yZGVyQ29sb3IgPQorICAgICAgICBDUFdMX0NvbG9yKEdldFJlZChjb2xvciksIEdldEdyZWVuKGNvbG9yKSwgR2V0Qmx1ZShjb2xvcikpOworICB9CiAKLQlpZiAobV9wV2lkZ2V0LT5HZXRCb3JkZXJDb2xvcihjb2xvcikpCi0JewotCQljcC5zQm9yZGVyQ29sb3IgPSBDUFdMX0NvbG9yKEdldFJlZChjb2xvciksIEdldEdyZWVuKGNvbG9yKSwgR2V0Qmx1ZShjb2xvcikpOwotCX0KKyAgY3Auc1RleHRDb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDApOwogCi0JY3Auc1RleHRDb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksMCk7CisgIGlmIChtX3BXaWRnZXQtPkdldFRleHRDb2xvcihjb2xvcikpIHsKKyAgICBjcC5zVGV4dENvbG9yID0gQ1BXTF9Db2xvcihHZXRSZWQoY29sb3IpLCBHZXRHcmVlbihjb2xvciksIEdldEJsdWUoY29sb3IpKTsKKyAgfQogCi0JaWYgKG1fcFdpZGdldC0+R2V0VGV4dENvbG9yKGNvbG9yKSkKLQl7Ci0JCWNwLnNUZXh0Q29sb3IgPSBDUFdMX0NvbG9yKEdldFJlZChjb2xvciksIEdldEdyZWVuKGNvbG9yKSwgR2V0Qmx1ZShjb2xvcikpOwotCX0KKyAgY3AuZkZvbnRTaXplID0gbV9wV2lkZ2V0LT5HZXRGb250U2l6ZSgpOworICBjcC5kd0JvcmRlcldpZHRoID0gbV9wV2lkZ2V0LT5HZXRCb3JkZXJXaWR0aCgpOwogCi0JY3AuZkZvbnRTaXplID0gbV9wV2lkZ2V0LT5HZXRGb250U2l6ZSgpOwotCWNwLmR3Qm9yZGVyV2lkdGggPSBtX3BXaWRnZXQtPkdldEJvcmRlcldpZHRoKCk7Ci0JCi0JaW50IG5Cb3JkZXJTdHlsZSA9IG1fcFdpZGdldC0+R2V0Qm9yZGVyU3R5bGUoKTsKKyAgaW50IG5Cb3JkZXJTdHlsZSA9IG1fcFdpZGdldC0+R2V0Qm9yZGVyU3R5bGUoKTsKIAotCXN3aXRjaCAobkJvcmRlclN0eWxlKQotCXsKLQljYXNlIEJCU19TT0xJRDoKLQkJY3AubkJvcmRlclN0eWxlID0gUEJTX1NPTElEOwotCQlicmVhazsKLQljYXNlIEJCU19EQVNIOgotCQljcC5uQm9yZGVyU3R5bGUgPSBQQlNfREFTSDsKLQkJY3Auc0Rhc2ggPSBDUFdMX0Rhc2goMywzLDApOwkJCQotCQlicmVhazsKLQljYXNlIEJCU19CRVZFTEVEOgotCQljcC5uQm9yZGVyU3R5bGUgPSBQQlNfQkVWRUxFRDsKLQkJY3AuZHdCb3JkZXJXaWR0aCAqPSAyOwotCQlicmVhazsKLQljYXNlIEJCU19JTlNFVDoKLQkJY3AubkJvcmRlclN0eWxlID0gUEJTX0lOU0VUOwotCQljcC5kd0JvcmRlcldpZHRoICo9IDI7Ci0JCWJyZWFrOwotCWNhc2UgQkJTX1VOREVSTElORToKLQkJY3AubkJvcmRlclN0eWxlID0gUEJTX1VOREVSTElORUQ7Ci0JCWJyZWFrOwotCX0KKyAgc3dpdGNoIChuQm9yZGVyU3R5bGUpIHsKKyAgICBjYXNlIEJCU19TT0xJRDoKKyAgICAgIGNwLm5Cb3JkZXJTdHlsZSA9IFBCU19TT0xJRDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQkJTX0RBU0g6CisgICAgICBjcC5uQm9yZGVyU3R5bGUgPSBQQlNfREFTSDsKKyAgICAgIGNwLnNEYXNoID0gQ1BXTF9EYXNoKDMsIDMsIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCQlNfQkVWRUxFRDoKKyAgICAgIGNwLm5Cb3JkZXJTdHlsZSA9IFBCU19CRVZFTEVEOworICAgICAgY3AuZHdCb3JkZXJXaWR0aCAqPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCQlNfSU5TRVQ6CisgICAgICBjcC5uQm9yZGVyU3R5bGUgPSBQQlNfSU5TRVQ7CisgICAgICBjcC5kd0JvcmRlcldpZHRoICo9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJCU19VTkRFUkxJTkU6CisgICAgICBjcC5uQm9yZGVyU3R5bGUgPSBQQlNfVU5ERVJMSU5FRDsKKyAgICAgIGJyZWFrOworICB9CiAKLQlpZiAoY3AuZkZvbnRTaXplIDw9IDApCi0JewotCQlkd0NyZWF0ZUZsYWdzIHw9IFBXU19BVVRPRk9OVFNJWkU7Ci0JfQorICBpZiAoY3AuZkZvbnRTaXplIDw9IDApIHsKKyAgICBkd0NyZWF0ZUZsYWdzIHw9IFBXU19BVVRPRk9OVFNJWkU7CisgIH0KIAotCWNwLmR3RmxhZ3MgPSBkd0NyZWF0ZUZsYWdzOwotCWNwLnBTeXN0ZW1IYW5kbGVyID0gbV9wQXBwLT5HZXRTeXNIYW5kbGVyKCk7Ci0JcmV0dXJuIGNwOworICBjcC5kd0ZsYWdzID0gZHdDcmVhdGVGbGFnczsKKyAgY3AucFN5c3RlbUhhbmRsZXIgPSBtX3BBcHAtPkdldFN5c0hhbmRsZXIoKTsKKyAgcmV0dXJuIGNwOwogfQogCi1DUFdMX1duZCogQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MIGJOZXcpCi17Ci0JQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKLQlBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOworQ1BXTF9XbmQqIENGRkxfRm9ybUZpbGxlcjo6R2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOZXcpIHsKKyAgQVNTRVJUKHBQYWdlVmlldyk7CiAKLQlDUFdMX1duZCogcFduZCA9IE5VTEw7Ci0JbV9NYXBzLkxvb2t1cChwUGFnZVZpZXcsIHBXbmQpOworICBhdXRvIGl0ID0gbV9NYXBzLmZpbmQocFBhZ2VWaWV3KTsKKyAgY29uc3QgYm9vbCBmb3VuZCA9IGl0ICE9IG1fTWFwcy5lbmQoKTsKKyAgQ1BXTF9XbmQqIHBXbmQgPSBmb3VuZCA/IGl0LT5zZWNvbmQgOiBudWxscHRyOworICBpZiAoIWJOZXcpCisgICAgcmV0dXJuIHBXbmQ7CiAKLQlpZiAoYk5ldykKLQl7Ci0JCWlmIChwV25kKQotCQl7Ci0JCQlDRkZMX1ByaXZhdGVEYXRhKiBwUHJpdmF0ZURhdGEgPSAoQ0ZGTF9Qcml2YXRlRGF0YSopcFduZC0+R2V0QXR0YWNoZWREYXRhKCk7Ci0JCQlBU1NFUlQocFByaXZhdGVEYXRhICE9IE5VTEwpOworICBpZiAoZm91bmQpIHsKKyAgICBDRkZMX1ByaXZhdGVEYXRhKiBwUHJpdmF0ZURhdGEgPSAoQ0ZGTF9Qcml2YXRlRGF0YSopcFduZC0+R2V0QXR0YWNoZWREYXRhKCk7CisgICAgaWYgKHBQcml2YXRlRGF0YS0+bldpZGdldEFnZSAhPSBtX3BXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKSkgeworICAgICAgcmV0dXJuIFJlc2V0UERGV2luZG93KAorICAgICAgICAgIHBQYWdlVmlldywgbV9wV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpID09IHBQcml2YXRlRGF0YS0+blZhbHVlQWdlKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgUFdMX0NSRUFURVBBUkFNIGNwID0gR2V0Q3JlYXRlUGFyYW0oKTsKKyAgICBjcC5oQXR0YWNoZWRXbmQgPSAoRlhfSFdORCltX3BXaWRnZXQ7CiAKLQkJCWlmIChwUHJpdmF0ZURhdGEtPm5XaWRnZXRBZ2UgIT0gbV9wV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCkpCi0JCQl7Ci0JCQkJcmV0dXJuIHRoaXMtPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywgbV9wV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpID09IHBQcml2YXRlRGF0YS0+blZhbHVlQWdlKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCVBXTF9DUkVBVEVQQVJBTSBjcCA9IEdldENyZWF0ZVBhcmFtKCk7Ci0JCQljcC5oQXR0YWNoZWRXbmQgPSAoRlhfSFdORCltX3BXaWRnZXQ7Ci0KLQkJCUNGRkxfUHJpdmF0ZURhdGEqIHBQcml2YXRlRGF0YSA9IG5ldyBDRkZMX1ByaXZhdGVEYXRhOwotCQkJcFByaXZhdGVEYXRhLT5wV2lkZ2V0ID0gbV9wV2lkZ2V0OwotCQkJcFByaXZhdGVEYXRhLT5wUGFnZVZpZXcgPSBwUGFnZVZpZXc7Ci0JCQlwUHJpdmF0ZURhdGEtPm5XaWRnZXRBZ2UgPSBtX3BXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlRGF0YS0+blZhbHVlQWdlID0gMDsKLQotCQkJY3AucEF0dGFjaGVkRGF0YSA9IHBQcml2YXRlRGF0YTsKLQotCQkJcFduZCA9IE5ld1BERldpbmRvdyhjcCwgcFBhZ2VWaWV3KTsKLQotCQkJaWYgKHBXbmQpCi0JCQl7Ci0JCQkJbV9NYXBzLlNldEF0KHBQYWdlVmlldywgcFduZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcFduZDsKLX0KLQotdm9pZCBDRkZMX0Zvcm1GaWxsZXI6OkRlc3Ryb3lQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQotewotCUNQV0xfV25kKiBwV25kID0gTlVMTDsKLQltX01hcHMuTG9va3VwKHBQYWdlVmlldywgcFduZCk7CisgICAgQ0ZGTF9Qcml2YXRlRGF0YSogcFByaXZhdGVEYXRhID0gbmV3IENGRkxfUHJpdmF0ZURhdGE7CisgICAgcFByaXZhdGVEYXRhLT5wV2lkZ2V0ID0gbV9wV2lkZ2V0OworICAgIHBQcml2YXRlRGF0YS0+cFBhZ2VWaWV3ID0gcFBhZ2VWaWV3OworICAgIHBQcml2YXRlRGF0YS0+bldpZGdldEFnZSA9IG1fcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpOworICAgIHBQcml2YXRlRGF0YS0+blZhbHVlQWdlID0gMDsKIAotCWlmIChwV25kKQotCXsKLQkJQ0ZGTF9Qcml2YXRlRGF0YSogcERhdGEgPSAoQ0ZGTF9Qcml2YXRlRGF0YSopcFduZC0+R2V0QXR0YWNoZWREYXRhKCk7Ci0JCXBEYXRhLT5wUGFnZVZpZXcgPSBOVUxMOwotCQlwV25kLT5EZXN0cm95KCk7Ci0JCWRlbGV0ZSBwV25kOwotCQlkZWxldGUgcERhdGE7Ci0JfQorICAgIGNwLnBBdHRhY2hlZERhdGEgPSBwUHJpdmF0ZURhdGE7CiAKLQltX01hcHMuUmVtb3ZlS2V5KHBQYWdlVmlldyk7Ci19CisgICAgcFduZCA9IE5ld1BERldpbmRvdyhjcCwgcFBhZ2VWaWV3KTsKKyAgICBtX01hcHNbcFBhZ2VWaWV3XSA9IHBXbmQ7CisgIH0KIAotQ1BERl9NYXRyaXgJQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRXaW5kb3dNYXRyaXgodm9pZCogcEF0dGFjaGVkRGF0YSkKLXsKLQlpZiAoQ0ZGTF9Qcml2YXRlRGF0YSogcFByaXZhdGVEYXRhID0gKENGRkxfUHJpdmF0ZURhdGEqKXBBdHRhY2hlZERhdGEpCi0JewotCQlpZiAocFByaXZhdGVEYXRhLT5wUGFnZVZpZXcpCi0JCXsKLQkJCUNQREZfTWF0cml4IG10UGFnZVZpZXc7Ci0JCQlwUHJpdmF0ZURhdGEtPnBQYWdlVmlldy0+R2V0Q3VycmVudE1hdHJpeChtdFBhZ2VWaWV3KTsKLQkJCUNQREZfTWF0cml4IG10ID0gR2V0Q3VyTWF0cml4KCk7Ci0JCQltdC5Db25jYXQobXRQYWdlVmlldyk7Ci0JCQkKLQkJCXJldHVybiBtdDsKLQkJfQotCX0KLQlyZXR1cm4gQ1BERl9NYXRyaXgoMSwwLDAsMSwwLDApOworICByZXR1cm4gcFduZDsKIH0KIAotQ1BERl9NYXRyaXgJQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRDdXJNYXRyaXgoKQotewotCUNQREZfTWF0cml4IG10Owordm9pZCBDRkZMX0Zvcm1GaWxsZXI6OkRlc3Ryb3lQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CisgIGF1dG8gaXQgPSBtX01hcHMuZmluZChwUGFnZVZpZXcpOworICBpZiAoaXQgPT0gbV9NYXBzLmVuZCgpKQorICAgIHJldHVybjsKIAotCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CisgIENQV0xfV25kKiBwV25kID0gaXQtPnNlY29uZDsKKyAgQ0ZGTF9Qcml2YXRlRGF0YSogcERhdGEgPSAoQ0ZGTF9Qcml2YXRlRGF0YSopcFduZC0+R2V0QXR0YWNoZWREYXRhKCk7CisgIHBXbmQtPkRlc3Ryb3koKTsKKyAgZGVsZXRlIHBXbmQ7CisgIGRlbGV0ZSBwRGF0YTsKIAotCUNQREZfUmVjdCByY0RBIDsKLQltX3BXaWRnZXQtPkdldFBERkFubm90KCktPkdldFJlY3QocmNEQSk7Ci0KLQotCXN3aXRjaCAobV9wV2lkZ2V0LT5HZXRSb3RhdGUoKSkKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIDA6CQkKLQkJbXQgPSBDUERGX01hdHJpeCgxLDAsMCwxLDAsMCk7Ci0JCWJyZWFrOwotCWNhc2UgOTA6Ci0JCW10ID0gQ1BERl9NYXRyaXgoMCwxLC0xLDAscmNEQS5yaWdodCAtIHJjREEubGVmdCwwKTsKLQkJYnJlYWs7Ci0JY2FzZSAxODA6Ci0JCW10ID0gQ1BERl9NYXRyaXgoLTEsMCwwLC0xLHJjREEucmlnaHQgLSByY0RBLmxlZnQscmNEQS50b3AgLSByY0RBLmJvdHRvbSk7Ci0JCWJyZWFrOwotCWNhc2UgMjcwOgotCQltdCA9IENQREZfTWF0cml4KDAsLTEsMSwwLDAscmNEQS50b3AgLSByY0RBLmJvdHRvbSk7Ci0JCWJyZWFrOwotCX0KLQltdC5lICs9IHJjREEubGVmdDsKLQltdC5mICs9IHJjREEuYm90dG9tOwotCi0JcmV0dXJuIG10OworICBtX01hcHMuZXJhc2UoaXQpOwogfQogCi1DRlhfV2lkZVN0cmluZyBDRkZMX0Zvcm1GaWxsZXI6OkxvYWRQb3B1cE1lbnVTdHJpbmcoaW50IG5JbmRleCkKLXsKLQlBU1NFUlQobV9wQXBwICE9IE5VTEwpOworQ0ZYX01hdHJpeCBDRkZMX0Zvcm1GaWxsZXI6OkdldFdpbmRvd01hdHJpeCh2b2lkKiBwQXR0YWNoZWREYXRhKSB7CisgIGlmIChDRkZMX1ByaXZhdGVEYXRhKiBwUHJpdmF0ZURhdGEgPSAoQ0ZGTF9Qcml2YXRlRGF0YSopcEF0dGFjaGVkRGF0YSkgeworICAgIGlmIChwUHJpdmF0ZURhdGEtPnBQYWdlVmlldykgeworICAgICAgQ0ZYX01hdHJpeCBtdFBhZ2VWaWV3OworICAgICAgcFByaXZhdGVEYXRhLT5wUGFnZVZpZXctPkdldEN1cnJlbnRNYXRyaXgobXRQYWdlVmlldyk7CisgICAgICBDRlhfTWF0cml4IG10ID0gR2V0Q3VyTWF0cml4KCk7CisgICAgICBtdC5Db25jYXQobXRQYWdlVmlldyk7CiAKLQlyZXR1cm4gTCIiOworICAgICAgcmV0dXJuIG10OworICAgIH0KKyAgfQorICByZXR1cm4gQ0ZYX01hdHJpeCgxLCAwLCAwLCAxLCAwLCAwKTsKIH0KIAotQ1BERl9SZWN0IENGRkxfRm9ybUZpbGxlcjo6R2V0UERGV2luZG93UmVjdCgpIGNvbnN0Ci17Ci0JQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKK0NGWF9NYXRyaXggQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRDdXJNYXRyaXgoKSB7CisgIENGWF9NYXRyaXggbXQ7CiAKLQlDUERGX1JlY3QgcmVjdEFubm90OwotCW1fcFdpZGdldC0+R2V0UERGQW5ub3QoKS0+R2V0UmVjdChyZWN0QW5ub3QpOworICBDUERGX1JlY3QgcmNEQTsKKyAgbV9wV2lkZ2V0LT5HZXRQREZBbm5vdCgpLT5HZXRSZWN0KHJjREEpOwogCi0JRlhfRkxPQVQgZldpZHRoID0gcmVjdEFubm90LnJpZ2h0IC0gcmVjdEFubm90LmxlZnQ7Ci0JRlhfRkxPQVQgZkhlaWdodCA9IHJlY3RBbm5vdC50b3AgLSByZWN0QW5ub3QuYm90dG9tOwotCisgIHN3aXRjaCAobV9wV2lkZ2V0LT5HZXRSb3RhdGUoKSkgeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSAwOgorICAgICAgbXQgPSBDRlhfTWF0cml4KDEsIDAsIDAsIDEsIDAsIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSA5MDoKKyAgICAgIG10ID0gQ0ZYX01hdHJpeCgwLCAxLCAtMSwgMCwgcmNEQS5yaWdodCAtIHJjREEubGVmdCwgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE4MDoKKyAgICAgIG10ID0gQ0ZYX01hdHJpeCgtMSwgMCwgMCwgLTEsIHJjREEucmlnaHQgLSByY0RBLmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgcmNEQS50b3AgLSByY0RBLmJvdHRvbSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI3MDoKKyAgICAgIG10ID0gQ0ZYX01hdHJpeCgwLCAtMSwgMSwgMCwgMCwgcmNEQS50b3AgLSByY0RBLmJvdHRvbSk7CisgICAgICBicmVhazsKKyAgfQorICBtdC5lICs9IHJjREEubGVmdDsKKyAgbXQuZiArPSByY0RBLmJvdHRvbTsKIAotCWlmICgobV9wV2lkZ2V0LT5HZXRSb3RhdGUoKSAvIDkwKSAmIDB4MDEpCi0JCXJldHVybiBDUERGX1JlY3QoMCwwLGZIZWlnaHQsZldpZHRoKTsKLQllbHNlCi0JCXJldHVybiBDUERGX1JlY3QoMCwwLGZXaWR0aCxmSGVpZ2h0KTsKKyAgcmV0dXJuIG10OwogfQogCi1DUERGU0RLX1BhZ2VWaWV3KiBDRkZMX0Zvcm1GaWxsZXI6OkdldEN1clBhZ2VWaWV3KCkKLXsKK0NGWF9XaWRlU3RyaW5nIENGRkxfRm9ybUZpbGxlcjo6TG9hZFBvcHVwTWVudVN0cmluZyhpbnQgbkluZGV4KSB7CisgIEFTU0VSVChtX3BBcHApOwogCi0JQ1BERl9QYWdlKiBwUGFnZSA9IG1fcEFubm90LT5HZXRQREZQYWdlKCk7Ci0JQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9IG1fcEFwcC0+R2V0Q3VycmVudERvYygpOwotCWlmKHBTREtEb2MpCi0JewotCQlyZXR1cm4gcFNES0RvYy0+R2V0UGFnZVZpZXcocFBhZ2UpOwotCX0KLQlyZXR1cm4gTlVMTDsKKyAgcmV0dXJuIEwiIjsKIH0KIAotQ1BERl9SZWN0IENGRkxfRm9ybUZpbGxlcjo6R2V0Rm9jdXNCb3goQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQotewotCWlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCi0JewkJCQotCQlDUERGX1JlY3QgcmNGb2N1cyA9ICBGRkx0b1duZChwUGFnZVZpZXcsIFBXTHRvRkZMKHBXbmQtPkdldEZvY3VzUmVjdCgpKSk7Ci0JCUFTU0VSVChwUGFnZVZpZXcpOwotCQlDUERGX1JlY3QgcmNQYWdlID0gcFBhZ2VWaWV3LT5HZXRQREZQYWdlKCktPkdldFBhZ2VCQm94KCk7Ci0JCWlmKHJjUGFnZS5Db250YWlucyhyY0ZvY3VzKSkKLQkJCXJldHVybiByY0ZvY3VzOwotCQllbHNlCi0JCQlyZXR1cm4gQ1BERl9SZWN0KDAsMCwwLDApOwotCX0KLQlyZXR1cm4gQ1BERl9SZWN0KDAsMCwwLDApOwotfQorQ1BERl9SZWN0IENGRkxfRm9ybUZpbGxlcjo6R2V0UERGV2luZG93UmVjdCgpIGNvbnN0IHsKKyAgQ1BERl9SZWN0IHJlY3RBbm5vdDsKKyAgbV9wV2lkZ2V0LT5HZXRQREZBbm5vdCgpLT5HZXRSZWN0KHJlY3RBbm5vdCk7CiAKLUNQREZfUmVjdCBDRkZMX0Zvcm1GaWxsZXI6OkZGTHRvUFdMKGNvbnN0IENQREZfUmVjdCYgcmVjdCkKLXsKLQlDUERGX01hdHJpeCBtdDsKLQltdC5TZXRSZXZlcnNlKEdldEN1ck1hdHJpeCgpKTsKLQkKLQlDUERGX1JlY3QgdGVtcCA9IHJlY3Q7Ci0JbXQuVHJhbnNmb3JtUmVjdCh0ZW1wKTsKKyAgRlhfRkxPQVQgZldpZHRoID0gcmVjdEFubm90LnJpZ2h0IC0gcmVjdEFubm90LmxlZnQ7CisgIEZYX0ZMT0FUIGZIZWlnaHQgPSByZWN0QW5ub3QudG9wIC0gcmVjdEFubm90LmJvdHRvbTsKKyAgaWYgKChtX3BXaWRnZXQtPkdldFJvdGF0ZSgpIC8gOTApICYgMHgwMSkKKyAgICByZXR1cm4gQ1BERl9SZWN0KDAsIDAsIGZIZWlnaHQsIGZXaWR0aCk7CiAKLQlyZXR1cm4gdGVtcDsKKyAgcmV0dXJuIENQREZfUmVjdCgwLCAwLCBmV2lkdGgsIGZIZWlnaHQpOwogfQogCi1DUERGX1JlY3QgQ0ZGTF9Gb3JtRmlsbGVyOjpQV0x0b0ZGTChjb25zdCBDUERGX1JlY3QmIHJlY3QpCi17Ci0JQ1BERl9NYXRyaXggbXQgPSBHZXRDdXJNYXRyaXgoKTsKLQkKLQlDUERGX1JlY3QgdGVtcCA9IHJlY3Q7Ci0JbXQuVHJhbnNmb3JtUmVjdCh0ZW1wKTsKK0NQREZTREtfUGFnZVZpZXcqIENGRkxfRm9ybUZpbGxlcjo6R2V0Q3VyUGFnZVZpZXcoKSB7CisgIFVuZGVybHlpbmdQYWdlVHlwZSogcFBhZ2UgPSBtX3BBbm5vdC0+R2V0VW5kZXJseWluZ1BhZ2UoKTsKKyAgQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9IG1fcEFwcC0+R2V0U0RLRG9jdW1lbnQoKTsKKyAgcmV0dXJuIHBTREtEb2MgPyBwU0RLRG9jLT5HZXRQYWdlVmlldyhwUGFnZSkgOiBudWxscHRyOworfQogCi0JcmV0dXJuIHRlbXA7CitDUERGX1JlY3QgQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRGb2N1c0JveChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKKyAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKSB7CisgICAgQ1BERl9SZWN0IHJjRm9jdXMgPSBGRkx0b1duZChwUGFnZVZpZXcsIFBXTHRvRkZMKHBXbmQtPkdldEZvY3VzUmVjdCgpKSk7CisgICAgQ1BERl9SZWN0IHJjUGFnZSA9IHBQYWdlVmlldy0+R2V0UERGUGFnZSgpLT5HZXRQYWdlQkJveCgpOworICAgIGlmIChyY1BhZ2UuQ29udGFpbnMocmNGb2N1cykpCisgICAgICByZXR1cm4gcmNGb2N1czsKKyAgfQorICByZXR1cm4gQ1BERl9SZWN0KDAsIDAsIDAsIDApOwogfQogCi1DUERGX1BvaW50IENGRkxfRm9ybUZpbGxlcjo6RkZMdG9QV0woY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0JQ1BERl9NYXRyaXggbXQ7Ci0JbXQuU2V0UmV2ZXJzZShHZXRDdXJNYXRyaXgoKSk7CitDUERGX1JlY3QgQ0ZGTF9Gb3JtRmlsbGVyOjpGRkx0b1BXTChjb25zdCBDUERGX1JlY3QmIHJlY3QpIHsKKyAgQ0ZYX01hdHJpeCBtdDsKKyAgbXQuU2V0UmV2ZXJzZShHZXRDdXJNYXRyaXgoKSk7CiAKLQlDUERGX1BvaW50IHB0ID0gcG9pbnQ7Ci0JbXQuVHJhbnNmb3JtKHB0LngscHQueSk7CisgIENQREZfUmVjdCB0ZW1wID0gcmVjdDsKKyAgbXQuVHJhbnNmb3JtUmVjdCh0ZW1wKTsKIAotCXJldHVybiBwdDsKKyAgcmV0dXJuIHRlbXA7CiB9CiAKLUNQREZfUG9pbnQgQ0ZGTF9Gb3JtRmlsbGVyOjpQV0x0b0ZGTChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpCi17Ci0JQ1BERl9NYXRyaXggbXQgPSBHZXRDdXJNYXRyaXgoKTsKK0NQREZfUmVjdCBDRkZMX0Zvcm1GaWxsZXI6OlBXTHRvRkZMKGNvbnN0IENQREZfUmVjdCYgcmVjdCkgeworICBDRlhfTWF0cml4IG10ID0gR2V0Q3VyTWF0cml4KCk7CiAKLQlDUERGX1BvaW50IHB0ID0gcG9pbnQ7Ci0JbXQuVHJhbnNmb3JtKHB0LngscHQueSk7CisgIENQREZfUmVjdCB0ZW1wID0gcmVjdDsKKyAgbXQuVHJhbnNmb3JtUmVjdCh0ZW1wKTsKIAotCXJldHVybiBwdDsKKyAgcmV0dXJuIHRlbXA7CiB9CiAKLUNQREZfUG9pbnQgQ0ZGTF9Gb3JtRmlsbGVyOjpXbmR0b1BXTChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGNvbnN0IENQREZfUG9pbnQmIHB0KQotewotLy8gCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Ci0vLyAKLS8vIAlDUERGX1BvaW50IHBvaW50KDAuMGYsIDAuMGYpOwotLy8gCXBQYWdlVmlldy0+V2luZG93VG9Eb2MocHQueCwgcHQueSwgcG9pbnQueCwgcG9pbnQueSk7Ci0vLyAKLSAJcmV0dXJuIEZGTHRvUFdMKHB0KTsKLS8vCXJldHVybiBDUERGX1BvaW50KDAsIDApOwotfQotCi1DUERGX1JlY3QgQ0ZGTF9Gb3JtRmlsbGVyOjpGRkx0b1duZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGNvbnN0IENQREZfUmVjdCAmIHJlY3QpCi17Ci0vLyAJRlhfUkVDVCByY1JldCgwLDAsMCwwKTsKLS8vIAotLy8gCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CQotLy8gCXBQYWdlVmlldy0+RG9jVG9XaW5kb3cocmVjdCwgcmNSZXQpOwotLy8gCQotIAlyZXR1cm4gcmVjdDsKLQotfQorQ1BERl9Qb2ludCBDRkZMX0Zvcm1GaWxsZXI6OkZGTHRvUFdMKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIENGWF9NYXRyaXggbXQ7CisgIG10LlNldFJldmVyc2UoR2V0Q3VyTWF0cml4KCkpOwogCi12b2lkIENGRkxfRm9ybUZpbGxlcjo6RkZMX0ZyZWVEYXRhKHZvaWQqIHBEYXRhKQotewotCUFTU0VSVChwRGF0YSAhPSBOVUxMKTsKKyAgQ1BERl9Qb2ludCBwdCA9IHBvaW50OworICBtdC5UcmFuc2Zvcm0ocHQueCwgcHQueSk7CiAKLQlkZWxldGUgKENGRkxfUHJpdmF0ZURhdGEqKXBEYXRhOworICByZXR1cm4gcHQ7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpDb21taXREYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfVUlOVCBuRmxhZykKLXsKLQlpZiAoSXNEYXRhQ2hhbmdlZChwUGFnZVZpZXcpKQotCXsKLQkJLy9DRkZMX0lGb3JtRmlsbGVyKiBwSUZvcm1GaWxsZXIgPSBDRkZMX01vZHVsZTo6R2V0Rm9ybUZpbGxlcihtX3BBcHApOwotCQlDRkZMX0lGb3JtRmlsbGVyKiBwSUZvcm1GaWxsZXIgPSBtX3BBcHAtPkdldElGb3JtRmlsbGVyKCk7Ly9OVUxMOwotCQlBU1NFUlQocElGb3JtRmlsbGVyICE9IE5VTEwpOworQ1BERl9Qb2ludCBDRkZMX0Zvcm1GaWxsZXI6OlBXTHRvRkZMKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIENGWF9NYXRyaXggbXQgPSBHZXRDdXJNYXRyaXgoKTsKIAotCQlGWF9CT09MIGJSQyA9IFRSVUU7Ci0JCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKKyAgQ1BERl9Qb2ludCBwdCA9IHBvaW50OworICBtdC5UcmFuc2Zvcm0ocHQueCwgcHQueSk7CiAKLQkJcElGb3JtRmlsbGVyLT5PbktleVN0cm9rZUNvbW1pdChtX3BXaWRnZXQsIHBQYWdlVmlldywgYlJDLCBiRXhpdCwgbkZsYWcpOwotCQlpZiAoYkV4aXQpIHJldHVybiBUUlVFOwotCQlpZiAoIWJSQykKLQkJewotCQkJdGhpcy0+UmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7Ci0JCQlyZXR1cm4gVFJVRTsKLQkJfQotCi0JCXBJRm9ybUZpbGxlci0+T25WYWxpZGF0ZShtX3BXaWRnZXQsIHBQYWdlVmlldywgYlJDLCBiRXhpdCwgbkZsYWcpOwotCQlpZiAoYkV4aXQpIHJldHVybiBUUlVFOwotCQlpZiAoIWJSQykKLQkJewotCQkJdGhpcy0+UmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7Ci0JCQlyZXR1cm4gVFJVRTsKLQkJfQotCi0JCVNhdmVEYXRhKHBQYWdlVmlldyk7Ci0KLQkJcElGb3JtRmlsbGVyLT5PbkNhbGN1bGF0ZShtX3BXaWRnZXQsIHBQYWdlVmlldywgYkV4aXQsbkZsYWcpOwotCQlpZiAoYkV4aXQpIHJldHVybiBUUlVFOwotCi0JCXBJRm9ybUZpbGxlci0+T25Gb3JtYXQobV9wV2lkZ2V0LCBwUGFnZVZpZXcsIGJFeGl0LG5GbGFnKTsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIHB0OwogfQogCi1GWF9CT09MCUNGRkxfRm9ybUZpbGxlcjo6SXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCi17Ci0JcmV0dXJuIEZBTFNFOworQ1BERl9Qb2ludCBDRkZMX0Zvcm1GaWxsZXI6OlduZHRvUFdMKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdCkgeworICByZXR1cm4gRkZMdG9QV0wocHQpOwogfQogCi12b2lkIENGRkxfRm9ybUZpbGxlcjo6U2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQoteworQ1BERl9SZWN0IENGRkxfRm9ybUZpbGxlcjo6RkZMdG9XbmQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiByZWN0KSB7CisgIHJldHVybiByZWN0OwogfQogCi12b2lkIENGRkxfRm9ybUZpbGxlcjo6R2V0S2V5U3Ryb2tlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZGTF9LZXlTdHJva2VEYXRhJiBkYXRhKQotewotfQorRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6OkNvbW1pdERhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZykgeworICBpZiAoSXNEYXRhQ2hhbmdlZChwUGFnZVZpZXcpKSB7CisgICAgRlhfQk9PTCBiUkMgPSBUUlVFOworICAgIEZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKKyAgICBDRkZMX0lGb3JtRmlsbGVyKiBwSUZvcm1GaWxsZXIgPSBtX3BBcHAtPkdldElGb3JtRmlsbGVyKCk7CisgICAgcElGb3JtRmlsbGVyLT5PbktleVN0cm9rZUNvbW1pdChtX3BXaWRnZXQsIHBQYWdlVmlldywgYlJDLCBiRXhpdCwgbkZsYWcpOworICAgIGlmIChiRXhpdCkKKyAgICAgIHJldHVybiBUUlVFOworICAgIGlmICghYlJDKSB7CisgICAgICBSZXNldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KIAotdm9pZCBDRkZMX0Zvcm1GaWxsZXI6OlNldENoYW5nZU1hcmsoKQotewotCW1fcEFwcC0+RkZJX09uQ2hhbmdlKCk7Ci19CisgICAgcElGb3JtRmlsbGVyLT5PblZhbGlkYXRlKG1fcFdpZGdldCwgcFBhZ2VWaWV3LCBiUkMsIGJFeGl0LCBuRmxhZyk7CisgICAgaWYgKGJFeGl0KQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgaWYgKCFiUkMpIHsKKyAgICAgIFJlc2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQogCi12b2lkIENGRkxfRm9ybUZpbGxlcjo6R2V0QWN0aW9uRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKLQkJCQkJCQlQREZTREtfRmllbGRBY3Rpb24mIGZhKQotewotCWZhLnNWYWx1ZSA9IG1fcFdpZGdldC0+R2V0VmFsdWUoKTsKLX0KKyAgICBTYXZlRGF0YShwUGFnZVZpZXcpOworICAgIHBJRm9ybUZpbGxlci0+T25DYWxjdWxhdGUobV9wV2lkZ2V0LCBwUGFnZVZpZXcsIGJFeGl0LCBuRmxhZyk7CisgICAgaWYgKGJFeGl0KQorICAgICAgcmV0dXJuIFRSVUU7CiAKLXZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpTZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCAKLQkJCQkJCQkJCWNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmEpCi17CisgICAgcElGb3JtRmlsbGVyLT5PbkZvcm1hdChtX3BXaWRnZXQsIHBQYWdlVmlldywgYkV4aXQsIG5GbGFnKTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTAlDRkZMX0Zvcm1GaWxsZXI6OklzQWN0aW9uRGF0YUNoYW5nZWQoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLCBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhT2xkLCAKLQkJCQkJCQkJCWNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmFOZXcpCi17Ci0JcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6OklzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CisgIHJldHVybiBGQUxTRTsKIH0KIAotdm9pZCBDRkZMX0Zvcm1GaWxsZXI6OlNhdmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCi17Ci19Cit2b2lkIENGRkxfRm9ybUZpbGxlcjo6U2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7fQogCi12b2lkIENGRkxfRm9ybUZpbGxlcjo6UmVzdG9yZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKLXsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6OklzRmllbGRGdWxsKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgeworICByZXR1cm4gRkFMU0U7CiB9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKLUNQV0xfV25kKiAgQ0ZGTF9Gb3JtRmlsbGVyOjpSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSkKLXsKLQlyZXR1cm4gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpOyAKK3ZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpTZXRDaGFuZ2VNYXJrKCkgeworICBtX3BBcHAtPkZGSV9PbkNoYW5nZSgpOwogfQogCi12b2lkIENGRkxfRm9ybUZpbGxlcjo6VGltZXJQcm9jKCkKLXsKLQordm9pZCBDRkZMX0Zvcm1GaWxsZXI6OkdldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSkgeworICBmYS5zVmFsdWUgPSBtX3BXaWRnZXQtPkdldFZhbHVlKCk7CiB9CiAKLUlGWF9TeXN0ZW1IYW5kbGVyKiBDRkZMX0Zvcm1GaWxsZXI6OkdldFN5c3RlbUhhbmRsZXIoKSBjb25zdAotewotCXJldHVybiBtX3BBcHAtPkdldFN5c0hhbmRsZXIoKTsKLS8vCXJldHVybiBOVUxMOwotfQordm9pZCBDRkZMX0Zvcm1GaWxsZXI6OlNldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSkge30KIAotdm9pZCBDRkZMX0Zvcm1GaWxsZXI6Ok9uS2V5U3Ryb2tlKEZYX0JPT0wgYktleURvd24pCi17CitGWF9CT09MIENGRkxfRm9ybUZpbGxlcjo6SXNBY3Rpb25EYXRhQ2hhbmdlZChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU5ldykgeworICByZXR1cm4gRkFMU0U7CiB9CiAKLXZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpFc2NhcGVGaWxsZXIoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MIGJEZXN0cm95UERGV2luZG93KQotewotCW1fYlZhbGlkID0gRkFMU0U7Ci0JCi0JRlhfUkVDVCByY1JlY3QgPSB0aGlzLT5HZXRWaWV3QkJveChwUGFnZVZpZXcsIG1fcFdpZGdldCk7Ci0JdGhpcy0+SW52YWxpZGF0ZVJlY3QocmNSZWN0LmxlZnQsIHJjUmVjdC50b3AsIHJjUmVjdC5yaWdodCwgcmNSZWN0LmJvdHRvbSk7Cit2b2lkIENGRkxfRm9ybUZpbGxlcjo6U2F2ZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykge30KIAotCWlmKGJEZXN0cm95UERGV2luZG93KQotIAkJRGVzdHJveVBERldpbmRvdyhwUGFnZVZpZXcpOwotfQordm9pZCBDRkZMX0Zvcm1GaWxsZXI6OlJlc3RvcmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHt9CiAKLUZYX0JPT0wgQ0ZGTF9Gb3JtRmlsbGVyOjpDYW5Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLQlyZXR1cm4gRkFMU0U7CitDUFdMX1duZCogQ0ZGTF9Gb3JtRmlsbGVyOjpSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZXN0b3JlVmFsdWUpIHsKKyAgcmV0dXJuIEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKTsKIH0KIAotRlhfQk9PTCBDRkZMX0Zvcm1GaWxsZXI6OkNhbkN1dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci0JcmV0dXJuIEZBTFNFOwotfQordm9pZCBDRkZMX0Zvcm1GaWxsZXI6OlRpbWVyUHJvYygpIHt9CiAKLUZYX0JPT0wJQ0ZGTF9Gb3JtRmlsbGVyOjpDYW5QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci0JcmV0dXJuIEZBTFNFOworSUZYX1N5c3RlbUhhbmRsZXIqIENGRkxfRm9ybUZpbGxlcjo6R2V0U3lzdGVtSGFuZGxlcigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEFwcC0+R2V0U3lzSGFuZGxlcigpOwogfQogCi12b2lkIENGRkxfRm9ybUZpbGxlcjo6RG9Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLX0KK3ZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpFc2NhcGVGaWxsZXIoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEZXN0cm95UERGV2luZG93KSB7CisgIG1fYlZhbGlkID0gRkFMU0U7CiAKLXZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpEb0N1dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci19CisgIEZYX1JFQ1QgcmNSZWN0ID0gR2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBtX3BXaWRnZXQpOworICBJbnZhbGlkYXRlUmVjdChyY1JlY3QubGVmdCwgcmNSZWN0LnRvcCwgcmNSZWN0LnJpZ2h0LCByY1JlY3QuYm90dG9tKTsKIAotdm9pZCBDRkZMX0Zvcm1GaWxsZXI6OkRvUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQoteworICBpZiAoYkRlc3Ryb3lQREZXaW5kb3cpCisgICAgRGVzdHJveVBERldpbmRvdyhwUGFnZVZpZXcpOwogfQogCi12b2lkIENGRkxfRm9ybUZpbGxlcjo6SW52YWxpZGF0ZVJlY3QoZG91YmxlIGxlZnQsIGRvdWJsZSB0b3AsIGRvdWJsZSByaWdodCwgZG91YmxlIGJvdHRvbSkKLXsKLQlDUERGX1BhZ2UgKiBwUGFnZSA9IG1fcFdpZGdldC0+R2V0UERGUGFnZSgpOwotCW1fcEFwcC0+RkZJX0ludmFsaWRhdGUocFBhZ2UsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7Cit2b2lkIENGRkxfRm9ybUZpbGxlcjo6SW52YWxpZGF0ZVJlY3QoZG91YmxlIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGJvdHRvbSkgeworICBVbmRlcmx5aW5nUGFnZVR5cGUqIHBQYWdlID0gbV9wV2lkZ2V0LT5HZXRVbmRlcmx5aW5nUGFnZSgpOworICBtX3BBcHAtPkZGSV9JbnZhbGlkYXRlKHBQYWdlLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGRkxfQnV0dG9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK0NGRkxfQnV0dG9uOjpDRkZMX0J1dHRvbihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwV2lkZ2V0KQorICAgIDogQ0ZGTF9Gb3JtRmlsbGVyKHBBcHAsIHBXaWRnZXQpLCBtX2JNb3VzZUluKEZBTFNFKSwgbV9iTW91c2VEb3duKEZBTFNFKSB7fQogCi1DRkZMX0J1dHRvbjo6Q0ZGTF9CdXR0b24oQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19Bbm5vdCogcFdpZGdldCkgOgotCUNGRkxfRm9ybUZpbGxlcihwQXBwLCBwV2lkZ2V0KSwKLQltX2JNb3VzZUluKEZBTFNFKSwKLQltX2JNb3VzZURvd24oRkFMU0UpCi17Ci19CitDRkZMX0J1dHRvbjo6fkNGRkxfQnV0dG9uKCkge30KIAotQ0ZGTF9CdXR0b246On5DRkZMX0J1dHRvbigpCi17Cit2b2lkIENGRkxfQnV0dG9uOjpPbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCkgeworICBtX2JNb3VzZUluID0gVFJVRTsKKyAgRlhfUkVDVCByZWN0ID0gR2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBwQW5ub3QpOworICBJbnZhbGlkYXRlUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7CiB9CiAKLXZvaWQgQ0ZGTF9CdXR0b246Ok9uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCkKLXsKLQltX2JNb3VzZUluID0gVFJVRTsKLQlGWF9SRUNUIHJlY3QgPSB0aGlzLT5HZXRWaWV3QkJveChwUGFnZVZpZXcscEFubm90KTsKLQl0aGlzLT5JbnZhbGlkYXRlUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7Ci0vLwk6OkludmFsaWRhdGVSZWN0KHBQYWdlVmlldy0+R2V0UGFnZVZpZXdXbmQoKSwgJnRoaXMtPkdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KSwgVFJVRSk7Ci19Ci0KLXZvaWQgQ0ZGTF9CdXR0b246Ok9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KQotewotCW1fYk1vdXNlSW4gPSBGQUxTRTsKK3ZvaWQgQ0ZGTF9CdXR0b246Ok9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCkgeworICBtX2JNb3VzZUluID0gRkFMU0U7CiAKLQlGWF9SRUNUIHJlY3QgPSB0aGlzLT5HZXRWaWV3QkJveChwUGFnZVZpZXcscEFubm90KTsKLQl0aGlzLT5JbnZhbGlkYXRlUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7Ci0vLwk6OkludmFsaWRhdGVSZWN0KHBQYWdlVmlldy0+R2V0UGFnZVZpZXdXbmQoKSwgJnRoaXMtPkdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KSwgVFJVRSk7Ci0JRW5kVGltZXIoKTsKLQlBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwotLy8JbV9wV2lkZ2V0LT5IaWRlSGludCgpOworICBGWF9SRUNUIHJlY3QgPSBHZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdCk7CisgIEludmFsaWRhdGVSZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKTsKKyAgRW5kVGltZXIoKTsKKyAgQVNTRVJUKG1fcFdpZGdldCk7CiB9CiAKLUZYX0JPT0wgQ0ZGTF9CdXR0b246Ok9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLQlDUERGX1JlY3QgcmNBbm5vdCA9IHBBbm5vdC0+R2V0UmVjdCgpOwotCWlmKCFyY0Fubm90LkNvbnRhaW5zKHBvaW50LngsIHBvaW50LnkpKQotCQlyZXR1cm4gRkFMU0U7CitGWF9CT09MIENGRkxfQnV0dG9uOjpPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgQ1BERl9SZWN0IHJjQW5ub3QgPSBwQW5ub3QtPkdldFJlY3QoKTsKKyAgaWYgKCFyY0Fubm90LkNvbnRhaW5zKHBvaW50LngsIHBvaW50LnkpKQorICAgIHJldHVybiBGQUxTRTsKIAotCW1fYk1vdXNlRG93biA9IFRSVUU7Ci0JbV9iVmFsaWQgPSBUUlVFOwotCUZYX1JFQ1QgcmVjdCA9IHRoaXMtPkdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KTsKLQl0aGlzLT5JbnZhbGlkYXRlUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7Ci0vLwk6OkludmFsaWRhdGVSZWN0KHBQYWdlVmlldy0+R2V0UGFnZVZpZXdXbmQoKSwgJnRoaXMtPkdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KSwgVFJVRSk7Ci0JcmV0dXJuIFRSVUU7CisgIG1fYk1vdXNlRG93biA9IFRSVUU7CisgIG1fYlZhbGlkID0gVFJVRTsKKyAgRlhfUkVDVCByZWN0ID0gR2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBwQW5ub3QpOworICBJbnZhbGlkYXRlUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MCUNGRkxfQnV0dG9uOjpPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotCUNQREZfUmVjdCByY0Fubm90ID0gcEFubm90LT5HZXRSZWN0KCk7Ci0JaWYoIXJjQW5ub3QuQ29udGFpbnMocG9pbnQueCwgcG9pbnQueSkpCi0JCXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ0ZGTF9CdXR0b246Ok9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgQ1BERl9SZWN0IHJjQW5ub3QgPSBwQW5ub3QtPkdldFJlY3QoKTsKKyAgaWYgKCFyY0Fubm90LkNvbnRhaW5zKHBvaW50LngsIHBvaW50LnkpKQorICAgIHJldHVybiBGQUxTRTsKIAotCW1fYk1vdXNlRG93biA9IEZBTFNFOwotCW1fcFdpZGdldC0+R2V0UERGUGFnZSgpOwotCQorICBtX2JNb3VzZURvd24gPSBGQUxTRTsKKyAgbV9wV2lkZ2V0LT5HZXRQREZQYWdlKCk7CiAKLQlGWF9SRUNUIHJlY3QgPSB0aGlzLT5HZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdCk7Ci0JdGhpcy0+SW52YWxpZGF0ZVJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20pOwotLy8gCTo6SW52YWxpZGF0ZVJlY3QocFBhZ2VWaWV3LT5HZXRQYWdlVmlld1duZCgpLCAmdGhpcy0+R2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBwQW5ub3QpLCBUUlVFKTsKLQlyZXR1cm4gVFJVRTsKKyAgRlhfUkVDVCByZWN0ID0gR2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBwQW5ub3QpOworICBJbnZhbGlkYXRlUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MCUNGRkxfQnV0dG9uOjpPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotCUFTU0VSVChtX3BBcHAgIT0gTlVMTCk7CitGWF9CT09MIENGRkxfQnV0dG9uOjpPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIEFTU0VSVChtX3BBcHApOwogCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi12b2lkIENGRkxfQnV0dG9uOjpPbkRyYXcoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCAvKkhEQyBoREMsKi8gQ1BERlNES19Bbm5vdCogcEFubm90LCAKLQkJCQkJCQlDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAotCQkJCQkJCS8qY29uc3QgQ1JlY3QmIHJjV2luZG93LCovIEZYX0RXT1JEIGR3RmxhZ3MpCi17Ci0JQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKLQlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCi0JQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKLQotCUNQREZfRm9ybUNvbnRyb2wqIHBDdHJsID0gcFdpZGdldC0+R2V0Rm9ybUNvbnRyb2woKTsKLQlBU1NFUlQocEN0cmwgIT0gTlVMTCk7Cit2b2lkIENGRkxfQnV0dG9uOjpPbkRyYXcoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKSB7CisgIEFTU0VSVChwUGFnZVZpZXcpOworICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OworICBDUERGX0Zvcm1Db250cm9sKiBwQ3RybCA9IHBXaWRnZXQtPkdldEZvcm1Db250cm9sKCk7CisgIENQREZfRm9ybUNvbnRyb2w6OkhpZ2hsaWdodGluZ01vZGUgZUhNID0gcEN0cmwtPkdldEhpZ2hsaWdodGluZ01vZGUoKTsKIAotCUNQREZfRm9ybUNvbnRyb2w6OkhpZ2hsaWdodGluZ01vZGUgZUhNID0gcEN0cmwtPkdldEhpZ2hsaWdodGluZ01vZGUoKTsKKyAgaWYgKGVITSAhPSBDUERGX0Zvcm1Db250cm9sOjpQdXNoKSB7CisgICAgcFdpZGdldC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsIE5VTEwpOworICAgIHJldHVybjsKKyAgfQogCi0JaWYgKGVITSA9PSBDUERGX0Zvcm1Db250cm9sOjpQdXNoKQotCXsKLQkJaWYgKG1fYk1vdXNlRG93bikKLQkJewotCQkJaWYgKHBXaWRnZXQtPklzV2lkZ2V0QXBwZWFyYW5jZVZhbGlkKENQREZfQW5ub3Q6OkRvd24pKQotCQkJCXBXaWRnZXQtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgQ1BERl9Bbm5vdDo6RG93biwgTlVMTCk7Ci0JCQllbHNlCi0JCQkJcFdpZGdldC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsIE5VTEwpOwotCQl9Ci0JCWVsc2UgaWYgKG1fYk1vdXNlSW4pCi0JCXsKLQkJCWlmIChwV2lkZ2V0LT5Jc1dpZGdldEFwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpSb2xsb3ZlcikpCi0JCQkJcFdpZGdldC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpSb2xsb3ZlciwgTlVMTCk7Ci0JCQllbHNlCi0JCQkJcFdpZGdldC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsIE5VTEwpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcFdpZGdldC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsIE5VTEwpOwotCQl9Ci0JfQotCWVsc2UKLQkJcFdpZGdldC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsIE5VTEwpOworICBpZiAobV9iTW91c2VEb3duKSB7CisgICAgaWYgKHBXaWRnZXQtPklzV2lkZ2V0QXBwZWFyYW5jZVZhbGlkKENQREZfQW5ub3Q6OkRvd24pKQorICAgICAgcFdpZGdldC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpEb3duLCBOVUxMKTsKKyAgICBlbHNlCisgICAgICBwV2lkZ2V0LT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIENQREZfQW5ub3Q6Ok5vcm1hbCwgTlVMTCk7CisgIH0gZWxzZSBpZiAobV9iTW91c2VJbikgeworICAgIGlmIChwV2lkZ2V0LT5Jc1dpZGdldEFwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpSb2xsb3ZlcikpCisgICAgICBwV2lkZ2V0LT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIENQREZfQW5ub3Q6OlJvbGxvdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgZWxzZQorICAgICAgcFdpZGdldC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsIE5VTEwpOworICB9IGVsc2UgeworICAgIHBXaWRnZXQtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgQ1BERl9Bbm5vdDo6Tm9ybWFsLCBOVUxMKTsKKyAgfQogfQogCi0KLXZvaWQgQ0ZGTF9CdXR0b246Ok9uRHJhd0RlYWN0aXZlKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgLypIREMgaERDLCovIENQREZTREtfQW5ub3QqIHBBbm5vdCwgCi0JCQkJCQkJCSBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAotCQkJCQkJCQkgLypjb25zdCBDUmVjdCYgcmNXaW5kb3csICovRlhfRFdPUkQgZHdGbGFncykKLXsKLQlPbkRyYXcocFBhZ2VWaWV3LCBwQW5ub3QsIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgZHdGbGFncyk7Cit2b2lkIENGRkxfQnV0dG9uOjpPbkRyYXdEZWFjdGl2ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncykgeworICBPbkRyYXcocFBhZ2VWaWV3LCBwQW5ub3QsIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgZHdGbGFncyk7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9JRm9ybUZpbGxlci5jcHAgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9JRm9ybUZpbGxlci5jcHAKaW5kZXggMTY1NmJhNS4uMzZiMTIzZSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfSUZvcm1GaWxsZXIuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmNwcApAQCAtMSwxMTk3ICsxLDEwMjQgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfSUZvcm1GaWxsZXIuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NoZWNrQm94LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Db21ib0JveC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfTGlzdEJveC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfUHVzaEJ1dHRvbi5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfUmFkaW9CdXR0b24uaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1RleHRGaWVsZC5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9JRm9ybUZpbGxlci5oIgogCi0jZGVmaW5lIEZGTF9NQVhMSVNUQk9YSEVJR0hUCQkxNDAuMGYKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfQ2hlY2tCb3guaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfQ29tYm9Cb3guaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9MaXN0Qm94LmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1B1c2hCdXR0b24uaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfUmFkaW9CdXR0b24uaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfVGV4dEZpZWxkLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZzZGtfbWdyLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfVXRpbHMuaCIKIAotLy8gSEhPT0sgQ0ZGTF9JRm9ybUZpbGxlcjo6bV9ob29rU2hlZXQgPSBOVUxMOwotLy8gTVNHIENGRkxfSUZvcm1GaWxsZXI6OmdfTXNnOworI2RlZmluZSBGRkxfTUFYTElTVEJPWEhFSUdIVCAxNDAuMGYKIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0ZGTF9JRm9ybUZpbGxlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworQ0ZGTF9JRm9ybUZpbGxlcjo6Q0ZGTF9JRm9ybUZpbGxlcihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKQorICAgIDogbV9wQXBwKHBBcHApLCBtX2JOb3RpZnlpbmcoRkFMU0UpIHt9CiAKLUNGRkxfSUZvcm1GaWxsZXI6OkNGRkxfSUZvcm1GaWxsZXIoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCkgOiAKLQltX3BBcHAocEFwcCksCi0JbV9iTm90aWZ5aW5nKEZBTFNFKQoteworQ0ZGTF9JRm9ybUZpbGxlcjo6fkNGRkxfSUZvcm1GaWxsZXIoKSB7CisgIGZvciAoYXV0byYgaXQgOiBtX01hcHMpCisgICAgZGVsZXRlIGl0LnNlY29uZDsKKyAgbV9NYXBzLmNsZWFyKCk7CiB9CiAKLUNGRkxfSUZvcm1GaWxsZXI6On5DRkZMX0lGb3JtRmlsbGVyKCkKLXsKLQlGWF9QT1NJVElPTiBwb3MgPSBtX01hcHMuR2V0U3RhcnRQb3NpdGlvbigpOwotCXdoaWxlIChwb3MpCi0JewotCQlDUERGU0RLX0Fubm90ICogcEFubm90ID0gTlVMTDsKLQkJQ0ZGTF9Gb3JtRmlsbGVyICogcEZvcm1GaWxsZXIgPSBOVUxMOwotCQltX01hcHMuR2V0TmV4dEFzc29jKHBvcyxwQW5ub3QscEZvcm1GaWxsZXIpOwotCQlkZWxldGUgcEZvcm1GaWxsZXI7Ci0JfQotCW1fTWFwcy5SZW1vdmVBbGwoKTsKK0ZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6QW5ub3RfSGl0VGVzdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUG9pbnQgcG9pbnQpIHsKKyAgQ1BERl9SZWN0IHJjID0gcEFubm90LT5HZXRSZWN0KCk7CisgIGlmIChyYy5Db250YWlucyhwb2ludC54LCBwb2ludC55KSkKKyAgICByZXR1cm4gVFJVRTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MCUNGRkxfSUZvcm1GaWxsZXI6OkFubm90X0hpdFRlc3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LENQREZTREtfQW5ub3QqIHBBbm5vdCwgQ1BERl9Qb2ludCBwb2ludCkKLXsKLQlDUERGX1JlY3QgcmMgPSBwQW5ub3QtPkdldFJlY3QoKTsKLQlpZihyYy5Db250YWlucyhwb2ludC54LCBwb2ludC55KSkKLQkJcmV0dXJuIFRSVUU7Ci0JcmV0dXJuIEZBTFNFOworRlhfUkVDVCBDRkZMX0lGb3JtRmlsbGVyOjpHZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCkgeworICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCisgICAgcmV0dXJuIHBGb3JtRmlsbGVyLT5HZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdCk7CisKKyAgQVNTRVJUKHBQYWdlVmlldyk7CisKKyAgQ1BERl9Bbm5vdCogcFBERkFubm90ID0gcEFubm90LT5HZXRQREZBbm5vdCgpOworICBDUERGX1JlY3QgcmNBbm5vdDsKKyAgcFBERkFubm90LT5HZXRSZWN0KHJjQW5ub3QpOworCisgIENQREZfUmVjdCByY1dpbiA9IENQV0xfVXRpbHM6OkluZmxhdGVSZWN0KHJjQW5ub3QsIDEpOworICByZXR1cm4gcmNXaW4uR2V0T3V0dGVyUmVjdCgpOwogfQogCi1GWF9SRUNUIENGRkxfSUZvcm1GaWxsZXI6OkdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KQotewotCWlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKLQl7Ci0JCXJldHVybiBwRm9ybUZpbGxlci0+R2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBwQW5ub3QpOwotCX0KLQllbHNlCi0JewotCQlBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwotCQlBU1NFUlQocEFubm90ICE9IE5VTEwpOwordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkRyYXcoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpIHsKKyAgQVNTRVJUKHBQYWdlVmlldyk7CisgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7CiAKLQkJQ1BERl9Bbm5vdCogcFBERkFubm90ID0gcEFubm90LT5HZXRQREZBbm5vdCgpOwotCQlBU1NFUlQocFBERkFubm90ICE9IE5VTEwpOworICBpZiAoSXNWaXNpYmxlKHBXaWRnZXQpKSB7CisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKSB7CisgICAgICBpZiAocEZvcm1GaWxsZXItPklzVmFsaWQoKSkgeworICAgICAgICBwRm9ybUZpbGxlci0+T25EcmF3KHBQYWdlVmlldywgcEFubm90LCBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIGR3RmxhZ3MpOworICAgICAgICBwQW5ub3QtPkdldFBERlBhZ2UoKTsKIAotCQlDUERGX1JlY3QgcmNBbm5vdDsKLQkJcFBERkFubm90LT5HZXRSZWN0KHJjQW5ub3QpOworICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBtX3BBcHAtPkdldFNES0RvY3VtZW50KCk7CisgICAgICAgIGlmIChwRG9jdW1lbnQtPkdldEZvY3VzQW5ub3QoKSA9PSBwQW5ub3QpIHsKKyAgICAgICAgICBDUERGX1JlY3QgcmNGb2N1cyA9IHBGb3JtRmlsbGVyLT5HZXRGb2N1c0JveChwUGFnZVZpZXcpOworICAgICAgICAgIGlmICghcmNGb2N1cy5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIENGWF9QYXRoRGF0YSBwYXRoOworICAgICAgICAgICAgcGF0aC5TZXRQb2ludENvdW50KDUpOworICAgICAgICAgICAgcGF0aC5TZXRQb2ludCgwLCByY0ZvY3VzLmxlZnQsIHJjRm9jdXMudG9wLCBGWFBUX01PVkVUTyk7CisgICAgICAgICAgICBwYXRoLlNldFBvaW50KDEsIHJjRm9jdXMubGVmdCwgcmNGb2N1cy5ib3R0b20sIEZYUFRfTElORVRPKTsKKyAgICAgICAgICAgIHBhdGguU2V0UG9pbnQoMiwgcmNGb2N1cy5yaWdodCwgcmNGb2N1cy5ib3R0b20sIEZYUFRfTElORVRPKTsKKyAgICAgICAgICAgIHBhdGguU2V0UG9pbnQoMywgcmNGb2N1cy5yaWdodCwgcmNGb2N1cy50b3AsIEZYUFRfTElORVRPKTsKKyAgICAgICAgICAgIHBhdGguU2V0UG9pbnQoNCwgcmNGb2N1cy5sZWZ0LCByY0ZvY3VzLnRvcCwgRlhQVF9MSU5FVE8pOwogCi0vLyAJCUNSZWN0IHJjV2luOwotLy8gCQlwUGFnZVZpZXctPkRvY1RvV2luZG93KHJjQW5ub3QsIHJjV2luKTsKLQkJQ1BERl9SZWN0IHJjV2luID0gQ1BXTF9VdGlsczo6SW5mbGF0ZVJlY3QocmNBbm5vdCwxKTsKLS8vCQlyY1dpbi5JbmZsYXRlUmVjdCgxLCAxKTsKKyAgICAgICAgICAgIENGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7CisgICAgICAgICAgICBnc2QuU2V0RGFzaENvdW50KDEpOworICAgICAgICAgICAgZ3NkLm1fRGFzaEFycmF5WzBdID0gMS4wZjsKKyAgICAgICAgICAgIGdzZC5tX0Rhc2hQaGFzZSA9IDA7CisgICAgICAgICAgICBnc2QubV9MaW5lV2lkdGggPSAxLjBmOworICAgICAgICAgICAgcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgJmdzZCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoMjU1LCAwLCAwLCAwKSwgRlhGSUxMX0FMVEVSTkFURSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CiAKLQkJcmV0dXJuIHJjV2luLkdldE91dHRlclJlY3QoKTsKLQl9CisgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQorICAgICAgcEZvcm1GaWxsZXItPk9uRHJhd0RlYWN0aXZlKHBQYWdlVmlldywgcEFubm90LCBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFncyk7CisgICAgZWxzZQorICAgICAgcFdpZGdldC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsIE5VTEwpOworCisgICAgaWYgKCFJc1JlYWRPbmx5KHBXaWRnZXQpICYmIElzRmlsbGluZ0FsbG93ZWQocFdpZGdldCkpCisgICAgICBwV2lkZ2V0LT5EcmF3U2hhZG93KHBEZXZpY2UsIHBQYWdlVmlldyk7CisgIH0KIH0KIAotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkRyYXcoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCAvKkhEQyBoREMsKi8gQ1BERlNES19Bbm5vdCogcEFubm90LCAKLQkJCQkJCUNGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0JCQkJCQkvKmNvbnN0IENSZWN0JiByY1dpbmRvdywqLyBGWF9EV09SRCBkd0ZsYWdzKQotewotCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Ci0JQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKLQotCWlmIChJc1Zpc2libGUocFdpZGdldCkpCi0JewotCQlpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCi0JCXsKLSAJCQlpZiAocEZvcm1GaWxsZXItPklzVmFsaWQoKSkKLSAJCQl7Ci0JCQkJcEZvcm1GaWxsZXItPk9uRHJhdyhwUGFnZVZpZXcsIHBBbm5vdCwgcERldmljZSwgcFVzZXIyRGV2aWNlLCBkd0ZsYWdzKTsKLQkJCQkKLQkJCQlwQW5ub3QtPkdldFBERlBhZ2UoKTsKLQkJCQkKLQotCQkJCUNQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCA9IG1fcEFwcC0+R2V0Q3VycmVudERvYygpOwotCQkJCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLQkJCQlpZiAocERvY3VtZW50LT5HZXRGb2N1c0Fubm90KCkgPT0gcEFubm90KQotCQkJCXsKLQkJCQkJQ1BERl9SZWN0IHJjRm9jdXMgPSBwRm9ybUZpbGxlci0+R2V0Rm9jdXNCb3gocFBhZ2VWaWV3KTsKLQkJCQkJaWYgKCFyY0ZvY3VzLklzRW1wdHkoKSkKLQkJCQkJewotCQkJCQkJQ0ZYX1BhdGhEYXRhIHBhdGg7Ci0JCQkJCQkKLQkJCQkJCXBhdGguU2V0UG9pbnRDb3VudCg1KTsKLQkJCQkJCXBhdGguU2V0UG9pbnQoMCwgcmNGb2N1cy5sZWZ0LCAgcmNGb2N1cy50b3AsIEZYUFRfTU9WRVRPKTsKLQkJCQkJCXBhdGguU2V0UG9pbnQoMSwgcmNGb2N1cy5sZWZ0LCAgcmNGb2N1cy5ib3R0b20sIEZYUFRfTElORVRPKTsKLQkJCQkJCXBhdGguU2V0UG9pbnQoMiwgcmNGb2N1cy5yaWdodCwgIHJjRm9jdXMuYm90dG9tLCBGWFBUX0xJTkVUTyk7Ci0JCQkJCQlwYXRoLlNldFBvaW50KDMsIHJjRm9jdXMucmlnaHQsICByY0ZvY3VzLnRvcCwgRlhQVF9MSU5FVE8pOwotCQkJCQkJcGF0aC5TZXRQb2ludCg0LCByY0ZvY3VzLmxlZnQsICByY0ZvY3VzLnRvcCwgRlhQVF9MSU5FVE8pOwotCQkJCQkJCi0JCQkJCQlDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOwotCQkJCQkJZ3NkLlNldERhc2hDb3VudCgxKTsJCQkJCi0JCQkJCQlnc2QubV9EYXNoQXJyYXlbMF0gPSAxLjBmOwotCQkJCQkJZ3NkLm1fRGFzaFBoYXNlID0gMDsJCi0JCQkJCQkKLQkJCQkJCWdzZC5tX0xpbmVXaWR0aCA9IDEuMGY7Ci0JCQkJCQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCAmZ3NkLCAwLCBBcmdiRW5jb2RlKDI1NSwwLDAsMCksIEZYRklMTF9BTFRFUk5BVEUpOwotCi0JCQkJCS8vCTo6RHJhd0ZvY3VzUmVjdChoREMsICZyY0ZvY3VzKTsJCi0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCi0JCQlwRm9ybUZpbGxlci0+T25EcmF3RGVhY3RpdmUocFBhZ2VWaWV3LCBwQW5ub3QsIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgZHdGbGFncyk7Ci0JCWVsc2UKLQkJCXBXaWRnZXQtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgQ1BERl9Bbm5vdDo6Tm9ybWFsLCBOVUxMKTsKLQotCQlpZiAoIUlzUmVhZE9ubHkocFdpZGdldCkgJiYgSXNGaWxsaW5nQWxsb3dlZChwV2lkZ2V0KSkKLQkJewotCQkJcFdpZGdldC0+RHJhd1NoYWRvdyhwRGV2aWNlLCBwUGFnZVZpZXcpOwotCQl9Ci0JCi0JfQordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkNyZWF0ZShDUERGU0RLX0Fubm90KiBwQW5ub3QpIHsKKyAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKSB7CisgICAgcEZvcm1GaWxsZXItPk9uQ3JlYXRlKHBBbm5vdCk7CisgIH0KIH0KIAotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkNyZWF0ZShDUERGU0RLX0Fubm90KiBwQW5ub3QpCi17Ci0JaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQotCXsKLQkJcEZvcm1GaWxsZXItPk9uQ3JlYXRlKHBBbm5vdCk7Ci0JfQordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkxvYWQoQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkgeworICAgIHBGb3JtRmlsbGVyLT5PbkxvYWQocEFubm90KTsKKyAgfQogfQogCi12b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uTG9hZChDUERGU0RLX0Fubm90KiBwQW5ub3QpCi17Ci0JaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQotCXsKLQkJcEZvcm1GaWxsZXItPk9uTG9hZChwQW5ub3QpOwotCX0KK3ZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25EZWxldGUoQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkgeworICAgIHBGb3JtRmlsbGVyLT5PbkRlbGV0ZShwQW5ub3QpOworICB9CisKKyAgVW5SZWdpc3RlckZvcm1GaWxsZXIocEFubm90KTsKIH0KIAotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkRlbGV0ZShDUERGU0RLX0Fubm90KiBwQW5ub3QpCi17Ci0JaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQotCXsKLQkJcEZvcm1GaWxsZXItPk9uRGVsZXRlKHBBbm5vdCk7Ci0JfQordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZykgeworICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwogCi0JVW5SZWdpc3RlckZvcm1GaWxsZXIocEFubm90KTsKKyAgaWYgKCFtX2JOb3RpZnlpbmcpIHsKKyAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OworICAgIGlmIChwV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6Q3Vyc29yRW50ZXIpKSB7CisgICAgICBtX2JOb3RpZnlpbmcgPSBUUlVFOworCisgICAgICBpbnQgblZhbHVlQWdlID0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKTsKKworICAgICAgcFdpZGdldC0+Q2xlYXJBcHBNb2RpZmllZCgpOworCisgICAgICBBU1NFUlQocFBhZ2VWaWV3KTsKKworICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOworICAgICAgZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7CisgICAgICBmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7CisgICAgICBwV2lkZ2V0LT5PbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpDdXJzb3JFbnRlciwgZmEsIHBQYWdlVmlldyk7CisgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKKworICAgICAgaWYgKHBXaWRnZXQtPklzQXBwTW9kaWZpZWQoKSkgeworICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgRkFMU0UpKSB7CisgICAgICAgICAgcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldC0+R2V0VmFsdWVBZ2UoKSA9PSBuVmFsdWVBZ2UpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgVFJVRSkpIHsKKyAgICBwRm9ybUZpbGxlci0+T25Nb3VzZUVudGVyKHBQYWdlVmlldywgcEFubm90KTsKKyAgfQogfQogCi12b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZykKLXsKLQlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCUFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7Ci0JCi0JaWYgKCFtX2JOb3RpZnlpbmcpCi0JewotCQlDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwotCQlpZiAocFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkN1cnNvckVudGVyKSkKLQkJewotCQkJbV9iTm90aWZ5aW5nID0gVFJVRTsKLQkJCQotCQkJaW50IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7Cit2b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFnKSB7CisgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CiAKLQkJCXBXaWRnZXQtPkNsZWFyQXBwTW9kaWZpZWQoKTsKLQkJCQotCQkJQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKLQkJCQotCQkJCi0JCQkKLQkJCVBERlNES19GaWVsZEFjdGlvbiBmYTsKLQkJCWZhLmJNb2RpZmllciA9IG1fcEFwcC0+RkZJX0lzQ1RSTEtleURvd24obkZsYWcpOwotIAkJCWZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKLQkJCXBXaWRnZXQtPk9uQUFjdGlvbihDUERGX0FBY3Rpb246OkN1cnNvckVudGVyLCBmYSwgcFBhZ2VWaWV3ICk7Ci0JCQltX2JOb3RpZnlpbmcgPSBGQUxTRTsKLQkJCQotCQkJLy9pZiAoICFJc1ZhbGlkQW5ub3QocFBhZ2VWaWV3LCBwQW5ub3QpICkgcmV0dXJuOwotCQkJCi0JCQlpZiAocFdpZGdldC0+SXNBcHBNb2RpZmllZCgpKQotCQkJewotCQkJCWlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBGQUxTRSkpCi0JCQkJewotCQkJCQlwRm9ybUZpbGxlci0+UmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpID09IG5WYWx1ZUFnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCWlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIFRSVUUpKQotCXsKLQkJcEZvcm1GaWxsZXItPk9uTW91c2VFbnRlcihwUGFnZVZpZXcsIHBBbm5vdCk7Ci0JfQorICBpZiAoIW1fYk5vdGlmeWluZykgeworICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7CisgICAgaWYgKHBXaWRnZXQtPkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpDdXJzb3JFeGl0KSkgeworICAgICAgbV9iTm90aWZ5aW5nID0gVFJVRTsKKyAgICAgIHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKTsKKyAgICAgIGludCBuVmFsdWVBZ2UgPSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpOworICAgICAgcFdpZGdldC0+Q2xlYXJBcHBNb2RpZmllZCgpOworCisgICAgICBBU1NFUlQocFBhZ2VWaWV3KTsKKworICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOworICAgICAgZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7CisgICAgICBmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7CisKKyAgICAgIHBXaWRnZXQtPk9uQUFjdGlvbihDUERGX0FBY3Rpb246OkN1cnNvckV4aXQsIGZhLCBwUGFnZVZpZXcpOworICAgICAgbV9iTm90aWZ5aW5nID0gRkFMU0U7CisKKyAgICAgIGlmIChwV2lkZ2V0LT5Jc0FwcE1vZGlmaWVkKCkpIHsKKyAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIEZBTFNFKSkgeworICAgICAgICAgIHBGb3JtRmlsbGVyLT5SZXNldFBERldpbmRvdyhwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5WYWx1ZUFnZSA9PSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkgeworICAgIHBGb3JtRmlsbGVyLT5Pbk1vdXNlRXhpdChwUGFnZVZpZXcsIHBBbm5vdCk7CisgIH0KIH0KIAotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbk1vdXNlRXhpdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZykKLXsKLQlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCUFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7Ci0JCi0JaWYgKCFtX2JOb3RpZnlpbmcpCi0JewotCQlDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwotCQlpZiAocFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkN1cnNvckV4aXQpKQotCQl7Ci0JCQltX2JOb3RpZnlpbmcgPSBUUlVFOwotCQkJcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpOwotCQkJaW50IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7Ci0JCQlwV2lkZ2V0LT5DbGVhckFwcE1vZGlmaWVkKCk7Ci0JCQkKLQkJCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Ci0JCQkKLQkJCQotCQkJCi0JCQlQREZTREtfRmllbGRBY3Rpb24gZmE7Ci0JCQlmYS5iTW9kaWZpZXIgPSBtX3BBcHAtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTsKLSAJCQlmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7Ci0JCQkKLQkJCXBXaWRnZXQtPk9uQUFjdGlvbihDUERGX0FBY3Rpb246OkN1cnNvckV4aXQsIGZhLCBwUGFnZVZpZXcpOwotCQkJbV9iTm90aWZ5aW5nID0gRkFMU0U7Ci0JCQkKLQkJCS8vaWYgKCFJc1ZhbGlkQW5ub3QocFBhZ2VWaWV3LCBwQW5ub3QpKSByZXR1cm47Ci0JCQkKLQkJCWlmIChwV2lkZ2V0LT5Jc0FwcE1vZGlmaWVkKCkpCi0JCQl7Ci0JCQkJaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIEZBTFNFKSkKLQkJCQl7Ci0JCQkJCXBGb3JtRmlsbGVyLT5SZXNldFBERldpbmRvdyhwUGFnZVZpZXcsIG5WYWx1ZUFnZSA9PSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQotCXsKLQkJcEZvcm1GaWxsZXItPk9uTW91c2VFeGl0KHBQYWdlVmlldywgcEFubm90KTsKLQl9CitGWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOworCisgIGlmICghbV9iTm90aWZ5aW5nKSB7CisgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKKyAgICBpZiAoQW5ub3RfSGl0VGVzdChwUGFnZVZpZXcsIHBBbm5vdCwgcG9pbnQpICYmCisgICAgICAgIHBXaWRnZXQtPkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpCdXR0b25Eb3duKSkgeworICAgICAgbV9iTm90aWZ5aW5nID0gVFJVRTsKKyAgICAgIHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKTsKKyAgICAgIGludCBuVmFsdWVBZ2UgPSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpOworICAgICAgcFdpZGdldC0+Q2xlYXJBcHBNb2RpZmllZCgpOworCisgICAgICBBU1NFUlQocFBhZ2VWaWV3KTsKKworICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOworICAgICAgZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZ3MpOworICAgICAgZmEuYlNoaWZ0ID0gbV9wQXBwLT5GRklfSXNTSElGVEtleURvd24obkZsYWdzKTsKKyAgICAgIHBXaWRnZXQtPk9uQUFjdGlvbihDUERGX0FBY3Rpb246OkJ1dHRvbkRvd24sIGZhLCBwUGFnZVZpZXcpOworICAgICAgbV9iTm90aWZ5aW5nID0gRkFMU0U7CisKKyAgICAgIGlmICghSXNWYWxpZEFubm90KHBQYWdlVmlldywgcEFubm90KSkKKyAgICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICAgIGlmIChwV2lkZ2V0LT5Jc0FwcE1vZGlmaWVkKCkpIHsKKyAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIEZBTFNFKSkgeworICAgICAgICAgIHBGb3JtRmlsbGVyLT5SZXNldFBERldpbmRvdyhwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5WYWx1ZUFnZSA9PSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkgeworICAgIHJldHVybiBwRm9ybUZpbGxlci0+T25MQnV0dG9uRG93bihwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CisgIH0KKworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wJQ0ZGTF9JRm9ybUZpbGxlcjo6T25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0JQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKLQkKLQlpZiAoIW1fYk5vdGlmeWluZykKLQl7Ci0JCUNQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7Ci0JCWlmIChBbm5vdF9IaXRUZXN0KHBQYWdlVmlldywgcEFubm90LCBwb2ludCkgJiYgcFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkJ1dHRvbkRvd24pKQotCQl7Ci0JCQltX2JOb3RpZnlpbmcgPSBUUlVFOwotCQkJcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpOwotCQkJaW50IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7Ci0JCQlwV2lkZ2V0LT5DbGVhckFwcE1vZGlmaWVkKCk7Ci0JCQkKLQkJCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Ci0JCQkKLQkJCQotCQkJCi0JCQlQREZTREtfRmllbGRBY3Rpb24gZmE7Ci0JCQlmYS5iTW9kaWZpZXIgPSBtX3BBcHAtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFncyk7Ci0gCQkJZmEuYlNoaWZ0ID0gbV9wQXBwLT5GRklfSXNTSElGVEtleURvd24obkZsYWdzKTsKLQkJCXBXaWRnZXQtPk9uQUFjdGlvbihDUERGX0FBY3Rpb246OkJ1dHRvbkRvd24sIGZhLCBwUGFnZVZpZXcpOwotCQkJbV9iTm90aWZ5aW5nID0gRkFMU0U7Ci0JCQkKLQkJCWlmICghSXNWYWxpZEFubm90KHBQYWdlVmlldywgcEFubm90KSkgcmV0dXJuIFRSVUU7Ci0JCQkKLQkJCWlmIChwV2lkZ2V0LT5Jc0FwcE1vZGlmaWVkKCkpCi0JCQl7Ci0JCQkJaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIEZBTFNFKSkKLQkJCQl7Ci0JCQkJCXBGb3JtRmlsbGVyLT5SZXNldFBERldpbmRvdyhwUGFnZVZpZXcsIG5WYWx1ZUFnZSA9PSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQotCXsKLQkJcmV0dXJuIHBGb3JtRmlsbGVyLT5PbkxCdXR0b25Eb3duKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKLQl9Ci0JCi0JcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CisgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7CisgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCA9IG1fcEFwcC0+R2V0U0RLRG9jdW1lbnQoKTsKKworICBzd2l0Y2ggKHBXaWRnZXQtPkdldEZpZWxkVHlwZSgpKSB7CisgICAgY2FzZSBGSUVMRFRZUEVfUFVTSEJVVFRPTjoKKyAgICBjYXNlIEZJRUxEVFlQRV9DSEVDS0JPWDoKKyAgICBjYXNlIEZJRUxEVFlQRV9SQURJT0JVVFRPTjoKKyAgICAgIGlmIChHZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdCkuQ29udGFpbnMoKGludClwb2ludC54LCAoaW50KXBvaW50LnkpKQorICAgICAgICBwRG9jdW1lbnQtPlNldEZvY3VzQW5ub3QocEFubm90KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBwRG9jdW1lbnQtPlNldEZvY3VzQW5ub3QocEFubm90KTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7CisKKyAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKSB7CisgICAgYlJldCA9IHBGb3JtRmlsbGVyLT5PbkxCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CisgIH0KKworICBpZiAocERvY3VtZW50LT5HZXRGb2N1c0Fubm90KCkgPT0gcEFubm90KSB7CisgICAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOworICAgIEZYX0JPT0wgYlJlc2V0ID0gRkFMU0U7CisgICAgT25CdXR0b25VcChwV2lkZ2V0LCBwUGFnZVZpZXcsIGJSZXNldCwgYkV4aXQsIG5GbGFncyk7CisgICAgaWYgKGJFeGl0KQorICAgICAgcmV0dXJuIFRSVUU7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgICBPbkNsaWNrKHBXaWRnZXQsIHBQYWdlVmlldywgYlJlc2V0LCBiRXhpdCwgbkZsYWdzKTsKKyAgICBpZiAoYkV4aXQpCisgICAgICByZXR1cm4gVFJVRTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgfQorICByZXR1cm4gYlJldDsKIH0KIAotRlhfQk9PTAlDRkZMX0lGb3JtRmlsbGVyOjpPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0JQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKLQkKLQlDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwotCS8vIAlDUmVhZGVyX1BhZ2UqIHBQYWdlID0gcEFubm90LT5HZXRQYWdlKCk7Ci0JLy8gCUFTU0VSVChwUGFnZSAhPSBOVUxMKTsKLQlDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBtX3BBcHAtPkdldEN1cnJlbnREb2MoKTsKLQlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwkJCi0JCi0Jc3dpdGNoIChwV2lkZ2V0LT5HZXRGaWVsZFR5cGUoKSkKLQl7Ci0JY2FzZSBGSUVMRFRZUEVfUFVTSEJVVFRPTjoKLQljYXNlIEZJRUxEVFlQRV9DSEVDS0JPWDoKLQljYXNlIEZJRUxEVFlQRV9SQURJT0JVVFRPTjoKLQkJaWYgKEdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KS5Db250YWlucygoaW50KXBvaW50LngsIChpbnQpcG9pbnQueSkpCi0JCXsKLQkJCXBEb2N1bWVudC0+U2V0Rm9jdXNBbm5vdChwQW5ub3QpOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXBEb2N1bWVudC0+U2V0Rm9jdXNBbm5vdChwQW5ub3QpOwotCQlicmVhazsKLQl9Ci0JCi0JRlhfQk9PTCBiUmV0ID0gRkFMU0U7Ci0JCi0JaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQotCXsKLQkJYlJldCA9IHBGb3JtRmlsbGVyLT5PbkxCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7Ci0JfQordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkJ1dHRvblVwKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUmVzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkV4aXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZykgeworICBBU1NFUlQocFdpZGdldCk7CiAKLQlpZiAocERvY3VtZW50LT5HZXRGb2N1c0Fubm90KCkgPT0gcEFubm90KQotCXsKLQkJRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwotCQlGWF9CT09MIGJSZXNldCA9IEZBTFNFOwotCQlPbkJ1dHRvblVwKHBXaWRnZXQsIHBQYWdlVmlldywgYlJlc2V0LCBiRXhpdCxuRmxhZ3MpOwotCQlpZiAoYkV4aXQpIHJldHVybiBUUlVFOwotCX0KLQlyZXR1cm4gYlJldDsKKyAgaWYgKCFtX2JOb3RpZnlpbmcpIHsKKyAgICBpZiAocFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkJ1dHRvblVwKSkgeworICAgICAgbV9iTm90aWZ5aW5nID0gVFJVRTsKKyAgICAgIGludCBuQWdlID0gcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpOworICAgICAgaW50IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7CisKKyAgICAgIEFTU0VSVChwUGFnZVZpZXcpOworCisgICAgICBQREZTREtfRmllbGRBY3Rpb24gZmE7CisgICAgICBmYS5iTW9kaWZpZXIgPSBtX3BBcHAtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTsKKyAgICAgIGZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKKworICAgICAgcFdpZGdldC0+T25BQWN0aW9uKENQREZfQUFjdGlvbjo6QnV0dG9uVXAsIGZhLCBwUGFnZVZpZXcpOworICAgICAgbV9iTm90aWZ5aW5nID0gRkFMU0U7CisKKyAgICAgIGlmICghSXNWYWxpZEFubm90KHBQYWdlVmlldywgcFdpZGdldCkpIHsKKyAgICAgICAgYkV4aXQgPSBUUlVFOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGlmIChuQWdlICE9IHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKSkgeworICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgRkFMU0UpKSB7CisgICAgICAgICAgcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblZhbHVlQWdlID09IHBXaWRnZXQtPkdldFZhbHVlQWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgYlJlc2V0ID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgIH0KIH0KIAotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkJ1dHRvblVwKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJSZXNldCwgRlhfQk9PTCYgYkV4aXQsRlhfVUlOVCBuRmxhZykKLXsKLQlBU1NFUlQocFdpZGdldCAhPSBOVUxMKTsKLQkKLQlpZiAoIW1fYk5vdGlmeWluZykKLQl7Ci0JCWlmIChwV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6QnV0dG9uVXApKQotCQl7Ci0JCQltX2JOb3RpZnlpbmcgPSBUUlVFOwotCQkJaW50IG5BZ2UgPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCk7Ci0JCQlpbnQgblZhbHVlQWdlID0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKTsKLQkJCQotCQkJQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKLS8vIAkJCUNSZWFkZXJfRG9jVmlldyogcERvY1ZpZXcgPSBwUGFnZVZpZXctPkdldERvY1ZpZXcoKTsKLS8vIAkJCUFTU0VSVChwRG9jVmlldyAhPSBOVUxMKTsKLQkJCQotCQkJCi0JCQkKLQkJCVBERlNES19GaWVsZEFjdGlvbiBmYTsKLQkJCWZhLmJNb2RpZmllciA9IG1fcEFwcC0+RkZJX0lzQ1RSTEtleURvd24obkZsYWcpOwotIAkJCWZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKK0ZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKIAotCQkJcFdpZGdldC0+T25BQWN0aW9uKENQREZfQUFjdGlvbjo6QnV0dG9uVXAsIGZhLCBwUGFnZVZpZXcpOwotCQkJbV9iTm90aWZ5aW5nID0gRkFMU0U7Ci0JCQkKLQkJCWlmICghSXNWYWxpZEFubm90KHBQYWdlVmlldywgcFdpZGdldCkpCi0JCQl7Ci0JCQkJYkV4aXQgPSBUUlVFOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJaWYgKG5BZ2UgIT0gcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpKQotCQkJewotCQkJCWlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBGQUxTRSkpCi0JCQkJewotCQkJCQlwRm9ybUZpbGxlci0+UmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBuVmFsdWVBZ2UgPT0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKSk7Ci0JCQkJfQotCQkJCQotCQkJCWJSZXNldCA9IFRSVUU7Ci0JCQl9Ci0JCX0KLQl9CisgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkgeworICAgIHJldHVybiBwRm9ybUZpbGxlci0+T25MQnV0dG9uRGJsQ2xrKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTAlDRkZMX0lGb3JtRmlsbGVyOjpPbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLQlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCUFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CitGWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKIAotCWlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKLQl7Ci0JCXJldHVybiBwRm9ybUZpbGxlci0+T25MQnV0dG9uRGJsQ2xrKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKLQl9CisgIC8vIGNoYW5nZSBjdXJzb3IKKyAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgVFJVRSkpIHsKKyAgICByZXR1cm4gcEZvcm1GaWxsZXItPk9uTW91c2VNb3ZlKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKKyAgfQogCi0JcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wJQ0ZGTF9JRm9ybUZpbGxlcjo6T25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLQlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCUFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CitGWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHpEZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CiAKLQkvL2NoYW5nZSBjdXJzb3IKLQlpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBUUlVFKSkKLQl7Ci0JCXJldHVybiBwRm9ybUZpbGxlci0+T25Nb3VzZU1vdmUocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwotCX0KKyAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKSB7CisgICAgcmV0dXJuIHBGb3JtRmlsbGVyLT5Pbk1vdXNlV2hlZWwocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgekRlbHRhLCBwb2ludCk7CisgIH0KIAotCXJldHVybiBGQUxTRTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MCUNGRkxfSUZvcm1GaWxsZXI6Ok9uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0JQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQlBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOworRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpPblJCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKIAotCWlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKLQl7Ci0JCXJldHVybiBwRm9ybUZpbGxlci0+T25Nb3VzZVdoZWVsKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHpEZWx0YSwgcG9pbnQpOwotCX0KKyAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKSB7CisgICAgcmV0dXJuIHBGb3JtRmlsbGVyLT5PblJCdXR0b25Eb3duKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKKyAgfQogCi0JcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wJQ0ZGTF9JRm9ybUZpbGxlcjo6T25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0JQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKK0ZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwogCi0JaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQotCXsKLQkJcmV0dXJuIHBGb3JtRmlsbGVyLT5PblJCdXR0b25Eb3duKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKLQl9CisgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkgeworICAgIHJldHVybiBwRm9ybUZpbGxlci0+T25SQnV0dG9uVXAocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOworICB9CiAKLQlyZXR1cm4gRkFMU0U7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTAlDRkZMX0lGb3JtRmlsbGVyOjpPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0JQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKK0ZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6T25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbktleUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncykgeworICBBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwogCi0JaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQotCXsKLQkJcmV0dXJuIHBGb3JtRmlsbGVyLT5PblJCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7Ci0JfQorICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpIHsKKyAgICByZXR1cm4gcEZvcm1GaWxsZXItPk9uS2V5RG93bihwQW5ub3QsIG5LZXlDb2RlLCBuRmxhZ3MpOworICB9CiAKLQlyZXR1cm4gRkFMU0U7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTAlDRkZMX0lGb3JtRmlsbGVyOjpPblJCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLQlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCUFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CitGWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5DaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MpIHsKKyAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKKyAgaWYgKG5DaGFyID09IEZXTF9WS0VZX1RhYikKKyAgICByZXR1cm4gVFJVRTsKIAotCWlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKLQl7Ci0JCXJldHVybiBwRm9ybUZpbGxlci0+T25SQnV0dG9uRGJsQ2xrKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKLQl9CisgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIEZBTFNFKSkKKyAgICByZXR1cm4gcEZvcm1GaWxsZXItPk9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOwogCi0JcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wJQ0ZGTF9JRm9ybUZpbGxlcjo6T25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuS2V5Q29kZSwgRlhfVUlOVCBuRmxhZ3MpCi17Ci0JQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQlBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOworRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZykgeworICBpZiAoIXBBbm5vdCkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCi0JewotCQlyZXR1cm4gcEZvcm1GaWxsZXItPk9uS2V5RG93bihwQW5ub3QsIG5LZXlDb2RlLCBuRmxhZ3MpOwkKLQl9CisgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CiAKLQlyZXR1cm4gRkFMU0U7CisgIGlmICghbV9iTm90aWZ5aW5nKSB7CisgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKKyAgICBpZiAocFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkdldEZvY3VzKSkgeworICAgICAgbV9iTm90aWZ5aW5nID0gVFJVRTsKKyAgICAgIHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKTsKKworICAgICAgaW50IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7CisgICAgICBwV2lkZ2V0LT5DbGVhckFwcE1vZGlmaWVkKCk7CisKKyAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBBbm5vdC0+R2V0UGFnZVZpZXcoKTsKKyAgICAgIEFTU0VSVChwUGFnZVZpZXcpOworCisgICAgICBQREZTREtfRmllbGRBY3Rpb24gZmE7CisgICAgICBmYS5iTW9kaWZpZXIgPSBtX3BBcHAtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTsKKyAgICAgIGZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKKworICAgICAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgVFJVRSk7CisgICAgICBpZiAoIXBGb3JtRmlsbGVyKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBwRm9ybUZpbGxlci0+R2V0QWN0aW9uRGF0YShwUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6R2V0Rm9jdXMsIGZhKTsKKyAgICAgIHBXaWRnZXQtPk9uQUFjdGlvbihDUERGX0FBY3Rpb246OkdldEZvY3VzLCBmYSwgcFBhZ2VWaWV3KTsKKyAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOworCisgICAgICBpZiAocFdpZGdldC0+SXNBcHBNb2RpZmllZCgpKSB7CisgICAgICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBGQUxTRSkpIHsKKyAgICAgICAgICBwRm9ybUZpbGxlci0+UmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuVmFsdWVBZ2UgPT0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBUUlVFKSkKKyAgICBwRm9ybUZpbGxlci0+U2V0Rm9jdXNGb3JBbm5vdChwQW5ub3QsIG5GbGFnKTsKKworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTAlDRkZMX0lGb3JtRmlsbGVyOjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncykKLXsKLQlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCUFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CitGWF9CT09MIENGRkxfSUZvcm1GaWxsZXI6Ok9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuRmxhZykgeworICBpZiAoIXBBbm5vdCkKKyAgICByZXR1cm4gRkFMU0U7CisgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CiAKLQlpZiAobkNoYXIgPT0gRldMX1ZLRVlfVGFiKSByZXR1cm4gVFJVRTsKKyAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKSB7CisgICAgcEZvcm1GaWxsZXItPktpbGxGb2N1c0ZvckFubm90KHBBbm5vdCwgbkZsYWcpOwogCi0JaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQotCXsKLQkJcmV0dXJuIHBGb3JtRmlsbGVyLT5PbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKLQl9CisgICAgaWYgKCFtX2JOb3RpZnlpbmcpIHsKKyAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7CisgICAgICBpZiAocFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246Okxvc2VGb2N1cykpIHsKKyAgICAgICAgbV9iTm90aWZ5aW5nID0gVFJVRTsKKyAgICAgICAgcFdpZGdldC0+Q2xlYXJBcHBNb2RpZmllZCgpOwogCi0JcmV0dXJuIEZBTFNFOworICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwV2lkZ2V0LT5HZXRQYWdlVmlldygpOworICAgICAgICBBU1NFUlQocFBhZ2VWaWV3KTsKKworICAgICAgICBQREZTREtfRmllbGRBY3Rpb24gZmE7CisgICAgICAgIGZhLmJNb2RpZmllciA9IG1fcEFwcC0+RkZJX0lzQ1RSTEtleURvd24obkZsYWcpOworICAgICAgICBmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7CisKKyAgICAgICAgcEZvcm1GaWxsZXItPkdldEFjdGlvbkRhdGEocFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246Okxvc2VGb2N1cywgZmEpOworCisgICAgICAgIHBXaWRnZXQtPk9uQUFjdGlvbihDUERGX0FBY3Rpb246Okxvc2VGb2N1cywgZmEsIHBQYWdlVmlldyk7CisgICAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBUUlVFOwogfQogCi12b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uRGVTZWxlY3RlZChDUERGU0RLX0Fubm90KiBwQW5ub3QpCi17Ci0JQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQlBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOwotCi0JaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQotCXsKLQkJcEZvcm1GaWxsZXItPk9uRGVTZWxlY3RlZChwQW5ub3QpOwotCX0KK0ZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6SXNWaXNpYmxlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KSB7CisgIHJldHVybiBwV2lkZ2V0LT5Jc1Zpc2libGUoKTsKIH0KIAotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPblNlbGVjdGVkKENQREZTREtfQW5ub3QqIHBBbm5vdCkKLXsKLQlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCUFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7Ci0KLQlpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBGQUxTRSkpCi0JewotCQlwRm9ybUZpbGxlci0+T25TZWxlY3RlZChwQW5ub3QpOwotCX0KK0ZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6SXNSZWFkT25seShDUERGU0RLX1dpZGdldCogcFdpZGdldCkgeworICBpbnQgbkZpZWxkRmxhZ3MgPSBwV2lkZ2V0LT5HZXRGaWVsZEZsYWdzKCk7CisgIHJldHVybiAobkZpZWxkRmxhZ3MgJiBGSUVMREZMQUdfUkVBRE9OTFkpID09IEZJRUxERkxBR19SRUFET05MWTsKIH0KIAotRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCxGWF9VSU5UIG5GbGFnKQotewotCWlmKCFwQW5ub3QpIHJldHVybiBGQUxTRTsKLQlBU1NFUlQocEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpOworRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpJc0ZpbGxpbmdBbGxvd2VkKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KSB7CisgIGlmIChwV2lkZ2V0LT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKKyAgICByZXR1cm4gVFJVRTsKIAotCWlmICghbV9iTm90aWZ5aW5nKQotCXsKLQkJQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKLSAJCWlmIChwV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6R2V0Rm9jdXMpKQotIAkJewotICAJCQltX2JOb3RpZnlpbmcgPSBUUlVFOwotCQkJcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpOwotCQkJaW50IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7Ci0gCQkJcFdpZGdldC0+Q2xlYXJBcHBNb2RpZmllZCgpOwotIAotIAotIAkJCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBBbm5vdC0+R2V0UGFnZVZpZXcoKTsKLSAJCQlBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwotIAkJCQotIAkJCVBERlNES19GaWVsZEFjdGlvbiBmYTsKLQkJCWZhLmJNb2RpZmllciA9IG1fcEFwcC0+RkZJX0lzQ1RSTEtleURvd24obkZsYWcpOwotIAkJCWZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKLQotIAotIAkJCUNGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIFRSVUUpOwotIAkJCWlmKCFwRm9ybUZpbGxlcikgcmV0dXJuIEZBTFNFOwotIAkJCXBGb3JtRmlsbGVyLT5HZXRBY3Rpb25EYXRhKHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpHZXRGb2N1cywgZmEpOwotIAotIAkJCXBXaWRnZXQtPk9uQUFjdGlvbihDUERGX0FBY3Rpb246OkdldEZvY3VzLCBmYSwgcFBhZ2VWaWV3KTsKLSAJCQltX2JOb3RpZnlpbmcgPSBGQUxTRTsKLSAJCQkKLSAvLwkJCWlmICghSXNWYWxpZEFubm90KG1fcEFwcCwgcERvY3VtZW50LCBwRG9jVmlldywgcFBhZ2VWaWV3LCBwQW5ub3QpKSByZXR1cm4gRkFMU0U7Ci0gCi0gCQkJaWYgKHBXaWRnZXQtPklzQXBwTW9kaWZpZWQoKSkKLSAJCQl7Ci0gCQkJCWlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBGQUxTRSkpCi0gCQkJCXsKLSAJCQkJCXBGb3JtRmlsbGVyLT5SZXNldFBERldpbmRvdyhwUGFnZVZpZXcsIG5WYWx1ZUFnZSA9PSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpKTsKLSAJCQkJfQotIAkJCX0KLQkJfQotCX0KLQkKLQlpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBUUlVFKSkKLQl7Ci0JCWlmIChwRm9ybUZpbGxlci0+T25TZXRGb2N1cyhwQW5ub3QsIG5GbGFnKSkKLQkJewotCQkJcmV0dXJuIFRSVUU7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCXJldHVybiBUUlVFOworICBDUERGX1BhZ2UqIHBQYWdlID0gcFdpZGdldC0+R2V0UERGUGFnZSgpOworICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwUGFnZS0+bV9wRG9jdW1lbnQ7CisgIEZYX0RXT1JEIGR3UGVybWlzc2lvbnMgPSBwRG9jdW1lbnQtPkdldFVzZXJQZXJtaXNzaW9ucygpOworICByZXR1cm4gKGR3UGVybWlzc2lvbnMgJiBGUERGUEVSTV9GSUxMX0ZPUk0pIHx8CisgICAgICAgICAoZHdQZXJtaXNzaW9ucyAmIEZQREZQRVJNX0FOTk9UX0ZPUk0pIHx8CisgICAgICAgICAoZHdQZXJtaXNzaW9ucyAmIEZQREZQRVJNX01PRElGWSk7CiB9CiAKLUZYX0JPT0wJQ0ZGTF9JRm9ybUZpbGxlcjo6T25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LEZYX1VJTlQgbkZsYWcpCi17Ci0JaWYoIXBBbm5vdCkgcmV0dXJuIEZBTFNFOwotCUFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0Iik7CitDRkZMX0Zvcm1GaWxsZXIqIENGRkxfSUZvcm1GaWxsZXI6OkdldEZvcm1GaWxsZXIoQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlZ2lzdGVyKSB7CisgIGF1dG8gaXQgPSBtX01hcHMuZmluZChwQW5ub3QpOworICBpZiAoaXQgIT0gbV9NYXBzLmVuZCgpKQorICAgIHJldHVybiBpdC0+c2Vjb25kOwogCi0JaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgRkFMU0UpKQotCXsKLQkJaWYgKHBGb3JtRmlsbGVyLT5PbktpbGxGb2N1cyhwQW5ub3QsIG5GbGFnKSkKLQkJewotIAkJCWlmICghbV9iTm90aWZ5aW5nKQotIAkJCXsKLSAJCQkJQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKLSAJCQkJaWYgKHBXaWRnZXQtPkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpMb3NlRm9jdXMpKQotIAkJCQl7Ci0gCQkJCQltX2JOb3RpZnlpbmcgPSBUUlVFOwotIAkJCQkJcFdpZGdldC0+Q2xlYXJBcHBNb2RpZmllZCgpOwotIAotIAkJCQkJQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcFdpZGdldC0+R2V0UGFnZVZpZXcoKTsKLSAJCQkJCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Ci0gCi0gCQkJCQlQREZTREtfRmllbGRBY3Rpb24gZmE7Ci0JCQkJCWZhLmJNb2RpZmllciA9IG1fcEFwcC0+RkZJX0lzQ1RSTEtleURvd24obkZsYWcpOwotIAkJCQkJZmEuYlNoaWZ0ID0gbV9wQXBwLT5GRklfSXNTSElGVEtleURvd24obkZsYWcpOwotIAotIAkJCQkJcEZvcm1GaWxsZXItPkdldEFjdGlvbkRhdGEocFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246Okxvc2VGb2N1cywgZmEpOwotIAotIAkJCQkJcFdpZGdldC0+T25BQWN0aW9uKENQREZfQUFjdGlvbjo6TG9zZUZvY3VzLCBmYSwgcFBhZ2VWaWV3KTsKLSAJCQkJCW1fYk5vdGlmeWluZyA9IEZBTFNFOwotIAotIAkJCQl9Ci0gCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBGQUxTRTsKLQl9CisgIGlmICghYlJlZ2lzdGVyKQorICAgIHJldHVybiBudWxscHRyOwogCi0JcmV0dXJuIFRSVUU7CisgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7CisgIGludCBuRmllbGRUeXBlID0gcFdpZGdldC0+R2V0RmllbGRUeXBlKCk7CisgIENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXI7CisgIHN3aXRjaCAobkZpZWxkVHlwZSkgeworICAgIGNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046CisgICAgICBwRm9ybUZpbGxlciA9IG5ldyBDRkZMX1B1c2hCdXR0b24obV9wQXBwLCBwV2lkZ2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgorICAgICAgcEZvcm1GaWxsZXIgPSBuZXcgQ0ZGTF9DaGVja0JveChtX3BBcHAsIHBXaWRnZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046CisgICAgICBwRm9ybUZpbGxlciA9IG5ldyBDRkZMX1JhZGlvQnV0dG9uKG1fcEFwcCwgcFdpZGdldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZJRUxEVFlQRV9URVhURklFTEQ6CisgICAgICBwRm9ybUZpbGxlciA9IG5ldyBDRkZMX1RleHRGaWVsZChtX3BBcHAsIHBXaWRnZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGSUVMRFRZUEVfTElTVEJPWDoKKyAgICAgIHBGb3JtRmlsbGVyID0gbmV3IENGRkxfTGlzdEJveChtX3BBcHAsIHBXaWRnZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6CisgICAgICBwRm9ybUZpbGxlciA9IG5ldyBDRkZMX0NvbWJvQm94KG1fcEFwcCwgcFdpZGdldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZJRUxEVFlQRV9VTktOT1dOOgorICAgIGRlZmF1bHQ6CisgICAgICBwRm9ybUZpbGxlciA9IG51bGxwdHI7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmICghcEZvcm1GaWxsZXIpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgbV9NYXBzW3BBbm5vdF0gPSBwRm9ybUZpbGxlcjsKKyAgcmV0dXJuIHBGb3JtRmlsbGVyOwogfQogCi1GWF9CT09MCUNGRkxfSUZvcm1GaWxsZXI6OklzVmlzaWJsZShDUERGU0RLX1dpZGdldCogcFdpZGdldCkKLXsKLQlyZXR1cm4gcFdpZGdldC0+SXNWaXNpYmxlKCk7Cit2b2lkIENGRkxfSUZvcm1GaWxsZXI6OlJlbW92ZUZvcm1GaWxsZXIoQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIGlmIChwQW5ub3QpIHsKKyAgICBVblJlZ2lzdGVyRm9ybUZpbGxlcihwQW5ub3QpOworICB9CiB9CiAKLUZYX0JPT0wJQ0ZGTF9JRm9ybUZpbGxlcjo6SXNSZWFkT25seShDUERGU0RLX1dpZGdldCogcFdpZGdldCkKLXsKLQlBU1NFUlQocFdpZGdldCAhPSBOVUxMKTsKK3ZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6VW5SZWdpc3RlckZvcm1GaWxsZXIoQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIGF1dG8gaXQgPSBtX01hcHMuZmluZChwQW5ub3QpOworICBpZiAoaXQgPT0gbV9NYXBzLmVuZCgpKQorICAgIHJldHVybjsKIAotCWludCBuRmllbGRGbGFncyA9IHBXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKTsKLQotCXJldHVybiAobkZpZWxkRmxhZ3MgJiBGSUVMREZMQUdfUkVBRE9OTFkpID09IEZJRUxERkxBR19SRUFET05MWTsKKyAgZGVsZXRlIGl0LT5zZWNvbmQ7CisgIG1fTWFwcy5lcmFzZShpdCk7CiB9CiAKLUZYX0JPT0wJQ0ZGTF9JRm9ybUZpbGxlcjo6SXNGaWxsaW5nQWxsb3dlZChDUERGU0RLX1dpZGdldCogcFdpZGdldCkKLXsKLQlBU1NFUlQocFdpZGdldCAhPSBOVUxMKTsKK3ZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6UXVlcnlXaGVyZVBvcHVwKHZvaWQqIHBQcml2YXRlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQb3B1cE1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQb3B1cE1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5SZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZlBvcHVwUmV0KSB7CisgIENGRkxfUHJpdmF0ZURhdGEqIHBEYXRhID0gKENGRkxfUHJpdmF0ZURhdGEqKXBQcml2YXRlRGF0YTsKIAotCWlmIChwV2lkZ2V0LT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLQkJcmV0dXJuIFRSVUU7Ci0gCWVsc2UKLSAJewotIAkJQ1BERl9QYWdlKiBwUGFnZSA9IHBXaWRnZXQtPkdldFBERlBhZ2UoKTsKLSAJCUFTU0VSVChwUGFnZSAhPSBOVUxMKTsKLSAKLSAJCUNQREZfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBQYWdlLT5tX3BEb2N1bWVudDsKLSAJCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7Ci0gCi0JCUZYX0RXT1JEIGR3UGVybWlzc2lvbnMgPSBwRG9jdW1lbnQtPkdldFVzZXJQZXJtaXNzaW9ucygpOwotIAkJcmV0dXJuIChkd1Blcm1pc3Npb25zJkZQREZQRVJNX0ZJTExfRk9STSkgfHwgCi0gCQkJCShkd1Blcm1pc3Npb25zJkZQREZQRVJNX0FOTk9UX0ZPUk0pIHx8IAotIAkJCShkd1Blcm1pc3Npb25zJkZQREZQRVJNX01PRElGWSk7Ci0gCX0KLQlyZXR1cm4gVFJVRTsJCisgIENQREZfUmVjdCByY1BhZ2VWaWV3KDAsIDAsIDAsIDApOworICByY1BhZ2VWaWV3LnJpZ2h0ID0gcERhdGEtPnBXaWRnZXQtPkdldFBERlBhZ2UoKS0+R2V0UGFnZVdpZHRoKCk7CisgIHJjUGFnZVZpZXcuYm90dG9tID0gcERhdGEtPnBXaWRnZXQtPkdldFBERlBhZ2UoKS0+R2V0UGFnZUhlaWdodCgpOworICByY1BhZ2VWaWV3Lk5vcm1hbGl6ZSgpOworCisgIENQREZfUmVjdCByY0Fubm90ID0gcERhdGEtPnBXaWRnZXQtPkdldFJlY3QoKTsKKworICBGWF9GTE9BVCBmVG9wID0gMC4wZjsKKyAgRlhfRkxPQVQgZkJvdHRvbSA9IDAuMGY7CisKKyAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBEYXRhLT5wV2lkZ2V0OworICBzd2l0Y2ggKHBXaWRnZXQtPkdldFJvdGF0ZSgpIC8gOTApIHsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgMDoKKyAgICAgIGZUb3AgPSByY1BhZ2VWaWV3LnRvcCAtIHJjQW5ub3QudG9wOworICAgICAgZkJvdHRvbSA9IHJjQW5ub3QuYm90dG9tIC0gcmNQYWdlVmlldy5ib3R0b207CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBmVG9wID0gcmNBbm5vdC5sZWZ0IC0gcmNQYWdlVmlldy5sZWZ0OworICAgICAgZkJvdHRvbSA9IHJjUGFnZVZpZXcucmlnaHQgLSByY0Fubm90LnJpZ2h0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgZlRvcCA9IHJjQW5ub3QuYm90dG9tIC0gcmNQYWdlVmlldy5ib3R0b207CisgICAgICBmQm90dG9tID0gcmNQYWdlVmlldy50b3AgLSByY0Fubm90LnRvcDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIGZUb3AgPSByY1BhZ2VWaWV3LnJpZ2h0IC0gcmNBbm5vdC5yaWdodDsKKyAgICAgIGZCb3R0b20gPSByY0Fubm90LmxlZnQgLSByY1BhZ2VWaWV3LmxlZnQ7CisgICAgICBicmVhazsKKyAgfQorCisgIEZYX0ZMT0FUIGZGYWN0SGVpZ2h0ID0gMDsKKyAgRlhfQk9PTCBiQm90dG9tID0gVFJVRTsKKyAgRlhfRkxPQVQgZk1heExpc3RCb3hIZWlnaHQgPSAwOworICBpZiAoZlBvcHVwTWF4ID4gRkZMX01BWExJU1RCT1hIRUlHSFQpIHsKKyAgICBpZiAoZlBvcHVwTWluID4gRkZMX01BWExJU1RCT1hIRUlHSFQpIHsKKyAgICAgIGZNYXhMaXN0Qm94SGVpZ2h0ID0gZlBvcHVwTWluOworICAgIH0gZWxzZSB7CisgICAgICBmTWF4TGlzdEJveEhlaWdodCA9IEZGTF9NQVhMSVNUQk9YSEVJR0hUOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmTWF4TGlzdEJveEhlaWdodCA9IGZQb3B1cE1heDsKKyAgfQorCisgIGlmIChmQm90dG9tID4gZk1heExpc3RCb3hIZWlnaHQpIHsKKyAgICBmRmFjdEhlaWdodCA9IGZNYXhMaXN0Qm94SGVpZ2h0OworICAgIGJCb3R0b20gPSBUUlVFOworICB9IGVsc2UgeworICAgIGlmIChmVG9wID4gZk1heExpc3RCb3hIZWlnaHQpIHsKKyAgICAgIGZGYWN0SGVpZ2h0ID0gZk1heExpc3RCb3hIZWlnaHQ7CisgICAgICBiQm90dG9tID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChmVG9wID4gZkJvdHRvbSkgeworICAgICAgICBmRmFjdEhlaWdodCA9IGZUb3A7CisgICAgICAgIGJCb3R0b20gPSBGQUxTRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZGYWN0SGVpZ2h0ID0gZkJvdHRvbTsKKyAgICAgICAgYkJvdHRvbSA9IFRSVUU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgblJldCA9IGJCb3R0b20gPyAwIDogMTsKKyAgZlBvcHVwUmV0ID0gZkZhY3RIZWlnaHQ7CiB9CiAKLUNGRkxfRm9ybUZpbGxlciogQ0ZGTF9JRm9ybUZpbGxlcjo6R2V0Rm9ybUZpbGxlcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0JPT0wgYlJlZ2lzdGVyKQotewotLy8gCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0vLyAJQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3ViVHlwZSgpID09ICJXaWRnZXQiKTsKK3ZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25LZXlTdHJva2VDb21taXQoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIHsKKyAgaWYgKCFtX2JOb3RpZnlpbmcpIHsKKyAgICBpZiAocFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OktleVN0cm9rZSkpIHsKKyAgICAgIG1fYk5vdGlmeWluZyA9IFRSVUU7CisgICAgICBwV2lkZ2V0LT5DbGVhckFwcE1vZGlmaWVkKCk7CiAKLQlDRkZMX0Zvcm1GaWxsZXIgKiBwRm9ybUZpbGxlciA9IE5VTEw7Ci0JbV9NYXBzLkxvb2t1cChwQW5ub3QsIHBGb3JtRmlsbGVyKTsKKyAgICAgIEFTU0VSVChwUGFnZVZpZXcpOwogCi0JaWYgKHBGb3JtRmlsbGVyKQotCQlyZXR1cm4gcEZvcm1GaWxsZXI7CisgICAgICBQREZTREtfRmllbGRBY3Rpb24gZmE7CisgICAgICBmYS5iTW9kaWZpZXIgPSBtX3BBcHAtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTsKKyAgICAgIGZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKKyAgICAgIGZhLmJXaWxsQ29tbWl0ID0gVFJVRTsKKyAgICAgIGZhLmJLZXlEb3duID0gVFJVRTsKKyAgICAgIGZhLmJSQyA9IFRSVUU7CiAKLQlpZiAoYlJlZ2lzdGVyKQotCXsKLQkJQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsJCQorICAgICAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgRkFMU0UpOworICAgICAgcEZvcm1GaWxsZXItPkdldEFjdGlvbkRhdGEocFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OktleVN0cm9rZSwgZmEpOworICAgICAgcEZvcm1GaWxsZXItPlNhdmVTdGF0ZShwUGFnZVZpZXcpOwogCi0JCWludCBuRmllbGRUeXBlID0gcFdpZGdldC0+R2V0RmllbGRUeXBlKCk7Ci0JCXN3aXRjaChuRmllbGRUeXBlKQotCQl7Ci0gCQljYXNlIEZJRUxEVFlQRV9QVVNIQlVUVE9OOgotIAkJCXBGb3JtRmlsbGVyID0gbmV3IENGRkxfUHVzaEJ1dHRvbihtX3BBcHAsIHBXaWRnZXQpOwotIAkJCWJyZWFrOwotCQljYXNlIEZJRUxEVFlQRV9DSEVDS0JPWDoKLQkJCXBGb3JtRmlsbGVyID0gbmV3IENGRkxfQ2hlY2tCb3gobV9wQXBwLCBwV2lkZ2V0KTsKLQkJCWJyZWFrOwotIAkJY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046Ci0gCQkJcEZvcm1GaWxsZXIgPSBuZXcgQ0ZGTF9SYWRpb0J1dHRvbihtX3BBcHAsIHBXaWRnZXQpOwotIAkJCWJyZWFrOwotIAkJY2FzZSBGSUVMRFRZUEVfVEVYVEZJRUxEOgotCQkJcEZvcm1GaWxsZXIgPSBuZXcgQ0ZGTF9UZXh0RmllbGQobV9wQXBwLCBwV2lkZ2V0KTsKLQkJCWJyZWFrOwotCQljYXNlIEZJRUxEVFlQRV9MSVNUQk9YOgotCQkJcEZvcm1GaWxsZXIgPSBuZXcgQ0ZGTF9MaXN0Qm94KG1fcEFwcCwgcFdpZGdldCk7Ci0JCQlicmVhazsKLQkJY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6Ci0JCQlwRm9ybUZpbGxlciA9IG5ldyBDRkZMX0NvbWJvQm94KG1fcEFwcCwgcFdpZGdldCk7Ci0JCQlicmVhazsKLQkJY2FzZSBGSUVMRFRZUEVfVU5LTk9XTjoKLQkJZGVmYXVsdDoKLQkJCXBGb3JtRmlsbGVyID0gTlVMTDsKLQkJCWJyZWFrOwotCQl9CisgICAgICBQREZTREtfRmllbGRBY3Rpb24gZmFPbGQgPSBmYTsKKyAgICAgIHBXaWRnZXQtPk9uQUFjdGlvbihDUERGX0FBY3Rpb246OktleVN0cm9rZSwgZmEsIHBQYWdlVmlldyk7CiAKLQkJaWYgKHBGb3JtRmlsbGVyKQotCQl7Ci0JCQltX01hcHMuU2V0QXQocEFubm90LCBwRm9ybUZpbGxlcik7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcEZvcm1GaWxsZXI7CisgICAgICBiUkMgPSBmYS5iUkM7CisgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKKyAgICB9CisgIH0KIH0KIAotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpSZW1vdmVGb3JtRmlsbGVyKENQREZTREtfQW5ub3QqIHBBbm5vdCkKLXsKLQlpZiAoIHBBbm5vdCAhPSBOVUxMICkKLQl7Ci0JCVVuUmVnaXN0ZXJGb3JtRmlsbGVyKCBwQW5ub3QgKTsKLQl9Cit2b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uVmFsaWRhdGUoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgeworICBpZiAoIW1fYk5vdGlmeWluZykgeworICAgIGlmIChwV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6VmFsaWRhdGUpKSB7CisgICAgICBtX2JOb3RpZnlpbmcgPSBUUlVFOworICAgICAgcFdpZGdldC0+Q2xlYXJBcHBNb2RpZmllZCgpOworCisgICAgICBBU1NFUlQocFBhZ2VWaWV3KTsKKworICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOworICAgICAgZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7CisgICAgICBmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7CisgICAgICBmYS5iS2V5RG93biA9IFRSVUU7CisgICAgICBmYS5iUkMgPSBUUlVFOworCisgICAgICBDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBGQUxTRSk7CisgICAgICBwRm9ybUZpbGxlci0+R2V0QWN0aW9uRGF0YShwUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6VmFsaWRhdGUsIGZhKTsKKyAgICAgIHBGb3JtRmlsbGVyLT5TYXZlU3RhdGUocFBhZ2VWaWV3KTsKKworICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhT2xkID0gZmE7CisgICAgICBwV2lkZ2V0LT5PbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZSwgZmEsIHBQYWdlVmlldyk7CisKKyAgICAgIGJSQyA9IGZhLmJSQzsKKyAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOworICAgIH0KKyAgfQogfQogCi12b2lkIENGRkxfSUZvcm1GaWxsZXI6OlVuUmVnaXN0ZXJGb3JtRmlsbGVyKENQREZTREtfQW5ub3QqIHBBbm5vdCkKLXsKLQlDRkZMX0Zvcm1GaWxsZXIgKiBwRm9ybUZpbGxlciA9IE5VTEw7Cit2b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uQ2FsY3VsYXRlKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgeworICBpZiAoIW1fYk5vdGlmeWluZykgeworICAgIEFTU0VSVChwV2lkZ2V0KTsKKyAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwUGFnZVZpZXctPkdldFNES0RvY3VtZW50KCk7CisgICAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPQorICAgICAgICAoQ1BERlNES19JbnRlckZvcm0qKXBEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CisgICAgcEludGVyRm9ybS0+T25DYWxjdWxhdGUocFdpZGdldC0+R2V0Rm9ybUZpZWxkKCkpOwogCi0JaWYgKG1fTWFwcy5Mb29rdXAocEFubm90LHBGb3JtRmlsbGVyKSkKLQl7Ci0JCWlmIChwRm9ybUZpbGxlcikKLQkJCWRlbGV0ZSBwRm9ybUZpbGxlcjsKLQkJbV9NYXBzLlJlbW92ZUtleShwQW5ub3QpOwotCX0KKyAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKKyAgfQogfQogCi12b2lkIENGRkxfSUZvcm1GaWxsZXI6OlNldEZvY3VzQW5ub3RUYWIoQ1BERlNES19Bbm5vdCogcFdpZGdldCwgRlhfQk9PTCBiU2FtZUZpZWxkLCBGWF9CT09MIGJOZXh0KQotewordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkZvcm1hdChDUERGU0RLX1dpZGdldCogcFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIHsKKyAgaWYgKCFtX2JOb3RpZnlpbmcpIHsKKyAgICBBU1NFUlQocFdpZGdldCk7CisgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50ID0gcFBhZ2VWaWV3LT5HZXRTREtEb2N1bWVudCgpOworICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0KKyAgICAgICAgKENQREZTREtfSW50ZXJGb3JtKilwRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwogCisgICAgRlhfQk9PTCBiRm9ybWF0ZWQgPSBGQUxTRTsKKyAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWUgPQorICAgICAgICBwSW50ZXJGb3JtLT5PbkZvcm1hdChwV2lkZ2V0LT5HZXRGb3JtRmllbGQoKSwgYkZvcm1hdGVkKTsKKworICAgIGlmIChiRXhpdCkKKyAgICAgIHJldHVybjsKKworICAgIGlmIChiRm9ybWF0ZWQpIHsKKyAgICAgIHBJbnRlckZvcm0tPlJlc2V0RmllbGRBcHBlYXJhbmNlKHBXaWRnZXQtPkdldEZvcm1GaWVsZCgpLCBzVmFsdWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpOworICAgICAgcEludGVyRm9ybS0+VXBkYXRlRmllbGQocFdpZGdldC0+R2V0Rm9ybUZpZWxkKCkpOworICAgIH0KKworICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOworICB9CiB9CiAKLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6UXVlcnlXaGVyZVBvcHVwKHZvaWQqIHBQcml2YXRlRGF0YSwgRlhfRkxPQVQgZlBvcHVwTWluLEZYX0ZMT0FUIGZQb3B1cE1heCwgRlhfSU5UMzIgJiBuUmV0LCBGWF9GTE9BVCAmIGZQb3B1cFJldCkKLXsKLQlBU1NFUlQocFByaXZhdGVEYXRhICE9IE5VTEwpOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCit2b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uQ2xpY2soQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSZXNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFnKSB7CisgIEFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOwogCi0JQ0ZGTF9Qcml2YXRlRGF0YSogcERhdGEgPSAoQ0ZGTF9Qcml2YXRlRGF0YSopcFByaXZhdGVEYXRhOworICBpZiAoIW1fYk5vdGlmeWluZykgeworICAgIGlmIChwV2lkZ2V0LT5IYXNYRkFBQWN0aW9uKFBERlNES19YRkFfQ2xpY2spKSB7CisgICAgICBtX2JOb3RpZnlpbmcgPSBUUlVFOworICAgICAgaW50IG5BZ2UgPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCk7CisgICAgICBpbnQgblZhbHVlQWdlID0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKTsKIAotCQorICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOworICAgICAgZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7CisgICAgICBmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7CiAKKyAgICAgIHBXaWRnZXQtPk9uWEZBQUFjdGlvbihQREZTREtfWEZBX0NsaWNrLCBmYSwgcFBhZ2VWaWV3KTsKKyAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOwogCi0JQ1BERl9SZWN0IHJjUGFnZVZpZXcoMCwwLDAsMCk7Ci0JcmNQYWdlVmlldy5yaWdodCA9IHBEYXRhLT5wV2lkZ2V0LT5HZXRQREZQYWdlKCktPkdldFBhZ2VXaWR0aCgpOwotCXJjUGFnZVZpZXcuYm90dG9tID0gcERhdGEtPnBXaWRnZXQtPkdldFBERlBhZ2UoKS0+R2V0UGFnZUhlaWdodCgpOwotCXJjUGFnZVZpZXcuTm9ybWFsaXplKCk7CisgICAgICBpZiAoIUlzVmFsaWRBbm5vdChwUGFnZVZpZXcsIHBXaWRnZXQpKSB7CisgICAgICAgIGJFeGl0ID0gVFJVRTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQogCisgICAgICBpZiAobkFnZSAhPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCkpIHsKKyAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIEZBTFNFKSkgeworICAgICAgICAgIHBGb3JtRmlsbGVyLT5SZXNldFBERldpbmRvdyhwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5WYWx1ZUFnZSA9PSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpKTsKKyAgICAgICAgfQogCi0JQVNTRVJUKHBEYXRhLT5wV2lkZ2V0ICE9IE5VTEwpOwotCUNQREZfUmVjdCByY0Fubm90ID0gcERhdGEtPnBXaWRnZXQtPkdldFJlY3QoKTsKLQotCUZYX0ZMT0FUIGZUb3AgPSAwLjBmOwotCUZYX0ZMT0FUIGZCb3R0b20gPSAwLjBmOwotCi0JQ1BERlNES19XaWRnZXQgKiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwRGF0YS0+cFdpZGdldDsKLQlzd2l0Y2ggKHBXaWRnZXQtPkdldFJvdGF0ZSgpIC8gOTApCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSAwOgotCQlmVG9wID0gcmNQYWdlVmlldy50b3AgLSByY0Fubm90LnRvcDsKLQkJZkJvdHRvbSA9IHJjQW5ub3QuYm90dG9tIC0gcmNQYWdlVmlldy5ib3R0b207Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJZlRvcCA9IHJjQW5ub3QubGVmdCAtIHJjUGFnZVZpZXcubGVmdDsKLQkJZkJvdHRvbSA9IHJjUGFnZVZpZXcucmlnaHQgLSByY0Fubm90LnJpZ2h0OwotCQlicmVhazsKLQljYXNlIDI6Ci0JCWZUb3AgPSByY0Fubm90LmJvdHRvbSAtIHJjUGFnZVZpZXcuYm90dG9tOwotCQlmQm90dG9tID0gcmNQYWdlVmlldy50b3AgLSByY0Fubm90LnRvcDsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlmVG9wID0gcmNQYWdlVmlldy5yaWdodCAtIHJjQW5ub3QucmlnaHQ7Ci0JCWZCb3R0b20gPSByY0Fubm90LmxlZnQgLSByY1BhZ2VWaWV3LmxlZnQ7Ci0JCWJyZWFrOwotCX0KLQotCUZYX0ZMT0FUIGZGYWN0SGVpZ2h0ID0gMDsKLQlGWF9CT09MIGJCb3R0b20gPSBUUlVFOwotCUZYX0ZMT0FUIGZNYXhMaXN0Qm94SGVpZ2h0ID0gMDsKLQlpZiAoZlBvcHVwTWF4ID4gRkZMX01BWExJU1RCT1hIRUlHSFQpCi0JewotCQlpZiAoZlBvcHVwTWluID4gRkZMX01BWExJU1RCT1hIRUlHSFQpCi0JCXsKLQkJCWZNYXhMaXN0Qm94SGVpZ2h0ID0gZlBvcHVwTWluOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJZk1heExpc3RCb3hIZWlnaHQgPSBGRkxfTUFYTElTVEJPWEhFSUdIVDsKLQkJfQotCX0KLQllbHNlCi0JCWZNYXhMaXN0Qm94SGVpZ2h0ID0gZlBvcHVwTWF4OwotCi0JaWYgKGZCb3R0b20gPiBmTWF4TGlzdEJveEhlaWdodCkKLQl7Ci0JCWZGYWN0SGVpZ2h0ID0gZk1heExpc3RCb3hIZWlnaHQ7Ci0JCWJCb3R0b20gPSBUUlVFOwotCX0KLQllbHNlCi0JewotCQlpZiAoZlRvcCA+IGZNYXhMaXN0Qm94SGVpZ2h0KQotCQl7Ci0JCQlmRmFjdEhlaWdodCA9IGZNYXhMaXN0Qm94SGVpZ2h0OwotCQkJYkJvdHRvbSA9IEZBTFNFOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKGZUb3AgPiBmQm90dG9tKQotCQkJewotCQkJCWZGYWN0SGVpZ2h0ID0gZlRvcDsKLQkJCQliQm90dG9tID0gRkFMU0U7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJZkZhY3RIZWlnaHQgPSBmQm90dG9tOwotCQkJCWJCb3R0b20gPSBUUlVFOwotCQkJfQotCQl9Ci0JfQotCi0JblJldCA9IGJCb3R0b20gPyAwIDogMTsKLQlmUG9wdXBSZXQgPSBmRmFjdEhlaWdodDsKKyAgICAgICAgYlJlc2V0ID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgIH0KIH0KIAotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPblNldFdpbmRvd1JlY3Qodm9pZCogcFByaXZhdGVEYXRhLCBjb25zdCBDUERGX1JlY3QgJiByY1dpbmRvdykKLXsKLQlBU1NFUlQocFByaXZhdGVEYXRhICE9IE5VTEwpOwordm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkZ1bGwoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUmVzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWcpIHsKKyAgQVNTRVJUKHBXaWRnZXQgIT0gTlVMTCk7CiAKLQlDRkZMX1ByaXZhdGVEYXRhKiBwRGF0YSA9IChDRkZMX1ByaXZhdGVEYXRhKilwUHJpdmF0ZURhdGE7CisgIGlmICghbV9iTm90aWZ5aW5nKSB7CisgICAgaWYgKHBXaWRnZXQtPkhhc1hGQUFBY3Rpb24oUERGU0RLX1hGQV9GdWxsKSkgeworICAgICAgbV9iTm90aWZ5aW5nID0gVFJVRTsKKyAgICAgIGludCBuQWdlID0gcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpOworICAgICAgaW50IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7CiAKLQlpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocERhdGEtPnBXaWRnZXQsIFRSVUUpKQotCXsKKyAgICAgIFBERlNES19GaWVsZEFjdGlvbiBmYTsKKyAgICAgIGZhLmJNb2RpZmllciA9IG1fcEFwcC0+RkZJX0lzQ1RSTEtleURvd24obkZsYWcpOworICAgICAgZmEuYlNoaWZ0ID0gbV9wQXBwLT5GRklfSXNTSElGVEtleURvd24obkZsYWcpOwogCi0JCUNQREZfUmVjdCByY09sZCA9IHBGb3JtRmlsbGVyLT5QV0x0b0ZGTChwRm9ybUZpbGxlci0+R2V0V2luZG93UmVjdChwRGF0YS0+cFBhZ2VWaWV3KSk7Ci0JCUNQREZfUmVjdCByY05ldyA9IHBGb3JtRmlsbGVyLT5QV0x0b0ZGTChyY1dpbmRvdyk7Ci0JCXBGb3JtRmlsbGVyLT5TZXRXaW5kb3dSZWN0KHBEYXRhLT5wUGFnZVZpZXcsIHJjV2luZG93KTsKKyAgICAgIHBXaWRnZXQtPk9uWEZBQUFjdGlvbihQREZTREtfWEZBX0Z1bGwsIGZhLCBwUGFnZVZpZXcpOworICAgICAgbV9iTm90aWZ5aW5nID0gRkFMU0U7CiAKLQkJQ1BERl9SZWN0IHVuUmVjdCA9IHJjT2xkOwotCQl1blJlY3QuVW5pb24ocmNOZXcpOwotCQkvL0ZYX1JFQ1QgcmNSZWN0ID0gdW5SZWN0LkdldE91dHRlclJlY3QoKTsKLQkJdW5SZWN0LmxlZnQgPSAoRlhfRkxPQVQpKHVuUmVjdC5sZWZ0IC0gMC41KTsKLQkJdW5SZWN0LnJpZ2h0ID0gKEZYX0ZMT0FUKSh1blJlY3QucmlnaHQgKyAwLjUpOwotCQl1blJlY3QudG9wID0gKEZYX0ZMT0FUKSh1blJlY3QudG9wICsgMC41KTsKLQkJdW5SZWN0LmJvdHRvbSA9IChGWF9GTE9BVCkodW5SZWN0LmJvdHRvbSAtMC41KTsKLQkJbV9wQXBwLT5GRklfSW52YWxpZGF0ZShwRGF0YS0+cFdpZGdldC0+R2V0UERGUGFnZSgpLCB1blJlY3QubGVmdCwgdW5SZWN0LnRvcCwgdW5SZWN0LnJpZ2h0LCB1blJlY3QuYm90dG9tKTsKLQl9CisgICAgICBpZiAoIUlzVmFsaWRBbm5vdChwUGFnZVZpZXcsIHBXaWRnZXQpKSB7CisgICAgICAgIGJFeGl0ID0gVFJVRTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAobkFnZSAhPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCkpIHsKKyAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIEZBTFNFKSkgeworICAgICAgICAgIHBGb3JtRmlsbGVyLT5SZXNldFBERldpbmRvdyhwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5WYWx1ZUFnZSA9PSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGJSZXNldCA9IFRSVUU7CisgICAgICB9CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25LZXlTdHJva2UoRlhfQk9PTCBiRWRpdE9yTGlzdCwgdm9pZCogcFByaXZhdGVEYXRhLCBGWF9JTlQzMiBuS2V5Q29kZSwgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwgCi0JCQkJCQkJCSAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwgRlhfQk9PTCBiS2V5RG93biwgCi0JCQkJCQkJCSAgIEZYX0JPT0wgJiBiUkMsIEZYX0JPT0wgJiBiRXhpdCkKLXsKLQlBU1NFUlQocFByaXZhdGVEYXRhICE9IE5VTEwpOwotCUNGRkxfUHJpdmF0ZURhdGEqIHBEYXRhID0gKENGRkxfUHJpdmF0ZURhdGEqKXBQcml2YXRlRGF0YTsKLQlBU1NFUlQocERhdGEtPnBXaWRnZXQgIT0gTlVMTCk7Cit2b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uUG9wdXBQcmVPcGVuKHZvaWQqIHBQcml2YXRlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkV4aXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSB7CisgIEFTU0VSVChwUHJpdmF0ZURhdGEgIT0gTlVMTCk7CisgIENGRkxfUHJpdmF0ZURhdGEqIHBEYXRhID0gKENGRkxfUHJpdmF0ZURhdGEqKXBQcml2YXRlRGF0YTsKKyAgQVNTRVJUKHBEYXRhLT5wV2lkZ2V0ICE9IE5VTEwpOwogCi0JQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocERhdGEtPnBXaWRnZXQsIEZBTFNFKTsKLQlBU1NFUlQocEZvcm1GaWxsZXIgIT0gTlVMTCk7CisgIEZYX0JPT0wgYlRlbXBSZXNldCA9IEZBTFNFOworICBGWF9CT09MIGJUZW1wRXhpdCA9IEZBTFNFOworICB0aGlzLT5PblByZU9wZW4ocERhdGEtPnBXaWRnZXQsIHBEYXRhLT5wUGFnZVZpZXcsIGJUZW1wUmVzZXQsIGJUZW1wRXhpdCwKKyAgICAgICAgICAgICAgICAgIG5GbGFnKTsKIAotCXBGb3JtRmlsbGVyLT5PbktleVN0cm9rZShiS2V5RG93bik7CisgIGlmIChiVGVtcFJlc2V0IHx8IGJUZW1wRXhpdCkgeworICAgIGJFeGl0ID0gVFJVRTsKKyAgfQogfQogCi12b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uS2V5U3Ryb2tlQ29tbWl0KENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wmIGJSQywgRlhfQk9PTCYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKQotewotCWlmICghbV9iTm90aWZ5aW5nKQotCXsKLQkJQVNTRVJUKHBXaWRnZXQgIT0gTlVMTCk7Ci0JCWlmIChwV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlKSkKLQkJewotCQkJbV9iTm90aWZ5aW5nID0gVFJVRTsKLQkJCXBXaWRnZXQtPkNsZWFyQXBwTW9kaWZpZWQoKTsKK3ZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25Qb3B1cFBvc3RPcGVuKHZvaWQqIHBQcml2YXRlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIHsKKyAgQVNTRVJUKHBQcml2YXRlRGF0YSAhPSBOVUxMKTsKKyAgQ0ZGTF9Qcml2YXRlRGF0YSogcERhdGEgPSAoQ0ZGTF9Qcml2YXRlRGF0YSopcFByaXZhdGVEYXRhOworICBBU1NFUlQocERhdGEtPnBXaWRnZXQgIT0gTlVMTCk7CiAKLQkJCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Ci0vLyAJCQlDUmVhZGVyX0RvY1ZpZXcqIHBEb2NWaWV3ID0gcFBhZ2VWaWV3LT5HZXREb2NWaWV3KCk7Ci0vLyAJCQlBU1NFUlQocERvY1ZpZXcgIT0gTlVMTCk7Ci0JCQkKLQkJCisgIEZYX0JPT0wgYlRlbXBSZXNldCA9IEZBTFNFOworICBGWF9CT09MIGJUZW1wRXhpdCA9IEZBTFNFOworICB0aGlzLT5PblBvc3RPcGVuKHBEYXRhLT5wV2lkZ2V0LCBwRGF0YS0+cFBhZ2VWaWV3LCBiVGVtcFJlc2V0LCBiVGVtcEV4aXQsCisgICAgICAgICAgICAgICAgICAgbkZsYWcpOwogCi0JCQlQREZTREtfRmllbGRBY3Rpb24gZmE7Ci0JCQlmYS5iTW9kaWZpZXIgPSBtX3BBcHAtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTsKLSAJCQlmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7Ci0JCQlmYS5iV2lsbENvbW1pdCA9IFRSVUU7Ci0JCQlmYS5uQ29tbWl0S2V5ID0gR2V0Q29tbWl0S2V5KCk7Ci0JCQlmYS5iS2V5RG93biA9IEdldEtleURvd24oKTsKLQkJCWZhLmJSQyA9IFRSVUU7Ci0KLQkJCUNGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIEZBTFNFKTsKLQkJCUFTU0VSVChwRm9ybUZpbGxlciAhPSBOVUxMKTsKLQotCQkJcEZvcm1GaWxsZXItPkdldEFjdGlvbkRhdGEocFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OktleVN0cm9rZSwgZmEpOwotCQkJcEZvcm1GaWxsZXItPlNhdmVTdGF0ZShwUGFnZVZpZXcpOwotCi0JCQlQREZTREtfRmllbGRBY3Rpb24gZmFPbGQgPSBmYTsKLQkJCXBXaWRnZXQtPk9uQUFjdGlvbihDUERGX0FBY3Rpb246OktleVN0cm9rZSwgZmEsIHBQYWdlVmlldyk7Ci0KLQkJCWJSQyA9IGZhLmJSQzsKLS8vCQkJYkV4aXQgPSAhSXNWYWxpZEFubm90KG1fcEFwcCwgcERvY3VtZW50LCBwRG9jVmlldywgcFBhZ2VWaWV3LCBwV2lkZ2V0KTsKLQotCQkJbV9iTm90aWZ5aW5nID0gRkFMU0U7Ci0JCX0KLQl9CisgIGlmIChiVGVtcFJlc2V0IHx8IGJUZW1wRXhpdCkgeworICAgIGJFeGl0ID0gVFJVRTsKKyAgfQogfQogCi12b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uVmFsaWRhdGUoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCYgYlJDLCBGWF9CT09MJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JaWYgKCFtX2JOb3RpZnlpbmcpCi0JewotCQlBU1NFUlQocFdpZGdldCAhPSBOVUxMKTsKLQkJaWYgKHBXaWRnZXQtPkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZSkpCi0JCXsKLQkJCW1fYk5vdGlmeWluZyA9IFRSVUU7Ci0JCQlwV2lkZ2V0LT5DbGVhckFwcE1vZGlmaWVkKCk7Cit2b2lkIENGRkxfSUZvcm1GaWxsZXI6Ok9uUHJlT3BlbihDUERGU0RLX1dpZGdldCogcFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSZXNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZykgeworICBBU1NFUlQocFdpZGdldCAhPSBOVUxMKTsKIAotCQkJQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKLS8vIAkJCUNSZWFkZXJfRG9jVmlldyogcERvY1ZpZXcgPSBwUGFnZVZpZXctPkdldERvY1ZpZXcoKTsKLS8vIAkJCUFTU0VSVChwRG9jVmlldyAhPSBOVUxMKTsKLQkJCQotCQkJCisgIGlmICghbV9iTm90aWZ5aW5nKSB7CisgICAgaWYgKHBXaWRnZXQtPkhhc1hGQUFBY3Rpb24oUERGU0RLX1hGQV9QcmVPcGVuKSkgeworICAgICAgbV9iTm90aWZ5aW5nID0gVFJVRTsKKyAgICAgIGludCBuQWdlID0gcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpOworICAgICAgaW50IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7CiAKLQkJCVBERlNES19GaWVsZEFjdGlvbiBmYTsKLQkJCWZhLmJNb2RpZmllciA9IG1fcEFwcC0+RkZJX0lzQ1RSTEtleURvd24obkZsYWcpOwotIAkJCWZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKLQkJCWZhLmJLZXlEb3duID0gR2V0S2V5RG93bigpOwotCQkJZmEuYlJDID0gVFJVRTsKKyAgICAgIFBERlNES19GaWVsZEFjdGlvbiBmYTsKKyAgICAgIGZhLmJNb2RpZmllciA9IG1fcEFwcC0+RkZJX0lzQ1RSTEtleURvd24obkZsYWcpOworICAgICAgZmEuYlNoaWZ0ID0gbV9wQXBwLT5GRklfSXNTSElGVEtleURvd24obkZsYWcpOwogCi0JCQlDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBGQUxTRSk7Ci0JCQlBU1NFUlQocEZvcm1GaWxsZXIgIT0gTlVMTCk7CisgICAgICBwV2lkZ2V0LT5PblhGQUFBY3Rpb24oUERGU0RLX1hGQV9QcmVPcGVuLCBmYSwgcFBhZ2VWaWV3KTsKKyAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOwogCi0JCQlwRm9ybUZpbGxlci0+R2V0QWN0aW9uRGF0YShwUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6VmFsaWRhdGUsIGZhKTsKLQkJCXBGb3JtRmlsbGVyLT5TYXZlU3RhdGUocFBhZ2VWaWV3KTsKKyAgICAgIGlmICghSXNWYWxpZEFubm90KHBQYWdlVmlldywgcFdpZGdldCkpIHsKKyAgICAgICAgYkV4aXQgPSBUUlVFOworICAgICAgICByZXR1cm47CisgICAgICB9CiAKLQkJCVBERlNES19GaWVsZEFjdGlvbiBmYU9sZCA9IGZhOwotCQkJcFdpZGdldC0+T25BQWN0aW9uKENQREZfQUFjdGlvbjo6VmFsaWRhdGUsIGZhLCBwUGFnZVZpZXcpOworICAgICAgaWYgKG5BZ2UgIT0gcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpKSB7CisgICAgICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBGQUxTRSkpIHsKKyAgICAgICAgICBwRm9ybUZpbGxlci0+UmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuVmFsdWVBZ2UgPT0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKSk7CisgICAgICAgIH0KIAotCQkJYlJDID0gZmEuYlJDOwotLy8JCQliRXhpdCA9ICFJc1ZhbGlkQW5ub3QobV9wQXBwLCBwRG9jdW1lbnQsIHBEb2NWaWV3LCBwUGFnZVZpZXcsIHBXaWRnZXQpOwotCi0JCQltX2JOb3RpZnlpbmcgPSBGQUxTRTsKLQkJfQotCX0KKyAgICAgICAgYlJlc2V0ID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgIH0KIH0KIAotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkNhbGN1bGF0ZShDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JaWYgKCFtX2JOb3RpZnlpbmcpCi0JewotCQlBU1NFUlQocFdpZGdldCAhPSBOVUxMKTsKLQkJQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKLS8vIAkJQ1JlYWRlcl9Eb2NWaWV3KiBwRG9jVmlldyA9IHBQYWdlVmlldy0+R2V0RG9jVmlldygpOwotLy8gCQlBU1NFUlQocERvY1ZpZXcgIT0gTlVMTCk7Ci0JCUNQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBQYWdlVmlldy0+R2V0U0RLRG9jdW1lbnQoKTsKLQkJQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKK3ZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25Qb3N0T3BlbihDUERGU0RLX1dpZGdldCogcFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlJlc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWcpIHsKKyAgQVNTRVJUKHBXaWRnZXQgIT0gTlVMTCk7CiAKLQkJQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKXBEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7Ci0JCUFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOworICBpZiAoIW1fYk5vdGlmeWluZykgeworICAgIGlmIChwV2lkZ2V0LT5IYXNYRkFBQWN0aW9uKFBERlNES19YRkFfUG9zdE9wZW4pKSB7CisgICAgICBtX2JOb3RpZnlpbmcgPSBUUlVFOworICAgICAgaW50IG5BZ2UgPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCk7CisgICAgICBpbnQgblZhbHVlQWdlID0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKTsKIAotCQlwSW50ZXJGb3JtLT5PbkNhbGN1bGF0ZShwV2lkZ2V0LT5HZXRGb3JtRmllbGQoKSk7CisgICAgICBQREZTREtfRmllbGRBY3Rpb24gZmE7CisgICAgICBmYS5iTW9kaWZpZXIgPSBtX3BBcHAtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTsKKyAgICAgIGZhLmJTaGlmdCA9IG1fcEFwcC0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTsKIAotLy8JCWJFeGl0ID0gIUlzVmFsaWRBbm5vdChtX3BBcHAsIHBEb2N1bWVudCwgcERvY1ZpZXcsIHBQYWdlVmlldywgcFdpZGdldCk7CisgICAgICBwV2lkZ2V0LT5PblhGQUFBY3Rpb24oUERGU0RLX1hGQV9Qb3N0T3BlbiwgZmEsIHBQYWdlVmlldyk7CisgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKIAotCQltX2JOb3RpZnlpbmcgPSBGQUxTRTsKLQl9CisgICAgICBpZiAoIUlzVmFsaWRBbm5vdChwUGFnZVZpZXcsIHBXaWRnZXQpKSB7CisgICAgICAgIGJFeGl0ID0gVFJVRTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAobkFnZSAhPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCkpIHsKKyAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIEZBTFNFKSkgeworICAgICAgICAgIHBGb3JtRmlsbGVyLT5SZXNldFBERldpbmRvdyhwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5WYWx1ZUFnZSA9PSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGJSZXNldCA9IFRSVUU7CisgICAgICB9CisgICAgfQorICB9Cit9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKK0ZYX0JPT0wgQ0ZGTF9JRm9ybUZpbGxlcjo6SXNWYWxpZEFubm90KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCkgeworICBpZiAocFBhZ2VWaWV3KQorICAgIHJldHVybiBwUGFnZVZpZXctPklzVmFsaWRBbm5vdChwQW5ub3QtPkdldFBERkFubm90KCkpOworCisgIHJldHVybiBGQUxTRTsKIH0KIAotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpPbkZvcm1hdChDUERGU0RLX1dpZGdldCogcFdpZGdldCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9CT09MJiBiRXhpdCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JaWYgKCFtX2JOb3RpZnlpbmcpCi0JewotCQlBU1NFUlQocFdpZGdldCAhPSBOVUxMKTsKLQkJQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKLS8vIAkJQ1JlYWRlcl9Eb2NWaWV3KiBwRG9jVmlldyA9IHBQYWdlVmlldy0+R2V0RG9jVmlldygpOwotLy8gCQlBU1NFUlQocERvY1ZpZXcgIT0gTlVMTCk7Ci0JCUNQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBQYWdlVmlldy0+R2V0U0RLRG9jdW1lbnQoKTsKLQkJQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKK3ZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25CZWZvcmVLZXlTdHJva2Uodm9pZCogcFByaXZhdGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuU2VsU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuU2VsRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJLZXlEb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFeGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgeworICBDRkZMX1ByaXZhdGVEYXRhKiBwRGF0YSA9IChDRkZMX1ByaXZhdGVEYXRhKilwUHJpdmF0ZURhdGE7CisgIEFTU0VSVChwRGF0YS0+cFdpZGdldCk7CiAKLQkJQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKXBEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7Ci0JCUFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOworICBDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwRGF0YS0+cFdpZGdldCwgRkFMU0UpOwogCi0JCUZYX0JPT0wgYkZvcm1hdGVkID0gRkFMU0U7Ci0JCUNGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IHBJbnRlckZvcm0tPk9uRm9ybWF0KHBXaWRnZXQtPkdldEZvcm1GaWVsZCgpLCBHZXRDb21taXRLZXkoKSwgYkZvcm1hdGVkKTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBpZiAocEZvcm1GaWxsZXItPklzRmllbGRGdWxsKHBEYXRhLT5wUGFnZVZpZXcpKSB7CisgICAgRlhfQk9PTCBiRnVsbEV4aXQgPSBGQUxTRTsKKyAgICBGWF9CT09MIGJGdWxsUmVzZXQgPSBGQUxTRTsKKyAgICBPbkZ1bGwocERhdGEtPnBXaWRnZXQsIHBEYXRhLT5wUGFnZVZpZXcsIGJGdWxsUmVzZXQsIGJGdWxsRXhpdCwgbkZsYWcpOwogCi0vLwkJYkV4aXQgPSAhSXNWYWxpZEFubm90KG1fcEFwcCwgcERvY3VtZW50LCBwRG9jVmlldywgcFBhZ2VWaWV3LCBwV2lkZ2V0KTsKKyAgICBpZiAoYkZ1bGxSZXNldCB8fCBiRnVsbEV4aXQpIHsKKyAgICAgIGJFeGl0ID0gVFJVRTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAotCQlpZiAoYkV4aXQpIHJldHVybjsKKyAgaWYgKCFtX2JOb3RpZnlpbmcpIHsKKyAgICBpZiAocERhdGEtPnBXaWRnZXQtPkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpLZXlTdHJva2UpKSB7CisgICAgICBtX2JOb3RpZnlpbmcgPSBUUlVFOworICAgICAgaW50IG5BZ2UgPSBwRGF0YS0+cFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpOworICAgICAgaW50IG5WYWx1ZUFnZSA9IHBEYXRhLT5wV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpOwogCi0JCWlmIChiRm9ybWF0ZWQpCi0JCXsKLQkJCXBJbnRlckZvcm0tPlJlc2V0RmllbGRBcHBlYXJhbmNlKHBXaWRnZXQtPkdldEZvcm1GaWVsZCgpLCBzVmFsdWUuY19zdHIoKSwgVFJVRSk7Ci0JCQlwSW50ZXJGb3JtLT5VcGRhdGVGaWVsZChwV2lkZ2V0LT5HZXRGb3JtRmllbGQoKSk7Ci0JCX0KKyAgICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBEYXRhLT5wUGFnZVZpZXctPkdldFNES0RvY3VtZW50KCk7CiAKLQkJbV9iTm90aWZ5aW5nID0gRkFMU0U7Ci0JfQotfQorICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOworICAgICAgZmEuYk1vZGlmaWVyID0gbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7CisgICAgICBmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7CisgICAgICBmYS5zQ2hhbmdlID0gc3RyQ2hhbmdlOworICAgICAgZmEuc0NoYW5nZUV4ID0gc3RyQ2hhbmdlRXg7CisgICAgICBmYS5iS2V5RG93biA9IGJLZXlEb3duOworICAgICAgZmEuYldpbGxDb21taXQgPSBGQUxTRTsKKyAgICAgIGZhLmJSQyA9IFRSVUU7CisgICAgICBmYS5uU2VsU3RhcnQgPSBuU2VsU3RhcnQ7CisgICAgICBmYS5uU2VsRW5kID0gblNlbEVuZDsKIAotLy8gTFJFU1VMVCBDQUxMQkFDSyBDRkZMX0lGb3JtRmlsbGVyOjpGRkxfV25kUHJvYygKLS8vIAkJCQkJCQkJCSAgaW50IGNvZGUsICAgICAgIC8vIGhvb2sgY29kZQotLy8gCQkJCQkJCQkJICBXUEFSQU0gd1BhcmFtLCAgLy8gdmlydHVhbC1rZXkgY29kZQotLy8gCQkJCQkJCQkJICBMUEFSQU0gbFBhcmFtICAgLy8ga2V5c3Ryb2tlLW1lc3NhZ2UgaW5mb3JtYXRpb24KLS8vIAkJCQkJCQkJCQkpCi0vLyB7Ci0vLyAJaWYgKGNvZGUgIT0gSENfQUNUSU9OKQotLy8gCXsKLS8vIAkJcmV0dXJuIENhbGxOZXh0SG9va0V4IChtX2hvb2tTaGVldCwgY29kZSwgd1BhcmFtLCBsUGFyYW0pOwotLy8gCX0KLS8vIAotLy8gCUZYU1lTX21lbWNweSgmZ19Nc2csICh2b2lkKilsUGFyYW0sIHNpemVvZihNU0cpKTsJCi0vLyAKLS8vIAlyZXR1cm4gMDsKLS8vIH0KKyAgICAgIHBGb3JtRmlsbGVyLT5HZXRBY3Rpb25EYXRhKHBEYXRhLT5wUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlLCBmYSk7CisgICAgICBwRm9ybUZpbGxlci0+U2F2ZVN0YXRlKHBEYXRhLT5wUGFnZVZpZXcpOwogCi0vLyBNU0cJQ0ZGTF9JRm9ybUZpbGxlcjo6R2V0TGFzdE1lc3NhZ2UoKQotLy8gewotLy8gCXJldHVybiBnX01zZzsKLS8vIH0KKyAgICAgIGlmIChwRGF0YS0+cFdpZGdldC0+T25BQWN0aW9uKENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlLCBmYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5wUGFnZVZpZXcpKSB7CisgICAgICAgIGlmICghSXNWYWxpZEFubm90KHBEYXRhLT5wUGFnZVZpZXcsIHBEYXRhLT5wV2lkZ2V0KSkgeworICAgICAgICAgIGJFeGl0ID0gVFJVRTsKKyAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotaW50IENGRkxfSUZvcm1GaWxsZXI6OkdldENvbW1pdEtleSgpCi17Ci0vLwlNU0cgbXNnID0gQ0ZGTF9JRm9ybUZpbGxlcjo6R2V0TGFzdE1lc3NhZ2UoKTsKKyAgICAgICAgaWYgKG5BZ2UgIT0gcERhdGEtPnBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKSkgeworICAgICAgICAgIENQV0xfV25kKiBwV25kID0gcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KAorICAgICAgICAgICAgICBwRGF0YS0+cFBhZ2VWaWV3LCBuVmFsdWVBZ2UgPT0gcERhdGEtPnBXaWRnZXQtPkdldFZhbHVlQWdlKCkpOworICAgICAgICAgIHBEYXRhID0gKENGRkxfUHJpdmF0ZURhdGEqKXBXbmQtPkdldEF0dGFjaGVkRGF0YSgpOworICAgICAgICAgIGJFeGl0ID0gVFJVRTsKKyAgICAgICAgfQogCi0JaW50IG5Db21taXRLZXkgPSAwOwotLy8gCXN3aXRjaCAobXNnLm1lc3NhZ2UpCi0vLyAJewotLy8gCWNhc2UgV01fTEJVVFRPTkRPV046Ci0vLyAJY2FzZSBXTV9MQlVUVE9OVVA6Ci0vLyAJCW5Db21taXRLZXkgPSAxOwotLy8gCQlicmVhazsKLS8vIAljYXNlIFdNX0tFWURPV046Ci0vLyAJCXN3aXRjaCAobXNnLndQYXJhbSkKLS8vIAkJewotLy8gCQljYXNlIFZLX1JFVFVSTjoKLS8vIAkJCW5Db21taXRLZXkgPSAyOwotLy8gCQkJYnJlYWs7Ci0vLyAJCWNhc2UgVktfVEFCOgotLy8gCQkJbkNvbW1pdEtleSA9IDM7Ci0vLyAJCQlicmVhazsKLS8vIAkJfQotLy8gCQlicmVhazsKLS8vIAl9CisgICAgICAgIGlmIChmYS5iUkMpIHsKKyAgICAgICAgICBwRm9ybUZpbGxlci0+U2V0QWN0aW9uRGF0YShwRGF0YS0+cFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OktleVN0cm9rZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYSk7CisgICAgICAgICAgYlJDID0gRkFMU0U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcEZvcm1GaWxsZXItPlJlc3RvcmVTdGF0ZShwRGF0YS0+cFBhZ2VWaWV3KTsKKyAgICAgICAgICBiUkMgPSBGQUxTRTsKKyAgICAgICAgfQogCi0JcmV0dXJuIG5Db21taXRLZXk7Ci19CisgICAgICAgIGlmIChwRG9jdW1lbnQtPkdldEZvY3VzQW5ub3QoKSAhPSBwRGF0YS0+cFdpZGdldCkgeworICAgICAgICAgIHBGb3JtRmlsbGVyLT5Db21taXREYXRhKHBEYXRhLT5wUGFnZVZpZXcsIG5GbGFnKTsKKyAgICAgICAgICBiRXhpdCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghSXNWYWxpZEFubm90KHBEYXRhLT5wUGFnZVZpZXcsIHBEYXRhLT5wV2lkZ2V0KSkgeworICAgICAgICAgIGJFeGl0ID0gVFJVRTsKKyAgICAgICAgICBtX2JOb3RpZnlpbmcgPSBGQUxTRTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KIAotRlhfQk9PTCBDRkZMX0lGb3JtRmlsbGVyOjpHZXRLZXlEb3duKCkKLXsKLQlyZXR1cm4gVFJVRTsKLS8vIAlNU0cgbXNnID0gQ0ZGTF9JRm9ybUZpbGxlcjo6R2V0TGFzdE1lc3NhZ2UoKTsKLS8vIAotLy8gCXJldHVybiBtc2cubWVzc2FnZSA9PSBXTV9LRVlET1dOIHx8IG1zZy5tZXNzYWdlID09IFdNX0NIQVI7Ci19Ci0KLUZYX0JPT0wJQ0ZGTF9JRm9ybUZpbGxlcjo6SXNWYWxpZEFubm90KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KQotewotCi0JQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKLQlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCi0JaWYocFBhZ2VWaWV3KQotCQlyZXR1cm4gcFBhZ2VWaWV3LT5Jc1ZhbGlkQW5ub3QocEFubm90LT5HZXRQREZBbm5vdCgpKTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsKLX0KLQotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpCZWZvcmVVbmRvKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLQotfQotCi12b2lkIENGRkxfSUZvcm1GaWxsZXI6OkJlZm9yZVJlZG8oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQotewotCUJlZm9yZVVuZG8ocERvY3VtZW50KTsKLX0KLQotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpBZnRlclVuZG8oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQotewotfQotCi12b2lkIENGRkxfSUZvcm1GaWxsZXI6OkFmdGVyUmVkbyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci19Ci0KLUZYX0JPT0wJQ0ZGTF9JRm9ybUZpbGxlcjo6Q2FuQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci0KLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wJQ0ZGTF9JRm9ybUZpbGxlcjo6Q2FuQ3V0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLQotCXJldHVybiBGQUxTRTsKLX0KLQotRlhfQk9PTAlDRkZMX0lGb3JtRmlsbGVyOjpDYW5QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci0KLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6RG9Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLX0KLQotdm9pZCBDRkZMX0lGb3JtRmlsbGVyOjpEb0N1dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci19Ci0KLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6RG9QYXN0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci0KLX0KLXZvaWQgQ0ZGTF9JRm9ybUZpbGxlcjo6T25CZWZvcmVLZXlTdHJva2UoRlhfQk9PTCBiRWRpdE9yTGlzdCwgdm9pZCogcFByaXZhdGVEYXRhLCBGWF9JTlQzMiBuS2V5Q29kZSwKLQkJCQkJCQkJCQkJICBDRlhfV2lkZVN0cmluZyAmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCAKLQkJCQkJCQkJCQkJICBpbnQgblNlbFN0YXJ0LCBpbnQgblNlbEVuZCwKLQkJCQkJCQkJCQlGWF9CT09MIGJLZXlEb3duLCBGWF9CT09MICYgYlJDLCBGWF9CT09MICYgYkV4aXQsIEZYX0RXT1JEIG5GbGFnKQotewotCUFTU0VSVChwUHJpdmF0ZURhdGEgIT0gTlVMTCk7Ci0JQ0ZGTF9Qcml2YXRlRGF0YSogcERhdGEgPSAoQ0ZGTF9Qcml2YXRlRGF0YSopcFByaXZhdGVEYXRhOwotCUFTU0VSVChwRGF0YS0+cFdpZGdldCAhPSBOVUxMKTsKLQkKLQlDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwRGF0YS0+cFdpZGdldCwgRkFMU0UpOwotCUFTU0VSVChwRm9ybUZpbGxlciAhPSBOVUxMKTsKLQkKLQlpZiAoIW1fYk5vdGlmeWluZykKLQl7Ci0JCWlmIChwRGF0YS0+cFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OktleVN0cm9rZSkpCi0JCXsKLQkJCW1fYk5vdGlmeWluZyA9IFRSVUU7Ci0JCQlpbnQgbkFnZSA9IHBEYXRhLT5wV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCk7Ci0JCQlpbnQgblZhbHVlQWdlID0gcERhdGEtPnBXaWRnZXQtPkdldFZhbHVlQWdlKCk7Ci0KLQkJCUFTU0VSVChwRGF0YS0+cFBhZ2VWaWV3ICE9IE5VTEwpOwotCQkJQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50ICA9IHBEYXRhLT5wUGFnZVZpZXctPkdldFNES0RvY3VtZW50KCk7Ci0JCQkKLQkJCVBERlNES19GaWVsZEFjdGlvbiBmYTsKLSAJCQlmYS5iTW9kaWZpZXIgPSBtX3BBcHAtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTsKLSAJCQlmYS5iU2hpZnQgPSBtX3BBcHAtPkZGSV9Jc1NISUZUS2V5RG93bihuRmxhZyk7Ci0JCQlmYS5zQ2hhbmdlID0gc3RyQ2hhbmdlOwotCQkJZmEuc0NoYW5nZUV4ID0gc3RyQ2hhbmdlRXg7Ci0JCQlmYS5iS2V5RG93biA9IGJLZXlEb3duOwotCQkJZmEuYldpbGxDb21taXQgPSBGQUxTRTsKLQkJCWZhLmJSQyA9IFRSVUU7Ci0JCQlmYS5uU2VsU3RhcnQgPSBuU2VsU3RhcnQ7Ci0JCQlmYS5uU2VsRW5kID0gblNlbEVuZDsKLQotCi0JCQlwRm9ybUZpbGxlci0+R2V0QWN0aW9uRGF0YShwRGF0YS0+cFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OktleVN0cm9rZSwgZmEpOwotCQkJcEZvcm1GaWxsZXItPlNhdmVTdGF0ZShwRGF0YS0+cFBhZ2VWaWV3KTsKLQkJCQotCQkJaWYgKHBEYXRhLT5wV2lkZ2V0LT5PbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpLZXlTdHJva2UsIGZhLCBwRGF0YS0+cFBhZ2VWaWV3KSkKLQkJCXsKLQkJCQlpZiAoIUlzVmFsaWRBbm5vdChwRGF0YS0+cFBhZ2VWaWV3LCBwRGF0YS0+cFdpZGdldCkpCi0JCQkJewotCQkJCQliRXhpdCA9IFRSVUU7Ci0JCQkJCW1fYk5vdGlmeWluZyA9IEZBTFNFOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCQotCQkJCWlmIChuQWdlICE9IHBEYXRhLT5wV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCkpCi0JCQkJewotCQkJCQlDUFdMX1duZCogcFduZCA9IHBGb3JtRmlsbGVyLT5SZXNldFBERldpbmRvdyhwRGF0YS0+cFBhZ2VWaWV3LCBuVmFsdWVBZ2UgPT0gcERhdGEtPnBXaWRnZXQtPkdldFZhbHVlQWdlKCkpOwotCQkJCQlwRGF0YSA9IChDRkZMX1ByaXZhdGVEYXRhKilwV25kLT5HZXRBdHRhY2hlZERhdGEoKTsKLQkJCQkJYkV4aXQgPSBUUlVFOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAoZmEuYlJDKQotCQkJCXsKLQkJCQkJcEZvcm1GaWxsZXItPlNldEFjdGlvbkRhdGEocERhdGEtPnBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2UsIGZhKTsKLQkJCQkJYlJDID0gRkFMU0U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXBGb3JtRmlsbGVyLT5SZXN0b3JlU3RhdGUocERhdGEtPnBQYWdlVmlldyk7Ci0JCQkJCWJSQyA9IEZBTFNFOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAocERvY3VtZW50LT5HZXRGb2N1c0Fubm90KCkgIT0gcERhdGEtPnBXaWRnZXQpCi0JCQkJewotCQkJCQlwRm9ybUZpbGxlci0+Q29tbWl0RGF0YShwRGF0YS0+cFBhZ2VWaWV3LG5GbGFnKTsKLQkJCQkJYkV4aXQgPSBUUlVFOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsJCQkKLQkJCQlpZiAoIUlzVmFsaWRBbm5vdChwRGF0YS0+cFBhZ2VWaWV3LCBwRGF0YS0+cFdpZGdldCkpCi0JCQkJewotCQkJCQliRXhpdCA9IFRSVUU7Ci0JCQkJCW1fYk5vdGlmeWluZyA9IEZBTFNFOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJCi0JCQltX2JOb3RpZnlpbmcgPSBGQUxTRTsKLQkJfQotCX0KLX0KLQotdm9pZAlDRkZMX0lGb3JtRmlsbGVyOjpPbkFmdGVyS2V5U3Ryb2tlKEZYX0JPT0wgYkVkaXRPckxpc3QsIHZvaWQqIHBQcml2YXRlRGF0YSwgRlhfQk9PTCAmIGJFeGl0LEZYX0RXT1JEIG5GbGFnKSAKLXsKLQlBU1NFUlQocFByaXZhdGVEYXRhICE9IE5VTEwpOwotCUNGRkxfUHJpdmF0ZURhdGEqIHBEYXRhID0gKENGRkxfUHJpdmF0ZURhdGEqKXBQcml2YXRlRGF0YTsKLQlBU1NFUlQocERhdGEtPnBXaWRnZXQgIT0gTlVMTCk7Ci0JCi0JQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocERhdGEtPnBXaWRnZXQsIEZBTFNFKTsKLQlBU1NFUlQocEZvcm1GaWxsZXIgIT0gTlVMTCk7Ci0JCi0JaWYgKCFiRWRpdE9yTGlzdCkKLQkJcEZvcm1GaWxsZXItPk9uS2V5U3Ryb2tlKGJFeGl0KTsKKyAgICAgIG1fYk5vdGlmeWluZyA9IEZBTFNFOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfTGlzdEJveC5jcHAgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9MaXN0Qm94LmNwcAppbmRleCBkZmZkMTc1Li42Mzg2MThmIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9MaXN0Qm94LmNwcAorKysgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9MaXN0Qm94LmNwcApAQCAtMSwzMTcgKzEsMjIzIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Zvcm1maWxsZXIvRm9ybUZpbGxlci5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfTGlzdEJveC5oIgotLy8jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Nb2R1bGUuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmgiCi0vLyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1VuZG8uaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0NCQV9Gb250bWFwLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0xpc3RCb3guaCIKIAorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9DQkFfRm9udG1hcC5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Gb3JtRmlsbGVyLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0lGb3JtRmlsbGVyLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZzZGtfY29tbW9uLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZzZGtfbWdyLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGlzdEJveC5oIgogCi0jZGVmaW5lCUZGTF9ERUZBVUxUTElTVEJPWEZPTlRTSVpFCQkxMi4wZgorI2RlZmluZSBGRkxfREVGQVVMVExJU1RCT1hGT05UU0laRSAxMi4wZgogCitDRkZMX0xpc3RCb3g6OkNGRkxfTGlzdEJveChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwV2lkZ2V0KQorICAgIDogQ0ZGTF9Gb3JtRmlsbGVyKHBBcHAsIHBXaWRnZXQpLCBtX3BGb250TWFwKE5VTEwpIHt9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0ZGTF9MaXN0Qm94IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotQ0ZGTF9MaXN0Qm94OjpDRkZMX0xpc3RCb3goQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19Bbm5vdCogcFdpZGdldCkgOgotCUNGRkxfRm9ybUZpbGxlcihwQXBwLCBwV2lkZ2V0KSwKLQltX3BGb250TWFwKE5VTEwpCi17CitDRkZMX0xpc3RCb3g6On5DRkZMX0xpc3RCb3goKSB7CisgIGRlbGV0ZSBtX3BGb250TWFwOwogfQogCi1DRkZMX0xpc3RCb3g6On5DRkZMX0xpc3RCb3goKQotewotCWlmIChtX3BGb250TWFwKQotCXsKLQkJZGVsZXRlIG1fcEZvbnRNYXA7Ci0JCW1fcEZvbnRNYXAgPSBOVUxMOwotCX0KK1BXTF9DUkVBVEVQQVJBTSBDRkZMX0xpc3RCb3g6OkdldENyZWF0ZVBhcmFtKCkgeworICBQV0xfQ1JFQVRFUEFSQU0gY3AgPSBDRkZMX0Zvcm1GaWxsZXI6OkdldENyZWF0ZVBhcmFtKCk7CisKKyAgRlhfRFdPUkQgZHdGaWVsZEZsYWcgPSBtX3BXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKTsKKworICBpZiAoZHdGaWVsZEZsYWcgJiBGSUVMREZMQUdfTVVMVElTRUxFQ1QpIHsKKyAgICBjcC5kd0ZsYWdzIHw9IFBMQlNfTVVMVElQTEVTRUw7CisgIH0KKworICBjcC5kd0ZsYWdzIHw9IFBXU19WU0NST0xMOworCisgIGlmIChjcC5kd0ZsYWdzICYgUFdTX0FVVE9GT05UU0laRSkKKyAgICBjcC5mRm9udFNpemUgPSBGRkxfREVGQVVMVExJU1RCT1hGT05UU0laRTsKKworICBpZiAoIW1fcEZvbnRNYXApCisgICAgbV9wRm9udE1hcCA9IG5ldyBDQkFfRm9udE1hcChtX3BXaWRnZXQsIG1fcEFwcC0+R2V0U3lzSGFuZGxlcigpKTsKKyAgY3AucEZvbnRNYXAgPSBtX3BGb250TWFwOworCisgIHJldHVybiBjcDsKIH0KIAotUFdMX0NSRUFURVBBUkFNCUNGRkxfTGlzdEJveDo6R2V0Q3JlYXRlUGFyYW0oKQotewotCVBXTF9DUkVBVEVQQVJBTSBjcCA9IENGRkxfRm9ybUZpbGxlcjo6R2V0Q3JlYXRlUGFyYW0oKTsKK0NQV0xfV25kKiBDRkZMX0xpc3RCb3g6Ok5ld1BERldpbmRvdyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgeworICBDUFdMX0xpc3RCb3gqIHBXbmQgPSBuZXcgQ1BXTF9MaXN0Qm94KCk7CisgIHBXbmQtPkF0dGFjaEZGTERhdGEodGhpcyk7CisgIHBXbmQtPkNyZWF0ZShjcCk7CiAKLQlBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwotCUZYX0RXT1JEIGR3RmllbGRGbGFnID0gbV9wV2lkZ2V0LT5HZXRGaWVsZEZsYWdzKCk7Ci0JCQotCWlmIChkd0ZpZWxkRmxhZyAmIEZJRUxERkxBR19NVUxUSVNFTEVDVCkKLQl7CQkKLQkJY3AuZHdGbGFncyB8PSBQTEJTX01VTFRJUExFU0VMOwotCX0KKyAgQ0ZGTF9JRm9ybUZpbGxlciogcElGb3JtRmlsbGVyID0gbV9wQXBwLT5HZXRJRm9ybUZpbGxlcigpOworICBwV25kLT5TZXRGaWxsZXJOb3RpZnkocElGb3JtRmlsbGVyKTsKIAotCWlmIChkd0ZpZWxkRmxhZyAmIEZJRUxERkxBR19DT01NSVRPTlNFTENIQU5HRSkKLQl7Ci0JCS8vY3AuZHdGbGFncyB8PSBQTEJTX0NPTU1JVFNFTEVDVEVEVkFMVUU7Ci0JfQorICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9wV2lkZ2V0LT5Db3VudE9wdGlvbnMoKTsgaSA8IHN6OyBpKyspCisgICAgcFduZC0+QWRkU3RyaW5nKG1fcFdpZGdldC0+R2V0T3B0aW9uTGFiZWwoaSkuY19zdHIoKSk7CiAKLQljcC5kd0ZsYWdzIHw9IFBXU19WU0NST0xMOworICBpZiAocFduZC0+SGFzRmxhZyhQTEJTX01VTFRJUExFU0VMKSkgeworICAgIG1fT3JpZ2luU2VsZWN0aW9ucy5jbGVhcigpOwogCi0JaWYgKGNwLmR3RmxhZ3MgJiBQV1NfQVVUT0ZPTlRTSVpFKQotCQljcC5mRm9udFNpemUgPSBGRkxfREVGQVVMVExJU1RCT1hGT05UU0laRTsKKyAgICBGWF9CT09MIGJTZXRDYXJldCA9IEZBTFNFOworICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX3BXaWRnZXQtPkNvdW50T3B0aW9ucygpOyBpIDwgc3o7IGkrKykgeworICAgICAgaWYgKG1fcFdpZGdldC0+SXNPcHRpb25TZWxlY3RlZChpKSkgeworICAgICAgICBpZiAoIWJTZXRDYXJldCkgeworICAgICAgICAgIHBXbmQtPlNldENhcmV0KGkpOworICAgICAgICAgIGJTZXRDYXJldCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgcFduZC0+U2VsZWN0KGkpOworICAgICAgICBtX09yaWdpblNlbGVjdGlvbnMuaW5zZXJ0KGkpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCBpID0gMCwgc3ogPSBtX3BXaWRnZXQtPkNvdW50T3B0aW9ucygpOyBpIDwgc3o7IGkrKykgeworICAgICAgaWYgKG1fcFdpZGdldC0+SXNPcHRpb25TZWxlY3RlZChpKSkgeworICAgICAgICBwV25kLT5TZWxlY3QoaSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQogCi0JaWYgKCFtX3BGb250TWFwKQotCXsKLQkJQVNTRVJUKHRoaXMtPm1fcEFwcCAhPSBOVUxMKTsKLQkJbV9wRm9udE1hcCA9IG5ldyBDQkFfRm9udE1hcChtX3BXaWRnZXQsbV9wQXBwLT5HZXRTeXNIYW5kbGVyKCkpOy8vLCBJU3lzdGVtSGFuZGxlOjpHZXRTeXN0ZW1IYW5kbGVyKG1fcEFwcCkpOwotCQltX3BGb250TWFwLT5Jbml0aWFsKCk7Ci0JfQotCWNwLnBGb250TWFwID0gbV9wRm9udE1hcDsKKyAgcFduZC0+U2V0VG9wVmlzaWJsZUluZGV4KG1fcFdpZGdldC0+R2V0VG9wVmlzaWJsZUluZGV4KCkpOwogCi0JcmV0dXJuIGNwOworICByZXR1cm4gcFduZDsKIH0KIAotQ1BXTF9XbmQqIENGRkxfTGlzdEJveDo6TmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKLXsKLQlDUFdMX0xpc3RCb3gqIHBXbmQgPSBuZXcgQ1BXTF9MaXN0Qm94KCk7Ci0JcFduZC0+QXR0YWNoRkZMRGF0YSh0aGlzKTsKLQlwV25kLT5DcmVhdGUoY3ApOwotCi0JQVNTRVJUKG1fcEFwcCAhPSBOVUxMKTsKLQlDRkZMX0lGb3JtRmlsbGVyKiBwSUZvcm1GaWxsZXIgPSBtX3BBcHAtPkdldElGb3JtRmlsbGVyKCk7Ci0JcFduZC0+U2V0RmlsbGVyTm90aWZ5KHBJRm9ybUZpbGxlcik7Ci0KLQlmb3IgKEZYX0lOVDMyIGk9MCxzej1tX3BXaWRnZXQtPkNvdW50T3B0aW9ucygpOyBpPHN6OyBpKyspCi0JCXBXbmQtPkFkZFN0cmluZyhtX3BXaWRnZXQtPkdldE9wdGlvbkxhYmVsKGkpLmNfc3RyKCkpOwotCi0JaWYgKHBXbmQtPkhhc0ZsYWcoUExCU19NVUxUSVBMRVNFTCkpCi0JewotCQltX09yaWdpblNlbGVjdGlvbnMuUmVtb3ZlQWxsKCk7Ci0JCQotCQlGWF9CT09MIGJTZXRDYXJldCA9IEZBTFNFOwotCQlmb3IgKEZYX0lOVDMyIGk9MCxzej1tX3BXaWRnZXQtPkNvdW50T3B0aW9ucygpOyBpPHN6OyBpKyspCi0JCXsKLQkJCWlmIChtX3BXaWRnZXQtPklzT3B0aW9uU2VsZWN0ZWQoaSkpCi0JCQl7Ci0JCQkJaWYgKCFiU2V0Q2FyZXQpCi0JCQkJewotCQkJCQlwV25kLT5TZXRDYXJldChpKTsKLQkJCQkJYlNldENhcmV0ID0gVFJVRTsKLQkJCQl9Ci0JCQkJcFduZC0+U2VsZWN0KGkpOwotCQkJCW1fT3JpZ2luU2VsZWN0aW9ucy5TZXRBdChpLCBOVUxMKTsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JewotCQlmb3IgKGludCBpPTAsc3o9bV9wV2lkZ2V0LT5Db3VudE9wdGlvbnMoKTsgaTxzejsgaSsrKQotCQl7Ci0JCQlpZiAobV9wV2lkZ2V0LT5Jc09wdGlvblNlbGVjdGVkKGkpKQotCQkJewotCQkJCXBXbmQtPlNlbGVjdChpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQkKLQlwV25kLT5TZXRUb3BWaXNpYmxlSW5kZXgobV9wV2lkZ2V0LT5HZXRUb3BWaXNpYmxlSW5kZXgoKSk7Ci0JCi0JcmV0dXJuIHBXbmQ7CitGWF9CT09MIENGRkxfTGlzdEJveDo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MpIHsKKyAgcmV0dXJuIENGRkxfRm9ybUZpbGxlcjo6T25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFncyk7CiB9CiAKK0ZYX0JPT0wgQ0ZGTF9MaXN0Qm94OjpJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgeworICBDUFdMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKENQV0xfTGlzdEJveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpOworICBpZiAoIXBMaXN0Qm94KQorICAgIHJldHVybiBGQUxTRTsKIAotRlhfQk9PTAlDRkZMX0xpc3RCb3g6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQotewotCXJldHVybiBDRkZMX0Zvcm1GaWxsZXI6Ok9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOworICBpZiAobV9wV2lkZ2V0LT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfTVVMVElTRUxFQ1QpIHsKKyAgICBzaXplX3QgblNlbENvdW50ID0gMDsKKyAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gcExpc3RCb3gtPkdldENvdW50KCk7IGkgPCBzejsgKytpKSB7CisgICAgICBpZiAocExpc3RCb3gtPklzSXRlbVNlbGVjdGVkKGkpKSB7CisgICAgICAgIGlmIChtX09yaWdpblNlbGVjdGlvbnMuY291bnQoaSkgPT0gMCkKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgICArK25TZWxDb3VudDsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gblNlbENvdW50ICE9IG1fT3JpZ2luU2VsZWN0aW9ucy5zaXplKCk7CisgIH0KKyAgcmV0dXJuIHBMaXN0Qm94LT5HZXRDdXJTZWwoKSAhPSBtX3BXaWRnZXQtPkdldFNlbGVjdGVkSW5kZXgoMCk7CiB9CiAKLUZYX0JPT0wJQ0ZGTF9MaXN0Qm94OjpJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKLXsKLQlBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwordm9pZCBDRkZMX0xpc3RCb3g6OlNhdmVEYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgeworICBBU1NFUlQobV9wV2lkZ2V0KTsKIAotCWlmIChDUFdMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKENQV0xfTGlzdEJveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQotCXsKLQkJaWYgKG1fcFdpZGdldC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX01VTFRJU0VMRUNUKQotCQl7Ci0JCQlpbnQgblNlbENvdW50ID0gMDsKLQkJCWZvciAoRlhfSU5UMzIgaT0wLHN6PXBMaXN0Qm94LT5HZXRDb3VudCgpOyBpPHN6OyBpKyspCi0JCQl7Ci0JCQkJaWYgKHBMaXN0Qm94LT5Jc0l0ZW1TZWxlY3RlZChpKSkKLQkJCQl7Ci0JCQkJCXZvaWQqIHAgPSBOVUxMOwotCQkJCQlpZiAoIW1fT3JpZ2luU2VsZWN0aW9ucy5Mb29rdXAoaSwgcCkpCi0JCQkJCQlyZXR1cm4gVFJVRTsKKyAgaWYgKENQV0xfTGlzdEJveCogcExpc3RCb3ggPSAoQ1BXTF9MaXN0Qm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpIHsKKyAgICBDRlhfSW50QXJyYXkgYU9sZFNlbGVjdCwgYU5ld1NlbGVjdDsKIAotCQkJCQluU2VsQ291bnQrKzsKLQkJCQl9Ci0JCQl9CisgICAgeworICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gbV9wV2lkZ2V0LT5Db3VudE9wdGlvbnMoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgaWYgKG1fcFdpZGdldC0+SXNPcHRpb25TZWxlY3RlZChpKSkgeworICAgICAgICAgIGFPbGRTZWxlY3QuQWRkKGkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQogCi0JCQlyZXR1cm4gblNlbENvdW50ICE9IG1fT3JpZ2luU2VsZWN0aW9ucy5HZXRDb3VudCgpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcmV0dXJuIHBMaXN0Qm94LT5HZXRDdXJTZWwoKSAhPSBtX3BXaWRnZXQtPkdldFNlbGVjdGVkSW5kZXgoMCk7Ci0JCX0KLQl9Ci0JCi0JcmV0dXJuIEZBTFNFOworICAgIGludDMyX3Qgbk5ld1RvcEluZGV4ID0gcExpc3RCb3gtPkdldFRvcFZpc2libGVJbmRleCgpOworCisgICAgbV9wV2lkZ2V0LT5DbGVhclNlbGVjdGlvbihGQUxTRSk7CisKKyAgICBpZiAobV9wV2lkZ2V0LT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfTVVMVElTRUxFQ1QpIHsKKyAgICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBwTGlzdEJveC0+R2V0Q291bnQoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgaWYgKHBMaXN0Qm94LT5Jc0l0ZW1TZWxlY3RlZChpKSkgeworICAgICAgICAgIG1fcFdpZGdldC0+U2V0T3B0aW9uU2VsZWN0aW9uKGksIFRSVUUsIEZBTFNFKTsKKyAgICAgICAgICBhTmV3U2VsZWN0LkFkZChpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBtX3BXaWRnZXQtPlNldE9wdGlvblNlbGVjdGlvbihwTGlzdEJveC0+R2V0Q3VyU2VsKCksIFRSVUUsIEZBTFNFKTsKKyAgICAgIGFOZXdTZWxlY3QuQWRkKHBMaXN0Qm94LT5HZXRDdXJTZWwoKSk7CisgICAgfQorCisgICAgbV9wV2lkZ2V0LT5TZXRUb3BWaXNpYmxlSW5kZXgobk5ld1RvcEluZGV4KTsKKyAgICBtX3BXaWRnZXQtPlJlc2V0RmllbGRBcHBlYXJhbmNlKFRSVUUpOworICAgIG1fcFdpZGdldC0+VXBkYXRlRmllbGQoKTsKKyAgICBTZXRDaGFuZ2VNYXJrKCk7CisgIH0KIH0KIAotdm9pZCBDRkZMX0xpc3RCb3g6OlNhdmVEYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKLXsKLQlBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwotCi0JaWYgKENQV0xfTGlzdEJveCogcExpc3RCb3ggPSAoQ1BXTF9MaXN0Qm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCi0JewotCQlDRlhfSW50QXJyYXkgYU9sZFNlbGVjdCwgYU5ld1NlbGVjdDsKLQotCQl7Ci0JCQlmb3IgKGludCBpPTAsc3o9bV9wV2lkZ2V0LT5Db3VudE9wdGlvbnMoKTsgaTxzejsgaSsrKQotCQkJewotCQkJCWlmIChtX3BXaWRnZXQtPklzT3B0aW9uU2VsZWN0ZWQoaSkpCi0JCQkJewotCQkJCQlhT2xkU2VsZWN0LkFkZChpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkKLQkJRlhfSU5UMzIgbk5ld1RvcEluZGV4ID0gcExpc3RCb3gtPkdldFRvcFZpc2libGVJbmRleCgpOwotCi0JCW1fcFdpZGdldC0+Q2xlYXJTZWxlY3Rpb24oRkFMU0UpOwkKLQotCQlpZiAobV9wV2lkZ2V0LT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfTVVMVElTRUxFQ1QpCi0JCXsKLQkJCWZvciAoRlhfSU5UMzIgaT0wLHN6PXBMaXN0Qm94LT5HZXRDb3VudCgpOyBpPHN6OyBpKyspCi0JCQl7Ci0JCQkJaWYgKHBMaXN0Qm94LT5Jc0l0ZW1TZWxlY3RlZChpKSkKLQkJCQl7Ci0JCQkJCW1fcFdpZGdldC0+U2V0T3B0aW9uU2VsZWN0aW9uKGksIFRSVUUsIEZBTFNFKTsKLQkJCQkJYU5ld1NlbGVjdC5BZGQoaSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJbV9wV2lkZ2V0LT5TZXRPcHRpb25TZWxlY3Rpb24ocExpc3RCb3gtPkdldEN1clNlbCgpLCBUUlVFLCBGQUxTRSk7Ci0JCQlhTmV3U2VsZWN0LkFkZChwTGlzdEJveC0+R2V0Q3VyU2VsKCkpOwotCQl9Ci0KLQkJbV9wV2lkZ2V0LT5TZXRUb3BWaXNpYmxlSW5kZXgobk5ld1RvcEluZGV4KTsKLQkJbV9wV2lkZ2V0LT5SZXNldEZpZWxkQXBwZWFyYW5jZShUUlVFKTsKLQkJbV9wV2lkZ2V0LT5VcGRhdGVGaWVsZCgpOwotCQlTZXRDaGFuZ2VNYXJrKCk7Ci0JfQordm9pZCBDRkZMX0xpc3RCb3g6OkdldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6VmFsaWRhdGU6CisgICAgICBpZiAobV9wV2lkZ2V0LT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfTVVMVElTRUxFQ1QpIHsKKyAgICAgICAgZmEuc1ZhbHVlID0gTCIiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKENQV0xfTGlzdEJveCogcExpc3RCb3ggPQorICAgICAgICAgICAgICAgIChDUFdMX0xpc3RCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgICAgICAgIGludDMyX3QgbkN1clNlbCA9IHBMaXN0Qm94LT5HZXRDdXJTZWwoKTsKKyAgICAgICAgICBpZiAobkN1clNlbCA+PSAwKQorICAgICAgICAgICAgZmEuc1ZhbHVlID0gbV9wV2lkZ2V0LT5HZXRPcHRpb25MYWJlbChuQ3VyU2VsKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FBY3Rpb246Okxvc2VGb2N1czoKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6R2V0Rm9jdXM6CisgICAgICBpZiAobV9wV2lkZ2V0LT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfTVVMVElTRUxFQ1QpIHsKKyAgICAgICAgZmEuc1ZhbHVlID0gTCIiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50MzJfdCBuQ3VyU2VsID0gbV9wV2lkZ2V0LT5HZXRTZWxlY3RlZEluZGV4KDApOworICAgICAgICBpZiAobkN1clNlbCA+PSAwKQorICAgICAgICAgIGZhLnNWYWx1ZSA9IG1fcFdpZGdldC0+R2V0T3B0aW9uTGFiZWwobkN1clNlbCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KIH0KIAotdm9pZCBDRkZMX0xpc3RCb3g6OkdldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCi0JCQkJCQlQREZTREtfRmllbGRBY3Rpb24mIGZhKQotewotCXN3aXRjaCAodHlwZSkKLQl7Ci0JY2FzZSBDUERGX0FBY3Rpb246OlZhbGlkYXRlOgotCQlpZiAobV9wV2lkZ2V0LT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfTVVMVElTRUxFQ1QpCi0JCXsKLQkJCWZhLnNWYWx1ZSA9IEwiIjsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChDUFdMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKENQV0xfTGlzdEJveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQotCQkJewotCQkJCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7Ci0JCQkJRlhfSU5UMzIgbkN1clNlbCA9IHBMaXN0Qm94LT5HZXRDdXJTZWwoKTsKLQkJCQlpZiAobkN1clNlbCA+PSAwKQotCQkJCQlmYS5zVmFsdWUgPSBtX3BXaWRnZXQtPkdldE9wdGlvbkxhYmVsKG5DdXJTZWwpOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQ1BERl9BQWN0aW9uOjpMb3NlRm9jdXM6Ci0JY2FzZSBDUERGX0FBY3Rpb246OkdldEZvY3VzOgotCQlpZiAobV9wV2lkZ2V0LT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfTVVMVElTRUxFQ1QpCi0JCXsKLQkJCWZhLnNWYWx1ZSA9IEwiIjsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7Ci0JCQlGWF9JTlQzMiBuQ3VyU2VsID0gbV9wV2lkZ2V0LT5HZXRTZWxlY3RlZEluZGV4KDApOwotCQkJaWYgKG5DdXJTZWwgPj0gMCkKLQkJCQlmYS5zVmFsdWUgPSBtX3BXaWRnZXQtPkdldE9wdGlvbkxhYmVsKG5DdXJTZWwpOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KK3ZvaWQgQ0ZGTF9MaXN0Qm94OjpTZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmEpIHt9CisKK3ZvaWQgQ0ZGTF9MaXN0Qm94OjpTYXZlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CisgIEFTU0VSVChwUGFnZVZpZXcpOworCisgIGlmIChDUFdMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKENQV0xfTGlzdEJveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKSB7CisgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IHBMaXN0Qm94LT5HZXRDb3VudCgpOyBpIDwgc3o7IGkrKykgeworICAgICAgaWYgKHBMaXN0Qm94LT5Jc0l0ZW1TZWxlY3RlZChpKSkgeworICAgICAgICBtX1N0YXRlLkFkZChpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KIH0KIAotCi12b2lkIENGRkxfTGlzdEJveDo6U2V0QWN0aW9uRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgCi0JCQkJCQkJCWNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmEpCi17Cit2b2lkIENGRkxfTGlzdEJveDo6UmVzdG9yZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgeworICBpZiAoQ1BXTF9MaXN0Qm94KiBwTGlzdEJveCA9IChDUFdMX0xpc3RCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IG1fU3RhdGUuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKKyAgICAgIHBMaXN0Qm94LT5TZWxlY3QobV9TdGF0ZVtpXSk7CisgIH0KIH0KIAotdm9pZCBDRkZMX0xpc3RCb3g6OlNhdmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCi17Ci0JQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKK0NQV0xfV25kKiBDRkZMX0xpc3RCb3g6OlJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSkgeworICBpZiAoYlJlc3RvcmVWYWx1ZSkKKyAgICBTYXZlU3RhdGUocFBhZ2VWaWV3KTsKIAotCWlmIChDUFdMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKENQV0xfTGlzdEJveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQotCXsKLQkJZm9yIChGWF9JTlQzMiBpPTAsc3o9cExpc3RCb3gtPkdldENvdW50KCk7IGk8c3o7IGkrKykKLQkJewotCQkJaWYgKHBMaXN0Qm94LT5Jc0l0ZW1TZWxlY3RlZChpKSkKLQkJCXsKLQkJCQltX1N0YXRlLkFkZChpKTsKLQkJCX0KLQkJfQotCX0KKyAgRGVzdHJveVBERldpbmRvdyhwUGFnZVZpZXcpOworCisgIENQV0xfV25kKiBwUmV0ID0gTlVMTDsKKworICBpZiAoYlJlc3RvcmVWYWx1ZSkgeworICAgIFJlc3RvcmVTdGF0ZShwUGFnZVZpZXcpOworICAgIHBSZXQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7CisgIH0gZWxzZSB7CisgICAgcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpOworICB9CisKKyAgbV9wV2lkZ2V0LT5VcGRhdGVGaWVsZCgpOworCisgIHJldHVybiBwUmV0OwogfQotCi12b2lkIENGRkxfTGlzdEJveDo6UmVzdG9yZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKLXsKLQlpZiAoQ1BXTF9MaXN0Qm94KiBwTGlzdEJveCA9IChDUFdMX0xpc3RCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLQl7Ci0JCWZvciAoaW50IGk9MCxzej1tX1N0YXRlLkdldFNpemUoKTsgaTxzejsgaSsrKQotCQkJcExpc3RCb3gtPlNlbGVjdChtX1N0YXRlW2ldKTsKLQl9Ci19Ci0KLUNQV0xfV25kKiBDRkZMX0xpc3RCb3g6OlJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgRlhfQk9PTCBiUmVzdG9yZVZhbHVlKQotewotCWlmIChiUmVzdG9yZVZhbHVlKQotCQlTYXZlU3RhdGUocFBhZ2VWaWV3KTsKLQkKLQlEZXN0cm95UERGV2luZG93KHBQYWdlVmlldyk7Ci0JCi0JQ1BXTF9XbmQqIHBSZXQgPSBOVUxMOwotCQotCWlmIChiUmVzdG9yZVZhbHVlKQotCXsKLQkJUmVzdG9yZVN0YXRlKHBQYWdlVmlldyk7Ci0JCXBSZXQgPSB0aGlzLT5HZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7Ci0JfQotCWVsc2UKLQkJcFJldCA9IHRoaXMtPkdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpOwotCQotCW1fcFdpZGdldC0+VXBkYXRlRmllbGQoKTsKLQkKLQlyZXR1cm4gcFJldDsKLX0KLQotdm9pZCBDRkZMX0xpc3RCb3g6Ok9uS2V5U3Ryb2tlKEZYX0JPT0wgYktleURvd24sIEZYX0RXT1JEIG5GbGFnKQotewotCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7Ci0KLQlpbnQgbkZsYWdzID0gbV9wV2lkZ2V0LT5HZXRGaWVsZEZsYWdzKCk7Ci0JCi0JaWYgKG5GbGFncyAmIEZJRUxERkxBR19DT01NSVRPTlNFTENIQU5HRSkKLQl7Ci0JCWlmIChtX2JWYWxpZCkKLQkJewotCQkJQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gdGhpcy0+R2V0Q3VyUGFnZVZpZXcoKTsKLQkJCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Ci0KLQkJCWlmIChDb21taXREYXRhKHBQYWdlVmlldywgbkZsYWcpKQotCQkJewotCQkJCURlc3Ryb3lQREZXaW5kb3cocFBhZ2VWaWV3KTsKLQkJCQltX2JWYWxpZCA9IEZBTFNFOwotCQkJfQotCQl9Ci0JfQotfQotCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9Ob3RpZnkuY3BwIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfTm90aWZ5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNhYjVkYi4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9Ob3RpZnkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLS8vICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Zvcm1maWxsZXIvRm9ybUZpbGxlci5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfTm90aWZ5LmgiCi0vLyAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Db21ib0JveC5oIgotLy8gI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfTW9kdWxlLmgiCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGRkxfTm90aWZ5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vLyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0ODAwKQotCi1DRkZMX05vdGlmeTo6Q0ZGTF9Ob3RpZnkoQ0ZGTF9Gb3JtRmlsbGVyICogcEZvcm1GaWxsZXIpIDogCi0JbV9iRG9BY3Rpb25pbmcoRkFMU0UpLAotCW1fbk5vdGlmeUZsYWcoMCkKLXsKLQlBU1NFUlQocEZvcm1GaWxsZXIgIT0gTlVMTCk7Ci19Ci0KLUNGRkxfTm90aWZ5Ojp+Q0ZGTF9Ob3RpZnkoKQotewotfQotCi12b2lkIENGRkxfTm90aWZ5OjpCZWZvcmVOb3RpZnkoKQotewotCW1fbk5vdGlmeUZsYWcgKys7Ci19Ci0KLQotdm9pZCBDRkZMX05vdGlmeTo6QWZ0ZXJOb3RpZnkoKQotewotCW1fbk5vdGlmeUZsYWcgLS07Ci19Ci0KLUZYX0JPT0wgQ0ZGTF9Ob3RpZnk6Ok9uTW91c2VVcChGWF9CT09MICYgYkV4aXQpCi17Ci0JQmVmb3JlTm90aWZ5KCk7Ci0JRlhfQk9PTCBiUmV0ID0gRkFMU0U7Ly9Eb0FBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZTo6QnV0dG9uVXAsIGJFeGl0KTsKLQlBZnRlck5vdGlmeSgpOwotCXJldHVybiBiUmV0OwotfQotCi1GWF9CT09MIENGRkxfTm90aWZ5OjpPbk1vdXNlRG93bihGWF9CT09MICYgYkV4aXQpCi17Ci0JQmVmb3JlTm90aWZ5KCk7Ci0JRlhfQk9PTCBiUmV0ID0gRkFMU0U7Ly9Eb0FBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZTo6QnV0dG9uRG93biwgYkV4aXQpOwotCUFmdGVyTm90aWZ5KCk7Ci0JcmV0dXJuIGJSZXQ7Ci19Ci0KLUZYX0JPT0wgQ0ZGTF9Ob3RpZnk6Ok9uTW91c2VFbnRlcihGWF9CT09MICYgYkV4aXQpCi17Ci0JQmVmb3JlTm90aWZ5KCk7Ci0JRlhfQk9PTCBiUmV0ID0gRkFMU0U7Ly9Eb0FBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZTo6Q3Vyc29yRW50ZXIsIGJFeGl0KTsKLQlBZnRlck5vdGlmeSgpOwotCXJldHVybiBiUmV0OwotfQotCi1GWF9CT09MIENGRkxfTm90aWZ5OjpPbk1vdXNlRXhpdChGWF9CT09MICYgYkV4aXQpCi17Ci0JQmVmb3JlTm90aWZ5KCk7Ci0JRlhfQk9PTCBiUmV0ID0gRkFMU0U7Ly9Eb0FBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZTo6Q3Vyc29yRXhpdCwgYkV4aXQpOwotCUFmdGVyTm90aWZ5KCk7Ci0JcmV0dXJuIGJSZXQ7Ci19Ci0KLUZYX0JPT0wgQ0ZGTF9Ob3RpZnk6Ok9uU2V0Rm9jdXMoRlhfQk9PTCAmIGJFeGl0KQotewotCUJlZm9yZU5vdGlmeSgpOwotCUZYX0JPT0wgYlJldCA9IEZBTFNFOy8vRG9BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGU6OkdldEZvY3VzLCBiRXhpdCk7Ci0JQWZ0ZXJOb3RpZnkoKTsKLQlyZXR1cm4gYlJldDsKLX0KLQotRlhfQk9PTCBDRkZMX05vdGlmeTo6T25LaWxsRm9jdXMoRlhfQk9PTCAmIGJFeGl0KQotewotCUJlZm9yZU5vdGlmeSgpOwotCUZYX0JPT0wgYlJldCA9IEZBTFNFOy8vRG9BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGU6Okxvc2VGb2N1cywgYkV4aXQpOwotCUFmdGVyTm90aWZ5KCk7Ci0JcmV0dXJuIGJSZXQ7Ci19Ci0KLUZYX0JPT0wgQ0ZGTF9Ob3RpZnk6Ok9uQ2FsY3VsYXRlKCkKLXsKLQlyZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBDRkZMX05vdGlmeTo6T25Gb3JtYXQoaW50IGlDb21taXRLZXkpCi17Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgQ0ZGTF9Ob3RpZnk6Ok9uS2V5U3Ryb2tlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBpbnQgbkNvbW1pdEtleSwgQ0ZYX1dpZGVTdHJpbmcmIHN0clZhbHVlLCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLCAKLQkJCQkJCQkgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsIEZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgYk1vZGlmaWVyLAotCQkJCQkJCSAgIEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJXaWxsQ29tbWl0LCBGWF9CT09MIGJGaWVsZEZ1bGwsIAotCQkJCQkJCSAgIGludCYgblNlbFN0YXJ0LCBpbnQmIG5TZWxFbmQsIEZYX0JPT0wmIGJSQykKLXsKLQlyZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBDRkZMX05vdGlmeTo6T25WYWxpZGF0ZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIHN0clZhbHVlLCBDRlhfV2lkZVN0cmluZyAmIHN0ckNoYW5nZSwgCi0JCQkJCQkJCQkgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsIEZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgYk1vZGlmaWVyLAotCQkJCQkJCQkJICAgRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgJiBiUkMpCi17Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wJQ0ZGTF9Ob3RpZnk6OkRvQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsIEZYX0JPT0wgJiBiRXhpdCkKLXsKLQlpZiAodGhpcy0+bV9iRG9BY3Rpb25pbmcpIHJldHVybiBGQUxTRTsKLQkKLQlDUERGX0FjdGlvbiBhY3Rpb247Ci0JaWYgKCFGaW5kQUFjdGlvbihlQUFULGFjdGlvbikpIHJldHVybiBGQUxTRTsKLQotCXRoaXMtPm1fYkRvQWN0aW9uaW5nID0gVFJVRTsJCi0JRXhlY3V0ZUFjdGlvblRyZWUoZUFBVCxhY3Rpb24sYkV4aXQpOwkKLQl0aGlzLT5tX2JEb0FjdGlvbmluZyA9IEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1GWF9CT09MCUNGRkxfTm90aWZ5OjpFeGVjdXRlQWN0aW9uVHJlZShDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsQ1BERl9BY3Rpb24gJiBhY3Rpb24sIEZYX0JPT0wmIGJFeGl0KQotewotCWlmICghRXhlY3V0ZUFjdGlvbihlQUFULGFjdGlvbixiRXhpdCkpIHJldHVybiBGQUxTRTsKLQlpZiAoYkV4aXQpIHJldHVybiBUUlVFOwotCi0JZm9yIChGWF9JTlQzMiBpPTAsc3o9YWN0aW9uLkdldFN1YkFjdGlvbnNDb3VudCgpOyBpPHN6OyBpKyspCi0JewotCQlDUERGX0FjdGlvbiBzdWJhY3Rpb24gPSBhY3Rpb24uR2V0U3ViQWN0aW9uKGkpOwotCQlpZiAoIUV4ZWN1dGVBY3Rpb25UcmVlKGVBQVQsc3ViYWN0aW9uLGJFeGl0KSkgcmV0dXJuIEZBTFNFOwotCQlpZiAoYkV4aXQpIGJyZWFrOwotCX0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLUZYX0JPT0wJQ0ZGTF9Ob3RpZnk6OkZpbmRBQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCxDUERGX0FjdGlvbiAmIGFjdGlvbikKLXsKLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wgQ0ZGTF9Ob3RpZnk6OkZpbmRBQWN0aW9uKENQREZfQUFjdGlvbiBhYWN0aW9uLENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCxDUERGX0FjdGlvbiAmIGFjdGlvbikKLXsKLQlDUERGX0FjdGlvbiBNeUFjdGlvbjsKLQotCWlmIChhYWN0aW9uLkFjdGlvbkV4aXN0KGVBQVQpKQotCXsKLQkJTXlBY3Rpb24gPSBhYWN0aW9uLkdldEFjdGlvbihlQUFUKTsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7Ci0KLQotCWlmIChNeUFjdGlvbi5HZXRUeXBlKCkgPT0gQ1BERl9BY3Rpb246OlVua25vd24pCi0JCXJldHVybiBGQUxTRTsKLQotCWFjdGlvbiA9IE15QWN0aW9uOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wJQ0ZGTF9Ob3RpZnk6OkV4ZWN1dGVBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFULENQREZfQWN0aW9uICYgYWN0aW9uLEZYX0JPT0wmIGJFeGl0KQotewotCXJldHVybiBGQUxTRTsKLX0KLS8vI3ByYWdtYSB3YXJuaW5nKGRlZmF1bHQ6IDQ4MDApCi0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1B1c2hCdXR0b24uY3BwIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfUHVzaEJ1dHRvbi5jcHAKaW5kZXggYjhhMDdmYi4uZDViZDUwOSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfUHVzaEJ1dHRvbi5jcHAKKysrIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfUHVzaEJ1dHRvbi5jcHAKQEAgLTEsNDMgKzEsMzggQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9Gb3JtRmlsbGVyLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Gb3JtRmlsbGVyLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9QdXNoQnV0dG9uLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1B1c2hCdXR0b24uaCIKIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRkZMX1B1c2hCdXR0b24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Gb3JtRmlsbGVyLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU3BlY2lhbEJ1dHRvbi5oIgogCi1DRkZMX1B1c2hCdXR0b246OkNGRkxfUHVzaEJ1dHRvbihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOgotCUNGRkxfQnV0dG9uKCBwQXBwLCBwQW5ub3QpCi17CitDRkZMX1B1c2hCdXR0b246OkNGRkxfUHVzaEJ1dHRvbihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90KQorICAgIDogQ0ZGTF9CdXR0b24ocEFwcCwgcEFubm90KSB7fQorCitDRkZMX1B1c2hCdXR0b246On5DRkZMX1B1c2hCdXR0b24oKSB7fQorCitDUFdMX1duZCogQ0ZGTF9QdXNoQnV0dG9uOjpOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKKyAgQ1BXTF9QdXNoQnV0dG9uKiBwV25kID0gbmV3IENQV0xfUHVzaEJ1dHRvbigpOworICBwV25kLT5DcmVhdGUoY3ApOworCisgIHJldHVybiBwV25kOwogfQogCi1DRkZMX1B1c2hCdXR0b246On5DRkZMX1B1c2hCdXR0b24oKQoteworRlhfQk9PTCBDRkZMX1B1c2hCdXR0b246Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzKSB7CisgIHJldHVybiBDRkZMX0Zvcm1GaWxsZXI6Ok9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOwogfQogCi1DUFdMX1duZCogQ0ZGTF9QdXNoQnV0dG9uOjpOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQotewotCUNQV0xfUHVzaEJ1dHRvbiogcFduZCA9IG5ldyBDUFdMX1B1c2hCdXR0b24oKTsKLQlwV25kLT5DcmVhdGUoY3ApOwotCQotCXJldHVybiBwV25kOwordm9pZCBDRkZMX1B1c2hCdXR0b246Ok9uRHJhdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKSB7CisgIENGRkxfQnV0dG9uOjpPbkRyYXcocFBhZ2VWaWV3LCBwQW5ub3QsIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgZHdGbGFncyk7CiB9Ci0KLQotRlhfQk9PTAlDRkZMX1B1c2hCdXR0b246Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQotewotCXJldHVybiBDRkZMX0Zvcm1GaWxsZXI6Ok9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOwotfQotCi12b2lkIENGRkxfUHVzaEJ1dHRvbjo6T25EcmF3KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgIENQREZTREtfQW5ub3QqIHBBbm5vdCwgCi0JCQkJCQkJIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0JCQkJCQkJIEZYX0RXT1JEIGR3RmxhZ3MpCi17Ci0JQ0ZGTF9CdXR0b246Ok9uRHJhdyhwUGFnZVZpZXcsIHBBbm5vdCwgcERldmljZSwgcFVzZXIyRGV2aWNlLCBkd0ZsYWdzKTsKLX0KLQotCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9SYWRpb0J1dHRvbi5jcHAgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9SYWRpb0J1dHRvbi5jcHAKaW5kZXggYWFjYjdkOC4uMmE3NDJjMCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfUmFkaW9CdXR0b24uY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1JhZGlvQnV0dG9uLmNwcApAQCAtMSwxMzcgKzEsMTIxIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Zvcm1maWxsZXIvRm9ybUZpbGxlci5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfUmFkaW9CdXR0b24uaCIKLS8vI2luY2x1ZGUgIi4uL2luY2x1ZGUvRkZMX1VuZG8uaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfUmFkaW9CdXR0b24uaCIKIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRkZMX1JhZGlvQnV0dG9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mc2RrX21nci5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1NwZWNpYWxCdXR0b24uaCIKIAotQ0ZGTF9SYWRpb0J1dHRvbjo6Q0ZGTF9SYWRpb0J1dHRvbihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwV2lkZ2V0KSA6Ci0JQ0ZGTF9CdXR0b24ocEFwcCwgcFdpZGdldCkKLXsKK0NGRkxfUmFkaW9CdXR0b246OkNGRkxfUmFkaW9CdXR0b24oQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFdpZGdldCkKKyAgICA6IENGRkxfQnV0dG9uKHBBcHAsIHBXaWRnZXQpIHt9CisKK0NGRkxfUmFkaW9CdXR0b246On5DRkZMX1JhZGlvQnV0dG9uKCkge30KKworQ1BXTF9XbmQqIENGRkxfUmFkaW9CdXR0b246Ok5ld1BERldpbmRvdyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKKyAgQ1BXTF9SYWRpb0J1dHRvbiogcFduZCA9IG5ldyBDUFdMX1JhZGlvQnV0dG9uKCk7CisgIHBXbmQtPkNyZWF0ZShjcCk7CisKKyAgcFduZC0+U2V0Q2hlY2sobV9wV2lkZ2V0LT5Jc0NoZWNrZWQoKSk7CisKKyAgcmV0dXJuIHBXbmQ7CiB9CiAKLUNGRkxfUmFkaW9CdXR0b246On5DRkZMX1JhZGlvQnV0dG9uKCkKLXsKK0ZYX0JPT0wgQ0ZGTF9SYWRpb0J1dHRvbjo6T25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbktleUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncykgeworICBzd2l0Y2ggKG5LZXlDb2RlKSB7CisgICAgY2FzZSBGV0xfVktFWV9SZXR1cm46CisgICAgY2FzZSBGV0xfVktFWV9TcGFjZToKKyAgICAgIHJldHVybiBUUlVFOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gQ0ZGTF9Gb3JtRmlsbGVyOjpPbktleURvd24ocEFubm90LCBuS2V5Q29kZSwgbkZsYWdzKTsKKyAgfQogfQogCi1DUFdMX1duZCogQ0ZGTF9SYWRpb0J1dHRvbjo6TmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKLXsKLQlDUFdMX1JhZGlvQnV0dG9uKiBwV25kID0gbmV3IENQV0xfUmFkaW9CdXR0b24oKTsKLQlwV25kLT5DcmVhdGUoY3ApOworRlhfQk9PTCBDRkZMX1JhZGlvQnV0dG9uOjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWdzKSB7CisgIHN3aXRjaCAobkNoYXIpIHsKKyAgICBjYXNlIEZXTF9WS0VZX1JldHVybjoKKyAgICBjYXNlIEZXTF9WS0VZX1NwYWNlOiB7CisgICAgICBDRkZMX0lGb3JtRmlsbGVyKiBwSUZvcm1GaWxsZXIgPSBtX3BBcHAtPkdldElGb3JtRmlsbGVyKCk7CisgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwQW5ub3QtPkdldFBhZ2VWaWV3KCk7CisgICAgICBBU1NFUlQocFBhZ2VWaWV3KTsKIAotCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7Ci0JcFduZC0+U2V0Q2hlY2sobV9wV2lkZ2V0LT5Jc0NoZWNrZWQoKSk7Ci0JCi0JcmV0dXJuIHBXbmQ7CisgICAgICBGWF9CT09MIGJSZXNldCA9IEZBTFNFOworICAgICAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOworCisgICAgICBwSUZvcm1GaWxsZXItPk9uQnV0dG9uVXAobV9wV2lkZ2V0LCBwUGFnZVZpZXcsIGJSZXNldCwgYkV4aXQsIG5GbGFncyk7CisKKyAgICAgIGlmIChiUmVzZXQpCisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgaWYgKGJFeGl0KQorICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKKworICAgICAgaWYgKENQV0xfUmFkaW9CdXR0b24qIHBXbmQgPQorICAgICAgICAgICAgICAoQ1BXTF9SYWRpb0J1dHRvbiopR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCisgICAgICAgIHBXbmQtPlNldENoZWNrKFRSVUUpOworICAgICAgQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFncyk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBDRkZMX0Zvcm1GaWxsZXI6Ok9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOworICB9CiB9CiAKLUZYX0JPT0wJQ0ZGTF9SYWRpb0J1dHRvbjo6T25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfVUlOVCBuS2V5Q29kZSwgRlhfVUlOVCBuRmxhZ3MpCi17Ci0Jc3dpdGNoIChuS2V5Q29kZSkKLQl7Ci0JY2FzZSBGV0xfVktFWV9SZXR1cm46Ci0JY2FzZSBGV0xfVktFWV9TcGFjZToKLQkJcmV0dXJuIFRSVUU7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIENGRkxfRm9ybUZpbGxlcjo6T25LZXlEb3duKHBBbm5vdCwgbktleUNvZGUsIG5GbGFncyk7Ci0JfQorRlhfQk9PTCBDRkZMX1JhZGlvQnV0dG9uOjpPbkxCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIENGRkxfQnV0dG9uOjpPbkxCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CisKKyAgaWYgKElzVmFsaWQoKSkgeworICAgIGlmIChDUFdMX1JhZGlvQnV0dG9uKiBwV25kID0KKyAgICAgICAgICAgIChDUFdMX1JhZGlvQnV0dG9uKilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKSkKKyAgICAgIHBXbmQtPlNldENoZWNrKFRSVUUpOworCisgICAgaWYgKCFDb21taXREYXRhKHBQYWdlVmlldywgbkZsYWdzKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MCUNGRkxfUmFkaW9CdXR0b246Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkNoYXIsIEZYX1VJTlQgbkZsYWdzKQotewotCXN3aXRjaCAobkNoYXIpCi0JewotCWNhc2UgRldMX1ZLRVlfUmV0dXJuOgkKLQljYXNlIEZXTF9WS0VZX1NwYWNlOgotCQl7Ci0JCQlDRkZMX0lGb3JtRmlsbGVyKiBwSUZvcm1GaWxsZXIgPSBtX3BBcHAtPkdldElGb3JtRmlsbGVyKCk7Ci0JCQlBU1NFUlQocElGb3JtRmlsbGVyICE9IE5VTEwpOworRlhfQk9PTCBDRkZMX1JhZGlvQnV0dG9uOjpJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgeworICBpZiAoQ1BXTF9SYWRpb0J1dHRvbiogcFduZCA9CisgICAgICAgICAgKENQV0xfUmFkaW9CdXR0b24qKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgIHJldHVybiBwV25kLT5Jc0NoZWNrZWQoKSAhPSBtX3BXaWRnZXQtPklzQ2hlY2tlZCgpOworICB9CiAKLQkJCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBBbm5vdC0+R2V0UGFnZVZpZXcoKTsKLQkJCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Ci0KLQkJCUZYX0JPT0wgYlJlc2V0ID0gRkFMU0U7Ci0JCQlGWF9CT09MIGJFeGl0ID0gRkFMU0U7Ci0KLQkJCXBJRm9ybUZpbGxlci0+T25CdXR0b25VcChtX3BXaWRnZXQsIHBQYWdlVmlldywgYlJlc2V0LCBiRXhpdCxuRmxhZ3MpOwotCi0JCQlpZiAoYlJlc2V0KSByZXR1cm4gVFJVRTsKLQkJCWlmIChiRXhpdCkgcmV0dXJuIFRSVUU7Ci0KLQkJCUNGRkxfRm9ybUZpbGxlcjo6T25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFncyk7Ci0KLQkJCWlmIChDUFdMX1JhZGlvQnV0dG9uICogcFduZCA9IChDUFdMX1JhZGlvQnV0dG9uKilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKSkKLQkJCQlwV25kLT5TZXRDaGVjayhUUlVFKTsKLQkJCUNvbW1pdERhdGEocFBhZ2VWaWV3LG5GbGFncyk7Ci0JCQlyZXR1cm4gVFJVRTsKLQkJfQotCWRlZmF1bHQ6Ci0JCXJldHVybiBDRkZMX0Zvcm1GaWxsZXI6Ok9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOwotCX0KKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MCUNGRkxfUmFkaW9CdXR0b246Ok9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0JQ0ZGTF9CdXR0b246Ok9uTEJ1dHRvblVwKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKK3ZvaWQgQ0ZGTF9SYWRpb0J1dHRvbjo6U2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CisgIGlmIChDUFdMX1JhZGlvQnV0dG9uKiBwV25kID0KKyAgICAgICAgICAoQ1BXTF9SYWRpb0J1dHRvbiopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKSB7CisgICAgRlhfQk9PTCBiTmV3Q2hlY2tlZCA9IHBXbmQtPklzQ2hlY2tlZCgpOwogCi0JaWYgKElzVmFsaWQoKSkKLQl7Ci0JCWlmIChDUFdMX1JhZGlvQnV0dG9uICogcFduZCA9IChDUFdMX1JhZGlvQnV0dG9uKilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKSkKLQkJCXBXbmQtPlNldENoZWNrKFRSVUUpOworICAgIGlmIChiTmV3Q2hlY2tlZCkgeworICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcFdpZGdldC0+R2V0Rm9ybUZpZWxkKCk7CisgICAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gcEZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICAgIGlmIChDUERGX0Zvcm1Db250cm9sKiBwQ3RybCA9IHBGaWVsZC0+R2V0Q29udHJvbChpKSkgeworICAgICAgICAgIGlmIChwQ3RybC0+SXNDaGVja2VkKCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KIAotCQlpZiAoIUNvbW1pdERhdGEocFBhZ2VWaWV3LG5GbGFncykpIHJldHVybiBGQUxTRTsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKKyAgICBtX3BXaWRnZXQtPlNldENoZWNrKGJOZXdDaGVja2VkLCBGQUxTRSk7CisgICAgbV9wV2lkZ2V0LT5VcGRhdGVGaWVsZCgpOworICAgIFNldENoYW5nZU1hcmsoKTsKKyAgfQogfQotCi1GWF9CT09MCUNGRkxfUmFkaW9CdXR0b246OklzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQotewotCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7Ci0KLQlpZiAoQ1BXTF9SYWRpb0J1dHRvbiogcFduZCA9IChDUFdMX1JhZGlvQnV0dG9uKilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCi0JewotCQlyZXR1cm4gcFduZC0+SXNDaGVja2VkKCkgIT0gbV9wV2lkZ2V0LT5Jc0NoZWNrZWQoKTsKLQl9Ci0KLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLXZvaWQgQ0ZGTF9SYWRpb0J1dHRvbjo6U2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQotewotCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7Ci0KLQlpZiAoQ1BXTF9SYWRpb0J1dHRvbiogcFduZCA9IChDUFdMX1JhZGlvQnV0dG9uKilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCi0JewotCQkKLQkJRlhfQk9PTCBiTmV3Q2hlY2tlZCA9IHBXbmQtPklzQ2hlY2tlZCgpOwotCi0JCWlmIChiTmV3Q2hlY2tlZCkKLQkJewotCQkJQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcFdpZGdldC0+R2V0Rm9ybUZpZWxkKCk7Ci0JCQlBU1NFUlQocEZpZWxkICE9IE5VTEwpOwotCi0JCQlmb3IgKEZYX0lOVDMyIGk9MCxzej1wRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaTxzejsgaSsrKQotCQkJewotCQkJCWlmIChDUERGX0Zvcm1Db250cm9sKiBwQ3RybCA9IHBGaWVsZC0+R2V0Q29udHJvbChpKSkKLQkJCQl7Ci0JCQkJCWlmIChwQ3RybC0+SXNDaGVja2VkKCkpCi0JCQkJCXsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJbV9wV2lkZ2V0LT5TZXRDaGVjayhiTmV3Q2hlY2tlZCwgRkFMU0UpOwotCQltX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7Ci0JCVNldENoYW5nZU1hcmsoKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1RleHRGaWVsZC5jcHAgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9UZXh0RmllbGQuY3BwCmluZGV4IGY0ODhmYWMuLmNhNGUwN2IgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1RleHRGaWVsZC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfVGV4dEZpZWxkLmNwcApAQCAtMSwzODIgKzEsMjkyIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX1RleHRGaWVsZC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfQ0JBX0ZvbnRtYXAuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfVGV4dEZpZWxkLmgiCiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0ZGTF9UZXh0RmllbGQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9DQkFfRm9udG1hcC5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mc2RrX2NvbW1vbi5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mc2RrX21nci5oIgogCi1DRkZMX1RleHRGaWVsZDo6Q0ZGTF9UZXh0RmllbGQoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19Bbm5vdCogcEFubm90KSA6Ci0JQ0ZGTF9Gb3JtRmlsbGVyKHBBcHAsIHBBbm5vdCksCi0JbV9wRm9udE1hcChOVUxMKS8vLAotCS8vbV9wU3BlbGxDaGVjayhOVUxMKQotewotCW1fU3RhdGUublN0YXJ0ID0gbV9TdGF0ZS5uRW5kID0gMDsKK0NGRkxfVGV4dEZpZWxkOjpDRkZMX1RleHRGaWVsZChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwQW5ub3QpCisgICAgOiBDRkZMX0Zvcm1GaWxsZXIocEFwcCwgcEFubm90KSwgbV9wRm9udE1hcChOVUxMKSB7CisgIG1fU3RhdGUublN0YXJ0ID0gbV9TdGF0ZS5uRW5kID0gMDsKIH0KIAotQ0ZGTF9UZXh0RmllbGQ6On5DRkZMX1RleHRGaWVsZCgpCi17Ci0JaWYgKG1fcEZvbnRNYXApCi0JewotCQlkZWxldGUgbV9wRm9udE1hcDsKLQkJbV9wRm9udE1hcCA9IE5VTEw7Ci0JfQotCitDRkZMX1RleHRGaWVsZDo6fkNGRkxfVGV4dEZpZWxkKCkgeworICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogbV9NYXBzKQorICAgIGl0LnNlY29uZC0+SW52YWxpZGF0ZUZvY3VzSGFuZGxlcih0aGlzKTsKKyAgZGVsZXRlIG1fcEZvbnRNYXA7CiB9CiAKLVBXTF9DUkVBVEVQQVJBTSBDRkZMX1RleHRGaWVsZDo6R2V0Q3JlYXRlUGFyYW0oKQotewotCVBXTF9DUkVBVEVQQVJBTSBjcCA9IENGRkxfRm9ybUZpbGxlcjo6R2V0Q3JlYXRlUGFyYW0oKTsKK1BXTF9DUkVBVEVQQVJBTSBDRkZMX1RleHRGaWVsZDo6R2V0Q3JlYXRlUGFyYW0oKSB7CisgIFBXTF9DUkVBVEVQQVJBTSBjcCA9IENGRkxfRm9ybUZpbGxlcjo6R2V0Q3JlYXRlUGFyYW0oKTsKIAotCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7Ci0JaW50IG5GbGFncyA9IG1fcFdpZGdldC0+R2V0RmllbGRGbGFncygpOworICBpbnQgbkZsYWdzID0gbV9wV2lkZ2V0LT5HZXRGaWVsZEZsYWdzKCk7CiAKKyAgaWYgKG5GbGFncyAmIEZJRUxERkxBR19QQVNTV09SRCkgeworICAgIGNwLmR3RmxhZ3MgfD0gUEVTX1BBU1NXT1JEOworICB9CiAKLQlpZiAobkZsYWdzICYgRklFTERGTEFHX1BBU1NXT1JEKQotCXsJCQotCQljcC5kd0ZsYWdzIHw9IFBFU19QQVNTV09SRDsKLQl9CisgIGlmICghKG5GbGFncyAmIEZJRUxERkxBR19ET05PVFNQRUxMQ0hFQ0spKSB7CisgIH0KIAotCWlmICghKG5GbGFncyAmIEZJRUxERkxBR19ET05PVFNQRUxMQ0hFQ0spKQotCXsJCQotCX0KKyAgaWYgKG5GbGFncyAmIEZJRUxERkxBR19NVUxUSUxJTkUpIHsKKyAgICBjcC5kd0ZsYWdzIHw9IFBFU19NVUxUSUxJTkUgfCBQRVNfQVVUT1JFVFVSTiB8IFBFU19UT1A7CiAKLQlpZiAobkZsYWdzICYgRklFTERGTEFHX01VTFRJTElORSkKLQl7CQkKLQkJY3AuZHdGbGFncyB8PSBQRVNfTVVMVElMSU5FIHwgUEVTX0FVVE9SRVRVUk4gfCBQRVNfVE9QOworICAgIGlmICghKG5GbGFncyAmIEZJRUxERkxBR19ET05PVFNDUk9MTCkpIHsKKyAgICAgIGNwLmR3RmxhZ3MgfD0gUFdTX1ZTQ1JPTEwgfCBQRVNfQVVUT1NDUk9MTDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgY3AuZHdGbGFncyB8PSBQRVNfQ0VOVEVSOwogCi0JCWlmICghKG5GbGFncyAmIEZJRUxERkxBR19ET05PVFNDUk9MTCkpCi0JCXsKLQkJCWNwLmR3RmxhZ3MgfD0gUFdTX1ZTQ1JPTEwgfCBQRVNfQVVUT1NDUk9MTDsKLQkJfQotCX0KLQllbHNlCi0JewotCQljcC5kd0ZsYWdzIHw9IFBFU19DRU5URVI7CisgICAgaWYgKCEobkZsYWdzICYgRklFTERGTEFHX0RPTk9UU0NST0xMKSkgeworICAgICAgY3AuZHdGbGFncyB8PSBQRVNfQVVUT1NDUk9MTDsKKyAgICB9CisgIH0KIAotCQlpZiAoIShuRmxhZ3MgJiBGSUVMREZMQUdfRE9OT1RTQ1JPTEwpKQotCQl7Ci0JCQljcC5kd0ZsYWdzIHw9IFBFU19BVVRPU0NST0xMOwotCQl9Ci0JfQorICBpZiAobkZsYWdzICYgRklFTERGTEFHX0NPTUIpIHsKKyAgICBjcC5kd0ZsYWdzIHw9IFBFU19DSEFSQVJSQVk7CisgIH0KIAotCWlmIChuRmxhZ3MgJiBGSUVMREZMQUdfQ09NQikKLQl7CQkKLQkJY3AuZHdGbGFncyB8PSBQRVNfQ0hBUkFSUkFZOwotCX0KKyAgaWYgKG5GbGFncyAmIEZJRUxERkxBR19SSUNIVEVYVCkgeworICAgIGNwLmR3RmxhZ3MgfD0gUEVTX1JJQ0g7CisgIH0KIAotCWlmIChuRmxhZ3MgJiBGSUVMREZMQUdfUklDSFRFWFQpCi0JewkJCi0JCWNwLmR3RmxhZ3MgfD0gUEVTX1JJQ0g7Ci0JfQorICBjcC5kd0ZsYWdzIHw9IFBFU19VTkRPOwogCi0JY3AuZHdGbGFncyB8PSBQRVNfVU5ETzsKLQkKLSAJc3dpdGNoIChtX3BXaWRnZXQtPkdldEFsaWdubWVudCgpKQotIAl7Ci0gCWRlZmF1bHQ6Ci0gCWNhc2UgQkZfQUxJR05fTEVGVDoKLSAJCWNwLmR3RmxhZ3MgfD0gUEVTX0xFRlQ7Ci0gCQlicmVhazsKLSAJY2FzZSBCRl9BTElHTl9NSURETEU6Ci0gCQljcC5kd0ZsYWdzIHw9IFBFU19NSURETEU7Ci0gCQlicmVhazsKLSAJY2FzZSBCRl9BTElHTl9SSUdIVDoKLSAJCWNwLmR3RmxhZ3MgfD0gUEVTX1JJR0hUOwotIAkJYnJlYWs7Ci0gCX0KKyAgc3dpdGNoIChtX3BXaWRnZXQtPkdldEFsaWdubWVudCgpKSB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIEJGX0FMSUdOX0xFRlQ6CisgICAgICBjcC5kd0ZsYWdzIHw9IFBFU19MRUZUOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCRl9BTElHTl9NSURETEU6CisgICAgICBjcC5kd0ZsYWdzIHw9IFBFU19NSURETEU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJGX0FMSUdOX1JJR0hUOgorICAgICAgY3AuZHdGbGFncyB8PSBQRVNfUklHSFQ7CisgICAgICBicmVhazsKKyAgfQogCi0JaWYgKCFtX3BGb250TWFwKQotCXsKLQkJQVNTRVJUKHRoaXMtPm1fcEFwcCAhPSBOVUxMKTsKLQkJbV9wRm9udE1hcCA9IG5ldyBDQkFfRm9udE1hcChtX3BXaWRnZXQsIC8qSVN5c3RlbUhhbmRsZTo6R2V0U3lzdGVtSGFuZGxlcihtX3BBcHApKi9tX3BBcHAtPkdldFN5c0hhbmRsZXIoKSk7Ci0JCW1fcEZvbnRNYXAtPkluaXRpYWwoKTsKLQl9Ci0JY3AucEZvbnRNYXAgPSBtX3BGb250TWFwOwotCWNwLnBGb2N1c0hhbmRsZXIgPSB0aGlzOworICBpZiAoIW1fcEZvbnRNYXApCisgICAgbV9wRm9udE1hcCA9IG5ldyBDQkFfRm9udE1hcChtX3BXaWRnZXQsIG1fcEFwcC0+R2V0U3lzSGFuZGxlcigpKTsKKyAgY3AucEZvbnRNYXAgPSBtX3BGb250TWFwOworICBjcC5wRm9jdXNIYW5kbGVyID0gdGhpczsKIAotCXJldHVybiBjcDsKKyAgcmV0dXJuIGNwOwogfQogCi1DUFdMX1duZCogQ0ZGTF9UZXh0RmllbGQ6Ok5ld1BERldpbmRvdyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwLCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCi17Ci0JQ1BXTF9FZGl0ICogcFduZCA9IG5ldyBDUFdMX0VkaXQoKTsKLQkJcFduZC0+QXR0YWNoRkZMRGF0YSh0aGlzKTsKLQlwV25kLT5DcmVhdGUoY3ApOworQ1BXTF9XbmQqIENGRkxfVGV4dEZpZWxkOjpOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgeworICBDUFdMX0VkaXQqIHBXbmQgPSBuZXcgQ1BXTF9FZGl0KCk7CisgIHBXbmQtPkF0dGFjaEZGTERhdGEodGhpcyk7CisgIHBXbmQtPkNyZWF0ZShjcCk7CiAKKyAgQ0ZGTF9JRm9ybUZpbGxlciogcElGb3JtRmlsbGVyID0gbV9wQXBwLT5HZXRJRm9ybUZpbGxlcigpOworICBwV25kLT5TZXRGaWxsZXJOb3RpZnkocElGb3JtRmlsbGVyKTsKIAorICBpbnQzMl90IG5NYXhMZW4gPSBtX3BXaWRnZXQtPkdldE1heExlbigpOworICBDRlhfV2lkZVN0cmluZyBzd1ZhbHVlID0gbV9wV2lkZ2V0LT5HZXRWYWx1ZSgpOwogCi0JQVNTRVJUKG1fcEFwcCAhPSBOVUxMKTsKLQlDRkZMX0lGb3JtRmlsbGVyKiBwSUZvcm1GaWxsZXIgPSBtX3BBcHAtPkdldElGb3JtRmlsbGVyKCk7Ci0JcFduZC0+U2V0RmlsbGVyTm90aWZ5KHBJRm9ybUZpbGxlcik7CisgIGlmIChuTWF4TGVuID4gMCkgeworICAgIGlmIChwV25kLT5IYXNGbGFnKFBFU19DSEFSQVJSQVkpKSB7CisgICAgICBwV25kLT5TZXRDaGFyQXJyYXkobk1heExlbik7CisgICAgICBwV25kLT5TZXRBbGlnbkZvcm1hdFYoUEVBVl9DRU5URVIpOworICAgIH0gZWxzZSB7CisgICAgICBwV25kLT5TZXRMaW1pdENoYXIobk1heExlbik7CisgICAgfQorICB9CiAKLQlBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwotCUZYX0lOVDMyIG5NYXhMZW4gPSBtX3BXaWRnZXQtPkdldE1heExlbigpOwotCUNGWF9XaWRlU3RyaW5nIHN3VmFsdWUgPSBtX3BXaWRnZXQtPkdldFZhbHVlKCk7Ci0JCi0JaWYgKG5NYXhMZW4gPiAwKQotCXsKLQkJaWYgKHBXbmQtPkhhc0ZsYWcoUEVTX0NIQVJBUlJBWSkpCi0JCXsKLQkJCXBXbmQtPlNldENoYXJBcnJheShuTWF4TGVuKTsKLQkJCXBXbmQtPlNldEFsaWduRm9ybWF0VihQRUFWX0NFTlRFUik7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwV25kLT5TZXRMaW1pdENoYXIobk1heExlbik7Ci0JCX0KLQl9Ci0KLQlwV25kLT5TZXRUZXh0KHN3VmFsdWUuY19zdHIoKSk7Ci0JcmV0dXJuIHBXbmQ7CisgIHBXbmQtPlNldFRleHQoc3dWYWx1ZS5jX3N0cigpKTsKKyAgcmV0dXJuIHBXbmQ7CiB9CiAKK0ZYX0JPT0wgQ0ZGTF9UZXh0RmllbGQ6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5GbGFncykgeworICBzd2l0Y2ggKG5DaGFyKSB7CisgICAgY2FzZSBGV0xfVktFWV9SZXR1cm46CisgICAgICBpZiAoIShtX3BXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19NVUxUSUxJTkUpKSB7CisgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KCk7CisgICAgICAgIEFTU0VSVChwUGFnZVZpZXcpOworICAgICAgICBtX2JWYWxpZCA9ICFtX2JWYWxpZDsKKyAgICAgICAgQ1BERl9SZWN0IHJjQW5ub3QgPSBwQW5ub3QtPkdldFJlY3QoKTsKKyAgICAgICAgbV9wQXBwLT5GRklfSW52YWxpZGF0ZShwQW5ub3QtPkdldFVuZGVybHlpbmdQYWdlKCksIHJjQW5ub3QubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0Fubm90LnRvcCwgcmNBbm5vdC5yaWdodCwgcmNBbm5vdC5ib3R0b20pOwogCi1GWF9CT09MCUNGRkxfVGV4dEZpZWxkOjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5DaGFyLCBGWF9VSU5UIG5GbGFncykKLXsKLQlzd2l0Y2ggKG5DaGFyKQotCXsKLQljYXNlIEZXTF9WS0VZX1JldHVybjoKLSAJCWlmICghKG1fcFdpZGdldC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX01VTFRJTElORSkpCi0gCQl7Ci0gCQkJQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gdGhpcy0+R2V0Q3VyUGFnZVZpZXcoKTsKLSAJCQlBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwotIAkJCW1fYlZhbGlkID0gIW1fYlZhbGlkOwotCQkJQ1BERl9SZWN0IHJjQW5ub3QgPSBwQW5ub3QtPkdldFJlY3QoKTsKLQkJCW1fcEFwcC0+RkZJX0ludmFsaWRhdGUocEFubm90LT5HZXRQREZQYWdlKCksIHJjQW5ub3QubGVmdCwgcmNBbm5vdC50b3AsIHJjQW5ub3QucmlnaHQsIHJjQW5ub3QuYm90dG9tKTsKLSAKLSAJCQlpZiAobV9iVmFsaWQpCi0gCQkJewotIAkJCQlpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKSkKLSAJCQkJCXBXbmQtPlNldEZvY3VzKCk7Ci0gCQkJfQotIAkJCWVsc2UKLSAJCQl7Ci0gCQkJCWlmIChDb21taXREYXRhKHBQYWdlVmlldywgbkZsYWdzKSkKLSAJCQkJewotIAkJCQkJRGVzdHJveVBERldpbmRvdyhwUGFnZVZpZXcpOwotIAkJCQkJcmV0dXJuIFRSVUU7Ci0gCQkJCX0KLSAJCQkJZWxzZQotIAkJCQl7Ci0gCQkJCQlyZXR1cm4gRkFMU0U7Ci0gCQkJCX0KLSAJCQl9Ci0gCQl9Ci0JCWJyZWFrOwotCWNhc2UgRldMX1ZLRVlfRXNjYXBlOgotCQl7Ci0JCQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSB0aGlzLT5HZXRDdXJQYWdlVmlldygpOwotCQkJQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKLQkJCUVzY2FwZUZpbGxlcihwUGFnZVZpZXcsVFJVRSk7Ci0JCQlyZXR1cm4gVFJVRTsKLQkJfQotCX0KKyAgICAgICAgaWYgKG1fYlZhbGlkKSB7CisgICAgICAgICAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSkpCisgICAgICAgICAgICBwV25kLT5TZXRGb2N1cygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChDb21taXREYXRhKHBQYWdlVmlldywgbkZsYWdzKSkgeworICAgICAgICAgICAgRGVzdHJveVBERldpbmRvdyhwUGFnZVZpZXcpOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBGV0xfVktFWV9Fc2NhcGU6IHsKKyAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KCk7CisgICAgICBBU1NFUlQocFBhZ2VWaWV3KTsKKyAgICAgIEVzY2FwZUZpbGxlcihwUGFnZVZpZXcsIFRSVUUpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CiAKLQlyZXR1cm4gQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKKyAgcmV0dXJuIENGRkxfRm9ybUZpbGxlcjo6T25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFncyk7CiB9CiAKLUZYX0JPT0wJQ0ZGTF9UZXh0RmllbGQ6OklzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQotewotCUFTU0VSVChtX3BXaWRnZXQgIT0gTlVMTCk7CitGWF9CT09MIENGRkxfVGV4dEZpZWxkOjpJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgeworICBpZiAoQ1BXTF9FZGl0KiBwRWRpdCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKKyAgICByZXR1cm4gcEVkaXQtPkdldFRleHQoKSAhPSBtX3BXaWRnZXQtPkdldFZhbHVlKCk7CiAKLSAJaWYgKENQV0xfRWRpdCAqIHBFZGl0ID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQotIAkJcmV0dXJuIHBFZGl0LT5HZXRUZXh0KCkgIT0gbV9wV2lkZ2V0LT5HZXRWYWx1ZSgpOwotCi0JcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9CiAKLXZvaWQgQ0ZGTF9UZXh0RmllbGQ6OlNhdmVEYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKLXsKLQlBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwordm9pZCBDRkZMX1RleHRGaWVsZDo6U2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CisgIGlmIChDUFdMX0VkaXQqIHBXbmQgPSAoQ1BXTF9FZGl0KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpIHsKKyAgICBDRlhfV2lkZVN0cmluZyBzT2xkVmFsdWUgPSBtX3BXaWRnZXQtPkdldFZhbHVlKCk7CisgICAgQ0ZYX1dpZGVTdHJpbmcgc05ld1ZhbHVlID0gcFduZC0+R2V0VGV4dCgpOwogCi0JaWYgKENQV0xfRWRpdCogcFduZCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKLQl7Ci0JCUNGWF9XaWRlU3RyaW5nIHNPbGRWYWx1ZSA9IG1fcFdpZGdldC0+R2V0VmFsdWUoKTsKLQkJQ0ZYX1dpZGVTdHJpbmcgc05ld1ZhbHVlID0gcFduZC0+R2V0VGV4dCgpOwotCi0JCW1fcFdpZGdldC0+U2V0VmFsdWUoc05ld1ZhbHVlLCBGQUxTRSk7CQotCQltX3BXaWRnZXQtPlJlc2V0RmllbGRBcHBlYXJhbmNlKFRSVUUpOwotCQltX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7Ci0JCVNldENoYW5nZU1hcmsoKTsKLQl9CisgICAgbV9wV2lkZ2V0LT5TZXRWYWx1ZShzTmV3VmFsdWUsIEZBTFNFKTsKKyAgICBtX3BXaWRnZXQtPlJlc2V0RmllbGRBcHBlYXJhbmNlKFRSVUUpOworICAgIG1fcFdpZGdldC0+VXBkYXRlRmllbGQoKTsKKyAgICBTZXRDaGFuZ2VNYXJrKCk7CisgIH0KIH0KIAotdm9pZCBDRkZMX1RleHRGaWVsZDo6R2V0QWN0aW9uRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKLQkJCQkJCQkJCVBERlNES19GaWVsZEFjdGlvbiYgZmEpCi17Ci0Jc3dpdGNoICh0eXBlKQotCXsKLQljYXNlIENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlOgotCQlpZiAoQ1BXTF9FZGl0KiBwV25kID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQotCQl7Ci0JCQlmYS5iRmllbGRGdWxsID0gcFduZC0+SXNUZXh0RnVsbCgpOwkKK3ZvaWQgQ0ZGTF9UZXh0RmllbGQ6OkdldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBERlNES19GaWVsZEFjdGlvbiYgZmEpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBDUERGX0FBY3Rpb246OktleVN0cm9rZToKKyAgICAgIGlmIChDUFdMX0VkaXQqIHBXbmQgPSAoQ1BXTF9FZGl0KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpIHsKKyAgICAgICAgZmEuYkZpZWxkRnVsbCA9IHBXbmQtPklzVGV4dEZ1bGwoKTsKIAotCQkJZmEuc1ZhbHVlID0gcFduZC0+R2V0VGV4dCgpOwotCQkJCi0JCQlpZiAoZmEuYkZpZWxkRnVsbCkKLQkJCXsKLQkJCQlmYS5zQ2hhbmdlID0gTCIiOwotCQkJCWZhLnNDaGFuZ2VFeCA9IEwiIjsKLQkJCX0KLQkJfQotCQlicmVhazsKLQljYXNlIENQREZfQUFjdGlvbjo6VmFsaWRhdGU6Ci0JCWlmIChDUFdMX0VkaXQqIHBXbmQgPSAoQ1BXTF9FZGl0KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCi0JCXsKLQkJCWZhLnNWYWx1ZSA9IHBXbmQtPkdldFRleHQoKTsKLQkJfQotCQlicmVhazsKLQljYXNlIENQREZfQUFjdGlvbjo6TG9zZUZvY3VzOgotCWNhc2UgQ1BERl9BQWN0aW9uOjpHZXRGb2N1czoKLQkJQVNTRVJUKG1fcFdpZGdldCAhPSBOVUxMKTsKLQkJZmEuc1ZhbHVlID0gbV9wV2lkZ2V0LT5HZXRWYWx1ZSgpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9CisgICAgICAgIGZhLnNWYWx1ZSA9IHBXbmQtPkdldFRleHQoKTsKKworICAgICAgICBpZiAoZmEuYkZpZWxkRnVsbCkgeworICAgICAgICAgIGZhLnNDaGFuZ2UgPSBMIiI7CisgICAgICAgICAgZmEuc0NoYW5nZUV4ID0gTCIiOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6VmFsaWRhdGU6CisgICAgICBpZiAoQ1BXTF9FZGl0KiBwV25kID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKSB7CisgICAgICAgIGZhLnNWYWx1ZSA9IHBXbmQtPkdldFRleHQoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpMb3NlRm9jdXM6CisgICAgY2FzZSBDUERGX0FBY3Rpb246OkdldEZvY3VzOgorICAgICAgZmEuc1ZhbHVlID0gbV9wV2lkZ2V0LT5HZXRWYWx1ZSgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CiB9CiAKLXZvaWQgQ0ZGTF9UZXh0RmllbGQ6OlNldEFjdGlvbkRhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIAotIAkJCQkJCQkJCWNvbnN0IFBERlNES19GaWVsZEFjdGlvbiYgZmEpCi17Ci0Jc3dpdGNoICh0eXBlKQotCXsKLQljYXNlIENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlOgotCQlpZiAoQ1BXTF9FZGl0ICogcEVkaXQgPSAoQ1BXTF9FZGl0KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCi0JCXsKLQkJCXBFZGl0LT5TZXRGb2N1cygpOwotCQkJcEVkaXQtPlNldFNlbChmYS5uU2VsU3RhcnQsIGZhLm5TZWxFbmQpOwotCQkJcEVkaXQtPlJlcGxhY2VTZWwoZmEuc0NoYW5nZS5jX3N0cigpKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Cit2b2lkIENGRkxfVGV4dEZpZWxkOjpTZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2U6CisgICAgICBpZiAoQ1BXTF9FZGl0KiBwRWRpdCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgICAgICBwRWRpdC0+U2V0Rm9jdXMoKTsKKyAgICAgICAgcEVkaXQtPlNldFNlbChmYS5uU2VsU3RhcnQsIGZhLm5TZWxFbmQpOworICAgICAgICBwRWRpdC0+UmVwbGFjZVNlbChmYS5zQ2hhbmdlLmNfc3RyKCkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CiB9CiAKK0ZYX0JPT0wgQ0ZGTF9UZXh0RmllbGQ6OklzQWN0aW9uRGF0YUNoYW5nZWQoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhTmV3KSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2U6CisgICAgICByZXR1cm4gKCFmYU9sZC5iRmllbGRGdWxsICYmIGZhT2xkLm5TZWxFbmQgIT0gZmFOZXcublNlbEVuZCkgfHwKKyAgICAgICAgICAgICBmYU9sZC5uU2VsU3RhcnQgIT0gZmFOZXcublNlbFN0YXJ0IHx8CisgICAgICAgICAgICAgZmFPbGQuc0NoYW5nZSAhPSBmYU5ldy5zQ2hhbmdlOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQogCi1GWF9CT09MCUNGRkxfVGV4dEZpZWxkOjpJc0FjdGlvbkRhdGFDaGFuZ2VkKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYU9sZCwgCi0JCQkJCQkJCQljb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhTmV3KQotewotCXN3aXRjaCAodHlwZSkKLQl7Ci0JY2FzZSBDUERGX0FBY3Rpb246OktleVN0cm9rZToKLQkJcmV0dXJuICghZmFPbGQuYkZpZWxkRnVsbCAmJiBmYU9sZC5uU2VsRW5kICE9IGZhTmV3Lm5TZWxFbmQpIHx8IGZhT2xkLm5TZWxTdGFydCAhPSBmYU5ldy5uU2VsU3RhcnQgfHwKLQkJCWZhT2xkLnNDaGFuZ2UgIT0gZmFOZXcuc0NoYW5nZTsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gRkFMU0U7CisgIHJldHVybiBGQUxTRTsKIH0KIAotdm9pZCBDRkZMX1RleHRGaWVsZDo6U2F2ZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKLXsKLQlBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwordm9pZCBDRkZMX1RleHRGaWVsZDo6U2F2ZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgeworICBBU1NFUlQocFBhZ2VWaWV3KTsKIAotCWlmIChDUFdMX0VkaXQqIHBXbmQgPSAoQ1BXTF9FZGl0KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCi0JewotCQlwV25kLT5HZXRTZWwobV9TdGF0ZS5uU3RhcnQsIG1fU3RhdGUubkVuZCk7Ci0JCW1fU3RhdGUuc1ZhbHVlID0gcFduZC0+R2V0VGV4dCgpOwotCX0KKyAgaWYgKENQV0xfRWRpdCogcFduZCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgIHBXbmQtPkdldFNlbChtX1N0YXRlLm5TdGFydCwgbV9TdGF0ZS5uRW5kKTsKKyAgICBtX1N0YXRlLnNWYWx1ZSA9IHBXbmQtPkdldFRleHQoKTsKKyAgfQogfQogCi12b2lkIENGRkxfVGV4dEZpZWxkOjpSZXN0b3JlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQotewotCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Cit2b2lkIENGRkxfVGV4dEZpZWxkOjpSZXN0b3JlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CisgIEFTU0VSVChwUGFnZVZpZXcpOwogCi0JaWYgKENQV0xfRWRpdCogcFduZCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpKQotCXsKLQkJcFduZC0+U2V0VGV4dChtX1N0YXRlLnNWYWx1ZS5jX3N0cigpKTsKLQkJcFduZC0+U2V0U2VsKG1fU3RhdGUublN0YXJ0LCBtX1N0YXRlLm5FbmQpOwotCX0KKyAgaWYgKENQV0xfRWRpdCogcFduZCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpKSB7CisgICAgcFduZC0+U2V0VGV4dChtX1N0YXRlLnNWYWx1ZS5jX3N0cigpKTsKKyAgICBwV25kLT5TZXRTZWwobV9TdGF0ZS5uU3RhcnQsIG1fU3RhdGUubkVuZCk7CisgIH0KIH0KIAotQ1BXTF9XbmQqIENGRkxfVGV4dEZpZWxkOjpSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0JPT0wgYlJlc3RvcmVWYWx1ZSkKLXsKLQlpZiAoYlJlc3RvcmVWYWx1ZSkKLQkJU2F2ZVN0YXRlKHBQYWdlVmlldyk7CitDUFdMX1duZCogQ0ZGTF9UZXh0RmllbGQ6OlJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVzdG9yZVZhbHVlKSB7CisgIGlmIChiUmVzdG9yZVZhbHVlKQorICAgIFNhdmVTdGF0ZShwUGFnZVZpZXcpOwogCi0JRGVzdHJveVBERldpbmRvdyhwUGFnZVZpZXcpOworICBEZXN0cm95UERGV2luZG93KHBQYWdlVmlldyk7CiAKLQlDUFdMX1duZCogcFJldCA9IE5VTEw7CisgIENQV0xfV25kKiBwUmV0ID0gTlVMTDsKIAotCWlmIChiUmVzdG9yZVZhbHVlKQotCXsKLQkJUmVzdG9yZVN0YXRlKHBQYWdlVmlldyk7Ci0JCXBSZXQgPSB0aGlzLT5HZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7Ci0JfQotCWVsc2UKLQkJcFJldCA9IHRoaXMtPkdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpOworICBpZiAoYlJlc3RvcmVWYWx1ZSkgeworICAgIFJlc3RvcmVTdGF0ZShwUGFnZVZpZXcpOworICAgIHBSZXQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7CisgIH0gZWxzZSB7CisgICAgcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpOworICB9CiAKLQltX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7Ci0JCi0JcmV0dXJuIHBSZXQ7CisgIG1fcFdpZGdldC0+VXBkYXRlRmllbGQoKTsKKworICByZXR1cm4gcFJldDsKIH0KIAotdm9pZCBDRkZMX1RleHRGaWVsZDo6T25TZXRGb2N1cyhDUFdMX1duZCogcFduZCkKLXsKLQlBU1NFUlQobV9wQXBwICE9IE5VTEwpOwotCQotIAlBU1NFUlQocFduZCAhPSBOVUxMKTsKLSAKLSAJaWYgKHBXbmQtPkdldENsYXNzTmFtZSgpID09IFBXTF9DTEFTU05BTUVfRURJVCkKLSAJewotIAkJQ1BXTF9FZGl0KiBwRWRpdCA9IChDUFdMX0VkaXQqKXBXbmQ7Ci0JCXBFZGl0LT5TZXRDaGFyU2V0KDEzNCk7Ci0JCXBFZGl0LT5TZXRDb2RlUGFnZSg5MzYpOwotIAotCQlwRWRpdC0+U2V0UmVhZHlUb0lucHV0KCk7Ci0JCUNGWF9XaWRlU3RyaW5nIHdzVGV4dCA9IHBFZGl0LT5HZXRUZXh0KCk7Ci0JCWludCBuQ2hhcmFjdGVycyA9IHdzVGV4dC5HZXRMZW5ndGgoKTsKLQkJQ0ZYX0J5dGVTdHJpbmcgYnNVVEZUZXh0ID0gd3NUZXh0LlVURjE2TEVfRW5jb2RlKCk7Ci0JCXVuc2lnbmVkIHNob3J0KiBwQnVmZmVyID0gKHVuc2lnbmVkIHNob3J0Kilic1VURlRleHQuY19zdHIoKTsKLQkJbV9wQXBwLT5GRklfT25TZXRGaWVsZElucHV0Rm9jdXMobV9wV2lkZ2V0LT5HZXRGb3JtRmllbGQoKSwgcEJ1ZmZlciwgbkNoYXJhY3RlcnMsIFRSVUUpOwotIAotIAkJcEVkaXQtPlNldEVkaXROb3RpZnkodGhpcyk7Ci0gCQkvL3BVbmRvLT5CZWdpbkVkaXQocERvY3VtZW50KTsKLSAJfQorI2lmZGVmIFBERl9FTkFCTEVfWEZBCitGWF9CT09MIENGRkxfVGV4dEZpZWxkOjpJc0ZpZWxkRnVsbChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKKyAgaWYgKENQV0xfRWRpdCogcFduZCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkgeworICAgIHJldHVybiBwV25kLT5Jc1RleHRGdWxsKCk7CisgIH0KKworICByZXR1cm4gRkFMU0U7Cit9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKK3ZvaWQgQ0ZGTF9UZXh0RmllbGQ6Ok9uU2V0Rm9jdXMoQ1BXTF9XbmQqIHBXbmQpIHsKKyAgQVNTRVJUKG1fcEFwcCk7CisgIGlmIChwV25kLT5HZXRDbGFzc05hbWUoKSA9PSBQV0xfQ0xBU1NOQU1FX0VESVQpIHsKKyAgICBDUFdMX0VkaXQqIHBFZGl0ID0gKENQV0xfRWRpdCopcFduZDsKKyAgICBwRWRpdC0+U2V0Q2hhclNldCgxMzQpOworICAgIHBFZGl0LT5TZXRDb2RlUGFnZSg5MzYpOworCisgICAgcEVkaXQtPlNldFJlYWR5VG9JbnB1dCgpOworICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dCA9IHBFZGl0LT5HZXRUZXh0KCk7CisgICAgaW50IG5DaGFyYWN0ZXJzID0gd3NUZXh0LkdldExlbmd0aCgpOworICAgIENGWF9CeXRlU3RyaW5nIGJzVVRGVGV4dCA9IHdzVGV4dC5VVEYxNkxFX0VuY29kZSgpOworICAgIHVuc2lnbmVkIHNob3J0KiBwQnVmZmVyID0gKHVuc2lnbmVkIHNob3J0Kilic1VURlRleHQuY19zdHIoKTsKKyAgICBtX3BBcHAtPkZGSV9PblNldEZpZWxkSW5wdXRGb2N1cyhtX3BXaWRnZXQtPkdldEZvcm1GaWVsZCgpLCBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFyYWN0ZXJzLCBUUlVFKTsKKworICAgIHBFZGl0LT5TZXRFZGl0Tm90aWZ5KHRoaXMpOworICB9CiB9CiAKLXZvaWQgQ0ZGTF9UZXh0RmllbGQ6Ok9uS2lsbEZvY3VzKENQV0xfV25kKiBwV25kKQotewordm9pZCBDRkZMX1RleHRGaWVsZDo6T25LaWxsRm9jdXMoQ1BXTF9XbmQqIHBXbmQpIHt9CiAKLX0KLQotRlhfQk9PTAlDRkZMX1RleHRGaWVsZDo6Q2FuQ29weShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci0JcmV0dXJuIEZBTFNFOwotfQotCi1GWF9CT09MIENGRkxfVGV4dEZpZWxkOjpDYW5DdXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQotewotCXJldHVybiBGQUxTRTsKLX0KLQotRlhfQk9PTAlDRkZMX1RleHRGaWVsZDo6Q2FuUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQotewotCXJldHVybiBGQUxTRTsKLX0KLQotdm9pZCBDRkZMX1RleHRGaWVsZDo6RG9Db3B5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLQotfQotCi12b2lkIENGRkxfVGV4dEZpZWxkOjpEb0N1dChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci19Ci0KLXZvaWQgQ0ZGTF9UZXh0RmllbGQ6OkRvUGFzdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQotewotCi19Ci0KLXZvaWQgQ0ZGTF9UZXh0RmllbGQ6Ok9uQWRkVW5kbyhDUFdMX0VkaXQqIHBFZGl0KQotewotfQotCit2b2lkIENGRkxfVGV4dEZpZWxkOjpPbkFkZFVuZG8oQ1BXTF9FZGl0KiBwRWRpdCkge30KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1V0aWxzLmNwcCBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1V0aWxzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk2MTAyYi4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9VdGlscy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZm9ybWZpbGxlci9Gb3JtRmlsbGVyLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9VdGlscy5oIgotCi1DUERGX1JlY3QgQ0ZGTF9VdGlsczo6TWF4UmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0MSxjb25zdCBDUERGX1JlY3QgJiByZWN0MikKLXsKLQlDUERGX1JlY3QgcmNSZXQ7Ci0KLQlyY1JldC5sZWZ0ID0gc3RkOjptaW4ocmVjdDEubGVmdCwgcmVjdDIubGVmdCk7Ci0JcmNSZXQuYm90dG9tID0gc3RkOjptaW4ocmVjdDEuYm90dG9tLCByZWN0Mi5ib3R0b20pOwotCXJjUmV0LnJpZ2h0ID0gc3RkOjptYXgocmVjdDEucmlnaHQsIHJlY3QyLnJpZ2h0KTsKLQlyY1JldC50b3AgPSBzdGQ6Om1heChyZWN0MS50b3AsIHJlY3QyLnRvcCk7Ci0KLQlyZXR1cm4gcmNSZXQ7Ci19Ci0KLUNQREZfUmVjdCBDRkZMX1V0aWxzOjpJbmZsYXRlUmVjdChjb25zdCBDUERGX1JlY3QgJiBjclJlY3QsY29uc3QgRlhfRkxPQVQgJiBmU2l6ZSkKLXsKLQlDUERGX1JlY3QgY3JOZXcoY3JSZWN0LmxlZnQgLSBmU2l6ZSwKLQkJCQkJY3JSZWN0LmJvdHRvbSAtIGZTaXplLAotCQkJCQljclJlY3QucmlnaHQgKyBmU2l6ZSwKLQkJCQkJY3JSZWN0LnRvcCArIGZTaXplKTsKLQljck5ldy5Ob3JtYWxpemUoKTsKLQlyZXR1cm4gY3JOZXc7Ci19Ci0KLUNQREZfUmVjdCBDRkZMX1V0aWxzOjpEZWZsYXRlUmVjdChjb25zdCBDUERGX1JlY3QgJiBjclJlY3QsY29uc3QgRlhfRkxPQVQgJiBmU2l6ZSkKLXsKLQlDUERGX1JlY3QgY3JOZXcoY3JSZWN0LmxlZnQgKyBmU2l6ZSwKLQkJCQkJY3JSZWN0LmJvdHRvbSArIGZTaXplLAotCQkJCQljclJlY3QucmlnaHQgLSBmU2l6ZSwKLQkJCQkJY3JSZWN0LnRvcCAtIGZTaXplKTsKLQljck5ldy5Ob3JtYWxpemUoKTsKLQlyZXR1cm4gY3JOZXc7Ci19Ci0KLUZYX0JPT0wgQ0ZGTF9VdGlsczo6VHJhY2VPYmplY3QoQ1BERl9PYmplY3QqIHBPYmopCi17Ci0JaWYgKCFwT2JqKSByZXR1cm4gRkFMU0U7Ci0KLQlGWF9EV09SRAlkd09iak51bSA9IHBPYmotPkdldE9iak51bSgpOwotCXN3aXRjaCAocE9iai0+R2V0VHlwZSgpKQotCXsKLQljYXNlIFBERk9CSl9BUlJBWToKLQkJewotCQkJQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBPYmo7Ci0JCQlmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyBpICsrKQotCQkJewotCQkJCUNQREZfT2JqZWN0KiBwRWxlbWVudCA9IHBBcnJheS0+R2V0RWxlbWVudFZhbHVlKGkpOwkJCQkKLQkJCQlUcmFjZU9iamVjdChwRWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFBERk9CSl9ESUNUSU9OQVJZOgotCQl7Ci0JCQlDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gKENQREZfRGljdGlvbmFyeSopcE9iajsKLQotCQkJRlhfUE9TSVRJT04gZlBvcyA9IHBEaWN0LT5HZXRTdGFydFBvcygpOwotCQkJQ0ZYX0J5dGVTdHJpbmcgY3NLZXk7Ci0JCQlkbwotCQkJewotCQkJCUNQREZfT2JqZWN0KiBwRWxlbWVudCA9IHBEaWN0LT5HZXROZXh0RWxlbWVudChmUG9zLCBjc0tleSk7Ci0gCQkJCS8vVFJBQ0UoY3NLZXkgKyAiXG4iKTsKLQkJCQlpZiAoIXBFbGVtZW50KSBicmVhazsKLQkJCQlUcmFjZU9iamVjdChwRWxlbWVudCk7Ci0JCQl9d2hpbGUgKFRSVUUpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBQREZPQkpfU1RSRUFNOgotCQl7Ci0JCQlDUERGX1N0cmVhbSogcFN0cmVhbSA9IChDUERGX1N0cmVhbSopcE9iajsKLQkJCUNQREZfRGljdGlvbmFyeSogcERpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7Ci0JCQlUcmFjZU9iamVjdChwRGljdCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFBERk9CSl9SRUZFUkVOQ0U6Ci0JCXsKLQkJCUNQREZfT2JqZWN0KiBwRGlyZWN0T2JqID0gcE9iai0+R2V0RGlyZWN0KCk7Ci0JCQlUcmFjZU9iamVjdChwRGlyZWN0T2JqKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgUERGT0JKX0JPT0xFQU46Ci0JCWJyZWFrOwotCWNhc2UgUERGT0JKX05VTUJFUjoKLQkJLy9UUkFDRSgiJWRcbiIsKEZYX0lOVDMyKXBPYmopOwotCQlicmVhazsKLQljYXNlIFBERk9CSl9TVFJJTkc6Ci0JCS8vVFJBQ0UoKChDUERGX1N0cmluZyopcE9iaiktPkdldFN0cmluZygpICsgIlxuIik7Ci0JCWJyZWFrOwotCWNhc2UgUERGT0JKX05BTUU6Ci0JCS8vVFJBQ0UoKChDUERGX05hbWUqKXBPYmopLT5HZXRTdHJpbmcoKSArICJcbiIpOwotCQlicmVhazsKLQljYXNlIFBERk9CSl9OVUxMOgotLy8JY2FzZSBQREZPQkpfS0VZV09SRDoKLS8vCWNhc2UgUERGT0JKX0VPRjoKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JaWYgKGR3T2JqTnVtID09IDApIHJldHVybiBGQUxTRTsKLQotCXJldHVybiBUUlVFOwotfQotCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmX2RhdGFhdmFpbC5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmX2RhdGFhdmFpbC5jcHAKaW5kZXggZjMxNjg1Zi4uZjRlMjM1YyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZl9kYXRhYXZhaWwuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZfZGF0YWF2YWlsLmNwcApAQCAtMSwxNjUgKzEsMTY5IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9wdWJsaWMvZnBkZl9kYXRhYXZhaWwuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZfZGF0YWF2YWlsLmgiCiAKLWV4dGVybiB2b2lkIFByb2Nlc3NQYXJzZUVycm9yKEZYX0RXT1JEIGVycl9jb2RlKTsKLWNsYXNzIENGUERGX0ZpbGVBdmFpbFdyYXAgOiBwdWJsaWMgSUZYX0ZpbGVBdmFpbAotewotcHVibGljOgotCUNGUERGX0ZpbGVBdmFpbFdyYXAoKQotCXsKLQkJbV9wZmlsZUF2YWlsID0gTlVMTDsKLQl9CisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZfZm9ybWZpbGwuaCIKIAotCXZvaWQgU2V0KEZYX0ZJTEVBVkFJTCogcGZpbGVBdmFpbCkKLQl7Ci0JCW1fcGZpbGVBdmFpbCA9IHBmaWxlQXZhaWw7Ci0JfQorLy8gVGhlc2UgY2hlY2tzIGFyZSBoZXJlIGJlY2F1c2UgY29yZS8gYW5kIHB1YmxpYy8gY2Fubm90IGRlcGVuZCBvbiBlYWNoIG90aGVyLgorc3RhdGljX2Fzc2VydChJUERGX0RhdGFBdmFpbDo6RGF0YUVycm9yID09IFBERl9EQVRBX0VSUk9SLAorICAgICAgICAgICAgICAiSVBERl9EYXRhQXZhaWw6OkRhdGFFcnJvciB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChJUERGX0RhdGFBdmFpbDo6RGF0YU5vdEF2YWlsYWJsZSA9PSBQREZfREFUQV9OT1RBVkFJTCwKKyAgICAgICAgICAgICAgIklQREZfRGF0YUF2YWlsOjpEYXRhTm90QXZhaWxhYmxlIHZhbHVlIG1pc21hdGNoIik7CitzdGF0aWNfYXNzZXJ0KElQREZfRGF0YUF2YWlsOjpEYXRhQXZhaWxhYmxlID09IFBERl9EQVRBX0FWQUlMLAorICAgICAgICAgICAgICAiSVBERl9EYXRhQXZhaWw6OkRhdGFBdmFpbGFibGUgdmFsdWUgbWlzbWF0Y2giKTsKIAotCXZpcnR1YWwgRlhfQk9PTAkJCUlzRGF0YUF2YWlsKCBGWF9GSUxFU0laRSBvZmZzZXQsIEZYX0RXT1JEIHNpemUpCi0JewotCQlyZXR1cm4gbV9wZmlsZUF2YWlsLT5Jc0RhdGFBdmFpbChtX3BmaWxlQXZhaWwsIG9mZnNldCwgc2l6ZSk7Ci0JfQorc3RhdGljX2Fzc2VydChJUERGX0RhdGFBdmFpbDo6TGluZWFyaXphdGlvblVua25vd24gPT0gUERGX0xJTkVBUklaQVRJT05fVU5LTk9XTiwKKyAgICAgICAgICAgICAgIklQREZfRGF0YUF2YWlsOjpMaW5lYXJpemF0aW9uVW5rbm93biB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChJUERGX0RhdGFBdmFpbDo6Tm90TGluZWFyaXplZCA9PSBQREZfTk9UX0xJTkVBUklaRUQsCisgICAgICAgICAgICAgICJJUERGX0RhdGFBdmFpbDo6Tm90TGluZWFyaXplZCB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChJUERGX0RhdGFBdmFpbDo6TGluZWFyaXplZCA9PSBQREZfTElORUFSSVpFRCwKKyAgICAgICAgICAgICAgIklQREZfRGF0YUF2YWlsOjpMaW5lYXJpemVkIHZhbHVlIG1pc21hdGNoIik7CiAKLXByaXZhdGU6Ci0JRlhfRklMRUFWQUlMKiBtX3BmaWxlQXZhaWw7Ci19OyAgCitzdGF0aWNfYXNzZXJ0KElQREZfRGF0YUF2YWlsOjpGb3JtRXJyb3IgPT0gUERGX0ZPUk1fRVJST1IsCisgICAgICAgICAgICAgICJJUERGX0RhdGFBdmFpbDo6Rm9ybUVycm9yIHZhbHVlIG1pc21hdGNoIik7CitzdGF0aWNfYXNzZXJ0KElQREZfRGF0YUF2YWlsOjpGb3JtTm90QXZhaWxhYmxlID09IFBERl9GT1JNX05PVEFWQUlMLAorICAgICAgICAgICAgICAiSVBERl9EYXRhQXZhaWw6OkZvcm1Ob3RBdmFpbGFibGUgdmFsdWUgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoSVBERl9EYXRhQXZhaWw6OkZvcm1BdmFpbGFibGUgPT0gUERGX0ZPUk1fQVZBSUwsCisgICAgICAgICAgICAgICJJUERGX0RhdGFBdmFpbDo6Rm9ybUF2YWlsYWJsZSB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChJUERGX0RhdGFBdmFpbDo6Rm9ybU5vdEV4aXN0ID09IFBERl9GT1JNX05PVEVYSVNULAorICAgICAgICAgICAgICAiSVBERl9EYXRhQXZhaWw6OkZvcm1Ob3RFeGlzdCB2YWx1ZSBtaXNtYXRjaCIpOwogCi1jbGFzcyBDRlBERl9GaWxlQWNjZXNzV3JhcCA6IHB1YmxpYyBJRlhfRmlsZVJlYWQKLXsKLXB1YmxpYzoKLQlDRlBERl9GaWxlQWNjZXNzV3JhcCgpCi0JewotCQltX3BGaWxlQWNjZXNzID0gTlVMTDsKLQl9CitjbGFzcyBDRlBERl9GaWxlQXZhaWxXcmFwIDogcHVibGljIElGWF9GaWxlQXZhaWwgeworIHB1YmxpYzoKKyAgQ0ZQREZfRmlsZUF2YWlsV3JhcCgpIHsgbV9wZmlsZUF2YWlsID0gTlVMTDsgfQorICB+Q0ZQREZfRmlsZUF2YWlsV3JhcCgpIG92ZXJyaWRlIHt9CiAKLQl2b2lkIFNldChGUERGX0ZJTEVBQ0NFU1MqIHBGaWxlKQotCXsKLQkJbV9wRmlsZUFjY2VzcyA9IHBGaWxlOwotCX0KKyAgdm9pZCBTZXQoRlhfRklMRUFWQUlMKiBwZmlsZUF2YWlsKSB7IG1fcGZpbGVBdmFpbCA9IHBmaWxlQXZhaWw7IH0KIAotCXZpcnR1YWwgRlhfRklMRVNJWkUJCUdldFNpemUoKQotCXsKLQkJcmV0dXJuIG1fcEZpbGVBY2Nlc3MtPm1fRmlsZUxlbjsgCi0JfQorICAvLyBJRlhfRmlsZUF2YWlsCisgIEZYX0JPT0wgSXNEYXRhQXZhaWwoRlhfRklMRVNJWkUgb2Zmc2V0LCBGWF9EV09SRCBzaXplKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIG1fcGZpbGVBdmFpbC0+SXNEYXRhQXZhaWwobV9wZmlsZUF2YWlsLCBvZmZzZXQsIHNpemUpOworICB9CiAKLQl2aXJ0dWFsIEZYX0JPT0wJCQlSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKQotCXsKLQkJcmV0dXJuIG1fcEZpbGVBY2Nlc3MtPm1fR2V0QmxvY2sobV9wRmlsZUFjY2Vzcy0+bV9QYXJhbSwgb2Zmc2V0LCAoRlhfTFBCWVRFKWJ1ZmZlciwgc2l6ZSk7Ci0JfQotCi0JdmlydHVhbCB2b2lkCQkJUmVsZWFzZSgpCi0JewotCX0KLQotcHJpdmF0ZToKLQlGUERGX0ZJTEVBQ0NFU1MqCQltX3BGaWxlQWNjZXNzOworIHByaXZhdGU6CisgIEZYX0ZJTEVBVkFJTCogbV9wZmlsZUF2YWlsOwogfTsKIAotY2xhc3MgQ0ZQREZfRG93bmxvYWRIaW50c1dyYXAgOiBwdWJsaWMgSUZYX0Rvd25sb2FkSGludHMKLXsKLXB1YmxpYzoKLQlDRlBERl9Eb3dubG9hZEhpbnRzV3JhcChGWF9ET1dOTE9BREhJTlRTKiBwRG93bmxvYWRIaW50cykKLQl7Ci0JCW1fcERvd25sb2FkSGludHMgPSBwRG93bmxvYWRIaW50czsKLQl9Ci1wdWJsaWM6Ci0JdmlydHVhbCB2b2lkCQkJQWRkU2VnbWVudChGWF9GSUxFU0laRSBvZmZzZXQsIEZYX0RXT1JEIHNpemUpIAotCXsKLQkJbV9wRG93bmxvYWRIaW50cy0+QWRkU2VnbWVudChtX3BEb3dubG9hZEhpbnRzLCBvZmZzZXQsIHNpemUpOwotCX0JCi1wcml2YXRlOgotCUZYX0RPV05MT0FESElOVFMqIG1fcERvd25sb2FkSGludHM7CitjbGFzcyBDRlBERl9GaWxlQWNjZXNzV3JhcCA6IHB1YmxpYyBJRlhfRmlsZVJlYWQgeworIHB1YmxpYzoKKyAgQ0ZQREZfRmlsZUFjY2Vzc1dyYXAoKSB7IG1fcEZpbGVBY2Nlc3MgPSBOVUxMOyB9CisgIH5DRlBERl9GaWxlQWNjZXNzV3JhcCgpIG92ZXJyaWRlIHt9CisKKyAgdm9pZCBTZXQoRlBERl9GSUxFQUNDRVNTKiBwRmlsZSkgeyBtX3BGaWxlQWNjZXNzID0gcEZpbGU7IH0KKworICAvLyBJRlhfRmlsZVJlYWQKKyAgRlhfRklMRVNJWkUgR2V0U2l6ZSgpIG92ZXJyaWRlIHsgcmV0dXJuIG1fcEZpbGVBY2Nlc3MtPm1fRmlsZUxlbjsgfQorCisgIEZYX0JPT0wgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBtX3BGaWxlQWNjZXNzLT5tX0dldEJsb2NrKG1fcEZpbGVBY2Nlc3MtPm1fUGFyYW0sIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCopYnVmZmVyLCBzaXplKTsKKyAgfQorCisgIHZvaWQgUmVsZWFzZSgpIG92ZXJyaWRlIHt9CisKKyBwcml2YXRlOgorICBGUERGX0ZJTEVBQ0NFU1MqIG1fcEZpbGVBY2Nlc3M7CiB9OwogCi1jbGFzcyBDRlBERl9EYXRhQXZhaWwgCi17Ci1wdWJsaWM6Ci0JQ0ZQREZfRGF0YUF2YWlsKCkKLQl7Ci0JCW1fcERhdGFBdmFpbCA9IE5VTEw7Ci0JfQorY2xhc3MgQ0ZQREZfRG93bmxvYWRIaW50c1dyYXAgOiBwdWJsaWMgSUZYX0Rvd25sb2FkSGludHMgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0ZQREZfRG93bmxvYWRIaW50c1dyYXAoRlhfRE9XTkxPQURISU5UUyogcERvd25sb2FkSGludHMpIHsKKyAgICBtX3BEb3dubG9hZEhpbnRzID0gcERvd25sb2FkSGludHM7CisgIH0KKyAgfkNGUERGX0Rvd25sb2FkSGludHNXcmFwKCkgb3ZlcnJpZGUge30KIAotCX5DRlBERl9EYXRhQXZhaWwoKQotCXsKLQkJaWYgKG1fcERhdGFBdmFpbCkgZGVsZXRlIG1fcERhdGFBdmFpbDsKLQl9CisgcHVibGljOgorICAvLyBJRlhfRG93bmxvYWRIaW50cworICB2b2lkIEFkZFNlZ21lbnQoRlhfRklMRVNJWkUgb2Zmc2V0LCBGWF9EV09SRCBzaXplKSBvdmVycmlkZSB7CisgICAgbV9wRG93bmxvYWRIaW50cy0+QWRkU2VnbWVudChtX3BEb3dubG9hZEhpbnRzLCBvZmZzZXQsIHNpemUpOworICB9CiAKLQlJUERGX0RhdGFBdmFpbCoJCQltX3BEYXRhQXZhaWw7Ci0JQ0ZQREZfRmlsZUF2YWlsV3JhcAkJbV9GaWxlQXZhaWw7Ci0JQ0ZQREZfRmlsZUFjY2Vzc1dyYXAJbV9GaWxlUmVhZDsKKyBwcml2YXRlOgorICBGWF9ET1dOTE9BREhJTlRTKiBtX3BEb3dubG9hZEhpbnRzOwogfTsKIAotRExMRVhQT1JUIEZQREZfQVZBSUwgU1REQ0FMTCBGUERGQXZhaWxfQ3JlYXRlKEZYX0ZJTEVBVkFJTCogZmlsZV9hdmFpbCwgRlBERl9GSUxFQUNDRVNTKiBmaWxlKQotewotCUNGUERGX0RhdGFBdmFpbCogcEF2YWlsID0gbmV3IENGUERGX0RhdGFBdmFpbDsKLQlwQXZhaWwtPm1fRmlsZUF2YWlsLlNldChmaWxlX2F2YWlsKTsKLQlwQXZhaWwtPm1fRmlsZVJlYWQuU2V0KGZpbGUpOwotCXBBdmFpbC0+bV9wRGF0YUF2YWlsID0gSVBERl9EYXRhQXZhaWw6OkNyZWF0ZSgmcEF2YWlsLT5tX0ZpbGVBdmFpbCwgJnBBdmFpbC0+bV9GaWxlUmVhZCk7Ci0JcmV0dXJuIHBBdmFpbDsKK2NsYXNzIENGUERGX0RhdGFBdmFpbCB7CisgcHVibGljOgorICBDRlBERl9EYXRhQXZhaWwoKSB7IG1fcERhdGFBdmFpbCA9IE5VTEw7IH0KKworICB+Q0ZQREZfRGF0YUF2YWlsKCkgeyBkZWxldGUgbV9wRGF0YUF2YWlsOyB9CisKKyAgSVBERl9EYXRhQXZhaWwqIG1fcERhdGFBdmFpbDsKKyAgQ0ZQREZfRmlsZUF2YWlsV3JhcCBtX0ZpbGVBdmFpbDsKKyAgQ0ZQREZfRmlsZUFjY2Vzc1dyYXAgbV9GaWxlUmVhZDsKK307CisKK0RMTEVYUE9SVCBGUERGX0FWQUlMIFNURENBTEwgRlBERkF2YWlsX0NyZWF0ZShGWF9GSUxFQVZBSUwqIGZpbGVfYXZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9GSUxFQUNDRVNTKiBmaWxlKSB7CisgIENGUERGX0RhdGFBdmFpbCogcEF2YWlsID0gbmV3IENGUERGX0RhdGFBdmFpbDsKKyAgcEF2YWlsLT5tX0ZpbGVBdmFpbC5TZXQoZmlsZV9hdmFpbCk7CisgIHBBdmFpbC0+bV9GaWxlUmVhZC5TZXQoZmlsZSk7CisgIHBBdmFpbC0+bV9wRGF0YUF2YWlsID0KKyAgICAgIElQREZfRGF0YUF2YWlsOjpDcmVhdGUoJnBBdmFpbC0+bV9GaWxlQXZhaWwsICZwQXZhaWwtPm1fRmlsZVJlYWQpOworICByZXR1cm4gcEF2YWlsOwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZBdmFpbF9EZXN0cm95KEZQREZfQVZBSUwgYXZhaWwpCi17Ci0JaWYgKGF2YWlsID09IE5VTEwpIHJldHVybjsKLQlkZWxldGUgKENGUERGX0RhdGFBdmFpbCopYXZhaWw7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZBdmFpbF9EZXN0cm95KEZQREZfQVZBSUwgYXZhaWwpIHsKKyAgZGVsZXRlIChDRlBERl9EYXRhQXZhaWwqKWF2YWlsOwogfQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERkF2YWlsX0lzRG9jQXZhaWwoRlBERl9BVkFJTCBhdmFpbCwgRlhfRE9XTkxPQURISU5UUyogaGludHMpCi17Ci0JaWYgKGF2YWlsID09IE5VTEwgfHwgaGludHMgPT0gTlVMTCkgcmV0dXJuIDA7Ci0JQ0ZQREZfRG93bmxvYWRIaW50c1dyYXAgaGludHNfd3JhcChoaW50cyk7Ci0JcmV0dXJuICgoQ0ZQREZfRGF0YUF2YWlsKilhdmFpbCktPm1fcERhdGFBdmFpbC0+SXNEb2NBdmFpbCgmaGludHNfd3JhcCk7CitETExFWFBPUlQgaW50IFNURENBTEwKK0ZQREZBdmFpbF9Jc0RvY0F2YWlsKEZQREZfQVZBSUwgYXZhaWwsIEZYX0RPV05MT0FESElOVFMqIGhpbnRzKSB7CisgIGlmICghYXZhaWwgfHwgIWhpbnRzKQorICAgIHJldHVybiBQREZfREFUQV9FUlJPUjsKKyAgQ0ZQREZfRG93bmxvYWRIaW50c1dyYXAgaGludHNfd3JhcChoaW50cyk7CisgIHJldHVybiAoKENGUERGX0RhdGFBdmFpbCopYXZhaWwpLT5tX3BEYXRhQXZhaWwtPklzRG9jQXZhaWwoJmhpbnRzX3dyYXApOwogfQogCi1leHRlcm4gdm9pZCBDaGVja1VuU3VwcG9ydEVycm9yKENQREZfRG9jdW1lbnQgKiBwRG9jLCBGWF9EV09SRCBlcnJfY29kZSk7CitETExFWFBPUlQgRlBERl9ET0NVTUVOVCBTVERDQUxMCitGUERGQXZhaWxfR2V0RG9jdW1lbnQoRlBERl9BVkFJTCBhdmFpbCwgRlBERl9CWVRFU1RSSU5HIHBhc3N3b3JkKSB7CisgIGlmICghYXZhaWwpCisgICAgcmV0dXJuIE5VTEw7CisgIENQREZfUGFyc2VyKiBwUGFyc2VyID0gbmV3IENQREZfUGFyc2VyOworICBwUGFyc2VyLT5TZXRQYXNzd29yZChwYXNzd29yZCk7CiAKLURMTEVYUE9SVCBGUERGX0RPQ1VNRU5UIFNURENBTEwgRlBERkF2YWlsX0dldERvY3VtZW50KEZQREZfQVZBSUwgYXZhaWwsCUZQREZfQllURVNUUklORyBwYXNzd29yZCkKLXsKLQlpZiAoYXZhaWwgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JQ1BERl9QYXJzZXIqIHBQYXJzZXIgPSBuZXcgQ1BERl9QYXJzZXI7Ci0JcFBhcnNlci0+U2V0UGFzc3dvcmQocGFzc3dvcmQpOwotCi0JRlhfRFdPUkQgZXJyX2NvZGUgPSBwUGFyc2VyLT5TdGFydEFzeW5QYXJzZSgoKENGUERGX0RhdGFBdmFpbCopYXZhaWwpLT5tX3BEYXRhQXZhaWwtPkdldEZpbGVSZWFkKCkpOwotCWlmIChlcnJfY29kZSkgewotCQlkZWxldGUgcFBhcnNlcjsKLQkJUHJvY2Vzc1BhcnNlRXJyb3IoZXJyX2NvZGUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JKChDRlBERl9EYXRhQXZhaWwqKWF2YWlsKS0+bV9wRGF0YUF2YWlsLT5TZXREb2N1bWVudChwUGFyc2VyLT5HZXREb2N1bWVudCgpKTsKLQlDaGVja1VuU3VwcG9ydEVycm9yKHBQYXJzZXItPkdldERvY3VtZW50KCksIEZQREZfRVJSX1NVQ0NFU1MpOwotCXJldHVybiBwUGFyc2VyLT5HZXREb2N1bWVudCgpOworICBGWF9EV09SRCBlcnJfY29kZSA9IHBQYXJzZXItPlN0YXJ0QXN5blBhcnNlKAorICAgICAgKChDRlBERl9EYXRhQXZhaWwqKWF2YWlsKS0+bV9wRGF0YUF2YWlsLT5HZXRGaWxlUmVhZCgpKTsKKyAgaWYgKGVycl9jb2RlKSB7CisgICAgZGVsZXRlIHBQYXJzZXI7CisgICAgUHJvY2Vzc1BhcnNlRXJyb3IoZXJyX2NvZGUpOworICAgIHJldHVybiBOVUxMOworICB9CisgICgoQ0ZQREZfRGF0YUF2YWlsKilhdmFpbCktPm1fcERhdGFBdmFpbC0+U2V0RG9jdW1lbnQocFBhcnNlci0+R2V0RG9jdW1lbnQoKSk7CisgIENoZWNrVW5TdXBwb3J0RXJyb3IocFBhcnNlci0+R2V0RG9jdW1lbnQoKSwgRlBERl9FUlJfU1VDQ0VTUyk7CisgIHJldHVybiBGUERGRG9jdW1lbnRGcm9tQ1BERkRvY3VtZW50KHBQYXJzZXItPkdldERvY3VtZW50KCkpOwogfQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERkF2YWlsX0dldEZpcnN0UGFnZU51bShGUERGX0RPQ1VNRU5UIGRvYykKLXsKLQlpZiAoZG9jID09IE5VTEwpIHJldHVybiAwOwotCUNQREZfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERl9Eb2N1bWVudCopZG9jOwotCXJldHVybiAoKENQREZfUGFyc2VyKilwRG9jLT5HZXRQYXJzZXIoKSktPkdldEZpcnN0UGFnZU5vKCk7CitETExFWFBPUlQgaW50IFNURENBTEwgRlBERkF2YWlsX0dldEZpcnN0UGFnZU51bShGUERGX0RPQ1VNRU5UIGRvYykgeworICBDUERGX0RvY3VtZW50KiBwRG9jID0gQ1BERkRvY3VtZW50RnJvbUZQREZEb2N1bWVudChkb2MpOworICByZXR1cm4gcERvYyA/IHBEb2MtPkdldFBhcnNlcigpLT5HZXRGaXJzdFBhZ2VObygpIDogMDsKIH0KIAotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZBdmFpbF9Jc1BhZ2VBdmFpbChGUERGX0FWQUlMIGF2YWlsLCBpbnQgcGFnZV9pbmRleCwgRlhfRE9XTkxPQURISU5UUyogaGludHMpCi17Ci0JaWYgKGF2YWlsID09IE5VTEwgfHwgaGludHMgPT0gTlVMTCkgcmV0dXJuIDA7Ci0JQ0ZQREZfRG93bmxvYWRIaW50c1dyYXAgaGludHNfd3JhcChoaW50cyk7Ci0JcmV0dXJuICgoQ0ZQREZfRGF0YUF2YWlsKilhdmFpbCktPm1fcERhdGFBdmFpbC0+SXNQYWdlQXZhaWwocGFnZV9pbmRleCwgJmhpbnRzX3dyYXApOworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZBdmFpbF9Jc1BhZ2VBdmFpbChGUERGX0FWQUlMIGF2YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFnZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRE9XTkxPQURISU5UUyogaGludHMpIHsKKyAgaWYgKCFhdmFpbCB8fCAhaGludHMpCisgICAgcmV0dXJuIFBERl9EQVRBX0VSUk9SOworICBDRlBERl9Eb3dubG9hZEhpbnRzV3JhcCBoaW50c193cmFwKGhpbnRzKTsKKyAgcmV0dXJuICgoQ0ZQREZfRGF0YUF2YWlsKilhdmFpbCkKKyAgICAgIC0+bV9wRGF0YUF2YWlsLT5Jc1BhZ2VBdmFpbChwYWdlX2luZGV4LCAmaGludHNfd3JhcCk7CiB9CiAKLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGQXZhaWxfSXNGb3JtQXZhaWwoRlBERl9BVkFJTCBhdmFpbCwgRlhfRE9XTkxPQURISU5UUyogaGludHMpCi17Ci0JaWYgKGF2YWlsID09IE5VTEwgfHwgaGludHMgPT0gTlVMTCkgcmV0dXJuIC0xOwotCUNGUERGX0Rvd25sb2FkSGludHNXcmFwIGhpbnRzX3dyYXAoaGludHMpOwotCXJldHVybiAoKENGUERGX0RhdGFBdmFpbCopYXZhaWwpLT5tX3BEYXRhQXZhaWwtPklzRm9ybUF2YWlsKCZoaW50c193cmFwKTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGQXZhaWxfSXNGb3JtQXZhaWwoRlBERl9BVkFJTCBhdmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRE9XTkxPQURISU5UUyogaGludHMpIHsKKyAgaWYgKCFhdmFpbCB8fCAhaGludHMpCisgICAgcmV0dXJuIFBERl9GT1JNX0VSUk9SOworICBDRlBERl9Eb3dubG9hZEhpbnRzV3JhcCBoaW50c193cmFwKGhpbnRzKTsKKyAgcmV0dXJuICgoQ0ZQREZfRGF0YUF2YWlsKilhdmFpbCktPm1fcERhdGFBdmFpbC0+SXNGb3JtQXZhaWwoJmhpbnRzX3dyYXApOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkF2YWlsX0lzTGluZWFyaXplZChGUERGX0FWQUlMIGF2YWlsKQotewotCQlpZiAoYXZhaWwgPT0gTlVMTCkgcmV0dXJuIC0xOwotCXJldHVybiAoKENGUERGX0RhdGFBdmFpbCopYXZhaWwpLT5tX3BEYXRhQXZhaWwtPklzTGluZWFyaXplZFBERigpOwotCitETExFWFBPUlQgaW50IFNURENBTEwgRlBERkF2YWlsX0lzTGluZWFyaXplZChGUERGX0FWQUlMIGF2YWlsKSB7CisgIGlmICghYXZhaWwpCisgICAgcmV0dXJuIFBERl9MSU5FQVJJWkFUSU9OX1VOS05PV047CisgIHJldHVybiAoKENGUERGX0RhdGFBdmFpbCopYXZhaWwpLT5tX3BEYXRhQXZhaWwtPklzTGluZWFyaXplZFBERigpOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZl9kYXRhYXZhaWxfZW1iZWRkZXJ0ZXN0LmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZfZGF0YWF2YWlsX2VtYmVkZGVydGVzdC5jcHAKaW5kZXggMzIwNzgwMi4uMjIyZmRjNCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZl9kYXRhYXZhaWxfZW1iZWRkZXJ0ZXN0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmX2RhdGFhdmFpbF9lbWJlZGRlcnRlc3QuY3BwCkBAIC0yLDIyICsyLDIxIEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0jaW5jbHVkZSAiLi4vLi4vcHVibGljL2ZwZGZfZG9jLmgiCi0jaW5jbHVkZSAiLi4vLi4vcHVibGljL2ZwZGZ2aWV3LmgiCi0jaW5jbHVkZSAiLi4vLi4vdGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZfZG9jLmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiCisjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCiAKLWNsYXNzIEZQREZEYXRhQXZhaWxFbWJlZGRlcnRlc3QgOiBwdWJsaWMgRW1iZWRkZXJUZXN0IHsKLX07CitjbGFzcyBGUERGRGF0YUF2YWlsRW1iZWRkZXJ0ZXN0IDogcHVibGljIEVtYmVkZGVyVGVzdCB7fTsKIAogVEVTVF9GKEZQREZEYXRhQXZhaWxFbWJlZGRlcnRlc3QsIFRyYWlsZXJVbnRlcm1pbmF0ZWQpIHsKLSAgLy8gRG9jdW1lbnQgbXVzdCBvcGVuIHdpdGhvdXQgY3Jhc2hpbmcgYnV0IGlzIHRvbyBtYWxmb3JtZWQgdG8gYmUgYXZhaWxhYmxlLgotICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoInRlc3RpbmcvcmVzb3VyY2VzL3RyYWlsZXJfdW50ZXJtaW5hdGVkLnBkZiIpKTsKKyAgLy8gRG9jdW1lbnQgbXVzdCBsb2FkIHdpdGhvdXQgY3Jhc2hpbmcgYnV0IGlzIHRvbyBtYWxmb3JtZWQgdG8gYmUgYXZhaWxhYmxlLgorICBFWFBFQ1RfRkFMU0UoT3BlbkRvY3VtZW50KCJ0cmFpbGVyX3VudGVybWluYXRlZC5wZGYiKSk7CiAgIEVYUEVDVF9GQUxTRShGUERGQXZhaWxfSXNEb2NBdmFpbChhdmFpbF8sICZoaW50c18pKTsKIH0KIAogVEVTVF9GKEZQREZEYXRhQXZhaWxFbWJlZGRlcnRlc3QsIFRyYWlsZXJBc0hleHN0cmluZykgewotICAvLyBEb2N1bWVudCBtdXN0IG9wZW4gd2l0aG91dCBjcmFzaGluZyBidXQgaXMgdG9vIG1hbGZvcm1lZCB0byBiZSBhdmFpbGFibGUuCi0gIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgidGVzdGluZy9yZXNvdXJjZXMvdHJhaWxlcl9hc19oZXhzdHJpbmcucGRmIikpOworICAvLyBEb2N1bWVudCBtdXN0IGxvYWQgd2l0aG91dCBjcmFzaGluZyBidXQgaXMgdG9vIG1hbGZvcm1lZCB0byBiZSBhdmFpbGFibGUuCisgIEVYUEVDVF9GQUxTRShPcGVuRG9jdW1lbnQoInRyYWlsZXJfYXNfaGV4c3RyaW5nLnBkZiIpKTsKICAgRVhQRUNUX0ZBTFNFKEZQREZBdmFpbF9Jc0RvY0F2YWlsKGF2YWlsXywgJmhpbnRzXykpOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZl9leHQuY3BwIGIvZnBkZnNkay9zcmMvZnBkZl9leHQuY3BwCmluZGV4IDJkYzhkNzguLmM4MzQ2NGUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZfZXh0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmX2V4dC5jcHAKQEAgLTEsMjQxICsxLDIxOSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vcHVibGljL2ZwZGZfZXh0LmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX2RlZmluZS5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2V4dC5oIgogCi0jZGVmaW5lICBGUERGU0RLX1VOU1VQUE9SVF9DQUxMIDEwMAorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF94bWwuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnNka19kZWZpbmUuaCIKIAotY2xhc3MgQ0ZTREtfVW5zdXBwb3J0SW5mb19BZGFwdGVyCi17Ci1wdWJsaWM6Ci0JQ0ZTREtfVW5zdXBwb3J0SW5mb19BZGFwdGVyKFVOU1VQUE9SVF9JTkZPKiB1bnNwX2luZm8peyBtX3Vuc3BfaW5mbyA9IHVuc3BfaW5mbzt9Ci0vLwlGWF9CT09MIE5lZWRUb1BhdXNlTm93KCk7Ci0Jdm9pZCBSZXBvcnRFcnJvcihpbnQgbkVycm9yVHlwZSk7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2RvYy5oIgorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCi1wcml2YXRlOgotCVVOU1VQUE9SVF9JTkZPKiBtX3Vuc3BfaW5mbzsKKyNkZWZpbmUgRlBERlNES19VTlNVUFBPUlRfQ0FMTCAxMDAKKworY2xhc3MgQ0ZTREtfVW5zdXBwb3J0SW5mb19BZGFwdGVyIHsKKyBwdWJsaWM6CisgIENGU0RLX1Vuc3VwcG9ydEluZm9fQWRhcHRlcihVTlNVUFBPUlRfSU5GTyogdW5zcF9pbmZvKSB7CisgICAgbV91bnNwX2luZm8gPSB1bnNwX2luZm87CisgIH0KKyAgdm9pZCBSZXBvcnRFcnJvcihpbnQgbkVycm9yVHlwZSk7CisKKyBwcml2YXRlOgorICBVTlNVUFBPUlRfSU5GTyogbV91bnNwX2luZm87CiB9OwogCi12b2lkIENGU0RLX1Vuc3VwcG9ydEluZm9fQWRhcHRlcjo6UmVwb3J0RXJyb3IoaW50IG5FcnJvclR5cGUpCi17Ci0JaWYobV91bnNwX2luZm8gJiYgbV91bnNwX2luZm8tPkZTREtfVW5TdXBwb3J0X0hhbmRsZXIpCi0JewotCQltX3Vuc3BfaW5mby0+RlNES19VblN1cHBvcnRfSGFuZGxlcihtX3Vuc3BfaW5mbyxuRXJyb3JUeXBlKTsKLQl9Cit2b2lkIENGU0RLX1Vuc3VwcG9ydEluZm9fQWRhcHRlcjo6UmVwb3J0RXJyb3IoaW50IG5FcnJvclR5cGUpIHsKKyAgaWYgKG1fdW5zcF9pbmZvICYmIG1fdW5zcF9pbmZvLT5GU0RLX1VuU3VwcG9ydF9IYW5kbGVyKSB7CisgICAgbV91bnNwX2luZm8tPkZTREtfVW5TdXBwb3J0X0hhbmRsZXIobV91bnNwX2luZm8sIG5FcnJvclR5cGUpOworICB9CiB9CiAKLXZvaWQgRnJlZVVuc3VwcG9ydEluZm8oRlhfTFBWT0lEIHBEYXRhKQotewotCUNGU0RLX1Vuc3VwcG9ydEluZm9fQWRhcHRlciAqIHBBZGFwdGVyID0gKENGU0RLX1Vuc3VwcG9ydEluZm9fQWRhcHRlciAqKXBEYXRhOwotCWRlbGV0ZSBwQWRhcHRlcjsKK3ZvaWQgRnJlZVVuc3VwcG9ydEluZm8odm9pZCogcERhdGEpIHsKKyAgQ0ZTREtfVW5zdXBwb3J0SW5mb19BZGFwdGVyKiBwQWRhcHRlciA9IChDRlNES19VbnN1cHBvcnRJbmZvX0FkYXB0ZXIqKXBEYXRhOworICBkZWxldGUgcEFkYXB0ZXI7CiB9CiAKLUZYX0JPT0wgRlBERl9VblN1cHBvcnRFcnJvcihpbnQgbkVycm9yKQotewotCUNGU0RLX1Vuc3VwcG9ydEluZm9fQWRhcHRlciAqIHBBZGFwdGVyID0gKENGU0RLX1Vuc3VwcG9ydEluZm9fQWRhcHRlciAqKUNQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UHJpdmF0ZURhdGEoKHZvaWQgKilGUERGU0RLX1VOU1VQUE9SVF9DQUxMKTsKK0ZYX0JPT0wgRlBERl9VblN1cHBvcnRFcnJvcihpbnQgbkVycm9yKSB7CisgIENGU0RLX1Vuc3VwcG9ydEluZm9fQWRhcHRlciogcEFkYXB0ZXIgPQorICAgICAgKENGU0RLX1Vuc3VwcG9ydEluZm9fQWRhcHRlciopQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQcml2YXRlRGF0YSgKKyAgICAgICAgICAodm9pZCopRlBERlNES19VTlNVUFBPUlRfQ0FMTCk7CiAKLQlpZighcEFkYXB0ZXIpCi0JCXJldHVybiBGQUxTRTsKLQlwQWRhcHRlci0+UmVwb3J0RXJyb3IobkVycm9yKTsKLQlyZXR1cm4gVFJVRTsKLX0JCi0KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGU0RLX1NldFVuU3BPYmpQcm9jZXNzSGFuZGxlcihVTlNVUFBPUlRfSU5GTyogdW5zcF9pbmZvKQotewotCWlmICghdW5zcF9pbmZvIHx8IHVuc3BfaW5mby0+dmVyc2lvbiE9MSkKLQkJcmV0dXJuIEZBTFNFOwotCUNGU0RLX1Vuc3VwcG9ydEluZm9fQWRhcHRlciAqIHBBZGFwdGVyID0gbmV3IENGU0RLX1Vuc3VwcG9ydEluZm9fQWRhcHRlcih1bnNwX2luZm8pOwotCi0JQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5TZXRQcml2YXRlRGF0YSgodm9pZCAqKUZQREZTREtfVU5TVVBQT1JUX0NBTEwscEFkYXB0ZXIsICZGcmVlVW5zdXBwb3J0SW5mbyk7Ci0KLQlyZXR1cm4gVFJVRTsKKyAgaWYgKCFwQWRhcHRlcikKKyAgICByZXR1cm4gRkFMU0U7CisgIHBBZGFwdGVyLT5SZXBvcnRFcnJvcihuRXJyb3IpOworICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBDaGVja1VuU3VwcG9ydEFubm90KENQREZfRG9jdW1lbnQgKiBwRG9jLCBDUERGX0Fubm90KiBwUERGQW5ub3QpCi17Ci0JQ0ZYX0J5dGVTdHJpbmcgY2JTdWJUeXBlID0gcFBERkFubm90LT5HZXRTdWJUeXBlKCk7Ci0JaWYoY2JTdWJUeXBlLkNvbXBhcmUoIjNEIikgPT0gMCkKLQl7Ci0JCUZQREZfVW5TdXBwb3J0RXJyb3IoRlBERl9VTlNQX0FOTk9UXzNEQU5OT1QpOwotCX0KLQllbHNlIGlmKGNiU3ViVHlwZS5Db21wYXJlKCJTY3JlZW4iKSA9PTApCi0JewotCQlDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QgPSBwUERGQW5ub3QtPm1fcEFubm90RGljdDsKLQkJQ0ZYX0J5dGVTdHJpbmcgY2JTdHJpbmc7Ci0JCWlmKHBBbm5vdERpY3QtPktleUV4aXN0KCJJVCIpKQotCQkJY2JTdHJpbmcgPSBwQW5ub3REaWN0LT5HZXRTdHJpbmcoIklUIik7Ci0JCWlmKGNiU3RyaW5nLkNvbXBhcmUoIkltZyIpICE9IDApCi0JCQlGUERGX1VuU3VwcG9ydEVycm9yKEZQREZfVU5TUF9BTk5PVF9TQ1JFRU5fTUVESUEpOwotCX0KLQllbHNlIGlmKGNiU3ViVHlwZS5Db21wYXJlKCJNb3ZpZSIpID09MCkKLQl7Ci0JCUZQREZfVW5TdXBwb3J0RXJyb3IoRlBERl9VTlNQX0FOTk9UX01PVklFKTsKLQl9Ci0JZWxzZSBpZihjYlN1YlR5cGUuQ29tcGFyZSgiU291bmQiKSA9PTApCi0JewotCQlGUERGX1VuU3VwcG9ydEVycm9yKEZQREZfVU5TUF9BTk5PVF9TT1VORCk7Ci0JfQotCWVsc2UgaWYoY2JTdWJUeXBlLkNvbXBhcmUoIlJpY2hNZWRpYSIpID09MCkKLQl7Ci0JCUZQREZfVW5TdXBwb3J0RXJyb3IoRlBERl9VTlNQX0FOTk9UX1NDUkVFTl9SSUNITUVESUEpOwotCX0KLQllbHNlIGlmKGNiU3ViVHlwZS5Db21wYXJlKCJGaWxlQXR0YWNobWVudCIpID09MCkKLQl7Ci0JCUZQREZfVW5TdXBwb3J0RXJyb3IoRlBERl9VTlNQX0FOTk9UX0FUVEFDSE1FTlQpOwotCX0KLQllbHNlIGlmKGNiU3ViVHlwZS5Db21wYXJlKCJXaWRnZXQiKSA9PTApCi0JewotCQlDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QgPSBwUERGQW5ub3QtPm1fcEFubm90RGljdDsKLQkJQ0ZYX0J5dGVTdHJpbmcgY2JTdHJpbmc7Ci0JCWlmKHBBbm5vdERpY3QtPktleUV4aXN0KCJGVCIpKQotCQl7Ci0JCQljYlN0cmluZyA9IHBBbm5vdERpY3QtPkdldFN0cmluZygiRlQiKTsKLQkJfQkKLQkJaWYoY2JTdHJpbmcuQ29tcGFyZSgiU2lnIikgPT0gMCkKLQkJewotCQkJRlBERl9VblN1cHBvcnRFcnJvcihGUERGX1VOU1BfQU5OT1RfU0lHKTsKLQkJfQotCX0KLQkKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTAorRlNES19TZXRVblNwT2JqUHJvY2Vzc0hhbmRsZXIoVU5TVVBQT1JUX0lORk8qIHVuc3BfaW5mbykgeworICBpZiAoIXVuc3BfaW5mbyB8fCB1bnNwX2luZm8tPnZlcnNpb24gIT0gMSkKKyAgICByZXR1cm4gRkFMU0U7CisgIENGU0RLX1Vuc3VwcG9ydEluZm9fQWRhcHRlciogcEFkYXB0ZXIgPQorICAgICAgbmV3IENGU0RLX1Vuc3VwcG9ydEluZm9fQWRhcHRlcih1bnNwX2luZm8pOworCisgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+U2V0UHJpdmF0ZURhdGEoKHZvaWQqKUZQREZTREtfVU5TVVBQT1JUX0NBTEwsIHBBZGFwdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZGcmVlVW5zdXBwb3J0SW5mbyk7CisKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgQ2hlY2tTaGFyZWRGb3JtKENYTUxfRWxlbWVudCAqIHBFbGVtZW50LCBDRlhfQnl0ZVN0cmluZyBjYk5hbWUpCi17Ci0JaW50IGNvdW50ID0gcEVsZW1lbnQtPkNvdW50QXR0cnMoKTsKLQlpbnQgaT0wOwotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSAKLQl7Ci0JCUNGWF9CeXRlU3RyaW5nIHNwYWNlLCBuYW1lOyAKLQkJQ0ZYX1dpZGVTdHJpbmcgdmFsdWU7Ci0JCXBFbGVtZW50LT5HZXRBdHRyQnlJbmRleChpLCBzcGFjZSwgbmFtZSwgdmFsdWUpOwotCQlpZiAoc3BhY2UgPT0gRlhfQlNUUkMoInhtbG5zIikgJiYgbmFtZSA9PSBGWF9CU1RSQygiYWRob2N3ZiIpICYmIHZhbHVlID09ICBMImh0dHA6Ly9ucy5hZG9iZS5jb20vQWNyb2JhdEFkaG9jV29ya2Zsb3cvMS4wLyIpCi0JCXsKLQkJCUNYTUxfRWxlbWVudCAqcFZlcnNpb24gPSBwRWxlbWVudC0+R2V0RWxlbWVudCgiYWRob2N3ZiIsY2JOYW1lKTsKLQkJCWlmICghcFZlcnNpb24pCi0JCQkJY29udGludWU7Ci0JCQlDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQgPSBwVmVyc2lvbi0+R2V0Q29udGVudCgwKTsgLy8gPT0gMS4xCi0JCQlpbnQgblR5cGUgPSB3c0NvbnRlbnQuR2V0SW50ZWdlcigpOwotCQkJc3dpdGNoKG5UeXBlKQotCQkJewotCQkJY2FzZSAxOgotCQkJCUZQREZfVW5TdXBwb3J0RXJyb3IoRlBERl9VTlNQX0RPQ19TSEFSRURGT1JNX0FDUk9CQVQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCUZQREZfVW5TdXBwb3J0RXJyb3IoRlBERl9VTlNQX0RPQ19TSEFSRURGT1JNX0ZJTEVTWVNURU0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSAwOgotCQkJCUZQREZfVW5TdXBwb3J0RXJyb3IoRlBERl9VTlNQX0RPQ19TSEFSRURGT1JNX0VNQUlMKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCUZYX0RXT1JEIG5Db3VudCA9IHBFbGVtZW50LT5Db3VudENoaWxkcmVuKCk7Ci0JZm9yKGk9MDsgaTwoaW50KW5Db3VudDsgaSsrKQotCXsKLQkJQ1hNTF9FbGVtZW50OjpDaGlsZFR5cGUgY2hpbGRUeXBlID0gcEVsZW1lbnQtPkdldENoaWxkVHlwZShpKTsKLQkJaWYoY2hpbGRUeXBlID09IENYTUxfRWxlbWVudDo6RWxlbWVudCkKLQkJewotCQkJQ1hNTF9FbGVtZW50ICogcENoaWxkID0gcEVsZW1lbnQtPkdldEVsZW1lbnQoaSk7Ci0JCQlpZihDaGVja1NoYXJlZEZvcm0ocENoaWxkLCBjYk5hbWUpKQotCQkJCXJldHVybiBUUlVFOwotCQl9Ci0JfQotCXJldHVybiBGQUxTRTsKK3ZvaWQgQ2hlY2tVblN1cHBvcnRBbm5vdChDUERGX0RvY3VtZW50KiBwRG9jLCBjb25zdCBDUERGX0Fubm90KiBwUERGQW5ub3QpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgY2JTdWJUeXBlID0gcFBERkFubm90LT5HZXRTdWJUeXBlKCk7CisgIGlmIChjYlN1YlR5cGUuQ29tcGFyZSgiM0QiKSA9PSAwKSB7CisgICAgRlBERl9VblN1cHBvcnRFcnJvcihGUERGX1VOU1BfQU5OT1RfM0RBTk5PVCk7CisgIH0gZWxzZSBpZiAoY2JTdWJUeXBlLkNvbXBhcmUoIlNjcmVlbiIpID09IDApIHsKKyAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QgPSBwUERGQW5ub3QtPkdldEFubm90RGljdCgpOworICAgIENGWF9CeXRlU3RyaW5nIGNiU3RyaW5nOworICAgIGlmIChwQW5ub3REaWN0LT5LZXlFeGlzdCgiSVQiKSkKKyAgICAgIGNiU3RyaW5nID0gcEFubm90RGljdC0+R2V0U3RyaW5nKCJJVCIpOworICAgIGlmIChjYlN0cmluZy5Db21wYXJlKCJJbWciKSAhPSAwKQorICAgICAgRlBERl9VblN1cHBvcnRFcnJvcihGUERGX1VOU1BfQU5OT1RfU0NSRUVOX01FRElBKTsKKyAgfSBlbHNlIGlmIChjYlN1YlR5cGUuQ29tcGFyZSgiTW92aWUiKSA9PSAwKSB7CisgICAgRlBERl9VblN1cHBvcnRFcnJvcihGUERGX1VOU1BfQU5OT1RfTU9WSUUpOworICB9IGVsc2UgaWYgKGNiU3ViVHlwZS5Db21wYXJlKCJTb3VuZCIpID09IDApIHsKKyAgICBGUERGX1VuU3VwcG9ydEVycm9yKEZQREZfVU5TUF9BTk5PVF9TT1VORCk7CisgIH0gZWxzZSBpZiAoY2JTdWJUeXBlLkNvbXBhcmUoIlJpY2hNZWRpYSIpID09IDApIHsKKyAgICBGUERGX1VuU3VwcG9ydEVycm9yKEZQREZfVU5TUF9BTk5PVF9TQ1JFRU5fUklDSE1FRElBKTsKKyAgfSBlbHNlIGlmIChjYlN1YlR5cGUuQ29tcGFyZSgiRmlsZUF0dGFjaG1lbnQiKSA9PSAwKSB7CisgICAgRlBERl9VblN1cHBvcnRFcnJvcihGUERGX1VOU1BfQU5OT1RfQVRUQUNITUVOVCk7CisgIH0gZWxzZSBpZiAoY2JTdWJUeXBlLkNvbXBhcmUoIldpZGdldCIpID09IDApIHsKKyAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QgPSBwUERGQW5ub3QtPkdldEFubm90RGljdCgpOworICAgIENGWF9CeXRlU3RyaW5nIGNiU3RyaW5nOworICAgIGlmIChwQW5ub3REaWN0LT5LZXlFeGlzdCgiRlQiKSkgeworICAgICAgY2JTdHJpbmcgPSBwQW5ub3REaWN0LT5HZXRTdHJpbmcoIkZUIik7CisgICAgfQorICAgIGlmIChjYlN0cmluZy5Db21wYXJlKCJTaWciKSA9PSAwKSB7CisgICAgICBGUERGX1VuU3VwcG9ydEVycm9yKEZQREZfVU5TUF9BTk5PVF9TSUcpOworICAgIH0KKyAgfQogfQogCi12b2lkIENoZWNrVW5TdXBwb3J0RXJyb3IoQ1BERl9Eb2N1bWVudCAqIHBEb2MsIEZYX0RXT1JEIGVycl9jb2RlKQotewotCS8vIFNlY3VyaXR5Ci0JaWYoZXJyX2NvZGUgPT0gRlBERl9FUlJfU0VDVVJJVFkpCi0JewotCQlGUERGX1VuU3VwcG9ydEVycm9yKEZQREZfVU5TUF9ET0NfU0VDVVJJVFkpOwotCQlyZXR1cm4gOwotCX0KLQlpZighcERvYykKLQkJcmV0dXJuIDsKK0ZYX0JPT0wgQ2hlY2tTaGFyZWRGb3JtKGNvbnN0IENYTUxfRWxlbWVudCogcEVsZW1lbnQsIENGWF9CeXRlU3RyaW5nIGNiTmFtZSkgeworICBpbnQgY291bnQgPSBwRWxlbWVudC0+Q291bnRBdHRycygpOworICBpbnQgaSA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgc3BhY2UsIG5hbWU7CisgICAgQ0ZYX1dpZGVTdHJpbmcgdmFsdWU7CisgICAgcEVsZW1lbnQtPkdldEF0dHJCeUluZGV4KGksIHNwYWNlLCBuYW1lLCB2YWx1ZSk7CisgICAgaWYgKHNwYWNlID09ICJ4bWxucyIgJiYgbmFtZSA9PSAiYWRob2N3ZiIgJiYKKyAgICAgICAgdmFsdWUgPT0gTCJodHRwOi8vbnMuYWRvYmUuY29tL0Fjcm9iYXRBZGhvY1dvcmtmbG93LzEuMC8iKSB7CisgICAgICBDWE1MX0VsZW1lbnQqIHBWZXJzaW9uID0gcEVsZW1lbnQtPkdldEVsZW1lbnQoImFkaG9jd2YiLCBjYk5hbWUpOworICAgICAgaWYgKCFwVmVyc2lvbikKKyAgICAgICAgY29udGludWU7CisgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQgPSBwVmVyc2lvbi0+R2V0Q29udGVudCgwKTsgIC8vID09IDEuMQorICAgICAgaW50IG5UeXBlID0gd3NDb250ZW50LkdldEludGVnZXIoKTsKKyAgICAgIHN3aXRjaCAoblR5cGUpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIEZQREZfVW5TdXBwb3J0RXJyb3IoRlBERl9VTlNQX0RPQ19TSEFSRURGT1JNX0FDUk9CQVQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgRlBERl9VblN1cHBvcnRFcnJvcihGUERGX1VOU1BfRE9DX1NIQVJFREZPUk1fRklMRVNZU1RFTSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBGUERGX1VuU3VwcG9ydEVycm9yKEZQREZfVU5TUF9ET0NfU0hBUkVERk9STV9FTUFJTCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CiAKLQkvLyBQb3J0Zm9saW9zIGFuZCBQYWNrYWdlcyAKLQlDUERGX0RpY3Rpb25hcnkgKiBwUm9vdERpY3QgPSBwRG9jLT5HZXRSb290KCk7Ci0JaWYocFJvb3REaWN0KQotCXsKLQkJQ0ZYX0J5dGVTdHJpbmcgY2JTdHJpbmc7Ci0JCWlmKHBSb290RGljdC0+S2V5RXhpc3QoIkNvbGxlY3Rpb24iKSkKLQkJewotCQkJRlBERl9VblN1cHBvcnRFcnJvcihGUERGX1VOU1BfRE9DX1BPUlRBQkxFQ09MTEVDVElPTik7Ci0JCQlyZXR1cm4gOwotCQl9Ci0JCWlmKHBSb290RGljdC0+S2V5RXhpc3QoIk5hbWVzIikpCi0JCXsKLQkJCUNQREZfRGljdGlvbmFyeSogcE5hbWVEaWN0ID0gcFJvb3REaWN0LT5HZXREaWN0KCJOYW1lcyIpOwotCQkJaWYgKHBOYW1lRGljdCAmJiBwTmFtZURpY3QtPktleUV4aXN0KCJFbWJlZGRlZEZpbGVzIikpCi0JCQl7Ci0JCQkJRlBERl9VblN1cHBvcnRFcnJvcihGUERGX1VOU1BfRE9DX0FUVEFDSE1FTlQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UgaWYgKHBOYW1lRGljdCAmJiBwTmFtZURpY3QtPktleUV4aXN0KCJKYXZhU2NyaXB0IikpCi0JCQl7Ci0JCQkJQ1BERl9EaWN0aW9uYXJ5KiBwSlNEaWN0ID0gcE5hbWVEaWN0LT5HZXREaWN0KCJKYXZhU2NyaXB0Iik7Ci0JCQkJQ1BERl9BcnJheSAqIHBBcnJheSA9IHBKU0RpY3QgPyBwSlNEaWN0LT5HZXRBcnJheSgiTmFtZXMiKSA6IE5VTEw7Ci0JCQkJaWYgKHBBcnJheSkgewotCQkJCQlpbnQgbkNvdW50ID0gcEFycmF5LT5HZXRDb3VudCgpOwotCQkJCQlmb3IoaW50IGk9MDsgaTxuQ291bnQ7IGkrKykKLQkJCQkJewotCQkJCQkJQ0ZYX0J5dGVTdHJpbmcgY2JTdHIgPSBwQXJyYXktPkdldFN0cmluZyhpKTsKLQkJCQkJCWlmKGNiU3RyLkNvbXBhcmUoImNvbS5hZG9iZS5hY3JvYmF0LlNoYXJlZFJldmlldy5SZWdpc3RlciIpID09IDApCi0JCQkJCQl7Ci0JCQkJCQkJRlBERl9VblN1cHBvcnRFcnJvcihGUERGX1VOU1BfRE9DX1NIQVJFRFJFVklFVyk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLy8gU2hhcmVkRm9ybQotCUNQREZfTWV0YWRhdGEgbWV0YURhdGE7Ci0JbWV0YURhdGEuTG9hZERvYyhwRG9jKTsKLQlDWE1MX0VsZW1lbnQgKiBwRWxlbWVudCA9IG1ldGFEYXRhLkdldFJvb3QoKTsKLQlpZihwRWxlbWVudCkKLQkJQ2hlY2tTaGFyZWRGb3JtKHBFbGVtZW50LCAid29ya2Zsb3dUeXBlIik7Ci0KLQkvLyBYRkEgRm9ybXMKLQlDUERGX0ludGVyRm9ybSAqIHBJbnRlckZvcm0gPSBuZXcgQ1BERl9JbnRlckZvcm0ocERvYyxGQUxTRSk7Ci0JaWYgKHBJbnRlckZvcm0tPkhhc1hGQUZvcm0oKSkKLQl7Ci0JCUZQREZfVW5TdXBwb3J0RXJyb3IoRlBERl9VTlNQX0RPQ19YRkFGT1JNKTsKLQl9Ci0JZGVsZXRlIHBJbnRlckZvcm07CisgIEZYX0RXT1JEIG5Db3VudCA9IHBFbGVtZW50LT5Db3VudENoaWxkcmVuKCk7CisgIGZvciAoaSA9IDA7IGkgPCAoaW50KW5Db3VudDsgaSsrKSB7CisgICAgQ1hNTF9FbGVtZW50OjpDaGlsZFR5cGUgY2hpbGRUeXBlID0gcEVsZW1lbnQtPkdldENoaWxkVHlwZShpKTsKKyAgICBpZiAoY2hpbGRUeXBlID09IENYTUxfRWxlbWVudDo6RWxlbWVudCkgeworICAgICAgQ1hNTF9FbGVtZW50KiBwQ2hpbGQgPSBwRWxlbWVudC0+R2V0RWxlbWVudChpKTsKKyAgICAgIGlmIChDaGVja1NoYXJlZEZvcm0ocENoaWxkLCBjYk5hbWUpKQorICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQogCi1ETExFWFBPUlQgaW50IEZQREZEb2NfR2V0UGFnZU1vZGUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkKLXsKLQlpZiAoIWRvY3VtZW50KSByZXR1cm4gUEFHRU1PREVfVU5LTk9XTjsKLQlDUERGX0RpY3Rpb25hcnkgKnBSb290ID0gKChDUERGX0RvY3VtZW50Kilkb2N1bWVudCktPkdldFJvb3QoKTsKLQlpZiAoIXBSb290KQotCQlyZXR1cm4gUEFHRU1PREVfVU5LTk9XTjsKLQlDUERGX09iamVjdCogcE5hbWUgPSBwUm9vdC0+R2V0RWxlbWVudCgiUGFnZU1vZGUiKTsKLQlpZiAoIXBOYW1lKQotCQlyZXR1cm4gUEFHRU1PREVfVVNFTk9ORTsKLQlDRlhfQnl0ZVN0cmluZyBzdHJQYWdlTW9kZSA9IHBOYW1lLT5HZXRTdHJpbmcoKTsKLQkKLQlpZiAoc3RyUGFnZU1vZGUuSXNFbXB0eSgpfHxzdHJQYWdlTW9kZS5FcXVhbE5vQ2FzZShGWF9CU1RSKCJVc2VOb25lIikpKQotCQlyZXR1cm4gUEFHRU1PREVfVVNFTk9ORTsKLQllbHNlIGlmIChzdHJQYWdlTW9kZS5FcXVhbE5vQ2FzZShGWF9CU1RSKCJVc2VPdXRsaW5lcyIpKSkKLQkJcmV0dXJuIFBBR0VNT0RFX1VTRU9VVExJTkVTOwotCWVsc2UgaWYgKHN0clBhZ2VNb2RlLkVxdWFsTm9DYXNlKEZYX0JTVFIoIlVzZVRodW1icyIpKSkKLQkJcmV0dXJuIFBBR0VNT0RFX1VTRVRIVU1CUzsKLQllbHNlIGlmIChzdHJQYWdlTW9kZS5FcXVhbE5vQ2FzZShGWF9CU1RSKCJGdWxsU2NyZWVuIikpKQotCQlyZXR1cm4gUEFHRU1PREVfRlVMTFNDUkVFTjsKLQllbHNlIGlmIChzdHJQYWdlTW9kZS5FcXVhbE5vQ2FzZShGWF9CU1RSKCJVc2VPQyIpKSkKLQkJcmV0dXJuIFBBR0VNT0RFX1VTRU9DOwotCWVsc2UgaWYgKHN0clBhZ2VNb2RlLkVxdWFsTm9DYXNlKEZYX0JTVFIoIlVzZUF0dGFjaG1lbnRzIikpKQotCQlyZXR1cm4gUEFHRU1PREVfVVNFQVRUQUNITUVOVFM7Cit2b2lkIENoZWNrVW5TdXBwb3J0RXJyb3IoQ1BERl9Eb2N1bWVudCogcERvYywgRlhfRFdPUkQgZXJyX2NvZGUpIHsKKyAgLy8gU2VjdXJpdHkKKyAgaWYgKGVycl9jb2RlID09IEZQREZfRVJSX1NFQ1VSSVRZKSB7CisgICAgRlBERl9VblN1cHBvcnRFcnJvcihGUERGX1VOU1BfRE9DX1NFQ1VSSVRZKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFwRG9jKQorICAgIHJldHVybjsKIAotCXJldHVybiBQQUdFTU9ERV9VTktOT1dOOworICAvLyBQb3J0Zm9saW9zIGFuZCBQYWNrYWdlcworICBDUERGX0RpY3Rpb25hcnkqIHBSb290RGljdCA9IHBEb2MtPkdldFJvb3QoKTsKKyAgaWYgKHBSb290RGljdCkgeworICAgIENGWF9CeXRlU3RyaW5nIGNiU3RyaW5nOworICAgIGlmIChwUm9vdERpY3QtPktleUV4aXN0KCJDb2xsZWN0aW9uIikpIHsKKyAgICAgIEZQREZfVW5TdXBwb3J0RXJyb3IoRlBERl9VTlNQX0RPQ19QT1JUQUJMRUNPTExFQ1RJT04pOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAocFJvb3REaWN0LT5LZXlFeGlzdCgiTmFtZXMiKSkgeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwTmFtZURpY3QgPSBwUm9vdERpY3QtPkdldERpY3QoIk5hbWVzIik7CisgICAgICBpZiAocE5hbWVEaWN0ICYmIHBOYW1lRGljdC0+S2V5RXhpc3QoIkVtYmVkZGVkRmlsZXMiKSkgeworICAgICAgICBGUERGX1VuU3VwcG9ydEVycm9yKEZQREZfVU5TUF9ET0NfQVRUQUNITUVOVCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmIChwTmFtZURpY3QgJiYgcE5hbWVEaWN0LT5LZXlFeGlzdCgiSmF2YVNjcmlwdCIpKSB7CisgICAgICAgIENQREZfRGljdGlvbmFyeSogcEpTRGljdCA9IHBOYW1lRGljdC0+R2V0RGljdCgiSmF2YVNjcmlwdCIpOworICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBwSlNEaWN0ID8gcEpTRGljdC0+R2V0QXJyYXkoIk5hbWVzIikgOiBOVUxMOworICAgICAgICBpZiAocEFycmF5KSB7CisgICAgICAgICAgaW50IG5Db3VudCA9IHBBcnJheS0+R2V0Q291bnQoKTsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBjYlN0ciA9IHBBcnJheS0+R2V0U3RyaW5nKGkpOworICAgICAgICAgICAgaWYgKGNiU3RyLkNvbXBhcmUoImNvbS5hZG9iZS5hY3JvYmF0LlNoYXJlZFJldmlldy5SZWdpc3RlciIpID09IDApIHsKKyAgICAgICAgICAgICAgRlBERl9VblN1cHBvcnRFcnJvcihGUERGX1VOU1BfRE9DX1NIQVJFRFJFVklFVyk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBTaGFyZWRGb3JtCisgIENQREZfTWV0YWRhdGEgbWV0YURhdGEocERvYyk7CisgIGNvbnN0IENYTUxfRWxlbWVudCogcEVsZW1lbnQgPSBtZXRhRGF0YS5HZXRSb290KCk7CisgIGlmIChwRWxlbWVudCkKKyAgICBDaGVja1NoYXJlZEZvcm0ocEVsZW1lbnQsICJ3b3JrZmxvd1R5cGUiKTsKKworI2lmbmRlZiBQREZfRU5BQkxFX1hGQQorICAvLyBYRkEgRm9ybXMKKyAgQ1BERl9JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBuZXcgQ1BERl9JbnRlckZvcm0ocERvYywgRkFMU0UpOworICBpZiAocEludGVyRm9ybS0+SGFzWEZBRm9ybSgpKSB7CisgICAgRlBERl9VblN1cHBvcnRFcnJvcihGUERGX1VOU1BfRE9DX1hGQUZPUk0pOworICB9CisgIGRlbGV0ZSBwSW50ZXJGb3JtOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorfQorCitETExFWFBPUlQgaW50IEZQREZEb2NfR2V0UGFnZU1vZGUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkgeworICBDUERGX0RvY3VtZW50KiBwRG9jID0gQ1BERkRvY3VtZW50RnJvbUZQREZEb2N1bWVudChkb2N1bWVudCk7CisgIGlmICghcERvYykKKyAgICByZXR1cm4gUEFHRU1PREVfVU5LTk9XTjsKKworICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gcERvYy0+R2V0Um9vdCgpOworICBpZiAoIXBSb290KQorICAgIHJldHVybiBQQUdFTU9ERV9VTktOT1dOOworCisgIENQREZfT2JqZWN0KiBwTmFtZSA9IHBSb290LT5HZXRFbGVtZW50KCJQYWdlTW9kZSIpOworICBpZiAoIXBOYW1lKQorICAgIHJldHVybiBQQUdFTU9ERV9VU0VOT05FOworCisgIENGWF9CeXRlU3RyaW5nIHN0clBhZ2VNb2RlID0gcE5hbWUtPkdldFN0cmluZygpOworICBpZiAoc3RyUGFnZU1vZGUuSXNFbXB0eSgpIHx8IHN0clBhZ2VNb2RlLkVxdWFsTm9DYXNlKCJVc2VOb25lIikpCisgICAgcmV0dXJuIFBBR0VNT0RFX1VTRU5PTkU7CisgIGlmIChzdHJQYWdlTW9kZS5FcXVhbE5vQ2FzZSgiVXNlT3V0bGluZXMiKSkKKyAgICByZXR1cm4gUEFHRU1PREVfVVNFT1VUTElORVM7CisgIGlmIChzdHJQYWdlTW9kZS5FcXVhbE5vQ2FzZSgiVXNlVGh1bWJzIikpCisgICAgcmV0dXJuIFBBR0VNT0RFX1VTRVRIVU1CUzsKKyAgaWYgKHN0clBhZ2VNb2RlLkVxdWFsTm9DYXNlKCJGdWxsU2NyZWVuIikpCisgICAgcmV0dXJuIFBBR0VNT0RFX0ZVTExTQ1JFRU47CisgIGlmIChzdHJQYWdlTW9kZS5FcXVhbE5vQ2FzZSgiVXNlT0MiKSkKKyAgICByZXR1cm4gUEFHRU1PREVfVVNFT0M7CisgIGlmIChzdHJQYWdlTW9kZS5FcXVhbE5vQ2FzZSgiVXNlQXR0YWNobWVudHMiKSkKKyAgICByZXR1cm4gUEFHRU1PREVfVVNFQVRUQUNITUVOVFM7CisKKyAgcmV0dXJuIFBBR0VNT0RFX1VOS05PV047CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmX2ZsYXR0ZW4uY3BwIGIvZnBkZnNkay9zcmMvZnBkZl9mbGF0dGVuLmNwcAppbmRleCBlZWI5OTkzLi41MGQ1MDM2IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmX2ZsYXR0ZW4uY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZfZmxhdHRlbi5jcHAKQEAgLTEsMTEgKzEsMTQgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL3B1YmxpYy9mcGRmX2ZsYXR0ZW4uaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZfZmxhdHRlbi5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCiAKIHR5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9EaWN0aW9uYXJ5Kj4gQ1BERl9PYmplY3RBcnJheTsKIHR5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9SZWN0PiBDUERGX1JlY3RBcnJheTsKQEAgLTEzLDUzNyArMTYsNTA5IEBACiBlbnVtIEZQREZfVFlQRSB7IE1BWCwgTUlOIH07CiBlbnVtIEZQREZfVkFMVUUgeyBUT1AsIExFRlQsIFJJR0hULCBCT1RUT00gfTsKIAotRlhfQk9PTCBJc1ZhbGlhYmxlUmVjdChDUERGX1JlY3QgcmVjdCwgQ1BERl9SZWN0IHJjUGFnZSkKLXsKLQlpZiAoIHJlY3QubGVmdCAtIHJlY3QucmlnaHQgPiAwLjAwMDAwMWYgfHwgCi0JCSByZWN0LmJvdHRvbSAtIHJlY3QudG9wID4gMC4wMDAwMDFmKQotCQlyZXR1cm4gRkFMU0U7Ci0JCi0JaWYgKHJlY3QubGVmdCA9PSAwLjBmICYmCi0JCXJlY3QudG9wID09IDAuMGYgJiYKLQkJcmVjdC5yaWdodCA9PSAwLjBmICYmCi0JCXJlY3QuYm90dG9tID09IDAuMGYpCi0JCXJldHVybiBGQUxTRTsKLQkKLQlpZiAoIXJjUGFnZS5Jc0VtcHR5KCkpCi0JewotCQlpZiAocmVjdC5sZWZ0IC0gcmNQYWdlLmxlZnQgPCAtMTAuMDAwMDAxZiB8fAotCQkJcmVjdC5yaWdodCAtIHJjUGFnZS5yaWdodCA+IDEwLjAwMDAwMWYgfHwKLQkJCXJlY3QudG9wIC0gcmNQYWdlLnRvcCA+IDEwLjAwMDAwMWYgfHwKLQkJCXJlY3QuYm90dG9tIC0gcmNQYWdlLmJvdHRvbSA8IC0xMC4wMDAwMDFmKQotCQkJcmV0dXJuIEZBTFNFOwotCX0KLQkKLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgSXNWYWxpYWJsZVJlY3QoQ1BERl9SZWN0IHJlY3QsIENQREZfUmVjdCByY1BhZ2UpIHsKKyAgaWYgKHJlY3QubGVmdCAtIHJlY3QucmlnaHQgPiAwLjAwMDAwMWYgfHwgcmVjdC5ib3R0b20gLSByZWN0LnRvcCA+IDAuMDAwMDAxZikKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHJlY3QubGVmdCA9PSAwLjBmICYmIHJlY3QudG9wID09IDAuMGYgJiYgcmVjdC5yaWdodCA9PSAwLjBmICYmCisgICAgICByZWN0LmJvdHRvbSA9PSAwLjBmKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAoIXJjUGFnZS5Jc0VtcHR5KCkpIHsKKyAgICBpZiAocmVjdC5sZWZ0IC0gcmNQYWdlLmxlZnQgPCAtMTAuMDAwMDAxZiB8fAorICAgICAgICByZWN0LnJpZ2h0IC0gcmNQYWdlLnJpZ2h0ID4gMTAuMDAwMDAxZiB8fAorICAgICAgICByZWN0LnRvcCAtIHJjUGFnZS50b3AgPiAxMC4wMDAwMDFmIHx8CisgICAgICAgIHJlY3QuYm90dG9tIC0gcmNQYWdlLmJvdHRvbSA8IC0xMC4wMDAwMDFmKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0dXJuIFRSVUU7CiB9CiAKK0ZYX0JPT0wgR2V0Q29udGVudHNSZWN0KENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZWN0QXJyYXkqIHBSZWN0QXJyYXkpIHsKKyAgQ1BERl9QYWdlKiBwUERGUGFnZSA9IG5ldyBDUERGX1BhZ2U7CisgIHBQREZQYWdlLT5Mb2FkKHBEb2MsIHBEaWN0LCBGQUxTRSk7CisgIHBQREZQYWdlLT5QYXJzZUNvbnRlbnQoKTsKIAotRlhfQk9PTCBHZXRDb250ZW50c1JlY3QoIENQREZfRG9jdW1lbnQgKiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LCBDUERGX1JlY3RBcnJheSAqIHBSZWN0QXJyYXkgKQotewotCUNQREZfUGFnZSogcFBERlBhZ2UgPSBuZXcgQ1BERl9QYWdlOwotCXBQREZQYWdlLT5Mb2FkKCBwRG9jLCBwRGljdCwgRkFMU0UgKTsKLQlwUERGUGFnZS0+UGFyc2VDb250ZW50KCk7CisgIEZYX1BPU0lUSU9OIHBvcyA9IHBQREZQYWdlLT5HZXRGaXJzdE9iamVjdFBvc2l0aW9uKCk7CiAKLQlGWF9QT1NJVElPTiBwb3MgPSBwUERGUGFnZS0+R2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpOwotCQotCXdoaWxlIChwb3MpCi0JewotCQlDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqZWN0ID0gcFBERlBhZ2UtPkdldE5leHRPYmplY3QocG9zKTsKLQkJaWYgKCFwUGFnZU9iamVjdCljb250aW51ZTsKLQkJCi0JCUNQREZfUmVjdCByYzsKLQkJcmMubGVmdCA9IHBQYWdlT2JqZWN0LT5tX0xlZnQ7Ci0JCXJjLnJpZ2h0ID0gcFBhZ2VPYmplY3QtPm1fUmlnaHQ7Ci0JCXJjLmJvdHRvbSA9IHBQYWdlT2JqZWN0LT5tX0JvdHRvbTsKLQkJcmMudG9wID0gcFBhZ2VPYmplY3QtPm1fVG9wOwotCQkKLQkJaWYgKElzVmFsaWFibGVSZWN0KHJjLCBwRGljdC0+R2V0UmVjdCgiTWVkaWFCb3giKSkpCi0JCXsKLQkJCXBSZWN0QXJyYXktPkFkZChyYyk7Ci0JCX0KLQl9Ci0JCi0JZGVsZXRlIHBQREZQYWdlOwotCXJldHVybiBUUlVFOwotfQorICB3aGlsZSAocG9zKSB7CisgICAgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iamVjdCA9IHBQREZQYWdlLT5HZXROZXh0T2JqZWN0KHBvcyk7CisgICAgaWYgKCFwUGFnZU9iamVjdCkKKyAgICAgIGNvbnRpbnVlOwogCisgICAgQ1BERl9SZWN0IHJjOworICAgIHJjLmxlZnQgPSBwUGFnZU9iamVjdC0+bV9MZWZ0OworICAgIHJjLnJpZ2h0ID0gcFBhZ2VPYmplY3QtPm1fUmlnaHQ7CisgICAgcmMuYm90dG9tID0gcFBhZ2VPYmplY3QtPm1fQm90dG9tOworICAgIHJjLnRvcCA9IHBQYWdlT2JqZWN0LT5tX1RvcDsKIAotdm9pZCBQYXJzZXJTdHJlYW0oIENQREZfRGljdGlvbmFyeSAqIHBQYWdlRGljLCBDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW0sIENQREZfUmVjdEFycmF5ICogcFJlY3RBcnJheSwgQ1BERl9PYmplY3RBcnJheSAqIHBPYmplY3RBcnJheSApCi17Ci0JaWYgKCFwU3RyZWFtKXJldHVybjsKLQlDUERGX1JlY3QgcmVjdDsKLQlpZiAocFN0cmVhbS0+S2V5RXhpc3QoIlJlY3QiKSkKLQkJcmVjdCA9IHBTdHJlYW0tPkdldFJlY3QoIlJlY3QiKTsKLQllbHNlIGlmIChwU3RyZWFtLT5LZXlFeGlzdCgiQkJveCIpKQotCQlyZWN0ID0gcFN0cmVhbS0+R2V0UmVjdCgiQkJveCIpOwotCQotCWlmIChJc1ZhbGlhYmxlUmVjdChyZWN0LCBwUGFnZURpYy0+R2V0UmVjdCgiTWVkaWFCb3giKSkpCi0JCXBSZWN0QXJyYXktPkFkZChyZWN0KTsKLQkKLQlwT2JqZWN0QXJyYXktPkFkZChwU3RyZWFtKTsKLX0KLQotCi1pbnQgUGFyc2VyQW5ub3RzKCBDUERGX0RvY3VtZW50KiBwU291cmNlRG9jLCBDUERGX0RpY3Rpb25hcnkgKiBwUGFnZURpYywgQ1BERl9SZWN0QXJyYXkgKiBwUmVjdEFycmF5LCBDUERGX09iamVjdEFycmF5ICogcE9iamVjdEFycmF5LCBpbnQgblVzYWdlKQotewotICAgIGlmICghcFNvdXJjZURvYyB8fCAhcFBhZ2VEaWMpCi0gICAgICAgIHJldHVybiBGTEFUVEVOX0ZBSUw7Ci0KLSAgICBHZXRDb250ZW50c1JlY3QoIHBTb3VyY2VEb2MsIHBQYWdlRGljLCBwUmVjdEFycmF5ICk7Ci0gICAgQ1BERl9BcnJheSogcEFubm90cyA9IHBQYWdlRGljLT5HZXRBcnJheSgiQW5ub3RzIik7Ci0gICAgaWYgKCFwQW5ub3RzKQotICAgICAgICByZXR1cm4gRkxBVFRFTl9OT1RISU5HVE9ETzsKLQotICAgIEZYX0RXT1JEIGR3U2l6ZSA9IHBBbm5vdHMtPkdldENvdW50KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KWR3U2l6ZTsgaSsrKQotICAgIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBPYmogPSBwQW5ub3RzLT5HZXRFbGVtZW50VmFsdWUoaSk7Ci0gICAgICAgIGlmICghcE9iaiB8fCBwT2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpYyA9IChDUERGX0RpY3Rpb25hcnkqKXBPYmo7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHNTdWJ0eXBlID0gcEFubm90RGljLT5HZXRTdHJpbmcoIlN1YnR5cGUiKTsKLSAgICAgICAgaWYgKHNTdWJ0eXBlID09ICJQb3B1cCIpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBpbnQgbkFubm90RmxhZyA9IHBBbm5vdERpYy0+R2V0SW50ZWdlcigiRiIpOwotICAgICAgICBpZiAobkFubm90RmxhZyAmIEFOTk9URkxBR19ISURERU4pCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBpZihuVXNhZ2UgPT0gRkxBVF9OT1JNQUxESVNQTEFZKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobkFubm90RmxhZyAmIEFOTk9URkxBR19JTlZJU0lCTEUpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIFBhcnNlclN0cmVhbSggcFBhZ2VEaWMsIHBBbm5vdERpYywgcFJlY3RBcnJheSwgcE9iamVjdEFycmF5ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobkFubm90RmxhZyAmIEFOTk9URkxBR19QUklOVCkKLSAgICAgICAgICAgICAgICBQYXJzZXJTdHJlYW0oIHBQYWdlRGljLCBwQW5ub3REaWMsIHBSZWN0QXJyYXksIHBPYmplY3RBcnJheSApOwotICAgICAgICB9CisgICAgaWYgKElzVmFsaWFibGVSZWN0KHJjLCBwRGljdC0+R2V0UmVjdCgiTWVkaWFCb3giKSkpIHsKKyAgICAgIHBSZWN0QXJyYXktPkFkZChyYyk7CiAgICAgfQotICAgIHJldHVybiBGTEFUVEVOX1NVQ0NFU1M7CisgIH0KKworICBkZWxldGUgcFBERlBhZ2U7CisgIHJldHVybiBUUlVFOwogfQogCit2b2lkIFBhcnNlclN0cmVhbShDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljLAorICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgQ1BERl9SZWN0QXJyYXkqIHBSZWN0QXJyYXksCisgICAgICAgICAgICAgICAgICBDUERGX09iamVjdEFycmF5KiBwT2JqZWN0QXJyYXkpIHsKKyAgaWYgKCFwU3RyZWFtKQorICAgIHJldHVybjsKKyAgQ1BERl9SZWN0IHJlY3Q7CisgIGlmIChwU3RyZWFtLT5LZXlFeGlzdCgiUmVjdCIpKQorICAgIHJlY3QgPSBwU3RyZWFtLT5HZXRSZWN0KCJSZWN0Iik7CisgIGVsc2UgaWYgKHBTdHJlYW0tPktleUV4aXN0KCJCQm94IikpCisgICAgcmVjdCA9IHBTdHJlYW0tPkdldFJlY3QoIkJCb3giKTsKIAotRlhfRkxPQVQgR2V0TWluTWF4VmFsdWUoIENQREZfUmVjdEFycmF5JiBhcnJheSwgRlBERl9UWVBFIHR5cGUsIEZQREZfVkFMVUUgdmFsdWUpCi17Ci0JaW50IG5SZWN0cyA9IGFycmF5LkdldFNpemUoKTsKLQlGWF9GTE9BVCBmUmV0ID0gMC4wZjsKLQkKLQlpZiAoblJlY3RzIDw9IDApcmV0dXJuIDAuMGY7Ci0JCi0JRlhfRkxPQVQqIHBBcnJheSA9IG5ldyBGWF9GTE9BVFtuUmVjdHNdOwotCXN3aXRjaCh2YWx1ZSkKLQl7Ci0JY2FzZSBMRUZUOgotCQl7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5SZWN0czsgaSsrKQotCQkJCXBBcnJheVtpXSA9IENQREZfUmVjdChhcnJheS5HZXRBdChpKSkubGVmdDsKLQkJCQotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIFRPUDoKLQkJewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuUmVjdHM7IGkrKykKLQkJCQlwQXJyYXlbaV0gPSBDUERGX1JlY3QoYXJyYXkuR2V0QXQoaSkpLnRvcDsKLQkJCQotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIFJJR0hUOgotCQl7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5SZWN0czsgaSsrKQotCQkJCXBBcnJheVtpXSA9IENQREZfUmVjdChhcnJheS5HZXRBdChpKSkucmlnaHQ7Ci0JCQkKLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBCT1RUT006Ci0JCXsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgblJlY3RzOyBpKyspCi0JCQkJcEFycmF5W2ldID0gQ1BERl9SZWN0KGFycmF5LkdldEF0KGkpKS5ib3R0b207Ci0JCQkKLQkJCWJyZWFrOwotCQl9Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCWZSZXQgPSBwQXJyYXlbMF07Ci0JaWYgKHR5cGUgPT0gTUFYKQotCXsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBuUmVjdHM7IGkrKykKLQkJCWlmIChmUmV0IDw9IHBBcnJheVtpXSkKLQkJCQlmUmV0ID0gcEFycmF5W2ldOwotCX0KLQllbHNlCi0JewotCQlmb3IgKGludCBpID0gMTsgaSA8IG5SZWN0czsgaSsrKQotCQkJaWYgKGZSZXQgPj0gcEFycmF5W2ldKQotCQkJCWZSZXQgPSBwQXJyYXlbaV07Ci0JfQotCWRlbGV0ZVtdIHBBcnJheTsKLQlyZXR1cm4gZlJldDsKKyAgaWYgKElzVmFsaWFibGVSZWN0KHJlY3QsIHBQYWdlRGljLT5HZXRSZWN0KCJNZWRpYUJveCIpKSkKKyAgICBwUmVjdEFycmF5LT5BZGQocmVjdCk7CisKKyAgcE9iamVjdEFycmF5LT5BZGQocFN0cmVhbSk7CiB9CiAKLUNQREZfUmVjdCBDYWxjdWxhdGVSZWN0KCBDUERGX1JlY3RBcnJheSAqIHBSZWN0QXJyYXkgKQoteworaW50IFBhcnNlckFubm90cyhDUERGX0RvY3VtZW50KiBwU291cmNlRG9jLAorICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljLAorICAgICAgICAgICAgICAgICBDUERGX1JlY3RBcnJheSogcFJlY3RBcnJheSwKKyAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3RBcnJheSogcE9iamVjdEFycmF5LAorICAgICAgICAgICAgICAgICBpbnQgblVzYWdlKSB7CisgIGlmICghcFNvdXJjZURvYyB8fCAhcFBhZ2VEaWMpCisgICAgcmV0dXJuIEZMQVRURU5fRkFJTDsKIAotCUNQREZfUmVjdCByY1JldDsKLQkKLQlyY1JldC5sZWZ0ID0gR2V0TWluTWF4VmFsdWUoKnBSZWN0QXJyYXksIE1JTiwgTEVGVCk7Ci0JcmNSZXQudG9wID0gR2V0TWluTWF4VmFsdWUoKnBSZWN0QXJyYXksIE1BWCwgVE9QKTsKLQlyY1JldC5yaWdodCA9IEdldE1pbk1heFZhbHVlKCpwUmVjdEFycmF5LCBNQVgsIFJJR0hUKTsKLQlyY1JldC5ib3R0b20gPSBHZXRNaW5NYXhWYWx1ZSgqcFJlY3RBcnJheSwgTUlOLCBCT1RUT00pOwotCQotCXJldHVybiByY1JldDsKKyAgR2V0Q29udGVudHNSZWN0KHBTb3VyY2VEb2MsIHBQYWdlRGljLCBwUmVjdEFycmF5KTsKKyAgQ1BERl9BcnJheSogcEFubm90cyA9IHBQYWdlRGljLT5HZXRBcnJheSgiQW5ub3RzIik7CisgIGlmICghcEFubm90cykKKyAgICByZXR1cm4gRkxBVFRFTl9OT1RISU5HVE9ETzsKKworICBGWF9EV09SRCBkd1NpemUgPSBwQW5ub3RzLT5HZXRDb3VudCgpOworICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpZHdTaXplOyBpKyspIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpYyA9IFRvRGljdGlvbmFyeShwQW5ub3RzLT5HZXRFbGVtZW50VmFsdWUoaSkpOworICAgIGlmICghcEFubm90RGljKQorICAgICAgY29udGludWU7CisKKyAgICBDRlhfQnl0ZVN0cmluZyBzU3VidHlwZSA9IHBBbm5vdERpYy0+R2V0U3RyaW5nKCJTdWJ0eXBlIik7CisgICAgaWYgKHNTdWJ0eXBlID09ICJQb3B1cCIpCisgICAgICBjb250aW51ZTsKKworICAgIGludCBuQW5ub3RGbGFnID0gcEFubm90RGljLT5HZXRJbnRlZ2VyKCJGIik7CisgICAgaWYgKG5Bbm5vdEZsYWcgJiBBTk5PVEZMQUdfSElEREVOKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoblVzYWdlID09IEZMQVRfTk9STUFMRElTUExBWSkgeworICAgICAgaWYgKG5Bbm5vdEZsYWcgJiBBTk5PVEZMQUdfSU5WSVNJQkxFKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgUGFyc2VyU3RyZWFtKHBQYWdlRGljLCBwQW5ub3REaWMsIHBSZWN0QXJyYXksIHBPYmplY3RBcnJheSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChuQW5ub3RGbGFnICYgQU5OT1RGTEFHX1BSSU5UKQorICAgICAgICBQYXJzZXJTdHJlYW0ocFBhZ2VEaWMsIHBBbm5vdERpYywgcFJlY3RBcnJheSwgcE9iamVjdEFycmF5KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZMQVRURU5fU1VDQ0VTUzsKIH0KIAorRlhfRkxPQVQgR2V0TWluTWF4VmFsdWUoQ1BERl9SZWN0QXJyYXkmIGFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9UWVBFIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1ZBTFVFIHZhbHVlKSB7CisgIGludCBuUmVjdHMgPSBhcnJheS5HZXRTaXplKCk7CisgIEZYX0ZMT0FUIGZSZXQgPSAwLjBmOwogCi12b2lkIFNldFBhZ2VDb250ZW50cyhDRlhfQnl0ZVN0cmluZyBrZXksIENQREZfRGljdGlvbmFyeSogcFBhZ2UsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLQlDUERGX09iamVjdCogcENvbnRlbnRzT2JqID0gcFBhZ2UtPkdldFN0cmVhbSgiQ29udGVudHMiKTsKLQlpZiAoIXBDb250ZW50c09iaikKLQl7Ci0JCXBDb250ZW50c09iaiA9IHBQYWdlLT5HZXRBcnJheSgiQ29udGVudHMiKTsKLQl9Ci0JCi0JaWYgKCFwQ29udGVudHNPYmopCi0JewotCQkvL0NyZWF0ZSBhIG5ldyBjb250ZW50cyBkaWN0aW9uYXJ5Ci0JCWlmICgha2V5LklzRW1wdHkoKSkKLQkJewotCQkJQ1BERl9TdHJlYW0qIHBOZXdDb250ZW50cyA9IG5ldyBDUERGX1N0cmVhbShOVUxMLCAwLCBuZXcgQ1BERl9EaWN0aW9uYXJ5KTsKLQkJCXBQYWdlLT5TZXRBdFJlZmVyZW5jZSgiQ29udGVudHMiLCBwRG9jdW1lbnQsIHBEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocE5ld0NvbnRlbnRzKSk7CisgIGlmIChuUmVjdHMgPD0gMCkKKyAgICByZXR1cm4gMC4wZjsKIAotCQkJQ0ZYX0J5dGVTdHJpbmcgc1N0cmVhbTsKLQkJCXNTdHJlYW0uRm9ybWF0KCJxIDEgMCAwIDEgMCAwIGNtIC8lcyBEbyBRIiwga2V5LmNfc3RyKCkpOwotCQkJcE5ld0NvbnRlbnRzLT5TZXREYXRhKChGWF9MUENCWVRFKXNTdHJlYW0sIHNTdHJlYW0uR2V0TGVuZ3RoKCksIEZBTFNFLCBGQUxTRSk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KKyAgRlhfRkxPQVQqIHBBcnJheSA9IG5ldyBGWF9GTE9BVFtuUmVjdHNdOworICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgY2FzZSBMRUZUOiB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5SZWN0czsgaSsrKQorICAgICAgICBwQXJyYXlbaV0gPSBDUERGX1JlY3QoYXJyYXkuR2V0QXQoaSkpLmxlZnQ7CiAKLQlpbnQgaVR5cGUgPSBwQ29udGVudHNPYmotPkdldFR5cGUoKTsKLQlDUERGX0FycmF5KiBwQ29udGVudHNBcnJheSA9IE5VTEw7Ci0JCi0Jc3dpdGNoKGlUeXBlKQotCXsKLQljYXNlIFBERk9CSl9TVFJFQU06Ci0JCXsKLQkJCXBDb250ZW50c0FycmF5ID0gbmV3IENQREZfQXJyYXk7Ci0JCQlDUERGX1N0cmVhbSogcENvbnRlbnRzID0gKENQREZfU3RyZWFtKilwQ29udGVudHNPYmo7Ci0JCQlGWF9EV09SRCBkd09iak51bSA9IHBEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocENvbnRlbnRzKTsKLQkJCUNQREZfU3RyZWFtQWNjIGFjYzsKLQkJCWFjYy5Mb2FkQWxsRGF0YShwQ29udGVudHMpOwotCQkJQ0ZYX0J5dGVTdHJpbmcgc1N0cmVhbSA9ICJxXG4iOwotCQkJQ0ZYX0J5dGVTdHJpbmcgc0JvZHkgPSBDRlhfQnl0ZVN0cmluZygoRlhfTFBDU1RSKWFjYy5HZXREYXRhKCksIGFjYy5HZXRTaXplKCkpOwotCQkJc1N0cmVhbSA9IHNTdHJlYW0gKyBzQm9keSArICJcblEiOwotCQkJcENvbnRlbnRzLT5TZXREYXRhKChGWF9MUENCWVRFKXNTdHJlYW0sIHNTdHJlYW0uR2V0TGVuZ3RoKCksIEZBTFNFLCBGQUxTRSk7Ci0JCQlwQ29udGVudHNBcnJheS0+QWRkUmVmZXJlbmNlKHBEb2N1bWVudCwgZHdPYmpOdW0pOwotCQkJYnJlYWs7Ci0JCX0KLQkJCi0JY2FzZSBQREZPQkpfQVJSQVk6Ci0JCXsKLQkJCXBDb250ZW50c0FycmF5ID0gKENQREZfQXJyYXkqKXBDb250ZW50c09iajsKLQkJCWJyZWFrOwotCQl9Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQkKLQkKLQlpZiAoIXBDb250ZW50c0FycmF5KXJldHVybjsKLQkKLQlGWF9EV09SRCBkd09iak51bSA9IHBEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocENvbnRlbnRzQXJyYXkpOwotCXBQYWdlLT5TZXRBdFJlZmVyZW5jZSgiQ29udGVudHMiLCBwRG9jdW1lbnQsIGR3T2JqTnVtKTsKLQkKLQlpZiAoIWtleS5Jc0VtcHR5KCkpCi0JewotCQlDUERGX1N0cmVhbSogcE5ld0NvbnRlbnRzID0gbmV3IENQREZfU3RyZWFtKE5VTEwsIDAsIG5ldyBDUERGX0RpY3Rpb25hcnkpOwotCQlkd09iak51bSA9IHBEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocE5ld0NvbnRlbnRzKTsKLQkJcENvbnRlbnRzQXJyYXktPkFkZFJlZmVyZW5jZShwRG9jdW1lbnQsIGR3T2JqTnVtKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFRPUDogeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuUmVjdHM7IGkrKykKKyAgICAgICAgcEFycmF5W2ldID0gQ1BERl9SZWN0KGFycmF5LkdldEF0KGkpKS50b3A7CiAKLQkJQ0ZYX0J5dGVTdHJpbmcgc1N0cmVhbTsKLQkJc1N0cmVhbS5Gb3JtYXQoInEgMSAwIDAgMSAwIDAgY20gLyVzIERvIFEiLCBrZXkuY19zdHIoKSk7Ci0JCXBOZXdDb250ZW50cy0+U2V0RGF0YSgoRlhfTFBDQllURSlzU3RyZWFtLCBzU3RyZWFtLkdldExlbmd0aCgpLCBGQUxTRSwgRkFMU0UpOwotCX0KLX0KLSAKLUNGWF9BZmZpbmVNYXRyaXggR2V0TWF0cml4KENQREZfUmVjdCByY0Fubm90LCBDUERGX1JlY3QgcmNTdHJlYW0sIENGWF9BZmZpbmVNYXRyaXggbWF0cml4KQotewotCWlmKHJjU3RyZWFtLklzRW1wdHkoKSkKLQkJcmV0dXJuIENGWF9BZmZpbmVNYXRyaXgoKTsKLQkKLQltYXRyaXguVHJhbnNmb3JtUmVjdChyY1N0cmVhbSk7Ci0JcmNTdHJlYW0uTm9ybWFsaXplKCk7Ci0JCi0JRlhfRkxPQVQgYSA9IHJjQW5ub3QuV2lkdGgoKS9yY1N0cmVhbS5XaWR0aCgpOwotCUZYX0ZMT0FUIGQgPSByY0Fubm90LkhlaWdodCgpL3JjU3RyZWFtLkhlaWdodCgpOwotCQotCUZYX0ZMT0FUIGUgPSByY0Fubm90LmxlZnQgLSByY1N0cmVhbS5sZWZ0ICogYTsKLQlGWF9GTE9BVCBmID0gcmNBbm5vdC5ib3R0b20gLSByY1N0cmVhbS5ib3R0b20gKiBkOwotCXJldHVybiBDRlhfQWZmaW5lTWF0cml4KGEsIDAsIDAsIGQsIGUsIGYpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUklHSFQ6IHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgblJlY3RzOyBpKyspCisgICAgICAgIHBBcnJheVtpXSA9IENQREZfUmVjdChhcnJheS5HZXRBdChpKSkucmlnaHQ7CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJPVFRPTTogeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuUmVjdHM7IGkrKykKKyAgICAgICAgcEFycmF5W2ldID0gQ1BERl9SZWN0KGFycmF5LkdldEF0KGkpKS5ib3R0b207CisKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgZlJldCA9IHBBcnJheVswXTsKKyAgaWYgKHR5cGUgPT0gTUFYKSB7CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuUmVjdHM7IGkrKykKKyAgICAgIGlmIChmUmV0IDw9IHBBcnJheVtpXSkKKyAgICAgICAgZlJldCA9IHBBcnJheVtpXTsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IG5SZWN0czsgaSsrKQorICAgICAgaWYgKGZSZXQgPj0gcEFycmF5W2ldKQorICAgICAgICBmUmV0ID0gcEFycmF5W2ldOworICB9CisgIGRlbGV0ZVtdIHBBcnJheTsKKyAgcmV0dXJuIGZSZXQ7CiB9CiAKLXZvaWQgR2V0T2Zmc2V0KEZYX0ZMT0FUJiBmYSwgRlhfRkxPQVQmIGZkLCBGWF9GTE9BVCYgZmUsIEZYX0ZMT0FUJiBmZiwgQ1BERl9SZWN0IHJjQW5ub3QsIENQREZfUmVjdCByY1N0cmVhbSwgQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXgpCi17Ci0JRlhfRkxPQVQgZlN0cmVhbVdpZHRoID0gMC4wZjsKLQlGWF9GTE9BVCBmU3RyZWFtSGVpZ2h0ID0gMC4wZjsKK0NQREZfUmVjdCBDYWxjdWxhdGVSZWN0KENQREZfUmVjdEFycmF5KiBwUmVjdEFycmF5KSB7CisgIENQREZfUmVjdCByY1JldDsKIAorICByY1JldC5sZWZ0ID0gR2V0TWluTWF4VmFsdWUoKnBSZWN0QXJyYXksIE1JTiwgTEVGVCk7CisgIHJjUmV0LnRvcCA9IEdldE1pbk1heFZhbHVlKCpwUmVjdEFycmF5LCBNQVgsIFRPUCk7CisgIHJjUmV0LnJpZ2h0ID0gR2V0TWluTWF4VmFsdWUoKnBSZWN0QXJyYXksIE1BWCwgUklHSFQpOworICByY1JldC5ib3R0b20gPSBHZXRNaW5NYXhWYWx1ZSgqcFJlY3RBcnJheSwgTUlOLCBCT1RUT00pOwogCi0JCi0JaWYgKG1hdHJpeC5hICE9IDAgJiYgbWF0cml4LmQgIT0gMCkKLQl7Ci0JCWZTdHJlYW1XaWR0aCA9IHJjU3RyZWFtLnJpZ2h0IC0gcmNTdHJlYW0ubGVmdDsKLQkJZlN0cmVhbUhlaWdodCA9IHJjU3RyZWFtLnRvcCAtIHJjU3RyZWFtLmJvdHRvbTsKLQl9Ci0JZWxzZQotCXsKLQkJZlN0cmVhbVdpZHRoID0gcmNTdHJlYW0udG9wIC0gcmNTdHJlYW0uYm90dG9tOwotCQlmU3RyZWFtSGVpZ2h0ID0gcmNTdHJlYW0ucmlnaHQgLSByY1N0cmVhbS5sZWZ0OwotCX0KLQkKLQlGWF9GTE9BVCB4MSA9IG1hdHJpeC5hICogcmNTdHJlYW0ubGVmdCArIG1hdHJpeC5jICogcmNTdHJlYW0uYm90dG9tICsgbWF0cml4LmU7Ci0JRlhfRkxPQVQgeTEgPSBtYXRyaXguYiAqIHJjU3RyZWFtLmxlZnQgKyBtYXRyaXguZCAqIHJjU3RyZWFtLmJvdHRvbSArIG1hdHJpeC5mOwotCUZYX0ZMT0FUIHgyID0gbWF0cml4LmEgKiByY1N0cmVhbS5sZWZ0ICsgbWF0cml4LmMgKiByY1N0cmVhbS50b3AgKyBtYXRyaXguZTsKLQlGWF9GTE9BVCB5MiA9IG1hdHJpeC5iICogcmNTdHJlYW0ubGVmdCArIG1hdHJpeC5kICogcmNTdHJlYW0udG9wICsgbWF0cml4LmY7Ci0JRlhfRkxPQVQgeDMgPSBtYXRyaXguYSAqIHJjU3RyZWFtLnJpZ2h0ICsgbWF0cml4LmMgKiByY1N0cmVhbS5ib3R0b20gKyBtYXRyaXguZTsKLQlGWF9GTE9BVCB5MyA9IG1hdHJpeC5iICogcmNTdHJlYW0ucmlnaHQgKyBtYXRyaXguZCAqIHJjU3RyZWFtLmJvdHRvbSArIG1hdHJpeC5mOwotCUZYX0ZMT0FUIHg0ID0gbWF0cml4LmEgKiByY1N0cmVhbS5yaWdodCArIG1hdHJpeC5jICogcmNTdHJlYW0udG9wICsgbWF0cml4LmU7Ci0JRlhfRkxPQVQgeTQgPSBtYXRyaXguYiAqIHJjU3RyZWFtLnJpZ2h0ICsgbWF0cml4LmQgKiByY1N0cmVhbS50b3AgKyBtYXRyaXguZjsKLQkKLQlGWF9GTE9BVCBsZWZ0ID0gRlhfTUlOKEZYX01JTih4MSwgeDIpLCBGWF9NSU4oeDMsIHg0KSk7Ci0JRlhfRkxPQVQgYm90dG9tID0gRlhfTUlOKEZYX01JTih5MSwgeTIpLCBGWF9NSU4oeTMsIHk0KSk7Ci0JCi0JZmEgPSAocmNBbm5vdC5yaWdodCAtIHJjQW5ub3QubGVmdCkvZlN0cmVhbVdpZHRoOwotCWZkID0gKHJjQW5ub3QudG9wIC0gcmNBbm5vdC5ib3R0b20pL2ZTdHJlYW1IZWlnaHQ7Ci0JZmUgPSByY0Fubm90LmxlZnQgLSBsZWZ0ICogZmE7Ci0JZmYgPSByY0Fubm90LmJvdHRvbSAtIGJvdHRvbSAqIGZkOworICByZXR1cm4gcmNSZXQ7CiB9CiAKK3ZvaWQgU2V0UGFnZUNvbnRlbnRzKENGWF9CeXRlU3RyaW5nIGtleSwKKyAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2UsCisgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsKKyAgQ1BERl9PYmplY3QqIHBDb250ZW50c09iaiA9IHBQYWdlLT5HZXRTdHJlYW0oIkNvbnRlbnRzIik7CisgIGlmICghcENvbnRlbnRzT2JqKSB7CisgICAgcENvbnRlbnRzT2JqID0gcFBhZ2UtPkdldEFycmF5KCJDb250ZW50cyIpOworICB9CiAKLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGUGFnZV9GbGF0dGVuKCBGUERGX1BBR0UgcGFnZSwgaW50IG5GbGFnKQotewotCWlmICghcGFnZSkKLQl7Ci0JCXJldHVybiBGTEFUVEVOX0ZBSUw7Ci0JfQorICBpZiAoIXBDb250ZW50c09iaikgeworICAgIC8vIENyZWF0ZSBhIG5ldyBjb250ZW50cyBkaWN0aW9uYXJ5CisgICAgaWYgKCFrZXkuSXNFbXB0eSgpKSB7CisgICAgICBDUERGX1N0cmVhbSogcE5ld0NvbnRlbnRzID0gbmV3IENQREZfU3RyZWFtKE5VTEwsIDAsIG5ldyBDUERGX0RpY3Rpb25hcnkpOworICAgICAgcFBhZ2UtPlNldEF0UmVmZXJlbmNlKCJDb250ZW50cyIsIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBOZXdDb250ZW50cykpOwogCi0JQ1BERl9QYWdlICogcFBhZ2UgPSAoQ1BERl9QYWdlKikoIHBhZ2UgKTsKLQlDUERGX0RvY3VtZW50ICogcERvY3VtZW50ID0gcFBhZ2UtPm1fcERvY3VtZW50OwotCUNQREZfRGljdGlvbmFyeSAqIHBQYWdlRGljdCA9IHBQYWdlLT5tX3BGb3JtRGljdDsKLQkKLQlpZiAoICFwRG9jdW1lbnQgfHwgIXBQYWdlRGljdCApCi0JewotCQlyZXR1cm4gRkxBVFRFTl9GQUlMOwotCX0KKyAgICAgIENGWF9CeXRlU3RyaW5nIHNTdHJlYW07CisgICAgICBzU3RyZWFtLkZvcm1hdCgicSAxIDAgMCAxIDAgMCBjbSAvJXMgRG8gUSIsIGtleS5jX3N0cigpKTsKKyAgICAgIHBOZXdDb250ZW50cy0+U2V0RGF0YSgoY29uc3QgdWludDhfdCopc1N0cmVhbSwgc1N0cmVhbS5HZXRMZW5ndGgoKSwgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KIAotCUNQREZfT2JqZWN0QXJyYXkgT2JqZWN0QXJyYXk7Ci0JQ1BERl9SZWN0QXJyYXkgIFJlY3RBcnJheTsKKyAgaW50IGlUeXBlID0gcENvbnRlbnRzT2JqLT5HZXRUeXBlKCk7CisgIENQREZfQXJyYXkqIHBDb250ZW50c0FycmF5ID0gTlVMTDsKIAotCWludCBpUmV0ID0gRkxBVFRFTl9GQUlMOwotCWlSZXQgPSBQYXJzZXJBbm5vdHMoIHBEb2N1bWVudCwgcFBhZ2VEaWN0LCAmUmVjdEFycmF5LCAmT2JqZWN0QXJyYXksIG5GbGFnKTsKLQlpZiAoaVJldCA9PSBGTEFUVEVOX05PVEhJTkdUT0RPIHx8IGlSZXQgPT0gRkxBVFRFTl9GQUlMKQotCQlyZXR1cm4gaVJldDsKKyAgc3dpdGNoIChpVHlwZSkgeworICAgIGNhc2UgUERGT0JKX1NUUkVBTTogeworICAgICAgcENvbnRlbnRzQXJyYXkgPSBuZXcgQ1BERl9BcnJheTsKKyAgICAgIENQREZfU3RyZWFtKiBwQ29udGVudHMgPSBwQ29udGVudHNPYmotPkFzU3RyZWFtKCk7CisgICAgICBGWF9EV09SRCBkd09iak51bSA9IHBEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocENvbnRlbnRzKTsKKyAgICAgIENQREZfU3RyZWFtQWNjIGFjYzsKKyAgICAgIGFjYy5Mb2FkQWxsRGF0YShwQ29udGVudHMpOworICAgICAgQ0ZYX0J5dGVTdHJpbmcgc1N0cmVhbSA9ICJxXG4iOworICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0JvZHkgPQorICAgICAgICAgIENGWF9CeXRlU3RyaW5nKChjb25zdCBGWF9DSEFSKilhY2MuR2V0RGF0YSgpLCBhY2MuR2V0U2l6ZSgpKTsKKyAgICAgIHNTdHJlYW0gPSBzU3RyZWFtICsgc0JvZHkgKyAiXG5RIjsKKyAgICAgIHBDb250ZW50cy0+U2V0RGF0YSgoY29uc3QgdWludDhfdCopc1N0cmVhbSwgc1N0cmVhbS5HZXRMZW5ndGgoKSwgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOworICAgICAgcENvbnRlbnRzQXJyYXktPkFkZFJlZmVyZW5jZShwRG9jdW1lbnQsIGR3T2JqTnVtKTsKKyAgICAgIGJyZWFrOworICAgIH0KIAotCUNQREZfUmVjdCByY09yaWdpbmFsQ0I7Ci0JQ1BERl9SZWN0IHJjTWVyZ2VyID0gQ2FsY3VsYXRlUmVjdCggJlJlY3RBcnJheSApOwotCUNQREZfUmVjdCByY09yaWdpbmFsTUIgPSBwUGFnZURpY3QtPkdldFJlY3QoIk1lZGlhQm94Iik7CisgICAgY2FzZSBQREZPQkpfQVJSQVk6IHsKKyAgICAgIHBDb250ZW50c0FycmF5ID0gcENvbnRlbnRzT2JqLT5Bc0FycmF5KCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CiAKLQlpZiAocFBhZ2VEaWN0LT5LZXlFeGlzdCgiQ3JvcEJveCIpKQotCQlyY09yaWdpbmFsTUIgPSBwUGFnZURpY3QtPkdldFJlY3QoIkNyb3BCb3giKTsKLQkKLQlpZiAocmNPcmlnaW5hbE1CLklzRW1wdHkoKSkgCQotCXsKLQkJcmNPcmlnaW5hbE1CID0gQ1BERl9SZWN0KDAuMGYsIDAuMGYsIDYxMi4wZiwgNzkyLjBmKTsKLQl9Ci0JCi0JcmNNZXJnZXIubGVmdCA9IHJjTWVyZ2VyLmxlZnQgPCByY09yaWdpbmFsTUIubGVmdD8gcmNPcmlnaW5hbE1CLmxlZnQgOiByY01lcmdlci5sZWZ0OwotCXJjTWVyZ2VyLnJpZ2h0ID0gcmNNZXJnZXIucmlnaHQgPiByY09yaWdpbmFsTUIucmlnaHQ/IHJjT3JpZ2luYWxNQi5yaWdodCA6IHJjTWVyZ2VyLnJpZ2h0OwotCXJjTWVyZ2VyLnRvcCA9IHJjTWVyZ2VyLnRvcCA+IHJjT3JpZ2luYWxNQi50b3A/IHJjT3JpZ2luYWxNQi50b3AgOiByY01lcmdlci50b3A7Ci0JcmNNZXJnZXIuYm90dG9tID0gcmNNZXJnZXIuYm90dG9tIDwgcmNPcmlnaW5hbE1CLmJvdHRvbT8gcmNPcmlnaW5hbE1CLmJvdHRvbSA6IHJjTWVyZ2VyLmJvdHRvbTsKLQkKLQlpZiAocFBhZ2VEaWN0LT5LZXlFeGlzdCgiQXJ0Qm94IikpCi0JCXJjT3JpZ2luYWxDQiA9IHBQYWdlRGljdC0+R2V0UmVjdCgiQXJ0Qm94Iik7Ci0JZWxzZQotCQlyY09yaWdpbmFsQ0IgPSByY09yaWdpbmFsTUI7CisgIGlmICghcENvbnRlbnRzQXJyYXkpCisgICAgcmV0dXJuOwogCi0JaWYgKCFyY09yaWdpbmFsTUIuSXNFbXB0eSgpKQotCXsKLQkJQ1BERl9BcnJheSogcE1lZGlhQm94ID0gbmV3IENQREZfQXJyYXkoKTsKLQkJcE1lZGlhQm94LT5BZGQobmV3IENQREZfTnVtYmVyKHJjT3JpZ2luYWxNQi5sZWZ0KSk7Ci0JCXBNZWRpYUJveC0+QWRkKG5ldyBDUERGX051bWJlcihyY09yaWdpbmFsTUIuYm90dG9tKSk7Ci0JCXBNZWRpYUJveC0+QWRkKG5ldyBDUERGX051bWJlcihyY09yaWdpbmFsTUIucmlnaHQpKTsKLQkJcE1lZGlhQm94LT5BZGQobmV3IENQREZfTnVtYmVyKHJjT3JpZ2luYWxNQi50b3ApKTsKLQkJcFBhZ2VEaWN0LT5TZXRBdCgiTWVkaWFCb3giLHBNZWRpYUJveCk7Ci0JfQorICBGWF9EV09SRCBkd09iak51bSA9IHBEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocENvbnRlbnRzQXJyYXkpOworICBwUGFnZS0+U2V0QXRSZWZlcmVuY2UoIkNvbnRlbnRzIiwgcERvY3VtZW50LCBkd09iak51bSk7CiAKLQlpZiAoIXJjT3JpZ2luYWxDQi5Jc0VtcHR5KCkpCi0JewotCQlDUERGX0FycmF5KiBwQ3JvcEJveCA9IG5ldyBDUERGX0FycmF5KCk7Ci0JCXBDcm9wQm94LT5BZGQobmV3IENQREZfTnVtYmVyKHJjT3JpZ2luYWxDQi5sZWZ0KSk7Ci0JCXBDcm9wQm94LT5BZGQobmV3IENQREZfTnVtYmVyKHJjT3JpZ2luYWxDQi5ib3R0b20pKTsKLQkJcENyb3BCb3gtPkFkZChuZXcgQ1BERl9OdW1iZXIocmNPcmlnaW5hbENCLnJpZ2h0KSk7Ci0JCXBDcm9wQm94LT5BZGQobmV3IENQREZfTnVtYmVyKHJjT3JpZ2luYWxDQi50b3ApKTsKLQkJcFBhZ2VEaWN0LT5TZXRBdCgiQXJ0Qm94IiwgcENyb3BCb3gpOwotCX0KKyAgaWYgKCFrZXkuSXNFbXB0eSgpKSB7CisgICAgQ1BERl9TdHJlYW0qIHBOZXdDb250ZW50cyA9IG5ldyBDUERGX1N0cmVhbShOVUxMLCAwLCBuZXcgQ1BERl9EaWN0aW9uYXJ5KTsKKyAgICBkd09iak51bSA9IHBEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocE5ld0NvbnRlbnRzKTsKKyAgICBwQ29udGVudHNBcnJheS0+QWRkUmVmZXJlbmNlKHBEb2N1bWVudCwgZHdPYmpOdW0pOwogCi0JQ1BERl9EaWN0aW9uYXJ5KiBwUmVzID0gcFBhZ2VEaWN0LT5HZXREaWN0KCJSZXNvdXJjZXMiKTsKLQlpZiAoIXBSZXMpCi0JewotCQlwUmVzID0gbmV3IENQREZfRGljdGlvbmFyeTsKLQkJcFBhZ2VEaWN0LT5TZXRBdCgiUmVzb3VyY2VzIiwgcFJlcyApOwotCX0KKyAgICBDRlhfQnl0ZVN0cmluZyBzU3RyZWFtOworICAgIHNTdHJlYW0uRm9ybWF0KCJxIDEgMCAwIDEgMCAwIGNtIC8lcyBEbyBRIiwga2V5LmNfc3RyKCkpOworICAgIHBOZXdDb250ZW50cy0+U2V0RGF0YSgoY29uc3QgdWludDhfdCopc1N0cmVhbSwgc1N0cmVhbS5HZXRMZW5ndGgoKSwgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsKKyAgfQorfQogCi0JQ1BERl9TdHJlYW0qIHBOZXdYT2JqZWN0ID0gbmV3IENQREZfU3RyZWFtKE5VTEwsIDAsIG5ldyBDUERGX0RpY3Rpb25hcnkpOwotCUZYX0RXT1JEIGR3T2JqTnVtID0gcERvY3VtZW50LT5BZGRJbmRpcmVjdE9iamVjdChwTmV3WE9iamVjdCk7Ci0JQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVhPYmplY3QgPSBwUmVzLT5HZXREaWN0KCJYT2JqZWN0Iik7Ci0JaWYgKCFwUGFnZVhPYmplY3QpCi0JewotCQlwUGFnZVhPYmplY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotCQlwUmVzLT5TZXRBdCgiWE9iamVjdCIsIHBQYWdlWE9iamVjdCk7Ci0JfQorQ0ZYX01hdHJpeCBHZXRNYXRyaXgoQ1BERl9SZWN0IHJjQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICBDUERGX1JlY3QgcmNTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsKKyAgaWYgKHJjU3RyZWFtLklzRW1wdHkoKSkKKyAgICByZXR1cm4gQ0ZYX01hdHJpeCgpOwogCi0JQ0ZYX0J5dGVTdHJpbmcga2V5ID0gIiI7Ci0JaW50IG5TdHJlYW1zID0gT2JqZWN0QXJyYXkuR2V0U2l6ZSgpOworICBtYXRyaXguVHJhbnNmb3JtUmVjdChyY1N0cmVhbSk7CisgIHJjU3RyZWFtLk5vcm1hbGl6ZSgpOwogCi0JaWYgKG5TdHJlYW1zID4gMCkKLQl7Ci0JCWZvciAoaW50IGlLZXkgPSAwOyAvKmlLZXkgPCAxMDAqLzsgaUtleSsrKQotCQl7Ci0JCQljaGFyIHNFeHRlbmRbNV0gPSB7MH07Ci0JCQlGWFNZU19pdG9hKGlLZXksIHNFeHRlbmQsIDEwKTsKLQkJCWtleSA9IENGWF9CeXRlU3RyaW5nKCJGRlQiKSArIENGWF9CeXRlU3RyaW5nKHNFeHRlbmQpOworICBGWF9GTE9BVCBhID0gcmNBbm5vdC5XaWR0aCgpIC8gcmNTdHJlYW0uV2lkdGgoKTsKKyAgRlhfRkxPQVQgZCA9IHJjQW5ub3QuSGVpZ2h0KCkgLyByY1N0cmVhbS5IZWlnaHQoKTsKIAotCQkJaWYgKCFwUGFnZVhPYmplY3QtPktleUV4aXN0KGtleSkpCi0JCQkJYnJlYWs7Ci0JCX0KLQl9CisgIEZYX0ZMT0FUIGUgPSByY0Fubm90LmxlZnQgLSByY1N0cmVhbS5sZWZ0ICogYTsKKyAgRlhfRkxPQVQgZiA9IHJjQW5ub3QuYm90dG9tIC0gcmNTdHJlYW0uYm90dG9tICogZDsKKyAgcmV0dXJuIENGWF9NYXRyaXgoYSwgMCwgMCwgZCwgZSwgZik7Cit9CiAKLQlTZXRQYWdlQ29udGVudHMoa2V5LCBwUGFnZURpY3QsIHBEb2N1bWVudCk7Cit2b2lkIEdldE9mZnNldChGWF9GTE9BVCYgZmEsCisgICAgICAgICAgICAgICBGWF9GTE9BVCYgZmQsCisgICAgICAgICAgICAgICBGWF9GTE9BVCYgZmUsCisgICAgICAgICAgICAgICBGWF9GTE9BVCYgZmYsCisgICAgICAgICAgICAgICBDUERGX1JlY3QgcmNBbm5vdCwKKyAgICAgICAgICAgICAgIENQREZfUmVjdCByY1N0cmVhbSwKKyAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgeworICBGWF9GTE9BVCBmU3RyZWFtV2lkdGggPSAwLjBmOworICBGWF9GTE9BVCBmU3RyZWFtSGVpZ2h0ID0gMC4wZjsKIAotCUNQREZfRGljdGlvbmFyeSogcE5ld1hPUmVzID0gTlVMTDsKKyAgaWYgKG1hdHJpeC5hICE9IDAgJiYgbWF0cml4LmQgIT0gMCkgeworICAgIGZTdHJlYW1XaWR0aCA9IHJjU3RyZWFtLnJpZ2h0IC0gcmNTdHJlYW0ubGVmdDsKKyAgICBmU3RyZWFtSGVpZ2h0ID0gcmNTdHJlYW0udG9wIC0gcmNTdHJlYW0uYm90dG9tOworICB9IGVsc2UgeworICAgIGZTdHJlYW1XaWR0aCA9IHJjU3RyZWFtLnRvcCAtIHJjU3RyZWFtLmJvdHRvbTsKKyAgICBmU3RyZWFtSGVpZ2h0ID0gcmNTdHJlYW0ucmlnaHQgLSByY1N0cmVhbS5sZWZ0OworICB9CiAKLQlpZiAoIWtleS5Jc0VtcHR5KCkpCi0JewotCQlwUGFnZVhPYmplY3QtPlNldEF0UmVmZXJlbmNlKGtleSwgcERvY3VtZW50LCBkd09iak51bSk7Ci0JCUNQREZfRGljdGlvbmFyeSogcE5ld09YYmplY3REaWMgPSBwTmV3WE9iamVjdC0+R2V0RGljdCgpOwotCQlwTmV3WE9SZXMgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotCQlwTmV3T1hiamVjdERpYy0+U2V0QXQoIlJlc291cmNlcyIsIHBOZXdYT1Jlcyk7Ci0JCXBOZXdPWGJqZWN0RGljLT5TZXRBdE5hbWUoIlR5cGUiLCAiWE9iamVjdCIpOwotCQlwTmV3T1hiamVjdERpYy0+U2V0QXROYW1lKCJTdWJ0eXBlIiwgIkZvcm0iKTsKLQkJcE5ld09YYmplY3REaWMtPlNldEF0SW50ZWdlcigiRm9ybVR5cGUiLCAxKTsKLQkJcE5ld09YYmplY3REaWMtPlNldEF0TmFtZSgiTmFtZSIsICJGUk0iKTsKLQkJQ1BERl9SZWN0IHJjQkJveCA9IHBQYWdlRGljdC0+R2V0UmVjdCgiQXJ0Qm94Iik7Ci0JCXBOZXdPWGJqZWN0RGljLT5TZXRBdFJlY3QoIkJCb3giLCByY0JCb3gpOwotCX0KKyAgRlhfRkxPQVQgeDEgPQorICAgICAgbWF0cml4LmEgKiByY1N0cmVhbS5sZWZ0ICsgbWF0cml4LmMgKiByY1N0cmVhbS5ib3R0b20gKyBtYXRyaXguZTsKKyAgRlhfRkxPQVQgeTEgPQorICAgICAgbWF0cml4LmIgKiByY1N0cmVhbS5sZWZ0ICsgbWF0cml4LmQgKiByY1N0cmVhbS5ib3R0b20gKyBtYXRyaXguZjsKKyAgRlhfRkxPQVQgeDIgPSBtYXRyaXguYSAqIHJjU3RyZWFtLmxlZnQgKyBtYXRyaXguYyAqIHJjU3RyZWFtLnRvcCArIG1hdHJpeC5lOworICBGWF9GTE9BVCB5MiA9IG1hdHJpeC5iICogcmNTdHJlYW0ubGVmdCArIG1hdHJpeC5kICogcmNTdHJlYW0udG9wICsgbWF0cml4LmY7CisgIEZYX0ZMT0FUIHgzID0KKyAgICAgIG1hdHJpeC5hICogcmNTdHJlYW0ucmlnaHQgKyBtYXRyaXguYyAqIHJjU3RyZWFtLmJvdHRvbSArIG1hdHJpeC5lOworICBGWF9GTE9BVCB5MyA9CisgICAgICBtYXRyaXguYiAqIHJjU3RyZWFtLnJpZ2h0ICsgbWF0cml4LmQgKiByY1N0cmVhbS5ib3R0b20gKyBtYXRyaXguZjsKKyAgRlhfRkxPQVQgeDQgPSBtYXRyaXguYSAqIHJjU3RyZWFtLnJpZ2h0ICsgbWF0cml4LmMgKiByY1N0cmVhbS50b3AgKyBtYXRyaXguZTsKKyAgRlhfRkxPQVQgeTQgPSBtYXRyaXguYiAqIHJjU3RyZWFtLnJpZ2h0ICsgbWF0cml4LmQgKiByY1N0cmVhbS50b3AgKyBtYXRyaXguZjsKIAotCWZvciAoaW50IGkgPSAwOyBpIDwgblN0cmVhbXM7IGkrKykKLQl7Ci0JCUNQREZfRGljdGlvbmFyeSogcEFubm90RGljID0gT2JqZWN0QXJyYXkuR2V0QXQoaSk7Ci0JCWlmICghcEFubm90RGljKWNvbnRpbnVlOworICBGWF9GTE9BVCBsZWZ0ID0gc3RkOjptaW4oc3RkOjptaW4oeDEsIHgyKSwgc3RkOjptaW4oeDMsIHg0KSk7CisgIEZYX0ZMT0FUIGJvdHRvbSA9IHN0ZDo6bWluKHN0ZDo6bWluKHkxLCB5MiksIHN0ZDo6bWluKHkzLCB5NCkpOwogCi0JCUNQREZfUmVjdCByY0Fubm90ID0gcEFubm90RGljLT5HZXRSZWN0KCJSZWN0Iik7Ci0JCXJjQW5ub3QuTm9ybWFsaXplKCk7CisgIGZhID0gKHJjQW5ub3QucmlnaHQgLSByY0Fubm90LmxlZnQpIC8gZlN0cmVhbVdpZHRoOworICBmZCA9IChyY0Fubm90LnRvcCAtIHJjQW5ub3QuYm90dG9tKSAvIGZTdHJlYW1IZWlnaHQ7CisgIGZlID0gcmNBbm5vdC5sZWZ0IC0gbGVmdCAqIGZhOworICBmZiA9IHJjQW5ub3QuYm90dG9tIC0gYm90dG9tICogZmQ7Cit9CiAKLQkJQ0ZYX0J5dGVTdHJpbmcgc0Fubm90U3RhdGUgPSBwQW5ub3REaWMtPkdldFN0cmluZygiQVMiKTsKLQkJQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3RBUCA9IHBBbm5vdERpYy0+R2V0RGljdCgiQVAiKTsKLQkJaWYgKCFwQW5ub3RBUCljb250aW51ZTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGUGFnZV9GbGF0dGVuKEZQREZfUEFHRSBwYWdlLCBpbnQgbkZsYWcpIHsKKyAgQ1BERl9QYWdlKiBwUGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2UpOworICBpZiAoIXBhZ2UpIHsKKyAgICByZXR1cm4gRkxBVFRFTl9GQUlMOworICB9CiAKLQkJQ1BERl9TdHJlYW0qIHBBUFN0cmVhbSA9IHBBbm5vdEFQLT5HZXRTdHJlYW0oIk4iKTsKLQkJaWYgKCFwQVBTdHJlYW0pCi0JCXsKLQkJCUNQREZfRGljdGlvbmFyeSogcEFQRGljID0gcEFubm90QVAtPkdldERpY3QoIk4iKTsKLQkJCWlmICghcEFQRGljKWNvbnRpbnVlOworICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwUGFnZS0+bV9wRG9jdW1lbnQ7CisgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0OwogCi0JCQlpZiAoIXNBbm5vdFN0YXRlLklzRW1wdHkoKSkKLQkJCXsKLQkJCQlwQVBTdHJlYW0gPSBwQVBEaWMtPkdldFN0cmVhbShzQW5ub3RTdGF0ZSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJRlhfUE9TSVRJT04gcG9zID0gcEFQRGljLT5HZXRTdGFydFBvcygpOwotCQkJCWlmIChwb3MpCi0JCQkJewotCQkJCQlDRlhfQnl0ZVN0cmluZyBzS2V5OwotCQkJCQlDUERGX09iamVjdCogcEZpcnN0T2JqID0gcEFQRGljLT5HZXROZXh0RWxlbWVudChwb3MsIHNLZXkpOwotCQkJCQlpZiAocEZpcnN0T2JqKQotCQkJCQl7Ci0JCQkJCQlpZiAocEZpcnN0T2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1JFRkVSRU5DRSkKLQkJCQkJCQlwRmlyc3RPYmogPSBwRmlyc3RPYmotPkdldERpcmVjdCgpOwotCQkJCQkJCi0JCQkJCQlpZiAocEZpcnN0T2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX1NUUkVBTSkKLQkJCQkJCQljb250aW51ZTsKKyAgaWYgKCFwRG9jdW1lbnQgfHwgIXBQYWdlRGljdCkgeworICAgIHJldHVybiBGTEFUVEVOX0ZBSUw7CisgIH0KIAotCQkJCQkJcEFQU3RyZWFtID0gKENQREZfU3RyZWFtKilwRmlyc3RPYmo7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgQ1BERl9PYmplY3RBcnJheSBPYmplY3RBcnJheTsKKyAgQ1BERl9SZWN0QXJyYXkgUmVjdEFycmF5OwogCi0JCWlmICghcEFQU3RyZWFtKWNvbnRpbnVlOworICBpbnQgaVJldCA9IEZMQVRURU5fRkFJTDsKKyAgaVJldCA9IFBhcnNlckFubm90cyhwRG9jdW1lbnQsIHBQYWdlRGljdCwgJlJlY3RBcnJheSwgJk9iamVjdEFycmF5LCBuRmxhZyk7CisgIGlmIChpUmV0ID09IEZMQVRURU5fTk9USElOR1RPRE8gfHwgaVJldCA9PSBGTEFUVEVOX0ZBSUwpCisgICAgcmV0dXJuIGlSZXQ7CiAKLQkJQ1BERl9EaWN0aW9uYXJ5KiBwQVBEaWMgPSBwQVBTdHJlYW0tPkdldERpY3QoKTsKLQkJQ0ZYX0FmZmluZU1hdHJpeCBtYXRyaXggPSBwQVBEaWMtPkdldE1hdHJpeCgiTWF0cml4Iik7CisgIENQREZfUmVjdCByY09yaWdpbmFsQ0I7CisgIENQREZfUmVjdCByY01lcmdlciA9IENhbGN1bGF0ZVJlY3QoJlJlY3RBcnJheSk7CisgIENQREZfUmVjdCByY09yaWdpbmFsTUIgPSBwUGFnZURpY3QtPkdldFJlY3QoIk1lZGlhQm94Iik7CiAKLQkJQ1BERl9SZWN0IHJjU3RyZWFtOwotCQlpZiAocEFQRGljLT5LZXlFeGlzdCgiUmVjdCIpKQotCQkJcmNTdHJlYW0gPSBwQVBEaWMtPkdldFJlY3QoIlJlY3QiKTsKLQkJZWxzZSBpZiAocEFQRGljLT5LZXlFeGlzdCgiQkJveCIpKQotCQkJcmNTdHJlYW0gPSBwQVBEaWMtPkdldFJlY3QoIkJCb3giKTsKKyAgaWYgKHBQYWdlRGljdC0+S2V5RXhpc3QoIkNyb3BCb3giKSkKKyAgICByY09yaWdpbmFsTUIgPSBwUGFnZURpY3QtPkdldFJlY3QoIkNyb3BCb3giKTsKIAotCQlpZiAocmNTdHJlYW0uSXNFbXB0eSgpKWNvbnRpbnVlOworICBpZiAocmNPcmlnaW5hbE1CLklzRW1wdHkoKSkgeworICAgIHJjT3JpZ2luYWxNQiA9IENQREZfUmVjdCgwLjBmLCAwLjBmLCA2MTIuMGYsIDc5Mi4wZik7CisgIH0KIAotCQlDUERGX09iamVjdCogcE9iaiA9IHBBUFN0cmVhbTsKKyAgcmNNZXJnZXIubGVmdCA9CisgICAgICByY01lcmdlci5sZWZ0IDwgcmNPcmlnaW5hbE1CLmxlZnQgPyByY09yaWdpbmFsTUIubGVmdCA6IHJjTWVyZ2VyLmxlZnQ7CisgIHJjTWVyZ2VyLnJpZ2h0ID0KKyAgICAgIHJjTWVyZ2VyLnJpZ2h0ID4gcmNPcmlnaW5hbE1CLnJpZ2h0ID8gcmNPcmlnaW5hbE1CLnJpZ2h0IDogcmNNZXJnZXIucmlnaHQ7CisgIHJjTWVyZ2VyLnRvcCA9CisgICAgICByY01lcmdlci50b3AgPiByY09yaWdpbmFsTUIudG9wID8gcmNPcmlnaW5hbE1CLnRvcCA6IHJjTWVyZ2VyLnRvcDsKKyAgcmNNZXJnZXIuYm90dG9tID0gcmNNZXJnZXIuYm90dG9tIDwgcmNPcmlnaW5hbE1CLmJvdHRvbSA/IHJjT3JpZ2luYWxNQi5ib3R0b20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJjTWVyZ2VyLmJvdHRvbTsKIAotCQlpZiAocE9iaikKLQkJewkJCi0JCQlDUERGX0RpY3Rpb25hcnkqIHBPYmpEaWMgPSBwT2JqLT5HZXREaWN0KCk7Ci0JCQlpZiAocE9iakRpYykKLQkJCXsKLQkJCQlwT2JqRGljLT5TZXRBdE5hbWUoIlR5cGUiLCAiWE9iamVjdCIpOwotCQkJCXBPYmpEaWMtPlNldEF0TmFtZSgiU3VidHlwZSIsICJGb3JtIik7Ci0JCQl9Ci0JCX0KKyAgaWYgKHBQYWdlRGljdC0+S2V5RXhpc3QoIkFydEJveCIpKQorICAgIHJjT3JpZ2luYWxDQiA9IHBQYWdlRGljdC0+R2V0UmVjdCgiQXJ0Qm94Iik7CisgIGVsc2UKKyAgICByY09yaWdpbmFsQ0IgPSByY09yaWdpbmFsTUI7CiAKLQkJQ1BERl9EaWN0aW9uYXJ5KiBwWE9iamVjdCA9IHBOZXdYT1Jlcy0+R2V0RGljdCgiWE9iamVjdCIpOwotCQlpZiAoIXBYT2JqZWN0KQotCQl7Ci0JCQlwWE9iamVjdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7Ci0JCQlwTmV3WE9SZXMtPlNldEF0KCJYT2JqZWN0IiwgcFhPYmplY3QpOwotCQl9CisgIGlmICghcmNPcmlnaW5hbE1CLklzRW1wdHkoKSkgeworICAgIENQREZfQXJyYXkqIHBNZWRpYUJveCA9IG5ldyBDUERGX0FycmF5KCk7CisgICAgcE1lZGlhQm94LT5BZGQobmV3IENQREZfTnVtYmVyKHJjT3JpZ2luYWxNQi5sZWZ0KSk7CisgICAgcE1lZGlhQm94LT5BZGQobmV3IENQREZfTnVtYmVyKHJjT3JpZ2luYWxNQi5ib3R0b20pKTsKKyAgICBwTWVkaWFCb3gtPkFkZChuZXcgQ1BERl9OdW1iZXIocmNPcmlnaW5hbE1CLnJpZ2h0KSk7CisgICAgcE1lZGlhQm94LT5BZGQobmV3IENQREZfTnVtYmVyKHJjT3JpZ2luYWxNQi50b3ApKTsKKyAgICBwUGFnZURpY3QtPlNldEF0KCJNZWRpYUJveCIsIHBNZWRpYUJveCk7CisgIH0KIAotCQlDRlhfQnl0ZVN0cmluZyBzRm9ybU5hbWU7Ci0JCXNGb3JtTmFtZS5Gb3JtYXQoIkYlZCIsIGkpOwotCQlGWF9EV09SRCBkd09iak51bSA9IHBEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocE9iaik7Ci0JCXBYT2JqZWN0LT5TZXRBdFJlZmVyZW5jZShzRm9ybU5hbWUsIHBEb2N1bWVudCwgZHdPYmpOdW0pOworICBpZiAoIXJjT3JpZ2luYWxDQi5Jc0VtcHR5KCkpIHsKKyAgICBDUERGX0FycmF5KiBwQ3JvcEJveCA9IG5ldyBDUERGX0FycmF5KCk7CisgICAgcENyb3BCb3gtPkFkZChuZXcgQ1BERl9OdW1iZXIocmNPcmlnaW5hbENCLmxlZnQpKTsKKyAgICBwQ3JvcEJveC0+QWRkKG5ldyBDUERGX051bWJlcihyY09yaWdpbmFsQ0IuYm90dG9tKSk7CisgICAgcENyb3BCb3gtPkFkZChuZXcgQ1BERl9OdW1iZXIocmNPcmlnaW5hbENCLnJpZ2h0KSk7CisgICAgcENyb3BCb3gtPkFkZChuZXcgQ1BERl9OdW1iZXIocmNPcmlnaW5hbENCLnRvcCkpOworICAgIHBQYWdlRGljdC0+U2V0QXQoIkFydEJveCIsIHBDcm9wQm94KTsKKyAgfQogCi0JCUNQREZfU3RyZWFtQWNjIGFjYzsKLQkJYWNjLkxvYWRBbGxEYXRhKHBOZXdYT2JqZWN0KTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzID0gcFBhZ2VEaWN0LT5HZXREaWN0KCJSZXNvdXJjZXMiKTsKKyAgaWYgKCFwUmVzKSB7CisgICAgcFJlcyA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgICAgcFBhZ2VEaWN0LT5TZXRBdCgiUmVzb3VyY2VzIiwgcFJlcyk7CisgIH0KIAotCQlGWF9MUENCWVRFIHBEYXRhID0gYWNjLkdldERhdGEoKTsKLQkJQ0ZYX0J5dGVTdHJpbmcgc1N0cmVhbShwRGF0YSwgYWNjLkdldFNpemUoKSk7Ci0JCUNGWF9CeXRlU3RyaW5nIHNUZW1wOworICBDUERGX1N0cmVhbSogcE5ld1hPYmplY3QgPSBuZXcgQ1BERl9TdHJlYW0oTlVMTCwgMCwgbmV3IENQREZfRGljdGlvbmFyeSk7CisgIEZYX0RXT1JEIGR3T2JqTnVtID0gcERvY3VtZW50LT5BZGRJbmRpcmVjdE9iamVjdChwTmV3WE9iamVjdCk7CisgIENQREZfRGljdGlvbmFyeSogcFBhZ2VYT2JqZWN0ID0gcFJlcy0+R2V0RGljdCgiWE9iamVjdCIpOworICBpZiAoIXBQYWdlWE9iamVjdCkgeworICAgIHBQYWdlWE9iamVjdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgICAgcFJlcy0+U2V0QXQoIlhPYmplY3QiLCBwUGFnZVhPYmplY3QpOworICB9CiAKLQkJaWYgKG1hdHJpeC5Jc0lkZW50aXR5KCkpCi0JCXsKLQkJCW1hdHJpeC5hID0gMS4wZjsKLQkJCW1hdHJpeC5iID0gMC4wZjsKLQkJCW1hdHJpeC5jID0gMC4wZjsKLQkJCW1hdHJpeC5kID0gMS4wZjsKLQkJCW1hdHJpeC5lID0gMC4wZjsKLQkJCW1hdHJpeC5mID0gMC4wZjsKLQkJfQorICBDRlhfQnl0ZVN0cmluZyBrZXkgPSAiIjsKKyAgaW50IG5TdHJlYW1zID0gT2JqZWN0QXJyYXkuR2V0U2l6ZSgpOwogCi0JCUNGWF9BZmZpbmVNYXRyaXggbSA9IEdldE1hdHJpeChyY0Fubm90LCByY1N0cmVhbSwgbWF0cml4KTsKLQkJc1RlbXAuRm9ybWF0KCJxICVmIDAgMCAlZiAlZiAlZiBjbSAvJXMgRG8gUVxuIiwgbS5hLCBtLmQsIG0uZSwgbS5mLCBzRm9ybU5hbWUuY19zdHIoKSk7Ci0JCXNTdHJlYW0gKz0gc1RlbXA7CisgIGlmIChuU3RyZWFtcyA+IDApIHsKKyAgICBmb3IgKGludCBpS2V5ID0gMDsgLyppS2V5IDwgMTAwKi87IGlLZXkrKykgeworICAgICAgY2hhciBzRXh0ZW5kWzVdID0ge307CisgICAgICBGWFNZU19pdG9hKGlLZXksIHNFeHRlbmQsIDEwKTsKKyAgICAgIGtleSA9IENGWF9CeXRlU3RyaW5nKCJGRlQiKSArIENGWF9CeXRlU3RyaW5nKHNFeHRlbmQpOwogCi0JCXBOZXdYT2JqZWN0LT5TZXREYXRhKChGWF9MUENCWVRFKXNTdHJlYW0sIHNTdHJlYW0uR2V0TGVuZ3RoKCksIEZBTFNFLCBGQUxTRSk7Ci0JfQotCXBQYWdlRGljdC0+UmVtb3ZlQXQoICJBbm5vdHMiICk7CisgICAgICBpZiAoIXBQYWdlWE9iamVjdC0+S2V5RXhpc3Qoa2V5KSkKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CiAKLQlPYmplY3RBcnJheS5SZW1vdmVBbGwoKTsKLQlSZWN0QXJyYXkuUmVtb3ZlQWxsKCk7CisgIFNldFBhZ2VDb250ZW50cyhrZXksIHBQYWdlRGljdCwgcERvY3VtZW50KTsKIAotCXJldHVybiBGTEFUVEVOX1NVQ0NFU1M7CisgIENQREZfRGljdGlvbmFyeSogcE5ld1hPUmVzID0gTlVMTDsKKworICBpZiAoIWtleS5Jc0VtcHR5KCkpIHsKKyAgICBwUGFnZVhPYmplY3QtPlNldEF0UmVmZXJlbmNlKGtleSwgcERvY3VtZW50LCBkd09iak51bSk7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwTmV3T1hiamVjdERpYyA9IHBOZXdYT2JqZWN0LT5HZXREaWN0KCk7CisgICAgcE5ld1hPUmVzID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgICBwTmV3T1hiamVjdERpYy0+U2V0QXQoIlJlc291cmNlcyIsIHBOZXdYT1Jlcyk7CisgICAgcE5ld09YYmplY3REaWMtPlNldEF0TmFtZSgiVHlwZSIsICJYT2JqZWN0Iik7CisgICAgcE5ld09YYmplY3REaWMtPlNldEF0TmFtZSgiU3VidHlwZSIsICJGb3JtIik7CisgICAgcE5ld09YYmplY3REaWMtPlNldEF0SW50ZWdlcigiRm9ybVR5cGUiLCAxKTsKKyAgICBwTmV3T1hiamVjdERpYy0+U2V0QXROYW1lKCJOYW1lIiwgIkZSTSIpOworICAgIENQREZfUmVjdCByY0JCb3ggPSBwUGFnZURpY3QtPkdldFJlY3QoIkFydEJveCIpOworICAgIHBOZXdPWGJqZWN0RGljLT5TZXRBdFJlY3QoIkJCb3giLCByY0JCb3gpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuU3RyZWFtczsgaSsrKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWMgPSBPYmplY3RBcnJheS5HZXRBdChpKTsKKyAgICBpZiAoIXBBbm5vdERpYykKKyAgICAgIGNvbnRpbnVlOworCisgICAgQ1BERl9SZWN0IHJjQW5ub3QgPSBwQW5ub3REaWMtPkdldFJlY3QoIlJlY3QiKTsKKyAgICByY0Fubm90Lk5vcm1hbGl6ZSgpOworCisgICAgQ0ZYX0J5dGVTdHJpbmcgc0Fubm90U3RhdGUgPSBwQW5ub3REaWMtPkdldFN0cmluZygiQVMiKTsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdEFQID0gcEFubm90RGljLT5HZXREaWN0KCJBUCIpOworICAgIGlmICghcEFubm90QVApCisgICAgICBjb250aW51ZTsKKworICAgIENQREZfU3RyZWFtKiBwQVBTdHJlYW0gPSBwQW5ub3RBUC0+R2V0U3RyZWFtKCJOIik7CisgICAgaWYgKCFwQVBTdHJlYW0pIHsKKyAgICAgIENQREZfRGljdGlvbmFyeSogcEFQRGljID0gcEFubm90QVAtPkdldERpY3QoIk4iKTsKKyAgICAgIGlmICghcEFQRGljKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgaWYgKCFzQW5ub3RTdGF0ZS5Jc0VtcHR5KCkpIHsKKyAgICAgICAgcEFQU3RyZWFtID0gcEFQRGljLT5HZXRTdHJlYW0oc0Fubm90U3RhdGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXV0byBpdCA9IHBBUERpYy0+YmVnaW4oKTsKKyAgICAgICAgaWYgKGl0ICE9IHBBUERpYy0+ZW5kKCkpIHsKKyAgICAgICAgICBDUERGX09iamVjdCogcEZpcnN0T2JqID0gaXQtPnNlY29uZDsKKyAgICAgICAgICBpZiAocEZpcnN0T2JqKSB7CisgICAgICAgICAgICBpZiAocEZpcnN0T2JqLT5Jc1JlZmVyZW5jZSgpKQorICAgICAgICAgICAgICBwRmlyc3RPYmogPSBwRmlyc3RPYmotPkdldERpcmVjdCgpOworICAgICAgICAgICAgaWYgKCFwRmlyc3RPYmotPklzU3RyZWFtKCkpCisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgcEFQU3RyZWFtID0gcEZpcnN0T2JqLT5Bc1N0cmVhbSgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoIXBBUFN0cmVhbSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQVBEaWMgPSBwQVBTdHJlYW0tPkdldERpY3QoKTsKKyAgICBDRlhfTWF0cml4IG1hdHJpeCA9IHBBUERpYy0+R2V0TWF0cml4KCJNYXRyaXgiKTsKKworICAgIENQREZfUmVjdCByY1N0cmVhbTsKKyAgICBpZiAocEFQRGljLT5LZXlFeGlzdCgiUmVjdCIpKQorICAgICAgcmNTdHJlYW0gPSBwQVBEaWMtPkdldFJlY3QoIlJlY3QiKTsKKyAgICBlbHNlIGlmIChwQVBEaWMtPktleUV4aXN0KCJCQm94IikpCisgICAgICByY1N0cmVhbSA9IHBBUERpYy0+R2V0UmVjdCgiQkJveCIpOworCisgICAgaWYgKHJjU3RyZWFtLklzRW1wdHkoKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgQ1BERl9PYmplY3QqIHBPYmogPSBwQVBTdHJlYW07CisKKyAgICBpZiAocE9iaikgeworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwT2JqRGljID0gcE9iai0+R2V0RGljdCgpOworICAgICAgaWYgKHBPYmpEaWMpIHsKKyAgICAgICAgcE9iakRpYy0+U2V0QXROYW1lKCJUeXBlIiwgIlhPYmplY3QiKTsKKyAgICAgICAgcE9iakRpYy0+U2V0QXROYW1lKCJTdWJ0eXBlIiwgIkZvcm0iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBYT2JqZWN0ID0gcE5ld1hPUmVzLT5HZXREaWN0KCJYT2JqZWN0Iik7CisgICAgaWYgKCFwWE9iamVjdCkgeworICAgICAgcFhPYmplY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICAgICAgcE5ld1hPUmVzLT5TZXRBdCgiWE9iamVjdCIsIHBYT2JqZWN0KTsKKyAgICB9CisKKyAgICBDRlhfQnl0ZVN0cmluZyBzRm9ybU5hbWU7CisgICAgc0Zvcm1OYW1lLkZvcm1hdCgiRiVkIiwgaSk7CisgICAgRlhfRFdPUkQgZHdPYmpOdW0gPSBwRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBPYmopOworICAgIHBYT2JqZWN0LT5TZXRBdFJlZmVyZW5jZShzRm9ybU5hbWUsIHBEb2N1bWVudCwgZHdPYmpOdW0pOworCisgICAgQ1BERl9TdHJlYW1BY2MgYWNjOworICAgIGFjYy5Mb2FkQWxsRGF0YShwTmV3WE9iamVjdCk7CisKKyAgICBjb25zdCB1aW50OF90KiBwRGF0YSA9IGFjYy5HZXREYXRhKCk7CisgICAgQ0ZYX0J5dGVTdHJpbmcgc1N0cmVhbShwRGF0YSwgYWNjLkdldFNpemUoKSk7CisgICAgQ0ZYX0J5dGVTdHJpbmcgc1RlbXA7CisKKyAgICBpZiAobWF0cml4LklzSWRlbnRpdHkoKSkgeworICAgICAgbWF0cml4LmEgPSAxLjBmOworICAgICAgbWF0cml4LmIgPSAwLjBmOworICAgICAgbWF0cml4LmMgPSAwLjBmOworICAgICAgbWF0cml4LmQgPSAxLjBmOworICAgICAgbWF0cml4LmUgPSAwLjBmOworICAgICAgbWF0cml4LmYgPSAwLjBmOworICAgIH0KKworICAgIENGWF9NYXRyaXggbSA9IEdldE1hdHJpeChyY0Fubm90LCByY1N0cmVhbSwgbWF0cml4KTsKKyAgICBzVGVtcC5Gb3JtYXQoInEgJWYgMCAwICVmICVmICVmIGNtIC8lcyBEbyBRXG4iLCBtLmEsIG0uZCwgbS5lLCBtLmYsCisgICAgICAgICAgICAgICAgIHNGb3JtTmFtZS5jX3N0cigpKTsKKyAgICBzU3RyZWFtICs9IHNUZW1wOworCisgICAgcE5ld1hPYmplY3QtPlNldERhdGEoKGNvbnN0IHVpbnQ4X3QqKXNTdHJlYW0sIHNTdHJlYW0uR2V0TGVuZ3RoKCksIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsKKyAgfQorICBwUGFnZURpY3QtPlJlbW92ZUF0KCJBbm5vdHMiKTsKKworICBPYmplY3RBcnJheS5SZW1vdmVBbGwoKTsKKyAgUmVjdEFycmF5LlJlbW92ZUFsbCgpOworCisgIHJldHVybiBGTEFUVEVOX1NVQ0NFU1M7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmX3Byb2dyZXNzaXZlLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZfcHJvZ3Jlc3NpdmUuY3BwCmluZGV4IGE1ZDZjMTMuLmI2ZmQ4ZTAgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZfcHJvZ3Jlc3NpdmUuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZfcHJvZ3Jlc3NpdmUuY3BwCkBAIC0xLDEwNCArMSwxMDAgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL3B1YmxpYy9mcGRmX3Byb2dyZXNzaXZlLmgiCi0jaW5jbHVkZSAiLi4vLi4vcHVibGljL2ZwZGZ2aWV3LmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX2RlZmluZS5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnNka19yZW5kZXJjb250ZXh0LmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZfcHJvZ3Jlc3NpdmUuaCIKIAotZXh0ZXJuIHZvaWQgKCpGdW5jX1JlbmRlclBhZ2UpKCBDUmVuZGVyQ29udGV4dCosIEZQREZfUEFHRSBwYWdlLCBpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksIGludCBzaXplX3gsIGludCBzaXplX3ksCi0JCQkJCQlpbnQgcm90YXRlLCBpbnQgZmxhZ3MsRlhfQk9PTCBiTmVlZFRvUmVzdG9yZSwgSUZTREtfUEFVU0VfQWRhcHRlciAqIHBhdXNlICk7CisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZzZGtfcmVuZGVyY29udGV4dC5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmdmlldy5oIgogCi1leHRlcm4gdm9pZCBEcm9wQ29udGV4dCh2b2lkKiBkYXRhKTsKKy8vIFRoZXNlIGNoZWNrcyBhcmUgaGVyZSBiZWNhdXNlIGNvcmUvIGFuZCBwdWJsaWMvIGNhbm5vdCBkZXBlbmQgb24gZWFjaCBvdGhlci4KK3N0YXRpY19hc3NlcnQoQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyOjpSZWFkeSA9PSBGUERGX1JFTkRFUl9SRUFERVIsCisgICAgICAgICAgICAgICJDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXI6OlJlYWR5IHZhbHVlIG1pc21hdGNoIik7CitzdGF0aWNfYXNzZXJ0KENQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcjo6VG9CZUNvbnRpbnVlZCA9PQorICAgICAgICAgICAgICAgICAgRlBERl9SRU5ERVJfVE9CRUNPVU5USU5VRUQsCisgICAgICAgICAgICAgICJDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXI6OlRvQmVDb250aW51ZWQgdmFsdWUgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyOjpEb25lID09IEZQREZfUkVOREVSX0RPTkUsCisgICAgICAgICAgICAgICJDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXI6OkRvbmUgdmFsdWUgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyOjpGYWlsZWQgPT0gRlBERl9SRU5ERVJfRkFJTEVELAorICAgICAgICAgICAgICAiQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyOjpGYWlsZWQgdmFsdWUgbWlzbWF0Y2giKTsKIAotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfUmVuZGVyUGFnZUJpdG1hcF9TdGFydCggRlBERl9CSVRNQVAgYml0bWFwLCBGUERGX1BBR0UgcGFnZSwgCi0JCQkJCQkJCQkJCQkJaW50IHN0YXJ0X3gsIGludCBzdGFydF95LCBpbnQgc2l6ZV94LAotCQkJCQkJCQkJCQkJICAgIGludCBzaXplX3ksIGludCByb3RhdGUsIGludCBmbGFncywKLQkJCQkJCQkJCQkJCQlJRlNES19QQVVTRSAqIHBhdXNlICkKLXsKLQlpZiAoYml0bWFwID09IE5VTEwgfHwgcGFnZSA9PSBOVUxMKQotCQlyZXR1cm4gRlBERl9SRU5ERVJfRkFJTEVEOworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfUmVuZGVyUGFnZUJpdG1hcF9TdGFydChGUERGX0JJVE1BUCBiaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZTREtfUEFVU0UqIHBhdXNlKSB7CisgIGlmICghYml0bWFwIHx8ICFwYXVzZSB8fCBwYXVzZS0+dmVyc2lvbiAhPSAxKQorICAgIHJldHVybiBGUERGX1JFTkRFUl9GQUlMRUQ7CiAKLSAJaWYgKCFwYXVzZSkKLSAJCXJldHVybiBGUERGX1JFTkRFUl9GQUlMRUQ7CisgIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlKTsKKyAgaWYgKCFwUGFnZSkKKyAgICByZXR1cm4gRlBERl9SRU5ERVJfRkFJTEVEOwogCi0JaWYgKHBhdXNlLT52ZXJzaW9uICE9MSkKLQkJcmV0dXJuIEZQREZfUkVOREVSX0ZBSUxFRDsKLQotCUNQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlOwotCUNSZW5kZXJDb250ZXh0KiBwQ29udGV4dCA9IG5ldyBDUmVuZGVyQ29udGV4dDsKLQlwUGFnZS0+U2V0UHJpdmF0ZURhdGEoKHZvaWQqKTEsIHBDb250ZXh0LCBEcm9wQ29udGV4dCk7CisgIENSZW5kZXJDb250ZXh0KiBwQ29udGV4dCA9IG5ldyBDUmVuZGVyQ29udGV4dDsKKyAgcFBhZ2UtPlNldFByaXZhdGVEYXRhKCh2b2lkKikxLCBwQ29udGV4dCwgRHJvcENvbnRleHQpOwogI2lmZGVmIF9TS0lBX1NVUFBPUlRfCi0JcENvbnRleHQtPm1fcERldmljZSA9IG5ldyBDRlhfU2tpYURldmljZTsKLQlpZiAoZmxhZ3MgJiBGUERGX1JFVkVSU0VfQllURV9PUkRFUikKLQkJKChDRlhfU2tpYURldmljZSopcENvbnRleHQtPm1fcERldmljZSktPkF0dGFjaCgoQ0ZYX0RJQml0bWFwKiliaXRtYXAsMCxUUlVFKTsKLQllbHNlCi0JCSgoQ0ZYX1NraWFEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwKTsKKyAgcENvbnRleHQtPm1fcERldmljZSA9IG5ldyBDRlhfU2tpYURldmljZTsKKyAgaWYgKGZsYWdzICYgRlBERl9SRVZFUlNFX0JZVEVfT1JERVIpCisgICAgKChDRlhfU2tpYURldmljZSopcENvbnRleHQtPm1fcERldmljZSkKKyAgICAgICAgLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwLCAwLCBUUlVFKTsKKyAgZWxzZQorICAgICgoQ0ZYX1NraWFEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwKTsKICNlbHNlCi0JcENvbnRleHQtPm1fcERldmljZSA9IG5ldyBDRlhfRnhnZURldmljZTsKLQlpZiAoZmxhZ3MgJiBGUERGX1JFVkVSU0VfQllURV9PUkRFUikKLQkJKChDRlhfRnhnZURldmljZSopcENvbnRleHQtPm1fcERldmljZSktPkF0dGFjaCgoQ0ZYX0RJQml0bWFwKiliaXRtYXAsMCxUUlVFKTsKLQllbHNlCi0JCSgoQ0ZYX0Z4Z2VEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwKTsKKyAgcENvbnRleHQtPm1fcERldmljZSA9IG5ldyBDRlhfRnhnZURldmljZTsKKyAgaWYgKGZsYWdzICYgRlBERl9SRVZFUlNFX0JZVEVfT1JERVIpCisgICAgKChDRlhfRnhnZURldmljZSopcENvbnRleHQtPm1fcERldmljZSkKKyAgICAgICAgLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwLCAwLCBUUlVFKTsKKyAgZWxzZQorICAgICgoQ0ZYX0Z4Z2VEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwKTsKICNlbmRpZgotCUlGU0RLX1BBVVNFX0FkYXB0ZXIgSVBhdXNlQWRhcHRlcihwYXVzZSk7Ci0JCi0JRnVuY19SZW5kZXJQYWdlKHBDb250ZXh0LCBwYWdlLCBzdGFydF94LCBzdGFydF95LCBzaXplX3gsIHNpemVfeSwgcm90YXRlLCBmbGFncyxGQUxTRSwgJklQYXVzZUFkYXB0ZXIpOworICBJRlNES19QQVVTRV9BZGFwdGVyIElQYXVzZUFkYXB0ZXIocGF1c2UpOwogCi0JaWYgKCBwQ29udGV4dC0+bV9wUmVuZGVyZXIgKQotCXsKLQkJQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyOjpSZW5kZXJTdGF0dXMgc3RhdHVzID0gQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyOjpGYWlsZWQ7Ci0JCXN0YXR1cyA9IHBDb250ZXh0LT5tX3BSZW5kZXJlci0+R2V0U3RhdHVzKCk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCXJldHVybiBGUERGX1JFTkRFUl9GQUlMRUQ7CisgIEZQREZfUmVuZGVyUGFnZV9SZXRhaWwocENvbnRleHQsIHBhZ2UsIHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZSwgZmxhZ3MsIEZBTFNFLCAmSVBhdXNlQWRhcHRlcik7CisKKyAgaWYgKHBDb250ZXh0LT5tX3BSZW5kZXJlcikgeworICAgIHJldHVybiBDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXI6OlRvRlBERlN0YXR1cygKKyAgICAgICAgcENvbnRleHQtPm1fcFJlbmRlcmVyLT5HZXRTdGF0dXMoKSk7CisgIH0KKyAgcmV0dXJuIEZQREZfUkVOREVSX0ZBSUxFRDsKIH0KIAotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfUmVuZGVyUGFnZV9Db250aW51ZShGUERGX1BBR0UgcGFnZSxJRlNES19QQVVTRSAqIHBhdXNlKQotewotCWlmIChwYWdlID09IE5VTEwpCi0JCXJldHVybiBGUERGX1JFTkRFUl9GQUlMRUQ7CitETExFWFBPUlQgaW50IFNURENBTEwgRlBERl9SZW5kZXJQYWdlX0NvbnRpbnVlKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlNES19QQVVTRSogcGF1c2UpIHsKKyAgaWYgKCFwYXVzZSB8fCBwYXVzZS0+dmVyc2lvbiAhPSAxKQorICAgIHJldHVybiBGUERGX1JFTkRFUl9GQUlMRUQ7CiAKLSAJaWYgKCFwYXVzZSkKLQkJcmV0dXJuIEZQREZfUkVOREVSX0ZBSUxFRDsKLQkKLQlpZiAocGF1c2UtPnZlcnNpb24gIT0xKQotCQlyZXR1cm4gRlBERl9SRU5ERVJfRkFJTEVEOworICBDUERGX1BhZ2UqIHBQYWdlID0gQ1BERlBhZ2VGcm9tRlBERlBhZ2UocGFnZSk7CisgIGlmICghcFBhZ2UpCisgICAgcmV0dXJuIEZQREZfUkVOREVSX0ZBSUxFRDsKIAotCUNQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlOwotCi0vLwlGWE1UX0NTTE9DS19PQkooJnBQYWdlLT5tX1BhZ2VMb2NrKTsKLQotCUNSZW5kZXJDb250ZXh0ICogcENvbnRleHQgPSAoQ1JlbmRlckNvbnRleHQqKXBQYWdlLT5HZXRQcml2YXRlRGF0YSgodm9pZCopMSk7Ci0JaWYgKHBDb250ZXh0ICYmIHBDb250ZXh0LT5tX3BSZW5kZXJlcikKLQl7Ci0JCUlGU0RLX1BBVVNFX0FkYXB0ZXIgSVBhdXNlQWRhcHRlcihwYXVzZSk7Ci0JCXBDb250ZXh0LT5tX3BSZW5kZXJlci0+Q29udGludWUoJklQYXVzZUFkYXB0ZXIpOwotCi0JCUNQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcjo6UmVuZGVyU3RhdHVzIHN0YXR1cyA9IENQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcjo6RmFpbGVkOwotCQlzdGF0dXMgPSBwQ29udGV4dC0+bV9wUmVuZGVyZXItPkdldFN0YXR1cygpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQlyZXR1cm4gRlBERl9SRU5ERVJfRkFJTEVEOworICBDUmVuZGVyQ29udGV4dCogcENvbnRleHQgPSAoQ1JlbmRlckNvbnRleHQqKXBQYWdlLT5HZXRQcml2YXRlRGF0YSgodm9pZCopMSk7CisgIGlmIChwQ29udGV4dCAmJiBwQ29udGV4dC0+bV9wUmVuZGVyZXIpIHsKKyAgICBJRlNES19QQVVTRV9BZGFwdGVyIElQYXVzZUFkYXB0ZXIocGF1c2UpOworICAgIHBDb250ZXh0LT5tX3BSZW5kZXJlci0+Q29udGludWUoJklQYXVzZUFkYXB0ZXIpOworICAgIHJldHVybiBDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXI6OlRvRlBERlN0YXR1cygKKyAgICAgICAgcENvbnRleHQtPm1fcFJlbmRlcmVyLT5HZXRTdGF0dXMoKSk7CisgIH0KKyAgcmV0dXJuIEZQREZfUkVOREVSX0ZBSUxFRDsKIH0KIAorRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1JlbmRlclBhZ2VfQ2xvc2UoRlBERl9QQUdFIHBhZ2UpIHsKKyAgQ1BERl9QYWdlKiBwUGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2UpOworICBpZiAoIXBQYWdlKQorICAgIHJldHVybjsKIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1JlbmRlclBhZ2VfQ2xvc2UoRlBERl9QQUdFIHBhZ2UpCi17Ci0JaWYgKHBhZ2UgPT0gTlVMTCkgcmV0dXJuOwotCUNQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlOworICBDUmVuZGVyQ29udGV4dCogcENvbnRleHQgPSAoQ1JlbmRlckNvbnRleHQqKXBQYWdlLT5HZXRQcml2YXRlRGF0YSgodm9pZCopMSk7CisgIGlmICghcENvbnRleHQpCisgICAgcmV0dXJuOwogCi0vLwlGWE1UX0NTTE9DS19PQkooJnBQYWdlLT5tX1BhZ2VMb2NrKTsKLQotCUNSZW5kZXJDb250ZXh0ICogcENvbnRleHQgPSAoQ1JlbmRlckNvbnRleHQqKXBQYWdlLT5HZXRQcml2YXRlRGF0YSgodm9pZCopMSk7Ci0JaWYgKHBDb250ZXh0KQotCXsKLQkJcENvbnRleHQtPm1fcERldmljZS0+UmVzdG9yZVN0YXRlKCk7Ci0JCWRlbGV0ZSBwQ29udGV4dDsKLQkJcFBhZ2UtPlJlbW92ZVByaXZhdGVEYXRhKCh2b2lkKikxKTsKLQl9CisgIHBDb250ZXh0LT5tX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOworICBkZWxldGUgcENvbnRleHQ7CisgIHBQYWdlLT5SZW1vdmVQcml2YXRlRGF0YSgodm9pZCopMSk7CiB9Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZfc2VhcmNoZXguY3BwIGIvZnBkZnNkay9zcmMvZnBkZl9zZWFyY2hleC5jcHAKaW5kZXggNDM4NGNkYy4uOTZjNWU1MyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZl9zZWFyY2hleC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZl9zZWFyY2hleC5jcHAKQEAgLTEsMTQgKzEsMTYgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL3B1YmxpYy9mcGRmX3NlYXJjaGV4LmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX2RlZmluZS5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX3NlYXJjaGV4LmgiCiAKLURMTEVYUE9SVCBpbnQgU1REQ0FMTCAgRlBERlRleHRfR2V0Q2hhckluZGV4RnJvbVRleHRJbmRleChGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwgaW50IG5UZXh0SW5kZXgpCi17Ci0JaWYoIXRleHRfcGFnZSkgcmV0dXJuIC0xOwotCXJldHVybiAoKElQREZfVGV4dFBhZ2UqKXRleHRfcGFnZSktPkNoYXJJbmRleEZyb21UZXh0SW5kZXgoblRleHRJbmRleCk7CisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZ0ZXh0L2ZwZGZfdGV4dC5oIgorCitETExFWFBPUlQgaW50IFNURENBTEwKK0ZQREZUZXh0X0dldENoYXJJbmRleEZyb21UZXh0SW5kZXgoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsIGludCBuVGV4dEluZGV4KSB7CisgIGlmICghdGV4dF9wYWdlKQorICAgIHJldHVybiAtMTsKKyAgcmV0dXJuICgoSVBERl9UZXh0UGFnZSopdGV4dF9wYWdlKS0+Q2hhckluZGV4RnJvbVRleHRJbmRleChuVGV4dEluZGV4KTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZfc3lzZm9udGluZm8uY3BwIGIvZnBkZnNkay9zcmMvZnBkZl9zeXNmb250aW5mby5jcHAKaW5kZXggNmJiNDFiOC4uNjU1YzRhMiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZl9zeXNmb250aW5mby5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZl9zeXNmb250aW5mby5jcHAKQEAgLTEsMTcyICsxLDE4OSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vcHVibGljL2ZwZGZfc3lzZm9udGluZm8uaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ZvbnRNYXAuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9zeXNmb250aW5mby5oIgogCi1jbGFzcyBDU3lzRm9udEluZm9fRXh0IEZYX0ZJTkFMIDogcHVibGljIElGWF9TeXN0ZW1Gb250SW5mbwotewotcHVibGljOgotCUZQREZfU1lTRk9OVElORk8qCW1fcEluZm87CisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRm9udE1hcC5oIgogCi0JdmlydHVhbCB2b2lkCQlSZWxlYXNlKCkgRlhfT1ZFUlJJREUKLQl7Ci0JCWlmIChtX3BJbmZvLT5SZWxlYXNlKQotCQkJbV9wSW5mby0+UmVsZWFzZShtX3BJbmZvKTsKLQkJZGVsZXRlIHRoaXM7Ci0JfQorY2xhc3MgQ0ZYX0V4dGVybmFsRm9udEluZm8gZmluYWwgOiBwdWJsaWMgSUZYX1N5c3RlbUZvbnRJbmZvIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENGWF9FeHRlcm5hbEZvbnRJbmZvKEZQREZfU1lTRk9OVElORk8qIHBJbmZvKSA6IG1fcEluZm8ocEluZm8pIHt9CiAKLQl2aXJ0dWFsCUZYX0JPT0wJCUVudW1Gb250TGlzdChDRlhfRm9udE1hcHBlciogcE1hcHBlcikgRlhfT1ZFUlJJREUKLQl7Ci0JCWlmIChtX3BJbmZvLT5FbnVtRm9udHMpIHsKLQkJCW1fcEluZm8tPkVudW1Gb250cyhtX3BJbmZvLCBwTWFwcGVyKTsKLQkJCXJldHVybiBUUlVFOwotCQl9Ci0JCXJldHVybiBGQUxTRTsKLQl9CisgIHZvaWQgUmVsZWFzZSgpIG92ZXJyaWRlIHsKKyAgICBpZiAobV9wSW5mby0+UmVsZWFzZSkKKyAgICAgIG1fcEluZm8tPlJlbGVhc2UobV9wSW5mbyk7CisgICAgZGVsZXRlIHRoaXM7CisgIH0KIAotCXZpcnR1YWwgdm9pZCoJCU1hcEZvbnQoaW50IHdlaWdodCwgRlhfQk9PTCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgRlhfTFBDU1RSIGZhbWlseSwgRlhfQk9PTCYgYkV4YWN0KSAgRlhfT1ZFUlJJREUKLQl7Ci0JCWlmIChtX3BJbmZvLT5NYXBGb250KQotCQkJcmV0dXJuIG1fcEluZm8tPk1hcEZvbnQobV9wSW5mbywgd2VpZ2h0LCBiSXRhbGljLCBjaGFyc2V0LCBwaXRjaF9mYW1pbHksIGZhbWlseSwgJmJFeGFjdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgRlhfQk9PTCBFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpIG92ZXJyaWRlIHsKKyAgICBpZiAobV9wSW5mby0+RW51bUZvbnRzKSB7CisgICAgICBtX3BJbmZvLT5FbnVtRm9udHMobV9wSW5mbywgcE1hcHBlcik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLQl2aXJ0dWFsIHZvaWQqCQlHZXRGb250KEZYX0xQQ1NUUiBmYW1pbHkpICBGWF9PVkVSUklERQotCXsKLQkJaWYgKG1fcEluZm8tPkdldEZvbnQpCi0JCQlyZXR1cm4gbV9wSW5mby0+R2V0Rm9udChtX3BJbmZvLCBmYW1pbHkpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgIHZvaWQqIE1hcEZvbnQoaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICBGWF9CT09MIGJJdGFsaWMsCisgICAgICAgICAgICAgICAgaW50IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgaW50IHBpdGNoX2ZhbWlseSwKKyAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBmYW1pbHksCisgICAgICAgICAgICAgICAgaW50JiBpRXhhY3QpIG92ZXJyaWRlIHsKKyAgICBpZiAobV9wSW5mby0+TWFwRm9udCkKKyAgICAgIHJldHVybiBtX3BJbmZvLT5NYXBGb250KG1fcEluZm8sIHdlaWdodCwgYkl0YWxpYywgY2hhcnNldCwgcGl0Y2hfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5LCAmaUV4YWN0KTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQogCi0JdmlydHVhbCBGWF9EV09SRAlHZXRGb250RGF0YSh2b2lkKiBoRm9udCwgRlhfRFdPUkQgdGFibGUsIEZYX0xQQllURSBidWZmZXIsIEZYX0RXT1JEIHNpemUpICBGWF9PVkVSUklERQotCXsKLQkJaWYgKG1fcEluZm8tPkdldEZvbnREYXRhKQotCQkJcmV0dXJuIG1fcEluZm8tPkdldEZvbnREYXRhKG1fcEluZm8sIGhGb250LCB0YWJsZSwgYnVmZmVyLCBzaXplKTsKLQkJcmV0dXJuIDA7Ci0JfQorICB2b2lkKiBHZXRGb250KGNvbnN0IEZYX0NIQVIqIGZhbWlseSkgb3ZlcnJpZGUgeworICAgIGlmIChtX3BJbmZvLT5HZXRGb250KQorICAgICAgcmV0dXJuIG1fcEluZm8tPkdldEZvbnQobV9wSW5mbywgZmFtaWx5KTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQogCi0JdmlydHVhbCBGWF9CT09MCQlHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpICBGWF9PVkVSUklERQotCXsKLQkJaWYgKG1fcEluZm8tPkdldEZhY2VOYW1lID09IE5VTEwpIHJldHVybiBGQUxTRTsKLQkJRlhfRFdPUkQgc2l6ZSA9IG1fcEluZm8tPkdldEZhY2VOYW1lKG1fcEluZm8sIGhGb250LCBOVUxMLCAwKTsKLQkJaWYgKHNpemUgPT0gMCkgcmV0dXJuIEZBTFNFOwotCQljaGFyKiBidWZmZXIgPSBGWF9BbGxvYyhjaGFyLCBzaXplKTsKLQkJc2l6ZSA9IG1fcEluZm8tPkdldEZhY2VOYW1lKG1fcEluZm8sIGhGb250LCBidWZmZXIsIHNpemUpOwotCQluYW1lID0gQ0ZYX0J5dGVTdHJpbmcoYnVmZmVyLCBzaXplKTsKLQkJRlhfRnJlZShidWZmZXIpOwotCQlyZXR1cm4gVFJVRTsKLQl9CisgIEZYX0RXT1JEIEdldEZvbnREYXRhKHZvaWQqIGhGb250LAorICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplKSBvdmVycmlkZSB7CisgICAgaWYgKG1fcEluZm8tPkdldEZvbnREYXRhKQorICAgICAgcmV0dXJuIG1fcEluZm8tPkdldEZvbnREYXRhKG1fcEluZm8sIGhGb250LCB0YWJsZSwgYnVmZmVyLCBzaXplKTsKKyAgICByZXR1cm4gMDsKKyAgfQogCi0JdmlydHVhbCBGWF9CT09MCQlHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KSAgRlhfT1ZFUlJJREUKLQl7Ci0JCWlmIChtX3BJbmZvLT5HZXRGb250Q2hhcnNldCkgewotCQkJY2hhcnNldCA9IG1fcEluZm8tPkdldEZvbnRDaGFyc2V0KG1fcEluZm8sIGhGb250KTsKLQkJCXJldHVybiBUUlVFOwotCQl9Ci0JCXJldHVybiBGQUxTRTsKLQl9CisgIEZYX0JPT0wgR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKSBvdmVycmlkZSB7CisgICAgaWYgKCFtX3BJbmZvLT5HZXRGYWNlTmFtZSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBGWF9EV09SRCBzaXplID0gbV9wSW5mby0+R2V0RmFjZU5hbWUobV9wSW5mbywgaEZvbnQsIE5VTEwsIDApOworICAgIGlmIChzaXplID09IDApCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgY2hhciogYnVmZmVyID0gRlhfQWxsb2MoY2hhciwgc2l6ZSk7CisgICAgc2l6ZSA9IG1fcEluZm8tPkdldEZhY2VOYW1lKG1fcEluZm8sIGhGb250LCBidWZmZXIsIHNpemUpOworICAgIG5hbWUgPSBDRlhfQnl0ZVN0cmluZyhidWZmZXIsIHNpemUpOworICAgIEZYX0ZyZWUoYnVmZmVyKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQogCi0JdmlydHVhbCB2b2lkCQlEZWxldGVGb250KHZvaWQqIGhGb250KSAgRlhfT1ZFUlJJREUKLQl7Ci0JCWlmIChtX3BJbmZvLT5EZWxldGVGb250KQotCQkJbV9wSW5mby0+RGVsZXRlRm9udChtX3BJbmZvLCBoRm9udCk7Ci0JfQorICBGWF9CT09MIEdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpIG92ZXJyaWRlIHsKKyAgICBpZiAobV9wSW5mby0+R2V0Rm9udENoYXJzZXQpIHsKKyAgICAgIGNoYXJzZXQgPSBtX3BJbmZvLT5HZXRGb250Q2hhcnNldChtX3BJbmZvLCBoRm9udCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLXByaXZhdGU6Ci0gICAgICAgIH5DU3lzRm9udEluZm9fRXh0KCkgeyB9CisgIHZvaWQgRGVsZXRlRm9udCh2b2lkKiBoRm9udCkgb3ZlcnJpZGUgeworICAgIGlmIChtX3BJbmZvLT5EZWxldGVGb250KQorICAgICAgbV9wSW5mby0+RGVsZXRlRm9udChtX3BJbmZvLCBoRm9udCk7CisgIH0KKworIHByaXZhdGU6CisgIH5DRlhfRXh0ZXJuYWxGb250SW5mbygpIG92ZXJyaWRlIHt9CisKKyAgRlBERl9TWVNGT05USU5GTyogY29uc3QgbV9wSW5mbzsKIH07CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9BZGRJbnN0YWxsZWRGb250KHZvaWQqIG1hcHBlciwgY29uc3QgY2hhciogbmFtZSwgaW50IGNoYXJzZXQpCi17Ci0JKChDRlhfRm9udE1hcHBlciopbWFwcGVyKS0+QWRkSW5zdGFsbGVkRm9udChuYW1lLCBjaGFyc2V0KTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9BZGRJbnN0YWxsZWRGb250KHZvaWQqIG1hcHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCkgeworICAoKENGWF9Gb250TWFwcGVyKiltYXBwZXIpLT5BZGRJbnN0YWxsZWRGb250KG5hbWUsIGNoYXJzZXQpOwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfU2V0U3lzdGVtRm9udEluZm8oRlBERl9TWVNGT05USU5GTyogcEZvbnRJbmZvRXh0KQotewotCWlmIChwRm9udEluZm9FeHQtPnZlcnNpb24gIT0gMSkgcmV0dXJuOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1NldFN5c3RlbUZvbnRJbmZvKEZQREZfU1lTRk9OVElORk8qIHBGb250SW5mb0V4dCkgeworICBpZiAocEZvbnRJbmZvRXh0LT52ZXJzaW9uICE9IDEpCisgICAgcmV0dXJuOwogCi0JQ1N5c0ZvbnRJbmZvX0V4dCogcEZvbnRJbmZvID0gbmV3IENTeXNGb250SW5mb19FeHQ7Ci0JcEZvbnRJbmZvLT5tX3BJbmZvID0gcEZvbnRJbmZvRXh0OwotCUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+U2V0U3lzdGVtRm9udEluZm8ocEZvbnRJbmZvKTsKKyAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5TZXRTeXN0ZW1Gb250SW5mbygKKyAgICAgIG5ldyBDRlhfRXh0ZXJuYWxGb250SW5mbyhwRm9udEluZm9FeHQpKTsKIH0KIAotRExMRVhQT1JUIGNvbnN0IEZQREZfQ2hhcnNldEZvbnRNYXAqIFNURENBTEwgRlBERl9HZXREZWZhdWx0VFRGTWFwKCkKLXsKLSAgICByZXR1cm4gQ1BXTF9Gb250TWFwOjpkZWZhdWx0VFRGTWFwOworRExMRVhQT1JUIGNvbnN0IEZQREZfQ2hhcnNldEZvbnRNYXAqIFNURENBTEwgRlBERl9HZXREZWZhdWx0VFRGTWFwKCkgeworICByZXR1cm4gQ1BXTF9Gb250TWFwOjpkZWZhdWx0VFRGTWFwOwogfQogCi1zdHJ1Y3QgRlBERl9TWVNGT05USU5GT19ERUZBVUxUIDogcHVibGljIEZQREZfU1lTRk9OVElORk8KLXsKLQlJRlhfU3lzdGVtRm9udEluZm8qCW1fcEZvbnRJbmZvOworc3RydWN0IEZQREZfU1lTRk9OVElORk9fREVGQVVMVCA6IHB1YmxpYyBGUERGX1NZU0ZPTlRJTkZPIHsKKyAgSUZYX1N5c3RlbUZvbnRJbmZvKiBtX3BGb250SW5mbzsKIH07CiAKLXN0YXRpYyB2b2lkIERlZmF1bHRSZWxlYXNlKHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMpCi17Ci0JKChGUERGX1NZU0ZPTlRJTkZPX0RFRkFVTFQqKXBUaGlzKS0+bV9wRm9udEluZm8tPlJlbGVhc2UoKTsKK3N0YXRpYyB2b2lkIERlZmF1bHRSZWxlYXNlKHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMpIHsKKyAgKChGUERGX1NZU0ZPTlRJTkZPX0RFRkFVTFQqKXBUaGlzKS0+bV9wRm9udEluZm8tPlJlbGVhc2UoKTsKIH0KIAotc3RhdGljIHZvaWQgRGVmYXVsdEVudW1Gb250cyhzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCB2b2lkKiBwTWFwcGVyKQotewotCSgoRlBERl9TWVNGT05USU5GT19ERUZBVUxUKilwVGhpcyktPm1fcEZvbnRJbmZvLT5FbnVtRm9udExpc3QoKENGWF9Gb250TWFwcGVyKilwTWFwcGVyKTsKK3N0YXRpYyB2b2lkIERlZmF1bHRFbnVtRm9udHMoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcywgdm9pZCogcE1hcHBlcikgeworICAoKEZQREZfU1lTRk9OVElORk9fREVGQVVMVCopcFRoaXMpCisgICAgICAtPm1fcEZvbnRJbmZvLT5FbnVtRm9udExpc3QoKENGWF9Gb250TWFwcGVyKilwTWFwcGVyKTsKIH0KIAotc3RhdGljIHZvaWQqIERlZmF1bHRNYXBGb250KHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMsIGludCB3ZWlnaHQsIGludCBiSXRhbGljLCBpbnQgY2hhcnNldCwgaW50IHBpdGNoX2ZhbWlseSwgY29uc3QgY2hhciogZmFtaWx5LCBpbnQqIGJFeGFjdCkKLXsKLQlyZXR1cm4gKChGUERGX1NZU0ZPTlRJTkZPX0RFRkFVTFQqKXBUaGlzKS0+bV9wRm9udEluZm8tPk1hcEZvbnQod2VpZ2h0LCBiSXRhbGljLCBjaGFyc2V0LCBwaXRjaF9mYW1pbHksIGZhbWlseSwgKmJFeGFjdCk7CitzdGF0aWMgdm9pZCogRGVmYXVsdE1hcEZvbnQoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiSXRhbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogYkV4YWN0KSB7CisgIHJldHVybiAoKEZQREZfU1lTRk9OVElORk9fREVGQVVMVCopcFRoaXMpCisgICAgICAtPm1fcEZvbnRJbmZvLT5NYXBGb250KHdlaWdodCwgYkl0YWxpYywgY2hhcnNldCwgcGl0Y2hfZmFtaWx5LCBmYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpiRXhhY3QpOwogfQogCi12b2lkKiBEZWZhdWx0R2V0Rm9udChzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCBjb25zdCBjaGFyKiBmYW1pbHkpCi17Ci0JcmV0dXJuICgoRlBERl9TWVNGT05USU5GT19ERUZBVUxUKilwVGhpcyktPm1fcEZvbnRJbmZvLT5HZXRGb250KGZhbWlseSk7Cit2b2lkKiBEZWZhdWx0R2V0Rm9udChzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCBjb25zdCBjaGFyKiBmYW1pbHkpIHsKKyAgcmV0dXJuICgoRlBERl9TWVNGT05USU5GT19ERUZBVUxUKilwVGhpcyktPm1fcEZvbnRJbmZvLT5HZXRGb250KGZhbWlseSk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIERlZmF1bHRHZXRGb250RGF0YShzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCB2b2lkKiBoRm9udCwKLQkJCXVuc2lnbmVkIGludCB0YWJsZSwgdW5zaWduZWQgY2hhciogYnVmZmVyLCB1bnNpZ25lZCBsb25nIGJ1Zl9zaXplKQotewotCXJldHVybiAoKEZQREZfU1lTRk9OVElORk9fREVGQVVMVCopcFRoaXMpLT5tX3BGb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIHRhYmxlLCBidWZmZXIsIGJ1Zl9zaXplKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIERlZmF1bHRHZXRGb250RGF0YShzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGhGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBidWZfc2l6ZSkgeworICByZXR1cm4gKChGUERGX1NZU0ZPTlRJTkZPX0RFRkFVTFQqKXBUaGlzKQorICAgICAgLT5tX3BGb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIHRhYmxlLCBidWZmZXIsIGJ1Zl9zaXplKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgRGVmYXVsdEdldEZhY2VOYW1lKHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMsIHZvaWQqIGhGb250LCBjaGFyKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgYnVmX3NpemUpCi17Ci0JQ0ZYX0J5dGVTdHJpbmcgbmFtZTsKLQlpZiAoISgoRlBERl9TWVNGT05USU5GT19ERUZBVUxUKilwVGhpcyktPm1fcEZvbnRJbmZvLT5HZXRGYWNlTmFtZShoRm9udCwgbmFtZSkpIHJldHVybiAwOwotCWlmIChuYW1lLkdldExlbmd0aCgpID49IChsb25nKWJ1Zl9zaXplKSByZXR1cm4gbmFtZS5HZXRMZW5ndGgoKSArIDE7Ci0JRlhTWVNfc3RyY3B5KGJ1ZmZlciwgbmFtZSk7Ci0JcmV0dXJuIG5hbWUuR2V0TGVuZ3RoKCkgKyAxOworc3RhdGljIHVuc2lnbmVkIGxvbmcgRGVmYXVsdEdldEZhY2VOYW1lKHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogaEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmX3NpemUpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgbmFtZTsKKyAgaWYgKCEoKEZQREZfU1lTRk9OVElORk9fREVGQVVMVCopcFRoaXMpCisgICAgICAgICAgIC0+bV9wRm9udEluZm8tPkdldEZhY2VOYW1lKGhGb250LCBuYW1lKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKG5hbWUuR2V0TGVuZ3RoKCkgPj0gKGxvbmcpYnVmX3NpemUpCisgICAgcmV0dXJuIG5hbWUuR2V0TGVuZ3RoKCkgKyAxOworICBGWFNZU19zdHJjcHkoYnVmZmVyLCBuYW1lKTsKKyAgcmV0dXJuIG5hbWUuR2V0TGVuZ3RoKCkgKyAxOwogfQogCi1zdGF0aWMgaW50IERlZmF1bHRHZXRGb250Q2hhcnNldChzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCB2b2lkKiBoRm9udCkKLXsKLQlpbnQgY2hhcnNldDsKLQlpZiAoISgoRlBERl9TWVNGT05USU5GT19ERUZBVUxUKilwVGhpcyktPm1fcEZvbnRJbmZvLT5HZXRGb250Q2hhcnNldChoRm9udCwgY2hhcnNldCkpIHJldHVybiAwOwotCXJldHVybiBjaGFyc2V0Oworc3RhdGljIGludCBEZWZhdWx0R2V0Rm9udENoYXJzZXQoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcywgdm9pZCogaEZvbnQpIHsKKyAgaW50IGNoYXJzZXQ7CisgIGlmICghKChGUERGX1NZU0ZPTlRJTkZPX0RFRkFVTFQqKXBUaGlzKQorICAgICAgICAgICAtPm1fcEZvbnRJbmZvLT5HZXRGb250Q2hhcnNldChoRm9udCwgY2hhcnNldCkpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBjaGFyc2V0OwogfQogCi1zdGF0aWMgdm9pZCBEZWZhdWx0RGVsZXRlRm9udChzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCB2b2lkKiBoRm9udCkKLXsKLQkoKEZQREZfU1lTRk9OVElORk9fREVGQVVMVCopcFRoaXMpLT5tX3BGb250SW5mby0+RGVsZXRlRm9udChoRm9udCk7CitzdGF0aWMgdm9pZCBEZWZhdWx0RGVsZXRlRm9udChzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCB2b2lkKiBoRm9udCkgeworICAoKEZQREZfU1lTRk9OVElORk9fREVGQVVMVCopcFRoaXMpLT5tX3BGb250SW5mby0+RGVsZXRlRm9udChoRm9udCk7CiB9CiAKLURMTEVYUE9SVCBGUERGX1NZU0ZPTlRJTkZPKiBTVERDQUxMIEZQREZfR2V0RGVmYXVsdFN5c3RlbUZvbnRJbmZvKCkKLXsKLQlJRlhfU3lzdGVtRm9udEluZm8qIHBGb250SW5mbyA9IElGWF9TeXN0ZW1Gb250SW5mbzo6Q3JlYXRlRGVmYXVsdCgpOwotCWlmIChwRm9udEluZm8gPT0gTlVMTCkgcmV0dXJuIE5VTEw7CitETExFWFBPUlQgRlBERl9TWVNGT05USU5GTyogU1REQ0FMTCBGUERGX0dldERlZmF1bHRTeXN0ZW1Gb250SW5mbygpIHsKKyAgSUZYX1N5c3RlbUZvbnRJbmZvKiBwRm9udEluZm8gPSBJRlhfU3lzdGVtRm9udEluZm86OkNyZWF0ZURlZmF1bHQobnVsbHB0cik7CisgIGlmICghcEZvbnRJbmZvKQorICAgIHJldHVybiBOVUxMOwogCi0JRlBERl9TWVNGT05USU5GT19ERUZBVUxUKiBwRm9udEluZm9FeHQgPSBGWF9BbGxvYyhGUERGX1NZU0ZPTlRJTkZPX0RFRkFVTFQsIDEpOwotCXBGb250SW5mb0V4dC0+RGVsZXRlRm9udCA9IERlZmF1bHREZWxldGVGb250OwotCXBGb250SW5mb0V4dC0+RW51bUZvbnRzID0gRGVmYXVsdEVudW1Gb250czsKLQlwRm9udEluZm9FeHQtPkdldEZhY2VOYW1lID0gRGVmYXVsdEdldEZhY2VOYW1lOwotCXBGb250SW5mb0V4dC0+R2V0Rm9udCA9IERlZmF1bHRHZXRGb250OwotCXBGb250SW5mb0V4dC0+R2V0Rm9udENoYXJzZXQgPSBEZWZhdWx0R2V0Rm9udENoYXJzZXQ7Ci0JcEZvbnRJbmZvRXh0LT5HZXRGb250RGF0YSA9IERlZmF1bHRHZXRGb250RGF0YTsKLQlwRm9udEluZm9FeHQtPk1hcEZvbnQgPSBEZWZhdWx0TWFwRm9udDsKLQlwRm9udEluZm9FeHQtPlJlbGVhc2UgPSBEZWZhdWx0UmVsZWFzZTsKLQlwRm9udEluZm9FeHQtPnZlcnNpb24gPSAxOwotCXBGb250SW5mb0V4dC0+bV9wRm9udEluZm8gPSBwRm9udEluZm87Ci0JcmV0dXJuIHBGb250SW5mb0V4dDsKKyAgRlBERl9TWVNGT05USU5GT19ERUZBVUxUKiBwRm9udEluZm9FeHQgPQorICAgICAgRlhfQWxsb2MoRlBERl9TWVNGT05USU5GT19ERUZBVUxULCAxKTsKKyAgcEZvbnRJbmZvRXh0LT5EZWxldGVGb250ID0gRGVmYXVsdERlbGV0ZUZvbnQ7CisgIHBGb250SW5mb0V4dC0+RW51bUZvbnRzID0gRGVmYXVsdEVudW1Gb250czsKKyAgcEZvbnRJbmZvRXh0LT5HZXRGYWNlTmFtZSA9IERlZmF1bHRHZXRGYWNlTmFtZTsKKyAgcEZvbnRJbmZvRXh0LT5HZXRGb250ID0gRGVmYXVsdEdldEZvbnQ7CisgIHBGb250SW5mb0V4dC0+R2V0Rm9udENoYXJzZXQgPSBEZWZhdWx0R2V0Rm9udENoYXJzZXQ7CisgIHBGb250SW5mb0V4dC0+R2V0Rm9udERhdGEgPSBEZWZhdWx0R2V0Rm9udERhdGE7CisgIHBGb250SW5mb0V4dC0+TWFwRm9udCA9IERlZmF1bHRNYXBGb250OworICBwRm9udEluZm9FeHQtPlJlbGVhc2UgPSBEZWZhdWx0UmVsZWFzZTsKKyAgcEZvbnRJbmZvRXh0LT52ZXJzaW9uID0gMTsKKyAgcEZvbnRJbmZvRXh0LT5tX3BGb250SW5mbyA9IHBGb250SW5mbzsKKyAgcmV0dXJuIHBGb250SW5mb0V4dDsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZfdHJhbnNmb3JtcGFnZS5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmX3RyYW5zZm9ybXBhZ2UuY3BwCmluZGV4IDYxM2JhZTEuLjNlMmM3YjEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZfdHJhbnNmb3JtcGFnZS5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZl90cmFuc2Zvcm1wYWdlLmNwcApAQCAtMSwzMjEgKzEsMzIzIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9wdWJsaWMvZnBkZl90cmFuc2Zvcm1wYWdlLmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX2RlZmluZS5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX3RyYW5zZm9ybXBhZ2UuaCIKIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9TZXRNZWRpYUJveChGUERGX1BBR0UgcGFnZSwgZmxvYXQgbGVmdCwgZmxvYXQgYm90dG9tLCBmbG9hdCByaWdodCwgZmxvYXQgdG9wKQotewotCWlmKCFwYWdlKQotCQlyZXR1cm47CisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCiAKLQlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKLQlDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IHBQYWdlLT5tX3BGb3JtRGljdDsKLQlDUERGX0FycmF5KiBwTWVkaWFCb3hBcnJheSA9IG5ldyBDUERGX0FycmF5OwotCXBNZWRpYUJveEFycmF5LT5BZGQobmV3IENQREZfTnVtYmVyKGxlZnQpKTsKLQlwTWVkaWFCb3hBcnJheS0+QWRkKG5ldyBDUERGX051bWJlcihib3R0b20pKTsKLQlwTWVkaWFCb3hBcnJheS0+QWRkKG5ldyBDUERGX051bWJlcihGWF9GTE9BVChyaWdodCkpKTsKLQlwTWVkaWFCb3hBcnJheS0+QWRkKG5ldyBDUERGX051bWJlcihGWF9GTE9BVCh0b3ApKSk7Ci0JcFBhZ2VEaWN0LT5TZXRBdCgiTWVkaWFCb3giLCBwTWVkaWFCb3hBcnJheSk7CituYW1lc3BhY2UgeworCit2b2lkIFNldEJvdW5kaW5nQm94KENQREZfUGFnZSogcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBrZXksCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxlZnQsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRvcCkgeworICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IHBhZ2UtPm1fcEZvcm1EaWN0OworICBDUERGX0FycmF5KiBwQm91bmRpbmdCb3hBcnJheSA9IG5ldyBDUERGX0FycmF5OworICBwQm91bmRpbmdCb3hBcnJheS0+QWRkKG5ldyBDUERGX051bWJlcihsZWZ0KSk7CisgIHBCb3VuZGluZ0JveEFycmF5LT5BZGQobmV3IENQREZfTnVtYmVyKGJvdHRvbSkpOworICBwQm91bmRpbmdCb3hBcnJheS0+QWRkKG5ldyBDUERGX051bWJlcihyaWdodCkpOworICBwQm91bmRpbmdCb3hBcnJheS0+QWRkKG5ldyBDUERGX051bWJlcih0b3ApKTsKKyAgcFBhZ2VEaWN0LT5TZXRBdChrZXksIHBCb3VuZGluZ0JveEFycmF5KTsKIH0KIAorRlBERl9CT09MIEdldEJvdW5kaW5nQm94KENQREZfUGFnZSogcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdG9wKSB7CisgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcGFnZS0+bV9wRm9ybURpY3Q7CisgIENQREZfQXJyYXkqIHBBcnJheSA9IHBQYWdlRGljdC0+R2V0QXJyYXkoa2V5KTsKKyAgaWYgKCFwQXJyYXkpCisgICAgcmV0dXJuIEZBTFNFOwogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlX1NldENyb3BCb3goRlBERl9QQUdFIHBhZ2UsIGZsb2F0IGxlZnQsIGZsb2F0IGJvdHRvbSwgZmxvYXQgcmlnaHQsIGZsb2F0IHRvcCkKLXsKLQlpZighcGFnZSkKLQkJcmV0dXJuOwotCi0JQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2U7Ci0JQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBwUGFnZS0+bV9wRm9ybURpY3Q7Ci0JQ1BERl9BcnJheSogcENyb3BCb3hBcnJheSA9IG5ldyBDUERGX0FycmF5OwotCXBDcm9wQm94QXJyYXktPkFkZChuZXcgQ1BERl9OdW1iZXIobGVmdCkpOwotCXBDcm9wQm94QXJyYXktPkFkZChuZXcgQ1BERl9OdW1iZXIoYm90dG9tKSk7Ci0JcENyb3BCb3hBcnJheS0+QWRkKG5ldyBDUERGX051bWJlcihGWF9GTE9BVChyaWdodCkpKTsKLQlwQ3JvcEJveEFycmF5LT5BZGQobmV3IENQREZfTnVtYmVyKEZYX0ZMT0FUKHRvcCkpKTsKLQlwUGFnZURpY3QtPlNldEF0KCJDcm9wQm94IiwgcENyb3BCb3hBcnJheSk7CisgICpsZWZ0ID0gcEFycmF5LT5HZXRGbG9hdCgwKTsKKyAgKmJvdHRvbSA9IHBBcnJheS0+R2V0RmxvYXQoMSk7CisgICpyaWdodCA9IHBBcnJheS0+R2V0RmxvYXQoMik7CisgICp0b3AgPSBwQXJyYXktPkdldEZsb2F0KDMpOworICByZXR1cm4gVFJVRTsKIH0KIAorfSAgLy8gbmFtZXNwYWNlCiAKLURMTEVYUE9SVCBGWF9CT09MIFNURENBTEwgRlBERlBhZ2VfR2V0TWVkaWFCb3goRlBERl9QQUdFIHBhZ2UsIGZsb2F0KiBsZWZ0LCBmbG9hdCogYm90dG9tLCBmbG9hdCogcmlnaHQsIGZsb2F0KiB0b3ApCi17Ci0JaWYoIXBhZ2UpCi0JCXJldHVybiBGQUxTRTsKLQlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKLQlDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IHBQYWdlLT5tX3BGb3JtRGljdDsKLQlDUERGX0FycmF5KiBwQXJyYXkgPSBwUGFnZURpY3QtPkdldEFycmF5KCJNZWRpYUJveCIpOwotCWlmKHBBcnJheSkKLQl7Ci0JCSpsZWZ0ID0gcEFycmF5LT5HZXRGbG9hdCgwKTsKLQkJKmJvdHRvbSA9IHBBcnJheS0+R2V0RmxvYXQoMSk7Ci0JCSpyaWdodCA9IHBBcnJheS0+R2V0RmxvYXQoMik7Ci0JCSp0b3AgPSBwQXJyYXktPkdldEZsb2F0KDMpOwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JcmV0dXJuIEZBTFNFOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9TZXRNZWRpYUJveChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdG9wKSB7CisgIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlKTsKKyAgaWYgKCFwUGFnZSkKKyAgICByZXR1cm47CisKKyAgU2V0Qm91bmRpbmdCb3gocFBhZ2UsICJNZWRpYUJveCIsIGxlZnQsIGJvdHRvbSwgcmlnaHQsIHRvcCk7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9HZXRDcm9wQm94KEZQREZfUEFHRSBwYWdlLCBmbG9hdCogbGVmdCwgZmxvYXQqIGJvdHRvbSwgZmxvYXQqIHJpZ2h0LCBmbG9hdCogdG9wKQotewotCWlmKCFwYWdlKQotCQlyZXR1cm4gRkFMU0U7Ci0JQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2U7Ci0JQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBwUGFnZS0+bV9wRm9ybURpY3Q7Ci0JQ1BERl9BcnJheSogcEFycmF5ID0gcFBhZ2VEaWN0LT5HZXRBcnJheSgiQ3JvcEJveCIpOwotCWlmKHBBcnJheSkKLQl7Ci0JCSpsZWZ0ID0gcEFycmF5LT5HZXRGbG9hdCgwKTsKLQkJKmJvdHRvbSA9IHBBcnJheS0+R2V0RmxvYXQoMSk7Ci0JCSpyaWdodCA9IHBBcnJheS0+R2V0RmxvYXQoMik7Ci0JCSp0b3AgPSBwQXJyYXktPkdldEZsb2F0KDMpOwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JcmV0dXJuIEZBTFNFOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9TZXRDcm9wQm94KEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRvcCkgeworICBDUERGX1BhZ2UqIHBQYWdlID0gQ1BERlBhZ2VGcm9tRlBERlBhZ2UocGFnZSk7CisgIGlmICghcFBhZ2UpCisgICAgcmV0dXJuOworCisgIFNldEJvdW5kaW5nQm94KHBQYWdlLCAiQ3JvcEJveCIsIGxlZnQsIGJvdHRvbSwgcmlnaHQsIHRvcCk7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9UcmFuc0Zvcm1XaXRoQ2xpcChGUERGX1BBR0UgcGFnZSwgRlNfTUFUUklYKiBtYXRyaXgsIEZTX1JFQ1RGKiBjbGlwUmVjdCkKLXsKLQlpZighcGFnZSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JQ0ZYX0J5dGVUZXh0QnVmIHRleHRCdWY7Ci0JdGV4dEJ1Zjw8InEgIjsKLQlDRlhfRmxvYXRSZWN0IHJlY3QoY2xpcFJlY3QtPmxlZnQsIGNsaXBSZWN0LT5ib3R0b20sIGNsaXBSZWN0LT5yaWdodCwgY2xpcFJlY3QtPnRvcCk7Ci0JcmVjdC5Ob3JtYWxpemUoKTsKLQlDRlhfQnl0ZVN0cmluZyBic0NsaXBwaW5nOwotCWJzQ2xpcHBpbmcuRm9ybWF0KCIlZiAlZiAlZiAlZiByZSBXKiBuICIsIHJlY3QubGVmdCwgcmVjdC5ib3R0b20sIHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSk7Ci0JdGV4dEJ1Zjw8YnNDbGlwcGluZzsKLQotCUNGWF9CeXRlU3RyaW5nIGJzTWF0aXg7Ci0JYnNNYXRpeC5Gb3JtYXQoIiVmICVmICVmICVmICVmICVmIGNtICIsIG1hdHJpeC0+YSwgbWF0cml4LT5iLG1hdHJpeC0+YyxtYXRyaXgtPmQsbWF0cml4LT5lLG1hdHJpeC0+Zik7Ci0JdGV4dEJ1Zjw8YnNNYXRpeDsKLQkKLQotCUNQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlOwotCUNQREZfRGljdGlvbmFyeSogcFBhZ2VEaWMgPSBwUGFnZS0+bV9wRm9ybURpY3Q7Ci0JQ1BERl9PYmplY3QqIHBDb250ZW50T2JqID0gcFBhZ2VEaWMgPyBwUGFnZURpYy0+R2V0RWxlbWVudCgiQ29udGVudHMiKSA6IE5VTEw7Ci0JaWYoIXBDb250ZW50T2JqKQotCQlwQ29udGVudE9iaiA9IHBQYWdlRGljID8gcFBhZ2VEaWMtPkdldEFycmF5KCJDb250ZW50cyIpIDogTlVMTDsKLQlpZighcENvbnRlbnRPYmopCi0JCXJldHVybiBGQUxTRTsKLQkKLQlDUERGX0RpY3Rpb25hcnkqIHBEaWMgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotCUNQREZfU3RyZWFtKiBwU3RyZWFtID0gbmV3IENQREZfU3RyZWFtKE5VTEwsMCwgcERpYyk7Ci0JcFN0cmVhbS0+U2V0RGF0YSh0ZXh0QnVmLkdldEJ1ZmZlcigpLCB0ZXh0QnVmLkdldFNpemUoKSwgRkFMU0UsIEZBTFNFKTsKLQlDUERGX0RvY3VtZW50KiBwRG9jID0gcFBhZ2UtPm1fcERvY3VtZW50OwotCWlmKCFwRG9jKQotCQlyZXR1cm4gRkFMU0U7Ci0JcERvYy0+QWRkSW5kaXJlY3RPYmplY3QocFN0cmVhbSk7Ci0KLQlwRGljID0gbmV3IENQREZfRGljdGlvbmFyeTsKLQlDUERGX1N0cmVhbSogcEVuZFN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbShOVUxMLDAsIHBEaWMpOwotCXBFbmRTdHJlYW0tPlNldERhdGEoKEZYX0xQQ0JZVEUpIiBRIiwgMiwgRkFMU0UsIEZBTFNFKTsKLQlwRG9jLT5BZGRJbmRpcmVjdE9iamVjdChwRW5kU3RyZWFtKTsKLQkKLQlDUERGX0FycmF5KiBwQ29udGVudEFycmF5ID0gTlVMTDsKLQlpZiAocENvbnRlbnRPYmogJiYgcENvbnRlbnRPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpCi0JewotCQlwQ29udGVudEFycmF5ID0gKENQREZfQXJyYXkqKXBDb250ZW50T2JqOwotCQlDUERGX1JlZmVyZW5jZSogcFJlZiA9IG5ldyBDUERGX1JlZmVyZW5jZShwRG9jLCBwU3RyZWFtLT5HZXRPYmpOdW0oKSk7Ci0JCXBDb250ZW50QXJyYXktPkluc2VydEF0KDAsIHBSZWYpOwotCQlwQ29udGVudEFycmF5LT5BZGRSZWZlcmVuY2UocERvYyxwRW5kU3RyZWFtKTsKLQkJCi0JfQotCWVsc2UgaWYocENvbnRlbnRPYmogJiYgcENvbnRlbnRPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfUkVGRVJFTkNFKQotCXsKLQkJQ1BERl9SZWZlcmVuY2UqIHBSZWZlcmVuY2UgPSAoQ1BERl9SZWZlcmVuY2UqKXBDb250ZW50T2JqOwotCQlDUERGX09iamVjdCogcERpcmVjdE9iaiA9IHBSZWZlcmVuY2UtPkdldERpcmVjdCgpOwotCQlpZihwRGlyZWN0T2JqICE9IE5VTEwpCi0JCXsKLQkJCWlmKHBEaXJlY3RPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpCi0JCQl7Ci0JCQkJcENvbnRlbnRBcnJheSA9IChDUERGX0FycmF5KilwRGlyZWN0T2JqOwotCQkJCUNQREZfUmVmZXJlbmNlKiBwUmVmID0gbmV3IENQREZfUmVmZXJlbmNlKHBEb2MsIHBTdHJlYW0tPkdldE9iak51bSgpKTsKLQkJCQlwQ29udGVudEFycmF5LT5JbnNlcnRBdCgwLCBwUmVmKTsKLQkJCQlwQ29udGVudEFycmF5LT5BZGRSZWZlcmVuY2UocERvYyxwRW5kU3RyZWFtKTsKLQkJCX0KLQkJCWVsc2UgaWYocERpcmVjdE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pCi0JCQl7Ci0JCQkJcENvbnRlbnRBcnJheSA9IG5ldyBDUERGX0FycmF5KCk7Ci0JCQkJcENvbnRlbnRBcnJheS0+QWRkUmVmZXJlbmNlKHBEb2MscFN0cmVhbS0+R2V0T2JqTnVtKCkpOwotCQkJCXBDb250ZW50QXJyYXktPkFkZFJlZmVyZW5jZShwRG9jLHBEaXJlY3RPYmotPkdldE9iak51bSgpKTsKLQkJCQlwQ29udGVudEFycmF5LT5BZGRSZWZlcmVuY2UocERvYywgcEVuZFN0cmVhbSk7Ci0JCQkJcFBhZ2VEaWMtPlNldEF0UmVmZXJlbmNlKCJDb250ZW50cyIsIHBEb2MsIHBEb2MtPkFkZEluZGlyZWN0T2JqZWN0KHBDb250ZW50QXJyYXkpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vTmVlZCB0byB0cmFuc2Zvcm0gdGhlIHBhdHRlcm5zIGFzIHdlbGwuCi0JQ1BERl9EaWN0aW9uYXJ5KiBwUmVzID0gcFBhZ2VEaWMtPkdldERpY3QoRlhfQlNUUkMoIlJlc291cmNlcyIpKTsKLQlpZihwUmVzKQotCXsKLQkJQ1BERl9EaWN0aW9uYXJ5KiBwUGF0dGVuRGljdCA9IHBSZXMtPkdldERpY3QoRlhfQlNUUkMoIlBhdHRlcm4iKSk7Ci0JCWlmKHBQYXR0ZW5EaWN0KQotCQl7Ci0JCQlGWF9QT1NJVElPTiBwb3MgPSBwUGF0dGVuRGljdC0+R2V0U3RhcnRQb3MoKTsKLQkJCXdoaWxlKHBvcykKLQkJCXsKLQkJCQlDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gTlVMTDsKLQkJCQlDRlhfQnl0ZVN0cmluZyBrZXk7Ci0JCQkJQ1BERl9PYmplY3QqIHBPYmogPSBwUGF0dGVuRGljdC0+R2V0TmV4dEVsZW1lbnQocG9zLCBrZXkpOwotCQkJCWlmKHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfUkVGRVJFTkNFKQotCQkJCQlwT2JqID0gcE9iai0+R2V0RGlyZWN0KCk7Ci0JCQkJaWYocE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKQotCQkJCXsKLQkJCQkJcERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwT2JqOwotCQkJCX0KLQkJCQllbHNlIGlmKHBPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKQotCQkJCXsKLQkJCQkJcERpY3QgPSAoKENQREZfU3RyZWFtKilwT2JqKS0+R2V0RGljdCgpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCWNvbnRpbnVlOwotCQkJCQotCQkJCUNGWF9BZmZpbmVNYXRyaXggbSA9IHBEaWN0LT5HZXRNYXRyaXgoRlhfQlNUUkMoIk1hdHJpeCIpKTsKLQkJCQlDRlhfQWZmaW5lTWF0cml4IHQgPSAqKENGWF9BZmZpbmVNYXRyaXgqKW1hdHJpeDsKLQkJCQltLkNvbmNhdCh0KTsKLQkJCQlwRGljdC0+U2V0QXRNYXRyaXgoRlhfQlNUUkMoIk1hdHJpeCIpLCBtKTsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiBUUlVFOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZQYWdlX0dldE1lZGlhQm94KEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB0b3ApIHsKKyAgQ1BERl9QYWdlKiBwUGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2UpOworICByZXR1cm4gcFBhZ2UgJiYgR2V0Qm91bmRpbmdCb3gocFBhZ2UsICJNZWRpYUJveCIsIGxlZnQsIGJvdHRvbSwgcmlnaHQsIHRvcCk7CiB9CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VPYmpfVHJhbnNmb3JtQ2xpcFBhdGgoRlBERl9QQUdFT0JKRUNUIHBhZ2Vfb2JqZWN0LGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlIGMsIGRvdWJsZSBkLCBkb3VibGUgZSwgZG91YmxlIGYpCi17Ci0JQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiA9IChDUERGX1BhZ2VPYmplY3QqKXBhZ2Vfb2JqZWN0OwotCWlmKHBQYWdlT2JqID09IE5VTEwpCi0JCXJldHVybjsKLQlDRlhfQWZmaW5lTWF0cml4IG1hdHJpeCgoRlhfRkxPQVQpYSwoRlhfRkxPQVQpYiwoRlhfRkxPQVQpYywoRlhfRkxPQVQpZCwoRlhfRkxPQVQpZSwoRlhfRkxPQVQpZik7Ci0JCi0JLy9TcGVjaWFsIHRyZWF0bWVudCB0byBzaGFkaW5nIG9iamVjdCwgYmVjYXVzZSB0aGUgQ2xpcFBhdGggZm9yIHNoYWRpbmcgb2JqZWN0IGlzIGFscmVhZHkgdHJhbnNmb3JtZWQuCi0JaWYocFBhZ2VPYmotPm1fVHlwZSAhPSBQREZQQUdFX1NIQURJTkcpCi0JCXBQYWdlT2JqLT5UcmFuc2Zvcm1DbGlwUGF0aChtYXRyaXgpOwotCXBQYWdlT2JqLT5UcmFuc2Zvcm1HZW5lcmFsU3RhdGUobWF0cml4KTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9HZXRDcm9wQm94KEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHRvcCkgeworICBDUERGX1BhZ2UqIHBQYWdlID0gQ1BERlBhZ2VGcm9tRlBERlBhZ2UocGFnZSk7CisgIHJldHVybiBwUGFnZSAmJiBHZXRCb3VuZGluZ0JveChwUGFnZSwgIkNyb3BCb3giLCBsZWZ0LCBib3R0b20sIHJpZ2h0LCB0b3ApOwogfQogCitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VfVHJhbnNGb3JtV2l0aENsaXAoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfTUFUUklYKiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfUkVDVEYqIGNsaXBSZWN0KSB7CisgIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlKTsKKyAgaWYgKCFwUGFnZSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLURMTEVYUE9SVCBGUERGX0NMSVBQQVRIIFNURENBTEwgRlBERl9DcmVhdGVDbGlwUGF0aChmbG9hdCBsZWZ0LCBmbG9hdCBib3R0b20sIGZsb2F0IHJpZ2h0LCBmbG9hdCB0b3ApCi17Ci0JQ1BERl9DbGlwUGF0aCogcE5ld0NsaXBQYXRoID0gbmV3IENQREZfQ2xpcFBhdGgoKTsKLQlwTmV3Q2xpcFBhdGgtPkdldE1vZGlmeSgpOwotCUNQREZfUGF0aCBQYXRoOwotCVBhdGguR2V0TW9kaWZ5KCk7Ci0JUGF0aC5BcHBlbmRSZWN0KGxlZnQsIGJvdHRvbSwgcmlnaHQsIHRvcCk7Ci0JcE5ld0NsaXBQYXRoLT5BcHBlbmRQYXRoKFBhdGgsIEZYRklMTF9BTFRFUk5BVEUsIEZBTFNFKTsKLQlyZXR1cm4gcE5ld0NsaXBQYXRoOworICBDRlhfQnl0ZVRleHRCdWYgdGV4dEJ1ZjsKKyAgdGV4dEJ1ZiA8PCAicSAiOworICBDRlhfRmxvYXRSZWN0IHJlY3QoY2xpcFJlY3QtPmxlZnQsIGNsaXBSZWN0LT5ib3R0b20sIGNsaXBSZWN0LT5yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgIGNsaXBSZWN0LT50b3ApOworICByZWN0Lk5vcm1hbGl6ZSgpOworICBDRlhfQnl0ZVN0cmluZyBic0NsaXBwaW5nOworICBic0NsaXBwaW5nLkZvcm1hdCgiJWYgJWYgJWYgJWYgcmUgVyogbiAiLCByZWN0LmxlZnQsIHJlY3QuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICByZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCkpOworICB0ZXh0QnVmIDw8IGJzQ2xpcHBpbmc7CisKKyAgQ0ZYX0J5dGVTdHJpbmcgYnNNYXRpeDsKKyAgYnNNYXRpeC5Gb3JtYXQoIiVmICVmICVmICVmICVmICVmIGNtICIsIG1hdHJpeC0+YSwgbWF0cml4LT5iLCBtYXRyaXgtPmMsCisgICAgICAgICAgICAgICAgIG1hdHJpeC0+ZCwgbWF0cml4LT5lLCBtYXRyaXgtPmYpOworICB0ZXh0QnVmIDw8IGJzTWF0aXg7CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpYyA9IHBQYWdlLT5tX3BGb3JtRGljdDsKKyAgQ1BERl9PYmplY3QqIHBDb250ZW50T2JqID0KKyAgICAgIHBQYWdlRGljID8gcFBhZ2VEaWMtPkdldEVsZW1lbnQoIkNvbnRlbnRzIikgOiBudWxscHRyOworICBpZiAoIXBDb250ZW50T2JqKQorICAgIHBDb250ZW50T2JqID0gcFBhZ2VEaWMgPyBwUGFnZURpYy0+R2V0QXJyYXkoIkNvbnRlbnRzIikgOiBudWxscHRyOworICBpZiAoIXBDb250ZW50T2JqKQorICAgIHJldHVybiBGQUxTRTsKKworICBDUERGX0RpY3Rpb25hcnkqIHBEaWMgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbShudWxscHRyLCAwLCBwRGljKTsKKyAgcFN0cmVhbS0+U2V0RGF0YSh0ZXh0QnVmLkdldEJ1ZmZlcigpLCB0ZXh0QnVmLkdldFNpemUoKSwgRkFMU0UsIEZBTFNFKTsKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9IHBQYWdlLT5tX3BEb2N1bWVudDsKKyAgaWYgKCFwRG9jKQorICAgIHJldHVybiBGQUxTRTsKKyAgcERvYy0+QWRkSW5kaXJlY3RPYmplY3QocFN0cmVhbSk7CisKKyAgcERpYyA9IG5ldyBDUERGX0RpY3Rpb25hcnk7CisgIENQREZfU3RyZWFtKiBwRW5kU3RyZWFtID0gbmV3IENQREZfU3RyZWFtKG51bGxwdHIsIDAsIHBEaWMpOworICBwRW5kU3RyZWFtLT5TZXREYXRhKChjb25zdCB1aW50OF90KikiIFEiLCAyLCBGQUxTRSwgRkFMU0UpOworICBwRG9jLT5BZGRJbmRpcmVjdE9iamVjdChwRW5kU3RyZWFtKTsKKworICBDUERGX0FycmF5KiBwQ29udGVudEFycmF5ID0gbnVsbHB0cjsKKyAgaWYgKENQREZfQXJyYXkqIHBBcnJheSA9IFRvQXJyYXkocENvbnRlbnRPYmopKSB7CisgICAgcENvbnRlbnRBcnJheSA9IHBBcnJheTsKKyAgICBDUERGX1JlZmVyZW5jZSogcFJlZiA9IG5ldyBDUERGX1JlZmVyZW5jZShwRG9jLCBwU3RyZWFtLT5HZXRPYmpOdW0oKSk7CisgICAgcENvbnRlbnRBcnJheS0+SW5zZXJ0QXQoMCwgcFJlZik7CisgICAgcENvbnRlbnRBcnJheS0+QWRkUmVmZXJlbmNlKHBEb2MsIHBFbmRTdHJlYW0pOworICB9IGVsc2UgaWYgKENQREZfUmVmZXJlbmNlKiBwUmVmZXJlbmNlID0gVG9SZWZlcmVuY2UocENvbnRlbnRPYmopKSB7CisgICAgQ1BERl9PYmplY3QqIHBEaXJlY3RPYmogPSBwUmVmZXJlbmNlLT5HZXREaXJlY3QoKTsKKyAgICBpZiAocERpcmVjdE9iaikgeworICAgICAgaWYgKENQREZfQXJyYXkqIHBBcnJheSA9IHBEaXJlY3RPYmotPkFzQXJyYXkoKSkgeworICAgICAgICBwQ29udGVudEFycmF5ID0gcEFycmF5OworICAgICAgICBDUERGX1JlZmVyZW5jZSogcFJlZiA9IG5ldyBDUERGX1JlZmVyZW5jZShwRG9jLCBwU3RyZWFtLT5HZXRPYmpOdW0oKSk7CisgICAgICAgIHBDb250ZW50QXJyYXktPkluc2VydEF0KDAsIHBSZWYpOworICAgICAgICBwQ29udGVudEFycmF5LT5BZGRSZWZlcmVuY2UocERvYywgcEVuZFN0cmVhbSk7CisgICAgICB9IGVsc2UgaWYgKHBEaXJlY3RPYmotPklzU3RyZWFtKCkpIHsKKyAgICAgICAgcENvbnRlbnRBcnJheSA9IG5ldyBDUERGX0FycmF5KCk7CisgICAgICAgIHBDb250ZW50QXJyYXktPkFkZFJlZmVyZW5jZShwRG9jLCBwU3RyZWFtLT5HZXRPYmpOdW0oKSk7CisgICAgICAgIHBDb250ZW50QXJyYXktPkFkZFJlZmVyZW5jZShwRG9jLCBwRGlyZWN0T2JqLT5HZXRPYmpOdW0oKSk7CisgICAgICAgIHBDb250ZW50QXJyYXktPkFkZFJlZmVyZW5jZShwRG9jLCBwRW5kU3RyZWFtKTsKKyAgICAgICAgcFBhZ2VEaWMtPlNldEF0UmVmZXJlbmNlKCJDb250ZW50cyIsIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRG9jLT5BZGRJbmRpcmVjdE9iamVjdChwQ29udGVudEFycmF5KSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gTmVlZCB0byB0cmFuc2Zvcm0gdGhlIHBhdHRlcm5zIGFzIHdlbGwuCisgIENQREZfRGljdGlvbmFyeSogcFJlcyA9IHBQYWdlRGljLT5HZXREaWN0KCJSZXNvdXJjZXMiKTsKKyAgaWYgKHBSZXMpIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBQYXR0ZW5EaWN0ID0gcFJlcy0+R2V0RGljdCgiUGF0dGVybiIpOworICAgIGlmIChwUGF0dGVuRGljdCkgeworICAgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6ICpwUGF0dGVuRGljdCkgeworICAgICAgICBDUERGX09iamVjdCogcE9iaiA9IGl0LnNlY29uZDsKKyAgICAgICAgaWYgKHBPYmotPklzUmVmZXJlbmNlKCkpCisgICAgICAgICAgcE9iaiA9IHBPYmotPkdldERpcmVjdCgpOworCisgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBudWxscHRyOworICAgICAgICBpZiAocE9iai0+SXNEaWN0aW9uYXJ5KCkpCisgICAgICAgICAgcERpY3QgPSBwT2JqLT5Bc0RpY3Rpb25hcnkoKTsKKyAgICAgICAgZWxzZSBpZiAoQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwT2JqLT5Bc1N0cmVhbSgpKQorICAgICAgICAgIHBEaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgQ0ZYX01hdHJpeCBtID0gcERpY3QtPkdldE1hdHJpeCgiTWF0cml4Iik7CisgICAgICAgIENGWF9NYXRyaXggdCA9ICooQ0ZYX01hdHJpeCopbWF0cml4OworICAgICAgICBtLkNvbmNhdCh0KTsKKyAgICAgICAgcERpY3QtPlNldEF0TWF0cml4KCJNYXRyaXgiLCBtKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gVFJVRTsKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0Rlc3Ryb3lDbGlwUGF0aChGUERGX0NMSVBQQVRIIGNsaXBQYXRoKQotewotCWlmKGNsaXBQYXRoKQotCQlkZWxldGUgKENQREZfQ2xpcFBhdGgqKWNsaXBQYXRoOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTAorRlBERlBhZ2VPYmpfVHJhbnNmb3JtQ2xpcFBhdGgoRlBERl9QQUdFT0JKRUNUIHBhZ2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmKSB7CisgIENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmogPSAoQ1BERl9QYWdlT2JqZWN0KilwYWdlX29iamVjdDsKKyAgaWYgKCFwUGFnZU9iaikKKyAgICByZXR1cm47CisgIENGWF9NYXRyaXggbWF0cml4KChGWF9GTE9BVClhLCAoRlhfRkxPQVQpYiwgKEZYX0ZMT0FUKWMsIChGWF9GTE9BVClkLAorICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpZSwgKEZYX0ZMT0FUKWYpOworCisgIC8vIFNwZWNpYWwgdHJlYXRtZW50IHRvIHNoYWRpbmcgb2JqZWN0LCBiZWNhdXNlIHRoZSBDbGlwUGF0aCBmb3Igc2hhZGluZworICAvLyBvYmplY3QgaXMgYWxyZWFkeSB0cmFuc2Zvcm1lZC4KKyAgaWYgKHBQYWdlT2JqLT5tX1R5cGUgIT0gUERGUEFHRV9TSEFESU5HKQorICAgIHBQYWdlT2JqLT5UcmFuc2Zvcm1DbGlwUGF0aChtYXRyaXgpOworICBwUGFnZU9iai0+VHJhbnNmb3JtR2VuZXJhbFN0YXRlKG1hdHJpeCk7CiB9CiAKLXZvaWQgT3V0cHV0UGF0aChDRlhfQnl0ZVRleHRCdWYmIGJ1ZiwgQ1BERl9QYXRoIHBhdGgpCi17Ci0JY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEgPSBwYXRoOwotCWlmIChwUGF0aERhdGEgPT0gTlVMTCkgcmV0dXJuOwotCQotCUZYX1BBVEhQT0lOVCogcFBvaW50cyA9IHBQYXRoRGF0YS0+R2V0UG9pbnRzKCk7Ci0JCi0JaWYgKHBhdGguSXNSZWN0KCkpIHsKLQkJYnVmIDw8IChwUG9pbnRzWzBdLm1fUG9pbnRYKSA8PCAiICIgPDwgKHBQb2ludHNbMF0ubV9Qb2ludFkpIDw8ICIgIiAKLQkJCTw8IChwUG9pbnRzWzJdLm1fUG9pbnRYIC0gcFBvaW50c1swXS5tX1BvaW50WCkgPDwgIiAiIAotCQkJPDwgKHBQb2ludHNbMl0ubV9Qb2ludFkgLSBwUG9pbnRzWzBdLm1fUG9pbnRZKSA8PCAiIHJlXG4iOwotCQlyZXR1cm47Ci0JfQotCQotCUNGWF9CeXRlU3RyaW5nIHRlbXA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwUGF0aERhdGEtPkdldFBvaW50Q291bnQoKTsgaSArKykgewotCQlidWYgPDwgKHBQb2ludHNbaV0ubV9Qb2ludFgpIDw8ICIgIiA8PCAocFBvaW50c1tpXS5tX1BvaW50WSk7Ci0JCWludCBwb2ludF90eXBlID0gcFBvaW50c1tpXS5tX0ZsYWcgJiBGWFBUX1RZUEU7Ci0JCWlmIChwb2ludF90eXBlID09IEZYUFRfTU9WRVRPKQotCQkJYnVmIDw8ICIgbVxuIjsKLQkJZWxzZSBpZiAocG9pbnRfdHlwZSA9PSBGWFBUX0JFWklFUlRPKSB7Ci0JCQlidWYgPDwgIiAiIDw8IChwUG9pbnRzW2krMV0ubV9Qb2ludFgpIDw8ICIgIiA8PCAocFBvaW50c1tpKzFdLm1fUG9pbnRZKSA8PCAiICIgPDwgCi0JCQkJKHBQb2ludHNbaSsyXS5tX1BvaW50WCkgPDwgIiAiIDw8IChwUG9pbnRzW2krMl0ubV9Qb2ludFkpOwotCQkJaWYgKHBQb2ludHNbaSsyXS5tX0ZsYWcgJiBGWFBUX0NMT1NFRklHVVJFKQotCQkJCWJ1ZiA8PCAiIGMgaFxuIjsKLQkJCWVsc2UKLQkJCQlidWYgPDwgIiBjXG4iOwotCQkJaSArPSAyOwotCQl9IGVsc2UgaWYgKHBvaW50X3R5cGUgPT0gRlhQVF9MSU5FVE8pIHsKLQkJCWlmIChwUG9pbnRzW2ldLm1fRmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpCi0JCQkJYnVmIDw8ICIgbCBoXG4iOwotCQkJZWxzZQotCQkJCWJ1ZiA8PCAiIGxcbiI7Ci0JCX0KLQl9CitETExFWFBPUlQgRlBERl9DTElQUEFUSCBTVERDQUxMIEZQREZfQ3JlYXRlQ2xpcFBhdGgoZmxvYXQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdG9wKSB7CisgIENQREZfQ2xpcFBhdGgqIHBOZXdDbGlwUGF0aCA9IG5ldyBDUERGX0NsaXBQYXRoKCk7CisgIHBOZXdDbGlwUGF0aC0+R2V0TW9kaWZ5KCk7CisgIENQREZfUGF0aCBQYXRoOworICBQYXRoLkdldE1vZGlmeSgpOworICBQYXRoLkFwcGVuZFJlY3QobGVmdCwgYm90dG9tLCByaWdodCwgdG9wKTsKKyAgcE5ld0NsaXBQYXRoLT5BcHBlbmRQYXRoKFBhdGgsIEZYRklMTF9BTFRFUk5BVEUsIEZBTFNFKTsKKyAgcmV0dXJuIHBOZXdDbGlwUGF0aDsKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9JbnNlcnRDbGlwUGF0aChGUERGX1BBR0UgcGFnZSxGUERGX0NMSVBQQVRIIGNsaXBQYXRoKQotewotCWlmKCFwYWdlKQotCQlyZXR1cm47Ci0JQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2U7Ci0JQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpYyA9IHBQYWdlLT5tX3BGb3JtRGljdDsKLQlDUERGX09iamVjdCogcENvbnRlbnRPYmogPSBwUGFnZURpYyA/IHBQYWdlRGljLT5HZXRFbGVtZW50KCJDb250ZW50cyIpIDogTlVMTDsKLQlpZighcENvbnRlbnRPYmopCi0JCXBDb250ZW50T2JqID0gcFBhZ2VEaWMgPyBwUGFnZURpYy0+R2V0QXJyYXkoIkNvbnRlbnRzIikgOiBOVUxMOwotCWlmKCFwQ29udGVudE9iaikKLQkJcmV0dXJuOwotCi0JQ0ZYX0J5dGVUZXh0QnVmIHN0ckNsaXA7Ci0JQ1BERl9DbGlwUGF0aCogcENsaXBQYXRoID0gKENQREZfQ2xpcFBhdGgqKWNsaXBQYXRoOwotCUZYX0RXT1JEIGk7Ci0JZm9yIChpID0gMDsgaSA8IHBDbGlwUGF0aC0+R2V0UGF0aENvdW50KCk7IGkgKyspIHsKLQkJQ1BERl9QYXRoIHBhdGggPSBwQ2xpcFBhdGgtPkdldFBhdGgoaSk7Ci0JCWludCBpQ2xpcFR5cGUgPSBwQ2xpcFBhdGgtPkdldENsaXBUeXBlKGkpOwotCQlpZiAocGF0aC5HZXRQb2ludENvdW50KCkgPT0gMCkgewotCQkJLy8gRW1wdHkgY2xpcHBpbmcgKHRvdGFsbHkgY2xpcHBlZCBvdXQpCi0JCQlzdHJDbGlwIDw8ICIwIDAgbSBXIG4gIjsKLQkJfSBlbHNlIHsKLQkJCU91dHB1dFBhdGgoc3RyQ2xpcCwgcGF0aCk7Ci0JCQlpZiAoaUNsaXBUeXBlID09IEZYRklMTF9XSU5ESU5HKQotCQkJCXN0ckNsaXAgPDwgIlcgblxuIjsKLQkJCWVsc2UKLQkJCQlzdHJDbGlwIDw8ICJXKiBuXG4iOwotCQl9Ci0JfQotCUNQREZfRGljdGlvbmFyeSogcERpYyA9IG5ldyBDUERGX0RpY3Rpb25hcnk7Ci0JQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBuZXcgQ1BERl9TdHJlYW0oTlVMTCwwLCBwRGljKTsKLQlwU3RyZWFtLT5TZXREYXRhKHN0ckNsaXAuR2V0QnVmZmVyKCksIHN0ckNsaXAuR2V0U2l6ZSgpLCBGQUxTRSwgRkFMU0UpOwotCUNQREZfRG9jdW1lbnQqIHBEb2MgPSBwUGFnZS0+bV9wRG9jdW1lbnQ7Ci0JaWYoIXBEb2MpCi0JCXJldHVybjsKLQlwRG9jLT5BZGRJbmRpcmVjdE9iamVjdChwU3RyZWFtKTsKLQkKLQlDUERGX0FycmF5KiBwQ29udGVudEFycmF5ID0gTlVMTDsKLQlpZiAocENvbnRlbnRPYmogJiYgcENvbnRlbnRPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfQVJSQVkpCi0JewotCQlwQ29udGVudEFycmF5ID0gKENQREZfQXJyYXkqKXBDb250ZW50T2JqOwotCQlDUERGX1JlZmVyZW5jZSogcFJlZiA9IG5ldyBDUERGX1JlZmVyZW5jZShwRG9jLCBwU3RyZWFtLT5HZXRPYmpOdW0oKSk7Ci0JCXBDb250ZW50QXJyYXktPkluc2VydEF0KDAsIHBSZWYpOwotCX0KLQllbHNlIGlmKHBDb250ZW50T2JqICYmIHBDb250ZW50T2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1JFRkVSRU5DRSkKLQl7Ci0JCUNQREZfUmVmZXJlbmNlKiBwUmVmZXJlbmNlID0gKENQREZfUmVmZXJlbmNlKilwQ29udGVudE9iajsKLQkJQ1BERl9PYmplY3QqIHBEaXJlY3RPYmogPSBwUmVmZXJlbmNlLT5HZXREaXJlY3QoKTsKLQkJaWYocERpcmVjdE9iaiAhPSBOVUxMKQotCQl7Ci0JCQlpZihwRGlyZWN0T2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX0FSUkFZKQotCQkJewotCQkJCXBDb250ZW50QXJyYXkgPSAoQ1BERl9BcnJheSopcERpcmVjdE9iajsKLQkJCQlDUERGX1JlZmVyZW5jZSogcFJlZiA9IG5ldyBDUERGX1JlZmVyZW5jZShwRG9jLCBwU3RyZWFtLT5HZXRPYmpOdW0oKSk7Ci0JCQkJcENvbnRlbnRBcnJheS0+SW5zZXJ0QXQoMCwgcFJlZik7Ci0JCQl9Ci0JCQllbHNlIGlmKHBEaXJlY3RPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKQotCQkJewotCQkJCXBDb250ZW50QXJyYXkgPSBuZXcgQ1BERl9BcnJheSgpOwotCQkJCXBDb250ZW50QXJyYXktPkFkZFJlZmVyZW5jZShwRG9jLHBTdHJlYW0tPkdldE9iak51bSgpKTsKLQkJCQlwQ29udGVudEFycmF5LT5BZGRSZWZlcmVuY2UocERvYyxwRGlyZWN0T2JqLT5HZXRPYmpOdW0oKSk7Ci0JCQkJcFBhZ2VEaWMtPlNldEF0UmVmZXJlbmNlKCJDb250ZW50cyIsIHBEb2MsIHBEb2MtPkFkZEluZGlyZWN0T2JqZWN0KHBDb250ZW50QXJyYXkpKTsKLQkJCX0KLQkJfQotCX0KK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9EZXN0cm95Q2xpcFBhdGgoRlBERl9DTElQUEFUSCBjbGlwUGF0aCkgeworICBkZWxldGUgKENQREZfQ2xpcFBhdGgqKWNsaXBQYXRoOwogfQogCit2b2lkIE91dHB1dFBhdGgoQ0ZYX0J5dGVUZXh0QnVmJiBidWYsIENQREZfUGF0aCBwYXRoKSB7CisgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhID0gcGF0aDsKKyAgaWYgKCFwUGF0aERhdGEpCisgICAgcmV0dXJuOworCisgIEZYX1BBVEhQT0lOVCogcFBvaW50cyA9IHBQYXRoRGF0YS0+R2V0UG9pbnRzKCk7CisKKyAgaWYgKHBhdGguSXNSZWN0KCkpIHsKKyAgICBidWYgPDwgKHBQb2ludHNbMF0ubV9Qb2ludFgpIDw8ICIgIiA8PCAocFBvaW50c1swXS5tX1BvaW50WSkgPDwgIiAiCisgICAgICAgIDw8IChwUG9pbnRzWzJdLm1fUG9pbnRYIC0gcFBvaW50c1swXS5tX1BvaW50WCkgPDwgIiAiCisgICAgICAgIDw8IChwUG9pbnRzWzJdLm1fUG9pbnRZIC0gcFBvaW50c1swXS5tX1BvaW50WSkgPDwgIiByZVxuIjsKKyAgICByZXR1cm47CisgIH0KKworICBDRlhfQnl0ZVN0cmluZyB0ZW1wOworICBmb3IgKGludCBpID0gMDsgaSA8IHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpOyBpKyspIHsKKyAgICBidWYgPDwgKHBQb2ludHNbaV0ubV9Qb2ludFgpIDw8ICIgIiA8PCAocFBvaW50c1tpXS5tX1BvaW50WSk7CisgICAgaW50IHBvaW50X3R5cGUgPSBwUG9pbnRzW2ldLm1fRmxhZyAmIEZYUFRfVFlQRTsKKyAgICBpZiAocG9pbnRfdHlwZSA9PSBGWFBUX01PVkVUTykKKyAgICAgIGJ1ZiA8PCAiIG1cbiI7CisgICAgZWxzZSBpZiAocG9pbnRfdHlwZSA9PSBGWFBUX0JFWklFUlRPKSB7CisgICAgICBidWYgPDwgIiAiIDw8IChwUG9pbnRzW2kgKyAxXS5tX1BvaW50WCkgPDwgIiAiCisgICAgICAgICAgPDwgKHBQb2ludHNbaSArIDFdLm1fUG9pbnRZKSA8PCAiICIgPDwgKHBQb2ludHNbaSArIDJdLm1fUG9pbnRYKQorICAgICAgICAgIDw8ICIgIiA8PCAocFBvaW50c1tpICsgMl0ubV9Qb2ludFkpOworICAgICAgaWYgKHBQb2ludHNbaSArIDJdLm1fRmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpCisgICAgICAgIGJ1ZiA8PCAiIGMgaFxuIjsKKyAgICAgIGVsc2UKKyAgICAgICAgYnVmIDw8ICIgY1xuIjsKKyAgICAgIGkgKz0gMjsKKyAgICB9IGVsc2UgaWYgKHBvaW50X3R5cGUgPT0gRlhQVF9MSU5FVE8pIHsKKyAgICAgIGlmIChwUG9pbnRzW2ldLm1fRmxhZyAmIEZYUFRfQ0xPU0VGSUdVUkUpCisgICAgICAgIGJ1ZiA8PCAiIGwgaFxuIjsKKyAgICAgIGVsc2UKKyAgICAgICAgYnVmIDw8ICIgbFxuIjsKKyAgICB9CisgIH0KK30KKworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9JbnNlcnRDbGlwUGF0aChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9DTElQUEFUSCBjbGlwUGF0aCkgeworICBDUERGX1BhZ2UqIHBQYWdlID0gQ1BERlBhZ2VGcm9tRlBERlBhZ2UocGFnZSk7CisgIGlmICghcFBhZ2UpCisgICAgcmV0dXJuOworCisgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWMgPSBwUGFnZS0+bV9wRm9ybURpY3Q7CisgIENQREZfT2JqZWN0KiBwQ29udGVudE9iaiA9CisgICAgICBwUGFnZURpYyA/IHBQYWdlRGljLT5HZXRFbGVtZW50KCJDb250ZW50cyIpIDogbnVsbHB0cjsKKyAgaWYgKCFwQ29udGVudE9iaikKKyAgICBwQ29udGVudE9iaiA9IHBQYWdlRGljID8gcFBhZ2VEaWMtPkdldEFycmF5KCJDb250ZW50cyIpIDogbnVsbHB0cjsKKyAgaWYgKCFwQ29udGVudE9iaikKKyAgICByZXR1cm47CisKKyAgQ0ZYX0J5dGVUZXh0QnVmIHN0ckNsaXA7CisgIENQREZfQ2xpcFBhdGgqIHBDbGlwUGF0aCA9IChDUERGX0NsaXBQYXRoKiljbGlwUGF0aDsKKyAgRlhfRFdPUkQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHBDbGlwUGF0aC0+R2V0UGF0aENvdW50KCk7IGkrKykgeworICAgIENQREZfUGF0aCBwYXRoID0gcENsaXBQYXRoLT5HZXRQYXRoKGkpOworICAgIGludCBpQ2xpcFR5cGUgPSBwQ2xpcFBhdGgtPkdldENsaXBUeXBlKGkpOworICAgIGlmIChwYXRoLkdldFBvaW50Q291bnQoKSA9PSAwKSB7CisgICAgICAvLyBFbXB0eSBjbGlwcGluZyAodG90YWxseSBjbGlwcGVkIG91dCkKKyAgICAgIHN0ckNsaXAgPDwgIjAgMCBtIFcgbiAiOworICAgIH0gZWxzZSB7CisgICAgICBPdXRwdXRQYXRoKHN0ckNsaXAsIHBhdGgpOworICAgICAgaWYgKGlDbGlwVHlwZSA9PSBGWEZJTExfV0lORElORykKKyAgICAgICAgc3RyQ2xpcCA8PCAiVyBuXG4iOworICAgICAgZWxzZQorICAgICAgICBzdHJDbGlwIDw8ICJXKiBuXG4iOworICAgIH0KKyAgfQorICBDUERGX0RpY3Rpb25hcnkqIHBEaWMgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbShudWxscHRyLCAwLCBwRGljKTsKKyAgcFN0cmVhbS0+U2V0RGF0YShzdHJDbGlwLkdldEJ1ZmZlcigpLCBzdHJDbGlwLkdldFNpemUoKSwgRkFMU0UsIEZBTFNFKTsKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9IHBQYWdlLT5tX3BEb2N1bWVudDsKKyAgaWYgKCFwRG9jKQorICAgIHJldHVybjsKKyAgcERvYy0+QWRkSW5kaXJlY3RPYmplY3QocFN0cmVhbSk7CisKKyAgQ1BERl9BcnJheSogcENvbnRlbnRBcnJheSA9IG51bGxwdHI7CisgIGlmIChDUERGX0FycmF5KiBwQXJyYXkgPSBUb0FycmF5KHBDb250ZW50T2JqKSkgeworICAgIHBDb250ZW50QXJyYXkgPSBwQXJyYXk7CisgICAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSBuZXcgQ1BERl9SZWZlcmVuY2UocERvYywgcFN0cmVhbS0+R2V0T2JqTnVtKCkpOworICAgIHBDb250ZW50QXJyYXktPkluc2VydEF0KDAsIHBSZWYpOworICB9IGVsc2UgaWYgKENQREZfUmVmZXJlbmNlKiBwUmVmZXJlbmNlID0gVG9SZWZlcmVuY2UocENvbnRlbnRPYmopKSB7CisgICAgQ1BERl9PYmplY3QqIHBEaXJlY3RPYmogPSBwUmVmZXJlbmNlLT5HZXREaXJlY3QoKTsKKyAgICBpZiAocERpcmVjdE9iaikgeworICAgICAgaWYgKENQREZfQXJyYXkqIHBBcnJheSA9IHBEaXJlY3RPYmotPkFzQXJyYXkoKSkgeworICAgICAgICBwQ29udGVudEFycmF5ID0gcEFycmF5OworICAgICAgICBDUERGX1JlZmVyZW5jZSogcFJlZiA9IG5ldyBDUERGX1JlZmVyZW5jZShwRG9jLCBwU3RyZWFtLT5HZXRPYmpOdW0oKSk7CisgICAgICAgIHBDb250ZW50QXJyYXktPkluc2VydEF0KDAsIHBSZWYpOworICAgICAgfSBlbHNlIGlmIChwRGlyZWN0T2JqLT5Jc1N0cmVhbSgpKSB7CisgICAgICAgIHBDb250ZW50QXJyYXkgPSBuZXcgQ1BERl9BcnJheSgpOworICAgICAgICBwQ29udGVudEFycmF5LT5BZGRSZWZlcmVuY2UocERvYywgcFN0cmVhbS0+R2V0T2JqTnVtKCkpOworICAgICAgICBwQ29udGVudEFycmF5LT5BZGRSZWZlcmVuY2UocERvYywgcERpcmVjdE9iai0+R2V0T2JqTnVtKCkpOworICAgICAgICBwUGFnZURpYy0+U2V0QXRSZWZlcmVuY2UoIkNvbnRlbnRzIiwgcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEb2MtPkFkZEluZGlyZWN0T2JqZWN0KHBDb250ZW50QXJyYXkpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZkb2MuY3BwIGIvZnBkZnNkay9zcmMvZnBkZmRvYy5jcHAKaW5kZXggYjg5Y2UyNi4uNGJkMzdhNyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZmRvYy5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZmRvYy5jcHAKQEAgLTEsMjk2ICsxLDM1NSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX2RlZmluZS5oIgotI2luY2x1ZGUgIi4uLy4uL3B1YmxpYy9mcGRmX2RvYy5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2RvYy5oIgogCi1zdGF0aWMgaW50IFRISVNNT0RVTEUgPSAwOworI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mc2RrX2RlZmluZS5oIgogCi1zdGF0aWMgQ1BERl9Cb29rbWFyayBGaW5kQm9va21hcmsoY29uc3QgQ1BERl9Cb29rbWFya1RyZWUmIHRyZWUsIENQREZfQm9va21hcmsgYm9va21hcmssIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB0aXRsZSkKLXsKLQlpZiAoYm9va21hcmsgJiYgYm9va21hcmsuR2V0VGl0bGUoKS5Db21wYXJlTm9DYXNlKHRpdGxlLmNfc3RyKCkpID09IDApIHsKLQkJLy8gRmlyc3QgY2hlY2sgdGhpcyBpdGVtCi0JCXJldHVybiBib29rbWFyazsKLQl9Ci0JLy8gZ28gaW50byBjaGlsZHJlbiBpdGVtcwotCUNQREZfQm9va21hcmsgY2hpbGQgPSB0cmVlLkdldEZpcnN0Q2hpbGQoYm9va21hcmspOwotCXdoaWxlIChjaGlsZCkgewotCQkvLyBjaGVjayBpZiB0aGlzIGl0ZW0KLQkJQ1BERl9Cb29rbWFyayBmb3VuZCA9IEZpbmRCb29rbWFyayh0cmVlLCBjaGlsZCwgdGl0bGUpOwotCQlpZiAoZm91bmQpCi0JCQlyZXR1cm4gZm91bmQ7Ci0JCWNoaWxkID0gdHJlZS5HZXROZXh0U2libGluZyhjaGlsZCk7Ci0JfQotCXJldHVybiBDUERGX0Jvb2ttYXJrKCk7CituYW1lc3BhY2UgeworCitpbnQgVEhJU01PRFVMRSA9IDA7CisKK0NQREZfQm9va21hcmsgRmluZEJvb2ttYXJrKGNvbnN0IENQREZfQm9va21hcmtUcmVlJiB0cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Cb29rbWFyayBib29rbWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB0aXRsZSkgeworICBpZiAoYm9va21hcmsgJiYgYm9va21hcmsuR2V0VGl0bGUoKS5Db21wYXJlTm9DYXNlKHRpdGxlLmNfc3RyKCkpID09IDApIHsKKyAgICAvLyBGaXJzdCBjaGVjayB0aGlzIGl0ZW0KKyAgICByZXR1cm4gYm9va21hcms7CisgIH0KKyAgLy8gZ28gaW50byBjaGlsZHJlbiBpdGVtcworICBDUERGX0Jvb2ttYXJrIGNoaWxkID0gdHJlZS5HZXRGaXJzdENoaWxkKGJvb2ttYXJrKTsKKyAgd2hpbGUgKGNoaWxkKSB7CisgICAgLy8gY2hlY2sgaWYgdGhpcyBpdGVtCisgICAgQ1BERl9Cb29rbWFyayBmb3VuZCA9IEZpbmRCb29rbWFyayh0cmVlLCBjaGlsZCwgdGl0bGUpOworICAgIGlmIChmb3VuZCkKKyAgICAgIHJldHVybiBmb3VuZDsKKyAgICBjaGlsZCA9IHRyZWUuR2V0TmV4dFNpYmxpbmcoY2hpbGQpOworICB9CisgIHJldHVybiBDUERGX0Jvb2ttYXJrKCk7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0tNQVJLIFNURENBTEwgRlBERkJvb2ttYXJrX0dldEZpcnN0Q2hpbGQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9CT09LTUFSSyBwRGljdCkKLXsKLSAgICBpZiAoIWRvY3VtZW50KQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBDUERGX0RvY3VtZW50KiBwRG9jID0gKENQREZfRG9jdW1lbnQqKWRvY3VtZW50OwotICAgIENQREZfQm9va21hcmtUcmVlIHRyZWUocERvYyk7Ci0gICAgQ1BERl9Cb29rbWFyayBib29rbWFyayA9IENQREZfQm9va21hcmsoKENQREZfRGljdGlvbmFyeSopcERpY3QpOwotICAgIHJldHVybiB0cmVlLkdldEZpcnN0Q2hpbGQoYm9va21hcmspLkdldERpY3QoKTsKK3ZvaWQgUmVsZWFzZUxpbmtMaXN0KHZvaWQqIGRhdGEpIHsKKyAgZGVsZXRlIChDUERGX0xpbmtMaXN0KilkYXRhOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09LTUFSSyBTVERDQUxMIEZQREZCb29rbWFya19HZXROZXh0U2libGluZyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0JPT0tNQVJLIHBEaWN0KQotewotICAgIGlmICghZG9jdW1lbnQgfHwgIXBEaWN0KQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBDUERGX0RvY3VtZW50KiBwRG9jID0gKENQREZfRG9jdW1lbnQqKWRvY3VtZW50OwotICAgIENQREZfQm9va21hcmtUcmVlIHRyZWUocERvYyk7Ci0gICAgQ1BERl9Cb29rbWFyayBib29rbWFyayA9IENQREZfQm9va21hcmsoKENQREZfRGljdGlvbmFyeSopcERpY3QpOwotICAgIHJldHVybiB0cmVlLkdldE5leHRTaWJsaW5nKGJvb2ttYXJrKS5HZXREaWN0KCk7CitDUERGX0xpbmtMaXN0KiBHZXRMaW5rTGlzdChDUERGX1BhZ2UqIHBhZ2UpIHsKKyAgaWYgKCFwYWdlKQorICAgIHJldHVybiBudWxscHRyOworCisgIC8vIExpbmsgbGlzdCBpcyBzdG9yZWQgd2l0aCB0aGUgZG9jdW1lbnQKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9IHBhZ2UtPm1fcERvY3VtZW50OworICBDUERGX0xpbmtMaXN0KiBwTGlua0xpc3QgPSAoQ1BERl9MaW5rTGlzdCopcERvYy0+R2V0UHJpdmF0ZURhdGEoJlRISVNNT0RVTEUpOworICBpZiAoIXBMaW5rTGlzdCkgeworICAgIHBMaW5rTGlzdCA9IG5ldyBDUERGX0xpbmtMaXN0OworICAgIHBEb2MtPlNldFByaXZhdGVEYXRhKCZUSElTTU9EVUxFLCBwTGlua0xpc3QsIFJlbGVhc2VMaW5rTGlzdCk7CisgIH0KKyAgcmV0dXJuIHBMaW5rTGlzdDsKIH0KIAotRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGQm9va21hcmtfR2V0VGl0bGUoRlBERl9CT09LTUFSSyBwRGljdCwgdm9pZCogYnVmZmVyLCB1bnNpZ25lZCBsb25nIGJ1ZmxlbikKLXsKK30gIC8vIG5hbWVzcGFjZQorCitETExFWFBPUlQgRlBERl9CT09LTUFSSyBTVERDQUxMCitGUERGQm9va21hcmtfR2V0Rmlyc3RDaGlsZChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0JPT0tNQVJLIHBEaWN0KSB7CisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBDUERGRG9jdW1lbnRGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KTsKKyAgaWYgKCFwRG9jKQorICAgIHJldHVybiBudWxscHRyOworICBDUERGX0Jvb2ttYXJrVHJlZSB0cmVlKHBEb2MpOworICBDUERGX0Jvb2ttYXJrIGJvb2ttYXJrID0KKyAgICAgIENQREZfQm9va21hcmsoVG9EaWN0aW9uYXJ5KHN0YXRpY19jYXN0PENQREZfT2JqZWN0Kj4ocERpY3QpKSk7CisgIHJldHVybiB0cmVlLkdldEZpcnN0Q2hpbGQoYm9va21hcmspLkdldERpY3QoKTsKK30KKworRExMRVhQT1JUIEZQREZfQk9PS01BUksgU1REQ0FMTAorRlBERkJvb2ttYXJrX0dldE5leHRTaWJsaW5nKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfQk9PS01BUksgcERpY3QpIHsKKyAgaWYgKCFwRGljdCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZG9jdW1lbnQpOworICBpZiAoIXBEb2MpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIENQREZfQm9va21hcmtUcmVlIHRyZWUocERvYyk7CisgIENQREZfQm9va21hcmsgYm9va21hcmsgPQorICAgICAgQ1BERl9Cb29rbWFyayhUb0RpY3Rpb25hcnkoc3RhdGljX2Nhc3Q8Q1BERl9PYmplY3QqPihwRGljdCkpKTsKKyAgcmV0dXJuIHRyZWUuR2V0TmV4dFNpYmxpbmcoYm9va21hcmspLkdldERpY3QoKTsKK30KKworRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGQm9va21hcmtfR2V0VGl0bGUoRlBERl9CT09LTUFSSyBwRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmbGVuKSB7CisgIGlmICghcERpY3QpCisgICAgcmV0dXJuIDA7CisgIENQREZfQm9va21hcmsgYm9va21hcmsoVG9EaWN0aW9uYXJ5KHN0YXRpY19jYXN0PENQREZfT2JqZWN0Kj4ocERpY3QpKSk7CisgIENGWF9XaWRlU3RyaW5nIHRpdGxlID0gYm9va21hcmsuR2V0VGl0bGUoKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RlZFRpdGxlID0gdGl0bGUuVVRGMTZMRV9FbmNvZGUoKTsKKyAgdW5zaWduZWQgbG9uZyBsZW4gPSBlbmNvZGVkVGl0bGUuR2V0TGVuZ3RoKCk7CisgIGlmIChidWZmZXIgJiYgYnVmbGVuID49IGxlbikgeworICAgIEZYU1lTX21lbWNweShidWZmZXIsIGVuY29kZWRUaXRsZS5jX3N0cigpLCBsZW4pOworICB9CisgIHJldHVybiBsZW47Cit9CisKK0RMTEVYUE9SVCBGUERGX0JPT0tNQVJLIFNURENBTEwgRlBERkJvb2ttYXJrX0ZpbmQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHRpdGxlKSB7CisgIGlmICghdGl0bGUgfHwgdGl0bGVbMF0gPT0gMCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZG9jdW1lbnQpOworICBpZiAoIXBEb2MpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIENQREZfQm9va21hcmtUcmVlIHRyZWUocERvYyk7CisgIEZYX1NUUlNJWkUgbGVuID0gQ0ZYX1dpZGVTdHJpbmc6OldTdHJpbmdMZW5ndGgodGl0bGUpOworICBDRlhfV2lkZVN0cmluZyBlbmNvZGVkVGl0bGUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUodGl0bGUsIGxlbik7CisgIHJldHVybiBGaW5kQm9va21hcmsodHJlZSwgQ1BERl9Cb29rbWFyaygpLCBlbmNvZGVkVGl0bGUpLkdldERpY3QoKTsKK30KKworRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZCb29rbWFya19HZXREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09LTUFSSyBwRGljdCkgeworICBpZiAoIXBEaWN0KQorICAgIHJldHVybiBudWxscHRyOworICBDUERGX0RvY3VtZW50KiBwRG9jID0gQ1BERkRvY3VtZW50RnJvbUZQREZEb2N1bWVudChkb2N1bWVudCk7CisgIGlmICghcERvYykKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgQ1BERl9Cb29rbWFyayBib29rbWFyayhUb0RpY3Rpb25hcnkoc3RhdGljX2Nhc3Q8Q1BERl9PYmplY3QqPihwRGljdCkpKTsKKyAgQ1BERl9EZXN0IGRlc3QgPSBib29rbWFyay5HZXREZXN0KHBEb2MpOworICBpZiAoZGVzdCkKKyAgICByZXR1cm4gZGVzdC5HZXRPYmplY3QoKTsKKyAgLy8gSWYgdGhpcyBib29rbWFyayBpcyBub3QgZGlyZWN0bHkgYXNzb2NpYXRlZCB3aXRoIGEgZGVzdCwgd2UgdHJ5IHRvIGdldAorICAvLyBhY3Rpb24KKyAgQ1BERl9BY3Rpb24gYWN0aW9uID0gYm9va21hcmsuR2V0QWN0aW9uKCk7CisgIGlmICghYWN0aW9uKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gYWN0aW9uLkdldERlc3QocERvYykuR2V0T2JqZWN0KCk7Cit9CisKK0RMTEVYUE9SVCBGUERGX0FDVElPTiBTVERDQUxMIEZQREZCb29rbWFya19HZXRBY3Rpb24oRlBERl9CT09LTUFSSyBwRGljdCkgeworICBpZiAoIXBEaWN0KQorICAgIHJldHVybiBOVUxMOworICBDUERGX0Jvb2ttYXJrIGJvb2ttYXJrKFRvRGljdGlvbmFyeShzdGF0aWNfY2FzdDxDUERGX09iamVjdCo+KHBEaWN0KSkpOworICByZXR1cm4gYm9va21hcmsuR2V0QWN0aW9uKCkuR2V0RGljdCgpOworfQorCitETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZBY3Rpb25fR2V0VHlwZShGUERGX0FDVElPTiBwRGljdCkgeworICBpZiAoIXBEaWN0KQorICAgIHJldHVybiBQREZBQ1RJT05fVU5TVVBQT1JURUQ7CisKKyAgQ1BERl9BY3Rpb24gYWN0aW9uKFRvRGljdGlvbmFyeShzdGF0aWNfY2FzdDxDUERGX09iamVjdCo+KHBEaWN0KSkpOworICBDUERGX0FjdGlvbjo6QWN0aW9uVHlwZSB0eXBlID0gYWN0aW9uLkdldFR5cGUoKTsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBDUERGX0FjdGlvbjo6R29UbzoKKyAgICAgIHJldHVybiBQREZBQ1RJT05fR09UTzsKKyAgICBjYXNlIENQREZfQWN0aW9uOjpHb1RvUjoKKyAgICAgIHJldHVybiBQREZBQ1RJT05fUkVNT1RFR09UTzsKKyAgICBjYXNlIENQREZfQWN0aW9uOjpVUkk6CisgICAgICByZXR1cm4gUERGQUNUSU9OX1VSSTsKKyAgICBjYXNlIENQREZfQWN0aW9uOjpMYXVuY2g6CisgICAgICByZXR1cm4gUERGQUNUSU9OX0xBVU5DSDsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIFBERkFDVElPTl9VTlNVUFBPUlRFRDsKKyAgfQorfQorCitETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERkFjdGlvbl9HZXREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQUNUSU9OIHBEaWN0KSB7CisgIGlmICghcERpY3QpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBDUERGRG9jdW1lbnRGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KTsKKyAgaWYgKCFwRG9jKQorICAgIHJldHVybiBudWxscHRyOworICBDUERGX0FjdGlvbiBhY3Rpb24oVG9EaWN0aW9uYXJ5KHN0YXRpY19jYXN0PENQREZfT2JqZWN0Kj4ocERpY3QpKSk7CisgIHJldHVybiBhY3Rpb24uR2V0RGVzdChwRG9jKS5HZXRPYmplY3QoKTsKK30KKworRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTAorRlBERkFjdGlvbl9HZXRGaWxlUGF0aChGUERGX0FDVElPTiBwRGljdCwgdm9pZCogYnVmZmVyLCB1bnNpZ25lZCBsb25nIGJ1ZmxlbikgeworICB1bnNpZ25lZCBsb25nIHR5cGUgPSBGUERGQWN0aW9uX0dldFR5cGUocERpY3QpOworICBpZiAodHlwZSAhPSBQREZBQ1RJT05fUkVNT1RFR09UTyAmJiB0eXBlICE9IFBERkFDVElPTl9MQVVOQ0gpCisgICAgcmV0dXJuIDA7CisKKyAgQ1BERl9BY3Rpb24gYWN0aW9uKFRvRGljdGlvbmFyeShzdGF0aWNfY2FzdDxDUERGX09iamVjdCo+KHBEaWN0KSkpOworICBDRlhfQnl0ZVN0cmluZyBwYXRoID0gYWN0aW9uLkdldEZpbGVQYXRoKCkuVVRGOEVuY29kZSgpOworICB1bnNpZ25lZCBsb25nIGxlbiA9IHBhdGguR2V0TGVuZ3RoKCkgKyAxOworICBpZiAoYnVmZmVyICYmIGJ1ZmxlbiA+PSBsZW4pCisgICAgRlhTWVNfbWVtY3B5KGJ1ZmZlciwgcGF0aC5jX3N0cigpLCBsZW4pOworICByZXR1cm4gbGVuOworfQorCitETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZBY3Rpb25fR2V0VVJJUGF0aChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9BQ1RJT04gcERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1ZmxlbikgeworICBpZiAoIXBEaWN0KQorICAgIHJldHVybiAwOworICBDUERGX0RvY3VtZW50KiBwRG9jID0gQ1BERkRvY3VtZW50RnJvbUZQREZEb2N1bWVudChkb2N1bWVudCk7CisgIGlmICghcERvYykKKyAgICByZXR1cm4gMDsKKyAgQ1BERl9BY3Rpb24gYWN0aW9uKFRvRGljdGlvbmFyeShzdGF0aWNfY2FzdDxDUERGX09iamVjdCo+KHBEaWN0KSkpOworICBDRlhfQnl0ZVN0cmluZyBwYXRoID0gYWN0aW9uLkdldFVSSShwRG9jKTsKKyAgdW5zaWduZWQgbG9uZyBsZW4gPSBwYXRoLkdldExlbmd0aCgpICsgMTsKKyAgaWYgKGJ1ZmZlciAmJiBidWZsZW4gPj0gbGVuKQorICAgIEZYU1lTX21lbWNweShidWZmZXIsIHBhdGguY19zdHIoKSwgbGVuKTsKKyAgcmV0dXJuIGxlbjsKK30KKworRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGRGVzdF9HZXRQYWdlSW5kZXgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfREVTVCBwRGljdCkgeworICBpZiAoIXBEaWN0KQorICAgIHJldHVybiAwOworICBDUERGX0RvY3VtZW50KiBwRG9jID0gQ1BERkRvY3VtZW50RnJvbUZQREZEb2N1bWVudChkb2N1bWVudCk7CisgIGlmICghcERvYykKKyAgICByZXR1cm4gMDsKKyAgQ1BERl9EZXN0IGRlc3Qoc3RhdGljX2Nhc3Q8Q1BERl9BcnJheSo+KHBEaWN0KSk7CisgIHJldHVybiBkZXN0LkdldFBhZ2VJbmRleChwRG9jKTsKK30KKworRExMRVhQT1JUIEZQREZfTElOSyBTVERDQUxMCitGUERGTGlua19HZXRMaW5rQXRQb2ludChGUERGX1BBR0UgcGFnZSwgZG91YmxlIHgsIGRvdWJsZSB5KSB7CisgIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlKTsKKyAgaWYgKCFwUGFnZSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBDUERGX0xpbmtMaXN0KiBwTGlua0xpc3QgPSBHZXRMaW5rTGlzdChwUGFnZSk7CisgIGlmICghcExpbmtMaXN0KQorICAgIHJldHVybiBudWxscHRyOworCisgIHJldHVybiBwTGlua0xpc3QtPkdldExpbmtBdFBvaW50KHBQYWdlLCAoRlhfRkxPQVQpeCwgKEZYX0ZMT0FUKXksIG51bGxwdHIpCisgICAgICAuR2V0RGljdCgpOworfQorCitETExFWFBPUlQgaW50IFNURENBTEwKK0ZQREZMaW5rX0dldExpbmtaT3JkZXJBdFBvaW50KEZQREZfUEFHRSBwYWdlLCBkb3VibGUgeCwgZG91YmxlIHkpIHsKKyAgQ1BERl9QYWdlKiBwUGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2UpOworICBpZiAoIXBQYWdlKQorICAgIHJldHVybiAtMTsKKworICBDUERGX0xpbmtMaXN0KiBwTGlua0xpc3QgPSBHZXRMaW5rTGlzdChwUGFnZSk7CisgIGlmICghcExpbmtMaXN0KQorICAgIHJldHVybiAtMTsKKworICBpbnQgel9vcmRlciA9IC0xOworICBwTGlua0xpc3QtPkdldExpbmtBdFBvaW50KHBQYWdlLCAoRlhfRkxPQVQpeCwgKEZYX0ZMT0FUKXksICZ6X29yZGVyKTsKKyAgcmV0dXJuIHpfb3JkZXI7Cit9CisKK0RMTEVYUE9SVCBGUERGX0RFU1QgU1REQ0FMTCBGUERGTGlua19HZXREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0xJTksgcERpY3QpIHsKKyAgaWYgKCFwRGljdCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZG9jdW1lbnQpOworICBpZiAoIXBEb2MpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIENQREZfTGluayBsaW5rKFRvRGljdGlvbmFyeShzdGF0aWNfY2FzdDxDUERGX09iamVjdCo+KHBEaWN0KSkpOworICBGUERGX0RFU1QgZGVzdCA9IGxpbmsuR2V0RGVzdChwRG9jKS5HZXRPYmplY3QoKTsKKyAgaWYgKGRlc3QpCisgICAgcmV0dXJuIGRlc3Q7CisgIC8vIElmIHRoaXMgbGluayBpcyBub3QgZGlyZWN0bHkgYXNzb2NpYXRlZCB3aXRoIGEgZGVzdCwgd2UgdHJ5IHRvIGdldCBhY3Rpb24KKyAgQ1BERl9BY3Rpb24gYWN0aW9uID0gbGluay5HZXRBY3Rpb24oKTsKKyAgaWYgKCFhY3Rpb24pCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiBhY3Rpb24uR2V0RGVzdChwRG9jKS5HZXRPYmplY3QoKTsKK30KKworRExMRVhQT1JUIEZQREZfQUNUSU9OIFNURENBTEwgRlBERkxpbmtfR2V0QWN0aW9uKEZQREZfTElOSyBwRGljdCkgeworICBpZiAoIXBEaWN0KQorICAgIHJldHVybiBudWxscHRyOworCisgIENQREZfTGluayBsaW5rKFRvRGljdGlvbmFyeShzdGF0aWNfY2FzdDxDUERGX09iamVjdCo+KHBEaWN0KSkpOworICByZXR1cm4gbGluay5HZXRBY3Rpb24oKS5HZXREaWN0KCk7Cit9CisKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGTGlua19FbnVtZXJhdGUoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc3RhcnRQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfTElOSyogbGlua0Fubm90KSB7CisgIGlmICghc3RhcnRQb3MgfHwgIWxpbmtBbm5vdCkKKyAgICByZXR1cm4gRkFMU0U7CisgIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlKTsKKyAgaWYgKCFwUGFnZSB8fCAhcFBhZ2UtPm1fcEZvcm1EaWN0KQorICAgIHJldHVybiBGQUxTRTsKKyAgQ1BERl9BcnJheSogcEFubm90cyA9IHBQYWdlLT5tX3BGb3JtRGljdC0+R2V0QXJyYXkoIkFubm90cyIpOworICBpZiAoIXBBbm5vdHMpCisgICAgcmV0dXJuIEZBTFNFOworICBmb3IgKGludCBpID0gKnN0YXJ0UG9zOyBpIDwgKGludClwQW5ub3RzLT5HZXRDb3VudCgpOyBpKyspIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0KKyAgICAgICAgVG9EaWN0aW9uYXJ5KHN0YXRpY19jYXN0PENQREZfT2JqZWN0Kj4ocEFubm90cy0+R2V0RWxlbWVudFZhbHVlKGkpKSk7CiAgICAgaWYgKCFwRGljdCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgQ1BERl9Cb29rbWFyayBib29rbWFyaygoQ1BERl9EaWN0aW9uYXJ5KilwRGljdCk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgdGl0bGUgPSBib29rbWFyay5HZXRUaXRsZSgpOwotICAgIENGWF9CeXRlU3RyaW5nIGVuY29kZWRUaXRsZSA9IHRpdGxlLlVURjE2TEVfRW5jb2RlKCk7Ci0gICAgdW5zaWduZWQgbG9uZyBsZW4gPSBlbmNvZGVkVGl0bGUuR2V0TGVuZ3RoKCk7Ci0gICAgaWYgKGJ1ZmZlciAmJiBidWZsZW4gPj0gbGVuKSB7Ci0gICAgICAgIEZYU1lTX21lbWNweShidWZmZXIsIGVuY29kZWRUaXRsZS5jX3N0cigpLCBsZW4pOworICAgICAgY29udGludWU7CisgICAgaWYgKHBEaWN0LT5HZXRTdHJpbmcoIlN1YnR5cGUiKS5FcXVhbCgiTGluayIpKSB7CisgICAgICAqc3RhcnRQb3MgPSBpICsgMTsKKyAgICAgICpsaW5rQW5ub3QgPSAoRlBERl9MSU5LKXBEaWN0OworICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiBsZW47CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09LTUFSSyBTVERDQUxMIEZQREZCb29rbWFya19GaW5kKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfV0lERVNUUklORyB0aXRsZSkKLXsKLQlpZiAoIWRvY3VtZW50KQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIXRpdGxlIHx8IHRpdGxlWzBdID09IDApCi0JCXJldHVybiBOVUxMOwotCUNQREZfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERl9Eb2N1bWVudCopZG9jdW1lbnQ7Ci0JQ1BERl9Cb29rbWFya1RyZWUgdHJlZShwRG9jKTsKLQlGWF9TVFJTSVpFIGxlbiA9IENGWF9XaWRlU3RyaW5nOjpXU3RyaW5nTGVuZ3RoKHRpdGxlKTsKLQlDRlhfV2lkZVN0cmluZyBlbmNvZGVkVGl0bGUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUodGl0bGUsIGxlbik7Ci0JcmV0dXJuIEZpbmRCb29rbWFyayh0cmVlLCBDUERGX0Jvb2ttYXJrKCksIGVuY29kZWRUaXRsZSkuR2V0RGljdCgpOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZMaW5rX0dldEFubm90UmVjdChGUERGX0xJTksgbGlua0Fubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19SRUNURiogcmVjdCkgeworICBpZiAoIWxpbmtBbm5vdCB8fCAhcmVjdCkKKyAgICByZXR1cm4gRkFMU0U7CisgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCA9CisgICAgICBUb0RpY3Rpb25hcnkoc3RhdGljX2Nhc3Q8Q1BERl9PYmplY3QqPihsaW5rQW5ub3QpKTsKKyAgQ1BERl9SZWN0IHJ0ID0gcEFubm90RGljdC0+R2V0UmVjdCgiUmVjdCIpOworICByZWN0LT5sZWZ0ID0gcnQubGVmdDsKKyAgcmVjdC0+Ym90dG9tID0gcnQuYm90dG9tOworICByZWN0LT5yaWdodCA9IHJ0LnJpZ2h0OworICByZWN0LT50b3AgPSBydC50b3A7CisgIHJldHVybiBUUlVFOwogfQogCi1ETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERkJvb2ttYXJrX0dldERlc3QoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9CT09LTUFSSyBwRGljdCkKLXsKLQlpZiAoIWRvY3VtZW50KQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIXBEaWN0KQotCQlyZXR1cm4gTlVMTDsKLQlDUERGX0Jvb2ttYXJrIGJvb2ttYXJrKChDUERGX0RpY3Rpb25hcnkqKXBEaWN0KTsKLQlDUERGX0RvY3VtZW50KiBwRG9jID0gKENQREZfRG9jdW1lbnQqKWRvY3VtZW50OwotCUNQREZfRGVzdCBkZXN0ID0gYm9va21hcmsuR2V0RGVzdChwRG9jKTsKLQlpZiAoZGVzdCkKLQkJcmV0dXJuIGRlc3QuR2V0T2JqZWN0KCk7Ci0JLy8gSWYgdGhpcyBib29rbWFyayBpcyBub3QgZGlyZWN0bHkgYXNzb2NpYXRlZCB3aXRoIGEgZGVzdCwgd2UgdHJ5IHRvIGdldCBhY3Rpb24KLQlDUERGX0FjdGlvbiBhY3Rpb24gPSBib29rbWFyay5HZXRBY3Rpb24oKTsKLQlpZiAoIWFjdGlvbikKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGFjdGlvbi5HZXREZXN0KHBEb2MpLkdldE9iamVjdCgpOworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZMaW5rX0NvdW50UXVhZFBvaW50cyhGUERGX0xJTksgbGlua0Fubm90KSB7CisgIGlmICghbGlua0Fubm90KQorICAgIHJldHVybiAwOworICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QgPQorICAgICAgVG9EaWN0aW9uYXJ5KHN0YXRpY19jYXN0PENQREZfT2JqZWN0Kj4obGlua0Fubm90KSk7CisgIENQREZfQXJyYXkqIHBBcnJheSA9IHBBbm5vdERpY3QtPkdldEFycmF5KCJRdWFkUG9pbnRzIik7CisgIGlmICghcEFycmF5KQorICAgIHJldHVybiAwOworICByZXR1cm4gcEFycmF5LT5HZXRDb3VudCgpIC8gODsKIH0KIAotRExMRVhQT1JUIEZQREZfQUNUSU9OIFNURENBTEwgRlBERkJvb2ttYXJrX0dldEFjdGlvbihGUERGX0JPT0tNQVJLIHBEaWN0KQotewotCWlmICghcERpY3QpCi0JCXJldHVybiBOVUxMOwotCUNQREZfQm9va21hcmsgYm9va21hcmsoKENQREZfRGljdGlvbmFyeSopcERpY3QpOwotCXJldHVybiBib29rbWFyay5HZXRBY3Rpb24oKS5HZXREaWN0KCk7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkxpbmtfR2V0UXVhZFBvaW50cyhGUERGX0xJTksgbGlua0Fubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1YWRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX1FVQURQT0lOVFNGKiBxdWFkUG9pbnRzKSB7CisgIGlmICghbGlua0Fubm90IHx8ICFxdWFkUG9pbnRzKQorICAgIHJldHVybiBGQUxTRTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0ID0KKyAgICAgIFRvRGljdGlvbmFyeShzdGF0aWNfY2FzdDxDUERGX09iamVjdCo+KGxpbmtBbm5vdCkpOworICBDUERGX0FycmF5KiBwQXJyYXkgPSBwQW5ub3REaWN0LT5HZXRBcnJheSgiUXVhZFBvaW50cyIpOworICBpZiAocEFycmF5KSB7CisgICAgaWYgKHF1YWRJbmRleCA8IDAgfHwgcXVhZEluZGV4ID49IChpbnQpcEFycmF5LT5HZXRDb3VudCgpIC8gOCB8fAorICAgICAgICAoKHF1YWRJbmRleCAqIDggKyA3KSA+PSAoaW50KXBBcnJheS0+R2V0Q291bnQoKSkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgcXVhZFBvaW50cy0+eDEgPSBwQXJyYXktPkdldE51bWJlcihxdWFkSW5kZXggKiA4KTsKKyAgICBxdWFkUG9pbnRzLT55MSA9IHBBcnJheS0+R2V0TnVtYmVyKHF1YWRJbmRleCAqIDggKyAxKTsKKyAgICBxdWFkUG9pbnRzLT54MiA9IHBBcnJheS0+R2V0TnVtYmVyKHF1YWRJbmRleCAqIDggKyAyKTsKKyAgICBxdWFkUG9pbnRzLT55MiA9IHBBcnJheS0+R2V0TnVtYmVyKHF1YWRJbmRleCAqIDggKyAzKTsKKyAgICBxdWFkUG9pbnRzLT54MyA9IHBBcnJheS0+R2V0TnVtYmVyKHF1YWRJbmRleCAqIDggKyA0KTsKKyAgICBxdWFkUG9pbnRzLT55MyA9IHBBcnJheS0+R2V0TnVtYmVyKHF1YWRJbmRleCAqIDggKyA1KTsKKyAgICBxdWFkUG9pbnRzLT54NCA9IHBBcnJheS0+R2V0TnVtYmVyKHF1YWRJbmRleCAqIDggKyA2KTsKKyAgICBxdWFkUG9pbnRzLT55NCA9IHBBcnJheS0+R2V0TnVtYmVyKHF1YWRJbmRleCAqIDggKyA3KTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9CiAKLURMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERkFjdGlvbl9HZXRUeXBlKEZQREZfQUNUSU9OIHBEaWN0KQotewotCWlmICghcERpY3QpCi0JCXJldHVybiAwOwotCUNQREZfQWN0aW9uIGFjdGlvbigoQ1BERl9EaWN0aW9uYXJ5KilwRGljdCk7Ci0JQ1BERl9BY3Rpb246OkFjdGlvblR5cGUgdHlwZSA9IGFjdGlvbi5HZXRUeXBlKCk7Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgQ1BERl9BY3Rpb246OkdvVG86Ci0JCQlyZXR1cm4gUERGQUNUSU9OX0dPVE87Ci0JCWNhc2UgQ1BERl9BY3Rpb246OkdvVG9SOgotCQkJcmV0dXJuIFBERkFDVElPTl9SRU1PVEVHT1RPOwotCQljYXNlIENQREZfQWN0aW9uOjpVUkk6Ci0JCQlyZXR1cm4gUERGQUNUSU9OX1VSSTsKLQkJY2FzZSBDUERGX0FjdGlvbjo6TGF1bmNoOgotCQkJcmV0dXJuIFBERkFDVElPTl9MQVVOQ0g7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gUERGQUNUSU9OX1VOU1VQUE9SVEVEOwotCX0KLQlyZXR1cm4gUERGQUNUSU9OX1VOU1VQUE9SVEVEOwotfQotCi1ETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERkFjdGlvbl9HZXREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfQUNUSU9OIHBEaWN0KQotewotCWlmICghZG9jdW1lbnQpCi0JCXJldHVybiBOVUxMOwotCWlmICghcERpY3QpCi0JCXJldHVybiBOVUxMOwotCUNQREZfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERl9Eb2N1bWVudCopZG9jdW1lbnQ7Ci0JQ1BERl9BY3Rpb24gYWN0aW9uKChDUERGX0RpY3Rpb25hcnkqKXBEaWN0KTsKLQlyZXR1cm4gYWN0aW9uLkdldERlc3QocERvYykuR2V0T2JqZWN0KCk7Ci19Ci0KLURMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERkFjdGlvbl9HZXRVUklQYXRoKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfQUNUSU9OIHBEaWN0LAotCQkJCQkJCQkJCQkgIHZvaWQqIGJ1ZmZlciwgdW5zaWduZWQgbG9uZyBidWZsZW4pCi17Ci0JaWYgKCFkb2N1bWVudCkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFwRGljdCkKLQkJcmV0dXJuIDA7Ci0JQ1BERl9Eb2N1bWVudCogcERvYyA9IChDUERGX0RvY3VtZW50Kilkb2N1bWVudDsKLQlDUERGX0FjdGlvbiBhY3Rpb24oKENQREZfRGljdGlvbmFyeSopcERpY3QpOwotCUNGWF9CeXRlU3RyaW5nIHBhdGggPSBhY3Rpb24uR2V0VVJJKHBEb2MpOwotCXVuc2lnbmVkIGxvbmcgbGVuID0gcGF0aC5HZXRMZW5ndGgoKSArIDE7Ci0JaWYgKGJ1ZmZlciAhPSBOVUxMICYmIGJ1ZmxlbiA+PSBsZW4pCi0JCUZYU1lTX21lbWNweShidWZmZXIsIHBhdGguY19zdHIoKSwgbGVuKTsKLQlyZXR1cm4gbGVuOwotfQotCi1ETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZEZXN0X0dldFBhZ2VJbmRleChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0RFU1QgcERpY3QpCi17Ci0JaWYgKCFkb2N1bWVudCkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFwRGljdCkKLQkJcmV0dXJuIDA7Ci0JQ1BERl9Eb2N1bWVudCogcERvYyA9IChDUERGX0RvY3VtZW50Kilkb2N1bWVudDsKLQlDUERGX0Rlc3QgZGVzdCgoQ1BERl9BcnJheSopcERpY3QpOwotCXJldHVybiBkZXN0LkdldFBhZ2VJbmRleChwRG9jKTsKLX0KLQotc3RhdGljIHZvaWQgUmVsZWFzZUxpbmtMaXN0KEZYX0xQVk9JRCBkYXRhKQotewotCWRlbGV0ZSAoQ1BERl9MaW5rTGlzdCopZGF0YTsKLX0KLQotRExMRVhQT1JUIEZQREZfTElOSyBTVERDQUxMIEZQREZMaW5rX0dldExpbmtBdFBvaW50KEZQREZfUEFHRSBwYWdlLCBkb3VibGUgeCwgZG91YmxlIHkpCi17Ci0JaWYgKCFwYWdlKQotCQlyZXR1cm4gTlVMTDsKLQlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKLQkvLyBMaW5rIGxpc3QgaXMgc3RvcmVkIHdpdGggdGhlIGRvY3VtZW50Ci0JQ1BERl9Eb2N1bWVudCogcERvYyA9IHBQYWdlLT5tX3BEb2N1bWVudDsKLQlDUERGX0xpbmtMaXN0KiBwTGlua0xpc3QgPSAoQ1BERl9MaW5rTGlzdCopcERvYy0+R2V0UHJpdmF0ZURhdGEoJlRISVNNT0RVTEUpOwotCWlmICghcExpbmtMaXN0KSB7Ci0JCXBMaW5rTGlzdCA9IG5ldyBDUERGX0xpbmtMaXN0KHBEb2MpOwotCQlwRG9jLT5TZXRQcml2YXRlRGF0YSgmVEhJU01PRFVMRSwgcExpbmtMaXN0LCBSZWxlYXNlTGlua0xpc3QpOwotCX0KLQlyZXR1cm4gcExpbmtMaXN0LT5HZXRMaW5rQXRQb2ludChwUGFnZSwgKEZYX0ZMT0FUKXgsIChGWF9GTE9BVCl5KS5HZXREaWN0KCk7Ci19Ci0KLURMTEVYUE9SVCBGUERGX0RFU1QgU1REQ0FMTCBGUERGTGlua19HZXREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfTElOSyBwRGljdCkKLXsKLQlpZiAoIWRvY3VtZW50KQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIXBEaWN0KQotCQlyZXR1cm4gTlVMTDsKLQlDUERGX0RvY3VtZW50KiBwRG9jID0gKENQREZfRG9jdW1lbnQqKWRvY3VtZW50OwotCUNQREZfTGluayBsaW5rKChDUERGX0RpY3Rpb25hcnkqKXBEaWN0KTsKLQlGUERGX0RFU1QgZGVzdCA9IGxpbmsuR2V0RGVzdChwRG9jKS5HZXRPYmplY3QoKTsKLQlpZiAoZGVzdCkKLQkJcmV0dXJuIGRlc3Q7Ci0JLy8gSWYgdGhpcyBsaW5rIGlzIG5vdCBkaXJlY3RseSBhc3NvY2lhdGVkIHdpdGggYSBkZXN0LCB3ZSB0cnkgdG8gZ2V0IGFjdGlvbgotCUNQREZfQWN0aW9uIGFjdGlvbiA9IGxpbmsuR2V0QWN0aW9uKCk7Ci0JaWYgKCFhY3Rpb24pCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBhY3Rpb24uR2V0RGVzdChwRG9jKS5HZXRPYmplY3QoKTsKLX0KLQotRExMRVhQT1JUIEZQREZfQUNUSU9OIFNURENBTEwgRlBERkxpbmtfR2V0QWN0aW9uKEZQREZfTElOSyBwRGljdCkKLXsKLQlpZiAoIXBEaWN0KQotCQlyZXR1cm4gTlVMTDsKLQlDUERGX0xpbmsgbGluaygoQ1BERl9EaWN0aW9uYXJ5KilwRGljdCk7Ci0JcmV0dXJuIGxpbmsuR2V0QWN0aW9uKCkuR2V0RGljdCgpOwotfQotCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkxpbmtfRW51bWVyYXRlKEZQREZfUEFHRSBwYWdlLCBpbnQqIHN0YXJ0UG9zLCBGUERGX0xJTksqIGxpbmtBbm5vdCkKLXsKLQlpZighcGFnZSB8fCAhc3RhcnRQb3MgfHwgIWxpbmtBbm5vdCkKLQkJcmV0dXJuIEZBTFNFOwotCUNQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlOwotCWlmKCFwUGFnZS0+bV9wRm9ybURpY3QpCi0JCXJldHVybiBGQUxTRTsKLQlDUERGX0FycmF5KiBwQW5ub3RzID0gcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRBcnJheSgiQW5ub3RzIik7Ci0JaWYoIXBBbm5vdHMpCi0JCXJldHVybiBGQUxTRTsKLQlmb3IgKGludCBpID0gKnN0YXJ0UG9zOyBpIDwgKGludClwQW5ub3RzLT5HZXRDb3VudCgpOyBpKyspIHsKLQkJQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBBbm5vdHMtPkdldEVsZW1lbnRWYWx1ZShpKTsKLQkJaWYgKCFwRGljdCB8fCBwRGljdC0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKQotCQkJY29udGludWU7Ci0JCWlmKHBEaWN0LT5HZXRTdHJpbmcoRlhfQlNUUkMoIlN1YnR5cGUiKSkuRXF1YWwoRlhfQlNUUkMoIkxpbmsiKSkpIHsKLQkJCSpzdGFydFBvcyA9IGkgKyAxOwotCQkJKmxpbmtBbm5vdCA9IChGUERGX0xJTkspcERpY3Q7IAotCQkJcmV0dXJuIFRSVUU7Ci0JCX0KLQl9Ci0JcmV0dXJuIEZBTFNFOwotfQotCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkxpbmtfR2V0QW5ub3RSZWN0KEZQREZfTElOSyBsaW5rQW5ub3QsIEZTX1JFQ1RGKiByZWN0KQotewotCWlmKCFsaW5rQW5ub3QgfHwgIXJlY3QpCi0JCXJldHVybiBGQUxTRTsKLQlDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilsaW5rQW5ub3Q7Ci0JQ1BERl9SZWN0IHJ0ID0gcEFubm90RGljdC0+R2V0UmVjdChGWF9CU1RSQygiUmVjdCIpKTsKLQlyZWN0LT5sZWZ0ID0gcnQubGVmdDsKLQlyZWN0LT5ib3R0b20gPSBydC5ib3R0b207Ci0JcmVjdC0+cmlnaHQgPSBydC5yaWdodDsKLQlyZWN0LT50b3AgPSBydC50b3A7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGTGlua19Db3VudFF1YWRQb2ludHMoRlBERl9MSU5LIGxpbmtBbm5vdCkKLXsKLQlpZighbGlua0Fubm90KQotCQlyZXR1cm4gMDsKLQlDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilsaW5rQW5ub3Q7Ci0JQ1BERl9BcnJheSogcEFycmF5ID0gcEFubm90RGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIlF1YWRQb2ludHMiKSk7Ci0JaWYgKCFwQXJyYXkpCi0JCXJldHVybiAwOwotCWVsc2UKLQkJcmV0dXJuIHBBcnJheS0+R2V0Q291bnQoKSAvIDg7Ci19Ci0KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGTGlua19HZXRRdWFkUG9pbnRzKEZQREZfTElOSyBsaW5rQW5ub3QsIGludCBxdWFkSW5kZXgsIEZTX1FVQURQT0lOVFNGKiBxdWFkUG9pbnRzKQotewotCWlmKCFsaW5rQW5ub3QgfHwgIXF1YWRQb2ludHMpCi0JCXJldHVybiBGQUxTRTsKLQlDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilsaW5rQW5ub3Q7Ci0JQ1BERl9BcnJheSogcEFycmF5ID0gcEFubm90RGljdC0+R2V0QXJyYXkoRlhfQlNUUkMoIlF1YWRQb2ludHMiKSk7Ci0JaWYgKHBBcnJheSkgewotCQlpZiAocXVhZEluZGV4IDwgMCB8fCBxdWFkSW5kZXggPj0gKGludClwQXJyYXktPkdldENvdW50KCkvOCB8fCAoKHF1YWRJbmRleCo4KzcpID49IChpbnQpcEFycmF5LT5HZXRDb3VudCgpKSkKLQkJCXJldHVybiBGQUxTRTsKLQkJcXVhZFBvaW50cy0+eDEgPSBwQXJyYXktPkdldE51bWJlcihxdWFkSW5kZXgqOCk7Ci0JCXF1YWRQb2ludHMtPnkxID0gcEFycmF5LT5HZXROdW1iZXIocXVhZEluZGV4KjgrMSk7Ci0JCXF1YWRQb2ludHMtPngyID0gcEFycmF5LT5HZXROdW1iZXIocXVhZEluZGV4KjgrMik7Ci0JCXF1YWRQb2ludHMtPnkyID0gcEFycmF5LT5HZXROdW1iZXIocXVhZEluZGV4KjgrMyk7Ci0JCXF1YWRQb2ludHMtPngzID0gcEFycmF5LT5HZXROdW1iZXIocXVhZEluZGV4KjgrNCk7Ci0JCXF1YWRQb2ludHMtPnkzID0gcEFycmF5LT5HZXROdW1iZXIocXVhZEluZGV4KjgrNSk7Ci0JCXF1YWRQb2ludHMtPng0ID0gcEFycmF5LT5HZXROdW1iZXIocXVhZEluZGV4KjgrNik7Ci0JCXF1YWRQb2ludHMtPnk0ID0gcEFycmF5LT5HZXROdW1iZXIocXVhZEluZGV4KjgrNyk7Ci0JCXJldHVybiBUUlVFOwotCX0gCi0JcmV0dXJuIEZBTFNFOwotfQotCi1ETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZfR2V0TWV0YVRleHQoRlBERl9ET0NVTUVOVCBkb2MsIEZQREZfQllURVNUUklORyB0YWcsCi0JCQkJCQkJCQkJCQkgdm9pZCogYnVmZmVyLCB1bnNpZ25lZCBsb25nIGJ1ZmxlbikKLXsKLQlpZiAoIWRvYyB8fCAhdGFnKQotCQlyZXR1cm4gMDsKLQlDUERGX0RvY3VtZW50KiBwRG9jID0gKENQREZfRG9jdW1lbnQqKWRvYzsKLQkvLyBHZXQgaW5mbyBkaWN0aW9uYXJ5Ci0JQ1BERl9EaWN0aW9uYXJ5KiBwSW5mbyA9IHBEb2MtPkdldEluZm8oKTsKLQlpZiAoIXBJbmZvKQotCQlyZXR1cm4gMDsKLQlDRlhfV2lkZVN0cmluZyB0ZXh0ID0gcEluZm8tPkdldFVuaWNvZGVUZXh0KHRhZyk7Ci0JLy8gVXNlIFVURi0xNkxFIGVuY29kaW5nCi0JQ0ZYX0J5dGVTdHJpbmcgZW5jb2RlZFRleHQgPSB0ZXh0LlVURjE2TEVfRW5jb2RlKCk7Ci0JdW5zaWduZWQgbG9uZyBsZW4gPSBlbmNvZGVkVGV4dC5HZXRMZW5ndGgoKTsKLQlpZiAoYnVmZmVyICYmIGJ1ZmxlbiA+PSBsZW4pIHsKLQkJRlhTWVNfbWVtY3B5KGJ1ZmZlciwgZW5jb2RlZFRleHQuY19zdHIoKSwgbGVuKTsKLQl9Ci0JcmV0dXJuIGxlbjsKK0RMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERl9HZXRNZXRhVGV4dChGUERGX0RPQ1VNRU5UIGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1ZmxlbikgeworICBpZiAoIXRhZykKKyAgICByZXR1cm4gMDsKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZG9jKTsKKyAgaWYgKCFwRG9jKQorICAgIHJldHVybiAwOworICBDUERGX0RpY3Rpb25hcnkqIHBJbmZvID0gcERvYy0+R2V0SW5mbygpOworICBpZiAoIXBJbmZvKQorICAgIHJldHVybiAwOworICBDRlhfV2lkZVN0cmluZyB0ZXh0ID0gcEluZm8tPkdldFVuaWNvZGVUZXh0KHRhZyk7CisgIC8vIFVzZSBVVEYtMTZMRSBlbmNvZGluZworICBDRlhfQnl0ZVN0cmluZyBlbmNvZGVkVGV4dCA9IHRleHQuVVRGMTZMRV9FbmNvZGUoKTsKKyAgdW5zaWduZWQgbG9uZyBsZW4gPSBlbmNvZGVkVGV4dC5HZXRMZW5ndGgoKTsKKyAgaWYgKGJ1ZmZlciAmJiBidWZsZW4gPj0gbGVuKSB7CisgICAgRlhTWVNfbWVtY3B5KGJ1ZmZlciwgZW5jb2RlZFRleHQuY19zdHIoKSwgbGVuKTsKKyAgfQorICByZXR1cm4gbGVuOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZmRvY19lbWJlZGRlcnRlc3QuY3BwIGIvZnBkZnNkay9zcmMvZnBkZmRvY19lbWJlZGRlcnRlc3QuY3BwCmluZGV4IDFmMTFiZWYuLjFjNjZhMTUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZkb2NfZW1iZWRkZXJ0ZXN0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmZG9jX2VtYmVkZGVydGVzdC5jcHAKQEAgLTIsMzcgKzIsMTI2IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0jaW5jbHVkZSAiLi4vLi4vcHVibGljL2ZwZGZfZG9jLmgiCi0jaW5jbHVkZSAiLi4vLi4vcHVibGljL2ZwZGZ2aWV3LmgiCi0jaW5jbHVkZSAiLi4vLi4vdGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2RvYy5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmdmlldy5oIgorI2luY2x1ZGUgInRlc3RpbmcvZW1iZWRkZXJfdGVzdC5oIgorI2luY2x1ZGUgInRlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmgiCisjaW5jbHVkZSAidGVzdGluZy90ZXN0X3N1cHBvcnQuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKIAotY2xhc3MgRlBERkRvY0VtYmVkZGVydGVzdCA6IHB1YmxpYyBFbWJlZGRlclRlc3QgewotfTsKK2NsYXNzIEZQREZEb2NFbWJlZGRlcnRlc3QgOiBwdWJsaWMgRW1iZWRkZXJUZXN0IHt9OwogCiBURVNUX0YoRlBERkRvY0VtYmVkZGVydGVzdCwgRGVzdEdldFBhZ2VJbmRleCkgewotICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoInRlc3RpbmcvcmVzb3VyY2VzL25hbWVkX2Rlc3RzLnBkZiIpKTsKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJuYW1lZF9kZXN0cy5wZGYiKSk7CiAKICAgLy8gTlVMTCBGUERGX0RFU1QgY2FzZS4KLSAgRVhQRUNUX0VRKDAsIEZQREZEZXN0X0dldFBhZ2VJbmRleChkb2N1bWVudCgpLCBudWxscHRyKSk7CisgIEVYUEVDVF9FUSgwVSwgRlBERkRlc3RfR2V0UGFnZUluZGV4KGRvY3VtZW50KCksIG51bGxwdHIpKTsKIAogICAvLyBQYWdlIG51bWJlciBkaXJlY3RseSBpbiBpdGVtIGZyb20gRGVzdHMgTmFtZVRyZWUuCiAgIEZQREZfREVTVCBkZXN0ID0gRlBERl9HZXROYW1lZERlc3RCeU5hbWUoZG9jdW1lbnQoKSwgIkZpcnN0Iik7CiAgIEVYUEVDVF9ORShudWxscHRyLCBkZXN0KTsKLSAgRVhQRUNUX0VRKDEsIEZQREZEZXN0X0dldFBhZ2VJbmRleChkb2N1bWVudCgpLCBkZXN0KSk7CisgIEVYUEVDVF9FUSgxVSwgRlBERkRlc3RfR2V0UGFnZUluZGV4KGRvY3VtZW50KCksIGRlc3QpKTsKIAogICAvLyBQYWdlIG51bWJlciB2aWEgb2JqZWN0IHJlZmVyZW5jZSBpbiBpdGVtIGZyb20gRGVzdHMgTmFtZVRyZWUuCiAgIGRlc3QgPSBGUERGX0dldE5hbWVkRGVzdEJ5TmFtZShkb2N1bWVudCgpLCAiTmV4dCIpOwogICBFWFBFQ1RfTkUobnVsbHB0ciwgZGVzdCk7Ci0gIEVYUEVDVF9FUSgxLCBGUERGRGVzdF9HZXRQYWdlSW5kZXgoZG9jdW1lbnQoKSwgZGVzdCkpOworICBFWFBFQ1RfRVEoMVUsIEZQREZEZXN0X0dldFBhZ2VJbmRleChkb2N1bWVudCgpLCBkZXN0KSk7CiAKICAgLy8gUGFnZSBudW1iZXIgZGlyZWN0bHkgaW4gaXRlbSBmcm9tIERlc3RzIGRpY3Rpb25hcnkuCiAgIGRlc3QgPSBGUERGX0dldE5hbWVkRGVzdEJ5TmFtZShkb2N1bWVudCgpLCAiRmlyc3RBbHRlcm5hdGUiKTsKICAgRVhQRUNUX05FKG51bGxwdHIsIGRlc3QpOwotICBFWFBFQ1RfRVEoMTEsIEZQREZEZXN0X0dldFBhZ2VJbmRleChkb2N1bWVudCgpLCBkZXN0KSk7CisgIEVYUEVDVF9FUSgxMVUsIEZQREZEZXN0X0dldFBhZ2VJbmRleChkb2N1bWVudCgpLCBkZXN0KSk7CiAKICAgLy8gSW52YWxpZCBvYmplY3QgcmVmZXJlbmNlIGluIGl0ZW0gZnJvbSBEZXN0cyBOYW1lVHJlZS4KICAgZGVzdCA9IEZQREZfR2V0TmFtZWREZXN0QnlOYW1lKGRvY3VtZW50KCksICJMYXN0QWx0ZXJuYXRlIik7CiAgIEVYUEVDVF9ORShudWxscHRyLCBkZXN0KTsKLSAgRVhQRUNUX0VRKDAsIEZQREZEZXN0X0dldFBhZ2VJbmRleChkb2N1bWVudCgpLCBkZXN0KSk7CisgIEVYUEVDVF9FUSgwVSwgRlBERkRlc3RfR2V0UGFnZUluZGV4KGRvY3VtZW50KCksIGRlc3QpKTsKK30KKworVEVTVF9GKEZQREZEb2NFbWJlZGRlcnRlc3QsIEFjdGlvbkdldEZpbGVQYXRoKSB7CisgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgibGF1bmNoX2FjdGlvbi5wZGYiKSk7CisKKyAgRlBERl9QQUdFIHBhZ2UgPSBGUERGX0xvYWRQYWdlKGRvY3VtZW50KCksIDApOworICBBU1NFUlRfVFJVRShwYWdlKTsKKworICAvLyBUaGUgdGFyZ2V0IGFjdGlvbiBpcyBuZWFybHkgdGhlIHNpemUgb2YgdGhlIHdob2xlIHBhZ2UuCisgIEZQREZfTElOSyBsaW5rID0gRlBERkxpbmtfR2V0TGlua0F0UG9pbnQocGFnZSwgMTAwLCAxMDApOworICBBU1NFUlRfVFJVRShsaW5rKTsKKworICBGUERGX0FDVElPTiBhY3Rpb24gPSBGUERGTGlua19HZXRBY3Rpb24obGluayk7CisgIEFTU0VSVF9UUlVFKGFjdGlvbik7CisKKyAgY29uc3QgY2hhciBrRXhwZWN0ZWRSZXN1bHRbXSA9ICJ0ZXN0LnBkZiI7CisgIGNvbnN0IHVuc2lnbmVkIGxvbmcga0V4cGVjdGVkTGVuZ3RoID0gc2l6ZW9mKGtFeHBlY3RlZFJlc3VsdCk7CisgIHVuc2lnbmVkIGxvbmcgYnVmc2l6ZSA9IEZQREZBY3Rpb25fR2V0RmlsZVBhdGgoYWN0aW9uLCBudWxscHRyLCAwKTsKKyAgQVNTRVJUX0VRKGtFeHBlY3RlZExlbmd0aCwgYnVmc2l6ZSk7CisKKyAgY2hhciBidWZba0V4cGVjdGVkTGVuZ3RoXTsKKyAgRVhQRUNUX0VRKGJ1ZnNpemUsIEZQREZBY3Rpb25fR2V0RmlsZVBhdGgoYWN0aW9uLCBidWYsIGJ1ZnNpemUpKTsKKyAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKGtFeHBlY3RlZFJlc3VsdCksIHN0ZDo6c3RyaW5nKGJ1ZikpOworCisgIEZQREZfQ2xvc2VQYWdlKHBhZ2UpOworfQorCitURVNUX0YoRlBERkRvY0VtYmVkZGVydGVzdCwgTm9Cb29rbWFya3MpIHsKKyAgLy8gT3BlbiBhIGZpbGUgd2l0aCBubyBib29rbWFya3MuCisgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgibmFtZWRfZGVzdHMucGRmIikpOworCisgIC8vIFRoZSBub24tZXhpc3RlbnQgdG9wLWxldmVsIGJvb2ttYXJrIGhhcyBubyB0aXRsZS4KKyAgdW5zaWduZWQgc2hvcnQgYnVmWzEyOF07CisgIEVYUEVDVF9FUSgwLCBGUERGQm9va21hcmtfR2V0VGl0bGUobnVsbHB0ciwgYnVmLCBzaXplb2YoYnVmKSkpOworCisgIC8vIFRoZSBub24tZXhpc3RlbnQgdG9wLWxldmVsIGJvb2ttYXJrIGhhcyBubyBjaGlsZHJlbi4KKyAgRVhQRUNUX0VRKG51bGxwdHIsIEZQREZCb29rbWFya19HZXRGaXJzdENoaWxkKGRvY3VtZW50KCksIG51bGxwdHIpKTsKK30KKworVEVTVF9GKEZQREZEb2NFbWJlZGRlcnRlc3QsIEJvb2ttYXJrcykgeworICAvLyBPcGVuIGEgZmlsZSB3aXRoIHR3byBib29rbWFya3MuCisgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgiYm9va21hcmtzLnBkZiIpKTsKKworICAvLyBUaGUgZXhpc3RlbnQgdG9wLWxldmVsIGJvb2ttYXJrIGhhcyBubyB0aXRsZS4KKyAgdW5zaWduZWQgc2hvcnQgYnVmWzEyOF07CisgIEVYUEVDVF9FUSgwLCBGUERGQm9va21hcmtfR2V0VGl0bGUobnVsbHB0ciwgYnVmLCBzaXplb2YoYnVmKSkpOworCisgIEZQREZfQk9PS01BUksgY2hpbGQgPSBGUERGQm9va21hcmtfR2V0Rmlyc3RDaGlsZChkb2N1bWVudCgpLCBudWxscHRyKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIGNoaWxkKTsKKyAgRVhQRUNUX0VRKDM0LCBGUERGQm9va21hcmtfR2V0VGl0bGUoY2hpbGQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKKyAgRVhQRUNUX0VRKENGWF9XaWRlU3RyaW5nKEwiQSBHb29kIEJlZ2lubmluZyIpLAorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEYxNkxFKGJ1ZiwgMTYpKTsKKworICBFWFBFQ1RfRVEobnVsbHB0ciwgRlBERkJvb2ttYXJrX0dldEZpcnN0Q2hpbGQoZG9jdW1lbnQoKSwgY2hpbGQpKTsKKworICBGUERGX0JPT0tNQVJLIHNpYmxpbmcgPSBGUERGQm9va21hcmtfR2V0TmV4dFNpYmxpbmcoZG9jdW1lbnQoKSwgY2hpbGQpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgc2libGluZyk7CisgIEVYUEVDVF9FUSgyOCwgRlBERkJvb2ttYXJrX0dldFRpdGxlKHNpYmxpbmcsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKKyAgRVhQRUNUX0VRKENGWF9XaWRlU3RyaW5nKEwiQSBHb29kIEVuZGluZyIpLAorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEYxNkxFKGJ1ZiwgMTMpKTsKKworICBFWFBFQ1RfRVEobnVsbHB0ciwgRlBERkJvb2ttYXJrX0dldE5leHRTaWJsaW5nKGRvY3VtZW50KCksIHNpYmxpbmcpKTsKK30KKworVEVTVF9GKEZQREZEb2NFbWJlZGRlcnRlc3QsIEZpbmRCb29rbWFya3MpIHsKKyAgLy8gT3BlbiBhIGZpbGUgd2l0aCB0d28gYm9va21hcmtzLgorICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoImJvb2ttYXJrcy5wZGYiKSk7CisKKyAgLy8gRmluZCB0aGUgZmlyc3Qgb25lLCBiYXNlZCBvbiBpdHMga25vd24gdGl0bGUuCisgIHN0ZDo6dW5pcXVlX3B0cjx1bnNpZ25lZCBzaG9ydCwgcGRmaXVtOjpGcmVlRGVsZXRlcj4gdGl0bGUgPQorICAgICAgR2V0RlBERldpZGVTdHJpbmcoTCJBIEdvb2QgQmVnaW5uaW5nIik7CisgIEZQREZfQk9PS01BUksgY2hpbGQgPSBGUERGQm9va21hcmtfRmluZChkb2N1bWVudCgpLCB0aXRsZS5nZXQoKSk7CisgIEVYUEVDVF9ORShudWxscHRyLCBjaGlsZCk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgc3RyaW5nIG1hdGNoZXMuCisgIHVuc2lnbmVkIHNob3J0IGJ1ZlsxMjhdOworICBFWFBFQ1RfRVEoMzQsIEZQREZCb29rbWFya19HZXRUaXRsZShjaGlsZCwgYnVmLCBzaXplb2YoYnVmKSkpOworICBFWFBFQ1RfRVEoQ0ZYX1dpZGVTdHJpbmcoTCJBIEdvb2QgQmVnaW5uaW5nIiksCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoYnVmLCAxNikpOworCisgIC8vIENoZWNrIHRoYXQgaXQgaXMgdGhlbSBzYW1lIGFzIHRoZSBvbmUgcmV0dXJuZWQgYnkgR2V0Rmlyc3RDaGlsZC4KKyAgRVhQRUNUX0VRKGNoaWxkLCBGUERGQm9va21hcmtfR2V0Rmlyc3RDaGlsZChkb2N1bWVudCgpLCBudWxscHRyKSk7CisKKyAgLy8gVHJ5IHRvIGZpbmQgb25lIHVzaW5nIGEgbm9uLWV4aXN0ZW50IHRpdGxlLgorICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWQgc2hvcnQsIHBkZml1bTo6RnJlZURlbGV0ZXI+IGJhZF90aXRsZSA9CisgICAgICBHZXRGUERGV2lkZVN0cmluZyhMIkEgQkFEIEJlZ2lubmluZyIpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgRlBERkJvb2ttYXJrX0ZpbmQoZG9jdW1lbnQoKSwgYmFkX3RpdGxlLmdldCgpKSk7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmZWRpdF9lbWJlZGRlcnRlc3QuY3BwIGIvZnBkZnNkay9zcmMvZnBkZmVkaXRfZW1iZWRkZXJ0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODBlZjUxCi0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9zcmMvZnBkZmVkaXRfZW1iZWRkZXJ0ZXN0LmNwcApAQCAtMCwwICsxLDYwIEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9lZGl0LmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiCisjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLW1hdGNoZXJzLmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy90ZXN0X3N1cHBvcnQuaCIKKworY2xhc3MgRlBERkVkaXRFbWJlZGRlcnRlc3QgOiBwdWJsaWMgRW1iZWRkZXJUZXN0LCBwdWJsaWMgVGVzdFNhdmVyIHt9OworCitURVNUX0YoRlBERkVkaXRFbWJlZGRlcnRlc3QsIEVtcHR5Q3JlYXRpb24pIHsKKyAgRVhQRUNUX1RSVUUoQ3JlYXRlRW1wdHlEb2N1bWVudCgpKTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBGUERGUGFnZV9OZXcoZG9jdW1lbnQoKSwgMSwgNjQwLjAsIDQ4MC4wKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIHBhZ2UpOworICBFWFBFQ1RfVFJVRShGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQocGFnZSkpOworICBFWFBFQ1RfVFJVRShGUERGX1NhdmVBc0NvcHkoZG9jdW1lbnQoKSwgdGhpcywgMCkpOworICBFWFBFQ1RfVEhBVChHZXRTdHJpbmcoKSwKKyAgICAgICAgICAgICAgdGVzdGluZzo6TWF0Y2hlc1JlZ2V4KAorICAgICAgICAgICAgICAgICAgIiVQREYtMS43XHJcbiIKKyAgICAgICAgICAgICAgICAgICIlXHhBMVx4QjNceEM1XHhEN1xyXG4iCisgICAgICAgICAgICAgICAgICAiMSAwIG9ialxyXG4iCisgICAgICAgICAgICAgICAgICAiPDwvUGFnZXMgMiAwIFIgL1R5cGUvQ2F0YWxvZz4+XHJcbiIKKyAgICAgICAgICAgICAgICAgICJlbmRvYmpcclxuIgorICAgICAgICAgICAgICAgICAgIjIgMCBvYmpcclxuIgorICAgICAgICAgICAgICAgICAgIjw8L0NvdW50IDEvS2lkc1xcWyA0IDAgUiBcXF0vVHlwZS9QYWdlcz4+XHJcbiIKKyAgICAgICAgICAgICAgICAgICJlbmRvYmpcclxuIgorICAgICAgICAgICAgICAgICAgIjMgMCBvYmpcclxuIgorICAgICAgICAgICAgICAgICAgIjw8L0NyZWF0aW9uRGF0ZVxcKEQ6LipcXCkvQ3JlYXRvclxcKFBERml1bVxcKT4+XHJcbiIKKyAgICAgICAgICAgICAgICAgICJlbmRvYmpcclxuIgorICAgICAgICAgICAgICAgICAgIjQgMCBvYmpcclxuIgorICAgICAgICAgICAgICAgICAgIjw8L0NvbnRlbnRzIDUgMCBSIC9NZWRpYUJveFxcWyAwIDAgNjQwIDQ4MFxcXSIKKyAgICAgICAgICAgICAgICAgICIvUGFyZW50IDIgMCBSIC9SZXNvdXJjZXM8PD4+L1JvdGF0ZSAwL1R5cGUvUGFnZSIKKyAgICAgICAgICAgICAgICAgICI+PlxyXG4iCisgICAgICAgICAgICAgICAgICAiZW5kb2JqXHJcbiIKKyAgICAgICAgICAgICAgICAgICI1IDAgb2JqXHJcbiIKKyAgICAgICAgICAgICAgICAgICI8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDg+PnN0cmVhbVxyXG4iCisgICAgICAgICAgICAgICAgICAieFx4OUNceDNcMFwwXDBcMFx4MVxyXG4iCisgICAgICAgICAgICAgICAgICAiZW5kc3RyZWFtXHJcbiIKKyAgICAgICAgICAgICAgICAgICJlbmRvYmpcclxuIgorICAgICAgICAgICAgICAgICAgInhyZWZcclxuIgorICAgICAgICAgICAgICAgICAgIjAgNlxyXG4iCisgICAgICAgICAgICAgICAgICAiMDAwMDAwMDAwMCA2NTUzNSBmXHJcbiIKKyAgICAgICAgICAgICAgICAgICIwMDAwMDAwMDE3IDAwMDAwIG5cclxuIgorICAgICAgICAgICAgICAgICAgIjAwMDAwMDAwNjYgMDAwMDAgblxyXG4iCisgICAgICAgICAgICAgICAgICAiMDAwMDAwMDEyMiAwMDAwMCBuXHJcbiIKKyAgICAgICAgICAgICAgICAgICIwMDAwMDAwMTkyIDAwMDAwIG5cclxuIgorICAgICAgICAgICAgICAgICAgIjAwMDAwMDAzMDEgMDAwMDAgblxyXG4iCisgICAgICAgICAgICAgICAgICAidHJhaWxlclxyXG4iCisgICAgICAgICAgICAgICAgICAiPDxcclxuIgorICAgICAgICAgICAgICAgICAgIi9Sb290IDEgMCBSXHJcbiIKKyAgICAgICAgICAgICAgICAgICIvSW5mbyAzIDAgUlxyXG4iCisgICAgICAgICAgICAgICAgICAiL1NpemUgNi9JRFxcWzwuKj48Lio+XFxdPj5cclxuIgorICAgICAgICAgICAgICAgICAgInN0YXJ0eHJlZlxyXG4iCisgICAgICAgICAgICAgICAgICAiMzc5XHJcbiIKKyAgICAgICAgICAgICAgICAgICIlJUVPRlxyXG4iKSk7CisgIEZQREZQYWdlX0RlbGV0ZShkb2N1bWVudCgpLCAxKTsKK30KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZlZGl0aW1nLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZlZGl0aW1nLmNwcAppbmRleCBmMDY1NjRlLi5kZTVjNzJmIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmZWRpdGltZy5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZmVkaXRpbWcuY3BwCkBAIC0xLDczICsxLDgzIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9wdWJsaWMvZnBkZl9lZGl0LmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX2RlZmluZS5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2VkaXQuaCIKIAorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mc2RrX2RlZmluZS5oIgogCi1ETExFWFBPUlQgRlBERl9QQUdFT0JKRUNUIFNURENBTEwgRlBERlBhZ2VPYmpfTmV3SW1nZU9iaihGUERGX0RPQ1VNRU5UIGRvY3VtZW50KQotewotCWlmICghZG9jdW1lbnQpCi0JCXJldHVybiBOVUxMOwotCUNQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiA9IG5ldyBDUERGX0ltYWdlT2JqZWN0OwotCUNQREZfSW1hZ2UqIHBJbWcgPSBuZXcgQ1BERl9JbWFnZSgoQ1BERl9Eb2N1bWVudCAqKWRvY3VtZW50KTsKLQlwSW1hZ2VPYmotPm1fcEltYWdlID0gcEltZzsKLQlyZXR1cm4gcEltYWdlT2JqOworRExMRVhQT1JUIEZQREZfUEFHRU9CSkVDVCBTVERDQUxMCitGUERGUGFnZU9ial9OZXdJbWdlT2JqKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpIHsKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZG9jdW1lbnQpOworICBpZiAoIXBEb2MpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiA9IG5ldyBDUERGX0ltYWdlT2JqZWN0OworICBDUERGX0ltYWdlKiBwSW1nID0gbmV3IENQREZfSW1hZ2UocERvYyk7CisgIHBJbWFnZU9iai0+bV9wSW1hZ2UgPSBwSW1nOworICByZXR1cm4gcEltYWdlT2JqOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkltYWdlT2JqX0xvYWRKcGVnRmlsZShGUERGX1BBR0UqIHBhZ2VzLCBpbnQgbkNvdW50LEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QsIEZQREZfRklMRUFDQ0VTUyogZmlsZUFjY2VzcykKLXsKLQlpZiAoIWltYWdlX29iamVjdCB8fCAhZmlsZUFjY2VzcykKLQkJcmV0dXJuIEZBTFNFOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMCitGUERGSW1hZ2VPYmpfTG9hZEpwZWdGaWxlKEZQREZfUEFHRSogcGFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRklMRUFDQ0VTUyogZmlsZUFjY2VzcykgeworICBpZiAoIWltYWdlX29iamVjdCB8fCAhZmlsZUFjY2VzcyB8fCAhcGFnZXMpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JSUZYX0ZpbGVSZWFkKiBwRmlsZSA9IG5ldyBDUERGX0N1c3RvbUFjY2VzcyhmaWxlQWNjZXNzKTsKLQlDUERGX0ltYWdlT2JqZWN0KiBwSW1nT2JqID0gKENQREZfSW1hZ2VPYmplY3QqKWltYWdlX29iamVjdDsKLQlwSW1nT2JqLT5tX0dlbmVyYWxTdGF0ZS5HZXRNb2RpZnkoKTsKLQlmb3IgKGludCBpbmRleD0wO2luZGV4PG5Db3VudDtpbmRleCsrKQotCXsKLQkJQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2VzW2luZGV4XTsgCi0JCXBJbWdPYmotPm1fcEltYWdlLT5SZXNldENhY2hlKHBQYWdlLE5VTEwpOwotCX0KLQlwSW1nT2JqLT5tX3BJbWFnZS0+U2V0SnBlZ0ltYWdlKHBGaWxlKTsKKyAgSUZYX0ZpbGVSZWFkKiBwRmlsZSA9IG5ldyBDUERGX0N1c3RvbUFjY2VzcyhmaWxlQWNjZXNzKTsKKyAgQ1BERl9JbWFnZU9iamVjdCogcEltZ09iaiA9IChDUERGX0ltYWdlT2JqZWN0KilpbWFnZV9vYmplY3Q7CisgIHBJbWdPYmotPm1fR2VuZXJhbFN0YXRlLkdldE1vZGlmeSgpOworICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbkNvdW50OyBpbmRleCsrKSB7CisgICAgQ1BERl9QYWdlKiBwUGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2VzW2luZGV4XSk7CisgICAgaWYgKCFwUGFnZSkKKyAgICAgIGNvbnRpbnVlOworICAgIHBJbWdPYmotPm1fcEltYWdlLT5SZXNldENhY2hlKHBQYWdlLCBOVUxMKTsKKyAgfQorICBwSW1nT2JqLT5tX3BJbWFnZS0+U2V0SnBlZ0ltYWdlKHBGaWxlKTsKIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkltYWdlT2JqX1NldE1hdHJpeAkoRlBERl9QQUdFT0JKRUNUIGltYWdlX29iamVjdCwKLQkJCQkJCQkJCQkJCSBkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSBjLCBkb3VibGUgZCwgZG91YmxlIGUsIGRvdWJsZSBmKQotewotCWlmICghaW1hZ2Vfb2JqZWN0KQotCQlyZXR1cm4gRkFMU0U7Ci0JQ1BERl9JbWFnZU9iamVjdCogcEltZ09iaiA9IChDUERGX0ltYWdlT2JqZWN0KilpbWFnZV9vYmplY3Q7Ci0JcEltZ09iai0+bV9NYXRyaXguYSA9IChGWF9GTE9BVClhOwotCXBJbWdPYmotPm1fTWF0cml4LmIgPSAoRlhfRkxPQVQpYjsKLQlwSW1nT2JqLT5tX01hdHJpeC5jID0gKEZYX0ZMT0FUKWM7Ci0JcEltZ09iai0+bV9NYXRyaXguZCA9IChGWF9GTE9BVClkOwotCXBJbWdPYmotPm1fTWF0cml4LmUgPSAoRlhfRkxPQVQpZTsKLQlwSW1nT2JqLT5tX01hdHJpeC5mID0gKEZYX0ZMT0FUKWY7Ci0JcEltZ09iai0+Q2FsY0JvdW5kaW5nQm94KCk7Ci0JcmV0dXJuICBUUlVFOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZJbWFnZU9ial9TZXRNYXRyaXgoRlBERl9QQUdFT0JKRUNUIGltYWdlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZikgeworICBpZiAoIWltYWdlX29iamVjdCkKKyAgICByZXR1cm4gRkFMU0U7CisgIENQREZfSW1hZ2VPYmplY3QqIHBJbWdPYmogPSAoQ1BERl9JbWFnZU9iamVjdCopaW1hZ2Vfb2JqZWN0OworICBwSW1nT2JqLT5tX01hdHJpeC5hID0gKEZYX0ZMT0FUKWE7CisgIHBJbWdPYmotPm1fTWF0cml4LmIgPSAoRlhfRkxPQVQpYjsKKyAgcEltZ09iai0+bV9NYXRyaXguYyA9IChGWF9GTE9BVCljOworICBwSW1nT2JqLT5tX01hdHJpeC5kID0gKEZYX0ZMT0FUKWQ7CisgIHBJbWdPYmotPm1fTWF0cml4LmUgPSAoRlhfRkxPQVQpZTsKKyAgcEltZ09iai0+bV9NYXRyaXguZiA9IChGWF9GTE9BVClmOworICBwSW1nT2JqLT5DYWxjQm91bmRpbmdCb3goKTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGSW1hZ2VPYmpfU2V0Qml0bWFwKEZQREZfUEFHRSogcGFnZXMsaW50IG5Db3VudCxGUERGX1BBR0VPQkpFQ1QgaW1hZ2Vfb2JqZWN0LEZQREZfQklUTUFQIGJpdG1hcCkKLXsKLQlpZiAoIWltYWdlX29iamVjdCB8fCAhYml0bWFwKQotCQlyZXR1cm4gRkFMU0U7Ci0JQ0ZYX0RJQml0bWFwKiBwQm1wID0gTlVMTDsKLQlwQm1wID0gKENGWF9ESUJpdG1hcCopYml0bWFwOwotCUNQREZfSW1hZ2VPYmplY3QqIHBJbWdPYmogPSAoQ1BERl9JbWFnZU9iamVjdCopaW1hZ2Vfb2JqZWN0OwotCXBJbWdPYmotPm1fR2VuZXJhbFN0YXRlLkdldE1vZGlmeSgpOwotCWZvciAoaW50IGluZGV4PTA7aW5kZXg8bkNvdW50O2luZGV4KyspCi0JewotCQlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZXNbaW5kZXhdOyAKLQkJcEltZ09iai0+bV9wSW1hZ2UtPlJlc2V0Q2FjaGUocFBhZ2UsTlVMTCk7Ci0JfQotCXBJbWdPYmotPm1fcEltYWdlLT5TZXRJbWFnZShwQm1wLEZBTFNFKTsKLQlwSW1nT2JqLT5DYWxjQm91bmRpbmdCb3goKTsKLQlyZXR1cm4gVFJVRTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGSW1hZ2VPYmpfU2V0Qml0bWFwKEZQREZfUEFHRSogcGFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFT0JKRUNUIGltYWdlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQklUTUFQIGJpdG1hcCkgeworICBpZiAoIWltYWdlX29iamVjdCB8fCAhYml0bWFwIHx8ICFwYWdlcykKKyAgICByZXR1cm4gRkFMU0U7CisgIENGWF9ESUJpdG1hcCogcEJtcCA9IE5VTEw7CisgIHBCbXAgPSAoQ0ZYX0RJQml0bWFwKiliaXRtYXA7CisgIENQREZfSW1hZ2VPYmplY3QqIHBJbWdPYmogPSAoQ1BERl9JbWFnZU9iamVjdCopaW1hZ2Vfb2JqZWN0OworICBwSW1nT2JqLT5tX0dlbmVyYWxTdGF0ZS5HZXRNb2RpZnkoKTsKKyAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG5Db3VudDsgaW5kZXgrKykgeworICAgIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlc1tpbmRleF0pOworICAgIGlmICghcFBhZ2UpCisgICAgICBjb250aW51ZTsKKyAgICBwSW1nT2JqLT5tX3BJbWFnZS0+UmVzZXRDYWNoZShwUGFnZSwgTlVMTCk7CisgIH0KKyAgcEltZ09iai0+bV9wSW1hZ2UtPlNldEltYWdlKHBCbXAsIEZBTFNFKTsKKyAgcEltZ09iai0+Q2FsY0JvdW5kaW5nQm94KCk7CisgIHJldHVybiBUUlVFOwogfQotCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmZWRpdHBhZ2UuY3BwIGIvZnBkZnNkay9zcmMvZnBkZmVkaXRwYWdlLmNwcAppbmRleCBlMTNjNDgwLi5jNmQ1NzlhIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmZWRpdHBhZ2UuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZlZGl0cGFnZS5jcHAKQEAgLTEsMTIgKzEsMTkgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL3B1YmxpYy9mcGRmX2VkaXQuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZfZWRpdC5oIgogCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZfZm9ybWZpbGwuaCIKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9hcHAuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2RvYy5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfcGFnZS5oIgorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCiAjaWYgX0ZYX09TXyA9PSBfRlhfQU5EUk9JRF8KICNpbmNsdWRlICJ0aW1lLmgiCkBAIC0xNCwzMDggKzIxLDI5MiBAQAogI2luY2x1ZGUgPGN0aW1lPgogI2VuZGlmCiAKLURMTEVYUE9SVCBGUERGX0RPQ1VNRU5UIFNURENBTEwgRlBERl9DcmVhdGVOZXdEb2N1bWVudCgpCi17Ci0JQ1BERl9Eb2N1bWVudCogcERvYyA9IG5ldyBDUERGX0RvY3VtZW50OwotCXBEb2MtPkNyZWF0ZU5ld0RvYygpOwotCXRpbWVfdCBjdXJyZW50VGltZTsKK0RMTEVYUE9SVCBGUERGX0RPQ1VNRU5UIFNURENBTEwgRlBERl9DcmVhdGVOZXdEb2N1bWVudCgpIHsKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9IG5ldyBDUERGX0RvY3VtZW50OworICBwRG9jLT5DcmVhdGVOZXdEb2MoKTsKKyAgdGltZV90IGN1cnJlbnRUaW1lOwogCi0JQ0ZYX0J5dGVTdHJpbmcgRGF0ZVN0cjsKKyAgQ0ZYX0J5dGVTdHJpbmcgRGF0ZVN0cjsKIAotCWlmKEZTREtfSXNTYW5kQm94UG9saWN5RW5hYmxlZChGUERGX1BPTElDWV9NQUNISU5FVElNRV9BQ0NFU1MpKQotCXsKLQkJaWYgKCAtMSAhPSB0aW1lKCAmY3VycmVudFRpbWUgKSApCi0JCXsKLQkJCXRtICogcFRNID0gbG9jYWx0aW1lKCAmY3VycmVudFRpbWUgKTsKLQkJCWlmICggcFRNICkKLQkJCXsKLQkJCQlEYXRlU3RyLkZvcm1hdCgJIkQ6JTA0ZCUwMmQlMDJkJTAyZCUwMmQlMDJkIiwgcFRNLT50bV95ZWFyKzE5MDAsIHBUTS0+dG1fbW9uKzEsCi0JCQkJCXBUTS0+dG1fbWRheSwgcFRNLT50bV9ob3VyLCBwVE0tPnRtX21pbiwgcFRNLT50bV9zZWMgKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlDUERGX0RpY3Rpb25hcnkqIHBJbmZvRGljdCA9IE5VTEw7Ci0JcEluZm9EaWN0ID0gcERvYy0+R2V0SW5mbygpOwotCWlmIChwSW5mb0RpY3QpCi0JewotCQlpZihGU0RLX0lzU2FuZEJveFBvbGljeUVuYWJsZWQoRlBERl9QT0xJQ1lfTUFDSElORVRJTUVfQUNDRVNTKSkKLQkJCXBJbmZvRGljdC0+U2V0QXQoIkNyZWF0aW9uRGF0ZSIsIG5ldyBDUERGX1N0cmluZyhEYXRlU3RyKSk7Ci0JCXBJbmZvRGljdC0+U2V0QXQoIkNyZWF0b3IiLCBuZXcgQ1BERl9TdHJpbmcoTCJQREZpdW0iKSk7Ci0JfQorICBpZiAoRlNES19Jc1NhbmRCb3hQb2xpY3lFbmFibGVkKEZQREZfUE9MSUNZX01BQ0hJTkVUSU1FX0FDQ0VTUykpIHsKKyAgICBpZiAoLTEgIT0gdGltZSgmY3VycmVudFRpbWUpKSB7CisgICAgICB0bSogcFRNID0gbG9jYWx0aW1lKCZjdXJyZW50VGltZSk7CisgICAgICBpZiAocFRNKSB7CisgICAgICAgIERhdGVTdHIuRm9ybWF0KCJEOiUwNGQlMDJkJTAyZCUwMmQlMDJkJTAyZCIsIHBUTS0+dG1feWVhciArIDE5MDAsCisgICAgICAgICAgICAgICAgICAgICAgIHBUTS0+dG1fbW9uICsgMSwgcFRNLT50bV9tZGF5LCBwVE0tPnRtX2hvdXIsIHBUTS0+dG1fbWluLAorICAgICAgICAgICAgICAgICAgICAgICBwVE0tPnRtX3NlYyk7CisgICAgICB9CisgICAgfQorICB9CiAKLQlyZXR1cm4gcERvYzsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwSW5mb0RpY3QgPSBOVUxMOworICBwSW5mb0RpY3QgPSBwRG9jLT5HZXRJbmZvKCk7CisgIGlmIChwSW5mb0RpY3QpIHsKKyAgICBpZiAoRlNES19Jc1NhbmRCb3hQb2xpY3lFbmFibGVkKEZQREZfUE9MSUNZX01BQ0hJTkVUSU1FX0FDQ0VTUykpCisgICAgICBwSW5mb0RpY3QtPlNldEF0KCJDcmVhdGlvbkRhdGUiLCBuZXcgQ1BERl9TdHJpbmcoRGF0ZVN0ciwgRkFMU0UpKTsKKyAgICBwSW5mb0RpY3QtPlNldEF0KCJDcmVhdG9yIiwgbmV3IENQREZfU3RyaW5nKEwiUERGaXVtIikpOworICB9CisKKyAgcmV0dXJuIEZQREZEb2N1bWVudEZyb21DUERGRG9jdW1lbnQocERvYyk7CiB9CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VfRGVsZXRlKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIGludCBwYWdlX2luZGV4KQotewotCUNQREZfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERl9Eb2N1bWVudCopZG9jdW1lbnQ7Ci0JaWYgKHBEb2MgPT0gTlVMTCkgCi0JCXJldHVybjsKLQlpZiAocGFnZV9pbmRleCA8IDAgfHwgcGFnZV9pbmRleCA+PSBwRG9jLT5HZXRQYWdlQ291bnQoKSkgCi0JCXJldHVybjsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VfRGVsZXRlKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIGludCBwYWdlX2luZGV4KSB7CisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBDUERGRG9jdW1lbnRGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KTsKKyAgaWYgKCFwRG9jIHx8IHBhZ2VfaW5kZXggPCAwIHx8IHBhZ2VfaW5kZXggPj0gcERvYy0+R2V0UGFnZUNvdW50KCkpCisgICAgcmV0dXJuOwogCi0JcERvYy0+RGVsZXRlUGFnZShwYWdlX2luZGV4KTsKKyAgcERvYy0+RGVsZXRlUGFnZShwYWdlX2luZGV4KTsKIH0KIAotRExMRVhQT1JUIEZQREZfUEFHRSBTVERDQUxMIEZQREZQYWdlX05ldyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBpbnQgcGFnZV9pbmRleCwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0KQotewotCWlmICghZG9jdW1lbnQpCi0JCXJldHVybiBOVUxMOworRExMRVhQT1JUIEZQREZfUEFHRSBTVERDQUxMIEZQREZQYWdlX05ldyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFnZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgaGVpZ2h0KSB7CisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBDUERGRG9jdW1lbnRGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KTsKKyAgaWYgKCFwRG9jKQorICAgIHJldHVybiBudWxscHRyOwogCi0vLwlDUERGX1BhcnNlciogcFBhcnNlciA9IChDUERGX1BhcnNlciopZG9jdW1lbnQ7Ci0JQ1BERl9Eb2N1bWVudCogcERvYyA9IChDUERGX0RvY3VtZW50Kilkb2N1bWVudDsKLQlpZihwYWdlX2luZGV4IDwgMCkKLQkJcGFnZV9pbmRleCA9IDA7Ci0JaWYocERvYy0+R2V0UGFnZUNvdW50KCk8cGFnZV9pbmRleCkKLQkJcGFnZV9pbmRleCA9IHBEb2MtPkdldFBhZ2VDb3VudCgpOwotLy8JaWYgKHBhZ2VfaW5kZXggPCAwIHx8IHBhZ2VfaW5kZXggPj0gcERvYy0+R2V0UGFnZUNvdW50KCkpIAotLy8JCXJldHVybiBOVUxMOworICBpZiAocGFnZV9pbmRleCA8IDApCisgICAgcGFnZV9pbmRleCA9IDA7CisgIGlmIChwRG9jLT5HZXRQYWdlQ291bnQoKSA8IHBhZ2VfaW5kZXgpCisgICAgcGFnZV9pbmRleCA9IHBEb2MtPkdldFBhZ2VDb3VudCgpOwogCi0JQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBwRG9jLT5DcmVhdGVOZXdQYWdlKHBhZ2VfaW5kZXgpOwotCWlmKCFwUGFnZURpY3QpCi0JCXJldHVybiBOVUxMOwotCUNQREZfQXJyYXkqIHBNZWRpYUJveEFycmF5ID0gbmV3IENQREZfQXJyYXk7Ci0JcE1lZGlhQm94QXJyYXktPkFkZChuZXcgQ1BERl9OdW1iZXIoMCkpOwotCXBNZWRpYUJveEFycmF5LT5BZGQobmV3IENQREZfTnVtYmVyKDApKTsKLQlwTWVkaWFCb3hBcnJheS0+QWRkKG5ldyBDUERGX051bWJlcihGWF9GTE9BVCh3aWR0aCkpKTsKLQlwTWVkaWFCb3hBcnJheS0+QWRkKG5ldyBDUERGX051bWJlcihGWF9GTE9BVChoZWlnaHQpKSk7CisgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcERvYy0+Q3JlYXRlTmV3UGFnZShwYWdlX2luZGV4KTsKKyAgaWYgKCFwUGFnZURpY3QpCisgICAgcmV0dXJuIE5VTEw7CisgIENQREZfQXJyYXkqIHBNZWRpYUJveEFycmF5ID0gbmV3IENQREZfQXJyYXk7CisgIHBNZWRpYUJveEFycmF5LT5BZGQobmV3IENQREZfTnVtYmVyKDApKTsKKyAgcE1lZGlhQm94QXJyYXktPkFkZChuZXcgQ1BERl9OdW1iZXIoMCkpOworICBwTWVkaWFCb3hBcnJheS0+QWRkKG5ldyBDUERGX051bWJlcihGWF9GTE9BVCh3aWR0aCkpKTsKKyAgcE1lZGlhQm94QXJyYXktPkFkZChuZXcgQ1BERl9OdW1iZXIoRlhfRkxPQVQoaGVpZ2h0KSkpOwogCi0JcFBhZ2VEaWN0LT5TZXRBdCgiTWVkaWFCb3giLCBwTWVkaWFCb3hBcnJheSk7Ci0JcFBhZ2VEaWN0LT5TZXRBdCgiUm90YXRlIiwgbmV3IENQREZfTnVtYmVyKDApKTsKLQlwUGFnZURpY3QtPlNldEF0KCJSZXNvdXJjZXMiLCBuZXcgQ1BERl9EaWN0aW9uYXJ5KTsKKyAgcFBhZ2VEaWN0LT5TZXRBdCgiTWVkaWFCb3giLCBwTWVkaWFCb3hBcnJheSk7CisgIHBQYWdlRGljdC0+U2V0QXQoIlJvdGF0ZSIsIG5ldyBDUERGX051bWJlcigwKSk7CisgIHBQYWdlRGljdC0+U2V0QXQoIlJlc291cmNlcyIsIG5ldyBDUERGX0RpY3Rpb25hcnkpOwogCi0JQ1BERl9QYWdlKiBwUGFnZSA9IG5ldyBDUERGX1BhZ2U7Ci0JcFBhZ2UtPkxvYWQocERvYyxwUGFnZURpY3QpOwotCXBQYWdlLT5QYXJzZUNvbnRlbnQoKTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBDUERGWEZBX1BhZ2UqIHBQYWdlID0KKyAgICAgIG5ldyBDUERGWEZBX1BhZ2UoKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50LCBwYWdlX2luZGV4KTsKKyAgcFBhZ2UtPkxvYWRQREZQYWdlKHBQYWdlRGljdCk7CisjZWxzZSAgIC8vIFBERl9FTkFCTEVfWEZBCisgIENQREZfUGFnZSogcFBhZ2UgPSBuZXcgQ1BERl9QYWdlOworICBwUGFnZS0+TG9hZChwRG9jLCBwUGFnZURpY3QpOworICBwUGFnZS0+UGFyc2VDb250ZW50KCk7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKLQlyZXR1cm4gcFBhZ2U7CisgIHJldHVybiBwUGFnZTsKIH0KIAotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZQYWdlX0dldFJvdGF0aW9uKEZQREZfUEFHRSBwYWdlKQotewotCUNQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlOwotCWlmICghcFBhZ2UgfHwgIXBQYWdlLT5tX3BGb3JtRGljdCB8fCAhcFBhZ2UtPm1fcEZvcm1EaWN0LT5LZXlFeGlzdCgiVHlwZSIpIHx8ICFwUGFnZS0+bV9wRm9ybURpY3QtPkdldEVsZW1lbnQoIlR5cGUiKS0+R2V0RGlyZWN0KCkKLQkJfHwgcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRFbGVtZW50KCJUeXBlIiktPkdldERpcmVjdCgpLT5HZXRTdHJpbmcoKS5Db21wYXJlKCJQYWdlIikpCi0JewotCQlyZXR1cm4gLTE7Ci0JfQotCUNQREZfRGljdGlvbmFyeSogcERpY3QgPSBwUGFnZS0+bV9wRm9ybURpY3Q7CitETExFWFBPUlQgaW50IFNURENBTEwgRlBERlBhZ2VfR2V0Um90YXRpb24oRlBERl9QQUdFIHBhZ2UpIHsKKyAgQ1BERl9QYWdlKiBwUGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2UpOworICBpZiAoIXBQYWdlIHx8ICFwUGFnZS0+bV9wRm9ybURpY3QgfHwgIXBQYWdlLT5tX3BGb3JtRGljdC0+S2V5RXhpc3QoIlR5cGUiKSB8fAorICAgICAgIXBQYWdlLT5tX3BGb3JtRGljdC0+R2V0RWxlbWVudCgiVHlwZSIpLT5HZXREaXJlY3QoKSB8fAorICAgICAgcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRFbGVtZW50KCJUeXBlIiktPkdldERpcmVjdCgpLT5HZXRTdHJpbmcoKS5Db21wYXJlKAorICAgICAgICAgICJQYWdlIikpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBQYWdlLT5tX3BGb3JtRGljdDsKKyAgaWYgKCFwRGljdCkKKyAgICByZXR1cm4gLTE7CiAKLQlpbnQgcm90YXRlID0gMDsKLQlpZihwRGljdCAhPSBOVUxMKQotCXsKLQkJaWYgKHBEaWN0LT5LZXlFeGlzdCgiUm90YXRlIikpCi0JCQlyb3RhdGUgPSBwRGljdC0+R2V0RWxlbWVudCgiUm90YXRlIiktPkdldERpcmVjdCgpPyBwRGljdC0+R2V0RWxlbWVudCgiUm90YXRlIiktPkdldERpcmVjdCgpLT5HZXRJbnRlZ2VyKCkgLyA5MCA6IDA7Ci0JCWVsc2UKLQkJewotCQkJaWYocERpY3QtPktleUV4aXN0KCJQYXJlbnQiKSkKLQkJCXsKLQkJCQlDUERGX0RpY3Rpb25hcnkqIHBQYWdlcyA9IChDUERGX0RpY3Rpb25hcnkqKXBEaWN0LT5HZXRFbGVtZW50KCJQYXJlbnQiKS0+R2V0RGlyZWN0KCk7Ci0JCQkJd2hpbGUocFBhZ2VzKQotCQkJCXsKLQkJCQkJaWYocFBhZ2VzLT5LZXlFeGlzdCgiUm90YXRlIikpCi0JCQkJCXsKLQkJCQkJCXJvdGF0ZSA9IHBQYWdlcy0+R2V0RWxlbWVudCgiUm90YXRlIiktPkdldERpcmVjdCgpPyBwUGFnZXMtPkdldEVsZW1lbnQoIlJvdGF0ZSIpLT5HZXREaXJlY3QoKS0+R2V0SW50ZWdlcigpIC8gOTAgOiAwOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZihwUGFnZXMtPktleUV4aXN0KCJQYXJlbnQiKSkKLQkJCQkJCXBQYWdlcyA9IChDUERGX0RpY3Rpb25hcnkqKXBQYWdlcy0+R2V0RWxlbWVudCgiUGFyZW50IiktPkdldERpcmVjdCgpOwotCQkJCQllbHNlIGJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JewotCQlyZXR1cm4gLTE7Ci0JfQotCQotCXJldHVybiByb3RhdGU7CisgIHdoaWxlIChwRGljdCkgeworICAgIGlmIChwRGljdC0+S2V5RXhpc3QoIlJvdGF0ZSIpKSB7CisgICAgICBDUERGX09iamVjdCogcFJvdGF0ZU9iaiA9IHBEaWN0LT5HZXRFbGVtZW50KCJSb3RhdGUiKS0+R2V0RGlyZWN0KCk7CisgICAgICByZXR1cm4gcFJvdGF0ZU9iaiA/IHBSb3RhdGVPYmotPkdldEludGVnZXIoKSAvIDkwIDogMDsKKyAgICB9CisgICAgaWYgKCFwRGljdC0+S2V5RXhpc3QoIlBhcmVudCIpKQorICAgICAgYnJlYWs7CisKKyAgICBwRGljdCA9IFRvRGljdGlvbmFyeShwRGljdC0+R2V0RWxlbWVudCgiUGFyZW50IiktPkdldERpcmVjdCgpKTsKKyAgfQorCisgIHJldHVybiAwOwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlX0luc2VydE9iamVjdChGUERGX1BBR0UgcGFnZSwgRlBERl9QQUdFT0JKRUNUIHBhZ2Vfb2JqKQotewotCUNQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlOwotCWlmICghcFBhZ2UgfHwgIXBQYWdlLT5tX3BGb3JtRGljdCB8fCAhcFBhZ2UtPm1fcEZvcm1EaWN0LT5LZXlFeGlzdCgiVHlwZSIpIHx8ICFwUGFnZS0+bV9wRm9ybURpY3QtPkdldEVsZW1lbnQoIlR5cGUiKS0+R2V0RGlyZWN0KCkKLQkJfHwgcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRFbGVtZW50KCJUeXBlIiktPkdldERpcmVjdCgpLT5HZXRTdHJpbmcoKS5Db21wYXJlKCJQYWdlIikpCi0JewotCQlyZXR1cm47Ci0JfQotCUNQREZfUGFnZU9iamVjdCogcFBhZ2VPYmogPSAoQ1BERl9QYWdlT2JqZWN0KilwYWdlX29iajsKLQlpZihwUGFnZU9iaiA9PSBOVUxMKQotCQlyZXR1cm47Ci0JRlhfUE9TSVRJT04gTGFzdFBlcnNpdGlvbiA9IHBQYWdlLT5HZXRMYXN0T2JqZWN0UG9zaXRpb24oKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VfSW5zZXJ0T2JqZWN0KEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFT0JKRUNUIHBhZ2Vfb2JqKSB7CisgIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlKTsKKyAgaWYgKCFwUGFnZSB8fCAhcFBhZ2UtPm1fcEZvcm1EaWN0IHx8ICFwUGFnZS0+bV9wRm9ybURpY3QtPktleUV4aXN0KCJUeXBlIikgfHwKKyAgICAgICFwUGFnZS0+bV9wRm9ybURpY3QtPkdldEVsZW1lbnQoIlR5cGUiKS0+R2V0RGlyZWN0KCkgfHwKKyAgICAgIHBQYWdlLT5tX3BGb3JtRGljdC0+R2V0RWxlbWVudCgiVHlwZSIpLT5HZXREaXJlY3QoKS0+R2V0U3RyaW5nKCkuQ29tcGFyZSgKKyAgICAgICAgICAiUGFnZSIpKSB7CisgICAgcmV0dXJuOworICB9CisgIENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmogPSAoQ1BERl9QYWdlT2JqZWN0KilwYWdlX29iajsKKyAgaWYgKCFwUGFnZU9iaikKKyAgICByZXR1cm47CisgIEZYX1BPU0lUSU9OIExhc3RQZXJzaXRpb24gPSBwUGFnZS0+R2V0TGFzdE9iamVjdFBvc2l0aW9uKCk7CiAKLQlwUGFnZS0+SW5zZXJ0T2JqZWN0KExhc3RQZXJzaXRpb24sIHBQYWdlT2JqKTsKLQlzd2l0Y2gocFBhZ2VPYmotPm1fVHlwZSkKLQl7Ci0JY2FzZSBGUERGX1BBR0VPQkpfUEFUSDoKLQkJewotCQkJQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiA9IChDUERGX1BhdGhPYmplY3QqKXBQYWdlT2JqOwotCQkJcFBhdGhPYmotPkNhbGNCb3VuZGluZ0JveCgpOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEZQREZfUEFHRU9CSl9URVhUOgotCQl7Ci0JCQkvLwlDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqID0gKENQREZfUGF0aE9iamVjdCopcFBhZ2VPYmo7Ci0JCQkvLwlwUGF0aE9iai0+Q2FsY0JvdW5kaW5nQm94KCk7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgRlBERl9QQUdFT0JKX0lNQUdFOgotCQl7Ci0JCQlDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmogPSAoQ1BERl9JbWFnZU9iamVjdCopcFBhZ2VPYmo7Ci0JCQlwSW1hZ2VPYmotPkNhbGNCb3VuZGluZ0JveCgpOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIEZQREZfUEFHRU9CSl9TSEFESU5HOgotCQl7Ci0JCQlDUERGX1NoYWRpbmdPYmplY3QqIHBTaGFkaW5nT2JqID0gKENQREZfU2hhZGluZ09iamVjdCopcFBhZ2VPYmo7Ci0JCQlwU2hhZGluZ09iai0+Q2FsY0JvdW5kaW5nQm94KCk7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgRlBERl9QQUdFT0JKX0ZPUk06Ci0JCXsKLQkJCUNQREZfRm9ybU9iamVjdCogcEZvcm1PYmogPSAoQ1BERl9Gb3JtT2JqZWN0KilwUGFnZU9iajsKLQkJCXBGb3JtT2JqLT5DYWxjQm91bmRpbmdCb3goKTsKLQkJCWJyZWFrOwotCQl9Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JLy8JcFBhZ2UtPlBhcnNlQ29udGVudCgpOwotCS8vcFBhZ2UtPkdlbmVyYXRlQ29udGVudCgpOwotCisgIHBQYWdlLT5JbnNlcnRPYmplY3QoTGFzdFBlcnNpdGlvbiwgcFBhZ2VPYmopOworICBzd2l0Y2ggKHBQYWdlT2JqLT5tX1R5cGUpIHsKKyAgICBjYXNlIEZQREZfUEFHRU9CSl9QQVRIOiB7CisgICAgICBDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqID0gKENQREZfUGF0aE9iamVjdCopcFBhZ2VPYmo7CisgICAgICBwUGF0aE9iai0+Q2FsY0JvdW5kaW5nQm94KCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGUERGX1BBR0VPQkpfVEVYVDogeworICAgICAgLy8JQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiA9IChDUERGX1BhdGhPYmplY3QqKXBQYWdlT2JqOworICAgICAgLy8JcFBhdGhPYmotPkNhbGNCb3VuZGluZ0JveCgpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRlBERl9QQUdFT0JKX0lNQUdFOiB7CisgICAgICBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmogPSAoQ1BERl9JbWFnZU9iamVjdCopcFBhZ2VPYmo7CisgICAgICBwSW1hZ2VPYmotPkNhbGNCb3VuZGluZ0JveCgpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRlBERl9QQUdFT0JKX1NIQURJTkc6IHsKKyAgICAgIENQREZfU2hhZGluZ09iamVjdCogcFNoYWRpbmdPYmogPSAoQ1BERl9TaGFkaW5nT2JqZWN0KilwUGFnZU9iajsKKyAgICAgIHBTaGFkaW5nT2JqLT5DYWxjQm91bmRpbmdCb3goKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZQREZfUEFHRU9CSl9GT1JNOiB7CisgICAgICBDUERGX0Zvcm1PYmplY3QqIHBGb3JtT2JqID0gKENQREZfRm9ybU9iamVjdCopcFBhZ2VPYmo7CisgICAgICBwRm9ybU9iai0+Q2FsY0JvdW5kaW5nQm94KCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CiB9CiAKLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGUGFnZV9Db3VudE9iamVjdChGUERGX1BBR0UgcGFnZSkKLXsKLQlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKLQlpZiAoIXBQYWdlIHx8ICFwUGFnZS0+bV9wRm9ybURpY3QgfHwgIXBQYWdlLT5tX3BGb3JtRGljdC0+S2V5RXhpc3QoIlR5cGUiKSB8fCAhcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRFbGVtZW50KCJUeXBlIiktPkdldERpcmVjdCgpCi0JCXx8IHBQYWdlLT5tX3BGb3JtRGljdC0+R2V0RWxlbWVudCgiVHlwZSIpLT5HZXREaXJlY3QoKS0+R2V0U3RyaW5nKCkuQ29tcGFyZSgiUGFnZSIpKQotCXsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gcFBhZ2UtPkNvdW50T2JqZWN0cygpOwotLy8JcmV0dXJuIDA7CitETExFWFBPUlQgaW50IFNURENBTEwgRlBERlBhZ2VfQ291bnRPYmplY3QoRlBERl9QQUdFIHBhZ2UpIHsKKyAgQ1BERl9QYWdlKiBwUGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2UpOworICBpZiAoIXBQYWdlIHx8ICFwUGFnZS0+bV9wRm9ybURpY3QgfHwgIXBQYWdlLT5tX3BGb3JtRGljdC0+S2V5RXhpc3QoIlR5cGUiKSB8fAorICAgICAgIXBQYWdlLT5tX3BGb3JtRGljdC0+R2V0RWxlbWVudCgiVHlwZSIpLT5HZXREaXJlY3QoKSB8fAorICAgICAgcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRFbGVtZW50KCJUeXBlIiktPkdldERpcmVjdCgpLT5HZXRTdHJpbmcoKS5Db21wYXJlKAorICAgICAgICAgICJQYWdlIikpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIHBQYWdlLT5Db3VudE9iamVjdHMoKTsKIH0KIAotRExMRVhQT1JUIEZQREZfUEFHRU9CSkVDVCBTVERDQUxMIEZQREZQYWdlX0dldE9iamVjdChGUERGX1BBR0UgcGFnZSwgaW50IGluZGV4KQotewotCUNQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlOwotCWlmICghcFBhZ2UgfHwgIXBQYWdlLT5tX3BGb3JtRGljdCB8fCAhcFBhZ2UtPm1fcEZvcm1EaWN0LT5LZXlFeGlzdCgiVHlwZSIpCi0JCXx8IHBQYWdlLT5tX3BGb3JtRGljdC0+R2V0RWxlbWVudCgiVHlwZSIpLT5HZXREaXJlY3QoKS0+R2V0U3RyaW5nKCkuQ29tcGFyZSgiUGFnZSIpKQotCXsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBwUGFnZS0+R2V0T2JqZWN0QnlJbmRleChpbmRleCk7Ci0vLwlyZXR1cm4gTlVMTDsKK0RMTEVYUE9SVCBGUERGX1BBR0VPQkpFQ1QgU1REQ0FMTCBGUERGUGFnZV9HZXRPYmplY3QoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgeworICBDUERGX1BhZ2UqIHBQYWdlID0gQ1BERlBhZ2VGcm9tRlBERlBhZ2UocGFnZSk7CisgIGlmICghcFBhZ2UgfHwgIXBQYWdlLT5tX3BGb3JtRGljdCB8fCAhcFBhZ2UtPm1fcEZvcm1EaWN0LT5LZXlFeGlzdCgiVHlwZSIpIHx8CisgICAgICBwUGFnZS0+bV9wRm9ybURpY3QtPkdldEVsZW1lbnQoIlR5cGUiKS0+R2V0RGlyZWN0KCktPkdldFN0cmluZygpLkNvbXBhcmUoCisgICAgICAgICAgIlBhZ2UiKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBwUGFnZS0+R2V0T2JqZWN0QnlJbmRleChpbmRleCk7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9IYXNUcmFuc3BhcmVuY3koRlBERl9QQUdFIHBhZ2UpCi17Ci0JaWYoIXBhZ2UpIHJldHVybiBGQUxTRTsKLQlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKLQotCXJldHVybiBwUGFnZS0+QmFja2dyb3VuZEFscGhhTmVlZGVkKCk7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VfSGFzVHJhbnNwYXJlbmN5KEZQREZfUEFHRSBwYWdlKSB7CisgIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlKTsKKyAgcmV0dXJuIHBQYWdlICYmIHBQYWdlLT5CYWNrZ3JvdW5kQWxwaGFOZWVkZWQoKTsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZQYWdlT2JqX0hhc1RyYW5zcGFyZW5jeShGUERGX1BBR0VPQkpFQ1QgcGFnZU9iamVjdCkKLXsKLQlpZighcGFnZU9iamVjdCkgcmV0dXJuIEZBTFNFOwotCUNQREZfUGFnZU9iamVjdCogcFBhZ2VPYmogPSAoQ1BERl9QYWdlT2JqZWN0KilwYWdlT2JqZWN0OworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMCitGUERGUGFnZU9ial9IYXNUcmFuc3BhcmVuY3koRlBERl9QQUdFT0JKRUNUIHBhZ2VPYmplY3QpIHsKKyAgaWYgKCFwYWdlT2JqZWN0KQorICAgIHJldHVybiBGQUxTRTsKKyAgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiA9IChDUERGX1BhZ2VPYmplY3QqKXBhZ2VPYmplY3Q7CiAKLQljb25zdCBDUERGX0dlbmVyYWxTdGF0ZURhdGEqIHBHZW5lcmFsU3RhdGUgPSBwUGFnZU9iai0+bV9HZW5lcmFsU3RhdGU7Ci0JaW50IGJsZW5kX3R5cGUgPSBwR2VuZXJhbFN0YXRlID8gcEdlbmVyYWxTdGF0ZS0+bV9CbGVuZFR5cGUgOiBGWERJQl9CTEVORF9OT1JNQUw7Ci0JaWYgKGJsZW5kX3R5cGUgIT0gRlhESUJfQkxFTkRfTk9STUFMKSByZXR1cm4gVFJVRTsKKyAgY29uc3QgQ1BERl9HZW5lcmFsU3RhdGVEYXRhKiBwR2VuZXJhbFN0YXRlID0gcFBhZ2VPYmotPm1fR2VuZXJhbFN0YXRlOworICBpbnQgYmxlbmRfdHlwZSA9CisgICAgICBwR2VuZXJhbFN0YXRlID8gcEdlbmVyYWxTdGF0ZS0+bV9CbGVuZFR5cGUgOiBGWERJQl9CTEVORF9OT1JNQUw7CisgIGlmIChibGVuZF90eXBlICE9IEZYRElCX0JMRU5EX05PUk1BTCkKKyAgICByZXR1cm4gVFJVRTsKIAotCUNQREZfRGljdGlvbmFyeSogcFNNYXNrRGljdCA9IHBHZW5lcmFsU3RhdGUgPyAoQ1BERl9EaWN0aW9uYXJ5KilwR2VuZXJhbFN0YXRlLT5tX3BTb2Z0TWFzayA6IE5VTEw7Ci0JaWYocFNNYXNrRGljdCkgcmV0dXJuIFRSVUU7CisgIENQREZfRGljdGlvbmFyeSogcFNNYXNrRGljdCA9CisgICAgICBwR2VuZXJhbFN0YXRlID8gVG9EaWN0aW9uYXJ5KHBHZW5lcmFsU3RhdGUtPm1fcFNvZnRNYXNrKSA6IE5VTEw7CisgIGlmIChwU01hc2tEaWN0KQorICAgIHJldHVybiBUUlVFOwogCi0JaWYocEdlbmVyYWxTdGF0ZSAmJiBwR2VuZXJhbFN0YXRlLT5tX0ZpbGxBbHBoYSAhPSAxLjBmKQotCQlyZXR1cm4gVFJVRTsKKyAgaWYgKHBHZW5lcmFsU3RhdGUgJiYgcEdlbmVyYWxTdGF0ZS0+bV9GaWxsQWxwaGEgIT0gMS4wZikKKyAgICByZXR1cm4gVFJVRTsKIAotCWlmKHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9QQVRIKQotCXsKLQkJaWYocEdlbmVyYWxTdGF0ZSAmJiBwR2VuZXJhbFN0YXRlLT5tX1N0cm9rZUFscGhhICE9IDEuMGYpCi0JCQlyZXR1cm4gVFJVRTsKLQl9CisgIGlmIChwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfUEFUSCkgeworICAgIGlmIChwR2VuZXJhbFN0YXRlICYmIHBHZW5lcmFsU3RhdGUtPm1fU3Ryb2tlQWxwaGEgIT0gMS4wZikKKyAgICAgIHJldHVybiBUUlVFOworICB9CiAKLQlpZihwUGFnZU9iai0+bV9UeXBlID09IFBERlBBR0VfRk9STSkKLQl7Ci0JCUNQREZfRm9ybU9iamVjdCogcEZvcm1PYmogPSAoQ1BERl9Gb3JtT2JqZWN0KilwUGFnZU9iajsKLQkJaWYocEZvcm1PYmotPm1fcEZvcm0gJiYgKHBGb3JtT2JqLT5tX3BGb3JtLT5tX1RyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0lTT0xBVEVEKSkKLQkJCXJldHVybiBUUlVFOwotCQlpZihwRm9ybU9iai0+bV9wRm9ybSAmJiAoIShwRm9ybU9iai0+bV9wRm9ybS0+bV9UcmFuc3BhcmVuY3kgJiBQREZUUkFOU19JU09MQVRFRCkgJiYgKHBGb3JtT2JqLT5tX3BGb3JtLT5tX1RyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0dST1VQKSkpCi0JCQlyZXR1cm4gVFJVRTsKLQl9Ci0JcmV0dXJuIEZBTFNFOworICBpZiAocFBhZ2VPYmotPm1fVHlwZSA9PSBQREZQQUdFX0ZPUk0pIHsKKyAgICBDUERGX0Zvcm1PYmplY3QqIHBGb3JtT2JqID0gKENQREZfRm9ybU9iamVjdCopcFBhZ2VPYmo7CisgICAgaWYgKHBGb3JtT2JqLT5tX3BGb3JtICYmCisgICAgICAgIChwRm9ybU9iai0+bV9wRm9ybS0+bV9UcmFuc3BhcmVuY3kgJiBQREZUUkFOU19JU09MQVRFRCkpCisgICAgICByZXR1cm4gVFJVRTsKKyAgICBpZiAocEZvcm1PYmotPm1fcEZvcm0gJiYKKyAgICAgICAgKCEocEZvcm1PYmotPm1fcEZvcm0tPm1fVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQpICYmCisgICAgICAgICAocEZvcm1PYmotPm1fcEZvcm0tPm1fVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfR1JPVVApKSkKKyAgICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZQYWdlX0dlbmVyYXRlQ29udGVudChGUERGX1BBR0UgcGFnZSkKLXsKLQlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKLQlpZiAoIXBQYWdlIHx8ICFwUGFnZS0+bV9wRm9ybURpY3QgfHwgIXBQYWdlLT5tX3BGb3JtRGljdC0+S2V5RXhpc3QoIlR5cGUiKSB8fCAhcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRFbGVtZW50KCJUeXBlIiktPkdldERpcmVjdCgpCi0JCXx8IHBQYWdlLT5tX3BGb3JtRGljdC0+R2V0RWxlbWVudCgiVHlwZSIpLT5HZXREaXJlY3QoKS0+R2V0U3RyaW5nKCkuQ29tcGFyZSgiUGFnZSIpKQotCXsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQlDUERGX1BhZ2VDb250ZW50R2VuZXJhdGUgQ0cocFBhZ2UpOwotCUNHLkdlbmVyYXRlQ29udGVudCgpOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZQYWdlX0dlbmVyYXRlQ29udGVudChGUERGX1BBR0UgcGFnZSkgeworICBDUERGX1BhZ2UqIHBQYWdlID0gQ1BERlBhZ2VGcm9tRlBERlBhZ2UocGFnZSk7CisgIGlmICghcFBhZ2UgfHwgIXBQYWdlLT5tX3BGb3JtRGljdCB8fCAhcFBhZ2UtPm1fcEZvcm1EaWN0LT5LZXlFeGlzdCgiVHlwZSIpIHx8CisgICAgICAhcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRFbGVtZW50KCJUeXBlIiktPkdldERpcmVjdCgpIHx8CisgICAgICBwUGFnZS0+bV9wRm9ybURpY3QtPkdldEVsZW1lbnQoIlR5cGUiKS0+R2V0RGlyZWN0KCktPkdldFN0cmluZygpLkNvbXBhcmUoCisgICAgICAgICAgIlBhZ2UiKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDUERGX1BhZ2VDb250ZW50R2VuZXJhdGUgQ0cocFBhZ2UpOworICBDRy5HZW5lcmF0ZUNvbnRlbnQoKTsKIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAogRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZU9ial9UcmFuc2Zvcm0oRlBERl9QQUdFT0JKRUNUIHBhZ2Vfb2JqZWN0LAotCQkJIGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlIGMsIGRvdWJsZSBkLCBkb3VibGUgZSwgZG91YmxlIGYpICAKLXsKLQlDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqID0gKENQREZfUGFnZU9iamVjdCopcGFnZV9vYmplY3Q7Ci0JaWYocFBhZ2VPYmogPT0gTlVMTCkKLQkJcmV0dXJuOwotCUNGWF9BZmZpbmVNYXRyaXggbWF0cml4KChGWF9GTE9BVClhLChGWF9GTE9BVCliLChGWF9GTE9BVCljLChGWF9GTE9BVClkLChGWF9GTE9BVCllLChGWF9GTE9BVClmKTsKLQlwUGFnZU9iai0+VHJhbnNmb3JtKG1hdHJpeCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGYpIHsKKyAgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiA9IChDUERGX1BhZ2VPYmplY3QqKXBhZ2Vfb2JqZWN0OworICBpZiAoIXBQYWdlT2JqKQorICAgIHJldHVybjsKKworICBDRlhfTWF0cml4IG1hdHJpeCgoRlhfRkxPQVQpYSwgKEZYX0ZMT0FUKWIsIChGWF9GTE9BVCljLCAoRlhfRkxPQVQpZCwKKyAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWUsIChGWF9GTE9BVClmKTsKKyAgcFBhZ2VPYmotPlRyYW5zZm9ybShtYXRyaXgpOwogfQogRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9UcmFuc2Zvcm1Bbm5vdHMoRlBERl9QQUdFIHBhZ2UsCi0JCQkJCQkJCQkJCSAgIGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlIGMsIGRvdWJsZSBkLCBkb3VibGUgZSwgZG91YmxlIGYpCi17Ci0JaWYocGFnZSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2U7Ci0JQ1BERl9Bbm5vdExpc3QgQW5ub3RMaXN0KHBQYWdlKTsKLQlmb3IgKGludCBpPTA7IGk8QW5ub3RMaXN0LkNvdW50KCk7aSsrKQotCXsKLQkJQ1BERl9Bbm5vdCogcEFubm90ID0gQW5ub3RMaXN0LkdldEF0KGkpOwotCQkvLyB0cmFuc2Zvcm1Bbm5vdHMgUmVjdGFuZ2xlCi0JCUNQREZfUmVjdCByZWN0OwotCQlwQW5ub3QtPkdldFJlY3QocmVjdCk7Ci0JCUNGWF9BZmZpbmVNYXRyaXggbWF0cml4KChGWF9GTE9BVClhLChGWF9GTE9BVCliLChGWF9GTE9BVCljLChGWF9GTE9BVClkLChGWF9GTE9BVCllLChGWF9GTE9BVClmKTsKLQkJcmVjdC5UcmFuc2Zvcm0oJm1hdHJpeCk7Ci0JCUNQREZfQXJyYXkgKnBSZWN0QXJyYXkgPSBOVUxMOwotCQlwUmVjdEFycmF5ID0gcEFubm90LT5tX3BBbm5vdERpY3QtPkdldEFycmF5KCJSZWN0Iik7Ci0JCWlmICghcFJlY3RBcnJheSkgcFJlY3RBcnJheT1DUERGX0FycmF5OjpDcmVhdGUoKTsKLQkJcFJlY3RBcnJheS0+U2V0QXQoMCwgbmV3IENQREZfTnVtYmVyKHJlY3QubGVmdCkpOwotCQlwUmVjdEFycmF5LT5TZXRBdCgxLCBuZXcgQ1BERl9OdW1iZXIocmVjdC5ib3R0b20pKTsKLQkJcFJlY3RBcnJheS0+U2V0QXQoMiwgbmV3IENQREZfTnVtYmVyKHJlY3QucmlnaHQpKTsKLQkJcFJlY3RBcnJheS0+U2V0QXQoMywgbmV3IENQREZfTnVtYmVyKHJlY3QudG9wKSk7Ci0JCXBBbm5vdC0+bV9wQW5ub3REaWN0LT5TZXRBdCgiUmVjdCIscFJlY3RBcnJheSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGYpIHsKKyAgQ1BERl9QYWdlKiBwUGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2UpOworICBpZiAoIXBQYWdlKQorICAgIHJldHVybjsKKyAgQ1BERl9Bbm5vdExpc3QgQW5ub3RMaXN0KHBQYWdlKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBbm5vdExpc3QuQ291bnQoKTsgKytpKSB7CisgICAgQ1BERl9Bbm5vdCogcEFubm90ID0gQW5ub3RMaXN0LkdldEF0KGkpOworICAgIC8vIHRyYW5zZm9ybUFubm90cyBSZWN0YW5nbGUKKyAgICBDUERGX1JlY3QgcmVjdDsKKyAgICBwQW5ub3QtPkdldFJlY3QocmVjdCk7CisgICAgQ0ZYX01hdHJpeCBtYXRyaXgoKEZYX0ZMT0FUKWEsIChGWF9GTE9BVCliLCAoRlhfRkxPQVQpYywgKEZYX0ZMT0FUKWQsCisgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWUsIChGWF9GTE9BVClmKTsKKyAgICByZWN0LlRyYW5zZm9ybSgmbWF0cml4KTsKKyAgICBDUERGX0FycmF5KiBwUmVjdEFycmF5ID0gTlVMTDsKKyAgICBwUmVjdEFycmF5ID0gcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0QXJyYXkoIlJlY3QiKTsKKyAgICBpZiAoIXBSZWN0QXJyYXkpCisgICAgICBwUmVjdEFycmF5ID0gbmV3IENQREZfQXJyYXk7CisgICAgcFJlY3RBcnJheS0+U2V0QXQoMCwgbmV3IENQREZfTnVtYmVyKHJlY3QubGVmdCkpOworICAgIHBSZWN0QXJyYXktPlNldEF0KDEsIG5ldyBDUERGX051bWJlcihyZWN0LmJvdHRvbSkpOworICAgIHBSZWN0QXJyYXktPlNldEF0KDIsIG5ldyBDUERGX051bWJlcihyZWN0LnJpZ2h0KSk7CisgICAgcFJlY3RBcnJheS0+U2V0QXQoMywgbmV3IENQREZfTnVtYmVyKHJlY3QudG9wKSk7CisgICAgcEFubm90LT5HZXRBbm5vdERpY3QoKS0+U2V0QXQoIlJlY3QiLCBwUmVjdEFycmF5KTsKIAotCQkvL1RyYW5zZm9ybSBBUCdzIHJlY3RhbmdsZQotCQkvL1RvIERvCi0JfQotCisgICAgLy8gVHJhbnNmb3JtIEFQJ3MgcmVjdGFuZ2xlCisgICAgLy8gVG8gRG8KKyAgfQogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlX1NldFJvdGF0aW9uKEZQREZfUEFHRSBwYWdlLCBpbnQgcm90YXRlKQotewotCUNQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlOwotCWlmICghcFBhZ2UgfHwgIXBQYWdlLT5tX3BGb3JtRGljdCB8fCAhcFBhZ2UtPm1fcEZvcm1EaWN0LT5LZXlFeGlzdCgiVHlwZSIpIHx8ICFwUGFnZS0+bV9wRm9ybURpY3QtPkdldEVsZW1lbnQoIlR5cGUiKS0+R2V0RGlyZWN0KCkKLQkJfHwgcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRFbGVtZW50KCJUeXBlIiktPkdldERpcmVjdCgpLT5HZXRTdHJpbmcoKS5Db21wYXJlKCJQYWdlIikpCi0JewotCQlyZXR1cm47Ci0JfQotCUNQREZfRGljdGlvbmFyeSogcERpY3QgPSBwUGFnZS0+bV9wRm9ybURpY3Q7Ci0Jcm90YXRlICU9NDsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VfU2V0Um90YXRpb24oRlBERl9QQUdFIHBhZ2UsIGludCByb3RhdGUpIHsKKyAgQ1BERl9QYWdlKiBwUGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2UpOworICBpZiAoIXBQYWdlIHx8ICFwUGFnZS0+bV9wRm9ybURpY3QgfHwgIXBQYWdlLT5tX3BGb3JtRGljdC0+S2V5RXhpc3QoIlR5cGUiKSB8fAorICAgICAgIXBQYWdlLT5tX3BGb3JtRGljdC0+R2V0RWxlbWVudCgiVHlwZSIpLT5HZXREaXJlY3QoKSB8fAorICAgICAgcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRFbGVtZW50KCJUeXBlIiktPkdldERpcmVjdCgpLT5HZXRTdHJpbmcoKS5Db21wYXJlKAorICAgICAgICAgICJQYWdlIikpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBQYWdlLT5tX3BGb3JtRGljdDsKKyAgcm90YXRlICU9IDQ7CiAKLQlwRGljdC0+U2V0QXQoIlJvdGF0ZSIsIG5ldyBDUERGX051bWJlcihyb3RhdGUgKiA5MCkpOworICBwRGljdC0+U2V0QXQoIlJvdGF0ZSIsIG5ldyBDUERGX051bWJlcihyb3RhdGUgKiA5MCkpOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZmV4dF9lbWJlZGRlcnRlc3QuY3BwIGIvZnBkZnNkay9zcmMvZnBkZmV4dF9lbWJlZGRlcnRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMjhjMjkKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL3NyYy9mcGRmZXh0X2VtYmVkZGVydGVzdC5jcHAKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAicHVibGljL2ZwZGZfZXh0LmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiCisjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKK2NsYXNzIEZQREZFeHRFbWJlZGRlcnRlc3QgOiBwdWJsaWMgRW1iZWRkZXJUZXN0IHt9OworCitURVNUX0YoRlBERkV4dEVtYmVkZGVydGVzdCwgUGFnZU1vZGVVbmtub3duKSB7CisgIEVYUEVDVF9FUShQQUdFTU9ERV9VTktOT1dOLCBGUERGRG9jX0dldFBhZ2VNb2RlKG51bGxwdHIpKTsKK30KKworVEVTVF9GKEZQREZFeHRFbWJlZGRlcnRlc3QsIFBhZ2VNb2RlVXNlTm9uZSkgeworICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoImhlbGxvX3dvcmxkLnBkZiIpKTsKKyAgRVhQRUNUX0VRKFBBR0VNT0RFX1VTRU5PTkUsIEZQREZEb2NfR2V0UGFnZU1vZGUoZG9jdW1lbnQoKSkpOworfQorCitURVNUX0YoRlBERkV4dEVtYmVkZGVydGVzdCwgUGFnZU1vZGVVc2VPdXRsaW5lcykgeworICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoInVzZV9vdXRsaW5lcy5wZGYiKSk7CisgIEVYUEVDVF9FUShQQUdFTU9ERV9VU0VPVVRMSU5FUywgRlBERkRvY19HZXRQYWdlTW9kZShkb2N1bWVudCgpKSk7Cit9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmZm9ybWZpbGwuY3BwIGIvZnBkZnNkay9zcmMvZnBkZmZvcm1maWxsLmNwcAppbmRleCAzMDQyMjZmLi5iODcwZDM4IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmZm9ybWZpbGwuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZmb3JtZmlsbC5jcHAKQEAgLTEsNDIzICsxLDc0MyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vcHVibGljL2ZwZGZfZm9ybWZpbGwuaCIKLSNpbmNsdWRlICIuLi8uLi9wdWJsaWMvZnBkZnZpZXcuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX21nci5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2Zvcm1maWxsLmgiCiAKKyNpbmNsdWRlIDxtZW1vcnk+CiAKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnNka19kZWZpbmUuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnNka19tZ3IuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZnZpZXcuaCIKIAorI2lmZGVmIFBERl9FTkFCTEVfWEZBCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9hcHAuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2RvYy5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfcGFnZS5oIgorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBEUGFnZV9IYXNGb3JtRmllbGRBdFBvaW50KEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLCBGUERGX1BBR0UgcGFnZSxkb3VibGUgcGFnZV94LCBkb3VibGUgcGFnZV95KQotewotCWlmKCFwYWdlIHx8ICFoSGFuZGxlKQotCQlyZXR1cm4gLTE7Ci0JQ1BERl9QYWdlICogcFBhZ2UgPSAoQ1BERl9QYWdlKikgcGFnZTsKK25hbWVzcGFjZSB7CiAKLQlDUERGX0ludGVyRm9ybSAqIHBJbnRlckZvcm0gPSBOVUxMOwotCXBJbnRlckZvcm0gPSBuZXcgQ1BERl9JbnRlckZvcm0ocFBhZ2UtPm1fcERvY3VtZW50LEZBTFNFKTsKLQlpZiAoIXBJbnRlckZvcm0pCi0JCXJldHVybiAtMTsKLQlDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBwSW50ZXJGb3JtLT5HZXRDb250cm9sQXRQb2ludChwUGFnZSwgKEZYX0ZMT0FUKXBhZ2VfeCwgKEZYX0ZMT0FUKXBhZ2VfeSk7Ci0JaWYoIXBGb3JtQ3RybCkKLQl7Ci0JCWRlbGV0ZSBwSW50ZXJGb3JtOwotCQlyZXR1cm4gLTE7Ci0JfQotCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gcEZvcm1DdHJsLT5HZXRGaWVsZCgpOwotCWlmKCFwRm9ybUZpZWxkKQotCXsKLQkJZGVsZXRlIHBJbnRlckZvcm07Ci0JCXJldHVybiAtMTsKLQl9Ci0JCi0JaW50IG5UeXBlID0gcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCk7Ci0JZGVsZXRlIHBJbnRlckZvcm07Ci0JcmV0dXJuIG5UeXBlOworQ1BERlNES19Eb2N1bWVudCogRm9ybUhhbmRsZVRvU0RLRG9jKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKSB7CisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSAoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZTsKKyAgcmV0dXJuIHBFbnYgPyBwRW52LT5HZXRTREtEb2N1bWVudCgpIDogbnVsbHB0cjsKIH0KIAotRExMRVhQT1JUIEZQREZfRk9STUhBTkRMRSBTVERDQUxMIEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9GT1JNRklMTElORk8qIGZvcm1JbmZvKQotewotCWlmKCFkb2N1bWVudCB8fCAhZm9ybUluZm8gfHwgZm9ybUluZm8tPnZlcnNpb24hPTEpCi0JCXJldHVybiBOVUxMOwotCUNQREZfRG9jdW1lbnQgKiBwRG9jdW1lbnQgPSAoQ1BERl9Eb2N1bWVudCopIGRvY3VtZW50OwotIAlDUERGRG9jX0Vudmlyb25tZW50ICogcEVudiA9IE5VTEw7Ci0JcEVudiA9IG5ldyBDUERGRG9jX0Vudmlyb25tZW50KHBEb2N1bWVudCk7Ci0JaWYgKCFwRW52KQotCQlyZXR1cm4gTlVMTDsKLQlwRW52LT5SZWdBcHBIYW5kbGUoZm9ybUluZm8pOwotCi0JaWYocEVudi0+R2V0UERGRG9jdW1lbnQoKSkKLQl7Ci0JCUNQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBuZXcgQ1BERlNES19Eb2N1bWVudChwRW52LT5HZXRQREZEb2N1bWVudCgpLCBwRW52KTsKLQkJaWYocFNES0RvYykKLQkJCXBFbnYtPlNldEN1cnJlbnREb2MocFNES0RvYyk7Ci0JfQotCXJldHVybiBwRW52OworQ1BERlNES19JbnRlckZvcm0qIEZvcm1IYW5kbGVUb0ludGVyRm9ybShGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSkgeworICBDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gRm9ybUhhbmRsZVRvU0RLRG9jKGhIYW5kbGUpOworICByZXR1cm4gcFNES0RvYyA/IHBTREtEb2MtPkdldEludGVyRm9ybSgpIDogbnVsbHB0cjsKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGRE9DX0V4aXRGb3JtRmlsbEVudmlyb25tZW50KEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKQotewotCWlmKCFoSGFuZGxlKQotCQlyZXR1cm47IAotCUNQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSAoKENQREZEb2NfRW52aXJvbm1lbnQqKWhIYW5kbGUpLT5HZXRDdXJyZW50RG9jKCk7Ci0JaWYocFNES0RvYykKLQl7Ci0JCSgoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZSktPlNldEN1cnJlbnREb2MoTlVMTCk7Ci0JCWRlbGV0ZSBwU0RLRG9jOwotCX0KLQlkZWxldGUgKENQREZEb2NfRW52aXJvbm1lbnQqKWhIYW5kbGU7Ci0JaEhhbmRsZSA9IE5VTEw7CitDUERGU0RLX1BhZ2VWaWV3KiBGb3JtSGFuZGxlVG9QYWdlVmlldyhGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlKSB7CisgIFVuZGVybHlpbmdQYWdlVHlwZSogcFBhZ2UgPSBVbmRlcmx5aW5nRnJvbUZQREZQYWdlKHBhZ2UpOworICBpZiAoIXBQYWdlKQorICAgIHJldHVybiBudWxscHRyOworCisgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBGb3JtSGFuZGxlVG9TREtEb2MoaEhhbmRsZSk7CisgIHJldHVybiBwU0RLRG9jID8gcFNES0RvYy0+R2V0UGFnZVZpZXcocFBhZ2UsIFRSVUUpIDogbnVsbHB0cjsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25Nb3VzZU1vdmUoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsIEZQREZfUEFHRSBwYWdlLCBpbnQgbW9kaWZpZXIsIGRvdWJsZSBwYWdlX3gsIGRvdWJsZSBwYWdlX3kpCi17CQotCWlmICghaEhhbmRsZSB8fCAhcGFnZSkKLQkJcmV0dXJuIEZBTFNFOwotLy8gCUNQREZfUGFnZSAqIHBQYWdlID0gKENQREZfUGFnZSopIHBhZ2U7Ci0vLyAJQ1BERl9Eb2N1bWVudCAqIHBEb2MgPSBwUGFnZS0+bV9wRG9jdW1lbnQ7Ci0vLwlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gKENQREZEb2NfRW52aXJvbm1lbnQqKWhIYW5kbGU7Ci0JQ1BERlNES19Eb2N1bWVudCogcEZYRG9jID0gKChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlKS0+R2V0Q3VycmVudERvYygpOwotCWlmKCFwRlhEb2MpCi0JCXJldHVybiBGQUxTRTsKLQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwRlhEb2MtPkdldFBhZ2VWaWV3KChDUERGX1BhZ2UqKXBhZ2UpOwotCWlmKCFwUGFnZVZpZXcpCi0JCXJldHVybiBGQUxTRTsKLQkKLS8vIAlkb3VibGUgcGFnZV94ID0gMDsKLS8vIAlkb3VibGUgcGFnZV95ID0gMDsKLS8vCXBFbnYtPkZGSV9EZXZpY2VUb1BhZ2UocGFnZSwgcG9pbnRfeCwgcG9pbnRfeSwgJnBhZ2VfeCwgJnBhZ2VfeSk7Ci0JQ1BERl9Qb2ludCBwdCgoRlhfRkxPQVQpcGFnZV94LCAoRlhfRkxPQVQpcGFnZV95KTsKLQlyZXR1cm4gcFBhZ2VWaWV3LT5Pbk1vdXNlTW92ZShwdCwgbW9kaWZpZXIpOworfSAgLy8gbmFtZXNwYWNlCisKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGUGFnZV9IYXNGb3JtRmllbGRBdFBvaW50KEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSkgeworICBpZiAoIWhIYW5kbGUpCisgICAgcmV0dXJuIC0xOworICBDUERGX1BhZ2UqIHBQYWdlID0gQ1BERlBhZ2VGcm9tRlBERlBhZ2UocGFnZSk7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgaWYgKHBQYWdlKSB7CisgICAgQ1BERl9JbnRlckZvcm0gaW50ZXJmb3JtKHBQYWdlLT5tX3BEb2N1bWVudCwgRkFMU0UpOworICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IGludGVyZm9ybS5HZXRDb250cm9sQXRQb2ludCgKKyAgICAgICAgcFBhZ2UsIChGWF9GTE9BVClwYWdlX3gsIChGWF9GTE9BVClwYWdlX3ksIG51bGxwdHIpOworICAgIGlmICghcEZvcm1DdHJsKQorICAgICAgcmV0dXJuIC0xOworCisgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBwRm9ybUN0cmwtPkdldEZpZWxkKCk7CisgICAgaWYgKCFwRm9ybUZpZWxkKQorICAgICAgcmV0dXJuIC0xOworCisgICAgaW50IG5UeXBlID0gcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCk7CisgICAgcmV0dXJuIG5UeXBlOworICB9CisKKyAgSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3ID0gKChDUERGWEZBX1BhZ2UqKXBhZ2UpLT5HZXRYRkFQYWdlVmlldygpOworICBpZiAocFBhZ2VWaWV3KSB7CisgICAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IE5VTEw7CisgICAgSVhGQV9Eb2NWaWV3KiBwRG9jVmlldyA9IHBQYWdlVmlldy0+R2V0RG9jVmlldygpOworICAgIGlmICghcERvY1ZpZXcpCisgICAgICByZXR1cm4gLTE7CisKKyAgICBwV2lkZ2V0SGFuZGxlciA9IHBEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCk7CisgICAgaWYgKCFwV2lkZ2V0SGFuZGxlcikKKyAgICAgIHJldHVybiAtMTsKKworICAgIElYRkFfV2lkZ2V0KiBwWEZBQW5ub3QgPSBOVUxMOworICAgIElYRkFfV2lkZ2V0SXRlcmF0b3IqIHBXaWRnZXRJdGVyYXRvciA9IHBQYWdlVmlldy0+Q3JlYXRlV2lkZ2V0SXRlcmF0b3IoCisgICAgICAgIFhGQV9UUkFWRVJTRVdBWV9Gb3JtLAorICAgICAgICBYRkFfV0lER0VURklMVEVSX1ZpZXdhYmxlIHwgWEZBX1dJREdFVEZJTFRFUl9BbGxUeXBlKTsKKyAgICBpZiAoIXBXaWRnZXRJdGVyYXRvcikKKyAgICAgIHJldHVybiAtMTsKKyAgICBwWEZBQW5ub3QgPSBwV2lkZ2V0SXRlcmF0b3ItPk1vdmVUb05leHQoKTsKKyAgICB3aGlsZSAocFhGQUFubm90KSB7CisgICAgICBDRlhfUmVjdEYgcmNCQm94OworICAgICAgcFdpZGdldEhhbmRsZXItPkdldEJCb3gocFhGQUFubm90LCByY0JCb3gsIDApOworICAgICAgQ0ZYX0Zsb2F0UmVjdCByY1dpZGdldChyY0JCb3gubGVmdCwgcmNCQm94LnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LmxlZnQgKyByY0JCb3gud2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC50b3AgKyByY0JCb3guaGVpZ2h0KTsKKyAgICAgIHJjV2lkZ2V0LmxlZnQgLT0gMS4wZjsKKyAgICAgIHJjV2lkZ2V0LnJpZ2h0ICs9IDEuMGY7CisgICAgICByY1dpZGdldC5ib3R0b20gLT0gMS4wZjsKKyAgICAgIHJjV2lkZ2V0LnRvcCArPSAxLjBmOworCisgICAgICBpZiAocmNXaWRnZXQuQ29udGFpbnMoc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHBhZ2VfeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHBhZ2VfeSkpKSB7CisgICAgICAgIHBXaWRnZXRJdGVyYXRvci0+UmVsZWFzZSgpOworICAgICAgICByZXR1cm4gRlBERl9GT1JNRklFTERfWEZBOworICAgICAgfQorICAgICAgcFhGQUFubm90ID0gcFdpZGdldEl0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7CisgICAgfQorCisgICAgcFdpZGdldEl0ZXJhdG9yLT5SZWxlYXNlKCk7CisgIH0KKyAgcmV0dXJuIC0xOworI2Vsc2UgICAvLyBQREZfRU5BQkxFX1hGQQorICBpZiAoIXBQYWdlKQorICAgIHJldHVybiAtMTsKKyAgQ1BERl9JbnRlckZvcm0gaW50ZXJmb3JtKHBQYWdlLT5tX3BEb2N1bWVudCwgRkFMU0UpOworICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBpbnRlcmZvcm0uR2V0Q29udHJvbEF0UG9pbnQoCisgICAgICBwUGFnZSwgKEZYX0ZMT0FUKXBhZ2VfeCwgKEZYX0ZMT0FUKXBhZ2VfeSwgbnVsbHB0cik7CisgIGlmICghcEZvcm1DdHJsKQorICAgIHJldHVybiAtMTsKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBwRm9ybUN0cmwtPkdldEZpZWxkKCk7CisgIHJldHVybiBwRm9ybUZpZWxkID8gcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgOiAtMTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25MQnV0dG9uRG93bihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwgRlBERl9QQUdFIHBhZ2UsIGludCBtb2RpZmllciwgZG91YmxlIHBhZ2VfeCwgZG91YmxlIHBhZ2VfeSkKLXsKLQlpZiAoIWhIYW5kbGUgfHwgIXBhZ2UpCi0JCXJldHVybiBGQUxTRTsKLQlDUERGU0RLX0RvY3VtZW50KiBwRlhEb2MgPSAoKENQREZEb2NfRW52aXJvbm1lbnQqKWhIYW5kbGUpLT5HZXRDdXJyZW50RG9jKCk7Ci0JaWYoIXBGWERvYykKLQkJcmV0dXJuIEZBTFNFOwotCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBGWERvYy0+R2V0UGFnZVZpZXcoKENQREZfUGFnZSopcGFnZSk7Ci0JaWYoIXBQYWdlVmlldykKLQkJcmV0dXJuIEZBTFNFOwotLy8gCWRvdWJsZSBwYWdlX3ggPSAwOwotLy8gCWRvdWJsZSBwYWdlX3kgPSAwOwotLy8gCXBFbnYtPkZGSV9EZXZpY2VUb1BhZ2UocGFnZSwgcG9pbnRfeCwgcG9pbnRfeSwgJnBhZ2VfeCwgJnBhZ2VfeSk7Ci0JQ1BERl9Qb2ludCBwdCgoRlhfRkxPQVQpcGFnZV94LCAoRlhfRkxPQVQpcGFnZV95KTsKLSAJcmV0dXJuIHBQYWdlVmlldy0+T25MQnV0dG9uRG93bihwdCwgbW9kaWZpZXIpOworRExMRVhQT1JUIGludCBTVERDQUxMIEZQRFBhZ2VfSGFzRm9ybUZpZWxkQXRQb2ludChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpIHsKKyAgcmV0dXJuIEZQREZQYWdlX0hhc0Zvcm1GaWVsZEF0UG9pbnQoaEhhbmRsZSwgcGFnZSwgcGFnZV94LCBwYWdlX3kpOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PbkxCdXR0b25VcChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwgRlBERl9QQUdFIHBhZ2UsIGludCBtb2RpZmllciwgZG91YmxlIHBhZ2VfeCwgZG91YmxlIHBhZ2VfeSkKLXsKLQlpZiAoIWhIYW5kbGUgfHwgIXBhZ2UpCi0JCXJldHVybiBGQUxTRTsKLQlDUERGU0RLX0RvY3VtZW50KiBwRlhEb2MgPSAoKENQREZEb2NfRW52aXJvbm1lbnQqKWhIYW5kbGUpLT5HZXRDdXJyZW50RG9jKCk7Ci0JaWYoIXBGWERvYykKLQkJcmV0dXJuIEZBTFNFOwotCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBGWERvYy0+R2V0UGFnZVZpZXcoKENQREZfUGFnZSopcGFnZSk7Ci0JaWYoIXBQYWdlVmlldykKLQkJcmV0dXJuIEZBTFNFOwotLy8gCWRvdWJsZSBwYWdlX3ggPSAwOwotLy8gCWRvdWJsZSBwYWdlX3kgPSAwOwotLy8gCXBFbnYtPkZGSV9EZXZpY2VUb1BhZ2UocGFnZSwgcG9pbnRfeCwgcG9pbnRfeSwgJnBhZ2VfeCwgJnBhZ2VfeSk7Ci0JQ1BERl9Qb2ludCBwdCgoRlhfRkxPQVQpcGFnZV94LCAoRlhfRkxPQVQpcGFnZV95KTsKLQlyZXR1cm4gcFBhZ2VWaWV3LT5PbkxCdXR0b25VcChwdCwgbW9kaWZpZXIpOworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZQYWdlX0Zvcm1GaWVsZFpPcmRlckF0UG9pbnQoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV95KSB7CisgIGlmICghaEhhbmRsZSkKKyAgICByZXR1cm4gLTE7CisgIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlKTsKKyAgaWYgKCFwUGFnZSkKKyAgICByZXR1cm4gLTE7CisgIENQREZfSW50ZXJGb3JtIGludGVyZm9ybShwUGFnZS0+bV9wRG9jdW1lbnQsIEZBTFNFKTsKKyAgaW50IHpfb3JkZXIgPSAtMTsKKyAgKHZvaWQpaW50ZXJmb3JtLkdldENvbnRyb2xBdFBvaW50KHBQYWdlLCAoRlhfRkxPQVQpcGFnZV94LCAoRlhfRkxPQVQpcGFnZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnpfb3JkZXIpOworICByZXR1cm4gel9vcmRlcjsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25LZXlEb3duKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLCBGUERGX1BBR0UgcGFnZSwgaW50IG5LZXlDb2RlLCBpbnQgbW9kaWZpZXIpCi17Ci0JaWYgKCFoSGFuZGxlIHx8ICFwYWdlKQotCQlyZXR1cm4gRkFMU0U7Ci0JQ1BERlNES19Eb2N1bWVudCogcEZYRG9jID0gKChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlKS0+R2V0Q3VycmVudERvYygpOwotCWlmKCFwRlhEb2MpCi0JCXJldHVybiBGQUxTRTsKLQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwRlhEb2MtPkdldFBhZ2VWaWV3KChDUERGX1BhZ2UqKXBhZ2UpOwotCWlmKCFwUGFnZVZpZXcpCi0JCXJldHVybiBGQUxTRTsKLQkKLQkKLQlyZXR1cm4gcFBhZ2VWaWV3LT5PbktleURvd24obktleUNvZGUsIG1vZGlmaWVyKTsKK0RMTEVYUE9SVCBGUERGX0ZPUk1IQU5ETEUgU1REQ0FMTAorRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZPUk1GSUxMSU5GTyogZm9ybUluZm8pIHsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBjb25zdCBpbnQga1JlcXVpcmVkVmVyc2lvbiA9IDI7CisjZWxzZSAgIC8vIFBERl9FTkFCTEVfWEZBCisgIGNvbnN0IGludCBrUmVxdWlyZWRWZXJzaW9uID0gMTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgaWYgKCFmb3JtSW5mbyB8fCBmb3JtSW5mby0+dmVyc2lvbiAhPSBrUmVxdWlyZWRWZXJzaW9uKQorICAgIHJldHVybiBudWxscHRyOworCisgIFVuZGVybHlpbmdEb2N1bWVudFR5cGUqIHBEb2N1bWVudCA9IFVuZGVybHlpbmdGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KTsKKyAgaWYgKCFwRG9jdW1lbnQpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG5ldyBDUERGRG9jX0Vudmlyb25tZW50KHBEb2N1bWVudCwgZm9ybUluZm8pOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIHBFbnYtPlNldFNES0RvY3VtZW50KHBEb2N1bWVudC0+R2V0U0RLRG9jdW1lbnQocEVudikpOworICBDUERGWEZBX0FwcCogcEFwcCA9IENQREZYRkFfQXBwOjpHZXRJbnN0YW5jZSgpOworICBwQXBwLT5BZGRGb3JtRmlsbEVudihwRW52KTsKKyNlbHNlICAvLyBQREZfRU5BQkxFX1hGQQorICBwRW52LT5TZXRTREtEb2N1bWVudChuZXcgQ1BERlNES19Eb2N1bWVudChwRG9jdW1lbnQsIHBFbnYpKTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgcmV0dXJuIHBFbnY7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uS2V5VXAoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsIEZQREZfUEFHRSBwYWdlLCBpbnQgbktleUNvZGUsIGludCBtb2RpZmllcikKLXsKLQlpZiAoIWhIYW5kbGUgfHwgIXBhZ2UpCi0JCXJldHVybiBGQUxTRTsKLQlDUERGU0RLX0RvY3VtZW50KiBwRlhEb2MgPSAoKENQREZEb2NfRW52aXJvbm1lbnQqKWhIYW5kbGUpLT5HZXRDdXJyZW50RG9jKCk7Ci0JaWYoIXBGWERvYykKLQkJcmV0dXJuIEZBTFNFOwotCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBGWERvYy0+R2V0UGFnZVZpZXcoKENQREZfUGFnZSopcGFnZSk7Ci0JaWYoIXBQYWdlVmlldykKLQkJcmV0dXJuIEZBTFNFOwotCQotCQotCXJldHVybiBwUGFnZVZpZXctPk9uS2V5VXAobktleUNvZGUsIG1vZGlmaWVyKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwKK0ZQREZET0NfRXhpdEZvcm1GaWxsRW52aXJvbm1lbnQoRlBERl9GT1JNSEFORExFIGhIYW5kbGUpIHsKKyAgaWYgKCFoSGFuZGxlKQorICAgIHJldHVybjsKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIENQREZYRkFfQXBwKiBwQXBwID0gQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCk7CisgIHBBcHAtPlJlbW92ZUZvcm1GaWxsRW52KHBFbnYpOworI2Vsc2UgICAvLyBQREZfRU5BQkxFX1hGQQorICBpZiAoQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9IHBFbnYtPkdldFNES0RvY3VtZW50KCkpIHsKKyAgICBwRW52LT5TZXRTREtEb2N1bWVudChOVUxMKTsKKyAgICBkZWxldGUgcFNES0RvYzsKKyAgfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICBkZWxldGUgcEVudjsKIH0KIAorRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25Nb3VzZU1vdmUoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV95KSB7CisgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEZvcm1IYW5kbGVUb1BhZ2VWaWV3KGhIYW5kbGUsIHBhZ2UpOworICBpZiAoIXBQYWdlVmlldykKKyAgICByZXR1cm4gRkFMU0U7CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uQ2hhcihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwgRlBERl9QQUdFIHBhZ2UsIGludCBuQ2hhciwgIGludCBtb2RpZmllcikKLXsKLQlpZiAoIWhIYW5kbGUgfHwgIXBhZ2UpCi0JCXJldHVybiBGQUxTRTsKLQlDUERGU0RLX0RvY3VtZW50KiBwRlhEb2MgPSAoKENQREZEb2NfRW52aXJvbm1lbnQqKWhIYW5kbGUpLT5HZXRDdXJyZW50RG9jKCk7Ci0JaWYoIXBGWERvYykKLQkJcmV0dXJuIEZBTFNFOwotCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBGWERvYy0+R2V0UGFnZVZpZXcoKENQREZfUGFnZSopcGFnZSk7Ci0JaWYoIXBQYWdlVmlldykKLQkJcmV0dXJuIEZBTFNFOwotCXJldHVybiBwUGFnZVZpZXctPk9uQ2hhcihuQ2hhciwgbW9kaWZpZXIpOwotCisgIENQREZfUG9pbnQgcHQoKEZYX0ZMT0FUKXBhZ2VfeCwgKEZYX0ZMT0FUKXBhZ2VfeSk7CisgIHJldHVybiBwUGFnZVZpZXctPk9uTW91c2VNb3ZlKHB0LCBtb2RpZmllcik7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX0ZvcmNlVG9LaWxsRm9jdXMoRlBERl9GT1JNSEFORExFIGhIYW5kbGUpCi17Ci0JaWYoIWhIYW5kbGUpCi0JCXJldHVybiBGQUxTRTsKLQlDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gKChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlKS0+R2V0Q3VycmVudERvYygpOwotCWlmKCFwU0RLRG9jKQotCQlyZXR1cm4gRkFMU0U7Ci0JLy9LaWxsIHRoZSBjdXJyZW50IGZvY3VzLiAKLQlyZXR1cm4gcFNES0RvYy0+S2lsbEZvY3VzQW5ub3QoMCk7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PbkxCdXR0b25Eb3duKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV95KSB7CisgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEZvcm1IYW5kbGVUb1BhZ2VWaWV3KGhIYW5kbGUsIHBhZ2UpOworICBpZiAoIXBQYWdlVmlldykKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ1BERl9Qb2ludCBwdCgoRlhfRkxPQVQpcGFnZV94LCAoRlhfRkxPQVQpcGFnZV95KTsKKyAgcmV0dXJuIHBQYWdlVmlldy0+T25MQnV0dG9uRG93bihwdCwgbW9kaWZpZXIpOwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfRkZMRHJhdyhGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwgRlBERl9CSVRNQVAgYml0bWFwLCBGUERGX1BBR0UgcGFnZSwgaW50IHN0YXJ0X3gsIGludCBzdGFydF95LCAKLQkJCQkJCQkJCQkJCSAgaW50IHNpemVfeCwgaW50IHNpemVfeSwgaW50IHJvdGF0ZSwgaW50IGZsYWdzKQotewotCWlmICghaEhhbmRsZSB8fCAhcGFnZSkKLQkJcmV0dXJuIDsKLQlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKLQkKLQlDUERGX1JlbmRlck9wdGlvbnMgb3B0aW9uczsKLQlpZiAoZmxhZ3MgJiBGUERGX0xDRF9URVhUKQotCQlvcHRpb25zLm1fRmxhZ3MgfD0gUkVOREVSX0NMRUFSVFlQRTsKLQllbHNlCi0JCW9wdGlvbnMubV9GbGFncyAmPSB+UkVOREVSX0NMRUFSVFlQRTsKLQkKLQkvL0dyYXlzY2FsZSBvdXRwdXQKLQlpZiAoZmxhZ3MgJiBGUERGX0dSQVlTQ0FMRSkKLQl7Ci0JCW9wdGlvbnMubV9Db2xvck1vZGUgPSBSRU5ERVJfQ09MT1JfR1JBWTsKLQkJb3B0aW9ucy5tX0ZvcmVDb2xvciA9IDA7Ci0JCW9wdGlvbnMubV9CYWNrQ29sb3IgPSAweGZmZmZmZjsKLQl9CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PbkxCdXR0b25VcChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpIHsKKyAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gRm9ybUhhbmRsZVRvUGFnZVZpZXcoaEhhbmRsZSwgcGFnZSk7CisgIGlmICghcFBhZ2VWaWV3KQorICAgIHJldHVybiBGQUxTRTsKIAotCW9wdGlvbnMubV9BZGRGbGFncyA9IGZsYWdzID4+IDg7Ci0Jb3B0aW9ucy5tX3BPQ0NvbnRleHQgPSBuZXcgQ1BERl9PQ0NvbnRleHQocFBhZ2UtPm1fcERvY3VtZW50KTsKKyAgQ1BERl9Qb2ludCBwdCgoRlhfRkxPQVQpcGFnZV94LCAoRlhfRkxPQVQpcGFnZV95KTsKKyAgcmV0dXJuIHBQYWdlVmlldy0+T25MQnV0dG9uVXAocHQsIG1vZGlmaWVyKTsKK30KIAotCUNGWF9BZmZpbmVNYXRyaXggbWF0cml4OwotCXBQYWdlLT5HZXREaXNwbGF5TWF0cml4KG1hdHJpeCwgc3RhcnRfeCwgc3RhcnRfeSwgc2l6ZV94LCBzaXplX3ksIHJvdGF0ZSk7IAotCQotCUZYX1JFQ1QgY2xpcDsKLQljbGlwLmxlZnQgPSBzdGFydF94OwotCWNsaXAucmlnaHQgPSBzdGFydF94ICsgc2l6ZV94OwotCWNsaXAudG9wID0gc3RhcnRfeTsKLQljbGlwLmJvdHRvbSA9IHN0YXJ0X3kgKyBzaXplX3k7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uUkJ1dHRvbkRvd24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpIHsKKyAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gRm9ybUhhbmRsZVRvUGFnZVZpZXcoaEhhbmRsZSwgcGFnZSk7CisgIGlmICghcFBhZ2VWaWV3KQorICAgIHJldHVybiBGQUxTRTsKKworICBDUERGX1BvaW50IHB0KChGWF9GTE9BVClwYWdlX3gsIChGWF9GTE9BVClwYWdlX3kpOworICByZXR1cm4gcFBhZ2VWaWV3LT5PblJCdXR0b25Eb3duKHB0LCBtb2RpZmllcik7Cit9CisKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uUkJ1dHRvblVwKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSkgeworICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBGb3JtSGFuZGxlVG9QYWdlVmlldyhoSGFuZGxlLCBwYWdlKTsKKyAgaWYgKCFwUGFnZVZpZXcpCisgICAgcmV0dXJuIEZBTFNFOworCisgIENQREZfUG9pbnQgcHQoKEZYX0ZMT0FUKXBhZ2VfeCwgKEZYX0ZMT0FUKXBhZ2VfeSk7CisgIHJldHVybiBwUGFnZVZpZXctPk9uUkJ1dHRvblVwKHB0LCBtb2RpZmllcik7Cit9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uS2V5RG93bihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbktleUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyKSB7CisgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEZvcm1IYW5kbGVUb1BhZ2VWaWV3KGhIYW5kbGUsIHBhZ2UpOworICBpZiAoIXBQYWdlVmlldykKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIHBQYWdlVmlldy0+T25LZXlEb3duKG5LZXlDb2RlLCBtb2RpZmllcik7Cit9CisKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uS2V5VXAoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbktleUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllcikgeworICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBGb3JtSGFuZGxlVG9QYWdlVmlldyhoSGFuZGxlLCBwYWdlKTsKKyAgaWYgKCFwUGFnZVZpZXcpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBwUGFnZVZpZXctPk9uS2V5VXAobktleUNvZGUsIG1vZGlmaWVyKTsKK30KKworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25DaGFyKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXIpIHsKKyAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gRm9ybUhhbmRsZVRvUGFnZVZpZXcoaEhhbmRsZSwgcGFnZSk7CisgIGlmICghcFBhZ2VWaWV3KQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gcFBhZ2VWaWV3LT5PbkNoYXIobkNoYXIsIG1vZGlmaWVyKTsKK30KKworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fRm9yY2VUb0tpbGxGb2N1cyhGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSkgeworICBDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gRm9ybUhhbmRsZVRvU0RLRG9jKGhIYW5kbGUpOworICBpZiAoIXBTREtEb2MpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiBwU0RLRG9jLT5LaWxsRm9jdXNBbm5vdCgwKTsKK30KKworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0ZGTERyYXcoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JJVE1BUCBiaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpIHsKKyAgaWYgKCFoSGFuZGxlKQorICAgIHJldHVybjsKKworICBVbmRlcmx5aW5nUGFnZVR5cGUqIHBQYWdlID0gVW5kZXJseWluZ0Zyb21GUERGUGFnZShwYWdlKTsKKyAgaWYgKCFwUGFnZSkKKyAgICByZXR1cm47CisKKyNpZm5kZWYgUERGX0VOQUJMRV9YRkEKKyAgQ1BERl9SZW5kZXJPcHRpb25zIG9wdGlvbnM7CisgIGlmIChmbGFncyAmIEZQREZfTENEX1RFWFQpCisgICAgb3B0aW9ucy5tX0ZsYWdzIHw9IFJFTkRFUl9DTEVBUlRZUEU7CisgIGVsc2UKKyAgICBvcHRpb25zLm1fRmxhZ3MgJj0gflJFTkRFUl9DTEVBUlRZUEU7CisgIC8vIEdyYXlzY2FsZSBvdXRwdXQKKyAgaWYgKGZsYWdzICYgRlBERl9HUkFZU0NBTEUpIHsKKyAgICBvcHRpb25zLm1fQ29sb3JNb2RlID0gUkVOREVSX0NPTE9SX0dSQVk7CisgICAgb3B0aW9ucy5tX0ZvcmVDb2xvciA9IDA7CisgICAgb3B0aW9ucy5tX0JhY2tDb2xvciA9IDB4ZmZmZmZmOworICB9CisgIG9wdGlvbnMubV9BZGRGbGFncyA9IGZsYWdzID4+IDg7CisgIG9wdGlvbnMubV9wT0NDb250ZXh0ID0gbmV3IENQREZfT0NDb250ZXh0KHBQYWdlLT5tX3BEb2N1bWVudCk7CisjZWxzZSAgIC8vIFBERl9FTkFCTEVfWEZBCisgIENQREZYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBQYWdlLT5HZXREb2N1bWVudCgpOworICBpZiAoIXBEb2N1bWVudCkKKyAgICByZXR1cm47CisgIENQREZfRG9jdW1lbnQqIHBQREZEb2MgPSBwRG9jdW1lbnQtPkdldFBERkRvYygpOworICBpZiAoIXBQREZEb2MpCisgICAgcmV0dXJuOworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gKENQREZEb2NfRW52aXJvbm1lbnQqKWhIYW5kbGU7CisgIENQREZTREtfRG9jdW1lbnQqIHBGWERvYyA9IHBFbnYtPkdldFNES0RvY3VtZW50KCk7CisgIGlmICghcEZYRG9jKQorICAgIHJldHVybjsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworICBDRlhfTWF0cml4IG1hdHJpeDsKKyAgcFBhZ2UtPkdldERpc3BsYXlNYXRyaXgobWF0cml4LCBzdGFydF94LCBzdGFydF95LCBzaXplX3gsIHNpemVfeSwgcm90YXRlKTsKKworICBGWF9SRUNUIGNsaXA7CisgIGNsaXAubGVmdCA9IHN0YXJ0X3g7CisgIGNsaXAucmlnaHQgPSBzdGFydF94ICsgc2l6ZV94OworICBjbGlwLnRvcCA9IHN0YXJ0X3k7CisgIGNsaXAuYm90dG9tID0gc3RhcnRfeSArIHNpemVfeTsKIAogI2lmZGVmIF9TS0lBX1NVUFBPUlRfCi0JQ0ZYX1NraWFEZXZpY2UqIHBEZXZpY2UgPSBuZXcgQ0ZYX1NraWFEZXZpY2U7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfU2tpYURldmljZT4gcERldmljZShuZXcgQ0ZYX1NraWFEZXZpY2UpOwogI2Vsc2UKLQlDRlhfRnhnZURldmljZSogcERldmljZSA9IG5ldyBDRlhfRnhnZURldmljZTsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWF9GeGdlRGV2aWNlPiBwRGV2aWNlKG5ldyBDRlhfRnhnZURldmljZSk7CiAjZW5kaWYKLQlwRGV2aWNlLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwKTsKLQlwRGV2aWNlLT5TYXZlU3RhdGUoKTsKLQlwRGV2aWNlLT5TZXRDbGlwX1JlY3QoJmNsaXApOworICBwRGV2aWNlLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwKTsKKyAgcERldmljZS0+U2F2ZVN0YXRlKCk7CisgIHBEZXZpY2UtPlNldENsaXBfUmVjdCgmY2xpcCk7CiAKLQlDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0ID0gbmV3IENQREZfUmVuZGVyQ29udGV4dDsKLQlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gKENQREZEb2NfRW52aXJvbm1lbnQqKWhIYW5kbGU7Ci0JQ1BERlNES19Eb2N1bWVudCogcEZYRG9jID0gcEVudi0+R2V0Q3VycmVudERvYygpOwotCWlmKCFwRlhEb2MpCi0JewotCQlkZWxldGUgcENvbnRleHQ7Ci0JCWRlbGV0ZSBwRGV2aWNlOwotCQlwQ29udGV4dCA9IE5VTEw7Ci0JCXBEZXZpY2UgPSBOVUxMOwotCQlyZXR1cm47Ci0JfQotCWlmKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBGWERvYy0+R2V0UGFnZVZpZXcocFBhZ2UpKQotCXsKLQkJcFBhZ2VWaWV3LT5QYWdlVmlld19PbkRyYXcocERldmljZSwgJm1hdHJpeCwgJm9wdGlvbnMpOwotCX0KLQlwRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKKyNpZm5kZWYgUERGX0VOQUJMRV9YRkEKKyAgaWYgKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEZvcm1IYW5kbGVUb1BhZ2VWaWV3KGhIYW5kbGUsIHBQYWdlKSkKKyAgICBwUGFnZVZpZXctPlBhZ2VWaWV3X09uRHJhdyhwRGV2aWNlLmdldCgpLCAmbWF0cml4LCAmb3B0aW9ucyk7CisjZWxzZSAgIC8vIFBERl9FTkFCTEVfWEZBCisgIENQREZfUmVuZGVyT3B0aW9ucyBvcHRpb25zOworICBpZiAoZmxhZ3MgJiBGUERGX0xDRF9URVhUKQorICAgIG9wdGlvbnMubV9GbGFncyB8PSBSRU5ERVJfQ0xFQVJUWVBFOworICBlbHNlCisgICAgb3B0aW9ucy5tX0ZsYWdzICY9IH5SRU5ERVJfQ0xFQVJUWVBFOwogCi0JaWYob3B0aW9ucy5tX3BPQ0NvbnRleHQpCi0JewotCQlkZWxldGUgb3B0aW9ucy5tX3BPQ0NvbnRleHQ7Ci0JCW9wdGlvbnMubV9wT0NDb250ZXh0ID0gTlVMTDsKLQl9Ci0JaWYocENvbnRleHQpCi0JewotCQlkZWxldGUgcENvbnRleHQ7Ci0JCXBDb250ZXh0ID0gTlVMTDsKLQl9Ci0JaWYocERldmljZSkKLQl7Ci0JCWRlbGV0ZSBwRGV2aWNlOwotCQlwRGV2aWNlID0gTlVMTDsKLQl9CisgIC8vIEdyYXlzY2FsZSBvdXRwdXQKKyAgaWYgKGZsYWdzICYgRlBERl9HUkFZU0NBTEUpIHsKKyAgICBvcHRpb25zLm1fQ29sb3JNb2RlID0gUkVOREVSX0NPTE9SX0dSQVk7CisgICAgb3B0aW9ucy5tX0ZvcmVDb2xvciA9IDA7CisgICAgb3B0aW9ucy5tX0JhY2tDb2xvciA9IDB4ZmZmZmZmOworICB9CisgIG9wdGlvbnMubV9BZGRGbGFncyA9IGZsYWdzID4+IDg7CisgIG9wdGlvbnMubV9wT0NDb250ZXh0ID0gbmV3IENQREZfT0NDb250ZXh0KHBQREZEb2MpOwogCisgIGlmIChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwRlhEb2MtPkdldFBhZ2VWaWV3KHBQYWdlKSkKKyAgICBwUGFnZVZpZXctPlBhZ2VWaWV3X09uRHJhdyhwRGV2aWNlLmdldCgpLCAmbWF0cml4LCAmb3B0aW9ucywgY2xpcCk7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKKyAgcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CisgIGRlbGV0ZSBvcHRpb25zLm1fcE9DQ29udGV4dDsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBvcHRpb25zLm1fcE9DQ29udGV4dCA9IE5VTEw7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiB9CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9TZXRGb3JtRmllbGRIaWdobGlnaHRDb2xvcihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwgaW50IGZpZWxkVHlwZSwgdW5zaWduZWQgbG9uZyBjb2xvcikKLXsKLQlpZiAoIWhIYW5kbGUpCi0JCXJldHVybjsKLS8vCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSAoQ1BERkRvY19FbnZpcm9ubWVudCogKWhIYW5kbGU7Ci0JQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9ICgoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZSktPkdldEN1cnJlbnREb2MoKTsKLQlpZihwU0RLRG9jKQotCXsKLQkJaWYoQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBwU0RLRG9jLT5HZXRJbnRlckZvcm0oKSkKLQkJewotCQkJcEludGVyRm9ybS0+U2V0SGlnaGxpZ2h0Q29sb3IoY29sb3IsIGZpZWxkVHlwZSk7Ci0JCX0KLQkKLQl9CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfVW5kbyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQpIHsKKyAgaWYgKE5VTEwgPT0gaFdpZGdldCB8fCBOVUxMID09IGRvY3VtZW50KQorICAgIHJldHVybjsKIAorICBDUERGWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSAoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQ7CisgIGlmIChwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9EeW5hbWljICYmCisgICAgICBwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9TdGF0aWMpCisgICAgcmV0dXJuOworCisgIElYRkFfTWVudUhhbmRsZXIqIHBYRkFNZW51SGFuZGVyID0KKyAgICAgIENQREZYRkFfQXBwOjpHZXRJbnN0YW5jZSgpLT5HZXRYRkFBcHAoKS0+R2V0TWVudUhhbmRsZXIoKTsKKyAgaWYgKHBYRkFNZW51SGFuZGVyID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIHBYRkFNZW51SGFuZGVyLT5VbmRvKChJWEZBX1dpZGdldCopaFdpZGdldCk7Cit9CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfV2lkZ2V0X1JlZG8oRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREdFVCBoV2lkZ2V0KSB7CisgIGlmIChOVUxMID09IGhXaWRnZXQgfHwgTlVMTCA9PSBkb2N1bWVudCkKKyAgICByZXR1cm47CisKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50OworICBpZiAocERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfRHluYW1pYyAmJgorICAgICAgcERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfU3RhdGljKQorICAgIHJldHVybjsKKworICBJWEZBX01lbnVIYW5kbGVyKiBwWEZBTWVudUhhbmRlciA9CisgICAgICBDUERGWEZBX0FwcDo6R2V0SW5zdGFuY2UoKS0+R2V0WEZBQXBwKCktPkdldE1lbnVIYW5kbGVyKCk7CisgIGlmIChwWEZBTWVudUhhbmRlciA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBwWEZBTWVudUhhbmRlci0+UmVkbygoSVhGQV9XaWRnZXQqKWhXaWRnZXQpOwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfU2V0Rm9ybUZpZWxkSGlnaGxpZ2h0QWxwaGEoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsIHVuc2lnbmVkIGNoYXIgYWxwaGEpCi17Ci0JaWYgKCFoSGFuZGxlKQotCQlyZXR1cm47Ci0JQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9ICgoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZSktPkdldEN1cnJlbnREb2MoKTsKLQlpZihwU0RLRG9jKQotCXsKLQkJaWYoQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBwU0RLRG9jLT5HZXRJbnRlckZvcm0oKSkKLQkJCXBJbnRlckZvcm0tPlNldEhpZ2hsaWdodEFscGhhKGFscGhhKTsKLQl9CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfV2lkZ2V0X1NlbGVjdEFsbChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURHRVQgaFdpZGdldCkgeworICBpZiAoTlVMTCA9PSBoV2lkZ2V0IHx8IE5VTEwgPT0gZG9jdW1lbnQpCisgICAgcmV0dXJuOworCisgIENQREZYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudDsKKyAgaWYgKHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IFhGQV9ET0NUWVBFX0R5bmFtaWMgJiYKKyAgICAgIHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IFhGQV9ET0NUWVBFX1N0YXRpYykKKyAgICByZXR1cm47CisKKyAgSVhGQV9NZW51SGFuZGxlciogcFhGQU1lbnVIYW5kZXIgPQorICAgICAgQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCktPkdldFhGQUFwcCgpLT5HZXRNZW51SGFuZGxlcigpOworICBpZiAocFhGQU1lbnVIYW5kZXIgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgcFhGQU1lbnVIYW5kZXItPlNlbGVjdEFsbCgoSVhGQV9XaWRnZXQqKWhXaWRnZXQpOworfQorRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9Db3B5KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURHRVQgaFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgd3NUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQqIHNpemUpIHsKKyAgaWYgKE5VTEwgPT0gaFdpZGdldCB8fCBOVUxMID09IGRvY3VtZW50KQorICAgIHJldHVybjsKKworICBDUERGWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSAoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQ7CisgIGlmIChwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9EeW5hbWljICYmCisgICAgICBwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9TdGF0aWMpCisgICAgcmV0dXJuOworCisgIElYRkFfTWVudUhhbmRsZXIqIHBYRkFNZW51SGFuZGVyID0KKyAgICAgIENQREZYRkFfQXBwOjpHZXRJbnN0YW5jZSgpLT5HZXRYRkFBcHAoKS0+R2V0TWVudUhhbmRsZXIoKTsKKyAgaWYgKHBYRkFNZW51SGFuZGVyID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIENGWF9XaWRlU3RyaW5nIHdzQ3BUZXh0OworICBwWEZBTWVudUhhbmRlci0+Q29weSgoSVhGQV9XaWRnZXQqKWhXaWRnZXQsIHdzQ3BUZXh0KTsKKworICBDRlhfQnl0ZVN0cmluZyBic0NwVGV4dCA9IHdzQ3BUZXh0LlVURjE2TEVfRW5jb2RlKCk7CisgIGludCBsZW4gPSBic0NwVGV4dC5HZXRMZW5ndGgoKSAvIHNpemVvZih1bnNpZ25lZCBzaG9ydCk7CisgIGlmICh3c1RleHQgPT0gTlVMTCkgeworICAgICpzaXplID0gbGVuOworICAgIHJldHVybjsKKyAgfQorCisgIGludCByZWFsX3NpemUgPSBsZW4gPCAqc2l6ZSA/IGxlbiA6ICpzaXplOworICBpZiAocmVhbF9zaXplID4gMCkgeworICAgIEZYU1lTX21lbWNweSgodm9pZCopd3NUZXh0LAorICAgICAgICAgICAgICAgICBic0NwVGV4dC5HZXRCdWZmZXIocmVhbF9zaXplICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSksCisgICAgICAgICAgICAgICAgIHJlYWxfc2l6ZSAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOworICAgIGJzQ3BUZXh0LlJlbGVhc2VCdWZmZXIocmVhbF9zaXplICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CisgIH0KKyAgKnNpemUgPSByZWFsX3NpemU7Cit9CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfV2lkZ2V0X0N1dChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURHRVQgaFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyB3c1RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RXT1JEKiBzaXplKSB7CisgIGlmIChOVUxMID09IGhXaWRnZXQgfHwgTlVMTCA9PSBkb2N1bWVudCkKKyAgICByZXR1cm47CisgIENQREZYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudDsKKyAgaWYgKHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IFhGQV9ET0NUWVBFX0R5bmFtaWMgJiYKKyAgICAgIHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IFhGQV9ET0NUWVBFX1N0YXRpYykKKyAgICByZXR1cm47CisKKyAgSVhGQV9NZW51SGFuZGxlciogcFhGQU1lbnVIYW5kZXIgPQorICAgICAgQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCktPkdldFhGQUFwcCgpLT5HZXRNZW51SGFuZGxlcigpOworICBpZiAocFhGQU1lbnVIYW5kZXIgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgQ0ZYX1dpZGVTdHJpbmcgd3NDcFRleHQ7CisgIHBYRkFNZW51SGFuZGVyLT5DdXQoKElYRkFfV2lkZ2V0KiloV2lkZ2V0LCB3c0NwVGV4dCk7CisKKyAgQ0ZYX0J5dGVTdHJpbmcgYnNDcFRleHQgPSB3c0NwVGV4dC5VVEYxNkxFX0VuY29kZSgpOworICBpbnQgbGVuID0gYnNDcFRleHQuR2V0TGVuZ3RoKCkgLyBzaXplb2YodW5zaWduZWQgc2hvcnQpOworICBpZiAod3NUZXh0ID09IE5VTEwpIHsKKyAgICAqc2l6ZSA9IGxlbjsKKyAgICByZXR1cm47CisgIH0KKworICBpbnQgcmVhbF9zaXplID0gbGVuIDwgKnNpemUgPyBsZW4gOiAqc2l6ZTsKKyAgaWYgKHJlYWxfc2l6ZSA+IDApIHsKKyAgICBGWFNZU19tZW1jcHkoKHZvaWQqKXdzVGV4dCwKKyAgICAgICAgICAgICAgICAgYnNDcFRleHQuR2V0QnVmZmVyKHJlYWxfc2l6ZSAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpLAorICAgICAgICAgICAgICAgICByZWFsX3NpemUgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKKyAgICBic0NwVGV4dC5SZWxlYXNlQnVmZmVyKHJlYWxfc2l6ZSAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOworICB9CisgICpzaXplID0gcmVhbF9zaXplOworfQorRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9QYXN0ZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREdFVCBoV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgd3NUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RXT1JEIHNpemUpIHsKKyAgaWYgKE5VTEwgPT0gaFdpZGdldCB8fCBOVUxMID09IGRvY3VtZW50KQorICAgIHJldHVybjsKKworICBDUERGWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSAoQ1BERlhGQV9Eb2N1bWVudCopZG9jdW1lbnQ7CisgIGlmIChwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9EeW5hbWljICYmCisgICAgICBwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9TdGF0aWMpCisgICAgcmV0dXJuOworCisgIElYRkFfTWVudUhhbmRsZXIqIHBYRkFNZW51SGFuZGVyID0KKyAgICAgIENQREZYRkFfQXBwOjpHZXRJbnN0YW5jZSgpLT5HZXRYRkFBcHAoKS0+R2V0TWVudUhhbmRsZXIoKTsKKyAgaWYgKHBYRkFNZW51SGFuZGVyID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIENGWF9XaWRlU3RyaW5nIHdzdHIgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUod3NUZXh0LCBzaXplKTsKKyAgcFhGQU1lbnVIYW5kZXItPlBhc3RlKChJWEZBX1dpZGdldCopaFdpZGdldCwgd3N0cik7Cit9CitETExFWFBPUlQgdm9pZCBTVERDQUxMCitGUERGX1dpZGdldF9SZXBsYWNlU3BlbGxDaGVja1dvcmQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREdFVCBoV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgYnNUZXh0KSB7CisgIGlmIChOVUxMID09IGhXaWRnZXQgfHwgTlVMTCA9PSBkb2N1bWVudCkKKyAgICByZXR1cm47CisKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gKENQREZYRkFfRG9jdW1lbnQqKWRvY3VtZW50OworICBpZiAocERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfRHluYW1pYyAmJgorICAgICAgcERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfU3RhdGljKQorICAgIHJldHVybjsKKworICBJWEZBX01lbnVIYW5kbGVyKiBwWEZBTWVudUhhbmRlciA9CisgICAgICBDUERGWEZBX0FwcDo6R2V0SW5zdGFuY2UoKS0+R2V0WEZBQXBwKCktPkdldE1lbnVIYW5kbGVyKCk7CisgIGlmIChwWEZBTWVudUhhbmRlciA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBDRlhfUG9pbnRGIHB0UG9wdXA7CisgIHB0UG9wdXAueCA9IHg7CisgIHB0UG9wdXAueSA9IHk7CisgIENGWF9CeXRlU3RyaW5nQyBicyhic1RleHQpOworICBwWEZBTWVudUhhbmRlci0+UmVwbGFjZVNwZWxsQ2hlY2tXb3JkKChJWEZBX1dpZGdldCopaFdpZGdldCwgcHRQb3B1cCwgYnMpOworfQorRExMRVhQT1JUIHZvaWQgU1REQ0FMTAorRlBERl9XaWRnZXRfR2V0U3BlbGxDaGVja1dvcmRzKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURHRVQgaFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9TVFJJTkdIQU5ETEUqIHN0cmluZ0hhbmRsZSkgeworICBpZiAoTlVMTCA9PSBoV2lkZ2V0IHx8IE5VTEwgPT0gZG9jdW1lbnQpCisgICAgcmV0dXJuOworCisgIENQREZYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudDsKKyAgaWYgKHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IFhGQV9ET0NUWVBFX0R5bmFtaWMgJiYKKyAgICAgIHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IFhGQV9ET0NUWVBFX1N0YXRpYykKKyAgICByZXR1cm47CisKKyAgSVhGQV9NZW51SGFuZGxlciogcFhGQU1lbnVIYW5kZXIgPQorICAgICAgQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCktPkdldFhGQUFwcCgpLT5HZXRNZW51SGFuZGxlcigpOworICBpZiAocFhGQU1lbnVIYW5kZXIgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgQ0ZYX0J5dGVTdHJpbmdBcnJheSogc1N1Z2dlc3RXb3JkcyA9IG5ldyBDRlhfQnl0ZVN0cmluZ0FycmF5OworICBDRlhfUG9pbnRGIHB0UG9wdXA7CisgIHB0UG9wdXAueCA9IHg7CisgIHB0UG9wdXAueSA9IHk7CisgIHBYRkFNZW51SGFuZGVyLT5HZXRTdWdnZXN0V29yZHMoKElYRkFfV2lkZ2V0KiloV2lkZ2V0LCBwdFBvcHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzU3VnZ2VzdFdvcmRzKTsKKyAgKnN0cmluZ0hhbmRsZSA9IChGUERGX1NUUklOR0hBTkRMRSlzU3VnZ2VzdFdvcmRzOworfQorRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfU3RyaW5nSGFuZGxlQ291bnRzKEZQREZfU1RSSU5HSEFORExFIHN0cmluZ0hhbmRsZSkgeworICBpZiAoc3RyaW5nSGFuZGxlID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworICBDRlhfQnl0ZVN0cmluZ0FycmF5KiBzU3VnZ2VzdFdvcmRzID0gKENGWF9CeXRlU3RyaW5nQXJyYXkqKXN0cmluZ0hhbmRsZTsKKyAgcmV0dXJuIHNTdWdnZXN0V29yZHMtPkdldFNpemUoKTsKK30KK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTAorRlBERl9TdHJpbmdIYW5kbGVHZXRTdHJpbmdCeUluZGV4KEZQREZfU1RSSU5HSEFORExFIHN0cmluZ0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIGJzVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RXT1JEKiBzaXplKSB7CisgIGlmIChzdHJpbmdIYW5kbGUgPT0gTlVMTCB8fCBzaXplID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworICBpbnQgY291bnQgPSBGUERGX1N0cmluZ0hhbmRsZUNvdW50cyhzdHJpbmdIYW5kbGUpOworICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGNvdW50KQorICAgIHJldHVybiBGQUxTRTsKKworICBDRlhfQnl0ZVN0cmluZ0FycmF5IHNTdWdnZXN0V29yZHMgPSAqKENGWF9CeXRlU3RyaW5nQXJyYXkqKXN0cmluZ0hhbmRsZTsKKyAgaW50IGxlbiA9IHNTdWdnZXN0V29yZHNbaW5kZXhdLkdldExlbmd0aCgpOworCisgIGlmIChic1RleHQgPT0gTlVMTCkgeworICAgICpzaXplID0gbGVuOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgaW50IHJlYWxfc2l6ZSA9IGxlbiA8ICpzaXplID8gbGVuIDogKnNpemU7CisgIGlmIChyZWFsX3NpemUgPiAwKQorICAgIEZYU1lTX21lbWNweSgodm9pZCopYnNUZXh0LCAoY29uc3QgRlhfQ0hBUiopKHNTdWdnZXN0V29yZHNbaW5kZXhdKSwKKyAgICAgICAgICAgICAgICAgcmVhbF9zaXplKTsKKyAgKnNpemUgPSByZWFsX3NpemU7CisKKyAgcmV0dXJuIFRSVUU7Cit9CitETExFWFBPUlQgdm9pZCBTVERDQUxMCitGUERGX1N0cmluZ0hhbmRsZVJlbGVhc2UoRlBERl9TVFJJTkdIQU5ETEUgc3RyaW5nSGFuZGxlKSB7CisgIGlmIChzdHJpbmdIYW5kbGUgPT0gTlVMTCkKKyAgICByZXR1cm47CisgIENGWF9CeXRlU3RyaW5nQXJyYXkqIHNTdWdnZXN0V29yZHMgPSAoQ0ZYX0J5dGVTdHJpbmdBcnJheSopc3RyaW5nSGFuZGxlOworICBkZWxldGUgc1N1Z2dlc3RXb3JkczsKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1JlbW92ZUZvcm1GaWVsZEhpZ2hsaWdodChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSkKLXsKLQlpZiAoIWhIYW5kbGUpCi0JCXJldHVybjsKLQlDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gKChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlKS0+R2V0Q3VycmVudERvYygpOwotCWlmKHBTREtEb2MpCi0JewotCQlpZihDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IHBTREtEb2MtPkdldEludGVyRm9ybSgpKQotCQkJcEludGVyRm9ybS0+UmVtb3ZlQWxsSGlnaExpZ2h0KCk7Ci0JfQorRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMCitGUERGX1N0cmluZ0hhbmRsZUFkZFN0cmluZyhGUERGX1NUUklOR0hBTkRMRSBzdHJpbmdIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgYnNUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBzaXplKSB7CisgIGlmIChzdHJpbmdIYW5kbGUgPT0gTlVMTCB8fCBic1RleHQgPT0gTlVMTCB8fCBzaXplIDw9IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIENGWF9CeXRlU3RyaW5nQXJyYXkqIHN0cmluZ0FyciA9IChDRlhfQnl0ZVN0cmluZ0FycmF5KilzdHJpbmdIYW5kbGU7CisgIENGWF9CeXRlU3RyaW5nIGJzU3RyKGJzVGV4dCwgc2l6ZSk7CisKKyAgc3RyaW5nQXJyLT5BZGQoYnNTdHIpOworICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1NldEZvcm1GaWVsZEhpZ2hsaWdodENvbG9yKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjb2xvcikgeworICBpZiAoQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBGb3JtSGFuZGxlVG9JbnRlckZvcm0oaEhhbmRsZSkpCisgICAgcEludGVyRm9ybS0+U2V0SGlnaGxpZ2h0Q29sb3IoY29sb3IsIGZpZWxkVHlwZSk7CiB9CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9PbkFmdGVyTG9hZFBhZ2UoRlBERl9QQUdFIHBhZ2UsIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKQotewotCWlmKCFoSGFuZGxlIHx8ICFwYWdlKQotCQlyZXR1cm47Ci0JQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9ICgoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZSktPkdldEN1cnJlbnREb2MoKTsKLQlpZighcFNES0RvYykKLQkJcmV0dXJuOwotCUNQREZfUGFnZSogcFBhZ2UgPSAoQ1BERl9QYWdlKilwYWdlOwotCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBTREtEb2MtPkdldFBhZ2VWaWV3KHBQYWdlLCBUUlVFKTsKLQlpZihwUGFnZVZpZXcpCi0JewotCQlwUGFnZVZpZXctPlNldFZhbGlkKFRSVUUpOwotCX0JCitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfU2V0Rm9ybUZpZWxkSGlnaGxpZ2h0QWxwaGEoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBhbHBoYSkgeworICBpZiAoQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBGb3JtSGFuZGxlVG9JbnRlckZvcm0oaEhhbmRsZSkpCisgICAgcEludGVyRm9ybS0+U2V0SGlnaGxpZ2h0QWxwaGEoYWxwaGEpOwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZPUk1fT25CZWZvcmVDbG9zZVBhZ2UoRlBERl9QQUdFIHBhZ2UsIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKQotewotCWlmKCFoSGFuZGxlIHx8ICFwYWdlKQotCQlyZXR1cm47Ci0JQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9ICgoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZSktPkdldEN1cnJlbnREb2MoKTsKLQlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKLQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwU0RLRG9jLT5HZXRQYWdlVmlldyhwUGFnZSwgRkFMU0UpOwotCWlmKHBQYWdlVmlldykKLQl7Ci0JCXBQYWdlVmlldy0+U2V0VmFsaWQoRkFMU0UpOwotCQkvLyBSZU1vdmVQYWdlVmlldygpIHRha2VzIGNhcmUgb2YgdGhlIGRlbGV0ZSBmb3IgdXMuCi0JCXBTREtEb2MtPlJlTW92ZVBhZ2VWaWV3KHBQYWdlKTsKLQl9Ci19Ci1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZPUk1fRG9Eb2N1bWVudEpTQWN0aW9uKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKQotewotCWlmKCFoSGFuZGxlKQotCQlyZXR1cm47Ci0JaWYoIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSAoKENQREZEb2NfRW52aXJvbm1lbnQqKWhIYW5kbGUpLT5HZXRDdXJyZW50RG9jKCkpCi0JewotCQlwU0RLRG9jLT5Jbml0UGFnZVZpZXcoKTsKLQkJaWYoKChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlKS0+SXNKU0luaXRpYXRlZCgpKQotCQkJcFNES0RvYy0+UHJvY0phdmFzY3JpcHRGdW4oKTsKLQl9CQorRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1JlbW92ZUZvcm1GaWVsZEhpZ2hsaWdodChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSkgeworICBpZiAoQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBGb3JtSGFuZGxlVG9JbnRlckZvcm0oaEhhbmRsZSkpCisgICAgcEludGVyRm9ybS0+UmVtb3ZlQWxsSGlnaExpZ2h0KCk7CiB9CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9Eb0RvY3VtZW50T3BlbkFjdGlvbihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSkKLXsKLQlpZighaEhhbmRsZSkKLQkJcmV0dXJuOwotCWlmKCBDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gKChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlKS0+R2V0Q3VycmVudERvYygpKQotCXsKLQkJaWYoKChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlKS0+SXNKU0luaXRpYXRlZCgpKQotCQkJcFNES0RvYy0+UHJvY09wZW5BY3Rpb24oKTsKLQl9Ci19Ci1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZPUk1fRG9Eb2N1bWVudEFBY3Rpb24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUsIGludCBhYVR5cGUpCi17Ci0JaWYoIWhIYW5kbGUpCi0JCXJldHVybjsKLQlDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gKChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlKS0+R2V0Q3VycmVudERvYygpOwotCWlmKHBTREtEb2MpCi0JewotCQlDUERGX0RvY3VtZW50KiBwRG9jID0gcFNES0RvYy0+R2V0RG9jdW1lbnQoKTsKLQkJQ1BERl9EaWN0aW9uYXJ5KiBwRGljID0gcERvYy0+R2V0Um9vdCgpOwotCQlpZiAoIXBEaWMpCi0JCQlyZXR1cm47Ci0JCUNQREZfQUFjdGlvbiBhYSA9IHBEaWMtPkdldERpY3QoRlhfQlNUUkMoIkFBIikpOwotCQkKLQkJaWYoYWEuQWN0aW9uRXhpc3QoKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUpYWFUeXBlKSkKLQkJewotCQkJQ1BERl9BY3Rpb24gYWN0aW9uID0gYWEuR2V0QWN0aW9uKChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlKWFhVHlwZSk7Ci0JCQlDUERGU0RLX0FjdGlvbkhhbmRsZXIgKnBBY3Rpb25IYW5kbGVyID0gKChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlKS0+R2V0QWN0aW9uSGFuZGVyKCk7Ci0JCQlBU1NFUlQocEFjdGlvbkhhbmRsZXIgIT0gTlVMTCk7Ci0JCQlwQWN0aW9uSGFuZGxlci0+RG9BY3Rpb25fRG9jdW1lbnQoYWN0aW9uLCAoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSlhYVR5cGUsIHBTREtEb2MpOwotCQl9Ci0JfQotfQotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGT1JNX0RvUGFnZUFBY3Rpb24oRlBERl9QQUdFIHBhZ2UsIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLCBpbnQgYWFUeXBlKQotewotCWlmKCFoSGFuZGxlIHx8ICFwYWdlKQotCQlyZXR1cm47Ci0JQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9ICgoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZSktPkdldEN1cnJlbnREb2MoKTsKLQlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKLQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwU0RLRG9jLT5HZXRQYWdlVmlldyhwUGFnZSwgRkFMU0UpOwotCWlmKHBQYWdlVmlldykKLQl7Ci0JCUNQREZEb2NfRW52aXJvbm1lbnQgKnBFbnYgPSBwU0RLRG9jLT5HZXRFbnYoKTsKLQkJQVNTRVJUKHBFbnYgIT0gTlVMTCk7Ci0JCQkKLQkJQ1BERlNES19BY3Rpb25IYW5kbGVyICpwQWN0aW9uSGFuZGxlciA9IHBFbnYtPkdldEFjdGlvbkhhbmRlcigpOwotCQlBU1NFUlQocEFjdGlvbkhhbmRsZXIgIT0gTlVMTCk7Ci0JCQotCQlDUERGX0RpY3Rpb25hcnkgKnBQYWdlRGljdCA9IHBQYWdlLT5tX3BGb3JtRGljdDsKLQkJQVNTRVJUKHBQYWdlRGljdCAhPSBOVUxMKTsKLQkJIAotCQlDUERGX0FBY3Rpb24gYWEgPSBwUGFnZURpY3QtPkdldERpY3QoRlhfQlNUUkMoIkFBIikpOwotCi0JCUZYX0JPT0wgYkV4aXN0T0FBY3Rpb24gPSBGQUxTRTsKLQkJRlhfQk9PTCBiRXhpc3RDQUFjdGlvbiA9IEZBTFNFOwotCQlpZiAoRlBERlBBR0VfQUFDVElPTl9PUEVOID09IGFhVHlwZSkKLQkJewotCQkJYkV4aXN0T0FBY3Rpb24gPSBhYS5BY3Rpb25FeGlzdChDUERGX0FBY3Rpb246Ok9wZW5QYWdlKTsKLQkJCWlmIChiRXhpc3RPQUFjdGlvbikKLQkJCXsKLQkJCQlDUERGX0FjdGlvbiBhY3Rpb24gPSBhYS5HZXRBY3Rpb24oQ1BERl9BQWN0aW9uOjpPcGVuUGFnZSk7Ci0JCQkJcEFjdGlvbkhhbmRsZXItPkRvQWN0aW9uX1BhZ2UoYWN0aW9uLCBDUERGX0FBY3Rpb246Ok9wZW5QYWdlLCBwU0RLRG9jKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCWJFeGlzdENBQWN0aW9uID0gYWEuQWN0aW9uRXhpc3QoQ1BERl9BQWN0aW9uOjpDbG9zZVBhZ2UpOwotCQkJaWYgKGJFeGlzdENBQWN0aW9uKQotCQkJewotCQkJCUNQREZfQWN0aW9uIGFjdGlvbiA9IGFhLkdldEFjdGlvbihDUERGX0FBY3Rpb246OkNsb3NlUGFnZSk7Ci0JCQkJcEFjdGlvbkhhbmRsZXItPkRvQWN0aW9uX1BhZ2UoYWN0aW9uLCBDUERGX0FBY3Rpb246OkNsb3NlUGFnZSwgcFNES0RvYyk7Ci0JCQl9Ci0JCX0KLQl9CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZPUk1fT25BZnRlckxvYWRQYWdlKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSkgeworICBpZiAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gRm9ybUhhbmRsZVRvUGFnZVZpZXcoaEhhbmRsZSwgcGFnZSkpCisgICAgcFBhZ2VWaWV3LT5TZXRWYWxpZChUUlVFKTsKIH0KIAorRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGT1JNX09uQmVmb3JlQ2xvc2VQYWdlKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKSB7CisgIGlmICghaEhhbmRsZSkKKyAgICByZXR1cm47CiAKKyAgQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9ICgoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZSktPkdldFNES0RvY3VtZW50KCk7CisgIGlmICghcFNES0RvYykKKyAgICByZXR1cm47CisKKyAgVW5kZXJseWluZ1BhZ2VUeXBlKiBwUGFnZSA9IFVuZGVybHlpbmdGcm9tRlBERlBhZ2UocGFnZSk7CisgIGlmICghcFBhZ2UpCisgICAgcmV0dXJuOworCisgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBTREtEb2MtPkdldFBhZ2VWaWV3KHBQYWdlLCBGQUxTRSk7CisgIGlmIChwUGFnZVZpZXcpIHsKKyAgICBwUGFnZVZpZXctPlNldFZhbGlkKEZBTFNFKTsKKyAgICAvLyBSZW1vdmVQYWdlVmlldygpIHRha2VzIGNhcmUgb2YgdGhlIGRlbGV0ZSBmb3IgdXMuCisgICAgcFNES0RvYy0+UmVtb3ZlUGFnZVZpZXcocFBhZ2UpOworICB9Cit9CisKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9Eb0RvY3VtZW50SlNBY3Rpb24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUpIHsKKyAgQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9IEZvcm1IYW5kbGVUb1NES0RvYyhoSGFuZGxlKTsKKyAgaWYgKHBTREtEb2MgJiYgKChDUERGRG9jX0Vudmlyb25tZW50KiloSGFuZGxlKS0+SXNKU0luaXRpYXRlZCgpKQorICAgIHBTREtEb2MtPlByb2NKYXZhc2NyaXB0RnVuKCk7Cit9CisKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9Eb0RvY3VtZW50T3BlbkFjdGlvbihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSkgeworICBDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gRm9ybUhhbmRsZVRvU0RLRG9jKGhIYW5kbGUpOworICBpZiAocFNES0RvYyAmJiAoKENQREZEb2NfRW52aXJvbm1lbnQqKWhIYW5kbGUpLT5Jc0pTSW5pdGlhdGVkKCkpCisgICAgcFNES0RvYy0+UHJvY09wZW5BY3Rpb24oKTsKK30KKworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGT1JNX0RvRG9jdW1lbnRBQWN0aW9uKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhYVR5cGUpIHsKKyAgQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9IEZvcm1IYW5kbGVUb1NES0RvYyhoSGFuZGxlKTsKKyAgaWYgKCFwU0RLRG9jKQorICAgIHJldHVybjsKKworICBDUERGX0RvY3VtZW50KiBwRG9jID0gcFNES0RvYy0+R2V0UERGRG9jdW1lbnQoKTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljID0gcERvYy0+R2V0Um9vdCgpOworICBpZiAoIXBEaWMpCisgICAgcmV0dXJuOworCisgIENQREZfQUFjdGlvbiBhYSA9IHBEaWMtPkdldERpY3QoIkFBIik7CisgIGlmIChhYS5BY3Rpb25FeGlzdCgoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSlhYVR5cGUpKSB7CisgICAgQ1BERl9BY3Rpb24gYWN0aW9uID0gYWEuR2V0QWN0aW9uKChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlKWFhVHlwZSk7CisgICAgQ1BERlNES19BY3Rpb25IYW5kbGVyKiBwQWN0aW9uSGFuZGxlciA9CisgICAgICAgICgoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZSktPkdldEFjdGlvbkhhbmRlcigpOworICAgIHBBY3Rpb25IYW5kbGVyLT5Eb0FjdGlvbl9Eb2N1bWVudChhY3Rpb24sIChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlKWFhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNES0RvYyk7CisgIH0KK30KKworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGT1JNX0RvUGFnZUFBY3Rpb24oRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhYVR5cGUpIHsKKyAgaWYgKCFoSGFuZGxlKQorICAgIHJldHVybjsKKyAgQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9ICgoQ1BERkRvY19FbnZpcm9ubWVudCopaEhhbmRsZSktPkdldFNES0RvY3VtZW50KCk7CisgIFVuZGVybHlpbmdQYWdlVHlwZSogcFBhZ2UgPSBVbmRlcmx5aW5nRnJvbUZQREZQYWdlKHBhZ2UpOworICBDUERGX1BhZ2UqIHBQREZQYWdlID0gQ1BERlBhZ2VGcm9tRlBERlBhZ2UocGFnZSk7CisgIGlmICghcFBERlBhZ2UpCisgICAgcmV0dXJuOworICBpZiAocFNES0RvYy0+R2V0UGFnZVZpZXcocFBhZ2UsIEZBTFNFKSkgeworICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBwU0RLRG9jLT5HZXRFbnYoKTsKKyAgICBDUERGU0RLX0FjdGlvbkhhbmRsZXIqIHBBY3Rpb25IYW5kbGVyID0gcEVudi0+R2V0QWN0aW9uSGFuZGVyKCk7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBwUERGUGFnZS0+bV9wRm9ybURpY3Q7CisgICAgQ1BERl9BQWN0aW9uIGFhID0gcFBhZ2VEaWN0LT5HZXREaWN0KCJBQSIpOworICAgIGlmIChGUERGUEFHRV9BQUNUSU9OX09QRU4gPT0gYWFUeXBlKSB7CisgICAgICBpZiAoYWEuQWN0aW9uRXhpc3QoQ1BERl9BQWN0aW9uOjpPcGVuUGFnZSkpIHsKKyAgICAgICAgQ1BERl9BY3Rpb24gYWN0aW9uID0gYWEuR2V0QWN0aW9uKENQREZfQUFjdGlvbjo6T3BlblBhZ2UpOworICAgICAgICBwQWN0aW9uSGFuZGxlci0+RG9BY3Rpb25fUGFnZShhY3Rpb24sIENQREZfQUFjdGlvbjo6T3BlblBhZ2UsIHBTREtEb2MpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoYWEuQWN0aW9uRXhpc3QoQ1BERl9BQWN0aW9uOjpDbG9zZVBhZ2UpKSB7CisgICAgICAgIENQREZfQWN0aW9uIGFjdGlvbiA9IGFhLkdldEFjdGlvbihDUERGX0FBY3Rpb246OkNsb3NlUGFnZSk7CisgICAgICAgIHBBY3Rpb25IYW5kbGVyLT5Eb0FjdGlvbl9QYWdlKGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpDbG9zZVBhZ2UsIHBTREtEb2MpOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZmZvcm1maWxsX2VtYmVkZGVydGVzdC5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmZm9ybWZpbGxfZW1iZWRkZXJ0ZXN0LmNwcAppbmRleCA2MTVhZGE5Li5hYWU2ZWE3IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmZm9ybWZpbGxfZW1iZWRkZXJ0ZXN0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmZm9ybWZpbGxfZW1iZWRkZXJ0ZXN0LmNwcApAQCAtMiwxOSArMiwxNyBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotCi0jaW5jbHVkZSAiLi4vLi4vcHVibGljL2ZwZGZfZm9ybWZpbGwuaCIKLSNpbmNsdWRlICIuLi8uLi90ZXN0aW5nL2VtYmVkZGVyX3Rlc3QuaCIKLSNpbmNsdWRlICIuLi8uLi90ZXN0aW5nL2VtYmVkZGVyX3Rlc3RfbW9ja19kZWxlZ2F0ZS5oIgotI2luY2x1ZGUgIi4uLy4uL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdF90aW1lcl9oYW5kbGluZ19kZWxlZ2F0ZS5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2Zvcm1maWxsLmgiCisjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0X21vY2tfZGVsZWdhdGUuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2VtYmVkZGVyX3Rlc3RfdGltZXJfaGFuZGxpbmdfZGVsZWdhdGUuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKIAogdXNpbmcgdGVzdGluZzo6XzsKIHVzaW5nIHRlc3Rpbmc6OlJldHVybjsKIAotY2xhc3MgRlBERkZvcm1GaWxsRW1iZWRkZXJ0ZXN0IDogcHVibGljIEVtYmVkZGVyVGVzdCB7Ci19OworY2xhc3MgRlBERkZvcm1GaWxsRW1iZWRkZXJ0ZXN0IDogcHVibGljIEVtYmVkZGVyVGVzdCB7fTsKIAogVEVTVF9GKEZQREZGb3JtRmlsbEVtYmVkZGVydGVzdCwgRmlyc3RUZXN0KSB7CiAgIEVtYmVkZGVyVGVzdE1vY2tEZWxlZ2F0ZSBtb2NrOwpAQCAtMjQsNyArMjIsNyBAQAogICBFWFBFQ1RfQ0FMTChtb2NrLCBLaWxsVGltZXIoXykpLlRpbWVzKDApOwogICBTZXREZWxlZ2F0ZSgmbW9jayk7CiAKLSAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJ0ZXN0aW5nL3Jlc291cmNlcy9oZWxsb193b3JsZC5wZGYiKSk7CisgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgiaGVsbG9fd29ybGQucGRmIikpOwogICBGUERGX1BBR0UgcGFnZSA9IExvYWRQYWdlKDApOwogICBFWFBFQ1RfTkUobnVsbHB0ciwgcGFnZSk7CiAgIFVubG9hZFBhZ2UocGFnZSk7CkBAIC0zNCwxMCArMzIsNTQgQEAKICAgRW1iZWRkZXJUZXN0VGltZXJIYW5kbGluZ0RlbGVnYXRlIGRlbGVnYXRlOwogICBTZXREZWxlZ2F0ZSgmZGVsZWdhdGUpOwogCi0gIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgidGVzdGluZy9yZXNvdXJjZXMvYnVnXzQ4NzkyOC5wZGYiKSk7CisgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgiYnVnXzQ4NzkyOC5wZGYiKSk7CiAgIEZQREZfUEFHRSBwYWdlID0gTG9hZFBhZ2UoMCk7CiAgIEVYUEVDVF9ORShudWxscHRyLCBwYWdlKTsKICAgRG9PcGVuQWN0aW9ucygpOwogICBkZWxlZ2F0ZS5BZHZhbmNlVGltZSg1MDAwKTsKICAgVW5sb2FkUGFnZShwYWdlKTsKIH0KKworVEVTVF9GKEZQREZGb3JtRmlsbEVtYmVkZGVydGVzdCwgQlVHXzUwNzMxNikgeworICBFbWJlZGRlclRlc3RUaW1lckhhbmRsaW5nRGVsZWdhdGUgZGVsZWdhdGU7CisgIFNldERlbGVnYXRlKCZkZWxlZ2F0ZSk7CisKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJidWdfNTA3MzE2LnBkZiIpKTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBMb2FkQW5kQ2FjaGVQYWdlKDIpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgcGFnZSk7CisgIERvT3BlbkFjdGlvbnMoKTsKKyAgZGVsZWdhdGUuQWR2YW5jZVRpbWUoNDAwMCk7CisgIFVubG9hZFBhZ2UocGFnZSk7Cit9CisKK1RFU1RfRihGUERGRm9ybUZpbGxFbWJlZGRlcnRlc3QsIEJVR181MTQ2OTApIHsKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJoZWxsb193b3JsZC5wZGYiKSk7CisgIEZQREZfUEFHRSBwYWdlID0gTG9hZFBhZ2UoMCk7CisgIEVYUEVDVF9ORShudWxscHRyLCBwYWdlKTsKKworICAvLyBUZXN0IHRoYXQgRk9STV9Pbk1vdXNlTW92ZSgpIGV0Yy4gcGVybWl0IG51bGwgSEFORExFUyBhbmQgUEFHRVMuCisgIEZPUk1fT25Nb3VzZU1vdmUobnVsbHB0ciwgcGFnZSwgMCwgMTAuMCwgMTAuMCk7CisgIEZPUk1fT25Nb3VzZU1vdmUoZm9ybV9oYW5kbGUoKSwgbnVsbHB0ciwgMCwgMTAuMCwgMTAuMCk7CisKKyAgVW5sb2FkUGFnZShwYWdlKTsKK30KKworVEVTVF9GKEZQREZGb3JtRmlsbEVtYmVkZGVydGVzdCwgQlVHXzU1MTI0OCkgeworICBFbWJlZGRlclRlc3RUaW1lckhhbmRsaW5nRGVsZWdhdGUgZGVsZWdhdGU7CisgIFNldERlbGVnYXRlKCZkZWxlZ2F0ZSk7CisKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJidWdfNTUxMjQ4LnBkZiIpKTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBMb2FkUGFnZSgwKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIHBhZ2UpOworICBEb09wZW5BY3Rpb25zKCk7CisgIGRlbGVnYXRlLkFkdmFuY2VUaW1lKDUwMDApOworICBVbmxvYWRQYWdlKHBhZ2UpOworCisgIGNvbnN0IGF1dG8mIGFsZXJ0cyA9IGRlbGVnYXRlLkdldEFsZXJ0cygpOworICBBU1NFUlRfRVEoMVUsIGFsZXJ0cy5zaXplKCkpOworCisgIEVYUEVDVF9TVFJFUShMImhlbGxvIHdvcmxkIiwgYWxlcnRzWzBdLm1lc3NhZ2UuY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUShMIkFsZXJ0IiwgYWxlcnRzWzBdLnRpdGxlLmNfc3RyKCkpOworICBFWFBFQ1RfRVEoMCwgYWxlcnRzWzBdLnR5cGUpOworICBFWFBFQ1RfRVEoMCwgYWxlcnRzWzBdLmljb24pOworfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZnBwby5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmcHBvLmNwcAppbmRleCBlOGJkNzZkLi40N2I5MTAxIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmcHBvLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmcHBvLmNwcApAQCAtMSw0NjcgKzEsNDA3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9wdWJsaWMvZnBkZl9wcG8uaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZfcHBvLmgiCiAKLWNsYXNzIENQREZfUGFnZU9yZ2FuaXplcgotewotcHVibGljOgotCUNQREZfUGFnZU9yZ2FuaXplcigpOwotCX5DUERGX1BhZ2VPcmdhbml6ZXIoKTsKLQkKLXB1YmxpYzoKLQlGWF9CT09MCQkJCVBERkRvY0luaXQoQ1BERl9Eb2N1bWVudCAqcERlc3RQREZEb2MsIENQREZfRG9jdW1lbnQgKnBTcmNQREZEb2MpOwotCUZYX0JPT0wJCQkJRXhwb3J0UGFnZShDUERGX0RvY3VtZW50ICpwU3JjUERGRG9jLCBDRlhfV29yZEFycmF5KiBuUGFnZU51bSwgQ1BERl9Eb2N1bWVudCAqcERlc3RQREZEb2MsIGludCBuSW5kZXgpOwotCUNQREZfT2JqZWN0KgkJUGFnZURpY3RHZXRJbmhlcml0YWJsZVRhZyhDUERGX0RpY3Rpb25hcnkgKnBEaWN0LCBDRlhfQnl0ZVN0cmluZyBuU3JjdGFnKTsKLQlGWF9CT09MCQkJCVVwZGF0ZVJlZmVyZW5jZShDUERGX09iamVjdCAqcE9iaiwgQ1BERl9Eb2N1bWVudCAqcERvYywgQ0ZYX01hcFB0clRvUHRyKiBwTWFwUHRyVG9QdHIpOwotCWludAkJCQkJR2V0TmV3T2JqSWQoQ1BERl9Eb2N1bWVudCAqcERvYywgQ0ZYX01hcFB0clRvUHRyKiBwTWFwUHRyVG9QdHIsIENQREZfUmVmZXJlbmNlICpwUmVmKTsKLQkKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnNka19kZWZpbmUuaCIKKworY2xhc3MgQ1BERl9QYWdlT3JnYW5pemVyIHsKKyBwdWJsaWM6CisgIHVzaW5nIE9iamVjdE51bWJlck1hcCA9IHN0ZDo6bWFwPEZYX0RXT1JELCBGWF9EV09SRD47CisgIENQREZfUGFnZU9yZ2FuaXplcigpOworICB+Q1BERl9QYWdlT3JnYW5pemVyKCk7CisKKyAgRlhfQk9PTCBQREZEb2NJbml0KENQREZfRG9jdW1lbnQqIHBEZXN0UERGRG9jLCBDUERGX0RvY3VtZW50KiBwU3JjUERGRG9jKTsKKyAgRlhfQk9PTCBFeHBvcnRQYWdlKENQREZfRG9jdW1lbnQqIHBTcmNQREZEb2MsCisgICAgICAgICAgICAgICAgICAgICBDRlhfV29yZEFycmF5KiBuUGFnZU51bSwKKyAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEZXN0UERGRG9jLAorICAgICAgICAgICAgICAgICAgICAgaW50IG5JbmRleCk7CisgIENQREZfT2JqZWN0KiBQYWdlRGljdEdldEluaGVyaXRhYmxlVGFnKENQREZfRGljdGlvbmFyeSogcERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIG5TcmN0YWcpOworICBGWF9CT09MIFVwZGF0ZVJlZmVyZW5jZShDUERGX09iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TnVtYmVyTWFwKiBwT2JqTnVtYmVyTWFwKTsKKyAgRlhfRFdPUkQgR2V0TmV3T2JqSWQoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TnVtYmVyTWFwKiBwT2JqTnVtYmVyTWFwLAorICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlZmVyZW5jZSogcFJlZik7CiB9OwogCitDUERGX1BhZ2VPcmdhbml6ZXI6OkNQREZfUGFnZU9yZ2FuaXplcigpIHt9CiAKLUNQREZfUGFnZU9yZ2FuaXplcjo6Q1BERl9QYWdlT3JnYW5pemVyKCkKLXsKK0NQREZfUGFnZU9yZ2FuaXplcjo6fkNQREZfUGFnZU9yZ2FuaXplcigpIHt9CiAKK0ZYX0JPT0wgQ1BERl9QYWdlT3JnYW5pemVyOjpQREZEb2NJbml0KENQREZfRG9jdW1lbnQqIHBEZXN0UERGRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcFNyY1BERkRvYykgeworICBpZiAoIXBEZXN0UERGRG9jIHx8ICFwU3JjUERGRG9jKQorICAgIHJldHVybiBGQUxTRTsKKworICBDUERGX0RpY3Rpb25hcnkqIHBOZXdSb290ID0gcERlc3RQREZEb2MtPkdldFJvb3QoKTsKKyAgaWYgKCFwTmV3Um9vdCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLy8gU2V0IHRoZSBkb2N1bWVudCBpbmZvcm1hdGlvbgorICBDUERGX0RpY3Rpb25hcnkqIERJbmZvRGljdCA9IHBEZXN0UERGRG9jLT5HZXRJbmZvKCk7CisgIGlmICghREluZm9EaWN0KQorICAgIHJldHVybiBGQUxTRTsKKworICBDRlhfQnl0ZVN0cmluZyBwcm9kdWNlcnN0cjsKKyAgcHJvZHVjZXJzdHIuRm9ybWF0KCJQREZpdW0iKTsKKyAgREluZm9EaWN0LT5TZXRBdCgiUHJvZHVjZXIiLCBuZXcgQ1BERl9TdHJpbmcocHJvZHVjZXJzdHIsIEZBTFNFKSk7CisKKyAgLy8gU2V0IHR5cGUKKyAgQ0ZYX0J5dGVTdHJpbmcgY2JSb290VHlwZSA9IHBOZXdSb290LT5HZXRTdHJpbmcoIlR5cGUiLCAiIik7CisgIGlmIChjYlJvb3RUeXBlLkVxdWFsKCIiKSkgeworICAgIHBOZXdSb290LT5TZXRBdCgiVHlwZSIsIG5ldyBDUERGX05hbWUoIkNhdGFsb2ciKSk7CisgIH0KKworICBDUERGX09iamVjdCogcEVsZW1lbnQgPSBwTmV3Um9vdC0+R2V0RWxlbWVudCgiUGFnZXMiKTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwTmV3UGFnZXMgPQorICAgICAgcEVsZW1lbnQgPyBUb0RpY3Rpb25hcnkocEVsZW1lbnQtPkdldERpcmVjdCgpKSA6IG51bGxwdHI7CisgIGlmICghcE5ld1BhZ2VzKSB7CisgICAgcE5ld1BhZ2VzID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgICBGWF9EV09SRCBOZXdQYWdlc09OID0gcERlc3RQREZEb2MtPkFkZEluZGlyZWN0T2JqZWN0KHBOZXdQYWdlcyk7CisgICAgcE5ld1Jvb3QtPlNldEF0KCJQYWdlcyIsIG5ldyBDUERGX1JlZmVyZW5jZShwRGVzdFBERkRvYywgTmV3UGFnZXNPTikpOworICB9CisKKyAgQ0ZYX0J5dGVTdHJpbmcgY2JQYWdlVHlwZSA9IHBOZXdQYWdlcy0+R2V0U3RyaW5nKCJUeXBlIiwgIiIpOworICBpZiAoY2JQYWdlVHlwZS5FcXVhbCgiIikpIHsKKyAgICBwTmV3UGFnZXMtPlNldEF0KCJUeXBlIiwgbmV3IENQREZfTmFtZSgiUGFnZXMiKSk7CisgIH0KKworICBDUERGX0FycmF5KiBwS2V5c0FycmF5ID0gcE5ld1BhZ2VzLT5HZXRBcnJheSgiS2lkcyIpOworICBpZiAoIXBLZXlzQXJyYXkpIHsKKyAgICBDUERGX0FycmF5KiBwTmV3S2lkcyA9IG5ldyBDUERGX0FycmF5OworICAgIEZYX0RXT1JEIEtpZHNvYmpudW0gPSAtMTsKKyAgICBLaWRzb2JqbnVtID0gcERlc3RQREZEb2MtPkFkZEluZGlyZWN0T2JqZWN0KHBOZXdLaWRzKTsKKworICAgIHBOZXdQYWdlcy0+U2V0QXQoIktpZHMiLCBuZXcgQ1BERl9SZWZlcmVuY2UocERlc3RQREZEb2MsIEtpZHNvYmpudW0pKTsKKyAgICBwTmV3UGFnZXMtPlNldEF0KCJDb3VudCIsIG5ldyBDUERGX051bWJlcigwKSk7CisgIH0KKworICByZXR1cm4gVFJVRTsKIH0KIAotQ1BERl9QYWdlT3JnYW5pemVyOjp+Q1BERl9QYWdlT3JnYW5pemVyKCkKLXsKK0ZYX0JPT0wgQ1BERl9QYWdlT3JnYW5pemVyOjpFeHBvcnRQYWdlKENQREZfRG9jdW1lbnQqIHBTcmNQREZEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV29yZEFycmF5KiBuUGFnZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEZXN0UERGRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5JbmRleCkgeworICBpbnQgY3VycGFnZSA9IG5JbmRleDsKIAorICBzdGQ6OnVuaXF1ZV9wdHI8T2JqZWN0TnVtYmVyTWFwPiBwT2JqTnVtYmVyTWFwKG5ldyBPYmplY3ROdW1iZXJNYXApOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgblBhZ2VOdW0tPkdldFNpemUoKTsgKytpKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQ3VyUGFnZURpY3QgPSBwRGVzdFBERkRvYy0+Q3JlYXRlTmV3UGFnZShjdXJwYWdlKTsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBTcmNQYWdlRGljdCA9IHBTcmNQREZEb2MtPkdldFBhZ2UoblBhZ2VOdW0tPkdldEF0KGkpIC0gMSk7CisgICAgaWYgKCFwU3JjUGFnZURpY3QgfHwgIXBDdXJQYWdlRGljdCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIC8vIENsb25lIHRoZSBwYWdlIGRpY3Rpb25hcnkKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogKnBTcmNQYWdlRGljdCkgeworICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNiU3JjS2V5U3RyID0gaXQuZmlyc3Q7CisgICAgICBDUERGX09iamVjdCogcE9iaiA9IGl0LnNlY29uZDsKKyAgICAgIGlmIChjYlNyY0tleVN0ci5Db21wYXJlKCgiVHlwZSIpKSAmJiBjYlNyY0tleVN0ci5Db21wYXJlKCgiUGFyZW50IikpKSB7CisgICAgICAgIGlmIChwQ3VyUGFnZURpY3QtPktleUV4aXN0KGNiU3JjS2V5U3RyKSkKKyAgICAgICAgICBwQ3VyUGFnZURpY3QtPlJlbW92ZUF0KGNiU3JjS2V5U3RyKTsKKyAgICAgICAgcEN1clBhZ2VEaWN0LT5TZXRBdChjYlNyY0tleVN0ciwgcE9iai0+Q2xvbmUoKSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gaW5oZXJpdGFibGUgaXRlbQorICAgIENQREZfT2JqZWN0KiBwSW5oZXJpdGFibGUgPSBudWxscHRyOworICAgIC8vIDEgTWVkaWFCb3ggIC8vcmVxdWlyZWQKKyAgICBpZiAoIXBDdXJQYWdlRGljdC0+S2V5RXhpc3QoIk1lZGlhQm94IikpIHsKKyAgICAgIHBJbmhlcml0YWJsZSA9IFBhZ2VEaWN0R2V0SW5oZXJpdGFibGVUYWcocFNyY1BhZ2VEaWN0LCAiTWVkaWFCb3giKTsKKyAgICAgIGlmICghcEluaGVyaXRhYmxlKSB7CisgICAgICAgIC8vIFNlYXJjaCB0aGUgIkNyb3BCb3giIGZyb20gc291cmNlIHBhZ2UgZGljdGlvbmFyeSwKKyAgICAgICAgLy8gaWYgbm90IGV4aXN0cyx3ZSB0YWtlIHRoZSBsZXR0ZXIgc2l6ZS4KKyAgICAgICAgcEluaGVyaXRhYmxlID0gUGFnZURpY3RHZXRJbmhlcml0YWJsZVRhZyhwU3JjUGFnZURpY3QsICJDcm9wQm94Iik7CisgICAgICAgIGlmIChwSW5oZXJpdGFibGUpIHsKKyAgICAgICAgICBwQ3VyUGFnZURpY3QtPlNldEF0KCJNZWRpYUJveCIsIHBJbmhlcml0YWJsZS0+Q2xvbmUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gTWFrZSB0aGUgZGVmYXVsdCBzaXplIHRvIGJlIGxldHRlciBzaXplICg4LjUneDExJykKKyAgICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBuZXcgQ1BERl9BcnJheTsKKyAgICAgICAgICBwQXJyYXktPkFkZE51bWJlcigwKTsKKyAgICAgICAgICBwQXJyYXktPkFkZE51bWJlcigwKTsKKyAgICAgICAgICBwQXJyYXktPkFkZE51bWJlcig2MTIpOworICAgICAgICAgIHBBcnJheS0+QWRkTnVtYmVyKDc5Mik7CisgICAgICAgICAgcEN1clBhZ2VEaWN0LT5TZXRBdCgiTWVkaWFCb3giLCBwQXJyYXkpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBwQ3VyUGFnZURpY3QtPlNldEF0KCJNZWRpYUJveCIsIHBJbmhlcml0YWJsZS0+Q2xvbmUoKSk7CisgICAgICB9CisgICAgfQorICAgIC8vIDIgUmVzb3VyY2VzIC8vcmVxdWlyZWQKKyAgICBpZiAoIXBDdXJQYWdlRGljdC0+S2V5RXhpc3QoIlJlc291cmNlcyIpKSB7CisgICAgICBwSW5oZXJpdGFibGUgPSBQYWdlRGljdEdldEluaGVyaXRhYmxlVGFnKHBTcmNQYWdlRGljdCwgIlJlc291cmNlcyIpOworICAgICAgaWYgKCFwSW5oZXJpdGFibGUpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIHBDdXJQYWdlRGljdC0+U2V0QXQoIlJlc291cmNlcyIsIHBJbmhlcml0YWJsZS0+Q2xvbmUoKSk7CisgICAgfQorICAgIC8vIDMgQ3JvcEJveCAgLy9PcHRpb25hbAorICAgIGlmICghcEN1clBhZ2VEaWN0LT5LZXlFeGlzdCgiQ3JvcEJveCIpKSB7CisgICAgICBwSW5oZXJpdGFibGUgPSBQYWdlRGljdEdldEluaGVyaXRhYmxlVGFnKHBTcmNQYWdlRGljdCwgIkNyb3BCb3giKTsKKyAgICAgIGlmIChwSW5oZXJpdGFibGUpCisgICAgICAgIHBDdXJQYWdlRGljdC0+U2V0QXQoIkNyb3BCb3giLCBwSW5oZXJpdGFibGUtPkNsb25lKCkpOworICAgIH0KKyAgICAvLyA0IFJvdGF0ZSAgLy9PcHRpb25hbAorICAgIGlmICghcEN1clBhZ2VEaWN0LT5LZXlFeGlzdCgiUm90YXRlIikpIHsKKyAgICAgIHBJbmhlcml0YWJsZSA9IFBhZ2VEaWN0R2V0SW5oZXJpdGFibGVUYWcocFNyY1BhZ2VEaWN0LCAiUm90YXRlIik7CisgICAgICBpZiAocEluaGVyaXRhYmxlKQorICAgICAgICBwQ3VyUGFnZURpY3QtPlNldEF0KCJSb3RhdGUiLCBwSW5oZXJpdGFibGUtPkNsb25lKCkpOworICAgIH0KKworICAgIC8vIFVwZGF0ZSB0aGUgcmVmZXJlbmNlCisgICAgRlhfRFdPUkQgZHdPbGRQYWdlT2JqID0gcFNyY1BhZ2VEaWN0LT5HZXRPYmpOdW0oKTsKKyAgICBGWF9EV09SRCBkd05ld1BhZ2VPYmogPSBwQ3VyUGFnZURpY3QtPkdldE9iak51bSgpOworCisgICAgKCpwT2JqTnVtYmVyTWFwKVtkd09sZFBhZ2VPYmpdID0gZHdOZXdQYWdlT2JqOworCisgICAgVXBkYXRlUmVmZXJlbmNlKHBDdXJQYWdlRGljdCwgcERlc3RQREZEb2MsIHBPYmpOdW1iZXJNYXAuZ2V0KCkpOworICAgICsrY3VycGFnZTsKKyAgfQorCisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIENQREZfUGFnZU9yZ2FuaXplcjo6UERGRG9jSW5pdChDUERGX0RvY3VtZW50ICpwRGVzdFBERkRvYywgQ1BERl9Eb2N1bWVudCAqcFNyY1BERkRvYykKLXsKLQlpZighcERlc3RQREZEb2MgfHwgIXBTcmNQREZEb2MpCi0JCXJldHVybiBmYWxzZTsKLQkKLQlDUERGX0RpY3Rpb25hcnkqIHBOZXdSb290ID0gcERlc3RQREZEb2MtPkdldFJvb3QoKTsKLQlpZighcE5ld1Jvb3QpCXJldHVybiBGQUxTRTsKLQkKLQkvL1NldCB0aGUgZG9jdW1lbnQgaW5mb3JtYXRpb24vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQotCUNQREZfRGljdGlvbmFyeSogREluZm9EaWN0ID0gcERlc3RQREZEb2MtPkdldEluZm8oKTsKLQkKLQlpZighREluZm9EaWN0KQotCQlyZXR1cm4gRkFMU0U7Ci0JCi0JQ0ZYX0J5dGVTdHJpbmcgcHJvZHVjZXJzdHI7Ci0JcHJvZHVjZXJzdHIuRm9ybWF0KCJQREZpdW0iKTsKLQlESW5mb0RpY3QtPlNldEF0KCJQcm9kdWNlciIsIG5ldyBDUERGX1N0cmluZyhwcm9kdWNlcnN0cikpOworQ1BERl9PYmplY3QqIENQREZfUGFnZU9yZ2FuaXplcjo6UGFnZURpY3RHZXRJbmhlcml0YWJsZVRhZygKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAorICAgIENGWF9CeXRlU3RyaW5nIG5TcmN0YWcpIHsKKyAgaWYgKCFwRGljdCB8fCBuU3JjdGFnLklzRW1wdHkoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgaWYgKCFwRGljdC0+S2V5RXhpc3QoIlBhcmVudCIpIHx8ICFwRGljdC0+S2V5RXhpc3QoIlR5cGUiKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKIAotCS8vU2V0IHR5cGUvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JQ0ZYX0J5dGVTdHJpbmcgY2JSb290VHlwZSA9IHBOZXdSb290LT5HZXRTdHJpbmcoIlR5cGUiLCIiKTsKLQlpZiggY2JSb290VHlwZS5FcXVhbCgiIikgKQotCXsKLQkJcE5ld1Jvb3QtPlNldEF0KCJUeXBlIiwgbmV3IENQREZfTmFtZSgiQ2F0YWxvZyIpKTsKLQl9Ci0JCi0JQ1BERl9EaWN0aW9uYXJ5KiBwTmV3UGFnZXMgPSAoQ1BERl9EaWN0aW9uYXJ5KikocE5ld1Jvb3QtPkdldEVsZW1lbnQoIlBhZ2VzIik/IHBOZXdSb290LT5HZXRFbGVtZW50KCJQYWdlcyIpLT5HZXREaXJlY3QoKSA6IE5VTEwpOwotCWlmKCFwTmV3UGFnZXMpCi0JewotCQlwTmV3UGFnZXMgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotCQlGWF9EV09SRCBOZXdQYWdlc09OID0gcERlc3RQREZEb2MtPkFkZEluZGlyZWN0T2JqZWN0KHBOZXdQYWdlcyk7Ci0JCXBOZXdSb290LT5TZXRBdCgiUGFnZXMiLCBuZXcgQ1BERl9SZWZlcmVuY2UocERlc3RQREZEb2MsIE5ld1BhZ2VzT04pKTsKLQl9Ci0JCi0JQ0ZYX0J5dGVTdHJpbmcgY2JQYWdlVHlwZSA9IHBOZXdQYWdlcy0+R2V0U3RyaW5nKCJUeXBlIiwiIik7Ci0JaWYoY2JQYWdlVHlwZS5FcXVhbCgiIikpCi0JewotCQlwTmV3UGFnZXMtPlNldEF0KCJUeXBlIiwgbmV3IENQREZfTmFtZSgiUGFnZXMiKSk7Ci0JfQorICBDUERGX09iamVjdCogcFR5cGUgPSBwRGljdC0+R2V0RWxlbWVudCgiVHlwZSIpLT5HZXREaXJlY3QoKTsKKyAgaWYgKCFUb05hbWUocFR5cGUpKQorICAgIHJldHVybiBudWxscHRyOworICBpZiAocFR5cGUtPkdldFN0cmluZygpLkNvbXBhcmUoIlBhZ2UiKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKIAotCUNQREZfQXJyYXkqIHBLZXlzQXJyYXkgPSBwTmV3UGFnZXMtPkdldEFycmF5KCJLaWRzIik7Ci0JaWYocEtleXNBcnJheSA9PSBOVUxMKQotCXsKLQkJQ1BERl9BcnJheSogcE5ld0tpZHMgPSBuZXcgQ1BERl9BcnJheTsKLQkJRlhfRFdPUkQgS2lkc29iam51bSA9IC0xOwotCQlLaWRzb2JqbnVtID0gcERlc3RQREZEb2MtPkFkZEluZGlyZWN0T2JqZWN0KHBOZXdLaWRzKTsvLywgS2lkc29iam51bSwgS2lkc2dlbm51bSk7Ci0JCQotCQlwTmV3UGFnZXMtPlNldEF0KCJLaWRzIiwgbmV3IENQREZfUmVmZXJlbmNlKHBEZXN0UERGRG9jLCBLaWRzb2JqbnVtKSk7Ly8sIEtpZHNnZW5udW0pKTsKLQkJcE5ld1BhZ2VzLT5TZXRBdCgiQ291bnQiLCBuZXcgQ1BERl9OdW1iZXIoMCkpOwkJCi0JfQorICBDUERGX0RpY3Rpb25hcnkqIHBwID0gVG9EaWN0aW9uYXJ5KHBEaWN0LT5HZXRFbGVtZW50KCJQYXJlbnQiKS0+R2V0RGlyZWN0KCkpOworICBpZiAoIXBwKQorICAgIHJldHVybiBudWxscHRyOwogCi0JcmV0dXJuIHRydWU7CisgIGlmIChwRGljdC0+S2V5RXhpc3QoKGNvbnN0IGNoYXIqKW5TcmN0YWcpKQorICAgIHJldHVybiBwRGljdC0+R2V0RWxlbWVudCgoY29uc3QgY2hhciopblNyY3RhZyk7CisKKyAgd2hpbGUgKHBwKSB7CisgICAgaWYgKHBwLT5LZXlFeGlzdCgoY29uc3QgY2hhciopblNyY3RhZykpCisgICAgICByZXR1cm4gcHAtPkdldEVsZW1lbnQoKGNvbnN0IGNoYXIqKW5TcmN0YWcpOworICAgIGlmICghcHAtPktleUV4aXN0KCJQYXJlbnQiKSkKKyAgICAgIGJyZWFrOworICAgIHBwID0gVG9EaWN0aW9uYXJ5KHBwLT5HZXRFbGVtZW50KCJQYXJlbnQiKS0+R2V0RGlyZWN0KCkpOworICB9CisgIHJldHVybiBudWxscHRyOwogfQogCi1GWF9CT09MIENQREZfUGFnZU9yZ2FuaXplcjo6RXhwb3J0UGFnZShDUERGX0RvY3VtZW50ICpwU3JjUERGRG9jLCBDRlhfV29yZEFycmF5KiBuUGFnZU51bSwgCi0JCQkJCQkJCQkJCQlDUERGX0RvY3VtZW50ICpwRGVzdFBERkRvYyxpbnQgbkluZGV4KQotewotCWludCBjdXJwYWdlID1uSW5kZXg7CitGWF9CT09MIENQREZfUGFnZU9yZ2FuaXplcjo6VXBkYXRlUmVmZXJlbmNlKENQREZfT2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3ROdW1iZXJNYXAqIHBPYmpOdW1iZXJNYXApIHsKKyAgc3dpdGNoIChwT2JqLT5HZXRUeXBlKCkpIHsKKyAgICBjYXNlIFBERk9CSl9SRUZFUkVOQ0U6IHsKKyAgICAgIENQREZfUmVmZXJlbmNlKiBwUmVmZXJlbmNlID0gcE9iai0+QXNSZWZlcmVuY2UoKTsKKyAgICAgIEZYX0RXT1JEIG5ld29iam51bSA9IEdldE5ld09iaklkKHBEb2MsIHBPYmpOdW1iZXJNYXAsIHBSZWZlcmVuY2UpOworICAgICAgaWYgKG5ld29iam51bSA9PSAwKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBwUmVmZXJlbmNlLT5TZXRSZWYocERvYywgbmV3b2JqbnVtKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBERk9CSl9ESUNUSU9OQVJZOiB7CisgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcE9iai0+QXNEaWN0aW9uYXJ5KCk7CisgICAgICBhdXRvIGl0ID0gcERpY3QtPmJlZ2luKCk7CisgICAgICB3aGlsZSAoaXQgIT0gcERpY3QtPmVuZCgpKSB7CisgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXkgPSBpdC0+Zmlyc3Q7CisgICAgICAgIENQREZfT2JqZWN0KiBwTmV4dE9iaiA9IGl0LT5zZWNvbmQ7CisgICAgICAgICsraXQ7CisgICAgICAgIGlmICghRlhTWVNfc3RyY21wKGtleSwgIlBhcmVudCIpIHx8ICFGWFNZU19zdHJjbXAoa2V5LCAiUHJldiIpIHx8CisgICAgICAgICAgICAhRlhTWVNfc3RyY21wKGtleSwgIkZpcnN0IikpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocE5leHRPYmopIHsKKyAgICAgICAgICBpZiAoIVVwZGF0ZVJlZmVyZW5jZShwTmV4dE9iaiwgcERvYywgcE9iak51bWJlck1hcCkpCisgICAgICAgICAgICBwRGljdC0+UmVtb3ZlQXQoa2V5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBERk9CSl9BUlJBWTogeworICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gcE9iai0+QXNBcnJheSgpOworICAgICAgRlhfRFdPUkQgY291bnQgPSBwQXJyYXktPkdldENvdW50KCk7CisgICAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICBDUERGX09iamVjdCogcE5leHRPYmogPSBwQXJyYXktPkdldEVsZW1lbnQoaSk7CisgICAgICAgIGlmICghcE5leHRPYmopCisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIVVwZGF0ZVJlZmVyZW5jZShwTmV4dE9iaiwgcERvYywgcE9iak51bWJlck1hcCkpCisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUERGT0JKX1NUUkVBTTogeworICAgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwT2JqLT5Bc1N0cmVhbSgpOworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBTdHJlYW0tPkdldERpY3QoKTsKKyAgICAgIGlmIChwRGljdCkgeworICAgICAgICBpZiAoIVVwZGF0ZVJlZmVyZW5jZShwRGljdCwgcERvYywgcE9iak51bWJlck1hcCkpCisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQogCi0JQ0ZYX01hcFB0clRvUHRyKiBwTWFwUHRyVG9QdHIgPSBuZXcgQ0ZYX01hcFB0clRvUHRyOwotCXBNYXBQdHJUb1B0ci0+SW5pdEhhc2hUYWJsZSgxMDAxKTsKLQotCWZvcihpbnQgaT0wOyBpPG5QYWdlTnVtLT5HZXRTaXplKCk7IGkrKykKLQl7Ci0JCQotCQlDUERGX0RpY3Rpb25hcnkqIHBDdXJQYWdlRGljdCA9IHBEZXN0UERGRG9jLT5DcmVhdGVOZXdQYWdlKGN1cnBhZ2UpOwotCQlDUERGX0RpY3Rpb25hcnkqIHBTcmNQYWdlRGljdCA9IHBTcmNQREZEb2MtPkdldFBhZ2UoblBhZ2VOdW0tPkdldEF0KGkpLTEpOwotCQlpZighcFNyY1BhZ2VEaWN0IHx8ICFwQ3VyUGFnZURpY3QpCi0JCXsKLQkJCWRlbGV0ZSBwTWFwUHRyVG9QdHI7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQkJCi0JCS8vIENsb25lIHRoZSBwYWdlIGRpY3Rpb25hcnkvLy8vLy8vLy8vLwotCQlGWF9QT1NJVElPTglTcmNQb3MgPSBwU3JjUGFnZURpY3QtPkdldFN0YXJ0UG9zKCk7Ci0JCXdoaWxlIChTcmNQb3MpCi0JCXsKLQkJCUNGWF9CeXRlU3RyaW5nIGNiU3JjS2V5U3RyOwotCQkJQ1BERl9PYmplY3QqIHBPYmogPSBwU3JjUGFnZURpY3QtPkdldE5leHRFbGVtZW50KFNyY1BvcywgY2JTcmNLZXlTdHIpOwotCQkJaWYoY2JTcmNLZXlTdHIuQ29tcGFyZSgoIlR5cGUiKSkgJiYgY2JTcmNLZXlTdHIuQ29tcGFyZSgoIlBhcmVudCIpKSkKLQkJCXsKLQkJCQlpZihwQ3VyUGFnZURpY3QtPktleUV4aXN0KGNiU3JjS2V5U3RyKSkKLQkJCQkJcEN1clBhZ2VEaWN0LT5SZW1vdmVBdChjYlNyY0tleVN0cik7Ci0JCQkJcEN1clBhZ2VEaWN0LT5TZXRBdChjYlNyY0tleVN0ciwgcE9iai0+Q2xvbmUoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vaW5oZXJpdGFibGUgaXRlbS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCUNQREZfT2JqZWN0KiBwSW5oZXJpdGFibGUgPSBOVUxMOwotCQkvLzEJTWVkaWFCb3ggIC8vcmVxdWlyZWQKLQkJaWYoIXBDdXJQYWdlRGljdC0+S2V5RXhpc3QoIk1lZGlhQm94IikpCi0JCXsKLQkJCQotCQkJcEluaGVyaXRhYmxlID0gUGFnZURpY3RHZXRJbmhlcml0YWJsZVRhZyhwU3JjUGFnZURpY3QsICJNZWRpYUJveCIpOwotCQkJaWYoIXBJbmhlcml0YWJsZSkgCi0JCQl7Ci0JCQkJLy9TZWFyY2ggdGhlICJDcm9wQm94IiBmcm9tIHNvdXJjZSBwYWdlIGRpY3Rpb25hcnksIGlmIG5vdCBleGlzdHMsd2UgdGFrZSB0aGUgbGV0dGVyIHNpemUuCi0JCQkJcEluaGVyaXRhYmxlID0gUGFnZURpY3RHZXRJbmhlcml0YWJsZVRhZyhwU3JjUGFnZURpY3QsICJDcm9wQm94Iik7Ci0JCQkJaWYocEluaGVyaXRhYmxlKQotCQkJCQlwQ3VyUGFnZURpY3QtPlNldEF0KCJNZWRpYUJveCIsIHBJbmhlcml0YWJsZS0+Q2xvbmUoKSk7Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJLy9NYWtlIHRoZSBkZWZhdWx0IHNpemUgdG8gYmUgbGV0dGVyIHNpemUgKDguNSd4MTEnKQotCQkJCQlDUERGX0FycmF5KiBwQXJyYXkgPSBuZXcgQ1BERl9BcnJheTsKLQkJCQkJcEFycmF5LT5BZGROdW1iZXIoMCk7Ci0JCQkJCXBBcnJheS0+QWRkTnVtYmVyKDApOwotCQkJCQlwQXJyYXktPkFkZE51bWJlcig2MTIpOwotCQkJCQlwQXJyYXktPkFkZE51bWJlcig3OTIpOwotCQkJCQlwQ3VyUGFnZURpY3QtPlNldEF0KCJNZWRpYUJveCIsIHBBcnJheSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJCXBDdXJQYWdlRGljdC0+U2V0QXQoIk1lZGlhQm94IiwgcEluaGVyaXRhYmxlLT5DbG9uZSgpKTsKLQkJfQotCQkvLzIgUmVzb3VyY2VzIC8vcmVxdWlyZWQKLQkJaWYoIXBDdXJQYWdlRGljdC0+S2V5RXhpc3QoIlJlc291cmNlcyIpKQotCQl7Ci0JCQlwSW5oZXJpdGFibGUgPSBQYWdlRGljdEdldEluaGVyaXRhYmxlVGFnKHBTcmNQYWdlRGljdCwgIlJlc291cmNlcyIpOwotCQkJaWYoIXBJbmhlcml0YWJsZSkgCi0JCQl7Ci0JCQkJZGVsZXRlIHBNYXBQdHJUb1B0cjsKLQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQl9Ci0JCQlwQ3VyUGFnZURpY3QtPlNldEF0KCJSZXNvdXJjZXMiLCBwSW5oZXJpdGFibGUtPkNsb25lKCkpOwotCQl9Ci0JCS8vMyBDcm9wQm94ICAvL09wdGlvbmFsCi0JCWlmKCFwQ3VyUGFnZURpY3QtPktleUV4aXN0KCJDcm9wQm94IikpCi0JCXsKLQkJCXBJbmhlcml0YWJsZSA9IFBhZ2VEaWN0R2V0SW5oZXJpdGFibGVUYWcocFNyY1BhZ2VEaWN0LCAiQ3JvcEJveCIpOwotCQkJaWYocEluaGVyaXRhYmxlKSAKLQkJCQlwQ3VyUGFnZURpY3QtPlNldEF0KCJDcm9wQm94IiwgcEluaGVyaXRhYmxlLT5DbG9uZSgpKTsKLQkJfQotCQkvLzQgUm90YXRlICAvL09wdGlvbmFsCi0JCWlmKCFwQ3VyUGFnZURpY3QtPktleUV4aXN0KCJSb3RhdGUiKSkKLQkJewotCQkJcEluaGVyaXRhYmxlID0gUGFnZURpY3RHZXRJbmhlcml0YWJsZVRhZyhwU3JjUGFnZURpY3QsICJSb3RhdGUiKTsKLQkJCWlmKHBJbmhlcml0YWJsZSkgCi0JCQkJcEN1clBhZ2VEaWN0LT5TZXRBdCgiUm90YXRlIiwgcEluaGVyaXRhYmxlLT5DbG9uZSgpKTsKLQkJfQotCi0JCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkvL1VwZGF0ZSB0aGUgcmVmZXJlbmNlCi0JCUZYX0RXT1JEIGR3T2xkUGFnZU9iaiA9IHBTcmNQYWdlRGljdC0+R2V0T2JqTnVtKCk7Ci0JCUZYX0RXT1JEIGR3TmV3UGFnZU9iaiA9IHBDdXJQYWdlRGljdC0+R2V0T2JqTnVtKCk7Ci0JCQotCQlwTWFwUHRyVG9QdHItPlNldEF0KChGWF9MUFZPSUQpKEZYX1VJTlRQVFIpZHdPbGRQYWdlT2JqLCAoRlhfTFBWT0lEKShGWF9VSU5UUFRSKWR3TmV3UGFnZU9iaik7Ci0KLQkJdGhpcy0+VXBkYXRlUmVmZXJlbmNlKHBDdXJQYWdlRGljdCwgcERlc3RQREZEb2MsIHBNYXBQdHJUb1B0cik7Ci0JCWN1cnBhZ2UrKzsKLQl9Ci0KLQlkZWxldGUgcE1hcFB0clRvUHRyOwotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotQ1BERl9PYmplY3QqIENQREZfUGFnZU9yZ2FuaXplcjo6UGFnZURpY3RHZXRJbmhlcml0YWJsZVRhZyhDUERGX0RpY3Rpb25hcnkgKnBEaWN0LCBDRlhfQnl0ZVN0cmluZyBuU3JjdGFnKQotewotCWlmKCFwRGljdCB8fCAhcERpY3QtPktleUV4aXN0KCJUeXBlIikgfHwgblNyY3RhZy5Jc0VtcHR5KCkpCQotCQlyZXR1cm4gTlVMTDsKK0ZYX0RXT1JEIENQREZfUGFnZU9yZ2FuaXplcjo6R2V0TmV3T2JqSWQoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TnVtYmVyTWFwKiBwT2JqTnVtYmVyTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlZmVyZW5jZSogcFJlZikgeworICBpZiAoIXBSZWYpCisgICAgcmV0dXJuIDA7CiAKLQlDUERGX09iamVjdCogcFR5cGUgPSBwRGljdC0+R2V0RWxlbWVudCgiVHlwZSIpLT5HZXREaXJlY3QoKTsKLQlpZighcFR5cGUgfHwgcFR5cGUtPkdldFR5cGUoKSAhPSBQREZPQkpfTkFNRSkJcmV0dXJuIE5VTEw7CisgIEZYX0RXT1JEIGR3T2JqbnVtID0gcFJlZi0+R2V0UmVmT2JqTnVtKCk7CisgIEZYX0RXT1JEIGR3TmV3T2JqTnVtID0gMDsKKyAgY29uc3QgYXV0byBpdCA9IHBPYmpOdW1iZXJNYXAtPmZpbmQoZHdPYmpudW0pOworICBpZiAoaXQgIT0gcE9iak51bWJlck1hcC0+ZW5kKCkpCisgICAgZHdOZXdPYmpOdW0gPSBpdC0+c2Vjb25kOworICBpZiAoZHdOZXdPYmpOdW0pCisgICAgcmV0dXJuIGR3TmV3T2JqTnVtOwogCi0JaWYocFR5cGUtPkdldFN0cmluZygpLkNvbXBhcmUoIlBhZ2UiKSkJcmV0dXJuIE5VTEw7CisgIENQREZfT2JqZWN0KiBwRGlyZWN0ID0gcFJlZi0+R2V0RGlyZWN0KCk7CisgIGlmICghcERpcmVjdCkKKyAgICByZXR1cm4gMDsKIAotCWlmKCFwRGljdC0+S2V5RXhpc3QoIlBhcmVudCIpKQlyZXR1cm4gTlVMTDsKLQlDUERGX09iamVjdCogcFBhcmVudCA9IHBEaWN0LT5HZXRFbGVtZW50KCJQYXJlbnQiKS0+R2V0RGlyZWN0KCk7Ci0JaWYoIXBQYXJlbnQgfHwgcFBhcmVudC0+R2V0VHlwZSgpICE9IFBERk9CSl9ESUNUSU9OQVJZKQlyZXR1cm4gTlVMTDsKLQkKLQlDUERGX0RpY3Rpb25hcnkqIHBwID0gKENQREZfRGljdGlvbmFyeSopcFBhcmVudDsKLQkKLQlpZihwRGljdC0+S2V5RXhpc3QoKGNvbnN0IGNoYXIqKW5TcmN0YWcpKQkKLQkJcmV0dXJuIHBEaWN0LT5HZXRFbGVtZW50KChjb25zdCBjaGFyKiluU3JjdGFnKTsKLQl3aGlsZSAocHApCi0JewotCQlpZihwcC0+S2V5RXhpc3QoKGNvbnN0IGNoYXIqKW5TcmN0YWcpKQkKLQkJCXJldHVybiBwcC0+R2V0RWxlbWVudCgoY29uc3QgY2hhciopblNyY3RhZyk7Ci0JCWVsc2UgaWYgKHBwLT5LZXlFeGlzdCgiUGFyZW50IikpCi0JCXsKLQkJCXBwID0gKENQREZfRGljdGlvbmFyeSopcHAtPkdldEVsZW1lbnQoIlBhcmVudCIpLT5HZXREaXJlY3QoKTsKLQkJCWlmIChwcC0+R2V0VHlwZSgpID09IFBERk9CSl9OVUxMKSBicmVhazsKLQkJfQotCQllbHNlIGJyZWFrOwotCX0KLQkKLQlyZXR1cm4gTlVMTDsKKyAgQ1BERl9PYmplY3QqIHBDbG9uZSA9IHBEaXJlY3QtPkNsb25lKCk7CisgIGlmICghcENsb25lKQorICAgIHJldHVybiAwOworCisgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBEaWN0Q2xvbmUgPSBwQ2xvbmUtPkFzRGljdGlvbmFyeSgpKSB7CisgICAgaWYgKHBEaWN0Q2xvbmUtPktleUV4aXN0KCJUeXBlIikpIHsKKyAgICAgIENGWF9CeXRlU3RyaW5nIHN0clR5cGUgPSBwRGljdENsb25lLT5HZXRTdHJpbmcoIlR5cGUiKTsKKyAgICAgIGlmICghRlhTWVNfc3RyaWNtcChzdHJUeXBlLCAiUGFnZXMiKSkgeworICAgICAgICBwRGljdENsb25lLT5SZWxlYXNlKCk7CisgICAgICAgIHJldHVybiA0OworICAgICAgfQorICAgICAgaWYgKCFGWFNZU19zdHJpY21wKHN0clR5cGUsICJQYWdlIikpIHsKKyAgICAgICAgcERpY3RDbG9uZS0+UmVsZWFzZSgpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZHdOZXdPYmpOdW0gPSBwRG9jLT5BZGRJbmRpcmVjdE9iamVjdChwQ2xvbmUpOworICAoKnBPYmpOdW1iZXJNYXApW2R3T2JqbnVtXSA9IGR3TmV3T2JqTnVtOworICBpZiAoIVVwZGF0ZVJlZmVyZW5jZShwQ2xvbmUsIHBEb2MsIHBPYmpOdW1iZXJNYXApKSB7CisgICAgcENsb25lLT5SZWxlYXNlKCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIGR3TmV3T2JqTnVtOwogfQogCi1GWF9CT09MIENQREZfUGFnZU9yZ2FuaXplcjo6VXBkYXRlUmVmZXJlbmNlKENQREZfT2JqZWN0ICpwT2JqLCBDUERGX0RvY3VtZW50ICpwRG9jLCAKLQkJCQkJCQkJCQkgQ0ZYX01hcFB0clRvUHRyKiBwTWFwUHRyVG9QdHIpCi17Ci0Jc3dpdGNoIChwT2JqLT5HZXRUeXBlKCkpCi0JewotCWNhc2UgUERGT0JKX1JFRkVSRU5DRToKLQkJewotCQkJQ1BERl9SZWZlcmVuY2UqIHBSZWZlcmVuY2UgPSAoQ1BERl9SZWZlcmVuY2UqKXBPYmo7Ci0JCQlpbnQgbmV3b2JqbnVtID0gR2V0TmV3T2JqSWQocERvYywgcE1hcFB0clRvUHRyLCBwUmVmZXJlbmNlKTsKLQkJCWlmIChuZXdvYmpudW0gPT0gMCkgcmV0dXJuIEZBTFNFOwotCQkJcFJlZmVyZW5jZS0+U2V0UmVmKHBEb2MsIG5ld29iam51bSk7Ly8sIDApOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIFBERk9CSl9ESUNUSU9OQVJZOgotCQl7Ci0JCQlDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gKENQREZfRGljdGlvbmFyeSopcE9iajsKLQkJCQotCQkJRlhfUE9TSVRJT04gcG9zID0gcERpY3QtPkdldFN0YXJ0UG9zKCk7Ci0JCQl3aGlsZShwb3MpCi0JCQl7Ci0JCQkJQ0ZYX0J5dGVTdHJpbmcga2V5KCIiKTsKLQkJCQlDUERGX09iamVjdCogcE5leHRPYmogPSBwRGljdC0+R2V0TmV4dEVsZW1lbnQocG9zLCBrZXkpOwotCQkJCWlmICghRlhTWVNfc3RyY21wKGtleSwgIlBhcmVudCIpIHx8ICFGWFNZU19zdHJjbXAoa2V5LCAiUHJldiIpIHx8ICFGWFNZU19zdHJjbXAoa2V5LCAiRmlyc3QiKSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYocE5leHRPYmopCi0JCQkJewotCQkJCQlpZighVXBkYXRlUmVmZXJlbmNlKHBOZXh0T2JqLCBwRG9jLCBwTWFwUHRyVG9QdHIpKQotCQkJCQkJcERpY3QtPlJlbW92ZUF0KGtleSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIEZBTFNFOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQljYXNlCVBERk9CSl9BUlJBWToKLQkJewotCQkJQ1BERl9BcnJheSogcEFycmF5ID0gKENQREZfQXJyYXkqKXBPYmo7Ci0JCQlGWF9EV09SRCBjb3VudCA9IHBBcnJheS0+R2V0Q291bnQoKTsKLQkJCWZvcihGWF9EV09SRCBpID0gMDsgaSA8IGNvdW50OyBpICsrKQotCQkJewotCQkJCUNQREZfT2JqZWN0KiBwTmV4dE9iaiA9IHBBcnJheS0+R2V0RWxlbWVudChpKTsKLQkJCQlpZihwTmV4dE9iaikKLQkJCQl7Ci0JCQkJCWlmKCFVcGRhdGVSZWZlcmVuY2UocE5leHRPYmosIHBEb2MsIHBNYXBQdHJUb1B0cikpCi0JCQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIEZBTFNFOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQljYXNlCVBERk9CSl9TVFJFQU06Ci0JCXsKLQkJCUNQREZfU3RyZWFtKiBwU3RyZWFtID0gKENQREZfU3RyZWFtKilwT2JqOwotCQkJQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBTdHJlYW0tPkdldERpY3QoKTsKLQkJCWlmKHBEaWN0KQotCQkJewotCQkJCWlmKCFVcGRhdGVSZWZlcmVuY2UocERpY3QsIHBEb2MsIHBNYXBQdHJUb1B0cikpCi0JCQkJCXJldHVybiBGQUxTRTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQlicmVhazsKLQkJfQotCWRlZmF1bHQ6CWJyZWFrOwotCX0KK0ZQREZfQk9PTCBQYXJzZXJQYWdlUmFuZ2VTdHJpbmcoQ0ZYX0J5dGVTdHJpbmcgcmFuZ3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dvcmRBcnJheSogcGFnZUFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvdW50KSB7CisgIGlmIChyYW5nc3RyaW5nLkdldExlbmd0aCgpICE9IDApIHsKKyAgICByYW5nc3RyaW5nLlJlbW92ZSgnICcpOworICAgIGludCBuTGVuZ3RoID0gcmFuZ3N0cmluZy5HZXRMZW5ndGgoKTsKKyAgICBDRlhfQnl0ZVN0cmluZyBjYkNvbXBhcmVTdHJpbmcoIjAxMjM0NTY3ODktLCIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkxlbmd0aDsgKytpKSB7CisgICAgICBpZiAoY2JDb21wYXJlU3RyaW5nLkZpbmQocmFuZ3N0cmluZ1tpXSkgPT0gLTEpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgQ0ZYX0J5dGVTdHJpbmcgY2JNaWRSYW5nZTsKKyAgICBpbnQgblN0cmluZ0Zyb20gPSAwOworICAgIGludCBuU3RyaW5nVG8gPSAwOworICAgIHdoaWxlIChuU3RyaW5nVG8gPCBuTGVuZ3RoKSB7CisgICAgICBuU3RyaW5nVG8gPSByYW5nc3RyaW5nLkZpbmQoJywnLCBuU3RyaW5nRnJvbSk7CisgICAgICBpZiAoblN0cmluZ1RvID09IC0xKQorICAgICAgICBuU3RyaW5nVG8gPSBuTGVuZ3RoOworICAgICAgY2JNaWRSYW5nZSA9IHJhbmdzdHJpbmcuTWlkKG5TdHJpbmdGcm9tLCBuU3RyaW5nVG8gLSBuU3RyaW5nRnJvbSk7CisgICAgICBpbnQgbk1pZCA9IGNiTWlkUmFuZ2UuRmluZCgnLScpOworICAgICAgaWYgKG5NaWQgPT0gLTEpIHsKKyAgICAgICAgbG9uZyBsUGFnZU51bSA9IGF0b2woY2JNaWRSYW5nZSk7CisgICAgICAgIGlmIChsUGFnZU51bSA8PSAwIHx8IGxQYWdlTnVtID4gbkNvdW50KQorICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgcGFnZUFycmF5LT5BZGQoKEZYX1dPUkQpbFBhZ2VOdW0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IG5TdGFydFBhZ2VOdW0gPSBhdG9sKGNiTWlkUmFuZ2UuTWlkKDAsIG5NaWQpKTsKKyAgICAgICAgaWYgKG5TdGFydFBhZ2VOdW0gPT0gMCkKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CiAKLQlyZXR1cm4gVFJVRTsKKyAgICAgICAgKytuTWlkOworICAgICAgICBpbnQgbkVuZCA9IGNiTWlkUmFuZ2UuR2V0TGVuZ3RoKCkgLSBuTWlkOworICAgICAgICBpZiAobkVuZCA9PSAwKQorICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICBpbnQgbkVuZFBhZ2VOdW0gPSBhdG9sKGNiTWlkUmFuZ2UuTWlkKG5NaWQsIG5FbmQpKTsKKyAgICAgICAgaWYgKG5TdGFydFBhZ2VOdW0gPCAwIHx8IG5TdGFydFBhZ2VOdW0gPiBuRW5kUGFnZU51bSB8fAorICAgICAgICAgICAgbkVuZFBhZ2VOdW0gPiBuQ291bnQpIHsKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IG5TdGFydFBhZ2VOdW07IGkgPD0gbkVuZFBhZ2VOdW07ICsraSkgeworICAgICAgICAgIHBhZ2VBcnJheS0+QWRkKGkpOworICAgICAgICB9CisgICAgICB9CisgICAgICBuU3RyaW5nRnJvbSA9IG5TdHJpbmdUbyArIDE7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOwogfQogCi1pbnQJQ1BERl9QYWdlT3JnYW5pemVyOjpHZXROZXdPYmpJZChDUERGX0RvY3VtZW50ICpwRG9jLCBDRlhfTWFwUHRyVG9QdHIqIHBNYXBQdHJUb1B0ciwKLQkJCQkJCQkJCUNQREZfUmVmZXJlbmNlICpwUmVmKQotewotCXNpemVfdCBkd09iam51bSA9IDA7Ci0JaWYoIXBSZWYpCi0JCXJldHVybiAwOwotCWR3T2JqbnVtID0gcFJlZi0+R2V0UmVmT2JqTnVtKCk7Ci0JCi0Jc2l6ZV90IGR3TmV3T2JqTnVtID0gMDsKLQkKLQlwTWFwUHRyVG9QdHItPkxvb2t1cCgoRlhfTFBWT0lEKWR3T2JqbnVtLCAoRlhfTFBWT0lEJilkd05ld09iak51bSk7Ci0JaWYoZHdOZXdPYmpOdW0pCi0JewotCQlyZXR1cm4gKGludClkd05ld09iak51bTsKLQl9Ci0JZWxzZQotCXsKLQkJQ1BERl9PYmplY3QqIHBEaXJlY3QgPSBwUmVmLT5HZXREaXJlY3QoKTsKLQkJaWYoIXBEaXJlY3QpCi0JCXsKLQkJCXJldHVybiAwOwotCQl9CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9JbXBvcnRQYWdlcyhGUERGX0RPQ1VNRU5UIGRlc3RfZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9ET0NVTUVOVCBzcmNfZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIHBhZ2VyYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgeworICBDUERGX0RvY3VtZW50KiBwRGVzdERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZGVzdF9kb2MpOworICBpZiAoIWRlc3RfZG9jKQorICAgIHJldHVybiBGQUxTRTsKIAotCQlDUERGX09iamVjdCogcENsb25lID0gcERpcmVjdC0+Q2xvbmUoKTsKLQkJaWYoIXBDbG9uZSkKLQkJewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJCi0JCWlmKHBDbG9uZS0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKQotCQl7Ci0JCQlDUERGX0RpY3Rpb25hcnkqIHBEaWN0Q2xvbmUgPSAoQ1BERl9EaWN0aW9uYXJ5KilwQ2xvbmU7Ci0JCQlpZihwRGljdENsb25lLT5LZXlFeGlzdCgiVHlwZSIpKQotCQkJewotCQkJCUNGWF9CeXRlU3RyaW5nIHN0clR5cGUgPSBwRGljdENsb25lLT5HZXRTdHJpbmcoIlR5cGUiKTsKLQkJCQlpZighRlhTWVNfc3RyaWNtcChzdHJUeXBlLCAiUGFnZXMiKSkKLQkJCQl7Ci0JCQkJCXBEaWN0Q2xvbmUtPlJlbGVhc2UoKTsKLQkJCQkJcmV0dXJuIDQ7Ci0JCQkJfQotCQkJCWVsc2UgaWYoIUZYU1lTX3N0cmljbXAoc3RyVHlwZSwgIlBhZ2UiKSkKLQkJCQl7Ci0JCQkJCXBEaWN0Q2xvbmUtPlJlbGVhc2UoKTsKLQkJCQkJcmV0dXJuICAwOwotCQkJCX0KLQkJCX0KLQkJfQotCQlkd05ld09iak51bSA9IHBEb2MtPkFkZEluZGlyZWN0T2JqZWN0KHBDbG9uZSk7Ly8sIG9udW0sIGdudW0pOwotCQlwTWFwUHRyVG9QdHItPlNldEF0KChGWF9MUFZPSUQpZHdPYmpudW0sIChGWF9MUFZPSUQpZHdOZXdPYmpOdW0pOwotCQkKLQkJaWYoIVVwZGF0ZVJlZmVyZW5jZShwQ2xvbmUsIHBEb2MsIHBNYXBQdHJUb1B0cikpCi0JCXsKLQkJCXBDbG9uZS0+UmVsZWFzZSgpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIChpbnQpZHdOZXdPYmpOdW07Ci0JfQotCXJldHVybiAwOworICBDUERGX0RvY3VtZW50KiBwU3JjRG9jID0gQ1BERkRvY3VtZW50RnJvbUZQREZEb2N1bWVudChzcmNfZG9jKTsKKyAgaWYgKCFwU3JjRG9jKQorICAgIHJldHVybiBGQUxTRTsKKworICBDRlhfV29yZEFycmF5IHBhZ2VBcnJheTsKKyAgaW50IG5Db3VudCA9IHBTcmNEb2MtPkdldFBhZ2VDb3VudCgpOworICBpZiAocGFnZXJhbmdlKSB7CisgICAgaWYgKCFQYXJzZXJQYWdlUmFuZ2VTdHJpbmcocGFnZXJhbmdlLCAmcGFnZUFycmF5LCBuQ291bnQpKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9IGVsc2UgeworICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG5Db3VudDsgKytpKSB7CisgICAgICBwYWdlQXJyYXkuQWRkKGkpOworICAgIH0KKyAgfQorCisgIENQREZfUGFnZU9yZ2FuaXplciBwYWdlT3JnOworICBwYWdlT3JnLlBERkRvY0luaXQocERlc3REb2MsIHBTcmNEb2MpOworICByZXR1cm4gcGFnZU9yZy5FeHBvcnRQYWdlKHBTcmNEb2MsICZwYWdlQXJyYXksIHBEZXN0RG9jLCBpbmRleCk7CiB9CiAKLUZQREZfQk9PTCBQYXJzZXJQYWdlUmFuZ2VTdHJpbmcoQ0ZYX0J5dGVTdHJpbmcgcmFuZ3N0cmluZywgQ0ZYX1dvcmRBcnJheSogcGFnZUFycmF5LGludCBuQ291bnQpCi17CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9Db3B5Vmlld2VyUHJlZmVyZW5jZXMoRlBERl9ET0NVTUVOVCBkZXN0X2RvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RPQ1VNRU5UIHNyY19kb2MpIHsKKyAgQ1BERl9Eb2N1bWVudCogcERzdERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZGVzdF9kb2MpOworICBpZiAoIXBEc3REb2MpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JaWYocmFuZ3N0cmluZy5HZXRMZW5ndGgoKSAhPSAwKQotCXsKLQkJcmFuZ3N0cmluZy5SZW1vdmUoJyAnKTsKLQkJaW50IG5MZW5ndGggPSByYW5nc3RyaW5nLkdldExlbmd0aCgpOwotCQlDRlhfQnl0ZVN0cmluZyBjYkNvbXBhcmVTdHJpbmcoIjAxMjM0NTY3ODktLCIpOwotCQlmb3IoaW50IGk9MDsgaTxuTGVuZ3RoOyBpKyspCi0JCXsKLQkJCWlmKGNiQ29tcGFyZVN0cmluZy5GaW5kKHJhbmdzdHJpbmdbaV0pID09IC0xKQotCQkJCXJldHVybiBGQUxTRTsKLQkJfQotCQlDRlhfQnl0ZVN0cmluZyBjYk1pZFJhbmdlOwotCQlpbnQgblN0cmluZ0Zyb20gPSAwOwotCQlpbnQgblN0cmluZ1RvPTA7Ci0JCXdoaWxlKG5TdHJpbmdUbyA8IG5MZW5ndGgpCi0JCXsKLQkJCW5TdHJpbmdUbyA9IHJhbmdzdHJpbmcuRmluZCgnLCcsblN0cmluZ0Zyb20pOwotCQkJaWYoblN0cmluZ1RvID09IC0xKQotCQkJewotCQkJCW5TdHJpbmdUbyA9IG5MZW5ndGg7Ci0JCQl9Ci0JCQljYk1pZFJhbmdlID0gcmFuZ3N0cmluZy5NaWQoblN0cmluZ0Zyb20sblN0cmluZ1RvLW5TdHJpbmdGcm9tKTsKLQkJCQotCQkJaW50IG5NaWQgPSBjYk1pZFJhbmdlLkZpbmQoJy0nKTsKLQkJCWlmKG5NaWQgPT0gLTEpCi0JCQl7Ci0JCQkJbG9uZyBsUGFnZU51bSA9IGF0b2woY2JNaWRSYW5nZSk7Ci0JCQkJaWYobFBhZ2VOdW0gPD0gMCB8fCBsUGFnZU51bSA+IG5Db3VudCkKLQkJCQkJcmV0dXJuIEZBTFNFOwotCQkJCXBhZ2VBcnJheS0+QWRkKChGWF9XT1JEKWxQYWdlTnVtKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpbnQgblN0YXJ0UGFnZU51bSA9IGF0b2woY2JNaWRSYW5nZS5NaWQoMCxuTWlkKSk7Ci0JCQkJaWYgKG5TdGFydFBhZ2VOdW0gPT0wKQotCQkJCXsKLQkJCQkJcmV0dXJuIEZBTFNFOwotCQkJCX0KKyAgQ1BERl9Eb2N1bWVudCogcFNyY0RvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoc3JjX2RvYyk7CisgIGlmICghcFNyY0RvYykKKyAgICByZXR1cm4gRkFMU0U7CiAKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwU3JjRGljdCA9IHBTcmNEb2MtPkdldFJvb3QoKTsKKyAgcFNyY0RpY3QgPSBwU3JjRGljdC0+R2V0RGljdCgiVmlld2VyUHJlZmVyZW5jZXMiKTsKKyAgaWYgKCFwU3JjRGljdCkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQkJCQluTWlkID0gbk1pZCsxOwotCQkJCWludCBuRW5kID0gY2JNaWRSYW5nZS5HZXRMZW5ndGgoKS1uTWlkOworICBDUERGX0RpY3Rpb25hcnkqIHBEc3REaWN0ID0gcERzdERvYy0+R2V0Um9vdCgpOworICBpZiAoIXBEc3REaWN0KQorICAgIHJldHVybiBGQUxTRTsKIAotCQkJCWlmKG5FbmQgPT0wKXJldHVybiBGQUxTRTsKLQkJCQkKLQkJCQkvLwkJCQlpbnQgbkVuZFBhZ2VOdW0gPSAobkVuZCA9PSAwKT9uQ291bnQ6YXRvbChjYk1pZFJhbmdlLk1pZChuTWlkLG5FbmQpKTsKLQkJCQlpbnQgbkVuZFBhZ2VOdW0gPSBhdG9sKGNiTWlkUmFuZ2UuTWlkKG5NaWQsbkVuZCkpOwotCQkJCQotCQkJCWlmKG5TdGFydFBhZ2VOdW0gPCAwIHx8blN0YXJ0UGFnZU51bSA+bkVuZFBhZ2VOdW18fCBuRW5kUGFnZU51bSA+IG5Db3VudCkKLQkJCQl7Ci0JCQkJCXJldHVybiBGQUxTRTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJZm9yKGludCBuSW5kZXg9blN0YXJ0UGFnZU51bTsgbkluZGV4IDw9IG5FbmRQYWdlTnVtOyBuSW5kZXggKyspCi0JCQkJCQlwYWdlQXJyYXktPkFkZChuSW5kZXgpOwotCQkJCX0KLQkJCX0KLQkJCW5TdHJpbmdGcm9tID0gblN0cmluZ1RvICsxOwotCQl9Ci0JfQotCXJldHVybiBUUlVFOworICBwRHN0RGljdC0+U2V0QXQoIlZpZXdlclByZWZlcmVuY2VzIiwgcFNyY0RpY3QtPkNsb25lKFRSVUUpKTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci0KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX0ltcG9ydFBhZ2VzKEZQREZfRE9DVU1FTlQgZGVzdF9kb2MsRlBERl9ET0NVTUVOVCBzcmNfZG9jLCAKLQkJCQkJCQkJCQkJIEZQREZfQllURVNUUklORyBwYWdlcmFuZ2UsIGludCBpbmRleCkKLXsKLQlpZihkZXN0X2RvYyA9PSBOVUxMIHx8IHNyY19kb2MgPT0gTlVMTCApCi0JCXJldHVybiBGQUxTRTsKLQlDRlhfV29yZEFycmF5IHBhZ2VBcnJheTsKLQlDUERGX0RvY3VtZW50KiBwU3JjRG9jID0gKENQREZfRG9jdW1lbnQqKXNyY19kb2M7Ci0JaW50IG5Db3VudCA9IHBTcmNEb2MtPkdldFBhZ2VDb3VudCgpOwotCWlmKHBhZ2VyYW5nZSkKLQl7Ci0JCWlmKFBhcnNlclBhZ2VSYW5nZVN0cmluZyhwYWdlcmFuZ2UsJnBhZ2VBcnJheSxuQ291bnQpID09IEZBTFNFKQotCQkJcmV0dXJuIEZBTFNFOwotCX0KLQllbHNlCi0JewotCQlmb3IoaW50IGk9MTsgaTw9bkNvdW50OyBpKyspCi0JCXsKLQkJCXBhZ2VBcnJheS5BZGQoaSk7Ci0JCX0KLQl9Ci0JCi0JQ1BERl9Eb2N1bWVudCogcERlc3REb2MgPSAoQ1BERl9Eb2N1bWVudCopZGVzdF9kb2M7Ci0JQ1BERl9QYWdlT3JnYW5pemVyIHBhZ2VPcmc7Ci0KLQlwYWdlT3JnLlBERkRvY0luaXQocERlc3REb2MscFNyY0RvYyk7Ci0KLQlpZihwYWdlT3JnLkV4cG9ydFBhZ2UocFNyY0RvYywmcGFnZUFycmF5LHBEZXN0RG9jLGluZGV4KSkKLQkJcmV0dXJuIFRSVUU7Ci0JcmV0dXJuIEZBTFNFOwotfQotCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9Db3B5Vmlld2VyUHJlZmVyZW5jZXMoRlBERl9ET0NVTUVOVCBkZXN0X2RvYywgRlBERl9ET0NVTUVOVCBzcmNfZG9jKQotewotCWlmKHNyY19kb2MgPT0gTlVMTCB8fCBkZXN0X2RvYyA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JQ1BERl9Eb2N1bWVudCogcFNyY0RvYyA9IChDUERGX0RvY3VtZW50KilzcmNfZG9jOwotCUNQREZfRGljdGlvbmFyeSogcFNyY0RpY3QgPSBwU3JjRG9jLT5HZXRSb290KCk7Ci0JcFNyY0RpY3QgPSBwU3JjRGljdC0+R2V0RGljdChGWF9CU1RSQygiVmlld2VyUHJlZmVyZW5jZXMiKSk7OwotCWlmKCFwU3JjRGljdCkKLQkJcmV0dXJuIEZBTFNFOwotCUNQREZfRG9jdW1lbnQqIHBEc3REb2MgPSAoQ1BERl9Eb2N1bWVudCopZGVzdF9kb2M7Ci0JQ1BERl9EaWN0aW9uYXJ5KiBwRHN0RGljdCA9IHBEc3REb2MtPkdldFJvb3QoKTsKLQlpZighcERzdERpY3QpCi0JCXJldHVybiBGQUxTRTsKLQlwRHN0RGljdC0+U2V0QXQoRlhfQlNUUkMoIlZpZXdlclByZWZlcmVuY2VzIiksIHBTcmNEaWN0LT5DbG9uZShUUlVFKSk7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZzYXZlLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZzYXZlLmNwcAppbmRleCA2OGI5YjRjLi5jMWQyMWM4IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmc2F2ZS5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZnNhdmUuY3BwCkBAIC0xLDEyICsxLDIxIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9wdWJsaWMvZnBkZl9lZGl0LmgiCi0jaW5jbHVkZSAiLi4vLi4vcHVibGljL2ZwZGZfc2F2ZS5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnNka19kZWZpbmUuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9zYXZlLmgiCisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmFwaS9mcGRmX3NlcmlhbC5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mc2RrX2RlZmluZS5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2VkaXQuaCIKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9hcHAuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2RvYy5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfdXRpbC5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2Zvcm1maWxsLmgiCisjZW5kaWYKIAogI2lmIF9GWF9PU18gPT0gX0ZYX0FORFJPSURfCiAjaW5jbHVkZSAidGltZS5oIgpAQCAtMTQsODQgKzIzLDMxMyBAQAogI2luY2x1ZGUgPGN0aW1lPgogI2VuZGlmCiAKLWNsYXNzIENGWF9JRmlsZVdyaXRlIEZYX0ZJTkFMIDogcHVibGljIElGWF9TdHJlYW1Xcml0ZQotewotCQotcHVibGljOgotCUNGWF9JRmlsZVdyaXRlKCk7Ci0JRlhfQk9PTAkJCQlJbml0KCBGUERGX0ZJTEVXUklURSAqIHBGaWxlV3JpdGVTdHJ1Y3QgKTsKLQl2aXJ0dWFsCUZYX0JPT0wJCVdyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIHNpemVfdCBzaXplKSBGWF9PVkVSUklERTsKLQl2aXJ0dWFsIHZvaWQJCVJlbGVhc2UoKSBGWF9PVkVSUklERSB7fQotCQotcHJvdGVjdGVkOgotCUZQREZfRklMRVdSSVRFKgkJbV9wRmlsZVdyaXRlU3RydWN0OworY2xhc3MgQ0ZYX0lGaWxlV3JpdGUgZmluYWwgOiBwdWJsaWMgSUZYX1N0cmVhbVdyaXRlIHsKKyBwdWJsaWM6CisgIENGWF9JRmlsZVdyaXRlKCk7CisgIEZYX0JPT0wgSW5pdChGUERGX0ZJTEVXUklURSogcEZpbGVXcml0ZVN0cnVjdCk7CisgIEZYX0JPT0wgV3JpdGVCbG9jayhjb25zdCB2b2lkKiBwRGF0YSwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICB2b2lkIFJlbGVhc2UoKSBvdmVycmlkZTsKKworIHByb3RlY3RlZDoKKyAgfkNGWF9JRmlsZVdyaXRlKCkgb3ZlcnJpZGUge30KKworICBGUERGX0ZJTEVXUklURSogbV9wRmlsZVdyaXRlU3RydWN0OwogfTsKIAotQ0ZYX0lGaWxlV3JpdGU6OkNGWF9JRmlsZVdyaXRlKCkKLXsKLQltX3BGaWxlV3JpdGVTdHJ1Y3QgPSBOVUxMOworQ0ZYX0lGaWxlV3JpdGU6OkNGWF9JRmlsZVdyaXRlKCkgeworICBtX3BGaWxlV3JpdGVTdHJ1Y3QgPSBOVUxMOwogfQogCi1GWF9CT09MIENGWF9JRmlsZVdyaXRlOjpJbml0KCBGUERGX0ZJTEVXUklURSAqIHBGaWxlV3JpdGVTdHJ1Y3QgKQotewotCWlmICghcEZpbGVXcml0ZVN0cnVjdCkKLQkJcmV0dXJuIEZBTFNFOwotCWVsc2UKLQl7Ci0JCW1fcEZpbGVXcml0ZVN0cnVjdCA9IHBGaWxlV3JpdGVTdHJ1Y3Q7Ci0JfQotCXJldHVybiBUUlVFOworRlhfQk9PTCBDRlhfSUZpbGVXcml0ZTo6SW5pdChGUERGX0ZJTEVXUklURSogcEZpbGVXcml0ZVN0cnVjdCkgeworICBpZiAoIXBGaWxlV3JpdGVTdHJ1Y3QpCisgICAgcmV0dXJuIEZBTFNFOworCisgIG1fcEZpbGVXcml0ZVN0cnVjdCA9IHBGaWxlV3JpdGVTdHJ1Y3Q7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIENGWF9JRmlsZVdyaXRlOjpXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLCBzaXplX3Qgc2l6ZSkKLXsKLQlpZiAobV9wRmlsZVdyaXRlU3RydWN0KQotCXsKLQkJbV9wRmlsZVdyaXRlU3RydWN0LT5Xcml0ZUJsb2NrKCBtX3BGaWxlV3JpdGVTdHJ1Y3QsIHBEYXRhLCBzaXplICk7Ci0JCXJldHVybiBUUlVFOwotCX0KLQllbHNlIAotCQlyZXR1cm4gRkFMU0U7CitGWF9CT09MIENGWF9JRmlsZVdyaXRlOjpXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoIW1fcEZpbGVXcml0ZVN0cnVjdCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbV9wRmlsZVdyaXRlU3RydWN0LT5Xcml0ZUJsb2NrKG1fcEZpbGVXcml0ZVN0cnVjdCwgcERhdGEsIHNpemUpOworICByZXR1cm4gVFJVRTsKIH0KIAotRlBERl9CT09MIF9GUERGX0RvY19TYXZlKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsRlBERl9GSUxFV1JJVEUgKiBwRmlsZVdyaXRlLEZQREZfRFdPUkQgZmxhZ3MsIEZQREZfQk9PTCBiU2V0VmVyc2lvbiwKLQkJCQkJCSBpbnQgZmlsZVZlcmlvbikKLXsKLQlDUERGX0RvY3VtZW50KiBwRG9jID0gKENQREZfRG9jdW1lbnQqKWRvY3VtZW50OwotCWlmICghcERvYykgCi0JCXJldHVybiAwOwotCQotCWlmICggZmxhZ3MgPCBGUERGX0lOQ1JFTUVOVEFMIHx8IGZsYWdzID4gRlBERl9SRU1PVkVfU0VDVVJJVFkgKQotCXsKLQkJZmxhZ3MgPSAwOwotCX0KLQkKLQlDUERGX0NyZWF0b3IgRmlsZU1ha2VyKHBEb2MpOwotCWlmKGJTZXRWZXJzaW9uKQotCQlGaWxlTWFrZXIuU2V0RmlsZVZlcnNpb24oZmlsZVZlcmlvbik7Ci0JaWYoZmxhZ3MgPT0gRlBERl9SRU1PVkVfU0VDVVJJVFkpCi0JewotCQlmbGFncyA9ICAwOwotCQlGaWxlTWFrZXIuUmVtb3ZlU2VjdXJpdHkoKTsKLQl9Ci0JQ0ZYX0lGaWxlV3JpdGUqIHBTdHJlYW1Xcml0ZSA9IE5VTEw7Ci0JRlhfQk9PTCBiUmV0OwotCXBTdHJlYW1Xcml0ZSA9IG5ldyBDRlhfSUZpbGVXcml0ZTsKLQlwU3RyZWFtV3JpdGUtPkluaXQoIHBGaWxlV3JpdGUgKTsKLQliUmV0ID0gRmlsZU1ha2VyLkNyZWF0ZShwU3RyZWFtV3JpdGUsIGZsYWdzKTsKLQlkZWxldGUgcFN0cmVhbVdyaXRlOwotCXJldHVybiBiUmV0Owordm9pZCBDRlhfSUZpbGVXcml0ZTo6UmVsZWFzZSgpIHsKKyAgZGVsZXRlIHRoaXM7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX1NhdmVBc0NvcHkoCUZQREZfRE9DVU1FTlQgZG9jdW1lbnQsRlBERl9GSUxFV1JJVEUgKiBwRmlsZVdyaXRlLAotCQkJCQkJCQkJCQkJRlBERl9EV09SRCBmbGFncyApCi17Ci0JcmV0dXJuIF9GUERGX0RvY19TYXZlKGRvY3VtZW50LCBwRmlsZVdyaXRlLCBmbGFncywgRkFMU0UgLCAwKTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorI2RlZmluZSBYRkFfREFUQVNFVFMgMAorI2RlZmluZSBYRkFfRk9STVMgMQorCitGWF9CT09MIF9TYXZlWEZBRG9jdW1lbnREYXRhKENQREZYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckFycmF5JiBmaWxlTGlzdCkgeworICBpZiAoIXBEb2N1bWVudCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBET0NUWVBFX0RZTkFNSUNfWEZBICYmCisgICAgICBwRG9jdW1lbnQtPkdldERvY1R5cGUoKSAhPSBET0NUWVBFX1NUQVRJQ19YRkEpCisgICAgcmV0dXJuIFRSVUU7CisgIGlmICghQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCktPkdldFhGQUFwcCgpKQorICAgIHJldHVybiBUUlVFOworCisgIElYRkFfRG9jVmlldyogcFhGQURvY1ZpZXcgPSBwRG9jdW1lbnQtPkdldFhGQURvY1ZpZXcoKTsKKyAgaWYgKE5VTEwgPT0gcFhGQURvY1ZpZXcpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgSVhGQV9Eb2NIYW5kbGVyKiBwWEZBRG9jSGFuZGxlciA9CisgICAgICBDUERGWEZBX0FwcDo6R2V0SW5zdGFuY2UoKS0+R2V0WEZBQXBwKCktPkdldERvY0hhbmRsZXIoKTsKKyAgQ1BERl9Eb2N1bWVudCogcFBERkRvY3VtZW50ID0gcERvY3VtZW50LT5HZXRQREZEb2MoKTsKKyAgaWYgKHBEb2N1bWVudCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKworICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gcFBERkRvY3VtZW50LT5HZXRSb290KCk7CisgIGlmIChwUm9vdCA9PSBOVUxMKQorICAgIHJldHVybiBGQUxTRTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQWNyb0Zvcm0gPSBwUm9vdC0+R2V0RGljdCgiQWNyb0Zvcm0iKTsKKyAgaWYgKE5VTEwgPT0gcEFjcm9Gb3JtKQorICAgIHJldHVybiBGQUxTRTsKKyAgQ1BERl9PYmplY3QqIHBYRkEgPSBwQWNyb0Zvcm0tPkdldEVsZW1lbnQoIlhGQSIpOworICBpZiAocFhGQSA9PSBOVUxMKQorICAgIHJldHVybiBUUlVFOworICBpZiAocFhGQS0+R2V0VHlwZSgpICE9IFBERk9CSl9BUlJBWSkKKyAgICByZXR1cm4gRkFMU0U7CisgIENQREZfQXJyYXkqIHBBcnJheSA9IHBYRkEtPkdldEFycmF5KCk7CisgIGlmIChOVUxMID09IHBBcnJheSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGludCBzaXplID0gcEFycmF5LT5HZXRDb3VudCgpOworICBpbnQgaUZvcm1JbmRleCA9IC0xOworICBpbnQgaURhdGFTZXRzSW5kZXggPSAtMTsKKyAgaW50IGlUZW1wbGF0ZSA9IC0xOworICBpbnQgaUxhc3QgPSBzaXplIC0gMjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplIC0gMTsgaSsrKSB7CisgICAgQ1BERl9PYmplY3QqIHBQREZPYmogPSBwQXJyYXktPkdldEVsZW1lbnQoaSk7CisgICAgaWYgKHBQREZPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSSU5HKQorICAgICAgY29udGludWU7CisgICAgaWYgKHBQREZPYmotPkdldFN0cmluZygpID09ICJmb3JtIikKKyAgICAgIGlGb3JtSW5kZXggPSBpICsgMTsKKyAgICBlbHNlIGlmIChwUERGT2JqLT5HZXRTdHJpbmcoKSA9PSAiZGF0YXNldHMiKQorICAgICAgaURhdGFTZXRzSW5kZXggPSBpICsgMTsKKyAgICBlbHNlIGlmIChwUERGT2JqLT5HZXRTdHJpbmcoKSA9PSAidGVtcGxhdGUiKQorICAgICAgaVRlbXBsYXRlID0gaSArIDE7CisgIH0KKyAgSVhGQV9DaGVja3N1bUNvbnRleHQqIHBDb250ZXh0ID0gTlVMTDsKKyAgLy8gQ2hlY2tzdW0KKyAgcENvbnRleHQgPSBYRkFfQ2hlY2tzdW1fQ3JlYXRlKCk7CisgIEZYU1lTX2Fzc2VydChwQ29udGV4dCk7CisgIHBDb250ZXh0LT5TdGFydENoZWNrc3VtKCk7CisKKyAgLy8gdGVtcGxhdGUKKyAgaWYgKGlUZW1wbGF0ZSA+IC0xKSB7CisgICAgQ1BERl9TdHJlYW0qIHBUZW1wbGF0ZVN0cmVhbSA9IHBBcnJheS0+R2V0U3RyZWFtKGlUZW1wbGF0ZSk7CisgICAgQ1BERl9TdHJlYW1BY2Mgc3RyZWFtQWNjOworICAgIHN0cmVhbUFjYy5Mb2FkQWxsRGF0YShwVGVtcGxhdGVTdHJlYW0pOworICAgIHVpbnQ4X3QqIHBEYXRhID0gKHVpbnQ4X3QqKXN0cmVhbUFjYy5HZXREYXRhKCk7CisgICAgRlhfRFdPUkQgZHdTaXplMiA9IHN0cmVhbUFjYy5HZXRTaXplKCk7CisgICAgSUZYX0ZpbGVTdHJlYW0qIHBUZW1wbGF0ZSA9IEZYX0NyZWF0ZU1lbW9yeVN0cmVhbShwRGF0YSwgZHdTaXplMik7CisgICAgcENvbnRleHQtPlVwZGF0ZUNoZWNrc3VtKChJRlhfRmlsZVJlYWQqKXBUZW1wbGF0ZSk7CisgICAgcFRlbXBsYXRlLT5SZWxlYXNlKCk7CisgIH0KKyAgQ1BERl9TdHJlYW0qIHBGb3JtU3RyZWFtID0gTlVMTDsKKyAgQ1BERl9TdHJlYW0qIHBEYXRhU2V0c1N0cmVhbSA9IE5VTEw7CisgIGlmIChpRm9ybUluZGV4ICE9IC0xKSB7CisgICAgLy8gR2V0IGZvcm0gQ1BERl9TdHJlYW0KKyAgICBDUERGX09iamVjdCogcEZvcm1QREZPYmogPSBwQXJyYXktPkdldEVsZW1lbnQoaUZvcm1JbmRleCk7CisgICAgaWYgKHBGb3JtUERGT2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1JFRkVSRU5DRSkgeworICAgICAgQ1BERl9PYmplY3QqIHBGb3JtRGlyY2V0T2JqID0gcEZvcm1QREZPYmotPkdldERpcmVjdCgpOworICAgICAgaWYgKE5VTEwgIT0gcEZvcm1EaXJjZXRPYmogJiYKKyAgICAgICAgICBwRm9ybURpcmNldE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pIHsKKyAgICAgICAgcEZvcm1TdHJlYW0gPSAoQ1BERl9TdHJlYW0qKXBGb3JtRGlyY2V0T2JqOworICAgICAgfQorICAgIH0gZWxzZSBpZiAocEZvcm1QREZPYmotPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNKSB7CisgICAgICBwRm9ybVN0cmVhbSA9IChDUERGX1N0cmVhbSopcEZvcm1QREZPYmo7CisgICAgfQorICB9CisKKyAgaWYgKGlEYXRhU2V0c0luZGV4ICE9IC0xKSB7CisgICAgLy8gR2V0IGRhdGFzZXRzIENQREZfU3RyZWFtCisgICAgQ1BERl9PYmplY3QqIHBEYXRhU2V0c1BERk9iaiA9IHBBcnJheS0+R2V0RWxlbWVudChpRGF0YVNldHNJbmRleCk7CisgICAgaWYgKHBEYXRhU2V0c1BERk9iai0+R2V0VHlwZSgpID09IFBERk9CSl9SRUZFUkVOQ0UpIHsKKyAgICAgIENQREZfUmVmZXJlbmNlKiBwRGF0YVNldHNSZWZPYmogPSAoQ1BERl9SZWZlcmVuY2UqKXBEYXRhU2V0c1BERk9iajsKKyAgICAgIENQREZfT2JqZWN0KiBwRGF0YVNldHNEaXJjZXRPYmogPSBwRGF0YVNldHNSZWZPYmotPkdldERpcmVjdCgpOworICAgICAgaWYgKE5VTEwgIT0gcERhdGFTZXRzRGlyY2V0T2JqICYmCisgICAgICAgICAgcERhdGFTZXRzRGlyY2V0T2JqLT5HZXRUeXBlKCkgPT0gUERGT0JKX1NUUkVBTSkgeworICAgICAgICBwRGF0YVNldHNTdHJlYW0gPSAoQ1BERl9TdHJlYW0qKXBEYXRhU2V0c0RpcmNldE9iajsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHBEYXRhU2V0c1BERk9iai0+R2V0VHlwZSgpID09IFBERk9CSl9TVFJFQU0pIHsKKyAgICAgIHBEYXRhU2V0c1N0cmVhbSA9IChDUERGX1N0cmVhbSopcERhdGFTZXRzUERGT2JqOworICAgIH0KKyAgfQorICAvLyBlbmQKKyAgLy8gTCJkYXRhc2V0cyIKKyAgeworICAgIElGWF9GaWxlU3RyZWFtKiBwRHNmaWxlV3JpdGUgPSBGWF9DcmVhdGVNZW1vcnlTdHJlYW0oKTsKKyAgICBpZiAoTlVMTCA9PSBwRHNmaWxlV3JpdGUpIHsKKyAgICAgIHBDb250ZXh0LT5SZWxlYXNlKCk7CisgICAgICBwRHNmaWxlV3JpdGUtPlJlbGVhc2UoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKHBYRkFEb2NIYW5kbGVyLT5TYXZlUGFja2FnZShwWEZBRG9jVmlldy0+R2V0RG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0MoTCJkYXRhc2V0cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERzZmlsZVdyaXRlKSAmJgorICAgICAgICBwRHNmaWxlV3JpdGUtPkdldFNpemUoKSA+IDApIHsKKyAgICAgIC8vIERhdGFzZXRzCisgICAgICBwQ29udGV4dC0+VXBkYXRlQ2hlY2tzdW0oKElGWF9GaWxlUmVhZCopcERzZmlsZVdyaXRlKTsKKyAgICAgIHBDb250ZXh0LT5GaW5pc2hDaGVja3N1bSgpOworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGF0YURpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICAgICAgaWYgKGlEYXRhU2V0c0luZGV4ICE9IC0xKSB7CisgICAgICAgIGlmIChwRGF0YVNldHNTdHJlYW0pCisgICAgICAgICAgcERhdGFTZXRzU3RyZWFtLT5Jbml0U3RyZWFtRnJvbUZpbGUocERzZmlsZVdyaXRlLCBwRGF0YURpY3QpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ1BERl9TdHJlYW0qIHBEYXRhID0gbmV3IENQREZfU3RyZWFtKE5VTEwsIDAsIE5VTEwpOworICAgICAgICBwRGF0YS0+SW5pdFN0cmVhbUZyb21GaWxlKHBEc2ZpbGVXcml0ZSwgcERhdGFEaWN0KTsKKyAgICAgICAgcFBERkRvY3VtZW50LT5BZGRJbmRpcmVjdE9iamVjdChwRGF0YSk7CisgICAgICAgIGlMYXN0ID0gcEFycmF5LT5HZXRDb3VudCgpIC0gMjsKKyAgICAgICAgcEFycmF5LT5JbnNlcnRBdChpTGFzdCwgbmV3IENQREZfU3RyaW5nKCJkYXRhc2V0cyIsIEZBTFNFKSk7CisgICAgICAgIHBBcnJheS0+SW5zZXJ0QXQoaUxhc3QgKyAxLCBwRGF0YSwgcFBERkRvY3VtZW50KTsKKyAgICAgIH0KKyAgICAgIGZpbGVMaXN0LkFkZChwRHNmaWxlV3JpdGUpOworICAgIH0KKyAgfQorCisgIC8vIEwiZm9ybSIKKyAgeworICAgIElGWF9GaWxlU3RyZWFtKiBwZmlsZVdyaXRlID0gRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKCk7CisgICAgaWYgKE5VTEwgPT0gcGZpbGVXcml0ZSkgeworICAgICAgcENvbnRleHQtPlJlbGVhc2UoKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKHBYRkFEb2NIYW5kbGVyLT5TYXZlUGFja2FnZShwWEZBRG9jVmlldy0+R2V0RG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0MoTCJmb3JtIiksIHBmaWxlV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCkgJiYKKyAgICAgICAgcGZpbGVXcml0ZSA+IDApIHsKKyAgICAgIENQREZfRGljdGlvbmFyeSogcERhdGFEaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgICAgIGlmIChpRm9ybUluZGV4ICE9IC0xKSB7CisgICAgICAgIGlmIChwRm9ybVN0cmVhbSkKKyAgICAgICAgICBwRm9ybVN0cmVhbS0+SW5pdFN0cmVhbUZyb21GaWxlKHBmaWxlV3JpdGUsIHBEYXRhRGljdCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBDUERGX1N0cmVhbSogcERhdGEgPSBuZXcgQ1BERl9TdHJlYW0oTlVMTCwgMCwgTlVMTCk7CisgICAgICAgIHBEYXRhLT5Jbml0U3RyZWFtRnJvbUZpbGUocGZpbGVXcml0ZSwgcERhdGFEaWN0KTsKKyAgICAgICAgcFBERkRvY3VtZW50LT5BZGRJbmRpcmVjdE9iamVjdChwRGF0YSk7CisgICAgICAgIGlMYXN0ID0gcEFycmF5LT5HZXRDb3VudCgpIC0gMjsKKyAgICAgICAgcEFycmF5LT5JbnNlcnRBdChpTGFzdCwgbmV3IENQREZfU3RyaW5nKCJmb3JtIiwgRkFMU0UpKTsKKyAgICAgICAgcEFycmF5LT5JbnNlcnRBdChpTGFzdCArIDEsIHBEYXRhLCBwUERGRG9jdW1lbnQpOworICAgICAgfQorICAgICAgZmlsZUxpc3QuQWRkKHBmaWxlV3JpdGUpOworICAgIH0KKyAgfQorICBwQ29udGV4dC0+UmVsZWFzZSgpOworICByZXR1cm4gVFJVRTsKIH0KIAorRlhfQk9PTCBfU2VuZFBvc3RTYXZlVG9YRkFEb2MoQ1BERlhGQV9Eb2N1bWVudCogcERvY3VtZW50KSB7CisgIGlmICghcERvY3VtZW50KQorICAgIHJldHVybiBGQUxTRTsKIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfU2F2ZVdpdGhWZXJzaW9uKAlGUERGX0RPQ1VNRU5UIGRvY3VtZW50LEZQREZfRklMRVdSSVRFICogcEZpbGVXcml0ZSwKLQlGUERGX0RXT1JEIGZsYWdzLCBpbnQgZmlsZVZlcnNpb24pCi17Ci0JcmV0dXJuIF9GUERGX0RvY19TYXZlKGRvY3VtZW50LCBwRmlsZVdyaXRlLCBmbGFncywgVFJVRSAsIGZpbGVWZXJzaW9uKTsKKyAgaWYgKHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IERPQ1RZUEVfRFlOQU1JQ19YRkEgJiYKKyAgICAgIHBEb2N1bWVudC0+R2V0RG9jVHlwZSgpICE9IERPQ1RZUEVfU1RBVElDX1hGQSkKKyAgICByZXR1cm4gVFJVRTsKKworICBJWEZBX0RvY1ZpZXcqIHBYRkFEb2NWaWV3ID0gcERvY3VtZW50LT5HZXRYRkFEb2NWaWV3KCk7CisgIGlmIChOVUxMID09IHBYRkFEb2NWaWV3KQorICAgIHJldHVybiBGQUxTRTsKKyAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGVyID0gcFhGQURvY1ZpZXctPkdldFdpZGdldEhhbmRsZXIoKTsKKworICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IE5VTEw7CisgIElYRkFfV2lkZ2V0QWNjSXRlcmF0b3IqIHBXaWRnZXRBY2NJdGVyYXRvciA9CisgICAgICBwWEZBRG9jVmlldy0+Q3JlYXRlV2lkZ2V0QWNjSXRlcmF0b3IoKTsKKyAgcFdpZGdldEFjYyA9IHBXaWRnZXRBY2NJdGVyYXRvci0+TW92ZVRvTmV4dCgpOworICB3aGlsZSAocFdpZGdldEFjYykgeworICAgIENYRkFfRXZlbnRQYXJhbSBwcmVQYXJhbTsKKyAgICBwcmVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX1Bvc3RTYXZlOworICAgIHBXaWRnZXRIYW5kZXItPlByb2Nlc3NFdmVudChwV2lkZ2V0QWNjLCAmcHJlUGFyYW0pOworICAgIHBXaWRnZXRBY2MgPSBwV2lkZ2V0QWNjSXRlcmF0b3ItPk1vdmVUb05leHQoKTsKKyAgfQorICBwV2lkZ2V0QWNjSXRlcmF0b3ItPlJlbGVhc2UoKTsKKyAgcFhGQURvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsKKyAgcERvY3VtZW50LT5fQ2xlYXJDaGFuZ2VNYXJrKCk7CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIF9TZW5kUHJlU2F2ZVRvWEZBRG9jKENQREZYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckFycmF5JiBmaWxlTGlzdCkgeworICBpZiAocERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gRE9DVFlQRV9EWU5BTUlDX1hGQSAmJgorICAgICAgcERvY3VtZW50LT5HZXREb2NUeXBlKCkgIT0gRE9DVFlQRV9TVEFUSUNfWEZBKQorICAgIHJldHVybiBUUlVFOworICBJWEZBX0RvY1ZpZXcqIHBYRkFEb2NWaWV3ID0gcERvY3VtZW50LT5HZXRYRkFEb2NWaWV3KCk7CisgIGlmIChOVUxMID09IHBYRkFEb2NWaWV3KQorICAgIHJldHVybiBUUlVFOworICBJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kZXIgPSBwWEZBRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpOworICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IE5VTEw7CisgIElYRkFfV2lkZ2V0QWNjSXRlcmF0b3IqIHBXaWRnZXRBY2NJdGVyYXRvciA9CisgICAgICBwWEZBRG9jVmlldy0+Q3JlYXRlV2lkZ2V0QWNjSXRlcmF0b3IoKTsKKyAgcFdpZGdldEFjYyA9IHBXaWRnZXRBY2NJdGVyYXRvci0+TW92ZVRvTmV4dCgpOworICB3aGlsZSAocFdpZGdldEFjYykgeworICAgIENYRkFfRXZlbnRQYXJhbSBwcmVQYXJhbTsKKyAgICBwcmVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX1ByZVNhdmU7CisgICAgcFdpZGdldEhhbmRlci0+UHJvY2Vzc0V2ZW50KHBXaWRnZXRBY2MsICZwcmVQYXJhbSk7CisgICAgcFdpZGdldEFjYyA9IHBXaWRnZXRBY2NJdGVyYXRvci0+TW92ZVRvTmV4dCgpOworICB9CisgIHBXaWRnZXRBY2NJdGVyYXRvci0+UmVsZWFzZSgpOworICBwWEZBRG9jVmlldy0+VXBkYXRlRG9jVmlldygpOworICByZXR1cm4gX1NhdmVYRkFEb2N1bWVudERhdGEocERvY3VtZW50LCBmaWxlTGlzdCk7Cit9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKK0ZQREZfQk9PTCBfRlBERl9Eb2NfU2F2ZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRklMRVdSSVRFKiBwRmlsZVdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIGJTZXRWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxlVmVyaW9uKSB7CisgIENQREZfRG9jdW1lbnQqIHBQREZEb2MgPSBDUERGRG9jdW1lbnRGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KTsKKyAgaWYgKCFwUERGRG9jKQorICAgIHJldHVybiAwOworCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IChDUERGWEZBX0RvY3VtZW50Kilkb2N1bWVudDsKKyAgQ0ZYX1B0ckFycmF5IGZpbGVMaXN0OworICBfU2VuZFByZVNhdmVUb1hGQURvYyhwRG9jLCBmaWxlTGlzdCk7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKKyAgaWYgKGZsYWdzIDwgRlBERl9JTkNSRU1FTlRBTCB8fCBmbGFncyA+IEZQREZfUkVNT1ZFX1NFQ1VSSVRZKSB7CisgICAgZmxhZ3MgPSAwOworICB9CisKKyAgQ1BERl9DcmVhdG9yIEZpbGVNYWtlcihwUERGRG9jKTsKKyAgaWYgKGJTZXRWZXJzaW9uKQorICAgIEZpbGVNYWtlci5TZXRGaWxlVmVyc2lvbihmaWxlVmVyaW9uKTsKKyAgaWYgKGZsYWdzID09IEZQREZfUkVNT1ZFX1NFQ1VSSVRZKSB7CisgICAgZmxhZ3MgPSAwOworICAgIEZpbGVNYWtlci5SZW1vdmVTZWN1cml0eSgpOworICB9CisKKyAgQ0ZYX0lGaWxlV3JpdGUqIHBTdHJlYW1Xcml0ZSA9IE5VTEw7CisgIEZYX0JPT0wgYlJldDsKKyAgcFN0cmVhbVdyaXRlID0gbmV3IENGWF9JRmlsZVdyaXRlOworICBwU3RyZWFtV3JpdGUtPkluaXQocEZpbGVXcml0ZSk7CisgIGJSZXQgPSBGaWxlTWFrZXIuQ3JlYXRlKHBTdHJlYW1Xcml0ZSwgZmxhZ3MpOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIF9TZW5kUG9zdFNhdmVUb1hGQURvYyhwRG9jKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTGlzdC5HZXRTaXplKCk7IGkrKykgeworICAgIElGWF9GaWxlU3RyZWFtKiBwRmlsZSA9IChJRlhfRmlsZVN0cmVhbSopZmlsZUxpc3QuR2V0QXQoaSk7CisgICAgcEZpbGUtPlJlbGVhc2UoKTsKKyAgfQorICBmaWxlTGlzdC5SZW1vdmVBbGwoKTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgcFN0cmVhbVdyaXRlLT5SZWxlYXNlKCk7CisgIHJldHVybiBiUmV0OworfQorCitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9TYXZlQXNDb3B5KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRklMRVdSSVRFKiBwRmlsZVdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RXT1JEIGZsYWdzKSB7CisgIHJldHVybiBfRlBERl9Eb2NfU2F2ZShkb2N1bWVudCwgcEZpbGVXcml0ZSwgZmxhZ3MsIEZBTFNFLCAwKTsKK30KKworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfU2F2ZVdpdGhWZXJzaW9uKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9GSUxFV1JJVEUqIHBGaWxlV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsZVZlcnNpb24pIHsKKyAgcmV0dXJuIF9GUERGX0RvY19TYXZlKGRvY3VtZW50LCBwRmlsZVdyaXRlLCBmbGFncywgVFJVRSwgZmlsZVZlcnNpb24pOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZnNhdmVfZW1iZWRkZXJ0ZXN0LmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZzYXZlX2VtYmVkZGVydGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5M2Y0ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZzYXZlX2VtYmVkZGVydGVzdC5jcHAKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZfc2F2ZS5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmdmlldy5oIgorI2luY2x1ZGUgInRlc3RpbmcvZW1iZWRkZXJfdGVzdC5oIgorI2luY2x1ZGUgInRlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmgiCisjaW5jbHVkZSAidGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLW1hdGNoZXJzLmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy90ZXN0X3N1cHBvcnQuaCIKKworY2xhc3MgRlBERlNhdmVFbWJlZGRlclRlc3QgOiBwdWJsaWMgRW1iZWRkZXJUZXN0LCBwdWJsaWMgVGVzdFNhdmVyIHt9OworCitURVNUX0YoRlBERlNhdmVFbWJlZGRlclRlc3QsIFNhdmVTaW1wbGVEb2MpIHsKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJoZWxsb193b3JsZC5wZGYiKSk7CisgIEVYUEVDVF9UUlVFKEZQREZfU2F2ZUFzQ29weShkb2N1bWVudCgpLCB0aGlzLCAwKSk7CisgIEVYUEVDVF9USEFUKEdldFN0cmluZygpLCB0ZXN0aW5nOjpTdGFydHNXaXRoKCIlUERGLTEuN1xyXG4iKSk7CisgIEVYUEVDVF9FUSg4NDMsIEdldFN0cmluZygpLmxlbmd0aCgpKTsKK30KKworVEVTVF9GKEZQREZTYXZlRW1iZWRkZXJUZXN0LCBTYXZlU2ltcGxlRG9jV2l0aFZlcnNpb24pIHsKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJoZWxsb193b3JsZC5wZGYiKSk7CisgIEVYUEVDVF9UUlVFKEZQREZfU2F2ZVdpdGhWZXJzaW9uKGRvY3VtZW50KCksIHRoaXMsIDAsIDE0KSk7CisgIEVYUEVDVF9USEFUKEdldFN0cmluZygpLCB0ZXN0aW5nOjpTdGFydHNXaXRoKCIlUERGLTEuNFxyXG4iKSk7CisgIEVYUEVDVF9FUSg4NDMsIEdldFN0cmluZygpLmxlbmd0aCgpKTsKK30KKworVEVTVF9GKEZQREZTYXZlRW1iZWRkZXJUZXN0LCBTYXZlU2ltcGxlRG9jV2l0aEJhZFZlcnNpb24pIHsKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJoZWxsb193b3JsZC5wZGYiKSk7CisgIEVYUEVDVF9UUlVFKEZQREZfU2F2ZVdpdGhWZXJzaW9uKGRvY3VtZW50KCksIHRoaXMsIDAsIC0xKSk7CisgIEVYUEVDVF9USEFUKEdldFN0cmluZygpLCB0ZXN0aW5nOjpTdGFydHNXaXRoKCIlUERGLTEuN1xyXG4iKSk7CisKKyAgQ2xlYXJTdHJpbmcoKTsKKyAgRVhQRUNUX1RSVUUoRlBERl9TYXZlV2l0aFZlcnNpb24oZG9jdW1lbnQoKSwgdGhpcywgMCwgMCkpOworICBFWFBFQ1RfVEhBVChHZXRTdHJpbmcoKSwgdGVzdGluZzo6U3RhcnRzV2l0aCgiJVBERi0xLjdcclxuIikpOworCisgIENsZWFyU3RyaW5nKCk7CisgIEVYUEVDVF9UUlVFKEZQREZfU2F2ZVdpdGhWZXJzaW9uKGRvY3VtZW50KCksIHRoaXMsIDAsIDE4KSk7CisgIEVYUEVDVF9USEFUKEdldFN0cmluZygpLCB0ZXN0aW5nOjpTdGFydHNXaXRoKCIlUERGLTEuN1xyXG4iKSk7Cit9CisKK1RFU1RfRihGUERGU2F2ZUVtYmVkZGVyVGVzdCwgQlVHXzM0MikgeworICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoImhlbGxvX3dvcmxkLnBkZiIpKTsKKyAgRVhQRUNUX1RSVUUoRlBERl9TYXZlQXNDb3B5KGRvY3VtZW50KCksIHRoaXMsIDApKTsKKyAgRVhQRUNUX1RIQVQoR2V0U3RyaW5nKCksIHRlc3Rpbmc6Okhhc1N1YnN0cigiMDAwMDAwMDAwMCA2NTUzNSBmXHJcbiIpKTsKKyAgRVhQRUNUX1RIQVQoR2V0U3RyaW5nKCksCisgICAgICAgICAgICAgIHRlc3Rpbmc6Ok5vdCh0ZXN0aW5nOjpIYXNTdWJzdHIoIjAwMDAwMDAwMDAgNjU1MzYgZlxyXG4iKSkpOworfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZnNka2RsbC5yYyBiL2ZwZGZzZGsvc3JjL2ZwZGZzZGtkbGwucmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNWRkYjguLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9zcmMvZnBkZnNka2RsbC5yYworKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vL01pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIGdlbmVyYXRlZCByZXNvdXJjZSBzY3JpcHQuCi0vLwotI2luY2x1ZGUgInJlc291cmNlLmgiCi0KLSNkZWZpbmUgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyBHZW5lcmF0ZWQgZnJvbSB0aGUgVEVYVElOQ0xVREUgMiByZXNvdXJjZS4KLS8vCi0jaW5jbHVkZSAid2luZG93cy5oIgotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotI3VuZGVmIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIENoaW5lc2UgKFAuUi5DLikgcmVzb3VyY2VzCi0KLSNpZiAhZGVmaW5lZChBRlhfUkVTT1VSQ0VfRExMKSB8fCBkZWZpbmVkKEFGWF9UQVJHX0NIUykKLSNpZmRlZiBfV0lOMzIKLUxBTkdVQUdFIExBTkdfQ0hJTkVTRSwgU1VCTEFOR19DSElORVNFX1NJTVBMSUZJRUQKLSNwcmFnbWEgY29kZV9wYWdlKDkzNikKLSNlbmRpZiAvL19XSU4zMgotCi0jaWZuZGVmIF9NQUMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwotLy8gVmVyc2lvbgotLy8KLQotVlNfVkVSU0lPTl9JTkZPIFZFUlNJT05JTkZPCi0gRklMRVZFUlNJT04gMiwwLDAsMTcwNQotIFBST0RVQ1RWRVJTSU9OIDIsMCwwLDE3MDUKLSBGSUxFRkxBR1NNQVNLIDB4M2ZMCi0jaWZkZWYgX0RFQlVHCi0gRklMRUZMQUdTIDB4MUwKLSNlbHNlCi0gRklMRUZMQUdTIDB4MEwKLSNlbmRpZgotIEZJTEVPUyAweDQwMDA0TAotIEZJTEVUWVBFIDB4MkwKLSBGSUxFU1VCVFlQRSAweDBMCi1CRUdJTgotICAgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyIKLSAgICBCRUdJTgotICAgICAgICBCTE9DSyAiMDgwOTA0YjAiCi0gICAgICAgIEJFR0lOCi0gICAgICAgICAgICBWQUxVRSAiQ29tbWVudHMiLCAiRm94aXQgQ29ycG9yYXRpb25cMCIKLSAgICAgICAgICAgIFZBTFVFICJDb21wYW55TmFtZSIsICJGb3hpdCBDb3Jwb3JhdGlvblwwIgotICAgICAgICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsICJmcGRmc2RrXDAiCi0gICAgICAgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLCAiMiwgMCwgMCwgMTcwNVwwIgotICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICJmcGRmc2RrXDAiCi0gICAgICAgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiQ29weXJpZ2h0IChDKSAyMDA0LTIwMDkgRm94aXQgQ29ycG9yYXRpb25cMCIKLSAgICAgICAgICAgIFZBTFVFICJMZWdhbFRyYWRlbWFya3MiLCAiXDAiCi0gICAgICAgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsICJmcGRmc2RrLmRsbFwwIgotICAgICAgICAgICAgVkFMVUUgIlByaXZhdGVCdWlsZCIsICJcMCIKLSAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsICJGb3hpdCBQREYgU0RLIERMTFwwIgotICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgIjIsIDAsIDAsIDE3MDVcMCIKLSAgICAgICAgICAgIFZBTFVFICJTcGVjaWFsQnVpbGQiLCAiXDAiCi0gICAgICAgIEVORAotICAgIEVORAotICAgIEJMT0NLICJWYXJGaWxlSW5mbyIKLSAgICBCRUdJTgotICAgICAgICBWQUxVRSAiVHJhbnNsYXRpb24iLCAweDgwOSwgMTIwMAotICAgIEVORAotRU5ECi0KLSNlbmRpZiAgICAvLyAhX01BQwotCi0KLSNpZmRlZiBBUFNUVURJT19JTlZPS0VECi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vIFRFWFRJTkNMVURFCi0vLwotCi0xIFRFWFRJTkNMVURFIE1PVkVBQkxFIFBVUkUgCi1CRUdJTgotICAgICJyZXNvdXJjZS5oXDAiCi1FTkQKLQotMiBURVhUSU5DTFVERSBNT1ZFQUJMRSBQVVJFIAotQkVHSU4KLSAgICAiI2luY2x1ZGUgIiJ3aW5kb3dzLmgiIlxyXG4iCi0gICAgIlwwIgotRU5ECi0KLTMgVEVYVElOQ0xVREUgTU9WRUFCTEUgUFVSRSAKLUJFR0lOCi0gICAgIlxyXG4iCi0gICAgIlwwIgotRU5ECi0KLSNlbmRpZiAgICAvLyBBUFNUVURJT19JTlZPS0VECi0KLSNlbmRpZiAgICAvLyBDaGluZXNlIChQLlIuQy4pIHJlc291cmNlcwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCi0KLSNpZm5kZWYgQVBTVFVESU9fSU5WT0tFRAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyBHZW5lcmF0ZWQgZnJvbSB0aGUgVEVYVElOQ0xVREUgMyByZXNvdXJjZS4KLS8vCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSNlbmRpZiAgICAvLyBub3QgQVBTVFVESU9fSU5WT0tFRAotCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmdGV4dC5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmdGV4dC5jcHAKaW5kZXggYTI1YjE1My4uYzc0NWMyNiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZnRleHQuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZ0ZXh0LmNwcApAQCAtMSwyNTMgKzEsMjk5IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9wdWJsaWMvZnBkZl90ZXh0LmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX2RlZmluZS5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX3RleHQuaCIKKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfZG9jLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZ0ZXh0L2ZwZGZfdGV4dC5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mc2RrX2RlZmluZS5oIgorCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2RvYy5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfcGFnZS5oIgorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCiAjaWZkZWYgX1dJTjMyCiAjaW5jbHVkZSA8dGNoYXIuaD4KICNlbmRpZgogCi0JLy8gamFiZGVsbWFsZWs6IGNvbW1lbnRlZCBvdXQgdG8gYnVpbGQgb24gTGludXguICBOb3QgdXNlZC4KLQkvLyBleHRlcm4gSEFORExFIGdfaE1vZHVsZTsKLQotRExMRVhQT1JUIEZQREZfVEVYVFBBR0UgU1REQ0FMTCBGUERGVGV4dF9Mb2FkUGFnZShGUERGX1BBR0UgcGFnZSkKLXsKLQlpZiAoIXBhZ2UpIHJldHVybiBOVUxMOwotCUlQREZfVGV4dFBhZ2UqIHRleHRwYWdlPU5VTEw7Ci0JQ1BERl9WaWV3ZXJQcmVmZXJlbmNlcyB2aWV3UmVmKCgoQ1BERl9QYWdlKilwYWdlKS0+bV9wRG9jdW1lbnQpOwotCXRleHRwYWdlPUlQREZfVGV4dFBhZ2U6OkNyZWF0ZVRleHRQYWdlKChDUERGX1BhZ2UqKXBhZ2Usdmlld1JlZi5Jc0RpcmVjdGlvblIyTCgpKTsKLQl0ZXh0cGFnZS0+UGFyc2VUZXh0UGFnZSgpOwotCXJldHVybiB0ZXh0cGFnZTsKK0RMTEVYUE9SVCBGUERGX1RFWFRQQUdFIFNURENBTEwgRlBERlRleHRfTG9hZFBhZ2UoRlBERl9QQUdFIHBhZ2UpIHsKKyAgQ1BERl9QYWdlKiBwUERGUGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2UpOworICBpZiAoIXBQREZQYWdlKQorICAgIHJldHVybiBudWxscHRyOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIENQREZYRkFfUGFnZSogcFBhZ2UgPSAoQ1BERlhGQV9QYWdlKilwYWdlOworICBDUERGWEZBX0RvY3VtZW50KiBwRG9jID0gcFBhZ2UtPkdldERvY3VtZW50KCk7CisgIENQREZfVmlld2VyUHJlZmVyZW5jZXMgdmlld1JlZihwRG9jLT5HZXRQREZEb2MoKSk7CisjZWxzZSAgLy8gUERGX0VOQUJMRV9YRkEKKyAgQ1BERl9WaWV3ZXJQcmVmZXJlbmNlcyB2aWV3UmVmKHBQREZQYWdlLT5tX3BEb2N1bWVudCk7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisgIElQREZfVGV4dFBhZ2UqIHRleHRwYWdlID0KKyAgICAgIElQREZfVGV4dFBhZ2U6OkNyZWF0ZVRleHRQYWdlKHBQREZQYWdlLCB2aWV3UmVmLklzRGlyZWN0aW9uUjJMKCkpOworICB0ZXh0cGFnZS0+UGFyc2VUZXh0UGFnZSgpOworICByZXR1cm4gdGV4dHBhZ2U7CiB9Ci1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZUZXh0X0Nsb3NlUGFnZShGUERGX1RFWFRQQUdFIHRleHRfcGFnZSkKLXsKLQlpZiAodGV4dF9wYWdlKXsKLQkJSVBERl9UZXh0UGFnZSogdGV4dHBhZ2U9KElQREZfVGV4dFBhZ2UqKXRleHRfcGFnZTsKLQkJZGVsZXRlIHRleHRwYWdlOwotCQl0ZXh0X3BhZ2U9TlVMTDsKLQl9CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZUZXh0X0Nsb3NlUGFnZShGUERGX1RFWFRQQUdFIHRleHRfcGFnZSkgeworICBkZWxldGUgKElQREZfVGV4dFBhZ2UqKXRleHRfcGFnZTsKIH0KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGVGV4dF9Db3VudENoYXJzKEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlKQotewotCWlmICghdGV4dF9wYWdlKSByZXR1cm4JLTE7Ci0JSVBERl9UZXh0UGFnZSogdGV4dHBhZ2U9KElQREZfVGV4dFBhZ2UqKXRleHRfcGFnZTsKLQlyZXR1cm4gIHRleHRwYWdlLT5Db3VudENoYXJzKCk7Ci19Ci1ETExFWFBPUlQgdW5zaWduZWQgaW50IFNURENBTEwgRlBERlRleHRfR2V0VW5pY29kZShGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwgaW50IGluZGV4KQotewotCWlmICghdGV4dF9wYWdlKSByZXR1cm4gLTE7Ci0JSVBERl9UZXh0UGFnZSogdGV4dHBhZ2U9KElQREZfVGV4dFBhZ2UqKXRleHRfcGFnZTsKLQotCWlmIChpbmRleDwwIHx8IGluZGV4Pj10ZXh0cGFnZS0+Q291bnRDaGFycygpKSByZXR1cm4gMDsKLQotCUZQREZfQ0hBUl9JTkZPCWNoYXJpbmZvOwotCXRleHRwYWdlLT5HZXRDaGFySW5mbyhpbmRleCxjaGFyaW5mbyk7Ci0JcmV0dXJuIGNoYXJpbmZvLm1fVW5pY29kZTsKLX0KLURMTEVYUE9SVCBkb3VibGUgU1REQ0FMTCBGUERGVGV4dF9HZXRGb250U2l6ZShGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwgaW50IGluZGV4KQotewotCWlmICghdGV4dF9wYWdlKSByZXR1cm4gMDsKLQlJUERGX1RleHRQYWdlKiB0ZXh0cGFnZT0oSVBERl9UZXh0UGFnZSopdGV4dF9wYWdlOwotCi0JaWYgKGluZGV4PDAgfHwgaW5kZXg+PXRleHRwYWdlLT5Db3VudENoYXJzKCkpIHJldHVybiAwOwotCi0JRlBERl9DSEFSX0lORk8JY2hhcmluZm87Ci0JdGV4dHBhZ2UtPkdldENoYXJJbmZvKGluZGV4LGNoYXJpbmZvKTsKLQlyZXR1cm4gY2hhcmluZm8ubV9Gb250U2l6ZTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGVGV4dF9Db3VudENoYXJzKEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlKSB7CisgIGlmICghdGV4dF9wYWdlKQorICAgIHJldHVybiAtMTsKKyAgSVBERl9UZXh0UGFnZSogdGV4dHBhZ2UgPSAoSVBERl9UZXh0UGFnZSopdGV4dF9wYWdlOworICByZXR1cm4gdGV4dHBhZ2UtPkNvdW50Q2hhcnMoKTsKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGVGV4dF9HZXRDaGFyQm94KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLCBpbnQgaW5kZXgsZG91YmxlKiBsZWZ0LAotCQkJCQkJCQkJCQkJCWRvdWJsZSogcmlnaHQsIGRvdWJsZSogYm90dG9tLCBkb3VibGUqIHRvcCkKLXsKLQlpZiAoIXRleHRfcGFnZSkgcmV0dXJuOwotCUlQREZfVGV4dFBhZ2UqIHRleHRwYWdlPShJUERGX1RleHRQYWdlKil0ZXh0X3BhZ2U7Ci0JCi0JaWYgKGluZGV4PDAgfHwgaW5kZXg+PXRleHRwYWdlLT5Db3VudENoYXJzKCkpIHJldHVybiA7Ci0JRlBERl9DSEFSX0lORk8JY2hhcmluZm87Ci0JdGV4dHBhZ2UtPkdldENoYXJJbmZvKGluZGV4LGNoYXJpbmZvKTsKLQkqbGVmdD1jaGFyaW5mby5tX0NoYXJCb3gubGVmdDsKLQkqcmlnaHQ9Y2hhcmluZm8ubV9DaGFyQm94LnJpZ2h0OwotCSpib3R0b209Y2hhcmluZm8ubV9DaGFyQm94LmJvdHRvbTsKLQkqdG9wPWNoYXJpbmZvLm1fQ2hhckJveC50b3A7CitETExFWFBPUlQgdW5zaWduZWQgaW50IFNURENBTEwgRlBERlRleHRfR2V0VW5pY29kZShGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgeworICBpZiAoIXRleHRfcGFnZSkKKyAgICByZXR1cm4gLTE7CisgIElQREZfVGV4dFBhZ2UqIHRleHRwYWdlID0gKElQREZfVGV4dFBhZ2UqKXRleHRfcGFnZTsKKworICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRleHRwYWdlLT5Db3VudENoYXJzKCkpCisgICAgcmV0dXJuIDA7CisKKyAgRlBERl9DSEFSX0lORk8gY2hhcmluZm87CisgIHRleHRwYWdlLT5HZXRDaGFySW5mbyhpbmRleCwgJmNoYXJpbmZvKTsKKyAgcmV0dXJuIGNoYXJpbmZvLm1fVW5pY29kZTsKIH0KIAotLy9zZWxlY3QKLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGVGV4dF9HZXRDaGFySW5kZXhBdFBvcyhGUERGX1RFWFRQQUdFIHRleHRfcGFnZSxkb3VibGUgeCxkb3VibGUgeSxkb3VibGUgeFRvcmVsYW5jZSxkb3VibGUgeVRvcmVsYW5jZSkKLXsKLQlpZiAoIXRleHRfcGFnZSkgcmV0dXJuIC0zOwotCUlQREZfVGV4dFBhZ2UqIHRleHRwYWdlPShJUERGX1RleHRQYWdlKil0ZXh0X3BhZ2U7Ci0JcmV0dXJuIHRleHRwYWdlLT5HZXRJbmRleEF0UG9zKChGWF9GTE9BVCl4LChGWF9GTE9BVCl5LChGWF9GTE9BVCl4VG9yZWxhbmNlLChGWF9GTE9BVCl5VG9yZWxhbmNlKTsKK0RMTEVYUE9SVCBkb3VibGUgU1REQ0FMTCBGUERGVGV4dF9HZXRGb250U2l6ZShGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIHsKKyAgaWYgKCF0ZXh0X3BhZ2UpCisgICAgcmV0dXJuIDA7CisgIElQREZfVGV4dFBhZ2UqIHRleHRwYWdlID0gKElQREZfVGV4dFBhZ2UqKXRleHRfcGFnZTsKKworICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRleHRwYWdlLT5Db3VudENoYXJzKCkpCisgICAgcmV0dXJuIDA7CisKKyAgRlBERl9DSEFSX0lORk8gY2hhcmluZm87CisgIHRleHRwYWdlLT5HZXRDaGFySW5mbyhpbmRleCwgJmNoYXJpbmZvKTsKKyAgcmV0dXJuIGNoYXJpbmZvLm1fRm9udFNpemU7CiB9CiAKLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGVGV4dF9HZXRUZXh0KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLGludCBzdGFydCxpbnQgY291bnQsdW5zaWduZWQgc2hvcnQqIHJlc3VsdCkKLXsKLQlpZiAoIXRleHRfcGFnZSkgcmV0dXJuIDA7Ci0JSVBERl9UZXh0UGFnZSogdGV4dHBhZ2U9KElQREZfVGV4dFBhZ2UqKXRleHRfcGFnZTsKLQkKLQlpZiAoc3RhcnQ+PXRleHRwYWdlLT5Db3VudENoYXJzKCkpIHJldHVybiAwOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGVGV4dF9HZXRDaGFyQm94KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRvcCkgeworICBpZiAoIXRleHRfcGFnZSkKKyAgICByZXR1cm47CisgIElQREZfVGV4dFBhZ2UqIHRleHRwYWdlID0gKElQREZfVGV4dFBhZ2UqKXRleHRfcGFnZTsKIAotCUNGWF9XaWRlU3RyaW5nIHN0cj10ZXh0cGFnZS0+R2V0UGFnZVRleHQoc3RhcnQsY291bnQpOwotCWlmKHN0ci5HZXRMZW5ndGgoKT5jb3VudCkKLQkJc3RyID0gc3RyLkxlZnQoY291bnQpOwotCi0JQ0ZYX0J5dGVTdHJpbmcgY2JVVEYxNnN0ciA9IHN0ci5VVEYxNkxFX0VuY29kZSgpOwotCUZYU1lTX21lbWNweShyZXN1bHQsY2JVVEYxNnN0ci5HZXRCdWZmZXIoY2JVVEYxNnN0ci5HZXRMZW5ndGgoKSksY2JVVEYxNnN0ci5HZXRMZW5ndGgoKSk7Ci0JY2JVVEYxNnN0ci5SZWxlYXNlQnVmZmVyKGNiVVRGMTZzdHIuR2V0TGVuZ3RoKCkpOwotCi0JcmV0dXJuIGNiVVRGMTZzdHIuR2V0TGVuZ3RoKCkvc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsKKyAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0ZXh0cGFnZS0+Q291bnRDaGFycygpKQorICAgIHJldHVybjsKKyAgRlBERl9DSEFSX0lORk8gY2hhcmluZm87CisgIHRleHRwYWdlLT5HZXRDaGFySW5mbyhpbmRleCwgJmNoYXJpbmZvKTsKKyAgKmxlZnQgPSBjaGFyaW5mby5tX0NoYXJCb3gubGVmdDsKKyAgKnJpZ2h0ID0gY2hhcmluZm8ubV9DaGFyQm94LnJpZ2h0OworICAqYm90dG9tID0gY2hhcmluZm8ubV9DaGFyQm94LmJvdHRvbTsKKyAgKnRvcCA9IGNoYXJpbmZvLm1fQ2hhckJveC50b3A7CiB9CiAKLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGVGV4dF9Db3VudFJlY3RzKEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLGludCBzdGFydCxpbnQgY291bnQpCi17Ci0JaWYgKCF0ZXh0X3BhZ2UpIHJldHVybiAwOwotCUlQREZfVGV4dFBhZ2UqIHRleHRwYWdlPShJUERGX1RleHRQYWdlKil0ZXh0X3BhZ2U7Ci0JcmV0dXJuCXRleHRwYWdlLT5Db3VudFJlY3RzKHN0YXJ0LGNvdW50KTsKLQotfQotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGVGV4dF9HZXRSZWN0KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLGludCByZWN0X2luZGV4LCBkb3VibGUqIGxlZnQsZG91YmxlKiAgdG9wLAotCQkJCQkJCQkJCWRvdWJsZSogIHJpZ2h0LCBkb3VibGUqICBib3R0b20pCi17Ci0JaWYgKCF0ZXh0X3BhZ2UpIHJldHVybjsKLQlJUERGX1RleHRQYWdlKiB0ZXh0cGFnZT0oSVBERl9UZXh0UGFnZSopdGV4dF9wYWdlOwotCUNGWF9GbG9hdFJlY3QJcmVjdDsKLQl0ZXh0cGFnZS0+R2V0UmVjdChyZWN0X2luZGV4LHJlY3QubGVmdCxyZWN0LnRvcCxyZWN0LnJpZ2h0LHJlY3QuYm90dG9tKTsKLQkqbGVmdD1yZWN0LmxlZnQ7Ci0JKnRvcD1yZWN0LnRvcDsKLQkqcmlnaHQ9cmVjdC5yaWdodDsKLQkqYm90dG9tPXJlY3QuYm90dG9tOworLy8gc2VsZWN0CitETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfR2V0Q2hhckluZGV4QXRQb3MoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHhUb2xlcmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHlUb2xlcmFuY2UpIHsKKyAgaWYgKCF0ZXh0X3BhZ2UpCisgICAgcmV0dXJuIC0zOworICBJUERGX1RleHRQYWdlKiB0ZXh0cGFnZSA9IChJUERGX1RleHRQYWdlKil0ZXh0X3BhZ2U7CisgIHJldHVybiB0ZXh0cGFnZS0+R2V0SW5kZXhBdFBvcygoRlhfRkxPQVQpeCwgKEZYX0ZMT0FUKXksIChGWF9GTE9BVCl4VG9sZXJhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKXlUb2xlcmFuY2UpOwogfQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfR2V0Qm91bmRlZFRleHQoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsZG91YmxlIGxlZnQsIGRvdWJsZSB0b3AsIAotCQkJCQkJCQkJCQkgIGRvdWJsZSByaWdodCwgZG91YmxlIGJvdHRvbSx1bnNpZ25lZCBzaG9ydCogYnVmZmVyLGludCBidWZsZW4pCi17Ci0JaWYgKCF0ZXh0X3BhZ2UpIHJldHVybiAwOwotCUlQREZfVGV4dFBhZ2UqIHRleHRwYWdlPShJUERGX1RleHRQYWdlKil0ZXh0X3BhZ2U7Ci0JQ0ZYX0Zsb2F0UmVjdCByZWN0KChGWF9GTE9BVClsZWZ0LChGWF9GTE9BVClib3R0b20sKEZYX0ZMT0FUKXJpZ2h0LChGWF9GTE9BVCl0b3ApOwotCUNGWF9XaWRlU3RyaW5nIHN0cj10ZXh0cGFnZS0+R2V0VGV4dEJ5UmVjdChyZWN0KTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGVGV4dF9HZXRUZXh0KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQqIHJlc3VsdCkgeworICBpZiAoIXRleHRfcGFnZSkKKyAgICByZXR1cm4gMDsKKyAgSVBERl9UZXh0UGFnZSogdGV4dHBhZ2UgPSAoSVBERl9UZXh0UGFnZSopdGV4dF9wYWdlOwogCi0JaWYgKGJ1Zmxlbjw9MCB8fCBidWZmZXI9PU5VTEwpCi0JewotCQlyZXR1cm4gc3RyLkdldExlbmd0aCgpOwotCX0KKyAgaWYgKHN0YXJ0ID49IHRleHRwYWdlLT5Db3VudENoYXJzKCkpCisgICAgcmV0dXJuIDA7CiAKLQlDRlhfQnl0ZVN0cmluZyBjYlVURjE2U3RyID0gc3RyLlVURjE2TEVfRW5jb2RlKCk7Ci0JaW50IGxlbiA9IGNiVVRGMTZTdHIuR2V0TGVuZ3RoKCkvc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsKLQlpbnQgc2l6ZSA9IGJ1ZmxlbiA+IGxlbiA/IGxlbiA6IGJ1ZmxlbjsKLQlGWFNZU19tZW1jcHkoYnVmZmVyLGNiVVRGMTZTdHIuR2V0QnVmZmVyKHNpemUqc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSksc2l6ZSpzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKLQljYlVURjE2U3RyLlJlbGVhc2VCdWZmZXIoc2l6ZSpzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgc3RyID0gdGV4dHBhZ2UtPkdldFBhZ2VUZXh0KHN0YXJ0LCBjb3VudCk7CisgIGlmIChzdHIuR2V0TGVuZ3RoKCkgPiBjb3VudCkKKyAgICBzdHIgPSBzdHIuTGVmdChjb3VudCk7CiAKLQlyZXR1cm4gc2l6ZTsKLQkJCisgIENGWF9CeXRlU3RyaW5nIGNiVVRGMTZzdHIgPSBzdHIuVVRGMTZMRV9FbmNvZGUoKTsKKyAgRlhTWVNfbWVtY3B5KHJlc3VsdCwgY2JVVEYxNnN0ci5HZXRCdWZmZXIoY2JVVEYxNnN0ci5HZXRMZW5ndGgoKSksCisgICAgICAgICAgICAgICBjYlVURjE2c3RyLkdldExlbmd0aCgpKTsKKyAgY2JVVEYxNnN0ci5SZWxlYXNlQnVmZmVyKGNiVVRGMTZzdHIuR2V0TGVuZ3RoKCkpOworCisgIHJldHVybiBjYlVURjE2c3RyLkdldExlbmd0aCgpIC8gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsKIH0KIAotLy9TZWFyY2gKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGVGV4dF9Db3VudFJlY3RzKEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KSB7CisgIGlmICghdGV4dF9wYWdlKQorICAgIHJldHVybiAwOworICBJUERGX1RleHRQYWdlKiB0ZXh0cGFnZSA9IChJUERGX1RleHRQYWdlKil0ZXh0X3BhZ2U7CisgIHJldHVybiB0ZXh0cGFnZS0+Q291bnRSZWN0cyhzdGFydCwgY291bnQpOworfQorRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGVGV4dF9HZXRSZWN0KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWN0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYm90dG9tKSB7CisgIGlmICghdGV4dF9wYWdlKQorICAgIHJldHVybjsKKyAgSVBERl9UZXh0UGFnZSogdGV4dHBhZ2UgPSAoSVBERl9UZXh0UGFnZSopdGV4dF9wYWdlOworICBDRlhfRmxvYXRSZWN0IHJlY3Q7CisgIHRleHRwYWdlLT5HZXRSZWN0KHJlY3RfaW5kZXgsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKTsKKyAgKmxlZnQgPSByZWN0LmxlZnQ7CisgICp0b3AgPSByZWN0LnRvcDsKKyAgKnJpZ2h0ID0gcmVjdC5yaWdodDsKKyAgKmJvdHRvbSA9IHJlY3QuYm90dG9tOworfQorCitETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfR2V0Qm91bmRlZFRleHQoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZsZW4pIHsKKyAgaWYgKCF0ZXh0X3BhZ2UpCisgICAgcmV0dXJuIDA7CisgIElQREZfVGV4dFBhZ2UqIHRleHRwYWdlID0gKElQREZfVGV4dFBhZ2UqKXRleHRfcGFnZTsKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0KChGWF9GTE9BVClsZWZ0LCAoRlhfRkxPQVQpYm90dG9tLCAoRlhfRkxPQVQpcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpdG9wKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgc3RyID0gdGV4dHBhZ2UtPkdldFRleHRCeVJlY3QocmVjdCk7CisKKyAgaWYgKGJ1ZmxlbiA8PSAwIHx8ICFidWZmZXIpIHsKKyAgICByZXR1cm4gc3RyLkdldExlbmd0aCgpOworICB9CisKKyAgQ0ZYX0J5dGVTdHJpbmcgY2JVVEYxNlN0ciA9IHN0ci5VVEYxNkxFX0VuY29kZSgpOworICBpbnQgbGVuID0gY2JVVEYxNlN0ci5HZXRMZW5ndGgoKSAvIHNpemVvZih1bnNpZ25lZCBzaG9ydCk7CisgIGludCBzaXplID0gYnVmbGVuID4gbGVuID8gbGVuIDogYnVmbGVuOworICBGWFNZU19tZW1jcHkoYnVmZmVyLCBjYlVURjE2U3RyLkdldEJ1ZmZlcihzaXplICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSksCisgICAgICAgICAgICAgICBzaXplICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CisgIGNiVVRGMTZTdHIuUmVsZWFzZUJ1ZmZlcihzaXplICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CisKKyAgcmV0dXJuIHNpemU7Cit9CisKKy8vIFNlYXJjaAogLy8tMSBmb3IgZW5kCi1ETExFWFBPUlQgRlBERl9TQ0hIQU5ETEUgU1REQ0FMTCBGUERGVGV4dF9GaW5kU3RhcnQoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsRlBERl9XSURFU1RSSU5HIGZpbmR3aGF0LHVuc2lnbmVkIGxvbmcgZmxhZ3MsaW50IHN0YXJ0X2luZGV4KQotewotCWlmICghdGV4dF9wYWdlKSByZXR1cm4gTlVMTDsKLQlJUERGX1RleHRQYWdlRmluZCogdGV4dHBhZ2VGaW5kPU5VTEw7Ci0JdGV4dHBhZ2VGaW5kPUlQREZfVGV4dFBhZ2VGaW5kOjpDcmVhdGVQYWdlRmluZCgoSVBERl9UZXh0UGFnZSopdGV4dF9wYWdlKTsKLQlGWF9TVFJTSVpFIGxlbiA9IENGWF9XaWRlU3RyaW5nOjpXU3RyaW5nTGVuZ3RoKGZpbmR3aGF0KTsKLQl0ZXh0cGFnZUZpbmQtPkZpbmRGaXJzdChDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoZmluZHdoYXQsIGxlbiksZmxhZ3Msc3RhcnRfaW5kZXgpOwotCXJldHVybiB0ZXh0cGFnZUZpbmQ7CitETExFWFBPUlQgRlBERl9TQ0hIQU5ETEUgU1REQ0FMTCBGUERGVGV4dF9GaW5kU3RhcnQoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIGZpbmR3aGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2luZGV4KSB7CisgIGlmICghdGV4dF9wYWdlKQorICAgIHJldHVybiBOVUxMOworICBJUERGX1RleHRQYWdlRmluZCogdGV4dHBhZ2VGaW5kID0gTlVMTDsKKyAgdGV4dHBhZ2VGaW5kID0gSVBERl9UZXh0UGFnZUZpbmQ6OkNyZWF0ZVBhZ2VGaW5kKChJUERGX1RleHRQYWdlKil0ZXh0X3BhZ2UpOworICBGWF9TVFJTSVpFIGxlbiA9IENGWF9XaWRlU3RyaW5nOjpXU3RyaW5nTGVuZ3RoKGZpbmR3aGF0KTsKKyAgdGV4dHBhZ2VGaW5kLT5GaW5kRmlyc3QoQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEYxNkxFKGZpbmR3aGF0LCBsZW4pLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfaW5kZXgpOworICByZXR1cm4gdGV4dHBhZ2VGaW5kOwogfQotRExMRVhQT1JUIEZQREZfQk9PTAlTVERDQUxMIEZQREZUZXh0X0ZpbmROZXh0KEZQREZfU0NISEFORExFIGhhbmRsZSkKLXsKLQlpZiAoIWhhbmRsZSkgcmV0dXJuIEZBTFNFOwotCUlQREZfVGV4dFBhZ2VGaW5kKiB0ZXh0cGFnZUZpbmQ9KElQREZfVGV4dFBhZ2VGaW5kKiloYW5kbGU7Ci0JcmV0dXJuCXRleHRwYWdlRmluZC0+RmluZE5leHQoKTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGVGV4dF9GaW5kTmV4dChGUERGX1NDSEhBTkRMRSBoYW5kbGUpIHsKKyAgaWYgKCFoYW5kbGUpCisgICAgcmV0dXJuIEZBTFNFOworICBJUERGX1RleHRQYWdlRmluZCogdGV4dHBhZ2VGaW5kID0gKElQREZfVGV4dFBhZ2VGaW5kKiloYW5kbGU7CisgIHJldHVybiB0ZXh0cGFnZUZpbmQtPkZpbmROZXh0KCk7CiB9Ci1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlRleHRfRmluZFByZXYoRlBERl9TQ0hIQU5ETEUgaGFuZGxlKQotewotCWlmICghaGFuZGxlKSByZXR1cm4gRkFMU0U7Ci0JSVBERl9UZXh0UGFnZUZpbmQqIHRleHRwYWdlRmluZD0oSVBERl9UZXh0UGFnZUZpbmQqKWhhbmRsZTsKLQlyZXR1cm4JdGV4dHBhZ2VGaW5kLT5GaW5kUHJldigpOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZUZXh0X0ZpbmRQcmV2KEZQREZfU0NISEFORExFIGhhbmRsZSkgeworICBpZiAoIWhhbmRsZSkKKyAgICByZXR1cm4gRkFMU0U7CisgIElQREZfVGV4dFBhZ2VGaW5kKiB0ZXh0cGFnZUZpbmQgPSAoSVBERl9UZXh0UGFnZUZpbmQqKWhhbmRsZTsKKyAgcmV0dXJuIHRleHRwYWdlRmluZC0+RmluZFByZXYoKTsKIH0KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGVGV4dF9HZXRTY2hSZXN1bHRJbmRleChGUERGX1NDSEhBTkRMRSBoYW5kbGUpCi17Ci0JaWYgKCFoYW5kbGUpIHJldHVybiAwOwotCUlQREZfVGV4dFBhZ2VGaW5kKiB0ZXh0cGFnZUZpbmQ9KElQREZfVGV4dFBhZ2VGaW5kKiloYW5kbGU7Ci0JcmV0dXJuIHRleHRwYWdlRmluZC0+R2V0Q3VyT3JkZXIoKTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGVGV4dF9HZXRTY2hSZXN1bHRJbmRleChGUERGX1NDSEhBTkRMRSBoYW5kbGUpIHsKKyAgaWYgKCFoYW5kbGUpCisgICAgcmV0dXJuIDA7CisgIElQREZfVGV4dFBhZ2VGaW5kKiB0ZXh0cGFnZUZpbmQgPSAoSVBERl9UZXh0UGFnZUZpbmQqKWhhbmRsZTsKKyAgcmV0dXJuIHRleHRwYWdlRmluZC0+R2V0Q3VyT3JkZXIoKTsKIH0KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGVGV4dF9HZXRTY2hDb3VudChGUERGX1NDSEhBTkRMRSBoYW5kbGUpCi17Ci0JaWYgKCFoYW5kbGUpIHJldHVybiAwOwotCUlQREZfVGV4dFBhZ2VGaW5kKiB0ZXh0cGFnZUZpbmQ9KElQREZfVGV4dFBhZ2VGaW5kKiloYW5kbGU7Ci0JcmV0dXJuIHRleHRwYWdlRmluZC0+R2V0TWF0Y2hlZENvdW50KCk7CitETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfR2V0U2NoQ291bnQoRlBERl9TQ0hIQU5ETEUgaGFuZGxlKSB7CisgIGlmICghaGFuZGxlKQorICAgIHJldHVybiAwOworICBJUERGX1RleHRQYWdlRmluZCogdGV4dHBhZ2VGaW5kID0gKElQREZfVGV4dFBhZ2VGaW5kKiloYW5kbGU7CisgIHJldHVybiB0ZXh0cGFnZUZpbmQtPkdldE1hdGNoZWRDb3VudCgpOwogfQotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGVGV4dF9GaW5kQ2xvc2UoRlBERl9TQ0hIQU5ETEUgaGFuZGxlKQotewotCWlmICghaGFuZGxlKSByZXR1cm47Ci0JSVBERl9UZXh0UGFnZUZpbmQqIHRleHRwYWdlRmluZD0oSVBERl9UZXh0UGFnZUZpbmQqKWhhbmRsZTsKLQlkZWxldGUJdGV4dHBhZ2VGaW5kOwotCWhhbmRsZT1OVUxMOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGVGV4dF9GaW5kQ2xvc2UoRlBERl9TQ0hIQU5ETEUgaGFuZGxlKSB7CisgIGlmICghaGFuZGxlKQorICAgIHJldHVybjsKKyAgSVBERl9UZXh0UGFnZUZpbmQqIHRleHRwYWdlRmluZCA9IChJUERGX1RleHRQYWdlRmluZCopaGFuZGxlOworICBkZWxldGUgdGV4dHBhZ2VGaW5kOworICBoYW5kbGUgPSBOVUxMOwogfQogCi0vL3dlYiBsaW5rCi1ETExFWFBPUlQgRlBERl9QQUdFTElOSyBTVERDQUxMIEZQREZMaW5rX0xvYWRXZWJMaW5rcyhGUERGX1RFWFRQQUdFIHRleHRfcGFnZSkKLXsKLQlpZiAoIXRleHRfcGFnZSkgcmV0dXJuIE5VTEw7Ci0JSVBERl9MaW5rRXh0cmFjdCogcGFnZUxpbms9TlVMTDsKLQlwYWdlTGluaz1JUERGX0xpbmtFeHRyYWN0OjpDcmVhdGVMaW5rRXh0cmFjdCgpOwotCXBhZ2VMaW5rLT5FeHRyYWN0TGlua3MoKElQREZfVGV4dFBhZ2UqKXRleHRfcGFnZSk7Ci0JcmV0dXJuIHBhZ2VMaW5rOworLy8gd2ViIGxpbmsKK0RMTEVYUE9SVCBGUERGX1BBR0VMSU5LIFNURENBTEwgRlBERkxpbmtfTG9hZFdlYkxpbmtzKEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlKSB7CisgIGlmICghdGV4dF9wYWdlKQorICAgIHJldHVybiBOVUxMOworICBJUERGX0xpbmtFeHRyYWN0KiBwYWdlTGluayA9IE5VTEw7CisgIHBhZ2VMaW5rID0gSVBERl9MaW5rRXh0cmFjdDo6Q3JlYXRlTGlua0V4dHJhY3QoKTsKKyAgcGFnZUxpbmstPkV4dHJhY3RMaW5rcygoSVBERl9UZXh0UGFnZSopdGV4dF9wYWdlKTsKKyAgcmV0dXJuIHBhZ2VMaW5rOwogfQotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZMaW5rX0NvdW50V2ViTGlua3MoRlBERl9QQUdFTElOSyBsaW5rX3BhZ2UpCi17Ci0JaWYgKCFsaW5rX3BhZ2UpIHJldHVybiAwOwotCUlQREZfTGlua0V4dHJhY3QqIHBhZ2VMaW5rPShJUERGX0xpbmtFeHRyYWN0KilsaW5rX3BhZ2U7Ci0JcmV0dXJuCXBhZ2VMaW5rLT5Db3VudExpbmtzKCk7CitETExFWFBPUlQgaW50IFNURENBTEwgRlBERkxpbmtfQ291bnRXZWJMaW5rcyhGUERGX1BBR0VMSU5LIGxpbmtfcGFnZSkgeworICBpZiAoIWxpbmtfcGFnZSkKKyAgICByZXR1cm4gMDsKKyAgSVBERl9MaW5rRXh0cmFjdCogcGFnZUxpbmsgPSAoSVBERl9MaW5rRXh0cmFjdCopbGlua19wYWdlOworICByZXR1cm4gcGFnZUxpbmstPkNvdW50TGlua3MoKTsKIH0KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGTGlua19HZXRVUkwoRlBERl9QQUdFTElOSyBsaW5rX3BhZ2UsaW50IGxpbmtfaW5kZXgsIHVuc2lnbmVkIHNob3J0KiBidWZmZXIsaW50IGJ1ZmxlbikKLXsKLQlpZiAoIWxpbmtfcGFnZSkgcmV0dXJuIDA7Ci0JSVBERl9MaW5rRXh0cmFjdCogcGFnZUxpbms9KElQREZfTGlua0V4dHJhY3QqKWxpbmtfcGFnZTsKLQlDRlhfV2lkZVN0cmluZyB1cmw9cGFnZUxpbmstPkdldFVSTChsaW5rX2luZGV4KTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGTGlua19HZXRVUkwoRlBERl9QQUdFTElOSyBsaW5rX3BhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5rX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmbGVuKSB7CisgIGlmICghbGlua19wYWdlKQorICAgIHJldHVybiAwOworICBJUERGX0xpbmtFeHRyYWN0KiBwYWdlTGluayA9IChJUERGX0xpbmtFeHRyYWN0KilsaW5rX3BhZ2U7CisgIENGWF9XaWRlU3RyaW5nIHVybCA9IHBhZ2VMaW5rLT5HZXRVUkwobGlua19pbmRleCk7CiAKLQlDRlhfQnl0ZVN0cmluZyBjYlVURjE2VVJMID0gdXJsLlVURjE2TEVfRW5jb2RlKCk7Ci0JaW50IGxlbj0gY2JVVEYxNlVSTC5HZXRMZW5ndGgoKS9zaXplb2YodW5zaWduZWQgc2hvcnQpOwotCWlmIChidWZmZXI9PU5VTEwgfHwgYnVmbGVuPD0wKQotCQlyZXR1cm4gbGVuOwotCWludCBzaXplPWxlbjxidWZsZW4gPyBsZW4gOmJ1ZmxlbjsKLQlpZiAoc2l6ZT4wKQotCXsKLQkJRlhTWVNfbWVtY3B5KGJ1ZmZlcixjYlVURjE2VVJMLkdldEJ1ZmZlcihzaXplKnNpemVvZih1bnNpZ25lZCBzaG9ydCkpLHNpemUqc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7Ci0JCWNiVVRGMTZVUkwuUmVsZWFzZUJ1ZmZlcihzaXplKnNpemVvZih1bnNpZ25lZCBzaG9ydCkpOwotCX0KLQlyZXR1cm4gc2l6ZTsKKyAgQ0ZYX0J5dGVTdHJpbmcgY2JVVEYxNlVSTCA9IHVybC5VVEYxNkxFX0VuY29kZSgpOworICBpbnQgbGVuID0gY2JVVEYxNlVSTC5HZXRMZW5ndGgoKSAvIHNpemVvZih1bnNpZ25lZCBzaG9ydCk7CisgIGlmICghYnVmZmVyIHx8IGJ1ZmxlbiA8PSAwKQorICAgIHJldHVybiBsZW47CisgIGludCBzaXplID0gbGVuIDwgYnVmbGVuID8gbGVuIDogYnVmbGVuOworICBpZiAoc2l6ZSA+IDApIHsKKyAgICBGWFNZU19tZW1jcHkoYnVmZmVyLCBjYlVURjE2VVJMLkdldEJ1ZmZlcihzaXplICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSksCisgICAgICAgICAgICAgICAgIHNpemUgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKKyAgICBjYlVURjE2VVJMLlJlbGVhc2VCdWZmZXIoc2l6ZSAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOworICB9CisgIHJldHVybiBzaXplOwogfQotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZMaW5rX0NvdW50UmVjdHMoRlBERl9QQUdFTElOSyBsaW5rX3BhZ2UsaW50IGxpbmtfaW5kZXgpCi17Ci0JaWYgKCFsaW5rX3BhZ2UpIHJldHVybiAwOwotCUlQREZfTGlua0V4dHJhY3QqIHBhZ2VMaW5rPShJUERGX0xpbmtFeHRyYWN0KilsaW5rX3BhZ2U7Ci0JQ0ZYX1JlY3RBcnJheSByZWN0QXJyYXk7Ci0JcGFnZUxpbmstPkdldFJlY3RzKGxpbmtfaW5kZXgscmVjdEFycmF5KTsKLQlyZXR1cm4gcmVjdEFycmF5LkdldFNpemUoKTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGTGlua19Db3VudFJlY3RzKEZQREZfUEFHRUxJTksgbGlua19wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmtfaW5kZXgpIHsKKyAgaWYgKCFsaW5rX3BhZ2UpCisgICAgcmV0dXJuIDA7CisgIElQREZfTGlua0V4dHJhY3QqIHBhZ2VMaW5rID0gKElQREZfTGlua0V4dHJhY3QqKWxpbmtfcGFnZTsKKyAgQ0ZYX1JlY3RBcnJheSByZWN0QXJyYXk7CisgIHBhZ2VMaW5rLT5HZXRSZWN0cyhsaW5rX2luZGV4LCByZWN0QXJyYXkpOworICByZXR1cm4gcmVjdEFycmF5LkdldFNpemUoKTsKIH0KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERkxpbmtfR2V0UmVjdChGUERGX1BBR0VMSU5LIGxpbmtfcGFnZSxpbnQgbGlua19pbmRleCwgIGludCByZWN0X2luZGV4LCBkb3VibGUqIGxlZnQsCi0JCQkJCQkJCQkJZG91YmxlKiAgdG9wLGRvdWJsZSogIHJpZ2h0LCBkb3VibGUqICBib3R0b20pCi17Ci0JaWYgKCFsaW5rX3BhZ2UpIHJldHVybjsKLQlJUERGX0xpbmtFeHRyYWN0KiBwYWdlTGluaz0oSVBERl9MaW5rRXh0cmFjdCopbGlua19wYWdlOwotCUNGWF9SZWN0QXJyYXkgcmVjdEFycmF5OwotCXBhZ2VMaW5rLT5HZXRSZWN0cyhsaW5rX2luZGV4LHJlY3RBcnJheSk7Ci0JaWYgKHJlY3RfaW5kZXggPj0gMCAmJiByZWN0X2luZGV4IDwgcmVjdEFycmF5LkdldFNpemUoKSkgewotCQlDRlhfRmxvYXRSZWN0IHJlY3Q9cmVjdEFycmF5LkdldEF0KHJlY3RfaW5kZXgpOwotCQkqbGVmdD1yZWN0LmxlZnQ7Ci0JCSpyaWdodD1yZWN0LnJpZ2h0OwotCQkqdG9wPXJlY3QudG9wOwotCQkqYm90dG9tPXJlY3QuYm90dG9tOwotCX0KK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERkxpbmtfR2V0UmVjdChGUERGX1BBR0VMSU5LIGxpbmtfcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGlua19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVjdF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJvdHRvbSkgeworICBpZiAoIWxpbmtfcGFnZSkKKyAgICByZXR1cm47CisgIElQREZfTGlua0V4dHJhY3QqIHBhZ2VMaW5rID0gKElQREZfTGlua0V4dHJhY3QqKWxpbmtfcGFnZTsKKyAgQ0ZYX1JlY3RBcnJheSByZWN0QXJyYXk7CisgIHBhZ2VMaW5rLT5HZXRSZWN0cyhsaW5rX2luZGV4LCByZWN0QXJyYXkpOworICBpZiAocmVjdF9pbmRleCA+PSAwICYmIHJlY3RfaW5kZXggPCByZWN0QXJyYXkuR2V0U2l6ZSgpKSB7CisgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0ID0gcmVjdEFycmF5LkdldEF0KHJlY3RfaW5kZXgpOworICAgICpsZWZ0ID0gcmVjdC5sZWZ0OworICAgICpyaWdodCA9IHJlY3QucmlnaHQ7CisgICAgKnRvcCA9IHJlY3QudG9wOworICAgICpib3R0b20gPSByZWN0LmJvdHRvbTsKKyAgfQogfQotRExMRVhQT1JUIHZvaWQJU1REQ0FMTAlGUERGTGlua19DbG9zZVdlYkxpbmtzKEZQREZfUEFHRUxJTksgbGlua19wYWdlKQotewotCWlmICghbGlua19wYWdlKSByZXR1cm47Ci0JSVBERl9MaW5rRXh0cmFjdCogcGFnZUxpbms9KElQREZfTGlua0V4dHJhY3QqKWxpbmtfcGFnZTsKLQlkZWxldGUgcGFnZUxpbms7Ci0JcGFnZUxpbmsgPU5VTEw7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZMaW5rX0Nsb3NlV2ViTGlua3MoRlBERl9QQUdFTElOSyBsaW5rX3BhZ2UpIHsKKyAgZGVsZXRlIChJUERGX0xpbmtFeHRyYWN0KilsaW5rX3BhZ2U7CiB9Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZ0ZXh0X2VtYmVkZGVydGVzdC5jcHAgYi9mcGRmc2RrL3NyYy9mcGRmdGV4dF9lbWJlZGRlcnRlc3QuY3BwCmluZGV4IDgzODRhNDEuLmU4NGE5NmUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZ0ZXh0X2VtYmVkZGVydGVzdC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZnRleHRfZW1iZWRkZXJ0ZXN0LmNwcApAQCAtMiwxNiArMiwxOCBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotI2luY2x1ZGUgIi4uLy4uL3B1YmxpYy9mcGRmX3RleHQuaCIKLSNpbmNsdWRlICIuLi8uLi9wdWJsaWMvZnBkZnZpZXcuaCIKLSNpbmNsdWRlICIuLi8uLi90ZXN0aW5nL2VtYmVkZGVyX3Rlc3QuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl90ZXh0LmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiCisjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy90ZXN0X3N1cHBvcnQuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKIAogbmFtZXNwYWNlIHsKIAotc3RhdGljIGJvb2wgY2hlY2tfdW5zaWduZWRfc2hvcnRzKGNvbnN0IGNoYXIqIGV4cGVjdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0KiBhY3R1YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkgeworYm9vbCBjaGVja191bnNpZ25lZF9zaG9ydHMoY29uc3QgY2hhciogZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCogYWN0dWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkgewogICBpZiAobGVuZ3RoID4gc3RybGVuKGV4cGVjdGVkKSArIDEpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KQEAgLTI1LDExICsyNywxMCBAQAogCiB9ICAvLyBuYW1lc3BhY2UKIAotY2xhc3MgRlBERlRleHRFbWJlZGRlcnRlc3QgOiBwdWJsaWMgRW1iZWRkZXJUZXN0IHsKLX07CitjbGFzcyBGUERGVGV4dEVtYmVkZGVydGVzdCA6IHB1YmxpYyBFbWJlZGRlclRlc3Qge307CiAKIFRFU1RfRihGUERGVGV4dEVtYmVkZGVydGVzdCwgVGV4dCkgewotICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoInRlc3RpbmcvcmVzb3VyY2VzL2hlbGxvX3dvcmxkLnBkZiIpKTsKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJoZWxsb193b3JsZC5wZGYiKSk7CiAgIEZQREZfUEFHRSBwYWdlID0gTG9hZFBhZ2UoMCk7CiAgIEVYUEVDVF9ORShudWxscHRyLCBwYWdlKTsKIApAQCAtNDEsMTMgKzQyLDE3IEBACiAgIG1lbXNldChmaXhlZF9idWZmZXIsIDB4YmQsIHNpemVvZihmaXhlZF9idWZmZXIpKTsKIAogICAvLyBDaGVjayBpbmNsdWRlcyB0aGUgdGVybWluYXRpbmcgTlVMIHRoYXQgaXMgcHJvdmlkZWQuCi0gIEVYUEVDVF9FUShzaXplb2YoZXhwZWN0ZWQpLCBGUERGVGV4dF9HZXRUZXh0KHRleHRwYWdlLCAwLCAxMjgsIGZpeGVkX2J1ZmZlcikpOworICBpbnQgbnVtX2NoYXJzID0gRlBERlRleHRfR2V0VGV4dCh0ZXh0cGFnZSwgMCwgMTI4LCBmaXhlZF9idWZmZXIpOworICBBU1NFUlRfR0UobnVtX2NoYXJzLCAwKTsKKyAgRVhQRUNUX0VRKHNpemVvZihleHBlY3RlZCksIHN0YXRpY19jYXN0PHNpemVfdD4obnVtX2NoYXJzKSk7CiAgIEVYUEVDVF9UUlVFKGNoZWNrX3Vuc2lnbmVkX3Nob3J0cyhleHBlY3RlZCwgZml4ZWRfYnVmZmVyLCBzaXplb2YoZXhwZWN0ZWQpKSk7CiAKICAgLy8gQ291bnQgZG9lcyBub3QgaW5jbHVkZSB0aGUgdGVybWluYXRpbmcgTlVMIGluIHRoZSBzdHJpbmcgbGl0ZXJhbC4KICAgRVhQRUNUX0VRKHNpemVvZihleHBlY3RlZCkgLSAxLCBGUERGVGV4dF9Db3VudENoYXJzKHRleHRwYWdlKSk7CiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKGV4cGVjdGVkKSAtIDE7ICsraSkgewotICAgIEVYUEVDVF9FUShleHBlY3RlZFtpXSwgRlBERlRleHRfR2V0VW5pY29kZSh0ZXh0cGFnZSwgaSkpIDw8ICIgYXQgIiA8PCBpOworICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGV4cGVjdGVkW2ldKSwKKyAgICAgICAgICAgICAgRlBERlRleHRfR2V0VW5pY29kZSh0ZXh0cGFnZSwgaSkpCisgICAgICAgIDw8ICIgYXQgIiA8PCBpOwogICB9CiAKICAgRVhQRUNUX0VRKDEyLjAsIEZQREZUZXh0X0dldEZvbnRTaXplKHRleHRwYWdlLCAwKSk7CkBAIC02MywxOCArNjgsMTQgQEAKICAgRVhQRUNUX05FQVIoNDkuODQ0LCBib3R0b20sIDAuMDAxKTsKICAgRVhQRUNUX05FQVIoNTUuNTIwLCB0b3AsIDAuMDAxKTsKIAotICBFWFBFQ1RfRVEoNCwgRlBERlRleHRfR2V0Q2hhckluZGV4QXRQb3MoCi0gICAgICB0ZXh0cGFnZSwgNDIuMCwgNTAuMCwgMS4wLCAxLjApKTsKLSAgRVhQRUNUX0VRKC0xLCBGUERGVGV4dF9HZXRDaGFySW5kZXhBdFBvcygKLSAgICAgIHRleHRwYWdlLCAwLjAsIDAuMCwgMS4wLCAxLjApKTsKLSAgRVhQRUNUX0VRKC0xLCBGUERGVGV4dF9HZXRDaGFySW5kZXhBdFBvcygKLSAgICAgIHRleHRwYWdlLCAxOTkuMCwgMTk5LjAsIDEuMCwgMS4wKSk7CisgIEVYUEVDVF9FUSg0LCBGUERGVGV4dF9HZXRDaGFySW5kZXhBdFBvcyh0ZXh0cGFnZSwgNDIuMCwgNTAuMCwgMS4wLCAxLjApKTsKKyAgRVhQRUNUX0VRKC0xLCBGUERGVGV4dF9HZXRDaGFySW5kZXhBdFBvcyh0ZXh0cGFnZSwgMC4wLCAwLjAsIDEuMCwgMS4wKSk7CisgIEVYUEVDVF9FUSgtMSwgRlBERlRleHRfR2V0Q2hhckluZGV4QXRQb3ModGV4dHBhZ2UsIDE5OS4wLCAxOTkuMCwgMS4wLCAxLjApKTsKIAogICAvLyBUZXN0IG91dCBvZiByYW5nZSBpbmRpY2llcy4KLSAgRVhQRUNUX0VRKC0xLCBGUERGVGV4dF9HZXRDaGFySW5kZXhBdFBvcygKLSAgICAgIHRleHRwYWdlLCA0Mi4wLCAxMDAwMDAwMC4wLCAxLjAsIDEuMCkpOwotICBFWFBFQ1RfRVEoLTEsIEZQREZUZXh0X0dldENoYXJJbmRleEF0UG9zKAotICAgICAgdGV4dHBhZ2UsIC0xLjAsIDUwLjAsIDEuMCwgMS4wKSk7CisgIEVYUEVDVF9FUSgtMSwKKyAgICAgICAgICAgIEZQREZUZXh0X0dldENoYXJJbmRleEF0UG9zKHRleHRwYWdlLCA0Mi4wLCAxMDAwMDAwMC4wLCAxLjAsIDEuMCkpOworICBFWFBFQ1RfRVEoLTEsIEZQREZUZXh0X0dldENoYXJJbmRleEF0UG9zKHRleHRwYWdlLCAtMS4wLCA1MC4wLCAxLjAsIDEuMCkpOwogCiAgIC8vIENvdW50IGRvZXMgbm90IGluY2x1ZGUgdGhlIHRlcm1pbmF0aW5nIE5VTCBpbiB0aGUgc3RyaW5nIGxpdGVyYWwuCiAgIEVYUEVDVF9FUSgyLCBGUERGVGV4dF9Db3VudFJlY3RzKHRleHRwYWdlLCAwLCBzaXplb2YoZXhwZWN0ZWQpIC0gMSkpOwpAQCAtMTEwLDI1ICsxMTEsMjQgQEAKICAgRVhQRUNUX0VRKDAuMCwgYm90dG9tKTsKICAgRVhQRUNUX0VRKDAuMCwgdG9wKTsKIAotICBFWFBFQ1RfRVEoOSwgRlBERlRleHRfR2V0Qm91bmRlZFRleHQoCi0gICAgICB0ZXh0cGFnZSwgNDEuMCwgNTYuMCwgODIuMCwgNDguMCwgMCwgMCkpOworICBFWFBFQ1RfRVEoOSwgRlBERlRleHRfR2V0Qm91bmRlZFRleHQodGV4dHBhZ2UsIDQxLjAsIDU2LjAsIDgyLjAsIDQ4LjAsIDAsIDApKTsKIAogICAvLyBFeHRyYWN0IHN0YXJ0aW5nIGF0IGNoYXJhY3RlciA0IGFzIGFib3ZlLgogICBtZW1zZXQoZml4ZWRfYnVmZmVyLCAweGJkLCBzaXplb2YoZml4ZWRfYnVmZmVyKSk7Ci0gIEVYUEVDVF9FUSgxLCBGUERGVGV4dF9HZXRCb3VuZGVkVGV4dCgKLSAgICAgIHRleHRwYWdlLCA0MS4wLCA1Ni4wLCA4Mi4wLCA0OC4wLCBmaXhlZF9idWZmZXIsIDEpKTsKKyAgRVhQRUNUX0VRKDEsIEZQREZUZXh0X0dldEJvdW5kZWRUZXh0KHRleHRwYWdlLCA0MS4wLCA1Ni4wLCA4Mi4wLCA0OC4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfYnVmZmVyLCAxKSk7CiAgIEVYUEVDVF9UUlVFKGNoZWNrX3Vuc2lnbmVkX3Nob3J0cyhleHBlY3RlZCArIDQsIGZpeGVkX2J1ZmZlciwgMSkpOwogICBFWFBFQ1RfRVEoMHhiZGJkLCBmaXhlZF9idWZmZXJbMV0pOwogCiAgIG1lbXNldChmaXhlZF9idWZmZXIsIDB4YmQsIHNpemVvZihmaXhlZF9idWZmZXIpKTsKLSAgRVhQRUNUX0VRKDksIEZQREZUZXh0X0dldEJvdW5kZWRUZXh0KAotICAgICAgdGV4dHBhZ2UsIDQxLjAsIDU2LjAsIDgyLjAsIDQ4LjAsIGZpeGVkX2J1ZmZlciwgOSkpOworICBFWFBFQ1RfRVEoOSwgRlBERlRleHRfR2V0Qm91bmRlZFRleHQodGV4dHBhZ2UsIDQxLjAsIDU2LjAsIDgyLjAsIDQ4LjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF9idWZmZXIsIDkpKTsKICAgRVhQRUNUX1RSVUUoY2hlY2tfdW5zaWduZWRfc2hvcnRzKGV4cGVjdGVkICsgNCwgZml4ZWRfYnVmZmVyLCA5KSk7CiAgIEVYUEVDVF9FUSgweGJkYmQsIGZpeGVkX2J1ZmZlcls5XSk7CiAKICAgbWVtc2V0KGZpeGVkX2J1ZmZlciwgMHhiZCwgc2l6ZW9mKGZpeGVkX2J1ZmZlcikpOwotICBFWFBFQ1RfRVEoMTAsIEZQREZUZXh0X0dldEJvdW5kZWRUZXh0KAotICAgICAgdGV4dHBhZ2UsIDQxLjAsIDU2LjAsIDgyLjAsIDQ4LjAsIGZpeGVkX2J1ZmZlciwgMTI4KSk7CisgIEVYUEVDVF9FUSgxMCwgRlBERlRleHRfR2V0Qm91bmRlZFRleHQodGV4dHBhZ2UsIDQxLjAsIDU2LjAsIDgyLjAsIDQ4LjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfYnVmZmVyLCAxMjgpKTsKICAgRVhQRUNUX1RSVUUoY2hlY2tfdW5zaWduZWRfc2hvcnRzKGV4cGVjdGVkICsgNCwgZml4ZWRfYnVmZmVyLCA5KSk7CiAgIEVYUEVDVF9FUSgwdSwgZml4ZWRfYnVmZmVyWzldKTsKICAgRVhQRUNUX0VRKDB4YmRiZCwgZml4ZWRfYnVmZmVyWzEwXSk7CkBAIC0xMzgsMjEgKzEzOCwyNCBAQAogfQogCiBURVNUX0YoRlBERlRleHRFbWJlZGRlcnRlc3QsIFRleHRTZWFyY2gpIHsKLSAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJ0ZXN0aW5nL3Jlc291cmNlcy9oZWxsb193b3JsZC5wZGYiKSk7CisgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgiaGVsbG9fd29ybGQucGRmIikpOwogICBGUERGX1BBR0UgcGFnZSA9IExvYWRQYWdlKDApOwogICBFWFBFQ1RfTkUobnVsbHB0ciwgcGFnZSk7CiAKICAgRlBERl9URVhUUEFHRSB0ZXh0cGFnZSA9IEZQREZUZXh0X0xvYWRQYWdlKHBhZ2UpOwogICBFWFBFQ1RfTkUobnVsbHB0ciwgdGV4dHBhZ2UpOwogCi0gIC8vIEF2b2lkIGlzc3VlcyB3aXRoIHN5c3RlbSB3Y2hhcl90IHdpZHRoIHZzLiBGUERGX1dpZGVTdHJpbmcuCi0gIGNvbnN0IHVuc2lnbmVkIHNob3J0IG5vcGVbXSA9IHsgJ24nLCAnbycsICdwJywgJ2UnLCAnXDAnIH07Ci0gIGNvbnN0IHVuc2lnbmVkIHNob3J0IHdvcmxkW10gPSB7ICd3JywgJ28nLCAncicsICdsJywgJ2QnLCAnXDAnIH07Ci0gIGNvbnN0IHVuc2lnbmVkIHNob3J0IHdvcmxkX2NhcHNbXSA9IHsgJ1cnLCAnTycsICdSJywgJ0wnLCAnRCcsICdcMCcgfTsKLSAgY29uc3QgdW5zaWduZWQgc2hvcnQgd29ybGRfc3Vic3RyW10gPSB7ICdvJywgJ3InLCAnbCcsICdkJywgJ1wwJyB9OworICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWQgc2hvcnQsIHBkZml1bTo6RnJlZURlbGV0ZXI+IG5vcGUgPQorICAgICAgR2V0RlBERldpZGVTdHJpbmcoTCJub3BlIik7CisgIHN0ZDo6dW5pcXVlX3B0cjx1bnNpZ25lZCBzaG9ydCwgcGRmaXVtOjpGcmVlRGVsZXRlcj4gd29ybGQgPQorICAgICAgR2V0RlBERldpZGVTdHJpbmcoTCJ3b3JsZCIpOworICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWQgc2hvcnQsIHBkZml1bTo6RnJlZURlbGV0ZXI+IHdvcmxkX2NhcHMgPQorICAgICAgR2V0RlBERldpZGVTdHJpbmcoTCJXT1JMRCIpOworICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWQgc2hvcnQsIHBkZml1bTo6RnJlZURlbGV0ZXI+IHdvcmxkX3N1YnN0ciA9CisgICAgICBHZXRGUERGV2lkZVN0cmluZyhMIm9ybGQiKTsKIAogICAvLyBObyBvY2N1cmVuY2VzIG9mICJub3BlIiBpbiB0ZXN0IHBhZ2UuCi0gIEZQREZfU0NISEFORExFIHNlYXJjaCA9IEZQREZUZXh0X0ZpbmRTdGFydCh0ZXh0cGFnZSwgbm9wZSwgMCwgMCk7CisgIEZQREZfU0NISEFORExFIHNlYXJjaCA9IEZQREZUZXh0X0ZpbmRTdGFydCh0ZXh0cGFnZSwgbm9wZS5nZXQoKSwgMCwgMCk7CiAgIEVYUEVDVF9ORShudWxscHRyLCBzZWFyY2gpOwogICBFWFBFQ1RfRVEoMCwgRlBERlRleHRfR2V0U2NoUmVzdWx0SW5kZXgoc2VhcmNoKSk7CiAgIEVYUEVDVF9FUSgwLCBGUERGVGV4dF9HZXRTY2hDb3VudChzZWFyY2gpKTsKQEAgLTE2OSw3ICsxNzIsNyBAQAogICBGUERGVGV4dF9GaW5kQ2xvc2Uoc2VhcmNoKTsKIAogICAvLyBUd28gb2NjdXJlbmNlcyBvZiAid29ybGQiIGluIHRlc3QgcGFnZS4KLSAgc2VhcmNoID0gRlBERlRleHRfRmluZFN0YXJ0KHRleHRwYWdlLCB3b3JsZCwgMCwgMik7CisgIHNlYXJjaCA9IEZQREZUZXh0X0ZpbmRTdGFydCh0ZXh0cGFnZSwgd29ybGQuZ2V0KCksIDAsIDIpOwogICBFWFBFQ1RfTkUobnVsbHB0ciwgc2VhcmNoKTsKIAogICAvLyBSZW1haW5zIG5vdCBmb3VuZCB1bnRpbCBhZHZhbmNlZC4KQEAgLTIwMyw4ICsyMDYsOCBAQAogICBGUERGVGV4dF9GaW5kQ2xvc2Uoc2VhcmNoKTsKIAogICAvLyBFeGFjdCBzZWFyY2ggdW5hZmZlY3RlZCBieSBjYXNlIHNlbnNpdGlpdHkgYW5kIHdob2xlIHdvcmQgZmxhZ3MuCi0gIHNlYXJjaCA9IEZQREZUZXh0X0ZpbmRTdGFydCgKLSAgICAgIHRleHRwYWdlLCB3b3JsZCwgRlBERl9NQVRDSENBU0UgfCBGUERGX01BVENIV0hPTEVXT1JELCAwKTsKKyAgc2VhcmNoID0gRlBERlRleHRfRmluZFN0YXJ0KHRleHRwYWdlLCB3b3JsZC5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfTUFUQ0hDQVNFIHwgRlBERl9NQVRDSFdIT0xFV09SRCwgMCk7CiAgIEVYUEVDVF9ORShudWxscHRyLCBzZWFyY2gpOwogICBFWFBFQ1RfVFJVRShGUERGVGV4dF9GaW5kTmV4dChzZWFyY2gpKTsKICAgRVhQRUNUX0VRKDcsIEZQREZUZXh0X0dldFNjaFJlc3VsdEluZGV4KHNlYXJjaCkpOwpAQCAtMjEyLDcgKzIxNSw3IEBACiAgIEZQREZUZXh0X0ZpbmRDbG9zZShzZWFyY2gpOwogCiAgIC8vIERlZmF1bHQgaXMgY2FzZS1pbnNlbnNpdGl2ZSwgc28gbWF0Y2hpbmcgYWdhaXN0IGNhcHMgd29ya3MuCi0gIHNlYXJjaCA9IEZQREZUZXh0X0ZpbmRTdGFydCh0ZXh0cGFnZSwgd29ybGRfY2FwcywgMCwgMCk7CisgIHNlYXJjaCA9IEZQREZUZXh0X0ZpbmRTdGFydCh0ZXh0cGFnZSwgd29ybGRfY2Fwcy5nZXQoKSwgMCwgMCk7CiAgIEVYUEVDVF9ORShudWxscHRyLCBzZWFyY2gpOwogICBFWFBFQ1RfVFJVRShGUERGVGV4dF9GaW5kTmV4dChzZWFyY2gpKTsKICAgRVhQRUNUX0VRKDcsIEZQREZUZXh0X0dldFNjaFJlc3VsdEluZGV4KHNlYXJjaCkpOwpAQCAtMjIwLDIxICsyMjMsMjIgQEAKICAgRlBERlRleHRfRmluZENsb3NlKHNlYXJjaCk7CiAKICAgLy8gQnV0IGNhbiBiZSBtYWRlIGNhc2Ugc2Vuc2l0aXZlLCBpbiB3aGljaCBjYXNlIHRoaXMgZmFpbHMuCi0gIHNlYXJjaCA9IEZQREZUZXh0X0ZpbmRTdGFydCh0ZXh0cGFnZSwgd29ybGRfY2FwcywgRlBERl9NQVRDSENBU0UsIDApOworICBzZWFyY2ggPSBGUERGVGV4dF9GaW5kU3RhcnQodGV4dHBhZ2UsIHdvcmxkX2NhcHMuZ2V0KCksIEZQREZfTUFUQ0hDQVNFLCAwKTsKICAgRVhQRUNUX0ZBTFNFKEZQREZUZXh0X0ZpbmROZXh0KHNlYXJjaCkpOwogICBFWFBFQ1RfRVEoMCwgRlBERlRleHRfR2V0U2NoUmVzdWx0SW5kZXgoc2VhcmNoKSk7CiAgIEVYUEVDVF9FUSgwLCBGUERGVGV4dF9HZXRTY2hDb3VudChzZWFyY2gpKTsKICAgRlBERlRleHRfRmluZENsb3NlKHNlYXJjaCk7CiAKICAgLy8gRGVmYXVsdCBpcyBtYXRjaCBhbnl3aGVyZSB3aXRoaW4gd29yZCwgc28gbWF0Y2hpbmcgc3Vic3Rpcm5nIHdvcmtzLgotICBzZWFyY2ggPSBGUERGVGV4dF9GaW5kU3RhcnQodGV4dHBhZ2UsIHdvcmxkX3N1YnN0ciwgMCwgMCk7CisgIHNlYXJjaCA9IEZQREZUZXh0X0ZpbmRTdGFydCh0ZXh0cGFnZSwgd29ybGRfc3Vic3RyLmdldCgpLCAwLCAwKTsKICAgRVhQRUNUX1RSVUUoRlBERlRleHRfRmluZE5leHQoc2VhcmNoKSk7CiAgIEVYUEVDVF9FUSg4LCBGUERGVGV4dF9HZXRTY2hSZXN1bHRJbmRleChzZWFyY2gpKTsKICAgRVhQRUNUX0VRKDQsIEZQREZUZXh0X0dldFNjaENvdW50KHNlYXJjaCkpOwogICBGUERGVGV4dF9GaW5kQ2xvc2Uoc2VhcmNoKTsKIAogICAvLyBCdXQgY2FuIGJlIG1hZGUgdG8gbWFjaCB3b3JkIGJvdW5kYXJpZXMsIGluIHdoaWNoIGNhc2UgdGhpcyBmYWlscy4KLSAgc2VhcmNoID0gRlBERlRleHRfRmluZFN0YXJ0KHRleHRwYWdlLCB3b3JsZF9zdWJzdHIsIEZQREZfTUFUQ0hXSE9MRVdPUkQsIDApOworICBzZWFyY2ggPQorICAgICAgRlBERlRleHRfRmluZFN0YXJ0KHRleHRwYWdlLCB3b3JsZF9zdWJzdHIuZ2V0KCksIEZQREZfTUFUQ0hXSE9MRVdPUkQsIDApOwogICBFWFBFQ1RfRkFMU0UoRlBERlRleHRfRmluZE5leHQoc2VhcmNoKSk7CiAgIC8vIFRPRE8odHNlcGV6KTogaW52ZXN0aWdhdGUgc3RyYW5nZSBpbmRleC9jb3VudCB2YWx1ZXMgaW4gdGhpcyBzdGF0ZS4KICAgRlBERlRleHRfRmluZENsb3NlKHNlYXJjaCk7CkBAIC0yNDUsNyArMjQ5LDcgQEAKIAogLy8gVGVzdCB0aGF0IHRoZSBwYWdlIGhhcyBjaGFyYWN0ZXJzIGRlc3BpdGUgYSBiYWQgc3RyZWFtIGxlbmd0aC4KIFRFU1RfRihGUERGVGV4dEVtYmVkZGVydGVzdCwgU3RyZWFtTGVuZ3RoUGFzdEVuZE9mRmlsZSkgewotICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoInRlc3RpbmcvcmVzb3VyY2VzL2J1Z181Ny5wZGYiKSk7CisgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgiYnVnXzU3LnBkZiIpKTsKICAgRlBERl9QQUdFIHBhZ2UgPSBMb2FkUGFnZSgwKTsKICAgRVhQRUNUX05FKG51bGxwdHIsIHBhZ2UpOwogCkBAIC0yNTgsNyArMjYyLDcgQEAKIH0KIAogVEVTVF9GKEZQREZUZXh0RW1iZWRkZXJ0ZXN0LCBXZWJMaW5rcykgewotICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoInRlc3RpbmcvcmVzb3VyY2VzL3dlYmxpbmtzLnBkZiIpKTsKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJ3ZWJsaW5rcy5wZGYiKSk7CiAgIEZQREZfUEFHRSBwYWdlID0gTG9hZFBhZ2UoMCk7CiAgIEVYUEVDVF9ORShudWxscHRyLCBwYWdlKTsKIApAQCAtMjkzLDI3ICsyOTcsMjggQEAKIAogICAvLyBDaGVjayBidWZmZXIgdGhhdCBkb2Vzbid0IGhhdmUgc3BhY2UgZm9yIGEgdGVybWluYXRpbmcgTlVMLgogICBtZW1zZXQoZml4ZWRfYnVmZmVyLCAweGJkLCBzaXplb2YoZml4ZWRfYnVmZmVyKSk7Ci0gIEVYUEVDVF9FUShzaXplb2YoZXhwZWN0ZWRfdXJsKSAtIDEsIEZQREZMaW5rX0dldFVSTCgKLSAgICAgIHBhZ2VsaW5rLCAwLCBmaXhlZF9idWZmZXIsIHNpemVvZihleHBlY3RlZF91cmwpIC0gMSkpOwotICBFWFBFQ1RfVFJVRShjaGVja191bnNpZ25lZF9zaG9ydHMoCi0gICAgICBleHBlY3RlZF91cmwsIGZpeGVkX2J1ZmZlciwgc2l6ZW9mKGV4cGVjdGVkX3VybCkgLSAxKSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIHNpemVvZihleHBlY3RlZF91cmwpIC0gMSwKKyAgICAgIEZQREZMaW5rX0dldFVSTChwYWdlbGluaywgMCwgZml4ZWRfYnVmZmVyLCBzaXplb2YoZXhwZWN0ZWRfdXJsKSAtIDEpKTsKKyAgRVhQRUNUX1RSVUUoY2hlY2tfdW5zaWduZWRfc2hvcnRzKGV4cGVjdGVkX3VybCwgZml4ZWRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGV4cGVjdGVkX3VybCkgLSAxKSk7CiAgIEVYUEVDVF9FUSgweGJkYmQsIGZpeGVkX2J1ZmZlcltzaXplb2YoZXhwZWN0ZWRfdXJsKSAtIDFdKTsKIAogICAvLyBSZXRyZWl2ZSBsaW5rIHdpdGggZXhhY3RseS1zaXplZCBidWZmZXIuCiAgIG1lbXNldChmaXhlZF9idWZmZXIsIDB4YmQsIHNpemVvZihmaXhlZF9idWZmZXIpKTsKLSAgRVhQRUNUX0VRKHNpemVvZihleHBlY3RlZF91cmwpLCBGUERGTGlua19HZXRVUkwoCi0gICAgICBwYWdlbGluaywgMCwgZml4ZWRfYnVmZmVyLCBzaXplb2YoZXhwZWN0ZWRfdXJsKSkpOwotICBFWFBFQ1RfVFJVRShjaGVja191bnNpZ25lZF9zaG9ydHMoCi0gICAgICBleHBlY3RlZF91cmwsIGZpeGVkX2J1ZmZlciwgc2l6ZW9mKGV4cGVjdGVkX3VybCkpKTsKKyAgRVhQRUNUX0VRKHNpemVvZihleHBlY3RlZF91cmwpLAorICAgICAgICAgICAgRlBERkxpbmtfR2V0VVJMKHBhZ2VsaW5rLCAwLCBmaXhlZF9idWZmZXIsIHNpemVvZihleHBlY3RlZF91cmwpKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgY2hlY2tfdW5zaWduZWRfc2hvcnRzKGV4cGVjdGVkX3VybCwgZml4ZWRfYnVmZmVyLCBzaXplb2YoZXhwZWN0ZWRfdXJsKSkpOwogICBFWFBFQ1RfRVEoMHUsIGZpeGVkX2J1ZmZlcltzaXplb2YoZXhwZWN0ZWRfdXJsKSAtIDFdKTsKICAgRVhQRUNUX0VRKDB4YmRiZCwgZml4ZWRfYnVmZmVyW3NpemVvZihleHBlY3RlZF91cmwpXSk7CiAKICAgLy8gUmV0cmVpdmUgbGluayB3aXRoIGFtcGxlLXNpemVkLWJ1ZmZlci4KICAgbWVtc2V0KGZpeGVkX2J1ZmZlciwgMHhiZCwgc2l6ZW9mKGZpeGVkX2J1ZmZlcikpOwotICBFWFBFQ1RfRVEoc2l6ZW9mKGV4cGVjdGVkX3VybCksIEZQREZMaW5rX0dldFVSTCgKLSAgICAgIHBhZ2VsaW5rLCAwLCBmaXhlZF9idWZmZXIsIDEyOCkpOwotICBFWFBFQ1RfVFJVRShjaGVja191bnNpZ25lZF9zaG9ydHMoCi0gICAgICBleHBlY3RlZF91cmwsIGZpeGVkX2J1ZmZlciwgc2l6ZW9mKGV4cGVjdGVkX3VybCkpKTsKKyAgRVhQRUNUX0VRKHNpemVvZihleHBlY3RlZF91cmwpLAorICAgICAgICAgICAgRlBERkxpbmtfR2V0VVJMKHBhZ2VsaW5rLCAwLCBmaXhlZF9idWZmZXIsIDEyOCkpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIGNoZWNrX3Vuc2lnbmVkX3Nob3J0cyhleHBlY3RlZF91cmwsIGZpeGVkX2J1ZmZlciwgc2l6ZW9mKGV4cGVjdGVkX3VybCkpKTsKICAgRVhQRUNUX0VRKDB1LCBmaXhlZF9idWZmZXJbc2l6ZW9mKGV4cGVjdGVkX3VybCkgLSAxXSk7CiAgIEVYUEVDVF9FUSgweGJkYmQsIGZpeGVkX2J1ZmZlcltzaXplb2YoZXhwZWN0ZWRfdXJsKV0pOwogCkBAIC0zNjMsMyArMzY4LDI0IEBACiAgIEZQREZUZXh0X0Nsb3NlUGFnZSh0ZXh0cGFnZSk7CiAgIFVubG9hZFBhZ2UocGFnZSk7CiB9CisKK1RFU1RfRihGUERGVGV4dEVtYmVkZGVydGVzdCwgR2V0Rm9udFNpemUpIHsKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJoZWxsb193b3JsZC5wZGYiKSk7CisgIEZQREZfUEFHRSBwYWdlID0gTG9hZFBhZ2UoMCk7CisgIEVYUEVDVF9ORShudWxscHRyLCBwYWdlKTsKKworICBGUERGX1RFWFRQQUdFIHRleHRwYWdlID0gRlBERlRleHRfTG9hZFBhZ2UocGFnZSk7CisgIEVYUEVDVF9ORShudWxscHRyLCB0ZXh0cGFnZSk7CisKKyAgY29uc3QgZG91YmxlIGtFeHBlY3RlZEZvbnRzU2l6ZXNbXSA9IHsxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiwgMTIsIDEyLCAxLCAgMSwgIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNn07CisKKyAgaW50IGNvdW50ID0gRlBERlRleHRfQ291bnRDaGFycyh0ZXh0cGFnZSk7CisgIEFTU0VSVF9FUShGWF9BcnJheVNpemUoa0V4cGVjdGVkRm9udHNTaXplcyksIGNvdW50KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKQorICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRGb250c1NpemVzW2ldLCBGUERGVGV4dF9HZXRGb250U2l6ZSh0ZXh0cGFnZSwgaSkpIDw8IGk7CisKKyAgRlBERlRleHRfQ2xvc2VQYWdlKHRleHRwYWdlKTsKKyAgVW5sb2FkUGFnZShwYWdlKTsKK30KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZ2aWV3LmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZ2aWV3LmNwcAppbmRleCBiY2E5YjQxLi5hNmMxNDIwIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mcGRmdmlldy5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnBkZnZpZXcuY3BwCkBAIC0xLDg3NiArMSwxMTk4IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX21nci5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnNka19yZW5kZXJjb250ZXh0LmgiCi0jaW5jbHVkZSAiLi4vLi4vcHVibGljL2ZwZGZ2aWV3LmgiCi0jaW5jbHVkZSAiLi4vLi4vcHVibGljL2ZwZGZfcHJvZ3Jlc3NpdmUuaCIKLSNpbmNsdWRlICIuLi8uLi9wdWJsaWMvZnBkZl9leHQuaCIKLSNpbmNsdWRlICIuLi8uLi9jb3JlL3NyYy9meGNydC9meF9zYWZlX3R5cGVzLmgiCi0jaW5jbHVkZSAiLi4vLi4vdGhpcmRfcGFydHkvYmFzZS9ub25zdGRfdW5pcXVlX3B0ci5oIgotI2luY2x1ZGUgIi4uLy4uL3RoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9jb252ZXJzaW9uc19pbXBsLmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiCiAKLUNQREZfQ3VzdG9tQWNjZXNzOjpDUERGX0N1c3RvbUFjY2VzcyhGUERGX0ZJTEVBQ0NFU1MqIHBGaWxlQWNjZXNzKQotewotCWlmIChwRmlsZUFjY2VzcykKLQkJbV9GaWxlQWNjZXNzID0gKnBGaWxlQWNjZXNzOworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnNka19kZWZpbmUuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnNka19tZ3IuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnNka19yZW5kZXJjb250ZXh0LmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9leHQuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9wcm9ncmVzc2l2ZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9jb252ZXJzaW9uc19pbXBsLmgiCisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9hcHAuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2RvYy5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfcGFnZS5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfdXRpbC5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2Zvcm1maWxsLmgiCisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKK1VuZGVybHlpbmdEb2N1bWVudFR5cGUqIFVuZGVybHlpbmdGcm9tRlBERkRvY3VtZW50KEZQREZfRE9DVU1FTlQgZG9jKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxVbmRlcmx5aW5nRG9jdW1lbnRUeXBlKj4oZG9jKTsKIH0KIAotRlhfQk9PTCBDUERGX0N1c3RvbUFjY2Vzczo6UmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKLXsKLSAgICBpZiAob2Zmc2V0IDwgMCkgewotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIEZYX1NBRkVfRklMRVNJWkUgbmV3UG9zID0gcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlhfRklMRVNJWkUsIHNpemVfdD4oc2l6ZSk7Ci0gICAgbmV3UG9zICs9IG9mZnNldDsKLSAgICBpZiAoIW5ld1Bvcy5Jc1ZhbGlkKCkgfHwgbmV3UG9zLlZhbHVlT3JEaWUoKSA+IG1fRmlsZUFjY2Vzcy5tX0ZpbGVMZW4pIHsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gbV9GaWxlQWNjZXNzLm1fR2V0QmxvY2sobV9GaWxlQWNjZXNzLm1fUGFyYW0sIG9mZnNldCwoRlhfTFBCWVRFKSBidWZmZXIsIHNpemUpOworRlBERl9ET0NVTUVOVCBGUERGRG9jdW1lbnRGcm9tVW5kZXJseWluZyhVbmRlcmx5aW5nRG9jdW1lbnRUeXBlKiBkb2MpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEZQREZfRE9DVU1FTlQ+KGRvYyk7CiB9CiAKLS8vMCBiaXQ6IEZQREZfUE9MSUNZX01BQ0hJTkVUSU1FX0FDQ0VTUworVW5kZXJseWluZ1BhZ2VUeXBlKiBVbmRlcmx5aW5nRnJvbUZQREZQYWdlKEZQREZfUEFHRSBwYWdlKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxVbmRlcmx5aW5nUGFnZVR5cGUqPihwYWdlKTsKK30KKworQ1BERl9Eb2N1bWVudCogQ1BERkRvY3VtZW50RnJvbUZQREZEb2N1bWVudChGUERGX0RPQ1VNRU5UIGRvYykgeworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIHJldHVybiBkb2MgPyBVbmRlcmx5aW5nRnJvbUZQREZEb2N1bWVudChkb2MpLT5HZXRQREZEb2MoKSA6IG51bGxwdHI7CisjZWxzZSAgIC8vIFBERl9FTkFCTEVfWEZBCisgIHJldHVybiBVbmRlcmx5aW5nRnJvbUZQREZEb2N1bWVudChkb2MpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorfQorCitGUERGX0RPQ1VNRU5UIEZQREZEb2N1bWVudEZyb21DUERGRG9jdW1lbnQoQ1BERl9Eb2N1bWVudCogZG9jKSB7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgcmV0dXJuIGRvYyA/IEZQREZEb2N1bWVudEZyb21VbmRlcmx5aW5nKAorICAgICAgICAgICAgICAgICAgIG5ldyBDUERGWEZBX0RvY3VtZW50KGRvYywgQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCkpKQorICAgICAgICAgICAgIDogbnVsbHB0cjsKKyNlbHNlICAgLy8gUERGX0VOQUJMRV9YRkEKKyAgcmV0dXJuIEZQREZEb2N1bWVudEZyb21VbmRlcmx5aW5nKGRvYyk7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCit9CisKK0NQREZfUGFnZSogQ1BERlBhZ2VGcm9tRlBERlBhZ2UoRlBERl9QQUdFIHBhZ2UpIHsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICByZXR1cm4gcGFnZSA/IFVuZGVybHlpbmdGcm9tRlBERlBhZ2UocGFnZSktPkdldFBERlBhZ2UoKSA6IG51bGxwdHI7CisjZWxzZSAgIC8vIFBERl9FTkFCTEVfWEZBCisgIHJldHVybiBVbmRlcmx5aW5nRnJvbUZQREZQYWdlKHBhZ2UpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorfQorCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK0NGUERGX0ZpbGVTdHJlYW06OkNGUERGX0ZpbGVTdHJlYW0oRlBERl9GSUxFSEFORExFUiogcEZTKSB7CisgIG1fcEZTID0gcEZTOworICBtX25DdXJQb3MgPSAwOworfQorCitJRlhfRmlsZVN0cmVhbSogQ0ZQREZfRmlsZVN0cmVhbTo6UmV0YWluKCkgeworICByZXR1cm4gdGhpczsKK30KKwordm9pZCBDRlBERl9GaWxlU3RyZWFtOjpSZWxlYXNlKCkgeworICBpZiAobV9wRlMgJiYgbV9wRlMtPlJlbGVhc2UpCisgICAgbV9wRlMtPlJlbGVhc2UobV9wRlMtPmNsaWVudERhdGEpOworICBkZWxldGUgdGhpczsKK30KKworRlhfRklMRVNJWkUgQ0ZQREZfRmlsZVN0cmVhbTo6R2V0U2l6ZSgpIHsKKyAgaWYgKG1fcEZTICYmIG1fcEZTLT5HZXRTaXplKQorICAgIHJldHVybiAoRlhfRklMRVNJWkUpbV9wRlMtPkdldFNpemUobV9wRlMtPmNsaWVudERhdGEpOworICByZXR1cm4gMDsKK30KKworRlhfQk9PTCBDRlBERl9GaWxlU3RyZWFtOjpJc0VPRigpIHsKKyAgcmV0dXJuIG1fbkN1clBvcyA+PSBHZXRTaXplKCk7Cit9CisKK0ZYX0JPT0wgQ0ZQREZfRmlsZVN0cmVhbTo6UmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSB7CisgIGlmICghYnVmZmVyIHx8ICFzaXplIHx8ICFtX3BGUy0+UmVhZEJsb2NrKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAobV9wRlMtPlJlYWRCbG9jayhtX3BGUy0+Y2xpZW50RGF0YSwgKEZQREZfRFdPUkQpb2Zmc2V0LCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIChGUERGX0RXT1JEKXNpemUpID09IDApIHsKKyAgICBtX25DdXJQb3MgPSBvZmZzZXQgKyBzaXplOworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworc2l6ZV90IENGUERGX0ZpbGVTdHJlYW06OlJlYWRCbG9jayh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSB7CisgIGlmICghYnVmZmVyIHx8ICFzaXplIHx8ICFtX3BGUy0+UmVhZEJsb2NrKQorICAgIHJldHVybiAwOworCisgIEZYX0ZJTEVTSVpFIG5TaXplID0gR2V0U2l6ZSgpOworICBpZiAobV9uQ3VyUG9zID49IG5TaXplKQorICAgIHJldHVybiAwOworICBGWF9GSUxFU0laRSBkd0F2YWlsID0gblNpemUgLSBtX25DdXJQb3M7CisgIGlmIChkd0F2YWlsIDwgKEZYX0ZJTEVTSVpFKXNpemUpCisgICAgc2l6ZSA9IChzaXplX3QpZHdBdmFpbDsKKyAgaWYgKG1fcEZTLT5SZWFkQmxvY2sobV9wRlMtPmNsaWVudERhdGEsIChGUERGX0RXT1JEKW1fbkN1clBvcywgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAoRlBERl9EV09SRClzaXplKSA9PSAwKSB7CisgICAgbV9uQ3VyUG9zICs9IHNpemU7CisgICAgcmV0dXJuIHNpemU7CisgIH0KKworICByZXR1cm4gMDsKK30KKworRlhfQk9PTCBDRlBERl9GaWxlU3RyZWFtOjpXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCFtX3BGUyB8fCAhbV9wRlMtPldyaXRlQmxvY2spCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChtX3BGUy0+V3JpdGVCbG9jayhtX3BGUy0+Y2xpZW50RGF0YSwgKEZQREZfRFdPUkQpb2Zmc2V0LCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAoRlBERl9EV09SRClzaXplKSA9PSAwKSB7CisgICAgbV9uQ3VyUG9zID0gb2Zmc2V0ICsgc2l6ZTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKK0ZYX0JPT0wgQ0ZQREZfRmlsZVN0cmVhbTo6Rmx1c2goKSB7CisgIGlmICghbV9wRlMgfHwgIW1fcEZTLT5GbHVzaCkKKyAgICByZXR1cm4gVFJVRTsKKworICByZXR1cm4gbV9wRlMtPkZsdXNoKG1fcEZTLT5jbGllbnREYXRhKSA9PSAwOworfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCitDUERGX0N1c3RvbUFjY2Vzczo6Q1BERl9DdXN0b21BY2Nlc3MoRlBERl9GSUxFQUNDRVNTKiBwRmlsZUFjY2VzcykgeworICBtX0ZpbGVBY2Nlc3MgPSAqcEZpbGVBY2Nlc3M7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgbV9CdWZmZXJPZmZzZXQgPSAoRlhfRFdPUkQpLTE7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCit9CisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorRlhfQk9PTCBDUERGX0N1c3RvbUFjY2Vzczo6R2V0Qnl0ZShGWF9EV09SRCBwb3MsIHVpbnQ4X3QmIGNoKSB7CisgIGlmIChwb3MgPj0gbV9GaWxlQWNjZXNzLm1fRmlsZUxlbikKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChtX0J1ZmZlck9mZnNldCA9PSAoRlhfRFdPUkQpLTEgfHwgcG9zIDwgbV9CdWZmZXJPZmZzZXQgfHwKKyAgICAgIHBvcyA+PSBtX0J1ZmZlck9mZnNldCArIDUxMikgeworICAgIC8vIE5lZWQgdG8gcmVhZCBmcm9tIGZpbGUgYWNjZXNzCisgICAgbV9CdWZmZXJPZmZzZXQgPSBwb3M7CisgICAgaW50IHNpemUgPSA1MTI7CisgICAgaWYgKHBvcyArIDUxMiA+IG1fRmlsZUFjY2Vzcy5tX0ZpbGVMZW4pCisgICAgICBzaXplID0gbV9GaWxlQWNjZXNzLm1fRmlsZUxlbiAtIHBvczsKKyAgICBpZiAoIW1fRmlsZUFjY2Vzcy5tX0dldEJsb2NrKG1fRmlsZUFjY2Vzcy5tX1BhcmFtLCBtX0J1ZmZlck9mZnNldCwgbV9CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBjaCA9IG1fQnVmZmVyW3BvcyAtIG1fQnVmZmVyT2Zmc2V0XTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgQ1BERl9DdXN0b21BY2Nlc3M6OkdldEJsb2NrKEZYX0RXT1JEIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBzaXplKSB7CisgIGlmIChwb3MgKyBzaXplID4gbV9GaWxlQWNjZXNzLm1fRmlsZUxlbikKKyAgICByZXR1cm4gRkFMU0U7CisgIHJldHVybiBtX0ZpbGVBY2Nlc3MubV9HZXRCbG9jayhtX0ZpbGVBY2Nlc3MubV9QYXJhbSwgcG9zLCBwQnVmLCBzaXplKTsKK30KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworRlhfQk9PTCBDUERGX0N1c3RvbUFjY2Vzczo6UmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIHsKKyAgaWYgKG9mZnNldCA8IDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgRlhfU0FGRV9GSUxFU0laRSBuZXdQb3MgPQorICAgICAgcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlhfRklMRVNJWkUsIHNpemVfdD4oc2l6ZSk7CisgIG5ld1BvcyArPSBvZmZzZXQ7CisgIGlmICghbmV3UG9zLklzVmFsaWQoKSB8fCBuZXdQb3MuVmFsdWVPckRpZSgpID4gbV9GaWxlQWNjZXNzLm1fRmlsZUxlbikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gbV9GaWxlQWNjZXNzLm1fR2V0QmxvY2sobV9GaWxlQWNjZXNzLm1fUGFyYW0sIG9mZnNldCwgKHVpbnQ4X3QqKWJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworfQorCisvLyAwIGJpdDogRlBERl9QT0xJQ1lfTUFDSElORVRJTUVfQUNDRVNTCiBzdGF0aWMgRlhfRFdPUkQgZm94aXRfc2FuZGJveF9wb2xpY3kgPSAweEZGRkZGRkZGOwogCi12b2lkIEZTREtfU2V0U2FuZEJveFBvbGljeShGUERGX0RXT1JEIHBvbGljeSwgRlBERl9CT09MIGVuYWJsZSkKLXsKLQlzd2l0Y2gocG9saWN5KQotCXsKLQljYXNlIEZQREZfUE9MSUNZX01BQ0hJTkVUSU1FX0FDQ0VTUzoKLQkJewotCQkJaWYoZW5hYmxlKQotCQkJCWZveGl0X3NhbmRib3hfcG9saWN5IHw9IDB4MDE7Ci0JCQllbHNlCi0JCQkJZm94aXRfc2FuZGJveF9wb2xpY3kgJj0gMHhGRkZGRkZGRTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Cit2b2lkIEZTREtfU2V0U2FuZEJveFBvbGljeShGUERGX0RXT1JEIHBvbGljeSwgRlBERl9CT09MIGVuYWJsZSkgeworICBzd2l0Y2ggKHBvbGljeSkgeworICAgIGNhc2UgRlBERl9QT0xJQ1lfTUFDSElORVRJTUVfQUNDRVNTOiB7CisgICAgICBpZiAoZW5hYmxlKQorICAgICAgICBmb3hpdF9zYW5kYm94X3BvbGljeSB8PSAweDAxOworICAgICAgZWxzZQorICAgICAgICBmb3hpdF9zYW5kYm94X3BvbGljeSAmPSAweEZGRkZGRkZFOworICAgIH0gYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CiB9CiAKLUZQREZfQk9PTCBGU0RLX0lzU2FuZEJveFBvbGljeUVuYWJsZWQoRlBERl9EV09SRCBwb2xpY3kpCi17Ci0Jc3dpdGNoKHBvbGljeSkKLQl7Ci0JY2FzZSBGUERGX1BPTElDWV9NQUNISU5FVElNRV9BQ0NFU1M6Ci0JCXsKLQkJCWlmKGZveGl0X3NhbmRib3hfcG9saWN5JjB4MDEpCi0JCQkJcmV0dXJuIFRSVUU7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gRkFMU0U7CitGUERGX0JPT0wgRlNES19Jc1NhbmRCb3hQb2xpY3lFbmFibGVkKEZQREZfRFdPUkQgcG9saWN5KSB7CisgIHN3aXRjaCAocG9saWN5KSB7CisgICAgY2FzZSBGUERGX1BPTElDWV9NQUNISU5FVElNRV9BQ0NFU1M6CisgICAgICByZXR1cm4gISEoZm94aXRfc2FuZGJveF9wb2xpY3kgJiAweDAxKTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEZBTFNFOworICB9CiB9CiAKK0NDb2RlY19Nb2R1bGVNZ3IqIGdfcENvZGVjTW9kdWxlID0gbnVsbHB0cjsKIAotI2lmbmRlZiBfVAotI2RlZmluZSBfVCh4KSB4Ci0jZW5kaWYKLQotI2lmZGVmIEFQSTUKLQlDUERGX01vZHVsZU1ncioJZ19wTW9kdWxlTWdyID0gTlVMTDsKLSNlbHNlCi0JQ0NvZGVjX01vZHVsZU1ncioJZ19wQ29kZWNNb2R1bGUgPSBOVUxMOwotI2VuZGlmCi0KLS8vZXh0ZXJuIENQREZTREtfRm9ybUZpbGxBcHAqIGdfcEZvcm1GaWxsQXBwOwotCi0jaWYgX0ZYX09TXyA9PSBfRlhfTElOVVhfRU1CRURERURfCi1jbGFzcyBDRm9udE1hcHBlciA6IHB1YmxpYyBJUERGX0ZvbnRNYXBwZXIKLXsKLXB1YmxpYzoKLQlDRm9udE1hcHBlcigpOwotCXZpcnR1YWwgfkNGb250TWFwcGVyKCk7Ci0KLQl2aXJ0dWFsIEZUX0ZhY2UgRmluZFN1YnN0Rm9udCgKLQkJCQkJCQlDUERGX0RvY3VtZW50KiBwRG9jLAkJCQkvLyBbSU5dIFRoZSBQREYgZG9jdW1lbnQKLQkJCQkJCQljb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLAkvLyBbSU5dIE9yaWdpbmFsIG5hbWUKLQkJCQkJCQlGWF9CT09MIGJUcnVlVHlwZSwJCQkJCS8vIFtJTl0gVHJ1ZVR5cGUgb3IgVHlwZTEKLQkJCQkJCQlGWF9EV09SRCBmbGFncywJCQkJCQkvLyBbSU5dIFBERiBmb250IGZsYWdzIChzZWUgUERGIFJlZmVyZW5jZSBzZWN0aW9uIDUuNy4xKQotCQkJCQkJCWludCBmb250X3dlaWdodCwJCQkJCS8vIFtJTl0gb3JpZ2luYWwgZm9udCB3ZWlnaHQuIDAgZm9yIG5vdCBzcGVjaWZpZWQKLQkJCQkJCQlpbnQgQ2hhcnNldENQLAkJCQkJCS8vIFtJTl0gY29kZSBwYWdlIGZvciBjaGFyc2V0IChzZWUgV2luMzIgR2V0QUNQKCkpCi0JCQkJCQkJRlhfQk9PTCBiVmVydGljYWwsCi0JCQkJCQkJQ1BERl9TdWJzdEZvbnQqIHBTdWJzdEZvbnQJCQkvLyBbT1VUXSBTdWJzdCBmb250IGRhdGEKLQkJCQkJCSk7Ci0KLQlGVF9GYWNlIG1fU3lzRmFjZTsKLX07Ci0KLUNGb250TWFwcGVyKiBnX3BGb250TWFwcGVyID0gTlVMTDsKLSNlbmRpZgkJLy8gI2lmIF9GWF9PU18gPT0gX0ZYX0xJTlVYX0VNQkVEREVEXwotCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfSW5pdExpYnJhcnkoKQotewotCWdfcENvZGVjTW9kdWxlID0gQ0NvZGVjX01vZHVsZU1ncjo6Q3JlYXRlKCk7Ci0JCi0JQ0ZYX0dFTW9kdWxlOjpDcmVhdGUoKTsKLQlDRlhfR0VNb2R1bGU6OkdldCgpLT5TZXRDb2RlY01vZHVsZShnX3BDb2RlY01vZHVsZSk7Ci0JCi0JQ1BERl9Nb2R1bGVNZ3I6OkNyZWF0ZSgpOwotCUNQREZfTW9kdWxlTWdyOjpHZXQoKS0+U2V0Q29kZWNNb2R1bGUoZ19wQ29kZWNNb2R1bGUpOwotCUNQREZfTW9kdWxlTWdyOjpHZXQoKS0+SW5pdFBhZ2VNb2R1bGUoKTsKLQlDUERGX01vZHVsZU1ncjo6R2V0KCktPkluaXRSZW5kZXJNb2R1bGUoKTsKLQlDUERGX01vZHVsZU1nciAqIHBNb2R1bGVNZ3IgPSBDUERGX01vZHVsZU1ncjo6R2V0KCk7Ci0JaWYgKCBwTW9kdWxlTWdyICkKLQl7Ci0JCXBNb2R1bGVNZ3ItPkxvYWRFbWJlZGRlZEdCMUNNYXBzKCk7Ci0JCXBNb2R1bGVNZ3ItPkxvYWRFbWJlZGRlZEphcGFuMUNNYXBzKCk7Ci0JCXBNb2R1bGVNZ3ItPkxvYWRFbWJlZGRlZENOUzFDTWFwcygpOwotCQlwTW9kdWxlTWdyLT5Mb2FkRW1iZWRkZWRLb3JlYTFDTWFwcygpOwotCX0KK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9Jbml0TGlicmFyeSgpIHsKKyAgRlBERl9Jbml0TGlicmFyeVdpdGhDb25maWcobnVsbHB0cik7CiB9CiAKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9Jbml0TGlicmFyeVdpdGhDb25maWcoCisgICAgY29uc3QgRlBERl9MSUJSQVJZX0NPTkZJRyogY2ZnKSB7CisgIGdfcENvZGVjTW9kdWxlID0gbmV3IENDb2RlY19Nb2R1bGVNZ3IoKTsKIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0Rlc3Ryb3lMaWJyYXJ5KCkKLXsKKyAgQ0ZYX0dFTW9kdWxlOjpDcmVhdGUoY2ZnID8gY2ZnLT5tX3BVc2VyRm9udFBhdGhzIDogbnVsbHB0cik7CisgIENGWF9HRU1vZHVsZTo6R2V0KCktPlNldENvZGVjTW9kdWxlKGdfcENvZGVjTW9kdWxlKTsKIAotI2lmIF9GWF9PU18gPT0gX0ZYX0xJTlVYX0VNQkVEREVEXwotCWlmIChnX3BGb250TWFwcGVyKSBkZWxldGUgZ19wRm9udE1hcHBlcjsKLSNlbmRpZgotI2lmZGVmIEFQSTUKLQlnX3BNb2R1bGVNZ3ItPkRlc3Ryb3koKTsKLSNlbHNlCi0JQ1BERl9Nb2R1bGVNZ3I6OkRlc3Ryb3koKTsKLQlDRlhfR0VNb2R1bGU6OkRlc3Ryb3koKTsKLQlnX3BDb2RlY01vZHVsZS0+RGVzdHJveSgpOwotI2VuZGlmCisgIENQREZfTW9kdWxlTWdyOjpDcmVhdGUoKTsKKyAgQ1BERl9Nb2R1bGVNZ3IqIHBNb2R1bGVNZ3IgPSBDUERGX01vZHVsZU1ncjo6R2V0KCk7CisgIHBNb2R1bGVNZ3ItPlNldENvZGVjTW9kdWxlKGdfcENvZGVjTW9kdWxlKTsKKyAgcE1vZHVsZU1nci0+SW5pdFBhZ2VNb2R1bGUoKTsKKyAgcE1vZHVsZU1nci0+SW5pdFJlbmRlck1vZHVsZSgpOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIENQREZYRkFfQXBwOjpHZXRJbnN0YW5jZSgpLT5Jbml0aWFsaXplKCk7CisjZWxzZSAgIC8vIFBERl9FTkFCTEVfWEZBCisgIHBNb2R1bGVNZ3ItPkxvYWRFbWJlZGRlZEdCMUNNYXBzKCk7CisgIHBNb2R1bGVNZ3ItPkxvYWRFbWJlZGRlZEphcGFuMUNNYXBzKCk7CisgIHBNb2R1bGVNZ3ItPkxvYWRFbWJlZGRlZENOUzFDTWFwcygpOworICBwTW9kdWxlTWdyLT5Mb2FkRW1iZWRkZWRLb3JlYTFDTWFwcygpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICBpZiAoY2ZnICYmIGNmZy0+dmVyc2lvbiA+PSAyKQorICAgIElKU19SdW50aW1lOjpJbml0aWFsaXplKGNmZy0+bV92OEVtYmVkZGVyU2xvdCwgY2ZnLT5tX3BJc29sYXRlKTsKK30KKworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0Rlc3Ryb3lMaWJyYXJ5KCkgeworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIENQREZYRkFfQXBwOjpSZWxlYXNlSW5zdGFuY2UoKTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgQ1BERl9Nb2R1bGVNZ3I6OkRlc3Ryb3koKTsKKyAgQ0ZYX0dFTW9kdWxlOjpEZXN0cm95KCk7CisKKyAgZGVsZXRlIGdfcENvZGVjTW9kdWxlOworICBnX3BDb2RlY01vZHVsZSA9IG51bGxwdHI7CiB9CiAKICNpZm5kZWYgX1dJTjMyCiBpbnQgZ19MYXN0RXJyb3I7Ci12b2lkIFNldExhc3RFcnJvcihpbnQgZXJyKQotewotCWdfTGFzdEVycm9yID0gZXJyOwordm9pZCBTZXRMYXN0RXJyb3IoaW50IGVycikgeworICBnX0xhc3RFcnJvciA9IGVycjsKIH0KIAotaW50IEdldExhc3RFcnJvcigpCi17Ci0JcmV0dXJuIGdfTGFzdEVycm9yOworaW50IEdldExhc3RFcnJvcigpIHsKKyAgcmV0dXJuIGdfTGFzdEVycm9yOwogfQotI2VuZGlmCisjZW5kaWYgIC8vIF9XSU4zMgogCi12b2lkIFByb2Nlc3NQYXJzZUVycm9yKEZYX0RXT1JEIGVycl9jb2RlKQotewotCS8vIFRyYW5zbGF0ZSBGUERGQVBJIGVycm9yIGNvZGUgdG8gRlBERlZJRVcgZXJyb3IgY29kZQotCXN3aXRjaCAoZXJyX2NvZGUpIHsKLQkJY2FzZSBQREZQQVJTRV9FUlJPUl9GSUxFOgotCQkJZXJyX2NvZGUgPSBGUERGX0VSUl9GSUxFOwotCQkJYnJlYWs7Ci0JCWNhc2UgUERGUEFSU0VfRVJST1JfRk9STUFUOgotCQkJZXJyX2NvZGUgPSBGUERGX0VSUl9GT1JNQVQ7Ci0JCQlicmVhazsKLQkJY2FzZSBQREZQQVJTRV9FUlJPUl9QQVNTV09SRDoKLQkJCWVycl9jb2RlID0gRlBERl9FUlJfUEFTU1dPUkQ7Ci0JCQlicmVhazsKLQkJY2FzZSBQREZQQVJTRV9FUlJPUl9IQU5ETEVSOgotCQkJZXJyX2NvZGUgPSBGUERGX0VSUl9TRUNVUklUWTsKLQkJCWJyZWFrOwotCX0KLQlTZXRMYXN0RXJyb3IoZXJyX2NvZGUpOwordm9pZCBQcm9jZXNzUGFyc2VFcnJvcihGWF9EV09SRCBlcnJfY29kZSkgeworICAvLyBUcmFuc2xhdGUgRlBERkFQSSBlcnJvciBjb2RlIHRvIEZQREZWSUVXIGVycm9yIGNvZGUKKyAgc3dpdGNoIChlcnJfY29kZSkgeworICAgIGNhc2UgUERGUEFSU0VfRVJST1JfRklMRToKKyAgICAgIGVycl9jb2RlID0gRlBERl9FUlJfRklMRTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUERGUEFSU0VfRVJST1JfRk9STUFUOgorICAgICAgZXJyX2NvZGUgPSBGUERGX0VSUl9GT1JNQVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBERlBBUlNFX0VSUk9SX1BBU1NXT1JEOgorICAgICAgZXJyX2NvZGUgPSBGUERGX0VSUl9QQVNTV09SRDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUERGUEFSU0VfRVJST1JfSEFORExFUjoKKyAgICAgIGVycl9jb2RlID0gRlBERl9FUlJfU0VDVVJJVFk7CisgICAgICBicmVhazsKKyAgfQorICBTZXRMYXN0RXJyb3IoZXJyX2NvZGUpOwogfQogCi1ETExFWFBPUlQgdm9pZAlTVERDQUxMIEZQREZfU2V0U2FuZEJveFBvbGljeShGUERGX0RXT1JEIHBvbGljeSwgRlBERl9CT09MIGVuYWJsZSkKLXsKLQlyZXR1cm4gRlNES19TZXRTYW5kQm94UG9saWN5KHBvbGljeSwgZW5hYmxlKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9TZXRTYW5kQm94UG9saWN5KEZQREZfRFdPUkQgcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIGVuYWJsZSkgeworICByZXR1cm4gRlNES19TZXRTYW5kQm94UG9saWN5KHBvbGljeSwgZW5hYmxlKTsKIH0KIAotRExMRVhQT1JUIEZQREZfRE9DVU1FTlQgU1REQ0FMTCBGUERGX0xvYWREb2N1bWVudChGUERGX1NUUklORyBmaWxlX3BhdGgsIEZQREZfQllURVNUUklORyBwYXNzd29yZCkKLXsKLQlDUERGX1BhcnNlciogcFBhcnNlciA9IG5ldyBDUERGX1BhcnNlcjsKLQlwUGFyc2VyLT5TZXRQYXNzd29yZChwYXNzd29yZCk7CitETExFWFBPUlQgRlBERl9ET0NVTUVOVCBTVERDQUxMIEZQREZfTG9hZERvY3VtZW50KEZQREZfU1RSSU5HIGZpbGVfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIHBhc3N3b3JkKSB7CisgIC8vIE5PVEU6IHRoZSBjcmVhdGlvbiBvZiB0aGUgZmlsZSBuZWVkcyB0byBiZSBieSB0aGUgZW1iZWRkZXIgb24gdGhlCisgIC8vIG90aGVyIHNpZGUgb2YgdGhpcyBBUEkuCisgIElGWF9GaWxlUmVhZCogcEZpbGVBY2Nlc3MgPSBGWF9DcmVhdGVGaWxlUmVhZCgoY29uc3QgRlhfQ0hBUiopZmlsZV9wYXRoKTsKKyAgaWYgKCFwRmlsZUFjY2VzcykgeworICAgIHJldHVybiBudWxscHRyOworICB9CiAKLQlGWF9EV09SRCBlcnJfY29kZSA9IHBQYXJzZXItPlN0YXJ0UGFyc2UoKEZYX0xQQ1NUUilmaWxlX3BhdGgpOwotCWlmIChlcnJfY29kZSkgewotCQlkZWxldGUgcFBhcnNlcjsKLQkJUHJvY2Vzc1BhcnNlRXJyb3IoZXJyX2NvZGUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHBQYXJzZXItPkdldERvY3VtZW50KCk7CisgIENQREZfUGFyc2VyKiBwUGFyc2VyID0gbmV3IENQREZfUGFyc2VyOworICBwUGFyc2VyLT5TZXRQYXNzd29yZChwYXNzd29yZCk7CisKKyAgRlhfRFdPUkQgZXJyX2NvZGUgPSBwUGFyc2VyLT5TdGFydFBhcnNlKHBGaWxlQWNjZXNzKTsKKyAgaWYgKGVycl9jb2RlKSB7CisgICAgZGVsZXRlIHBQYXJzZXI7CisgICAgUHJvY2Vzc1BhcnNlRXJyb3IoZXJyX2NvZGUpOworICAgIHJldHVybiBOVUxMOworICB9CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgQ1BERl9Eb2N1bWVudCogcFBERkRvYyA9IHBQYXJzZXItPkdldERvY3VtZW50KCk7CisgIGlmICghcFBERkRvYykKKyAgICByZXR1cm4gTlVMTDsKKworICBDUERGWEZBX0FwcCogcFByb3ZpZGVyID0gQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCk7CisgIHJldHVybiBuZXcgQ1BERlhGQV9Eb2N1bWVudChwUERGRG9jLCBwUHJvdmlkZXIpOworI2Vsc2UgICAvLyBQREZfRU5BQkxFX1hGQQorICByZXR1cm4gcFBhcnNlci0+R2V0RG9jdW1lbnQoKTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIH0KIAotZXh0ZXJuIHZvaWQgQ2hlY2tVblN1cHBvcnRFcnJvcihDUERGX0RvY3VtZW50ICogcERvYywgRlhfRFdPUkQgZXJyX2NvZGUpOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9IYXNYRkFGaWVsZChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBkb2NUeXBlKSB7CisgIGlmICghZG9jdW1lbnQpCisgICAgcmV0dXJuIEZBTFNFOwogCi1jbGFzcyBDTWVtRmlsZSBGWF9GSU5BTDogcHVibGljIElGWF9GaWxlUmVhZAotewotcHVibGljOgotCUNNZW1GaWxlKEZYX0JZVEUqIHBCdWYsIEZYX0ZJTEVTSVpFIHNpemUpOm1fcEJ1ZihwQnVmKSxtX3NpemUoc2l6ZSkge30KKyAgQ1BERl9Eb2N1bWVudCogcGRmRG9jID0KKyAgICAgIChzdGF0aWNfY2FzdDxDUERGWEZBX0RvY3VtZW50Kj4oZG9jdW1lbnQpKS0+R2V0UERGRG9jKCk7CisgIGlmICghcGRmRG9jKQorICAgIHJldHVybiBGQUxTRTsKIAotCXZpcnR1YWwgdm9pZAkJCVJlbGVhc2UoKSB7ZGVsZXRlIHRoaXM7fQotCXZpcnR1YWwgRlhfRklMRVNJWkUJCUdldFNpemUoKSB7cmV0dXJuIG1fc2l6ZTt9Ci0JdmlydHVhbCBGWF9CT09MCQkJUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgCi0JewotICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9TQUZFX0ZJTEVTSVpFIG5ld1BvcyA9IHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PEZYX0ZJTEVTSVpFLCBzaXplX3Q+KHNpemUpOwotICAgICAgICAgICAgbmV3UG9zICs9IG9mZnNldDsKLSAgICAgICAgICAgIGlmICghbmV3UG9zLklzVmFsaWQoKSB8fCBuZXdQb3MuVmFsdWVPckRpZSgpID4gKEZYX0RXT1JEKW1fc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLQkgICAgRlhTWVNfbWVtY3B5KGJ1ZmZlciwgbV9wQnVmK29mZnNldCwgc2l6ZSk7Ci0JICAgIHJldHVybiBUUlVFOwotCX0KLXByaXZhdGU6Ci0JRlhfQllURSogbV9wQnVmOwotCUZYX0ZJTEVTSVpFIG1fc2l6ZTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IHBkZkRvYy0+R2V0Um9vdCgpOworICBpZiAoIXBSb290KQorICAgIHJldHVybiBGQUxTRTsKKworICBDUERGX0RpY3Rpb25hcnkqIHBBY3JvRm9ybSA9IHBSb290LT5HZXREaWN0KCJBY3JvRm9ybSIpOworICBpZiAoIXBBY3JvRm9ybSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ1BERl9PYmplY3QqIHBYRkEgPSBwQWNyb0Zvcm0tPkdldEVsZW1lbnQoIlhGQSIpOworICBpZiAoIXBYRkEpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEZYX0JPT0wgYkR5bmFtaWNYRkEgPSBwUm9vdC0+R2V0Qm9vbGVhbigiTmVlZHNSZW5kZXJpbmciLCBGQUxTRSk7CisKKyAgaWYgKGJEeW5hbWljWEZBKQorICAgICpkb2NUeXBlID0gRE9DVFlQRV9EWU5BTUlDX1hGQTsKKyAgZWxzZQorICAgICpkb2NUeXBlID0gRE9DVFlQRV9TVEFUSUNfWEZBOworCisgIHJldHVybiBUUlVFOworfQorCitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9Mb2FkWEZBKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpIHsKKyAgcmV0dXJuIGRvY3VtZW50ICYmIChzdGF0aWNfY2FzdDxDUERGWEZBX0RvY3VtZW50Kj4oZG9jdW1lbnQpKS0+TG9hZFhGQURvYygpOworfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCitjbGFzcyBDTWVtRmlsZSBmaW5hbCA6IHB1YmxpYyBJRlhfRmlsZVJlYWQgeworIHB1YmxpYzoKKyAgQ01lbUZpbGUodWludDhfdCogcEJ1ZiwgRlhfRklMRVNJWkUgc2l6ZSkgOiBtX3BCdWYocEJ1ZiksIG1fc2l6ZShzaXplKSB7fQorCisgIHZvaWQgUmVsZWFzZSgpIG92ZXJyaWRlIHsgZGVsZXRlIHRoaXM7IH0KKyAgRlhfRklMRVNJWkUgR2V0U2l6ZSgpIG92ZXJyaWRlIHsgcmV0dXJuIG1fc2l6ZTsgfQorICBGWF9CT09MIFJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlIHsKKyAgICBpZiAob2Zmc2V0IDwgMCkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBGWF9TQUZFX0ZJTEVTSVpFIG5ld1BvcyA9CisgICAgICAgIHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PEZYX0ZJTEVTSVpFLCBzaXplX3Q+KHNpemUpOworICAgIG5ld1BvcyArPSBvZmZzZXQ7CisgICAgaWYgKCFuZXdQb3MuSXNWYWxpZCgpIHx8IG5ld1Bvcy5WYWx1ZU9yRGllKCkgPiAoRlhfRFdPUkQpbV9zaXplKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIEZYU1lTX21lbWNweShidWZmZXIsIG1fcEJ1ZiArIG9mZnNldCwgc2l6ZSk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworIHByaXZhdGU6CisgIH5DTWVtRmlsZSgpIG92ZXJyaWRlIHt9CisKKyAgdWludDhfdCogY29uc3QgbV9wQnVmOworICBjb25zdCBGWF9GSUxFU0laRSBtX3NpemU7CiB9OwotRExMRVhQT1JUIEZQREZfRE9DVU1FTlQgU1REQ0FMTCBGUERGX0xvYWRNZW1Eb2N1bWVudChjb25zdCB2b2lkKiBkYXRhX2J1ZiwgaW50IHNpemUsIEZQREZfQllURVNUUklORyBwYXNzd29yZCkKLXsKLQlDUERGX1BhcnNlciogcFBhcnNlciA9IG5ldyBDUERGX1BhcnNlcjsKLQlwUGFyc2VyLT5TZXRQYXNzd29yZChwYXNzd29yZCk7Ci0JQ01lbUZpbGUqIHBNZW1GaWxlID0gbmV3IENNZW1GaWxlKChGWF9CWVRFKilkYXRhX2J1Ziwgc2l6ZSk7Ci0JRlhfRFdPUkQgZXJyX2NvZGUgPSBwUGFyc2VyLT5TdGFydFBhcnNlKHBNZW1GaWxlKTsKLQlpZiAoZXJyX2NvZGUpIHsKLQkJZGVsZXRlIHBQYXJzZXI7Ci0JCVByb2Nlc3NQYXJzZUVycm9yKGVycl9jb2RlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCUNQREZfRG9jdW1lbnQgKiBwRG9jID0gTlVMTDsKLQlwRG9jID0gcFBhcnNlcj9wUGFyc2VyLT5HZXREb2N1bWVudCgpOk5VTEw7Ci0JQ2hlY2tVblN1cHBvcnRFcnJvcihwRG9jLCBlcnJfY29kZSk7Ci0JcmV0dXJuIHBQYXJzZXItPkdldERvY3VtZW50KCk7CisKK0RMTEVYUE9SVCBGUERGX0RPQ1VNRU5UIFNURENBTEwgRlBERl9Mb2FkTWVtRG9jdW1lbnQoY29uc3Qgdm9pZCogZGF0YV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgcGFzc3dvcmQpIHsKKyAgQ1BERl9QYXJzZXIqIHBQYXJzZXIgPSBuZXcgQ1BERl9QYXJzZXI7CisgIHBQYXJzZXItPlNldFBhc3N3b3JkKHBhc3N3b3JkKTsKKyAgQ01lbUZpbGUqIHBNZW1GaWxlID0gbmV3IENNZW1GaWxlKCh1aW50OF90KilkYXRhX2J1Ziwgc2l6ZSk7CisgIEZYX0RXT1JEIGVycl9jb2RlID0gcFBhcnNlci0+U3RhcnRQYXJzZShwTWVtRmlsZSk7CisgIGlmIChlcnJfY29kZSkgeworICAgIGRlbGV0ZSBwUGFyc2VyOworICAgIFByb2Nlc3NQYXJzZUVycm9yKGVycl9jb2RlKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDUERGX0RvY3VtZW50KiBwRG9jID0gTlVMTDsKKyAgcERvYyA9IHBQYXJzZXIgPyBwUGFyc2VyLT5HZXREb2N1bWVudCgpIDogTlVMTDsKKyAgQ2hlY2tVblN1cHBvcnRFcnJvcihwRG9jLCBlcnJfY29kZSk7CisgIHJldHVybiBGUERGRG9jdW1lbnRGcm9tQ1BERkRvY3VtZW50KHBQYXJzZXItPkdldERvY3VtZW50KCkpOwogfQogCi1ETExFWFBPUlQgRlBERl9ET0NVTUVOVCBTVERDQUxMIEZQREZfTG9hZEN1c3RvbURvY3VtZW50KEZQREZfRklMRUFDQ0VTUyogcEZpbGVBY2Nlc3MsIEZQREZfQllURVNUUklORyBwYXNzd29yZCkKLXsKLQlDUERGX1BhcnNlciogcFBhcnNlciA9IG5ldyBDUERGX1BhcnNlcjsKLQlwUGFyc2VyLT5TZXRQYXNzd29yZChwYXNzd29yZCk7Ci0JQ1BERl9DdXN0b21BY2Nlc3MqIHBGaWxlID0gbmV3IENQREZfQ3VzdG9tQWNjZXNzKHBGaWxlQWNjZXNzKTsKLQlGWF9EV09SRCBlcnJfY29kZSA9IHBQYXJzZXItPlN0YXJ0UGFyc2UocEZpbGUpOwotCWlmIChlcnJfY29kZSkgewotCQlkZWxldGUgcFBhcnNlcjsKLQkJUHJvY2Vzc1BhcnNlRXJyb3IoZXJyX2NvZGUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JQ1BERl9Eb2N1bWVudCAqIHBEb2MgPSBOVUxMOwotCXBEb2MgPSBwUGFyc2VyP3BQYXJzZXItPkdldERvY3VtZW50KCk6TlVMTDsKLQlDaGVja1VuU3VwcG9ydEVycm9yKHBEb2MsIGVycl9jb2RlKTsKLQlyZXR1cm4gcFBhcnNlci0+R2V0RG9jdW1lbnQoKTsKK0RMTEVYUE9SVCBGUERGX0RPQ1VNRU5UIFNURENBTEwKK0ZQREZfTG9hZEN1c3RvbURvY3VtZW50KEZQREZfRklMRUFDQ0VTUyogcEZpbGVBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgcGFzc3dvcmQpIHsKKyAgQ1BERl9QYXJzZXIqIHBQYXJzZXIgPSBuZXcgQ1BERl9QYXJzZXI7CisgIHBQYXJzZXItPlNldFBhc3N3b3JkKHBhc3N3b3JkKTsKKyAgQ1BERl9DdXN0b21BY2Nlc3MqIHBGaWxlID0gbmV3IENQREZfQ3VzdG9tQWNjZXNzKHBGaWxlQWNjZXNzKTsKKyAgRlhfRFdPUkQgZXJyX2NvZGUgPSBwUGFyc2VyLT5TdGFydFBhcnNlKHBGaWxlKTsKKyAgaWYgKGVycl9jb2RlKSB7CisgICAgZGVsZXRlIHBQYXJzZXI7CisgICAgUHJvY2Vzc1BhcnNlRXJyb3IoZXJyX2NvZGUpOworICAgIHJldHVybiBOVUxMOworICB9CisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBOVUxMOworICBwRG9jID0gcFBhcnNlciA/IHBQYXJzZXItPkdldERvY3VtZW50KCkgOiBOVUxMOworICBDaGVja1VuU3VwcG9ydEVycm9yKHBEb2MsIGVycl9jb2RlKTsKKyAgcmV0dXJuIEZQREZEb2N1bWVudEZyb21DUERGRG9jdW1lbnQocFBhcnNlci0+R2V0RG9jdW1lbnQoKSk7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX0dldEZpbGVWZXJzaW9uKEZQREZfRE9DVU1FTlQgZG9jLCBpbnQqIGZpbGVWZXJzaW9uKQotewotCWlmKCFkb2N8fCFmaWxlVmVyc2lvbikgcmV0dXJuIEZBTFNFOwotCSpmaWxlVmVyc2lvbiA9IDA7Ci0JQ1BERl9Eb2N1bWVudCogcERvYyA9IChDUERGX0RvY3VtZW50Kilkb2M7Ci0JQ1BERl9QYXJzZXIqIHBQYXJzZXIgPSAoQ1BERl9QYXJzZXIqKXBEb2MtPkdldFBhcnNlcigpOwotCWlmKCFwUGFyc2VyKQotCQlyZXR1cm4gRkFMU0U7Ci0JKmZpbGVWZXJzaW9uID0gcFBhcnNlci0+R2V0RmlsZVZlcnNpb24oKTsKLQlyZXR1cm4gVFJVRTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX0dldEZpbGVWZXJzaW9uKEZQREZfRE9DVU1FTlQgZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBmaWxlVmVyc2lvbikgeworICBpZiAoIWZpbGVWZXJzaW9uKQorICAgIHJldHVybiBGQUxTRTsKKworICAqZmlsZVZlcnNpb24gPSAwOworICBDUERGX0RvY3VtZW50KiBwRG9jID0gQ1BERkRvY3VtZW50RnJvbUZQREZEb2N1bWVudChkb2MpOworICBpZiAoIXBEb2MpCisgICAgcmV0dXJuIEZBTFNFOworCisgIENQREZfUGFyc2VyKiBwUGFyc2VyID0gcERvYy0+R2V0UGFyc2VyKCk7CisgIGlmICghcFBhcnNlcikKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgKmZpbGVWZXJzaW9uID0gcFBhcnNlci0+R2V0RmlsZVZlcnNpb24oKTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLS8vIGphYmRlbG1hbGVrOiBjaGFuZ2VkIHJldHVybiB0eXBlIGZyb20gRlhfRFdPUkQgdG8gYnVpbGQgb24gTGludXggKGFuZCBtYXRjaCBoZWFkZXIpLgotRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGX0dldERvY1Blcm1pc3Npb25zKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpCi17Ci0JaWYgKGRvY3VtZW50ID09IE5VTEwpIHJldHVybiAwOwotCUNQREZfRG9jdW1lbnQqcERvYyA9IChDUERGX0RvY3VtZW50Kilkb2N1bWVudDsKLQlDUERGX1BhcnNlciogcFBhcnNlciA9IAkoQ1BERl9QYXJzZXIqKXBEb2MtPkdldFBhcnNlcigpOwotCUNQREZfRGljdGlvbmFyeSogcERpY3QgPSBwUGFyc2VyLT5HZXRFbmNyeXB0RGljdCgpOwotCWlmIChwRGljdCA9PSBOVUxMKSByZXR1cm4gKEZYX0RXT1JEKS0xOworLy8gamFiZGVsbWFsZWs6IGNoYW5nZWQgcmV0dXJuIHR5cGUgZnJvbSBGWF9EV09SRCB0byBidWlsZCBvbiBMaW51eCAoYW5kIG1hdGNoCisvLyBoZWFkZXIpLgorRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGX0dldERvY1Blcm1pc3Npb25zKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpIHsKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZG9jdW1lbnQpOworICBpZiAoIXBEb2MpCisjaWZuZGVmIFBERl9FTkFCTEVfWEZBCisgICAgcmV0dXJuIDA7CisjZWxzZSAgIC8vIFBERl9FTkFCTEVfWEZBCisgICAgcmV0dXJuIChGWF9EV09SRCktMTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAotCXJldHVybiBwRGljdC0+R2V0SW50ZWdlcigiUCIpOworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcERvYy0+R2V0UGFyc2VyKCktPkdldEVuY3J5cHREaWN0KCk7CisgIHJldHVybiBwRGljdCA/IHBEaWN0LT5HZXRJbnRlZ2VyKCJQIikgOiAoRlhfRFdPUkQpLTE7CiB9CiAKLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGX0dldFNlY3VyaXR5SGFuZGxlclJldmlzaW9uKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpCi17Ci0gICAgaWYgKGRvY3VtZW50ID09IE5VTEwpIHJldHVybiAtMTsKLSAgICBDUERGX0RvY3VtZW50KnBEb2MgPSAoQ1BERl9Eb2N1bWVudCopZG9jdW1lbnQ7Ci0gICAgQ1BERl9QYXJzZXIqIHBQYXJzZXIgPSAoQ1BERl9QYXJzZXIqKXBEb2MtPkdldFBhcnNlcigpOwotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwUGFyc2VyLT5HZXRFbmNyeXB0RGljdCgpOwotICAgIGlmIChwRGljdCA9PSBOVUxMKSByZXR1cm4gLTE7CitETExFWFBPUlQgaW50IFNURENBTEwgRlBERl9HZXRTZWN1cml0eUhhbmRsZXJSZXZpc2lvbihGUERGX0RPQ1VNRU5UIGRvY3VtZW50KSB7CisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBDUERGRG9jdW1lbnRGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KTsKKyAgaWYgKCFwRG9jKQorICAgIHJldHVybiAtMTsKIAotICAgIHJldHVybiBwRGljdC0+R2V0SW50ZWdlcigiUiIpOworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcERvYy0+R2V0UGFyc2VyKCktPkdldEVuY3J5cHREaWN0KCk7CisgIHJldHVybiBwRGljdCA/IHBEaWN0LT5HZXRJbnRlZ2VyKCJSIikgOiAtMTsKIH0KIAotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfR2V0UGFnZUNvdW50KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpCi17Ci0JaWYgKGRvY3VtZW50ID09IE5VTEwpIHJldHVybiAwOwotCXJldHVybiAoKENQREZfRG9jdW1lbnQqKWRvY3VtZW50KS0+R2V0UGFnZUNvdW50KCk7CitETExFWFBPUlQgaW50IFNURENBTEwgRlBERl9HZXRQYWdlQ291bnQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkgeworICBVbmRlcmx5aW5nRG9jdW1lbnRUeXBlKiBwRG9jID0gVW5kZXJseWluZ0Zyb21GUERGRG9jdW1lbnQoZG9jdW1lbnQpOworICByZXR1cm4gcERvYyA/IHBEb2MtPkdldFBhZ2VDb3VudCgpIDogMDsKIH0KIAotRExMRVhQT1JUIEZQREZfUEFHRSBTVERDQUxMIEZQREZfTG9hZFBhZ2UoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgaW50IHBhZ2VfaW5kZXgpCi17Ci0JaWYgKGRvY3VtZW50ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWlmIChwYWdlX2luZGV4IDwgMCB8fCBwYWdlX2luZGV4ID49IEZQREZfR2V0UGFnZUNvdW50KGRvY3VtZW50KSkgcmV0dXJuIE5VTEw7CitETExFWFBPUlQgRlBERl9QQUdFIFNURENBTEwgRlBERl9Mb2FkUGFnZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfaW5kZXgpIHsKKyAgVW5kZXJseWluZ0RvY3VtZW50VHlwZSogcERvYyA9IFVuZGVybHlpbmdGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KTsKKyAgaWYgKCFwRG9jKQorICAgIHJldHVybiBudWxscHRyOwogCi0JQ1BERl9Eb2N1bWVudCogcERvYyA9IChDUERGX0RvY3VtZW50Kilkb2N1bWVudDsKLQlpZiAocERvYyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcERvYy0+R2V0UGFnZShwYWdlX2luZGV4KTsKLQlpZiAocERpY3QgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JQ1BERl9QYWdlKiBwUGFnZSA9IG5ldyBDUERGX1BhZ2U7Ci0JcFBhZ2UtPkxvYWQocERvYywgcERpY3QpOwotCXBQYWdlLT5QYXJzZUNvbnRlbnQoKTsKLQlyZXR1cm4gcFBhZ2U7CisgIGlmIChwYWdlX2luZGV4IDwgMCB8fCBwYWdlX2luZGV4ID49IHBEb2MtPkdldFBhZ2VDb3VudCgpKQorICAgIHJldHVybiBudWxscHRyOworCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgcmV0dXJuIHBEb2MtPkdldFBhZ2UocGFnZV9pbmRleCk7CisjZWxzZSAgIC8vIFBERl9FTkFCTEVfWEZBCisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwRG9jLT5HZXRQYWdlKHBhZ2VfaW5kZXgpOworICBpZiAoIXBEaWN0KQorICAgIHJldHVybiBOVUxMOworICBDUERGX1BhZ2UqIHBQYWdlID0gbmV3IENQREZfUGFnZTsKKyAgcFBhZ2UtPkxvYWQocERvYywgcERpY3QpOworICBwUGFnZS0+UGFyc2VDb250ZW50KCk7CisgIHJldHVybiBwUGFnZTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIH0KIAotRExMRVhQT1JUIGRvdWJsZSBTVERDQUxMIEZQREZfR2V0UGFnZVdpZHRoKEZQREZfUEFHRSBwYWdlKQotewotCWlmICghcGFnZSkKLQkJcmV0dXJuIDAuMDsKLQlyZXR1cm4gKChDUERGX1BhZ2UqKXBhZ2UpLT5HZXRQYWdlV2lkdGgoKTsKK0RMTEVYUE9SVCBkb3VibGUgU1REQ0FMTCBGUERGX0dldFBhZ2VXaWR0aChGUERGX1BBR0UgcGFnZSkgeworICBVbmRlcmx5aW5nUGFnZVR5cGUqIHBQYWdlID0gVW5kZXJseWluZ0Zyb21GUERGUGFnZShwYWdlKTsKKyAgcmV0dXJuIHBQYWdlID8gcFBhZ2UtPkdldFBhZ2VXaWR0aCgpIDogMC4wOwogfQogCi1ETExFWFBPUlQgZG91YmxlIFNURENBTEwgRlBERl9HZXRQYWdlSGVpZ2h0KEZQREZfUEFHRSBwYWdlKQotewotCWlmICghcGFnZSkgcmV0dXJuIDAuMDsKLQlyZXR1cm4gKChDUERGX1BhZ2UqKXBhZ2UpLT5HZXRQYWdlSGVpZ2h0KCk7CitETExFWFBPUlQgZG91YmxlIFNURENBTEwgRlBERl9HZXRQYWdlSGVpZ2h0KEZQREZfUEFHRSBwYWdlKSB7CisgIFVuZGVybHlpbmdQYWdlVHlwZSogcFBhZ2UgPSBVbmRlcmx5aW5nRnJvbUZQREZQYWdlKHBhZ2UpOworICByZXR1cm4gcFBhZ2UgPyBwUGFnZS0+R2V0UGFnZUhlaWdodCgpIDogMC4wOwogfQogCi12b2lkIERyb3BDb250ZXh0KHZvaWQqIGRhdGEpCi17Ci0JZGVsZXRlIChDUmVuZGVyQ29udGV4dCopZGF0YTsKK3ZvaWQgRHJvcENvbnRleHQodm9pZCogZGF0YSkgeworICBkZWxldGUgKENSZW5kZXJDb250ZXh0KilkYXRhOwogfQogCi12b2lkIEZQREZfUmVuZGVyUGFnZV9SZXRhaWwoQ1JlbmRlckNvbnRleHQqIHBDb250ZXh0LCBGUERGX1BBR0UgcGFnZSwgaW50IHN0YXJ0X3gsIGludCBzdGFydF95LCBpbnQgc2l6ZV94LCBpbnQgc2l6ZV95LAotCQkJCQkJaW50IHJvdGF0ZSwgaW50IGZsYWdzLEZYX0JPT0wgYk5lZWRUb1Jlc3RvcmUsIElGU0RLX1BBVVNFX0FkYXB0ZXIgKiBwYXVzZSAgKTsKLXZvaWQgKCpGdW5jX1JlbmRlclBhZ2UpKENSZW5kZXJDb250ZXh0KiwgRlBERl9QQUdFIHBhZ2UsIGludCBzdGFydF94LCBpbnQgc3RhcnRfeSwgaW50IHNpemVfeCwgaW50IHNpemVfeSwKLQkJCQkJCWludCByb3RhdGUsIGludCBmbGFncyxGWF9CT09MIGJOZWVkVG9SZXN0b3JlLCBJRlNES19QQVVTRV9BZGFwdGVyICogcGF1c2UgICkgPSBGUERGX1JlbmRlclBhZ2VfUmV0YWlsOwotCiAjaWYgZGVmaW5lZChfREVCVUcpIHx8IGRlZmluZWQoREVCVUcpCiAjZGVmaW5lIERFQlVHX1RSQUNFCiAjZW5kaWYKIAogI2lmIGRlZmluZWQoX1dJTjMyKQotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1JlbmRlclBhZ2UoSERDIGRjLCBGUERGX1BBR0UgcGFnZSwgaW50IHN0YXJ0X3gsIGludCBzdGFydF95LCBpbnQgc2l6ZV94LCBpbnQgc2l6ZV95LAotCQkJCQkJaW50IHJvdGF0ZSwgaW50IGZsYWdzKQotewotCWlmIChwYWdlPT1OVUxMKSByZXR1cm47Ci0JQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2U7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfUmVuZGVyUGFnZShIREMgZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpIHsKKyAgQ1BERl9QYWdlKiBwUGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2UpOworICBpZiAoIXBQYWdlKQorICAgIHJldHVybjsKIAotCUNSZW5kZXJDb250ZXh0KiBwQ29udGV4dCA9IG5ldyBDUmVuZGVyQ29udGV4dDsKLQlwUGFnZS0+U2V0UHJpdmF0ZURhdGEoKHZvaWQqKTEsIHBDb250ZXh0LCBEcm9wQ29udGV4dCk7CisgIENSZW5kZXJDb250ZXh0KiBwQ29udGV4dCA9IG5ldyBDUmVuZGVyQ29udGV4dDsKKyAgcFBhZ2UtPlNldFByaXZhdGVEYXRhKCh2b2lkKikxLCBwQ29udGV4dCwgRHJvcENvbnRleHQpOwogCiAjaWZuZGVmIF9XSU4zMl9XQ0UKLQlDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBOVUxMOwotCUZYX0JPT0wgYkJhY2tncm91bmRBbHBoYU5lZWRlZD1GQUxTRTsKLQliQmFja2dyb3VuZEFscGhhTmVlZGVkID0gcFBhZ2UtPkJhY2tncm91bmRBbHBoYU5lZWRlZCgpOwotCWlmIChiQmFja2dyb3VuZEFscGhhTmVlZGVkKQotCXsKLQkJCi0JCXBCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOwotCQlwQml0bWFwLT5DcmVhdGUoc2l6ZV94LCBzaXplX3ksIEZYRElCX0FyZ2IpOwotCQlwQml0bWFwLT5DbGVhcigweDAwZmZmZmZmKTsKKyAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gbnVsbHB0cjsKKyAgRlhfQk9PTCBiQmFja2dyb3VuZEFscGhhTmVlZGVkID0gcFBhZ2UtPkJhY2tncm91bmRBbHBoYU5lZWRlZCgpOworICBGWF9CT09MIGJIYXNJbWFnZU1hc2sgPSBwUGFnZS0+SGFzSW1hZ2VNYXNrKCk7CisgIGlmIChiQmFja2dyb3VuZEFscGhhTmVlZGVkIHx8IGJIYXNJbWFnZU1hc2spIHsKKyAgICBwQml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsKKyAgICBwQml0bWFwLT5DcmVhdGUoc2l6ZV94LCBzaXplX3ksIEZYRElCX0FyZ2IpOworICAgIHBCaXRtYXAtPkNsZWFyKDB4MDBmZmZmZmYpOwogI2lmZGVmIF9TS0lBX1NVUFBPUlRfCi0JCXBDb250ZXh0LT5tX3BEZXZpY2UgPSBuZXcgQ0ZYX1NraWFEZXZpY2U7Ci0JCSgoQ0ZYX1NraWFEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopcEJpdG1hcCk7CisgICAgcENvbnRleHQtPm1fcERldmljZSA9IG5ldyBDRlhfU2tpYURldmljZTsKKyAgICAoKENGWF9Ta2lhRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKChDRlhfRElCaXRtYXAqKXBCaXRtYXApOwogI2Vsc2UKLQkJcENvbnRleHQtPm1fcERldmljZSA9IG5ldyBDRlhfRnhnZURldmljZTsKLQkJKChDRlhfRnhnZURldmljZSopcENvbnRleHQtPm1fcERldmljZSktPkF0dGFjaCgoQ0ZYX0RJQml0bWFwKilwQml0bWFwKTsKKyAgICBwQ29udGV4dC0+bV9wRGV2aWNlID0gbmV3IENGWF9GeGdlRGV2aWNlOworICAgICgoQ0ZYX0Z4Z2VEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopcEJpdG1hcCk7CiAjZW5kaWYKLQl9Ci0JZWxzZQotCSAgICBwQ29udGV4dC0+bV9wRGV2aWNlID0gbmV3IENGWF9XaW5kb3dzRGV2aWNlKGRjKTsKKyAgfSBlbHNlIHsKKyAgICBwQ29udGV4dC0+bV9wRGV2aWNlID0gbmV3IENGWF9XaW5kb3dzRGV2aWNlKGRjKTsKKyAgfQogCi0JRnVuY19SZW5kZXJQYWdlKHBDb250ZXh0LCBwYWdlLCBzdGFydF94LCBzdGFydF95LCBzaXplX3gsIHNpemVfeSwgcm90YXRlLCBmbGFncyxUUlVFLE5VTEwpOworICBGUERGX1JlbmRlclBhZ2VfUmV0YWlsKHBDb250ZXh0LCBwYWdlLCBzdGFydF94LCBzdGFydF95LCBzaXplX3gsIHNpemVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGUsIGZsYWdzLCBUUlVFLCBOVUxMKTsKIAotCWlmIChiQmFja2dyb3VuZEFscGhhTmVlZGVkKSAKLQl7Ci0JCWlmIChwQml0bWFwKQotCQl7Ci0JCQlDRlhfV2luZG93c0RldmljZSBXaW5EQyhkYyk7Ci0JCQkKLSAJCQlpZiAoV2luREMuR2V0RGV2aWNlQ2FwcyhGWERDX0RFVklDRV9DTEFTUykgPT0gRlhEQ19QUklOVEVSKQotIAkJCXsKLQkJCQlDRlhfRElCaXRtYXAqIHBEc3QgPSBuZXcgQ0ZYX0RJQml0bWFwOwotCQkJCWludCBwaXRjaCA9IHBCaXRtYXAtPkdldFBpdGNoKCk7Ci0JCQkJcERzdC0+Q3JlYXRlKHNpemVfeCwgc2l6ZV95LCBGWERJQl9SZ2IzMik7Ci0JCQkJRlhTWVNfbWVtc2V0KHBEc3QtPkdldEJ1ZmZlcigpLCAtMSwgcGl0Y2gqc2l6ZV95KTsKLQkJCQlwRHN0LT5Db21wb3NpdGVCaXRtYXAoMCwgMCwgc2l6ZV94LCBzaXplX3ksIHBCaXRtYXAsIDAsIDAsIEZYRElCX0JMRU5EX05PUk1BTCwgTlVMTCwgRkFMU0UsIE5VTEwpOwotCQkJCVdpbkRDLlN0cmV0Y2hESUJpdHMocERzdCwwLDAsc2l6ZV94LHNpemVfeSk7Ci0JCQkJZGVsZXRlIHBEc3Q7Ci0gCQkJfQotIAkJCWVsc2UKLSAJCQkJV2luREMuU2V0RElCaXRzKHBCaXRtYXAsMCwwKTsKKyAgaWYgKGJCYWNrZ3JvdW5kQWxwaGFOZWVkZWQgfHwgYkhhc0ltYWdlTWFzaykgeworICAgIGlmIChwQml0bWFwKSB7CisgICAgICBDRlhfV2luZG93c0RldmljZSBXaW5EQyhkYyk7CiAKLQkJfQotCX0KLSNlbHNlCi0JLy8gZ2V0IGNsaXAgcmVnaW9uCi0JUkVDVCByZWN0LCBjbGlwcmVjdDsKLQlyZWN0LmxlZnQgPSBzdGFydF94OwotCXJlY3QudG9wID0gc3RhcnRfeTsKLQlyZWN0LnJpZ2h0ID0gc3RhcnRfeCArIHNpemVfeDsKLQlyZWN0LmJvdHRvbSA9IHN0YXJ0X3kgKyBzaXplX3k7Ci0JR2V0Q2xpcEJveChkYywgJmNsaXByZWN0KTsKLQlJbnRlcnNlY3RSZWN0KCZyZWN0LCAmcmVjdCwgJmNsaXByZWN0KTsKLQlpbnQgd2lkdGggPSByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0OwotCWludCBoZWlnaHQgPSByZWN0LmJvdHRvbSAtIHJlY3QudG9wOwotCi0jaWZkZWYgREVCVUdfVFJBQ0UKLQl7Ci0JCWNoYXIgc3RyWzEyOF07Ci0JCW1lbXNldChzdHIsIDAsIHNpemVvZihzdHIpKTsKLQkJRlhTWVNfc25wcmludGYoc3RyLCBzaXplb2Yoc3RyKSAtIDEsICJSZW5kZXJpbmcgRElCICVkIHggJWQiLCB3aWR0aCwgaGVpZ2h0KTsKLQkJQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5SZXBvcnRFcnJvcig5OTksIHN0cik7Ci0JfQotI2VuZGlmCi0KLQkvLyBDcmVhdGUgYSBESUIgc2VjdGlvbgotCUxQVk9JRCBwQnVmZmVyOwotCUJJVE1BUElORk9IRUFERVIgYm1paDsKLQlGWFNZU19tZW1zZXQoJmJtaWgsIDAsIHNpemVvZiBibWloKTsKLQlibWloLmJpU2l6ZSA9IHNpemVvZiBibWloOwotCWJtaWguYmlCaXRDb3VudCA9IDI0OwotCWJtaWguYmlIZWlnaHQgPSAtaGVpZ2h0OwotCWJtaWguYmlQbGFuZXMgPSAxOwotCWJtaWguYmlXaWR0aCA9IHdpZHRoOwotCXBDb250ZXh0LT5tX2hCaXRtYXAgPSBDcmVhdGVESUJTZWN0aW9uKGRjLCAoQklUTUFQSU5GTyopJmJtaWgsIERJQl9SR0JfQ09MT1JTLCAmcEJ1ZmZlciwgTlVMTCwgMCk7Ci0JaWYgKHBDb250ZXh0LT5tX2hCaXRtYXAgPT0gTlVMTCkgewotI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoX0RFQlVHKQotCQljaGFyIHN0clsxMjhdOwotCQltZW1zZXQoc3RyLCAwLCBzaXplb2Yoc3RyKSk7Ci0JCUZYU1lTX3NucHJpbnRmKHN0ciwgc2l6ZW9mKHN0cikgLSAxLCAiRXJyb3IgQ3JlYXRlRElCU2VjdGlvbjogJWQgeCAlZCwgZXJyb3IgY29kZSA9ICVkIiwgd2lkdGgsIGhlaWdodCwgR2V0TGFzdEVycm9yKCkpOwotCQlDUERGX01vZHVsZU1ncjo6R2V0KCktPlJlcG9ydEVycm9yKEZQREZFUlJfT1VUX09GX01FTU9SWSwgc3RyKTsKLSNlbHNlCi0JCUNQREZfTW9kdWxlTWdyOjpHZXQoKS0+UmVwb3J0RXJyb3IoRlBERkVSUl9PVVRfT0ZfTUVNT1JZLCBOVUxMKTsKLSNlbmRpZgotCX0KLQlGWFNZU19tZW1zZXQocEJ1ZmZlciwgMHhmZiwgaGVpZ2h0Kigod2lkdGgqMyszKS80KjQpKTsKLQotI2lmZGVmIERFQlVHX1RSQUNFCi0JewotCQlDUERGX01vZHVsZU1ncjo6R2V0KCktPlJlcG9ydEVycm9yKDk5OSwgIkRJQlNlY3Rpb24gY3JlYXRlZCIpOwotCX0KLSNlbmRpZgotCi0JLy8gQ3JlYXRlIGEgZGV2aWNlIHdpdGggdGhpcyBleHRlcm5hbCBidWZmZXIKLQlwQ29udGV4dC0+bV9wQml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsKLQlwQ29udGV4dC0+bV9wQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfUmdiLCAoRlhfTFBCWVRFKXBCdWZmZXIpOwotCXBDb250ZXh0LT5tX3BEZXZpY2UgPSBuZXcgQ1BERl9GeGdlRGV2aWNlOwotCSgoQ1BERl9GeGdlRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKHBDb250ZXh0LT5tX3BCaXRtYXApOwotCi0jaWZkZWYgREVCVUdfVFJBQ0UKLQlDUERGX01vZHVsZU1ncjo6R2V0KCktPlJlcG9ydEVycm9yKDk5OSwgIlJlYWR5IGZvciBQREYgcmVuZGVyaW5nIik7Ci0jZW5kaWYKLQotCS8vIG91dHB1dCB0byBiaXRtYXAgZGV2aWNlCi0JRnVuY19SZW5kZXJQYWdlKHBDb250ZXh0LCBwYWdlLCBzdGFydF94IC0gcmVjdC5sZWZ0LCBzdGFydF95IC0gcmVjdC50b3AsIHNpemVfeCwgc2l6ZV95LCByb3RhdGUsIGZsYWdzKTsKLQotI2lmZGVmIERFQlVHX1RSQUNFCi0JQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5SZXBvcnRFcnJvcig5OTksICJGaW5pc2hlZCBQREYgcmVuZGVyaW5nIik7Ci0jZW5kaWYKLQotCS8vIE5vdyBvdXRwdXQgdG8gcmVhbCBkZXZpY2UKLQlIREMgaE1lbURDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGRjKTsKLQlpZiAoaE1lbURDID09IE5VTEwpIHsKLSNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKF9ERUJVRykKLQkJY2hhciBzdHJbMTI4XTsKLQkJbWVtc2V0KHN0ciwgMCwgc2l6ZW9mKHN0cikpOwotCQlGWFNZU19zbnByaW50ZihzdHIsIHNpemVvZihzdHIpIC0gMSwgIkVycm9yIENyZWF0ZUNvbXBhdGlibGVEQy4gRXJyb3IgY29kZSA9ICVkIiwgR2V0TGFzdEVycm9yKCkpOwotCQlDUERGX01vZHVsZU1ncjo6R2V0KCktPlJlcG9ydEVycm9yKEZQREZFUlJfT1VUX09GX01FTU9SWSwgc3RyKTsKLSNlbHNlCi0JCUNQREZfTW9kdWxlTWdyOjpHZXQoKS0+UmVwb3J0RXJyb3IoRlBERkVSUl9PVVRfT0ZfTUVNT1JZLCBOVUxMKTsKLSNlbmRpZgotCX0KLQotCUhHRElPQkogaE9sZEJpdG1hcCA9IFNlbGVjdE9iamVjdChoTWVtREMsIHBDb250ZXh0LT5tX2hCaXRtYXApOwotCi0jaWZkZWYgREVCVUdfVFJBQ0UKLQlDUERGX01vZHVsZU1ncjo6R2V0KCktPlJlcG9ydEVycm9yKDk5OSwgIlJlYWR5IGZvciBzY3JlZW4gcmVuZGVyaW5nIik7Ci0jZW5kaWYKLQotCUJpdEJsdChkYywgcmVjdC5sZWZ0LCByZWN0LnRvcCwgd2lkdGgsIGhlaWdodCwgaE1lbURDLCAwLCAwLCBTUkNDT1BZKTsKLQlTZWxlY3RPYmplY3QoaE1lbURDLCBoT2xkQml0bWFwKTsKLQlEZWxldGVEQyhoTWVtREMpOwotCi0jaWZkZWYgREVCVUdfVFJBQ0UKLQlDUERGX01vZHVsZU1ncjo6R2V0KCktPlJlcG9ydEVycm9yKDk5OSwgIkZpbmlzaGVkIHNjcmVlbiByZW5kZXJpbmciKTsKLSNlbmRpZgotCi0jZW5kaWYKLQlpZiAoYkJhY2tncm91bmRBbHBoYU5lZWRlZCkKLQl7Ci0JCWlmIChwQml0bWFwKQotCQkJZGVsZXRlIHBCaXRtYXA7Ci0JCXBCaXRtYXAgPSBOVUxMOwotCX0KLQlkZWxldGUgcENvbnRleHQ7Ci0JcFBhZ2UtPlJlbW92ZVByaXZhdGVEYXRhKCh2b2lkKikxKTsKLX0KLSNlbmRpZgotCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfUmVuZGVyUGFnZUJpdG1hcChGUERGX0JJVE1BUCBiaXRtYXAsIEZQREZfUEFHRSBwYWdlLCBpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksIAotCQkJCQkJaW50IHNpemVfeCwgaW50IHNpemVfeSwgaW50IHJvdGF0ZSwgaW50IGZsYWdzKQotewotCWlmIChiaXRtYXAgPT0gTlVMTCB8fCBwYWdlID09IE5VTEwpIHJldHVybjsKLQlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKLQotCi0JQ1JlbmRlckNvbnRleHQqIHBDb250ZXh0ID0gbmV3IENSZW5kZXJDb250ZXh0OwotCXBQYWdlLT5TZXRQcml2YXRlRGF0YSgodm9pZCopMSwgcENvbnRleHQsIERyb3BDb250ZXh0KTsKLSNpZmRlZiBfU0tJQV9TVVBQT1JUXwotCXBDb250ZXh0LT5tX3BEZXZpY2UgPSBuZXcgQ0ZYX1NraWFEZXZpY2U7Ci0KLQlpZiAoZmxhZ3MgJiBGUERGX1JFVkVSU0VfQllURV9PUkRFUikKLQkJKChDRlhfU2tpYURldmljZSopcENvbnRleHQtPm1fcERldmljZSktPkF0dGFjaCgoQ0ZYX0RJQml0bWFwKiliaXRtYXAsMCxUUlVFKTsKLQllbHNlCi0JCSgoQ0ZYX1NraWFEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwKTsKLSNlbHNlCi0JcENvbnRleHQtPm1fcERldmljZSA9IG5ldyBDRlhfRnhnZURldmljZTsKLQotCWlmIChmbGFncyAmIEZQREZfUkVWRVJTRV9CWVRFX09SREVSKQotCQkoKENGWF9GeGdlRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKChDRlhfRElCaXRtYXAqKWJpdG1hcCwwLFRSVUUpOwotCWVsc2UKLQkJKChDRlhfRnhnZURldmljZSopcENvbnRleHQtPm1fcERldmljZSktPkF0dGFjaCgoQ0ZYX0RJQml0bWFwKiliaXRtYXApOwotI2VuZGlmCi0KLQlGdW5jX1JlbmRlclBhZ2UocENvbnRleHQsIHBhZ2UsIHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LCByb3RhdGUsIGZsYWdzLFRSVUUsTlVMTCk7Ci0KLQlkZWxldGUgcENvbnRleHQ7Ci0JcFBhZ2UtPlJlbW92ZVByaXZhdGVEYXRhKCh2b2lkKikxKTsKLX0KLQotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0Nsb3NlUGFnZShGUERGX1BBR0UgcGFnZSkKLXsKLQlpZiAoIXBhZ2UpIHJldHVybjsKLSAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gKENQREZTREtfUGFnZVZpZXcqKSgoKENQREZfUGFnZSopcGFnZSkpLT5HZXRQcml2YXRlRGF0YSgoRlhfTFBWT0lEKXBhZ2UpOwotICAgICAgICBpZiAocFBhZ2VWaWV3ICYmIHBQYWdlVmlldy0+SXNMb2NrZWQoKSkgewotICAgICAgICAgICAgcFBhZ2VWaWV3LT5UYWtlT3ZlclBhZ2UoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCWRlbGV0ZSAoQ1BERl9QYWdlKilwYWdlOwotCi19Ci0KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9DbG9zZURvY3VtZW50KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpCi17Ci0JaWYgKCFkb2N1bWVudCkKLQkJcmV0dXJuOwotCUNQREZfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERl9Eb2N1bWVudCopZG9jdW1lbnQ7CQotCUNQREZfUGFyc2VyKiBwUGFyc2VyID0gKENQREZfUGFyc2VyKilwRG9jLT5HZXRQYXJzZXIoKTsKLQlpZiAocFBhcnNlciA9PSBOVUxMKSAKLQl7Ci0JCWRlbGV0ZSBwRG9jOwotCQlyZXR1cm47Ci0JfQotCWRlbGV0ZSBwUGFyc2VyOwotLy8JZGVsZXRlIHBEb2M7Ci19Ci0KLURMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERl9HZXRMYXN0RXJyb3IoKQotewotCXJldHVybiBHZXRMYXN0RXJyb3IoKTsKLX0KLQotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0RldmljZVRvUGFnZShGUERGX1BBR0UgcGFnZSwgaW50IHN0YXJ0X3gsIGludCBzdGFydF95LCBpbnQgc2l6ZV94LCBpbnQgc2l6ZV95LAotCQkJCQkJaW50IHJvdGF0ZSwgaW50IGRldmljZV94LCBpbnQgZGV2aWNlX3ksIGRvdWJsZSogcGFnZV94LCBkb3VibGUqIHBhZ2VfeSkKLXsKLQlpZiAocGFnZSA9PSBOVUxMIHx8IHBhZ2VfeCA9PSBOVUxMIHx8IHBhZ2VfeSA9PSBOVUxMKSByZXR1cm47Ci0JQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2U7Ci0KLQlDUERGX01hdHJpeCBwYWdlMmRldmljZTsKLQlwUGFnZS0+R2V0RGlzcGxheU1hdHJpeChwYWdlMmRldmljZSwgc3RhcnRfeCwgc3RhcnRfeSwgc2l6ZV94LCBzaXplX3ksIHJvdGF0ZSk7Ci0JQ1BERl9NYXRyaXggZGV2aWNlMnBhZ2U7Ci0JZGV2aWNlMnBhZ2UuU2V0UmV2ZXJzZShwYWdlMmRldmljZSk7Ci0KLQlGWF9GTE9BVCBwYWdlX3hfZiwgcGFnZV95X2Y7Ci0JZGV2aWNlMnBhZ2UuVHJhbnNmb3JtKChGWF9GTE9BVCkoZGV2aWNlX3gpLCAoRlhfRkxPQVQpKGRldmljZV95KSwgcGFnZV94X2YsIHBhZ2VfeV9mKTsKLQotCSpwYWdlX3ggPSAocGFnZV94X2YpOwotCSpwYWdlX3kgPSAocGFnZV95X2YpOwotfQotCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfUGFnZVRvRGV2aWNlKEZQREZfUEFHRSBwYWdlLCBpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksIGludCBzaXplX3gsIGludCBzaXplX3ksCi0JCQkJCQlpbnQgcm90YXRlLCBkb3VibGUgcGFnZV94LCBkb3VibGUgcGFnZV95LCBpbnQqIGRldmljZV94LCBpbnQqIGRldmljZV95KQotewotCWlmIChwYWdlID09IE5VTEwgfHwgZGV2aWNlX3ggPT0gTlVMTCB8fCBkZXZpY2VfeSA9PSBOVUxMKSByZXR1cm47Ci0JQ1BERl9QYWdlKiBwUGFnZSA9IChDUERGX1BhZ2UqKXBhZ2U7Ci0KLQlDUERGX01hdHJpeCBwYWdlMmRldmljZTsKLQlwUGFnZS0+R2V0RGlzcGxheU1hdHJpeChwYWdlMmRldmljZSwgc3RhcnRfeCwgc3RhcnRfeSwgc2l6ZV94LCBzaXplX3ksIHJvdGF0ZSk7Ci0KLQlGWF9GTE9BVCBkZXZpY2VfeF9mLCBkZXZpY2VfeV9mOwotCXBhZ2UyZGV2aWNlLlRyYW5zZm9ybSgoKEZYX0ZMT0FUKXBhZ2VfeCksICgoRlhfRkxPQVQpcGFnZV95KSwgZGV2aWNlX3hfZiwgZGV2aWNlX3lfZik7Ci0KLQkqZGV2aWNlX3ggPSBGWFNZU19yb3VuZChkZXZpY2VfeF9mKTsKLQkqZGV2aWNlX3kgPSBGWFNZU19yb3VuZChkZXZpY2VfeV9mKTsKLX0KLQotRExMRVhQT1JUIEZQREZfQklUTUFQIFNURENBTEwgRlBERkJpdG1hcF9DcmVhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYWxwaGEpCi17Ci0gICAgbm9uc3RkOjp1bmlxdWVfcHRyPENGWF9ESUJpdG1hcD4gcEJpdG1hcChuZXcgQ0ZYX0RJQml0bWFwKTsKLSAgICBpZiAoIXBCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBhbHBoYSA/IEZYRElCX0FyZ2IgOiBGWERJQl9SZ2IzMikpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICBpZiAoV2luREMuR2V0RGV2aWNlQ2FwcyhGWERDX0RFVklDRV9DTEFTUykgPT0gRlhEQ19QUklOVEVSKSB7CisgICAgICAgIENGWF9ESUJpdG1hcCogcERzdCA9IG5ldyBDRlhfRElCaXRtYXA7CisgICAgICAgIGludCBwaXRjaCA9IHBCaXRtYXAtPkdldFBpdGNoKCk7CisgICAgICAgIHBEc3QtPkNyZWF0ZShzaXplX3gsIHNpemVfeSwgRlhESUJfUmdiMzIpOworICAgICAgICBGWFNZU19tZW1zZXQocERzdC0+R2V0QnVmZmVyKCksIC0xLCBwaXRjaCAqIHNpemVfeSk7CisgICAgICAgIHBEc3QtPkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCBzaXplX3gsIHNpemVfeSwgcEJpdG1hcCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0JMRU5EX05PUk1BTCwgTlVMTCwgRkFMU0UsIE5VTEwpOworICAgICAgICBXaW5EQy5TdHJldGNoRElCaXRzKHBEc3QsIDAsIDAsIHNpemVfeCwgc2l6ZV95KTsKKyAgICAgICAgZGVsZXRlIHBEc3Q7CisgICAgICB9IGVsc2UgeworICAgICAgICBXaW5EQy5TZXRESUJpdHMocEJpdG1hcCwgMCwgMCk7CisgICAgICB9CiAgICAgfQotICAgIHJldHVybiBwQml0bWFwLnJlbGVhc2UoKTsKLX0KLQotRExMRVhQT1JUIEZQREZfQklUTUFQIFNURENBTEwgRlBERkJpdG1hcF9DcmVhdGVFeChpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsIHZvaWQqIGZpcnN0X3NjYW4sIGludCBzdHJpZGUpCi17Ci0JRlhESUJfRm9ybWF0IGZ4X2Zvcm1hdDsKLQlzd2l0Y2ggKGZvcm1hdCkgewotCQljYXNlIEZQREZCaXRtYXBfR3JheToKLQkJCWZ4X2Zvcm1hdCA9IEZYRElCXzhicHBSZ2I7Ci0JCQlicmVhazsKLQkJY2FzZSBGUERGQml0bWFwX0JHUjoKLQkJCWZ4X2Zvcm1hdCA9IEZYRElCX1JnYjsKLQkJCWJyZWFrOwotCQljYXNlIEZQREZCaXRtYXBfQkdSeDoKLQkJCWZ4X2Zvcm1hdCA9IEZYRElCX1JnYjMyOwotCQkJYnJlYWs7Ci0JCWNhc2UgRlBERkJpdG1hcF9CR1JBOgotCQkJZnhfZm9ybWF0ID0gRlhESUJfQXJnYjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCUNGWF9ESUJpdG1hcCogcEJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7Ci0JcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIGZ4X2Zvcm1hdCwgKEZYX0xQQllURSlmaXJzdF9zY2FuLCBzdHJpZGUpOwotCXJldHVybiBwQml0bWFwOwotfQotCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZCaXRtYXBfRmlsbFJlY3QoRlBERl9CSVRNQVAgYml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBGUERGX0RXT1JEIGNvbG9yKQotewotCWlmIChiaXRtYXAgPT0gTlVMTCkgcmV0dXJuOwotI2lmZGVmIF9TS0lBX1NVUFBPUlRfCi0JQ0ZYX1NraWFEZXZpY2UgZGV2aWNlOworICB9CiAjZWxzZQotCUNGWF9GeGdlRGV2aWNlIGRldmljZTsKKyAgLy8gZ2V0IGNsaXAgcmVnaW9uCisgIFJFQ1QgcmVjdCwgY2xpcHJlY3Q7CisgIHJlY3QubGVmdCA9IHN0YXJ0X3g7CisgIHJlY3QudG9wID0gc3RhcnRfeTsKKyAgcmVjdC5yaWdodCA9IHN0YXJ0X3ggKyBzaXplX3g7CisgIHJlY3QuYm90dG9tID0gc3RhcnRfeSArIHNpemVfeTsKKyAgR2V0Q2xpcEJveChkYywgJmNsaXByZWN0KTsKKyAgSW50ZXJzZWN0UmVjdCgmcmVjdCwgJnJlY3QsICZjbGlwcmVjdCk7CisgIGludCB3aWR0aCA9IHJlY3QucmlnaHQgLSByZWN0LmxlZnQ7CisgIGludCBoZWlnaHQgPSByZWN0LmJvdHRvbSAtIHJlY3QudG9wOworCisjaWZkZWYgREVCVUdfVFJBQ0UKKyAgeworICAgIGNoYXIgc3RyWzEyOF07CisgICAgbWVtc2V0KHN0ciwgMCwgc2l6ZW9mKHN0cikpOworICAgIEZYU1lTX3NucHJpbnRmKHN0ciwgc2l6ZW9mKHN0cikgLSAxLCAiUmVuZGVyaW5nIERJQiAlZCB4ICVkIiwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICBDUERGX01vZHVsZU1ncjo6R2V0KCktPlJlcG9ydEVycm9yKDk5OSwgc3RyKTsKKyAgfQogI2VuZGlmCi0JZGV2aWNlLkF0dGFjaCgoQ0ZYX0RJQml0bWFwKiliaXRtYXApOwotCWlmICghKChDRlhfRElCaXRtYXAqKWJpdG1hcCktPkhhc0FscGhhKCkpIGNvbG9yIHw9IDB4RkYwMDAwMDA7Ci0JRlhfUkVDVCByZWN0KGxlZnQsIHRvcCwgbGVmdCt3aWR0aCwgdG9wK2hlaWdodCk7Ci0JZGV2aWNlLkZpbGxSZWN0KCZyZWN0LCBjb2xvcik7CisKKyAgLy8gQ3JlYXRlIGEgRElCIHNlY3Rpb24KKyAgTFBWT0lEIHBCdWZmZXI7CisgIEJJVE1BUElORk9IRUFERVIgYm1paDsKKyAgRlhTWVNfbWVtc2V0KCZibWloLCAwLCBzaXplb2YgYm1paCk7CisgIGJtaWguYmlTaXplID0gc2l6ZW9mIGJtaWg7CisgIGJtaWguYmlCaXRDb3VudCA9IDI0OworICBibWloLmJpSGVpZ2h0ID0gLWhlaWdodDsKKyAgYm1paC5iaVBsYW5lcyA9IDE7CisgIGJtaWguYmlXaWR0aCA9IHdpZHRoOworICBwQ29udGV4dC0+bV9oQml0bWFwID0gQ3JlYXRlRElCU2VjdGlvbihkYywgKEJJVE1BUElORk8qKSZibWloLCBESUJfUkdCX0NPTE9SUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXIsIE5VTEwsIDApOworICBpZiAoIXBDb250ZXh0LT5tX2hCaXRtYXApIHsKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKF9ERUJVRykKKyAgICBjaGFyIHN0clsxMjhdOworICAgIG1lbXNldChzdHIsIDAsIHNpemVvZihzdHIpKTsKKyAgICBGWFNZU19zbnByaW50ZihzdHIsIHNpemVvZihzdHIpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAiRXJyb3IgQ3JlYXRlRElCU2VjdGlvbjogJWQgeCAlZCwgZXJyb3IgY29kZSA9ICVkIiwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBHZXRMYXN0RXJyb3IoKSk7CisgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5SZXBvcnRFcnJvcihGUERGRVJSX09VVF9PRl9NRU1PUlksIHN0cik7CisjZWxzZQorICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+UmVwb3J0RXJyb3IoRlBERkVSUl9PVVRfT0ZfTUVNT1JZLCBOVUxMKTsKKyNlbmRpZgorICB9CisgIEZYU1lTX21lbXNldChwQnVmZmVyLCAweGZmLCBoZWlnaHQgKiAoKHdpZHRoICogMyArIDMpIC8gNCAqIDQpKTsKKworI2lmZGVmIERFQlVHX1RSQUNFCisgIHsgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5SZXBvcnRFcnJvcig5OTksICJESUJTZWN0aW9uIGNyZWF0ZWQiKTsgfQorI2VuZGlmCisKKyAgLy8gQ3JlYXRlIGEgZGV2aWNlIHdpdGggdGhpcyBleHRlcm5hbCBidWZmZXIKKyAgcENvbnRleHQtPm1fcEJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7CisgIHBDb250ZXh0LT5tX3BCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9SZ2IsICh1aW50OF90KilwQnVmZmVyKTsKKyAgcENvbnRleHQtPm1fcERldmljZSA9IG5ldyBDUERGX0Z4Z2VEZXZpY2U7CisgICgoQ1BERl9GeGdlRGV2aWNlKilwQ29udGV4dC0+bV9wRGV2aWNlKS0+QXR0YWNoKHBDb250ZXh0LT5tX3BCaXRtYXApOworCisjaWZkZWYgREVCVUdfVFJBQ0UKKyAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5SZXBvcnRFcnJvcig5OTksICJSZWFkeSBmb3IgUERGIHJlbmRlcmluZyIpOworI2VuZGlmCisKKyAgLy8gb3V0cHV0IHRvIGJpdG1hcCBkZXZpY2UKKyAgRlBERl9SZW5kZXJQYWdlX1JldGFpbChwQ29udGV4dCwgcGFnZSwgc3RhcnRfeCAtIHJlY3QubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF95IC0gcmVjdC50b3AsIHNpemVfeCwgc2l6ZV95LCByb3RhdGUsIGZsYWdzKTsKKworI2lmZGVmIERFQlVHX1RSQUNFCisgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+UmVwb3J0RXJyb3IoOTk5LCAiRmluaXNoZWQgUERGIHJlbmRlcmluZyIpOworI2VuZGlmCisKKyAgLy8gTm93IG91dHB1dCB0byByZWFsIGRldmljZQorICBIREMgaE1lbURDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGRjKTsKKyAgaWYgKCFoTWVtREMpIHsKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKF9ERUJVRykKKyAgICBjaGFyIHN0clsxMjhdOworICAgIG1lbXNldChzdHIsIDAsIHNpemVvZihzdHIpKTsKKyAgICBGWFNZU19zbnByaW50ZihzdHIsIHNpemVvZihzdHIpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAiRXJyb3IgQ3JlYXRlQ29tcGF0aWJsZURDLiBFcnJvciBjb2RlID0gJWQiLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5SZXBvcnRFcnJvcihGUERGRVJSX09VVF9PRl9NRU1PUlksIHN0cik7CisjZWxzZQorICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+UmVwb3J0RXJyb3IoRlBERkVSUl9PVVRfT0ZfTUVNT1JZLCBOVUxMKTsKKyNlbmRpZgorICB9CisKKyAgSEdESU9CSiBoT2xkQml0bWFwID0gU2VsZWN0T2JqZWN0KGhNZW1EQywgcENvbnRleHQtPm1faEJpdG1hcCk7CisKKyNpZmRlZiBERUJVR19UUkFDRQorICBDUERGX01vZHVsZU1ncjo6R2V0KCktPlJlcG9ydEVycm9yKDk5OSwgIlJlYWR5IGZvciBzY3JlZW4gcmVuZGVyaW5nIik7CisjZW5kaWYKKworICBCaXRCbHQoZGMsIHJlY3QubGVmdCwgcmVjdC50b3AsIHdpZHRoLCBoZWlnaHQsIGhNZW1EQywgMCwgMCwgU1JDQ09QWSk7CisgIFNlbGVjdE9iamVjdChoTWVtREMsIGhPbGRCaXRtYXApOworICBEZWxldGVEQyhoTWVtREMpOworCisjaWZkZWYgREVCVUdfVFJBQ0UKKyAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5SZXBvcnRFcnJvcig5OTksICJGaW5pc2hlZCBzY3JlZW4gcmVuZGVyaW5nIik7CisjZW5kaWYKKworI2VuZGlmCisgIGlmIChiQmFja2dyb3VuZEFscGhhTmVlZGVkIHx8IGJIYXNJbWFnZU1hc2spCisgICAgZGVsZXRlIHBCaXRtYXA7CisKKyAgZGVsZXRlIHBDb250ZXh0OworICBwUGFnZS0+UmVtb3ZlUHJpdmF0ZURhdGEoKHZvaWQqKTEpOworfQorI2VuZGlmCisKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9SZW5kZXJQYWdlQml0bWFwKEZQREZfQklUTUFQIGJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykgeworICBpZiAoIWJpdG1hcCkKKyAgICByZXR1cm47CisgIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlKTsKKyAgaWYgKCFwUGFnZSkKKyAgICByZXR1cm47CisgIENSZW5kZXJDb250ZXh0KiBwQ29udGV4dCA9IG5ldyBDUmVuZGVyQ29udGV4dDsKKyAgcFBhZ2UtPlNldFByaXZhdGVEYXRhKCh2b2lkKikxLCBwQ29udGV4dCwgRHJvcENvbnRleHQpOworI2lmZGVmIF9TS0lBX1NVUFBPUlRfCisgIHBDb250ZXh0LT5tX3BEZXZpY2UgPSBuZXcgQ0ZYX1NraWFEZXZpY2U7CisKKyAgaWYgKGZsYWdzICYgRlBERl9SRVZFUlNFX0JZVEVfT1JERVIpCisgICAgKChDRlhfU2tpYURldmljZSopcENvbnRleHQtPm1fcERldmljZSkKKyAgICAgICAgLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwLCAwLCBUUlVFKTsKKyAgZWxzZQorICAgICgoQ0ZYX1NraWFEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwKTsKKyNlbHNlCisgIHBDb250ZXh0LT5tX3BEZXZpY2UgPSBuZXcgQ0ZYX0Z4Z2VEZXZpY2U7CisKKyAgaWYgKGZsYWdzICYgRlBERl9SRVZFUlNFX0JZVEVfT1JERVIpCisgICAgKChDRlhfRnhnZURldmljZSopcENvbnRleHQtPm1fcERldmljZSkKKyAgICAgICAgLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwLCAwLCBUUlVFKTsKKyAgZWxzZQorICAgICgoQ0ZYX0Z4Z2VEZXZpY2UqKXBDb250ZXh0LT5tX3BEZXZpY2UpLT5BdHRhY2goKENGWF9ESUJpdG1hcCopYml0bWFwKTsKKyNlbmRpZgorCisgIEZQREZfUmVuZGVyUGFnZV9SZXRhaWwocENvbnRleHQsIHBhZ2UsIHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZSwgZmxhZ3MsIFRSVUUsIE5VTEwpOworCisgIGRlbGV0ZSBwQ29udGV4dDsKKyAgcFBhZ2UtPlJlbW92ZVByaXZhdGVEYXRhKCh2b2lkKikxKTsKIH0KIAotRExMRVhQT1JUIHZvaWQqIFNURENBTEwgRlBERkJpdG1hcF9HZXRCdWZmZXIoRlBERl9CSVRNQVAgYml0bWFwKQotewotCWlmIChiaXRtYXAgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JcmV0dXJuICgoQ0ZYX0RJQml0bWFwKiliaXRtYXApLT5HZXRCdWZmZXIoKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9DbG9zZVBhZ2UoRlBERl9QQUdFIHBhZ2UpIHsKKyAgaWYgKCFwYWdlKQorICAgIHJldHVybjsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBDUERGWEZBX1BhZ2UqIHBQYWdlID0gKENQREZYRkFfUGFnZSopcGFnZTsKKyAgcFBhZ2UtPlJlbGVhc2UoKTsKKyNlbHNlICAgLy8gUERGX0VOQUJMRV9YRkEKKyAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0KKyAgICAgIChDUERGU0RLX1BhZ2VWaWV3KikoKChDUERGX1BhZ2UqKXBhZ2UpKS0+R2V0UHJpdmF0ZURhdGEoKHZvaWQqKXBhZ2UpOworICBpZiAocFBhZ2VWaWV3ICYmIHBQYWdlVmlldy0+SXNMb2NrZWQoKSkgeworICAgIHBQYWdlVmlldy0+VGFrZU92ZXJQYWdlKCk7CisgICAgcmV0dXJuOworICB9CisgIGRlbGV0ZSAoQ1BERl9QYWdlKilwYWdlOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogfQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERkJpdG1hcF9HZXRXaWR0aChGUERGX0JJVE1BUCBiaXRtYXApCi17Ci0JaWYgKGJpdG1hcCA9PSBOVUxMKSByZXR1cm4gMDsKLQlyZXR1cm4gKChDRlhfRElCaXRtYXAqKWJpdG1hcCktPkdldFdpZHRoKCk7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfQ2xvc2VEb2N1bWVudChGUERGX0RPQ1VNRU5UIGRvY3VtZW50KSB7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgZGVsZXRlIFVuZGVybHlpbmdGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KTsKKyNlbHNlICAgLy8gUERGX0VOQUJMRV9YRkEKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZG9jdW1lbnQpOworICBpZiAoIXBEb2MpCisgICAgcmV0dXJuOworICBDUERGX1BhcnNlciogcFBhcnNlciA9IHBEb2MtPkdldFBhcnNlcigpOworICBpZiAoIXBQYXJzZXIpIHsKKyAgICBkZWxldGUgcERvYzsKKyAgICByZXR1cm47CisgIH0KKyAgZGVsZXRlIHBQYXJzZXI7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiB9CiAKLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGQml0bWFwX0dldEhlaWdodChGUERGX0JJVE1BUCBiaXRtYXApCi17Ci0JaWYgKGJpdG1hcCA9PSBOVUxMKSByZXR1cm4gMDsKLQlyZXR1cm4gKChDRlhfRElCaXRtYXAqKWJpdG1hcCktPkdldEhlaWdodCgpOworRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGX0dldExhc3RFcnJvcigpIHsKKyAgcmV0dXJuIEdldExhc3RFcnJvcigpOwogfQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERkJpdG1hcF9HZXRTdHJpZGUoRlBERl9CSVRNQVAgYml0bWFwKQotewotCWlmIChiaXRtYXAgPT0gTlVMTCkgcmV0dXJuIDA7Ci0JcmV0dXJuICgoQ0ZYX0RJQml0bWFwKiliaXRtYXApLT5HZXRQaXRjaCgpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0RldmljZVRvUGFnZShGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGV2aWNlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXZpY2VfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwYWdlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcGFnZV95KSB7CisgIGlmICghcGFnZSB8fCAhcGFnZV94IHx8ICFwYWdlX3kpCisgICAgcmV0dXJuOworICBVbmRlcmx5aW5nUGFnZVR5cGUqIHBQYWdlID0gVW5kZXJseWluZ0Zyb21GUERGUGFnZShwYWdlKTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBwUGFnZS0+RGV2aWNlVG9QYWdlKHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LCByb3RhdGUsIGRldmljZV94LAorICAgICAgICAgICAgICAgICAgICAgIGRldmljZV95LCBwYWdlX3gsIHBhZ2VfeSk7CisjZWxzZSAgIC8vIFBERl9FTkFCTEVfWEZBCisgIENGWF9NYXRyaXggcGFnZTJkZXZpY2U7CisgIHBQYWdlLT5HZXREaXNwbGF5TWF0cml4KHBhZ2UyZGV2aWNlLCBzdGFydF94LCBzdGFydF95LCBzaXplX3gsIHNpemVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlKTsKKyAgQ0ZYX01hdHJpeCBkZXZpY2UycGFnZTsKKyAgZGV2aWNlMnBhZ2UuU2V0UmV2ZXJzZShwYWdlMmRldmljZSk7CisgIEZYX0ZMT0FUIHBhZ2VfeF9mLCBwYWdlX3lfZjsKKyAgZGV2aWNlMnBhZ2UuVHJhbnNmb3JtKChGWF9GTE9BVCkoZGV2aWNlX3gpLCAoRlhfRkxPQVQpKGRldmljZV95KSwgcGFnZV94X2YsCisgICAgICAgICAgICAgICAgICAgICAgICBwYWdlX3lfZik7CisgICpwYWdlX3ggPSAocGFnZV94X2YpOworICAqcGFnZV95ID0gKHBhZ2VfeV9mKTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGQml0bWFwX0Rlc3Ryb3koRlBERl9CSVRNQVAgYml0bWFwKQotewotCWlmIChiaXRtYXAgPT0gTlVMTCkgcmV0dXJuOwotCWRlbGV0ZSAoQ0ZYX0RJQml0bWFwKiliaXRtYXA7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfUGFnZVRvRGV2aWNlKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZGV2aWNlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZGV2aWNlX3kpIHsKKyAgaWYgKCFkZXZpY2VfeCB8fCAhZGV2aWNlX3kpCisgICAgcmV0dXJuOworICBVbmRlcmx5aW5nUGFnZVR5cGUqIHBQYWdlID0gVW5kZXJseWluZ0Zyb21GUERGUGFnZShwYWdlKTsKKyAgaWYgKCFwUGFnZSkKKyAgICByZXR1cm47CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgcFBhZ2UtPlBhZ2VUb0RldmljZShzdGFydF94LCBzdGFydF95LCBzaXplX3gsIHNpemVfeSwgcm90YXRlLCBwYWdlX3gsIHBhZ2VfeSwKKyAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfeCwgZGV2aWNlX3kpOworI2Vsc2UgICAvLyBQREZfRU5BQkxFX1hGQQorICBDRlhfTWF0cml4IHBhZ2UyZGV2aWNlOworICBwUGFnZS0+R2V0RGlzcGxheU1hdHJpeChwYWdlMmRldmljZSwgc3RhcnRfeCwgc3RhcnRfeSwgc2l6ZV94LCBzaXplX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZSk7CisgIEZYX0ZMT0FUIGRldmljZV94X2YsIGRldmljZV95X2Y7CisgIHBhZ2UyZGV2aWNlLlRyYW5zZm9ybSgoKEZYX0ZMT0FUKXBhZ2VfeCksICgoRlhfRkxPQVQpcGFnZV95KSwgZGV2aWNlX3hfZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV95X2YpOworICAqZGV2aWNlX3ggPSBGWFNZU19yb3VuZChkZXZpY2VfeF9mKTsKKyAgKmRldmljZV95ID0gRlhTWVNfcm91bmQoZGV2aWNlX3lfZik7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiB9CiAKLXZvaWQgRlBERl9SZW5kZXJQYWdlX1JldGFpbChDUmVuZGVyQ29udGV4dCogcENvbnRleHQsIEZQREZfUEFHRSBwYWdlLCBpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksIGludCBzaXplX3gsIGludCBzaXplX3ksCi0JCQkJCQlpbnQgcm90YXRlLCBpbnQgZmxhZ3MsRlhfQk9PTCBiTmVlZFRvUmVzdG9yZSwgSUZTREtfUEFVU0VfQWRhcHRlciAqIHBhdXNlICkKLXsKLQlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcGFnZTsKLQlpZiAocFBhZ2UgPT0gTlVMTCkgcmV0dXJuOwotCi0JaWYgKCFwQ29udGV4dC0+bV9wT3B0aW9ucykKLQkJcENvbnRleHQtPm1fcE9wdGlvbnMgPSBuZXcgQ1BERl9SZW5kZXJPcHRpb25zOwotLy8JQ1BERl9SZW5kZXJPcHRpb25zIG9wdGlvbnM7Ci0JaWYgKGZsYWdzICYgRlBERl9MQ0RfVEVYVCkKLQkJcENvbnRleHQtPm1fcE9wdGlvbnMtPm1fRmxhZ3MgfD0gUkVOREVSX0NMRUFSVFlQRTsKLQllbHNlCi0JCXBDb250ZXh0LT5tX3BPcHRpb25zLT5tX0ZsYWdzICY9IH5SRU5ERVJfQ0xFQVJUWVBFOwotCWlmIChmbGFncyAmIEZQREZfTk9fTkFUSVZFVEVYVCkKLQkJcENvbnRleHQtPm1fcE9wdGlvbnMtPm1fRmxhZ3MgfD0gUkVOREVSX05PX05BVElWRVRFWFQ7Ci0JaWYgKGZsYWdzICYgRlBERl9SRU5ERVJfTElNSVRFRElNQUdFQ0FDSEUpCi0JCXBDb250ZXh0LT5tX3BPcHRpb25zLT5tX0ZsYWdzIHw9IFJFTkRFUl9MSU1JVEVESU1BR0VDQUNIRTsKLQlpZiAoZmxhZ3MgJiBGUERGX1JFTkRFUl9GT1JDRUhBTEZUT05FKQotCQlwQ29udGV4dC0+bV9wT3B0aW9ucy0+bV9GbGFncyB8PSBSRU5ERVJfRk9SQ0VfSEFMRlRPTkU7Ci0JaWYgKGZsYWdzICYgRlBERl9SRU5ERVJfTk9fU01PT1RIVEVYVCkKLQkJcENvbnRleHQtPm1fcE9wdGlvbnMtPm1fRmxhZ3MgfD0gUkVOREVSX05PVEVYVFNNT09USDsKLQlpZiAoZmxhZ3MgJiBGUERGX1JFTkRFUl9OT19TTU9PVEhJTUFHRSkKLQkJcENvbnRleHQtPm1fcE9wdGlvbnMtPm1fRmxhZ3MgfD0gUkVOREVSX05PSU1BR0VTTU9PVEg7Ci0JaWYgKGZsYWdzICYgRlBERl9SRU5ERVJfTk9fU01PT1RIUEFUSCkKLQkJcENvbnRleHQtPm1fcE9wdGlvbnMtPm1fRmxhZ3MgfD0gUkVOREVSX05PUEFUSFNNT09USDsKLQkvL0dyYXlzY2FsZSBvdXRwdXQKLQlpZiAoZmxhZ3MgJiBGUERGX0dSQVlTQ0FMRSkKLQl7Ci0JCXBDb250ZXh0LT5tX3BPcHRpb25zLT5tX0NvbG9yTW9kZSA9IFJFTkRFUl9DT0xPUl9HUkFZOwotCQlwQ29udGV4dC0+bV9wT3B0aW9ucy0+bV9Gb3JlQ29sb3IgPSAwOwotCQlwQ29udGV4dC0+bV9wT3B0aW9ucy0+bV9CYWNrQ29sb3IgPSAweGZmZmZmZjsKLQl9Ci0JY29uc3QgQ1BERl9PQ0NvbnRleHQ6OlVzYWdlVHlwZSB1c2FnZSA9IChmbGFncyAmIEZQREZfUFJJTlRJTkcpID8gQ1BERl9PQ0NvbnRleHQ6OlByaW50IDogQ1BERl9PQ0NvbnRleHQ6OlZpZXc7Ci0KLQlwQ29udGV4dC0+bV9wT3B0aW9ucy0+bV9BZGRGbGFncyA9IGZsYWdzID4+IDg7Ci0KLQlwQ29udGV4dC0+bV9wT3B0aW9ucy0+bV9wT0NDb250ZXh0ID0gbmV3IENQREZfT0NDb250ZXh0KHBQYWdlLT5tX3BEb2N1bWVudCwgdXNhZ2UpOwotCi0KLQlDRlhfQWZmaW5lTWF0cml4IG1hdHJpeDsKLQlwUGFnZS0+R2V0RGlzcGxheU1hdHJpeChtYXRyaXgsIHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LCByb3RhdGUpOyAKLQotCUZYX1JFQ1QgY2xpcDsKLQljbGlwLmxlZnQgPSBzdGFydF94OwotCWNsaXAucmlnaHQgPSBzdGFydF94ICsgc2l6ZV94OwotCWNsaXAudG9wID0gc3RhcnRfeTsKLQljbGlwLmJvdHRvbSA9IHN0YXJ0X3kgKyBzaXplX3k7Ci0JcENvbnRleHQtPm1fcERldmljZS0+U2F2ZVN0YXRlKCk7Ci0JcENvbnRleHQtPm1fcERldmljZS0+U2V0Q2xpcF9SZWN0KCZjbGlwKTsKLQotCXBDb250ZXh0LT5tX3BDb250ZXh0ID0gbmV3IENQREZfUmVuZGVyQ29udGV4dDsKLQlwQ29udGV4dC0+bV9wQ29udGV4dC0+Q3JlYXRlKHBQYWdlKTsKLQlwQ29udGV4dC0+bV9wQ29udGV4dC0+QXBwZW5kT2JqZWN0TGlzdChwUGFnZSwgJm1hdHJpeCk7Ci0KLQlpZiAoZmxhZ3MgJiBGUERGX0FOTk9UKSB7Ci0JCXBDb250ZXh0LT5tX3BBbm5vdHMgPSBuZXcgQ1BERl9Bbm5vdExpc3QocFBhZ2UpOwotCQlGWF9CT09MIGJQcmludGluZyA9IHBDb250ZXh0LT5tX3BEZXZpY2UtPkdldERldmljZUNsYXNzKCkgIT0gRlhEQ19ESVNQTEFZOwotCQlwQ29udGV4dC0+bV9wQW5ub3RzLT5EaXNwbGF5QW5ub3RzKHBQYWdlLCBwQ29udGV4dC0+bV9wQ29udGV4dCwgYlByaW50aW5nLCAmbWF0cml4LCBUUlVFLCBOVUxMKTsKLQl9Ci0KLQlwQ29udGV4dC0+bV9wUmVuZGVyZXIgPSBuZXcgQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyOwotCXBDb250ZXh0LT5tX3BSZW5kZXJlci0+U3RhcnQocENvbnRleHQtPm1fcENvbnRleHQsIHBDb250ZXh0LT5tX3BEZXZpY2UsIHBDb250ZXh0LT5tX3BPcHRpb25zLCBwYXVzZSk7Ci0JaWYgKGJOZWVkVG9SZXN0b3JlKQotCXsKLQkgIHBDb250ZXh0LT5tX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwotCX0KK0RMTEVYUE9SVCBGUERGX0JJVE1BUCBTVERDQUxMIEZQREZCaXRtYXBfQ3JlYXRlKGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEpIHsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWF9ESUJpdG1hcD4gcEJpdG1hcChuZXcgQ0ZYX0RJQml0bWFwKTsKKyAgaWYgKCFwQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgYWxwaGEgPyBGWERJQl9BcmdiIDogRlhESUJfUmdiMzIpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIHBCaXRtYXAucmVsZWFzZSgpOwogfQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERl9HZXRQYWdlU2l6ZUJ5SW5kZXgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgaW50IHBhZ2VfaW5kZXgsIGRvdWJsZSogd2lkdGgsIGRvdWJsZSogaGVpZ2h0KQotewotCUNQREZfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERl9Eb2N1bWVudCopZG9jdW1lbnQ7Ci0JaWYocERvYyA9PSBOVUxMKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcERvYy0+R2V0UGFnZShwYWdlX2luZGV4KTsKLQlpZiAocERpY3QgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCi0JQ1BERl9QYWdlIHBhZ2U7Ci0JcGFnZS5Mb2FkKHBEb2MsIHBEaWN0KTsKLQkqd2lkdGggPSBwYWdlLkdldFBhZ2VXaWR0aCgpOwotCSpoZWlnaHQgPSBwYWdlLkdldFBhZ2VIZWlnaHQoKTsKLQotCXJldHVybiBUUlVFOworRExMRVhQT1JUIEZQREZfQklUTUFQIFNURENBTEwgRlBERkJpdG1hcF9DcmVhdGVFeChpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGZpcnN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpIHsKKyAgRlhESUJfRm9ybWF0IGZ4X2Zvcm1hdDsKKyAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICBjYXNlIEZQREZCaXRtYXBfR3JheToKKyAgICAgIGZ4X2Zvcm1hdCA9IEZYRElCXzhicHBSZ2I7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZQREZCaXRtYXBfQkdSOgorICAgICAgZnhfZm9ybWF0ID0gRlhESUJfUmdiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUERGQml0bWFwX0JHUng6CisgICAgICBmeF9mb3JtYXQgPSBGWERJQl9SZ2IzMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlBERkJpdG1hcF9CR1JBOgorICAgICAgZnhfZm9ybWF0ID0gRlhESUJfQXJnYjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOworICBwQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgZnhfZm9ybWF0LCAodWludDhfdCopZmlyc3Rfc2Nhbiwgc3RyaWRlKTsKKyAgcmV0dXJuIHBCaXRtYXA7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX1ZJRVdFUlJFRl9HZXRQcmludFNjYWxpbmcoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkKLXsKLQlDUERGX0RvY3VtZW50KiBwRG9jID0gKENQREZfRG9jdW1lbnQqKWRvY3VtZW50OwotCWlmICghcERvYykgcmV0dXJuIFRSVUU7Ci0JQ1BERl9WaWV3ZXJQcmVmZXJlbmNlcyB2aWV3UmVmKHBEb2MpOwotCXJldHVybiB2aWV3UmVmLlByaW50U2NhbGluZygpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGQml0bWFwX0ZpbGxSZWN0KEZQREZfQklUTUFQIGJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQgY29sb3IpIHsKKyAgaWYgKCFiaXRtYXApCisgICAgcmV0dXJuOworI2lmZGVmIF9TS0lBX1NVUFBPUlRfCisgIENGWF9Ta2lhRGV2aWNlIGRldmljZTsKKyNlbHNlCisgIENGWF9GeGdlRGV2aWNlIGRldmljZTsKKyNlbmRpZgorICBkZXZpY2UuQXR0YWNoKChDRlhfRElCaXRtYXAqKWJpdG1hcCk7CisgIGlmICghKChDRlhfRElCaXRtYXAqKWJpdG1hcCktPkhhc0FscGhhKCkpCisgICAgY29sb3IgfD0gMHhGRjAwMDAwMDsKKyAgRlhfUkVDVCByZWN0KGxlZnQsIHRvcCwgbGVmdCArIHdpZHRoLCB0b3AgKyBoZWlnaHQpOworICBkZXZpY2UuRmlsbFJlY3QoJnJlY3QsIGNvbG9yKTsKIH0KIAotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfVklFV0VSUkVGX0dldE51bUNvcGllcyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50KQotewotICAgIENQREZfRG9jdW1lbnQqIHBEb2MgPSAoQ1BERl9Eb2N1bWVudCopZG9jdW1lbnQ7Ci0gICAgaWYgKCFwRG9jKSByZXR1cm4gMTsKLSAgICBDUERGX1ZpZXdlclByZWZlcmVuY2VzIHZpZXdSZWYocERvYyk7Ci0gICAgcmV0dXJuIHZpZXdSZWYuTnVtQ29waWVzKCk7CitETExFWFBPUlQgdm9pZCogU1REQ0FMTCBGUERGQml0bWFwX0dldEJ1ZmZlcihGUERGX0JJVE1BUCBiaXRtYXApIHsKKyAgcmV0dXJuIGJpdG1hcCA/ICgoQ0ZYX0RJQml0bWFwKiliaXRtYXApLT5HZXRCdWZmZXIoKSA6IG51bGxwdHI7CiB9CiAKLURMTEVYUE9SVCBGUERGX1BBR0VSQU5HRSBTVERDQUxMIEZQREZfVklFV0VSUkVGX0dldFByaW50UGFnZVJhbmdlKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpCi17Ci0gICAgQ1BERl9Eb2N1bWVudCogcERvYyA9IChDUERGX0RvY3VtZW50Kilkb2N1bWVudDsKLSAgICBpZiAoIXBEb2MpIHJldHVybiBOVUxMOwotICAgIENQREZfVmlld2VyUHJlZmVyZW5jZXMgdmlld1JlZihwRG9jKTsKLSAgICByZXR1cm4gdmlld1JlZi5QcmludFBhZ2VSYW5nZSgpOworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZCaXRtYXBfR2V0V2lkdGgoRlBERl9CSVRNQVAgYml0bWFwKSB7CisgIHJldHVybiBiaXRtYXAgPyAoKENGWF9ESUJpdG1hcCopYml0bWFwKS0+R2V0V2lkdGgoKSA6IDA7CiB9CiAKLURMTEVYUE9SVCBGUERGX0RVUExFWFRZUEUgU1REQ0FMTCBGUERGX1ZJRVdFUlJFRl9HZXREdXBsZXgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkKLXsKLSAgICBDUERGX0RvY3VtZW50KiBwRG9jID0gKENQREZfRG9jdW1lbnQqKWRvY3VtZW50OwotICAgIGlmICghcERvYykgcmV0dXJuIER1cGxleFVuZGVmaW5lZDsKLSAgICBDUERGX1ZpZXdlclByZWZlcmVuY2VzIHZpZXdSZWYocERvYyk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgZHVwbGV4ID0gdmlld1JlZi5EdXBsZXgoKTsKLSAgICBpZiAoRlhfQlNUUkMoIlNpbXBsZXgiKSA9PSBkdXBsZXgpCi0gICAgICAgIHJldHVybiBTaW1wbGV4OwotICAgIGlmIChGWF9CU1RSQygiRHVwbGV4RmxpcFNob3J0RWRnZSIpID09IGR1cGxleCkKLSAgICAgICAgcmV0dXJuIER1cGxleEZsaXBTaG9ydEVkZ2U7Ci0gICAgaWYgKEZYX0JTVFJDKCJEdXBsZXhGbGlwTG9uZ0VkZ2UiKSA9PSBkdXBsZXgpCi0gICAgICAgIHJldHVybiBEdXBsZXhGbGlwTG9uZ0VkZ2U7CitETExFWFBPUlQgaW50IFNURENBTEwgRlBERkJpdG1hcF9HZXRIZWlnaHQoRlBERl9CSVRNQVAgYml0bWFwKSB7CisgIHJldHVybiBiaXRtYXAgPyAoKENGWF9ESUJpdG1hcCopYml0bWFwKS0+R2V0SGVpZ2h0KCkgOiAwOworfQorCitETExFWFBPUlQgaW50IFNURENBTEwgRlBERkJpdG1hcF9HZXRTdHJpZGUoRlBERl9CSVRNQVAgYml0bWFwKSB7CisgIHJldHVybiBiaXRtYXAgPyAoKENGWF9ESUJpdG1hcCopYml0bWFwKS0+R2V0UGl0Y2goKSA6IDA7Cit9CisKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERkJpdG1hcF9EZXN0cm95KEZQREZfQklUTUFQIGJpdG1hcCkgeworICBkZWxldGUgKENGWF9ESUJpdG1hcCopYml0bWFwOworfQorCit2b2lkIEZQREZfUmVuZGVyUGFnZV9SZXRhaWwoQ1JlbmRlckNvbnRleHQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOZWVkVG9SZXN0b3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGU0RLX1BBVVNFX0FkYXB0ZXIqIHBhdXNlKSB7CisgIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlKTsKKyAgaWYgKCFwUGFnZSkKKyAgICByZXR1cm47CisKKyAgaWYgKCFwQ29udGV4dC0+bV9wT3B0aW9ucykKKyAgICBwQ29udGV4dC0+bV9wT3B0aW9ucyA9IG5ldyBDUERGX1JlbmRlck9wdGlvbnM7CisKKyAgaWYgKGZsYWdzICYgRlBERl9MQ0RfVEVYVCkKKyAgICBwQ29udGV4dC0+bV9wT3B0aW9ucy0+bV9GbGFncyB8PSBSRU5ERVJfQ0xFQVJUWVBFOworICBlbHNlCisgICAgcENvbnRleHQtPm1fcE9wdGlvbnMtPm1fRmxhZ3MgJj0gflJFTkRFUl9DTEVBUlRZUEU7CisgIGlmIChmbGFncyAmIEZQREZfTk9fTkFUSVZFVEVYVCkKKyAgICBwQ29udGV4dC0+bV9wT3B0aW9ucy0+bV9GbGFncyB8PSBSRU5ERVJfTk9fTkFUSVZFVEVYVDsKKyAgaWYgKGZsYWdzICYgRlBERl9SRU5ERVJfTElNSVRFRElNQUdFQ0FDSEUpCisgICAgcENvbnRleHQtPm1fcE9wdGlvbnMtPm1fRmxhZ3MgfD0gUkVOREVSX0xJTUlURURJTUFHRUNBQ0hFOworICBpZiAoZmxhZ3MgJiBGUERGX1JFTkRFUl9GT1JDRUhBTEZUT05FKQorICAgIHBDb250ZXh0LT5tX3BPcHRpb25zLT5tX0ZsYWdzIHw9IFJFTkRFUl9GT1JDRV9IQUxGVE9ORTsKKyNpZm5kZWYgUERGX0VOQUJMRV9YRkEKKyAgaWYgKGZsYWdzICYgRlBERl9SRU5ERVJfTk9fU01PT1RIVEVYVCkKKyAgICBwQ29udGV4dC0+bV9wT3B0aW9ucy0+bV9GbGFncyB8PSBSRU5ERVJfTk9URVhUU01PT1RIOworICBpZiAoZmxhZ3MgJiBGUERGX1JFTkRFUl9OT19TTU9PVEhJTUFHRSkKKyAgICBwQ29udGV4dC0+bV9wT3B0aW9ucy0+bV9GbGFncyB8PSBSRU5ERVJfTk9JTUFHRVNNT09USDsKKyAgaWYgKGZsYWdzICYgRlBERl9SRU5ERVJfTk9fU01PT1RIUEFUSCkKKyAgICBwQ29udGV4dC0+bV9wT3B0aW9ucy0+bV9GbGFncyB8PSBSRU5ERVJfTk9QQVRIU01PT1RIOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICAvLyBHcmF5c2NhbGUgb3V0cHV0CisgIGlmIChmbGFncyAmIEZQREZfR1JBWVNDQUxFKSB7CisgICAgcENvbnRleHQtPm1fcE9wdGlvbnMtPm1fQ29sb3JNb2RlID0gUkVOREVSX0NPTE9SX0dSQVk7CisgICAgcENvbnRleHQtPm1fcE9wdGlvbnMtPm1fRm9yZUNvbG9yID0gMDsKKyAgICBwQ29udGV4dC0+bV9wT3B0aW9ucy0+bV9CYWNrQ29sb3IgPSAweGZmZmZmZjsKKyAgfQorICBjb25zdCBDUERGX09DQ29udGV4dDo6VXNhZ2VUeXBlIHVzYWdlID0KKyAgICAgIChmbGFncyAmIEZQREZfUFJJTlRJTkcpID8gQ1BERl9PQ0NvbnRleHQ6OlByaW50IDogQ1BERl9PQ0NvbnRleHQ6OlZpZXc7CisgIHBDb250ZXh0LT5tX3BPcHRpb25zLT5tX0FkZEZsYWdzID0gZmxhZ3MgPj4gODsKKyAgcENvbnRleHQtPm1fcE9wdGlvbnMtPm1fcE9DQ29udGV4dCA9CisgICAgICBuZXcgQ1BERl9PQ0NvbnRleHQocFBhZ2UtPm1fcERvY3VtZW50LCB1c2FnZSk7CisKKyAgQ0ZYX01hdHJpeCBtYXRyaXg7CisgIHBQYWdlLT5HZXREaXNwbGF5TWF0cml4KG1hdHJpeCwgc3RhcnRfeCwgc3RhcnRfeSwgc2l6ZV94LCBzaXplX3ksIHJvdGF0ZSk7CisKKyAgRlhfUkVDVCBjbGlwOworICBjbGlwLmxlZnQgPSBzdGFydF94OworICBjbGlwLnJpZ2h0ID0gc3RhcnRfeCArIHNpemVfeDsKKyAgY2xpcC50b3AgPSBzdGFydF95OworICBjbGlwLmJvdHRvbSA9IHN0YXJ0X3kgKyBzaXplX3k7CisgIHBDb250ZXh0LT5tX3BEZXZpY2UtPlNhdmVTdGF0ZSgpOworICBwQ29udGV4dC0+bV9wRGV2aWNlLT5TZXRDbGlwX1JlY3QoJmNsaXApOworCisgIHBDb250ZXh0LT5tX3BDb250ZXh0ID0gbmV3IENQREZfUmVuZGVyQ29udGV4dChwUGFnZSk7CisgIHBDb250ZXh0LT5tX3BDb250ZXh0LT5BcHBlbmRPYmplY3RMaXN0KHBQYWdlLCAmbWF0cml4KTsKKworICBpZiAoZmxhZ3MgJiBGUERGX0FOTk9UKSB7CisgICAgcENvbnRleHQtPm1fcEFubm90cyA9IG5ldyBDUERGX0Fubm90TGlzdChwUGFnZSk7CisgICAgRlhfQk9PTCBiUHJpbnRpbmcgPSBwQ29udGV4dC0+bV9wRGV2aWNlLT5HZXREZXZpY2VDbGFzcygpICE9IEZYRENfRElTUExBWTsKKyAgICBwQ29udGV4dC0+bV9wQW5ub3RzLT5EaXNwbGF5QW5ub3RzKHBQYWdlLCBwQ29udGV4dC0+bV9wQ29udGV4dCwgYlByaW50aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hdHJpeCwgVFJVRSwgTlVMTCk7CisgIH0KKworICBwQ29udGV4dC0+bV9wUmVuZGVyZXIgPSBuZXcgQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyKAorICAgICAgcENvbnRleHQtPm1fcENvbnRleHQsIHBDb250ZXh0LT5tX3BEZXZpY2UsIHBDb250ZXh0LT5tX3BPcHRpb25zKTsKKyAgcENvbnRleHQtPm1fcFJlbmRlcmVyLT5TdGFydChwYXVzZSk7CisgIGlmIChiTmVlZFRvUmVzdG9yZSkKKyAgICBwQ29udGV4dC0+bV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKK30KKworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfR2V0UGFnZVNpemVCeUluZGV4KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGhlaWdodCkgeworICBVbmRlcmx5aW5nRG9jdW1lbnRUeXBlKiBwRG9jID0gVW5kZXJseWluZ0Zyb21GUERGRG9jdW1lbnQoZG9jdW1lbnQpOworICBpZiAoIXBEb2MpCisgICAgcmV0dXJuIEZBTFNFOworCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgaW50IGNvdW50ID0gcERvYy0+R2V0UGFnZUNvdW50KCk7CisgIGlmIChwYWdlX2luZGV4IDwgMCB8fCBwYWdlX2luZGV4ID49IGNvdW50KQorICAgIHJldHVybiBGQUxTRTsKKyAgQ1BERlhGQV9QYWdlKiBwUGFnZSA9IHBEb2MtPkdldFBhZ2UocGFnZV9pbmRleCk7CisgIGlmICghcFBhZ2UpCisgICAgcmV0dXJuIEZBTFNFOworICAqd2lkdGggPSBwUGFnZS0+R2V0UGFnZVdpZHRoKCk7CisgICpoZWlnaHQgPSBwUGFnZS0+R2V0UGFnZUhlaWdodCgpOworI2Vsc2UgICAvLyBQREZfRU5BQkxFX1hGQQorICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcERvYy0+R2V0UGFnZShwYWdlX2luZGV4KTsKKyAgaWYgKCFwRGljdCkKKyAgICByZXR1cm4gRkFMU0U7CisgIENQREZfUGFnZSBwYWdlOworICBwYWdlLkxvYWQocERvYywgcERpY3QpOworICAqd2lkdGggPSBwYWdlLkdldFBhZ2VXaWR0aCgpOworICAqaGVpZ2h0ID0gcGFnZS5HZXRQYWdlSGVpZ2h0KCk7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTAorRlBERl9WSUVXRVJSRUZfR2V0UHJpbnRTY2FsaW5nKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpIHsKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZG9jdW1lbnQpOworICBpZiAoIXBEb2MpCisgICAgcmV0dXJuIFRSVUU7CisgIENQREZfVmlld2VyUHJlZmVyZW5jZXMgdmlld1JlZihwRG9jKTsKKyAgcmV0dXJuIHZpZXdSZWYuUHJpbnRTY2FsaW5nKCk7Cit9CisKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGX1ZJRVdFUlJFRl9HZXROdW1Db3BpZXMoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkgeworICBDUERGX0RvY3VtZW50KiBwRG9jID0gQ1BERkRvY3VtZW50RnJvbUZQREZEb2N1bWVudChkb2N1bWVudCk7CisgIGlmICghcERvYykKKyAgICByZXR1cm4gMTsKKyAgQ1BERl9WaWV3ZXJQcmVmZXJlbmNlcyB2aWV3UmVmKHBEb2MpOworICByZXR1cm4gdmlld1JlZi5OdW1Db3BpZXMoKTsKK30KKworRExMRVhQT1JUIEZQREZfUEFHRVJBTkdFIFNURENBTEwKK0ZQREZfVklFV0VSUkVGX0dldFByaW50UGFnZVJhbmdlKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpIHsKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZG9jdW1lbnQpOworICBpZiAoIXBEb2MpCisgICAgcmV0dXJuIE5VTEw7CisgIENQREZfVmlld2VyUHJlZmVyZW5jZXMgdmlld1JlZihwRG9jKTsKKyAgcmV0dXJuIHZpZXdSZWYuUHJpbnRQYWdlUmFuZ2UoKTsKK30KKworRExMRVhQT1JUIEZQREZfRFVQTEVYVFlQRSBTVERDQUxMCitGUERGX1ZJRVdFUlJFRl9HZXREdXBsZXgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkgeworICBDUERGX0RvY3VtZW50KiBwRG9jID0gQ1BERkRvY3VtZW50RnJvbUZQREZEb2N1bWVudChkb2N1bWVudCk7CisgIGlmICghcERvYykKICAgICByZXR1cm4gRHVwbGV4VW5kZWZpbmVkOworICBDUERGX1ZpZXdlclByZWZlcmVuY2VzIHZpZXdSZWYocERvYyk7CisgIENGWF9CeXRlU3RyaW5nIGR1cGxleCA9IHZpZXdSZWYuRHVwbGV4KCk7CisgIGlmICgiU2ltcGxleCIgPT0gZHVwbGV4KQorICAgIHJldHVybiBTaW1wbGV4OworICBpZiAoIkR1cGxleEZsaXBTaG9ydEVkZ2UiID09IGR1cGxleCkKKyAgICByZXR1cm4gRHVwbGV4RmxpcFNob3J0RWRnZTsKKyAgaWYgKCJEdXBsZXhGbGlwTG9uZ0VkZ2UiID09IGR1cGxleCkKKyAgICByZXR1cm4gRHVwbGV4RmxpcExvbmdFZGdlOworICByZXR1cm4gRHVwbGV4VW5kZWZpbmVkOwogfQogCi1ETExFWFBPUlQgRlBERl9EV09SRCBTVERDQUxMIEZQREZfQ291bnROYW1lZERlc3RzKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpCi17Ci0gICAgaWYgKCFkb2N1bWVudCkgcmV0dXJuIDA7Ci0gICAgQ1BERl9Eb2N1bWVudCogcERvYyA9IChDUERGX0RvY3VtZW50Kilkb2N1bWVudDsKK0RMTEVYUE9SVCBGUERGX0RXT1JEIFNURENBTEwgRlBERl9Db3VudE5hbWVkRGVzdHMoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkgeworICBDUERGX0RvY3VtZW50KiBwRG9jID0gQ1BERkRvY3VtZW50RnJvbUZQREZEb2N1bWVudChkb2N1bWVudCk7CisgIGlmICghcERvYykKKyAgICByZXR1cm4gMDsKIAotICAgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBwRG9jLT5HZXRSb290KCk7Ci0gICAgaWYgKCFwUm9vdCkgcmV0dXJuIDA7CisgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBwRG9jLT5HZXRSb290KCk7CisgIGlmICghcFJvb3QpCisgICAgcmV0dXJuIDA7CiAKLSAgICBDUERGX05hbWVUcmVlIG5hbWVUcmVlKHBEb2MsIEZYX0JTVFJDKCJEZXN0cyIpKTsKLSAgICBpbnQgY291bnQgPSBuYW1lVHJlZS5HZXRDb3VudCgpOwotICAgIENQREZfRGljdGlvbmFyeSogcERlc3QgPSBwUm9vdC0+R2V0RGljdChGWF9CU1RSQygiRGVzdHMiKSk7Ci0gICAgaWYgKHBEZXN0KQotICAgICAgICBjb3VudCArPSBwRGVzdC0+R2V0Q291bnQoKTsKLSAgICByZXR1cm4gY291bnQ7CisgIENQREZfTmFtZVRyZWUgbmFtZVRyZWUocERvYywgIkRlc3RzIik7CisgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8RlBERl9EV09SRD4gY291bnQgPSBuYW1lVHJlZS5HZXRDb3VudCgpOworICBDUERGX0RpY3Rpb25hcnkqIHBEZXN0ID0gcFJvb3QtPkdldERpY3QoIkRlc3RzIik7CisgIGlmIChwRGVzdCkKKyAgICBjb3VudCArPSBwRGVzdC0+R2V0Q291bnQoKTsKKworICBpZiAoIWNvdW50LklzVmFsaWQoKSkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gY291bnQuVmFsdWVPckRpZSgpOwogfQogCi1ETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERl9HZXROYW1lZERlc3RCeU5hbWUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCxGUERGX0JZVEVTVFJJTkcgbmFtZSkKLXsKLQlpZiAoIWRvY3VtZW50KQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIW5hbWUgfHwgbmFtZVswXSA9PSAwKSAKLQkJcmV0dXJuIE5VTEw7CitETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERl9HZXROYW1lZERlc3RCeU5hbWUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgbmFtZSkgeworICBpZiAoIW5hbWUgfHwgbmFtZVswXSA9PSAwKQorICAgIHJldHVybiBudWxscHRyOwogCi0JQ1BERl9Eb2N1bWVudCogcERvYyA9IChDUERGX0RvY3VtZW50Kilkb2N1bWVudDsKLQlDUERGX05hbWVUcmVlIG5hbWVfdHJlZShwRG9jLCBGWF9CU1RSQygiRGVzdHMiKSk7Ci0JcmV0dXJuIG5hbWVfdHJlZS5Mb29rdXBOYW1lZERlc3QocERvYywgbmFtZSk7CisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBDUERGRG9jdW1lbnRGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KTsKKyAgaWYgKCFwRG9jKQorICAgIHJldHVybiBudWxscHRyOworCisgIENQREZfTmFtZVRyZWUgbmFtZV90cmVlKHBEb2MsICJEZXN0cyIpOworICByZXR1cm4gbmFtZV90cmVlLkxvb2t1cE5hbWVkRGVzdChwRG9jLCBuYW1lKTsKIH0KIAotRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZfR2V0TmFtZWREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIGludCBpbmRleCwgdm9pZCogYnVmZmVyLCBsb25nKiBidWZsZW4pCi17Ci0gICAgaWYgKCFidWZmZXIpCi0gICAgICAgICpidWZsZW4gPSAwOwotICAgIGlmICghZG9jdW1lbnQgfHwgaW5kZXggPCAwKSByZXR1cm4gTlVMTDsKLSAgICBDUERGX0RvY3VtZW50KiBwRG9jID0gKENQREZfRG9jdW1lbnQqKWRvY3VtZW50OworI2lmZGVmIFBERl9FTkFCTEVfWEZBCitGUERGX1JFU1VMVCBGUERGX0JTdHJfSW5pdChGUERGX0JTVFIqIHN0cikgeworICBpZiAoIXN0cikKKyAgICByZXR1cm4gLTE7CiAKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gcERvYy0+R2V0Um9vdCgpOwotICAgIGlmICghcFJvb3QpIHJldHVybiBOVUxMOworICBGWFNZU19tZW1zZXQoc3RyLCAwLCBzaXplb2YoRlBERl9CU1RSKSk7CisgIHJldHVybiAwOworfQogCi0gICAgQ1BERl9PYmplY3QqIHBEZXN0T2JqID0gTlVMTDsKLSAgICBDRlhfQnl0ZVN0cmluZyBic05hbWU7Ci0gICAgQ1BERl9OYW1lVHJlZSBuYW1lVHJlZShwRG9jLCBGWF9CU1RSQygiRGVzdHMiKSk7Ci0gICAgaW50IGNvdW50ID0gbmFtZVRyZWUuR2V0Q291bnQoKTsKLSAgICBpZiAoaW5kZXggPj0gY291bnQpIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGVzdCA9IHBSb290LT5HZXREaWN0KEZYX0JTVFJDKCJEZXN0cyIpKTsKLSAgICAgICAgaWYgKCFwRGVzdCkgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGlmIChpbmRleCA+PSBjb3VudCArIHBEZXN0LT5HZXRDb3VudCgpKSByZXR1cm4gTlVMTDsKLSAgICAgICAgaW5kZXggLT0gY291bnQ7Ci0gICAgICAgIEZYX1BPU0lUSU9OIHBvcyA9IHBEZXN0LT5HZXRTdGFydFBvcygpOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIHdoaWxlIChwb3MpIHsKLSAgICAgICAgICAgIHBEZXN0T2JqID0gcERlc3QtPkdldE5leHRFbGVtZW50KHBvcywgYnNOYW1lKTsKLSAgICAgICAgICAgIGlmICghcERlc3RPYmopIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKGkgPT0gaW5kZXgpIGJyZWFrOwotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcERlc3RPYmogPSBuYW1lVHJlZS5Mb29rdXBWYWx1ZShpbmRleCwgYnNOYW1lKTsKK0ZQREZfUkVTVUxUIEZQREZfQlN0cl9TZXQoRlBERl9CU1RSKiBzdHIsIEZQREZfTFBDU1RSIGJzdHIsIGludCBsZW5ndGgpIHsKKyAgaWYgKCFzdHIpCisgICAgcmV0dXJuIC0xOworICBpZiAoIWJzdHIgfHwgIWxlbmd0aCkKKyAgICByZXR1cm4gLTE7CisgIGlmIChsZW5ndGggPT0gLTEpCisgICAgbGVuZ3RoID0gRlhTWVNfc3RybGVuKGJzdHIpOworCisgIGlmIChsZW5ndGggPT0gMCkgeworICAgIGlmIChzdHItPnN0cikgeworICAgICAgRlhfRnJlZShzdHItPnN0cik7CisgICAgICBzdHItPnN0ciA9IE5VTEw7CiAgICAgfQotICAgIGlmICghcERlc3RPYmopIHJldHVybiBOVUxMOwotICAgIGlmIChwRGVzdE9iai0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSB7Ci0gICAgICAgIHBEZXN0T2JqID0gKChDUERGX0RpY3Rpb25hcnkqKXBEZXN0T2JqKS0+R2V0QXJyYXkoRlhfQlNUUkMoIkQiKSk7Ci0gICAgICAgIGlmICghcERlc3RPYmopIHJldHVybiBOVUxMOworICAgIHN0ci0+bGVuID0gMDsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChzdHItPnN0ciAmJiBzdHItPmxlbiA8IGxlbmd0aCkKKyAgICBzdHItPnN0ciA9IEZYX1JlYWxsb2MoY2hhciwgc3RyLT5zdHIsIGxlbmd0aCArIDEpOworICBlbHNlIGlmICghc3RyLT5zdHIpCisgICAgc3RyLT5zdHIgPSBGWF9BbGxvYyhjaGFyLCBsZW5ndGggKyAxKTsKKworICBzdHItPnN0cltsZW5ndGhdID0gMDsKKyAgaWYgKHN0ci0+c3RyID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworCisgIEZYU1lTX21lbWNweShzdHItPnN0ciwgYnN0ciwgbGVuZ3RoKTsKKyAgc3RyLT5sZW4gPSBsZW5ndGg7CisKKyAgcmV0dXJuIDA7Cit9CisKK0ZQREZfUkVTVUxUIEZQREZfQlN0cl9DbGVhcihGUERGX0JTVFIqIHN0cikgeworICBpZiAoIXN0cikKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKHN0ci0+c3RyKSB7CisgICAgRlhfRnJlZShzdHItPnN0cik7CisgICAgc3RyLT5zdHIgPSBOVUxMOworICB9CisgIHN0ci0+bGVuID0gMDsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKK0RMTEVYUE9SVCBGUERGX0RFU1QgU1REQ0FMTCBGUERGX0dldE5hbWVkRGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyogYnVmbGVuKSB7CisgIGlmICghYnVmZmVyKQorICAgICpidWZsZW4gPSAwOworCisgIGlmIChpbmRleCA8IDApCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZG9jdW1lbnQpOworICBpZiAoIXBEb2MpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IHBEb2MtPkdldFJvb3QoKTsKKyAgaWYgKCFwUm9vdCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBDUERGX09iamVjdCogcERlc3RPYmogPSBudWxscHRyOworICBDRlhfQnl0ZVN0cmluZyBic05hbWU7CisgIENQREZfTmFtZVRyZWUgbmFtZVRyZWUocERvYywgIkRlc3RzIik7CisgIGludCBjb3VudCA9IG5hbWVUcmVlLkdldENvdW50KCk7CisgIGlmIChpbmRleCA+PSBjb3VudCkgeworICAgIENQREZfRGljdGlvbmFyeSogcERlc3QgPSBwUm9vdC0+R2V0RGljdCgiRGVzdHMiKTsKKyAgICBpZiAoIXBEZXN0KQorICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPGludD4gY2hlY2tlZF9jb3VudCA9IGNvdW50OworICAgIGNoZWNrZWRfY291bnQgKz0gcERlc3QtPkdldENvdW50KCk7CisgICAgaWYgKCFjaGVja2VkX2NvdW50LklzVmFsaWQoKSB8fCBpbmRleCA+PSBjaGVja2VkX2NvdW50LlZhbHVlT3JEaWUoKSkKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgaW5kZXggLT0gY291bnQ7CisgICAgaW50IGkgPSAwOworICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiAqcERlc3QpIHsKKyAgICAgIGJzTmFtZSA9IGl0LmZpcnN0OworICAgICAgcERlc3RPYmogPSBpdC5zZWNvbmQ7CisgICAgICBpZiAoIXBEZXN0T2JqKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGlmIChpID09IGluZGV4KQorICAgICAgICBicmVhazsKKyAgICAgIGkrKzsKICAgICB9Ci0gICAgaWYgKHBEZXN0T2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSByZXR1cm4gTlVMTDsKLSAgICBDRlhfV2lkZVN0cmluZyB3c05hbWUgPSBQREZfRGVjb2RlVGV4dChic05hbWUpOwotICAgIENGWF9CeXRlU3RyaW5nIHV0ZjE2TmFtZSA9IHdzTmFtZS5VVEYxNkxFX0VuY29kZSgpOwotICAgIHVuc2lnbmVkIGludCBsZW4gPSB1dGYxNk5hbWUuR2V0TGVuZ3RoKCk7Ci0gICAgaWYgKCFidWZmZXIpIHsKLSAgICAgICAgKmJ1ZmxlbiA9IGxlbjsKLSAgICB9IGVsc2UgaWYgKCpidWZsZW4gPj0gbGVuKSB7Ci0gICAgICAgIG1lbWNweShidWZmZXIsIHV0ZjE2TmFtZS5jX3N0cigpLCBsZW4pOwotICAgICAgICAqYnVmbGVuID0gbGVuOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpidWZsZW4gPSAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIChGUERGX0RFU1QpcERlc3RPYmo7CisgIH0gZWxzZSB7CisgICAgcERlc3RPYmogPSBuYW1lVHJlZS5Mb29rdXBWYWx1ZShpbmRleCwgYnNOYW1lKTsKKyAgfQorICBpZiAoIXBEZXN0T2JqKQorICAgIHJldHVybiBudWxscHRyOworICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBEZXN0T2JqLT5Bc0RpY3Rpb25hcnkoKSkgeworICAgIHBEZXN0T2JqID0gcERpY3QtPkdldEFycmF5KCJEIik7CisgICAgaWYgKCFwRGVzdE9iaikKKyAgICAgIHJldHVybiBudWxscHRyOworICB9CisgIGlmICghcERlc3RPYmotPklzQXJyYXkoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBDRlhfV2lkZVN0cmluZyB3c05hbWUgPSBQREZfRGVjb2RlVGV4dChic05hbWUpOworICBDRlhfQnl0ZVN0cmluZyB1dGYxNk5hbWUgPSB3c05hbWUuVVRGMTZMRV9FbmNvZGUoKTsKKyAgdW5zaWduZWQgaW50IGxlbiA9IHV0ZjE2TmFtZS5HZXRMZW5ndGgoKTsKKyAgaWYgKCFidWZmZXIpIHsKKyAgICAqYnVmbGVuID0gbGVuOworICB9IGVsc2UgaWYgKCpidWZsZW4gPj0gbGVuKSB7CisgICAgbWVtY3B5KGJ1ZmZlciwgdXRmMTZOYW1lLmNfc3RyKCksIGxlbik7CisgICAgKmJ1ZmxlbiA9IGxlbjsKKyAgfSBlbHNlIHsKKyAgICAqYnVmbGVuID0gLTE7CisgIH0KKyAgcmV0dXJuIChGUERGX0RFU1QpcERlc3RPYmo7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmdmlld19jX2FwaV90ZXN0LmMgYi9mcGRmc2RrL3NyYy9mcGRmdmlld19jX2FwaV90ZXN0LmMKaW5kZXggM2ZkNjgyZC4uZmRmODNiZSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZnZpZXdfY19hcGlfdGVzdC5jCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZ2aWV3X2NfYXBpX3Rlc3QuYwpAQCAtOSwyMSArOSwyMSBAQAogCiAjaW5jbHVkZSAiZnBkZnZpZXdfY19hcGlfdGVzdC5oIgogCi0jaW5jbHVkZSAiLi4vLi4vcHVibGljL2ZwZGZfZGF0YWF2YWlsLmgiCi0jaW5jbHVkZSAiLi4vLi4vcHVibGljL2ZwZGZfZG9jLmgiCi0jaW5jbHVkZSAiLi4vLi4vcHVibGljL2ZwZGZfZWRpdC5oIgotI2luY2x1ZGUgIi4uLy4uL3B1YmxpYy9mcGRmX2V4dC5oIgotI2luY2x1ZGUgIi4uLy4uL3B1YmxpYy9mcGRmX2ZsYXR0ZW4uaCIKLSNpbmNsdWRlICIuLi8uLi9wdWJsaWMvZnBkZl9mb3JtZmlsbC5oIgotI2luY2x1ZGUgIi4uLy4uL3B1YmxpYy9mcGRmX2Z3bGV2ZW50LmgiCi0jaW5jbHVkZSAiLi4vLi4vcHVibGljL2ZwZGZfcHBvLmgiCi0jaW5jbHVkZSAiLi4vLi4vcHVibGljL2ZwZGZfcHJvZ3Jlc3NpdmUuaCIKLSNpbmNsdWRlICIuLi8uLi9wdWJsaWMvZnBkZl9zYXZlLmgiCi0jaW5jbHVkZSAiLi4vLi4vcHVibGljL2ZwZGZfc2VhcmNoZXguaCIKLSNpbmNsdWRlICIuLi8uLi9wdWJsaWMvZnBkZl9zeXNmb250aW5mby5oIgotI2luY2x1ZGUgIi4uLy4uL3B1YmxpYy9mcGRmX3RleHQuaCIKLSNpbmNsdWRlICIuLi8uLi9wdWJsaWMvZnBkZl90cmFuc2Zvcm1wYWdlLmgiCi0jaW5jbHVkZSAiLi4vLi4vcHVibGljL2ZwZGZ2aWV3LmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZfZGF0YWF2YWlsLmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZfZG9jLmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZfZWRpdC5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2V4dC5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2ZsYXR0ZW4uaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9mb3JtZmlsbC5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2Z3bGV2ZW50LmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZfcHBvLmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZfcHJvZ3Jlc3NpdmUuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9zYXZlLmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZfc2VhcmNoZXguaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9zeXNmb250aW5mby5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX3RleHQuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl90cmFuc2Zvcm1wYWdlLmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiCiAKIC8vIFNjaGVtZSBmb3IgYXZvaWRpbmcgTFRPIG91dCBvZiBleGlzdGVuY2UsIHdhcm5pbmdzLCBldGMuCiB0eXBlZGVmIHZvaWQgKCpmbnB0cikodm9pZCk7ICAvLyBMZWdhbCBnZW5lcmljIGZ1bmN0aW9uIHR5cGUgZm9yIGNhc3RzLgpAQCAtNTEsOSArNTEsMTEgQEAKICAgICBDSEsoRlBERkJvb2ttYXJrX0dldEFjdGlvbik7CiAgICAgQ0hLKEZQREZBY3Rpb25fR2V0VHlwZSk7CiAgICAgQ0hLKEZQREZBY3Rpb25fR2V0RGVzdCk7CisgICAgQ0hLKEZQREZBY3Rpb25fR2V0RmlsZVBhdGgpOwogICAgIENISyhGUERGQWN0aW9uX0dldFVSSVBhdGgpOwogICAgIENISyhGUERGRGVzdF9HZXRQYWdlSW5kZXgpOwogICAgIENISyhGUERGTGlua19HZXRMaW5rQXRQb2ludCk7CisgICAgQ0hLKEZQREZMaW5rX0dldExpbmtaT3JkZXJBdFBvaW50KTsKICAgICBDSEsoRlBERkxpbmtfR2V0RGVzdCk7CiAgICAgQ0hLKEZQREZMaW5rX0dldEFjdGlvbik7CiAgICAgQ0hLKEZQREZMaW5rX0VudW1lcmF0ZSk7CkBAIC0xMDIsMTUgKzEwNCwzNyBAQAogICAgIENISyhGT1JNX09uTW91c2VNb3ZlKTsKICAgICBDSEsoRk9STV9PbkxCdXR0b25Eb3duKTsKICAgICBDSEsoRk9STV9PbkxCdXR0b25VcCk7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgICBDSEsoRk9STV9PblJCdXR0b25Eb3duKTsKKyAgICBDSEsoRk9STV9PblJCdXR0b25VcCk7CisjZW5kaWYKICAgICBDSEsoRk9STV9PbktleURvd24pOwogICAgIENISyhGT1JNX09uS2V5VXApOwogICAgIENISyhGT1JNX09uQ2hhcik7CiAgICAgQ0hLKEZPUk1fRm9yY2VUb0tpbGxGb2N1cyk7Ci0gICAgQ0hLKEZQRFBhZ2VfSGFzRm9ybUZpZWxkQXRQb2ludCk7CisgICAgQ0hLKEZQREZQYWdlX0hhc0Zvcm1GaWVsZEF0UG9pbnQpOworICAgIENISyhGUERQYWdlX0hhc0Zvcm1GaWVsZEF0UG9pbnQpOyAgLy8gREVQUkVDQVRFRC4gUmVtb3ZlIGluIHRoZSBmdXR1cmUuCisgICAgQ0hLKEZQREZQYWdlX0Zvcm1GaWVsZFpPcmRlckF0UG9pbnQpOwogICAgIENISyhGUERGX1NldEZvcm1GaWVsZEhpZ2hsaWdodENvbG9yKTsKICAgICBDSEsoRlBERl9TZXRGb3JtRmllbGRIaWdobGlnaHRBbHBoYSk7CiAgICAgQ0hLKEZQREZfUmVtb3ZlRm9ybUZpZWxkSGlnaGxpZ2h0KTsKICAgICBDSEsoRlBERl9GRkxEcmF3KTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICAgIENISyhGUERGX0hhc1hGQUZpZWxkKTsKKyAgICBDSEsoRlBERl9Mb2FkWEZBKTsKKyAgICBDSEsoRlBERl9XaWRnZXRfVW5kbyk7CisgICAgQ0hLKEZQREZfV2lkZ2V0X1JlZG8pOworICAgIENISyhGUERGX1dpZGdldF9TZWxlY3RBbGwpOworICAgIENISyhGUERGX1dpZGdldF9Db3B5KTsKKyAgICBDSEsoRlBERl9XaWRnZXRfQ3V0KTsKKyAgICBDSEsoRlBERl9XaWRnZXRfUGFzdGUpOworICAgIENISyhGUERGX1dpZGdldF9SZXBsYWNlU3BlbGxDaGVja1dvcmQpOworICAgIENISyhGUERGX1dpZGdldF9HZXRTcGVsbENoZWNrV29yZHMpOworICAgIENISyhGUERGX1N0cmluZ0hhbmRsZUNvdW50cyk7CisgICAgQ0hLKEZQREZfU3RyaW5nSGFuZGxlR2V0U3RyaW5nQnlJbmRleCk7CisgICAgQ0hLKEZQREZfU3RyaW5nSGFuZGxlUmVsZWFzZSk7CisgICAgQ0hLKEZQREZfU3RyaW5nSGFuZGxlQWRkU3RyaW5nKTsKKyNlbmRpZgogCiAgICAgLy8gZnBkZl9wcG8uaAogICAgIENISyhGUERGX0ltcG9ydFBhZ2VzKTsKQEAgLTE3Miw2ICsxOTYsNyBAQAogCiAgICAgLy8gZnBkZnZpZXcuaAogICAgIENISyhGUERGX0luaXRMaWJyYXJ5KTsKKyAgICBDSEsoRlBERl9Jbml0TGlicmFyeVdpdGhDb25maWcpOwogICAgIENISyhGUERGX0Rlc3Ryb3lMaWJyYXJ5KTsKICAgICBDSEsoRlBERl9TZXRTYW5kQm94UG9saWN5KTsKICAgICBDSEsoRlBERl9Mb2FkRG9jdW1lbnQpOwpAQCAtMjA2LDYgKzIzMSwxMSBAQAogICAgIENISyhGUERGX0NvdW50TmFtZWREZXN0cyk7CiAgICAgQ0hLKEZQREZfR2V0TmFtZWREZXN0QnlOYW1lKTsKICAgICBDSEsoRlBERl9HZXROYW1lZERlc3QpOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgICAgQ0hLKEZQREZfQlN0cl9Jbml0KTsKKyAgICBDSEsoRlBERl9CU3RyX1NldCk7CisgICAgQ0hLKEZQREZfQlN0cl9DbGVhcik7CisjZW5kaWYKIAogICAgIHJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZnZpZXdfZW1iZWRkZXJ0ZXN0LmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZ2aWV3X2VtYmVkZGVydGVzdC5jcHAKaW5kZXggY2MwYWExZi4uMzE0N2MwMSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnBkZnZpZXdfZW1iZWRkZXJ0ZXN0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9mcGRmdmlld19lbWJlZGRlcnRlc3QuY3BwCkBAIC01LDIwICs1LDE5IEBACiAjaW5jbHVkZSA8bGltaXRzPgogI2luY2x1ZGUgPHN0cmluZz4KIAotI2luY2x1ZGUgIi4uLy4uL3B1YmxpYy9mcGRmdmlldy5oIgotI2luY2x1ZGUgIi4uLy4uL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdC5oIgotI2luY2x1ZGUgImZwZGZ2aWV3X2NfYXBpX3Rlc3QuaCIKKyNpbmNsdWRlICJmcGRmc2RrL3NyYy9mcGRmdmlld19jX2FwaV90ZXN0LmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiCisjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCiAKIFRFU1QoZnBkZiwgQ0FwaVRlc3QpIHsKICAgRVhQRUNUX1RSVUUoQ2hlY2tQREZpdW1DQXBpKCkpOwogfQogCi1jbGFzcyBGUERGVmlld0VtYmVkZGVydGVzdCA6IHB1YmxpYyBFbWJlZGRlclRlc3QgewotfTsKK2NsYXNzIEZQREZWaWV3RW1iZWRkZXJ0ZXN0IDogcHVibGljIEVtYmVkZGVyVGVzdCB7fTsKIAogVEVTVF9GKEZQREZWaWV3RW1iZWRkZXJ0ZXN0LCBEb2N1bWVudCkgewotICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoInRlc3RpbmcvcmVzb3VyY2VzL2Fib3V0X2JsYW5rLnBkZiIpKTsKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJhYm91dF9ibGFuay5wZGYiKSk7CiAgIEVYUEVDVF9FUSgxLCBHZXRQYWdlQ291bnQoKSk7CiAgIEVYUEVDVF9FUSgwLCBHZXRGaXJzdFBhZ2VOdW0oKSk7CiAKQEAgLTMxLDcgKzMwLDcgQEAKIH0KIAogVEVTVF9GKEZQREZWaWV3RW1iZWRkZXJ0ZXN0LCBQYWdlKSB7Ci0gIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgidGVzdGluZy9yZXNvdXJjZXMvYWJvdXRfYmxhbmsucGRmIikpOworICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoImFib3V0X2JsYW5rLnBkZiIpKTsKICAgRlBERl9QQUdFIHBhZ2UgPSBMb2FkUGFnZSgwKTsKICAgRVhQRUNUX05FKG51bGxwdHIsIHBhZ2UpOwogICBFWFBFQ1RfRVEoNjEyLjAsIEZQREZfR2V0UGFnZVdpZHRoKHBhZ2UpKTsKQEAgLTQxLDIwICs0MCwyMCBAQAogfQogCiBURVNUX0YoRlBERlZpZXdFbWJlZGRlcnRlc3QsIFZpZXdlclJlZikgewotICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoInRlc3RpbmcvcmVzb3VyY2VzL2Fib3V0X2JsYW5rLnBkZiIpKTsKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJhYm91dF9ibGFuay5wZGYiKSk7CiAgIEVYUEVDVF9UUlVFKEZQREZfVklFV0VSUkVGX0dldFByaW50U2NhbGluZyhkb2N1bWVudCgpKSk7CiAgIEVYUEVDVF9FUSgxLCBGUERGX1ZJRVdFUlJFRl9HZXROdW1Db3BpZXMoZG9jdW1lbnQoKSkpOwogICBFWFBFQ1RfRVEoRHVwbGV4VW5kZWZpbmVkLCBGUERGX1ZJRVdFUlJFRl9HZXREdXBsZXgoZG9jdW1lbnQoKSkpOwogfQogCiBURVNUX0YoRlBERlZpZXdFbWJlZGRlcnRlc3QsIE5hbWVkRGVzdHMpIHsKLSAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJ0ZXN0aW5nL3Jlc291cmNlcy9uYW1lZF9kZXN0cy5wZGYiKSk7CisgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgibmFtZWRfZGVzdHMucGRmIikpOwogICBsb25nIGJ1ZmZlcl9zaXplOwogICBjaGFyIGZpeGVkX2J1ZmZlcls1MTJdOwogICBGUERGX0RFU1QgZGVzdDsKIAogICAvLyBRdWVyeSB0aGUgc2l6ZSBvZiB0aGUgZmlyc3QgaXRlbS4KLSAgYnVmZmVyX3NpemUgPSAyMDAwMDAwOyAvLyBBYnN1cmRseSBsYXJnZSwgY2hlY2sgbm90IHVzZWQgZm9yIHRoaXMgY2FzZS4KKyAgYnVmZmVyX3NpemUgPSAyMDAwMDAwOyAgLy8gQWJzdXJkbHkgbGFyZ2UsIGNoZWNrIG5vdCB1c2VkIGZvciB0aGlzIGNhc2UuCiAgIGRlc3QgPSBGUERGX0dldE5hbWVkRGVzdChkb2N1bWVudCgpLCAwLCBudWxscHRyLCAmYnVmZmVyX3NpemUpOwogICBFWFBFQ1RfTkUobnVsbHB0ciwgZGVzdCk7CiAgIEVYUEVDVF9FUSgxMnUsIGJ1ZmZlcl9zaXplKTsKQEAgLTEwNCw5ICsxMDMsOCBAQAogICBkZXN0ID0gRlBERl9HZXROYW1lZERlc3QoZG9jdW1lbnQoKSwgNCwgZml4ZWRfYnVmZmVyLCAmYnVmZmVyX3NpemUpOwogICBFWFBFQ1RfTkUobnVsbHB0ciwgZGVzdCk7CiAgIEVYUEVDVF9FUSgzMHUsIGJ1ZmZlcl9zaXplKTsKLSAgRVhQRUNUX0VRKAotICAgICAgc3RkOjpzdHJpbmcoIkZcMGlcMHJcMHNcMHRcMEFcMGxcMHRcMGVcMHJcMG5cMGFcMHRcMGVcMFwwXDAiLCAzMCksCi0gICAgICBzdGQ6OnN0cmluZyhmaXhlZF9idWZmZXIsIGJ1ZmZlcl9zaXplKSk7CisgIEVYUEVDVF9FUShzdGQ6OnN0cmluZygiRlwwaVwwclwwc1wwdFwwQVwwbFwwdFwwZVwwclwwblwwYVwwdFwwZVwwXDBcMCIsIDMwKSwKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKGZpeGVkX2J1ZmZlciwgYnVmZmVyX3NpemUpKTsKIAogICAvLyBUcnkgdG8gcmV0cmlldmUgc2l4dGggaXRlbSB3aXRoIGFtcGxlIGJ1ZmZlci4gSXRlbSBpc3Rha2VuIGZyb20gdGhlCiAgIC8vIG9sZC1zdHlsZSBEZXN0cyBkaWN0aW9uYXJ5IG9iamVjdCBidXQgaGFzIGEgc3ViLWRpY3Rpb25hcnkgaW4KQEAgLTExNSw5ICsxMTMsOCBAQAogICBkZXN0ID0gRlBERl9HZXROYW1lZERlc3QoZG9jdW1lbnQoKSwgNSwgZml4ZWRfYnVmZmVyLCAmYnVmZmVyX3NpemUpOwogICBFWFBFQ1RfTkUobnVsbHB0ciwgZGVzdCk7CiAgIEVYUEVDVF9FUSgyOHUsIGJ1ZmZlcl9zaXplKTsKLSAgRVhQRUNUX0VRKAotICAgICAgc3RkOjpzdHJpbmcoIkxcMGFcMHNcMHRcMEFcMGxcMHRcMGVcMHJcMG5cMGFcMHRcMGVcMFwwXDAiLCAyOCksCi0gICAgICBzdGQ6OnN0cmluZyhmaXhlZF9idWZmZXIsIGJ1ZmZlcl9zaXplKSk7CisgIEVYUEVDVF9FUShzdGQ6OnN0cmluZygiTFwwYVwwc1wwdFwwQVwwbFwwdFwwZVwwclwwblwwYVwwdFwwZVwwXDBcMCIsIDI4KSwKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKGZpeGVkX2J1ZmZlciwgYnVmZmVyX3NpemUpKTsKIAogICAvLyBUcnkgdG8gcmV0cmlldmUgbm9uLWV4aXN0ZW50IGl0ZW0gd2l0aCBhbXBsZSBidWZmZXIuCiAgIGJ1ZmZlcl9zaXplID0gc2l6ZW9mKGZpeGVkX2J1ZmZlcik7CkBAIC0xNDUsNyArMTQyLDcgQEAKIH0KIAogVEVTVF9GKEZQREZWaWV3RW1iZWRkZXJ0ZXN0LCBOYW1lZERlc3RzQnlOYW1lKSB7Ci0gIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgidGVzdGluZy9yZXNvdXJjZXMvbmFtZWRfZGVzdHMucGRmIikpOworICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoIm5hbWVkX2Rlc3RzLnBkZiIpKTsKIAogICAvLyBOdWxsIHBvaW50ZXIgcmV0dXJucyBOVUxMLgogICBGUERGX0RFU1QgZGVzdCA9IEZQREZfR2V0TmFtZWREZXN0QnlOYW1lKGRvY3VtZW50KCksIG51bGxwdHIpOwpAQCAtMTgzLDIwICsxODAsNTEgQEAKIAogLy8gVGhlIGZvbGxvd2luZyB0ZXN0cyBwYXNzIGlmIHRoZSBkb2N1bWVudCBvcGVucyB3aXRob3V0IGNyYXNoaW5nLgogVEVTVF9GKEZQREZWaWV3RW1iZWRkZXJ0ZXN0LCBDcmFzaGVyXzExMykgewotICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoInRlc3RpbmcvcmVzb3VyY2VzL2J1Z18xMTMucGRmIikpOworICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoImJ1Z18xMTMucGRmIikpOwogfQogCiBURVNUX0YoRlBERlZpZXdFbWJlZGRlcnRlc3QsIENyYXNoZXJfNDUxODMwKSB7Ci0gIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgidGVzdGluZy9yZXNvdXJjZXMvYnVnXzQ1MTgzMC5wZGYiKSk7CisgIC8vIERvY3VtZW50IGlzIGRhbWFnZWQgYW5kIGNhbid0IGJlIG9wZW5lZC4KKyAgRVhQRUNUX0ZBTFNFKE9wZW5Eb2N1bWVudCgiYnVnXzQ1MTgzMC5wZGYiKSk7CiB9CiAKIFRFU1RfRihGUERGVmlld0VtYmVkZGVydGVzdCwgQ3Jhc2hlcl80NTI0NTUpIHsKLSAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJ0ZXN0aW5nL3Jlc291cmNlcy9idWdfNDUyNDU1LnBkZiIpKTsKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJidWdfNDUyNDU1LnBkZiIpKTsKICAgRlBERl9QQUdFIHBhZ2UgPSBMb2FkUGFnZSgwKTsKICAgRVhQRUNUX05FKG51bGxwdHIsIHBhZ2UpOwogICBVbmxvYWRQYWdlKHBhZ2UpOwogfQogCi1URVNUX0YoRlBERlZpZXdFbWJlZGRlcnRlc3QsIENyYXNoZXIzKSB7Ci0gIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgidGVzdGluZy9yZXNvdXJjZXMvYnVnXzQ1NDY5NS5wZGYiKSk7CitURVNUX0YoRlBERlZpZXdFbWJlZGRlcnRlc3QsIENyYXNoZXJfNDU0Njk1KSB7CisgIC8vIERvY3VtZW50IGlzIGRhbWFnZWQgYW5kIGNhbid0IGJlIG9wZW5lZC4KKyAgRVhQRUNUX0ZBTFNFKE9wZW5Eb2N1bWVudCgiYnVnXzQ1NDY5NS5wZGYiKSk7CiB9CisKK1RFU1RfRihGUERGVmlld0VtYmVkZGVydGVzdCwgQ3Jhc2hlcl81NzI4NzEpIHsKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJidWdfNTcyODcxLnBkZiIpKTsKK30KKworLy8gVGhlIGZvbGxvd2luZyB0ZXN0cyBwYXNzIGlmIHRoZSBkb2N1bWVudCBvcGVucyB3aXRob3V0IGluZmluaXRlIGxvb3BpbmcuCitURVNUX0YoRlBERlZpZXdFbWJlZGRlcnRlc3QsIEhhbmdfMjk4KSB7CisgIEVYUEVDVF9GQUxTRShPcGVuRG9jdW1lbnQoImJ1Z18yOTgucGRmIikpOworfQorCisvLyBUZXN0IGlmIHRoZSBkb2N1bWVudCBvcGVucyB3aXRob3V0IGluZmluaXRlIGxvb3BpbmcuCisvLyBQcmV2aW91c2x5IHRoaXMgdGVzdCB3aWxsIGhhbmcgaW4gYSBsb29wIGluc2lkZSBMb2FkQWxsQ3Jvc3NSZWZWNC4gQWZ0ZXIKKy8vIHRoZSBmaXgsIExvYWRBbGxDcm9zc1JlZlY0IHdpbGwgcmV0dXJuIGZhbHNlIGFmdGVyIGRldGVjdGluZyBhIGNyb3NzCisvLyByZWZlcmVuY2UgbG9vcC4gQ3Jvc3MgcmVmZXJlbmNlcyB3aWxsIGJlIHJlYnVpbHQgc3VjY2Vzc2Z1bGx5LgorVEVTVF9GKEZQREZWaWV3RW1iZWRkZXJ0ZXN0LCBDcm9zc1JlZlY0TG9vcCkgeworICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoImJ1Z194cmVmdjRfbG9vcC5wZGYiKSk7Cit9CisKKy8vIFRoZSB0ZXN0IHNob3VsZCBwYXNzIHdoZW4gY2lyY3VsYXIgcmVmZXJlbmNlcyB0byBQYXJzZUluZGlyZWN0T2JqZWN0IHdpbGwgbm90CisvLyBjYXVzZSBpbmZpbml0ZSBsb29wLgorVEVTVF9GKEZQREZWaWV3RW1iZWRkZXJ0ZXN0LCBIYW5nXzM0MykgeworICBFWFBFQ1RfRkFMU0UoT3BlbkRvY3VtZW50KCJidWdfMzQzLnBkZiIpKTsKK30KKworLy8gVGhlIHRlc3Qgc2hvdWxkIHBhc3Mgd2hlbiB0aGUgYWJzZW5jZSBvZiAnQ29udGVudHMnIGZpZWxkIGluIGEgc2lnbmF0dXJlCisvLyBkaWN0aW9uYXJ5IHdpbGwgbm90IGNhdXNlIGFuIGluZmluaXRlIGxvb3AgaW4gQ1BERl9TeW50YXhQYXJzZXI6OkdldE9iamVjdCgpLgorVEVTVF9GKEZQREZWaWV3RW1iZWRkZXJ0ZXN0LCBIYW5nXzM0NCkgeworICBFWFBFQ1RfRkFMU0UoT3BlbkRvY3VtZW50KCJidWdfMzQ0LnBkZiIpKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmeGZhL2ZwZGZ4ZmFfYXBwLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZ4ZmEvZnBkZnhmYV9hcHAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1M2ViMzAKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL3NyYy9mcGRmeGZhL2ZwZGZ4ZmFfYXBwLmNwcApAQCAtMCwwICsxLDUzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiDQorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mc2RrX21nci5oIg0KKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2RvYy5oIg0KKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX3V0aWwuaCINCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCINCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9hcHAuaCINCisjaW5jbHVkZSAicHVibGljL2ZwZGZfZm9ybWZpbGwuaCINCisNCitDUERGWEZBX0FwcCogQ1BERlhGQV9BcHA6OmdfcEFwcCA9IE5VTEw7DQorDQorQ1BERlhGQV9BcHAqIENQREZYRkFfQXBwOjpHZXRJbnN0YW5jZSgpIHsNCisgIGlmICghZ19wQXBwKSB7DQorICAgIGdfcEFwcCA9IG5ldyBDUERGWEZBX0FwcCgpOw0KKyAgfQ0KKyAgcmV0dXJuIGdfcEFwcDsNCit9DQorDQordm9pZCBDUERGWEZBX0FwcDo6UmVsZWFzZUluc3RhbmNlKCkgew0KKyAgZGVsZXRlIGdfcEFwcDsNCisgIGdfcEFwcCA9IE5VTEw7DQorfQ0KKw0KK0NQREZYRkFfQXBwOjpDUERGWEZBX0FwcCgpDQorICAgIDogbV9iSmF2YVNjcmlwdEluaXRpYWxpemVkKEZBTFNFKSwNCisgICAgICBtX3BYRkFBcHAoTlVMTCksDQorICAgICAgbV9wRm9udE1ncihOVUxMKSwNCisgICAgICBtX2hKU0VSdW50aW1lKE5VTEwpLA0KKyAgICAgIG1fY3NBcHBUeXBlKEpTX1NUUl9WSUVXRVJUWVBFX1NUQU5EQVJEKSB7DQorICBtX3BFbnZMaXN0LlJlbW92ZUFsbCgpOw0KK30NCisNCitDUERGWEZBX0FwcDo6fkNQREZYRkFfQXBwKCkgew0KKyAgZGVsZXRlIG1fcEZvbnRNZ3I7DQorICBtX3BGb250TWdyID0gTlVMTDsNCisNCisgIGRlbGV0ZSBtX3BYRkFBcHA7DQorICBtX3BYRkFBcHAgPSBOVUxMOw0KKw0KKyNpZmRlZiBQREZfRU5BQkxFX1hGQQ0KKyAgRlhKU0VfUnVudGltZV9SZWxlYXNlKG1faEpTRVJ1bnRpbWUpOw0KKyAgbV9oSlNFUnVudGltZSA9IE5VTEw7DQorDQorICBGWEpTRV9GaW5hbGl6ZSgpOw0KKyAgQkNfTGlicmFyeV9EZXN0b3J5KCk7DQorI2VuZGlmDQorfQ0KKw0KK0ZYX0JPT0wgQ1BERlhGQV9BcHA6OkluaXRpYWxpemUoKSB7DQorI2lmZGVmIFBERl9FTkFCTEVfWEZBDQorICBCQ19MaWJyYXJ5X0luaXQoKTsNCisgIEZYSlNFX0luaXRpYWxpemUoKTsNCisNCisgIG1faEpTRVJ1bnRpbWUgPSBGWEpTRV9SdW50aW1lX0NyZWF0ZSgpOw0KKyAgaWYgKCFtX2hKU0VSdW50aW1lKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorDQorICBtX3BYRkFBcHAgPSBJWEZBX0FwcDo6Q3JlYXRlKHRoaXMpOw0KKyAgaWYgKCFtX3BYRkFBcHApDQorICAgIHJldHVybiBGQUxTRTsNCisNCisgIG1fcEZvbnRNZ3IgPSBJWEZBX0ZvbnRNZ3I6OkNyZWF0ZURlZmF1bHQoKTsNCisgIGlmICghbV9wRm9udE1ncikNCisgICAgcmV0dXJuIEZBTFNFOw0KKw0KKyAgbV9wWEZBQXBwLT5TZXREZWZhdWx0Rm9udE1ncihtX3BGb250TWdyKTsNCisjZW5kaWYNCisgIHJldHVybiBUUlVFOw0KK30NCisNCitGWF9CT09MIENQREZYRkFfQXBwOjpBZGRGb3JtRmlsbEVudihDUERGRG9jX0Vudmlyb25tZW50KiBwRW52KSB7DQorICBpZiAoIXBFbnYpDQorICAgIHJldHVybiBGQUxTRTsNCisNCisgIG1fcEVudkxpc3QuQWRkKHBFbnYpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KKw0KK0ZYX0JPT0wgQ1BERlhGQV9BcHA6OlJlbW92ZUZvcm1GaWxsRW52KENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYpIHsNCisgIGlmICghcEVudikNCisgICAgcmV0dXJuIEZBTFNFOw0KKw0KKyAgaW50IG5GaW5kID0gbV9wRW52TGlzdC5GaW5kKHBFbnYpOw0KKyAgaWYgKG5GaW5kICE9IC0xKSB7DQorICAgIG1fcEVudkxpc3QuUmVtb3ZlQXQobkZpbmQpOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisNCisgIHJldHVybiBGQUxTRTsNCit9DQorDQordm9pZCBDUERGWEZBX0FwcDo6R2V0QXBwVHlwZShDRlhfV2lkZVN0cmluZyYgd3NBcHBUeXBlKSB7DQorICB3c0FwcFR5cGUgPSBtX2NzQXBwVHlwZTsNCit9DQorDQordm9pZCBDUERGWEZBX0FwcDo6R2V0QXBwTmFtZShDRlhfV2lkZVN0cmluZyYgd3NOYW1lKSB7DQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRW52TGlzdC5HZXRBdCgwKTsNCisgIGlmIChwRW52KSB7DQorICAgIHdzTmFtZSA9IHBFbnYtPkZGSV9HZXRBcHBOYW1lKCk7DQorICB9DQorfQ0KKw0KK3ZvaWQgQ1BERlhGQV9BcHA6OlNldEFwcFR5cGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0FwcFR5cGUpIHsNCisgIG1fY3NBcHBUeXBlID0gd3NBcHBUeXBlOw0KK30NCisNCit2b2lkIENQREZYRkFfQXBwOjpHZXRMYW5ndWFnZShDRlhfV2lkZVN0cmluZyYgd3NMYW5ndWFnZSkgew0KKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcEVudkxpc3QuR2V0QXQoMCk7DQorICBpZiAocEVudikgew0KKyAgICB3c0xhbmd1YWdlID0gcEVudi0+RkZJX0dldExhbmd1YWdlKCk7DQorICB9DQorfQ0KKw0KK3ZvaWQgQ1BERlhGQV9BcHA6OkdldFBsYXRmb3JtKENGWF9XaWRlU3RyaW5nJiB3c1BsYXRmb3JtKSB7DQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRW52TGlzdC5HZXRBdCgwKTsNCisgIGlmIChwRW52KSB7DQorICAgIHdzUGxhdGZvcm0gPSBwRW52LT5GRklfR2V0UGxhdGZvcm0oKTsNCisgIH0NCit9DQorDQordm9pZCBDUERGWEZBX0FwcDo6R2V0VmFyaWF0aW9uKENGWF9XaWRlU3RyaW5nJiB3c1ZhcmlhdGlvbikgew0KKyAgd3NWYXJpYXRpb24gPSBKU19TVFJfVklFV0VSVkFSSUFUSU9OOw0KK30NCisNCit2b2lkIENQREZYRkFfQXBwOjpHZXRWZXJzaW9uKENGWF9XaWRlU3RyaW5nJiB3c1ZlcnNpb24pIHsNCisgIHdzVmVyc2lvbiA9IEpTX1NUUl9WSUVXRVJWRVJTSU9OX1hGQTsNCit9DQorDQordm9pZCBDUERGWEZBX0FwcDo6QmVlcChGWF9EV09SRCBkd1R5cGUpIHsNCisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BFbnZMaXN0LkdldEF0KDApOw0KKyAgaWYgKHBFbnYpIHsNCisgICAgcEVudi0+SlNfYXBwQmVlcChkd1R5cGUpOw0KKyAgfQ0KK30NCisNCitpbnQzMl90IENQREZYRkFfQXBwOjpNc2dCb3goY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c01lc3NhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUaXRsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdJY29uVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdCdXR0b25UeXBlKSB7DQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRW52TGlzdC5HZXRBdCgwKTsNCisgIGlmICghcEVudikNCisgICAgcmV0dXJuIC0xOw0KKw0KKyAgRlhfRFdPUkQgaWNvblR5cGUgPSAwOw0KKyAgaW50IGlCdXR0b25UeXBlID0gMDsNCisgIHN3aXRjaCAoZHdJY29uVHlwZSkgew0KKyAgICBjYXNlIFhGQV9NQklDT05fRXJyb3I6DQorICAgICAgaWNvblR5cGUgfD0gMDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfTUJJQ09OX1dhcm5pbmc6DQorICAgICAgaWNvblR5cGUgfD0gMTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfTUJJQ09OX1F1ZXN0aW9uOg0KKyAgICAgIGljb25UeXBlIHw9IDI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX01CSUNPTl9TdGF0dXM6DQorICAgICAgaWNvblR5cGUgfD0gMzsNCisgICAgICBicmVhazsNCisgIH0NCisgIHN3aXRjaCAoZHdCdXR0b25UeXBlKSB7DQorICAgIGNhc2UgWEZBX01CX09LOg0KKyAgICAgIGlCdXR0b25UeXBlIHw9IDA7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX01CX09LQ2FuY2VsOg0KKyAgICAgIGlCdXR0b25UeXBlIHw9IDE7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX01CX1llc05vOg0KKyAgICAgIGlCdXR0b25UeXBlIHw9IDI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX01CX1llc05vQ2FuY2VsOg0KKyAgICAgIGlCdXR0b25UeXBlIHw9IDM7DQorICAgICAgYnJlYWs7DQorICB9DQorICBpbnQzMl90IGlSZXQgPSBwRW52LT5KU19hcHBBbGVydCh3c01lc3NhZ2UuR2V0UHRyKCksIHdzVGl0bGUuR2V0UHRyKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQnV0dG9uVHlwZSwgaWNvblR5cGUpOw0KKyAgc3dpdGNoIChpUmV0KSB7DQorICAgIGNhc2UgMToNCisgICAgICByZXR1cm4gWEZBX0lET0s7DQorICAgIGNhc2UgMjoNCisgICAgICByZXR1cm4gWEZBX0lEQ2FuY2VsOw0KKyAgICBjYXNlIDM6DQorICAgICAgcmV0dXJuIFhGQV9JRE5vOw0KKyAgICBjYXNlIDQ6DQorICAgICAgcmV0dXJuIFhGQV9JRFllczsNCisgIH0NCisgIHJldHVybiBYRkFfSURZZXM7DQorfQ0KKw0KK3ZvaWQgQ1BERlhGQV9BcHA6OlJlc3BvbnNlKENGWF9XaWRlU3RyaW5nJiB3c0Fuc3dlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzUXVlc3Rpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RpdGxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NEZWZhdWx0QW5zd2VyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1hcmspIHsNCisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BFbnZMaXN0LkdldEF0KDApOw0KKyAgaWYgKHBFbnYpIHsNCisgICAgaW50IG5MZW5ndGggPSAyMDQ4Ow0KKyAgICBjaGFyKiBwQnVmZiA9IG5ldyBjaGFyW25MZW5ndGhdOw0KKyAgICBuTGVuZ3RoID0gcEVudi0+SlNfYXBwUmVzcG9uc2Uod3NRdWVzdGlvbi5HZXRQdHIoKSwgd3NUaXRsZS5HZXRQdHIoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzRGVmYXVsdEFuc3dlci5HZXRQdHIoKSwgTlVMTCwgYk1hcmssIHBCdWZmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkxlbmd0aCk7DQorICAgIGlmIChuTGVuZ3RoID4gMCkgew0KKyAgICAgIG5MZW5ndGggPSBuTGVuZ3RoID4gMjA0NiA/IDIwNDYgOiBuTGVuZ3RoOw0KKyAgICAgIHBCdWZmW25MZW5ndGhdID0gMDsNCisgICAgICBwQnVmZltuTGVuZ3RoICsgMV0gPSAwOw0KKyAgICAgIHdzQW5zd2VyID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEYxNkxFKA0KKyAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIHNob3J0Kj4ocEJ1ZmYpLA0KKyAgICAgICAgICBuTGVuZ3RoIC8gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7DQorICAgIH0NCisgICAgZGVsZXRlW10gcEJ1ZmY7DQorICB9DQorfQ0KKw0KK2ludDMyX3QgQ1BERlhGQV9BcHA6OkdldEN1ckRvY3VtZW50SW5CYXRjaCgpIHsNCisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BFbnZMaXN0LkdldEF0KDApOw0KKyAgaWYgKHBFbnYpIHsNCisgICAgcmV0dXJuIHBFbnYtPkZGSV9HZXRDdXJEb2N1bWVudCgpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK2ludDMyX3QgQ1BERlhGQV9BcHA6OkdldERvY3VtZW50Q291bnRJbkJhdGNoKCkgew0KKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcEVudkxpc3QuR2V0QXQoMCk7DQorICBpZiAocEVudikgew0KKyAgICByZXR1cm4gcEVudi0+RkZJX0dldERvY3VtZW50Q291bnQoKTsNCisgIH0NCisNCisgIHJldHVybiAwOw0KK30NCisNCitJRlhfRmlsZVJlYWQqIENQREZYRkFfQXBwOjpEb3dubG9hZFVSTChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVVJMKSB7DQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRW52TGlzdC5HZXRBdCgwKTsNCisgIGlmIChwRW52KSB7DQorICAgIHJldHVybiBwRW52LT5GRklfRG93bmxvYWRGcm9tVVJMKHdzVVJMLkdldFB0cigpKTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCisNCitGWF9CT09MIENQREZYRkFfQXBwOjpQb3N0UmVxdWVzdFVSTChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVVJMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDb250ZW50VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRW5jb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NIZWFkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUmVzcG9uc2UpIHsNCisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BFbnZMaXN0LkdldEF0KDApOw0KKyAgaWYgKHBFbnYpIHsNCisgICAgd3NSZXNwb25zZSA9IHBFbnYtPkZGSV9Qb3N0UmVxdWVzdFVSTCh3c1VSTC5HZXRQdHIoKSwgd3NEYXRhLkdldFB0cigpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzQ29udGVudFR5cGUuR2V0UHRyKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NFbmNvZGUuR2V0UHRyKCksIHdzSGVhZGVyLkdldFB0cigpKTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KKw0KK0ZYX0JPT0wgQ1BERlhGQV9BcHA6OlB1dFJlcXVlc3RVUkwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1VSTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0VuY29kZSkgew0KKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcEVudkxpc3QuR2V0QXQoMCk7DQorICBpZiAocEVudikgew0KKyAgICByZXR1cm4gcEVudi0+RkZJX1B1dFJlcXVlc3RVUkwod3NVUkwuR2V0UHRyKCksIHdzRGF0YS5HZXRQdHIoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzRW5jb2RlLkdldFB0cigpKTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorDQordm9pZCBDUERGWEZBX0FwcDo6TG9hZFN0cmluZyhpbnQzMl90IGlTdHJpbmdJRCwgQ0ZYX1dpZGVTdHJpbmcmIHdzU3RyaW5nKSB7DQorICBzd2l0Y2ggKGlTdHJpbmdJRCkgew0KKyAgICBjYXNlIFhGQV9JRFNfVmFsaWRhdGVGYWlsZWQ6DQorICAgICAgd3NTdHJpbmcgPSBMIiVzIHZhbGlkYXRlIGZhaWxlZCI7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfQ2FsY092ZXJyaWRlOg0KKyAgICAgIHdzU3RyaW5nID0gTCJDYWxjdWxhdGUgT3ZlcnJpZGUiOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX01vZGlmeUZpZWxkOg0KKyAgICAgIHdzU3RyaW5nID0gTCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gbW9kaWZ5IHRoaXMgZmllbGQ/IjsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgWEZBX0lEU19Ob3RNb2RpZnlGaWVsZDoNCisgICAgICB3c1N0cmluZyA9IEwiWW91IGFyZSBub3QgYWxsb3dlZCB0byBtb2RpZnkgdGhpcyBmaWVsZC4iOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX0FwcE5hbWU6DQorICAgICAgd3NTdHJpbmcgPSBMIkZveGl0IjsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgWEZBX0lEU19JbWFnZUZpbHRlcjoNCisgICAgICB3c1N0cmluZyA9DQorICAgICAgICAgIEwiSW1hZ2UgIg0KKyAgICAgICAgICBMIkZpbGVzKCouYm1wOyouanBnOyoucG5nOyouZ2lmOyoudGlmKXwqLmJtcDsqLmpwZzsqLnBuZzsqLmdpZjsqLnRpZnwiDQorICAgICAgICAgIEwiQWxsIEZpbGVzKCouKil8Ki4qfHwiOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX1VOS05PV19DQVRDSEVEOg0KKyAgICAgIHdzU3RyaW5nID0gTCJ1bmtub3duIGVycm9yIGlzIGNhdGNoZWQhIjsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgWEZBX0lEU19VbmFibGVfVE9fU0VUOg0KKyAgICAgIHdzU3RyaW5nID0gTCJVbmFibGUgdG8gc2V0ICI7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfVkFMVUVfRVhDQUxNQVRPUlk6DQorICAgICAgd3NTdHJpbmcgPSBMIiB2YWx1ZSEiOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX0lOVkFMSURfRU5VTV9WQUxVRToNCisgICAgICB3c1N0cmluZyA9IEwiSW52YWxpZCBlbnVtZXJhdGVkIHZhbHVlOiAiOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX1VOU1VQUE9SVF9NRVRIT0Q6DQorICAgICAgd3NTdHJpbmcgPSBMInVuc3VwcG9ydCAlcyBtZXRob2QuIjsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgWEZBX0lEU19VTlNVUFBPUlRfUFJPUDoNCisgICAgICB3c1N0cmluZyA9IEwidW5zdXBwb3J0ICVzIHByb3BlcnR5LiI7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVDoNCisgICAgICB3c1N0cmluZyA9IEwiSW52YWxpZCBwcm9wZXJ0eSBzZXQgb3BlcmF0aW9uOyI7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfTk9UX0RFRkFVTF9WQUxVRToNCisgICAgICB3c1N0cmluZyA9IEwiIGRvZXNuJ3QgaGF2ZSBhIGRlZmF1bHQgcHJvcGVydHkiOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX1VOQUJMRV9TRVRfTEFOR1VBR0U6DQorICAgICAgd3NTdHJpbmcgPSBMIlVuYWJsZSB0byBzZXQgbGFuZ3VhZ2UgdmFsdWUhIjsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgWEZBX0lEU19VTkFCTEVfU0VUX05VTVBBR0VTOg0KKyAgICAgIHdzU3RyaW5nID0gTCJVbmFibGUgdG8gc2V0IG51bVBhZ2VzIHZhbHVlISI7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfVU5BQkxFX1NFVF9QTEFURk9STToNCisgICAgICB3c1N0cmluZyA9IEwiVW5hYmxlIHRvIHNldCBwbGF0Zm9ybSB2YWx1ZSEiOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX1VOQUJMRV9TRVRfVkFMSURBVElPTkVOQUJMRToNCisgICAgICB3c1N0cmluZyA9IEwiVW5hYmxlIHRvIHNldCB2YWxpZGF0aW9uc0VuYWJsZWQgdmFsdWUhIjsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgWEZBX0lEU19VTkFCTEVfU0VUX1ZBUklBVElPTjoNCisgICAgICB3c1N0cmluZyA9IEwiVW5hYmxlIHRvIHNldCB2YXJpYXRpb24gdmFsdWUhIjsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgWEZBX0lEU19VTkFCTEVfU0VUX1ZFUlNJT046DQorICAgICAgd3NTdHJpbmcgPSBMIlVuYWJsZSB0byBzZXQgdmVyc2lvbiB2YWx1ZSEiOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX1VOQUJMRV9TRVRfUkVBRFk6DQorICAgICAgd3NTdHJpbmcgPSBMIlVuYWJsZSB0byBzZXQgcmVhZHkgdmFsdWUhIjsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgWEZBX0lEU19OVU1CRVJfT0ZfT0NDVVI6DQorICAgICAgd3NTdHJpbmcgPQ0KKyAgICAgICAgICBMIlRoZSBlbGVtZW50IFslc10gaGFzIHZpb2xhdGVkIGl0cyBhbGxvd2FibGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIjsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgWEZBX0lEU19VTkFCTEVfU0VUX0NMQVNTX05BTUU6DQorICAgICAgd3NTdHJpbmcgPSBMIlVuYWJsZSB0byBzZXQgY2xhc3NOYW1lIHZhbHVlISI7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfVU5BQkxFX1NFVF9MRU5HVEhfVkFMVUU6DQorICAgICAgd3NTdHJpbmcgPSBMIlVuYWJsZSB0byBzZXQgbGVuZ3RoIHZhbHVlISI7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfVU5TVVBQT1JUX0NIQVI6DQorICAgICAgd3NTdHJpbmcgPSBMInVuc3VwcG9ydGVkIGNoYXIgJyVjJyI7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfQkFEX1NVRkZJWDoNCisgICAgICB3c1N0cmluZyA9IEwiYmFkIHN1ZmZpeCBvbiBudW1iZXIiOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX0VYUEVDVEVEX0lERU5UOg0KKyAgICAgIHdzU3RyaW5nID0gTCJleHBlY3RlZCBpZGVudGlmaWVyIGluc3RlYWQgb2YgJyVzJyI7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfRVhQRUNURURfU1RSSU5HOg0KKyAgICAgIHdzU3RyaW5nID0gTCJleHBlY3RlZCAnJXMnIGluc3RlYWQgb2YgJyVzJyI7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfSU5WQUxJREFURV9DSEFSOg0KKyAgICAgIHdzU3RyaW5nID0gTCJpbnZhbGlkYXRlIGNoYXIgJyVjJyI7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfUkVERUZJTklUSU9OOg0KKyAgICAgIHdzU3RyaW5nID0gTCInJXMnIHJlZGVmaW5pdGlvbiAiOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX0lOVkFMSURBVEVfVE9LRU46DQorICAgICAgd3NTdHJpbmcgPSBMImludmFsaWRhdGUgdG9rZW4gJyVzJyI7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfSU5WQUxJREFURV9FWFBSRVNTSU9OOg0KKyAgICAgIHdzU3RyaW5nID0gTCJpbnZhbGlkYXRlIGV4cHJlc3Npb24gJyVzJyI7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfVU5ERUZJTkVfSURFTlRJRklFUjoNCisgICAgICB3c1N0cmluZyA9IEwidW5kZWZpbmVkIGlkZW50aWZpZXIgJyVzJyI7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfSU5WQUxJREFURV9MRUZUVkFMVUU6DQorICAgICAgd3NTdHJpbmcgPSBMImludmFsaWRhdGUgbGVmdC12YWx1ZSAnJXMnIjsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgWEZBX0lEU19DT01QSUxFUl9FUlJPUjoNCisgICAgICB3c1N0cmluZyA9IEwiY29tcGlsZXIgZXJyb3IiOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX0NBTk5PVF9NT0RJRllfVkFMVUU6DQorICAgICAgd3NTdHJpbmcgPSBMImNhbid0IG1vZGlmeSB0aGUgJyVzJyB2YWx1ZSI7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfRVJST1JfUEFSQU1FVEVSUzoNCisgICAgICB3c1N0cmluZyA9IEwiZnVuY3Rpb24gJyVzJyBoYXMgbm90ICVkIHBhcmFtZXRlcnMiOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX0VYUEVDVF9FTkRJRjoNCisgICAgICB3c1N0cmluZyA9IEwiZXhwZWN0ZWQgJ2VuZGlmJyBpbnN0ZWFkIG9mICclcyciOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX1VORVhQRUNURURfRVhQUkVTU0lPTjoNCisgICAgICB3c1N0cmluZyA9IEwidW5leHBlY3RlZCBleHByZXNzaW9uICclcyciOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX0NPTkRJVElPTl9JU19OVUxMOg0KKyAgICAgIHdzU3RyaW5nID0gTCJjb25kaXRpb24gaXMgbnVsbCI7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfSUxMRUdBTEJSRUFLOg0KKyAgICAgIHdzU3RyaW5nID0gTCJpbGxlZ2FsIGJyZWFrIjsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgWEZBX0lEU19JTExFR0FMQ09OVElOVUU6DQorICAgICAgd3NTdHJpbmcgPSBMImlsbGVnYWwgY29udGludWUiOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX0VYUEVDVEVEX09QRVJBVE9SOg0KKyAgICAgIHdzU3RyaW5nID0gTCJleHBlY3RlZCBvcGVyYXRvciAnJXMnIGluc3RlYWQgb2YgJyVzJyI7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfRElWSURFX1pFUk86DQorICAgICAgd3NTdHJpbmcgPSBMImRpdmlkZSBieSB6ZXJvIjsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgWEZBX0lEU19DQU5OT1RfQ09WRVJUX09CSkVDVDoNCisgICAgICB3c1N0cmluZyA9IEwiJXMuJXMgY2FuIG5vdCBjb3ZlcnQgdG8gb2JqZWN0IjsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgWEZBX0lEU19OT1RfRk9VTkRfQ09OVEFJTkVSOg0KKyAgICAgIHdzU3RyaW5nID0gTCJjYW4gbm90IGZvdW5kIGNvbnRhaW5lciAnJXMnIjsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgWEZBX0lEU19OT1RfRk9VTkRfUFJPUEVSVFk6DQorICAgICAgd3NTdHJpbmcgPSBMImNhbiBub3QgZm91bmQgcHJvcGVydHkgJyVzJyI7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfTk9UX0ZPVU5EX01FVEhPRDoNCisgICAgICB3c1N0cmluZyA9IEwiY2FuIG5vdCBmb3VuZCBtZXRob2QgJyVzJyI7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfTk9UX0ZPVU5EX0NPTlNUOg0KKyAgICAgIHdzU3RyaW5nID0gTCJjYW4gbm90IGZvdW5kIGNvbnN0ICclcyciOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX05PVF9BU1NJR05fT0JKRUNUOg0KKyAgICAgIHdzU3RyaW5nID0gTCJjYW4gbm90IGRpcmVjdCBhc3NpZ24gdmFsdWUgdG8gb2JqZWN0IjsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgWEZBX0lEU19JVkFMSURBVEVfSU5TVFJVQ1RJT046DQorICAgICAgd3NTdHJpbmcgPSBMImludmFsaWRhdGUgaW5zdHJ1Y3Rpb24iOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX0VYUEVDVF9OVU1CRVI6DQorICAgICAgd3NTdHJpbmcgPSBMImV4cGVjdGVkIG51bWJlciBpbnN0ZWFkIG9mICclcyciOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX1ZBTElEQVRFX09VVF9BUlJBWToNCisgICAgICB3c1N0cmluZyA9IEwidmFsaWRhdGUgYWNjZXNzIGluZGV4ICclcycgb3V0IG9mIGFycmF5IjsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgWEZBX0lEU19DQU5OT1RfQVNTSUdOX0lERU5UOg0KKyAgICAgIHdzU3RyaW5nID0gTCJjYW4gbm90IGFzc2lnbiB0byAlcyI7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfTk9UX0ZPVU5UX0ZVTkNUSU9OOg0KKyAgICAgIHdzU3RyaW5nID0gTCJjYW4gbm90IGZvdW5kICclcycgZnVuY3Rpb24iOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX05PVF9BUlJBWToNCisgICAgICB3c1N0cmluZyA9IEwiJyVzJyBkb2Vzbid0IGFuIGFycmF5IjsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgWEZBX0lEU19PVVRfQVJSQVk6DQorICAgICAgd3NTdHJpbmcgPSBMIm91dCBvZiByYW5nZSBvZiAnJXMnIGFycmF5IjsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgWEZBX0lEU19OT1RfU1VQUE9SVF9DQUxDOg0KKyAgICAgIHdzU3RyaW5nID0gTCInJXMnIG9wZXJhdG9yIGNhbiBub3Qgc3VwcG9ydCBhcnJheSBjYWxjdWxhdGUiOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX0FSR1VNRU5UX05PVF9BUlJBWToNCisgICAgICB3c1N0cmluZyA9IEwiJyVzJyBmdW5jdGlvbidzICVkIGFyZ3VtZW50IGNhbiBub3QgYmUgYXJyYXkiOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX0FSR1VNRU5UX0VYUEVDVF9DT05UQUlORVI6DQorICAgICAgd3NTdHJpbmcgPSBMIiclcycgYXJndW1lbnQgZXhwZWN0ZWQgYSBjb250YWluZXIiOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX0FDQ0VTU19QUk9QRVJUWV9JTl9OT1RfT0JKRUNUOg0KKyAgICAgIHdzU3RyaW5nID0NCisgICAgICAgICAgTCJhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIHJlZmVyZW5jZSBwcm9wZXJ0eSAnJXMnIG9mIGEgbm9uLW9iamVjdCBpbiAiDQorICAgICAgICAgIEwiU09NIGV4cHJlc3Npb24gJXMiOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX0ZVTkNUSU9OX0lTX0JVSUxESU46DQorICAgICAgd3NTdHJpbmcgPSBMImZ1bmN0aW9uICclcycgaXMgYnVpbGRpbiI7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfRVJST1JfTVNHOg0KKyAgICAgIHdzU3RyaW5nID0gTCIlcyA6ICVzIjsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgWEZBX0lEU19JTkRFWF9PVVRfT0ZfQk9VTkRTOg0KKyAgICAgIHdzU3RyaW5nID0gTCJJbmRleCB2YWx1ZSBpcyBvdXQgb2YgYm91bmRzIjsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRDoNCisgICAgICB3c1N0cmluZyA9IEwiSW5jb3JyZWN0IG51bWJlciBvZiBwYXJhbWV0ZXJzIGNhbGxpbmcgbWV0aG9kICclcyciOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX0FSR1VNRU5UX01JU01BVENIOg0KKyAgICAgIHdzU3RyaW5nID0gTCJBcmd1bWVudCBtaXNtYXRjaCBpbiBwcm9wZXJ0eSBvciBmdW5jdGlvbiBhcmd1bWVudCI7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfSU5WQUxJRF9FTlVNRVJBVEU6DQorICAgICAgd3NTdHJpbmcgPSBMIkludmFsaWQgZW51bWVyYXRlZCB2YWx1ZTogJXMiOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX0lOVkFMSURfQVBQRU5EOg0KKyAgICAgIHdzU3RyaW5nID0NCisgICAgICAgICAgTCJJbnZhbGlkIGFwcGVuZCBvcGVyYXRpb246ICVzIGNhbm5vdCBoYXZlIGEgY2hpbGQgZWxlbWVudCBvZiAlcyI7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfU09NX0VYUEVDVEVEX0xJU1Q6DQorICAgICAgd3NTdHJpbmcgPQ0KKyAgICAgICAgICBMIlNPTSBleHByZXNzaW9uIHJldHVybmVkIGxpc3Qgd2hlbiBzaW5nbGUgcmVzdWx0IHdhcyBleHBlY3RlZCI7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfTk9UX0hBVkVfUFJPUEVSVFk6DQorICAgICAgd3NTdHJpbmcgPSBMIiclcycgZG9lc24ndCBoYXZlIHByb3BlcnR5ICclcyciOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX0lOVkFMSURfTk9ERV9UWVBFOg0KKyAgICAgIHdzU3RyaW5nID0gTCJJbnZhbGlkIG5vZGUgdHlwZSA6ICclcyciOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX1ZJT0xBVEVfQk9VTkRBUlk6DQorICAgICAgd3NTdHJpbmcgPQ0KKyAgICAgICAgICBMIlRoZSBlbGVtZW50IFslc10gaGFzIHZpb2xhdGVkIGl0cyBhbGxvd2FibGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIjsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgWEZBX0lEU19TRVJWRVJfREVOWToNCisgICAgICB3c1N0cmluZyA9IEwiU2VydmVyIGRvZXMgbm90IHBlcm1pdCI7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfVmFsaWRhdGVMaW1pdDoNCisgICAgICB3c1N0cmluZyA9IEZYX1dTVFJDKA0KKyAgICAgICAgICBMIk1lc3NhZ2UgbGltaXQgZXhjZWVkZWQuIFJlbWFpbmluZyAlZCB2YWxpZGF0aW9uIGVycm9ycyBub3QgIg0KKyAgICAgICAgICBMInJlcG9ydGVkLiIpOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX1ZhbGlkYXRlTnVsbFdhcm5pbmc6DQorICAgICAgd3NTdHJpbmcgPSBGWF9XU1RSQygNCisgICAgICAgICAgTCIlcyBjYW5ub3QgYmUgbGVmdCBibGFuay4gVG8gaWdub3JlIHZhbGlkYXRpb25zIGZvciAlcywgY2xpY2sgIg0KKyAgICAgICAgICBMIklnbm9yZS4iKTsNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgWEZBX0lEU19WYWxpZGF0ZU51bGxFcnJvcjoNCisgICAgICB3c1N0cmluZyA9IEZYX1dTVFJDKEwiJXMgY2Fubm90IGJlIGxlZnQgYmxhbmsuIik7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9JRFNfVmFsaWRhdGVXYXJuaW5nOg0KKyAgICAgIHdzU3RyaW5nID0gRlhfV1NUUkMoDQorICAgICAgICAgIEwiVGhlIHZhbHVlIHlvdSBlbnRlcmVkIGZvciAlcyBpcyBpbnZhbGlkLiBUbyBpZ25vcmUgdmFsaWRhdGlvbnMgZm9yICINCisgICAgICAgICAgTCIlcywgY2xpY2sgSWdub3JlLiIpOw0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSBYRkFfSURTX1ZhbGlkYXRlRXJyb3I6DQorICAgICAgd3NTdHJpbmcgPSBGWF9XU1RSQyhMIlRoZSB2YWx1ZSB5b3UgZW50ZXJlZCBmb3IgJXMgaXMgaW52YWxpZC4iKTsNCisgICAgICByZXR1cm47DQorICB9DQorfQ0KKw0KK0ZYX0JPT0wgQ1BERlhGQV9BcHA6OlNob3dGaWxlRGlhbG9nKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUaXRsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRmlsdGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQXJyYXkmIHdzUGF0aEFyciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJPcGVuKSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KKw0KK0lGV0xfQWRhcHRlclRpbWVyTWdyKiBDUERGWEZBX0FwcDo6R2V0VGltZXJNZ3IoKSB7DQorICBDWEZBX0ZXTEFkYXB0ZXJUaW1lck1nciogcEFkYXB0ZXIgPSBOVUxMOw0KKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcEVudkxpc3QuR2V0QXQoMCk7DQorICBpZiAocEVudikNCisgICAgcEFkYXB0ZXIgPSBuZXcgQ1hGQV9GV0xBZGFwdGVyVGltZXJNZ3IocEVudik7DQorICByZXR1cm4gcEFkYXB0ZXI7DQorfQ0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZ4ZmEvZnBkZnhmYV9kb2MuY3BwIGIvZnBkZnNkay9zcmMvZnBkZnhmYS9mcGRmeGZhX2RvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJkMTZiNgotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZ4ZmEvZnBkZnhmYV9kb2MuY3BwCkBAIC0wLDAgKzEsMTI2MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiDQorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfZG9jLmgiDQorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mc2RrX21nci5oIg0KKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX2FwcC5oIg0KKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX3V0aWwuaCINCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9wYWdlLmgiDQorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiDQorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2Zvcm1maWxsLmgiDQorDQorI2RlZmluZSBJRFNfWEZBX1ZhbGlkYXRlX0lucHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgIkF0IGxlYXN0IG9uZSByZXF1aXJlZCBmaWVsZCB3YXMgZW1wdHkuIFBsZWFzZSBmaWxsIGluIHRoZSByZXF1aXJlZCAiIFwNCisgICJmaWVsZHNcclxuKGhpZ2hsaWdodGVkKSBiZWZvcmUgY29udGludWluZy4iDQorDQorLy8gc3VibWl0DQorI2RlZmluZSBGWEZBX0NPTkZJRyAweDAwMDAwMDAxDQorI2RlZmluZSBGWEZBX1RFTVBMQVRFIDB4MDAwMDAwMTANCisjZGVmaW5lIEZYRkFfTE9DQUxFU0VUIDB4MDAwMDAxMDANCisjZGVmaW5lIEZYRkFfREFUQVNFVFMgMHgwMDAwMTAwMA0KKyNkZWZpbmUgRlhGQV9YTVBNRVRBIDB4MDAwMTAwMDANCisjZGVmaW5lIEZYRkFfWEZERiAweDAwMTAwMDAwDQorI2RlZmluZSBGWEZBX0ZPUk0gMHgwMTAwMDAwMA0KKyNkZWZpbmUgRlhGQV9QREYgMHgxMDAwMDAwMA0KKw0KKyNpZm5kZWYgX1dJTjMyDQorZXh0ZXJuIHZvaWQgU2V0TGFzdEVycm9yKGludCBlcnIpOw0KKw0KK2V4dGVybiBpbnQgR2V0TGFzdEVycm9yKCk7DQorI2VuZGlmDQorDQorQ1BERlhGQV9Eb2N1bWVudDo6Q1BERlhGQV9Eb2N1bWVudChDUERGX0RvY3VtZW50KiBwUERGRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlhGQV9BcHAqIHBQcm92aWRlcikNCisgICAgOiBtX2lEb2NUeXBlKERPQ1RZUEVfUERGKSwNCisgICAgICBtX3BQREZEb2MocFBERkRvYyksDQorICAgICAgbV9wU0RLRG9jKG51bGxwdHIpLA0KKyAgICAgIG1fcFhGQURvYyhudWxscHRyKSwNCisgICAgICBtX3BYRkFEb2NWaWV3KG51bGxwdHIpLA0KKyAgICAgIG1fcEFwcChwUHJvdmlkZXIpLA0KKyAgICAgIG1fcEpTQ29udGV4dChudWxscHRyKSB7DQorfQ0KKw0KK0NQREZYRkFfRG9jdW1lbnQ6On5DUERGWEZBX0RvY3VtZW50KCkgew0KKyAgaWYgKG1fcEpTQ29udGV4dCAmJiBtX3BTREtEb2MgJiYgbV9wU0RLRG9jLT5HZXRFbnYoKSkNCisgICAgbV9wU0RLRG9jLT5HZXRFbnYoKS0+R2V0SlNSdW50aW1lKCktPlJlbGVhc2VDb250ZXh0KG1fcEpTQ29udGV4dCk7DQorDQorICBkZWxldGUgbV9wU0RLRG9jOw0KKw0KKyAgaWYgKG1fcFBERkRvYykgew0KKyAgICBDUERGX1BhcnNlciogcFBhcnNlciA9IG1fcFBERkRvYy0+R2V0UGFyc2VyKCk7DQorICAgIGlmIChwUGFyc2VyKQ0KKyAgICAgIGRlbGV0ZSBwUGFyc2VyOw0KKyAgICBlbHNlDQorICAgICAgZGVsZXRlIG1fcFBERkRvYzsNCisgIH0NCisgIGlmIChtX3BYRkFEb2MpIHsNCisgICAgSVhGQV9BcHAqIHBBcHAgPSBtX3BBcHAtPkdldFhGQUFwcCgpOw0KKyAgICBpZiAocEFwcCkgew0KKyAgICAgIElYRkFfRG9jSGFuZGxlciogcERvY0hhbmRsZXIgPSBwQXBwLT5HZXREb2NIYW5kbGVyKCk7DQorICAgICAgaWYgKHBEb2NIYW5kbGVyKSB7DQorICAgICAgICBDbG9zZVhGQURvYyhwRG9jSGFuZGxlcik7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGRlbGV0ZSBtX3BYRkFEb2M7DQorICB9DQorfQ0KKw0KK0ZYX0JPT0wgQ1BERlhGQV9Eb2N1bWVudDo6TG9hZFhGQURvYygpIHsNCisgIGlmICghbV9wUERGRG9jKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorDQorICBtX1hGQVBhZ2VMaXN0LlJlbW92ZUFsbCgpOw0KKw0KKyAgSVhGQV9BcHAqIHBBcHAgPSBtX3BBcHAtPkdldFhGQUFwcCgpOw0KKyAgaWYgKCFwQXBwKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorDQorICBtX3BYRkFEb2MgPSBwQXBwLT5DcmVhdGVEb2ModGhpcywgbV9wUERGRG9jKTsNCisgIGlmICghbV9wWEZBRG9jKSB7DQorICAgIFNldExhc3RFcnJvcihGUERGX0VSUl9YRkFMT0FEKTsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKw0KKyAgSVhGQV9Eb2NIYW5kbGVyKiBwRG9jSGFuZGxlciA9IHBBcHAtPkdldERvY0hhbmRsZXIoKTsNCisgIGlmICghcERvY0hhbmRsZXIpIHsNCisgICAgU2V0TGFzdEVycm9yKEZQREZfRVJSX1hGQUxPQUQpOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorDQorICBwRG9jSGFuZGxlci0+U3RhcnRMb2FkKG1fcFhGQURvYyk7DQorICBpbnQgaVN0YXR1cyA9IHBEb2NIYW5kbGVyLT5Eb0xvYWQobV9wWEZBRG9jLCBOVUxMKTsNCisgIGlmIChpU3RhdHVzICE9IFhGQV9QQVJTRVNUQVRVU19Eb25lKSB7DQorICAgIENsb3NlWEZBRG9jKHBEb2NIYW5kbGVyKTsNCisgICAgU2V0TGFzdEVycm9yKEZQREZfRVJSX1hGQUxPQUQpOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBwRG9jSGFuZGxlci0+U3RvcExvYWQobV9wWEZBRG9jKTsNCisgIHBEb2NIYW5kbGVyLT5TZXRKU0VSdW50aW1lKG1fcFhGQURvYywgbV9wQXBwLT5HZXRKU0VSdW50aW1lKCkpOw0KKw0KKyAgaWYgKHBEb2NIYW5kbGVyLT5HZXREb2NUeXBlKG1fcFhGQURvYykgPT0gWEZBX0RPQ1RZUEVfRHluYW1pYykNCisgICAgbV9pRG9jVHlwZSA9IERPQ1RZUEVfRFlOQU1JQ19YRkE7DQorICBlbHNlDQorICAgIG1faURvY1R5cGUgPSBET0NUWVBFX1NUQVRJQ19YRkE7DQorDQorICBtX3BYRkFEb2NWaWV3ID0gcERvY0hhbmRsZXItPkNyZWF0ZURvY1ZpZXcobV9wWEZBRG9jLCBYRkFfRE9DVklFV19WaWV3KTsNCisgIGlmIChtX3BYRkFEb2NWaWV3LT5TdGFydExheW91dCgpIDwgMCkgew0KKyAgICBDbG9zZVhGQURvYyhwRG9jSGFuZGxlcik7DQorICAgIFNldExhc3RFcnJvcihGUERGX0VSUl9YRkFMQVlPVVQpOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorDQorICBtX3BYRkFEb2NWaWV3LT5Eb0xheW91dChOVUxMKTsNCisgIG1fcFhGQURvY1ZpZXctPlN0b3BMYXlvdXQoKTsNCisgIHJldHVybiBUUlVFOw0KK30NCisNCitpbnQgQ1BERlhGQV9Eb2N1bWVudDo6R2V0UGFnZUNvdW50KCkgew0KKyAgaWYgKCFtX3BQREZEb2MgJiYgIW1fcFhGQURvYykNCisgICAgcmV0dXJuIDA7DQorDQorICBzd2l0Y2ggKG1faURvY1R5cGUpIHsNCisgICAgY2FzZSBET0NUWVBFX1BERjoNCisgICAgY2FzZSBET0NUWVBFX1NUQVRJQ19YRkE6DQorICAgICAgaWYgKG1fcFBERkRvYykNCisgICAgICAgIHJldHVybiBtX3BQREZEb2MtPkdldFBhZ2VDb3VudCgpOw0KKyAgICBjYXNlIERPQ1RZUEVfRFlOQU1JQ19YRkE6DQorICAgICAgaWYgKG1fcFhGQURvYykNCisgICAgICAgIHJldHVybiBtX3BYRkFEb2NWaWV3LT5Db3VudFBhZ2VWaWV3cygpOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiAwOw0KKyAgfQ0KKw0KKyAgcmV0dXJuIDA7DQorfQ0KKw0KK0NQREZYRkFfUGFnZSogQ1BERlhGQV9Eb2N1bWVudDo6R2V0UGFnZShpbnQgcGFnZV9pbmRleCkgew0KKyAgaWYgKCFtX3BQREZEb2MgJiYgIW1fcFhGQURvYykNCisgICAgcmV0dXJuIE5VTEw7DQorDQorICBDUERGWEZBX1BhZ2UqIHBQYWdlID0gTlVMTDsNCisgIGlmIChtX1hGQVBhZ2VMaXN0LkdldFNpemUoKSkgew0KKyAgICBwUGFnZSA9IG1fWEZBUGFnZUxpc3QuR2V0QXQocGFnZV9pbmRleCk7DQorICAgIGlmIChwUGFnZSkNCisgICAgICBwUGFnZS0+QWRkUmVmKCk7DQorICB9IGVsc2Ugew0KKyAgICBtX1hGQVBhZ2VMaXN0LlNldFNpemUoR2V0UGFnZUNvdW50KCkpOw0KKyAgfQ0KKw0KKyAgaWYgKCFwUGFnZSkgew0KKyAgICBwUGFnZSA9IG5ldyBDUERGWEZBX1BhZ2UodGhpcywgcGFnZV9pbmRleCk7DQorICAgIEZYX0JPT0wgYlJldCA9IHBQYWdlLT5Mb2FkUGFnZSgpOw0KKyAgICBpZiAoIWJSZXQpIHsNCisgICAgICBkZWxldGUgcFBhZ2U7DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisNCisgICAgbV9YRkFQYWdlTGlzdC5TZXRBdChwYWdlX2luZGV4LCBwUGFnZSk7DQorICB9DQorDQorICByZXR1cm4gcFBhZ2U7DQorfQ0KKw0KK0NQREZYRkFfUGFnZSogQ1BERlhGQV9Eb2N1bWVudDo6R2V0UGFnZShJWEZBX1BhZ2VWaWV3KiBwUGFnZSkgew0KKyAgaWYgKCFwUGFnZSkNCisgICAgcmV0dXJuIE5VTEw7DQorDQorICBpZiAoIW1fcFhGQURvYykNCisgICAgcmV0dXJuIE5VTEw7DQorDQorICBpZiAobV9pRG9jVHlwZSAhPSBET0NUWVBFX0RZTkFNSUNfWEZBKQ0KKyAgICByZXR1cm4gTlVMTDsNCisNCisgIGludCBuU2l6ZSA9IG1fWEZBUGFnZUxpc3QuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuU2l6ZTsgaSsrKSB7DQorICAgIENQREZYRkFfUGFnZSogcFRlbXBQYWdlID0gbV9YRkFQYWdlTGlzdC5HZXRBdChpKTsNCisgICAgaWYgKCFwVGVtcFBhZ2UpDQorICAgICAgY29udGludWU7DQorICAgIGlmIChwVGVtcFBhZ2UtPkdldFhGQVBhZ2VWaWV3KCkgJiYgcFRlbXBQYWdlLT5HZXRYRkFQYWdlVmlldygpID09IHBQYWdlKQ0KKyAgICAgIHJldHVybiBwVGVtcFBhZ2U7DQorICB9DQorDQorICByZXR1cm4gTlVMTDsNCit9DQorDQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpSZW1vdmVQYWdlKENQREZYRkFfUGFnZSogcGFnZSkgew0KKyAgbV9YRkFQYWdlTGlzdC5TZXRBdChwYWdlLT5HZXRQYWdlSW5kZXgoKSwgTlVMTCk7DQorfQ0KKw0KK0NQREZTREtfRG9jdW1lbnQqIENQREZYRkFfRG9jdW1lbnQ6OkdldFNES0RvY3VtZW50KA0KKyAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIHsNCisgIGlmICghbV9wU0RLRG9jICYmIHBGb3JtRmlsbEVudikNCisgICAgbV9wU0RLRG9jID0gbmV3IENQREZTREtfRG9jdW1lbnQodGhpcywgcEZvcm1GaWxsRW52KTsNCisgIHJldHVybiBtX3BTREtEb2M7DQorfQ0KKw0KK3ZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6RlhSZWN0MlBERlJlY3QoY29uc3QgQ0ZYX1JlY3RGJiBmeFJlY3RGLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZWN0JiBwZGZSZWN0KSB7DQorICBwZGZSZWN0LmxlZnQgPSBmeFJlY3RGLmxlZnQ7DQorICBwZGZSZWN0LnRvcCA9IGZ4UmVjdEYuYm90dG9tKCk7DQorICBwZGZSZWN0LnJpZ2h0ID0gZnhSZWN0Ri5yaWdodCgpOw0KKyAgcGRmUmVjdC5ib3R0b20gPSBmeFJlY3RGLnRvcDsNCit9DQorDQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpTZXRDaGFuZ2VNYXJrKElYRkFfRG9jKiBoRG9jKSB7DQorICBpZiAoaERvYyA9PSBtX3BYRkFEb2MgJiYgbV9wU0RLRG9jKSB7DQorICAgIG1fcFNES0RvYy0+U2V0Q2hhbmdlTWFyaygpOw0KKyAgfQ0KK30NCisNCitGWF9CT09MIENQREZYRkFfRG9jdW1lbnQ6OkdldENoYW5nZU1hcmsoSVhGQV9Eb2MqIGhEb2MpIHsNCisgIGlmIChoRG9jID09IG1fcFhGQURvYyAmJiBtX3BTREtEb2MpDQorICAgIHJldHVybiBtX3BTREtEb2MtPkdldENoYW5nZU1hcmsoKTsNCisgIHJldHVybiBGQUxTRTsNCit9DQorDQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpJbnZhbGlkYXRlUmVjdChJWEZBX1BhZ2VWaWV3KiBwUGFnZVZpZXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncyAvKiA9IDAgKi8pIHsNCisgIGlmICghbV9wWEZBRG9jIHx8ICFtX3BTREtEb2MpDQorICAgIHJldHVybjsNCisNCisgIGlmIChtX2lEb2NUeXBlICE9IERPQ1RZUEVfRFlOQU1JQ19YRkEpDQorICAgIHJldHVybjsNCisNCisgIENQREZfUmVjdCByY1BhZ2U7DQorICBGWFJlY3QyUERGUmVjdChydCwgcmNQYWdlKTsNCisNCisgIENQREZYRkFfUGFnZSogcFBhZ2UgPSBHZXRQYWdlKHBQYWdlVmlldyk7DQorDQorICBpZiAocFBhZ2UgPT0gTlVMTCkNCisgICAgcmV0dXJuOw0KKw0KKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7DQorICBpZiAoIXBFbnYpDQorICAgIHJldHVybjsNCisNCisgIHBFbnYtPkZGSV9JbnZhbGlkYXRlKChGUERGX1BBR0UpcFBhZ2UsIHJjUGFnZS5sZWZ0LCByY1BhZ2UuYm90dG9tLA0KKyAgICAgICAgICAgICAgICAgICAgICAgcmNQYWdlLnJpZ2h0LCByY1BhZ2UudG9wKTsNCit9DQorDQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpJbnZhbGlkYXRlUmVjdChJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MgLyogPSAwICovKSB7DQorICBpZiAoIWhXaWRnZXQpDQorICAgIHJldHVybjsNCisNCisgIGlmICghbV9wWEZBRG9jIHx8ICFtX3BTREtEb2MgfHwgIW1fcFhGQURvY1ZpZXcpDQorICAgIHJldHVybjsNCisNCisgIGlmIChtX2lEb2NUeXBlICE9IERPQ1RZUEVfRFlOQU1JQ19YRkEpDQorICAgIHJldHVybjsNCisNCisgIElYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBtX3BYRkFEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCk7DQorICBpZiAoIXBXaWRnZXRIYW5kbGVyKQ0KKyAgICByZXR1cm47DQorDQorICBJWEZBX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwV2lkZ2V0SGFuZGxlci0+R2V0UGFnZVZpZXcoaFdpZGdldCk7DQorICBpZiAoIXBQYWdlVmlldykNCisgICAgcmV0dXJuOw0KKw0KKyAgQ0ZYX1JlY3RGIHJlY3Q7DQorICBwV2lkZ2V0SGFuZGxlci0+R2V0UmVjdChoV2lkZ2V0LCByZWN0KTsNCisgIEludmFsaWRhdGVSZWN0KHBQYWdlVmlldywgcmVjdCwgZHdGbGFncyk7DQorfQ0KKw0KK3ZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6RGlzcGxheUNhcmV0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZpc2libGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUnRBbmNob3IpIHsNCisgIGlmICghaFdpZGdldCB8fCBwUnRBbmNob3IgPT0gTlVMTCkNCisgICAgcmV0dXJuOw0KKw0KKyAgaWYgKCFtX3BYRkFEb2MgfHwgIW1fcFNES0RvYyB8fCAhbV9wWEZBRG9jVmlldykNCisgICAgcmV0dXJuOw0KKw0KKyAgaWYgKG1faURvY1R5cGUgIT0gRE9DVFlQRV9EWU5BTUlDX1hGQSkNCisgICAgcmV0dXJuOw0KKw0KKyAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IG1fcFhGQURvY1ZpZXctPkdldFdpZGdldEhhbmRsZXIoKTsNCisgIGlmICghcFdpZGdldEhhbmRsZXIpDQorICAgIHJldHVybjsNCisNCisgIElYRkFfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBXaWRnZXRIYW5kbGVyLT5HZXRQYWdlVmlldyhoV2lkZ2V0KTsNCisgIGlmICghcFBhZ2VWaWV3KQ0KKyAgICByZXR1cm47DQorDQorICBDUERGWEZBX1BhZ2UqIHBQYWdlID0gR2V0UGFnZShwUGFnZVZpZXcpOw0KKw0KKyAgaWYgKHBQYWdlID09IE5VTEwpDQorICAgIHJldHVybjsNCisNCisgIENQREZfUmVjdCByY0NhcmV0Ow0KKyAgRlhSZWN0MlBERlJlY3QoKnBSdEFuY2hvciwgcmNDYXJldCk7DQorDQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCisgIGlmICghcEVudikNCisgICAgcmV0dXJuOw0KKw0KKyAgcEVudi0+RkZJX0Rpc3BsYXlDYXJldCgoRlBERl9QQUdFKXBQYWdlLCBiVmlzaWJsZSwgcmNDYXJldC5sZWZ0LCByY0NhcmV0LnRvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgcmNDYXJldC5yaWdodCwgcmNDYXJldC5ib3R0b20pOw0KK30NCisNCitGWF9CT09MIENQREZYRkFfRG9jdW1lbnQ6OkdldFBvcHVwUG9zKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1pblBvcHVwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1heFBvcHVwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRQb3B1cCkgew0KKyAgaWYgKE5VTEwgPT0gaFdpZGdldCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBJWEZBX1BhZ2VWaWV3KiBwWEZBUGFnZVZpZXcgPQ0KKyAgICAgIG1fcFhGQURvY1ZpZXctPkdldFdpZGdldEhhbmRsZXIoKS0+R2V0UGFnZVZpZXcoaFdpZGdldCk7DQorICBpZiAoTlVMTCA9PSBwWEZBUGFnZVZpZXcpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ1BERlhGQV9QYWdlKiBwUGFnZSA9IEdldFBhZ2UocFhGQVBhZ2VWaWV3KTsNCisgIGlmIChwUGFnZSA9PSBOVUxMKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorDQorICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9DQorICAgICAgbV9wWEZBRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpLT5HZXREYXRhQWNjKGhXaWRnZXQpOw0KKw0KKyAgaW50IG5Sb3RhdGUgPSAwOw0KKyNpZmRlZiBQREZfRU5BQkxFX1hGQQ0KKyAgblJvdGF0ZSA9IHBXaWRnZXRBY2MtPkdldFJvdGF0ZSgpOw0KKyNlbmRpZg0KKw0KKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7DQorICBpZiAocEVudiA9PSBOVUxMKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBGU19SRUNURiBwYWdlVmlld1JlY3Q7DQorICBwRW52LT5GRklfR2V0UGFnZVZpZXdSZWN0KHBQYWdlLCBwYWdlVmlld1JlY3QpOw0KKw0KKyAgQ1BERl9SZWN0IHJjQW5jaG9yOw0KKw0KKyAgcmNBbmNob3IubGVmdCA9IHJ0QW5jaG9yLmxlZnQ7DQorICByY0FuY2hvci50b3AgPSBydEFuY2hvci5ib3R0b20oKTsNCisgIHJjQW5jaG9yLnJpZ2h0ID0gcnRBbmNob3IucmlnaHQoKTsNCisgIHJjQW5jaG9yLmJvdHRvbSA9IHJ0QW5jaG9yLnRvcDsNCisNCisgIGludCB0MSwgdDIsIHQ7DQorICBGWF9EV09SRCBkd1BvczsNCisgIEZYX0ZMT0FUIGZQb3VwSGVpZ2h0Ow0KKyAgc3dpdGNoIChuUm90YXRlKSB7DQorICAgIGNhc2UgOTA6IHsNCisgICAgICB0MSA9IChpbnQpKHBhZ2VWaWV3UmVjdC5yaWdodCAtIHJjQW5jaG9yLnJpZ2h0KTsNCisgICAgICB0MiA9IChpbnQpKHJjQW5jaG9yLmxlZnQgLSBwYWdlVmlld1JlY3QubGVmdCk7DQorICAgICAgaWYgKHJjQW5jaG9yLmJvdHRvbSA8IHBhZ2VWaWV3UmVjdC5ib3R0b20pIHsNCisgICAgICAgIHJ0UG9wdXAubGVmdCArPSByY0FuY2hvci5ib3R0b20gLSBwYWdlVmlld1JlY3QuYm90dG9tOw0KKyAgICAgIH0NCisNCisgICAgICBicmVhazsNCisgICAgfQ0KKw0KKyAgICBjYXNlIDE4MDogew0KKyAgICAgIHQyID0gKGludCkocGFnZVZpZXdSZWN0LnRvcCAtIHJjQW5jaG9yLnRvcCk7DQorICAgICAgdDEgPSAoaW50KShyY0FuY2hvci5ib3R0b20gLSBwYWdlVmlld1JlY3QuYm90dG9tKTsNCisgICAgICBpZiAocmNBbmNob3IubGVmdCA8IHBhZ2VWaWV3UmVjdC5sZWZ0KSB7DQorICAgICAgICBydFBvcHVwLmxlZnQgKz0gcmNBbmNob3IubGVmdCAtIHBhZ2VWaWV3UmVjdC5sZWZ0Ow0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIDI3MDogew0KKyAgICAgIHQxID0gKGludCkocmNBbmNob3IubGVmdCAtIHBhZ2VWaWV3UmVjdC5sZWZ0KTsNCisgICAgICB0MiA9IChpbnQpKHBhZ2VWaWV3UmVjdC5yaWdodCAtIHJjQW5jaG9yLnJpZ2h0KTsNCisNCisgICAgICBpZiAocmNBbmNob3IudG9wID4gcGFnZVZpZXdSZWN0LnRvcCkgew0KKyAgICAgICAgcnRQb3B1cC5sZWZ0IC09IHJjQW5jaG9yLnRvcCAtIHBhZ2VWaWV3UmVjdC50b3A7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgMDoNCisgICAgZGVmYXVsdDogew0KKyAgICAgIHQxID0gKGludCkocGFnZVZpZXdSZWN0LnRvcCAtIHJjQW5jaG9yLnRvcCk7DQorICAgICAgdDIgPSAoaW50KShyY0FuY2hvci5ib3R0b20gLSBwYWdlVmlld1JlY3QuYm90dG9tKTsNCisgICAgICBpZiAocmNBbmNob3IucmlnaHQgPiBwYWdlVmlld1JlY3QucmlnaHQpIHsNCisgICAgICAgIHJ0UG9wdXAubGVmdCAtPSByY0FuY2hvci5yaWdodCAtIHBhZ2VWaWV3UmVjdC5yaWdodDsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisNCisgIGlmICh0MSA8PSAwICYmIHQyIDw9IDApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHQxIDw9IDApIHsNCisgICAgdCA9IHQyOw0KKyAgICBkd1BvcyA9IDE7DQorICB9IGVsc2UgaWYgKHQyIDw9IDApIHsNCisgICAgdCA9IHQxOw0KKyAgICBkd1BvcyA9IDA7DQorICB9IGVsc2UgaWYgKHQxID4gdDIpIHsNCisgICAgdCA9IHQxOw0KKyAgICBkd1BvcyA9IDA7DQorICB9IGVsc2Ugew0KKyAgICB0ID0gdDI7DQorICAgIGR3UG9zID0gMTsNCisgIH0NCisgIGlmICh0IDwgZk1pblBvcHVwKSB7DQorICAgIGZQb3VwSGVpZ2h0ID0gZk1pblBvcHVwOw0KKyAgfSBlbHNlIGlmICh0ID4gZk1heFBvcHVwKSB7DQorICAgIGZQb3VwSGVpZ2h0ID0gZk1heFBvcHVwOw0KKyAgfSBlbHNlIHsNCisgICAgZlBvdXBIZWlnaHQgPSAoRlhfRkxPQVQpdDsNCisgIH0NCisNCisgIHN3aXRjaCAoblJvdGF0ZSkgew0KKyAgICBjYXNlIDA6DQorICAgIGNhc2UgMTgwOiB7DQorICAgICAgaWYgKGR3UG9zID09IDApIHsNCisgICAgICAgIHJ0UG9wdXAudG9wID0gcnRBbmNob3IuaGVpZ2h0Ow0KKyAgICAgICAgcnRQb3B1cC5oZWlnaHQgPSBmUG91cEhlaWdodDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcnRQb3B1cC50b3AgPSAtZlBvdXBIZWlnaHQ7DQorICAgICAgICBydFBvcHVwLmhlaWdodCA9IGZQb3VwSGVpZ2h0Ow0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIDkwOg0KKyAgICBjYXNlIDI3MDogew0KKyAgICAgIGlmIChkd1BvcyA9PSAwKSB7DQorICAgICAgICBydFBvcHVwLnRvcCA9IHJ0QW5jaG9yLndpZHRoOw0KKyAgICAgICAgcnRQb3B1cC5oZWlnaHQgPSBmUG91cEhlaWdodDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcnRQb3B1cC50b3AgPSAtZlBvdXBIZWlnaHQ7DQorICAgICAgICBydFBvcHVwLmhlaWdodCA9IGZQb3VwSGVpZ2h0Ow0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KKw0KK0ZYX0JPT0wgQ1BERlhGQV9Eb2N1bWVudDo6UG9wdXBNZW51KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Qb2ludEYgcHRQb3B1cCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0RXhjbHVkZSkgew0KKyAgaWYgKE5VTEwgPT0gaFdpZGdldCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBJWEZBX1BhZ2VWaWV3KiBwWEZBUGFnZVZpZXcgPQ0KKyAgICAgIG1fcFhGQURvY1ZpZXctPkdldFdpZGdldEhhbmRsZXIoKS0+R2V0UGFnZVZpZXcoaFdpZGdldCk7DQorICBpZiAocFhGQVBhZ2VWaWV3ID09IE5VTEwpDQorICAgIHJldHVybiBGQUxTRTsNCisgIENQREZYRkFfUGFnZSogcFBhZ2UgPSBHZXRQYWdlKHBYRkFQYWdlVmlldyk7DQorDQorICBpZiAocFBhZ2UgPT0gTlVMTCkNCisgICAgcmV0dXJuIEZBTFNFOw0KKw0KKyAgaW50IG1lbnVGbGFnID0gMDsNCisNCisgIElYRkFfTWVudUhhbmRsZXIqIHBYRkFNZW51SGFuZGVyID0gbV9wQXBwLT5HZXRYRkFBcHAoKS0+R2V0TWVudUhhbmRsZXIoKTsNCisgIGlmIChwWEZBTWVudUhhbmRlci0+Q2FuVW5kbyhoV2lkZ2V0KSkNCisgICAgbWVudUZsYWcgfD0gRlhGQV9NRU1VX1VORE87DQorICBpZiAocFhGQU1lbnVIYW5kZXItPkNhblJlZG8oaFdpZGdldCkpDQorICAgIG1lbnVGbGFnIHw9IEZYRkFfTUVNVV9SRURPOw0KKyAgaWYgKHBYRkFNZW51SGFuZGVyLT5DYW5QYXN0ZShoV2lkZ2V0KSkNCisgICAgbWVudUZsYWcgfD0gRlhGQV9NRU1VX1BBU1RFOw0KKyAgaWYgKHBYRkFNZW51SGFuZGVyLT5DYW5Db3B5KGhXaWRnZXQpKQ0KKyAgICBtZW51RmxhZyB8PSBGWEZBX01FTVVfQ09QWTsNCisgIGlmIChwWEZBTWVudUhhbmRlci0+Q2FuQ3V0KGhXaWRnZXQpKQ0KKyAgICBtZW51RmxhZyB8PSBGWEZBX01FTVVfQ1VUOw0KKyAgaWYgKHBYRkFNZW51SGFuZGVyLT5DYW5TZWxlY3RBbGwoaFdpZGdldCkpDQorICAgIG1lbnVGbGFnIHw9IEZYRkFfTUVNVV9TRUxFQ1RBTEw7DQorDQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCisgIGlmIChwRW52ID09IE5VTEwpDQorICAgIHJldHVybiBGQUxTRTsNCisNCisgIHJldHVybiBwRW52LT5GRklfUG9wdXBNZW51KHBQYWdlLCBoV2lkZ2V0LCBtZW51RmxhZywgcHRQb3B1cCwgTlVMTCk7DQorfQ0KKw0KK3ZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6UGFnZVZpZXdFdmVudChJWEZBX1BhZ2VWaWV3KiBwUGFnZVZpZXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpIHsNCit9DQorDQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpXaWRnZXRFdmVudChJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0RGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RXZlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwQWRkaXRpb25hbCkgew0KKyAgaWYgKG1faURvY1R5cGUgIT0gRE9DVFlQRV9EWU5BTUlDX1hGQSB8fCAhaFdpZGdldCkNCisgICAgcmV0dXJuOw0KKw0KKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7DQorICBpZiAoIXBFbnYpDQorICAgIHJldHVybjsNCisNCisgIElYRkFfUGFnZVZpZXcqIHBQYWdlVmlldyA9DQorICAgICAgbV9wWEZBRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpLT5HZXRQYWdlVmlldyhoV2lkZ2V0KTsNCisgIGlmIChwUGFnZVZpZXcgPT0gTlVMTCkNCisgICAgcmV0dXJuOw0KKw0KKyAgQ1BERlhGQV9QYWdlKiBwWEZBUGFnZSA9IEdldFBhZ2UocFBhZ2VWaWV3KTsNCisgIGlmIChwWEZBUGFnZSA9PSBOVUxMKQ0KKyAgICByZXR1cm47DQorDQorICBDUERGU0RLX1BhZ2VWaWV3KiBwU2RrUGFnZVZpZXcgPSBtX3BTREtEb2MtPkdldFBhZ2VWaWV3KHBYRkFQYWdlKTsNCisgIGlmIChkd0V2ZW50ID09IFhGQV9XSURHRVRFVkVOVF9Qb3N0QWRkZWQpIHsNCisgICAgcFNka1BhZ2VWaWV3LT5BZGRBbm5vdChoV2lkZ2V0KTsNCisNCisgIH0gZWxzZSBpZiAoZHdFdmVudCA9PSBYRkFfV0lER0VURVZFTlRfUHJlUmVtb3ZlZCkgew0KKyAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBwU2RrUGFnZVZpZXctPkdldEFubm90QnlYRkFXaWRnZXQoaFdpZGdldCk7DQorICAgIGlmIChwQW5ub3QpIHsNCisgICAgICBwU2RrUGFnZVZpZXctPkRlbGV0ZUFubm90KHBBbm5vdCk7DQorICAgIH0NCisgIH0NCit9DQorDQoraW50MzJfdCBDUERGWEZBX0RvY3VtZW50OjpDb3VudFBhZ2VzKElYRkFfRG9jKiBoRG9jKSB7DQorICBpZiAoaERvYyA9PSBtX3BYRkFEb2MgJiYgbV9wU0RLRG9jKSB7DQorICAgIHJldHVybiBHZXRQYWdlQ291bnQoKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCitpbnQzMl90IENQREZYRkFfRG9jdW1lbnQ6OkdldEN1cnJlbnRQYWdlKElYRkFfRG9jKiBoRG9jKSB7DQorICBpZiAoaERvYyAhPSBtX3BYRkFEb2MgfHwgIW1fcFNES0RvYykNCisgICAgcmV0dXJuIC0xOw0KKyAgaWYgKG1faURvY1R5cGUgIT0gRE9DVFlQRV9EWU5BTUlDX1hGQSkNCisgICAgcmV0dXJuIC0xOw0KKw0KKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7DQorICBpZiAocEVudiA9PSBOVUxMKQ0KKyAgICByZXR1cm4gLTE7DQorDQorICByZXR1cm4gcEVudi0+RkZJX0dldEN1cnJlbnRQYWdlSW5kZXgodGhpcyk7DQorfQ0KK3ZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6U2V0Q3VycmVudFBhZ2UoSVhGQV9Eb2MqIGhEb2MsIGludDMyX3QgaUN1clBhZ2UpIHsNCisgIGlmIChoRG9jICE9IG1fcFhGQURvYyB8fCAhbV9wU0RLRG9jKQ0KKyAgICByZXR1cm47DQorICBpZiAobV9pRG9jVHlwZSAhPSBET0NUWVBFX0RZTkFNSUNfWEZBKQ0KKyAgICByZXR1cm47DQorDQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCisgIGlmIChwRW52ID09IE5VTEwpDQorICAgIHJldHVybjsNCisNCisgIHBFbnYtPkZGSV9TZXRDdXJyZW50UGFnZSh0aGlzLCBpQ3VyUGFnZSk7DQorfQ0KK0ZYX0JPT0wgQ1BERlhGQV9Eb2N1bWVudDo6SXNDYWxjdWxhdGlvbnNFbmFibGVkKElYRkFfRG9jKiBoRG9jKSB7DQorICBpZiAoaERvYyAhPSBtX3BYRkFEb2MgfHwgIW1fcFNES0RvYykNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgaWYgKG1fcFNES0RvYy0+R2V0SW50ZXJGb3JtKCkpDQorICAgIHJldHVybiBtX3BTREtEb2MtPkdldEludGVyRm9ybSgpLT5Jc1hmYUNhbGN1bGF0ZUVuYWJsZWQoKTsNCisNCisgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpTZXRDYWxjdWxhdGlvbnNFbmFibGVkKElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJFbmFibGVkKSB7DQorICBpZiAoaERvYyAhPSBtX3BYRkFEb2MgfHwgIW1fcFNES0RvYykNCisgICAgcmV0dXJuOw0KKyAgaWYgKG1fcFNES0RvYy0+R2V0SW50ZXJGb3JtKCkpDQorICAgIG1fcFNES0RvYy0+R2V0SW50ZXJGb3JtKCktPlhmYUVuYWJsZUNhbGN1bGF0ZShiRW5hYmxlZCk7DQorfQ0KKw0KK3ZvaWQgQ1BERlhGQV9Eb2N1bWVudDo6R2V0VGl0bGUoSVhGQV9Eb2MqIGhEb2MsIENGWF9XaWRlU3RyaW5nJiB3c1RpdGxlKSB7DQorICBpZiAoaERvYyAhPSBtX3BYRkFEb2MpDQorICAgIHJldHVybjsNCisgIGlmIChtX3BQREZEb2MgPT0gTlVMTCkNCisgICAgcmV0dXJuOw0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwSW5mb0RpY3QgPSBtX3BQREZEb2MtPkdldEluZm8oKTsNCisNCisgIGlmIChwSW5mb0RpY3QgPT0gTlVMTCkNCisgICAgcmV0dXJuOw0KKw0KKyAgQ0ZYX0J5dGVTdHJpbmcgY3NUaXRsZSA9IHBJbmZvRGljdC0+R2V0U3RyaW5nKCJUaXRsZSIpOw0KKyAgd3NUaXRsZSA9IHdzVGl0bGUuRnJvbUxvY2FsKGNzVGl0bGUuR2V0QnVmZmVyKGNzVGl0bGUuR2V0TGVuZ3RoKCkpKTsNCisgIGNzVGl0bGUuUmVsZWFzZUJ1ZmZlcihjc1RpdGxlLkdldExlbmd0aCgpKTsNCit9DQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpTZXRUaXRsZShJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUaXRsZSkgew0KKyAgaWYgKGhEb2MgIT0gbV9wWEZBRG9jKQ0KKyAgICByZXR1cm47DQorICBpZiAobV9wUERGRG9jID09IE5VTEwpDQorICAgIHJldHVybjsNCisgIENQREZfRGljdGlvbmFyeSogcEluZm9EaWN0ID0gbV9wUERGRG9jLT5HZXRJbmZvKCk7DQorDQorICBpZiAocEluZm9EaWN0ID09IE5VTEwpDQorICAgIHJldHVybjsNCisgIHBJbmZvRGljdC0+U2V0QXQoIlRpdGxlIiwgbmV3IENQREZfU3RyaW5nKHdzVGl0bGUpKTsNCit9DQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpFeHBvcnREYXRhKElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRmlsZVBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlhEUCkgew0KKyAgaWYgKGhEb2MgIT0gbV9wWEZBRG9jKQ0KKyAgICByZXR1cm47DQorICBpZiAobV9pRG9jVHlwZSAhPSBET0NUWVBFX0RZTkFNSUNfWEZBICYmIG1faURvY1R5cGUgIT0gRE9DVFlQRV9TVEFUSUNfWEZBKQ0KKyAgICByZXR1cm47DQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCisgIGlmIChwRW52ID09IE5VTEwpDQorICAgIHJldHVybjsNCisgIGludCBmaWxlVHlwZSA9IGJYRFAgPyBGWEZBX1NBVkVBU19YRFAgOiBGWEZBX1NBVkVBU19YTUw7DQorICBDRlhfQnl0ZVN0cmluZyBicyA9IENGWF9XaWRlU3RyaW5nKHdzRmlsZVBhdGgpLlVURjE2TEVfRW5jb2RlKCk7DQorDQorICBpZiAod3NGaWxlUGF0aC5Jc0VtcHR5KCkpIHsNCisgICAgaWYgKCFwRW52LT5HZXRGb3JtRmlsbEluZm8oKSB8fA0KKyAgICAgICAgcEVudi0+R2V0Rm9ybUZpbGxJbmZvKCktPm1fcEpzUGxhdGZvcm0gPT0gTlVMTCkNCisgICAgICByZXR1cm47DQorICAgIENGWF9XaWRlU3RyaW5nIGZpbGVwYXRoID0gcEVudi0+SlNfZmllbGRCcm93c2UoKTsNCisgICAgYnMgPSBmaWxlcGF0aC5VVEYxNkxFX0VuY29kZSgpOw0KKyAgfQ0KKyAgaW50IGxlbiA9IGJzLkdldExlbmd0aCgpIC8gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsNCisgIEZQREZfRklMRUhBTkRMRVIqIHBGaWxlSGFuZGxlciA9IHBFbnYtPkZGSV9PcGVuRmlsZSgNCisgICAgICBiWERQID8gRlhGQV9TQVZFQVNfWERQIDogRlhGQV9TQVZFQVNfWE1MLA0KKyAgICAgIChGUERGX1dJREVTVFJJTkcpYnMuR2V0QnVmZmVyKGxlbiAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpLCAid2IiKTsNCisgIGJzLlJlbGVhc2VCdWZmZXIobGVuICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7DQorDQorICBpZiAocEZpbGVIYW5kbGVyID09IE5VTEwpDQorICAgIHJldHVybjsNCisNCisgIENGUERGX0ZpbGVTdHJlYW0gZmlsZVdyaXRlKHBGaWxlSGFuZGxlcik7DQorDQorICBJWEZBX0RvY0hhbmRsZXIqIHBYRkFEb2NIYW5kZXIgPSBtX3BBcHAtPkdldFhGQUFwcCgpLT5HZXREb2NIYW5kbGVyKCk7DQorICBDRlhfQnl0ZVN0cmluZyBjb250ZW50Ow0KKyAgaWYgKGZpbGVUeXBlID09IEZYRkFfU0FWRUFTX1hNTCkgew0KKyAgICBjb250ZW50ID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxyXG4iOw0KKyAgICBmaWxlV3JpdGUuV3JpdGVCbG9jaygoY29uc3QgRlhfQ0hBUiopY29udGVudCwgZmlsZVdyaXRlLkdldFNpemUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5HZXRMZW5ndGgoKSk7DQorICAgIENGWF9XaWRlU3RyaW5nQyBkYXRhKEwiZGF0YSIpOw0KKyAgICBpZiAocFhGQURvY0hhbmRlci0+U2F2ZVBhY2thZ2UobV9wWEZBRG9jVmlldy0+R2V0RG9jKCksIGRhdGEsICZmaWxlV3JpdGUpKSB7DQorICAgICAgLy8gVE9ETzogTWF5YmUgcmVwb3J0IGVycm9yLg0KKyAgICB9DQorICB9IGVsc2UgaWYgKGZpbGVUeXBlID09IEZYRkFfU0FWRUFTX1hEUCkgew0KKyAgICBpZiAobV9wUERGRG9jID09IE5VTEwpDQorICAgICAgcmV0dXJuOw0KKyAgICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gbV9wUERGRG9jLT5HZXRSb290KCk7DQorICAgIGlmIChwUm9vdCA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQWNyb0Zvcm0gPSBwUm9vdC0+R2V0RGljdCgiQWNyb0Zvcm0iKTsNCisgICAgaWYgKE5VTEwgPT0gcEFjcm9Gb3JtKQ0KKyAgICAgIHJldHVybjsNCisgICAgQ1BERl9PYmplY3QqIHBYRkEgPSBwQWNyb0Zvcm0tPkdldEVsZW1lbnQoIlhGQSIpOw0KKyAgICBpZiAocFhGQSA9PSBOVUxMKQ0KKyAgICAgIHJldHVybjsNCisgICAgaWYgKHBYRkEtPkdldFR5cGUoKSAhPSBQREZPQkpfQVJSQVkpDQorICAgICAgcmV0dXJuOw0KKyAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBwWEZBLT5HZXRBcnJheSgpOw0KKyAgICBpZiAoTlVMTCA9PSBwQXJyYXkpDQorICAgICAgcmV0dXJuOw0KKyAgICBpbnQgc2l6ZSA9IHBBcnJheS0+R2V0Q291bnQoKTsNCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzaXplOyBpICs9IDIpIHsNCisgICAgICBDUERGX09iamVjdCogcFBERk9iaiA9IHBBcnJheS0+R2V0RWxlbWVudChpKTsNCisgICAgICBDUERGX09iamVjdCogcFByZVBERk9iaiA9IHBBcnJheS0+R2V0RWxlbWVudChpIC0gMSk7DQorICAgICAgaWYgKHBQcmVQREZPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfU1RSSU5HKQ0KKyAgICAgICAgY29udGludWU7DQorICAgICAgaWYgKHBQREZPYmotPkdldFR5cGUoKSAhPSBQREZPQkpfUkVGRVJFTkNFKQ0KKyAgICAgICAgY29udGludWU7DQorICAgICAgQ1BERl9PYmplY3QqIHBEaXJlY3RPYmogPSBwUERGT2JqLT5HZXREaXJlY3QoKTsNCisgICAgICBpZiAocERpcmVjdE9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pDQorICAgICAgICBjb250aW51ZTsNCisgICAgICBpZiAocFByZVBERk9iai0+R2V0U3RyaW5nKCkgPT0gImZvcm0iKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0MgZm9ybShMImZvcm0iKTsNCisgICAgICAgIHBYRkFEb2NIYW5kZXItPlNhdmVQYWNrYWdlKG1fcFhGQURvY1ZpZXctPkdldERvYygpLCBmb3JtLCAmZmlsZVdyaXRlKTsNCisgICAgICB9IGVsc2UgaWYgKHBQcmVQREZPYmotPkdldFN0cmluZygpID09ICJkYXRhc2V0cyIpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nQyBkYXRhc2V0cyhMImRhdGFzZXRzIik7DQorICAgICAgICBwWEZBRG9jSGFuZGVyLT5TYXZlUGFja2FnZShtX3BYRkFEb2NWaWV3LT5HZXREb2MoKSwgZGF0YXNldHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVdyaXRlKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKGkgPT0gc2l6ZSAtIDEpIHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd1BhdGggPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoDQorICAgICAgICAgICAgICAodW5zaWduZWQgc2hvcnQqKShjb25zdCBGWF9DSEFSKilicywNCisgICAgICAgICAgICAgIGJzLkdldExlbmd0aCgpIC8gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7DQorICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJQYXRoID0gd1BhdGguVVRGOEVuY29kZSgpOw0KKyAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzekZvcm1hdCA9DQorICAgICAgICAgICAgICAiXG48cGRmIGhyZWY9XCIlc1wiIHhtbG5zPVwiaHR0cDovL25zLmFkb2JlLmNvbS94ZHAvcGRmL1wiLz4iOw0KKyAgICAgICAgICBjb250ZW50LkZvcm1hdChzekZvcm1hdCwgKGNoYXIqKShjb25zdCBGWF9DSEFSKiliUGF0aCk7DQorICAgICAgICAgIGZpbGVXcml0ZS5Xcml0ZUJsb2NrKChjb25zdCBGWF9DSEFSKiljb250ZW50LCBmaWxlV3JpdGUuR2V0U2l6ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LkdldExlbmd0aCgpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gKENQREZfU3RyZWFtKilwRGlyZWN0T2JqOw0KKyAgICAgICAgQ1BERl9TdHJlYW1BY2MqIHBBY2MgPSBuZXcgQ1BERl9TdHJlYW1BY2M7DQorICAgICAgICBwQWNjLT5Mb2FkQWxsRGF0YShwU3RyZWFtKTsNCisgICAgICAgIGZpbGVXcml0ZS5Xcml0ZUJsb2NrKHBBY2MtPkdldERhdGEoKSwgZmlsZVdyaXRlLkdldFNpemUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBY2MtPkdldFNpemUoKSk7DQorICAgICAgICBkZWxldGUgcEFjYzsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmICghZmlsZVdyaXRlLkZsdXNoKCkpIHsNCisgICAgLy8gVE9ETzogUmVwb3J0IGVycm9yLg0KKyAgfQ0KK30NCit2b2lkIENQREZYRkFfRG9jdW1lbnQ6OkltcG9ydERhdGEoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGaWxlUGF0aCkgew0KKyAgLy8gVE9ETy4uLg0KK30NCisNCit2b2lkIENQREZYRkFfRG9jdW1lbnQ6OkdvdG9VUkwoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgYnNVUkwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFwcGVuZCkgew0KKyAgaWYgKGhEb2MgIT0gbV9wWEZBRG9jKQ0KKyAgICByZXR1cm47DQorDQorICBpZiAobV9pRG9jVHlwZSAhPSBET0NUWVBFX0RZTkFNSUNfWEZBKQ0KKyAgICByZXR1cm47DQorDQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCisgIGlmIChwRW52ID09IE5VTEwpDQorICAgIHJldHVybjsNCisNCisgIENGWF9XaWRlU3RyaW5nQyBzdHIoYnNVUkwuR2V0UHRyKCkpOw0KKw0KKyAgcEVudi0+RkZJX0dvdG9VUkwodGhpcywgc3RyLCBiQXBwZW5kKTsNCit9DQorDQorRlhfQk9PTCBDUERGWEZBX0RvY3VtZW50OjpJc1ZhbGlkYXRpb25zRW5hYmxlZChJWEZBX0RvYyogaERvYykgew0KKyAgaWYgKGhEb2MgIT0gbV9wWEZBRG9jIHx8ICFtX3BTREtEb2MpDQorICAgIHJldHVybiBGQUxTRTsNCisgIGlmIChtX3BTREtEb2MtPkdldEludGVyRm9ybSgpKQ0KKyAgICByZXR1cm4gbV9wU0RLRG9jLT5HZXRJbnRlckZvcm0oKS0+SXNYZmFWYWxpZGF0aW9uc0VuYWJsZWQoKTsNCisNCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENQREZYRkFfRG9jdW1lbnQ6OlNldFZhbGlkYXRpb25zRW5hYmxlZChJWEZBX0RvYyogaERvYywgRlhfQk9PTCBiRW5hYmxlZCkgew0KKyAgaWYgKGhEb2MgIT0gbV9wWEZBRG9jIHx8ICFtX3BTREtEb2MpDQorICAgIHJldHVybjsNCisgIGlmIChtX3BTREtEb2MtPkdldEludGVyRm9ybSgpKQ0KKyAgICBtX3BTREtEb2MtPkdldEludGVyRm9ybSgpLT5YZmFTZXRWYWxpZGF0aW9uc0VuYWJsZWQoYkVuYWJsZWQpOw0KK30NCit2b2lkIENQREZYRkFfRG9jdW1lbnQ6OlNldEZvY3VzV2lkZ2V0KElYRkFfRG9jKiBoRG9jLCBJWEZBX1dpZGdldCogaFdpZGdldCkgew0KKyAgaWYgKGhEb2MgIT0gbV9wWEZBRG9jKQ0KKyAgICByZXR1cm47DQorDQorICBpZiAoTlVMTCA9PSBoV2lkZ2V0KSB7DQorICAgIG1fcFNES0RvYy0+U2V0Rm9jdXNBbm5vdChOVUxMKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKw0KKyAgaW50IHBhZ2VWaWV3Q291bnQgPSBtX3BTREtEb2MtPkdldFBhZ2VWaWV3Q291bnQoKTsNCisgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFnZVZpZXdDb3VudDsgaSsrKSB7DQorICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IG1fcFNES0RvYy0+R2V0UGFnZVZpZXcoaSk7DQorICAgIGlmIChwUGFnZVZpZXcgPT0gTlVMTCkNCisgICAgICBjb250aW51ZTsNCisgICAgQ1BERlNES19Bbm5vdCogcEFubm90ID0gcFBhZ2VWaWV3LT5HZXRBbm5vdEJ5WEZBV2lkZ2V0KGhXaWRnZXQpOw0KKyAgICBpZiAocEFubm90KSB7DQorICAgICAgbV9wU0RLRG9jLT5TZXRGb2N1c0Fubm90KHBBbm5vdCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpQcmludChJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0UGFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkVuZFBhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd09wdGlvbnMpIHsNCisgIGlmIChoRG9jICE9IG1fcFhGQURvYykNCisgICAgcmV0dXJuOw0KKw0KKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7DQorICBpZiAocEVudiA9PSBOVUxMKQ0KKyAgICByZXR1cm47DQorDQorICBpZiAoIXBFbnYtPkdldEZvcm1GaWxsSW5mbygpIHx8DQorICAgICAgcEVudi0+R2V0Rm9ybUZpbGxJbmZvKCktPm1fcEpzUGxhdGZvcm0gPT0gTlVMTCkNCisgICAgcmV0dXJuOw0KKyAgaWYgKHBFbnYtPkdldEZvcm1GaWxsSW5mbygpLT5tX3BKc1BsYXRmb3JtLT5Eb2NfcHJpbnQgPT0gTlVMTCkNCisgICAgcmV0dXJuOw0KKyAgcEVudi0+R2V0Rm9ybUZpbGxJbmZvKCktPm1fcEpzUGxhdGZvcm0tPkRvY19wcmludCgNCisgICAgICBwRW52LT5HZXRGb3JtRmlsbEluZm8oKS0+bV9wSnNQbGF0Zm9ybSwNCisgICAgICBkd09wdGlvbnMgJiBYRkFfUFJJTlRPUFRfU2hvd0RpYWxvZywgblN0YXJ0UGFnZSwgbkVuZFBhZ2UsDQorICAgICAgZHdPcHRpb25zICYgWEZBX1BSSU5UT1BUX0NhbkNhbmNlbCwgZHdPcHRpb25zICYgWEZBX1BSSU5UT1BUX1Nocmlua1BhZ2UsDQorICAgICAgZHdPcHRpb25zICYgWEZBX1BSSU5UT1BUX0FzSW1hZ2UsIGR3T3B0aW9ucyAmIFhGQV9QUklOVE9QVF9SZXZlcnNlT3JkZXIsDQorICAgICAgZHdPcHRpb25zICYgWEZBX1BSSU5UT1BUX1ByaW50QW5ub3QpOw0KK30NCisNCit2b2lkIENQREZYRkFfRG9jdW1lbnQ6OkdldFVSTChJWEZBX0RvYyogaERvYywgQ0ZYX1dpZGVTdHJpbmcmIHdzRG9jVVJMKSB7DQorICBpZiAoaERvYyAhPSBtX3BYRkFEb2MpDQorICAgIHJldHVybjsNCisNCisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOw0KKyAgaWYgKHBFbnYgPT0gTlVMTCkNCisgICAgcmV0dXJuOw0KKw0KKyAgcEVudi0+RkZJX0dldFVSTCh0aGlzLCB3c0RvY1VSTCk7DQorfQ0KKw0KK0ZYX0FSR0IgQ1BERlhGQV9Eb2N1bWVudDo6R2V0SGlnaGxpZ2h0Q29sb3IoSVhGQV9Eb2MqIGhEb2MpIHsNCisgIGlmIChoRG9jICE9IG1fcFhGQURvYykNCisgICAgcmV0dXJuIDA7DQorICBpZiAobV9wU0RLRG9jKSB7DQorICAgIGlmIChDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IG1fcFNES0RvYy0+R2V0SW50ZXJGb3JtKCkpIHsNCisgICAgICBGWF9DT0xPUlJFRiBjb2xvciA9IHBJbnRlckZvcm0tPkdldEhpZ2hsaWdodENvbG9yKEZQREZfRk9STUZJRUxEX1hGQSk7DQorICAgICAgdWludDhfdCBhbHBoYSA9IHBJbnRlckZvcm0tPkdldEhpZ2hsaWdodEFscGhhKCk7DQorICAgICAgRlhfQVJHQiBhcmdiID0gQXJnYkVuY29kZSgoaW50KWFscGhhLCBjb2xvcik7DQorICAgICAgcmV0dXJuIGFyZ2I7DQorICAgIH0NCisgIH0NCisgIHJldHVybiAwOw0KK30NCisNCit2b2lkIENQREZYRkFfRG9jdW1lbnQ6OkFkZERvUmVjb3JkKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSB7DQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCisgIGlmIChwRW52ID09IE5VTEwpDQorICAgIHJldHVybjsNCisgIHJldHVybjsNCisgIC8vIHBFbnYtPkZGSV9BZGREb1JlY29yZCh0aGlzLCBoV2lkZ2V0KTsNCit9DQorDQorRlhfQk9PTCBDUERGWEZBX0RvY3VtZW50OjpfTm90aWZ5U3VibWl0KEZYX0JPT0wgYlByZXZPclBvc3QpIHsNCisgIGlmIChiUHJldk9yUG9zdCkNCisgICAgcmV0dXJuIF9PbkJlZm9yZU5vdGlmeVN1bWJpdCgpOw0KKyAgZWxzZQ0KKyAgICBfT25BZnRlck5vdGlmeVN1bWJpdCgpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KKw0KK0ZYX0JPT0wgQ1BERlhGQV9Eb2N1bWVudDo6X09uQmVmb3JlTm90aWZ5U3VtYml0KCkgew0KKyNpZmRlZiBQREZfRU5BQkxFX1hGQQ0KKyAgaWYgKG1faURvY1R5cGUgIT0gRE9DVFlQRV9EWU5BTUlDX1hGQSAmJiBtX2lEb2NUeXBlICE9IERPQ1RZUEVfU1RBVElDX1hGQSkNCisgICAgcmV0dXJuIFRSVUU7DQorICBpZiAobV9wWEZBRG9jVmlldyA9PSBOVUxMKQ0KKyAgICByZXR1cm4gVFJVRTsNCisgIElYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBtX3BYRkFEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCk7DQorICBpZiAocFdpZGdldEhhbmRsZXIgPT0gTlVMTCkNCisgICAgcmV0dXJuIFRSVUU7DQorICBJWEZBX1dpZGdldEFjY0l0ZXJhdG9yKiBwV2lkZ2V0QWNjSXRlcmF0b3IgPQ0KKyAgICAgIG1fcFhGQURvY1ZpZXctPkNyZWF0ZVdpZGdldEFjY0l0ZXJhdG9yKCk7DQorICBpZiAocFdpZGdldEFjY0l0ZXJhdG9yKSB7DQorICAgIENYRkFfRXZlbnRQYXJhbSBQYXJhbTsNCisgICAgUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9QcmVTdWJtaXQ7DQorICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gcFdpZGdldEFjY0l0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7DQorICAgIHdoaWxlIChwV2lkZ2V0QWNjKSB7DQorICAgICAgcFdpZGdldEhhbmRsZXItPlByb2Nlc3NFdmVudChwV2lkZ2V0QWNjLCAmUGFyYW0pOw0KKyAgICAgIHBXaWRnZXRBY2MgPSBwV2lkZ2V0QWNjSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCisgICAgfQ0KKyAgICBwV2lkZ2V0QWNjSXRlcmF0b3ItPlJlbGVhc2UoKTsNCisgIH0NCisgIHBXaWRnZXRBY2NJdGVyYXRvciA9IG1fcFhGQURvY1ZpZXctPkNyZWF0ZVdpZGdldEFjY0l0ZXJhdG9yKCk7DQorICBpZiAocFdpZGdldEFjY0l0ZXJhdG9yKSB7DQorICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gcFdpZGdldEFjY0l0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7DQorICAgIHBXaWRnZXRBY2MgPSBwV2lkZ2V0QWNjSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCisgICAgd2hpbGUgKHBXaWRnZXRBY2MpIHsNCisgICAgICBpbnQgZlJldCA9IHBXaWRnZXRBY2MtPlByb2Nlc3NWYWxpZGF0ZSgtMSk7DQorICAgICAgaWYgKGZSZXQgPT0gWEZBX0VWRU5URVJST1JfRXJyb3IpIHsNCisgICAgICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOw0KKyAgICAgICAgaWYgKHBFbnYgPT0gTlVMTCkNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3M7DQorICAgICAgICB3cy5Gcm9tTG9jYWwoSURTX1hGQV9WYWxpZGF0ZV9JbnB1dCk7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBicyA9IHdzLlVURjE2TEVfRW5jb2RlKCk7DQorICAgICAgICBpbnQgbGVuID0gYnMuR2V0TGVuZ3RoKCkgLyBzaXplb2YodW5zaWduZWQgc2hvcnQpOw0KKyAgICAgICAgcEVudi0+RkZJX0FsZXJ0KA0KKyAgICAgICAgICAgIChGUERGX1dJREVTVFJJTkcpYnMuR2V0QnVmZmVyKGxlbiAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpLA0KKyAgICAgICAgICAgIChGUERGX1dJREVTVFJJTkcpTCIiLCAwLCAxKTsNCisgICAgICAgIGJzLlJlbGVhc2VCdWZmZXIobGVuICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7DQorICAgICAgICBwV2lkZ2V0QWNjSXRlcmF0b3ItPlJlbGVhc2UoKTsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgcFdpZGdldEFjYyA9IHBXaWRnZXRBY2NJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KKyAgICB9DQorICAgIHBXaWRnZXRBY2NJdGVyYXRvci0+UmVsZWFzZSgpOw0KKyAgICBtX3BYRkFEb2NWaWV3LT5VcGRhdGVEb2NWaWV3KCk7DQorICB9DQorI2VuZGlmDQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpfT25BZnRlck5vdGlmeVN1bWJpdCgpIHsNCisgIGlmIChtX2lEb2NUeXBlICE9IERPQ1RZUEVfRFlOQU1JQ19YRkEgJiYgbV9pRG9jVHlwZSAhPSBET0NUWVBFX1NUQVRJQ19YRkEpDQorICAgIHJldHVybjsNCisgIGlmIChtX3BYRkFEb2NWaWV3ID09IE5VTEwpDQorICAgIHJldHVybjsNCisgIElYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBtX3BYRkFEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCk7DQorICBpZiAocFdpZGdldEhhbmRsZXIgPT0gTlVMTCkNCisgICAgcmV0dXJuOw0KKyAgSVhGQV9XaWRnZXRBY2NJdGVyYXRvciogcFdpZGdldEFjY0l0ZXJhdG9yID0NCisgICAgICBtX3BYRkFEb2NWaWV3LT5DcmVhdGVXaWRnZXRBY2NJdGVyYXRvcigpOw0KKyAgaWYgKHBXaWRnZXRBY2NJdGVyYXRvciA9PSBOVUxMKQ0KKyAgICByZXR1cm47DQorICBDWEZBX0V2ZW50UGFyYW0gUGFyYW07DQorICBQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX1Bvc3RTdWJtaXQ7DQorDQorICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBXaWRnZXRBY2NJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KKyAgd2hpbGUgKHBXaWRnZXRBY2MpIHsNCisgICAgcFdpZGdldEhhbmRsZXItPlByb2Nlc3NFdmVudChwV2lkZ2V0QWNjLCAmUGFyYW0pOw0KKyAgICBwV2lkZ2V0QWNjID0gcFdpZGdldEFjY0l0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7DQorICB9DQorICBwV2lkZ2V0QWNjSXRlcmF0b3ItPlJlbGVhc2UoKTsNCisgIG1fcFhGQURvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsNCit9DQorDQorRlhfQk9PTCBDUERGWEZBX0RvY3VtZW50OjpTdWJtaXREYXRhKElYRkFfRG9jKiBoRG9jLCBDWEZBX1N1Ym1pdCBzdWJtaXQpIHsNCisgIGlmICghX05vdGlmeVN1Ym1pdChUUlVFKSkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgaWYgKE5VTEwgPT0gbV9wWEZBRG9jVmlldykNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgbV9wWEZBRG9jVmlldy0+VXBkYXRlRG9jVmlldygpOw0KKw0KKyAgRlhfQk9PTCByZXQgPSBfU3VibWl0RGF0YShoRG9jLCBzdWJtaXQpOw0KKyAgX05vdGlmeVN1Ym1pdChGQUxTRSk7DQorICByZXR1cm4gcmV0Ow0KK30NCisNCitJRlhfRmlsZVJlYWQqIENQREZYRkFfRG9jdW1lbnQ6Ok9wZW5MaW5rZWRGaWxlKElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTGluaykgew0KKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7DQorICBpZiAocEVudiA9PSBOVUxMKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBDRlhfQnl0ZVN0cmluZyBicyA9IHdzTGluay5VVEYxNkxFX0VuY29kZSgpOw0KKyAgaW50IGxlbiA9IGJzLkdldExlbmd0aCgpIC8gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsNCisgIEZQREZfRklMRUhBTkRMRVIqIHBGaWxlSGFuZGxlciA9IHBFbnYtPkZGSV9PcGVuRmlsZSgNCisgICAgICAwLCAoRlBERl9XSURFU1RSSU5HKWJzLkdldEJ1ZmZlcihsZW4gKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKSwgInJiIik7DQorICBicy5SZWxlYXNlQnVmZmVyKGxlbiAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOw0KKw0KKyAgaWYgKHBGaWxlSGFuZGxlciA9PSBOVUxMKQ0KKyAgICByZXR1cm4gTlVMTDsNCisgIHJldHVybiBuZXcgQ0ZQREZfRmlsZVN0cmVhbShwRmlsZUhhbmRsZXIpOw0KK30NCitGWF9CT09MIENQREZYRkFfRG9jdW1lbnQ6Ol9FeHBvcnRTdWJtaXRGaWxlKEZQREZfRklMRUhBTkRMRVIqIHBGaWxlSGFuZGxlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQgZW5jb2RlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQgZmxhZykgew0KKyAgaWYgKE5VTEwgPT0gbV9wWEZBRG9jVmlldykNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgSVhGQV9Eb2NIYW5kbGVyKiBwRG9jSGFuZGxlciA9IG1fcEFwcC0+R2V0WEZBQXBwKCktPkdldERvY0hhbmRsZXIoKTsNCisgIENGWF9CeXRlU3RyaW5nIGNvbnRlbnQ7DQorDQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsNCisgIGlmIChwRW52ID09IE5VTEwpDQorICAgIHJldHVybiBGQUxTRTsNCisNCisgIENGUERGX0ZpbGVTdHJlYW0gZmlsZVN0cmVhbShwRmlsZUhhbmRsZXIpOw0KKw0KKyAgaWYgKGZpbGVUeXBlID09IEZYRkFfU0FWRUFTX1hNTCkgew0KKyAgICBDRlhfV2lkZVN0cmluZyB3czsNCisgICAgd3MuRnJvbUxvY2FsKCJkYXRhIik7DQorICAgIENGWF9CeXRlU3RyaW5nIGNvbnRlbnQgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XHJcbiI7DQorICAgIGZpbGVTdHJlYW0uV3JpdGVCbG9jaygoY29uc3QgRlhfQ0hBUiopY29udGVudCwgMCwgY29udGVudC5HZXRMZW5ndGgoKSk7DQorICAgIHBEb2NIYW5kbGVyLT5TYXZlUGFja2FnZShtX3BYRkFEb2MsIHdzLCAmZmlsZVN0cmVhbSk7DQorICB9IGVsc2UgaWYgKGZpbGVUeXBlID09IEZYRkFfU0FWRUFTX1hEUCkgew0KKyAgICBpZiAoZmxhZyA9PSAwKQ0KKyAgICAgIGZsYWcgPSBGWEZBX0NPTkZJRyB8IEZYRkFfVEVNUExBVEUgfCBGWEZBX0xPQ0FMRVNFVCB8IEZYRkFfREFUQVNFVFMgfA0KKyAgICAgICAgICAgICBGWEZBX1hNUE1FVEEgfCBGWEZBX1hGREYgfCBGWEZBX0ZPUk07DQorICAgIGlmIChtX3BQREZEb2MgPT0gTlVMTCkgew0KKyAgICAgIGZpbGVTdHJlYW0uRmx1c2goKTsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IG1fcFBERkRvYy0+R2V0Um9vdCgpOw0KKyAgICBpZiAocFJvb3QgPT0gTlVMTCkgew0KKyAgICAgIGZpbGVTdHJlYW0uRmx1c2goKTsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQWNyb0Zvcm0gPSBwUm9vdC0+R2V0RGljdCgiQWNyb0Zvcm0iKTsNCisgICAgaWYgKE5VTEwgPT0gcEFjcm9Gb3JtKSB7DQorICAgICAgZmlsZVN0cmVhbS5GbHVzaCgpOw0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDUERGX09iamVjdCogcFhGQSA9IHBBY3JvRm9ybS0+R2V0RWxlbWVudCgiWEZBIik7DQorICAgIGlmIChwWEZBID09IE5VTEwpIHsNCisgICAgICBmaWxlU3RyZWFtLkZsdXNoKCk7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChwWEZBLT5HZXRUeXBlKCkgIT0gUERGT0JKX0FSUkFZKSB7DQorICAgICAgZmlsZVN0cmVhbS5GbHVzaCgpOw0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBwWEZBLT5HZXRBcnJheSgpOw0KKyAgICBpZiAoTlVMTCA9PSBwQXJyYXkpIHsNCisgICAgICBmaWxlU3RyZWFtLkZsdXNoKCk7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGludCBzaXplID0gcEFycmF5LT5HZXRDb3VudCgpOw0KKyAgICBmb3IgKGludCBpID0gMTsgaSA8IHNpemU7IGkgKz0gMikgew0KKyAgICAgIENQREZfT2JqZWN0KiBwUERGT2JqID0gcEFycmF5LT5HZXRFbGVtZW50KGkpOw0KKyAgICAgIENQREZfT2JqZWN0KiBwUHJlUERGT2JqID0gcEFycmF5LT5HZXRFbGVtZW50KGkgLSAxKTsNCisgICAgICBpZiAocFByZVBERk9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJJTkcpDQorICAgICAgICBjb250aW51ZTsNCisgICAgICBpZiAocFBERk9iai0+R2V0VHlwZSgpICE9IFBERk9CSl9SRUZFUkVOQ0UpDQorICAgICAgICBjb250aW51ZTsNCisgICAgICBDUERGX09iamVjdCogcERpcmVjdE9iaiA9IHBQREZPYmotPkdldERpcmVjdCgpOw0KKyAgICAgIGlmIChwRGlyZWN0T2JqLT5HZXRUeXBlKCkgIT0gUERGT0JKX1NUUkVBTSkNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGlmIChwUHJlUERGT2JqLT5HZXRTdHJpbmcoKSA9PSAiY29uZmlnIiAmJiAhKGZsYWcgJiBGWEZBX0NPTkZJRykpDQorICAgICAgICBjb250aW51ZTsNCisgICAgICBpZiAocFByZVBERk9iai0+R2V0U3RyaW5nKCkgPT0gInRlbXBsYXRlIiAmJiAhKGZsYWcgJiBGWEZBX1RFTVBMQVRFKSkNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGlmIChwUHJlUERGT2JqLT5HZXRTdHJpbmcoKSA9PSAibG9jYWxlU2V0IiAmJiAhKGZsYWcgJiBGWEZBX0xPQ0FMRVNFVCkpDQorICAgICAgICBjb250aW51ZTsNCisgICAgICBpZiAocFByZVBERk9iai0+R2V0U3RyaW5nKCkgPT0gImRhdGFzZXRzIiAmJiAhKGZsYWcgJiBGWEZBX0RBVEFTRVRTKSkNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGlmIChwUHJlUERGT2JqLT5HZXRTdHJpbmcoKSA9PSAieG1wbWV0YSIgJiYgIShmbGFnICYgRlhGQV9YTVBNRVRBKSkNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGlmIChwUHJlUERGT2JqLT5HZXRTdHJpbmcoKSA9PSAieGZkZiIgJiYgIShmbGFnICYgRlhGQV9YRkRGKSkNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGlmIChwUHJlUERGT2JqLT5HZXRTdHJpbmcoKSA9PSAiZm9ybSIgJiYgIShmbGFnICYgRlhGQV9GT1JNKSkNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGlmIChwUHJlUERGT2JqLT5HZXRTdHJpbmcoKSA9PSAiZm9ybSIpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzOw0KKyAgICAgICAgd3MuRnJvbUxvY2FsKCJmb3JtIik7DQorICAgICAgICBwRG9jSGFuZGxlci0+U2F2ZVBhY2thZ2UobV9wWEZBRG9jLCB3cywgJmZpbGVTdHJlYW0pOw0KKyAgICAgIH0gZWxzZSBpZiAocFByZVBERk9iai0+R2V0U3RyaW5nKCkgPT0gImRhdGFzZXRzIikgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3M7DQorICAgICAgICB3cy5Gcm9tTG9jYWwoImRhdGFzZXRzIik7DQorICAgICAgICBwRG9jSGFuZGxlci0+U2F2ZVBhY2thZ2UobV9wWEZBRG9jLCB3cywgJmZpbGVTdHJlYW0pOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICAvLyBQREYsY3JlYXRvci4NCisgICAgICAgIC8vIFRPRE86DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorDQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpfQ2xlYXJDaGFuZ2VNYXJrKCkgew0KKyAgaWYgKG1fcFNES0RvYykNCisgICAgbV9wU0RLRG9jLT5DbGVhckNoYW5nZU1hcmsoKTsNCit9DQorDQordm9pZCBDUERGWEZBX0RvY3VtZW50OjpfVG9YRkFDb250ZW50RmxhZ3MoQ0ZYX1dpZGVTdHJpbmcgY3NTcmNDb250ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQmIGZsYWcpIHsNCisgIGlmIChjc1NyY0NvbnRlbnQuRmluZChMIiBjb25maWcgIiwgMCkgIT0gLTEpDQorICAgIGZsYWcgfD0gRlhGQV9DT05GSUc7DQorICBpZiAoY3NTcmNDb250ZW50LkZpbmQoTCIgdGVtcGxhdGUgIiwgMCkgIT0gLTEpDQorICAgIGZsYWcgfD0gRlhGQV9URU1QTEFURTsNCisgIGlmIChjc1NyY0NvbnRlbnQuRmluZChMIiBsb2NhbGVTZXQgIiwgMCkgIT0gLTEpDQorICAgIGZsYWcgfD0gRlhGQV9MT0NBTEVTRVQ7DQorICBpZiAoY3NTcmNDb250ZW50LkZpbmQoTCIgZGF0YXNldHMgIiwgMCkgIT0gLTEpDQorICAgIGZsYWcgfD0gRlhGQV9EQVRBU0VUUzsNCisgIGlmIChjc1NyY0NvbnRlbnQuRmluZChMIiB4bXBtZXRhICIsIDApICE9IC0xKQ0KKyAgICBmbGFnIHw9IEZYRkFfWE1QTUVUQTsNCisgIGlmIChjc1NyY0NvbnRlbnQuRmluZChMIiB4ZmRmICIsIDApICE9IC0xKQ0KKyAgICBmbGFnIHw9IEZYRkFfWEZERjsNCisgIGlmIChjc1NyY0NvbnRlbnQuRmluZChMIiBmb3JtICIsIDApICE9IC0xKQ0KKyAgICBmbGFnIHw9IEZYRkFfRk9STTsNCisgIGlmIChmbGFnID09IDApDQorICAgIGZsYWcgPSBGWEZBX0NPTkZJRyB8IEZYRkFfVEVNUExBVEUgfCBGWEZBX0xPQ0FMRVNFVCB8IEZYRkFfREFUQVNFVFMgfA0KKyAgICAgICAgICAgRlhGQV9YTVBNRVRBIHwgRlhGQV9YRkRGIHwgRlhGQV9GT1JNOw0KK30NCitGWF9CT09MIENQREZYRkFfRG9jdW1lbnQ6Ol9NYWlsVG9JbmZvKENGWF9XaWRlU3RyaW5nJiBjc1VSTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBjc1RvQWRkcmVzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBjc0NDQWRkcmVzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBjc0JDQ0FkZHJlc3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgY3NTdWJqZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGNzTXNnKSB7DQorICBDRlhfV2lkZVN0cmluZyBzcmNVUkwgPSBjc1VSTDsNCisgIHNyY1VSTC5UcmltTGVmdCgpOw0KKyAgaWYgKDAgIT0gc3JjVVJMLkxlZnQoNykuQ29tcGFyZU5vQ2FzZShMIm1haWx0bzoiKSkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgaW50IHBvcyA9IHNyY1VSTC5GaW5kKEwnPycsIDApOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgdG1wOw0KKyAgaWYgKHBvcyA9PSAtMSkgew0KKyAgICBwb3MgPSBzcmNVUkwuRmluZChMJ0AnLCAwKTsNCisgICAgaWYgKHBvcyA9PSAtMSkNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIGVsc2Ugew0KKyAgICAgIHRtcCA9IHNyY1VSTC5SaWdodChjc1VSTC5HZXRMZW5ndGgoKSAtIDcpOw0KKyAgICAgIHRtcC5UcmltTGVmdCgpOw0KKyAgICAgIHRtcC5UcmltUmlnaHQoKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgdG1wID0gc3JjVVJMLkxlZnQocG9zKTsNCisgICAgdG1wID0gdG1wLlJpZ2h0KHRtcC5HZXRMZW5ndGgoKSAtIDcpOw0KKyAgICB0bXAuVHJpbUxlZnQoKTsNCisgICAgdG1wLlRyaW1SaWdodCgpOw0KKyAgfQ0KKw0KKyAgY3NUb0FkZHJlc3MgPSB0bXA7DQorDQorICBzcmNVUkwgPSBzcmNVUkwuUmlnaHQoc3JjVVJMLkdldExlbmd0aCgpIC0gKHBvcyArIDEpKTsNCisgIHdoaWxlICghc3JjVVJMLklzRW1wdHkoKSkgew0KKyAgICBzcmNVUkwuVHJpbUxlZnQoKTsNCisgICAgc3JjVVJMLlRyaW1SaWdodCgpOw0KKyAgICBwb3MgPSBzcmNVUkwuRmluZChMJyYnLCAwKTsNCisgICAgaWYgKHBvcyA9PSAtMSkNCisgICAgICB0bXAgPSBzcmNVUkw7DQorICAgIGVsc2UNCisgICAgICB0bXAgPSBzcmNVUkwuTGVmdChwb3MpOw0KKw0KKyAgICB0bXAuVHJpbUxlZnQoKTsNCisgICAgdG1wLlRyaW1SaWdodCgpOw0KKyAgICBpZiAodG1wLkdldExlbmd0aCgpID49IDMgJiYgMCA9PSB0bXAuTGVmdCgzKS5Db21wYXJlTm9DYXNlKEwiY2M9IikpIHsNCisgICAgICB0bXAgPSB0bXAuUmlnaHQodG1wLkdldExlbmd0aCgpIC0gMyk7DQorICAgICAgaWYgKCFjc0NDQWRkcmVzcy5Jc0VtcHR5KCkpDQorICAgICAgICBjc0NDQWRkcmVzcyArPSBMJzsnOw0KKyAgICAgIGNzQ0NBZGRyZXNzICs9IHRtcDsNCisNCisgICAgfSBlbHNlIGlmICh0bXAuR2V0TGVuZ3RoKCkgPj0gNCAmJg0KKyAgICAgICAgICAgICAgIDAgPT0gdG1wLkxlZnQoNCkuQ29tcGFyZU5vQ2FzZShMImJjYz0iKSkgew0KKyAgICAgIHRtcCA9IHRtcC5SaWdodCh0bXAuR2V0TGVuZ3RoKCkgLSA0KTsNCisgICAgICBpZiAoIWNzQkNDQWRkcmVzcy5Jc0VtcHR5KCkpDQorICAgICAgICBjc0JDQ0FkZHJlc3MgKz0gTCc7JzsNCisgICAgICBjc0JDQ0FkZHJlc3MgKz0gdG1wOw0KKyAgICB9IGVsc2UgaWYgKHRtcC5HZXRMZW5ndGgoKSA+PSA4ICYmDQorICAgICAgICAgICAgICAgMCA9PSB0bXAuTGVmdCg4KS5Db21wYXJlTm9DYXNlKEwic3ViamVjdD0iKSkgew0KKyAgICAgIHRtcCA9IHRtcC5SaWdodCh0bXAuR2V0TGVuZ3RoKCkgLSA4KTsNCisgICAgICBjc1N1YmplY3QgKz0gdG1wOw0KKyAgICB9IGVsc2UgaWYgKHRtcC5HZXRMZW5ndGgoKSA+PSA1ICYmDQorICAgICAgICAgICAgICAgMCA9PSB0bXAuTGVmdCg1KS5Db21wYXJlTm9DYXNlKEwiYm9keT0iKSkgew0KKyAgICAgIHRtcCA9IHRtcC5SaWdodCh0bXAuR2V0TGVuZ3RoKCkgLSA1KTsNCisgICAgICBjc01zZyArPSB0bXA7DQorICAgIH0NCisgICAgaWYgKHBvcyA9PSAtMSkNCisgICAgICBzcmNVUkwgPSBMIiI7DQorICAgIGVsc2UNCisgICAgICBzcmNVUkwgPSBzcmNVUkwuUmlnaHQoY3NVUkwuR2V0TGVuZ3RoKCkgLSAocG9zICsgMSkpOw0KKyAgfQ0KKyAgY3NUb0FkZHJlc3MuUmVwbGFjZShMIiwiLCBMIjsiKTsNCisgIGNzQ0NBZGRyZXNzLlJlcGxhY2UoTCIsIiwgTCI7Iik7DQorICBjc0JDQ0FkZHJlc3MuUmVwbGFjZShMIiwiLCBMIjsiKTsNCisgIHJldHVybiBUUlVFOw0KK30NCisNCitGWF9CT09MIENQREZYRkFfRG9jdW1lbnQ6Ol9TdWJtaXREYXRhKElYRkFfRG9jKiBoRG9jLCBDWEZBX1N1Ym1pdCBzdWJtaXQpIHsNCisjaWZkZWYgUERGX0VOQUJMRV9YRkENCisgIENGWF9XaWRlU3RyaW5nQyBjc1VSTEM7DQorICBzdWJtaXQuR2V0U3VibWl0VGFyZ2V0KGNzVVJMQyk7DQorICBDRlhfV2lkZVN0cmluZyBjc1VSTCA9IGNzVVJMQzsNCisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOw0KKyAgaWYgKHBFbnYgPT0gTlVMTCkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgaWYgKGNzVVJMLklzRW1wdHkoKSkgew0KKyAgICBDRlhfV2lkZVN0cmluZyB3czsNCisgICAgd3MuRnJvbUxvY2FsKCJTdWJtaXQgY2FuY2VsbGVkLiIpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBicyA9IHdzLlVURjE2TEVfRW5jb2RlKCk7DQorICAgIGludCBsZW4gPSBicy5HZXRMZW5ndGgoKSAvIHNpemVvZih1bnNpZ25lZCBzaG9ydCk7DQorICAgIHBFbnYtPkZGSV9BbGVydCgoRlBERl9XSURFU1RSSU5HKWJzLkdldEJ1ZmZlcihsZW4gKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKSwNCisgICAgICAgICAgICAgICAgICAgIChGUERGX1dJREVTVFJJTkcpTCIiLCAwLCA0KTsNCisgICAgYnMuUmVsZWFzZUJ1ZmZlcihsZW4gKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKTsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKw0KKyAgRlBERl9CT09MIGJSZXQgPSBUUlVFOw0KKyAgRlBERl9GSUxFSEFORExFUiogcEZpbGVIYW5kbGVyID0gTlVMTDsNCisgIGludCBmaWxlRmxhZyA9IC0xOw0KKw0KKyAgaWYgKHN1Ym1pdC5HZXRTdWJtaXRGb3JtYXQoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9YZHApIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIGNzQ29udGVudEM7DQorICAgIHN1Ym1pdC5HZXRTdWJtaXRYRFBDb250ZW50KGNzQ29udGVudEMpOw0KKyAgICBDRlhfV2lkZVN0cmluZyBjc0NvbnRlbnQ7DQorICAgIGNzQ29udGVudCA9IGNzQ29udGVudEMuR2V0UHRyKCk7DQorICAgIGNzQ29udGVudC5UcmltTGVmdCgpOw0KKyAgICBjc0NvbnRlbnQuVHJpbVJpZ2h0KCk7DQorICAgIENGWF9XaWRlU3RyaW5nIHNwYWNlOw0KKyAgICBzcGFjZS5Gcm9tTG9jYWwoIiAiKTsNCisgICAgY3NDb250ZW50ID0gc3BhY2UgKyBjc0NvbnRlbnQgKyBzcGFjZTsNCisgICAgRlBERl9EV09SRCBmbGFnID0gMDsNCisgICAgaWYgKHN1Ym1pdC5Jc1N1Ym1pdEVtYmVkUERGKCkpDQorICAgICAgZmxhZyB8PSBGWEZBX1BERjsNCisgICAgX1RvWEZBQ29udGVudEZsYWdzKGNzQ29udGVudCwgZmxhZyk7DQorICAgIHBGaWxlSGFuZGxlciA9IHBFbnYtPkZGSV9PcGVuRmlsZShGWEZBX1NBVkVBU19YRFAsIE5VTEwsICJ3YiIpOw0KKyAgICBmaWxlRmxhZyA9IEZYRkFfU0FWRUFTX1hEUDsNCisgICAgX0V4cG9ydFN1Ym1pdEZpbGUocEZpbGVIYW5kbGVyLCBGWEZBX1NBVkVBU19YRFAsIDAsIGZsYWcpOw0KKyAgfSBlbHNlIGlmIChzdWJtaXQuR2V0U3VibWl0Rm9ybWF0KCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fWG1sKSB7DQorICAgIHBGaWxlSGFuZGxlciA9IHBFbnYtPkZGSV9PcGVuRmlsZShGWEZBX1NBVkVBU19YTUwsIE5VTEwsICJ3YiIpOw0KKyAgICBmaWxlRmxhZyA9IEZYRkFfU0FWRUFTX1hNTDsNCisgICAgX0V4cG9ydFN1Ym1pdEZpbGUocEZpbGVIYW5kbGVyLCBGWEZBX1NBVkVBU19YTUwsIDApOw0KKyAgfSBlbHNlIGlmIChzdWJtaXQuR2V0U3VibWl0Rm9ybWF0KCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fUGRmKSB7DQorICAgIC8vIGNzZmlsZW5hbWUgPSBjc0RvY05hbWU7DQorICB9IGVsc2UgaWYgKHN1Ym1pdC5HZXRTdWJtaXRGb3JtYXQoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Gb3JtZGF0YSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9IGVsc2UgaWYgKHN1Ym1pdC5HZXRTdWJtaXRGb3JtYXQoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9VcmxlbmNvZGVkKSB7DQorICAgIHBGaWxlSGFuZGxlciA9IHBFbnYtPkZGSV9PcGVuRmlsZShGWEZBX1NBVkVBU19YTUwsIE5VTEwsICJ3YiIpOw0KKyAgICBmaWxlRmxhZyA9IEZYRkFfU0FWRUFTX1hNTDsNCisgICAgX0V4cG9ydFN1Ym1pdEZpbGUocEZpbGVIYW5kbGVyLCBGWEZBX1NBVkVBU19YTUwsIDApOw0KKyAgfSBlbHNlIGlmIChzdWJtaXQuR2V0U3VibWl0Rm9ybWF0KCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fWGZkKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0gZWxzZSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChwRmlsZUhhbmRsZXIgPT0gTlVMTCkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgaWYgKDAgPT0gY3NVUkwuTGVmdCg3KS5Db21wYXJlTm9DYXNlKEwibWFpbHRvOiIpKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIGNzVG9BZGRyZXNzOw0KKyAgICBDRlhfV2lkZVN0cmluZyBjc0NDQWRkcmVzczsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgY3NCQ0NBZGRyZXNzOw0KKyAgICBDRlhfV2lkZVN0cmluZyBjc1N1YmplY3Q7DQorICAgIENGWF9XaWRlU3RyaW5nIGNzTXNnOw0KKw0KKyAgICBiUmV0ID0gX01haWxUb0luZm8oY3NVUkwsIGNzVG9BZGRyZXNzLCBjc0NDQWRkcmVzcywgY3NCQ0NBZGRyZXNzLCBjc1N1YmplY3QsDQorICAgICAgICAgICAgICAgICAgICAgICBjc01zZyk7DQorICAgIGlmIChGQUxTRSA9PSBiUmV0KQ0KKyAgICAgIHJldHVybiBGQUxTRTsNCisNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNUbyA9IENGWF9XaWRlU3RyaW5nKGNzVG9BZGRyZXNzKS5VVEYxNkxFX0VuY29kZSgpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBic0NDID0gQ0ZYX1dpZGVTdHJpbmcoY3NDQ0FkZHJlc3MpLlVURjE2TEVfRW5jb2RlKCk7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzQmNjID0gQ0ZYX1dpZGVTdHJpbmcoY3NCQ0NBZGRyZXNzKS5VVEYxNkxFX0VuY29kZSgpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBic1N1YmplY3QgPSBDRlhfV2lkZVN0cmluZyhjc1N1YmplY3QpLlVURjE2TEVfRW5jb2RlKCk7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzTXNnID0gQ0ZYX1dpZGVTdHJpbmcoY3NNc2cpLlVURjE2TEVfRW5jb2RlKCk7DQorDQorICAgIEZQREZfV0lERVNUUklORyBwVG8gPSAoRlBERl9XSURFU1RSSU5HKWJzVG8uR2V0QnVmZmVyKGJzVG8uR2V0TGVuZ3RoKCkpOw0KKyAgICBGUERGX1dJREVTVFJJTkcgcENDID0gKEZQREZfV0lERVNUUklORylic0NDLkdldEJ1ZmZlcihic0NDLkdldExlbmd0aCgpKTsNCisgICAgRlBERl9XSURFU1RSSU5HIHBCY2MgPSAoRlBERl9XSURFU1RSSU5HKWJzQmNjLkdldEJ1ZmZlcihic0JjYy5HZXRMZW5ndGgoKSk7DQorICAgIEZQREZfV0lERVNUUklORyBwU3ViamVjdCA9DQorICAgICAgICAoRlBERl9XSURFU1RSSU5HKWJzU3ViamVjdC5HZXRCdWZmZXIoYnNTdWJqZWN0LkdldExlbmd0aCgpKTsNCisgICAgRlBERl9XSURFU1RSSU5HIHBNc2cgPSAoRlBERl9XSURFU1RSSU5HKWJzTXNnLkdldEJ1ZmZlcihic01zZy5HZXRMZW5ndGgoKSk7DQorDQorICAgIHBFbnYtPkZGSV9FbWFpbFRvKHBGaWxlSGFuZGxlciwgcFRvLCBwU3ViamVjdCwgcENDLCBwQmNjLCBwTXNnKTsNCisgICAgYnNUby5SZWxlYXNlQnVmZmVyKCk7DQorICAgIGJzQ0MuUmVsZWFzZUJ1ZmZlcigpOw0KKyAgICBic0JjYy5SZWxlYXNlQnVmZmVyKCk7DQorICAgIGJzU3ViamVjdC5SZWxlYXNlQnVmZmVyKCk7DQorICAgIGJzTXNnLlJlbGVhc2VCdWZmZXIoKTsNCisgIH0gZWxzZSB7DQorICAgIC8vIGh0dHChomZ0cA0KKyAgICBDRlhfV2lkZVN0cmluZyB3czsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnMgPSBjc1VSTC5VVEYxNkxFX0VuY29kZSgpOw0KKyAgICBpbnQgbGVuID0gYnMuR2V0TGVuZ3RoKCkgLyBzaXplb2YodW5zaWduZWQgc2hvcnQpOw0KKyAgICBwRW52LT5GRklfVXBsb2FkVG8oDQorICAgICAgICBwRmlsZUhhbmRsZXIsIGZpbGVGbGFnLA0KKyAgICAgICAgKEZQREZfV0lERVNUUklORylicy5HZXRCdWZmZXIobGVuICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSkpOw0KKyAgICBicy5SZWxlYXNlQnVmZmVyKGxlbiAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOw0KKyAgfQ0KKw0KKyAgcmV0dXJuIGJSZXQ7DQorI2Vsc2UNCisgIHJldHVybiBUUlVFOw0KKyNlbmRpZg0KK30NCisNCitGWF9CT09MIENQREZYRkFfRG9jdW1lbnQ6OlNldEdsb2JhbFByb3BlcnR5KElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSkgew0KKyAgaWYgKGhEb2MgIT0gbV9wWEZBRG9jKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorDQorICBpZiAobV9wU0RLRG9jICYmIG1fcFNES0RvYy0+R2V0RW52KCktPkdldEpTUnVudGltZSgpKQ0KKyAgICByZXR1cm4gbV9wU0RLRG9jLT5HZXRFbnYoKS0+R2V0SlNSdW50aW1lKCktPlNldEhWYWx1ZUJ5TmFtZShzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVmFsdWUpOw0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENQREZYRkFfRG9jdW1lbnQ6OkdldFBERlNjcmlwdE9iamVjdChJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHV0ZjhOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsNCisgIGlmIChoRG9jICE9IG1fcFhGQURvYykNCisgICAgcmV0dXJuIEZBTFNFOw0KKw0KKyAgaWYgKCFtX3BTREtEb2MgfHwgIW1fcFNES0RvYy0+R2V0RW52KCktPkdldEpTUnVudGltZSgpKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorDQorICBpZiAoIW1fcEpTQ29udGV4dCkgew0KKyAgICBtX3BTREtEb2MtPkdldEVudigpLT5HZXRKU1J1bnRpbWUoKS0+U2V0UmVhZGVyRG9jdW1lbnQobV9wU0RLRG9jKTsNCisgICAgbV9wSlNDb250ZXh0ID0gbV9wU0RLRG9jLT5HZXRFbnYoKS0+R2V0SlNSdW50aW1lKCktPk5ld0NvbnRleHQoKTsNCisgIH0NCisNCisgIHJldHVybiBfR2V0SFZhbHVlQnlOYW1lKHV0ZjhOYW1lLCBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BTREtEb2MtPkdldEVudigpLT5HZXRKU1J1bnRpbWUoKSk7DQorfQ0KK0ZYX0JPT0wgQ1BERlhGQV9Eb2N1bWVudDo6R2V0R2xvYmFsUHJvcGVydHkoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFZhbHVlKSB7DQorICBpZiAoaERvYyAhPSBtX3BYRkFEb2MpDQorICAgIHJldHVybiBGQUxTRTsNCisgIGlmICghbV9wU0RLRG9jIHx8ICFtX3BTREtEb2MtPkdldEVudigpLT5HZXRKU1J1bnRpbWUoKSkNCisgICAgcmV0dXJuIEZBTFNFOw0KKw0KKyAgaWYgKCFtX3BKU0NvbnRleHQpIHsNCisgICAgbV9wU0RLRG9jLT5HZXRFbnYoKS0+R2V0SlNSdW50aW1lKCktPlNldFJlYWRlckRvY3VtZW50KG1fcFNES0RvYyk7DQorICAgIG1fcEpTQ29udGV4dCA9IG1fcFNES0RvYy0+R2V0RW52KCktPkdldEpTUnVudGltZSgpLT5OZXdDb250ZXh0KCk7DQorICB9DQorDQorICByZXR1cm4gX0dldEhWYWx1ZUJ5TmFtZShzelByb3BOYW1lLCBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BTREtEb2MtPkdldEVudigpLT5HZXRKU1J1bnRpbWUoKSk7DQorfQ0KK0ZYX0JPT0wgQ1BERlhGQV9Eb2N1bWVudDo6X0dldEhWYWx1ZUJ5TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHV0ZjhOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSlNfUnVudGltZSogcnVuVGltZSkgew0KKyAgcmV0dXJuIHJ1blRpbWUtPkdldEhWYWx1ZUJ5TmFtZSh1dGY4TmFtZSwgaFZhbHVlKTsNCit9DQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnBkZnhmYS9mcGRmeGZhX3BhZ2UuY3BwIGIvZnBkZnNkay9zcmMvZnBkZnhmYS9mcGRmeGZhX3BhZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYzllOTUKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL3NyYy9mcGRmeGZhL2ZwZGZ4ZmFfcGFnZS5jcHAKQEAgLTAsMCArMSwyNTUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mc2RrX2RlZmluZS5oIg0KKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnNka19tZ3IuaCINCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV91dGlsLmgiDQorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfZG9jLmgiDQorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfcGFnZS5oIg0KKw0KK0NQREZYRkFfUGFnZTo6Q1BERlhGQV9QYWdlKENQREZYRkFfRG9jdW1lbnQqIHBEb2MsIGludCBwYWdlX2luZGV4KQ0KKyAgICA6IG1fcFBERlBhZ2UoTlVMTCksDQorICAgICAgbV9wWEZBUGFnZVZpZXcoTlVMTCksDQorICAgICAgbV9pUGFnZUluZGV4KHBhZ2VfaW5kZXgpLA0KKyAgICAgIG1fcERvY3VtZW50KHBEb2MpLA0KKyAgICAgIG1faVJlZigxKSB7fQ0KKw0KK0NQREZYRkFfUGFnZTo6fkNQREZYRkFfUGFnZSgpIHsNCisgIGlmIChtX3BQREZQYWdlKQ0KKyAgICBkZWxldGUgbV9wUERGUGFnZTsNCisgIG1fcFBERlBhZ2UgPSBOVUxMOw0KKyAgbV9wWEZBUGFnZVZpZXcgPSBOVUxMOw0KK30NCisNCit2b2lkIENQREZYRkFfUGFnZTo6UmVsZWFzZSgpIHsNCisgIG1faVJlZi0tOw0KKyAgaWYgKG1faVJlZiA+IDApDQorICAgIHJldHVybjsNCisNCisgIGlmIChtX3BEb2N1bWVudCkNCisgICAgbV9wRG9jdW1lbnQtPlJlbW92ZVBhZ2UodGhpcyk7DQorDQorICBkZWxldGUgdGhpczsNCit9DQorDQorRlhfQk9PTCBDUERGWEZBX1BhZ2U6OkxvYWRQREZQYWdlKCkgew0KKyAgaWYgKCFtX3BEb2N1bWVudCkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgQ1BERl9Eb2N1bWVudCogcFBERkRvYyA9IG1fcERvY3VtZW50LT5HZXRQREZEb2MoKTsNCisgIGlmIChwUERGRG9jKSB7DQorICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwUERGRG9jLT5HZXRQYWdlKG1faVBhZ2VJbmRleCk7DQorICAgIGlmIChwRGljdCA9PSBOVUxMKQ0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgaWYgKG1fcFBERlBhZ2UpIHsNCisgICAgICBpZiAobV9wUERGUGFnZS0+bV9wRm9ybURpY3QgPT0gcERpY3QpDQorICAgICAgICByZXR1cm4gVFJVRTsNCisNCisgICAgICBkZWxldGUgbV9wUERGUGFnZTsNCisgICAgICBtX3BQREZQYWdlID0gTlVMTDsNCisgICAgfQ0KKw0KKyAgICBtX3BQREZQYWdlID0gbmV3IENQREZfUGFnZTsNCisgICAgbV9wUERGUGFnZS0+TG9hZChwUERGRG9jLCBwRGljdCk7DQorICAgIG1fcFBERlBhZ2UtPlBhcnNlQ29udGVudCgpOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisNCisgIHJldHVybiBGQUxTRTsNCit9DQorDQorRlhfQk9PTCBDUERGWEZBX1BhZ2U6OkxvYWRYRkFQYWdlVmlldygpIHsNCisgIGlmICghbV9wRG9jdW1lbnQpDQorICAgIHJldHVybiBGQUxTRTsNCisgIElYRkFfRG9jKiBwWEZBRG9jID0gbV9wRG9jdW1lbnQtPkdldFhGQURvYygpOw0KKyAgaWYgKCFwWEZBRG9jKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorDQorICBJWEZBX0RvY1ZpZXcqIHBYRkFEb2NWaWV3ID0gbV9wRG9jdW1lbnQtPkdldFhGQURvY1ZpZXcoKTsNCisgIGlmICghcFhGQURvY1ZpZXcpDQorICAgIHJldHVybiBGQUxTRTsNCisNCisgIElYRkFfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBYRkFEb2NWaWV3LT5HZXRQYWdlVmlldyhtX2lQYWdlSW5kZXgpOw0KKyAgaWYgKCFwUGFnZVZpZXcpDQorICAgIHJldHVybiBGQUxTRTsNCisNCisgIGlmIChtX3BYRkFQYWdlVmlldyA9PSBwUGFnZVZpZXcpDQorICAgIHJldHVybiBUUlVFOw0KKw0KKyAgbV9wWEZBUGFnZVZpZXcgPSBwUGFnZVZpZXc7DQorICAodm9pZCltX3BYRkFQYWdlVmlldy0+TG9hZFBhZ2VWaWV3KG51bGxwdHIpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KKw0KK0ZYX0JPT0wgQ1BERlhGQV9QYWdlOjpMb2FkUGFnZSgpIHsNCisgIGlmICghbV9wRG9jdW1lbnQgfHwgbV9pUGFnZUluZGV4IDwgMCkNCisgICAgcmV0dXJuIEZBTFNFOw0KKw0KKyAgaW50IGlEb2NUeXBlID0gbV9wRG9jdW1lbnQtPkdldERvY1R5cGUoKTsNCisgIHN3aXRjaCAoaURvY1R5cGUpIHsNCisgICAgY2FzZSBET0NUWVBFX1BERjoNCisgICAgY2FzZSBET0NUWVBFX1NUQVRJQ19YRkE6IHsNCisgICAgICByZXR1cm4gTG9hZFBERlBhZ2UoKTsNCisgICAgfQ0KKyAgICBjYXNlIERPQ1RZUEVfRFlOQU1JQ19YRkE6IHsNCisgICAgICByZXR1cm4gTG9hZFhGQVBhZ2VWaWV3KCk7DQorICAgIH0NCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkFMU0U7DQorICB9DQorDQorICByZXR1cm4gRkFMU0U7DQorfQ0KKw0KK0ZYX0JPT0wgQ1BERlhGQV9QYWdlOjpMb2FkUERGUGFnZShDUERGX0RpY3Rpb25hcnkqIHBhZ2VEaWN0KSB7DQorICBpZiAoIW1fcERvY3VtZW50IHx8IG1faVBhZ2VJbmRleCA8IDAgfHwgIXBhZ2VEaWN0KQ0KKyAgICByZXR1cm4gRkFMU0U7DQorDQorICBpZiAobV9wUERGUGFnZSkNCisgICAgZGVsZXRlIG1fcFBERlBhZ2U7DQorDQorICBtX3BQREZQYWdlID0gbmV3IENQREZfUGFnZSgpOw0KKyAgbV9wUERGUGFnZS0+TG9hZChtX3BEb2N1bWVudC0+R2V0UERGRG9jKCksIHBhZ2VEaWN0KTsNCisgIG1fcFBERlBhZ2UtPlBhcnNlQ29udGVudCgpOw0KKw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KKw0KK0ZYX0ZMT0FUIENQREZYRkFfUGFnZTo6R2V0UGFnZVdpZHRoKCkgew0KKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOw0KKw0KKyAgaWYgKCFtX3BQREZQYWdlICYmICFtX3BYRkFQYWdlVmlldykNCisgICAgcmV0dXJuIDAuMGY7DQorDQorICBpbnQgbkRvY1R5cGUgPSBtX3BEb2N1bWVudC0+R2V0RG9jVHlwZSgpOw0KKyAgc3dpdGNoIChuRG9jVHlwZSkgew0KKyAgICBjYXNlIERPQ1RZUEVfRFlOQU1JQ19YRkE6IHsNCisgICAgICBpZiAobV9wWEZBUGFnZVZpZXcpIHsNCisgICAgICAgIENGWF9SZWN0RiByZWN0Ow0KKyAgICAgICAgbV9wWEZBUGFnZVZpZXctPkdldFBhZ2VWaWV3UmVjdChyZWN0KTsNCisgICAgICAgIHJldHVybiByZWN0LndpZHRoOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBET0NUWVBFX1NUQVRJQ19YRkE6DQorICAgIGNhc2UgRE9DVFlQRV9QREY6IHsNCisgICAgICBpZiAobV9wUERGUGFnZSkNCisgICAgICAgIHJldHVybiBtX3BQREZQYWdlLT5HZXRQYWdlV2lkdGgoKTsNCisgICAgfSBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gMC4wZjsNCisgIH0NCisNCisgIHJldHVybiAwLjBmOw0KK30NCisNCitGWF9GTE9BVCBDUERGWEZBX1BhZ2U6OkdldFBhZ2VIZWlnaHQoKSB7DQorICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7DQorDQorICBpZiAoIW1fcFBERlBhZ2UgJiYgIW1fcFhGQVBhZ2VWaWV3KQ0KKyAgICByZXR1cm4gMC4wZjsNCisNCisgIGludCBuRG9jVHlwZSA9IG1fcERvY3VtZW50LT5HZXREb2NUeXBlKCk7DQorICBzd2l0Y2ggKG5Eb2NUeXBlKSB7DQorICAgIGNhc2UgRE9DVFlQRV9QREY6DQorICAgIGNhc2UgRE9DVFlQRV9TVEFUSUNfWEZBOiB7DQorICAgICAgaWYgKG1fcFBERlBhZ2UpDQorICAgICAgICByZXR1cm4gbV9wUERGUGFnZS0+R2V0UGFnZUhlaWdodCgpOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIERPQ1RZUEVfRFlOQU1JQ19YRkE6IHsNCisgICAgICBpZiAobV9wWEZBUGFnZVZpZXcpIHsNCisgICAgICAgIENGWF9SZWN0RiByZWN0Ow0KKyAgICAgICAgbV9wWEZBUGFnZVZpZXctPkdldFBhZ2VWaWV3UmVjdChyZWN0KTsNCisgICAgICAgIHJldHVybiByZWN0LmhlaWdodDsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIDAuMGY7DQorICB9DQorDQorICByZXR1cm4gMC4wZjsNCit9DQorDQordm9pZCBDUERGWEZBX1BhZ2U6OkRldmljZVRvUGFnZShpbnQgc3RhcnRfeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF95LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRldmljZV94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRldmljZV95LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwYWdlX3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBhZ2VfeSkgew0KKyAgQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOw0KKw0KKyAgaWYgKCFtX3BQREZQYWdlICYmICFtX3BYRkFQYWdlVmlldykNCisgICAgcmV0dXJuOw0KKw0KKyAgQ0ZYX01hdHJpeCBwYWdlMmRldmljZTsNCisgIENGWF9NYXRyaXggZGV2aWNlMnBhZ2U7DQorICBGWF9GTE9BVCBwYWdlX3hfZiwgcGFnZV95X2Y7DQorDQorICBHZXREaXNwbGF5TWF0cml4KHBhZ2UyZGV2aWNlLCBzdGFydF94LCBzdGFydF95LCBzaXplX3gsIHNpemVfeSwgcm90YXRlKTsNCisNCisgIGRldmljZTJwYWdlLlNldFJldmVyc2UocGFnZTJkZXZpY2UpOw0KKyAgZGV2aWNlMnBhZ2UuVHJhbnNmb3JtKChGWF9GTE9BVCkoZGV2aWNlX3gpLCAoRlhfRkxPQVQpKGRldmljZV95KSwgcGFnZV94X2YsDQorICAgICAgICAgICAgICAgICAgICAgICAgcGFnZV95X2YpOw0KKw0KKyAgKnBhZ2VfeCA9IChwYWdlX3hfZik7DQorICAqcGFnZV95ID0gKHBhZ2VfeV9mKTsNCit9DQorDQordm9pZCBDUERGWEZBX1BhZ2U6OlBhZ2VUb0RldmljZShpbnQgc3RhcnRfeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF95LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGRldmljZV94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBkZXZpY2VfeSkgew0KKyAgaWYgKCFtX3BQREZQYWdlICYmICFtX3BYRkFQYWdlVmlldykNCisgICAgcmV0dXJuOw0KKw0KKyAgQ0ZYX01hdHJpeCBwYWdlMmRldmljZTsNCisgIEZYX0ZMT0FUIGRldmljZV94X2YsIGRldmljZV95X2Y7DQorDQorICBHZXREaXNwbGF5TWF0cml4KHBhZ2UyZGV2aWNlLCBzdGFydF94LCBzdGFydF95LCBzaXplX3gsIHNpemVfeSwgcm90YXRlKTsNCisNCisgIHBhZ2UyZGV2aWNlLlRyYW5zZm9ybSgoKEZYX0ZMT0FUKXBhZ2VfeCksICgoRlhfRkxPQVQpcGFnZV95KSwgZGV2aWNlX3hfZiwNCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfeV9mKTsNCisNCisgICpkZXZpY2VfeCA9IEZYU1lTX3JvdW5kKGRldmljZV94X2YpOw0KKyAgKmRldmljZV95ID0gRlhTWVNfcm91bmQoZGV2aWNlX3lfZik7DQorfQ0KKw0KK3ZvaWQgQ1BERlhGQV9QYWdlOjpHZXREaXNwbGF5TWF0cml4KENGWF9NYXRyaXgmIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeFBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeVBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpUm90YXRlKSBjb25zdCB7DQorICBBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7DQorDQorICBpZiAoIW1fcFBERlBhZ2UgJiYgIW1fcFhGQVBhZ2VWaWV3KQ0KKyAgICByZXR1cm47DQorDQorICBpbnQgbkRvY1R5cGUgPSBtX3BEb2N1bWVudC0+R2V0RG9jVHlwZSgpOw0KKyAgc3dpdGNoIChuRG9jVHlwZSkgew0KKyAgICBjYXNlIERPQ1RZUEVfRFlOQU1JQ19YRkE6IHsNCisgICAgICBpZiAobV9wWEZBUGFnZVZpZXcpIHsNCisgICAgICAgIENGWF9SZWN0IHJlY3Q7DQorICAgICAgICByZWN0LlNldCh4UG9zLCB5UG9zLCB4U2l6ZSwgeVNpemUpOw0KKyAgICAgICAgbV9wWEZBUGFnZVZpZXctPkdldERpc3BsYXlNYXRyaXgobWF0cml4LCByZWN0LCBpUm90YXRlKTsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRE9DVFlQRV9QREY6DQorICAgIGNhc2UgRE9DVFlQRV9TVEFUSUNfWEZBOiB7DQorICAgICAgaWYgKG1fcFBERlBhZ2UpIHsNCisgICAgICAgIG1fcFBERlBhZ2UtPkdldERpc3BsYXlNYXRyaXgobWF0cml4LCB4UG9zLCB5UG9zLCB4U2l6ZSwgeVNpemUsIGlSb3RhdGUpOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm47DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZwZGZ4ZmEvZnBkZnhmYV91dGlsLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZ4ZmEvZnBkZnhmYV91dGlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzFjZjliCi0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9zcmMvZnBkZnhmYS9mcGRmeGZhX3V0aWwuY3BwCkBAIC0wLDAgKzEsNjUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mc2RrX2RlZmluZS5oIg0KKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnNka19tZ3IuaCINCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV91dGlsLmgiDQorDQorQ0ZYX1B0ckFycmF5IENYRkFfRldMQWRhcHRlclRpbWVyTWdyOjptc190aW1lckFycmF5Ow0KKw0KK0ZXTF9FUlIgQ1hGQV9GV0xBZGFwdGVyVGltZXJNZ3I6OlN0YXJ0KElGV0xfVGltZXIqIHBUaW1lciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0VsYXBzZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSFRJTUVSJiBoVGltZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW1tZWRpYXRlbHkgLyogPSBUUlVFICovKSB7DQorICBpZiAobV9wRW52KSB7DQorICAgIHVpbnQzMl90IHVJREV2ZW50ID0gbV9wRW52LT5GRklfU2V0VGltZXIoZHdFbGFwc2UsIFRpbWVyUHJvYyk7DQorICAgIENGV0xfVGltZXJJbmZvKiBwSW5mbyA9IG5ldyBDRldMX1RpbWVySW5mbzsNCisgICAgcEluZm8tPnVJREV2ZW50ID0gdUlERXZlbnQ7DQorICAgIHBJbmZvLT5wVGltZXIgPSBwVGltZXI7DQorICAgIG1zX3RpbWVyQXJyYXkuQWRkKHBJbmZvKTsNCisNCisgICAgaFRpbWVyID0gKEZXTF9IVElNRVIpcEluZm87DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIH0NCisNCisgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorfQ0KKw0KK0ZXTF9FUlIgQ1hGQV9GV0xBZGFwdGVyVGltZXJNZ3I6OlN0b3AoRldMX0hUSU1FUiBoVGltZXIpIHsNCisgIGlmICghaFRpbWVyKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKw0KKyAgaWYgKG1fcEVudikgew0KKyAgICBDRldMX1RpbWVySW5mbyogcEluZm8gPSAoQ0ZXTF9UaW1lckluZm8qKWhUaW1lcjsNCisNCisgICAgbV9wRW52LT5GRklfS2lsbFRpbWVyKHBJbmZvLT51SURFdmVudCk7DQorDQorICAgIGludDMyX3QgaW5kZXggPSBtc190aW1lckFycmF5LkZpbmQocEluZm8pOw0KKyAgICBpZiAoaW5kZXggPj0gMCkgew0KKyAgICAgIG1zX3RpbWVyQXJyYXkuUmVtb3ZlQXQoaW5kZXgpOw0KKyAgICAgIGRlbGV0ZSBwSW5mbzsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorDQorICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KK30NCisNCit2b2lkIENYRkFfRldMQWRhcHRlclRpbWVyTWdyOjpUaW1lclByb2MoaW50MzJfdCBpZEV2ZW50KSB7DQorICBDRldMX1RpbWVySW5mbyogcEluZm8gPSBOVUxMOw0KKyAgaW50MzJfdCBpQ291bnQgPSBDWEZBX0ZXTEFkYXB0ZXJUaW1lck1ncjo6bXNfdGltZXJBcnJheS5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBDRldMX1RpbWVySW5mbyogcFRlbXAgPQ0KKyAgICAgICAgKENGV0xfVGltZXJJbmZvKilDWEZBX0ZXTEFkYXB0ZXJUaW1lck1ncjo6bXNfdGltZXJBcnJheS5HZXRBdChpKTsNCisgICAgaWYgKHBUZW1wLT51SURFdmVudCA9PSBpZEV2ZW50KSB7DQorICAgICAgcEluZm8gPSBwVGVtcDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHBJbmZvKSB7DQorICAgIHBJbmZvLT5wVGltZXItPlJ1bigoRldMX0hUSU1FUilwSW5mbyk7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZzZGtfYWN0aW9uaGFuZGxlci5jcHAgYi9mcGRmc2RrL3NyYy9mc2RrX2FjdGlvbmhhbmRsZXIuY3BwCmluZGV4IGZiOGJjYjIuLjk1MjRiMmEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZzZGtfYWN0aW9uaGFuZGxlci5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnNka19hY3Rpb25oYW5kbGVyLmNwcApAQCAtNCw4MjcgKzQsNjI4IEBACiAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX21nci5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnNka19hY3Rpb25oYW5kbGVyLmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZzZGtfYWN0aW9uaGFuZGxlci5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mc2RrX2RlZmluZS5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mc2RrX21nci5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiCiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENCQV9BY3Rpb25IYW5kbGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLUNQREZTREtfQWN0aW9uSGFuZGxlcjo6Q1BERlNES19BY3Rpb25IYW5kbGVyKENQREZEb2NfRW52aXJvbm1lbnQqIHBFdmkpIDoKLQltX3BGb3JtQWN0aW9uSGFuZGxlcihOVUxMKSwKLQltX3BNZWRpYUFjdGlvbkhhbmRsZXIoTlVMTCkKLXsKLQkJbV9wRm9ybUFjdGlvbkhhbmRsZXIgPSBuZXcgQ1BERlNES19Gb3JtQWN0aW9uSGFuZGxlcjsKK0NQREZTREtfQWN0aW9uSGFuZGxlcjo6Q1BERlNES19BY3Rpb25IYW5kbGVyKCkKKyAgICA6IG1fcEZvcm1BY3Rpb25IYW5kbGVyKG5ldyBDUERGU0RLX0Zvcm1BY3Rpb25IYW5kbGVyKSB7CiB9CiAKLUNQREZTREtfQWN0aW9uSGFuZGxlcjo6fkNQREZTREtfQWN0aW9uSGFuZGxlcigpCi17Ci0JaWYobV9wRm9ybUFjdGlvbkhhbmRsZXIpCi0JewotCQlkZWxldGUgbV9wRm9ybUFjdGlvbkhhbmRsZXI7Ci0JCW1fcEZvcm1BY3Rpb25IYW5kbGVyID0gTlVMTDsKLQl9CitGWF9CT09MIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fRG9jT3Blbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KSB7CisgIENGWF9QdHJMaXN0IGxpc3Q7CisgIHJldHVybiBFeGVjdXRlRG9jdW1lbnRPcGVuQWN0aW9uKGFjdGlvbiwgcERvY3VtZW50LCBsaXN0KTsKIH0KIAotdm9pZCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OlNldEZvcm1BY3Rpb25IYW5kbGVyKENQREZTREtfRm9ybUFjdGlvbkhhbmRsZXIqIHBIYW5kbGVyKQotewotCUFTU0VSVChwSGFuZGxlciAhPSBOVUxMKTsKLQlBU1NFUlQobV9wRm9ybUFjdGlvbkhhbmRsZXIgPT0gTlVMTCk7Ci0JbV9wRm9ybUFjdGlvbkhhbmRsZXIgPSBwSGFuZGxlcjsKK0ZYX0JPT0wgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9KYXZhU2NyaXB0KAorICAgIGNvbnN0IENQREZfQWN0aW9uJiBKc0FjdGlvbiwKKyAgICBDRlhfV2lkZVN0cmluZyBjc0pTTmFtZSwKKyAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsKKyAgaWYgKEpzQWN0aW9uLkdldFR5cGUoKSA9PSBDUERGX0FjdGlvbjo6SmF2YVNjcmlwdCkgeworICAgIENGWF9XaWRlU3RyaW5nIHN3SlMgPSBKc0FjdGlvbi5HZXRKYXZhU2NyaXB0KCk7CisgICAgaWYgKCFzd0pTLklzRW1wdHkoKSkgeworICAgICAgUnVuRG9jdW1lbnRPcGVuSmF2YVNjcmlwdChwRG9jdW1lbnQsIGNzSlNOYW1lLCBzd0pTKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorCisgIHJldHVybiBGQUxTRTsKIH0KIAotdm9pZCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OlNldE1lZGlhQWN0aW9uSGFuZGxlcihDUERGU0RLX01lZGlhQWN0aW9uSGFuZGxlciogcEhhbmRsZXIpCi17Ci0JQVNTRVJUKHBIYW5kbGVyICE9IE5VTEwpOwotCUFTU0VSVChtX3BNZWRpYUFjdGlvbkhhbmRsZXIgPT0gTlVMTCk7Ci0JbV9wTWVkaWFBY3Rpb25IYW5kbGVyID0gcEhhbmRsZXI7CitGWF9CT09MIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fRmllbGRKYXZhU2NyaXB0KAorICAgIGNvbnN0IENQREZfQWN0aW9uJiBKc0FjdGlvbiwKKyAgICBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCisgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAorICAgIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSkgeworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gcERvY3VtZW50LT5HZXRFbnYoKTsKKyAgQVNTRVJUKHBFbnYpOworICBpZiAocEVudi0+SXNKU0luaXRpYXRlZCgpICYmIEpzQWN0aW9uLkdldFR5cGUoKSA9PSBDUERGX0FjdGlvbjo6SmF2YVNjcmlwdCkgeworICAgIENGWF9XaWRlU3RyaW5nIHN3SlMgPSBKc0FjdGlvbi5HZXRKYXZhU2NyaXB0KCk7CisgICAgaWYgKCFzd0pTLklzRW1wdHkoKSkgeworICAgICAgUnVuRmllbGRKYXZhU2NyaXB0KHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgdHlwZSwgZGF0YSwgc3dKUyk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQogCi12b2lkIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RGVzdHJveSgpCi17Ci0JZGVsZXRlIHRoaXM7CitGWF9CT09MIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fUGFnZSgKKyAgICBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgIGVudW0gQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlVHlwZSwKKyAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsKKyAgQ0ZYX1B0ckxpc3QgbGlzdDsKKyAgcmV0dXJuIEV4ZWN1dGVEb2N1bWVudFBhZ2VBY3Rpb24oYWN0aW9uLCBlVHlwZSwgcERvY3VtZW50LCBsaXN0KTsKIH0KIAotLy9kb2N1bWVudCBvcGVuCi1GWF9CT09MCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fRG9jT3Blbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci0JQ0ZYX1B0ckxpc3QgbGlzdDsKLQlyZXR1cm4gRXhlY3V0ZURvY3VtZW50T3BlbkFjdGlvbihhY3Rpb24sIHBEb2N1bWVudCwgbGlzdCk7CitGWF9CT09MIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fRG9jdW1lbnQoCisgICAgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwKKyAgICBlbnVtIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZVR5cGUsCisgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KSB7CisgIENGWF9QdHJMaXN0IGxpc3Q7CisgIHJldHVybiBFeGVjdXRlRG9jdW1lbnRQYWdlQWN0aW9uKGFjdGlvbiwgZVR5cGUsIHBEb2N1bWVudCwgbGlzdCk7CiB9CiAKLS8vZG9jdW1lbnQgb3BlbgotRlhfQk9PTAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0phdmFTY3JpcHQoY29uc3QgQ1BERl9BY3Rpb24mIEpzQWN0aW9uLENGWF9XaWRlU3RyaW5nIGNzSlNOYW1lLAotCQkJCQkJCUNQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLQlpZiAoSnNBY3Rpb24uR2V0VHlwZSgpID09IENQREZfQWN0aW9uOjpKYXZhU2NyaXB0KQotCXsKLQkJQ0ZYX1dpZGVTdHJpbmcgc3dKUyA9IEpzQWN0aW9uLkdldEphdmFTY3JpcHQoKTsKLQkJaWYgKCFzd0pTLklzRW1wdHkoKSkKLQkJewotCQkJUnVuRG9jdW1lbnRPcGVuSmF2YVNjcmlwdChwRG9jdW1lbnQsIGNzSlNOYW1lLCBzd0pTKTsKLQkJCXJldHVybiBUUlVFOwotCQl9Ci0JfQotCi0JcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0Jvb2tNYXJrKENQREZfQm9va21hcmsqIHBCb29rTWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsKKyAgQ0ZYX1B0ckxpc3QgbGlzdDsKKyAgcmV0dXJuIEV4ZWN1dGVCb29rTWFyayhhY3Rpb24sIHBEb2N1bWVudCwgcEJvb2tNYXJrLCBsaXN0KTsKIH0KIAotRlhfQk9PTAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0ZpZWxkSmF2YVNjcmlwdChjb25zdCBDUERGX0FjdGlvbiYgSnNBY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKLQkJCQkJCQkJCUNQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCi0JCQkJCQkJCQlQREZTREtfRmllbGRBY3Rpb24mIGRhdGEpCi17Ci0JQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IHBEb2N1bWVudC0+R2V0RW52KCk7Ci0JQVNTRVJUKHBFbnYpOwotCWlmIChwRW52LT5Jc0pTSW5pdGlhdGVkKCkgJiYgSnNBY3Rpb24uR2V0VHlwZSgpID09IENQREZfQWN0aW9uOjpKYXZhU2NyaXB0KQotCXsKLQkJQ0ZYX1dpZGVTdHJpbmcgc3dKUyA9IEpzQWN0aW9uLkdldEphdmFTY3JpcHQoKTsKLQkJaWYgKCFzd0pTLklzRW1wdHkoKSkKLQkJewotCQkJUnVuRmllbGRKYXZhU2NyaXB0KHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgdHlwZSwgZGF0YSwgc3dKUyk7Ci0JCQlyZXR1cm4gVFJVRTsKLQkJfQotCX0KLQlyZXR1cm4gRkFMU0U7CitGWF9CT09MIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fU2NyZWVuKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7CisgIENGWF9QdHJMaXN0IGxpc3Q7CisgIHJldHVybiBFeGVjdXRlU2NyZWVuQWN0aW9uKGFjdGlvbiwgdHlwZSwgcERvY3VtZW50LCBwU2NyZWVuLCBsaXN0KTsKIH0KIAotRlhfQk9PTAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX1BhZ2UoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgZW51bSBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVUeXBlLAotCQkJCQkJCQkJCUNQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLQlDRlhfUHRyTGlzdCBsaXN0OwotCXJldHVybiBFeGVjdXRlRG9jdW1lbnRQYWdlQWN0aW9uKGFjdGlvbiwgZVR5cGUsIHBEb2N1bWVudCwgbGlzdCk7CitGWF9CT09MIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fTGluayhjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KSB7CisgIENGWF9QdHJMaXN0IGxpc3Q7CisgIHJldHVybiBFeGVjdXRlTGlua0FjdGlvbihhY3Rpb24sIHBEb2N1bWVudCwgbGlzdCk7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9Eb2N1bWVudChjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBlbnVtIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZVR5cGUsCi0JCQkJCQkJCQkJCSBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci0JQ0ZYX1B0ckxpc3QgbGlzdDsKLQlyZXR1cm4gRXhlY3V0ZURvY3VtZW50UGFnZUFjdGlvbihhY3Rpb24sIGVUeXBlLCBwRG9jdW1lbnQsIGxpc3QpOworRlhfQk9PTCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0ZpZWxkKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEpIHsKKyAgQ0ZYX1B0ckxpc3QgbGlzdDsKKyAgcmV0dXJuIEV4ZWN1dGVGaWVsZEFjdGlvbihhY3Rpb24sIHR5cGUsIHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgZGF0YSwgbGlzdCk7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9Cb29rTWFyayhDUERGX0Jvb2ttYXJrICpwQm9va01hcmssIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKLQkJCQkJCQlDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci0JQ0ZYX1B0ckxpc3QgbGlzdDsKLQlyZXR1cm4gdGhpcy0+RXhlY3V0ZUJvb2tNYXJrKGFjdGlvbiwgcERvY3VtZW50LCBwQm9va01hcmssIGxpc3QpOworRlhfQk9PTCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkV4ZWN1dGVEb2N1bWVudE9wZW5BY3Rpb24oCisgICAgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwKKyAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgQ0ZYX1B0ckxpc3QmIGxpc3QpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IGFjdGlvbi5HZXREaWN0KCk7CisgIGlmIChsaXN0LkZpbmQocERpY3QpKQorICAgIHJldHVybiBGQUxTRTsKKworICBsaXN0LkFkZFRhaWwocERpY3QpOworCisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBwRG9jdW1lbnQtPkdldEVudigpOworICBBU1NFUlQocEVudik7CisgIGlmIChhY3Rpb24uR2V0VHlwZSgpID09IENQREZfQWN0aW9uOjpKYXZhU2NyaXB0KSB7CisgICAgaWYgKHBFbnYtPklzSlNJbml0aWF0ZWQoKSkgeworICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dKUyA9IGFjdGlvbi5HZXRKYXZhU2NyaXB0KCk7CisgICAgICBpZiAoIXN3SlMuSXNFbXB0eSgpKSB7CisgICAgICAgIFJ1bkRvY3VtZW50T3BlbkphdmFTY3JpcHQocERvY3VtZW50LCBMIiIsIHN3SlMpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBEb0FjdGlvbl9Ob0pzKGFjdGlvbiwgcERvY3VtZW50KTsKKyAgfQorCisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBhY3Rpb24uR2V0U3ViQWN0aW9uc0NvdW50KCk7IGkgPCBzejsgaSsrKSB7CisgICAgQ1BERl9BY3Rpb24gc3ViYWN0aW9uID0gYWN0aW9uLkdldFN1YkFjdGlvbihpKTsKKyAgICBpZiAoIUV4ZWN1dGVEb2N1bWVudE9wZW5BY3Rpb24oc3ViYWN0aW9uLCBwRG9jdW1lbnQsIGxpc3QpKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9TY3JlZW4oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAotCQkJCQkJCQkJCUNQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKLXsKLQlDRlhfUHRyTGlzdCBsaXN0OwotCXJldHVybiB0aGlzLT5FeGVjdXRlU2NyZWVuQWN0aW9uKGFjdGlvbiwgdHlwZSwgcERvY3VtZW50LCBwU2NyZWVuLCBsaXN0KTsKK0ZYX0JPT0wgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlTGlua0FjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyTGlzdCYgbGlzdCkgeworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gYWN0aW9uLkdldERpY3QoKTsKKyAgaWYgKGxpc3QuRmluZChwRGljdCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGxpc3QuQWRkVGFpbChwRGljdCk7CisKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IHBEb2N1bWVudC0+R2V0RW52KCk7CisgIEFTU0VSVChwRW52KTsKKyAgaWYgKGFjdGlvbi5HZXRUeXBlKCkgPT0gQ1BERl9BY3Rpb246OkphdmFTY3JpcHQpIHsKKyAgICBpZiAocEVudi0+SXNKU0luaXRpYXRlZCgpKSB7CisgICAgICBDRlhfV2lkZVN0cmluZyBzd0pTID0gYWN0aW9uLkdldEphdmFTY3JpcHQoKTsKKyAgICAgIGlmICghc3dKUy5Jc0VtcHR5KCkpIHsKKyAgICAgICAgSUpTX1J1bnRpbWUqIHBSdW50aW1lID0gcERvY3VtZW50LT5HZXRKc1J1bnRpbWUoKTsKKyAgICAgICAgcFJ1bnRpbWUtPlNldFJlYWRlckRvY3VtZW50KHBEb2N1bWVudCk7CisKKyAgICAgICAgSUpTX0NvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0NvbnRleHQoKTsKKyAgICAgICAgcENvbnRleHQtPk9uTGlua19Nb3VzZVVwKHBEb2N1bWVudCk7CisKKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NJbmZvOworICAgICAgICBGWF9CT09MIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KHN3SlMsICZjc0luZm8pOworICAgICAgICBpZiAoIWJSZXQpIHsKKyAgICAgICAgICAvLyBGSVhNRTogcmV0dXJuIGVycm9yLgorICAgICAgICB9CisKKyAgICAgICAgcFJ1bnRpbWUtPlJlbGVhc2VDb250ZXh0KHBDb250ZXh0KTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgRG9BY3Rpb25fTm9KcyhhY3Rpb24sIHBEb2N1bWVudCk7CisgIH0KKworICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gYWN0aW9uLkdldFN1YkFjdGlvbnNDb3VudCgpOyBpIDwgc3o7IGkrKykgeworICAgIENQREZfQWN0aW9uIHN1YmFjdGlvbiA9IGFjdGlvbi5HZXRTdWJBY3Rpb24oaSk7CisgICAgaWYgKCFFeGVjdXRlTGlua0FjdGlvbihzdWJhY3Rpb24sIHBEb2N1bWVudCwgbGlzdCkpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0xpbmsoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwKLQkJCQkJCQkJCQlDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci0JQ0ZYX1B0ckxpc3QgbGlzdDsKLQlyZXR1cm4gRXhlY3V0ZUxpbmtBY3Rpb24oYWN0aW9uLCBwRG9jdW1lbnQsIGxpc3QpOworRlhfQk9PTCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkV4ZWN1dGVEb2N1bWVudFBhZ2VBY3Rpb24oCisgICAgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwKKyAgICBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCisgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgIENGWF9QdHJMaXN0JiBsaXN0KSB7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBhY3Rpb24uR2V0RGljdCgpOworICBpZiAobGlzdC5GaW5kKHBEaWN0KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgbGlzdC5BZGRUYWlsKHBEaWN0KTsKKworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gcERvY3VtZW50LT5HZXRFbnYoKTsKKyAgQVNTRVJUKHBFbnYpOworICBpZiAoYWN0aW9uLkdldFR5cGUoKSA9PSBDUERGX0FjdGlvbjo6SmF2YVNjcmlwdCkgeworICAgIGlmIChwRW52LT5Jc0pTSW5pdGlhdGVkKCkpIHsKKyAgICAgIENGWF9XaWRlU3RyaW5nIHN3SlMgPSBhY3Rpb24uR2V0SmF2YVNjcmlwdCgpOworICAgICAgaWYgKCFzd0pTLklzRW1wdHkoKSkgeworICAgICAgICBSdW5Eb2N1bWVudFBhZ2VKYXZhU2NyaXB0KHBEb2N1bWVudCwgdHlwZSwgc3dKUyk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIERvQWN0aW9uX05vSnMoYWN0aW9uLCBwRG9jdW1lbnQpOworICB9CisKKyAgaWYgKCFJc1ZhbGlkRG9jVmlldyhwRG9jdW1lbnQpKQorICAgIHJldHVybiBGQUxTRTsKKworICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gYWN0aW9uLkdldFN1YkFjdGlvbnNDb3VudCgpOyBpIDwgc3o7IGkrKykgeworICAgIENQREZfQWN0aW9uIHN1YmFjdGlvbiA9IGFjdGlvbi5HZXRTdWJBY3Rpb24oaSk7CisgICAgaWYgKCFFeGVjdXRlRG9jdW1lbnRQYWdlQWN0aW9uKHN1YmFjdGlvbiwgdHlwZSwgcERvY3VtZW50LCBsaXN0KSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fRmllbGQoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAotCQkJCQkJCQkJCUNQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKLQkJCQkJCQkJCQlDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhKQotewotCUNGWF9QdHJMaXN0IGxpc3Q7Ci0JcmV0dXJuIEV4ZWN1dGVGaWVsZEFjdGlvbihhY3Rpb24sIHR5cGUsIHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgZGF0YSwgbGlzdCk7Ci19Ci0KLUZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlRG9jdW1lbnRPcGVuQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJMaXN0JiBsaXN0KQotewotCUNQREZfRGljdGlvbmFyeSogcERpY3QgPSBhY3Rpb24uR2V0RGljdCgpOwotCWlmIChsaXN0LkZpbmQocERpY3QpKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlsaXN0LkFkZFRhaWwocERpY3QpOwotCi0JQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IHBEb2N1bWVudC0+R2V0RW52KCk7Ci0JQVNTRVJUKHBFbnYpOwotCWlmIChhY3Rpb24uR2V0VHlwZSgpID09IENQREZfQWN0aW9uOjpKYXZhU2NyaXB0KQotCXsKLQkJaWYocEVudi0+SXNKU0luaXRpYXRlZCgpKQotCQl7Ci0JCQlDRlhfV2lkZVN0cmluZyBzd0pTID0gYWN0aW9uLkdldEphdmFTY3JpcHQoKTsKLQkJCWlmICghc3dKUy5Jc0VtcHR5KCkpCi0JCQl7Ci0JCQkJUnVuRG9jdW1lbnRPcGVuSmF2YVNjcmlwdChwRG9jdW1lbnQsIEwiIiwgc3dKUyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJRG9BY3Rpb25fTm9KcyhhY3Rpb24sIHBEb2N1bWVudCk7Ci0JfQotCi0JZm9yIChGWF9JTlQzMiBpPTAsc3o9YWN0aW9uLkdldFN1YkFjdGlvbnNDb3VudCgpOyBpPHN6OyBpKyspCi0JewotCQlDUERGX0FjdGlvbiBzdWJhY3Rpb24gPSBhY3Rpb24uR2V0U3ViQWN0aW9uKGkpOwotCQlpZiAoIUV4ZWN1dGVEb2N1bWVudE9wZW5BY3Rpb24oc3ViYWN0aW9uLCBwRG9jdW1lbnQsIGxpc3QpKSByZXR1cm4gRkFMU0U7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlTGlua0FjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAlDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCi0JCQkJCQkJCQkJCQkgIENGWF9QdHJMaXN0JiBsaXN0KQotewotCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLQlDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gYWN0aW9uLkdldERpY3QoKTsKLQlpZiAobGlzdC5GaW5kKHBEaWN0KSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JbGlzdC5BZGRUYWlsKHBEaWN0KTsKLQotCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBwRG9jdW1lbnQtPkdldEVudigpOwotCUFTU0VSVChwRW52KTsKLQlpZiAoYWN0aW9uLkdldFR5cGUoKSA9PSBDUERGX0FjdGlvbjo6SmF2YVNjcmlwdCkKLQl7Ci0JCWlmKHBFbnYtPklzSlNJbml0aWF0ZWQoKSkKLQkJewotCQkJQ0ZYX1dpZGVTdHJpbmcgc3dKUyA9IGFjdGlvbi5HZXRKYXZhU2NyaXB0KCk7Ci0JCQlpZiAoIXN3SlMuSXNFbXB0eSgpKQotCQkJewotCQkJCUlGWEpTX1J1bnRpbWUqIHBSdW50aW1lID0gcERvY3VtZW50LT5HZXRKc1J1bnRpbWUoKTsgLy8/Pz8/Ci0JCQkJQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOwotCi0JCQkJcFJ1bnRpbWUtPlNldFJlYWRlckRvY3VtZW50KHBEb2N1bWVudCk7Ci0KLQkJCQlJRlhKU19Db250ZXh0KiBwQ29udGV4dCA9IHBSdW50aW1lLT5OZXdDb250ZXh0KCk7Ci0JCQkJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCi0JCQkJcENvbnRleHQtPk9uTGlua19Nb3VzZVVwKHBEb2N1bWVudCk7Ci0KLQkJCQlDRlhfV2lkZVN0cmluZyBjc0luZm87Ci0JCQkJRlhfQk9PTCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzd0pTLCBjc0luZm8pOwotCQkJCWlmICghYlJldCkKLQkJCQl7Ci0JCQkJCS8vIEZJWE1FOiByZXR1cm4gZXJyb3IuCi0JCQkJfQotCi0JCQkJcFJ1bnRpbWUtPlJlbGVhc2VDb250ZXh0KHBDb250ZXh0KTsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JewotCQlEb0FjdGlvbl9Ob0pzKGFjdGlvbiwgcERvY3VtZW50KTsKLQl9Ci0KLQlmb3IgKEZYX0lOVDMyIGk9MCxzej1hY3Rpb24uR2V0U3ViQWN0aW9uc0NvdW50KCk7IGk8c3o7IGkrKykKLQl7Ci0JCUNQREZfQWN0aW9uIHN1YmFjdGlvbiA9IGFjdGlvbi5HZXRTdWJBY3Rpb24oaSk7Ci0JCWlmICghRXhlY3V0ZUxpbmtBY3Rpb24oc3ViYWN0aW9uLCBwRG9jdW1lbnQsIGxpc3QpKSByZXR1cm4gRkFMU0U7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlRG9jdW1lbnRQYWdlQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKLQkJCQkJCQkJCQkJCSBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENGWF9QdHJMaXN0JiBsaXN0KQotewotCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLQlDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gYWN0aW9uLkdldERpY3QoKTsKLQlpZiAobGlzdC5GaW5kKHBEaWN0KSkKLQkJcmV0dXJuIEZBTFNFOwotCi0JbGlzdC5BZGRUYWlsKHBEaWN0KTsKLQotCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBwRG9jdW1lbnQtPkdldEVudigpOwotCUFTU0VSVChwRW52KTsKLQlpZiAoYWN0aW9uLkdldFR5cGUoKSA9PSBDUERGX0FjdGlvbjo6SmF2YVNjcmlwdCkKLQl7Ci0JCWlmKHBFbnYtPklzSlNJbml0aWF0ZWQoKSkKLQkJewotCQkJQ0ZYX1dpZGVTdHJpbmcgc3dKUyA9IGFjdGlvbi5HZXRKYXZhU2NyaXB0KCk7Ci0JCQlpZiAoIXN3SlMuSXNFbXB0eSgpKQotCQkJewotCQkJCVJ1bkRvY3VtZW50UGFnZUphdmFTY3JpcHQocERvY3VtZW50LCB0eXBlLCBzd0pTKTsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JewotCQlEb0FjdGlvbl9Ob0pzKGFjdGlvbiwgcERvY3VtZW50KTsKLQl9Ci0KLQlpZiAoIUlzVmFsaWREb2NWaWV3KHBEb2N1bWVudCkpCi0JCXJldHVybiBGQUxTRTsKLQotCWZvciAoRlhfSU5UMzIgaT0wLHN6PWFjdGlvbi5HZXRTdWJBY3Rpb25zQ291bnQoKTsgaTxzejsgaSsrKQotCXsKLQkJQ1BERl9BY3Rpb24gc3ViYWN0aW9uID0gYWN0aW9uLkdldFN1YkFjdGlvbihpKTsKLQkJaWYgKCFFeGVjdXRlRG9jdW1lbnRQYWdlQWN0aW9uKHN1YmFjdGlvbiwgdHlwZSwgcERvY3VtZW50LCBsaXN0KSkgcmV0dXJuIEZBTFNFOwotCX0KLQotCXJldHVybiBUUlVFOwotfQotCi1GWF9CT09MCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6SXNWYWxpZEZpZWxkKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0KQotewotICBBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwotICBBU1NFUlQocEZpZWxkRGljdCAhPSBOVUxMKTsKK0ZYX0JPT0wgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpJc1ZhbGlkRmllbGQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpIHsKKyAgQVNTRVJUKHBGaWVsZERpY3QpOwogCiAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKLSAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7Ci0KICAgQ1BERl9JbnRlckZvcm0qIHBQREZJbnRlckZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKLSAgQVNTRVJUKHBQREZJbnRlckZvcm0gIT0gTlVMTCk7Ci0KICAgcmV0dXJuIHBQREZJbnRlckZvcm0tPkdldEZpZWxkQnlEaWN0KHBGaWVsZERpY3QpICE9IE5VTEw7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlRmllbGRBY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAotCQkJCQkJCQkJCSAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKLQkJCQkJCQkJCQkgIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSwgQ0ZYX1B0ckxpc3QmIGxpc3QpCi17Ci0JQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlRmllbGRBY3Rpb24oCisgICAgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwKKyAgICBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCisgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAorICAgIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSwKKyAgICBDRlhfUHRyTGlzdCYgbGlzdCkgeworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gYWN0aW9uLkdldERpY3QoKTsKKyAgaWYgKGxpc3QuRmluZChwRGljdCkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IGFjdGlvbi5HZXREaWN0KCk7Ci0JaWYgKGxpc3QuRmluZChwRGljdCkpCi0JCXJldHVybiBGQUxTRTsKKyAgbGlzdC5BZGRUYWlsKHBEaWN0KTsKIAotCWxpc3QuQWRkVGFpbChwRGljdCk7CisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBwRG9jdW1lbnQtPkdldEVudigpOworICBBU1NFUlQocEVudik7CisgIGlmIChhY3Rpb24uR2V0VHlwZSgpID09IENQREZfQWN0aW9uOjpKYXZhU2NyaXB0KSB7CisgICAgaWYgKHBFbnYtPklzSlNJbml0aWF0ZWQoKSkgeworICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dKUyA9IGFjdGlvbi5HZXRKYXZhU2NyaXB0KCk7CisgICAgICBpZiAoIXN3SlMuSXNFbXB0eSgpKSB7CisgICAgICAgIFJ1bkZpZWxkSmF2YVNjcmlwdChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIHR5cGUsIGRhdGEsIHN3SlMpOworICAgICAgICBpZiAoIUlzVmFsaWRGaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQtPkdldEZpZWxkRGljdCgpKSkKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIERvQWN0aW9uX05vSnMoYWN0aW9uLCBwRG9jdW1lbnQpOworICB9CiAKLQlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gcERvY3VtZW50LT5HZXRFbnYoKTsKLQlBU1NFUlQocEVudik7Ci0JaWYgKGFjdGlvbi5HZXRUeXBlKCkgPT0gQ1BERl9BY3Rpb246OkphdmFTY3JpcHQpCi0JewotCQlpZihwRW52LT5Jc0pTSW5pdGlhdGVkKCkpCi0JCXsKLQkJCUNGWF9XaWRlU3RyaW5nIHN3SlMgPSBhY3Rpb24uR2V0SmF2YVNjcmlwdCgpOwotCQkJaWYgKCFzd0pTLklzRW1wdHkoKSkKLQkJCXsKLQkJCQlSdW5GaWVsZEphdmFTY3JpcHQocERvY3VtZW50LCBwRm9ybUZpZWxkLCB0eXBlLCBkYXRhLCBzd0pTKTsKLQkJCQlpZiAoIUlzVmFsaWRGaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQtPkdldEZpZWxkRGljdCgpKSkKLQkJCQkJcmV0dXJuIEZBTFNFOwotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCURvQWN0aW9uX05vSnMoYWN0aW9uLCBwRG9jdW1lbnQpOwotCX0KKyAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IGFjdGlvbi5HZXRTdWJBY3Rpb25zQ291bnQoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBDUERGX0FjdGlvbiBzdWJhY3Rpb24gPSBhY3Rpb24uR2V0U3ViQWN0aW9uKGkpOworICAgIGlmICghRXhlY3V0ZUZpZWxkQWN0aW9uKHN1YmFjdGlvbiwgdHlwZSwgcERvY3VtZW50LCBwRm9ybUZpZWxkLCBkYXRhLCBsaXN0KSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQogCi0JZm9yIChGWF9JTlQzMiBpPTAsc3o9YWN0aW9uLkdldFN1YkFjdGlvbnNDb3VudCgpOyBpPHN6OyBpKyspCi0JewotCQlDUERGX0FjdGlvbiBzdWJhY3Rpb24gPSBhY3Rpb24uR2V0U3ViQWN0aW9uKGkpOwotCQlpZiAoIUV4ZWN1dGVGaWVsZEFjdGlvbihzdWJhY3Rpb24sIHR5cGUsIHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgZGF0YSwgbGlzdCkpIHJldHVybiBGQUxTRTsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpFeGVjdXRlU2NyZWVuQWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKLQkJCQkJCQkJCQlDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4sIENGWF9QdHJMaXN0JiBsaXN0KQotewotCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RXhlY3V0ZVNjcmVlbkFjdGlvbigKKyAgICBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbiwKKyAgICBDRlhfUHRyTGlzdCYgbGlzdCkgeworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gYWN0aW9uLkdldERpY3QoKTsKKyAgaWYgKGxpc3QuRmluZChwRGljdCkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IGFjdGlvbi5HZXREaWN0KCk7Ci0JaWYgKGxpc3QuRmluZChwRGljdCkpCi0JCXJldHVybiBGQUxTRTsKKyAgbGlzdC5BZGRUYWlsKHBEaWN0KTsKIAotCWxpc3QuQWRkVGFpbChwRGljdCk7CisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBwRG9jdW1lbnQtPkdldEVudigpOworICBBU1NFUlQocEVudik7CisgIGlmIChhY3Rpb24uR2V0VHlwZSgpID09IENQREZfQWN0aW9uOjpKYXZhU2NyaXB0KSB7CisgICAgaWYgKHBFbnYtPklzSlNJbml0aWF0ZWQoKSkgeworICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dKUyA9IGFjdGlvbi5HZXRKYXZhU2NyaXB0KCk7CisgICAgICBpZiAoIXN3SlMuSXNFbXB0eSgpKSB7CisgICAgICAgIElKU19SdW50aW1lKiBwUnVudGltZSA9IHBEb2N1bWVudC0+R2V0SnNSdW50aW1lKCk7CisgICAgICAgIHBSdW50aW1lLT5TZXRSZWFkZXJEb2N1bWVudChwRG9jdW1lbnQpOwogCi0JQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IHBEb2N1bWVudC0+R2V0RW52KCk7Ci0JQVNTRVJUKHBFbnYpOwotCWlmIChhY3Rpb24uR2V0VHlwZSgpID09IENQREZfQWN0aW9uOjpKYXZhU2NyaXB0KQotCXsKLQkJaWYocEVudi0+SXNKU0luaXRpYXRlZCgpKQotCQl7Ci0JCQlDRlhfV2lkZVN0cmluZyBzd0pTID0gYWN0aW9uLkdldEphdmFTY3JpcHQoKTsKLQkJCWlmICghc3dKUy5Jc0VtcHR5KCkpCi0JCQl7Ci0JCQkJSUZYSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwRG9jdW1lbnQtPkdldEpzUnVudGltZSgpOwotCQkJCUFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKKyAgICAgICAgSUpTX0NvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0NvbnRleHQoKTsKKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NJbmZvOworICAgICAgICBGWF9CT09MIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KHN3SlMsICZjc0luZm8pOworICAgICAgICBpZiAoIWJSZXQpIHsKKyAgICAgICAgICAvLyBGSVhNRTogcmV0dXJuIGVycm9yLgorICAgICAgICB9CiAKLQkJCQlwUnVudGltZS0+U2V0UmVhZGVyRG9jdW1lbnQocERvY3VtZW50KTsKKyAgICAgICAgcFJ1bnRpbWUtPlJlbGVhc2VDb250ZXh0KHBDb250ZXh0KTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgRG9BY3Rpb25fTm9KcyhhY3Rpb24sIHBEb2N1bWVudCk7CisgIH0KIAotCQkJCUlGWEpTX0NvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0NvbnRleHQoKTsKLQkJCQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBhY3Rpb24uR2V0U3ViQWN0aW9uc0NvdW50KCk7IGkgPCBzejsgaSsrKSB7CisgICAgQ1BERl9BY3Rpb24gc3ViYWN0aW9uID0gYWN0aW9uLkdldFN1YkFjdGlvbihpKTsKKyAgICBpZiAoIUV4ZWN1dGVTY3JlZW5BY3Rpb24oc3ViYWN0aW9uLCB0eXBlLCBwRG9jdW1lbnQsIHBTY3JlZW4sIGxpc3QpKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLQkvLyAJCQlzd2l0Y2ggKHR5cGUpCi0JLy8gCQkJewotCS8vIAkJCWNhc2UgQ1BERl9BQWN0aW9uOjpDdXJzb3JFbnRlcjoKLQkvLyAJCQkJcENvbnRleHQtPk9uU2NyZWVuX01vdXNlRW50ZXIoSXNDVFJMcHJlc3NlZCgpLCBJc1NISUZUcHJlc3NlZCgpLCBwU2NyZWVuKTsKLQkvLyAJCQkJYnJlYWs7Ci0JLy8gCQkJY2FzZSBDUERGX0FBY3Rpb246OkN1cnNvckV4aXQ6Ci0JLy8gCQkJCXBDb250ZXh0LT5PblNjcmVlbl9Nb3VzZUV4aXQoSXNDVFJMcHJlc3NlZCgpLCBJc1NISUZUcHJlc3NlZCgpLCBwU2NyZWVuKTsKLQkvLyAJCQkJYnJlYWs7Ci0JLy8gCQkJY2FzZSBDUERGX0FBY3Rpb246OkJ1dHRvbkRvd246Ci0JLy8gCQkJCXBDb250ZXh0LT5PblNjcmVlbl9Nb3VzZURvd24oSXNDVFJMcHJlc3NlZCgpLCBJc1NISUZUcHJlc3NlZCgpLCBwU2NyZWVuKTsKLQkvLyAJCQkJYnJlYWs7Ci0JLy8gCQkJY2FzZSBDUERGX0FBY3Rpb246OkJ1dHRvblVwOgotCS8vIAkJCQlwQ29udGV4dC0+T25TY3JlZW5fTW91c2VVcChJc0NUUkxwcmVzc2VkKCksIElzU0hJRlRwcmVzc2VkKCksIHBTY3JlZW4pOwotCS8vIAkJCQlicmVhazsKLQkvLyAJCQljYXNlIENQREZfQUFjdGlvbjo6R2V0Rm9jdXM6Ci0JLy8gCQkJCXBDb250ZXh0LT5PblNjcmVlbl9Gb2N1cyhJc0NUUkxwcmVzc2VkKCksIElzU0hJRlRwcmVzc2VkKCksIHBTY3JlZW4pOwotCS8vIAkJCQlicmVhazsKLQkvLyAJCQljYXNlIENQREZfQUFjdGlvbjo6TG9zZUZvY3VzOgotCS8vIAkJCQlwQ29udGV4dC0+T25TY3JlZW5fQmx1cihJc0NUUkxwcmVzc2VkKCksIElzU0hJRlRwcmVzc2VkKCksIHBTY3JlZW4pOwotCS8vIAkJCQlicmVhazsKLQkvLyAJCQljYXNlIENQREZfQUFjdGlvbjo6UGFnZU9wZW46Ci0JLy8gCQkJCXBDb250ZXh0LT5PblNjcmVlbl9PcGVuKElzQ1RSTHByZXNzZWQoKSwgSXNTSElGVHByZXNzZWQoKSwgcFNjcmVlbik7Ci0JLy8gCQkJCWJyZWFrOwotCS8vIAkJCWNhc2UgQ1BERl9BQWN0aW9uOjpQYWdlQ2xvc2U6Ci0JLy8gCQkJCXBDb250ZXh0LT5PblNjcmVlbl9DbG9zZShJc0NUUkxwcmVzc2VkKCksIElzU0hJRlRwcmVzc2VkKCksIHBTY3JlZW4pOwotCS8vIAkJCQlicmVhazsKLQkvLyAJCQljYXNlIENQREZfQUFjdGlvbjo6UGFnZVZpc2libGU6Ci0JLy8gCQkJCXBDb250ZXh0LT5PblNjcmVlbl9JblZpZXcoSXNDVFJMcHJlc3NlZCgpLCBJc1NISUZUcHJlc3NlZCgpLCBwU2NyZWVuKTsKLQkvLyAJCQkJYnJlYWs7Ci0JLy8gCQkJY2FzZSBDUERGX0FBY3Rpb246OlBhZ2VJbnZpc2libGU6Ci0JLy8gCQkJCXBDb250ZXh0LT5PblNjcmVlbl9PdXRWaWV3KElzQ1RSTHByZXNzZWQoKSwgSXNTSElGVHByZXNzZWQoKSwgcFNjcmVlbik7Ci0JLy8gCQkJCWJyZWFrOwotCS8vIAkJCWRlZmF1bHQ6Ci0JLy8gCQkJCUFTU0VSVChGQUxTRSk7Ci0JLy8gCQkJCWJyZWFrOwotCS8vIAkJCX0KLQotCQkJCUNGWF9XaWRlU3RyaW5nIGNzSW5mbzsKLQkJCQlGWF9CT09MIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KHN3SlMsIGNzSW5mbyk7Ci0JCQkJaWYgKCFiUmV0KQotCQkJCXsKLQkJCQkJLy9DQkNMX0Zvcm1Ob3RpZnk6Ok1zZ0JveEpTRXJyb3IocFBhZ2VWaWV3LT5HZXRQYWdlVmlld1duZCgpLCBjc0luZm8pOwotCQkJCX0KLQotCQkJCXBSdW50aW1lLT5SZWxlYXNlQ29udGV4dChwQ29udGV4dCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJRG9BY3Rpb25fTm9KcyhhY3Rpb24sIHBEb2N1bWVudCk7Ci0JfQotCi0JZm9yIChGWF9JTlQzMiBpPTAsc3o9YWN0aW9uLkdldFN1YkFjdGlvbnNDb3VudCgpOyBpPHN6OyBpKyspCi0JewotCQlDUERGX0FjdGlvbiBzdWJhY3Rpb24gPSBhY3Rpb24uR2V0U3ViQWN0aW9uKGkpOwotCQlpZiAoIUV4ZWN1dGVTY3JlZW5BY3Rpb24oc3ViYWN0aW9uLCB0eXBlLCBwRG9jdW1lbnQsIHBTY3JlZW4sIGxpc3QpKSByZXR1cm4gRkFMU0U7Ci0JfQotCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MCUNQREZTREtfQWN0aW9uSGFuZGxlcjo6RXhlY3V0ZUJvb2tNYXJrKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKLQkJCQkJCQkJCQkgQ1BERl9Cb29rbWFyayogcEJvb2ttYXJrLCBDRlhfUHRyTGlzdCYgbGlzdCkKLXsKLQlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOworRlhfQk9PTCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkV4ZWN1dGVCb29rTWFyayhjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQm9va21hcmsqIHBCb29rbWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckxpc3QmIGxpc3QpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IGFjdGlvbi5HZXREaWN0KCk7CisgIGlmIChsaXN0LkZpbmQocERpY3QpKQorICAgIHJldHVybiBGQUxTRTsKIAotCUNQREZfRGljdGlvbmFyeSogcERpY3QgPSBhY3Rpb24uR2V0RGljdCgpOwotCWlmIChsaXN0LkZpbmQocERpY3QpKQotCQlyZXR1cm4gRkFMU0U7CisgIGxpc3QuQWRkVGFpbChwRGljdCk7CiAKLQlsaXN0LkFkZFRhaWwocERpY3QpOworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gcERvY3VtZW50LT5HZXRFbnYoKTsKKyAgQVNTRVJUKHBFbnYpOworICBpZiAoYWN0aW9uLkdldFR5cGUoKSA9PSBDUERGX0FjdGlvbjo6SmF2YVNjcmlwdCkgeworICAgIGlmIChwRW52LT5Jc0pTSW5pdGlhdGVkKCkpIHsKKyAgICAgIENGWF9XaWRlU3RyaW5nIHN3SlMgPSBhY3Rpb24uR2V0SmF2YVNjcmlwdCgpOworICAgICAgaWYgKCFzd0pTLklzRW1wdHkoKSkgeworICAgICAgICBJSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwRG9jdW1lbnQtPkdldEpzUnVudGltZSgpOworICAgICAgICBwUnVudGltZS0+U2V0UmVhZGVyRG9jdW1lbnQocERvY3VtZW50KTsKIAotCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBwRG9jdW1lbnQtPkdldEVudigpOwotCUFTU0VSVChwRW52KTsKLQlpZiAoYWN0aW9uLkdldFR5cGUoKSA9PSBDUERGX0FjdGlvbjo6SmF2YVNjcmlwdCkKLQl7Ci0JCWlmKHBFbnYtPklzSlNJbml0aWF0ZWQoKSkKLQkJewotCQkJQ0ZYX1dpZGVTdHJpbmcgc3dKUyA9IGFjdGlvbi5HZXRKYXZhU2NyaXB0KCk7Ci0JCQlpZiAoIXN3SlMuSXNFbXB0eSgpKQotCQkJewotCQkJCUlGWEpTX1J1bnRpbWUqIHBSdW50aW1lID0gcERvY3VtZW50LT5HZXRKc1J1bnRpbWUoKTsKLQkJCQlBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7CisgICAgICAgIElKU19Db250ZXh0KiBwQ29udGV4dCA9IHBSdW50aW1lLT5OZXdDb250ZXh0KCk7CisgICAgICAgIHBDb250ZXh0LT5PbkJvb2ttYXJrX01vdXNlVXAocEJvb2ttYXJrKTsKIAotCQkJCXBSdW50aW1lLT5TZXRSZWFkZXJEb2N1bWVudChwRG9jdW1lbnQpOworICAgICAgICBDRlhfV2lkZVN0cmluZyBjc0luZm87CisgICAgICAgIEZYX0JPT0wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoc3dKUywgJmNzSW5mbyk7CisgICAgICAgIGlmICghYlJldCkgeworICAgICAgICAgIC8vIEZJWE1FOiByZXR1cm4gZXJyb3IuCisgICAgICAgIH0KIAotCQkJCUlGWEpTX0NvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0NvbnRleHQoKTsKLQkJCQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CisgICAgICAgIHBSdW50aW1lLT5SZWxlYXNlQ29udGV4dChwQ29udGV4dCk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIERvQWN0aW9uX05vSnMoYWN0aW9uLCBwRG9jdW1lbnQpOworICB9CiAKLQkJCQlwQ29udGV4dC0+T25Cb29rbWFya19Nb3VzZVVwKHBCb29rbWFyayk7CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBhY3Rpb24uR2V0U3ViQWN0aW9uc0NvdW50KCk7IGkgPCBzejsgaSsrKSB7CisgICAgQ1BERl9BY3Rpb24gc3ViYWN0aW9uID0gYWN0aW9uLkdldFN1YkFjdGlvbihpKTsKKyAgICBpZiAoIUV4ZWN1dGVCb29rTWFyayhzdWJhY3Rpb24sIHBEb2N1bWVudCwgcEJvb2ttYXJrLCBsaXN0KSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQogCi0JCQkJQ0ZYX1dpZGVTdHJpbmcgY3NJbmZvOwotCQkJCUZYX0JPT0wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoc3dKUywgY3NJbmZvKTsKLQkJCQlpZiAoIWJSZXQpCi0JCQkJewotCQkJCQkvL0NCQ0xfRm9ybU5vdGlmeTo6TXNnQm94SlNFcnJvcihwUGFnZVZpZXctPkdldFBhZ2VWaWV3V25kKCksIGNzSW5mbyk7Ci0JCQkJfQotCi0JCQkJcFJ1bnRpbWUtPlJlbGVhc2VDb250ZXh0KHBDb250ZXh0KTsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JewotCQlEb0FjdGlvbl9Ob0pzKGFjdGlvbiwgcERvY3VtZW50KTsKLQl9Ci0KLQlmb3IgKEZYX0lOVDMyIGk9MCxzej1hY3Rpb24uR2V0U3ViQWN0aW9uc0NvdW50KCk7IGk8c3o7IGkrKykKLQl7Ci0JCUNQREZfQWN0aW9uIHN1YmFjdGlvbiA9IGFjdGlvbi5HZXRTdWJBY3Rpb24oaSk7Ci0JCWlmICghRXhlY3V0ZUJvb2tNYXJrKHN1YmFjdGlvbiwgcERvY3VtZW50LCBwQm9va21hcmssIGxpc3QpKSByZXR1cm4gRkFMU0U7Ci0JfQotCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi12b2lkIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fTm9Kcyhjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci0JQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKK3ZvaWQgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9Ob0pzKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsKKyAgQVNTRVJUKHBEb2N1bWVudCk7CiAKLQlzd2l0Y2ggKGFjdGlvbi5HZXRUeXBlKCkpCi0JewotCWNhc2UgQ1BERl9BY3Rpb246OkdvVG86Ci0JCURvQWN0aW9uX0dvVG8ocERvY3VtZW50LCBhY3Rpb24pOwotCQlicmVhazsKLQljYXNlIENQREZfQWN0aW9uOjpHb1RvUjoKLQkJRG9BY3Rpb25fR29Ub1IocERvY3VtZW50LCBhY3Rpb24pOwotCQlicmVhazsKLQljYXNlIENQREZfQWN0aW9uOjpHb1RvRToKLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FjdGlvbjo6TGF1bmNoOgotCQlEb0FjdGlvbl9MYXVuY2gocERvY3VtZW50LCBhY3Rpb24pOwotCQlicmVhazsKLQljYXNlIENQREZfQWN0aW9uOjpUaHJlYWQ6Ci0JCWJyZWFrOwotCWNhc2UgQ1BERl9BY3Rpb246OlVSSToKLQkJRG9BY3Rpb25fVVJJKHBEb2N1bWVudCwgYWN0aW9uKTsKLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FjdGlvbjo6U291bmQ6Ci0JCWlmIChtX3BNZWRpYUFjdGlvbkhhbmRsZXIpCi0JCXsKLQkJCW1fcE1lZGlhQWN0aW9uSGFuZGxlci0+RG9BY3Rpb25fU291bmQoYWN0aW9uLCBwRG9jdW1lbnQpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQ1BERl9BY3Rpb246Ok1vdmllOgotCQlpZiAobV9wTWVkaWFBY3Rpb25IYW5kbGVyKQotCQl7Ci0JCQltX3BNZWRpYUFjdGlvbkhhbmRsZXItPkRvQWN0aW9uX01vdmllKGFjdGlvbiwgcERvY3VtZW50KTsKLQkJfQotCQlicmVhazsKLQljYXNlIENQREZfQWN0aW9uOjpIaWRlOgotCQlpZiAobV9wRm9ybUFjdGlvbkhhbmRsZXIpCi0JCXsKLQkJCW1fcEZvcm1BY3Rpb25IYW5kbGVyLT5Eb0FjdGlvbl9IaWRlKGFjdGlvbiwgcERvY3VtZW50KTsKLQkJfQotCQlicmVhazsKLQljYXNlIENQREZfQWN0aW9uOjpOYW1lZDoKLQkJRG9BY3Rpb25fTmFtZWQocERvY3VtZW50LCBhY3Rpb24pOwotCQlicmVhazsKLQljYXNlIENQREZfQWN0aW9uOjpTdWJtaXRGb3JtOgotCQlpZiAobV9wRm9ybUFjdGlvbkhhbmRsZXIpCi0JCXsKLQkJCW1fcEZvcm1BY3Rpb25IYW5kbGVyLT5Eb0FjdGlvbl9TdWJtaXRGb3JtKGFjdGlvbiwgcERvY3VtZW50KTsKLQkJfQotCQlicmVhazsKLQljYXNlIENQREZfQWN0aW9uOjpSZXNldEZvcm06Ci0JCWlmIChtX3BGb3JtQWN0aW9uSGFuZGxlcikKLQkJewotCQkJbV9wRm9ybUFjdGlvbkhhbmRsZXItPkRvQWN0aW9uX1Jlc2V0Rm9ybShhY3Rpb24sIHBEb2N1bWVudCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FjdGlvbjo6SW1wb3J0RGF0YToKLQkJaWYgKG1fcEZvcm1BY3Rpb25IYW5kbGVyKQotCQl7Ci0JCQltX3BGb3JtQWN0aW9uSGFuZGxlci0+RG9BY3Rpb25fSW1wb3J0RGF0YShhY3Rpb24sIHBEb2N1bWVudCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FjdGlvbjo6SmF2YVNjcmlwdDoKLQkJQVNTRVJUKEZBTFNFKTsKLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FjdGlvbjo6U2V0T0NHU3RhdGU6Ci0JCURvQWN0aW9uX1NldE9DR1N0YXRlKHBEb2N1bWVudCwgIGFjdGlvbik7Ci0JCWJyZWFrOwotCWNhc2UgQ1BERl9BY3Rpb246OlJlbmRpdGlvbjoKLQkJaWYgKG1fcE1lZGlhQWN0aW9uSGFuZGxlcikKLQkJewotCQkJbV9wTWVkaWFBY3Rpb25IYW5kbGVyLT5Eb0FjdGlvbl9SZW5kaXRpb24oYWN0aW9uLCBwRG9jdW1lbnQpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQ1BERl9BY3Rpb246OlRyYW5zOgotCQlicmVhazsKLQljYXNlIENQREZfQWN0aW9uOjpHb1RvM0RWaWV3OgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9CisgIHN3aXRjaCAoYWN0aW9uLkdldFR5cGUoKSkgeworICAgIGNhc2UgQ1BERl9BY3Rpb246OkdvVG86CisgICAgICBEb0FjdGlvbl9Hb1RvKHBEb2N1bWVudCwgYWN0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BY3Rpb246OkdvVG9SOgorICAgICAgRG9BY3Rpb25fR29Ub1IocERvY3VtZW50LCBhY3Rpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FjdGlvbjo6R29Ub0U6CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQWN0aW9uOjpMYXVuY2g6CisgICAgICBEb0FjdGlvbl9MYXVuY2gocERvY3VtZW50LCBhY3Rpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FjdGlvbjo6VGhyZWFkOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FjdGlvbjo6VVJJOgorICAgICAgRG9BY3Rpb25fVVJJKHBEb2N1bWVudCwgYWN0aW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BY3Rpb246OlNvdW5kOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FjdGlvbjo6TW92aWU6CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQWN0aW9uOjpIaWRlOgorICAgICAgaWYgKG1fcEZvcm1BY3Rpb25IYW5kbGVyKSB7CisgICAgICAgIG1fcEZvcm1BY3Rpb25IYW5kbGVyLT5Eb0FjdGlvbl9IaWRlKGFjdGlvbiwgcERvY3VtZW50KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BY3Rpb246Ok5hbWVkOgorICAgICAgRG9BY3Rpb25fTmFtZWQocERvY3VtZW50LCBhY3Rpb24pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FjdGlvbjo6U3VibWl0Rm9ybToKKyAgICAgIGlmIChtX3BGb3JtQWN0aW9uSGFuZGxlcikgeworICAgICAgICBtX3BGb3JtQWN0aW9uSGFuZGxlci0+RG9BY3Rpb25fU3VibWl0Rm9ybShhY3Rpb24sIHBEb2N1bWVudCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQWN0aW9uOjpSZXNldEZvcm06CisgICAgICBpZiAobV9wRm9ybUFjdGlvbkhhbmRsZXIpIHsKKyAgICAgICAgbV9wRm9ybUFjdGlvbkhhbmRsZXItPkRvQWN0aW9uX1Jlc2V0Rm9ybShhY3Rpb24sIHBEb2N1bWVudCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQWN0aW9uOjpJbXBvcnREYXRhOgorICAgICAgaWYgKG1fcEZvcm1BY3Rpb25IYW5kbGVyKSB7CisgICAgICAgIG1fcEZvcm1BY3Rpb25IYW5kbGVyLT5Eb0FjdGlvbl9JbXBvcnREYXRhKGFjdGlvbiwgcERvY3VtZW50KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BY3Rpb246OkphdmFTY3JpcHQ6CisgICAgICBBU1NFUlQoRkFMU0UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FjdGlvbjo6U2V0T0NHU3RhdGU6CisgICAgICBEb0FjdGlvbl9TZXRPQ0dTdGF0ZShwRG9jdW1lbnQsIGFjdGlvbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQWN0aW9uOjpSZW5kaXRpb246CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQWN0aW9uOjpUcmFuczoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BY3Rpb246OkdvVG8zRFZpZXc6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KIH0KIAotRlhfQk9PTAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OklzVmFsaWREb2NWaWV3KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLQlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwotCXJldHVybiBUUlVFOworRlhfQk9PTCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OklzVmFsaWREb2NWaWV3KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkgeworICBBU1NFUlQocERvY3VtZW50KTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKIHZvaWQgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9Hb1RvKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKLQkJCQkJCQkJICBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKQotewotCUFTU0VSVChhY3Rpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikgeworICBBU1NFUlQoYWN0aW9uKTsKIAotCUNQREZfRG9jdW1lbnQqIHBQREZEb2N1bWVudCA9IHBEb2N1bWVudC0+R2V0RG9jdW1lbnQoKTsKLQlBU1NFUlQocFBERkRvY3VtZW50ICE9IE5VTEwpOwotCUNQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAgPSBwRG9jdW1lbnQtPkdldEVudigpOwotCUFTU0VSVChwQXBwICE9IE5VTEwpOworICBDUERGX0RvY3VtZW50KiBwUERGRG9jdW1lbnQgPSBwRG9jdW1lbnQtPkdldFBERkRvY3VtZW50KCk7CisgIEFTU0VSVChwUERGRG9jdW1lbnQpOwogCi0JQ1BERl9EZXN0IE15RGVzdCA9IGFjdGlvbi5HZXREZXN0KHBQREZEb2N1bWVudCk7Ci0JaW50IG5QYWdlSW5kZXggPSBNeURlc3QuR2V0UGFnZUluZGV4KHBQREZEb2N1bWVudCk7Ci0JaW50IG5GaXRUeXBlID0gTXlEZXN0LkdldFpvb21Nb2RlKCk7Ci0JY29uc3QgQ1BERl9BcnJheSAqIHBNeUFycmF5ID0gKENQREZfQXJyYXkqKU15RGVzdC5HZXRPYmplY3QoKTsKLQlmbG9hdCogcFBvc0FyeSA9IE5VTEw7Ci0JaW50IHNpemVPZkFyeSA9IDA7Ci0JaWYgKHBNeUFycmF5ICE9IE5VTEwpCi0JewotCQlwUG9zQXJ5ID0gbmV3IGZsb2F0W3BNeUFycmF5LT5HZXRDb3VudCgpXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMjsgaSA8IChpbnQpcE15QXJyYXktPkdldENvdW50KCk7IGkrKykKLQkJewotCQkJcFBvc0FyeVtqKytdID0gcE15QXJyYXktPkdldEZsb2F0KGkpOwotCQl9Ci0JCXNpemVPZkFyeSA9IGo7Ci0JfQotCXBBcHAtPkZGSV9Eb0dvVG9BY3Rpb24oblBhZ2VJbmRleCwgbkZpdFR5cGUsIHBQb3NBcnksIHNpemVPZkFyeSk7Ci0JaWYocFBvc0FyeSkKLQkJZGVsZXRlW10gcFBvc0FyeTsKKyAgQ1BERl9EZXN0IE15RGVzdCA9IGFjdGlvbi5HZXREZXN0KHBQREZEb2N1bWVudCk7CisgIGludCBuUGFnZUluZGV4ID0gTXlEZXN0LkdldFBhZ2VJbmRleChwUERGRG9jdW1lbnQpOworICBpbnQgbkZpdFR5cGUgPSBNeURlc3QuR2V0Wm9vbU1vZGUoKTsKKyAgY29uc3QgQ1BERl9BcnJheSogcE15QXJyYXkgPSBUb0FycmF5KE15RGVzdC5HZXRPYmplY3QoKSk7CisgIGZsb2F0KiBwUG9zQXJ5ID0gbnVsbHB0cjsKKyAgaW50IHNpemVPZkFyeSA9IDA7CisgIGlmIChwTXlBcnJheSkgeworICAgIHBQb3NBcnkgPSBuZXcgZmxvYXRbcE15QXJyYXktPkdldENvdW50KCldOworICAgIGludCBqID0gMDsKKyAgICBmb3IgKGludCBpID0gMjsgaSA8IChpbnQpcE15QXJyYXktPkdldENvdW50KCk7IGkrKykgeworICAgICAgcFBvc0FyeVtqKytdID0gcE15QXJyYXktPkdldEZsb2F0KGkpOworICAgIH0KKyAgICBzaXplT2ZBcnkgPSBqOworICB9CisKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCA9IHBEb2N1bWVudC0+R2V0RW52KCk7CisgIHBBcHAtPkZGSV9Eb0dvVG9BY3Rpb24oblBhZ2VJbmRleCwgbkZpdFR5cGUsIHBQb3NBcnksIHNpemVPZkFyeSk7CisgIGRlbGV0ZVtdIHBQb3NBcnk7CiB9CiAKLXZvaWQgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9Hb1RvUihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pCi17Cit2b2lkIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fR29Ub1IoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pIHt9CiAKK3ZvaWQgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9MYXVuY2goQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKSB7fQorCit2b2lkIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fVVJJKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikgeworICBBU1NFUlQoYWN0aW9uKTsKKworICBDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwID0gcERvY3VtZW50LT5HZXRFbnYoKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgc1VSSSA9IGFjdGlvbi5HZXRVUkkocERvY3VtZW50LT5HZXRQREZEb2N1bWVudCgpKTsKKyAgcEFwcC0+RkZJX0RvVVJJQWN0aW9uKHNVUkkuY19zdHIoKSk7CiB9CiAKLXZvaWQgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9MYXVuY2goQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKQotewordm9pZCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX05hbWVkKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKSB7CisgIEFTU0VSVChhY3Rpb24pOwogCisgIENGWF9CeXRlU3RyaW5nIGNzTmFtZSA9IGFjdGlvbi5HZXROYW1lZEFjdGlvbigpOworICBwRG9jdW1lbnQtPkdldEVudigpLT5GRklfRXhlY3V0ZU5hbWVkQWN0aW9uKGNzTmFtZSk7CiB9CiAKLXZvaWQgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9VUkkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKQotewotIAlBU1NFUlQoYWN0aW9uKTsKK3ZvaWQgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9TZXRPQ0dTdGF0ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikge30KIAotIAlDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwID0gcERvY3VtZW50LT5HZXRFbnYoKTsKLSAJQVNTRVJUKHBBcHAgIT0gTlVMTCk7Cit2b2lkIENQREZTREtfQWN0aW9uSGFuZGxlcjo6UnVuRmllbGRKYXZhU2NyaXB0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0KSB7CisgIEFTU0VSVCh0eXBlICE9IENQREZfQUFjdGlvbjo6Q2FsY3VsYXRlKTsKKyAgQVNTRVJUKHR5cGUgIT0gQ1BERl9BQWN0aW9uOjpGb3JtYXQpOwogCi0gCUNGWF9CeXRlU3RyaW5nIHNVUkkgPSBhY3Rpb24uR2V0VVJJKHBEb2N1bWVudC0+R2V0RG9jdW1lbnQoKSk7Ci0gCXBBcHAtPkZGSV9Eb1VSSUFjdGlvbihGWF9MUENTVFIoc1VSSSkpOworICBJSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwRG9jdW1lbnQtPkdldEpzUnVudGltZSgpOworICBwUnVudGltZS0+U2V0UmVhZGVyRG9jdW1lbnQocERvY3VtZW50KTsKKworICBJSlNfQ29udGV4dCogcENvbnRleHQgPSBwUnVudGltZS0+TmV3Q29udGV4dCgpOworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6Q3Vyc29yRW50ZXI6CisgICAgICBwQ29udGV4dC0+T25GaWVsZF9Nb3VzZUVudGVyKGRhdGEuYk1vZGlmaWVyLCBkYXRhLmJTaGlmdCwgcEZvcm1GaWVsZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6Q3Vyc29yRXhpdDoKKyAgICAgIHBDb250ZXh0LT5PbkZpZWxkX01vdXNlRXhpdChkYXRhLmJNb2RpZmllciwgZGF0YS5iU2hpZnQsIHBGb3JtRmllbGQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FBY3Rpb246OkJ1dHRvbkRvd246CisgICAgICBwQ29udGV4dC0+T25GaWVsZF9Nb3VzZURvd24oZGF0YS5iTW9kaWZpZXIsIGRhdGEuYlNoaWZ0LCBwRm9ybUZpZWxkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpCdXR0b25VcDoKKyAgICAgIHBDb250ZXh0LT5PbkZpZWxkX01vdXNlVXAoZGF0YS5iTW9kaWZpZXIsIGRhdGEuYlNoaWZ0LCBwRm9ybUZpZWxkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpHZXRGb2N1czoKKyAgICAgIHBDb250ZXh0LT5PbkZpZWxkX0ZvY3VzKGRhdGEuYk1vZGlmaWVyLCBkYXRhLmJTaGlmdCwgcEZvcm1GaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuc1ZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpMb3NlRm9jdXM6CisgICAgICBwQ29udGV4dC0+T25GaWVsZF9CbHVyKGRhdGEuYk1vZGlmaWVyLCBkYXRhLmJTaGlmdCwgcEZvcm1GaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zVmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FBY3Rpb246OktleVN0cm9rZToKKyAgICAgIHBDb250ZXh0LT5PbkZpZWxkX0tleXN0cm9rZShkYXRhLnNDaGFuZ2UsIGRhdGEuc0NoYW5nZUV4LCBkYXRhLmJLZXlEb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuYk1vZGlmaWVyLCBkYXRhLm5TZWxFbmQsIGRhdGEublNlbFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuYlNoaWZ0LCBwRm9ybUZpZWxkLCBkYXRhLnNWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmJXaWxsQ29tbWl0LCBkYXRhLmJGaWVsZEZ1bGwsIGRhdGEuYlJDKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZToKKyAgICAgIHBDb250ZXh0LT5PbkZpZWxkX1ZhbGlkYXRlKGRhdGEuc0NoYW5nZSwgZGF0YS5zQ2hhbmdlRXgsIGRhdGEuYktleURvd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmJNb2RpZmllciwgZGF0YS5iU2hpZnQsIHBGb3JtRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnNWYWx1ZSwgZGF0YS5iUkMpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEFTU0VSVChGQUxTRSk7CisgICAgICBicmVhazsKKyAgfQorCisgIENGWF9XaWRlU3RyaW5nIGNzSW5mbzsKKyAgRlhfQk9PTCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzY3JpcHQsICZjc0luZm8pOworICBpZiAoIWJSZXQpIHsKKyAgICAvLyBGSVhNRTogcmV0dXJuIGVycm9yLgorICB9CisKKyAgcFJ1bnRpbWUtPlJlbGVhc2VDb250ZXh0KHBDb250ZXh0KTsKIH0KIAotdm9pZCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX05hbWVkKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikKLXsKLSAJQVNTRVJUKGFjdGlvbik7Cit2b2lkIENQREZTREtfQWN0aW9uSGFuZGxlcjo6UnVuRG9jdW1lbnRPcGVuSmF2YVNjcmlwdCgKKyAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNTY3JpcHROYW1lLAorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQpIHsKKyAgSUpTX1J1bnRpbWUqIHBSdW50aW1lID0gcERvY3VtZW50LT5HZXRKc1J1bnRpbWUoKTsKKyAgcFJ1bnRpbWUtPlNldFJlYWRlckRvY3VtZW50KHBEb2N1bWVudCk7CisgIElKU19Db250ZXh0KiBwQ29udGV4dCA9IHBSdW50aW1lLT5OZXdDb250ZXh0KCk7CisgIHBDb250ZXh0LT5PbkRvY19PcGVuKHBEb2N1bWVudCwgc1NjcmlwdE5hbWUpOwogCi0gCUNGWF9CeXRlU3RyaW5nIGNzTmFtZSA9IGFjdGlvbi5HZXROYW1lZEFjdGlvbigpOwotIAlwRG9jdW1lbnQtPkdldEVudigpLT5GRklfRXhlY3V0ZU5hbWVkQWN0aW9uKGNzTmFtZSk7CisgIENGWF9XaWRlU3RyaW5nIGNzSW5mbzsKKyAgRlhfQk9PTCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzY3JpcHQsICZjc0luZm8pOworICBpZiAoIWJSZXQpIHsKKyAgICAvLyBGSVhNRTogcmV0dXJuIGVycm9yLgorICB9CisKKyAgcFJ1bnRpbWUtPlJlbGVhc2VDb250ZXh0KHBDb250ZXh0KTsKIH0KIAordm9pZCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OlJ1bkRvY3VtZW50UGFnZUphdmFTY3JpcHQoCisgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0KSB7CisgIElKU19SdW50aW1lKiBwUnVudGltZSA9IHBEb2N1bWVudC0+R2V0SnNSdW50aW1lKCk7CisgIHBSdW50aW1lLT5TZXRSZWFkZXJEb2N1bWVudChwRG9jdW1lbnQpOwogCi12b2lkIENQREZTREtfQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fU2V0T0NHU3RhdGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKQoteworICBJSlNfQ29udGV4dCogcENvbnRleHQgPSBwUnVudGltZS0+TmV3Q29udGV4dCgpOworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6T3BlblBhZ2U6CisgICAgICBwQ29udGV4dC0+T25QYWdlX09wZW4ocERvY3VtZW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpDbG9zZVBhZ2U6CisgICAgICBwQ29udGV4dC0+T25QYWdlX0Nsb3NlKHBEb2N1bWVudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6Q2xvc2VEb2N1bWVudDoKKyAgICAgIHBDb250ZXh0LT5PbkRvY19XaWxsQ2xvc2UocERvY3VtZW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpTYXZlRG9jdW1lbnQ6CisgICAgICBwQ29udGV4dC0+T25Eb2NfV2lsbFNhdmUocERvY3VtZW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpEb2N1bWVudFNhdmVkOgorICAgICAgcENvbnRleHQtPk9uRG9jX0RpZFNhdmUocERvY3VtZW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpQcmludERvY3VtZW50OgorICAgICAgcENvbnRleHQtPk9uRG9jX1dpbGxQcmludChwRG9jdW1lbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FBY3Rpb246OkRvY3VtZW50UHJpbnRlZDoKKyAgICAgIHBDb250ZXh0LT5PbkRvY19EaWRQcmludChwRG9jdW1lbnQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FBY3Rpb246OlBhZ2VWaXNpYmxlOgorICAgICAgcENvbnRleHQtPk9uUGFnZV9JblZpZXcocERvY3VtZW50KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpQYWdlSW52aXNpYmxlOgorICAgICAgcENvbnRleHQtPk9uUGFnZV9PdXRWaWV3KHBEb2N1bWVudCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgQVNTRVJUKEZBTFNFKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgQ0ZYX1dpZGVTdHJpbmcgY3NJbmZvOworICBGWF9CT09MIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KHNjcmlwdCwgJmNzSW5mbyk7CisgIGlmICghYlJldCkgeworICAgIC8vIEZJWE1FOiByZXR1cm4gZXJyb3IuCisgIH0KKworICBwUnVudGltZS0+UmVsZWFzZUNvbnRleHQocENvbnRleHQpOwogfQogCi12b2lkIENQREZTREtfQWN0aW9uSGFuZGxlcjo6UnVuRmllbGRKYXZhU2NyaXB0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKLQkJCQkJCQkJCQlQREZTREtfRmllbGRBY3Rpb24mIGRhdGEsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQpCi17Ci0JQVNTRVJUKHR5cGUgIT0gQ1BERl9BQWN0aW9uOjpDYWxjdWxhdGUpOwotCUFTU0VSVCh0eXBlICE9IENQREZfQUFjdGlvbjo6Rm9ybWF0KTsKK0ZYX0JPT0wgQ1BERlNES19Gb3JtQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fSGlkZShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkgeworICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKKyAgaWYgKHBJbnRlckZvcm0tPkRvQWN0aW9uX0hpZGUoYWN0aW9uKSkgeworICAgIHBEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOworICAgIHJldHVybiBUUlVFOworICB9CiAKLQlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwotCi0JSUZYSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwRG9jdW1lbnQtPkdldEpzUnVudGltZSgpOwotCUFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKLQotCXBSdW50aW1lLT5TZXRSZWFkZXJEb2N1bWVudChwRG9jdW1lbnQpOwotCi0JSUZYSlNfQ29udGV4dCogcENvbnRleHQgPSBwUnVudGltZS0+TmV3Q29udGV4dCgpOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQotCXN3aXRjaCAodHlwZSkKLQl7Ci0JY2FzZSBDUERGX0FBY3Rpb246OkN1cnNvckVudGVyOgotCQlwQ29udGV4dC0+T25GaWVsZF9Nb3VzZUVudGVyKGRhdGEuYk1vZGlmaWVyLCBkYXRhLmJTaGlmdCwgcEZvcm1GaWVsZCk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BERl9BQWN0aW9uOjpDdXJzb3JFeGl0OgotCQlwQ29udGV4dC0+T25GaWVsZF9Nb3VzZUV4aXQoZGF0YS5iTW9kaWZpZXIsIGRhdGEuYlNoaWZ0LCBwRm9ybUZpZWxkKTsKLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FBY3Rpb246OkJ1dHRvbkRvd246Ci0JCXBDb250ZXh0LT5PbkZpZWxkX01vdXNlRG93bihkYXRhLmJNb2RpZmllciwgZGF0YS5iU2hpZnQsIHBGb3JtRmllbGQpOwotCQlicmVhazsKLQljYXNlIENQREZfQUFjdGlvbjo6QnV0dG9uVXA6Ci0JCXBDb250ZXh0LT5PbkZpZWxkX01vdXNlVXAoZGF0YS5iTW9kaWZpZXIsIGRhdGEuYlNoaWZ0LCBwRm9ybUZpZWxkKTsKLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FBY3Rpb246OkdldEZvY3VzOgotCQlwQ29udGV4dC0+T25GaWVsZF9Gb2N1cyhkYXRhLmJNb2RpZmllciwgZGF0YS5iU2hpZnQsIHBGb3JtRmllbGQsIGRhdGEuc1ZhbHVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FBY3Rpb246Okxvc2VGb2N1czoKLQkJcENvbnRleHQtPk9uRmllbGRfQmx1cihkYXRhLmJNb2RpZmllciwgZGF0YS5iU2hpZnQsIHBGb3JtRmllbGQsIGRhdGEuc1ZhbHVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FBY3Rpb246OktleVN0cm9rZToKLQkJcENvbnRleHQtPk9uRmllbGRfS2V5c3Ryb2tlKGRhdGEubkNvbW1pdEtleSwgZGF0YS5zQ2hhbmdlLCBkYXRhLnNDaGFuZ2VFeCwgZGF0YS5iS2V5RG93biwKLQkJCWRhdGEuYk1vZGlmaWVyLCBkYXRhLm5TZWxFbmQsIGRhdGEublNlbFN0YXJ0LCBkYXRhLmJTaGlmdCwgcEZvcm1GaWVsZCwgZGF0YS5zVmFsdWUsCi0JCQlkYXRhLmJXaWxsQ29tbWl0LCBkYXRhLmJGaWVsZEZ1bGwsIGRhdGEuYlJDKTsKLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FBY3Rpb246OlZhbGlkYXRlOgotCQlwQ29udGV4dC0+T25GaWVsZF9WYWxpZGF0ZShkYXRhLnNDaGFuZ2UsIGRhdGEuc0NoYW5nZUV4LCBkYXRhLmJLZXlEb3duLCBkYXRhLmJNb2RpZmllciwKLQkJCWRhdGEuYlNoaWZ0LCBwRm9ybUZpZWxkLCBkYXRhLnNWYWx1ZSwgZGF0YS5iUkMpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlBU1NFUlQoRkFMU0UpOwotCQlicmVhazsKLQl9Ci0KLQlDRlhfV2lkZVN0cmluZyBjc0luZm87Ci0JRlhfQk9PTCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzY3JpcHQsIGNzSW5mbyk7Ci0JaWYgKCFiUmV0KQotCXsKLQkJLy9DQkNMX0Zvcm1Ob3RpZnk6Ok1zZ0JveEpTRXJyb3IocFBhZ2VWaWV3LT5HZXRQYWdlVmlld1duZCgpLCBjc0luZm8pOwotCX0KLQotCXBSdW50aW1lLT5SZWxlYXNlQ29udGV4dChwQ29udGV4dCk7CisgIHJldHVybiBGQUxTRTsKIH0KIAotdm9pZCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OlJ1bkRvY3VtZW50T3BlbkphdmFTY3JpcHQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc1NjcmlwdE5hbWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQpCi17Ci0JQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKLQotCUlGWEpTX1J1bnRpbWUqIHBSdW50aW1lID0gcERvY3VtZW50LT5HZXRKc1J1bnRpbWUoKTsKLQlBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7Ci0KLQlwUnVudGltZS0+U2V0UmVhZGVyRG9jdW1lbnQocERvY3VtZW50KTsKLQotCUlGWEpTX0NvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0NvbnRleHQoKTsKLQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0KLQlwQ29udGV4dC0+T25Eb2NfT3BlbihwRG9jdW1lbnQsIHNTY3JpcHROYW1lKTsKLQotCUNGWF9XaWRlU3RyaW5nIGNzSW5mbzsKLQlGWF9CT09MIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KHNjcmlwdCwgY3NJbmZvKTsKLQlpZiAoIWJSZXQpCi0JewotCQkvL0NCQ0xfRm9ybU5vdGlmeTo6TXNnQm94SlNFcnJvcihwUGFnZVZpZXctPkdldFBhZ2VWaWV3V25kKCksIGNzSW5mbyk7Ci0JfQotCi0JcFJ1bnRpbWUtPlJlbGVhc2VDb250ZXh0KHBDb250ZXh0KTsKK0ZYX0JPT0wgQ1BERlNES19Gb3JtQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fU3VibWl0Rm9ybSgKKyAgICBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkgeworICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKKyAgcmV0dXJuIHBJbnRlckZvcm0tPkRvQWN0aW9uX1N1Ym1pdEZvcm0oYWN0aW9uKTsKIH0KIAotdm9pZCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OlJ1bkRvY3VtZW50UGFnZUphdmFTY3JpcHQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQpCi17Ci0JQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKLQotCUlGWEpTX1J1bnRpbWUqIHBSdW50aW1lID0gcERvY3VtZW50LT5HZXRKc1J1bnRpbWUoKTsKLQlBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7Ci0KLQlwUnVudGltZS0+U2V0UmVhZGVyRG9jdW1lbnQocERvY3VtZW50KTsKLQotCUlGWEpTX0NvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0NvbnRleHQoKTsKLQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0KLQlzd2l0Y2ggKHR5cGUpCi0JewotCWNhc2UgQ1BERl9BQWN0aW9uOjpPcGVuUGFnZToKLQkJcENvbnRleHQtPk9uUGFnZV9PcGVuKHBEb2N1bWVudCk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BERl9BQWN0aW9uOjpDbG9zZVBhZ2U6Ci0JCXBDb250ZXh0LT5PblBhZ2VfQ2xvc2UocERvY3VtZW50KTsKLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FBY3Rpb246OkNsb3NlRG9jdW1lbnQ6Ci0JCXBDb250ZXh0LT5PbkRvY19XaWxsQ2xvc2UocERvY3VtZW50KTsKLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FBY3Rpb246OlNhdmVEb2N1bWVudDoKLQkJcENvbnRleHQtPk9uRG9jX1dpbGxTYXZlKHBEb2N1bWVudCk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BERl9BQWN0aW9uOjpEb2N1bWVudFNhdmVkOgotCQlwQ29udGV4dC0+T25Eb2NfRGlkU2F2ZShwRG9jdW1lbnQpOwotCQlicmVhazsKLQljYXNlIENQREZfQUFjdGlvbjo6UHJpbnREb2N1bWVudDoKLQkJcENvbnRleHQtPk9uRG9jX1dpbGxQcmludChwRG9jdW1lbnQpOwotCQlicmVhazsKLQljYXNlIENQREZfQUFjdGlvbjo6RG9jdW1lbnRQcmludGVkOgotCQlwQ29udGV4dC0+T25Eb2NfRGlkUHJpbnQocERvY3VtZW50KTsKLQkJYnJlYWs7Ci0JY2FzZSBDUERGX0FBY3Rpb246OlBhZ2VWaXNpYmxlOgotCQlwQ29udGV4dC0+T25QYWdlX0luVmlldyhwRG9jdW1lbnQpOwotCQlicmVhazsKLQljYXNlIENQREZfQUFjdGlvbjo6UGFnZUludmlzaWJsZToKLQkJcENvbnRleHQtPk9uUGFnZV9PdXRWaWV3KHBEb2N1bWVudCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUFTU0VSVChGQUxTRSk7Ci0JCWJyZWFrOwotCX0KLQotCUNGWF9XaWRlU3RyaW5nIGNzSW5mbzsKLQlGWF9CT09MIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KHNjcmlwdCwgY3NJbmZvKTsKLQlpZiAoIWJSZXQpCi0JewotCQkvL0NCQ0xfRm9ybU5vdGlmeTo6TXNnQm94SlNFcnJvcihwUGFnZVZpZXctPkdldFBhZ2VWaWV3V25kKCksIGNzSW5mbyk7Ci0JfQotCi0JcFJ1bnRpbWUtPlJlbGVhc2VDb250ZXh0KHBDb250ZXh0KTsKK0ZYX0JPT0wgQ1BERlNES19Gb3JtQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fUmVzZXRGb3JtKAorICAgIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCisgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KSB7CisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKilwRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOworICByZXR1cm4gcEludGVyRm9ybS0+RG9BY3Rpb25fUmVzZXRGb3JtKGFjdGlvbik7CiB9CiAKK0ZYX0JPT0wgQ1BERlNES19Gb3JtQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fSW1wb3J0RGF0YSgKKyAgICBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAorICAgIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkgeworICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKKyAgaWYgKHBJbnRlckZvcm0tPkRvQWN0aW9uX0ltcG9ydERhdGEoYWN0aW9uKSkgeworICAgIHBEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOworICAgIHJldHVybiBUUlVFOworICB9CiAKLUZYX0JPT0wJQ1BERlNES19Gb3JtQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fSGlkZShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci0JQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKLQotCUNQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKilwRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwotCUFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwotCi0JaWYgKHBJbnRlckZvcm0tPkRvQWN0aW9uX0hpZGUoYWN0aW9uKSkKLQl7Ci0JCXBEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0KLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wJQ1BERlNES19Gb3JtQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fU3VibWl0Rm9ybShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQpCi17Ci0JQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKLQotCUNQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKilwRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwotCUFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwotCi0JcmV0dXJuIHBJbnRlckZvcm0tPkRvQWN0aW9uX1N1Ym1pdEZvcm0oYWN0aW9uKTsKLX0KLQotRlhfQk9PTAlDUERGU0RLX0Zvcm1BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9SZXNldEZvcm0oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQotewotCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLQlDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKLQlBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKLQotCWlmIChwSW50ZXJGb3JtLT5Eb0FjdGlvbl9SZXNldEZvcm0oYWN0aW9uKSkKLQl7Ci0JCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKLX0KLQotRlhfQk9PTAlDUERGU0RLX0Zvcm1BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9JbXBvcnREYXRhKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLQlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwotCi0JQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKXBEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7Ci0JQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7Ci0KLQlpZiAocEludGVyRm9ybS0+RG9BY3Rpb25fSW1wb3J0RGF0YShhY3Rpb24pKQotCXsKLQkJcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7Ci0JCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKLX0KLQotRlhfQk9PTAlDUERGU0RLX01lZGlhQWN0aW9uSGFuZGxlcjo6RG9BY3Rpb25fUmVuZGl0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wJQ1BERlNES19NZWRpYUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX1NvdW5kKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0JPT0wJQ1BERlNES19NZWRpYUFjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX01vdmllKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sIENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKLXsKLQlyZXR1cm4gRkFMU0U7CisgIHJldHVybiBGQUxTRTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZzZGtfYW5ub3RoYW5kbGVyLmNwcCBiL2ZwZGZzZGsvc3JjL2ZzZGtfYW5ub3RoYW5kbGVyLmNwcAppbmRleCBiYzBmMDQ3Li4wOGQzM2EyIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mc2RrX2Fubm90aGFuZGxlci5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnNka19hbm5vdGhhbmRsZXIuY3BwCkBAIC0xLDk0MCArMSwxMTgwIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX21nci5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnNka19hbm5vdGhhbmRsZXIuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CiAKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mc2RrX2Fubm90aGFuZGxlci5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mc2RrX2RlZmluZS5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mc2RrX21nci5oIgogCi1DUERGU0RLX0Fubm90SGFuZGxlck1ncjo6Q1BERlNES19Bbm5vdEhhbmRsZXJNZ3IoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCkKLXsKLQltX3BBcHAgPSBwQXBwOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9kb2MuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX3V0aWwuaCIKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAotCUNQREZTREtfQkZBbm5vdEhhbmRsZXIqIHBIYW5kbGVyID0gbmV3IENQREZTREtfQkZBbm5vdEhhbmRsZXIobV9wQXBwKTsKLQlwSGFuZGxlci0+U2V0Rm9ybUZpbGxlcihtX3BBcHAtPkdldElGb3JtRmlsbGVyKCkpOwotCVJlZ2lzdGVyQW5ub3RIYW5kbGVyKHBIYW5kbGVyKTsKK0NQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpDUERGU0RLX0Fubm90SGFuZGxlck1ncihDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKSB7CisgIG1fcEFwcCA9IHBBcHA7CisKKyAgQ1BERlNES19CRkFubm90SGFuZGxlciogcEhhbmRsZXIgPSBuZXcgQ1BERlNES19CRkFubm90SGFuZGxlcihtX3BBcHApOworICBwSGFuZGxlci0+U2V0Rm9ybUZpbGxlcihtX3BBcHAtPkdldElGb3JtRmlsbGVyKCkpOworICBSZWdpc3RlckFubm90SGFuZGxlcihwSGFuZGxlcik7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgQ1BERlNES19YRkFBbm5vdEhhbmRsZXIqIHBYRkFBbm5vdEhhbmRsZXIgPQorICAgICAgbmV3IENQREZTREtfWEZBQW5ub3RIYW5kbGVyKG1fcEFwcCk7CisgIFJlZ2lzdGVyQW5ub3RIYW5kbGVyKHBYRkFBbm5vdEhhbmRsZXIpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogfQogCi1DUERGU0RLX0Fubm90SGFuZGxlck1ncjo6fkNQREZTREtfQW5ub3RIYW5kbGVyTWdyKCkKLXsKLQlmb3IoaW50IGk9MDsgaTxtX0hhbmRsZXJzLkdldFNpemUoKTsgaSsrKQotCXsKLQkJSVBERlNES19Bbm5vdEhhbmRsZXIqIHBIYW5kbGVyID0gbV9IYW5kbGVycy5HZXRBdChpKTsKLQkJZGVsZXRlIHBIYW5kbGVyOwotCX0KLQltX0hhbmRsZXJzLlJlbW92ZUFsbCgpOwotCW1fbWFwVHlwZTJIYW5kbGVyLlJlbW92ZUFsbCgpOworQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6On5DUERGU0RLX0Fubm90SGFuZGxlck1ncigpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX0hhbmRsZXJzLkdldFNpemUoKTsgaSsrKSB7CisgICAgSVBERlNES19Bbm5vdEhhbmRsZXIqIHBIYW5kbGVyID0gbV9IYW5kbGVycy5HZXRBdChpKTsKKyAgICBkZWxldGUgcEhhbmRsZXI7CisgIH0KKyAgbV9IYW5kbGVycy5SZW1vdmVBbGwoKTsKKyAgbV9tYXBUeXBlMkhhbmRsZXIuY2xlYXIoKTsKIH0KIAotdm9pZAlDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6UmVnaXN0ZXJBbm5vdEhhbmRsZXIoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIpCi17Ci0JQVNTRVJUKHBBbm5vdEhhbmRsZXIgIT0gTlVMTCk7Ci0JCi0JQVNTRVJUKEdldEFubm90SGFuZGxlcihwQW5ub3RIYW5kbGVyLT5HZXRUeXBlKCkpID09IE5VTEwpOwotCQotCW1fSGFuZGxlcnMuQWRkKHBBbm5vdEhhbmRsZXIpOwotCW1fbWFwVHlwZTJIYW5kbGVyLlNldEF0KHBBbm5vdEhhbmRsZXItPkdldFR5cGUoKSwgKHZvaWQqKXBBbm5vdEhhbmRsZXIpOwordm9pZCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6UmVnaXN0ZXJBbm5vdEhhbmRsZXIoCisgICAgSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIpIHsKKyAgQVNTRVJUKCFHZXRBbm5vdEhhbmRsZXIocEFubm90SGFuZGxlci0+R2V0VHlwZSgpKSk7CisKKyAgbV9IYW5kbGVycy5BZGQocEFubm90SGFuZGxlcik7CisgIG1fbWFwVHlwZTJIYW5kbGVyW3BBbm5vdEhhbmRsZXItPkdldFR5cGUoKV0gPSBwQW5ub3RIYW5kbGVyOwogfQogCi12b2lkIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpVblJlZ2lzdGVyQW5ub3RIYW5kbGVyKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyKQotewotCUFTU0VSVChwQW5ub3RIYW5kbGVyICE9IE5VTEwpOwotCQotCW1fbWFwVHlwZTJIYW5kbGVyLlJlbW92ZUtleShwQW5ub3RIYW5kbGVyLT5HZXRUeXBlKCkpOwotCQotCWZvciAoaW50IGk9MCwgc3o9bV9IYW5kbGVycy5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQl7Ci0JCWlmIChtX0hhbmRsZXJzLkdldEF0KGkpID09IHBBbm5vdEhhbmRsZXIpCi0JCXsKLQkJCW1fSGFuZGxlcnMuUmVtb3ZlQXQoaSk7Ci0JCQlicmVhazsKLQkJfQotCX0KK3ZvaWQgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OlVuUmVnaXN0ZXJBbm5vdEhhbmRsZXIoCisgICAgSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIpIHsKKyAgbV9tYXBUeXBlMkhhbmRsZXIuZXJhc2UocEFubm90SGFuZGxlci0+R2V0VHlwZSgpKTsKKyAgZm9yIChpbnQgaSA9IDAsIHN6ID0gbV9IYW5kbGVycy5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgaWYgKG1fSGFuZGxlcnMuR2V0QXQoaSkgPT0gcEFubm90SGFuZGxlcikgeworICAgICAgbV9IYW5kbGVycy5SZW1vdmVBdChpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQogfQogCi1DUERGU0RLX0Fubm90KiBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6TmV3QW5ub3QoQ1BERl9Bbm5vdCAqIHBBbm5vdCwgQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3KQotewotCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0JQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKLQkKLQlpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90LT5HZXRTdWJUeXBlKCkpKQotCXsKLQkJcmV0dXJuIHBBbm5vdEhhbmRsZXItPk5ld0Fubm90KHBBbm5vdCwgcFBhZ2VWaWV3KTsKLQl9Ci0JCi0JcmV0dXJuIG5ldyBDUERGU0RLX0Fubm90KHBBbm5vdCwgcFBhZ2VWaWV3KTsKK0NQREZTREtfQW5ub3QqIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpOZXdBbm5vdChDUERGX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CisgIEFTU0VSVChwUGFnZVZpZXcpOworCisgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9CisgICAgICAgICAgR2V0QW5ub3RIYW5kbGVyKHBBbm5vdC0+R2V0U3ViVHlwZSgpKSkgeworICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5OZXdBbm5vdChwQW5ub3QsIHBQYWdlVmlldyk7CisgIH0KKworICByZXR1cm4gbmV3IENQREZTREtfQkFBbm5vdChwQW5ub3QsIHBQYWdlVmlldyk7CiB9CiAKLXZvaWQgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OlJlbGVhc2VBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpCi17Ci0JQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQkKLQlwQW5ub3QtPkdldFBERlBhZ2UoKTsKLQkKLQlpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkKLQl7Ci0JCXBBbm5vdEhhbmRsZXItPk9uUmVsZWFzZShwQW5ub3QpOwotCQlwQW5ub3RIYW5kbGVyLT5SZWxlYXNlQW5ub3QocEFubm90KTsKLQl9Ci0JZWxzZQotCXsKLQkJZGVsZXRlIChDUERGU0RLX0Fubm90KilwQW5ub3Q7Ci0JfQorI2lmZGVmIFBERl9FTkFCTEVfWEZBCitDUERGU0RLX0Fubm90KiBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6TmV3QW5ub3QoSVhGQV9XaWRnZXQqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKKyAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKKyAgQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKKworICBpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPQorICAgICAgICAgIEdldEFubm90SGFuZGxlcihGU0RLX1hGQVdJREdFVF9UWVBFTkFNRSkpIHsKKyAgICByZXR1cm4gcEFubm90SGFuZGxlci0+TmV3QW5ub3QocEFubm90LCBwUGFnZVZpZXcpOworICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKK3ZvaWQgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OlJlbGVhc2VBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpIHsKKyAgcEFubm90LT5HZXRQREZQYWdlKCk7CisKKyAgaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpIHsKKyAgICBwQW5ub3RIYW5kbGVyLT5PblJlbGVhc2UocEFubm90KTsKKyAgICBwQW5ub3RIYW5kbGVyLT5SZWxlYXNlQW5ub3QocEFubm90KTsKKyAgfSBlbHNlIHsKKyAgICBkZWxldGUgKENQREZTREtfQW5ub3QqKXBBbm5vdDsKKyAgfQogfQogCi12b2lkIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkNyZWF0ZShDUERGU0RLX0Fubm90KiBwQW5ub3QpCi17Ci0JQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQkKLQlDUERGX0Fubm90KiBwUERGQW5ub3QgPSBwQW5ub3QtPkdldFBERkFubm90KCk7Ci0JQVNTRVJUKHBQREZBbm5vdCAhPSBOVUxMKTsKLQlBU1NFUlQocFBERkFubm90LT5tX3BBbm5vdERpY3QgIT0gTlVMTCk7Ci0JCi0JQ1BERlNES19EYXRlVGltZSBjdXJUaW1lOwotCXBQREZBbm5vdC0+bV9wQW5ub3REaWN0LT5TZXRBdFN0cmluZygiTSIsIGN1clRpbWUuVG9QREZEYXRlVGltZVN0cmluZygpKTsKLQlwUERGQW5ub3QtPm1fcEFubm90RGljdC0+U2V0QXROdW1iZXIoIkYiLCAoaW50KTApOwkKLQkKLQlpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkKLQl7Ci0JCXBBbm5vdEhhbmRsZXItPk9uQ3JlYXRlKHBBbm5vdCk7Ci0JfQordm9pZCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25DcmVhdGUoQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIENQREZfQW5ub3QqIHBQREZBbm5vdCA9IHBBbm5vdC0+R2V0UERGQW5ub3QoKTsKKworICBDUERGU0RLX0RhdGVUaW1lIGN1clRpbWU7CisgIHBQREZBbm5vdC0+R2V0QW5ub3REaWN0KCktPlNldEF0U3RyaW5nKCJNIiwgY3VyVGltZS5Ub1BERkRhdGVUaW1lU3RyaW5nKCkpOworICBwUERGQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXRBdE51bWJlcigiRiIsIDApOworCisgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKSB7CisgICAgcEFubm90SGFuZGxlci0+T25DcmVhdGUocEFubm90KTsKKyAgfQogfQogCi12b2lkIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkxvYWQoQ1BERlNES19Bbm5vdCogcEFubm90KQotewotCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0JCi0JaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpCi0JewotCQlwQW5ub3RIYW5kbGVyLT5PbkxvYWQocEFubm90KTsKLQl9Cit2b2lkIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkxvYWQoQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIEFTU0VSVChwQW5ub3QpOworCisgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKSB7CisgICAgcEFubm90SGFuZGxlci0+T25Mb2FkKHBBbm5vdCk7CisgIH0KIH0KIAotSVBERlNES19Bbm5vdEhhbmRsZXIqIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpHZXRBbm5vdEhhbmRsZXIoQ1BERlNES19Bbm5vdCogcEFubm90KSBjb25zdAotewotCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0JCi0JQ1BERl9Bbm5vdCogcFBERkFubm90ID0gcEFubm90LT5HZXRQREZBbm5vdCgpOwotCUFTU0VSVChwUERGQW5ub3QgIT0gTlVMTCk7Ci0JCi0JcmV0dXJuIEdldEFubm90SGFuZGxlcihwUERGQW5ub3QtPkdldFN1YlR5cGUoKSk7CitJUERGU0RLX0Fubm90SGFuZGxlciogQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkdldEFubm90SGFuZGxlcigKKyAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QpIGNvbnN0IHsKKyAgQ1BERl9Bbm5vdCogcFBERkFubm90ID0gcEFubm90LT5HZXRQREZBbm5vdCgpOworICBpZiAocFBERkFubm90KQorICAgIHJldHVybiBHZXRBbm5vdEhhbmRsZXIocFBERkFubm90LT5HZXRTdWJUeXBlKCkpOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIGlmIChwQW5ub3QtPkdldFhGQVdpZGdldCgpKQorICAgIHJldHVybiBHZXRBbm5vdEhhbmRsZXIoRlNES19YRkFXSURHRVRfVFlQRU5BTUUpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICByZXR1cm4gbnVsbHB0cjsKIH0KIAotSVBERlNES19Bbm5vdEhhbmRsZXIqIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpHZXRBbm5vdEhhbmRsZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNUeXBlKSBjb25zdAotewotCXZvaWQqIHBSZXQgPSBOVUxMOwotCW1fbWFwVHlwZTJIYW5kbGVyLkxvb2t1cChzVHlwZSwgcFJldCk7CQotCXJldHVybiAoSVBERlNES19Bbm5vdEhhbmRsZXIqKXBSZXQ7CitJUERGU0RLX0Fubm90SGFuZGxlciogQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkdldEFubm90SGFuZGxlcigKKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc1R5cGUpIGNvbnN0IHsKKyAgYXV0byBpdCA9IG1fbWFwVHlwZTJIYW5kbGVyLmZpbmQoc1R5cGUpOworICByZXR1cm4gaXQgIT0gbV9tYXBUeXBlMkhhbmRsZXIuZW5kKCkgPyBpdC0+c2Vjb25kIDogbnVsbHB0cjsKIH0KIAotdm9pZCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25EcmF3KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLEZYX0RXT1JEIGR3RmxhZ3MpCi17Ci0JQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQkKLQlpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkKLQl7Ci0JCXBBbm5vdEhhbmRsZXItPk9uRHJhdyhwUGFnZVZpZXcsIHBBbm5vdCwgcERldmljZSwgcFVzZXIyRGV2aWNlLCBkd0ZsYWdzKTsKLQl9Ci0JZWxzZQotCXsKLQkJcEFubm90LT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIENQREZfQW5ub3Q6Ok5vcm1hbCwgTlVMTCk7Ci0JfQordm9pZCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25EcmF3KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncykgeworICBBU1NFUlQocEFubm90KTsKKworICBpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkgeworICAgIHBBbm5vdEhhbmRsZXItPk9uRHJhdyhwUGFnZVZpZXcsIHBBbm5vdCwgcERldmljZSwgcFVzZXIyRGV2aWNlLCBkd0ZsYWdzKTsKKyAgfSBlbHNlIHsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICAgIGlmIChwQW5ub3QtPklzWEZBRmllbGQoKSkKKyAgICAgIHJldHVybjsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgICBzdGF0aWNfY2FzdDxDUERGU0RLX0JBQW5ub3QqPihwQW5ub3QpCisgICAgICAgIC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsIG51bGxwdHIpOworICB9CiB9CiAKK0ZYX0JPT0wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uTEJ1dHRvbkRvd24oCisgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgQVNTRVJUKHBBbm5vdCk7CiAKLUZYX0JPT0wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0JCi0JaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpCi0JewotCQlyZXR1cm4gcEFubm90SGFuZGxlci0+T25MQnV0dG9uRG93bihwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7Ci0JfQotCXJldHVybiBGQUxTRTsKKyAgaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpIHsKKyAgICByZXR1cm4gcEFubm90SGFuZGxlci0+T25MQnV0dG9uRG93bihwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQotRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotIHsKLQlBU1NFUlQocEFubm90ICE9IE5VTEwpOworRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgQVNTRVJUKHBBbm5vdCk7CiAKLQlpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkKLQl7Ci0JCXJldHVybiBwQW5ub3RIYW5kbGVyLT5PbkxCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7Ci0JfQotCXJldHVybiBGQUxTRTsKLSB9Ci1GWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0JCi0JaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpCi0JewotCQlyZXR1cm4gcEFubm90SGFuZGxlci0+T25MQnV0dG9uRGJsQ2xrKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKLQl9Ci0JcmV0dXJuIEZBTFNFOworICBpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkgeworICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5PbkxCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQotRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0JCi0JaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpCi0JewotCQlyZXR1cm4gcEFubm90SGFuZGxlci0+T25Nb3VzZU1vdmUocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwotCX0KLQlyZXR1cm4gRkFMU0U7CitGWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkxCdXR0b25EYmxDbGsoCisgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgQVNTRVJUKHBBbm5vdCk7CisKKyAgaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpIHsKKyAgICByZXR1cm4gcEFubm90SGFuZGxlci0+T25MQnV0dG9uRGJsQ2xrKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1GWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9Pbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0JQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQkKLQlpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkKLQl7Ci0JCXJldHVybiBwQW5ub3RIYW5kbGVyLT5Pbk1vdXNlV2hlZWwocFBhZ2VWaWV3LCBwQW5ub3QsbkZsYWdzLHpEZWx0YSwgcG9pbnQpOwotCX0KLQlyZXR1cm4gRkFMU0U7CitGWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9Pbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBBU1NFUlQocEFubm90KTsKKworICBpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkgeworICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5Pbk1vdXNlTW92ZShwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQotRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0JQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQkKLQlpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkKLQl7Ci0JCXJldHVybiBwQW5ub3RIYW5kbGVyLT5PblJCdXR0b25Eb3duKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKLQl9Ci0JcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25Nb3VzZVdoZWVsKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHpEZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBBU1NFUlQocEFubm90KTsKKworICBpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkgeworICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5Pbk1vdXNlV2hlZWwocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQpOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KLUZYX0JPT0wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uUkJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLQlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCQotCWlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKQotCXsKLQkJcmV0dXJuIHBBbm5vdEhhbmRsZXItPk9uUkJ1dHRvblVwKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKLQl9Ci0JcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25SQnV0dG9uRG93bigKKyAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBBU1NFUlQocEFubm90KTsKKworICBpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkgeworICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5PblJCdXR0b25Eb3duKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CitGWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBBU1NFUlQocEFubm90KTsKKworICBpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkgeworICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5PblJCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQogCi12b2lkIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9Pbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykKLXsKLQlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCQotCWlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKQotCXsKLQkJcEFubm90SGFuZGxlci0+T25Nb3VzZUVudGVyKHBQYWdlVmlldywgcEFubm90LCBuRmxhZyk7Ci0JfQotCXJldHVybiA7Cit2b2lkIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9Pbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgeworICBBU1NFUlQocEFubm90KTsKKworICBpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkgeworICAgIHBBbm5vdEhhbmRsZXItPk9uTW91c2VFbnRlcihwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWcpOworICB9CisgIHJldHVybjsKIH0KIAotdm9pZCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykKLXsKLQlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCQotCWlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKQotCXsKLQkJcEFubm90SGFuZGxlci0+T25Nb3VzZUV4aXQocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFnKTsKLQl9Ci0JcmV0dXJuOwordm9pZCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIHsKKyAgQVNTRVJUKHBBbm5vdCk7CisKKyAgaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpIHsKKyAgICBwQW5ub3RIYW5kbGVyLT5Pbk1vdXNlRXhpdChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWcpOworICB9CisgIHJldHVybjsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFncykKLXsKLQotCWlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKQotCXsKLQkJcmV0dXJuIHBBbm5vdEhhbmRsZXItPk9uQ2hhcihwQW5ub3QsbkNoYXIsIG5GbGFncyk7Ci0JfQotCXJldHVybiBGQUxTRTsKLQorRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MpIHsKKyAgaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpIHsKKyAgICByZXR1cm4gcEFubm90SGFuZGxlci0+T25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFncyk7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MCQkJQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKQoteworRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbktleUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5GbGFnKSB7CisgIGlmICghbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZykgJiYgIW1fcEFwcC0+RkZJX0lzQUxUS2V5RG93bihuRmxhZykpIHsKKyAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZSA9IHBBbm5vdC0+R2V0UGFnZVZpZXcoKTsKKyAgICBDUERGU0RLX0Fubm90KiBwRm9jdXNBbm5vdCA9IHBQYWdlLT5HZXRGb2N1c0Fubm90KCk7CisgICAgaWYgKHBGb2N1c0Fubm90ICYmIChuS2V5Q29kZSA9PSBGV0xfVktFWV9UYWIpKSB7CisgICAgICBDUERGU0RLX0Fubm90KiBwTmV4dCA9CisgICAgICAgICAgR2V0TmV4dEFubm90KHBGb2N1c0Fubm90LCAhbV9wQXBwLT5GRklfSXNTSElGVEtleURvd24obkZsYWcpKTsKIAotCWlmICghbV9wQXBwLT5GRklfSXNDVFJMS2V5RG93bihuRmxhZykgJiYgIW1fcEFwcC0+RkZJX0lzQUxUS2V5RG93bihuRmxhZykpCi0JewotCQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZSA9IHBBbm5vdC0+R2V0UGFnZVZpZXcoKTsKLQkJQ1BERlNES19Bbm5vdCogcEZvY3VzQW5ub3QgPSBwUGFnZS0+R2V0Rm9jdXNBbm5vdCgpOwotCQlpZiAocEZvY3VzQW5ub3QgJiYgKG5LZXlDb2RlID09IEZXTF9WS0VZX1RhYikpCi0JCXsKLQkJCUNQREZTREtfQW5ub3QqIHBOZXh0ID0gR2V0TmV4dEFubm90KHBGb2N1c0Fubm90LCAhbV9wQXBwLT5GRklfSXNTSElGVEtleURvd24obkZsYWcpKTsKKyAgICAgIGlmIChwTmV4dCAmJiBwTmV4dCAhPSBwRm9jdXNBbm5vdCkgeworICAgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwUGFnZS0+R2V0U0RLRG9jdW1lbnQoKTsKKyAgICAgICAgcERvY3VtZW50LT5TZXRGb2N1c0Fubm90KHBOZXh0KTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9CisgICAgfQorICB9CiAKLQkJCWlmKHBOZXh0ICYmIHBOZXh0ICE9IHBGb2N1c0Fubm90KQotCQkJewotCQkJCUNQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBQYWdlLT5HZXRTREtEb2N1bWVudCgpOwotCQkJCXBEb2N1bWVudC0+U2V0Rm9jdXNBbm5vdChwTmV4dCk7Ci0JCQkJcmV0dXJuIFRSVUU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkKLQl7Ci0JCXJldHVybiBwQW5ub3RIYW5kbGVyLT5PbktleURvd24ocEFubm90LG5LZXlDb2RlLCBuRmxhZyk7Ci0JfQotCXJldHVybiBGQUxTRTsKKyAgaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpIHsKKyAgICByZXR1cm4gcEFubm90SGFuZGxlci0+T25LZXlEb3duKHBBbm5vdCwgbktleUNvZGUsIG5GbGFnKTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9Ci1GWF9CT09MCQkJQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uS2V5VXAoQ1BERlNES19Bbm5vdCogcEFubm90LCBpbnQgbktleUNvZGUsIGludCBuRmxhZykKLXsKLQlyZXR1cm4gRkFMU0U7CitGWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbktleVVwKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5LZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZsYWcpIHsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MCQkJQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uU2V0Rm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykKLXsKLQlBU1NFUlQocEFubm90ICE9IE5VTEwpOworRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSB7CisgIEFTU0VSVChwQW5ub3QpOwogCi0JaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpCi0JewotCQlpZiAocEFubm90SGFuZGxlci0+T25TZXRGb2N1cyhwQW5ub3QsIG5GbGFnKSkKLQkJewotCQkJQ1BERlNES19QYWdlVmlldyogcFBhZ2UgPSBwQW5ub3QtPkdldFBhZ2VWaWV3KCk7Ci0JCQlBU1NFUlQocFBhZ2UgIT0gTlVMTCk7Ci0KLQkJCXBQYWdlLT5HZXRTREtEb2N1bWVudCgpOwotCS8vCQlwRG9jdW1lbnQtPlNldFRvcG1vc3RBbm5vdChwQW5ub3QpOwotCi0JCQlyZXR1cm4gVFJVRTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJldHVybiBGQUxTRTsKLQkJfQotCX0KLQkKLQlyZXR1cm4gRkFMU0U7CisgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKSB7CisgICAgaWYgKHBBbm5vdEhhbmRsZXItPk9uU2V0Rm9jdXMocEFubm90LCBuRmxhZykpIHsKKyAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlID0gcEFubm90LT5HZXRQYWdlVmlldygpOworICAgICAgcFBhZ2UtPkdldFNES0RvY3VtZW50KCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MCQkJQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQkKLQlpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkKLQl7Ci0JCWlmIChwQW5ub3RIYW5kbGVyLT5PbktpbGxGb2N1cyhwQW5ub3QsIG5GbGFnKSkKLQkJewkKLQkJCXJldHVybiBUUlVFOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBGQUxTRTsKLQl9Ci0JCi0JcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIHsKKyAgQVNTRVJUKHBBbm5vdCk7CisgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKQorICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5PbktpbGxGb2N1cyhwQW5ub3QsIG5GbGFnKTsKKworICByZXR1cm4gRkFMU0U7CiB9CiAKLUNQREZfUmVjdAlDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25HZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCkKLXsKLQlBU1NFUlQocEFubm90KTsKLQlpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkKLQl7Ci0JCXJldHVybiBwQW5ub3RIYW5kbGVyLT5HZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdCk7Ci0JfQotCXJldHVybiBwQW5ub3QtPkdldFJlY3QoKTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25DaGFuZ2VGb2N1cygKKyAgICBDUERGU0RLX0Fubm90KiBwU2V0QW5ub3QsCisgICAgQ1BERlNES19Bbm5vdCogcEtpbGxBbm5vdCkgeworICBGWF9CT09MIGJYRkEgPSAocFNldEFubm90ICYmIHBTZXRBbm5vdC0+R2V0WEZBV2lkZ2V0KCkpIHx8CisgICAgICAgICAgICAgICAgIChwS2lsbEFubm90ICYmIHBLaWxsQW5ub3QtPkdldFhGQVdpZGdldCgpKTsKKworICBpZiAoYlhGQSkgeworICAgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcFhGQUFubm90SGFuZGxlciA9CisgICAgICAgICAgICBHZXRBbm5vdEhhbmRsZXIoRlNES19YRkFXSURHRVRfVFlQRU5BTUUpKQorICAgICAgcmV0dXJuIHBYRkFBbm5vdEhhbmRsZXItPk9uWEZBQ2hhbmdlZEZvY3VzKHBLaWxsQW5ub3QsIHBTZXRBbm5vdCk7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworQ1BERl9SZWN0IENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkdldFZpZXdCQm94KAorICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QpIHsKKyAgQVNTRVJUKHBBbm5vdCk7CisgIGlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKQorICAgIHJldHVybiBwQW5ub3RIYW5kbGVyLT5HZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdCk7CisKKyAgcmV0dXJuIHBBbm5vdC0+R2V0UmVjdCgpOwogfQogCi1GWF9CT09MCUNQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkhpdFRlc3QoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotCUFTU0VSVChwQW5ub3QpOwotCWlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKQotCXsKLQkJaWYocEFubm90SGFuZGxlci0+Q2FuQW5zd2VyKHBBbm5vdCkpCi0JCQlyZXR1cm4gcEFubm90SGFuZGxlci0+SGl0VGVzdChwUGFnZVZpZXcsIHBBbm5vdCwgcG9pbnQpOwotCX0KLQlyZXR1cm4gRkFMU0U7CitGWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkhpdFRlc3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBBU1NFUlQocEFubm90KTsKKyAgaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpIHsKKyAgICBpZiAocEFubm90SGFuZGxlci0+Q2FuQW5zd2VyKHBBbm5vdCkpCisgICAgICByZXR1cm4gcEFubm90SGFuZGxlci0+SGl0VGVzdChwUGFnZVZpZXcsIHBBbm5vdCwgcG9pbnQpOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KIAotQ1BERlNES19Bbm5vdCoJQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkdldE5leHRBbm5vdChDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QsRlhfQk9PTCBiTmV4dCkKLXsKLQkgQ0JBX0Fubm90SXRlcmF0b3IgYWkocFNES0Fubm90LT5HZXRQYWdlVmlldygpLCAiV2lkZ2V0IiwgIiIpOworQ1BERlNES19Bbm5vdCogQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkdldE5leHRBbm5vdChDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5leHQpIHsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwU0RLQW5ub3QtPkdldFBhZ2VWaWV3KCk7CisgIENQREZYRkFfUGFnZSogcFBhZ2UgPSBwUGFnZVZpZXctPkdldFBERlhGQVBhZ2UoKTsKKyAgaWYgKHBQYWdlID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmIChwUGFnZS0+R2V0UERGUGFnZSgpKSB7ICAvLyBmb3IgcGRmIGFubm90cy4KKyAgICBDQkFfQW5ub3RJdGVyYXRvciBhaShwU0RLQW5ub3QtPkdldFBhZ2VWaWV3KCksIHBTREtBbm5vdC0+R2V0VHlwZSgpLCAiIik7CisgICAgQ1BERlNES19Bbm5vdCogcE5leHQgPQorICAgICAgICBiTmV4dCA/IGFpLkdldE5leHRBbm5vdChwU0RLQW5ub3QpIDogYWkuR2V0UHJldkFubm90KHBTREtBbm5vdCk7CisgICAgcmV0dXJuIHBOZXh0OworICB9CisgIC8vIGZvciB4ZmEgYW5ub3RzCisgIElYRkFfV2lkZ2V0SXRlcmF0b3IqIHBXaWRnZXRJdGVyYXRvciA9CisgICAgICBwUGFnZS0+R2V0WEZBUGFnZVZpZXcoKS0+Q3JlYXRlV2lkZ2V0SXRlcmF0b3IoCisgICAgICAgICAgWEZBX1RSQVZFUlNFV0FZX1RyYW52YWxzZSwgWEZBX1dJREdFVEZJTFRFUl9WaXNpYmxlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1dJREdFVEZJTFRFUl9WaWV3YWJsZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9XSURHRVRGSUxURVJfRmllbGQpOworICBpZiAocFdpZGdldEl0ZXJhdG9yID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmIChwV2lkZ2V0SXRlcmF0b3ItPkdldEN1cnJlbnRXaWRnZXQoKSAhPSBwU0RLQW5ub3QtPkdldFhGQVdpZGdldCgpKQorICAgIHBXaWRnZXRJdGVyYXRvci0+U2V0Q3VycmVudFdpZGdldChwU0RLQW5ub3QtPkdldFhGQVdpZGdldCgpKTsKKyAgSVhGQV9XaWRnZXQqIGhOZXh0Rm9jdXMgPSBOVUxMOworICBoTmV4dEZvY3VzID0KKyAgICAgIGJOZXh0ID8gcFdpZGdldEl0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCkgOiBwV2lkZ2V0SXRlcmF0b3ItPk1vdmVUb1ByZXZpb3VzKCk7CisgIGlmIChoTmV4dEZvY3VzID09IE5VTEwgJiYgcFNES0Fubm90ICE9IE5VTEwpCisgICAgaE5leHRGb2N1cyA9IHBXaWRnZXRJdGVyYXRvci0+TW92ZVRvRmlyc3QoKTsKIAotCSBDUERGU0RLX0Fubm90KiBwTmV4dCA9IGJOZXh0ID8gCi0JCSBhaS5HZXROZXh0QW5ub3QocFNES0Fubm90KSA6IAotCQlhaS5HZXRQcmV2QW5ub3QocFNES0Fubm90KTsKLQkKLQkJcmV0dXJuIHBOZXh0OworICBwV2lkZ2V0SXRlcmF0b3ItPlJlbGVhc2UoKTsKKyAgcmV0dXJuIHBQYWdlVmlldy0+R2V0QW5ub3RCeVhGQVdpZGdldChoTmV4dEZvY3VzKTsKKyNlbHNlICAgLy8gUERGX0VOQUJMRV9YRkEKKyAgQ0JBX0Fubm90SXRlcmF0b3IgYWkocFNES0Fubm90LT5HZXRQYWdlVmlldygpLCAiV2lkZ2V0IiwgIiIpOworICByZXR1cm4gYk5leHQgPyBhaS5HZXROZXh0QW5ub3QocFNES0Fubm90KSA6IGFpLkdldFByZXZBbm5vdChwU0RLQW5ub3QpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogfQogCi1GWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6OkNhbkFuc3dlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpCi17Ci0JQVNTRVJUKHBBbm5vdCk7Ci0JQVNTRVJUKHBBbm5vdC0+R2V0VHlwZSgpID09ICJXaWRnZXQiKTsKLQlDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOwotCQotCWlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkKLQl7Ci0JfQotCWVsc2UKLQl7Ci0JCUNQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7Ci0JCWlmICghcFdpZGdldC0+SXNWaXNpYmxlKCkpIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6Q2FuQW5zd2VyKENQREZTREtfQW5ub3QqIHBBbm5vdCkgeworICBBU1NFUlQocEFubm90LT5HZXRUeXBlKCkgPT0gIldpZGdldCIpOworICBpZiAocEFubm90LT5HZXRTdWJUeXBlKCkgPT0gQkZGVF9TSUdOQVRVUkUpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JCWludCBuRmllbGRGbGFncyA9IHBXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKTsKLQkJaWYgKChuRmllbGRGbGFncyAmIEZJRUxERkxBR19SRUFET05MWSkgPT0gRklFTERGTEFHX1JFQURPTkxZKSByZXR1cm4gRkFMU0U7Ci0JCWlmIChwV2lkZ2V0LT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLQkJCXJldHVybiBUUlVFOwotCQllbHNlCi0JCXsKLQkJCUNQREZfUGFnZSogcFBhZ2UgPSBwV2lkZ2V0LT5HZXRQREZQYWdlKCk7Ci0JCQlBU1NFUlQocFBhZ2UgIT0gTlVMTCk7Ci0JCQkKLQkJCUNQREZfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBQYWdlLT5tX3BEb2N1bWVudDsKLQkJCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7Ci0JCQkKLQkJCUZYX0RXT1JEIGR3UGVybWlzc2lvbnMgPSBwRG9jdW1lbnQtPkdldFVzZXJQZXJtaXNzaW9ucygpOwotCQkJcmV0dXJuIChkd1Blcm1pc3Npb25zJkZQREZQRVJNX0ZJTExfRk9STSkgfHwgCi0JCQkJKGR3UGVybWlzc2lvbnMmRlBERlBFUk1fQU5OT1RfRk9STSkgfHwgCi0gCQkJKGR3UGVybWlzc2lvbnMmRlBERlBFUk1fQU5OT1RfRk9STSk7Ci0JCX0KLQl9CisgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7CisgIGlmICghcFdpZGdldC0+SXNWaXNpYmxlKCkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JcmV0dXJuIEZBTFNFOworICBpbnQgbkZpZWxkRmxhZ3MgPSBwV2lkZ2V0LT5HZXRGaWVsZEZsYWdzKCk7CisgIGlmICgobkZpZWxkRmxhZ3MgJiBGSUVMREZMQUdfUkVBRE9OTFkpID09IEZJRUxERkxBR19SRUFET05MWSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHBXaWRnZXQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQorICAgIHJldHVybiBUUlVFOworCisgIENQREZfUGFnZSogcFBhZ2UgPSBwV2lkZ2V0LT5HZXRQREZQYWdlKCk7CisgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBQYWdlLT5tX3BEb2N1bWVudDsKKyAgRlhfRFdPUkQgZHdQZXJtaXNzaW9ucyA9IHBEb2N1bWVudC0+R2V0VXNlclBlcm1pc3Npb25zKCk7CisgIHJldHVybiAoZHdQZXJtaXNzaW9ucyAmIEZQREZQRVJNX0ZJTExfRk9STSkgfHwKKyAgICAgICAgIChkd1Blcm1pc3Npb25zICYgRlBERlBFUk1fQU5OT1RfRk9STSk7CiB9CiAKLUNQREZTREtfQW5ub3QqCQlDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpOZXdBbm5vdChDUERGX0Fubm90KiBwQW5ub3QsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlKQotewotCUFTU0VSVChwUGFnZSAhPSBOVUxMKTsKLQlwUGFnZS0+R2V0UERGRG9jdW1lbnQoKTsKLQkKLQlDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jICA9IG1fcEFwcC0+R2V0Q3VycmVudERvYygpOwotCUFTU0VSVChwU0RLRG9jKTsKLQlDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopcFNES0RvYy0+R2V0SW50ZXJGb3JtKCk7Ci0JQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7Ci0JCi0JQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBOVUxMOwotCWlmIChDUERGX0Zvcm1Db250cm9sKiBwQ3RybCA9IENQREZTREtfV2lkZ2V0OjpHZXRGb3JtQ29udHJvbChwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKSwgcEFubm90LT5tX3BBbm5vdERpY3QpKQotCXsKLQkJcFdpZGdldCA9IG5ldyBDUERGU0RLX1dpZGdldChwQW5ub3QsIHBQYWdlLCBwSW50ZXJGb3JtKTsKLQkJcEludGVyRm9ybS0+QWRkTWFwKHBDdHJsLCBwV2lkZ2V0KTsKLQkJQ1BERl9JbnRlckZvcm0qIHBQREZJbnRlckZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKLQkJaWYocFBERkludGVyRm9ybSAmJiBwUERGSW50ZXJGb3JtLT5OZWVkQ29uc3RydWN0QVAoKSkKLQkJCXBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShOVUxMLEZBTFNFKTsKLQl9Ci0JCi0JcmV0dXJuIHBXaWRnZXQ7CitDUERGU0RLX0Fubm90KiBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpOZXdBbm5vdChDUERGX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZSkgeworICBDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gbV9wQXBwLT5HZXRTREtEb2N1bWVudCgpOworICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopcFNES0RvYy0+R2V0SW50ZXJGb3JtKCk7CisgIENQREZfRm9ybUNvbnRyb2wqIHBDdHJsID0gQ1BERlNES19XaWRnZXQ6OkdldEZvcm1Db250cm9sKAorICAgICAgcEludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCksIHBBbm5vdC0+R2V0QW5ub3REaWN0KCkpOworICBpZiAoIXBDdHJsKQorICAgIHJldHVybiBudWxscHRyOworCisgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gbmV3IENQREZTREtfV2lkZ2V0KHBBbm5vdCwgcFBhZ2UsIHBJbnRlckZvcm0pOworICBwSW50ZXJGb3JtLT5BZGRNYXAocEN0cmwsIHBXaWRnZXQpOworICBDUERGX0ludGVyRm9ybSogcFBERkludGVyRm9ybSA9IHBJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOworICBpZiAocFBERkludGVyRm9ybSAmJiBwUERGSW50ZXJGb3JtLT5OZWVkQ29uc3RydWN0QVAoKSkKKyAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2UobnVsbHB0ciwgRkFMU0UpOworCisgIHJldHVybiBwV2lkZ2V0OwogfQogCi12b2lkIENQREZTREtfQkZBbm5vdEhhbmRsZXI6OlJlbGVhc2VBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpCi17Ci0JQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorQ1BERlNES19Bbm5vdCogQ1BERlNES19CRkFubm90SGFuZGxlcjo6TmV3QW5ub3QoSVhGQV9XaWRnZXQqIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZSkgeworICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAotCWlmIChtX3BGb3JtRmlsbGVyKQotCQltX3BGb3JtRmlsbGVyLT5PbkRlbGV0ZShwQW5ub3QpOwotCQotCUNQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7Ci0JQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBwV2lkZ2V0LT5HZXRJbnRlckZvcm0oKTsKLQlBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKLQkKLQlDUERGX0Zvcm1Db250cm9sKiBwQ3Ryb2wgPSBwV2lkZ2V0LT5HZXRGb3JtQ29udHJvbCgpOwotCXBJbnRlckZvcm0tPlJlbW92ZU1hcChwQ3Ryb2wpOwotCQordm9pZCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpSZWxlYXNlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIEFTU0VSVChwQW5ub3QpOwogCi0JZGVsZXRlIHBXaWRnZXQ7CisgIGlmIChtX3BGb3JtRmlsbGVyKQorICAgIG1fcEZvcm1GaWxsZXItPk9uRGVsZXRlKHBBbm5vdCk7CisKKyAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBwV2lkZ2V0LT5HZXRJbnRlckZvcm0oKTsKKyAgQ1BERl9Gb3JtQ29udHJvbCogcEN0cm9sID0gcFdpZGdldC0+R2V0Rm9ybUNvbnRyb2woKTsKKyAgcEludGVyRm9ybS0+UmVtb3ZlTWFwKHBDdHJvbCk7CisKKyAgZGVsZXRlIHBXaWRnZXQ7CiB9CiAKK3ZvaWQgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25EcmF3KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKSB7CisgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CiAKLXZvaWQgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25EcmF3KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLCAgRlhfRFdPUkQgZHdGbGFncykKLXsKLQlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCUNGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7Ci0JCi0JaWYgKHNTdWJUeXBlID09IEJGRlRfU0lHTkFUVVJFKQotCXsKLQkJcEFubm90LT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIENQREZfQW5ub3Q6Ok5vcm1hbCwgTlVMTCk7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChtX3BGb3JtRmlsbGVyKQotCQl7Ci0JCQltX3BGb3JtRmlsbGVyLT5PbkRyYXcocFBhZ2VWaWV3LCBwQW5ub3QsIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgZHdGbGFncyk7Ci0JCX0KLQl9CisgIGlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkgeworICAgIHN0YXRpY19jYXN0PENQREZTREtfQkFBbm5vdCo+KHBBbm5vdCkKKyAgICAgICAgLT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIENQREZfQW5ub3Q6Ok5vcm1hbCwgbnVsbHB0cik7CisgIH0gZWxzZSB7CisgICAgaWYgKG1fcEZvcm1GaWxsZXIpIHsKKyAgICAgIG1fcEZvcm1GaWxsZXItPk9uRHJhdyhwUGFnZVZpZXcsIHBBbm5vdCwgcERldmljZSwgcFVzZXIyRGV2aWNlLCBkd0ZsYWdzKTsKKyAgICB9CisgIH0KIH0KIAotdm9pZCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKSAKLXsKLQlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCUNGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7Ci0JCi0JaWYgKHNTdWJUeXBlID09IEJGRlRfU0lHTkFUVVJFKQotCXsKLQl9Ci0JZWxzZQotCXsKLQkJaWYgKG1fcEZvcm1GaWxsZXIpCi0JCQkgbV9wRm9ybUZpbGxlci0+T25Nb3VzZUVudGVyKHBQYWdlVmlldywgcEFubm90LCBuRmxhZyk7Ci0JfQotCQordm9pZCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKIAorICBpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpIHsKKyAgfSBlbHNlIHsKKyAgICBpZiAobV9wRm9ybUZpbGxlcikKKyAgICAgIG1fcEZvcm1GaWxsZXItPk9uTW91c2VFbnRlcihwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWcpOworICB9CiB9Ci12b2lkIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykgCi17Ci0JQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQlDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOwotCQotCWlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkKLQl7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChtX3BGb3JtRmlsbGVyKQotCQkJIG1fcEZvcm1GaWxsZXItPk9uTW91c2VFeGl0KHBQYWdlVmlldywgcEFubm90LCBuRmxhZyk7Ci0JfQotCQordm9pZCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbk1vdXNlRXhpdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKKworICBpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpIHsKKyAgfSBlbHNlIHsKKyAgICBpZiAobV9wRm9ybUZpbGxlcikKKyAgICAgIG1fcEZvcm1GaWxsZXItPk9uTW91c2VFeGl0KHBQYWdlVmlldywgcEFubm90LCBuRmxhZyk7CisgIH0KIH0KLUZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLQlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCUNGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7Ci0JCi0JaWYgKHNTdWJUeXBlID09IEJGRlRfU0lHTkFUVVJFKQotCXsKLQl9Ci0JZWxzZQotCXsKLQkJaWYgKG1fcEZvcm1GaWxsZXIpCi0JCQlyZXR1cm4gbV9wRm9ybUZpbGxlci0+T25MQnV0dG9uRG93bihwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7Ci0JfQotCQotCXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOworCisgIGlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkgeworICB9IGVsc2UgeworICAgIGlmIChtX3BGb3JtRmlsbGVyKQorICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uTEJ1dHRvbkRvd24ocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOworICB9CisKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0JQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKLQkKLQlpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpCi0JewotCX0KLQllbHNlCi0JewotCQlpZiAobV9wRm9ybUZpbGxlcikKLQkJCXJldHVybiBtX3BGb3JtRmlsbGVyLT5PbkxCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7Ci0JfQotCQotCXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKKworICBpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpIHsKKyAgfSBlbHNlIHsKKyAgICBpZiAobV9wRm9ybUZpbGxlcikKKyAgICAgIHJldHVybiBtX3BGb3JtRmlsbGVyLT5PbkxCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CisgIH0KKworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQotewotCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0JQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKLQkKLQlpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpCi0JewotCX0KLQllbHNlCi0JewotCQlpZiAobV9wRm9ybUZpbGxlcikKLQkJCXJldHVybiBtX3BGb3JtRmlsbGVyLT5PbkxCdXR0b25EYmxDbGsocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwotCX0KLQkKLQlyZXR1cm4gRkFMU0U7CitGWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uTEJ1dHRvbkRibENsayhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOworCisgIGlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkgeworICB9IGVsc2UgeworICAgIGlmIChtX3BGb3JtRmlsbGVyKQorICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uTEJ1dHRvbkRibENsayhwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CisgIH0KKworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17CQotCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0JQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKK0ZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKIAotCWlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkKLQl7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChtX3BGb3JtRmlsbGVyKQotCQkJcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uTW91c2VNb3ZlKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKLQl9CisgIGlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkgeworICB9IGVsc2UgeworICAgIGlmIChtX3BGb3JtRmlsbGVyKQorICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uTW91c2VNb3ZlKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKKyAgfQogCi0JcmV0dXJuIEZBTFNFOwotCisgIHJldHVybiBGQUxTRTsKIH0KIAorRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKIAotRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbk1vdXNlV2hlZWwoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLQlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCUNGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7Ci0JCi0JaWYgKHNTdWJUeXBlID09IEJGRlRfU0lHTkFUVVJFKQotCXsKLQl9Ci0JZWxzZQotCXsKLQkJaWYgKG1fcEZvcm1GaWxsZXIpCi0JCQlyZXR1cm4gbV9wRm9ybUZpbGxlci0+T25Nb3VzZVdoZWVsKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHpEZWx0YSxwb2ludCk7Ci0JfQotCQotCXJldHVybiBGQUxTRTsKKyAgaWYgKHNTdWJUeXBlID09IEJGRlRfU0lHTkFUVVJFKSB7CisgIH0gZWxzZSB7CisgICAgaWYgKG1fcEZvcm1GaWxsZXIpCisgICAgICByZXR1cm4gbV9wRm9ybUZpbGxlci0+T25Nb3VzZVdoZWVsKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHpEZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQpOworICB9CisKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0JQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQlDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOwotCQotCWlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkKLQl7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChtX3BGb3JtRmlsbGVyKQotCQkJcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uUkJ1dHRvbkRvd24ocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwotCX0KLQkKLQlyZXR1cm4gRkFMU0U7CitGWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKKworICBpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpIHsKKyAgfSBlbHNlIHsKKyAgICBpZiAobV9wRm9ybUZpbGxlcikKKyAgICAgIHJldHVybiBtX3BGb3JtRmlsbGVyLT5PblJCdXR0b25Eb3duKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKIH0KLUZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25SQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0JQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQlDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOwotCQotCWlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkKLQl7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChtX3BGb3JtRmlsbGVyKQotCQkJcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uUkJ1dHRvblVwKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKLQl9Ci0JCi0JcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOworCisgIGlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkgeworICB9IGVsc2UgeworICAgIGlmIChtX3BGb3JtRmlsbGVyKQorICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uUkJ1dHRvblVwKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWdzKQotewotCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0JQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKLQkKLQlpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpCi0JewotCX0KLQllbHNlCi0JewotCQlpZiAobV9wRm9ybUZpbGxlcikKLQkJCXJldHVybiBtX3BGb3JtRmlsbGVyLT5PbkNoYXIocEFubm90LG5DaGFyLCBuRmxhZ3MpOwotCX0KLQkKLQlyZXR1cm4gRkFMU0U7CitGWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncykgeworICBDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOworCisgIGlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkgeworICB9IGVsc2UgeworICAgIGlmIChtX3BGb3JtRmlsbGVyKQorICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOworICB9CisKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKQotewotCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0JQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKLQkKLQlpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpCi0JewotCX0KLQllbHNlCi0JewotCQlpZiAobV9wRm9ybUZpbGxlcikKLQkJCXJldHVybiBtX3BGb3JtRmlsbGVyLT5PbktleURvd24ocEFubm90LG5LZXlDb2RlLCBuRmxhZyk7Ci0JfQotCQotCXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuS2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuRmxhZykgeworICBDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOworCisgIGlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkgeworICB9IGVsc2UgeworICAgIGlmIChtX3BGb3JtRmlsbGVyKQorICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uS2V5RG93bihwQW5ub3QsIG5LZXlDb2RlLCBuRmxhZyk7CisgIH0KKworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25LZXlVcChDUERGU0RLX0Fubm90KiBwQW5ub3QsIGludCBuS2V5Q29kZSwgaW50IG5GbGFnKQotewotCi0JcmV0dXJuIEZBTFNFOworRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbktleVVwKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbktleUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5GbGFnKSB7CisgIHJldHVybiBGQUxTRTsKIH0KLXZvaWQJQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25DcmVhdGUoQ1BERlNES19Bbm5vdCogcEFubm90KSAKLXsKLQlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCUNGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7Ci0JCi0JaWYgKHNTdWJUeXBlID09IEJGRlRfU0lHTkFUVVJFKQotCXsKLQl9Ci0JZWxzZQotCXsKLQkJaWYgKG1fcEZvcm1GaWxsZXIpCi0JCQltX3BGb3JtRmlsbGVyLT5PbkNyZWF0ZShwQW5ub3QpOwotCX0KK3ZvaWQgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25DcmVhdGUoQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CisKKyAgaWYgKHNTdWJUeXBlID09IEJGRlRfU0lHTkFUVVJFKSB7CisgIH0gZWxzZSB7CisgICAgaWYgKG1fcEZvcm1GaWxsZXIpCisgICAgICBtX3BGb3JtRmlsbGVyLT5PbkNyZWF0ZShwQW5ub3QpOworICB9CiB9CiAKLXZvaWQgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25Mb2FkKENQREZTREtfQW5ub3QqIHBBbm5vdCkKLXsKLQlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCQotCUNGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7Ci0JCi0JaWYgKHNTdWJUeXBlID09IEJGRlRfU0lHTkFUVVJFKQotCXsKLQl9Ci0JZWxzZQotCXsKLQkJQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKLQkJaWYgKCFwV2lkZ2V0LT5Jc0FwcGVhcmFuY2VWYWxpZCgpKQotCQkJcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsIEZBTFNFKTsKK3ZvaWQgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25Mb2FkKENQREZTREtfQW5ub3QqIHBBbm5vdCkgeworICBpZiAocEFubm90LT5HZXRTdWJUeXBlKCkgPT0gQkZGVF9TSUdOQVRVUkUpCisgICAgcmV0dXJuOwogCi0JCWludCBuRmllbGRUeXBlID0gcFdpZGdldC0+R2V0RmllbGRUeXBlKCk7Ci0JCWlmIChuRmllbGRUeXBlID09IEZJRUxEVFlQRV9URVhURklFTEQgfHwgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1gpCi0JCXsKLQkJCUZYX0JPT0wgYkZvcm1hdGVkID0gRkFMU0U7Ci0JCQlDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSBwV2lkZ2V0LT5PbkZvcm1hdCgwLCBiRm9ybWF0ZWQpOwotCQkJaWYgKGJGb3JtYXRlZCAmJiBuRmllbGRUeXBlID09IEZJRUxEVFlQRV9DT01CT0JPWCkKLQkJCXsKLQkJCQlwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2Uoc1ZhbHVlLmNfc3RyKCksIEZBTFNFKTsKLQkJCX0KLQkJfQorICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OworICBpZiAoIXBXaWRnZXQtPklzQXBwZWFyYW5jZVZhbGlkKCkpCisgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsIEZBTFNFKTsKIAotCQlpZiAobV9wRm9ybUZpbGxlcikKLQkJCW1fcEZvcm1GaWxsZXItPk9uTG9hZChwQW5ub3QpOwotCX0KKyAgaW50IG5GaWVsZFR5cGUgPSBwV2lkZ2V0LT5HZXRGaWVsZFR5cGUoKTsKKyAgaWYgKG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX1RFWFRGSUVMRCB8fCBuRmllbGRUeXBlID09IEZJRUxEVFlQRV9DT01CT0JPWCkgeworICAgIEZYX0JPT0wgYkZvcm1hdGVkID0gRkFMU0U7CisgICAgQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlID0gcFdpZGdldC0+T25Gb3JtYXQoYkZvcm1hdGVkKTsKKyAgICBpZiAoYkZvcm1hdGVkICYmIG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX0NPTUJPQk9YKSB7CisgICAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2Uoc1ZhbHVlLmNfc3RyKCksIEZBTFNFKTsKKyAgICB9CisgIH0KKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBBbm5vdC0+R2V0UGFnZVZpZXcoKTsKKyAgQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9IHBQYWdlVmlldy0+R2V0U0RLRG9jdW1lbnQoKTsKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IHBTREtEb2MtPkdldFhGQURvY3VtZW50KCk7CisgIGlmIChwRG9jLT5HZXREb2NUeXBlKCkgPT0gRE9DVFlQRV9TVEFUSUNfWEZBKSB7CisgICAgaWYgKCFwV2lkZ2V0LT5Jc0FwcGVhcmFuY2VWYWxpZCgpICYmICFwV2lkZ2V0LT5HZXRWYWx1ZSgpLklzRW1wdHkoKSkKKyAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShGQUxTRSk7CisgIH0KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgaWYgKG1fcEZvcm1GaWxsZXIpCisgICAgbV9wRm9ybUZpbGxlci0+T25Mb2FkKHBBbm5vdCk7CiB9CiAKLUZYX0JPT0wJQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKQotewotCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0JQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKLQkKLQlpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpCi0JewotCX0KLQllbHNlCi0JewotCQlpZiAobV9wRm9ybUZpbGxlcikKLQkJCXJldHVybiBtX3BGb3JtRmlsbGVyLT5PblNldEZvY3VzKHBBbm5vdCxuRmxhZyk7Ci0JfQotCQotCXJldHVybiBUUlVFOworRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPblNldEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgeworICBDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOworCisgIGlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkgeworICB9IGVsc2UgeworICAgIGlmIChtX3BGb3JtRmlsbGVyKQorICAgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uU2V0Rm9jdXMocEFubm90LCBuRmxhZyk7CisgIH0KKworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wJQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykKLXsKLQlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCUNGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7Ci0JCi0JaWYgKHNTdWJUeXBlID09IEJGRlRfU0lHTkFUVVJFKQotCXsKLQl9Ci0JZWxzZQotCXsKLQkJaWYgKG1fcEZvcm1GaWxsZXIpCi0JCQlyZXR1cm4gbV9wRm9ybUZpbGxlci0+T25LaWxsRm9jdXMocEFubm90LG5GbGFnKTsKLQl9Ci0JCi0JcmV0dXJuIFRSVUU7CitGWF9CT09MIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uS2lsbEZvY3VzKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKKworICBpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpIHsKKyAgfSBlbHNlIHsKKyAgICBpZiAobV9wRm9ybUZpbGxlcikKKyAgICAgIHJldHVybiBtX3BGb3JtRmlsbGVyLT5PbktpbGxGb2N1cyhwQW5ub3QsIG5GbGFnKTsKKyAgfQorCisgIHJldHVybiBUUlVFOwogfQogCi1DUERGX1JlY3QgQ1BERlNES19CRkFubm90SGFuZGxlcjo6R2V0Vmlld0JCb3goQ1BERlNES19QYWdlVmlldyAqcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpCi17Ci0JQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQlDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOwotCQotCWlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkKLQl7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChtX3BGb3JtRmlsbGVyKQotCQkJcmV0dXJuIG1fcEZvcm1GaWxsZXItPkdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KTsKK0NQREZfUmVjdCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpHZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIENGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7CiAKLQl9Ci0JCi0JcmV0dXJuIENQREZfUmVjdCgwLDAsMCwwKTsKKyAgaWYgKHNTdWJUeXBlID09IEJGRlRfU0lHTkFUVVJFKSB7CisgIH0gZWxzZSB7CisgICAgaWYgKG1fcEZvcm1GaWxsZXIpCisgICAgICByZXR1cm4gbV9wRm9ybUZpbGxlci0+R2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBwQW5ub3QpOworICB9CisKKyAgcmV0dXJuIENQREZfUmVjdCgwLCAwLCAwLCAwKTsKIH0KIAotRlhfQk9PTAlDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpIaXRUZXN0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLQlBU1NFUlQocFBhZ2VWaWV3KTsKLQlBU1NFUlQocEFubm90KTsKK0ZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6SGl0VGVzdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIEFTU0VSVChwUGFnZVZpZXcpOworICBBU1NFUlQocEFubm90KTsKIAotCUNQREZfUmVjdCByZWN0ID0gR2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBwQW5ub3QpOwotCXJldHVybiByZWN0LkNvbnRhaW5zKHBvaW50LngsIHBvaW50LnkpOworICBDUERGX1JlY3QgcmVjdCA9IEdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KTsKKyAgcmV0dXJuIHJlY3QuQ29udGFpbnMocG9pbnQueCwgcG9pbnQueSk7CiB9CiAKLS8vQ1JlYWRlcl9Bbm5vdEl0ZXJhdG9yRXgKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9Vbmtub3duIDAKKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfQ2xpZW50IDEgICAgIC8vIGFycm93CisjZGVmaW5lIEZXTF9XR1RISVRURVNUX1RpdGxlYmFyIDExICAvLyBjYXB0aW9uCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX0hTY3JvbGxCYXIgMTUKKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfVlNjcm9sbEJhciAxNgorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9Cb3JkZXIgMTcKKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfRWRpdCAxOQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9IeXBlckxpbmsgMjAKIAotQ1BERlNES19Bbm5vdEl0ZXJhdG9yOjpDUERGU0RLX0Fubm90SXRlcmF0b3IoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldyxGWF9CT09MIGJSZXZlcnNlLAotCQkJCQkJCQkJCQkJIEZYX0JPT0wgYklnbm9yZVRvcG1vc3QvKj1GQUxTRSovLAotCQkJCQkJCQkJCQkJIEZYX0JPT0wgYkNpcmNsZS8qPUZBTFNFKi8sCi0JCQkJCQkJCQkJCQkgQ0ZYX1B0ckFycmF5ICpwTGlzdC8qPU5VTEwqLykKLXsKLQlBU1NFUlQocFBhZ2VWaWV3KTsKLQltX2JSZXZlcnNlPWJSZXZlcnNlOwotCW1fYklnbm9yZVRvcG1vc3Q9IGJJZ25vcmVUb3Btb3N0OwotCW1fYkNpcmNsZT1iQ2lyY2xlOwotCW1fcEl0ZXJhdG9yQW5ub3RMaXN0LlJlbW92ZUFsbCgpOwotCUluaXRJdGVyYXRvckFubm90TGlzdChwUGFnZVZpZXcscExpc3QpOworQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6OkNQREZTREtfWEZBQW5ub3RIYW5kbGVyKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApCisgICAgOiBtX3BBcHAocEFwcCkge30KKworQ1BERlNES19Bbm5vdCogQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6Ok5ld0Fubm90KElYRkFfV2lkZ2V0KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2UpIHsKKyAgQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9IG1fcEFwcC0+R2V0U0RLRG9jdW1lbnQoKTsKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKXBTREtEb2MtPkdldEludGVyRm9ybSgpOworICBDUERGU0RLX1hGQVdpZGdldCogcFdpZGdldCA9IG5ldyBDUERGU0RLX1hGQVdpZGdldChwQW5ub3QsIHBQYWdlLCBwSW50ZXJGb3JtKTsKKyAgcEludGVyRm9ybS0+QWRkWEZBTWFwKHBBbm5vdCwgcFdpZGdldCk7CisgIHJldHVybiBwV2lkZ2V0OwogfQogCi1DUERGU0RLX0Fubm90KglDUERGU0RLX0Fubm90SXRlcmF0b3I6Ok5leHRBbm5vdCAoY29uc3QgQ1BERlNES19Bbm5vdCogcEN1cnJlbnQpIAotewotCQotCWludCBpbmRleD0tMTsKLQlpbnQgbkNvdW50PXRoaXMtPm1fcEl0ZXJhdG9yQW5ub3RMaXN0LkdldFNpemUoKTsKLQlpZihwQ3VycmVudCl7Ci0JCWZvcihpbnQgaT0wO2k8bkNvdW50O2krKyl7Ci0JCQlDUERGU0RLX0Fubm90ICogcFJlYWRlckFubm90PSAoQ1BERlNES19Bbm5vdCAqKW1fcEl0ZXJhdG9yQW5ub3RMaXN0LkdldEF0KGkpOwotCQkJaWYocFJlYWRlckFubm90ID09cEN1cnJlbnQpewkJCQotCQkJCWluZGV4PWk7Ci0JCQkJYnJlYWs7Ci0JCQl9CQkJCi0JCX0KLQl9CQotCXJldHVybiBOZXh0QW5ub3QoaW5kZXgpOwotfQotQ1BERlNES19Bbm5vdCoJQ1BERlNES19Bbm5vdEl0ZXJhdG9yOjpQcmV2QW5ub3QgKGNvbnN0IENQREZTREtfQW5ub3QqcEN1cnJlbnQpCi17Ci0JCi0JaW50IGluZGV4PS0xOwotCWludCBuQ291bnQ9dGhpcy0+bV9wSXRlcmF0b3JBbm5vdExpc3QuR2V0U2l6ZSgpOwotCWlmKHBDdXJyZW50KXsKLQkJZm9yKGludCBpPTA7aTxuQ291bnQ7aSsrKXsKLQkJCUNQREZTREtfQW5ub3QgKiBwUmVhZGVyQW5ub3Q9IChDUERGU0RLX0Fubm90KiltX3BJdGVyYXRvckFubm90TGlzdC5HZXRBdChpKTsKLQkJCWlmKHBSZWFkZXJBbm5vdCA9PXBDdXJyZW50KXsJCQkKLQkJCQlpbmRleD1pOwotCQkJCWJyZWFrOwotCQkJfQkJCQotCQl9CQotCX0KLQlyZXR1cm4gUHJldkFubm90KGluZGV4KTsJCi19Ci1DUERGU0RLX0Fubm90KglDUERGU0RLX0Fubm90SXRlcmF0b3I6Ok5leHRBbm5vdCAoaW50JiBpbmRleCkgCi17CQotCQotCWludCBuQ291bnQ9bV9wSXRlcmF0b3JBbm5vdExpc3QuR2V0U2l6ZSgpOwotICAgIGlmKG5Db3VudDw9MCkgaW5kZXg9LTE7Ci0gICAgZWxzZXsKLQkJaWYoaW5kZXg8MCl7Ci0JCQlpbmRleD0wOwkJCi0JCX0KLQkJZWxzZXsJCQotCQkJaWYobV9iQ2lyY2xlKXsJCQkKLQkJCQlpbmRleD0oIGluZGV4IDxuQ291bnQtMSkgPyAoaW5kZXgrMSkgOjA7CQkKLQkJCX0KLQkJCWVsc2V7Ci0JCQkJaW5kZXg9KCBpbmRleCA8bkNvdW50LTEpID8gKGluZGV4KzEpIDotMTsJCQotCQkJfQotCQkJCi0JCX0JCi0JfQotCXJldHVybiAoaW5kZXggPDApID8gTlVMTCA6IChDUERGU0RLX0Fubm90KiltX3BJdGVyYXRvckFubm90TGlzdC5HZXRBdChpbmRleCk7CQkKK0ZYX0JPT0wgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6OkNhbkFuc3dlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpIHsKKyAgcmV0dXJuIHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCkgIT0gTlVMTDsKIH0KIAordm9pZCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25EcmF3KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncykgeworICBBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOworICBBU1NFUlQocEFubm90ICE9IE5VTEwpOwogCi1DUERGU0RLX0Fubm90KglDUERGU0RLX0Fubm90SXRlcmF0b3I6OlByZXZBbm5vdCAoaW50JiBpbmRleCkKLXsKLQkKLQlpbnQgbkNvdW50PW1fcEl0ZXJhdG9yQW5ub3RMaXN0LkdldFNpemUoKTsKLSAgICBpZihuQ291bnQ8PTApIGluZGV4PS0xOwotCWVsc2V7CQotCQlpZihpbmRleDwwKXsKLQkJCWluZGV4PW5Db3VudC0xOwkJIAotCQl9Ci0JCWVsc2V7CQotCQkJaWYobV9iQ2lyY2xlKXsJCQkKLQkJCQlpbmRleCA9ICggaW5kZXggPjApID8gKGluZGV4LTEpIDpuQ291bnQtMTsJCQotCQkJfQotCQkJZWxzZXsKLQkJCQlpbmRleCA9ICggaW5kZXggPjApID8gKGluZGV4LTEpIDotMTsJCi0JCQl9CQkJCQotCQl9Ci0JfQotCXJldHVybiAoaW5kZXggPDApID8gTlVMTCA6IChDUERGU0RLX0Fubm90KiltX3BJdGVyYXRvckFubm90TGlzdC5HZXRBdChpbmRleCk7CQkKKyAgQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9IHBQYWdlVmlldy0+R2V0U0RLRG9jdW1lbnQoKTsKKyAgQVNTRVJUKHBTREtEb2MgIT0gTlVMTCk7CisKKyAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IEdldFhGQVdpZGdldEhhbmRsZXIocEFubm90KTsKKyAgQVNTRVJUKHBXaWRnZXRIYW5kbGVyICE9IE5VTEwpOworCisgIENGWF9HcmFwaGljcyBnczsKKyAgZ3MuQ3JlYXRlKHBEZXZpY2UpOworCisgIENGWF9NYXRyaXggbXQ7CisgIG10ID0gKihDRlhfTWF0cml4KilwVXNlcjJEZXZpY2U7CisKKyAgRlhfQk9PTCBiSXNIaWdobGlnaHQgPSBGQUxTRTsKKyAgaWYgKHBTREtEb2MtPkdldEZvY3VzQW5ub3QoKSAhPSBwQW5ub3QpCisgICAgYklzSGlnaGxpZ2h0ID0gVFJVRTsKKworICBwV2lkZ2V0SGFuZGxlci0+UmVuZGVyV2lkZ2V0KHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCksICZncywgJm10LCBiSXNIaWdobGlnaHQpOworCisgIC8vIHRvIGRvIGhpZ2hsaWdodCBhbmQgc2hhZG93CiB9CiAKK3ZvaWQgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6OlJlbGVhc2VBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpIHsKKyAgQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKIAotQ1BERlNES19Bbm5vdCpDUERGU0RLX0Fubm90SXRlcmF0b3I6Ok5leHQoY29uc3QgQ1BERlNES19Bbm5vdCogcEN1cnJlbnQpIAoteworICBDUERGU0RLX1hGQVdpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1hGQVdpZGdldCopcEFubm90OworICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IHBXaWRnZXQtPkdldEludGVyRm9ybSgpOworICBBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKIAotCXJldHVybiAobV9iUmV2ZXJzZSkgPyBQcmV2QW5ub3QocEN1cnJlbnQpOk5leHRBbm5vdChwQ3VycmVudCk7CQkgCisgIHBJbnRlckZvcm0tPlJlbW92ZVhGQU1hcChwV2lkZ2V0LT5HZXRYRkFXaWRnZXQoKSk7CiAKKyAgZGVsZXRlIHBXaWRnZXQ7CiB9CiAKLUNQREZTREtfQW5ub3QqCUNQREZTREtfQW5ub3RJdGVyYXRvcjo6UHJldihjb25zdCBDUERGU0RLX0Fubm90KiBwQ3VycmVudCkgCi17CitDUERGX1JlY3QgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6OkdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIEFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAKLQlyZXR1cm4gKG1fYlJldmVyc2UpID8gTmV4dEFubm90KHBDdXJyZW50KTpQcmV2QW5ub3QocEN1cnJlbnQpOwkJIAorICBJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gR2V0WEZBV2lkZ2V0SGFuZGxlcihwQW5ub3QpOworICBBU1NFUlQocFdpZGdldEhhbmRsZXIgIT0gTlVMTCk7CisKKyAgQ0ZYX1JlY3RGIHJjQkJveDsKKyAgWEZBX0VMRU1FTlQgZVR5cGUgPQorICAgICAgcFdpZGdldEhhbmRsZXItPkdldERhdGFBY2MocEFubm90LT5HZXRYRkFXaWRnZXQoKSktPkdldFVJVHlwZSgpOworICBpZiAoZVR5cGUgPT0gWEZBX0VMRU1FTlRfU2lnbmF0dXJlKQorICAgIHBXaWRnZXRIYW5kbGVyLT5HZXRCQm94KHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCksIHJjQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfV0lER0VUU1RBVFVTX1Zpc2libGUsIFRSVUUpOworICBlbHNlCisgICAgcFdpZGdldEhhbmRsZXItPkdldEJCb3gocEFubm90LT5HZXRYRkFXaWRnZXQoKSwgcmNCQm94LCAwKTsKKworICBDRlhfRmxvYXRSZWN0IHJjV2lkZ2V0KHJjQkJveC5sZWZ0LCByY0JCb3gudG9wLCByY0JCb3gubGVmdCArIHJjQkJveC53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICByY0JCb3gudG9wICsgcmNCQm94LmhlaWdodCk7CisgIHJjV2lkZ2V0LmxlZnQgLT0gMS4wZjsKKyAgcmNXaWRnZXQucmlnaHQgKz0gMS4wZjsKKyAgcmNXaWRnZXQuYm90dG9tIC09IDEuMGY7CisgIHJjV2lkZ2V0LnRvcCArPSAxLjBmOworCisgIHJldHVybiByY1dpZGdldDsKIH0KIAotQ1BERlNES19Bbm5vdCpDUERGU0RLX0Fubm90SXRlcmF0b3I6Ok5leHQoaW50JiBpbmRleCApCi17Ci0JCi0JcmV0dXJuIChtX2JSZXZlcnNlKSA/IFByZXZBbm5vdChpbmRleCk6TmV4dEFubm90KGluZGV4KTsJCSAKLQkKK0ZYX0JPT0wgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6OkhpdFRlc3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIGlmICghcFBhZ2VWaWV3IHx8ICFwQW5ub3QpCisgICAgcmV0dXJuIEZBTFNFOworCisgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBwUGFnZVZpZXctPkdldFNES0RvY3VtZW50KCk7CisgIGlmICghcFNES0RvYykKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IHBTREtEb2MtPkdldFhGQURvY3VtZW50KCk7CisgIGlmICghcERvYykKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgSVhGQV9Eb2NWaWV3KiBwRG9jVmlldyA9IHBEb2MtPkdldFhGQURvY1ZpZXcoKTsKKyAgaWYgKCFwRG9jVmlldykKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IHBEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCk7CisgIGlmICghcFdpZGdldEhhbmRsZXIpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEZYX0RXT1JEIGR3SGl0VGVzdCA9CisgICAgICBwV2lkZ2V0SGFuZGxlci0+T25IaXRUZXN0KHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCksIHBvaW50LngsIHBvaW50LnkpOworICByZXR1cm4gKGR3SGl0VGVzdCAhPSBGV0xfV0dUSElUVEVTVF9Vbmtub3duKTsKIH0KIAotQ1BERlNES19Bbm5vdCoJQ1BERlNES19Bbm5vdEl0ZXJhdG9yOjpQcmV2KGludCYgaW5kZXggKQotewotCQotCXJldHVybiAobV9iUmV2ZXJzZSkgPyBOZXh0QW5ub3QoaW5kZXgpOlByZXZBbm5vdChpbmRleCk7CQkgCit2b2lkIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpPbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgeworICBpZiAoIXBQYWdlVmlldyB8fCAhcEFubm90KQorICAgIHJldHVybjsKKyAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IEdldFhGQVdpZGdldEhhbmRsZXIocEFubm90KTsKKyAgQVNTRVJUKHBXaWRnZXRIYW5kbGVyICE9IE5VTEwpOworCisgIHBXaWRnZXRIYW5kbGVyLT5Pbk1vdXNlRW50ZXIocEFubm90LT5HZXRYRkFXaWRnZXQoKSk7CiB9CiAKK3ZvaWQgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6Ok9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSB7CisgIGlmICghcFBhZ2VWaWV3IHx8ICFwQW5ub3QpCisgICAgcmV0dXJuOwogCi12b2lkIENQREZTREtfQW5ub3RJdGVyYXRvcjo6SW5zZXJ0U29ydChDRlhfUHRyQXJyYXkgJmFycmF5TGlzdCwgQUlfQ09NUEFSRSBwQ29tcGFyZSkKLXsKLQlmb3IgKGludCBpID0gMTsgaSA8IGFycmF5TGlzdC5HZXRTaXplKCk7IGkrKykKLQl7Ci0JCWlmIChwQ29tcGFyZSgoQ1BERlNES19Bbm5vdCopKGFycmF5TGlzdFtpXSkgLCAoQ1BERlNES19Bbm5vdCopKGFycmF5TGlzdFtpLTFdKSkgPCAwKQotCQl7Ci0JCQlpbnQgaiA9IGktMTsKLQkJCUNQREZTREtfQW5ub3QqIHBUZW1wID0gKENQREZTREtfQW5ub3QqKWFycmF5TGlzdFtpXTsKLQkJCQotCQkJZG8KLQkJCXsKLQkJCQlhcnJheUxpc3RbaiArIDFdID0gYXJyYXlMaXN0W2pdOwotCQkJfSB3aGlsZSAoLS1qID49IDAgJiYgcENvbXBhcmUocFRlbXAsIChDUERGU0RLX0Fubm90KilhcnJheUxpc3Rbal0pIDwgMCk7CisgIElYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKHBBbm5vdCk7CisgIEFTU0VSVChwV2lkZ2V0SGFuZGxlciAhPSBOVUxMKTsKIAotCQkJYXJyYXlMaXN0W2orMV0gPSBwVGVtcDsKLQkJfQotCX0KKyAgcFdpZGdldEhhbmRsZXItPk9uTW91c2VFeGl0KHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCkpOwogfQogCi1pbnQgTHlPcmRlckNvbXBhcmUoQ1BERlNES19Bbm5vdCogcDEsIENQREZTREtfQW5ub3QqIHAyKQotewotCWlmKHAxLT5HZXRMYXlvdXRPcmRlcigpIDwgcDItPkdldExheW91dE9yZGVyKCkpCi0JCXJldHVybiAtMTsKLQllbHNlIGlmIChwMS0+R2V0TGF5b3V0T3JkZXIoKSA9PSBwMi0+R2V0TGF5b3V0T3JkZXIoKSkKLQkJcmV0dXJuIDA7Ci0JZWxzZQotCQlyZXR1cm4gMTsKK0ZYX0JPT0wgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6Ok9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgaWYgKCFwUGFnZVZpZXcgfHwgIXBBbm5vdCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IEdldFhGQVdpZGdldEhhbmRsZXIocEFubm90KTsKKyAgQVNTRVJUKHBXaWRnZXRIYW5kbGVyICE9IE5VTEwpOworCisgIEZYX0JPT0wgYlJldCA9IEZBTFNFOworICBiUmV0ID0gcFdpZGdldEhhbmRsZXItPk9uTEJ1dHRvbkRvd24ocEFubm90LT5HZXRYRkFXaWRnZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEZXTEZsYWdzKG5GbGFncyksIHBvaW50LngsIHBvaW50LnkpOworCisgIHJldHVybiBiUmV0OwogfQogCi1GWF9CT09MIENQREZTREtfQW5ub3RJdGVyYXRvcjo6SW5pdEl0ZXJhdG9yQW5ub3RMaXN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyxDRlhfUHRyQXJyYXkgKiBwQW5ub3RMaXN0KQotewotCUFTU0VSVChwUGFnZVZpZXcpOwotCQotCQorRlhfQk9PTCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgaWYgKCFwUGFnZVZpZXcgfHwgIXBBbm5vdCkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlpZihwQW5ub3RMaXN0PT1OVUxMKXsJCi0JCXBBbm5vdExpc3Q9cFBhZ2VWaWV3LT5HZXRBbm5vdExpc3QoKTsKLQl9CisgIElYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKHBBbm5vdCk7CisgIEFTU0VSVChwV2lkZ2V0SGFuZGxlciAhPSBOVUxMKTsKIAotCXRoaXMtPm1fcEl0ZXJhdG9yQW5ub3RMaXN0LlJlbW92ZUFsbCgpOwotCWlmKCFwQW5ub3RMaXN0KSByZXR1cm4gRkFMU0U7CisgIEZYX0JPT0wgYlJldCA9IEZBTFNFOworICBiUmV0ID0gcFdpZGdldEhhbmRsZXItPk9uTEJ1dHRvblVwKHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0RldMRmxhZ3MobkZsYWdzKSwgcG9pbnQueCwgcG9pbnQueSk7CiAKLQlDUERGU0RLX0Fubm90ICogcFRvcE1vc3RBbm5vdD0gKG1fYklnbm9yZVRvcG1vc3QpID8gTlVMTCA6IHBQYWdlVmlldy0+R2V0Rm9jdXNBbm5vdCgpOwotCi0KLQlpbnQgbkNvdW50ID1wQW5ub3RMaXN0LT5HZXRTaXplKCk7Ci0KLQlmb3IoaW50IGkgPSBuQ291bnQtIDEgO2kgPj0gMDtpLS0pCi0JewotCQlDUERGU0RLX0Fubm90ICogcFJlYWRlckFubm90PSAoQ1BERlNES19Bbm5vdCopcEFubm90TGlzdC0+R2V0QXQoaSk7Ci0JCW1fcEl0ZXJhdG9yQW5ub3RMaXN0LkFkZChwUmVhZGVyQW5ub3QpOwkKLQl9Ci0KLQlJbnNlcnRTb3J0KG1fcEl0ZXJhdG9yQW5ub3RMaXN0LCZMeU9yZGVyQ29tcGFyZSk7Ci0KLQlpZihwVG9wTW9zdEFubm90KQotCXsKLQkJZm9yKGludCBpPTAgO2k8bkNvdW50O2krKykKLQkJewotCQkJQ1BERlNES19Bbm5vdCAqIHBSZWFkZXJBbm5vdCA9IChDUERGU0RLX0Fubm90KiltX3BJdGVyYXRvckFubm90TGlzdC5HZXRBdChpKTsKLQkJCWlmKHBSZWFkZXJBbm5vdCA9PSBwVG9wTW9zdEFubm90KQotCQkJewotCQkJCW1fcEl0ZXJhdG9yQW5ub3RMaXN0LlJlbW92ZUF0KGkpOwotCQkJCW1fcEl0ZXJhdG9yQW5ub3RMaXN0Lkluc2VydEF0KDAsIHBSZWFkZXJBbm5vdCk7Ci0JCQkJYnJlYWs7Ci0JCQl9CQotCQl9Ci0JfQotCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBiUmV0OwogfQogCitGWF9CT09MIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpPbkxCdXR0b25EYmxDbGsoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgaWYgKCFwUGFnZVZpZXcgfHwgIXBBbm5vdCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IEdldFhGQVdpZGdldEhhbmRsZXIocEFubm90KTsKKyAgQVNTRVJUKHBXaWRnZXRIYW5kbGVyICE9IE5VTEwpOworCisgIEZYX0JPT0wgYlJldCA9IEZBTFNFOworICBiUmV0ID0gcFdpZGdldEhhbmRsZXItPk9uTEJ1dHRvbkRibENsayhwQW5ub3QtPkdldFhGQVdpZGdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRGV0xGbGFncyhuRmxhZ3MpLCBwb2ludC54LCBwb2ludC55KTsKKworICByZXR1cm4gYlJldDsKK30KKworRlhfQk9PTCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgaWYgKCFwUGFnZVZpZXcgfHwgIXBBbm5vdCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IEdldFhGQVdpZGdldEhhbmRsZXIocEFubm90KTsKKyAgQVNTRVJUKHBXaWRnZXRIYW5kbGVyICE9IE5VTEwpOworCisgIEZYX0JPT0wgYlJldCA9IEZBTFNFOworICBiUmV0ID0gcFdpZGdldEhhbmRsZXItPk9uTW91c2VNb3ZlKHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0RldMRmxhZ3MobkZsYWdzKSwgcG9pbnQueCwgcG9pbnQueSk7CisKKyAgcmV0dXJuIGJSZXQ7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6Ok9uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCB6RGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgaWYgKCFwUGFnZVZpZXcgfHwgIXBBbm5vdCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IEdldFhGQVdpZGdldEhhbmRsZXIocEFubm90KTsKKyAgQVNTRVJUKHBXaWRnZXRIYW5kbGVyICE9IE5VTEwpOworCisgIEZYX0JPT0wgYlJldCA9IEZBTFNFOworICBiUmV0ID0gcFdpZGdldEhhbmRsZXItPk9uTW91c2VXaGVlbCgKKyAgICAgIHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCksIEdldEZXTEZsYWdzKG5GbGFncyksIHpEZWx0YSwgcG9pbnQueCwgcG9pbnQueSk7CisKKyAgcmV0dXJuIGJSZXQ7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6Ok9uUkJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgaWYgKCFwUGFnZVZpZXcgfHwgIXBBbm5vdCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IEdldFhGQVdpZGdldEhhbmRsZXIocEFubm90KTsKKyAgQVNTRVJUKHBXaWRnZXRIYW5kbGVyICE9IE5VTEwpOworCisgIEZYX0JPT0wgYlJldCA9IEZBTFNFOworICBiUmV0ID0gcFdpZGdldEhhbmRsZXItPk9uUkJ1dHRvbkRvd24ocEFubm90LT5HZXRYRkFXaWRnZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEZXTEZsYWdzKG5GbGFncyksIHBvaW50LngsIHBvaW50LnkpOworCisgIHJldHVybiBiUmV0OworfQorCitGWF9CT09MIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBpZiAoIXBQYWdlVmlldyB8fCAhcEFubm90KQorICAgIHJldHVybiBGQUxTRTsKKworICBJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gR2V0WEZBV2lkZ2V0SGFuZGxlcihwQW5ub3QpOworICBBU1NFUlQocFdpZGdldEhhbmRsZXIgIT0gTlVMTCk7CisKKyAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7CisgIGJSZXQgPSBwV2lkZ2V0SGFuZGxlci0+T25SQnV0dG9uVXAocEFubm90LT5HZXRYRkFXaWRnZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRGV0xGbGFncyhuRmxhZ3MpLCBwb2ludC54LCBwb2ludC55KTsKKworICByZXR1cm4gYlJldDsKK30KKworRlhfQk9PTCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25SQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIGlmICghcFBhZ2VWaWV3IHx8ICFwQW5ub3QpCisgICAgcmV0dXJuIEZBTFNFOworCisgIElYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKHBBbm5vdCk7CisgIEFTU0VSVChwV2lkZ2V0SGFuZGxlciAhPSBOVUxMKTsKKworICBGWF9CT09MIGJSZXQgPSBGQUxTRTsKKyAgYlJldCA9IHBXaWRnZXRIYW5kbGVyLT5PblJCdXR0b25EYmxDbGsocEFubm90LT5HZXRYRkFXaWRnZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0RldMRmxhZ3MobkZsYWdzKSwgcG9pbnQueCwgcG9pbnQueSk7CisKKyAgcmV0dXJuIGJSZXQ7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWdzKSB7CisgIGlmICghcEFubm90KQorICAgIHJldHVybiBGQUxTRTsKKworICBJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gR2V0WEZBV2lkZ2V0SGFuZGxlcihwQW5ub3QpOworICBBU1NFUlQocFdpZGdldEhhbmRsZXIgIT0gTlVMTCk7CisKKyAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7CisgIGJSZXQgPSBwV2lkZ2V0SGFuZGxlci0+T25DaGFyKHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCksIG5DaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRGV0xGbGFncyhuRmxhZ3MpKTsKKworICByZXR1cm4gYlJldDsKK30KKworRlhfQk9PTCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25LZXlEb3duKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbktleUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5GbGFnKSB7CisgIGlmICghcEFubm90KQorICAgIHJldHVybiBGQUxTRTsKKworICBJWEZBX1dpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gR2V0WEZBV2lkZ2V0SGFuZGxlcihwQW5ub3QpOworICBBU1NFUlQocFdpZGdldEhhbmRsZXIgIT0gTlVMTCk7CisKKyAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7CisgIGJSZXQgPSBwV2lkZ2V0SGFuZGxlci0+T25LZXlEb3duKHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCksIG5LZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRGV0xGbGFncyhuRmxhZykpOworCisgIHJldHVybiBiUmV0OworfQorCitGWF9CT09MIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpPbktleVVwKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5LZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZsYWcpIHsKKyAgaWYgKCFwQW5ub3QpCisgICAgcmV0dXJuIEZBTFNFOworCisgIElYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKHBBbm5vdCk7CisgIEFTU0VSVChwV2lkZ2V0SGFuZGxlciAhPSBOVUxMKTsKKworICBGWF9CT09MIGJSZXQgPSBGQUxTRTsKKyAgYlJldCA9IHBXaWRnZXRIYW5kbGVyLT5PbktleVVwKHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCksIG5LZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0RldMRmxhZ3MobkZsYWcpKTsKKworICByZXR1cm4gYlJldDsKK30KKworRlhfQk9PTCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25TZXRGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSB7CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIENQREZTREtfWEZBQW5ub3RIYW5kbGVyOjpPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgeworICByZXR1cm4gVFJVRTsKK30KKworRlhfQk9PTCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6T25YRkFDaGFuZ2VkRm9jdXMoQ1BERlNES19Bbm5vdCogcE9sZEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcE5ld0Fubm90KSB7CisgIElYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBOVUxMOworCisgIGlmIChwT2xkQW5ub3QpCisgICAgcFdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKHBPbGRBbm5vdCk7CisgIGVsc2UgaWYgKHBOZXdBbm5vdCkKKyAgICBwV2lkZ2V0SGFuZGxlciA9IEdldFhGQVdpZGdldEhhbmRsZXIocE5ld0Fubm90KTsKKworICBpZiAocFdpZGdldEhhbmRsZXIpIHsKKyAgICBGWF9CT09MIGJSZXQgPSBUUlVFOworICAgIElYRkFfV2lkZ2V0KiBoV2lkZ2V0ID0gcE5ld0Fubm90ID8gcE5ld0Fubm90LT5HZXRYRkFXaWRnZXQoKSA6IE5VTEw7CisgICAgaWYgKGhXaWRnZXQpIHsKKyAgICAgIElYRkFfUGFnZVZpZXcqIHBYRkFQYWdlVmlldyA9IHBXaWRnZXRIYW5kbGVyLT5HZXRQYWdlVmlldyhoV2lkZ2V0KTsKKyAgICAgIGlmIChwWEZBUGFnZVZpZXcpIHsKKyAgICAgICAgYlJldCA9IHBYRkFQYWdlVmlldy0+R2V0RG9jVmlldygpLT5TZXRGb2N1cyhoV2lkZ2V0KTsKKyAgICAgICAgaWYgKHBYRkFQYWdlVmlldy0+R2V0RG9jVmlldygpLT5HZXRGb2N1c1dpZGdldCgpID09IGhXaWRnZXQpCisgICAgICAgICAgYlJldCA9IFRSVUU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBiUmV0OworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0lYRkFfV2lkZ2V0SGFuZGxlciogQ1BERlNES19YRkFBbm5vdEhhbmRsZXI6OkdldFhGQVdpZGdldEhhbmRsZXIoCisgICAgQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIGlmICghcEFubm90KQorICAgIHJldHVybiBOVUxMOworCisgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBBbm5vdC0+R2V0UGFnZVZpZXcoKTsKKyAgaWYgKCFwUGFnZVZpZXcpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9IHBQYWdlVmlldy0+R2V0U0RLRG9jdW1lbnQoKTsKKyAgaWYgKCFwU0RLRG9jKQorICAgIHJldHVybiBOVUxMOworCisgIENQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSBwU0RLRG9jLT5HZXRYRkFEb2N1bWVudCgpOworICBpZiAoIXBEb2MpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgSVhGQV9Eb2NWaWV3KiBwRG9jVmlldyA9IHBEb2MtPkdldFhGQURvY1ZpZXcoKTsKKyAgaWYgKCFwRG9jVmlldykKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gcERvY1ZpZXctPkdldFdpZGdldEhhbmRsZXIoKTsKK30KKworI2RlZmluZSBGV0xfS0VZRkxBR19DdHJsICgxIDw8IDApCisjZGVmaW5lIEZXTF9LRVlGTEFHX0FsdCAoMSA8PCAxKQorI2RlZmluZSBGV0xfS0VZRkxBR19TaGlmdCAoMSA8PCAyKQorI2RlZmluZSBGV0xfS0VZRkxBR19MQnV0dG9uICgxIDw8IDMpCisjZGVmaW5lIEZXTF9LRVlGTEFHX1JCdXR0b24gKDEgPDwgNCkKKyNkZWZpbmUgRldMX0tFWUZMQUdfTUJ1dHRvbiAoMSA8PCA1KQorCitGWF9EV09SRCBDUERGU0RLX1hGQUFubm90SGFuZGxlcjo6R2V0RldMRmxhZ3MoRlhfRFdPUkQgZHdGbGFnKSB7CisgIEZYX0RXT1JEIGR3RldMRmxhZyA9IDA7CisKKyAgaWYgKGR3RmxhZyAmIEZXTF9FVkVOVEZMQUdfQ29udHJvbEtleSkKKyAgICBkd0ZXTEZsYWcgfD0gRldMX0tFWUZMQUdfQ3RybDsKKyAgaWYgKGR3RmxhZyAmIEZXTF9FVkVOVEZMQUdfTGVmdEJ1dHRvbkRvd24pCisgICAgZHdGV0xGbGFnIHw9IEZXTF9LRVlGTEFHX0xCdXR0b247CisgIGlmIChkd0ZsYWcgJiBGV0xfRVZFTlRGTEFHX01pZGRsZUJ1dHRvbkRvd24pCisgICAgZHdGV0xGbGFnIHw9IEZXTF9LRVlGTEFHX01CdXR0b247CisgIGlmIChkd0ZsYWcgJiBGV0xfRVZFTlRGTEFHX1JpZ2h0QnV0dG9uRG93bikKKyAgICBkd0ZXTEZsYWcgfD0gRldMX0tFWUZMQUdfUkJ1dHRvbjsKKyAgaWYgKGR3RmxhZyAmIEZXTF9FVkVOVEZMQUdfU2hpZnRLZXkpCisgICAgZHdGV0xGbGFnIHw9IEZXTF9LRVlGTEFHX1NoaWZ0OworICBpZiAoZHdGbGFnICYgRldMX0VWRU5URkxBR19BbHRLZXkpCisgICAgZHdGV0xGbGFnIHw9IEZXTF9LRVlGTEFHX0FsdDsKKworICByZXR1cm4gZHdGV0xGbGFnOworfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCitDUERGU0RLX0Fubm90SXRlcmF0b3I6OkNQREZTREtfQW5ub3RJdGVyYXRvcihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSZXZlcnNlKQorICAgIDogbV9iUmV2ZXJzZShiUmV2ZXJzZSksIG1fcG9zKDApIHsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Q1BERlNES19Bbm5vdCo+JiBhbm5vdHMgPSBwUGFnZVZpZXctPkdldEFubm90TGlzdCgpOworICBtX2l0ZXJhdG9yQW5ub3RMaXN0Lmluc2VydChtX2l0ZXJhdG9yQW5ub3RMaXN0LmJlZ2luKCksIGFubm90cy5yYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RzLnJlbmQoKSk7CisgIHN0ZDo6c3RhYmxlX3NvcnQobV9pdGVyYXRvckFubm90TGlzdC5iZWdpbigpLCBtX2l0ZXJhdG9yQW5ub3RMaXN0LmVuZCgpLAorICAgICAgICAgICAgICAgICAgIFtdKENQREZTREtfQW5ub3QqIHAxLCBDUERGU0RLX0Fubm90KiBwMikgeworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAxLT5HZXRMYXlvdXRPcmRlcigpIDwgcDItPkdldExheW91dE9yZGVyKCk7CisgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgQ1BERlNES19Bbm5vdCogcFRvcE1vc3RBbm5vdCA9IHBQYWdlVmlldy0+R2V0Rm9jdXNBbm5vdCgpOworICBpZiAoIXBUb3BNb3N0QW5ub3QpCisgICAgcmV0dXJuOworCisgIGF1dG8gaXQgPSBzdGQ6OmZpbmQobV9pdGVyYXRvckFubm90TGlzdC5iZWdpbigpLCBtX2l0ZXJhdG9yQW5ub3RMaXN0LmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgIHBUb3BNb3N0QW5ub3QpOworICBpZiAoaXQgIT0gbV9pdGVyYXRvckFubm90TGlzdC5lbmQoKSkgeworICAgIENQREZTREtfQW5ub3QqIHBSZWFkZXJBbm5vdCA9ICppdDsKKyAgICBtX2l0ZXJhdG9yQW5ub3RMaXN0LmVyYXNlKGl0KTsKKyAgICBtX2l0ZXJhdG9yQW5ub3RMaXN0Lmluc2VydChtX2l0ZXJhdG9yQW5ub3RMaXN0LmJlZ2luKCksIHBSZWFkZXJBbm5vdCk7CisgIH0KK30KKworQ1BERlNES19Bbm5vdEl0ZXJhdG9yOjp+Q1BERlNES19Bbm5vdEl0ZXJhdG9yKCkgeworfQorCitDUERGU0RLX0Fubm90KiBDUERGU0RLX0Fubm90SXRlcmF0b3I6Ok5leHRBbm5vdCgpIHsKKyAgaWYgKG1fcG9zIDwgbV9pdGVyYXRvckFubm90TGlzdC5zaXplKCkpCisgICAgcmV0dXJuIG1faXRlcmF0b3JBbm5vdExpc3RbbV9wb3MrK107CisgIHJldHVybiBudWxscHRyOworfQorCitDUERGU0RLX0Fubm90KiBDUERGU0RLX0Fubm90SXRlcmF0b3I6OlByZXZBbm5vdCgpIHsKKyAgaWYgKG1fcG9zIDwgbV9pdGVyYXRvckFubm90TGlzdC5zaXplKCkpCisgICAgcmV0dXJuIG1faXRlcmF0b3JBbm5vdExpc3RbbV9pdGVyYXRvckFubm90TGlzdC5zaXplKCkgLSArK21fcG9zXTsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK0NQREZTREtfQW5ub3QqIENQREZTREtfQW5ub3RJdGVyYXRvcjo6TmV4dCgpIHsKKyAgcmV0dXJuIG1fYlJldmVyc2UgPyBQcmV2QW5ub3QoKSA6IE5leHRBbm5vdCgpOworfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnNka19iYXNlYW5ub3QuY3BwIGIvZnBkZnNkay9zcmMvZnNka19iYXNlYW5ub3QuY3BwCmluZGV4IDJhYzZkMGQuLjMwZTcwMjIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZzZGtfYmFzZWFubm90LmNwcAorKysgYi9mcGRmc2RrL3NyYy9mc2RrX2Jhc2Vhbm5vdC5jcHAKQEAgLTEsMTE2MyArMSw5OTIgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnNka19kZWZpbmUuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2ZzZGtfbWdyLmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX2Jhc2Vhbm5vdC5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KIAorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9leHQuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnNka19iYXNlYW5ub3QuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnNka19kZWZpbmUuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnNka19tZ3IuaCIKIAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCQkJCQkJCQlDUERGU0RLX0RhdGVUaW1lCQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludCBfZ0FmeEdldFRpbWVab25lSW5TZWNvbmRzKEZYX0NIQVIgdHpob3VyLCBGWF9CWVRFIHR6bWludXRlKQotewotCXJldHVybiAoaW50KXR6aG91ciAqIDM2MDAgKyAoaW50KXR6bWludXRlICogKHR6aG91ciA+PSAwID8gNjAgOiAtNjApOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9kb2MuaCIKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworaW50IF9nQWZ4R2V0VGltZVpvbmVJblNlY29uZHMoRlhfQ0hBUiB0emhvdXIsIHVpbnQ4X3QgdHptaW51dGUpIHsKKyAgcmV0dXJuIChpbnQpdHpob3VyICogMzYwMCArIChpbnQpdHptaW51dGUgKiAodHpob3VyID49IDAgPyA2MCA6IC02MCk7CiB9CiAKLUZYX0JPT0wgX2dBZnhJc0xlYXBZZWFyKEZYX1NIT1JUIHllYXIpCi17Ci0JcmV0dXJuICgoeWVhciAlIDQwMCA9PSAwKSB8fCAoKHllYXIgJSA0ID09IDApICYmICh5ZWFyICUgMTAwICE9IDApKSk7CitGWF9CT09MIF9nQWZ4SXNMZWFwWWVhcihpbnQxNl90IHllYXIpIHsKKyAgcmV0dXJuICgoeWVhciAlIDQwMCA9PSAwKSB8fCAoKHllYXIgJSA0ID09IDApICYmICh5ZWFyICUgMTAwICE9IDApKSk7CiB9CiAKLUZYX1dPUkQgX2dBZnhHZXRZZWFyRGF5cyhGWF9TSE9SVCB5ZWFyKQotewotCXJldHVybiAoX2dBZnhJc0xlYXBZZWFyKHllYXIpID09IFRSVUUgPyAzNjYgOiAzNjUpOworRlhfV09SRCBfZ0FmeEdldFllYXJEYXlzKGludDE2X3QgeWVhcikgeworICByZXR1cm4gKF9nQWZ4SXNMZWFwWWVhcih5ZWFyKSA9PSBUUlVFID8gMzY2IDogMzY1KTsKIH0KIAotRlhfQllURSBfZ0FmeEdldE1vbnRoRGF5cyhGWF9TSE9SVCB5ZWFyLCBGWF9CWVRFIG1vbnRoKQotewotCUZYX0JZVEUJbURheXM7Ci0Jc3dpdGNoIChtb250aCkKLQl7Ci0JY2FzZSAxOgotCWNhc2UgMzoKLQljYXNlIDU6Ci0JY2FzZSA3OgotCWNhc2UgODoKLQljYXNlIDEwOgotCWNhc2UgMTI6Ci0JCW1EYXlzID0gMzE7Ci0JCWJyZWFrOwordWludDhfdCBfZ0FmeEdldE1vbnRoRGF5cyhpbnQxNl90IHllYXIsIHVpbnQ4X3QgbW9udGgpIHsKKyAgdWludDhfdCBtRGF5czsKKyAgc3dpdGNoIChtb250aCkgeworICAgIGNhc2UgMToKKyAgICBjYXNlIDM6CisgICAgY2FzZSA1OgorICAgIGNhc2UgNzoKKyAgICBjYXNlIDg6CisgICAgY2FzZSAxMDoKKyAgICBjYXNlIDEyOgorICAgICAgbURheXMgPSAzMTsKKyAgICAgIGJyZWFrOwogCi0JY2FzZSA0OgotCWNhc2UgNjoKLQljYXNlIDk6Ci0JY2FzZSAxMToKLQkJbURheXMgPSAzMDsKLQkJYnJlYWs7CisgICAgY2FzZSA0OgorICAgIGNhc2UgNjoKKyAgICBjYXNlIDk6CisgICAgY2FzZSAxMToKKyAgICAgIG1EYXlzID0gMzA7CisgICAgICBicmVhazsKIAotCWNhc2UgMjoKLQkJaWYgKF9nQWZ4SXNMZWFwWWVhcih5ZWFyKSA9PSBUUlVFKQotCQkJbURheXMgPSAyOTsKLQkJZWxzZQotCQkJbURheXMgPSAyODsKLQkJYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgaWYgKF9nQWZ4SXNMZWFwWWVhcih5ZWFyKSA9PSBUUlVFKQorICAgICAgICBtRGF5cyA9IDI5OworICAgICAgZWxzZQorICAgICAgICBtRGF5cyA9IDI4OworICAgICAgYnJlYWs7CiAKLQlkZWZhdWx0OgotCQltRGF5cyA9IDA7Ci0JCWJyZWFrOwotCX0KKyAgICBkZWZhdWx0OgorICAgICAgbURheXMgPSAwOworICAgICAgYnJlYWs7CisgIH0KIAotCXJldHVybiBtRGF5czsKKyAgcmV0dXJuIG1EYXlzOwogfQogCi1DUERGU0RLX0RhdGVUaW1lOjpDUERGU0RLX0RhdGVUaW1lKCkKLXsKLQlSZXNldERhdGVUaW1lKCk7CitDUERGU0RLX0RhdGVUaW1lOjpDUERGU0RLX0RhdGVUaW1lKCkgeworICBSZXNldERhdGVUaW1lKCk7CiB9CiAKLUNQREZTREtfRGF0ZVRpbWU6OkNQREZTREtfRGF0ZVRpbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGR0U3RyKQotewotCVJlc2V0RGF0ZVRpbWUoKTsKK0NQREZTREtfRGF0ZVRpbWU6OkNQREZTREtfRGF0ZVRpbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGR0U3RyKSB7CisgIFJlc2V0RGF0ZVRpbWUoKTsKIAotCUZyb21QREZEYXRlVGltZVN0cmluZyhkdFN0cik7CisgIEZyb21QREZEYXRlVGltZVN0cmluZyhkdFN0cik7CiB9CiAKLUNQREZTREtfRGF0ZVRpbWU6OkNQREZTREtfRGF0ZVRpbWUoY29uc3QgQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpCi17Ci0Jb3BlcmF0b3IgPSAoZGF0ZXRpbWUpOworQ1BERlNES19EYXRlVGltZTo6Q1BERlNES19EYXRlVGltZShjb25zdCBDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSkgeworICBvcGVyYXRvcj0oZGF0ZXRpbWUpOwogfQogCi1DUERGU0RLX0RhdGVUaW1lOjpDUERGU0RLX0RhdGVUaW1lKGNvbnN0IEZYX1NZU1RFTVRJTUUmIHN0KQotewotCW9wZXJhdG9yID0gKHN0KSA7CitDUERGU0RLX0RhdGVUaW1lOjpDUERGU0RLX0RhdGVUaW1lKGNvbnN0IEZYX1NZU1RFTVRJTUUmIHN0KSB7CisgIG9wZXJhdG9yPShzdCk7CiB9CiAKK3ZvaWQgQ1BERlNES19EYXRlVGltZTo6UmVzZXREYXRlVGltZSgpIHsKKyAgdHpzZXQoKTsKIAotdm9pZCBDUERGU0RLX0RhdGVUaW1lOjpSZXNldERhdGVUaW1lKCkKLXsKLQl0enNldCgpOworICB0aW1lX3QgY3VyVGltZTsKKyAgdGltZSgmY3VyVGltZSk7CisgIHN0cnVjdCB0bSogbmV3dGltZTsKKyAgLy8gbmV3dGltZSA9IGdtdGltZSgmY3VyVGltZSk7CisgIG5ld3RpbWUgPSBsb2NhbHRpbWUoJmN1clRpbWUpOwogCi0JdGltZV90CWN1clRpbWU7Ci0JdGltZSgmY3VyVGltZSk7Ci0Jc3RydWN0IHRtKiBuZXd0aW1lOwotCS8vbmV3dGltZSA9IGdtdGltZSgmY3VyVGltZSk7Ci0JbmV3dGltZSA9IGxvY2FsdGltZSgmY3VyVGltZSk7Ci0KLQlkdC55ZWFyID0gbmV3dGltZS0+dG1feWVhciArIDE5MDA7Ci0JZHQubW9udGggPSBuZXd0aW1lLT50bV9tb24gKyAxOwotCWR0LmRheSA9IG5ld3RpbWUtPnRtX21kYXk7Ci0JZHQuaG91ciA9IG5ld3RpbWUtPnRtX2hvdXI7Ci0JZHQubWludXRlID0gbmV3dGltZS0+dG1fbWluOwotCWR0LnNlY29uZCA9IG5ld3RpbWUtPnRtX3NlYzsKLS8vIAlkdC50ekhvdXIgPSBfdGltZXpvbmUgLyAzNjAwICogLTE7Ci0vLyAJZHQudHpNaW51dGUgPSAoYWJzKF90aW1lem9uZSkgJSAzNjAwKSAvIDYwOworICBkdC55ZWFyID0gbmV3dGltZS0+dG1feWVhciArIDE5MDA7CisgIGR0Lm1vbnRoID0gbmV3dGltZS0+dG1fbW9uICsgMTsKKyAgZHQuZGF5ID0gbmV3dGltZS0+dG1fbWRheTsKKyAgZHQuaG91ciA9IG5ld3RpbWUtPnRtX2hvdXI7CisgIGR0Lm1pbnV0ZSA9IG5ld3RpbWUtPnRtX21pbjsKKyAgZHQuc2Vjb25kID0gbmV3dGltZS0+dG1fc2VjOworICAvLyAgZHQudHpIb3VyID0gX3RpbWV6b25lIC8gMzYwMCAqIC0xOworICAvLyAgZHQudHpNaW51dGUgPSAoYWJzKF90aW1lem9uZSkgJSAzNjAwKSAvIDYwOwogfQogCi1DUERGU0RLX0RhdGVUaW1lJiBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciA9IChjb25zdCBDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSkKLXsKLQlGWFNZU19tZW1jcHkoJmR0LCAmZGF0ZXRpbWUuZHQsIHNpemVvZihGWF9EQVRFVElNRSkpOwotCXJldHVybiAqdGhpczsKK0NQREZTREtfRGF0ZVRpbWUmIENQREZTREtfRGF0ZVRpbWU6Om9wZXJhdG9yPSgKKyAgICBjb25zdCBDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSkgeworICBGWFNZU19tZW1jcHkoJmR0LCAmZGF0ZXRpbWUuZHQsIHNpemVvZihGWF9EQVRFVElNRSkpOworICByZXR1cm4gKnRoaXM7CiB9CiAKLUNQREZTREtfRGF0ZVRpbWUmIENQREZTREtfRGF0ZVRpbWU6Om9wZXJhdG9yID0gKGNvbnN0IEZYX1NZU1RFTVRJTUUmIHN0KQotewotCXR6c2V0KCk7CitDUERGU0RLX0RhdGVUaW1lJiBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvcj0oY29uc3QgRlhfU1lTVEVNVElNRSYgc3QpIHsKKyAgdHpzZXQoKTsKIAotCWR0LnllYXIgPSAoRlhfU0hPUlQpc3Qud1llYXI7Ci0JZHQubW9udGggPSAoRlhfQllURSlzdC53TW9udGg7Ci0JZHQuZGF5ID0gKEZYX0JZVEUpc3Qud0RheTsKLQlkdC5ob3VyID0gKEZYX0JZVEUpc3Qud0hvdXI7Ci0JZHQubWludXRlID0gKEZYX0JZVEUpc3Qud01pbnV0ZTsKLQlkdC5zZWNvbmQgPSAoRlhfQllURSlzdC53U2Vjb25kOwotLy8gCWR0LnR6SG91ciA9IF90aW1lem9uZSAvIDM2MDAgKiAtMTsKLS8vIAlkdC50ek1pbnV0ZSA9IChhYnMoX3RpbWV6b25lKSAlIDM2MDApIC8gNjA7Ci0JcmV0dXJuICp0aGlzOworICBkdC55ZWFyID0gKGludDE2X3Qpc3Qud1llYXI7CisgIGR0Lm1vbnRoID0gKHVpbnQ4X3Qpc3Qud01vbnRoOworICBkdC5kYXkgPSAodWludDhfdClzdC53RGF5OworICBkdC5ob3VyID0gKHVpbnQ4X3Qpc3Qud0hvdXI7CisgIGR0Lm1pbnV0ZSA9ICh1aW50OF90KXN0LndNaW51dGU7CisgIGR0LnNlY29uZCA9ICh1aW50OF90KXN0LndTZWNvbmQ7CisgIC8vICBkdC50ekhvdXIgPSBfdGltZXpvbmUgLyAzNjAwICogLTE7CisgIC8vICBkdC50ek1pbnV0ZSA9IChhYnMoX3RpbWV6b25lKSAlIDM2MDApIC8gNjA7CisgIHJldHVybiAqdGhpczsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciA9PSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpCi17Ci0JcmV0dXJuIChGWFNZU19tZW1jbXAoJmR0LCAmZGF0ZXRpbWUuZHQsIHNpemVvZihGWF9EQVRFVElNRSkpID09IDApOworRlhfQk9PTCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvcj09KENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKSB7CisgIHJldHVybiAoRlhTWVNfbWVtY21wKCZkdCwgJmRhdGV0aW1lLmR0LCBzaXplb2YoRlhfREFURVRJTUUpKSA9PSAwKTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciAhPSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpCi17Ci0JcmV0dXJuIChGWFNZU19tZW1jbXAoJmR0LCAmZGF0ZXRpbWUuZHQsIHNpemVvZihGWF9EQVRFVElNRSkpICE9IDApOworRlhfQk9PTCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciE9KENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKSB7CisgIHJldHVybiAoRlhTWVNfbWVtY21wKCZkdCwgJmRhdGV0aW1lLmR0LCBzaXplb2YoRlhfREFURVRJTUUpKSAhPSAwKTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciA+IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSkKLXsKLQlDUERGU0RLX0RhdGVUaW1lIGR0MSA9IFRvR01UKCk7Ci0JQ1BERlNES19EYXRlVGltZSBkdDIgPSBkYXRldGltZS5Ub0dNVCgpOwotCWludCBkMSA9ICgoKGludClkdDEuZHQueWVhcikgPDwgMTYpIHwgKCgoaW50KWR0MS5kdC5tb250aCkgPDwgOCkgfCAoaW50KWR0MS5kdC5kYXk7Ci0JaW50IGQyID0gKCgoaW50KWR0MS5kdC5ob3VyKSA8PCAxNikgfCAoKChpbnQpZHQxLmR0Lm1pbnV0ZSkgPDwgOCkgfCAoaW50KWR0MS5kdC5zZWNvbmQ7Ci0JaW50IGQzID0gKCgoaW50KWR0Mi5kdC55ZWFyKSA8PCAxNikgfCAoKChpbnQpZHQyLmR0Lm1vbnRoKSA8PCA4KSB8IChpbnQpZHQyLmR0LmRheTsKLQlpbnQgZDQgPSAoKChpbnQpZHQyLmR0LmhvdXIpIDw8IDE2KSB8ICgoKGludClkdDIuZHQubWludXRlKSA8PCA4KSB8IChpbnQpZHQyLmR0LnNlY29uZDsKK0ZYX0JPT0wgQ1BERlNES19EYXRlVGltZTo6b3BlcmF0b3I+KENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKSB7CisgIENQREZTREtfRGF0ZVRpbWUgZHQxID0gVG9HTVQoKTsKKyAgQ1BERlNES19EYXRlVGltZSBkdDIgPSBkYXRldGltZS5Ub0dNVCgpOworICBpbnQgZDEgPQorICAgICAgKCgoaW50KWR0MS5kdC55ZWFyKSA8PCAxNikgfCAoKChpbnQpZHQxLmR0Lm1vbnRoKSA8PCA4KSB8IChpbnQpZHQxLmR0LmRheTsKKyAgaW50IGQyID0gKCgoaW50KWR0MS5kdC5ob3VyKSA8PCAxNikgfCAoKChpbnQpZHQxLmR0Lm1pbnV0ZSkgPDwgOCkgfAorICAgICAgICAgICAoaW50KWR0MS5kdC5zZWNvbmQ7CisgIGludCBkMyA9CisgICAgICAoKChpbnQpZHQyLmR0LnllYXIpIDw8IDE2KSB8ICgoKGludClkdDIuZHQubW9udGgpIDw8IDgpIHwgKGludClkdDIuZHQuZGF5OworICBpbnQgZDQgPSAoKChpbnQpZHQyLmR0LmhvdXIpIDw8IDE2KSB8ICgoKGludClkdDIuZHQubWludXRlKSA8PCA4KSB8CisgICAgICAgICAgIChpbnQpZHQyLmR0LnNlY29uZDsKIAotCWlmIChkMSA+IGQzKSByZXR1cm4gVFJVRTsKLQlpZiAoZDIgPiBkNCkgcmV0dXJuIFRSVUU7Ci0JcmV0dXJuIEZBTFNFOworICBpZiAoZDEgPiBkMykKKyAgICByZXR1cm4gVFJVRTsKKyAgaWYgKGQyID4gZDQpCisgICAgcmV0dXJuIFRSVUU7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciA+PSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpCi17Ci0JQ1BERlNES19EYXRlVGltZSBkdDEgPSBUb0dNVCgpOwotCUNQREZTREtfRGF0ZVRpbWUgZHQyID0gZGF0ZXRpbWUuVG9HTVQoKTsKLQlpbnQgZDEgPSAoKChpbnQpZHQxLmR0LnllYXIpIDw8IDE2KSB8ICgoKGludClkdDEuZHQubW9udGgpIDw8IDgpIHwgKGludClkdDEuZHQuZGF5OwotCWludCBkMiA9ICgoKGludClkdDEuZHQuaG91cikgPDwgMTYpIHwgKCgoaW50KWR0MS5kdC5taW51dGUpIDw8IDgpIHwgKGludClkdDEuZHQuc2Vjb25kOwotCWludCBkMyA9ICgoKGludClkdDIuZHQueWVhcikgPDwgMTYpIHwgKCgoaW50KWR0Mi5kdC5tb250aCkgPDwgOCkgfCAoaW50KWR0Mi5kdC5kYXk7Ci0JaW50IGQ0ID0gKCgoaW50KWR0Mi5kdC5ob3VyKSA8PCAxNikgfCAoKChpbnQpZHQyLmR0Lm1pbnV0ZSkgPDwgOCkgfCAoaW50KWR0Mi5kdC5zZWNvbmQ7CitGWF9CT09MIENQREZTREtfRGF0ZVRpbWU6Om9wZXJhdG9yPj0oQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpIHsKKyAgQ1BERlNES19EYXRlVGltZSBkdDEgPSBUb0dNVCgpOworICBDUERGU0RLX0RhdGVUaW1lIGR0MiA9IGRhdGV0aW1lLlRvR01UKCk7CisgIGludCBkMSA9CisgICAgICAoKChpbnQpZHQxLmR0LnllYXIpIDw8IDE2KSB8ICgoKGludClkdDEuZHQubW9udGgpIDw8IDgpIHwgKGludClkdDEuZHQuZGF5OworICBpbnQgZDIgPSAoKChpbnQpZHQxLmR0LmhvdXIpIDw8IDE2KSB8ICgoKGludClkdDEuZHQubWludXRlKSA8PCA4KSB8CisgICAgICAgICAgIChpbnQpZHQxLmR0LnNlY29uZDsKKyAgaW50IGQzID0KKyAgICAgICgoKGludClkdDIuZHQueWVhcikgPDwgMTYpIHwgKCgoaW50KWR0Mi5kdC5tb250aCkgPDwgOCkgfCAoaW50KWR0Mi5kdC5kYXk7CisgIGludCBkNCA9ICgoKGludClkdDIuZHQuaG91cikgPDwgMTYpIHwgKCgoaW50KWR0Mi5kdC5taW51dGUpIDw8IDgpIHwKKyAgICAgICAgICAgKGludClkdDIuZHQuc2Vjb25kOwogCi0JaWYgKGQxID49IGQzKSByZXR1cm4gVFJVRTsKLQlpZiAoZDIgPj0gZDQpIHJldHVybiBUUlVFOwotCXJldHVybiBGQUxTRTsKKyAgaWYgKGQxID49IGQzKQorICAgIHJldHVybiBUUlVFOworICBpZiAoZDIgPj0gZDQpCisgICAgcmV0dXJuIFRSVUU7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciA8IChDUERGU0RLX0RhdGVUaW1lJiBkYXRldGltZSkKLXsKLQlDUERGU0RLX0RhdGVUaW1lIGR0MSA9IFRvR01UKCk7Ci0JQ1BERlNES19EYXRlVGltZSBkdDIgPSBkYXRldGltZS5Ub0dNVCgpOwotCWludCBkMSA9ICgoKGludClkdDEuZHQueWVhcikgPDwgMTYpIHwgKCgoaW50KWR0MS5kdC5tb250aCkgPDwgOCkgfCAoaW50KWR0MS5kdC5kYXk7Ci0JaW50IGQyID0gKCgoaW50KWR0MS5kdC5ob3VyKSA8PCAxNikgfCAoKChpbnQpZHQxLmR0Lm1pbnV0ZSkgPDwgOCkgfCAoaW50KWR0MS5kdC5zZWNvbmQ7Ci0JaW50IGQzID0gKCgoaW50KWR0Mi5kdC55ZWFyKSA8PCAxNikgfCAoKChpbnQpZHQyLmR0Lm1vbnRoKSA8PCA4KSB8IChpbnQpZHQyLmR0LmRheTsKLQlpbnQgZDQgPSAoKChpbnQpZHQyLmR0LmhvdXIpIDw8IDE2KSB8ICgoKGludClkdDIuZHQubWludXRlKSA8PCA4KSB8IChpbnQpZHQyLmR0LnNlY29uZDsKK0ZYX0JPT0wgQ1BERlNES19EYXRlVGltZTo6b3BlcmF0b3I8KENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKSB7CisgIENQREZTREtfRGF0ZVRpbWUgZHQxID0gVG9HTVQoKTsKKyAgQ1BERlNES19EYXRlVGltZSBkdDIgPSBkYXRldGltZS5Ub0dNVCgpOworICBpbnQgZDEgPQorICAgICAgKCgoaW50KWR0MS5kdC55ZWFyKSA8PCAxNikgfCAoKChpbnQpZHQxLmR0Lm1vbnRoKSA8PCA4KSB8IChpbnQpZHQxLmR0LmRheTsKKyAgaW50IGQyID0gKCgoaW50KWR0MS5kdC5ob3VyKSA8PCAxNikgfCAoKChpbnQpZHQxLmR0Lm1pbnV0ZSkgPDwgOCkgfAorICAgICAgICAgICAoaW50KWR0MS5kdC5zZWNvbmQ7CisgIGludCBkMyA9CisgICAgICAoKChpbnQpZHQyLmR0LnllYXIpIDw8IDE2KSB8ICgoKGludClkdDIuZHQubW9udGgpIDw8IDgpIHwgKGludClkdDIuZHQuZGF5OworICBpbnQgZDQgPSAoKChpbnQpZHQyLmR0LmhvdXIpIDw8IDE2KSB8ICgoKGludClkdDIuZHQubWludXRlKSA8PCA4KSB8CisgICAgICAgICAgIChpbnQpZHQyLmR0LnNlY29uZDsKIAotCWlmIChkMSA8IGQzKSByZXR1cm4gVFJVRTsKLQlpZiAoZDIgPCBkNCkgcmV0dXJuIFRSVUU7Ci0JcmV0dXJuIEZBTFNFOworICBpZiAoZDEgPCBkMykKKyAgICByZXR1cm4gVFJVRTsKKyAgaWYgKGQyIDwgZDQpCisgICAgcmV0dXJuIFRSVUU7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0RhdGVUaW1lOjpvcGVyYXRvciA8PSAoQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpCi17Ci0JQ1BERlNES19EYXRlVGltZSBkdDEgPSBUb0dNVCgpOwotCUNQREZTREtfRGF0ZVRpbWUgZHQyID0gZGF0ZXRpbWUuVG9HTVQoKTsKLQlpbnQgZDEgPSAoKChpbnQpZHQxLmR0LnllYXIpIDw8IDE2KSB8ICgoKGludClkdDEuZHQubW9udGgpIDw8IDgpIHwgKGludClkdDEuZHQuZGF5OwotCWludCBkMiA9ICgoKGludClkdDEuZHQuaG91cikgPDwgMTYpIHwgKCgoaW50KWR0MS5kdC5taW51dGUpIDw8IDgpIHwgKGludClkdDEuZHQuc2Vjb25kOwotCWludCBkMyA9ICgoKGludClkdDIuZHQueWVhcikgPDwgMTYpIHwgKCgoaW50KWR0Mi5kdC5tb250aCkgPDwgOCkgfCAoaW50KWR0Mi5kdC5kYXk7Ci0JaW50IGQ0ID0gKCgoaW50KWR0Mi5kdC5ob3VyKSA8PCAxNikgfCAoKChpbnQpZHQyLmR0Lm1pbnV0ZSkgPDwgOCkgfCAoaW50KWR0Mi5kdC5zZWNvbmQ7CitGWF9CT09MIENQREZTREtfRGF0ZVRpbWU6Om9wZXJhdG9yPD0oQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpIHsKKyAgQ1BERlNES19EYXRlVGltZSBkdDEgPSBUb0dNVCgpOworICBDUERGU0RLX0RhdGVUaW1lIGR0MiA9IGRhdGV0aW1lLlRvR01UKCk7CisgIGludCBkMSA9CisgICAgICAoKChpbnQpZHQxLmR0LnllYXIpIDw8IDE2KSB8ICgoKGludClkdDEuZHQubW9udGgpIDw8IDgpIHwgKGludClkdDEuZHQuZGF5OworICBpbnQgZDIgPSAoKChpbnQpZHQxLmR0LmhvdXIpIDw8IDE2KSB8ICgoKGludClkdDEuZHQubWludXRlKSA8PCA4KSB8CisgICAgICAgICAgIChpbnQpZHQxLmR0LnNlY29uZDsKKyAgaW50IGQzID0KKyAgICAgICgoKGludClkdDIuZHQueWVhcikgPDwgMTYpIHwgKCgoaW50KWR0Mi5kdC5tb250aCkgPDwgOCkgfCAoaW50KWR0Mi5kdC5kYXk7CisgIGludCBkNCA9ICgoKGludClkdDIuZHQuaG91cikgPDwgMTYpIHwgKCgoaW50KWR0Mi5kdC5taW51dGUpIDw8IDgpIHwKKyAgICAgICAgICAgKGludClkdDIuZHQuc2Vjb25kOwogCi0JaWYgKGQxIDw9IGQzKSByZXR1cm4gVFJVRTsKLQlpZiAoZDIgPD0gZDQpIHJldHVybiBUUlVFOwotCXJldHVybiBGQUxTRTsKKyAgaWYgKGQxIDw9IGQzKQorICAgIHJldHVybiBUUlVFOworICBpZiAoZDIgPD0gZDQpCisgICAgcmV0dXJuIFRSVUU7CisgIHJldHVybiBGQUxTRTsKIH0KIAotQ1BERlNES19EYXRlVGltZTo6b3BlcmF0b3IgdGltZV90KCkKLXsKLQlzdHJ1Y3QgdG0gbmV3dGltZTsKK0NQREZTREtfRGF0ZVRpbWU6Om9wZXJhdG9yIHRpbWVfdCgpIHsKKyAgc3RydWN0IHRtIG5ld3RpbWU7CiAKLQluZXd0aW1lLnRtX3llYXIgPSBkdC55ZWFyIC0gMTkwMDsKLQluZXd0aW1lLnRtX21vbiA9IGR0Lm1vbnRoIC0gMTsKLQluZXd0aW1lLnRtX21kYXkgPSBkdC5kYXk7Ci0JbmV3dGltZS50bV9ob3VyID0gZHQuaG91cjsKLQluZXd0aW1lLnRtX21pbiA9IGR0Lm1pbnV0ZTsKLQluZXd0aW1lLnRtX3NlYyA9IGR0LnNlY29uZDsKKyAgbmV3dGltZS50bV95ZWFyID0gZHQueWVhciAtIDE5MDA7CisgIG5ld3RpbWUudG1fbW9uID0gZHQubW9udGggLSAxOworICBuZXd0aW1lLnRtX21kYXkgPSBkdC5kYXk7CisgIG5ld3RpbWUudG1faG91ciA9IGR0LmhvdXI7CisgIG5ld3RpbWUudG1fbWluID0gZHQubWludXRlOworICBuZXd0aW1lLnRtX3NlYyA9IGR0LnNlY29uZDsKIAotCXJldHVybiBta3RpbWUoJm5ld3RpbWUpOworICByZXR1cm4gbWt0aW1lKCZuZXd0aW1lKTsKIH0KIAotQ1BERlNES19EYXRlVGltZSYgQ1BERlNES19EYXRlVGltZTo6RnJvbVBERkRhdGVUaW1lU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBkdFN0cikKLXsKLQlpbnQgc3RyTGVuZ3RoID0gZHRTdHIuR2V0TGVuZ3RoKCk7Ci0JaWYgKHN0ckxlbmd0aCA+IDApCi0JewotCQlpbnQgaSA9IDA7Ci0JCWludCBqLCBrOwotCQlGWF9DSEFSIGNoOwotCQl3aGlsZSAoaSA8IHN0ckxlbmd0aCkKLQkJewotCQkJY2ggPSBkdFN0cltpXTsKLQkJCWlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSBicmVhazsKLQkJCWkgKys7Ci0JCX0KLQkJaWYgKGkgPj0gc3RyTGVuZ3RoKSByZXR1cm4gKnRoaXM7CitDUERGU0RLX0RhdGVUaW1lJiBDUERGU0RLX0RhdGVUaW1lOjpGcm9tUERGRGF0ZVRpbWVTdHJpbmcoCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGR0U3RyKSB7CisgIGludCBzdHJMZW5ndGggPSBkdFN0ci5HZXRMZW5ndGgoKTsKKyAgaWYgKHN0ckxlbmd0aCA+IDApIHsKKyAgICBpbnQgaSA9IDA7CisgICAgaW50IGosIGs7CisgICAgRlhfQ0hBUiBjaDsKKyAgICB3aGlsZSAoaSA8IHN0ckxlbmd0aCAmJiAhc3RkOjppc2RpZ2l0KGR0U3RyW2ldKSkKKyAgICAgICsraTsKIAotCQlqID0gMDsKLQkJayA9IDA7Ci0JCXdoaWxlIChpIDwgc3RyTGVuZ3RoICYmIGogPCA0KQotCQl7Ci0JCQljaCA9IGR0U3RyW2ldOwotCQkJayA9IGsgKiAxMCArIGNoIC0gJzAnOwotCQkJaiArKzsKLQkJCWlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykgYnJlYWs7Ci0JCQlpICsrOwotCQl9Ci0JCWR0LnllYXIgPSAoRlhfU0hPUlQpazsKLQkJaWYgKGkgPj0gc3RyTGVuZ3RoIHx8IGogPCA0KSByZXR1cm4gKnRoaXM7CisgICAgaWYgKGkgPj0gc3RyTGVuZ3RoKQorICAgICAgcmV0dXJuICp0aGlzOwogCi0JCWogPSAwOwotCQlrID0gMDsKLQkJd2hpbGUgKGkgPCBzdHJMZW5ndGggJiYgaiA8IDIpCi0JCXsKLQkJCWNoID0gZHRTdHJbaV07Ci0JCQlrID0gayAqIDEwICsgY2ggLSAnMCc7Ci0JCQlqICsrOwotCQkJaWYgKGNoIDwgJzAnIHx8IGNoID4gJzknKSBicmVhazsKLQkJCWkgKys7Ci0JCX0KLQkJZHQubW9udGggPSAoRlhfQllURSlrOwotCQlpZiAoaSA+PSBzdHJMZW5ndGggfHwgaiA8IDIpIHJldHVybiAqdGhpczsKKyAgICBqID0gMDsKKyAgICBrID0gMDsKKyAgICB3aGlsZSAoaSA8IHN0ckxlbmd0aCAmJiBqIDwgNCkgeworICAgICAgY2ggPSBkdFN0cltpXTsKKyAgICAgIGsgPSBrICogMTAgKyBGWFNZU190b0RlY2ltYWxEaWdpdChjaCk7CisgICAgICBqKys7CisgICAgICBpZiAoIXN0ZDo6aXNkaWdpdChjaCkpCisgICAgICAgIGJyZWFrOworICAgICAgaSsrOworICAgIH0KKyAgICBkdC55ZWFyID0gKGludDE2X3QpazsKKyAgICBpZiAoaSA+PSBzdHJMZW5ndGggfHwgaiA8IDQpCisgICAgICByZXR1cm4gKnRoaXM7CiAKLQkJaiA9IDA7Ci0JCWsgPSAwOwotCQl3aGlsZSAoaSA8IHN0ckxlbmd0aCAmJiBqIDwgMikKLQkJewotCQkJY2ggPSBkdFN0cltpXTsKLQkJCWsgPSBrICogMTAgKyBjaCAtICcwJzsKLQkJCWogKys7Ci0JCQlpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpIGJyZWFrOwotCQkJaSArKzsKLQkJfQotCQlkdC5kYXkgPSAoRlhfQllURSlrOwotCQlpZiAoaSA+PSBzdHJMZW5ndGggfHwgaiA8IDIpIHJldHVybiAqdGhpczsKKyAgICBqID0gMDsKKyAgICBrID0gMDsKKyAgICB3aGlsZSAoaSA8IHN0ckxlbmd0aCAmJiBqIDwgMikgeworICAgICAgY2ggPSBkdFN0cltpXTsKKyAgICAgIGsgPSBrICogMTAgKyBGWFNZU190b0RlY2ltYWxEaWdpdChjaCk7CisgICAgICBqKys7CisgICAgICBpZiAoIXN0ZDo6aXNkaWdpdChjaCkpCisgICAgICAgIGJyZWFrOworICAgICAgaSsrOworICAgIH0KKyAgICBkdC5tb250aCA9ICh1aW50OF90KWs7CisgICAgaWYgKGkgPj0gc3RyTGVuZ3RoIHx8IGogPCAyKQorICAgICAgcmV0dXJuICp0aGlzOwogCi0JCWogPSAwOwotCQlrID0gMDsKLQkJd2hpbGUgKGkgPCBzdHJMZW5ndGggJiYgaiA8IDIpCi0JCXsKLQkJCWNoID0gZHRTdHJbaV07Ci0JCQlrID0gayAqIDEwICsgY2ggLSAnMCc7Ci0JCQlqICsrOwotCQkJaWYgKGNoIDwgJzAnIHx8IGNoID4gJzknKSBicmVhazsKLQkJCWkgKys7Ci0JCX0KLQkJZHQuaG91ciA9IChGWF9CWVRFKWs7Ci0JCWlmIChpID49IHN0ckxlbmd0aCB8fCBqIDwgMikgcmV0dXJuICp0aGlzOworICAgIGogPSAwOworICAgIGsgPSAwOworICAgIHdoaWxlIChpIDwgc3RyTGVuZ3RoICYmIGogPCAyKSB7CisgICAgICBjaCA9IGR0U3RyW2ldOworICAgICAgayA9IGsgKiAxMCArIEZYU1lTX3RvRGVjaW1hbERpZ2l0KGNoKTsKKyAgICAgIGorKzsKKyAgICAgIGlmICghc3RkOjppc2RpZ2l0KGNoKSkKKyAgICAgICAgYnJlYWs7CisgICAgICBpKys7CisgICAgfQorICAgIGR0LmRheSA9ICh1aW50OF90KWs7CisgICAgaWYgKGkgPj0gc3RyTGVuZ3RoIHx8IGogPCAyKQorICAgICAgcmV0dXJuICp0aGlzOworCisgICAgaiA9IDA7CisgICAgayA9IDA7CisgICAgd2hpbGUgKGkgPCBzdHJMZW5ndGggJiYgaiA8IDIpIHsKKyAgICAgIGNoID0gZHRTdHJbaV07CisgICAgICBrID0gayAqIDEwICsgRlhTWVNfdG9EZWNpbWFsRGlnaXQoY2gpOworICAgICAgaisrOworICAgICAgaWYgKCFzdGQ6OmlzZGlnaXQoY2gpKQorICAgICAgICBicmVhazsKKyAgICAgIGkrKzsKKyAgICB9CisgICAgZHQuaG91ciA9ICh1aW50OF90KWs7CisgICAgaWYgKGkgPj0gc3RyTGVuZ3RoIHx8IGogPCAyKQorICAgICAgcmV0dXJuICp0aGlzOwogCi0JCWogPSAwOwotCQlrID0gMDsKLQkJd2hpbGUgKGkgPCBzdHJMZW5ndGggJiYgaiA8IDIpCi0JCXsKLQkJCWNoID0gZHRTdHJbaV07Ci0JCQlrID0gayAqIDEwICsgY2ggLSAnMCc7Ci0JCQlqICsrOwotCQkJaWYgKGNoIDwgJzAnIHx8IGNoID4gJzknKSBicmVhazsKLQkJCWkgKys7Ci0JCX0KLQkJZHQubWludXRlID0gKEZYX0JZVEUpazsKLQkJaWYgKGkgPj0gc3RyTGVuZ3RoIHx8IGogPCAyKSByZXR1cm4gKnRoaXM7CisgICAgaiA9IDA7CisgICAgayA9IDA7CisgICAgd2hpbGUgKGkgPCBzdHJMZW5ndGggJiYgaiA8IDIpIHsKKyAgICAgIGNoID0gZHRTdHJbaV07CisgICAgICBrID0gayAqIDEwICsgRlhTWVNfdG9EZWNpbWFsRGlnaXQoY2gpOworICAgICAgaisrOworICAgICAgaWYgKCFzdGQ6OmlzZGlnaXQoY2gpKQorICAgICAgICBicmVhazsKKyAgICAgIGkrKzsKKyAgICB9CisgICAgZHQubWludXRlID0gKHVpbnQ4X3QpazsKKyAgICBpZiAoaSA+PSBzdHJMZW5ndGggfHwgaiA8IDIpCisgICAgICByZXR1cm4gKnRoaXM7CiAKLQkJaiA9IDA7Ci0JCWsgPSAwOwotCQl3aGlsZSAoaSA8IHN0ckxlbmd0aCAmJiBqIDwgMikKLQkJewotCQkJY2ggPSBkdFN0cltpXTsKLQkJCWsgPSBrICogMTAgKyBjaCAtICcwJzsKLQkJCWogKys7Ci0JCQlpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpIGJyZWFrOwotCQkJaSArKzsKLQkJfQotCQlkdC5zZWNvbmQgPSAoRlhfQllURSlrOwotCQlpZiAoaSA+PSBzdHJMZW5ndGggfHwgaiA8IDIpIHJldHVybiAqdGhpczsKKyAgICBqID0gMDsKKyAgICBrID0gMDsKKyAgICB3aGlsZSAoaSA8IHN0ckxlbmd0aCAmJiBqIDwgMikgeworICAgICAgY2ggPSBkdFN0cltpXTsKKyAgICAgIGsgPSBrICogMTAgKyBGWFNZU190b0RlY2ltYWxEaWdpdChjaCk7CisgICAgICBqKys7CisgICAgICBpZiAoIXN0ZDo6aXNkaWdpdChjaCkpCisgICAgICAgIGJyZWFrOworICAgICAgaSsrOworICAgIH0KKyAgICBkdC5zZWNvbmQgPSAodWludDhfdClrOworICAgIGlmIChpID49IHN0ckxlbmd0aCB8fCBqIDwgMikKKyAgICAgIHJldHVybiAqdGhpczsKIAotCQljaCA9IGR0U3RyW2kgKytdOwotCQlpZiAoY2ggIT0gJy0nICYmIGNoICE9ICcrJykgcmV0dXJuICp0aGlzOwotCQlpZiAoY2ggPT0gJy0nKQotCQkJZHQudHpIb3VyID0gLTE7Ci0JCWVsc2UKLQkJCWR0LnR6SG91ciA9IDE7Ci0JCWogPSAwOwotCQlrID0gMDsKLQkJd2hpbGUgKGkgPCBzdHJMZW5ndGggJiYgaiA8IDIpCi0JCXsKLQkJCWNoID0gZHRTdHJbaV07Ci0JCQlrID0gayAqIDEwICsgY2ggLSAnMCc7Ci0JCQlqICsrOwotCQkJaWYgKGNoIDwgJzAnIHx8IGNoID4gJzknKSBicmVhazsKLQkJCWkgKys7Ci0JCX0KLQkJZHQudHpIb3VyICo9IChGWF9DSEFSKWs7Ci0JCWlmIChpID49IHN0ckxlbmd0aCB8fCBqIDwgMikgcmV0dXJuICp0aGlzOworICAgIGNoID0gZHRTdHJbaSsrXTsKKyAgICBpZiAoY2ggIT0gJy0nICYmIGNoICE9ICcrJykKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICBpZiAoY2ggPT0gJy0nKQorICAgICAgZHQudHpIb3VyID0gLTE7CisgICAgZWxzZQorICAgICAgZHQudHpIb3VyID0gMTsKKyAgICBqID0gMDsKKyAgICBrID0gMDsKKyAgICB3aGlsZSAoaSA8IHN0ckxlbmd0aCAmJiBqIDwgMikgeworICAgICAgY2ggPSBkdFN0cltpXTsKKyAgICAgIGsgPSBrICogMTAgKyBGWFNZU190b0RlY2ltYWxEaWdpdChjaCk7CisgICAgICBqKys7CisgICAgICBpZiAoIXN0ZDo6aXNkaWdpdChjaCkpCisgICAgICAgIGJyZWFrOworICAgICAgaSsrOworICAgIH0KKyAgICBkdC50ekhvdXIgKj0gKEZYX0NIQVIpazsKKyAgICBpZiAoaSA+PSBzdHJMZW5ndGggfHwgaiA8IDIpCisgICAgICByZXR1cm4gKnRoaXM7CiAKLQkJY2ggPSBkdFN0cltpICsrXTsKLQkJaWYgKGNoICE9ICdcJycpIHJldHVybiAqdGhpczsKLQkJaiA9IDA7Ci0JCWsgPSAwOwotCQl3aGlsZSAoaSA8IHN0ckxlbmd0aCAmJiBqIDwgMikKLQkJewotCQkJY2ggPSBkdFN0cltpXTsKLQkJCWsgPSBrICogMTAgKyBjaCAtICcwJzsKLQkJCWogKys7Ci0JCQlpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpIGJyZWFrOwotCQkJaSArKzsKLQkJfQotCQlkdC50ek1pbnV0ZSA9IChGWF9CWVRFKWs7Ci0JCWlmIChpID49IHN0ckxlbmd0aCB8fCBqIDwgMikgcmV0dXJuICp0aGlzOwotCX0KKyAgICBjaCA9IGR0U3RyW2krK107CisgICAgaWYgKGNoICE9ICdcJycpCisgICAgICByZXR1cm4gKnRoaXM7CisgICAgaiA9IDA7CisgICAgayA9IDA7CisgICAgd2hpbGUgKGkgPCBzdHJMZW5ndGggJiYgaiA8IDIpIHsKKyAgICAgIGNoID0gZHRTdHJbaV07CisgICAgICBrID0gayAqIDEwICsgRlhTWVNfdG9EZWNpbWFsRGlnaXQoY2gpOworICAgICAgaisrOworICAgICAgaWYgKCFzdGQ6OmlzZGlnaXQoY2gpKQorICAgICAgICBicmVhazsKKyAgICAgIGkrKzsKKyAgICB9CisgICAgZHQudHpNaW51dGUgPSAodWludDhfdClrOworICAgIGlmIChpID49IHN0ckxlbmd0aCB8fCBqIDwgMikKKyAgICAgIHJldHVybiAqdGhpczsKKyAgfQogCi0JcmV0dXJuICAqdGhpczsKKyAgcmV0dXJuICp0aGlzOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUERGU0RLX0RhdGVUaW1lOjpUb0NvbW1vbkRhdGVUaW1lU3RyaW5nKCkKLXsKLQlDRlhfQnl0ZVN0cmluZyBzdHIxOwotCXN0cjEuRm9ybWF0KCIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCAiLCBkdC55ZWFyLCBkdC5tb250aCwgZHQuZGF5LCBkdC5ob3VyLCBkdC5taW51dGUsIGR0LnNlY29uZCk7Ci0JaWYgKGR0LnR6SG91ciA8IDApCi0JCXN0cjEgKz0gIi0iOwotCWVsc2UKLQkJc3RyMSArPSAiKyI7Ci0JQ0ZYX0J5dGVTdHJpbmcgc3RyMjsKLQlzdHIyLkZvcm1hdCgiJTAyZDolMDJkIiwgYWJzKGR0LnR6SG91ciksIGR0LnR6TWludXRlKTsKLQlyZXR1cm4gc3RyMSArIHN0cjI7CitDRlhfQnl0ZVN0cmluZyBDUERGU0RLX0RhdGVUaW1lOjpUb0NvbW1vbkRhdGVUaW1lU3RyaW5nKCkgeworICBDRlhfQnl0ZVN0cmluZyBzdHIxOworICBzdHIxLkZvcm1hdCgiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQgIiwgZHQueWVhciwgZHQubW9udGgsIGR0LmRheSwKKyAgICAgICAgICAgICAgZHQuaG91ciwgZHQubWludXRlLCBkdC5zZWNvbmQpOworICBpZiAoZHQudHpIb3VyIDwgMCkKKyAgICBzdHIxICs9ICItIjsKKyAgZWxzZQorICAgIHN0cjEgKz0gIisiOworICBDRlhfQnl0ZVN0cmluZyBzdHIyOworICBzdHIyLkZvcm1hdCgiJTAyZDolMDJkIiwgYWJzKGR0LnR6SG91ciksIGR0LnR6TWludXRlKTsKKyAgcmV0dXJuIHN0cjEgKyBzdHIyOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUERGU0RLX0RhdGVUaW1lOjpUb1BERkRhdGVUaW1lU3RyaW5nKCkKLXsKLQlDRlhfQnl0ZVN0cmluZyBkdFN0cjsKLQljaGFyIHRlbXBTdHJbMzJdOwotCW1lbXNldCh0ZW1wU3RyLCAwLCBzaXplb2YodGVtcFN0cikpOwotCUZYU1lTX3NucHJpbnRmKHRlbXBTdHIsIHNpemVvZih0ZW1wU3RyKSAtIDEsICJEOiUwNGQlMDJkJTAyZCUwMmQlMDJkJTAyZCIsCi0gICAgICAgICAgICAgICAgICAgZHQueWVhciwgZHQubW9udGgsIGR0LmRheSwgZHQuaG91ciwgZHQubWludXRlLCBkdC5zZWNvbmQpOwotCWR0U3RyID0gQ0ZYX0J5dGVTdHJpbmcodGVtcFN0cik7Ci0JaWYgKGR0LnR6SG91ciA8IDApCi0JCWR0U3RyICs9IENGWF9CeXRlU3RyaW5nKCItIik7Ci0JZWxzZQotCQlkdFN0ciArPSBDRlhfQnl0ZVN0cmluZygiKyIpOwotCW1lbXNldCh0ZW1wU3RyLCAwLCBzaXplb2YodGVtcFN0cikpOwotCUZYU1lTX3NucHJpbnRmKHRlbXBTdHIsIHNpemVvZih0ZW1wU3RyKSAtIDEsICIlMDJkJyUwMmQnIiwgYWJzKGR0LnR6SG91ciksIGR0LnR6TWludXRlKTsKLQlkdFN0ciArPSBDRlhfQnl0ZVN0cmluZyh0ZW1wU3RyKTsKLQlyZXR1cm4gZHRTdHI7CitDRlhfQnl0ZVN0cmluZyBDUERGU0RLX0RhdGVUaW1lOjpUb1BERkRhdGVUaW1lU3RyaW5nKCkgeworICBDRlhfQnl0ZVN0cmluZyBkdFN0cjsKKyAgY2hhciB0ZW1wU3RyWzMyXTsKKyAgbWVtc2V0KHRlbXBTdHIsIDAsIHNpemVvZih0ZW1wU3RyKSk7CisgIEZYU1lTX3NucHJpbnRmKHRlbXBTdHIsIHNpemVvZih0ZW1wU3RyKSAtIDEsICJEOiUwNGQlMDJkJTAyZCUwMmQlMDJkJTAyZCIsCisgICAgICAgICAgICAgICAgIGR0LnllYXIsIGR0Lm1vbnRoLCBkdC5kYXksIGR0LmhvdXIsIGR0Lm1pbnV0ZSwgZHQuc2Vjb25kKTsKKyAgZHRTdHIgPSBDRlhfQnl0ZVN0cmluZyh0ZW1wU3RyKTsKKyAgaWYgKGR0LnR6SG91ciA8IDApCisgICAgZHRTdHIgKz0gQ0ZYX0J5dGVTdHJpbmcoIi0iKTsKKyAgZWxzZQorICAgIGR0U3RyICs9IENGWF9CeXRlU3RyaW5nKCIrIik7CisgIG1lbXNldCh0ZW1wU3RyLCAwLCBzaXplb2YodGVtcFN0cikpOworICBGWFNZU19zbnByaW50Zih0ZW1wU3RyLCBzaXplb2YodGVtcFN0cikgLSAxLCAiJTAyZCclMDJkJyIsIGFicyhkdC50ekhvdXIpLAorICAgICAgICAgICAgICAgICBkdC50ek1pbnV0ZSk7CisgIGR0U3RyICs9IENGWF9CeXRlU3RyaW5nKHRlbXBTdHIpOworICByZXR1cm4gZHRTdHI7CiB9CiAKLXZvaWQgQ1BERlNES19EYXRlVGltZTo6VG9TeXN0ZW1UaW1lKEZYX1NZU1RFTVRJTUUmIHN0KQotewotCUNQREZTREtfRGF0ZVRpbWUgZHQgPSAqdGhpczsKLQl0aW1lX3QgdCA9ICh0aW1lX3QpZHQ7Ci0Jc3RydWN0IHRtKiBwVGltZSA9IGxvY2FsdGltZSgmdCk7Ci0JaWYocFRpbWUpeyAKLQkJc3Qud1llYXIgPSAoRlhfV09SRClwVGltZS0+dG1feWVhciArIDE5MDA7Ci0JCXN0LndNb250aCA9IChGWF9XT1JEKXBUaW1lLT50bV9tb24gKyAxOwotCQlzdC53RGF5ID0gKEZYX1dPUkQpcFRpbWUtPnRtX21kYXk7Ci0JCXN0LndEYXlPZldlZWsgPSAoRlhfV09SRClwVGltZS0+dG1fd2RheTsKLQkJc3Qud0hvdXIgPSAoRlhfV09SRClwVGltZS0+dG1faG91cjsKLQkJc3Qud01pbnV0ZSA9IChGWF9XT1JEKXBUaW1lLT50bV9taW47Ci0JCXN0LndTZWNvbmQgPSAoRlhfV09SRClwVGltZS0+dG1fc2VjOwotCQlzdC53TWlsbGlzZWNvbmRzID0gMDsKLQl9Cit2b2lkIENQREZTREtfRGF0ZVRpbWU6OlRvU3lzdGVtVGltZShGWF9TWVNURU1USU1FJiBzdCkgeworICBDUERGU0RLX0RhdGVUaW1lIGR0ID0gKnRoaXM7CisgIHRpbWVfdCB0ID0gKHRpbWVfdClkdDsKKyAgc3RydWN0IHRtKiBwVGltZSA9IGxvY2FsdGltZSgmdCk7CisgIGlmIChwVGltZSkgeworICAgIHN0LndZZWFyID0gKEZYX1dPUkQpcFRpbWUtPnRtX3llYXIgKyAxOTAwOworICAgIHN0LndNb250aCA9IChGWF9XT1JEKXBUaW1lLT50bV9tb24gKyAxOworICAgIHN0LndEYXkgPSAoRlhfV09SRClwVGltZS0+dG1fbWRheTsKKyAgICBzdC53RGF5T2ZXZWVrID0gKEZYX1dPUkQpcFRpbWUtPnRtX3dkYXk7CisgICAgc3Qud0hvdXIgPSAoRlhfV09SRClwVGltZS0+dG1faG91cjsKKyAgICBzdC53TWludXRlID0gKEZYX1dPUkQpcFRpbWUtPnRtX21pbjsKKyAgICBzdC53U2Vjb25kID0gKEZYX1dPUkQpcFRpbWUtPnRtX3NlYzsKKyAgICBzdC53TWlsbGlzZWNvbmRzID0gMDsKKyAgfQogfQogCi1DUERGU0RLX0RhdGVUaW1lIENQREZTREtfRGF0ZVRpbWU6OlRvR01UKCkKLXsKLQlDUERGU0RLX0RhdGVUaW1lIGR0ID0gKnRoaXM7Ci0JZHQuQWRkU2Vjb25kcygtX2dBZnhHZXRUaW1lWm9uZUluU2Vjb25kcyhkdC5kdC50ekhvdXIsIGR0LmR0LnR6TWludXRlKSk7Ci0JZHQuZHQudHpIb3VyID0gMDsKLQlkdC5kdC50ek1pbnV0ZSA9IDA7Ci0JcmV0dXJuIGR0OworQ1BERlNES19EYXRlVGltZSBDUERGU0RLX0RhdGVUaW1lOjpUb0dNVCgpIHsKKyAgQ1BERlNES19EYXRlVGltZSBkdCA9ICp0aGlzOworICBkdC5BZGRTZWNvbmRzKC1fZ0FmeEdldFRpbWVab25lSW5TZWNvbmRzKGR0LmR0LnR6SG91ciwgZHQuZHQudHpNaW51dGUpKTsKKyAgZHQuZHQudHpIb3VyID0gMDsKKyAgZHQuZHQudHpNaW51dGUgPSAwOworICByZXR1cm4gZHQ7CiB9CiAKLUNQREZTREtfRGF0ZVRpbWUmIENQREZTREtfRGF0ZVRpbWU6OkFkZERheXMoc2hvcnQgZGF5cykKLXsKLQlpZiAoZGF5cyA9PSAwKSByZXR1cm4gKnRoaXM7CitDUERGU0RLX0RhdGVUaW1lJiBDUERGU0RLX0RhdGVUaW1lOjpBZGREYXlzKHNob3J0IGRheXMpIHsKKyAgaWYgKGRheXMgPT0gMCkKKyAgICByZXR1cm4gKnRoaXM7CiAKLQlGWF9TSE9SVAl5ID0gZHQueWVhciwgeXk7Ci0JRlhfQllURQkJbSA9IGR0Lm1vbnRoOwotCUZYX0JZVEUJCWQgPSBkdC5kYXk7Ci0JaW50CQkJbWRheXMsIHlkYXlzLCBsZGF5czsKKyAgaW50MTZfdCB5ID0gZHQueWVhciwgeXk7CisgIHVpbnQ4X3QgbSA9IGR0Lm1vbnRoOworICB1aW50OF90IGQgPSBkdC5kYXk7CisgIGludCBtZGF5cywgeWRheXMsIGxkYXlzOwogCi0JbGRheXMgPSBkYXlzOwotCWlmIChsZGF5cyA+IDApCi0JewotCQl5eSA9IHk7Ci0JCWlmICgoKEZYX1dPUkQpbSAqIDEwMCArIGQpID4gMzAwKSB5eSArKzsKLQkJeWRheXMgPSBfZ0FmeEdldFllYXJEYXlzKHl5KTsKLQkJd2hpbGUgKGxkYXlzID49IHlkYXlzKQotCQl7Ci0JCQl5ICsrOwotCQkJbGRheXMgLT0geWRheXM7Ci0JCQl5eSArKzsKLQkJCW1kYXlzID0gX2dBZnhHZXRNb250aERheXMoeSwgbSk7Ci0JCQlpZiAoZCA+IG1kYXlzKQotCQkJewotCQkJCW0gKys7Ci0JCQkJZCAtPSBtZGF5czsKLQkJCX0KLQkJCXlkYXlzID0gX2dBZnhHZXRZZWFyRGF5cyh5eSk7Ci0JCX0KLQkJbWRheXMgPSBfZ0FmeEdldE1vbnRoRGF5cyh5LCBtKSAtIGQgKyAxOwotCQl3aGlsZSAobGRheXMgPj0gbWRheXMpCi0JCXsKLQkJCWxkYXlzIC09IG1kYXlzOwotCQkJbSArKzsKLQkJCWQgPSAxOwotCQkJbWRheXMgPSBfZ0FmeEdldE1vbnRoRGF5cyh5LCBtKTsKLQkJfQotCQlkICs9IGxkYXlzOwotCX0KLQllbHNlCi0JewotCQlsZGF5cyAqPSAtMTsKLQkJeXkgPSB5OwotCQlpZiAoKChGWF9XT1JEKW0gKiAxMDAgKyBkKSA8IDMwMCkgeXkgLS07Ci0JCXlkYXlzID0gX2dBZnhHZXRZZWFyRGF5cyh5eSk7Ci0JCXdoaWxlIChsZGF5cyA+PSB5ZGF5cykKLQkJewotCQkJeSAtLTsKLQkJCWxkYXlzIC09IHlkYXlzOwotCQkJeXkgLS07Ci0JCQltZGF5cyA9IF9nQWZ4R2V0TW9udGhEYXlzKHksIG0pOwotCQkJaWYgKGQgPiBtZGF5cykKLQkJCXsKLQkJCQltICsrOwotCQkJCWQgLT0gbWRheXM7Ci0JCQl9Ci0JCQl5ZGF5cyA9IF9nQWZ4R2V0WWVhckRheXMoeXkpOwotCQl9Ci0JCXdoaWxlIChsZGF5cyA+PSBkKQotCQl7Ci0JCQlsZGF5cyAtPSBkOwotCQkJbSAtLTsKLQkJCW1kYXlzID0gX2dBZnhHZXRNb250aERheXMoeSwgbSk7Ci0JCQlkID0gbWRheXM7Ci0JCX0KLQkJZCAtPSBsZGF5czsKLQl9CisgIGxkYXlzID0gZGF5czsKKyAgaWYgKGxkYXlzID4gMCkgeworICAgIHl5ID0geTsKKyAgICBpZiAoKChGWF9XT1JEKW0gKiAxMDAgKyBkKSA+IDMwMCkKKyAgICAgIHl5Kys7CisgICAgeWRheXMgPSBfZ0FmeEdldFllYXJEYXlzKHl5KTsKKyAgICB3aGlsZSAobGRheXMgPj0geWRheXMpIHsKKyAgICAgIHkrKzsKKyAgICAgIGxkYXlzIC09IHlkYXlzOworICAgICAgeXkrKzsKKyAgICAgIG1kYXlzID0gX2dBZnhHZXRNb250aERheXMoeSwgbSk7CisgICAgICBpZiAoZCA+IG1kYXlzKSB7CisgICAgICAgIG0rKzsKKyAgICAgICAgZCAtPSBtZGF5czsKKyAgICAgIH0KKyAgICAgIHlkYXlzID0gX2dBZnhHZXRZZWFyRGF5cyh5eSk7CisgICAgfQorICAgIG1kYXlzID0gX2dBZnhHZXRNb250aERheXMoeSwgbSkgLSBkICsgMTsKKyAgICB3aGlsZSAobGRheXMgPj0gbWRheXMpIHsKKyAgICAgIGxkYXlzIC09IG1kYXlzOworICAgICAgbSsrOworICAgICAgZCA9IDE7CisgICAgICBtZGF5cyA9IF9nQWZ4R2V0TW9udGhEYXlzKHksIG0pOworICAgIH0KKyAgICBkICs9IGxkYXlzOworICB9IGVsc2UgeworICAgIGxkYXlzICo9IC0xOworICAgIHl5ID0geTsKKyAgICBpZiAoKChGWF9XT1JEKW0gKiAxMDAgKyBkKSA8IDMwMCkKKyAgICAgIHl5LS07CisgICAgeWRheXMgPSBfZ0FmeEdldFllYXJEYXlzKHl5KTsKKyAgICB3aGlsZSAobGRheXMgPj0geWRheXMpIHsKKyAgICAgIHktLTsKKyAgICAgIGxkYXlzIC09IHlkYXlzOworICAgICAgeXktLTsKKyAgICAgIG1kYXlzID0gX2dBZnhHZXRNb250aERheXMoeSwgbSk7CisgICAgICBpZiAoZCA+IG1kYXlzKSB7CisgICAgICAgIG0rKzsKKyAgICAgICAgZCAtPSBtZGF5czsKKyAgICAgIH0KKyAgICAgIHlkYXlzID0gX2dBZnhHZXRZZWFyRGF5cyh5eSk7CisgICAgfQorICAgIHdoaWxlIChsZGF5cyA+PSBkKSB7CisgICAgICBsZGF5cyAtPSBkOworICAgICAgbS0tOworICAgICAgbWRheXMgPSBfZ0FmeEdldE1vbnRoRGF5cyh5LCBtKTsKKyAgICAgIGQgPSBtZGF5czsKKyAgICB9CisgICAgZCAtPSBsZGF5czsKKyAgfQogCi0JZHQueWVhciA9IHk7Ci0JZHQubW9udGggPSBtOwotCWR0LmRheSA9IGQ7CisgIGR0LnllYXIgPSB5OworICBkdC5tb250aCA9IG07CisgIGR0LmRheSA9IGQ7CiAKLQlyZXR1cm4gKnRoaXM7CisgIHJldHVybiAqdGhpczsKIH0KIAotQ1BERlNES19EYXRlVGltZSYgQ1BERlNES19EYXRlVGltZTo6QWRkU2Vjb25kcyhpbnQgc2Vjb25kcykKLXsKLQlpZiAoc2Vjb25kcyA9PSAwKSByZXR1cm4gKnRoaXM7CitDUERGU0RLX0RhdGVUaW1lJiBDUERGU0RLX0RhdGVUaW1lOjpBZGRTZWNvbmRzKGludCBzZWNvbmRzKSB7CisgIGlmIChzZWNvbmRzID09IDApCisgICAgcmV0dXJuICp0aGlzOwogCi0JaW50CW47Ci0JaW50CWRheXM7CisgIGludCBuOworICBpbnQgZGF5czsKIAotCW4gPSBkdC5ob3VyICogMzYwMCArIGR0Lm1pbnV0ZSAqIDYwICsgZHQuc2Vjb25kICsgc2Vjb25kczsKLQlpZiAobiA8IDApCi0JewotCQlkYXlzID0gKG4gLSA4NjM5OSkgLyA4NjQwMDsKLQkJbiAtPSBkYXlzICogODY0MDA7Ci0JfQotCWVsc2UKLQl7Ci0JCWRheXMgPSBuIC8gODY0MDA7Ci0JCW4gJT0gODY0MDA7Ci0JfQotCWR0LmhvdXIgPSAoRlhfQllURSkobiAvIDM2MDApOwotCWR0LmhvdXIgJT0gMjQ7Ci0JbiAlPSAzNjAwOwotCWR0Lm1pbnV0ZSA9IChGWF9CWVRFKShuIC8gNjApOwotCWR0LnNlY29uZCA9IChGWF9CWVRFKShuICUgNjApOwotCWlmIChkYXlzICE9IDApIEFkZERheXMoZGF5cyk7CisgIG4gPSBkdC5ob3VyICogMzYwMCArIGR0Lm1pbnV0ZSAqIDYwICsgZHQuc2Vjb25kICsgc2Vjb25kczsKKyAgaWYgKG4gPCAwKSB7CisgICAgZGF5cyA9IChuIC0gODYzOTkpIC8gODY0MDA7CisgICAgbiAtPSBkYXlzICogODY0MDA7CisgIH0gZWxzZSB7CisgICAgZGF5cyA9IG4gLyA4NjQwMDsKKyAgICBuICU9IDg2NDAwOworICB9CisgIGR0LmhvdXIgPSAodWludDhfdCkobiAvIDM2MDApOworICBkdC5ob3VyICU9IDI0OworICBuICU9IDM2MDA7CisgIGR0Lm1pbnV0ZSA9ICh1aW50OF90KShuIC8gNjApOworICBkdC5zZWNvbmQgPSAodWludDhfdCkobiAlIDYwKTsKKyAgaWYgKGRheXMgIT0gMCkKKyAgICBBZGREYXlzKGRheXMpOwogCi0JcmV0dXJuICp0aGlzOworICByZXR1cm4gKnRoaXM7CiB9CiAKK0NQREZTREtfQW5ub3Q6OkNQREZTREtfQW5ub3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQorICAgIDogbV9wUGFnZVZpZXcocFBhZ2VWaWV3KSwgbV9iU2VsZWN0ZWQoRkFMU0UpLCBtX25UYWJPcmRlcigtMSkgeworfQogCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8JCQkJCQkJCUNQREZTREtfQW5ub3QJCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ1BERlNES19Bbm5vdDo6Q1BERlNES19Bbm5vdChDUERGX0Fubm90KiBwQW5ub3QsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgOgotbV9wQW5ub3QocEFubm90KSwKLW1fcFBhZ2VWaWV3KHBQYWdlVmlldyksCi1tX2JTZWxlY3RlZChGQUxTRSksCi1tX25UYWJPcmRlcigtMSkKLXsKK0NQREZTREtfQkFBbm5vdDo6Q1BERlNES19CQUFubm90KENQREZfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKKyAgICA6IENQREZTREtfQW5ub3QocFBhZ2VWaWV3KSwgbV9wQW5ub3QocEFubm90KSB7CiB9CiAKLUNQREZTREtfQW5ub3Q6On5DUERGU0RLX0Fubm90KCkKLXsKLQltX3BBbm5vdCA9IE5VTEw7Ci0JbV9wUGFnZVZpZXcgPSBOVUxMOworQ1BERl9Bbm5vdCogQ1BERlNES19CQUFubm90OjpHZXRQREZBbm5vdCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEFubm90OwogfQogCi1DUERGX0Fubm90KglDUERGU0RLX0Fubm90OjpHZXRQREZBbm5vdCgpCi17Ci0JcmV0dXJuIG1fcEFubm90OworRlhfQk9PTCBDUERGU0RLX0Fubm90OjpJc1NlbGVjdGVkKCkgeworICByZXR1cm4gbV9iU2VsZWN0ZWQ7CiB9CiAKLUZYX0RXT1JEIENQREZTREtfQW5ub3Q6OkdldEZsYWdzKCkKLXsKLQlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7Ci0JCi0JcmV0dXJuIG1fcEFubm90LT5HZXRGbGFncygpOwordm9pZCBDUERGU0RLX0Fubm90OjpTZXRTZWxlY3RlZChGWF9CT09MIGJTZWxlY3RlZCkgeworICBtX2JTZWxlY3RlZCA9IGJTZWxlY3RlZDsKIH0KIAotdm9pZCBDUERGU0RLX0Fubm90OjpTZXRQYWdlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKLXsKLQltX3BQYWdlVmlldyA9IHBQYWdlVmlldzsKKy8vIFRhYiBPcmRlcgoraW50IENQREZTREtfQW5ub3Q6OkdldFRhYk9yZGVyKCkgeworICByZXR1cm4gbV9uVGFiT3JkZXI7CiB9CiAKLUNQREZTREtfUGFnZVZpZXcqIENQREZTREtfQW5ub3Q6OkdldFBhZ2VWaWV3KCkKLXsKLQlyZXR1cm4gbV9wUGFnZVZpZXc7Cit2b2lkIENQREZTREtfQW5ub3Q6OlNldFRhYk9yZGVyKGludCBpVGFiT3JkZXIpIHsKKyAgbV9uVGFiT3JkZXIgPSBpVGFiT3JkZXI7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19Bbm5vdDo6SXNTZWxlY3RlZCgpCi17Ci0JcmV0dXJuIG1fYlNlbGVjdGVkOworQ1BERl9EaWN0aW9uYXJ5KiBDUERGU0RLX0JBQW5ub3Q6OkdldEFubm90RGljdCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKTsKIH0KIAotdm9pZCBDUERGU0RLX0Fubm90OjpTZXRTZWxlY3RlZChGWF9CT09MIGJTZWxlY3RlZCkKLXsKLQltX2JTZWxlY3RlZCA9IGJTZWxlY3RlZDsKK3ZvaWQgQ1BERlNES19CQUFubm90OjpTZXRSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdCkgeworICBBU1NFUlQocmVjdC5yaWdodCAtIHJlY3QubGVmdCA+PSBHZXRNaW5XaWR0aCgpKTsKKyAgQVNTRVJUKHJlY3QudG9wIC0gcmVjdC5ib3R0b20gPj0gR2V0TWluSGVpZ2h0KCkpOworCisgIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+U2V0QXRSZWN0KCJSZWN0IiwgcmVjdCk7CiB9CiAKLS8vIFRhYiBPcmRlcgkKLWludCBDUERGU0RLX0Fubm90OjpHZXRUYWJPcmRlcigpCi17Ci0JcmV0dXJuIG1fblRhYk9yZGVyOworQ1BERl9SZWN0IENQREZTREtfQkFBbm5vdDo6R2V0UmVjdCgpIGNvbnN0IHsKKyAgQ1BERl9SZWN0IHJlY3Q7CisgIG1fcEFubm90LT5HZXRSZWN0KHJlY3QpOworICByZXR1cm4gcmVjdDsKIH0KIAotdm9pZCBDUERGU0RLX0Fubm90OjpTZXRUYWJPcmRlcihpbnQgaVRhYk9yZGVyKQotewotCW1fblRhYk9yZGVyID0gaVRhYk9yZGVyOworQ0ZYX0J5dGVTdHJpbmcgQ1BERlNES19CQUFubm90OjpHZXRUeXBlKCkgY29uc3QgeworICByZXR1cm4gbV9wQW5ub3QtPkdldFN1YlR5cGUoKTsKIH0KIAotQ1BERl9EaWN0aW9uYXJ5KiBDUERGU0RLX0Fubm90OjpHZXRBbm5vdERpY3QoKSBjb25zdAotewotCUFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKLQkKLQlyZXR1cm4gbV9wQW5ub3QtPm1fcEFubm90RGljdDsKK0NGWF9CeXRlU3RyaW5nIENQREZTREtfQkFBbm5vdDo6R2V0U3ViVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuICIiOwogfQogCi12b2lkIENQREZTREtfQW5ub3Q6OlNldFJlY3QoY29uc3QgQ1BERl9SZWN0JiByZWN0KQotewotCUFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKLQlBU1NFUlQobV9wQW5ub3QtPm1fcEFubm90RGljdCAhPSBOVUxMKTsKLQlBU1NFUlQocmVjdC5yaWdodCAtIHJlY3QubGVmdCA+PSBHZXRNaW5XaWR0aCgpKTsKLQlBU1NFUlQocmVjdC50b3AgLSByZWN0LmJvdHRvbSA+PSBHZXRNaW5IZWlnaHQoKSk7Ci0JCi0JbV9wQW5ub3QtPm1fcEFubm90RGljdC0+U2V0QXRSZWN0KCJSZWN0IiwgcmVjdCk7Cit2b2lkIENQREZTREtfQkFBbm5vdDo6RHJhd0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKSB7CisgIG1fcEFubm90LT5EcmF3QXBwZWFyYW5jZShtX3BQYWdlVmlldy0+R2V0UERGUGFnZSgpLCBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLCBwT3B0aW9ucyk7CiB9CiAKLUNQREZfUmVjdCBDUERGU0RLX0Fubm90OjpHZXRSZWN0KCkgY29uc3QKLXsKLQlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7Ci0JCi0JQ1BERl9SZWN0IHJlY3Q7Ci0JbV9wQW5ub3QtPkdldFJlY3QocmVjdCk7Ci0JCi0JcmV0dXJuIHJlY3Q7CitGWF9CT09MIENQREZTREtfQkFBbm5vdDo6SXNBcHBlYXJhbmNlVmFsaWQoKSB7CisgIHJldHVybiBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3QoIkFQIikgIT0gTlVMTDsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BERlNES19Bbm5vdDo6R2V0VHlwZSgpIGNvbnN0Ci17Ci0JQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwotCQotCXJldHVybiBtX3BBbm5vdC0+R2V0U3ViVHlwZSgpOwotfQorRlhfQk9PTCBDUERGU0RLX0JBQW5ub3Q6OklzQXBwZWFyYW5jZVZhbGlkKENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQVAgPSBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3QoIkFQIik7CisgIGlmICghcEFQKQorICAgIHJldHVybiBGQUxTRTsKKworICAvLyBDaG9vc2UgdGhlIHJpZ2h0IHN1Yi1hcAorICBjb25zdCBGWF9DSEFSKiBhcF9lbnRyeSA9ICJOIjsKKyAgaWYgKG1vZGUgPT0gQ1BERl9Bbm5vdDo6RG93bikKKyAgICBhcF9lbnRyeSA9ICJEIjsKKyAgZWxzZSBpZiAobW9kZSA9PSBDUERGX0Fubm90OjpSb2xsb3ZlcikKKyAgICBhcF9lbnRyeSA9ICJSIjsKKyAgaWYgKCFwQVAtPktleUV4aXN0KGFwX2VudHJ5KSkKKyAgICBhcF9lbnRyeSA9ICJOIjsKIAotQ0ZYX0J5dGVTdHJpbmcgQ1BERlNES19Bbm5vdDo6R2V0U3ViVHlwZSgpIGNvbnN0Ci17Ci0JcmV0dXJuICIiOworICAvLyBHZXQgdGhlIEFQIHN0cmVhbSBvciBzdWJkaXJlY3RvcnkKKyAgQ1BERl9PYmplY3QqIHBzdWIgPSBwQVAtPkdldEVsZW1lbnRWYWx1ZShhcF9lbnRyeSk7CisgIHJldHVybiAhIXBzdWI7CiB9CiAKLXZvaWQgQ1BERlNES19Bbm5vdDo6RHJhd0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgY29uc3QgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKLQkJCQkJCQkJICAgQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSwgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykJCi17Ci0JQVNTRVJUKG1fcFBhZ2VWaWV3ICE9IE5VTEwpOwotCUFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKLQkKLQltX3BBbm5vdC0+RHJhd0FwcGVhcmFuY2UobV9wUGFnZVZpZXctPkdldFBERlBhZ2UoKSwgcERldmljZSwgcFVzZXIyRGV2aWNlLCBtb2RlLCBwT3B0aW9ucyk7Cit2b2lkIENQREZTREtfQkFBbm5vdDo6RHJhd0JvcmRlcihDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykgeworICBtX3BBbm5vdC0+RHJhd0JvcmRlcihwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHBPcHRpb25zKTsKIH0KIAotRlhfQk9PTAlDUERGU0RLX0Fubm90OjpJc0FwcGVhcmFuY2VWYWxpZCgpCi17Ci0JQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwotCUFTU0VSVChtX3BBbm5vdC0+bV9wQW5ub3REaWN0ICE9IE5VTEwpOwotCQotCXJldHVybiBtX3BBbm5vdC0+bV9wQW5ub3REaWN0LT5HZXREaWN0KCJBUCIpICE9IE5VTEw7Cit2b2lkIENQREZTREtfQkFBbm5vdDo6Q2xlYXJDYWNoZWRBUCgpIHsKKyAgbV9wQW5ub3QtPkNsZWFyQ2FjaGVkQVAoKTsKIH0KIAotRlhfQk9PTAlDUERGU0RLX0Fubm90OjpJc0FwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlKQotewotCUFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKLQlBU1NFUlQobV9wQW5ub3QtPm1fcEFubm90RGljdCAhPSBOVUxMKTsKLQkKLQlDUERGX0RpY3Rpb25hcnkqIHBBUCA9IG1fcEFubm90LT5tX3BBbm5vdERpY3QtPkdldERpY3QoIkFQIik7Ci0JaWYgKHBBUCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7Ci0JCi0JLy8gQ2hvb3NlIHRoZSByaWdodCBzdWItYXAKLQljb25zdCBGWF9DSEFSKiBhcF9lbnRyeSA9ICJOIjsKLQlpZiAobW9kZSA9PSBDUERGX0Fubm90OjpEb3duKQotCQlhcF9lbnRyeSA9ICJEIjsKLQllbHNlIGlmIChtb2RlID09IENQREZfQW5ub3Q6OlJvbGxvdmVyKQotCQlhcF9lbnRyeSA9ICJSIjsKLQlpZiAoIXBBUC0+S2V5RXhpc3QoYXBfZW50cnkpKQotCQlhcF9lbnRyeSA9ICJOIjsKLQkKLQkvLyBHZXQgdGhlIEFQIHN0cmVhbSBvciBzdWJkaXJlY3RvcnkKLQlDUERGX09iamVjdCogcHN1YiA9IHBBUC0+R2V0RWxlbWVudFZhbHVlKGFwX2VudHJ5KTsKLQlpZiAocHN1YiA9PSBOVUxMKSByZXR1cm4gRkFMU0U7Ci0JCi0JcmV0dXJuIFRSVUU7Cit2b2lkIENQREZTREtfQkFBbm5vdDo6U2V0Q29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNDb250ZW50cykgeworICBpZiAoc0NvbnRlbnRzLklzRW1wdHkoKSkKKyAgICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlJlbW92ZUF0KCJDb250ZW50cyIpOworICBlbHNlCisgICAgbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXRBdFN0cmluZygiQ29udGVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERGX0VuY29kZVRleHQoc0NvbnRlbnRzKSk7CiB9CiAKLXZvaWQgQ1BERlNES19Bbm5vdDo6RHJhd0JvcmRlcihDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBjb25zdCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlLAotCQkJCQkJICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykKLXsKLQlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7Ci0JbV9wQW5ub3QtPkRyYXdCb3JkZXIocERldmljZSwgcFVzZXIyRGV2aWNlLCBwT3B0aW9ucyk7IAorQ0ZYX1dpZGVTdHJpbmcgQ1BERlNES19CQUFubm90OjpHZXRDb250ZW50cygpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0VW5pY29kZVRleHQoIkNvbnRlbnRzIik7CiB9CiAKLXZvaWQgQ1BERlNES19Bbm5vdDo6Q2xlYXJDYWNoZWRBUCgpCi17Ci0JQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwotCW1fcEFubm90LT5DbGVhckNhY2hlZEFQKCk7Ci19ICAgIAotCi12b2lkIENQREZTREtfQW5ub3Q6OlNldENvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzQ29udGVudHMpCi17Ci0JQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwotCUFTU0VSVChtX3BBbm5vdC0+bV9wQW5ub3REaWN0ICE9IE5VTEwpOwotCQotCWlmIChzQ29udGVudHMuSXNFbXB0eSgpKQotCQltX3BBbm5vdC0+bV9wQW5ub3REaWN0LT5SZW1vdmVBdCgiQ29udGVudHMiKTsKLQllbHNlCi0JCW1fcEFubm90LT5tX3BBbm5vdERpY3QtPlNldEF0U3RyaW5nKCJDb250ZW50cyIsIFBERl9FbmNvZGVUZXh0KHNDb250ZW50cykpOwordm9pZCBDUERGU0RLX0JBQW5ub3Q6OlNldEFubm90TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc05hbWUpIHsKKyAgaWYgKHNOYW1lLklzRW1wdHkoKSkKKyAgICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlJlbW92ZUF0KCJOTSIpOworICBlbHNlCisgICAgbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXRBdFN0cmluZygiTk0iLCBQREZfRW5jb2RlVGV4dChzTmFtZSkpOwogfQogCi1DRlhfV2lkZVN0cmluZyBDUERGU0RLX0Fubm90OjpHZXRDb250ZW50cygpIGNvbnN0Ci17Ci0JQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwotCUFTU0VSVChtX3BBbm5vdC0+bV9wQW5ub3REaWN0ICE9IE5VTEwpOwotCQotCXJldHVybiBtX3BBbm5vdC0+bV9wQW5ub3REaWN0LT5HZXRVbmljb2RlVGV4dCgiQ29udGVudHMiKTsKK0NGWF9XaWRlU3RyaW5nIENQREZTREtfQkFBbm5vdDo6R2V0QW5ub3ROYW1lKCkgY29uc3QgeworICByZXR1cm4gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXRVbmljb2RlVGV4dCgiTk0iKTsKIH0KIAotdm9pZCBDUERGU0RLX0Fubm90OjpTZXRBbm5vdE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNOYW1lKQotewotCUFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKLQlBU1NFUlQobV9wQW5ub3QtPm1fcEFubm90RGljdCAhPSBOVUxMKTsKLQkKLQlpZiAoc05hbWUuSXNFbXB0eSgpKQotCQltX3BBbm5vdC0+bV9wQW5ub3REaWN0LT5SZW1vdmVBdCgiTk0iKTsKLQllbHNlCi0JCW1fcEFubm90LT5tX3BBbm5vdERpY3QtPlNldEF0U3RyaW5nKCJOTSIsIFBERl9FbmNvZGVUZXh0KHNOYW1lKSk7Ci19Cit2b2lkIENQREZTREtfQkFBbm5vdDo6U2V0TW9kaWZpZWREYXRlKGNvbnN0IEZYX1NZU1RFTVRJTUUmIHN0KSB7CisgIENQREZTREtfRGF0ZVRpbWUgZHQoc3QpOworICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBkdC5Ub1BERkRhdGVUaW1lU3RyaW5nKCk7CiAKLUNGWF9XaWRlU3RyaW5nIENQREZTREtfQW5ub3Q6OkdldEFubm90TmFtZSgpIGNvbnN0Ci17Ci0JQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwotCUFTU0VSVChtX3BBbm5vdC0+bV9wQW5ub3REaWN0ICE9IE5VTEwpOwotCQotCXJldHVybiBtX3BBbm5vdC0+bV9wQW5ub3REaWN0LT5HZXRVbmljb2RlVGV4dCgiTk0iKTsKKyAgaWYgKHN0ci5Jc0VtcHR5KCkpCisgICAgbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5SZW1vdmVBdCgiTSIpOworICBlbHNlCisgICAgbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXRBdFN0cmluZygiTSIsIHN0cik7CiB9CiAKLXZvaWQgQ1BERlNES19Bbm5vdDo6U2V0TW9kaWZpZWREYXRlKGNvbnN0IEZYX1NZU1RFTVRJTUUmIHN0KQotewotCUFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKLQlBU1NFUlQobV9wQW5ub3QtPm1fcEFubm90RGljdCAhPSBOVUxMKTsKLQkKLQlDUERGU0RLX0RhdGVUaW1lIGR0KHN0KTsKLQlDRlhfQnl0ZVN0cmluZyBzdHIgPSBkdC5Ub1BERkRhdGVUaW1lU3RyaW5nKCk7Ci0JCi0JaWYgKHN0ci5Jc0VtcHR5KCkpCi0JCW1fcEFubm90LT5tX3BBbm5vdERpY3QtPlJlbW92ZUF0KCJNIik7Ci0JZWxzZQotCQltX3BBbm5vdC0+bV9wQW5ub3REaWN0LT5TZXRBdFN0cmluZygiTSIsIHN0cik7Ci19CitGWF9TWVNURU1USU1FIENQREZTREtfQkFBbm5vdDo6R2V0TW9kaWZpZWREYXRlKCkgY29uc3QgeworICBGWF9TWVNURU1USU1FIHN5c3RpbWU7CisgIENGWF9CeXRlU3RyaW5nIHN0ciA9IG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0U3RyaW5nKCJNIik7CisKKyAgQ1BERlNES19EYXRlVGltZSBkdChzdHIpOworICBkdC5Ub1N5c3RlbVRpbWUoc3lzdGltZSk7CiAKLUZYX1NZU1RFTVRJTUUgQ1BERlNES19Bbm5vdDo6R2V0TW9kaWZpZWREYXRlKCkgY29uc3QKLXsKLQlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7Ci0JQVNTRVJUKG1fcEFubm90LT5tX3BBbm5vdERpY3QgIT0gTlVMTCk7Ci0JCi0JRlhfU1lTVEVNVElNRSBzeXN0aW1lOwkKLQlDRlhfQnl0ZVN0cmluZyBzdHIgPSBtX3BBbm5vdC0+bV9wQW5ub3REaWN0LT5HZXRTdHJpbmcoIk0iKTsKLQkKLSAJQ1BERlNES19EYXRlVGltZSBkdChzdHIpOwotIAlkdC5Ub1N5c3RlbVRpbWUoc3lzdGltZSk7Ci0JCi0JcmV0dXJuIHN5c3RpbWU7CisgIHJldHVybiBzeXN0aW1lOwogfQogCi12b2lkIENQREZTREtfQW5ub3Q6OlNldEZsYWdzKGludCBuRmxhZ3MpCi17Ci0JQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwotCUFTU0VSVChtX3BBbm5vdC0+bV9wQW5ub3REaWN0ICE9IE5VTEwpOwotCQotCW1fcEFubm90LT5tX3BBbm5vdERpY3QtPlNldEF0SW50ZWdlcigiRiIsIG5GbGFncyk7Cit2b2lkIENQREZTREtfQkFBbm5vdDo6U2V0RmxhZ3MoaW50IG5GbGFncykgeworICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlNldEF0SW50ZWdlcigiRiIsIG5GbGFncyk7CiB9CiAKLWludCBDUERGU0RLX0Fubm90OjpHZXRGbGFncygpIGNvbnN0Ci17Ci0JQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwotCUFTU0VSVChtX3BBbm5vdC0+bV9wQW5ub3REaWN0ICE9IE5VTEwpOwotCQotCXJldHVybiBtX3BBbm5vdC0+bV9wQW5ub3REaWN0LT5HZXRJbnRlZ2VyKCJGIik7CitpbnQgQ1BERlNES19CQUFubm90OjpHZXRGbGFncygpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0SW50ZWdlcigiRiIpOwogfQogCi12b2lkIENQREZTREtfQW5ub3Q6OlNldEFwcFN0YXRlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpCi17Ci0JQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwotCUFTU0VSVChtX3BBbm5vdC0+bV9wQW5ub3REaWN0ICE9IE5VTEwpOwotCi0JaWYgKHN0ci5Jc0VtcHR5KCkpCi0JCW1fcEFubm90LT5tX3BBbm5vdERpY3QtPlJlbW92ZUF0KCJBUyIpOwotCWVsc2UKLQkJbV9wQW5ub3QtPm1fcEFubm90RGljdC0+U2V0QXRTdHJpbmcoIkFTIiwgc3RyKTsKK3ZvaWQgQ1BERlNES19CQUFubm90OjpTZXRBcHBTdGF0ZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKSB7CisgIGlmIChzdHIuSXNFbXB0eSgpKQorICAgIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+UmVtb3ZlQXQoIkFTIik7CisgIGVsc2UKKyAgICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlNldEF0U3RyaW5nKCJBUyIsIHN0cik7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQREZTREtfQW5ub3Q6OkdldEFwcFN0YXRlKCkgY29uc3QKLXsKLQlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7Ci0JQVNTRVJUKG1fcEFubm90LT5tX3BBbm5vdERpY3QgIT0gTlVMTCk7Ci0KLQlyZXR1cm4gbV9wQW5ub3QtPm1fcEFubm90RGljdC0+R2V0U3RyaW5nKCJBUyIpOworQ0ZYX0J5dGVTdHJpbmcgQ1BERlNES19CQUFubm90OjpHZXRBcHBTdGF0ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0U3RyaW5nKCJBUyIpOwogfQogCi12b2lkIENQREZTREtfQW5ub3Q6OlNldFN0cnVjdFBhcmVudChpbnQga2V5KQotewotCUFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKLQlBU1NFUlQobV9wQW5ub3QtPm1fcEFubm90RGljdCAhPSBOVUxMKTsKLQkKLQltX3BBbm5vdC0+bV9wQW5ub3REaWN0LT5TZXRBdEludGVnZXIoIlN0cnVjdFBhcmVudCIsIGtleSk7Cit2b2lkIENQREZTREtfQkFBbm5vdDo6U2V0U3RydWN0UGFyZW50KGludCBrZXkpIHsKKyAgbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXRBdEludGVnZXIoIlN0cnVjdFBhcmVudCIsIGtleSk7CiB9CiAKLWludAlDUERGU0RLX0Fubm90OjpHZXRTdHJ1Y3RQYXJlbnQoKSBjb25zdAotewotCUFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKLQlBU1NFUlQobV9wQW5ub3QtPm1fcEFubm90RGljdCAhPSBOVUxMKTsKLQkKLQlyZXR1cm4gbV9wQW5ub3QtPm1fcEFubm90RGljdC0+R2V0SW50ZWdlcigiU3RydWN0UGFyZW50Iik7CitpbnQgQ1BERlNES19CQUFubm90OjpHZXRTdHJ1Y3RQYXJlbnQoKSBjb25zdCB7CisgIHJldHVybiBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldEludGVnZXIoIlN0cnVjdFBhcmVudCIpOwogfQogCi0vL2JvcmRlcgotdm9pZCBDUERGU0RLX0Fubm90OjpTZXRCb3JkZXJXaWR0aChpbnQgbldpZHRoKQotewotCUFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKLQlBU1NFUlQobV9wQW5ub3QtPm1fcEFubm90RGljdCAhPSBOVUxMKTsKKy8vIGJvcmRlcgordm9pZCBDUERGU0RLX0JBQW5ub3Q6OlNldEJvcmRlcldpZHRoKGludCBuV2lkdGgpIHsKKyAgQ1BERl9BcnJheSogcEJvcmRlciA9IG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0QXJyYXkoIkJvcmRlciIpOwogCi0JQ1BERl9BcnJheSogcEJvcmRlciA9IG1fcEFubm90LT5tX3BBbm5vdERpY3QtPkdldEFycmF5KCJCb3JkZXIiKTsKKyAgaWYgKHBCb3JkZXIpIHsKKyAgICBwQm9yZGVyLT5TZXRBdCgyLCBuZXcgQ1BERl9OdW1iZXIobldpZHRoKSk7CisgIH0gZWxzZSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQlNEaWN0ID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXREaWN0KCJCUyIpOwogCi0JaWYgKHBCb3JkZXIpCi0JewotCQlwQm9yZGVyLT5TZXRBdCgyLCBuZXcgQ1BERl9OdW1iZXIobldpZHRoKSk7Ci0JfQotCWVsc2UKLQl7Ci0JCUNQREZfRGljdGlvbmFyeSogcEJTRGljdCA9IG1fcEFubm90LT5tX3BBbm5vdERpY3QtPkdldERpY3QoIkJTIik7CisgICAgaWYgKCFwQlNEaWN0KSB7CisgICAgICBwQlNEaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgICAgIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+U2V0QXQoIkJTIiwgcEJTRGljdCk7CisgICAgfQogCi0JCWlmICghcEJTRGljdCkKLQkJewotCQkJcEJTRGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7Ci0JCQltX3BBbm5vdC0+bV9wQW5ub3REaWN0LT5TZXRBdCgiQlMiLCBwQlNEaWN0KTsKLQkJfQorICAgIHBCU0RpY3QtPlNldEF0SW50ZWdlcigiVyIsIG5XaWR0aCk7CisgIH0KK30KIAotCQlwQlNEaWN0LT5TZXRBdEludGVnZXIoIlciLCBuV2lkdGgpOwotCX0KK2ludCBDUERGU0RLX0JBQW5ub3Q6OkdldEJvcmRlcldpZHRoKCkgY29uc3QgeworICBpZiAoQ1BERl9BcnJheSogcEJvcmRlciA9IG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0QXJyYXkoIkJvcmRlciIpKSB7CisgICAgcmV0dXJuIHBCb3JkZXItPkdldEludGVnZXIoMik7CisgIH0KKyAgaWYgKENQREZfRGljdGlvbmFyeSogcEJTRGljdCA9IG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0RGljdCgiQlMiKSkgeworICAgIHJldHVybiBwQlNEaWN0LT5HZXRJbnRlZ2VyKCJXIiwgMSk7CisgIH0KKyAgcmV0dXJuIDE7CiB9CiAKLWludAlDUERGU0RLX0Fubm90OjpHZXRCb3JkZXJXaWR0aCgpIGNvbnN0Ci17Ci0JQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwotCUFTU0VSVChtX3BBbm5vdC0+bV9wQW5ub3REaWN0ICE9IE5VTEwpOwordm9pZCBDUERGU0RLX0JBQW5ub3Q6OlNldEJvcmRlclN0eWxlKGludCBuU3R5bGUpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQlNEaWN0ID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXREaWN0KCJCUyIpOworICBpZiAoIXBCU0RpY3QpIHsKKyAgICBwQlNEaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlNldEF0KCJCUyIsIHBCU0RpY3QpOworICB9CiAKLQlDUERGX0FycmF5KiBwQm9yZGVyID0gbV9wQW5ub3QtPm1fcEFubm90RGljdC0+R2V0QXJyYXkoIkJvcmRlciIpOwotCi0JaWYgKHBCb3JkZXIpCi0JewotCQlyZXR1cm4gcEJvcmRlci0+R2V0SW50ZWdlcigyKTsKLQl9Ci0JZWxzZQotCXsKLQkJQ1BERl9EaWN0aW9uYXJ5KiBwQlNEaWN0ID0gbV9wQW5ub3QtPm1fcEFubm90RGljdC0+R2V0RGljdCgiQlMiKTsKLQotCQlpZiAocEJTRGljdCkKLQkJewotCQkJcmV0dXJuIHBCU0RpY3QtPkdldEludGVnZXIoIlciLCAxKTsKLQkJfQotCX0KLQlyZXR1cm4gMTsKKyAgc3dpdGNoIChuU3R5bGUpIHsKKyAgICBjYXNlIEJCU19TT0xJRDoKKyAgICAgIHBCU0RpY3QtPlNldEF0TmFtZSgiUyIsICJTIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJCU19EQVNIOgorICAgICAgcEJTRGljdC0+U2V0QXROYW1lKCJTIiwgIkQiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQkJTX0JFVkVMRUQ6CisgICAgICBwQlNEaWN0LT5TZXRBdE5hbWUoIlMiLCAiQiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCQlNfSU5TRVQ6CisgICAgICBwQlNEaWN0LT5TZXRBdE5hbWUoIlMiLCAiSSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCQlNfVU5ERVJMSU5FOgorICAgICAgcEJTRGljdC0+U2V0QXROYW1lKCJTIiwgIlUiKTsKKyAgICAgIGJyZWFrOworICB9CiB9CiAKLXZvaWQgQ1BERlNES19Bbm5vdDo6U2V0Qm9yZGVyU3R5bGUoaW50IG5TdHlsZSkKLXsKLQlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7Ci0JQVNTRVJUKG1fcEFubm90LT5tX3BBbm5vdERpY3QgIT0gTlVMTCk7CitpbnQgQ1BERlNES19CQUFubm90OjpHZXRCb3JkZXJTdHlsZSgpIGNvbnN0IHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQlNEaWN0ID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXREaWN0KCJCUyIpOworICBpZiAocEJTRGljdCkgeworICAgIENGWF9CeXRlU3RyaW5nIHNCb3JkZXJTdHlsZSA9IHBCU0RpY3QtPkdldFN0cmluZygiUyIsICJTIik7CisgICAgaWYgKHNCb3JkZXJTdHlsZSA9PSAiUyIpCisgICAgICByZXR1cm4gQkJTX1NPTElEOworICAgIGlmIChzQm9yZGVyU3R5bGUgPT0gIkQiKQorICAgICAgcmV0dXJuIEJCU19EQVNIOworICAgIGlmIChzQm9yZGVyU3R5bGUgPT0gIkIiKQorICAgICAgcmV0dXJuIEJCU19CRVZFTEVEOworICAgIGlmIChzQm9yZGVyU3R5bGUgPT0gIkkiKQorICAgICAgcmV0dXJuIEJCU19JTlNFVDsKKyAgICBpZiAoc0JvcmRlclN0eWxlID09ICJVIikKKyAgICAgIHJldHVybiBCQlNfVU5ERVJMSU5FOworICB9CiAKLQlDUERGX0RpY3Rpb25hcnkqIHBCU0RpY3QgPSBtX3BBbm5vdC0+bV9wQW5ub3REaWN0LT5HZXREaWN0KCJCUyIpOwotCWlmICghcEJTRGljdCkKLQl7Ci0JCXBCU0RpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotCQltX3BBbm5vdC0+bV9wQW5ub3REaWN0LT5TZXRBdCgiQlMiLCBwQlNEaWN0KTsKLQl9CisgIENQREZfQXJyYXkqIHBCb3JkZXIgPSBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldEFycmF5KCJCb3JkZXIiKTsKKyAgaWYgKHBCb3JkZXIpIHsKKyAgICBpZiAocEJvcmRlci0+R2V0Q291bnQoKSA+PSA0KSB7CisgICAgICBDUERGX0FycmF5KiBwRFAgPSBwQm9yZGVyLT5HZXRBcnJheSgzKTsKKyAgICAgIGlmIChwRFAgJiYgcERQLT5HZXRDb3VudCgpID4gMCkKKyAgICAgICAgcmV0dXJuIEJCU19EQVNIOworICAgIH0KKyAgfQogCi0Jc3dpdGNoIChuU3R5bGUpCi0JewotCWNhc2UgQkJTX1NPTElEOgotCQlwQlNEaWN0LT5TZXRBdE5hbWUoIlMiLCAiUyIpOwotCQlicmVhazsKLQljYXNlIEJCU19EQVNIOgotCQlwQlNEaWN0LT5TZXRBdE5hbWUoIlMiLCAiRCIpOwotCQlicmVhazsKLQljYXNlIEJCU19CRVZFTEVEOgotCQlwQlNEaWN0LT5TZXRBdE5hbWUoIlMiLCAiQiIpOwotCQlicmVhazsKLQljYXNlIEJCU19JTlNFVDoKLQkJcEJTRGljdC0+U2V0QXROYW1lKCJTIiwgIkkiKTsKLQkJYnJlYWs7Ci0JY2FzZSBCQlNfVU5ERVJMSU5FOgotCQlwQlNEaWN0LT5TZXRBdE5hbWUoIlMiLCAiVSIpOwotCQlicmVhazsKLQl9CisgIHJldHVybiBCQlNfU09MSUQ7CiB9CiAKLWludAlDUERGU0RLX0Fubm90OjpHZXRCb3JkZXJTdHlsZSgpIGNvbnN0Ci17Ci0JQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwotCUFTU0VSVChtX3BBbm5vdC0+bV9wQW5ub3REaWN0ICE9IE5VTEwpOwotCi0JQ1BERl9EaWN0aW9uYXJ5KiBwQlNEaWN0ID0gbV9wQW5ub3QtPm1fcEFubm90RGljdC0+R2V0RGljdCgiQlMiKTsKLQlpZiAocEJTRGljdCkKLQl7Ci0JCUNGWF9CeXRlU3RyaW5nIHNCb3JkZXJTdHlsZSA9IHBCU0RpY3QtPkdldFN0cmluZygiUyIsICJTIik7Ci0JCWlmIChzQm9yZGVyU3R5bGUgPT0gIlMiKSByZXR1cm4gQkJTX1NPTElEOwotCQlpZiAoc0JvcmRlclN0eWxlID09ICJEIikgcmV0dXJuIEJCU19EQVNIOwotCQlpZiAoc0JvcmRlclN0eWxlID09ICJCIikgcmV0dXJuIEJCU19CRVZFTEVEOwotCQlpZiAoc0JvcmRlclN0eWxlID09ICJJIikgcmV0dXJuIEJCU19JTlNFVDsKLQkJaWYgKHNCb3JkZXJTdHlsZSA9PSAiVSIpIHJldHVybiBCQlNfVU5ERVJMSU5FOwotCX0KK3ZvaWQgQ1BERlNES19CQUFubm90OjpTZXRCb3JkZXJEYXNoKGNvbnN0IENGWF9JbnRBcnJheSYgYXJyYXkpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQlNEaWN0ID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXREaWN0KCJCUyIpOworICBpZiAoIXBCU0RpY3QpIHsKKyAgICBwQlNEaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlNldEF0KCJCUyIsIHBCU0RpY3QpOworICB9CiAKLQlDUERGX0FycmF5KiBwQm9yZGVyID0gbV9wQW5ub3QtPm1fcEFubm90RGljdC0+R2V0QXJyYXkoIkJvcmRlciIpOwotCWlmIChwQm9yZGVyKQotCXsKLQkJaWYgKHBCb3JkZXItPkdldENvdW50KCkgPj0gNCkgCi0JCXsgCi0JCQlDUERGX0FycmF5ICpwRFAgPSBwQm9yZGVyLT5HZXRBcnJheSgzKTsKLQkJCWlmIChwRFAgJiYgcERQLT5HZXRDb3VudCgpID4gMCkKLQkJCQlyZXR1cm4gQkJTX0RBU0g7Ci0JCX0KLQl9CisgIENQREZfQXJyYXkqIHBBcnJheSA9IG5ldyBDUERGX0FycmF5OworICBmb3IgKGludCBpID0gMCwgc3ogPSBhcnJheS5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgcEFycmF5LT5BZGRJbnRlZ2VyKGFycmF5W2ldKTsKKyAgfQogCi0JcmV0dXJuIEJCU19TT0xJRDsKKyAgcEJTRGljdC0+U2V0QXQoIkQiLCBwQXJyYXkpOwogfQogCi12b2lkIENQREZTREtfQW5ub3Q6OlNldEJvcmRlckRhc2goY29uc3QgQ0ZYX0ludEFycmF5JiBhcnJheSkKLXsKLQlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7Ci0JQVNTRVJUKG1fcEFubm90LT5tX3BBbm5vdERpY3QgIT0gTlVMTCk7Cit2b2lkIENQREZTREtfQkFBbm5vdDo6R2V0Qm9yZGVyRGFzaChDRlhfSW50QXJyYXkmIGFycmF5KSBjb25zdCB7CisgIENQREZfQXJyYXkqIHBEYXNoID0gTlVMTDsKIAotCUNQREZfRGljdGlvbmFyeSogcEJTRGljdCA9IG1fcEFubm90LT5tX3BBbm5vdERpY3QtPkdldERpY3QoIkJTIik7Ci0JaWYgKCFwQlNEaWN0KQotCXsKLQkJcEJTRGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7Ci0JCW1fcEFubm90LT5tX3BBbm5vdERpY3QtPlNldEF0KCJCUyIsIHBCU0RpY3QpOwotCX0KKyAgQ1BERl9BcnJheSogcEJvcmRlciA9IG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0QXJyYXkoIkJvcmRlciIpOworICBpZiAocEJvcmRlcikgeworICAgIHBEYXNoID0gcEJvcmRlci0+R2V0QXJyYXkoMyk7CisgIH0gZWxzZSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQlNEaWN0ID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXREaWN0KCJCUyIpOworICAgIGlmIChwQlNEaWN0KSB7CisgICAgICBwRGFzaCA9IHBCU0RpY3QtPkdldEFycmF5KCJEIik7CisgICAgfQorICB9CiAKLQlDUERGX0FycmF5KiBwQXJyYXkgPSBuZXcgQ1BERl9BcnJheTsKLQlmb3IgKGludCBpPTAsc3o9YXJyYXkuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JewotCQlwQXJyYXktPkFkZEludGVnZXIoYXJyYXlbaV0pOwotCX0KKyAgaWYgKHBEYXNoKSB7CisgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gcERhc2gtPkdldENvdW50KCk7IGkgPCBzejsgaSsrKSB7CisgICAgICBhcnJheS5BZGQocERhc2gtPkdldEludGVnZXIoaSkpOworICAgIH0KKyAgfQorfQogCi0JcEJTRGljdC0+U2V0QXQoIkQiLCBwQXJyYXkpOwordm9pZCBDUERGU0RLX0JBQW5ub3Q6OlNldENvbG9yKEZYX0NPTE9SUkVGIGNvbG9yKSB7CisgIENQREZfQXJyYXkqIHBBcnJheSA9IG5ldyBDUERGX0FycmF5OworICBwQXJyYXktPkFkZE51bWJlcigoRlhfRkxPQVQpRlhTWVNfR2V0UlZhbHVlKGNvbG9yKSAvIDI1NS4wZik7CisgIHBBcnJheS0+QWRkTnVtYmVyKChGWF9GTE9BVClGWFNZU19HZXRHVmFsdWUoY29sb3IpIC8gMjU1LjBmKTsKKyAgcEFycmF5LT5BZGROdW1iZXIoKEZYX0ZMT0FUKUZYU1lTX0dldEJWYWx1ZShjb2xvcikgLyAyNTUuMGYpOworICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlNldEF0KCJDIiwgcEFycmF5KTsKIH0KIAotdm9pZCBDUERGU0RLX0Fubm90OjpHZXRCb3JkZXJEYXNoKENGWF9JbnRBcnJheSYgYXJyYXkpIGNvbnN0Ci17Ci0JQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwotCUFTU0VSVChtX3BBbm5vdC0+bV9wQW5ub3REaWN0ICE9IE5VTEwpOwordm9pZCBDUERGU0RLX0JBQW5ub3Q6OlJlbW92ZUNvbG9yKCkgeworICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlJlbW92ZUF0KCJDIik7Cit9CiAKLQlDUERGX0FycmF5KiBwRGFzaCA9IE5VTEw7CitGWF9CT09MIENQREZTREtfQkFBbm5vdDo6R2V0Q29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdCB7CisgIGlmIChDUERGX0FycmF5KiBwRW50cnkgPSBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldEFycmF5KCJDIikpIHsKKyAgICBpbnQgbkNvdW50ID0gcEVudHJ5LT5HZXRDb3VudCgpOworICAgIGlmIChuQ291bnQgPT0gMSkgeworICAgICAgRlhfRkxPQVQgZyA9IHBFbnRyeS0+R2V0TnVtYmVyKDApICogMjU1OwogCi0JQ1BERl9BcnJheSogcEJvcmRlciA9IG1fcEFubm90LT5tX3BBbm5vdERpY3QtPkdldEFycmF5KCJCb3JkZXIiKTsKLQlpZiAocEJvcmRlcikKLQl7Ci0JCXBEYXNoID0gcEJvcmRlci0+R2V0QXJyYXkoMyk7Ci0JfQotCWVsc2UKLQl7Ci0JCUNQREZfRGljdGlvbmFyeSogcEJTRGljdCA9IG1fcEFubm90LT5tX3BBbm5vdERpY3QtPkdldERpY3QoIkJTIik7Ci0JCWlmIChwQlNEaWN0KQotCQl7Ci0JCQlwRGFzaCA9IHBCU0RpY3QtPkdldEFycmF5KCJEIik7Ci0JCX0KLQl9CisgICAgICBjb2xvciA9IEZYU1lTX1JHQigoaW50KWcsIChpbnQpZywgKGludClnKTsKIAotCWlmIChwRGFzaCkKLQl7Ci0JCWZvciAoaW50IGk9MCxzej1wRGFzaC0+R2V0Q291bnQoKTsgaTxzejsgaSsrKQotCQl7Ci0JCQlhcnJheS5BZGQocERhc2gtPkdldEludGVnZXIoaSkpOwotCQl9Ci0JfQotfQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfSBlbHNlIGlmIChuQ291bnQgPT0gMykgeworICAgICAgRlhfRkxPQVQgciA9IHBFbnRyeS0+R2V0TnVtYmVyKDApICogMjU1OworICAgICAgRlhfRkxPQVQgZyA9IHBFbnRyeS0+R2V0TnVtYmVyKDEpICogMjU1OworICAgICAgRlhfRkxPQVQgYiA9IHBFbnRyeS0+R2V0TnVtYmVyKDIpICogMjU1OwogCi12b2lkIENQREZTREtfQW5ub3Q6OlNldENvbG9yKEZYX0NPTE9SUkVGIGNvbG9yKQotewotCUFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKLQlBU1NFUlQobV9wQW5ub3QtPm1fcEFubm90RGljdCAhPSBOVUxMKTsKKyAgICAgIGNvbG9yID0gRlhTWVNfUkdCKChpbnQpciwgKGludClnLCAoaW50KWIpOwogCi0JQ1BERl9BcnJheSogcEFycmF5ID0gbmV3IENQREZfQXJyYXk7Ci0JcEFycmF5LT5BZGROdW1iZXIoKEZYX0ZMT0FUKUZYU1lTX0dldFJWYWx1ZShjb2xvcikgLyAyNTUuMGYpOwotCXBBcnJheS0+QWRkTnVtYmVyKChGWF9GTE9BVClGWFNZU19HZXRHVmFsdWUoY29sb3IpIC8gMjU1LjBmKTsKLQlwQXJyYXktPkFkZE51bWJlcigoRlhfRkxPQVQpRlhTWVNfR2V0QlZhbHVlKGNvbG9yKSAvIDI1NS4wZik7Ci0JbV9wQW5ub3QtPm1fcEFubm90RGljdC0+U2V0QXQoIkMiLCBwQXJyYXkpOwotfQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfSBlbHNlIGlmIChuQ291bnQgPT0gNCkgeworICAgICAgRlhfRkxPQVQgYyA9IHBFbnRyeS0+R2V0TnVtYmVyKDApOworICAgICAgRlhfRkxPQVQgbSA9IHBFbnRyeS0+R2V0TnVtYmVyKDEpOworICAgICAgRlhfRkxPQVQgeSA9IHBFbnRyeS0+R2V0TnVtYmVyKDIpOworICAgICAgRlhfRkxPQVQgayA9IHBFbnRyeS0+R2V0TnVtYmVyKDMpOwogCi12b2lkIENQREZTREtfQW5ub3Q6OlJlbW92ZUNvbG9yKCkKLXsKLQlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7Ci0JQVNTRVJUKG1fcEFubm90LT5tX3BBbm5vdERpY3QgIT0gTlVMTCk7CisgICAgICBGWF9GTE9BVCByID0gMS4wZiAtIHN0ZDo6bWluKDEuMGYsIGMgKyBrKTsKKyAgICAgIEZYX0ZMT0FUIGcgPSAxLjBmIC0gc3RkOjptaW4oMS4wZiwgbSArIGspOworICAgICAgRlhfRkxPQVQgYiA9IDEuMGYgLSBzdGQ6Om1pbigxLjBmLCB5ICsgayk7CiAKLQltX3BBbm5vdC0+bV9wQW5ub3REaWN0LT5SZW1vdmVBdCgiQyIpIDsgCi19CisgICAgICBjb2xvciA9IEZYU1lTX1JHQigoaW50KShyICogMjU1KSwgKGludCkoZyAqIDI1NSksIChpbnQpKGIgKiAyNTUpKTsKIAotRlhfQk9PTCBDUERGU0RLX0Fubm90OjpHZXRDb2xvcihGWF9DT0xPUlJFRiYgY29sb3IpIGNvbnN0Ci17Ci0JQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwotCUFTU0VSVChtX3BBbm5vdC0+bV9wQW5ub3REaWN0ICE9IE5VTEwpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CiAKLQlpZiAoQ1BERl9BcnJheSogcEVudHJ5ID0gbV9wQW5ub3QtPm1fcEFubm90RGljdC0+R2V0QXJyYXkoIkMiKSkJCQotCXsKLQkJaW50IG5Db3VudCA9IHBFbnRyeS0+R2V0Q291bnQoKTsKLQkJaWYgKG5Db3VudCA9PSAxKQotCQl7Ci0JCQlGWF9GTE9BVCBnID0gcEVudHJ5LT5HZXROdW1iZXIoMCkgKiAyNTU7CisgIHJldHVybiBGQUxTRTsKK30KIAotCQkJY29sb3IgPSBGWFNZU19SR0IoKGludClnLCAoaW50KWcsIChpbnQpZyk7Cit2b2lkIENQREZTREtfQkFBbm5vdDo6V3JpdGVBcHBlYXJhbmNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQVBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJjQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0NvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0FQU3RhdGUpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQVBEaWN0ID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXREaWN0KCJBUCIpOwogCi0JCQlyZXR1cm4gVFJVRTsKLQkJfQotCQllbHNlIGlmIChuQ291bnQgPT0gMykKLQkJewotCQkJRlhfRkxPQVQgciA9IHBFbnRyeS0+R2V0TnVtYmVyKDApICogMjU1OwotCQkJRlhfRkxPQVQgZyA9IHBFbnRyeS0+R2V0TnVtYmVyKDEpICogMjU1OwotCQkJRlhfRkxPQVQgYiA9IHBFbnRyeS0+R2V0TnVtYmVyKDIpICogMjU1OworICBpZiAoIXBBUERpY3QpIHsKKyAgICBwQVBEaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlNldEF0KCJBUCIsIHBBUERpY3QpOworICB9CiAKLQkJCWNvbG9yID0gRlhTWVNfUkdCKChpbnQpciwgKGludClnLCAoaW50KWIpOworICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IG51bGxwdHI7CisgIENQREZfRGljdGlvbmFyeSogcFBhcmVudERpY3QgPSBudWxscHRyOwogCi0JCQlyZXR1cm4gVFJVRTsKLQkJfQotCQllbHNlIGlmIChuQ291bnQgPT0gNCkKLQkJewotCQkJRlhfRkxPQVQgYyA9IHBFbnRyeS0+R2V0TnVtYmVyKDApOwotCQkJRlhfRkxPQVQgbSA9IHBFbnRyeS0+R2V0TnVtYmVyKDEpOwotCQkJRlhfRkxPQVQgeSA9IHBFbnRyeS0+R2V0TnVtYmVyKDIpOwotCQkJRlhfRkxPQVQgayA9IHBFbnRyeS0+R2V0TnVtYmVyKDMpOworICBpZiAoc0FQU3RhdGUuSXNFbXB0eSgpKSB7CisgICAgcFBhcmVudERpY3QgPSBwQVBEaWN0OworICAgIHBTdHJlYW0gPSBwQVBEaWN0LT5HZXRTdHJlYW0oc0FQVHlwZSk7CisgIH0gZWxzZSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQVBUeXBlRGljdCA9IHBBUERpY3QtPkdldERpY3Qoc0FQVHlwZSk7CisgICAgaWYgKCFwQVBUeXBlRGljdCkgeworICAgICAgcEFQVHlwZURpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICAgICAgcEFQRGljdC0+U2V0QXQoc0FQVHlwZSwgcEFQVHlwZURpY3QpOworICAgIH0KIAotCQkJRlhfRkxPQVQgciA9IDEuMGYgLSBGWF9NSU4oMS4wZiwgYyArIGspOwotCQkJRlhfRkxPQVQgZyA9IDEuMGYgLSBGWF9NSU4oMS4wZiwgbSArIGspOwotCQkJRlhfRkxPQVQgYiA9IDEuMGYgLSBGWF9NSU4oMS4wZiwgeSArIGspOworICAgIHBQYXJlbnREaWN0ID0gcEFQVHlwZURpY3Q7CisgICAgcFN0cmVhbSA9IHBBUFR5cGVEaWN0LT5HZXRTdHJlYW0oc0FQU3RhdGUpOworICB9CiAKLQkJCWNvbG9yID0gRlhTWVNfUkdCKChpbnQpKHIgKiAyNTUpLCAoaW50KShnICogMjU1KSwgKGludCkoYiAqIDI1NSkpOworICBpZiAoIXBTdHJlYW0pIHsKKyAgICBwU3RyZWFtID0gbmV3IENQREZfU3RyZWFtKG51bGxwdHIsIDAsIG51bGxwdHIpOwogCi0JCQlyZXR1cm4gVFJVRTsKLQkJfQotCX0KKyAgICBDUERGX0RvY3VtZW50KiBwRG9jID0gbV9wUGFnZVZpZXctPkdldFBERkRvY3VtZW50KCk7CisgICAgaW50MzJfdCBvYmpudW0gPSBwRG9jLT5BZGRJbmRpcmVjdE9iamVjdChwU3RyZWFtKTsKKyAgICBwUGFyZW50RGljdC0+U2V0QXRSZWZlcmVuY2Uoc0FQVHlwZSwgcERvYywgb2JqbnVtKTsKKyAgfQogCi0JcmV0dXJuIEZBTFNFOwotfQorICBDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1EaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOworICBpZiAoIXBTdHJlYW1EaWN0KSB7CisgICAgcFN0cmVhbURpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OworICAgIHBTdHJlYW1EaWN0LT5TZXRBdE5hbWUoIlR5cGUiLCAiWE9iamVjdCIpOworICAgIHBTdHJlYW1EaWN0LT5TZXRBdE5hbWUoIlN1YnR5cGUiLCAiRm9ybSIpOworICAgIHBTdHJlYW1EaWN0LT5TZXRBdEludGVnZXIoIkZvcm1UeXBlIiwgMSk7CisgICAgcFN0cmVhbS0+SW5pdFN0cmVhbShudWxscHRyLCAwLCBwU3RyZWFtRGljdCk7CisgIH0KIAotCi12b2lkIENQREZTREtfQW5ub3Q6OldyaXRlQXBwZWFyYW5jZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0FQVHlwZSwgY29uc3QgQ1BERl9SZWN0JiByY0JCb3gsIAotCQkJCQkJCQljb25zdCBDUERGX01hdHJpeCYgbWF0cml4LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0NvbnRlbnRzLAotCQkJCQkJCQljb25zdCBDRlhfQnl0ZVN0cmluZyYgc0FQU3RhdGUpCi17Ci0JQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwotCUFTU0VSVChtX3BBbm5vdC0+bV9wQW5ub3REaWN0ICE9IE5VTEwpOwotCQotCUNQREZfRGljdGlvbmFyeSogcEFQRGljdCA9IG1fcEFubm90LT5tX3BBbm5vdERpY3QtPkdldERpY3QoIkFQIik7Ci0JCi0JaWYgKCFwQVBEaWN0KSAKLQl7Ci0JCXBBUERpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotCQltX3BBbm5vdC0+bV9wQW5ub3REaWN0LT5TZXRBdCgiQVAiLCBwQVBEaWN0KTsKLQl9Ci0JCi0JQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBOVUxMOwotCUNQREZfRGljdGlvbmFyeSogcFBhcmVudERpY3QgPSBOVUxMOwotCQotCWlmIChzQVBTdGF0ZS5Jc0VtcHR5KCkpCi0JewotCQlwUGFyZW50RGljdCA9IHBBUERpY3Q7Ci0JCXBTdHJlYW0gPSBwQVBEaWN0LT5HZXRTdHJlYW0oc0FQVHlwZSk7Ci0JfQotCWVsc2UKLQl7Ci0JCUNQREZfRGljdGlvbmFyeSogcEFQVHlwZURpY3QgPSBwQVBEaWN0LT5HZXREaWN0KHNBUFR5cGUpOwotCQlpZiAoIXBBUFR5cGVEaWN0KQotCQl7Ci0JCQlwQVBUeXBlRGljdCA9IG5ldyBDUERGX0RpY3Rpb25hcnk7Ci0JCQlwQVBEaWN0LT5TZXRBdChzQVBUeXBlLCBwQVBUeXBlRGljdCk7Ci0JCX0KLQkJCi0JCXBQYXJlbnREaWN0ID0gcEFQVHlwZURpY3Q7Ci0JCXBTdHJlYW0gPSBwQVBUeXBlRGljdC0+R2V0U3RyZWFtKHNBUFN0YXRlKTsKLQl9Ci0JCi0JaWYgKCFwU3RyZWFtKQotCXsKLQkJQ1BERl9Eb2N1bWVudCogcERvYyA9IG1fcFBhZ2VWaWV3LT5HZXRQREZEb2N1bWVudCgpOwotCQlwU3RyZWFtID0gbmV3IENQREZfU3RyZWFtKE5VTEwsIDAsIE5VTEwpOwotCQlGWF9JTlQzMiBvYmpudW0gPSBwRG9jLT5BZGRJbmRpcmVjdE9iamVjdChwU3RyZWFtKTsKLQkJcFBhcmVudERpY3QtPlNldEF0UmVmZXJlbmNlKHNBUFR5cGUsIHBEb2MsIG9iam51bSk7Ci0JfQorICBpZiAocFN0cmVhbURpY3QpIHsKKyAgICBwU3RyZWFtRGljdC0+U2V0QXRNYXRyaXgoIk1hdHJpeCIsIG1hdHJpeCk7CisgICAgcFN0cmVhbURpY3QtPlNldEF0UmVjdCgiQkJveCIsIHJjQkJveCk7CisgIH0KIAotCUNQREZfRGljdGlvbmFyeSAqcFN0cmVhbURpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7Ci0JaWYgKCFwU3RyZWFtRGljdCkKLQl7Ci0JCXBTdHJlYW1EaWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKLQkJcFN0cmVhbURpY3QtPlNldEF0TmFtZSgiVHlwZSIsICJYT2JqZWN0Iik7Ci0JCXBTdHJlYW1EaWN0LT5TZXRBdE5hbWUoIlN1YnR5cGUiLCAiRm9ybSIpOwotCQlwU3RyZWFtRGljdC0+U2V0QXRJbnRlZ2VyKCJGb3JtVHlwZSIsIDEpOwotCQlwU3RyZWFtLT5Jbml0U3RyZWFtKE5VTEwsMCxwU3RyZWFtRGljdCk7Ci0JfQotCQotCWlmIChwU3RyZWFtRGljdCkKLQl7Ci0JCXBTdHJlYW1EaWN0LT5TZXRBdE1hdHJpeCgiTWF0cml4IixtYXRyaXgpOwkKLQkJcFN0cmVhbURpY3QtPlNldEF0UmVjdCgiQkJveCIsIHJjQkJveCk7CQkKLQl9Ci0JCi0JcFN0cmVhbS0+U2V0RGF0YSgoRlhfQllURSopc0NvbnRlbnRzLmNfc3RyKCksIHNDb250ZW50cy5HZXRMZW5ndGgoKSwgRkFMU0UsIEZBTFNFKTsKKyAgcFN0cmVhbS0+U2V0RGF0YSgodWludDhfdCopc0NvbnRlbnRzLmNfc3RyKCksIHNDb250ZW50cy5HZXRMZW5ndGgoKSwgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgRkFMU0UpOwogfQogCi0jZGVmaW5lIEJBX0FOTk9UX01JTldJRFRICQkJMQotI2RlZmluZSBCQV9BTk5PVF9NSU5IRUlHSFQJCQkxCisjZGVmaW5lIEJBX0FOTk9UX01JTldJRFRIIDEKKyNkZWZpbmUgQkFfQU5OT1RfTUlOSEVJR0hUIDEKIAotRlhfRkxPQVQgQ1BERlNES19Bbm5vdDo6R2V0TWluV2lkdGgoKSBjb25zdAotewotCXJldHVybiBCQV9BTk5PVF9NSU5XSURUSDsKK0ZYX0ZMT0FUIENQREZTREtfQW5ub3Q6OkdldE1pbldpZHRoKCkgY29uc3QgeworICByZXR1cm4gQkFfQU5OT1RfTUlOV0lEVEg7CiB9CiAKLUZYX0ZMT0FUIENQREZTREtfQW5ub3Q6OkdldE1pbkhlaWdodCgpIGNvbnN0Ci17Ci0JcmV0dXJuIEJBX0FOTk9UX01JTkhFSUdIVDsKK0ZYX0ZMT0FUIENQREZTREtfQW5ub3Q6OkdldE1pbkhlaWdodCgpIGNvbnN0IHsKKyAgcmV0dXJuIEJBX0FOTk9UX01JTkhFSUdIVDsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0Fubm90OjpDcmVhdGVGb3JtRmlsbGVyKCkKLXsKLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgQ1BERlNES19CQUFubm90OjpDcmVhdGVGb3JtRmlsbGVyKCkgeworICByZXR1cm4gVFJVRTsKIH0KLUZYX0JPT0wJQ1BERlNES19Bbm5vdDo6SXNWaXNpYmxlKCkgY29uc3QKLXsKLQlpbnQgbkZsYWdzID0gR2V0RmxhZ3MoKTsKLQlyZXR1cm4gISgobkZsYWdzICYgQU5OT1RGTEFHX0lOVklTSUJMRSkgfHwgKG5GbGFncyAmIEFOTk9URkxBR19ISURERU4pIHx8IChuRmxhZ3MgJiBBTk5PVEZMQUdfTk9WSUVXKSk7CitGWF9CT09MIENQREZTREtfQkFBbm5vdDo6SXNWaXNpYmxlKCkgY29uc3QgeworICBpbnQgbkZsYWdzID0gR2V0RmxhZ3MoKTsKKyAgcmV0dXJuICEoKG5GbGFncyAmIEFOTk9URkxBR19JTlZJU0lCTEUpIHx8IChuRmxhZ3MgJiBBTk5PVEZMQUdfSElEREVOKSB8fAorICAgICAgICAgICAobkZsYWdzICYgQU5OT1RGTEFHX05PVklFVykpOwogfQogCi1DUERGX0FjdGlvbiBDUERGU0RLX0Fubm90OjpHZXRBY3Rpb24oKSBjb25zdAotewotCXJldHVybiBDUERGX0FjdGlvbihtX3BBbm5vdC0+bV9wQW5ub3REaWN0LT5HZXREaWN0KCJBIikpOworQ1BERl9BY3Rpb24gQ1BERlNES19CQUFubm90OjpHZXRBY3Rpb24oKSBjb25zdCB7CisgIHJldHVybiBDUERGX0FjdGlvbihtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3QoIkEiKSk7CiB9CiAKLXZvaWQgQ1BERlNES19Bbm5vdDo6U2V0QWN0aW9uKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pCi17Ci0JQVNTRVJUKGFjdGlvbik7Ci0JaWYgKChDUERGX0FjdGlvbiYpYWN0aW9uICE9IENQREZfQWN0aW9uKG1fcEFubm90LT5tX3BBbm5vdERpY3QtPkdldERpY3QoIkEiKSkpCi0JewotCQlDUERGX0RvY3VtZW50KiBwRG9jID0gbV9wUGFnZVZpZXctPkdldFBERkRvY3VtZW50KCk7Ci0JCUNQREZfRGljdGlvbmFyeSogcERpY3QgPSBhY3Rpb24uR2V0RGljdCgpOwotCQlpZiAocERpY3QgJiYgcERpY3QtPkdldE9iak51bSgpID09IDApIHsKLQkJCXBEb2MtPkFkZEluZGlyZWN0T2JqZWN0KHBEaWN0KTsKLQkJfQotCQltX3BBbm5vdC0+bV9wQW5ub3REaWN0LT5TZXRBdFJlZmVyZW5jZSgiQSIsIHBEb2MsIHBEaWN0LT5HZXRPYmpOdW0oKSk7Ci0JfQordm9pZCBDUERGU0RLX0JBQW5ub3Q6OlNldEFjdGlvbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKSB7CisgIEFTU0VSVChhY3Rpb24pOworICBpZiAoKENQREZfQWN0aW9uJilhY3Rpb24gIT0KKyAgICAgIENQREZfQWN0aW9uKG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0RGljdCgiQSIpKSkgeworICAgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBtX3BQYWdlVmlldy0+R2V0UERGRG9jdW1lbnQoKTsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gYWN0aW9uLkdldERpY3QoKTsKKyAgICBpZiAocERpY3QgJiYgcERpY3QtPkdldE9iak51bSgpID09IDApIHsKKyAgICAgIHBEb2MtPkFkZEluZGlyZWN0T2JqZWN0KHBEaWN0KTsKKyAgICB9CisgICAgbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXRBdFJlZmVyZW5jZSgiQSIsIHBEb2MsIHBEaWN0LT5HZXRPYmpOdW0oKSk7CisgIH0KIH0KIAotdm9pZCBDUERGU0RLX0Fubm90OjpSZW1vdmVBY3Rpb24oKQotewotCW1fcEFubm90LT5tX3BBbm5vdERpY3QtPlJlbW92ZUF0KCJBIik7Cit2b2lkIENQREZTREtfQkFBbm5vdDo6UmVtb3ZlQWN0aW9uKCkgeworICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlJlbW92ZUF0KCJBIik7CiB9CiAKLUNQREZfQUFjdGlvbiBDUERGU0RLX0Fubm90OjpHZXRBQWN0aW9uKCkgY29uc3QKLXsKLQlyZXR1cm4gbV9wQW5ub3QtPm1fcEFubm90RGljdC0+R2V0RGljdCgiQUEiKTsKK0NQREZfQUFjdGlvbiBDUERGU0RLX0JBQW5ub3Q6OkdldEFBY3Rpb24oKSBjb25zdCB7CisgIHJldHVybiBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3QoIkFBIik7CiB9CiAKLXZvaWQgQ1BERlNES19Bbm5vdDo6U2V0QUFjdGlvbihjb25zdCBDUERGX0FBY3Rpb24mIGFhKQotewotCUFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKLQlBU1NFUlQobV9wQW5ub3QtPm1fcEFubm90RGljdCAhPSBOVUxMKTsKLQlBU1NFUlQoYWEgIT0gTlVMTCk7Ci0JCi0JaWYgKChDUERGX0FBY3Rpb24mKWFhICE9IG1fcEFubm90LT5tX3BBbm5vdERpY3QtPkdldERpY3QoIkFBIikpCi0JCW1fcEFubm90LT5tX3BBbm5vdERpY3QtPlNldEF0KCJBQSIsIChDUERGX0FBY3Rpb24mKWFhKTsKK3ZvaWQgQ1BERlNES19CQUFubm90OjpTZXRBQWN0aW9uKGNvbnN0IENQREZfQUFjdGlvbiYgYWEpIHsKKyAgaWYgKChDUERGX0FBY3Rpb24mKWFhICE9IG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0RGljdCgiQUEiKSkKKyAgICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlNldEF0KCJBQSIsIChDUERGX0FBY3Rpb24mKWFhKTsKIH0KIAotdm9pZCBDUERGU0RLX0Fubm90OjpSZW1vdmVBQWN0aW9uKCkKLXsKLQlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7Ci0JQVNTRVJUKG1fcEFubm90LT5tX3BBbm5vdERpY3QgIT0gTlVMTCk7Ci0JCi0JbV9wQW5ub3QtPm1fcEFubm90RGljdC0+UmVtb3ZlQXQoIkFBIik7Cit2b2lkIENQREZTREtfQkFBbm5vdDo6UmVtb3ZlQUFjdGlvbigpIHsKKyAgbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5SZW1vdmVBdCgiQUEiKTsKIH0KIAotQ1BERl9BY3Rpb24JQ1BERlNES19Bbm5vdDo6R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQpCi17Ci0JQ1BERl9BQWN0aW9uIEFBY3Rpb24gPSBHZXRBQWN0aW9uKCk7CitDUERGX0FjdGlvbiBDUERGU0RLX0JBQW5ub3Q6OkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFUKSB7CisgIENQREZfQUFjdGlvbiBBQWN0aW9uID0gR2V0QUFjdGlvbigpOwogCi0JaWYgKEFBY3Rpb24uQWN0aW9uRXhpc3QoZUFBVCkpCi0JCXJldHVybiBBQWN0aW9uLkdldEFjdGlvbihlQUFUKTsKKyAgaWYgKEFBY3Rpb24uQWN0aW9uRXhpc3QoZUFBVCkpCisgICAgcmV0dXJuIEFBY3Rpb24uR2V0QWN0aW9uKGVBQVQpOwogCi0JaWYgKGVBQVQgPT0gQ1BERl9BQWN0aW9uOjpCdXR0b25VcCkKLQkJcmV0dXJuIEdldEFjdGlvbigpOworICBpZiAoZUFBVCA9PSBDUERGX0FBY3Rpb246OkJ1dHRvblVwKQorICAgIHJldHVybiBHZXRBY3Rpb24oKTsKIAotCXJldHVybiBDUERGX0FjdGlvbigpOworICByZXR1cm4gQ1BERl9BY3Rpb24oKTsKK30KKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCitGWF9CT09MIENQREZTREtfQkFBbm5vdDo6SXNYRkFGaWVsZCgpIHsKKyAgcmV0dXJuIEZBTFNFOwogfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCi12b2lkICBDUERGU0RLX0Fubm90OjpBbm5vdF9PbkRyYXcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykKLXsKLQkKLQltX3BBbm5vdC0+R2V0QVBGb3JtKG1fcFBhZ2VWaWV3LT5HZXRQREZQYWdlKCksIENQREZfQW5ub3Q6Ok5vcm1hbCk7Ci0JbV9wQW5ub3QtPkRyYXdBcHBlYXJhbmNlKG1fcFBhZ2VWaWV3LT5HZXRQREZQYWdlKCksIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgQ1BERl9Bbm5vdDo6Tm9ybWFsLCBOVUxMKTsKK3ZvaWQgQ1BERlNES19CQUFubm90OjpBbm5vdF9PbkRyYXcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKSB7CisgIG1fcEFubm90LT5HZXRBUEZvcm0obV9wUGFnZVZpZXctPkdldFBERlBhZ2UoKSwgQ1BERl9Bbm5vdDo6Tm9ybWFsKTsKKyAgbV9wQW5ub3QtPkRyYXdBcHBlYXJhbmNlKG1fcFBhZ2VWaWV3LT5HZXRQREZQYWdlKCksIHBEZXZpY2UsIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQW5ub3Q6Ok5vcm1hbCwgTlVMTCk7Cit9CiAKLQlyZXR1cm4gOworVW5kZXJseWluZ1BhZ2VUeXBlKiBDUERGU0RLX0Fubm90OjpHZXRVbmRlcmx5aW5nUGFnZSgpIHsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICByZXR1cm4gR2V0UERGWEZBUGFnZSgpOworI2Vsc2UgICAvLyBQREZfRU5BQkxFX1hGQQorICByZXR1cm4gR2V0UERGUGFnZSgpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogfQogCi1DUERGX1BhZ2UqIENQREZTREtfQW5ub3Q6OkdldFBERlBhZ2UoKQotewotCWlmKG1fcFBhZ2VWaWV3KQotCQlyZXR1cm4gbV9wUGFnZVZpZXctPkdldFBERlBhZ2UoKTsKLQlyZXR1cm4gTlVMTDsKK0NQREZfUGFnZSogQ1BERlNES19Bbm5vdDo6R2V0UERGUGFnZSgpIHsKKyAgaWYgKG1fcFBhZ2VWaWV3KQorICAgIHJldHVybiBtX3BQYWdlVmlldy0+R2V0UERGUGFnZSgpOworICByZXR1cm4gTlVMTDsKIH0KIAorI2lmZGVmIFBERl9FTkFCTEVfWEZBCitDUERGWEZBX1BhZ2UqIENQREZTREtfQW5ub3Q6OkdldFBERlhGQVBhZ2UoKSB7CisgIGlmIChtX3BQYWdlVmlldykKKyAgICByZXR1cm4gbV9wUGFnZVZpZXctPkdldFBERlhGQVBhZ2UoKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mc2RrX2Jhc2Vmb3JtLmNwcCBiL2ZwZGZzZGsvc3JjL2ZzZGtfYmFzZWZvcm0uY3BwCmluZGV4IDBjYmM0YmEuLjY2ZTg0MzQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZzZGtfYmFzZWZvcm0uY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZzZGtfYmFzZWZvcm0uY3BwCkBAIC0xLDMwMDIgKzEsMjk2MyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vdGhpcmRfcGFydHkvYmFzZS9ub25zdGRfdW5pcXVlX3B0ci5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnNka19kZWZpbmUuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2ZzZGtfbWdyLmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX2Jhc2Vhbm5vdC5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnNka19iYXNlZm9ybS5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvZnNka19hY3Rpb25oYW5kbGVyLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZzZGtfYmFzZWZvcm0uaCIKIAotI2luY2x1ZGUgIi4uL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oIgorI2luY2x1ZGUgPG1lbW9yeT4KIAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vKgkJCQkJCQkJCQlDUERGU0RLX1dpZGdldCAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnNka19hY3Rpb25oYW5kbGVyLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZzZGtfYmFzZWFubm90LmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZzZGtfbWdyLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oIgogCi0jZGVmaW5lIElzRmxvYXRaZXJvKGYpCQkJCQkJKChmKSA8IDAuMDEgJiYgKGYpID4gLTAuMDEpCi0jZGVmaW5lIElzRmxvYXRCaWdnZXIoZmEsZmIpCQkJCSgoZmEpID4gKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQotI2RlZmluZSBJc0Zsb2F0U21hbGxlcihmYSxmYikJCQkJKChmYSkgPCAoZmIpICYmICFJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkpCi0jZGVmaW5lIElzRmxvYXRFcXVhbChmYSxmYikJCQkJCUlzRmxvYXRaZXJvKChmYSktKGZiKSkKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfZG9jLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV91dGlsLmgiCisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKLUNQREZTREtfV2lkZ2V0OjpDUERGU0RLX1dpZGdldChDUERGX0Fubm90KiBwQW5ub3QsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0pIDoKLQkJCQkJQ1BERlNES19Bbm5vdChwQW5ub3QsIHBQYWdlVmlldyksCi0JCQkJCW1fcEludGVyRm9ybShwSW50ZXJGb3JtKSwKLQkJCQkJbV9uQXBwQWdlKDApLAotCQkJCQltX25WYWx1ZUFnZSgwKQotewotCUFTU0VSVChtX3BJbnRlckZvcm0gIT0gTlVMTCk7Ci19CisjZGVmaW5lIElzRmxvYXRaZXJvKGYpICgoZikgPCAwLjAxICYmIChmKSA+IC0wLjAxKQorI2RlZmluZSBJc0Zsb2F0QmlnZ2VyKGZhLCBmYikgKChmYSkgPiAoZmIpICYmICFJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkpCisjZGVmaW5lIElzRmxvYXRTbWFsbGVyKGZhLCBmYikgKChmYSkgPCAoZmIpICYmICFJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkpCisjZGVmaW5lIElzRmxvYXRFcXVhbChmYSwgZmIpIElzRmxvYXRaZXJvKChmYSkgLSAoZmIpKQogCi1DUERGU0RLX1dpZGdldDo6fkNQREZTREtfV2lkZ2V0KCkKLXsKLQotfQotCi1GWF9CT09MCQlDUERGU0RLX1dpZGdldDo6SXNXaWRnZXRBcHBlYXJhbmNlVmFsaWQoQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSkKLXsKLQlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7Ci0JQVNTRVJUKG1fcEFubm90LT5tX3BBbm5vdERpY3QgIT0gTlVMTCk7Ci0JCi0JQ1BERl9EaWN0aW9uYXJ5KiBwQVAgPSBtX3BBbm5vdC0+bV9wQW5ub3REaWN0LT5HZXREaWN0KCJBUCIpOwotCWlmIChwQVAgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCQotCS8vIENob29zZSB0aGUgcmlnaHQgc3ViLWFwCi0JY29uc3QgRlhfQ0hBUiogYXBfZW50cnkgPSAiTiI7Ci0JaWYgKG1vZGUgPT0gQ1BERl9Bbm5vdDo6RG93bikKLQkJYXBfZW50cnkgPSAiRCI7Ci0JZWxzZSBpZiAobW9kZSA9PSBDUERGX0Fubm90OjpSb2xsb3ZlcikKLQkJYXBfZW50cnkgPSAiUiI7Ci0JaWYgKCFwQVAtPktleUV4aXN0KGFwX2VudHJ5KSkKLQkJYXBfZW50cnkgPSAiTiI7Ci0JCi0JLy8gR2V0IHRoZSBBUCBzdHJlYW0gb3Igc3ViZGlyZWN0b3J5Ci0JQ1BERl9PYmplY3QqIHBzdWIgPSBwQVAtPkdldEVsZW1lbnRWYWx1ZShhcF9lbnRyeSk7Ci0JaWYgKHBzdWIgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCQotCWludCBuRmllbGRUeXBlID0gR2V0RmllbGRUeXBlKCk7Ci0Jc3dpdGNoIChuRmllbGRUeXBlKQotCXsKLQljYXNlIEZJRUxEVFlQRV9QVVNIQlVUVE9OOgotCWNhc2UgRklFTERUWVBFX0NPTUJPQk9YOgotCWNhc2UgRklFTERUWVBFX0xJU1RCT1g6Ci0JY2FzZSBGSUVMRFRZUEVfVEVYVEZJRUxEOgotCWNhc2UgRklFTERUWVBFX1NJR05BVFVSRToKLQkJcmV0dXJuIHBzdWItPkdldFR5cGUoKSA9PSBQREZPQkpfU1RSRUFNOwotCWNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgotCWNhc2UgRklFTERUWVBFX1JBRElPQlVUVE9OOgotCQlpZiAocHN1Yi0+R2V0VHlwZSgpID09IFBERk9CSl9ESUNUSU9OQVJZKSAKLQkJewotCQkJQ1BERl9EaWN0aW9uYXJ5KiBwU3ViRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBzdWI7Ci0JCQkKLQkJCXJldHVybiBwU3ViRGljdC0+R2V0U3RyZWFtKHRoaXMtPkdldEFwcFN0YXRlKCkpICE9IE5VTEw7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQl9Ci0JCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLWludAlDUERGU0RLX1dpZGdldDo6R2V0RmllbGRUeXBlKCkgY29uc3QKLXsKLQlDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7Ci0JQVNTRVJUKHBGaWVsZCAhPSBOVUxMKTsKLQkKLQlyZXR1cm4gcEZpZWxkLT5HZXRGaWVsZFR5cGUoKTsKLX0KLQotaW50IENQREZTREtfV2lkZ2V0OjpHZXRGaWVsZEZsYWdzKCkgY29uc3QKLXsKLQlDUERGX0ludGVyRm9ybSogcFBERkludGVyRm9ybSA9IG1fcEludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7Ci0JQVNTRVJUKHBQREZJbnRlckZvcm0gIT0gTlVMTCk7Ci0KLQlDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBwUERGSW50ZXJGb3JtLT5HZXRDb250cm9sQnlEaWN0KG1fcEFubm90LT5tX3BBbm5vdERpY3QpOwotCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gcEZvcm1Db250cm9sLT5HZXRGaWVsZCgpOwotCXJldHVybiBwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCk7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENQREZTREtfV2lkZ2V0OjpHZXRTdWJUeXBlKCkgY29uc3QKLXsKLQlpbnQgblR5cGUgPSBHZXRGaWVsZFR5cGUoKTsKLQkKLQlpZiAoblR5cGUgPT0gRklFTERUWVBFX1NJR05BVFVSRSkKLQkJcmV0dXJuIEJGRlRfU0lHTkFUVVJFOwotCXJldHVybiBDUERGU0RLX0Fubm90OjpHZXRTdWJUeXBlKCk7Ci19Ci0KLUNQREZfRm9ybUZpZWxkKglDUERGU0RLX1dpZGdldDo6R2V0Rm9ybUZpZWxkKCkgY29uc3QKLXsKLQlBU1NFUlQobV9wSW50ZXJGb3JtICE9IE5VTEwpOwotCQotCUNQREZfRm9ybUNvbnRyb2wqIHBDdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsJCi0JQVNTRVJUKHBDdHJsICE9IE5VTEwpOwotCQotCXJldHVybiBwQ3RybC0+R2V0RmllbGQoKTsKLX0KLQotQ1BERl9Gb3JtQ29udHJvbCogQ1BERlNES19XaWRnZXQ6OkdldEZvcm1Db250cm9sKCkgY29uc3QKLXsKLQlBU1NFUlQobV9wSW50ZXJGb3JtICE9IE5VTEwpOwotCQotCUNQREZfSW50ZXJGb3JtKiBwUERGSW50ZXJGb3JtID0gbV9wSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKLQlBU1NFUlQocFBERkludGVyRm9ybSAhPSBOVUxMKTsKLQkKLQlyZXR1cm4gcFBERkludGVyRm9ybS0+R2V0Q29udHJvbEJ5RGljdChHZXRBbm5vdERpY3QoKSk7Ci19Ci1zdGF0aWMgQ1BERl9EaWN0aW9uYXJ5KiBCRl9HZXRGaWVsZChDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QsIGNvbnN0IEZYX0NIQVIqIG5hbWUpCi17Ci0JaWYgKHBGaWVsZERpY3QgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JLy8gRmlyc3QgY2hlY2sgdGhlIGRpY3Rpb25hcnkgaXRzZWxmCi0JQ1BERl9PYmplY3QqIHBBdHRyID0gcEZpZWxkRGljdC0+R2V0RWxlbWVudFZhbHVlKG5hbWUpOwotCWlmIChwQXR0cikgcmV0dXJuIHBGaWVsZERpY3Q7Ci0JCi0JLy8gTm93IHdlIG5lZWQgdG8gc2VhcmNoIGZyb20gcGFyZW50cwotCUNQREZfRGljdGlvbmFyeSogcFBhcmVudCA9IHBGaWVsZERpY3QtPkdldERpY3QoIlBhcmVudCIpOwotCWlmIChwUGFyZW50ID09IE5VTEwpIHJldHVybiBOVUxMOwotCQotCXJldHVybiBCRl9HZXRGaWVsZChwUGFyZW50LCBuYW1lKTsKLX0KLQotQ1BERl9Gb3JtQ29udHJvbCogQ1BERlNES19XaWRnZXQ6OkdldEZvcm1Db250cm9sKENQREZfSW50ZXJGb3JtKiBwSW50ZXJGb3JtLCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpCi17Ci0JQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7Ci0JQVNTRVJUKHBBbm5vdERpY3QgIT0gTlVMTCk7Ci0JCi0JQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBwSW50ZXJGb3JtLT5HZXRDb250cm9sQnlEaWN0KHBBbm5vdERpY3QpOwotCQotCXJldHVybiBwQ29udHJvbDsKLX0KLQotaW50IENQREZTREtfV2lkZ2V0OjpHZXRSb3RhdGUoKSBjb25zdAotewotCUNQREZfRm9ybUNvbnRyb2wqIHBDdHJsID0gdGhpcy0+R2V0Rm9ybUNvbnRyb2woKTsKLQlBU1NFUlQocEN0cmwgIT0gTlVMTCk7Ci0JCi0JcmV0dXJuIHBDdHJsLT5HZXRSb3RhdGlvbigpICUgMzYwOwotfQotCi1GWF9CT09MCUNQREZTREtfV2lkZ2V0OjpHZXRGaWxsQ29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdAotewotCUNQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7Ci0JQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKLQkKLQlpbnQgaUNvbG9yVHlwZSA9IDA7CQotCWNvbG9yID0gRlhfQVJHQlRPQ09MT1JSRUYocEZvcm1DdHJsLT5HZXRCYWNrZ3JvdW5kQ29sb3IoaUNvbG9yVHlwZSkpOwotCQotCXJldHVybiBpQ29sb3JUeXBlICE9IENPTE9SVFlQRV9UUkFOU1BBUkVOVDsKLX0KLQotRlhfQk9PTAlDUERGU0RLX1dpZGdldDo6R2V0Qm9yZGVyQ29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdAotewotCUNQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7Ci0JQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKLQkKLQlpbnQgaUNvbG9yVHlwZSA9IDA7CQotCWNvbG9yID0gRlhfQVJHQlRPQ09MT1JSRUYocEZvcm1DdHJsLT5HZXRCb3JkZXJDb2xvcihpQ29sb3JUeXBlKSk7Ci0JCi0JcmV0dXJuIGlDb2xvclR5cGUgIT0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOwotfQotCi1GWF9CT09MCUNQREZTREtfV2lkZ2V0OjpHZXRUZXh0Q29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdAotewotCUNQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7Ci0JQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKLQkKLQlDUERGX0RlZmF1bHRBcHBlYXJhbmNlIGRhID0gcEZvcm1DdHJsLT5HZXREZWZhdWx0QXBwZWFyYW5jZSgpOwotCWlmIChkYS5IYXNDb2xvcigpKQotCXsKLQkJRlhfQVJHQiBhcmdiOwotCQlpbnQgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9UUkFOU1BBUkVOVDsJCi0JCWRhLkdldENvbG9yKGFyZ2IsIGlDb2xvclR5cGUpOwotCQljb2xvciA9IEZYX0FSR0JUT0NPTE9SUkVGKGFyZ2IpOwotCQkKLQkJcmV0dXJuIGlDb2xvclR5cGUgIT0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOwotCX0KLQkKLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLUZYX0ZMT0FUIENQREZTREtfV2lkZ2V0OjpHZXRGb250U2l6ZSgpIGNvbnN0Ci17Ci0JQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKLQlBU1NFUlQocEZvcm1DdHJsICE9IE5VTEwpOwotCQotCUNQREZfRGVmYXVsdEFwcGVhcmFuY2UgcERhID0gcEZvcm1DdHJsLT5HZXREZWZhdWx0QXBwZWFyYW5jZSgpOwotCUNGWF9CeXRlU3RyaW5nIGNzRm9udCA9ICIiOwotCUZYX0ZMT0FUIGZGb250U2l6ZSA9IDAuMGY7Ci0JcERhLkdldEZvbnQoY3NGb250LCBmRm9udFNpemUpOwotCQotCXJldHVybiBmRm9udFNpemU7Ci19Ci0KLWludAlDUERGU0RLX1dpZGdldDo6R2V0U2VsZWN0ZWRJbmRleChpbnQgbkluZGV4KSBjb25zdAotewotCUNQREZfRm9ybUZpZWxkKglwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7Ci0JQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0JCi0JcmV0dXJuIHBGb3JtRmllbGQtPkdldFNlbGVjdGVkSW5kZXgobkluZGV4KTsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ1BERlNES19XaWRnZXQ6OkdldFZhbHVlKCkgY29uc3QKLXsKLQlDUERGX0Zvcm1GaWVsZCoJcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOwotCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCQotCXJldHVybiBwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpOwotfQotCi1DRlhfV2lkZVN0cmluZyBDUERGU0RLX1dpZGdldDo6R2V0RGVmYXVsdFZhbHVlKCkgY29uc3QKLXsKLQlDUERGX0Zvcm1GaWVsZCoJcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOwotCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCQotCXJldHVybiBwRm9ybUZpZWxkLT5HZXREZWZhdWx0VmFsdWUoKTsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ1BERlNES19XaWRnZXQ6OkdldE9wdGlvbkxhYmVsKGludCBuSW5kZXgpIGNvbnN0Ci17Ci0JQ1BERl9Gb3JtRmllbGQqCXBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKLQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQkKLQlyZXR1cm4gcEZvcm1GaWVsZC0+R2V0T3B0aW9uTGFiZWwobkluZGV4KTsKLX0KLQotaW50CUNQREZTREtfV2lkZ2V0OjpDb3VudE9wdGlvbnMoKSBjb25zdAotewotCUNQREZfRm9ybUZpZWxkKglwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7Ci0JQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0JCi0JcmV0dXJuIHBGb3JtRmllbGQtPkNvdW50T3B0aW9ucygpOwotfQotCi1GWF9CT09MCUNQREZTREtfV2lkZ2V0OjpJc09wdGlvblNlbGVjdGVkKGludCBuSW5kZXgpIGNvbnN0Ci17Ci0JQ1BERl9Gb3JtRmllbGQqCXBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKLQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQkKLQlyZXR1cm4gcEZvcm1GaWVsZC0+SXNJdGVtU2VsZWN0ZWQobkluZGV4KTsKLX0KLQotaW50CUNQREZTREtfV2lkZ2V0OjpHZXRUb3BWaXNpYmxlSW5kZXgoKSBjb25zdAotewotCUNQREZfRm9ybUZpZWxkKglwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7Ci0JQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0JCi0JcmV0dXJuIHBGb3JtRmllbGQtPkdldFRvcFZpc2libGVJbmRleCgpOwotfQotCi1GWF9CT09MCUNQREZTREtfV2lkZ2V0OjpJc0NoZWNrZWQoKSBjb25zdAotewotCUNQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7Ci0JQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKLQkKLQlyZXR1cm4gcEZvcm1DdHJsLT5Jc0NoZWNrZWQoKTsKLX0KLQotaW50CUNQREZTREtfV2lkZ2V0OjpHZXRBbGlnbm1lbnQoKSBjb25zdAotewotCUNQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7Ci0JQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKLQkKLQlyZXR1cm4gcEZvcm1DdHJsLT5HZXRDb250cm9sQWxpZ25tZW50KCk7Ci19Ci0KLWludAlDUERGU0RLX1dpZGdldDo6R2V0TWF4TGVuKCkgY29uc3QKLXsKLQlDUERGX0Zvcm1GaWVsZCoJcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOwotCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCQotCXJldHVybiBwRm9ybUZpZWxkLT5HZXRNYXhMZW4oKTsKLX0KLQotdm9pZCBDUERGU0RLX1dpZGdldDo6U2V0Q2hlY2soRlhfQk9PTCBiQ2hlY2tlZCwgRlhfQk9PTCBiTm90aWZ5KQotewotCUNQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7Ci0JQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKLQkKLQlDUERGX0Zvcm1GaWVsZCoJcEZvcm1GaWVsZCA9IHBGb3JtQ3RybC0+R2V0RmllbGQoKTsKLQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQkKLQlwRm9ybUZpZWxkLT5DaGVja0NvbnRyb2wocEZvcm1GaWVsZC0+R2V0Q29udHJvbEluZGV4KHBGb3JtQ3RybCksIGJDaGVja2VkLCBiTm90aWZ5KTsKLX0KLQotdm9pZCBDUERGU0RLX1dpZGdldDo6U2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNWYWx1ZSwgRlhfQk9PTCBiTm90aWZ5KQotewotCUNQREZfRm9ybUZpZWxkKglwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7Ci0JQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0JCi0JcEZvcm1GaWVsZC0+U2V0VmFsdWUoc1ZhbHVlLCBiTm90aWZ5KTsKLX0KLQotdm9pZCBDUERGU0RLX1dpZGdldDo6U2V0RGVmYXVsdFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVmFsdWUpCi17Ci19Ci12b2lkIENQREZTREtfV2lkZ2V0OjpTZXRPcHRpb25TZWxlY3Rpb24oaW50IGluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCwgRlhfQk9PTCBiTm90aWZ5KQotewotCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7Ci0JQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0JCi0JcEZvcm1GaWVsZC0+U2V0SXRlbVNlbGVjdGlvbihpbmRleCwgYlNlbGVjdGVkLCBiTm90aWZ5KTsKLX0KLQotdm9pZCBDUERGU0RLX1dpZGdldDo6Q2xlYXJTZWxlY3Rpb24oRlhfQk9PTCBiTm90aWZ5KQotewotCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7Ci0JQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0JCi0JcEZvcm1GaWVsZC0+Q2xlYXJTZWxlY3Rpb24oYk5vdGlmeSk7Ci19Ci0KLXZvaWQgQ1BERlNES19XaWRnZXQ6OlNldFRvcFZpc2libGVJbmRleChpbnQgaW5kZXgpCitDUERGU0RLX1dpZGdldDo6Q1BERlNES19XaWRnZXQoQ1BERl9Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSkKKyAgICA6IENQREZTREtfQkFBbm5vdChwQW5ub3QsIHBQYWdlVmlldyksCisgICAgICBtX3BJbnRlckZvcm0ocEludGVyRm9ybSksCisgICAgICBtX25BcHBBZ2UoMCksCisgICAgICBtX25WYWx1ZUFnZSgwKQorI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgICAgICAsCisgICAgICBtX2hNaXhYRkFXaWRnZXQoTlVMTCksCisgICAgICBtX3BXaWRnZXRIYW5kbGVyKE5VTEwpCisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiB7CiB9CiAKLXZvaWQgQ1BERlNES19XaWRnZXQ6OlNldEFwcE1vZGlmaWVkKCkKLXsKLQltX2JBcHBNb2RpZmllZCA9IFRSVUU7CitDUERGU0RLX1dpZGdldDo6fkNQREZTREtfV2lkZ2V0KCkge30KKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCitJWEZBX1dpZGdldCogQ1BERlNES19XaWRnZXQ6OkdldE1peFhGQVdpZGdldCgpIGNvbnN0IHsKKyAgQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9IG1fcFBhZ2VWaWV3LT5HZXRTREtEb2N1bWVudCgpOworICBDUERGWEZBX0RvY3VtZW50KiBwRG9jID0gcFNES0RvYy0+R2V0WEZBRG9jdW1lbnQoKTsKKyAgaWYgKHBEb2MtPkdldERvY1R5cGUoKSA9PSBET0NUWVBFX1NUQVRJQ19YRkEpIHsKKyAgICBpZiAoIW1faE1peFhGQVdpZGdldCkgeworICAgICAgaWYgKElYRkFfRG9jVmlldyogcERvY1ZpZXcgPSBwRG9jLT5HZXRYRkFEb2NWaWV3KCkpIHsKKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc05hbWU7CisgICAgICAgIGlmICh0aGlzLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfUkFESU9CVVRUT04pIHsKKyAgICAgICAgICBzTmFtZSA9IHRoaXMtPkdldEFubm90TmFtZSgpOworICAgICAgICAgIGlmIChzTmFtZS5Jc0VtcHR5KCkpCisgICAgICAgICAgICBzTmFtZSA9IEdldE5hbWUoKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgc05hbWUgPSBHZXROYW1lKCk7CisKKyAgICAgICAgaWYgKCFzTmFtZS5Jc0VtcHR5KCkpCisgICAgICAgICAgbV9oTWl4WEZBV2lkZ2V0ID0gcERvY1ZpZXctPkdldFdpZGdldEJ5TmFtZShzTmFtZSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBtX2hNaXhYRkFXaWRnZXQ7CisgIH0KKworICByZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBDUERGU0RLX1dpZGdldDo6Q2xlYXJBcHBNb2RpZmllZCgpCi17Ci0JbV9iQXBwTW9kaWZpZWQgPSBGQUxTRTsKK0lYRkFfV2lkZ2V0KiBDUERGU0RLX1dpZGdldDo6R2V0R3JvdXBNaXhYRkFXaWRnZXQoKSB7CisgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBtX3BQYWdlVmlldy0+R2V0U0RLRG9jdW1lbnQoKTsKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IHBTREtEb2MtPkdldFhGQURvY3VtZW50KCk7CisgIGlmIChwRG9jLT5HZXREb2NUeXBlKCkgPT0gRE9DVFlQRV9TVEFUSUNfWEZBKSB7CisgICAgaWYgKElYRkFfRG9jVmlldyogcERvY1ZpZXcgPSBwRG9jLT5HZXRYRkFEb2NWaWV3KCkpIHsKKyAgICAgIENGWF9XaWRlU3RyaW5nIHNOYW1lID0gR2V0TmFtZSgpOworICAgICAgaWYgKCFzTmFtZS5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBwRG9jVmlldy0+R2V0V2lkZ2V0QnlOYW1lKHNOYW1lKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gbnVsbHB0cjsKIH0KIAotRlhfQk9PTCBDUERGU0RLX1dpZGdldDo6SXNBcHBNb2RpZmllZCgpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fYkFwcE1vZGlmaWVkOworSVhGQV9XaWRnZXRIYW5kbGVyKiBDUERGU0RLX1dpZGdldDo6R2V0WEZBV2lkZ2V0SGFuZGxlcigpIGNvbnN0IHsKKyAgQ1BERlNES19Eb2N1bWVudCogcFNES0RvYyA9IG1fcFBhZ2VWaWV3LT5HZXRTREtEb2N1bWVudCgpOworICBDUERGWEZBX0RvY3VtZW50KiBwRG9jID0gcFNES0RvYy0+R2V0WEZBRG9jdW1lbnQoKTsKKyAgaWYgKHBEb2MtPkdldERvY1R5cGUoKSA9PSBET0NUWVBFX1NUQVRJQ19YRkEpIHsKKyAgICBpZiAoIW1fcFdpZGdldEhhbmRsZXIpIHsKKyAgICAgIGlmIChJWEZBX0RvY1ZpZXcqIHBEb2NWaWV3ID0gcERvYy0+R2V0WEZBRG9jVmlldygpKSB7CisgICAgICAgIG1fcFdpZGdldEhhbmRsZXIgPSBwRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbV9wV2lkZ2V0SGFuZGxlcjsKKyAgfQorCisgIHJldHVybiBOVUxMOwogfQogCi12b2lkIENQREZTREtfV2lkZ2V0OjpSZXNldEFwcGVhcmFuY2UoRlhfTFBDV1NUUiBzVmFsdWUsIEZYX0JPT0wgYlZhbHVlQ2hhbmdlZCkKLXsKLQlTZXRBcHBNb2RpZmllZCgpOworc3RhdGljIFhGQV9FVkVOVFRZUEUgR2V0WEZBRXZlbnRUeXBlKFBERlNES19YRkFBQWN0aW9uVHlwZSBlWEZBQUFUKSB7CisgIFhGQV9FVkVOVFRZUEUgZUV2ZW50VHlwZSA9IFhGQV9FVkVOVF9Vbmtub3duOwogCi0JbV9uQXBwQWdlKys7Ci0JaWYgKG1fbkFwcEFnZSA+IDk5OTk5OSkKLQkJbV9uQXBwQWdlID0gMDsKLQlpZiAoYlZhbHVlQ2hhbmdlZCkKLQkJbV9uVmFsdWVBZ2UrKzsKKyAgc3dpdGNoIChlWEZBQUFUKSB7CisgICAgY2FzZSBQREZTREtfWEZBX0NsaWNrOgorICAgICAgZUV2ZW50VHlwZSA9IFhGQV9FVkVOVF9DbGljazsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUERGU0RLX1hGQV9GdWxsOgorICAgICAgZUV2ZW50VHlwZSA9IFhGQV9FVkVOVF9GdWxsOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQREZTREtfWEZBX1ByZU9wZW46CisgICAgICBlRXZlbnRUeXBlID0gWEZBX0VWRU5UX1ByZU9wZW47CisgICAgICBicmVhazsKKyAgICBjYXNlIFBERlNES19YRkFfUG9zdE9wZW46CisgICAgICBlRXZlbnRUeXBlID0gWEZBX0VWRU5UX1Bvc3RPcGVuOworICAgICAgYnJlYWs7CisgIH0KIAotCWludCBuRmllbGRUeXBlID0gR2V0RmllbGRUeXBlKCk7Ci0JCi0Jc3dpdGNoIChuRmllbGRUeXBlKQotCXsKLQljYXNlIEZJRUxEVFlQRV9QVVNIQlVUVE9OOgotCQlSZXNldEFwcGVhcmFuY2VfUHVzaEJ1dHRvbigpOwotCQlicmVhazsKLQljYXNlIEZJRUxEVFlQRV9DSEVDS0JPWDoKLQkJUmVzZXRBcHBlYXJhbmNlX0NoZWNrQm94KCk7Ci0JCWJyZWFrOwotCWNhc2UgRklFTERUWVBFX1JBRElPQlVUVE9OOgotCQlSZXNldEFwcGVhcmFuY2VfUmFkaW9CdXR0b24oKTsKLQkJYnJlYWs7Ci0JY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6Ci0JCVJlc2V0QXBwZWFyYW5jZV9Db21ib0JveChzVmFsdWUpOwotCQlicmVhazsKLQljYXNlIEZJRUxEVFlQRV9MSVNUQk9YOgotCQlSZXNldEFwcGVhcmFuY2VfTGlzdEJveCgpOwotCQlicmVhazsKLQljYXNlIEZJRUxEVFlQRV9URVhURklFTEQ6Ci0JCVJlc2V0QXBwZWFyYW5jZV9UZXh0RmllbGQoc1ZhbHVlKTsKLQkJYnJlYWs7Ci0JfQotCQotCUFTU0VSVChtX3BBbm5vdCAhPSBOVUxMKTsKLQltX3BBbm5vdC0+Q2xlYXJDYWNoZWRBUCgpOworICByZXR1cm4gZUV2ZW50VHlwZTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BERlNES19XaWRnZXQ6Ok9uRm9ybWF0KGludCBuQ29tbWl0S2V5LCBGWF9CT09MJiBiRm9ybWF0ZWQpCi17Ci0gCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7Ci0gCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotIAkKLSAJQVNTRVJUKG1fcEludGVyRm9ybSAhPSBOVUxMKTsKLQkKLQlyZXR1cm4gbV9wSW50ZXJGb3JtLT5PbkZvcm1hdChwRm9ybUZpZWxkLCBuQ29tbWl0S2V5LCBiRm9ybWF0ZWQpOworc3RhdGljIFhGQV9FVkVOVFRZUEUgR2V0WEZBRXZlbnRUeXBlKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJXaWxsQ29tbWl0KSB7CisgIFhGQV9FVkVOVFRZUEUgZUV2ZW50VHlwZSA9IFhGQV9FVkVOVF9Vbmtub3duOwogCisgIHN3aXRjaCAoZUFBVCkgeworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpDdXJzb3JFbnRlcjoKKyAgICAgIGVFdmVudFR5cGUgPSBYRkFfRVZFTlRfTW91c2VFbnRlcjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpDdXJzb3JFeGl0OgorICAgICAgZUV2ZW50VHlwZSA9IFhGQV9FVkVOVF9Nb3VzZUV4aXQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6QnV0dG9uRG93bjoKKyAgICAgIGVFdmVudFR5cGUgPSBYRkFfRVZFTlRfTW91c2VEb3duOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FBY3Rpb246OkJ1dHRvblVwOgorICAgICAgZUV2ZW50VHlwZSA9IFhGQV9FVkVOVF9Nb3VzZVVwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FBY3Rpb246OkdldEZvY3VzOgorICAgICAgZUV2ZW50VHlwZSA9IFhGQV9FVkVOVF9FbnRlcjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpMb3NlRm9jdXM6CisgICAgICBlRXZlbnRUeXBlID0gWEZBX0VWRU5UX0V4aXQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6UGFnZU9wZW46CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6UGFnZUNsb3NlOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FBY3Rpb246OlBhZ2VWaXNpYmxlOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FBY3Rpb246OlBhZ2VJbnZpc2libGU6CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlOgorICAgICAgaWYgKCFiV2lsbENvbW1pdCkgeworICAgICAgICBlRXZlbnRUeXBlID0gWEZBX0VWRU5UX0NoYW5nZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZToKKyAgICAgIGVFdmVudFR5cGUgPSBYRkFfRVZFTlRfVmFsaWRhdGU7CisgICAgICBicmVhazsKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6T3BlblBhZ2U6CisgICAgY2FzZSBDUERGX0FBY3Rpb246OkNsb3NlUGFnZToKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6Rm9ybWF0OgorICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpDYWxjdWxhdGU6CisgICAgY2FzZSBDUERGX0FBY3Rpb246OkNsb3NlRG9jdW1lbnQ6CisgICAgY2FzZSBDUERGX0FBY3Rpb246OlNhdmVEb2N1bWVudDoKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6RG9jdW1lbnRTYXZlZDoKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6UHJpbnREb2N1bWVudDoKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6RG9jdW1lbnRQcmludGVkOgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gZUV2ZW50VHlwZTsKIH0KIAotdm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRGaWVsZEFwcGVhcmFuY2UoRlhfQk9PTCBiVmFsdWVDaGFuZ2VkKQotewotCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7Ci0JQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0JCi0JQVNTRVJUKG1fcEludGVyRm9ybSAhPSBOVUxMKTsKK0ZYX0JPT0wgQ1BERlNES19XaWRnZXQ6Okhhc1hGQUFBY3Rpb24oUERGU0RLX1hGQUFBY3Rpb25UeXBlIGVYRkFBQVQpIHsKKyAgaWYgKElYRkFfV2lkZ2V0KiBoV2lkZ2V0ID0gdGhpcy0+R2V0TWl4WEZBV2lkZ2V0KCkpIHsKKyAgICBpZiAoSVhGQV9XaWRnZXRIYW5kbGVyKiBwWEZBV2lkZ2V0SGFuZGxlciA9IHRoaXMtPkdldFhGQVdpZGdldEhhbmRsZXIoKSkgeworICAgICAgWEZBX0VWRU5UVFlQRSBlRXZlbnRUeXBlID0gR2V0WEZBRXZlbnRUeXBlKGVYRkFBQVQpOwogCi0JbV9wSW50ZXJGb3JtLT5SZXNldEZpZWxkQXBwZWFyYW5jZShwRm9ybUZpZWxkLCBOVUxMLCBiVmFsdWVDaGFuZ2VkKTsKKyAgICAgIGlmICgoZUV2ZW50VHlwZSA9PSBYRkFfRVZFTlRfQ2xpY2sgfHwgZUV2ZW50VHlwZSA9PSBYRkFfRVZFTlRfQ2hhbmdlKSAmJgorICAgICAgICAgIEdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9SQURJT0JVVFRPTikgeworICAgICAgICBpZiAoSVhGQV9XaWRnZXQqIGhHcm91cFdpZGdldCA9IEdldEdyb3VwTWl4WEZBV2lkZ2V0KCkpIHsKKyAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhHcm91cFdpZGdldCk7CisgICAgICAgICAgaWYgKHBYRkFXaWRnZXRIYW5kbGVyLT5IYXNFdmVudChwQWNjLCBlRXZlbnRUeXBlKSkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHsKKyAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBwWEZBV2lkZ2V0SGFuZGxlci0+R2V0RGF0YUFjYyhoV2lkZ2V0KTsKKyAgICAgICAgcmV0dXJuIHBYRkFXaWRnZXRIYW5kbGVyLT5IYXNFdmVudChwQWNjLCBlRXZlbnRUeXBlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gRkFMU0U7CiB9CiAKLXZvaWQJQ1BERlNES19XaWRnZXQ6OkRyYXdBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGNvbnN0IENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0JCUNQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUsIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpCi17Ci0JaW50IG5GaWVsZFR5cGUgPSBHZXRGaWVsZFR5cGUoKTsKLQkKLQlpZiAoKG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX0NIRUNLQk9YIHx8IG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKSAmJgotCQltb2RlID09IENQREZfQW5ub3Q6Ok5vcm1hbCAmJiAKLQkJIXRoaXMtPklzV2lkZ2V0QXBwZWFyYW5jZVZhbGlkKENQREZfQW5ub3Q6Ok5vcm1hbCkpCi0JewotCQlDRlhfUGF0aERhdGEgcGF0aERhdGE7Ci0JCQotCQlDUERGX1JlY3QgcmNBbm5vdCA9IHRoaXMtPkdldFJlY3QoKTsKLQkJCi0JCXBhdGhEYXRhLkFwcGVuZFJlY3QocmNBbm5vdC5sZWZ0LCByY0Fubm90LmJvdHRvbSwKLQkJCXJjQW5ub3QucmlnaHQsIHJjQW5ub3QudG9wKTsKLQkJCi0JCUNGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7Ci0JCWdzZC5tX0xpbmVXaWR0aCA9IDAuMGY7Ci0JCQotCQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aERhdGEsIHBVc2VyMkRldmljZSwgJmdzZCwgMCwgMHhGRkFBQUFBQSwgRlhGSUxMX0FMVEVSTkFURSk7Ci0JfQotCWVsc2UKLQl7Ci0JCUNQREZTREtfQW5ub3Q6OkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgbW9kZSwgcE9wdGlvbnMpOwotCX0KK0ZYX0JPT0wgQ1BERlNES19XaWRnZXQ6Ok9uWEZBQUFjdGlvbihQREZTREtfWEZBQUFjdGlvblR5cGUgZVhGQUFBVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CisgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBtX3BQYWdlVmlldy0+R2V0U0RLRG9jdW1lbnQoKTsKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IHBTREtEb2MtPkdldFhGQURvY3VtZW50KCk7CisgIGlmIChJWEZBX1dpZGdldCogaFdpZGdldCA9IEdldE1peFhGQVdpZGdldCgpKSB7CisgICAgWEZBX0VWRU5UVFlQRSBlRXZlbnRUeXBlID0gR2V0WEZBRXZlbnRUeXBlKGVYRkFBQVQpOworCisgICAgaWYgKGVFdmVudFR5cGUgIT0gWEZBX0VWRU5UX1Vua25vd24pIHsKKyAgICAgIGlmIChJWEZBX1dpZGdldEhhbmRsZXIqIHBYRkFXaWRnZXRIYW5kbGVyID0gdGhpcy0+R2V0WEZBV2lkZ2V0SGFuZGxlcigpKSB7CisgICAgICAgIENYRkFfRXZlbnRQYXJhbSBwYXJhbTsKKyAgICAgICAgcGFyYW0ubV9lVHlwZSA9IGVFdmVudFR5cGU7CisgICAgICAgIHBhcmFtLm1fd3NDaGFuZ2UgPSBkYXRhLnNDaGFuZ2U7CisgICAgICAgIHBhcmFtLm1faUNvbW1pdEtleSA9IGRhdGEubkNvbW1pdEtleTsKKyAgICAgICAgcGFyYW0ubV9iU2hpZnQgPSBkYXRhLmJTaGlmdDsKKyAgICAgICAgcGFyYW0ubV9pU2VsU3RhcnQgPSBkYXRhLm5TZWxTdGFydDsKKyAgICAgICAgcGFyYW0ubV9pU2VsRW5kID0gZGF0YS5uU2VsRW5kOworICAgICAgICBwYXJhbS5tX3dzRnVsbFRleHQgPSBkYXRhLnNWYWx1ZTsKKyAgICAgICAgcGFyYW0ubV9iS2V5RG93biA9IGRhdGEuYktleURvd247CisgICAgICAgIHBhcmFtLm1fYk1vZGlmaWVyID0gZGF0YS5iTW9kaWZpZXI7CisgICAgICAgIHBhcmFtLm1fd3NOZXdUZXh0ID0gZGF0YS5zVmFsdWU7CisgICAgICAgIGlmIChkYXRhLm5TZWxFbmQgPiBkYXRhLm5TZWxTdGFydCkKKyAgICAgICAgICBwYXJhbS5tX3dzTmV3VGV4dC5EZWxldGUoZGF0YS5uU2VsU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEublNlbEVuZCAtIGRhdGEublNlbFN0YXJ0KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLnNDaGFuZ2UuR2V0TGVuZ3RoKCk7IGkrKykKKyAgICAgICAgICBwYXJhbS5tX3dzTmV3VGV4dC5JbnNlcnQoZGF0YS5uU2VsU3RhcnQsIGRhdGEuc0NoYW5nZVtpXSk7CisgICAgICAgIHBhcmFtLm1fd3NQcmV2VGV4dCA9IGRhdGEuc1ZhbHVlOworCisgICAgICAgIGlmICgoZUV2ZW50VHlwZSA9PSBYRkFfRVZFTlRfQ2xpY2sgfHwgZUV2ZW50VHlwZSA9PSBYRkFfRVZFTlRfQ2hhbmdlKSAmJgorICAgICAgICAgICAgR2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKSB7CisgICAgICAgICAgaWYgKElYRkFfV2lkZ2V0KiBoR3JvdXBXaWRnZXQgPSBHZXRHcm91cE1peFhGQVdpZGdldCgpKSB7CisgICAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhHcm91cFdpZGdldCk7CisgICAgICAgICAgICBwYXJhbS5tX3BUYXJnZXQgPSBwQWNjOworICAgICAgICAgICAgcFhGQVdpZGdldEhhbmRsZXItPlByb2Nlc3NFdmVudChwQWNjLCAmcGFyYW0pOworICAgICAgICAgIH0KKworICAgICAgICAgIHsKKyAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gcFhGQVdpZGdldEhhbmRsZXItPkdldERhdGFBY2MoaFdpZGdldCk7CisgICAgICAgICAgICBwYXJhbS5tX3BUYXJnZXQgPSBwQWNjOworICAgICAgICAgICAgaW50MzJfdCBuUmV0ID0gcFhGQVdpZGdldEhhbmRsZXItPlByb2Nlc3NFdmVudChwQWNjLCAmcGFyYW0pOworICAgICAgICAgICAgcmV0dXJuIG5SZXQgPT0gWEZBX0VWRU5URVJST1JfU3VjZXNzOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhXaWRnZXQpOworICAgICAgICAgIHBhcmFtLm1fcFRhcmdldCA9IHBBY2M7CisgICAgICAgICAgaW50MzJfdCBuUmV0ID0gcFhGQVdpZGdldEhhbmRsZXItPlByb2Nlc3NFdmVudChwQWNjLCAmcGFyYW0pOworICAgICAgICAgIHJldHVybiBuUmV0ID09IFhGQV9FVkVOVEVSUk9SX1N1Y2VzczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChJWEZBX0RvY1ZpZXcqIHBEb2NWaWV3ID0gcERvYy0+R2V0WEZBRG9jVmlldygpKSB7CisgICAgICAgICAgcERvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBGQUxTRTsKIH0KIAotdm9pZCBDUERGU0RLX1dpZGdldDo6VXBkYXRlRmllbGQoKQotewotCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7Ci0JQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0JCi0JQVNTRVJUKG1fcEludGVyRm9ybSAhPSBOVUxMKTsKLQltX3BJbnRlckZvcm0tPlVwZGF0ZUZpZWxkKHBGb3JtRmllbGQpOwordm9pZCBDUERGU0RLX1dpZGdldDo6U3luY2hyb25pemUoRlhfQk9PTCBiU3luY2hyb25pemVFbHNlKSB7CisgIGlmIChJWEZBX1dpZGdldCogaFdpZGdldCA9IHRoaXMtPkdldE1peFhGQVdpZGdldCgpKSB7CisgICAgaWYgKElYRkFfV2lkZ2V0SGFuZGxlciogcFhGQVdpZGdldEhhbmRsZXIgPSB0aGlzLT5HZXRYRkFXaWRnZXRIYW5kbGVyKCkpIHsKKyAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CisgICAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKworICAgICAgaWYgKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gcFhGQVdpZGdldEhhbmRsZXItPkdldERhdGFBY2MoaFdpZGdldCkpIHsKKyAgICAgICAgc3dpdGNoIChHZXRGaWVsZFR5cGUoKSkgeworICAgICAgICAgIGNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgorICAgICAgICAgIGNhc2UgRklFTERUWVBFX1JBRElPQlVUVE9OOiB7CisgICAgICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBHZXRGb3JtQ29udHJvbCgpOworICAgICAgICAgICAgQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKKworICAgICAgICAgICAgWEZBX0NIRUNLU1RBVEUgZUNoZWNrU3RhdGUgPQorICAgICAgICAgICAgICAgIHBGb3JtQ3RybC0+SXNDaGVja2VkKCkgPyBYRkFfQ0hFQ0tTVEFURV9PbiA6IFhGQV9DSEVDS1NUQVRFX09mZjsKKyAgICAgICAgICAgIHBXaWRnZXRBY2MtPlNldENoZWNrU3RhdGUoZUNoZWNrU3RhdGUpOworICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgY2FzZSBGSUVMRFRZUEVfVEVYVEZJRUxEOgorICAgICAgICAgICAgcFdpZGdldEFjYy0+U2V0VmFsdWUocEZvcm1GaWVsZC0+R2V0VmFsdWUoKSwgWEZBX1ZBTFVFUElDVFVSRV9FZGl0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgRklFTERUWVBFX0xJU1RCT1g6IHsKKyAgICAgICAgICAgIHBXaWRnZXRBY2MtPkNsZWFyQWxsU2VsZWN0aW9ucygpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudFNlbGVjdGVkSXRlbXMoKTsgaSA8IHN6OworICAgICAgICAgICAgICAgICBpKyspIHsKKyAgICAgICAgICAgICAgaW50IG5JbmRleCA9IHBGb3JtRmllbGQtPkdldFNlbGVjdGVkSW5kZXgoaSk7CisgICAgICAgICAgICAgIGlmIChuSW5kZXggPiAtMSAmJiBuSW5kZXggPCBwV2lkZ2V0QWNjLT5Db3VudENob2ljZUxpc3RJdGVtcygpKQorICAgICAgICAgICAgICAgIHBXaWRnZXRBY2MtPlNldEl0ZW1TdGF0ZShuSW5kZXgsIFRSVUUsIEZBTFNFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgIGNhc2UgRklFTERUWVBFX0NPTUJPQk9YOiB7CisgICAgICAgICAgICBwV2lkZ2V0QWNjLT5DbGVhckFsbFNlbGVjdGlvbnMoKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gcEZvcm1GaWVsZC0+Q291bnRTZWxlY3RlZEl0ZW1zKCk7IGkgPCBzejsKKyAgICAgICAgICAgICAgICAgaSsrKSB7CisgICAgICAgICAgICAgIGludCBuSW5kZXggPSBwRm9ybUZpZWxkLT5HZXRTZWxlY3RlZEluZGV4KGkpOworICAgICAgICAgICAgICBpZiAobkluZGV4ID4gLTEgJiYgbkluZGV4IDwgcFdpZGdldEFjYy0+Q291bnRDaG9pY2VMaXN0SXRlbXMoKSkKKyAgICAgICAgICAgICAgICBwV2lkZ2V0QWNjLT5TZXRJdGVtU3RhdGUobkluZGV4LCBUUlVFLCBGQUxTRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgICBwV2lkZ2V0QWNjLT5TZXRWYWx1ZShwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpLCBYRkFfVkFMVUVQSUNUVVJFX0VkaXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYlN5bmNocm9uaXplRWxzZSkKKyAgICAgICAgICBwV2lkZ2V0QWNjLT5Qcm9jZXNzVmFsdWVDaGFuZ2VkKCk7CisgICAgICB9CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ1BERlNES19XaWRnZXQ6OkRyYXdTaGFkb3coQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQotewotIAlBU1NFUlQobV9wSW50ZXJGb3JtICE9IE5VTEwpOwotIAotCWludCBuRmllbGRUeXBlID0gR2V0RmllbGRUeXBlKCk7Ci0gCWlmIChtX3BJbnRlckZvcm0tPklzTmVlZEhpZ2hMaWdodChuRmllbGRUeXBlKSkKLSAJewotIAotLy8gIAkJaWYgKG5GaWVsZFR5cGUgIT0gRklFTERUWVBFX1BVU0hCVVRUT04pCi0vLyAgCQl7Ci0JCQlDUERGX1JlY3QgcmMgID0gR2V0UmVjdCgpOwotCQkJRlhfQ09MT1JSRUYgY29sb3IgPSBtX3BJbnRlckZvcm0tPkdldEhpZ2hsaWdodENvbG9yKG5GaWVsZFR5cGUpOwotCQkJRlhfQllURSBhbHBoYSA9IG1fcEludGVyRm9ybS0+R2V0SGlnaGxpZ2h0QWxwaGEoKTsKK3ZvaWQgQ1BERlNES19XaWRnZXQ6OlN5bmNocm9uaXplWEZBVmFsdWUoKSB7CisgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBtX3BQYWdlVmlldy0+R2V0U0RLRG9jdW1lbnQoKTsKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IHBTREtEb2MtPkdldFhGQURvY3VtZW50KCk7CisgIElYRkFfRG9jVmlldyogcFhGQURvY1ZpZXcgPSBwRG9jLT5HZXRYRkFEb2NWaWV3KCk7CisgIGlmICghcFhGQURvY1ZpZXcpCisgICAgcmV0dXJuOwogCi0JCQlDRlhfRmxvYXRSZWN0IHJjRGV2aWNlOwotCQkJQVNTRVJUKG1fcEludGVyRm9ybS0+R2V0RG9jdW1lbnQoKSk7Ci0JCQlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wSW50ZXJGb3JtLT5HZXREb2N1bWVudCgpLT5HZXRFbnYoKTsKLQkJCWlmKCFwRW52KQotCQkJCXJldHVybjsKLQkJCUNGWF9BZmZpbmVNYXRyaXggcGFnZTJkZXZpY2U7Ci0JCQlwUGFnZVZpZXctPkdldEN1cnJlbnRNYXRyaXgocGFnZTJkZXZpY2UpOwotCQkJcGFnZTJkZXZpY2UuVHJhbnNmb3JtKCgoRlhfRkxPQVQpcmMubGVmdCksICgoRlhfRkxPQVQpcmMuYm90dG9tKSwgcmNEZXZpY2UubGVmdCwgcmNEZXZpY2UuYm90dG9tKTsKLS8vIAkJCXBFbnYtPkZGSV9QYWdlVG9EZXZpY2UobV9wUGFnZVZpZXctPkdldFBERlBhZ2UoKSwgcmMubGVmdCwgcmMuYm90dG9tLCAmcmNEZXZpY2UubGVmdCwgJnJjRGV2aWNlLmJvdHRvbSk7Ci0vLyAJCQlwRW52LT5GRklfUGFnZVRvRGV2aWNlKG1fcFBhZ2VWaWV3LT5HZXRQREZQYWdlKCksIHJjLnJpZ2h0LCByYy50b3AsICZyY0RldmljZS5yaWdodCwgJnJjRGV2aWNlLnRvcCk7Ci0JCQlwYWdlMmRldmljZS5UcmFuc2Zvcm0oKChGWF9GTE9BVClyYy5yaWdodCksICgoRlhfRkxPQVQpcmMudG9wKSwgcmNEZXZpY2UucmlnaHQsIHJjRGV2aWNlLnRvcCk7Ci0KLQkJCXJjRGV2aWNlLk5vcm1hbGl6ZSgpOwotCi0JCQlGWF9BUkdCIGFyZ2IgPSBBcmdiRW5jb2RlKChpbnQpYWxwaGEsIGNvbG9yKTsKLQkJCUZYX1JFQ1QgcmNEZXYoKGludClyY0RldmljZS5sZWZ0LChpbnQpcmNEZXZpY2UudG9wLChpbnQpcmNEZXZpY2UucmlnaHQsKGludClyY0RldmljZS5ib3R0b20pOwotCQkJcERldmljZS0+RmlsbFJlY3QoJnJjRGV2LCBhcmdiKTsJCi0JCQkvKiAJCX0qLwotCX0KKyAgaWYgKElYRkFfV2lkZ2V0KiBoV2lkZ2V0ID0gR2V0TWl4WEZBV2lkZ2V0KCkpIHsKKyAgICBpZiAoR2V0WEZBV2lkZ2V0SGFuZGxlcigpKSB7CisgICAgICBDUERGU0RLX1dpZGdldDo6U3luY2hyb25pemVYRkFWYWx1ZShwWEZBRG9jVmlldywgaFdpZGdldCwgR2V0Rm9ybUZpZWxkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRGb3JtQ29udHJvbCgpKTsKKyAgICB9CisgIH0KIH0KIAotdm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRBcHBlYXJhbmNlX1B1c2hCdXR0b24oKQotewotCUNQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gR2V0Rm9ybUNvbnRyb2woKTsKLQlBU1NFUlQocENvbnRyb2wgIT0gTlVMTCk7Cit2b2lkIENQREZTREtfV2lkZ2V0OjpTeW5jaHJvbml6ZVhGQUl0ZW1zKCkgeworICBDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jID0gbV9wUGFnZVZpZXctPkdldFNES0RvY3VtZW50KCk7CisgIENQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSBwU0RLRG9jLT5HZXRYRkFEb2N1bWVudCgpOworICBJWEZBX0RvY1ZpZXcqIHBYRkFEb2NWaWV3ID0gcERvYy0+R2V0WEZBRG9jVmlldygpOworICBpZiAoIXBYRkFEb2NWaWV3KQorICAgIHJldHVybjsKIAotCi0JCi0JQ1BERl9SZWN0IHJjV2luZG93ID0gR2V0Um90YXRlZFJlY3QoKTsJCi0KLQlGWF9JTlQzMiBuTGF5b3V0ID0gMDsKLQotCXN3aXRjaCAocENvbnRyb2wtPkdldFRleHRQb3NpdGlvbigpKQotCXsKLQljYXNlIFRFWFRQT1NfSUNPTjoKLQkJbkxheW91dCA9IFBQQkxfSUNPTjsKLQkJYnJlYWs7Ci0JY2FzZSBURVhUUE9TX0JFTE9XOgotCQluTGF5b3V0ID0gUFBCTF9JQ09OVE9QTEFCRUxCT1RUT007Ci0JCWJyZWFrOwotCWNhc2UgVEVYVFBPU19BQk9WRToKLQkJbkxheW91dCA9IFBQQkxfTEFCRUxUT1BJQ09OQk9UVE9NOwotCQlicmVhazsKLQljYXNlIFRFWFRQT1NfUklHSFQ6Ci0JCW5MYXlvdXQgPSBQUEJMX0lDT05MRUZUTEFCRUxSSUdIVDsKLQkJYnJlYWs7Ci0JY2FzZSBURVhUUE9TX0xFRlQ6Ci0JCW5MYXlvdXQgPSBQUEJMX0xBQkVMTEVGVElDT05SSUdIVDsKLQkJYnJlYWs7Ci0JY2FzZSBURVhUUE9TX09WRVJMQUlEOgotCQluTGF5b3V0ID0gUFBCTF9MQUJFTE9WRVJJQ09OOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQluTGF5b3V0ID0gUFBCTF9MQUJFTDsKLQkJYnJlYWs7Ci0JfQotCi0JQ1BXTF9Db2xvciBjckJhY2tncm91bmQsIGNyQm9yZGVyOwotCi0JaW50IGlDb2xvclR5cGU7Ci0JRlhfRkxPQVQgZmNbNF07Ci0KLQlwQ29udHJvbC0+R2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoaUNvbG9yVHlwZSwgZmMpOwotCWlmIChpQ29sb3JUeXBlID4gMCkKLQkJY3JCYWNrZ3JvdW5kID0gQ1BXTF9Db2xvcihpQ29sb3JUeXBlLCBmY1swXSwgZmNbMV0sIGZjWzJdLCBmY1szXSk7Ci0KLQlwQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcihpQ29sb3JUeXBlLCBmYyk7Ci0JaWYgKGlDb2xvclR5cGUgPiAwKQotCQljckJvcmRlciA9IENQV0xfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOwotCi0JRlhfRkxPQVQgZkJvcmRlcldpZHRoID0gKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCk7Ci0JRlhfSU5UMzIgbkJvcmRlclN0eWxlID0gMDsKLQlDUFdMX0Rhc2ggZHNCb3JkZXIoMywwLDApOwotCUNQV0xfQ29sb3IgY3JMZWZ0VG9wLGNyUmlnaHRCb3R0b207Ci0KLQlzd2l0Y2ggKEdldEJvcmRlclN0eWxlKCkpCi0JewotCWNhc2UgQkJTX0RBU0g6Ci0JCW5Cb3JkZXJTdHlsZSA9IFBCU19EQVNIOwotCQlkc0JvcmRlciA9IENQV0xfRGFzaCgzLCAzLCAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBCQlNfQkVWRUxFRDoKLQkJbkJvcmRlclN0eWxlID0gUEJTX0JFVkVMRUQ7Ci0JCWZCb3JkZXJXaWR0aCAqPSAyOwotCQljckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLDEpOwotCQljclJpZ2h0Qm90dG9tID0gQ1BXTF9VdGlsczo6RGV2aWRlQ29sb3IoY3JCYWNrZ3JvdW5kLDIpOwotCQlicmVhazsKLQljYXNlIEJCU19JTlNFVDoKLQkJbkJvcmRlclN0eWxlID0gUEJTX0lOU0VUOwotCQlmQm9yZGVyV2lkdGggKj0gMjsKLQkJY3JMZWZ0VG9wID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwwLjUpOwotCQljclJpZ2h0Qm90dG9tID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwwLjc1KTsKLQkJYnJlYWs7Ci0JY2FzZSBCQlNfVU5ERVJMSU5FOgotCQluQm9yZGVyU3R5bGUgPSBQQlNfVU5ERVJMSU5FRDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDogCi0JCW5Cb3JkZXJTdHlsZSA9IFBCU19TT0xJRDsKLQkJYnJlYWs7Ci0JfQotCi0JQ1BERl9SZWN0IHJjQ2xpZW50ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmNXaW5kb3csZkJvcmRlcldpZHRoKTsJCi0KLQlDUFdMX0NvbG9yIGNyVGV4dChDT0xPUlRZUEVfR1JBWSwwKTsKLQotCUZYX0ZMT0FUIGZGb250U2l6ZSA9IDEyLjBmOwotCUNGWF9CeXRlU3RyaW5nIGNzTmFtZVRhZzsKLQotCUNQREZfRGVmYXVsdEFwcGVhcmFuY2UgZGEgPSBwQ29udHJvbC0+R2V0RGVmYXVsdEFwcGVhcmFuY2UoKTsKLQlpZiAoZGEuSGFzQ29sb3IoKSkKLQl7Ci0JCWRhLkdldENvbG9yKGlDb2xvclR5cGUsIGZjKTsKLQkJY3JUZXh0ID0gQ1BXTF9Db2xvcihpQ29sb3JUeXBlLCBmY1swXSwgZmNbMV0sIGZjWzJdLCBmY1szXSk7Ci0JfQotCi0JaWYgKGRhLkhhc0ZvbnQoKSkgCi0JCWRhLkdldEZvbnQoY3NOYW1lVGFnLCBmRm9udFNpemUpOwotCi0JQ0ZYX1dpZGVTdHJpbmcgY3NXQ2FwdGlvbjsKLQlDRlhfV2lkZVN0cmluZyBjc05vcm1hbENhcHRpb24sIGNzUm9sbG92ZXJDYXB0aW9uLCBjc0Rvd25DYXB0aW9uOwotCi0JaWYgKHBDb250cm9sLT5IYXNNS0VudHJ5KCJDQSIpKQotCXsKLQkJY3NOb3JtYWxDYXB0aW9uID0gcENvbnRyb2wtPkdldE5vcm1hbENhcHRpb24oKTsKLQl9Ci0JaWYgKHBDb250cm9sLT5IYXNNS0VudHJ5KCJSQyIpKQotCXsKLQkJY3NSb2xsb3ZlckNhcHRpb24gPSBwQ29udHJvbC0+R2V0Um9sbG92ZXJDYXB0aW9uKCk7Ci0JfQotCWlmIChwQ29udHJvbC0+SGFzTUtFbnRyeSgiQUMiKSkKLQl7Ci0JCWNzRG93bkNhcHRpb24gPSBwQ29udHJvbC0+R2V0RG93bkNhcHRpb24oKTsKLQl9Ci0KLQlDUERGX1N0cmVhbSogcE5vcm1hbEljb24gPSBOVUxMOwotCUNQREZfU3RyZWFtKiBwUm9sbG92ZXJJY29uID0gTlVMTDsKLQlDUERGX1N0cmVhbSogcERvd25JY29uID0gTlVMTDsKLQotCWlmIChwQ29udHJvbC0+SGFzTUtFbnRyeSgiSSIpKQotCXsKLQkJcE5vcm1hbEljb24gPSBwQ29udHJvbC0+R2V0Tm9ybWFsSWNvbigpOwotCX0KLQlpZiAocENvbnRyb2wtPkhhc01LRW50cnkoIlJJIikpCi0JewotCQlwUm9sbG92ZXJJY29uID0gcENvbnRyb2wtPkdldFJvbGxvdmVySWNvbigpOwotCX0KLQlpZiAocENvbnRyb2wtPkhhc01LRW50cnkoIklYIikpCi0JewotCQlwRG93bkljb24gPSBwQ29udHJvbC0+R2V0RG93bkljb24oKTsKLQl9Ci0KLQlpZiAocE5vcm1hbEljb24pCi0JewotCQlpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwSW1hZ2VEaWN0ID0gcE5vcm1hbEljb24tPkdldERpY3QoKSkKLQkJewotCQkJaWYgKHBJbWFnZURpY3QtPkdldFN0cmluZygiTmFtZSIpLklzRW1wdHkoKSkKLQkJCQlwSW1hZ2VEaWN0LT5TZXRBdFN0cmluZygiTmFtZSIsICJJbWdBIik7Ci0JCX0KLQl9Ci0KLQlpZiAocFJvbGxvdmVySWNvbikKLQl7Ci0JCWlmIChDUERGX0RpY3Rpb25hcnkqIHBJbWFnZURpY3QgPSBwUm9sbG92ZXJJY29uLT5HZXREaWN0KCkpCi0JCXsKLQkJCWlmIChwSW1hZ2VEaWN0LT5HZXRTdHJpbmcoIk5hbWUiKS5Jc0VtcHR5KCkpCi0JCQkJcEltYWdlRGljdC0+U2V0QXRTdHJpbmcoIk5hbWUiLCAiSW1nQiIpOwotCQl9Ci0JfQotCi0JaWYgKHBEb3duSWNvbikKLQl7Ci0JCWlmIChDUERGX0RpY3Rpb25hcnkqIHBJbWFnZURpY3QgPSBwRG93bkljb24tPkdldERpY3QoKSkKLQkJewotCQkJaWYgKHBJbWFnZURpY3QtPkdldFN0cmluZygiTmFtZSIpLklzRW1wdHkoKSkKLQkJCQlwSW1hZ2VEaWN0LT5TZXRBdFN0cmluZygiTmFtZSIsICJJbWdDIik7Ci0JCX0KLQl9Ci0KLQlDUERGX0ljb25GaXQgaWNvbkZpdCA9IHBDb250cm9sLT5HZXRJY29uRml0KCk7Ci0KLS8vIAlBU1NFUlQodGhpcy0+bV9wQmFzZUZvcm0gIT0gTlVMTCk7Ci0JQVNTRVJUKHRoaXMtPm1fcEludGVyRm9ybSAhPSBOVUxMKTsKLQlDUERGU0RLX0RvY3VtZW50KiBwRG9jID0gbV9wSW50ZXJGb3JtLT5HZXREb2N1bWVudCgpOwotCUFTU0VSVChwRG9jICE9IE5VTEwpOwotCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBwRG9jLT5HZXRFbnYoKTsKLQotIAlDQkFfRm9udE1hcCBGb250TWFwKHRoaXMscEVudi0+R2V0U3lzSGFuZGxlcigpKTsvLywgSVN5c3RlbUhhbmRsZTo6R2V0U3lzdGVtSGFuZGxlcihtX3BCYXNlRm9ybS0+R2V0RW52KCkpKTsKLQlGb250TWFwLkluaXRpYWwoKTsKLQotCUZvbnRNYXAuU2V0QVBUeXBlKCJOIik7Ci0KLQlDRlhfQnl0ZVN0cmluZyBjc0FQID0gQ1BXTF9VdGlsczo6R2V0UmVjdEZpbGxBcHBTdHJlYW0ocmNXaW5kb3csIGNyQmFja2dyb3VuZCkgKyAKLQkJQ1BXTF9VdGlsczo6R2V0Qm9yZGVyQXBwU3RyZWFtKHJjV2luZG93LCBmQm9yZGVyV2lkdGgsIGNyQm9yZGVyLCBjckxlZnRUb3AsIGNyUmlnaHRCb3R0b20sIG5Cb3JkZXJTdHlsZSwgZHNCb3JkZXIpICsKLQkJQ1BXTF9VdGlsczo6R2V0UHVzaEJ1dHRvbkFwcFN0cmVhbShpY29uRml0LkdldEZpdHRpbmdCb3VuZHMoKSA/IHJjV2luZG93IDogcmNDbGllbnQsICZGb250TWFwLCBwTm9ybWFsSWNvbiwgaWNvbkZpdCwgY3NOb3JtYWxDYXB0aW9uLCBjclRleHQsIGZGb250U2l6ZSwgbkxheW91dCk7Ci0KLQlXcml0ZUFwcGVhcmFuY2UoIk4iLCBHZXRSb3RhdGVkUmVjdCgpLCBHZXRNYXRyaXgoKSwgY3NBUCk7Ci0JaWYgKHBOb3JtYWxJY29uKQotCQlBZGRJbWFnZVRvQXBwZWFyYW5jZSgiTiIsIHBOb3JtYWxJY29uKTsKLQotCUNQREZfRm9ybUNvbnRyb2w6OkhpZ2hsaWdodGluZ01vZGUgZUhMTSA9IHBDb250cm9sLT5HZXRIaWdobGlnaHRpbmdNb2RlKCk7Ci0JaWYgKGVITE0gPT0gQ1BERl9Gb3JtQ29udHJvbDo6UHVzaCB8fCBlSExNID09IENQREZfRm9ybUNvbnRyb2w6OlRvZ2dsZSkKLQl7Ci0JCWlmIChjc1JvbGxvdmVyQ2FwdGlvbi5Jc0VtcHR5KCkgJiYgIXBSb2xsb3Zlckljb24pCQkJCi0JCXsKLQkJCWNzUm9sbG92ZXJDYXB0aW9uID0gY3NOb3JtYWxDYXB0aW9uOwotCQkJcFJvbGxvdmVySWNvbiA9IHBOb3JtYWxJY29uOwotCQl9Ci0KLQkJRm9udE1hcC5TZXRBUFR5cGUoIlIiKTsKLQotCQljc0FQID0gQ1BXTF9VdGlsczo6R2V0UmVjdEZpbGxBcHBTdHJlYW0ocmNXaW5kb3csIGNyQmFja2dyb3VuZCkgKyAKLQkJCQlDUFdMX1V0aWxzOjpHZXRCb3JkZXJBcHBTdHJlYW0ocmNXaW5kb3csIGZCb3JkZXJXaWR0aCwgY3JCb3JkZXIsIGNyTGVmdFRvcCwgY3JSaWdodEJvdHRvbSwgbkJvcmRlclN0eWxlLCBkc0JvcmRlcikgKwotCQkJCUNQV0xfVXRpbHM6OkdldFB1c2hCdXR0b25BcHBTdHJlYW0oaWNvbkZpdC5HZXRGaXR0aW5nQm91bmRzKCkgPyByY1dpbmRvdyA6IHJjQ2xpZW50LCAmRm9udE1hcCwgcFJvbGxvdmVySWNvbiwgaWNvbkZpdCwgY3NSb2xsb3ZlckNhcHRpb24sIGNyVGV4dCwgZkZvbnRTaXplLCBuTGF5b3V0KTsKLQotCQlXcml0ZUFwcGVhcmFuY2UoIlIiLCBHZXRSb3RhdGVkUmVjdCgpLCBHZXRNYXRyaXgoKSwgY3NBUCk7Ci0JCWlmIChwUm9sbG92ZXJJY29uKQotCQkJQWRkSW1hZ2VUb0FwcGVhcmFuY2UoIlIiLCBwUm9sbG92ZXJJY29uKTsKLQotCQlpZiAoY3NEb3duQ2FwdGlvbi5Jc0VtcHR5KCkgJiYgIXBEb3duSWNvbikKLQkJewotCQkJY3NEb3duQ2FwdGlvbiA9IGNzTm9ybWFsQ2FwdGlvbjsKLQkJCXBEb3duSWNvbiA9IHBOb3JtYWxJY29uOwotCQl9Ci0KLQkJc3dpdGNoIChuQm9yZGVyU3R5bGUpCi0JCXsKLQkJY2FzZSBQQlNfQkVWRUxFRDoKLQkJCXsKLQkJCQlDUFdMX0NvbG9yIGNyVGVtcCA9IGNyTGVmdFRvcDsKLQkJCQljckxlZnRUb3AgPSBjclJpZ2h0Qm90dG9tOwotCQkJCWNyUmlnaHRCb3R0b20gPSBjclRlbXA7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBQQlNfSU5TRVQ6Ci0JCQljckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLDApOwotCQkJY3JSaWdodEJvdHRvbSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksMSk7Ci0JCQlicmVhazsKLQkJfQotCQkKLQkJRm9udE1hcC5TZXRBUFR5cGUoIkQiKTsKLQotCQljc0FQID0gQ1BXTF9VdGlsczo6R2V0UmVjdEZpbGxBcHBTdHJlYW0ocmNXaW5kb3csIENQV0xfVXRpbHM6OlN1YnN0cmFjdENvbG9yKGNyQmFja2dyb3VuZCwwLjI1ZikpICsgCi0JCQlDUFdMX1V0aWxzOjpHZXRCb3JkZXJBcHBTdHJlYW0ocmNXaW5kb3csIGZCb3JkZXJXaWR0aCwgY3JCb3JkZXIsIGNyTGVmdFRvcCwgY3JSaWdodEJvdHRvbSwgbkJvcmRlclN0eWxlLCBkc0JvcmRlcikgKyAKLQkJCUNQV0xfVXRpbHM6OkdldFB1c2hCdXR0b25BcHBTdHJlYW0oaWNvbkZpdC5HZXRGaXR0aW5nQm91bmRzKCkgPyByY1dpbmRvdyA6IHJjQ2xpZW50LCAmRm9udE1hcCwgcERvd25JY29uLCBpY29uRml0LCBjc0Rvd25DYXB0aW9uLCBjclRleHQsIGZGb250U2l6ZSwgbkxheW91dCk7Ci0KLQkJV3JpdGVBcHBlYXJhbmNlKCJEIiwgR2V0Um90YXRlZFJlY3QoKSwgR2V0TWF0cml4KCksIGNzQVApOwotCQlpZiAocERvd25JY29uKQotCQkJQWRkSW1hZ2VUb0FwcGVhcmFuY2UoIkQiLCBwRG93bkljb24pOwotCX0KLQllbHNlCi0JewotCQlSZW1vdmVBcHBlYXJhbmNlKCJEIik7Ci0JCVJlbW92ZUFwcGVhcmFuY2UoIlIiKTsKLQl9CisgIGlmIChJWEZBX1dpZGdldCogaFdpZGdldCA9IEdldE1peFhGQVdpZGdldCgpKSB7CisgICAgaWYgKEdldFhGQVdpZGdldEhhbmRsZXIoKSkKKyAgICAgIFN5bmNocm9uaXplWEZBSXRlbXMocFhGQURvY1ZpZXcsIGhXaWRnZXQsIEdldEZvcm1GaWVsZCgpLCBudWxscHRyKTsKKyAgfQogfQogCi12b2lkIENQREZTREtfV2lkZ2V0OjpSZXNldEFwcGVhcmFuY2VfQ2hlY2tCb3goKQotewotCUNQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gR2V0Rm9ybUNvbnRyb2woKTsKLQlBU1NFUlQocENvbnRyb2wgIT0gTlVMTCk7Cit2b2lkIENQREZTREtfV2lkZ2V0OjpTeW5jaHJvbml6ZVhGQVZhbHVlKElYRkFfRG9jVmlldyogcFhGQURvY1ZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYRkFfV2lkZ2V0KiBoV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sKSB7CisgIEFTU0VSVChwWEZBRG9jVmlldyAhPSBOVUxMKTsKKyAgQVNTRVJUKGhXaWRnZXQgIT0gTlVMTCk7CiAKKyAgaWYgKElYRkFfV2lkZ2V0SGFuZGxlciogcFhGQVdpZGdldEhhbmRsZXIgPSBwWEZBRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpKSB7CisgICAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisgICAgQVNTRVJUKHBGb3JtQ29udHJvbCAhPSBOVUxMKTsKIAorICAgIHN3aXRjaCAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkpIHsKKyAgICAgIGNhc2UgRklFTERUWVBFX0NIRUNLQk9YOiB7CisgICAgICAgIGlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9CisgICAgICAgICAgICAgICAgcFhGQVdpZGdldEhhbmRsZXItPkdldERhdGFBY2MoaFdpZGdldCkpIHsKKyAgICAgICAgICBGWF9CT09MIGJDaGVja2VkID0gcFdpZGdldEFjYy0+R2V0Q2hlY2tTdGF0ZSgpID09IFhGQV9DSEVDS1NUQVRFX09uOwogCi0JQ1BXTF9Db2xvciBjckJhY2tncm91bmQsIGNyQm9yZGVyLCBjclRleHQ7Ci0JCi0JaW50IGlDb2xvclR5cGU7Ci0JRlhfRkxPQVQgZmNbNF07CisgICAgICAgICAgcEZvcm1GaWVsZC0+Q2hlY2tDb250cm9sKHBGb3JtRmllbGQtPkdldENvbnRyb2xJbmRleChwRm9ybUNvbnRyb2wpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2hlY2tlZCwgVFJVRSk7CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIEZJRUxEVFlQRV9SQURJT0JVVFRPTjogeworICAgICAgICBpZiAoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPQorICAgICAgICAgICAgICAgIHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhXaWRnZXQpKSB7CisgICAgICAgICAgRlhfQk9PTCBiQ2hlY2tlZCA9IHBXaWRnZXRBY2MtPkdldENoZWNrU3RhdGUoKSA9PSBYRkFfQ0hFQ0tTVEFURV9PbjsKIAotCXBDb250cm9sLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcihpQ29sb3JUeXBlLCBmYyk7Ci0JaWYgKGlDb2xvclR5cGUgPiAwKQotCQljckJhY2tncm91bmQgPSBDUFdMX0NvbG9yKGlDb2xvclR5cGUsIGZjWzBdLCBmY1sxXSwgZmNbMl0sIGZjWzNdKTsKKyAgICAgICAgICBwRm9ybUZpZWxkLT5DaGVja0NvbnRyb2wocEZvcm1GaWVsZC0+R2V0Q29udHJvbEluZGV4KHBGb3JtQ29udHJvbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDaGVja2VkLCBUUlVFKTsKKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgRklFTERUWVBFX1RFWFRGSUVMRDogeworICAgICAgICBpZiAoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPQorICAgICAgICAgICAgICAgIHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhXaWRnZXQpKSB7CisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlOworICAgICAgICAgIHBXaWRnZXRBY2MtPkdldFZhbHVlKHNWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsKKyAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRWYWx1ZShzVmFsdWUsIFRSVUUpOworICAgICAgICB9CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBGSUVMRFRZUEVfTElTVEJPWDogeworICAgICAgICBwRm9ybUZpZWxkLT5DbGVhclNlbGVjdGlvbihGQUxTRSk7CiAKLQlwQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcihpQ29sb3JUeXBlLCBmYyk7Ci0JaWYgKGlDb2xvclR5cGUgPiAwKQotCQljckJvcmRlciA9IENQV0xfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOworICAgICAgICBpZiAoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPQorICAgICAgICAgICAgICAgIHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhXaWRnZXQpKSB7CisgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gcFdpZGdldEFjYy0+Q291bnRTZWxlY3RlZEl0ZW1zKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICAgICAgICBpbnQgbkluZGV4ID0gcFdpZGdldEFjYy0+R2V0U2VsZWN0ZWRJdGVtKGkpOwogCi0JRlhfRkxPQVQgZkJvcmRlcldpZHRoID0gKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCk7Ci0JRlhfSU5UMzIgbkJvcmRlclN0eWxlID0gMDsKLQlDUFdMX0Rhc2ggZHNCb3JkZXIoMywwLDApOwotCUNQV0xfQ29sb3IgY3JMZWZ0VG9wLGNyUmlnaHRCb3R0b207CisgICAgICAgICAgICBpZiAobkluZGV4ID4gLTEgJiYgbkluZGV4IDwgcEZvcm1GaWVsZC0+Q291bnRPcHRpb25zKCkpIHsKKyAgICAgICAgICAgICAgcEZvcm1GaWVsZC0+U2V0SXRlbVNlbGVjdGlvbihuSW5kZXgsIFRSVUUsIFRSVUUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgRklFTERUWVBFX0NPTUJPQk9YOiB7CisgICAgICAgIHBGb3JtRmllbGQtPkNsZWFyU2VsZWN0aW9uKEZBTFNFKTsKIAotCXN3aXRjaCAoR2V0Qm9yZGVyU3R5bGUoKSkKLQl7Ci0JY2FzZSBCQlNfREFTSDoKLQkJbkJvcmRlclN0eWxlID0gUEJTX0RBU0g7Ci0JCWRzQm9yZGVyID0gQ1BXTF9EYXNoKDMsIDMsIDApOwotCQlicmVhazsKLQljYXNlIEJCU19CRVZFTEVEOgotCQluQm9yZGVyU3R5bGUgPSBQQlNfQkVWRUxFRDsKLQkJZkJvcmRlcldpZHRoICo9IDI7Ci0JCWNyTGVmdFRvcCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksMSk7Ci0JCWNyUmlnaHRCb3R0b20gPSBDUFdMX1V0aWxzOjpEZXZpZGVDb2xvcihjckJhY2tncm91bmQsMik7Ci0JCWJyZWFrOwotCWNhc2UgQkJTX0lOU0VUOgotCQluQm9yZGVyU3R5bGUgPSBQQlNfSU5TRVQ7Ci0JCWZCb3JkZXJXaWR0aCAqPSAyOwotCQljckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLDAuNSk7Ci0JCWNyUmlnaHRCb3R0b20gPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLDAuNzUpOwotCQlicmVhazsKLQljYXNlIEJCU19VTkRFUkxJTkU6Ci0JCW5Cb3JkZXJTdHlsZSA9IFBCU19VTkRFUkxJTkVEOwotCQlicmVhazsKLQlkZWZhdWx0OiAKLQkJbkJvcmRlclN0eWxlID0gUEJTX1NPTElEOwotCQlicmVhazsKLQl9CisgICAgICAgIGlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9CisgICAgICAgICAgICAgICAgcFhGQVdpZGdldEhhbmRsZXItPkdldERhdGFBY2MoaFdpZGdldCkpIHsKKyAgICAgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwV2lkZ2V0QWNjLT5Db3VudFNlbGVjdGVkSXRlbXMoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgICAgIGludCBuSW5kZXggPSBwV2lkZ2V0QWNjLT5HZXRTZWxlY3RlZEl0ZW0oaSk7CiAKLQlDUERGX1JlY3QgcmNXaW5kb3cgPSBHZXRSb3RhdGVkUmVjdCgpOwotCUNQREZfUmVjdCByY0NsaWVudCA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJjV2luZG93LGZCb3JkZXJXaWR0aCk7CisgICAgICAgICAgICBpZiAobkluZGV4ID4gLTEgJiYgbkluZGV4IDwgcEZvcm1GaWVsZC0+Q291bnRPcHRpb25zKCkpIHsKKyAgICAgICAgICAgICAgcEZvcm1GaWVsZC0+U2V0SXRlbVNlbGVjdGlvbihuSW5kZXgsIFRSVUUsIFRSVUUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KIAotCUNQREZfRGVmYXVsdEFwcGVhcmFuY2UgZGEgPSBwQ29udHJvbC0+R2V0RGVmYXVsdEFwcGVhcmFuY2UoKTsKLQlpZiAoZGEuSGFzQ29sb3IoKSkKLQl7Ci0JCWRhLkdldENvbG9yKGlDb2xvclR5cGUsIGZjKTsKLQkJY3JUZXh0ID0gQ1BXTF9Db2xvcihpQ29sb3JUeXBlLCBmY1swXSwgZmNbMV0sIGZjWzJdLCBmY1szXSk7Ci0JfQotCi0JRlhfSU5UMzIgblN0eWxlID0gMDsKLQotCUNGWF9XaWRlU3RyaW5nIGNzV0NhcHRpb24gPSBwQ29udHJvbC0+R2V0Tm9ybWFsQ2FwdGlvbigpOwotCWlmIChjc1dDYXB0aW9uLkdldExlbmd0aCgpID4gMCkKLQl7Ci0JCXN3aXRjaCAoY3NXQ2FwdGlvblswXSkKLQkJewotCQljYXNlIEwnbCc6Ci0JCQluU3R5bGUgPSBQQ1NfQ0lSQ0xFOwkJCQotCQkJYnJlYWs7Ci0JCWNhc2UgTCc4JzoKLQkJCW5TdHlsZSA9IFBDU19DUk9TUzsKLQkJCWJyZWFrOwotCQljYXNlIEwndSc6Ci0JCQluU3R5bGUgPSBQQ1NfRElBTU9ORDsKLQkJCWJyZWFrOwotCQljYXNlIEwnbic6Ci0JCQluU3R5bGUgPSBQQ1NfU1FVQVJFOwotCQkJYnJlYWs7Ci0JCWNhc2UgTCdIJzoKLQkJCW5TdHlsZSA9IFBDU19TVEFSOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6IC8vTCc0JwotCQkJblN0eWxlID0gUENTX0NIRUNLOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJblN0eWxlID0gUENTX0NIRUNLOwotCX0KLQotCUNGWF9CeXRlU3RyaW5nIGNzQVBfTl9PTiA9IENQV0xfVXRpbHM6OkdldFJlY3RGaWxsQXBwU3RyZWFtKHJjV2luZG93LGNyQmFja2dyb3VuZCkgKwotCQlDUFdMX1V0aWxzOjpHZXRCb3JkZXJBcHBTdHJlYW0ocmNXaW5kb3csZkJvcmRlcldpZHRoLGNyQm9yZGVyLGNyTGVmdFRvcCxjclJpZ2h0Qm90dG9tLG5Cb3JkZXJTdHlsZSxkc0JvcmRlcik7Ci0KLQlDRlhfQnl0ZVN0cmluZyBjc0FQX05fT0ZGID0gY3NBUF9OX09OOwotCi0Jc3dpdGNoIChuQm9yZGVyU3R5bGUpCi0JewotCWNhc2UgUEJTX0JFVkVMRUQ6Ci0JCXsKLQkJCUNQV0xfQ29sb3IgY3JUZW1wID0gY3JMZWZ0VG9wOwotCQkJY3JMZWZ0VG9wID0gY3JSaWdodEJvdHRvbTsKLQkJCWNyUmlnaHRCb3R0b20gPSBjclRlbXA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBQQlNfSU5TRVQ6Ci0JCWNyTGVmdFRvcCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksMCk7Ci0JCWNyUmlnaHRCb3R0b20gPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLDEpOwotCQlicmVhazsKLQl9Ci0KLQlDRlhfQnl0ZVN0cmluZyBjc0FQX0RfT04gPSBDUFdMX1V0aWxzOjpHZXRSZWN0RmlsbEFwcFN0cmVhbShyY1dpbmRvdyxDUFdMX1V0aWxzOjpTdWJzdHJhY3RDb2xvcihjckJhY2tncm91bmQsMC4yNWYpKSArIAotCQlDUFdMX1V0aWxzOjpHZXRCb3JkZXJBcHBTdHJlYW0ocmNXaW5kb3csZkJvcmRlcldpZHRoLGNyQm9yZGVyLGNyTGVmdFRvcCxjclJpZ2h0Qm90dG9tLG5Cb3JkZXJTdHlsZSxkc0JvcmRlcik7Ci0KLQlDRlhfQnl0ZVN0cmluZyBjc0FQX0RfT0ZGID0gY3NBUF9EX09OOwotCi0JY3NBUF9OX09OICs9IENQV0xfVXRpbHM6OkdldENoZWNrQm94QXBwU3RyZWFtKHJjQ2xpZW50LG5TdHlsZSxjclRleHQpOwotCWNzQVBfRF9PTiArPSBDUFdMX1V0aWxzOjpHZXRDaGVja0JveEFwcFN0cmVhbShyY0NsaWVudCxuU3R5bGUsY3JUZXh0KTsKLQotCVdyaXRlQXBwZWFyYW5jZSgiTiIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBjc0FQX05fT04sIHBDb250cm9sLT5HZXRDaGVja2VkQVBTdGF0ZSgpKTsKLQlXcml0ZUFwcGVhcmFuY2UoIk4iLCBHZXRSb3RhdGVkUmVjdCgpLCBHZXRNYXRyaXgoKSwgY3NBUF9OX09GRiwgIk9mZiIpOwotCi0JV3JpdGVBcHBlYXJhbmNlKCJEIiwgR2V0Um90YXRlZFJlY3QoKSwgR2V0TWF0cml4KCksIGNzQVBfRF9PTiwgcENvbnRyb2wtPkdldENoZWNrZWRBUFN0YXRlKCkpOwotCVdyaXRlQXBwZWFyYW5jZSgiRCIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBjc0FQX0RfT0ZGLCAiT2ZmIik7Ci0KLQlDRlhfQnl0ZVN0cmluZyBjc0FTID0gR2V0QXBwU3RhdGUoKTsKLQlpZiAoY3NBUy5Jc0VtcHR5KCkpCi0JCVNldEFwcFN0YXRlKCJPZmYiKTsKKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWU7CisgICAgICAgICAgcFdpZGdldEFjYy0+R2V0VmFsdWUoc1ZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpOworICAgICAgICAgIHBGb3JtRmllbGQtPlNldFZhbHVlKHNWYWx1ZSwgVFJVRSk7CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ1BERlNES19XaWRnZXQ6OlJlc2V0QXBwZWFyYW5jZV9SYWRpb0J1dHRvbigpCi17Ci0JQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBHZXRGb3JtQ29udHJvbCgpOwotCUFTU0VSVChwQ29udHJvbCAhPSBOVUxMKTsKLQkKK3ZvaWQgQ1BERlNES19XaWRnZXQ6OlN5bmNocm9uaXplWEZBSXRlbXMoSVhGQV9Eb2NWaWV3KiBwWEZBRG9jVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhGQV9XaWRnZXQqIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wpIHsKKyAgQVNTRVJUKHBYRkFEb2NWaWV3ICE9IE5VTEwpOworICBBU1NFUlQoaFdpZGdldCAhPSBOVUxMKTsKIAorICBpZiAoSVhGQV9XaWRnZXRIYW5kbGVyKiBwWEZBV2lkZ2V0SGFuZGxlciA9IHBYRkFEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCkpIHsKKyAgICBBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKIAotCUNQV0xfQ29sb3IgY3JCYWNrZ3JvdW5kLCBjckJvcmRlciwgY3JUZXh0OwotCQotCWludCBpQ29sb3JUeXBlOwotCUZYX0ZMT0FUIGZjWzRdOworICAgIHN3aXRjaCAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkpIHsKKyAgICAgIGNhc2UgRklFTERUWVBFX0xJU1RCT1g6IHsKKyAgICAgICAgcEZvcm1GaWVsZC0+Q2xlYXJTZWxlY3Rpb24oRkFMU0UpOworICAgICAgICBwRm9ybUZpZWxkLT5DbGVhck9wdGlvbnMoVFJVRSk7CiAKLQlwQ29udHJvbC0+R2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoaUNvbG9yVHlwZSwgZmMpOwotCWlmIChpQ29sb3JUeXBlID4gMCkKLQkJY3JCYWNrZ3JvdW5kID0gQ1BXTF9Db2xvcihpQ29sb3JUeXBlLCBmY1swXSwgZmNbMV0sIGZjWzJdLCBmY1szXSk7CisgICAgICAgIGlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9CisgICAgICAgICAgICAgICAgcFhGQVdpZGdldEhhbmRsZXItPkdldERhdGFBY2MoaFdpZGdldCkpIHsKKyAgICAgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwV2lkZ2V0QWNjLT5Db3VudENob2ljZUxpc3RJdGVtcygpOyBpIDwgc3o7CisgICAgICAgICAgICAgICBpKyspIHsKKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHN3VGV4dDsKKyAgICAgICAgICAgIHBXaWRnZXRBY2MtPkdldENob2ljZUxpc3RJdGVtKHN3VGV4dCwgaSk7CiAKLQlwQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcihpQ29sb3JUeXBlLCBmYyk7Ci0JaWYgKGlDb2xvclR5cGUgPiAwKQotCQljckJvcmRlciA9IENQV0xfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOworICAgICAgICAgICAgcEZvcm1GaWVsZC0+SW5zZXJ0T3B0aW9uKHN3VGV4dCwgaSwgVFJVRSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6IHsKKyAgICAgICAgcEZvcm1GaWVsZC0+Q2xlYXJTZWxlY3Rpb24oRkFMU0UpOworICAgICAgICBwRm9ybUZpZWxkLT5DbGVhck9wdGlvbnMoRkFMU0UpOwogCi0JRlhfRkxPQVQgZkJvcmRlcldpZHRoID0gKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCk7Ci0JRlhfSU5UMzIgbkJvcmRlclN0eWxlID0gMDsKLQlDUFdMX0Rhc2ggZHNCb3JkZXIoMywwLDApOwotCUNQV0xfQ29sb3IgY3JMZWZ0VG9wLGNyUmlnaHRCb3R0b207CisgICAgICAgIGlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9CisgICAgICAgICAgICAgICAgcFhGQVdpZGdldEhhbmRsZXItPkdldERhdGFBY2MoaFdpZGdldCkpIHsKKyAgICAgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwV2lkZ2V0QWNjLT5Db3VudENob2ljZUxpc3RJdGVtcygpOyBpIDwgc3o7CisgICAgICAgICAgICAgICBpKyspIHsKKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHN3VGV4dDsKKyAgICAgICAgICAgIHBXaWRnZXRBY2MtPkdldENob2ljZUxpc3RJdGVtKHN3VGV4dCwgaSk7CiAKLQlzd2l0Y2ggKEdldEJvcmRlclN0eWxlKCkpCi0JewotCWNhc2UgQkJTX0RBU0g6Ci0JCW5Cb3JkZXJTdHlsZSA9IFBCU19EQVNIOwotCQlkc0JvcmRlciA9IENQV0xfRGFzaCgzLCAzLCAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBCQlNfQkVWRUxFRDoKLQkJbkJvcmRlclN0eWxlID0gUEJTX0JFVkVMRUQ7Ci0JCWZCb3JkZXJXaWR0aCAqPSAyOwotCQljckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLDEpOwotCQljclJpZ2h0Qm90dG9tID0gQ1BXTF9VdGlsczo6RGV2aWRlQ29sb3IoY3JCYWNrZ3JvdW5kLDIpOwotCQlicmVhazsKLQljYXNlIEJCU19JTlNFVDoKLQkJbkJvcmRlclN0eWxlID0gUEJTX0lOU0VUOwotCQlmQm9yZGVyV2lkdGggKj0gMjsKLQkJY3JMZWZ0VG9wID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwwLjUpOwotCQljclJpZ2h0Qm90dG9tID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwwLjc1KTsKLQkJYnJlYWs7Ci0JY2FzZSBCQlNfVU5ERVJMSU5FOgotCQluQm9yZGVyU3R5bGUgPSBQQlNfVU5ERVJMSU5FRDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDogCi0JCW5Cb3JkZXJTdHlsZSA9IFBCU19TT0xJRDsKLQkJYnJlYWs7Ci0JfQorICAgICAgICAgICAgcEZvcm1GaWVsZC0+SW5zZXJ0T3B0aW9uKHN3VGV4dCwgaSwgRkFMU0UpOworICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JQ1BERl9SZWN0IHJjV2luZG93ID0gR2V0Um90YXRlZFJlY3QoKTsKLQlDUERGX1JlY3QgcmNDbGllbnQgPSBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyY1dpbmRvdywgZkJvcmRlcldpZHRoKTsKKyAgICAgICAgcEZvcm1GaWVsZC0+U2V0VmFsdWUoTCIiLCBUUlVFKTsKKyAgICAgIH0gYnJlYWs7CisgICAgfQorICB9Cit9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKLQlDUERGX0RlZmF1bHRBcHBlYXJhbmNlIGRhID0gcENvbnRyb2wtPkdldERlZmF1bHRBcHBlYXJhbmNlKCk7Ci0JaWYgKGRhLkhhc0NvbG9yKCkpCi0JewotCQlkYS5HZXRDb2xvcihpQ29sb3JUeXBlLCBmYyk7Ci0JCWNyVGV4dCA9IENQV0xfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOwotCX0KK0ZYX0JPT0wgQ1BERlNES19XaWRnZXQ6OklzV2lkZ2V0QXBwZWFyYW5jZVZhbGlkKAorICAgIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQVAgPSBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3QoIkFQIik7CisgIGlmICghcEFQKQorICAgIHJldHVybiBGQUxTRTsKIAotCUZYX0lOVDMyIG5TdHlsZSA9IDA7CisgIC8vIENob29zZSB0aGUgcmlnaHQgc3ViLWFwCisgIGNvbnN0IEZYX0NIQVIqIGFwX2VudHJ5ID0gIk4iOworICBpZiAobW9kZSA9PSBDUERGX0Fubm90OjpEb3duKQorICAgIGFwX2VudHJ5ID0gIkQiOworICBlbHNlIGlmIChtb2RlID09IENQREZfQW5ub3Q6OlJvbGxvdmVyKQorICAgIGFwX2VudHJ5ID0gIlIiOworICBpZiAoIXBBUC0+S2V5RXhpc3QoYXBfZW50cnkpKQorICAgIGFwX2VudHJ5ID0gIk4iOwogCi0JQ0ZYX1dpZGVTdHJpbmcgY3NXQ2FwdGlvbiA9IHBDb250cm9sLT5HZXROb3JtYWxDYXB0aW9uKCk7Ci0JaWYgKGNzV0NhcHRpb24uR2V0TGVuZ3RoKCkgPiAwKQotCXsKLQkJc3dpdGNoIChjc1dDYXB0aW9uWzBdKQotCQl7Ci0JCWRlZmF1bHQ6IC8vTCdsJzoKLQkJCW5TdHlsZSA9IFBDU19DSVJDTEU7CQkJCi0JCQlicmVhazsKLQkJY2FzZSBMJzgnOgotCQkJblN0eWxlID0gUENTX0NST1NTOwotCQkJYnJlYWs7Ci0JCWNhc2UgTCd1JzoKLQkJCW5TdHlsZSA9IFBDU19ESUFNT05EOwotCQkJYnJlYWs7Ci0JCWNhc2UgTCduJzoKLQkJCW5TdHlsZSA9IFBDU19TUVVBUkU7Ci0JCQlicmVhazsKLQkJY2FzZSBMJ0gnOgotCQkJblN0eWxlID0gUENTX1NUQVI7Ci0JCQlicmVhazsKLQkJY2FzZSBMJzQnOgotCQkJblN0eWxlID0gUENTX0NIRUNLOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJblN0eWxlID0gUENTX0NJUkNMRTsKLQl9CisgIC8vIEdldCB0aGUgQVAgc3RyZWFtIG9yIHN1YmRpcmVjdG9yeQorICBDUERGX09iamVjdCogcHN1YiA9IHBBUC0+R2V0RWxlbWVudFZhbHVlKGFwX2VudHJ5KTsKKyAgaWYgKCFwc3ViKQorICAgIHJldHVybiBGQUxTRTsKIAotCUNGWF9CeXRlU3RyaW5nIGNzQVBfTl9PTjsKLQotCUNQREZfUmVjdCByY0NlbnRlciA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KENQV0xfVXRpbHM6OkdldENlbnRlclNxdWFyZShyY1dpbmRvdyksIDEuMGYpOwotCQotCWlmIChuU3R5bGUgPT0gUENTX0NJUkNMRSkKLQl7Ci0JCWlmIChuQm9yZGVyU3R5bGUgPT0gUEJTX0JFVkVMRUQpCi0JCXsKLQkJCWNyTGVmdFRvcCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDEpOwotCQkJY3JSaWdodEJvdHRvbSA9IENQV0xfVXRpbHM6OlN1YnN0cmFjdENvbG9yKGNyQmFja2dyb3VuZCwwLjI1Zik7Ci0JCX0KLQkJZWxzZSBpZiAobkJvcmRlclN0eWxlID09IFBCU19JTlNFVCkKLQkJewotCQkJY3JMZWZ0VG9wID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwwLjVmKTsKLQkJCWNyUmlnaHRCb3R0b20gPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLDAuNzVmKTsKLQkJfQotCi0JCWNzQVBfTl9PTiA9IENQV0xfVXRpbHM6OkdldENpcmNsZUZpbGxBcHBTdHJlYW0ocmNDZW50ZXIsY3JCYWNrZ3JvdW5kKSArIAotCQkJQ1BXTF9VdGlsczo6R2V0Q2lyY2xlQm9yZGVyQXBwU3RyZWFtKHJjQ2VudGVyLGZCb3JkZXJXaWR0aCxjckJvcmRlcixjckxlZnRUb3AsY3JSaWdodEJvdHRvbSxuQm9yZGVyU3R5bGUsZHNCb3JkZXIpOwotCX0KLQllbHNlCi0JewotCQljc0FQX05fT04gPSBDUFdMX1V0aWxzOjpHZXRSZWN0RmlsbEFwcFN0cmVhbShyY1dpbmRvdyxjckJhY2tncm91bmQpICsgCi0JCQlDUFdMX1V0aWxzOjpHZXRCb3JkZXJBcHBTdHJlYW0ocmNXaW5kb3csZkJvcmRlcldpZHRoLGNyQm9yZGVyLGNyTGVmdFRvcCxjclJpZ2h0Qm90dG9tLG5Cb3JkZXJTdHlsZSxkc0JvcmRlcik7Ci0JfQotCi0JQ0ZYX0J5dGVTdHJpbmcgY3NBUF9OX09GRiA9IGNzQVBfTl9PTjsKLQotCXN3aXRjaCAobkJvcmRlclN0eWxlKQotCXsKLQljYXNlIFBCU19CRVZFTEVEOgotCQl7Ci0JCQlDUFdMX0NvbG9yIGNyVGVtcCA9IGNyTGVmdFRvcDsKLQkJCWNyTGVmdFRvcCA9IGNyUmlnaHRCb3R0b207Ci0JCQljclJpZ2h0Qm90dG9tID0gY3JUZW1wOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgUEJTX0lOU0VUOgotCQljckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLDApOwotCQljclJpZ2h0Qm90dG9tID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwxKTsKLQkJYnJlYWs7Ci0JfQotCi0JQ0ZYX0J5dGVTdHJpbmcgY3NBUF9EX09OOwotCi0JaWYgKG5TdHlsZSA9PSBQQ1NfQ0lSQ0xFKQotCXsKLQkJQ1BXTF9Db2xvciBjckJLID0gQ1BXTF9VdGlsczo6U3Vic3RyYWN0Q29sb3IoY3JCYWNrZ3JvdW5kLDAuMjVmKTsKLQkJaWYgKG5Cb3JkZXJTdHlsZSA9PSBQQlNfQkVWRUxFRCkKLQkJewotCQkJY3JMZWZ0VG9wID0gQ1BXTF9VdGlsczo6U3Vic3RyYWN0Q29sb3IoY3JCYWNrZ3JvdW5kLDAuMjVmKTsKLQkJCWNyUmlnaHRCb3R0b20gPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAxKTsKLQkJCWNyQksgPSBjckJhY2tncm91bmQ7Ci0JCX0KLQkJZWxzZSBpZiAobkJvcmRlclN0eWxlID09IFBCU19JTlNFVCkKLQkJewotCQkJY3JMZWZ0VG9wID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwwKTsKLQkJCWNyUmlnaHRCb3R0b20gPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLDEpOwotCQl9Ci0KLQkJY3NBUF9EX09OID0gQ1BXTF9VdGlsczo6R2V0Q2lyY2xlRmlsbEFwcFN0cmVhbShyY0NlbnRlcixjckJLKQotCQkJKyBDUFdMX1V0aWxzOjpHZXRDaXJjbGVCb3JkZXJBcHBTdHJlYW0ocmNDZW50ZXIsZkJvcmRlcldpZHRoLGNyQm9yZGVyLGNyTGVmdFRvcCxjclJpZ2h0Qm90dG9tLG5Cb3JkZXJTdHlsZSxkc0JvcmRlcik7Ci0JfQotCWVsc2UKLQl7Ci0JCWNzQVBfRF9PTiA9IENQV0xfVXRpbHM6OkdldFJlY3RGaWxsQXBwU3RyZWFtKHJjV2luZG93LENQV0xfVXRpbHM6OlN1YnN0cmFjdENvbG9yKGNyQmFja2dyb3VuZCwwLjI1ZikpICsgCi0JCQlDUFdMX1V0aWxzOjpHZXRCb3JkZXJBcHBTdHJlYW0ocmNXaW5kb3csZkJvcmRlcldpZHRoLGNyQm9yZGVyLGNyTGVmdFRvcCxjclJpZ2h0Qm90dG9tLG5Cb3JkZXJTdHlsZSxkc0JvcmRlcik7CQkKLQl9Ci0KLQlDRlhfQnl0ZVN0cmluZyBjc0FQX0RfT0ZGID0gY3NBUF9EX09OOwotCi0JY3NBUF9OX09OICs9IENQV0xfVXRpbHM6OkdldFJhZGlvQnV0dG9uQXBwU3RyZWFtKHJjQ2xpZW50LG5TdHlsZSxjclRleHQpOwotCWNzQVBfRF9PTiArPSBDUFdMX1V0aWxzOjpHZXRSYWRpb0J1dHRvbkFwcFN0cmVhbShyY0NsaWVudCxuU3R5bGUsY3JUZXh0KTsKLQotCVdyaXRlQXBwZWFyYW5jZSgiTiIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBjc0FQX05fT04sIHBDb250cm9sLT5HZXRDaGVja2VkQVBTdGF0ZSgpKTsKLQlXcml0ZUFwcGVhcmFuY2UoIk4iLCBHZXRSb3RhdGVkUmVjdCgpLCBHZXRNYXRyaXgoKSwgY3NBUF9OX09GRiwgIk9mZiIpOwotCi0JV3JpdGVBcHBlYXJhbmNlKCJEIiwgR2V0Um90YXRlZFJlY3QoKSwgR2V0TWF0cml4KCksIGNzQVBfRF9PTiwgcENvbnRyb2wtPkdldENoZWNrZWRBUFN0YXRlKCkpOwotCVdyaXRlQXBwZWFyYW5jZSgiRCIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBjc0FQX0RfT0ZGLCAiT2ZmIik7Ci0KLQlDRlhfQnl0ZVN0cmluZyBjc0FTID0gR2V0QXBwU3RhdGUoKTsKLQlpZiAoY3NBUy5Jc0VtcHR5KCkpCi0JCVNldEFwcFN0YXRlKCJPZmYiKTsKKyAgaW50IG5GaWVsZFR5cGUgPSBHZXRGaWVsZFR5cGUoKTsKKyAgc3dpdGNoIChuRmllbGRUeXBlKSB7CisgICAgY2FzZSBGSUVMRFRZUEVfUFVTSEJVVFRPTjoKKyAgICBjYXNlIEZJRUxEVFlQRV9DT01CT0JPWDoKKyAgICBjYXNlIEZJRUxEVFlQRV9MSVNUQk9YOgorICAgIGNhc2UgRklFTERUWVBFX1RFWFRGSUVMRDoKKyAgICBjYXNlIEZJRUxEVFlQRV9TSUdOQVRVUkU6CisgICAgICByZXR1cm4gcHN1Yi0+SXNTdHJlYW0oKTsKKyAgICBjYXNlIEZJRUxEVFlQRV9DSEVDS0JPWDoKKyAgICBjYXNlIEZJRUxEVFlQRV9SQURJT0JVVFRPTjoKKyAgICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBTdWJEaWN0ID0gcHN1Yi0+QXNEaWN0aW9uYXJ5KCkpIHsKKyAgICAgICAgcmV0dXJuIHBTdWJEaWN0LT5HZXRTdHJlYW0oR2V0QXBwU3RhdGUoKSkgIT0gTlVMTDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRBcHBlYXJhbmNlX0NvbWJvQm94KEZYX0xQQ1dTVFIgc1ZhbHVlKQotewotCUNQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gR2V0Rm9ybUNvbnRyb2woKTsKLQlBU1NFUlQocENvbnRyb2wgIT0gTlVMTCk7Ci0JQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IHBDb250cm9sLT5HZXRGaWVsZCgpOwotCUFTU0VSVChwRmllbGQgIT0gTlVMTCk7Ci0KLQlDRlhfQnl0ZVRleHRCdWYgc0JvZHksIHNMaW5lczsKLQotCUNQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKLQlDUERGX1JlY3QgcmNCdXR0b24gPSByY0NsaWVudDsKLQlyY0J1dHRvbi5sZWZ0ID0gcmNCdXR0b24ucmlnaHQgLSAxMzsKLQlyY0J1dHRvbi5Ob3JtYWxpemUoKTsKLQotCWlmIChJRlhfRWRpdCAqIHBFZGl0ID0gSUZYX0VkaXQ6Ok5ld0VkaXQoKSkKLQl7Ci0JCXBFZGl0LT5FbmFibGVSZWZyZXNoKEZBTFNFKTsKLQotCQlBU1NFUlQodGhpcy0+bV9wSW50ZXJGb3JtICE9IE5VTEwpOwotCQlDUERGU0RLX0RvY3VtZW50KiBwRG9jID0gbV9wSW50ZXJGb3JtLT5HZXREb2N1bWVudCgpOwotCQlBU1NFUlQocERvYyAhPSBOVUxMKTsKLQkJQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IHBEb2MtPkdldEVudigpOwotCQlDQkFfRm9udE1hcCBGb250TWFwKHRoaXMscEVudi0+R2V0U3lzSGFuZGxlcigpKTsKLQkJRm9udE1hcC5Jbml0aWFsKCk7Ci0JCXBFZGl0LT5TZXRGb250TWFwKCZGb250TWFwKTsKLQotCQlDUERGX1JlY3QgcmNFZGl0ID0gcmNDbGllbnQ7Ci0JCXJjRWRpdC5yaWdodCA9IHJjQnV0dG9uLmxlZnQ7Ci0JCXJjRWRpdC5Ob3JtYWxpemUoKTsKLQkJCi0JCXBFZGl0LT5TZXRQbGF0ZVJlY3QocmNFZGl0KTsKLQkJcEVkaXQtPlNldEFsaWdubWVudFYoMSk7Ci0KLQkJRlhfRkxPQVQgZkZvbnRTaXplID0gdGhpcy0+R2V0Rm9udFNpemUoKTsKLQkJaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpCi0JCQlwRWRpdC0+U2V0QXV0b0ZvbnRTaXplKFRSVUUpOwotCQllbHNlCi0JCQlwRWRpdC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKLQkJCi0JCXBFZGl0LT5Jbml0aWFsaXplKCk7Ci0JCQotCQlpZiAoc1ZhbHVlKQotCQkJcEVkaXQtPlNldFRleHQoc1ZhbHVlKTsKLQkJZWxzZQotCQl7Ci0JCQlGWF9JTlQzMiBuQ3VyU2VsID0gcEZpZWxkLT5HZXRTZWxlY3RlZEluZGV4KDApOwotCi0JCQlpZiAobkN1clNlbCA8IDApCi0JCQkJcEVkaXQtPlNldFRleHQocEZpZWxkLT5HZXRWYWx1ZSgpLmNfc3RyKCkpOwotCQkJZWxzZQotCQkJCXBFZGl0LT5TZXRUZXh0KHBGaWVsZC0+R2V0T3B0aW9uTGFiZWwobkN1clNlbCkuY19zdHIoKSk7Ci0JCX0KLQotCQlDUERGX1JlY3QgcmNDb250ZW50ID0gcEVkaXQtPkdldENvbnRlbnRSZWN0KCk7Ci0KLQkJQ0ZYX0J5dGVTdHJpbmcgc0VkaXQgPSBDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKHBFZGl0LENQREZfUG9pbnQoMC4wZiwwLjBmKSk7Ci0JCWlmIChzRWRpdC5HZXRMZW5ndGgoKSA+IDApCi0JCXsKLQkJCXNCb2R5IDw8ICIvVHggQk1DXG4iIDw8ICJxXG4iOwotCQkJaWYgKHJjQ29udGVudC5XaWR0aCgpID4gcmNFZGl0LldpZHRoKCkgfHwKLQkJCQlyY0NvbnRlbnQuSGVpZ2h0KCkgPiByY0VkaXQuSGVpZ2h0KCkpCi0JCQl7Ci0JCQkJc0JvZHkgPDwgcmNFZGl0LmxlZnQgPDwgIiAiIDw8IHJjRWRpdC5ib3R0b20gPDwgIiAiIAotCQkJCQk8PCByY0VkaXQuV2lkdGgoKSA8PCAiICIgPDwgcmNFZGl0LkhlaWdodCgpIDw8ICIgcmVcbldcbm5cbiI7Ci0JCQl9Ci0KLQkJCUNQV0xfQ29sb3IgY3JUZXh0ID0gR2V0VGV4dFBXTENvbG9yKCk7CQotCQkJc0JvZHkgPDwgIkJUXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCkgPDwgc0VkaXQgPDwgIkVUXG4iIDw8ICJRXG5FTUNcbiI7Ci0JCX0KLQotCQlJRlhfRWRpdDo6RGVsRWRpdChwRWRpdCk7Ci0JfQotCi0Jc0JvZHkgPDwgQ1BXTF9VdGlsczo6R2V0RHJvcEJ1dHRvbkFwcFN0cmVhbShyY0J1dHRvbik7Ci0KLQlDRlhfQnl0ZVN0cmluZyBzQVAgPSBHZXRCYWNrZ3JvdW5kQXBwU3RyZWFtKCkgKyBHZXRCb3JkZXJBcHBTdHJlYW0oKSArIHNMaW5lcy5HZXRCeXRlU3RyaW5nKCkgKyBzQm9keS5HZXRCeXRlU3RyaW5nKCk7Ci0KLQlXcml0ZUFwcGVhcmFuY2UoIk4iLCBHZXRSb3RhdGVkUmVjdCgpLCBHZXRNYXRyaXgoKSwgc0FQKTsKK2ludCBDUERGU0RLX1dpZGdldDo6R2V0RmllbGRUeXBlKCkgY29uc3QgeworICByZXR1cm4gR2V0Rm9ybUZpZWxkKCktPkdldEZpZWxkVHlwZSgpOwogfQogCi12b2lkIENQREZTREtfV2lkZ2V0OjpSZXNldEFwcGVhcmFuY2VfTGlzdEJveCgpCi17Ci0JQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBHZXRGb3JtQ29udHJvbCgpOwotCUFTU0VSVChwQ29udHJvbCAhPSBOVUxMKTsKLQlDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gcENvbnRyb2wtPkdldEZpZWxkKCk7Ci0JQVNTRVJUKHBGaWVsZCAhPSBOVUxMKTsKLQotCUNQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKLQotCUNGWF9CeXRlVGV4dEJ1ZiBzQm9keSwgc0xpbmVzOwotCi0JaWYgKElGWF9FZGl0ICogcEVkaXQgPSBJRlhfRWRpdDo6TmV3RWRpdCgpKQotCXsKLQkJcEVkaXQtPkVuYWJsZVJlZnJlc2goRkFMU0UpOwotCi0vLwkJQVNTRVJUKHRoaXMtPm1fcEJhc2VGb3JtICE9IE5VTEwpOwotCQlBU1NFUlQodGhpcy0+bV9wSW50ZXJGb3JtICE9IE5VTEwpOwotCQlDUERGU0RLX0RvY3VtZW50KiBwRG9jID0gbV9wSW50ZXJGb3JtLT5HZXREb2N1bWVudCgpOwotCQlBU1NFUlQocERvYyAhPSBOVUxMKTsKLQkJQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IHBEb2MtPkdldEVudigpOwotCi0JCUNCQV9Gb250TWFwIEZvbnRNYXAodGhpcyxwRW52LT5HZXRTeXNIYW5kbGVyKCkpOwotCQlGb250TWFwLkluaXRpYWwoKTsKLQkJcEVkaXQtPlNldEZvbnRNYXAoJkZvbnRNYXApOwotCi0JCXBFZGl0LT5TZXRQbGF0ZVJlY3QoQ1BERl9SZWN0KHJjQ2xpZW50LmxlZnQsMC4wZixyY0NsaWVudC5yaWdodCwwLjBmKSk7CQotCQkKLQkJRlhfRkxPQVQgZkZvbnRTaXplID0gR2V0Rm9udFNpemUoKTsKLQotCQlpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkKLQkJCXBFZGl0LT5TZXRGb250U2l6ZSgxMi4wZik7Ci0JCWVsc2UKLQkJCXBFZGl0LT5TZXRGb250U2l6ZShmRm9udFNpemUpOwotCQkKLQkJcEVkaXQtPkluaXRpYWxpemUoKTsKLQotCQlDRlhfQnl0ZVRleHRCdWYgc0xpc3Q7Ci0JCUZYX0ZMT0FUIGZ5ID0gcmNDbGllbnQudG9wOwotCi0JCUZYX0lOVDMyIG5Ub3AgPSBwRmllbGQtPkdldFRvcFZpc2libGVJbmRleCgpOwotCQlGWF9JTlQzMiBuQ291bnQgPSBwRmllbGQtPkNvdW50T3B0aW9ucygpOwotCQlGWF9JTlQzMiBuU2VsQ291bnQgPSBwRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpOwotCi0JCWZvciAoRlhfSU5UMzIgaT1uVG9wOyBpPG5Db3VudDsgaSsrKQotCQl7Ci0JCQlGWF9CT09MIGJTZWxlY3RlZCA9IEZBTFNFOwkJCQkKLQkJCWZvciAoRlhfSU5UMzIgaj0wOyBqPG5TZWxDb3VudDsgaisrKQotCQkJewotCQkJCWlmIChwRmllbGQtPkdldFNlbGVjdGVkSW5kZXgoaikgPT0gaSkKLQkJCQl7Ci0JCQkJCWJTZWxlY3RlZCA9IFRSVUU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJcEVkaXQtPlNldFRleHQocEZpZWxkLT5HZXRPcHRpb25MYWJlbChpKS5jX3N0cigpKTsKLQotCQkJQ1BERl9SZWN0IHJjQ29udGVudCA9IHBFZGl0LT5HZXRDb250ZW50UmVjdCgpOwotCQkJRlhfRkxPQVQgZkl0ZW1IZWlnaHQgPSByY0NvbnRlbnQuSGVpZ2h0KCk7Ci0KLQkJCWlmIChiU2VsZWN0ZWQpCi0JCQl7Ci0JCQkJQ1BERl9SZWN0IHJjSXRlbSA9IENQREZfUmVjdChyY0NsaWVudC5sZWZ0LGZ5LWZJdGVtSGVpZ2h0LHJjQ2xpZW50LnJpZ2h0LGZ5KTsKLQkJCQlzTGlzdCA8PCAicVxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsMCw1MS4wZi8yNTUuMGYsMTEzLjBmLzI1NS4wZiksVFJVRSkKLQkJCQkJPDwgcmNJdGVtLmxlZnQgPDwgIiAiIDw8IHJjSXRlbS5ib3R0b20gPDwgIiAiIDw8IHJjSXRlbS5XaWR0aCgpIDw8ICIgIiA8PCByY0l0ZW0uSGVpZ2h0KCkgPDwgIiByZSBmXG4iIDw8ICJRXG4iOwotCi0JCQkJc0xpc3QgPDwgIkJUXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksMSksVFJVRSkgPDwgCi0JCQkJCUNQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0ocEVkaXQsQ1BERl9Qb2ludCgwLjBmLGZ5KSkgPDwgIkVUXG4iOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCUNQV0xfQ29sb3IgY3JUZXh0ID0gR2V0VGV4dFBXTENvbG9yKCk7Ci0JCQkJc0xpc3QgPDwgIkJUXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCxUUlVFKSA8PCAKLQkJCQlDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKHBFZGl0LENQREZfUG9pbnQoMC4wZixmeSkpIDw8ICJFVFxuIjsKLQkJCX0KLQotCQkJZnkgLT0gZkl0ZW1IZWlnaHQ7Ci0JCX0KLQkJCQkJCi0JCWlmIChzTGlzdC5HZXRTaXplKCkgPiAwKQotCQl7Ci0JCQlzQm9keSA8PCAiL1R4IEJNQ1xuIiA8PCAicVxuIiA8PCByY0NsaWVudC5sZWZ0IDw8ICIgIiA8PCByY0NsaWVudC5ib3R0b20gPDwgIiAiIAotCQkJCQk8PCByY0NsaWVudC5XaWR0aCgpIDw8ICIgIiA8PCByY0NsaWVudC5IZWlnaHQoKSA8PCAiIHJlXG5XXG5uXG4iOwotCQkJc0JvZHkgPDwgc0xpc3QgPDwgIlFcbkVNQ1xuIjsKLQkJfQotCi0JCUlGWF9FZGl0OjpEZWxFZGl0KHBFZGl0KTsKLQl9Ci0KLQlDRlhfQnl0ZVN0cmluZyBzQVAgPSBHZXRCYWNrZ3JvdW5kQXBwU3RyZWFtKCkgKyBHZXRCb3JkZXJBcHBTdHJlYW0oKSArIHNMaW5lcy5HZXRCeXRlU3RyaW5nKCkgKyBzQm9keS5HZXRCeXRlU3RyaW5nKCk7Ci0KLQlXcml0ZUFwcGVhcmFuY2UoIk4iLCBHZXRSb3RhdGVkUmVjdCgpLCBHZXRNYXRyaXgoKSwgc0FQKTsKK0ZYX0JPT0wgQ1BERlNES19XaWRnZXQ6OklzQXBwZWFyYW5jZVZhbGlkKCkgeworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIENQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgPSBtX3BQYWdlVmlldy0+R2V0U0RLRG9jdW1lbnQoKTsKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IHBTREtEb2MtPkdldFhGQURvY3VtZW50KCk7CisgIGludCBuRG9jVHlwZSA9IHBEb2MtPkdldERvY1R5cGUoKTsKKyAgaWYgKG5Eb2NUeXBlICE9IERPQ1RZUEVfUERGICYmIG5Eb2NUeXBlICE9IERPQ1RZUEVfU1RBVElDX1hGQSkKKyAgICByZXR1cm4gVFJVRTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgcmV0dXJuIENQREZTREtfQkFBbm5vdDo6SXNBcHBlYXJhbmNlVmFsaWQoKTsKIH0KIAotdm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRBcHBlYXJhbmNlX1RleHRGaWVsZChGWF9MUENXU1RSIHNWYWx1ZSkKLXsKLQlDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldEZvcm1Db250cm9sKCk7Ci0JQVNTRVJUKHBDb250cm9sICE9IE5VTEwpOwotCUNQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBwQ29udHJvbC0+R2V0RmllbGQoKTsKLQlBU1NFUlQocEZpZWxkICE9IE5VTEwpOwotCi0JQ0ZYX0J5dGVUZXh0QnVmIHNCb2R5LCBzTGluZXM7Ci0JCi0JaWYgKElGWF9FZGl0ICogcEVkaXQgPSBJRlhfRWRpdDo6TmV3RWRpdCgpKQotCXsKLQkJcEVkaXQtPkVuYWJsZVJlZnJlc2goRkFMU0UpOwotCi0vLwkJQVNTRVJUKHRoaXMtPm1fcEJhc2VGb3JtICE9IE5VTEwpOwotCQlBU1NFUlQodGhpcy0+bV9wSW50ZXJGb3JtICE9IE5VTEwpOwotCQlDUERGU0RLX0RvY3VtZW50KiBwRG9jID0gbV9wSW50ZXJGb3JtLT5HZXREb2N1bWVudCgpOwotCQlBU1NFUlQocERvYyAhPSBOVUxMKTsKLQkJQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IHBEb2MtPkdldEVudigpOwotCi0JCUNCQV9Gb250TWFwIEZvbnRNYXAodGhpcyxwRW52LT5HZXRTeXNIYW5kbGVyKCkpOy8vLCBJU3lzdGVtSGFuZGxlOjpHZXRTeXN0ZW1IYW5kbGVyKG1fcEJhc2VGb3JtLT5HZXRFbnYoKSkpOwotCQlGb250TWFwLkluaXRpYWwoKTsKLQkJcEVkaXQtPlNldEZvbnRNYXAoJkZvbnRNYXApOwotCi0JCUNQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKLQkJcEVkaXQtPlNldFBsYXRlUmVjdChyY0NsaWVudCk7Ci0JCXBFZGl0LT5TZXRBbGlnbm1lbnRIKHBDb250cm9sLT5HZXRDb250cm9sQWxpZ25tZW50KCkpOwotCQkKLQkJRlhfRFdPUkQgZHdGaWVsZEZsYWdzID0gcEZpZWxkLT5HZXRGaWVsZEZsYWdzKCk7Ci0JCUZYX0JPT0wgYk11bHRpTGluZSA9IChkd0ZpZWxkRmxhZ3MgPj4gMTIpICYgMTsKLQotCQlpZiAoYk11bHRpTGluZSkKLQkJewotCQkJcEVkaXQtPlNldE11bHRpTGluZShUUlVFKTsKLQkJCXBFZGl0LT5TZXRBdXRvUmV0dXJuKFRSVUUpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcEVkaXQtPlNldEFsaWdubWVudFYoMSk7Ci0JCX0KLQotCQlGWF9XT1JEIHN1YldvcmQgPSAwOwotCQlpZiAoKGR3RmllbGRGbGFncyA+PiAxMykgJiAxKQotCQl7Ci0JCQlzdWJXb3JkID0gJyonOwotCQkJcEVkaXQtPlNldFBhc3N3b3JkQ2hhcihzdWJXb3JkKTsKLQkJfQotCi0JCWludCBuTWF4TGVuID0gcEZpZWxkLT5HZXRNYXhMZW4oKTsKLQkJRlhfQk9PTCBiQ2hhckFycmF5ID0gKGR3RmllbGRGbGFncyA+PiAyNCkgJiAxOwotCQlGWF9GTE9BVCBmRm9udFNpemUgPSBHZXRGb250U2l6ZSgpOwkKLQotCQlpZiAobk1heExlbiA+IDApCi0JCXsKLQkJCWlmIChiQ2hhckFycmF5KQotCQkJewotCQkJCXBFZGl0LT5TZXRDaGFyQXJyYXkobk1heExlbik7Ci0KLQkJCQlpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkKLQkJCQl7Ci0JCQkJCWZGb250U2l6ZSA9IENQV0xfRWRpdDo6R2V0Q2hhckFycmF5QXV0b0ZvbnRTaXplKEZvbnRNYXAuR2V0UERGRm9udCgwKSxyY0NsaWVudCxuTWF4TGVuKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKHNWYWx1ZSkKLQkJCQkJbk1heExlbiA9IHdjc2xlbigoY29uc3Qgd2NoYXJfdCopc1ZhbHVlKTsgCi0JCQkJcEVkaXQtPlNldExpbWl0Q2hhcihuTWF4TGVuKTsKLQkJCX0KLQkJfQotCi0JCWlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKQotCQkJcEVkaXQtPlNldEF1dG9Gb250U2l6ZShUUlVFKTsKLQkJZWxzZQotCQkJcEVkaXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7Ci0KLQkJcEVkaXQtPkluaXRpYWxpemUoKTsKLQkJCi0JCWlmIChzVmFsdWUpCi0JCQlwRWRpdC0+U2V0VGV4dChzVmFsdWUpOwotCQllbHNlCi0JCQlwRWRpdC0+U2V0VGV4dChwRmllbGQtPkdldFZhbHVlKCkuY19zdHIoKSk7Ci0KLQkJQ1BERl9SZWN0IHJjQ29udGVudCA9IHBFZGl0LT5HZXRDb250ZW50UmVjdCgpOwotCi0JCUNGWF9CeXRlU3RyaW5nIHNFZGl0ID0gQ1BXTF9VdGlsczo6R2V0RWRpdEFwcFN0cmVhbShwRWRpdCxDUERGX1BvaW50KDAuMGYsMC4wZiksCi0JCQkJCQkJCQkJCQkJCQkJCU5VTEwsIWJDaGFyQXJyYXksc3ViV29yZCk7Ci0KLQkJaWYgKHNFZGl0LkdldExlbmd0aCgpID4gMCkKLQkJewotCQkJc0JvZHkgPDwgIi9UeCBCTUNcbiIgPDwgInFcbiI7Ci0JCQlpZiAocmNDb250ZW50LldpZHRoKCkgPiByY0NsaWVudC5XaWR0aCgpIHx8Ci0JCQkJcmNDb250ZW50LkhlaWdodCgpID4gcmNDbGllbnQuSGVpZ2h0KCkpCi0JCQl7Ci0JCQkJc0JvZHkgPDwgcmNDbGllbnQubGVmdCA8PCAiICIgPDwgcmNDbGllbnQuYm90dG9tIDw8ICIgIiAKLQkJCQkJPDwgcmNDbGllbnQuV2lkdGgoKSA8PCAiICIgPDwgcmNDbGllbnQuSGVpZ2h0KCkgPDwgIiByZVxuV1xublxuIjsKLQkJCX0KLQkJCUNQV0xfQ29sb3IgY3JUZXh0ID0gR2V0VGV4dFBXTENvbG9yKCk7CQotCQkJc0JvZHkgPDwgIkJUXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCkgPDwgc0VkaXQgPDwgIkVUXG4iIDw8ICJRXG5FTUNcbiI7Ci0JCX0KLQotCQlpZiAoYkNoYXJBcnJheSkKLQkJewotCQkJc3dpdGNoIChHZXRCb3JkZXJTdHlsZSgpKQotCQkJewotCQkJY2FzZSBCQlNfU09MSUQ6Ci0JCQkJewotCQkJCQlDRlhfQnl0ZVN0cmluZyBzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRCb3JkZXJQV0xDb2xvcigpLEZBTFNFKTsKLQkJCQkJaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApCi0JCQkJCXsKLQkJCQkJCXNMaW5lcyA8PCAicVxuIiA8PCBHZXRCb3JkZXJXaWR0aCgpIDw8ICIgd1xuIiAKLQkJCQkJCQk8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRCb3JkZXJQV0xDb2xvcigpLEZBTFNFKSA8PCAiIDIgSiAwIGpcbiI7CQkJCQkKLQotCQkJCQkJZm9yIChGWF9JTlQzMiBpPTE7aTxuTWF4TGVuO2krKykKLQkJCQkJCXsKLQkJCQkJCQlzTGluZXMgPDwgcmNDbGllbnQubGVmdCArICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KS9uTWF4TGVuKSppIDw8ICIgIgotCQkJCQkJCQk8PCByY0NsaWVudC5ib3R0b20gPDwgIiBtXG4iCi0JCQkJCQkJCTw8IHJjQ2xpZW50LmxlZnQgKyAoKHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCkvbk1heExlbikqaSA8PCAiICIKLQkJCQkJCQkJPDwgcmNDbGllbnQudG9wIDw8ICIgbCBTXG4iOwkJCQkJCQotCQkJCQkJfQotCi0JCQkJCQlzTGluZXMgPDwgIlFcbiI7CQkKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgQkJTX0RBU0g6Ci0JCQkJewotCQkJCQlDRlhfQnl0ZVN0cmluZyBzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRCb3JkZXJQV0xDb2xvcigpLEZBTFNFKTsKLQkJCQkJaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApCi0JCQkJCXsKLQkJCQkJCUNQV0xfRGFzaCBkc0JvcmRlciA9IENQV0xfRGFzaCgzLCAzLCAwKTsKLQotCQkJCQkJc0xpbmVzIDw8ICJxXG4iIDw8IEdldEJvcmRlcldpZHRoKCkgPDwgIiB3XG4iIAotCQkJCQkJCTw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJvcmRlclBXTENvbG9yKCksRkFMU0UpCi0JCQkJCQkJPDwgIlsiIDw8IGRzQm9yZGVyLm5EYXNoIDw8ICIgIiAKLQkJCQkJCQk8PCBkc0JvcmRlci5uR2FwIDw8ICJdICIgCi0JCQkJCQkJPDwgZHNCb3JkZXIublBoYXNlIDw8ICIgZFxuIjsKLQotCQkJCQkJZm9yIChGWF9JTlQzMiBpPTE7aTxuTWF4TGVuO2krKykJCQkJCQotCQkJCQkJewotCQkJCQkJCXNMaW5lcyA8PCByY0NsaWVudC5sZWZ0ICsgKChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQpL25NYXhMZW4pKmkgPDwgIiAiCi0JCQkJCQkJCTw8IHJjQ2xpZW50LmJvdHRvbSA8PCAiIG1cbiIKLQkJCQkJCQkJPDwgcmNDbGllbnQubGVmdCArICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KS9uTWF4TGVuKSppIDw8ICIgIgotCQkJCQkJCQk8PCByY0NsaWVudC50b3AgPDwgIiBsIFNcbiI7CQotCQkJCQkJfQotCi0JCQkJCQlzTGluZXMgPDwgIlFcbiI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlJRlhfRWRpdDo6RGVsRWRpdChwRWRpdCk7Ci0JfQotCi0JQ0ZYX0J5dGVTdHJpbmcgc0FQID0gR2V0QmFja2dyb3VuZEFwcFN0cmVhbSgpICsgR2V0Qm9yZGVyQXBwU3RyZWFtKCkgKyBzTGluZXMuR2V0Qnl0ZVN0cmluZygpICsgc0JvZHkuR2V0Qnl0ZVN0cmluZygpOwotCVdyaXRlQXBwZWFyYW5jZSgiTiIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBzQVApOworaW50IENQREZTREtfV2lkZ2V0OjpHZXRGaWVsZEZsYWdzKCkgY29uc3QgeworICBDUERGX0ludGVyRm9ybSogcFBERkludGVyRm9ybSA9IG1fcEludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7CisgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9CisgICAgICBwUERGSW50ZXJGb3JtLT5HZXRDb250cm9sQnlEaWN0KG1fcEFubm90LT5HZXRBbm5vdERpY3QoKSk7CisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gcEZvcm1Db250cm9sLT5HZXRGaWVsZCgpOworICByZXR1cm4gcEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpOwogfQogCi1DUERGX1JlY3QgQ1BERlNES19XaWRnZXQ6OkdldENsaWVudFJlY3QoKSBjb25zdAotewotCUNQREZfUmVjdCByY1dpbmRvdyA9IEdldFJvdGF0ZWRSZWN0KCk7Ci0JRlhfRkxPQVQgZkJvcmRlcldpZHRoID0gKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCk7Ci0Jc3dpdGNoIChHZXRCb3JkZXJTdHlsZSgpKQotCXsKLQljYXNlIEJCU19CRVZFTEVEOgotCWNhc2UgQkJTX0lOU0VUOgotCQlmQm9yZGVyV2lkdGggKj0gMi4wZjsKLQkJYnJlYWs7Ci0JfQorQ0ZYX0J5dGVTdHJpbmcgQ1BERlNES19XaWRnZXQ6OkdldFN1YlR5cGUoKSBjb25zdCB7CisgIGludCBuVHlwZSA9IEdldEZpZWxkVHlwZSgpOwogCi0JcmV0dXJuIENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJjV2luZG93LCBmQm9yZGVyV2lkdGgpOworICBpZiAoblR5cGUgPT0gRklFTERUWVBFX1NJR05BVFVSRSkKKyAgICByZXR1cm4gQkZGVF9TSUdOQVRVUkU7CisgIHJldHVybiBDUERGU0RLX0Fubm90OjpHZXRTdWJUeXBlKCk7CiB9CiAKLUNQREZfUmVjdCBDUERGU0RLX1dpZGdldDo6R2V0Um90YXRlZFJlY3QoKSBjb25zdAotewotCUNQREZfUmVjdCByZWN0QW5ub3QgPSBHZXRSZWN0KCk7Ci0JRlhfRkxPQVQgZldpZHRoID0gcmVjdEFubm90LnJpZ2h0IC0gcmVjdEFubm90LmxlZnQ7Ci0JRlhfRkxPQVQgZkhlaWdodCA9IHJlY3RBbm5vdC50b3AgLSByZWN0QW5ub3QuYm90dG9tOwotCi0JQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBHZXRGb3JtQ29udHJvbCgpOwotCUFTU0VSVChwQ29udHJvbCAhPSBOVUxMKTsKLQotCUNQREZfUmVjdCByY1BERldpbmRvdzsKLQlzd2l0Y2goYWJzKHBDb250cm9sLT5HZXRSb3RhdGlvbigpICUgMzYwKSkKLQl7Ci0JCWNhc2UgMDoKLQkJY2FzZSAxODA6Ci0JCWRlZmF1bHQ6Ci0JCQlyY1BERldpbmRvdyA9IENQREZfUmVjdCgwLCAwLCBmV2lkdGgsIGZIZWlnaHQpOwkKLQkJCWJyZWFrOwotCQljYXNlIDkwOgotCQljYXNlIDI3MDoKLQkJCXJjUERGV2luZG93ID0gQ1BERl9SZWN0KDAsIDAsIGZIZWlnaHQsIGZXaWR0aCk7Ci0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmNQREZXaW5kb3c7CitDUERGX0Zvcm1GaWVsZCogQ1BERlNES19XaWRnZXQ6OkdldEZvcm1GaWVsZCgpIGNvbnN0IHsKKyAgcmV0dXJuIEdldEZvcm1Db250cm9sKCktPkdldEZpZWxkKCk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQREZTREtfV2lkZ2V0OjpHZXRCYWNrZ3JvdW5kQXBwU3RyZWFtKCkgY29uc3QKLXsKLQlDUFdMX0NvbG9yIGNyQmFja2dyb3VuZCA9IEdldEZpbGxQV0xDb2xvcigpOwotCWlmIChjckJhY2tncm91bmQubkNvbG9yVHlwZSAhPSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQpCi0JCXJldHVybiBDUFdMX1V0aWxzOjpHZXRSZWN0RmlsbEFwcFN0cmVhbShHZXRSb3RhdGVkUmVjdCgpLCBjckJhY2tncm91bmQpOwotCWVsc2UKLQkJcmV0dXJuICIiOworQ1BERl9Gb3JtQ29udHJvbCogQ1BERlNES19XaWRnZXQ6OkdldEZvcm1Db250cm9sKCkgY29uc3QgeworICBDUERGX0ludGVyRm9ybSogcFBERkludGVyRm9ybSA9IG1fcEludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7CisgIHJldHVybiBwUERGSW50ZXJGb3JtLT5HZXRDb250cm9sQnlEaWN0KEdldEFubm90RGljdCgpKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BERlNES19XaWRnZXQ6OkdldEJvcmRlckFwcFN0cmVhbSgpIGNvbnN0Ci17Ci0JQ1BERl9SZWN0IHJjV2luZG93ID0gR2V0Um90YXRlZFJlY3QoKTsKLQlDUFdMX0NvbG9yIGNyQm9yZGVyID0gR2V0Qm9yZGVyUFdMQ29sb3IoKTsKLQlDUFdMX0NvbG9yIGNyQmFja2dyb3VuZCA9IEdldEZpbGxQV0xDb2xvcigpOwotCUNQV0xfQ29sb3IgY3JMZWZ0VG9wLCBjclJpZ2h0Qm90dG9tOwotCi0JRlhfRkxPQVQgZkJvcmRlcldpZHRoID0gKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCk7Ci0JRlhfSU5UMzIgbkJvcmRlclN0eWxlID0gMDsKLQlDUFdMX0Rhc2ggZHNCb3JkZXIoMywwLDApOwotCi0Jc3dpdGNoIChHZXRCb3JkZXJTdHlsZSgpKQotCXsKLQljYXNlIEJCU19EQVNIOgotCQluQm9yZGVyU3R5bGUgPSBQQlNfREFTSDsKLQkJZHNCb3JkZXIgPSBDUFdMX0Rhc2goMywgMywgMCk7Ci0JCWJyZWFrOwotCWNhc2UgQkJTX0JFVkVMRUQ6Ci0JCW5Cb3JkZXJTdHlsZSA9IFBCU19CRVZFTEVEOwotCQlmQm9yZGVyV2lkdGggKj0gMjsKLQkJY3JMZWZ0VG9wID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMSk7Ci0JCWNyUmlnaHRCb3R0b20gPSBDUFdMX1V0aWxzOjpEZXZpZGVDb2xvcihjckJhY2tncm91bmQsIDIpOwotCQlicmVhazsKLQljYXNlIEJCU19JTlNFVDoKLQkJbkJvcmRlclN0eWxlID0gUEJTX0lOU0VUOwotCQlmQm9yZGVyV2lkdGggKj0gMjsKLQkJY3JMZWZ0VG9wID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMC41KTsKLQkJY3JSaWdodEJvdHRvbSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDAuNzUpOwotCQlicmVhazsKLQljYXNlIEJCU19VTkRFUkxJTkU6Ci0JCW5Cb3JkZXJTdHlsZSA9IFBCU19VTkRFUkxJTkVEOwotCQlicmVhazsKLQlkZWZhdWx0OiAKLQkJbkJvcmRlclN0eWxlID0gUEJTX1NPTElEOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gQ1BXTF9VdGlsczo6R2V0Qm9yZGVyQXBwU3RyZWFtKHJjV2luZG93LCBmQm9yZGVyV2lkdGgsIGNyQm9yZGVyLCBjckxlZnRUb3AsIAotCQljclJpZ2h0Qm90dG9tLCBuQm9yZGVyU3R5bGUsIGRzQm9yZGVyKTsKK0NQREZfRm9ybUNvbnRyb2wqIENQREZTREtfV2lkZ2V0OjpHZXRGb3JtQ29udHJvbCgKKyAgICBDUERGX0ludGVyRm9ybSogcEludGVyRm9ybSwKKyAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpIHsKKyAgQVNTRVJUKHBBbm5vdERpY3QpOworICByZXR1cm4gcEludGVyRm9ybS0+R2V0Q29udHJvbEJ5RGljdChwQW5ub3REaWN0KTsKIH0KIAotQ1BERl9NYXRyaXggQ1BERlNES19XaWRnZXQ6OkdldE1hdHJpeCgpIGNvbnN0Ci17Ci0JQ1BERl9NYXRyaXggbXQ7Ci0JQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBHZXRGb3JtQ29udHJvbCgpOwotCUFTU0VSVChwQ29udHJvbCAhPSBOVUxMKTsKLQotCUNQREZfUmVjdCByY0Fubm90ID0gR2V0UmVjdCgpOwotCUZYX0ZMT0FUIGZXaWR0aCA9IHJjQW5ub3QucmlnaHQgLSByY0Fubm90LmxlZnQ7Ci0JRlhfRkxPQVQgZkhlaWdodCA9IHJjQW5ub3QudG9wIC0gcmNBbm5vdC5ib3R0b207Ci0JCi0KLQotCXN3aXRjaCAoYWJzKHBDb250cm9sLT5HZXRSb3RhdGlvbigpICUgMzYwKSkKLQl7Ci0JCWNhc2UgMDoKLQkJZGVmYXVsdDoKLQkJCW10ID0gQ1BERl9NYXRyaXgoMSwgMCwgMCwgMSwgMCwgMCk7Ci0JCQlicmVhazsKLQkJY2FzZSA5MDoKLQkJCW10ID0gQ1BERl9NYXRyaXgoMCwgMSwgLTEsIDAsIGZXaWR0aCwgMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxODA6Ci0JCQltdCA9IENQREZfTWF0cml4KC0xLCAwLCAwLCAtMSwgZldpZHRoLCBmSGVpZ2h0KTsKLQkJCWJyZWFrOwotCQljYXNlIDI3MDoKLQkJCW10ID0gQ1BERl9NYXRyaXgoMCwgLTEsIDEsIDAsIDAsIGZIZWlnaHQpOwotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIG10OworaW50IENQREZTREtfV2lkZ2V0OjpHZXRSb3RhdGUoKSBjb25zdCB7CisgIENQREZfRm9ybUNvbnRyb2wqIHBDdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKKyAgcmV0dXJuIHBDdHJsLT5HZXRSb3RhdGlvbigpICUgMzYwOwogfQogCi1DUFdMX0NvbG9yIENQREZTREtfV2lkZ2V0OjpHZXRUZXh0UFdMQ29sb3IoKSBjb25zdAotewotCUNQV0xfQ29sb3IgY3JUZXh0ID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMCk7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK0NGWF9XaWRlU3RyaW5nIENQREZTREtfV2lkZ2V0OjpHZXROYW1lKCkgY29uc3QgeworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOworICByZXR1cm4gcEZvcm1GaWVsZC0+R2V0RnVsbE5hbWUoKTsKK30KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAotCUNQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7Ci0JQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKK0ZYX0JPT0wgQ1BERlNES19XaWRnZXQ6OkdldEZpbGxDb2xvcihGWF9DT0xPUlJFRiYgY29sb3IpIGNvbnN0IHsKKyAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKKyAgaW50IGlDb2xvclR5cGUgPSAwOworICBjb2xvciA9IEZYX0FSR0JUT0NPTE9SUkVGKHBGb3JtQ3RybC0+R2V0QmFja2dyb3VuZENvbG9yKGlDb2xvclR5cGUpKTsKIAotCUNQREZfRGVmYXVsdEFwcGVhcmFuY2UgZGEgPSBwRm9ybUN0cmwtPkdldERlZmF1bHRBcHBlYXJhbmNlKCk7Ci0JaWYgKGRhLkhhc0NvbG9yKCkpCi0JewotCQlGWF9JTlQzMiBpQ29sb3JUeXBlOwotCQlGWF9GTE9BVCBmY1s0XTsKLQkJZGEuR2V0Q29sb3IoaUNvbG9yVHlwZSwgZmMpOwotCQljclRleHQgPSBDUFdMX0NvbG9yKGlDb2xvclR5cGUsIGZjWzBdLCBmY1sxXSwgZmNbMl0sIGZjWzNdKTsKLQl9Ci0KLQlyZXR1cm4gY3JUZXh0OworICByZXR1cm4gaUNvbG9yVHlwZSAhPSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ7CiB9CiAKLUNQV0xfQ29sb3IgQ1BERlNES19XaWRnZXQ6OkdldEJvcmRlclBXTENvbG9yKCkgY29uc3QKLXsKLQlDUFdMX0NvbG9yIGNyQm9yZGVyOworRlhfQk9PTCBDUERGU0RLX1dpZGdldDo6R2V0Qm9yZGVyQ29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdCB7CisgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7CisgIGludCBpQ29sb3JUeXBlID0gMDsKKyAgY29sb3IgPSBGWF9BUkdCVE9DT0xPUlJFRihwRm9ybUN0cmwtPkdldEJvcmRlckNvbG9yKGlDb2xvclR5cGUpKTsKIAotCUNQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7Ci0JQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKLQotCUZYX0lOVDMyIGlDb2xvclR5cGU7Ci0JRlhfRkxPQVQgZmNbNF07Ci0JcEZvcm1DdHJsLT5HZXRPcmlnaW5hbEJvcmRlckNvbG9yKGlDb2xvclR5cGUsIGZjKTsKLQlpZiAoaUNvbG9yVHlwZSA+IDApCi0JCWNyQm9yZGVyID0gQ1BXTF9Db2xvcihpQ29sb3JUeXBlLCBmY1swXSwgZmNbMV0sIGZjWzJdLCBmY1szXSk7Ci0KLQlyZXR1cm4gY3JCb3JkZXI7CisgIHJldHVybiBpQ29sb3JUeXBlICE9IENPTE9SVFlQRV9UUkFOU1BBUkVOVDsKIH0KIAotQ1BXTF9Db2xvciBDUERGU0RLX1dpZGdldDo6R2V0RmlsbFBXTENvbG9yKCkgY29uc3QKLXsKLQlDUFdMX0NvbG9yIGNyRmlsbDsKK0ZYX0JPT0wgQ1BERlNES19XaWRnZXQ6OkdldFRleHRDb2xvcihGWF9DT0xPUlJFRiYgY29sb3IpIGNvbnN0IHsKKyAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKKyAgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSBkYSA9IHBGb3JtQ3RybC0+R2V0RGVmYXVsdEFwcGVhcmFuY2UoKTsKKyAgaWYgKGRhLkhhc0NvbG9yKCkpIHsKKyAgICBGWF9BUkdCIGFyZ2I7CisgICAgaW50IGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ7CisgICAgZGEuR2V0Q29sb3IoYXJnYiwgaUNvbG9yVHlwZSk7CisgICAgY29sb3IgPSBGWF9BUkdCVE9DT0xPUlJFRihhcmdiKTsKIAotCUNQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7Ci0JQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKKyAgICByZXR1cm4gaUNvbG9yVHlwZSAhPSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ7CisgIH0KIAotCUZYX0lOVDMyIGlDb2xvclR5cGU7Ci0JRlhfRkxPQVQgZmNbNF07Ci0JcEZvcm1DdHJsLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcihpQ29sb3JUeXBlLCBmYyk7Ci0JaWYgKGlDb2xvclR5cGUgPiAwKQotCQljckZpbGwgPSBDUFdMX0NvbG9yKGlDb2xvclR5cGUsIGZjWzBdLCBmY1sxXSwgZmNbMl0sIGZjWzNdKTsKLQotCXJldHVybiBjckZpbGw7CisgIHJldHVybiBGQUxTRTsKIH0KIAotdm9pZCBDUERGU0RLX1dpZGdldDo6QWRkSW1hZ2VUb0FwcGVhcmFuY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNBUFR5cGUsIENQREZfU3RyZWFtKiBwSW1hZ2UpCi17Ci0JQVNTRVJUKHBJbWFnZSAhPSBOVUxMKTsKK0ZYX0ZMT0FUIENQREZTREtfV2lkZ2V0OjpHZXRGb250U2l6ZSgpIGNvbnN0IHsKKyAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKKyAgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSBwRGEgPSBwRm9ybUN0cmwtPkdldERlZmF1bHRBcHBlYXJhbmNlKCk7CisgIENGWF9CeXRlU3RyaW5nIGNzRm9udCA9ICIiOworICBGWF9GTE9BVCBmRm9udFNpemUgPSAwLjBmOworICBwRGEuR2V0Rm9udChjc0ZvbnQsIGZGb250U2l6ZSk7CiAKLQlBU1NFUlQobV9wQW5ub3QgIT0gTlVMTCk7Ci0JQVNTRVJUKG1fcEFubm90LT5tX3BBbm5vdERpY3QgIT0gTlVMTCk7Ci0KLQlDUERGX0RvY3VtZW50KiBwRG9jID0gbV9wUGFnZVZpZXctPkdldFBERkRvY3VtZW50KCk7Ly9wRG9jdW1lbnQtPkdldERvY3VtZW50KCk7Ci0JQVNTRVJUKHBEb2MgIT0gTlVMTCk7Ci0KLQlDUERGX0RpY3Rpb25hcnkqIHBBUERpY3QgPSBtX3BBbm5vdC0+bV9wQW5ub3REaWN0LT5HZXREaWN0KCJBUCIpOwotCUFTU0VSVChwQVBEaWN0ICE9IE5VTEwpOwotCi0JQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwQVBEaWN0LT5HZXRTdHJlYW0oc0FQVHlwZSk7Ci0JQVNTRVJUKHBTdHJlYW0gIT0gTlVMTCk7Ci0KLQlDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1EaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOwotCUFTU0VSVChwU3RyZWFtRGljdCAhPSBOVUxMKTsKLQotCUNGWF9CeXRlU3RyaW5nIHNJbWFnZUFsaWFzID0gIklNRyI7Ci0KLQlpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwSW1hZ2VEaWN0ID0gcEltYWdlLT5HZXREaWN0KCkpCi0JewotCQlzSW1hZ2VBbGlhcyA9IHBJbWFnZURpY3QtPkdldFN0cmluZygiTmFtZSIpOwotCQlpZiAoc0ltYWdlQWxpYXMuSXNFbXB0eSgpKQotCQkJc0ltYWdlQWxpYXMgPSAiSU1HIjsKLQl9CQotCi0JQ1BERl9EaWN0aW9uYXJ5KiBwU3RyZWFtUmVzTGlzdCA9IHBTdHJlYW1EaWN0LT5HZXREaWN0KCJSZXNvdXJjZXMiKTsKLQlpZiAoIXBTdHJlYW1SZXNMaXN0KQotCXsKLQkJcFN0cmVhbVJlc0xpc3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5KCk7Ci0JCXBTdHJlYW1EaWN0LT5TZXRBdCgiUmVzb3VyY2VzIiwgcFN0cmVhbVJlc0xpc3QpOwotCX0KLQotCWlmIChwU3RyZWFtUmVzTGlzdCkKLQl7Ci0JCUNQREZfRGljdGlvbmFyeSogcFhPYmplY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5OwotCQlwWE9iamVjdC0+U2V0QXRSZWZlcmVuY2Uoc0ltYWdlQWxpYXMsIHBEb2MsIHBJbWFnZSk7Ci0JCXBTdHJlYW1SZXNMaXN0LT5TZXRBdCgiWE9iamVjdCIsIHBYT2JqZWN0KTsKLQl9CisgIHJldHVybiBmRm9udFNpemU7CiB9CiAKLXZvaWQgQ1BERlNES19XaWRnZXQ6OlJlbW92ZUFwcGVhcmFuY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNBUFR5cGUpCi17Ci0JQVNTRVJUKG1fcEFubm90ICE9IE5VTEwpOwotCUFTU0VSVChtX3BBbm5vdC0+bV9wQW5ub3REaWN0ICE9IE5VTEwpOwotCi0JaWYgKENQREZfRGljdGlvbmFyeSogcEFQRGljdCA9IG1fcEFubm90LT5tX3BBbm5vdERpY3QtPkdldERpY3QoIkFQIikpCi0JewotCQlwQVBEaWN0LT5SZW1vdmVBdChzQVBUeXBlKTsKLQl9CitpbnQgQ1BERlNES19XaWRnZXQ6OkdldFNlbGVjdGVkSW5kZXgoaW50IG5JbmRleCkgY29uc3QgeworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIGlmIChJWEZBX1dpZGdldCogaFdpZGdldCA9IHRoaXMtPkdldE1peFhGQVdpZGdldCgpKSB7CisgICAgaWYgKElYRkFfV2lkZ2V0SGFuZGxlciogcFhGQVdpZGdldEhhbmRsZXIgPSB0aGlzLT5HZXRYRkFXaWRnZXRIYW5kbGVyKCkpIHsKKyAgICAgIGlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhXaWRnZXQpKSB7CisgICAgICAgIGlmIChuSW5kZXggPCBwV2lkZ2V0QWNjLT5Db3VudFNlbGVjdGVkSXRlbXMoKSkKKyAgICAgICAgICByZXR1cm4gcFdpZGdldEFjYy0+R2V0U2VsZWN0ZWRJdGVtKG5JbmRleCk7CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CisgIHJldHVybiBwRm9ybUZpZWxkLT5HZXRTZWxlY3RlZEluZGV4KG5JbmRleCk7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19XaWRnZXQ6Ok9uQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQotewotCUNQREZfQWN0aW9uIGFjdGlvbiA9IEdldEFBY3Rpb24odHlwZSk7Ci0KLQlpZiAoYWN0aW9uICYmIGFjdGlvbi5HZXRUeXBlKCkgIT0gQ1BERl9BY3Rpb246OlVua25vd24pCi0JewotIAkJQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50ID0gcFBhZ2VWaWV3LT5HZXRTREtEb2N1bWVudCgpOwotIAkJQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKLSAKLSAJCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBwRG9jdW1lbnQtPkdldEVudigpOwotIAkJQVNTRVJUKHBFbnYgIT0gTlVMTCk7Ci0KLQkJQ1BERlNES19BY3Rpb25IYW5kbGVyKiBwQWN0aW9uSGFuZGxlciA9IHBFbnYtPkdldEFjdGlvbkhhbmRlcigpOy8qKENQREZTREtfQWN0aW9uSGFuZGxlciopcEFwcC0+R2V0QWN0aW9uSGFuZGxlcigpOyovCi0gCQlBU1NFUlQocEFjdGlvbkhhbmRsZXIgIT0gTlVMTCk7Ci0gCi0gCQlyZXR1cm4gcEFjdGlvbkhhbmRsZXItPkRvQWN0aW9uX0ZpZWxkKGFjdGlvbiwgdHlwZSwgcERvY3VtZW50LCBHZXRGb3JtRmllbGQoKSwgZGF0YSk7Ci0JfQotCi0JcmV0dXJuIEZBTFNFOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCitDRlhfV2lkZVN0cmluZyBDUERGU0RLX1dpZGdldDo6R2V0VmFsdWUoRlhfQk9PTCBiRGlzcGxheSkgY29uc3QgeworICBpZiAoSVhGQV9XaWRnZXQqIGhXaWRnZXQgPSB0aGlzLT5HZXRNaXhYRkFXaWRnZXQoKSkgeworICAgIGlmIChJWEZBX1dpZGdldEhhbmRsZXIqIHBYRkFXaWRnZXRIYW5kbGVyID0gdGhpcy0+R2V0WEZBV2lkZ2V0SGFuZGxlcigpKSB7CisgICAgICBpZiAoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwWEZBV2lkZ2V0SGFuZGxlci0+R2V0RGF0YUFjYyhoV2lkZ2V0KSkgeworICAgICAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWU7CisgICAgICAgIHBXaWRnZXRBY2MtPkdldFZhbHVlKHNWYWx1ZSwgYkRpc3BsYXkgPyBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCk7CisgICAgICAgIHJldHVybiBzVmFsdWU7CisgICAgICB9CisgICAgfQorICB9CisjZWxzZQorQ0ZYX1dpZGVTdHJpbmcgQ1BERlNES19XaWRnZXQ6OkdldFZhbHVlKCkgY29uc3QgeworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOworICByZXR1cm4gcEZvcm1GaWVsZC0+R2V0VmFsdWUoKTsKIH0KIAotQ1BERl9BY3Rpb24JQ1BERlNES19XaWRnZXQ6OkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFUKQotewotCXN3aXRjaCAoZUFBVCkKLQl7Ci0JY2FzZSBDUERGX0FBY3Rpb246OkN1cnNvckVudGVyOgotCWNhc2UgQ1BERl9BQWN0aW9uOjpDdXJzb3JFeGl0OgotCWNhc2UgQ1BERl9BQWN0aW9uOjpCdXR0b25Eb3duOgotCWNhc2UgQ1BERl9BQWN0aW9uOjpCdXR0b25VcDoKLQljYXNlIENQREZfQUFjdGlvbjo6R2V0Rm9jdXM6Ci0JY2FzZSBDUERGX0FBY3Rpb246Okxvc2VGb2N1czoKLQljYXNlIENQREZfQUFjdGlvbjo6UGFnZU9wZW46Ci0JY2FzZSBDUERGX0FBY3Rpb246OlBhZ2VDbG9zZToKLQljYXNlIENQREZfQUFjdGlvbjo6UGFnZVZpc2libGU6Ci0JY2FzZSBDUERGX0FBY3Rpb246OlBhZ2VJbnZpc2libGU6Ci0JCXJldHVybiBDUERGU0RLX0Fubm90OjpHZXRBQWN0aW9uKGVBQVQpOwotCi0JY2FzZSBDUERGX0FBY3Rpb246OktleVN0cm9rZToKLQljYXNlIENQREZfQUFjdGlvbjo6Rm9ybWF0OgotCWNhc2UgQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZToKLQljYXNlIENQREZfQUFjdGlvbjo6Q2FsY3VsYXRlOgotCQl7Ci0JCQlDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gdGhpcy0+R2V0Rm9ybUZpZWxkKCk7Ci0JCQlpZiAoQ1BERl9BQWN0aW9uIGFhID0gcEZpZWxkLT5HZXRBZGRpdGlvbmFsQWN0aW9uKCkpCi0JCQkJcmV0dXJuIGFhLkdldEFjdGlvbihlQUFUKTsKLQotCQkJcmV0dXJuIENQREZTREtfQW5ub3Q6OkdldEFBY3Rpb24oZUFBVCk7Ci0JCX0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gQ1BERl9BY3Rpb24oKTsKK0NGWF9XaWRlU3RyaW5nIENQREZTREtfV2lkZ2V0OjpHZXREZWZhdWx0VmFsdWUoKSBjb25zdCB7CisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CisgIHJldHVybiBwRm9ybUZpZWxkLT5HZXREZWZhdWx0VmFsdWUoKTsKIH0KIAotCi1DRlhfV2lkZVN0cmluZyBDUERGU0RLX1dpZGdldDo6R2V0QWx0ZXJuYXRlTmFtZSgpIGNvbnN0Ci17Ci0JQ1BERl9Gb3JtRmllbGQqCXBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKLQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotCXJldHVybiBwRm9ybUZpZWxkLT5HZXRBbHRlcm5hdGVOYW1lKCk7CitDRlhfV2lkZVN0cmluZyBDUERGU0RLX1dpZGdldDo6R2V0T3B0aW9uTGFiZWwoaW50IG5JbmRleCkgY29uc3QgeworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOworICByZXR1cm4gcEZvcm1GaWVsZC0+R2V0T3B0aW9uTGFiZWwobkluZGV4KTsKIH0KIAotRlhfSU5UMzIJQ1BERlNES19XaWRnZXQ6OkdldEFwcGVhcmFuY2VBZ2UoKSBjb25zdAotewotCXJldHVybiBtX25BcHBBZ2U7CitpbnQgQ1BERlNES19XaWRnZXQ6OkNvdW50T3B0aW9ucygpIGNvbnN0IHsKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKKyAgcmV0dXJuIHBGb3JtRmllbGQtPkNvdW50T3B0aW9ucygpOwogfQogCi1GWF9JTlQzMiBDUERGU0RLX1dpZGdldDo6R2V0VmFsdWVBZ2UoKSBjb25zdAotewotCXJldHVybiBtX25WYWx1ZUFnZTsKK0ZYX0JPT0wgQ1BERlNES19XaWRnZXQ6OklzT3B0aW9uU2VsZWN0ZWQoaW50IG5JbmRleCkgY29uc3QgeworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIGlmIChJWEZBX1dpZGdldCogaFdpZGdldCA9IHRoaXMtPkdldE1peFhGQVdpZGdldCgpKSB7CisgICAgaWYgKElYRkFfV2lkZ2V0SGFuZGxlciogcFhGQVdpZGdldEhhbmRsZXIgPSB0aGlzLT5HZXRYRkFXaWRnZXRIYW5kbGVyKCkpIHsKKyAgICAgIGlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhXaWRnZXQpKSB7CisgICAgICAgIGlmIChuSW5kZXggPiAtMSAmJiBuSW5kZXggPCBwV2lkZ2V0QWNjLT5Db3VudENob2ljZUxpc3RJdGVtcygpKQorICAgICAgICAgIHJldHVybiBwV2lkZ2V0QWNjLT5HZXRJdGVtU3RhdGUobkluZGV4KTsKKworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CisgIHJldHVybiBwRm9ybUZpZWxkLT5Jc0l0ZW1TZWxlY3RlZChuSW5kZXgpOwogfQogCi0KLUZYX0JPT0wJQ1BERlNES19XaWRnZXQ6OkhpdFRlc3QoRlhfRkxPQVQgcGFnZVgsIEZYX0ZMT0FUIHBhZ2VZKQotewotCUNQREZfQW5ub3QqIHBBbm5vdCA9IEdldFBERkFubm90KCk7Ci0JQ0ZYX0Zsb2F0UmVjdCBhbm5vdFJlY3Q7Ci0JcEFubm90LT5HZXRSZWN0KGFubm90UmVjdCk7Ci0JaWYoYW5ub3RSZWN0LkNvbnRhaW5zKHBhZ2VYLCBwYWdlWSkpCi0JewotCQlpZiAoIUlzVmlzaWJsZSgpKSByZXR1cm4gRkFMU0U7Ci0JCQotCQlpbnQgbkZpZWxkRmxhZ3MgPSBHZXRGaWVsZEZsYWdzKCk7Ci0JCWlmICgobkZpZWxkRmxhZ3MgJiBGSUVMREZMQUdfUkVBRE9OTFkpID09IEZJRUxERkxBR19SRUFET05MWSkgCi0JCQlyZXR1cm4gRkFMU0U7Ci0JCQotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JcmV0dXJuIEZBTFNFOworaW50IENQREZTREtfV2lkZ2V0OjpHZXRUb3BWaXNpYmxlSW5kZXgoKSBjb25zdCB7CisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CisgIHJldHVybiBwRm9ybUZpZWxkLT5HZXRUb3BWaXNpYmxlSW5kZXgoKTsKIH0KIAorRlhfQk9PTCBDUERGU0RLX1dpZGdldDo6SXNDaGVja2VkKCkgY29uc3QgeworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIGlmIChJWEZBX1dpZGdldEhhbmRsZXIqIHBYRkFXaWRnZXRIYW5kbGVyID0gdGhpcy0+R2V0WEZBV2lkZ2V0SGFuZGxlcigpKSB7CisgICAgaWYgKElYRkFfV2lkZ2V0KiBoV2lkZ2V0ID0gdGhpcy0+R2V0TWl4WEZBV2lkZ2V0KCkpIHsKKyAgICAgIGlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhXaWRnZXQpKSB7CisgICAgICAgIEZYX0JPT0wgYkNoZWNrZWQgPSBwV2lkZ2V0QWNjLT5HZXRDaGVja1N0YXRlKCkgPT0gWEZBX0NIRUNLU1RBVEVfT247CisgICAgICAgIHJldHVybiBiQ2hlY2tlZDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKKyAgcmV0dXJuIHBGb3JtQ3RybC0+SXNDaGVja2VkKCk7Cit9CisKK2ludCBDUERGU0RLX1dpZGdldDo6R2V0QWxpZ25tZW50KCkgY29uc3QgeworICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBHZXRGb3JtQ29udHJvbCgpOworICByZXR1cm4gcEZvcm1DdHJsLT5HZXRDb250cm9sQWxpZ25tZW50KCk7Cit9CisKK2ludCBDUERGU0RLX1dpZGdldDo6R2V0TWF4TGVuKCkgY29uc3QgeworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOworICByZXR1cm4gcEZvcm1GaWVsZC0+R2V0TWF4TGVuKCk7Cit9CisKK3ZvaWQgQ1BERlNES19XaWRnZXQ6OlNldENoZWNrKEZYX0JPT0wgYkNoZWNrZWQsIEZYX0JPT0wgYk5vdGlmeSkgeworICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBHZXRGb3JtQ29udHJvbCgpOworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IHBGb3JtQ3RybC0+R2V0RmllbGQoKTsKKyAgcEZvcm1GaWVsZC0+Q2hlY2tDb250cm9sKHBGb3JtRmllbGQtPkdldENvbnRyb2xJbmRleChwRm9ybUN0cmwpLCBiQ2hlY2tlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOb3RpZnkpOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIGlmICghSXNXaWRnZXRBcHBlYXJhbmNlVmFsaWQoQ1BERl9Bbm5vdDo6Tm9ybWFsKSkKKyAgICBSZXNldEFwcGVhcmFuY2UoVFJVRSk7CisgIGlmICghYk5vdGlmeSkKKyAgICBTeW5jaHJvbml6ZShUUlVFKTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKK30KKwordm9pZCBDUERGU0RLX1dpZGdldDo6U2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNWYWx1ZSwgRlhfQk9PTCBiTm90aWZ5KSB7CisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CisgIHBGb3JtRmllbGQtPlNldFZhbHVlKHNWYWx1ZSwgYk5vdGlmeSk7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgaWYgKCFiTm90aWZ5KQorICAgIFN5bmNocm9uaXplKFRSVUUpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorfQorCit2b2lkIENQREZTREtfV2lkZ2V0OjpTZXREZWZhdWx0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNWYWx1ZSkge30KK3ZvaWQgQ1BERlNES19XaWRnZXQ6OlNldE9wdGlvblNlbGVjdGlvbihpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2VsZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5KSB7CisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CisgIHBGb3JtRmllbGQtPlNldEl0ZW1TZWxlY3Rpb24oaW5kZXgsIGJTZWxlY3RlZCwgYk5vdGlmeSk7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgaWYgKCFiTm90aWZ5KQorICAgIFN5bmNocm9uaXplKFRSVUUpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorfQorCit2b2lkIENQREZTREtfV2lkZ2V0OjpDbGVhclNlbGVjdGlvbihGWF9CT09MIGJOb3RpZnkpIHsKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKKyAgcEZvcm1GaWVsZC0+Q2xlYXJTZWxlY3Rpb24oYk5vdGlmeSk7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgaWYgKCFiTm90aWZ5KQorICAgIFN5bmNocm9uaXplKFRSVUUpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorfQorCit2b2lkIENQREZTREtfV2lkZ2V0OjpTZXRUb3BWaXNpYmxlSW5kZXgoaW50IGluZGV4KSB7fQorCit2b2lkIENQREZTREtfV2lkZ2V0OjpTZXRBcHBNb2RpZmllZCgpIHsKKyAgbV9iQXBwTW9kaWZpZWQgPSBUUlVFOworfQorCit2b2lkIENQREZTREtfV2lkZ2V0OjpDbGVhckFwcE1vZGlmaWVkKCkgeworICBtX2JBcHBNb2RpZmllZCA9IEZBTFNFOworfQorCitGWF9CT09MIENQREZTREtfV2lkZ2V0OjpJc0FwcE1vZGlmaWVkKCkgY29uc3QgeworICByZXR1cm4gbV9iQXBwTW9kaWZpZWQ7Cit9CisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQordm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRBcHBlYXJhbmNlKEZYX0JPT0wgYlZhbHVlQ2hhbmdlZCkgeworICBzd2l0Y2ggKEdldEZpZWxkVHlwZSgpKSB7CisgICAgY2FzZSBGSUVMRFRZUEVfVEVYVEZJRUxEOgorICAgIGNhc2UgRklFTERUWVBFX0NPTUJPQk9YOiB7CisgICAgICBGWF9CT09MIGJGb3JtYXRlZCA9IEZBTFNFOworICAgICAgQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlID0gdGhpcy0+T25Gb3JtYXQoYkZvcm1hdGVkKTsKKyAgICAgIGlmIChiRm9ybWF0ZWQpCisgICAgICAgIHRoaXMtPlJlc2V0QXBwZWFyYW5jZShzVmFsdWUsIFRSVUUpOworICAgICAgZWxzZQorICAgICAgICB0aGlzLT5SZXNldEFwcGVhcmFuY2UoTlVMTCwgVFJVRSk7CisgICAgfSBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhpcy0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsIEZBTFNFKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKK3ZvaWQgQ1BERlNES19XaWRnZXQ6OlJlc2V0QXBwZWFyYW5jZShjb25zdCBGWF9XQ0hBUiogc1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZhbHVlQ2hhbmdlZCkgeworICBTZXRBcHBNb2RpZmllZCgpOworCisgIG1fbkFwcEFnZSsrOworICBpZiAobV9uQXBwQWdlID4gOTk5OTk5KQorICAgIG1fbkFwcEFnZSA9IDA7CisgIGlmIChiVmFsdWVDaGFuZ2VkKQorICAgIG1fblZhbHVlQWdlKys7CisKKyAgaW50IG5GaWVsZFR5cGUgPSBHZXRGaWVsZFR5cGUoKTsKKworICBzd2l0Y2ggKG5GaWVsZFR5cGUpIHsKKyAgICBjYXNlIEZJRUxEVFlQRV9QVVNIQlVUVE9OOgorICAgICAgUmVzZXRBcHBlYXJhbmNlX1B1c2hCdXR0b24oKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgorICAgICAgUmVzZXRBcHBlYXJhbmNlX0NoZWNrQm94KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZJRUxEVFlQRV9SQURJT0JVVFRPTjoKKyAgICAgIFJlc2V0QXBwZWFyYW5jZV9SYWRpb0J1dHRvbigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6CisgICAgICBSZXNldEFwcGVhcmFuY2VfQ29tYm9Cb3goc1ZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRklFTERUWVBFX0xJU1RCT1g6CisgICAgICBSZXNldEFwcGVhcmFuY2VfTGlzdEJveCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGSUVMRFRZUEVfVEVYVEZJRUxEOgorICAgICAgUmVzZXRBcHBlYXJhbmNlX1RleHRGaWVsZChzVmFsdWUpOworICAgICAgYnJlYWs7CisgIH0KKworICBtX3BBbm5vdC0+Q2xlYXJDYWNoZWRBUCgpOworfQorCitDRlhfV2lkZVN0cmluZyBDUERGU0RLX1dpZGdldDo6T25Gb3JtYXQoRlhfQk9PTCYgYkZvcm1hdGVkKSB7CisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CisgIEFTU0VSVChwRm9ybUZpZWxkKTsKKyAgcmV0dXJuIG1fcEludGVyRm9ybS0+T25Gb3JtYXQocEZvcm1GaWVsZCwgYkZvcm1hdGVkKTsKK30KKwordm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRGaWVsZEFwcGVhcmFuY2UoRlhfQk9PTCBiVmFsdWVDaGFuZ2VkKSB7CisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CisgIEFTU0VSVChwRm9ybUZpZWxkKTsKKyAgbV9wSW50ZXJGb3JtLT5SZXNldEZpZWxkQXBwZWFyYW5jZShwRm9ybUZpZWxkLCBOVUxMLCBiVmFsdWVDaGFuZ2VkKTsKK30KKwordm9pZCBDUERGU0RLX1dpZGdldDo6RHJhd0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKSB7CisgIGludCBuRmllbGRUeXBlID0gR2V0RmllbGRUeXBlKCk7CisKKyAgaWYgKChuRmllbGRUeXBlID09IEZJRUxEVFlQRV9DSEVDS0JPWCB8fAorICAgICAgIG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKSAmJgorICAgICAgbW9kZSA9PSBDUERGX0Fubm90OjpOb3JtYWwgJiYKKyAgICAgICFJc1dpZGdldEFwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpOb3JtYWwpKSB7CisgICAgQ0ZYX1BhdGhEYXRhIHBhdGhEYXRhOworCisgICAgQ1BERl9SZWN0IHJjQW5ub3QgPSBHZXRSZWN0KCk7CisKKyAgICBwYXRoRGF0YS5BcHBlbmRSZWN0KHJjQW5ub3QubGVmdCwgcmNBbm5vdC5ib3R0b20sIHJjQW5ub3QucmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICByY0Fubm90LnRvcCk7CisKKyAgICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOworICAgIGdzZC5tX0xpbmVXaWR0aCA9IDAuMGY7CisKKyAgICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aERhdGEsIHBVc2VyMkRldmljZSwgJmdzZCwgMCwgMHhGRkFBQUFBQSwKKyAgICAgICAgICAgICAgICAgICAgICBGWEZJTExfQUxURVJOQVRFKTsKKyAgfSBlbHNlIHsKKyAgICBDUERGU0RLX0JBQW5ub3Q6OkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgbW9kZSwgcE9wdGlvbnMpOworICB9Cit9CisKK3ZvaWQgQ1BERlNES19XaWRnZXQ6OlVwZGF0ZUZpZWxkKCkgeworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOworICBBU1NFUlQocEZvcm1GaWVsZCk7CisgIG1fcEludGVyRm9ybS0+VXBkYXRlRmllbGQocEZvcm1GaWVsZCk7Cit9CisKK3ZvaWQgQ1BERlNES19XaWRnZXQ6OkRyYXdTaGFkb3coQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CisgIGludCBuRmllbGRUeXBlID0gR2V0RmllbGRUeXBlKCk7CisgIGlmIChtX3BJbnRlckZvcm0tPklzTmVlZEhpZ2hMaWdodChuRmllbGRUeXBlKSkgeworICAgIENQREZfUmVjdCByYyA9IEdldFJlY3QoKTsKKyAgICBGWF9DT0xPUlJFRiBjb2xvciA9IG1fcEludGVyRm9ybS0+R2V0SGlnaGxpZ2h0Q29sb3IobkZpZWxkVHlwZSk7CisgICAgdWludDhfdCBhbHBoYSA9IG1fcEludGVyRm9ybS0+R2V0SGlnaGxpZ2h0QWxwaGEoKTsKKworICAgIENGWF9GbG9hdFJlY3QgcmNEZXZpY2U7CisgICAgQVNTRVJUKG1fcEludGVyRm9ybS0+R2V0RG9jdW1lbnQoKSk7CisgICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcEludGVyRm9ybS0+R2V0RG9jdW1lbnQoKS0+R2V0RW52KCk7CisgICAgaWYgKCFwRW52KQorICAgICAgcmV0dXJuOworICAgIENGWF9NYXRyaXggcGFnZTJkZXZpY2U7CisgICAgcFBhZ2VWaWV3LT5HZXRDdXJyZW50TWF0cml4KHBhZ2UyZGV2aWNlKTsKKyAgICBwYWdlMmRldmljZS5UcmFuc2Zvcm0oKChGWF9GTE9BVClyYy5sZWZ0KSwgKChGWF9GTE9BVClyYy5ib3R0b20pLAorICAgICAgICAgICAgICAgICAgICAgICAgICByY0RldmljZS5sZWZ0LCByY0RldmljZS5ib3R0b20pOworICAgIHBhZ2UyZGV2aWNlLlRyYW5zZm9ybSgoKEZYX0ZMT0FUKXJjLnJpZ2h0KSwgKChGWF9GTE9BVClyYy50b3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICByY0RldmljZS5yaWdodCwgcmNEZXZpY2UudG9wKTsKKworICAgIHJjRGV2aWNlLk5vcm1hbGl6ZSgpOworCisgICAgRlhfQVJHQiBhcmdiID0gQXJnYkVuY29kZSgoaW50KWFscGhhLCBjb2xvcik7CisgICAgRlhfUkVDVCByY0RldigoaW50KXJjRGV2aWNlLmxlZnQsIChpbnQpcmNEZXZpY2UudG9wLCAoaW50KXJjRGV2aWNlLnJpZ2h0LAorICAgICAgICAgICAgICAgICAgKGludClyY0RldmljZS5ib3R0b20pOworICAgIHBEZXZpY2UtPkZpbGxSZWN0KCZyY0RldiwgYXJnYik7CisgIH0KK30KKwordm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRBcHBlYXJhbmNlX1B1c2hCdXR0b24oKSB7CisgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gR2V0Rm9ybUNvbnRyb2woKTsKKyAgQ1BERl9SZWN0IHJjV2luZG93ID0gR2V0Um90YXRlZFJlY3QoKTsKKyAgaW50MzJfdCBuTGF5b3V0ID0gMDsKKyAgc3dpdGNoIChwQ29udHJvbC0+R2V0VGV4dFBvc2l0aW9uKCkpIHsKKyAgICBjYXNlIFRFWFRQT1NfSUNPTjoKKyAgICAgIG5MYXlvdXQgPSBQUEJMX0lDT047CisgICAgICBicmVhazsKKyAgICBjYXNlIFRFWFRQT1NfQkVMT1c6CisgICAgICBuTGF5b3V0ID0gUFBCTF9JQ09OVE9QTEFCRUxCT1RUT007CisgICAgICBicmVhazsKKyAgICBjYXNlIFRFWFRQT1NfQUJPVkU6CisgICAgICBuTGF5b3V0ID0gUFBCTF9MQUJFTFRPUElDT05CT1RUT007CisgICAgICBicmVhazsKKyAgICBjYXNlIFRFWFRQT1NfUklHSFQ6CisgICAgICBuTGF5b3V0ID0gUFBCTF9JQ09OTEVGVExBQkVMUklHSFQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRFWFRQT1NfTEVGVDoKKyAgICAgIG5MYXlvdXQgPSBQUEJMX0xBQkVMTEVGVElDT05SSUdIVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEVYVFBPU19PVkVSTEFJRDoKKyAgICAgIG5MYXlvdXQgPSBQUEJMX0xBQkVMT1ZFUklDT047CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbkxheW91dCA9IFBQQkxfTEFCRUw7CisgICAgICBicmVhazsKKyAgfQorCisgIENQV0xfQ29sb3IgY3JCYWNrZ3JvdW5kLCBjckJvcmRlcjsKKworICBpbnQgaUNvbG9yVHlwZTsKKyAgRlhfRkxPQVQgZmNbNF07CisKKyAgcENvbnRyb2wtPkdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKGlDb2xvclR5cGUsIGZjKTsKKyAgaWYgKGlDb2xvclR5cGUgPiAwKQorICAgIGNyQmFja2dyb3VuZCA9IENQV0xfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOworCisgIHBDb250cm9sLT5HZXRPcmlnaW5hbEJvcmRlckNvbG9yKGlDb2xvclR5cGUsIGZjKTsKKyAgaWYgKGlDb2xvclR5cGUgPiAwKQorICAgIGNyQm9yZGVyID0gQ1BXTF9Db2xvcihpQ29sb3JUeXBlLCBmY1swXSwgZmNbMV0sIGZjWzJdLCBmY1szXSk7CisKKyAgRlhfRkxPQVQgZkJvcmRlcldpZHRoID0gKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCk7CisgIGludDMyX3QgbkJvcmRlclN0eWxlID0gMDsKKyAgQ1BXTF9EYXNoIGRzQm9yZGVyKDMsIDAsIDApOworICBDUFdMX0NvbG9yIGNyTGVmdFRvcCwgY3JSaWdodEJvdHRvbTsKKworICBzd2l0Y2ggKEdldEJvcmRlclN0eWxlKCkpIHsKKyAgICBjYXNlIEJCU19EQVNIOgorICAgICAgbkJvcmRlclN0eWxlID0gUEJTX0RBU0g7CisgICAgICBkc0JvcmRlciA9IENQV0xfRGFzaCgzLCAzLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQkJTX0JFVkVMRUQ6CisgICAgICBuQm9yZGVyU3R5bGUgPSBQQlNfQkVWRUxFRDsKKyAgICAgIGZCb3JkZXJXaWR0aCAqPSAyOworICAgICAgY3JMZWZ0VG9wID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMSk7CisgICAgICBjclJpZ2h0Qm90dG9tID0gQ1BXTF9VdGlsczo6RGV2aWRlQ29sb3IoY3JCYWNrZ3JvdW5kLCAyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQkJTX0lOU0VUOgorICAgICAgbkJvcmRlclN0eWxlID0gUEJTX0lOU0VUOworICAgICAgZkJvcmRlcldpZHRoICo9IDI7CisgICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwLjUpOworICAgICAgY3JSaWdodEJvdHRvbSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDAuNzUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCQlNfVU5ERVJMSU5FOgorICAgICAgbkJvcmRlclN0eWxlID0gUEJTX1VOREVSTElORUQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbkJvcmRlclN0eWxlID0gUEJTX1NPTElEOworICAgICAgYnJlYWs7CisgIH0KKworICBDUERGX1JlY3QgcmNDbGllbnQgPSBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyY1dpbmRvdywgZkJvcmRlcldpZHRoKTsKKworICBDUFdMX0NvbG9yIGNyVGV4dChDT0xPUlRZUEVfR1JBWSwgMCk7CisKKyAgRlhfRkxPQVQgZkZvbnRTaXplID0gMTIuMGY7CisgIENGWF9CeXRlU3RyaW5nIGNzTmFtZVRhZzsKKworICBDUERGX0RlZmF1bHRBcHBlYXJhbmNlIGRhID0gcENvbnRyb2wtPkdldERlZmF1bHRBcHBlYXJhbmNlKCk7CisgIGlmIChkYS5IYXNDb2xvcigpKSB7CisgICAgZGEuR2V0Q29sb3IoaUNvbG9yVHlwZSwgZmMpOworICAgIGNyVGV4dCA9IENQV0xfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOworICB9CisKKyAgaWYgKGRhLkhhc0ZvbnQoKSkKKyAgICBkYS5HZXRGb250KGNzTmFtZVRhZywgZkZvbnRTaXplKTsKKworICBDRlhfV2lkZVN0cmluZyBjc1dDYXB0aW9uOworICBDRlhfV2lkZVN0cmluZyBjc05vcm1hbENhcHRpb24sIGNzUm9sbG92ZXJDYXB0aW9uLCBjc0Rvd25DYXB0aW9uOworCisgIGlmIChwQ29udHJvbC0+SGFzTUtFbnRyeSgiQ0EiKSkgeworICAgIGNzTm9ybWFsQ2FwdGlvbiA9IHBDb250cm9sLT5HZXROb3JtYWxDYXB0aW9uKCk7CisgIH0KKyAgaWYgKHBDb250cm9sLT5IYXNNS0VudHJ5KCJSQyIpKSB7CisgICAgY3NSb2xsb3ZlckNhcHRpb24gPSBwQ29udHJvbC0+R2V0Um9sbG92ZXJDYXB0aW9uKCk7CisgIH0KKyAgaWYgKHBDb250cm9sLT5IYXNNS0VudHJ5KCJBQyIpKSB7CisgICAgY3NEb3duQ2FwdGlvbiA9IHBDb250cm9sLT5HZXREb3duQ2FwdGlvbigpOworICB9CisKKyAgQ1BERl9TdHJlYW0qIHBOb3JtYWxJY29uID0gTlVMTDsKKyAgQ1BERl9TdHJlYW0qIHBSb2xsb3Zlckljb24gPSBOVUxMOworICBDUERGX1N0cmVhbSogcERvd25JY29uID0gTlVMTDsKKworICBpZiAocENvbnRyb2wtPkhhc01LRW50cnkoIkkiKSkgeworICAgIHBOb3JtYWxJY29uID0gcENvbnRyb2wtPkdldE5vcm1hbEljb24oKTsKKyAgfQorICBpZiAocENvbnRyb2wtPkhhc01LRW50cnkoIlJJIikpIHsKKyAgICBwUm9sbG92ZXJJY29uID0gcENvbnRyb2wtPkdldFJvbGxvdmVySWNvbigpOworICB9CisgIGlmIChwQ29udHJvbC0+SGFzTUtFbnRyeSgiSVgiKSkgeworICAgIHBEb3duSWNvbiA9IHBDb250cm9sLT5HZXREb3duSWNvbigpOworICB9CisKKyAgaWYgKHBOb3JtYWxJY29uKSB7CisgICAgaWYgKENQREZfRGljdGlvbmFyeSogcEltYWdlRGljdCA9IHBOb3JtYWxJY29uLT5HZXREaWN0KCkpIHsKKyAgICAgIGlmIChwSW1hZ2VEaWN0LT5HZXRTdHJpbmcoIk5hbWUiKS5Jc0VtcHR5KCkpCisgICAgICAgIHBJbWFnZURpY3QtPlNldEF0U3RyaW5nKCJOYW1lIiwgIkltZ0EiKTsKKyAgICB9CisgIH0KKworICBpZiAocFJvbGxvdmVySWNvbikgeworICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBJbWFnZURpY3QgPSBwUm9sbG92ZXJJY29uLT5HZXREaWN0KCkpIHsKKyAgICAgIGlmIChwSW1hZ2VEaWN0LT5HZXRTdHJpbmcoIk5hbWUiKS5Jc0VtcHR5KCkpCisgICAgICAgIHBJbWFnZURpY3QtPlNldEF0U3RyaW5nKCJOYW1lIiwgIkltZ0IiKTsKKyAgICB9CisgIH0KKworICBpZiAocERvd25JY29uKSB7CisgICAgaWYgKENQREZfRGljdGlvbmFyeSogcEltYWdlRGljdCA9IHBEb3duSWNvbi0+R2V0RGljdCgpKSB7CisgICAgICBpZiAocEltYWdlRGljdC0+R2V0U3RyaW5nKCJOYW1lIikuSXNFbXB0eSgpKQorICAgICAgICBwSW1hZ2VEaWN0LT5TZXRBdFN0cmluZygiTmFtZSIsICJJbWdDIik7CisgICAgfQorICB9CisKKyAgQ1BERl9JY29uRml0IGljb25GaXQgPSBwQ29udHJvbC0+R2V0SWNvbkZpdCgpOworCisgIENQREZTREtfRG9jdW1lbnQqIHBEb2MgPSBtX3BJbnRlckZvcm0tPkdldERvY3VtZW50KCk7CisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBwRG9jLT5HZXRFbnYoKTsKKworICBDQkFfRm9udE1hcCBmb250X21hcCh0aGlzLCBwRW52LT5HZXRTeXNIYW5kbGVyKCkpOworICBmb250X21hcC5TZXRBUFR5cGUoIk4iKTsKKworICBDRlhfQnl0ZVN0cmluZyBjc0FQID0KKyAgICAgIENQV0xfVXRpbHM6OkdldFJlY3RGaWxsQXBwU3RyZWFtKHJjV2luZG93LCBjckJhY2tncm91bmQpICsKKyAgICAgIENQV0xfVXRpbHM6OkdldEJvcmRlckFwcFN0cmVhbShyY1dpbmRvdywgZkJvcmRlcldpZHRoLCBjckJvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckxlZnRUb3AsIGNyUmlnaHRCb3R0b20sIG5Cb3JkZXJTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc0JvcmRlcikgKworICAgICAgQ1BXTF9VdGlsczo6R2V0UHVzaEJ1dHRvbkFwcFN0cmVhbSgKKyAgICAgICAgICBpY29uRml0LkdldEZpdHRpbmdCb3VuZHMoKSA/IHJjV2luZG93IDogcmNDbGllbnQsICZmb250X21hcCwKKyAgICAgICAgICBwTm9ybWFsSWNvbiwgaWNvbkZpdCwgY3NOb3JtYWxDYXB0aW9uLCBjclRleHQsIGZGb250U2l6ZSwgbkxheW91dCk7CisKKyAgV3JpdGVBcHBlYXJhbmNlKCJOIiwgR2V0Um90YXRlZFJlY3QoKSwgR2V0TWF0cml4KCksIGNzQVApOworICBpZiAocE5vcm1hbEljb24pCisgICAgQWRkSW1hZ2VUb0FwcGVhcmFuY2UoIk4iLCBwTm9ybWFsSWNvbik7CisKKyAgQ1BERl9Gb3JtQ29udHJvbDo6SGlnaGxpZ2h0aW5nTW9kZSBlSExNID0gcENvbnRyb2wtPkdldEhpZ2hsaWdodGluZ01vZGUoKTsKKyAgaWYgKGVITE0gPT0gQ1BERl9Gb3JtQ29udHJvbDo6UHVzaCB8fCBlSExNID09IENQREZfRm9ybUNvbnRyb2w6OlRvZ2dsZSkgeworICAgIGlmIChjc1JvbGxvdmVyQ2FwdGlvbi5Jc0VtcHR5KCkgJiYgIXBSb2xsb3Zlckljb24pIHsKKyAgICAgIGNzUm9sbG92ZXJDYXB0aW9uID0gY3NOb3JtYWxDYXB0aW9uOworICAgICAgcFJvbGxvdmVySWNvbiA9IHBOb3JtYWxJY29uOworICAgIH0KKworICAgIGZvbnRfbWFwLlNldEFQVHlwZSgiUiIpOworCisgICAgY3NBUCA9IENQV0xfVXRpbHM6OkdldFJlY3RGaWxsQXBwU3RyZWFtKHJjV2luZG93LCBjckJhY2tncm91bmQpICsKKyAgICAgICAgICAgQ1BXTF9VdGlsczo6R2V0Qm9yZGVyQXBwU3RyZWFtKHJjV2luZG93LCBmQm9yZGVyV2lkdGgsIGNyQm9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JMZWZ0VG9wLCBjclJpZ2h0Qm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkJvcmRlclN0eWxlLCBkc0JvcmRlcikgKworICAgICAgICAgICBDUFdMX1V0aWxzOjpHZXRQdXNoQnV0dG9uQXBwU3RyZWFtKAorICAgICAgICAgICAgICAgaWNvbkZpdC5HZXRGaXR0aW5nQm91bmRzKCkgPyByY1dpbmRvdyA6IHJjQ2xpZW50LCAmZm9udF9tYXAsCisgICAgICAgICAgICAgICBwUm9sbG92ZXJJY29uLCBpY29uRml0LCBjc1JvbGxvdmVyQ2FwdGlvbiwgY3JUZXh0LCBmRm9udFNpemUsCisgICAgICAgICAgICAgICBuTGF5b3V0KTsKKworICAgIFdyaXRlQXBwZWFyYW5jZSgiUiIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBjc0FQKTsKKyAgICBpZiAocFJvbGxvdmVySWNvbikKKyAgICAgIEFkZEltYWdlVG9BcHBlYXJhbmNlKCJSIiwgcFJvbGxvdmVySWNvbik7CisKKyAgICBpZiAoY3NEb3duQ2FwdGlvbi5Jc0VtcHR5KCkgJiYgIXBEb3duSWNvbikgeworICAgICAgY3NEb3duQ2FwdGlvbiA9IGNzTm9ybWFsQ2FwdGlvbjsKKyAgICAgIHBEb3duSWNvbiA9IHBOb3JtYWxJY29uOworICAgIH0KKworICAgIHN3aXRjaCAobkJvcmRlclN0eWxlKSB7CisgICAgICBjYXNlIFBCU19CRVZFTEVEOiB7CisgICAgICAgIENQV0xfQ29sb3IgY3JUZW1wID0gY3JMZWZ0VG9wOworICAgICAgICBjckxlZnRUb3AgPSBjclJpZ2h0Qm90dG9tOworICAgICAgICBjclJpZ2h0Qm90dG9tID0gY3JUZW1wOworICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgUEJTX0lOU0VUOgorICAgICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwKTsKKyAgICAgICAgY3JSaWdodEJvdHRvbSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDEpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBmb250X21hcC5TZXRBUFR5cGUoIkQiKTsKKworICAgIGNzQVAgPSBDUFdMX1V0aWxzOjpHZXRSZWN0RmlsbEFwcFN0cmVhbSgKKyAgICAgICAgICAgICAgIHJjV2luZG93LCBDUFdMX1V0aWxzOjpTdWJzdHJhY3RDb2xvcihjckJhY2tncm91bmQsIDAuMjVmKSkgKworICAgICAgICAgICBDUFdMX1V0aWxzOjpHZXRCb3JkZXJBcHBTdHJlYW0ocmNXaW5kb3csIGZCb3JkZXJXaWR0aCwgY3JCb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckxlZnRUb3AsIGNyUmlnaHRCb3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQm9yZGVyU3R5bGUsIGRzQm9yZGVyKSArCisgICAgICAgICAgIENQV0xfVXRpbHM6OkdldFB1c2hCdXR0b25BcHBTdHJlYW0oCisgICAgICAgICAgICAgICBpY29uRml0LkdldEZpdHRpbmdCb3VuZHMoKSA/IHJjV2luZG93IDogcmNDbGllbnQsICZmb250X21hcCwKKyAgICAgICAgICAgICAgIHBEb3duSWNvbiwgaWNvbkZpdCwgY3NEb3duQ2FwdGlvbiwgY3JUZXh0LCBmRm9udFNpemUsIG5MYXlvdXQpOworCisgICAgV3JpdGVBcHBlYXJhbmNlKCJEIiwgR2V0Um90YXRlZFJlY3QoKSwgR2V0TWF0cml4KCksIGNzQVApOworICAgIGlmIChwRG93bkljb24pCisgICAgICBBZGRJbWFnZVRvQXBwZWFyYW5jZSgiRCIsIHBEb3duSWNvbik7CisgIH0gZWxzZSB7CisgICAgUmVtb3ZlQXBwZWFyYW5jZSgiRCIpOworICAgIFJlbW92ZUFwcGVhcmFuY2UoIlIiKTsKKyAgfQorfQorCit2b2lkIENQREZTREtfV2lkZ2V0OjpSZXNldEFwcGVhcmFuY2VfQ2hlY2tCb3goKSB7CisgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gR2V0Rm9ybUNvbnRyb2woKTsKKyAgQ1BXTF9Db2xvciBjckJhY2tncm91bmQsIGNyQm9yZGVyLCBjclRleHQ7CisgIGludCBpQ29sb3JUeXBlOworICBGWF9GTE9BVCBmY1s0XTsKKworICBwQ29udHJvbC0+R2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoaUNvbG9yVHlwZSwgZmMpOworICBpZiAoaUNvbG9yVHlwZSA+IDApCisgICAgY3JCYWNrZ3JvdW5kID0gQ1BXTF9Db2xvcihpQ29sb3JUeXBlLCBmY1swXSwgZmNbMV0sIGZjWzJdLCBmY1szXSk7CisKKyAgcENvbnRyb2wtPkdldE9yaWdpbmFsQm9yZGVyQ29sb3IoaUNvbG9yVHlwZSwgZmMpOworICBpZiAoaUNvbG9yVHlwZSA+IDApCisgICAgY3JCb3JkZXIgPSBDUFdMX0NvbG9yKGlDb2xvclR5cGUsIGZjWzBdLCBmY1sxXSwgZmNbMl0sIGZjWzNdKTsKKworICBGWF9GTE9BVCBmQm9yZGVyV2lkdGggPSAoRlhfRkxPQVQpR2V0Qm9yZGVyV2lkdGgoKTsKKyAgaW50MzJfdCBuQm9yZGVyU3R5bGUgPSAwOworICBDUFdMX0Rhc2ggZHNCb3JkZXIoMywgMCwgMCk7CisgIENQV0xfQ29sb3IgY3JMZWZ0VG9wLCBjclJpZ2h0Qm90dG9tOworCisgIHN3aXRjaCAoR2V0Qm9yZGVyU3R5bGUoKSkgeworICAgIGNhc2UgQkJTX0RBU0g6CisgICAgICBuQm9yZGVyU3R5bGUgPSBQQlNfREFTSDsKKyAgICAgIGRzQm9yZGVyID0gQ1BXTF9EYXNoKDMsIDMsIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCQlNfQkVWRUxFRDoKKyAgICAgIG5Cb3JkZXJTdHlsZSA9IFBCU19CRVZFTEVEOworICAgICAgZkJvcmRlcldpZHRoICo9IDI7CisgICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAxKTsKKyAgICAgIGNyUmlnaHRCb3R0b20gPSBDUFdMX1V0aWxzOjpEZXZpZGVDb2xvcihjckJhY2tncm91bmQsIDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCQlNfSU5TRVQ6CisgICAgICBuQm9yZGVyU3R5bGUgPSBQQlNfSU5TRVQ7CisgICAgICBmQm9yZGVyV2lkdGggKj0gMjsKKyAgICAgIGNyTGVmdFRvcCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDAuNSk7CisgICAgICBjclJpZ2h0Qm90dG9tID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMC43NSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJCU19VTkRFUkxJTkU6CisgICAgICBuQm9yZGVyU3R5bGUgPSBQQlNfVU5ERVJMSU5FRDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBuQm9yZGVyU3R5bGUgPSBQQlNfU09MSUQ7CisgICAgICBicmVhazsKKyAgfQorCisgIENQREZfUmVjdCByY1dpbmRvdyA9IEdldFJvdGF0ZWRSZWN0KCk7CisgIENQREZfUmVjdCByY0NsaWVudCA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJjV2luZG93LCBmQm9yZGVyV2lkdGgpOworCisgIENQREZfRGVmYXVsdEFwcGVhcmFuY2UgZGEgPSBwQ29udHJvbC0+R2V0RGVmYXVsdEFwcGVhcmFuY2UoKTsKKyAgaWYgKGRhLkhhc0NvbG9yKCkpIHsKKyAgICBkYS5HZXRDb2xvcihpQ29sb3JUeXBlLCBmYyk7CisgICAgY3JUZXh0ID0gQ1BXTF9Db2xvcihpQ29sb3JUeXBlLCBmY1swXSwgZmNbMV0sIGZjWzJdLCBmY1szXSk7CisgIH0KKworICBpbnQzMl90IG5TdHlsZSA9IDA7CisKKyAgQ0ZYX1dpZGVTdHJpbmcgY3NXQ2FwdGlvbiA9IHBDb250cm9sLT5HZXROb3JtYWxDYXB0aW9uKCk7CisgIGlmIChjc1dDYXB0aW9uLkdldExlbmd0aCgpID4gMCkgeworICAgIHN3aXRjaCAoY3NXQ2FwdGlvblswXSkgeworICAgICAgY2FzZSBMJ2wnOgorICAgICAgICBuU3R5bGUgPSBQQ1NfQ0lSQ0xFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTCc4JzoKKyAgICAgICAgblN0eWxlID0gUENTX0NST1NTOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTCd1JzoKKyAgICAgICAgblN0eWxlID0gUENTX0RJQU1PTkQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBMJ24nOgorICAgICAgICBuU3R5bGUgPSBQQ1NfU1FVQVJFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTCdIJzoKKyAgICAgICAgblN0eWxlID0gUENTX1NUQVI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDogIC8vIEwnNCcKKyAgICAgICAgblN0eWxlID0gUENTX0NIRUNLOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgblN0eWxlID0gUENTX0NIRUNLOworICB9CisKKyAgQ0ZYX0J5dGVTdHJpbmcgY3NBUF9OX09OID0KKyAgICAgIENQV0xfVXRpbHM6OkdldFJlY3RGaWxsQXBwU3RyZWFtKHJjV2luZG93LCBjckJhY2tncm91bmQpICsKKyAgICAgIENQV0xfVXRpbHM6OkdldEJvcmRlckFwcFN0cmVhbShyY1dpbmRvdywgZkJvcmRlcldpZHRoLCBjckJvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckxlZnRUb3AsIGNyUmlnaHRCb3R0b20sIG5Cb3JkZXJTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc0JvcmRlcik7CisKKyAgQ0ZYX0J5dGVTdHJpbmcgY3NBUF9OX09GRiA9IGNzQVBfTl9PTjsKKworICBzd2l0Y2ggKG5Cb3JkZXJTdHlsZSkgeworICAgIGNhc2UgUEJTX0JFVkVMRUQ6IHsKKyAgICAgIENQV0xfQ29sb3IgY3JUZW1wID0gY3JMZWZ0VG9wOworICAgICAgY3JMZWZ0VG9wID0gY3JSaWdodEJvdHRvbTsKKyAgICAgIGNyUmlnaHRCb3R0b20gPSBjclRlbXA7CisgICAgfSBicmVhazsKKyAgICBjYXNlIFBCU19JTlNFVDoKKyAgICAgIGNyTGVmdFRvcCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDApOworICAgICAgY3JSaWdodEJvdHRvbSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDEpOworICAgICAgYnJlYWs7CisgIH0KKworICBDRlhfQnl0ZVN0cmluZyBjc0FQX0RfT04gPQorICAgICAgQ1BXTF9VdGlsczo6R2V0UmVjdEZpbGxBcHBTdHJlYW0oCisgICAgICAgICAgcmNXaW5kb3csIENQV0xfVXRpbHM6OlN1YnN0cmFjdENvbG9yKGNyQmFja2dyb3VuZCwgMC4yNWYpKSArCisgICAgICBDUFdMX1V0aWxzOjpHZXRCb3JkZXJBcHBTdHJlYW0ocmNXaW5kb3csIGZCb3JkZXJXaWR0aCwgY3JCb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JMZWZ0VG9wLCBjclJpZ2h0Qm90dG9tLCBuQm9yZGVyU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNCb3JkZXIpOworCisgIENGWF9CeXRlU3RyaW5nIGNzQVBfRF9PRkYgPSBjc0FQX0RfT047CisKKyAgY3NBUF9OX09OICs9IENQV0xfVXRpbHM6OkdldENoZWNrQm94QXBwU3RyZWFtKHJjQ2xpZW50LCBuU3R5bGUsIGNyVGV4dCk7CisgIGNzQVBfRF9PTiArPSBDUFdMX1V0aWxzOjpHZXRDaGVja0JveEFwcFN0cmVhbShyY0NsaWVudCwgblN0eWxlLCBjclRleHQpOworCisgIFdyaXRlQXBwZWFyYW5jZSgiTiIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBjc0FQX05fT04sCisgICAgICAgICAgICAgICAgICBwQ29udHJvbC0+R2V0Q2hlY2tlZEFQU3RhdGUoKSk7CisgIFdyaXRlQXBwZWFyYW5jZSgiTiIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBjc0FQX05fT0ZGLCAiT2ZmIik7CisKKyAgV3JpdGVBcHBlYXJhbmNlKCJEIiwgR2V0Um90YXRlZFJlY3QoKSwgR2V0TWF0cml4KCksIGNzQVBfRF9PTiwKKyAgICAgICAgICAgICAgICAgIHBDb250cm9sLT5HZXRDaGVja2VkQVBTdGF0ZSgpKTsKKyAgV3JpdGVBcHBlYXJhbmNlKCJEIiwgR2V0Um90YXRlZFJlY3QoKSwgR2V0TWF0cml4KCksIGNzQVBfRF9PRkYsICJPZmYiKTsKKworICBDRlhfQnl0ZVN0cmluZyBjc0FTID0gR2V0QXBwU3RhdGUoKTsKKyAgaWYgKGNzQVMuSXNFbXB0eSgpKQorICAgIFNldEFwcFN0YXRlKCJPZmYiKTsKK30KKwordm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRBcHBlYXJhbmNlX1JhZGlvQnV0dG9uKCkgeworICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldEZvcm1Db250cm9sKCk7CisgIENQV0xfQ29sb3IgY3JCYWNrZ3JvdW5kLCBjckJvcmRlciwgY3JUZXh0OworICBpbnQgaUNvbG9yVHlwZTsKKyAgRlhfRkxPQVQgZmNbNF07CisKKyAgcENvbnRyb2wtPkdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKGlDb2xvclR5cGUsIGZjKTsKKyAgaWYgKGlDb2xvclR5cGUgPiAwKQorICAgIGNyQmFja2dyb3VuZCA9IENQV0xfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOworCisgIHBDb250cm9sLT5HZXRPcmlnaW5hbEJvcmRlckNvbG9yKGlDb2xvclR5cGUsIGZjKTsKKyAgaWYgKGlDb2xvclR5cGUgPiAwKQorICAgIGNyQm9yZGVyID0gQ1BXTF9Db2xvcihpQ29sb3JUeXBlLCBmY1swXSwgZmNbMV0sIGZjWzJdLCBmY1szXSk7CisKKyAgRlhfRkxPQVQgZkJvcmRlcldpZHRoID0gKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCk7CisgIGludDMyX3QgbkJvcmRlclN0eWxlID0gMDsKKyAgQ1BXTF9EYXNoIGRzQm9yZGVyKDMsIDAsIDApOworICBDUFdMX0NvbG9yIGNyTGVmdFRvcCwgY3JSaWdodEJvdHRvbTsKKworICBzd2l0Y2ggKEdldEJvcmRlclN0eWxlKCkpIHsKKyAgICBjYXNlIEJCU19EQVNIOgorICAgICAgbkJvcmRlclN0eWxlID0gUEJTX0RBU0g7CisgICAgICBkc0JvcmRlciA9IENQV0xfRGFzaCgzLCAzLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQkJTX0JFVkVMRUQ6CisgICAgICBuQm9yZGVyU3R5bGUgPSBQQlNfQkVWRUxFRDsKKyAgICAgIGZCb3JkZXJXaWR0aCAqPSAyOworICAgICAgY3JMZWZ0VG9wID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMSk7CisgICAgICBjclJpZ2h0Qm90dG9tID0gQ1BXTF9VdGlsczo6RGV2aWRlQ29sb3IoY3JCYWNrZ3JvdW5kLCAyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQkJTX0lOU0VUOgorICAgICAgbkJvcmRlclN0eWxlID0gUEJTX0lOU0VUOworICAgICAgZkJvcmRlcldpZHRoICo9IDI7CisgICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwLjUpOworICAgICAgY3JSaWdodEJvdHRvbSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDAuNzUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCQlNfVU5ERVJMSU5FOgorICAgICAgbkJvcmRlclN0eWxlID0gUEJTX1VOREVSTElORUQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbkJvcmRlclN0eWxlID0gUEJTX1NPTElEOworICAgICAgYnJlYWs7CisgIH0KKworICBDUERGX1JlY3QgcmNXaW5kb3cgPSBHZXRSb3RhdGVkUmVjdCgpOworICBDUERGX1JlY3QgcmNDbGllbnQgPSBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyY1dpbmRvdywgZkJvcmRlcldpZHRoKTsKKworICBDUERGX0RlZmF1bHRBcHBlYXJhbmNlIGRhID0gcENvbnRyb2wtPkdldERlZmF1bHRBcHBlYXJhbmNlKCk7CisgIGlmIChkYS5IYXNDb2xvcigpKSB7CisgICAgZGEuR2V0Q29sb3IoaUNvbG9yVHlwZSwgZmMpOworICAgIGNyVGV4dCA9IENQV0xfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOworICB9CisKKyAgaW50MzJfdCBuU3R5bGUgPSAwOworCisgIENGWF9XaWRlU3RyaW5nIGNzV0NhcHRpb24gPSBwQ29udHJvbC0+R2V0Tm9ybWFsQ2FwdGlvbigpOworICBpZiAoY3NXQ2FwdGlvbi5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICBzd2l0Y2ggKGNzV0NhcHRpb25bMF0pIHsKKyAgICAgIGRlZmF1bHQ6ICAvLyBMJ2wnOgorICAgICAgICBuU3R5bGUgPSBQQ1NfQ0lSQ0xFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTCc4JzoKKyAgICAgICAgblN0eWxlID0gUENTX0NST1NTOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTCd1JzoKKyAgICAgICAgblN0eWxlID0gUENTX0RJQU1PTkQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBMJ24nOgorICAgICAgICBuU3R5bGUgPSBQQ1NfU1FVQVJFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTCdIJzoKKyAgICAgICAgblN0eWxlID0gUENTX1NUQVI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBMJzQnOgorICAgICAgICBuU3R5bGUgPSBQQ1NfQ0hFQ0s7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBuU3R5bGUgPSBQQ1NfQ0lSQ0xFOworICB9CisKKyAgQ0ZYX0J5dGVTdHJpbmcgY3NBUF9OX09OOworCisgIENQREZfUmVjdCByY0NlbnRlciA9CisgICAgICBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChDUFdMX1V0aWxzOjpHZXRDZW50ZXJTcXVhcmUocmNXaW5kb3cpLCAxLjBmKTsKKworICBpZiAoblN0eWxlID09IFBDU19DSVJDTEUpIHsKKyAgICBpZiAobkJvcmRlclN0eWxlID09IFBCU19CRVZFTEVEKSB7CisgICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAxKTsKKyAgICAgIGNyUmlnaHRCb3R0b20gPSBDUFdMX1V0aWxzOjpTdWJzdHJhY3RDb2xvcihjckJhY2tncm91bmQsIDAuMjVmKTsKKyAgICB9IGVsc2UgaWYgKG5Cb3JkZXJTdHlsZSA9PSBQQlNfSU5TRVQpIHsKKyAgICAgIGNyTGVmdFRvcCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDAuNWYpOworICAgICAgY3JSaWdodEJvdHRvbSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDAuNzVmKTsKKyAgICB9CisKKyAgICBjc0FQX05fT04gPSBDUFdMX1V0aWxzOjpHZXRDaXJjbGVGaWxsQXBwU3RyZWFtKHJjQ2VudGVyLCBjckJhY2tncm91bmQpICsKKyAgICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpHZXRDaXJjbGVCb3JkZXJBcHBTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIHJjQ2VudGVyLCBmQm9yZGVyV2lkdGgsIGNyQm9yZGVyLCBjckxlZnRUb3AsIGNyUmlnaHRCb3R0b20sCisgICAgICAgICAgICAgICAgICAgIG5Cb3JkZXJTdHlsZSwgZHNCb3JkZXIpOworICB9IGVsc2UgeworICAgIGNzQVBfTl9PTiA9IENQV0xfVXRpbHM6OkdldFJlY3RGaWxsQXBwU3RyZWFtKHJjV2luZG93LCBjckJhY2tncm91bmQpICsKKyAgICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpHZXRCb3JkZXJBcHBTdHJlYW0ocmNXaW5kb3csIGZCb3JkZXJXaWR0aCwgY3JCb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyTGVmdFRvcCwgY3JSaWdodEJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkJvcmRlclN0eWxlLCBkc0JvcmRlcik7CisgIH0KKworICBDRlhfQnl0ZVN0cmluZyBjc0FQX05fT0ZGID0gY3NBUF9OX09OOworCisgIHN3aXRjaCAobkJvcmRlclN0eWxlKSB7CisgICAgY2FzZSBQQlNfQkVWRUxFRDogeworICAgICAgQ1BXTF9Db2xvciBjclRlbXAgPSBjckxlZnRUb3A7CisgICAgICBjckxlZnRUb3AgPSBjclJpZ2h0Qm90dG9tOworICAgICAgY3JSaWdodEJvdHRvbSA9IGNyVGVtcDsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgUEJTX0lOU0VUOgorICAgICAgY3JMZWZ0VG9wID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMCk7CisgICAgICBjclJpZ2h0Qm90dG9tID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMSk7CisgICAgICBicmVhazsKKyAgfQorCisgIENGWF9CeXRlU3RyaW5nIGNzQVBfRF9PTjsKKworICBpZiAoblN0eWxlID09IFBDU19DSVJDTEUpIHsKKyAgICBDUFdMX0NvbG9yIGNyQksgPSBDUFdMX1V0aWxzOjpTdWJzdHJhY3RDb2xvcihjckJhY2tncm91bmQsIDAuMjVmKTsKKyAgICBpZiAobkJvcmRlclN0eWxlID09IFBCU19CRVZFTEVEKSB7CisgICAgICBjckxlZnRUb3AgPSBDUFdMX1V0aWxzOjpTdWJzdHJhY3RDb2xvcihjckJhY2tncm91bmQsIDAuMjVmKTsKKyAgICAgIGNyUmlnaHRCb3R0b20gPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAxKTsKKyAgICAgIGNyQksgPSBjckJhY2tncm91bmQ7CisgICAgfSBlbHNlIGlmIChuQm9yZGVyU3R5bGUgPT0gUEJTX0lOU0VUKSB7CisgICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwKTsKKyAgICAgIGNyUmlnaHRCb3R0b20gPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAxKTsKKyAgICB9CisKKyAgICBjc0FQX0RfT04gPSBDUFdMX1V0aWxzOjpHZXRDaXJjbGVGaWxsQXBwU3RyZWFtKHJjQ2VudGVyLCBjckJLKSArCisgICAgICAgICAgICAgICAgQ1BXTF9VdGlsczo6R2V0Q2lyY2xlQm9yZGVyQXBwU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICByY0NlbnRlciwgZkJvcmRlcldpZHRoLCBjckJvcmRlciwgY3JMZWZ0VG9wLCBjclJpZ2h0Qm90dG9tLAorICAgICAgICAgICAgICAgICAgICBuQm9yZGVyU3R5bGUsIGRzQm9yZGVyKTsKKyAgfSBlbHNlIHsKKyAgICBjc0FQX0RfT04gPSBDUFdMX1V0aWxzOjpHZXRSZWN0RmlsbEFwcFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgcmNXaW5kb3csIENQV0xfVXRpbHM6OlN1YnN0cmFjdENvbG9yKGNyQmFja2dyb3VuZCwgMC4yNWYpKSArCisgICAgICAgICAgICAgICAgQ1BXTF9VdGlsczo6R2V0Qm9yZGVyQXBwU3RyZWFtKHJjV2luZG93LCBmQm9yZGVyV2lkdGgsIGNyQm9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckxlZnRUb3AsIGNyUmlnaHRCb3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Cb3JkZXJTdHlsZSwgZHNCb3JkZXIpOworICB9CisKKyAgQ0ZYX0J5dGVTdHJpbmcgY3NBUF9EX09GRiA9IGNzQVBfRF9PTjsKKworICBjc0FQX05fT04gKz0gQ1BXTF9VdGlsczo6R2V0UmFkaW9CdXR0b25BcHBTdHJlYW0ocmNDbGllbnQsIG5TdHlsZSwgY3JUZXh0KTsKKyAgY3NBUF9EX09OICs9IENQV0xfVXRpbHM6OkdldFJhZGlvQnV0dG9uQXBwU3RyZWFtKHJjQ2xpZW50LCBuU3R5bGUsIGNyVGV4dCk7CisKKyAgV3JpdGVBcHBlYXJhbmNlKCJOIiwgR2V0Um90YXRlZFJlY3QoKSwgR2V0TWF0cml4KCksIGNzQVBfTl9PTiwKKyAgICAgICAgICAgICAgICAgIHBDb250cm9sLT5HZXRDaGVja2VkQVBTdGF0ZSgpKTsKKyAgV3JpdGVBcHBlYXJhbmNlKCJOIiwgR2V0Um90YXRlZFJlY3QoKSwgR2V0TWF0cml4KCksIGNzQVBfTl9PRkYsICJPZmYiKTsKKworICBXcml0ZUFwcGVhcmFuY2UoIkQiLCBHZXRSb3RhdGVkUmVjdCgpLCBHZXRNYXRyaXgoKSwgY3NBUF9EX09OLAorICAgICAgICAgICAgICAgICAgcENvbnRyb2wtPkdldENoZWNrZWRBUFN0YXRlKCkpOworICBXcml0ZUFwcGVhcmFuY2UoIkQiLCBHZXRSb3RhdGVkUmVjdCgpLCBHZXRNYXRyaXgoKSwgY3NBUF9EX09GRiwgIk9mZiIpOworCisgIENGWF9CeXRlU3RyaW5nIGNzQVMgPSBHZXRBcHBTdGF0ZSgpOworICBpZiAoY3NBUy5Jc0VtcHR5KCkpCisgICAgU2V0QXBwU3RhdGUoIk9mZiIpOworfQorCit2b2lkIENQREZTREtfV2lkZ2V0OjpSZXNldEFwcGVhcmFuY2VfQ29tYm9Cb3goY29uc3QgRlhfV0NIQVIqIHNWYWx1ZSkgeworICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldEZvcm1Db250cm9sKCk7CisgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBwQ29udHJvbC0+R2V0RmllbGQoKTsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNCb2R5LCBzTGluZXM7CisKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworICBDUERGX1JlY3QgcmNCdXR0b24gPSByY0NsaWVudDsKKyAgcmNCdXR0b24ubGVmdCA9IHJjQnV0dG9uLnJpZ2h0IC0gMTM7CisgIHJjQnV0dG9uLk5vcm1hbGl6ZSgpOworCisgIGlmIChJRlhfRWRpdCogcEVkaXQgPSBJRlhfRWRpdDo6TmV3RWRpdCgpKSB7CisgICAgcEVkaXQtPkVuYWJsZVJlZnJlc2goRkFMU0UpOworCisgICAgQ1BERlNES19Eb2N1bWVudCogcERvYyA9IG1fcEludGVyRm9ybS0+R2V0RG9jdW1lbnQoKTsKKyAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gcERvYy0+R2V0RW52KCk7CisgICAgQ0JBX0ZvbnRNYXAgZm9udF9tYXAodGhpcywgcEVudi0+R2V0U3lzSGFuZGxlcigpKTsKKyAgICBwRWRpdC0+U2V0Rm9udE1hcCgmZm9udF9tYXApOworCisgICAgQ1BERl9SZWN0IHJjRWRpdCA9IHJjQ2xpZW50OworICAgIHJjRWRpdC5yaWdodCA9IHJjQnV0dG9uLmxlZnQ7CisgICAgcmNFZGl0Lk5vcm1hbGl6ZSgpOworCisgICAgcEVkaXQtPlNldFBsYXRlUmVjdChyY0VkaXQpOworICAgIHBFZGl0LT5TZXRBbGlnbm1lbnRWKDEpOworCisgICAgRlhfRkxPQVQgZkZvbnRTaXplID0gR2V0Rm9udFNpemUoKTsKKyAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkKKyAgICAgIHBFZGl0LT5TZXRBdXRvRm9udFNpemUoVFJVRSk7CisgICAgZWxzZQorICAgICAgcEVkaXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7CisKKyAgICBwRWRpdC0+SW5pdGlhbGl6ZSgpOworCisgICAgaWYgKHNWYWx1ZSkgeworICAgICAgcEVkaXQtPlNldFRleHQoc1ZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgaW50MzJfdCBuQ3VyU2VsID0gcEZpZWxkLT5HZXRTZWxlY3RlZEluZGV4KDApOworCisgICAgICBpZiAobkN1clNlbCA8IDApCisgICAgICAgIHBFZGl0LT5TZXRUZXh0KHBGaWVsZC0+R2V0VmFsdWUoKS5jX3N0cigpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcEVkaXQtPlNldFRleHQocEZpZWxkLT5HZXRPcHRpb25MYWJlbChuQ3VyU2VsKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBDUERGX1JlY3QgcmNDb250ZW50ID0gcEVkaXQtPkdldENvbnRlbnRSZWN0KCk7CisKKyAgICBDRlhfQnl0ZVN0cmluZyBzRWRpdCA9CisgICAgICAgIENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0ocEVkaXQsIENQREZfUG9pbnQoMC4wZiwgMC4wZikpOworICAgIGlmIChzRWRpdC5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgIHNCb2R5IDw8ICIvVHggQk1DXG4iCisgICAgICAgICAgICA8PCAicVxuIjsKKyAgICAgIGlmIChyY0NvbnRlbnQuV2lkdGgoKSA+IHJjRWRpdC5XaWR0aCgpIHx8CisgICAgICAgICAgcmNDb250ZW50LkhlaWdodCgpID4gcmNFZGl0LkhlaWdodCgpKSB7CisgICAgICAgIHNCb2R5IDw8IHJjRWRpdC5sZWZ0IDw8ICIgIiA8PCByY0VkaXQuYm90dG9tIDw8ICIgIiA8PCByY0VkaXQuV2lkdGgoKQorICAgICAgICAgICAgICA8PCAiICIgPDwgcmNFZGl0LkhlaWdodCgpIDw8ICIgcmVcbldcbm5cbiI7CisgICAgICB9CisKKyAgICAgIENQV0xfQ29sb3IgY3JUZXh0ID0gR2V0VGV4dFBXTENvbG9yKCk7CisgICAgICBzQm9keSA8PCAiQlRcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0KSA8PCBzRWRpdAorICAgICAgICAgICAgPDwgIkVUXG4iCisgICAgICAgICAgICA8PCAiUVxuRU1DXG4iOworICAgIH0KKworICAgIElGWF9FZGl0OjpEZWxFZGl0KHBFZGl0KTsKKyAgfQorCisgIHNCb2R5IDw8IENQV0xfVXRpbHM6OkdldERyb3BCdXR0b25BcHBTdHJlYW0ocmNCdXR0b24pOworCisgIENGWF9CeXRlU3RyaW5nIHNBUCA9IEdldEJhY2tncm91bmRBcHBTdHJlYW0oKSArIEdldEJvcmRlckFwcFN0cmVhbSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgc0xpbmVzLkdldEJ5dGVTdHJpbmcoKSArIHNCb2R5LkdldEJ5dGVTdHJpbmcoKTsKKworICBXcml0ZUFwcGVhcmFuY2UoIk4iLCBHZXRSb3RhdGVkUmVjdCgpLCBHZXRNYXRyaXgoKSwgc0FQKTsKK30KKwordm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRBcHBlYXJhbmNlX0xpc3RCb3goKSB7CisgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gR2V0Rm9ybUNvbnRyb2woKTsKKyAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IHBDb250cm9sLT5HZXRGaWVsZCgpOworICBDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CisgIENGWF9CeXRlVGV4dEJ1ZiBzQm9keSwgc0xpbmVzOworCisgIGlmIChJRlhfRWRpdCogcEVkaXQgPSBJRlhfRWRpdDo6TmV3RWRpdCgpKSB7CisgICAgcEVkaXQtPkVuYWJsZVJlZnJlc2goRkFMU0UpOworCisgICAgQ1BERlNES19Eb2N1bWVudCogcERvYyA9IG1fcEludGVyRm9ybS0+R2V0RG9jdW1lbnQoKTsKKyAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gcERvYy0+R2V0RW52KCk7CisKKyAgICBDQkFfRm9udE1hcCBmb250X21hcCh0aGlzLCBwRW52LT5HZXRTeXNIYW5kbGVyKCkpOworICAgIHBFZGl0LT5TZXRGb250TWFwKCZmb250X21hcCk7CisKKyAgICBwRWRpdC0+U2V0UGxhdGVSZWN0KENQREZfUmVjdChyY0NsaWVudC5sZWZ0LCAwLjBmLCByY0NsaWVudC5yaWdodCwgMC4wZikpOworCisgICAgRlhfRkxPQVQgZkZvbnRTaXplID0gR2V0Rm9udFNpemUoKTsKKworICAgIGlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKQorICAgICAgcEVkaXQtPlNldEZvbnRTaXplKDEyLjBmKTsKKyAgICBlbHNlCisgICAgICBwRWRpdC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKKworICAgIHBFZGl0LT5Jbml0aWFsaXplKCk7CisKKyAgICBDRlhfQnl0ZVRleHRCdWYgc0xpc3Q7CisgICAgRlhfRkxPQVQgZnkgPSByY0NsaWVudC50b3A7CisKKyAgICBpbnQzMl90IG5Ub3AgPSBwRmllbGQtPkdldFRvcFZpc2libGVJbmRleCgpOworICAgIGludDMyX3QgbkNvdW50ID0gcEZpZWxkLT5Db3VudE9wdGlvbnMoKTsKKyAgICBpbnQzMl90IG5TZWxDb3VudCA9IHBGaWVsZC0+Q291bnRTZWxlY3RlZEl0ZW1zKCk7CisKKyAgICBmb3IgKGludDMyX3QgaSA9IG5Ub3A7IGkgPCBuQ291bnQ7IGkrKykgeworICAgICAgRlhfQk9PTCBiU2VsZWN0ZWQgPSBGQUxTRTsKKyAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IG5TZWxDb3VudDsgaisrKSB7CisgICAgICAgIGlmIChwRmllbGQtPkdldFNlbGVjdGVkSW5kZXgoaikgPT0gaSkgeworICAgICAgICAgIGJTZWxlY3RlZCA9IFRSVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcEVkaXQtPlNldFRleHQocEZpZWxkLT5HZXRPcHRpb25MYWJlbChpKS5jX3N0cigpKTsKKworICAgICAgQ1BERl9SZWN0IHJjQ29udGVudCA9IHBFZGl0LT5HZXRDb250ZW50UmVjdCgpOworICAgICAgRlhfRkxPQVQgZkl0ZW1IZWlnaHQgPSByY0NvbnRlbnQuSGVpZ2h0KCk7CisKKyAgICAgIGlmIChiU2VsZWN0ZWQpIHsKKyAgICAgICAgQ1BERl9SZWN0IHJjSXRlbSA9CisgICAgICAgICAgICBDUERGX1JlY3QocmNDbGllbnQubGVmdCwgZnkgLSBmSXRlbUhlaWdodCwgcmNDbGllbnQucmlnaHQsIGZ5KTsKKyAgICAgICAgc0xpc3QgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsIDAsIDUxLjBmIC8gMjU1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTMuMGYgLyAyNTUuMGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSkKKyAgICAgICAgICAgICAgPDwgcmNJdGVtLmxlZnQgPDwgIiAiIDw8IHJjSXRlbS5ib3R0b20gPDwgIiAiIDw8IHJjSXRlbS5XaWR0aCgpCisgICAgICAgICAgICAgIDw8ICIgIiA8PCByY0l0ZW0uSGVpZ2h0KCkgPDwgIiByZSBmXG4iCisgICAgICAgICAgICAgIDw8ICJRXG4iOworCisgICAgICAgIHNMaXN0IDw8ICJCVFxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAxKSwgVFJVRSkKKyAgICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0RWRpdEFwcFN0cmVhbShwRWRpdCwgQ1BERl9Qb2ludCgwLjBmLCBmeSkpCisgICAgICAgICAgICAgIDw8ICJFVFxuIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENQV0xfQ29sb3IgY3JUZXh0ID0gR2V0VGV4dFBXTENvbG9yKCk7CisgICAgICAgIHNMaXN0IDw8ICJCVFxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQsIFRSVUUpCisgICAgICAgICAgICAgIDw8IENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0ocEVkaXQsIENQREZfUG9pbnQoMC4wZiwgZnkpKQorICAgICAgICAgICAgICA8PCAiRVRcbiI7CisgICAgICB9CisKKyAgICAgIGZ5IC09IGZJdGVtSGVpZ2h0OworICAgIH0KKworICAgIGlmIChzTGlzdC5HZXRTaXplKCkgPiAwKSB7CisgICAgICBzQm9keSA8PCAiL1R4IEJNQ1xuIgorICAgICAgICAgICAgPDwgInFcbiIgPDwgcmNDbGllbnQubGVmdCA8PCAiICIgPDwgcmNDbGllbnQuYm90dG9tIDw8ICIgIgorICAgICAgICAgICAgPDwgcmNDbGllbnQuV2lkdGgoKSA8PCAiICIgPDwgcmNDbGllbnQuSGVpZ2h0KCkgPDwgIiByZVxuV1xublxuIjsKKyAgICAgIHNCb2R5IDw8IHNMaXN0IDw8ICJRXG5FTUNcbiI7CisgICAgfQorCisgICAgSUZYX0VkaXQ6OkRlbEVkaXQocEVkaXQpOworICB9CisKKyAgQ0ZYX0J5dGVTdHJpbmcgc0FQID0gR2V0QmFja2dyb3VuZEFwcFN0cmVhbSgpICsgR2V0Qm9yZGVyQXBwU3RyZWFtKCkgKworICAgICAgICAgICAgICAgICAgICAgICBzTGluZXMuR2V0Qnl0ZVN0cmluZygpICsgc0JvZHkuR2V0Qnl0ZVN0cmluZygpOworCisgIFdyaXRlQXBwZWFyYW5jZSgiTiIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBzQVApOworfQorCit2b2lkIENQREZTREtfV2lkZ2V0OjpSZXNldEFwcGVhcmFuY2VfVGV4dEZpZWxkKGNvbnN0IEZYX1dDSEFSKiBzVmFsdWUpIHsKKyAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBHZXRGb3JtQ29udHJvbCgpOworICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gcENvbnRyb2wtPkdldEZpZWxkKCk7CisgIENGWF9CeXRlVGV4dEJ1ZiBzQm9keSwgc0xpbmVzOworCisgIGlmIChJRlhfRWRpdCogcEVkaXQgPSBJRlhfRWRpdDo6TmV3RWRpdCgpKSB7CisgICAgcEVkaXQtPkVuYWJsZVJlZnJlc2goRkFMU0UpOworCisgICAgQ1BERlNES19Eb2N1bWVudCogcERvYyA9IG1fcEludGVyRm9ybS0+R2V0RG9jdW1lbnQoKTsKKyAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gcERvYy0+R2V0RW52KCk7CisKKyAgICBDQkFfRm9udE1hcCBmb250X21hcCh0aGlzLCBwRW52LT5HZXRTeXNIYW5kbGVyKCkpOworICAgIHBFZGl0LT5TZXRGb250TWFwKCZmb250X21hcCk7CisKKyAgICBDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CisgICAgcEVkaXQtPlNldFBsYXRlUmVjdChyY0NsaWVudCk7CisgICAgcEVkaXQtPlNldEFsaWdubWVudEgocENvbnRyb2wtPkdldENvbnRyb2xBbGlnbm1lbnQoKSk7CisKKyAgICBGWF9EV09SRCBkd0ZpZWxkRmxhZ3MgPSBwRmllbGQtPkdldEZpZWxkRmxhZ3MoKTsKKyAgICBGWF9CT09MIGJNdWx0aUxpbmUgPSAoZHdGaWVsZEZsYWdzID4+IDEyKSAmIDE7CisKKyAgICBpZiAoYk11bHRpTGluZSkgeworICAgICAgcEVkaXQtPlNldE11bHRpTGluZShUUlVFKTsKKyAgICAgIHBFZGl0LT5TZXRBdXRvUmV0dXJuKFRSVUUpOworICAgIH0gZWxzZSB7CisgICAgICBwRWRpdC0+U2V0QWxpZ25tZW50VigxKTsKKyAgICB9CisKKyAgICBGWF9XT1JEIHN1YldvcmQgPSAwOworICAgIGlmICgoZHdGaWVsZEZsYWdzID4+IDEzKSAmIDEpIHsKKyAgICAgIHN1YldvcmQgPSAnKic7CisgICAgICBwRWRpdC0+U2V0UGFzc3dvcmRDaGFyKHN1YldvcmQpOworICAgIH0KKworICAgIGludCBuTWF4TGVuID0gcEZpZWxkLT5HZXRNYXhMZW4oKTsKKyAgICBGWF9CT09MIGJDaGFyQXJyYXkgPSAoZHdGaWVsZEZsYWdzID4+IDI0KSAmIDE7CisgICAgRlhfRkxPQVQgZkZvbnRTaXplID0gR2V0Rm9udFNpemUoKTsKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgICAgQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlVG1wOworICAgIGlmICghc1ZhbHVlICYmIChOVUxMICE9IHRoaXMtPkdldE1peFhGQVdpZGdldCgpKSkgeworICAgICAgc1ZhbHVlVG1wID0gR2V0VmFsdWUoVFJVRSk7CisgICAgICBzVmFsdWUgPSBzVmFsdWVUbXA7CisgICAgfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCisgICAgaWYgKG5NYXhMZW4gPiAwKSB7CisgICAgICBpZiAoYkNoYXJBcnJheSkgeworICAgICAgICBwRWRpdC0+U2V0Q2hhckFycmF5KG5NYXhMZW4pOworCisgICAgICAgIGlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKSB7CisgICAgICAgICAgZkZvbnRTaXplID0gQ1BXTF9FZGl0OjpHZXRDaGFyQXJyYXlBdXRvRm9udFNpemUoCisgICAgICAgICAgICAgIGZvbnRfbWFwLkdldFBERkZvbnQoMCksIHJjQ2xpZW50LCBuTWF4TGVuKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNWYWx1ZSkKKyAgICAgICAgICBuTWF4TGVuID0gd2NzbGVuKChjb25zdCB3Y2hhcl90KilzVmFsdWUpOworICAgICAgICBwRWRpdC0+U2V0TGltaXRDaGFyKG5NYXhMZW4pOworICAgICAgfQorICAgIH0KKworICAgIGlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKQorICAgICAgcEVkaXQtPlNldEF1dG9Gb250U2l6ZShUUlVFKTsKKyAgICBlbHNlCisgICAgICBwRWRpdC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKKworICAgIHBFZGl0LT5Jbml0aWFsaXplKCk7CisKKyAgICBpZiAoc1ZhbHVlKQorICAgICAgcEVkaXQtPlNldFRleHQoc1ZhbHVlKTsKKyAgICBlbHNlCisgICAgICBwRWRpdC0+U2V0VGV4dChwRmllbGQtPkdldFZhbHVlKCkuY19zdHIoKSk7CisKKyAgICBDUERGX1JlY3QgcmNDb250ZW50ID0gcEVkaXQtPkdldENvbnRlbnRSZWN0KCk7CisKKyAgICBDRlhfQnl0ZVN0cmluZyBzRWRpdCA9IENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0oCisgICAgICAgIHBFZGl0LCBDUERGX1BvaW50KDAuMGYsIDAuMGYpLCBOVUxMLCAhYkNoYXJBcnJheSwgc3ViV29yZCk7CisKKyAgICBpZiAoc0VkaXQuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICBzQm9keSA8PCAiL1R4IEJNQ1xuIgorICAgICAgICAgICAgPDwgInFcbiI7CisgICAgICBpZiAocmNDb250ZW50LldpZHRoKCkgPiByY0NsaWVudC5XaWR0aCgpIHx8CisgICAgICAgICAgcmNDb250ZW50LkhlaWdodCgpID4gcmNDbGllbnQuSGVpZ2h0KCkpIHsKKyAgICAgICAgc0JvZHkgPDwgcmNDbGllbnQubGVmdCA8PCAiICIgPDwgcmNDbGllbnQuYm90dG9tIDw8ICIgIgorICAgICAgICAgICAgICA8PCByY0NsaWVudC5XaWR0aCgpIDw8ICIgIiA8PCByY0NsaWVudC5IZWlnaHQoKSA8PCAiIHJlXG5XXG5uXG4iOworICAgICAgfQorICAgICAgQ1BXTF9Db2xvciBjclRleHQgPSBHZXRUZXh0UFdMQ29sb3IoKTsKKyAgICAgIHNCb2R5IDw8ICJCVFxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQpIDw8IHNFZGl0CisgICAgICAgICAgICA8PCAiRVRcbiIKKyAgICAgICAgICAgIDw8ICJRXG5FTUNcbiI7CisgICAgfQorCisgICAgaWYgKGJDaGFyQXJyYXkpIHsKKyAgICAgIHN3aXRjaCAoR2V0Qm9yZGVyU3R5bGUoKSkgeworICAgICAgICBjYXNlIEJCU19TT0xJRDogeworICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNDb2xvciA9CisgICAgICAgICAgICAgIENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJvcmRlclBXTENvbG9yKCksIEZBTFNFKTsKKyAgICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgc0xpbmVzIDw8ICJxXG4iIDw8IEdldEJvcmRlcldpZHRoKCkgPDwgIiB3XG4iCisgICAgICAgICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0Qm9yZGVyUFdMQ29sb3IoKSwgRkFMU0UpCisgICAgICAgICAgICAgICAgICAgPDwgIiAyIEogMCBqXG4iOworCisgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBuTWF4TGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgc0xpbmVzIDw8IHJjQ2xpZW50LmxlZnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KSAvIG5NYXhMZW4pICogaQorICAgICAgICAgICAgICAgICAgICAgPDwgIiAiIDw8IHJjQ2xpZW50LmJvdHRvbSA8PCAiIG1cbiIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHJjQ2xpZW50LmxlZnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KSAvIG5NYXhMZW4pICogaQorICAgICAgICAgICAgICAgICAgICAgPDwgIiAiIDw8IHJjQ2xpZW50LnRvcCA8PCAiIGwgU1xuIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc0xpbmVzIDw8ICJRXG4iOworICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBCQlNfREFTSDogeworICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNDb2xvciA9CisgICAgICAgICAgICAgIENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJvcmRlclBXTENvbG9yKCksIEZBTFNFKTsKKyAgICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgQ1BXTF9EYXNoIGRzQm9yZGVyID0gQ1BXTF9EYXNoKDMsIDMsIDApOworCisgICAgICAgICAgICBzTGluZXMgPDwgInFcbiIgPDwgR2V0Qm9yZGVyV2lkdGgoKSA8PCAiIHdcbiIKKyAgICAgICAgICAgICAgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRCb3JkZXJQV0xDb2xvcigpLCBGQUxTRSkKKyAgICAgICAgICAgICAgICAgICA8PCAiWyIgPDwgZHNCb3JkZXIubkRhc2ggPDwgIiAiIDw8IGRzQm9yZGVyLm5HYXAgPDwgIl0gIgorICAgICAgICAgICAgICAgICAgIDw8IGRzQm9yZGVyLm5QaGFzZSA8PCAiIGRcbiI7CisKKyAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IG5NYXhMZW47IGkrKykgeworICAgICAgICAgICAgICBzTGluZXMgPDwgcmNDbGllbnQubGVmdCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQpIC8gbk1heExlbikgKiBpCisgICAgICAgICAgICAgICAgICAgICA8PCAiICIgPDwgcmNDbGllbnQuYm90dG9tIDw8ICIgbVxuIgorICAgICAgICAgICAgICAgICAgICAgPDwgcmNDbGllbnQubGVmdCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQpIC8gbk1heExlbikgKiBpCisgICAgICAgICAgICAgICAgICAgICA8PCAiICIgPDwgcmNDbGllbnQudG9wIDw8ICIgbCBTXG4iOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzTGluZXMgPDwgIlFcbiI7CisgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIElGWF9FZGl0OjpEZWxFZGl0KHBFZGl0KTsKKyAgfQorCisgIENGWF9CeXRlU3RyaW5nIHNBUCA9IEdldEJhY2tncm91bmRBcHBTdHJlYW0oKSArIEdldEJvcmRlckFwcFN0cmVhbSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgc0xpbmVzLkdldEJ5dGVTdHJpbmcoKSArIHNCb2R5LkdldEJ5dGVTdHJpbmcoKTsKKyAgV3JpdGVBcHBlYXJhbmNlKCJOIiwgR2V0Um90YXRlZFJlY3QoKSwgR2V0TWF0cml4KCksIHNBUCk7Cit9CisKK0NQREZfUmVjdCBDUERGU0RLX1dpZGdldDo6R2V0Q2xpZW50UmVjdCgpIGNvbnN0IHsKKyAgQ1BERl9SZWN0IHJjV2luZG93ID0gR2V0Um90YXRlZFJlY3QoKTsKKyAgRlhfRkxPQVQgZkJvcmRlcldpZHRoID0gKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCk7CisgIHN3aXRjaCAoR2V0Qm9yZGVyU3R5bGUoKSkgeworICAgIGNhc2UgQkJTX0JFVkVMRUQ6CisgICAgY2FzZSBCQlNfSU5TRVQ6CisgICAgICBmQm9yZGVyV2lkdGggKj0gMi4wZjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJjV2luZG93LCBmQm9yZGVyV2lkdGgpOworfQorCitDUERGX1JlY3QgQ1BERlNES19XaWRnZXQ6OkdldFJvdGF0ZWRSZWN0KCkgY29uc3QgeworICBDUERGX1JlY3QgcmVjdEFubm90ID0gR2V0UmVjdCgpOworICBGWF9GTE9BVCBmV2lkdGggPSByZWN0QW5ub3QucmlnaHQgLSByZWN0QW5ub3QubGVmdDsKKyAgRlhfRkxPQVQgZkhlaWdodCA9IHJlY3RBbm5vdC50b3AgLSByZWN0QW5ub3QuYm90dG9tOworCisgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gR2V0Rm9ybUNvbnRyb2woKTsKKyAgQ1BERl9SZWN0IHJjUERGV2luZG93OworICBzd2l0Y2ggKGFicyhwQ29udHJvbC0+R2V0Um90YXRpb24oKSAlIDM2MCkpIHsKKyAgICBjYXNlIDA6CisgICAgY2FzZSAxODA6CisgICAgZGVmYXVsdDoKKyAgICAgIHJjUERGV2luZG93ID0gQ1BERl9SZWN0KDAsIDAsIGZXaWR0aCwgZkhlaWdodCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDkwOgorICAgIGNhc2UgMjcwOgorICAgICAgcmNQREZXaW5kb3cgPSBDUERGX1JlY3QoMCwgMCwgZkhlaWdodCwgZldpZHRoKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJjUERGV2luZG93OworfQorCitDRlhfQnl0ZVN0cmluZyBDUERGU0RLX1dpZGdldDo6R2V0QmFja2dyb3VuZEFwcFN0cmVhbSgpIGNvbnN0IHsKKyAgQ1BXTF9Db2xvciBjckJhY2tncm91bmQgPSBHZXRGaWxsUFdMQ29sb3IoKTsKKyAgaWYgKGNyQmFja2dyb3VuZC5uQ29sb3JUeXBlICE9IENPTE9SVFlQRV9UUkFOU1BBUkVOVCkgeworICAgIHJldHVybiBDUFdMX1V0aWxzOjpHZXRSZWN0RmlsbEFwcFN0cmVhbShHZXRSb3RhdGVkUmVjdCgpLCBjckJhY2tncm91bmQpOworICB9CisgIHJldHVybiAiIjsKK30KKworQ0ZYX0J5dGVTdHJpbmcgQ1BERlNES19XaWRnZXQ6OkdldEJvcmRlckFwcFN0cmVhbSgpIGNvbnN0IHsKKyAgQ1BERl9SZWN0IHJjV2luZG93ID0gR2V0Um90YXRlZFJlY3QoKTsKKyAgQ1BXTF9Db2xvciBjckJvcmRlciA9IEdldEJvcmRlclBXTENvbG9yKCk7CisgIENQV0xfQ29sb3IgY3JCYWNrZ3JvdW5kID0gR2V0RmlsbFBXTENvbG9yKCk7CisgIENQV0xfQ29sb3IgY3JMZWZ0VG9wLCBjclJpZ2h0Qm90dG9tOworCisgIEZYX0ZMT0FUIGZCb3JkZXJXaWR0aCA9IChGWF9GTE9BVClHZXRCb3JkZXJXaWR0aCgpOworICBpbnQzMl90IG5Cb3JkZXJTdHlsZSA9IDA7CisgIENQV0xfRGFzaCBkc0JvcmRlcigzLCAwLCAwKTsKKworICBzd2l0Y2ggKEdldEJvcmRlclN0eWxlKCkpIHsKKyAgICBjYXNlIEJCU19EQVNIOgorICAgICAgbkJvcmRlclN0eWxlID0gUEJTX0RBU0g7CisgICAgICBkc0JvcmRlciA9IENQV0xfRGFzaCgzLCAzLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQkJTX0JFVkVMRUQ6CisgICAgICBuQm9yZGVyU3R5bGUgPSBQQlNfQkVWRUxFRDsKKyAgICAgIGZCb3JkZXJXaWR0aCAqPSAyOworICAgICAgY3JMZWZ0VG9wID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMSk7CisgICAgICBjclJpZ2h0Qm90dG9tID0gQ1BXTF9VdGlsczo6RGV2aWRlQ29sb3IoY3JCYWNrZ3JvdW5kLCAyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQkJTX0lOU0VUOgorICAgICAgbkJvcmRlclN0eWxlID0gUEJTX0lOU0VUOworICAgICAgZkJvcmRlcldpZHRoICo9IDI7CisgICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwLjUpOworICAgICAgY3JSaWdodEJvdHRvbSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDAuNzUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCQlNfVU5ERVJMSU5FOgorICAgICAgbkJvcmRlclN0eWxlID0gUEJTX1VOREVSTElORUQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbkJvcmRlclN0eWxlID0gUEJTX1NPTElEOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gQ1BXTF9VdGlsczo6R2V0Qm9yZGVyQXBwU3RyZWFtKHJjV2luZG93LCBmQm9yZGVyV2lkdGgsIGNyQm9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyTGVmdFRvcCwgY3JSaWdodEJvdHRvbSwgbkJvcmRlclN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzQm9yZGVyKTsKK30KKworQ0ZYX01hdHJpeCBDUERGU0RLX1dpZGdldDo6R2V0TWF0cml4KCkgY29uc3QgeworICBDRlhfTWF0cml4IG10OworICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldEZvcm1Db250cm9sKCk7CisgIENQREZfUmVjdCByY0Fubm90ID0gR2V0UmVjdCgpOworICBGWF9GTE9BVCBmV2lkdGggPSByY0Fubm90LnJpZ2h0IC0gcmNBbm5vdC5sZWZ0OworICBGWF9GTE9BVCBmSGVpZ2h0ID0gcmNBbm5vdC50b3AgLSByY0Fubm90LmJvdHRvbTsKKworICBzd2l0Y2ggKGFicyhwQ29udHJvbC0+R2V0Um90YXRpb24oKSAlIDM2MCkpIHsKKyAgICBjYXNlIDA6CisgICAgZGVmYXVsdDoKKyAgICAgIG10ID0gQ0ZYX01hdHJpeCgxLCAwLCAwLCAxLCAwLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgOTA6CisgICAgICBtdCA9IENGWF9NYXRyaXgoMCwgMSwgLTEsIDAsIGZXaWR0aCwgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE4MDoKKyAgICAgIG10ID0gQ0ZYX01hdHJpeCgtMSwgMCwgMCwgLTEsIGZXaWR0aCwgZkhlaWdodCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI3MDoKKyAgICAgIG10ID0gQ0ZYX01hdHJpeCgwLCAtMSwgMSwgMCwgMCwgZkhlaWdodCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBtdDsKK30KKworQ1BXTF9Db2xvciBDUERGU0RLX1dpZGdldDo6R2V0VGV4dFBXTENvbG9yKCkgY29uc3QgeworICBDUFdMX0NvbG9yIGNyVGV4dCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDApOworCisgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7CisgIENQREZfRGVmYXVsdEFwcGVhcmFuY2UgZGEgPSBwRm9ybUN0cmwtPkdldERlZmF1bHRBcHBlYXJhbmNlKCk7CisgIGlmIChkYS5IYXNDb2xvcigpKSB7CisgICAgaW50MzJfdCBpQ29sb3JUeXBlOworICAgIEZYX0ZMT0FUIGZjWzRdOworICAgIGRhLkdldENvbG9yKGlDb2xvclR5cGUsIGZjKTsKKyAgICBjclRleHQgPSBDUFdMX0NvbG9yKGlDb2xvclR5cGUsIGZjWzBdLCBmY1sxXSwgZmNbMl0sIGZjWzNdKTsKKyAgfQorCisgIHJldHVybiBjclRleHQ7Cit9CisKK0NQV0xfQ29sb3IgQ1BERlNES19XaWRnZXQ6OkdldEJvcmRlclBXTENvbG9yKCkgY29uc3QgeworICBDUFdMX0NvbG9yIGNyQm9yZGVyOworCisgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7CisgIGludDMyX3QgaUNvbG9yVHlwZTsKKyAgRlhfRkxPQVQgZmNbNF07CisgIHBGb3JtQ3RybC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcihpQ29sb3JUeXBlLCBmYyk7CisgIGlmIChpQ29sb3JUeXBlID4gMCkKKyAgICBjckJvcmRlciA9IENQV0xfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOworCisgIHJldHVybiBjckJvcmRlcjsKK30KKworQ1BXTF9Db2xvciBDUERGU0RLX1dpZGdldDo6R2V0RmlsbFBXTENvbG9yKCkgY29uc3QgeworICBDUFdMX0NvbG9yIGNyRmlsbDsKKworICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBHZXRGb3JtQ29udHJvbCgpOworICBpbnQzMl90IGlDb2xvclR5cGU7CisgIEZYX0ZMT0FUIGZjWzRdOworICBwRm9ybUN0cmwtPkdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKGlDb2xvclR5cGUsIGZjKTsKKyAgaWYgKGlDb2xvclR5cGUgPiAwKQorICAgIGNyRmlsbCA9IENQV0xfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOworCisgIHJldHVybiBjckZpbGw7Cit9CisKK3ZvaWQgQ1BERlNES19XaWRnZXQ6OkFkZEltYWdlVG9BcHBlYXJhbmNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQVBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9TdHJlYW0qIHBJbWFnZSkgeworICBDUERGX0RvY3VtZW50KiBwRG9jID0gbV9wUGFnZVZpZXctPkdldFBERkRvY3VtZW50KCk7CisgIEFTU0VSVChwRG9jKTsKKworICBDUERGX0RpY3Rpb25hcnkqIHBBUERpY3QgPSBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3QoIkFQIik7CisgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gcEFQRGljdC0+R2V0U3RyZWFtKHNBUFR5cGUpOworICBDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1EaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOworICBDRlhfQnl0ZVN0cmluZyBzSW1hZ2VBbGlhcyA9ICJJTUciOworCisgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBJbWFnZURpY3QgPSBwSW1hZ2UtPkdldERpY3QoKSkgeworICAgIHNJbWFnZUFsaWFzID0gcEltYWdlRGljdC0+R2V0U3RyaW5nKCJOYW1lIik7CisgICAgaWYgKHNJbWFnZUFsaWFzLklzRW1wdHkoKSkKKyAgICAgIHNJbWFnZUFsaWFzID0gIklNRyI7CisgIH0KKworICBDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1SZXNMaXN0ID0gcFN0cmVhbURpY3QtPkdldERpY3QoIlJlc291cmNlcyIpOworICBpZiAoIXBTdHJlYW1SZXNMaXN0KSB7CisgICAgcFN0cmVhbVJlc0xpc3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5KCk7CisgICAgcFN0cmVhbURpY3QtPlNldEF0KCJSZXNvdXJjZXMiLCBwU3RyZWFtUmVzTGlzdCk7CisgIH0KKworICBpZiAocFN0cmVhbVJlc0xpc3QpIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBYT2JqZWN0ID0gbmV3IENQREZfRGljdGlvbmFyeTsKKyAgICBwWE9iamVjdC0+U2V0QXRSZWZlcmVuY2Uoc0ltYWdlQWxpYXMsIHBEb2MsIHBJbWFnZSk7CisgICAgcFN0cmVhbVJlc0xpc3QtPlNldEF0KCJYT2JqZWN0IiwgcFhPYmplY3QpOworICB9Cit9CisKK3ZvaWQgQ1BERlNES19XaWRnZXQ6OlJlbW92ZUFwcGVhcmFuY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNBUFR5cGUpIHsKKyAgaWYgKENQREZfRGljdGlvbmFyeSogcEFQRGljdCA9IG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0RGljdCgiQVAiKSkgeworICAgIHBBUERpY3QtPlJlbW92ZUF0KHNBUFR5cGUpOworICB9Cit9CisKK0ZYX0JPT0wgQ1BERlNES19XaWRnZXQ6Ok9uQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgeworICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwUGFnZVZpZXctPkdldFNES0RvY3VtZW50KCk7CisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBwRG9jdW1lbnQtPkdldEVudigpOworCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgQ1BERlhGQV9Eb2N1bWVudCogcERvYyA9IHBEb2N1bWVudC0+R2V0WEZBRG9jdW1lbnQoKTsKKyAgaWYgKElYRkFfV2lkZ2V0KiBoV2lkZ2V0ID0gR2V0TWl4WEZBV2lkZ2V0KCkpIHsKKyAgICBYRkFfRVZFTlRUWVBFIGVFdmVudFR5cGUgPSBHZXRYRkFFdmVudFR5cGUodHlwZSwgZGF0YS5iV2lsbENvbW1pdCk7CisKKyAgICBpZiAoZUV2ZW50VHlwZSAhPSBYRkFfRVZFTlRfVW5rbm93bikgeworICAgICAgaWYgKElYRkFfV2lkZ2V0SGFuZGxlciogcFhGQVdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKCkpIHsKKyAgICAgICAgQ1hGQV9FdmVudFBhcmFtIHBhcmFtOworICAgICAgICBwYXJhbS5tX2VUeXBlID0gZUV2ZW50VHlwZTsKKyAgICAgICAgcGFyYW0ubV93c0NoYW5nZSA9IGRhdGEuc0NoYW5nZTsKKyAgICAgICAgcGFyYW0ubV9pQ29tbWl0S2V5ID0gZGF0YS5uQ29tbWl0S2V5OworICAgICAgICBwYXJhbS5tX2JTaGlmdCA9IGRhdGEuYlNoaWZ0OworICAgICAgICBwYXJhbS5tX2lTZWxTdGFydCA9IGRhdGEublNlbFN0YXJ0OworICAgICAgICBwYXJhbS5tX2lTZWxFbmQgPSBkYXRhLm5TZWxFbmQ7CisgICAgICAgIHBhcmFtLm1fd3NGdWxsVGV4dCA9IGRhdGEuc1ZhbHVlOworICAgICAgICBwYXJhbS5tX2JLZXlEb3duID0gZGF0YS5iS2V5RG93bjsKKyAgICAgICAgcGFyYW0ubV9iTW9kaWZpZXIgPSBkYXRhLmJNb2RpZmllcjsKKyAgICAgICAgcGFyYW0ubV93c05ld1RleHQgPSBkYXRhLnNWYWx1ZTsKKyAgICAgICAgaWYgKGRhdGEublNlbEVuZCA+IGRhdGEublNlbFN0YXJ0KQorICAgICAgICAgIHBhcmFtLm1fd3NOZXdUZXh0LkRlbGV0ZShkYXRhLm5TZWxTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5uU2VsRW5kIC0gZGF0YS5uU2VsU3RhcnQpOworICAgICAgICBmb3IgKGludCBpID0gZGF0YS5zQ2hhbmdlLkdldExlbmd0aCgpIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgcGFyYW0ubV93c05ld1RleHQuSW5zZXJ0KGRhdGEublNlbFN0YXJ0LCBkYXRhLnNDaGFuZ2VbaV0pOworICAgICAgICBwYXJhbS5tX3dzUHJldlRleHQgPSBkYXRhLnNWYWx1ZTsKKworICAgICAgICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IHBYRkFXaWRnZXRIYW5kbGVyLT5HZXREYXRhQWNjKGhXaWRnZXQpOworICAgICAgICBwYXJhbS5tX3BUYXJnZXQgPSBwQWNjOworICAgICAgICBpbnQzMl90IG5SZXQgPSBwWEZBV2lkZ2V0SGFuZGxlci0+UHJvY2Vzc0V2ZW50KHBBY2MsICZwYXJhbSk7CisKKyAgICAgICAgaWYgKElYRkFfRG9jVmlldyogcERvY1ZpZXcgPSBwRG9jLT5HZXRYRkFEb2NWaWV3KCkpIHsKKyAgICAgICAgICBwRG9jVmlldy0+VXBkYXRlRG9jVmlldygpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5SZXQgPT0gWEZBX0VWRU5URVJST1JfU3VjZXNzKQorICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCisgIENQREZfQWN0aW9uIGFjdGlvbiA9IEdldEFBY3Rpb24odHlwZSk7CisgIGlmIChhY3Rpb24gJiYgYWN0aW9uLkdldFR5cGUoKSAhPSBDUERGX0FjdGlvbjo6VW5rbm93bikgeworICAgIENQREZTREtfQWN0aW9uSGFuZGxlciogcEFjdGlvbkhhbmRsZXIgPSBwRW52LT5HZXRBY3Rpb25IYW5kZXIoKTsKKyAgICByZXR1cm4gcEFjdGlvbkhhbmRsZXItPkRvQWN0aW9uX0ZpZWxkKGFjdGlvbiwgdHlwZSwgcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Rm9ybUZpZWxkKCksIGRhdGEpOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworQ1BERl9BY3Rpb24gQ1BERlNES19XaWRnZXQ6OkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSBlQUFUKSB7CisgIHN3aXRjaCAoZUFBVCkgeworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpDdXJzb3JFbnRlcjoKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6Q3Vyc29yRXhpdDoKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6QnV0dG9uRG93bjoKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6QnV0dG9uVXA6CisgICAgY2FzZSBDUERGX0FBY3Rpb246OkdldEZvY3VzOgorICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpMb3NlRm9jdXM6CisgICAgY2FzZSBDUERGX0FBY3Rpb246OlBhZ2VPcGVuOgorICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpQYWdlQ2xvc2U6CisgICAgY2FzZSBDUERGX0FBY3Rpb246OlBhZ2VWaXNpYmxlOgorICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpQYWdlSW52aXNpYmxlOgorICAgICAgcmV0dXJuIENQREZTREtfQkFBbm5vdDo6R2V0QUFjdGlvbihlQUFUKTsKKworICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2U6CisgICAgY2FzZSBDUERGX0FBY3Rpb246OkZvcm1hdDoKKyAgICBjYXNlIENQREZfQUFjdGlvbjo6VmFsaWRhdGU6CisgICAgY2FzZSBDUERGX0FBY3Rpb246OkNhbGN1bGF0ZTogeworICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IEdldEZvcm1GaWVsZCgpOworICAgICAgaWYgKENQREZfQUFjdGlvbiBhYSA9IHBGaWVsZC0+R2V0QWRkaXRpb25hbEFjdGlvbigpKQorICAgICAgICByZXR1cm4gYWEuR2V0QWN0aW9uKGVBQVQpOworICAgICAgcmV0dXJuIENQREZTREtfQkFBbm5vdDo6R2V0QUFjdGlvbihlQUFUKTsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIENQREZfQWN0aW9uKCk7Cit9CisKK0NGWF9XaWRlU3RyaW5nIENQREZTREtfV2lkZ2V0OjpHZXRBbHRlcm5hdGVOYW1lKCkgY29uc3QgeworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOworICByZXR1cm4gcEZvcm1GaWVsZC0+R2V0QWx0ZXJuYXRlTmFtZSgpOworfQorCitpbnQzMl90IENQREZTREtfV2lkZ2V0OjpHZXRBcHBlYXJhbmNlQWdlKCkgY29uc3QgeworICByZXR1cm4gbV9uQXBwQWdlOworfQorCitpbnQzMl90IENQREZTREtfV2lkZ2V0OjpHZXRWYWx1ZUFnZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fblZhbHVlQWdlOworfQorCitGWF9CT09MIENQREZTREtfV2lkZ2V0OjpIaXRUZXN0KEZYX0ZMT0FUIHBhZ2VYLCBGWF9GTE9BVCBwYWdlWSkgeworICBDUERGX0Fubm90KiBwQW5ub3QgPSBHZXRQREZBbm5vdCgpOworICBDRlhfRmxvYXRSZWN0IGFubm90UmVjdDsKKyAgcEFubm90LT5HZXRSZWN0KGFubm90UmVjdCk7CisgIGlmIChhbm5vdFJlY3QuQ29udGFpbnMocGFnZVgsIHBhZ2VZKSkgeworICAgIGlmICghSXNWaXNpYmxlKCkpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBpbnQgbkZpZWxkRmxhZ3MgPSBHZXRGaWVsZEZsYWdzKCk7CisgICAgaWYgKChuRmllbGRGbGFncyAmIEZJRUxERkxBR19SRUFET05MWSkgPT0gRklFTERGTEFHX1JFQURPTkxZKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK0NQREZTREtfWEZBV2lkZ2V0OjpDUERGU0RLX1hGQVdpZGdldChJWEZBX1dpZGdldCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSkKKyAgICA6IENQREZTREtfQW5ub3QocFBhZ2VWaWV3KSwgbV9wSW50ZXJGb3JtKHBJbnRlckZvcm0pLCBtX2hYRkFXaWRnZXQocEFubm90KSB7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19YRkFXaWRnZXQ6OklzWEZBRmllbGQoKSB7CisgIHJldHVybiBUUlVFOworfQorCitDRlhfQnl0ZVN0cmluZyBDUERGU0RLX1hGQVdpZGdldDo6R2V0VHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIEZTREtfWEZBV0lER0VUX1RZUEVOQU1FOworfQorCitDRlhfRmxvYXRSZWN0IENQREZTREtfWEZBV2lkZ2V0OjpHZXRSZWN0KCkgY29uc3QgeworICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBHZXRQYWdlVmlldygpOworICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwUGFnZVZpZXctPkdldFNES0RvY3VtZW50KCk7CisgIENQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSBwRG9jdW1lbnQtPkdldFhGQURvY3VtZW50KCk7CisgIElYRkFfRG9jVmlldyogcERvY1ZpZXcgPSBwRG9jLT5HZXRYRkFEb2NWaWV3KCk7CisgIElYRkFfV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBwRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpOworCisgIENGWF9SZWN0RiByY0JCb3g7CisgIHBXaWRnZXRIYW5kbGVyLT5HZXRSZWN0KEdldFhGQVdpZGdldCgpLCByY0JCb3gpOworCisgIHJldHVybiBDRlhfRmxvYXRSZWN0KHJjQkJveC5sZWZ0LCByY0JCb3gudG9wLCByY0JCb3gubGVmdCArIHJjQkJveC53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LnRvcCArIHJjQkJveC5oZWlnaHQpOworfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCiBDUERGU0RLX0ludGVyRm9ybTo6Q1BERlNES19JbnRlckZvcm0oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50KQotCTptX3BEb2N1bWVudChwRG9jdW1lbnQpLAotCW1fcEludGVyRm9ybShOVUxMKSwKLQltX2JDYWxjdWxhdGUoVFJVRSksCi0JbV9iQnVzeShGQUxTRSkKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0JbV9wSW50ZXJGb3JtID0gbmV3IENQREZfSW50ZXJGb3JtKG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLCBGQUxTRSk7Ci0JQVNTRVJUKG1fcEludGVyRm9ybSAhPSBOVUxMKTsKLQltX3BJbnRlckZvcm0tPlNldEZvcm1Ob3RpZnkodGhpcyk7CisgICAgOiBtX3BEb2N1bWVudChwRG9jdW1lbnQpLAorICAgICAgbV9wSW50ZXJGb3JtKE5VTEwpLAorI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgICAgICBtX2JYZmFDYWxjdWxhdGUoVFJVRSksCisgICAgICBtX2JYZmFWYWxpZGF0aW9uc0VuYWJsZWQoVFJVRSksCisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisgICAgICBtX2JDYWxjdWxhdGUoVFJVRSksCisgICAgICBtX2JCdXN5KEZBTFNFKSB7CisgIG1fcEludGVyRm9ybSA9IG5ldyBDUERGX0ludGVyRm9ybShtX3BEb2N1bWVudC0+R2V0UERGRG9jdW1lbnQoKSwgRkFMU0UpOworICBtX3BJbnRlckZvcm0tPlNldEZvcm1Ob3RpZnkodGhpcyk7CiAKLQlmb3IoaW50IGk9MDsgaTw2OyBpKyspCi0JCW1fYk5lZWRIaWdodGxpZ2h0W2ldID0gRkFMU0U7Ci0JbV9pSGlnaGxpZ2h0QWxwaGEgPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1GaWVsZFR5cGVzOyArK2kpCisgICAgbV9iTmVlZEhpZ2h0bGlnaHRbaV0gPSBGQUxTRTsKKyAgbV9pSGlnaGxpZ2h0QWxwaGEgPSAwOwogfQogCi1DUERGU0RLX0ludGVyRm9ybTo6fkNQREZTREtfSW50ZXJGb3JtKCkKLXsKLQlBU1NFUlQobV9wSW50ZXJGb3JtICE9IE5VTEwpOwotCWRlbGV0ZSBtX3BJbnRlckZvcm07Ci0JbV9wSW50ZXJGb3JtID0gTlVMTDsKLQotCW1fTWFwLlJlbW92ZUFsbCgpOworQ1BERlNES19JbnRlckZvcm06On5DUERGU0RLX0ludGVyRm9ybSgpIHsKKyAgZGVsZXRlIG1fcEludGVyRm9ybTsKKyAgbV9wSW50ZXJGb3JtID0gbnVsbHB0cjsKKyAgbV9NYXAuY2xlYXIoKTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBtX1hGQU1hcC5SZW1vdmVBbGwoKTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIH0KIAotdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6RGVzdHJveSgpCi17Ci0JZGVsZXRlIHRoaXM7CitGWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpIaWdobGlnaHRXaWRnZXRzKCkgeworICByZXR1cm4gRkFMU0U7CiB9CiAKLUNQREZfSW50ZXJGb3JtKiBDUERGU0RLX0ludGVyRm9ybTo6R2V0SW50ZXJGb3JtKCkKLXsKLQlyZXR1cm4gbV9wSW50ZXJGb3JtOworQ1BERlNES19XaWRnZXQqIENQREZTREtfSW50ZXJGb3JtOjpHZXRTaWJsaW5nKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5leHQpIGNvbnN0IHsKKyAgc3RkOjp1bmlxdWVfcHRyPENCQV9Bbm5vdEl0ZXJhdG9yPiBwSXRlcmF0b3IoCisgICAgICBuZXcgQ0JBX0Fubm90SXRlcmF0b3IocFdpZGdldC0+R2V0UGFnZVZpZXcoKSwgIldpZGdldCIsICIiKSk7CisKKyAgaWYgKGJOZXh0KSB7CisgICAgcmV0dXJuIChDUERGU0RLX1dpZGdldCopcEl0ZXJhdG9yLT5HZXROZXh0QW5ub3QocFdpZGdldCk7CisgIH0KKyAgcmV0dXJuIChDUERGU0RLX1dpZGdldCopcEl0ZXJhdG9yLT5HZXRQcmV2QW5ub3QocFdpZGdldCk7CiB9CiAKLUNQREZTREtfRG9jdW1lbnQqIENQREZTREtfSW50ZXJGb3JtOjpHZXREb2N1bWVudCgpCi17Ci0JcmV0dXJuIG1fcERvY3VtZW50OwotfQorQ1BERlNES19XaWRnZXQqIENQREZTREtfSW50ZXJGb3JtOjpHZXRXaWRnZXQoQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wpIGNvbnN0IHsKKyAgaWYgKCFwQ29udHJvbCB8fCAhbV9wSW50ZXJGb3JtKQorICAgIHJldHVybiBudWxscHRyOwogCi1GWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpIaWdobGlnaHRXaWRnZXRzKCkKLXsKLQlyZXR1cm4gRkFMU0U7Ci19CisgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gbnVsbHB0cjsKKyAgY29uc3QgYXV0byBpdCA9IG1fTWFwLmZpbmQocENvbnRyb2wpOworICBpZiAoaXQgIT0gbV9NYXAuZW5kKCkpCisgICAgcFdpZGdldCA9IGl0LT5zZWNvbmQ7CiAKLUNQREZTREtfV2lkZ2V0KiBDUERGU0RLX0ludGVyRm9ybTo6R2V0U2libGluZyhDUERGU0RLX1dpZGdldCogcFdpZGdldCwgRlhfQk9PTCBiTmV4dCkgY29uc3QKLXsKLSAgICBub25zdGQ6OnVuaXF1ZV9wdHI8Q0JBX0Fubm90SXRlcmF0b3I+IHBJdGVyYXRvcigKLSAgICAgICAgbmV3IENCQV9Bbm5vdEl0ZXJhdG9yKHBXaWRnZXQtPkdldFBhZ2VWaWV3KCksICJXaWRnZXQiLCAiIikpOworICBpZiAocFdpZGdldCkKKyAgICByZXR1cm4gcFdpZGdldDsKIAotICAgIGlmIChiTmV4dCkgewotICAgICAgICByZXR1cm4gKENQREZTREtfV2lkZ2V0KilwSXRlcmF0b3ItPkdldE5leHRBbm5vdChwV2lkZ2V0KTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQ29udHJvbERpY3QgPSBwQ29udHJvbC0+R2V0V2lkZ2V0KCk7CisgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCA9IG1fcERvY3VtZW50LT5HZXRQREZEb2N1bWVudCgpOworICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZSA9IG51bGxwdHI7CisKKyAgaWYgKENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcENvbnRyb2xEaWN0LT5HZXREaWN0KCJQIikpIHsKKyAgICBpbnQgblBhZ2VJbmRleCA9IHBEb2N1bWVudC0+R2V0UGFnZUluZGV4KHBQYWdlRGljdC0+R2V0T2JqTnVtKCkpOworICAgIGlmIChuUGFnZUluZGV4ID49IDApIHsKKyAgICAgIHBQYWdlID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VWaWV3KG5QYWdlSW5kZXgpOwogICAgIH0KLSAgICByZXR1cm4gKENQREZTREtfV2lkZ2V0KilwSXRlcmF0b3ItPkdldFByZXZBbm5vdChwV2lkZ2V0KTsKKyAgfQorCisgIGlmICghcFBhZ2UpIHsKKyAgICBpbnQgblBhZ2VJbmRleCA9IEdldFBhZ2VJbmRleEJ5QW5ub3REaWN0KHBEb2N1bWVudCwgcENvbnRyb2xEaWN0KTsKKyAgICBpZiAoblBhZ2VJbmRleCA+PSAwKSB7CisgICAgICBwUGFnZSA9IG1fcERvY3VtZW50LT5HZXRQYWdlVmlldyhuUGFnZUluZGV4KTsKKyAgICB9CisgIH0KKworICBpZiAoIXBQYWdlKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gKENQREZTREtfV2lkZ2V0KilwUGFnZS0+R2V0QW5ub3RCeURpY3QocENvbnRyb2xEaWN0KTsKIH0KIAotQ1BERlNES19XaWRnZXQqCUNQREZTREtfSW50ZXJGb3JtOjpHZXRXaWRnZXQoQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wpIGNvbnN0Ci17Ci0JaWYoIXBDb250cm9sIHx8ICFtX3BJbnRlckZvcm0pIHJldHVybiBOVUxMOwotCQotCUNQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gTlVMTDsKLQltX01hcC5Mb29rdXAocENvbnRyb2wsIHBXaWRnZXQpOwotCi0JaWYgKHBXaWRnZXQpIHJldHVybiBwV2lkZ2V0OwotCi0JQ1BERl9EaWN0aW9uYXJ5KiBwQ29udHJvbERpY3QgPSBwQ29udHJvbC0+R2V0V2lkZ2V0KCk7Ci0JQVNTRVJUKHBDb250cm9sRGljdCAhPSBOVUxMKTsKLQotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQlDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKTsKLQotCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlID0gTlVMTDsKLQotCWlmIChDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IHBDb250cm9sRGljdC0+R2V0RGljdCgiUCIpKQotCXsKLQkJaW50IG5QYWdlSW5kZXggPSBwRG9jdW1lbnQtPkdldFBhZ2VJbmRleChwUGFnZURpY3QtPkdldE9iak51bSgpKTsKLQkJaWYgKG5QYWdlSW5kZXggPj0gMCkKLQkJewotCQkJcFBhZ2UgPSBtX3BEb2N1bWVudC0+R2V0UGFnZVZpZXcoblBhZ2VJbmRleCk7Ci0JCX0KLQl9Ci0KLQlpZiAoIXBQYWdlKSAKLQl7Ci0JCWludCBuUGFnZUluZGV4ID0gR2V0UGFnZUluZGV4QnlBbm5vdERpY3QocERvY3VtZW50LCBwQ29udHJvbERpY3QpOwotCQlpZiAoblBhZ2VJbmRleCA+PSAwKQotCQl7Ci0JCQlwUGFnZSA9IG1fcERvY3VtZW50LT5HZXRQYWdlVmlldyhuUGFnZUluZGV4KTsKLQkJfQotCX0KLQotCWlmIChwUGFnZSkKLQkJcmV0dXJuIChDUERGU0RLX1dpZGdldCopcFBhZ2UtPkdldEFubm90QnlEaWN0KHBDb250cm9sRGljdCk7Ci0KLQlyZXR1cm4gTlVMTDsKK3ZvaWQgQ1BERlNES19JbnRlckZvcm06OkdldFdpZGdldHMoCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNGaWVsZE5hbWUsCisgICAgc3RkOjp2ZWN0b3I8Q1BERlNES19XaWRnZXQqPiogd2lkZ2V0cykgY29uc3QgeworICBmb3IgKGludCBpID0gMCwgc3ogPSBtX3BJbnRlckZvcm0tPkNvdW50RmllbGRzKHNGaWVsZE5hbWUpOyBpIDwgc3o7ICsraSkgeworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gbV9wSW50ZXJGb3JtLT5HZXRGaWVsZChpLCBzRmllbGROYW1lKTsKKyAgICBBU1NFUlQocEZvcm1GaWVsZCk7CisgICAgR2V0V2lkZ2V0cyhwRm9ybUZpZWxkLCB3aWRnZXRzKTsKKyAgfQogfQogCi12b2lkIENQREZTREtfSW50ZXJGb3JtOjpHZXRXaWRnZXRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRmllbGROYW1lLCBDRlhfUHRyQXJyYXkmIHdpZGdldHMpCi17Ci0JQVNTRVJUKG1fcEludGVyRm9ybSAhPSBOVUxMKTsKLQotCWZvciAoaW50IGk9MCxzej1tX3BJbnRlckZvcm0tPkNvdW50RmllbGRzKHNGaWVsZE5hbWUpOyBpPHN6OyBpKyspCi0JewotCQlDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IG1fcEludGVyRm9ybS0+R2V0RmllbGQoaSwgc0ZpZWxkTmFtZSk7Ci0JCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0JCUdldFdpZGdldHMocEZvcm1GaWVsZCwgd2lkZ2V0cyk7CQotCX0KK3ZvaWQgQ1BERlNES19JbnRlckZvcm06OkdldFdpZGdldHMoCisgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwKKyAgICBzdGQ6OnZlY3RvcjxDUERGU0RLX1dpZGdldCo+KiB3aWRnZXRzKSBjb25zdCB7CisgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBGaWVsZC0+Q291bnRDb250cm9scygpOyBpIDwgc3o7ICsraSkgeworICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IHBGaWVsZC0+R2V0Q29udHJvbChpKTsKKyAgICBBU1NFUlQocEZvcm1DdHJsKTsKKyAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IEdldFdpZGdldChwRm9ybUN0cmwpOworICAgIGlmIChwV2lkZ2V0KQorICAgICAgd2lkZ2V0cy0+cHVzaF9iYWNrKHBXaWRnZXQpOworICB9CiB9CiAKLXZvaWQgQ1BERlNES19JbnRlckZvcm06OkdldFdpZGdldHMoQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwgQ0ZYX1B0ckFycmF5JiB3aWRnZXRzKQotewotCUFTU0VSVChwRmllbGQgIT0gTlVMTCk7CitpbnQgQ1BERlNES19JbnRlckZvcm06OkdldFBhZ2VJbmRleEJ5QW5ub3REaWN0KAorICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpIGNvbnN0IHsKKyAgQVNTRVJUKHBBbm5vdERpY3QpOwogCi0JZm9yIChpbnQgaT0wLGlzej1wRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaTxpc3o7IGkrKykKLQl7Ci0JCUNQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IHBGaWVsZC0+R2V0Q29udHJvbChpKTsKLQkJQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKKyAgZm9yIChpbnQgaSA9IDAsIHN6ID0gcERvY3VtZW50LT5HZXRQYWdlQ291bnQoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBwRG9jdW1lbnQtPkdldFBhZ2UoaSkpIHsKKyAgICAgIGlmIChDUERGX0FycmF5KiBwQW5ub3RzID0gcFBhZ2VEaWN0LT5HZXRBcnJheSgiQW5ub3RzIikpIHsKKyAgICAgICAgZm9yIChpbnQgaiA9IDAsIGpzeiA9IHBBbm5vdHMtPkdldENvdW50KCk7IGogPCBqc3o7IGorKykgeworICAgICAgICAgIENQREZfT2JqZWN0KiBwRGljdCA9IHBBbm5vdHMtPkdldEVsZW1lbnRWYWx1ZShqKTsKKyAgICAgICAgICBpZiAocEFubm90RGljdCA9PSBwRGljdCkgeworICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CiAKLQkJQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBHZXRXaWRnZXQocEZvcm1DdHJsKTsKLQotCQlpZiAocFdpZGdldCkKLQkJCXdpZGdldHMuQWRkKHBXaWRnZXQpOwotCX0KKyAgcmV0dXJuIC0xOwogfQogCi1pbnQgQ1BERlNES19JbnRlckZvcm06OkdldFBhZ2VJbmRleEJ5QW5ub3REaWN0KENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KSBjb25zdAotewotCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7Ci0JQVNTRVJUKHBBbm5vdERpY3QgIT0gTlVMTCk7Ci0KLQlmb3IgKGludCBpPTAsc3o9cERvY3VtZW50LT5HZXRQYWdlQ291bnQoKTsgaTxzejsgaSsrKQotCXsKLQkJaWYgKENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcERvY3VtZW50LT5HZXRQYWdlKGkpKQotCQl7CQkJCi0JCQlpZiAoQ1BERl9BcnJheSogcEFubm90cyA9IHBQYWdlRGljdC0+R2V0QXJyYXkoIkFubm90cyIpKQotCQkJewotCQkJCWZvciAoaW50IGo9MCxqc3o9cEFubm90cy0+R2V0Q291bnQoKTsgajxqc3o7IGorKykKLQkJCQl7Ci0JCQkJCUNQREZfT2JqZWN0KiBwRGljdCA9IHBBbm5vdHMtPkdldEVsZW1lbnRWYWx1ZShqKTsKLQkJCQkJaWYgKHBBbm5vdERpY3QgPT0gcERpY3QpCi0JCQkJCXsKLQkJCQkJCXJldHVybiBpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIC0xOwordm9pZCBDUERGU0RLX0ludGVyRm9ybTo6QWRkTWFwKENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KSB7CisgIG1fTWFwW3BDb250cm9sXSA9IHBXaWRnZXQ7CiB9CiAKLXZvaWQgQ1BERlNES19JbnRlckZvcm06OkFkZE1hcChDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCwgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQpCi17Ci0JbV9NYXAuU2V0QXQocENvbnRyb2wsIHBXaWRnZXQpOwordm9pZCBDUERGU0RLX0ludGVyRm9ybTo6UmVtb3ZlTWFwKENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sKSB7CisgIG1fTWFwLmVyYXNlKHBDb250cm9sKTsKIH0KIAotdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6UmVtb3ZlTWFwKENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sKQotewotCW1fTWFwLlJlbW92ZUtleShwQ29udHJvbCk7Cit2b2lkIENQREZTREtfSW50ZXJGb3JtOjpFbmFibGVDYWxjdWxhdGUoRlhfQk9PTCBiRW5hYmxlZCkgeworICBtX2JDYWxjdWxhdGUgPSBiRW5hYmxlZDsKIH0KIAotdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6RW5hYmxlQ2FsY3VsYXRlKEZYX0JPT0wgYkVuYWJsZWQpCi17Ci0JbV9iQ2FsY3VsYXRlID0gYkVuYWJsZWQ7CitGWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpJc0NhbGN1bGF0ZUVuYWJsZWQoKSBjb25zdCB7CisgIHJldHVybiBtX2JDYWxjdWxhdGU7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OklzQ2FsY3VsYXRlRW5hYmxlZCgpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fYkNhbGN1bGF0ZTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQordm9pZCBDUERGU0RLX0ludGVyRm9ybTo6QWRkWEZBTWFwKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfWEZBV2lkZ2V0KiBwV2lkZ2V0KSB7CisgIG1fWEZBTWFwLlNldEF0KGhXaWRnZXQsIHBXaWRnZXQpOwogfQogCi0jaWZkZWYgX1dJTjMyCi1DUERGX1N0cmVhbSogQ1BERlNES19JbnRlckZvcm06OkxvYWRJbWFnZUZyb21GaWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRmlsZSkKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0JQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCk7Ci0JQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKLQotCUNQREZfU3RyZWFtKiBwUmV0U3RyZWFtID0gTlVMTDsKLQotCWlmIChDRlhfRElCaXRtYXAqIHBCbXAgPSBDRlhfV2luZG93c0RJQjo6TG9hZEZyb21GaWxlKHNGaWxlLmNfc3RyKCkpKQotCXsKLQkJaW50IG5XaWR0aCA9IHBCbXAtPkdldFdpZHRoKCk7Ci0JCWludCBuSGVpZ2h0ID0gcEJtcC0+R2V0SGVpZ2h0KCk7Ci0KLQkJQ1BERl9JbWFnZSBJbWFnZShwRG9jdW1lbnQpOwotCQlJbWFnZS5TZXRJbWFnZShwQm1wLCBGQUxTRSk7Ci0JCUNQREZfU3RyZWFtKiBwSW1hZ2VTdHJlYW0gPSBJbWFnZS5HZXRTdHJlYW0oKTsKLQkJaWYgKHBJbWFnZVN0cmVhbSkKLQkJewotCQkJaWYgKHBJbWFnZVN0cmVhbS0+R2V0T2JqTnVtKCkgPT0gMCkKLQkJCQlwRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBJbWFnZVN0cmVhbSk7Ci0KLQkJCUNQREZfRGljdGlvbmFyeSogcFN0cmVhbURpY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5KCk7Ci0JCQlwU3RyZWFtRGljdC0+U2V0QXROYW1lKCJTdWJ0eXBlIiwgIkZvcm0iKTsKLQkJCXBTdHJlYW1EaWN0LT5TZXRBdE5hbWUoIk5hbWUiLCAiSU1HIik7Ci0JCQlDUERGX0FycmF5KiBwTWF0cml4ID0gbmV3IENQREZfQXJyYXkoKTsKLQkJCXBTdHJlYW1EaWN0LT5TZXRBdCgiTWF0cml4IiwgcE1hdHJpeCk7Ci0JCQlwTWF0cml4LT5BZGRJbnRlZ2VyKDEpOwotCQkJcE1hdHJpeC0+QWRkSW50ZWdlcigwKTsKLQkJCXBNYXRyaXgtPkFkZEludGVnZXIoMCk7Ci0JCQlwTWF0cml4LT5BZGRJbnRlZ2VyKDEpOwotCQkJcE1hdHJpeC0+QWRkSW50ZWdlcigtbldpZHRoIC8gMik7Ci0JCQlwTWF0cml4LT5BZGRJbnRlZ2VyKC1uSGVpZ2h0IC8gMik7Ci0JCQlDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZSA9IG5ldyBDUERGX0RpY3Rpb25hcnkoKTsKLQkJCXBTdHJlYW1EaWN0LT5TZXRBdCgiUmVzb3VyY2VzIiwgcFJlc291cmNlKTsKLQkJCUNQREZfRGljdGlvbmFyeSogcFhPYmplY3QgPSBuZXcgQ1BERl9EaWN0aW9uYXJ5KCk7Ci0JCQlwUmVzb3VyY2UtPlNldEF0KCJYT2JqZWN0IiwgcFhPYmplY3QpOwotCQkJcFhPYmplY3QtPlNldEF0UmVmZXJlbmNlKCJJbWciLCBwRG9jdW1lbnQsIHBJbWFnZVN0cmVhbSk7Ci0JCQlDUERGX0FycmF5KiBwUHJvY1NldCA9IG5ldyBDUERGX0FycmF5KCk7Ci0JCQlwUmVzb3VyY2UtPlNldEF0KCJQcm9jU2V0IiwgcFByb2NTZXQpOwotCQkJcFByb2NTZXQtPkFkZE5hbWUoIlBERiIpOwotCQkJcFByb2NTZXQtPkFkZE5hbWUoIkltYWdlQyIpOwotCQkJcFN0cmVhbURpY3QtPlNldEF0TmFtZSgiVHlwZSIsICJYT2JqZWN0Iik7Ci0JCQlDUERGX0FycmF5KiBwQkJveCA9IG5ldyBDUERGX0FycmF5KCk7Ci0JCQlwU3RyZWFtRGljdC0+U2V0QXQoIkJCb3giLCBwQkJveCk7Ci0JCQlwQkJveC0+QWRkSW50ZWdlcigwKTsKLQkJCXBCQm94LT5BZGRJbnRlZ2VyKDApOwotCQkJcEJCb3gtPkFkZEludGVnZXIobldpZHRoKTsKLQkJCXBCQm94LT5BZGRJbnRlZ2VyKG5IZWlnaHQpOwotCQkJcFN0cmVhbURpY3QtPlNldEF0SW50ZWdlcigiRm9ybVR5cGUiLCAxKTsKLQotCQkJcFJldFN0cmVhbSA9IG5ldyBDUERGX1N0cmVhbShOVUxMLCAwLCBOVUxMKTsKLQkJCUNGWF9CeXRlU3RyaW5nIGNzU3RyZWFtOwotCQkJY3NTdHJlYW0uRm9ybWF0KCJxXG4lZCAwIDAgJWQgMCAwIGNtXG4vSW1nIERvXG5RIiwgbldpZHRoLCBuSGVpZ2h0KTsKLQkJCXBSZXRTdHJlYW0tPkluaXRTdHJlYW0oKEZYX0JZVEUqKWNzU3RyZWFtLmNfc3RyKCksIGNzU3RyZWFtLkdldExlbmd0aCgpLCBwU3RyZWFtRGljdCk7Ci0JCQlwRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHBSZXRTdHJlYW0pOwotCQl9Ci0KLQkJZGVsZXRlIHBCbXA7Ci0JfQotCi0JcmV0dXJuIHBSZXRTdHJlYW07Ci19Ci0jZW5kaWYKLQotdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6T25DYWxjdWxhdGUoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQpCi17Ci0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BEb2N1bWVudC0+R2V0RW52KCk7Ci0JQVNTRVJUKHBFbnYpOwotCWlmKCFwRW52LT5Jc0pTSW5pdGlhdGVkKCkpCi0JCXJldHVybjsKLQotCWlmIChtX2JCdXN5KSByZXR1cm47Ci0KLQltX2JCdXN5ID0gVFJVRTsKLQotCWlmICh0aGlzLT5Jc0NhbGN1bGF0ZUVuYWJsZWQoKSkKLQl7Ci0JCUlGWEpTX1J1bnRpbWUqIHBSdW50aW1lID0gbV9wRG9jdW1lbnQtPkdldEpzUnVudGltZSgpOwotCQlBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7Ci0KLQkJcFJ1bnRpbWUtPlNldFJlYWRlckRvY3VtZW50KG1fcERvY3VtZW50KTsKLQotCQlpbnQgblNpemUgPSBtX3BJbnRlckZvcm0tPkNvdW50RmllbGRzSW5DYWxjdWxhdGlvbk9yZGVyKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxuU2l6ZTsgaSsrKQotCQl7Ci0JCQlpZihDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gbV9wSW50ZXJGb3JtLT5HZXRGaWVsZEluQ2FsY3VsYXRpb25PcmRlcihpKSkKLQkJCXsKLS8vCQkJQVNTRVJUKHBGaWVsZCAhPSBOVUxMKTsKLQkJCQlpbnQgblR5cGUgPSBwRmllbGQtPkdldEZpZWxkVHlwZSgpOwotCQkJCWlmIChuVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1ggfHwgblR5cGUgPT0gRklFTERUWVBFX1RFWFRGSUVMRCkKLQkJCQl7Ci0JCQkJCUNQREZfQUFjdGlvbiBhQWN0aW9uID0gcEZpZWxkLT5HZXRBZGRpdGlvbmFsQWN0aW9uKCk7Ci0JCQkJCWlmIChhQWN0aW9uICYmIGFBY3Rpb24uQWN0aW9uRXhpc3QoQ1BERl9BQWN0aW9uOjpDYWxjdWxhdGUpKQotCQkJCQl7Ci0JCQkJCQlDUERGX0FjdGlvbiBhY3Rpb24gPSBhQWN0aW9uLkdldEFjdGlvbihDUERGX0FBY3Rpb246OkNhbGN1bGF0ZSk7Ci0JCQkJCQlpZiAoYWN0aW9uKQotCQkJCQkJewotCQkJCQkJCUNGWF9XaWRlU3RyaW5nIGNzSlMgPSBhY3Rpb24uR2V0SmF2YVNjcmlwdCgpOwotCQkJCQkJCWlmICghY3NKUy5Jc0VtcHR5KCkpCi0JCQkJCQkJewotCQkJCQkJCQlJRlhKU19Db250ZXh0KiBwQ29udGV4dCA9IHBSdW50aW1lLT5OZXdDb250ZXh0KCk7Ci0JCQkJCQkJCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQkJCQkJCQkJCi0JCQkJCQkJCUNGWF9XaWRlU3RyaW5nIHNPbGRWYWx1ZSA9IHBGaWVsZC0+R2V0VmFsdWUoKTsKLQkJCQkJCQkJQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlID0gc09sZFZhbHVlOwotCQkJCQkJCQlGWF9CT09MIGJSQyA9IFRSVUU7Ci0JCQkJCQkJCXBDb250ZXh0LT5PbkZpZWxkX0NhbGN1bGF0ZShwRm9ybUZpZWxkLCBwRmllbGQsIHNWYWx1ZSwgYlJDKTsKLQkJCQkJCQkJCi0JCQkJCQkJCUNGWF9XaWRlU3RyaW5nIHNJbmZvOwotCQkJCQkJCQlGWF9CT09MIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KGNzSlMsIHNJbmZvKTsKLQkJCQkJCQkJcFJ1bnRpbWUtPlJlbGVhc2VDb250ZXh0KHBDb250ZXh0KTsKLQkJCQkJCQkJCi0JCQkJCQkJCWlmIChiUmV0KQotCQkJCQkJCQl7Ci0JCQkJCQkJCQlpZiAoYlJDKQotCQkJCQkJCQkJewotCQkJCQkJCQkJCWlmIChzVmFsdWUuQ29tcGFyZShzT2xkVmFsdWUpICE9IDApCi0JCQkJCQkJCQkJCXBGaWVsZC0+U2V0VmFsdWUoc1ZhbHVlLCBUUlVFKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCQotCX0KLQotCW1fYkJ1c3kgPSBGQUxTRTsKK3ZvaWQgQ1BERlNES19JbnRlckZvcm06OlJlbW92ZVhGQU1hcChJWEZBX1dpZGdldCogaFdpZGdldCkgeworICBtX1hGQU1hcC5SZW1vdmVLZXkoaFdpZGdldCk7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQREZTREtfSW50ZXJGb3JtOjpPbkZvcm1hdChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgaW50IG5Db21taXRLZXksIEZYX0JPT0wmIGJGb3JtYXRlZCkKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0JQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CitDUERGU0RLX1hGQVdpZGdldCogQ1BERlNES19JbnRlckZvcm06OkdldFhGQVdpZGdldChJWEZBX1dpZGdldCogaFdpZGdldCkgeworICBDUERGU0RLX1hGQVdpZGdldCogcFdpZGdldCA9IE5VTEw7CisgIG1fWEZBTWFwLkxvb2t1cChoV2lkZ2V0LCBwV2lkZ2V0KTsKIAotCUNGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IHBGb3JtRmllbGQtPkdldFZhbHVlKCk7Ci0JQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcERvY3VtZW50LT5HZXRFbnYoKTsKLQlBU1NFUlQocEVudik7Ci0JaWYoIXBFbnYtPklzSlNJbml0aWF0ZWQoKSkKLQl7Ci0JCWJGb3JtYXRlZCA9IEZBTFNFOwotCQlyZXR1cm4gc1ZhbHVlOwotCX0gCi0KLQlJRlhKU19SdW50aW1lKiBwUnVudGltZSA9IG1fcERvY3VtZW50LT5HZXRKc1J1bnRpbWUoKTsKLQlBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7Ci0JCi0JcFJ1bnRpbWUtPlNldFJlYWRlckRvY3VtZW50KG1fcERvY3VtZW50KTsKLQotCWlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfQ09NQk9CT1gpCi0JewotCQlpZiAocEZvcm1GaWVsZC0+Q291bnRTZWxlY3RlZEl0ZW1zKCkgPiAwKQotCQl7Ci0JCQlpbnQgaW5kZXggPSBwRm9ybUZpZWxkLT5HZXRTZWxlY3RlZEluZGV4KDApOwotCQkJaWYgKGluZGV4ID49IDApCi0JCQkJc1ZhbHVlID0gcEZvcm1GaWVsZC0+R2V0T3B0aW9uTGFiZWwoaW5kZXgpOwotCQl9Ci0JfQotCi0JYkZvcm1hdGVkID0gRkFMU0U7Ci0KLQlDUERGX0FBY3Rpb24gYUFjdGlvbiA9IHBGb3JtRmllbGQtPkdldEFkZGl0aW9uYWxBY3Rpb24oKTsKLQlpZiAoYUFjdGlvbiAhPSBOVUxMICYmIGFBY3Rpb24uQWN0aW9uRXhpc3QoQ1BERl9BQWN0aW9uOjpGb3JtYXQpKSAKLQl7Ci0JCUNQREZfQWN0aW9uIGFjdGlvbiA9IGFBY3Rpb24uR2V0QWN0aW9uKENQREZfQUFjdGlvbjo6Rm9ybWF0KTsKLQkJaWYgKGFjdGlvbikKLQkJewkJCQotCQkJQ0ZYX1dpZGVTdHJpbmcgc2NyaXB0ID0gYWN0aW9uLkdldEphdmFTY3JpcHQoKTsKLQkJCWlmICghc2NyaXB0LklzRW1wdHkoKSkKLQkJCXsKLQkJCQlDRlhfV2lkZVN0cmluZyBWYWx1ZSA9IHNWYWx1ZTsKLQotCQkJCUlGWEpTX0NvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0NvbnRleHQoKTsKLQkJCQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0KLQkJCQlwQ29udGV4dC0+T25GaWVsZF9Gb3JtYXQobkNvbW1pdEtleSwgcEZvcm1GaWVsZCwgVmFsdWUsIFRSVUUpOwotCQkJCi0JCQkJQ0ZYX1dpZGVTdHJpbmcgc0luZm87Ci0gCQkJCUZYX0JPT0wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoc2NyaXB0LCBzSW5mbyk7Ci0JCQkJcFJ1bnRpbWUtPlJlbGVhc2VDb250ZXh0KHBDb250ZXh0KTsKLQotCQkJCWlmIChiUmV0KQotCQkJCXsKLQkJCQkJc1ZhbHVlID0gVmFsdWU7Ci0JCQkJCWJGb3JtYXRlZCA9IFRSVUU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIHNWYWx1ZTsKKyAgcmV0dXJuIHBXaWRnZXQ7CiB9CiAKLXZvaWQgQ1BERlNES19JbnRlckZvcm06OlJlc2V0RmllbGRBcHBlYXJhbmNlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBGWF9MUENXU1RSIHNWYWx1ZSwgRlhfQk9PTCBiVmFsdWVDaGFuZ2VkKQotewotCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0JZm9yIChpbnQgaT0wLHN6PXBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaTxzejsgaSsrKQotCXsKLQkJQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gcEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKTsKLQkJQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKLQotCQlBU1NFUlQobV9wSW50ZXJGb3JtICE9IE5VTEwpOwotCQlpZihDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IEdldFdpZGdldChwRm9ybUN0cmwpKQotCQkJcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKHNWYWx1ZSwgYlZhbHVlQ2hhbmdlZCk7Ci0JfQordm9pZCBDUERGU0RLX0ludGVyRm9ybTo6WGZhRW5hYmxlQ2FsY3VsYXRlKEZYX0JPT0wgYkVuYWJsZWQpIHsKKyAgbV9iWGZhQ2FsY3VsYXRlID0gYkVuYWJsZWQ7Cit9CitGWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpJc1hmYUNhbGN1bGF0ZUVuYWJsZWQoKSBjb25zdCB7CisgIHJldHVybiBtX2JYZmFDYWxjdWxhdGU7CiB9CiAKLXZvaWQgQ1BERlNES19JbnRlckZvcm06OlVwZGF0ZUZpZWxkKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkKQotewotCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6SXNYZmFWYWxpZGF0aW9uc0VuYWJsZWQoKSB7CisgIHJldHVybiBtX2JYZmFWYWxpZGF0aW9uc0VuYWJsZWQ7Cit9Cit2b2lkIENQREZTREtfSW50ZXJGb3JtOjpYZmFTZXRWYWxpZGF0aW9uc0VuYWJsZWQoRlhfQk9PTCBiRW5hYmxlZCkgeworICBtX2JYZmFWYWxpZGF0aW9uc0VuYWJsZWQgPSBiRW5hYmxlZDsKK30KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAotCWZvciAoaW50IGk9MCxzej1wRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGk8c3o7IGkrKykKLQl7Ci0JCUNQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woaSk7Ci0JCUFTU0VSVChwRm9ybUN0cmwgIT0gTlVMTCk7Cit2b2lkIENQREZTREtfSW50ZXJGb3JtOjpPbkNhbGN1bGF0ZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCkgeworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRG9jdW1lbnQtPkdldEVudigpOworICBBU1NFUlQocEVudik7CisgIGlmICghcEVudi0+SXNKU0luaXRpYXRlZCgpKQorICAgIHJldHVybjsKIAotCQlpZihDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IEdldFdpZGdldChwRm9ybUN0cmwpKQotCQl7Ci0JCQlDUERGRG9jX0Vudmlyb25tZW50ICogcEVudiA9IG1fcERvY3VtZW50LT5HZXRFbnYoKTsKLQkJCUNGRkxfSUZvcm1GaWxsZXIqIHBJRm9ybUZpbGxlciA9IHBFbnYtPkdldElGb3JtRmlsbGVyKCk7Ci0JCQkKLQkJCUNQREZfUGFnZSAqIHBQYWdlID0gcFdpZGdldC0+R2V0UERGUGFnZSgpOwotCQkJQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldyA9IG1fcERvY3VtZW50LT5HZXRQYWdlVmlldyhwUGFnZSxGQUxTRSk7CisgIGlmIChtX2JCdXN5KQorICAgIHJldHVybjsKIAotCQkJRlhfUkVDVCByY0JCb3ggPSBwSUZvcm1GaWxsZXItPkdldFZpZXdCQm94KHBQYWdlVmlldywgcFdpZGdldCk7CisgIG1fYkJ1c3kgPSBUUlVFOwogCi0JCQlwRW52LT5GRklfSW52YWxpZGF0ZShwUGFnZSxyY0JCb3gubGVmdCwgcmNCQm94LnRvcCwgcmNCQm94LnJpZ2h0LCByY0JCb3guYm90dG9tKTsKLQkJfQotCX0KKyAgaWYgKElzQ2FsY3VsYXRlRW5hYmxlZCgpKSB7CisgICAgSUpTX1J1bnRpbWUqIHBSdW50aW1lID0gbV9wRG9jdW1lbnQtPkdldEpzUnVudGltZSgpOworICAgIHBSdW50aW1lLT5TZXRSZWFkZXJEb2N1bWVudChtX3BEb2N1bWVudCk7CisKKyAgICBpbnQgblNpemUgPSBtX3BJbnRlckZvcm0tPkNvdW50RmllbGRzSW5DYWxjdWxhdGlvbk9yZGVyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuU2l6ZTsgaSsrKSB7CisgICAgICBpZiAoQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9CisgICAgICAgICAgICAgIG1fcEludGVyRm9ybS0+R2V0RmllbGRJbkNhbGN1bGF0aW9uT3JkZXIoaSkpIHsKKyAgICAgICAgaW50IG5UeXBlID0gcEZpZWxkLT5HZXRGaWVsZFR5cGUoKTsKKyAgICAgICAgaWYgKG5UeXBlID09IEZJRUxEVFlQRV9DT01CT0JPWCB8fCBuVHlwZSA9PSBGSUVMRFRZUEVfVEVYVEZJRUxEKSB7CisgICAgICAgICAgQ1BERl9BQWN0aW9uIGFBY3Rpb24gPSBwRmllbGQtPkdldEFkZGl0aW9uYWxBY3Rpb24oKTsKKyAgICAgICAgICBpZiAoYUFjdGlvbiAmJiBhQWN0aW9uLkFjdGlvbkV4aXN0KENQREZfQUFjdGlvbjo6Q2FsY3VsYXRlKSkgeworICAgICAgICAgICAgQ1BERl9BY3Rpb24gYWN0aW9uID0gYUFjdGlvbi5HZXRBY3Rpb24oQ1BERl9BQWN0aW9uOjpDYWxjdWxhdGUpOworICAgICAgICAgICAgaWYgKGFjdGlvbikgeworICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc0pTID0gYWN0aW9uLkdldEphdmFTY3JpcHQoKTsKKyAgICAgICAgICAgICAgaWYgKCFjc0pTLklzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIElKU19Db250ZXh0KiBwQ29udGV4dCA9IHBSdW50aW1lLT5OZXdDb250ZXh0KCk7CisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc09sZFZhbHVlID0gcEZpZWxkLT5HZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IHNPbGRWYWx1ZTsKKyAgICAgICAgICAgICAgICBGWF9CT09MIGJSQyA9IFRSVUU7CisgICAgICAgICAgICAgICAgcENvbnRleHQtPk9uRmllbGRfQ2FsY3VsYXRlKHBGb3JtRmllbGQsIHBGaWVsZCwgc1ZhbHVlLCBiUkMpOworCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc0luZm87CisgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChjc0pTLCAmc0luZm8pOworICAgICAgICAgICAgICAgIHBSdW50aW1lLT5SZWxlYXNlQ29udGV4dChwQ29udGV4dCk7CisKKyAgICAgICAgICAgICAgICBpZiAoYlJldCkgeworICAgICAgICAgICAgICAgICAgaWYgKGJSQykgeworICAgICAgICAgICAgICAgICAgICBpZiAoc1ZhbHVlLkNvbXBhcmUoc09sZFZhbHVlKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgIHBGaWVsZC0+U2V0VmFsdWUoc1ZhbHVlLCBUUlVFKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBtX2JCdXN5ID0gRkFMU0U7CiB9CiAKLXZvaWQgQ1BERlNES19JbnRlckZvcm06Ok9uS2V5U3Ryb2tlQ29tbWl0KENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSwgRlhfQk9PTCYgYlJDKQotewotCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworQ0ZYX1dpZGVTdHJpbmcgQ1BERlNES19JbnRlckZvcm06Ok9uRm9ybWF0KENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJGb3JtYXRlZCkgeworICBDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSBwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpOworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRG9jdW1lbnQtPkdldEVudigpOworICBBU1NFUlQocEVudik7CisgIGlmICghcEVudi0+SXNKU0luaXRpYXRlZCgpKSB7CisgICAgYkZvcm1hdGVkID0gRkFMU0U7CisgICAgcmV0dXJuIHNWYWx1ZTsKKyAgfQogCi0gCUNQREZfQUFjdGlvbiBhQWN0aW9uID0gcEZvcm1GaWVsZC0+R2V0QWRkaXRpb25hbEFjdGlvbigpOwotIAlpZiAoYUFjdGlvbiAhPSBOVUxMICYmIGFBY3Rpb24uQWN0aW9uRXhpc3QoQ1BERl9BQWN0aW9uOjpLZXlTdHJva2UpKSAKLSAJewotIAkJQ1BERl9BY3Rpb24gYWN0aW9uID0gYUFjdGlvbi5HZXRBY3Rpb24oQ1BERl9BQWN0aW9uOjpLZXlTdHJva2UpOwotIAkJaWYgKGFjdGlvbikKLSAJCXsJCQkgCi0gCQkJQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotIAkJCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BEb2N1bWVudC0+R2V0RW52KCk7Ci0gCQkJQVNTRVJUKHBFbnYgIT0gTlVMTCk7CisgIElKU19SdW50aW1lKiBwUnVudGltZSA9IG1fcERvY3VtZW50LT5HZXRKc1J1bnRpbWUoKTsKKyAgcFJ1bnRpbWUtPlNldFJlYWRlckRvY3VtZW50KG1fcERvY3VtZW50KTsKIAotCQkJQ1BERlNES19BY3Rpb25IYW5kbGVyKiBwQWN0aW9uSGFuZGxlciA9IHBFbnYtPkdldEFjdGlvbkhhbmRlcigpOwotCQkJQVNTRVJUKHBBY3Rpb25IYW5kbGVyICE9IE5VTEwpOwotCQotCQkJUERGU0RLX0ZpZWxkQWN0aW9uIGZhOwotCQkJZmEuYk1vZGlmaWVyID0gcEVudi0+RkZJX0lzQ1RSTEtleURvd24oMCk7Ci0gCQkJZmEuYlNoaWZ0ID0gcEVudi0+RkZJX0lzU0hJRlRLZXlEb3duKDApOwotCQkJZmEuc1ZhbHVlID0gY3NWYWx1ZTsKKyAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9DT01CT0JPWCkgeworICAgIGlmIChwRm9ybUZpZWxkLT5Db3VudFNlbGVjdGVkSXRlbXMoKSA+IDApIHsKKyAgICAgIGludCBpbmRleCA9IHBGb3JtRmllbGQtPkdldFNlbGVjdGVkSW5kZXgoMCk7CisgICAgICBpZiAoaW5kZXggPj0gMCkKKyAgICAgICAgc1ZhbHVlID0gcEZvcm1GaWVsZC0+R2V0T3B0aW9uTGFiZWwoaW5kZXgpOworICAgIH0KKyAgfQogCi0gICAJCQlwQWN0aW9uSGFuZGxlci0+RG9BY3Rpb25fRmllbGRKYXZhU2NyaXB0KGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2UsIAotICAgCQkJCW1fcERvY3VtZW50LCBwRm9ybUZpZWxkLCBmYSk7Ci0gICAJCQliUkMgPSBmYS5iUkM7Ci0gCQl9Ci0gCX0KKyAgYkZvcm1hdGVkID0gRkFMU0U7CisKKyAgQ1BERl9BQWN0aW9uIGFBY3Rpb24gPSBwRm9ybUZpZWxkLT5HZXRBZGRpdGlvbmFsQWN0aW9uKCk7CisgIGlmIChhQWN0aW9uICYmIGFBY3Rpb24uQWN0aW9uRXhpc3QoQ1BERl9BQWN0aW9uOjpGb3JtYXQpKSB7CisgICAgQ1BERl9BY3Rpb24gYWN0aW9uID0gYUFjdGlvbi5HZXRBY3Rpb24oQ1BERl9BQWN0aW9uOjpGb3JtYXQpOworICAgIGlmIChhY3Rpb24pIHsKKyAgICAgIENGWF9XaWRlU3RyaW5nIHNjcmlwdCA9IGFjdGlvbi5HZXRKYXZhU2NyaXB0KCk7CisgICAgICBpZiAoIXNjcmlwdC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgVmFsdWUgPSBzVmFsdWU7CisKKyAgICAgICAgSUpTX0NvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0NvbnRleHQoKTsKKyAgICAgICAgcENvbnRleHQtPk9uRmllbGRfRm9ybWF0KHBGb3JtRmllbGQsIFZhbHVlLCBUUlVFKTsKKworICAgICAgICBDRlhfV2lkZVN0cmluZyBzSW5mbzsKKyAgICAgICAgRlhfQk9PTCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzY3JpcHQsICZzSW5mbyk7CisgICAgICAgIHBSdW50aW1lLT5SZWxlYXNlQ29udGV4dChwQ29udGV4dCk7CisKKyAgICAgICAgaWYgKGJSZXQpIHsKKyAgICAgICAgICBzVmFsdWUgPSBWYWx1ZTsKKyAgICAgICAgICBiRm9ybWF0ZWQgPSBUUlVFOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHNWYWx1ZTsKIH0KIAotdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6T25WYWxpZGF0ZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIGNzVmFsdWUsIEZYX0JPT0wmIGJSQykKLXsKLQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotIAlDUERGX0FBY3Rpb24gYUFjdGlvbiA9IHBGb3JtRmllbGQtPkdldEFkZGl0aW9uYWxBY3Rpb24oKTsKLSAJaWYgKGFBY3Rpb24gIT0gTlVMTCAmJiBhQWN0aW9uLkFjdGlvbkV4aXN0KENQREZfQUFjdGlvbjo6VmFsaWRhdGUpKSAKLSAJewotIAkJQ1BERl9BY3Rpb24gYWN0aW9uID0gYUFjdGlvbi5HZXRBY3Rpb24oQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZSk7Ci0JCWlmIChhY3Rpb24pCi0gCQl7CQkKLQkJCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQkJCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BEb2N1bWVudC0+R2V0RW52KCk7Ci0JCQlBU1NFUlQocEVudiAhPSBOVUxMKTsKLQkJCQotCQkJQ1BERlNES19BY3Rpb25IYW5kbGVyKiBwQWN0aW9uSGFuZGxlciA9IHBFbnYtPkdldEFjdGlvbkhhbmRlcigpOwotCQkJQVNTRVJUKHBBY3Rpb25IYW5kbGVyICE9IE5VTEwpOwotCi0JCQlQREZTREtfRmllbGRBY3Rpb24gZmE7Ci0JCQlmYS5iTW9kaWZpZXIgPSBwRW52LT5GRklfSXNDVFJMS2V5RG93bigwKTsKLQkJCWZhLmJTaGlmdCA9IHBFbnYtPkZGSV9Jc1NISUZUS2V5RG93bigwKTsKLQkJCWZhLnNWYWx1ZSA9IGNzVmFsdWU7Ci0KLQkJCXBBY3Rpb25IYW5kbGVyLT5Eb0FjdGlvbl9GaWVsZEphdmFTY3JpcHQoYWN0aW9uLCBDUERGX0FBY3Rpb246OlZhbGlkYXRlLCBtX3BEb2N1bWVudCwgcEZvcm1GaWVsZCwgZmEpOwotCQkJYlJDID0gZmEuYlJDOwotIAkgCi0JCX0KLSAJfQordm9pZCBDUERGU0RLX0ludGVyRm9ybTo6UmVzZXRGaWVsZEFwcGVhcmFuY2UoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogc1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmFsdWVDaGFuZ2VkKSB7CisgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGkpOworICAgIEFTU0VSVChwRm9ybUN0cmwpOworICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IEdldFdpZGdldChwRm9ybUN0cmwpKQorICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKHNWYWx1ZSwgYlZhbHVlQ2hhbmdlZCk7CisgIH0KIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit2b2lkIENQREZTREtfSW50ZXJGb3JtOjpVcGRhdGVGaWVsZChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCkgeworICBmb3IgKGludCBpID0gMCwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGkgPCBzejsgaSsrKSB7CisgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gcEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKTsKKyAgICBBU1NFUlQocEZvcm1DdHJsKTsKIAotRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6RG9BY3Rpb25fSGlkZShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKQotewotCUFTU0VSVChhY3Rpb24pOworICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IEdldFdpZGdldChwRm9ybUN0cmwpKSB7CisgICAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRG9jdW1lbnQtPkdldEVudigpOworICAgICAgQ0ZGTF9JRm9ybUZpbGxlciogcElGb3JtRmlsbGVyID0gcEVudi0+R2V0SUZvcm1GaWxsZXIoKTsKKyAgICAgIFVuZGVybHlpbmdQYWdlVHlwZSogcFBhZ2UgPSBwV2lkZ2V0LT5HZXRVbmRlcmx5aW5nUGFnZSgpOworICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VWaWV3KHBQYWdlLCBGQUxTRSk7CisgICAgICBGWF9SRUNUIHJjQkJveCA9IHBJRm9ybUZpbGxlci0+R2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBwV2lkZ2V0KTsKIAotCUNQREZfQWN0aW9uRmllbGRzIGFmID0gYWN0aW9uLkdldFdpZGdldHMoKTsKLQlDRlhfUHRyQXJyYXkgZmllbGRPYmplY3RzOwotCWFmLkdldEFsbEZpZWxkcyhmaWVsZE9iamVjdHMpOwotCUNGWF9QdHJBcnJheSB3aWRnZXRBcnJheTsKLQlDRlhfUHRyQXJyYXkgZmllbGRzOwotCUdldEZpZWxkRnJvbU9iamVjdHMoZmllbGRPYmplY3RzLCBmaWVsZHMpOwotCi0JRlhfQk9PTCBiSGlkZSA9IGFjdGlvbi5HZXRIaWRlU3RhdHVzKCk7Ci0KLQlGWF9CT09MIGJDaGFuZ2VkID0gRkFMU0U7Ci0JCi0JZm9yIChpbnQgaT0wLCBzej1maWVsZHMuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JewotCQlDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gKENQREZfRm9ybUZpZWxkKilmaWVsZHNbaV07Ci0JCUFTU0VSVChwRmllbGQgIT0gTlVMTCk7Ci0KLQkKLQkJZm9yIChpbnQgaj0wLGpzej1wRmllbGQtPkNvdW50Q29udHJvbHMoKTsgajxqc3o7IGorKykKLQkJewotCQkJQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBwRmllbGQtPkdldENvbnRyb2woaik7Ci0JCQlBU1NFUlQocENvbnRyb2wgIT0gTlVMTCk7Ci0KLQkJCWlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IEdldFdpZGdldChwQ29udHJvbCkpCi0JCQl7Ci0JCQkJaW50IG5GbGFncyA9IHBXaWRnZXQtPkdldEZsYWdzKCk7Ci0JCQkJaWYgKGJIaWRlKQotCQkJCXsKLQkJCQkJbkZsYWdzICY9ICh+QU5OT1RGTEFHX0lOVklTSUJMRSk7Ci0JCQkJCW5GbGFncyAmPSAofkFOTk9URkxBR19OT1ZJRVcpOwotCQkJCQluRmxhZ3MgfD0gKEFOTk9URkxBR19ISURERU4pOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQluRmxhZ3MgJj0gKH5BTk5PVEZMQUdfSU5WSVNJQkxFKTsKLQkJCQkJbkZsYWdzICY9ICh+QU5OT1RGTEFHX0hJRERFTik7Ci0JCQkJCW5GbGFncyAmPSAofkFOTk9URkxBR19OT1ZJRVcpOwotCQkJCX0KLQkJCQlwV2lkZ2V0LT5TZXRGbGFncyhuRmxhZ3MpOwotCi0gCQkJCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBXaWRnZXQtPkdldFBhZ2VWaWV3KCk7Ci0gCQkJCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Ci0gCi0gCQkJCXBQYWdlVmlldy0+VXBkYXRlVmlldyhwV2lkZ2V0KTsKLQotCQkJCWJDaGFuZ2VkID0gVFJVRTsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiBiQ2hhbmdlZDsKKyAgICAgIHBFbnYtPkZGSV9JbnZhbGlkYXRlKHBQYWdlLCByY0JCb3gubGVmdCwgcmNCQm94LnRvcCwgcmNCQm94LnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LmJvdHRvbSk7CisgICAgfQorICB9CiB9CiAKLUZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkRvQWN0aW9uX1N1Ym1pdEZvcm0oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikKLXsKLQlBU1NFUlQoYWN0aW9uKTsKLQlBU1NFUlQobV9wSW50ZXJGb3JtICE9IE5VTEwpOwordm9pZCBDUERGU0RLX0ludGVyRm9ybTo6T25LZXlTdHJva2VDb21taXQoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSQykgeworICBDUERGX0FBY3Rpb24gYUFjdGlvbiA9IHBGb3JtRmllbGQtPkdldEFkZGl0aW9uYWxBY3Rpb24oKTsKKyAgaWYgKGFBY3Rpb24gJiYgYUFjdGlvbi5BY3Rpb25FeGlzdChDUERGX0FBY3Rpb246OktleVN0cm9rZSkpIHsKKyAgICBDUERGX0FjdGlvbiBhY3Rpb24gPSBhQWN0aW9uLkdldEFjdGlvbihDUERGX0FBY3Rpb246OktleVN0cm9rZSk7CisgICAgaWYgKGFjdGlvbikgeworICAgICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcERvY3VtZW50LT5HZXRFbnYoKTsKKyAgICAgIENQREZTREtfQWN0aW9uSGFuZGxlciogcEFjdGlvbkhhbmRsZXIgPSBwRW52LT5HZXRBY3Rpb25IYW5kZXIoKTsKKyAgICAgIFBERlNES19GaWVsZEFjdGlvbiBmYTsKKyAgICAgIGZhLmJNb2RpZmllciA9IHBFbnYtPkZGSV9Jc0NUUkxLZXlEb3duKDApOworICAgICAgZmEuYlNoaWZ0ID0gcEVudi0+RkZJX0lzU0hJRlRLZXlEb3duKDApOworICAgICAgZmEuc1ZhbHVlID0gY3NWYWx1ZTsKIAotCUNGWF9XaWRlU3RyaW5nIHNEZXN0aW5hdGlvbiA9IGFjdGlvbi5HZXRGaWxlUGF0aCgpOwotCWlmIChzRGVzdGluYXRpb24uSXNFbXB0eSgpKSByZXR1cm4gRkFMU0U7Ci0KLQlDUERGX0RpY3Rpb25hcnkqIHBBY3Rpb25EaWN0ID0gYWN0aW9uLkdldERpY3QoKTsKLQlpZiAocEFjdGlvbkRpY3QtPktleUV4aXN0KCJGaWVsZHMiKSkKLQl7Ci0JCUNQREZfQWN0aW9uRmllbGRzIGFmID0gYWN0aW9uLkdldFdpZGdldHMoKTsKLQkJRlhfRFdPUkQgZHdGbGFncyA9IGFjdGlvbi5HZXRGbGFncygpOwotCQkKLQkJQ0ZYX1B0ckFycmF5IGZpZWxkT2JqZWN0czsKLQkJYWYuR2V0QWxsRmllbGRzKGZpZWxkT2JqZWN0cyk7Ci0JCUNGWF9QdHJBcnJheSBmaWVsZHM7Ci0JCUdldEZpZWxkRnJvbU9iamVjdHMoZmllbGRPYmplY3RzLCBmaWVsZHMpOwotCQkKLQkJaWYgKGZpZWxkcy5HZXRTaXplKCkgIT0gMCkKLQkJewotCQkJRlhfQk9PTCBiSW5jbHVkZU9yRXhjbHVkZSA9ICEoZHdGbGFncyAmIDB4MDEpOwotCQkJaWYgKG1fcEludGVyRm9ybS0+Q2hlY2tSZXF1aXJlZEZpZWxkcygmZmllbGRzLCBiSW5jbHVkZU9yRXhjbHVkZSkpCi0JCQl7Ci0JCQkJcmV0dXJuIEZBTFNFOwotCQkJfQotCQkJcmV0dXJuIFN1Ym1pdEZpZWxkcyhzRGVzdGluYXRpb24sIGZpZWxkcywgYkluY2x1ZGVPckV4Y2x1ZGUsIEZBTFNFKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmICggbV9wSW50ZXJGb3JtLT5DaGVja1JlcXVpcmVkRmllbGRzKCkpCi0JCQl7Ci0JCQkJcmV0dXJuIEZBTFNFOwotCQkJfQotCi0JCQlyZXR1cm4gU3VibWl0Rm9ybShzRGVzdGluYXRpb24sIEZBTFNFKTsKLQkJfQotCX0KLQllbHNlCi0JewotCQlpZiAoIG1fcEludGVyRm9ybS0+Q2hlY2tSZXF1aXJlZEZpZWxkcygpKQotCQl7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQotCQlyZXR1cm4gU3VibWl0Rm9ybShzRGVzdGluYXRpb24sIEZBTFNFKTsKLQl9CisgICAgICBwQWN0aW9uSGFuZGxlci0+RG9BY3Rpb25fRmllbGRKYXZhU2NyaXB0KGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcERvY3VtZW50LCBwRm9ybUZpZWxkLCBmYSk7CisgICAgICBiUkMgPSBmYS5iUkM7CisgICAgfQorICB9CiB9CiAKLUZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OlN1Ym1pdEZpZWxkcyhjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NEZXN0aW5hdGlvbiwgY29uc3QgQ0ZYX1B0ckFycmF5JiBmaWVsZHMsCi0JCQkJCQkJCQlGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlLCBGWF9CT09MIGJVcmxFbmNvZGVkKQotewotCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BEb2N1bWVudC0+R2V0RW52KCk7Ci0JQVNTRVJUKHBFbnYgIT0gTlVMTCk7Cit2b2lkIENQREZTREtfSW50ZXJGb3JtOjpPblZhbGlkYXRlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlJDKSB7CisgIENQREZfQUFjdGlvbiBhQWN0aW9uID0gcEZvcm1GaWVsZC0+R2V0QWRkaXRpb25hbEFjdGlvbigpOworICBpZiAoYUFjdGlvbiAmJiBhQWN0aW9uLkFjdGlvbkV4aXN0KENQREZfQUFjdGlvbjo6VmFsaWRhdGUpKSB7CisgICAgQ1BERl9BY3Rpb24gYWN0aW9uID0gYUFjdGlvbi5HZXRBY3Rpb24oQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZSk7CisgICAgaWYgKGFjdGlvbikgeworICAgICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcERvY3VtZW50LT5HZXRFbnYoKTsKKyAgICAgIENQREZTREtfQWN0aW9uSGFuZGxlciogcEFjdGlvbkhhbmRsZXIgPSBwRW52LT5HZXRBY3Rpb25IYW5kZXIoKTsKKyAgICAgIFBERlNES19GaWVsZEFjdGlvbiBmYTsKKyAgICAgIGZhLmJNb2RpZmllciA9IHBFbnYtPkZGSV9Jc0NUUkxLZXlEb3duKDApOworICAgICAgZmEuYlNoaWZ0ID0gcEVudi0+RkZJX0lzU0hJRlRLZXlEb3duKDApOworICAgICAgZmEuc1ZhbHVlID0gY3NWYWx1ZTsKIAotCUNGWF9CeXRlVGV4dEJ1ZiB0ZXh0QnVmOwotCUV4cG9ydEZpZWxkc1RvRkRGVGV4dEJ1ZihmaWVsZHMsIGJJbmNsdWRlT3JFeGNsdWRlLCB0ZXh0QnVmKTsKLQotCUZYX0xQQllURSBwQnVmZmVyID0gdGV4dEJ1Zi5HZXRCdWZmZXIoKTsKLQlGWF9TVFJTSVpFIG5CdWZTaXplID0gdGV4dEJ1Zi5HZXRMZW5ndGgoKTsKLQkKLQlpZiAoYlVybEVuY29kZWQpCi0JewotCQlpZighRkRGVG9VUkxFbmNvZGVkRGF0YShwQnVmZmVyLCBuQnVmU2l6ZSkpCi0JCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JcEVudi0+SlNfZG9jU3VibWl0Rm9ybShwQnVmZmVyLCBuQnVmU2l6ZSwgY3NEZXN0aW5hdGlvbi5jX3N0cigpKTsKLQkKLQlyZXR1cm4gVFJVRTsKKyAgICAgIHBBY3Rpb25IYW5kbGVyLT5Eb0FjdGlvbl9GaWVsZEphdmFTY3JpcHQoYWN0aW9uLCBDUERGX0FBY3Rpb246OlZhbGlkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BEb2N1bWVudCwgcEZvcm1GaWVsZCwgZmEpOworICAgICAgYlJDID0gZmEuYlJDOworICAgIH0KKyAgfQogfQogCi12b2lkIENQREZTREtfSW50ZXJGb3JtOjpEb0ZERkJ1ZmZlcihDRlhfQnl0ZVN0cmluZyBzQnVmZmVyKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkRvQWN0aW9uX0hpZGUoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikgeworICBBU1NFUlQoYWN0aW9uKTsKIAotCWlmIChDRkRGX0RvY3VtZW50ICpwRkRGRG9jdW1lbnQgPSBDRkRGX0RvY3VtZW50OjpQYXJzZU1lbW9yeSgoY29uc3QgdW5zaWduZWQgY2hhciAqKXNCdWZmZXIuR2V0QnVmZmVyKHNCdWZmZXIuR2V0TGVuZ3RoKCkpLCBzQnVmZmVyLkdldExlbmd0aCgpKSkKLQl7CQkJCQkJCi0JCUNQREZfRGljdGlvbmFyeSogcFJvb3REaWMgPSBwRkRGRG9jdW1lbnQtPkdldFJvb3QoKTsKLQkJaWYocFJvb3REaWMpCi0JCXsKLQkJCUNQREZfRGljdGlvbmFyeSAqIHBGREZEaWN0PXBSb290RGljLT5HZXREaWN0KCJGREYiKTsKLQkJCWlmKHBGREZEaWN0KQotCQkJewkJCi0JCQkJQ1BERl9EaWN0aW9uYXJ5ICogcEpTRGljdCA9IHBGREZEaWN0LT5HZXREaWN0KCJKYXZhU2NyaXB0Iik7Ci0JCQkJaWYocEpTRGljdCkKLQkJCQl7Ci0JCQkJCUNGWF9XaWRlU3RyaW5nIGNzSlM7Ci0JCQkJCi0JCQkJCUNQREZfT2JqZWN0KiBwSlMgPSBwSlNEaWN0LT5HZXRFbGVtZW50VmFsdWUoIkJlZm9yZSIpOwotCQkJCQlpZiAocEpTICE9IE5VTEwpCi0JCQkJCXsKLQkJCQkJCWludCBpVHlwZSA9IHBKUy0+R2V0VHlwZSgpOwotCQkJCQkJaWYgKGlUeXBlID09IFBERk9CSl9TVFJJTkcpCi0JCQkJCQkJY3NKUyA9IHBKU0RpY3QtPkdldFVuaWNvZGVUZXh0KCJCZWZvcmUiKTsKLQkJCQkJCWVsc2UgaWYgKGlUeXBlID09IFBERk9CSl9TVFJFQU0pCi0JCQkJCQkJY3NKUyA9IHBKUy0+R2V0VW5pY29kZVRleHQoKTsKLQkJCQkJfQotCQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZGVsZXRlIHBGREZEb2N1bWVudDsKLQl9CisgIENQREZfQWN0aW9uRmllbGRzIGFmID0gYWN0aW9uLkdldFdpZGdldHMoKTsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9PYmplY3QqPiBmaWVsZE9iamVjdHMgPSBhZi5HZXRBbGxGaWVsZHMoKTsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBmaWVsZHMgPSBHZXRGaWVsZEZyb21PYmplY3RzKGZpZWxkT2JqZWN0cyk7CiAKLQlzQnVmZmVyLlJlbGVhc2VCdWZmZXIoKTsKKyAgRlhfQk9PTCBiSGlkZSA9IGFjdGlvbi5HZXRIaWRlU3RhdHVzKCk7CisgIEZYX0JPT0wgYkNoYW5nZWQgPSBGQUxTRTsKKworICBmb3IgKENQREZfRm9ybUZpZWxkKiBwRmllbGQgOiBmaWVsZHMpIHsKKyAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaSA8IHN6OyArK2kpIHsKKyAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gcEZpZWxkLT5HZXRDb250cm9sKGkpOworICAgICAgQVNTRVJUKHBDb250cm9sKTsKKworICAgICAgaWYgKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gR2V0V2lkZ2V0KHBDb250cm9sKSkgeworICAgICAgICBpbnQgbkZsYWdzID0gcFdpZGdldC0+R2V0RmxhZ3MoKTsKKyAgICAgICAgbkZsYWdzICY9IH5BTk5PVEZMQUdfSU5WSVNJQkxFOworICAgICAgICBuRmxhZ3MgJj0gfkFOTk9URkxBR19OT1ZJRVc7CisgICAgICAgIGlmIChiSGlkZSkKKyAgICAgICAgICBuRmxhZ3MgfD0gQU5OT1RGTEFHX0hJRERFTjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIG5GbGFncyAmPSB+QU5OT1RGTEFHX0hJRERFTjsKKyAgICAgICAgcFdpZGdldC0+U2V0RmxhZ3MobkZsYWdzKTsKKyAgICAgICAgcFdpZGdldC0+R2V0UGFnZVZpZXcoKS0+VXBkYXRlVmlldyhwV2lkZ2V0KTsKKyAgICAgICAgYkNoYW5nZWQgPSBUUlVFOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiBiQ2hhbmdlZDsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6RkRGVG9VUkxFbmNvZGVkRGF0YShDRlhfV2lkZVN0cmluZyBjc0ZERkZpbGUsIENGWF9XaWRlU3RyaW5nIGNzVHh0RmlsZSkKLXsKLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkRvQWN0aW9uX1N1Ym1pdEZvcm0oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikgeworICBDRlhfV2lkZVN0cmluZyBzRGVzdGluYXRpb24gPSBhY3Rpb24uR2V0RmlsZVBhdGgoKTsKKyAgaWYgKHNEZXN0aW5hdGlvbi5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIENQREZfRGljdGlvbmFyeSogcEFjdGlvbkRpY3QgPSBhY3Rpb24uR2V0RGljdCgpOworICBpZiAocEFjdGlvbkRpY3QtPktleUV4aXN0KCJGaWVsZHMiKSkgeworICAgIENQREZfQWN0aW9uRmllbGRzIGFmID0gYWN0aW9uLkdldFdpZGdldHMoKTsKKyAgICBGWF9EV09SRCBkd0ZsYWdzID0gYWN0aW9uLkdldEZsYWdzKCk7CisgICAgc3RkOjp2ZWN0b3I8Q1BERl9PYmplY3QqPiBmaWVsZE9iamVjdHMgPSBhZi5HZXRBbGxGaWVsZHMoKTsKKyAgICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IGZpZWxkcyA9IEdldEZpZWxkRnJvbU9iamVjdHMoZmllbGRPYmplY3RzKTsKKyAgICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7CisgICAgICBib29sIGJJbmNsdWRlT3JFeGNsdWRlID0gIShkd0ZsYWdzICYgMHgwMSk7CisgICAgICBpZiAobV9wSW50ZXJGb3JtLT5DaGVja1JlcXVpcmVkRmllbGRzKCZmaWVsZHMsIGJJbmNsdWRlT3JFeGNsdWRlKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICByZXR1cm4gU3VibWl0RmllbGRzKHNEZXN0aW5hdGlvbiwgZmllbGRzLCBiSW5jbHVkZU9yRXhjbHVkZSwgRkFMU0UpOworICAgIH0KKyAgfQorICBpZiAobV9wSW50ZXJGb3JtLT5DaGVja1JlcXVpcmVkRmllbGRzKG51bGxwdHIsIHRydWUpKQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gU3VibWl0Rm9ybShzRGVzdGluYXRpb24sIEZBTFNFKTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6RkRGVG9VUkxFbmNvZGVkRGF0YShGWF9MUEJZVEUmIHBCdWYsIEZYX1NUUlNJWkUmIG5CdWZTaXplKQotewotIAlDRkRGX0RvY3VtZW50KiBwRkRGID0gQ0ZERl9Eb2N1bWVudDo6UGFyc2VNZW1vcnkocEJ1ZiwgbkJ1ZlNpemUpOwotIAlpZiAocEZERikKLSAJewotIAkJQ1BERl9EaWN0aW9uYXJ5KiBwTWFpbkRpY3QgPSBwRkRGLT5HZXRSb290KCktPkdldERpY3QoIkZERiIpOwotIAkJaWYgKHBNYWluRGljdCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7Ci0gCQkKLSAJCS8vIEdldCBmaWVsZHMKLSAJCUNQREZfQXJyYXkqIHBGaWVsZHMgPSBwTWFpbkRpY3QtPkdldEFycmF5KCJGaWVsZHMiKTsKLSAJCWlmIChwRmllbGRzID09IE5VTEwpIHJldHVybiBGQUxTRTsKLQkJCi0JCUNGWF9CeXRlVGV4dEJ1ZiBmZGZFbmNvZGVkRGF0YTsKK0ZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OlN1Ym1pdEZpZWxkcygKKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NEZXN0aW5hdGlvbiwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+JiBmaWVsZHMsCisgICAgRlhfQk9PTCBiSW5jbHVkZU9yRXhjbHVkZSwKKyAgICBGWF9CT09MIGJVcmxFbmNvZGVkKSB7CisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BEb2N1bWVudC0+R2V0RW52KCk7CiAKLSAJCWZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBwRmllbGRzLT5HZXRDb3VudCgpOyBpICsrKSAKLSAJCXsKLSAJCQlDUERGX0RpY3Rpb25hcnkqIHBGaWVsZCA9IHBGaWVsZHMtPkdldERpY3QoaSk7Ci0gCQkJaWYgKHBGaWVsZCA9PSBOVUxMKSBjb250aW51ZTsKLSAJCQlDRlhfV2lkZVN0cmluZyBuYW1lOwotIAkJCW5hbWUgPSBwRmllbGQtPkdldFVuaWNvZGVUZXh0KCJUIik7Ci0gCQkJQ0ZYX0J5dGVTdHJpbmcgbmFtZV9iID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKG5hbWUpOwotIAkJCUNGWF9CeXRlU3RyaW5nIGNzQlZhbHVlID0gcEZpZWxkLT5HZXRTdHJpbmcoIlYiKTsKLSAJCQlDRlhfV2lkZVN0cmluZyBjc1dWYWx1ZSA9IFBERl9EZWNvZGVUZXh0KGNzQlZhbHVlKTsKLSAJCQlDRlhfQnl0ZVN0cmluZyBjc1ZhbHVlX2IgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoY3NXVmFsdWUpOworICBDRlhfQnl0ZVRleHRCdWYgdGV4dEJ1ZjsKKyAgRXhwb3J0RmllbGRzVG9GREZUZXh0QnVmKGZpZWxkcywgYkluY2x1ZGVPckV4Y2x1ZGUsIHRleHRCdWYpOwogCi0JCQlmZGZFbmNvZGVkRGF0YSA9IGZkZkVuY29kZWREYXRhPDxuYW1lX2IuR2V0QnVmZmVyKG5hbWVfYi5HZXRMZW5ndGgoKSk7Ci0gIAkJCW5hbWVfYi5SZWxlYXNlQnVmZmVyKCk7Ci0JCQlmZGZFbmNvZGVkRGF0YSA9IGZkZkVuY29kZWREYXRhPDwiPSI7Ci0JCQlmZGZFbmNvZGVkRGF0YSA9IGZkZkVuY29kZWREYXRhPDxjc1ZhbHVlX2IuR2V0QnVmZmVyKGNzVmFsdWVfYi5HZXRMZW5ndGgoKSk7Ci0gIAkJCWNzVmFsdWVfYi5SZWxlYXNlQnVmZmVyKCk7Ci0gIAkJCWlmKGkgIT0gcEZpZWxkcy0+R2V0Q291bnQoKS0xKQotICAJCQkJZmRmRW5jb2RlZERhdGEgPSBmZGZFbmNvZGVkRGF0YTw8IiYiOwotIAkJfQorICB1aW50OF90KiBwQnVmZmVyID0gdGV4dEJ1Zi5HZXRCdWZmZXIoKTsKKyAgRlhfU1RSU0laRSBuQnVmU2l6ZSA9IHRleHRCdWYuR2V0TGVuZ3RoKCk7CiAKLQkJbkJ1ZlNpemUgPSBmZGZFbmNvZGVkRGF0YS5HZXRMZW5ndGgoKTsKLQkJcEJ1ZiA9IEZYX0FsbG9jKEZYX0JZVEUsIG5CdWZTaXplKTsKLQkJRlhTWVNfbWVtY3B5KHBCdWYsIGZkZkVuY29kZWREYXRhLkdldEJ1ZmZlcigpLCBuQnVmU2l6ZSk7Ci0gCX0KLQlyZXR1cm4gVFJVRTsKKyAgaWYgKGJVcmxFbmNvZGVkICYmICFGREZUb1VSTEVuY29kZWREYXRhKHBCdWZmZXIsIG5CdWZTaXplKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcEVudi0+SlNfZG9jU3VibWl0Rm9ybShwQnVmZmVyLCBuQnVmU2l6ZSwgY3NEZXN0aW5hdGlvbi5jX3N0cigpKTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkV4cG9ydEZpZWxkc1RvRkRGVGV4dEJ1Zihjb25zdCBDRlhfUHRyQXJyYXkmIGZpZWxkcyxGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlLCBDRlhfQnl0ZVRleHRCdWYmIHRleHRCdWYpCi17Ci0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCUFTU0VSVChtX3BJbnRlckZvcm0gIT0gTlVMTCk7Ci0JCi0JQ0ZERl9Eb2N1bWVudCogcEZERiA9IG1fcEludGVyRm9ybS0+RXhwb3J0VG9GREYobV9wRG9jdW1lbnQtPkdldFBhdGgoKSwoQ0ZYX1B0ckFycmF5JilmaWVsZHMsIGJJbmNsdWRlT3JFeGNsdWRlKTsKLQlpZiAoIXBGREYpIHJldHVybiBGQUxTRTsKLQlGWF9CT09MIGJSZXQgPSBwRkRGLT5Xcml0ZUJ1Zih0ZXh0QnVmKTsgLy8gPSBGQUxTRTsvLwotCWRlbGV0ZSBwRkRGOwotCQotCXJldHVybiBiUmV0OworRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6RkRGVG9VUkxFbmNvZGVkRGF0YShDRlhfV2lkZVN0cmluZyBjc0ZERkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzVHh0RmlsZSkgeworICByZXR1cm4gVFJVRTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BERlNES19JbnRlckZvcm06OkdldFRlbXBvcmFyeUZpbGVOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRmlsZUV4dCkKLXsKLQlDRlhfV2lkZVN0cmluZyBzRmlsZU5hbWU7Ci0JcmV0dXJuIEwiIjsKK0ZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkZERlRvVVJMRW5jb2RlZERhdGEodWludDhfdComIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1NUUlNJWkUmIG5CdWZTaXplKSB7CisgIENGREZfRG9jdW1lbnQqIHBGREYgPSBDRkRGX0RvY3VtZW50OjpQYXJzZU1lbW9yeShwQnVmLCBuQnVmU2l6ZSk7CisgIGlmIChwRkRGKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwTWFpbkRpY3QgPSBwRkRGLT5HZXRSb290KCktPkdldERpY3QoIkZERiIpOworICAgIGlmICghcE1haW5EaWN0KQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgLy8gR2V0IGZpZWxkcworICAgIENQREZfQXJyYXkqIHBGaWVsZHMgPSBwTWFpbkRpY3QtPkdldEFycmF5KCJGaWVsZHMiKTsKKyAgICBpZiAoIXBGaWVsZHMpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBDRlhfQnl0ZVRleHRCdWYgZmRmRW5jb2RlZERhdGE7CisKKyAgICBmb3IgKEZYX0RXT1JEIGkgPSAwOyBpIDwgcEZpZWxkcy0+R2V0Q291bnQoKTsgaSsrKSB7CisgICAgICBDUERGX0RpY3Rpb25hcnkqIHBGaWVsZCA9IHBGaWVsZHMtPkdldERpY3QoaSk7CisgICAgICBpZiAoIXBGaWVsZCkKKyAgICAgICAgY29udGludWU7CisgICAgICBDRlhfV2lkZVN0cmluZyBuYW1lOworICAgICAgbmFtZSA9IHBGaWVsZC0+R2V0VW5pY29kZVRleHQoIlQiKTsKKyAgICAgIENGWF9CeXRlU3RyaW5nIG5hbWVfYiA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShuYW1lKTsKKyAgICAgIENGWF9CeXRlU3RyaW5nIGNzQlZhbHVlID0gcEZpZWxkLT5HZXRTdHJpbmcoIlYiKTsKKyAgICAgIENGWF9XaWRlU3RyaW5nIGNzV1ZhbHVlID0gUERGX0RlY29kZVRleHQoY3NCVmFsdWUpOworICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NWYWx1ZV9iID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKGNzV1ZhbHVlKTsKKworICAgICAgZmRmRW5jb2RlZERhdGEgPSBmZGZFbmNvZGVkRGF0YSA8PCBuYW1lX2IuR2V0QnVmZmVyKG5hbWVfYi5HZXRMZW5ndGgoKSk7CisgICAgICBuYW1lX2IuUmVsZWFzZUJ1ZmZlcigpOworICAgICAgZmRmRW5jb2RlZERhdGEgPSBmZGZFbmNvZGVkRGF0YSA8PCAiPSI7CisgICAgICBmZGZFbmNvZGVkRGF0YSA9IGZkZkVuY29kZWREYXRhCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGNzVmFsdWVfYi5HZXRCdWZmZXIoY3NWYWx1ZV9iLkdldExlbmd0aCgpKTsKKyAgICAgIGNzVmFsdWVfYi5SZWxlYXNlQnVmZmVyKCk7CisgICAgICBpZiAoaSAhPSBwRmllbGRzLT5HZXRDb3VudCgpIC0gMSkKKyAgICAgICAgZmRmRW5jb2RlZERhdGEgPSBmZGZFbmNvZGVkRGF0YSA8PCAiJiI7CisgICAgfQorCisgICAgbkJ1ZlNpemUgPSBmZGZFbmNvZGVkRGF0YS5HZXRMZW5ndGgoKTsKKyAgICBwQnVmID0gRlhfQWxsb2ModWludDhfdCwgbkJ1ZlNpemUpOworICAgIEZYU1lTX21lbWNweShwQnVmLCBmZGZFbmNvZGVkRGF0YS5HZXRCdWZmZXIoKSwgbkJ1ZlNpemUpOworICB9CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpTdWJtaXRGb3JtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRGVzdGluYXRpb24sIEZYX0JPT0wgYlVybEVuY29kZWQpCi17Ci0gCWlmIChzRGVzdGluYXRpb24uSXNFbXB0eSgpKSByZXR1cm4gRkFMU0U7Ci0KLQlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRG9jdW1lbnQtPkdldEVudigpOwotCUFTU0VSVChwRW52ICE9IE5VTEwpOwotCi0JaWYoTlVMTCA9PSBtX3BEb2N1bWVudCkgcmV0dXJuIEZBTFNFOwotCUNGWF9XaWRlU3RyaW5nIHdzUERGRmlsZVBhdGggPSBtX3BEb2N1bWVudC0+R2V0UGF0aCgpOwotCQotCWlmKE5VTEwgPT0gbV9wSW50ZXJGb3JtKSByZXR1cm4gRkFMU0U7Ci0JQ0ZERl9Eb2N1bWVudCogcEZERkRvYyA9IG1fcEludGVyRm9ybS0+RXhwb3J0VG9GREYod3NQREZGaWxlUGF0aCk7Ci0JaWYgKE5VTEwgPT0gcEZERkRvYykgcmV0dXJuIEZBTFNFOwotCi0JQ0ZYX0J5dGVUZXh0QnVmIEZkZkJ1ZmZlcjsKLQlGWF9CT09MIGJSZXQgPSBwRkRGRG9jLT5Xcml0ZUJ1ZihGZGZCdWZmZXIpOwotCWRlbGV0ZSBwRkRGRG9jOwotCWlmICghYlJldCkgcmV0dXJuIEZBTFNFOwotCi0JRlhfTFBCWVRFIHBCdWZmZXIgPSBGZGZCdWZmZXIuR2V0QnVmZmVyKCk7Ci0JRlhfU1RSU0laRSBuQnVmU2l6ZSA9IEZkZkJ1ZmZlci5HZXRMZW5ndGgoKTsKLQkKLQlpZiAoYlVybEVuY29kZWQpCi0JewotCQlpZighRkRGVG9VUkxFbmNvZGVkRGF0YShwQnVmZmVyLCBuQnVmU2l6ZSkpCi0JCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JcEVudi0+SlNfZG9jU3VibWl0Rm9ybShwQnVmZmVyLCBuQnVmU2l6ZSwgc0Rlc3RpbmF0aW9uLmNfc3RyKCkpOwotCQotCWlmIChiVXJsRW5jb2RlZCAmJiBwQnVmZmVyKQotCXsKLQkJRlhfRnJlZShwQnVmZmVyKTsKLQkJcEJ1ZmZlciA9IE5VTEw7CQotCX0KLQotCXJldHVybiBUUlVFOworRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6RXhwb3J0RmllbGRzVG9GREZUZXh0QnVmKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4mIGZpZWxkcywKKyAgICBGWF9CT09MIGJJbmNsdWRlT3JFeGNsdWRlLAorICAgIENGWF9CeXRlVGV4dEJ1ZiYgdGV4dEJ1ZikgeworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZERl9Eb2N1bWVudD4gcEZERihtX3BJbnRlckZvcm0tPkV4cG9ydFRvRkRGKAorICAgICAgbV9wRG9jdW1lbnQtPkdldFBhdGgoKSwgZmllbGRzLCBiSW5jbHVkZU9yRXhjbHVkZSkpOworICByZXR1cm4gcEZERiA/IHBGREYtPldyaXRlQnVmKHRleHRCdWYpIDogRkFMU0U7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkV4cG9ydEZvcm1Ub0ZERlRleHRCdWYoQ0ZYX0J5dGVUZXh0QnVmJiB0ZXh0QnVmKQoteworI2lmZGVmIFBERl9FTkFCTEVfWEZBCit2b2lkIENQREZTREtfSW50ZXJGb3JtOjpTeW5jaHJvbml6ZUZpZWxkKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTeW5jaHJvbml6ZUVsc2UpIHsKKyAgQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CiAKLQlBU1NFUlQobV9wSW50ZXJGb3JtICE9IE5VTEwpOwotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQkKLQlDRkRGX0RvY3VtZW50KiBwRkRGID0gbV9wSW50ZXJGb3JtLT5FeHBvcnRUb0ZERihtX3BEb2N1bWVudC0+R2V0UGF0aCgpKTsKLQlpZiAoIXBGREYpIHJldHVybiBGQUxTRTsKLQkKLQlGWF9CT09MIGJSZXQgPSBwRkRGLT5Xcml0ZUJ1Zih0ZXh0QnVmKTsKLQlkZWxldGUgcEZERjsKLQkKLQlyZXR1cm4gYlJldDsKKyAgaW50IHggPSAwOworICBpZiAobV9GaWVsZFN5bmNocm9uaXplTWFwLkxvb2t1cChwRm9ybUZpZWxkLCB4KSkKKyAgICByZXR1cm47CisKKyAgZm9yIChpbnQgaSA9IDAsIHN6ID0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBpIDwgc3o7IGkrKykgeworICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woaSk7CisgICAgQVNTRVJUKHBGb3JtQ3RybCAhPSBOVUxMKTsKKworICAgIEFTU0VSVChtX3BJbnRlckZvcm0gIT0gTlVMTCk7CisgICAgaWYgKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gR2V0V2lkZ2V0KHBGb3JtQ3RybCkpIHsKKyAgICAgIHBXaWRnZXQtPlN5bmNocm9uaXplKGJTeW5jaHJvbml6ZUVsc2UpOworICAgIH0KKyAgfQorfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCitDRlhfV2lkZVN0cmluZyBDUERGU0RLX0ludGVyRm9ybTo6R2V0VGVtcG9yYXJ5RmlsZU5hbWUoCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNGaWxlRXh0KSB7CisgIENGWF9XaWRlU3RyaW5nIHNGaWxlTmFtZTsKKyAgcmV0dXJuIEwiIjsKIH0KIAorRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6U3VibWl0Rm9ybShjb25zdCBDRlhfV2lkZVN0cmluZyYgc0Rlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVcmxFbmNvZGVkKSB7CisgIGlmIChzRGVzdGluYXRpb24uSXNFbXB0eSgpKQorICAgIHJldHVybiBGQUxTRTsKIAotRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6RG9BY3Rpb25fUmVzZXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pCi17Ci0JQVNTRVJUKGFjdGlvbik7CisgIGlmICghbV9wRG9jdW1lbnQgfHwgIW1fcEludGVyRm9ybSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlDUERGX0RpY3Rpb25hcnkqIHBBY3Rpb25EaWN0ID0gYWN0aW9uLkdldERpY3QoKTsKLQlpZiAocEFjdGlvbkRpY3QtPktleUV4aXN0KCJGaWVsZHMiKSkKLQl7Ci0JCUNQREZfQWN0aW9uRmllbGRzIGFmID0gYWN0aW9uLkdldFdpZGdldHMoKTsKLQkJRlhfRFdPUkQgZHdGbGFncyA9IGFjdGlvbi5HZXRGbGFncygpOworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRG9jdW1lbnQtPkdldEVudigpOworICBDRlhfV2lkZVN0cmluZyB3c1BERkZpbGVQYXRoID0gbV9wRG9jdW1lbnQtPkdldFBhdGgoKTsKKyAgQ0ZERl9Eb2N1bWVudCogcEZERkRvYyA9IG1fcEludGVyRm9ybS0+RXhwb3J0VG9GREYod3NQREZGaWxlUGF0aCk7CisgIGlmICghcEZERkRvYykKKyAgICByZXR1cm4gRkFMU0U7CiAKLQkJQ0ZYX1B0ckFycmF5IGZpZWxkT2JqZWN0czsKLQkJYWYuR2V0QWxsRmllbGRzKGZpZWxkT2JqZWN0cyk7Ci0JCUNGWF9QdHJBcnJheSBmaWVsZHM7Ci0JCUdldEZpZWxkRnJvbU9iamVjdHMoZmllbGRPYmplY3RzLCBmaWVsZHMpOwotCQlyZXR1cm4gbV9wSW50ZXJGb3JtLT5SZXNldEZvcm0oZmllbGRzLCAhKGR3RmxhZ3MgJiAweDAxKSwgVFJVRSk7Ci0JfQorICBDRlhfQnl0ZVRleHRCdWYgRmRmQnVmZmVyOworICBGWF9CT09MIGJSZXQgPSBwRkRGRG9jLT5Xcml0ZUJ1ZihGZGZCdWZmZXIpOworICBkZWxldGUgcEZERkRvYzsKKyAgaWYgKCFiUmV0KQorICAgIHJldHVybiBGQUxTRTsKIAotCXJldHVybiBtX3BJbnRlckZvcm0tPlJlc2V0Rm9ybShUUlVFKTsKKyAgdWludDhfdCogcEJ1ZmZlciA9IEZkZkJ1ZmZlci5HZXRCdWZmZXIoKTsKKyAgRlhfU1RSU0laRSBuQnVmU2l6ZSA9IEZkZkJ1ZmZlci5HZXRMZW5ndGgoKTsKKworICBpZiAoYlVybEVuY29kZWQpIHsKKyAgICBpZiAoIUZERlRvVVJMRW5jb2RlZERhdGEocEJ1ZmZlciwgbkJ1ZlNpemUpKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgcEVudi0+SlNfZG9jU3VibWl0Rm9ybShwQnVmZmVyLCBuQnVmU2l6ZSwgc0Rlc3RpbmF0aW9uLmNfc3RyKCkpOworCisgIGlmIChiVXJsRW5jb2RlZCkgeworICAgIEZYX0ZyZWUocEJ1ZmZlcik7CisgICAgcEJ1ZmZlciA9IE5VTEw7CisgIH0KKworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6RG9BY3Rpb25fSW1wb3J0RGF0YShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKQotewotCXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkV4cG9ydEZvcm1Ub0ZERlRleHRCdWYoQ0ZYX0J5dGVUZXh0QnVmJiB0ZXh0QnVmKSB7CisgIENGREZfRG9jdW1lbnQqIHBGREYgPSBtX3BJbnRlckZvcm0tPkV4cG9ydFRvRkRGKG1fcERvY3VtZW50LT5HZXRQYXRoKCkpOworICBpZiAoIXBGREYpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEZYX0JPT0wgYlJldCA9IHBGREYtPldyaXRlQnVmKHRleHRCdWYpOworICBkZWxldGUgcEZERjsKKworICByZXR1cm4gYlJldDsKIH0KIAotdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6R2V0RmllbGRGcm9tT2JqZWN0cyhjb25zdCBDRlhfUHRyQXJyYXkmIG9iamVjdHMsIENGWF9QdHJBcnJheSYgZmllbGRzKQotewotCUFTU0VSVChtX3BJbnRlckZvcm0gIT0gTlVMTCk7CitGWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpEb0FjdGlvbl9SZXNldEZvcm0oY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikgeworICBBU1NFUlQoYWN0aW9uKTsKIAotCWludCBpQ291bnQgPSBvYmplY3RzLkdldFNpemUoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSArKykKLQl7Ci0JCUNQREZfT2JqZWN0KiBwT2JqZWN0ID0gKENQREZfT2JqZWN0KilvYmplY3RzW2ldOwotCQlpZiAocE9iamVjdCA9PSBOVUxMKSBjb250aW51ZTsKLQkJCi0JCWludCBpVHlwZSA9IHBPYmplY3QtPkdldFR5cGUoKTsKLQkJaWYgKGlUeXBlID09IFBERk9CSl9TVFJJTkcpCi0JCXsKLQkJCUNGWF9XaWRlU3RyaW5nIGNzTmFtZSA9IHBPYmplY3QtPkdldFVuaWNvZGVUZXh0KCk7Ci0JCQlDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gbV9wSW50ZXJGb3JtLT5HZXRGaWVsZCgwLCBjc05hbWUpOwotCQkJaWYgKHBGaWVsZCAhPSBOVUxMKQotCQkJCWZpZWxkcy5BZGQocEZpZWxkKTsKLQkJfQotCQllbHNlIGlmIChpVHlwZSA9PSBQREZPQkpfRElDVElPTkFSWSkKLQkJewotCQkJaWYgKG1fcEludGVyRm9ybS0+SXNWYWxpZEZvcm1GaWVsZChwT2JqZWN0KSkKLQkJCQlmaWVsZHMuQWRkKHBPYmplY3QpOwotCQl9Ci0JfQorICBDUERGX0RpY3Rpb25hcnkqIHBBY3Rpb25EaWN0ID0gYWN0aW9uLkdldERpY3QoKTsKKyAgaWYgKCFwQWN0aW9uRGljdC0+S2V5RXhpc3QoIkZpZWxkcyIpKQorICAgIHJldHVybiBtX3BJbnRlckZvcm0tPlJlc2V0Rm9ybSh0cnVlKTsKKworICBDUERGX0FjdGlvbkZpZWxkcyBhZiA9IGFjdGlvbi5HZXRXaWRnZXRzKCk7CisgIEZYX0RXT1JEIGR3RmxhZ3MgPSBhY3Rpb24uR2V0RmxhZ3MoKTsKKworICBzdGQ6OnZlY3RvcjxDUERGX09iamVjdCo+IGZpZWxkT2JqZWN0cyA9IGFmLkdldEFsbEZpZWxkcygpOworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IGZpZWxkcyA9IEdldEZpZWxkRnJvbU9iamVjdHMoZmllbGRPYmplY3RzKTsKKyAgcmV0dXJuIG1fcEludGVyRm9ybS0+UmVzZXRGb3JtKGZpZWxkcywgIShkd0ZsYWdzICYgMHgwMSksIHRydWUpOwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUERGX0Zvcm1Ob3RpZnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotaW50CUNQREZTREtfSW50ZXJGb3JtOjpCZWZvcmVWYWx1ZUNoYW5nZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSkKLXsKLQlBU1NFUlQocEZpZWxkICE9IE5VTEwpOwotCi0JQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKXBGaWVsZDsKLQotCWludCBuVHlwZSA9IHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpOwotCWlmIChuVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1ggfHwgblR5cGUgPT0gRklFTERUWVBFX1RFWFRGSUVMRCkKLQl7Ci0JCUZYX0JPT0wgYlJDID0gVFJVRTsKLQkJT25LZXlTdHJva2VDb21taXQocEZvcm1GaWVsZCwgY3NWYWx1ZSwgYlJDKTsKLQkJaWYgKGJSQykgCi0JCXsKLQkJCU9uVmFsaWRhdGUocEZvcm1GaWVsZCwgY3NWYWx1ZSwgYlJDKTsKLQkJCWlmIChiUkMpCi0JCQkJcmV0dXJuIDE7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiAtMTsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gMDsKK0ZYX0JPT0wgQ1BERlNES19JbnRlckZvcm06OkRvQWN0aW9uX0ltcG9ydERhdGEoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbikgeworICByZXR1cm4gRkFMU0U7CiB9CiAKLWludAlDUERGU0RLX0ludGVyRm9ybTo6QWZ0ZXJWYWx1ZUNoYW5nZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkKQotewotCUFTU0VSVChwRmllbGQgIT0gTlVMTCk7Ci0KLQlDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopcEZpZWxkOwotCWludCBuVHlwZSA9IHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpOwotCi0JaWYgKG5UeXBlID09IEZJRUxEVFlQRV9DT01CT0JPWCB8fCBuVHlwZSA9PSBGSUVMRFRZUEVfVEVYVEZJRUxEKQotCXsKLQkJdGhpcy0+T25DYWxjdWxhdGUocEZvcm1GaWVsZCk7Ci0JCUZYX0JPT0wgYkZvcm1hdGVkID0gRkFMU0U7Ci0JCUNGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IHRoaXMtPk9uRm9ybWF0KHBGb3JtRmllbGQsIDAsIGJGb3JtYXRlZCk7Ci0JCWlmIChiRm9ybWF0ZWQpCi0JCQl0aGlzLT5SZXNldEZpZWxkQXBwZWFyYW5jZShwRm9ybUZpZWxkLCBzVmFsdWUuY19zdHIoKSwgVFJVRSk7Ci0JCWVsc2UKLQkJCXRoaXMtPlJlc2V0RmllbGRBcHBlYXJhbmNlKHBGb3JtRmllbGQsIE5VTEwsIFRSVUUpOwotCQl0aGlzLT5VcGRhdGVGaWVsZChwRm9ybUZpZWxkKTsKLQl9Ci0KLQlyZXR1cm4gMDsKK3N0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gQ1BERlNES19JbnRlckZvcm06OkdldEZpZWxkRnJvbU9iamVjdHMoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q1BERl9PYmplY3QqPiYgb2JqZWN0cykgY29uc3QgeworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IGZpZWxkczsKKyAgZm9yIChDUERGX09iamVjdCogcE9iamVjdCA6IG9iamVjdHMpIHsKKyAgICBpZiAocE9iamVjdCAmJiBwT2JqZWN0LT5Jc1N0cmluZygpKSB7CisgICAgICBDRlhfV2lkZVN0cmluZyBjc05hbWUgPSBwT2JqZWN0LT5HZXRVbmljb2RlVGV4dCgpOworICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcEludGVyRm9ybS0+R2V0RmllbGQoMCwgY3NOYW1lKTsKKyAgICAgIGlmIChwRmllbGQpCisgICAgICAgIGZpZWxkcy5wdXNoX2JhY2socEZpZWxkKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZpZWxkczsKIH0KIAotaW50CUNQREZTREtfSW50ZXJGb3JtOjpCZWZvcmVTZWxlY3Rpb25DaGFuZ2UoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwgQ0ZYX1dpZGVTdHJpbmcmIGNzVmFsdWUpCi17Ci0JQVNTRVJUKHBGaWVsZCAhPSBOVUxMKTsKLQotCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilwRmllbGQ7Ci0KLQlpbnQgblR5cGUgPSBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKTsKLQlpZiAoblR5cGUgPT0gRklFTERUWVBFX0xJU1RCT1gpCi0JewotCQlGWF9CT09MIGJSQyA9IFRSVUU7Ci0JCU9uS2V5U3Ryb2tlQ29tbWl0KHBGb3JtRmllbGQsIGNzVmFsdWUsIGJSQyk7Ci0JCWlmIChiUkMpIAotCQl7Ci0JCQlPblZhbGlkYXRlKHBGb3JtRmllbGQsIGNzVmFsdWUsIGJSQyk7Ci0JCQlpZiAoYlJDKQotCQkJCXJldHVybiAxOwotCQkJZWxzZQotCQkJCXJldHVybiAtMTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIDA7CitpbnQgQ1BERlNES19JbnRlckZvcm06OkJlZm9yZVZhbHVlQ2hhbmdlKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBjc1ZhbHVlKSB7CisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilwRmllbGQ7CisgIGludCBuVHlwZSA9IHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpOworICBpZiAoblR5cGUgPT0gRklFTERUWVBFX0NPTUJPQk9YIHx8IG5UeXBlID09IEZJRUxEVFlQRV9URVhURklFTEQpIHsKKyAgICBGWF9CT09MIGJSQyA9IFRSVUU7CisgICAgT25LZXlTdHJva2VDb21taXQocEZvcm1GaWVsZCwgY3NWYWx1ZSwgYlJDKTsKKyAgICBpZiAoYlJDKSB7CisgICAgICBPblZhbGlkYXRlKHBGb3JtRmllbGQsIGNzVmFsdWUsIGJSQyk7CisgICAgICByZXR1cm4gYlJDID8gMSA6IC0xOworICAgIH0KKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIDA7CiB9CiAKLWludAlDUERGU0RLX0ludGVyRm9ybTo6QWZ0ZXJTZWxlY3Rpb25DaGFuZ2UoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCkKLXsKLQlBU1NFUlQocEZpZWxkICE9IE5VTEwpOwotCi0JQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKXBGaWVsZDsKLQlpbnQgblR5cGUgPSBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKTsKLQotCWlmIChuVHlwZSA9PSBGSUVMRFRZUEVfTElTVEJPWCkKLQl7Ci0JCXRoaXMtPk9uQ2FsY3VsYXRlKHBGb3JtRmllbGQpOwotCQl0aGlzLT5SZXNldEZpZWxkQXBwZWFyYW5jZShwRm9ybUZpZWxkLCBOVUxMLCBUUlVFKTsKLQkJdGhpcy0+VXBkYXRlRmllbGQocEZvcm1GaWVsZCk7Ci0JfQotCi0JcmV0dXJuIDA7CitpbnQgQ1BERlNES19JbnRlckZvcm06OkFmdGVyVmFsdWVDaGFuZ2UoY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCkgeworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopcEZpZWxkOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIFN5bmNocm9uaXplRmllbGQocEZvcm1GaWVsZCwgRkFMU0UpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICBpbnQgblR5cGUgPSBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKTsKKyAgaWYgKG5UeXBlID09IEZJRUxEVFlQRV9DT01CT0JPWCB8fCBuVHlwZSA9PSBGSUVMRFRZUEVfVEVYVEZJRUxEKSB7CisgICAgT25DYWxjdWxhdGUocEZvcm1GaWVsZCk7CisgICAgRlhfQk9PTCBiRm9ybWF0ZWQgPSBGQUxTRTsKKyAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSBPbkZvcm1hdChwRm9ybUZpZWxkLCBiRm9ybWF0ZWQpOworICAgIGlmIChiRm9ybWF0ZWQpCisgICAgICBSZXNldEZpZWxkQXBwZWFyYW5jZShwRm9ybUZpZWxkLCBzVmFsdWUuY19zdHIoKSwgVFJVRSk7CisgICAgZWxzZQorICAgICAgUmVzZXRGaWVsZEFwcGVhcmFuY2UocEZvcm1GaWVsZCwgTlVMTCwgVFJVRSk7CisgICAgVXBkYXRlRmllbGQocEZvcm1GaWVsZCk7CisgIH0KKyAgcmV0dXJuIDA7CiB9CiAKLWludAlDUERGU0RLX0ludGVyRm9ybTo6QWZ0ZXJDaGVja2VkU3RhdHVzQ2hhbmdlKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQsIGNvbnN0IENGWF9CeXRlQXJyYXkmIHN0YXR1c0FycmF5KQotewotCUFTU0VSVChwRmllbGQgIT0gTlVMTCk7CitpbnQgQ1BERlNES19JbnRlckZvcm06OkJlZm9yZVNlbGVjdGlvbkNoYW5nZShjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGNzVmFsdWUpIHsKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKXBGaWVsZDsKKyAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9MSVNUQk9YKQorICAgIHJldHVybiAwOwogCi0JQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKXBGaWVsZDsKLQlpbnQgblR5cGUgPSBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKTsKKyAgRlhfQk9PTCBiUkMgPSBUUlVFOworICBPbktleVN0cm9rZUNvbW1pdChwRm9ybUZpZWxkLCBjc1ZhbHVlLCBiUkMpOworICBpZiAoIWJSQykKKyAgICByZXR1cm4gLTE7CiAKLQlpZiAoblR5cGUgPT0gRklFTERUWVBFX0NIRUNLQk9YIHx8IG5UeXBlID09IEZJRUxEVFlQRV9SQURJT0JVVFRPTikKLQl7Ci0JCXRoaXMtPk9uQ2FsY3VsYXRlKHBGb3JtRmllbGQpOwotCQkvL3RoaXMtPlJlc2V0RmllbGRBcHBlYXJhbmNlKHBGb3JtRmllbGQsIE5VTEwpOwotCQl0aGlzLT5VcGRhdGVGaWVsZChwRm9ybUZpZWxkKTsKLQl9CisgIE9uVmFsaWRhdGUocEZvcm1GaWVsZCwgY3NWYWx1ZSwgYlJDKTsKKyAgaWYgKCFiUkMpCisgICAgcmV0dXJuIC0xOwogCi0JcmV0dXJuIDA7CisgIHJldHVybiAxOwogfQogCi1pbnQJQ1BERlNES19JbnRlckZvcm06OkJlZm9yZUZvcm1SZXNldChjb25zdCBDUERGX0ludGVyRm9ybSogcEZvcm0pCi17Ci0JcmV0dXJuIDA7CitpbnQgQ1BERlNES19JbnRlckZvcm06OkFmdGVyU2VsZWN0aW9uQ2hhbmdlKGNvbnN0IENQREZfRm9ybUZpZWxkKiBwRmllbGQpIHsKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKXBGaWVsZDsKKyAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9MSVNUQk9YKSB7CisgICAgT25DYWxjdWxhdGUocEZvcm1GaWVsZCk7CisgICAgUmVzZXRGaWVsZEFwcGVhcmFuY2UocEZvcm1GaWVsZCwgTlVMTCwgVFJVRSk7CisgICAgVXBkYXRlRmllbGQocEZvcm1GaWVsZCk7CisgIH0KKyAgcmV0dXJuIDA7CiB9CiAKLWludAlDUERGU0RLX0ludGVyRm9ybTo6QWZ0ZXJGb3JtUmVzZXQoY29uc3QgQ1BERl9JbnRlckZvcm0qIHBGb3JtKQotewotCXRoaXMtPk9uQ2FsY3VsYXRlKE5VTEwpOwotCi0JcmV0dXJuIDA7CitpbnQgQ1BERlNES19JbnRlckZvcm06OkFmdGVyQ2hlY2tlZFN0YXR1c0NoYW5nZSgKKyAgICBjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkLAorICAgIGNvbnN0IENGWF9CeXRlQXJyYXkmIHN0YXR1c0FycmF5KSB7CisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilwRmllbGQ7CisgIGludCBuVHlwZSA9IHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpOworICBpZiAoblR5cGUgPT0gRklFTERUWVBFX0NIRUNLQk9YIHx8IG5UeXBlID09IEZJRUxEVFlQRV9SQURJT0JVVFRPTikgeworICAgIE9uQ2FsY3VsYXRlKHBGb3JtRmllbGQpOworICAgIFVwZGF0ZUZpZWxkKHBGb3JtRmllbGQpOworICB9CisgIHJldHVybiAwOwogfQogCi1pbnQJQ1BERlNES19JbnRlckZvcm06OkJlZm9yZUZvcm1JbXBvcnREYXRhKGNvbnN0IENQREZfSW50ZXJGb3JtKiBwRm9ybSkKLXsKLQlyZXR1cm4gMDsKK2ludCBDUERGU0RLX0ludGVyRm9ybTo6QmVmb3JlRm9ybVJlc2V0KGNvbnN0IENQREZfSW50ZXJGb3JtKiBwRm9ybSkgeworICByZXR1cm4gMDsKIH0KIAotaW50CUNQREZTREtfSW50ZXJGb3JtOjpBZnRlckZvcm1JbXBvcnREYXRhKGNvbnN0IENQREZfSW50ZXJGb3JtKiBwRm9ybSkKLXsKLQl0aGlzLT5PbkNhbGN1bGF0ZShOVUxMKTsKLQotCXJldHVybiAwOworaW50IENQREZTREtfSW50ZXJGb3JtOjpBZnRlckZvcm1SZXNldChjb25zdCBDUERGX0ludGVyRm9ybSogcEZvcm0pIHsKKyAgT25DYWxjdWxhdGUobnVsbHB0cik7CisgIHJldHVybiAwOwogfQogCi1GWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpJc05lZWRIaWdoTGlnaHQoaW50IG5GaWVsZFR5cGUpCi17Ci0JaWYobkZpZWxkVHlwZSA8MSB8fCBuRmllbGRUeXBlID4gNikKLQkJcmV0dXJuIEZBTFNFOwotCXJldHVybiBtX2JOZWVkSGlnaHRsaWdodFtuRmllbGRUeXBlLTFdOworaW50IENQREZTREtfSW50ZXJGb3JtOjpCZWZvcmVGb3JtSW1wb3J0RGF0YShjb25zdCBDUERGX0ludGVyRm9ybSogcEZvcm0pIHsKKyAgcmV0dXJuIDA7CiB9CiAKLXZvaWQgQ1BERlNES19JbnRlckZvcm06OlJlbW92ZUFsbEhpZ2hMaWdodCgpCi17Ci0JbWVtc2V0KCh2b2lkKiltX2JOZWVkSGlnaHRsaWdodCwgMCwgNipzaXplb2YoRlhfQk9PTCkpOwotfQotdm9pZCAgIENQREZTREtfSW50ZXJGb3JtOjpTZXRIaWdobGlnaHRDb2xvcihGWF9DT0xPUlJFRiBjbHIsIGludCBuRmllbGRUeXBlKQotewotCWlmKG5GaWVsZFR5cGUgPDAgfHwgbkZpZWxkVHlwZSA+IDYpIHJldHVybjsKLQlzd2l0Y2gobkZpZWxkVHlwZSkKLQl7Ci0JY2FzZSAwOgotCQl7Ci0JCQlmb3IoaW50IGk9MDsgaTw2OyBpKyspCi0JCQl7Ci0JCQkJbV9hSGlnaGxpZ2h0Q29sb3JbaV0gPSBjbHI7Ci0JCQkJbV9iTmVlZEhpZ2h0bGlnaHRbaV0gPSBUUlVFOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQlkZWZhdWx0OgotCQl7Ci0JCQltX2FIaWdobGlnaHRDb2xvcltuRmllbGRUeXBlLTFdID0gY2xyOwotCQkJbV9iTmVlZEhpZ2h0bGlnaHRbbkZpZWxkVHlwZS0xXSA9IFRSVUU7Ci0JCQlicmVhazsKLQkJfQotCX0KLQkKK2ludCBDUERGU0RLX0ludGVyRm9ybTo6QWZ0ZXJGb3JtSW1wb3J0RGF0YShjb25zdCBDUERGX0ludGVyRm9ybSogcEZvcm0pIHsKKyAgT25DYWxjdWxhdGUobnVsbHB0cik7CisgIHJldHVybiAwOwogfQogCi1GWF9DT0xPUlJFRiBDUERGU0RLX0ludGVyRm9ybTo6R2V0SGlnaGxpZ2h0Q29sb3IoaW50IG5GaWVsZFR5cGUpCi17Ci0JaWYobkZpZWxkVHlwZSA8MCB8fCBuRmllbGRUeXBlID42KSByZXR1cm4gRlhTWVNfUkdCKDI1NSwyNTUsMjU1KTsKLQlpZihuRmllbGRUeXBlID09IDApCi0JCXJldHVybiBtX2FIaWdobGlnaHRDb2xvclswXTsKLQllbHNlCi0JCXJldHVybiBtX2FIaWdobGlnaHRDb2xvcltuRmllbGRUeXBlLTFdOworRlhfQk9PTCBDUERGU0RLX0ludGVyRm9ybTo6SXNOZWVkSGlnaExpZ2h0KGludCBuRmllbGRUeXBlKSB7CisgIGlmIChuRmllbGRUeXBlIDwgMSB8fCBuRmllbGRUeXBlID4ga051bUZpZWxkVHlwZXMpCisgICAgcmV0dXJuIEZBTFNFOworICByZXR1cm4gbV9iTmVlZEhpZ2h0bGlnaHRbbkZpZWxkVHlwZSAtIDFdOwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENCQV9Bbm5vdEl0ZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotQ0JBX0Fubm90SXRlcmF0b3I6OkNCQV9Bbm5vdEl0ZXJhdG9yKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNUeXBlLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc1N1YlR5cGUpCi0JOm1fcFBhZ2VWaWV3KHBQYWdlVmlldyksCi0JbV9zVHlwZShzVHlwZSksCi0JbV9zU3ViVHlwZShzU3ViVHlwZSksCi0JbV9uVGFicyhCQUlfU1RSVUNUVVJFKQotewotCUFTU0VSVChtX3BQYWdlVmlldyAhPSBOVUxMKTsKLQotCUNQREZfUGFnZSogcFBERlBhZ2UgPSBtX3BQYWdlVmlldy0+R2V0UERGUGFnZSgpOwotCUFTU0VSVChwUERGUGFnZSAhPSBOVUxMKTsKLQlBU1NFUlQocFBERlBhZ2UtPm1fcEZvcm1EaWN0ICE9IE5VTEwpOwotCi0JQ0ZYX0J5dGVTdHJpbmcgc1RhYnMgPSBwUERGUGFnZS0+bV9wRm9ybURpY3QtPkdldFN0cmluZygiVGFicyIpOwotCi0JaWYgKHNUYWJzID09ICJSIikKLQl7Ci0JCW1fblRhYnMgPSBCQUlfUk9XOwotCX0KLQllbHNlIGlmIChzVGFicyA9PSAiQyIpCi0JewotCQltX25UYWJzID0gQkFJX0NPTFVNTjsKLQl9Ci0JZWxzZQotCXsKLQkJbV9uVGFicyA9IEJBSV9TVFJVQ1RVUkU7Ci0JfQotCi0JR2VuZXJhdGVSZXN1bHRzKCk7Cit2b2lkIENQREZTREtfSW50ZXJGb3JtOjpSZW1vdmVBbGxIaWdoTGlnaHQoKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUZpZWxkVHlwZXM7ICsraSkKKyAgICBtX2JOZWVkSGlnaHRsaWdodFtpXSA9IEZBTFNFOwogfQogCi1DQkFfQW5ub3RJdGVyYXRvcjo6fkNCQV9Bbm5vdEl0ZXJhdG9yKCkKLXsKLQltX0Fubm90cy5SZW1vdmVBbGwoKTsKK3ZvaWQgQ1BERlNES19JbnRlckZvcm06OlNldEhpZ2hsaWdodENvbG9yKEZYX0NPTE9SUkVGIGNsciwgaW50IG5GaWVsZFR5cGUpIHsKKyAgaWYgKG5GaWVsZFR5cGUgPCAwIHx8IG5GaWVsZFR5cGUgPiBrTnVtRmllbGRUeXBlcykKKyAgICByZXR1cm47CisgIHN3aXRjaCAobkZpZWxkVHlwZSkgeworICAgIGNhc2UgMDogeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtRmllbGRUeXBlczsgKytpKSB7CisgICAgICAgIG1fYUhpZ2hsaWdodENvbG9yW2ldID0gY2xyOworICAgICAgICBtX2JOZWVkSGlnaHRsaWdodFtpXSA9IFRSVUU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgbV9hSGlnaGxpZ2h0Q29sb3JbbkZpZWxkVHlwZSAtIDFdID0gY2xyOworICAgICAgbV9iTmVlZEhpZ2h0bGlnaHRbbkZpZWxkVHlwZSAtIDFdID0gVFJVRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQogfQogCi1DUERGU0RLX0Fubm90KiBDQkFfQW5ub3RJdGVyYXRvcjo6R2V0Rmlyc3RBbm5vdCgpCi17Ci0JaWYgKG1fQW5ub3RzLkdldFNpemUoKSA+IDApCi0JCXJldHVybiBtX0Fubm90c1swXTsKLQkKLQlyZXR1cm4gTlVMTDsKK0ZYX0NPTE9SUkVGIENQREZTREtfSW50ZXJGb3JtOjpHZXRIaWdobGlnaHRDb2xvcihpbnQgbkZpZWxkVHlwZSkgeworICBpZiAobkZpZWxkVHlwZSA8IDAgfHwgbkZpZWxkVHlwZSA+IGtOdW1GaWVsZFR5cGVzKQorICAgIHJldHVybiBGWFNZU19SR0IoMjU1LCAyNTUsIDI1NSk7CisgIGlmIChuRmllbGRUeXBlID09IDApCisgICAgcmV0dXJuIG1fYUhpZ2hsaWdodENvbG9yWzBdOworICByZXR1cm4gbV9hSGlnaGxpZ2h0Q29sb3JbbkZpZWxkVHlwZSAtIDFdOwogfQogCi1DUERGU0RLX0Fubm90KiBDQkFfQW5ub3RJdGVyYXRvcjo6R2V0TGFzdEFubm90KCkKLXsKLQlpZiAobV9Bbm5vdHMuR2V0U2l6ZSgpID4gMCkKLQkJcmV0dXJuIG1fQW5ub3RzW21fQW5ub3RzLkdldFNpemUoKSAtIDFdOworQ0JBX0Fubm90SXRlcmF0b3I6OkNCQV9Bbm5vdEl0ZXJhdG9yKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNTdWJUeXBlKQorICAgIDogbV9wUGFnZVZpZXcocFBhZ2VWaWV3KSwKKyAgICAgIG1fc1R5cGUoc1R5cGUpLAorICAgICAgbV9zU3ViVHlwZShzU3ViVHlwZSksCisgICAgICBtX25UYWJzKEJBSV9TVFJVQ1RVUkUpIHsKKyAgQ1BERl9QYWdlKiBwUERGUGFnZSA9IG1fcFBhZ2VWaWV3LT5HZXRQREZQYWdlKCk7CisgIENGWF9CeXRlU3RyaW5nIHNUYWJzID0gcFBERlBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRTdHJpbmcoIlRhYnMiKTsKIAotCXJldHVybiBOVUxMOworICBpZiAoc1RhYnMgPT0gIlIiKSB7CisgICAgbV9uVGFicyA9IEJBSV9ST1c7CisgIH0gZWxzZSBpZiAoc1RhYnMgPT0gIkMiKSB7CisgICAgbV9uVGFicyA9IEJBSV9DT0xVTU47CisgIH0gZWxzZSB7CisgICAgbV9uVGFicyA9IEJBSV9TVFJVQ1RVUkU7CisgIH0KKworICBHZW5lcmF0ZVJlc3VsdHMoKTsKIH0KIAotQ1BERlNES19Bbm5vdCogQ0JBX0Fubm90SXRlcmF0b3I6OkdldE5leHRBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpCi17Ci0JZm9yIChpbnQgaT0wLHN6PW1fQW5ub3RzLkdldFNpemUoKTsgaTxzejsgaSsrKQotCXsKLQkJaWYgKG1fQW5ub3RzW2ldID09IHBBbm5vdCkKLQkJewotCQkJaWYgKGkrMSA8IHN6KQotCQkJCXJldHVybiBtX0Fubm90c1tpKzFdOwotCQkJZWxzZQotCQkJCXJldHVybiBtX0Fubm90c1swXTsKLQkJfQotCX0KLQotCXJldHVybiBOVUxMOworQ0JBX0Fubm90SXRlcmF0b3I6On5DQkFfQW5ub3RJdGVyYXRvcigpIHsKKyAgbV9Bbm5vdHMuUmVtb3ZlQWxsKCk7CiB9CiAKLUNQREZTREtfQW5ub3QqIENCQV9Bbm5vdEl0ZXJhdG9yOjpHZXRQcmV2QW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KQotewotCWZvciAoaW50IGk9MCxzej1tX0Fubm90cy5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQl7Ci0JCWlmIChtX0Fubm90c1tpXSA9PSBwQW5ub3QpCi0JCXsKLQkJCWlmIChpLTEgPj0gMCkKLQkJCQlyZXR1cm4gbV9Bbm5vdHNbaS0xXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbV9Bbm5vdHNbc3otMV07Ci0JCX0KLQl9CitDUERGU0RLX0Fubm90KiBDQkFfQW5ub3RJdGVyYXRvcjo6R2V0Rmlyc3RBbm5vdCgpIHsKKyAgaWYgKG1fQW5ub3RzLkdldFNpemUoKSA+IDApCisgICAgcmV0dXJuIG1fQW5ub3RzWzBdOwogCi0JcmV0dXJuIE5VTEw7CisgIHJldHVybiBOVUxMOwogfQogCi1pbnQgQ0JBX0Fubm90SXRlcmF0b3I6OkNvbXBhcmVCeUxlZnQoQ1BERlNES19Bbm5vdCogcDEsIENQREZTREtfQW5ub3QqIHAyKQotewotCUFTU0VSVChwMSAhPSBOVUxMKTsKLQlBU1NFUlQocDIgIT0gTlVMTCk7CitDUERGU0RLX0Fubm90KiBDQkFfQW5ub3RJdGVyYXRvcjo6R2V0TGFzdEFubm90KCkgeworICBpZiAobV9Bbm5vdHMuR2V0U2l6ZSgpID4gMCkKKyAgICByZXR1cm4gbV9Bbm5vdHNbbV9Bbm5vdHMuR2V0U2l6ZSgpIC0gMV07CiAKLQlDUERGX1JlY3QgcmNBbm5vdDEgPSBHZXRBbm5vdFJlY3QocDEpOwotCUNQREZfUmVjdCByY0Fubm90MiA9IEdldEFubm90UmVjdChwMik7Ci0KLQlpZiAocmNBbm5vdDEubGVmdCA8IHJjQW5ub3QyLmxlZnQpCi0JCXJldHVybiAtMTsKLQlpZiAocmNBbm5vdDEubGVmdCA+IHJjQW5ub3QyLmxlZnQpCi0JCXJldHVybiAxOwotCXJldHVybiAwOworICByZXR1cm4gTlVMTDsKIH0KIAotCi1pbnQgQ0JBX0Fubm90SXRlcmF0b3I6OkNvbXBhcmVCeVRvcChDUERGU0RLX0Fubm90KiBwMSwgQ1BERlNES19Bbm5vdCogcDIpCi17Ci0JQVNTRVJUKHAxICE9IE5VTEwpOwotCUFTU0VSVChwMiAhPSBOVUxMKTsKLQotCUNQREZfUmVjdCByY0Fubm90MSA9IEdldEFubm90UmVjdChwMSk7Ci0JQ1BERl9SZWN0IHJjQW5ub3QyID0gR2V0QW5ub3RSZWN0KHAyKTsKLQotCWlmIChyY0Fubm90MS50b3AgPCByY0Fubm90Mi50b3ApCi0JCXJldHVybiAtMTsKLQlpZiAocmNBbm5vdDEudG9wID4gcmNBbm5vdDIudG9wKQotCQlyZXR1cm4gMTsKLQlyZXR1cm4gMDsKK0NQREZTREtfQW5ub3QqIENCQV9Bbm5vdEl0ZXJhdG9yOjpHZXROZXh0QW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIGZvciAoaW50IGkgPSAwLCBzeiA9IG1fQW5ub3RzLkdldFNpemUoKTsgaSA8IHN6OyArK2kpIHsKKyAgICBpZiAobV9Bbm5vdHNbaV0gPT0gcEFubm90KQorICAgICAgcmV0dXJuIChpICsgMSA8IHN6KSA/IG1fQW5ub3RzW2kgKyAxXSA6IG1fQW5ub3RzWzBdOworICB9CisgIHJldHVybiBOVUxMOwogfQogCi12b2lkIENCQV9Bbm5vdEl0ZXJhdG9yOjpHZW5lcmF0ZVJlc3VsdHMoKQotewotCUFTU0VSVChtX3BQYWdlVmlldyAhPSBOVUxMKTsKLQotCXN3aXRjaCAobV9uVGFicykKLQl7Ci0JY2FzZSBCQUlfU1RSVUNUVVJFOgotCQl7Ci0JCQlmb3IgKGludCBpPTAsc3o9bV9wUGFnZVZpZXctPkNvdW50QW5ub3RzKCk7IGk8c3o7IGkrKykKLQkJCXsKLQkJCQlDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBtX3BQYWdlVmlldy0+R2V0QW5ub3QoaSk7Ci0JCQkJQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQotCQkJCWlmIChwQW5ub3QtPkdldFR5cGUoKSA9PSBtX3NUeXBlIAotCQkJCQkmJiBwQW5ub3QtPkdldFN1YlR5cGUoKSA9PSBtX3NTdWJUeXBlKQotCQkJCQltX0Fubm90cy5BZGQocEFubm90KTsKLQkJCX0KLQkJfQotCQlicmVhazsKLQljYXNlIEJBSV9ST1c6Ci0JCXsKLQkJCUNQREZTREtfU29ydEFubm90cyBzYTsKLQotCQkJewotCQkJCQotCQkJCWZvciAoaW50IGk9MCxzej1tX3BQYWdlVmlldy0+Q291bnRBbm5vdHMoKTsgaTxzejsgaSsrKQotCQkJCXsKLQkJCQkJQ1BERlNES19Bbm5vdCogcEFubm90ID0gbV9wUGFnZVZpZXctPkdldEFubm90KGkpOwotCQkJCQlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCi0JCQkJCWlmIChwQW5ub3QtPkdldFR5cGUoKSA9PSBtX3NUeXBlIAotCQkJCQkJJiYgcEFubm90LT5HZXRTdWJUeXBlKCkgPT0gbV9zU3ViVHlwZSkKLQkJCQkJCXNhLkFkZChwQW5ub3QpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHNhLkdldFNpemUoKSA+IDApCi0JCQl7Ci0JCQkJc2EuU29ydChDQkFfQW5ub3RJdGVyYXRvcjo6Q29tcGFyZUJ5TGVmdCk7Ci0JCQl9Ci0KLQkJCXdoaWxlIChzYS5HZXRTaXplKCkgPiAwKQotCQkJewotCQkJCWludCBuTGVmdFRvcEluZGV4ID0gLTE7Ci0KLQkJCQl7Ci0JCQkJCUZYX0ZMT0FUIGZUb3AgPSAwLjBmOwotCi0JCQkJCWZvciAoaW50IGk9c2EuR2V0U2l6ZSgpLTE7IGk+PTA7IGktLSkKLQkJCQkJewotCQkJCQkJQ1BERlNES19Bbm5vdCogcEFubm90ID0gc2EuR2V0QXQoaSk7Ci0JCQkJCQlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCi0JCQkJCQlDUERGX1JlY3QgcmNBbm5vdCA9IEdldEFubm90UmVjdChwQW5ub3QpOwotCi0JCQkJCQlpZiAocmNBbm5vdC50b3AgPiBmVG9wKQotCQkJCQkJewotCQkJCQkJCW5MZWZ0VG9wSW5kZXggPSBpOwotCQkJCQkJCWZUb3AgPSByY0Fubm90LnRvcDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChuTGVmdFRvcEluZGV4ID49IDApCi0JCQkJewotCQkJCQlDUERGU0RLX0Fubm90KiBwTGVmdFRvcEFubm90ID0gc2EuR2V0QXQobkxlZnRUb3BJbmRleCk7Ci0JCQkJCUFTU0VSVChwTGVmdFRvcEFubm90ICE9IE5VTEwpOwotCi0JCQkJCUNQREZfUmVjdCByY0xlZnRUb3AgPSBHZXRBbm5vdFJlY3QocExlZnRUb3BBbm5vdCk7Ci0JCQkJCQotCQkJCQltX0Fubm90cy5BZGQocExlZnRUb3BBbm5vdCk7Ci0JCQkJCXNhLlJlbW92ZUF0KG5MZWZ0VG9wSW5kZXgpOwotCi0JCQkJCUNGWF9BcnJheVRlbXBsYXRlPGludD4gYVNlbGVjdDsKLQotCQkJCQl7Ci0JCQkJCQlmb3IgKGludCBpPTAsc3o9c2EuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JCQkJCQl7Ci0JCQkJCQkJQ1BERlNES19Bbm5vdCogcEFubm90ID0gc2EuR2V0QXQoaSk7Ci0JCQkJCQkJQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQotCQkJCQkJCUNQREZfUmVjdCByY0Fubm90ID0gR2V0QW5ub3RSZWN0KHBBbm5vdCk7Ci0KLQkJCQkJCQlGWF9GTE9BVCBmQ2VudGVyWSA9IChyY0Fubm90LnRvcCArIHJjQW5ub3QuYm90dG9tKSAvIDIuMGY7Ci0KLQkJCQkJCQlpZiAoZkNlbnRlclkgPiByY0xlZnRUb3AuYm90dG9tICYmIGZDZW50ZXJZIDwgcmNMZWZ0VG9wLnRvcCkKLQkJCQkJCQkJYVNlbGVjdC5BZGQoaSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQl7Ci0JCQkJCQlmb3IgKGludCBpPTAsc3o9YVNlbGVjdC5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQkJCQkJCXsKLQkJCQkJCQltX0Fubm90cy5BZGQoc2FbYVNlbGVjdFtpXV0pOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJewotCQkJCQkJZm9yIChpbnQgaT1hU2VsZWN0LkdldFNpemUoKS0xOyBpPj0wOyBpLS0pCi0JCQkJCQl7Ci0JCQkJCQkJc2EuUmVtb3ZlQXQoYVNlbGVjdFtpXSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlhU2VsZWN0LlJlbW92ZUFsbCgpOwotCQkJCX0KLQkJCX0KLQkJCXNhLlJlbW92ZUFsbCgpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQkFJX0NPTFVNTjoKLQkJewotCQkJQ1BERlNES19Tb3J0QW5ub3RzIHNhOwotCi0JCQl7Ci0JCQkJZm9yIChpbnQgaT0wLHN6PW1fcFBhZ2VWaWV3LT5Db3VudEFubm90cygpOyBpPHN6OyBpKyspCi0JCQkJewotCQkJCQlDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBtX3BQYWdlVmlldy0+R2V0QW5ub3QoaSk7Ci0JCQkJCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0KLQkJCQkJaWYgKHBBbm5vdC0+R2V0VHlwZSgpID09IG1fc1R5cGUgCi0JCQkJCQkmJiBwQW5ub3QtPkdldFN1YlR5cGUoKSA9PSBtX3NTdWJUeXBlKQotCQkJCQkJc2EuQWRkKHBBbm5vdCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoc2EuR2V0U2l6ZSgpID4gMCkKLQkJCXsKLQkJCQlzYS5Tb3J0KENCQV9Bbm5vdEl0ZXJhdG9yOjpDb21wYXJlQnlUb3AsIEZBTFNFKTsKLQkJCX0KLQotCQkJd2hpbGUgKHNhLkdldFNpemUoKSA+IDApCi0JCQl7Ci0JCQkJaW50IG5MZWZ0VG9wSW5kZXggPSAtMTsKLQotCQkJCXsKLQkJCQkJRlhfRkxPQVQgZkxlZnQgPSAtMS4wZjsKLQotCQkJCQlmb3IgKGludCBpPXNhLkdldFNpemUoKS0xOyBpPj0wOyBpLS0pCi0JCQkJCXsKLQkJCQkJCUNQREZTREtfQW5ub3QqIHBBbm5vdCA9IHNhLkdldEF0KGkpOwotCQkJCQkJQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQotCQkJCQkJQ1BERl9SZWN0IHJjQW5ub3QgPSBHZXRBbm5vdFJlY3QocEFubm90KTsKLQotCQkJCQkJaWYgKGZMZWZ0IDwgMCkKLQkJCQkJCXsKLQkJCQkJCQluTGVmdFRvcEluZGV4ID0gMDsKLQkJCQkJCQlmTGVmdCA9IHJjQW5ub3QubGVmdDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKHJjQW5ub3QubGVmdCA8IGZMZWZ0KQotCQkJCQkJewotCQkJCQkJCW5MZWZ0VG9wSW5kZXggPSBpOwotCQkJCQkJCWZMZWZ0ID0gcmNBbm5vdC5sZWZ0OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKG5MZWZ0VG9wSW5kZXggPj0gMCkKLQkJCQl7Ci0JCQkJCUNQREZTREtfQW5ub3QqIHBMZWZ0VG9wQW5ub3QgPSBzYS5HZXRBdChuTGVmdFRvcEluZGV4KTsKLQkJCQkJQVNTRVJUKHBMZWZ0VG9wQW5ub3QgIT0gTlVMTCk7Ci0KLQkJCQkJQ1BERl9SZWN0IHJjTGVmdFRvcCA9IEdldEFubm90UmVjdChwTGVmdFRvcEFubm90KTsKLQkJCQkJCi0JCQkJCW1fQW5ub3RzLkFkZChwTGVmdFRvcEFubm90KTsKLQkJCQkJc2EuUmVtb3ZlQXQobkxlZnRUb3BJbmRleCk7Ci0KLQkJCQkJQ0ZYX0FycmF5VGVtcGxhdGU8aW50PiBhU2VsZWN0OwotCi0JCQkJCXsKLQkJCQkJCWZvciAoaW50IGk9MCxzej1zYS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQkJCQkJCXsKLQkJCQkJCQlDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBzYS5HZXRBdChpKTsKLQkJCQkJCQlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCi0JCQkJCQkJQ1BERl9SZWN0IHJjQW5ub3QgPSBHZXRBbm5vdFJlY3QocEFubm90KTsKLQotCQkJCQkJCUZYX0ZMT0FUIGZDZW50ZXJYID0gKHJjQW5ub3QubGVmdCArIHJjQW5ub3QucmlnaHQpIC8gMi4wZjsKLQotCQkJCQkJCWlmIChmQ2VudGVyWCA+IHJjTGVmdFRvcC5sZWZ0ICYmIGZDZW50ZXJYIDwgcmNMZWZ0VG9wLnJpZ2h0KQotCQkJCQkJCQlhU2VsZWN0LkFkZChpKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXsKLQkJCQkJCWZvciAoaW50IGk9MCxzej1hU2VsZWN0LkdldFNpemUoKTsgaTxzejsgaSsrKQotCQkJCQkJewotCQkJCQkJCW1fQW5ub3RzLkFkZChzYVthU2VsZWN0W2ldXSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQl7Ci0JCQkJCQlmb3IgKGludCBpPWFTZWxlY3QuR2V0U2l6ZSgpLTE7IGk+PTA7IGktLSkKLQkJCQkJCXsKLQkJCQkJCQlzYS5SZW1vdmVBdChhU2VsZWN0W2ldKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWFTZWxlY3QuUmVtb3ZlQWxsKCk7Ci0JCQkJfQotCQkJfQotCQkJc2EuUmVtb3ZlQWxsKCk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQorQ1BERlNES19Bbm5vdCogQ0JBX0Fubm90SXRlcmF0b3I6OkdldFByZXZBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpIHsKKyAgZm9yIChpbnQgaSA9IDAsIHN6ID0gbV9Bbm5vdHMuR2V0U2l6ZSgpOyBpIDwgc3o7ICsraSkgeworICAgIGlmIChtX0Fubm90c1tpXSA9PSBwQW5ub3QpCisgICAgICByZXR1cm4gKGkgLSAxID49IDApID8gbV9Bbm5vdHNbaSAtIDFdIDogbV9Bbm5vdHNbc3ogLSAxXTsKKyAgfQorICByZXR1cm4gTlVMTDsKIH0KIAotQ1BERl9SZWN0IENCQV9Bbm5vdEl0ZXJhdG9yOjpHZXRBbm5vdFJlY3QoQ1BERlNES19Bbm5vdCogcEFubm90KQotewotCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CitpbnQgQ0JBX0Fubm90SXRlcmF0b3I6OkNvbXBhcmVCeUxlZnQoQ1BERlNES19Bbm5vdCogcDEsIENQREZTREtfQW5ub3QqIHAyKSB7CisgIEFTU0VSVChwMSk7CisgIEFTU0VSVChwMik7CiAKLQlDUERGX0Fubm90KiBwUERGQW5ub3QgPSBwQW5ub3QtPkdldFBERkFubm90KCk7Ci0JQVNTRVJUKHBQREZBbm5vdCAhPSBOVUxMKTsKKyAgQ1BERl9SZWN0IHJjQW5ub3QxID0gR2V0QW5ub3RSZWN0KHAxKTsKKyAgQ1BERl9SZWN0IHJjQW5ub3QyID0gR2V0QW5ub3RSZWN0KHAyKTsKIAotCUNQREZfUmVjdCByY0Fubm90OwotCXBQREZBbm5vdC0+R2V0UmVjdChyY0Fubm90KTsKLQotCXJldHVybiByY0Fubm90OworICBpZiAocmNBbm5vdDEubGVmdCA8IHJjQW5ub3QyLmxlZnQpCisgICAgcmV0dXJuIC0xOworICBpZiAocmNBbm5vdDEubGVmdCA+IHJjQW5ub3QyLmxlZnQpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOwogfQogCitpbnQgQ0JBX0Fubm90SXRlcmF0b3I6OkNvbXBhcmVCeVRvcChDUERGU0RLX0Fubm90KiBwMSwgQ1BERlNES19Bbm5vdCogcDIpIHsKKyAgQVNTRVJUKHAxKTsKKyAgQVNTRVJUKHAyKTsKKworICBDUERGX1JlY3QgcmNBbm5vdDEgPSBHZXRBbm5vdFJlY3QocDEpOworICBDUERGX1JlY3QgcmNBbm5vdDIgPSBHZXRBbm5vdFJlY3QocDIpOworCisgIGlmIChyY0Fubm90MS50b3AgPCByY0Fubm90Mi50b3ApCisgICAgcmV0dXJuIC0xOworICBpZiAocmNBbm5vdDEudG9wID4gcmNBbm5vdDIudG9wKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKwordm9pZCBDQkFfQW5ub3RJdGVyYXRvcjo6R2VuZXJhdGVSZXN1bHRzKCkgeworICBzd2l0Y2ggKG1fblRhYnMpIHsKKyAgICBjYXNlIEJBSV9TVFJVQ1RVUkU6IHsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9wUGFnZVZpZXctPkNvdW50QW5ub3RzKCk7ICsraSkgeworICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBtX3BQYWdlVmlldy0+R2V0QW5ub3QoaSk7CisgICAgICAgIGlmIChwQW5ub3QtPkdldFR5cGUoKSA9PSBtX3NUeXBlICYmIHBBbm5vdC0+R2V0U3ViVHlwZSgpID09IG1fc1N1YlR5cGUpCisgICAgICAgICAgbV9Bbm5vdHMuQWRkKHBBbm5vdCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCQUlfUk9XOiB7CisgICAgICBDUERGU0RLX1NvcnRBbm5vdHMgc2E7CisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fcFBhZ2VWaWV3LT5Db3VudEFubm90cygpOyArK2kpIHsKKyAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90ID0gbV9wUGFnZVZpZXctPkdldEFubm90KGkpOworICAgICAgICBpZiAocEFubm90LT5HZXRUeXBlKCkgPT0gbV9zVHlwZSAmJiBwQW5ub3QtPkdldFN1YlR5cGUoKSA9PSBtX3NTdWJUeXBlKQorICAgICAgICAgIHNhLkFkZChwQW5ub3QpOworICAgICAgfQorCisgICAgICBpZiAoc2EuR2V0U2l6ZSgpID4gMCkKKyAgICAgICAgc2EuU29ydChDQkFfQW5ub3RJdGVyYXRvcjo6Q29tcGFyZUJ5TGVmdCk7CisKKyAgICAgIHdoaWxlIChzYS5HZXRTaXplKCkgPiAwKSB7CisgICAgICAgIGludCBuTGVmdFRvcEluZGV4ID0gLTE7CisgICAgICAgIEZYX0ZMT0FUIGZUb3AgPSAwLjBmOworCisgICAgICAgIGZvciAoaW50IGkgPSBzYS5HZXRTaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCA9IHNhLkdldEF0KGkpOworICAgICAgICAgIEFTU0VSVChwQW5ub3QpOworCisgICAgICAgICAgQ1BERl9SZWN0IHJjQW5ub3QgPSBHZXRBbm5vdFJlY3QocEFubm90KTsKKworICAgICAgICAgIGlmIChyY0Fubm90LnRvcCA+IGZUb3ApIHsKKyAgICAgICAgICAgIG5MZWZ0VG9wSW5kZXggPSBpOworICAgICAgICAgICAgZlRvcCA9IHJjQW5ub3QudG9wOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChuTGVmdFRvcEluZGV4ID49IDApIHsKKyAgICAgICAgICBDUERGU0RLX0Fubm90KiBwTGVmdFRvcEFubm90ID0gc2EuR2V0QXQobkxlZnRUb3BJbmRleCk7CisgICAgICAgICAgQVNTRVJUKHBMZWZ0VG9wQW5ub3QpOworCisgICAgICAgICAgQ1BERl9SZWN0IHJjTGVmdFRvcCA9IEdldEFubm90UmVjdChwTGVmdFRvcEFubm90KTsKKworICAgICAgICAgIG1fQW5ub3RzLkFkZChwTGVmdFRvcEFubm90KTsKKyAgICAgICAgICBzYS5SZW1vdmVBdChuTGVmdFRvcEluZGV4KTsKKworICAgICAgICAgIENGWF9BcnJheVRlbXBsYXRlPGludD4gYVNlbGVjdDsKKworICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IHNhLkdldFNpemUoKTsgaSA8IHN6OyArK2kpIHsKKyAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCA9IHNhLkdldEF0KGkpOworICAgICAgICAgICAgQVNTRVJUKHBBbm5vdCk7CisKKyAgICAgICAgICAgIENQREZfUmVjdCByY0Fubm90ID0gR2V0QW5ub3RSZWN0KHBBbm5vdCk7CisgICAgICAgICAgICBGWF9GTE9BVCBmQ2VudGVyWSA9IChyY0Fubm90LnRvcCArIHJjQW5ub3QuYm90dG9tKSAvIDIuMGY7CisgICAgICAgICAgICBpZiAoZkNlbnRlclkgPiByY0xlZnRUb3AuYm90dG9tICYmIGZDZW50ZXJZIDwgcmNMZWZ0VG9wLnRvcCkKKyAgICAgICAgICAgICAgYVNlbGVjdC5BZGQoaSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gYVNlbGVjdC5HZXRTaXplKCk7IGkgPCBzejsgKytpKQorICAgICAgICAgICAgbV9Bbm5vdHMuQWRkKHNhW2FTZWxlY3RbaV1dKTsKKworICAgICAgICAgIGZvciAoaW50IGkgPSBhU2VsZWN0LkdldFNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKQorICAgICAgICAgICAgICBzYS5SZW1vdmVBdChhU2VsZWN0W2ldKTsKKworICAgICAgICAgIGFTZWxlY3QuUmVtb3ZlQWxsKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNhLlJlbW92ZUFsbCgpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQkFJX0NPTFVNTjogeworICAgICAgQ1BERlNES19Tb3J0QW5ub3RzIHNhOworICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3BQYWdlVmlldy0+Q291bnRBbm5vdHMoKTsgKytpKSB7CisgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCA9IG1fcFBhZ2VWaWV3LT5HZXRBbm5vdChpKTsKKyAgICAgICAgaWYgKHBBbm5vdC0+R2V0VHlwZSgpID09IG1fc1R5cGUgJiYgcEFubm90LT5HZXRTdWJUeXBlKCkgPT0gbV9zU3ViVHlwZSkKKyAgICAgICAgICBzYS5BZGQocEFubm90KTsKKyAgICAgIH0KKworICAgICAgaWYgKHNhLkdldFNpemUoKSA+IDApCisgICAgICAgIHNhLlNvcnQoQ0JBX0Fubm90SXRlcmF0b3I6OkNvbXBhcmVCeVRvcCwgRkFMU0UpOworCisgICAgICB3aGlsZSAoc2EuR2V0U2l6ZSgpID4gMCkgeworICAgICAgICBpbnQgbkxlZnRUb3BJbmRleCA9IC0xOworICAgICAgICBGWF9GTE9BVCBmTGVmdCA9IC0xLjBmOworCisgICAgICAgIGZvciAoaW50IGkgPSBzYS5HZXRTaXplKCkgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCA9IHNhLkdldEF0KGkpOworICAgICAgICAgIEFTU0VSVChwQW5ub3QpOworCisgICAgICAgICAgQ1BERl9SZWN0IHJjQW5ub3QgPSBHZXRBbm5vdFJlY3QocEFubm90KTsKKworICAgICAgICAgIGlmIChmTGVmdCA8IDApIHsKKyAgICAgICAgICAgIG5MZWZ0VG9wSW5kZXggPSAwOworICAgICAgICAgICAgZkxlZnQgPSByY0Fubm90LmxlZnQ7CisgICAgICAgICAgfSBlbHNlIGlmIChyY0Fubm90LmxlZnQgPCBmTGVmdCkgeworICAgICAgICAgICAgbkxlZnRUb3BJbmRleCA9IGk7CisgICAgICAgICAgICBmTGVmdCA9IHJjQW5ub3QubGVmdDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobkxlZnRUb3BJbmRleCA+PSAwKSB7CisgICAgICAgICAgQ1BERlNES19Bbm5vdCogcExlZnRUb3BBbm5vdCA9IHNhLkdldEF0KG5MZWZ0VG9wSW5kZXgpOworICAgICAgICAgIEFTU0VSVChwTGVmdFRvcEFubm90KTsKKworICAgICAgICAgIENQREZfUmVjdCByY0xlZnRUb3AgPSBHZXRBbm5vdFJlY3QocExlZnRUb3BBbm5vdCk7CisKKyAgICAgICAgICBtX0Fubm90cy5BZGQocExlZnRUb3BBbm5vdCk7CisgICAgICAgICAgc2EuUmVtb3ZlQXQobkxlZnRUb3BJbmRleCk7CisKKyAgICAgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQ+IGFTZWxlY3Q7CisgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gc2EuR2V0U2l6ZSgpOyBpIDwgc3o7ICsraSkgeworICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90ID0gc2EuR2V0QXQoaSk7CisgICAgICAgICAgICBBU1NFUlQocEFubm90KTsKKworICAgICAgICAgICAgQ1BERl9SZWN0IHJjQW5ub3QgPSBHZXRBbm5vdFJlY3QocEFubm90KTsKKyAgICAgICAgICAgIEZYX0ZMT0FUIGZDZW50ZXJYID0gKHJjQW5ub3QubGVmdCArIHJjQW5ub3QucmlnaHQpIC8gMi4wZjsKKyAgICAgICAgICAgIGlmIChmQ2VudGVyWCA+IHJjTGVmdFRvcC5sZWZ0ICYmIGZDZW50ZXJYIDwgcmNMZWZ0VG9wLnJpZ2h0KQorICAgICAgICAgICAgICBhU2VsZWN0LkFkZChpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBhU2VsZWN0LkdldFNpemUoKTsgaSA8IHN6OyArK2kpCisgICAgICAgICAgICBtX0Fubm90cy5BZGQoc2FbYVNlbGVjdFtpXV0pOworCisgICAgICAgICAgZm9yIChpbnQgaSA9IGFTZWxlY3QuR2V0U2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpCisgICAgICAgICAgICBzYS5SZW1vdmVBdChhU2VsZWN0W2ldKTsKKworICAgICAgICAgIGFTZWxlY3QuUmVtb3ZlQWxsKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNhLlJlbW92ZUFsbCgpOworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK0NQREZfUmVjdCBDQkFfQW5ub3RJdGVyYXRvcjo6R2V0QW5ub3RSZWN0KENQREZTREtfQW5ub3QqIHBBbm5vdCkgeworICBDUERGX1JlY3QgcmNBbm5vdDsKKyAgcEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRSZWN0KHJjQW5ub3QpOworICByZXR1cm4gcmNBbm5vdDsKK30KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZzZGtfbWdyLmNwcCBiL2ZwZGZzZGsvc3JjL2ZzZGtfbWdyLmNwcAppbmRleCBlNmJlOWJkLi42ZDY1NmEwIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mc2RrX21nci5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnNka19tZ3IuY3BwCkBAIC0xLDE0ICsxLDI2IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9wdWJsaWMvZnBkZl9leHQuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX21nci5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnNka19tZ3IuaCIKKworI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Gb3JtRmlsbGVyLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9leHQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfYXBwLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZwZGZ4ZmEvZnBkZnhmYV9kb2MuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX3BhZ2UuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX3V0aWwuaCIKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAogI2lmIF9GWF9PU18gPT0gX0ZYX0FORFJPSURfCiAjaW5jbHVkZSAidGltZS5oIgpAQCAtMTYsMTA2NCArMjgsMTE0MiBAQAogI2luY2x1ZGUgPGN0aW1lPgogI2VuZGlmCiAKLS8vZXh0ZXJuIENQREZEb2NfRW52aXJvbm1lbnQqIGdfcEZvcm1GaWxsQXBwOwotY2xhc3MgQ0ZYX1N5c3RlbUhhbmRsZXI6cHVibGljIElGWF9TeXN0ZW1IYW5kbGVyCi17Ci1wdWJsaWM6Ci0JQ0ZYX1N5c3RlbUhhbmRsZXIoQ1BERkRvY19FbnZpcm9ubWVudCogcEVudik6bV9wRW52KHBFbnYpLG1fbkNoYXJTZXQoLTEpIHt9Ci1wdWJsaWM6Ci0JdmlydHVhbCB2b2lkCQkJCUludmFsaWRhdGVSZWN0KEZYX0hXTkQgaFduZCwgRlhfUkVDVCByZWN0KSA7Ci0JdmlydHVhbCB2b2lkCQkJCU91dHB1dFNlbGVjdGVkUmVjdCh2b2lkKiBwRm9ybUZpbGxlciwgQ1BERl9SZWN0JiByZWN0KTsKK2NsYXNzIENGWF9TeXN0ZW1IYW5kbGVyIDogcHVibGljIElGWF9TeXN0ZW1IYW5kbGVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENGWF9TeXN0ZW1IYW5kbGVyKENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYpCisgICAgICA6IG1fcEVudihwRW52KSwgbV9uQ2hhclNldCgtMSkge30KKyAgfkNGWF9TeXN0ZW1IYW5kbGVyKCkgb3ZlcnJpZGUge30KIAotCXZpcnR1YWwgRlhfQk9PTAkJCQlJc1NlbGVjdGlvbkltcGxlbWVudGVkKCk7CisgcHVibGljOgorICAvLyBJRlhfU3lzdGVtSGFuZGxlcgorICB2b2lkIEludmFsaWRhdGVSZWN0KEZYX0hXTkQgaFduZCwgRlhfUkVDVCByZWN0KSBvdmVycmlkZTsKKyAgdm9pZCBPdXRwdXRTZWxlY3RlZFJlY3Qodm9pZCogcEZvcm1GaWxsZXIsIENQREZfUmVjdCYgcmVjdCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgSXNTZWxlY3Rpb25JbXBsZW1lbnRlZCgpIG92ZXJyaWRlOworICBDRlhfV2lkZVN0cmluZyBHZXRDbGlwYm9hcmRUZXh0KEZYX0hXTkQgaFduZCkgb3ZlcnJpZGUgeyByZXR1cm4gTCIiOyB9CisgIEZYX0JPT0wgU2V0Q2xpcGJvYXJkVGV4dChGWF9IV05EIGhXbmQsIENGWF9XaWRlU3RyaW5nIHN0cmluZykgb3ZlcnJpZGUgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICB2b2lkIENsaWVudFRvU2NyZWVuKEZYX0hXTkQgaFduZCwgaW50MzJfdCYgeCwgaW50MzJfdCYgeSkgb3ZlcnJpZGUge30KKyAgdm9pZCBTY3JlZW5Ub0NsaWVudChGWF9IV05EIGhXbmQsIGludDMyX3QmIHgsIGludDMyX3QmIHkpIG92ZXJyaWRlIHt9CisgIHZvaWQgU2V0Q3Vyc29yKGludDMyX3QgbkN1cnNvclR5cGUpIG92ZXJyaWRlOworICBGWF9ITUVOVSBDcmVhdGVQb3B1cE1lbnUoKSBvdmVycmlkZSB7IHJldHVybiBOVUxMOyB9CisgIEZYX0JPT0wgQXBwZW5kTWVudUl0ZW0oRlhfSE1FTlUgaE1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSUROZXdJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHN0cmluZykgb3ZlcnJpZGUgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBGWF9CT09MIEVuYWJsZU1lbnVJdGVtKEZYX0hNRU5VIGhNZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbklESXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJFbmFibGVkKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGludDMyX3QgVHJhY2tQb3B1cE1lbnUoRlhfSE1FTlUgaE1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9IV05EIGhQYXJlbnQpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgdm9pZCBEZXN0cm95TWVudShGWF9ITUVOVSBoTWVudSkgb3ZlcnJpZGUge30KKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0TmF0aXZlVHJ1ZVR5cGVGb250KGludDMyX3QgbkNoYXJzZXQpIG92ZXJyaWRlOworICBGWF9CT09MIEZpbmROYXRpdmVUcnVlVHlwZUZvbnQoaW50MzJfdCBuQ2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHNGb250RmFjZU5hbWUpIG92ZXJyaWRlOworICBDUERGX0ZvbnQqIEFkZE5hdGl2ZVRydWVUeXBlRm9udFRvUERGKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnRGYWNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG5DaGFyc2V0KSBvdmVycmlkZTsKKyAgaW50MzJfdCBTZXRUaW1lcihpbnQzMl90IHVFbGFwc2UsIFRpbWVyQ2FsbGJhY2sgbHBUaW1lckZ1bmMpIG92ZXJyaWRlOworICB2b2lkIEtpbGxUaW1lcihpbnQzMl90IG5JRCkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgSXNTSElGVEtleURvd24oRlhfRFdPUkQgbkZsYWcpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gbV9wRW52LT5GRklfSXNTSElGVEtleURvd24obkZsYWcpOworICB9CisgIEZYX0JPT0wgSXNDVFJMS2V5RG93bihGWF9EV09SRCBuRmxhZykgb3ZlcnJpZGUgeworICAgIHJldHVybiBtX3BFbnYtPkZGSV9Jc0NUUkxLZXlEb3duKG5GbGFnKTsKKyAgfQorICBGWF9CT09MIElzQUxUS2V5RG93bihGWF9EV09SRCBuRmxhZykgb3ZlcnJpZGUgeworICAgIHJldHVybiBtX3BFbnYtPkZGSV9Jc0FMVEtleURvd24obkZsYWcpOworICB9CisgIEZYX0JPT0wgSXNJTlNFUlRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIG1fcEVudi0+RkZJX0lzSU5TRVJUS2V5RG93bihuRmxhZyk7CisgIH0KKyAgRlhfU1lTVEVNVElNRSBHZXRMb2NhbFRpbWUoKSBvdmVycmlkZTsKKyAgaW50MzJfdCBHZXRDaGFyU2V0KCkgb3ZlcnJpZGUgeyByZXR1cm4gbV9uQ2hhclNldDsgfQorICB2b2lkIFNldENoYXJTZXQoaW50MzJfdCBuQ2hhclNldCkgb3ZlcnJpZGUgeyBtX25DaGFyU2V0ID0gbkNoYXJTZXQ7IH0KIAotCXZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcJCUdldENsaXBib2FyZFRleHQoRlhfSFdORCBoV25kKXtyZXR1cm4gTCIiO30KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJU2V0Q2xpcGJvYXJkVGV4dChGWF9IV05EIGhXbmQsIENGWF9XaWRlU3RyaW5nIHN0cmluZykge3JldHVybiBGQUxTRTt9Ci0JCi0JdmlydHVhbCB2b2lkCQkJCUNsaWVudFRvU2NyZWVuKEZYX0hXTkQgaFduZCwgRlhfSU5UMzImIHgsIEZYX0lOVDMyJiB5KSB7fQotCXZpcnR1YWwgdm9pZAkJCQlTY3JlZW5Ub0NsaWVudChGWF9IV05EIGhXbmQsIEZYX0lOVDMyJiB4LCBGWF9JTlQzMiYgeSkge30KLQotCS8qY3Vyc29yIHN0eWxlCi0JRlhDVF9BUlJPVwkKLQlGWENUX05FU1cJCQotCUZYQ1RfTldTRQkJCi0JRlhDVF9WQkVBTQkJCi0JRlhDVF9IQkVBTQkJCi0JRlhDVF9IQU5ECi0JKi8KLQl2aXJ0dWFsIHZvaWQJCQkJU2V0Q3Vyc29yKEZYX0lOVDMyIG5DdXJzb3JUeXBlKTsKLQotCXZpcnR1YWwgRlhfSE1FTlUJCQlDcmVhdGVQb3B1cE1lbnUoKSB7cmV0dXJuIE5VTEw7fQotCXZpcnR1YWwgRlhfQk9PTAkJCQlBcHBlbmRNZW51SXRlbShGWF9ITUVOVSBoTWVudSwgRlhfSU5UMzIgbklETmV3SXRlbSwgQ0ZYX1dpZGVTdHJpbmcgc3RyaW5nKSB7cmV0dXJuIEZBTFNFO30KLQl2aXJ0dWFsIEZYX0JPT0wJCQkJRW5hYmxlTWVudUl0ZW0oRlhfSE1FTlUgaE1lbnUsIEZYX0lOVDMyIG5JREl0ZW0sIEZYX0JPT0wgYkVuYWJsZWQpIHtyZXR1cm4gRkFMU0U7fQotCXZpcnR1YWwgRlhfSU5UMzIJCQlUcmFja1BvcHVwTWVudShGWF9ITUVOVSBoTWVudSwgRlhfSU5UMzIgeCwgRlhfSU5UMzIgeSwgRlhfSFdORCBoUGFyZW50KSB7cmV0dXJuIC0xO30KLQl2aXJ0dWFsIHZvaWQJCQkJRGVzdHJveU1lbnUoRlhfSE1FTlUgaE1lbnUpIHt9Ci0KLQl2aXJ0dWFsIENGWF9CeXRlU3RyaW5nCQlHZXROYXRpdmVUcnVlVHlwZUZvbnQoRlhfSU5UMzIgbkNoYXJzZXQpOwotCXZpcnR1YWwgRlhfQk9PTAkJCQlGaW5kTmF0aXZlVHJ1ZVR5cGVGb250KEZYX0lOVDMyIG5DaGFyc2V0LCBDRlhfQnl0ZVN0cmluZyBzRm9udEZhY2VOYW1lKTsKLQl2aXJ0dWFsIENQREZfRm9udCoJCQlBZGROYXRpdmVUcnVlVHlwZUZvbnRUb1BERihDUERGX0RvY3VtZW50KiBwRG9jLCBDRlhfQnl0ZVN0cmluZyBzRm9udEZhY2VOYW1lLCBGWF9CWVRFIG5DaGFyc2V0KTsKLQotCXZpcnR1YWwgRlhfSU5UMzIJCQlTZXRUaW1lcihGWF9JTlQzMiB1RWxhcHNlLCBUaW1lckNhbGxiYWNrIGxwVGltZXJGdW5jKSA7Ci0JdmlydHVhbCB2b2lkCQkJCUtpbGxUaW1lcihGWF9JTlQzMiBuSUQpIDsKLQotCi0JdmlydHVhbCBGWF9CT09MCQkJCUlzU0hJRlRLZXlEb3duKEZYX0RXT1JEIG5GbGFnKSB7cmV0dXJuIG1fcEVudi0+RkZJX0lzU0hJRlRLZXlEb3duKG5GbGFnKTt9Ci0JdmlydHVhbCBGWF9CT09MCQkJCUlzQ1RSTEtleURvd24oRlhfRFdPUkQgbkZsYWcpIHtyZXR1cm4gbV9wRW52LT5GRklfSXNDVFJMS2V5RG93bihuRmxhZyk7fQotCXZpcnR1YWwgRlhfQk9PTAkJCQlJc0FMVEtleURvd24oRlhfRFdPUkQgbkZsYWcpIHtyZXR1cm4gbV9wRW52LT5GRklfSXNBTFRLZXlEb3duKG5GbGFnKTt9Ci0JdmlydHVhbCBGWF9CT09MCQkJCUlzSU5TRVJUS2V5RG93bihGWF9EV09SRCBuRmxhZykge3JldHVybiBtX3BFbnYtPkZGSV9Jc0lOU0VSVEtleURvd24obkZsYWcpO30KLQotCXZpcnR1YWwJRlhfU1lTVEVNVElNRQkJR2V0TG9jYWxUaW1lKCk7Ci0KLQl2aXJ0dWFsIEZYX0lOVDMyCQkJR2V0Q2hhclNldCgpIHtyZXR1cm4gbV9uQ2hhclNldDt9Ci0JdmlydHVhbCB2b2lkIAkJCQlTZXRDaGFyU2V0KEZYX0lOVDMyIG5DaGFyU2V0KSB7bV9uQ2hhclNldCA9IG5DaGFyU2V0O30KLXByaXZhdGU6Ci0JQ1BERkRvY19FbnZpcm9ubWVudCogbV9wRW52OwotCWludAkJbV9uQ2hhclNldDsKKyBwcml2YXRlOgorICBDUERGRG9jX0Vudmlyb25tZW50KiBtX3BFbnY7CisgIGludCBtX25DaGFyU2V0OwogfTsKIAotdm9pZCBDRlhfU3lzdGVtSGFuZGxlcjo6U2V0Q3Vyc29yKEZYX0lOVDMyIG5DdXJzb3JUeXBlKQotewotCi0JbV9wRW52LT5GRklfU2V0Q3Vyc29yKG5DdXJzb3JUeXBlKTsKK3ZvaWQgQ0ZYX1N5c3RlbUhhbmRsZXI6OlNldEN1cnNvcihpbnQzMl90IG5DdXJzb3JUeXBlKSB7CisgIG1fcEVudi0+RkZJX1NldEN1cnNvcihuQ3Vyc29yVHlwZSk7CiB9CiAKLXZvaWQgQ0ZYX1N5c3RlbUhhbmRsZXI6OkludmFsaWRhdGVSZWN0KEZYX0hXTkQgaFduZCwgRlhfUkVDVCByZWN0KQotewotCS8vZ19wRm9ybUZpbGxBcHAtPkZGSV9JbnZhbGlkYXRlKCk7Ci0JQ1BERlNES19Bbm5vdCogcFNES0Fubm90ID0gKENQREZTREtfQW5ub3QqKWhXbmQ7Ci0JQ1BERl9QYWdlKiBwUGFnZSA9IE5VTEw7Ci0JQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gTlVMTDsKLQlwUGFnZVZpZXcgPSBwU0RLQW5ub3QtPkdldFBhZ2VWaWV3KCk7Ci0JcFBhZ2UgPSBwU0RLQW5ub3QtPkdldFBERlBhZ2UoKTsKLQlpZighcFBhZ2UgfHwgIXBQYWdlVmlldykKLQkJcmV0dXJuOwotCUNQREZfTWF0cml4IHBhZ2UyZGV2aWNlOwotCXBQYWdlVmlldy0+R2V0Q3VycmVudE1hdHJpeChwYWdlMmRldmljZSk7Ci0JQ1BERl9NYXRyaXggZGV2aWNlMnBhZ2U7Ci0JZGV2aWNlMnBhZ2UuU2V0UmV2ZXJzZShwYWdlMmRldmljZSk7Ci0JRlhfRkxPQVQgbGVmdCwgdG9wLCByaWdodCxib3R0b207Ci0JZGV2aWNlMnBhZ2UuVHJhbnNmb3JtKChGWF9GTE9BVClyZWN0LmxlZnQsIChGWF9GTE9BVClyZWN0LnRvcCwgbGVmdCwgdG9wKTsKLQlkZXZpY2UycGFnZS5UcmFuc2Zvcm0oKEZYX0ZMT0FUKXJlY3QucmlnaHQsIChGWF9GTE9BVClyZWN0LmJvdHRvbSwgcmlnaHQsIGJvdHRvbSk7Ci0vLyAJbV9wRW52LT5GRklfRGV2aWNlVG9QYWdlKHBQYWdlLCByZWN0LmxlZnQsIHJlY3QudG9wLCAoZG91YmxlKikmbGVmdCwgKGRvdWJsZSopJnRvcCk7Ci0vLyAJbV9wRW52LT5GRklfRGV2aWNlVG9QYWdlKHBQYWdlLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSwgKGRvdWJsZSopJnJpZ2h0LCAoZG91YmxlKikmYm90dG9tKTsKLQlDUERGX1JlY3QgcmNQREYobGVmdCwgYm90dG9tLCByaWdodCwgdG9wKTsKLQlyY1BERi5Ob3JtYWxpemUoKTsKK3ZvaWQgQ0ZYX1N5c3RlbUhhbmRsZXI6OkludmFsaWRhdGVSZWN0KEZYX0hXTkQgaFduZCwgRlhfUkVDVCByZWN0KSB7CisgIENQREZTREtfQW5ub3QqIHBTREtBbm5vdCA9IChDUERGU0RLX0Fubm90KiloV25kOworICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwU0RLQW5ub3QtPkdldFBhZ2VWaWV3KCk7CisgIFVuZGVybHlpbmdQYWdlVHlwZSogcFBhZ2UgPSBwU0RLQW5ub3QtPkdldFVuZGVybHlpbmdQYWdlKCk7CisgIGlmICghcFBhZ2UgfHwgIXBQYWdlVmlldykKKyAgICByZXR1cm47CisgIENGWF9NYXRyaXggcGFnZTJkZXZpY2U7CisgIHBQYWdlVmlldy0+R2V0Q3VycmVudE1hdHJpeChwYWdlMmRldmljZSk7CisgIENGWF9NYXRyaXggZGV2aWNlMnBhZ2U7CisgIGRldmljZTJwYWdlLlNldFJldmVyc2UocGFnZTJkZXZpY2UpOworICBGWF9GTE9BVCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207CisgIGRldmljZTJwYWdlLlRyYW5zZm9ybSgoRlhfRkxPQVQpcmVjdC5sZWZ0LCAoRlhfRkxPQVQpcmVjdC50b3AsIGxlZnQsIHRvcCk7CisgIGRldmljZTJwYWdlLlRyYW5zZm9ybSgoRlhfRkxPQVQpcmVjdC5yaWdodCwgKEZYX0ZMT0FUKXJlY3QuYm90dG9tLCByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSk7CisgIENQREZfUmVjdCByY1BERihsZWZ0LCBib3R0b20sIHJpZ2h0LCB0b3ApOworICByY1BERi5Ob3JtYWxpemUoKTsKIAotCW1fcEVudi0+RkZJX0ludmFsaWRhdGUocFBhZ2UsIHJjUERGLmxlZnQsIHJjUERGLnRvcCwgcmNQREYucmlnaHQsIHJjUERGLmJvdHRvbSk7CisgIG1fcEVudi0+RkZJX0ludmFsaWRhdGUocFBhZ2UsIHJjUERGLmxlZnQsIHJjUERGLnRvcCwgcmNQREYucmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmNQREYuYm90dG9tKTsKIH0KLXZvaWQgQ0ZYX1N5c3RlbUhhbmRsZXI6Ok91dHB1dFNlbGVjdGVkUmVjdCh2b2lkKiBwRm9ybUZpbGxlciwgQ1BERl9SZWN0JiByZWN0KQotewotCUNGRkxfRm9ybUZpbGxlciogcEZGTCA9IChDRkZMX0Zvcm1GaWxsZXIqKXBGb3JtRmlsbGVyOwotCWlmKHBGRkwpCi0JewotCQlDUERGX1BvaW50IGxlZnRib3R0b20gPSBDUERGX1BvaW50KHJlY3QubGVmdCwgcmVjdC5ib3R0b20pOwotCQlDUERGX1BvaW50IHJpZ2h0dG9wID0gQ1BERl9Qb2ludChyZWN0LnJpZ2h0LCByZWN0LnRvcCk7Ci0JCUNQREZfUG9pbnQgcHRBID0gcEZGTC0+UFdMdG9GRkwobGVmdGJvdHRvbSk7Ci0JCUNQREZfUG9pbnQgcHRCID0gcEZGTC0+UFdMdG9GRkwocmlnaHR0b3ApOwkKLQotCi0JCUNQREZTREtfQW5ub3QqIHBBbm5vdCAgPSBwRkZMLT5HZXRTREtBbm5vdCgpOwotCQlBU1NFUlQocEFubm90KTsKLQkJQ1BERl9QYWdlKiBwUGFnZSA9IHBBbm5vdC0+R2V0UERGUGFnZSgpOwotCQlBU1NFUlQocFBhZ2UpOwotCQltX3BFbnYtPkZGSV9PdXRwdXRTZWxlY3RlZFJlY3QocFBhZ2UsIHB0QS54LCBwdEIueSwgcHRCLngsIHB0QS55KTsKLQl9Ci0JCit2b2lkIENGWF9TeXN0ZW1IYW5kbGVyOjpPdXRwdXRTZWxlY3RlZFJlY3Qodm9pZCogcEZvcm1GaWxsZXIsIENQREZfUmVjdCYgcmVjdCkgeworICBDRkZMX0Zvcm1GaWxsZXIqIHBGRkwgPSAoQ0ZGTF9Gb3JtRmlsbGVyKilwRm9ybUZpbGxlcjsKKyAgaWYgKHBGRkwpIHsKKyAgICBDUERGX1BvaW50IGxlZnRib3R0b20gPSBDUERGX1BvaW50KHJlY3QubGVmdCwgcmVjdC5ib3R0b20pOworICAgIENQREZfUG9pbnQgcmlnaHR0b3AgPSBDUERGX1BvaW50KHJlY3QucmlnaHQsIHJlY3QudG9wKTsKKyAgICBDUERGX1BvaW50IHB0QSA9IHBGRkwtPlBXTHRvRkZMKGxlZnRib3R0b20pOworICAgIENQREZfUG9pbnQgcHRCID0gcEZGTC0+UFdMdG9GRkwocmlnaHR0b3ApOworICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCA9IHBGRkwtPkdldFNES0Fubm90KCk7CisgICAgVW5kZXJseWluZ1BhZ2VUeXBlKiBwUGFnZSA9IHBBbm5vdC0+R2V0VW5kZXJseWluZ1BhZ2UoKTsKKyAgICBBU1NFUlQocFBhZ2UpOworICAgIG1fcEVudi0+RkZJX091dHB1dFNlbGVjdGVkUmVjdChwUGFnZSwgcHRBLngsIHB0Qi55LCBwdEIueCwgcHRBLnkpOworICB9CiB9CiAKLUZYX0JPT0wgQ0ZYX1N5c3RlbUhhbmRsZXI6OklzU2VsZWN0aW9uSW1wbGVtZW50ZWQoKQotewotCWlmKG1fcEVudikKLQl7Ci0JCUZQREZfRk9STUZJTExJTkZPKiBwSW5mbyA9IG1fcEVudi0+R2V0Rm9ybUZpbGxJbmZvKCk7Ci0JCWlmKHBJbmZvICYmIHBJbmZvLT5GRklfT3V0cHV0U2VsZWN0ZWRSZWN0KQotCQkJcmV0dXJuIFRSVUU7Ci0JfQotCXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ0ZYX1N5c3RlbUhhbmRsZXI6OklzU2VsZWN0aW9uSW1wbGVtZW50ZWQoKSB7CisgIGlmIChtX3BFbnYpIHsKKyAgICBGUERGX0ZPUk1GSUxMSU5GTyogcEluZm8gPSBtX3BFbnYtPkdldEZvcm1GaWxsSW5mbygpOworICAgIGlmIChwSW5mbyAmJiBwSW5mby0+RkZJX091dHB1dFNlbGVjdGVkUmVjdCkKKyAgICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ0ZYX1N5c3RlbUhhbmRsZXI6OkdldE5hdGl2ZVRydWVUeXBlRm9udChGWF9JTlQzMiBuQ2hhcnNldCkKLXsKLQlyZXR1cm4gIiI7CitDRlhfQnl0ZVN0cmluZyBDRlhfU3lzdGVtSGFuZGxlcjo6R2V0TmF0aXZlVHJ1ZVR5cGVGb250KGludDMyX3QgbkNoYXJzZXQpIHsKKyAgcmV0dXJuICIiOwogfQogCi1GWF9CT09MCUNGWF9TeXN0ZW1IYW5kbGVyOjpGaW5kTmF0aXZlVHJ1ZVR5cGVGb250KEZYX0lOVDMyIG5DaGFyc2V0LCBDRlhfQnl0ZVN0cmluZyBzRm9udEZhY2VOYW1lKSAKLXsKLQlDRlhfRm9udE1nciogcEZvbnRNZ3IgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCk7Ci0vLwlGWEZUX0ZhY2UgbkZhY2UgPSBwRm9udE1nci0+RmluZFN1YnN0Rm9udChzRm9udEZhY2VOYW1lLFRSVUUsMCwwLDAsMCxOVUxMKTsKLS8vCUZYRlRfRmFjZSBuRmFjZSAgPSBwRm9udE1nci0+bV9wQnVpbHRpbk1hcHBlci0+RmluZFN1YnN0Rm9udChzRm9udEZhY2VOYW1lLFRSVUUsMCwwLDAsMCxOVUxMKTsKK0ZYX0JPT0wgQ0ZYX1N5c3RlbUhhbmRsZXI6OkZpbmROYXRpdmVUcnVlVHlwZUZvbnQoCisgICAgaW50MzJfdCBuQ2hhcnNldCwKKyAgICBDRlhfQnl0ZVN0cmluZyBzRm9udEZhY2VOYW1lKSB7CisgIENGWF9Gb250TWdyKiBwRm9udE1nciA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKTsKKyAgaWYgKCFwRm9udE1ncikKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlpZihwRm9udE1ncikKLQl7Ci0JCUNGWF9Gb250TWFwcGVyKglwRm9udE1hcHBlciA9IHBGb250TWdyLT5tX3BCdWlsdGluTWFwcGVyOwotCQlpZihwRm9udE1hcHBlcikKLQkJewkKLQkJCWludCBuU2l6ZSA9IHBGb250TWFwcGVyLT5tX0luc3RhbGxlZFRURm9udHMuR2V0U2l6ZSgpOwotCQkJaWYoblNpemUgPT0wKQotCQkJewotCQkJCXBGb250TWFwcGVyLT5Mb2FkSW5zdGFsbGVkRm9udHMoKTsKLQkJCQluU2l6ZSA9IHBGb250TWFwcGVyLT5tX0luc3RhbGxlZFRURm9udHMuR2V0U2l6ZSgpOwotCQkJfQotCQkJCi0JCQlmb3IoaW50IGk9MDsgaTxuU2l6ZTsgaSsrKQotCQkJewotCQkJCWlmKHBGb250TWFwcGVyLT5tX0luc3RhbGxlZFRURm9udHNbaV0uQ29tcGFyZShzRm9udEZhY2VOYW1lKSkKLQkJCQkJcmV0dXJuIFRSVUU7Ci0JCQl9Ci0JCX0KKyAgQ0ZYX0ZvbnRNYXBwZXIqIHBGb250TWFwcGVyID0gcEZvbnRNZ3ItPkdldEJ1aWx0aW5NYXBwZXIoKTsKKyAgaWYgKCFwRm9udE1hcHBlcikKKyAgICByZXR1cm4gRkFMU0U7CiAKLQl9CisgIGludCBuU2l6ZSA9IHBGb250TWFwcGVyLT5tX0luc3RhbGxlZFRURm9udHMuR2V0U2l6ZSgpOworICBpZiAoblNpemUgPT0gMCkgeworICAgIHBGb250TWFwcGVyLT5Mb2FkSW5zdGFsbGVkRm9udHMoKTsKKyAgICBuU2l6ZSA9IHBGb250TWFwcGVyLT5tX0luc3RhbGxlZFRURm9udHMuR2V0U2l6ZSgpOworICB9CiAKLQlyZXR1cm4gRkFMU0U7Ci0vLyAJcEZvbnRNZ3ItPm1fRmFjZU1hcC5Mb29rdXAoc0ZvbnRGYWNlTmFtZSxwRm9udCk7Ci0vLyAJcmV0dXJuIChwRm9udCE9TlVMTCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgblNpemU7ICsraSkgeworICAgIGlmIChwRm9udE1hcHBlci0+bV9JbnN0YWxsZWRUVEZvbnRzW2ldLkNvbXBhcmUoc0ZvbnRGYWNlTmFtZSkpCisgICAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKIH0KIAotc3RhdGljIGludCBDaGFyU2V0MkNQKGludCBjaGFyc2V0KQotewotCWlmKGNoYXJzZXQgPT0gMTI4KQotCQlyZXR1cm4gOTMyOwotCWVsc2UgaWYoY2hhcnNldCA9PSAxMzQpCi0JCXJldHVybiA5MzY7Ci0JZWxzZSBpZihjaGFyc2V0ID09IDEyOSkKLQkJcmV0dXJuIDk0OTsKLQllbHNlIGlmKGNoYXJzZXQgPT0gMTM2KQotCQlyZXR1cm4gOTUwOwotCXJldHVybiAwOworc3RhdGljIGludCBDaGFyU2V0MkNQKGludCBjaGFyc2V0KSB7CisgIGlmIChjaGFyc2V0ID09IDEyOCkKKyAgICByZXR1cm4gOTMyOworICBpZiAoY2hhcnNldCA9PSAxMzQpCisgICAgcmV0dXJuIDkzNjsKKyAgaWYgKGNoYXJzZXQgPT0gMTI5KQorICAgIHJldHVybiA5NDk7CisgIGlmIChjaGFyc2V0ID09IDEzNikKKyAgICByZXR1cm4gOTUwOworICByZXR1cm4gMDsKIH0KLUNQREZfRm9udCogQ0ZYX1N5c3RlbUhhbmRsZXI6OkFkZE5hdGl2ZVRydWVUeXBlRm9udFRvUERGKENQREZfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nIHNGb250RmFjZU5hbWUsIAotCQkJCQkJCQkJCQkJCQkgRlhfQllURSBuQ2hhcnNldCkgCi17Ci0JaWYocERvYykKLQl7Ci0JCUNGWF9Gb250KiBwRlhGb250ID0gbmV3IENGWF9Gb250KCk7Ci0JCXBGWEZvbnQtPkxvYWRTdWJzdChzRm9udEZhY2VOYW1lLFRSVUUsMCwwLDAsQ2hhclNldDJDUChuQ2hhcnNldCksRkFMU0UpOwotCQlDUERGX0ZvbnQqIHBGb250ID0gcERvYy0+QWRkRm9udChwRlhGb250LG5DaGFyc2V0LEZBTFNFKTsKLQkJZGVsZXRlIHBGWEZvbnQ7Ci0JCXJldHVybiBwRm9udDsKLQl9CitDUERGX0ZvbnQqIENGWF9TeXN0ZW1IYW5kbGVyOjpBZGROYXRpdmVUcnVlVHlwZUZvbnRUb1BERigKKyAgICBDUERGX0RvY3VtZW50KiBwRG9jLAorICAgIENGWF9CeXRlU3RyaW5nIHNGb250RmFjZU5hbWUsCisgICAgdWludDhfdCBuQ2hhcnNldCkgeworICBpZiAocERvYykgeworICAgIENGWF9Gb250KiBwRlhGb250ID0gbmV3IENGWF9Gb250KCk7CisgICAgcEZYRm9udC0+TG9hZFN1YnN0KHNGb250RmFjZU5hbWUsIFRSVUUsIDAsIDAsIDAsIENoYXJTZXQyQ1AobkNoYXJzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisgICAgQ1BERl9Gb250KiBwRm9udCA9IHBEb2MtPkFkZEZvbnQocEZYRm9udCwgbkNoYXJzZXQsIEZBTFNFKTsKKyAgICBkZWxldGUgcEZYRm9udDsKKyAgICByZXR1cm4gcEZvbnQ7CisgIH0KIAotCXJldHVybiBOVUxMOworICByZXR1cm4gTlVMTDsKIH0KIAotCi1GWF9JTlQzMiBDRlhfU3lzdGVtSGFuZGxlcjo6U2V0VGltZXIoRlhfSU5UMzIgdUVsYXBzZSwgVGltZXJDYWxsYmFjayBscFRpbWVyRnVuYykKLXsKLQlyZXR1cm4gbV9wRW52LT5GRklfU2V0VGltZXIodUVsYXBzZSwgbHBUaW1lckZ1bmMpOworaW50MzJfdCBDRlhfU3lzdGVtSGFuZGxlcjo6U2V0VGltZXIoaW50MzJfdCB1RWxhcHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZXJDYWxsYmFjayBscFRpbWVyRnVuYykgeworICByZXR1cm4gbV9wRW52LT5GRklfU2V0VGltZXIodUVsYXBzZSwgbHBUaW1lckZ1bmMpOwogfQotdm9pZCBDRlhfU3lzdGVtSGFuZGxlcjo6S2lsbFRpbWVyKEZYX0lOVDMyIG5JRCkKLXsKLQltX3BFbnYtPkZGSV9LaWxsVGltZXIobklEKTsKK3ZvaWQgQ0ZYX1N5c3RlbUhhbmRsZXI6OktpbGxUaW1lcihpbnQzMl90IG5JRCkgeworICBtX3BFbnYtPkZGSV9LaWxsVGltZXIobklEKTsKIH0KIAotRlhfU1lTVEVNVElNRSBDRlhfU3lzdGVtSGFuZGxlcjo6R2V0TG9jYWxUaW1lKCkKLXsKLQlyZXR1cm4gbV9wRW52LT5GRklfR2V0TG9jYWxUaW1lKCk7CitGWF9TWVNURU1USU1FIENGWF9TeXN0ZW1IYW5kbGVyOjpHZXRMb2NhbFRpbWUoKSB7CisgIHJldHVybiBtX3BFbnYtPkZGSV9HZXRMb2NhbFRpbWUoKTsKIH0KIAotCi1DSlNfUnVudGltZUZhY3RvcnkqIEdldEpTUnVudGltZUZhY3RvcnkoKQotewotCXN0YXRpYyBDSlNfUnVudGltZUZhY3Rvcnkgc19KU1J1bnRpbWVGYWN0b3J5OwotCXJldHVybiAmc19KU1J1bnRpbWVGYWN0b3J5OworQ1BERkRvY19FbnZpcm9ubWVudDo6Q1BERkRvY19FbnZpcm9ubWVudChVbmRlcmx5aW5nRG9jdW1lbnRUeXBlKiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZPUk1GSUxMSU5GTyogcEZGaW5mbykKKyAgICA6IG1fcEluZm8ocEZGaW5mbyksIG1fcFNES0RvYyhOVUxMKSwgbV9wVW5kZXJseWluZ0RvYyhwRG9jKSB7CisgIG1fcFN5c0hhbmRsZXIucmVzZXQobmV3IENGWF9TeXN0ZW1IYW5kbGVyKHRoaXMpKTsKIH0KIAotQ1BERkRvY19FbnZpcm9ubWVudDo6Q1BERkRvY19FbnZpcm9ubWVudChDUERGX0RvY3VtZW50KiBwRG9jKSA6Ci0JbV9wQW5ub3RIYW5kbGVyTWdyKE5VTEwpLAotCW1fcEFjdGlvbkhhbmRsZXIoTlVMTCksCi0JbV9wSlNSdW50aW1lKE5VTEwpLAotCW1fcEluZm8oTlVMTCksCi0JbV9wU0RLRG9jKE5VTEwpLAotCW1fcFBERkRvYyhwRG9jKSwKLQltX3BJRm9ybUZpbGxlcihOVUxMKQotewotCi0JbV9wU3lzSGFuZGxlciA9IE5VTEw7Ci0JbV9wU3lzSGFuZGxlciA9IG5ldyBDRlhfU3lzdGVtSGFuZGxlcih0aGlzKTsKLQotCQotCW1fcEpTUnVudGltZUZhY3RvcnkgPSBOVUxMOwotCW1fcEpTUnVudGltZUZhY3RvcnkgPSBHZXRKU1J1bnRpbWVGYWN0b3J5KCk7Ci0JbV9wSlNSdW50aW1lRmFjdG9yeS0+QWRkUmVmKCk7CitDUERGRG9jX0Vudmlyb25tZW50Ojp+Q1BERkRvY19FbnZpcm9ubWVudCgpIHsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBDUERGWEZBX0FwcCogcFByb3ZpZGVyID0gQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCk7CisgIGlmIChwUHJvdmlkZXItPm1fcEVudkxpc3QuR2V0U2l6ZSgpID09IDApCisgICAgcFByb3ZpZGVyLT5TZXRKYXZhU2NyaXB0SW5pdGlhbGl6ZWQoRkFMU0UpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogfQogCi1DUERGRG9jX0Vudmlyb25tZW50Ojp+Q1BERkRvY19FbnZpcm9ubWVudCgpCi17Ci0KLQlpZiAoIG1fcElGb3JtRmlsbGVyICkKLQl7Ci0JCWRlbGV0ZSBtX3BJRm9ybUZpbGxlcjsKLQkJbV9wSUZvcm1GaWxsZXIgPSBOVUxMOwotCX0KLQlpZihtX3BKU1J1bnRpbWUgJiYgbV9wSlNSdW50aW1lRmFjdG9yeSkKLQkJbV9wSlNSdW50aW1lRmFjdG9yeS0+RGVsZXRlSlNSdW50aW1lKG1fcEpTUnVudGltZSk7Ci0JbV9wSlNSdW50aW1lRmFjdG9yeS0+UmVsZWFzZSgpOwotCi0JaWYobV9wU3lzSGFuZGxlcikKLQl7Ci0JCWRlbGV0ZSBtX3BTeXNIYW5kbGVyOwotCQltX3BTeXNIYW5kbGVyID0gTlVMTDsKLQl9Ci0KLQlpZihtX3BBbm5vdEhhbmRsZXJNZ3IpCi0JewotCQlkZWxldGUgbV9wQW5ub3RIYW5kbGVyTWdyOwotCQltX3BBbm5vdEhhbmRsZXJNZ3IgPSBOVUxMOwotCX0KLQlpZihtX3BBY3Rpb25IYW5kbGVyKQotCXsKLQkJZGVsZXRlIG1fcEFjdGlvbkhhbmRsZXI7Ci0JCW1fcEFjdGlvbkhhbmRsZXIgPSBOVUxMOwotCX0KLQotCitpbnQgQ1BERkRvY19FbnZpcm9ubWVudDo6SlNfYXBwQWxlcnQoY29uc3QgRlhfV0NIQVIqIE1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogVGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgSWNvbikgeworICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPmFwcF9hbGVydCkgeworICAgIENGWF9CeXRlU3RyaW5nIGJzTXNnID0gQ0ZYX1dpZGVTdHJpbmcoTXNnKS5VVEYxNkxFX0VuY29kZSgpOworICAgIENGWF9CeXRlU3RyaW5nIGJzVGl0bGUgPSBDRlhfV2lkZVN0cmluZyhUaXRsZSkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICBGUERGX1dJREVTVFJJTkcgcE1zZyA9IChGUERGX1dJREVTVFJJTkcpYnNNc2cuR2V0QnVmZmVyKGJzTXNnLkdldExlbmd0aCgpKTsKKyAgICBGUERGX1dJREVTVFJJTkcgcFRpdGxlID0KKyAgICAgICAgKEZQREZfV0lERVNUUklORylic1RpdGxlLkdldEJ1ZmZlcihic1RpdGxlLkdldExlbmd0aCgpKTsKKyAgICBpbnQgcmV0ID0gbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+YXBwX2FsZXJ0KG1fcEluZm8tPm1fcEpzUGxhdGZvcm0sIHBNc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGl0bGUsIFR5cGUsIEljb24pOworICAgIGJzTXNnLlJlbGVhc2VCdWZmZXIoKTsKKyAgICBic1RpdGxlLlJlbGVhc2VCdWZmZXIoKTsKKyAgICByZXR1cm4gcmV0OworICB9CisgIHJldHVybiAtMTsKIH0KIAotCi1JRlhKU19SdW50aW1lKiBDUERGRG9jX0Vudmlyb25tZW50OjpHZXRKU1J1bnRpbWUoKQotewotCWlmKCFJc0pTSW5pdGlhdGVkKCkpCi0JCXJldHVybiBOVUxMOwotCWFzc2VydChtX3BKU1J1bnRpbWVGYWN0b3J5KTsKLQlpZighbV9wSlNSdW50aW1lKQotCQltX3BKU1J1bnRpbWUgPSBtX3BKU1J1bnRpbWVGYWN0b3J5LT5OZXdKU1J1bnRpbWUodGhpcyk7Ci0JcmV0dXJuIG1fcEpTUnVudGltZTsKK2ludCBDUERGRG9jX0Vudmlyb25tZW50OjpKU19hcHBSZXNwb25zZShjb25zdCBGWF9XQ0hBUiogUXVlc3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIFRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBjTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIGJQYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKSB7CisgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0gJiYKKyAgICAgIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPmFwcF9yZXNwb25zZSkgeworICAgIENGWF9CeXRlU3RyaW5nIGJzUXVlc3Rpb24gPSBDRlhfV2lkZVN0cmluZyhRdWVzdGlvbikuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICBDRlhfQnl0ZVN0cmluZyBic1RpdGxlID0gQ0ZYX1dpZGVTdHJpbmcoVGl0bGUpLlVURjE2TEVfRW5jb2RlKCk7CisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEZWZhdWx0ID0gQ0ZYX1dpZGVTdHJpbmcoRGVmYXVsdCkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICBDRlhfQnl0ZVN0cmluZyBic0xhYmVsID0gQ0ZYX1dpZGVTdHJpbmcoY0xhYmVsKS5VVEYxNkxFX0VuY29kZSgpOworICAgIEZQREZfV0lERVNUUklORyBwUXVlc3Rpb24gPQorICAgICAgICAoRlBERl9XSURFU1RSSU5HKWJzUXVlc3Rpb24uR2V0QnVmZmVyKGJzUXVlc3Rpb24uR2V0TGVuZ3RoKCkpOworICAgIEZQREZfV0lERVNUUklORyBwVGl0bGUgPQorICAgICAgICAoRlBERl9XSURFU1RSSU5HKWJzVGl0bGUuR2V0QnVmZmVyKGJzVGl0bGUuR2V0TGVuZ3RoKCkpOworICAgIEZQREZfV0lERVNUUklORyBwRGVmYXVsdCA9CisgICAgICAgIChGUERGX1dJREVTVFJJTkcpYnNEZWZhdWx0LkdldEJ1ZmZlcihic0RlZmF1bHQuR2V0TGVuZ3RoKCkpOworICAgIEZQREZfV0lERVNUUklORyBwTGFiZWwgPQorICAgICAgICAoRlBERl9XSURFU1RSSU5HKWJzTGFiZWwuR2V0QnVmZmVyKGJzTGFiZWwuR2V0TGVuZ3RoKCkpOworICAgIGludCByZXQgPSBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5hcHBfcmVzcG9uc2UoCisgICAgICAgIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0sIHBRdWVzdGlvbiwgcFRpdGxlLCBwRGVmYXVsdCwgcExhYmVsLCBiUGFzc3dvcmQsCisgICAgICAgIHJlc3BvbnNlLCBsZW5ndGgpOworICAgIGJzUXVlc3Rpb24uUmVsZWFzZUJ1ZmZlcigpOworICAgIGJzVGl0bGUuUmVsZWFzZUJ1ZmZlcigpOworICAgIGJzRGVmYXVsdC5SZWxlYXNlQnVmZmVyKCk7CisgICAgYnNMYWJlbC5SZWxlYXNlQnVmZmVyKCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICByZXR1cm4gLTE7CiB9CiAKLUNQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBDUERGRG9jX0Vudmlyb25tZW50OjpHZXRBbm5vdEhhbmRsZXJNZ3IoKQotewotCWlmKCFtX3BBbm5vdEhhbmRsZXJNZ3IpCi0JCW1fcEFubm90SGFuZGxlck1nciA9IG5ldyBDUERGU0RLX0Fubm90SGFuZGxlck1ncih0aGlzKTsKLQlyZXR1cm4gbV9wQW5ub3RIYW5kbGVyTWdyOworQ0ZYX1dpZGVTdHJpbmcgQ1BERkRvY19FbnZpcm9ubWVudDo6SlNfZmllbGRCcm93c2UoKSB7CisgIGlmICghbV9wSW5mbyB8fCAhbV9wSW5mby0+bV9wSnNQbGF0Zm9ybSB8fAorICAgICAgIW1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPkZpZWxkX2Jyb3dzZSkgeworICAgIHJldHVybiBMIiI7CisgIH0KKworICBjb25zdCBpbnQgblJlcXVpcmVkTGVuID0KKyAgICAgIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPkZpZWxkX2Jyb3dzZShtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLCBudWxscHRyLCAwKTsKKyAgaWYgKG5SZXF1aXJlZExlbiA8PSAwKQorICAgIHJldHVybiBMIiI7CisKKyAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4gcEJ1ZmYobmV3IGNoYXJbblJlcXVpcmVkTGVuXSk7CisgIG1lbXNldChwQnVmZi5nZXQoKSwgMCwgblJlcXVpcmVkTGVuKTsKKyAgY29uc3QgaW50IG5BY3R1YWxMZW4gPSBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5GaWVsZF9icm93c2UoCisgICAgICBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLCBwQnVmZi5nZXQoKSwgblJlcXVpcmVkTGVuKTsKKyAgaWYgKG5BY3R1YWxMZW4gPD0gMCB8fCBuQWN0dWFsTGVuID4gblJlcXVpcmVkTGVuKQorICAgIHJldHVybiBMIiI7CisKKyAgQ0ZYX0J5dGVTdHJpbmcgYnNSZXQgPSBDRlhfQnl0ZVN0cmluZyhwQnVmZi5nZXQoKSwgbkFjdHVhbExlbik7CisgIENGWF9XaWRlU3RyaW5nIHdzUmV0ID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChic1JldCk7CisgIHJldHVybiB3c1JldDsKIH0KIAotQ1BERlNES19BY3Rpb25IYW5kbGVyKiBDUERGRG9jX0Vudmlyb25tZW50OjpHZXRBY3Rpb25IYW5kZXIoKQotewotCWlmKCFtX3BBY3Rpb25IYW5kbGVyKQotCQltX3BBY3Rpb25IYW5kbGVyID0gbmV3IENQREZTREtfQWN0aW9uSGFuZGxlcih0aGlzKTsKLQlyZXR1cm4gbV9wQWN0aW9uSGFuZGxlcjsKK0NGWF9XaWRlU3RyaW5nIENQREZEb2NfRW52aXJvbm1lbnQ6OkpTX2RvY0dldEZpbGVQYXRoKCkgeworICBpZiAoIW1fcEluZm8gfHwgIW1fcEluZm8tPm1fcEpzUGxhdGZvcm0gfHwKKyAgICAgICFtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5Eb2NfZ2V0RmlsZVBhdGgpIHsKKyAgICByZXR1cm4gTCIiOworICB9CisKKyAgY29uc3QgaW50IG5SZXF1aXJlZExlbiA9IG1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPkRvY19nZXRGaWxlUGF0aCgKKyAgICAgIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0sIG51bGxwdHIsIDApOworICBpZiAoblJlcXVpcmVkTGVuIDw9IDApCisgICAgcmV0dXJuIEwiIjsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Y2hhcltdPiBwQnVmZihuZXcgY2hhcltuUmVxdWlyZWRMZW5dKTsKKyAgbWVtc2V0KHBCdWZmLmdldCgpLCAwLCBuUmVxdWlyZWRMZW4pOworICBjb25zdCBpbnQgbkFjdHVhbExlbiA9IG1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPkRvY19nZXRGaWxlUGF0aCgKKyAgICAgIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0sIHBCdWZmLmdldCgpLCBuUmVxdWlyZWRMZW4pOworICBpZiAobkFjdHVhbExlbiA8PSAwIHx8IG5BY3R1YWxMZW4gPiBuUmVxdWlyZWRMZW4pCisgICAgcmV0dXJuIEwiIjsKKworICBDRlhfQnl0ZVN0cmluZyBic1JldCA9IENGWF9CeXRlU3RyaW5nKHBCdWZmLmdldCgpLCBuQWN0dWFsTGVuKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXQgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKGJzUmV0KTsKKyAgcmV0dXJuIHdzUmV0OwogfQogCi1pbnQgQ1BERkRvY19FbnZpcm9ubWVudDo6UmVnQXBwSGFuZGxlKEZQREZfRk9STUZJTExJTkZPKiBwRkZpbmZvKQotewotCW1fcEluZm8gID0gcEZGaW5mbzsgCi0JcmV0dXJuIFRSVUU7Cit2b2lkIENQREZEb2NfRW52aXJvbm1lbnQ6OkpTX2RvY1N1Ym1pdEZvcm0odm9pZCogZm9ybURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogVVJMKSB7CisgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0gJiYKKyAgICAgIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPkRvY19zdWJtaXRGb3JtKSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEZXN0aW5hdGlvbiA9IENGWF9XaWRlU3RyaW5nKFVSTCkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICBGUERGX1dJREVTVFJJTkcgcERlc3RpbmF0aW9uID0KKyAgICAgICAgKEZQREZfV0lERVNUUklORylic0Rlc3RpbmF0aW9uLkdldEJ1ZmZlcihic0Rlc3RpbmF0aW9uLkdldExlbmd0aCgpKTsKKyAgICBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5Eb2Nfc3VibWl0Rm9ybShtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLCBmb3JtRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsIHBEZXN0aW5hdGlvbik7CisgICAgYnNEZXN0aW5hdGlvbi5SZWxlYXNlQnVmZmVyKCk7CisgIH0KIH0KIAotQ1BERlNES19Eb2N1bWVudCogQ1BERkRvY19FbnZpcm9ubWVudDo6R2V0Q3VycmVudERvYygpCi17Ci0JcmV0dXJuIG1fcFNES0RvYzsKK3ZvaWQgQ1BERkRvY19FbnZpcm9ubWVudDo6SlNfZG9jbWFpbEZvcm0odm9pZCogbWFpbERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiVUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBUbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIFN1YmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBDQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIEJDQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIE1zZykgeworICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPkRvY19tYWlsKSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNUbyA9IENGWF9XaWRlU3RyaW5nKFRvKS5VVEYxNkxFX0VuY29kZSgpOworICAgIENGWF9CeXRlU3RyaW5nIGJzQ0MgPSBDRlhfV2lkZVN0cmluZyhTdWJqZWN0KS5VVEYxNkxFX0VuY29kZSgpOworICAgIENGWF9CeXRlU3RyaW5nIGJzQmNjID0gQ0ZYX1dpZGVTdHJpbmcoQkNDKS5VVEYxNkxFX0VuY29kZSgpOworICAgIENGWF9CeXRlU3RyaW5nIGJzU3ViamVjdCA9IENGWF9XaWRlU3RyaW5nKFN1YmplY3QpLlVURjE2TEVfRW5jb2RlKCk7CisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNNc2cgPSBDRlhfV2lkZVN0cmluZyhNc2cpLlVURjE2TEVfRW5jb2RlKCk7CisgICAgRlBERl9XSURFU1RSSU5HIHBUbyA9IChGUERGX1dJREVTVFJJTkcpYnNUby5HZXRCdWZmZXIoYnNUby5HZXRMZW5ndGgoKSk7CisgICAgRlBERl9XSURFU1RSSU5HIHBDQyA9IChGUERGX1dJREVTVFJJTkcpYnNDQy5HZXRCdWZmZXIoYnNDQy5HZXRMZW5ndGgoKSk7CisgICAgRlBERl9XSURFU1RSSU5HIHBCY2MgPSAoRlBERl9XSURFU1RSSU5HKWJzQmNjLkdldEJ1ZmZlcihic0JjYy5HZXRMZW5ndGgoKSk7CisgICAgRlBERl9XSURFU1RSSU5HIHBTdWJqZWN0ID0KKyAgICAgICAgKEZQREZfV0lERVNUUklORylic1N1YmplY3QuR2V0QnVmZmVyKGJzU3ViamVjdC5HZXRMZW5ndGgoKSk7CisgICAgRlBERl9XSURFU1RSSU5HIHBNc2cgPSAoRlBERl9XSURFU1RSSU5HKWJzTXNnLkdldEJ1ZmZlcihic01zZy5HZXRMZW5ndGgoKSk7CisgICAgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+RG9jX21haWwobV9wSW5mby0+bV9wSnNQbGF0Zm9ybSwgbWFpbERhdGEsIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVUksIHBUbywgcFN1YmplY3QsIHBDQywgcEJjYywgcE1zZyk7CisgICAgYnNUby5SZWxlYXNlQnVmZmVyKCk7CisgICAgYnNDQy5SZWxlYXNlQnVmZmVyKCk7CisgICAgYnNCY2MuUmVsZWFzZUJ1ZmZlcigpOworICAgIGJzU3ViamVjdC5SZWxlYXNlQnVmZmVyKCk7CisgICAgYnNNc2cuUmVsZWFzZUJ1ZmZlcigpOworICB9CiB9CiAKLUNGRkxfSUZvcm1GaWxsZXIqIENQREZEb2NfRW52aXJvbm1lbnQ6OkdldElGb3JtRmlsbGVyKCkKLXsKLQlpZighbV9wSUZvcm1GaWxsZXIpCi0JCW1fcElGb3JtRmlsbGVyID0gbmV3IENGRkxfSUZvcm1GaWxsZXIodGhpcyk7Ci0JcmV0dXJuIG1fcElGb3JtRmlsbGVyOworSUpTX1J1bnRpbWUqIENQREZEb2NfRW52aXJvbm1lbnQ6OkdldEpTUnVudGltZSgpIHsKKyAgaWYgKCFJc0pTSW5pdGlhdGVkKCkpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmICghbV9wSlNSdW50aW1lKQorICAgIG1fcEpTUnVudGltZS5yZXNldChJSlNfUnVudGltZTo6Q3JlYXRlKHRoaXMpKTsKKyAgcmV0dXJuIG1fcEpTUnVudGltZS5nZXQoKTsKIH0KIAotRlhfQk9PTAlDUERGRG9jX0Vudmlyb25tZW50OjpJc0pTSW5pdGlhdGVkKCkKLXsKLQlpZihtX3BJbmZvKQotCXsKLQkJaWYobV9wSW5mby0+bV9wSnNQbGF0Zm9ybSkKLQkJCXJldHVybiBUUlVFOwotCQllbHNlCi0JCQlyZXR1cm4gRkFMU0U7Ci0JfQotCXJldHVybiBGQUxTRTsKK0NQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBDUERGRG9jX0Vudmlyb25tZW50OjpHZXRBbm5vdEhhbmRsZXJNZ3IoKSB7CisgIGlmICghbV9wQW5ub3RIYW5kbGVyTWdyKQorICAgIG1fcEFubm90SGFuZGxlck1nci5yZXNldChuZXcgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IodGhpcykpOworICByZXR1cm4gbV9wQW5ub3RIYW5kbGVyTWdyLmdldCgpOwogfQogCi1DUERGU0RLX0RvY3VtZW50OjpDUERGU0RLX0RvY3VtZW50KENQREZfRG9jdW1lbnQqIHBEb2MsQ1BERkRvY19FbnZpcm9ubWVudCogcEVudik6bV9wRG9jKHBEb2MpLAotCQkJCQkJbV9wSW50ZXJGb3JtKE5VTEwpLG1fcEVudihwRW52KSxtX3BPY2NvbnRlbnQoTlVMTCksbV9iQ2hhbmdlTWFzayhGQUxTRSkKLXsKLQltX3BGb2N1c0Fubm90ID0gTlVMTDsKK0NQREZTREtfQWN0aW9uSGFuZGxlciogQ1BERkRvY19FbnZpcm9ubWVudDo6R2V0QWN0aW9uSGFuZGVyKCkgeworICBpZiAoIW1fcEFjdGlvbkhhbmRsZXIpCisgICAgbV9wQWN0aW9uSGFuZGxlci5yZXNldChuZXcgQ1BERlNES19BY3Rpb25IYW5kbGVyKCkpOworICByZXR1cm4gbV9wQWN0aW9uSGFuZGxlci5nZXQoKTsKIH0KIAotQ1BERlNES19Eb2N1bWVudDo6fkNQREZTREtfRG9jdW1lbnQoKQotewotCUZYX1BPU0lUSU9OIHBvcyA9IG1fcGFnZU1hcC5HZXRTdGFydFBvc2l0aW9uKCk7Ci0Jd2hpbGUgKHBvcykgewotICAgICAgICAgICAgQ1BERl9QYWdlKiBwUGFnZSA9IE5VTEw7Ci0gICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBOVUxMOwotICAgICAgICAgICAgbV9wYWdlTWFwLkdldE5leHRBc3NvYyhwb3MsIHBQYWdlLCBwUGFnZVZpZXcpOwotICAgICAgICAgICAgZGVsZXRlIHBQYWdlVmlldzsKK0NGRkxfSUZvcm1GaWxsZXIqIENQREZEb2NfRW52aXJvbm1lbnQ6OkdldElGb3JtRmlsbGVyKCkgeworICBpZiAoIW1fcElGb3JtRmlsbGVyKQorICAgIG1fcElGb3JtRmlsbGVyLnJlc2V0KG5ldyBDRkZMX0lGb3JtRmlsbGVyKHRoaXMpKTsKKyAgcmV0dXJuIG1fcElGb3JtRmlsbGVyLmdldCgpOworfQorCitDUERGU0RLX0RvY3VtZW50OjpDUERGU0RLX0RvY3VtZW50KFVuZGVybHlpbmdEb2N1bWVudFR5cGUqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYpCisgICAgOiBtX3BEb2MocERvYyksCisgICAgICBtX3BGb2N1c0Fubm90KG51bGxwdHIpLAorICAgICAgbV9wRW52KHBFbnYpLAorICAgICAgbV9iQ2hhbmdlTWFzayhGQUxTRSksCisgICAgICBtX2JCZWluZ0Rlc3Ryb3llZChGQUxTRSkge30KKworQ1BERlNES19Eb2N1bWVudDo6fkNQREZTREtfRG9jdW1lbnQoKSB7CisgIG1fYkJlaW5nRGVzdHJveWVkID0gVFJVRTsKKworICBmb3IgKGF1dG8mIGl0IDogbV9wYWdlTWFwKQorICAgIGl0LnNlY29uZC0+S2lsbEZvY3VzQW5ub3RJZk5lZWRlZCgpOworCisgIGZvciAoYXV0byYgaXQgOiBtX3BhZ2VNYXApCisgICAgZGVsZXRlIGl0LnNlY29uZDsKKyAgbV9wYWdlTWFwLmNsZWFyKCk7Cit9CisKK0NQREZTREtfUGFnZVZpZXcqIENQREZTREtfRG9jdW1lbnQ6OkdldFBhZ2VWaWV3KAorICAgIFVuZGVybHlpbmdQYWdlVHlwZSogcFVuZGVybHlpbmdQYWdlLAorICAgIEZYX0JPT0wgUmVOZXcpIHsKKyAgYXV0byBpdCA9IG1fcGFnZU1hcC5maW5kKHBVbmRlcmx5aW5nUGFnZSk7CisgIGlmIChpdCAhPSBtX3BhZ2VNYXAuZW5kKCkpCisgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisKKyAgaWYgKCFSZU5ldykKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBuZXcgQ1BERlNES19QYWdlVmlldyh0aGlzLCBwVW5kZXJseWluZ1BhZ2UpOworICBtX3BhZ2VNYXBbcFVuZGVybHlpbmdQYWdlXSA9IHBQYWdlVmlldzsKKyAgLy8gRGVsYXkgdG8gbG9hZCBhbGwgdGhlIGFubm90YXRpb25zLCB0byBhdm9pZCBlbmRsZXNzIGxvb3AuCisgIHBQYWdlVmlldy0+TG9hZEZYQW5ub3RzKCk7CisgIHJldHVybiBwUGFnZVZpZXc7Cit9CisKK0NQREZTREtfUGFnZVZpZXcqIENQREZTREtfRG9jdW1lbnQ6OkdldEN1cnJlbnRWaWV3KCkgeworICBVbmRlcmx5aW5nUGFnZVR5cGUqIHBQYWdlID0KKyAgICAgIFVuZGVybHlpbmdGcm9tRlBERlBhZ2UobV9wRW52LT5GRklfR2V0Q3VycmVudFBhZ2UobV9wRG9jKSk7CisgIHJldHVybiBwUGFnZSA/IEdldFBhZ2VWaWV3KHBQYWdlLCBUUlVFKSA6IG51bGxwdHI7Cit9CisKK0NQREZTREtfUGFnZVZpZXcqIENQREZTREtfRG9jdW1lbnQ6OkdldFBhZ2VWaWV3KGludCBuSW5kZXgpIHsKKyAgVW5kZXJseWluZ1BhZ2VUeXBlKiBwVGVtcFBhZ2UgPQorICAgICAgVW5kZXJseWluZ0Zyb21GUERGUGFnZShtX3BFbnYtPkZGSV9HZXRQYWdlKG1fcERvYywgbkluZGV4KSk7CisgIGlmICghcFRlbXBQYWdlKQorICAgIHJldHVybiBudWxscHRyOworCisgIGF1dG8gaXQgPSBtX3BhZ2VNYXAuZmluZChwVGVtcFBhZ2UpOworICByZXR1cm4gaXQtPnNlY29uZDsKK30KKwordm9pZCBDUERGU0RLX0RvY3VtZW50OjpQcm9jSmF2YXNjcmlwdEZ1bigpIHsKKyAgQ1BERl9Eb2N1bWVudCogcFBERkRvYyA9IEdldFBERkRvY3VtZW50KCk7CisgIENQREZfRG9jSlNBY3Rpb25zIGRvY0pTKHBQREZEb2MpOworICBpbnQgaUNvdW50ID0gZG9jSlMuQ291bnRKU0FjdGlvbnMoKTsKKyAgaWYgKGlDb3VudCA8IDEpCisgICAgcmV0dXJuOworICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgY3NKU05hbWU7CisgICAgQ1BERl9BY3Rpb24ganNBY3Rpb24gPSBkb2NKUy5HZXRKU0FjdGlvbihpLCBjc0pTTmFtZSk7CisgICAgaWYgKG1fcEVudi0+R2V0QWN0aW9uSGFuZGVyKCkpCisgICAgICBtX3BFbnYtPkdldEFjdGlvbkhhbmRlcigpLT5Eb0FjdGlvbl9KYXZhU2NyaXB0KAorICAgICAgICAgIGpzQWN0aW9uLCBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKGNzSlNOYW1lKSwgdGhpcyk7CisgIH0KK30KKworRlhfQk9PTCBDUERGU0RLX0RvY3VtZW50OjpQcm9jT3BlbkFjdGlvbigpIHsKKyAgaWYgKCFtX3BEb2MpCisgICAgcmV0dXJuIEZBTFNFOworCisgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBHZXRQREZEb2N1bWVudCgpLT5HZXRSb290KCk7CisgIGlmICghcFJvb3QpCisgICAgcmV0dXJuIEZBTFNFOworCisgIENQREZfT2JqZWN0KiBwT3BlbkFjdGlvbiA9IHBSb290LT5HZXREaWN0KCJPcGVuQWN0aW9uIik7CisgIGlmICghcE9wZW5BY3Rpb24pCisgICAgcE9wZW5BY3Rpb24gPSBwUm9vdC0+R2V0QXJyYXkoIk9wZW5BY3Rpb24iKTsKKworICBpZiAoIXBPcGVuQWN0aW9uKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAocE9wZW5BY3Rpb24tPklzQXJyYXkoKSkKKyAgICByZXR1cm4gVFJVRTsKKworICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBPcGVuQWN0aW9uLT5Bc0RpY3Rpb25hcnkoKSkgeworICAgIENQREZfQWN0aW9uIGFjdGlvbihwRGljdCk7CisgICAgaWYgKG1fcEVudi0+R2V0QWN0aW9uSGFuZGVyKCkpCisgICAgICBtX3BFbnYtPkdldEFjdGlvbkhhbmRlcigpLT5Eb0FjdGlvbl9Eb2NPcGVuKGFjdGlvbiwgdGhpcyk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCitDUERGX09DQ29udGV4dCogQ1BERlNES19Eb2N1bWVudDo6R2V0T0NDb250ZXh0KCkgeworICBpZiAoIW1fcE9jY29udGVudCkKKyAgICBtX3BPY2NvbnRlbnQucmVzZXQobmV3IENQREZfT0NDb250ZXh0KEdldFBERkRvY3VtZW50KCkpKTsKKyAgcmV0dXJuIG1fcE9jY29udGVudC5nZXQoKTsKK30KKwordm9pZCBDUERGU0RLX0RvY3VtZW50OjpSZW1vdmVQYWdlVmlldyhVbmRlcmx5aW5nUGFnZVR5cGUqIHBVbmRlcmx5aW5nUGFnZSkgeworICBhdXRvIGl0ID0gbV9wYWdlTWFwLmZpbmQocFVuZGVybHlpbmdQYWdlKTsKKyAgaWYgKGl0ID09IG1fcGFnZU1hcC5lbmQoKSkKKyAgICByZXR1cm47CisKKyAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gaXQtPnNlY29uZDsKKyAgaWYgKHBQYWdlVmlldy0+SXNMb2NrZWQoKSkKKyAgICByZXR1cm47CisKKyAgcFBhZ2VWaWV3LT5LaWxsRm9jdXNBbm5vdElmTmVlZGVkKCk7CisgIGRlbGV0ZSBwUGFnZVZpZXc7CisgIG1fcGFnZU1hcC5lcmFzZShpdCk7Cit9CisKK1VuZGVybHlpbmdQYWdlVHlwZSogQ1BERlNES19Eb2N1bWVudDo6R2V0UGFnZShpbnQgbkluZGV4KSB7CisgIHJldHVybiBVbmRlcmx5aW5nRnJvbUZQREZQYWdlKG1fcEVudi0+RkZJX0dldFBhZ2UobV9wRG9jLCBuSW5kZXgpKTsKK30KKworQ1BERlNES19JbnRlckZvcm0qIENQREZTREtfRG9jdW1lbnQ6OkdldEludGVyRm9ybSgpIHsKKyAgaWYgKCFtX3BJbnRlckZvcm0pCisgICAgbV9wSW50ZXJGb3JtLnJlc2V0KG5ldyBDUERGU0RLX0ludGVyRm9ybSh0aGlzKSk7CisgIHJldHVybiBtX3BJbnRlckZvcm0uZ2V0KCk7Cit9CisKK3ZvaWQgQ1BERlNES19Eb2N1bWVudDo6VXBkYXRlQWxsVmlld3MoQ1BERlNES19QYWdlVmlldyogcFNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIGZvciAoY29uc3QgYXV0byYgaXQgOiBtX3BhZ2VNYXApIHsKKyAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBpdC5zZWNvbmQ7CisgICAgaWYgKHBQYWdlVmlldyAhPSBwU2VuZGVyKSB7CisgICAgICBwUGFnZVZpZXctPlVwZGF0ZVZpZXcocEFubm90KTsKKyAgICB9CisgIH0KK30KKworQ1BERlNES19Bbm5vdCogQ1BERlNES19Eb2N1bWVudDo6R2V0Rm9jdXNBbm5vdCgpIHsKKyAgcmV0dXJuIG1fcEZvY3VzQW5ub3Q7Cit9CisKK0ZYX0JPT0wgQ1BERlNES19Eb2N1bWVudDo6U2V0Rm9jdXNBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX1VJTlQgbkZsYWcpIHsKKyAgaWYgKG1fYkJlaW5nRGVzdHJveWVkKQorICAgIHJldHVybiBGQUxTRTsKKworICBpZiAobV9wRm9jdXNBbm5vdCA9PSBwQW5ub3QpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaWYgKG1fcEZvY3VzQW5ub3QpIHsKKyAgICBpZiAoIUtpbGxGb2N1c0Fubm90KG5GbGFnKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmICghcEFubm90KQorICAgIHJldHVybiBGQUxTRTsKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIENQREZTREtfQW5ub3QqIHBMYXN0Rm9jdXNBbm5vdCA9IG1fcEZvY3VzQW5ub3Q7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBBbm5vdC0+R2V0UGFnZVZpZXcoKTsKKyAgaWYgKHBQYWdlVmlldyAmJiBwUGFnZVZpZXctPklzVmFsaWQoKSkgeworICAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyID0gbV9wRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKKyAgICBpZiAoIW1fcEZvY3VzQW5ub3QpIHsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICAgICAgaWYgKCFwQW5ub3RIYW5kbGVyLT5Bbm5vdF9PbkNoYW5nZUZvY3VzKHBBbm5vdCwgcExhc3RGb2N1c0Fubm90KSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICAgICAgaWYgKCFwQW5ub3RIYW5kbGVyLT5Bbm5vdF9PblNldEZvY3VzKHBBbm5vdCwgbkZsYWcpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBpZiAoIW1fcEZvY3VzQW5ub3QpIHsKKyAgICAgICAgbV9wRm9jdXNBbm5vdCA9IHBBbm5vdDsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBGQUxTRTsKK30KKworRlhfQk9PTCBDUERGU0RLX0RvY3VtZW50OjpLaWxsRm9jdXNBbm5vdChGWF9VSU5UIG5GbGFnKSB7CisgIGlmIChtX3BGb2N1c0Fubm90KSB7CisgICAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIHBBbm5vdEhhbmRsZXIgPSBtX3BFbnYtPkdldEFubm90SGFuZGxlck1ncigpOworICAgIENQREZTREtfQW5ub3QqIHBGb2N1c0Fubm90ID0gbV9wRm9jdXNBbm5vdDsKKyAgICBtX3BGb2N1c0Fubm90ID0gbnVsbHB0cjsKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgICAgaWYgKCFwQW5ub3RIYW5kbGVyLT5Bbm5vdF9PbkNoYW5nZUZvY3VzKG51bGxwdHIsIHBGb2N1c0Fubm90KSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworICAgIGlmIChwQW5ub3RIYW5kbGVyLT5Bbm5vdF9PbktpbGxGb2N1cyhwRm9jdXNBbm5vdCwgbkZsYWcpKSB7CisgICAgICBpZiAocEZvY3VzQW5ub3QtPkdldFR5cGUoKSA9PSAiV2lkZ2V0IikgeworICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEZvY3VzQW5ub3Q7CisgICAgICAgIGludCBuRmllbGRUeXBlID0gcFdpZGdldC0+R2V0RmllbGRUeXBlKCk7CisgICAgICAgIGlmIChGSUVMRFRZUEVfVEVYVEZJRUxEID09IG5GaWVsZFR5cGUgfHwKKyAgICAgICAgICAgIEZJRUxEVFlQRV9DT01CT0JPWCA9PSBuRmllbGRUeXBlKSB7CisgICAgICAgICAgbV9wRW52LT5GRklfT25TZXRGaWVsZElucHV0Rm9jdXMoTlVMTCwgTlVMTCwgMCwgRkFMU0UpOwogICAgICAgICB9Ci0gICAgICAgIG1fcGFnZU1hcC5SZW1vdmVBbGwoKTsKLQlpZihtX3BJbnRlckZvcm0pCi0JewotCQltX3BJbnRlckZvcm0tPkRlc3Ryb3koKTsKLQkJbV9wSW50ZXJGb3JtID0gTlVMTDsKLQl9Ci0JaWYobV9wT2Njb250ZW50KQotCXsKLQkJZGVsZXRlIG1fcE9jY29udGVudDsKLQkJbV9wT2Njb250ZW50ID0gTlVMTDsKLQl9CisgICAgICB9CisKKyAgICAgIGlmICghbV9wRm9jdXNBbm5vdCkKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fcEZvY3VzQW5ub3QgPSBwRm9jdXNBbm5vdDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQogCi12b2lkIENQREZTREtfRG9jdW1lbnQ6OkluaXRQYWdlVmlldygpCi17Ci0JaW50IG5Db3VudCA9IG1fcERvYy0+R2V0UGFnZUNvdW50KCk7Ci0JZm9yKGludCBpPTA7IGk8bkNvdW50OyBpKyspCi0JewotCS8vIFRvIGRvCi0vLwkJQ1BERl9EaWN0aW9uYXJ5KiBwRGljID0gbV9wRG9jLT5HZXRQYWdlKGkpOwotLy8JCW1fcGFnZU1hcC5TZXRBdChwRGljLCBwUGFnZVZpZXcpOwotCX0KK3ZvaWQgQ1BERlNES19Eb2N1bWVudDo6T25DbG9zZURvY3VtZW50KCkgeworICBLaWxsRm9jdXNBbm5vdCgpOwogfQogCi12b2lkIENQREZTREtfRG9jdW1lbnQ6OkFkZFBhZ2VWaWV3KENQREZfUGFnZSogcFBERlBhZ2UsIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykKLXsKLQltX3BhZ2VNYXAuU2V0QXQocFBERlBhZ2UsIHBQYWdlVmlldyk7CitGWF9CT09MIENQREZTREtfRG9jdW1lbnQ6OkdldFBlcm1pc3Npb25zKGludCBuRmxhZykgeworICByZXR1cm4gR2V0UERGRG9jdW1lbnQoKS0+R2V0VXNlclBlcm1pc3Npb25zKCkgJiBuRmxhZzsKIH0KIAotQ1BERlNES19QYWdlVmlldyogQ1BERlNES19Eb2N1bWVudDo6R2V0UGFnZVZpZXcoQ1BERl9QYWdlKiBwUERGUGFnZSwgRlhfQk9PTCBSZU5ldykKLXsKLQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSAoQ1BERlNES19QYWdlVmlldyopbV9wYWdlTWFwLkdldFZhbHVlQXQocFBERlBhZ2UpOwotCWlmKHBQYWdlVmlldyAhPSBOVUxMKQotCQlyZXR1cm4gcFBhZ2VWaWV3OwotCWlmKFJlTmV3KQotCXsKLQkJcFBhZ2VWaWV3ID0gbmV3IENQREZTREtfUGFnZVZpZXcodGhpcyxwUERGUGFnZSk7Ci0JCW1fcGFnZU1hcC5TZXRBdChwUERGUGFnZSwgcFBhZ2VWaWV3KTsKLQkJLy9EZWxheSB0byBsb2FkIGFsbCB0aGUgYW5ub3RhdGlvbnMsIHRvIGF2b2lkIGVuZGxlc3MgbG9vcC4KLQkJcFBhZ2VWaWV3LT5Mb2FkRlhBbm5vdHMoKTsKLQl9Ci0JcmV0dXJuIHBQYWdlVmlldzsKLQorSUpTX1J1bnRpbWUqIENQREZTREtfRG9jdW1lbnQ6OkdldEpzUnVudGltZSgpIHsKKyAgcmV0dXJuIG1fcEVudi0+R2V0SlNSdW50aW1lKCk7CiB9CiAKLUNQREZTREtfUGFnZVZpZXcqIENQREZTREtfRG9jdW1lbnQ6OkdldEN1cnJlbnRWaWV3KCkKLXsKLQlDUERGX1BhZ2UgKiBwUGFnZSA9IChDUERGX1BhZ2UgKiltX3BFbnYtPkZGSV9HZXRDdXJyZW50UGFnZShtX3BEb2MpOwotCWlmKHBQYWdlKQotCQlyZXR1cm4gdGhpcy0+R2V0UGFnZVZpZXcocFBhZ2UsIFRSVUUpOwotCXJldHVybiBOVUxMOworQ0ZYX1dpZGVTdHJpbmcgQ1BERlNES19Eb2N1bWVudDo6R2V0UGF0aCgpIHsKKyAgcmV0dXJuIG1fcEVudi0+SlNfZG9jR2V0RmlsZVBhdGgoKTsKIH0KIAotQ1BERlNES19QYWdlVmlldyogQ1BERlNES19Eb2N1bWVudDo6R2V0UGFnZVZpZXcoaW50IG5JbmRleCkKLXsKLQlDUERGU0RLX1BhZ2VWaWV3ICogcFRlbXBQYWdlVmlldyA9IE5VTEw7Ci0JQ1BERl9QYWdlICogcFRlbXBQYWdlID0gKENQREZfUGFnZSopbV9wRW52LT5GRklfR2V0UGFnZShtX3BEb2MsbkluZGV4KTsKLQlpZighcFRlbXBQYWdlKQotCQlyZXR1cm4gTlVMTDsKLQotCW1fcGFnZU1hcC5Mb29rdXAocFRlbXBQYWdlLCBwVGVtcFBhZ2VWaWV3KTsKLQkKLQlBU1NFUlQocFRlbXBQYWdlVmlldyAhPSBOVUxMKTsKLQkKLQlyZXR1cm4gcFRlbXBQYWdlVmlldzsKK0NQREZTREtfUGFnZVZpZXc6OkNQREZTREtfUGFnZVZpZXcoQ1BERlNES19Eb2N1bWVudCogcFNES0RvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5kZXJseWluZ1BhZ2VUeXBlKiBwYWdlKQorICAgIDogbV9wYWdlKHBhZ2UpLAorICAgICAgbV9wU0RLRG9jKHBTREtEb2MpLAorICAgICAgbV9DYXB0dXJlV2lkZ2V0KG51bGxwdHIpLAorI2lmbmRlZiBQREZfRU5BQkxFX1hGQQorICAgICAgbV9iVGFrZU92ZXJQYWdlKEZBTFNFKSwKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgICAgIG1fYkVudGVyV2lkZ2V0KEZBTFNFKSwKKyAgICAgIG1fYkV4aXRXaWRnZXQoRkFMU0UpLAorICAgICAgbV9iT25XaWRnZXQoRkFMU0UpLAorICAgICAgbV9iVmFsaWQoRkFMU0UpLAorICAgICAgbV9iTG9ja2VkKEZBTFNFKSB7CisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFNES0RvYy0+R2V0SW50ZXJGb3JtKCk7CisgIGlmIChwSW50ZXJGb3JtKSB7CisgICAgQ1BERl9JbnRlckZvcm0qIHBQREZJbnRlckZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICAgIGlmIChwYWdlLT5HZXRQREZQYWdlKCkpCisgICAgICBwUERGSW50ZXJGb3JtLT5GaXhQYWdlRmllbGRzKHBhZ2UtPkdldFBERlBhZ2UoKSk7CisjZWxzZSAgIC8vIFBERl9FTkFCTEVfWEZBCisgICAgcFBERkludGVyRm9ybS0+Rml4UGFnZUZpZWxkcyhwYWdlKTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgfQorI2lmbmRlZiBQREZfRU5BQkxFX1hGQQorICBtX3BhZ2UtPlNldFByaXZhdGVEYXRhKCh2b2lkKiltX3BhZ2UsICh2b2lkKil0aGlzLCBudWxscHRyKTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIH0KIAotdm9pZCBDUERGU0RLX0RvY3VtZW50OjogUHJvY0phdmFzY3JpcHRGdW4oKQotewotCUNQREZfRG9jdW1lbnQqIHBQREZEb2MgPSB0aGlzLT5HZXREb2N1bWVudCgpOwotCUNQREZfRG9jSlNBY3Rpb25zIGRvY0pTKHBQREZEb2MpOwotCWludCBpQ291bnQgPSBkb2NKUy5Db3VudEpTQWN0aW9ucygpOwotCWlmIChpQ291bnQgPCAxKSByZXR1cm47Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKyspCi0JewotCQlDRlhfQnl0ZVN0cmluZyBjc0pTTmFtZTsKLQkJQ1BERl9BY3Rpb24ganNBY3Rpb24gPSBkb2NKUy5HZXRKU0FjdGlvbihpLCBjc0pTTmFtZSk7Ci0JCWlmKG1fcEVudi0+R2V0QWN0aW9uSGFuZGVyKCkpCi0JCQltX3BFbnYtPkdldEFjdGlvbkhhbmRlcigpLT5Eb0FjdGlvbl9KYXZhU2NyaXB0KGpzQWN0aW9uLENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoY3NKU05hbWUpLHRoaXMpOwotCX0KLQkKK0NQREZTREtfUGFnZVZpZXc6On5DUERGU0RLX1BhZ2VWaWV3KCkgeworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKKyAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIHBBbm5vdEhhbmRsZXJNZ3IgPSBwRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKKyAgZm9yIChDUERGU0RLX0Fubm90KiBwQW5ub3QgOiBtX2Z4QW5ub3RBcnJheSkKKyAgICBwQW5ub3RIYW5kbGVyTWdyLT5SZWxlYXNlQW5ub3QocEFubm90KTsKKworICBtX2Z4QW5ub3RBcnJheS5jbGVhcigpOworICBtX3BBbm5vdExpc3QucmVzZXQoKTsKKyNpZm5kZWYgUERGX0VOQUJMRV9YRkEKKyAgbV9wYWdlLT5SZW1vdmVQcml2YXRlRGF0YSgodm9pZCopbV9wYWdlKTsKKyAgaWYgKG1fYlRha2VPdmVyUGFnZSkgeworICAgIGRlbGV0ZSBtX3BhZ2U7CisgIH0KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIH0KIAotRlhfQk9PTCBDUERGU0RLX0RvY3VtZW50OjpQcm9jT3BlbkFjdGlvbigpCi17Ci0JaWYoIW1fcERvYykKLQkJcmV0dXJuIEZBTFNFOwordm9pZCBDUERGU0RLX1BhZ2VWaWV3OjpQYWdlVmlld19PbkRyYXcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QmIHBDbGlwKSB7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykgeworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICBtX2N1ck1hdHJpeCA9ICpwVXNlcjJEZXZpY2U7CisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOwogCi0JQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IG1fcERvYy0+R2V0Um9vdCgpOwotCWlmICghcFJvb3QpCi0JCXJldHVybiBGQUxTRTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBDUERGWEZBX1BhZ2UqIHBQYWdlID0gR2V0UERGWEZBUGFnZSgpOworICBpZiAoIXBQYWdlKQorICAgIHJldHVybjsKIAotCUNQREZfT2JqZWN0KiBwT3BlbkFjdGlvbiA9IHBSb290LT5HZXREaWN0KCJPcGVuQWN0aW9uIik7Ci0JaWYoIXBPcGVuQWN0aW9uKQotCQlwT3BlbkFjdGlvbiA9IHBSb290LT5HZXRBcnJheSgiT3BlbkFjdGlvbiIpOworICBpZiAocFBhZ2UtPkdldERvY3VtZW50KCktPkdldERvY1R5cGUoKSA9PSBET0NUWVBFX0RZTkFNSUNfWEZBKSB7CisgICAgQ0ZYX0dyYXBoaWNzIGdzOworICAgIGdzLkNyZWF0ZShwRGV2aWNlKTsKKyAgICBDRlhfUmVjdEYgcmVjdENsaXA7CisgICAgcmVjdENsaXAuU2V0KHN0YXRpY19jYXN0PEZYX0ZMT0FUPihwQ2xpcC5sZWZ0KSwKKyAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHBDbGlwLnRvcCksCisgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihwQ2xpcC5XaWR0aCgpKSwKKyAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHBDbGlwLkhlaWdodCgpKSk7CisgICAgZ3MuU2V0Q2xpcFJlY3QocmVjdENsaXApOworICAgIElYRkFfUmVuZGVyQ29udGV4dCogcFJlbmRlckNvbnRleHQgPSBYRkFfUmVuZGVyQ29udGV4dF9DcmVhdGUoKTsKKyAgICBpZiAoIXBSZW5kZXJDb250ZXh0KQorICAgICAgcmV0dXJuOworICAgIENYRkFfUmVuZGVyT3B0aW9ucyByZW5kZXJPcHRpb25zOworICAgIHJlbmRlck9wdGlvbnMubV9iSGlnaGxpZ2h0ID0gVFJVRTsKKyAgICBJWEZBX1BhZ2VWaWV3KiB4ZmFWaWV3ID0gcFBhZ2UtPkdldFhGQVBhZ2VWaWV3KCk7CisgICAgcFJlbmRlckNvbnRleHQtPlN0YXJ0UmVuZGVyKHhmYVZpZXcsICZncywgKnBVc2VyMkRldmljZSwgcmVuZGVyT3B0aW9ucyk7CisgICAgcFJlbmRlckNvbnRleHQtPkRvUmVuZGVyKCk7CisgICAgcFJlbmRlckNvbnRleHQtPlN0b3BSZW5kZXIoKTsKKyAgICBwUmVuZGVyQ29udGV4dC0+UmVsZWFzZSgpOworICAgIElYRkFfRG9jVmlldyogZG9jVmlldyA9IHhmYVZpZXctPkdldERvY1ZpZXcoKTsKKyAgICBpZiAoIWRvY1ZpZXcpCisgICAgICByZXR1cm47CisgICAgQ1BERlNES19Bbm5vdCogYW5ub3QgPSBHZXRGb2N1c0Fubm90KCk7CisgICAgaWYgKCFhbm5vdCkKKyAgICAgIHJldHVybjsKKyAgICAvLyBSZW5kZXIgdGhlIGZvY3VzIHdpZGdldAorICAgIGRvY1ZpZXctPkdldFdpZGdldEhhbmRsZXIoKS0+UmVuZGVyV2lkZ2V0KGFubm90LT5HZXRYRkFXaWRnZXQoKSwgJmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyMkRldmljZSwgRkFMU0UpOworICAgIHJldHVybjsKKyAgfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCi0JaWYoIXBPcGVuQWN0aW9uKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlpZihwT3BlbkFjdGlvbi0+R2V0VHlwZSgpPT1QREZPQkpfQVJSQVkpCi0JCXJldHVybiBUUlVFOwotCi0JaWYocE9wZW5BY3Rpb24tPkdldFR5cGUoKT09UERGT0JKX0RJQ1RJT05BUlkpCi0JewotCQlDUERGX0RpY3Rpb25hcnkgKiBwRGljdD0oQ1BERl9EaWN0aW9uYXJ5KilwT3BlbkFjdGlvbjsKLQkJQ1BERl9BY3Rpb24gYWN0aW9uKHBEaWN0KTsKLQkJaWYobV9wRW52LT5HZXRBY3Rpb25IYW5kZXIoKSkKLQkJCW1fcEVudi0+R2V0QWN0aW9uSGFuZGVyKCktPkRvQWN0aW9uX0RvY09wZW4oYWN0aW9uLCB0aGlzKTsKLQkJcmV0dXJuIFRSVUU7Ci0JfQotCXJldHVybiBGQUxTRTsKKyAgLy8gZm9yIHBkZi9zdGF0aWMgeGZhLgorICBDUERGU0RLX0Fubm90SXRlcmF0b3IgYW5ub3RJdGVyYXRvcih0aGlzLCB0cnVlKTsKKyAgd2hpbGUgKENQREZTREtfQW5ub3QqIHBTREtBbm5vdCA9IGFubm90SXRlcmF0b3IuTmV4dCgpKSB7CisgICAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIHBBbm5vdEhhbmRsZXJNZ3IgPSBwRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKKyAgICBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9PbkRyYXcodGhpcywgcFNES0Fubm90LCBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIDApOworICB9CiB9CiAKLUNQREZfT0NDb250ZXh0KglDUERGU0RLX0RvY3VtZW50OjpHZXRPQ0NvbnRleHQoKQotewotCWlmKCFtX3BPY2NvbnRlbnQpCi0JCW1fcE9jY29udGVudCA9IG5ldyBDUERGX09DQ29udGV4dChtX3BEb2MpOwotCXJldHVybiBtX3BPY2NvbnRlbnQ7Citjb25zdCBDUERGX0Fubm90KiBDUERGU0RLX1BhZ2VWaWV3OjpHZXRQREZBbm5vdEF0UG9pbnQoRlhfRkxPQVQgcGFnZVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcGFnZVkpIHsKKyAgZm9yIChjb25zdCBDUERGX0Fubm90KiBwQW5ub3QgOiBtX3BBbm5vdExpc3QtPkFsbCgpKSB7CisgICAgQ0ZYX0Zsb2F0UmVjdCBhbm5vdFJlY3Q7CisgICAgcEFubm90LT5HZXRSZWN0KGFubm90UmVjdCk7CisgICAgaWYgKGFubm90UmVjdC5Db250YWlucyhwYWdlWCwgcGFnZVkpKQorICAgICAgcmV0dXJuIHBBbm5vdDsKKyAgfQorICByZXR1cm4gbnVsbHB0cjsKIH0KIAotdm9pZCBDUERGU0RLX0RvY3VtZW50OjpSZU1vdmVQYWdlVmlldyhDUERGX1BhZ2UqIHBQREZQYWdlKQotewotCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IChDUERGU0RLX1BhZ2VWaWV3KiltX3BhZ2VNYXAuR2V0VmFsdWVBdChwUERGUGFnZSk7Ci0JaWYocFBhZ2VWaWV3ICYmICFwUGFnZVZpZXctPklzTG9ja2VkKCkpCi0JewotCQlkZWxldGUgcFBhZ2VWaWV3OwotCQltX3BhZ2VNYXAuUmVtb3ZlS2V5KHBQREZQYWdlKTsKLQl9Citjb25zdCBDUERGX0Fubm90KiBDUERGU0RLX1BhZ2VWaWV3OjpHZXRQREZXaWRnZXRBdFBvaW50KEZYX0ZMT0FUIHBhZ2VYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwYWdlWSkgeworICBmb3IgKGNvbnN0IENQREZfQW5ub3QqIHBBbm5vdCA6IG1fcEFubm90TGlzdC0+QWxsKCkpIHsKKyAgICBpZiAocEFubm90LT5HZXRTdWJUeXBlKCkgPT0gIldpZGdldCIpIHsKKyAgICAgIENGWF9GbG9hdFJlY3QgYW5ub3RSZWN0OworICAgICAgcEFubm90LT5HZXRSZWN0KGFubm90UmVjdCk7CisgICAgICBpZiAoYW5ub3RSZWN0LkNvbnRhaW5zKHBhZ2VYLCBwYWdlWSkpCisgICAgICAgIHJldHVybiBwQW5ub3Q7CisgICAgfQorICB9CisgIHJldHVybiBudWxscHRyOwogfQogCi1DUERGX1BhZ2UgKiBDUERGU0RLX0RvY3VtZW50OjpHZXRQYWdlKGludCBuSW5kZXgpCi17Ci0JQ1BERl9QYWdlICogcFRlbXBQYWdlID0gKENQREZfUGFnZSopbV9wRW52LT5GRklfR2V0UGFnZShtX3BEb2MsbkluZGV4KTsKLQlpZighcFRlbXBQYWdlKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gcFRlbXBQYWdlOworQ1BERlNES19Bbm5vdCogQ1BERlNES19QYWdlVmlldzo6R2V0RlhBbm5vdEF0UG9pbnQoRlhfRkxPQVQgcGFnZVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwYWdlWSkgeworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKKyAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIHBBbm5vdE1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOworICBDUERGU0RLX0Fubm90SXRlcmF0b3IgYW5ub3RJdGVyYXRvcih0aGlzLCBmYWxzZSk7CisgIHdoaWxlIChDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QgPSBhbm5vdEl0ZXJhdG9yLk5leHQoKSkgeworICAgIENQREZfUmVjdCByYyA9IHBBbm5vdE1nci0+QW5ub3RfT25HZXRWaWV3QkJveCh0aGlzLCBwU0RLQW5ub3QpOworICAgIGlmIChyYy5Db250YWlucyhwYWdlWCwgcGFnZVkpKQorICAgICAgcmV0dXJuIHBTREtBbm5vdDsKKyAgfQorCisgIHJldHVybiBudWxscHRyOwogfQogCi1DUERGU0RLX0ludGVyRm9ybSogQ1BERlNES19Eb2N1bWVudDo6R2V0SW50ZXJGb3JtKCkKLXsKLQlpZighbV9wSW50ZXJGb3JtKQotCQltX3BJbnRlckZvcm0gPSBuZXcgQ1BERlNES19JbnRlckZvcm0odGhpcyk7Ci0JcmV0dXJuIG1fcEludGVyRm9ybTsKK0NQREZTREtfQW5ub3QqIENQREZTREtfUGFnZVZpZXc6OkdldEZYV2lkZ2V0QXRQb2ludChGWF9GTE9BVCBwYWdlWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwYWdlWSkgeworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKKyAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIHBBbm5vdE1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOworICBDUERGU0RLX0Fubm90SXRlcmF0b3IgYW5ub3RJdGVyYXRvcih0aGlzLCBmYWxzZSk7CisgIHdoaWxlIChDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QgPSBhbm5vdEl0ZXJhdG9yLk5leHQoKSkgeworICAgIGJvb2wgYkhpdFRlc3QgPSBwU0RLQW5ub3QtPkdldFR5cGUoKSA9PSAiV2lkZ2V0IjsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICAgIGJIaXRUZXN0ID0gYkhpdFRlc3QgfHwgcFNES0Fubm90LT5HZXRUeXBlKCkgPT0gRlNES19YRkFXSURHRVRfVFlQRU5BTUU7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisgICAgaWYgKGJIaXRUZXN0KSB7CisgICAgICBwQW5ub3RNZ3ItPkFubm90X09uR2V0Vmlld0JCb3godGhpcywgcFNES0Fubm90KTsKKyAgICAgIENQREZfUG9pbnQgcG9pbnQocGFnZVgsIHBhZ2VZKTsKKyAgICAgIGlmIChwQW5ub3RNZ3ItPkFubm90X09uSGl0VGVzdCh0aGlzLCBwU0RLQW5ub3QsIHBvaW50KSkKKyAgICAgICAgcmV0dXJuIHBTREtBbm5vdDsKKyAgICB9CisgIH0KKworICByZXR1cm4gbnVsbHB0cjsKIH0KIAotdm9pZCBDUERGU0RLX0RvY3VtZW50OjpVcGRhdGVBbGxWaWV3cyhDUERGU0RLX1BhZ2VWaWV3KiBwU2VuZGVyLCBDUERGU0RLX0Fubm90KiBwQW5ub3QpCi17Ci0JCi0JRlhfUE9TSVRJT04gcG9zID0gbV9wYWdlTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsKLQlDUERGX1BhZ2UgKiBwUGFnZSA9IE5VTEw7Ci0JQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldyA9IE5VTEw7Ci0Jd2hpbGUocG9zKQotCXsKLQkJbV9wYWdlTWFwLkdldE5leHRBc3NvYyhwb3MsIHBQYWdlLCBwUGFnZVZpZXcpOwotCi0JCWlmKHBQYWdlVmlldyAhPSBwU2VuZGVyKQotCQl7Ci0JCQlwUGFnZVZpZXctPlVwZGF0ZVZpZXcocEFubm90KTsKLQkJfQotCX0KK3ZvaWQgQ1BERlNES19QYWdlVmlldzo6S2lsbEZvY3VzQW5ub3RJZk5lZWRlZCgpIHsKKyAgLy8gaWYgdGhlcmUgaXMgYSBmb2N1c2VkIGFubm90IG9uIHRoZSBwYWdlLCB3ZSBzaG91bGQga2lsbCB0aGUgZm9jdXMgZmlyc3QuCisgIGlmIChDUERGU0RLX0Fubm90KiBmb2N1c2VkQW5ub3QgPSBtX3BTREtEb2MtPkdldEZvY3VzQW5ub3QoKSkgeworICAgIGlmIChwZGZpdW06OkNvbnRhaW5zVmFsdWUobV9meEFubm90QXJyYXksIGZvY3VzZWRBbm5vdCkpCisgICAgICBLaWxsRm9jdXNBbm5vdCgpOworICB9CiB9CiAKLUNQREZTREtfQW5ub3QqIENQREZTREtfRG9jdW1lbnQ6OkdldEZvY3VzQW5ub3QoKQotewotCXJldHVybiB0aGlzLT5tX3BGb2N1c0Fubm90OwkKK0ZYX0JPT0wgQ1BERlNES19QYWdlVmlldzo6QW5ub3RfSGFzQXBwZWFyYW5jZShDUERGX0Fubm90KiBwQW5ub3QpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWMgPSBwQW5ub3QtPkdldEFubm90RGljdCgpOworICBpZiAocEFubm90RGljKQorICAgIHJldHVybiBwQW5ub3REaWMtPktleUV4aXN0KCJBUyIpOworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgQ1BERlNES19Eb2N1bWVudDo6U2V0Rm9jdXNBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QsRlhfVUlOVCBuRmxhZykKLXsKK0NQREZTREtfQW5ub3QqIENQREZTREtfUGFnZVZpZXc6OkFkZEFubm90KENQREZfQW5ub3QqIHBQREZBbm5vdCkgeworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKKyAgQVNTRVJUKHBFbnYpOworICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOworICBDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QgPSBwQW5ub3RIYW5kbGVyLT5OZXdBbm5vdChwUERGQW5ub3QsIHRoaXMpOworICBpZiAoIXBTREtBbm5vdCkKKyAgICByZXR1cm4gbnVsbHB0cjsKIAotCWlmKG1fcEZvY3VzQW5ub3Q9PXBBbm5vdCkgcmV0dXJuIFRSVUU7Ci0JCi0JaWYobV9wRm9jdXNBbm5vdCkKLQl7Ci0JCWlmKCF0aGlzLT5LaWxsRm9jdXNBbm5vdChuRmxhZykgKSByZXR1cm4gRkFMU0U7CQotCX0KLQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBwQW5ub3QtPkdldFBhZ2VWaWV3KCk7Ci0JaWYocEFubm90ICYmIHBQYWdlVmlldy0+SXNWYWxpZCgpKQotCXsKLQkJQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IgKnBBbm5vdEhhbmRsZXI9bV9wRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKLQotCQlpZihwQW5ub3RIYW5kbGVyJiYhbV9wRm9jdXNBbm5vdCkKLQkJewotCQkJaWYgKCFwQW5ub3RIYW5kbGVyLT5Bbm5vdF9PblNldEZvY3VzKHBBbm5vdCxuRmxhZykpCi0JCQkJcmV0dXJuIEZBTFNFOwotCQkJaWYoIW1fcEZvY3VzQW5ub3QpCi0JCQl7Ci0JCQkJdGhpcy0+bV9wRm9jdXNBbm5vdD1wQW5ub3Q7Ci0JCQkJcmV0dXJuIFRSVUU7Ci0JCQl9Ci0JCX0JCQkKLQl9Ci0JcmV0dXJuIEZBTFNFOworICBtX2Z4QW5ub3RBcnJheS5wdXNoX2JhY2socFNES0Fubm90KTsKKyAgcEFubm90SGFuZGxlci0+QW5ub3RfT25DcmVhdGUocFNES0Fubm90KTsKKyAgcmV0dXJuIHBTREtBbm5vdDsKIH0KIAotRlhfQk9PTCBDUERGU0RLX0RvY3VtZW50OjpLaWxsRm9jdXNBbm5vdChGWF9VSU5UIG5GbGFnKQotewotCWlmKG1fcEZvY3VzQW5ub3QpCi0JewotCQlDUERGU0RLX0Fubm90SGFuZGxlck1nciAqcEFubm90SGFuZGxlcj1tX3BFbnYtPkdldEFubm90SGFuZGxlck1ncigpOwotCQlpZihwQW5ub3RIYW5kbGVyKQotCQl7Ci0JCQlDUERGU0RLX0Fubm90KiBwRm9jdXNBbm5vdCA9IG1fcEZvY3VzQW5ub3Q7Ci0JCQltX3BGb2N1c0Fubm90ID0gTlVMTDsKLQkJCWlmKHBBbm5vdEhhbmRsZXItPkFubm90X09uS2lsbEZvY3VzKHBGb2N1c0Fubm90LCBuRmxhZykpCi0JCQl7Ci0JCQkJCi0JCQkJaWYocEZvY3VzQW5ub3QtPkdldFR5cGUoKSA9PSBGWF9CU1RSQygiV2lkZ2V0IikpCi0JCQkJewotCQkJCQlDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEZvY3VzQW5ub3Q7Ci0JCQkJCWludCBuRmllbGRUeXBlID0gcFdpZGdldC0+R2V0RmllbGRUeXBlKCk7Ci0JCQkJCWlmKEZJRUxEVFlQRV9URVhURklFTEQgPT0gbkZpZWxkVHlwZSB8fCBGSUVMRFRZUEVfQ09NQk9CT1ggPT0gbkZpZWxkVHlwZSkKLQkJCQkJCW1fcEVudi0+RkZJX09uU2V0RmllbGRJbnB1dEZvY3VzKE5VTEwsIE5VTEwsIDAsIEZBTFNFKTsKLQkJCQl9CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK0NQREZTREtfQW5ub3QqIENQREZTREtfUGFnZVZpZXc6OkFkZEFubm90KElYRkFfV2lkZ2V0KiBwUERGQW5ub3QpIHsKKyAgaWYgKCFwUERGQW5ub3QpCisgICAgcmV0dXJuIG51bGxwdHI7CiAKLQkJCQlpZighbV9wRm9jdXNBbm5vdCkKLQkJCQkJcmV0dXJuIFRSVUU7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJbV9wRm9jdXNBbm5vdCA9IHBGb2N1c0Fubm90OwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBGQUxTRTsKKyAgQ1BERlNES19Bbm5vdCogcFNES0Fubm90ID0gR2V0QW5ub3RCeVhGQVdpZGdldChwUERGQW5ub3QpOworICBpZiAocFNES0Fubm90KQorICAgIHJldHVybiBwU0RLQW5ub3Q7CisKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7CisgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyID0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7CisgIHBTREtBbm5vdCA9IHBBbm5vdEhhbmRsZXItPk5ld0Fubm90KHBQREZBbm5vdCwgdGhpcyk7CisgIGlmICghcFNES0Fubm90KQorICAgIHJldHVybiBudWxscHRyOworCisgIG1fZnhBbm5vdEFycmF5LnB1c2hfYmFjayhwU0RLQW5ub3QpOworICByZXR1cm4gcFNES0Fubm90OworfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCitDUERGU0RLX0Fubm90KiBDUERGU0RLX1BhZ2VWaWV3OjpBZGRBbm5vdChDUERGX0RpY3Rpb25hcnkqIHBEaWN0KSB7CisgIHJldHVybiBwRGljdCA/IEFkZEFubm90KHBEaWN0LT5HZXRTdHJpbmcoIlN1YnR5cGUiKSwgcERpY3QpIDogbnVsbHB0cjsKIH0KIAotRlhfQk9PTAlDUERGU0RLX0RvY3VtZW50OjpEZWxldGVQYWdlcyhpbnQgblN0YXJ0LCBpbnQgIG5Db3VudCkKLXsKLQlpZiAoIG5TdGFydCA8IDAgfHwgblN0YXJ0ID49IEdldFBhZ2VDb3VudCgpIHx8IG5Db3VudCA8PSAwICkKLQl7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlDUERGX1BhZ2UgKiBwVGVtcFBhZ2UgPSBOVUxMOwotCWZvciAoIGludCBpID0gbkNvdW50LTE7IGkgPj0gMDsgaS0tICkKLQl7Ci0JCXBUZW1wUGFnZSA9IEdldFBhZ2UoblN0YXJ0K2kpOwotCQlpZiAoIHBUZW1wUGFnZSAhPSBOVUxMICkKLQkJewotCQkJUmVNb3ZlUGFnZVZpZXcocFRlbXBQYWdlKTsKLQkJfQotCX0KLQlyZXR1cm4gVFJVRTsKK0NQREZTREtfQW5ub3QqIENQREZTREtfUGFnZVZpZXc6OkFkZEFubm90KGNvbnN0IEZYX0NIQVIqIGxwU3ViVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QpIHsKKyAgcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgQ1BERlNES19Eb2N1bWVudDo6T25DbG9zZURvY3VtZW50KCkKLXsKLQlLaWxsRm9jdXNBbm5vdCgpOworRlhfQk9PTCBDUERGU0RLX1BhZ2VWaWV3OjpEZWxldGVBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpIHsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBpZiAoIXBBbm5vdCkKKyAgICByZXR1cm4gRkFMU0U7CisgIENQREZYRkFfUGFnZSogcFBhZ2UgPSBwQW5ub3QtPkdldFBERlhGQVBhZ2UoKTsKKyAgaWYgKCFwUGFnZSB8fCAocFBhZ2UtPkdldERvY3VtZW50KCktPkdldERvY1R5cGUoKSAhPSBET0NUWVBFX1NUQVRJQ19YRkEgJiYKKyAgICAgICAgICAgICAgICAgcFBhZ2UtPkdldERvY3VtZW50KCktPkdldERvY1R5cGUoKSAhPSBET0NUWVBFX0RZTkFNSUNfWEZBKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgYXV0byBpdCA9IHN0ZDo6ZmluZChtX2Z4QW5ub3RBcnJheS5iZWdpbigpLCBtX2Z4QW5ub3RBcnJheS5lbmQoKSwgcEFubm90KTsKKyAgaWYgKGl0ICE9IG1fZnhBbm5vdEFycmF5LmVuZCgpKQorICAgIG1fZnhBbm5vdEFycmF5LmVyYXNlKGl0KTsKKyAgaWYgKG1fQ2FwdHVyZVdpZGdldCA9PSBwQW5ub3QpCisgICAgbV9DYXB0dXJlV2lkZ2V0ID0gbnVsbHB0cjsKKworICByZXR1cm4gVFJVRTsKKyNlbHNlICAgLy8gUERGX0VOQUJMRV9YRkEKKyAgcmV0dXJuIEZBTFNFOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogfQogCi1GWF9CT09MIENQREZTREtfRG9jdW1lbnQ6OkdldFBlcm1pc3Npb25zKGludCBuRmxhZykKLXsKLQlGWF9EV09SRCBkd1Blcm1pc3Npb25zID0gbV9wRG9jLT5HZXRVc2VyUGVybWlzc2lvbnMoKTsKLQlyZXR1cm4gZHdQZXJtaXNzaW9ucyZuRmxhZzsKK0NQREZfRG9jdW1lbnQqIENQREZTREtfUGFnZVZpZXc6OkdldFBERkRvY3VtZW50KCkgeworICBpZiAobV9wYWdlKSB7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgICByZXR1cm4gbV9wYWdlLT5HZXREb2N1bWVudCgpLT5HZXRQREZEb2MoKTsKKyNlbHNlICAgLy8gUERGX0VOQUJMRV9YRkEKKyAgICByZXR1cm4gbV9wYWdlLT5tX3BEb2N1bWVudDsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgfQorICByZXR1cm4gTlVMTDsKIH0KIAotSUZYSlNfUnVudGltZSAqIENQREZTREtfRG9jdW1lbnQ6OkdldEpzUnVudGltZSgpCi17Ci0JQVNTRVJUKG1fcEVudiE9TlVMTCk7Ci0JcmV0dXJuIG1fcEVudi0+R2V0SlNSdW50aW1lKCk7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK0NQREZfUGFnZSogQ1BERlNES19QYWdlVmlldzo6R2V0UERGUGFnZSgpIHsKKyAgaWYgKG1fcGFnZSkgeworICAgIHJldHVybiBtX3BhZ2UtPkdldFBERlBhZ2UoKTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworc2l6ZV90IENQREZTREtfUGFnZVZpZXc6OkNvdW50QW5ub3RzKCkgY29uc3QgeworICByZXR1cm4gbV9meEFubm90QXJyYXkuc2l6ZSgpOwogfQogCi1DRlhfV2lkZVN0cmluZwlDUERGU0RLX0RvY3VtZW50OjpHZXRQYXRoKCkgCi17Ci0JQVNTRVJUKG1fcEVudiAhPSBOVUxMKTsKLQlyZXR1cm4gbV9wRW52LT5KU19kb2NHZXRGaWxlUGF0aCgpOworQ1BERlNES19Bbm5vdCogQ1BERlNES19QYWdlVmlldzo6R2V0QW5ub3Qoc2l6ZV90IG5JbmRleCkgeworICByZXR1cm4gbkluZGV4IDwgbV9meEFubm90QXJyYXkuc2l6ZSgpID8gbV9meEFubm90QXJyYXlbbkluZGV4XSA6IG51bGxwdHI7CiB9CiAKLQotQ1BERlNES19QYWdlVmlldzo6Q1BERlNES19QYWdlVmlldyhDUERGU0RLX0RvY3VtZW50KiBwU0RLRG9jLENQREZfUGFnZSogcGFnZSk6bV9wYWdlKHBhZ2UpLG1fcFNES0RvYyhwU0RLRG9jKQotewotCUNQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFNES0RvYy0+R2V0SW50ZXJGb3JtKCk7Ci0JaWYocEludGVyRm9ybSkKLQl7Ci0JCUNQREZfSW50ZXJGb3JtKiBwUERGSW50ZXJGb3JtID0gcEludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7Ci0JCXBQREZJbnRlckZvcm0tPkZpeFBhZ2VGaWVsZHMocGFnZSk7Ci0JfQotICAgICAgICBtX3BhZ2UtPlNldFByaXZhdGVEYXRhKChGWF9MUFZPSUQpbV9wYWdlLCAoRlhfTFBWT0lEKXRoaXMsIE5VTEwpOwotCW1fZnhBbm5vdEFycmF5LlJlbW92ZUFsbCgpOwotCi0JbV9iRW50ZXJXaWRnZXQgPSBGQUxTRTsKLQltX2JFeGl0V2lkZ2V0ID0gRkFMU0U7Ci0JbV9iT25XaWRnZXQgPSBGQUxTRTsKLQltX0NhcHR1cmVXaWRnZXQgPSBOVUxMOwotCW1fYlZhbGlkID0gRkFMU0U7Ci0gICAgICAgIG1fYkxvY2tlZCA9IEZBTFNFOwotICAgICAgICBtX2JUYWtlT3ZlclBhZ2UgPSBGQUxTRTsKK0NQREZTREtfQW5ub3QqIENQREZTREtfUGFnZVZpZXc6OkdldEFubm90QnlEaWN0KENQREZfRGljdGlvbmFyeSogcERpY3QpIHsKKyAgZm9yIChDUERGU0RLX0Fubm90KiBwQW5ub3QgOiBtX2Z4QW5ub3RBcnJheSkgeworICAgIGlmIChwQW5ub3QtPkdldFBERkFubm90KCktPkdldEFubm90RGljdCgpID09IHBEaWN0KQorICAgICAgcmV0dXJuIHBBbm5vdDsKKyAgfQorICByZXR1cm4gbnVsbHB0cjsKIH0KIAotQ1BERlNES19QYWdlVmlldzo6fkNQREZTREtfUGFnZVZpZXcoKQotewotCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOwkKLQlpbnQgbkFubm90Q291bnQgPSBtX2Z4QW5ub3RBcnJheS5HZXRTaXplKCk7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK0NQREZTREtfQW5ub3QqIENQREZTREtfUGFnZVZpZXc6OkdldEFubm90QnlYRkFXaWRnZXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQpIHsKKyAgaWYgKCFoV2lkZ2V0KQorICAgIHJldHVybiBudWxscHRyOwogCi0JZm9yIChpbnQgaT0wOyBpPG5Bbm5vdENvdW50OyBpKyspCi0JewotCQlDUERGU0RLX0Fubm90KiBwQW5ub3QgPSAoQ1BERlNES19Bbm5vdCopbV9meEFubm90QXJyYXkuR2V0QXQoaSk7Ci0JCS8vaWYgdGhlcmUgaXMgYSBmb2N1c2VkIGFubm90IG9uIHRoZSBwYWdlLCB3ZSBzaG91bGQga2lsbCB0aGUgZm9jdXMgZmlyc3QuCi0JCWlmKHBBbm5vdCA9PSBtX3BTREtEb2MtPkdldEZvY3VzQW5ub3QoKSkKLQkJCUtpbGxGb2N1c0Fubm90KCk7Ci0JCUNQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyTWdyID0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7Ci0JCUFTU0VSVChwQW5ub3RIYW5kbGVyTWdyKTsKLQkJcEFubm90SGFuZGxlck1nci0+UmVsZWFzZUFubm90KHBBbm5vdCk7Ci0JfQotCW1fZnhBbm5vdEFycmF5LlJlbW92ZUFsbCgpOwotCWlmKG1fcEFubm90TGlzdCkKLQl7Ci0JCWRlbGV0ZSBtX3BBbm5vdExpc3Q7Ci0JCW1fcEFubm90TGlzdCA9IE5VTEw7Ci0JfQotICAgICAgICBtX3BhZ2UtPlJlbW92ZVByaXZhdGVEYXRhKChGWF9MUFZPSUQpbV9wYWdlKTsKLSAgICAgICAgaWYobV9iVGFrZU92ZXJQYWdlKSB7Ci0gICAgICAgICAgICBkZWxldGUgbV9wYWdlOwotICAgICAgICB9CisgIGZvciAoQ1BERlNES19Bbm5vdCogcEFubm90IDogbV9meEFubm90QXJyYXkpIHsKKyAgICBpZiAocEFubm90LT5HZXRYRkFXaWRnZXQoKSA9PSBoV2lkZ2V0KQorICAgICAgcmV0dXJuIHBBbm5vdDsKKyAgfQorICByZXR1cm4gbnVsbHB0cjsKK30KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworRlhfQk9PTCBDUERGU0RLX1BhZ2VWaWV3OjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkZsYWcpIHsKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7CisgIEFTU0VSVChwRW52KTsKKyAgQ1BERlNES19Bbm5vdCogcEZYQW5ub3QgPSBHZXRGWFdpZGdldEF0UG9pbnQocG9pbnQueCwgcG9pbnQueSk7CisgIGlmICghcEZYQW5ub3QpIHsKKyAgICBLaWxsRm9jdXNBbm5vdChuRmxhZyk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIHBBbm5vdEhhbmRsZXJNZ3IgPSBwRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKKyAgRlhfQk9PTCBiUmV0ID0KKyAgICAgIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTEJ1dHRvbkRvd24odGhpcywgcEZYQW5ub3QsIG5GbGFnLCBwb2ludCk7CisgIGlmIChiUmV0KQorICAgIFNldEZvY3VzQW5ub3QocEZYQW5ub3QpOworICByZXR1cm4gYlJldDsKIH0KIAotdm9pZCBDUERGU0RLX1BhZ2VWaWV3OjpQYWdlVmlld19PbkRyYXcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSxDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKQotewotCW1fY3VyTWF0cml4ID0gKnBVc2VyMkRldmljZTsKLQkKLQkvLwltX3BBbm5vdExpc3QtPkRpc3BsYXlBbm5vdHMobV9wYWdlLCBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIEZBTFNFLCBwT3B0aW9ucyk7Ci0JQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7Ci0JQ1BERlNES19Bbm5vdEl0ZXJhdG9yIGFubm90SXRlcmF0b3IodGhpcywgVFJVRSk7Ci0JQ1BERlNES19Bbm5vdCAqIHBTREtBbm5vdD1OVUxMOwotCWludCBpbmRleD0tMTsKLQl3aGlsZSgocFNES0Fubm90ID0gYW5ub3RJdGVyYXRvci5OZXh0KGluZGV4KSkpCi0JewotCQlDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOwotCQlBU1NFUlQocEFubm90SGFuZGxlck1ncik7Ci0JCXBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uRHJhdyh0aGlzLCBwU0RLQW5ub3QsIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgMCk7Ci0JfQorI2lmZGVmIFBERl9FTkFCTEVfWEZBCitGWF9CT09MIENQREZTREtfUGFnZVZpZXc6Ok9uUkJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVUlOVCBuRmxhZykgeworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKKyAgQVNTRVJUKHBFbnYpOworICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOworICBBU1NFUlQocEFubm90SGFuZGxlck1ncik7CiAKKyAgQ1BERlNES19Bbm5vdCogcEZYQW5ub3QgPSBHZXRGWFdpZGdldEF0UG9pbnQocG9pbnQueCwgcG9pbnQueSk7CisKKyAgaWYgKHBGWEFubm90ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEZYX0JPT0wgYlJldCA9CisgICAgICBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9PblJCdXR0b25Eb3duKHRoaXMsIHBGWEFubm90LCBuRmxhZywgcG9pbnQpOworICBpZiAoYlJldCkgeworICAgIFNldEZvY3VzQW5ub3QocEZYQW5ub3QpOworICB9CisgIHJldHVybiBUUlVFOwogfQogCi1DUERGX0Fubm90KiBDUERGU0RLX1BhZ2VWaWV3OjpHZXRQREZBbm5vdEF0UG9pbnQoRlhfRkxPQVQgcGFnZVgsIEZYX0ZMT0FUIHBhZ2VZKQotewotCQotCWludCBuQ291bnQgPSBtX3BBbm5vdExpc3QtPkNvdW50KCk7Ci0JZm9yKGludCBpID0gMCA7IGk8bkNvdW50OyBpKyspCi0JewotCQlDUERGX0Fubm90KiBwQW5ub3QgPSBtX3BBbm5vdExpc3QtPkdldEF0KGkpOwotCQlDRlhfRmxvYXRSZWN0IGFubm90UmVjdDsKLQkJcEFubm90LT5HZXRSZWN0KGFubm90UmVjdCk7Ci0JCWlmKGFubm90UmVjdC5Db250YWlucyhwYWdlWCwgcGFnZVkpKQotCQkJcmV0dXJuIHBBbm5vdDsKLQl9Ci0JcmV0dXJuIE5VTEw7CitGWF9CT09MIENQREZTREtfUGFnZVZpZXc6Ok9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9VSU5UIG5GbGFnKSB7CisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOworICBBU1NFUlQocEVudik7CisgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyTWdyID0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7CisKKyAgQ1BERlNES19Bbm5vdCogcEZYQW5ub3QgPSBHZXRGWFdpZGdldEF0UG9pbnQocG9pbnQueCwgcG9pbnQueSk7CisKKyAgaWYgKHBGWEFubm90ID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIEZYX0JPT0wgYlJldCA9CisgICAgICBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9PblJCdXR0b25VcCh0aGlzLCBwRlhBbm5vdCwgbkZsYWcsIHBvaW50KTsKKyAgaWYgKGJSZXQpIHsKKyAgICBTZXRGb2N1c0Fubm90KHBGWEFubm90KTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworRlhfQk9PTCBDUERGU0RLX1BhZ2VWaWV3OjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfVUlOVCBuRmxhZykgeworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKKyAgQVNTRVJUKHBFbnYpOworICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOworICBDUERGU0RLX0Fubm90KiBwRlhBbm5vdCA9IEdldEZYV2lkZ2V0QXRQb2ludChwb2ludC54LCBwb2ludC55KTsKKyAgQ1BERlNES19Bbm5vdCogcEZvY3VzQW5ub3QgPSBHZXRGb2N1c0Fubm90KCk7CisgIEZYX0JPT0wgYlJldCA9IEZBTFNFOworICBpZiAocEZvY3VzQW5ub3QgJiYgcEZvY3VzQW5ub3QgIT0gcEZYQW5ub3QpIHsKKyAgICAvLyBMYXN0IGZvY3VzIEFubm90IGdldHMgYSBjaGFuY2UgdG8gaGFuZGxlIHRoZSBldmVudC4KKyAgICBiUmV0ID0gcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25MQnV0dG9uVXAodGhpcywgcEZvY3VzQW5ub3QsIG5GbGFnLCBwb2ludCk7CisgIH0KKyAgaWYgKHBGWEFubm90ICYmICFiUmV0KQorICAgIGJSZXQgPSBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9PbkxCdXR0b25VcCh0aGlzLCBwRlhBbm5vdCwgbkZsYWcsIHBvaW50KTsKKyAgcmV0dXJuIGJSZXQ7CiB9CiAKLUNQREZfQW5ub3QqIENQREZTREtfUGFnZVZpZXc6OkdldFBERldpZGdldEF0UG9pbnQoRlhfRkxPQVQgcGFnZVgsIEZYX0ZMT0FUIHBhZ2VZKQotewotCQotCWludCBuQ291bnQgPSBtX3BBbm5vdExpc3QtPkNvdW50KCk7Ci0JZm9yKGludCBpID0gMCA7IGk8bkNvdW50OyBpKyspCi0JewotCQlDUERGX0Fubm90KiBwQW5ub3QgPSBtX3BBbm5vdExpc3QtPkdldEF0KGkpOwotCQlpZihwQW5ub3QtPkdldFN1YlR5cGUoKSA9PSAiV2lkZ2V0IikKLQkJewotCQkJQ0ZYX0Zsb2F0UmVjdCBhbm5vdFJlY3Q7Ci0JCQlwQW5ub3QtPkdldFJlY3QoYW5ub3RSZWN0KTsKLQkJCWlmKGFubm90UmVjdC5Db250YWlucyhwYWdlWCwgcGFnZVkpKQotCQkJCXJldHVybiBwQW5ub3Q7Ci0JCX0KLQl9Ci0JcmV0dXJuIE5VTEw7CitGWF9CT09MIENQREZTREtfUGFnZVZpZXc6Ok9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBpbnQgbkZsYWcpIHsKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7CisgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyTWdyID0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7CisgIGlmIChDUERGU0RLX0Fubm90KiBwRlhBbm5vdCA9IEdldEZYV2lkZ2V0QXRQb2ludChwb2ludC54LCBwb2ludC55KSkgeworICAgIGlmIChtX0NhcHR1cmVXaWRnZXQgJiYgbV9DYXB0dXJlV2lkZ2V0ICE9IHBGWEFubm90KSB7CisgICAgICBtX2JFeGl0V2lkZ2V0ID0gVFJVRTsKKyAgICAgIG1fYkVudGVyV2lkZ2V0ID0gRkFMU0U7CisgICAgICBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9Pbk1vdXNlRXhpdCh0aGlzLCBtX0NhcHR1cmVXaWRnZXQsIG5GbGFnKTsKKyAgICB9CisgICAgbV9DYXB0dXJlV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwRlhBbm5vdDsKKyAgICBtX2JPbldpZGdldCA9IFRSVUU7CisgICAgaWYgKCFtX2JFbnRlcldpZGdldCkgeworICAgICAgbV9iRW50ZXJXaWRnZXQgPSBUUlVFOworICAgICAgbV9iRXhpdFdpZGdldCA9IEZBTFNFOworICAgICAgcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25Nb3VzZUVudGVyKHRoaXMsIHBGWEFubm90LCBuRmxhZyk7CisgICAgfQorICAgIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTW91c2VNb3ZlKHRoaXMsIHBGWEFubm90LCBuRmxhZywgcG9pbnQpOworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmIChtX2JPbldpZGdldCkgeworICAgIG1fYk9uV2lkZ2V0ID0gRkFMU0U7CisgICAgbV9iRXhpdFdpZGdldCA9IFRSVUU7CisgICAgbV9iRW50ZXJXaWRnZXQgPSBGQUxTRTsKKyAgICBpZiAobV9DYXB0dXJlV2lkZ2V0KSB7CisgICAgICBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9Pbk1vdXNlRXhpdCh0aGlzLCBtX0NhcHR1cmVXaWRnZXQsIG5GbGFnKTsKKyAgICAgIG1fQ2FwdHVyZVdpZGdldCA9IE5VTEw7CisgICAgfQorICB9CisgIHJldHVybiBGQUxTRTsKIH0KIAotQ1BERlNES19Bbm5vdCogQ1BERlNES19QYWdlVmlldzo6R2V0RlhBbm5vdEF0UG9pbnQoRlhfRkxPQVQgcGFnZVgsIEZYX0ZMT0FUIHBhZ2VZKQotewotCi0JQ1BERlNES19Bbm5vdEl0ZXJhdG9yIGFubm90SXRlcmF0b3IodGhpcywgRkFMU0UpOwotCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOwotCUNQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RNZ3IgPSBwRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKLQlDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QgPSBOVUxMOwotCWludCBpbmRleCA9IC0xOwotCXdoaWxlKChwU0RLQW5ub3QgPSBhbm5vdEl0ZXJhdG9yLk5leHQoaW5kZXgpKSkKLQl7Ci0JCUNQREZfUmVjdCByYyA9IHBBbm5vdE1nci0+QW5ub3RfT25HZXRWaWV3QkJveCh0aGlzLCBwU0RLQW5ub3QpOwotCQlpZihyYy5Db250YWlucyhwYWdlWCwgcGFnZVkpKQotCQkJcmV0dXJuIHBTREtBbm5vdDsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKK0ZYX0JPT0wgQ1BERlNES19QYWdlVmlldzo6T25Nb3VzZVdoZWVsKGRvdWJsZSBkZWx0YVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZGVsdGFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZsYWcpIHsKKyAgaWYgKENQREZTREtfQW5ub3QqIHBBbm5vdCA9IEdldEZYV2lkZ2V0QXRQb2ludChwb2ludC54LCBwb2ludC55KSkgeworICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOworICAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyTWdyID0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7CisgICAgcmV0dXJuIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTW91c2VXaGVlbCh0aGlzLCBwQW5ub3QsIG5GbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClkZWx0YVksIHBvaW50KTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9CiAKLUNQREZTREtfQW5ub3QqIENQREZTREtfUGFnZVZpZXc6OkdldEZYV2lkZ2V0QXRQb2ludChGWF9GTE9BVCBwYWdlWCwgRlhfRkxPQVQgcGFnZVkpCi17CitGWF9CT09MIENQREZTREtfUGFnZVZpZXc6Ok9uQ2hhcihpbnQgbkNoYXIsIEZYX1VJTlQgbkZsYWcpIHsKKyAgaWYgKENQREZTREtfQW5ub3QqIHBBbm5vdCA9IEdldEZvY3VzQW5ub3QoKSkgeworICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOworICAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyTWdyID0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7CisgICAgcmV0dXJuIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZyk7CisgIH0KIAotCUNQREZTREtfQW5ub3RJdGVyYXRvciBhbm5vdEl0ZXJhdG9yKHRoaXMsIEZBTFNFKTsKLQlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKLQlDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90TWdyID0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7Ci0JQ1BERlNES19Bbm5vdCogcFNES0Fubm90ID0gTlVMTDsKLQlpbnQgaW5kZXggPSAtMTsKLQl3aGlsZSgocFNES0Fubm90ID0gYW5ub3RJdGVyYXRvci5OZXh0KGluZGV4KSkpCi0JewotCQlpZihwU0RLQW5ub3QtPkdldFR5cGUoKSA9PSAiV2lkZ2V0IikKLQkJewkKLQkJCXBBbm5vdE1nci0+QW5ub3RfT25HZXRWaWV3QkJveCh0aGlzLCBwU0RLQW5ub3QpOwotCQkJQ1BERl9Qb2ludCBwb2ludChwYWdlWCwgcGFnZVkpOwotCQkJaWYgKHBBbm5vdE1nci0+QW5ub3RfT25IaXRUZXN0KHRoaXMsIHBTREtBbm5vdCwgcG9pbnQpKQotLy8JCQlpZihyYy5Db250YWlucyhwYWdlWCwgcGFnZVkpKQotCQkJCXJldHVybiBwU0RLQW5ub3Q7Ci0JCX0KLQl9Ci0JCi0JcmV0dXJuIE5VTEw7CisgIHJldHVybiBGQUxTRTsKIH0KIAotCi1GWF9CT09MIENQREZTREtfUGFnZVZpZXc6OkFubm90X0hhc0FwcGVhcmFuY2UoQ1BERl9Bbm5vdCogcEFubm90KQotewotCUNQREZfRGljdGlvbmFyeSogcEFubm90RGljID0gcEFubm90LT5tX3BBbm5vdERpY3Q7Ci0JaWYocEFubm90RGljKQotCQlyZXR1cm4JcEFubm90RGljLT5LZXlFeGlzdCgiQVMiKTsKLQlyZXR1cm4gRkFMU0U7CitGWF9CT09MIENQREZTREtfUGFnZVZpZXc6Ok9uS2V5RG93bihpbnQgbktleUNvZGUsIGludCBuRmxhZykgeworICBpZiAoQ1BERlNES19Bbm5vdCogcEFubm90ID0gR2V0Rm9jdXNBbm5vdCgpKSB7CisgICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7CisgICAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIHBBbm5vdEhhbmRsZXJNZ3IgPSBwRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKKyAgICByZXR1cm4gcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25LZXlEb3duKHBBbm5vdCwgbktleUNvZGUsIG5GbGFnKTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9CiAKLUNQREZTREtfQW5ub3QqCUNQREZTREtfUGFnZVZpZXc6OkFkZEFubm90KENQREZfQW5ub3QgKiBwUERGQW5ub3QpCi17Ci0JQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7Ci0JQVNTRVJUKHBFbnYpOwotCUNQREZTREtfQW5ub3RIYW5kbGVyTWdyICogcEFubm90SGFuZGxlcj0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7CQotCQotCUNQREZTREtfQW5ub3QqIHBTREtBbm5vdCA9TlVMTDsKLQkKLQlpZihwQW5ub3RIYW5kbGVyKQotCXsKLQkJcFNES0Fubm90ID0gcEFubm90SGFuZGxlci0+TmV3QW5ub3QocFBERkFubm90LCB0aGlzKTsKLQl9Ci0JaWYoIXBTREtBbm5vdCkJIAotCQlyZXR1cm4gTlVMTDsKLQotCW1fZnhBbm5vdEFycmF5LkFkZChwU0RLQW5ub3QpOwkKLQkJCi0JaWYocEFubm90SGFuZGxlcikKLQl7CSAJCSAJIAotCQlwQW5ub3RIYW5kbGVyLT5Bbm5vdF9PbkNyZWF0ZShwU0RLQW5ub3QpOwotCQkKLQl9Ci0KLQkgcmV0dXJuIHBTREtBbm5vdDsKK0ZYX0JPT0wgQ1BERlNES19QYWdlVmlldzo6T25LZXlVcChpbnQgbktleUNvZGUsIGludCBuRmxhZykgeworICByZXR1cm4gRkFMU0U7CiB9CiAKLUNQREZTREtfQW5ub3QqIENQREZTREtfUGFnZVZpZXc6OkFkZEFubm90KENQREZfRGljdGlvbmFyeSAqIHBEaWN0KQotewotCWlmKHBEaWN0KSAgCi0JCXJldHVybiB0aGlzLT5BZGRBbm5vdChwRGljdC0+R2V0U3RyaW5nKCJTdWJ0eXBlIikscERpY3QpOwotCSByZXR1cm4gTlVMTDsKK3ZvaWQgQ1BERlNES19QYWdlVmlldzo6TG9hZEZYQW5ub3RzKCkgeworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOworI2Vsc2UKKyAgRlhfQk9PTCBlbmFibGVBUFVwZGF0ZSA9IENQREZfSW50ZXJGb3JtOjpVcGRhdGluZ0FQRW5hYmxlZCgpOworICAvLyBEaXNhYmxlIHRoZSBkZWZhdWx0IEFQIGNvbnN0cnVjdGlvbi4KKyAgQ1BERl9JbnRlckZvcm06OkVuYWJsZVVwZGF0ZUFQKEZBTFNFKTsKKyAgbV9wQW5ub3RMaXN0LnJlc2V0KG5ldyBDUERGX0Fubm90TGlzdChtX3BhZ2UpKTsKKyAgQ1BERl9JbnRlckZvcm06OkVuYWJsZVVwZGF0ZUFQKGVuYWJsZUFQVXBkYXRlKTsKKyAgY29uc3Qgc2l6ZV90IG5Db3VudCA9IG1fcEFubm90TGlzdC0+Q291bnQoKTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworICBTZXRMb2NrKFRSVUUpOworCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgbV9wYWdlLT5BZGRSZWYoKTsKKyAgaWYgKG1fcFNES0RvYy0+R2V0WEZBRG9jdW1lbnQoKS0+R2V0RG9jVHlwZSgpID09IERPQ1RZUEVfRFlOQU1JQ19YRkEpIHsKKyAgICBJWEZBX1BhZ2VWaWV3KiBwYWdlVmlldyA9IE5VTEw7CisgICAgcGFnZVZpZXcgPSBtX3BhZ2UtPkdldFhGQVBhZ2VWaWV3KCk7CisgICAgQVNTRVJUKHBhZ2VWaWV3ICE9IE5VTEwpOworCisgICAgSVhGQV9XaWRnZXRJdGVyYXRvciogcFdpZGdldEhhbmRlciA9IHBhZ2VWaWV3LT5DcmVhdGVXaWRnZXRJdGVyYXRvcigKKyAgICAgICAgWEZBX1RSQVZFUlNFV0FZX0Zvcm0sIFhGQV9XSURHRVRGSUxURVJfVmlzaWJsZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1dJREdFVEZJTFRFUl9WaWV3YWJsZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1dJREdFVEZJTFRFUl9BbGxUeXBlKTsKKyAgICBpZiAoIXBXaWRnZXRIYW5kZXIpIHsKKyAgICAgIG1fcGFnZS0+UmVsZWFzZSgpOworICAgICAgU2V0TG9jayhGQUxTRSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUgKElYRkFfV2lkZ2V0KiBwWEZBQW5ub3QgPSBwV2lkZ2V0SGFuZGVyLT5Nb3ZlVG9OZXh0KCkpIHsKKyAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCA9IHBBbm5vdEhhbmRsZXJNZ3ItPk5ld0Fubm90KHBYRkFBbm5vdCwgdGhpcyk7CisgICAgICBpZiAoIXBBbm5vdCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIG1fZnhBbm5vdEFycmF5LnB1c2hfYmFjayhwQW5ub3QpOworICAgICAgcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25Mb2FkKHBBbm5vdCk7CisgICAgfQorICAgIHBXaWRnZXRIYW5kZXItPlJlbGVhc2UoKTsKKyAgfSBlbHNlIHsKKyAgICBDUERGX1BhZ2UqIHBQYWdlID0gbV9wYWdlLT5HZXRQREZQYWdlKCk7CisgICAgQVNTRVJUKHBQYWdlICE9IE5VTEwpOworICAgIEZYX0JPT0wgZW5hYmxlQVBVcGRhdGUgPSBDUERGX0ludGVyRm9ybTo6VXBkYXRpbmdBUEVuYWJsZWQoKTsKKyAgICAvLyBEaXNhYmxlIHRoZSBkZWZhdWx0IEFQIGNvbnN0cnVjdGlvbi4KKyAgICBDUERGX0ludGVyRm9ybTo6RW5hYmxlVXBkYXRlQVAoRkFMU0UpOworICAgIG1fcEFubm90TGlzdC5yZXNldChuZXcgQ1BERl9Bbm5vdExpc3QocFBhZ2UpKTsKKyAgICBDUERGX0ludGVyRm9ybTo6RW5hYmxlVXBkYXRlQVAoZW5hYmxlQVBVcGRhdGUpOworCisgICAgY29uc3Qgc2l6ZV90IG5Db3VudCA9IG1fcEFubm90TGlzdC0+Q291bnQoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5Db3VudDsgKytpKSB7CisgICAgICBDUERGX0Fubm90KiBwUERGQW5ub3QgPSBtX3BBbm5vdExpc3QtPkdldEF0KGkpOworICAgICAgQ2hlY2tVblN1cHBvcnRBbm5vdChHZXRQREZEb2N1bWVudCgpLCBwUERGQW5ub3QpOworCisgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBwQW5ub3RIYW5kbGVyTWdyLT5OZXdBbm5vdChwUERGQW5ub3QsIHRoaXMpOworICAgICAgaWYgKCFwQW5ub3QpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgbV9meEFubm90QXJyYXkucHVzaF9iYWNrKHBBbm5vdCk7CisgICAgICBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9PbkxvYWQocEFubm90KTsKKyAgICB9CisgIH0KKyAgbV9wYWdlLT5SZWxlYXNlKCk7CisjZWxzZSAgIC8vIFBERl9FTkFCTEVfWEZBCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbkNvdW50OyArK2kpIHsKKyAgICBDUERGX0Fubm90KiBwUERGQW5ub3QgPSBtX3BBbm5vdExpc3QtPkdldEF0KGkpOworICAgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBHZXRQREZEb2N1bWVudCgpOworICAgIENoZWNrVW5TdXBwb3J0QW5ub3QocERvYywgcFBERkFubm90KTsKKyAgICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOworICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCA9IHBBbm5vdEhhbmRsZXJNZ3ItPk5ld0Fubm90KHBQREZBbm5vdCwgdGhpcyk7CisgICAgaWYgKCFwQW5ub3QpCisgICAgICBjb250aW51ZTsKKyAgICBtX2Z4QW5ub3RBcnJheS5wdXNoX2JhY2socEFubm90KTsKKyAgICBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9PbkxvYWQocEFubm90KTsKKyAgfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCisgIFNldExvY2soRkFMU0UpOwogfQogCi1DUERGU0RLX0Fubm90KiBDUERGU0RLX1BhZ2VWaWV3OjpBZGRBbm5vdChGWF9MUENTVFIgbHBTdWJUeXBlLENQREZfRGljdGlvbmFyeSAqIHBEaWN0KQotewotCXJldHVybiBOVUxMOwordm9pZCBDUERGU0RLX1BhZ2VWaWV3OjpVcGRhdGVSZWN0cyhDRlhfUmVjdEFycmF5JiByZWN0cykgeworICBmb3IgKGludCBpID0gMDsgaSA8IHJlY3RzLkdldFNpemUoKTsgaSsrKSB7CisgICAgQ1BERl9SZWN0IHJjID0gcmVjdHMuR2V0QXQoaSk7CisgICAgQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7CisgICAgcEVudi0+RkZJX0ludmFsaWRhdGUobV9wYWdlLCByYy5sZWZ0LCByYy50b3AsIHJjLnJpZ2h0LCByYy5ib3R0b20pOworICB9CiB9CiAKLUZYX0JPT0wgIENQREZTREtfUGFnZVZpZXc6OkRlbGV0ZUFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCkKLXsKLQlyZXR1cm4gRkFMU0U7Cit2b2lkIENQREZTREtfUGFnZVZpZXc6OlVwZGF0ZVZpZXcoQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIENQREZfUmVjdCByY1dpbmRvdyA9IHBBbm5vdC0+R2V0UmVjdCgpOworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKKyAgcEVudi0+RkZJX0ludmFsaWRhdGUobV9wYWdlLCByY1dpbmRvdy5sZWZ0LCByY1dpbmRvdy50b3AsIHJjV2luZG93LnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICByY1dpbmRvdy5ib3R0b20pOwogfQogCi1DUERGX0RvY3VtZW50KiBDUERGU0RLX1BhZ2VWaWV3OjpHZXRQREZEb2N1bWVudCgpCi17Ci0JaWYobV9wYWdlKQotCXsKLQkJcmV0dXJuIG1fcGFnZS0+bV9wRG9jdW1lbnQ7Ci0JfQotCXJldHVybiBOVUxMOworaW50IENQREZTREtfUGFnZVZpZXc6OkdldFBhZ2VJbmRleCgpIHsKKyAgaWYgKG1fcGFnZSkgeworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljID0gbV9wYWdlLT5HZXRQREZQYWdlKCktPm1fcEZvcm1EaWN0OworI2Vsc2UgICAvLyBQREZfRU5BQkxFX1hGQQorICAgIENQREZfRGljdGlvbmFyeSogcERpYyA9IG1fcGFnZS0+bV9wRm9ybURpY3Q7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisgICAgQ1BERl9Eb2N1bWVudCogcERvYyA9IG1fcFNES0RvYy0+R2V0UERGRG9jdW1lbnQoKTsKKyAgICBpZiAocERvYyAmJiBwRGljKSB7CisgICAgICByZXR1cm4gcERvYy0+R2V0UGFnZUluZGV4KHBEaWMtPkdldE9iak51bSgpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIC0xOwogfQogCi1pbnQJQ1BERlNES19QYWdlVmlldzo6Q291bnRBbm5vdHMoKQotewotCXJldHVybiBtX3BBbm5vdExpc3QtPkNvdW50KCk7Citib29sIENQREZTREtfUGFnZVZpZXc6OklzVmFsaWRBbm5vdChjb25zdCBDUERGX0Fubm90KiBwKSBjb25zdCB7CisgIGlmICghcCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgY29uc3QgYXV0byYgYW5ub3RzID0gbV9wQW5ub3RMaXN0LT5BbGwoKTsKKyAgcmV0dXJuIHBkZml1bTo6Q29udGFpbnNWYWx1ZShhbm5vdHMsIHApOwogfQogCi1DUERGU0RLX0Fubm90KglDUERGU0RLX1BhZ2VWaWV3OjpHZXRBbm5vdChpbnQgbkluZGV4KQotewotCWludCBuQ291bnQgPSBtX2Z4QW5ub3RBcnJheS5HZXRTaXplKCk7Ci0JaWYgKCBuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBuQ291bnQgKQotCXsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorQ1BERlNES19Bbm5vdCogQ1BERlNES19QYWdlVmlldzo6R2V0Rm9jdXNBbm5vdCgpIHsKKyAgQ1BERlNES19Bbm5vdCogcEZvY3VzQW5ub3QgPSBtX3BTREtEb2MtPkdldEZvY3VzQW5ub3QoKTsKKyAgaWYgKCFwRm9jdXNBbm5vdCkKKyAgICByZXR1cm4gbnVsbHB0cjsKIAotCXJldHVybiAoQ1BERlNES19Bbm5vdCopbV9meEFubm90QXJyYXkuR2V0QXQobkluZGV4KTsKKyAgZm9yIChDUERGU0RLX0Fubm90KiBwQW5ub3QgOiBtX2Z4QW5ub3RBcnJheSkgeworICAgIGlmIChwQW5ub3QgPT0gcEZvY3VzQW5ub3QpCisgICAgICByZXR1cm4gcEFubm90OworICB9CisgIHJldHVybiBudWxscHRyOwogfQotCi1DUERGU0RLX0Fubm90KiBDUERGU0RLX1BhZ2VWaWV3OjpHZXRBbm5vdEJ5RGljdChDUERGX0RpY3Rpb25hcnkgKiBwRGljdCkKLXsKLQlpbnQgbkNvdW50ID0gbV9meEFubm90QXJyYXkuR2V0U2l6ZSgpOwotIAlmb3IoaW50IGk9MDsgaTxuQ291bnQ7IGkrKykKLSAJewotCQlDUERGU0RLX0Fubm90KiBwQW5ub3QgPSAoQ1BERlNES19Bbm5vdCopbV9meEFubm90QXJyYXkuR2V0QXQoaSk7Ci0gCQlpZihwRGljdD09cEFubm90LT5HZXRQREZBbm5vdCgpLT5tX3BBbm5vdERpY3QpIAotIAkJCXJldHVybiBwQW5ub3Q7Ci0gCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotRlhfQk9PTCBDUERGU0RLX1BhZ2VWaWV3OjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfVUlOVCBuRmxhZykKLXsKLQlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKLQlBU1NFUlQocEVudik7Ci0JQ1BERlNES19Bbm5vdCogcEZYQW5ub3QgPSBHZXRGWFdpZGdldEF0UG9pbnQocG9pbnQueCwgcG9pbnQueSk7Ci0JaWYoIXBGWEFubm90KQotCXsKLQkJS2lsbEZvY3VzQW5ub3QobkZsYWcpOwotCX0KLQllbHNlCi0JewotCQlDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOwotCQlBU1NFUlQocEFubm90SGFuZGxlck1ncik7Ci0KLQkJRlhfQk9PTCBiUmV0ID0gcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25MQnV0dG9uRG93bih0aGlzLCBwRlhBbm5vdCwgbkZsYWcscG9pbnQpOwotIAkJaWYoYlJldCkKLSAJCXsKLSAJCQlTZXRGb2N1c0Fubm90KHBGWEFubm90KTsKLSAJCX0KLQkJcmV0dXJuIGJSZXQ7Ci0JfQotCXJldHVybiBGQUxTRTsKLX0KLQotCi1GWF9CT09MIENQREZTREtfUGFnZVZpZXc6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfVUlOVCBuRmxhZykKLXsKLQlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKLQlBU1NFUlQocEVudik7Ci0JQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIHBBbm5vdEhhbmRsZXJNZ3IgPSBwRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKLQlBU1NFUlQocEFubm90SGFuZGxlck1ncik7Ci0JQ1BERlNES19Bbm5vdCogcEZYQW5ub3QgPSBHZXRGWFdpZGdldEF0UG9pbnQocG9pbnQueCwgcG9pbnQueSk7Ci0JQ1BERlNES19Bbm5vdCogcEZvY3VzQW5ub3QgPSBHZXRGb2N1c0Fubm90KCk7Ci0JRlhfQk9PTCBiUmV0ICA9IEZBTFNFOwotCWlmKHBGb2N1c0Fubm90ICYmIHBGb2N1c0Fubm90ICE9IHBGWEFubm90KQotCXsKLQkJLy9MYXN0IGZvY3VzIEFubm90IGdldHMgYSBjaGFuY2UgdG8gaGFuZGxlIHRoZSBldmVudC4KLQkJYlJldCA9IHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTEJ1dHRvblVwKHRoaXMsIHBGb2N1c0Fubm90LCBuRmxhZyxwb2ludCk7Ci0JfQotCWlmKHBGWEFubm90ICYmICFiUmV0KQotCXsKLQkJYlJldCA9IHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTEJ1dHRvblVwKHRoaXMsIHBGWEFubm90LCBuRmxhZyxwb2ludCk7Ci0JCXJldHVybiBiUmV0OwotCX0KLQlyZXR1cm4gYlJldDsKLX0KLQotRlhfQk9PTCBDUERGU0RLX1BhZ2VWaWV3OjpPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIGludCBuRmxhZykKLXsKLQotCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOwotCUNQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyTWdyID0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7Ci0JQVNTRVJUKHBBbm5vdEhhbmRsZXJNZ3IpOwotCWlmKENQREZTREtfQW5ub3QqIHBGWEFubm90ID0gR2V0RlhXaWRnZXRBdFBvaW50KHBvaW50LngsIHBvaW50LnkpKQotCXsKLQkJaWYobV9DYXB0dXJlV2lkZ2V0ICYmIG1fQ2FwdHVyZVdpZGdldCAhPSBwRlhBbm5vdCkKLQkJewotCQkJbV9iRXhpdFdpZGdldCA9IFRSVUU7Ci0JCQltX2JFbnRlcldpZGdldCA9IEZBTFNFOwotCQkJcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25Nb3VzZUV4aXQodGhpcywgbV9DYXB0dXJlV2lkZ2V0LCBuRmxhZyk7Ci0JCX0KLQkJbV9DYXB0dXJlV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwRlhBbm5vdDsKLQkJbV9iT25XaWRnZXQgPSBUUlVFOwotCQlpZighbV9iRW50ZXJXaWRnZXQpCi0JCXsKLQkJCW1fYkVudGVyV2lkZ2V0ID0gVFJVRTsKLQkJCW1fYkV4aXRXaWRnZXQgPSBGQUxTRTsKLQkJCXBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTW91c2VFbnRlcih0aGlzLCBwRlhBbm5vdCxuRmxhZyk7Ci0JCX0KLQkJcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25Nb3VzZU1vdmUodGhpcywgcEZYQW5ub3QsIG5GbGFnLCBwb2ludCk7Ci0JCXJldHVybiBUUlVFOwotCX0KLQllbHNlCi0JewotCQlpZihtX2JPbldpZGdldCkKLQkJewkKLQkJCW1fYk9uV2lkZ2V0ID0gRkFMU0U7Ci0JCQltX2JFeGl0V2lkZ2V0ID0gVFJVRTsKLQkJCW1fYkVudGVyV2lkZ2V0ID0gRkFMU0U7Ci0JCQlpZihtX0NhcHR1cmVXaWRnZXQpCi0JCQl7Ci0JCQkJcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25Nb3VzZUV4aXQodGhpcywgbV9DYXB0dXJlV2lkZ2V0LCBuRmxhZyk7Ci0JCQkJbV9DYXB0dXJlV2lkZ2V0ID0gTlVMTDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCQotCXJldHVybiBGQUxTRTs7Ci19Ci0KLUZYX0JPT0wgQ1BERlNES19QYWdlVmlldzo6T25Nb3VzZVdoZWVsKGRvdWJsZSBkZWx0YVgsIGRvdWJsZSBkZWx0YVksY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIGludCBuRmxhZykKLXsKLQlpZihDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBHZXRGWFdpZGdldEF0UG9pbnQocG9pbnQueCwgcG9pbnQueSkpCi0JewotCQlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKLQkJQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIHBBbm5vdEhhbmRsZXJNZ3IgPSBwRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKLQkJQVNTRVJUKHBBbm5vdEhhbmRsZXJNZ3IpOwotCQlyZXR1cm4gcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25Nb3VzZVdoZWVsKHRoaXMsIHBBbm5vdCwgbkZsYWcsIChpbnQpZGVsdGFZLCBwb2ludCk7Ci0JfQotCXJldHVybiBGQUxTRTsKLQotfQotCi1GWF9CT09MIENQREZTREtfUGFnZVZpZXc6Ok9uQ2hhcihpbnQgbkNoYXIsIEZYX1VJTlQgbkZsYWcpCi17Ci0JaWYoQ1BERlNES19Bbm5vdCogcEFubm90ID0gR2V0Rm9jdXNBbm5vdCgpKQotCXsKLQkJQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7Ci0JCUNQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyTWdyID0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7Ci0JCUFTU0VSVChwQW5ub3RIYW5kbGVyTWdyKTsKLQkJcmV0dXJuIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZyk7Ci0JfQotCi0JcmV0dXJuIEZBTFNFOwotfQotCi1GWF9CT09MIENQREZTREtfUGFnZVZpZXc6Ok9uS2V5RG93bihpbnQgbktleUNvZGUsIGludCBuRmxhZykKLXsKLQlpZihDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBHZXRGb2N1c0Fubm90KCkpCi0JewotCQlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKLQkJQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIHBBbm5vdEhhbmRsZXJNZ3IgPSBwRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKLQkJQVNTRVJUKHBBbm5vdEhhbmRsZXJNZ3IpOwotCQlyZXR1cm4gcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25LZXlEb3duKHBBbm5vdCwgbktleUNvZGUsIG5GbGFnKTsKLQl9Ci0JcmV0dXJuIEZBTFNFOwotfQotCi1GWF9CT09MIENQREZTREtfUGFnZVZpZXc6Ok9uS2V5VXAoaW50IG5LZXlDb2RlLCBpbnQgbkZsYWcpCi17Ci0vLyAJaWYoQ1BERlNES19Bbm5vdCogcEFubm90ID0gR2V0Rm9jdXNBbm5vdCgpKQotLy8gCXsKLS8vIAkJQ0ZGTF9JRm9ybUZpbGxlciogcElGb3JtRmlsbGVyID0gZ19wRm9ybUZpbGxBcHAtPkdldElGb3JtRmlsbGVyKCk7Ci0vLyAJCXJldHVybiBwSUZvcm1GaWxsZXItPk9uS2V5VXAocEFubm90LCBuS2V5Q29kZSwgbkZsYWcpOwotLy8gCX0KLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLWV4dGVybiB2b2lkIENoZWNrVW5TdXBwb3J0QW5ub3QoQ1BERl9Eb2N1bWVudCAqIHBEb2MsIENQREZfQW5ub3QqIHBQREZBbm5vdCk7Ci0KLXZvaWQgQ1BERlNES19QYWdlVmlldzo6TG9hZEZYQW5ub3RzKCkKLXsKLQlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsKLQotCUZYX0JPT0wgZW5hYmxlQVBVcGRhdGUgPSBDUERGX0ludGVyRm9ybTo6VXBkYXRpbmdBUEVuYWJsZWQoKTsKLQkvL0Rpc2FibGUgdGhlIGRlZmF1bHQgQVAgY29uc3RydWN0aW9uLgotCUNQREZfSW50ZXJGb3JtOjpFbmFibGVVcGRhdGVBUChGQUxTRSk7Ci0JbV9wQW5ub3RMaXN0ID0gbmV3IENQREZfQW5ub3RMaXN0KG1fcGFnZSk7Ci0JQ1BERl9JbnRlckZvcm06OkVuYWJsZVVwZGF0ZUFQKGVuYWJsZUFQVXBkYXRlKTsKLQlpbnQgbkNvdW50ID0gbV9wQW5ub3RMaXN0LT5Db3VudCgpOwotICAgICAgICBTZXRMb2NrKFRSVUUpOwotCWZvcihpbnQgaT0wOyBpPG5Db3VudDsgaSsrKQotCXsKLQkJQ1BERl9Bbm5vdCogcFBERkFubm90ID0gbV9wQW5ub3RMaXN0LT5HZXRBdChpKTsKLQkJQ1BERl9Eb2N1bWVudCAqIHBEb2MgPSB0aGlzLT5HZXRQREZEb2N1bWVudCgpOwotCQkKLQkJQ2hlY2tVblN1cHBvcnRBbm5vdChwRG9jLCBwUERGQW5ub3QpOwotCi0JCUNQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyTWdyID0gcEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7Ci0JCUFTU0VSVChwQW5ub3RIYW5kbGVyTWdyICE9IE5VTEwpOwotCi0JCWlmKHBBbm5vdEhhbmRsZXJNZ3IpCi0JCXsKLQkJCUNQREZTREtfQW5ub3QqIHBBbm5vdCA9IHBBbm5vdEhhbmRsZXJNZ3ItPk5ld0Fubm90KHBQREZBbm5vdCwgdGhpcyk7Ci0JCQlpZighcEFubm90KQotCQkJCWNvbnRpbnVlOwotCQkJbV9meEFubm90QXJyYXkuQWRkKHBBbm5vdCk7Ci0KLQkJCXBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTG9hZChwQW5ub3QpOwotCQl9Ci0KLQl9Ci0gICAgICAgIFNldExvY2soRkFMU0UpOwotfQotCi12b2lkCUNQREZTREtfUGFnZVZpZXc6OlVwZGF0ZVJlY3RzKENGWF9SZWN0QXJyYXkmIHJlY3RzKQotewotCWZvcihpbnQgaT0wOyBpPHJlY3RzLkdldFNpemUoKTsgaSsrKQotCXsKLQkJQ1BERl9SZWN0IHJjID0gcmVjdHMuR2V0QXQoaSk7Ci0JCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOwotCQlwRW52LT5GRklfSW52YWxpZGF0ZShtX3BhZ2UsIHJjLmxlZnQsIHJjLnRvcCwgcmMucmlnaHQsIHJjLmJvdHRvbSk7Ci0JfQotfQotCi12b2lkIENQREZTREtfUGFnZVZpZXc6OlVwZGF0ZVZpZXcoQ1BERlNES19Bbm5vdCogcEFubm90KQotewotCUNQREZfUmVjdCByY1dpbmRvdzsKLQotIAlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsJCi0vLyAJQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIHBBbm5vdEhhbmRsZXIgPSBwRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKLQkKLQlyY1dpbmRvdyA9IHBBbm5vdC0+R2V0UmVjdCgpOy8vcEFubm90SGFuZGxlci0+QW5ub3RfT25HZXRWaWV3QkJveCh0aGlzLHBBbm5vdCk7CQotCXBFbnYtPkZGSV9JbnZhbGlkYXRlKG1fcGFnZSwgcmNXaW5kb3cubGVmdCwgcmNXaW5kb3cudG9wLCByY1dpbmRvdy5yaWdodCwgcmNXaW5kb3cuYm90dG9tKTsKLQotfQotCi1pbnQgQ1BERlNES19QYWdlVmlldzo6R2V0UGFnZUluZGV4KCkKLXsKLQlpZihtX3BhZ2UpCi0JewotCQlDUERGX0RpY3Rpb25hcnkqIHBEaWMgPSBtX3BhZ2UtPm1fcEZvcm1EaWN0OwotCQlDUERGX0RvY3VtZW50KiBwRG9jID0gbV9wU0RLRG9jLT5HZXREb2N1bWVudCgpOwotCQlpZihwRG9jICYmIHBEaWMpCi0JCXsKLQkJCXJldHVybiBwRG9jLT5HZXRQYWdlSW5kZXgocERpYy0+R2V0T2JqTnVtKCkpOwotCQl9Ci0JfQotCXJldHVybiAtMTsKLX0KLQotRlhfQk9PTAlDUERGU0RLX1BhZ2VWaWV3OjpJc1ZhbGlkQW5ub3QoRlhfTFBWT0lEIHApCi17Ci0JaWYgKHAgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCWludCBpQ291bnQgPSBtX3BBbm5vdExpc3QtPkNvdW50KCk7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykKLQl7Ci0JCWlmIChtX3BBbm5vdExpc3QtPkdldEF0KGkpID09IHApCi0JCQlyZXR1cm4gVFJVRTsKLQl9Ci0JcmV0dXJuIEZBTFNFOwotfQotCi0KLUNQREZTREtfQW5ub3QqIENQREZTREtfUGFnZVZpZXc6OkdldEZvY3VzQW5ub3QoKQotewotCUNQREZTREtfQW5ub3QqIHBGb2N1c0Fubm90ID0gbV9wU0RLRG9jLT5HZXRGb2N1c0Fubm90KCk7Ci0JaWYoIXBGb2N1c0Fubm90KQotCQlyZXR1cm4gTlVMTDsKLQkKLQlmb3IoaW50IGk9MDsgaTxtX2Z4QW5ub3RBcnJheS5HZXRTaXplKCk7IGkrKykKLQl7Ci0JCUNQREZTREtfQW5ub3QqIHBBbm5vdCA9IChDUERGU0RLX0Fubm90KiltX2Z4QW5ub3RBcnJheS5HZXRBdChpKTsKLQkJaWYocEFubm90ID09IHBGb2N1c0Fubm90KQotCQkJcmV0dXJuIHBBbm5vdDsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZzZGtfcmVuZGVyY29udGV4dC5jcHAgYi9mcGRmc2RrL3NyYy9mc2RrX3JlbmRlcmNvbnRleHQuY3BwCmluZGV4IDg5YzYxNzkuLjNiNjcxY2EgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZzZGtfcmVuZGVyY29udGV4dC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnNka19yZW5kZXJjb250ZXh0LmNwcApAQCAtMSw0OSArMSw0NyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX3JlbmRlcmNvbnRleHQuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnNka19yZW5kZXJjb250ZXh0LmgiCiAKLXZvaWQgQ1JlbmRlckNvbnRleHQ6OkNsZWFyKCkKLXsKLQltX3BEZXZpY2UgPSBOVUxMOwotCW1fcENvbnRleHQgPSBOVUxMOwotCW1fcFJlbmRlcmVyID0gTlVMTDsKLQltX3BBbm5vdHMgPSBOVUxMOwotCW1fcE9wdGlvbnMJPSBOVUxMOwordm9pZCBDUmVuZGVyQ29udGV4dDo6Q2xlYXIoKSB7CisgIG1fcERldmljZSA9IE5VTEw7CisgIG1fcENvbnRleHQgPSBOVUxMOworICBtX3BSZW5kZXJlciA9IE5VTEw7CisgIG1fcEFubm90cyA9IE5VTEw7CisgIG1fcE9wdGlvbnMgPSBOVUxMOwogI2lmZGVmIF9XSU4zMl9XQ0UKLQltX3BCaXRtYXAgPSBOVUxMOwotCW1faEJpdG1hcCA9IE5VTEw7CisgIG1fcEJpdG1hcCA9IE5VTEw7CisgIG1faEJpdG1hcCA9IE5VTEw7CiAjZW5kaWYKIH0KIAotQ1JlbmRlckNvbnRleHQ6On5DUmVuZGVyQ29udGV4dCgpCi17Ci0JaWYgKG1fcFJlbmRlcmVyKSBkZWxldGUgbV9wUmVuZGVyZXI7Ci0JaWYgKG1fcENvbnRleHQpIGRlbGV0ZSBtX3BDb250ZXh0OwotCWlmIChtX3BEZXZpY2UpIGRlbGV0ZSBtX3BEZXZpY2U7Ci0JaWYgKG1fcEFubm90cykgZGVsZXRlIG1fcEFubm90czsKLQlpZiAobV9wT3B0aW9ucy0+bV9wT0NDb250ZXh0KSBkZWxldGUgbV9wT3B0aW9ucy0+bV9wT0NDb250ZXh0OwotCWlmIChtX3BPcHRpb25zKSBkZWxldGUgbV9wT3B0aW9uczsKK0NSZW5kZXJDb250ZXh0Ojp+Q1JlbmRlckNvbnRleHQoKSB7CisgIGRlbGV0ZSBtX3BSZW5kZXJlcjsKKyAgZGVsZXRlIG1fcENvbnRleHQ7CisgIGRlbGV0ZSBtX3BEZXZpY2U7CisgIGRlbGV0ZSBtX3BBbm5vdHM7CisgIGRlbGV0ZSBtX3BPcHRpb25zLT5tX3BPQ0NvbnRleHQ7CisgIGRlbGV0ZSBtX3BPcHRpb25zOwogI2lmZGVmIF9XSU4zMl9XQ0UKLQlpZiAobV9wQml0bWFwKSBkZWxldGUgbV9wQml0bWFwOwotCWlmIChtX2hCaXRtYXApIERlbGV0ZU9iamVjdChtX2hCaXRtYXApOworICBkZWxldGUgbV9wQml0bWFwOworICBpZiAobV9oQml0bWFwKQorICAgIERlbGV0ZU9iamVjdChtX2hCaXRtYXApOwogI2VuZGlmCiB9CiAKLUlGU0RLX1BBVVNFX0FkYXB0ZXI6OklGU0RLX1BBVVNFX0FkYXB0ZXIoSUZTREtfUEFVU0UqIElQYXVzZSApCi17Ci0JbV9JUGF1c2UgPSBJUGF1c2U7CitJRlNES19QQVVTRV9BZGFwdGVyOjpJRlNES19QQVVTRV9BZGFwdGVyKElGU0RLX1BBVVNFKiBJUGF1c2UpIHsKKyAgbV9JUGF1c2UgPSBJUGF1c2U7CiB9CiAKLUZYX0JPT0wgSUZTREtfUEFVU0VfQWRhcHRlcjo6TmVlZFRvUGF1c2VOb3coKQotewotCWlmIChtX0lQYXVzZS0+TmVlZFRvUGF1c2VOb3cpCi0JewotCQlyZXR1cm4gbV9JUGF1c2UtPk5lZWRUb1BhdXNlTm93KG1fSVBhdXNlKTsKLQl9ZWxzZXsKLQkJcmV0dXJuIEZBTFNFOwotCX0KK0lGU0RLX1BBVVNFX0FkYXB0ZXI6On5JRlNES19QQVVTRV9BZGFwdGVyKCkgeworfQorCitGWF9CT09MIElGU0RLX1BBVVNFX0FkYXB0ZXI6Ok5lZWRUb1BhdXNlTm93KCkgeworICBpZiAobV9JUGF1c2UtPk5lZWRUb1BhdXNlTm93KSB7CisgICAgcmV0dXJuIG1fSVBhdXNlLT5OZWVkVG9QYXVzZU5vdyhtX0lQYXVzZSk7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfYXAuY3BwIGIvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfYXAuY3BwCmluZGV4IDkyZTViZmMuLjI4MDNiNjAgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X2FwLmNwcAorKysgYi9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9hcC5jcHAKQEAgLTEsMjI1ICsxLDIwNSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGVkaXQvZnhldF9zdHViLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGVkaXQvZnhfZWRpdC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfZWRpdC5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcmVzb3VyY2UuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4X2VkaXQuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfZWRpdC5oIgogCi1DRlhfQnl0ZVN0cmluZyBHZXRQREZXb3JkU3RyaW5nKElGWF9FZGl0X0ZvbnRNYXAgKiBwRm9udE1hcCwgRlhfSU5UMzIgbkZvbnRJbmRleCwgRlhfV09SRCBXb3JkLCBGWF9XT1JEIFN1YldvcmQpIAotewotCUFTU0VSVCAocEZvbnRNYXAgIT0gTlVMTCk7CitDRlhfQnl0ZVN0cmluZyBHZXRQREZXb3JkU3RyaW5nKElGWF9FZGl0X0ZvbnRNYXAqIHBGb250TWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Gb250SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgV29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCBTdWJXb3JkKSB7CisgIENGWF9CeXRlU3RyaW5nIHNXb3JkOworICBpZiAoQ1BERl9Gb250KiBwUERGRm9udCA9IHBGb250TWFwLT5HZXRQREZGb250KG5Gb250SW5kZXgpKSB7CisgICAgaWYgKFN1YldvcmQgPiAwKSB7CisgICAgICBXb3JkID0gU3ViV29yZDsKKyAgICB9IGVsc2UgeworICAgICAgRlhfRFdPUkQgZHdDaGFyQ29kZSA9IC0xOwogCi0JQ0ZYX0J5dGVTdHJpbmcgc1dvcmQ7CisgICAgICBpZiAocFBERkZvbnQtPklzVW5pY29kZUNvbXBhdGlibGUoKSkKKyAgICAgICAgZHdDaGFyQ29kZSA9IHBQREZGb250LT5DaGFyQ29kZUZyb21Vbmljb2RlKFdvcmQpOworICAgICAgZWxzZQorICAgICAgICBkd0NoYXJDb2RlID0gcEZvbnRNYXAtPkNoYXJDb2RlRnJvbVVuaWNvZGUobkZvbnRJbmRleCwgV29yZCk7CiAKLQlpZiAoQ1BERl9Gb250ICogcFBERkZvbnQgPSBwRm9udE1hcC0+R2V0UERGRm9udChuRm9udEluZGV4KSkKLQl7Ci0JCWlmIChTdWJXb3JkID4gMCkKLQkJewotCQkJV29yZCA9IFN1YldvcmQ7CQkKLQkJfQotCQllbHNlCi0JCXsKLQkJCUZYX0RXT1JEIGR3Q2hhckNvZGUgPSAtMTsKKyAgICAgIGlmIChkd0NoYXJDb2RlID4gMCkgeworICAgICAgICBwUERGRm9udC0+QXBwZW5kQ2hhcihzV29yZCwgZHdDaGFyQ29kZSk7CisgICAgICAgIHJldHVybiBzV29yZDsKKyAgICAgIH0KKyAgICB9CiAKLQkJCWlmIChwUERGRm9udC0+SXNVbmljb2RlQ29tcGF0aWJsZSgpKQotCQkJCWR3Q2hhckNvZGUgPSBwUERGRm9udC0+Q2hhckNvZGVGcm9tVW5pY29kZShXb3JkKTsKLQkJCWVsc2UKLQkJCQlkd0NoYXJDb2RlID0gcEZvbnRNYXAtPkNoYXJDb2RlRnJvbVVuaWNvZGUobkZvbnRJbmRleCwgV29yZCk7CisgICAgcFBERkZvbnQtPkFwcGVuZENoYXIoc1dvcmQsIFdvcmQpOworICB9CiAKLQkJCWlmIChkd0NoYXJDb2RlID4gMCApCi0JCQl7Ci0JCQkJcFBERkZvbnQtPkFwcGVuZENoYXIoc1dvcmQsIGR3Q2hhckNvZGUpOwotCQkJCXJldHVybiBzV29yZDsKLQkJCX0KLQkJfQotCi0JCXBQREZGb250LT5BcHBlbmRDaGFyKHNXb3JkLCBXb3JkKTsKLQl9Ci0KLQlyZXR1cm4gc1dvcmQ7CisgIHJldHVybiBzV29yZDsKIH0KIAotc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldFdvcmRSZW5kZXJTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcgJiBzdHJXb3JkcykKLXsKLQlpZiAoc3RyV29yZHMuR2V0TGVuZ3RoKCkgPiAwKQotCQlyZXR1cm4gUERGX0VuY29kZVN0cmluZyhzdHJXb3JkcykgKyAiIFRqXG4iOworc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldFdvcmRSZW5kZXJTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cldvcmRzKSB7CisgIGlmIChzdHJXb3Jkcy5HZXRMZW5ndGgoKSA+IDApCisgICAgcmV0dXJuIFBERl9FbmNvZGVTdHJpbmcoc3RyV29yZHMpICsgIiBUalxuIjsKIAotCXJldHVybiAiIjsKKyAgcmV0dXJuICIiOwogfQogCi1zdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0Rm9udFNldFN0cmluZyhJRlhfRWRpdF9Gb250TWFwICogcEZvbnRNYXAsIEZYX0lOVDMyIG5Gb250SW5kZXgsIEZYX0ZMT0FUIGZGb250U2l6ZSkKLXsKLQlDRlhfQnl0ZVRleHRCdWYgc1JldDsKK3N0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRGb250U2V0U3RyaW5nKElGWF9FZGl0X0ZvbnRNYXAqIHBGb250TWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRm9udEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplKSB7CisgIENGWF9CeXRlVGV4dEJ1ZiBzUmV0OwogCi0JaWYgKHBGb250TWFwKQotCXsKLQkJQ0ZYX0J5dGVTdHJpbmcgc0ZvbnRBbGlhcyA9IHBGb250TWFwLT5HZXRQREZGb250QWxpYXMobkZvbnRJbmRleCk7CisgIGlmIChwRm9udE1hcCkgeworICAgIENGWF9CeXRlU3RyaW5nIHNGb250QWxpYXMgPSBwRm9udE1hcC0+R2V0UERGRm9udEFsaWFzKG5Gb250SW5kZXgpOwogCi0JCWlmIChzRm9udEFsaWFzLkdldExlbmd0aCgpID4gMCAmJiBmRm9udFNpemUgPiAwICkKLQkJCXNSZXQgPDwgIi8iIDw8IHNGb250QWxpYXMgPDwgIiAiIDw8IGZGb250U2l6ZSA8PCAiIFRmXG4iOwotCX0KKyAgICBpZiAoc0ZvbnRBbGlhcy5HZXRMZW5ndGgoKSA+IDAgJiYgZkZvbnRTaXplID4gMCkKKyAgICAgIHNSZXQgPDwgIi8iIDw8IHNGb250QWxpYXMgPDwgIiAiIDw8IGZGb250U2l6ZSA8PCAiIFRmXG4iOworICB9CiAKLQlyZXR1cm4gc1JldC5HZXRCeXRlU3RyaW5nKCk7CisgIHJldHVybiBzUmV0LkdldEJ5dGVTdHJpbmcoKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgSUZYX0VkaXQ6OkdldEVkaXRBcHBlYXJhbmNlU3RyZWFtKElGWF9FZGl0KiBwRWRpdCwgY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0LCAKLQkJCQkJCQkJCQkJCSBjb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBSYW5nZSAvKiA9IE5VTEwqLywgRlhfQk9PTCBiQ29udGludW91cy8qID0gVFJVRSovLCBGWF9XT1JEIFN1YldvcmQvKiA9IDAqLykKLXsKLQlDRlhfQnl0ZVRleHRCdWYgc0VkaXRTdHJlYW0sIHNXb3JkczsKK0NGWF9CeXRlU3RyaW5nIElGWF9FZGl0OjpHZXRFZGl0QXBwZWFyYW5jZVN0cmVhbSgKKyAgICBJRlhfRWRpdCogcEVkaXQsCisgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsCisgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSAvKiA9IE5VTEwqLywKKyAgICBGWF9CT09MIGJDb250aW51b3VzIC8qID0gVFJVRSovLAorICAgIEZYX1dPUkQgU3ViV29yZCAvKiA9IDAqLykgeworICBDRlhfQnl0ZVRleHRCdWYgc0VkaXRTdHJlYW0sIHNXb3JkczsKIAotCUNQREZfUG9pbnQgcHRPbGQoMC4wZiwwLjBmKSxwdE5ldygwLjBmLDAuMGYpOwotCUZYX0lOVDMyIG5DdXJGb250SW5kZXggPSAtMTsKKyAgQ1BERl9Qb2ludCBwdE9sZCgwLjBmLCAwLjBmKSwgcHROZXcoMC4wZiwgMC4wZik7CisgIGludDMyX3QgbkN1ckZvbnRJbmRleCA9IC0xOwogCi0JaWYgKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBwRWRpdC0+R2V0SXRlcmF0b3IoKSkKLQl7Ci0JCWlmIChwUmFuZ2UpCi0JCQlwSXRlcmF0b3ItPlNldEF0KHBSYW5nZS0+QmVnaW5Qb3MpOwotCQllbHNlCi0JCQlwSXRlcmF0b3ItPlNldEF0KDApOworICBpZiAoSUZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IHBFZGl0LT5HZXRJdGVyYXRvcigpKSB7CisgICAgaWYgKHBSYW5nZSkKKyAgICAgIHBJdGVyYXRvci0+U2V0QXQocFJhbmdlLT5CZWdpblBvcyk7CisgICAgZWxzZQorICAgICAgcEl0ZXJhdG9yLT5TZXRBdCgwKTsKIAotCQlDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZTsKKyAgICBDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZTsKIAotCQl3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKQotCQl7Ci0JCQlDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKKyAgICB3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKSB7CisgICAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKIAotCQkJaWYgKHBSYW5nZSAmJiBwbGFjZS5Xb3JkQ21wKHBSYW5nZS0+RW5kUG9zKSA+IDApIGJyZWFrOworICAgICAgaWYgKHBSYW5nZSAmJiBwbGFjZS5Xb3JkQ21wKHBSYW5nZS0+RW5kUG9zKSA+IDApCisgICAgICAgIGJyZWFrOwogCi0JCQlpZiAoYkNvbnRpbnVvdXMpCQkJCi0JCQl7Ci0JCQkJaWYgKHBsYWNlLkxpbmVDbXAob2xkcGxhY2UpICE9IDApCi0JCQkJewotCQkJCQlpZiAoc1dvcmRzLkdldFNpemUoKSA+IDApCi0JCQkJCXsKLQkJCQkJCXNFZGl0U3RyZWFtIDw8IEdldFdvcmRSZW5kZXJTdHJpbmcoc1dvcmRzLkdldEJ5dGVTdHJpbmcoKSk7Ci0JCQkJCQlzV29yZHMuQ2xlYXIoKTsKLQkJCQkJfQorICAgICAgaWYgKGJDb250aW51b3VzKSB7CisgICAgICAgIGlmIChwbGFjZS5MaW5lQ21wKG9sZHBsYWNlKSAhPSAwKSB7CisgICAgICAgICAgaWYgKHNXb3Jkcy5HZXRTaXplKCkgPiAwKSB7CisgICAgICAgICAgICBzRWRpdFN0cmVhbSA8PCBHZXRXb3JkUmVuZGVyU3RyaW5nKHNXb3Jkcy5HZXRCeXRlU3RyaW5nKCkpOworICAgICAgICAgICAgc1dvcmRzLkNsZWFyKCk7CisgICAgICAgICAgfQogCi0JCQkJCUNQVlRfV29yZCB3b3JkOwotCQkJCQlpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKQotCQkJCQl7Ci0JCQkJCQlwdE5ldyA9IENQREZfUG9pbnQod29yZC5wdFdvcmQueCArIHB0T2Zmc2V0LngsIHdvcmQucHRXb3JkLnkgKyBwdE9mZnNldC55KTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCUNQVlRfTGluZSBsaW5lOwotCQkJCQkJcEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpOwotCQkJCQkJcHROZXcgPSBDUERGX1BvaW50KGxpbmUucHRMaW5lLnggKyBwdE9mZnNldC54LCBsaW5lLnB0TGluZS55ICsgcHRPZmZzZXQueSk7Ci0JCQkJCX0KKyAgICAgICAgICBDUFZUX1dvcmQgd29yZDsKKyAgICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7CisgICAgICAgICAgICBwdE5ldyA9IENQREZfUG9pbnQod29yZC5wdFdvcmQueCArIHB0T2Zmc2V0LngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZC5wdFdvcmQueSArIHB0T2Zmc2V0LnkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDUFZUX0xpbmUgbGluZTsKKyAgICAgICAgICAgIHBJdGVyYXRvci0+R2V0TGluZShsaW5lKTsKKyAgICAgICAgICAgIHB0TmV3ID0gQ1BERl9Qb2ludChsaW5lLnB0TGluZS54ICsgcHRPZmZzZXQueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLnB0TGluZS55ICsgcHRPZmZzZXQueSk7CisgICAgICAgICAgfQogCi0JCQkJCWlmIChwdE5ldy54ICE9IHB0T2xkLnggfHwgcHROZXcueSAhPSBwdE9sZC55KQotCQkJCQl7Ci0JCQkJCQlzRWRpdFN0cmVhbSA8PCBwdE5ldy54IC0gcHRPbGQueCA8PCAiICIgPDwgcHROZXcueSAtIHB0T2xkLnkgPDwgIiBUZFxuIjsKKyAgICAgICAgICBpZiAocHROZXcueCAhPSBwdE9sZC54IHx8IHB0TmV3LnkgIT0gcHRPbGQueSkgeworICAgICAgICAgICAgc0VkaXRTdHJlYW0gPDwgcHROZXcueCAtIHB0T2xkLnggPDwgIiAiIDw8IHB0TmV3LnkgLSBwdE9sZC55CisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIFRkXG4iOwogCi0JCQkJCQlwdE9sZCA9IHB0TmV3OwotCQkJCQl9Ci0JCQkJfQorICAgICAgICAgICAgcHRPbGQgPSBwdE5ldzsKKyAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkJCUNQVlRfV29yZCB3b3JkOwotCQkJCWlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpCi0JCQkJewkKLQkJCQkJaWYgKHdvcmQubkZvbnRJbmRleCAhPSBuQ3VyRm9udEluZGV4KQotCQkJCQl7Ci0JCQkJCQlpZiAoc1dvcmRzLkdldFNpemUoKSA+IDApCi0JCQkJCQl7Ci0JCQkJCQkJc0VkaXRTdHJlYW0gPDwgR2V0V29yZFJlbmRlclN0cmluZyhzV29yZHMuR2V0Qnl0ZVN0cmluZygpKTsKLQkJCQkJCQlzV29yZHMuQ2xlYXIoKTsKLQkJCQkJCX0KLQkJCQkJCXNFZGl0U3RyZWFtIDw8IEdldEZvbnRTZXRTdHJpbmcocEVkaXQtPkdldEZvbnRNYXAoKSx3b3JkLm5Gb250SW5kZXgsd29yZC5mRm9udFNpemUpOwotCQkJCQkJbkN1ckZvbnRJbmRleCA9IHdvcmQubkZvbnRJbmRleDsKLQkJCQkJfQorICAgICAgICBDUFZUX1dvcmQgd29yZDsKKyAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgeworICAgICAgICAgIGlmICh3b3JkLm5Gb250SW5kZXggIT0gbkN1ckZvbnRJbmRleCkgeworICAgICAgICAgICAgaWYgKHNXb3Jkcy5HZXRTaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgIHNFZGl0U3RyZWFtIDw8IEdldFdvcmRSZW5kZXJTdHJpbmcoc1dvcmRzLkdldEJ5dGVTdHJpbmcoKSk7CisgICAgICAgICAgICAgIHNXb3Jkcy5DbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc0VkaXRTdHJlYW0gPDwgR2V0Rm9udFNldFN0cmluZyhwRWRpdC0+R2V0Rm9udE1hcCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkLm5Gb250SW5kZXgsIHdvcmQuZkZvbnRTaXplKTsKKyAgICAgICAgICAgIG5DdXJGb250SW5kZXggPSB3b3JkLm5Gb250SW5kZXg7CisgICAgICAgICAgfQogCi0JCQkJCXNXb3JkcyA8PCBHZXRQREZXb3JkU3RyaW5nKHBFZGl0LT5HZXRGb250TWFwKCksbkN1ckZvbnRJbmRleCx3b3JkLldvcmQsU3ViV29yZCk7Ci0JCQkJfQorICAgICAgICAgIHNXb3JkcyA8PCBHZXRQREZXb3JkU3RyaW5nKHBFZGl0LT5HZXRGb250TWFwKCksIG5DdXJGb250SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZC5Xb3JkLCBTdWJXb3JkKTsKKyAgICAgICAgfQogCi0JCQkJb2xkcGxhY2UgPSBwbGFjZTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlDUFZUX1dvcmQgd29yZDsKLQkJCQlpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKQotCQkJCXsKLQkJCQkJcHROZXcgPSBDUERGX1BvaW50KHdvcmQucHRXb3JkLnggKyBwdE9mZnNldC54LCB3b3JkLnB0V29yZC55ICsgcHRPZmZzZXQueSk7CisgICAgICAgIG9sZHBsYWNlID0gcGxhY2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBDUFZUX1dvcmQgd29yZDsKKyAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgeworICAgICAgICAgIHB0TmV3ID0gQ1BERl9Qb2ludCh3b3JkLnB0V29yZC54ICsgcHRPZmZzZXQueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZC5wdFdvcmQueSArIHB0T2Zmc2V0LnkpOwogCi0JCQkJCWlmIChwdE5ldy54ICE9IHB0T2xkLnggfHwgcHROZXcueSAhPSBwdE9sZC55KQotCQkJCQl7Ci0JCQkJCQlzRWRpdFN0cmVhbSA8PCBwdE5ldy54IC0gcHRPbGQueCA8PCAiICIgPDwgcHROZXcueSAtIHB0T2xkLnkgPDwgIiBUZFxuIjsKLQkJCQkJCXB0T2xkID0gcHROZXc7Ci0JCQkJCX0JCisgICAgICAgICAgaWYgKHB0TmV3LnggIT0gcHRPbGQueCB8fCBwdE5ldy55ICE9IHB0T2xkLnkpIHsKKyAgICAgICAgICAgIHNFZGl0U3RyZWFtIDw8IHB0TmV3LnggLSBwdE9sZC54IDw8ICIgIiA8PCBwdE5ldy55IC0gcHRPbGQueQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBUZFxuIjsKKyAgICAgICAgICAgIHB0T2xkID0gcHROZXc7CisgICAgICAgICAgfQogCi0JCQkJCWlmICh3b3JkLm5Gb250SW5kZXggIT0gbkN1ckZvbnRJbmRleCkKLQkJCQkJewotCQkJCQkJc0VkaXRTdHJlYW0gPDwgR2V0Rm9udFNldFN0cmluZyhwRWRpdC0+R2V0Rm9udE1hcCgpLHdvcmQubkZvbnRJbmRleCx3b3JkLmZGb250U2l6ZSk7Ci0JCQkJCQluQ3VyRm9udEluZGV4ID0gd29yZC5uRm9udEluZGV4OwotCQkJCQl9CisgICAgICAgICAgaWYgKHdvcmQubkZvbnRJbmRleCAhPSBuQ3VyRm9udEluZGV4KSB7CisgICAgICAgICAgICBzRWRpdFN0cmVhbSA8PCBHZXRGb250U2V0U3RyaW5nKHBFZGl0LT5HZXRGb250TWFwKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQubkZvbnRJbmRleCwgd29yZC5mRm9udFNpemUpOworICAgICAgICAgICAgbkN1ckZvbnRJbmRleCA9IHdvcmQubkZvbnRJbmRleDsKKyAgICAgICAgICB9CiAKLQkJCQkJc0VkaXRTdHJlYW0gPDwgR2V0V29yZFJlbmRlclN0cmluZyhHZXRQREZXb3JkU3RyaW5nKHBFZGl0LT5HZXRGb250TWFwKCksbkN1ckZvbnRJbmRleCx3b3JkLldvcmQsU3ViV29yZCkpOwotCQkJCX0KLQkJCX0KLQkJfQorICAgICAgICAgIHNFZGl0U3RyZWFtIDw8IEdldFdvcmRSZW5kZXJTdHJpbmcoR2V0UERGV29yZFN0cmluZygKKyAgICAgICAgICAgICAgcEVkaXQtPkdldEZvbnRNYXAoKSwgbkN1ckZvbnRJbmRleCwgd29yZC5Xb3JkLCBTdWJXb3JkKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CiAKLQkJaWYgKHNXb3Jkcy5HZXRTaXplKCkgPiAwKQotCQl7Ci0JCQlzRWRpdFN0cmVhbSA8PCBHZXRXb3JkUmVuZGVyU3RyaW5nKHNXb3Jkcy5HZXRCeXRlU3RyaW5nKCkpOwotCQkJc1dvcmRzLkNsZWFyKCk7Ci0JCX0KLQl9CisgICAgaWYgKHNXb3Jkcy5HZXRTaXplKCkgPiAwKSB7CisgICAgICBzRWRpdFN0cmVhbSA8PCBHZXRXb3JkUmVuZGVyU3RyaW5nKHNXb3Jkcy5HZXRCeXRlU3RyaW5nKCkpOworICAgICAgc1dvcmRzLkNsZWFyKCk7CisgICAgfQorICB9CiAKLQlDRlhfQnl0ZVRleHRCdWYgc0FwcFN0cmVhbTsKLQlpZiAoc0VkaXRTdHJlYW0uR2V0U2l6ZSgpID4gMCkKLQl7Ci0JCUZYX0lOVDMyIG5Ib3J6U2NhbGUgPSBwRWRpdC0+R2V0SG9yelNjYWxlKCk7Ci0JCWlmIChuSG9yelNjYWxlICE9IDEwMCkKLQkJewotCQkJc0FwcFN0cmVhbSA8PCBuSG9yelNjYWxlIDw8ICIgVHpcbiI7Ci0JCX0KKyAgQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07CisgIGlmIChzRWRpdFN0cmVhbS5HZXRTaXplKCkgPiAwKSB7CisgICAgaW50MzJfdCBuSG9yelNjYWxlID0gcEVkaXQtPkdldEhvcnpTY2FsZSgpOworICAgIGlmIChuSG9yelNjYWxlICE9IDEwMCkgeworICAgICAgc0FwcFN0cmVhbSA8PCBuSG9yelNjYWxlIDw8ICIgVHpcbiI7CisgICAgfQogCi0JCUZYX0ZMT0FUIGZDaGFyU3BhY2UgPSBwRWRpdC0+R2V0Q2hhclNwYWNlKCk7Ci0JCWlmICghRlhfRURJVF9Jc0Zsb2F0WmVybyhmQ2hhclNwYWNlKSkKLQkJewotCQkJc0FwcFN0cmVhbSA8PCBmQ2hhclNwYWNlIDw8ICIgVGNcbiI7Ci0JCX0KKyAgICBGWF9GTE9BVCBmQ2hhclNwYWNlID0gcEVkaXQtPkdldENoYXJTcGFjZSgpOworICAgIGlmICghRlhfRURJVF9Jc0Zsb2F0WmVybyhmQ2hhclNwYWNlKSkgeworICAgICAgc0FwcFN0cmVhbSA8PCBmQ2hhclNwYWNlIDw8ICIgVGNcbiI7CisgICAgfQogCi0JCXNBcHBTdHJlYW0gPDwgc0VkaXRTdHJlYW07Ci0JfQkKKyAgICBzQXBwU3RyZWFtIDw8IHNFZGl0U3RyZWFtOworICB9CiAKLQlyZXR1cm4gc0FwcFN0cmVhbS5HZXRCeXRlU3RyaW5nKCk7CisgIHJldHVybiBzQXBwU3RyZWFtLkdldEJ5dGVTdHJpbmcoKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgSUZYX0VkaXQ6OkdldFNlbGVjdEFwcGVhcmFuY2VTdHJlYW0oSUZYX0VkaXQqIHBFZGl0LCBjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQsIAotCQkJCQkJCWNvbnN0IENQVlRfV29yZFJhbmdlICogcFJhbmdlIC8qPSBOVUxMKi8pCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNSZXQ7CitDRlhfQnl0ZVN0cmluZyBJRlhfRWRpdDo6R2V0U2VsZWN0QXBwZWFyYW5jZVN0cmVhbSgKKyAgICBJRlhfRWRpdCogcEVkaXQsCisgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsCisgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSkgeworICBDRlhfQnl0ZVRleHRCdWYgc1JldDsKIAotCWlmIChwUmFuZ2UgJiYgcFJhbmdlLT5Jc0V4aXN0KCkpCi0JewotCQlpZiAoSUZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IHBFZGl0LT5HZXRJdGVyYXRvcigpKQotCQl7Ci0JCQlwSXRlcmF0b3ItPlNldEF0KHBSYW5nZS0+QmVnaW5Qb3MpOwotCQkJCi0JCQl3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKQotCQkJewotCQkJCUNQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOworICBpZiAocFJhbmdlICYmIHBSYW5nZS0+SXNFeGlzdCgpKSB7CisgICAgaWYgKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBwRWRpdC0+R2V0SXRlcmF0b3IoKSkgeworICAgICAgcEl0ZXJhdG9yLT5TZXRBdChwUmFuZ2UtPkJlZ2luUG9zKTsKIAotCQkJCWlmIChwUmFuZ2UgJiYgcGxhY2UuV29yZENtcChwUmFuZ2UtPkVuZFBvcykgPiAwKSBicmVhazsJCQkJCisgICAgICB3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKSB7CisgICAgICAgIENQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOwogCi0JCQkJQ1BWVF9Xb3JkIHdvcmQ7Ci0JCQkJQ1BWVF9MaW5lIGxpbmU7Ci0JCQkJaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSAmJiBwSXRlcmF0b3ItPkdldExpbmUobGluZSkpCi0JCQkJewkJCQotCQkJCQkvL0NQREZfUmVjdCByY1dvcmRTZWwgPSBDUERGX1JlY3Qod29yZC5wdFdvcmQueCxsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZURlc2NlbnQsCi0JCQkJCS8vCQl3b3JkLnB0V29yZC54K3dvcmQuZldpZHRoLGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lQXNjZW50KTsKKyAgICAgICAgaWYgKHBSYW5nZSAmJiBwbGFjZS5Xb3JkQ21wKHBSYW5nZS0+RW5kUG9zKSA+IDApCisgICAgICAgICAgYnJlYWs7CiAKLQkJCQkJc1JldCA8PCB3b3JkLnB0V29yZC54ICsgcHRPZmZzZXQueCA8PCAiICIgPDwgbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVEZXNjZW50Ci0JCQkJCQk8PCAiICIgPDwgd29yZC5mV2lkdGggPDwgIiAiIDw8IGxpbmUuZkxpbmVBc2NlbnQgLSBsaW5lLmZMaW5lRGVzY2VudCA8PCAiIHJlXG5mXG4iOwkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgIENQVlRfV29yZCB3b3JkOworICAgICAgICBDUFZUX0xpbmUgbGluZTsKKyAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSAmJiBwSXRlcmF0b3ItPkdldExpbmUobGluZSkpIHsKKyAgICAgICAgICBzUmV0IDw8IHdvcmQucHRXb3JkLnggKyBwdE9mZnNldC54IDw8ICIgIgorICAgICAgICAgICAgICAgPDwgbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVEZXNjZW50IDw8ICIgIiA8PCB3b3JkLmZXaWR0aCA8PCAiICIKKyAgICAgICAgICAgICAgIDw8IGxpbmUuZkxpbmVBc2NlbnQgLSBsaW5lLmZMaW5lRGVzY2VudCA8PCAiIHJlXG5mXG4iOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CiAKLQlyZXR1cm4gc1JldC5HZXRCeXRlU3RyaW5nKCk7CisgIHJldHVybiBzUmV0LkdldEJ5dGVTdHJpbmcoKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfZWRpdC5jcHAgYi9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9lZGl0LmNwcAppbmRleCAwMDE1YzBmLi4wZTY2YjBlIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9lZGl0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9lZGl0LmNwcApAQCAtMSwzNTkzICsxLDMwMzAgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfc3R1Yi5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfZWRpdC5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhldF9lZGl0LmgiCiAKLSNkZWZpbmUgRlhfRURJVF9VTkRPX01BWElURU0JCQkJMTAwMDAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0ZYX0VkaXRfSXRlcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcmVzb3VyY2UuaCIKIAotQ0ZYX0VkaXRfSXRlcmF0b3I6OkNGWF9FZGl0X0l0ZXJhdG9yKENGWF9FZGl0ICogcEVkaXQsSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IgKiBwVlRJdGVyYXRvcikgOiAKLQltX3BFZGl0KHBFZGl0KSwKLQltX3BWVEl0ZXJhdG9yKHBWVEl0ZXJhdG9yKQotewotfQorI2RlZmluZSBGWF9FRElUX1VORE9fTUFYSVRFTSAxMDAwMAogCi1DRlhfRWRpdF9JdGVyYXRvcjo6fkNGWF9FZGl0X0l0ZXJhdG9yKCkKLXsKLX0KLQotRlhfQk9PTAlDRlhfRWRpdF9JdGVyYXRvcjo6TmV4dFdvcmQoKQotewotCUFTU0VSVChtX3BWVEl0ZXJhdG9yICE9IE5VTEwpOwotCQotCXJldHVybiBtX3BWVEl0ZXJhdG9yLT5OZXh0V29yZCgpOwotfQorQ0ZYX0VkaXRfSXRlcmF0b3I6OkNGWF9FZGl0X0l0ZXJhdG9yKENGWF9FZGl0KiBwRWRpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciogcFZUSXRlcmF0b3IpCisgICAgOiBtX3BFZGl0KHBFZGl0KSwgbV9wVlRJdGVyYXRvcihwVlRJdGVyYXRvcikge30KIAotRlhfQk9PTCBDRlhfRWRpdF9JdGVyYXRvcjo6TmV4dExpbmUoKQotewotCUFTU0VSVChtX3BWVEl0ZXJhdG9yICE9IE5VTEwpOworQ0ZYX0VkaXRfSXRlcmF0b3I6On5DRlhfRWRpdF9JdGVyYXRvcigpIHt9CiAKLQlyZXR1cm4gbV9wVlRJdGVyYXRvci0+TmV4dExpbmUoKTsKK0ZYX0JPT0wgQ0ZYX0VkaXRfSXRlcmF0b3I6Ok5leHRXb3JkKCkgeworICByZXR1cm4gbV9wVlRJdGVyYXRvci0+TmV4dFdvcmQoKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdF9JdGVyYXRvcjo6TmV4dFNlY3Rpb24oKQotewotCUFTU0VSVChtX3BWVEl0ZXJhdG9yICE9IE5VTEwpOworRlhfQk9PTCBDRlhfRWRpdF9JdGVyYXRvcjo6TmV4dExpbmUoKSB7CisgIHJldHVybiBtX3BWVEl0ZXJhdG9yLT5OZXh0TGluZSgpOworfQogCi0JcmV0dXJuIG1fcFZUSXRlcmF0b3ItPk5leHRTZWN0aW9uKCk7CitGWF9CT09MIENGWF9FZGl0X0l0ZXJhdG9yOjpOZXh0U2VjdGlvbigpIHsKKyAgcmV0dXJuIG1fcFZUSXRlcmF0b3ItPk5leHRTZWN0aW9uKCk7CiB9CiAKLUZYX0JPT0wJQ0ZYX0VkaXRfSXRlcmF0b3I6OlByZXZXb3JkKCkKLXsKLQlBU1NFUlQobV9wVlRJdGVyYXRvciAhPSBOVUxMKTsKLQkKLQlyZXR1cm4gbV9wVlRJdGVyYXRvci0+UHJldldvcmQoKTsKK0ZYX0JPT0wgQ0ZYX0VkaXRfSXRlcmF0b3I6OlByZXZXb3JkKCkgeworICByZXR1cm4gbV9wVlRJdGVyYXRvci0+UHJldldvcmQoKTsKIH0KIAotRlhfQk9PTAlDRlhfRWRpdF9JdGVyYXRvcjo6UHJldkxpbmUoKQotewotCUFTU0VSVChtX3BWVEl0ZXJhdG9yICE9IE5VTEwpOwotCi0JcmV0dXJuIG1fcFZUSXRlcmF0b3ItPlByZXZMaW5lKCk7CitGWF9CT09MIENGWF9FZGl0X0l0ZXJhdG9yOjpQcmV2TGluZSgpIHsKKyAgcmV0dXJuIG1fcFZUSXRlcmF0b3ItPlByZXZMaW5lKCk7CiB9CiAKLUZYX0JPT0wJQ0ZYX0VkaXRfSXRlcmF0b3I6OlByZXZTZWN0aW9uKCkKLXsKLQlBU1NFUlQobV9wVlRJdGVyYXRvciAhPSBOVUxMKTsKLQotCXJldHVybiBtX3BWVEl0ZXJhdG9yLT5QcmV2U2VjdGlvbigpOworRlhfQk9PTCBDRlhfRWRpdF9JdGVyYXRvcjo6UHJldlNlY3Rpb24oKSB7CisgIHJldHVybiBtX3BWVEl0ZXJhdG9yLT5QcmV2U2VjdGlvbigpOwogfQogCi1GWF9CT09MIENGWF9FZGl0X0l0ZXJhdG9yOjpHZXRXb3JkKENQVlRfV29yZCAmIHdvcmQpIGNvbnN0Ci17Ci0JQVNTRVJUKG1fcEVkaXQgIT0gTlVMTCk7Ci0JQVNTRVJUKG1fcFZUSXRlcmF0b3IgIT0gTlVMTCk7CitGWF9CT09MIENGWF9FZGl0X0l0ZXJhdG9yOjpHZXRXb3JkKENQVlRfV29yZCYgd29yZCkgY29uc3QgeworICBBU1NFUlQobV9wRWRpdCk7CiAKLQlpZiAobV9wVlRJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkKLQl7Ci0JCXdvcmQucHRXb3JkID0gbV9wRWRpdC0+VlRUb0VkaXQod29yZC5wdFdvcmQpOwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0KLQlyZXR1cm4gRkFMU0U7CisgIGlmIChtX3BWVEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7CisgICAgd29yZC5wdFdvcmQgPSBtX3BFZGl0LT5WVFRvRWRpdCh3b3JkLnB0V29yZCk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIENGWF9FZGl0X0l0ZXJhdG9yOjpHZXRMaW5lKENQVlRfTGluZSAmIGxpbmUpIGNvbnN0Ci17Ci0JQVNTRVJUKG1fcEVkaXQgIT0gTlVMTCk7Ci0JQVNTRVJUKG1fcFZUSXRlcmF0b3IgIT0gTlVMTCk7CitGWF9CT09MIENGWF9FZGl0X0l0ZXJhdG9yOjpHZXRMaW5lKENQVlRfTGluZSYgbGluZSkgY29uc3QgeworICBBU1NFUlQobV9wRWRpdCk7CiAKLQlpZiAobV9wVlRJdGVyYXRvci0+R2V0TGluZShsaW5lKSkKLQl7CQkKLQkJbGluZS5wdExpbmUgPSBtX3BFZGl0LT5WVFRvRWRpdChsaW5lLnB0TGluZSk7Ci0JCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKKyAgaWYgKG1fcFZUSXRlcmF0b3ItPkdldExpbmUobGluZSkpIHsKKyAgICBsaW5lLnB0TGluZSA9IG1fcEVkaXQtPlZUVG9FZGl0KGxpbmUucHRMaW5lKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXRfSXRlcmF0b3I6OkdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uICYgc2VjdGlvbikgY29uc3QKLXsKLQlBU1NFUlQobV9wRWRpdCAhPSBOVUxMKTsKLQlBU1NFUlQobV9wVlRJdGVyYXRvciAhPSBOVUxMKTsKK0ZYX0JPT0wgQ0ZYX0VkaXRfSXRlcmF0b3I6OkdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uJiBzZWN0aW9uKSBjb25zdCB7CisgIEFTU0VSVChtX3BFZGl0KTsKIAotCWlmIChtX3BWVEl0ZXJhdG9yLT5HZXRTZWN0aW9uKHNlY3Rpb24pKQotCXsKLQkJc2VjdGlvbi5yY1NlY3Rpb24gPSBtX3BFZGl0LT5WVFRvRWRpdChzZWN0aW9uLnJjU2VjdGlvbik7Ci0JCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKKyAgaWYgKG1fcFZUSXRlcmF0b3ItPkdldFNlY3Rpb24oc2VjdGlvbikpIHsKKyAgICBzZWN0aW9uLnJjU2VjdGlvbiA9IG1fcEVkaXQtPlZUVG9FZGl0KHNlY3Rpb24ucmNTZWN0aW9uKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9CiAKLXZvaWQgQ0ZYX0VkaXRfSXRlcmF0b3I6OlNldEF0KEZYX0lOVDMyIG5Xb3JkSW5kZXgpCi17Ci0JQVNTRVJUKG1fcFZUSXRlcmF0b3IgIT0gTlVMTCk7Ci0KLQltX3BWVEl0ZXJhdG9yLT5TZXRBdChuV29yZEluZGV4KTsKK3ZvaWQgQ0ZYX0VkaXRfSXRlcmF0b3I6OlNldEF0KGludDMyX3QgbldvcmRJbmRleCkgeworICBtX3BWVEl0ZXJhdG9yLT5TZXRBdChuV29yZEluZGV4KTsKIH0KIAotdm9pZCBDRlhfRWRpdF9JdGVyYXRvcjo6U2V0QXQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkKLXsKLQlBU1NFUlQobV9wVlRJdGVyYXRvciAhPSBOVUxMKTsKLQotCW1fcFZUSXRlcmF0b3ItPlNldEF0KHBsYWNlKTsKK3ZvaWQgQ0ZYX0VkaXRfSXRlcmF0b3I6OlNldEF0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgeworICBtX3BWVEl0ZXJhdG9yLT5TZXRBdChwbGFjZSk7CiB9CiAKLWNvbnN0IENQVlRfV29yZFBsYWNlICYgQ0ZYX0VkaXRfSXRlcmF0b3I6OkdldEF0KCkgY29uc3QKLXsKLQlBU1NFUlQobV9wVlRJdGVyYXRvciAhPSBOVUxMKTsKLQotCXJldHVybiBtX3BWVEl0ZXJhdG9yLT5HZXRBdCgpOworY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIENGWF9FZGl0X0l0ZXJhdG9yOjpHZXRBdCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcFZUSXRlcmF0b3ItPkdldEF0KCk7CiB9CiAKLUlGWF9FZGl0KiBDRlhfRWRpdF9JdGVyYXRvcjo6R2V0RWRpdCgpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fcEVkaXQ7CitJRlhfRWRpdCogQ0ZYX0VkaXRfSXRlcmF0b3I6OkdldEVkaXQoKSBjb25zdCB7CisgIHJldHVybiBtX3BFZGl0OwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0ZYX0VkaXRfUHJvdmlkZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1DRlhfRWRpdF9Qcm92aWRlcjo6Q0ZYX0VkaXRfUHJvdmlkZXIoSUZYX0VkaXRfRm9udE1hcCAqIHBGb250TWFwKSA6IG1fcEZvbnRNYXAocEZvbnRNYXApCi17Ci0JQVNTRVJUKG1fcEZvbnRNYXAgIT0gTlVMTCk7CitDRlhfRWRpdF9Qcm92aWRlcjo6Q0ZYX0VkaXRfUHJvdmlkZXIoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXApCisgICAgOiBtX3BGb250TWFwKHBGb250TWFwKSB7CisgIEFTU0VSVChtX3BGb250TWFwKTsKIH0KIAotQ0ZYX0VkaXRfUHJvdmlkZXI6On5DRlhfRWRpdF9Qcm92aWRlcigpCi17Ci19CitDRlhfRWRpdF9Qcm92aWRlcjo6fkNGWF9FZGl0X1Byb3ZpZGVyKCkge30KIAotSUZYX0VkaXRfRm9udE1hcCogQ0ZYX0VkaXRfUHJvdmlkZXI6OkdldEZvbnRNYXAoKQotewotCXJldHVybiBtX3BGb250TWFwOworSUZYX0VkaXRfRm9udE1hcCogQ0ZYX0VkaXRfUHJvdmlkZXI6OkdldEZvbnRNYXAoKSB7CisgIHJldHVybiBtX3BGb250TWFwOwogfQogCi1GWF9JTlQzMiBDRlhfRWRpdF9Qcm92aWRlcjo6R2V0Q2hhcldpZHRoKEZYX0lOVDMyIG5Gb250SW5kZXgsIEZYX1dPUkQgd29yZCwgRlhfSU5UMzIgbldvcmRTdHlsZSkKLXsKLQlpZiAoQ1BERl9Gb250KiBwUERGRm9udCA9IG1fcEZvbnRNYXAtPkdldFBERkZvbnQobkZvbnRJbmRleCkpCi0JewotCQlGWF9EV09SRCBjaGFyY29kZSA9IHdvcmQ7CitpbnQzMl90IENGWF9FZGl0X1Byb3ZpZGVyOjpHZXRDaGFyV2lkdGgoaW50MzJfdCBuRm9udEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Xb3JkU3R5bGUpIHsKKyAgaWYgKENQREZfRm9udCogcFBERkZvbnQgPSBtX3BGb250TWFwLT5HZXRQREZGb250KG5Gb250SW5kZXgpKSB7CisgICAgRlhfRFdPUkQgY2hhcmNvZGUgPSB3b3JkOwogCi0JCWlmIChwUERGRm9udC0+SXNVbmljb2RlQ29tcGF0aWJsZSgpKQkJCi0JCQljaGFyY29kZSA9IHBQREZGb250LT5DaGFyQ29kZUZyb21Vbmljb2RlKHdvcmQpOwkKLQkJZWxzZQotCQkJY2hhcmNvZGUgPSBtX3BGb250TWFwLT5DaGFyQ29kZUZyb21Vbmljb2RlKG5Gb250SW5kZXgsIHdvcmQpOworICAgIGlmIChwUERGRm9udC0+SXNVbmljb2RlQ29tcGF0aWJsZSgpKQorICAgICAgY2hhcmNvZGUgPSBwUERGRm9udC0+Q2hhckNvZGVGcm9tVW5pY29kZSh3b3JkKTsKKyAgICBlbHNlCisgICAgICBjaGFyY29kZSA9IG1fcEZvbnRNYXAtPkNoYXJDb2RlRnJvbVVuaWNvZGUobkZvbnRJbmRleCwgd29yZCk7CiAKLQkJaWYgKGNoYXJjb2RlICE9IC0xKQkJCQotCQkJcmV0dXJuIHBQREZGb250LT5HZXRDaGFyV2lkdGhGKGNoYXJjb2RlKTsKLQl9CisgICAgaWYgKGNoYXJjb2RlICE9IC0xKQorICAgICAgcmV0dXJuIHBQREZGb250LT5HZXRDaGFyV2lkdGhGKGNoYXJjb2RlKTsKKyAgfQogCi0JcmV0dXJuIDA7CisgIHJldHVybiAwOwogfQogCi1GWF9JTlQzMiBDRlhfRWRpdF9Qcm92aWRlcjo6R2V0VHlwZUFzY2VudChGWF9JTlQzMiBuRm9udEluZGV4KQotewotCWlmIChDUERGX0ZvbnQqIHBQREZGb250ID0gbV9wRm9udE1hcC0+R2V0UERGRm9udChuRm9udEluZGV4KSkKLQkJcmV0dXJuIHBQREZGb250LT5HZXRUeXBlQXNjZW50KCk7CitpbnQzMl90IENGWF9FZGl0X1Byb3ZpZGVyOjpHZXRUeXBlQXNjZW50KGludDMyX3QgbkZvbnRJbmRleCkgeworICBpZiAoQ1BERl9Gb250KiBwUERGRm9udCA9IG1fcEZvbnRNYXAtPkdldFBERkZvbnQobkZvbnRJbmRleCkpCisgICAgcmV0dXJuIHBQREZGb250LT5HZXRUeXBlQXNjZW50KCk7CiAKLQlyZXR1cm4gMDsKKyAgcmV0dXJuIDA7CiB9CiAKLUZYX0lOVDMyIENGWF9FZGl0X1Byb3ZpZGVyOjpHZXRUeXBlRGVzY2VudChGWF9JTlQzMiBuRm9udEluZGV4KQotewotCWlmIChDUERGX0ZvbnQqIHBQREZGb250ID0gbV9wRm9udE1hcC0+R2V0UERGRm9udChuRm9udEluZGV4KSkKLQkJcmV0dXJuIHBQREZGb250LT5HZXRUeXBlRGVzY2VudCgpOworaW50MzJfdCBDRlhfRWRpdF9Qcm92aWRlcjo6R2V0VHlwZURlc2NlbnQoaW50MzJfdCBuRm9udEluZGV4KSB7CisgIGlmIChDUERGX0ZvbnQqIHBQREZGb250ID0gbV9wRm9udE1hcC0+R2V0UERGRm9udChuRm9udEluZGV4KSkKKyAgICByZXR1cm4gcFBERkZvbnQtPkdldFR5cGVEZXNjZW50KCk7CiAKLQlyZXR1cm4gMDsKKyAgcmV0dXJuIDA7CiB9CiAKLUZYX0lOVDMyIENGWF9FZGl0X1Byb3ZpZGVyOjpHZXRXb3JkRm9udEluZGV4KEZYX1dPUkQgd29yZCwgRlhfSU5UMzIgY2hhcnNldCwgRlhfSU5UMzIgbkZvbnRJbmRleCkKLXsKLQlyZXR1cm4gbV9wRm9udE1hcC0+R2V0V29yZEZvbnRJbmRleCh3b3JkLGNoYXJzZXQsbkZvbnRJbmRleCk7CitpbnQzMl90IENGWF9FZGl0X1Byb3ZpZGVyOjpHZXRXb3JkRm9udEluZGV4KEZYX1dPUkQgd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Gb250SW5kZXgpIHsKKyAgcmV0dXJuIG1fcEZvbnRNYXAtPkdldFdvcmRGb250SW5kZXgod29yZCwgY2hhcnNldCwgbkZvbnRJbmRleCk7CiB9CiAKLUZYX0lOVDMyIENGWF9FZGl0X1Byb3ZpZGVyOjpHZXREZWZhdWx0Rm9udEluZGV4KCkKLXsKLQlyZXR1cm4gMDsKK2ludDMyX3QgQ0ZYX0VkaXRfUHJvdmlkZXI6OkdldERlZmF1bHRGb250SW5kZXgoKSB7CisgIHJldHVybiAwOwogfQogCi1GWF9CT09MCUNGWF9FZGl0X1Byb3ZpZGVyOjpJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpCi17Ci0JcmV0dXJuIEZYX0VESVRfSVNMQVRJTldPUkQod29yZCk7CitGWF9CT09MIENGWF9FZGl0X1Byb3ZpZGVyOjpJc0xhdGluV29yZChGWF9XT1JEIHdvcmQpIHsKKyAgcmV0dXJuIEZYX0VESVRfSVNMQVRJTldPUkQod29yZCk7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRlhfRWRpdF9SZWZyZXNoIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworQ0ZYX0VkaXRfUmVmcmVzaDo6Q0ZYX0VkaXRfUmVmcmVzaCgpIHt9CiAKLUNGWF9FZGl0X1JlZnJlc2g6OkNGWF9FZGl0X1JlZnJlc2goKQotewotfQorQ0ZYX0VkaXRfUmVmcmVzaDo6fkNGWF9FZGl0X1JlZnJlc2goKSB7fQogCi1DRlhfRWRpdF9SZWZyZXNoOjp+Q0ZYX0VkaXRfUmVmcmVzaCgpCi17Cit2b2lkIENGWF9FZGl0X1JlZnJlc2g6OkJlZ2luUmVmcmVzaCgpIHsKKyAgbV9SZWZyZXNoUmVjdHMuRW1wdHkoKTsKKyAgbV9PbGRMaW5lUmVjdHMgPSBtX05ld0xpbmVSZWN0czsKIH0KIAotdm9pZCBDRlhfRWRpdF9SZWZyZXNoOjpCZWdpblJlZnJlc2goKQotewotCW1fUmVmcmVzaFJlY3RzLkVtcHR5KCk7Ci0JbV9PbGRMaW5lUmVjdHMgPSBtX05ld0xpbmVSZWN0czsKK3ZvaWQgQ0ZYX0VkaXRfUmVmcmVzaDo6UHVzaChjb25zdCBDUFZUX1dvcmRSYW5nZSYgbGluZXJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgcmVjdCkgeworICBtX05ld0xpbmVSZWN0cy5BZGQobGluZXJhbmdlLCByZWN0KTsKIH0KIAotdm9pZCBDRlhfRWRpdF9SZWZyZXNoOjpQdXNoKGNvbnN0IENQVlRfV29yZFJhbmdlICYgbGluZXJhbmdlLGNvbnN0IENQREZfUmVjdCAmIHJlY3QpCi17Ci0JbV9OZXdMaW5lUmVjdHMuQWRkKGxpbmVyYW5nZSxyZWN0KTsKLX0KK3ZvaWQgQ0ZYX0VkaXRfUmVmcmVzaDo6Tm9BbmFseXNlKCkgeworICB7CisgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fT2xkTGluZVJlY3RzLkdldFNpemUoKTsgaSA8IHN6OyBpKyspCisgICAgICBpZiAoQ0ZYX0VkaXRfTGluZVJlY3QqIHBPbGRSZWN0ID0gbV9PbGRMaW5lUmVjdHMuR2V0QXQoaSkpCisgICAgICAgIG1fUmVmcmVzaFJlY3RzLkFkZChwT2xkUmVjdC0+bV9yY0xpbmUpOworICB9CiAKLXZvaWQgQ0ZYX0VkaXRfUmVmcmVzaDo6Tm9BbmFseXNlKCkKLXsKLQl7Ci0JCWZvciAoRlhfSU5UMzIgaSA9IDAsIHN6ID0gbV9PbGRMaW5lUmVjdHMuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKLQkJCWlmIChDRlhfRWRpdF9MaW5lUmVjdCAqIHBPbGRSZWN0ID0gbV9PbGRMaW5lUmVjdHMuR2V0QXQoaSkpCi0JCQkJbV9SZWZyZXNoUmVjdHMuQWRkKHBPbGRSZWN0LT5tX3JjTGluZSk7Ci0JfQotCi0JewotCQlmb3IgKEZYX0lOVDMyIGkgPSAwLCBzeiA9IG1fTmV3TGluZVJlY3RzLkdldFNpemUoKTsgaSA8IHN6OyBpKyspCi0JCQlpZiAoQ0ZYX0VkaXRfTGluZVJlY3QgKiBwTmV3UmVjdCA9IG1fTmV3TGluZVJlY3RzLkdldEF0KGkpKQotCQkJCW1fUmVmcmVzaFJlY3RzLkFkZChwTmV3UmVjdC0+bV9yY0xpbmUpOwotCX0KKyAgeworICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX05ld0xpbmVSZWN0cy5HZXRTaXplKCk7IGkgPCBzejsgaSsrKQorICAgICAgaWYgKENGWF9FZGl0X0xpbmVSZWN0KiBwTmV3UmVjdCA9IG1fTmV3TGluZVJlY3RzLkdldEF0KGkpKQorICAgICAgICBtX1JlZnJlc2hSZWN0cy5BZGQocE5ld1JlY3QtPm1fcmNMaW5lKTsKKyAgfQogfQogCi12b2lkIENGWF9FZGl0X1JlZnJlc2g6OkFuYWx5c2UoRlhfSU5UMzIgbkFsaWdubWVudCkKLXsKLQlGWF9CT09MIGJMaW5lVG9wQ2hhbmdlZCA9IEZBTFNFOwotCUNQREZfUmVjdCByY1Jlc3VsdDsKLQlGWF9GTE9BVCBmV2lkdGhEaWZmOwordm9pZCBDRlhfRWRpdF9SZWZyZXNoOjpBbmFseXNlKGludDMyX3QgbkFsaWdubWVudCkgeworICBGWF9CT09MIGJMaW5lVG9wQ2hhbmdlZCA9IEZBTFNFOworICBDUERGX1JlY3QgcmNSZXN1bHQ7CisgIEZYX0ZMT0FUIGZXaWR0aERpZmY7CiAKLQlGWF9JTlQzMiBzek1heCA9IEZYX0VESVRfTUFYKG1fT2xkTGluZVJlY3RzLkdldFNpemUoKSxtX05ld0xpbmVSZWN0cy5HZXRTaXplKCkpOwotCUZYX0lOVDMyIGkgPSAwOworICBpbnQzMl90IHN6TWF4ID0gc3RkOjptYXgobV9PbGRMaW5lUmVjdHMuR2V0U2l6ZSgpLCBtX05ld0xpbmVSZWN0cy5HZXRTaXplKCkpOworICBpbnQzMl90IGkgPSAwOwogCi0Jd2hpbGUgKGkgPCBzek1heCkKLQl7Ci0JCUNGWF9FZGl0X0xpbmVSZWN0ICogcE9sZFJlY3QgPSBtX09sZExpbmVSZWN0cy5HZXRBdChpKTsKLQkJQ0ZYX0VkaXRfTGluZVJlY3QgKiBwTmV3UmVjdCA9IG1fTmV3TGluZVJlY3RzLkdldEF0KGkpOworICB3aGlsZSAoaSA8IHN6TWF4KSB7CisgICAgQ0ZYX0VkaXRfTGluZVJlY3QqIHBPbGRSZWN0ID0gbV9PbGRMaW5lUmVjdHMuR2V0QXQoaSk7CisgICAgQ0ZYX0VkaXRfTGluZVJlY3QqIHBOZXdSZWN0ID0gbV9OZXdMaW5lUmVjdHMuR2V0QXQoaSk7CiAKLQkJaWYgKHBPbGRSZWN0KQotCQl7Ci0JCQlpZiAocE5ld1JlY3QpCi0JCQl7Ci0JCQkJaWYgKGJMaW5lVG9wQ2hhbmdlZCkKLQkJCQl7Ci0JCQkJCXJjUmVzdWx0ID0gcE9sZFJlY3QtPm1fcmNMaW5lOwotCQkJCQlyY1Jlc3VsdC5VbmlvbihwTmV3UmVjdC0+bV9yY0xpbmUpOwotCQkJCQltX1JlZnJlc2hSZWN0cy5BZGQocmNSZXN1bHQpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlpZiAoKnBOZXdSZWN0ICE9ICpwT2xkUmVjdCkKLQkJCQkJewotCQkJCQkJaWYgKCFwTmV3UmVjdC0+SXNTYW1lVG9wKCpwT2xkUmVjdCkgfHwgIXBOZXdSZWN0LT5Jc1NhbWVIZWlnaHQoKnBPbGRSZWN0KSkKLQkJCQkJCXsKLQkJCQkJCQliTGluZVRvcENoYW5nZWQgPSBUUlVFOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQorICAgIGlmIChwT2xkUmVjdCkgeworICAgICAgaWYgKHBOZXdSZWN0KSB7CisgICAgICAgIGlmIChiTGluZVRvcENoYW5nZWQpIHsKKyAgICAgICAgICByY1Jlc3VsdCA9IHBPbGRSZWN0LT5tX3JjTGluZTsKKyAgICAgICAgICByY1Jlc3VsdC5VbmlvbihwTmV3UmVjdC0+bV9yY0xpbmUpOworICAgICAgICAgIG1fUmVmcmVzaFJlY3RzLkFkZChyY1Jlc3VsdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKCpwTmV3UmVjdCAhPSAqcE9sZFJlY3QpIHsKKyAgICAgICAgICAgIGlmICghcE5ld1JlY3QtPklzU2FtZVRvcCgqcE9sZFJlY3QpIHx8CisgICAgICAgICAgICAgICAgIXBOZXdSZWN0LT5Jc1NhbWVIZWlnaHQoKnBPbGRSZWN0KSkgeworICAgICAgICAgICAgICBiTGluZVRvcENoYW5nZWQgPSBUUlVFOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KIAotCQkJCQkJaWYgKG5BbGlnbm1lbnQgPT0gMCkKLQkJCQkJCXsKLQkJCQkJCQlpZiAocE5ld1JlY3QtPm1fd3JMaW5lLkJlZ2luUG9zICE9IHBPbGRSZWN0LT5tX3dyTGluZS5CZWdpblBvcykKLQkJCQkJCQl7Ci0JCQkJCQkJCXJjUmVzdWx0ID0gcE9sZFJlY3QtPm1fcmNMaW5lOwotCQkJCQkJCQlyY1Jlc3VsdC5VbmlvbihwTmV3UmVjdC0+bV9yY0xpbmUpOwotCQkJCQkJCQltX1JlZnJlc2hSZWN0cy5BZGQocmNSZXN1bHQpOwkKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCXsKLQkJCQkJCQkJaWYgKCFwTmV3UmVjdC0+SXNTYW1lTGVmdCgqcE9sZFJlY3QpKSAKLQkJCQkJCQkJewotCQkJCQkJCQkJcmNSZXN1bHQgPSBwT2xkUmVjdC0+bV9yY0xpbmU7Ci0JCQkJCQkJCQlyY1Jlc3VsdC5VbmlvbihwTmV3UmVjdC0+bV9yY0xpbmUpOwkJCQkJCQkJCQkKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlCi0JCQkJCQkJCXsKLQkJCQkJCQkJCWZXaWR0aERpZmYgPSBwTmV3UmVjdC0+bV9yY0xpbmUuV2lkdGgoKSAtIHBPbGRSZWN0LT5tX3JjTGluZS5XaWR0aCgpOwotCQkJCQkJCQkJcmNSZXN1bHQgPSBwTmV3UmVjdC0+bV9yY0xpbmU7Ci0JCQkJCQkJCQlpZiAoZldpZHRoRGlmZiA+IDAuMGYpCi0JCQkJCQkJCQkJcmNSZXN1bHQubGVmdCA9IHJjUmVzdWx0LnJpZ2h0IC0gZldpZHRoRGlmZjsKLQkJCQkJCQkJCWVsc2UKLQkJCQkJCQkJCXsKLQkJCQkJCQkJCQlyY1Jlc3VsdC5sZWZ0ID0gcmNSZXN1bHQucmlnaHQ7Ci0JCQkJCQkJCQkJcmNSZXN1bHQucmlnaHQgKz0gKC1mV2lkdGhEaWZmKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQltX1JlZnJlc2hSZWN0cy5BZGQocmNSZXN1bHQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlyY1Jlc3VsdCA9IHBPbGRSZWN0LT5tX3JjTGluZTsKLQkJCQkJCQlyY1Jlc3VsdC5VbmlvbihwTmV3UmVjdC0+bV9yY0xpbmUpOwotCQkJCQkJCW1fUmVmcmVzaFJlY3RzLkFkZChyY1Jlc3VsdCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQkvL2Rvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQltX1JlZnJlc2hSZWN0cy5BZGQocE9sZFJlY3QtPm1fcmNMaW5lKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChwTmV3UmVjdCkKLQkJCXsKLQkJCQltX1JlZnJlc2hSZWN0cy5BZGQocE5ld1JlY3QtPm1fcmNMaW5lKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvL2Vycm9yCi0JCQl9Ci0JCX0KLQkJaSsrOwotCX0KKyAgICAgICAgICAgIGlmIChuQWxpZ25tZW50ID09IDApIHsKKyAgICAgICAgICAgICAgaWYgKHBOZXdSZWN0LT5tX3dyTGluZS5CZWdpblBvcyAhPSBwT2xkUmVjdC0+bV93ckxpbmUuQmVnaW5Qb3MpIHsKKyAgICAgICAgICAgICAgICByY1Jlc3VsdCA9IHBPbGRSZWN0LT5tX3JjTGluZTsKKyAgICAgICAgICAgICAgICByY1Jlc3VsdC5VbmlvbihwTmV3UmVjdC0+bV9yY0xpbmUpOworICAgICAgICAgICAgICAgIG1fUmVmcmVzaFJlY3RzLkFkZChyY1Jlc3VsdCk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCFwTmV3UmVjdC0+SXNTYW1lTGVmdCgqcE9sZFJlY3QpKSB7CisgICAgICAgICAgICAgICAgICByY1Jlc3VsdCA9IHBPbGRSZWN0LT5tX3JjTGluZTsKKyAgICAgICAgICAgICAgICAgIHJjUmVzdWx0LlVuaW9uKHBOZXdSZWN0LT5tX3JjTGluZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGZXaWR0aERpZmYgPQorICAgICAgICAgICAgICAgICAgICAgIHBOZXdSZWN0LT5tX3JjTGluZS5XaWR0aCgpIC0gcE9sZFJlY3QtPm1fcmNMaW5lLldpZHRoKCk7CisgICAgICAgICAgICAgICAgICByY1Jlc3VsdCA9IHBOZXdSZWN0LT5tX3JjTGluZTsKKyAgICAgICAgICAgICAgICAgIGlmIChmV2lkdGhEaWZmID4gMC4wZikgeworICAgICAgICAgICAgICAgICAgICByY1Jlc3VsdC5sZWZ0ID0gcmNSZXN1bHQucmlnaHQgLSBmV2lkdGhEaWZmOworICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmNSZXN1bHQubGVmdCA9IHJjUmVzdWx0LnJpZ2h0OworICAgICAgICAgICAgICAgICAgICByY1Jlc3VsdC5yaWdodCArPSAoLWZXaWR0aERpZmYpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtX1JlZnJlc2hSZWN0cy5BZGQocmNSZXN1bHQpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICByY1Jlc3VsdCA9IHBPbGRSZWN0LT5tX3JjTGluZTsKKyAgICAgICAgICAgICAgcmNSZXN1bHQuVW5pb24ocE5ld1JlY3QtPm1fcmNMaW5lKTsKKyAgICAgICAgICAgICAgbV9SZWZyZXNoUmVjdHMuQWRkKHJjUmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fUmVmcmVzaFJlY3RzLkFkZChwT2xkUmVjdC0+bV9yY0xpbmUpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAocE5ld1JlY3QpIHsKKyAgICAgICAgbV9SZWZyZXNoUmVjdHMuQWRkKHBOZXdSZWN0LT5tX3JjTGluZSk7CisgICAgICB9CisgICAgfQorICAgIGkrKzsKKyAgfQogfQogCi12b2lkIENGWF9FZGl0X1JlZnJlc2g6OkFkZFJlZnJlc2goY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkKLXsKLQltX1JlZnJlc2hSZWN0cy5BZGQocmVjdCk7Cit2b2lkIENGWF9FZGl0X1JlZnJlc2g6OkFkZFJlZnJlc2goY29uc3QgQ1BERl9SZWN0JiByZWN0KSB7CisgIG1fUmVmcmVzaFJlY3RzLkFkZChyZWN0KTsKIH0KIAotY29uc3QgQ0ZYX0VkaXRfUmVjdEFycmF5ICogQ0ZYX0VkaXRfUmVmcmVzaDo6R2V0UmVmcmVzaFJlY3RzKCkgY29uc3QKLXsKLQlyZXR1cm4gJm1fUmVmcmVzaFJlY3RzOworY29uc3QgQ0ZYX0VkaXRfUmVjdEFycmF5KiBDRlhfRWRpdF9SZWZyZXNoOjpHZXRSZWZyZXNoUmVjdHMoKSBjb25zdCB7CisgIHJldHVybiAmbV9SZWZyZXNoUmVjdHM7CiB9CiAKLXZvaWQgQ0ZYX0VkaXRfUmVmcmVzaDo6RW5kUmVmcmVzaCgpCi17Ci0JbV9SZWZyZXNoUmVjdHMuRW1wdHkoKTsKK3ZvaWQgQ0ZYX0VkaXRfUmVmcmVzaDo6RW5kUmVmcmVzaCgpIHsKKyAgbV9SZWZyZXNoUmVjdHMuRW1wdHkoKTsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRlhfRWRpdF9VbmRvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK0NGWF9FZGl0X1VuZG86OkNGWF9FZGl0X1VuZG8oaW50MzJfdCBuQnVmc2l6ZSkKKyAgICA6IG1fbkN1clVuZG9Qb3MoMCksCisgICAgICBtX25CdWZTaXplKG5CdWZzaXplKSwKKyAgICAgIG1fYk1vZGlmaWVkKEZBTFNFKSwKKyAgICAgIG1fYlZpcmdpbihUUlVFKSwKKyAgICAgIG1fYldvcmtpbmcoRkFMU0UpIHt9CiAKLUNGWF9FZGl0X1VuZG86OkNGWF9FZGl0X1VuZG8oRlhfSU5UMzIgbkJ1ZnNpemUpIDogbV9uQ3VyVW5kb1BvcygwKSwKLQltX25CdWZTaXplKG5CdWZzaXplKSwKLQltX2JNb2RpZmllZChGQUxTRSksCi0JbV9iVmlyZ2luKFRSVUUpLAotCW1fYldvcmtpbmcoRkFMU0UpCi17CitDRlhfRWRpdF9VbmRvOjp+Q0ZYX0VkaXRfVW5kbygpIHsKKyAgUmVzZXQoKTsKIH0KIAotQ0ZYX0VkaXRfVW5kbzo6fkNGWF9FZGl0X1VuZG8oKQotewotCVJlc2V0KCk7CitGWF9CT09MIENGWF9FZGl0X1VuZG86OkNhblVuZG8oKSBjb25zdCB7CisgIHJldHVybiBtX25DdXJVbmRvUG9zID4gMDsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdF9VbmRvOjpDYW5VbmRvKCkgY29uc3QKLXsKLQlyZXR1cm4gbV9uQ3VyVW5kb1BvcyA+IDA7Ci19Cit2b2lkIENGWF9FZGl0X1VuZG86OlVuZG8oKSB7CisgIG1fYldvcmtpbmcgPSBUUlVFOwogCi12b2lkIENGWF9FZGl0X1VuZG86OlVuZG8oKQotewotCW1fYldvcmtpbmcgPSBUUlVFOworICBpZiAobV9uQ3VyVW5kb1BvcyA+IDApIHsKKyAgICBJRlhfRWRpdF9VbmRvSXRlbSogcEl0ZW0gPSBtX1VuZG9JdGVtU3RhY2suR2V0QXQobV9uQ3VyVW5kb1BvcyAtIDEpOworICAgIHBJdGVtLT5VbmRvKCk7CiAKLQlpZiAobV9uQ3VyVW5kb1BvcyA+IDApCi0JewotCQlJRlhfRWRpdF9VbmRvSXRlbSAqIHBJdGVtID0gbV9VbmRvSXRlbVN0YWNrLkdldEF0KG1fbkN1clVuZG9Qb3MtMSk7Ci0JCUFTU0VSVChwSXRlbSAhPSBOVUxMKTsKLQotCQlwSXRlbS0+VW5kbygpOwotCQotCQltX25DdXJVbmRvUG9zLS07Ci0JCW1fYk1vZGlmaWVkID0gKG1fbkN1clVuZG9Qb3MgIT0gMCk7CQkKLQl9CisgICAgbV9uQ3VyVW5kb1Bvcy0tOworICAgIG1fYk1vZGlmaWVkID0gKG1fbkN1clVuZG9Qb3MgIT0gMCk7CisgIH0KIAotCW1fYldvcmtpbmcgPSBGQUxTRTsKKyAgbV9iV29ya2luZyA9IEZBTFNFOwogfQogCi1GWF9CT09MCUNGWF9FZGl0X1VuZG86OkNhblJlZG8oKSBjb25zdAotewotCXJldHVybiBtX25DdXJVbmRvUG9zIDwgbV9VbmRvSXRlbVN0YWNrLkdldFNpemUoKTsKK0ZYX0JPT0wgQ0ZYX0VkaXRfVW5kbzo6Q2FuUmVkbygpIGNvbnN0IHsKKyAgcmV0dXJuIG1fbkN1clVuZG9Qb3MgPCBtX1VuZG9JdGVtU3RhY2suR2V0U2l6ZSgpOwogfQogCi12b2lkIENGWF9FZGl0X1VuZG86OlJlZG8oKQotewotCW1fYldvcmtpbmcgPSBUUlVFOwordm9pZCBDRlhfRWRpdF9VbmRvOjpSZWRvKCkgeworICBtX2JXb3JraW5nID0gVFJVRTsKIAotCUZYX0lOVDMyIG5TdGFja1NpemUgPSBtX1VuZG9JdGVtU3RhY2suR2V0U2l6ZSgpOworICBpbnQzMl90IG5TdGFja1NpemUgPSBtX1VuZG9JdGVtU3RhY2suR2V0U2l6ZSgpOwogCi0JaWYgKG1fbkN1clVuZG9Qb3MgPCBuU3RhY2tTaXplKQotCXsKLQkJSUZYX0VkaXRfVW5kb0l0ZW0gKiBwSXRlbSA9IG1fVW5kb0l0ZW1TdGFjay5HZXRBdChtX25DdXJVbmRvUG9zKTsKLQkJQVNTRVJUKHBJdGVtICE9IE5VTEwpOwotCi0JCXBJdGVtLT5SZWRvKCk7CisgIGlmIChtX25DdXJVbmRvUG9zIDwgblN0YWNrU2l6ZSkgeworICAgIElGWF9FZGl0X1VuZG9JdGVtKiBwSXRlbSA9IG1fVW5kb0l0ZW1TdGFjay5HZXRBdChtX25DdXJVbmRvUG9zKTsKKyAgICBwSXRlbS0+UmVkbygpOwogCi0JCW1fbkN1clVuZG9Qb3MrKzsKLQkJbV9iTW9kaWZpZWQgPSAobV9uQ3VyVW5kb1BvcyAhPSAwKTsJCQotCX0KKyAgICBtX25DdXJVbmRvUG9zKys7CisgICAgbV9iTW9kaWZpZWQgPSAobV9uQ3VyVW5kb1BvcyAhPSAwKTsKKyAgfQogCi0JbV9iV29ya2luZyA9IEZBTFNFOworICBtX2JXb3JraW5nID0gRkFMU0U7CiB9CiAKLUZYX0JPT0wJQ0ZYX0VkaXRfVW5kbzo6SXNXb3JraW5nKCkgY29uc3QKLXsKLQlyZXR1cm4gbV9iV29ya2luZzsKK0ZYX0JPT0wgQ0ZYX0VkaXRfVW5kbzo6SXNXb3JraW5nKCkgY29uc3QgeworICByZXR1cm4gbV9iV29ya2luZzsKIH0KIAotdm9pZCBDRlhfRWRpdF9VbmRvOjpBZGRJdGVtKElGWF9FZGl0X1VuZG9JdGVtKiBwSXRlbSkKLXsKLQlBU1NFUlQoIW1fYldvcmtpbmcpOwotCUFTU0VSVChwSXRlbSAhPSBOVUxMKTsKLQlBU1NFUlQobV9uQnVmU2l6ZSA+IDEpOwotCQotCWlmIChtX25DdXJVbmRvUG9zIDwgbV9VbmRvSXRlbVN0YWNrLkdldFNpemUoKSkKLQkJUmVtb3ZlVGFpbHMoKTsKK3ZvaWQgQ0ZYX0VkaXRfVW5kbzo6QWRkSXRlbShJRlhfRWRpdF9VbmRvSXRlbSogcEl0ZW0pIHsKKyAgQVNTRVJUKCFtX2JXb3JraW5nKTsKKyAgQVNTRVJUKHBJdGVtKTsKKyAgQVNTRVJUKG1fbkJ1ZlNpemUgPiAxKTsKIAotCWlmIChtX1VuZG9JdGVtU3RhY2suR2V0U2l6ZSgpID49IG1fbkJ1ZlNpemUpCi0JewotCQlSZW1vdmVIZWFkcygpOwkKLQkJbV9iVmlyZ2luID0gRkFMU0U7Ci0JfQorICBpZiAobV9uQ3VyVW5kb1BvcyA8IG1fVW5kb0l0ZW1TdGFjay5HZXRTaXplKCkpCisgICAgUmVtb3ZlVGFpbHMoKTsKKworICBpZiAobV9VbmRvSXRlbVN0YWNrLkdldFNpemUoKSA+PSBtX25CdWZTaXplKSB7CisgICAgUmVtb3ZlSGVhZHMoKTsKKyAgICBtX2JWaXJnaW4gPSBGQUxTRTsKKyAgfQogCi0JbV9VbmRvSXRlbVN0YWNrLkFkZChwSXRlbSk7CQotCW1fbkN1clVuZG9Qb3MgPSBtX1VuZG9JdGVtU3RhY2suR2V0U2l6ZSgpOworICBtX1VuZG9JdGVtU3RhY2suQWRkKHBJdGVtKTsKKyAgbV9uQ3VyVW5kb1BvcyA9IG1fVW5kb0l0ZW1TdGFjay5HZXRTaXplKCk7CiAKLQltX2JNb2RpZmllZCA9IChtX25DdXJVbmRvUG9zICE9IDApOworICBtX2JNb2RpZmllZCA9IChtX25DdXJVbmRvUG9zICE9IDApOwogfQogCi1GWF9CT09MCUNGWF9FZGl0X1VuZG86OklzTW9kaWZpZWQoKSBjb25zdAotewotCWlmIChtX2JWaXJnaW4pCi0JCXJldHVybiBtX2JNb2RpZmllZDsKLQllbHNlCi0JCXJldHVybiBUUlVFOworRlhfQk9PTCBDRlhfRWRpdF9VbmRvOjpJc01vZGlmaWVkKCkgY29uc3QgeworICByZXR1cm4gbV9iVmlyZ2luID8gbV9iTW9kaWZpZWQgOiBUUlVFOwogfQogCi1JRlhfRWRpdF9VbmRvSXRlbSogQ0ZYX0VkaXRfVW5kbzo6R2V0SXRlbShGWF9JTlQzMiBuSW5kZXgpCi17Ci0JaWYgKG5JbmRleD49MCAmJiBuSW5kZXggPCBtX1VuZG9JdGVtU3RhY2suR2V0U2l6ZSgpKQotCQlyZXR1cm4gbV9VbmRvSXRlbVN0YWNrLkdldEF0KG5JbmRleCk7CitJRlhfRWRpdF9VbmRvSXRlbSogQ0ZYX0VkaXRfVW5kbzo6R2V0SXRlbShpbnQzMl90IG5JbmRleCkgeworICBpZiAobkluZGV4ID49IDAgJiYgbkluZGV4IDwgbV9VbmRvSXRlbVN0YWNrLkdldFNpemUoKSkKKyAgICByZXR1cm4gbV9VbmRvSXRlbVN0YWNrLkdldEF0KG5JbmRleCk7CiAKLQlyZXR1cm4gTlVMTDsKKyAgcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgQ0ZYX0VkaXRfVW5kbzo6UmVtb3ZlSGVhZHMoKQotewotCUFTU0VSVChtX1VuZG9JdGVtU3RhY2suR2V0U2l6ZSgpID4gMSk7Cit2b2lkIENGWF9FZGl0X1VuZG86OlJlbW92ZUhlYWRzKCkgeworICBBU1NFUlQobV9VbmRvSXRlbVN0YWNrLkdldFNpemUoKSA+IDEpOwogCi0JZGVsZXRlIG1fVW5kb0l0ZW1TdGFjay5HZXRBdCgwKTsKLQltX1VuZG9JdGVtU3RhY2suUmVtb3ZlQXQoMCk7CisgIGRlbGV0ZSBtX1VuZG9JdGVtU3RhY2suR2V0QXQoMCk7CisgIG1fVW5kb0l0ZW1TdGFjay5SZW1vdmVBdCgwKTsKIH0KIAotdm9pZCBDRlhfRWRpdF9VbmRvOjpSZW1vdmVUYWlscygpCi17Ci0JZm9yIChGWF9JTlQzMiBpID0gbV9VbmRvSXRlbVN0YWNrLkdldFNpemUoKS0xOyBpID49IG1fbkN1clVuZG9Qb3M7IGktLSkKLQl7Ci0JCWRlbGV0ZSBtX1VuZG9JdGVtU3RhY2suR2V0QXQoaSk7Ci0JCW1fVW5kb0l0ZW1TdGFjay5SZW1vdmVBdChpKTsKLQl9Cit2b2lkIENGWF9FZGl0X1VuZG86OlJlbW92ZVRhaWxzKCkgeworICBmb3IgKGludDMyX3QgaSA9IG1fVW5kb0l0ZW1TdGFjay5HZXRTaXplKCkgLSAxOyBpID49IG1fbkN1clVuZG9Qb3M7IGktLSkgeworICAgIGRlbGV0ZSBtX1VuZG9JdGVtU3RhY2suR2V0QXQoaSk7CisgICAgbV9VbmRvSXRlbVN0YWNrLlJlbW92ZUF0KGkpOworICB9CiB9CiAKLXZvaWQgQ0ZYX0VkaXRfVW5kbzo6UmVzZXQoKQotewotCWZvciAoRlhfSU5UMzIgaT0wLCBzej1tX1VuZG9JdGVtU3RhY2suR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKLQl7Ci0JCWRlbGV0ZSBtX1VuZG9JdGVtU3RhY2suR2V0QXQoaSk7Ci0JfQotCW1fbkN1clVuZG9Qb3MgPSAwOwotCW1fVW5kb0l0ZW1TdGFjay5SZW1vdmVBbGwoKTsKK3ZvaWQgQ0ZYX0VkaXRfVW5kbzo6UmVzZXQoKSB7CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX1VuZG9JdGVtU3RhY2suR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgIGRlbGV0ZSBtX1VuZG9JdGVtU3RhY2suR2V0QXQoaSk7CisgIH0KKyAgbV9uQ3VyVW5kb1BvcyA9IDA7CisgIG1fVW5kb0l0ZW1TdGFjay5SZW1vdmVBbGwoKTsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0ZYX0VkaXRfR3JvdXBVbmRvSXRlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworQ0ZYX0VkaXRfR3JvdXBVbmRvSXRlbTo6Q0ZYX0VkaXRfR3JvdXBVbmRvSXRlbShjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RpdGxlKQorICAgIDogbV9zVGl0bGUoc1RpdGxlKSB7fQogCi1DRlhfRWRpdF9Hcm91cFVuZG9JdGVtOjpDRlhfRWRpdF9Hcm91cFVuZG9JdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGl0bGUpIDogbV9zVGl0bGUoc1RpdGxlKQotewotfQorQ0ZYX0VkaXRfR3JvdXBVbmRvSXRlbTo6fkNGWF9FZGl0X0dyb3VwVW5kb0l0ZW0oKSB7CisgIGZvciAoaW50IGkgPSAwLCBzeiA9IG1fSXRlbXMuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgIGRlbGV0ZSBtX0l0ZW1zW2ldOworICB9CiAKLUNGWF9FZGl0X0dyb3VwVW5kb0l0ZW06On5DRlhfRWRpdF9Hcm91cFVuZG9JdGVtKCkKLXsKLQlmb3IgKGludCBpPTAsc3o9bV9JdGVtcy5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQl7Ci0JCWRlbGV0ZSBtX0l0ZW1zW2ldOwotCX0KLQotCW1fSXRlbXMuUmVtb3ZlQWxsKCk7CisgIG1fSXRlbXMuUmVtb3ZlQWxsKCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXRfR3JvdXBVbmRvSXRlbTo6QWRkVW5kb0l0ZW0oQ0ZYX0VkaXRfVW5kb0l0ZW0qIHBVbmRvSXRlbSkKLXsKLQlBU1NFUlQocFVuZG9JdGVtICE9IE5VTEwpOwordm9pZCBDRlhfRWRpdF9Hcm91cFVuZG9JdGVtOjpBZGRVbmRvSXRlbShDRlhfRWRpdF9VbmRvSXRlbSogcFVuZG9JdGVtKSB7CisgIHBVbmRvSXRlbS0+U2V0Rmlyc3QoRkFMU0UpOworICBwVW5kb0l0ZW0tPlNldExhc3QoRkFMU0UpOwogCi0JcFVuZG9JdGVtLT5TZXRGaXJzdChGQUxTRSk7Ci0JcFVuZG9JdGVtLT5TZXRMYXN0KEZBTFNFKTsKKyAgbV9JdGVtcy5BZGQocFVuZG9JdGVtKTsKIAotCW1fSXRlbXMuQWRkKHBVbmRvSXRlbSk7Ci0KLQlpZiAobV9zVGl0bGUuSXNFbXB0eSgpKQotCQltX3NUaXRsZSA9IHBVbmRvSXRlbS0+R2V0VW5kb1RpdGxlKCk7CisgIGlmIChtX3NUaXRsZS5Jc0VtcHR5KCkpCisgICAgbV9zVGl0bGUgPSBwVW5kb0l0ZW0tPkdldFVuZG9UaXRsZSgpOwogfQogCi12b2lkIENGWF9FZGl0X0dyb3VwVW5kb0l0ZW06OlVwZGF0ZUl0ZW1zKCkKLXsKLQlpZiAobV9JdGVtcy5HZXRTaXplKCkgPiAwKQotCXsKLQkJQ0ZYX0VkaXRfVW5kb0l0ZW0qIHBGaXJzdEl0ZW0gPSBtX0l0ZW1zWzBdOwotCQlBU1NFUlQocEZpcnN0SXRlbSAhPSBOVUxMKTsKLQkJcEZpcnN0SXRlbS0+U2V0Rmlyc3QoVFJVRSk7Cit2b2lkIENGWF9FZGl0X0dyb3VwVW5kb0l0ZW06OlVwZGF0ZUl0ZW1zKCkgeworICBpZiAobV9JdGVtcy5HZXRTaXplKCkgPiAwKSB7CisgICAgQ0ZYX0VkaXRfVW5kb0l0ZW0qIHBGaXJzdEl0ZW0gPSBtX0l0ZW1zWzBdOworICAgIHBGaXJzdEl0ZW0tPlNldEZpcnN0KFRSVUUpOwogCi0JCUNGWF9FZGl0X1VuZG9JdGVtKiBwTGFzdEl0ZW0gPSBtX0l0ZW1zW21fSXRlbXMuR2V0U2l6ZSgpIC0gMV07Ci0JCUFTU0VSVChwTGFzdEl0ZW0gIT0gTlVMTCk7Ci0JCXBMYXN0SXRlbS0+U2V0TGFzdChUUlVFKTsKLQl9CisgICAgQ0ZYX0VkaXRfVW5kb0l0ZW0qIHBMYXN0SXRlbSA9IG1fSXRlbXNbbV9JdGVtcy5HZXRTaXplKCkgLSAxXTsKKyAgICBwTGFzdEl0ZW0tPlNldExhc3QoVFJVRSk7CisgIH0KIH0KIAotdm9pZCBDRlhfRWRpdF9Hcm91cFVuZG9JdGVtOjpVbmRvKCkKLXsKLQlmb3IgKGludCBpPW1fSXRlbXMuR2V0U2l6ZSgpLTE7IGk+PTA7IGktLSkKLQl7Ci0JCUNGWF9FZGl0X1VuZG9JdGVtKiBwVW5kb0l0ZW0gPSBtX0l0ZW1zW2ldOwotCQlBU1NFUlQocFVuZG9JdGVtICE9IE5VTEwpOwotCi0JCXBVbmRvSXRlbS0+VW5kbygpOwotCX0KK3ZvaWQgQ0ZYX0VkaXRfR3JvdXBVbmRvSXRlbTo6VW5kbygpIHsKKyAgZm9yIChpbnQgaSA9IG1fSXRlbXMuR2V0U2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBDRlhfRWRpdF9VbmRvSXRlbSogcFVuZG9JdGVtID0gbV9JdGVtc1tpXTsKKyAgICBwVW5kb0l0ZW0tPlVuZG8oKTsKKyAgfQogfQogCi12b2lkIENGWF9FZGl0X0dyb3VwVW5kb0l0ZW06OlJlZG8oKQotewotCWZvciAoaW50IGk9MCxzej1tX0l0ZW1zLkdldFNpemUoKTsgaTxzejsgaSsrKQotCXsKLQkJQ0ZYX0VkaXRfVW5kb0l0ZW0qIHBVbmRvSXRlbSA9IG1fSXRlbXNbaV07Ci0JCUFTU0VSVChwVW5kb0l0ZW0gIT0gTlVMTCk7Ci0KLQkJcFVuZG9JdGVtLT5SZWRvKCk7Ci0JfQordm9pZCBDRlhfRWRpdF9Hcm91cFVuZG9JdGVtOjpSZWRvKCkgeworICBmb3IgKGludCBpID0gMCwgc3ogPSBtX0l0ZW1zLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBDRlhfRWRpdF9VbmRvSXRlbSogcFVuZG9JdGVtID0gbV9JdGVtc1tpXTsKKyAgICBwVW5kb0l0ZW0tPlJlZG8oKTsKKyAgfQogfQogCi1DRlhfV2lkZVN0cmluZyBDRlhfRWRpdF9Hcm91cFVuZG9JdGVtOjpHZXRVbmRvVGl0bGUoKQotewotCXJldHVybiBtX3NUaXRsZTsKK0NGWF9XaWRlU3RyaW5nIENGWF9FZGl0X0dyb3VwVW5kb0l0ZW06OkdldFVuZG9UaXRsZSgpIHsKKyAgcmV0dXJuIG1fc1RpdGxlOwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGWF9FZGl0X1VuZG9JdGVtIGRlcml2ZWQgY2xhc3NlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLUNGWEVVX0luc2VydFdvcmQ6OkNGWEVVX0luc2VydFdvcmQoQ0ZYX0VkaXQgKiBwRWRpdCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cE9sZFBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwTmV3UGxhY2UsCi0JCQkJCQkJCSBGWF9XT1JEIHdvcmQsIEZYX0lOVDMyIGNoYXJzZXQsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcykgCi0JOiBtX3BFZGl0KHBFZGl0KSwgbV93cE9sZCh3cE9sZFBsYWNlKSwgbV93cE5ldyh3cE5ld1BsYWNlKSwgbV9Xb3JkKHdvcmQpLCBtX25DaGFyc2V0KGNoYXJzZXQpLCBtX1dvcmRQcm9wcygpCi17Ci0JaWYgKHBXb3JkUHJvcHMpCi0JCW1fV29yZFByb3BzID0gKnBXb3JkUHJvcHM7CitDRlhFVV9JbnNlcnRXb3JkOjpDRlhFVV9JbnNlcnRXb3JkKENGWF9FZGl0KiBwRWRpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwT2xkUGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cE5ld1BsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMpCisgICAgOiBtX3BFZGl0KHBFZGl0KSwKKyAgICAgIG1fd3BPbGQod3BPbGRQbGFjZSksCisgICAgICBtX3dwTmV3KHdwTmV3UGxhY2UpLAorICAgICAgbV9Xb3JkKHdvcmQpLAorICAgICAgbV9uQ2hhcnNldChjaGFyc2V0KSwKKyAgICAgIG1fV29yZFByb3BzKCkgeworICBpZiAocFdvcmRQcm9wcykKKyAgICBtX1dvcmRQcm9wcyA9ICpwV29yZFByb3BzOwogfQogCi1DRlhFVV9JbnNlcnRXb3JkOjp+Q0ZYRVVfSW5zZXJ0V29yZCgpCi17Ci19CitDRlhFVV9JbnNlcnRXb3JkOjp+Q0ZYRVVfSW5zZXJ0V29yZCgpIHt9CiAKLXZvaWQgQ0ZYRVVfSW5zZXJ0V29yZDo6UmVkbygpCi17Ci0JaWYgKG1fcEVkaXQpCi0JewotCQltX3BFZGl0LT5TZWxlY3ROb25lKCk7Ci0JCW1fcEVkaXQtPlNldENhcmV0KG1fd3BPbGQpOwkJCi0JCW1fcEVkaXQtPkluc2VydFdvcmQobV9Xb3JkLG1fbkNoYXJzZXQsJm1fV29yZFByb3BzLEZBTFNFLFRSVUUpOwotCX0KK3ZvaWQgQ0ZYRVVfSW5zZXJ0V29yZDo6UmVkbygpIHsKKyAgaWYgKG1fcEVkaXQpIHsKKyAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CisgICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE9sZCk7CisgICAgbV9wRWRpdC0+SW5zZXJ0V29yZChtX1dvcmQsIG1fbkNoYXJzZXQsICZtX1dvcmRQcm9wcywgRkFMU0UsIFRSVUUpOworICB9CiB9CiAKLXZvaWQgQ0ZYRVVfSW5zZXJ0V29yZDo6VW5kbygpCi17Ci0JaWYgKG1fcEVkaXQpCi0JewotCQltX3BFZGl0LT5TZWxlY3ROb25lKCk7Ci0JCW1fcEVkaXQtPlNldENhcmV0KG1fd3BOZXcpOwotCQltX3BFZGl0LT5CYWNrc3BhY2UoRkFMU0UsVFJVRSk7Ci0JfQordm9pZCBDRlhFVV9JbnNlcnRXb3JkOjpVbmRvKCkgeworICBpZiAobV9wRWRpdCkgeworICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKKyAgICBtX3BFZGl0LT5TZXRDYXJldChtX3dwTmV3KTsKKyAgICBtX3BFZGl0LT5CYWNrc3BhY2UoRkFMU0UsIFRSVUUpOworICB9CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLUNGWEVVX0luc2VydFJldHVybjo6Q0ZYRVVfSW5zZXJ0UmV0dXJuKENGWF9FZGl0ICogcEVkaXQsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BPbGRQbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cE5ld1BsYWNlLAotCQkJIGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcykgOgotCQkJbV9wRWRpdChwRWRpdCksCi0JCQltX3dwT2xkKHdwT2xkUGxhY2UpLAotCQkJbV93cE5ldyh3cE5ld1BsYWNlKSwKLQkJCW1fU2VjUHJvcHMoKSwKLQkJCW1fV29yZFByb3BzKCkJCQkJCQkJCQkgCi17Ci0JaWYgKHBTZWNQcm9wcykKLQkJbV9TZWNQcm9wcyA9ICpwU2VjUHJvcHM7Ci0JaWYgKHBXb3JkUHJvcHMpCi0JCW1fV29yZFByb3BzID0gKnBXb3JkUHJvcHM7CitDRlhFVV9JbnNlcnRSZXR1cm46OkNGWEVVX0luc2VydFJldHVybihDRlhfRWRpdCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BPbGRQbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cE5ld1BsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMpCisgICAgOiBtX3BFZGl0KHBFZGl0KSwKKyAgICAgIG1fd3BPbGQod3BPbGRQbGFjZSksCisgICAgICBtX3dwTmV3KHdwTmV3UGxhY2UpLAorICAgICAgbV9TZWNQcm9wcygpLAorICAgICAgbV9Xb3JkUHJvcHMoKSB7CisgIGlmIChwU2VjUHJvcHMpCisgICAgbV9TZWNQcm9wcyA9ICpwU2VjUHJvcHM7CisgIGlmIChwV29yZFByb3BzKQorICAgIG1fV29yZFByb3BzID0gKnBXb3JkUHJvcHM7CiB9CiAKLUNGWEVVX0luc2VydFJldHVybjo6fkNGWEVVX0luc2VydFJldHVybigpCi17Ci19CitDRlhFVV9JbnNlcnRSZXR1cm46On5DRlhFVV9JbnNlcnRSZXR1cm4oKSB7fQogCi12b2lkIENGWEVVX0luc2VydFJldHVybjo6UmVkbygpCi17Ci0JaWYgKG1fcEVkaXQpCi0JewotCQltX3BFZGl0LT5TZWxlY3ROb25lKCk7Ci0JCW1fcEVkaXQtPlNldENhcmV0KG1fd3BPbGQpOwotCQltX3BFZGl0LT5JbnNlcnRSZXR1cm4oJm1fU2VjUHJvcHMsJm1fV29yZFByb3BzLEZBTFNFLFRSVUUpOwotCX0KK3ZvaWQgQ0ZYRVVfSW5zZXJ0UmV0dXJuOjpSZWRvKCkgeworICBpZiAobV9wRWRpdCkgeworICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKKyAgICBtX3BFZGl0LT5TZXRDYXJldChtX3dwT2xkKTsKKyAgICBtX3BFZGl0LT5JbnNlcnRSZXR1cm4oJm1fU2VjUHJvcHMsICZtX1dvcmRQcm9wcywgRkFMU0UsIFRSVUUpOworICB9CiB9CiAKLXZvaWQgQ0ZYRVVfSW5zZXJ0UmV0dXJuOjpVbmRvKCkKLXsKLQlpZiAobV9wRWRpdCkKLQl7Ci0JCW1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKLQkJbV9wRWRpdC0+U2V0Q2FyZXQobV93cE5ldyk7Ci0JCW1fcEVkaXQtPkJhY2tzcGFjZShGQUxTRSxUUlVFKTsKLQl9Cit2b2lkIENGWEVVX0luc2VydFJldHVybjo6VW5kbygpIHsKKyAgaWYgKG1fcEVkaXQpIHsKKyAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CisgICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE5ldyk7CisgICAgbV9wRWRpdC0+QmFja3NwYWNlKEZBTFNFLCBUUlVFKTsKKyAgfQogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLy9DRlhFVV9CYWNrc3BhY2UKK0NGWEVVX0JhY2tzcGFjZTo6Q0ZYRVVfQmFja3NwYWNlKENGWF9FZGl0KiBwRWRpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cE9sZFBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwTmV3UGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzJiBTZWNQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzJiBXb3JkUHJvcHMpCisgICAgOiBtX3BFZGl0KHBFZGl0KSwKKyAgICAgIG1fd3BPbGQod3BPbGRQbGFjZSksCisgICAgICBtX3dwTmV3KHdwTmV3UGxhY2UpLAorICAgICAgbV9Xb3JkKHdvcmQpLAorICAgICAgbV9uQ2hhcnNldChjaGFyc2V0KSwKKyAgICAgIG1fU2VjUHJvcHMoU2VjUHJvcHMpLAorICAgICAgbV9Xb3JkUHJvcHMoV29yZFByb3BzKSB7fQogCi1DRlhFVV9CYWNrc3BhY2U6OkNGWEVVX0JhY2tzcGFjZShDRlhfRWRpdCAqIHBFZGl0LCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwT2xkUGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BOZXdQbGFjZSwKLQkJCQkJCQkgICBGWF9XT1JEIHdvcmQsIEZYX0lOVDMyIGNoYXJzZXQsCi0JCQkJCQkJICAgY29uc3QgQ1BWVF9TZWNQcm9wcyAmIFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAmIFdvcmRQcm9wcykgOgotCQkJbV9wRWRpdChwRWRpdCksCi0JCQltX3dwT2xkKHdwT2xkUGxhY2UpLAotCQkJbV93cE5ldyh3cE5ld1BsYWNlKSwKLQkJCW1fV29yZCh3b3JkKSwKLQkJCW1fbkNoYXJzZXQoY2hhcnNldCksCi0JCQltX1NlY1Byb3BzKFNlY1Byb3BzKSwKLQkJCW1fV29yZFByb3BzKFdvcmRQcm9wcykJCQkJCQkJCQkgCi17Ci19CitDRlhFVV9CYWNrc3BhY2U6On5DRlhFVV9CYWNrc3BhY2UoKSB7fQogCi1DRlhFVV9CYWNrc3BhY2U6On5DRlhFVV9CYWNrc3BhY2UoKQotewordm9pZCBDRlhFVV9CYWNrc3BhY2U6OlJlZG8oKSB7CisgIGlmIChtX3BFZGl0KSB7CisgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOworICAgIG1fcEVkaXQtPlNldENhcmV0KG1fd3BPbGQpOworICAgIG1fcEVkaXQtPkJhY2tzcGFjZShGQUxTRSwgVFJVRSk7CisgIH0KIH0KIAotdm9pZCBDRlhFVV9CYWNrc3BhY2U6OlJlZG8oKQotewotCWlmIChtX3BFZGl0KQotCXsKLQkJbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwotCQltX3BFZGl0LT5TZXRDYXJldChtX3dwT2xkKTsKLQkJbV9wRWRpdC0+QmFja3NwYWNlKEZBTFNFLFRSVUUpOwotCX0KK3ZvaWQgQ0ZYRVVfQmFja3NwYWNlOjpVbmRvKCkgeworICBpZiAobV9wRWRpdCkgeworICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKKyAgICBtX3BFZGl0LT5TZXRDYXJldChtX3dwTmV3KTsKKyAgICBpZiAobV93cE5ldy5TZWNDbXAobV93cE9sZCkgIT0gMCkgeworICAgICAgbV9wRWRpdC0+SW5zZXJ0UmV0dXJuKCZtX1NlY1Byb3BzLCAmbV9Xb3JkUHJvcHMsIEZBTFNFLCBUUlVFKTsKKyAgICB9IGVsc2UgeworICAgICAgbV9wRWRpdC0+SW5zZXJ0V29yZChtX1dvcmQsIG1fbkNoYXJzZXQsICZtX1dvcmRQcm9wcywgRkFMU0UsIFRSVUUpOworICAgIH0KKyAgfQogfQogCi12b2lkIENGWEVVX0JhY2tzcGFjZTo6VW5kbygpCi17Ci0JaWYgKG1fcEVkaXQpCi0JewotCQltX3BFZGl0LT5TZWxlY3ROb25lKCk7Ci0JCW1fcEVkaXQtPlNldENhcmV0KG1fd3BOZXcpOwotCQlpZiAobV93cE5ldy5TZWNDbXAobV93cE9sZCkgIT0gMCkKLQkJewotCQkJbV9wRWRpdC0+SW5zZXJ0UmV0dXJuKCZtX1NlY1Byb3BzLCZtX1dvcmRQcm9wcyxGQUxTRSxUUlVFKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCW1fcEVkaXQtPkluc2VydFdvcmQobV9Xb3JkLG1fbkNoYXJzZXQsJm1fV29yZFByb3BzLEZBTFNFLFRSVUUpOwotCQl9Ci0JfQotfQorQ0ZYRVVfRGVsZXRlOjpDRlhFVV9EZWxldGUoQ0ZYX0VkaXQqIHBFZGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwT2xkUGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BOZXdQbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMmIFNlY1Byb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMmIFdvcmRQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNlY0VuZCkKKyAgICA6IG1fcEVkaXQocEVkaXQpLAorICAgICAgbV93cE9sZCh3cE9sZFBsYWNlKSwKKyAgICAgIG1fd3BOZXcod3BOZXdQbGFjZSksCisgICAgICBtX1dvcmQod29yZCksCisgICAgICBtX25DaGFyc2V0KGNoYXJzZXQpLAorICAgICAgbV9TZWNQcm9wcyhTZWNQcm9wcyksCisgICAgICBtX1dvcmRQcm9wcyhXb3JkUHJvcHMpLAorICAgICAgbV9iU2VjRW5kKGJTZWNFbmQpIHt9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vL0NGWEVVX0RlbGV0ZQorQ0ZYRVVfRGVsZXRlOjp+Q0ZYRVVfRGVsZXRlKCkge30KIAotQ0ZYRVVfRGVsZXRlOjpDRlhFVV9EZWxldGUoQ0ZYX0VkaXQgKiBwRWRpdCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cE9sZFBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwTmV3UGxhY2UsCi0JCQkJCQkJICAgRlhfV09SRCB3b3JkLCBGWF9JTlQzMiBjaGFyc2V0LAotCQkJCQkJCSAgIGNvbnN0IENQVlRfU2VjUHJvcHMgJiBTZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgJiBXb3JkUHJvcHMsIEZYX0JPT0wgYlNlY0VuZCkgOgotCQkJbV9wRWRpdChwRWRpdCksCi0JCQltX3dwT2xkKHdwT2xkUGxhY2UpLAotCQkJbV93cE5ldyh3cE5ld1BsYWNlKSwKLQkJCW1fV29yZCh3b3JkKSwKLQkJCW1fbkNoYXJzZXQoY2hhcnNldCksCi0JCQltX1NlY1Byb3BzKFNlY1Byb3BzKSwKLQkJCW1fV29yZFByb3BzKFdvcmRQcm9wcyksCi0JCQltX2JTZWNFbmQoYlNlY0VuZCkKLXsKK3ZvaWQgQ0ZYRVVfRGVsZXRlOjpSZWRvKCkgeworICBpZiAobV9wRWRpdCkgeworICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKKyAgICBtX3BFZGl0LT5TZXRDYXJldChtX3dwT2xkKTsKKyAgICBtX3BFZGl0LT5EZWxldGUoRkFMU0UsIFRSVUUpOworICB9CiB9CiAKLUNGWEVVX0RlbGV0ZTo6fkNGWEVVX0RlbGV0ZSgpCi17Cit2b2lkIENGWEVVX0RlbGV0ZTo6VW5kbygpIHsKKyAgaWYgKG1fcEVkaXQpIHsKKyAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CisgICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE5ldyk7CisgICAgaWYgKG1fYlNlY0VuZCkgeworICAgICAgbV9wRWRpdC0+SW5zZXJ0UmV0dXJuKCZtX1NlY1Byb3BzLCAmbV9Xb3JkUHJvcHMsIEZBTFNFLCBUUlVFKTsKKyAgICB9IGVsc2UgeworICAgICAgbV9wRWRpdC0+SW5zZXJ0V29yZChtX1dvcmQsIG1fbkNoYXJzZXQsICZtX1dvcmRQcm9wcywgRkFMU0UsIFRSVUUpOworICAgIH0KKyAgfQogfQogCi12b2lkIENGWEVVX0RlbGV0ZTo6UmVkbygpCi17Ci0JaWYgKG1fcEVkaXQpCi0JewotCQltX3BFZGl0LT5TZWxlY3ROb25lKCk7Ci0JCW1fcEVkaXQtPlNldENhcmV0KG1fd3BPbGQpOwotCQltX3BFZGl0LT5EZWxldGUoRkFMU0UsVFJVRSk7Ci0JfQotfQorQ0ZYRVVfQ2xlYXI6OkNGWEVVX0NsZWFyKENGWF9FZGl0KiBwRWRpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3JTZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3VGV4dCkKKyAgICA6IG1fcEVkaXQocEVkaXQpLCBtX3dyU2VsKHdyU2VsKSwgbV9zd1RleHQoc3dUZXh0KSB7fQogCi12b2lkIENGWEVVX0RlbGV0ZTo6VW5kbygpCi17Ci0JaWYgKG1fcEVkaXQpCi0JewotCQltX3BFZGl0LT5TZWxlY3ROb25lKCk7Ci0JCW1fcEVkaXQtPlNldENhcmV0KG1fd3BOZXcpOwotCQlpZiAobV9iU2VjRW5kKQotCQl7Ci0JCQltX3BFZGl0LT5JbnNlcnRSZXR1cm4oJm1fU2VjUHJvcHMsJm1fV29yZFByb3BzLEZBTFNFLFRSVUUpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJbV9wRWRpdC0+SW5zZXJ0V29yZChtX1dvcmQsbV9uQ2hhcnNldCwmbV9Xb3JkUHJvcHMsRkFMU0UsVFJVRSk7Ci0JCX0KLQl9Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vL0NGWEVVX0NsZWFyCi0KLUNGWEVVX0NsZWFyOjpDRlhFVV9DbGVhcihDRlhfRWRpdCAqIHBFZGl0LCAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3clNlbCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiBzd1RleHQpIDoKLQkJCW1fcEVkaXQocEVkaXQpLAotCQkJbV93clNlbCh3clNlbCksCi0JCQltX3N3VGV4dChzd1RleHQpCi17Ci19Ci0KLUNGWEVVX0NsZWFyOjp+Q0ZYRVVfQ2xlYXIoKQotewotfQorQ0ZYRVVfQ2xlYXI6On5DRlhFVV9DbGVhcigpIHt9CiAKLXZvaWQgQ0ZYRVVfQ2xlYXI6OlJlZG8oKQotewotCWlmIChtX3BFZGl0KQotCXsKLQkJbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwotCQltX3BFZGl0LT5TZXRTZWwobV93clNlbC5CZWdpblBvcyxtX3dyU2VsLkVuZFBvcyk7Ci0JCW1fcEVkaXQtPkNsZWFyKEZBTFNFLFRSVUUpOwotCX0KK3ZvaWQgQ0ZYRVVfQ2xlYXI6OlJlZG8oKSB7CisgIGlmIChtX3BFZGl0KSB7CisgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOworICAgIG1fcEVkaXQtPlNldFNlbChtX3dyU2VsLkJlZ2luUG9zLCBtX3dyU2VsLkVuZFBvcyk7CisgICAgbV9wRWRpdC0+Q2xlYXIoRkFMU0UsIFRSVUUpOworICB9CiB9CiAKLXZvaWQgQ0ZYRVVfQ2xlYXI6OlVuZG8oKQotewotCWlmIChtX3BFZGl0KQotCXsKLQkJbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwotCQltX3BFZGl0LT5TZXRDYXJldChtX3dyU2VsLkJlZ2luUG9zKTsKLQkJbV9wRWRpdC0+SW5zZXJ0VGV4dChtX3N3VGV4dC5jX3N0cigpLCBERUZBVUxUX0NIQVJTRVQsIE5VTEwsIE5VTEwsIEZBTFNFLCBUUlVFKTsKLQkJbV9wRWRpdC0+U2V0U2VsKG1fd3JTZWwuQmVnaW5Qb3MsbV93clNlbC5FbmRQb3MpOwotCX0KK3ZvaWQgQ0ZYRVVfQ2xlYXI6OlVuZG8oKSB7CisgIGlmIChtX3BFZGl0KSB7CisgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOworICAgIG1fcEVkaXQtPlNldENhcmV0KG1fd3JTZWwuQmVnaW5Qb3MpOworICAgIG1fcEVkaXQtPkluc2VydFRleHQobV9zd1RleHQuY19zdHIoKSwgREVGQVVMVF9DSEFSU0VULCBOVUxMLCBOVUxMLCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpOworICAgIG1fcEVkaXQtPlNldFNlbChtX3dyU2VsLkJlZ2luUG9zLCBtX3dyU2VsLkVuZFBvcyk7CisgIH0KIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8vQ0ZYRVVfQ2xlYXJSaWNoCitDRlhFVV9DbGVhclJpY2g6OkNGWEVVX0NsZWFyUmljaChDRlhfRWRpdCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BPbGRQbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cE5ld1BsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyU2VsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyYgU2VjUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyYgV29yZFByb3BzKQorICAgIDogbV9wRWRpdChwRWRpdCksCisgICAgICBtX3dwT2xkKHdwT2xkUGxhY2UpLAorICAgICAgbV93cE5ldyh3cE5ld1BsYWNlKSwKKyAgICAgIG1fd3JTZWwod3JTZWwpLAorICAgICAgbV9Xb3JkKHdvcmQpLAorICAgICAgbV9uQ2hhcnNldChjaGFyc2V0KSwKKyAgICAgIG1fU2VjUHJvcHMoU2VjUHJvcHMpLAorICAgICAgbV9Xb3JkUHJvcHMoV29yZFByb3BzKSB7fQogCi1DRlhFVV9DbGVhclJpY2g6OkNGWEVVX0NsZWFyUmljaChDRlhfRWRpdCAqIHBFZGl0LCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwT2xkUGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgd3BOZXdQbGFjZSwKLQkJCQkJCQkgICBjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyU2VsLCBGWF9XT1JEIHdvcmQsIEZYX0lOVDMyIGNoYXJzZXQsCi0JCQkJCQkJICAgY29uc3QgQ1BWVF9TZWNQcm9wcyAmIFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAmIFdvcmRQcm9wcykgOgotCQkJbV9wRWRpdChwRWRpdCksCi0JCQltX3dwT2xkKHdwT2xkUGxhY2UpLAotCQkJbV93cE5ldyh3cE5ld1BsYWNlKSwKLQkJCW1fd3JTZWwod3JTZWwpLAotCQkJbV9Xb3JkKHdvcmQpLAotCQkJbV9uQ2hhcnNldChjaGFyc2V0KSwKLQkJCW1fU2VjUHJvcHMoU2VjUHJvcHMpLAotCQkJbV9Xb3JkUHJvcHMoV29yZFByb3BzKQkJCQkJCQkJCSAKLXsKLX0KLQotQ0ZYRVVfQ2xlYXJSaWNoOjp+Q0ZYRVVfQ2xlYXJSaWNoKCkKLXsKLX0KK0NGWEVVX0NsZWFyUmljaDo6fkNGWEVVX0NsZWFyUmljaCgpIHt9CiAKLXZvaWQgQ0ZYRVVfQ2xlYXJSaWNoOjpSZWRvKCkKLXsKLQlpZiAobV9wRWRpdCAmJiBJc0xhc3QoKSkKLQl7Ci0JCW1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKLQkJbV9wRWRpdC0+U2V0U2VsKG1fd3JTZWwuQmVnaW5Qb3MsbV93clNlbC5FbmRQb3MpOwotCQltX3BFZGl0LT5DbGVhcihGQUxTRSxUUlVFKTsKLQl9Cit2b2lkIENGWEVVX0NsZWFyUmljaDo6UmVkbygpIHsKKyAgaWYgKG1fcEVkaXQgJiYgSXNMYXN0KCkpIHsKKyAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CisgICAgbV9wRWRpdC0+U2V0U2VsKG1fd3JTZWwuQmVnaW5Qb3MsIG1fd3JTZWwuRW5kUG9zKTsKKyAgICBtX3BFZGl0LT5DbGVhcihGQUxTRSwgVFJVRSk7CisgIH0KIH0KIAotdm9pZCBDRlhFVV9DbGVhclJpY2g6OlVuZG8oKQotewotCWlmIChtX3BFZGl0KQotCXsKLQkJbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwotCQltX3BFZGl0LT5TZXRDYXJldChtX3dwT2xkKTsKLQkJaWYgKG1fd3BOZXcuU2VjQ21wKG1fd3BPbGQpICE9IDApCi0JCXsKLQkJCW1fcEVkaXQtPkluc2VydFJldHVybigmbV9TZWNQcm9wcywmbV9Xb3JkUHJvcHMsRkFMU0UsRkFMU0UpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJbV9wRWRpdC0+SW5zZXJ0V29yZChtX1dvcmQsbV9uQ2hhcnNldCwmbV9Xb3JkUHJvcHMsRkFMU0UsRkFMU0UpOwotCQl9Cit2b2lkIENGWEVVX0NsZWFyUmljaDo6VW5kbygpIHsKKyAgaWYgKG1fcEVkaXQpIHsKKyAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CisgICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE9sZCk7CisgICAgaWYgKG1fd3BOZXcuU2VjQ21wKG1fd3BPbGQpICE9IDApIHsKKyAgICAgIG1fcEVkaXQtPkluc2VydFJldHVybigmbV9TZWNQcm9wcywgJm1fV29yZFByb3BzLCBGQUxTRSwgRkFMU0UpOworICAgIH0gZWxzZSB7CisgICAgICBtX3BFZGl0LT5JbnNlcnRXb3JkKG1fV29yZCwgbV9uQ2hhcnNldCwgJm1fV29yZFByb3BzLCBGQUxTRSwgRkFMU0UpOworICAgIH0KIAotCQlpZiAoSXNGaXJzdCgpKQotCQl7Ci0JCQltX3BFZGl0LT5QYWludEluc2VydFRleHQobV93clNlbC5CZWdpblBvcyxtX3dyU2VsLkVuZFBvcyk7Ci0JCQltX3BFZGl0LT5TZXRTZWwobV93clNlbC5CZWdpblBvcyxtX3dyU2VsLkVuZFBvcyk7Ci0JCX0KLQl9CisgICAgaWYgKElzRmlyc3QoKSkgeworICAgICAgbV9wRWRpdC0+UGFpbnRJbnNlcnRUZXh0KG1fd3JTZWwuQmVnaW5Qb3MsIG1fd3JTZWwuRW5kUG9zKTsKKyAgICAgIG1fcEVkaXQtPlNldFNlbChtX3dyU2VsLkJlZ2luUG9zLCBtX3dyU2VsLkVuZFBvcyk7CisgICAgfQorICB9CiB9Ci0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLy9DRlhFVV9JbnNlcnRUZXh0Ci0KLUNGWEVVX0luc2VydFRleHQ6OkNGWEVVX0luc2VydFRleHQoQ0ZYX0VkaXQgKiBwRWRpdCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiB3cE9sZFBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwTmV3UGxhY2UsCi0JCQkJCQkJICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiBzd1RleHQsIEZYX0lOVDMyIGNoYXJzZXQsCi0JCQkJCQkJICAgY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzKSA6Ci0JCQltX3BFZGl0KHBFZGl0KSwKLQkJCW1fd3BPbGQod3BPbGRQbGFjZSksCi0JCQltX3dwTmV3KHdwTmV3UGxhY2UpLAotCQkJbV9zd1RleHQoc3dUZXh0KSwKLQkJCW1fbkNoYXJzZXQoY2hhcnNldCksCi0JCQltX1NlY1Byb3BzKCksCi0JCQltX1dvcmRQcm9wcygpCQkJCQkJCQkJIAotewotCWlmIChwU2VjUHJvcHMpCi0JCW1fU2VjUHJvcHMgPSAqcFNlY1Byb3BzOwotCWlmIChwV29yZFByb3BzKQotCQltX1dvcmRQcm9wcyA9ICpwV29yZFByb3BzOworQ0ZYRVVfSW5zZXJ0VGV4dDo6Q0ZYRVVfSW5zZXJ0VGV4dChDRlhfRWRpdCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cE9sZFBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BOZXdQbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3VGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzKQorICAgIDogbV9wRWRpdChwRWRpdCksCisgICAgICBtX3dwT2xkKHdwT2xkUGxhY2UpLAorICAgICAgbV93cE5ldyh3cE5ld1BsYWNlKSwKKyAgICAgIG1fc3dUZXh0KHN3VGV4dCksCisgICAgICBtX25DaGFyc2V0KGNoYXJzZXQpLAorICAgICAgbV9TZWNQcm9wcygpLAorICAgICAgbV9Xb3JkUHJvcHMoKSB7CisgIGlmIChwU2VjUHJvcHMpCisgICAgbV9TZWNQcm9wcyA9ICpwU2VjUHJvcHM7CisgIGlmIChwV29yZFByb3BzKQorICAgIG1fV29yZFByb3BzID0gKnBXb3JkUHJvcHM7CiB9CiAKLUNGWEVVX0luc2VydFRleHQ6On5DRlhFVV9JbnNlcnRUZXh0KCkKLXsKLX0KK0NGWEVVX0luc2VydFRleHQ6On5DRlhFVV9JbnNlcnRUZXh0KCkge30KIAotdm9pZCBDRlhFVV9JbnNlcnRUZXh0OjpSZWRvKCkKLXsKLQlpZiAobV9wRWRpdCAmJiBJc0xhc3QoKSkKLQl7Ci0JCW1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKLQkJbV9wRWRpdC0+U2V0Q2FyZXQobV93cE9sZCk7Ci0JCW1fcEVkaXQtPkluc2VydFRleHQobV9zd1RleHQuY19zdHIoKSwgbV9uQ2hhcnNldCwgJm1fU2VjUHJvcHMsICZtX1dvcmRQcm9wcywgRkFMU0UsIFRSVUUpOwotCX0KK3ZvaWQgQ0ZYRVVfSW5zZXJ0VGV4dDo6UmVkbygpIHsKKyAgaWYgKG1fcEVkaXQgJiYgSXNMYXN0KCkpIHsKKyAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CisgICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE9sZCk7CisgICAgbV9wRWRpdC0+SW5zZXJ0VGV4dChtX3N3VGV4dC5jX3N0cigpLCBtX25DaGFyc2V0LCAmbV9TZWNQcm9wcywgJm1fV29yZFByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIFRSVUUpOworICB9CiB9CiAKLXZvaWQgQ0ZYRVVfSW5zZXJ0VGV4dDo6VW5kbygpCi17Ci0JaWYgKG1fcEVkaXQpCi0JewotCQltX3BFZGl0LT5TZWxlY3ROb25lKCk7Ci0JCW1fcEVkaXQtPlNldFNlbChtX3dwT2xkLG1fd3BOZXcpOwotCQltX3BFZGl0LT5DbGVhcihGQUxTRSxUUlVFKTsKLQl9Cit2b2lkIENGWEVVX0luc2VydFRleHQ6OlVuZG8oKSB7CisgIGlmIChtX3BFZGl0KSB7CisgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOworICAgIG1fcEVkaXQtPlNldFNlbChtX3dwT2xkLCBtX3dwTmV3KTsKKyAgICBtX3BFZGl0LT5DbGVhcihGQUxTRSwgVFJVRSk7CisgIH0KIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK0NGWEVVX1NldFNlY1Byb3BzOjpDRlhFVV9TZXRTZWNQcm9wcyhDRlhfRWRpdCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVESVRfUFJPUFNfRSBlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzJiBvbGRzZWNwcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyYgb2xkd29yZHByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMmIG5ld3NlY3Byb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzJiBuZXd3b3JkcHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHJhbmdlKQorICAgIDogbV9wRWRpdChwRWRpdCksCisgICAgICBtX3dwUGxhY2UocGxhY2UpLAorICAgICAgbV93clBsYWNlKHJhbmdlKSwKKyAgICAgIG1fZVByb3BzKGVwKSwKKyAgICAgIG1fT2xkU2VjUHJvcHMob2xkc2VjcHJvcHMpLAorICAgICAgbV9OZXdTZWNQcm9wcyhuZXdzZWNwcm9wcyksCisgICAgICBtX09sZFdvcmRQcm9wcyhvbGR3b3JkcHJvcHMpLAorICAgICAgbV9OZXdXb3JkUHJvcHMobmV3d29yZHByb3BzKSB7fQogCi1DRlhFVV9TZXRTZWNQcm9wczo6Q0ZYRVVfU2V0U2VjUHJvcHMoQ0ZYX0VkaXQgKiBwRWRpdCwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSwgRURJVF9QUk9QU19FIGVwLCAKLQkJY29uc3QgQ1BWVF9TZWNQcm9wcyAmIG9sZHNlY3Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAmIG9sZHdvcmRwcm9wcywgCi0JCWNvbnN0IENQVlRfU2VjUHJvcHMgJiBuZXdzZWNwcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgJiBuZXd3b3JkcHJvcHMsIGNvbnN0IENQVlRfV29yZFJhbmdlICYgcmFuZ2UpCi0JCTogbV9wRWRpdChwRWRpdCksCi0JCW1fd3BQbGFjZShwbGFjZSksCi0JCW1fd3JQbGFjZShyYW5nZSksCi0JCW1fZVByb3BzKGVwKSwKLQkJbV9PbGRTZWNQcm9wcyhvbGRzZWNwcm9wcyksCi0JCW1fTmV3U2VjUHJvcHMobmV3c2VjcHJvcHMpLAotCQltX09sZFdvcmRQcm9wcyhvbGR3b3JkcHJvcHMpLAotCQltX05ld1dvcmRQcm9wcyhuZXd3b3JkcHJvcHMpCi17Ci19CitDRlhFVV9TZXRTZWNQcm9wczo6fkNGWEVVX1NldFNlY1Byb3BzKCkge30KIAotQ0ZYRVVfU2V0U2VjUHJvcHM6On5DRlhFVV9TZXRTZWNQcm9wcygpCi17Cit2b2lkIENGWEVVX1NldFNlY1Byb3BzOjpSZWRvKCkgeworICBpZiAobV9wRWRpdCkgeworICAgIG1fcEVkaXQtPlNldFNlY1Byb3BzKG1fZVByb3BzLCBtX3dwUGxhY2UsICZtX05ld1NlY1Byb3BzLCAmbV9OZXdXb3JkUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbV93clBsYWNlLCBGQUxTRSk7CisgICAgaWYgKElzTGFzdCgpKSB7CisgICAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CisgICAgICBtX3BFZGl0LT5QYWludFNldFByb3BzKG1fZVByb3BzLCBtX3dyUGxhY2UpOworICAgICAgbV9wRWRpdC0+U2V0U2VsKG1fd3JQbGFjZS5CZWdpblBvcywgbV93clBsYWNlLkVuZFBvcyk7CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ0ZYRVVfU2V0U2VjUHJvcHM6OlJlZG8oKQotewotCWlmIChtX3BFZGl0KQotCXsKLQkJbV9wRWRpdC0+U2V0U2VjUHJvcHMobV9lUHJvcHMsbV93cFBsYWNlLCZtX05ld1NlY1Byb3BzLCZtX05ld1dvcmRQcm9wcyxtX3dyUGxhY2UsRkFMU0UpOwotCQlpZiAoSXNMYXN0KCkpCi0JCXsKLQkJCW1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKLQkJCW1fcEVkaXQtPlBhaW50U2V0UHJvcHMobV9lUHJvcHMsbV93clBsYWNlKTsKLQkJCW1fcEVkaXQtPlNldFNlbChtX3dyUGxhY2UuQmVnaW5Qb3MsbV93clBsYWNlLkVuZFBvcyk7Ci0JCX0KLQl9Cit2b2lkIENGWEVVX1NldFNlY1Byb3BzOjpVbmRvKCkgeworICBpZiAobV9wRWRpdCkgeworICAgIG1fcEVkaXQtPlNldFNlY1Byb3BzKG1fZVByb3BzLCBtX3dwUGxhY2UsICZtX09sZFNlY1Byb3BzLCAmbV9PbGRXb3JkUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbV93clBsYWNlLCBGQUxTRSk7CisgICAgaWYgKElzRmlyc3QoKSkgeworICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOworICAgICAgbV9wRWRpdC0+UGFpbnRTZXRQcm9wcyhtX2VQcm9wcywgbV93clBsYWNlKTsKKyAgICAgIG1fcEVkaXQtPlNldFNlbChtX3dyUGxhY2UuQmVnaW5Qb3MsIG1fd3JQbGFjZS5FbmRQb3MpOworICAgIH0KKyAgfQogfQogCi12b2lkIENGWEVVX1NldFNlY1Byb3BzOjpVbmRvKCkKLXsKLQlpZiAobV9wRWRpdCkKLQl7Ci0JCW1fcEVkaXQtPlNldFNlY1Byb3BzKG1fZVByb3BzLG1fd3BQbGFjZSwmbV9PbGRTZWNQcm9wcywmbV9PbGRXb3JkUHJvcHMsbV93clBsYWNlLEZBTFNFKTsKLQkJaWYgKElzRmlyc3QoKSkKLQkJewotCQkJbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwotCQkJbV9wRWRpdC0+UGFpbnRTZXRQcm9wcyhtX2VQcm9wcyxtX3dyUGxhY2UpOwotCQkJbV9wRWRpdC0+U2V0U2VsKG1fd3JQbGFjZS5CZWdpblBvcyxtX3dyUGxhY2UuRW5kUG9zKTsKLQkJfQotCX0KLX0KK0NGWEVVX1NldFdvcmRQcm9wczo6Q0ZYRVVfU2V0V29yZFByb3BzKENGWF9FZGl0KiBwRWRpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVESVRfUFJPUFNfRSBlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzJiBvbGRwcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzJiBuZXdwcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlJiByYW5nZSkKKyAgICA6IG1fcEVkaXQocEVkaXQpLAorICAgICAgbV93cFBsYWNlKHBsYWNlKSwKKyAgICAgIG1fd3JQbGFjZShyYW5nZSksCisgICAgICBtX2VQcm9wcyhlcCksCisgICAgICBtX09sZFdvcmRQcm9wcyhvbGRwcm9wcyksCisgICAgICBtX05ld1dvcmRQcm9wcyhuZXdwcm9wcykge30KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK0NGWEVVX1NldFdvcmRQcm9wczo6fkNGWEVVX1NldFdvcmRQcm9wcygpIHt9CiAKLUNGWEVVX1NldFdvcmRQcm9wczo6Q0ZYRVVfU2V0V29yZFByb3BzKENGWF9FZGl0ICogcEVkaXQsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIEVESVRfUFJPUFNfRSBlcCwgCi0JCWNvbnN0IENQVlRfV29yZFByb3BzICYgb2xkcHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICYgbmV3cHJvcHMsIGNvbnN0IENQVlRfV29yZFJhbmdlICYgcmFuZ2UpCi0JCTogbV9wRWRpdChwRWRpdCksCi0JCW1fd3BQbGFjZShwbGFjZSksCi0JCW1fd3JQbGFjZShyYW5nZSksCi0JCW1fZVByb3BzKGVwKSwKLQkJbV9PbGRXb3JkUHJvcHMob2xkcHJvcHMpLAotCQltX05ld1dvcmRQcm9wcyhuZXdwcm9wcykKLXsKK3ZvaWQgQ0ZYRVVfU2V0V29yZFByb3BzOjpSZWRvKCkgeworICBpZiAobV9wRWRpdCkgeworICAgIG1fcEVkaXQtPlNldFdvcmRQcm9wcyhtX2VQcm9wcywgbV93cFBsYWNlLCAmbV9OZXdXb3JkUHJvcHMsIG1fd3JQbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOworICAgIGlmIChJc0xhc3QoKSkgeworICAgICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOworICAgICAgbV9wRWRpdC0+UGFpbnRTZXRQcm9wcyhtX2VQcm9wcywgbV93clBsYWNlKTsKKyAgICAgIG1fcEVkaXQtPlNldFNlbChtX3dyUGxhY2UuQmVnaW5Qb3MsIG1fd3JQbGFjZS5FbmRQb3MpOworICAgIH0KKyAgfQogfQogCi1DRlhFVV9TZXRXb3JkUHJvcHM6On5DRlhFVV9TZXRXb3JkUHJvcHMoKQotewotfQotCi12b2lkIENGWEVVX1NldFdvcmRQcm9wczo6UmVkbygpCi17Ci0JaWYgKG1fcEVkaXQpCi0JewotCQltX3BFZGl0LT5TZXRXb3JkUHJvcHMobV9lUHJvcHMsbV93cFBsYWNlLCZtX05ld1dvcmRQcm9wcyxtX3dyUGxhY2UsRkFMU0UpOwotCQlpZiAoSXNMYXN0KCkpCi0JCXsKLQkJCW1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKLQkJCW1fcEVkaXQtPlBhaW50U2V0UHJvcHMobV9lUHJvcHMsbV93clBsYWNlKTsKLQkJCW1fcEVkaXQtPlNldFNlbChtX3dyUGxhY2UuQmVnaW5Qb3MsbV93clBsYWNlLkVuZFBvcyk7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgQ0ZYRVVfU2V0V29yZFByb3BzOjpVbmRvKCkKLXsKLQlpZiAobV9wRWRpdCkKLQl7Ci0JCW1fcEVkaXQtPlNldFdvcmRQcm9wcyhtX2VQcm9wcyxtX3dwUGxhY2UsJm1fT2xkV29yZFByb3BzLG1fd3JQbGFjZSxGQUxTRSk7Ci0JCWlmIChJc0ZpcnN0KCkpCi0JCXsKLQkJCW1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKLQkJCW1fcEVkaXQtPlBhaW50U2V0UHJvcHMobV9lUHJvcHMsbV93clBsYWNlKTsKLQkJCW1fcEVkaXQtPlNldFNlbChtX3dyUGxhY2UuQmVnaW5Qb3MsbV93clBsYWNlLkVuZFBvcyk7Ci0JCX0KLQl9Cit2b2lkIENGWEVVX1NldFdvcmRQcm9wczo6VW5kbygpIHsKKyAgaWYgKG1fcEVkaXQpIHsKKyAgICBtX3BFZGl0LT5TZXRXb3JkUHJvcHMobV9lUHJvcHMsIG1fd3BQbGFjZSwgJm1fT2xkV29yZFByb3BzLCBtX3dyUGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsKKyAgICBpZiAoSXNGaXJzdCgpKSB7CisgICAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CisgICAgICBtX3BFZGl0LT5QYWludFNldFByb3BzKG1fZVByb3BzLCBtX3dyUGxhY2UpOworICAgICAgbV9wRWRpdC0+U2V0U2VsKG1fd3JQbGFjZS5CZWdpblBvcywgbV93clBsYWNlLkVuZFBvcyk7CisgICAgfQorICB9CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0ZYX0VkaXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1DRlhfRWRpdDo6Q0ZYX0VkaXQoSVBERl9WYXJpYWJsZVRleHQgKiBwVlQpIDoKLQltX3BWVChwVlQpLAotCW1fcE5vdGlmeShOVUxMKSwKLQltX3BPcHJOb3RpZnkoTlVMTCksCi0JbV9wVlRQcm92aWRlKE5VTEwpLAotCW1fd3BDYXJldCgtMSwtMSwtMSksCi0JbV93cE9sZENhcmV0KC0xLC0xLC0xKSwKLQltX1NlbFN0YXRlKCksCi0JbV9wdFNjcm9sbFBvcygwLDApLAotCW1fcHRSZWZyZXNoU2Nyb2xsUG9zKDAsMCksCi0JbV9iRW5hYmxlU2Nyb2xsKEZBTFNFKSwKLQltX3BJdGVyYXRvcihOVUxMKSwKLQltX3B0Q2FyZXQoMC4wZiwwLjBmKSwKLQltX1VuZG8oRlhfRURJVF9VTkRPX01BWElURU0pLAotCW1fbkFsaWdubWVudCgwKSwKLQltX2JOb3RpZnlGbGFnKEZBTFNFKSwKLQltX2JFbmFibGVPdmVyZmxvdyhGQUxTRSksCi0JbV9iRW5hYmxlUmVmcmVzaChUUlVFKSwKLQltX3JjT2xkQ29udGVudCgwLjBmLDAuMGYsMC4wZiwwLjBmKSwKLQltX2JFbmFibGVVbmRvKFRSVUUpLAotCW1fYk5vdGlmeShUUlVFKSwKLQltX2JPcHJOb3RpZnkoRkFMU0UpLAotCW1fcEdyb3VwVW5kb0l0ZW0oTlVMTCkKLXsJCi0JQVNTRVJUKHBWVCAhPSBOVUxMKTsKK0NGWF9FZGl0OjpDRlhfRWRpdChJUERGX1ZhcmlhYmxlVGV4dCogcFZUKQorICAgIDogbV9wVlQocFZUKSwKKyAgICAgIG1fcE5vdGlmeShOVUxMKSwKKyAgICAgIG1fcE9wck5vdGlmeShOVUxMKSwKKyAgICAgIG1fcFZUUHJvdmlkZShOVUxMKSwKKyAgICAgIG1fd3BDYXJldCgtMSwgLTEsIC0xKSwKKyAgICAgIG1fd3BPbGRDYXJldCgtMSwgLTEsIC0xKSwKKyAgICAgIG1fU2VsU3RhdGUoKSwKKyAgICAgIG1fcHRTY3JvbGxQb3MoMCwgMCksCisgICAgICBtX3B0UmVmcmVzaFNjcm9sbFBvcygwLCAwKSwKKyAgICAgIG1fYkVuYWJsZVNjcm9sbChGQUxTRSksCisgICAgICBtX3BJdGVyYXRvcihOVUxMKSwKKyAgICAgIG1fcHRDYXJldCgwLjBmLCAwLjBmKSwKKyAgICAgIG1fVW5kbyhGWF9FRElUX1VORE9fTUFYSVRFTSksCisgICAgICBtX25BbGlnbm1lbnQoMCksCisgICAgICBtX2JOb3RpZnlGbGFnKEZBTFNFKSwKKyAgICAgIG1fYkVuYWJsZU92ZXJmbG93KEZBTFNFKSwKKyAgICAgIG1fYkVuYWJsZVJlZnJlc2goVFJVRSksCisgICAgICBtX3JjT2xkQ29udGVudCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKSwKKyAgICAgIG1fYkVuYWJsZVVuZG8oVFJVRSksCisgICAgICBtX2JOb3RpZnkoVFJVRSksCisgICAgICBtX2JPcHJOb3RpZnkoRkFMU0UpLAorICAgICAgbV9wR3JvdXBVbmRvSXRlbShOVUxMKSB7CisgIEFTU0VSVChwVlQpOwogfQogCi1DRlhfRWRpdDo6fkNGWF9FZGl0KCkKLXsKLQlpZiAobV9wVlRQcm92aWRlKQotCXsKLQkJZGVsZXRlIG1fcFZUUHJvdmlkZTsKLQkJbV9wVlRQcm92aWRlID0gTlVMTDsKLQl9Ci0KLQlpZiAobV9wSXRlcmF0b3IpCi0JewotCQlkZWxldGUgbV9wSXRlcmF0b3I7Ci0JCW1fcEl0ZXJhdG9yID0gTlVMTDsKLQl9Ci0KLQlBU1NFUlQobV9wR3JvdXBVbmRvSXRlbSA9PSBOVUxMKTsKK0NGWF9FZGl0Ojp+Q0ZYX0VkaXQoKSB7CisgIGRlbGV0ZSBtX3BWVFByb3ZpZGU7CisgIG1fcFZUUHJvdmlkZSA9IE5VTEw7CisgIGRlbGV0ZSBtX3BJdGVyYXRvcjsKKyAgbV9wSXRlcmF0b3IgPSBOVUxMOworICBBU1NFUlQoIW1fcEdyb3VwVW5kb0l0ZW0pOwogfQogCi0vLyBwdWJsaWMgbWV0aG9kcwotCi12b2lkIENGWF9FZGl0OjpJbml0aWFsaXplKCkKLXsKLQltX3BWVC0+SW5pdGlhbGl6ZSgpOwotCVNldENhcmV0KG1fcFZULT5HZXRCZWdpbldvcmRQbGFjZSgpKTsKLQlTZXRDYXJldE9yaWdpbigpOwordm9pZCBDRlhfRWRpdDo6SW5pdGlhbGl6ZSgpIHsKKyAgbV9wVlQtPkluaXRpYWxpemUoKTsKKyAgU2V0Q2FyZXQobV9wVlQtPkdldEJlZ2luV29yZFBsYWNlKCkpOworICBTZXRDYXJldE9yaWdpbigpOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRGb250TWFwKElGWF9FZGl0X0ZvbnRNYXAgKiBwRm9udE1hcCkKLXsKLQlpZiAobV9wVlRQcm92aWRlKSAKLQkJZGVsZXRlIG1fcFZUUHJvdmlkZTsKLQotCW1fcFZULT5TZXRQcm92aWRlcihtX3BWVFByb3ZpZGUgPSBuZXcgQ0ZYX0VkaXRfUHJvdmlkZXIocEZvbnRNYXApKTsKK3ZvaWQgQ0ZYX0VkaXQ6OlNldEZvbnRNYXAoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXApIHsKKyAgZGVsZXRlIG1fcFZUUHJvdmlkZTsKKyAgbV9wVlQtPlNldFByb3ZpZGVyKG1fcFZUUHJvdmlkZSA9IG5ldyBDRlhfRWRpdF9Qcm92aWRlcihwRm9udE1hcCkpOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRWVFByb3ZpZGVyKElQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyKiBwUHJvdmlkZXIpCi17Ci0JbV9wVlQtPlNldFByb3ZpZGVyKHBQcm92aWRlcik7Cit2b2lkIENGWF9FZGl0OjpTZXRWVFByb3ZpZGVyKElQREZfVmFyaWFibGVUZXh0X1Byb3ZpZGVyKiBwUHJvdmlkZXIpIHsKKyAgbV9wVlQtPlNldFByb3ZpZGVyKHBQcm92aWRlcik7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldE5vdGlmeShJRlhfRWRpdF9Ob3RpZnkqIHBOb3RpZnkpCi17Ci0JbV9wTm90aWZ5ID0gcE5vdGlmeTsKK3ZvaWQgQ0ZYX0VkaXQ6OlNldE5vdGlmeShJRlhfRWRpdF9Ob3RpZnkqIHBOb3RpZnkpIHsKKyAgbV9wTm90aWZ5ID0gcE5vdGlmeTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0T3ByTm90aWZ5KElGWF9FZGl0X09wck5vdGlmeSogcE9wck5vdGlmeSkKLXsKLQltX3BPcHJOb3RpZnkgPSBwT3ByTm90aWZ5Owordm9pZCBDRlhfRWRpdDo6U2V0T3ByTm90aWZ5KElGWF9FZGl0X09wck5vdGlmeSogcE9wck5vdGlmeSkgeworICBtX3BPcHJOb3RpZnkgPSBwT3ByTm90aWZ5OwogfQogCi1JRlhfRWRpdF9JdGVyYXRvciAqIENGWF9FZGl0OjpHZXRJdGVyYXRvcigpCi17Ci0JaWYgKCFtX3BJdGVyYXRvcikKLQkJbV9wSXRlcmF0b3IgPSBuZXcgQ0ZYX0VkaXRfSXRlcmF0b3IodGhpcyxtX3BWVC0+R2V0SXRlcmF0b3IoKSk7CitJRlhfRWRpdF9JdGVyYXRvciogQ0ZYX0VkaXQ6OkdldEl0ZXJhdG9yKCkgeworICBpZiAoIW1fcEl0ZXJhdG9yKQorICAgIG1fcEl0ZXJhdG9yID0gbmV3IENGWF9FZGl0X0l0ZXJhdG9yKHRoaXMsIG1fcFZULT5HZXRJdGVyYXRvcigpKTsKIAotCXJldHVybiBtX3BJdGVyYXRvcjsKKyAgcmV0dXJuIG1fcEl0ZXJhdG9yOwogfQogCi1JUERGX1ZhcmlhYmxlVGV4dCAqCUNGWF9FZGl0OjpHZXRWYXJpYWJsZVRleHQoKQotewotCXJldHVybiBtX3BWVDsKK0lQREZfVmFyaWFibGVUZXh0KiBDRlhfRWRpdDo6R2V0VmFyaWFibGVUZXh0KCkgeworICByZXR1cm4gbV9wVlQ7CiB9CiAKLUlGWF9FZGl0X0ZvbnRNYXAqIENGWF9FZGl0OjpHZXRGb250TWFwKCkKLXsKLQlpZiAobV9wVlRQcm92aWRlKQotCQlyZXR1cm4gbV9wVlRQcm92aWRlLT5HZXRGb250TWFwKCk7CitJRlhfRWRpdF9Gb250TWFwKiBDRlhfRWRpdDo6R2V0Rm9udE1hcCgpIHsKKyAgaWYgKG1fcFZUUHJvdmlkZSkKKyAgICByZXR1cm4gbV9wVlRQcm92aWRlLT5HZXRGb250TWFwKCk7CiAKLQlyZXR1cm4gTlVMTDsKKyAgcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0LCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQotewkKLQltX3BWVC0+U2V0UGxhdGVSZWN0KHJlY3QpOwotCW1fcHRTY3JvbGxQb3MgPSBDUERGX1BvaW50KHJlY3QubGVmdCxyZWN0LnRvcCk7CQkJCi0JaWYgKGJQYWludCkgUGFpbnQoKTsKK3ZvaWQgQ0ZYX0VkaXQ6OlNldFBsYXRlUmVjdChjb25zdCBDUERGX1JlY3QmIHJlY3QsIEZYX0JPT0wgYlBhaW50KSB7CisgIG1fcFZULT5TZXRQbGF0ZVJlY3QocmVjdCk7CisgIG1fcHRTY3JvbGxQb3MgPSBDUERGX1BvaW50KHJlY3QubGVmdCwgcmVjdC50b3ApOworICBpZiAoYlBhaW50KQorICAgIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldEFsaWdubWVudEgoRlhfSU5UMzIgbkZvcm1hdC8qID0wICovLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQotewotCW1fcFZULT5TZXRBbGlnbm1lbnQobkZvcm1hdCk7Ci0JaWYgKGJQYWludCkgUGFpbnQoKTsKK3ZvaWQgQ0ZYX0VkaXQ6OlNldEFsaWdubWVudEgoaW50MzJfdCBuRm9ybWF0LCBGWF9CT09MIGJQYWludCkgeworICBtX3BWVC0+U2V0QWxpZ25tZW50KG5Gb3JtYXQpOworICBpZiAoYlBhaW50KQorICAgIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldEFsaWdubWVudFYoRlhfSU5UMzIgbkZvcm1hdC8qID0wICovLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQotewotCW1fbkFsaWdubWVudCA9IG5Gb3JtYXQ7Ci0JaWYgKGJQYWludCkgUGFpbnQoKTsKK3ZvaWQgQ0ZYX0VkaXQ6OlNldEFsaWdubWVudFYoaW50MzJfdCBuRm9ybWF0LCBGWF9CT09MIGJQYWludCkgeworICBtX25BbGlnbm1lbnQgPSBuRm9ybWF0OworICBpZiAoYlBhaW50KQorICAgIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldFBhc3N3b3JkQ2hhcihGWF9XT1JEIHdTdWJXb3JkLyogPScqJyAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKLXsKLQltX3BWVC0+U2V0UGFzc3dvcmRDaGFyKHdTdWJXb3JkKTsKLQlpZiAoYlBhaW50KSBQYWludCgpOwordm9pZCBDRlhfRWRpdDo6U2V0UGFzc3dvcmRDaGFyKEZYX1dPUkQgd1N1YldvcmQsIEZYX0JPT0wgYlBhaW50KSB7CisgIG1fcFZULT5TZXRQYXNzd29yZENoYXIod1N1YldvcmQpOworICBpZiAoYlBhaW50KQorICAgIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldExpbWl0Q2hhcihGWF9JTlQzMiBuTGltaXRDaGFyLyogPTAgKi8sIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCi17Ci0JbV9wVlQtPlNldExpbWl0Q2hhcihuTGltaXRDaGFyKTsKLQlpZiAoYlBhaW50KSBQYWludCgpOwordm9pZCBDRlhfRWRpdDo6U2V0TGltaXRDaGFyKGludDMyX3QgbkxpbWl0Q2hhciwgRlhfQk9PTCBiUGFpbnQpIHsKKyAgbV9wVlQtPlNldExpbWl0Q2hhcihuTGltaXRDaGFyKTsKKyAgaWYgKGJQYWludCkKKyAgICBQYWludCgpOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRDaGFyQXJyYXkoRlhfSU5UMzIgbkNoYXJBcnJheS8qID0wICovLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQotewotCW1fcFZULT5TZXRDaGFyQXJyYXkobkNoYXJBcnJheSk7Ci0JaWYgKGJQYWludCkgUGFpbnQoKTsKK3ZvaWQgQ0ZYX0VkaXQ6OlNldENoYXJBcnJheShpbnQzMl90IG5DaGFyQXJyYXksIEZYX0JPT0wgYlBhaW50KSB7CisgIG1fcFZULT5TZXRDaGFyQXJyYXkobkNoYXJBcnJheSk7CisgIGlmIChiUGFpbnQpCisgICAgUGFpbnQoKTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UvKiA9MC4wZiAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKLXsKLQltX3BWVC0+U2V0Q2hhclNwYWNlKGZDaGFyU3BhY2UpOwotCWlmIChiUGFpbnQpIFBhaW50KCk7Cit2b2lkIENGWF9FZGl0OjpTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSwgRlhfQk9PTCBiUGFpbnQpIHsKKyAgbV9wVlQtPlNldENoYXJTcGFjZShmQ2hhclNwYWNlKTsKKyAgaWYgKGJQYWludCkKKyAgICBQYWludCgpOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRIb3J6U2NhbGUoRlhfSU5UMzIgbkhvcnpTY2FsZS8qID0xMDAgKi8sIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCi17Ci0JbV9wVlQtPlNldEhvcnpTY2FsZShuSG9yelNjYWxlKTsKLQlpZiAoYlBhaW50KSBQYWludCgpOwordm9pZCBDRlhfRWRpdDo6U2V0SG9yelNjYWxlKGludDMyX3QgbkhvcnpTY2FsZSwgRlhfQk9PTCBiUGFpbnQpIHsKKyAgbV9wVlQtPlNldEhvcnpTY2FsZShuSG9yelNjYWxlKTsKKyAgaWYgKGJQYWludCkKKyAgICBQYWludCgpOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRNdWx0aUxpbmUoRlhfQk9PTCBiTXVsdGlMaW5lLyogPVRSVUUgKi8sIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCi17Ci0JbV9wVlQtPlNldE11bHRpTGluZShiTXVsdGlMaW5lKTsKLQlpZiAoYlBhaW50KSBQYWludCgpOwordm9pZCBDRlhfRWRpdDo6U2V0TXVsdGlMaW5lKEZYX0JPT0wgYk11bHRpTGluZSwgRlhfQk9PTCBiUGFpbnQpIHsKKyAgbV9wVlQtPlNldE11bHRpTGluZShiTXVsdGlMaW5lKTsKKyAgaWYgKGJQYWludCkKKyAgICBQYWludCgpOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRBdXRvUmV0dXJuKEZYX0JPT0wgYkF1dG8vKiA9VFJVRSAqLywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKLXsKLQltX3BWVC0+U2V0QXV0b1JldHVybihiQXV0byk7Ci0JaWYgKGJQYWludCkgUGFpbnQoKTsKK3ZvaWQgQ0ZYX0VkaXQ6OlNldEF1dG9SZXR1cm4oRlhfQk9PTCBiQXV0bywgRlhfQk9PTCBiUGFpbnQpIHsKKyAgbV9wVlQtPlNldEF1dG9SZXR1cm4oYkF1dG8pOworICBpZiAoYlBhaW50KQorICAgIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZy8qID1UUlVFICovLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQotewotCW1fcFZULT5TZXRMaW5lTGVhZGluZyhmTGluZUxlYWRpbmcpOwotCWlmIChiUGFpbnQpIFBhaW50KCk7Cit2b2lkIENGWF9FZGl0OjpTZXRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcsIEZYX0JPT0wgYlBhaW50KSB7CisgIG1fcFZULT5TZXRMaW5lTGVhZGluZyhmTGluZUxlYWRpbmcpOworICBpZiAoYlBhaW50KQorICAgIFBhaW50KCk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldEF1dG9Gb250U2l6ZShGWF9CT09MIGJBdXRvLyogPVRSVUUgKi8sIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCi17Ci0JbV9wVlQtPlNldEF1dG9Gb250U2l6ZShiQXV0byk7Ci0JaWYgKGJQYWludCkgUGFpbnQoKTsKK3ZvaWQgQ0ZYX0VkaXQ6OlNldEF1dG9Gb250U2l6ZShGWF9CT09MIGJBdXRvLCBGWF9CT09MIGJQYWludCkgeworICBtX3BWVC0+U2V0QXV0b0ZvbnRTaXplKGJBdXRvKTsKKyAgaWYgKGJQYWludCkKKyAgICBQYWludCgpOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUsIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCi17Ci0JbV9wVlQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7Ci0JaWYgKGJQYWludCkgUGFpbnQoKTsKK3ZvaWQgQ0ZYX0VkaXQ6OlNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSwgRlhfQk9PTCBiUGFpbnQpIHsKKyAgbV9wVlQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7CisgIGlmIChiUGFpbnQpCisgICAgUGFpbnQoKTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0QXV0b1Njcm9sbChGWF9CT09MIGJBdXRvLyogPVRSVUUgKi8sIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCi17Ci0JbV9iRW5hYmxlU2Nyb2xsID0gYkF1dG87Ci0JaWYgKGJQYWludCkgUGFpbnQoKTsKK3ZvaWQgQ0ZYX0VkaXQ6OlNldEF1dG9TY3JvbGwoRlhfQk9PTCBiQXV0bywgRlhfQk9PTCBiUGFpbnQpIHsKKyAgbV9iRW5hYmxlU2Nyb2xsID0gYkF1dG87CisgIGlmIChiUGFpbnQpCisgICAgUGFpbnQoKTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0VGV4dE92ZXJmbG93KEZYX0JPT0wgYkFsbG93ZWQgLyo9IEZBTFNFKi8sIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCi17Ci0JbV9iRW5hYmxlT3ZlcmZsb3cgPSBiQWxsb3dlZDsKLQlpZiAoYlBhaW50KSBQYWludCgpOwordm9pZCBDRlhfRWRpdDo6U2V0VGV4dE92ZXJmbG93KEZYX0JPT0wgYkFsbG93ZWQsIEZYX0JPT0wgYlBhaW50KSB7CisgIG1fYkVuYWJsZU92ZXJmbG93ID0gYkFsbG93ZWQ7CisgIGlmIChiUGFpbnQpCisgICAgUGFpbnQoKTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0U2VsKEZYX0lOVDMyIG5TdGFydENoYXIsRlhfSU5UMzIgbkVuZENoYXIpCi17Ci0JaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCi0JewotCQlpZiAoblN0YXJ0Q2hhciA9PSAwICYmIG5FbmRDaGFyIDwgMCkKLQkJewotCQkJU2VsZWN0QWxsKCk7Ci0JCX0KLQkJZWxzZSBpZiAoblN0YXJ0Q2hhciA8IDApCi0JCXsJCi0JCQl0aGlzLT5TZWxlY3ROb25lKCk7Ci0JCX0KLQkJZWxzZQotCQl7CQkKLQkJCWlmIChuU3RhcnRDaGFyIDwgbkVuZENoYXIpCi0JCQl7Ci0JCQkJU2V0U2VsKG1fcFZULT5Xb3JkSW5kZXhUb1dvcmRQbGFjZShuU3RhcnRDaGFyKSxtX3BWVC0+V29yZEluZGV4VG9Xb3JkUGxhY2UobkVuZENoYXIpKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlTZXRTZWwobV9wVlQtPldvcmRJbmRleFRvV29yZFBsYWNlKG5FbmRDaGFyKSxtX3BWVC0+V29yZEluZGV4VG9Xb3JkUGxhY2UoblN0YXJ0Q2hhcikpOwotCQkJfQotCQl9CQotCX0KK3ZvaWQgQ0ZYX0VkaXQ6OlNldFNlbChpbnQzMl90IG5TdGFydENoYXIsIGludDMyX3QgbkVuZENoYXIpIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBpZiAoblN0YXJ0Q2hhciA9PSAwICYmIG5FbmRDaGFyIDwgMCkgeworICAgICAgU2VsZWN0QWxsKCk7CisgICAgfSBlbHNlIGlmIChuU3RhcnRDaGFyIDwgMCkgeworICAgICAgU2VsZWN0Tm9uZSgpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoblN0YXJ0Q2hhciA8IG5FbmRDaGFyKSB7CisgICAgICAgIFNldFNlbChtX3BWVC0+V29yZEluZGV4VG9Xb3JkUGxhY2UoblN0YXJ0Q2hhciksCisgICAgICAgICAgICAgICBtX3BWVC0+V29yZEluZGV4VG9Xb3JkUGxhY2UobkVuZENoYXIpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFNldFNlbChtX3BWVC0+V29yZEluZGV4VG9Xb3JkUGxhY2UobkVuZENoYXIpLAorICAgICAgICAgICAgICAgbV9wVlQtPldvcmRJbmRleFRvV29yZFBsYWNlKG5TdGFydENoYXIpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0U2VsKGNvbnN0IENQVlRfV29yZFBsYWNlICYgYmVnaW4sY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBlbmQpCi17Ci0JaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCi0JewotCQlTZWxlY3ROb25lKCk7Cit2b2lkIENGWF9FZGl0OjpTZXRTZWwoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIGJlZ2luLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgZW5kKSB7CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7CisgICAgU2VsZWN0Tm9uZSgpOwogCi0JCW1fU2VsU3RhdGUuU2V0KGJlZ2luLGVuZCk7CisgICAgbV9TZWxTdGF0ZS5TZXQoYmVnaW4sIGVuZCk7CiAKLQkJU2V0Q2FyZXQobV9TZWxTdGF0ZS5FbmRQb3MpOworICAgIFNldENhcmV0KG1fU2VsU3RhdGUuRW5kUG9zKTsKIAotCQlpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpCi0JCXsKLQkJCVNjcm9sbFRvQ2FyZXQoKTsKLQkJCUNQVlRfV29yZFJhbmdlIHdyKG1fU2VsU3RhdGUuQmVnaW5Qb3MsbV9TZWxTdGF0ZS5FbmRQb3MpOwotCQkJUmVmcmVzaChSUF9PUFRJT05BTCwmd3IpOwotCQkJU2V0Q2FyZXRJbmZvKCk7Ci0JCX0KLQkJZWxzZQotCQl7CQkKLQkJCVNjcm9sbFRvQ2FyZXQoKTsKLQkJCVNldENhcmV0SW5mbygpOwotCQl9Ci0JfQorICAgIGlmIChtX1NlbFN0YXRlLklzRXhpc3QoKSkgeworICAgICAgU2Nyb2xsVG9DYXJldCgpOworICAgICAgQ1BWVF9Xb3JkUmFuZ2Ugd3IobV9TZWxTdGF0ZS5CZWdpblBvcywgbV9TZWxTdGF0ZS5FbmRQb3MpOworICAgICAgUmVmcmVzaChSUF9PUFRJT05BTCwgJndyKTsKKyAgICAgIFNldENhcmV0SW5mbygpOworICAgIH0gZWxzZSB7CisgICAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgICBTZXRDYXJldEluZm8oKTsKKyAgICB9CisgIH0KIH0KIAotdm9pZCBDRlhfRWRpdDo6R2V0U2VsKEZYX0lOVDMyICYgblN0YXJ0Q2hhciwgRlhfSU5UMzIgJiBuRW5kQ2hhcikgY29uc3QKLXsKLQluU3RhcnRDaGFyID0gLTE7Ci0JbkVuZENoYXIgPSAtMTsKK3ZvaWQgQ0ZYX0VkaXQ6OkdldFNlbChpbnQzMl90JiBuU3RhcnRDaGFyLCBpbnQzMl90JiBuRW5kQ2hhcikgY29uc3QgeworICBuU3RhcnRDaGFyID0gLTE7CisgIG5FbmRDaGFyID0gLTE7CiAKLQlpZiAobV9wVlQtPklzVmFsaWQoKSkKLQl7Ci0JCWlmIChtX1NlbFN0YXRlLklzRXhpc3QoKSkKLQkJewotCQkJaWYgKG1fU2VsU3RhdGUuQmVnaW5Qb3MuV29yZENtcChtX1NlbFN0YXRlLkVuZFBvcyk8MCkKLQkJCXsKLQkJCQluU3RhcnRDaGFyID0gbV9wVlQtPldvcmRQbGFjZVRvV29yZEluZGV4KG1fU2VsU3RhdGUuQmVnaW5Qb3MpOwotCQkJCW5FbmRDaGFyID0gbV9wVlQtPldvcmRQbGFjZVRvV29yZEluZGV4KG1fU2VsU3RhdGUuRW5kUG9zKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQluU3RhcnRDaGFyID0gbV9wVlQtPldvcmRQbGFjZVRvV29yZEluZGV4KG1fU2VsU3RhdGUuRW5kUG9zKTsKLQkJCQluRW5kQ2hhciA9IG1fcFZULT5Xb3JkUGxhY2VUb1dvcmRJbmRleChtX1NlbFN0YXRlLkJlZ2luUG9zKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCW5TdGFydENoYXIgPSBtX3BWVC0+V29yZFBsYWNlVG9Xb3JkSW5kZXgobV93cENhcmV0KTsKLQkJCW5FbmRDaGFyID0gbV9wVlQtPldvcmRQbGFjZVRvV29yZEluZGV4KG1fd3BDYXJldCk7Ci0JCX0KLQl9CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7CisgICAgaWYgKG1fU2VsU3RhdGUuSXNFeGlzdCgpKSB7CisgICAgICBpZiAobV9TZWxTdGF0ZS5CZWdpblBvcy5Xb3JkQ21wKG1fU2VsU3RhdGUuRW5kUG9zKSA8IDApIHsKKyAgICAgICAgblN0YXJ0Q2hhciA9IG1fcFZULT5Xb3JkUGxhY2VUb1dvcmRJbmRleChtX1NlbFN0YXRlLkJlZ2luUG9zKTsKKyAgICAgICAgbkVuZENoYXIgPSBtX3BWVC0+V29yZFBsYWNlVG9Xb3JkSW5kZXgobV9TZWxTdGF0ZS5FbmRQb3MpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgblN0YXJ0Q2hhciA9IG1fcFZULT5Xb3JkUGxhY2VUb1dvcmRJbmRleChtX1NlbFN0YXRlLkVuZFBvcyk7CisgICAgICAgIG5FbmRDaGFyID0gbV9wVlQtPldvcmRQbGFjZVRvV29yZEluZGV4KG1fU2VsU3RhdGUuQmVnaW5Qb3MpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBuU3RhcnRDaGFyID0gbV9wVlQtPldvcmRQbGFjZVRvV29yZEluZGV4KG1fd3BDYXJldCk7CisgICAgICBuRW5kQ2hhciA9IG1fcFZULT5Xb3JkUGxhY2VUb1dvcmRJbmRleChtX3dwQ2FyZXQpOworICAgIH0KKyAgfQogfQogCi1GWF9JTlQzMiBDRlhfRWRpdDo6R2V0Q2FyZXQoKSBjb25zdAotewotCWlmIChtX3BWVC0+SXNWYWxpZCgpKQotCQlyZXR1cm4gbV9wVlQtPldvcmRQbGFjZVRvV29yZEluZGV4KG1fd3BDYXJldCk7CitpbnQzMl90IENGWF9FZGl0OjpHZXRDYXJldCgpIGNvbnN0IHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCisgICAgcmV0dXJuIG1fcFZULT5Xb3JkUGxhY2VUb1dvcmRJbmRleChtX3dwQ2FyZXQpOwogCi0JcmV0dXJuIC0xOworICByZXR1cm4gLTE7CiB9CiAKLUNQVlRfV29yZFBsYWNlIENGWF9FZGl0OjpHZXRDYXJldFdvcmRQbGFjZSgpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fd3BDYXJldDsKK0NQVlRfV29yZFBsYWNlIENGWF9FZGl0OjpHZXRDYXJldFdvcmRQbGFjZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fd3BDYXJldDsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ0ZYX0VkaXQ6OkdldFRleHQoKSBjb25zdAotewotCUNGWF9XaWRlU3RyaW5nIHN3UmV0OworQ0ZYX1dpZGVTdHJpbmcgQ0ZYX0VkaXQ6OkdldFRleHQoKSBjb25zdCB7CisgIENGWF9XaWRlU3RyaW5nIHN3UmV0OwogCi0JaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCi0JewotCQlpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IgKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKSkKLQkJewotCQkJRlhfQk9PTCBiUmljaCA9IG1fcFZULT5Jc1JpY2hUZXh0KCk7CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7CisgICAgaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKSkgeworICAgICAgRlhfQk9PTCBiUmljaCA9IG1fcFZULT5Jc1JpY2hUZXh0KCk7CisKKyAgICAgIHBJdGVyYXRvci0+U2V0QXQoMCk7CiAKLQkJCXBJdGVyYXRvci0+U2V0QXQoMCk7CisgICAgICBDUFZUX1dvcmQgd29yZGluZm87CisgICAgICBDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKKyAgICAgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpIHsKKyAgICAgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7CiAKLQkJCUNQVlRfV29yZCB3b3JkaW5mbzsJCi0JCQlDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKLQkJCXdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpCi0JCQl7Ci0JCQkJQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7CisgICAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZGluZm8pKSB7CisgICAgICAgICAgaWYgKGJSaWNoKSB7CisgICAgICAgICAgICBzd1JldCArPSB3b3JkaW5mby5Xb3JkOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd1JldCArPSB3b3JkaW5mby5Xb3JkOworICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCQkJaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkaW5mbykpCi0JCQkJewotCQkJCQlpZiAoYlJpY2gpCi0JCQkJCXsKLQkJCQkJCXN3UmV0ICs9IHdvcmRpbmZvLldvcmQ7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlzd1JldCArPSB3b3JkaW5mby5Xb3JkOwotCQkJCQl9CQkJCQkKLQkJCQl9CisgICAgICAgIGlmIChvbGRwbGFjZS5TZWNDbXAocGxhY2UpICE9IDApIHsKKyAgICAgICAgICBzd1JldCArPSAweDBEOworICAgICAgICAgIHN3UmV0ICs9IDB4MEE7CisgICAgICAgIH0KIAotCQkJCWlmIChvbGRwbGFjZS5TZWNDbXAocGxhY2UpICE9IDApCi0JCQkJewotCQkJCQlzd1JldCArPSAweDBEOwotCQkJCQlzd1JldCArPSAweDBBOwotCQkJCX0KLQkJCQkKLQkJCQlvbGRwbGFjZSA9IHBsYWNlOwotCQkJfQotCQl9Ci0JfQorICAgICAgICBvbGRwbGFjZSA9IHBsYWNlOworICAgICAgfQorICAgIH0KKyAgfQogCi0JcmV0dXJuIHN3UmV0OworICByZXR1cm4gc3dSZXQ7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENGWF9FZGl0OjpHZXRSYW5nZVRleHQoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiByYW5nZSkgY29uc3QKLXsKLQlDRlhfV2lkZVN0cmluZyBzd1JldDsKK0NGWF9XaWRlU3RyaW5nIENGWF9FZGl0OjpHZXRSYW5nZVRleHQoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHJhbmdlKSBjb25zdCB7CisgIENGWF9XaWRlU3RyaW5nIHN3UmV0OwogCi0JaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCi0JewotCQlGWF9CT09MIGJSaWNoID0gbV9wVlQtPklzUmljaFRleHQoKTsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBGWF9CT09MIGJSaWNoID0gbV9wVlQtPklzUmljaFRleHQoKTsKIAotCQlpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IgKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKSkKLQkJewkJCQotCQkJQ1BWVF9Xb3JkUmFuZ2Ugd3JUZW1wID0gcmFuZ2U7Ci0JCQltX3BWVC0+VXBkYXRlV29yZFBsYWNlKHdyVGVtcC5CZWdpblBvcyk7Ci0JCQltX3BWVC0+VXBkYXRlV29yZFBsYWNlKHdyVGVtcC5FbmRQb3MpOwotCQkJcEl0ZXJhdG9yLT5TZXRBdCh3clRlbXAuQmVnaW5Qb3MpOworICAgIGlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpIHsKKyAgICAgIENQVlRfV29yZFJhbmdlIHdyVGVtcCA9IHJhbmdlOworICAgICAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZSh3clRlbXAuQmVnaW5Qb3MpOworICAgICAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZSh3clRlbXAuRW5kUG9zKTsKKyAgICAgIHBJdGVyYXRvci0+U2V0QXQod3JUZW1wLkJlZ2luUG9zKTsKKworICAgICAgQ1BWVF9Xb3JkIHdvcmRpbmZvOworICAgICAgQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2UgPSB3clRlbXAuQmVnaW5Qb3M7CisgICAgICB3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKSB7CisgICAgICAgIENQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOworICAgICAgICBpZiAocGxhY2UuV29yZENtcCh3clRlbXAuRW5kUG9zKSA+IDApCisgICAgICAgICAgYnJlYWs7CiAKLQkJCUNQVlRfV29yZCB3b3JkaW5mbzsJCi0JCQlDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZSA9IHdyVGVtcC5CZWdpblBvczsKLQkJCXdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpCi0JCQl7Ci0JCQkJQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7Ci0JCQkJaWYgKHBsYWNlLldvcmRDbXAod3JUZW1wLkVuZFBvcykgPiAwKWJyZWFrOworICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmRpbmZvKSkgeworICAgICAgICAgIGlmIChiUmljaCkgeworICAgICAgICAgICAgc3dSZXQgKz0gd29yZGluZm8uV29yZDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3dSZXQgKz0gd29yZGluZm8uV29yZDsKKyAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkJCWlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZGluZm8pKQotCQkJCXsKLQkJCQkJaWYgKGJSaWNoKQotCQkJCQl7Ci0JCQkJCQlzd1JldCArPSB3b3JkaW5mby5Xb3JkOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJc3dSZXQgKz0gd29yZGluZm8uV29yZDsKLQkJCQkJfQkJCQkJCi0JCQkJfQorICAgICAgICBpZiAob2xkcGxhY2UuU2VjQ21wKHBsYWNlKSAhPSAwKSB7CisgICAgICAgICAgc3dSZXQgKz0gMHgwRDsKKyAgICAgICAgICBzd1JldCArPSAweDBBOworICAgICAgICB9CiAKLQkJCQlpZiAob2xkcGxhY2UuU2VjQ21wKHBsYWNlKSAhPSAwKQotCQkJCXsKLQkJCQkJc3dSZXQgKz0gMHgwRDsKLQkJCQkJc3dSZXQgKz0gMHgwQTsKLQkJCQl9Ci0JCQkJCi0JCQkJb2xkcGxhY2UgPSBwbGFjZTsKLQkJCX0KLQkJfQotCX0KKyAgICAgICAgb2xkcGxhY2UgPSBwbGFjZTsKKyAgICAgIH0KKyAgICB9CisgIH0KIAotCXJldHVybiBzd1JldDsKKyAgcmV0dXJuIHN3UmV0OwogfQogCi1DRlhfV2lkZVN0cmluZyBDRlhfRWRpdDo6R2V0U2VsVGV4dCgpIGNvbnN0Ci17Ci0JcmV0dXJuIEdldFJhbmdlVGV4dChtX1NlbFN0YXRlLkNvbnZlcnRUb1dvcmRSYW5nZSgpKTsKK0NGWF9XaWRlU3RyaW5nIENGWF9FZGl0OjpHZXRTZWxUZXh0KCkgY29uc3QgeworICByZXR1cm4gR2V0UmFuZ2VUZXh0KG1fU2VsU3RhdGUuQ29udmVydFRvV29yZFJhbmdlKCkpOwogfQogCi1GWF9JTlQzMiBDRlhfRWRpdDo6R2V0VG90YWxXb3JkcygpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fcFZULT5HZXRUb3RhbFdvcmRzKCk7CitpbnQzMl90IENGWF9FZGl0OjpHZXRUb3RhbFdvcmRzKCkgY29uc3QgeworICByZXR1cm4gbV9wVlQtPkdldFRvdGFsV29yZHMoKTsKIH0KIAotRlhfSU5UMzIgQ0ZYX0VkaXQ6OkdldFRvdGFsTGluZXMoKSBjb25zdAotewotCUZYX0lOVDMyIG5MaW5lcyA9IDA7CitpbnQzMl90IENGWF9FZGl0OjpHZXRUb3RhbExpbmVzKCkgY29uc3QgeworICBpbnQzMl90IG5MaW5lcyA9IDA7CiAKLQlpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IgKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKSkKLQl7Ci0JCXBJdGVyYXRvci0+U2V0QXQoMCk7Ci0JCXdoaWxlIChwSXRlcmF0b3ItPk5leHRMaW5lKCkpCi0JCQluTGluZXMrKzsKLQl9CisgIGlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpIHsKKyAgICBwSXRlcmF0b3ItPlNldEF0KDApOworICAgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRMaW5lKCkpCisgICAgICBuTGluZXMrKzsKKyAgfQogCi0JcmV0dXJuIG5MaW5lcysxOworICByZXR1cm4gbkxpbmVzICsgMTsKIH0KIAotQ1BWVF9Xb3JkUmFuZ2UgQ0ZYX0VkaXQ6OkdldFNlbGVjdFdvcmRSYW5nZSgpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fU2VsU3RhdGUuQ29udmVydFRvV29yZFJhbmdlKCk7CitDUFZUX1dvcmRSYW5nZSBDRlhfRWRpdDo6R2V0U2VsZWN0V29yZFJhbmdlKCkgY29uc3QgeworICByZXR1cm4gbV9TZWxTdGF0ZS5Db252ZXJ0VG9Xb3JkUmFuZ2UoKTsKIH0KIAotQ1BWVF9Xb3JkUmFuZ2UgQ0ZYX0VkaXQ6OkNvbWJpbmVXb3JkUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3cjEsIGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IyKQotewotCUNQVlRfV29yZFJhbmdlIHdyUmV0OworQ1BWVF9Xb3JkUmFuZ2UgQ0ZYX0VkaXQ6OkNvbWJpbmVXb3JkUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cjIpIHsKKyAgQ1BWVF9Xb3JkUmFuZ2Ugd3JSZXQ7CiAKLQlpZiAod3IxLkJlZ2luUG9zLldvcmRDbXAod3IyLkJlZ2luUG9zKSA8IDApCi0JewotCQl3clJldC5CZWdpblBvcyA9IHdyMS5CZWdpblBvczsKLQl9Ci0JZWxzZQotCXsKLQkJd3JSZXQuQmVnaW5Qb3MgPSB3cjIuQmVnaW5Qb3M7Ci0JfQorICBpZiAod3IxLkJlZ2luUG9zLldvcmRDbXAod3IyLkJlZ2luUG9zKSA8IDApIHsKKyAgICB3clJldC5CZWdpblBvcyA9IHdyMS5CZWdpblBvczsKKyAgfSBlbHNlIHsKKyAgICB3clJldC5CZWdpblBvcyA9IHdyMi5CZWdpblBvczsKKyAgfQogCi0JaWYgKHdyMS5FbmRQb3MuV29yZENtcCh3cjIuRW5kUG9zKSA8IDApCi0JewotCQl3clJldC5FbmRQb3MgPSB3cjIuRW5kUG9zOwotCX0KLQllbHNlCi0JewotCQl3clJldC5FbmRQb3MgPSB3cjEuRW5kUG9zOwotCX0KKyAgaWYgKHdyMS5FbmRQb3MuV29yZENtcCh3cjIuRW5kUG9zKSA8IDApIHsKKyAgICB3clJldC5FbmRQb3MgPSB3cjIuRW5kUG9zOworICB9IGVsc2UgeworICAgIHdyUmV0LkVuZFBvcyA9IHdyMS5FbmRQb3M7CisgIH0KIAotCXJldHVybiB3clJldDsKKyAgcmV0dXJuIHdyUmV0OwogfQogCi1GWF9CT09MCUNGWF9FZGl0OjpJc1JpY2hUZXh0KCkgY29uc3QKLXsKLQlyZXR1cm4gbV9wVlQtPklzUmljaFRleHQoKTsKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OklzUmljaFRleHQoKSBjb25zdCB7CisgIHJldHVybiBtX3BWVC0+SXNSaWNoVGV4dCgpOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRSaWNoVGV4dChGWF9CT09MIGJSaWNoVGV4dC8qID1UUlVFICovLCBGWF9CT09MIGJQYWludC8qID0gVFJVRSovKQotewotCW1fcFZULT5TZXRSaWNoVGV4dChiUmljaFRleHQpOwotCWlmIChiUGFpbnQpIFBhaW50KCk7Cit2b2lkIENGWF9FZGl0OjpTZXRSaWNoVGV4dChGWF9CT09MIGJSaWNoVGV4dCwgRlhfQk9PTCBiUGFpbnQpIHsKKyAgbV9wVlQtPlNldFJpY2hUZXh0KGJSaWNoVGV4dCk7CisgIGlmIChiUGFpbnQpCisgICAgUGFpbnQoKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaEZvbnRJbmRleChGWF9JTlQzMiBuRm9udEluZGV4KQotewotCUNQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKLQlXb3JkUHJvcHMubkZvbnRJbmRleCA9IG5Gb250SW5kZXg7Ci0JcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfRk9OVElOREVYLE5VTEwsJldvcmRQcm9wcyk7CQorRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaEZvbnRJbmRleChpbnQzMl90IG5Gb250SW5kZXgpIHsKKyAgQ1BWVF9Xb3JkUHJvcHMgV29yZFByb3BzOworICBXb3JkUHJvcHMubkZvbnRJbmRleCA9IG5Gb250SW5kZXg7CisgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0ZPTlRJTkRFWCwgTlVMTCwgJldvcmRQcm9wcyk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpCi17CQotCUNQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKLQlXb3JkUHJvcHMuZkZvbnRTaXplID0gZkZvbnRTaXplOwotCXJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0ZPTlRTSVpFLE5VTEwsJldvcmRQcm9wcyk7CQorRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgeworICBDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7CisgIFdvcmRQcm9wcy5mRm9udFNpemUgPSBmRm9udFNpemU7CisgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0ZPTlRTSVpFLCBOVUxMLCAmV29yZFByb3BzKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRDb2xvcihGWF9DT0xPUlJFRiBkd0NvbG9yKQotewotCUNQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKLQlXb3JkUHJvcHMuZHdXb3JkQ29sb3IgPSBkd0NvbG9yOwotCXJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX1dPUkRDT0xPUixOVUxMLCZXb3JkUHJvcHMpOwkKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0Q29sb3IoRlhfQ09MT1JSRUYgZHdDb2xvcikgeworICBDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7CisgIFdvcmRQcm9wcy5kd1dvcmRDb2xvciA9IGR3Q29sb3I7CisgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX1dPUkRDT0xPUiwgTlVMTCwgJldvcmRQcm9wcyk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0U2NyaXB0KEZYX0lOVDMyIG5TY3JpcHRUeXBlKQotewotCUNQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKLQlXb3JkUHJvcHMublNjcmlwdFR5cGUgPSBuU2NyaXB0VHlwZTsKLQlyZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9TQ1JJUFRUWVBFLE5VTEwsJldvcmRQcm9wcyk7CQorRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRTY3JpcHQoaW50MzJfdCBuU2NyaXB0VHlwZSkgeworICBDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7CisgIFdvcmRQcm9wcy5uU2NyaXB0VHlwZSA9IG5TY3JpcHRUeXBlOworICByZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9TQ1JJUFRUWVBFLCBOVUxMLCAmV29yZFByb3BzKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRCb2xkKEZYX0JPT0wgYkJvbGQpCi17Ci0JQ1BWVF9Xb3JkUHJvcHMgV29yZFByb3BzOwotCWlmIChiQm9sZCkKLQkJV29yZFByb3BzLm5Xb3JkU3R5bGUgfD0gUFZUV09SRF9TVFlMRV9CT0xEOwotCXJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0JPTEQsTlVMTCwmV29yZFByb3BzKTsKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0Qm9sZChGWF9CT09MIGJCb2xkKSB7CisgIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKKyAgaWYgKGJCb2xkKQorICAgIFdvcmRQcm9wcy5uV29yZFN0eWxlIHw9IFBWVFdPUkRfU1RZTEVfQk9MRDsKKyAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfQk9MRCwgTlVMTCwgJldvcmRQcm9wcyk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0SXRhbGljKEZYX0JPT0wgYkl0YWxpYykKLXsKLQlDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7Ci0JaWYgKGJJdGFsaWMpCi0JCVdvcmRQcm9wcy5uV29yZFN0eWxlIHw9IFBWVFdPUkRfU1RZTEVfSVRBTElDOwotCXJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0lUQUxJQyxOVUxMLCZXb3JkUHJvcHMpOworRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRJdGFsaWMoRlhfQk9PTCBiSXRhbGljKSB7CisgIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKKyAgaWYgKGJJdGFsaWMpCisgICAgV29yZFByb3BzLm5Xb3JkU3R5bGUgfD0gUFZUV09SRF9TVFlMRV9JVEFMSUM7CisgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0lUQUxJQywgTlVMTCwgJldvcmRQcm9wcyk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0VW5kZXJsaW5lKEZYX0JPT0wgYlVuZGVybGluZSkKLXsKLQlDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7Ci0JaWYgKGJVbmRlcmxpbmUpCi0JCVdvcmRQcm9wcy5uV29yZFN0eWxlIHw9IFBWVFdPUkRfU1RZTEVfVU5ERVJMSU5FOwotCXJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX1VOREVSTElORSxOVUxMLCZXb3JkUHJvcHMpOworRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRVbmRlcmxpbmUoRlhfQk9PTCBiVW5kZXJsaW5lKSB7CisgIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKKyAgaWYgKGJVbmRlcmxpbmUpCisgICAgV29yZFByb3BzLm5Xb3JkU3R5bGUgfD0gUFZUV09SRF9TVFlMRV9VTkRFUkxJTkU7CisgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX1VOREVSTElORSwgTlVMTCwgJldvcmRQcm9wcyk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0Q3Jvc3NvdXQoRlhfQk9PTCBiQ3Jvc3NvdXQpCi17Ci0JQ1BWVF9Xb3JkUHJvcHMgV29yZFByb3BzOwotCWlmIChiQ3Jvc3NvdXQpCi0JCVdvcmRQcm9wcy5uV29yZFN0eWxlIHw9IFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQ7Ci0JcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfQ1JPU1NPVVQsTlVMTCwmV29yZFByb3BzKTsKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0Q3Jvc3NvdXQoRlhfQk9PTCBiQ3Jvc3NvdXQpIHsKKyAgQ1BWVF9Xb3JkUHJvcHMgV29yZFByb3BzOworICBpZiAoYkNyb3Nzb3V0KQorICAgIFdvcmRQcm9wcy5uV29yZFN0eWxlIHw9IFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQ7CisgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0NST1NTT1VULCBOVUxMLCAmV29yZFByb3BzKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSkKLXsKLQlDUFZUX1dvcmRQcm9wcyBXb3JkUHJvcHM7Ci0JV29yZFByb3BzLmZDaGFyU3BhY2UgPSBmQ2hhclNwYWNlOwotCXJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0NIQVJTUEFDRSxOVUxMLCZXb3JkUHJvcHMpOwkKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpIHsKKyAgQ1BWVF9Xb3JkUHJvcHMgV29yZFByb3BzOworICBXb3JkUHJvcHMuZkNoYXJTcGFjZSA9IGZDaGFyU3BhY2U7CisgIHJldHVybiBTZXRSaWNoVGV4dFByb3BzKEVQX0NIQVJTUEFDRSwgTlVMTCwgJldvcmRQcm9wcyk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0SG9yelNjYWxlKEZYX0lOVDMyIG5Ib3J6U2NhbGUgLyo9IDEwMCovKQotewotCUNQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKLQlXb3JkUHJvcHMubkhvcnpTY2FsZSA9IG5Ib3J6U2NhbGU7Ci0JcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfSE9SWlNDQUxFLE5VTEwsJldvcmRQcm9wcyk7CQorRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRIb3J6U2NhbGUoaW50MzJfdCBuSG9yelNjYWxlKSB7CisgIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKKyAgV29yZFByb3BzLm5Ib3J6U2NhbGUgPSBuSG9yelNjYWxlOworICByZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9IT1JaU0NBTEUsIE5VTEwsICZXb3JkUHJvcHMpOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZykKLXsKLQlDUFZUX1NlY1Byb3BzIFNlY1Byb3BzOwotCVNlY1Byb3BzLmZMaW5lTGVhZGluZyA9IGZMaW5lTGVhZGluZzsKLQlyZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9MSU5FTEVBRElORywmU2VjUHJvcHMsTlVMTCk7CQorRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRMaW5lTGVhZGluZyhGWF9GTE9BVCBmTGluZUxlYWRpbmcpIHsKKyAgQ1BWVF9TZWNQcm9wcyBTZWNQcm9wczsKKyAgU2VjUHJvcHMuZkxpbmVMZWFkaW5nID0gZkxpbmVMZWFkaW5nOworICByZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9MSU5FTEVBRElORywgJlNlY1Byb3BzLCBOVUxMKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6U2V0UmljaFRleHRMaW5lSW5kZW50KEZYX0ZMT0FUIGZMaW5lSW5kZW50KQotewotCUNQVlRfU2VjUHJvcHMgU2VjUHJvcHM7Ci0JU2VjUHJvcHMuZkxpbmVJbmRlbnQgPSBmTGluZUluZGVudDsKLQlyZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9MSU5FSU5ERU5ULCZTZWNQcm9wcyxOVUxMKTsKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0TGluZUluZGVudChGWF9GTE9BVCBmTGluZUluZGVudCkgeworICBDUFZUX1NlY1Byb3BzIFNlY1Byb3BzOworICBTZWNQcm9wcy5mTGluZUluZGVudCA9IGZMaW5lSW5kZW50OworICByZXR1cm4gU2V0UmljaFRleHRQcm9wcyhFUF9MSU5FSU5ERU5ULCAmU2VjUHJvcHMsIE5VTEwpOwogfQogCi1GWF9CT09MCUNGWF9FZGl0OjpTZXRSaWNoVGV4dEFsaWdubWVudChGWF9JTlQzMiBuQWxpZ25tZW50KQotewotCUNQVlRfU2VjUHJvcHMgU2VjUHJvcHM7Ci0JU2VjUHJvcHMubkFsaWdubWVudCA9IG5BbGlnbm1lbnQ7Ci0JcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfQUxJR05NRU5ULCZTZWNQcm9wcyxOVUxMKTsKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0QWxpZ25tZW50KGludDMyX3QgbkFsaWdubWVudCkgeworICBDUFZUX1NlY1Byb3BzIFNlY1Byb3BzOworICBTZWNQcm9wcy5uQWxpZ25tZW50ID0gbkFsaWdubWVudDsKKyAgcmV0dXJuIFNldFJpY2hUZXh0UHJvcHMoRVBfQUxJR05NRU5ULCAmU2VjUHJvcHMsIE5VTEwpOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpTZXRSaWNoVGV4dFByb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsIGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcykKLXsKLQlGWF9CT09MIGJTZXQgPSBGQUxTRTsKLQlGWF9CT09MIGJTZXQxLGJTZXQyOwotCWlmIChtX3BWVC0+SXNWYWxpZCgpICYmIG1fcFZULT5Jc1JpY2hUZXh0KCkpCi0JewotCQlpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IgKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKSkKLQkJewotCQkJQ1BWVF9Xb3JkUmFuZ2Ugd3JUZW1wID0gbV9TZWxTdGF0ZS5Db252ZXJ0VG9Xb3JkUmFuZ2UoKTsKLQkJCQotCQkJbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZSh3clRlbXAuQmVnaW5Qb3MpOwotCQkJbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZSh3clRlbXAuRW5kUG9zKTsKLQkJCXBJdGVyYXRvci0+U2V0QXQod3JUZW1wLkJlZ2luUG9zKTsKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFJpY2hUZXh0UHJvcHMoRURJVF9QUk9QU19FIGVQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcykgeworICBGWF9CT09MIGJTZXQgPSBGQUxTRTsKKyAgRlhfQk9PTCBiU2V0MSwgYlNldDI7CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpICYmIG1fcFZULT5Jc1JpY2hUZXh0KCkpIHsKKyAgICBpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKSB7CisgICAgICBDUFZUX1dvcmRSYW5nZSB3clRlbXAgPSBtX1NlbFN0YXRlLkNvbnZlcnRUb1dvcmRSYW5nZSgpOwogCi0JCQlCZWdpbkdyb3VwVW5kbyhMIiIpOzsKKyAgICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2Uod3JUZW1wLkJlZ2luUG9zKTsKKyAgICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2Uod3JUZW1wLkVuZFBvcyk7CisgICAgICBwSXRlcmF0b3ItPlNldEF0KHdyVGVtcC5CZWdpblBvcyk7CiAKLQkJCWJTZXQgPSBTZXRTZWNQcm9wcyhlUHJvcHMsd3JUZW1wLkJlZ2luUG9zLHBTZWNQcm9wcyxwV29yZFByb3BzLHdyVGVtcCxUUlVFKTsKKyAgICAgIEJlZ2luR3JvdXBVbmRvKEwiIik7CisgICAgICBiU2V0ID0gU2V0U2VjUHJvcHMoZVByb3BzLCB3clRlbXAuQmVnaW5Qb3MsIHBTZWNQcm9wcywgcFdvcmRQcm9wcywgd3JUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpOwogCi0JCQl3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKQotCQkJewotCQkJCUNQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOwotCQkJCWlmIChwbGFjZS5Xb3JkQ21wKHdyVGVtcC5FbmRQb3MpID4gMCkgYnJlYWs7Ci0JCQkJYlNldDEgPSBTZXRTZWNQcm9wcyhlUHJvcHMscGxhY2UscFNlY1Byb3BzLHBXb3JkUHJvcHMsd3JUZW1wLFRSVUUpOwotCQkJCWJTZXQyID0gU2V0V29yZFByb3BzKGVQcm9wcyxwbGFjZSxwV29yZFByb3BzLHdyVGVtcCxUUlVFKTsKLQkJCQkKLQkJCQlpZiAoIWJTZXQpCi0JCQkJCWJTZXQgPSAoYlNldDEgfHwgYlNldDIpOwotCQkJfQorICAgICAgd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkgeworICAgICAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKKyAgICAgICAgaWYgKHBsYWNlLldvcmRDbXAod3JUZW1wLkVuZFBvcykgPiAwKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBiU2V0MSA9IFNldFNlY1Byb3BzKGVQcm9wcywgcGxhY2UsIHBTZWNQcm9wcywgcFdvcmRQcm9wcywgd3JUZW1wLCBUUlVFKTsKKyAgICAgICAgYlNldDIgPSBTZXRXb3JkUHJvcHMoZVByb3BzLCBwbGFjZSwgcFdvcmRQcm9wcywgd3JUZW1wLCBUUlVFKTsKKworICAgICAgICBpZiAoIWJTZXQpCisgICAgICAgICAgYlNldCA9IChiU2V0MSB8fCBiU2V0Mik7CisgICAgICB9CiAKLQkJCUVuZEdyb3VwVW5kbygpOworICAgICAgRW5kR3JvdXBVbmRvKCk7CiAKLQkJCWlmIChiU2V0KQotCQkJewotCQkJCVBhaW50U2V0UHJvcHMoZVByb3BzLHdyVGVtcCk7Ci0JCQl9Ci0JCX0KLQl9CQorICAgICAgaWYgKGJTZXQpIHsKKyAgICAgICAgUGFpbnRTZXRQcm9wcyhlUHJvcHMsIHdyVGVtcCk7CisgICAgICB9CisgICAgfQorICB9CiAKLQlyZXR1cm4gYlNldDsKKyAgcmV0dXJuIGJTZXQ7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlBhaW50U2V0UHJvcHMoRURJVF9QUk9QU19FIGVQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3cikKLXsKLQlzd2l0Y2goZVByb3BzKQotCXsKLQljYXNlIEVQX0xJTkVMRUFESU5HOgotCWNhc2UgRVBfTElORUlOREVOVDoKLQljYXNlIEVQX0FMSUdOTUVOVDoKLQkJUmVhcnJhbmdlUGFydCh3cik7Ci0JCVNjcm9sbFRvQ2FyZXQoKTsKLQkJUmVmcmVzaChSUF9BTkFMWVNFKTsKLQkJU2V0Q2FyZXRPcmlnaW4oKTsKLQkJU2V0Q2FyZXRJbmZvKCk7CQotCQlicmVhazsJCQkJCQotCWNhc2UgRVBfV09SRENPTE9SOgotCWNhc2UgRVBfVU5ERVJMSU5FOgotCWNhc2UgRVBfQ1JPU1NPVVQ6Ci0JCVJlZnJlc2goUlBfT1BUSU9OQUwsJndyKTsKLQkJYnJlYWs7Ci0JY2FzZSBFUF9GT05USU5ERVg6Ci0JY2FzZSBFUF9GT05UU0laRToKLQljYXNlIEVQX1NDUklQVFRZUEU6CQkJCQkKLQljYXNlIEVQX0NIQVJTUEFDRToKLQljYXNlIEVQX0hPUlpTQ0FMRToKLQljYXNlIEVQX0JPTEQ6Ci0JY2FzZSBFUF9JVEFMSUM6Ci0JCVJlYXJyYW5nZVBhcnQod3IpOwotCQlTY3JvbGxUb0NhcmV0KCk7Cit2b2lkIENGWF9FZGl0OjpQYWludFNldFByb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsIGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cikgeworICBzd2l0Y2ggKGVQcm9wcykgeworICAgIGNhc2UgRVBfTElORUxFQURJTkc6CisgICAgY2FzZSBFUF9MSU5FSU5ERU5UOgorICAgIGNhc2UgRVBfQUxJR05NRU5UOgorICAgICAgUmVhcnJhbmdlUGFydCh3cik7CisgICAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgICBSZWZyZXNoKFJQX0FOQUxZU0UpOworICAgICAgU2V0Q2FyZXRPcmlnaW4oKTsKKyAgICAgIFNldENhcmV0SW5mbygpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFUF9XT1JEQ09MT1I6CisgICAgY2FzZSBFUF9VTkRFUkxJTkU6CisgICAgY2FzZSBFUF9DUk9TU09VVDoKKyAgICAgIFJlZnJlc2goUlBfT1BUSU9OQUwsICZ3cik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVQX0ZPTlRJTkRFWDoKKyAgICBjYXNlIEVQX0ZPTlRTSVpFOgorICAgIGNhc2UgRVBfU0NSSVBUVFlQRToKKyAgICBjYXNlIEVQX0NIQVJTUEFDRToKKyAgICBjYXNlIEVQX0hPUlpTQ0FMRToKKyAgICBjYXNlIEVQX0JPTEQ6CisgICAgY2FzZSBFUF9JVEFMSUM6CisgICAgICBSZWFycmFuZ2VQYXJ0KHdyKTsKKyAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKIAotCQlDUFZUX1dvcmRSYW5nZSB3clJlZnJlc2gobV9wVlQtPkdldFNlY3Rpb25CZWdpblBsYWNlKHdyLkJlZ2luUG9zKSwKLQkJCW1fcFZULT5HZXRTZWN0aW9uRW5kUGxhY2Uod3IuRW5kUG9zKSk7Ci0JCVJlZnJlc2goUlBfQU5BTFlTRSwmd3JSZWZyZXNoKTsKKyAgICAgIENQVlRfV29yZFJhbmdlIHdyUmVmcmVzaChtX3BWVC0+R2V0U2VjdGlvbkJlZ2luUGxhY2Uod3IuQmVnaW5Qb3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFZULT5HZXRTZWN0aW9uRW5kUGxhY2Uod3IuRW5kUG9zKSk7CisgICAgICBSZWZyZXNoKFJQX0FOQUxZU0UsICZ3clJlZnJlc2gpOwogCi0JCVNldENhcmV0T3JpZ2luKCk7Ci0JCVNldENhcmV0SW5mbygpOwkKLQkJYnJlYWs7Ci0JfQkJCQkKKyAgICAgIFNldENhcmV0T3JpZ2luKCk7CisgICAgICBTZXRDYXJldEluZm8oKTsKKyAgICAgIGJyZWFrOworICB9CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFNlY1Byb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIAotCQkJCQkJCSAgIGNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcywgCi0JCQkJCQkJICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3ciwgRlhfQk9PTCBiQWRkVW5kbykKLXsKLQlpZiAobV9wVlQtPklzVmFsaWQoKSAmJiBtX3BWVC0+SXNSaWNoVGV4dCgpKQotCXsKLQkJaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpCi0JCXsKLQkJCUZYX0JPT0wgYlNldCA9IEZBTFNFOwotCQkJQ1BWVF9TZWN0aW9uIHNlY2luZm87Ci0JCQlDUFZUX1NlY3Rpb24gT2xkU2VjaW5mbzsKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFNlY1Byb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlJiB3ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFkZFVuZG8pIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkgJiYgbV9wVlQtPklzUmljaFRleHQoKSkgeworICAgIGlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpIHsKKyAgICAgIEZYX0JPT0wgYlNldCA9IEZBTFNFOworICAgICAgQ1BWVF9TZWN0aW9uIHNlY2luZm87CisgICAgICBDUFZUX1NlY3Rpb24gT2xkU2VjaW5mbzsKIAotCQkJQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7CisgICAgICBDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKIAotCQkJaWYgKGVQcm9wcyA9PSBFUF9MSU5FTEVBRElORyB8fCBlUHJvcHMgPT0gRVBfTElORUlOREVOVCB8fCBlUHJvcHMgPT0gRVBfQUxJR05NRU5UKQotCQkJewotCQkJCWlmIChwU2VjUHJvcHMpCi0JCQkJewotCQkJCQlwSXRlcmF0b3ItPlNldEF0KHBsYWNlKTsKLQkJCQkJaWYgKHBJdGVyYXRvci0+R2V0U2VjdGlvbihzZWNpbmZvKSkKLQkJCQkJewotCQkJCQkJaWYgKGJBZGRVbmRvKSBPbGRTZWNpbmZvID0gc2VjaW5mbzsKKyAgICAgIGlmIChlUHJvcHMgPT0gRVBfTElORUxFQURJTkcgfHwgZVByb3BzID09IEVQX0xJTkVJTkRFTlQgfHwKKyAgICAgICAgICBlUHJvcHMgPT0gRVBfQUxJR05NRU5UKSB7CisgICAgICAgIGlmIChwU2VjUHJvcHMpIHsKKyAgICAgICAgICBwSXRlcmF0b3ItPlNldEF0KHBsYWNlKTsKKyAgICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRTZWN0aW9uKHNlY2luZm8pKSB7CisgICAgICAgICAgICBpZiAoYkFkZFVuZG8pCisgICAgICAgICAgICAgIE9sZFNlY2luZm8gPSBzZWNpbmZvOwogCi0JCQkJCQlzd2l0Y2goZVByb3BzKQotCQkJCQkJewotCQkJCQkJY2FzZSBFUF9MSU5FTEVBRElORzoJCQkJCi0JCQkJCQkJaWYgKCFGWF9FRElUX0lzRmxvYXRFcXVhbChzZWNpbmZvLlNlY1Byb3BzLmZMaW5lTGVhZGluZyxwU2VjUHJvcHMtPmZMaW5lTGVhZGluZykpCi0JCQkJCQkJewotCQkJCQkJCQlzZWNpbmZvLlNlY1Byb3BzLmZMaW5lTGVhZGluZyA9IHBTZWNQcm9wcy0+ZkxpbmVMZWFkaW5nOwkJCQkJCQkKLQkJCQkJCQkJYlNldCA9IFRSVUU7Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBFUF9MSU5FSU5ERU5UOgotCQkJCQkJCWlmICghRlhfRURJVF9Jc0Zsb2F0RXF1YWwoc2VjaW5mby5TZWNQcm9wcy5mTGluZUluZGVudCxwU2VjUHJvcHMtPmZMaW5lSW5kZW50KSkKLQkJCQkJCQl7Ci0JCQkJCQkJCXNlY2luZm8uU2VjUHJvcHMuZkxpbmVJbmRlbnQgPSBwU2VjUHJvcHMtPmZMaW5lSW5kZW50OwotCQkJCQkJCQliU2V0ID0gVFJVRTsKLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIEVQX0FMSUdOTUVOVDoKLQkJCQkJCQlpZiAoc2VjaW5mby5TZWNQcm9wcy5uQWxpZ25tZW50ICE9IHBTZWNQcm9wcy0+bkFsaWdubWVudCkKLQkJCQkJCQl7Ci0JCQkJCQkJCXNlY2luZm8uU2VjUHJvcHMubkFsaWdubWVudCA9IHBTZWNQcm9wcy0+bkFsaWdubWVudDsKLQkJCQkJCQkJYlNldCA9IFRSVUU7Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAocFdvcmRQcm9wcyAmJiBwbGFjZSA9PSBtX3BWVC0+R2V0U2VjdGlvbkJlZ2luUGxhY2UocGxhY2UpKQotCQkJCXsKLQkJCQkJcEl0ZXJhdG9yLT5TZXRBdChwbGFjZSk7Ci0JCQkJCWlmIChwSXRlcmF0b3ItPkdldFNlY3Rpb24oc2VjaW5mbykpCi0JCQkJCXsKLQkJCQkJCWlmIChiQWRkVW5kbykgT2xkU2VjaW5mbyA9IHNlY2luZm87CisgICAgICAgICAgICBzd2l0Y2ggKGVQcm9wcykgeworICAgICAgICAgICAgICBjYXNlIEVQX0xJTkVMRUFESU5HOgorICAgICAgICAgICAgICAgIGlmICghRlhfRURJVF9Jc0Zsb2F0RXF1YWwoc2VjaW5mby5TZWNQcm9wcy5mTGluZUxlYWRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VjUHJvcHMtPmZMaW5lTGVhZGluZykpIHsKKyAgICAgICAgICAgICAgICAgIHNlY2luZm8uU2VjUHJvcHMuZkxpbmVMZWFkaW5nID0gcFNlY1Byb3BzLT5mTGluZUxlYWRpbmc7CisgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRVBfTElORUlOREVOVDoKKyAgICAgICAgICAgICAgICBpZiAoIUZYX0VESVRfSXNGbG9hdEVxdWFsKHNlY2luZm8uU2VjUHJvcHMuZkxpbmVJbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VjUHJvcHMtPmZMaW5lSW5kZW50KSkgeworICAgICAgICAgICAgICAgICAgc2VjaW5mby5TZWNQcm9wcy5mTGluZUluZGVudCA9IHBTZWNQcm9wcy0+ZkxpbmVJbmRlbnQ7CisgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRVBfQUxJR05NRU5UOgorICAgICAgICAgICAgICAgIGlmIChzZWNpbmZvLlNlY1Byb3BzLm5BbGlnbm1lbnQgIT0gcFNlY1Byb3BzLT5uQWxpZ25tZW50KSB7CisgICAgICAgICAgICAgICAgICBzZWNpbmZvLlNlY1Byb3BzLm5BbGlnbm1lbnQgPSBwU2VjUHJvcHMtPm5BbGlnbm1lbnQ7CisgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAocFdvcmRQcm9wcyAmJiBwbGFjZSA9PSBtX3BWVC0+R2V0U2VjdGlvbkJlZ2luUGxhY2UocGxhY2UpKSB7CisgICAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdChwbGFjZSk7CisgICAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0U2VjdGlvbihzZWNpbmZvKSkgeworICAgICAgICAgICAgaWYgKGJBZGRVbmRvKQorICAgICAgICAgICAgICBPbGRTZWNpbmZvID0gc2VjaW5mbzsKKworICAgICAgICAgICAgc3dpdGNoIChlUHJvcHMpIHsKKyAgICAgICAgICAgICAgY2FzZSBFUF9GT05USU5ERVg6CisgICAgICAgICAgICAgICAgaWYgKHNlY2luZm8uV29yZFByb3BzLm5Gb250SW5kZXggIT0gcFdvcmRQcm9wcy0+bkZvbnRJbmRleCkgeworICAgICAgICAgICAgICAgICAgc2VjaW5mby5Xb3JkUHJvcHMubkZvbnRJbmRleCA9IHBXb3JkUHJvcHMtPm5Gb250SW5kZXg7CisgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRVBfRk9OVFNJWkU6CisgICAgICAgICAgICAgICAgaWYgKCFGWF9FRElUX0lzRmxvYXRFcXVhbChzZWNpbmZvLldvcmRQcm9wcy5mRm9udFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29yZFByb3BzLT5mRm9udFNpemUpKSB7CisgICAgICAgICAgICAgICAgICBzZWNpbmZvLldvcmRQcm9wcy5mRm9udFNpemUgPSBwV29yZFByb3BzLT5mRm9udFNpemU7CisgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRVBfV09SRENPTE9SOgorICAgICAgICAgICAgICAgIGlmIChzZWNpbmZvLldvcmRQcm9wcy5kd1dvcmRDb2xvciAhPSBwV29yZFByb3BzLT5kd1dvcmRDb2xvcikgeworICAgICAgICAgICAgICAgICAgc2VjaW5mby5Xb3JkUHJvcHMuZHdXb3JkQ29sb3IgPSBwV29yZFByb3BzLT5kd1dvcmRDb2xvcjsKKyAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFUF9TQ1JJUFRUWVBFOgorICAgICAgICAgICAgICAgIGlmIChzZWNpbmZvLldvcmRQcm9wcy5uU2NyaXB0VHlwZSAhPSBwV29yZFByb3BzLT5uU2NyaXB0VHlwZSkgeworICAgICAgICAgICAgICAgICAgc2VjaW5mby5Xb3JkUHJvcHMublNjcmlwdFR5cGUgPSBwV29yZFByb3BzLT5uU2NyaXB0VHlwZTsKKyAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFUF9DSEFSU1BBQ0U6CisgICAgICAgICAgICAgICAgaWYgKCFGWF9FRElUX0lzRmxvYXRFcXVhbChzZWNpbmZvLldvcmRQcm9wcy5mQ2hhclNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmRQcm9wcy0+ZkNoYXJTcGFjZSkpIHsKKyAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLmZDaGFyU3BhY2UgPSBwV29yZFByb3BzLT5mQ2hhclNwYWNlOworICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEVQX0hPUlpTQ0FMRToKKyAgICAgICAgICAgICAgICBpZiAoc2VjaW5mby5Xb3JkUHJvcHMubkhvcnpTY2FsZSAhPSBwV29yZFByb3BzLT5uSG9yelNjYWxlKSB7CisgICAgICAgICAgICAgICAgICBzZWNpbmZvLldvcmRQcm9wcy5uSG9yelNjYWxlID0gcFdvcmRQcm9wcy0+bkhvcnpTY2FsZTsKKyAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFUF9VTkRFUkxJTkU6CisgICAgICAgICAgICAgICAgaWYgKHBXb3JkUHJvcHMtPm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX1VOREVSTElORSkgeworICAgICAgICAgICAgICAgICAgaWYgKChzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYKKyAgICAgICAgICAgICAgICAgICAgICAgUFZUV09SRF9TVFlMRV9VTkRFUkxJTkUpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX1VOREVSTElORTsKKyAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGlmICgoc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmCisgICAgICAgICAgICAgICAgICAgICAgIFBWVFdPUkRfU1RZTEVfVU5ERVJMSU5FKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJj0gflBWVFdPUkRfU1RZTEVfVU5ERVJMSU5FOworICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgRVBfQ1JPU1NPVVQ6CisgICAgICAgICAgICAgICAgaWYgKHBXb3JkUHJvcHMtPm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0NST1NTT1VUKSB7CisgICAgICAgICAgICAgICAgICBpZiAoKHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0NST1NTT1VUKSA9PQorICAgICAgICAgICAgICAgICAgICAgIDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX0NST1NTT1VUOworICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgaWYgKChzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9DUk9TU09VVCkgIT0KKyAgICAgICAgICAgICAgICAgICAgICAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJj0gflBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQ7CisgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBFUF9CT0xEOgorICAgICAgICAgICAgICAgIGlmIChwV29yZFByb3BzLT5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9CT0xEKSB7CisgICAgICAgICAgICAgICAgICBpZiAoKHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0JPTEQpID09CisgICAgICAgICAgICAgICAgICAgICAgMCkgeworICAgICAgICAgICAgICAgICAgICBzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlIHw9IFBWVFdPUkRfU1RZTEVfQk9MRDsKKyAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGlmICgoc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfQk9MRCkgIT0KKyAgICAgICAgICAgICAgICAgICAgICAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJj0gflBWVFdPUkRfU1RZTEVfQk9MRDsKKyAgICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEVQX0lUQUxJQzoKKyAgICAgICAgICAgICAgICBpZiAocFdvcmRQcm9wcy0+bldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfSVRBTElDKSB7CisgICAgICAgICAgICAgICAgICBpZiAoKHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0lUQUxJQykgPT0KKyAgICAgICAgICAgICAgICAgICAgICAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgfD0gUFZUV09SRF9TVFlMRV9JVEFMSUM7CisgICAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBpZiAoKHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0lUQUxJQykgIT0KKyAgICAgICAgICAgICAgICAgICAgICAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJj0gflBWVFdPUkRfU1RZTEVfSVRBTElDOworICAgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CiAKLQkJCQkJCXN3aXRjaChlUHJvcHMpCi0JCQkJCQl7Ci0JCQkJCQljYXNlIEVQX0ZPTlRJTkRFWDoJCQkJCi0JCQkJCQkJaWYgKHNlY2luZm8uV29yZFByb3BzLm5Gb250SW5kZXggIT0gcFdvcmRQcm9wcy0+bkZvbnRJbmRleCkKLQkJCQkJCQl7Ci0JCQkJCQkJCXNlY2luZm8uV29yZFByb3BzLm5Gb250SW5kZXggPSBwV29yZFByb3BzLT5uRm9udEluZGV4OwotCQkJCQkJCQliU2V0ID0gVFJVRTsKLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIEVQX0ZPTlRTSVpFOgotCQkJCQkJCWlmICghRlhfRURJVF9Jc0Zsb2F0RXF1YWwoc2VjaW5mby5Xb3JkUHJvcHMuZkZvbnRTaXplLHBXb3JkUHJvcHMtPmZGb250U2l6ZSkpCi0JCQkJCQkJewotCQkJCQkJCQlzZWNpbmZvLldvcmRQcm9wcy5mRm9udFNpemUgPSBwV29yZFByb3BzLT5mRm9udFNpemU7Ci0JCQkJCQkJCWJTZXQgPSBUUlVFOwotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgRVBfV09SRENPTE9SOgotCQkJCQkJCWlmIChzZWNpbmZvLldvcmRQcm9wcy5kd1dvcmRDb2xvciAhPSBwV29yZFByb3BzLT5kd1dvcmRDb2xvcikKLQkJCQkJCQl7Ci0JCQkJCQkJCXNlY2luZm8uV29yZFByb3BzLmR3V29yZENvbG9yID0gcFdvcmRQcm9wcy0+ZHdXb3JkQ29sb3I7Ci0JCQkJCQkJCWJTZXQgPSBUUlVFOwotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgRVBfU0NSSVBUVFlQRToJCQkJCi0JCQkJCQkJaWYgKHNlY2luZm8uV29yZFByb3BzLm5TY3JpcHRUeXBlICE9IHBXb3JkUHJvcHMtPm5TY3JpcHRUeXBlKQotCQkJCQkJCXsKLQkJCQkJCQkJc2VjaW5mby5Xb3JkUHJvcHMublNjcmlwdFR5cGUgPSBwV29yZFByb3BzLT5uU2NyaXB0VHlwZTsKLQkJCQkJCQkJYlNldCA9IFRSVUU7Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBFUF9DSEFSU1BBQ0U6CQkJCi0JCQkJCQkJaWYgKCFGWF9FRElUX0lzRmxvYXRFcXVhbChzZWNpbmZvLldvcmRQcm9wcy5mQ2hhclNwYWNlLHBXb3JkUHJvcHMtPmZDaGFyU3BhY2UpKQotCQkJCQkJCXsKLQkJCQkJCQkJc2VjaW5mby5Xb3JkUHJvcHMuZkNoYXJTcGFjZSA9IHBXb3JkUHJvcHMtPmZDaGFyU3BhY2U7Ci0JCQkJCQkJCWJTZXQgPSBUUlVFOwotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgRVBfSE9SWlNDQUxFOgkJCQkKLQkJCQkJCQlpZiAoc2VjaW5mby5Xb3JkUHJvcHMubkhvcnpTY2FsZSAhPSBwV29yZFByb3BzLT5uSG9yelNjYWxlKQotCQkJCQkJCXsKLQkJCQkJCQkJc2VjaW5mby5Xb3JkUHJvcHMubkhvcnpTY2FsZSA9IHBXb3JkUHJvcHMtPm5Ib3J6U2NhbGU7Ci0JCQkJCQkJCWJTZXQgPSBUUlVFOwotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgRVBfVU5ERVJMSU5FOgotCQkJCQkJCWlmIChwV29yZFByb3BzLT5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9VTkRFUkxJTkUpCi0JCQkJCQkJewotCQkJCQkJCQlpZiAoKHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX1VOREVSTElORSkgPT0gMCkKLQkJCQkJCQkJewotCQkJCQkJCQkJc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX1VOREVSTElORTsgCi0JCQkJCQkJCQliU2V0ID0gVFJVRTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQllbHNlCi0JCQkJCQkJewotCQkJCQkJCQlpZiAoKHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX1VOREVSTElORSkgIT0gMCkKLQkJCQkJCQkJewotCQkJCQkJCQkJc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmPSB+UFZUV09SRF9TVFlMRV9VTkRFUkxJTkU7Ci0JCQkJCQkJCQliU2V0ID0gVFJVRTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgRVBfQ1JPU1NPVVQ6Ci0JCQkJCQkJaWYgKHBXb3JkUHJvcHMtPm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0NST1NTT1VUKQotCQkJCQkJCXsKLQkJCQkJCQkJaWYgKChzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9DUk9TU09VVCkgPT0gMCkKLQkJCQkJCQkJewotCQkJCQkJCQkJc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX0NST1NTT1VUOyAKLQkJCQkJCQkJCWJTZXQgPSBUUlVFOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UKLQkJCQkJCQl7Ci0JCQkJCQkJCWlmICgoc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQpICE9IDApCi0JCQkJCQkJCXsKLQkJCQkJCQkJCXNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJj0gflBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQ7Ci0JCQkJCQkJCQliU2V0ID0gVFJVRTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgRVBfQk9MRDoKLQkJCQkJCQlpZiAocFdvcmRQcm9wcy0+bldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfQk9MRCkKLQkJCQkJCQl7Ci0JCQkJCQkJCWlmICgoc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfQk9MRCkgPT0gMCkKLQkJCQkJCQkJewotCQkJCQkJCQkJc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX0JPTEQ7IAotCQkJCQkJCQkJYlNldCA9IFRSVUU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCXsKLQkJCQkJCQkJaWYgKChzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9CT0xEKSAhPSAwKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQlzZWNpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICY9IH5QVlRXT1JEX1NUWUxFX0JPTEQ7Ci0JCQkJCQkJCQliU2V0ID0gVFJVRTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgRVBfSVRBTElDOgotCQkJCQkJCWlmIChwV29yZFByb3BzLT5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9JVEFMSUMpCi0JCQkJCQkJewotCQkJCQkJCQlpZiAoKHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0lUQUxJQykgPT0gMCkKLQkJCQkJCQkJewotCQkJCQkJCQkJc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX0lUQUxJQzsgCi0JCQkJCQkJCQliU2V0ID0gVFJVRTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQllbHNlCi0JCQkJCQkJewotCQkJCQkJCQlpZiAoKHNlY2luZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0lUQUxJQykgIT0gMCkKLQkJCQkJCQkJewotCQkJCQkJCQkJc2VjaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmPSB+UFZUV09SRF9TVFlMRV9JVEFMSUM7Ci0JCQkJCQkJCQliU2V0ID0gVFJVRTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CisgICAgICBpZiAoYlNldCkgeworICAgICAgICBwSXRlcmF0b3ItPlNldFNlY3Rpb24oc2VjaW5mbyk7CiAKLQkJCWlmIChiU2V0KQotCQkJewotCQkJCXBJdGVyYXRvci0+U2V0U2VjdGlvbihzZWNpbmZvKTsKKyAgICAgICAgaWYgKGJBZGRVbmRvICYmIG1fYkVuYWJsZVVuZG8pIHsKKyAgICAgICAgICBBZGRFZGl0VW5kb0l0ZW0obmV3IENGWEVVX1NldFNlY1Byb3BzKAorICAgICAgICAgICAgICB0aGlzLCBwbGFjZSwgZVByb3BzLCBPbGRTZWNpbmZvLlNlY1Byb3BzLCBPbGRTZWNpbmZvLldvcmRQcm9wcywKKyAgICAgICAgICAgICAgc2VjaW5mby5TZWNQcm9wcywgc2VjaW5mby5Xb3JkUHJvcHMsIHdyKSk7CisgICAgICAgIH0KKyAgICAgIH0KIAotCQkJCWlmIChiQWRkVW5kbyAmJiBtX2JFbmFibGVVbmRvKQotCQkJCXsKLQkJCQkJQWRkRWRpdFVuZG9JdGVtKG5ldyBDRlhFVV9TZXRTZWNQcm9wcwotCQkJCQkJKHRoaXMscGxhY2UsZVByb3BzLE9sZFNlY2luZm8uU2VjUHJvcHMsT2xkU2VjaW5mby5Xb3JkUHJvcHMsc2VjaW5mby5TZWNQcm9wcyxzZWNpbmZvLldvcmRQcm9wcyx3cikpOwotCQkJCX0KLQkJCX0KKyAgICAgIHBJdGVyYXRvci0+U2V0QXQob2xkcGxhY2UpOwogCi0JCQlwSXRlcmF0b3ItPlNldEF0KG9sZHBsYWNlKTsKKyAgICAgIHJldHVybiBiU2V0OworICAgIH0KKyAgfQogCi0JCQlyZXR1cm4gYlNldDsKLQkJfQotCX0KLQkKLQlyZXR1cm4gRkFMU0U7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6U2V0V29yZFByb3BzKEVESVRfUFJPUFNfRSBlUHJvcHMsIGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIAotCQkJCQkJCQljb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsIGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IsIEZYX0JPT0wgYkFkZFVuZG8pCi17Ci0JaWYgKG1fcFZULT5Jc1ZhbGlkKCkgJiYgbV9wVlQtPklzUmljaFRleHQoKSkKLQl7Ci0JCWlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciAqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKQotCQl7Ci0JCQlGWF9CT09MIGJTZXQgPSBGQUxTRTsKLQkJCUNQVlRfV29yZCB3b3JkaW5mbzsKLQkJCUNQVlRfV29yZCBPbGRXb3JkaW5mbzsKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OlNldFdvcmRQcm9wcyhFRElUX1BST1BTX0UgZVByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWRkVW5kbykgeworICBpZiAobV9wVlQtPklzVmFsaWQoKSAmJiBtX3BWVC0+SXNSaWNoVGV4dCgpKSB7CisgICAgaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKSkgeworICAgICAgRlhfQk9PTCBiU2V0ID0gRkFMU0U7CisgICAgICBDUFZUX1dvcmQgd29yZGluZm87CisgICAgICBDUFZUX1dvcmQgT2xkV29yZGluZm87CiAKLQkJCUNQVlRfV29yZFBsYWNlIG9sZHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOworICAgICAgQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7CiAKLQkJCWlmIChwV29yZFByb3BzKQotCQkJewotCQkJCXBJdGVyYXRvci0+U2V0QXQocGxhY2UpOwotCQkJCWlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZGluZm8pKQotCQkJCXsKLQkJCQkJaWYgKGJBZGRVbmRvKSBPbGRXb3JkaW5mbyA9IHdvcmRpbmZvOworICAgICAgaWYgKHBXb3JkUHJvcHMpIHsKKyAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdChwbGFjZSk7CisgICAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZGluZm8pKSB7CisgICAgICAgICAgaWYgKGJBZGRVbmRvKQorICAgICAgICAgICAgT2xkV29yZGluZm8gPSB3b3JkaW5mbzsKKworICAgICAgICAgIHN3aXRjaCAoZVByb3BzKSB7CisgICAgICAgICAgICBjYXNlIEVQX0ZPTlRJTkRFWDoKKyAgICAgICAgICAgICAgaWYgKHdvcmRpbmZvLldvcmRQcm9wcy5uRm9udEluZGV4ICE9IHBXb3JkUHJvcHMtPm5Gb250SW5kZXgpIHsKKyAgICAgICAgICAgICAgICBpZiAoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXAgPSBHZXRGb250TWFwKCkpIHsKKyAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLldvcmRQcm9wcy5uRm9udEluZGV4ID0gcEZvbnRNYXAtPkdldFdvcmRGb250SW5kZXgoCisgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZCwgd29yZGluZm8ubkNoYXJzZXQsIHBXb3JkUHJvcHMtPm5Gb250SW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRVBfRk9OVFNJWkU6CisgICAgICAgICAgICAgIGlmICghRlhfRURJVF9Jc0Zsb2F0RXF1YWwod29yZGluZm8uV29yZFByb3BzLmZGb250U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV29yZFByb3BzLT5mRm9udFNpemUpKSB7CisgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLmZGb250U2l6ZSA9IHBXb3JkUHJvcHMtPmZGb250U2l6ZTsKKyAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRVBfV09SRENPTE9SOgorICAgICAgICAgICAgICBpZiAod29yZGluZm8uV29yZFByb3BzLmR3V29yZENvbG9yICE9IHBXb3JkUHJvcHMtPmR3V29yZENvbG9yKSB7CisgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLmR3V29yZENvbG9yID0gcFdvcmRQcm9wcy0+ZHdXb3JkQ29sb3I7CisgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVQX1NDUklQVFRZUEU6CisgICAgICAgICAgICAgIGlmICh3b3JkaW5mby5Xb3JkUHJvcHMublNjcmlwdFR5cGUgIT0gcFdvcmRQcm9wcy0+blNjcmlwdFR5cGUpIHsKKyAgICAgICAgICAgICAgICB3b3JkaW5mby5Xb3JkUHJvcHMublNjcmlwdFR5cGUgPSBwV29yZFByb3BzLT5uU2NyaXB0VHlwZTsKKyAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRVBfQ0hBUlNQQUNFOgorICAgICAgICAgICAgICBpZiAoIUZYX0VESVRfSXNGbG9hdEVxdWFsKHdvcmRpbmZvLldvcmRQcm9wcy5mQ2hhclNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JkUHJvcHMtPmZDaGFyU3BhY2UpKSB7CisgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLmZDaGFyU3BhY2UgPSBwV29yZFByb3BzLT5mQ2hhclNwYWNlOworICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFUF9IT1JaU0NBTEU6CisgICAgICAgICAgICAgIGlmICh3b3JkaW5mby5Xb3JkUHJvcHMubkhvcnpTY2FsZSAhPSBwV29yZFByb3BzLT5uSG9yelNjYWxlKSB7CisgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5Ib3J6U2NhbGUgPSBwV29yZFByb3BzLT5uSG9yelNjYWxlOworICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFUF9VTkRFUkxJTkU6CisgICAgICAgICAgICAgIGlmIChwV29yZFByb3BzLT5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9VTkRFUkxJTkUpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9VTkRFUkxJTkUpID09CisgICAgICAgICAgICAgICAgICAgIDApIHsKKyAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlIHw9IFBWVFdPUkRfU1RZTEVfVU5ERVJMSU5FOworICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgod29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX1VOREVSTElORSkgIT0KKyAgICAgICAgICAgICAgICAgICAgMCkgeworICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJj0gflBWVFdPUkRfU1RZTEVfVU5ERVJMSU5FOworICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFUF9DUk9TU09VVDoKKyAgICAgICAgICAgICAgaWYgKHBXb3JkUHJvcHMtPm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0NST1NTT1VUKSB7CisgICAgICAgICAgICAgICAgaWYgKCh3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQpID09CisgICAgICAgICAgICAgICAgICAgIDApIHsKKyAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlIHw9IFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQ7CisgICAgICAgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCh3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQpICE9CisgICAgICAgICAgICAgICAgICAgIDApIHsKKyAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICY9IH5QVlRXT1JEX1NUWUxFX0NST1NTT1VUOworICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFUF9CT0xEOgorICAgICAgICAgICAgICBpZiAocFdvcmRQcm9wcy0+bldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfQk9MRCkgeworICAgICAgICAgICAgICAgIGlmICgod29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0JPTEQpID09IDApIHsKKyAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlIHw9IFBWVFdPUkRfU1RZTEVfQk9MRDsKKyAgICAgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9CT0xEKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICB3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmPSB+UFZUV09SRF9TVFlMRV9CT0xEOworICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFUF9JVEFMSUM6CisgICAgICAgICAgICAgIGlmIChwV29yZFByb3BzLT5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9JVEFMSUMpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9JVEFMSUMpID09CisgICAgICAgICAgICAgICAgICAgIDApIHsKKyAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlIHw9IFBWVFdPUkRfU1RZTEVfSVRBTElDOworICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgod29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0lUQUxJQykgIT0KKyAgICAgICAgICAgICAgICAgICAgMCkgeworICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJj0gflBWVFdPUkRfU1RZTEVfSVRBTElDOworICAgICAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CiAKLQkJCQkJc3dpdGNoKGVQcm9wcykKLQkJCQkJewotCQkJCQljYXNlIEVQX0ZPTlRJTkRFWDoJCQkJCi0JCQkJCQlpZiAod29yZGluZm8uV29yZFByb3BzLm5Gb250SW5kZXggIT0gcFdvcmRQcm9wcy0+bkZvbnRJbmRleCkKLQkJCQkJCXsKLQkJCQkJCQlpZiAoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXAgPSB0aGlzLT5HZXRGb250TWFwKCkpCi0JCQkJCQkJewotCQkJCQkJCQl3b3JkaW5mby5Xb3JkUHJvcHMubkZvbnRJbmRleCA9IHBGb250TWFwLT5HZXRXb3JkRm9udEluZGV4KHdvcmRpbmZvLldvcmQsd29yZGluZm8ubkNoYXJzZXQscFdvcmRQcm9wcy0+bkZvbnRJbmRleCk7Ci0JCQkJCQkJfQotCQkJCQkJCWJTZXQgPSBUUlVFOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgRVBfRk9OVFNJWkU6Ci0JCQkJCQlpZiAoIUZYX0VESVRfSXNGbG9hdEVxdWFsKHdvcmRpbmZvLldvcmRQcm9wcy5mRm9udFNpemUscFdvcmRQcm9wcy0+ZkZvbnRTaXplKSkKLQkJCQkJCXsKLQkJCQkJCQl3b3JkaW5mby5Xb3JkUHJvcHMuZkZvbnRTaXplID0gcFdvcmRQcm9wcy0+ZkZvbnRTaXplOwotCQkJCQkJCWJTZXQgPSBUUlVFOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgRVBfV09SRENPTE9SOgotCQkJCQkJaWYgKHdvcmRpbmZvLldvcmRQcm9wcy5kd1dvcmRDb2xvciAhPSBwV29yZFByb3BzLT5kd1dvcmRDb2xvcikKLQkJCQkJCXsKLQkJCQkJCQl3b3JkaW5mby5Xb3JkUHJvcHMuZHdXb3JkQ29sb3IgPSBwV29yZFByb3BzLT5kd1dvcmRDb2xvcjsKLQkJCQkJCQliU2V0ID0gVFJVRTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEVQX1NDUklQVFRZUEU6Ci0JCQkJCQlpZiAod29yZGluZm8uV29yZFByb3BzLm5TY3JpcHRUeXBlICE9IHBXb3JkUHJvcHMtPm5TY3JpcHRUeXBlKQotCQkJCQkJewotCQkJCQkJCXdvcmRpbmZvLldvcmRQcm9wcy5uU2NyaXB0VHlwZSA9IHBXb3JkUHJvcHMtPm5TY3JpcHRUeXBlOwotCQkJCQkJCWJTZXQgPSBUUlVFOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgRVBfQ0hBUlNQQUNFOgotCQkJCQkJaWYgKCFGWF9FRElUX0lzRmxvYXRFcXVhbCh3b3JkaW5mby5Xb3JkUHJvcHMuZkNoYXJTcGFjZSxwV29yZFByb3BzLT5mQ2hhclNwYWNlKSkKLQkJCQkJCXsKLQkJCQkJCQl3b3JkaW5mby5Xb3JkUHJvcHMuZkNoYXJTcGFjZSA9IHBXb3JkUHJvcHMtPmZDaGFyU3BhY2U7Ci0JCQkJCQkJYlNldCA9IFRSVUU7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBFUF9IT1JaU0NBTEU6Ci0JCQkJCQlpZiAod29yZGluZm8uV29yZFByb3BzLm5Ib3J6U2NhbGUgIT0gcFdvcmRQcm9wcy0+bkhvcnpTY2FsZSkKLQkJCQkJCXsKLQkJCQkJCQl3b3JkaW5mby5Xb3JkUHJvcHMubkhvcnpTY2FsZSA9IHBXb3JkUHJvcHMtPm5Ib3J6U2NhbGU7Ci0JCQkJCQkJYlNldCA9IFRSVUU7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBFUF9VTkRFUkxJTkU6Ci0JCQkJCQlpZiAocFdvcmRQcm9wcy0+bldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfVU5ERVJMSU5FKQotCQkJCQkJewotCQkJCQkJCWlmICgod29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX1VOREVSTElORSkgPT0gMCkKLQkJCQkJCQl7Ci0JCQkJCQkJCXdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlIHw9IFBWVFdPUkRfU1RZTEVfVU5ERVJMSU5FOwotCQkJCQkJCQliU2V0ID0gVFJVRTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJaWYgKCh3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfVU5ERVJMSU5FKSAhPSAwKQotCQkJCQkJCXsKLQkJCQkJCQkJd29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJj0gflBWVFdPUkRfU1RZTEVfVU5ERVJMSU5FOwotCQkJCQkJCQliU2V0ID0gVFJVRTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBFUF9DUk9TU09VVDoKLQkJCQkJCWlmIChwV29yZFByb3BzLT5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9DUk9TU09VVCkKLQkJCQkJCXsKLQkJCQkJCQlpZiAoKHdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9DUk9TU09VVCkgPT0gMCkKLQkJCQkJCQl7Ci0JCQkJCQkJCXdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlIHw9IFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQ7IAotCQkJCQkJCQliU2V0ID0gVFJVRTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJaWYgKCh3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfQ1JPU1NPVVQpICE9IDApCi0JCQkJCQkJewotCQkJCQkJCQl3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmPSB+UFZUV09SRF9TVFlMRV9DUk9TU09VVDsKLQkJCQkJCQkJYlNldCA9IFRSVUU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgRVBfQk9MRDoKLQkJCQkJCWlmIChwV29yZFByb3BzLT5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9CT0xEKQotCQkJCQkJewotCQkJCQkJCWlmICgod29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0JPTEQpID09IDApCi0JCQkJCQkJewotCQkJCQkJCQl3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSB8PSBQVlRXT1JEX1NUWUxFX0JPTEQ7IAotCQkJCQkJCQliU2V0ID0gVFJVRTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJaWYgKCh3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfQk9MRCkgIT0gMCkKLQkJCQkJCQl7Ci0JCQkJCQkJCXdvcmRpbmZvLldvcmRQcm9wcy5uV29yZFN0eWxlICY9IH5QVlRXT1JEX1NUWUxFX0JPTEQ7Ci0JCQkJCQkJCWJTZXQgPSBUUlVFOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEVQX0lUQUxJQzoKLQkJCQkJCWlmIChwV29yZFByb3BzLT5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9JVEFMSUMpCi0JCQkJCQl7Ci0JCQkJCQkJaWYgKCh3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfSVRBTElDKSA9PSAwKQotCQkJCQkJCXsKLQkJCQkJCQkJd29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgfD0gUFZUV09SRF9TVFlMRV9JVEFMSUM7IAotCQkJCQkJCQliU2V0ID0gVFJVRTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJaWYgKCh3b3JkaW5mby5Xb3JkUHJvcHMubldvcmRTdHlsZSAmIFBWVFdPUkRfU1RZTEVfSVRBTElDKSAhPSAwKQotCQkJCQkJCXsKLQkJCQkJCQkJd29yZGluZm8uV29yZFByb3BzLm5Xb3JkU3R5bGUgJj0gflBWVFdPUkRfU1RZTEVfSVRBTElDOwotCQkJCQkJCQliU2V0ID0gVFJVRTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQkKKyAgICAgIGlmIChiU2V0KSB7CisgICAgICAgIHBJdGVyYXRvci0+U2V0V29yZCh3b3JkaW5mbyk7CiAKLQkJCWlmIChiU2V0KQotCQkJewotCQkJCXBJdGVyYXRvci0+U2V0V29yZCh3b3JkaW5mbyk7CisgICAgICAgIGlmIChiQWRkVW5kbyAmJiBtX2JFbmFibGVVbmRvKSB7CisgICAgICAgICAgQWRkRWRpdFVuZG9JdGVtKG5ldyBDRlhFVV9TZXRXb3JkUHJvcHModGhpcywgcGxhY2UsIGVQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbGRXb3JkaW5mby5Xb3JkUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8uV29yZFByb3BzLCB3cikpOworICAgICAgICB9CisgICAgICB9CiAKLQkJCQlpZiAoYkFkZFVuZG8gJiYgbV9iRW5hYmxlVW5kbykKLQkJCQl7Ci0JCQkJCUFkZEVkaXRVbmRvSXRlbShuZXcgQ0ZYRVVfU2V0V29yZFByb3BzCi0JCQkJCQkodGhpcyxwbGFjZSxlUHJvcHMsT2xkV29yZGluZm8uV29yZFByb3BzLHdvcmRpbmZvLldvcmRQcm9wcyx3cikpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJcEl0ZXJhdG9yLT5TZXRBdChvbGRwbGFjZSk7Ci0JCQlyZXR1cm4gYlNldDsKLQkJfQotCX0KKyAgICAgIHBJdGVyYXRvci0+U2V0QXQob2xkcGxhY2UpOworICAgICAgcmV0dXJuIGJTZXQ7CisgICAgfQorICB9CiAKLQlyZXR1cm4gRkFMU0U7CisgIHJldHVybiBGQUxTRTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0VGV4dChGWF9MUENXU1RSIHRleHQsRlhfSU5UMzIgY2hhcnNldCAvKj0gREVGQVVMVF9DSEFSU0VUKi8sCi0JCQkJCQljb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzIC8qPSBOVUxMKi8sY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzIC8qPSBOVUxMKi8pCi17Ci0JU2V0VGV4dCh0ZXh0LGNoYXJzZXQscFNlY1Byb3BzLHBXb3JkUHJvcHMsVFJVRSxUUlVFKTsKK3ZvaWQgQ0ZYX0VkaXQ6OlNldFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcykgeworICBTZXRUZXh0KHRleHQsIGNoYXJzZXQsIHBTZWNQcm9wcywgcFdvcmRQcm9wcywgVFJVRSwgVFJVRSk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6Okluc2VydFdvcmQoRlhfV09SRCB3b3JkLCBGWF9JTlQzMiBjaGFyc2V0IC8qPSBERUZBVUxUX0NIQVJTRVQqLywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgKiBwV29yZFByb3BzIC8qPSBOVUxMKi8pCi17Ci0JcmV0dXJuIEluc2VydFdvcmQod29yZCxjaGFyc2V0LHBXb3JkUHJvcHMsVFJVRSxUUlVFKTsKK0ZYX0JPT0wgQ0ZYX0VkaXQ6Okluc2VydFdvcmQoRlhfV09SRCB3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzKSB7CisgIHJldHVybiBJbnNlcnRXb3JkKHdvcmQsIGNoYXJzZXQsIHBXb3JkUHJvcHMsIFRSVUUsIFRSVUUpOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpJbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyAvKj0gTlVMTCovLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyAvKj0gTlVMTCovKQotewotCXJldHVybiBJbnNlcnRSZXR1cm4ocFNlY1Byb3BzLHBXb3JkUHJvcHMsVFJVRSxUUlVFKTsKK0ZYX0JPT0wgQ0ZYX0VkaXQ6Okluc2VydFJldHVybihjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMpIHsKKyAgcmV0dXJuIEluc2VydFJldHVybihwU2VjUHJvcHMsIHBXb3JkUHJvcHMsIFRSVUUsIFRSVUUpOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpCYWNrc3BhY2UoKQotewotCXJldHVybiBCYWNrc3BhY2UoVFJVRSxUUlVFKTsKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OkJhY2tzcGFjZSgpIHsKKyAgcmV0dXJuIEJhY2tzcGFjZShUUlVFLCBUUlVFKTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6RGVsZXRlKCkKLXsKLQlyZXR1cm4gRGVsZXRlKFRSVUUsVFJVRSk7CitGWF9CT09MIENGWF9FZGl0OjpEZWxldGUoKSB7CisgIHJldHVybiBEZWxldGUoVFJVRSwgVFJVRSk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OkNsZWFyKCkKLXsKLQlyZXR1cm4gQ2xlYXIoVFJVRSxUUlVFKTsKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OkNsZWFyKCkgeworICByZXR1cm4gQ2xlYXIoVFJVRSwgVFJVRSk7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6Okluc2VydFRleHQoRlhfTFBDV1NUUiB0ZXh0LCBGWF9JTlQzMiBjaGFyc2V0IC8qPSBERUZBVUxUX0NIQVJTRVQqLywKLQkJCQkJCQkJY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyAvKj0gTlVMTCovLGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcyAvKj0gTlVMTCovKQotewotCXJldHVybiBJbnNlcnRUZXh0KHRleHQsY2hhcnNldCxwU2VjUHJvcHMscFdvcmRQcm9wcyxUUlVFLFRSVUUpOworRlhfQk9PTCBDRlhfRWRpdDo6SW5zZXJ0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzKSB7CisgIHJldHVybiBJbnNlcnRUZXh0KHRleHQsIGNoYXJzZXQsIHBTZWNQcm9wcywgcFdvcmRQcm9wcywgVFJVRSwgVFJVRSk7CiB9CiAKLUZYX0ZMT0FUIENGWF9FZGl0OjpHZXRGb250U2l6ZSgpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fcFZULT5HZXRGb250U2l6ZSgpOworRlhfRkxPQVQgQ0ZYX0VkaXQ6OkdldEZvbnRTaXplKCkgY29uc3QgeworICByZXR1cm4gbV9wVlQtPkdldEZvbnRTaXplKCk7CiB9CiAKLUZYX1dPUkQgQ0ZYX0VkaXQ6OkdldFBhc3N3b3JkQ2hhcigpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fcFZULT5HZXRQYXNzd29yZENoYXIoKTsKK0ZYX1dPUkQgQ0ZYX0VkaXQ6OkdldFBhc3N3b3JkQ2hhcigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcFZULT5HZXRQYXNzd29yZENoYXIoKTsKIH0KIAotRlhfSU5UMzIgQ0ZYX0VkaXQ6OkdldENoYXJBcnJheSgpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fcFZULT5HZXRDaGFyQXJyYXkoKTsKK2ludDMyX3QgQ0ZYX0VkaXQ6OkdldENoYXJBcnJheSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcFZULT5HZXRDaGFyQXJyYXkoKTsKIH0KIAotQ1BERl9SZWN0IENGWF9FZGl0OjpHZXRQbGF0ZVJlY3QoKSBjb25zdAotewotCXJldHVybiBtX3BWVC0+R2V0UGxhdGVSZWN0KCk7CitDUERGX1JlY3QgQ0ZYX0VkaXQ6OkdldFBsYXRlUmVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcFZULT5HZXRQbGF0ZVJlY3QoKTsKIH0KIAotQ1BERl9SZWN0IENGWF9FZGl0OjpHZXRDb250ZW50UmVjdCgpIGNvbnN0Ci17Ci0JcmV0dXJuIFZUVG9FZGl0KG1fcFZULT5HZXRDb250ZW50UmVjdCgpKTsKK0NQREZfUmVjdCBDRlhfRWRpdDo6R2V0Q29udGVudFJlY3QoKSBjb25zdCB7CisgIHJldHVybiBWVFRvRWRpdChtX3BWVC0+R2V0Q29udGVudFJlY3QoKSk7CiB9CiAKLUZYX0lOVDMyIENGWF9FZGl0OjpHZXRIb3J6U2NhbGUoKSBjb25zdAotewotCXJldHVybiBtX3BWVC0+R2V0SG9yelNjYWxlKCk7CitpbnQzMl90IENGWF9FZGl0OjpHZXRIb3J6U2NhbGUoKSBjb25zdCB7CisgIHJldHVybiBtX3BWVC0+R2V0SG9yelNjYWxlKCk7CiB9CiAKLUZYX0ZMT0FUIENGWF9FZGl0OjpHZXRDaGFyU3BhY2UoKSBjb25zdAotewotCXJldHVybiBtX3BWVC0+R2V0Q2hhclNwYWNlKCk7CitGWF9GTE9BVCBDRlhfRWRpdDo6R2V0Q2hhclNwYWNlKCkgY29uc3QgeworICByZXR1cm4gbV9wVlQtPkdldENoYXJTcGFjZSgpOwogfQogCi0vLyBpbm5lciBtZXRob2RzCitDUFZUX1dvcmRSYW5nZSBDRlhfRWRpdDo6R2V0V2hvbGVXb3JkUmFuZ2UoKSBjb25zdCB7CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQorICAgIHJldHVybiBDUFZUX1dvcmRSYW5nZShtX3BWVC0+R2V0QmVnaW5Xb3JkUGxhY2UoKSwgbV9wVlQtPkdldEVuZFdvcmRQbGFjZSgpKTsKIAotQ1BWVF9Xb3JkUmFuZ2UgQ0ZYX0VkaXQ6OkdldFdob2xlV29yZFJhbmdlKCkgY29uc3QKLXsKLQlpZiAobV9wVlQtPklzVmFsaWQoKSkKLQkJcmV0dXJuIENQVlRfV29yZFJhbmdlKG1fcFZULT5HZXRCZWdpbldvcmRQbGFjZSgpLG1fcFZULT5HZXRFbmRXb3JkUGxhY2UoKSk7Ci0KLQlyZXR1cm4gQ1BWVF9Xb3JkUmFuZ2UoKTsKKyAgcmV0dXJuIENQVlRfV29yZFJhbmdlKCk7CiB9CiAKLUNQVlRfV29yZFJhbmdlIENGWF9FZGl0OjpHZXRWaXNpYmxlV29yZFJhbmdlKCkgY29uc3QKLXsKLQlpZiAobV9iRW5hYmxlT3ZlcmZsb3cpIHJldHVybiBHZXRXaG9sZVdvcmRSYW5nZSgpOworQ1BWVF9Xb3JkUmFuZ2UgQ0ZYX0VkaXQ6OkdldFZpc2libGVXb3JkUmFuZ2UoKSBjb25zdCB7CisgIGlmIChtX2JFbmFibGVPdmVyZmxvdykKKyAgICByZXR1cm4gR2V0V2hvbGVXb3JkUmFuZ2UoKTsKIAotCWlmIChtX3BWVC0+SXNWYWxpZCgpKQotCXsKLQkJQ1BERl9SZWN0IHJjUGxhdGUgPSBtX3BWVC0+R2V0UGxhdGVSZWN0KCk7CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7CisgICAgQ1BERl9SZWN0IHJjUGxhdGUgPSBtX3BWVC0+R2V0UGxhdGVSZWN0KCk7CiAKLQkJQ1BWVF9Xb3JkUGxhY2UgcGxhY2UxID0gbV9wVlQtPlNlYXJjaFdvcmRQbGFjZShFZGl0VG9WVChDUERGX1BvaW50KHJjUGxhdGUubGVmdCxyY1BsYXRlLnRvcCkpKTsKLQkJQ1BWVF9Xb3JkUGxhY2UgcGxhY2UyID0gbV9wVlQtPlNlYXJjaFdvcmRQbGFjZShFZGl0VG9WVChDUERGX1BvaW50KHJjUGxhdGUucmlnaHQscmNQbGF0ZS5ib3R0b20pKSk7CisgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UxID0KKyAgICAgICAgbV9wVlQtPlNlYXJjaFdvcmRQbGFjZShFZGl0VG9WVChDUERGX1BvaW50KHJjUGxhdGUubGVmdCwgcmNQbGF0ZS50b3ApKSk7CisgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UyID0gbV9wVlQtPlNlYXJjaFdvcmRQbGFjZSgKKyAgICAgICAgRWRpdFRvVlQoQ1BERl9Qb2ludChyY1BsYXRlLnJpZ2h0LCByY1BsYXRlLmJvdHRvbSkpKTsKIAotCQlyZXR1cm4gQ1BWVF9Xb3JkUmFuZ2UocGxhY2UxLHBsYWNlMik7Ci0JfQorICAgIHJldHVybiBDUFZUX1dvcmRSYW5nZShwbGFjZTEsIHBsYWNlMik7CisgIH0KIAotCXJldHVybiBDUFZUX1dvcmRSYW5nZSgpOworICByZXR1cm4gQ1BWVF9Xb3JkUmFuZ2UoKTsKIH0KIAotQ1BWVF9Xb3JkUGxhY2UgQ0ZYX0VkaXQ6OlNlYXJjaFdvcmRQbGFjZShjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3QKLXsKLQlpZiAobV9wVlQtPklzVmFsaWQoKSkKLQl7Ci0JCXJldHVybiBtX3BWVC0+U2VhcmNoV29yZFBsYWNlKEVkaXRUb1ZUKHBvaW50KSk7Ci0JfQorQ1BWVF9Xb3JkUGxhY2UgQ0ZYX0VkaXQ6OlNlYXJjaFdvcmRQbGFjZShjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3QgeworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIHJldHVybiBtX3BWVC0+U2VhcmNoV29yZFBsYWNlKEVkaXRUb1ZUKHBvaW50KSk7CisgIH0KIAotCXJldHVybiBDUFZUX1dvcmRQbGFjZSgpOworICByZXR1cm4gQ1BWVF9Xb3JkUGxhY2UoKTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6UGFpbnQoKQotewotCWlmIChtX3BWVC0+SXNWYWxpZCgpKQotCXsKLQkJUmVhcnJhbmdlQWxsKCk7Ci0JCVNjcm9sbFRvQ2FyZXQoKTsKLQkJUmVmcmVzaChSUF9OT0FOQUxZU0UpOwotCQlTZXRDYXJldE9yaWdpbigpOwotCQlTZXRDYXJldEluZm8oKTsKLQl9Cit2b2lkIENGWF9FZGl0OjpQYWludCgpIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBSZWFycmFuZ2VBbGwoKTsKKyAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgUmVmcmVzaChSUF9OT0FOQUxZU0UpOworICAgIFNldENhcmV0T3JpZ2luKCk7CisgICAgU2V0Q2FyZXRJbmZvKCk7CisgIH0KIH0KIAotdm9pZCBDRlhfRWRpdDo6UmVhcnJhbmdlQWxsKCkKLXsKLQlpZiAobV9wVlQtPklzVmFsaWQoKSkKLQl7Ci0JCW1fcFZULT5VcGRhdGVXb3JkUGxhY2UobV93cENhcmV0KTsKLQkJbV9wVlQtPlJlYXJyYW5nZUFsbCgpOwotCQltX3BWVC0+VXBkYXRlV29yZFBsYWNlKG1fd3BDYXJldCk7Ci0JCVNldFNjcm9sbEluZm8oKTsKLQkJU2V0Q29udGVudENoYW5nZWQoKTsKLQl9Cit2b2lkIENGWF9FZGl0OjpSZWFycmFuZ2VBbGwoKSB7CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7CisgICAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZShtX3dwQ2FyZXQpOworICAgIG1fcFZULT5SZWFycmFuZ2VBbGwoKTsKKyAgICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKG1fd3BDYXJldCk7CisgICAgU2V0U2Nyb2xsSW5mbygpOworICAgIFNldENvbnRlbnRDaGFuZ2VkKCk7CisgIH0KIH0KIAotdm9pZCBDRlhfRWRpdDo6UmVhcnJhbmdlUGFydChjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHJhbmdlKQotewotCWlmIChtX3BWVC0+SXNWYWxpZCgpKQotCXsKLQkJbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZShtX3dwQ2FyZXQpOwotCQltX3BWVC0+UmVhcnJhbmdlUGFydChyYW5nZSk7Ci0JCW1fcFZULT5VcGRhdGVXb3JkUGxhY2UobV93cENhcmV0KTsKLQkJU2V0U2Nyb2xsSW5mbygpOwotCQlTZXRDb250ZW50Q2hhbmdlZCgpOwotCX0KK3ZvaWQgQ0ZYX0VkaXQ6OlJlYXJyYW5nZVBhcnQoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHJhbmdlKSB7CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7CisgICAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZShtX3dwQ2FyZXQpOworICAgIG1fcFZULT5SZWFycmFuZ2VQYXJ0KHJhbmdlKTsKKyAgICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKG1fd3BDYXJldCk7CisgICAgU2V0U2Nyb2xsSW5mbygpOworICAgIFNldENvbnRlbnRDaGFuZ2VkKCk7CisgIH0KIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0Q29udGVudENoYW5nZWQoKQotewotCWlmIChtX2JOb3RpZnkgJiYgbV9wTm90aWZ5KQotCXsKLQkJQ1BERl9SZWN0IHJjQ29udGVudCA9IG1fcFZULT5HZXRDb250ZW50UmVjdCgpOwotCQlpZiAocmNDb250ZW50LldpZHRoKCkgIT0gbV9yY09sZENvbnRlbnQuV2lkdGgoKSB8fAotCQkJcmNDb250ZW50LkhlaWdodCgpICE9IG1fcmNPbGRDb250ZW50LkhlaWdodCgpKQotCQl7Ci0JCQlpZiAoIW1fYk5vdGlmeUZsYWcpCi0JCQl7Ci0JCQkJbV9iTm90aWZ5RmxhZyA9IFRSVUU7Ci0JCQkJbV9wTm90aWZ5LT5JT25Db250ZW50Q2hhbmdlKHJjQ29udGVudCk7Ci0JCQkJbV9iTm90aWZ5RmxhZyA9IEZBTFNFOwotCQkJfQotCQkJbV9yY09sZENvbnRlbnQgPSByY0NvbnRlbnQ7Ci0JCX0KLQl9Cit2b2lkIENGWF9FZGl0OjpTZXRDb250ZW50Q2hhbmdlZCgpIHsKKyAgaWYgKG1fYk5vdGlmeSAmJiBtX3BOb3RpZnkpIHsKKyAgICBDUERGX1JlY3QgcmNDb250ZW50ID0gbV9wVlQtPkdldENvbnRlbnRSZWN0KCk7CisgICAgaWYgKHJjQ29udGVudC5XaWR0aCgpICE9IG1fcmNPbGRDb250ZW50LldpZHRoKCkgfHwKKyAgICAgICAgcmNDb250ZW50LkhlaWdodCgpICE9IG1fcmNPbGRDb250ZW50LkhlaWdodCgpKSB7CisgICAgICBpZiAoIW1fYk5vdGlmeUZsYWcpIHsKKyAgICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7CisgICAgICAgIG1fcE5vdGlmeS0+SU9uQ29udGVudENoYW5nZShyY0NvbnRlbnQpOworICAgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7CisgICAgICB9CisgICAgICBtX3JjT2xkQ29udGVudCA9IHJjQ29udGVudDsKKyAgICB9CisgIH0KIH0KIAotdm9pZCBDRlhfRWRpdDo6U2VsZWN0QWxsKCkKLXsKLQlpZiAobV9wVlQtPklzVmFsaWQoKSkKLQl7Ci0JCW1fU2VsU3RhdGUgPSBHZXRXaG9sZVdvcmRSYW5nZSgpOwkJCi0JCVNldENhcmV0KG1fU2VsU3RhdGUuRW5kUG9zKTsJCQotCQkKLQkJU2Nyb2xsVG9DYXJldCgpOwotCQlDUFZUX1dvcmRSYW5nZSB3clZpc2libGUgPSBHZXRWaXNpYmxlV29yZFJhbmdlKCk7Ci0JCVJlZnJlc2goUlBfT1BUSU9OQUwsJndyVmlzaWJsZSk7Ci0JCVNldENhcmV0SW5mbygpOwotCX0KK3ZvaWQgQ0ZYX0VkaXQ6OlNlbGVjdEFsbCgpIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBtX1NlbFN0YXRlID0gQ0ZYX0VkaXRfU2VsZWN0KEdldFdob2xlV29yZFJhbmdlKCkpOworICAgIFNldENhcmV0KG1fU2VsU3RhdGUuRW5kUG9zKTsKKworICAgIFNjcm9sbFRvQ2FyZXQoKTsKKyAgICBDUFZUX1dvcmRSYW5nZSB3clZpc2libGUgPSBHZXRWaXNpYmxlV29yZFJhbmdlKCk7CisgICAgUmVmcmVzaChSUF9PUFRJT05BTCwgJndyVmlzaWJsZSk7CisgICAgU2V0Q2FyZXRJbmZvKCk7CisgIH0KIH0KIAotdm9pZCBDRlhfRWRpdDo6U2VsZWN0Tm9uZSgpCi17Ci0JaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCi0JewotCQlpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpCi0JCXsKLQkJCUNQVlRfV29yZFJhbmdlIHdyVGVtcCA9IG1fU2VsU3RhdGUuQ29udmVydFRvV29yZFJhbmdlKCk7Ci0JCQltX1NlbFN0YXRlLkRlZmF1bHQoKTsKLQkJCVJlZnJlc2goUlBfT1BUSU9OQUwsJndyVGVtcCk7Ci0JCX0KLQl9CQordm9pZCBDRlhfRWRpdDo6U2VsZWN0Tm9uZSgpIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpIHsKKyAgICAgIENQVlRfV29yZFJhbmdlIHdyVGVtcCA9IG1fU2VsU3RhdGUuQ29udmVydFRvV29yZFJhbmdlKCk7CisgICAgICBtX1NlbFN0YXRlLkRlZmF1bHQoKTsKKyAgICAgIFJlZnJlc2goUlBfT1BUSU9OQUwsICZ3clRlbXApOworICAgIH0KKyAgfQogfQogCi1GWF9CT09MCUNGWF9FZGl0OjpJc1NlbGVjdGVkKCkgY29uc3QKLXsKLQlyZXR1cm4gbV9TZWxTdGF0ZS5Jc0V4aXN0KCk7CitGWF9CT09MIENGWF9FZGl0OjpJc1NlbGVjdGVkKCkgY29uc3QgeworICByZXR1cm4gbV9TZWxTdGF0ZS5Jc0V4aXN0KCk7CiB9CiAKLUNQREZfUG9pbnQgQ0ZYX0VkaXQ6OlZUVG9FZGl0KGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3QKLXsKLQlDUERGX1JlY3QgcmNDb250ZW50ID0gbV9wVlQtPkdldENvbnRlbnRSZWN0KCk7Ci0JQ1BERl9SZWN0IHJjUGxhdGUgPSBtX3BWVC0+R2V0UGxhdGVSZWN0KCk7CitDUERGX1BvaW50IENGWF9FZGl0OjpWVFRvRWRpdChjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3QgeworICBDUERGX1JlY3QgcmNDb250ZW50ID0gbV9wVlQtPkdldENvbnRlbnRSZWN0KCk7CisgIENQREZfUmVjdCByY1BsYXRlID0gbV9wVlQtPkdldFBsYXRlUmVjdCgpOwogCi0JRlhfRkxPQVQgZlBhZGRpbmcgPSAwLjBmOworICBGWF9GTE9BVCBmUGFkZGluZyA9IDAuMGY7CiAKLQlzd2l0Y2ggKG1fbkFsaWdubWVudCkKLQl7Ci0JY2FzZSAwOgotCQlmUGFkZGluZyA9IDAuMGY7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJZlBhZGRpbmcgPSAocmNQbGF0ZS5IZWlnaHQoKSAtIHJjQ29udGVudC5IZWlnaHQoKSkgKiAwLjVmOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCWZQYWRkaW5nID0gcmNQbGF0ZS5IZWlnaHQoKSAtIHJjQ29udGVudC5IZWlnaHQoKTsKLQkJYnJlYWs7Ci0JfQotCQotCXJldHVybiBDUERGX1BvaW50KHBvaW50LnggLSAobV9wdFNjcm9sbFBvcy54IC0gcmNQbGF0ZS5sZWZ0KSwKLQkJcG9pbnQueSAtIChtX3B0U2Nyb2xsUG9zLnkgKyBmUGFkZGluZyAtIHJjUGxhdGUudG9wKSk7CisgIHN3aXRjaCAobV9uQWxpZ25tZW50KSB7CisgICAgY2FzZSAwOgorICAgICAgZlBhZGRpbmcgPSAwLjBmOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgZlBhZGRpbmcgPSAocmNQbGF0ZS5IZWlnaHQoKSAtIHJjQ29udGVudC5IZWlnaHQoKSkgKiAwLjVmOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgZlBhZGRpbmcgPSByY1BsYXRlLkhlaWdodCgpIC0gcmNDb250ZW50LkhlaWdodCgpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gQ1BERl9Qb2ludChwb2ludC54IC0gKG1fcHRTY3JvbGxQb3MueCAtIHJjUGxhdGUubGVmdCksCisgICAgICAgICAgICAgICAgICAgIHBvaW50LnkgLSAobV9wdFNjcm9sbFBvcy55ICsgZlBhZGRpbmcgLSByY1BsYXRlLnRvcCkpOwogfQogCi1DUERGX1BvaW50IENGWF9FZGl0OjpFZGl0VG9WVChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0Ci17Ci0JQ1BERl9SZWN0IHJjQ29udGVudCA9IG1fcFZULT5HZXRDb250ZW50UmVjdCgpOwotCUNQREZfUmVjdCByY1BsYXRlID0gbV9wVlQtPkdldFBsYXRlUmVjdCgpOworQ1BERl9Qb2ludCBDRlhfRWRpdDo6RWRpdFRvVlQoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0IHsKKyAgQ1BERl9SZWN0IHJjQ29udGVudCA9IG1fcFZULT5HZXRDb250ZW50UmVjdCgpOworICBDUERGX1JlY3QgcmNQbGF0ZSA9IG1fcFZULT5HZXRQbGF0ZVJlY3QoKTsKIAotCUZYX0ZMT0FUIGZQYWRkaW5nID0gMC4wZjsKKyAgRlhfRkxPQVQgZlBhZGRpbmcgPSAwLjBmOwogCi0Jc3dpdGNoIChtX25BbGlnbm1lbnQpCi0JewotCWNhc2UgMDoKLQkJZlBhZGRpbmcgPSAwLjBmOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCWZQYWRkaW5nID0gKHJjUGxhdGUuSGVpZ2h0KCkgLSByY0NvbnRlbnQuSGVpZ2h0KCkpICogMC41ZjsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlmUGFkZGluZyA9IHJjUGxhdGUuSGVpZ2h0KCkgLSByY0NvbnRlbnQuSGVpZ2h0KCk7Ci0JCWJyZWFrOwotCX0KKyAgc3dpdGNoIChtX25BbGlnbm1lbnQpIHsKKyAgICBjYXNlIDA6CisgICAgICBmUGFkZGluZyA9IDAuMGY7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBmUGFkZGluZyA9IChyY1BsYXRlLkhlaWdodCgpIC0gcmNDb250ZW50LkhlaWdodCgpKSAqIDAuNWY7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBmUGFkZGluZyA9IHJjUGxhdGUuSGVpZ2h0KCkgLSByY0NvbnRlbnQuSGVpZ2h0KCk7CisgICAgICBicmVhazsKKyAgfQogCi0JcmV0dXJuIENQREZfUG9pbnQocG9pbnQueCArIChtX3B0U2Nyb2xsUG9zLnggLSByY1BsYXRlLmxlZnQpLAotCQlwb2ludC55ICsgKG1fcHRTY3JvbGxQb3MueSArIGZQYWRkaW5nIC0gcmNQbGF0ZS50b3ApKTsKKyAgcmV0dXJuIENQREZfUG9pbnQocG9pbnQueCArIChtX3B0U2Nyb2xsUG9zLnggLSByY1BsYXRlLmxlZnQpLAorICAgICAgICAgICAgICAgICAgICBwb2ludC55ICsgKG1fcHRTY3JvbGxQb3MueSArIGZQYWRkaW5nIC0gcmNQbGF0ZS50b3ApKTsKIH0KIAotQ1BERl9SZWN0IENGWF9FZGl0OjpWVFRvRWRpdChjb25zdCBDUERGX1JlY3QgJiByZWN0KSBjb25zdAotewotCUNQREZfUG9pbnQgcHRMZWZ0Qm90dG9tID0gVlRUb0VkaXQoQ1BERl9Qb2ludChyZWN0LmxlZnQscmVjdC5ib3R0b20pKTsKLQlDUERGX1BvaW50IHB0UmlnaHRUb3AgPSBWVFRvRWRpdChDUERGX1BvaW50KHJlY3QucmlnaHQscmVjdC50b3ApKTsKK0NQREZfUmVjdCBDRlhfRWRpdDo6VlRUb0VkaXQoY29uc3QgQ1BERl9SZWN0JiByZWN0KSBjb25zdCB7CisgIENQREZfUG9pbnQgcHRMZWZ0Qm90dG9tID0gVlRUb0VkaXQoQ1BERl9Qb2ludChyZWN0LmxlZnQsIHJlY3QuYm90dG9tKSk7CisgIENQREZfUG9pbnQgcHRSaWdodFRvcCA9IFZUVG9FZGl0KENQREZfUG9pbnQocmVjdC5yaWdodCwgcmVjdC50b3ApKTsKIAotCXJldHVybiBDUERGX1JlY3QocHRMZWZ0Qm90dG9tLngscHRMZWZ0Qm90dG9tLnkscHRSaWdodFRvcC54LHB0UmlnaHRUb3AueSk7CisgIHJldHVybiBDUERGX1JlY3QocHRMZWZ0Qm90dG9tLngsIHB0TGVmdEJvdHRvbS55LCBwdFJpZ2h0VG9wLngsIHB0UmlnaHRUb3AueSk7CiB9CiAKLUNQREZfUmVjdCBDRlhfRWRpdDo6RWRpdFRvVlQoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkgY29uc3QKLXsKLQlDUERGX1BvaW50IHB0TGVmdEJvdHRvbSA9IEVkaXRUb1ZUKENQREZfUG9pbnQocmVjdC5sZWZ0LHJlY3QuYm90dG9tKSk7Ci0JQ1BERl9Qb2ludCBwdFJpZ2h0VG9wID0gRWRpdFRvVlQoQ1BERl9Qb2ludChyZWN0LnJpZ2h0LHJlY3QudG9wKSk7CitDUERGX1JlY3QgQ0ZYX0VkaXQ6OkVkaXRUb1ZUKGNvbnN0IENQREZfUmVjdCYgcmVjdCkgY29uc3QgeworICBDUERGX1BvaW50IHB0TGVmdEJvdHRvbSA9IEVkaXRUb1ZUKENQREZfUG9pbnQocmVjdC5sZWZ0LCByZWN0LmJvdHRvbSkpOworICBDUERGX1BvaW50IHB0UmlnaHRUb3AgPSBFZGl0VG9WVChDUERGX1BvaW50KHJlY3QucmlnaHQsIHJlY3QudG9wKSk7CiAKLQlyZXR1cm4gQ1BERl9SZWN0KHB0TGVmdEJvdHRvbS54LHB0TGVmdEJvdHRvbS55LHB0UmlnaHRUb3AueCxwdFJpZ2h0VG9wLnkpOworICByZXR1cm4gQ1BERl9SZWN0KHB0TGVmdEJvdHRvbS54LCBwdExlZnRCb3R0b20ueSwgcHRSaWdodFRvcC54LCBwdFJpZ2h0VG9wLnkpOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRTY3JvbGxJbmZvKCkKLXsKLQlpZiAobV9iTm90aWZ5ICYmIG1fcE5vdGlmeSkKLQl7Ci0JCUNQREZfUmVjdCByY1BsYXRlID0gbV9wVlQtPkdldFBsYXRlUmVjdCgpOwotCQlDUERGX1JlY3QgcmNDb250ZW50ID0gbV9wVlQtPkdldENvbnRlbnRSZWN0KCk7Cit2b2lkIENGWF9FZGl0OjpTZXRTY3JvbGxJbmZvKCkgeworICBpZiAobV9iTm90aWZ5ICYmIG1fcE5vdGlmeSkgeworICAgIENQREZfUmVjdCByY1BsYXRlID0gbV9wVlQtPkdldFBsYXRlUmVjdCgpOworICAgIENQREZfUmVjdCByY0NvbnRlbnQgPSBtX3BWVC0+R2V0Q29udGVudFJlY3QoKTsKIAotCQlpZiAoIW1fYk5vdGlmeUZsYWcpCi0JCXsKLQkJCW1fYk5vdGlmeUZsYWcgPSBUUlVFOwotCQkJbV9wTm90aWZ5LT5JT25TZXRTY3JvbGxJbmZvWChyY1BsYXRlLmxlZnQsIHJjUGxhdGUucmlnaHQsIAotCQkJCQkJCQlyY0NvbnRlbnQubGVmdCwgcmNDb250ZW50LnJpZ2h0LCByY1BsYXRlLldpZHRoKCkgLyAzLCByY1BsYXRlLldpZHRoKCkpOwotCQkJCi0JCQltX3BOb3RpZnktPklPblNldFNjcm9sbEluZm9ZKHJjUGxhdGUuYm90dG9tLCByY1BsYXRlLnRvcCwgCi0JCQkJCXJjQ29udGVudC5ib3R0b20sIHJjQ29udGVudC50b3AsIHJjUGxhdGUuSGVpZ2h0KCkgLyAzLCByY1BsYXRlLkhlaWdodCgpKTsKLQkJCW1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKLQkJfQotCX0KKyAgICBpZiAoIW1fYk5vdGlmeUZsYWcpIHsKKyAgICAgIG1fYk5vdGlmeUZsYWcgPSBUUlVFOworICAgICAgbV9wTm90aWZ5LT5JT25TZXRTY3JvbGxJbmZvWChyY1BsYXRlLmxlZnQsIHJjUGxhdGUucmlnaHQsIHJjQ29udGVudC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NvbnRlbnQucmlnaHQsIHJjUGxhdGUuV2lkdGgoKSAvIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjUGxhdGUuV2lkdGgoKSk7CisKKyAgICAgIG1fcE5vdGlmeS0+SU9uU2V0U2Nyb2xsSW5mb1kocmNQbGF0ZS5ib3R0b20sIHJjUGxhdGUudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NvbnRlbnQuYm90dG9tLCByY0NvbnRlbnQudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY1BsYXRlLkhlaWdodCgpIC8gMywgcmNQbGF0ZS5IZWlnaHQoKSk7CisgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldFNjcm9sbFBvc1goRlhfRkxPQVQgZngpCi17Ci0JaWYgKCFtX2JFbmFibGVTY3JvbGwpIHJldHVybjsKK3ZvaWQgQ0ZYX0VkaXQ6OlNldFNjcm9sbFBvc1goRlhfRkxPQVQgZngpIHsKKyAgaWYgKCFtX2JFbmFibGVTY3JvbGwpCisgICAgcmV0dXJuOwogCi0JaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCi0JewotCQlpZiAoIUZYX0VESVRfSXNGbG9hdEVxdWFsKG1fcHRTY3JvbGxQb3MueCxmeCkpCi0JCXsKLQkJCW1fcHRTY3JvbGxQb3MueCA9IGZ4OwkJCQotCQkJUmVmcmVzaChSUF9OT0FOQUxZU0UpOworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIGlmICghRlhfRURJVF9Jc0Zsb2F0RXF1YWwobV9wdFNjcm9sbFBvcy54LCBmeCkpIHsKKyAgICAgIG1fcHRTY3JvbGxQb3MueCA9IGZ4OworICAgICAgUmVmcmVzaChSUF9OT0FOQUxZU0UpOwogCi0JCQlpZiAobV9iTm90aWZ5ICYmIG1fcE5vdGlmeSkKLQkJCXsKLQkJCQlpZiAoIW1fYk5vdGlmeUZsYWcpCi0JCQkJewotCQkJCQltX2JOb3RpZnlGbGFnID0gVFJVRTsKLQkJCQkJbV9wTm90aWZ5LT5JT25TZXRTY3JvbGxQb3NYKGZ4KTsKLQkJCQkJbV9iTm90aWZ5RmxhZyA9IEZBTFNFOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICAgIGlmIChtX2JOb3RpZnkgJiYgbV9wTm90aWZ5KSB7CisgICAgICAgIGlmICghbV9iTm90aWZ5RmxhZykgeworICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBUUlVFOworICAgICAgICAgIG1fcE5vdGlmeS0+SU9uU2V0U2Nyb2xsUG9zWChmeCk7CisgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IEZBTFNFOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldFNjcm9sbFBvc1koRlhfRkxPQVQgZnkpCi17Ci0JaWYgKCFtX2JFbmFibGVTY3JvbGwpIHJldHVybjsKK3ZvaWQgQ0ZYX0VkaXQ6OlNldFNjcm9sbFBvc1koRlhfRkxPQVQgZnkpIHsKKyAgaWYgKCFtX2JFbmFibGVTY3JvbGwpCisgICAgcmV0dXJuOwogCi0JaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCi0JewotCQlpZiAoIUZYX0VESVRfSXNGbG9hdEVxdWFsKG1fcHRTY3JvbGxQb3MueSxmeSkpCi0JCXsJCQkJCi0JCQltX3B0U2Nyb2xsUG9zLnkgPSBmeTsKLQkJCVJlZnJlc2goUlBfTk9BTkFMWVNFKTsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBpZiAoIUZYX0VESVRfSXNGbG9hdEVxdWFsKG1fcHRTY3JvbGxQb3MueSwgZnkpKSB7CisgICAgICBtX3B0U2Nyb2xsUG9zLnkgPSBmeTsKKyAgICAgIFJlZnJlc2goUlBfTk9BTkFMWVNFKTsKIAotCQkJaWYgKG1fYk5vdGlmeSAmJiBtX3BOb3RpZnkpCi0JCQl7Ci0JCQkJaWYgKCFtX2JOb3RpZnlGbGFnKQotCQkJCXsKLQkJCQkJbV9iTm90aWZ5RmxhZyA9IFRSVUU7Ci0JCQkJCW1fcE5vdGlmeS0+SU9uU2V0U2Nyb2xsUG9zWShmeSk7Ci0JCQkJCW1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgICAgICBpZiAobV9iTm90aWZ5ICYmIG1fcE5vdGlmeSkgeworICAgICAgICBpZiAoIW1fYk5vdGlmeUZsYWcpIHsKKyAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gVFJVRTsKKyAgICAgICAgICBtX3BOb3RpZnktPklPblNldFNjcm9sbFBvc1koZnkpOworICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQogfQogCi12b2lkIENGWF9FZGl0OjpTZXRTY3JvbGxQb3MoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KQotewotCVNldFNjcm9sbFBvc1gocG9pbnQueCk7Ci0JU2V0U2Nyb2xsUG9zWShwb2ludC55KTsKLQlTZXRTY3JvbGxMaW1pdCgpOwotCVNldENhcmV0SW5mbygpOwordm9pZCBDRlhfRWRpdDo6U2V0U2Nyb2xsUG9zKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIFNldFNjcm9sbFBvc1gocG9pbnQueCk7CisgIFNldFNjcm9sbFBvc1kocG9pbnQueSk7CisgIFNldFNjcm9sbExpbWl0KCk7CisgIFNldENhcmV0SW5mbygpOwogfQogCi1DUERGX1BvaW50IENGWF9FZGl0OjpHZXRTY3JvbGxQb3MoKSBjb25zdAotewotCXJldHVybiBtX3B0U2Nyb2xsUG9zOworQ1BERl9Qb2ludCBDRlhfRWRpdDo6R2V0U2Nyb2xsUG9zKCkgY29uc3QgeworICByZXR1cm4gbV9wdFNjcm9sbFBvczsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0U2Nyb2xsTGltaXQoKQotewotCWlmIChtX3BWVC0+SXNWYWxpZCgpKQotCXsKLQkJQ1BERl9SZWN0IHJjQ29udGVudCA9IG1fcFZULT5HZXRDb250ZW50UmVjdCgpOwotCQlDUERGX1JlY3QgcmNQbGF0ZSA9IG1fcFZULT5HZXRQbGF0ZVJlY3QoKTsKK3ZvaWQgQ0ZYX0VkaXQ6OlNldFNjcm9sbExpbWl0KCkgeworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIENQREZfUmVjdCByY0NvbnRlbnQgPSBtX3BWVC0+R2V0Q29udGVudFJlY3QoKTsKKyAgICBDUERGX1JlY3QgcmNQbGF0ZSA9IG1fcFZULT5HZXRQbGF0ZVJlY3QoKTsKIAotCQlpZiAocmNQbGF0ZS5XaWR0aCgpID4gcmNDb250ZW50LldpZHRoKCkpCi0JCXsKLQkJCVNldFNjcm9sbFBvc1gocmNQbGF0ZS5sZWZ0KTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChGWF9FRElUX0lzRmxvYXRTbWFsbGVyKG1fcHRTY3JvbGxQb3MueCwgcmNDb250ZW50LmxlZnQpKQotCQkJewotCQkJCVNldFNjcm9sbFBvc1gocmNDb250ZW50LmxlZnQpOwkJCQotCQkJfQotCQkJZWxzZSBpZiAoRlhfRURJVF9Jc0Zsb2F0QmlnZ2VyKG1fcHRTY3JvbGxQb3MueCwgcmNDb250ZW50LnJpZ2h0IC0gcmNQbGF0ZS5XaWR0aCgpKSkKLQkJCXsKLQkJCQlTZXRTY3JvbGxQb3NYKHJjQ29udGVudC5yaWdodCAtIHJjUGxhdGUuV2lkdGgoKSk7Ci0JCQl9Ci0JCX0KKyAgICBpZiAocmNQbGF0ZS5XaWR0aCgpID4gcmNDb250ZW50LldpZHRoKCkpIHsKKyAgICAgIFNldFNjcm9sbFBvc1gocmNQbGF0ZS5sZWZ0KTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKEZYX0VESVRfSXNGbG9hdFNtYWxsZXIobV9wdFNjcm9sbFBvcy54LCByY0NvbnRlbnQubGVmdCkpIHsKKyAgICAgICAgU2V0U2Nyb2xsUG9zWChyY0NvbnRlbnQubGVmdCk7CisgICAgICB9IGVsc2UgaWYgKEZYX0VESVRfSXNGbG9hdEJpZ2dlcihtX3B0U2Nyb2xsUG9zLngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NvbnRlbnQucmlnaHQgLSByY1BsYXRlLldpZHRoKCkpKSB7CisgICAgICAgIFNldFNjcm9sbFBvc1gocmNDb250ZW50LnJpZ2h0IC0gcmNQbGF0ZS5XaWR0aCgpKTsKKyAgICAgIH0KKyAgICB9CiAKLQkJaWYgKHJjUGxhdGUuSGVpZ2h0KCkgPiByY0NvbnRlbnQuSGVpZ2h0KCkpCi0JCXsKLQkJCVNldFNjcm9sbFBvc1kocmNQbGF0ZS50b3ApOwotCQl9Ci0JCWVsc2UJCQotCQl7Ci0JCQlpZiAoRlhfRURJVF9Jc0Zsb2F0U21hbGxlcihtX3B0U2Nyb2xsUG9zLnksIHJjQ29udGVudC5ib3R0b20gKyByY1BsYXRlLkhlaWdodCgpKSkKLQkJCXsKLQkJCQlTZXRTY3JvbGxQb3NZKHJjQ29udGVudC5ib3R0b20gKyByY1BsYXRlLkhlaWdodCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKEZYX0VESVRfSXNGbG9hdEJpZ2dlcihtX3B0U2Nyb2xsUG9zLnksIHJjQ29udGVudC50b3ApKQotCQkJewotCQkJCVNldFNjcm9sbFBvc1kocmNDb250ZW50LnRvcCk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgaWYgKHJjUGxhdGUuSGVpZ2h0KCkgPiByY0NvbnRlbnQuSGVpZ2h0KCkpIHsKKyAgICAgIFNldFNjcm9sbFBvc1kocmNQbGF0ZS50b3ApOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoRlhfRURJVF9Jc0Zsb2F0U21hbGxlcihtX3B0U2Nyb2xsUG9zLnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NvbnRlbnQuYm90dG9tICsgcmNQbGF0ZS5IZWlnaHQoKSkpIHsKKyAgICAgICAgU2V0U2Nyb2xsUG9zWShyY0NvbnRlbnQuYm90dG9tICsgcmNQbGF0ZS5IZWlnaHQoKSk7CisgICAgICB9IGVsc2UgaWYgKEZYX0VESVRfSXNGbG9hdEJpZ2dlcihtX3B0U2Nyb2xsUG9zLnksIHJjQ29udGVudC50b3ApKSB7CisgICAgICAgIFNldFNjcm9sbFBvc1kocmNDb250ZW50LnRvcCk7CisgICAgICB9CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNjcm9sbFRvQ2FyZXQoKQotewotCVNldFNjcm9sbExpbWl0KCk7Cit2b2lkIENGWF9FZGl0OjpTY3JvbGxUb0NhcmV0KCkgeworICBTZXRTY3JvbGxMaW1pdCgpOwogCi0JaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCi0JewotCQlDUERGX1BvaW50IHB0SGVhZCgwLDApOwotCQlDUERGX1BvaW50IHB0Rm9vdCgwLDApOworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIENQREZfUG9pbnQgcHRIZWFkKDAsIDApOworICAgIENQREZfUG9pbnQgcHRGb290KDAsIDApOwogCi0JCWlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciAqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKQotCQl7Ci0JCQlwSXRlcmF0b3ItPlNldEF0KG1fd3BDYXJldCk7CisgICAgaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKSkgeworICAgICAgcEl0ZXJhdG9yLT5TZXRBdChtX3dwQ2FyZXQpOwogCi0JCQlDUFZUX1dvcmQgd29yZDsKLQkJCUNQVlRfTGluZSBsaW5lOwotCQkJaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkKLQkJCXsKLQkJCQlwdEhlYWQueCA9IHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aDsKLQkJCQlwdEhlYWQueSA9IHdvcmQucHRXb3JkLnkgKyB3b3JkLmZBc2NlbnQ7Ci0JCQkJcHRGb290LnggPSB3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGg7Ci0JCQkJcHRGb290LnkgPSB3b3JkLnB0V29yZC55ICsgd29yZC5mRGVzY2VudDsKLQkJCX0KLQkJCWVsc2UgaWYgKHBJdGVyYXRvci0+R2V0TGluZShsaW5lKSkKLQkJCXsJCQkJCi0JCQkJcHRIZWFkLnggPSBsaW5lLnB0TGluZS54OwotCQkJCXB0SGVhZC55ID0gbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVBc2NlbnQ7Ci0JCQkJcHRGb290LnggPSBsaW5lLnB0TGluZS54OwotCQkJCXB0Rm9vdC55ID0gbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVEZXNjZW50OwotCQkJfQotCQl9CisgICAgICBDUFZUX1dvcmQgd29yZDsKKyAgICAgIENQVlRfTGluZSBsaW5lOworICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgeworICAgICAgICBwdEhlYWQueCA9IHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aDsKKyAgICAgICAgcHRIZWFkLnkgPSB3b3JkLnB0V29yZC55ICsgd29yZC5mQXNjZW50OworICAgICAgICBwdEZvb3QueCA9IHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aDsKKyAgICAgICAgcHRGb290LnkgPSB3b3JkLnB0V29yZC55ICsgd29yZC5mRGVzY2VudDsKKyAgICAgIH0gZWxzZSBpZiAocEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpKSB7CisgICAgICAgIHB0SGVhZC54ID0gbGluZS5wdExpbmUueDsKKyAgICAgICAgcHRIZWFkLnkgPSBsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZUFzY2VudDsKKyAgICAgICAgcHRGb290LnggPSBsaW5lLnB0TGluZS54OworICAgICAgICBwdEZvb3QueSA9IGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lRGVzY2VudDsKKyAgICAgIH0KKyAgICB9CiAKLQkJQ1BERl9Qb2ludCBwdEhlYWRFZGl0ID0gVlRUb0VkaXQocHRIZWFkKTsKLQkJQ1BERl9Qb2ludCBwdEZvb3RFZGl0ID0gVlRUb0VkaXQocHRGb290KTsKKyAgICBDUERGX1BvaW50IHB0SGVhZEVkaXQgPSBWVFRvRWRpdChwdEhlYWQpOworICAgIENQREZfUG9pbnQgcHRGb290RWRpdCA9IFZUVG9FZGl0KHB0Rm9vdCk7CiAKLQkJQ1BERl9SZWN0IHJjUGxhdGUgPSBtX3BWVC0+R2V0UGxhdGVSZWN0KCk7CisgICAgQ1BERl9SZWN0IHJjUGxhdGUgPSBtX3BWVC0+R2V0UGxhdGVSZWN0KCk7CiAKLQkJaWYgKCFGWF9FRElUX0lzRmxvYXRFcXVhbChyY1BsYXRlLmxlZnQscmNQbGF0ZS5yaWdodCkpCi0JCXsKLQkJCWlmIChGWF9FRElUX0lzRmxvYXRTbWFsbGVyKHB0SGVhZEVkaXQueCwgcmNQbGF0ZS5sZWZ0KSB8fAotCQkJCUZYX0VESVRfSXNGbG9hdEVxdWFsKHB0SGVhZEVkaXQueCwgcmNQbGF0ZS5sZWZ0KSkKLQkJCXsKLQkJCQlTZXRTY3JvbGxQb3NYKHB0SGVhZC54KTsKLQkJCX0KLQkJCWVsc2UgaWYgKEZYX0VESVRfSXNGbG9hdEJpZ2dlcihwdEhlYWRFZGl0LngsIHJjUGxhdGUucmlnaHQpKQotCQkJewotCQkJCVNldFNjcm9sbFBvc1gocHRIZWFkLnggLSByY1BsYXRlLldpZHRoKCkpOwotCQkJfQotCQl9CisgICAgaWYgKCFGWF9FRElUX0lzRmxvYXRFcXVhbChyY1BsYXRlLmxlZnQsIHJjUGxhdGUucmlnaHQpKSB7CisgICAgICBpZiAoRlhfRURJVF9Jc0Zsb2F0U21hbGxlcihwdEhlYWRFZGl0LngsIHJjUGxhdGUubGVmdCkgfHwKKyAgICAgICAgICBGWF9FRElUX0lzRmxvYXRFcXVhbChwdEhlYWRFZGl0LngsIHJjUGxhdGUubGVmdCkpIHsKKyAgICAgICAgU2V0U2Nyb2xsUG9zWChwdEhlYWQueCk7CisgICAgICB9IGVsc2UgaWYgKEZYX0VESVRfSXNGbG9hdEJpZ2dlcihwdEhlYWRFZGl0LngsIHJjUGxhdGUucmlnaHQpKSB7CisgICAgICAgIFNldFNjcm9sbFBvc1gocHRIZWFkLnggLSByY1BsYXRlLldpZHRoKCkpOworICAgICAgfQorICAgIH0KIAotCQlpZiAoIUZYX0VESVRfSXNGbG9hdEVxdWFsKHJjUGxhdGUudG9wLHJjUGxhdGUuYm90dG9tKSkKLQkJewotCQkJaWYgKEZYX0VESVRfSXNGbG9hdFNtYWxsZXIocHRGb290RWRpdC55LCByY1BsYXRlLmJvdHRvbSkgfHwKLQkJCQlGWF9FRElUX0lzRmxvYXRFcXVhbChwdEZvb3RFZGl0LnksIHJjUGxhdGUuYm90dG9tKSkKLQkJCXsKLQkJCQlpZiAoRlhfRURJVF9Jc0Zsb2F0U21hbGxlcihwdEhlYWRFZGl0LnksIHJjUGxhdGUudG9wKSkKLQkJCQl7Ci0JCQkJCVNldFNjcm9sbFBvc1kocHRGb290LnkgKyByY1BsYXRlLkhlaWdodCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChGWF9FRElUX0lzRmxvYXRCaWdnZXIocHRIZWFkRWRpdC55LCByY1BsYXRlLnRvcCkpCi0JCQl7Ci0JCQkJaWYgKEZYX0VESVRfSXNGbG9hdEJpZ2dlcihwdEZvb3RFZGl0LnksIHJjUGxhdGUuYm90dG9tKSkKLQkJCQl7Ci0JCQkJCVNldFNjcm9sbFBvc1kocHRIZWFkLnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICBpZiAoIUZYX0VESVRfSXNGbG9hdEVxdWFsKHJjUGxhdGUudG9wLCByY1BsYXRlLmJvdHRvbSkpIHsKKyAgICAgIGlmIChGWF9FRElUX0lzRmxvYXRTbWFsbGVyKHB0Rm9vdEVkaXQueSwgcmNQbGF0ZS5ib3R0b20pIHx8CisgICAgICAgICAgRlhfRURJVF9Jc0Zsb2F0RXF1YWwocHRGb290RWRpdC55LCByY1BsYXRlLmJvdHRvbSkpIHsKKyAgICAgICAgaWYgKEZYX0VESVRfSXNGbG9hdFNtYWxsZXIocHRIZWFkRWRpdC55LCByY1BsYXRlLnRvcCkpIHsKKyAgICAgICAgICBTZXRTY3JvbGxQb3NZKHB0Rm9vdC55ICsgcmNQbGF0ZS5IZWlnaHQoKSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoRlhfRURJVF9Jc0Zsb2F0QmlnZ2VyKHB0SGVhZEVkaXQueSwgcmNQbGF0ZS50b3ApKSB7CisgICAgICAgIGlmIChGWF9FRElUX0lzRmxvYXRCaWdnZXIocHRGb290RWRpdC55LCByY1BsYXRlLmJvdHRvbSkpIHsKKyAgICAgICAgICBTZXRTY3JvbGxQb3NZKHB0SGVhZC55KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQogfQogCi12b2lkIENGWF9FZGl0OjpSZWZyZXNoKFJFRlJFU0hfUExBTl9FIGVQbGFuLGNvbnN0IENQVlRfV29yZFJhbmdlICogcFJhbmdlMSxjb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBSYW5nZTIpCi17Ci0JaWYgKG1fYkVuYWJsZVJlZnJlc2ggJiYgbV9wVlQtPklzVmFsaWQoKSkKLQl7Ci0JCW1fUmVmcmVzaC5CZWdpblJlZnJlc2goKTsKLQkJUmVmcmVzaFB1c2hMaW5lUmVjdHMoR2V0VmlzaWJsZVdvcmRSYW5nZSgpKTsKK3ZvaWQgQ0ZYX0VkaXQ6OlJlZnJlc2goUkVGUkVTSF9QTEFOX0UgZVBsYW4sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UxLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlMikgeworICBpZiAobV9iRW5hYmxlUmVmcmVzaCAmJiBtX3BWVC0+SXNWYWxpZCgpKSB7CisgICAgbV9SZWZyZXNoLkJlZ2luUmVmcmVzaCgpOworICAgIFJlZnJlc2hQdXNoTGluZVJlY3RzKEdldFZpc2libGVXb3JkUmFuZ2UoKSk7CiAKLS8vIAkJaWYgKCFGWF9FRElUX0lzRmxvYXRFcXVhbChtX3B0UmVmcmVzaFNjcm9sbFBvcy54LG1fcHRTY3JvbGxQb3MueCkgfHwgCi0vLyAJCQkhRlhfRURJVF9Jc0Zsb2F0RXF1YWwobV9wdFJlZnJlc2hTY3JvbGxQb3MueSxtX3B0U2Nyb2xsUG9zLnkpKQotLy8gCQl7Ci0JCQltX1JlZnJlc2guTm9BbmFseXNlKCk7Ci0JCQltX3B0UmVmcmVzaFNjcm9sbFBvcyA9IG1fcHRTY3JvbGxQb3M7Ci0vLyAJCX0KLS8vIAkJZWxzZQotLy8gCQl7Ci0vLyAJCQlzd2l0Y2ggKGVQbGFuKQotLy8gCQkJewotLy8gCQkJY2FzZSBSUF9BTkFMWVNFOgotLy8gCQkJCW1fUmVmcmVzaC5BbmFseXNlKG1fcFZULT5HZXRBbGlnbm1lbnQoKSk7Ci0vLyAKLS8vIAkJCQlpZiAocFJhbmdlMSkgUmVmcmVzaFB1c2hSYW5kb21SZWN0cygqcFJhbmdlMSk7Ci0vLyAJCQkJaWYgKHBSYW5nZTIpIFJlZnJlc2hQdXNoUmFuZG9tUmVjdHMoKnBSYW5nZTIpOwotLy8gCQkJCWJyZWFrOwotLy8gCQkJY2FzZSBSUF9OT0FOQUxZU0U6Ci0vLyAJCQkJbV9SZWZyZXNoLk5vQW5hbHlzZSgpOwotLy8gCQkJCWJyZWFrOwotLy8gCQkJY2FzZSBSUF9PUFRJT05BTDoKLS8vIAkJCQlpZiAocFJhbmdlMSkgUmVmcmVzaFB1c2hSYW5kb21SZWN0cygqcFJhbmdlMSk7Ci0vLyAJCQkJaWYgKHBSYW5nZTIpIFJlZnJlc2hQdXNoUmFuZG9tUmVjdHMoKnBSYW5nZTIpOwotLy8gCQkJCWJyZWFrOwkKLS8vIAkJCX0KLS8vIAkJfQkJCisgICAgbV9SZWZyZXNoLk5vQW5hbHlzZSgpOworICAgIG1fcHRSZWZyZXNoU2Nyb2xsUG9zID0gbV9wdFNjcm9sbFBvczsKIAotCQlpZiAobV9iTm90aWZ5ICYmIG1fcE5vdGlmeSkKLQkJewotCQkJaWYgKCFtX2JOb3RpZnlGbGFnKQotCQkJewotCQkJCW1fYk5vdGlmeUZsYWcgPSBUUlVFOwotCQkJCWlmIChjb25zdCBDRlhfRWRpdF9SZWN0QXJyYXkgKiBwUmVjdHMgPSBtX1JlZnJlc2guR2V0UmVmcmVzaFJlY3RzKCkpCi0JCQkJewotCQkJCQlmb3IgKEZYX0lOVDMyIGkgPSAwLCBzeiA9IHBSZWN0cy0+R2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKLQkJCQkJCW1fcE5vdGlmeS0+SU9uSW52YWxpZGF0ZVJlY3QocFJlY3RzLT5HZXRBdChpKSk7Ci0JCQkJfQotCQkJCW1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKLQkJCX0KLQkJfQorICAgIGlmIChtX2JOb3RpZnkgJiYgbV9wTm90aWZ5KSB7CisgICAgICBpZiAoIW1fYk5vdGlmeUZsYWcpIHsKKyAgICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7CisgICAgICAgIGlmIChjb25zdCBDRlhfRWRpdF9SZWN0QXJyYXkqIHBSZWN0cyA9IG1fUmVmcmVzaC5HZXRSZWZyZXNoUmVjdHMoKSkgeworICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBwUmVjdHMtPkdldFNpemUoKTsgaSA8IHN6OyBpKyspCisgICAgICAgICAgICBtX3BOb3RpZnktPklPbkludmFsaWRhdGVSZWN0KHBSZWN0cy0+R2V0QXQoaSkpOworICAgICAgICB9CisgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKKyAgICAgIH0KKyAgICB9CiAKLQkJbV9SZWZyZXNoLkVuZFJlZnJlc2goKTsKLQl9CisgICAgbV9SZWZyZXNoLkVuZFJlZnJlc2goKTsKKyAgfQogfQogCi12b2lkIENGWF9FZGl0OjpSZWZyZXNoUHVzaExpbmVSZWN0cyhjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyKQotewotCWlmIChtX3BWVC0+SXNWYWxpZCgpKQotCXsKLQkJaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpCi0JCXsKLQkJCUNQVlRfV29yZFBsYWNlIHdwQmVnaW4gPSB3ci5CZWdpblBvczsKLQkJCW1fcFZULT5VcGRhdGVXb3JkUGxhY2Uod3BCZWdpbik7Ci0JCQlDUFZUX1dvcmRQbGFjZSB3cEVuZCA9IHdyLkVuZFBvczsKLQkJCW1fcFZULT5VcGRhdGVXb3JkUGxhY2Uod3BFbmQpOwotCQkJcEl0ZXJhdG9yLT5TZXRBdCh3cEJlZ2luKTsKK3ZvaWQgQ0ZYX0VkaXQ6OlJlZnJlc2hQdXNoTGluZVJlY3RzKGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cikgeworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIGlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpIHsKKyAgICAgIENQVlRfV29yZFBsYWNlIHdwQmVnaW4gPSB3ci5CZWdpblBvczsKKyAgICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2Uod3BCZWdpbik7CisgICAgICBDUFZUX1dvcmRQbGFjZSB3cEVuZCA9IHdyLkVuZFBvczsKKyAgICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2Uod3BFbmQpOworICAgICAgcEl0ZXJhdG9yLT5TZXRBdCh3cEJlZ2luKTsKIAotCQkJQ1BWVF9MaW5lIGxpbmVpbmZvOwkKLQkJCWRvCi0JCQl7Ci0JCQkJaWYgKCFwSXRlcmF0b3ItPkdldExpbmUobGluZWluZm8pKWJyZWFrOwotCQkJCWlmIChsaW5laW5mby5saW5lcGxhY2UuTGluZUNtcCh3cEVuZCkgPiAwKWJyZWFrOworICAgICAgQ1BWVF9MaW5lIGxpbmVpbmZvOworICAgICAgZG8geworICAgICAgICBpZiAoIXBJdGVyYXRvci0+R2V0TGluZShsaW5laW5mbykpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChsaW5laW5mby5saW5lcGxhY2UuTGluZUNtcCh3cEVuZCkgPiAwKQorICAgICAgICAgIGJyZWFrOwogCi0JCQkJQ1BERl9SZWN0IHJjTGluZShsaW5laW5mby5wdExpbmUueCwKLQkJCQkJCQkJCWxpbmVpbmZvLnB0TGluZS55ICsgbGluZWluZm8uZkxpbmVEZXNjZW50LAotCQkJCQkJCQkJbGluZWluZm8ucHRMaW5lLnggKyBsaW5laW5mby5mTGluZVdpZHRoLAotCQkJCQkJCQkJbGluZWluZm8ucHRMaW5lLnkgKyBsaW5laW5mby5mTGluZUFzY2VudCk7CisgICAgICAgIENQREZfUmVjdCByY0xpbmUobGluZWluZm8ucHRMaW5lLngsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWluZm8ucHRMaW5lLnkgKyBsaW5laW5mby5mTGluZURlc2NlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWluZm8ucHRMaW5lLnggKyBsaW5laW5mby5mTGluZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVpbmZvLnB0TGluZS55ICsgbGluZWluZm8uZkxpbmVBc2NlbnQpOwogCi0JCQkJbV9SZWZyZXNoLlB1c2goQ1BWVF9Xb3JkUmFuZ2UobGluZWluZm8ubGluZXBsYWNlLGxpbmVpbmZvLmxpbmVFbmQpLFZUVG9FZGl0KHJjTGluZSkpOwotCi0JCQl9d2hpbGUgKHBJdGVyYXRvci0+TmV4dExpbmUoKSk7Ci0JCX0KLQl9CisgICAgICAgIG1fUmVmcmVzaC5QdXNoKENQVlRfV29yZFJhbmdlKGxpbmVpbmZvLmxpbmVwbGFjZSwgbGluZWluZm8ubGluZUVuZCksCisgICAgICAgICAgICAgICAgICAgICAgIFZUVG9FZGl0KHJjTGluZSkpOworICAgICAgfSB3aGlsZSAocEl0ZXJhdG9yLT5OZXh0TGluZSgpKTsKKyAgICB9CisgIH0KIH0KIAotdm9pZCBDRlhfRWRpdDo6UmVmcmVzaFB1c2hSYW5kb21SZWN0cyhjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyKQotewotCWlmIChtX3BWVC0+SXNWYWxpZCgpKQotCXsKLQkJaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpCi0JCXsKLQkJCUNQVlRfV29yZFJhbmdlIHdyVGVtcCA9IHdyOwordm9pZCBDRlhfRWRpdDo6UmVmcmVzaFB1c2hSYW5kb21SZWN0cyhjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IpIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKSB7CisgICAgICBDUFZUX1dvcmRSYW5nZSB3clRlbXAgPSB3cjsKIAotCQkJbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZSh3clRlbXAuQmVnaW5Qb3MpOwotCQkJbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZSh3clRlbXAuRW5kUG9zKTsKLQkJCXBJdGVyYXRvci0+U2V0QXQod3JUZW1wLkJlZ2luUG9zKTsKKyAgICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2Uod3JUZW1wLkJlZ2luUG9zKTsKKyAgICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2Uod3JUZW1wLkVuZFBvcyk7CisgICAgICBwSXRlcmF0b3ItPlNldEF0KHdyVGVtcC5CZWdpblBvcyk7CiAKLQkJCUNQVlRfV29yZCB3b3JkaW5mbzsJCi0JCQlDUFZUX0xpbmUgbGluZWluZm87CQotCQkJQ1BWVF9Xb3JkUGxhY2UgcGxhY2U7CisgICAgICBDUFZUX1dvcmQgd29yZGluZm87CisgICAgICBDUFZUX0xpbmUgbGluZWluZm87CisgICAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZTsKIAotCQkJd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkKLQkJCXsKLQkJCQlwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKLQkJCQlpZiAocGxhY2UuV29yZENtcCh3clRlbXAuRW5kUG9zKSA+IDApIGJyZWFrOwotCQkJCQkJCi0JCQkJcEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmRpbmZvKTsKLQkJCQlwSXRlcmF0b3ItPkdldExpbmUobGluZWluZm8pOworICAgICAgd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkgeworICAgICAgICBwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKKyAgICAgICAgaWYgKHBsYWNlLldvcmRDbXAod3JUZW1wLkVuZFBvcykgPiAwKQorICAgICAgICAgIGJyZWFrOwogCi0JCQkJaWYgKHBsYWNlLkxpbmVDbXAod3JUZW1wLkJlZ2luUG9zKSA9PSAwIHx8IHBsYWNlLkxpbmVDbXAod3JUZW1wLkVuZFBvcykgPT0gMCkKLQkJCQl7Ci0JCQkJCUNQREZfUmVjdCByY1dvcmQod29yZGluZm8ucHRXb3JkLngsCi0JCQkJCQkJCQkJbGluZWluZm8ucHRMaW5lLnkgKyBsaW5laW5mby5mTGluZURlc2NlbnQsCi0JCQkJCQkJCQkJd29yZGluZm8ucHRXb3JkLnggKyB3b3JkaW5mby5mV2lkdGgsCi0JCQkJCQkJCQkJbGluZWluZm8ucHRMaW5lLnkgKyBsaW5laW5mby5mTGluZUFzY2VudCk7CisgICAgICAgIHBJdGVyYXRvci0+R2V0V29yZCh3b3JkaW5mbyk7CisgICAgICAgIHBJdGVyYXRvci0+R2V0TGluZShsaW5laW5mbyk7CiAKLQkJCQkJbV9SZWZyZXNoLkFkZFJlZnJlc2goVlRUb0VkaXQocmNXb3JkKSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7CQkKLQkJCQkJQ1BERl9SZWN0IHJjTGluZShsaW5laW5mby5wdExpbmUueCwKLQkJCQkJCQkJCQlsaW5laW5mby5wdExpbmUueSArIGxpbmVpbmZvLmZMaW5lRGVzY2VudCwKLQkJCQkJCQkJCQlsaW5laW5mby5wdExpbmUueCArIGxpbmVpbmZvLmZMaW5lV2lkdGgsCi0JCQkJCQkJCQkJbGluZWluZm8ucHRMaW5lLnkgKyBsaW5laW5mby5mTGluZUFzY2VudCk7CisgICAgICAgIGlmIChwbGFjZS5MaW5lQ21wKHdyVGVtcC5CZWdpblBvcykgPT0gMCB8fAorICAgICAgICAgICAgcGxhY2UuTGluZUNtcCh3clRlbXAuRW5kUG9zKSA9PSAwKSB7CisgICAgICAgICAgQ1BERl9SZWN0IHJjV29yZCh3b3JkaW5mby5wdFdvcmQueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVpbmZvLnB0TGluZS55ICsgbGluZWluZm8uZkxpbmVEZXNjZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8ucHRXb3JkLnggKyB3b3JkaW5mby5mV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5laW5mby5wdExpbmUueSArIGxpbmVpbmZvLmZMaW5lQXNjZW50KTsKIAotCQkJCQltX1JlZnJlc2guQWRkUmVmcmVzaChWVFRvRWRpdChyY0xpbmUpKTsKKyAgICAgICAgICBtX1JlZnJlc2guQWRkUmVmcmVzaChWVFRvRWRpdChyY1dvcmQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBDUERGX1JlY3QgcmNMaW5lKGxpbmVpbmZvLnB0TGluZS54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWluZm8ucHRMaW5lLnkgKyBsaW5laW5mby5mTGluZURlc2NlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5laW5mby5wdExpbmUueCArIGxpbmVpbmZvLmZMaW5lV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5laW5mby5wdExpbmUueSArIGxpbmVpbmZvLmZMaW5lQXNjZW50KTsKIAotCQkJCQlwSXRlcmF0b3ItPk5leHRMaW5lKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQorICAgICAgICAgIG1fUmVmcmVzaC5BZGRSZWZyZXNoKFZUVG9FZGl0KHJjTGluZSkpOworCisgICAgICAgICAgcEl0ZXJhdG9yLT5OZXh0TGluZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlJlZnJlc2hXb3JkUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyKQotewotCWlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciAqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKQotCXsKLQkJQ1BWVF9Xb3JkUmFuZ2Ugd3JUZW1wID0gd3I7Cit2b2lkIENGWF9FZGl0OjpSZWZyZXNoV29yZFJhbmdlKGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cikgeworICBpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKSB7CisgICAgQ1BWVF9Xb3JkUmFuZ2Ugd3JUZW1wID0gd3I7CiAKLQkJbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZSh3clRlbXAuQmVnaW5Qb3MpOwotCQltX3BWVC0+VXBkYXRlV29yZFBsYWNlKHdyVGVtcC5FbmRQb3MpOwotCQlwSXRlcmF0b3ItPlNldEF0KHdyVGVtcC5CZWdpblBvcyk7CisgICAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZSh3clRlbXAuQmVnaW5Qb3MpOworICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2Uod3JUZW1wLkVuZFBvcyk7CisgICAgcEl0ZXJhdG9yLT5TZXRBdCh3clRlbXAuQmVnaW5Qb3MpOwogCi0JCUNQVlRfV29yZCB3b3JkaW5mbzsJCi0JCUNQVlRfTGluZSBsaW5laW5mbzsJCi0JCUNQVlRfV29yZFBsYWNlIHBsYWNlOworICAgIENQVlRfV29yZCB3b3JkaW5mbzsKKyAgICBDUFZUX0xpbmUgbGluZWluZm87CisgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2U7CiAKLQkJd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkKLQkJewotCQkJcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7Ci0JCQlpZiAocGxhY2UuV29yZENtcCh3clRlbXAuRW5kUG9zKSA+IDApIGJyZWFrOwotCQkJCQkKLQkJCXBJdGVyYXRvci0+R2V0V29yZCh3b3JkaW5mbyk7Ci0JCQlwSXRlcmF0b3ItPkdldExpbmUobGluZWluZm8pOworICAgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpIHsKKyAgICAgIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOworICAgICAgaWYgKHBsYWNlLldvcmRDbXAod3JUZW1wLkVuZFBvcykgPiAwKQorICAgICAgICBicmVhazsKIAotCQkJaWYgKHBsYWNlLkxpbmVDbXAod3JUZW1wLkJlZ2luUG9zKSA9PSAwIHx8IHBsYWNlLkxpbmVDbXAod3JUZW1wLkVuZFBvcykgPT0gMCkKLQkJCXsKLQkJCQlDUERGX1JlY3QgcmNXb3JkKHdvcmRpbmZvLnB0V29yZC54LAotCQkJCQkJCQkJbGluZWluZm8ucHRMaW5lLnkgKyBsaW5laW5mby5mTGluZURlc2NlbnQsCi0JCQkJCQkJCQl3b3JkaW5mby5wdFdvcmQueCArIHdvcmRpbmZvLmZXaWR0aCwKLQkJCQkJCQkJCWxpbmVpbmZvLnB0TGluZS55ICsgbGluZWluZm8uZkxpbmVBc2NlbnQpOworICAgICAgcEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmRpbmZvKTsKKyAgICAgIHBJdGVyYXRvci0+R2V0TGluZShsaW5laW5mbyk7CiAKLQkJCQlpZiAobV9iTm90aWZ5ICYmIG1fcE5vdGlmeSkKLQkJCQl7Ci0JCQkJCWlmICghbV9iTm90aWZ5RmxhZykKLQkJCQkJewotCQkJCQkJbV9iTm90aWZ5RmxhZyA9IFRSVUU7Ci0JCQkJCQlDUERGX1JlY3QgcmNSZWZyZXNoID0gVlRUb0VkaXQocmNXb3JkKTsKLQkJCQkJCW1fcE5vdGlmeS0+SU9uSW52YWxpZGF0ZVJlY3QoJnJjUmVmcmVzaCk7Ci0JCQkJCQltX2JOb3RpZnlGbGFnID0gRkFMU0U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7CQkKLQkJCQlDUERGX1JlY3QgcmNMaW5lKGxpbmVpbmZvLnB0TGluZS54LAotCQkJCQkJCQkJbGluZWluZm8ucHRMaW5lLnkgKyBsaW5laW5mby5mTGluZURlc2NlbnQsCi0JCQkJCQkJCQlsaW5laW5mby5wdExpbmUueCArIGxpbmVpbmZvLmZMaW5lV2lkdGgsCi0JCQkJCQkJCQlsaW5laW5mby5wdExpbmUueSArIGxpbmVpbmZvLmZMaW5lQXNjZW50KTsKKyAgICAgIGlmIChwbGFjZS5MaW5lQ21wKHdyVGVtcC5CZWdpblBvcykgPT0gMCB8fAorICAgICAgICAgIHBsYWNlLkxpbmVDbXAod3JUZW1wLkVuZFBvcykgPT0gMCkgeworICAgICAgICBDUERGX1JlY3QgcmNXb3JkKHdvcmRpbmZvLnB0V29yZC54LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVpbmZvLnB0TGluZS55ICsgbGluZWluZm8uZkxpbmVEZXNjZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLnB0V29yZC54ICsgd29yZGluZm8uZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVpbmZvLnB0TGluZS55ICsgbGluZWluZm8uZkxpbmVBc2NlbnQpOwogCi0JCQkJaWYgKG1fYk5vdGlmeSAmJiBtX3BOb3RpZnkpCi0JCQkJewotCQkJCQlpZiAoIW1fYk5vdGlmeUZsYWcpCi0JCQkJCXsKLQkJCQkJCW1fYk5vdGlmeUZsYWcgPSBUUlVFOwotCQkJCQkJQ1BERl9SZWN0IHJjUmVmcmVzaCA9IFZUVG9FZGl0KHJjTGluZSk7Ci0JCQkJCQltX3BOb3RpZnktPklPbkludmFsaWRhdGVSZWN0KCZyY1JlZnJlc2gpOwotCQkJCQkJbV9iTm90aWZ5RmxhZyA9IEZBTFNFOwotCQkJCQl9Ci0JCQkJfQorICAgICAgICBpZiAobV9iTm90aWZ5ICYmIG1fcE5vdGlmeSkgeworICAgICAgICAgIGlmICghbV9iTm90aWZ5RmxhZykgeworICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7CisgICAgICAgICAgICBDUERGX1JlY3QgcmNSZWZyZXNoID0gVlRUb0VkaXQocmNXb3JkKTsKKyAgICAgICAgICAgIG1fcE5vdGlmeS0+SU9uSW52YWxpZGF0ZVJlY3QoJnJjUmVmcmVzaCk7CisgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBDUERGX1JlY3QgcmNMaW5lKGxpbmVpbmZvLnB0TGluZS54LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVpbmZvLnB0TGluZS55ICsgbGluZWluZm8uZkxpbmVEZXNjZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVpbmZvLnB0TGluZS54ICsgbGluZWluZm8uZkxpbmVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsaW5laW5mby5wdExpbmUueSArIGxpbmVpbmZvLmZMaW5lQXNjZW50KTsKKworICAgICAgICBpZiAobV9iTm90aWZ5ICYmIG1fcE5vdGlmeSkgeworICAgICAgICAgIGlmICghbV9iTm90aWZ5RmxhZykgeworICAgICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7CisgICAgICAgICAgICBDUERGX1JlY3QgcmNSZWZyZXNoID0gVlRUb0VkaXQocmNMaW5lKTsKKyAgICAgICAgICAgIG1fcE5vdGlmeS0+SU9uSW52YWxpZGF0ZVJlY3QoJnJjUmVmcmVzaCk7CisgICAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7CisgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJCQlwSXRlcmF0b3ItPk5leHRMaW5lKCk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgIHBJdGVyYXRvci0+TmV4dExpbmUoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0Q2FyZXQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkKLXsKLQltX3dwT2xkQ2FyZXQgPSBtX3dwQ2FyZXQ7IAotCW1fd3BDYXJldCA9IHBsYWNlOwkKK3ZvaWQgQ0ZYX0VkaXQ6OlNldENhcmV0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgeworICBtX3dwT2xkQ2FyZXQgPSBtX3dwQ2FyZXQ7CisgIG1fd3BDYXJldCA9IHBsYWNlOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRDYXJldEluZm8oKQotewotCWlmIChtX2JOb3RpZnkgJiYgbV9wTm90aWZ5KQotCXsKLQkJaWYgKCFtX2JOb3RpZnlGbGFnKQotCQl7Ci0JCQlDUERGX1BvaW50IHB0SGVhZCgwLjBmLDAuMGYpLHB0Rm9vdCgwLjBmLDAuMGYpOwordm9pZCBDRlhfRWRpdDo6U2V0Q2FyZXRJbmZvKCkgeworICBpZiAobV9iTm90aWZ5ICYmIG1fcE5vdGlmeSkgeworICAgIGlmICghbV9iTm90aWZ5RmxhZykgeworICAgICAgQ1BERl9Qb2ludCBwdEhlYWQoMC4wZiwgMC4wZiksIHB0Rm9vdCgwLjBmLCAwLjBmKTsKIAotCQkJaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpCi0JCQl7Ci0JCQkJcEl0ZXJhdG9yLT5TZXRBdChtX3dwQ2FyZXQpOwotCQkJCUNQVlRfV29yZCB3b3JkOwotCQkJCUNQVlRfTGluZSBsaW5lOwotCQkJCWlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpCi0JCQkJewotCQkJCQlwdEhlYWQueCA9IHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aDsKLQkJCQkJcHRIZWFkLnkgPSB3b3JkLnB0V29yZC55ICsgd29yZC5mQXNjZW50OwotCQkJCQlwdEZvb3QueCA9IHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aDsKLQkJCQkJcHRGb290LnkgPSB3b3JkLnB0V29yZC55ICsgd29yZC5mRGVzY2VudDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpKQotCQkJCXsJCQkJCi0JCQkJCXB0SGVhZC54ID0gbGluZS5wdExpbmUueDsKLQkJCQkJcHRIZWFkLnkgPSBsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZUFzY2VudDsKLQkJCQkJcHRGb290LnggPSBsaW5lLnB0TGluZS54OwotCQkJCQlwdEZvb3QueSA9IGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lRGVzY2VudDsKLQkJCQl9Ci0JCQl9CQkKKyAgICAgIGlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpIHsKKyAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdChtX3dwQ2FyZXQpOworICAgICAgICBDUFZUX1dvcmQgd29yZDsKKyAgICAgICAgQ1BWVF9MaW5lIGxpbmU7CisgICAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKKyAgICAgICAgICBwdEhlYWQueCA9IHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aDsKKyAgICAgICAgICBwdEhlYWQueSA9IHdvcmQucHRXb3JkLnkgKyB3b3JkLmZBc2NlbnQ7CisgICAgICAgICAgcHRGb290LnggPSB3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGg7CisgICAgICAgICAgcHRGb290LnkgPSB3b3JkLnB0V29yZC55ICsgd29yZC5mRGVzY2VudDsKKyAgICAgICAgfSBlbHNlIGlmIChwSXRlcmF0b3ItPkdldExpbmUobGluZSkpIHsKKyAgICAgICAgICBwdEhlYWQueCA9IGxpbmUucHRMaW5lLng7CisgICAgICAgICAgcHRIZWFkLnkgPSBsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZUFzY2VudDsKKyAgICAgICAgICBwdEZvb3QueCA9IGxpbmUucHRMaW5lLng7CisgICAgICAgICAgcHRGb290LnkgPSBsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZURlc2NlbnQ7CisgICAgICAgIH0KKyAgICAgIH0KIAotCQkJbV9iTm90aWZ5RmxhZyA9IFRSVUU7Ci0JCQltX3BOb3RpZnktPklPblNldENhcmV0KCFtX1NlbFN0YXRlLklzRXhpc3QoKSxWVFRvRWRpdChwdEhlYWQpLFZUVG9FZGl0KHB0Rm9vdCksIG1fd3BDYXJldCk7Ci0JCQltX2JOb3RpZnlGbGFnID0gRkFMU0U7Ci0JCX0KLQl9CisgICAgICBtX2JOb3RpZnlGbGFnID0gVFJVRTsKKyAgICAgIG1fcE5vdGlmeS0+SU9uU2V0Q2FyZXQoIW1fU2VsU3RhdGUuSXNFeGlzdCgpLCBWVFRvRWRpdChwdEhlYWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVFRvRWRpdChwdEZvb3QpLCBtX3dwQ2FyZXQpOworICAgICAgbV9iTm90aWZ5RmxhZyA9IEZBTFNFOworICAgIH0KKyAgfQogCi0JU2V0Q2FyZXRDaGFuZ2UoKTsKKyAgU2V0Q2FyZXRDaGFuZ2UoKTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6U2V0Q2FyZXRDaGFuZ2UoKQotewotCWlmICh0aGlzLT5tX3dwQ2FyZXQgPT0gdGhpcy0+bV93cE9sZENhcmV0KSByZXR1cm47Cit2b2lkIENGWF9FZGl0OjpTZXRDYXJldENoYW5nZSgpIHsKKyAgaWYgKG1fd3BDYXJldCA9PSBtX3dwT2xkQ2FyZXQpCisgICAgcmV0dXJuOwogCi0JaWYgKG1fYk5vdGlmeSAmJiBtX3BWVC0+SXNSaWNoVGV4dCgpICYmIG1fcE5vdGlmeSkKLQl7Ci0JCUNQVlRfU2VjUHJvcHMgU2VjUHJvcHM7Ci0JCUNQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKKyAgaWYgKG1fYk5vdGlmeSAmJiBtX3BWVC0+SXNSaWNoVGV4dCgpICYmIG1fcE5vdGlmeSkgeworICAgIENQVlRfU2VjUHJvcHMgU2VjUHJvcHM7CisgICAgQ1BWVF9Xb3JkUHJvcHMgV29yZFByb3BzOwogCi0JCWlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciAqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKQotCQl7Ci0JCQlwSXRlcmF0b3ItPlNldEF0KG1fd3BDYXJldCk7Ci0JCQlDUFZUX1dvcmQgd29yZDsKLQkJCUNQVlRfU2VjdGlvbiBzZWN0aW9uOworICAgIGlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpIHsKKyAgICAgIHBJdGVyYXRvci0+U2V0QXQobV93cENhcmV0KTsKKyAgICAgIENQVlRfV29yZCB3b3JkOworICAgICAgQ1BWVF9TZWN0aW9uIHNlY3Rpb247CiAKLQkJCWlmIChwSXRlcmF0b3ItPkdldFNlY3Rpb24oc2VjdGlvbikpCi0JCQl7Ci0JCQkJU2VjUHJvcHMgPSBzZWN0aW9uLlNlY1Byb3BzOwotCQkJCVdvcmRQcm9wcyA9IHNlY3Rpb24uV29yZFByb3BzOwotCQkJfQotCQkJCi0JCQlpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKQotCQkJewkJCQkKLQkJCQlXb3JkUHJvcHMgPSB3b3JkLldvcmRQcm9wczsJCQkJCi0JCQl9Ci0JCX0JCQotCQkKLQkJaWYgKCFtX2JOb3RpZnlGbGFnKQotCQl7Ci0JCQltX2JOb3RpZnlGbGFnID0gVFJVRTsKLQkJCW1fcE5vdGlmeS0+SU9uQ2FyZXRDaGFuZ2UoU2VjUHJvcHMsV29yZFByb3BzKTsKLQkJCW1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKLQkJfQotCX0JCisgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRTZWN0aW9uKHNlY3Rpb24pKSB7CisgICAgICAgIFNlY1Byb3BzID0gc2VjdGlvbi5TZWNQcm9wczsKKyAgICAgICAgV29yZFByb3BzID0gc2VjdGlvbi5Xb3JkUHJvcHM7CisgICAgICB9CisKKyAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKKyAgICAgICAgV29yZFByb3BzID0gd29yZC5Xb3JkUHJvcHM7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFtX2JOb3RpZnlGbGFnKSB7CisgICAgICBtX2JOb3RpZnlGbGFnID0gVFJVRTsKKyAgICAgIG1fcE5vdGlmeS0+SU9uQ2FyZXRDaGFuZ2UoU2VjUHJvcHMsIFdvcmRQcm9wcyk7CisgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlNldENhcmV0KEZYX0lOVDMyIG5Qb3MpCi17Ci0JaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCi0JewotCQlTZWxlY3ROb25lKCk7CQkKLQkJU2V0Q2FyZXQobV9wVlQtPldvcmRJbmRleFRvV29yZFBsYWNlKG5Qb3MpKTsKLQkJbV9TZWxTdGF0ZS5TZXQobV93cENhcmV0LG1fd3BDYXJldCk7Cit2b2lkIENGWF9FZGl0OjpTZXRDYXJldChpbnQzMl90IG5Qb3MpIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBTZWxlY3ROb25lKCk7CisgICAgU2V0Q2FyZXQobV9wVlQtPldvcmRJbmRleFRvV29yZFBsYWNlKG5Qb3MpKTsKKyAgICBtX1NlbFN0YXRlLlNldChtX3dwQ2FyZXQsIG1fd3BDYXJldCk7CiAKLQkJU2Nyb2xsVG9DYXJldCgpOwotCQlTZXRDYXJldE9yaWdpbigpOwotCQlTZXRDYXJldEluZm8oKTsKLQl9CisgICAgU2Nyb2xsVG9DYXJldCgpOworICAgIFNldENhcmV0T3JpZ2luKCk7CisgICAgU2V0Q2FyZXRJbmZvKCk7CisgIH0KIH0KIAotdm9pZCBDRlhfRWRpdDo6T25Nb3VzZURvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCi17Ci0JaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCi0JewotCQlTZWxlY3ROb25lKCk7CQkKLQkJU2V0Q2FyZXQobV9wVlQtPlNlYXJjaFdvcmRQbGFjZShFZGl0VG9WVChwb2ludCkpKTsKLQkJbV9TZWxTdGF0ZS5TZXQobV93cENhcmV0LG1fd3BDYXJldCk7Cit2b2lkIENGWF9FZGl0OjpPbk1vdXNlRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ3RybCkgeworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIFNlbGVjdE5vbmUoKTsKKyAgICBTZXRDYXJldChtX3BWVC0+U2VhcmNoV29yZFBsYWNlKEVkaXRUb1ZUKHBvaW50KSkpOworICAgIG1fU2VsU3RhdGUuU2V0KG1fd3BDYXJldCwgbV93cENhcmV0KTsKIAotCQlTY3JvbGxUb0NhcmV0KCk7Ci0JCVNldENhcmV0T3JpZ2luKCk7Ci0JCVNldENhcmV0SW5mbygpOwotCX0KKyAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgU2V0Q2FyZXRPcmlnaW4oKTsKKyAgICBTZXRDYXJldEluZm8oKTsKKyAgfQogfQogCi12b2lkIENGWF9FZGl0OjpPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKLXsKLQlpZiAobV9wVlQtPklzVmFsaWQoKSkKLQl7Ci0JCVNldENhcmV0KG1fcFZULT5TZWFyY2hXb3JkUGxhY2UoRWRpdFRvVlQocG9pbnQpKSk7Cit2b2lkIENGWF9FZGl0OjpPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ3RybCkgeworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIFNldENhcmV0KG1fcFZULT5TZWFyY2hXb3JkUGxhY2UoRWRpdFRvVlQocG9pbnQpKSk7CiAKLQkJaWYgKG1fd3BDYXJldCAhPSBtX3dwT2xkQ2FyZXQpCi0JCXsKLQkJCW1fU2VsU3RhdGUuU2V0RW5kUG9zKG1fd3BDYXJldCk7CQkKKyAgICBpZiAobV93cENhcmV0ICE9IG1fd3BPbGRDYXJldCkgeworICAgICAgbV9TZWxTdGF0ZS5TZXRFbmRQb3MobV93cENhcmV0KTsKIAotCQkJU2Nyb2xsVG9DYXJldCgpOwotCQkJQ1BWVF9Xb3JkUmFuZ2Ugd3IobV93cE9sZENhcmV0LG1fd3BDYXJldCk7Ci0JCQlSZWZyZXNoKFJQX09QVElPTkFMLCZ3cik7Ci0JCQlTZXRDYXJldE9yaWdpbigpOwotCQkJU2V0Q2FyZXRJbmZvKCk7Ci0JCX0KLQl9CisgICAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgICBDUFZUX1dvcmRSYW5nZSB3cihtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCk7CisgICAgICBSZWZyZXNoKFJQX09QVElPTkFMLCAmd3IpOworICAgICAgU2V0Q2FyZXRPcmlnaW4oKTsKKyAgICAgIFNldENhcmV0SW5mbygpOworICAgIH0KKyAgfQogfQogCi12b2lkIENGWF9FZGl0OjpPblZLX1VQKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCi17CQotCWlmIChtX3BWVC0+SXNWYWxpZCgpKQotCXsKLQkJU2V0Q2FyZXQobV9wVlQtPkdldFVwV29yZFBsYWNlKG1fd3BDYXJldCxtX3B0Q2FyZXQpKTsKK3ZvaWQgQ0ZYX0VkaXQ6Ok9uVktfVVAoRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBTZXRDYXJldChtX3BWVC0+R2V0VXBXb3JkUGxhY2UobV93cENhcmV0LCBtX3B0Q2FyZXQpKTsKIAotCQlpZiAoYlNoaWZ0KQotCQl7Ci0JCQlpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpCi0JCQkJbV9TZWxTdGF0ZS5TZXRFbmRQb3MobV93cENhcmV0KTsKLQkJCWVsc2UKLQkJCQltX1NlbFN0YXRlLlNldChtX3dwT2xkQ2FyZXQsbV93cENhcmV0KTsKKyAgICBpZiAoYlNoaWZ0KSB7CisgICAgICBpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpCisgICAgICAgIG1fU2VsU3RhdGUuU2V0RW5kUG9zKG1fd3BDYXJldCk7CisgICAgICBlbHNlCisgICAgICAgIG1fU2VsU3RhdGUuU2V0KG1fd3BPbGRDYXJldCwgbV93cENhcmV0KTsKIAotCQkJaWYgKG1fd3BPbGRDYXJldCAhPSBtX3dwQ2FyZXQpCi0JCQl7Ci0JCQkJU2Nyb2xsVG9DYXJldCgpOwotCQkJCUNQVlRfV29yZFJhbmdlIHdyKG1fd3BPbGRDYXJldCwgbV93cENhcmV0KTsKLQkJCQlSZWZyZXNoKFJQX09QVElPTkFMLCAmd3IpOwotCQkJCVNldENhcmV0SW5mbygpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJU2VsZWN0Tm9uZSgpOwkJCi0JCQkKLQkJCVNjcm9sbFRvQ2FyZXQoKTsJCQkKLQkJCVNldENhcmV0SW5mbygpOwotCQl9Ci0JfQorICAgICAgaWYgKG1fd3BPbGRDYXJldCAhPSBtX3dwQ2FyZXQpIHsKKyAgICAgICAgU2Nyb2xsVG9DYXJldCgpOworICAgICAgICBDUFZUX1dvcmRSYW5nZSB3cihtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCk7CisgICAgICAgIFJlZnJlc2goUlBfT1BUSU9OQUwsICZ3cik7CisgICAgICAgIFNldENhcmV0SW5mbygpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBTZWxlY3ROb25lKCk7CisKKyAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKKyAgICAgIFNldENhcmV0SW5mbygpOworICAgIH0KKyAgfQogfQogCi12b2lkIENGWF9FZGl0OjpPblZLX0RPV04oRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKLXsKLQlpZiAobV9wVlQtPklzVmFsaWQoKSkKLQl7Ci0JCVNldENhcmV0KG1fcFZULT5HZXREb3duV29yZFBsYWNlKG1fd3BDYXJldCxtX3B0Q2FyZXQpKTsKK3ZvaWQgQ0ZYX0VkaXQ6Ok9uVktfRE9XTihGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgeworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIFNldENhcmV0KG1fcFZULT5HZXREb3duV29yZFBsYWNlKG1fd3BDYXJldCwgbV9wdENhcmV0KSk7CiAKLQkJaWYgKGJTaGlmdCkKLQkJewotCQkJaWYgKG1fU2VsU3RhdGUuSXNFeGlzdCgpKQotCQkJCW1fU2VsU3RhdGUuU2V0RW5kUG9zKG1fd3BDYXJldCk7Ci0JCQllbHNlCi0JCQkJbV9TZWxTdGF0ZS5TZXQobV93cE9sZENhcmV0LG1fd3BDYXJldCk7CisgICAgaWYgKGJTaGlmdCkgeworICAgICAgaWYgKG1fU2VsU3RhdGUuSXNFeGlzdCgpKQorICAgICAgICBtX1NlbFN0YXRlLlNldEVuZFBvcyhtX3dwQ2FyZXQpOworICAgICAgZWxzZQorICAgICAgICBtX1NlbFN0YXRlLlNldChtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCk7CiAKLQkJCWlmIChtX3dwT2xkQ2FyZXQgIT0gbV93cENhcmV0KQotCQkJewotCQkJCVNjcm9sbFRvQ2FyZXQoKTsKLQkJCQlDUFZUX1dvcmRSYW5nZSB3cihtX3dwT2xkQ2FyZXQsbV93cENhcmV0KTsKLQkJCQlSZWZyZXNoKFJQX09QVElPTkFMLCAmd3IpOwotCQkJCVNldENhcmV0SW5mbygpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJU2VsZWN0Tm9uZSgpOworICAgICAgaWYgKG1fd3BPbGRDYXJldCAhPSBtX3dwQ2FyZXQpIHsKKyAgICAgICAgU2Nyb2xsVG9DYXJldCgpOworICAgICAgICBDUFZUX1dvcmRSYW5nZSB3cihtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCk7CisgICAgICAgIFJlZnJlc2goUlBfT1BUSU9OQUwsICZ3cik7CisgICAgICAgIFNldENhcmV0SW5mbygpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBTZWxlY3ROb25lKCk7CiAKLQkJCVNjcm9sbFRvQ2FyZXQoKTsJCQotCQkJU2V0Q2FyZXRJbmZvKCk7Ci0JCX0KLQl9CisgICAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgICBTZXRDYXJldEluZm8oKTsKKyAgICB9CisgIH0KIH0KIAotdm9pZCBDRlhfRWRpdDo6T25WS19MRUZUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCi17Ci0JaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCi0JewotCQlpZiAoYlNoaWZ0KQotCQl7Ci0JCQlpZiAobV93cENhcmV0ID09IG1fcFZULT5HZXRMaW5lQmVnaW5QbGFjZShtX3dwQ2FyZXQpICYmCi0JCQkJbV93cENhcmV0ICE9IG1fcFZULT5HZXRTZWN0aW9uQmVnaW5QbGFjZShtX3dwQ2FyZXQpKQotCQkJCVNldENhcmV0KG1fcFZULT5HZXRQcmV2V29yZFBsYWNlKG1fd3BDYXJldCkpOwkKK3ZvaWQgQ0ZYX0VkaXQ6Ok9uVktfTEVGVChGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgeworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIGlmIChiU2hpZnQpIHsKKyAgICAgIGlmIChtX3dwQ2FyZXQgPT0gbV9wVlQtPkdldExpbmVCZWdpblBsYWNlKG1fd3BDYXJldCkgJiYKKyAgICAgICAgICBtX3dwQ2FyZXQgIT0gbV9wVlQtPkdldFNlY3Rpb25CZWdpblBsYWNlKG1fd3BDYXJldCkpCisgICAgICAgIFNldENhcmV0KG1fcFZULT5HZXRQcmV2V29yZFBsYWNlKG1fd3BDYXJldCkpOwogCi0JCQlTZXRDYXJldChtX3BWVC0+R2V0UHJldldvcmRQbGFjZShtX3dwQ2FyZXQpKTsKKyAgICAgIFNldENhcmV0KG1fcFZULT5HZXRQcmV2V29yZFBsYWNlKG1fd3BDYXJldCkpOwogCi0JCQlpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpCi0JCQkJbV9TZWxTdGF0ZS5TZXRFbmRQb3MobV93cENhcmV0KTsJCQkKLQkJCWVsc2UKLQkJCQltX1NlbFN0YXRlLlNldChtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCk7CisgICAgICBpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpCisgICAgICAgIG1fU2VsU3RhdGUuU2V0RW5kUG9zKG1fd3BDYXJldCk7CisgICAgICBlbHNlCisgICAgICAgIG1fU2VsU3RhdGUuU2V0KG1fd3BPbGRDYXJldCwgbV93cENhcmV0KTsKIAotCQkJaWYgKG1fd3BPbGRDYXJldCAhPSBtX3dwQ2FyZXQpCi0JCQl7Ci0JCQkJU2Nyb2xsVG9DYXJldCgpOwotCQkJCUNQVlRfV29yZFJhbmdlIHdyKG1fd3BPbGRDYXJldCxtX3dwQ2FyZXQpOwotCQkJCVJlZnJlc2goUlBfT1BUSU9OQUwsJndyKTsKLQkJCQlTZXRDYXJldEluZm8oKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChtX1NlbFN0YXRlLklzRXhpc3QoKSkKLQkJCXsKLQkJCQlpZiAobV9TZWxTdGF0ZS5CZWdpblBvcy5Xb3JkQ21wKG1fU2VsU3RhdGUuRW5kUG9zKTwwKQotCQkJCQlTZXRDYXJldChtX1NlbFN0YXRlLkJlZ2luUG9zKTsKLQkJCQllbHNlCi0JCQkJCVNldENhcmV0KG1fU2VsU3RhdGUuRW5kUG9zKTsKKyAgICAgIGlmIChtX3dwT2xkQ2FyZXQgIT0gbV93cENhcmV0KSB7CisgICAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKKyAgICAgICAgQ1BWVF9Xb3JkUmFuZ2Ugd3IobV93cE9sZENhcmV0LCBtX3dwQ2FyZXQpOworICAgICAgICBSZWZyZXNoKFJQX09QVElPTkFMLCAmd3IpOworICAgICAgICBTZXRDYXJldEluZm8oKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKG1fU2VsU3RhdGUuSXNFeGlzdCgpKSB7CisgICAgICAgIGlmIChtX1NlbFN0YXRlLkJlZ2luUG9zLldvcmRDbXAobV9TZWxTdGF0ZS5FbmRQb3MpIDwgMCkKKyAgICAgICAgICBTZXRDYXJldChtX1NlbFN0YXRlLkJlZ2luUG9zKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIFNldENhcmV0KG1fU2VsU3RhdGUuRW5kUG9zKTsKIAotCQkJCVNlbGVjdE5vbmUoKTsKLQkJCQlTY3JvbGxUb0NhcmV0KCk7Ci0JCQkJU2V0Q2FyZXRJbmZvKCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKG1fd3BDYXJldCA9PSBtX3BWVC0+R2V0TGluZUJlZ2luUGxhY2UobV93cENhcmV0KSAmJgotCQkJCQltX3dwQ2FyZXQgIT0gbV9wVlQtPkdldFNlY3Rpb25CZWdpblBsYWNlKG1fd3BDYXJldCkpCi0JCQkJCVNldENhcmV0KG1fcFZULT5HZXRQcmV2V29yZFBsYWNlKG1fd3BDYXJldCkpOwkKKyAgICAgICAgU2VsZWN0Tm9uZSgpOworICAgICAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgICAgIFNldENhcmV0SW5mbygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1fd3BDYXJldCA9PSBtX3BWVC0+R2V0TGluZUJlZ2luUGxhY2UobV93cENhcmV0KSAmJgorICAgICAgICAgICAgbV93cENhcmV0ICE9IG1fcFZULT5HZXRTZWN0aW9uQmVnaW5QbGFjZShtX3dwQ2FyZXQpKQorICAgICAgICAgIFNldENhcmV0KG1fcFZULT5HZXRQcmV2V29yZFBsYWNlKG1fd3BDYXJldCkpOwogCi0JCQkJU2V0Q2FyZXQobV9wVlQtPkdldFByZXZXb3JkUGxhY2UobV93cENhcmV0KSk7CisgICAgICAgIFNldENhcmV0KG1fcFZULT5HZXRQcmV2V29yZFBsYWNlKG1fd3BDYXJldCkpOwogCi0JCQkJU2Nyb2xsVG9DYXJldCgpOwotCQkJCVNldENhcmV0T3JpZ2luKCk7Ci0JCQkJU2V0Q2FyZXRJbmZvKCk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKKyAgICAgICAgU2V0Q2FyZXRPcmlnaW4oKTsKKyAgICAgICAgU2V0Q2FyZXRJbmZvKCk7CisgICAgICB9CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6Ok9uVktfUklHSFQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKLXsKLQlpZiAobV9wVlQtPklzVmFsaWQoKSkKLQl7Ci0JCWlmIChiU2hpZnQpCi0JCXsKLQkJCVNldENhcmV0KG1fcFZULT5HZXROZXh0V29yZFBsYWNlKG1fd3BDYXJldCkpOwordm9pZCBDRlhfRWRpdDo6T25WS19SSUdIVChGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgeworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIGlmIChiU2hpZnQpIHsKKyAgICAgIFNldENhcmV0KG1fcFZULT5HZXROZXh0V29yZFBsYWNlKG1fd3BDYXJldCkpOwogCi0JCQlpZiAobV93cENhcmV0ID09IG1fcFZULT5HZXRMaW5lRW5kUGxhY2UobV93cENhcmV0KSAmJgotCQkJCW1fd3BDYXJldCAhPSBtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKG1fd3BDYXJldCkpCi0JCQkJU2V0Q2FyZXQobV9wVlQtPkdldE5leHRXb3JkUGxhY2UobV93cENhcmV0KSk7CisgICAgICBpZiAobV93cENhcmV0ID09IG1fcFZULT5HZXRMaW5lRW5kUGxhY2UobV93cENhcmV0KSAmJgorICAgICAgICAgIG1fd3BDYXJldCAhPSBtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKG1fd3BDYXJldCkpCisgICAgICAgIFNldENhcmV0KG1fcFZULT5HZXROZXh0V29yZFBsYWNlKG1fd3BDYXJldCkpOwogCi0JCQlpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpCi0JCQkJbV9TZWxTdGF0ZS5TZXRFbmRQb3MobV93cENhcmV0KTsJCQkKLQkJCWVsc2UKLQkJCQltX1NlbFN0YXRlLlNldChtX3dwT2xkQ2FyZXQsbV93cENhcmV0KTsJCQkKKyAgICAgIGlmIChtX1NlbFN0YXRlLklzRXhpc3QoKSkKKyAgICAgICAgbV9TZWxTdGF0ZS5TZXRFbmRQb3MobV93cENhcmV0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgbV9TZWxTdGF0ZS5TZXQobV93cE9sZENhcmV0LCBtX3dwQ2FyZXQpOwogCi0JCQlpZiAobV93cE9sZENhcmV0ICE9IG1fd3BDYXJldCkKLQkJCXsJCQkKLQkJCQlTY3JvbGxUb0NhcmV0KCk7Ci0JCQkJQ1BWVF9Xb3JkUmFuZ2Ugd3IobV93cE9sZENhcmV0LG1fd3BDYXJldCk7Ci0JCQkJUmVmcmVzaChSUF9PUFRJT05BTCwmd3IpOwotCQkJCVNldENhcmV0SW5mbygpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKG1fU2VsU3RhdGUuSXNFeGlzdCgpKQotCQkJewotCQkJCWlmIChtX1NlbFN0YXRlLkJlZ2luUG9zLldvcmRDbXAobV9TZWxTdGF0ZS5FbmRQb3MpPjApCi0JCQkJCVNldENhcmV0KG1fU2VsU3RhdGUuQmVnaW5Qb3MpOwotCQkJCWVsc2UKLQkJCQkJU2V0Q2FyZXQobV9TZWxTdGF0ZS5FbmRQb3MpOworICAgICAgaWYgKG1fd3BPbGRDYXJldCAhPSBtX3dwQ2FyZXQpIHsKKyAgICAgICAgU2Nyb2xsVG9DYXJldCgpOworICAgICAgICBDUFZUX1dvcmRSYW5nZSB3cihtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCk7CisgICAgICAgIFJlZnJlc2goUlBfT1BUSU9OQUwsICZ3cik7CisgICAgICAgIFNldENhcmV0SW5mbygpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpIHsKKyAgICAgICAgaWYgKG1fU2VsU3RhdGUuQmVnaW5Qb3MuV29yZENtcChtX1NlbFN0YXRlLkVuZFBvcykgPiAwKQorICAgICAgICAgIFNldENhcmV0KG1fU2VsU3RhdGUuQmVnaW5Qb3MpOworICAgICAgICBlbHNlCisgICAgICAgICAgU2V0Q2FyZXQobV9TZWxTdGF0ZS5FbmRQb3MpOwogCi0JCQkJU2VsZWN0Tm9uZSgpOwotCQkJCVNjcm9sbFRvQ2FyZXQoKTsKLQkJCQlTZXRDYXJldEluZm8oKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlTZXRDYXJldChtX3BWVC0+R2V0TmV4dFdvcmRQbGFjZShtX3dwQ2FyZXQpKTsKKyAgICAgICAgU2VsZWN0Tm9uZSgpOworICAgICAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgICAgIFNldENhcmV0SW5mbygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldE5leHRXb3JkUGxhY2UobV93cENhcmV0KSk7CiAKLQkJCQlpZiAobV93cENhcmV0ID09IG1fcFZULT5HZXRMaW5lRW5kUGxhY2UobV93cENhcmV0KSAmJgotCQkJCQltX3dwQ2FyZXQgIT0gbV9wVlQtPkdldFNlY3Rpb25FbmRQbGFjZShtX3dwQ2FyZXQpKQotCQkJCQlTZXRDYXJldChtX3BWVC0+R2V0TmV4dFdvcmRQbGFjZShtX3dwQ2FyZXQpKTsJCQkJCisgICAgICAgIGlmIChtX3dwQ2FyZXQgPT0gbV9wVlQtPkdldExpbmVFbmRQbGFjZShtX3dwQ2FyZXQpICYmCisgICAgICAgICAgICBtX3dwQ2FyZXQgIT0gbV9wVlQtPkdldFNlY3Rpb25FbmRQbGFjZShtX3dwQ2FyZXQpKQorICAgICAgICAgIFNldENhcmV0KG1fcFZULT5HZXROZXh0V29yZFBsYWNlKG1fd3BDYXJldCkpOwogCi0JCQkJU2Nyb2xsVG9DYXJldCgpOwotCQkJCVNldENhcmV0T3JpZ2luKCk7Ci0JCQkJU2V0Q2FyZXRJbmZvKCk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKKyAgICAgICAgU2V0Q2FyZXRPcmlnaW4oKTsKKyAgICAgICAgU2V0Q2FyZXRJbmZvKCk7CisgICAgICB9CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6Ok9uVktfSE9NRShGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQotewotCWlmIChtX3BWVC0+SXNWYWxpZCgpKQotCXsKLQkJaWYgKGJTaGlmdCkKLQkJewotCQkJaWYgKGJDdHJsKQotCQkJCVNldENhcmV0KG1fcFZULT5HZXRCZWdpbldvcmRQbGFjZSgpKTsKLQkJCWVsc2UKLQkJCQlTZXRDYXJldChtX3BWVC0+R2V0TGluZUJlZ2luUGxhY2UobV93cENhcmV0KSk7Cit2b2lkIENGWF9FZGl0OjpPblZLX0hPTUUoRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBpZiAoYlNoaWZ0KSB7CisgICAgICBpZiAoYkN0cmwpCisgICAgICAgIFNldENhcmV0KG1fcFZULT5HZXRCZWdpbldvcmRQbGFjZSgpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldExpbmVCZWdpblBsYWNlKG1fd3BDYXJldCkpOwogCi0JCQlpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpCi0JCQkJbV9TZWxTdGF0ZS5TZXRFbmRQb3MobV93cENhcmV0KTsJCQkKLQkJCWVsc2UKLQkJCQltX1NlbFN0YXRlLlNldChtX3dwT2xkQ2FyZXQsbV93cENhcmV0KTsKKyAgICAgIGlmIChtX1NlbFN0YXRlLklzRXhpc3QoKSkKKyAgICAgICAgbV9TZWxTdGF0ZS5TZXRFbmRQb3MobV93cENhcmV0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgbV9TZWxTdGF0ZS5TZXQobV93cE9sZENhcmV0LCBtX3dwQ2FyZXQpOworCisgICAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgICBDUFZUX1dvcmRSYW5nZSB3cihtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCk7CisgICAgICBSZWZyZXNoKFJQX09QVElPTkFMLCAmd3IpOworICAgICAgU2V0Q2FyZXRJbmZvKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtX1NlbFN0YXRlLklzRXhpc3QoKSkgeworICAgICAgICBpZiAobV9TZWxTdGF0ZS5CZWdpblBvcy5Xb3JkQ21wKG1fU2VsU3RhdGUuRW5kUG9zKSA8IDApCisgICAgICAgICAgU2V0Q2FyZXQobV9TZWxTdGF0ZS5CZWdpblBvcyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBTZXRDYXJldChtX1NlbFN0YXRlLkVuZFBvcyk7CiAKLQkJCVNjcm9sbFRvQ2FyZXQoKTsKLQkJCUNQVlRfV29yZFJhbmdlIHdyKG1fd3BPbGRDYXJldCwgbV93cENhcmV0KTsKLQkJCVJlZnJlc2goUlBfT1BUSU9OQUwsICZ3cik7Ci0JCQlTZXRDYXJldEluZm8oKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChtX1NlbFN0YXRlLklzRXhpc3QoKSkKLQkJCXsKLQkJCQlpZiAobV9TZWxTdGF0ZS5CZWdpblBvcy5Xb3JkQ21wKG1fU2VsU3RhdGUuRW5kUG9zKTwwKQotCQkJCQlTZXRDYXJldChtX1NlbFN0YXRlLkJlZ2luUG9zKTsKLQkJCQllbHNlCi0JCQkJCVNldENhcmV0KG1fU2VsU3RhdGUuRW5kUG9zKTsKKyAgICAgICAgU2VsZWN0Tm9uZSgpOworICAgICAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgICAgIFNldENhcmV0SW5mbygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGJDdHJsKQorICAgICAgICAgIFNldENhcmV0KG1fcFZULT5HZXRCZWdpbldvcmRQbGFjZSgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIFNldENhcmV0KG1fcFZULT5HZXRMaW5lQmVnaW5QbGFjZShtX3dwQ2FyZXQpKTsKIAotCQkJCVNlbGVjdE5vbmUoKTsKLQkJCQlTY3JvbGxUb0NhcmV0KCk7Ci0JCQkJU2V0Q2FyZXRJbmZvKCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKGJDdHJsKQotCQkJCQlTZXRDYXJldChtX3BWVC0+R2V0QmVnaW5Xb3JkUGxhY2UoKSk7Ci0JCQkJZWxzZQotCQkJCQlTZXRDYXJldChtX3BWVC0+R2V0TGluZUJlZ2luUGxhY2UobV93cENhcmV0KSk7CQotCQkJCQotCQkJCVNjcm9sbFRvQ2FyZXQoKTsKLQkJCQlTZXRDYXJldE9yaWdpbigpOwotCQkJCVNldENhcmV0SW5mbygpOwotCQkJfQotCQl9Ci0JfQorICAgICAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgICAgIFNldENhcmV0T3JpZ2luKCk7CisgICAgICAgIFNldENhcmV0SW5mbygpOworICAgICAgfQorICAgIH0KKyAgfQogfQogCi12b2lkIENGWF9FZGl0OjpPblZLX0VORChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQotewotCWlmIChtX3BWVC0+SXNWYWxpZCgpKQotCXsKLQkJaWYgKGJTaGlmdCkKLQkJewotCQkJaWYgKGJDdHJsKQotCQkJCVNldENhcmV0KG1fcFZULT5HZXRFbmRXb3JkUGxhY2UoKSk7Ci0JCQllbHNlCi0JCQkJU2V0Q2FyZXQobV9wVlQtPkdldExpbmVFbmRQbGFjZShtX3dwQ2FyZXQpKTsKK3ZvaWQgQ0ZYX0VkaXQ6Ok9uVktfRU5EKEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJDdHJsKSB7CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7CisgICAgaWYgKGJTaGlmdCkgeworICAgICAgaWYgKGJDdHJsKQorICAgICAgICBTZXRDYXJldChtX3BWVC0+R2V0RW5kV29yZFBsYWNlKCkpOworICAgICAgZWxzZQorICAgICAgICBTZXRDYXJldChtX3BWVC0+R2V0TGluZUVuZFBsYWNlKG1fd3BDYXJldCkpOwogCi0JCQlpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpCi0JCQkJbV9TZWxTdGF0ZS5TZXRFbmRQb3MobV93cENhcmV0KTsKLQkJCWVsc2UKLQkJCQltX1NlbFN0YXRlLlNldChtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCk7CisgICAgICBpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpCisgICAgICAgIG1fU2VsU3RhdGUuU2V0RW5kUG9zKG1fd3BDYXJldCk7CisgICAgICBlbHNlCisgICAgICAgIG1fU2VsU3RhdGUuU2V0KG1fd3BPbGRDYXJldCwgbV93cENhcmV0KTsKKworICAgICAgU2Nyb2xsVG9DYXJldCgpOworICAgICAgQ1BWVF9Xb3JkUmFuZ2Ugd3IobV93cE9sZENhcmV0LCBtX3dwQ2FyZXQpOworICAgICAgUmVmcmVzaChSUF9PUFRJT05BTCwgJndyKTsKKyAgICAgIFNldENhcmV0SW5mbygpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpIHsKKyAgICAgICAgaWYgKG1fU2VsU3RhdGUuQmVnaW5Qb3MuV29yZENtcChtX1NlbFN0YXRlLkVuZFBvcykgPiAwKQorICAgICAgICAgIFNldENhcmV0KG1fU2VsU3RhdGUuQmVnaW5Qb3MpOworICAgICAgICBlbHNlCisgICAgICAgICAgU2V0Q2FyZXQobV9TZWxTdGF0ZS5FbmRQb3MpOwogCi0JCQlTY3JvbGxUb0NhcmV0KCk7Ci0JCQlDUFZUX1dvcmRSYW5nZSB3cihtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCk7Ci0JCQlSZWZyZXNoKFJQX09QVElPTkFMLCAmd3IpOwotCQkJU2V0Q2FyZXRJbmZvKCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpCi0JCQl7Ci0JCQkJaWYgKG1fU2VsU3RhdGUuQmVnaW5Qb3MuV29yZENtcChtX1NlbFN0YXRlLkVuZFBvcyk+MCkKLQkJCQkJU2V0Q2FyZXQobV9TZWxTdGF0ZS5CZWdpblBvcyk7Ci0JCQkJZWxzZQotCQkJCQlTZXRDYXJldChtX1NlbFN0YXRlLkVuZFBvcyk7CisgICAgICAgIFNlbGVjdE5vbmUoKTsKKyAgICAgICAgU2Nyb2xsVG9DYXJldCgpOworICAgICAgICBTZXRDYXJldEluZm8oKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChiQ3RybCkKKyAgICAgICAgICBTZXRDYXJldChtX3BWVC0+R2V0RW5kV29yZFBsYWNlKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldExpbmVFbmRQbGFjZShtX3dwQ2FyZXQpKTsKIAotCQkJCVNlbGVjdE5vbmUoKTsKLQkJCQlTY3JvbGxUb0NhcmV0KCk7Ci0JCQkJU2V0Q2FyZXRJbmZvKCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKGJDdHJsKQotCQkJCQlTZXRDYXJldChtX3BWVC0+R2V0RW5kV29yZFBsYWNlKCkpOwotCQkJCWVsc2UKLQkJCQkJU2V0Q2FyZXQobV9wVlQtPkdldExpbmVFbmRQbGFjZShtX3dwQ2FyZXQpKTsKLQkJCQkJCQotCQkJCVNjcm9sbFRvQ2FyZXQoKTsJCQkKLQkJCQlTZXRDYXJldE9yaWdpbigpOwotCQkJCVNldENhcmV0SW5mbygpOwotCQkJfQotCQl9Ci0JfQorICAgICAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgICAgIFNldENhcmV0T3JpZ2luKCk7CisgICAgICAgIFNldENhcmV0SW5mbygpOworICAgICAgfQorICAgIH0KKyAgfQogfQogCi12b2lkIENGWF9FZGl0OjpTZXRUZXh0KEZYX0xQQ1dTVFIgdGV4dCxGWF9JTlQzMiBjaGFyc2V0LAotCQkJCQkJY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsIEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KQotewotCUVtcHR5KCk7Ci0JRG9JbnNlcnRUZXh0KENQVlRfV29yZFBsYWNlKDAsMCwtMSksIHRleHQsIGNoYXJzZXQsIHBTZWNQcm9wcywgcFdvcmRQcm9wcyk7Ci0JaWYgKGJQYWludCkgUGFpbnQoKTsKLQlpZiAobV9iT3ByTm90aWZ5ICYmIG1fcE9wck5vdGlmeSkKLQkJbV9wT3ByTm90aWZ5LT5PblNldFRleHQobV93cENhcmV0LCBtX3dwT2xkQ2FyZXQpOwotCS8vaWYgKGJBZGRVbmRvKQordm9pZCBDRlhfRWRpdDo6U2V0VGV4dChjb25zdCBGWF9XQ0hBUiogdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBZGRVbmRvLAorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQYWludCkgeworICBFbXB0eSgpOworICBEb0luc2VydFRleHQoQ1BWVF9Xb3JkUGxhY2UoMCwgMCwgLTEpLCB0ZXh0LCBjaGFyc2V0LCBwU2VjUHJvcHMsIHBXb3JkUHJvcHMpOworICBpZiAoYlBhaW50KQorICAgIFBhaW50KCk7CisgIGlmIChtX2JPcHJOb3RpZnkgJiYgbV9wT3ByTm90aWZ5KQorICAgIG1fcE9wck5vdGlmeS0+T25TZXRUZXh0KG1fd3BDYXJldCwgbV93cE9sZENhcmV0KTsKIH0KIAorRlhfQk9PTCBDRlhfRWRpdDo6SW5zZXJ0V29yZChGWF9XT1JEIHdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFkZFVuZG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlBhaW50KSB7CisgIGlmIChJc1RleHRPdmVyZmxvdygpKQorICAgIHJldHVybiBGQUxTRTsKKwotRlhfQk9PTCBDRlhfRWRpdDo6SW5zZXJ0V29yZChGWF9XT1JEIHdvcmQsIEZYX0lOVDMyIGNoYXJzZXQsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcywgRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpCi17Ci0JaWYgKElzVGV4dE92ZXJmbG93KCkpIHJldHVybiBGQUxTRTsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKG1fd3BDYXJldCk7CiAKLQlpZiAobV9wVlQtPklzVmFsaWQoKSkKLQl7Ci0JCW1fcFZULT5VcGRhdGVXb3JkUGxhY2UobV93cENhcmV0KTsKKyAgICBTZXRDYXJldChtX3BWVC0+SW5zZXJ0V29yZCgKKyAgICAgICAgbV93cENhcmV0LCB3b3JkLCBHZXRDaGFyU2V0RnJvbVVuaWNvZGUod29yZCwgY2hhcnNldCksIHBXb3JkUHJvcHMpKTsKKyAgICBtX1NlbFN0YXRlLlNldChtX3dwQ2FyZXQsIG1fd3BDYXJldCk7CiAKLQkJU2V0Q2FyZXQobV9wVlQtPkluc2VydFdvcmQobV93cENhcmV0LHdvcmQsR2V0Q2hhclNldEZyb21Vbmljb2RlKHdvcmQsIGNoYXJzZXQpLHBXb3JkUHJvcHMpKTsKLQkJbV9TZWxTdGF0ZS5TZXQobV93cENhcmV0LG1fd3BDYXJldCk7CisgICAgaWYgKG1fd3BDYXJldCAhPSBtX3dwT2xkQ2FyZXQpIHsKKyAgICAgIGlmIChiQWRkVW5kbyAmJiBtX2JFbmFibGVVbmRvKSB7CisgICAgICAgIEFkZEVkaXRVbmRvSXRlbShuZXcgQ0ZYRVVfSW5zZXJ0V29yZCh0aGlzLCBtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQsIGNoYXJzZXQsIHBXb3JkUHJvcHMpKTsKKyAgICAgIH0KIAotCQlpZiAobV93cENhcmV0ICE9IG1fd3BPbGRDYXJldCkKLQkJewotCQkJaWYgKGJBZGRVbmRvICYmIG1fYkVuYWJsZVVuZG8pCi0JCQl7Ci0JCQkJQWRkRWRpdFVuZG9JdGVtKG5ldyBDRlhFVV9JbnNlcnRXb3JkKHRoaXMsbV93cE9sZENhcmV0LG1fd3BDYXJldCx3b3JkLGNoYXJzZXQscFdvcmRQcm9wcykpOwotCQkJfQorICAgICAgaWYgKGJQYWludCkKKyAgICAgICAgUGFpbnRJbnNlcnRUZXh0KG1fd3BPbGRDYXJldCwgbV93cENhcmV0KTsKIAotCQkJaWYgKGJQYWludCkKLQkJCQlQYWludEluc2VydFRleHQobV93cE9sZENhcmV0LCBtX3dwQ2FyZXQpOworICAgICAgaWYgKG1fYk9wck5vdGlmeSAmJiBtX3BPcHJOb3RpZnkpCisgICAgICAgIG1fcE9wck5vdGlmeS0+T25JbnNlcnRXb3JkKG1fd3BDYXJldCwgbV93cE9sZENhcmV0KTsKIAotCQkJaWYgKG1fYk9wck5vdGlmeSAmJiBtX3BPcHJOb3RpZnkpCi0JCQkJbV9wT3ByTm90aWZ5LT5Pbkluc2VydFdvcmQobV93cENhcmV0LCBtX3dwT2xkQ2FyZXQpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CiAKLQkJCXJldHVybiBUUlVFOwotCQl9Ci0JfQotCQotCXJldHVybiBGQUxTRTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpJbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9TZWNQcm9wcyAqIHBTZWNQcm9wcyxjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMsIAotCQkJCQkJCSAgIEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KQotewotCWlmIChJc1RleHRPdmVyZmxvdygpKSByZXR1cm4gRkFMU0U7CitGWF9CT09MIENGWF9FZGl0OjpJbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFkZFVuZG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGFpbnQpIHsKKyAgaWYgKElzVGV4dE92ZXJmbG93KCkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCi0JewotCQltX3BWVC0+VXBkYXRlV29yZFBsYWNlKG1fd3BDYXJldCk7Ci0JCVNldENhcmV0KG1fcFZULT5JbnNlcnRTZWN0aW9uKG1fd3BDYXJldCxwU2VjUHJvcHMscFdvcmRQcm9wcykpOwotCQltX1NlbFN0YXRlLlNldChtX3dwQ2FyZXQsbV93cENhcmV0KTsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKG1fd3BDYXJldCk7CisgICAgU2V0Q2FyZXQobV9wVlQtPkluc2VydFNlY3Rpb24obV93cENhcmV0LCBwU2VjUHJvcHMsIHBXb3JkUHJvcHMpKTsKKyAgICBtX1NlbFN0YXRlLlNldChtX3dwQ2FyZXQsIG1fd3BDYXJldCk7CiAKLQkJaWYgKG1fd3BDYXJldCAhPSBtX3dwT2xkQ2FyZXQpCi0JCXsKLQkJCWlmIChiQWRkVW5kbyAmJiBtX2JFbmFibGVVbmRvKQotCQkJewotCQkJCUFkZEVkaXRVbmRvSXRlbShuZXcgQ0ZYRVVfSW5zZXJ0UmV0dXJuKHRoaXMsbV93cE9sZENhcmV0LG1fd3BDYXJldCxwU2VjUHJvcHMscFdvcmRQcm9wcykpOwotCQkJfQorICAgIGlmIChtX3dwQ2FyZXQgIT0gbV93cE9sZENhcmV0KSB7CisgICAgICBpZiAoYkFkZFVuZG8gJiYgbV9iRW5hYmxlVW5kbykgeworICAgICAgICBBZGRFZGl0VW5kb0l0ZW0obmV3IENGWEVVX0luc2VydFJldHVybih0aGlzLCBtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlY1Byb3BzLCBwV29yZFByb3BzKSk7CisgICAgICB9CiAKLQkJCWlmIChiUGFpbnQpCi0JCQl7Ci0JCQkJUmVhcnJhbmdlUGFydChDUFZUX1dvcmRSYW5nZShtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCkpOwotCQkJCVNjcm9sbFRvQ2FyZXQoKTsKLQkJCQlDUFZUX1dvcmRSYW5nZSB3cihtX3dwT2xkQ2FyZXQsIEdldFZpc2libGVXb3JkUmFuZ2UoKS5FbmRQb3MpOwotCQkJCVJlZnJlc2goUlBfQU5BTFlTRSwgJndyKTsJCQotCQkJCVNldENhcmV0T3JpZ2luKCk7Ci0JCQkJU2V0Q2FyZXRJbmZvKCk7CQkJCi0JCQl9CisgICAgICBpZiAoYlBhaW50KSB7CisgICAgICAgIFJlYXJyYW5nZVBhcnQoQ1BWVF9Xb3JkUmFuZ2UobV93cE9sZENhcmV0LCBtX3dwQ2FyZXQpKTsKKyAgICAgICAgU2Nyb2xsVG9DYXJldCgpOworICAgICAgICBDUFZUX1dvcmRSYW5nZSB3cihtX3dwT2xkQ2FyZXQsIEdldFZpc2libGVXb3JkUmFuZ2UoKS5FbmRQb3MpOworICAgICAgICBSZWZyZXNoKFJQX0FOQUxZU0UsICZ3cik7CisgICAgICAgIFNldENhcmV0T3JpZ2luKCk7CisgICAgICAgIFNldENhcmV0SW5mbygpOworICAgICAgfQogCi0JCQlpZiAobV9iT3ByTm90aWZ5ICYmIG1fcE9wck5vdGlmeSkKLQkJCQltX3BPcHJOb3RpZnktPk9uSW5zZXJ0UmV0dXJuKG1fd3BDYXJldCwgbV93cE9sZENhcmV0KTsKKyAgICAgIGlmIChtX2JPcHJOb3RpZnkgJiYgbV9wT3ByTm90aWZ5KQorICAgICAgICBtX3BPcHJOb3RpZnktPk9uSW5zZXJ0UmV0dXJuKG1fd3BDYXJldCwgbV93cE9sZENhcmV0KTsKIAotCQkJcmV0dXJuIFRSVUU7Ci0JCX0KLQl9CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KIAotCXJldHVybiBGQUxTRTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIENGWF9FZGl0OjpCYWNrc3BhY2UoRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpCi17Ci0JaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCi0JewotCQlpZiAobV93cENhcmV0ID09IG1fcFZULT5HZXRCZWdpbldvcmRQbGFjZSgpKSByZXR1cm4gRkFMU0U7CitGWF9CT09MIENGWF9FZGl0OjpCYWNrc3BhY2UoRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBpZiAobV93cENhcmV0ID09IG1fcFZULT5HZXRCZWdpbldvcmRQbGFjZSgpKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCUNQVlRfU2VjdGlvbiBzZWN0aW9uOwotCQlDUFZUX1dvcmQgd29yZDsKKyAgICBDUFZUX1NlY3Rpb24gc2VjdGlvbjsKKyAgICBDUFZUX1dvcmQgd29yZDsKIAotCQlpZiAoYkFkZFVuZG8pCi0JCXsKLQkJCWlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciAqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKQotCQkJewkJCQkKLQkJCQlwSXRlcmF0b3ItPlNldEF0KG1fd3BDYXJldCk7Ci0JCQkJcEl0ZXJhdG9yLT5HZXRTZWN0aW9uKHNlY3Rpb24pOwotCQkJCXBJdGVyYXRvci0+R2V0V29yZCh3b3JkKTsKLQkJCX0KLQkJfQorICAgIGlmIChiQWRkVW5kbykgeworICAgICAgaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKSkgeworICAgICAgICBwSXRlcmF0b3ItPlNldEF0KG1fd3BDYXJldCk7CisgICAgICAgIHBJdGVyYXRvci0+R2V0U2VjdGlvbihzZWN0aW9uKTsKKyAgICAgICAgcEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpOworICAgICAgfQorICAgIH0KIAotCQltX3BWVC0+VXBkYXRlV29yZFBsYWNlKG1fd3BDYXJldCk7Ci0JCVNldENhcmV0KG1fcFZULT5CYWNrU3BhY2VXb3JkKG1fd3BDYXJldCkpOwotCQltX1NlbFN0YXRlLlNldChtX3dwQ2FyZXQsbV93cENhcmV0KTsKKyAgICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKG1fd3BDYXJldCk7CisgICAgU2V0Q2FyZXQobV9wVlQtPkJhY2tTcGFjZVdvcmQobV93cENhcmV0KSk7CisgICAgbV9TZWxTdGF0ZS5TZXQobV93cENhcmV0LCBtX3dwQ2FyZXQpOwogCi0JCWlmIChtX3dwQ2FyZXQgIT0gbV93cE9sZENhcmV0KQotCQl7Ci0JCQlpZiAoYkFkZFVuZG8gJiYgbV9iRW5hYmxlVW5kbykKLQkJCXsKLQkJCQlpZiAobV93cENhcmV0LlNlY0NtcChtX3dwT2xkQ2FyZXQpICE9IDApCQkJCi0JCQkJCUFkZEVkaXRVbmRvSXRlbShuZXcgQ0ZYRVVfQmFja3NwYWNlKHRoaXMsbV93cE9sZENhcmV0LG1fd3BDYXJldCx3b3JkLldvcmQsd29yZC5uQ2hhcnNldCwKLQkJCQkJCXNlY3Rpb24uU2VjUHJvcHMsc2VjdGlvbi5Xb3JkUHJvcHMpKTsKLQkJCQllbHNlCi0JCQkJCUFkZEVkaXRVbmRvSXRlbShuZXcgQ0ZYRVVfQmFja3NwYWNlKHRoaXMsbV93cE9sZENhcmV0LG1fd3BDYXJldCx3b3JkLldvcmQsd29yZC5uQ2hhcnNldCwKLQkJCQkJCXNlY3Rpb24uU2VjUHJvcHMsd29yZC5Xb3JkUHJvcHMpKTsKLQkJCX0KKyAgICBpZiAobV93cENhcmV0ICE9IG1fd3BPbGRDYXJldCkgeworICAgICAgaWYgKGJBZGRVbmRvICYmIG1fYkVuYWJsZVVuZG8pIHsKKyAgICAgICAgaWYgKG1fd3BDYXJldC5TZWNDbXAobV93cE9sZENhcmV0KSAhPSAwKQorICAgICAgICAgIEFkZEVkaXRVbmRvSXRlbShuZXcgQ0ZYRVVfQmFja3NwYWNlKAorICAgICAgICAgICAgICB0aGlzLCBtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCwgd29yZC5Xb3JkLCB3b3JkLm5DaGFyc2V0LAorICAgICAgICAgICAgICBzZWN0aW9uLlNlY1Byb3BzLCBzZWN0aW9uLldvcmRQcm9wcykpOworICAgICAgICBlbHNlCisgICAgICAgICAgQWRkRWRpdFVuZG9JdGVtKG5ldyBDRlhFVV9CYWNrc3BhY2UoCisgICAgICAgICAgICAgIHRoaXMsIG1fd3BPbGRDYXJldCwgbV93cENhcmV0LCB3b3JkLldvcmQsIHdvcmQubkNoYXJzZXQsCisgICAgICAgICAgICAgIHNlY3Rpb24uU2VjUHJvcHMsIHdvcmQuV29yZFByb3BzKSk7CisgICAgICB9CiAKLQkJCWlmIChiUGFpbnQpCi0JCQl7Ci0JCQkJUmVhcnJhbmdlUGFydChDUFZUX1dvcmRSYW5nZShtX3dwQ2FyZXQsbV93cE9sZENhcmV0KSk7Ci0JCQkJU2Nyb2xsVG9DYXJldCgpOworICAgICAgaWYgKGJQYWludCkgeworICAgICAgICBSZWFycmFuZ2VQYXJ0KENQVlRfV29yZFJhbmdlKG1fd3BDYXJldCwgbV93cE9sZENhcmV0KSk7CisgICAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKIAotCQkJCUNQVlRfV29yZFJhbmdlIHdyOwotCQkJCWlmIChtX3dwQ2FyZXQuU2VjQ21wKG1fd3BPbGRDYXJldCkgIT0wKQotCQkJCQl3ciA9IENQVlRfV29yZFJhbmdlKG1fcFZULT5HZXRQcmV2V29yZFBsYWNlKG1fd3BDYXJldCksR2V0VmlzaWJsZVdvcmRSYW5nZSgpLkVuZFBvcyk7CQotCQkJCWVsc2UgaWYgKG1fd3BDYXJldC5MaW5lQ21wKG1fd3BPbGRDYXJldCkgIT0wKQotCQkJCQl3ciA9IENQVlRfV29yZFJhbmdlKG1fcFZULT5HZXRMaW5lQmVnaW5QbGFjZShtX3dwQ2FyZXQpLG1fcFZULT5HZXRTZWN0aW9uRW5kUGxhY2UobV93cENhcmV0KSk7Ci0JCQkJZWxzZQotCQkJCQl3ciA9IENQVlRfV29yZFJhbmdlKG1fcFZULT5HZXRQcmV2V29yZFBsYWNlKG1fd3BDYXJldCksbV9wVlQtPkdldFNlY3Rpb25FbmRQbGFjZShtX3dwQ2FyZXQpKTsKKyAgICAgICAgQ1BWVF9Xb3JkUmFuZ2Ugd3I7CisgICAgICAgIGlmIChtX3dwQ2FyZXQuU2VjQ21wKG1fd3BPbGRDYXJldCkgIT0gMCkKKyAgICAgICAgICB3ciA9IENQVlRfV29yZFJhbmdlKG1fcFZULT5HZXRQcmV2V29yZFBsYWNlKG1fd3BDYXJldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRWaXNpYmxlV29yZFJhbmdlKCkuRW5kUG9zKTsKKyAgICAgICAgZWxzZSBpZiAobV93cENhcmV0LkxpbmVDbXAobV93cE9sZENhcmV0KSAhPSAwKQorICAgICAgICAgIHdyID0gQ1BWVF9Xb3JkUmFuZ2UobV9wVlQtPkdldExpbmVCZWdpblBsYWNlKG1fd3BDYXJldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKG1fd3BDYXJldCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgd3IgPSBDUFZUX1dvcmRSYW5nZShtX3BWVC0+R2V0UHJldldvcmRQbGFjZShtX3dwQ2FyZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wVlQtPkdldFNlY3Rpb25FbmRQbGFjZShtX3dwQ2FyZXQpKTsKIAotCQkJCVJlZnJlc2goUlBfQU5BTFlTRSwgJndyKTsKKyAgICAgICAgUmVmcmVzaChSUF9BTkFMWVNFLCAmd3IpOwogCi0JCQkJU2V0Q2FyZXRPcmlnaW4oKTsKLQkJCQlTZXRDYXJldEluZm8oKTsKLQkJCX0KKyAgICAgICAgU2V0Q2FyZXRPcmlnaW4oKTsKKyAgICAgICAgU2V0Q2FyZXRJbmZvKCk7CisgICAgICB9CiAKLQkJCWlmIChtX2JPcHJOb3RpZnkgJiYgbV9wT3ByTm90aWZ5KQotCQkJCW1fcE9wck5vdGlmeS0+T25CYWNrU3BhY2UobV93cENhcmV0LCBtX3dwT2xkQ2FyZXQpOworICAgICAgaWYgKG1fYk9wck5vdGlmeSAmJiBtX3BPcHJOb3RpZnkpCisgICAgICAgIG1fcE9wck5vdGlmeS0+T25CYWNrU3BhY2UobV93cENhcmV0LCBtX3dwT2xkQ2FyZXQpOwogCi0JCQlyZXR1cm4gVFJVRTsKLQkJfQotCX0KKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQogCi0JcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OkRlbGV0ZShGWF9CT09MIGJBZGRVbmRvLCBGWF9CT09MIGJQYWludCkKLXsKLQlpZiAobV9wVlQtPklzVmFsaWQoKSkKLQl7Ci0JCWlmIChtX3dwQ2FyZXQgPT0gbV9wVlQtPkdldEVuZFdvcmRQbGFjZSgpKSByZXR1cm4gRkFMU0U7CitGWF9CT09MIENGWF9FZGl0OjpEZWxldGUoRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBpZiAobV93cENhcmV0ID09IG1fcFZULT5HZXRFbmRXb3JkUGxhY2UoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlDUFZUX1NlY3Rpb24gc2VjdGlvbjsKLQkJQ1BWVF9Xb3JkIHdvcmQ7CisgICAgQ1BWVF9TZWN0aW9uIHNlY3Rpb247CisgICAgQ1BWVF9Xb3JkIHdvcmQ7CiAKLQkJaWYgKGJBZGRVbmRvKQotCQl7Ci0JCQlpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IgKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKSkKLQkJCXsJCQkJCi0JCQkJcEl0ZXJhdG9yLT5TZXRBdChtX3BWVC0+R2V0TmV4dFdvcmRQbGFjZShtX3dwQ2FyZXQpKTsKLQkJCQlwSXRlcmF0b3ItPkdldFNlY3Rpb24oc2VjdGlvbik7Ci0JCQkJcEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpOwotCQkJfQotCQl9CisgICAgaWYgKGJBZGRVbmRvKSB7CisgICAgICBpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKSB7CisgICAgICAgIHBJdGVyYXRvci0+U2V0QXQobV9wVlQtPkdldE5leHRXb3JkUGxhY2UobV93cENhcmV0KSk7CisgICAgICAgIHBJdGVyYXRvci0+R2V0U2VjdGlvbihzZWN0aW9uKTsKKyAgICAgICAgcEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpOworICAgICAgfQorICAgIH0KIAotCQltX3BWVC0+VXBkYXRlV29yZFBsYWNlKG1fd3BDYXJldCk7Ci0JCUZYX0JPT0wgYlNlY0VuZCA9IChtX3dwQ2FyZXQgPT0gbV9wVlQtPkdldFNlY3Rpb25FbmRQbGFjZShtX3dwQ2FyZXQpKTsKKyAgICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKG1fd3BDYXJldCk7CisgICAgRlhfQk9PTCBiU2VjRW5kID0gKG1fd3BDYXJldCA9PSBtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKG1fd3BDYXJldCkpOworCisgICAgU2V0Q2FyZXQobV9wVlQtPkRlbGV0ZVdvcmQobV93cENhcmV0KSk7CisgICAgbV9TZWxTdGF0ZS5TZXQobV93cENhcmV0LCBtX3dwQ2FyZXQpOworCisgICAgaWYgKGJBZGRVbmRvICYmIG1fYkVuYWJsZVVuZG8pIHsKKyAgICAgIGlmIChiU2VjRW5kKQorICAgICAgICBBZGRFZGl0VW5kb0l0ZW0obmV3IENGWEVVX0RlbGV0ZSgKKyAgICAgICAgICAgIHRoaXMsIG1fd3BPbGRDYXJldCwgbV93cENhcmV0LCB3b3JkLldvcmQsIHdvcmQubkNoYXJzZXQsCisgICAgICAgICAgICBzZWN0aW9uLlNlY1Byb3BzLCBzZWN0aW9uLldvcmRQcm9wcywgYlNlY0VuZCkpOworICAgICAgZWxzZQorICAgICAgICBBZGRFZGl0VW5kb0l0ZW0obmV3IENGWEVVX0RlbGV0ZSgKKyAgICAgICAgICAgIHRoaXMsIG1fd3BPbGRDYXJldCwgbV93cENhcmV0LCB3b3JkLldvcmQsIHdvcmQubkNoYXJzZXQsCisgICAgICAgICAgICBzZWN0aW9uLlNlY1Byb3BzLCB3b3JkLldvcmRQcm9wcywgYlNlY0VuZCkpOworICAgIH0KIAotCQlTZXRDYXJldChtX3BWVC0+RGVsZXRlV29yZChtX3dwQ2FyZXQpKTsKLQkJbV9TZWxTdGF0ZS5TZXQobV93cENhcmV0LG1fd3BDYXJldCk7CisgICAgaWYgKGJQYWludCkgeworICAgICAgUmVhcnJhbmdlUGFydChDUFZUX1dvcmRSYW5nZShtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCkpOworICAgICAgU2Nyb2xsVG9DYXJldCgpOwogCi0JCWlmIChiQWRkVW5kbyAmJiBtX2JFbmFibGVVbmRvKQotCQl7Ci0JCQlpZiAoYlNlY0VuZCkJCQotCQkJCUFkZEVkaXRVbmRvSXRlbShuZXcgQ0ZYRVVfRGVsZXRlKHRoaXMsbV93cE9sZENhcmV0LG1fd3BDYXJldCx3b3JkLldvcmQsd29yZC5uQ2hhcnNldCwKLQkJCQkJc2VjdGlvbi5TZWNQcm9wcyxzZWN0aW9uLldvcmRQcm9wcyxiU2VjRW5kKSk7Ci0JCQllbHNlCi0JCQkJQWRkRWRpdFVuZG9JdGVtKG5ldyBDRlhFVV9EZWxldGUodGhpcyxtX3dwT2xkQ2FyZXQsbV93cENhcmV0LHdvcmQuV29yZCx3b3JkLm5DaGFyc2V0LAotCQkJCQlzZWN0aW9uLlNlY1Byb3BzLHdvcmQuV29yZFByb3BzLGJTZWNFbmQpKTsKLQkJfQotCQkKLQkJaWYgKGJQYWludCkKLQkJewotCQkJUmVhcnJhbmdlUGFydChDUFZUX1dvcmRSYW5nZShtX3dwT2xkQ2FyZXQsbV93cENhcmV0KSk7Ci0JCQlTY3JvbGxUb0NhcmV0KCk7CisgICAgICBDUFZUX1dvcmRSYW5nZSB3cjsKKyAgICAgIGlmIChiU2VjRW5kKQorICAgICAgICB3ciA9IENQVlRfV29yZFJhbmdlKG1fcFZULT5HZXRQcmV2V29yZFBsYWNlKG1fd3BPbGRDYXJldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0VmlzaWJsZVdvcmRSYW5nZSgpLkVuZFBvcyk7CisgICAgICBlbHNlIGlmIChtX3dwQ2FyZXQuTGluZUNtcChtX3dwT2xkQ2FyZXQpICE9IDApCisgICAgICAgIHdyID0gQ1BWVF9Xb3JkUmFuZ2UobV9wVlQtPkdldExpbmVCZWdpblBsYWNlKG1fd3BDYXJldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wVlQtPkdldFNlY3Rpb25FbmRQbGFjZShtX3dwQ2FyZXQpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgd3IgPSBDUFZUX1dvcmRSYW5nZShtX3BWVC0+R2V0UHJldldvcmRQbGFjZShtX3dwT2xkQ2FyZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFZULT5HZXRTZWN0aW9uRW5kUGxhY2UobV93cENhcmV0KSk7CiAKLQkJCUNQVlRfV29yZFJhbmdlIHdyOwotCQkJaWYgKGJTZWNFbmQpCi0JCQkJd3IgPSBDUFZUX1dvcmRSYW5nZShtX3BWVC0+R2V0UHJldldvcmRQbGFjZShtX3dwT2xkQ2FyZXQpLEdldFZpc2libGVXb3JkUmFuZ2UoKS5FbmRQb3MpOwotCQkJZWxzZSBpZiAobV93cENhcmV0LkxpbmVDbXAobV93cE9sZENhcmV0KSAhPTApCi0JCQkJd3IgPSBDUFZUX1dvcmRSYW5nZShtX3BWVC0+R2V0TGluZUJlZ2luUGxhY2UobV93cENhcmV0KSxtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKG1fd3BDYXJldCkpOwotCQkJZWxzZQotCQkJCXdyID0gQ1BWVF9Xb3JkUmFuZ2UobV9wVlQtPkdldFByZXZXb3JkUGxhY2UobV93cE9sZENhcmV0KSxtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKG1fd3BDYXJldCkpOwkJCQorICAgICAgUmVmcmVzaChSUF9BTkFMWVNFLCAmd3IpOwogCi0JCQlSZWZyZXNoKFJQX0FOQUxZU0UsICZ3cik7Ci0JCQkKLQkJCVNldENhcmV0T3JpZ2luKCk7Ci0JCQlTZXRDYXJldEluZm8oKTsKLQkJfQorICAgICAgU2V0Q2FyZXRPcmlnaW4oKTsKKyAgICAgIFNldENhcmV0SW5mbygpOworICAgIH0KIAotCQlpZiAobV9iT3ByTm90aWZ5ICYmIG1fcE9wck5vdGlmeSkKLQkJCW1fcE9wck5vdGlmeS0+T25EZWxldGUobV93cENhcmV0LCBtX3dwT2xkQ2FyZXQpOworICAgIGlmIChtX2JPcHJOb3RpZnkgJiYgbV9wT3ByTm90aWZ5KQorICAgICAgbV9wT3ByTm90aWZ5LT5PbkRlbGV0ZShtX3dwQ2FyZXQsIG1fd3BPbGRDYXJldCk7CiAKLQkJcmV0dXJuIFRSVUU7Ci0JfQorICAgIHJldHVybiBUUlVFOworICB9CiAKLQlyZXR1cm4gRkFMU0U7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTAlDRlhfRWRpdDo6RW1wdHkoKQotewotCWlmIChtX3BWVC0+SXNWYWxpZCgpKQotCXsKLQkJbV9wVlQtPkRlbGV0ZVdvcmRzKEdldFdob2xlV29yZFJhbmdlKCkpOwotCQlTZXRDYXJldChtX3BWVC0+R2V0QmVnaW5Xb3JkUGxhY2UoKSk7CitGWF9CT09MIENGWF9FZGl0OjpFbXB0eSgpIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBtX3BWVC0+RGVsZXRlV29yZHMoR2V0V2hvbGVXb3JkUmFuZ2UoKSk7CisgICAgU2V0Q2FyZXQobV9wVlQtPkdldEJlZ2luV29yZFBsYWNlKCkpOwogCi0JCXJldHVybiBUUlVFOwotCX0KKyAgICByZXR1cm4gVFJVRTsKKyAgfQogCi0JcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OkNsZWFyKEZYX0JPT0wgYkFkZFVuZG8sIEZYX0JPT0wgYlBhaW50KQotewotCWlmIChtX3BWVC0+SXNWYWxpZCgpKQotCXsKLQkJaWYgKG1fU2VsU3RhdGUuSXNFeGlzdCgpKQotCQl7Ci0JCQlDUFZUX1dvcmRSYW5nZSByYW5nZSA9IG1fU2VsU3RhdGUuQ29udmVydFRvV29yZFJhbmdlKCk7CitGWF9CT09MIENGWF9FZGl0OjpDbGVhcihGWF9CT09MIGJBZGRVbmRvLCBGWF9CT09MIGJQYWludCkgeworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIGlmIChtX1NlbFN0YXRlLklzRXhpc3QoKSkgeworICAgICAgQ1BWVF9Xb3JkUmFuZ2UgcmFuZ2UgPSBtX1NlbFN0YXRlLkNvbnZlcnRUb1dvcmRSYW5nZSgpOwogCi0JCQlpZiAoYkFkZFVuZG8gJiYgbV9iRW5hYmxlVW5kbykKLQkJCXsKLQkJCQlpZiAobV9wVlQtPklzUmljaFRleHQoKSkKLQkJCQl7Ci0JCQkJCUJlZ2luR3JvdXBVbmRvKEwiIik7CisgICAgICBpZiAoYkFkZFVuZG8gJiYgbV9iRW5hYmxlVW5kbykgeworICAgICAgICBpZiAobV9wVlQtPklzUmljaFRleHQoKSkgeworICAgICAgICAgIEJlZ2luR3JvdXBVbmRvKEwiIik7CiAKLQkJCQkJaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yICogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpCi0JCQkJCXsKLQkJCQkJCXBJdGVyYXRvci0+U2V0QXQocmFuZ2UuRW5kUG9zKTsKKyAgICAgICAgICBpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKSB7CisgICAgICAgICAgICBwSXRlcmF0b3ItPlNldEF0KHJhbmdlLkVuZFBvcyk7CiAKLQkJCQkJCUNQVlRfV29yZCB3b3JkaW5mbzsJCi0JCQkJCQlDUFZUX1NlY3Rpb24gc2VjaW5mbzsJCQkJCQkKLQkJCQkJCWRvCi0JCQkJCQl7CQkJCQkJCQotCQkJCQkJCUNQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOwotCQkJCQkJCWlmIChwbGFjZS5Xb3JkQ21wKHJhbmdlLkJlZ2luUG9zKSA8PSAwKWJyZWFrOworICAgICAgICAgICAgQ1BWVF9Xb3JkIHdvcmRpbmZvOworICAgICAgICAgICAgQ1BWVF9TZWN0aW9uIHNlY2luZm87CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgIENQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOworICAgICAgICAgICAgICBpZiAocGxhY2UuV29yZENtcChyYW5nZS5CZWdpblBvcykgPD0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKIAotCQkJCQkJCUNQVlRfV29yZFBsYWNlIG9sZHBsYWNlID0gbV9wVlQtPkdldFByZXZXb3JkUGxhY2UocGxhY2UpOwkJCQkJCQkKKyAgICAgICAgICAgICAgQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2UgPSBtX3BWVC0+R2V0UHJldldvcmRQbGFjZShwbGFjZSk7CiAKLQkJCQkJCQlpZiAob2xkcGxhY2UuU2VjQ21wKHBsYWNlKSAhPSAwKQotCQkJCQkJCXsKLQkJCQkJCQkJaWYgKHBJdGVyYXRvci0+R2V0U2VjdGlvbihzZWNpbmZvKSkKLQkJCQkJCQkJewotCQkJCQkJCQkJQWRkRWRpdFVuZG9JdGVtKG5ldyBDRlhFVV9DbGVhclJpY2godGhpcyxvbGRwbGFjZSxwbGFjZSxyYW5nZSx3b3JkaW5mby5Xb3JkLAotCQkJCQkJCQkJCXdvcmRpbmZvLm5DaGFyc2V0LHNlY2luZm8uU2VjUHJvcHMsc2VjaW5mby5Xb3JkUHJvcHMpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQllbHNlCi0JCQkJCQkJewotCQkJCQkJCQlpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmRpbmZvKSkKLQkJCQkJCQkJewkJCQkJCQkJCQotCQkJCQkJCQkJb2xkcGxhY2UgPSBtX3BWVC0+QWp1c3RMaW5lSGVhZGVyKG9sZHBsYWNlLFRSVUUpOwotCQkJCQkJCQkJcGxhY2UgPSBtX3BWVC0+QWp1c3RMaW5lSGVhZGVyKHBsYWNlLFRSVUUpOworICAgICAgICAgICAgICBpZiAob2xkcGxhY2UuU2VjQ21wKHBsYWNlKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0U2VjdGlvbihzZWNpbmZvKSkgeworICAgICAgICAgICAgICAgICAgQWRkRWRpdFVuZG9JdGVtKG5ldyBDRlhFVV9DbGVhclJpY2goCisgICAgICAgICAgICAgICAgICAgICAgdGhpcywgb2xkcGxhY2UsIHBsYWNlLCByYW5nZSwgd29yZGluZm8uV29yZCwKKyAgICAgICAgICAgICAgICAgICAgICB3b3JkaW5mby5uQ2hhcnNldCwgc2VjaW5mby5TZWNQcm9wcywgc2VjaW5mby5Xb3JkUHJvcHMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkaW5mbykpIHsKKyAgICAgICAgICAgICAgICAgIG9sZHBsYWNlID0gbV9wVlQtPkFkanVzdExpbmVIZWFkZXIob2xkcGxhY2UsIFRSVUUpOworICAgICAgICAgICAgICAgICAgcGxhY2UgPSBtX3BWVC0+QWRqdXN0TGluZUhlYWRlcihwbGFjZSwgVFJVRSk7CiAKLQkJCQkJCQkJCUFkZEVkaXRVbmRvSXRlbShuZXcgQ0ZYRVVfQ2xlYXJSaWNoKHRoaXMsb2xkcGxhY2UscGxhY2UscmFuZ2Usd29yZGluZm8uV29yZCwKLQkJCQkJCQkJCQl3b3JkaW5mby5uQ2hhcnNldCxzZWNpbmZvLlNlY1Byb3BzLHdvcmRpbmZvLldvcmRQcm9wcykpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfXdoaWxlIChwSXRlcmF0b3ItPlByZXZXb3JkKCkpOwotCQkJCQl9Ci0JCQkJCUVuZEdyb3VwVW5kbygpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewkJCQkJCi0JCQkJCUFkZEVkaXRVbmRvSXRlbShuZXcgQ0ZYRVVfQ2xlYXIodGhpcyxyYW5nZSxHZXRTZWxUZXh0KCkpKTsJCQkJCQotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgICAgICAgIEFkZEVkaXRVbmRvSXRlbShuZXcgQ0ZYRVVfQ2xlYXJSaWNoKAorICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIG9sZHBsYWNlLCBwbGFjZSwgcmFuZ2UsIHdvcmRpbmZvLldvcmQsCisgICAgICAgICAgICAgICAgICAgICAgd29yZGluZm8ubkNoYXJzZXQsIHNlY2luZm8uU2VjUHJvcHMsIHdvcmRpbmZvLldvcmRQcm9wcykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAocEl0ZXJhdG9yLT5QcmV2V29yZCgpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgRW5kR3JvdXBVbmRvKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgQWRkRWRpdFVuZG9JdGVtKG5ldyBDRlhFVV9DbGVhcih0aGlzLCByYW5nZSwgR2V0U2VsVGV4dCgpKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgU2VsZWN0Tm9uZSgpOworICAgICAgU2V0Q2FyZXQobV9wVlQtPkRlbGV0ZVdvcmRzKHJhbmdlKSk7CisgICAgICBtX1NlbFN0YXRlLlNldChtX3dwQ2FyZXQsIG1fd3BDYXJldCk7CiAKLQkJCVNlbGVjdE5vbmUoKTsJCQkKLQkJCVNldENhcmV0KG1fcFZULT5EZWxldGVXb3JkcyhyYW5nZSkpOwkKLQkJCW1fU2VsU3RhdGUuU2V0KG1fd3BDYXJldCxtX3dwQ2FyZXQpOworICAgICAgaWYgKGJQYWludCkgeworICAgICAgICBSZWFycmFuZ2VQYXJ0KHJhbmdlKTsKKyAgICAgICAgU2Nyb2xsVG9DYXJldCgpOwogCi0JCQlpZiAoYlBhaW50KQotCQkJewotCQkJCVJlYXJyYW5nZVBhcnQocmFuZ2UpOwkKLQkJCQlTY3JvbGxUb0NhcmV0KCk7CisgICAgICAgIENQVlRfV29yZFJhbmdlIHdyKG1fd3BPbGRDYXJldCwgR2V0VmlzaWJsZVdvcmRSYW5nZSgpLkVuZFBvcyk7CisgICAgICAgIFJlZnJlc2goUlBfQU5BTFlTRSwgJndyKTsKIAotCQkJCUNQVlRfV29yZFJhbmdlIHdyKG1fd3BPbGRDYXJldCwgR2V0VmlzaWJsZVdvcmRSYW5nZSgpLkVuZFBvcyk7Ci0JCQkJUmVmcmVzaChSUF9BTkFMWVNFLCAmd3IpOwotCQkJCQotCQkJCVNldENhcmV0T3JpZ2luKCk7Ci0JCQkJU2V0Q2FyZXRJbmZvKCk7Ci0JCQl9CisgICAgICAgIFNldENhcmV0T3JpZ2luKCk7CisgICAgICAgIFNldENhcmV0SW5mbygpOworICAgICAgfQogCi0JCQlpZiAobV9iT3ByTm90aWZ5ICYmIG1fcE9wck5vdGlmeSkKLQkJCQltX3BPcHJOb3RpZnktPk9uQ2xlYXIobV93cENhcmV0LCBtX3dwT2xkQ2FyZXQpOworICAgICAgaWYgKG1fYk9wck5vdGlmeSAmJiBtX3BPcHJOb3RpZnkpCisgICAgICAgIG1fcE9wck5vdGlmeS0+T25DbGVhcihtX3dwQ2FyZXQsIG1fd3BPbGRDYXJldCk7CiAKLQkJCXJldHVybiBUUlVFOwotCQl9Ci0JfQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CiAKLQlyZXR1cm4gRkFMU0U7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6SW5zZXJ0VGV4dChGWF9MUENXU1RSIHRleHQsIEZYX0lOVDMyIGNoYXJzZXQsCi0JCQkJCWNvbnN0IENQVlRfU2VjUHJvcHMgKiBwU2VjUHJvcHMsIGNvbnN0IENQVlRfV29yZFByb3BzICogcFdvcmRQcm9wcywgRlhfQk9PTCBiQWRkVW5kbywgRlhfQk9PTCBiUGFpbnQpCi17Ci0JaWYgKElzVGV4dE92ZXJmbG93KCkpIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ0ZYX0VkaXQ6Okluc2VydFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWRkVW5kbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGFpbnQpIHsKKyAgaWYgKElzVGV4dE92ZXJmbG93KCkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZShtX3dwQ2FyZXQpOwotCVNldENhcmV0KERvSW5zZXJ0VGV4dChtX3dwQ2FyZXQsIHRleHQsIGNoYXJzZXQsIHBTZWNQcm9wcywgcFdvcmRQcm9wcykpOwotCW1fU2VsU3RhdGUuU2V0KG1fd3BDYXJldCxtX3dwQ2FyZXQpOworICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKG1fd3BDYXJldCk7CisgIFNldENhcmV0KERvSW5zZXJ0VGV4dChtX3dwQ2FyZXQsIHRleHQsIGNoYXJzZXQsIHBTZWNQcm9wcywgcFdvcmRQcm9wcykpOworICBtX1NlbFN0YXRlLlNldChtX3dwQ2FyZXQsIG1fd3BDYXJldCk7CiAKLQlpZiAobV93cENhcmV0ICE9IG1fd3BPbGRDYXJldCkKLQl7Ci0JCWlmIChiQWRkVW5kbyAmJiBtX2JFbmFibGVVbmRvKQotCQl7Ci0JCQlBZGRFZGl0VW5kb0l0ZW0obmV3IENGWEVVX0luc2VydFRleHQodGhpcyxtX3dwT2xkQ2FyZXQsbV93cENhcmV0LHRleHQsY2hhcnNldCxwU2VjUHJvcHMscFdvcmRQcm9wcykpOwotCQl9CisgIGlmIChtX3dwQ2FyZXQgIT0gbV93cE9sZENhcmV0KSB7CisgICAgaWYgKGJBZGRVbmRvICYmIG1fYkVuYWJsZVVuZG8pIHsKKyAgICAgIEFkZEVkaXRVbmRvSXRlbShuZXcgQ0ZYRVVfSW5zZXJ0VGV4dCh0aGlzLCBtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCwgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0LCBwU2VjUHJvcHMsIHBXb3JkUHJvcHMpKTsKKyAgICB9CiAKLQkJaWYgKGJQYWludCkKLQkJCVBhaW50SW5zZXJ0VGV4dChtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCk7CisgICAgaWYgKGJQYWludCkKKyAgICAgIFBhaW50SW5zZXJ0VGV4dChtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCk7CiAKLQkJaWYgKG1fYk9wck5vdGlmeSAmJiBtX3BPcHJOb3RpZnkpCi0JCQltX3BPcHJOb3RpZnktPk9uSW5zZXJ0VGV4dChtX3dwQ2FyZXQsIG1fd3BPbGRDYXJldCk7CisgICAgaWYgKG1fYk9wck5vdGlmeSAmJiBtX3BPcHJOb3RpZnkpCisgICAgICBtX3BPcHJOb3RpZnktPk9uSW5zZXJ0VGV4dChtX3dwQ2FyZXQsIG1fd3BPbGRDYXJldCk7CiAKLQkJcmV0dXJuIFRSVUU7Ci0JfQotCXJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OlBhaW50SW5zZXJ0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwT2xkLCBjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHdwTmV3KQotewotCWlmIChtX3BWVC0+SXNWYWxpZCgpKQotCXsKLQkJUmVhcnJhbmdlUGFydChDUFZUX1dvcmRSYW5nZSh3cE9sZCx3cE5ldykpOwotCQlTY3JvbGxUb0NhcmV0KCk7Ci0JCQotCQlDUFZUX1dvcmRSYW5nZSB3cjsKLQkJaWYgKG1fd3BDYXJldC5MaW5lQ21wKHdwT2xkKSAhPTApCi0JCQl3ciA9IENQVlRfV29yZFJhbmdlKG1fcFZULT5HZXRMaW5lQmVnaW5QbGFjZSh3cE9sZCksbV9wVlQtPkdldFNlY3Rpb25FbmRQbGFjZSh3cE5ldykpOwkKLQkJZWxzZQotCQkJd3IgPSBDUFZUX1dvcmRSYW5nZSh3cE9sZCxtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKHdwTmV3KSk7CQotCQlSZWZyZXNoKFJQX0FOQUxZU0UsICZ3cik7Ci0JCVNldENhcmV0T3JpZ2luKCk7Ci0JCVNldENhcmV0SW5mbygpOwotCX0KK3ZvaWQgQ0ZYX0VkaXQ6OlBhaW50SW5zZXJ0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BPbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwTmV3KSB7CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7CisgICAgUmVhcnJhbmdlUGFydChDUFZUX1dvcmRSYW5nZSh3cE9sZCwgd3BOZXcpKTsKKyAgICBTY3JvbGxUb0NhcmV0KCk7CisKKyAgICBDUFZUX1dvcmRSYW5nZSB3cjsKKyAgICBpZiAobV93cENhcmV0LkxpbmVDbXAod3BPbGQpICE9IDApCisgICAgICB3ciA9IENQVlRfV29yZFJhbmdlKG1fcFZULT5HZXRMaW5lQmVnaW5QbGFjZSh3cE9sZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFZULT5HZXRTZWN0aW9uRW5kUGxhY2Uod3BOZXcpKTsKKyAgICBlbHNlCisgICAgICB3ciA9IENQVlRfV29yZFJhbmdlKHdwT2xkLCBtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKHdwTmV3KSk7CisgICAgUmVmcmVzaChSUF9BTkFMWVNFLCAmd3IpOworICAgIFNldENhcmV0T3JpZ2luKCk7CisgICAgU2V0Q2FyZXRJbmZvKCk7CisgIH0KIH0KIAotRlhfQk9PTCBDRlhfRWRpdDo6UmVkbygpCi17Ci0JaWYgKG1fYkVuYWJsZVVuZG8pCi0JewotCQlpZiAobV9VbmRvLkNhblJlZG8oKSkKLQkJewotCQkJbV9VbmRvLlJlZG8oKTsKLQkJCXJldHVybiBUUlVFOwotCQl9Ci0JfQorRlhfQk9PTCBDRlhfRWRpdDo6UmVkbygpIHsKKyAgaWYgKG1fYkVuYWJsZVVuZG8pIHsKKyAgICBpZiAobV9VbmRvLkNhblJlZG8oKSkgeworICAgICAgbV9VbmRvLlJlZG8oKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQogCi0JcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgQ0ZYX0VkaXQ6OlVuZG8oKQotewotCWlmIChtX2JFbmFibGVVbmRvKQotCXsKLQkJaWYgKG1fVW5kby5DYW5VbmRvKCkpCi0JCXsKLQkJCW1fVW5kby5VbmRvKCk7Ci0JCQlyZXR1cm4gVFJVRTsKLQkJfQotCX0KK0ZYX0JPT0wgQ0ZYX0VkaXQ6OlVuZG8oKSB7CisgIGlmIChtX2JFbmFibGVVbmRvKSB7CisgICAgaWYgKG1fVW5kby5DYW5VbmRvKCkpIHsKKyAgICAgIG1fVW5kby5VbmRvKCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KIAotCXJldHVybiBGQUxTRTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi12b2lkIENGWF9FZGl0OjpTZXRDYXJldE9yaWdpbigpCi17Ci0JaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCi0JewotCQlpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IgKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKSkKLQkJewotCQkJcEl0ZXJhdG9yLT5TZXRBdChtX3dwQ2FyZXQpOwotCQkJQ1BWVF9Xb3JkIHdvcmQ7Ci0JCQlDUFZUX0xpbmUgbGluZTsKLQkJCWlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpCi0JCQl7Ci0JCQkJbV9wdENhcmV0LnggPSB3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGg7Ci0JCQkJbV9wdENhcmV0LnkgPSB3b3JkLnB0V29yZC55OwotCQkJfQotCQkJZWxzZSBpZiAocEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpKQotCQkJewkJCQkKLQkJCQltX3B0Q2FyZXQueCA9IGxpbmUucHRMaW5lLng7Ci0JCQkJbV9wdENhcmV0LnkgPSBsaW5lLnB0TGluZS55OwotCQkJfQotCQl9CQkJCQotCX0JCit2b2lkIENGWF9FZGl0OjpTZXRDYXJldE9yaWdpbigpIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKSB7CisgICAgICBwSXRlcmF0b3ItPlNldEF0KG1fd3BDYXJldCk7CisgICAgICBDUFZUX1dvcmQgd29yZDsKKyAgICAgIENQVlRfTGluZSBsaW5lOworICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgeworICAgICAgICBtX3B0Q2FyZXQueCA9IHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aDsKKyAgICAgICAgbV9wdENhcmV0LnkgPSB3b3JkLnB0V29yZC55OworICAgICAgfSBlbHNlIGlmIChwSXRlcmF0b3ItPkdldExpbmUobGluZSkpIHsKKyAgICAgICAgbV9wdENhcmV0LnggPSBsaW5lLnB0TGluZS54OworICAgICAgICBtX3B0Q2FyZXQueSA9IGxpbmUucHRMaW5lLnk7CisgICAgICB9CisgICAgfQorICB9CiB9CiAKLUZYX0lOVDMyIENGWF9FZGl0OjpXb3JkUGxhY2VUb1dvcmRJbmRleChjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdAotewotCWlmIChtX3BWVC0+SXNWYWxpZCgpKQotCQlyZXR1cm4gbV9wVlQtPldvcmRQbGFjZVRvV29yZEluZGV4KHBsYWNlKTsKK2ludDMyX3QgQ0ZYX0VkaXQ6OldvcmRQbGFjZVRvV29yZEluZGV4KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgeworICBpZiAobV9wVlQtPklzVmFsaWQoKSkKKyAgICByZXR1cm4gbV9wVlQtPldvcmRQbGFjZVRvV29yZEluZGV4KHBsYWNlKTsKIAotCXJldHVybiAtMTsKKyAgcmV0dXJuIC0xOwogfQogCi1DUFZUX1dvcmRQbGFjZSBDRlhfRWRpdDo6V29yZEluZGV4VG9Xb3JkUGxhY2UoRlhfSU5UMzIgaW5kZXgpIGNvbnN0Ci17Ci0JaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCi0JCXJldHVybiBtX3BWVC0+V29yZEluZGV4VG9Xb3JkUGxhY2UoaW5kZXgpOworQ1BWVF9Xb3JkUGxhY2UgQ0ZYX0VkaXQ6OldvcmRJbmRleFRvV29yZFBsYWNlKGludDMyX3QgaW5kZXgpIGNvbnN0IHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCisgICAgcmV0dXJuIG1fcFZULT5Xb3JkSW5kZXhUb1dvcmRQbGFjZShpbmRleCk7CiAKLQlyZXR1cm4gQ1BWVF9Xb3JkUGxhY2UoKTsKKyAgcmV0dXJuIENQVlRfV29yZFBsYWNlKCk7CiB9CiAKLUZYX0JPT0wJQ0ZYX0VkaXQ6OklzVGV4dEZ1bGwoKSBjb25zdAotewotCUZYX0lOVDMyIG5Ub3RhbFdvcmRzID0gbV9wVlQtPkdldFRvdGFsV29yZHMoKTsKLQlGWF9JTlQzMiBuTGltaXRDaGFyID0gbV9wVlQtPkdldExpbWl0Q2hhcigpOwotCUZYX0lOVDMyIG5DaGFyQXJyYXkgPSBtX3BWVC0+R2V0Q2hhckFycmF5KCk7CitGWF9CT09MIENGWF9FZGl0OjpJc1RleHRGdWxsKCkgY29uc3QgeworICBpbnQzMl90IG5Ub3RhbFdvcmRzID0gbV9wVlQtPkdldFRvdGFsV29yZHMoKTsKKyAgaW50MzJfdCBuTGltaXRDaGFyID0gbV9wVlQtPkdldExpbWl0Q2hhcigpOworICBpbnQzMl90IG5DaGFyQXJyYXkgPSBtX3BWVC0+R2V0Q2hhckFycmF5KCk7CiAKLQlyZXR1cm4gSXNUZXh0T3ZlcmZsb3coKSB8fCAobkxpbWl0Q2hhcj4wICYmIG5Ub3RhbFdvcmRzID49IG5MaW1pdENoYXIpCi0JCXx8IChuQ2hhckFycmF5PjAgJiYgblRvdGFsV29yZHMgPj0gbkNoYXJBcnJheSk7CisgIHJldHVybiBJc1RleHRPdmVyZmxvdygpIHx8IChuTGltaXRDaGFyID4gMCAmJiBuVG90YWxXb3JkcyA+PSBuTGltaXRDaGFyKSB8fAorICAgICAgICAgKG5DaGFyQXJyYXkgPiAwICYmIG5Ub3RhbFdvcmRzID49IG5DaGFyQXJyYXkpOwogfQogCi1GWF9CT09MCUNGWF9FZGl0OjpJc1RleHRPdmVyZmxvdygpIGNvbnN0Ci17Ci0JaWYgKCFtX2JFbmFibGVTY3JvbGwgJiYgIW1fYkVuYWJsZU92ZXJmbG93KQotCXsKLQkJQ1BERl9SZWN0IHJjUGxhdGUgPSBtX3BWVC0+R2V0UGxhdGVSZWN0KCk7Ci0JCUNQREZfUmVjdCByY0NvbnRlbnQgPSBtX3BWVC0+R2V0Q29udGVudFJlY3QoKTsKK0ZYX0JPT0wgQ0ZYX0VkaXQ6OklzVGV4dE92ZXJmbG93KCkgY29uc3QgeworICBpZiAoIW1fYkVuYWJsZVNjcm9sbCAmJiAhbV9iRW5hYmxlT3ZlcmZsb3cpIHsKKyAgICBDUERGX1JlY3QgcmNQbGF0ZSA9IG1fcFZULT5HZXRQbGF0ZVJlY3QoKTsKKyAgICBDUERGX1JlY3QgcmNDb250ZW50ID0gbV9wVlQtPkdldENvbnRlbnRSZWN0KCk7CiAKLQkJaWYgKG1fcFZULT5Jc011bHRpTGluZSgpICYmIEdldFRvdGFsTGluZXMoKSA+IDEpCi0JCXsKLQkJCWlmIChGWF9FRElUX0lzRmxvYXRCaWdnZXIocmNDb250ZW50LkhlaWdodCgpLHJjUGxhdGUuSGVpZ2h0KCkpKSByZXR1cm4gVFJVRTsKLQkJfQorICAgIGlmIChtX3BWVC0+SXNNdWx0aUxpbmUoKSAmJiBHZXRUb3RhbExpbmVzKCkgPiAxKSB7CisgICAgICBpZiAoRlhfRURJVF9Jc0Zsb2F0QmlnZ2VyKHJjQ29udGVudC5IZWlnaHQoKSwgcmNQbGF0ZS5IZWlnaHQoKSkpCisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KIAotCQlpZiAoRlhfRURJVF9Jc0Zsb2F0QmlnZ2VyKHJjQ29udGVudC5XaWR0aCgpLHJjUGxhdGUuV2lkdGgoKSkpIHJldHVybiBUUlVFOwotCX0KKyAgICBpZiAoRlhfRURJVF9Jc0Zsb2F0QmlnZ2VyKHJjQ29udGVudC5XaWR0aCgpLCByY1BsYXRlLldpZHRoKCkpKQorICAgICAgcmV0dXJuIFRSVUU7CisgIH0KIAotCXJldHVybiBGQUxTRTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1DUFZUX1dvcmRQbGFjZSBDRlhfRWRpdDo6R2V0TGluZUJlZ2luUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QKLXsKLQlyZXR1cm4gbV9wVlQtPkdldExpbmVCZWdpblBsYWNlKHBsYWNlKTsKK0NQVlRfV29yZFBsYWNlIENGWF9FZGl0OjpHZXRMaW5lQmVnaW5QbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcFZULT5HZXRMaW5lQmVnaW5QbGFjZShwbGFjZSk7CiB9CiAKLUNQVlRfV29yZFBsYWNlIENGWF9FZGl0OjpHZXRMaW5lRW5kUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QKLXsKLQlyZXR1cm4gbV9wVlQtPkdldExpbmVFbmRQbGFjZShwbGFjZSk7CitDUFZUX1dvcmRQbGFjZSBDRlhfRWRpdDo6R2V0TGluZUVuZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgeworICByZXR1cm4gbV9wVlQtPkdldExpbmVFbmRQbGFjZShwbGFjZSk7CiB9CiAKLUNQVlRfV29yZFBsYWNlIENGWF9FZGl0OjpHZXRTZWN0aW9uQmVnaW5QbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdAotewotCXJldHVybiBtX3BWVC0+R2V0U2VjdGlvbkJlZ2luUGxhY2UocGxhY2UpOworQ1BWVF9Xb3JkUGxhY2UgQ0ZYX0VkaXQ6OkdldFNlY3Rpb25CZWdpblBsYWNlKAorICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgeworICByZXR1cm4gbV9wVlQtPkdldFNlY3Rpb25CZWdpblBsYWNlKHBsYWNlKTsKIH0KIAotQ1BWVF9Xb3JkUGxhY2UgQ0ZYX0VkaXQ6OkdldFNlY3Rpb25FbmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSAmIHBsYWNlKSBjb25zdAotewotCXJldHVybiBtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKHBsYWNlKTsKK0NQVlRfV29yZFBsYWNlIENGWF9FZGl0OjpHZXRTZWN0aW9uRW5kUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCB7CisgIHJldHVybiBtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKHBsYWNlKTsKIH0KIAotRlhfQk9PTAlDRlhfRWRpdDo6Q2FuVW5kbygpIGNvbnN0Ci17Ci0JaWYgKG1fYkVuYWJsZVVuZG8pCi0JewotCQlyZXR1cm4gbV9VbmRvLkNhblVuZG8oKTsKLQl9CitGWF9CT09MIENGWF9FZGl0OjpDYW5VbmRvKCkgY29uc3QgeworICBpZiAobV9iRW5hYmxlVW5kbykgeworICAgIHJldHVybiBtX1VuZG8uQ2FuVW5kbygpOworICB9CiAKLQlyZXR1cm4gRkFMU0U7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTAlDRlhfRWRpdDo6Q2FuUmVkbygpIGNvbnN0Ci17Ci0JaWYgKG1fYkVuYWJsZVVuZG8pCi0JewotCQlyZXR1cm4gbV9VbmRvLkNhblJlZG8oKTsKLQl9CitGWF9CT09MIENGWF9FZGl0OjpDYW5SZWRvKCkgY29uc3QgeworICBpZiAobV9iRW5hYmxlVW5kbykgeworICAgIHJldHVybiBtX1VuZG8uQ2FuUmVkbygpOworICB9CiAKLQlyZXR1cm4gRkFMU0U7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTAlDRlhfRWRpdDo6SXNNb2RpZmllZCgpIGNvbnN0Ci17Ci0JaWYgKG1fYkVuYWJsZVVuZG8pCi0JewotCQlyZXR1cm4gbV9VbmRvLklzTW9kaWZpZWQoKTsKLQl9CitGWF9CT09MIENGWF9FZGl0OjpJc01vZGlmaWVkKCkgY29uc3QgeworICBpZiAobV9iRW5hYmxlVW5kbykgeworICAgIHJldHVybiBtX1VuZG8uSXNNb2RpZmllZCgpOworICB9CiAKLQlyZXR1cm4gRkFMU0U7CisgIHJldHVybiBGQUxTRTsKIH0KIAotdm9pZCBDRlhfRWRpdDo6RW5hYmxlUmVmcmVzaChGWF9CT09MIGJSZWZyZXNoKQotewotCW1fYkVuYWJsZVJlZnJlc2ggPSBiUmVmcmVzaDsKK3ZvaWQgQ0ZYX0VkaXQ6OkVuYWJsZVJlZnJlc2goRlhfQk9PTCBiUmVmcmVzaCkgeworICBtX2JFbmFibGVSZWZyZXNoID0gYlJlZnJlc2g7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OkVuYWJsZVVuZG8oRlhfQk9PTCBiVW5kbykKLXsKLQl0aGlzLT5tX2JFbmFibGVVbmRvID0gYlVuZG87Cit2b2lkIENGWF9FZGl0OjpFbmFibGVVbmRvKEZYX0JPT0wgYlVuZG8pIHsKKyAgbV9iRW5hYmxlVW5kbyA9IGJVbmRvOwogfQogCi12b2lkIENGWF9FZGl0OjpFbmFibGVOb3RpZnkoRlhfQk9PTCBiTm90aWZ5KQotewotCXRoaXMtPm1fYk5vdGlmeSA9IGJOb3RpZnk7Cit2b2lkIENGWF9FZGl0OjpFbmFibGVOb3RpZnkoRlhfQk9PTCBiTm90aWZ5KSB7CisgIG1fYk5vdGlmeSA9IGJOb3RpZnk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OkVuYWJsZU9wck5vdGlmeShGWF9CT09MIGJOb3RpZnkpCi17Ci0JdGhpcy0+bV9iT3ByTm90aWZ5ID0gYk5vdGlmeTsKK3ZvaWQgQ0ZYX0VkaXQ6OkVuYWJsZU9wck5vdGlmeShGWF9CT09MIGJOb3RpZnkpIHsKKyAgbV9iT3ByTm90aWZ5ID0gYk5vdGlmeTsKIH0KIAotRlhfRkxPQVQgQ0ZYX0VkaXQ6OkdldExpbmVUb3AoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdAotewotCWlmIChJUERGX1ZhcmlhYmxlVGV4dF9JdGVyYXRvciogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCkpCi0JewotCQlDUFZUX1dvcmRQbGFjZSB3cE9sZCA9IHBJdGVyYXRvci0+R2V0QXQoKTsKK0ZYX0ZMT0FUIENGWF9FZGl0OjpHZXRMaW5lVG9wKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgeworICBpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKSB7CisgICAgQ1BWVF9Xb3JkUGxhY2Ugd3BPbGQgPSBwSXRlcmF0b3ItPkdldEF0KCk7CiAKLQkJcEl0ZXJhdG9yLT5TZXRBdChwbGFjZSk7Ci0JCUNQVlRfTGluZSBsaW5lOwotCQlwSXRlcmF0b3ItPkdldExpbmUobGluZSk7CisgICAgcEl0ZXJhdG9yLT5TZXRBdChwbGFjZSk7CisgICAgQ1BWVF9MaW5lIGxpbmU7CisgICAgcEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpOwogCi0JCXBJdGVyYXRvci0+U2V0QXQod3BPbGQpOworICAgIHBJdGVyYXRvci0+U2V0QXQod3BPbGQpOwogCi0JCXJldHVybiBsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZUFzY2VudDsKLQl9CisgICAgcmV0dXJuIGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lQXNjZW50OworICB9CiAKLQlyZXR1cm4gMC4wZjsKKyAgcmV0dXJuIDAuMGY7CiB9CiAKLUZYX0ZMT0FUIENGWF9FZGl0OjpHZXRMaW5lQm90dG9tKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QKLXsKLQlpZiAoSVBERl9WYXJpYWJsZVRleHRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpKQotCXsKLQkJQ1BWVF9Xb3JkUGxhY2Ugd3BPbGQgPSBwSXRlcmF0b3ItPkdldEF0KCk7CitGWF9GTE9BVCBDRlhfRWRpdDo6R2V0TGluZUJvdHRvbShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IHsKKyAgaWYgKElQREZfVmFyaWFibGVUZXh0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKSkgeworICAgIENQVlRfV29yZFBsYWNlIHdwT2xkID0gcEl0ZXJhdG9yLT5HZXRBdCgpOwogCi0JCXBJdGVyYXRvci0+U2V0QXQocGxhY2UpOwotCQlDUFZUX0xpbmUgbGluZTsKLQkJcEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpOworICAgIHBJdGVyYXRvci0+U2V0QXQocGxhY2UpOworICAgIENQVlRfTGluZSBsaW5lOworICAgIHBJdGVyYXRvci0+R2V0TGluZShsaW5lKTsKIAotCQlwSXRlcmF0b3ItPlNldEF0KHdwT2xkKTsKKyAgICBwSXRlcmF0b3ItPlNldEF0KHdwT2xkKTsKIAotCQlyZXR1cm4gbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVEZXNjZW50OwotCX0KKyAgICByZXR1cm4gbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVEZXNjZW50OworICB9CiAKLQlyZXR1cm4gMC4wZjsKKyAgcmV0dXJuIDAuMGY7CiB9CiAKLUNQVlRfV29yZFBsYWNlIENGWF9FZGl0OjpEb0luc2VydFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLCBGWF9MUENXU1RSIHRleHQsIEZYX0lOVDMyIGNoYXJzZXQsIAotCQkJCQkJCQkJICBjb25zdCBDUFZUX1NlY1Byb3BzICogcFNlY1Byb3BzLCBjb25zdCBDUFZUX1dvcmRQcm9wcyAqIHBXb3JkUHJvcHMpCi17Ci0JQ1BWVF9Xb3JkUGxhY2Ugd3AgPSBwbGFjZTsKK0NQVlRfV29yZFBsYWNlIENGWF9FZGl0OjpEb0luc2VydFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzKSB7CisgIENQVlRfV29yZFBsYWNlIHdwID0gcGxhY2U7CiAKLQlpZiAobV9wVlQtPklzVmFsaWQoKSkKLQl7Ci0JCUNGWF9XaWRlU3RyaW5nIHNUZXh0ID0gdGV4dDsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBDRlhfV2lkZVN0cmluZyBzVGV4dCA9IHRleHQ7CiAKLQkJZm9yIChGWF9JTlQzMiBpID0gMCwgc3ogPSBzVGV4dC5HZXRMZW5ndGgoKTsgaSA8IHN6OyBpKyspCi0JCXsKLQkJCUZYX1dPUkQgd29yZCA9IHNUZXh0W2ldOwotCQkJc3dpdGNoICh3b3JkKQotCQkJewotCQkJY2FzZSAweDBEOgotCQkJCXdwID0gbV9wVlQtPkluc2VydFNlY3Rpb24od3AscFNlY1Byb3BzLHBXb3JkUHJvcHMpOwotCQkJCWlmIChzVGV4dFtpKzFdID09IDB4MEEpCi0JCQkJCWkrKzsKLQkJCQlicmVhazsKLQkJCWNhc2UgMHgwQToJCi0JCQkJd3AgPSBtX3BWVC0+SW5zZXJ0U2VjdGlvbih3cCxwU2VjUHJvcHMscFdvcmRQcm9wcyk7Ci0JCQkJaWYgKHNUZXh0W2krMV0gPT0gMHgwRCkKLQkJCQkJaSsrOwotCQkJCWJyZWFrOwotCQkJY2FzZSAweDA5OgotCQkJCXdvcmQgPSAweDIwOwotCQkJZGVmYXVsdDoKLQkJCQl3cCA9IG1fcFZULT5JbnNlcnRXb3JkKHdwLHdvcmQsR2V0Q2hhclNldEZyb21Vbmljb2RlKHdvcmQsIGNoYXJzZXQpLHBXb3JkUHJvcHMpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQorICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBzVGV4dC5HZXRMZW5ndGgoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgIEZYX1dPUkQgd29yZCA9IHNUZXh0W2ldOworICAgICAgc3dpdGNoICh3b3JkKSB7CisgICAgICAgIGNhc2UgMHgwRDoKKyAgICAgICAgICB3cCA9IG1fcFZULT5JbnNlcnRTZWN0aW9uKHdwLCBwU2VjUHJvcHMsIHBXb3JkUHJvcHMpOworICAgICAgICAgIGlmIChzVGV4dFtpICsgMV0gPT0gMHgwQSkKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDBBOgorICAgICAgICAgIHdwID0gbV9wVlQtPkluc2VydFNlY3Rpb24od3AsIHBTZWNQcm9wcywgcFdvcmRQcm9wcyk7CisgICAgICAgICAgaWYgKHNUZXh0W2kgKyAxXSA9PSAweDBEKQorICAgICAgICAgICAgaSsrOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MDk6CisgICAgICAgICAgd29yZCA9IDB4MjA7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgd3AgPSBtX3BWVC0+SW5zZXJ0V29yZCh3cCwgd29yZCwgR2V0Q2hhclNldEZyb21Vbmljb2RlKHdvcmQsIGNoYXJzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmRQcm9wcyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CiAKLQlyZXR1cm4gd3A7CisgIHJldHVybiB3cDsKIH0KIAotRlhfSU5UMzIgQ0ZYX0VkaXQ6OkdldENoYXJTZXRGcm9tVW5pY29kZShGWF9XT1JEIHdvcmQsIEZYX0lOVDMyIG5PbGRDaGFyc2V0KQotewotCWlmIChJRlhfRWRpdF9Gb250TWFwKiBwRm9udE1hcCA9IHRoaXMtPkdldEZvbnRNYXAoKSkKLQkJcmV0dXJuIHBGb250TWFwLT5DaGFyU2V0RnJvbVVuaWNvZGUod29yZCwgbk9sZENoYXJzZXQpOwotCWVsc2UKLQkJcmV0dXJuIG5PbGRDaGFyc2V0OworaW50MzJfdCBDRlhfRWRpdDo6R2V0Q2hhclNldEZyb21Vbmljb2RlKEZYX1dPUkQgd29yZCwgaW50MzJfdCBuT2xkQ2hhcnNldCkgeworICBpZiAoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXAgPSBHZXRGb250TWFwKCkpCisgICAgcmV0dXJuIHBGb250TWFwLT5DaGFyU2V0RnJvbVVuaWNvZGUod29yZCwgbk9sZENoYXJzZXQpOworICByZXR1cm4gbk9sZENoYXJzZXQ7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OkJlZ2luR3JvdXBVbmRvKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGl0bGUpCi17Ci0JQVNTRVJUKG1fcEdyb3VwVW5kb0l0ZW0gPT0gTlVMTCk7Cit2b2lkIENGWF9FZGl0OjpCZWdpbkdyb3VwVW5kbyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RpdGxlKSB7CisgIEFTU0VSVCghbV9wR3JvdXBVbmRvSXRlbSk7CiAKLQltX3BHcm91cFVuZG9JdGVtID0gbmV3IENGWF9FZGl0X0dyb3VwVW5kb0l0ZW0oc1RpdGxlKTsKKyAgbV9wR3JvdXBVbmRvSXRlbSA9IG5ldyBDRlhfRWRpdF9Hcm91cFVuZG9JdGVtKHNUaXRsZSk7CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OkVuZEdyb3VwVW5kbygpCi17Ci0JQVNTRVJUKG1fcEdyb3VwVW5kb0l0ZW0gIT0gTlVMTCk7Ci0KLQltX3BHcm91cFVuZG9JdGVtLT5VcGRhdGVJdGVtcygpOwotCW1fVW5kby5BZGRJdGVtKG1fcEdyb3VwVW5kb0l0ZW0pOwotCWlmIChtX2JPcHJOb3RpZnkgJiYgbV9wT3ByTm90aWZ5KQotCQltX3BPcHJOb3RpZnktPk9uQWRkVW5kbyhtX3BHcm91cFVuZG9JdGVtKTsKLQltX3BHcm91cFVuZG9JdGVtID0gTlVMTDsKK3ZvaWQgQ0ZYX0VkaXQ6OkVuZEdyb3VwVW5kbygpIHsKKyAgbV9wR3JvdXBVbmRvSXRlbS0+VXBkYXRlSXRlbXMoKTsKKyAgbV9VbmRvLkFkZEl0ZW0obV9wR3JvdXBVbmRvSXRlbSk7CisgIGlmIChtX2JPcHJOb3RpZnkgJiYgbV9wT3ByTm90aWZ5KQorICAgIG1fcE9wck5vdGlmeS0+T25BZGRVbmRvKG1fcEdyb3VwVW5kb0l0ZW0pOworICBtX3BHcm91cFVuZG9JdGVtID0gTlVMTDsKIH0KIAotdm9pZCBDRlhfRWRpdDo6QWRkRWRpdFVuZG9JdGVtKENGWF9FZGl0X1VuZG9JdGVtKiBwRWRpdFVuZG9JdGVtKQotewotCWlmIChtX3BHcm91cFVuZG9JdGVtKQotCQltX3BHcm91cFVuZG9JdGVtLT5BZGRVbmRvSXRlbShwRWRpdFVuZG9JdGVtKTsKLQllbHNlCi0JewotCQltX1VuZG8uQWRkSXRlbShwRWRpdFVuZG9JdGVtKTsKLQkJaWYgKG1fYk9wck5vdGlmeSAmJiBtX3BPcHJOb3RpZnkpCi0JCQltX3BPcHJOb3RpZnktPk9uQWRkVW5kbyhwRWRpdFVuZG9JdGVtKTsKLQl9Cit2b2lkIENGWF9FZGl0OjpBZGRFZGl0VW5kb0l0ZW0oQ0ZYX0VkaXRfVW5kb0l0ZW0qIHBFZGl0VW5kb0l0ZW0pIHsKKyAgaWYgKG1fcEdyb3VwVW5kb0l0ZW0pIHsKKyAgICBtX3BHcm91cFVuZG9JdGVtLT5BZGRVbmRvSXRlbShwRWRpdFVuZG9JdGVtKTsKKyAgfSBlbHNlIHsKKyAgICBtX1VuZG8uQWRkSXRlbShwRWRpdFVuZG9JdGVtKTsKKyAgICBpZiAobV9iT3ByTm90aWZ5ICYmIG1fcE9wck5vdGlmeSkKKyAgICAgIG1fcE9wck5vdGlmeS0+T25BZGRVbmRvKHBFZGl0VW5kb0l0ZW0pOworICB9CiB9CiAKLXZvaWQgQ0ZYX0VkaXQ6OkFkZFVuZG9JdGVtKElGWF9FZGl0X1VuZG9JdGVtKiBwVW5kb0l0ZW0pCi17Ci0JbV9VbmRvLkFkZEl0ZW0ocFVuZG9JdGVtKTsKLQlpZiAobV9iT3ByTm90aWZ5ICYmIG1fcE9wck5vdGlmeSkKLQkJbV9wT3ByTm90aWZ5LT5PbkFkZFVuZG8ocFVuZG9JdGVtKTsKK3ZvaWQgQ0ZYX0VkaXQ6OkFkZFVuZG9JdGVtKElGWF9FZGl0X1VuZG9JdGVtKiBwVW5kb0l0ZW0pIHsKKyAgbV9VbmRvLkFkZEl0ZW0ocFVuZG9JdGVtKTsKKyAgaWYgKG1fYk9wck5vdGlmeSAmJiBtX3BPcHJOb3RpZnkpCisgICAgbV9wT3ByTm90aWZ5LT5PbkFkZFVuZG8ocFVuZG9JdGVtKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfbGlzdC5jcHAgYi9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9saXN0LmNwcAppbmRleCA2NGVkNjk0Li40ZThhZTBjIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9saXN0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9saXN0LmNwcApAQCAtMSwxMDEyICsxLDgxOSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGVkaXQvZnhldF9zdHViLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGVkaXQvZnhldF9lZGl0LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGVkaXQvZnhldF9saXN0LmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meGV0X2VkaXQuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfbGlzdC5oIgogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENGWF9MaXN0SXRlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLUNGWF9MaXN0SXRlbTo6Q0ZYX0xpc3RJdGVtKCkgOiBtX3BFZGl0KE5VTEwpLAotCW1fYlNlbGVjdGVkKEZBTFNFKSwKLQltX2JDYXJldChGQUxTRSksCi0JbV9yY0xpc3RJdGVtKDAuMGYsMC4wZiwwLjBmLDAuMGYpCi17Ci0JbV9wRWRpdCA9IElGWF9FZGl0OjpOZXdFZGl0KCk7Ci0JQVNTRVJUKG1fcEVkaXQgIT0gTlVMTCk7Ci0KLQltX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDEpOwotCW1fcEVkaXQtPkluaXRpYWxpemUoKTsKK0NGWF9MaXN0SXRlbTo6Q0ZYX0xpc3RJdGVtKCkKKyAgICA6IG1fcEVkaXQoTlVMTCksCisgICAgICBtX2JTZWxlY3RlZChGQUxTRSksCisgICAgICBtX2JDYXJldChGQUxTRSksCisgICAgICBtX3JjTGlzdEl0ZW0oMC4wZiwgMC4wZiwgMC4wZiwgMC4wZikgeworICBtX3BFZGl0ID0gSUZYX0VkaXQ6Ok5ld0VkaXQoKTsKKyAgbV9wRWRpdC0+U2V0QWxpZ25tZW50VigxKTsKKyAgbV9wRWRpdC0+SW5pdGlhbGl6ZSgpOwogfQogCi1DRlhfTGlzdEl0ZW06On5DRlhfTGlzdEl0ZW0oKQotewotCUlGWF9FZGl0OjpEZWxFZGl0KG1fcEVkaXQpOworQ0ZYX0xpc3RJdGVtOjp+Q0ZYX0xpc3RJdGVtKCkgeworICBJRlhfRWRpdDo6RGVsRWRpdChtX3BFZGl0KTsKIH0KIAotdm9pZCBDRlhfTGlzdEl0ZW06OlNldEZvbnRNYXAoSUZYX0VkaXRfRm9udE1hcCAqIHBGb250TWFwKQotewotCWlmIChtX3BFZGl0KQotCQltX3BFZGl0LT5TZXRGb250TWFwKHBGb250TWFwKTsKK3ZvaWQgQ0ZYX0xpc3RJdGVtOjpTZXRGb250TWFwKElGWF9FZGl0X0ZvbnRNYXAqIHBGb250TWFwKSB7CisgIGlmIChtX3BFZGl0KQorICAgIG1fcEVkaXQtPlNldEZvbnRNYXAocEZvbnRNYXApOwogfQogCi1JRlhfRWRpdCogQ0ZYX0xpc3RJdGVtOjpHZXRFZGl0KCkgY29uc3QKLXsKLQlyZXR1cm4gbV9wRWRpdDsKK0lGWF9FZGl0KiBDRlhfTGlzdEl0ZW06OkdldEVkaXQoKSBjb25zdCB7CisgIHJldHVybiBtX3BFZGl0OwogfQogCi1JRlhfRWRpdF9JdGVyYXRvcioJQ0ZYX0xpc3RJdGVtOjpHZXRJdGVyYXRvcigpIGNvbnN0Ci17Ci0JaWYgKG1fcEVkaXQpCi0JCXJldHVybiBtX3BFZGl0LT5HZXRJdGVyYXRvcigpOworSUZYX0VkaXRfSXRlcmF0b3IqIENGWF9MaXN0SXRlbTo6R2V0SXRlcmF0b3IoKSBjb25zdCB7CisgIGlmIChtX3BFZGl0KQorICAgIHJldHVybiBtX3BFZGl0LT5HZXRJdGVyYXRvcigpOwogCi0JcmV0dXJuIE5VTEw7CisgIHJldHVybiBOVUxMOwogfQogCi12b2lkIENGWF9MaXN0SXRlbTo6U2V0UmVjdChjb25zdCBDTFNUX1JlY3QgJiByZWN0KQotewotCW1fcmNMaXN0SXRlbSA9IHJlY3Q7Cit2b2lkIENGWF9MaXN0SXRlbTo6U2V0UmVjdChjb25zdCBDTFNUX1JlY3QmIHJlY3QpIHsKKyAgbV9yY0xpc3RJdGVtID0gcmVjdDsKIH0KIAotQ0xTVF9SZWN0IENGWF9MaXN0SXRlbTo6R2V0UmVjdCgpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fcmNMaXN0SXRlbTsKK0NMU1RfUmVjdCBDRlhfTGlzdEl0ZW06OkdldFJlY3QoKSBjb25zdCB7CisgIHJldHVybiBtX3JjTGlzdEl0ZW07CiB9CiAKLUZYX0JPT0wgQ0ZYX0xpc3RJdGVtOjpJc1NlbGVjdGVkKCkgY29uc3QKLXsKLQlyZXR1cm4gbV9iU2VsZWN0ZWQ7CitGWF9CT09MIENGWF9MaXN0SXRlbTo6SXNTZWxlY3RlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fYlNlbGVjdGVkOwogfQogCi12b2lkIENGWF9MaXN0SXRlbTo6U2V0U2VsZWN0KEZYX0JPT0wgYlNlbGVjdGVkKQotewotCW1fYlNlbGVjdGVkID0gYlNlbGVjdGVkOwordm9pZCBDRlhfTGlzdEl0ZW06OlNldFNlbGVjdChGWF9CT09MIGJTZWxlY3RlZCkgeworICBtX2JTZWxlY3RlZCA9IGJTZWxlY3RlZDsKIH0KIAotRlhfQk9PTCBDRlhfTGlzdEl0ZW06OklzQ2FyZXQoKSBjb25zdAotewotCXJldHVybiBtX2JDYXJldDsKK0ZYX0JPT0wgQ0ZYX0xpc3RJdGVtOjpJc0NhcmV0KCkgY29uc3QgeworICByZXR1cm4gbV9iQ2FyZXQ7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RJdGVtOjpTZXRDYXJldChGWF9CT09MIGJDYXJldCkKLXsKLQltX2JDYXJldCA9IGJDYXJldDsKK3ZvaWQgQ0ZYX0xpc3RJdGVtOjpTZXRDYXJldChGWF9CT09MIGJDYXJldCkgeworICBtX2JDYXJldCA9IGJDYXJldDsKIH0KIAotdm9pZCBDRlhfTGlzdEl0ZW06OlNldFRleHQoRlhfTFBDV1NUUiB0ZXh0KQotewotCWlmIChtX3BFZGl0KQotCQltX3BFZGl0LT5TZXRUZXh0KHRleHQpOwordm9pZCBDRlhfTGlzdEl0ZW06OlNldFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQpIHsKKyAgaWYgKG1fcEVkaXQpCisgICAgbV9wRWRpdC0+U2V0VGV4dCh0ZXh0KTsKIH0KIAotdm9pZCBDRlhfTGlzdEl0ZW06OlNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkKLXsKLQlpZiAobV9wRWRpdCkKLQkJbV9wRWRpdC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKK3ZvaWQgQ0ZYX0xpc3RJdGVtOjpTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpIHsKKyAgaWYgKG1fcEVkaXQpCisgICAgbV9wRWRpdC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKIH0KIAotRlhfRkxPQVQgQ0ZYX0xpc3RJdGVtOjpHZXRJdGVtSGVpZ2h0KCkgY29uc3QKLXsKLQlpZiAobV9wRWRpdCkKLQkJcmV0dXJuIG1fcEVkaXQtPkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7CitGWF9GTE9BVCBDRlhfTGlzdEl0ZW06OkdldEl0ZW1IZWlnaHQoKSBjb25zdCB7CisgIGlmIChtX3BFZGl0KQorICAgIHJldHVybiBtX3BFZGl0LT5HZXRDb250ZW50UmVjdCgpLkhlaWdodCgpOwogCi0JcmV0dXJuIDAuMGY7CisgIHJldHVybiAwLjBmOwogfQogCi1GWF9XT1JEIENGWF9MaXN0SXRlbTo6R2V0Rmlyc3RDaGFyKCkgY29uc3QKLXsKLQlDUFZUX1dvcmQgd29yZDsKK0ZYX1dPUkQgQ0ZYX0xpc3RJdGVtOjpHZXRGaXJzdENoYXIoKSBjb25zdCB7CisgIENQVlRfV29yZCB3b3JkOwogCi0JaWYgKElGWF9FZGl0X0l0ZXJhdG9yKglwSXRlcmF0b3IgPSBHZXRJdGVyYXRvcigpKQotCXsKLQkJcEl0ZXJhdG9yLT5TZXRBdCgxKTsJCQotCQlwSXRlcmF0b3ItPkdldFdvcmQod29yZCk7Ci0JfQorICBpZiAoSUZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IEdldEl0ZXJhdG9yKCkpIHsKKyAgICBwSXRlcmF0b3ItPlNldEF0KDEpOworICAgIHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKTsKKyAgfQogCi0JcmV0dXJuIHdvcmQuV29yZDsKKyAgcmV0dXJuIHdvcmQuV29yZDsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ0ZYX0xpc3RJdGVtOjpHZXRUZXh0KCkgY29uc3QKLXsKLQlpZiAobV9wRWRpdCkKLQkJcmV0dXJuIG1fcEVkaXQtPkdldFRleHQoKTsKK0NGWF9XaWRlU3RyaW5nIENGWF9MaXN0SXRlbTo6R2V0VGV4dCgpIGNvbnN0IHsKKyAgaWYgKG1fcEVkaXQpCisgICAgcmV0dXJuIG1fcEVkaXQtPkdldFRleHQoKTsKIAotCXJldHVybiBMIiI7CisgIHJldHVybiBMIiI7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDRlhfTGlzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK0NGWF9MaXN0OjpDRlhfTGlzdCgpCisgICAgOiBtX2ZGb250U2l6ZSgwLjBmKSwgbV9wRm9udE1hcChOVUxMKSwgbV9iTXVsdGlwbGUoRkFMU0UpIHt9CiAKLUNGWF9MaXN0OjpDRlhfTGlzdCgpIDogbV9mRm9udFNpemUoMC4wZiksIG1fcEZvbnRNYXAoTlVMTCksIG1fYk11bHRpcGxlKEZBTFNFKQoteworQ0ZYX0xpc3Q6On5DRlhfTGlzdCgpIHsKKyAgRW1wdHkoKTsKIH0KIAordm9pZCBDRlhfTGlzdDo6RW1wdHkoKSB7CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FMaXN0SXRlbXMuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKKyAgICBkZWxldGUgbV9hTGlzdEl0ZW1zLkdldEF0KGkpOworCi1DRlhfTGlzdDo6fkNGWF9MaXN0KCkKLXsKLQlFbXB0eSgpOworICBtX2FMaXN0SXRlbXMuUmVtb3ZlQWxsKCk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3Q6OkVtcHR5KCkKLXsKLQlmb3IgKEZYX0lOVDMyIGk9MCxzej1tX2FMaXN0SXRlbXMuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JCWRlbGV0ZSBtX2FMaXN0SXRlbXMuR2V0QXQoaSk7Ci0KLQltX2FMaXN0SXRlbXMuUmVtb3ZlQWxsKCk7Cit2b2lkIENGWF9MaXN0OjpTZXRGb250TWFwKElGWF9FZGl0X0ZvbnRNYXAqIHBGb250TWFwKSB7CisgIG1fcEZvbnRNYXAgPSBwRm9udE1hcDsKIH0KIAotdm9pZCBDRlhfTGlzdDo6U2V0Rm9udE1hcChJRlhfRWRpdF9Gb250TWFwICogcEZvbnRNYXApCi17Ci0JbV9wRm9udE1hcCA9IHBGb250TWFwOwordm9pZCBDRlhfTGlzdDo6U2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSB7CisgIG1fZkZvbnRTaXplID0gZkZvbnRTaXplOwogfQogCi12b2lkIENGWF9MaXN0OjpTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpCi17Ci0JbV9mRm9udFNpemUgPSBmRm9udFNpemU7Cit2b2lkIENGWF9MaXN0OjpBZGRJdGVtKGNvbnN0IEZYX1dDSEFSKiBzdHIpIHsKKyAgQ0ZYX0xpc3RJdGVtKiBwTGlzdEl0ZW0gPSBuZXcgQ0ZYX0xpc3RJdGVtKCk7CisgIHBMaXN0SXRlbS0+U2V0Rm9udE1hcChtX3BGb250TWFwKTsKKyAgcExpc3RJdGVtLT5TZXRGb250U2l6ZShtX2ZGb250U2l6ZSk7CisgIHBMaXN0SXRlbS0+U2V0VGV4dChzdHIpOworICBtX2FMaXN0SXRlbXMuQWRkKHBMaXN0SXRlbSk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3Q6OkFkZEl0ZW0oRlhfTFBDV1NUUiBzdHIpCi17CQotCWlmIChDRlhfTGlzdEl0ZW0gKiBwTGlzdEl0ZW0gPSBuZXcgQ0ZYX0xpc3RJdGVtKCkpCi0JewotCQlwTGlzdEl0ZW0tPlNldEZvbnRNYXAobV9wRm9udE1hcCk7Ci0JCXBMaXN0SXRlbS0+U2V0Rm9udFNpemUobV9mRm9udFNpemUpOwotCQlwTGlzdEl0ZW0tPlNldFRleHQoc3RyKTsKLQkJbV9hTGlzdEl0ZW1zLkFkZChwTGlzdEl0ZW0pOwotCX0KLX0KK3ZvaWQgQ0ZYX0xpc3Q6OlJlQXJyYW5nZShpbnQzMl90IG5JdGVtSW5kZXgpIHsKKyAgRlhfRkxPQVQgZlBvc1kgPSAwLjBmOwogCi12b2lkIENGWF9MaXN0OjpSZUFycmFuZ2UoRlhfSU5UMzIgbkl0ZW1JbmRleCkKLXsKLQlGWF9GTE9BVCBmUG9zWSA9IDAuMGY7CisgIGlmIChDRlhfTGlzdEl0ZW0qIHBQcmV2SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdChuSXRlbUluZGV4IC0gMSkpCisgICAgZlBvc1kgPSBwUHJldkl0ZW0tPkdldFJlY3QoKS5ib3R0b207CiAKLQlpZiAoQ0ZYX0xpc3RJdGVtICogcFByZXZJdGVtID0gbV9hTGlzdEl0ZW1zLkdldEF0KG5JdGVtSW5kZXggLSAxKSkKLQkJZlBvc1kgPSBwUHJldkl0ZW0tPkdldFJlY3QoKS5ib3R0b207Ci0JCi0JZm9yIChGWF9JTlQzMiBpPW5JdGVtSW5kZXgsc3o9bV9hTGlzdEl0ZW1zLkdldFNpemUoKTsgaTxzejsgaSsrKQotCXsKLQkJaWYgKENGWF9MaXN0SXRlbSAqIHBMaXN0SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdChpKSkKLQkJewotCQkJRlhfRkxPQVQgZkxpc3RJdGVtSGVpZ2h0ID0gcExpc3RJdGVtLT5HZXRJdGVtSGVpZ2h0KCk7Ci0JCQlwTGlzdEl0ZW0tPlNldFJlY3QoQ0xTVF9SZWN0KDAuMGYsZlBvc1ksMC4wZixmUG9zWSArIGZMaXN0SXRlbUhlaWdodCkpOwotCQkJZlBvc1kgKz0gZkxpc3RJdGVtSGVpZ2h0OwkJCQotCQl9Ci0JfQorICBmb3IgKGludDMyX3QgaSA9IG5JdGVtSW5kZXgsIHN6ID0gbV9hTGlzdEl0ZW1zLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAoQ0ZYX0xpc3RJdGVtKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQoaSkpIHsKKyAgICAgIEZYX0ZMT0FUIGZMaXN0SXRlbUhlaWdodCA9IHBMaXN0SXRlbS0+R2V0SXRlbUhlaWdodCgpOworICAgICAgcExpc3RJdGVtLT5TZXRSZWN0KENMU1RfUmVjdCgwLjBmLCBmUG9zWSwgMC4wZiwgZlBvc1kgKyBmTGlzdEl0ZW1IZWlnaHQpKTsKKyAgICAgIGZQb3NZICs9IGZMaXN0SXRlbUhlaWdodDsKKyAgICB9CisgIH0KIAotCVNldENvbnRlbnRSZWN0KENMU1RfUmVjdCgwLjBmLDAuMGYsMC4wZixmUG9zWSkpOwkKKyAgU2V0Q29udGVudFJlY3QoQ0xTVF9SZWN0KDAuMGYsIDAuMGYsIDAuMGYsIGZQb3NZKSk7CiB9CiAKLUlGWF9FZGl0ICogQ0ZYX0xpc3Q6OkdldEl0ZW1FZGl0KEZYX0lOVDMyIG5JbmRleCkgY29uc3QKLXsKLQlpZiAoQ0ZYX0xpc3RJdGVtICogcExpc3RJdGVtID0gbV9hTGlzdEl0ZW1zLkdldEF0KG5JbmRleCkpCi0JewotCQlyZXR1cm4gcExpc3RJdGVtLT5HZXRFZGl0KCk7Ci0JfQorSUZYX0VkaXQqIENGWF9MaXN0OjpHZXRJdGVtRWRpdChpbnQzMl90IG5JbmRleCkgY29uc3QgeworICBpZiAoQ0ZYX0xpc3RJdGVtKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQobkluZGV4KSkgeworICAgIHJldHVybiBwTGlzdEl0ZW0tPkdldEVkaXQoKTsKKyAgfQogCi0JcmV0dXJuIE5VTEw7CisgIHJldHVybiBOVUxMOwogfQogCi1GWF9JTlQzMiBDRlhfTGlzdDo6R2V0Q291bnQoKSBjb25zdAotewotCXJldHVybiBtX2FMaXN0SXRlbXMuR2V0U2l6ZSgpOworaW50MzJfdCBDRlhfTGlzdDo6R2V0Q291bnQoKSBjb25zdCB7CisgIHJldHVybiBtX2FMaXN0SXRlbXMuR2V0U2l6ZSgpOwogfQogCi1DUERGX1JlY3QgQ0ZYX0xpc3Q6OkdldFBsYXRlUmVjdCgpIGNvbnN0Ci17Ci0JcmV0dXJuIENGWF9MaXN0Q29udGFpbmVyOjpHZXRQbGF0ZVJlY3QoKTsKK0NQREZfUmVjdCBDRlhfTGlzdDo6R2V0UGxhdGVSZWN0KCkgY29uc3QgeworICByZXR1cm4gQ0ZYX0xpc3RDb250YWluZXI6OkdldFBsYXRlUmVjdCgpOwogfQogCi1DUERGX1JlY3QgQ0ZYX0xpc3Q6OkdldENvbnRlbnRSZWN0KCkgY29uc3QKLXsKLQlyZXR1cm4gSW5uZXJUb091dGVyKENGWF9MaXN0Q29udGFpbmVyOjpHZXRDb250ZW50UmVjdCgpKTsKK0NQREZfUmVjdCBDRlhfTGlzdDo6R2V0Q29udGVudFJlY3QoKSBjb25zdCB7CisgIHJldHVybiBJbm5lclRvT3V0ZXIoQ0ZYX0xpc3RDb250YWluZXI6OkdldENvbnRlbnRSZWN0KCkpOwogfQogCi1GWF9GTE9BVCBDRlhfTGlzdDo6R2V0Rm9udFNpemUoKSBjb25zdAotewotCXJldHVybiBtX2ZGb250U2l6ZTsKK0ZYX0ZMT0FUIENGWF9MaXN0OjpHZXRGb250U2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fZkZvbnRTaXplOwogfQogCi1GWF9JTlQzMiBDRlhfTGlzdDo6R2V0SXRlbUluZGV4KGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3QKLXsKLQlDUERGX1BvaW50IHB0ID0gT3V0ZXJUb0lubmVyKHBvaW50KTsKK2ludDMyX3QgQ0ZYX0xpc3Q6OkdldEl0ZW1JbmRleChjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3QgeworICBDUERGX1BvaW50IHB0ID0gT3V0ZXJUb0lubmVyKHBvaW50KTsKIAotCUZYX0JPT0wgYkZpcnN0ID0gVFJVRTsKLQlGWF9CT09MIGJMYXN0ID0gVFJVRTsKKyAgRlhfQk9PTCBiRmlyc3QgPSBUUlVFOworICBGWF9CT09MIGJMYXN0ID0gVFJVRTsKIAotCWZvciAoRlhfSU5UMzIgaT0wLHN6PW1fYUxpc3RJdGVtcy5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQl7Ci0JCWlmIChDRlhfTGlzdEl0ZW0gKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQoaSkpCi0JCXsKLQkJCUNMU1RfUmVjdCByY0xpc3RJdGVtID0gcExpc3RJdGVtLT5HZXRSZWN0KCk7CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FMaXN0SXRlbXMuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgIGlmIChDRlhfTGlzdEl0ZW0qIHBMaXN0SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdChpKSkgeworICAgICAgQ0xTVF9SZWN0IHJjTGlzdEl0ZW0gPSBwTGlzdEl0ZW0tPkdldFJlY3QoKTsKIAotCQkJaWYgKEZYX0VESVRfSXNGbG9hdEJpZ2dlcihwdC55LCByY0xpc3RJdGVtLnRvcCkpCi0JCQl7CQkJCi0JCQkJYkZpcnN0ID0gRkFMU0U7Ci0JCQl9CisgICAgICBpZiAoRlhfRURJVF9Jc0Zsb2F0QmlnZ2VyKHB0LnksIHJjTGlzdEl0ZW0udG9wKSkgeworICAgICAgICBiRmlyc3QgPSBGQUxTRTsKKyAgICAgIH0KIAotCQkJaWYgKEZYX0VESVRfSXNGbG9hdFNtYWxsZXIocHQueSwgcmNMaXN0SXRlbS5ib3R0b20pKQotCQkJewotCQkJCWJMYXN0ID0gRkFMU0U7Ci0JCQl9CisgICAgICBpZiAoRlhfRURJVF9Jc0Zsb2F0U21hbGxlcihwdC55LCByY0xpc3RJdGVtLmJvdHRvbSkpIHsKKyAgICAgICAgYkxhc3QgPSBGQUxTRTsKKyAgICAgIH0KIAotCQkJaWYgKHB0LnkgPj0gcmNMaXN0SXRlbS50b3AgJiYgcHQueSA8IHJjTGlzdEl0ZW0uYm90dG9tKQotCQkJewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JfQorICAgICAgaWYgKHB0LnkgPj0gcmNMaXN0SXRlbS50b3AgJiYgcHQueSA8IHJjTGlzdEl0ZW0uYm90dG9tKSB7CisgICAgICAgIHJldHVybiBpOworICAgICAgfQorICAgIH0KKyAgfQogCi0JaWYgKGJGaXJzdCkgcmV0dXJuIDA7Ci0JaWYgKGJMYXN0KSByZXR1cm4gbV9hTGlzdEl0ZW1zLkdldFNpemUoKS0xOworICBpZiAoYkZpcnN0KQorICAgIHJldHVybiAwOworICBpZiAoYkxhc3QpCisgICAgcmV0dXJuIG1fYUxpc3RJdGVtcy5HZXRTaXplKCkgLSAxOwogCi0JcmV0dXJuIC0xOworICByZXR1cm4gLTE7CiB9CiAKLUZYX0ZMT0FUIENGWF9MaXN0OjpHZXRGaXJzdEhlaWdodCgpIGNvbnN0Ci17Ci0JaWYgKENGWF9MaXN0SXRlbSAqIHBMaXN0SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdCgwKSkKLQl7Ci0JCXJldHVybiBwTGlzdEl0ZW0tPkdldEl0ZW1IZWlnaHQoKTsKLQl9CitGWF9GTE9BVCBDRlhfTGlzdDo6R2V0Rmlyc3RIZWlnaHQoKSBjb25zdCB7CisgIGlmIChDRlhfTGlzdEl0ZW0qIHBMaXN0SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdCgwKSkgeworICAgIHJldHVybiBwTGlzdEl0ZW0tPkdldEl0ZW1IZWlnaHQoKTsKKyAgfQogCi0JcmV0dXJuIDEuMGY7CisgIHJldHVybiAxLjBmOwogfQogCi1GWF9JTlQzMiBDRlhfTGlzdDo6R2V0Rmlyc3RTZWxlY3RlZCgpIGNvbnN0Ci17Ci0JZm9yIChGWF9JTlQzMiBpPTAsc3o9bV9hTGlzdEl0ZW1zLkdldFNpemUoKTsgaTxzejsgaSsrKQotCXsKLQkJaWYgKENGWF9MaXN0SXRlbSAqIHBMaXN0SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdChpKSkKLQkJewotCQkJaWYgKHBMaXN0SXRlbS0+SXNTZWxlY3RlZCgpKQotCQkJCXJldHVybiBpOwotCQl9Ci0JfQotCXJldHVybiAtMTsKK2ludDMyX3QgQ0ZYX0xpc3Q6OkdldEZpcnN0U2VsZWN0ZWQoKSBjb25zdCB7CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FMaXN0SXRlbXMuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgIGlmIChDRlhfTGlzdEl0ZW0qIHBMaXN0SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdChpKSkgeworICAgICAgaWYgKHBMaXN0SXRlbS0+SXNTZWxlY3RlZCgpKQorICAgICAgICByZXR1cm4gaTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIC0xOwogfQogCi1GWF9JTlQzMiBDRlhfTGlzdDo6R2V0TGFzdFNlbGVjdGVkKCkgY29uc3QKLXsKLQlmb3IgKEZYX0lOVDMyIGk9bV9hTGlzdEl0ZW1zLkdldFNpemUoKS0xOyBpPj0wOyBpLS0pCi0JewotCQlpZiAoQ0ZYX0xpc3RJdGVtICogcExpc3RJdGVtID0gbV9hTGlzdEl0ZW1zLkdldEF0KGkpKQotCQl7Ci0JCQlpZiAocExpc3RJdGVtLT5Jc1NlbGVjdGVkKCkpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQl9Ci0JcmV0dXJuIC0xOworaW50MzJfdCBDRlhfTGlzdDo6R2V0TGFzdFNlbGVjdGVkKCkgY29uc3QgeworICBmb3IgKGludDMyX3QgaSA9IG1fYUxpc3RJdGVtcy5HZXRTaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgIGlmIChDRlhfTGlzdEl0ZW0qIHBMaXN0SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdChpKSkgeworICAgICAgaWYgKHBMaXN0SXRlbS0+SXNTZWxlY3RlZCgpKQorICAgICAgICByZXR1cm4gaTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIC0xOwogfQogCi1GWF9XQ0hBUiBDRlhfTGlzdDo6VG91cHBlcihGWF9XQ0hBUiBjKSBjb25zdAotewotCWlmICggKGMgPj0gJ2EnKSAmJiAoYyA8PSAneicpICkKLQkJYyA9IGMgLSAoJ2EnIC0gJ0EnKTsKLQlyZXR1cm4gYzsKK0ZYX1dDSEFSIENGWF9MaXN0OjpUb3VwcGVyKEZYX1dDSEFSIGMpIGNvbnN0IHsKKyAgaWYgKChjID49ICdhJykgJiYgKGMgPD0gJ3onKSkKKyAgICBjID0gYyAtICgnYScgLSAnQScpOworICByZXR1cm4gYzsKIH0KIAotRlhfSU5UMzIgQ0ZYX0xpc3Q6OkZpbmROZXh0KEZYX0lOVDMyIG5JbmRleCxGWF9XQ0hBUiBuQ2hhcikgY29uc3QKLXsKLQlGWF9JTlQzMiBuQ2lyY2xlSW5kZXggPSBuSW5kZXg7CitpbnQzMl90IENGWF9MaXN0OjpGaW5kTmV4dChpbnQzMl90IG5JbmRleCwgRlhfV0NIQVIgbkNoYXIpIGNvbnN0IHsKKyAgaW50MzJfdCBuQ2lyY2xlSW5kZXggPSBuSW5kZXg7CiAKLQlmb3IgKEZYX0lOVDMyIGk9MCxzej1tX2FMaXN0SXRlbXMuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JewotCQluQ2lyY2xlSW5kZXggKys7Ci0JCWlmIChuQ2lyY2xlSW5kZXggPj0gc3opIG5DaXJjbGVJbmRleCA9IDA7CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FMaXN0SXRlbXMuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgIG5DaXJjbGVJbmRleCsrOworICAgIGlmIChuQ2lyY2xlSW5kZXggPj0gc3opCisgICAgICBuQ2lyY2xlSW5kZXggPSAwOwogCi0JCWlmIChDRlhfTGlzdEl0ZW0gKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQobkNpcmNsZUluZGV4KSkKLQkJewotCQkJaWYgKFRvdXBwZXIocExpc3RJdGVtLT5HZXRGaXJzdENoYXIoKSkgPT0gVG91cHBlcihuQ2hhcikpCi0JCQkJcmV0dXJuIG5DaXJjbGVJbmRleDsKLQkJfQotCX0KKyAgICBpZiAoQ0ZYX0xpc3RJdGVtKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQobkNpcmNsZUluZGV4KSkgeworICAgICAgaWYgKFRvdXBwZXIocExpc3RJdGVtLT5HZXRGaXJzdENoYXIoKSkgPT0gVG91cHBlcihuQ2hhcikpCisgICAgICAgIHJldHVybiBuQ2lyY2xlSW5kZXg7CisgICAgfQorICB9CiAKLQlyZXR1cm4gbkNpcmNsZUluZGV4OworICByZXR1cm4gbkNpcmNsZUluZGV4OwogfQogCi1DUERGX1JlY3QgQ0ZYX0xpc3Q6OkdldEl0ZW1SZWN0KEZYX0lOVDMyIG5JbmRleCkgY29uc3QKLXsKLQlpZiAoQ0ZYX0xpc3RJdGVtICogcExpc3RJdGVtID0gbV9hTGlzdEl0ZW1zLkdldEF0KG5JbmRleCkpCi0JewotCQlDUERGX1JlY3QgcmNJdGVtID0gcExpc3RJdGVtLT5HZXRSZWN0KCk7Ci0JCXJjSXRlbS5sZWZ0ID0gMC4wZjsKLQkJcmNJdGVtLnJpZ2h0ID0gR2V0UGxhdGVSZWN0KCkuV2lkdGgoKTsKLQkJcmV0dXJuIElubmVyVG9PdXRlcihyY0l0ZW0pOwotCX0KK0NQREZfUmVjdCBDRlhfTGlzdDo6R2V0SXRlbVJlY3QoaW50MzJfdCBuSW5kZXgpIGNvbnN0IHsKKyAgaWYgKENGWF9MaXN0SXRlbSogcExpc3RJdGVtID0gbV9hTGlzdEl0ZW1zLkdldEF0KG5JbmRleCkpIHsKKyAgICBDUERGX1JlY3QgcmNJdGVtID0gcExpc3RJdGVtLT5HZXRSZWN0KCk7CisgICAgcmNJdGVtLmxlZnQgPSAwLjBmOworICAgIHJjSXRlbS5yaWdodCA9IEdldFBsYXRlUmVjdCgpLldpZHRoKCk7CisgICAgcmV0dXJuIElubmVyVG9PdXRlcihyY0l0ZW0pOworICB9CiAKLQlyZXR1cm4gQ1BERl9SZWN0KCk7CisgIHJldHVybiBDUERGX1JlY3QoKTsKIH0KIAotRlhfQk9PTCBDRlhfTGlzdDo6SXNJdGVtU2VsZWN0ZWQoRlhfSU5UMzIgbkluZGV4KSBjb25zdAotewotCWlmIChDRlhfTGlzdEl0ZW0gKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQobkluZGV4KSkKLQl7Ci0JCXJldHVybiBwTGlzdEl0ZW0tPklzU2VsZWN0ZWQoKTsKLQl9CitGWF9CT09MIENGWF9MaXN0OjpJc0l0ZW1TZWxlY3RlZChpbnQzMl90IG5JbmRleCkgY29uc3QgeworICBpZiAoQ0ZYX0xpc3RJdGVtKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQobkluZGV4KSkgeworICAgIHJldHVybiBwTGlzdEl0ZW0tPklzU2VsZWN0ZWQoKTsKKyAgfQogCi0JcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9CiAKLXZvaWQgQ0ZYX0xpc3Q6OlNldEl0ZW1TZWxlY3QoRlhfSU5UMzIgbkl0ZW1JbmRleCwgRlhfQk9PTCBiU2VsZWN0ZWQpCi17Ci0JaWYgKENGWF9MaXN0SXRlbSAqIHBMaXN0SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdChuSXRlbUluZGV4KSkKLQl7Ci0JCXBMaXN0SXRlbS0+U2V0U2VsZWN0KGJTZWxlY3RlZCk7Ci0JfQordm9pZCBDRlhfTGlzdDo6U2V0SXRlbVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkKSB7CisgIGlmIChDRlhfTGlzdEl0ZW0qIHBMaXN0SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdChuSXRlbUluZGV4KSkgeworICAgIHBMaXN0SXRlbS0+U2V0U2VsZWN0KGJTZWxlY3RlZCk7CisgIH0KIH0KIAotdm9pZCBDRlhfTGlzdDo6U2V0SXRlbUNhcmV0KEZYX0lOVDMyIG5JdGVtSW5kZXgsIEZYX0JPT0wgYkNhcmV0KQotewotCWlmIChDRlhfTGlzdEl0ZW0gKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQobkl0ZW1JbmRleCkpCi0JewotCQlwTGlzdEl0ZW0tPlNldENhcmV0KGJDYXJldCk7CQkKLQl9Cit2b2lkIENGWF9MaXN0OjpTZXRJdGVtQ2FyZXQoaW50MzJfdCBuSXRlbUluZGV4LCBGWF9CT09MIGJDYXJldCkgeworICBpZiAoQ0ZYX0xpc3RJdGVtKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQobkl0ZW1JbmRleCkpIHsKKyAgICBwTGlzdEl0ZW0tPlNldENhcmV0KGJDYXJldCk7CisgIH0KIH0KIAotdm9pZCBDRlhfTGlzdDo6U2V0TXVsdGlwbGVTZWwoRlhfQk9PTCBiTXVsdGlwbGUpCi17Ci0JbV9iTXVsdGlwbGUgPSBiTXVsdGlwbGU7Cit2b2lkIENGWF9MaXN0OjpTZXRNdWx0aXBsZVNlbChGWF9CT09MIGJNdWx0aXBsZSkgeworICBtX2JNdWx0aXBsZSA9IGJNdWx0aXBsZTsKIH0KIAotRlhfQk9PTCBDRlhfTGlzdDo6SXNNdWx0aXBsZVNlbCgpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fYk11bHRpcGxlOworRlhfQk9PTCBDRlhfTGlzdDo6SXNNdWx0aXBsZVNlbCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fYk11bHRpcGxlOwogfQogCi1GWF9CT09MIENGWF9MaXN0OjpJc1ZhbGlkKEZYX0lOVDMyIG5JdGVtSW5kZXgpIGNvbnN0Ci17Ci0JcmV0dXJuIG5JdGVtSW5kZXggPj0gMCAmJiBuSXRlbUluZGV4IDwgbV9hTGlzdEl0ZW1zLkdldFNpemUoKTsKK0ZYX0JPT0wgQ0ZYX0xpc3Q6OklzVmFsaWQoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdCB7CisgIHJldHVybiBuSXRlbUluZGV4ID49IDAgJiYgbkl0ZW1JbmRleCA8IG1fYUxpc3RJdGVtcy5HZXRTaXplKCk7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENGWF9MaXN0OjpHZXRJdGVtVGV4dChGWF9JTlQzMiBuSW5kZXgpIGNvbnN0Ci17Ci0JaWYgKENGWF9MaXN0SXRlbSAqIHBMaXN0SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdChuSW5kZXgpKQotCXsKLQkJcmV0dXJuIHBMaXN0SXRlbS0+R2V0VGV4dCgpOwotCX0KK0NGWF9XaWRlU3RyaW5nIENGWF9MaXN0OjpHZXRJdGVtVGV4dChpbnQzMl90IG5JbmRleCkgY29uc3QgeworICBpZiAoQ0ZYX0xpc3RJdGVtKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQobkluZGV4KSkgeworICAgIHJldHVybiBwTGlzdEl0ZW0tPkdldFRleHQoKTsKKyAgfQogCi0JcmV0dXJuIEwiIjsKKyAgcmV0dXJuIEwiIjsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQTFNUX1NlbGVjdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitDUExTVF9TZWxlY3Q6OkNQTFNUX1NlbGVjdCgpIHt9CiAKLUNQTFNUX1NlbGVjdDo6Q1BMU1RfU2VsZWN0KCkKLXsKLX0KK0NQTFNUX1NlbGVjdDo6fkNQTFNUX1NlbGVjdCgpIHsKKyAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYUl0ZW1zLkdldFNpemUoKTsgaSA8IHN6OyBpKyspCisgICAgZGVsZXRlIG1fYUl0ZW1zLkdldEF0KGkpOwogCi1DUExTVF9TZWxlY3Q6On5DUExTVF9TZWxlY3QoKQotewotCWZvciAoRlhfSU5UMzIgaT0wLHN6PW1fYUl0ZW1zLkdldFNpemUoKTsgaTxzejsgaSsrKQotCQlkZWxldGUgbV9hSXRlbXMuR2V0QXQoaSk7Ci0KLQltX2FJdGVtcy5SZW1vdmVBbGwoKTsKKyAgbV9hSXRlbXMuUmVtb3ZlQWxsKCk7CiB9CiAKLXZvaWQgQ1BMU1RfU2VsZWN0OjpBZGQoRlhfSU5UMzIgbkl0ZW1JbmRleCkKLXsKLQlGWF9JTlQzMiBuSW5kZXggPSBGaW5kKG5JdGVtSW5kZXgpOwordm9pZCBDUExTVF9TZWxlY3Q6OkFkZChpbnQzMl90IG5JdGVtSW5kZXgpIHsKKyAgaW50MzJfdCBuSW5kZXggPSBGaW5kKG5JdGVtSW5kZXgpOwogCi0JaWYgKG5JbmRleCA8IDApIAotCQltX2FJdGVtcy5BZGQobmV3IENQTFNUX1NlbGVjdF9JdGVtKG5JdGVtSW5kZXgsMSkpOwotCWVsc2UKLQl7Ci0JCWlmIChDUExTVF9TZWxlY3RfSXRlbSAqIHBJdGVtID0gbV9hSXRlbXMuR2V0QXQobkluZGV4KSkKLQkJewotCQkJcEl0ZW0tPm5TdGF0ZSA9IDE7Ci0JCX0KLQl9CisgIGlmIChuSW5kZXggPCAwKSB7CisgICAgbV9hSXRlbXMuQWRkKG5ldyBDUExTVF9TZWxlY3RfSXRlbShuSXRlbUluZGV4LCAxKSk7CisgIH0gZWxzZSB7CisgICAgaWYgKENQTFNUX1NlbGVjdF9JdGVtKiBwSXRlbSA9IG1fYUl0ZW1zLkdldEF0KG5JbmRleCkpIHsKKyAgICAgIHBJdGVtLT5uU3RhdGUgPSAxOworICAgIH0KKyAgfQogfQogCi12b2lkIENQTFNUX1NlbGVjdDo6QWRkKEZYX0lOVDMyIG5CZWdpbkluZGV4LCBGWF9JTlQzMiBuRW5kSW5kZXgpCi17Ci0JaWYgKG5CZWdpbkluZGV4ID4gbkVuZEluZGV4KQotCXsKLQkJRlhfSU5UMzIgblRlbXAgPSBuRW5kSW5kZXg7Ci0JCW5FbmRJbmRleCA9IG5CZWdpbkluZGV4OwotCQluQmVnaW5JbmRleCA9IG5UZW1wOwotCX0KK3ZvaWQgQ1BMU1RfU2VsZWN0OjpBZGQoaW50MzJfdCBuQmVnaW5JbmRleCwgaW50MzJfdCBuRW5kSW5kZXgpIHsKKyAgaWYgKG5CZWdpbkluZGV4ID4gbkVuZEluZGV4KSB7CisgICAgaW50MzJfdCBuVGVtcCA9IG5FbmRJbmRleDsKKyAgICBuRW5kSW5kZXggPSBuQmVnaW5JbmRleDsKKyAgICBuQmVnaW5JbmRleCA9IG5UZW1wOworICB9CiAKLQlmb3IgKEZYX0lOVDMyIGk9bkJlZ2luSW5kZXg7IGk8PW5FbmRJbmRleDsgaSsrKQlBZGQoaSk7CisgIGZvciAoaW50MzJfdCBpID0gbkJlZ2luSW5kZXg7IGkgPD0gbkVuZEluZGV4OyBpKyspCisgICAgQWRkKGkpOwogfQogCi12b2lkIENQTFNUX1NlbGVjdDo6U3ViKEZYX0lOVDMyIG5JdGVtSW5kZXgpCi17Ci0JZm9yIChGWF9JTlQzMiBpPW1fYUl0ZW1zLkdldFNpemUoKS0xOyBpPj0wOyBpLS0pCi0JewotCQlpZiAoQ1BMU1RfU2VsZWN0X0l0ZW0gKiBwSXRlbSA9IG1fYUl0ZW1zLkdldEF0KGkpKQotCQkJaWYgKHBJdGVtLT5uSXRlbUluZGV4ID09IG5JdGVtSW5kZXgpCi0JCQkJcEl0ZW0tPm5TdGF0ZSA9IC0xOwotCX0KK3ZvaWQgQ1BMU1RfU2VsZWN0OjpTdWIoaW50MzJfdCBuSXRlbUluZGV4KSB7CisgIGZvciAoaW50MzJfdCBpID0gbV9hSXRlbXMuR2V0U2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBpZiAoQ1BMU1RfU2VsZWN0X0l0ZW0qIHBJdGVtID0gbV9hSXRlbXMuR2V0QXQoaSkpCisgICAgICBpZiAocEl0ZW0tPm5JdGVtSW5kZXggPT0gbkl0ZW1JbmRleCkKKyAgICAgICAgcEl0ZW0tPm5TdGF0ZSA9IC0xOworICB9CiB9CiAKLXZvaWQgQ1BMU1RfU2VsZWN0OjpTdWIoRlhfSU5UMzIgbkJlZ2luSW5kZXgsIEZYX0lOVDMyIG5FbmRJbmRleCkKLXsKLQlpZiAobkJlZ2luSW5kZXggPiBuRW5kSW5kZXgpCi0JewotCQlGWF9JTlQzMiBuVGVtcCA9IG5FbmRJbmRleDsKLQkJbkVuZEluZGV4ID0gbkJlZ2luSW5kZXg7Ci0JCW5CZWdpbkluZGV4ID0gblRlbXA7Ci0JfQordm9pZCBDUExTVF9TZWxlY3Q6OlN1YihpbnQzMl90IG5CZWdpbkluZGV4LCBpbnQzMl90IG5FbmRJbmRleCkgeworICBpZiAobkJlZ2luSW5kZXggPiBuRW5kSW5kZXgpIHsKKyAgICBpbnQzMl90IG5UZW1wID0gbkVuZEluZGV4OworICAgIG5FbmRJbmRleCA9IG5CZWdpbkluZGV4OworICAgIG5CZWdpbkluZGV4ID0gblRlbXA7CisgIH0KIAotCWZvciAoRlhfSU5UMzIgaT1uQmVnaW5JbmRleDsgaTw9bkVuZEluZGV4OyBpKyspCVN1YihpKTsKKyAgZm9yIChpbnQzMl90IGkgPSBuQmVnaW5JbmRleDsgaSA8PSBuRW5kSW5kZXg7IGkrKykKKyAgICBTdWIoaSk7CiB9CiAKLUZYX0lOVDMyIENQTFNUX1NlbGVjdDo6RmluZChGWF9JTlQzMiBuSXRlbUluZGV4KSBjb25zdAotewotCWZvciAoRlhfSU5UMzIgaT0wLHN6PW1fYUl0ZW1zLkdldFNpemUoKTsgaTxzejsgaSsrKQotCXsKLQkJaWYgKENQTFNUX1NlbGVjdF9JdGVtICogcEl0ZW0gPSBtX2FJdGVtcy5HZXRBdChpKSkKLQkJewotCQkJaWYgKHBJdGVtLT5uSXRlbUluZGV4ID09IG5JdGVtSW5kZXgpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQl9CitpbnQzMl90IENQTFNUX1NlbGVjdDo6RmluZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0IHsKKyAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYUl0ZW1zLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAoQ1BMU1RfU2VsZWN0X0l0ZW0qIHBJdGVtID0gbV9hSXRlbXMuR2V0QXQoaSkpIHsKKyAgICAgIGlmIChwSXRlbS0+bkl0ZW1JbmRleCA9PSBuSXRlbUluZGV4KQorICAgICAgICByZXR1cm4gaTsKKyAgICB9CisgIH0KIAotCXJldHVybiAtMTsKKyAgcmV0dXJuIC0xOwogfQogCi1GWF9CT09MIENQTFNUX1NlbGVjdDo6SXNFeGlzdChGWF9JTlQzMiBuSXRlbUluZGV4KSBjb25zdAotewotCXJldHVybiBGaW5kKG5JdGVtSW5kZXgpID49IDA7CitGWF9CT09MIENQTFNUX1NlbGVjdDo6SXNFeGlzdChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIEZpbmQobkl0ZW1JbmRleCkgPj0gMDsKIH0KIAotRlhfSU5UMzIgQ1BMU1RfU2VsZWN0OjpHZXRDb3VudCgpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fYUl0ZW1zLkdldFNpemUoKTsKK2ludDMyX3QgQ1BMU1RfU2VsZWN0OjpHZXRDb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fYUl0ZW1zLkdldFNpemUoKTsKIH0KIAotRlhfSU5UMzIgQ1BMU1RfU2VsZWN0OjpHZXRJdGVtSW5kZXgoRlhfSU5UMzIgbkluZGV4KSBjb25zdAotewotCWlmIChuSW5kZXggPj0gMCAmJiBuSW5kZXggPCBtX2FJdGVtcy5HZXRTaXplKCkpCi0JCWlmIChDUExTVF9TZWxlY3RfSXRlbSAqIHBJdGVtID0gbV9hSXRlbXMuR2V0QXQobkluZGV4KSkKLQkJCXJldHVybiBwSXRlbS0+bkl0ZW1JbmRleDsKK2ludDMyX3QgQ1BMU1RfU2VsZWN0OjpHZXRJdGVtSW5kZXgoaW50MzJfdCBuSW5kZXgpIGNvbnN0IHsKKyAgaWYgKG5JbmRleCA+PSAwICYmIG5JbmRleCA8IG1fYUl0ZW1zLkdldFNpemUoKSkKKyAgICBpZiAoQ1BMU1RfU2VsZWN0X0l0ZW0qIHBJdGVtID0gbV9hSXRlbXMuR2V0QXQobkluZGV4KSkKKyAgICAgIHJldHVybiBwSXRlbS0+bkl0ZW1JbmRleDsKIAotCXJldHVybiAtMTsKKyAgcmV0dXJuIC0xOwogfQogCi1GWF9JTlQzMiBDUExTVF9TZWxlY3Q6OkdldFN0YXRlKEZYX0lOVDMyIG5JbmRleCkgY29uc3QKLXsKLQlpZiAobkluZGV4ID49IDAgJiYgbkluZGV4IDwgbV9hSXRlbXMuR2V0U2l6ZSgpKQotCQlpZiAoQ1BMU1RfU2VsZWN0X0l0ZW0gKiBwSXRlbSA9IG1fYUl0ZW1zLkdldEF0KG5JbmRleCkpCi0JCQlyZXR1cm4gcEl0ZW0tPm5TdGF0ZTsKK2ludDMyX3QgQ1BMU1RfU2VsZWN0OjpHZXRTdGF0ZShpbnQzMl90IG5JbmRleCkgY29uc3QgeworICBpZiAobkluZGV4ID49IDAgJiYgbkluZGV4IDwgbV9hSXRlbXMuR2V0U2l6ZSgpKQorICAgIGlmIChDUExTVF9TZWxlY3RfSXRlbSogcEl0ZW0gPSBtX2FJdGVtcy5HZXRBdChuSW5kZXgpKQorICAgICAgcmV0dXJuIHBJdGVtLT5uU3RhdGU7CiAKLQlyZXR1cm4gMDsKKyAgcmV0dXJuIDA7CiB9CiAKLXZvaWQgQ1BMU1RfU2VsZWN0OjpEZXNlbGVjdEFsbCgpCi17Ci0JZm9yIChGWF9JTlQzMiBpPTAsc3o9bV9hSXRlbXMuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JewotCQlpZiAoQ1BMU1RfU2VsZWN0X0l0ZW0gKiBwSXRlbSA9IG1fYUl0ZW1zLkdldEF0KGkpKQotCQl7Ci0JCQlwSXRlbS0+blN0YXRlID0gLTE7Ci0JCX0KLQl9Cit2b2lkIENQTFNUX1NlbGVjdDo6RGVzZWxlY3RBbGwoKSB7CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FJdGVtcy5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgaWYgKENQTFNUX1NlbGVjdF9JdGVtKiBwSXRlbSA9IG1fYUl0ZW1zLkdldEF0KGkpKSB7CisgICAgICBwSXRlbS0+blN0YXRlID0gLTE7CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ1BMU1RfU2VsZWN0OjpEb25lKCkKLXsKLQlmb3IgKEZYX0lOVDMyIGk9bV9hSXRlbXMuR2V0U2l6ZSgpLTE7IGk+PTA7IGktLSkKLQl7CQotCQlpZiAoQ1BMU1RfU2VsZWN0X0l0ZW0gKiBwSXRlbSA9IG1fYUl0ZW1zLkdldEF0KGkpKQotCQl7Ci0JCQlpZiAocEl0ZW0tPm5TdGF0ZSA9PSAtMSkKLQkJCXsKLQkJCQlkZWxldGUgcEl0ZW07Ci0JCQkJbV9hSXRlbXMuUmVtb3ZlQXQoaSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcEl0ZW0tPm5TdGF0ZSA9IDA7Ci0JCQl9Ci0JCX0KLQl9Cit2b2lkIENQTFNUX1NlbGVjdDo6RG9uZSgpIHsKKyAgZm9yIChpbnQzMl90IGkgPSBtX2FJdGVtcy5HZXRTaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgIGlmIChDUExTVF9TZWxlY3RfSXRlbSogcEl0ZW0gPSBtX2FJdGVtcy5HZXRBdChpKSkgeworICAgICAgaWYgKHBJdGVtLT5uU3RhdGUgPT0gLTEpIHsKKyAgICAgICAgZGVsZXRlIHBJdGVtOworICAgICAgICBtX2FJdGVtcy5SZW1vdmVBdChpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBJdGVtLT5uU3RhdGUgPSAwOworICAgICAgfQorICAgIH0KKyAgfQogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0ZYX0xpc3RDdHJsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworQ0ZYX0xpc3RDdHJsOjpDRlhfTGlzdEN0cmwoKQorICAgIDogbV9wTm90aWZ5KE5VTEwpLAorICAgICAgbV9iTm90aWZ5RmxhZyhGQUxTRSksCisgICAgICBtX3B0U2Nyb2xsUG9zKDAuMGYsIDAuMGYpLAorICAgICAgbV9uU2VsSXRlbSgtMSksCisgICAgICBtX25Gb290SW5kZXgoLTEpLAorICAgICAgbV9iQ3RybFNlbChGQUxTRSksCisgICAgICBtX25DYXJldEluZGV4KC0xKSB7fQogCi1DRlhfTGlzdEN0cmw6OkNGWF9MaXN0Q3RybCgpIDogbV9wTm90aWZ5KE5VTEwpLAotCW1fYk5vdGlmeUZsYWcoRkFMU0UpLAotCW1fcHRTY3JvbGxQb3MoMC4wZiwwLjBmKSwKLQltX25TZWxJdGVtKC0xKSwKLQltX25Gb290SW5kZXgoLTEpLAotCW1fYkN0cmxTZWwoRkFMU0UpLAotCW1fbkNhcmV0SW5kZXgoLTEpCi17CitDRlhfTGlzdEN0cmw6On5DRlhfTGlzdEN0cmwoKSB7fQorCit2b2lkIENGWF9MaXN0Q3RybDo6U2V0Tm90aWZ5KElGWF9MaXN0X05vdGlmeSogcE5vdGlmeSkgeworICBtX3BOb3RpZnkgPSBwTm90aWZ5OwogfQogCi1DRlhfTGlzdEN0cmw6On5DRlhfTGlzdEN0cmwoKQotewotfQorQ1BERl9Qb2ludCBDRlhfTGlzdEN0cmw6OkluVG9PdXQoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0IHsKKyAgQ1BERl9SZWN0IHJjUGxhdGUgPSBHZXRQbGF0ZVJlY3QoKTsKIAotdm9pZCBDRlhfTGlzdEN0cmw6OlNldE5vdGlmeShJRlhfTGlzdF9Ob3RpZnkgKiBwTm90aWZ5KQotewotCW1fcE5vdGlmeSA9IHBOb3RpZnk7CisgIHJldHVybiBDUERGX1BvaW50KHBvaW50LnggLSAobV9wdFNjcm9sbFBvcy54IC0gcmNQbGF0ZS5sZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgcG9pbnQueSAtIChtX3B0U2Nyb2xsUG9zLnkgLSByY1BsYXRlLnRvcCkpOwogfQogCi1DUERGX1BvaW50IENGWF9MaXN0Q3RybDo6SW5Ub091dChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0Ci17Ci0JQ1BERl9SZWN0IHJjUGxhdGUgPSBHZXRQbGF0ZVJlY3QoKTsKK0NQREZfUG9pbnQgQ0ZYX0xpc3RDdHJsOjpPdXRUb0luKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdCB7CisgIENQREZfUmVjdCByY1BsYXRlID0gR2V0UGxhdGVSZWN0KCk7CiAKLQlyZXR1cm4gQ1BERl9Qb2ludChwb2ludC54IC0gKG1fcHRTY3JvbGxQb3MueCAtIHJjUGxhdGUubGVmdCksCi0JCXBvaW50LnkgLSAobV9wdFNjcm9sbFBvcy55IC0gcmNQbGF0ZS50b3ApKTsKKyAgcmV0dXJuIENQREZfUG9pbnQocG9pbnQueCArIChtX3B0U2Nyb2xsUG9zLnggLSByY1BsYXRlLmxlZnQpLAorICAgICAgICAgICAgICAgICAgICBwb2ludC55ICsgKG1fcHRTY3JvbGxQb3MueSAtIHJjUGxhdGUudG9wKSk7CiB9CiAKLUNQREZfUG9pbnQgQ0ZYX0xpc3RDdHJsOjpPdXRUb0luKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkgY29uc3QKLXsKLQlDUERGX1JlY3QgcmNQbGF0ZSA9IEdldFBsYXRlUmVjdCgpOworQ1BERl9SZWN0IENGWF9MaXN0Q3RybDo6SW5Ub091dChjb25zdCBDUERGX1JlY3QmIHJlY3QpIGNvbnN0IHsKKyAgQ1BERl9Qb2ludCBwdExlZnRCb3R0b20gPSBJblRvT3V0KENQREZfUG9pbnQocmVjdC5sZWZ0LCByZWN0LmJvdHRvbSkpOworICBDUERGX1BvaW50IHB0UmlnaHRUb3AgPSBJblRvT3V0KENQREZfUG9pbnQocmVjdC5yaWdodCwgcmVjdC50b3ApKTsKIAotCXJldHVybiBDUERGX1BvaW50KHBvaW50LnggKyAobV9wdFNjcm9sbFBvcy54IC0gcmNQbGF0ZS5sZWZ0KSwKLQkJcG9pbnQueSArIChtX3B0U2Nyb2xsUG9zLnkgLSByY1BsYXRlLnRvcCkpOworICByZXR1cm4gQ1BERl9SZWN0KHB0TGVmdEJvdHRvbS54LCBwdExlZnRCb3R0b20ueSwgcHRSaWdodFRvcC54LCBwdFJpZ2h0VG9wLnkpOwogfQogCi1DUERGX1JlY3QgQ0ZYX0xpc3RDdHJsOjpJblRvT3V0KGNvbnN0IENQREZfUmVjdCAmIHJlY3QpIGNvbnN0Ci17Ci0JQ1BERl9Qb2ludCBwdExlZnRCb3R0b20gPSBJblRvT3V0KENQREZfUG9pbnQocmVjdC5sZWZ0LHJlY3QuYm90dG9tKSk7Ci0JQ1BERl9Qb2ludCBwdFJpZ2h0VG9wID0gSW5Ub091dChDUERGX1BvaW50KHJlY3QucmlnaHQscmVjdC50b3ApKTsKK0NQREZfUmVjdCBDRlhfTGlzdEN0cmw6Ok91dFRvSW4oY29uc3QgQ1BERl9SZWN0JiByZWN0KSBjb25zdCB7CisgIENQREZfUG9pbnQgcHRMZWZ0Qm90dG9tID0gT3V0VG9JbihDUERGX1BvaW50KHJlY3QubGVmdCwgcmVjdC5ib3R0b20pKTsKKyAgQ1BERl9Qb2ludCBwdFJpZ2h0VG9wID0gT3V0VG9JbihDUERGX1BvaW50KHJlY3QucmlnaHQsIHJlY3QudG9wKSk7CiAKLQlyZXR1cm4gQ1BERl9SZWN0KHB0TGVmdEJvdHRvbS54LHB0TGVmdEJvdHRvbS55LHB0UmlnaHRUb3AueCxwdFJpZ2h0VG9wLnkpOworICByZXR1cm4gQ1BERl9SZWN0KHB0TGVmdEJvdHRvbS54LCBwdExlZnRCb3R0b20ueSwgcHRSaWdodFRvcC54LCBwdFJpZ2h0VG9wLnkpOwogfQogCi1DUERGX1JlY3QgQ0ZYX0xpc3RDdHJsOjpPdXRUb0luKGNvbnN0IENQREZfUmVjdCAmIHJlY3QpIGNvbnN0Ci17Ci0JQ1BERl9Qb2ludCBwdExlZnRCb3R0b20gPSBPdXRUb0luKENQREZfUG9pbnQocmVjdC5sZWZ0LHJlY3QuYm90dG9tKSk7Ci0JQ1BERl9Qb2ludCBwdFJpZ2h0VG9wID0gT3V0VG9JbihDUERGX1BvaW50KHJlY3QucmlnaHQscmVjdC50b3ApKTsKK3ZvaWQgQ0ZYX0xpc3RDdHJsOjpPbk1vdXNlRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDdHJsKSB7CisgIGludDMyX3QgbkhpdEluZGV4ID0gR2V0SXRlbUluZGV4KHBvaW50KTsKIAotCXJldHVybiBDUERGX1JlY3QocHRMZWZ0Qm90dG9tLngscHRMZWZ0Qm90dG9tLnkscHRSaWdodFRvcC54LHB0UmlnaHRUb3AueSk7Ci19CisgIGlmIChJc011bHRpcGxlU2VsKCkpIHsKKyAgICBpZiAoYkN0cmwpIHsKKyAgICAgIGlmIChJc0l0ZW1TZWxlY3RlZChuSGl0SW5kZXgpKSB7CisgICAgICAgIG1fYVNlbEl0ZW1zLlN1YihuSGl0SW5kZXgpOworICAgICAgICBTZWxlY3RJdGVtcygpOworICAgICAgICBtX2JDdHJsU2VsID0gRkFMU0U7CisgICAgICB9IGVsc2UgeworICAgICAgICBtX2FTZWxJdGVtcy5BZGQobkhpdEluZGV4KTsKKyAgICAgICAgU2VsZWN0SXRlbXMoKTsKKyAgICAgICAgbV9iQ3RybFNlbCA9IFRSVUU7CisgICAgICB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpPbk1vdXNlRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKLXsKLQlGWF9JTlQzMiBuSGl0SW5kZXggPSB0aGlzLT5HZXRJdGVtSW5kZXgocG9pbnQpOworICAgICAgbV9uRm9vdEluZGV4ID0gbkhpdEluZGV4OworICAgIH0gZWxzZSBpZiAoYlNoaWZ0KSB7CisgICAgICBtX2FTZWxJdGVtcy5EZXNlbGVjdEFsbCgpOworICAgICAgbV9hU2VsSXRlbXMuQWRkKG1fbkZvb3RJbmRleCwgbkhpdEluZGV4KTsKKyAgICAgIFNlbGVjdEl0ZW1zKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fYVNlbEl0ZW1zLkRlc2VsZWN0QWxsKCk7CisgICAgICBtX2FTZWxJdGVtcy5BZGQobkhpdEluZGV4KTsKKyAgICAgIFNlbGVjdEl0ZW1zKCk7CiAKLQlpZiAoSXNNdWx0aXBsZVNlbCgpKQotCXsKLQkJaWYgKGJDdHJsKQotCQl7Ci0JCQlpZiAoSXNJdGVtU2VsZWN0ZWQobkhpdEluZGV4KSkKLQkJCXsKLQkJCQltX2FTZWxJdGVtcy5TdWIobkhpdEluZGV4KTsKLQkJCQlTZWxlY3RJdGVtcygpOwotCQkJCW1fYkN0cmxTZWwgPSBGQUxTRTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQltX2FTZWxJdGVtcy5BZGQobkhpdEluZGV4KTsKLQkJCQlTZWxlY3RJdGVtcygpOwotCQkJCW1fYkN0cmxTZWwgPSBUUlVFOwotCQkJfQkJCi0JCQkKLQkJCW1fbkZvb3RJbmRleCA9IG5IaXRJbmRleDsKLQkJfQotCQllbHNlIGlmIChiU2hpZnQpCi0JCXsKLQkJCW1fYVNlbEl0ZW1zLkRlc2VsZWN0QWxsKCk7Ci0JCQltX2FTZWxJdGVtcy5BZGQobV9uRm9vdEluZGV4LG5IaXRJbmRleCk7Ci0JCQlTZWxlY3RJdGVtcygpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJbV9hU2VsSXRlbXMuRGVzZWxlY3RBbGwoKTsKLQkJCW1fYVNlbEl0ZW1zLkFkZChuSGl0SW5kZXgpOwotCQkJU2VsZWN0SXRlbXMoKTsKLQotCQkJbV9uRm9vdEluZGV4ID0gbkhpdEluZGV4OwotCQl9CisgICAgICBtX25Gb290SW5kZXggPSBuSGl0SW5kZXg7CisgICAgfQogCi0JCVNldENhcmV0KG5IaXRJbmRleCk7Ci0JfQotCWVsc2UKLQl7Ci0JCVNldFNpbmdsZVNlbGVjdChuSGl0SW5kZXgpOwotCX0KKyAgICBTZXRDYXJldChuSGl0SW5kZXgpOworICB9IGVsc2UgeworICAgIFNldFNpbmdsZVNlbGVjdChuSGl0SW5kZXgpOworICB9CiAKLQlpZiAoIXRoaXMtPklzSXRlbVZpc2libGUobkhpdEluZGV4KSkKLQkJdGhpcy0+U2Nyb2xsVG9MaXN0SXRlbShuSGl0SW5kZXgpOworICBpZiAoIUlzSXRlbVZpc2libGUobkhpdEluZGV4KSkKKyAgICBTY3JvbGxUb0xpc3RJdGVtKG5IaXRJbmRleCk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKLXsKLQlGWF9JTlQzMiBuSGl0SW5kZXggPSB0aGlzLT5HZXRJdGVtSW5kZXgocG9pbnQpOwordm9pZCBDRlhfTGlzdEN0cmw6Ok9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkN0cmwpIHsKKyAgaW50MzJfdCBuSGl0SW5kZXggPSBHZXRJdGVtSW5kZXgocG9pbnQpOwogCi0JaWYgKElzTXVsdGlwbGVTZWwoKSkKLQl7CQkJCi0JCWlmIChiQ3RybCkKLQkJewotCQkJaWYgKG1fYkN0cmxTZWwpCi0JCQkJbV9hU2VsSXRlbXMuQWRkKG1fbkZvb3RJbmRleCxuSGl0SW5kZXgpOwotCQkJZWxzZQotCQkJCW1fYVNlbEl0ZW1zLlN1YihtX25Gb290SW5kZXgsbkhpdEluZGV4KTsJCQkKLQkJCQotCQkJU2VsZWN0SXRlbXMoKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCW1fYVNlbEl0ZW1zLkRlc2VsZWN0QWxsKCk7Ci0JCQltX2FTZWxJdGVtcy5BZGQobV9uRm9vdEluZGV4LG5IaXRJbmRleCk7Ci0JCQlTZWxlY3RJdGVtcygpOwotCQl9CisgIGlmIChJc011bHRpcGxlU2VsKCkpIHsKKyAgICBpZiAoYkN0cmwpIHsKKyAgICAgIGlmIChtX2JDdHJsU2VsKQorICAgICAgICBtX2FTZWxJdGVtcy5BZGQobV9uRm9vdEluZGV4LCBuSGl0SW5kZXgpOworICAgICAgZWxzZQorICAgICAgICBtX2FTZWxJdGVtcy5TdWIobV9uRm9vdEluZGV4LCBuSGl0SW5kZXgpOworCisgICAgICBTZWxlY3RJdGVtcygpOworICAgIH0gZWxzZSB7CisgICAgICBtX2FTZWxJdGVtcy5EZXNlbGVjdEFsbCgpOworICAgICAgbV9hU2VsSXRlbXMuQWRkKG1fbkZvb3RJbmRleCwgbkhpdEluZGV4KTsKKyAgICAgIFNlbGVjdEl0ZW1zKCk7CisgICAgfQogCi0JCVNldENhcmV0KG5IaXRJbmRleCk7Ci0JfQotCWVsc2UKLQl7Ci0JCVNldFNpbmdsZVNlbGVjdChuSGl0SW5kZXgpOwotCX0KKyAgICBTZXRDYXJldChuSGl0SW5kZXgpOworICB9IGVsc2UgeworICAgIFNldFNpbmdsZVNlbGVjdChuSGl0SW5kZXgpOworICB9CiAKLQlpZiAoIXRoaXMtPklzSXRlbVZpc2libGUobkhpdEluZGV4KSkKLQkJdGhpcy0+U2Nyb2xsVG9MaXN0SXRlbShuSGl0SW5kZXgpOworICBpZiAoIUlzSXRlbVZpc2libGUobkhpdEluZGV4KSkKKyAgICBTY3JvbGxUb0xpc3RJdGVtKG5IaXRJbmRleCk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpPblZLKEZYX0lOVDMyIG5JdGVtSW5kZXgsRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKLXsKLQlpZiAoSXNNdWx0aXBsZVNlbCgpKQotCXsKLQkJaWYgKG5JdGVtSW5kZXggPj0gMCAmJiBuSXRlbUluZGV4IDwgR2V0Q291bnQoKSkKLQkJewotCQkJaWYgKGJDdHJsKQotCQkJewotCQkJfQotCQkJZWxzZSBpZiAoYlNoaWZ0KQotCQkJewotCQkJCW1fYVNlbEl0ZW1zLkRlc2VsZWN0QWxsKCk7Ci0JCQkJbV9hU2VsSXRlbXMuQWRkKG1fbkZvb3RJbmRleCxuSXRlbUluZGV4KTsKLQkJCQlTZWxlY3RJdGVtcygpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCW1fYVNlbEl0ZW1zLkRlc2VsZWN0QWxsKCk7Ci0JCQkJbV9hU2VsSXRlbXMuQWRkKG5JdGVtSW5kZXgpOwotCQkJCVNlbGVjdEl0ZW1zKCk7Ci0JCQkJbV9uRm9vdEluZGV4ID0gbkl0ZW1JbmRleDsKLQkJCX0KK3ZvaWQgQ0ZYX0xpc3RDdHJsOjpPblZLKGludDMyX3Qgbkl0ZW1JbmRleCwgRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpIHsKKyAgaWYgKElzTXVsdGlwbGVTZWwoKSkgeworICAgIGlmIChuSXRlbUluZGV4ID49IDAgJiYgbkl0ZW1JbmRleCA8IEdldENvdW50KCkpIHsKKyAgICAgIGlmIChiQ3RybCkgeworICAgICAgfSBlbHNlIGlmIChiU2hpZnQpIHsKKyAgICAgICAgbV9hU2VsSXRlbXMuRGVzZWxlY3RBbGwoKTsKKyAgICAgICAgbV9hU2VsSXRlbXMuQWRkKG1fbkZvb3RJbmRleCwgbkl0ZW1JbmRleCk7CisgICAgICAgIFNlbGVjdEl0ZW1zKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBtX2FTZWxJdGVtcy5EZXNlbGVjdEFsbCgpOworICAgICAgICBtX2FTZWxJdGVtcy5BZGQobkl0ZW1JbmRleCk7CisgICAgICAgIFNlbGVjdEl0ZW1zKCk7CisgICAgICAgIG1fbkZvb3RJbmRleCA9IG5JdGVtSW5kZXg7CisgICAgICB9CiAKLQkJCVNldENhcmV0KG5JdGVtSW5kZXgpOwkKLQkJfQotCX0KLQllbHNlCi0JewotCQlTZXRTaW5nbGVTZWxlY3Qobkl0ZW1JbmRleCk7Ci0JfQorICAgICAgU2V0Q2FyZXQobkl0ZW1JbmRleCk7CisgICAgfQorICB9IGVsc2UgeworICAgIFNldFNpbmdsZVNlbGVjdChuSXRlbUluZGV4KTsKKyAgfQogCi0JaWYgKCF0aGlzLT5Jc0l0ZW1WaXNpYmxlKG5JdGVtSW5kZXgpKQotCQl0aGlzLT5TY3JvbGxUb0xpc3RJdGVtKG5JdGVtSW5kZXgpOworICBpZiAoIUlzSXRlbVZpc2libGUobkl0ZW1JbmRleCkpCisgICAgU2Nyb2xsVG9MaXN0SXRlbShuSXRlbUluZGV4KTsKIH0KIAotdm9pZCBDRlhfTGlzdEN0cmw6Ok9uVktfVVAoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKLXsKLQlPblZLKElzTXVsdGlwbGVTZWwoKSA/IEdldENhcmV0KCktMSA6IEdldFNlbGVjdCgpLTEsIGJTaGlmdCwgYkN0cmwpOwordm9pZCBDRlhfTGlzdEN0cmw6Ok9uVktfVVAoRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpIHsKKyAgT25WSyhJc011bHRpcGxlU2VsKCkgPyBHZXRDYXJldCgpIC0gMSA6IEdldFNlbGVjdCgpIC0gMSwgYlNoaWZ0LCBiQ3RybCk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpPblZLX0RPV04oRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKLXsKLQlPblZLKElzTXVsdGlwbGVTZWwoKSA/IEdldENhcmV0KCkrMSA6IEdldFNlbGVjdCgpKzEsIGJTaGlmdCwgYkN0cmwpOwordm9pZCBDRlhfTGlzdEN0cmw6Ok9uVktfRE9XTihGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgeworICBPblZLKElzTXVsdGlwbGVTZWwoKSA/IEdldENhcmV0KCkgKyAxIDogR2V0U2VsZWN0KCkgKyAxLCBiU2hpZnQsIGJDdHJsKTsKIH0KIAotdm9pZCBDRlhfTGlzdEN0cmw6Ok9uVktfTEVGVChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQotewotCU9uVksoMCwgYlNoaWZ0LCBiQ3RybCk7Cit2b2lkIENGWF9MaXN0Q3RybDo6T25WS19MRUZUKEZYX0JPT0wgYlNoaWZ0LCBGWF9CT09MIGJDdHJsKSB7CisgIE9uVksoMCwgYlNoaWZ0LCBiQ3RybCk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpPblZLX1JJR0hUKEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCi17Ci0JT25WSyhHZXRDb3VudCgpLTEsIGJTaGlmdCwgYkN0cmwpOwordm9pZCBDRlhfTGlzdEN0cmw6Ok9uVktfUklHSFQoRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpIHsKKyAgT25WSyhHZXRDb3VudCgpIC0gMSwgYlNoaWZ0LCBiQ3RybCk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpPblZLX0hPTUUoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKLXsKLQlPblZLKDAsIGJTaGlmdCwgYkN0cmwpOwordm9pZCBDRlhfTGlzdEN0cmw6Ok9uVktfSE9NRShGWF9CT09MIGJTaGlmdCwgRlhfQk9PTCBiQ3RybCkgeworICBPblZLKDAsIGJTaGlmdCwgYkN0cmwpOwogfQogCi12b2lkIENGWF9MaXN0Q3RybDo6T25WS19FTkQoRlhfQk9PTCBiU2hpZnQsRlhfQk9PTCBiQ3RybCkKLXsKLQlPblZLKEdldENvdW50KCktMSwgYlNoaWZ0LCBiQ3RybCk7Cit2b2lkIENGWF9MaXN0Q3RybDo6T25WS19FTkQoRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpIHsKKyAgT25WSyhHZXRDb3VudCgpIC0gMSwgYlNoaWZ0LCBiQ3RybCk7CiB9CiAKLUZYX0JPT0wJQ0ZYX0xpc3RDdHJsOjpPbkNoYXIoRlhfV09SRCBuQ2hhcixGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQotewotCUZYX0lOVDMyIG5JbmRleCA9IEdldExhc3RTZWxlY3RlZCgpOwkKLQlGWF9JTlQzMiBuRmluZEluZGV4ID0gRmluZE5leHQobkluZGV4LG5DaGFyKTsKK0ZYX0JPT0wgQ0ZYX0xpc3RDdHJsOjpPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpIHsKKyAgaW50MzJfdCBuSW5kZXggPSBHZXRMYXN0U2VsZWN0ZWQoKTsKKyAgaW50MzJfdCBuRmluZEluZGV4ID0gRmluZE5leHQobkluZGV4LCBuQ2hhcik7CiAKLQlpZiAobkZpbmRJbmRleCAhPSBuSW5kZXgpCi0JewotCQlPblZLKG5GaW5kSW5kZXgsIGJTaGlmdCwgYkN0cmwpOwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JcmV0dXJuIEZBTFNFOworICBpZiAobkZpbmRJbmRleCAhPSBuSW5kZXgpIHsKKyAgICBPblZLKG5GaW5kSW5kZXgsIGJTaGlmdCwgYkN0cmwpOworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KIAotLyogLS0tLS0tLS0gaW5uZXIgbWV0aG9kcyAtLS0tLS0tICovCi0KLXZvaWQgQ0ZYX0xpc3RDdHJsOjpTZXRQbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkKLXsKLQlDRlhfTGlzdENvbnRhaW5lcjo6U2V0UGxhdGVSZWN0KHJlY3QpOwotCW1fcHRTY3JvbGxQb3MueCA9IHJlY3QubGVmdDsKLQlTZXRTY3JvbGxQb3MoQ1BERl9Qb2ludChyZWN0LmxlZnQscmVjdC50b3ApKTsJCi0JUmVBcnJhbmdlKDApOwotCUludmFsaWRhdGVJdGVtKC0xKTsKK3ZvaWQgQ0ZYX0xpc3RDdHJsOjpTZXRQbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0JiByZWN0KSB7CisgIENGWF9MaXN0Q29udGFpbmVyOjpTZXRQbGF0ZVJlY3QocmVjdCk7CisgIG1fcHRTY3JvbGxQb3MueCA9IHJlY3QubGVmdDsKKyAgU2V0U2Nyb2xsUG9zKENQREZfUG9pbnQocmVjdC5sZWZ0LCByZWN0LnRvcCkpOworICBSZUFycmFuZ2UoMCk7CisgIEludmFsaWRhdGVJdGVtKC0xKTsKIH0KIAotQ1BERl9SZWN0IENGWF9MaXN0Q3RybDo6R2V0SXRlbVJlY3QoRlhfSU5UMzIgbkluZGV4KSBjb25zdAotewotCXJldHVybiBJblRvT3V0KENGWF9MaXN0OjpHZXRJdGVtUmVjdChuSW5kZXgpKTsKK0NQREZfUmVjdCBDRlhfTGlzdEN0cmw6OkdldEl0ZW1SZWN0KGludDMyX3QgbkluZGV4KSBjb25zdCB7CisgIHJldHVybiBJblRvT3V0KENGWF9MaXN0OjpHZXRJdGVtUmVjdChuSW5kZXgpKTsKIH0KIAotdm9pZCBDRlhfTGlzdEN0cmw6OkFkZFN0cmluZyhGWF9MUENXU1RSIHN0cmluZykKLXsKLQlBZGRJdGVtKHN0cmluZyk7Ci0JUmVBcnJhbmdlKEdldENvdW50KCkgLSAxKTsKK3ZvaWQgQ0ZYX0xpc3RDdHJsOjpBZGRTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHN0cmluZykgeworICBBZGRJdGVtKHN0cmluZyk7CisgIFJlQXJyYW5nZShHZXRDb3VudCgpIC0gMSk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpTZXRNdWx0aXBsZVNlbGVjdChGWF9JTlQzMiBuSXRlbUluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCkKLXsKLQlpZiAoIUlzVmFsaWQobkl0ZW1JbmRleCkpIHJldHVybjsKK3ZvaWQgQ0ZYX0xpc3RDdHJsOjpTZXRNdWx0aXBsZVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkKSB7CisgIGlmICghSXNWYWxpZChuSXRlbUluZGV4KSkKKyAgICByZXR1cm47CiAKLQlpZiAoYlNlbGVjdGVkICE9IHRoaXMtPklzSXRlbVNlbGVjdGVkKG5JdGVtSW5kZXgpKQotCXsKLQkJaWYgKGJTZWxlY3RlZCkKLQkJewotCQkJU2V0SXRlbVNlbGVjdChuSXRlbUluZGV4LFRSVUUpOwotCQkJSW52YWxpZGF0ZUl0ZW0obkl0ZW1JbmRleCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlTZXRJdGVtU2VsZWN0KG5JdGVtSW5kZXgsRkFMU0UpOwotCQkJSW52YWxpZGF0ZUl0ZW0obkl0ZW1JbmRleCk7Ci0JCX0KLQl9CisgIGlmIChiU2VsZWN0ZWQgIT0gSXNJdGVtU2VsZWN0ZWQobkl0ZW1JbmRleCkpIHsKKyAgICBpZiAoYlNlbGVjdGVkKSB7CisgICAgICBTZXRJdGVtU2VsZWN0KG5JdGVtSW5kZXgsIFRSVUUpOworICAgICAgSW52YWxpZGF0ZUl0ZW0obkl0ZW1JbmRleCk7CisgICAgfSBlbHNlIHsKKyAgICAgIFNldEl0ZW1TZWxlY3Qobkl0ZW1JbmRleCwgRkFMU0UpOworICAgICAgSW52YWxpZGF0ZUl0ZW0obkl0ZW1JbmRleCk7CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpTZXRTaW5nbGVTZWxlY3QoRlhfSU5UMzIgbkl0ZW1JbmRleCkKLXsKLQlpZiAoIUlzVmFsaWQobkl0ZW1JbmRleCkpIHJldHVybjsKK3ZvaWQgQ0ZYX0xpc3RDdHJsOjpTZXRTaW5nbGVTZWxlY3QoaW50MzJfdCBuSXRlbUluZGV4KSB7CisgIGlmICghSXNWYWxpZChuSXRlbUluZGV4KSkKKyAgICByZXR1cm47CiAKLQlpZiAobV9uU2VsSXRlbSAhPSBuSXRlbUluZGV4KQotCXsKLQkJaWYgKG1fblNlbEl0ZW0gPj0gMCkKLQkJewotCQkJU2V0SXRlbVNlbGVjdChtX25TZWxJdGVtLEZBTFNFKTsKLQkJCUludmFsaWRhdGVJdGVtKG1fblNlbEl0ZW0pOwotCQl9Ci0JCQotCQlTZXRJdGVtU2VsZWN0KG5JdGVtSW5kZXgsVFJVRSk7Ci0JCUludmFsaWRhdGVJdGVtKG5JdGVtSW5kZXgpOwotCQltX25TZWxJdGVtID0gbkl0ZW1JbmRleDsJCQotCX0KKyAgaWYgKG1fblNlbEl0ZW0gIT0gbkl0ZW1JbmRleCkgeworICAgIGlmIChtX25TZWxJdGVtID49IDApIHsKKyAgICAgIFNldEl0ZW1TZWxlY3QobV9uU2VsSXRlbSwgRkFMU0UpOworICAgICAgSW52YWxpZGF0ZUl0ZW0obV9uU2VsSXRlbSk7CisgICAgfQorCisgICAgU2V0SXRlbVNlbGVjdChuSXRlbUluZGV4LCBUUlVFKTsKKyAgICBJbnZhbGlkYXRlSXRlbShuSXRlbUluZGV4KTsKKyAgICBtX25TZWxJdGVtID0gbkl0ZW1JbmRleDsKKyAgfQogfQogCi12b2lkIENGWF9MaXN0Q3RybDo6U2V0Q2FyZXQoRlhfSU5UMzIgbkl0ZW1JbmRleCkKLXsKLQlpZiAoIUlzVmFsaWQobkl0ZW1JbmRleCkpIHJldHVybjsKK3ZvaWQgQ0ZYX0xpc3RDdHJsOjpTZXRDYXJldChpbnQzMl90IG5JdGVtSW5kZXgpIHsKKyAgaWYgKCFJc1ZhbGlkKG5JdGVtSW5kZXgpKQorICAgIHJldHVybjsKIAotCWlmICh0aGlzLT5Jc011bHRpcGxlU2VsKCkpCi0JewkJCi0JCUZYX0lOVDMyIG5PbGRJbmRleCA9IG1fbkNhcmV0SW5kZXg7CisgIGlmIChJc011bHRpcGxlU2VsKCkpIHsKKyAgICBpbnQzMl90IG5PbGRJbmRleCA9IG1fbkNhcmV0SW5kZXg7CiAKLQkJaWYgKG5PbGRJbmRleCAhPSBuSXRlbUluZGV4KQotCQl7Ci0JCQltX25DYXJldEluZGV4ID0gbkl0ZW1JbmRleDsKKyAgICBpZiAobk9sZEluZGV4ICE9IG5JdGVtSW5kZXgpIHsKKyAgICAgIG1fbkNhcmV0SW5kZXggPSBuSXRlbUluZGV4OwogCi0JCQlTZXRJdGVtQ2FyZXQobk9sZEluZGV4LCBGQUxTRSk7Ci0JCQlTZXRJdGVtQ2FyZXQobkl0ZW1JbmRleCxUUlVFKTsKKyAgICAgIFNldEl0ZW1DYXJldChuT2xkSW5kZXgsIEZBTFNFKTsKKyAgICAgIFNldEl0ZW1DYXJldChuSXRlbUluZGV4LCBUUlVFKTsKIAotCQkJSW52YWxpZGF0ZUl0ZW0obk9sZEluZGV4KTsKLQkJCUludmFsaWRhdGVJdGVtKG5JdGVtSW5kZXgpOwkJCQotCQl9Ci0JfQorICAgICAgSW52YWxpZGF0ZUl0ZW0obk9sZEluZGV4KTsKKyAgICAgIEludmFsaWRhdGVJdGVtKG5JdGVtSW5kZXgpOworICAgIH0KKyAgfQogfQogCi12b2lkIENGWF9MaXN0Q3RybDo6SW52YWxpZGF0ZUl0ZW0oRlhfSU5UMzIgbkl0ZW1JbmRleCkKLXsKLQlpZiAobV9wTm90aWZ5KQotCXsKLQkJaWYgKG5JdGVtSW5kZXggPT0gLTEpCi0JCXsKLQkJCWlmICghbV9iTm90aWZ5RmxhZykKLQkJCXsKLQkJCQltX2JOb3RpZnlGbGFnID0gVFJVRTsKLQkJCQlDUERGX1JlY3QgcmNSZWZyZXNoID0gR2V0UGxhdGVSZWN0KCk7Ci0JCQkJbV9wTm90aWZ5LT5JT25JbnZhbGlkYXRlUmVjdCgmcmNSZWZyZXNoKTsKLQkJCQltX2JOb3RpZnlGbGFnID0gRkFMU0U7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoIW1fYk5vdGlmeUZsYWcpCi0JCQl7Ci0JCQkJbV9iTm90aWZ5RmxhZyA9IFRSVUU7Ci0JCQkJQ1BERl9SZWN0IHJjUmVmcmVzaCA9IEdldEl0ZW1SZWN0KG5JdGVtSW5kZXgpOwotCQkJCXJjUmVmcmVzaC5sZWZ0IC09IDEuMGY7Ci0JCQkJcmNSZWZyZXNoLnJpZ2h0ICs9IDEuMGY7Ci0JCQkJcmNSZWZyZXNoLmJvdHRvbSAtPSAxLjBmOwotCQkJCXJjUmVmcmVzaC50b3AgKz0gMS4wZjsKK3ZvaWQgQ0ZYX0xpc3RDdHJsOjpJbnZhbGlkYXRlSXRlbShpbnQzMl90IG5JdGVtSW5kZXgpIHsKKyAgaWYgKG1fcE5vdGlmeSkgeworICAgIGlmIChuSXRlbUluZGV4ID09IC0xKSB7CisgICAgICBpZiAoIW1fYk5vdGlmeUZsYWcpIHsKKyAgICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7CisgICAgICAgIENQREZfUmVjdCByY1JlZnJlc2ggPSBHZXRQbGF0ZVJlY3QoKTsKKyAgICAgICAgbV9wTm90aWZ5LT5JT25JbnZhbGlkYXRlUmVjdCgmcmNSZWZyZXNoKTsKKyAgICAgICAgbV9iTm90aWZ5RmxhZyA9IEZBTFNFOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoIW1fYk5vdGlmeUZsYWcpIHsKKyAgICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7CisgICAgICAgIENQREZfUmVjdCByY1JlZnJlc2ggPSBHZXRJdGVtUmVjdChuSXRlbUluZGV4KTsKKyAgICAgICAgcmNSZWZyZXNoLmxlZnQgLT0gMS4wZjsKKyAgICAgICAgcmNSZWZyZXNoLnJpZ2h0ICs9IDEuMGY7CisgICAgICAgIHJjUmVmcmVzaC5ib3R0b20gLT0gMS4wZjsKKyAgICAgICAgcmNSZWZyZXNoLnRvcCArPSAxLjBmOwogCi0JCQkJbV9wTm90aWZ5LT5JT25JbnZhbGlkYXRlUmVjdCgmcmNSZWZyZXNoKTsKLQkJCQltX2JOb3RpZnlGbGFnID0gRkFMU0U7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgIG1fcE5vdGlmeS0+SU9uSW52YWxpZGF0ZVJlY3QoJnJjUmVmcmVzaCk7CisgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisgIH0KIH0KIAotdm9pZCBDRlhfTGlzdEN0cmw6OlNlbGVjdEl0ZW1zKCkKLXsKLQlmb3IgKEZYX0lOVDMyIGk9MCxzej1tX2FTZWxJdGVtcy5HZXRDb3VudCgpOyBpPHN6OyBpKyspCi0JewotCQlGWF9JTlQzMiBuSXRlbUluZGV4ID0gbV9hU2VsSXRlbXMuR2V0SXRlbUluZGV4KGkpOwotCQlGWF9JTlQzMiBuU3RhdGUgPSBtX2FTZWxJdGVtcy5HZXRTdGF0ZShpKTsKK3ZvaWQgQ0ZYX0xpc3RDdHJsOjpTZWxlY3RJdGVtcygpIHsKKyAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYVNlbEl0ZW1zLkdldENvdW50KCk7IGkgPCBzejsgaSsrKSB7CisgICAgaW50MzJfdCBuSXRlbUluZGV4ID0gbV9hU2VsSXRlbXMuR2V0SXRlbUluZGV4KGkpOworICAgIGludDMyX3QgblN0YXRlID0gbV9hU2VsSXRlbXMuR2V0U3RhdGUoaSk7CiAKLQkJc3dpdGNoKG5TdGF0ZSkKLQkJewotCQljYXNlIDE6Ci0JCQlTZXRNdWx0aXBsZVNlbGVjdChuSXRlbUluZGV4LCBUUlVFKTsJCQkKLQkJCWJyZWFrOwotCQljYXNlIC0xOgotCQkJU2V0TXVsdGlwbGVTZWxlY3Qobkl0ZW1JbmRleCwgRkFMU0UpOwotCQkJYnJlYWs7Ci0JCX0KLQl9CisgICAgc3dpdGNoIChuU3RhdGUpIHsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgU2V0TXVsdGlwbGVTZWxlY3Qobkl0ZW1JbmRleCwgVFJVRSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAtMToKKyAgICAgICAgU2V0TXVsdGlwbGVTZWxlY3Qobkl0ZW1JbmRleCwgRkFMU0UpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KIAotCW1fYVNlbEl0ZW1zLkRvbmUoKTsKKyAgbV9hU2VsSXRlbXMuRG9uZSgpOwogfQogCi12b2lkIENGWF9MaXN0Q3RybDo6U2VsZWN0KEZYX0lOVDMyIG5JdGVtSW5kZXgpCi17Ci0JaWYgKCFJc1ZhbGlkKG5JdGVtSW5kZXgpKSByZXR1cm47Cit2b2lkIENGWF9MaXN0Q3RybDo6U2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCkgeworICBpZiAoIUlzVmFsaWQobkl0ZW1JbmRleCkpCisgICAgcmV0dXJuOwogCi0JaWYgKHRoaXMtPklzTXVsdGlwbGVTZWwoKSkKLQl7Ci0JCW1fYVNlbEl0ZW1zLkFkZChuSXRlbUluZGV4KTsKLQkJU2VsZWN0SXRlbXMoKTsKLQl9Ci0JZWxzZQotCQlTZXRTaW5nbGVTZWxlY3Qobkl0ZW1JbmRleCk7CisgIGlmIChJc011bHRpcGxlU2VsKCkpIHsKKyAgICBtX2FTZWxJdGVtcy5BZGQobkl0ZW1JbmRleCk7CisgICAgU2VsZWN0SXRlbXMoKTsKKyAgfSBlbHNlIHsKKyAgICBTZXRTaW5nbGVTZWxlY3Qobkl0ZW1JbmRleCk7CisgIH0KIH0KIAotRlhfQk9PTAlDRlhfTGlzdEN0cmw6OklzSXRlbVZpc2libGUoRlhfSU5UMzIgbkl0ZW1JbmRleCkgY29uc3QKLXsKLQlDUERGX1JlY3QgcmNQbGF0ZSA9IHRoaXMtPkdldFBsYXRlUmVjdCgpOwotCUNQREZfUmVjdCByY0l0ZW0gPSB0aGlzLT5HZXRJdGVtUmVjdChuSXRlbUluZGV4KTsKK0ZYX0JPT0wgQ0ZYX0xpc3RDdHJsOjpJc0l0ZW1WaXNpYmxlKGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3QgeworICBDUERGX1JlY3QgcmNQbGF0ZSA9IEdldFBsYXRlUmVjdCgpOworICBDUERGX1JlY3QgcmNJdGVtID0gR2V0SXRlbVJlY3Qobkl0ZW1JbmRleCk7CiAKLQlyZXR1cm4gcmNJdGVtLmJvdHRvbSA+PSByY1BsYXRlLmJvdHRvbSAmJiByY0l0ZW0udG9wIDw9IHJjUGxhdGUudG9wOworICByZXR1cm4gcmNJdGVtLmJvdHRvbSA+PSByY1BsYXRlLmJvdHRvbSAmJiByY0l0ZW0udG9wIDw9IHJjUGxhdGUudG9wOwogfQogCi12b2lkIENGWF9MaXN0Q3RybDo6U2Nyb2xsVG9MaXN0SXRlbShGWF9JTlQzMiBuSXRlbUluZGV4KQotewotCWlmICghSXNWYWxpZChuSXRlbUluZGV4KSkgcmV0dXJuOwordm9pZCBDRlhfTGlzdEN0cmw6OlNjcm9sbFRvTGlzdEl0ZW0oaW50MzJfdCBuSXRlbUluZGV4KSB7CisgIGlmICghSXNWYWxpZChuSXRlbUluZGV4KSkKKyAgICByZXR1cm47CiAKLQlDUERGX1JlY3QgcmNQbGF0ZSA9IHRoaXMtPkdldFBsYXRlUmVjdCgpOwotCUNQREZfUmVjdCByY0l0ZW0gPSBDRlhfTGlzdDo6R2V0SXRlbVJlY3Qobkl0ZW1JbmRleCk7Ci0JQ1BERl9SZWN0IHJjSXRlbUN0cmwgPSBHZXRJdGVtUmVjdChuSXRlbUluZGV4KTsKKyAgQ1BERl9SZWN0IHJjUGxhdGUgPSBHZXRQbGF0ZVJlY3QoKTsKKyAgQ1BERl9SZWN0IHJjSXRlbSA9IENGWF9MaXN0OjpHZXRJdGVtUmVjdChuSXRlbUluZGV4KTsKKyAgQ1BERl9SZWN0IHJjSXRlbUN0cmwgPSBHZXRJdGVtUmVjdChuSXRlbUluZGV4KTsKIAotCWlmIChGWF9FRElUX0lzRmxvYXRTbWFsbGVyKHJjSXRlbUN0cmwuYm90dG9tLCByY1BsYXRlLmJvdHRvbSkpCi0JewotCQlpZiAoRlhfRURJVF9Jc0Zsb2F0U21hbGxlcihyY0l0ZW1DdHJsLnRvcCwgcmNQbGF0ZS50b3ApKQotCQl7Ci0JCQlTZXRTY3JvbGxQb3NZKHJjSXRlbS5ib3R0b20gKyByY1BsYXRlLkhlaWdodCgpKTsKLQkJfQotCX0KLQllbHNlIGlmIChGWF9FRElUX0lzRmxvYXRCaWdnZXIocmNJdGVtQ3RybC50b3AsIHJjUGxhdGUudG9wKSkKLQl7Ci0JCWlmIChGWF9FRElUX0lzRmxvYXRCaWdnZXIocmNJdGVtQ3RybC5ib3R0b20sIHJjUGxhdGUuYm90dG9tKSkKLQkJewotCQkJU2V0U2Nyb2xsUG9zWShyY0l0ZW0udG9wKTsKLQkJfQotCX0KKyAgaWYgKEZYX0VESVRfSXNGbG9hdFNtYWxsZXIocmNJdGVtQ3RybC5ib3R0b20sIHJjUGxhdGUuYm90dG9tKSkgeworICAgIGlmIChGWF9FRElUX0lzRmxvYXRTbWFsbGVyKHJjSXRlbUN0cmwudG9wLCByY1BsYXRlLnRvcCkpIHsKKyAgICAgIFNldFNjcm9sbFBvc1kocmNJdGVtLmJvdHRvbSArIHJjUGxhdGUuSGVpZ2h0KCkpOworICAgIH0KKyAgfSBlbHNlIGlmIChGWF9FRElUX0lzRmxvYXRCaWdnZXIocmNJdGVtQ3RybC50b3AsIHJjUGxhdGUudG9wKSkgeworICAgIGlmIChGWF9FRElUX0lzRmxvYXRCaWdnZXIocmNJdGVtQ3RybC5ib3R0b20sIHJjUGxhdGUuYm90dG9tKSkgeworICAgICAgU2V0U2Nyb2xsUG9zWShyY0l0ZW0udG9wKTsKKyAgICB9CisgIH0KIH0KIAotdm9pZCBDRlhfTGlzdEN0cmw6OlNldFNjcm9sbEluZm8oKQotewotCWlmIChtX3BOb3RpZnkpCi0JewotCQlDUERGX1JlY3QgcmNQbGF0ZSA9IEdldFBsYXRlUmVjdCgpOwotCQlDUERGX1JlY3QgcmNDb250ZW50ID0gQ0ZYX0xpc3Q6OkdldENvbnRlbnRSZWN0KCk7Cit2b2lkIENGWF9MaXN0Q3RybDo6U2V0U2Nyb2xsSW5mbygpIHsKKyAgaWYgKG1fcE5vdGlmeSkgeworICAgIENQREZfUmVjdCByY1BsYXRlID0gR2V0UGxhdGVSZWN0KCk7CisgICAgQ1BERl9SZWN0IHJjQ29udGVudCA9IENGWF9MaXN0OjpHZXRDb250ZW50UmVjdCgpOwogCi0JCWlmICghbV9iTm90aWZ5RmxhZykKLQkJewotCQkJbV9iTm90aWZ5RmxhZyA9IFRSVUU7Ci0JCQltX3BOb3RpZnktPklPblNldFNjcm9sbEluZm9ZKHJjUGxhdGUuYm90dG9tLCByY1BsYXRlLnRvcCwgCi0JCQkJCXJjQ29udGVudC5ib3R0b20sIHJjQ29udGVudC50b3AsIEdldEZpcnN0SGVpZ2h0KCksIHJjUGxhdGUuSGVpZ2h0KCkpOwotCQkJbV9iTm90aWZ5RmxhZyA9IEZBTFNFOwotCQl9Ci0JfQorICAgIGlmICghbV9iTm90aWZ5RmxhZykgeworICAgICAgbV9iTm90aWZ5RmxhZyA9IFRSVUU7CisgICAgICBtX3BOb3RpZnktPklPblNldFNjcm9sbEluZm9ZKHJjUGxhdGUuYm90dG9tLCByY1BsYXRlLnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDb250ZW50LmJvdHRvbSwgcmNDb250ZW50LnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Rmlyc3RIZWlnaHQoKSwgcmNQbGF0ZS5IZWlnaHQoKSk7CisgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpTZXRTY3JvbGxQb3MoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KQotewotCVNldFNjcm9sbFBvc1kocG9pbnQueSk7Cit2b2lkIENGWF9MaXN0Q3RybDo6U2V0U2Nyb2xsUG9zKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIFNldFNjcm9sbFBvc1kocG9pbnQueSk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpTZXRTY3JvbGxQb3NZKEZYX0ZMT0FUIGZ5KQotewotCWlmICghRlhfRURJVF9Jc0Zsb2F0RXF1YWwobV9wdFNjcm9sbFBvcy55LGZ5KSkKLQl7Ci0JCUNQREZfUmVjdCByY1BsYXRlID0gdGhpcy0+R2V0UGxhdGVSZWN0KCk7Ci0JCUNQREZfUmVjdCByY0NvbnRlbnQgPSBDRlhfTGlzdDo6R2V0Q29udGVudFJlY3QoKTsKK3ZvaWQgQ0ZYX0xpc3RDdHJsOjpTZXRTY3JvbGxQb3NZKEZYX0ZMT0FUIGZ5KSB7CisgIGlmICghRlhfRURJVF9Jc0Zsb2F0RXF1YWwobV9wdFNjcm9sbFBvcy55LCBmeSkpIHsKKyAgICBDUERGX1JlY3QgcmNQbGF0ZSA9IEdldFBsYXRlUmVjdCgpOworICAgIENQREZfUmVjdCByY0NvbnRlbnQgPSBDRlhfTGlzdDo6R2V0Q29udGVudFJlY3QoKTsKIAotCQlpZiAocmNQbGF0ZS5IZWlnaHQoKSA+IHJjQ29udGVudC5IZWlnaHQoKSkKLQkJewotCQkJZnkgPSByY1BsYXRlLnRvcDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChGWF9FRElUX0lzRmxvYXRTbWFsbGVyKGZ5IC0gcmNQbGF0ZS5IZWlnaHQoKSwgcmNDb250ZW50LmJvdHRvbSkpCi0JCQl7Ci0JCQkJZnkgPSByY0NvbnRlbnQuYm90dG9tICsgcmNQbGF0ZS5IZWlnaHQoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKEZYX0VESVRfSXNGbG9hdEJpZ2dlcihmeSwgcmNDb250ZW50LnRvcCkpCi0JCQl7Ci0JCQkJZnkgPSByY0NvbnRlbnQudG9wOwotCQkJfQotCQl9CisgICAgaWYgKHJjUGxhdGUuSGVpZ2h0KCkgPiByY0NvbnRlbnQuSGVpZ2h0KCkpIHsKKyAgICAgIGZ5ID0gcmNQbGF0ZS50b3A7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChGWF9FRElUX0lzRmxvYXRTbWFsbGVyKGZ5IC0gcmNQbGF0ZS5IZWlnaHQoKSwgcmNDb250ZW50LmJvdHRvbSkpIHsKKyAgICAgICAgZnkgPSByY0NvbnRlbnQuYm90dG9tICsgcmNQbGF0ZS5IZWlnaHQoKTsKKyAgICAgIH0gZWxzZSBpZiAoRlhfRURJVF9Jc0Zsb2F0QmlnZ2VyKGZ5LCByY0NvbnRlbnQudG9wKSkgeworICAgICAgICBmeSA9IHJjQ29udGVudC50b3A7CisgICAgICB9CisgICAgfQogCi0JCW1fcHRTY3JvbGxQb3MueSA9IGZ5OwotCQlJbnZhbGlkYXRlSXRlbSgtMSk7CisgICAgbV9wdFNjcm9sbFBvcy55ID0gZnk7CisgICAgSW52YWxpZGF0ZUl0ZW0oLTEpOwogCi0JCWlmIChtX3BOb3RpZnkpIAotCQl7Ci0JCQlpZiAoIW1fYk5vdGlmeUZsYWcpCi0JCQl7Ci0JCQkJbV9iTm90aWZ5RmxhZyA9IFRSVUU7Ci0JCQkJbV9wTm90aWZ5LT5JT25TZXRTY3JvbGxQb3NZKGZ5KTsKLQkJCQltX2JOb3RpZnlGbGFnID0gRkFMU0U7Ci0JCQl9Ci0JCX0KLQl9CisgICAgaWYgKG1fcE5vdGlmeSkgeworICAgICAgaWYgKCFtX2JOb3RpZnlGbGFnKSB7CisgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBUUlVFOworICAgICAgICBtX3BOb3RpZnktPklPblNldFNjcm9sbFBvc1koZnkpOworICAgICAgICBtX2JOb3RpZnlGbGFnID0gRkFMU0U7CisgICAgICB9CisgICAgfQorICB9CiB9CiAKLUNQREZfUmVjdCBDRlhfTGlzdEN0cmw6OkdldENvbnRlbnRSZWN0KCkgY29uc3QKLXsKLQlyZXR1cm4gSW5Ub091dChDRlhfTGlzdDo6R2V0Q29udGVudFJlY3QoKSk7CitDUERGX1JlY3QgQ0ZYX0xpc3RDdHJsOjpHZXRDb250ZW50UmVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIEluVG9PdXQoQ0ZYX0xpc3Q6OkdldENvbnRlbnRSZWN0KCkpOwogfQogCi12b2lkIENGWF9MaXN0Q3RybDo6UmVBcnJhbmdlKEZYX0lOVDMyIG5JdGVtSW5kZXgpCi17Ci0JQ0ZYX0xpc3Q6OlJlQXJyYW5nZShuSXRlbUluZGV4KTsKLQlTZXRTY3JvbGxJbmZvKCk7Cit2b2lkIENGWF9MaXN0Q3RybDo6UmVBcnJhbmdlKGludDMyX3Qgbkl0ZW1JbmRleCkgeworICBDRlhfTGlzdDo6UmVBcnJhbmdlKG5JdGVtSW5kZXgpOworICBTZXRTY3JvbGxJbmZvKCk7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpTZXRUb3BJdGVtKEZYX0lOVDMyIG5JbmRleCkKLXsKLQlpZiAoSXNWYWxpZChuSW5kZXgpKQotCXsKLQkJdGhpcy0+R2V0UGxhdGVSZWN0KCk7Ci0JCUNQREZfUmVjdCByY0l0ZW0gPSBDRlhfTGlzdDo6R2V0SXRlbVJlY3QobkluZGV4KTsKLQkJU2V0U2Nyb2xsUG9zWShyY0l0ZW0udG9wKTsKLQl9Cit2b2lkIENGWF9MaXN0Q3RybDo6U2V0VG9wSXRlbShpbnQzMl90IG5JbmRleCkgeworICBpZiAoSXNWYWxpZChuSW5kZXgpKSB7CisgICAgR2V0UGxhdGVSZWN0KCk7CisgICAgQ1BERl9SZWN0IHJjSXRlbSA9IENGWF9MaXN0OjpHZXRJdGVtUmVjdChuSW5kZXgpOworICAgIFNldFNjcm9sbFBvc1kocmNJdGVtLnRvcCk7CisgIH0KIH0KIAotRlhfSU5UMzIgQ0ZYX0xpc3RDdHJsOjpHZXRUb3BJdGVtKCkgY29uc3QKLXsKLQlGWF9JTlQzMiBuSXRlbUluZGV4ID0gdGhpcy0+R2V0SXRlbUluZGV4KHRoaXMtPkdldEJUUG9pbnQoKSk7CitpbnQzMl90IENGWF9MaXN0Q3RybDo6R2V0VG9wSXRlbSgpIGNvbnN0IHsKKyAgaW50MzJfdCBuSXRlbUluZGV4ID0gR2V0SXRlbUluZGV4KEdldEJUUG9pbnQoKSk7CiAKLQlpZiAoIUlzSXRlbVZpc2libGUobkl0ZW1JbmRleCkgJiYgSXNJdGVtVmlzaWJsZShuSXRlbUluZGV4ICsgMSkpCi0JCQluSXRlbUluZGV4ICs9IDE7CisgIGlmICghSXNJdGVtVmlzaWJsZShuSXRlbUluZGV4KSAmJiBJc0l0ZW1WaXNpYmxlKG5JdGVtSW5kZXggKyAxKSkKKyAgICBuSXRlbUluZGV4ICs9IDE7CiAKLQlyZXR1cm4gbkl0ZW1JbmRleDsKKyAgcmV0dXJuIG5JdGVtSW5kZXg7CiB9CiAKLXZvaWQgQ0ZYX0xpc3RDdHJsOjpFbXB0eSgpCi17Ci0JQ0ZYX0xpc3Q6OkVtcHR5KCk7Ci0JSW52YWxpZGF0ZUl0ZW0oLTEpOwordm9pZCBDRlhfTGlzdEN0cmw6OkVtcHR5KCkgeworICBDRlhfTGlzdDo6RW1wdHkoKTsKKyAgSW52YWxpZGF0ZUl0ZW0oLTEpOwogfQogCi12b2lkIENGWF9MaXN0Q3RybDo6Q2FuY2VsKCkKLXsKLQltX2FTZWxJdGVtcy5EZXNlbGVjdEFsbCgpOwordm9pZCBDRlhfTGlzdEN0cmw6OkNhbmNlbCgpIHsKKyAgbV9hU2VsSXRlbXMuRGVzZWxlY3RBbGwoKTsKIH0KIAotRlhfSU5UMzIgQ0ZYX0xpc3RDdHJsOjpHZXRJdGVtSW5kZXgoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdAotewotCXJldHVybiBDRlhfTGlzdDo6R2V0SXRlbUluZGV4KE91dFRvSW4ocG9pbnQpKTsKK2ludDMyX3QgQ0ZYX0xpc3RDdHJsOjpHZXRJdGVtSW5kZXgoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0IHsKKyAgcmV0dXJuIENGWF9MaXN0OjpHZXRJdGVtSW5kZXgoT3V0VG9Jbihwb2ludCkpOwogfQogCi1DRlhfV2lkZVN0cmluZyBDRlhfTGlzdEN0cmw6OkdldFRleHQoKSBjb25zdAotewotCWlmICh0aGlzLT5Jc011bHRpcGxlU2VsKCkpCi0JCXJldHVybiB0aGlzLT5HZXRJdGVtVGV4dCh0aGlzLT5tX25DYXJldEluZGV4KTsJCi0JZWxzZQotCQlyZXR1cm4gdGhpcy0+R2V0SXRlbVRleHQodGhpcy0+bV9uU2VsSXRlbSk7CitDRlhfV2lkZVN0cmluZyBDRlhfTGlzdEN0cmw6OkdldFRleHQoKSBjb25zdCB7CisgIGlmIChJc011bHRpcGxlU2VsKCkpCisgICAgcmV0dXJuIEdldEl0ZW1UZXh0KG1fbkNhcmV0SW5kZXgpOworICByZXR1cm4gR2V0SXRlbVRleHQobV9uU2VsSXRlbSk7CiB9Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X21vZHVsZS5jcHAgYi9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9tb2R1bGUuY3BwCmluZGV4IDljYTdmMmUuLjg4OWIwZjggMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X21vZHVsZS5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfbW9kdWxlLmNwcApAQCAtMSw0NiArMSwzMSBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGVkaXQvZnhldF9zdHViLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGVkaXQvZnhldF9lZGl0LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGVkaXQvZnhldF9saXN0LmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meGV0X2VkaXQuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfbGlzdC5oIgogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElGWF9FZGl0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK0lGWF9FZGl0KiBJRlhfRWRpdDo6TmV3RWRpdCgpIHsKKyAgaWYgKElQREZfVmFyaWFibGVUZXh0KiBwVlQgPSBJUERGX1ZhcmlhYmxlVGV4dDo6TmV3VmFyaWFibGVUZXh0KCkpIHsKKyAgICByZXR1cm4gbmV3IENGWF9FZGl0KHBWVCk7CisgIH0KIAotSUZYX0VkaXQqIElGWF9FZGl0OjpOZXdFZGl0KCkKLXsKLQlpZiAoSVBERl9WYXJpYWJsZVRleHQgKiBwVlQgPSBJUERGX1ZhcmlhYmxlVGV4dDo6TmV3VmFyaWFibGVUZXh0KCkpCi0JewotCQlyZXR1cm4gbmV3IENGWF9FZGl0KHBWVCk7Ci0JfQotCi0JcmV0dXJuIE5VTEw7CisgIHJldHVybiBOVUxMOwogfQogCi12b2lkIElGWF9FZGl0OjpEZWxFZGl0KElGWF9FZGl0KiBwRWRpdCkKLXsKLQlBU1NFUlQocEVkaXQgIT0gTlVMTCk7Cit2b2lkIElGWF9FZGl0OjpEZWxFZGl0KElGWF9FZGl0KiBwRWRpdCkgeworICBJUERGX1ZhcmlhYmxlVGV4dDo6RGVsVmFyaWFibGVUZXh0KHBFZGl0LT5HZXRWYXJpYWJsZVRleHQoKSk7CiAKLQlJUERGX1ZhcmlhYmxlVGV4dDo6RGVsVmFyaWFibGVUZXh0KHBFZGl0LT5HZXRWYXJpYWJsZVRleHQoKSk7Ci0KLQlkZWxldGUgKENGWF9FZGl0KilwRWRpdDsKKyAgZGVsZXRlIChDRlhfRWRpdCopcEVkaXQ7CiB9CiAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJRlhfTGlzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLUlGWF9MaXN0KiBJRlhfTGlzdDo6TmV3TGlzdCgpCi17Ci0JcmV0dXJuIG5ldyBDRlhfTGlzdEN0cmwoKTsKK0lGWF9MaXN0KiBJRlhfTGlzdDo6TmV3TGlzdCgpIHsKKyAgcmV0dXJuIG5ldyBDRlhfTGlzdEN0cmwoKTsKIH0KIAotdm9pZCBJRlhfTGlzdDo6RGVsTGlzdChJRlhfTGlzdCogcExpc3QpCi17Ci0JQVNTRVJUKHBMaXN0ICE9IE5VTEwpOwotCi0JZGVsZXRlIChDRlhfTGlzdEN0cmwqKXBMaXN0Owordm9pZCBJRlhfTGlzdDo6RGVsTGlzdChJRlhfTGlzdCogcExpc3QpIHsKKyAgQVNTRVJUKHBMaXN0KTsKKyAgZGVsZXRlIChDRlhfTGlzdEN0cmwqKXBMaXN0OwogfQotCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9wYWdlb2Jqcy5jcHAgYi9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9wYWdlb2Jqcy5jcHAKaW5kZXggN2I2NGIzMy4uMTg2ODc2NyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfcGFnZW9ianMuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X3BhZ2VvYmpzLmNwcApAQCAtMSw2NDEgKzEsNjU4IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Z4ZWRpdC9meGV0X3N0dWIuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2Z4ZWRpdC9meF9lZGl0LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGVkaXQvZnhldF9lZGl0LmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlb2JqLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9yZW5kZXIuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnhfc3lzdGVtaGFuZGxlci5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhfZWRpdC5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhldF9lZGl0LmgiCiAKLSNkZWZpbmUgRlhfRURJVF9VTkRFUkxJTkVIQUxGV0lEVEgJCQkJMC41ZgotI2RlZmluZSBGWF9FRElUX0NST1NTT1VUSEFMRldJRFRICQkJCTAuNWYKKyNkZWZpbmUgRlhfRURJVF9VTkRFUkxJTkVIQUxGV0lEVEggMC41ZgorI2RlZmluZSBGWF9FRElUX0NST1NTT1VUSEFMRldJRFRIIDAuNWYKIAotZXh0ZXJuIENGWF9CeXRlU3RyaW5nIEdldFBERldvcmRTdHJpbmcoSUZYX0VkaXRfRm9udE1hcCAqIHBGb250TWFwLCBGWF9JTlQzMiBuRm9udEluZGV4LCBGWF9XT1JEIFdvcmQsIEZYX1dPUkQgU3ViV29yZCk7Ci0KLUNQREZfUmVjdCBHZXRVbmRlckxpbmVSZWN0KGNvbnN0IENQVlRfV29yZCYgd29yZCkKLXsKLQlyZXR1cm4gQ1BERl9SZWN0KHdvcmQucHRXb3JkLngsIHdvcmQucHRXb3JkLnkgKyB3b3JkLmZEZXNjZW50ICogMC41ZiwKLQkJCQkJCXdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aCwgd29yZC5wdFdvcmQueSArIHdvcmQuZkRlc2NlbnQgKiAwLjI1Zik7CitDUERGX1JlY3QgR2V0VW5kZXJMaW5lUmVjdChjb25zdCBDUFZUX1dvcmQmIHdvcmQpIHsKKyAgcmV0dXJuIENQREZfUmVjdCh3b3JkLnB0V29yZC54LCB3b3JkLnB0V29yZC55ICsgd29yZC5mRGVzY2VudCAqIDAuNWYsCisgICAgICAgICAgICAgICAgICAgd29yZC5wdFdvcmQueCArIHdvcmQuZldpZHRoLAorICAgICAgICAgICAgICAgICAgIHdvcmQucHRXb3JkLnkgKyB3b3JkLmZEZXNjZW50ICogMC4yNWYpOwogfQogCi1DUERGX1JlY3QgR2V0Q3Jvc3NvdXRSZWN0KGNvbnN0IENQVlRfV29yZCYgd29yZCkKLXsKLQlyZXR1cm4gQ1BERl9SZWN0KHdvcmQucHRXb3JkLngsIHdvcmQucHRXb3JkLnkgKyAod29yZC5mQXNjZW50ICsgd29yZC5mRGVzY2VudCkgKiAwLjVmICsgd29yZC5mRGVzY2VudCAqIDAuMjVmLAotCQkJCQkJCXdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aCwgd29yZC5wdFdvcmQueSArICh3b3JkLmZBc2NlbnQgKyB3b3JkLmZEZXNjZW50KSAqIDAuNWYpOworQ1BERl9SZWN0IEdldENyb3Nzb3V0UmVjdChjb25zdCBDUFZUX1dvcmQmIHdvcmQpIHsKKyAgcmV0dXJuIENQREZfUmVjdCh3b3JkLnB0V29yZC54LAorICAgICAgICAgICAgICAgICAgIHdvcmQucHRXb3JkLnkgKyAod29yZC5mQXNjZW50ICsgd29yZC5mRGVzY2VudCkgKiAwLjVmICsKKyAgICAgICAgICAgICAgICAgICAgICAgd29yZC5mRGVzY2VudCAqIDAuMjVmLAorICAgICAgICAgICAgICAgICAgIHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aCwKKyAgICAgICAgICAgICAgICAgICB3b3JkLnB0V29yZC55ICsgKHdvcmQuZkFzY2VudCArIHdvcmQuZkRlc2NlbnQpICogMC41Zik7CiB9CiAKLXN0YXRpYyB2b2lkIERyYXdUZXh0U3RyaW5nKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIGNvbnN0IENQREZfUG9pbnQmIHB0LCBDUERGX0ZvbnQqIHBGb250LCBGWF9GTE9BVCBmRm9udFNpemUsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0JCQkJCSAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0ciwgRlhfQVJHQiBjclRleHRGaWxsLCBGWF9BUkdCIGNyVGV4dFN0cm9rZSwgRlhfSU5UMzIgbkhvcnpTY2FsZSkKLXsKLQlGWF9GTE9BVCB4ID0gcHQueCwgeSA9IHB0Lnk7Ci0JcFVzZXIyRGV2aWNlLT5UcmFuc2Zvcm0oeCwgeSk7CitzdGF0aWMgdm9pZCBEcmF3VGV4dFN0cmluZyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgY3JUZXh0RmlsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgY3JUZXh0U3Ryb2tlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSG9yelNjYWxlKSB7CisgIEZYX0ZMT0FUIHggPSBwdC54LCB5ID0gcHQueTsKKyAgcFVzZXIyRGV2aWNlLT5UcmFuc2Zvcm0oeCwgeSk7CiAKLQlpZiAocEZvbnQpCi0JewotCQlpZiAobkhvcnpTY2FsZSAhPSAxMDApCi0JCXsKLQkJCUNQREZfTWF0cml4IG10KG5Ib3J6U2NhbGUvMTAwLjBmLDAsMCwxLDAsMCk7Ci0JCQltdC5Db25jYXQoKnBVc2VyMkRldmljZSk7CisgIGlmIChwRm9udCkgeworICAgIGlmIChuSG9yelNjYWxlICE9IDEwMCkgeworICAgICAgQ0ZYX01hdHJpeCBtdChuSG9yelNjYWxlIC8gMTAwLjBmLCAwLCAwLCAxLCAwLCAwKTsKKyAgICAgIG10LkNvbmNhdCgqcFVzZXIyRGV2aWNlKTsKIAotCQkJQ1BERl9SZW5kZXJPcHRpb25zIHJvOwotCQkJcm8ubV9GbGFncyA9IFJFTkRFUl9DTEVBUlRZUEU7Ci0JCQlyby5tX0NvbG9yTW9kZSA9IFJFTkRFUl9DT0xPUl9OT1JNQUw7CisgICAgICBDUERGX1JlbmRlck9wdGlvbnMgcm87CisgICAgICByby5tX0ZsYWdzID0gUkVOREVSX0NMRUFSVFlQRTsKKyAgICAgIHJvLm1fQ29sb3JNb2RlID0gUkVOREVSX0NPTE9SX05PUk1BTDsKIAotCQkJaWYgKGNyVGV4dFN0cm9rZSAhPSAwKQotCQkJewotCQkJCUNQREZfUG9pbnQgcHQxKDAsMCksIHB0MigxLDApOwotCQkJCXBVc2VyMkRldmljZS0+VHJhbnNmb3JtKHB0MS54LCBwdDEueSk7Ci0JCQkJcFVzZXIyRGV2aWNlLT5UcmFuc2Zvcm0ocHQyLngsIHB0Mi55KTsKLQkJCQlDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOwotCQkJCWdzZC5tX0xpbmVXaWR0aCA9IChGWF9GTE9BVClGWFNZU19mYWJzKChwdDIueCArIHB0Mi55KSAtIChwdDEueCArIHB0MS55KSk7CisgICAgICBpZiAoY3JUZXh0U3Ryb2tlICE9IDApIHsKKyAgICAgICAgQ1BERl9Qb2ludCBwdDEoMCwgMCksIHB0MigxLCAwKTsKKyAgICAgICAgcFVzZXIyRGV2aWNlLT5UcmFuc2Zvcm0ocHQxLngsIHB0MS55KTsKKyAgICAgICAgcFVzZXIyRGV2aWNlLT5UcmFuc2Zvcm0ocHQyLngsIHB0Mi55KTsKKyAgICAgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKKyAgICAgICAgZ3NkLm1fTGluZVdpZHRoID0KKyAgICAgICAgICAgIChGWF9GTE9BVClGWFNZU19mYWJzKChwdDIueCArIHB0Mi55KSAtIChwdDEueCArIHB0MS55KSk7CiAKLQkJCQlDUERGX1RleHRSZW5kZXJlcjo6RHJhd1RleHRTdHJpbmcocERldmljZSx4LCB5LCBwRm9udCwgZkZvbnRTaXplLCAmbXQsIHN0ciwgY3JUZXh0RmlsbCwgY3JUZXh0U3Ryb2tlLCAmZ3NkLCAmcm8pOwotCQkJfQotCQkJZWxzZQotCQkJCUNQREZfVGV4dFJlbmRlcmVyOjpEcmF3VGV4dFN0cmluZyhwRGV2aWNlLHgsIHksIHBGb250LCBmRm9udFNpemUsICZtdCwgc3RyLCBjclRleHRGaWxsLCAwLCBOVUxMLCAmcm8pOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJQ1BERl9SZW5kZXJPcHRpb25zIHJvOwotCQkJcm8ubV9GbGFncyA9IFJFTkRFUl9DTEVBUlRZUEU7Ci0JCQlyby5tX0NvbG9yTW9kZSA9IFJFTkRFUl9DT0xPUl9OT1JNQUw7CisgICAgICAgIENQREZfVGV4dFJlbmRlcmVyOjpEcmF3VGV4dFN0cmluZyhwRGV2aWNlLCB4LCB5LCBwRm9udCwgZkZvbnRTaXplLCAmbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsIGNyVGV4dEZpbGwsIGNyVGV4dFN0cm9rZSwgJmdzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZybyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBDUERGX1RleHRSZW5kZXJlcjo6RHJhd1RleHRTdHJpbmcocERldmljZSwgeCwgeSwgcEZvbnQsIGZGb250U2l6ZSwgJm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLCBjclRleHRGaWxsLCAwLCBOVUxMLCAmcm8pOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBDUERGX1JlbmRlck9wdGlvbnMgcm87CisgICAgICByby5tX0ZsYWdzID0gUkVOREVSX0NMRUFSVFlQRTsKKyAgICAgIHJvLm1fQ29sb3JNb2RlID0gUkVOREVSX0NPTE9SX05PUk1BTDsKIAotCQkJaWYgKGNyVGV4dFN0cm9rZSAhPSAwKQotCQkJewotCQkJCUNQREZfUG9pbnQgcHQxKDAsMCksIHB0MigxLDApOwotCQkJCXBVc2VyMkRldmljZS0+VHJhbnNmb3JtKHB0MS54LCBwdDEueSk7Ci0JCQkJcFVzZXIyRGV2aWNlLT5UcmFuc2Zvcm0ocHQyLngsIHB0Mi55KTsKLQkJCQlDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOwotCQkJCWdzZC5tX0xpbmVXaWR0aCA9IChGWF9GTE9BVClGWFNZU19mYWJzKChwdDIueCArIHB0Mi55KSAtIChwdDEueCArIHB0MS55KSk7CisgICAgICBpZiAoY3JUZXh0U3Ryb2tlICE9IDApIHsKKyAgICAgICAgQ1BERl9Qb2ludCBwdDEoMCwgMCksIHB0MigxLCAwKTsKKyAgICAgICAgcFVzZXIyRGV2aWNlLT5UcmFuc2Zvcm0ocHQxLngsIHB0MS55KTsKKyAgICAgICAgcFVzZXIyRGV2aWNlLT5UcmFuc2Zvcm0ocHQyLngsIHB0Mi55KTsKKyAgICAgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKKyAgICAgICAgZ3NkLm1fTGluZVdpZHRoID0KKyAgICAgICAgICAgIChGWF9GTE9BVClGWFNZU19mYWJzKChwdDIueCArIHB0Mi55KSAtIChwdDEueCArIHB0MS55KSk7CiAKLQkJCQlDUERGX1RleHRSZW5kZXJlcjo6RHJhd1RleHRTdHJpbmcocERldmljZSx4LCB5LCBwRm9udCwgZkZvbnRTaXplLCBwVXNlcjJEZXZpY2UsIHN0ciwgY3JUZXh0RmlsbCwgY3JUZXh0U3Ryb2tlLCAmZ3NkLCAmcm8pOwotCQkJfQotCQkJZWxzZQotCQkJCUNQREZfVGV4dFJlbmRlcmVyOjpEcmF3VGV4dFN0cmluZyhwRGV2aWNlLHgsIHksIHBGb250LCBmRm9udFNpemUsIHBVc2VyMkRldmljZSwgc3RyLCBjclRleHRGaWxsLCAwLCBOVUxMLCAmcm8pOwotCQl9Ci0JfQorICAgICAgICBDUERGX1RleHRSZW5kZXJlcjo6RHJhd1RleHRTdHJpbmcocERldmljZSwgeCwgeSwgcEZvbnQsIGZGb250U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVc2VyMkRldmljZSwgc3RyLCBjclRleHRGaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JUZXh0U3Ryb2tlLCAmZ3NkLCAmcm8pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ1BERl9UZXh0UmVuZGVyZXI6OkRyYXdUZXh0U3RyaW5nKHBEZXZpY2UsIHgsIHksIHBGb250LCBmRm9udFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlcjJEZXZpY2UsIHN0ciwgY3JUZXh0RmlsbCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZybyk7CisgICAgICB9CisgICAgfQorICB9CiB9CiAKLXZvaWQgSUZYX0VkaXQ6OkRyYXdVbmRlcmxpbmUoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwgSUZYX0VkaXQqIHBFZGl0LCBGWF9DT0xPUlJFRiBjb2xvciwKLQkJCQkJCQkJY29uc3QgQ1BERl9SZWN0JiByY0NsaXAsIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LCBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlKQotewotCXBEZXZpY2UtPlNhdmVTdGF0ZSgpOwordm9pZCBJRlhfRWRpdDo6RHJhd1VuZGVybGluZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9FZGl0KiBwRWRpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09MT1JSRUYgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgcmNDbGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSkgeworICBwRGV2aWNlLT5TYXZlU3RhdGUoKTsKIAotCWlmICghcmNDbGlwLklzRW1wdHkoKSkKLQl7Ci0JCUNQREZfUmVjdCByY1RlbXAgPSByY0NsaXA7Ci0JCXBVc2VyMkRldmljZS0+VHJhbnNmb3JtUmVjdChyY1RlbXApOwotCQlGWF9SRUNUIHJjRGV2Q2xpcDsKLQkJcmNEZXZDbGlwLmxlZnQgPSAoRlhfSU5UMzIpcmNUZW1wLmxlZnQ7Ci0JCXJjRGV2Q2xpcC5yaWdodCA9IChGWF9JTlQzMilyY1RlbXAucmlnaHQ7Ci0JCXJjRGV2Q2xpcC50b3AgPSAoRlhfSU5UMzIpcmNUZW1wLnRvcDsKLQkJcmNEZXZDbGlwLmJvdHRvbSA9IChGWF9JTlQzMilyY1RlbXAuYm90dG9tOwotCQlwRGV2aWNlLT5TZXRDbGlwX1JlY3QoJnJjRGV2Q2xpcCk7Ci0JfQorICBpZiAoIXJjQ2xpcC5Jc0VtcHR5KCkpIHsKKyAgICBDUERGX1JlY3QgcmNUZW1wID0gcmNDbGlwOworICAgIHBVc2VyMkRldmljZS0+VHJhbnNmb3JtUmVjdChyY1RlbXApOworICAgIEZYX1JFQ1QgcmNEZXZDbGlwOworICAgIHJjRGV2Q2xpcC5sZWZ0ID0gKGludDMyX3QpcmNUZW1wLmxlZnQ7CisgICAgcmNEZXZDbGlwLnJpZ2h0ID0gKGludDMyX3QpcmNUZW1wLnJpZ2h0OworICAgIHJjRGV2Q2xpcC50b3AgPSAoaW50MzJfdClyY1RlbXAudG9wOworICAgIHJjRGV2Q2xpcC5ib3R0b20gPSAoaW50MzJfdClyY1RlbXAuYm90dG9tOworICAgIHBEZXZpY2UtPlNldENsaXBfUmVjdCgmcmNEZXZDbGlwKTsKKyAgfQogCi0JaWYgKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBwRWRpdC0+R2V0SXRlcmF0b3IoKSkKLQl7Ci0JCWlmIChwRWRpdC0+R2V0Rm9udE1hcCgpKQotCQl7Ci0JCQlpZiAocFJhbmdlKQotCQkJCXBJdGVyYXRvci0+U2V0QXQocFJhbmdlLT5CZWdpblBvcyk7Ci0JCQllbHNlCi0JCQkJcEl0ZXJhdG9yLT5TZXRBdCgwKTsKKyAgaWYgKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBwRWRpdC0+R2V0SXRlcmF0b3IoKSkgeworICAgIGlmIChwRWRpdC0+R2V0Rm9udE1hcCgpKSB7CisgICAgICBpZiAocFJhbmdlKQorICAgICAgICBwSXRlcmF0b3ItPlNldEF0KHBSYW5nZS0+QmVnaW5Qb3MpOworICAgICAgZWxzZQorICAgICAgICBwSXRlcmF0b3ItPlNldEF0KDApOwogCi0JCQl3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKQotCQkJewotCQkJCUNQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOwotCQkJCWlmIChwUmFuZ2UgJiYgcGxhY2UuV29yZENtcChwUmFuZ2UtPkVuZFBvcykgPiAwKSBicmVhazsKKyAgICAgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpIHsKKyAgICAgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7CisgICAgICAgIGlmIChwUmFuZ2UgJiYgcGxhY2UuV29yZENtcChwUmFuZ2UtPkVuZFBvcykgPiAwKQorICAgICAgICAgIGJyZWFrOwogCi0JCQkJQ1BWVF9Xb3JkIHdvcmQ7CQkJCQotCQkJCWlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpCi0JCQkJewotCQkJCQlDRlhfUGF0aERhdGEgcGF0aFVuZGVybGluZTsKLQkJCQkJQ1BERl9SZWN0IHJjVW5kZXJsaW5lID0gR2V0VW5kZXJMaW5lUmVjdCh3b3JkKTsKLQkJCQkJcmNVbmRlcmxpbmUubGVmdCArPSBwdE9mZnNldC54OwotCQkJCQlyY1VuZGVybGluZS5yaWdodCArPSBwdE9mZnNldC54OwotCQkJCQlyY1VuZGVybGluZS50b3AgKz0gcHRPZmZzZXQueTsKLQkJCQkJcmNVbmRlcmxpbmUuYm90dG9tICs9IHB0T2Zmc2V0Lnk7Ci0JCQkJCXBhdGhVbmRlcmxpbmUuQXBwZW5kUmVjdChyY1VuZGVybGluZS5sZWZ0LCByY1VuZGVybGluZS5ib3R0b20sIHJjVW5kZXJsaW5lLnJpZ2h0LCByY1VuZGVybGluZS50b3ApOworICAgICAgICBDUFZUX1dvcmQgd29yZDsKKyAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgeworICAgICAgICAgIENGWF9QYXRoRGF0YSBwYXRoVW5kZXJsaW5lOworICAgICAgICAgIENQREZfUmVjdCByY1VuZGVybGluZSA9IEdldFVuZGVyTGluZVJlY3Qod29yZCk7CisgICAgICAgICAgcmNVbmRlcmxpbmUubGVmdCArPSBwdE9mZnNldC54OworICAgICAgICAgIHJjVW5kZXJsaW5lLnJpZ2h0ICs9IHB0T2Zmc2V0Lng7CisgICAgICAgICAgcmNVbmRlcmxpbmUudG9wICs9IHB0T2Zmc2V0Lnk7CisgICAgICAgICAgcmNVbmRlcmxpbmUuYm90dG9tICs9IHB0T2Zmc2V0Lnk7CisgICAgICAgICAgcGF0aFVuZGVybGluZS5BcHBlbmRSZWN0KHJjVW5kZXJsaW5lLmxlZnQsIHJjVW5kZXJsaW5lLmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNVbmRlcmxpbmUucmlnaHQsIHJjVW5kZXJsaW5lLnRvcCk7CiAKLQkJCQkJcERldmljZS0+RHJhd1BhdGgoJnBhdGhVbmRlcmxpbmUsIHBVc2VyMkRldmljZSwgTlVMTCwgY29sb3IsIDAsIEZYRklMTF9XSU5ESU5HKTsKLQkJCQl9Ci0JCQl9CQkJCi0JCX0KLQl9Ci0JCi0JcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CisgICAgICAgICAgcERldmljZS0+RHJhd1BhdGgoJnBhdGhVbmRlcmxpbmUsIHBVc2VyMkRldmljZSwgTlVMTCwgY29sb3IsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhGSUxMX1dJTkRJTkcpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CiB9CiAKLXZvaWQgSUZYX0VkaXQ6OkRyYXdFZGl0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsIElGWF9FZGl0KiBwRWRpdCwgRlhfQ09MT1JSRUYgY3JUZXh0RmlsbCwgRlhfQ09MT1JSRUYgY3JUZXh0U3Ryb2tlLCAKLQkJCQkJCWNvbnN0IENQREZfUmVjdCYgcmNDbGlwLCBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSwgSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyLCB2b2lkKiBwRkZMRGF0YSkKLXsKLQkKLQlGWF9CT09MIGJDb250aW51b3VzID0gcEVkaXQtPkdldENoYXJBcnJheSgpID09IDA7Ci0JaWYgKHBFZGl0LT5HZXRDaGFyU3BhY2UoKSA+IDAuMGYpCi0JCWJDb250aW51b3VzID0gRkFMU0U7Cit2b2lkIElGWF9FZGl0OjpEcmF3RWRpdChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0VkaXQqIHBFZGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09MT1JSRUYgY3JUZXh0RmlsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPTE9SUkVGIGNyVGV4dFN0cm9rZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgcmNDbGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEZGTERhdGEpIHsKKyAgRlhfQk9PTCBiQ29udGludW91cyA9IHBFZGl0LT5HZXRDaGFyQXJyYXkoKSA9PSAwOworICBpZiAocEVkaXQtPkdldENoYXJTcGFjZSgpID4gMC4wZikKKyAgICBiQ29udGludW91cyA9IEZBTFNFOwogCi0JRlhfV09SRCBTdWJXb3JkID0gcEVkaXQtPkdldFBhc3N3b3JkQ2hhcigpOwotCUZYX0ZMT0FUIGZGb250U2l6ZSA9IHBFZGl0LT5HZXRGb250U2l6ZSgpOwotCUNQVlRfV29yZFJhbmdlIHdyU2VsZWN0ID0gcEVkaXQtPkdldFNlbGVjdFdvcmRSYW5nZSgpOwotCUZYX0lOVDMyIG5Ib3J6U2NhbGUgPSBwRWRpdC0+R2V0SG9yelNjYWxlKCk7CisgIEZYX1dPUkQgU3ViV29yZCA9IHBFZGl0LT5HZXRQYXNzd29yZENoYXIoKTsKKyAgRlhfRkxPQVQgZkZvbnRTaXplID0gcEVkaXQtPkdldEZvbnRTaXplKCk7CisgIENQVlRfV29yZFJhbmdlIHdyU2VsZWN0ID0gcEVkaXQtPkdldFNlbGVjdFdvcmRSYW5nZSgpOworICBpbnQzMl90IG5Ib3J6U2NhbGUgPSBwRWRpdC0+R2V0SG9yelNjYWxlKCk7CiAKLQlGWF9DT0xPUlJFRiBjckN1ckZpbGwgPSBjclRleHRGaWxsOwotCUZYX0NPTE9SUkVGIGNyT2xkRmlsbCA9IGNyQ3VyRmlsbDsKKyAgRlhfQ09MT1JSRUYgY3JDdXJGaWxsID0gY3JUZXh0RmlsbDsKKyAgRlhfQ09MT1JSRUYgY3JPbGRGaWxsID0gY3JDdXJGaWxsOwogCi0JRlhfQk9PTCBiU2VsZWN0ID0gRkFMU0U7Ci0JY29uc3QgRlhfQ09MT1JSRUYgY3JXaGl0ZSA9IEFyZ2JFbmNvZGUoMjU1LDI1NSwyNTUsMjU1KTsKLQljb25zdCBGWF9DT0xPUlJFRiBjclNlbEJLID0gQXJnYkVuY29kZSgyNTUsMCw1MSwxMTMpOworICBGWF9CT09MIGJTZWxlY3QgPSBGQUxTRTsKKyAgY29uc3QgRlhfQ09MT1JSRUYgY3JXaGl0ZSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsKKyAgY29uc3QgRlhfQ09MT1JSRUYgY3JTZWxCSyA9IEFyZ2JFbmNvZGUoMjU1LCAwLCA1MSwgMTEzKTsKIAotCUNGWF9CeXRlVGV4dEJ1ZiBzVGV4dEJ1ZjsKLQlGWF9JTlQzMiBuRm9udEluZGV4ID0gLTE7Ci0JQ1BERl9Qb2ludCBwdEJUKDAuMGYsMC4wZik7CisgIENGWF9CeXRlVGV4dEJ1ZiBzVGV4dEJ1ZjsKKyAgaW50MzJfdCBuRm9udEluZGV4ID0gLTE7CisgIENQREZfUG9pbnQgcHRCVCgwLjBmLCAwLjBmKTsKIAotCXBEZXZpY2UtPlNhdmVTdGF0ZSgpOworICBwRGV2aWNlLT5TYXZlU3RhdGUoKTsKIAotCWlmICghcmNDbGlwLklzRW1wdHkoKSkKLQl7Ci0JCUNQREZfUmVjdCByY1RlbXAgPSByY0NsaXA7Ci0JCXBVc2VyMkRldmljZS0+VHJhbnNmb3JtUmVjdChyY1RlbXApOwotCQlGWF9SRUNUIHJjRGV2Q2xpcDsKLQkJcmNEZXZDbGlwLmxlZnQgPSAoRlhfSU5UMzIpcmNUZW1wLmxlZnQ7Ci0JCXJjRGV2Q2xpcC5yaWdodCA9IChGWF9JTlQzMilyY1RlbXAucmlnaHQ7Ci0JCXJjRGV2Q2xpcC50b3AgPSAoRlhfSU5UMzIpcmNUZW1wLnRvcDsKLQkJcmNEZXZDbGlwLmJvdHRvbSA9IChGWF9JTlQzMilyY1RlbXAuYm90dG9tOwotCQlwRGV2aWNlLT5TZXRDbGlwX1JlY3QoJnJjRGV2Q2xpcCk7Ci0JfQorICBpZiAoIXJjQ2xpcC5Jc0VtcHR5KCkpIHsKKyAgICBDUERGX1JlY3QgcmNUZW1wID0gcmNDbGlwOworICAgIHBVc2VyMkRldmljZS0+VHJhbnNmb3JtUmVjdChyY1RlbXApOworICAgIEZYX1JFQ1QgcmNEZXZDbGlwOworICAgIHJjRGV2Q2xpcC5sZWZ0ID0gKGludDMyX3QpcmNUZW1wLmxlZnQ7CisgICAgcmNEZXZDbGlwLnJpZ2h0ID0gKGludDMyX3QpcmNUZW1wLnJpZ2h0OworICAgIHJjRGV2Q2xpcC50b3AgPSAoaW50MzJfdClyY1RlbXAudG9wOworICAgIHJjRGV2Q2xpcC5ib3R0b20gPSAoaW50MzJfdClyY1RlbXAuYm90dG9tOworICAgIHBEZXZpY2UtPlNldENsaXBfUmVjdCgmcmNEZXZDbGlwKTsKKyAgfQogCi0JaWYgKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBwRWRpdC0+R2V0SXRlcmF0b3IoKSkKLQl7Ci0JCWlmIChJRlhfRWRpdF9Gb250TWFwKiBwRm9udE1hcCA9IHBFZGl0LT5HZXRGb250TWFwKCkpCi0JCXsKLQkJCWlmIChwUmFuZ2UpCi0JCQkJcEl0ZXJhdG9yLT5TZXRBdChwUmFuZ2UtPkJlZ2luUG9zKTsKLQkJCWVsc2UKLQkJCQlwSXRlcmF0b3ItPlNldEF0KDApOworICBpZiAoSUZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IHBFZGl0LT5HZXRJdGVyYXRvcigpKSB7CisgICAgaWYgKElGWF9FZGl0X0ZvbnRNYXAqIHBGb250TWFwID0gcEVkaXQtPkdldEZvbnRNYXAoKSkgeworICAgICAgaWYgKHBSYW5nZSkKKyAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdChwUmFuZ2UtPkJlZ2luUG9zKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdCgwKTsKIAotCQkJQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2U7CQkJCisgICAgICBDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZTsKIAotCQkJd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkKLQkJCXsKLQkJCQlDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKLQkJCQlpZiAocFJhbmdlICYmIHBsYWNlLldvcmRDbXAocFJhbmdlLT5FbmRQb3MpID4gMCkgYnJlYWs7CisgICAgICB3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKSB7CisgICAgICAgIENQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOworICAgICAgICBpZiAocFJhbmdlICYmIHBsYWNlLldvcmRDbXAocFJhbmdlLT5FbmRQb3MpID4gMCkKKyAgICAgICAgICBicmVhazsKIAotCQkJCWlmICh3clNlbGVjdC5Jc0V4aXN0KCkpCi0JCQkJewotCQkJCQliU2VsZWN0ID0gcGxhY2UuV29yZENtcCh3clNlbGVjdC5CZWdpblBvcykgPiAwICYmIHBsYWNlLldvcmRDbXAod3JTZWxlY3QuRW5kUG9zKSA8PSAwOwotCQkJCQlpZiAoYlNlbGVjdCkKLQkJCQkJewkJCQkJCQotCQkJCQkJY3JDdXJGaWxsID0gY3JXaGl0ZTsJCQkJCQkKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCWNyQ3VyRmlsbCA9IGNyVGV4dEZpbGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYocFN5c3RlbUhhbmRsZXIgJiYgcFN5c3RlbUhhbmRsZXItPklzU2VsZWN0aW9uSW1wbGVtZW50ZWQoKSkJCi0JCQkJewotCQkJCQljckN1ckZpbGwgPSBjclRleHRGaWxsOwotIAkJCQkJY3JPbGRGaWxsID0gY3JDdXJGaWxsOwotCQkJCX0KLQkJCQlDUFZUX1dvcmQgd29yZDsJCQkJCi0JCQkJaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkKLQkJCQl7CisgICAgICAgIGlmICh3clNlbGVjdC5Jc0V4aXN0KCkpIHsKKyAgICAgICAgICBiU2VsZWN0ID0gcGxhY2UuV29yZENtcCh3clNlbGVjdC5CZWdpblBvcykgPiAwICYmCisgICAgICAgICAgICAgICAgICAgIHBsYWNlLldvcmRDbXAod3JTZWxlY3QuRW5kUG9zKSA8PSAwOworICAgICAgICAgIGlmIChiU2VsZWN0KSB7CisgICAgICAgICAgICBjckN1ckZpbGwgPSBjcldoaXRlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjckN1ckZpbGwgPSBjclRleHRGaWxsOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocFN5c3RlbUhhbmRsZXIgJiYgcFN5c3RlbUhhbmRsZXItPklzU2VsZWN0aW9uSW1wbGVtZW50ZWQoKSkgeworICAgICAgICAgIGNyQ3VyRmlsbCA9IGNyVGV4dEZpbGw7CisgICAgICAgICAgY3JPbGRGaWxsID0gY3JDdXJGaWxsOworICAgICAgICB9CisgICAgICAgIENQVlRfV29yZCB3b3JkOworICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7CisgICAgICAgICAgaWYgKGJTZWxlY3QpIHsKKyAgICAgICAgICAgIENQVlRfTGluZSBsaW5lOworICAgICAgICAgICAgcEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpOwogCi0JCQkJCWlmIChiU2VsZWN0KQotCQkJCQl7Ci0JCQkJCQkKLQkJCQkJCUNQVlRfTGluZSBsaW5lOwotCQkJCQkJcEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpOworICAgICAgICAgICAgaWYgKHBTeXN0ZW1IYW5kbGVyICYmIHBTeXN0ZW1IYW5kbGVyLT5Jc1NlbGVjdGlvbkltcGxlbWVudGVkKCkpIHsKKyAgICAgICAgICAgICAgQ1BERl9SZWN0IHJjKHdvcmQucHRXb3JkLngsIGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lRGVzY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lQXNjZW50KTsKKyAgICAgICAgICAgICAgcmMuSW50ZXJzZWN0KHJjQ2xpcCk7CisgICAgICAgICAgICAgIHBTeXN0ZW1IYW5kbGVyLT5PdXRwdXRTZWxlY3RlZFJlY3QocEZGTERhdGEsIHJjKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSBwYXRoU2VsQks7CisgICAgICAgICAgICAgIHBhdGhTZWxCSy5BcHBlbmRSZWN0KHdvcmQucHRXb3JkLngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lRGVzY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZC5wdFdvcmQueCArIHdvcmQuZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZUFzY2VudCk7CiAKLQkJCQkJCWlmKHBTeXN0ZW1IYW5kbGVyICYmIHBTeXN0ZW1IYW5kbGVyLT5Jc1NlbGVjdGlvbkltcGxlbWVudGVkKCkpCi0JCQkJCQl7Ci0JCQkJCQkJQ1BERl9SZWN0IHJjKHdvcmQucHRXb3JkLngsbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVEZXNjZW50LAotCQkJCQkJCQl3b3JkLnB0V29yZC54K3dvcmQuZldpZHRoLGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lQXNjZW50KTsKLQkJCQkJCQlyYy5JbnRlcnNlY3QocmNDbGlwKTsKLQkJCQkJCQkvL0NGWF9FZGl0KiBwRXQgPSAoQ0ZYX0VkaXQqKXBFZGl0OwotCQkJCQkJCS8vQ1BERl9SZWN0IHJjRWRpdCA9IHBFdC0+VlRUb0VkaXQocmMpOwotCQkJCQkJCXBTeXN0ZW1IYW5kbGVyLT5PdXRwdXRTZWxlY3RlZFJlY3QocEZGTERhdGEscmMpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewkKLSAJCQkJCQkJQ0ZYX1BhdGhEYXRhIHBhdGhTZWxCSzsKLSAJCQkJCQkJcGF0aFNlbEJLLkFwcGVuZFJlY3Qod29yZC5wdFdvcmQueCxsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZURlc2NlbnQsCi0gCQkJCQkJCQl3b3JkLnB0V29yZC54K3dvcmQuZldpZHRoLGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lQXNjZW50KTsKLSAJCQkJCQkJCi0gCQkJCQkJCXBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoU2VsQkssIHBVc2VyMkRldmljZSwgTlVMTCwgY3JTZWxCSywgMCwgRlhGSUxMX1dJTkRJTkcpOwkKLQkJCQkJCX0KLQkJCQkJfQorICAgICAgICAgICAgICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aFNlbEJLLCBwVXNlcjJEZXZpY2UsIE5VTEwsIGNyU2VsQkssIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRklMTF9XSU5ESU5HKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CiAKLQkJCQkJaWYgKGJDb250aW51b3VzKQotCQkJCQl7Ci0JCQkJCQlpZiAocGxhY2UuTGluZUNtcChvbGRwbGFjZSkgIT0gMCB8fCB3b3JkLm5Gb250SW5kZXggIT0gbkZvbnRJbmRleCB8fCAKLQkJCQkJCQljck9sZEZpbGwgIT0gY3JDdXJGaWxsKQotCQkJCQkJewotCQkJCQkJCWlmIChzVGV4dEJ1Zi5HZXRMZW5ndGgoKSA+IDApCi0JCQkJCQkJewkJCQkJCQkJCi0JCQkJCQkJCURyYXdUZXh0U3RyaW5nKHBEZXZpY2UsIENQREZfUG9pbnQocHRCVC54K3B0T2Zmc2V0LngsIHB0QlQueStwdE9mZnNldC55KSwgcEZvbnRNYXAtPkdldFBERkZvbnQobkZvbnRJbmRleCksCi0JCQkJCQkJCQlmRm9udFNpemUsIHBVc2VyMkRldmljZSwgc1RleHRCdWYuR2V0Qnl0ZVN0cmluZygpLCBjck9sZEZpbGwsIGNyVGV4dFN0cm9rZSwgbkhvcnpTY2FsZSk7CisgICAgICAgICAgaWYgKGJDb250aW51b3VzKSB7CisgICAgICAgICAgICBpZiAocGxhY2UuTGluZUNtcChvbGRwbGFjZSkgIT0gMCB8fCB3b3JkLm5Gb250SW5kZXggIT0gbkZvbnRJbmRleCB8fAorICAgICAgICAgICAgICAgIGNyT2xkRmlsbCAhPSBjckN1ckZpbGwpIHsKKyAgICAgICAgICAgICAgaWYgKHNUZXh0QnVmLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIERyYXdUZXh0U3RyaW5nKHBEZXZpY2UsIENQREZfUG9pbnQocHRCVC54ICsgcHRPZmZzZXQueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0QlQueSArIHB0T2Zmc2V0LnkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb250TWFwLT5HZXRQREZGb250KG5Gb250SW5kZXgpLCBmRm9udFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXIyRGV2aWNlLCBzVGV4dEJ1Zi5HZXRCeXRlU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JPbGRGaWxsLCBjclRleHRTdHJva2UsIG5Ib3J6U2NhbGUpOwogCi0JCQkJCQkJCXNUZXh0QnVmLkNsZWFyKCk7Ci0JCQkJCQkJfQotCQkJCQkJCW5Gb250SW5kZXggPSB3b3JkLm5Gb250SW5kZXg7Ci0JCQkJCQkJcHRCVCA9IHdvcmQucHRXb3JkOwotCQkJCQkJCWNyT2xkRmlsbCA9IGNyQ3VyRmlsbDsKLQkJCQkJCX0KKyAgICAgICAgICAgICAgICBzVGV4dEJ1Zi5DbGVhcigpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIG5Gb250SW5kZXggPSB3b3JkLm5Gb250SW5kZXg7CisgICAgICAgICAgICAgIHB0QlQgPSB3b3JkLnB0V29yZDsKKyAgICAgICAgICAgICAgY3JPbGRGaWxsID0gY3JDdXJGaWxsOworICAgICAgICAgICAgfQogCi0JCQkJCQlzVGV4dEJ1ZiA8PCBHZXRQREZXb3JkU3RyaW5nKHBGb250TWFwLCB3b3JkLm5Gb250SW5kZXgsIHdvcmQuV29yZCwgU3ViV29yZCk7CQkJCQkJCi0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlEcmF3VGV4dFN0cmluZyhwRGV2aWNlLENQREZfUG9pbnQod29yZC5wdFdvcmQueCtwdE9mZnNldC54LCB3b3JkLnB0V29yZC55K3B0T2Zmc2V0LnkpLCBwRm9udE1hcC0+R2V0UERGRm9udCh3b3JkLm5Gb250SW5kZXgpLAotCQkJCQkJCWZGb250U2l6ZSwgcFVzZXIyRGV2aWNlLCBHZXRQREZXb3JkU3RyaW5nKHBGb250TWFwLCB3b3JkLm5Gb250SW5kZXgsIHdvcmQuV29yZCwgU3ViV29yZCksIGNyQ3VyRmlsbCwgY3JUZXh0U3Ryb2tlLCBuSG9yelNjYWxlKTsKKyAgICAgICAgICAgIHNUZXh0QnVmIDw8IEdldFBERldvcmRTdHJpbmcocEZvbnRNYXAsIHdvcmQubkZvbnRJbmRleCwgd29yZC5Xb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJXb3JkKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRHJhd1RleHRTdHJpbmcoCisgICAgICAgICAgICAgICAgcERldmljZSwgQ1BERl9Qb2ludCh3b3JkLnB0V29yZC54ICsgcHRPZmZzZXQueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQucHRXb3JkLnkgKyBwdE9mZnNldC55KSwKKyAgICAgICAgICAgICAgICBwRm9udE1hcC0+R2V0UERGRm9udCh3b3JkLm5Gb250SW5kZXgpLCBmRm9udFNpemUsIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICBHZXRQREZXb3JkU3RyaW5nKHBGb250TWFwLCB3b3JkLm5Gb250SW5kZXgsIHdvcmQuV29yZCwgU3ViV29yZCksCisgICAgICAgICAgICAgICAgY3JDdXJGaWxsLCBjclRleHRTdHJva2UsIG5Ib3J6U2NhbGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBvbGRwbGFjZSA9IHBsYWNlOworICAgICAgICB9CisgICAgICB9CiAKLQkJCQkJfQotCQkJCQlvbGRwbGFjZSA9IHBsYWNlOworICAgICAgaWYgKHNUZXh0QnVmLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICBEcmF3VGV4dFN0cmluZygKKyAgICAgICAgICAgIHBEZXZpY2UsIENQREZfUG9pbnQocHRCVC54ICsgcHRPZmZzZXQueCwgcHRCVC55ICsgcHRPZmZzZXQueSksCisgICAgICAgICAgICBwRm9udE1hcC0+R2V0UERGRm9udChuRm9udEluZGV4KSwgZkZvbnRTaXplLCBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICBzVGV4dEJ1Zi5HZXRCeXRlU3RyaW5nKCksIGNyT2xkRmlsbCwgY3JUZXh0U3Ryb2tlLCBuSG9yelNjYWxlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KIAotCi0JCQkJfQotCQkJfQotCi0JCQlpZiAoc1RleHRCdWYuR2V0TGVuZ3RoKCkgPiAwKQotCQkJewkJCQkKLQkJCQlEcmF3VGV4dFN0cmluZyhwRGV2aWNlLCBDUERGX1BvaW50KHB0QlQueCtwdE9mZnNldC54LCBwdEJULnkrcHRPZmZzZXQueSksIHBGb250TWFwLT5HZXRQREZGb250KG5Gb250SW5kZXgpLAotCQkJCQlmRm9udFNpemUsIHBVc2VyMkRldmljZSwgc1RleHRCdWYuR2V0Qnl0ZVN0cmluZygpLCBjck9sZEZpbGwsIGNyVGV4dFN0cm9rZSwgbkhvcnpTY2FsZSk7Ci0JCQl9CQkJCi0JCX0KLQl9Ci0JCi0JcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CisgIHBEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwogfQogCi12b2lkIElGWF9FZGl0OjpEcmF3UmljaEVkaXQoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwgSUZYX0VkaXQqIHBFZGl0LCAgCi0JCQkJCQljb25zdCBDUERGX1JlY3QmIHJjQ2xpcCwgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UpCi17Ci0JLy9GWF9GTE9BVCBmRm9udFNpemUgPSBwRWRpdC0+R2V0Rm9udFNpemUoKTsKLQlDUFZUX1dvcmRSYW5nZSB3clNlbGVjdCA9IHBFZGl0LT5HZXRTZWxlY3RXb3JkUmFuZ2UoKTsKK3ZvaWQgSUZYX0VkaXQ6OkRyYXdSaWNoRWRpdChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRWRpdCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiByY0NsaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSkgeworICBDUFZUX1dvcmRSYW5nZSB3clNlbGVjdCA9IHBFZGl0LT5HZXRTZWxlY3RXb3JkUmFuZ2UoKTsKIAotCUZYX0NPTE9SUkVGIGNyQ3VyVGV4dCA9IEFyZ2JFbmNvZGUoMjU1LCAwLDAsMCk7Ci0JRlhfQ09MT1JSRUYgY3JPbGQgPSBjckN1clRleHQ7Ci0JRlhfQk9PTCBiU2VsZWN0ID0gRkFMU0U7Ci0JY29uc3QgRlhfQ09MT1JSRUYgY3JXaGl0ZSA9IEFyZ2JFbmNvZGUoMjU1LDI1NSwyNTUsMjU1KTsKLQljb25zdCBGWF9DT0xPUlJFRiBjclNlbEJLID0gQXJnYkVuY29kZSgyNTUsMCw1MSwxMTMpOworICBGWF9DT0xPUlJFRiBjckN1clRleHQgPSBBcmdiRW5jb2RlKDI1NSwgMCwgMCwgMCk7CisgIEZYX0NPTE9SUkVGIGNyT2xkID0gY3JDdXJUZXh0OworICBGWF9CT09MIGJTZWxlY3QgPSBGQUxTRTsKKyAgY29uc3QgRlhfQ09MT1JSRUYgY3JXaGl0ZSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsKKyAgY29uc3QgRlhfQ09MT1JSRUYgY3JTZWxCSyA9IEFyZ2JFbmNvZGUoMjU1LCAwLCA1MSwgMTEzKTsKIAotCUNGWF9CeXRlVGV4dEJ1ZiBzVGV4dEJ1ZjsKLQlDUFZUX1dvcmRQcm9wcyB3cDsKLQlDUERGX1BvaW50IHB0QlQoMC4wZiwwLjBmKTsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNUZXh0QnVmOworICBDUFZUX1dvcmRQcm9wcyB3cDsKKyAgQ1BERl9Qb2ludCBwdEJUKDAuMGYsIDAuMGYpOwogCi0JcERldmljZS0+U2F2ZVN0YXRlKCk7CisgIHBEZXZpY2UtPlNhdmVTdGF0ZSgpOwogCi0JaWYgKCFyY0NsaXAuSXNFbXB0eSgpKQotCXsKLQkJQ1BERl9SZWN0IHJjVGVtcCA9IHJjQ2xpcDsKLQkJcFVzZXIyRGV2aWNlLT5UcmFuc2Zvcm1SZWN0KHJjVGVtcCk7Ci0JCUZYX1JFQ1QgcmNEZXZDbGlwOwotCQlyY0RldkNsaXAubGVmdCA9IChGWF9JTlQzMilyY1RlbXAubGVmdDsKLQkJcmNEZXZDbGlwLnJpZ2h0ID0gKEZYX0lOVDMyKXJjVGVtcC5yaWdodDsKLQkJcmNEZXZDbGlwLnRvcCA9IChGWF9JTlQzMilyY1RlbXAudG9wOwotCQlyY0RldkNsaXAuYm90dG9tID0gKEZYX0lOVDMyKXJjVGVtcC5ib3R0b207Ci0JCXBEZXZpY2UtPlNldENsaXBfUmVjdCgmcmNEZXZDbGlwKTsKLQl9CisgIGlmICghcmNDbGlwLklzRW1wdHkoKSkgeworICAgIENQREZfUmVjdCByY1RlbXAgPSByY0NsaXA7CisgICAgcFVzZXIyRGV2aWNlLT5UcmFuc2Zvcm1SZWN0KHJjVGVtcCk7CisgICAgRlhfUkVDVCByY0RldkNsaXA7CisgICAgcmNEZXZDbGlwLmxlZnQgPSAoaW50MzJfdClyY1RlbXAubGVmdDsKKyAgICByY0RldkNsaXAucmlnaHQgPSAoaW50MzJfdClyY1RlbXAucmlnaHQ7CisgICAgcmNEZXZDbGlwLnRvcCA9IChpbnQzMl90KXJjVGVtcC50b3A7CisgICAgcmNEZXZDbGlwLmJvdHRvbSA9IChpbnQzMl90KXJjVGVtcC5ib3R0b207CisgICAgcERldmljZS0+U2V0Q2xpcF9SZWN0KCZyY0RldkNsaXApOworICB9CiAKLQlpZiAoSUZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IHBFZGl0LT5HZXRJdGVyYXRvcigpKQotCXsKLQkJaWYgKElGWF9FZGl0X0ZvbnRNYXAqIHBGb250TWFwID0gcEVkaXQtPkdldEZvbnRNYXAoKSkKLQkJewotCQkJaWYgKHBSYW5nZSkKLQkJCQlwSXRlcmF0b3ItPlNldEF0KHBSYW5nZS0+QmVnaW5Qb3MpOwotCQkJZWxzZQotCQkJCXBJdGVyYXRvci0+U2V0QXQoMCk7CisgIGlmIChJRlhfRWRpdF9JdGVyYXRvciogcEl0ZXJhdG9yID0gcEVkaXQtPkdldEl0ZXJhdG9yKCkpIHsKKyAgICBpZiAoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXAgPSBwRWRpdC0+R2V0Rm9udE1hcCgpKSB7CisgICAgICBpZiAocFJhbmdlKQorICAgICAgICBwSXRlcmF0b3ItPlNldEF0KHBSYW5nZS0+QmVnaW5Qb3MpOworICAgICAgZWxzZQorICAgICAgICBwSXRlcmF0b3ItPlNldEF0KDApOwogCi0JCQlDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZTsJCQkKKyAgICAgIENQVlRfV29yZFBsYWNlIG9sZHBsYWNlOwogCi0JCQl3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKQotCQkJewotCQkJCUNQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOwotCQkJCWlmIChwUmFuZ2UgJiYgcGxhY2UuV29yZENtcChwUmFuZ2UtPkVuZFBvcykgPiAwKSBicmVhazsKLQkJCQkKLQkJCQlDUFZUX1dvcmQgd29yZDsJCQkJCi0JCQkJaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkKLQkJCQl7Ci0JCQkJCXdvcmQuV29yZFByb3BzLmZGb250U2l6ZSA9IHdvcmQuZkZvbnRTaXplOworICAgICAgd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkgeworICAgICAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKKyAgICAgICAgaWYgKHBSYW5nZSAmJiBwbGFjZS5Xb3JkQ21wKHBSYW5nZS0+RW5kUG9zKSA+IDApCisgICAgICAgICAgYnJlYWs7CiAKLQkJCQkJY3JDdXJUZXh0ID0gQXJnYkVuY29kZSgyNTUsd29yZC5Xb3JkUHJvcHMuZHdXb3JkQ29sb3IpOworICAgICAgICBDUFZUX1dvcmQgd29yZDsKKyAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgeworICAgICAgICAgIHdvcmQuV29yZFByb3BzLmZGb250U2l6ZSA9IHdvcmQuZkZvbnRTaXplOwogCi0JCQkJCWlmICh3clNlbGVjdC5Jc0V4aXN0KCkpCi0JCQkJCXsKLQkJCQkJCWJTZWxlY3QgPSBwbGFjZS5Xb3JkQ21wKHdyU2VsZWN0LkJlZ2luUG9zKSA+IDAgJiYgcGxhY2UuV29yZENtcCh3clNlbGVjdC5FbmRQb3MpIDw9IDA7Ci0JCQkJCQlpZiAoYlNlbGVjdCkKLQkJCQkJCXsJCQkJCQkKLQkJCQkJCQljckN1clRleHQgPSBjcldoaXRlOwotCQkJCQkJfQotCQkJCQl9CisgICAgICAgICAgY3JDdXJUZXh0ID0gQXJnYkVuY29kZSgyNTUsIHdvcmQuV29yZFByb3BzLmR3V29yZENvbG9yKTsKIAotCQkJCQlpZiAoYlNlbGVjdCkKLQkJCQkJewotCQkJCQkJQ1BWVF9MaW5lIGxpbmU7Ci0JCQkJCQlwSXRlcmF0b3ItPkdldExpbmUobGluZSk7CisgICAgICAgICAgaWYgKHdyU2VsZWN0LklzRXhpc3QoKSkgeworICAgICAgICAgICAgYlNlbGVjdCA9IHBsYWNlLldvcmRDbXAod3JTZWxlY3QuQmVnaW5Qb3MpID4gMCAmJgorICAgICAgICAgICAgICAgICAgICAgIHBsYWNlLldvcmRDbXAod3JTZWxlY3QuRW5kUG9zKSA8PSAwOworICAgICAgICAgICAgaWYgKGJTZWxlY3QpIHsKKyAgICAgICAgICAgICAgY3JDdXJUZXh0ID0gY3JXaGl0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CiAKLQkJCQkJCUNGWF9QYXRoRGF0YSBwYXRoU2VsQks7Ci0JCQkJCQlwYXRoU2VsQksuQXBwZW5kUmVjdCh3b3JkLnB0V29yZC54CQkrIHB0T2Zmc2V0LngsCi0JCQkJCQkJbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVEZXNjZW50CSsgcHRPZmZzZXQueSwKLQkJCQkJCQl3b3JkLnB0V29yZC54K3dvcmQuZldpZHRoCQkJKyBwdE9mZnNldC54LAotCQkJCQkJCWxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lQXNjZW50CSsgcHRPZmZzZXQueSk7CisgICAgICAgICAgaWYgKGJTZWxlY3QpIHsKKyAgICAgICAgICAgIENQVlRfTGluZSBsaW5lOworICAgICAgICAgICAgcEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpOwogCi0JCQkJCQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aFNlbEJLLCBwVXNlcjJEZXZpY2UsIE5VTEwsIGNyU2VsQkssIDAsIEZYRklMTF9XSU5ESU5HKTsJCQkJCQkJCQkJCQkKLQkJCQkJfQorICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGhTZWxCSzsKKyAgICAgICAgICAgIHBhdGhTZWxCSy5BcHBlbmRSZWN0KHdvcmQucHRXb3JkLnggKyBwdE9mZnNldC54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVEZXNjZW50ICsgcHRPZmZzZXQueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aCArIHB0T2Zmc2V0LngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZUFzY2VudCArIHB0T2Zmc2V0LnkpOwogCi0JCQkJCWlmIChwbGFjZS5MaW5lQ21wKG9sZHBsYWNlKSAhPSAwIHx8IHdvcmQuV29yZFByb3BzLmZDaGFyU3BhY2UgPiAwLjBmIHx8IHdvcmQuV29yZFByb3BzLm5Ib3J6U2NhbGUgIT0gMTAwIHx8IAotCQkJCQkJRlhTWVNfbWVtY21wKCZ3b3JkLldvcmRQcm9wcywgJndwLCBzaXplb2YoQ1BWVF9Xb3JkUHJvcHMpKSAhPSAwIHx8IAotCQkJCQkJY3JPbGQgIT0gY3JDdXJUZXh0KQotCQkJCQl7Ci0JCQkJCQlpZiAoc1RleHRCdWYuR2V0TGVuZ3RoKCkgPiAwKQotCQkJCQkJewkJCQkJCQkJCi0JCQkJCQkJRHJhd1RleHRTdHJpbmcocERldmljZSwgQ1BERl9Qb2ludChwdEJULngrcHRPZmZzZXQueCwgcHRCVC55K3B0T2Zmc2V0LnkpLCBwRm9udE1hcC0+R2V0UERGRm9udCh3cC5uRm9udEluZGV4KSwKLQkJCQkJCQkJd3AuZkZvbnRTaXplLCBwVXNlcjJEZXZpY2UsIHNUZXh0QnVmLkdldEJ5dGVTdHJpbmcoKSwgY3JPbGQsIDAsIHdwLm5Ib3J6U2NhbGUpOworICAgICAgICAgICAgcERldmljZS0+RHJhd1BhdGgoJnBhdGhTZWxCSywgcFVzZXIyRGV2aWNlLCBOVUxMLCBjclNlbEJLLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhGSUxMX1dJTkRJTkcpOworICAgICAgICAgIH0KIAotCQkJCQkJCXNUZXh0QnVmLkNsZWFyKCk7Ci0JCQkJCQl9Ci0JCQkJCQl3cCA9IHdvcmQuV29yZFByb3BzOwotCQkJCQkJcHRCVCA9IHdvcmQucHRXb3JkOwotCQkJCQkJY3JPbGQgPSBjckN1clRleHQ7Ci0JCQkJCX0KKyAgICAgICAgICBpZiAocGxhY2UuTGluZUNtcChvbGRwbGFjZSkgIT0gMCB8fAorICAgICAgICAgICAgICB3b3JkLldvcmRQcm9wcy5mQ2hhclNwYWNlID4gMC4wZiB8fAorICAgICAgICAgICAgICB3b3JkLldvcmRQcm9wcy5uSG9yelNjYWxlICE9IDEwMCB8fAorICAgICAgICAgICAgICBGWFNZU19tZW1jbXAoJndvcmQuV29yZFByb3BzLCAmd3AsIHNpemVvZihDUFZUX1dvcmRQcm9wcykpICE9IDAgfHwKKyAgICAgICAgICAgICAgY3JPbGQgIT0gY3JDdXJUZXh0KSB7CisgICAgICAgICAgICBpZiAoc1RleHRCdWYuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgIERyYXdUZXh0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgcERldmljZSwgQ1BERl9Qb2ludChwdEJULnggKyBwdE9mZnNldC54LCBwdEJULnkgKyBwdE9mZnNldC55KSwKKyAgICAgICAgICAgICAgICAgIHBGb250TWFwLT5HZXRQREZGb250KHdwLm5Gb250SW5kZXgpLCB3cC5mRm9udFNpemUsCisgICAgICAgICAgICAgICAgICBwVXNlcjJEZXZpY2UsIHNUZXh0QnVmLkdldEJ5dGVTdHJpbmcoKSwgY3JPbGQsIDAsCisgICAgICAgICAgICAgICAgICB3cC5uSG9yelNjYWxlKTsKIAotCQkJCQlzVGV4dEJ1ZiA8PCBHZXRQREZXb3JkU3RyaW5nKHBGb250TWFwLCB3b3JkLldvcmRQcm9wcy5uRm9udEluZGV4LCB3b3JkLldvcmQsIDApOwkKLQkJCQkJCi0JCQkJCWlmICh3b3JkLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9VTkRFUkxJTkUpCi0JCQkJCXsKLQkJCQkJCUNGWF9QYXRoRGF0YSBwYXRoVW5kZXJsaW5lOwotCQkJCQkJQ1BERl9SZWN0IHJjVW5kZXJsaW5lID0gR2V0VW5kZXJMaW5lUmVjdCh3b3JkKTsKLQkJCQkJCXBhdGhVbmRlcmxpbmUuQXBwZW5kUmVjdChyY1VuZGVybGluZS5sZWZ0LCByY1VuZGVybGluZS5ib3R0b20sIHJjVW5kZXJsaW5lLnJpZ2h0LCByY1VuZGVybGluZS50b3ApOworICAgICAgICAgICAgICBzVGV4dEJ1Zi5DbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3AgPSB3b3JkLldvcmRQcm9wczsKKyAgICAgICAgICAgIHB0QlQgPSB3b3JkLnB0V29yZDsKKyAgICAgICAgICAgIGNyT2xkID0gY3JDdXJUZXh0OworICAgICAgICAgIH0KIAotCQkJCQkJcERldmljZS0+RHJhd1BhdGgoJnBhdGhVbmRlcmxpbmUsIHBVc2VyMkRldmljZSwgTlVMTCwgY3JDdXJUZXh0LCAwLCBGWEZJTExfV0lORElORyk7CQotCQkJCQl9CisgICAgICAgICAgc1RleHRCdWYgPDwgR2V0UERGV29yZFN0cmluZyhwRm9udE1hcCwgd29yZC5Xb3JkUHJvcHMubkZvbnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQuV29yZCwgMCk7CiAKLQkJCQkJaWYgKHdvcmQuV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX0NST1NTT1VUKQotCQkJCQl7Ci0JCQkJCQlDRlhfUGF0aERhdGEgcGF0aENyb3Nzb3V0OwotCQkJCQkJQ1BERl9SZWN0IHJjQ3Jvc3NvdXQgPSBHZXRDcm9zc291dFJlY3Qod29yZCk7Ci0JCQkJCQlwYXRoQ3Jvc3NvdXQuQXBwZW5kUmVjdChyY0Nyb3Nzb3V0LmxlZnQsIHJjQ3Jvc3NvdXQuYm90dG9tLCByY0Nyb3Nzb3V0LnJpZ2h0LCByY0Nyb3Nzb3V0LnRvcCk7CisgICAgICAgICAgaWYgKHdvcmQuV29yZFByb3BzLm5Xb3JkU3R5bGUgJiBQVlRXT1JEX1NUWUxFX1VOREVSTElORSkgeworICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGhVbmRlcmxpbmU7CisgICAgICAgICAgICBDUERGX1JlY3QgcmNVbmRlcmxpbmUgPSBHZXRVbmRlckxpbmVSZWN0KHdvcmQpOworICAgICAgICAgICAgcGF0aFVuZGVybGluZS5BcHBlbmRSZWN0KHJjVW5kZXJsaW5lLmxlZnQsIHJjVW5kZXJsaW5lLmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY1VuZGVybGluZS5yaWdodCwgcmNVbmRlcmxpbmUudG9wKTsKIAotCQkJCQkJcERldmljZS0+RHJhd1BhdGgoJnBhdGhDcm9zc291dCwgcFVzZXIyRGV2aWNlLCBOVUxMLCBjckN1clRleHQsIDAsIEZYRklMTF9XSU5ESU5HKTsKLQkJCQkJfQorICAgICAgICAgICAgcERldmljZS0+RHJhd1BhdGgoJnBhdGhVbmRlcmxpbmUsIHBVc2VyMkRldmljZSwgTlVMTCwgY3JDdXJUZXh0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhGSUxMX1dJTkRJTkcpOworICAgICAgICAgIH0KIAotCQkJCQlvbGRwbGFjZSA9IHBsYWNlOwkJCQkJCi0JCQkJfQotCQkJfQorICAgICAgICAgIGlmICh3b3JkLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9DUk9TU09VVCkgeworICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGhDcm9zc291dDsKKyAgICAgICAgICAgIENQREZfUmVjdCByY0Nyb3Nzb3V0ID0gR2V0Q3Jvc3NvdXRSZWN0KHdvcmQpOworICAgICAgICAgICAgcGF0aENyb3Nzb3V0LkFwcGVuZFJlY3QocmNDcm9zc291dC5sZWZ0LCByY0Nyb3Nzb3V0LmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ3Jvc3NvdXQucmlnaHQsIHJjQ3Jvc3NvdXQudG9wKTsKIAotCQkJaWYgKHNUZXh0QnVmLkdldExlbmd0aCgpID4gMCkKLQkJCXsJCQkJCi0JCQkJRHJhd1RleHRTdHJpbmcocERldmljZSwgQ1BERl9Qb2ludChwdEJULngrcHRPZmZzZXQueCwgcHRCVC55K3B0T2Zmc2V0LnkpLCBwRm9udE1hcC0+R2V0UERGRm9udCh3cC5uRm9udEluZGV4KSwKLQkJCQkJd3AuZkZvbnRTaXplLCBwVXNlcjJEZXZpY2UsIHNUZXh0QnVmLkdldEJ5dGVTdHJpbmcoKSwgY3JPbGQsIDAsIHdwLm5Ib3J6U2NhbGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXBEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOworICAgICAgICAgICAgcERldmljZS0+RHJhd1BhdGgoJnBhdGhDcm9zc291dCwgcFVzZXIyRGV2aWNlLCBOVUxMLCBjckN1clRleHQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEZJTExfV0lORElORyk7CisgICAgICAgICAgfQorCisgICAgICAgICAgb2xkcGxhY2UgPSBwbGFjZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoc1RleHRCdWYuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIERyYXdUZXh0U3RyaW5nKAorICAgICAgICAgICAgcERldmljZSwgQ1BERl9Qb2ludChwdEJULnggKyBwdE9mZnNldC54LCBwdEJULnkgKyBwdE9mZnNldC55KSwKKyAgICAgICAgICAgIHBGb250TWFwLT5HZXRQREZGb250KHdwLm5Gb250SW5kZXgpLCB3cC5mRm9udFNpemUsIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgIHNUZXh0QnVmLkdldEJ5dGVTdHJpbmcoKSwgY3JPbGQsIDAsIHdwLm5Ib3J6U2NhbGUpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHBEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwogfQogCi1zdGF0aWMgdm9pZCBBZGRSZWN0VG9QYWdlT2JqZWN0cyhDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9ianMsIEZYX0NPTE9SUkVGIGNyRmlsbCwgY29uc3QgQ1BERl9SZWN0JiByY0ZpbGwpCi17Ci0JQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiA9IG5ldyBDUERGX1BhdGhPYmplY3Q7Ci0JQ1BERl9QYXRoRGF0YSogcFBhdGhEYXRhID0gcFBhdGhPYmotPm1fUGF0aC5HZXRNb2RpZnkoKTsKLQlwUGF0aERhdGEtPkFwcGVuZFJlY3QocmNGaWxsLmxlZnQscmNGaWxsLmJvdHRvbSxyY0ZpbGwucmlnaHQscmNGaWxsLnRvcCk7CQotCQotCUZYX0ZMT0FUIHJnYlszXTsKLQlyZ2JbMF0gPSBGWEFSR0JfUihjckZpbGwpIC8gMjU1LjBmIDsKLQlyZ2JbMV0gPSBGWEFSR0JfRyhjckZpbGwpIC8gMjU1LjBmOwotCXJnYlsyXSA9IEZYQVJHQl9CKGNyRmlsbCkgLyAyNTUuMGY7Ci0JcFBhdGhPYmotPm1fQ29sb3JTdGF0ZS5TZXRGaWxsQ29sb3IoQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRVJHQiksIHJnYiwgMyk7CitzdGF0aWMgdm9pZCBBZGRSZWN0VG9QYWdlT2JqZWN0cyhDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9ianMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DT0xPUlJFRiBjckZpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJjRmlsbCkgeworICBDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqID0gbmV3IENQREZfUGF0aE9iamVjdDsKKyAgQ1BERl9QYXRoRGF0YSogcFBhdGhEYXRhID0gcFBhdGhPYmotPm1fUGF0aC5HZXRNb2RpZnkoKTsKKyAgcFBhdGhEYXRhLT5BcHBlbmRSZWN0KHJjRmlsbC5sZWZ0LCByY0ZpbGwuYm90dG9tLCByY0ZpbGwucmlnaHQsIHJjRmlsbC50b3ApOwogCi0JcFBhdGhPYmotPm1fRmlsbFR5cGUgPSBGWEZJTExfQUxURVJOQVRFOwotCXBQYXRoT2JqLT5tX2JTdHJva2UgPSBGQUxTRTsKKyAgRlhfRkxPQVQgcmdiWzNdOworICByZ2JbMF0gPSBGWEFSR0JfUihjckZpbGwpIC8gMjU1LjBmOworICByZ2JbMV0gPSBGWEFSR0JfRyhjckZpbGwpIC8gMjU1LjBmOworICByZ2JbMl0gPSBGWEFSR0JfQihjckZpbGwpIC8gMjU1LjBmOworICBwUGF0aE9iai0+bV9Db2xvclN0YXRlLlNldEZpbGxDb2xvcigKKyAgICAgIENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VSR0IpLCByZ2IsIDMpOwogCi0JcFBhZ2VPYmpzLT5JbnNlcnRPYmplY3QocFBhZ2VPYmpzLT5HZXRMYXN0T2JqZWN0UG9zaXRpb24oKSxwUGF0aE9iaik7CisgIHBQYXRoT2JqLT5tX0ZpbGxUeXBlID0gRlhGSUxMX0FMVEVSTkFURTsKKyAgcFBhdGhPYmotPm1fYlN0cm9rZSA9IEZBTFNFOworCisgIHBQYWdlT2Jqcy0+SW5zZXJ0T2JqZWN0KHBQYWdlT2Jqcy0+R2V0TGFzdE9iamVjdFBvc2l0aW9uKCksIHBQYXRoT2JqKTsKIH0KIAotc3RhdGljIENQREZfVGV4dE9iamVjdCogQWRkVGV4dE9ialRvUGFnZU9iamVjdHMoQ1BERl9QYWdlT2JqZWN0cyogcFBhZ2VPYmpzLCBGWF9DT0xPUlJFRiBjclRleHQsIAotCQkJCQkJCSBDUERGX0ZvbnQqIHBGb250LCBGWF9GTE9BVCBmRm9udFNpemUsIEZYX0ZMT0FUIGZDaGFyU3BhY2UsIEZYX0lOVDMyIG5Ib3J6U2NhbGUsIAotCQkJCQkJCSBjb25zdCBDUERGX1BvaW50JiBwb2ludCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHRleHQpCi17Ci0JQ1BERl9UZXh0T2JqZWN0KiBwVHh0T2JqID0gbmV3IENQREZfVGV4dE9iamVjdDsKLQkJCQotCUNQREZfVGV4dFN0YXRlRGF0YSogcFRleHRTdGF0ZURhdGEgPSBwVHh0T2JqLT5tX1RleHRTdGF0ZS5HZXRNb2RpZnkoKTsKLQlwVGV4dFN0YXRlRGF0YS0+bV9wRm9udCA9IHBGb250OwotCXBUZXh0U3RhdGVEYXRhLT5tX0ZvbnRTaXplID0gZkZvbnRTaXplOwotCXBUZXh0U3RhdGVEYXRhLT5tX0NoYXJTcGFjZSA9IGZDaGFyU3BhY2U7Ci0JcFRleHRTdGF0ZURhdGEtPm1fV29yZFNwYWNlID0gMDsKLQlwVGV4dFN0YXRlRGF0YS0+bV9UZXh0TW9kZSAgPSAwOwotCXBUZXh0U3RhdGVEYXRhLT5tX01hdHJpeFswXSA9IG5Ib3J6U2NhbGUgLyAxMDAuMGY7Ci0JcFRleHRTdGF0ZURhdGEtPm1fTWF0cml4WzFdID0gMDsKLQlwVGV4dFN0YXRlRGF0YS0+bV9NYXRyaXhbMl0gPSAwOwotCXBUZXh0U3RhdGVEYXRhLT5tX01hdHJpeFszXSA9IDE7CitzdGF0aWMgQ1BERl9UZXh0T2JqZWN0KiBBZGRUZXh0T2JqVG9QYWdlT2JqZWN0cyhDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9ianMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DT0xPUlJFRiBjclRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNoYXJTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkhvcnpTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHRleHQpIHsKKyAgQ1BERl9UZXh0T2JqZWN0KiBwVHh0T2JqID0gbmV3IENQREZfVGV4dE9iamVjdDsKIAotCUZYX0ZMT0FUIHJnYlszXTsKLQlyZ2JbMF0gPSBGWEFSR0JfUihjclRleHQpIC8gMjU1LjBmIDsKLQlyZ2JbMV0gPSBGWEFSR0JfRyhjclRleHQpIC8gMjU1LjBmOwotCXJnYlsyXSA9IEZYQVJHQl9CKGNyVGV4dCkgLyAyNTUuMGY7Ci0JcFR4dE9iai0+bV9Db2xvclN0YXRlLlNldEZpbGxDb2xvcihDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFUkdCKSxyZ2IsIDMpOwotCXBUeHRPYmotPm1fQ29sb3JTdGF0ZS5TZXRTdHJva2VDb2xvcihDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFUkdCKSxyZ2IsIDMpOworICBDUERGX1RleHRTdGF0ZURhdGEqIHBUZXh0U3RhdGVEYXRhID0gcFR4dE9iai0+bV9UZXh0U3RhdGUuR2V0TW9kaWZ5KCk7CisgIHBUZXh0U3RhdGVEYXRhLT5tX3BGb250ID0gcEZvbnQ7CisgIHBUZXh0U3RhdGVEYXRhLT5tX0ZvbnRTaXplID0gZkZvbnRTaXplOworICBwVGV4dFN0YXRlRGF0YS0+bV9DaGFyU3BhY2UgPSBmQ2hhclNwYWNlOworICBwVGV4dFN0YXRlRGF0YS0+bV9Xb3JkU3BhY2UgPSAwOworICBwVGV4dFN0YXRlRGF0YS0+bV9UZXh0TW9kZSA9IDA7CisgIHBUZXh0U3RhdGVEYXRhLT5tX01hdHJpeFswXSA9IG5Ib3J6U2NhbGUgLyAxMDAuMGY7CisgIHBUZXh0U3RhdGVEYXRhLT5tX01hdHJpeFsxXSA9IDA7CisgIHBUZXh0U3RhdGVEYXRhLT5tX01hdHJpeFsyXSA9IDA7CisgIHBUZXh0U3RhdGVEYXRhLT5tX01hdHJpeFszXSA9IDE7CiAKLQlwVHh0T2JqLT5TZXRQb3NpdGlvbihwb2ludC54LHBvaW50LnkpOwotCXBUeHRPYmotPlNldFRleHQodGV4dCk7CQorICBGWF9GTE9BVCByZ2JbM107CisgIHJnYlswXSA9IEZYQVJHQl9SKGNyVGV4dCkgLyAyNTUuMGY7CisgIHJnYlsxXSA9IEZYQVJHQl9HKGNyVGV4dCkgLyAyNTUuMGY7CisgIHJnYlsyXSA9IEZYQVJHQl9CKGNyVGV4dCkgLyAyNTUuMGY7CisgIHBUeHRPYmotPm1fQ29sb3JTdGF0ZS5TZXRGaWxsQ29sb3IoCisgICAgICBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFUkdCKSwgcmdiLCAzKTsKKyAgcFR4dE9iai0+bV9Db2xvclN0YXRlLlNldFN0cm9rZUNvbG9yKAorICAgICAgQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRVJHQiksIHJnYiwgMyk7CiAKLQlwUGFnZU9ianMtPkluc2VydE9iamVjdChwUGFnZU9ianMtPkdldExhc3RPYmplY3RQb3NpdGlvbigpLHBUeHRPYmopOworICBwVHh0T2JqLT5TZXRQb3NpdGlvbihwb2ludC54LCBwb2ludC55KTsKKyAgcFR4dE9iai0+U2V0VGV4dCh0ZXh0KTsKIAotCXJldHVybiBwVHh0T2JqOworICBwUGFnZU9ianMtPkluc2VydE9iamVjdChwUGFnZU9ianMtPkdldExhc3RPYmplY3RQb3NpdGlvbigpLCBwVHh0T2JqKTsKKworICByZXR1cm4gcFR4dE9iajsKIH0KIAotdm9pZCBJRlhfRWRpdDo6R2VuZXJhdGVQYWdlT2JqZWN0cyhDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9iamVjdHMsIElGWF9FZGl0KiBwRWRpdCwKLQkJCQkJCQkJICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsIEZYX0NPTE9SUkVGIGNyVGV4dCwgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9UZXh0T2JqZWN0Kj4mIE9iakFycmF5KQotewotCUZYX0ZMT0FUIGZGb250U2l6ZSA9IHBFZGl0LT5HZXRGb250U2l6ZSgpOwordm9pZCBJRlhfRWRpdDo6R2VuZXJhdGVQYWdlT2JqZWN0cygKKyAgICBDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9iamVjdHMsCisgICAgSUZYX0VkaXQqIHBFZGl0LAorICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LAorICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsCisgICAgRlhfQ09MT1JSRUYgY3JUZXh0LAorICAgIENGWF9BcnJheVRlbXBsYXRlPENQREZfVGV4dE9iamVjdCo+JiBPYmpBcnJheSkgeworICBGWF9GTE9BVCBmRm9udFNpemUgPSBwRWRpdC0+R2V0Rm9udFNpemUoKTsKIAotCUZYX0lOVDMyIG5PbGRGb250SW5kZXggPSAtMTsKKyAgaW50MzJfdCBuT2xkRm9udEluZGV4ID0gLTE7CiAKLQlDRlhfQnl0ZVRleHRCdWYgc1RleHRCdWY7Ci0JQ1BERl9Qb2ludCBwdEJUKDAuMGYsMC4wZik7CisgIENGWF9CeXRlVGV4dEJ1ZiBzVGV4dEJ1ZjsKKyAgQ1BERl9Qb2ludCBwdEJUKDAuMGYsIDAuMGYpOwogCi0JT2JqQXJyYXkuUmVtb3ZlQWxsKCk7CisgIE9iakFycmF5LlJlbW92ZUFsbCgpOwogCi0JaWYgKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBwRWRpdC0+R2V0SXRlcmF0b3IoKSkKLQl7Ci0JCWlmIChJRlhfRWRpdF9Gb250TWFwKiBwRm9udE1hcCA9IHBFZGl0LT5HZXRGb250TWFwKCkpCi0JCXsKLQkJCWlmIChwUmFuZ2UpCi0JCQkJcEl0ZXJhdG9yLT5TZXRBdChwUmFuZ2UtPkJlZ2luUG9zKTsKLQkJCWVsc2UKLQkJCQlwSXRlcmF0b3ItPlNldEF0KDApOworICBpZiAoSUZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IHBFZGl0LT5HZXRJdGVyYXRvcigpKSB7CisgICAgaWYgKElGWF9FZGl0X0ZvbnRNYXAqIHBGb250TWFwID0gcEVkaXQtPkdldEZvbnRNYXAoKSkgeworICAgICAgaWYgKHBSYW5nZSkKKyAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdChwUmFuZ2UtPkJlZ2luUG9zKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdCgwKTsKIAotCQkJQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2U7CQkJCisgICAgICBDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZTsKIAotCQkJd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkKLQkJCXsKLQkJCQlDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKLQkJCQlpZiAocFJhbmdlICYmIHBsYWNlLldvcmRDbXAocFJhbmdlLT5FbmRQb3MpID4gMCkgYnJlYWs7Ci0JCQkJCi0JCQkJQ1BWVF9Xb3JkIHdvcmQ7CQkJCQotCQkJCWlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpCi0JCQkJewotCQkJCQlpZiAocGxhY2UuTGluZUNtcChvbGRwbGFjZSkgIT0gMCB8fCBuT2xkRm9udEluZGV4ICE9IHdvcmQubkZvbnRJbmRleCkKLQkJCQkJewotCQkJCQkJaWYgKHNUZXh0QnVmLkdldExlbmd0aCgpID4gMCkKLQkJCQkJCXsKLQkJCQkJCQlPYmpBcnJheS5BZGQoQWRkVGV4dE9ialRvUGFnZU9iamVjdHMocFBhZ2VPYmplY3RzLCBjclRleHQsIHBGb250TWFwLT5HZXRQREZGb250KG5PbGRGb250SW5kZXgpLCBmRm9udFNpemUsIDAuMGYsIDEwMCwKLQkJCQkJCQkJQ1BERl9Qb2ludChwdEJULngrcHRPZmZzZXQueCwgcHRCVC55K3B0T2Zmc2V0LnkpLCBzVGV4dEJ1Zi5HZXRCeXRlU3RyaW5nKCkpKTsKKyAgICAgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpIHsKKyAgICAgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7CisgICAgICAgIGlmIChwUmFuZ2UgJiYgcGxhY2UuV29yZENtcChwUmFuZ2UtPkVuZFBvcykgPiAwKQorICAgICAgICAgIGJyZWFrOwogCi0JCQkJCQkJc1RleHRCdWYuQ2xlYXIoKTsKLQkJCQkJCX0KKyAgICAgICAgQ1BWVF9Xb3JkIHdvcmQ7CisgICAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKKyAgICAgICAgICBpZiAocGxhY2UuTGluZUNtcChvbGRwbGFjZSkgIT0gMCB8fAorICAgICAgICAgICAgICBuT2xkRm9udEluZGV4ICE9IHdvcmQubkZvbnRJbmRleCkgeworICAgICAgICAgICAgaWYgKHNUZXh0QnVmLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICBPYmpBcnJheS5BZGQoQWRkVGV4dE9ialRvUGFnZU9iamVjdHMoCisgICAgICAgICAgICAgICAgICBwUGFnZU9iamVjdHMsIGNyVGV4dCwgcEZvbnRNYXAtPkdldFBERkZvbnQobk9sZEZvbnRJbmRleCksCisgICAgICAgICAgICAgICAgICBmRm9udFNpemUsIDAuMGYsIDEwMCwKKyAgICAgICAgICAgICAgICAgIENQREZfUG9pbnQocHRCVC54ICsgcHRPZmZzZXQueCwgcHRCVC55ICsgcHRPZmZzZXQueSksCisgICAgICAgICAgICAgICAgICBzVGV4dEJ1Zi5HZXRCeXRlU3RyaW5nKCkpKTsKIAotCQkJCQkJcHRCVCA9IHdvcmQucHRXb3JkOwotCQkJCQkJbk9sZEZvbnRJbmRleCA9IHdvcmQubkZvbnRJbmRleDsKLQkJCQkJfQorICAgICAgICAgICAgICBzVGV4dEJ1Zi5DbGVhcigpOworICAgICAgICAgICAgfQogCi0JCQkJCXNUZXh0QnVmIDw8IEdldFBERldvcmRTdHJpbmcocEZvbnRNYXAsIHdvcmQubkZvbnRJbmRleCwgd29yZC5Xb3JkLCAwKTsKLQkJCQkJb2xkcGxhY2UgPSBwbGFjZTsJCQkJCQotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgIHB0QlQgPSB3b3JkLnB0V29yZDsKKyAgICAgICAgICAgIG5PbGRGb250SW5kZXggPSB3b3JkLm5Gb250SW5kZXg7CisgICAgICAgICAgfQogCi0JCQlpZiAoc1RleHRCdWYuR2V0TGVuZ3RoKCkgPiAwKQotCQkJewkJCQkKLQkJCQlPYmpBcnJheS5BZGQoQWRkVGV4dE9ialRvUGFnZU9iamVjdHMocFBhZ2VPYmplY3RzLCBjclRleHQsIHBGb250TWFwLT5HZXRQREZGb250KG5PbGRGb250SW5kZXgpLCBmRm9udFNpemUsIDAuMGYsIDEwMCwKLQkJCQkJQ1BERl9Qb2ludChwdEJULngrcHRPZmZzZXQueCwgcHRCVC55K3B0T2Zmc2V0LnkpLCBzVGV4dEJ1Zi5HZXRCeXRlU3RyaW5nKCkpKTsKLQkJCX0KLQkJfQotCX0KKyAgICAgICAgICBzVGV4dEJ1ZiA8PCBHZXRQREZXb3JkU3RyaW5nKHBGb250TWFwLCB3b3JkLm5Gb250SW5kZXgsIHdvcmQuV29yZCwgMCk7CisgICAgICAgICAgb2xkcGxhY2UgPSBwbGFjZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoc1RleHRCdWYuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIE9iakFycmF5LkFkZChBZGRUZXh0T2JqVG9QYWdlT2JqZWN0cygKKyAgICAgICAgICAgIHBQYWdlT2JqZWN0cywgY3JUZXh0LCBwRm9udE1hcC0+R2V0UERGRm9udChuT2xkRm9udEluZGV4KSwKKyAgICAgICAgICAgIGZGb250U2l6ZSwgMC4wZiwgMTAwLAorICAgICAgICAgICAgQ1BERl9Qb2ludChwdEJULnggKyBwdE9mZnNldC54LCBwdEJULnkgKyBwdE9mZnNldC55KSwKKyAgICAgICAgICAgIHNUZXh0QnVmLkdldEJ5dGVTdHJpbmcoKSkpOworICAgICAgfQorICAgIH0KKyAgfQogfQogCi12b2lkIElGWF9FZGl0OjpHZW5lcmF0ZVJpY2hQYWdlT2JqZWN0cyhDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9iamVjdHMsIElGWF9FZGl0KiBwRWRpdCwKLQkJCQkJCQkJICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsIENGWF9BcnJheVRlbXBsYXRlPENQREZfVGV4dE9iamVjdCo+JiBPYmpBcnJheSkKLXsKK3ZvaWQgSUZYX0VkaXQ6OkdlbmVyYXRlUmljaFBhZ2VPYmplY3RzKAorICAgIENQREZfUGFnZU9iamVjdHMqIHBQYWdlT2JqZWN0cywKKyAgICBJRlhfRWRpdCogcEVkaXQsCisgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsCisgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSwKKyAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX1RleHRPYmplY3QqPiYgT2JqQXJyYXkpIHsKKyAgRlhfQ09MT1JSRUYgY3JDdXJUZXh0ID0gQXJnYkVuY29kZSgyNTUsIDAsIDAsIDApOworICBGWF9DT0xPUlJFRiBjck9sZCA9IGNyQ3VyVGV4dDsKIAorICBDRlhfQnl0ZVRleHRCdWYgc1RleHRCdWY7CisgIENQVlRfV29yZFByb3BzIHdwOworICBDUERGX1BvaW50IHB0QlQoMC4wZiwgMC4wZik7CiAKLQlGWF9DT0xPUlJFRiBjckN1clRleHQgPSBBcmdiRW5jb2RlKDI1NSwgMCwgMCwgMCk7Ci0JRlhfQ09MT1JSRUYgY3JPbGQgPSBjckN1clRleHQ7CisgIE9iakFycmF5LlJlbW92ZUFsbCgpOwogCisgIGlmIChJRlhfRWRpdF9JdGVyYXRvciogcEl0ZXJhdG9yID0gcEVkaXQtPkdldEl0ZXJhdG9yKCkpIHsKKyAgICBpZiAoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXAgPSBwRWRpdC0+R2V0Rm9udE1hcCgpKSB7CisgICAgICBpZiAocFJhbmdlKQorICAgICAgICBwSXRlcmF0b3ItPlNldEF0KHBSYW5nZS0+QmVnaW5Qb3MpOworICAgICAgZWxzZQorICAgICAgICBwSXRlcmF0b3ItPlNldEF0KDApOwogCi0JQ0ZYX0J5dGVUZXh0QnVmIHNUZXh0QnVmOwotCUNQVlRfV29yZFByb3BzIHdwOwotCUNQREZfUG9pbnQgcHRCVCgwLjBmLDAuMGYpOworICAgICAgQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2U7CiAKLQlPYmpBcnJheS5SZW1vdmVBbGwoKTsKKyAgICAgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpIHsKKyAgICAgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7CisgICAgICAgIGlmIChwUmFuZ2UgJiYgcGxhY2UuV29yZENtcChwUmFuZ2UtPkVuZFBvcykgPiAwKQorICAgICAgICAgIGJyZWFrOwogCi0JaWYgKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBwRWRpdC0+R2V0SXRlcmF0b3IoKSkKLQl7Ci0JCWlmIChJRlhfRWRpdF9Gb250TWFwKiBwRm9udE1hcCA9IHBFZGl0LT5HZXRGb250TWFwKCkpCi0JCXsKLQkJCWlmIChwUmFuZ2UpCi0JCQkJcEl0ZXJhdG9yLT5TZXRBdChwUmFuZ2UtPkJlZ2luUG9zKTsKLQkJCWVsc2UKLQkJCQlwSXRlcmF0b3ItPlNldEF0KDApOworICAgICAgICBDUFZUX1dvcmQgd29yZDsKKyAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgeworICAgICAgICAgIHdvcmQuV29yZFByb3BzLmZGb250U2l6ZSA9IHdvcmQuZkZvbnRTaXplOwogCi0JCQlDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZTsJCQkKKyAgICAgICAgICBjckN1clRleHQgPSBBcmdiRW5jb2RlKDI1NSwgd29yZC5Xb3JkUHJvcHMuZHdXb3JkQ29sb3IpOwogCi0JCQl3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKQotCQkJewotCQkJCUNQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOwotCQkJCWlmIChwUmFuZ2UgJiYgcGxhY2UuV29yZENtcChwUmFuZ2UtPkVuZFBvcykgPiAwKSBicmVhazsKLQkJCQkKLQkJCQlDUFZUX1dvcmQgd29yZDsJCQkJCi0JCQkJaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkKLQkJCQl7Ci0JCQkJCXdvcmQuV29yZFByb3BzLmZGb250U2l6ZSA9IHdvcmQuZkZvbnRTaXplOworICAgICAgICAgIGlmIChwbGFjZS5MaW5lQ21wKG9sZHBsYWNlKSAhPSAwIHx8CisgICAgICAgICAgICAgIHdvcmQuV29yZFByb3BzLmZDaGFyU3BhY2UgPiAwLjBmIHx8CisgICAgICAgICAgICAgIHdvcmQuV29yZFByb3BzLm5Ib3J6U2NhbGUgIT0gMTAwIHx8CisgICAgICAgICAgICAgIEZYU1lTX21lbWNtcCgmd29yZC5Xb3JkUHJvcHMsICZ3cCwgc2l6ZW9mKENQVlRfV29yZFByb3BzKSkgIT0gMCB8fAorICAgICAgICAgICAgICBjck9sZCAhPSBjckN1clRleHQpIHsKKyAgICAgICAgICAgIGlmIChzVGV4dEJ1Zi5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgT2JqQXJyYXkuQWRkKEFkZFRleHRPYmpUb1BhZ2VPYmplY3RzKAorICAgICAgICAgICAgICAgICAgcFBhZ2VPYmplY3RzLCBjck9sZCwgcEZvbnRNYXAtPkdldFBERkZvbnQod3AubkZvbnRJbmRleCksCisgICAgICAgICAgICAgICAgICB3cC5mRm9udFNpemUsIHdwLmZDaGFyU3BhY2UsIHdwLm5Ib3J6U2NhbGUsCisgICAgICAgICAgICAgICAgICBDUERGX1BvaW50KHB0QlQueCArIHB0T2Zmc2V0LngsIHB0QlQueSArIHB0T2Zmc2V0LnkpLAorICAgICAgICAgICAgICAgICAgc1RleHRCdWYuR2V0Qnl0ZVN0cmluZygpKSk7CiAKLQkJCQkJY3JDdXJUZXh0ID0gQXJnYkVuY29kZSgyNTUsd29yZC5Xb3JkUHJvcHMuZHdXb3JkQ29sb3IpOworICAgICAgICAgICAgICBzVGV4dEJ1Zi5DbGVhcigpOworICAgICAgICAgICAgfQogCi0JCQkJCWlmIChwbGFjZS5MaW5lQ21wKG9sZHBsYWNlKSAhPSAwIHx8IHdvcmQuV29yZFByb3BzLmZDaGFyU3BhY2UgPiAwLjBmIHx8IHdvcmQuV29yZFByb3BzLm5Ib3J6U2NhbGUgIT0gMTAwIHx8IAotCQkJCQkJRlhTWVNfbWVtY21wKCZ3b3JkLldvcmRQcm9wcywgJndwLCBzaXplb2YoQ1BWVF9Xb3JkUHJvcHMpKSAhPSAwIHx8IAotCQkJCQkJY3JPbGQgIT0gY3JDdXJUZXh0KQotCQkJCQl7Ci0JCQkJCQlpZiAoc1RleHRCdWYuR2V0TGVuZ3RoKCkgPiAwKQotCQkJCQkJewotCQkJCQkJCU9iakFycmF5LkFkZChBZGRUZXh0T2JqVG9QYWdlT2JqZWN0cyhwUGFnZU9iamVjdHMsIGNyT2xkLCBwRm9udE1hcC0+R2V0UERGRm9udCh3cC5uRm9udEluZGV4KSwgd3AuZkZvbnRTaXplLCB3cC5mQ2hhclNwYWNlLCB3cC5uSG9yelNjYWxlLAotCQkJCQkJCQlDUERGX1BvaW50KHB0QlQueCtwdE9mZnNldC54LCBwdEJULnkrcHRPZmZzZXQueSksIHNUZXh0QnVmLkdldEJ5dGVTdHJpbmcoKSkpOworICAgICAgICAgICAgd3AgPSB3b3JkLldvcmRQcm9wczsKKyAgICAgICAgICAgIHB0QlQgPSB3b3JkLnB0V29yZDsKKyAgICAgICAgICAgIGNyT2xkID0gY3JDdXJUZXh0OworICAgICAgICAgIH0KIAotCQkJCQkJCXNUZXh0QnVmLkNsZWFyKCk7Ci0JCQkJCQl9CisgICAgICAgICAgc1RleHRCdWYgPDwgR2V0UERGV29yZFN0cmluZyhwRm9udE1hcCwgd29yZC5Xb3JkUHJvcHMubkZvbnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQuV29yZCwgMCk7CiAKLQkJCQkJCXdwID0gd29yZC5Xb3JkUHJvcHM7Ci0JCQkJCQlwdEJUID0gd29yZC5wdFdvcmQ7Ci0JCQkJCQljck9sZCA9IGNyQ3VyVGV4dDsKLQkKLQkJCQkJfQorICAgICAgICAgIGlmICh3b3JkLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9VTkRFUkxJTkUpIHsKKyAgICAgICAgICAgIENQREZfUmVjdCByY1VuZGVybGluZSA9IEdldFVuZGVyTGluZVJlY3Qod29yZCk7CisgICAgICAgICAgICByY1VuZGVybGluZS5sZWZ0ICs9IHB0T2Zmc2V0Lng7CisgICAgICAgICAgICByY1VuZGVybGluZS5yaWdodCArPSBwdE9mZnNldC54OworICAgICAgICAgICAgcmNVbmRlcmxpbmUudG9wICs9IHB0T2Zmc2V0Lnk7CisgICAgICAgICAgICByY1VuZGVybGluZS5ib3R0b20gKz0gcHRPZmZzZXQueTsKIAotCQkJCQlzVGV4dEJ1ZiA8PCBHZXRQREZXb3JkU3RyaW5nKHBGb250TWFwLCB3b3JkLldvcmRQcm9wcy5uRm9udEluZGV4LCB3b3JkLldvcmQsIDApOwkKLQkJCQkJCi0JCQkJCWlmICh3b3JkLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9VTkRFUkxJTkUpCi0JCQkJCXsvKgotCQkJCQkJQWRkTGluZVRvUGFnZU9iamVjdHMocFBhZ2VPYmplY3RzLCBjckN1clRleHQsIAotCQkJCQkJCUNQREZfUG9pbnQod29yZC5wdFdvcmQueCwgd29yZC5wdFdvcmQueSArIHdvcmQuZkRlc2NlbnQgKiAwLjRmKSwKLQkJCQkJCQlDUERGX1BvaW50KHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aCwgd29yZC5wdFdvcmQueSArIHdvcmQuZkRlc2NlbnQgKiAwLjRmKSk7CQkJCQkJCQotKi8KLQkJCQkJCUNQREZfUmVjdCByY1VuZGVybGluZSA9IEdldFVuZGVyTGluZVJlY3Qod29yZCk7Ci0JCQkJCQlyY1VuZGVybGluZS5sZWZ0ICs9IHB0T2Zmc2V0Lng7Ci0JCQkJCQlyY1VuZGVybGluZS5yaWdodCArPSBwdE9mZnNldC54OwotCQkJCQkJcmNVbmRlcmxpbmUudG9wICs9IHB0T2Zmc2V0Lnk7Ci0JCQkJCQlyY1VuZGVybGluZS5ib3R0b20gKz0gcHRPZmZzZXQueTsKLQkJCQkJCQotCQkJCQkJQWRkUmVjdFRvUGFnZU9iamVjdHMocFBhZ2VPYmplY3RzLCBjckN1clRleHQsIHJjVW5kZXJsaW5lKTsJCQkJCQkJCi0JCQkJCX0KKyAgICAgICAgICAgIEFkZFJlY3RUb1BhZ2VPYmplY3RzKHBQYWdlT2JqZWN0cywgY3JDdXJUZXh0LCByY1VuZGVybGluZSk7CisgICAgICAgICAgfQogCi0JCQkJCWlmICh3b3JkLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9DUk9TU09VVCkKLQkJCQkJewotCQkJCQkJQ1BERl9SZWN0IHJjQ3Jvc3NvdXQgPSBHZXRDcm9zc291dFJlY3Qod29yZCk7Ci0JCQkJCQlyY0Nyb3Nzb3V0LmxlZnQgKz0gcHRPZmZzZXQueDsKLQkJCQkJCXJjQ3Jvc3NvdXQucmlnaHQgKz0gcHRPZmZzZXQueDsKLQkJCQkJCXJjQ3Jvc3NvdXQudG9wICs9IHB0T2Zmc2V0Lnk7Ci0JCQkJCQlyY0Nyb3Nzb3V0LmJvdHRvbSArPSBwdE9mZnNldC55OworICAgICAgICAgIGlmICh3b3JkLldvcmRQcm9wcy5uV29yZFN0eWxlICYgUFZUV09SRF9TVFlMRV9DUk9TU09VVCkgeworICAgICAgICAgICAgQ1BERl9SZWN0IHJjQ3Jvc3NvdXQgPSBHZXRDcm9zc291dFJlY3Qod29yZCk7CisgICAgICAgICAgICByY0Nyb3Nzb3V0LmxlZnQgKz0gcHRPZmZzZXQueDsKKyAgICAgICAgICAgIHJjQ3Jvc3NvdXQucmlnaHQgKz0gcHRPZmZzZXQueDsKKyAgICAgICAgICAgIHJjQ3Jvc3NvdXQudG9wICs9IHB0T2Zmc2V0Lnk7CisgICAgICAgICAgICByY0Nyb3Nzb3V0LmJvdHRvbSArPSBwdE9mZnNldC55OwogCi0JCQkJCQlBZGRSZWN0VG9QYWdlT2JqZWN0cyhwUGFnZU9iamVjdHMsIGNyQ3VyVGV4dCwgcmNDcm9zc291dCk7CQkJCQkJCi0JCQkJCX0KKyAgICAgICAgICAgIEFkZFJlY3RUb1BhZ2VPYmplY3RzKHBQYWdlT2JqZWN0cywgY3JDdXJUZXh0LCByY0Nyb3Nzb3V0KTsKKyAgICAgICAgICB9CiAKLQkJCQkJb2xkcGxhY2UgPSBwbGFjZTsJCQkJCQotCQkJCX0KLQkJCX0KKyAgICAgICAgICBvbGRwbGFjZSA9IHBsYWNlOworICAgICAgICB9CisgICAgICB9CiAKLQkJCWlmIChzVGV4dEJ1Zi5HZXRMZW5ndGgoKSA+IDApCi0JCQl7CQkJCQotCQkJCU9iakFycmF5LkFkZChBZGRUZXh0T2JqVG9QYWdlT2JqZWN0cyhwUGFnZU9iamVjdHMsIGNyT2xkLCBwRm9udE1hcC0+R2V0UERGRm9udCh3cC5uRm9udEluZGV4KSwgd3AuZkZvbnRTaXplLCB3cC5mQ2hhclNwYWNlLCB3cC5uSG9yelNjYWxlLAotCQkJCQlDUERGX1BvaW50KHB0QlQueCtwdE9mZnNldC54LCBwdEJULnkrcHRPZmZzZXQueSksIHNUZXh0QnVmLkdldEJ5dGVTdHJpbmcoKSkpOwotCQkJfQotCQl9Ci0JfQorICAgICAgaWYgKHNUZXh0QnVmLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICBPYmpBcnJheS5BZGQoQWRkVGV4dE9ialRvUGFnZU9iamVjdHMoCisgICAgICAgICAgICBwUGFnZU9iamVjdHMsIGNyT2xkLCBwRm9udE1hcC0+R2V0UERGRm9udCh3cC5uRm9udEluZGV4KSwKKyAgICAgICAgICAgIHdwLmZGb250U2l6ZSwgd3AuZkNoYXJTcGFjZSwgd3AubkhvcnpTY2FsZSwKKyAgICAgICAgICAgIENQREZfUG9pbnQocHRCVC54ICsgcHRPZmZzZXQueCwgcHRCVC55ICsgcHRPZmZzZXQueSksCisgICAgICAgICAgICBzVGV4dEJ1Zi5HZXRCeXRlU3RyaW5nKCkpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KIH0KIAotdm9pZCBJRlhfRWRpdDo6R2VuZXJhdGVVbmRlcmxpbmVPYmplY3RzKENQREZfUGFnZU9iamVjdHMqIHBQYWdlT2JqZWN0cywgSUZYX0VkaXQqIHBFZGl0LAotCQkJCQkJCQkgICBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSwgRlhfQ09MT1JSRUYgY29sb3IpCi17Cit2b2lkIElGWF9FZGl0OjpHZW5lcmF0ZVVuZGVybGluZU9iamVjdHMoQ1BERl9QYWdlT2JqZWN0cyogcFBhZ2VPYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9FZGl0KiBwRWRpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPTE9SUkVGIGNvbG9yKSB7CisgIGlmIChJRlhfRWRpdF9JdGVyYXRvciogcEl0ZXJhdG9yID0gcEVkaXQtPkdldEl0ZXJhdG9yKCkpIHsKKyAgICBpZiAocEVkaXQtPkdldEZvbnRNYXAoKSkgeworICAgICAgaWYgKHBSYW5nZSkKKyAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdChwUmFuZ2UtPkJlZ2luUG9zKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdCgwKTsKIAorICAgICAgQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2U7CiAKLQlpZiAoSUZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IHBFZGl0LT5HZXRJdGVyYXRvcigpKQotCXsKLQkJaWYgKHBFZGl0LT5HZXRGb250TWFwKCkpCi0JCXsKLQkJCWlmIChwUmFuZ2UpCi0JCQkJcEl0ZXJhdG9yLT5TZXRBdChwUmFuZ2UtPkJlZ2luUG9zKTsKLQkJCWVsc2UKLQkJCQlwSXRlcmF0b3ItPlNldEF0KDApOworICAgICAgd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkgeworICAgICAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKKyAgICAgICAgaWYgKHBSYW5nZSAmJiBwbGFjZS5Xb3JkQ21wKHBSYW5nZS0+RW5kUG9zKSA+IDApCisgICAgICAgICAgYnJlYWs7CiAKLQkJCUNQVlRfV29yZFBsYWNlIG9sZHBsYWNlOwkJCQotCi0JCQl3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKQotCQkJewotCQkJCUNQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOwotCQkJCWlmIChwUmFuZ2UgJiYgcGxhY2UuV29yZENtcChwUmFuZ2UtPkVuZFBvcykgPiAwKSBicmVhazsKLQkJCQkKLQkJCQlDUFZUX1dvcmQgd29yZDsJCQkJCi0JCQkJaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkKLQkJCQl7Ci0JCQkJCUNQREZfUmVjdCByY1VuZGVybGluZSA9IEdldFVuZGVyTGluZVJlY3Qod29yZCk7Ci0JCQkJCXJjVW5kZXJsaW5lLmxlZnQgKz0gcHRPZmZzZXQueDsKLQkJCQkJcmNVbmRlcmxpbmUucmlnaHQgKz0gcHRPZmZzZXQueDsKLQkJCQkJcmNVbmRlcmxpbmUudG9wICs9IHB0T2Zmc2V0Lnk7Ci0JCQkJCXJjVW5kZXJsaW5lLmJvdHRvbSArPSBwdE9mZnNldC55OwotCQkJCQlBZGRSZWN0VG9QYWdlT2JqZWN0cyhwUGFnZU9iamVjdHMsIGNvbG9yLCByY1VuZGVybGluZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQorICAgICAgICBDUFZUX1dvcmQgd29yZDsKKyAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgeworICAgICAgICAgIENQREZfUmVjdCByY1VuZGVybGluZSA9IEdldFVuZGVyTGluZVJlY3Qod29yZCk7CisgICAgICAgICAgcmNVbmRlcmxpbmUubGVmdCArPSBwdE9mZnNldC54OworICAgICAgICAgIHJjVW5kZXJsaW5lLnJpZ2h0ICs9IHB0T2Zmc2V0Lng7CisgICAgICAgICAgcmNVbmRlcmxpbmUudG9wICs9IHB0T2Zmc2V0Lnk7CisgICAgICAgICAgcmNVbmRlcmxpbmUuYm90dG9tICs9IHB0T2Zmc2V0Lnk7CisgICAgICAgICAgQWRkUmVjdFRvUGFnZU9iamVjdHMocFBhZ2VPYmplY3RzLCBjb2xvciwgcmNVbmRlcmxpbmUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvQ29uc3RzLmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvQ29uc3RzLmNwcAppbmRleCAxYjFjOGJhLi43ZjZiOGY4IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0NvbnN0cy5jcHAKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9Db25zdHMuY3BwCkBAIC0xLDI0NyArMSwyOTUgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KYXZhU2NyaXB0LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0RlZmluZS5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19PYmplY3QuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfVmFsdWUuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvQ29uc3RzLmgiCisjaW5jbHVkZSAiQ29uc3RzLmgiCisKKyNpbmNsdWRlICJKU19EZWZpbmUuaCIKKyNpbmNsdWRlICJKU19PYmplY3QuaCIKKyNpbmNsdWRlICJKU19WYWx1ZS5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBib3JkZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIEJFR0lOX0pTX1NUQVRJQ19DT05TVChDSlNfQm9yZGVyKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcocywJc29saWQpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhiLAliZXZlbGVkKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoZCwJZGFzaGVkKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoaSwJaW5zZXQpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyh1LAl1bmRlcmxpbmUpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKEwicyIsIEwic29saWQiKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhMImIiLCBMImJldmVsZWQiKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhMImQiLCBMImRhc2hlZCIpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKEwiaSIsIEwiaW5zZXQiKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhMInUiLCBMInVuZGVybGluZSIpCiBFTkRfSlNfU1RBVElDX0NPTlNUKCkKIAotSU1QTEVNRU5UX0pTX0NMQVNTX0NPTlNUKENKU19Cb3JkZXIsYm9yZGVyKQorSU1QTEVNRU5UX0pTX0NMQVNTX0NPTlNUKENKU19Cb3JkZXIsIGJvcmRlcikKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRpc3BsYXkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIEJFR0lOX0pTX1NUQVRJQ19DT05TVChDSlNfRGlzcGxheSkKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKHZpc2libGUsCTApCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX05VTUJFUihoaWRkZW4sCTEpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX05VTUJFUihub1ByaW50LAkyKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9OVU1CRVIobm9WaWV3LAkzKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX05VTUJFUihMInZpc2libGUiLCAwKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX05VTUJFUihMImhpZGRlbiIsIDEpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKEwibm9QcmludCIsIDIpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKEwibm9WaWV3IiwgMykKIEVORF9KU19TVEFUSUNfQ09OU1QoKQogCi1JTVBMRU1FTlRfSlNfQ0xBU1NfQ09OU1QoQ0pTX0Rpc3BsYXksZGlzcGxheSkKK0lNUExFTUVOVF9KU19DTEFTU19DT05TVChDSlNfRGlzcGxheSwgZGlzcGxheSkKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGZvbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIEJFR0lOX0pTX1NUQVRJQ19DT05TVChDSlNfRm9udCkKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKFRpbWVzLAkJVGltZXMtUm9tYW4pCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhUaW1lc0IsCVRpbWVzLUJvbGQpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhUaW1lc0ksCVRpbWVzLUl0YWxpYykKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKFRpbWVzQkksCVRpbWVzLUJvbGRJdGFsaWMpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhIZWx2LAkJSGVsdmV0aWNhKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoSGVsdkIsCQlIZWx2ZXRpY2EtQm9sZCkKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKEhlbHZJLAkJSGVsdmV0aWNhLU9ibGlxdWUpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhIZWx2QkksCUhlbHZldGljYS1Cb2xkT2JsaXF1ZSkKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKENvdXIsCQlDb3VyaWVyKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoQ291ckIsCQlDb3VyaWVyLUJvbGQpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhDb3VySSwJCUNvdXJpZXItT2JsaXF1ZSkKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKENvdXJCSSwJQ291cmllci1Cb2xkT2JsaXF1ZSkKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKFN5bWJvbCwJU3ltYm9sKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoWmFwZkQsCQlaYXBmRGluZ2JhdHMpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKEwiVGltZXMiLCBMIlRpbWVzLVJvbWFuIikKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoTCJUaW1lc0IiLCBMIlRpbWVzLUJvbGQiKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhMIlRpbWVzSSIsIEwiVGltZXMtSXRhbGljIikKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoTCJUaW1lc0JJIiwgTCJUaW1lcy1Cb2xkSXRhbGljIikKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoTCJIZWx2IiwgTCJIZWx2ZXRpY2EiKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhMIkhlbHZCIiwgTCJIZWx2ZXRpY2EtQm9sZCIpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKEwiSGVsdkkiLCBMIkhlbHZldGljYS1PYmxpcXVlIikKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoTCJIZWx2QkkiLCBMIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKEwiQ291ciIsIEwiQ291cmllciIpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKEwiQ291ckIiLCBMIkNvdXJpZXItQm9sZCIpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKEwiQ291ckkiLCBMIkNvdXJpZXItT2JsaXF1ZSIpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKEwiQ291ckJJIiwgTCJDb3VyaWVyLUJvbGRPYmxpcXVlIikKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoTCJTeW1ib2wiLCBMIlN5bWJvbCIpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKEwiWmFwZkQiLCBMIlphcGZEaW5nYmF0cyIpCiBFTkRfSlNfU1RBVElDX0NPTlNUKCkKIAotSU1QTEVNRU5UX0pTX0NMQVNTX0NPTlNUKENKU19Gb250LGZvbnQpCitJTVBMRU1FTlRfSlNfQ0xBU1NfQ09OU1QoQ0pTX0ZvbnQsIGZvbnQpCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBoaWdobGlnaHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIEJFR0lOX0pTX1NUQVRJQ19DT05TVChDSlNfSGlnaGxpZ2h0KQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcobiwJbm9uZSkKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKGksCWludmVydCkKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKHAsCXB1c2gpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhvLAlvdXRsaW5lKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhMIm4iLCBMIm5vbmUiKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhMImkiLCBMImludmVydCIpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKEwicCIsIEwicHVzaCIpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKEwibyIsIEwib3V0bGluZSIpCiBFTkRfSlNfU1RBVElDX0NPTlNUKCkKIAotSU1QTEVNRU5UX0pTX0NMQVNTX0NPTlNUKENKU19IaWdobGlnaHQsaGlnaGxpZ2h0KQorSU1QTEVNRU5UX0pTX0NMQVNTX0NPTlNUKENKU19IaWdobGlnaHQsIGhpZ2hsaWdodCkKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBvc2l0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBCRUdJTl9KU19TVEFUSUNfQ09OU1QoQ0pTX1Bvc2l0aW9uKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9OVU1CRVIodGV4dE9ubHksCQkwKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9OVU1CRVIoaWNvbk9ubHksCQkxKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9OVU1CRVIoaWNvblRleHRWLAkJMikKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKHRleHRJY29uViwJCTMpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX05VTUJFUihpY29uVGV4dEgsCQk0KQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9OVU1CRVIodGV4dEljb25ILAkJNSkKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKG92ZXJsYXksCQk2KQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX05VTUJFUihMInRleHRPbmx5IiwgMCkKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9OVU1CRVIoTCJpY29uT25seSIsIDEpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKEwiaWNvblRleHRWIiwgMikKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9OVU1CRVIoTCJ0ZXh0SWNvblYiLCAzKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX05VTUJFUihMImljb25UZXh0SCIsIDQpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKEwidGV4dEljb25IIiwgNSkKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9OVU1CRVIoTCJvdmVybGF5IiwgNikKIEVORF9KU19TVEFUSUNfQ09OU1QoKQogCi1JTVBMRU1FTlRfSlNfQ0xBU1NfQ09OU1QoQ0pTX1Bvc2l0aW9uLHBvc2l0aW9uKQorSU1QTEVNRU5UX0pTX0NMQVNTX0NPTlNUKENKU19Qb3NpdGlvbiwgcG9zaXRpb24pCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzY2FsZUhvdyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogQkVHSU5fSlNfU1RBVElDX0NPTlNUKENKU19TY2FsZUhvdykKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKHByb3BvcnRpb25hbCwJMCkKLQlKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKGFuYW1vcnBoaWMsCTEpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKEwicHJvcG9ydGlvbmFsIiwgMCkKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9OVU1CRVIoTCJhbmFtb3JwaGljIiwgMSkKIEVORF9KU19TVEFUSUNfQ09OU1QoKQogCi1JTVBMRU1FTlRfSlNfQ0xBU1NfQ09OU1QoQ0pTX1NjYWxlSG93LHNjYWxlSG93KQorSU1QTEVNRU5UX0pTX0NMQVNTX0NPTlNUKENKU19TY2FsZUhvdywgc2NhbGVIb3cpCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzY2FsZVdoZW4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIEJFR0lOX0pTX1NUQVRJQ19DT05TVChDSlNfU2NhbGVXaGVuKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9OVU1CRVIoYWx3YXlzLAkwKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9OVU1CRVIobmV2ZXIsCQkxKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9OVU1CRVIodG9vQmlnLAkyKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9OVU1CRVIodG9vU21hbGwsCTMpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKEwiYWx3YXlzIiwgMCkKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9OVU1CRVIoTCJuZXZlciIsIDEpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfTlVNQkVSKEwidG9vQmlnIiwgMikKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9OVU1CRVIoTCJ0b29TbWFsbCIsIDMpCiBFTkRfSlNfU1RBVElDX0NPTlNUKCkKIAotSU1QTEVNRU5UX0pTX0NMQVNTX0NPTlNUKENKU19TY2FsZVdoZW4sc2NhbGVXaGVuKQorSU1QTEVNRU5UX0pTX0NMQVNTX0NPTlNUKENKU19TY2FsZVdoZW4sIHNjYWxlV2hlbikKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHN0eWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBCRUdJTl9KU19TVEFUSUNfQ09OU1QoQ0pTX1N0eWxlKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoY2gsCWNoZWNrKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoY3IsCWNyb3NzKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoZGksCWRpYW1vbmQpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhjaSwJY2lyY2xlKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoc3QsCXN0YXIpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhzcSwJc3F1YXJlKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhMImNoIiwgTCJjaGVjayIpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKEwiY3IiLCBMImNyb3NzIikKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoTCJkaSIsIEwiZGlhbW9uZCIpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKEwiY2kiLCBMImNpcmNsZSIpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKEwic3QiLCBMInN0YXIiKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhMInNxIiwgTCJzcXVhcmUiKQogRU5EX0pTX1NUQVRJQ19DT05TVCgpCiAKLUlNUExFTUVOVF9KU19DTEFTU19DT05TVChDSlNfU3R5bGUsc3R5bGUpCi0KK0lNUExFTUVOVF9KU19DTEFTU19DT05TVChDSlNfU3R5bGUsIHN0eWxlKQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gem9vbXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIEJFR0lOX0pTX1NUQVRJQ19DT05TVChDSlNfWm9vbXR5cGUpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhub25lLAlOb1ZhcnkpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhmaXRQLAlGaXRQYWdlKQotCUpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoZml0VywJRml0V2lkdGgpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhmaXRILAlGaXRIZWlnaHQpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhmaXRWLAlGaXRWaXNpYmxlV2lkdGgpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhwcmVmLAlQcmVmZXJyZWQpCi0JSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhyZWZXLAlSZWZsb3dXaWR0aCkKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoTCJub25lIiwgTCJOb1ZhcnkiKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhMImZpdFAiLCBMIkZpdFBhZ2UiKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhMImZpdFciLCBMIkZpdFdpZHRoIikKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoTCJmaXRIIiwgTCJGaXRIZWlnaHQiKQorSlNfU1RBVElDX0NPTlNUX0VOVFJZX1NUUklORyhMImZpdFYiLCBMIkZpdFZpc2libGVXaWR0aCIpCitKU19TVEFUSUNfQ09OU1RfRU5UUllfU1RSSU5HKEwicHJlZiIsIEwiUHJlZmVycmVkIikKK0pTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoTCJyZWZXIiwgTCJSZWZsb3dXaWR0aCIpCiBFTkRfSlNfU1RBVElDX0NPTlNUKCkKIAotSU1QTEVNRU5UX0pTX0NMQVNTX0NPTlNUKENKU19ab29tdHlwZSx6b29tdHlwZSkKK0lNUExFTUVOVF9KU19DTEFTU19DT05TVChDSlNfWm9vbXR5cGUsIHpvb210eXBlKQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0pTX0dsb2JhbENvbnN0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDSlNfR2xvYmFsQ29uc3RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotaW50CUNKU19HbG9iYWxDb25zdHM6OkluaXQoSUpTX1J1bnRpbWUqIHBSdW50aW1lKQotewotCURFRklORV9HTE9CQUxfQ09OU1QocFJ1bnRpbWUsIElEU19HUkVBVEVSX1RIQU4gLCBJbnZhbGlkIHZhbHVlOiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcy4pOwotCURFRklORV9HTE9CQUxfQ09OU1QocFJ1bnRpbWUsIElEU19HVF9BTkRfTFQsSW52YWxpZCB2YWx1ZTogbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcy4pOwotCURFRklORV9HTE9CQUxfQ09OU1QocFJ1bnRpbWUsIElEU19MRVNTX1RIQU4sSW52YWxpZCB2YWx1ZTogbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMuKTsKLQlERUZJTkVfR0xPQkFMX0NPTlNUKHBSdW50aW1lLCBJRFNfSU5WQUxJRF9NT05USCwqKiBJbnZhbGlkICoqKTsKLQlERUZJTkVfR0xPQkFMX0NPTlNUKHBSdW50aW1lLCBJRFNfSU5WQUxJRF9EQVRFLEludmFsaWQgZGF0ZS90aW1lOiBwbGVhc2UgZW5zdXJlIHRoYXQgdGhlIGRhdGUvdGltZSBleGlzdHMuIEZpZWxkKTsKLQlERUZJTkVfR0xPQkFMX0NPTlNUKHBSdW50aW1lLCBJRFNfSU5WQUxJRF9WQUxVRSxUaGUgdmFsdWUgZW50ZXJlZCBkb2VzIG5vdCBtYXRjaCB0aGUgZm9ybWF0IG9mIHRoZSBmaWVsZCk7Ci0JREVGSU5FX0dMT0JBTF9DT05TVChwUnVudGltZSwgSURTX0FNLGFtKTsKLQlERUZJTkVfR0xPQkFMX0NPTlNUKHBSdW50aW1lLCBJRFNfUE0scG0pOwotCURFRklORV9HTE9CQUxfQ09OU1QocFJ1bnRpbWUsIElEU19NT05USF9JTkZPLEphbnVhcnlbMV1GZWJydWFyeVsyXU1hcmNoWzNdQXByaWxbNF1NYXlbNV1KdW5lWzZdSnVseVs3XUF1Z3VzdFs4XVNlcHRlbWJlcls5XU9jdG9iZXJbMTBdTm92ZW1iZXJbMTFdRGVjZW1iZXJbMTJdU2VwdFs5XUphblsxXUZlYlsyXU1hclszXUFwcls0XUp1bls2XUp1bFs3XUF1Z1s4XVNlcFs5XU9jdFsxMF1Ob3ZbMTFdRGVjWzEyXSk7Ci0JREVGSU5FX0dMT0JBTF9DT05TVChwUnVudGltZSwgSURTX1NUQVJUVVBfQ09OU09MRV9NU0csICoqIF5fXiAqKik7Ci0KLQlyZXR1cm4gMDsKK3N0YXRpYyB2b2lkIERlZmluZUdsb2JhbENvbnN0U3RyaW5nKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHBDb25zdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBwVmFsdWUpIHsKKyAgRlhKU19EZWZpbmVHbG9iYWxDb25zdChwUnVudGltZS0+R2V0SXNvbGF0ZSgpLCBwQ29uc3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNfTmV3U3RyaW5nKHBSdW50aW1lLT5HZXRJc29sYXRlKCksIHBWYWx1ZSkpOwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0pTX0dsb2JhbEFycmF5cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotaW50CUNKU19HbG9iYWxBcnJheXM6OkluaXQoSUpTX1J1bnRpbWUqIHBSdW50aW1lKQotewotCXsKLQkJRlhfTFBDV1NUUiBBcnJheU5hbWUgPSBMIlJFX05VTUJFUl9FTlRSWV9ET1RfU0VQIjsKLQkJRlhfTFBDV1NUUiBBcnJheUNvbnRlbnRbXSA9IHtMIlsrLV0/XFxkKlxcLj9cXGQqIn07Ci0JCURFRklORV9HTE9CQUxfQVJSQVkocFJ1bnRpbWUpOwotCX0KLQotCXsKLQkJRlhfTFBDV1NUUiBBcnJheU5hbWUgPSBMIlJFX05VTUJFUl9DT01NSVRfRE9UX1NFUCI7Ci0JCUZYX0xQQ1dTVFIgQXJyYXlDb250ZW50W10gPSB7IEwiWystXT9cXGQrKFxcLlxcZCspPyIsICAgICAgICAgICAgICAgIC8qIC0xLjAgb3IgLTEgKi8KLQkJCQkJCQkJCSAgTCJbKy1dP1xcLlxcZCsiLCAgICAgICAgICAgICAgICAgICAgICAgLyogLS4xICovCi0JCQkJCQkJCQkgIEwiWystXT9cXGQrXFwuIiAgICAgICAgICAgICAgICAgICAgICAgIC8qIC0xLiAqLwotCQkJCQkJCQkJfTsKLQkJREVGSU5FX0dMT0JBTF9BUlJBWShwUnVudGltZSk7Ci0JfQotCi0JewotCQlGWF9MUENXU1RSIEFycmF5TmFtZSA9IEwiUkVfTlVNQkVSX0VOVFJZX0NPTU1BX1NFUCI7Ci0JCUZYX0xQQ1dTVFIgQXJyYXlDb250ZW50W10gPSB7TCJbKy1dP1xcZCosP1xcZCoifTsKLQkJCi0JCURFRklORV9HTE9CQUxfQVJSQVkocFJ1bnRpbWUpOwotCX0KLQotCXsKLQkJRlhfTFBDV1NUUiBBcnJheU5hbWUgPSBMIlJFX05VTUJFUl9DT01NSVRfQ09NTUFfU0VQIjsKLQkJRlhfTFBDV1NUUiBBcnJheUNvbnRlbnRbXSA9IHsgTCJbKy1dP1xcZCsoWy4sXVxcZCspPyIsICAgICAgICAgICAgICAgLyogLTEsMCBvciAtMSAqLwotCQkJCQkJCQkJICBMIlsrLV0/Wy4sXVxcZCsiLCAgICAgICAgICAgICAgICAgICAvKiAtLDEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJbKy1dP1xcZCtbLixdIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtMSwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0JCURFRklORV9HTE9CQUxfQVJSQVkocFJ1bnRpbWUpOwotCX0KLQotCXsKLQkJRlhfTFBDV1NUUiBBcnJheU5hbWUgPSBMIlJFX1pJUF9FTlRSWSI7Ci0gICAgICAgIEZYX0xQQ1dTVFIgQXJyYXlDb250ZW50W10gPSB7TCJcXGR7MCw1fSJ9OwotCQlERUZJTkVfR0xPQkFMX0FSUkFZKHBSdW50aW1lKTsKLQl9Ci0KLQl7Ci0JCUZYX0xQQ1dTVFIgQXJyYXlOYW1lID0gTCJSRV9aSVBfQ09NTUlUIjsKLQkJRlhfTFBDV1NUUiBBcnJheUNvbnRlbnRbXSA9IHtMIlxcZHs1fSJ9OwotCQlERUZJTkVfR0xPQkFMX0FSUkFZKHBSdW50aW1lKTsKLQl9Ci0KLQl7Ci0JCUZYX0xQQ1dTVFIgQXJyYXlOYW1lID0gTCJSRV9aSVA0X0VOVFJZIjsKLQkJRlhfTFBDV1NUUiBBcnJheUNvbnRlbnRbXSA9IHtMIlxcZHswLDV9KFxcLnxbLSBdKT9cXGR7MCw0fSJ9OwotCQlERUZJTkVfR0xPQkFMX0FSUkFZKHBSdW50aW1lKTsKLQl9Ci0KLQl7Ci0JCUZYX0xQQ1dTVFIgQXJyYXlOYW1lID0gTCJSRV9aSVA0X0NPTU1JVCI7Ci0JCUZYX0xQQ1dTVFIgQXJyYXlDb250ZW50W10gPSB7TCJcXGR7NX0oXFwufFstIF0pP1xcZHs0fSJ9OwotCQlERUZJTkVfR0xPQkFMX0FSUkFZKHBSdW50aW1lKTsKLQl9Ci0KLQl7Ci0JCUZYX0xQQ1dTVFIgQXJyYXlOYW1lID0gTCJSRV9QSE9ORV9FTlRSWSI7Ci0JCUZYX0xQQ1dTVFIgQXJyYXlDb250ZW50W10gPSB7Ci0JCQkJTCJcXGR7MCwzfShcXC58Wy0gXSk/XFxkezAsM30oXFwufFstIF0pP1xcZHswLDR9IiwJCS8qIDU1NS0xMjM0IG9yIDQwOCA1NTUtMTIzNCAqLwotCQkJCUwiXFwoXFxkezAsM30iLAkJCQkJCQkJCQkJLyogKDQwOCAqLwotCQkJCUwiXFwoXFxkezAsM31cXCkoXFwufFstIF0pP1xcZHswLDN9KFxcLnxbLSBdKT9cXGR7MCw0fSIsCS8qICg0MDgpIDU1NS0xMjM0ICovCi0JCQkJCS8qIChhbGxvdyB0aGUgYWRkaXRpb24gb2YgcGFyZW5zIGFzIGFuIGFmdGVydGhvdWdodCkgKi8KLQkJCQlMIlxcKFxcZHswLDN9KFxcLnxbLSBdKT9cXGR7MCwzfShcXC58Wy0gXSk/XFxkezAsNH0iLAkvKiAoNDA4IDU1NS0xMjM0ICovCi0JCQkJTCJcXGR7MCwzfVxcKShcXC58Wy0gXSk/XFxkezAsM30oXFwufFstIF0pP1xcZHswLDR9IiwJLyogNDA4KSA1NTUtMTIzNCAqLwotCQkJCUwiMDExKFxcLnxbLSBcXGRdKSoiCQkJCQkJCQkJCS8qIGludGVybmF0aW9uYWwgKi8KLQkJCX07Ci0JCURFRklORV9HTE9CQUxfQVJSQVkocFJ1bnRpbWUpOwotCX0KLQotCXsKLQkJRlhfTFBDV1NUUiBBcnJheU5hbWUgPSBMIlJFX1BIT05FX0NPTU1JVCI7Ci0JCUZYX0xQQ1dTVFIgQXJyYXlDb250ZW50W10gPSB7Ci0JCQkJCUwiXFxkezN9KFxcLnxbLSBdKT9cXGR7NH0iLAkJCQkJCQkvKiA1NTUtMTIzNCAqLwotCQkJCQlMIlxcZHszfShcXC58Wy0gXSk/XFxkezN9KFxcLnxbLSBdKT9cXGR7NH0iLAkJCS8qIDQwOCA1NTUtMTIzNCAqLwotCQkJCQlMIlxcKFxcZHszfVxcKShcXC58Wy0gXSk/XFxkezN9KFxcLnxbLSBdKT9cXGR7NH0iLAkvKiAoNDA4KSA1NTUtMTIzNCAqLwotCQkJCQlMIjAxMShcXC58Wy0gXFxkXSkqIgkJCQkJCQkJCS8qIGludGVybmF0aW9uYWwgKi8KLQkJCQl9OwotCQlERUZJTkVfR0xPQkFMX0FSUkFZKHBSdW50aW1lKTsKLQl9Ci0KLQl7Ci0JCUZYX0xQQ1dTVFIgQXJyYXlOYW1lID0gTCJSRV9TU05fRU5UUlkiOwotCQlGWF9MUENXU1RSIEFycmF5Q29udGVudFtdID0ge0wiXFxkezAsM30oXFwufFstIF0pP1xcZHswLDJ9KFxcLnxbLSBdKT9cXGR7MCw0fSJ9OwotCQlERUZJTkVfR0xPQkFMX0FSUkFZKHBSdW50aW1lKTsKLQl9Ci0KLQl7Ci0JCUZYX0xQQ1dTVFIgQXJyYXlOYW1lID0gTCJSRV9TU05fQ09NTUlUIjsKLQkJRlhfTFBDV1NUUiBBcnJheUNvbnRlbnRbXSA9IHtMIlxcZHszfShcXC58Wy0gXSk/XFxkezJ9KFxcLnxbLSBdKT9cXGR7NH0ifTsKLQkJREVGSU5FX0dMT0JBTF9BUlJBWShwUnVudGltZSk7Ci0JfQotCi0JcmV0dXJuIDA7Cit2b2lkIENKU19HbG9iYWxDb25zdHM6OkRlZmluZUpTT2JqZWN0cyhDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgRGVmaW5lR2xvYmFsQ29uc3RTdHJpbmcoCisgICAgICBwUnVudGltZSwgTCJJRFNfR1JFQVRFUl9USEFOIiwKKyAgICAgIEwiSW52YWxpZCB2YWx1ZTogbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJSBzLiIpOworICBEZWZpbmVHbG9iYWxDb25zdFN0cmluZygKKyAgICAgIHBSdW50aW1lLCBMIklEU19HVF9BTkRfTFQiLAorICAgICAgTCJJbnZhbGlkIHZhbHVlOiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlIHMgIgorICAgICAgTCJhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICUgcy4iKTsKKyAgRGVmaW5lR2xvYmFsQ29uc3RTdHJpbmcocFJ1bnRpbWUsIEwiSURTX0xFU1NfVEhBTiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEwiSW52YWxpZCB2YWx1ZTogbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJSBzLiIpOworICBEZWZpbmVHbG9iYWxDb25zdFN0cmluZyhwUnVudGltZSwgTCJJRFNfSU5WQUxJRF9NT05USCIsIEwiKipJbnZhbGlkKioiKTsKKyAgRGVmaW5lR2xvYmFsQ29uc3RTdHJpbmcoCisgICAgICBwUnVudGltZSwgTCJJRFNfSU5WQUxJRF9EQVRFIiwKKyAgICAgIEwiSW52YWxpZCBkYXRlIC8gdGltZTogcGxlYXNlIGVuc3VyZSB0aGF0IHRoZSBkYXRlIC8gdGltZSBleGlzdHMuRmllbGQiKTsKKyAgRGVmaW5lR2xvYmFsQ29uc3RTdHJpbmcoCisgICAgICBwUnVudGltZSwgTCJJRFNfSU5WQUxJRF9WQUxVRSIsCisgICAgICBMIlRoZSB2YWx1ZSBlbnRlcmVkIGRvZXMgbm90IG1hdGNoIHRoZSBmb3JtYXQgb2YgdGhlIGZpZWxkIik7CisgIERlZmluZUdsb2JhbENvbnN0U3RyaW5nKHBSdW50aW1lLCBMIklEU19BTSIsIEwiYW0iKTsKKyAgRGVmaW5lR2xvYmFsQ29uc3RTdHJpbmcocFJ1bnRpbWUsIEwiSURTX1BNIiwgTCJwbSIpOworICBEZWZpbmVHbG9iYWxDb25zdFN0cmluZygKKyAgICAgIHBSdW50aW1lLCBMIklEU19NT05USF9JTkZPIiwKKyAgICAgIEwiSmFudWFyeVsxXSBGZWJydWFyeVsyXSBNYXJjaFszXSBBcHJpbFs0XSBNYXlbNV0gIgorICAgICAgTCJKdW5lWzZdIEp1bHlbN10gQXVndXN0WzhdIFNlcHRlbWJlcls5XSBPY3RvYmVyWzEwXSAiCisgICAgICBMIk5vdmVtYmVyWzExXSBEZWNlbWJlclsxMl0gU2VwdFs5XSBKYW5bMV0gRmViWzJdIE1hclszXSAiCisgICAgICBMIkFwcls0XSBKdW5bNl0gSnVsWzddIEF1Z1s4XSBTZXBbOV0gT2N0WzEwXSBOb3ZbMTFdICIKKyAgICAgIEwiRGVjWzEyXSIpOworICBEZWZpbmVHbG9iYWxDb25zdFN0cmluZyhwUnVudGltZSwgTCJJRFNfU1RBUlRVUF9DT05TT0xFX01TRyIsIEwiKiogXiBfIF4gKioiKTsKIH0KIAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENKU19HbG9iYWxBcnJheXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIERlZmluZUdsb2JhbENvbnN0U3RyaW5nQXJyYXkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHNDb25zdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCoqIHBWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5WYWx1ZXMpIHsKKyAgQ0pTX0FycmF5IGFycmF5KHBSdW50aW1lKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuVmFsdWVzOyArK2kpIHsKKyAgICBhcnJheS5TZXRFbGVtZW50KGksIENKU19WYWx1ZShwUnVudGltZSwgcFZhbHVlc1tpXSkpOworICB9CisgIENKU19Qcm9wVmFsdWUgcHJvcChwUnVudGltZSk7CisgIHByb3AgPDwgYXJyYXk7CisgIEZYSlNfRGVmaW5lR2xvYmFsQ29uc3QocFJ1bnRpbWUtPkdldElzb2xhdGUoKSwgc0NvbnN0TmFtZSwgcHJvcC5Ub1Y4VmFsdWUoKSk7Cit9CisKK3ZvaWQgQ0pTX0dsb2JhbEFycmF5czo6RGVmaW5lSlNPYmplY3RzKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICB7CisgICAgY29uc3QgRlhfV0NIQVIqIEFycmF5TmFtZSA9IEwiUkVfTlVNQkVSX0VOVFJZX0RPVF9TRVAiOworICAgIGNvbnN0IEZYX1dDSEFSKiBBcnJheUNvbnRlbnRbXSA9IHtMIlsrLV0/XFxkKlxcLj9cXGQqIn07CisgICAgRGVmaW5lR2xvYmFsQ29uc3RTdHJpbmdBcnJheShwUnVudGltZSwgQXJyYXlOYW1lLCBBcnJheUNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BcnJheVNpemUoQXJyYXlDb250ZW50KSk7CisgIH0KKworICB7CisgICAgY29uc3QgRlhfV0NIQVIqIEFycmF5TmFtZSA9IEwiUkVfTlVNQkVSX0NPTU1JVF9ET1RfU0VQIjsKKyAgICBjb25zdCBGWF9XQ0hBUiogQXJyYXlDb250ZW50W10gPSB7CisgICAgICAgIEwiWystXT9cXGQrKFxcLlxcZCspPyIsIC8qIC0xLjAgb3IgLTEgKi8KKyAgICAgICAgTCJbKy1dP1xcLlxcZCsiLCAgICAgICAgLyogLS4xICovCisgICAgICAgIEwiWystXT9cXGQrXFwuIiAgICAgICAgIC8qIC0xLiAqLworICAgIH07CisgICAgRGVmaW5lR2xvYmFsQ29uc3RTdHJpbmdBcnJheShwUnVudGltZSwgQXJyYXlOYW1lLCBBcnJheUNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BcnJheVNpemUoQXJyYXlDb250ZW50KSk7CisgIH0KKworICB7CisgICAgY29uc3QgRlhfV0NIQVIqIEFycmF5TmFtZSA9IEwiUkVfTlVNQkVSX0VOVFJZX0NPTU1BX1NFUCI7CisgICAgY29uc3QgRlhfV0NIQVIqIEFycmF5Q29udGVudFtdID0ge0wiWystXT9cXGQqLD9cXGQqIn07CisKKyAgICBEZWZpbmVHbG9iYWxDb25zdFN0cmluZ0FycmF5KHBSdW50aW1lLCBBcnJheU5hbWUsIEFycmF5Q29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShBcnJheUNvbnRlbnQpKTsKKyAgfQorCisgIHsKKyAgICBjb25zdCBGWF9XQ0hBUiogQXJyYXlOYW1lID0gTCJSRV9OVU1CRVJfQ09NTUlUX0NPTU1BX1NFUCI7CisgICAgY29uc3QgRlhfV0NIQVIqIEFycmF5Q29udGVudFtdID0geworICAgICAgICBMIlsrLV0/XFxkKyhbLixdXFxkKyk/IiwgLyogLTEsMCBvciAtMSAqLworICAgICAgICBMIlsrLV0/Wy4sXVxcZCsiLCAgICAgICAgLyogLSwxICovCisgICAgICAgIEwiWystXT9cXGQrWy4sXSIgICAgICAgICAvKiAtMSwgKi8KKyAgICB9OworICAgIERlZmluZUdsb2JhbENvbnN0U3RyaW5nQXJyYXkocFJ1bnRpbWUsIEFycmF5TmFtZSwgQXJyYXlDb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQXJyYXlTaXplKEFycmF5Q29udGVudCkpOworICB9CisKKyAgeworICAgIGNvbnN0IEZYX1dDSEFSKiBBcnJheU5hbWUgPSBMIlJFX1pJUF9FTlRSWSI7CisgICAgY29uc3QgRlhfV0NIQVIqIEFycmF5Q29udGVudFtdID0ge0wiXFxkezAsNX0ifTsKKyAgICBEZWZpbmVHbG9iYWxDb25zdFN0cmluZ0FycmF5KHBSdW50aW1lLCBBcnJheU5hbWUsIEFycmF5Q29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShBcnJheUNvbnRlbnQpKTsKKyAgfQorCisgIHsKKyAgICBjb25zdCBGWF9XQ0hBUiogQXJyYXlOYW1lID0gTCJSRV9aSVBfQ09NTUlUIjsKKyAgICBjb25zdCBGWF9XQ0hBUiogQXJyYXlDb250ZW50W10gPSB7TCJcXGR7NX0ifTsKKyAgICBEZWZpbmVHbG9iYWxDb25zdFN0cmluZ0FycmF5KHBSdW50aW1lLCBBcnJheU5hbWUsIEFycmF5Q29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShBcnJheUNvbnRlbnQpKTsKKyAgfQorCisgIHsKKyAgICBjb25zdCBGWF9XQ0hBUiogQXJyYXlOYW1lID0gTCJSRV9aSVA0X0VOVFJZIjsKKyAgICBjb25zdCBGWF9XQ0hBUiogQXJyYXlDb250ZW50W10gPSB7TCJcXGR7MCw1fShcXC58Wy0gXSk/XFxkezAsNH0ifTsKKyAgICBEZWZpbmVHbG9iYWxDb25zdFN0cmluZ0FycmF5KHBSdW50aW1lLCBBcnJheU5hbWUsIEFycmF5Q29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShBcnJheUNvbnRlbnQpKTsKKyAgfQorCisgIHsKKyAgICBjb25zdCBGWF9XQ0hBUiogQXJyYXlOYW1lID0gTCJSRV9aSVA0X0NPTU1JVCI7CisgICAgY29uc3QgRlhfV0NIQVIqIEFycmF5Q29udGVudFtdID0ge0wiXFxkezV9KFxcLnxbLSBdKT9cXGR7NH0ifTsKKyAgICBEZWZpbmVHbG9iYWxDb25zdFN0cmluZ0FycmF5KHBSdW50aW1lLCBBcnJheU5hbWUsIEFycmF5Q29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShBcnJheUNvbnRlbnQpKTsKKyAgfQorCisgIHsKKyAgICBjb25zdCBGWF9XQ0hBUiogQXJyYXlOYW1lID0gTCJSRV9QSE9ORV9FTlRSWSI7CisgICAgY29uc3QgRlhfV0NIQVIqIEFycmF5Q29udGVudFtdID0geworICAgICAgICBMIlxcZHswLDN9KFxcLnxbLSBdKT9cXGR7MCwzfShcXC58Wy0gXSk/XFxkezAsNH0iLCAvKiA1NTUtMTIzNCBvciA0MDgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTU1LTEyMzQgKi8KKyAgICAgICAgTCJcXChcXGR7MCwzfSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKDQwOCAqLworICAgICAgICBMIlxcKFxcZHswLDN9XFwpKFxcLnxbLSBdKT9cXGR7MCwzfShcXC58Wy0gXSk/XFxkezAsNH0iLCAvKiAoNDA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTUtMTIzNCAqLworICAgICAgICAvKiAoYWxsb3cgdGhlIGFkZGl0aW9uIG9mIHBhcmVucyBhcyBhbiBhZnRlcnRob3VnaHQpICovCisgICAgICAgIEwiXFwoXFxkezAsM30oXFwufFstIF0pP1xcZHswLDN9KFxcLnxbLSBdKT9cXGR7MCw0fSIsIC8qICg0MDggNTU1LTEyMzQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgTCJcXGR7MCwzfVxcKShcXC58Wy0gXSk/XFxkezAsM30oXFwufFstIF0pP1xcZHswLDR9IiwgLyogNDA4KSA1NTUtMTIzNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBMIjAxMShcXC58Wy0gXFxkXSkqIiAvKiBpbnRlcm5hdGlvbmFsICovCisgICAgfTsKKyAgICBEZWZpbmVHbG9iYWxDb25zdFN0cmluZ0FycmF5KHBSdW50aW1lLCBBcnJheU5hbWUsIEFycmF5Q29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShBcnJheUNvbnRlbnQpKTsKKyAgfQorCisgIHsKKyAgICBjb25zdCBGWF9XQ0hBUiogQXJyYXlOYW1lID0gTCJSRV9QSE9ORV9DT01NSVQiOworICAgIGNvbnN0IEZYX1dDSEFSKiBBcnJheUNvbnRlbnRbXSA9IHsKKyAgICAgICAgTCJcXGR7M30oXFwufFstIF0pP1xcZHs0fSIsICAgICAgICAgICAgICAgICAgICAgICAgLyogNTU1LTEyMzQgKi8KKyAgICAgICAgTCJcXGR7M30oXFwufFstIF0pP1xcZHszfShcXC58Wy0gXSk/XFxkezR9IiwgICAgICAgLyogNDA4IDU1NS0xMjM0ICovCisgICAgICAgIEwiXFwoXFxkezN9XFwpKFxcLnxbLSBdKT9cXGR7M30oXFwufFstIF0pP1xcZHs0fSIsIC8qICg0MDgpIDU1NS0xMjM0ICovCisgICAgICAgIEwiMDExKFxcLnxbLSBcXGRdKSoiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGludGVybmF0aW9uYWwgKi8KKyAgICB9OworICAgIERlZmluZUdsb2JhbENvbnN0U3RyaW5nQXJyYXkocFJ1bnRpbWUsIEFycmF5TmFtZSwgQXJyYXlDb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQXJyYXlTaXplKEFycmF5Q29udGVudCkpOworICB9CisKKyAgeworICAgIGNvbnN0IEZYX1dDSEFSKiBBcnJheU5hbWUgPSBMIlJFX1NTTl9FTlRSWSI7CisgICAgY29uc3QgRlhfV0NIQVIqIEFycmF5Q29udGVudFtdID0geworICAgICAgICBMIlxcZHswLDN9KFxcLnxbLSBdKT9cXGR7MCwyfShcXC58Wy0gXSk/XFxkezAsNH0ifTsKKyAgICBEZWZpbmVHbG9iYWxDb25zdFN0cmluZ0FycmF5KHBSdW50aW1lLCBBcnJheU5hbWUsIEFycmF5Q29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShBcnJheUNvbnRlbnQpKTsKKyAgfQorCisgIHsKKyAgICBjb25zdCBGWF9XQ0hBUiogQXJyYXlOYW1lID0gTCJSRV9TU05fQ09NTUlUIjsKKyAgICBjb25zdCBGWF9XQ0hBUiogQXJyYXlDb250ZW50W10gPSB7CisgICAgICAgIEwiXFxkezN9KFxcLnxbLSBdKT9cXGR7Mn0oXFwufFstIF0pP1xcZHs0fSJ9OworICAgIERlZmluZUdsb2JhbENvbnN0U3RyaW5nQXJyYXkocFJ1bnRpbWUsIEFycmF5TmFtZSwgQXJyYXlDb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQXJyYXlTaXplKEFycmF5Q29udGVudCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0NvbnN0cy5oIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9Db25zdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2M4NDNlCi0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9Db25zdHMuaApAQCAtMCwwICsxLDExNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZQREZTREtfU1JDX0pBVkFTQ1JJUFRfQ09OU1RTX0hfCisjZGVmaW5lIEZQREZTREtfU1JDX0pBVkFTQ1JJUFRfQ09OU1RTX0hfCisKKyNpbmNsdWRlICJKU19EZWZpbmUuaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGJvcmRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworY2xhc3MgQ0pTX0JvcmRlciA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKU19Cb3JkZXIodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQorICB+Q0pTX0JvcmRlcigpIG92ZXJyaWRlIHt9CisKKyAgREVDTEFSRV9KU19DTEFTU19DT05TVCgpOworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRpc3BsYXkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2NsYXNzIENKU19EaXNwbGF5IDogcHVibGljIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pTX0Rpc3BsYXkodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQorICB+Q0pTX0Rpc3BsYXkoKSBvdmVycmlkZSB7fQorCisgIERFQ0xBUkVfSlNfQ0xBU1NfQ09OU1QoKTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBmb250IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitjbGFzcyBDSlNfRm9udCA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKU19Gb250KHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge30KKyAgfkNKU19Gb250KCkgb3ZlcnJpZGUge30KKworICBERUNMQVJFX0pTX0NMQVNTX0NPTlNUKCk7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGlnaGxpZ2h0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitjbGFzcyBDSlNfSGlnaGxpZ2h0IDogcHVibGljIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pTX0hpZ2hsaWdodCh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9CisgIH5DSlNfSGlnaGxpZ2h0KCkgb3ZlcnJpZGUge30KKworICBERUNMQVJFX0pTX0NMQVNTX0NPTlNUKCk7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcG9zaXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2NsYXNzIENKU19Qb3NpdGlvbiA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKU19Qb3NpdGlvbih2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9CisgIH5DSlNfUG9zaXRpb24oKSBvdmVycmlkZSB7fQorCisgIERFQ0xBUkVfSlNfQ0xBU1NfQ09OU1QoKTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzY2FsZUhvdyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworY2xhc3MgQ0pTX1NjYWxlSG93IDogcHVibGljIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pTX1NjYWxlSG93KHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge30KKyAgfkNKU19TY2FsZUhvdygpIG92ZXJyaWRlIHt9CisKKyAgREVDTEFSRV9KU19DTEFTU19DT05TVCgpOworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNjYWxlV2hlbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworY2xhc3MgQ0pTX1NjYWxlV2hlbiA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKU19TY2FsZVdoZW4odjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQorICB+Q0pTX1NjYWxlV2hlbigpIG92ZXJyaWRlIHt9CisKKyAgREVDTEFSRV9KU19DTEFTU19DT05TVCgpOworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHN0eWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitjbGFzcyBDSlNfU3R5bGUgOiBwdWJsaWMgQ0pTX09iamVjdCB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlNfU3R5bGUodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQorICB+Q0pTX1N0eWxlKCkgb3ZlcnJpZGUge30KKworICBERUNMQVJFX0pTX0NMQVNTX0NPTlNUKCk7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gem9vbXR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2NsYXNzIENKU19ab29tdHlwZSA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKU19ab29tdHlwZSh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9CisgIH5DSlNfWm9vbXR5cGUoKSBvdmVycmlkZSB7fQorCisgIERFQ0xBUkVfSlNfQ0xBU1NfQ09OU1QoKTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDSlNfR2xvYmFsQ29uc3RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2NsYXNzIENKU19HbG9iYWxDb25zdHMgOiBwdWJsaWMgQ0pTX09iamVjdCB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBEZWZpbmVKU09iamVjdHMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDSlNfR2xvYmFsQXJyYXlzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2NsYXNzIENKU19HbG9iYWxBcnJheXMgOiBwdWJsaWMgQ0pTX09iamVjdCB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBEZWZpbmVKU09iamVjdHMoQ0pTX1J1bnRpbWUqIHBSdW50bWllKTsKK307CisKKyNlbmRpZiAgLy8gRlBERlNES19TUkNfSkFWQVNDUklQVF9DT05TVFNfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvRG9jdW1lbnQuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9Eb2N1bWVudC5jcHAKaW5kZXggNmEzZDZlMS4uMTA0MGMzNCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9Eb2N1bWVudC5jcHAKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9Eb2N1bWVudC5jcHAKQEAgLTQsMzEgKzQsMjYgQEAKIAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KYXZhU2NyaXB0LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0RlZmluZS5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19PYmplY3QuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfVmFsdWUuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvRG9jdW1lbnQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0NvbnRleHQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfUnVudGltZS5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9hcHAuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvRmllbGQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSWNvbi5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9yZXNvdXJjZS5oIgorI2luY2x1ZGUgIkRvY3VtZW50LmgiCiAKLSNpbmNsdWRlICIuLi8uLi8uLi90aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfbWF0aC5oIgorI2luY2x1ZGUgIkZpZWxkLmgiCisjaW5jbHVkZSAiSWNvbi5oIgorI2luY2x1ZGUgIkpTX0NvbnRleHQuaCIKKyNpbmNsdWRlICJKU19EZWZpbmUuaCIKKyNpbmNsdWRlICJKU19FdmVudEhhbmRsZXIuaCIKKyNpbmNsdWRlICJKU19PYmplY3QuaCIKKyNpbmNsdWRlICJKU19SdW50aW1lLmgiCisjaW5jbHVkZSAiSlNfVmFsdWUuaCIKKyNpbmNsdWRlICJhcHAuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnNka19tZ3IuaCIgIC8vIEZvciBDUERGRG9jX0Vudmlyb25tZW50LgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiCisjaW5jbHVkZSAicmVzb3VyY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfbWF0aC5oIgogCi1zdGF0aWMgdjg6Oklzb2xhdGUqIEdldElzb2xhdGUoSUZYSlNfQ29udGV4dCogY2MpCi17Ci0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCi0JQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwotCUFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKLQotCXJldHVybiBwUnVudGltZS0+R2V0SXNvbGF0ZSgpOworc3RhdGljIHY4OjpJc29sYXRlKiBHZXRJc29sYXRlKElKU19Db250ZXh0KiBjYykgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CisgIHJldHVybiBwUnVudGltZS0+R2V0SXNvbGF0ZSgpOwogfQogCiBCRUdJTl9KU19TVEFUSUNfQ09OU1QoQ0pTX1ByaW50UGFyYW1zT2JqKQpAQCAtNDMsMTk0NiArMzgsMTYxNCBAQAogSU1QTEVNRU5UX0pTX0NMQVNTKENKU19QcmludFBhcmFtc09iaiwgUHJpbnRQYXJhbXNPYmopCiAKIFByaW50UGFyYW1zT2JqOjpQcmludFBhcmFtc09iaihDSlNfT2JqZWN0KiBwSlNPYmplY3QpCi06IENKU19FbWJlZE9iaihwSlNPYmplY3QpCi17Ci0JYlVJID0gVFJVRTsKLQluU3RhcnQgPSAwOwotCW5FbmQgPSAwOwotCWJTaWxlbnQgPSBGQUxTRTsKLQliU2hyaW5rVG9GaXQgPSBGQUxTRTsKLQliUHJpbnRBc0ltYWdlID0gRkFMU0U7Ci0JYlJldmVyc2UgPSBGQUxTRTsKLQliQW5ub3RhdGlvbnMgPSBUUlVFOworICAgIDogQ0pTX0VtYmVkT2JqKHBKU09iamVjdCkgeworICBiVUkgPSBUUlVFOworICBuU3RhcnQgPSAwOworICBuRW5kID0gMDsKKyAgYlNpbGVudCA9IEZBTFNFOworICBiU2hyaW5rVG9GaXQgPSBGQUxTRTsKKyAgYlByaW50QXNJbWFnZSA9IEZBTFNFOworICBiUmV2ZXJzZSA9IEZBTFNFOworICBiQW5ub3RhdGlvbnMgPSBUUlVFOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERvY3VtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2RlZmluZSBNSU5XSURUSCAgNS4wZgorI2RlZmluZSBNSU5XSURUSCA1LjBmCiAjZGVmaW5lIE1JTkhFSUdIVCA1LjBmCiAKIEJFR0lOX0pTX1NUQVRJQ19DT05TVChDSlNfRG9jdW1lbnQpCiBFTkRfSlNfU1RBVElDX0NPTlNUKCkKIAogQkVHSU5fSlNfU1RBVElDX1BST1AoQ0pTX0RvY3VtZW50KQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKEFEQkUpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoYXV0aG9yKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGJhc2VVUkwpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoYm9va21hcmtSb290KQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGNhbGN1bGF0ZSkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShDb2xsYWIpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoY3JlYXRpb25EYXRlKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGNyZWF0b3IpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoZGVsYXkpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoZGlydHkpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoZG9jdW1lbnRGaWxlTmFtZSkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShleHRlcm5hbCkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShmaWxlc2l6ZSkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShpY29ucykKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShpbmZvKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGtleXdvcmRzKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGxheW91dCkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShtZWRpYSkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShtb2REYXRlKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKG1vdXNlWCkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShtb3VzZVkpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkobnVtRmllbGRzKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKG51bVBhZ2VzKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHBhZ2VOdW0pCi0JSlNfU1RBVElDX1BST1BfRU5UUlkocGFnZVdpbmRvd1JlY3QpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkocGF0aCkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShwcm9kdWNlcikKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShzdWJqZWN0KQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHRpdGxlKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHpvb20pCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoem9vbVR5cGUpCitKU19TVEFUSUNfUFJPUF9FTlRSWShBREJFKQorSlNfU1RBVElDX1BST1BfRU5UUlkoYXV0aG9yKQorSlNfU1RBVElDX1BST1BfRU5UUlkoYmFzZVVSTCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGJvb2ttYXJrUm9vdCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGNhbGN1bGF0ZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKENvbGxhYikKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGNyZWF0aW9uRGF0ZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGNyZWF0b3IpCitKU19TVEFUSUNfUFJPUF9FTlRSWShkZWxheSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGRpcnR5KQorSlNfU1RBVElDX1BST1BfRU5UUlkoZG9jdW1lbnRGaWxlTmFtZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGV4dGVybmFsKQorSlNfU1RBVElDX1BST1BfRU5UUlkoZmlsZXNpemUpCitKU19TVEFUSUNfUFJPUF9FTlRSWShpY29ucykKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGluZm8pCitKU19TVEFUSUNfUFJPUF9FTlRSWShrZXl3b3JkcykKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGxheW91dCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKG1lZGlhKQorSlNfU1RBVElDX1BST1BfRU5UUlkobW9kRGF0ZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKG1vdXNlWCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKG1vdXNlWSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKG51bUZpZWxkcykKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKG51bVBhZ2VzKQorSlNfU1RBVElDX1BST1BfRU5UUlkocGFnZU51bSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHBhZ2VXaW5kb3dSZWN0KQorSlNfU1RBVElDX1BST1BfRU5UUlkocGF0aCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHByb2R1Y2VyKQorSlNfU1RBVElDX1BST1BfRU5UUlkoc3ViamVjdCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHRpdGxlKQorSlNfU1RBVElDX1BST1BfRU5UUlkoem9vbSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHpvb21UeXBlKQogRU5EX0pTX1NUQVRJQ19QUk9QKCkKIAogQkVHSU5fSlNfU1RBVElDX01FVEhPRChDSlNfRG9jdW1lbnQpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShhZGRBbm5vdCkKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGFkZEZpZWxkKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoYWRkTGluaykKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGFkZEljb24pCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShjYWxjdWxhdGVOb3cpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShjbG9zZURvYykKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGNyZWF0ZURhdGFPYmplY3QpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShkZWxldGVQYWdlcykKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGV4cG9ydEFzVGV4dCkKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGV4cG9ydEFzRkRGKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZXhwb3J0QXNYRkRGKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZXh0cmFjdFBhZ2VzKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ2V0QW5ub3QpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShnZXRBbm5vdHMpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShnZXRBbm5vdDNEKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ2V0QW5ub3RzM0QpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShnZXRGaWVsZCkKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdldEljb24pCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShnZXRMaW5rcykKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdldE50aEZpZWxkTmFtZSkKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdldE9DR3MpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShnZXRQYWdlQm94KQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ2V0UGFnZU50aFdvcmQpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShnZXRQYWdlTnRoV29yZFF1YWRzKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ2V0UGFnZU51bVdvcmRzKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ2V0UHJpbnRQYXJhbXMpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShnZXRVUkwpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShpbXBvcnRBbkZERikKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGltcG9ydEFuWEZERikKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGltcG9ydFRleHREYXRhKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoaW5zZXJ0UGFnZXMpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShtYWlsRm9ybSkKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHByaW50KQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkocmVtb3ZlRmllbGQpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShyZXBsYWNlUGFnZXMpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShyZXNldEZvcm0pCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShyZW1vdmVJY29uKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc2F2ZUFzKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc3VibWl0Rm9ybSkKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKG1haWxEb2MpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGFkZEFubm90KQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShhZGRGaWVsZCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoYWRkTGluaykKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoYWRkSWNvbikKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoY2FsY3VsYXRlTm93KQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShjbG9zZURvYykKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoY3JlYXRlRGF0YU9iamVjdCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZGVsZXRlUGFnZXMpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGV4cG9ydEFzVGV4dCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZXhwb3J0QXNGREYpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGV4cG9ydEFzWEZERikKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZXh0cmFjdFBhZ2VzKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShnZXRBbm5vdCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ2V0QW5ub3RzKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShnZXRBbm5vdDNEKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShnZXRBbm5vdHMzRCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ2V0RmllbGQpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdldEljb24pCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdldExpbmtzKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShnZXROdGhGaWVsZE5hbWUpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdldE9DR3MpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdldFBhZ2VCb3gpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdldFBhZ2VOdGhXb3JkKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShnZXRQYWdlTnRoV29yZFF1YWRzKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShnZXRQYWdlTnVtV29yZHMpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdldFByaW50UGFyYW1zKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShnZXRVUkwpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGltcG9ydEFuRkRGKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShpbXBvcnRBblhGREYpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGltcG9ydFRleHREYXRhKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShpbnNlcnRQYWdlcykKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkobWFpbEZvcm0pCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHByaW50KQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShyZW1vdmVGaWVsZCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkocmVwbGFjZVBhZ2VzKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShyZXNldEZvcm0pCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHJlbW92ZUljb24pCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHNhdmVBcykKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc3VibWl0Rm9ybSkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkobWFpbERvYykKIEVORF9KU19TVEFUSUNfTUVUSE9EKCkKIAogSU1QTEVNRU5UX0pTX0NMQVNTKENKU19Eb2N1bWVudCwgRG9jdW1lbnQpCiAKLUZYX0JPT0wJQ0pTX0RvY3VtZW50OjpJbml0SW5zdGFuY2UoSUZYSlNfQ29udGV4dCogY2MpCi17Ci0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0KLQlEb2N1bWVudCogcERvYyA9IChEb2N1bWVudCopR2V0RW1iZWRPYmplY3QoKTsKLQlBU1NFUlQocERvYyAhPSBOVUxMKTsKLQotCXBEb2MtPkF0dGFjaERvYyhwQ29udGV4dC0+R2V0UmVhZGVyRG9jdW1lbnQoKSk7Ci0JcERvYy0+U2V0SXNvbGF0ZShwQ29udGV4dC0+R2V0SlNSdW50aW1lKCktPkdldElzb2xhdGUoKSk7Ci0JcmV0dXJuIFRSVUU7Ci19OwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRG9jdW1lbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLURvY3VtZW50OjpEb2N1bWVudChDSlNfT2JqZWN0KiBwSlNPYmplY3QpIDogQ0pTX0VtYmVkT2JqKHBKU09iamVjdCksCi0JbV9pc29sYXRlKE5VTEwpLAotCW1fcEljb25UcmVlKE5VTEwpLAotCW1fcERvY3VtZW50KE5VTEwpLAotCW1fY3dCYXNlVVJMKEwiIiksCi0JbV9iRGVsYXkoRkFMU0UpCi17Cit2b2lkIENKU19Eb2N1bWVudDo6SW5pdEluc3RhbmNlKElKU19SdW50aW1lKiBwSVJ1bnRpbWUpIHsKKyAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gc3RhdGljX2Nhc3Q8Q0pTX1J1bnRpbWUqPihwSVJ1bnRpbWUpOworICBEb2N1bWVudCogcERvYyA9IHN0YXRpY19jYXN0PERvY3VtZW50Kj4oR2V0RW1iZWRPYmplY3QoKSk7CisgIHBEb2MtPkF0dGFjaERvYyhwUnVudGltZS0+R2V0UmVhZGVyRG9jdW1lbnQoKSk7CisgIHBEb2MtPlNldElzb2xhdGUocFJ1bnRpbWUtPkdldElzb2xhdGUoKSk7CiB9CiAKLURvY3VtZW50Ojp+RG9jdW1lbnQoKQotewotCWlmIChtX3BJY29uVHJlZSkKLQl7Ci0JCW1fcEljb25UcmVlLT5EZWxldGVJY29uVHJlZSgpOwotCQlkZWxldGUgbV9wSWNvblRyZWU7Ci0JCW1fcEljb25UcmVlID0gTlVMTDsKLQl9Ci0JZm9yIChpbnQgaT0wOyBpPG1fRGVsYXlEYXRhLkdldFNpemUoKTsgaSsrKQotCXsKLQkJaWYgKENKU19EZWxheURhdGEqIHBEYXRhID0gbV9EZWxheURhdGEuR2V0QXQoaSkpCi0JCXsKLQkJCWRlbGV0ZSBwRGF0YTsKLQkJCXBEYXRhID0gTlVMTDsKLQkJCW1fRGVsYXlEYXRhLlNldEF0KGksIE5VTEwpOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERvY3VtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAKLQkJfQotCX0KK0RvY3VtZW50OjpEb2N1bWVudChDSlNfT2JqZWN0KiBwSlNPYmplY3QpCisgICAgOiBDSlNfRW1iZWRPYmoocEpTT2JqZWN0KSwKKyAgICAgIG1faXNvbGF0ZShOVUxMKSwKKyAgICAgIG1fcERvY3VtZW50KE5VTEwpLAorICAgICAgbV9jd0Jhc2VVUkwoTCIiKSwKKyAgICAgIG1fYkRlbGF5KEZBTFNFKSB7fQogCi0JbV9EZWxheURhdGEuUmVtb3ZlQWxsKCk7Ci0JbV9EZWxheUFubm90RGF0YS5SZW1vdmVBbGwoKTsKK0RvY3VtZW50Ojp+RG9jdW1lbnQoKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9EZWxheURhdGEuR2V0U2l6ZSgpOyBpKyspIHsKKyAgICBkZWxldGUgbV9EZWxheURhdGEuR2V0QXQoaSk7CisgIH0KKworICBtX0RlbGF5RGF0YS5SZW1vdmVBbGwoKTsKIH0KIAotLy90aGUgdG90YWwgbnVtYmVyIG9mIGZpbGVkcyBpbiBkb2N1bWVudC4KLUZYX0JPT0wgRG9jdW1lbnQ6Om51bUZpZWxkcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaWYgKHZwLklzU2V0dGluZygpKSB7Ci0JCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IHN0YXRpY19jYXN0PENKU19Db250ZXh0Kj4oY2MpOwotCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1JFQURPTkxZKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQlDUERGU0RLX0ludGVyRm9ybSAqcEludGVyRm9ybSA9IG1fcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKLQlDUERGX0ludGVyRm9ybSAqcFBERkZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKLQl2cCA8PCAoaW50KXBQREZGb3JtLT5Db3VudEZpZWxkcygpOwotCXJldHVybiBUUlVFOworLy8gdGhlIHRvdGFsIG51bWJlciBvZiBmaWxlZHMgaW4gZG9jdW1lbnQuCitGWF9CT09MIERvY3VtZW50OjpudW1GaWVsZHMoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSRUFET05MWSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOworICBDUERGX0ludGVyRm9ybSogcFBERkZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKKyAgdnAgPDwgKGludClwUERGRm9ybS0+Q291bnRGaWVsZHMoKTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmRpcnR5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIERvY3VtZW50OjpkaXJ0eShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKHZwLklzR2V0dGluZygpKSB7CisgICAgaWYgKG1fcERvY3VtZW50LT5HZXRDaGFuZ2VNYXJrKCkpCisgICAgICB2cCA8PCB0cnVlOworICAgIGVsc2UKKyAgICAgIHZwIDw8IGZhbHNlOworICB9IGVsc2UgeworICAgIGJvb2wgYkNoYW5nZWQgPSBmYWxzZTsKIAotCWlmICh2cC5Jc0dldHRpbmcoKSkKLQl7Ci0JCWlmIChtX3BEb2N1bWVudC0+R2V0Q2hhbmdlTWFyaygpKQotCQkJdnAgPDwgdHJ1ZTsKLQkJZWxzZQotCQkJdnAgPDwgZmFsc2U7Ci0JfQotCWVsc2UKLQl7Ci0JCWJvb2wgYkNoYW5nZWQgPSBmYWxzZTsKKyAgICB2cCA+PiBiQ2hhbmdlZDsKIAotCQl2cCA+PiBiQ2hhbmdlZDsKKyAgICBpZiAoYkNoYW5nZWQpCisgICAgICBtX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOworICAgIGVsc2UKKyAgICAgIG1fcERvY3VtZW50LT5DbGVhckNoYW5nZU1hcmsoKTsKKyAgfQogCi0JCWlmIChiQ2hhbmdlZCkKLQkJCW1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7Ci0JCWVsc2UKLQkJCW1fcERvY3VtZW50LT5DbGVhckNoYW5nZU1hcmsoKTsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OkFEQkUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgRG9jdW1lbnQ6OkFEQkUoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAodnAuSXNHZXR0aW5nKCkpIHsKKyAgICB2cC5TZXROdWxsKCk7CisgIH0gZWxzZSB7CisgIH0KIAotCWlmICh2cC5Jc0dldHRpbmcoKSkKLQl7Ci0JCXZwLlNldE51bGwoKTsKLQl9Ci0JZWxzZQotCXsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OnBhZ2VOdW0oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgRG9jdW1lbnQ6OnBhZ2VOdW0oSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAodnAuSXNHZXR0aW5nKCkpIHsKKyAgICBpZiAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gbV9wRG9jdW1lbnQtPkdldEN1cnJlbnRWaWV3KCkpIHsKKyAgICAgIHZwIDw8IHBQYWdlVmlldy0+R2V0UGFnZUluZGV4KCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGludCBpUGFnZUNvdW50ID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpOworICAgIGludCBpUGFnZU51bSA9IDA7CisgICAgdnAgPj4gaVBhZ2VOdW07CiAKLQlpZiAodnAuSXNHZXR0aW5nKCkpCi0JewotCQlpZiAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gbV9wRG9jdW1lbnQtPkdldEN1cnJlbnRWaWV3KCkpCi0JCXsKLQkJCXZwIDw8IHBQYWdlVmlldy0+R2V0UGFnZUluZGV4KCk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJaW50IGlQYWdlQ291bnQgPSBtX3BEb2N1bWVudC0+R2V0UGFnZUNvdW50KCk7Ci0JCWludCBpUGFnZU51bSA9IDA7Ci0JCXZwID4+IGlQYWdlTnVtOworICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BEb2N1bWVudC0+R2V0RW52KCk7CisgICAgaWYgKGlQYWdlTnVtID49IDAgJiYgaVBhZ2VOdW0gPCBpUGFnZUNvdW50KSB7CisgICAgICBwRW52LT5KU19kb2Nnb3RvUGFnZShpUGFnZU51bSk7CisgICAgfSBlbHNlIGlmIChpUGFnZU51bSA+PSBpUGFnZUNvdW50KSB7CisgICAgICBwRW52LT5KU19kb2Nnb3RvUGFnZShpUGFnZUNvdW50IC0gMSk7CisgICAgfSBlbHNlIGlmIChpUGFnZU51bSA8IDApIHsKKyAgICAgIHBFbnYtPkpTX2RvY2dvdG9QYWdlKDApOworICAgIH0KKyAgfQogCi0JCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BEb2N1bWVudC0+R2V0RW52KCk7Ci0JCWlmIChpUGFnZU51bSA+PSAwICYmIGlQYWdlTnVtIDwgaVBhZ2VDb3VudCkKLQkJewotCQkJIHBFbnYtPkpTX2RvY2dvdG9QYWdlKGlQYWdlTnVtKTsKLQkJfQotCQllbHNlIGlmIChpUGFnZU51bSA+PSBpUGFnZUNvdW50KQotCQl7Ci0JCQkgcEVudi0+SlNfZG9jZ290b1BhZ2UoaVBhZ2VDb3VudC0xKTsKLQkJfQotCQllbHNlIGlmIChpUGFnZU51bSA8IDApCi0JCXsKLQkJCSBwRW52LT5KU19kb2Nnb3RvUGFnZSgwKTsKLQkJfQotCX0KLQotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6UGFyc2VyUGFyYW1zKEpTT2JqZWN0KiBwT2JqLENKU19Bbm5vdE9iaiYgYW5ub3RvYmopCi17Ci0JLy8gTm90IHN1cHBvcnRlZC4KLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgRG9jdW1lbnQ6OmFkZEFubm90KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmFkZEFubm90KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JLy8gTm90IHN1cHBvcnRlZC4KLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgRG9jdW1lbnQ6OmFkZEZpZWxkKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmFkZEZpZWxkKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JLy8gTm90IHN1cHBvcnRlZC4KLQlyZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBEb2N1bWVudDo6ZXhwb3J0QXNUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotCXJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIERvY3VtZW50OjpleHBvcnRBc0ZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCS8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLQlyZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBEb2N1bWVudDo6ZXhwb3J0QXNYRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotCXJldHVybiBUUlVFOwotfQotCi0vL01hcHMgYSBmaWVsZCBvYmplY3QgaW4gUERGIGRvY3VtZW50IHRvIGEgSmF2YVNjcmlwdCB2YXJpYWJsZQotLy9jb21tZW50OgotLy9ub3RlOiB0aGUgcGFyZW10ZXIgY05hbWUsIHRoaXMgaXMgY2x1ZSBob3cgdG8gdHJlYXQgaWYgdGhlIGNOYW1lIGlzIG5vdCBhIHZhbGlhYmxlIGZpbGVkIG5hbWUgaW4gdGhpcyBkb2N1bWVudAotCi1GWF9CT09MIERvY3VtZW50OjpnZXRGaWVsZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0JaWYgKHBhcmFtcy5zaXplKCkgPCAxKSB7Ci0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlDRlhfV2lkZVN0cmluZyB3aWRlTmFtZSA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKLQotCUNQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwotCUNQREZfSW50ZXJGb3JtKiBwUERGRm9ybSA9IHBJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOwotCWlmIChwUERGRm9ybS0+Q291bnRGaWVsZHMod2lkZU5hbWUpIDw9IDApCi0JewotCQl2UmV0LlNldE51bGwoKTsKLQkJcmV0dXJuIFRSVUU7Ci0JfQotCi0JQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwotCUpTRlhPYmplY3QgcEZpZWxkT2JqID0gSlNfTmV3RnhEeW5hbWljT2JqKCpwUnVudGltZSwgcENvbnRleHQsIEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiRmllbGQiKSk7Ci0KLQl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IEdldElzb2xhdGUoY2MpOwotCUNKU19GaWVsZCogcEpTRmllbGQgPSAoQ0pTX0ZpZWxkKilKU19HZXRQcml2YXRlKGlzb2xhdGUscEZpZWxkT2JqKTsKLQlGaWVsZCogcEZpZWxkID0gKEZpZWxkICopcEpTRmllbGQtPkdldEVtYmVkT2JqZWN0KCk7Ci0JcEZpZWxkLT5BdHRhY2hGaWVsZCh0aGlzLCB3aWRlTmFtZSk7Ci0KLQl2UmV0ID0gcEpTRmllbGQ7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8vR2V0cyB0aGUgbmFtZSBvZiB0aGUgbnRoIGZpZWxkIGluIHRoZSBkb2N1bWVudAotRlhfQk9PTCBEb2N1bWVudDo6Z2V0TnRoRmllbGROYW1lKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLQlpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7Ci0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlpbnQgbkluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7Ci0JaWYgKG5JbmRleCA8IDApIHsKLQkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNWQUxVRUVSUk9SKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCUNQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwotCUNQREZfSW50ZXJGb3JtKiBwUERGRm9ybSA9IHBJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOwotCUNQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBwUERGRm9ybS0+R2V0RmllbGQobkluZGV4KTsKLQlpZiAoIXBGaWVsZCkKLQkJcmV0dXJuIEZBTFNFOwotCi0JdlJldCA9IHBGaWVsZC0+R2V0RnVsbE5hbWUoKS5jX3N0cigpOwotCXJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIERvY3VtZW50OjppbXBvcnRBbkZERihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCS8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLQlyZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBEb2N1bWVudDo6aW1wb3J0QW5YRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotCXJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIERvY3VtZW50OjppbXBvcnRUZXh0RGF0YShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCS8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLQlyZXR1cm4gVFJVRTsKLX0KLQotLy9leHBvcnRzIHRoZSBmb3JtIGRhdGEgYW5kIG1haWxzIHRoZSByZXN1bHRpbmcgZmRmIGZpbGUgYXMgYW4gYXR0YWNobWVudCB0byBhbGwgcmVjaXBpZW50cy4KLS8vY29tbWVudDogbmVlZCByZWFkZXIgc3VwcG9ydHMKLS8vbm90ZToKLS8vaW50IENQREZTREtfRG9jdW1lbnQ6Om1haWxGb3JtKEZYX0JPT0wgYlVJLFN0cmluZyBjdG8sc3RyaW5nIGNjYyxzdHJpbmcgY2JjYyxzdHJpbmcgY1N1YmplY3Qsc3RyaW5nIGNtcyk7Ci0KLUZYX0JPT0wgRG9jdW1lbnQ6Om1haWxGb3JtKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0JaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRVhUUkFDVF9BQ0NFU1MpKSByZXR1cm4gRkFMU0U7Ci0KLQlpbnQgaUxlbmd0aCA9IHBhcmFtcy5zaXplKCk7Ci0KLQlGWF9CT09MIGJVSSA9IGlMZW5ndGggPiAwID8gcGFyYW1zWzBdLlRvQm9vbCgpIDogVFJVRTsKLQlDRlhfV2lkZVN0cmluZyBjVG8gPSBpTGVuZ3RoID4gMSA/IHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKSA6IEwiIjsKLQlDRlhfV2lkZVN0cmluZyBjQ2MgPSBpTGVuZ3RoID4gMiA/IHBhcmFtc1syXS5Ub0NGWFdpZGVTdHJpbmcoKSA6IEwiIjsKLQlDRlhfV2lkZVN0cmluZyBjQmNjID0gaUxlbmd0aCA+IDMgPyBwYXJhbXNbM10uVG9DRlhXaWRlU3RyaW5nKCkgOiBMIiI7Ci0JQ0ZYX1dpZGVTdHJpbmcgY1N1YmplY3QgPSBpTGVuZ3RoID4gNCA/IHBhcmFtc1s0XS5Ub0NGWFdpZGVTdHJpbmcoKSA6IEwiIjsKLQlDRlhfV2lkZVN0cmluZyBjTXNnID0gaUxlbmd0aCA+IDUgPyBwYXJhbXNbNV0uVG9DRlhXaWRlU3RyaW5nKCkgOiBMIiI7Ci0KLQlDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwotCUFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwotCi0JQ0ZYX0J5dGVUZXh0QnVmIHRleHRCdWY7Ci0JaWYgKCFwSW50ZXJGb3JtLT5FeHBvcnRGb3JtVG9GREZUZXh0QnVmKHRleHRCdWYpKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gcENvbnRleHQtPkdldFJlYWRlckFwcCgpOwotCUFTU0VSVChwRW52ICE9IE5VTEwpOwotCUNKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKLQlBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7Ci0KLQlwUnVudGltZS0+QmVnaW5CbG9jaygpOwotCXBFbnYtPkpTX2RvY21haWxGb3JtKHRleHRCdWYuR2V0QnVmZmVyKCksIHRleHRCdWYuR2V0TGVuZ3RoKCksIGJVSSwgY1RvLmNfc3RyKCksIGNTdWJqZWN0LmNfc3RyKCksIGNDYy5jX3N0cigpLCBjQmNjLmNfc3RyKCksIGNNc2cuY19zdHIoKSk7Ci0JcFJ1bnRpbWUtPkVuZEJsb2NrKCk7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgRG9jdW1lbnQ6OnByaW50KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0JQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwotCUFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKLQotCUZYX0JPT0wgYlVJID0gVFJVRTsKLQlpbnQgblN0YXJ0ID0gMDsKLQlpbnQgbkVuZCA9IDA7Ci0JRlhfQk9PTCBiU2lsZW50ID0gRkFMU0U7Ci0JRlhfQk9PTCBiU2hyaW5rVG9GaXQgPSBGQUxTRTsKLQlGWF9CT09MIGJQcmludEFzSW1hZ2UgPSBGQUxTRTsKLQlGWF9CT09MIGJSZXZlcnNlID0gRkFMU0U7Ci0JRlhfQk9PTCBiQW5ub3RhdGlvbnMgPSBGQUxTRTsKLQotCWludCBubGVuZ3RoID0gcGFyYW1zLnNpemUoKTsKLQlpZihubGVuZ3RoID09OSkKLQl7Ci0JCWlmIChwYXJhbXNbOF0uR2V0VHlwZSgpID09IFZUX2Z4b2JqZWN0KQotCQl7Ci0JCQlKU0ZYT2JqZWN0IHBPYmogPSBwYXJhbXNbOF0uVG9WOE9iamVjdCgpOwotCQkJewotCQkJCWlmIChKU19HZXRPYmpEZWZuSUQocE9iaikgPT0gSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSwgTCJQcmludFBhcmFtc09iaiIpKQotCQkJCXsKLQkJCQkJaWYgKENKU19PYmplY3QqIHBKU09iaiA9IHBhcmFtc1s4XS5Ub0NKU09iamVjdCgpKQotCQkJCQl7Ci0JCQkJCQkJaWYgKFByaW50UGFyYW1zT2JqKiBwcHJpbnRwYXJhbXNPYmogPSAoUHJpbnRQYXJhbXNPYmoqKXBKU09iai0+R2V0RW1iZWRPYmplY3QoKSkKLQkJCQkJCQl7Ci0JCQkJCQkJCWJVSSA9IHBwcmludHBhcmFtc09iai0+YlVJOwotCQkJCQkJCQluU3RhcnQgPSBwcHJpbnRwYXJhbXNPYmotPm5TdGFydDsKLQkJCQkJCQkJbkVuZCA9IHBwcmludHBhcmFtc09iai0+bkVuZDsKLQkJCQkJCQkJYlNpbGVudCA9IHBwcmludHBhcmFtc09iai0+YlNpbGVudDsKLQkJCQkJCQkJYlNocmlua1RvRml0ID0gcHByaW50cGFyYW1zT2JqLT5iU2hyaW5rVG9GaXQ7Ci0JCQkJCQkJCWJQcmludEFzSW1hZ2UgPSBwcHJpbnRwYXJhbXNPYmotPmJQcmludEFzSW1hZ2U7Ci0JCQkJCQkJCWJSZXZlcnNlID0gcHByaW50cGFyYW1zT2JqLT5iUmV2ZXJzZTsKLQkJCQkJCQkJYkFubm90YXRpb25zID0gcHByaW50cGFyYW1zT2JqLT5iQW5ub3RhdGlvbnM7Ci0JCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmKG5sZW5ndGggPj0gMSkKLQkJCWJVSSA9IHBhcmFtc1swXS5Ub0Jvb2woKTsKLQkJaWYobmxlbmd0aCA+PSAyKQotCQkJblN0YXJ0ID0gcGFyYW1zWzFdLlRvSW50KCk7Ci0JCWlmKG5sZW5ndGggPj0gMykKLQkJCW5FbmQgPSBwYXJhbXNbMl0uVG9JbnQoKTsKLQkJaWYobmxlbmd0aCA+PSA0KQotCQkJYlNpbGVudCA9IHBhcmFtc1szXS5Ub0Jvb2woKTsKLQkJaWYobmxlbmd0aCA+PSA1KQotCQkJYlNocmlua1RvRml0ID0gcGFyYW1zWzRdLlRvQm9vbCgpOwotCQlpZihubGVuZ3RoID49IDYpCi0JCQliUHJpbnRBc0ltYWdlID0gcGFyYW1zWzVdLlRvQm9vbCgpOwotCQlpZihubGVuZ3RoID49IDcpCi0JCQliUmV2ZXJzZSA9IHBhcmFtc1s2XS5Ub0Jvb2woKTsKLQkJaWYobmxlbmd0aCA+PSA4KQotCQkJYkFubm90YXRpb25zID0gcGFyYW1zWzddLlRvQm9vbCgpOwotCX0KLQotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQotCWlmIChDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wRG9jdW1lbnQtPkdldEVudigpKQotCXsKLQkJcEVudi0+SlNfZG9jcHJpbnQoYlVJLCBuU3RhcnQsIG5FbmQsIGJTaWxlbnQsIGJTaHJpbmtUb0ZpdCwgYlByaW50QXNJbWFnZSwgYlJldmVyc2UsIGJBbm5vdGF0aW9ucyk7Ci0JCXJldHVybiBUUlVFOwotCX0KLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLS8vcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGZpZWxkIGZyb20gdGhlIGRvY3VtZW50LgotLy9jb21tZW50OgotLy9ub3RlOiBpZiB0aGUgZmlsZWQgbmFtZSBpcyBub3QgcmV0aW9uYWwsIGFkb2JlIGlzIGR1bWIgZm9yIGl0LgotCi1GWF9CT09MIERvY3VtZW50OjpyZW1vdmVGaWVsZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQotCWlmICghKG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpIHx8Ci0JCW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9BTk5PVF9GT1JNKSkpIHJldHVybiBGQUxTRTsKLQotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0JaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgewotCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JQ0ZYX1dpZGVTdHJpbmcgc0ZpZWxkTmFtZSA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKLQlDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwotCUFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwotCi0JQ0ZYX1B0ckFycmF5IHdpZGdldHM7Ci0JcEludGVyRm9ybS0+R2V0V2lkZ2V0cyhzRmllbGROYW1lLCB3aWRnZXRzKTsKLQotCWludCBuU2l6ZSA9IHdpZGdldHMuR2V0U2l6ZSgpOwotCi0JaWYgKG5TaXplID4gMCkKLQl7Ci0JCWZvciAoaW50IGk9MDsgaTxuU2l6ZTsgaSsrKQotCQl7Ci0JCQlDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopd2lkZ2V0c1tpXTsKLQkJCUFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOwotCi0JCQlDUERGX1JlY3QgcmNBbm5vdCA9IHBXaWRnZXQtPkdldFJlY3QoKTsKLQkJCXJjQW5ub3QubGVmdCAtPSAxOwotCQkJcmNBbm5vdC5ib3R0b20gLT0gMTsKLQkJCXJjQW5ub3QucmlnaHQgKz0gMTsKLQkJCXJjQW5ub3QudG9wICs9IDE7Ci0KLQkJCUNGWF9SZWN0QXJyYXkgYVJlZnJlc2g7Ci0JCQlhUmVmcmVzaC5BZGQocmNBbm5vdCk7Ci0KLQkJCUNQREZfUGFnZSogcFBhZ2UgPSBwV2lkZ2V0LT5HZXRQREZQYWdlKCk7Ci0JCQlBU1NFUlQocFBhZ2UgIT0gTlVMTCk7Ci0KLQkJCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IG1fcERvY3VtZW50LT5HZXRQYWdlVmlldyhwUGFnZSk7Ci0JCQlwUGFnZVZpZXctPkRlbGV0ZUFubm90KHBXaWRnZXQpOwotCi0JCQlwUGFnZVZpZXctPlVwZGF0ZVJlY3RzKGFSZWZyZXNoKTsKLQkJfQotCQltX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOwotCX0KLQotCXJldHVybiBUUlVFOwotfQotCi0vL3Jlc2V0IGZpbGVkIHZhbHVlcyB3aXRoaW4gYSBkb2N1bWVudC4KLS8vY29tbWVudDoKLS8vbm90ZTogaWYgdGhlIGZpZWxkcyBuYW1lcyByIG5vdCByYXRpb25hbCwgYW9kYmUgaXMgZHVtYiBmb3IgaXQuCi0KLUZYX0JPT0wgRG9jdW1lbnQ6OnJlc2V0Rm9ybShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQotCWlmICghKG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpIHx8Ci0JCW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9BTk5PVF9GT1JNKSB8fAotCQltX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRklMTF9GT1JNKSkpIHJldHVybiBGQUxTRTsKLQotCUNQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7Ci0JQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7Ci0KLQlDUERGX0ludGVyRm9ybSogcFBERkZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKLQlBU1NFUlQocFBERkZvcm0gIT0gTlVMTCk7Ci0KLQl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IEdldElzb2xhdGUoY2MpOwotCUNKU19BcnJheSBhTmFtZShpc29sYXRlKTsKLQotCWlmIChwYXJhbXMuc2l6ZSgpID4gMCkKLQl7Ci0JCXN3aXRjaCAocGFyYW1zWzBdLkdldFR5cGUoKSkKLQkJewotCQlkZWZhdWx0OgotCQkJYU5hbWUuQXR0YWNoKHBhcmFtc1swXS5Ub1Y4QXJyYXkoKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBWVF9zdHJpbmc6Ci0JCQlhTmFtZS5TZXRFbGVtZW50KDAscGFyYW1zWzBdKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJQ0ZYX1B0ckFycmF5IGFGaWVsZHM7Ci0KLQkJZm9yIChpbnQgaT0wLGlzej1hTmFtZS5HZXRMZW5ndGgoKTsgaTxpc3o7IGkrKykKLQkJewotCQkJQ0pTX1ZhbHVlIHZhbEVsZW1lbnQoaXNvbGF0ZSk7Ci0JCQlhTmFtZS5HZXRFbGVtZW50KGksdmFsRWxlbWVudCk7Ci0JCQlDRlhfV2lkZVN0cmluZyBzd1ZhbCA9IHZhbEVsZW1lbnQuVG9DRlhXaWRlU3RyaW5nKCk7Ci0KLQkJCWZvciAoaW50IGo9MCxqc3o9cFBERkZvcm0tPkNvdW50RmllbGRzKHN3VmFsKTsgajxqc3o7IGorKykKLQkJCXsKLQkJCQlhRmllbGRzLkFkZCgodm9pZCopcFBERkZvcm0tPkdldEZpZWxkKGosc3dWYWwpKTsKLQkJCX0KLQkJfQotCi0JCWlmIChhRmllbGRzLkdldFNpemUoKSA+IDApCi0JCXsKLQkJCXBQREZGb3JtLT5SZXNldEZvcm0oYUZpZWxkcywgVFJVRSwgVFJVRSk7Ci0JCQltX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOwotCi0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJcFBERkZvcm0tPlJlc2V0Rm9ybShUUlVFKTsKLQkJbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKLQotCX0KLQotCXJldHVybiBUUlVFOwotfQotCi0KLUZYX0JPT0wgRG9jdW1lbnQ6OnNhdmVBcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQoteworRlhfQk9PTCBEb2N1bWVudDo6ZXhwb3J0QXNUZXh0KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgogICByZXR1cm4gVFJVRTsKIH0KIAorRlhfQk9PTCBEb2N1bWVudDo6ZXhwb3J0QXNGREYoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCisgIHJldHVybiBUUlVFOworfQogCi1GWF9CT09MIERvY3VtZW50OjpzdWJtaXRGb3JtKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0JaW50IG5TaXplID0gcGFyYW1zLnNpemUoKTsKLQlpZiAoblNpemUgPCAxKSB7Ci0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0JCXJldHVybiBGQUxTRTsKLQl9CitGWF9CT09MIERvY3VtZW50OjpleHBvcnRBc1hGREYoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCisgIHJldHVybiBUUlVFOworfQogCi0JQ0ZYX1dpZGVTdHJpbmcgc3RyVVJMOwotCUZYX0JPT0wgYkZERiA9IFRSVUU7Ci0JRlhfQk9PTCBiRW1wdHkgPSBGQUxTRTsKLQl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IEdldElzb2xhdGUoY2MpOwotCUNKU19BcnJheSBhRmllbGRzKGlzb2xhdGUpOworLy8gTWFwcyBhIGZpZWxkIG9iamVjdCBpbiBQREYgZG9jdW1lbnQgdG8gYSBKYXZhU2NyaXB0IHZhcmlhYmxlCisvLyBjb21tZW50OgorLy8gbm90ZTogdGhlIHBhcmVtdGVyIGNOYW1lLCB0aGlzIGlzIGNsdWUgaG93IHRvIHRyZWF0IGlmIHRoZSBjTmFtZSBpcyBub3QgYQorLy8gdmFsaWFibGUgZmlsZWQgbmFtZSBpbiB0aGlzIGRvY3VtZW50CiAKLQlDSlNfVmFsdWUgdiA9IHBhcmFtc1swXTsKLQlpZiAodi5HZXRUeXBlKCkgPT0gVlRfc3RyaW5nKQotCXsKLQkJc3RyVVJMID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwotCQlpZiAoblNpemUgPiAxKQotCQkJYkZERiA9IHBhcmFtc1sxXS5Ub0Jvb2woKTsKLQkJaWYgKG5TaXplID4gMikKLQkJCWJFbXB0eSA9IHBhcmFtc1syXS5Ub0Jvb2woKTsKLQkJaWYgKG5TaXplID4gMykKLQkJCWFGaWVsZHMuQXR0YWNoKHBhcmFtc1szXS5Ub1Y4QXJyYXkoKSk7Ci0JfQotCWVsc2UgaWYgKHYuR2V0VHlwZSgpID09IFZUX29iamVjdCkKLQl7Ci0JCUpTT2JqZWN0IHBPYmogPSBwYXJhbXNbMF0uVG9WOE9iamVjdCgpOwotCQl2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiY1VSTCIpOwotCQlpZiAoIXBWYWx1ZS5Jc0VtcHR5KCkpCi0JCQlzdHJVUkwgPSBDSlNfVmFsdWUoaXNvbGF0ZSwgcFZhbHVlLCBHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0NGWFdpZGVTdHJpbmcoKTsKLQkJcFZhbHVlID0gSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMImJGREYiKTsKLQkJYkZERiA9IENKU19WYWx1ZShpc29sYXRlLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQm9vbCgpOwotCQlwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiYkVtcHR5Iik7Ci0JCWJFbXB0eSA9IENKU19WYWx1ZShpc29sYXRlLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQm9vbCgpOwotCQlwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosTCJhRmllbGRzIik7Ci0JCWFGaWVsZHMuQXR0YWNoKENKU19WYWx1ZShpc29sYXRlLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvVjhBcnJheSgpKTsKLQl9CitGWF9CT09MIERvY3VtZW50OjpnZXRGaWVsZChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIGlmIChwYXJhbXMuc2l6ZSgpIDwgMSkgeworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLQlDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwotCUFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwotCUNQREZfSW50ZXJGb3JtKiBwUERGSW50ZXJGb3JtID0gcEludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7Ci0JQVNTRVJUKHBQREZJbnRlckZvcm0gIT0gTlVMTCk7CisgIENGWF9XaWRlU3RyaW5nIHdpZGVOYW1lID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwogCi0JRlhfQk9PTCBiQWxsID0gKGFGaWVsZHMuR2V0TGVuZ3RoKCkgPT0gMCk7CisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOworICBDUERGX0ludGVyRm9ybSogcFBERkZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKKyAgaWYgKHBQREZGb3JtLT5Db3VudEZpZWxkcyh3aWRlTmFtZSkgPD0gMCkgeworICAgIHZSZXQuU2V0TnVsbCgpOworICAgIHJldHVybiBUUlVFOworICB9CiAKLQlpZiAoYkFsbCAmJiBiRW1wdHkpCi0JewotCQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0JCUNKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKLQkJQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwRmllbGRPYmogPSBGWEpTX05ld0Z4RHluYW1pY09iaigKKyAgICAgIHBSdW50aW1lLT5HZXRJc29sYXRlKCksIHBSdW50aW1lLCBDSlNfRmllbGQ6Omdfbk9iakRlZm5JRCk7CiAKKyAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSBHZXRJc29sYXRlKGNjKTsKKyAgQ0pTX0ZpZWxkKiBwSlNGaWVsZCA9IChDSlNfRmllbGQqKUZYSlNfR2V0UHJpdmF0ZShpc29sYXRlLCBwRmllbGRPYmopOworICBGaWVsZCogcEZpZWxkID0gKEZpZWxkKilwSlNGaWVsZC0+R2V0RW1iZWRPYmplY3QoKTsKKyAgcEZpZWxkLT5BdHRhY2hGaWVsZCh0aGlzLCB3aWRlTmFtZSk7CiAKLQkJaWYgKHBQREZJbnRlckZvcm0tPkNoZWNrUmVxdWlyZWRGaWVsZHMoKSkKLQkJewotCQkJcFJ1bnRpbWUtPkJlZ2luQmxvY2soKTsKLQkJCXBJbnRlckZvcm0tPlN1Ym1pdEZvcm0oc3RyVVJMLCBGQUxTRSk7Ci0JCQlwUnVudGltZS0+RW5kQmxvY2soKTsKLQkJfQorICB2UmV0ID0gcEpTRmllbGQ7CisgIHJldHVybiBUUlVFOworfQogCi0JCXJldHVybiBUUlVFOwotCX0KLQllbHNlCi0JewotCQlDRlhfUHRyQXJyYXkgZmllbGRPYmplY3RzOworLy8gR2V0cyB0aGUgbmFtZSBvZiB0aGUgbnRoIGZpZWxkIGluIHRoZSBkb2N1bWVudAorRlhfQk9PTCBEb2N1bWVudDo6Z2V0TnRoRmllbGROYW1lKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLQkJZm9yIChpbnQgaT0wLHN6PWFGaWVsZHMuR2V0TGVuZ3RoKCk7IGk8c3o7IGkrKykKLQkJewotCQkJQ0pTX1ZhbHVlIHZhbE5hbWUoaXNvbGF0ZSk7Ci0JCQlhRmllbGRzLkdldEVsZW1lbnQoaSwgdmFsTmFtZSk7Ci0JCQlDRlhfV2lkZVN0cmluZyBzTmFtZSA9IHZhbE5hbWUuVG9DRlhXaWRlU3RyaW5nKCk7CisgIGludCBuSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKKyAgaWYgKG5JbmRleCA8IDApIHsKKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1ZBTFVFRVJST1IpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQogCi0JCQlDUERGX0ludGVyRm9ybSogcFBERkZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKLQkJCUFTU0VSVChwUERGRm9ybSAhPSBOVUxMKTsKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBtX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CisgIENQREZfSW50ZXJGb3JtKiBwUERGRm9ybSA9IHBJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOworICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gcFBERkZvcm0tPkdldEZpZWxkKG5JbmRleCk7CisgIGlmICghcEZpZWxkKQorICAgIHJldHVybiBGQUxTRTsKIAotCQkJZm9yIChpbnQgaj0wLCBqc3o9cFBERkZvcm0tPkNvdW50RmllbGRzKHNOYW1lKTsgajxqc3o7IGorKykKLQkJCXsKLQkJCQlDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gcFBERkZvcm0tPkdldEZpZWxkKGosIHNOYW1lKTsKLQkJCQlpZiAoIWJFbXB0eSAmJiBwRmllbGQtPkdldFZhbHVlKCkuSXNFbXB0eSgpKQotCQkJCQljb250aW51ZTsKKyAgdlJldCA9IHBGaWVsZC0+R2V0RnVsbE5hbWUoKS5jX3N0cigpOworICByZXR1cm4gVFJVRTsKK30KIAotCQkJCWZpZWxkT2JqZWN0cy5BZGQocEZpZWxkKTsKLQkJCX0KLQkJfQorRlhfQk9PTCBEb2N1bWVudDo6aW1wb3J0QW5GREYoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCisgIHJldHVybiBUUlVFOworfQogCi0JCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0JCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQkJQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwotCQlBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7CitGWF9CT09MIERvY3VtZW50OjppbXBvcnRBblhGREYoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCisgIHJldHVybiBUUlVFOworfQogCitGWF9CT09MIERvY3VtZW50OjppbXBvcnRUZXh0RGF0YShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KKyAgcmV0dXJuIFRSVUU7Cit9CiAKLQkJaWYgKHBQREZJbnRlckZvcm0tPkNoZWNrUmVxdWlyZWRGaWVsZHMoJmZpZWxkT2JqZWN0cywgVFJVRSkpCi0JCXsKLQkJCXBSdW50aW1lLT5CZWdpbkJsb2NrKCk7Ci0JCQlwSW50ZXJGb3JtLT5TdWJtaXRGaWVsZHMoc3RyVVJMLCBmaWVsZE9iamVjdHMsIFRSVUUsICFiRkRGKTsKLQkJCXBSdW50aW1lLT5FbmRCbG9jaygpOwotCQl9CisvLyBleHBvcnRzIHRoZSBmb3JtIGRhdGEgYW5kIG1haWxzIHRoZSByZXN1bHRpbmcgZmRmIGZpbGUgYXMgYW4gYXR0YWNobWVudCB0bworLy8gYWxsIHJlY2lwaWVudHMuCisvLyBjb21tZW50OiBuZWVkIHJlYWRlciBzdXBwb3J0cworLy8gbm90ZToKKy8vIGludCBDUERGU0RLX0RvY3VtZW50OjptYWlsRm9ybShGWF9CT09MIGJVSSxTdHJpbmcgY3RvLHN0cmluZyBjY2Msc3RyaW5nCisvLyBjYmNjLHN0cmluZyBjU3ViamVjdCxzdHJpbmcgY21zKTsKIAotCQlyZXR1cm4gVFJVRTsKLQl9CitGWF9CT09MIERvY3VtZW50OjptYWlsRm9ybShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0VYVFJBQ1RfQUNDRVNTKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKKyAgaW50IGlMZW5ndGggPSBwYXJhbXMuc2l6ZSgpOworCisgIEZYX0JPT0wgYlVJID0gaUxlbmd0aCA+IDAgPyBwYXJhbXNbMF0uVG9Cb29sKCkgOiBUUlVFOworICBDRlhfV2lkZVN0cmluZyBjVG8gPSBpTGVuZ3RoID4gMSA/IHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKSA6IEwiIjsKKyAgQ0ZYX1dpZGVTdHJpbmcgY0NjID0gaUxlbmd0aCA+IDIgPyBwYXJhbXNbMl0uVG9DRlhXaWRlU3RyaW5nKCkgOiBMIiI7CisgIENGWF9XaWRlU3RyaW5nIGNCY2MgPSBpTGVuZ3RoID4gMyA/IHBhcmFtc1szXS5Ub0NGWFdpZGVTdHJpbmcoKSA6IEwiIjsKKyAgQ0ZYX1dpZGVTdHJpbmcgY1N1YmplY3QgPSBpTGVuZ3RoID4gNCA/IHBhcmFtc1s0XS5Ub0NGWFdpZGVTdHJpbmcoKSA6IEwiIjsKKyAgQ0ZYX1dpZGVTdHJpbmcgY01zZyA9IGlMZW5ndGggPiA1ID8gcGFyYW1zWzVdLlRvQ0ZYV2lkZVN0cmluZygpIDogTCIiOworCisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0KKyAgICAgIChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOworICBDRlhfQnl0ZVRleHRCdWYgdGV4dEJ1ZjsKKyAgaWYgKCFwSW50ZXJGb3JtLT5FeHBvcnRGb3JtVG9GREZUZXh0QnVmKHRleHRCdWYpKQorICAgIHJldHVybiBGQUxTRTsKKworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gcENvbnRleHQtPkdldFJlYWRlckFwcCgpOworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CisKKyAgcFJ1bnRpbWUtPkJlZ2luQmxvY2soKTsKKyAgcEVudi0+SlNfZG9jbWFpbEZvcm0odGV4dEJ1Zi5HZXRCdWZmZXIoKSwgdGV4dEJ1Zi5HZXRMZW5ndGgoKSwgYlVJLAorICAgICAgICAgICAgICAgICAgICAgICBjVG8uY19zdHIoKSwgY1N1YmplY3QuY19zdHIoKSwgY0NjLmNfc3RyKCksIGNCY2MuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgY01zZy5jX3N0cigpKTsKKyAgcFJ1bnRpbWUtPkVuZEJsb2NrKCk7CisgIHJldHVybiBUUlVFOworfQorCitGWF9CT09MIERvY3VtZW50OjpwcmludChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEZYX0JPT0wgYlVJID0gVFJVRTsKKyAgaW50IG5TdGFydCA9IDA7CisgIGludCBuRW5kID0gMDsKKyAgRlhfQk9PTCBiU2lsZW50ID0gRkFMU0U7CisgIEZYX0JPT0wgYlNocmlua1RvRml0ID0gRkFMU0U7CisgIEZYX0JPT0wgYlByaW50QXNJbWFnZSA9IEZBTFNFOworICBGWF9CT09MIGJSZXZlcnNlID0gRkFMU0U7CisgIEZYX0JPT0wgYkFubm90YXRpb25zID0gRkFMU0U7CisKKyAgaW50IG5sZW5ndGggPSBwYXJhbXMuc2l6ZSgpOworICBpZiAobmxlbmd0aCA9PSA5KSB7CisgICAgaWYgKHBhcmFtc1s4XS5HZXRUeXBlKCkgPT0gQ0pTX1ZhbHVlOjpWVF9meG9iamVjdCkgeworICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmogPSBwYXJhbXNbOF0uVG9WOE9iamVjdCgpOworICAgICAgeworICAgICAgICBpZiAoRlhKU19HZXRPYmpEZWZuSUQocE9iaikgPT0gQ0pTX1ByaW50UGFyYW1zT2JqOjpnX25PYmpEZWZuSUQpIHsKKyAgICAgICAgICBpZiAoQ0pTX09iamVjdCogcEpTT2JqID0gcGFyYW1zWzhdLlRvQ0pTT2JqZWN0KCkpIHsKKyAgICAgICAgICAgIGlmIChQcmludFBhcmFtc09iaiogcHByaW50cGFyYW1zT2JqID0KKyAgICAgICAgICAgICAgICAgICAgKFByaW50UGFyYW1zT2JqKilwSlNPYmotPkdldEVtYmVkT2JqZWN0KCkpIHsKKyAgICAgICAgICAgICAgYlVJID0gcHByaW50cGFyYW1zT2JqLT5iVUk7CisgICAgICAgICAgICAgIG5TdGFydCA9IHBwcmludHBhcmFtc09iai0+blN0YXJ0OworICAgICAgICAgICAgICBuRW5kID0gcHByaW50cGFyYW1zT2JqLT5uRW5kOworICAgICAgICAgICAgICBiU2lsZW50ID0gcHByaW50cGFyYW1zT2JqLT5iU2lsZW50OworICAgICAgICAgICAgICBiU2hyaW5rVG9GaXQgPSBwcHJpbnRwYXJhbXNPYmotPmJTaHJpbmtUb0ZpdDsKKyAgICAgICAgICAgICAgYlByaW50QXNJbWFnZSA9IHBwcmludHBhcmFtc09iai0+YlByaW50QXNJbWFnZTsKKyAgICAgICAgICAgICAgYlJldmVyc2UgPSBwcHJpbnRwYXJhbXNPYmotPmJSZXZlcnNlOworICAgICAgICAgICAgICBiQW5ub3RhdGlvbnMgPSBwcHJpbnRwYXJhbXNPYmotPmJBbm5vdGF0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKG5sZW5ndGggPj0gMSkKKyAgICAgIGJVSSA9IHBhcmFtc1swXS5Ub0Jvb2woKTsKKyAgICBpZiAobmxlbmd0aCA+PSAyKQorICAgICAgblN0YXJ0ID0gcGFyYW1zWzFdLlRvSW50KCk7CisgICAgaWYgKG5sZW5ndGggPj0gMykKKyAgICAgIG5FbmQgPSBwYXJhbXNbMl0uVG9JbnQoKTsKKyAgICBpZiAobmxlbmd0aCA+PSA0KQorICAgICAgYlNpbGVudCA9IHBhcmFtc1szXS5Ub0Jvb2woKTsKKyAgICBpZiAobmxlbmd0aCA+PSA1KQorICAgICAgYlNocmlua1RvRml0ID0gcGFyYW1zWzRdLlRvQm9vbCgpOworICAgIGlmIChubGVuZ3RoID49IDYpCisgICAgICBiUHJpbnRBc0ltYWdlID0gcGFyYW1zWzVdLlRvQm9vbCgpOworICAgIGlmIChubGVuZ3RoID49IDcpCisgICAgICBiUmV2ZXJzZSA9IHBhcmFtc1s2XS5Ub0Jvb2woKTsKKyAgICBpZiAobmxlbmd0aCA+PSA4KQorICAgICAgYkFubm90YXRpb25zID0gcGFyYW1zWzddLlRvQm9vbCgpOworICB9CisKKyAgaWYgKENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BEb2N1bWVudC0+R2V0RW52KCkpIHsKKyAgICBwRW52LT5KU19kb2NwcmludChiVUksIG5TdGFydCwgbkVuZCwgYlNpbGVudCwgYlNocmlua1RvRml0LCBiUHJpbnRBc0ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgIGJSZXZlcnNlLCBiQW5ub3RhdGlvbnMpOworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworLy8gcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGZpZWxkIGZyb20gdGhlIGRvY3VtZW50LgorLy8gY29tbWVudDoKKy8vIG5vdGU6IGlmIHRoZSBmaWxlZCBuYW1lIGlzIG5vdCByZXRpb25hbCwgYWRvYmUgaXMgZHVtYiBmb3IgaXQuCisKK0ZYX0JPT0wgRG9jdW1lbnQ6OnJlbW92ZUZpZWxkKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKCEobV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkgfHwKKyAgICAgICAgbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0FOTk9UX0ZPUk0pKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgQ0ZYX1dpZGVTdHJpbmcgc0ZpZWxkTmFtZSA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPQorICAgICAgKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CisKKyAgc3RkOjp2ZWN0b3I8Q1BERlNES19XaWRnZXQqPiB3aWRnZXRzOworICBwSW50ZXJGb3JtLT5HZXRXaWRnZXRzKHNGaWVsZE5hbWUsICZ3aWRnZXRzKTsKKworICBpZiAod2lkZ2V0cy5lbXB0eSgpKQorICAgIHJldHVybiBUUlVFOworCisgIGZvciAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgOiB3aWRnZXRzKSB7CisgICAgQ1BERl9SZWN0IHJjQW5ub3QgPSBwV2lkZ2V0LT5HZXRSZWN0KCk7CisgICAgLS1yY0Fubm90LmxlZnQ7CisgICAgLS1yY0Fubm90LmJvdHRvbTsKKyAgICArK3JjQW5ub3QucmlnaHQ7CisgICAgKytyY0Fubm90LnRvcDsKKworICAgIENGWF9SZWN0QXJyYXkgYVJlZnJlc2g7CisgICAgYVJlZnJlc2guQWRkKHJjQW5ub3QpOworCisgICAgVW5kZXJseWluZ1BhZ2VUeXBlKiBwUGFnZSA9IHBXaWRnZXQtPkdldFVuZGVybHlpbmdQYWdlKCk7CisgICAgQVNTRVJUKHBQYWdlKTsKKworICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IG1fcERvY3VtZW50LT5HZXRQYWdlVmlldyhwUGFnZSk7CisgICAgcFBhZ2VWaWV3LT5EZWxldGVBbm5vdChwV2lkZ2V0KTsKKyAgICBwUGFnZVZpZXctPlVwZGF0ZVJlY3RzKGFSZWZyZXNoKTsKKyAgfQorICBtX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOworCisgIHJldHVybiBUUlVFOworfQorCisvLyByZXNldCBmaWxlZCB2YWx1ZXMgd2l0aGluIGEgZG9jdW1lbnQuCisvLyBjb21tZW50OgorLy8gbm90ZTogaWYgdGhlIGZpZWxkcyBuYW1lcyByIG5vdCByYXRpb25hbCwgYW9kYmUgaXMgZHVtYiBmb3IgaXQuCisKK0ZYX0JPT0wgRG9jdW1lbnQ6OnJlc2V0Rm9ybShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICghKG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpIHx8CisgICAgICAgIG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9BTk5PVF9GT1JNKSB8fAorICAgICAgICBtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRklMTF9GT1JNKSkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0KKyAgICAgIChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOworICBDUERGX0ludGVyRm9ybSogcFBERkZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKKyAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gQ0pTX1J1bnRpbWU6OkZyb21Db250ZXh0KGNjKTsKKyAgQ0pTX0FycmF5IGFOYW1lKHBSdW50aW1lKTsKKworICBpZiAocGFyYW1zLmVtcHR5KCkpIHsKKyAgICBwUERGRm9ybS0+UmVzZXRGb3JtKFRSVUUpOworICAgIG1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBzd2l0Y2ggKHBhcmFtc1swXS5HZXRUeXBlKCkpIHsKKyAgICBkZWZhdWx0OgorICAgICAgYU5hbWUuQXR0YWNoKHBhcmFtc1swXS5Ub1Y4QXJyYXkoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENKU19WYWx1ZTo6VlRfc3RyaW5nOgorICAgICAgYU5hbWUuU2V0RWxlbWVudCgwLCBwYXJhbXNbMF0pOworICAgICAgYnJlYWs7CisgIH0KKworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IGFGaWVsZHM7CisgIGZvciAoaW50IGkgPSAwLCBpc3ogPSBhTmFtZS5HZXRMZW5ndGgoKTsgaSA8IGlzejsgKytpKSB7CisgICAgQ0pTX1ZhbHVlIHZhbEVsZW1lbnQocFJ1bnRpbWUpOworICAgIGFOYW1lLkdldEVsZW1lbnQoaSwgdmFsRWxlbWVudCk7CisgICAgQ0ZYX1dpZGVTdHJpbmcgc3dWYWwgPSB2YWxFbGVtZW50LlRvQ0ZYV2lkZVN0cmluZygpOworICAgIGZvciAoaW50IGogPSAwLCBqc3ogPSBwUERGRm9ybS0+Q291bnRGaWVsZHMoc3dWYWwpOyBqIDwganN6OyArK2opCisgICAgICBhRmllbGRzLnB1c2hfYmFjayhwUERGRm9ybS0+R2V0RmllbGQoaiwgc3dWYWwpKTsKKyAgfQorCisgIGlmICghYUZpZWxkcy5lbXB0eSgpKSB7CisgICAgcFBERkZvcm0tPlJlc2V0Rm9ybShhRmllbGRzLCBUUlVFLCBUUlVFKTsKKyAgICBtX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgRG9jdW1lbnQ6OnNhdmVBcyhJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KKyAgcmV0dXJuIFRSVUU7Cit9CisKK0ZYX0JPT0wgRG9jdW1lbnQ6OnN1Ym1pdEZvcm0oSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBpbnQgblNpemUgPSBwYXJhbXMuc2l6ZSgpOworICBpZiAoblNpemUgPCAxKSB7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBDSlNfUnVudGltZTo6RnJvbUNvbnRleHQoY2MpOworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IHBSdW50aW1lLT5HZXRJc29sYXRlKCk7CisgIENKU19BcnJheSBhRmllbGRzKHBSdW50aW1lKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgc3RyVVJMOworICBGWF9CT09MIGJGREYgPSBUUlVFOworICBGWF9CT09MIGJFbXB0eSA9IEZBTFNFOworCisgIENKU19WYWx1ZSB2ID0gcGFyYW1zWzBdOworICBpZiAodi5HZXRUeXBlKCkgPT0gQ0pTX1ZhbHVlOjpWVF9zdHJpbmcpIHsKKyAgICBzdHJVUkwgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CisgICAgaWYgKG5TaXplID4gMSkKKyAgICAgIGJGREYgPSBwYXJhbXNbMV0uVG9Cb29sKCk7CisgICAgaWYgKG5TaXplID4gMikKKyAgICAgIGJFbXB0eSA9IHBhcmFtc1syXS5Ub0Jvb2woKTsKKyAgICBpZiAoblNpemUgPiAzKQorICAgICAgYUZpZWxkcy5BdHRhY2gocGFyYW1zWzNdLlRvVjhBcnJheSgpKTsKKyAgfSBlbHNlIGlmICh2LkdldFR5cGUoKSA9PSBDSlNfVmFsdWU6OlZUX29iamVjdCkgeworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqID0gcGFyYW1zWzBdLlRvVjhPYmplY3QoKTsKKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUgPSBGWEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSwgcE9iaiwgTCJjVVJMIik7CisgICAgaWYgKCFwVmFsdWUuSXNFbXB0eSgpKQorICAgICAgc3RyVVJMID0KKyAgICAgICAgICBDSlNfVmFsdWUocFJ1bnRpbWUsIHBWYWx1ZSwgR0VUX1ZBTFVFX1RZUEUocFZhbHVlKSkuVG9DRlhXaWRlU3RyaW5nKCk7CisKKyAgICBwVmFsdWUgPSBGWEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSwgcE9iaiwgTCJiRkRGIik7CisgICAgYkZERiA9IENKU19WYWx1ZShwUnVudGltZSwgcFZhbHVlLCBHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0Jvb2woKTsKKworICAgIHBWYWx1ZSA9IEZYSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMImJFbXB0eSIpOworICAgIGJFbXB0eSA9IENKU19WYWx1ZShwUnVudGltZSwgcFZhbHVlLCBHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0Jvb2woKTsKKworICAgIHBWYWx1ZSA9IEZYSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMImFGaWVsZHMiKTsKKyAgICBhRmllbGRzLkF0dGFjaCgKKyAgICAgICAgQ0pTX1ZhbHVlKHBSdW50aW1lLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvVjhBcnJheSgpKTsKKyAgfQorCisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0KKyAgICAgIChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOworICBDUERGX0ludGVyRm9ybSogcFBERkludGVyRm9ybSA9IHBJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOworICBGWF9CT09MIGJBbGwgPSAoYUZpZWxkcy5HZXRMZW5ndGgoKSA9PSAwKTsKKyAgaWYgKGJBbGwgJiYgYkVtcHR5KSB7CisgICAgaWYgKHBQREZJbnRlckZvcm0tPkNoZWNrUmVxdWlyZWRGaWVsZHMobnVsbHB0ciwgdHJ1ZSkpIHsKKyAgICAgIHBSdW50aW1lLT5CZWdpbkJsb2NrKCk7CisgICAgICBwSW50ZXJGb3JtLT5TdWJtaXRGb3JtKHN0clVSTCwgRkFMU0UpOworICAgICAgcFJ1bnRpbWUtPkVuZEJsb2NrKCk7CisgICAgfQorICAgIHJldHVybiBUUlVFOworICB9CisKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBmaWVsZE9iamVjdHM7CisgIGZvciAoaW50IGkgPSAwLCBzeiA9IGFGaWVsZHMuR2V0TGVuZ3RoKCk7IGkgPCBzejsgKytpKSB7CisgICAgQ0pTX1ZhbHVlIHZhbE5hbWUocFJ1bnRpbWUpOworICAgIGFGaWVsZHMuR2V0RWxlbWVudChpLCB2YWxOYW1lKTsKKworICAgIENGWF9XaWRlU3RyaW5nIHNOYW1lID0gdmFsTmFtZS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgICBDUERGX0ludGVyRm9ybSogcFBERkZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKKyAgICBmb3IgKGludCBqID0gMCwganN6ID0gcFBERkZvcm0tPkNvdW50RmllbGRzKHNOYW1lKTsgaiA8IGpzejsgKytqKSB7CisgICAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gcFBERkZvcm0tPkdldEZpZWxkKGosIHNOYW1lKTsKKyAgICAgIGlmICghYkVtcHR5ICYmIHBGaWVsZC0+R2V0VmFsdWUoKS5Jc0VtcHR5KCkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBmaWVsZE9iamVjdHMucHVzaF9iYWNrKHBGaWVsZCk7CisgICAgfQorICB9CisKKyAgaWYgKHBQREZJbnRlckZvcm0tPkNoZWNrUmVxdWlyZWRGaWVsZHMoJmZpZWxkT2JqZWN0cywgdHJ1ZSkpIHsKKyAgICBwUnVudGltZS0+QmVnaW5CbG9jaygpOworICAgIHBJbnRlckZvcm0tPlN1Ym1pdEZpZWxkcyhzdHJVUkwsIGZpZWxkT2JqZWN0cywgVFJVRSwgIWJGREYpOworICAgIHBSdW50aW1lLT5FbmRCbG9jaygpOworICB9CisgIHJldHVybiBUUlVFOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXZvaWQgRG9jdW1lbnQ6OkF0dGFjaERvYyhDUERGU0RLX0RvY3VtZW50ICpwRG9jKQotewotCW1fcERvY3VtZW50ID0gcERvYzsKK3ZvaWQgRG9jdW1lbnQ6OkF0dGFjaERvYyhDUERGU0RLX0RvY3VtZW50KiBwRG9jKSB7CisgIG1fcERvY3VtZW50ID0gcERvYzsKIH0KIAotQ1BERlNES19Eb2N1bWVudCAqIERvY3VtZW50OjpHZXRSZWFkZXJEb2MoKQotewotCXJldHVybiBtX3BEb2N1bWVudDsKK0NQREZTREtfRG9jdW1lbnQqIERvY3VtZW50OjpHZXRSZWFkZXJEb2MoKSB7CisgIHJldHVybiBtX3BEb2N1bWVudDsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6RXh0cmFjdEZpbGVOYW1lKENQREZTREtfRG9jdW1lbnQgKnBEb2MsQ0ZYX0J5dGVTdHJpbmcgJnN0ckZpbGVOYW1lKQotewotCXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgRG9jdW1lbnQ6OmJvb2ttYXJrUm9vdChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6RXh0cmFjdEZvbGRlck5hbWUoQ1BERlNES19Eb2N1bWVudCAqcERvYyxDRlhfQnl0ZVN0cmluZyAmc3RyRm9sZGVyTmFtZSkKLXsKLQlyZXR1cm4gRkFMU0U7CitGWF9CT09MIERvY3VtZW50OjptYWlsRG9jKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgRlhfQk9PTCBiVUkgPSBUUlVFOworICBDRlhfV2lkZVN0cmluZyBjVG8gPSBMIiI7CisgIENGWF9XaWRlU3RyaW5nIGNDYyA9IEwiIjsKKyAgQ0ZYX1dpZGVTdHJpbmcgY0JjYyA9IEwiIjsKKyAgQ0ZYX1dpZGVTdHJpbmcgY1N1YmplY3QgPSBMIiI7CisgIENGWF9XaWRlU3RyaW5nIGNNc2cgPSBMIiI7CisKKyAgaWYgKHBhcmFtcy5zaXplKCkgPj0gMSkKKyAgICBiVUkgPSBwYXJhbXNbMF0uVG9Cb29sKCk7CisgIGlmIChwYXJhbXMuc2l6ZSgpID49IDIpCisgICAgY1RvID0gcGFyYW1zWzFdLlRvQ0ZYV2lkZVN0cmluZygpOworICBpZiAocGFyYW1zLnNpemUoKSA+PSAzKQorICAgIGNDYyA9IHBhcmFtc1syXS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPj0gNCkKKyAgICBjQmNjID0gcGFyYW1zWzNdLlRvQ0ZYV2lkZVN0cmluZygpOworICBpZiAocGFyYW1zLnNpemUoKSA+PSA1KQorICAgIGNTdWJqZWN0ID0gcGFyYW1zWzRdLlRvQ0ZYV2lkZVN0cmluZygpOworICBpZiAocGFyYW1zLnNpemUoKSA+PSA2KQorICAgIGNNc2cgPSBwYXJhbXNbNV0uVG9DRlhXaWRlU3RyaW5nKCk7CisKKyAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gQ0pTX1J1bnRpbWU6OkZyb21Db250ZXh0KGNjKTsKKyAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSBwUnVudGltZS0+R2V0SXNvbGF0ZSgpOworCisgIGlmIChwYXJhbXMuc2l6ZSgpID49IDEgJiYgcGFyYW1zWzBdLkdldFR5cGUoKSA9PSBDSlNfVmFsdWU6OlZUX29iamVjdCkgeworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqID0gcGFyYW1zWzBdLlRvVjhPYmplY3QoKTsKKworICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSA9IEZYSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMImJVSSIpOworICAgIGJVSSA9IENKU19WYWx1ZShwUnVudGltZSwgcFZhbHVlLCBHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0ludCgpOworCisgICAgcFZhbHVlID0gRlhKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiY1RvIik7CisgICAgY1RvID0gQ0pTX1ZhbHVlKHBSdW50aW1lLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQ0ZYV2lkZVN0cmluZygpOworCisgICAgcFZhbHVlID0gRlhKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiY0NjIik7CisgICAgY0NjID0gQ0pTX1ZhbHVlKHBSdW50aW1lLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQ0ZYV2lkZVN0cmluZygpOworCisgICAgcFZhbHVlID0gRlhKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiY0JjYyIpOworICAgIGNCY2MgPQorICAgICAgICBDSlNfVmFsdWUocFJ1bnRpbWUsIHBWYWx1ZSwgR0VUX1ZBTFVFX1RZUEUocFZhbHVlKSkuVG9DRlhXaWRlU3RyaW5nKCk7CisKKyAgICBwVmFsdWUgPSBGWEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSwgcE9iaiwgTCJjU3ViamVjdCIpOworICAgIGNTdWJqZWN0ID0KKyAgICAgICAgQ0pTX1ZhbHVlKHBSdW50aW1lLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQ0ZYV2lkZVN0cmluZygpOworCisgICAgcFZhbHVlID0gRlhKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiY01zZyIpOworICAgIGNNc2cgPQorICAgICAgICBDSlNfVmFsdWUocFJ1bnRpbWUsIHBWYWx1ZSwgR0VUX1ZBTFVFX1RZUEUocFZhbHVlKSkuVG9DRlhXaWRlU3RyaW5nKCk7CisgIH0KKworICBwUnVudGltZS0+QmVnaW5CbG9jaygpOworICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gcFJ1bnRpbWUtPkdldFJlYWRlckFwcCgpOworICBwRW52LT5KU19kb2NtYWlsRm9ybShOVUxMLCAwLCBiVUksIGNUby5jX3N0cigpLCBjU3ViamVjdC5jX3N0cigpLCBjQ2MuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgY0JjYy5jX3N0cigpLCBjTXNnLmNfc3RyKCkpOworICBwUnVudGltZS0+RW5kQmxvY2soKTsKKworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6Ym9va21hcmtSb290KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgRG9jdW1lbnQ6OmF1dGhvcihJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0aW9uYXJ5ID0gbV9wRG9jdW1lbnQtPkdldFBERkRvY3VtZW50KCktPkdldEluZm8oKTsKKyAgaWYgKCFwRGljdGlvbmFyeSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHZwLklzR2V0dGluZygpKSB7CisgICAgdnAgPDwgcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0KCJBdXRob3IiKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgQ0ZYX1dpZGVTdHJpbmcgY3NBdXRob3I7CisgICAgdnAgPj4gY3NBdXRob3I7CisgICAgcERpY3Rpb25hcnktPlNldEF0U3RyaW5nKCJBdXRob3IiLCBQREZfRW5jb2RlVGV4dChjc0F1dGhvcikpOworICAgIG1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6bWFpbERvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgRG9jdW1lbnQ6OmluZm8oSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0aW9uYXJ5ID0gbV9wRG9jdW1lbnQtPkdldFBERkRvY3VtZW50KCktPkdldEluZm8oKTsKKyAgaWYgKCFwRGljdGlvbmFyeSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlGWF9CT09MIGJVSSA9IFRSVUU7Ci0JQ0ZYX1dpZGVTdHJpbmcgY1RvID0gTCIiOwotCUNGWF9XaWRlU3RyaW5nIGNDYyA9IEwiIjsKLQlDRlhfV2lkZVN0cmluZyBjQmNjID0gTCIiOwotCUNGWF9XaWRlU3RyaW5nIGNTdWJqZWN0ID0gTCIiOwotCUNGWF9XaWRlU3RyaW5nIGNNc2cgPSBMIiI7CisgIENGWF9XaWRlU3RyaW5nIGN3QXV0aG9yID0gcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0KCJBdXRob3IiKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgY3dUaXRsZSA9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiVGl0bGUiKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgY3dTdWJqZWN0ID0gcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0KCJTdWJqZWN0Iik7CisgIENGWF9XaWRlU3RyaW5nIGN3S2V5d29yZHMgPSBwRGljdGlvbmFyeS0+R2V0VW5pY29kZVRleHQoIktleXdvcmRzIik7CisgIENGWF9XaWRlU3RyaW5nIGN3Q3JlYXRvciA9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiQ3JlYXRvciIpOworICBDRlhfV2lkZVN0cmluZyBjd1Byb2R1Y2VyID0gcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0KCJQcm9kdWNlciIpOworICBDRlhfV2lkZVN0cmluZyBjd0NyZWF0aW9uRGF0ZSA9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiQ3JlYXRpb25EYXRlIik7CisgIENGWF9XaWRlU3RyaW5nIGN3TW9kRGF0ZSA9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiTW9kRGF0ZSIpOworICBDRlhfV2lkZVN0cmluZyBjd1RyYXBwZWQgPSBwRGljdGlvbmFyeS0+R2V0VW5pY29kZVRleHQoIlRyYXBwZWQiKTsKIAotCWlmIChwYXJhbXMuc2l6ZSgpID49IDEpCi0JCWJVSSA9IHBhcmFtc1swXS5Ub0Jvb2woKTsKLQlpZiAocGFyYW1zLnNpemUoKSA+PSAyKQotCQljVG8gPSBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKCk7Ci0JaWYgKHBhcmFtcy5zaXplKCkgPj0gMykKLQkJY0NjID0gcGFyYW1zWzJdLlRvQ0ZYV2lkZVN0cmluZygpOwotCWlmIChwYXJhbXMuc2l6ZSgpID49IDQpCi0JCWNCY2MgPSBwYXJhbXNbM10uVG9DRlhXaWRlU3RyaW5nKCk7Ci0JaWYgKHBhcmFtcy5zaXplKCkgPj0gNSkKLQkJY1N1YmplY3QgPSBwYXJhbXNbNF0uVG9DRlhXaWRlU3RyaW5nKCk7Ci0JaWYgKHBhcmFtcy5zaXplKCkgPj0gNikKLQkJY01zZyA9IHBhcmFtc1s1XS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSBHZXRJc29sYXRlKGNjKTsKKyAgaWYgKHZwLklzR2V0dGluZygpKSB7CisgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmogPQorICAgICAgICBGWEpTX05ld0Z4RHluYW1pY09iaihwUnVudGltZS0+R2V0SXNvbGF0ZSgpLCBwUnVudGltZSwgLTEpOworICAgIEZYSlNfUHV0T2JqZWN0U3RyaW5nKGlzb2xhdGUsIHBPYmosIEwiQXV0aG9yIiwgY3dBdXRob3IuY19zdHIoKSk7CisgICAgRlhKU19QdXRPYmplY3RTdHJpbmcoaXNvbGF0ZSwgcE9iaiwgTCJUaXRsZSIsIGN3VGl0bGUuY19zdHIoKSk7CisgICAgRlhKU19QdXRPYmplY3RTdHJpbmcoaXNvbGF0ZSwgcE9iaiwgTCJTdWJqZWN0IiwgY3dTdWJqZWN0LmNfc3RyKCkpOworICAgIEZYSlNfUHV0T2JqZWN0U3RyaW5nKGlzb2xhdGUsIHBPYmosIEwiS2V5d29yZHMiLCBjd0tleXdvcmRzLmNfc3RyKCkpOworICAgIEZYSlNfUHV0T2JqZWN0U3RyaW5nKGlzb2xhdGUsIHBPYmosIEwiQ3JlYXRvciIsIGN3Q3JlYXRvci5jX3N0cigpKTsKKyAgICBGWEpTX1B1dE9iamVjdFN0cmluZyhpc29sYXRlLCBwT2JqLCBMIlByb2R1Y2VyIiwgY3dQcm9kdWNlci5jX3N0cigpKTsKKyAgICBGWEpTX1B1dE9iamVjdFN0cmluZyhpc29sYXRlLCBwT2JqLCBMIkNyZWF0aW9uRGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY3dDcmVhdGlvbkRhdGUuY19zdHIoKSk7CisgICAgRlhKU19QdXRPYmplY3RTdHJpbmcoaXNvbGF0ZSwgcE9iaiwgTCJNb2REYXRlIiwgY3dNb2REYXRlLmNfc3RyKCkpOworICAgIEZYSlNfUHV0T2JqZWN0U3RyaW5nKGlzb2xhdGUsIHBPYmosIEwiVHJhcHBlZCIsIGN3VHJhcHBlZC5jX3N0cigpKTsKIAotCXY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7CisgICAgLy8gSXQncyB0byBiZSBjb21wYXRpYmxlIHRvIG5vbi1zdGFuZGFyZCBpbmZvIGRpY3Rpb25hcnkuCisgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6ICpwRGljdGlvbmFyeSkgeworICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJzS2V5ID0gaXQuZmlyc3Q7CisgICAgICBDUERGX09iamVjdCogcFZhbHVlT2JqID0gaXQuc2Vjb25kOworICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NLZXkgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNLZXksIGJzS2V5LkdldExlbmd0aCgpKTsKIAotCWlmKHBhcmFtcy5zaXplKCkgPj0gMSAmJiBwYXJhbXNbMF0uR2V0VHlwZSgpID09IFZUX29iamVjdCkKLQl7Ci0JCUpTT2JqZWN0IHBPYmogPSBwYXJhbXNbMF0uVG9WOE9iamVjdCgpOwotCi0JCXY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSxwT2JqLCBMImJVSSIpOwotCQliVUkgPSBDSlNfVmFsdWUoaXNvbGF0ZSxwVmFsdWUsR0VUX1ZBTFVFX1RZUEUocFZhbHVlKSkuVG9JbnQoKTsKLQotCQlwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUscE9iaiwgTCJjVG8iKTsKLQkJY1RvID0gQ0pTX1ZhbHVlKGlzb2xhdGUscFZhbHVlLEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQ0ZYV2lkZVN0cmluZygpOwotCi0JCXBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSxwT2JqLCBMImNDYyIpOwotCQljQ2MgPSBDSlNfVmFsdWUoaXNvbGF0ZSxwVmFsdWUsR0VUX1ZBTFVFX1RZUEUocFZhbHVlKSkuVG9DRlhXaWRlU3RyaW5nKCk7Ci0KLQkJcFZhbHVlID0gSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLHBPYmosIEwiY0JjYyIpOwotCQljQmNjID0gQ0pTX1ZhbHVlKGlzb2xhdGUscFZhbHVlLEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQ0ZYV2lkZVN0cmluZygpOwotCi0JCXBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSxwT2JqLCBMImNTdWJqZWN0Iik7Ci0JCWNTdWJqZWN0ID0gQ0pTX1ZhbHVlKGlzb2xhdGUscFZhbHVlLEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQ0ZYV2lkZVN0cmluZygpOwotCi0JCXBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSxwT2JqLCBMImNNc2ciKTsKLQkJY01zZyA9IENKU19WYWx1ZShpc29sYXRlLHBWYWx1ZSxHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0NGWFdpZGVTdHJpbmcoKTsKLQotCX0KLQotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCUNKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKLQlBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7Ci0KLQlwUnVudGltZS0+QmVnaW5CbG9jaygpOwotCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBwUnVudGltZS0+R2V0UmVhZGVyQXBwKCk7Ci0JcEVudi0+SlNfZG9jbWFpbEZvcm0oTlVMTCwgMCwgYlVJLCBjVG8uY19zdHIoKSwgY1N1YmplY3QuY19zdHIoKSwgY0NjLmNfc3RyKCksIGNCY2MuY19zdHIoKSwgY01zZy5jX3N0cigpKTsKLQlwUnVudGltZS0+RW5kQmxvY2soKTsKLQotCXJldHVybiBUUlVFOworICAgICAgaWYgKHBWYWx1ZU9iai0+SXNTdHJpbmcoKSB8fCBwVmFsdWVPYmotPklzTmFtZSgpKSB7CisgICAgICAgIEZYSlNfUHV0T2JqZWN0U3RyaW5nKGlzb2xhdGUsIHBPYmosIHdzS2V5LmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWYWx1ZU9iai0+R2V0VW5pY29kZVRleHQoKS5jX3N0cigpKTsKKyAgICAgIH0gZWxzZSBpZiAocFZhbHVlT2JqLT5Jc051bWJlcigpKSB7CisgICAgICAgIEZYSlNfUHV0T2JqZWN0TnVtYmVyKGlzb2xhdGUsIHBPYmosIHdzS2V5LmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdClwVmFsdWVPYmotPkdldE51bWJlcigpKTsKKyAgICAgIH0gZWxzZSBpZiAocFZhbHVlT2JqLT5Jc0Jvb2xlYW4oKSkgeworICAgICAgICBGWEpTX1B1dE9iamVjdEJvb2xlYW4oaXNvbGF0ZSwgcE9iaiwgd3NLZXkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChib29sKXBWYWx1ZU9iai0+R2V0SW50ZWdlcigpKTsKKyAgICAgIH0KKyAgICB9CisgICAgdnAgPDwgcE9iajsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6YXV0aG9yKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIERvY3VtZW50OjpjcmVhdGlvbkRhdGUoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXRQREZEb2N1bWVudCgpLT5HZXRJbmZvKCk7CisgIGlmICghcERpY3Rpb25hcnkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRJbmZvKCk7Ci0JaWYgKCFwRGljdGlvbmFyeSlyZXR1cm4gRkFMU0U7CisgIGlmICh2cC5Jc0dldHRpbmcoKSkgeworICAgIHZwIDw8IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiQ3JlYXRpb25EYXRlIik7CisgIH0gZWxzZSB7CisgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCWlmICh2cC5Jc0dldHRpbmcoKSkKLQl7Ci0JCXZwIDw8IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiQXV0aG9yIik7Ci0JCXJldHVybiBUUlVFOwotCX0KLQllbHNlCi0JewotCQlpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpKSByZXR1cm4gRkFMU0U7Ci0KLQkJQ0ZYX1dpZGVTdHJpbmcgY3NBdXRob3I7Ci0JCXZwID4+IGNzQXV0aG9yOwotCQlwRGljdGlvbmFyeS0+U2V0QXRTdHJpbmcoIkF1dGhvciIsIFBERl9FbmNvZGVUZXh0KGNzQXV0aG9yKSk7Ci0JCW1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7Ci0JCXJldHVybiBUUlVFOwotCX0KKyAgICBDRlhfV2lkZVN0cmluZyBjc0NyZWF0aW9uRGF0ZTsKKyAgICB2cCA+PiBjc0NyZWF0aW9uRGF0ZTsKKyAgICBwRGljdGlvbmFyeS0+U2V0QXRTdHJpbmcoIkNyZWF0aW9uRGF0ZSIsIFBERl9FbmNvZGVUZXh0KGNzQ3JlYXRpb25EYXRlKSk7CisgICAgbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6aW5mbyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworRlhfQk9PTCBEb2N1bWVudDo6Y3JlYXRvcihJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BEb2N1bWVudC0+R2V0UERGRG9jdW1lbnQoKS0+R2V0SW5mbygpOworICBpZiAoIXBEaWN0aW9uYXJ5KQorICAgIHJldHVybiBGQUxTRTsKIAotCUNQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0SW5mbygpOwotCWlmICghcERpY3Rpb25hcnkpcmV0dXJuIEZBTFNFOworICBpZiAodnAuSXNHZXR0aW5nKCkpIHsKKyAgICB2cCA8PCBwRGljdGlvbmFyeS0+R2V0VW5pY29kZVRleHQoIkNyZWF0b3IiKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JQ0ZYX1dpZGVTdHJpbmcgY3dBdXRob3IJCQk9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiQXV0aG9yIik7Ci0JQ0ZYX1dpZGVTdHJpbmcgY3dUaXRsZQkJCT0gcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0KCJUaXRsZSIpOwotCUNGWF9XaWRlU3RyaW5nIGN3U3ViamVjdAkJPSBwRGljdGlvbmFyeS0+R2V0VW5pY29kZVRleHQoIlN1YmplY3QiKTsKLQlDRlhfV2lkZVN0cmluZyBjd0tleXdvcmRzCQk9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiS2V5d29yZHMiKTsKLQlDRlhfV2lkZVN0cmluZyBjd0NyZWF0b3IJCT0gcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0KCJDcmVhdG9yIik7Ci0JQ0ZYX1dpZGVTdHJpbmcgY3dQcm9kdWNlcgkJPSBwRGljdGlvbmFyeS0+R2V0VW5pY29kZVRleHQoIlByb2R1Y2VyIik7Ci0JQ0ZYX1dpZGVTdHJpbmcgY3dDcmVhdGlvbkRhdGUJPSBwRGljdGlvbmFyeS0+R2V0VW5pY29kZVRleHQoIkNyZWF0aW9uRGF0ZSIpOwotCUNGWF9XaWRlU3RyaW5nIGN3TW9kRGF0ZQkJPSBwRGljdGlvbmFyeS0+R2V0VW5pY29kZVRleHQoIk1vZERhdGUiKTsKLQlDRlhfV2lkZVN0cmluZyBjd1RyYXBwZWQJCT0gcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0KCJUcmFwcGVkIik7Ci0KLQl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IEdldElzb2xhdGUoY2MpOwotCWlmICh2cC5Jc0dldHRpbmcoKSkKLQl7Ci0JCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwotCQlDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7Ci0KLQkJSlNGWE9iamVjdCAgcE9iaiA9IEpTX05ld0Z4RHluYW1pY09iaigqcFJ1bnRpbWUsIHBDb250ZXh0LCAtMSk7Ci0KLQkJSlNfUHV0T2JqZWN0U3RyaW5nKGlzb2xhdGUsIHBPYmosIEwiQXV0aG9yIiwgY3dBdXRob3IuY19zdHIoKSk7Ci0JCUpTX1B1dE9iamVjdFN0cmluZyhpc29sYXRlLCBwT2JqLCBMIlRpdGxlIiwgY3dUaXRsZS5jX3N0cigpKTsKLQkJSlNfUHV0T2JqZWN0U3RyaW5nKGlzb2xhdGUsIHBPYmosIEwiU3ViamVjdCIsIGN3U3ViamVjdC5jX3N0cigpKTsKLQkJSlNfUHV0T2JqZWN0U3RyaW5nKGlzb2xhdGUsIHBPYmosIEwiS2V5d29yZHMiLCBjd0tleXdvcmRzLmNfc3RyKCkpOwotCQlKU19QdXRPYmplY3RTdHJpbmcoaXNvbGF0ZSwgcE9iaiwgTCJDcmVhdG9yIiwgY3dDcmVhdG9yLmNfc3RyKCkpOwotCQlKU19QdXRPYmplY3RTdHJpbmcoaXNvbGF0ZSwgcE9iaiwgTCJQcm9kdWNlciIsIGN3UHJvZHVjZXIuY19zdHIoKSk7Ci0JCUpTX1B1dE9iamVjdFN0cmluZyhpc29sYXRlLCBwT2JqLCBMIkNyZWF0aW9uRGF0ZSIsIGN3Q3JlYXRpb25EYXRlLmNfc3RyKCkpOwotCQlKU19QdXRPYmplY3RTdHJpbmcoaXNvbGF0ZSwgcE9iaiwgTCJNb2REYXRlIiwgY3dNb2REYXRlLmNfc3RyKCkpOwotCQlKU19QdXRPYmplY3RTdHJpbmcoaXNvbGF0ZSwgcE9iaiwgTCJUcmFwcGVkIiwgY3dUcmFwcGVkLmNfc3RyKCkpOwotCi0vLyBJdCdzIHRvIGJlIGNvbXBhdGlibGUgdG8gbm9uLXN0YW5kYXJkIGluZm8gZGljdGlvbmFyeS4KLQkJRlhfUE9TSVRJT04gcG9zID0gcERpY3Rpb25hcnktPkdldFN0YXJ0UG9zKCk7Ci0JCXdoaWxlKHBvcykKLQkJewotCQkJQ0ZYX0J5dGVTdHJpbmcgYnNLZXk7Ci0JCQlDUERGX09iamVjdCogcFZhbHVlT2JqID0gcERpY3Rpb25hcnktPkdldE5leHRFbGVtZW50KHBvcywgYnNLZXkpOwotCQkJQ0ZYX1dpZGVTdHJpbmcgd3NLZXkgID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzS2V5LCBic0tleS5HZXRMZW5ndGgoKSk7Ci0JCQlpZigocFZhbHVlT2JqLT5HZXRUeXBlKCk9PVBERk9CSl9TVFJJTkcpIHx8IChwVmFsdWVPYmotPkdldFR5cGUoKT09UERGT0JKX05BTUUpICkKLQkJCQlKU19QdXRPYmplY3RTdHJpbmcoaXNvbGF0ZSwgcE9iaiwgd3NLZXkuY19zdHIoKSwgcFZhbHVlT2JqLT5HZXRVbmljb2RlVGV4dCgpLmNfc3RyKCkpOwotCQkJaWYocFZhbHVlT2JqLT5HZXRUeXBlKCk9PVBERk9CSl9OVU1CRVIpCi0JCQkJSlNfUHV0T2JqZWN0TnVtYmVyKGlzb2xhdGUscE9iaiwgd3NLZXkuY19zdHIoKSwgKGZsb2F0KXBWYWx1ZU9iai0+R2V0TnVtYmVyKCkpOwotCQkJaWYocFZhbHVlT2JqLT5HZXRUeXBlKCk9PVBERk9CSl9CT09MRUFOKQotCQkJCUpTX1B1dE9iamVjdEJvb2xlYW4oaXNvbGF0ZSxwT2JqLCB3c0tleS5jX3N0cigpLCAoYm9vbClwVmFsdWVPYmotPkdldEludGVnZXIoKSk7Ci0JCX0KLQotCQl2cCA8PCBwT2JqOwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JZWxzZQotCXsKLQkJcmV0dXJuIFRSVUU7Ci0JfQorICAgIENGWF9XaWRlU3RyaW5nIGNzQ3JlYXRvcjsKKyAgICB2cCA+PiBjc0NyZWF0b3I7CisgICAgcERpY3Rpb25hcnktPlNldEF0U3RyaW5nKCJDcmVhdG9yIiwgUERGX0VuY29kZVRleHQoY3NDcmVhdG9yKSk7CisgICAgbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6Y3JlYXRpb25EYXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIERvY3VtZW50OjpkZWxheShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKHZwLklzR2V0dGluZygpKSB7CisgICAgdnAgPDwgbV9iRGVsYXk7CisgIH0gZWxzZSB7CisgICAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCUNQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0SW5mbygpOwotCWlmICghcERpY3Rpb25hcnkpcmV0dXJuIEZBTFNFOworICAgIHZwID4+IG1fYkRlbGF5OworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gbV9EZWxheURhdGEuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKKyAgICAgICAgZGVsZXRlIG1fRGVsYXlEYXRhLkdldEF0KGkpOwogCi0JaWYgKHZwLklzR2V0dGluZygpKQotCXsKLQkJdnAgPDwgcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0KCJDcmVhdGlvbkRhdGUiKTsKLQkJcmV0dXJuIFRSVUU7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpIHJldHVybiBGQUxTRTsKLQotCQlDRlhfV2lkZVN0cmluZyBjc0NyZWF0aW9uRGF0ZTsKLQkJdnAgPj4gY3NDcmVhdGlvbkRhdGU7Ci0JCXBEaWN0aW9uYXJ5LT5TZXRBdFN0cmluZygiQ3JlYXRpb25EYXRlIiwgUERGX0VuY29kZVRleHQoY3NDcmVhdGlvbkRhdGUpKTsKLQkJbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKLQotCQlyZXR1cm4gVFJVRTsKLQl9CisgICAgICBtX0RlbGF5RGF0YS5SZW1vdmVBbGwoKTsKKyAgICB9IGVsc2UgeworICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q0pTX0RlbGF5RGF0YSo+IERlbGF5RGF0YVRvUHJvY2VzczsKKyAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IG1fRGVsYXlEYXRhLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgaWYgKENKU19EZWxheURhdGEqIHBEYXRhID0gbV9EZWxheURhdGEuR2V0QXQoaSkpIHsKKyAgICAgICAgICBEZWxheURhdGFUb1Byb2Nlc3MuQWRkKHBEYXRhKTsKKyAgICAgICAgICBtX0RlbGF5RGF0YS5TZXRBdChpLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbV9EZWxheURhdGEuUmVtb3ZlQWxsKCk7CisgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBEZWxheURhdGFUb1Byb2Nlc3MuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgICAgICBDSlNfRGVsYXlEYXRhKiBwRGF0YSA9IERlbGF5RGF0YVRvUHJvY2Vzcy5HZXRBdChpKTsKKyAgICAgICAgRmllbGQ6OkRvRGVsYXkobV9wRG9jdW1lbnQsIHBEYXRhKTsKKyAgICAgICAgRGVsYXlEYXRhVG9Qcm9jZXNzLlNldEF0KGksIE5VTEwpOworICAgICAgICBkZWxldGUgcERhdGE7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpjcmVhdG9yKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIERvY3VtZW50OjprZXl3b3JkcyhJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXRQREZEb2N1bWVudCgpLT5HZXRJbmZvKCk7CisgIGlmICghcERpY3Rpb25hcnkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRJbmZvKCk7Ci0JaWYgKCFwRGljdGlvbmFyeSlyZXR1cm4gRkFMU0U7CisgIGlmICh2cC5Jc0dldHRpbmcoKSkgeworICAgIHZwIDw8IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiS2V5d29yZHMiKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JaWYgKHZwLklzR2V0dGluZygpKQotCXsKLQkJdnAgPDwgcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0KCJDcmVhdG9yIik7Ci0JCXJldHVybiBUUlVFOwotCX0KLQllbHNlCi0JewotCQlpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpKSByZXR1cm4gRkFMU0U7Ci0KLQkJQ0ZYX1dpZGVTdHJpbmcgY3NDcmVhdG9yOwotCQl2cCA+PiBjc0NyZWF0b3I7Ci0JCXBEaWN0aW9uYXJ5LT5TZXRBdFN0cmluZygiQ3JlYXRvciIsIFBERl9FbmNvZGVUZXh0KGNzQ3JlYXRvcikpOwotCQltX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOwotCQlyZXR1cm4gVFJVRTsKLQl9CisgICAgQ0ZYX1dpZGVTdHJpbmcgY3NLZXl3b3JkczsKKyAgICB2cCA+PiBjc0tleXdvcmRzOworICAgIHBEaWN0aW9uYXJ5LT5TZXRBdFN0cmluZygiS2V5d29yZHMiLCBQREZfRW5jb2RlVGV4dChjc0tleXdvcmRzKSk7CisgICAgbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6ZGVsYXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCWlmICh2cC5Jc0dldHRpbmcoKSkKLQl7Ci0JCXZwIDw8IG1fYkRlbGF5OwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JZWxzZQotCXsKLQkJQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworRlhfQk9PTCBEb2N1bWVudDo6bW9kRGF0ZShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BEb2N1bWVudC0+R2V0UERGRG9jdW1lbnQoKS0+R2V0SW5mbygpOworICBpZiAoIXBEaWN0aW9uYXJ5KQorICAgIHJldHVybiBGQUxTRTsKIAotCQlpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpKSByZXR1cm4gRkFMU0U7CisgIGlmICh2cC5Jc0dldHRpbmcoKSkgeworICAgIHZwIDw8IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiTW9kRGF0ZSIpOworICB9IGVsc2UgeworICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJYm9vbCBiOwotCQl2cCA+PiBiOwotCi0JCW1fYkRlbGF5ID0gYjsKLQotCQlpZiAobV9iRGVsYXkpCi0JCXsKLQkJCWZvciAoaW50IGk9MCxzej1tX0RlbGF5RGF0YS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQkJCQlkZWxldGUgbV9EZWxheURhdGEuR2V0QXQoaSk7Ci0KLQkJCW1fRGVsYXlEYXRhLlJlbW92ZUFsbCgpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJQ0ZYX0FycmF5VGVtcGxhdGU8Q0pTX0RlbGF5RGF0YSo+IERlbGF5RGF0YVRvUHJvY2VzczsKLQotCQkJZm9yIChpbnQgaT0wLHN6PW1fRGVsYXlEYXRhLkdldFNpemUoKTsgaSA8IHN6OyBpKyspCi0JCQl7Ci0JCQkJaWYgKENKU19EZWxheURhdGEqIHBEYXRhID0gbV9EZWxheURhdGEuR2V0QXQoaSkpCi0JCQkJewotCQkJCQlEZWxheURhdGFUb1Byb2Nlc3MuQWRkKHBEYXRhKTsKLQkJCQkJbV9EZWxheURhdGEuU2V0QXQoaSwgTlVMTCk7Ci0JCQkJfQotCQkJfQotCQkJbV9EZWxheURhdGEuUmVtb3ZlQWxsKCk7Ci0KLQkJCWZvciAoaW50IGk9MCxzej1EZWxheURhdGFUb1Byb2Nlc3MuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKLQkJCXsKLQkJCQlDSlNfRGVsYXlEYXRhKiBwRGF0YSA9IERlbGF5RGF0YVRvUHJvY2Vzcy5HZXRBdChpKTsKLQkJCQlGaWVsZDo6RG9EZWxheShtX3BEb2N1bWVudCwgcERhdGEpOwotCQkJCURlbGF5RGF0YVRvUHJvY2Vzcy5TZXRBdChpLE5VTEwpOwotCQkJCWRlbGV0ZSBwRGF0YTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBUUlVFOwotCX0KKyAgICBDRlhfV2lkZVN0cmluZyBjc21vZERhdGU7CisgICAgdnAgPj4gY3Ntb2REYXRlOworICAgIHBEaWN0aW9uYXJ5LT5TZXRBdFN0cmluZygiTW9kRGF0ZSIsIFBERl9FbmNvZGVUZXh0KGNzbW9kRGF0ZSkpOworICAgIG1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmtleXdvcmRzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIERvY3VtZW50Ojpwcm9kdWNlcihJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXRQREZEb2N1bWVudCgpLT5HZXRJbmZvKCk7CisgIGlmICghcERpY3Rpb25hcnkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRJbmZvKCk7Ci0JaWYgKCFwRGljdGlvbmFyeSlyZXR1cm4gRkFMU0U7CisgIGlmICh2cC5Jc0dldHRpbmcoKSkgeworICAgIHZwIDw8IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiUHJvZHVjZXIiKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JaWYgKHZwLklzR2V0dGluZygpKQotCXsKLQkJdnAgPDwgcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0KCJLZXl3b3JkcyIpOwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JZWxzZQotCXsKLQkJaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSkgcmV0dXJuIEZBTFNFOwotCi0JCUNGWF9XaWRlU3RyaW5nIGNzS2V5d29yZHM7Ci0JCXZwID4+IGNzS2V5d29yZHM7Ci0JCXBEaWN0aW9uYXJ5LT5TZXRBdFN0cmluZygiS2V5d29yZHMiLCBQREZfRW5jb2RlVGV4dChjc0tleXdvcmRzKSk7Ci0JCW1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7Ci0JCXJldHVybiBUUlVFOwotCX0KKyAgICBDRlhfV2lkZVN0cmluZyBjc3Byb2R1Y2VyOworICAgIHZwID4+IGNzcHJvZHVjZXI7CisgICAgcERpY3Rpb25hcnktPlNldEF0U3RyaW5nKCJQcm9kdWNlciIsIFBERl9FbmNvZGVUZXh0KGNzcHJvZHVjZXIpKTsKKyAgICBtX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOworICB9CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIERvY3VtZW50Ojptb2REYXRlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIERvY3VtZW50OjpzdWJqZWN0KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXRQREZEb2N1bWVudCgpLT5HZXRJbmZvKCk7CisgIGlmICghcERpY3Rpb25hcnkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRJbmZvKCk7Ci0JaWYgKCFwRGljdGlvbmFyeSlyZXR1cm4gRkFMU0U7CisgIGlmICh2cC5Jc0dldHRpbmcoKSkgeworICAgIHZwIDw8IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiU3ViamVjdCIpOworICB9IGVsc2UgeworICAgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQlpZiAodnAuSXNHZXR0aW5nKCkpCi0JewotCQl2cCA8PCBwRGljdGlvbmFyeS0+R2V0VW5pY29kZVRleHQoIk1vZERhdGUiKTsKLQkJcmV0dXJuIFRSVUU7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkpIHJldHVybiBGQUxTRTsKLQotCQlDRlhfV2lkZVN0cmluZyBjc21vZERhdGU7Ci0JCXZwID4+IGNzbW9kRGF0ZTsKLQkJcERpY3Rpb25hcnktPlNldEF0U3RyaW5nKCJNb2REYXRlIiwgUERGX0VuY29kZVRleHQoY3Ntb2REYXRlKSk7Ci0JCW1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7Ci0JCXJldHVybiBUUlVFOwotCX0KKyAgICBDRlhfV2lkZVN0cmluZyBjc3N1YmplY3Q7CisgICAgdnAgPj4gY3NzdWJqZWN0OworICAgIHBEaWN0aW9uYXJ5LT5TZXRBdFN0cmluZygiU3ViamVjdCIsIFBERl9FbmNvZGVUZXh0KGNzc3ViamVjdCkpOworICAgIG1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OnByb2R1Y2VyKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIERvY3VtZW50Ojp0aXRsZShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKCFtX3BEb2N1bWVudCB8fCAhbV9wRG9jdW1lbnQtPkdldFVuZGVybHlpbmdEb2N1bWVudCgpKQorICAgIHJldHVybiBGQUxTRTsKIAotCUNQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKS0+R2V0SW5mbygpOwotCWlmICghcERpY3Rpb25hcnkpcmV0dXJuIEZBTFNFOworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0aW9uYXJ5ID0gbV9wRG9jdW1lbnQtPkdldFBERkRvY3VtZW50KCktPkdldEluZm8oKTsKKyAgaWYgKCFwRGljdGlvbmFyeSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlpZiAodnAuSXNHZXR0aW5nKCkpCi0JewotCQl2cCA8PCBwRGljdGlvbmFyeS0+R2V0VW5pY29kZVRleHQoIlByb2R1Y2VyIik7Ci0JCXJldHVybiBUUlVFOwotCX0KLQllbHNlCi0JewotCQlpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpKSByZXR1cm4gRkFMU0U7CisgIGlmICh2cC5Jc0dldHRpbmcoKSkgeworICAgIHZwIDw8IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiVGl0bGUiKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCUNGWF9XaWRlU3RyaW5nIGNzcHJvZHVjZXI7Ci0JCXZwID4+IGNzcHJvZHVjZXI7Ci0JCXBEaWN0aW9uYXJ5LT5TZXRBdFN0cmluZygiUHJvZHVjZXIiLCBQREZfRW5jb2RlVGV4dChjc3Byb2R1Y2VyKSk7Ci0JCW1fcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7Ci0JCXJldHVybiBUUlVFOwotCX0KKyAgICBDRlhfV2lkZVN0cmluZyBjc3RpdGxlOworICAgIHZwID4+IGNzdGl0bGU7CisgICAgcERpY3Rpb25hcnktPlNldEF0U3RyaW5nKCJUaXRsZSIsIFBERl9FbmNvZGVUZXh0KGNzdGl0bGUpKTsKKyAgICBtX3BEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOworICB9CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpzdWJqZWN0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLQlDUERGX0RpY3Rpb25hcnkqIHBEaWN0aW9uYXJ5ID0gbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCktPkdldEluZm8oKTsKLQlpZiAoIXBEaWN0aW9uYXJ5KXJldHVybiBGQUxTRTsKLQotCWlmICh2cC5Jc0dldHRpbmcoKSkKLQl7Ci0JCXZwIDw8IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dCgiU3ViamVjdCIpOwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JZWxzZQotCXsKLQkJaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSkgcmV0dXJuIEZBTFNFOwotCi0JCUNGWF9XaWRlU3RyaW5nIGNzc3ViamVjdDsKLQkJdnAgPj4gY3NzdWJqZWN0OwotCQlwRGljdGlvbmFyeS0+U2V0QXRTdHJpbmcoIlN1YmplY3QiLCBQREZfRW5jb2RlVGV4dChjc3N1YmplY3QpKTsKLQkJbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKLQkJcmV0dXJuIFRSVUU7Ci0JfQorRlhfQk9PTCBEb2N1bWVudDo6bnVtUGFnZXMoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IHN0YXRpY19jYXN0PENKU19Db250ZXh0Kj4oY2MpOworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkVBRE9OTFkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICB2cCA8PCBtX3BEb2N1bWVudC0+R2V0UGFnZUNvdW50KCk7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIERvY3VtZW50Ojp0aXRsZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0JaWYgKG1fcERvY3VtZW50ID09IE5VTEwgfHwgbV9wRG9jdW1lbnQtPkdldERvY3VtZW50KCkgPT0gTlVMTCkKLQkJcmV0dXJuIEZBTFNFOwotCi0JQ1BERl9EaWN0aW9uYXJ5KiBwRGljdGlvbmFyeSA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpLT5HZXRJbmZvKCk7Ci0JaWYgKCFwRGljdGlvbmFyeSlyZXR1cm4gRkFMU0U7Ci0KLQlpZiAodnAuSXNHZXR0aW5nKCkpCi0JewotCQl2cCA8PCBwRGljdGlvbmFyeS0+R2V0VW5pY29kZVRleHQoIlRpdGxlIik7Ci0JCXJldHVybiBUUlVFOwotCX0KLQllbHNlCi0JewotCQlpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpKSByZXR1cm4gRkFMU0U7Ci0KLQkJQ0ZYX1dpZGVTdHJpbmcgY3N0aXRsZTsKLQkJdnAgPj4gY3N0aXRsZTsKLQkJcERpY3Rpb25hcnktPlNldEF0U3RyaW5nKCJUaXRsZSIsIFBERl9FbmNvZGVUZXh0KGNzdGl0bGUpKTsKLQkJbV9wRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKLQkJcmV0dXJuIFRSVUU7Ci0JfQorRlhfQk9PTCBEb2N1bWVudDo6ZXh0ZXJuYWwoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIC8vIEluIENocm9tZSBjYXNlLHNob3VsZCBhbHdheXMgcmV0dXJuIHRydWUuCisgIGlmICh2cC5Jc0dldHRpbmcoKSkgeworICAgIHZwIDw8IHRydWU7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6Om51bVBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlpZiAodnAuSXNTZXR0aW5nKCkpIHsKLQkJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7Ci0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkVBRE9OTFkpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCXZwIDw8IG1fcERvY3VtZW50LT5HZXRQYWdlQ291bnQoKTsKLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgRG9jdW1lbnQ6OmZpbGVzaXplKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSBzdGF0aWNfY2FzdDxDSlNfQ29udGV4dCo+KGNjKTsKKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1JFQURPTkxZKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgdnAgPDwgMDsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmV4dGVybmFsKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQkvL0luIENocm9tZSBjYXNlLHNob3VsZCBhbHdheXMgcmV0dXJuIHRydWUuCi0JaWYgKHZwLklzR2V0dGluZygpKSB7Ci0JCXZwIDw8IFRSVUU7Ci0JfQotCXJldHVybiBUUlVFOworRlhfQk9PTCBEb2N1bWVudDo6bW91c2VYKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpmaWxlc2l6ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaWYgKHZwLklzU2V0dGluZygpKSB7Ci0JCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IHN0YXRpY19jYXN0PENKU19Db250ZXh0Kj4oY2MpOwotCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1JFQURPTkxZKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQl2cCA8PCAwOwotCXJldHVybiBUUlVFOworRlhfQk9PTCBEb2N1bWVudDo6bW91c2VZKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIERvY3VtZW50Ojptb3VzZVgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBUUlVFOworRlhfQk9PTCBEb2N1bWVudDo6YmFzZVVSTChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICh2cC5Jc0dldHRpbmcoKSkgeworICAgIHZwIDw8IG1fY3dCYXNlVVJMOworICB9IGVsc2UgeworICAgIHZwID4+IG1fY3dCYXNlVVJMOworICB9CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIERvY3VtZW50Ojptb3VzZVkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBUUlVFOworRlhfQk9PTCBEb2N1bWVudDo6Y2FsY3VsYXRlKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0KKyAgICAgIChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOworCisgIGlmICh2cC5Jc0dldHRpbmcoKSkgeworICAgIGlmIChwSW50ZXJGb3JtLT5Jc0NhbGN1bGF0ZUVuYWJsZWQoKSkKKyAgICAgIHZwIDw8IHRydWU7CisgICAgZWxzZQorICAgICAgdnAgPDwgZmFsc2U7CisgIH0gZWxzZSB7CisgICAgYm9vbCBiQ2FsY3VsYXRlOworICAgIHZwID4+IGJDYWxjdWxhdGU7CisKKyAgICBwSW50ZXJGb3JtLT5FbmFibGVDYWxjdWxhdGUoYkNhbGN1bGF0ZSk7CisgIH0KKworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6YmFzZVVSTChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaWYgKHZwLklzR2V0dGluZygpKQotCXsKLQkJdnAgPDwgbV9jd0Jhc2VVUkw7Ci0JfQotCWVsc2UKLQl7Ci0JCXZwID4+IG1fY3dCYXNlVVJMOwotCX0KLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgRG9jdW1lbnQ6OmRvY3VtZW50RmlsZU5hbWUoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSBzdGF0aWNfY2FzdDxDSlNfQ29udGV4dCo+KGNjKTsKKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1JFQURPTkxZKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWxlUGF0aCA9IG1fcERvY3VtZW50LT5HZXRQYXRoKCk7CisgIGludDMyX3QgaSA9IHdzRmlsZVBhdGguR2V0TGVuZ3RoKCkgLSAxOworICBmb3IgKDsgaSA+PSAwOyBpLS0pIHsKKyAgICBpZiAod3NGaWxlUGF0aC5HZXRBdChpKSA9PSBMJ1xcJyB8fCB3c0ZpbGVQYXRoLkdldEF0KGkpID09IEwnLycpCisgICAgICBicmVhazsKKyAgfQorICBpZiAoaSA+PSAwICYmIGkgPCB3c0ZpbGVQYXRoLkdldExlbmd0aCgpIC0gMSkgeworICAgIHZwIDw8ICh3c0ZpbGVQYXRoLkdldEJ1ZmZlcih3c0ZpbGVQYXRoLkdldExlbmd0aCgpKSArIGkgKyAxKTsKKyAgfSBlbHNlIHsKKyAgICB2cCA8PCBMIiI7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmNhbGN1bGF0ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0JQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKW1fcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKLQlBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKLQotCWlmICh2cC5Jc0dldHRpbmcoKSkKLQl7Ci0JCWlmIChwSW50ZXJGb3JtLT5Jc0NhbGN1bGF0ZUVuYWJsZWQoKSkKLQkJCXZwIDw8IHRydWU7Ci0JCWVsc2UKLQkJCXZwIDw8IGZhbHNlOwotCX0KLQllbHNlCi0JewotCQlib29sIGJDYWxjdWxhdGU7Ci0JCXZwID4+IGJDYWxjdWxhdGU7Ci0KLQkJcEludGVyRm9ybS0+RW5hYmxlQ2FsY3VsYXRlKGJDYWxjdWxhdGUpOwotCX0KLQotCXJldHVybiBUUlVFOworRlhfQk9PTCBEb2N1bWVudDo6cGF0aChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IHN0YXRpY19jYXN0PENKU19Db250ZXh0Kj4oY2MpOworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkVBRE9OTFkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICB2cCA8PCBhcHA6OlN5c1BhdGhUb1BERlBhdGgobV9wRG9jdW1lbnQtPkdldFBhdGgoKSk7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIERvY3VtZW50Ojpkb2N1bWVudEZpbGVOYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlpZiAodnAuSXNTZXR0aW5nKCkpIHsKLQkJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7Ci0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkVBRE9OTFkpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCUNGWF9XaWRlU3RyaW5nIHdzRmlsZVBhdGggPSBtX3BEb2N1bWVudC0+R2V0UGF0aCgpOwotCUZYX0lOVDMyIGkgPSB3c0ZpbGVQYXRoLkdldExlbmd0aCgpIC0gMTsKLQlmb3IgKCA7IGkgPj0gMDsgaS0tICkKLQl7Ci0JCWlmICggd3NGaWxlUGF0aC5HZXRBdCggaSApID09IEwnXFwnIHx8IHdzRmlsZVBhdGguR2V0QXQoIGkgKSA9PSBMJy8nICkKLQkJCWJyZWFrOwotCX0KLQlpZiAoIGkgPj0gMCAmJiBpIDwgd3NGaWxlUGF0aC5HZXRMZW5ndGgoKSAtIDEgKQotCXsKLQkJdnAgPDwgKCB3c0ZpbGVQYXRoLkdldEJ1ZmZlciggd3NGaWxlUGF0aC5HZXRMZW5ndGgoKSApICsgaSArIDEgKTsKLQl9ZWxzZXsKLQkJdnAgPDwgTCIiOwotCX0KLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgRG9jdW1lbnQ6OnBhZ2VXaW5kb3dSZWN0KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gVFJVRTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgRG9jdW1lbnQ6OlJldmVyc2FsU3RyKENGWF9XaWRlU3RyaW5nIGNiRnJvbSkKLXsKLQlzaXplX3QgaUxlbmd0aCA9IGNiRnJvbS5HZXRMZW5ndGgoKTsKLSAgICAgICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxzaXplX3Q+IGlTaXplID0gc2l6ZW9mKHdjaGFyX3QpOwotCWlTaXplICo9IChpTGVuZ3RoICsgMSk7Ci0Jd2NoYXJfdCogcFJlc3VsdCA9ICh3Y2hhcl90KiltYWxsb2MoaVNpemUuVmFsdWVPckRpZSgpKTsKLQl3Y2hhcl90KiBwRnJvbSA9ICh3Y2hhcl90KiljYkZyb20uR2V0QnVmZmVyKGlMZW5ndGgpOwotCi0JZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpTGVuZ3RoOyBpKyspCi0JewotCQlwUmVzdWx0W2ldID0gKihwRnJvbSArIGlMZW5ndGggLSBpIC0gMSk7Ci0JfQotCXBSZXN1bHRbaUxlbmd0aF0gPSBMJ1wwJzsKLQotCWNiRnJvbS5SZWxlYXNlQnVmZmVyKCk7Ci0JQ0ZYX1dpZGVTdHJpbmcgY2JSZXQgPSBDRlhfV2lkZVN0cmluZyhwUmVzdWx0KTsKLQlmcmVlKHBSZXN1bHQpOwotCXBSZXN1bHQgPSBOVUxMOwotCXJldHVybiBjYlJldDsKK0ZYX0JPT0wgRG9jdW1lbnQ6OmxheW91dChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gVFJVRTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgRG9jdW1lbnQ6OkN1dFN0cmluZyhDRlhfV2lkZVN0cmluZyBjYkZyb20pCi17Ci0Jc2l6ZV90IGlMZW5ndGggPSBjYkZyb20uR2V0TGVuZ3RoKCk7Ci0JcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxzaXplX3Q+IGlTaXplID0gc2l6ZW9mKHdjaGFyX3QpOwotCWlTaXplICo9IChpTGVuZ3RoICsgMSk7Ci0Jd2NoYXJfdCogcFJlc3VsdCA9ICh3Y2hhcl90KiltYWxsb2MoaVNpemUuVmFsdWVPckRpZSgpKTsKLQl3Y2hhcl90KiBwRnJvbSA9ICh3Y2hhcl90KiljYkZyb20uR2V0QnVmZmVyKGlMZW5ndGgpOwotCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBpTGVuZ3RoOyBpKyspCi0JewotCQlpZiAocEZyb21baV0gPT0gTCdcXCcgfHwgcEZyb21baV0gPT0gTCcvJykKLQkJewotCQkJcFJlc3VsdFtpXSA9IEwnXDAnOwotCQkJYnJlYWs7Ci0JCX0KLQkJcFJlc3VsdFtpXSA9IHBGcm9tW2ldOwotCX0KLQlwUmVzdWx0W2lMZW5ndGhdID0gTCdcMCc7Ci0KLQljYkZyb20uUmVsZWFzZUJ1ZmZlcigpOwotCUNGWF9XaWRlU3RyaW5nIGNiUmV0ID0gQ0ZYX1dpZGVTdHJpbmcocFJlc3VsdCk7Ci0JZnJlZShwUmVzdWx0KTsKLQlwUmVzdWx0ID0gTlVMTDsKLQlyZXR1cm4gY2JSZXQ7CitGWF9CT09MIERvY3VtZW50OjphZGRMaW5rKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OnBhdGgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCWlmICh2cC5Jc1NldHRpbmcoKSkgewotCQlDSlNfQ29udGV4dCogcENvbnRleHQgPSBzdGF0aWNfY2FzdDxDSlNfQ29udGV4dCo+KGNjKTsKLQkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSRUFET05MWSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0JdnAgPDwgYXBwOjpTeXNQYXRoVG9QREZQYXRoKG1fcERvY3VtZW50LT5HZXRQYXRoKCkpOwotCXJldHVybiBUUlVFOworRlhfQk9PTCBEb2N1bWVudDo6Y2xvc2VEb2MoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6cGFnZVdpbmRvd1JlY3QoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBUUlVFOworRlhfQk9PTCBEb2N1bWVudDo6Z2V0UGFnZUJveChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpsYXlvdXQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBUUlVFOworRlhfQk9PTCBEb2N1bWVudDo6Z2V0QW5ub3QoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6YWRkTGluayhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBUUlVFOworRlhfQk9PTCBEb2N1bWVudDo6Z2V0QW5ub3RzKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgdlJldC5TZXROdWxsKCk7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpjbG9zZURvYyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgRG9jdW1lbnQ6OmdldEFubm90M0QoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICB2UmV0LlNldE51bGwoKTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmdldFBhZ2VCb3goSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgRG9jdW1lbnQ6OmdldEFubm90czNEKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgdlJldCA9IENKU19WYWx1ZTo6VlRfdW5kZWZpbmVkOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6Z2V0QW5ub3QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgRG9jdW1lbnQ6OmdldE9DR3MoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6Z2V0QW5ub3RzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JdlJldC5TZXROdWxsKCk7Ci0JcmV0dXJuIFRSVUU7CitGWF9CT09MIERvY3VtZW50OjpnZXRMaW5rcyhJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpnZXRBbm5vdDNEKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JdlJldC5TZXROdWxsKCk7Ci0JcmV0dXJuIFRSVUU7Citib29sIERvY3VtZW50OjpJc0VuY2xvc2VkSW5SZWN0KENGWF9GbG9hdFJlY3QgcmVjdCwgQ0ZYX0Zsb2F0UmVjdCBMaW5rUmVjdCkgeworICByZXR1cm4gKHJlY3QubGVmdCA8PSBMaW5rUmVjdC5sZWZ0ICYmIHJlY3QudG9wIDw9IExpbmtSZWN0LnRvcCAmJgorICAgICAgICAgIHJlY3QucmlnaHQgPj0gTGlua1JlY3QucmlnaHQgJiYgcmVjdC5ib3R0b20gPj0gTGlua1JlY3QuYm90dG9tKTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6Z2V0QW5ub3RzM0QoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQl2UmV0ID0gVlRfdW5kZWZpbmVkOwotCXJldHVybiBUUlVFOworRlhfQk9PTCBEb2N1bWVudDo6YWRkSWNvbihJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpIHsKKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBDRlhfV2lkZVN0cmluZyBzd0ljb25OYW1lID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOworCisgIGlmIChwYXJhbXNbMV0uR2V0VHlwZSgpICE9IENKU19WYWx1ZTo6VlRfb2JqZWN0KSB7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNUWVBFRVJST1IpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwSlNJY29uID0gcGFyYW1zWzFdLlRvVjhPYmplY3QoKTsKKyAgaWYgKEZYSlNfR2V0T2JqRGVmbklEKHBKU0ljb24pICE9IENKU19JY29uOjpnX25PYmpEZWZuSUQpIHsKKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1RZUEVFUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgQ0pTX0VtYmVkT2JqKiBwRW1iZWRPYmogPSBwYXJhbXNbMV0uVG9DSlNPYmplY3QoKS0+R2V0RW1iZWRPYmplY3QoKTsKKyAgaWYgKCFwRW1iZWRPYmopIHsKKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1RZUEVFUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgbV9JY29uTGlzdC5wdXNoX2JhY2soc3RkOjp1bmlxdWVfcHRyPEljb25FbGVtZW50PigKKyAgICAgIG5ldyBJY29uRWxlbWVudChzd0ljb25OYW1lLCAoSWNvbiopcEVtYmVkT2JqKSkpOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6Z2V0T0NHcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBUUlVFOworRlhfQk9PTCBEb2N1bWVudDo6aWNvbnMoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IHN0YXRpY19jYXN0PENKU19Db250ZXh0Kj4oY2MpOworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkVBRE9OTFkpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmIChtX0ljb25MaXN0LmVtcHR5KCkpIHsKKyAgICB2cC5TZXROdWxsKCk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBDSlNfUnVudGltZTo6RnJvbUNvbnRleHQoY2MpOworICBDSlNfQXJyYXkgSWNvbnMocFJ1bnRpbWUpOworCisgIGludCBpID0gMDsKKyAgZm9yIChjb25zdCBhdXRvJiBwSWNvbkVsZW1lbnQgOiBtX0ljb25MaXN0KSB7CisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmogPSBGWEpTX05ld0Z4RHluYW1pY09iaigKKyAgICAgICAgcFJ1bnRpbWUtPkdldElzb2xhdGUoKSwgcFJ1bnRpbWUsIENKU19JY29uOjpnX25PYmpEZWZuSUQpOworICAgIGlmIChwT2JqLklzRW1wdHkoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIENKU19JY29uKiBwSlNfSWNvbiA9IChDSlNfSWNvbiopRlhKU19HZXRQcml2YXRlKG1faXNvbGF0ZSwgcE9iaik7CisgICAgaWYgKCFwSlNfSWNvbikKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIEljb24qIHBJY29uID0gKEljb24qKXBKU19JY29uLT5HZXRFbWJlZE9iamVjdCgpOworICAgIGlmICghcEljb24pCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBwSWNvbi0+U2V0U3RyZWFtKHBJY29uRWxlbWVudC0+SWNvblN0cmVhbS0+R2V0U3RyZWFtKCkpOworICAgIHBJY29uLT5TZXRJY29uTmFtZShwSWNvbkVsZW1lbnQtPkljb25OYW1lKTsKKyAgICBJY29ucy5TZXRFbGVtZW50KGkrKywgQ0pTX1ZhbHVlKHBSdW50aW1lLCBwSlNfSWNvbikpOworICB9CisKKyAgdnAgPDwgSWNvbnM7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpnZXRMaW5rcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBUUlVFOworRlhfQk9PTCBEb2N1bWVudDo6Z2V0SWNvbihJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmIChtX0ljb25MaXN0LmVtcHR5KCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIENGWF9XaWRlU3RyaW5nIHN3SWNvbk5hbWUgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CisgIENKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKKworICBmb3IgKGNvbnN0IGF1dG8mIHBJY29uRWxlbWVudCA6IG1fSWNvbkxpc3QpIHsKKyAgICBpZiAocEljb25FbGVtZW50LT5JY29uTmFtZSA9PSBzd0ljb25OYW1lKSB7CisgICAgICBJY29uKiBwUmV0SWNvbiA9IHBJY29uRWxlbWVudC0+SWNvblN0cmVhbTsKKworICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmogPSBGWEpTX05ld0Z4RHluYW1pY09iaigKKyAgICAgICAgICBwUnVudGltZS0+R2V0SXNvbGF0ZSgpLCBwUnVudGltZSwgQ0pTX0ljb246Omdfbk9iakRlZm5JRCk7CisgICAgICBpZiAocE9iai5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgQ0pTX0ljb24qIHBKU19JY29uID0gKENKU19JY29uKilGWEpTX0dldFByaXZhdGUobV9pc29sYXRlLCBwT2JqKTsKKyAgICAgIGlmICghcEpTX0ljb24pCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgSWNvbiogcEljb24gPSAoSWNvbiopcEpTX0ljb24tPkdldEVtYmVkT2JqZWN0KCk7CisgICAgICBpZiAoIXBJY29uKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgIHBJY29uLT5TZXRJY29uTmFtZShzd0ljb25OYW1lKTsKKyAgICAgIHBJY29uLT5TZXRTdHJlYW0ocFJldEljb24tPkdldFN0cmVhbSgpKTsKKyAgICAgIHZSZXQgPSBwSlNfSWNvbjsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorCisgIHJldHVybiBGQUxTRTsKIH0KIAotYm9vbCBEb2N1bWVudDo6SXNFbmNsb3NlZEluUmVjdChDRlhfRmxvYXRSZWN0IHJlY3QsIENGWF9GbG9hdFJlY3QgTGlua1JlY3QpCi17Ci0JaWYgKHJlY3QubGVmdCA8PSBMaW5rUmVjdC5sZWZ0Ci0JICAmJiByZWN0LnRvcCA8PSBMaW5rUmVjdC50b3AKLQkgICYmIHJlY3QucmlnaHQgPj0gTGlua1JlY3QucmlnaHQKLQkgICYmIHJlY3QuYm90dG9tID49IExpbmtSZWN0LmJvdHRvbSkKLQkJcmV0dXJuIHRydWU7Ci0JZWxzZQotCQlyZXR1cm4gZmFsc2U7CitGWF9CT09MIERvY3VtZW50OjpyZW1vdmVJY29uKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgLy8gVW5zYWZlLCBubyBzdXBwb3J0ZWQuCisgIHJldHVybiBUUlVFOwogfQogCi12b2lkIEljb25UcmVlOjpJbnNlcnRJY29uRWxlbWVudChJY29uRWxlbWVudCogcE5ld0ljb24pCi17Ci0JaWYgKCFwTmV3SWNvbilyZXR1cm47Ci0KLQlpZiAobV9wSGVhZCA9PSBOVUxMICYmIG1fcEVuZCA9PSBOVUxMKQotCXsKLQkJbV9wSGVhZCA9IG1fcEVuZCA9IHBOZXdJY29uOwotCQltX2lMZW5ndGgrKzsKLQl9Ci0JZWxzZQotCXsKLQkJbV9wRW5kLT5OZXh0SWNvbiA9IHBOZXdJY29uOwotCQltX3BFbmQgPSBwTmV3SWNvbjsKLQkJbV9pTGVuZ3RoKys7Ci0JfQotfQotCi12b2lkIEljb25UcmVlOjpEZWxldGVJY29uVHJlZSgpCi17Ci0JaWYgKCFtX3BIZWFkIHx8ICFtX3BFbmQpcmV0dXJuOwotCi0JSWNvbkVsZW1lbnQqIHBUZW1wID0gTlVMTDsKLQl3aGlsZShtX3BFbmQgIT0gbV9wSGVhZCkKLQl7Ci0JCXBUZW1wID0gbV9wSGVhZDsKLQkJbV9wSGVhZCA9IG1fcEhlYWQtPk5leHRJY29uOwotCQlkZWxldGUgcFRlbXA7Ci0JfQotCi0JZGVsZXRlIG1fcEVuZDsKLQltX3BIZWFkID0gTlVMTDsKLQltX3BFbmQgPSBOVUxMOwotfQotCi1pbnQgSWNvblRyZWU6OkdldExlbmd0aCgpCi17Ci0JcmV0dXJuIG1faUxlbmd0aDsKLX0KLQotSWNvbkVsZW1lbnQqIEljb25UcmVlOjpvcGVyYXRvciBbXShpbnQgaUluZGV4KQotewotCWlmIChpSW5kZXggPj0gMCAmJiBpSW5kZXggPD0gbV9pTGVuZ3RoKQotCXsKLQkJSWNvbkVsZW1lbnQqIHBUZW1wID0gbV9wSGVhZDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpSW5kZXg7IGkrKykKLQkJewotCQkJcFRlbXAgPSBwVGVtcC0+TmV4dEljb247Ci0JCX0KLQkJcmV0dXJuIHBUZW1wOwotCX0KLQllbHNlCi0JCXJldHVybiBOVUxMOwotfQotCi12b2lkIEljb25UcmVlOjpEZWxldGVJY29uRWxlbWVudChDRlhfV2lkZVN0cmluZyBzd0ljb25OYW1lKQotewotCUljb25FbGVtZW50KiBwVGVtcCA9IG1fcEhlYWQ7Ci0JaW50IGlMb29wQ291bnQgPSBtX2lMZW5ndGg7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBpTG9vcENvdW50IC0gMTsgaSsrKQotCXsKLQkJaWYgKHBUZW1wID09IG1fcEVuZCkKLQkJCWJyZWFrOwotCi0JCWlmIChtX3BIZWFkLT5JY29uTmFtZSA9PSBzd0ljb25OYW1lKQotCQl7Ci0JCQltX3BIZWFkID0gbV9wSGVhZC0+TmV4dEljb247Ci0JCQlkZWxldGUgcFRlbXA7Ci0JCQltX2lMZW5ndGgtLTsKLQkJCXBUZW1wID0gbV9wSGVhZDsKLQkJfQotCQlpZiAocFRlbXAtPk5leHRJY29uLT5JY29uTmFtZSA9PSBzd0ljb25OYW1lKQotCQl7Ci0JCQlpZiAocFRlbXAtPk5leHRJY29uID09IG1fcEVuZCkKLQkJCXsKLQkJCQltX3BFbmQgPSBwVGVtcDsKLQkJCQlkZWxldGUgcFRlbXAtPk5leHRJY29uOwotCQkJCW1faUxlbmd0aC0tOwotCQkJCXBUZW1wLT5OZXh0SWNvbiA9IE5VTEw7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJSWNvbkVsZW1lbnQqIHBFbGVtZW50ID0gcFRlbXAtPk5leHRJY29uOwotCQkJCXBUZW1wLT5OZXh0SWNvbiA9IHBUZW1wLT5OZXh0SWNvbi0+TmV4dEljb247Ci0JCQkJZGVsZXRlIHBFbGVtZW50OwotCQkJCW1faUxlbmd0aC0tOwotCQkJCXBFbGVtZW50ID0gTlVMTDsKLQkJCX0KLQotCQkJY29udGludWU7Ci0JCX0KLQotCQlwVGVtcCA9IHBUZW1wLT5OZXh0SWNvbjsKLQl9Ci19Ci0KLUZYX0JPT0wgRG9jdW1lbnQ6OmFkZEljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCWlmIChwYXJhbXMuc2l6ZSgpICE9IDIpIHsKLQkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCUNGWF9XaWRlU3RyaW5nIHN3SWNvbk5hbWUgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7Ci0JSlNGWE9iamVjdCBwSlNJY29uID0gcGFyYW1zWzFdLlRvVjhPYmplY3QoKTsKLQotCUNKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKLQlpZiAoSlNfR2V0T2JqRGVmbklEKHBKU0ljb24pICE9IEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiSWNvbiIpKSB7Ci0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTVFlQRUVSUk9SKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCUNKU19FbWJlZE9iaiogcEVtYmVkT2JqID0gcGFyYW1zWzFdLlRvQ0pTT2JqZWN0KCktPkdldEVtYmVkT2JqZWN0KCk7Ci0JaWYgKCFwRW1iZWRPYmopIHsKLQkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNUWVBFRVJST1IpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JSWNvbiogcEljb24gPSAoSWNvbiopcEVtYmVkT2JqOwotCWlmICghbV9wSWNvblRyZWUpCi0JCW1fcEljb25UcmVlID0gbmV3IEljb25UcmVlKCk7Ci0KLQlJY29uRWxlbWVudCogcE5ld0ljb24gPSBuZXcgSWNvbkVsZW1lbnQoKTsKLQlwTmV3SWNvbi0+SWNvbk5hbWUgPSBzd0ljb25OYW1lOwotCXBOZXdJY29uLT5OZXh0SWNvbiA9IE5VTEw7Ci0JcE5ld0ljb24tPkljb25TdHJlYW0gPSBwSWNvbjsKLQltX3BJY29uVHJlZS0+SW5zZXJ0SWNvbkVsZW1lbnQocE5ld0ljb24pOwotCXJldHVybiBUUlVFOwotfQotCi1GWF9CT09MIERvY3VtZW50OjppY29ucyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaWYgKHZwLklzU2V0dGluZygpKSB7Ci0JCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IHN0YXRpY19jYXN0PENKU19Db250ZXh0Kj4oY2MpOwotCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1JFQURPTkxZKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCWlmICghbV9wSWNvblRyZWUpCi0JewotCQl2cC5TZXROdWxsKCk7Ci0JCXJldHVybiBUUlVFOwotCX0KLQotCUNKU19BcnJheSBJY29ucyhtX2lzb2xhdGUpOwotCUljb25FbGVtZW50KiBwSWNvbkVsZW1lbnQgPSBOVUxMOwotCWludCBpSWNvblRyZWVMZW5ndGggPSBtX3BJY29uVHJlZS0+R2V0TGVuZ3RoKCk7Ci0KLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKLQlDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7Ci0KLQlmb3IgKGludCBpID0gMDsgaSA8IGlJY29uVHJlZUxlbmd0aDsgaSsrKQotCXsKLQkJcEljb25FbGVtZW50ID0gKCptX3BJY29uVHJlZSlbaV07Ci0KLQkJSlNGWE9iamVjdCAgcE9iaiA9IEpTX05ld0Z4RHluYW1pY09iaigqcFJ1bnRpbWUsIHBDb250ZXh0LCBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIkljb24iKSk7Ci0JCWlmIChwT2JqLklzRW1wdHkoKSkgcmV0dXJuIEZBTFNFOwotCi0JCUNKU19JY29uICogcEpTX0ljb24gPSAoQ0pTX0ljb24gKilKU19HZXRQcml2YXRlKHBPYmopOwotCQlpZiAoIXBKU19JY29uKSByZXR1cm4gRkFMU0U7Ci0KLQkJSWNvbiogcEljb24gPSAoSWNvbiopcEpTX0ljb24tPkdldEVtYmVkT2JqZWN0KCk7Ci0JCWlmICghcEljb24pcmV0dXJuIEZBTFNFOwotCi0JCXBJY29uLT5TZXRTdHJlYW0ocEljb25FbGVtZW50LT5JY29uU3RyZWFtLT5HZXRTdHJlYW0oKSk7Ci0JCXBJY29uLT5TZXRJY29uTmFtZShwSWNvbkVsZW1lbnQtPkljb25OYW1lKTsKLQkJSWNvbnMuU2V0RWxlbWVudChpLCBDSlNfVmFsdWUobV9pc29sYXRlLHBKU19JY29uKSk7Ci0JfQotCi0JdnAgPDwgSWNvbnM7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgRG9jdW1lbnQ6OmdldEljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKLQlpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7Ci0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlpZighbV9wSWNvblRyZWUpCi0JCXJldHVybiBGQUxTRTsKLQlDRlhfV2lkZVN0cmluZyBzd0ljb25OYW1lID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwotCWludCBpSWNvbkNvdW50cyA9IG1fcEljb25UcmVlLT5HZXRMZW5ndGgoKTsKLQotCUNKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKLQotCWZvciAoaW50IGkgPSAwOyBpIDwgaUljb25Db3VudHM7IGkrKykKLQl7Ci0JCWlmICgoKm1fcEljb25UcmVlKVtpXS0+SWNvbk5hbWUgPT0gc3dJY29uTmFtZSkKLQkJewotCQkJSWNvbiogcFJldEljb24gPSAoKm1fcEljb25UcmVlKVtpXS0+SWNvblN0cmVhbTsKLQotCQkJSlNGWE9iamVjdCAgcE9iaiA9IEpTX05ld0Z4RHluYW1pY09iaigqcFJ1bnRpbWUsIHBDb250ZXh0LCBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIkljb24iKSk7Ci0JCQlpZiAocE9iai5Jc0VtcHR5KCkpIHJldHVybiBGQUxTRTsKLQotCQkJQ0pTX0ljb24gKiBwSlNfSWNvbiA9IChDSlNfSWNvbiAqKUpTX0dldFByaXZhdGUocE9iaik7Ci0JCQlpZiAoIXBKU19JY29uKSByZXR1cm4gRkFMU0U7Ci0KLQkJCUljb24qIHBJY29uID0gKEljb24qKXBKU19JY29uLT5HZXRFbWJlZE9iamVjdCgpOwotCQkJaWYgKCFwSWNvbilyZXR1cm4gRkFMU0U7Ci0KLQkJCXBJY29uLT5TZXRJY29uTmFtZShzd0ljb25OYW1lKTsKLQkJCXBJY29uLT5TZXRTdHJlYW0ocFJldEljb24tPkdldFN0cmVhbSgpKTsKLQkJCXZSZXQgPSBwSlNfSWNvbjsKLQkJCXJldHVybiBUUlVFOwotCQl9Ci0JfQotCi0JcmV0dXJuIEZBTFNFOwotfQotCi1GWF9CT09MIERvY3VtZW50OjpyZW1vdmVJY29uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7Ci0JaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgewotCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JaWYoIW1fcEljb25UcmVlKQotCQlyZXR1cm4gRkFMU0U7Ci0JQ0ZYX1dpZGVTdHJpbmcgc3dJY29uTmFtZSA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotRlhfQk9PTCBEb2N1bWVudDo6Y3JlYXRlRGF0YU9iamVjdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQoteworRlhfQk9PTCBEb2N1bWVudDo6Y3JlYXRlRGF0YU9iamVjdChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAgIC8vIFVuc2FmZSwgbm90IGltcGxlbWVudGVkLgogICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6bWVkaWEoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBUUlVFOworRlhfQk9PTCBEb2N1bWVudDo6bWVkaWEoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpjYWxjdWxhdGVOb3coSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIERvY3VtZW50OjpjYWxjdWxhdGVOb3coSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAoIShtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSB8fAorICAgICAgICBtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fQU5OT1RfRk9STSkgfHwKKyAgICAgICAgbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0ZJTExfRk9STSkpKQorICAgIHJldHVybiBGQUxTRTsKIAotCWlmICghKG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpIHx8Ci0JCW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9BTk5PVF9GT1JNKSB8fAotCQltX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRklMTF9GT1JNKSkpIHJldHVybiBGQUxTRTsKLQotCUNQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7Ci0JQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7Ci0JcEludGVyRm9ybS0+T25DYWxjdWxhdGUoKTsKLQlyZXR1cm4gVFJVRTsKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPQorICAgICAgKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CisgIHBJbnRlckZvcm0tPk9uQ2FsY3VsYXRlKCk7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpDb2xsYWIoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBUUlVFOworRlhfQk9PTCBEb2N1bWVudDo6Q29sbGFiKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpnZXRQYWdlTnRoV29yZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgRG9jdW1lbnQ6OmdldFBhZ2VOdGhXb3JkKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRVhUUkFDVF9BQ0NFU1MpKQorICAgIHJldHVybiBGQUxTRTsKIAotCWlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0VYVFJBQ1RfQUNDRVNTKSkgcmV0dXJuIEZBTFNFOworICBpbnQgblBhZ2VObyA9IHBhcmFtcy5zaXplKCkgPiAwID8gcGFyYW1zWzBdLlRvSW50KCkgOiAwOworICBpbnQgbldvcmRObyA9IHBhcmFtcy5zaXplKCkgPiAxID8gcGFyYW1zWzFdLlRvSW50KCkgOiAwOworICBib29sIGJTdHJpcCA9IHBhcmFtcy5zaXplKCkgPiAyID8gcGFyYW1zWzJdLlRvQm9vbCgpIDogdHJ1ZTsKIAotCWludCBuUGFnZU5vID0gcGFyYW1zLkdldFNpemUoKSA+IDAgPyBwYXJhbXNbMF0uVG9JbnQoKSA6IDA7Ci0JaW50IG5Xb3JkTm8gPSBwYXJhbXMuR2V0U2l6ZSgpID4gMSA/IHBhcmFtc1sxXS5Ub0ludCgpIDogMDsKLQlib29sIGJTdHJpcCA9IHBhcmFtcy5HZXRTaXplKCkgPiAyID8gcGFyYW1zWzJdLlRvQm9vbCgpIDogdHJ1ZTsKKyAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gbV9wRG9jdW1lbnQtPkdldFBERkRvY3VtZW50KCk7CisgIGlmICghcERvY3VtZW50KQorICAgIHJldHVybiBGQUxTRTsKIAotCUNQREZfRG9jdW1lbnQqIHBEb2N1bWVudCA9IG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpOwotCWlmICghcERvY3VtZW50KSByZXR1cm4gRkFMU0U7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IHN0YXRpY19jYXN0PENKU19Db250ZXh0Kj4oY2MpOworICBpZiAoblBhZ2VObyA8IDAgfHwgblBhZ2VObyA+PSBwRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpKSB7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNWQUxVRUVSUk9SKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IHN0YXRpY19jYXN0PENKU19Db250ZXh0Kj4oY2MpOwotCWlmIChuUGFnZU5vIDwgMCB8fCBuUGFnZU5vID49IHBEb2N1bWVudC0+R2V0UGFnZUNvdW50KCkpCi0JewotCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1ZBTFVFRVJST1IpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQorICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IHBEb2N1bWVudC0+R2V0UGFnZShuUGFnZU5vKTsKKyAgaWYgKCFwUGFnZURpY3QpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBwRG9jdW1lbnQtPkdldFBhZ2UoblBhZ2VObyk7Ci0JaWYgKCFwUGFnZURpY3QpIHJldHVybiBGQUxTRTsKKyAgQ1BERl9QYWdlIHBhZ2U7CisgIHBhZ2UuTG9hZChwRG9jdW1lbnQsIHBQYWdlRGljdCk7CisgIHBhZ2UuU3RhcnRQYXJzZSgpOworICBwYWdlLlBhcnNlQ29udGVudCgpOwogCi0JQ1BERl9QYWdlIHBhZ2U7Ci0JcGFnZS5Mb2FkKHBEb2N1bWVudCwgcFBhZ2VEaWN0KTsKLQlwYWdlLlN0YXJ0UGFyc2UoKTsKLQlwYWdlLlBhcnNlQ29udGVudCgpOworICBGWF9QT1NJVElPTiBwb3MgPSBwYWdlLkdldEZpcnN0T2JqZWN0UG9zaXRpb24oKTsKIAotCUZYX1BPU0lUSU9OIHBvcyA9IHBhZ2UuR2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpOworICBpbnQgbldvcmRzID0gMDsKIAotCWludCBuV29yZHMgPSAwOworICBDRlhfV2lkZVN0cmluZyBzd1JldDsKIAotCUNGWF9XaWRlU3RyaW5nIHN3UmV0OworICB3aGlsZSAocG9zKSB7CisgICAgaWYgKENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmogPSBwYWdlLkdldE5leHRPYmplY3QocG9zKSkgeworICAgICAgaWYgKHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9URVhUKSB7CisgICAgICAgIGludCBuT2JqV29yZHMgPSBDb3VudFdvcmRzKChDUERGX1RleHRPYmplY3QqKXBQYWdlT2JqKTsKIAotCXdoaWxlIChwb3MpCi0JewotCQlpZiAoQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiA9IHBhZ2UuR2V0TmV4dE9iamVjdChwb3MpKQotCQl7Ci0JCQlpZiAocFBhZ2VPYmotPm1fVHlwZSA9PSBQREZQQUdFX1RFWFQpCi0JCQl7Ci0JCQkJaW50IG5PYmpXb3JkcyA9IENvdW50V29yZHMoKENQREZfVGV4dE9iamVjdCopcFBhZ2VPYmopOworICAgICAgICBpZiAobldvcmRzICsgbk9ialdvcmRzID49IG5Xb3JkTm8pIHsKKyAgICAgICAgICBzd1JldCA9IEdldE9ialdvcmRTdHIoKENQREZfVGV4dE9iamVjdCopcFBhZ2VPYmosIG5Xb3JkTm8gLSBuV29yZHMpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJCQlpZiAobldvcmRzICsgbk9ialdvcmRzID49IG5Xb3JkTm8pCi0JCQkJewotCQkJCQlzd1JldCA9IEdldE9ialdvcmRTdHIoKENQREZfVGV4dE9iamVjdCopcFBhZ2VPYmosIG5Xb3JkTm8gLSBuV29yZHMpOwotCQkJCQlicmVhazsKLQkJCQl9CisgICAgICAgIG5Xb3JkcyArPSBuT2JqV29yZHM7CisgICAgICB9CisgICAgfQorICB9CiAKLQkJCQluV29yZHMgKz0gbk9ialdvcmRzOwotCQkJfQotCQl9Ci0JfQorICBpZiAoYlN0cmlwKSB7CisgICAgc3dSZXQuVHJpbUxlZnQoKTsKKyAgICBzd1JldC5UcmltUmlnaHQoKTsKKyAgfQogCi0JaWYgKGJTdHJpcCkKLQl7Ci0JCXN3UmV0LlRyaW1MZWZ0KCk7Ci0JCXN3UmV0LlRyaW1SaWdodCgpOwotCX0KLQotCXZSZXQgPSBzd1JldC5jX3N0cigpOwotCXJldHVybiBUUlVFOworICB2UmV0ID0gc3dSZXQuY19zdHIoKTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmdldFBhZ2VOdGhXb3JkUXVhZHMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIERvY3VtZW50OjpnZXRQYWdlTnRoV29yZFF1YWRzKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKCFtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRVhUUkFDVF9BQ0NFU1MpKQorICAgIHJldHVybiBGQUxTRTsKIAotCWlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0VYVFJBQ1RfQUNDRVNTKSkgcmV0dXJuIEZBTFNFOwotCi0JcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OmdldFBhZ2VOdW1Xb3JkcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgRG9jdW1lbnQ6OmdldFBhZ2VOdW1Xb3JkcyhJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICghbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0VYVFJBQ1RfQUNDRVNTKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlpZiAoIW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9FWFRSQUNUX0FDQ0VTUykpIHJldHVybiBGQUxTRTsKKyAgaW50IG5QYWdlTm8gPSBwYXJhbXMuc2l6ZSgpID4gMCA/IHBhcmFtc1swXS5Ub0ludCgpIDogMDsKIAotCWludCBuUGFnZU5vID0gcGFyYW1zLkdldFNpemUoKSA+IDAgPyBwYXJhbXNbMF0uVG9JbnQoKSA6IDA7CisgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCA9IG1fcERvY3VtZW50LT5HZXRQREZEb2N1bWVudCgpOworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSBzdGF0aWNfY2FzdDxDSlNfQ29udGV4dCo+KGNjKTsKKyAgaWYgKG5QYWdlTm8gPCAwIHx8IG5QYWdlTm8gPj0gcERvY3VtZW50LT5HZXRQYWdlQ291bnQoKSkgeworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTVkFMVUVFUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLQlDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBtX3BEb2N1bWVudC0+R2V0RG9jdW1lbnQoKTsKLQlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOworICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IHBEb2N1bWVudC0+R2V0UGFnZShuUGFnZU5vKTsKKyAgaWYgKCFwUGFnZURpY3QpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7Ci0JaWYgKG5QYWdlTm8gPCAwIHx8IG5QYWdlTm8gPj0gcERvY3VtZW50LT5HZXRQYWdlQ291bnQoKSkKLQl7Ci0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTVkFMVUVFUlJPUik7Ci0JCXJldHVybiBGQUxTRTsKLQl9CisgIENQREZfUGFnZSBwYWdlOworICBwYWdlLkxvYWQocERvY3VtZW50LCBwUGFnZURpY3QpOworICBwYWdlLlN0YXJ0UGFyc2UoKTsKKyAgcGFnZS5QYXJzZUNvbnRlbnQoKTsKIAotCUNQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcERvY3VtZW50LT5HZXRQYWdlKG5QYWdlTm8pOwotCWlmICghcFBhZ2VEaWN0KSByZXR1cm4gRkFMU0U7CisgIEZYX1BPU0lUSU9OIHBvcyA9IHBhZ2UuR2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpOwogCi0JQ1BERl9QYWdlIHBhZ2U7Ci0JcGFnZS5Mb2FkKHBEb2N1bWVudCwgcFBhZ2VEaWN0KTsKLQlwYWdlLlN0YXJ0UGFyc2UoKTsKLQlwYWdlLlBhcnNlQ29udGVudCgpOworICBpbnQgbldvcmRzID0gMDsKIAotCUZYX1BPU0lUSU9OIHBvcyA9IHBhZ2UuR2V0Rmlyc3RPYmplY3RQb3NpdGlvbigpOworICB3aGlsZSAocG9zKSB7CisgICAgaWYgKENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmogPSBwYWdlLkdldE5leHRPYmplY3QocG9zKSkgeworICAgICAgaWYgKHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9URVhUKSB7CisgICAgICAgIENQREZfVGV4dE9iamVjdCogcFRleHRPYmogPSAoQ1BERl9UZXh0T2JqZWN0KilwUGFnZU9iajsKKyAgICAgICAgbldvcmRzICs9IENvdW50V29yZHMocFRleHRPYmopOworICAgICAgfQorICAgIH0KKyAgfQogCi0JaW50IG5Xb3JkcyA9IDA7CisgIHZSZXQgPSBuV29yZHM7CiAKLQl3aGlsZSAocG9zKQotCXsKLQkJaWYgKENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmogPSBwYWdlLkdldE5leHRPYmplY3QocG9zKSkKLQkJewotCQkJaWYgKHBQYWdlT2JqLT5tX1R5cGUgPT0gUERGUEFHRV9URVhUKQotCQkJewotCQkJCUNQREZfVGV4dE9iamVjdCogcFRleHRPYmogPSAoQ1BERl9UZXh0T2JqZWN0KilwUGFnZU9iajsKLQkJCQluV29yZHMgKz0gQ291bnRXb3JkcyhwVGV4dE9iaik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2UmV0ID0gbldvcmRzOwotCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpnZXRQcmludFBhcmFtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0JQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwotCUpTRlhPYmplY3QgcFJldE9iaiA9IEpTX05ld0Z4RHluYW1pY09iaigqcFJ1bnRpbWUsIHBDb250ZXh0LCBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIlByaW50UGFyYW1zT2JqIikpOworRlhfQk9PTCBEb2N1bWVudDo6Z2V0UHJpbnRQYXJhbXMoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwUmV0T2JqID0gRlhKU19OZXdGeER5bmFtaWNPYmooCisgICAgICBwUnVudGltZS0+R2V0SXNvbGF0ZSgpLCBwUnVudGltZSwgQ0pTX1ByaW50UGFyYW1zT2JqOjpnX25PYmpEZWZuSUQpOwogCi0JLy8gTm90IGltcGxlbWVudGVkIHlldC4KKyAgLy8gTm90IGltcGxlbWVudGVkIHlldC4KIAotCXZSZXQgPSBwUmV0T2JqOwotCXJldHVybiBUUlVFOworICB2UmV0ID0gcFJldE9iajsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLSNkZWZpbmUgSVNMQVRJTldPUkQodSkJKHUgIT0gMHgyMCAmJiB1IDw9IDB4MjhGRikKKyNkZWZpbmUgSVNMQVRJTldPUkQodSkgKHUgIT0gMHgyMCAmJiB1IDw9IDB4MjhGRikKIAotaW50CURvY3VtZW50OjpDb3VudFdvcmRzKENQREZfVGV4dE9iamVjdCogcFRleHRPYmopCi17Ci0JaWYgKCFwVGV4dE9iaikgcmV0dXJuIDA7CitpbnQgRG9jdW1lbnQ6OkNvdW50V29yZHMoQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaikgeworICBpZiAoIXBUZXh0T2JqKQorICAgIHJldHVybiAwOwogCi0JaW50IG5Xb3JkcyA9IDA7CisgIGludCBuV29yZHMgPSAwOwogCi0JQ1BERl9Gb250KiBwRm9udCA9IHBUZXh0T2JqLT5HZXRGb250KCk7Ci0JaWYgKCFwRm9udCkgcmV0dXJuIDA7CisgIENQREZfRm9udCogcEZvbnQgPSBwVGV4dE9iai0+R2V0Rm9udCgpOworICBpZiAoIXBGb250KQorICAgIHJldHVybiAwOwogCi0JRlhfQk9PTCBiSXNMYXRpbiA9IEZBTFNFOworICBGWF9CT09MIGJJc0xhdGluID0gRkFMU0U7CiAKLQlmb3IgKGludCBpPTAsIHN6PXBUZXh0T2JqLT5Db3VudENoYXJzKCk7IGk8c3o7IGkrKykKLQl7Ci0JCUZYX0RXT1JEIGNoYXJjb2RlID0gLTE7Ci0JCUZYX0ZMT0FUIGtlcm5pbmc7CisgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBUZXh0T2JqLT5Db3VudENoYXJzKCk7IGkgPCBzejsgaSsrKSB7CisgICAgRlhfRFdPUkQgY2hhcmNvZGUgPSAtMTsKKyAgICBGWF9GTE9BVCBrZXJuaW5nOwogCi0JCXBUZXh0T2JqLT5HZXRDaGFySW5mbyhpLCBjaGFyY29kZSwga2VybmluZyk7Ci0JCUNGWF9XaWRlU3RyaW5nIHN3VW5pY29kZSA9IHBGb250LT5Vbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKyAgICBwVGV4dE9iai0+R2V0Q2hhckluZm8oaSwgY2hhcmNvZGUsIGtlcm5pbmcpOworICAgIENGWF9XaWRlU3RyaW5nIHN3VW5pY29kZSA9IHBGb250LT5Vbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKIAotCQlGWF9XT1JEIHVuaWNvZGUgPSAwOwotCQlpZiAoc3dVbmljb2RlLkdldExlbmd0aCgpID4gMCkKLQkJCXVuaWNvZGUgPSBzd1VuaWNvZGVbMF07CisgICAgRlhfV09SRCB1bmljb2RlID0gMDsKKyAgICBpZiAoc3dVbmljb2RlLkdldExlbmd0aCgpID4gMCkKKyAgICAgIHVuaWNvZGUgPSBzd1VuaWNvZGVbMF07CiAKLQkJaWYgKElTTEFUSU5XT1JEKHVuaWNvZGUpICYmIGJJc0xhdGluKQotCQkJY29udGludWU7CisgICAgaWYgKElTTEFUSU5XT1JEKHVuaWNvZGUpICYmIGJJc0xhdGluKQorICAgICAgY29udGludWU7CiAKLQkJYklzTGF0aW4gPSBJU0xBVElOV09SRCh1bmljb2RlKTsKLQkJaWYgKHVuaWNvZGUgIT0gMHgyMCkKLQkJCW5Xb3JkcysrOwotCX0KKyAgICBiSXNMYXRpbiA9IElTTEFUSU5XT1JEKHVuaWNvZGUpOworICAgIGlmICh1bmljb2RlICE9IDB4MjApCisgICAgICBuV29yZHMrKzsKKyAgfQogCi0JcmV0dXJuIG5Xb3JkczsKKyAgcmV0dXJuIG5Xb3JkczsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgRG9jdW1lbnQ6OkdldE9ialdvcmRTdHIoQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiwgaW50IG5Xb3JkSW5kZXgpCi17Ci0JQVNTRVJUKHBUZXh0T2JqICE9IE5VTEwpOworQ0ZYX1dpZGVTdHJpbmcgRG9jdW1lbnQ6OkdldE9ialdvcmRTdHIoQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuV29yZEluZGV4KSB7CisgIENGWF9XaWRlU3RyaW5nIHN3UmV0OwogCi0JQ0ZYX1dpZGVTdHJpbmcgc3dSZXQ7CisgIENQREZfRm9udCogcEZvbnQgPSBwVGV4dE9iai0+R2V0Rm9udCgpOworICBpZiAoIXBGb250KQorICAgIHJldHVybiBMIiI7CiAKLQlDUERGX0ZvbnQqIHBGb250ID0gcFRleHRPYmotPkdldEZvbnQoKTsKLQlpZiAoIXBGb250KSByZXR1cm4gTCIiOworICBpbnQgbldvcmRzID0gMDsKKyAgRlhfQk9PTCBiSXNMYXRpbiA9IEZBTFNFOwogCi0JaW50IG5Xb3JkcyA9IDA7Ci0JRlhfQk9PTCBiSXNMYXRpbiA9IEZBTFNFOworICBmb3IgKGludCBpID0gMCwgc3ogPSBwVGV4dE9iai0+Q291bnRDaGFycygpOyBpIDwgc3o7IGkrKykgeworICAgIEZYX0RXT1JEIGNoYXJjb2RlID0gLTE7CisgICAgRlhfRkxPQVQga2VybmluZzsKIAotCWZvciAoaW50IGk9MCwgc3o9cFRleHRPYmotPkNvdW50Q2hhcnMoKTsgaTxzejsgaSsrKQotCXsKLQkJRlhfRFdPUkQgY2hhcmNvZGUgPSAtMTsKLQkJRlhfRkxPQVQga2VybmluZzsKKyAgICBwVGV4dE9iai0+R2V0Q2hhckluZm8oaSwgY2hhcmNvZGUsIGtlcm5pbmcpOworICAgIENGWF9XaWRlU3RyaW5nIHN3VW5pY29kZSA9IHBGb250LT5Vbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKIAotCQlwVGV4dE9iai0+R2V0Q2hhckluZm8oaSwgY2hhcmNvZGUsIGtlcm5pbmcpOwotCQlDRlhfV2lkZVN0cmluZyBzd1VuaWNvZGUgPSBwRm9udC0+VW5pY29kZUZyb21DaGFyQ29kZShjaGFyY29kZSk7CisgICAgRlhfV09SRCB1bmljb2RlID0gMDsKKyAgICBpZiAoc3dVbmljb2RlLkdldExlbmd0aCgpID4gMCkKKyAgICAgIHVuaWNvZGUgPSBzd1VuaWNvZGVbMF07CiAKLQkJRlhfV09SRCB1bmljb2RlID0gMDsKLQkJaWYgKHN3VW5pY29kZS5HZXRMZW5ndGgoKSA+IDApCi0JCQl1bmljb2RlID0gc3dVbmljb2RlWzBdOworICAgIGlmIChJU0xBVElOV09SRCh1bmljb2RlKSAmJiBiSXNMYXRpbikgeworICAgIH0gZWxzZSB7CisgICAgICBiSXNMYXRpbiA9IElTTEFUSU5XT1JEKHVuaWNvZGUpOworICAgICAgaWYgKHVuaWNvZGUgIT0gMHgyMCkKKyAgICAgICAgbldvcmRzKys7CisgICAgfQogCi0JCWlmIChJU0xBVElOV09SRCh1bmljb2RlKSAmJiBiSXNMYXRpbikKLQkJewotCQl9Ci0JCWVsc2UKLQkJewotCQkJYklzTGF0aW4gPSBJU0xBVElOV09SRCh1bmljb2RlKTsKLQkJCWlmICh1bmljb2RlICE9IDB4MjApCi0JCQkJbldvcmRzKys7Ci0JCX0KKyAgICBpZiAobldvcmRzIC0gMSA9PSBuV29yZEluZGV4KQorICAgICAgc3dSZXQgKz0gdW5pY29kZTsKKyAgfQogCi0JCWlmIChuV29yZHMtMSA9PSBuV29yZEluZGV4KQotCQkJc3dSZXQgKz0gdW5pY29kZTsKLQl9Ci0KLQlyZXR1cm4gc3dSZXQ7CisgIHJldHVybiBzd1JldDsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6em9vbShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0KLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgRG9jdW1lbnQ6Onpvb20oSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gVFJVRTsKIH0KIAogLyoqCi0obm9uZSwJTm9WYXJ5KQotKGZpdFAsCUZpdFBhZ2UpCi0oZml0VywJRml0V2lkdGgpCi0oZml0SCwJRml0SGVpZ2h0KQotKGZpdFYsCUZpdFZpc2libGVXaWR0aCkKLShwcmVmLAlQcmVmZXJyZWQpCi0ocmVmVywJUmVmbG93V2lkdGgpCisobm9uZSwgIE5vVmFyeSkKKyhmaXRQLCAgRml0UGFnZSkKKyhmaXRXLCAgRml0V2lkdGgpCisoZml0SCwgIEZpdEhlaWdodCkKKyhmaXRWLCAgRml0VmlzaWJsZVdpZHRoKQorKHByZWYsICBQcmVmZXJyZWQpCisocmVmVywgIFJlZmxvd1dpZHRoKQogKi8KIAotRlhfQk9PTCBEb2N1bWVudDo6em9vbVR5cGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBUUlVFOworRlhfQk9PTCBEb2N1bWVudDo6em9vbVR5cGUoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpkZWxldGVQYWdlcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7Ci0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0JaWYgKCEobV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkgfHwKLQkJbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0FTU0VNQkxFKSkpIHJldHVybiBGQUxTRTsKLQotCWludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7Ci0KLQlpbnQgblN0YXJ0ID0gMDsKLQlpbnQgbkVuZCA9IDA7Ci0KLQlpZiAoaVNpemUgPCAxKQotCXsKLQl9Ci0JZWxzZSBpZiAoaVNpemUgPT0gMSkKLQl7Ci0JCWlmIChwYXJhbXNbMF0uR2V0VHlwZSgpID09IFZUX29iamVjdCkKLQkJewotCQkJSlNPYmplY3QgcE9iaiA9IHBhcmFtc1swXS5Ub1Y4T2JqZWN0KCk7Ci0JCQl2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiblN0YXJ0Iik7Ci0gICAgICAgICAgICBuU3RhcnQgPSBDSlNfVmFsdWUobV9pc29sYXRlLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvSW50KCk7Ci0KLQkJCXBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSwgcE9iaiwgTCJuRW5kIik7Ci0JCQluRW5kID0gQ0pTX1ZhbHVlKG1faXNvbGF0ZSwgcFZhbHVlLCBHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0ludCgpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJblN0YXJ0ID0gcGFyYW1zWzBdLlRvSW50KCk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJblN0YXJ0ID0gcGFyYW1zWzBdLlRvSW50KCk7Ci0JCW5FbmQgPSBwYXJhbXNbMV0uVG9JbnQoKTsKLQl9Ci0KLQlpbnQgblRvdGFsID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpOwotCi0JaWYgKG5TdGFydCA8IDApCW5TdGFydCA9IDA7Ci0JaWYgKG5TdGFydCA+PSBuVG90YWwpIG5TdGFydCA9IG5Ub3RhbCAtIDE7Ci0KLQlpZiAobkVuZCA8IDApIG5FbmQgPSAwOwotCWlmIChuRW5kID49IG5Ub3RhbCkgbkVuZCA9IG5Ub3RhbCAtIDE7Ci0KLQlpZiAobkVuZCA8IG5TdGFydCkgbkVuZCA9IG5TdGFydDsKLQotCi0KLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgRG9jdW1lbnQ6OmRlbGV0ZVBhZ2VzKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgLy8gVW5zYWZlLCBubyBzdXBwb3J0ZWQuCisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIERvY3VtZW50OjpleHRyYWN0UGFnZXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKK0ZYX0JPT0wgRG9jdW1lbnQ6OmV4dHJhY3RQYWdlcyhJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KICAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6Omluc2VydFBhZ2VzKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17CitGWF9CT09MIERvY3VtZW50OjppbnNlcnRQYWdlcyhJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KICAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRG9jdW1lbnQ6OnJlcGxhY2VQYWdlcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQoteworRlhfQk9PTCBEb2N1bWVudDo6cmVwbGFjZVBhZ2VzKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgogICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBEb2N1bWVudDo6Z2V0VVJMKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17CitGWF9CT09MIERvY3VtZW50OjpnZXRVUkwoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCiAgIHJldHVybiBUUlVFOwogfQogCi12b2lkIERvY3VtZW50OjpBZGREZWxheURhdGEoQ0pTX0RlbGF5RGF0YSogcERhdGEpCi17Ci0JbV9EZWxheURhdGEuQWRkKHBEYXRhKTsKK3ZvaWQgRG9jdW1lbnQ6OkFkZERlbGF5RGF0YShDSlNfRGVsYXlEYXRhKiBwRGF0YSkgeworICBtX0RlbGF5RGF0YS5BZGQocERhdGEpOwogfQogCi12b2lkIERvY3VtZW50OjpEb0ZpZWxkRGVsYXkoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4KQotewotCUNGWF9EV29yZEFycmF5IERlbEFycmF5OwotCUNGWF9BcnJheVRlbXBsYXRlPENKU19EZWxheURhdGEqPiBEZWxheURhdGFGb3JGaWVsZEFuZENvbnRyb2xJbmRleDsKK3ZvaWQgRG9jdW1lbnQ6OkRvRmllbGREZWxheShjb25zdCBDRlhfV2lkZVN0cmluZyYgc0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCkgeworICBDRlhfRFdvcmRBcnJheSBEZWxBcnJheTsKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q0pTX0RlbGF5RGF0YSo+IERlbGF5RGF0YUZvckZpZWxkQW5kQ29udHJvbEluZGV4OwogCi0JZm9yIChpbnQgaT0wLHN6PW1fRGVsYXlEYXRhLkdldFNpemUoKTsgaTxzejsgaSsrKQotCXsKLQkJaWYgKENKU19EZWxheURhdGEqIHBEYXRhID0gbV9EZWxheURhdGEuR2V0QXQoaSkpCi0JCXsKLQkJCWlmIChwRGF0YS0+c0ZpZWxkTmFtZSA9PSBzRmllbGROYW1lICYmIHBEYXRhLT5uQ29udHJvbEluZGV4ID09IG5Db250cm9sSW5kZXgpCi0JCQl7Ci0JCQkJRGVsYXlEYXRhRm9yRmllbGRBbmRDb250cm9sSW5kZXguQWRkKHBEYXRhKTsKLQkJCQltX0RlbGF5RGF0YS5TZXRBdChpLCBOVUxMKTsKLQkJCQlEZWxBcnJheS5BZGQoaSk7Ci0JCQl9Ci0JCX0KLQl9CisgIGZvciAoaW50IGkgPSAwLCBzeiA9IG1fRGVsYXlEYXRhLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAoQ0pTX0RlbGF5RGF0YSogcERhdGEgPSBtX0RlbGF5RGF0YS5HZXRBdChpKSkgeworICAgICAgaWYgKHBEYXRhLT5zRmllbGROYW1lID09IHNGaWVsZE5hbWUgJiYKKyAgICAgICAgICBwRGF0YS0+bkNvbnRyb2xJbmRleCA9PSBuQ29udHJvbEluZGV4KSB7CisgICAgICAgIERlbGF5RGF0YUZvckZpZWxkQW5kQ29udHJvbEluZGV4LkFkZChwRGF0YSk7CisgICAgICAgIG1fRGVsYXlEYXRhLlNldEF0KGksIE5VTEwpOworICAgICAgICBEZWxBcnJheS5BZGQoaSk7CisgICAgICB9CisgICAgfQorICB9CiAKLQlmb3IgKGludCBqPURlbEFycmF5LkdldFNpemUoKS0xOyBqPj0wOyBqLS0pCi0JewotCQltX0RlbGF5RGF0YS5SZW1vdmVBdChEZWxBcnJheVtqXSk7Ci0JfQorICBmb3IgKGludCBqID0gRGVsQXJyYXkuR2V0U2l6ZSgpIC0gMTsgaiA+PSAwOyBqLS0pIHsKKyAgICBtX0RlbGF5RGF0YS5SZW1vdmVBdChEZWxBcnJheVtqXSk7CisgIH0KIAotCWZvciAoaW50IGk9MCxzej1EZWxheURhdGFGb3JGaWVsZEFuZENvbnRyb2xJbmRleC5HZXRTaXplKCk7IGkgPCBzejsgaSsrKQotCXsKLQkJQ0pTX0RlbGF5RGF0YSogcERhdGEgPSBEZWxheURhdGFGb3JGaWVsZEFuZENvbnRyb2xJbmRleC5HZXRBdChpKTsKLQkJRmllbGQ6OkRvRGVsYXkobV9wRG9jdW1lbnQsIHBEYXRhKTsKLQkJRGVsYXlEYXRhRm9yRmllbGRBbmRDb250cm9sSW5kZXguU2V0QXQoaSxOVUxMKTsKLQkJZGVsZXRlIHBEYXRhOwotCX0KKyAgZm9yIChpbnQgaSA9IDAsIHN6ID0gRGVsYXlEYXRhRm9yRmllbGRBbmRDb250cm9sSW5kZXguR2V0U2l6ZSgpOyBpIDwgc3o7CisgICAgICAgaSsrKSB7CisgICAgQ0pTX0RlbGF5RGF0YSogcERhdGEgPSBEZWxheURhdGFGb3JGaWVsZEFuZENvbnRyb2xJbmRleC5HZXRBdChpKTsKKyAgICBGaWVsZDo6RG9EZWxheShtX3BEb2N1bWVudCwgcERhdGEpOworICAgIERlbGF5RGF0YUZvckZpZWxkQW5kQ29udHJvbEluZGV4LlNldEF0KGksIE5VTEwpOworICAgIGRlbGV0ZSBwRGF0YTsKKyAgfQogfQogCi12b2lkIERvY3VtZW50OjpBZGREZWxheUFubm90RGF0YShDSlNfQW5ub3RPYmogKnBEYXRhKQotewotCW1fRGVsYXlBbm5vdERhdGEuQWRkKHBEYXRhKTsKK0NKU19Eb2N1bWVudCogRG9jdW1lbnQ6OkdldENKU0RvYygpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PENKU19Eb2N1bWVudCo+KG1fcEpTT2JqZWN0KTsKIH0KLQotdm9pZCBEb2N1bWVudDo6RG9Bbm5vdERlbGF5KCkKLXsKLQlDRlhfRFdvcmRBcnJheSBEZWxBcnJheTsKLQotCWZvciAoaW50IGo9RGVsQXJyYXkuR2V0U2l6ZSgpLTE7IGo+PTA7IGotLSkKLQl7Ci0JCW1fRGVsYXlEYXRhLlJlbW92ZUF0KERlbEFycmF5W2pdKTsKLQl9Ci19Ci0KLUNKU19Eb2N1bWVudCogRG9jdW1lbnQ6OkdldENKU0RvYygpIGNvbnN0IAotewotCXJldHVybiBzdGF0aWNfY2FzdDxDSlNfRG9jdW1lbnQqPihtX3BKU09iamVjdCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvRG9jdW1lbnQuaCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvRG9jdW1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjk1ZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9Eb2N1bWVudC5oCkBAIC0wLDAgKzEsMzY0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlBERlNES19TUkNfSkFWQVNDUklQVF9ET0NVTUVOVF9IXworI2RlZmluZSBGUERGU0RLX1NSQ19KQVZBU0NSSVBUX0RPQ1VNRU5UX0hfCisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgIkpTX0RlZmluZS5oIgorCitjbGFzcyBQcmludFBhcmFtc09iaiA6IHB1YmxpYyBDSlNfRW1iZWRPYmogeworIHB1YmxpYzoKKyAgUHJpbnRQYXJhbXNPYmooQ0pTX09iamVjdCogcEpTT2JqZWN0KTsKKyAgflByaW50UGFyYW1zT2JqKCkgb3ZlcnJpZGUge30KKworIHB1YmxpYzoKKyAgRlhfQk9PTCBiVUk7CisgIGludCBuU3RhcnQ7CisgIGludCBuRW5kOworICBGWF9CT09MIGJTaWxlbnQ7CisgIEZYX0JPT0wgYlNocmlua1RvRml0OworICBGWF9CT09MIGJQcmludEFzSW1hZ2U7CisgIEZYX0JPT0wgYlJldmVyc2U7CisgIEZYX0JPT0wgYkFubm90YXRpb25zOworfTsKKworY2xhc3MgQ0pTX1ByaW50UGFyYW1zT2JqIDogcHVibGljIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgQ0pTX1ByaW50UGFyYW1zT2JqKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge30KKyAgfkNKU19QcmludFBhcmFtc09iaigpIG92ZXJyaWRlIHt9CisKKyAgREVDTEFSRV9KU19DTEFTUygpOworfTsKKworY2xhc3MgSWNvbjsKK2NsYXNzIEZpZWxkOworCitzdHJ1Y3QgSWNvbkVsZW1lbnQgeworICBJY29uRWxlbWVudChjb25zdCBDRlhfV2lkZVN0cmluZyYgbmFtZSwgSWNvbiogc3RyZWFtKQorICAgICAgOiBJY29uTmFtZShuYW1lKSwgSWNvblN0cmVhbShzdHJlYW0pIHt9CisKKyAgQ0ZYX1dpZGVTdHJpbmcgSWNvbk5hbWU7CisgIEljb24qIEljb25TdHJlYW07Cit9OworCitzdHJ1Y3QgQ0pTX0RlbGF5RGF0YTsKK3N0cnVjdCBDSlNfRGVsYXlBbm5vdDsKK3N0cnVjdCBDSlNfQW5ub3RPYmo7CisKK2NsYXNzIERvY3VtZW50IDogcHVibGljIENKU19FbWJlZE9iaiB7CisgcHVibGljOgorICBEb2N1bWVudChDSlNfT2JqZWN0KiBwSlNPYmplY3QpOworICB+RG9jdW1lbnQoKSBvdmVycmlkZTsKKworICBGWF9CT09MIEFEQkUoSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgYXV0aG9yKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGJhc2VVUkwoSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgYm9va21hcmtSb290KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGNhbGN1bGF0ZShJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBDb2xsYWIoSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgY3JlYXRpb25EYXRlKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGNyZWF0b3IoSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZGVsYXkoSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZGlydHkoSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZG9jdW1lbnRGaWxlTmFtZShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGV4dGVybmFsKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGZpbGVzaXplKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGljb25zKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGluZm8oSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wga2V5d29yZHMoSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgbGF5b3V0KElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIG1lZGlhKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIG1vZERhdGUoSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgbW91c2VYKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIG1vdXNlWShJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBudW1GaWVsZHMoSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgbnVtUGFnZXMoSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgcGFnZU51bShJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBwYWdlV2luZG93UmVjdChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgcGF0aChJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBwcm9kdWNlcihJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBzdWJqZWN0KElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHRpdGxlKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHpvb20oSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgem9vbVR5cGUoSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisKKyAgRlhfQk9PTCBhZGRBbm5vdChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBhZGRGaWVsZChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBhZGRMaW5rKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGFkZEljb24oSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgY2FsY3VsYXRlTm93KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGNsb3NlRG9jKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGNyZWF0ZURhdGFPYmplY3QoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZGVsZXRlUGFnZXMoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZXhwb3J0QXNUZXh0KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGV4cG9ydEFzRkRGKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGV4cG9ydEFzWEZERihJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBleHRyYWN0UGFnZXMoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZ2V0QW5ub3QoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZ2V0QW5ub3RzKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGdldEFubm90M0QoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZ2V0QW5ub3RzM0QoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZ2V0RmllbGQoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZ2V0SWNvbihJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBnZXRMaW5rcyhJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBnZXROdGhGaWVsZE5hbWUoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZ2V0T0NHcyhJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBnZXRQYWdlQm94KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGdldFBhZ2VOdGhXb3JkKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGdldFBhZ2VOdGhXb3JkUXVhZHMoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZ2V0UGFnZU51bVdvcmRzKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGdldFByaW50UGFyYW1zKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGdldFVSTChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBpbXBvcnRBbkZERihJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBpbXBvcnRBblhGREYoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgaW1wb3J0VGV4dERhdGEoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgaW5zZXJ0UGFnZXMoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgbWFpbEZvcm0oSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgcHJpbnQoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgcmVtb3ZlRmllbGQoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgcmVwbGFjZVBhZ2VzKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHJlc2V0Rm9ybShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBzYXZlQXMoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgc3VibWl0Rm9ybShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBtYWlsRG9jKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHJlbW92ZUljb24oSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisKKyAgdm9pZCBBdHRhY2hEb2MoQ1BERlNES19Eb2N1bWVudCogcERvYyk7CisgIENQREZTREtfRG9jdW1lbnQqIEdldFJlYWRlckRvYygpOworICB2b2lkIEFkZERlbGF5RGF0YShDSlNfRGVsYXlEYXRhKiBwRGF0YSk7CisgIHZvaWQgRG9GaWVsZERlbGF5KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCk7CisgIHZvaWQgU2V0SXNvbGF0ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSkgeyBtX2lzb2xhdGUgPSBpc29sYXRlOyB9CisgIENKU19Eb2N1bWVudCogR2V0Q0pTRG9jKCkgY29uc3Q7CisKKyBwcml2YXRlOgorICBib29sIElzRW5jbG9zZWRJblJlY3QoQ0ZYX0Zsb2F0UmVjdCByZWN0LCBDRlhfRmxvYXRSZWN0IExpbmtSZWN0KTsKKyAgaW50IENvdW50V29yZHMoQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaik7CisgIENGWF9XaWRlU3RyaW5nIEdldE9ialdvcmRTdHIoQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiwgaW50IG5Xb3JkSW5kZXgpOworCisgIHY4OjpJc29sYXRlKiBtX2lzb2xhdGU7CisgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8SWNvbkVsZW1lbnQ+PiBtX0ljb25MaXN0OworICBDUERGU0RLX0RvY3VtZW50KiBtX3BEb2N1bWVudDsKKyAgQ0ZYX1dpZGVTdHJpbmcgbV9jd0Jhc2VVUkw7CisgIGJvb2wgbV9iRGVsYXk7CisgIENGWF9BcnJheVRlbXBsYXRlPENKU19EZWxheURhdGEqPiBtX0RlbGF5RGF0YTsKK307CisKK2NsYXNzIENKU19Eb2N1bWVudCA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKU19Eb2N1bWVudCh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9CisgIH5DSlNfRG9jdW1lbnQoKSBvdmVycmlkZSB7fQorCisgIC8vIENKU19PYmplY3QKKyAgdm9pZCBJbml0SW5zdGFuY2UoSUpTX1J1bnRpbWUqIHBJUnVudGltZSkgb3ZlcnJpZGU7CisKKyAgREVDTEFSRV9KU19DTEFTUygpOworCisgIEpTX1NUQVRJQ19QUk9QKEFEQkUsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1AoYXV0aG9yLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKGJhc2VVUkwsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1AoYm9va21hcmtSb290LCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKGNhbGN1bGF0ZSwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChDb2xsYWIsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1AoY3JlYXRpb25EYXRlLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKGNyZWF0b3IsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1AoZGVsYXksIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1AoZGlydHksIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1AoZG9jdW1lbnRGaWxlTmFtZSwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChleHRlcm5hbCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChmaWxlc2l6ZSwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChpY29ucywgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChpbmZvLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKGtleXdvcmRzLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKGxheW91dCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChtZWRpYSwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChtb2REYXRlLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKG1vdXNlWCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChtb3VzZVksIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1AobnVtRmllbGRzLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKG51bVBhZ2VzLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKHBhZ2VOdW0sIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1AocGFnZVdpbmRvd1JlY3QsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1AocGF0aCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChwcm9kdWNlciwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChzdWJqZWN0LCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKHRpdGxlLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKHpvb20sIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1Aoem9vbVR5cGUsIERvY3VtZW50KTsKKworICBKU19TVEFUSUNfTUVUSE9EKGFkZEFubm90LCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoYWRkRmllbGQsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChhZGRMaW5rLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoYWRkSWNvbiwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGNhbGN1bGF0ZU5vdywgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGNsb3NlRG9jLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoY3JlYXRlRGF0YU9iamVjdCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGRlbGV0ZVBhZ2VzLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoZXhwb3J0QXNUZXh0LCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoZXhwb3J0QXNGREYsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChleHBvcnRBc1hGREYsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChleHRyYWN0UGFnZXMsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChnZXRBbm5vdCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGdldEFubm90cywgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGdldEFubm90M0QsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChnZXRBbm5vdHMzRCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGdldEZpZWxkLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoZ2V0SWNvbiwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGdldExpbmtzLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoZ2V0TnRoRmllbGROYW1lLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoZ2V0T0NHcywgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGdldFBhZ2VCb3gsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChnZXRQYWdlTnRoV29yZCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGdldFBhZ2VOdGhXb3JkUXVhZHMsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChnZXRQYWdlTnVtV29yZHMsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChnZXRQcmludFBhcmFtcywgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGdldFVSTCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGltcG9ydEFuRkRGLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoaW1wb3J0QW5YRkRGLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoaW1wb3J0VGV4dERhdGEsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChpbnNlcnRQYWdlcywgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKG1haWxGb3JtLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QocHJpbnQsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChyZW1vdmVGaWVsZCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKHJlcGxhY2VQYWdlcywgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKHJlbW92ZUljb24sIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChyZXNldEZvcm0sIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChzYXZlQXMsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChzdWJtaXRGb3JtLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QobWFpbERvYywgRG9jdW1lbnQpOworfTsKKworI2VuZGlmICAvLyBGUERGU0RLX1NSQ19KQVZBU0NSSVBUX0RPQ1VNRU5UX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ZpZWxkLmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvRmllbGQuY3BwCmluZGV4IDc0NzZmYTUuLjdiYWVmZDEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvRmllbGQuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvRmllbGQuY3BwCkBAIC0xLDQxMTUgKzEsMzYyOCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0phdmFTY3JpcHQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX09iamVjdC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19WYWx1ZS5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9GaWVsZC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19SdW50aW1lLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0RvY3VtZW50LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L2NvbG9yLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSWNvbi5oIgorI2luY2x1ZGUgIkZpZWxkLmgiCiAKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGaWVsZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJJY29uLmgiCisjaW5jbHVkZSAiSlNfQ29udGV4dC5oIgorI2luY2x1ZGUgIkpTX0RlZmluZS5oIgorI2luY2x1ZGUgIkpTX0V2ZW50SGFuZGxlci5oIgorI2luY2x1ZGUgIkpTX09iamVjdC5oIgorI2luY2x1ZGUgIkpTX1J1bnRpbWUuaCIKKyNpbmNsdWRlICJKU19WYWx1ZS5oIgorI2luY2x1ZGUgIlB1YmxpY01ldGhvZHMuaCIKKyNpbmNsdWRlICJjb2xvci5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mc2RrX21nci5oIiAgLy8gRm9yIENQREZEb2NfRW52aXJvbm1lbnQuCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCIKIAogQkVHSU5fSlNfU1RBVElDX0NPTlNUKENKU19GaWVsZCkKIEVORF9KU19TVEFUSUNfQ09OU1QoKQogCiBCRUdJTl9KU19TVEFUSUNfUFJPUChDSlNfRmllbGQpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoYWxpZ25tZW50KQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGJvcmRlclN0eWxlKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGJ1dHRvbkFsaWduWCkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShidXR0b25BbGlnblkpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoYnV0dG9uRml0Qm91bmRzKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGJ1dHRvblBvc2l0aW9uKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGJ1dHRvblNjYWxlSG93KQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGJ1dHRvblNjYWxlV2hlbikKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShjYWxjT3JkZXJJbmRleCkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShjaGFyTGltaXQpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoY29tYikKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShjb21taXRPblNlbENoYW5nZSkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShjdXJyZW50VmFsdWVJbmRpY2VzKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGRlZmF1bHRTdHlsZSkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShkZWZhdWx0VmFsdWUpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoZG9Ob3RTY3JvbGwpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoZG9Ob3RTcGVsbENoZWNrKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGRlbGF5KQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGRpc3BsYXkpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoZG9jKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGVkaXRhYmxlKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGV4cG9ydFZhbHVlcykKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShoaWRkZW4pCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoZmlsZVNlbGVjdCkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShmaWxsQ29sb3IpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkobGluZVdpZHRoKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGhpZ2hsaWdodCkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShtdWx0aWxpbmUpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkobXVsdGlwbGVTZWxlY3Rpb24pCi0JSlNfU1RBVElDX1BST1BfRU5UUlkobmFtZSkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShudW1JdGVtcykKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShwYWdlKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHBhc3N3b3JkKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHByaW50KQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHJhZGlvc0luVW5pc29uKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHJlYWRvbmx5KQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHJlY3QpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkocmVxdWlyZWQpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkocmljaFRleHQpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkocmljaFZhbHVlKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHJvdGF0aW9uKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHN0cm9rZUNvbG9yKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHN0eWxlKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHN1Ym1pdE5hbWUpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkodGV4dENvbG9yKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHRleHRGb250KQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHRleHRTaXplKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHR5cGUpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkodXNlck5hbWUpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkodmFsdWUpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkodmFsdWVBc1N0cmluZykKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShzb3VyY2UpCitKU19TVEFUSUNfUFJPUF9FTlRSWShhbGlnbm1lbnQpCitKU19TVEFUSUNfUFJPUF9FTlRSWShib3JkZXJTdHlsZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGJ1dHRvbkFsaWduWCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGJ1dHRvbkFsaWduWSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGJ1dHRvbkZpdEJvdW5kcykKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGJ1dHRvblBvc2l0aW9uKQorSlNfU1RBVElDX1BST1BfRU5UUlkoYnV0dG9uU2NhbGVIb3cpCitKU19TVEFUSUNfUFJPUF9FTlRSWShidXR0b25TY2FsZVdoZW4pCitKU19TVEFUSUNfUFJPUF9FTlRSWShjYWxjT3JkZXJJbmRleCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGNoYXJMaW1pdCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGNvbWIpCitKU19TVEFUSUNfUFJPUF9FTlRSWShjb21taXRPblNlbENoYW5nZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGN1cnJlbnRWYWx1ZUluZGljZXMpCitKU19TVEFUSUNfUFJPUF9FTlRSWShkZWZhdWx0U3R5bGUpCitKU19TVEFUSUNfUFJPUF9FTlRSWShkZWZhdWx0VmFsdWUpCitKU19TVEFUSUNfUFJPUF9FTlRSWShkb05vdFNjcm9sbCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGRvTm90U3BlbGxDaGVjaykKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGRlbGF5KQorSlNfU1RBVElDX1BST1BfRU5UUlkoZGlzcGxheSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGRvYykKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGVkaXRhYmxlKQorSlNfU1RBVElDX1BST1BfRU5UUlkoZXhwb3J0VmFsdWVzKQorSlNfU1RBVElDX1BST1BfRU5UUlkoaGlkZGVuKQorSlNfU1RBVElDX1BST1BfRU5UUlkoZmlsZVNlbGVjdCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGZpbGxDb2xvcikKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGxpbmVXaWR0aCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGhpZ2hsaWdodCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKG11bHRpbGluZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKG11bHRpcGxlU2VsZWN0aW9uKQorSlNfU1RBVElDX1BST1BfRU5UUlkobmFtZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKG51bUl0ZW1zKQorSlNfU1RBVElDX1BST1BfRU5UUlkocGFnZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHBhc3N3b3JkKQorSlNfU1RBVElDX1BST1BfRU5UUlkocHJpbnQpCitKU19TVEFUSUNfUFJPUF9FTlRSWShyYWRpb3NJblVuaXNvbikKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHJlYWRvbmx5KQorSlNfU1RBVElDX1BST1BfRU5UUlkocmVjdCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHJlcXVpcmVkKQorSlNfU1RBVElDX1BST1BfRU5UUlkocmljaFRleHQpCitKU19TVEFUSUNfUFJPUF9FTlRSWShyaWNoVmFsdWUpCitKU19TVEFUSUNfUFJPUF9FTlRSWShyb3RhdGlvbikKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHN0cm9rZUNvbG9yKQorSlNfU1RBVElDX1BST1BfRU5UUlkoc3R5bGUpCitKU19TVEFUSUNfUFJPUF9FTlRSWShzdWJtaXROYW1lKQorSlNfU1RBVElDX1BST1BfRU5UUlkodGV4dENvbG9yKQorSlNfU1RBVElDX1BST1BfRU5UUlkodGV4dEZvbnQpCitKU19TVEFUSUNfUFJPUF9FTlRSWSh0ZXh0U2l6ZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHR5cGUpCitKU19TVEFUSUNfUFJPUF9FTlRSWSh1c2VyTmFtZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHZhbHVlKQorSlNfU1RBVElDX1BST1BfRU5UUlkodmFsdWVBc1N0cmluZykKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHNvdXJjZSkKIEVORF9KU19TVEFUSUNfUFJPUCgpCiAKIEJFR0lOX0pTX1NUQVRJQ19NRVRIT0QoQ0pTX0ZpZWxkKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoYnJvd3NlRm9yRmlsZVRvU3VibWl0KQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoYnV0dG9uR2V0Q2FwdGlvbikKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGJ1dHRvbkdldEljb24pCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShidXR0b25JbXBvcnRJY29uKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoYnV0dG9uU2V0Q2FwdGlvbikKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGJ1dHRvblNldEljb24pCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShjaGVja1RoaXNCb3gpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShjbGVhckl0ZW1zKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZGVmYXVsdElzQ2hlY2tlZCkKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGRlbGV0ZUl0ZW1BdCkKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdldEFycmF5ICkKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdldEl0ZW1BdCkKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdldExvY2spCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShpbnNlcnRJdGVtQXQpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShpc0JveENoZWNrZWQpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShpc0RlZmF1bHRDaGVja2VkKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc2V0QWN0aW9uKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc2V0Rm9jdXMpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShzZXRJdGVtcykKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHNldExvY2spCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShzaWduYXR1cmVHZXRNb2RpZmljYXRpb25zKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc2lnbmF0dXJlR2V0U2VlZFZhbHVlKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc2lnbmF0dXJlSW5mbykKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHNpZ25hdHVyZVNldFNlZWRWYWx1ZSkKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHNpZ25hdHVyZVNpZ24pCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShzaWduYXR1cmVWYWxpZGF0ZSkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoYnJvd3NlRm9yRmlsZVRvU3VibWl0KQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShidXR0b25HZXRDYXB0aW9uKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShidXR0b25HZXRJY29uKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShidXR0b25JbXBvcnRJY29uKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShidXR0b25TZXRDYXB0aW9uKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShidXR0b25TZXRJY29uKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShjaGVja1RoaXNCb3gpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGNsZWFySXRlbXMpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGRlZmF1bHRJc0NoZWNrZWQpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGRlbGV0ZUl0ZW1BdCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ2V0QXJyYXkpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGdldEl0ZW1BdCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ2V0TG9jaykKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoaW5zZXJ0SXRlbUF0KQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShpc0JveENoZWNrZWQpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGlzRGVmYXVsdENoZWNrZWQpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHNldEFjdGlvbikKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc2V0Rm9jdXMpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHNldEl0ZW1zKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShzZXRMb2NrKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShzaWduYXR1cmVHZXRNb2RpZmljYXRpb25zKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShzaWduYXR1cmVHZXRTZWVkVmFsdWUpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHNpZ25hdHVyZUluZm8pCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHNpZ25hdHVyZVNldFNlZWRWYWx1ZSkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc2lnbmF0dXJlU2lnbikKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc2lnbmF0dXJlVmFsaWRhdGUpCiBFTkRfSlNfU1RBVElDX01FVEhPRCgpCiAKIElNUExFTUVOVF9KU19DTEFTUyhDSlNfRmllbGQsIEZpZWxkKQogCi1GWF9CT09MCUNKU19GaWVsZDo6SW5pdEluc3RhbmNlKElGWEpTX0NvbnRleHQqIGNjKQotewotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCi0JRmllbGQqIHBGaWVsZCA9IChGaWVsZCopR2V0RW1iZWRPYmplY3QoKTsKLQlBU1NFUlQocEZpZWxkICE9IE5VTEwpOwotCi0JcEZpZWxkLT5TZXRJc29sYXRlKHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKS0+R2V0SXNvbGF0ZSgpKTsKLQotCXJldHVybiBUUlVFOwotfTsKLQotRmllbGQ6OkZpZWxkKENKU19PYmplY3QqIHBKU09iamVjdCk6IENKU19FbWJlZE9iaihwSlNPYmplY3QpLAotCW1fcEpTRG9jKE5VTEwpLAotCW1fcERvY3VtZW50KE5VTEwpLAotCW1fbkZvcm1Db250cm9sSW5kZXgoLTEpLAotCW1fYkNhblNldChGQUxTRSksCi0JbV9iRGVsYXkoRkFMU0UpLAotCW1faXNvbGF0ZShOVUxMKQotewordm9pZCBDSlNfRmllbGQ6OkluaXRJbnN0YW5jZShJSlNfUnVudGltZSogcElSdW50aW1lKSB7CisgIENKU19SdW50aW1lKiBwUnVudGltZSA9IHN0YXRpY19jYXN0PENKU19SdW50aW1lKj4ocElSdW50aW1lKTsKKyAgRmllbGQqIHBGaWVsZCA9IHN0YXRpY19jYXN0PEZpZWxkKj4oR2V0RW1iZWRPYmplY3QoKSk7CisgIHBGaWVsZC0+U2V0SXNvbGF0ZShwUnVudGltZS0+R2V0SXNvbGF0ZSgpKTsKIH0KIAotRmllbGQ6On5GaWVsZCgpCi17Ci19CitGaWVsZDo6RmllbGQoQ0pTX09iamVjdCogcEpTT2JqZWN0KQorICAgIDogQ0pTX0VtYmVkT2JqKHBKU09iamVjdCksCisgICAgICBtX3BKU0RvYyhOVUxMKSwKKyAgICAgIG1fcERvY3VtZW50KE5VTEwpLAorICAgICAgbV9uRm9ybUNvbnRyb2xJbmRleCgtMSksCisgICAgICBtX2JDYW5TZXQoRkFMU0UpLAorICAgICAgbV9iRGVsYXkoRkFMU0UpLAorICAgICAgbV9pc29sYXRlKE5VTEwpIHt9CiAKLS8vbm90ZTogaUNvbnRyb2xObyA9IC0xLCBtZWFucyBub3QgYSB3aWRnZXQuCi12b2lkIEZpZWxkOjpQYXJzZUZpZWxkTmFtZShjb25zdCBzdGQ6OndzdHJpbmcgJnN0ckZpZWxkTmFtZVBhcnNlZCxzdGQ6OndzdHJpbmcgJnN0ckZpZWxkTmFtZSxpbnQgJiBpQ29udHJvbE5vKQotewotCWludCBpU3RhcnQgPSBzdHJGaWVsZE5hbWVQYXJzZWQuZmluZF9sYXN0X29mKEwnLicpOwotCWlmIChpU3RhcnQgPT0gLTEpCi0JewotCQlzdHJGaWVsZE5hbWUgPSBzdHJGaWVsZE5hbWVQYXJzZWQ7Ci0JCWlDb250cm9sTm8gPSAtMTsKLQkJcmV0dXJuOwotCX0KLQlzdGQ6OndzdHJpbmcgc3VmZml4YWwgPSBzdHJGaWVsZE5hbWVQYXJzZWQuc3Vic3RyKGlTdGFydCsxKTsKLQlpQ29udHJvbE5vID0gRlhTWVNfd3RvaShzdWZmaXhhbC5jX3N0cigpKTsKLQlpZiAoaUNvbnRyb2xObyA9PSAwKQotCXsKLQkJaW50IGlTdGFydDsKLQkJd2hpbGUoKGlTdGFydCA9IHN1ZmZpeGFsLmZpbmRfbGFzdF9vZihMIiAiKSkgIT0gLTEpCi0JCXsKLQkJCXN1ZmZpeGFsLmVyYXNlKGlTdGFydCwxKTsKLQkJfQorRmllbGQ6On5GaWVsZCgpIHt9CiAKLQkJaWYgKHN1ZmZpeGFsLmNvbXBhcmUoTCIwIikgIT0gMCkKLQkJewotCQkJc3RyRmllbGROYW1lID0gc3RyRmllbGROYW1lUGFyc2VkOwotCQkJaUNvbnRyb2xObyA9IC0xOwotCQkJcmV0dXJuOwotCQl9CisvLyBub3RlOiBpQ29udHJvbE5vID0gLTEsIG1lYW5zIG5vdCBhIHdpZGdldC4KK3ZvaWQgRmllbGQ6OlBhcnNlRmllbGROYW1lKGNvbnN0IHN0ZDo6d3N0cmluZyYgc3RyRmllbGROYW1lUGFyc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp3c3RyaW5nJiBzdHJGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGlDb250cm9sTm8pIHsKKyAgaW50IGlTdGFydCA9IHN0ckZpZWxkTmFtZVBhcnNlZC5maW5kX2xhc3Rfb2YoTCcuJyk7CisgIGlmIChpU3RhcnQgPT0gLTEpIHsKKyAgICBzdHJGaWVsZE5hbWUgPSBzdHJGaWVsZE5hbWVQYXJzZWQ7CisgICAgaUNvbnRyb2xObyA9IC0xOworICAgIHJldHVybjsKKyAgfQorICBzdGQ6OndzdHJpbmcgc3VmZml4YWwgPSBzdHJGaWVsZE5hbWVQYXJzZWQuc3Vic3RyKGlTdGFydCArIDEpOworICBpQ29udHJvbE5vID0gRlhTWVNfd3RvaShzdWZmaXhhbC5jX3N0cigpKTsKKyAgaWYgKGlDb250cm9sTm8gPT0gMCkgeworICAgIGludCBpU3RhcnQ7CisgICAgd2hpbGUgKChpU3RhcnQgPSBzdWZmaXhhbC5maW5kX2xhc3Rfb2YoTCIgIikpICE9IC0xKSB7CisgICAgICBzdWZmaXhhbC5lcmFzZShpU3RhcnQsIDEpOworICAgIH0KIAotCX0KLQlzdHJGaWVsZE5hbWUgPSBzdHJGaWVsZE5hbWVQYXJzZWQuc3Vic3RyKDAsaVN0YXJ0KTsgICAgCisgICAgaWYgKHN1ZmZpeGFsLmNvbXBhcmUoTCIwIikgIT0gMCkgeworICAgICAgc3RyRmllbGROYW1lID0gc3RyRmllbGROYW1lUGFyc2VkOworICAgICAgaUNvbnRyb2xObyA9IC0xOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBzdHJGaWVsZE5hbWUgPSBzdHJGaWVsZE5hbWVQYXJzZWQuc3Vic3RyKDAsIGlTdGFydCk7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OkF0dGFjaEZpZWxkKERvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSkKLXsKLQlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwotCW1fcEpTRG9jID0gcERvY3VtZW50OwotCi0JbV9wRG9jdW1lbnQgPSBwRG9jdW1lbnQtPkdldFJlYWRlckRvYygpOwotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQotCW1fYkNhblNldCA9IG1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9GSUxMX0ZPUk0pIHx8IAotCQltX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fQU5OT1RfRk9STSkgfHwgCi0JCW1fcERvY3VtZW50LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpOwotCi0JQ1BERlNES19JbnRlckZvcm0qIHBSREludGVyRm9ybSA9IG1fcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKLQlBU1NFUlQocFJESW50ZXJGb3JtICE9IE5VTEwpOworRlhfQk9PTCBGaWVsZDo6QXR0YWNoRmllbGQoRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSkgeworICBtX3BKU0RvYyA9IHBEb2N1bWVudDsKKyAgbV9wRG9jdW1lbnQgPSBwRG9jdW1lbnQtPkdldFJlYWRlckRvYygpOworICBtX2JDYW5TZXQgPSBtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRklMTF9GT1JNKSB8fAorICAgICAgICAgICAgICBtX3BEb2N1bWVudC0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fQU5OT1RfRk9STSkgfHwKKyAgICAgICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSk7CiAKLQlDUERGX0ludGVyRm9ybSogcEludGVyRm9ybSA9IHBSREludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7Ci0JQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CisgIENQREZTREtfSW50ZXJGb3JtKiBwUkRJbnRlckZvcm0gPSBtX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CisgIENQREZfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFJESW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgc3dGaWVsZE5hbWVUZW1wID0gY3NGaWVsZE5hbWU7CisgIHN3RmllbGROYW1lVGVtcC5SZXBsYWNlKEwiLi4iLCBMIi4iKTsKIAotCUNGWF9XaWRlU3RyaW5nIHN3RmllbGROYW1lVGVtcCA9IGNzRmllbGROYW1lOwotCXN3RmllbGROYW1lVGVtcC5SZXBsYWNlKEwiLi4iLCBMIi4iKTsKKyAgaWYgKHBJbnRlckZvcm0tPkNvdW50RmllbGRzKHN3RmllbGROYW1lVGVtcCkgPD0gMCkgeworICAgIHN0ZDo6d3N0cmluZyBzdHJGaWVsZE5hbWU7CisgICAgaW50IGlDb250cm9sTm8gPSAtMTsKKyAgICBQYXJzZUZpZWxkTmFtZShzd0ZpZWxkTmFtZVRlbXAuY19zdHIoKSwgc3RyRmllbGROYW1lLCBpQ29udHJvbE5vKTsKKyAgICBpZiAoaUNvbnRyb2xObyA9PSAtMSkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCWlmIChwSW50ZXJGb3JtLT5Db3VudEZpZWxkcyhzd0ZpZWxkTmFtZVRlbXApIDw9IDApCi0JewotCQlzdGQ6OndzdHJpbmcgc3RyRmllbGROYW1lOwotCQlpbnQgaUNvbnRyb2xObyA9IC0xOwotCQlQYXJzZUZpZWxkTmFtZShzd0ZpZWxkTmFtZVRlbXAuY19zdHIoKSwgc3RyRmllbGROYW1lLCBpQ29udHJvbE5vKTsKLQkJaWYgKGlDb250cm9sTm8gPT0gLTEpIHJldHVybiBGQUxTRTsKLQkJCi0JCW1fRmllbGROYW1lID0gc3RyRmllbGROYW1lLmNfc3RyKCk7Ci0JCW1fbkZvcm1Db250cm9sSW5kZXggPSBpQ29udHJvbE5vOwotCQlyZXR1cm4gVFJVRTsKLQl9CisgICAgbV9GaWVsZE5hbWUgPSBzdHJGaWVsZE5hbWUuY19zdHIoKTsKKyAgICBtX25Gb3JtQ29udHJvbEluZGV4ID0gaUNvbnRyb2xObzsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQogCi0JbV9GaWVsZE5hbWUgPSBzd0ZpZWxkTmFtZVRlbXA7Ci0JbV9uRm9ybUNvbnRyb2xJbmRleCA9IC0xOworICBtX0ZpZWxkTmFtZSA9IHN3RmllbGROYW1lVGVtcDsKKyAgbV9uRm9ybUNvbnRyb2xJbmRleCA9IC0xOwogCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi12b2lkIEZpZWxkOjpHZXRGb3JtRmllbGRzKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lLCBDRlhfUHRyQXJyYXkmIEZpZWxkQXJyYXkpCi17Ci0JQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKLQotCUNQREZTREtfSW50ZXJGb3JtKiBwUmVhZGVySW50ZXJGb3JtID0gcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKLQlBU1NFUlQocFJlYWRlckludGVyRm9ybSAhPSBOVUxMKTsKLQotCUNQREZfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFJlYWRlckludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7Ci0JQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7Ci0KLQlBU1NFUlQoRmllbGRBcnJheS5HZXRTaXplKCkgPT0gMCk7Ci0KLQlmb3IgKGludCBpPTAsc3o9cEludGVyRm9ybS0+Q291bnRGaWVsZHMoY3NGaWVsZE5hbWUpOyBpPHN6OyBpKyspCi0JewotCQlpZiAoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBwSW50ZXJGb3JtLT5HZXRGaWVsZChpLCBjc0ZpZWxkTmFtZSkpCi0JCQlGaWVsZEFycmF5LkFkZCgodm9pZCopcEZvcm1GaWVsZCk7Ci0JfQorc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZDo6R2V0Rm9ybUZpZWxkcygKKyAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lKSB7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gZmllbGRzOworICBDUERGU0RLX0ludGVyRm9ybSogcFJlYWRlckludGVyRm9ybSA9IHBEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CisgIENQREZfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFJlYWRlckludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7CisgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBJbnRlckZvcm0tPkNvdW50RmllbGRzKGNzRmllbGROYW1lKTsgaSA8IHN6OyArK2kpIHsKKyAgICBpZiAoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBwSW50ZXJGb3JtLT5HZXRGaWVsZChpLCBjc0ZpZWxkTmFtZSkpCisgICAgICBmaWVsZHMucHVzaF9iYWNrKHBGb3JtRmllbGQpOworICB9CisgIHJldHVybiBmaWVsZHM7CiB9CiAKLXZvaWQgRmllbGQ6OkdldEZvcm1GaWVsZHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lLCBDRlhfUHRyQXJyYXkmIEZpZWxkQXJyYXkpCi17Ci0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0JRmllbGQ6OkdldEZvcm1GaWVsZHMobV9wRG9jdW1lbnQsIGNzRmllbGROYW1lLCBGaWVsZEFycmF5KTsKK3N0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGQ6OkdldEZvcm1GaWVsZHMoCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lKSBjb25zdCB7CisgIHJldHVybiBGaWVsZDo6R2V0Rm9ybUZpZWxkcyhtX3BEb2N1bWVudCwgY3NGaWVsZE5hbWUpOwogfQogCi12b2lkIEZpZWxkOjpVcGRhdGVGb3JtRmllbGQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgCi0JCQkJCQkJRlhfQk9PTCBiQ2hhbmdlTWFyaywgRlhfQk9PTCBiUmVzZXRBUCwgRlhfQk9PTCBiUmVmcmVzaCkKLXsKLQlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwotCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0JQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKXBEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7Ci0JQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7Ci0KLQlDRlhfUHRyQXJyYXkgd2lkZ2V0czsKLQlwSW50ZXJGb3JtLT5HZXRXaWRnZXRzKHBGb3JtRmllbGQsIHdpZGdldHMpOwotCi0JaWYgKGJSZXNldEFQKQotCXsKLQkJaW50IG5GaWVsZFR5cGUgPSBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKTsKLQkJaWYgKG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX0NPTUJPQk9YIHx8IG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX1RFWFRGSUVMRCkKLQkJewotCQkJZm9yIChpbnQgaT0wLHN6PXdpZGdldHMuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JCQl7Ci0JCQkJQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXdpZGdldHMuR2V0QXQoaSk7Ci0JCQkJQVNTRVJUKHBXaWRnZXQgIT0gTlVMTCk7Cit2b2lkIEZpZWxkOjpVcGRhdGVGb3JtRmllbGQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYW5nZU1hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVzZXRBUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZWZyZXNoKSB7CisgIHN0ZDo6dmVjdG9yPENQREZTREtfV2lkZ2V0Kj4gd2lkZ2V0czsKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKXBEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CisgIHBJbnRlckZvcm0tPkdldFdpZGdldHMocEZvcm1GaWVsZCwgJndpZGdldHMpOwogCi0JCQkJRlhfQk9PTCBiRm9ybWF0ZWQgPSBGQUxTRTsKLQkJCQlDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSBwV2lkZ2V0LT5PbkZvcm1hdCgwLCBiRm9ybWF0ZWQpOwotCQkJCWlmIChiRm9ybWF0ZWQpCi0JCQkJCXBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShzVmFsdWUuY19zdHIoKSwgRkFMU0UpOwotCQkJCWVsc2UKLQkJCQkJcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsIEZBTFNFKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCWZvciAoaW50IGk9MCxzej13aWRnZXRzLkdldFNpemUoKTsgaTxzejsgaSsrKQotCQkJewotCQkJCUNQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0Kil3aWRnZXRzLkdldEF0KGkpOwotCQkJCUFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOworICBpZiAoYlJlc2V0QVApIHsKKyAgICBpbnQgbkZpZWxkVHlwZSA9IHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpOworICAgIGlmIChuRmllbGRUeXBlID09IEZJRUxEVFlQRV9DT01CT0JPWCB8fCBuRmllbGRUeXBlID09IEZJRUxEVFlQRV9URVhURklFTEQpIHsKKyAgICAgIGZvciAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgOiB3aWRnZXRzKSB7CisgICAgICAgIEZYX0JPT0wgYkZvcm1hdHRlZCA9IEZBTFNFOworICAgICAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSBwV2lkZ2V0LT5PbkZvcm1hdChiRm9ybWF0dGVkKTsKKyAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKGJGb3JtYXR0ZWQgPyBzVmFsdWUuY19zdHIoKSA6IG51bGxwdHIsIEZBTFNFKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA6IHdpZGdldHMpIHsKKyAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKG51bGxwdHIsIEZBTFNFKTsKKyAgICAgIH0KKyAgICB9CisgIH0KIAotCQkJCXBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShOVUxMLCBGQUxTRSk7Ci0JCQl9Ci0JCX0KLQl9CisgIGlmIChiUmVmcmVzaCkgeworICAgIGZvciAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgOiB3aWRnZXRzKSB7CisgICAgICBDUERGU0RLX0RvY3VtZW50KiBwRG9jID0gcFdpZGdldC0+R2V0SW50ZXJGb3JtKCktPkdldERvY3VtZW50KCk7CisgICAgICBwRG9jLT5VcGRhdGVBbGxWaWV3cyhudWxscHRyLCBwV2lkZ2V0KTsKKyAgICB9CisgIH0KIAotCWlmIChiUmVmcmVzaCkKLQl7Ci0JCWZvciAoaW50IGk9MCxzej13aWRnZXRzLkdldFNpemUoKTsgaTxzejsgaSsrKQotCQl7Ci0JCQlDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopd2lkZ2V0cy5HZXRBdChpKTsKLQkJCUFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOwotCQkJCi0JCQlDUERGU0RLX0ludGVyRm9ybSAqIHBJbnRlckZvcm0gPSBwV2lkZ2V0LT5HZXRJbnRlckZvcm0oKTsKLQkJCUNQREZTREtfRG9jdW1lbnQqIHBEb2MgPSBwSW50ZXJGb3JtLT5HZXREb2N1bWVudCgpOwotLy8gCQkJQ1JlYWRlcl9QYWdlKiBwUGFnZSA9IHBXaWRnZXQtPkdldFBhZ2UoKTsKLSAJCQlBU1NFUlQocERvYyAhPSBOVUxMKTsKLQkJCXBEb2MtPlVwZGF0ZUFsbFZpZXdzKE5VTEwsIHBXaWRnZXQpOwotCQl9Ci0JfQkJCi0JCi0JaWYgKGJDaGFuZ2VNYXJrKQotCQlwRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKKyAgaWYgKGJDaGFuZ2VNYXJrKQorICAgIHBEb2N1bWVudC0+U2V0Q2hhbmdlTWFyaygpOwogfQogCi12b2lkIEZpZWxkOjpVcGRhdGVGb3JtQ29udHJvbChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCwgCi0JCQkJCQkJRlhfQk9PTCBiQ2hhbmdlTWFyaywgRlhfQk9PTCBiUmVzZXRBUCwgRlhfQk9PTCBiUmVmcmVzaCkKLXsKLQlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwotCUFTU0VSVChwRm9ybUNvbnRyb2wgIT0gTlVMTCk7Cit2b2lkIEZpZWxkOjpVcGRhdGVGb3JtQ29udHJvbChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFuZ2VNYXJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVzZXRBUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlZnJlc2gpIHsKKyAgQVNTRVJUKHBGb3JtQ29udHJvbCk7CiAKLQlDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKLQlBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKXBEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CisgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gcEludGVyRm9ybS0+R2V0V2lkZ2V0KHBGb3JtQ29udHJvbCk7CiAKLQlDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpOwotCQotCWlmIChwV2lkZ2V0KQotCXsKLQkJaWYgKGJSZXNldEFQKQotCQl7Ci0JCQlpbnQgbkZpZWxkVHlwZSA9IHBXaWRnZXQtPkdldEZpZWxkVHlwZSgpOwotCQkJaWYgKG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX0NPTUJPQk9YIHx8IG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX1RFWFRGSUVMRCkKLQkJCXsKLQkJCQlGWF9CT09MIGJGb3JtYXRlZCA9IEZBTFNFOwotCQkJCUNGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IHBXaWRnZXQtPk9uRm9ybWF0KDAsIGJGb3JtYXRlZCk7Ci0JCQkJaWYgKGJGb3JtYXRlZCkKLQkJCQkJcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKHNWYWx1ZS5jX3N0cigpLCBGQUxTRSk7Ci0JCQkJZWxzZQotCQkJCQlwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2UoTlVMTCwgRkFMU0UpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShOVUxMLCBGQUxTRSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYlJlZnJlc2gpCi0JCXsKLQkJCUNQREZTREtfSW50ZXJGb3JtICogcEludGVyRm9ybSA9IHBXaWRnZXQtPkdldEludGVyRm9ybSgpOwotCQkJQ1BERlNES19Eb2N1bWVudCogcERvYyA9IHBJbnRlckZvcm0tPkdldERvY3VtZW50KCk7Ci0JCQlBU1NFUlQocERvYyAhPSBOVUxMKTsKLQkJCXBEb2MtPlVwZGF0ZUFsbFZpZXdzKE5VTEwsIHBXaWRnZXQpOwotCQl9CisgIGlmIChwV2lkZ2V0KSB7CisgICAgaWYgKGJSZXNldEFQKSB7CisgICAgICBpbnQgbkZpZWxkVHlwZSA9IHBXaWRnZXQtPkdldEZpZWxkVHlwZSgpOworICAgICAgaWYgKG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX0NPTUJPQk9YIHx8CisgICAgICAgICAgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfVEVYVEZJRUxEKSB7CisgICAgICAgIEZYX0JPT0wgYkZvcm1hdGVkID0gRkFMU0U7CisgICAgICAgIENGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IHBXaWRnZXQtPk9uRm9ybWF0KGJGb3JtYXRlZCk7CisgICAgICAgIGlmIChiRm9ybWF0ZWQpCisgICAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKHNWYWx1ZS5jX3N0cigpLCBGQUxTRSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2UoTlVMTCwgRkFMU0UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsIEZBTFNFKTsKKyAgICAgIH0KKyAgICB9CiAKLQl9CisgICAgaWYgKGJSZWZyZXNoKSB7CisgICAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IHBXaWRnZXQtPkdldEludGVyRm9ybSgpOworICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvYyA9IHBJbnRlckZvcm0tPkdldERvY3VtZW50KCk7CisgICAgICBwRG9jLT5VcGRhdGVBbGxWaWV3cyhOVUxMLCBwV2lkZ2V0KTsKKyAgICB9CisgIH0KIAotCWlmIChiQ2hhbmdlTWFyaykKLQkJcERvY3VtZW50LT5TZXRDaGFuZ2VNYXJrKCk7CisgIGlmIChiQ2hhbmdlTWFyaykKKyAgICBwRG9jdW1lbnQtPlNldENoYW5nZU1hcmsoKTsKIH0KIAotQ1BERlNES19XaWRnZXQqIEZpZWxkOjpHZXRXaWRnZXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wpCi17Ci0JQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKLQlBU1NFUlQocEZvcm1Db250cm9sICE9IE5VTEwpOworQ1BERlNES19XaWRnZXQqIEZpZWxkOjpHZXRXaWRnZXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sKSB7CisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0KKyAgICAgIHN0YXRpY19jYXN0PENQREZTREtfSW50ZXJGb3JtKj4ocERvY3VtZW50LT5HZXRJbnRlckZvcm0oKSk7CisgIHJldHVybiBwSW50ZXJGb3JtID8gcEludGVyRm9ybS0+R2V0V2lkZ2V0KHBGb3JtQ29udHJvbCkgOiBudWxscHRyOworfQogCi0JQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKXBEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7Ci0JQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CitGWF9CT09MIEZpZWxkOjpWYWx1ZUlzT2NjdXIoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NPcHRMYWJlbCkgeworICBmb3IgKGludCBpID0gMCwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudE9wdGlvbnMoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAoY3NPcHRMYWJlbC5Db21wYXJlKHBGb3JtRmllbGQtPkdldE9wdGlvbkxhYmVsKGkpKSA9PSAwKQorICAgICAgcmV0dXJuIFRSVUU7CisgIH0KIAotCXJldHVybiBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1Db250cm9sKTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIEZpZWxkOjpWYWx1ZUlzT2NjdXIoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIENGWF9XaWRlU3RyaW5nIGNzT3B0TGFiZWwpCi17Ci0JQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CitDUERGX0Zvcm1Db250cm9sKiBGaWVsZDo6R2V0U21hcnRGaWVsZENvbnRyb2woQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQpIHsKKyAgaWYgKCFwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkgfHwKKyAgICAgIG1fbkZvcm1Db250cm9sSW5kZXggPj0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKQorICAgIHJldHVybiBOVUxMOwogCi0JZm9yIChpbnQgaT0wLHN6ID0gcEZvcm1GaWVsZC0+Q291bnRPcHRpb25zKCk7IGkgPCBzejsgaSsrKQotCXsKLQkJaWYgKGNzT3B0TGFiZWwuQ29tcGFyZShwRm9ybUZpZWxkLT5HZXRPcHRpb25MYWJlbChpKSkgPT0gMCkKLQkJCXJldHVybiBUUlVFOwotCX0KKyAgaWYgKG1fbkZvcm1Db250cm9sSW5kZXggPCAwKQorICAgIHJldHVybiBwRm9ybUZpZWxkLT5HZXRDb250cm9sKDApOwogCi0JcmV0dXJuIEZBTFNFOworICByZXR1cm4gcEZvcm1GaWVsZC0+R2V0Q29udHJvbChtX25Gb3JtQ29udHJvbEluZGV4KTsKIH0KIAotQ1BERl9Gb3JtQ29udHJvbCogRmllbGQ6OkdldFNtYXJ0RmllbGRDb250cm9sKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkKQotewotCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCWlmKCFwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkgfHwgbV9uRm9ybUNvbnRyb2xJbmRleD49cEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKSByZXR1cm4gTlVMTDsKK0ZYX0JPT0wgRmllbGQ6OmFsaWdubWVudChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQpOwogCi0JaWYgKG1fbkZvcm1Db250cm9sSW5kZXg8MCkKLQkJcmV0dXJuIHBGb3JtRmllbGQtPkdldENvbnRyb2woMCk7Ci0JZWxzZQotCQlyZXR1cm4gcEZvcm1GaWVsZC0+R2V0Q29udHJvbChtX25Gb3JtQ29udHJvbEluZGV4KTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcm9wZXJ0eSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLUZYX0JPT0wgRmllbGQ6OmFsaWdubWVudChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0JaWYgKHZwLklzU2V0dGluZygpKQotCXsKLQkJaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKLQotCQlDRlhfQnl0ZVN0cmluZyBhbGlnblN0cjsKLQkJdnAgPj4gYWxpZ25TdHI7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCWlmIChtX2JEZWxheSkKLQkJewotCQkJQWRkRGVsYXlfU3RyaW5nKEZQX0FMSUdOTUVOVCwgYWxpZ25TdHIpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJRmllbGQ6OlNldEFsaWdubWVudChtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIGFsaWduU3RyKTsKLQkJfQotCX0KLQllbHNlCi0JewotCQlDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLQkJR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0JCWlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgQ0ZYX0J5dGVTdHJpbmcgYWxpZ25TdHI7CisgICAgdnAgPj4gYWxpZ25TdHI7CiAKLQkJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotCQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKyAgICBpZiAobV9iRGVsYXkpIHsKKyAgICAgIEFkZERlbGF5X1N0cmluZyhGUF9BTElHTk1FTlQsIGFsaWduU3RyKTsKKyAgICB9IGVsc2UgeworICAgICAgRmllbGQ6OlNldEFsaWdubWVudChtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduU3RyKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgICAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKLQkJCXJldHVybiBGQUxTRTsKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0JCWlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKKyAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKKyAgICBpZiAoIXBGb3JtQ29udHJvbCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlzd2l0Y2ggKHBGb3JtQ29udHJvbC0+R2V0Q29udHJvbEFsaWdubWVudCgpKQotCQl7Ci0JCQljYXNlIDE6Ci0JCQkJdnAgPDwgTCJjZW50ZXIiOwotCQkJCWJyZWFrOwotCQkJY2FzZSAwOgotCQkJCXZwIDw8IEwibGVmdCI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJdnAgPDwgTCJyaWdodCI7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXZwIDw8IEwiIjsKLQkJfQotCX0KKyAgICBzd2l0Y2ggKHBGb3JtQ29udHJvbC0+R2V0Q29udHJvbEFsaWdubWVudCgpKSB7CisgICAgICBjYXNlIDE6CisgICAgICAgIHZwIDw8IEwiY2VudGVyIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDA6CisgICAgICAgIHZwIDw8IEwibGVmdCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICB2cCA8PCBMInJpZ2h0IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB2cCA8PCBMIiI7CisgICAgfQorICB9CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLXZvaWQgRmllbGQ6OlNldEFsaWdubWVudChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIAotCQkJCQkJIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpCi17Ci0JLy9Ob3Qgc3VwcG9ydGVkLgordm9pZCBGaWVsZDo6U2V0QWxpZ25tZW50KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZykgeworICAvLyBOb3Qgc3VwcG9ydGVkLgogfQogCi1GWF9CT09MIEZpZWxkOjpib3JkZXJTdHlsZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17CQotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgRmllbGQ6OmJvcmRlclN0eWxlKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQpOwogCi0JaWYgKHZwLklzU2V0dGluZygpKQotCXsKLQkJaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJQ0ZYX0J5dGVTdHJpbmcgc3RyVHlwZSA9ICIiOwotCQl2cCA+PiBzdHJUeXBlOworICAgIENGWF9CeXRlU3RyaW5nIHN0clR5cGUgPSAiIjsKKyAgICB2cCA+PiBzdHJUeXBlOwogCi0JCWlmIChtX2JEZWxheSkKLQkJewotCQkJQWRkRGVsYXlfU3RyaW5nKEZQX0JPUkRFUlNUWUxFLCBzdHJUeXBlKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUZpZWxkOjpTZXRCb3JkZXJTdHlsZShtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIHN0clR5cGUpOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKLQkJaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAobV9iRGVsYXkpIHsKKyAgICAgIEFkZERlbGF5X1N0cmluZyhGUF9CT1JERVJTVFlMRSwgc3RyVHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXRCb3JkZXJTdHlsZShtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyVHlwZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICAgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotCQlpZiAoIXBGb3JtRmllbGQpIHJldHVybiBGQUxTRTsKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgICAgaWYgKCFwRm9ybUZpZWxkKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCUNQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gR2V0V2lkZ2V0KG1fcERvY3VtZW50LCBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKSk7Ci0JCWlmICghcFdpZGdldCkgcmV0dXJuIEZBTFNFOworICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0KKyAgICAgICAgR2V0V2lkZ2V0KG1fcERvY3VtZW50LCBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKSk7CisgICAgaWYgKCFwV2lkZ2V0KQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCWludCBuQm9yZGVyc3R5bGUgPSBwV2lkZ2V0LT5HZXRCb3JkZXJTdHlsZSgpOworICAgIGludCBuQm9yZGVyc3R5bGUgPSBwV2lkZ2V0LT5HZXRCb3JkZXJTdHlsZSgpOwogCi0JCXN3aXRjaCAobkJvcmRlcnN0eWxlKQotCQl7Ci0JCQljYXNlIEJCU19TT0xJRDoKLQkJCQl2cCA8PCBMInNvbGlkIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgQkJTX0RBU0g6Ci0JCQkJdnAgPDwgTCJkYXNoZWQiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCQlNfQkVWRUxFRDoKLQkJCQl2cCA8PCBMImJldmVsZWQiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCQlNfSU5TRVQ6Ci0JCQkJdnAgPDwgTCJpbnNldCI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJCU19VTkRFUkxJTkU6Ci0JCQkJdnAgPDwgTCJ1bmRlcmxpbmUiOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQl2cCA8PCBMIiI7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9CisgICAgc3dpdGNoIChuQm9yZGVyc3R5bGUpIHsKKyAgICAgIGNhc2UgQkJTX1NPTElEOgorICAgICAgICB2cCA8PCBMInNvbGlkIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEJCU19EQVNIOgorICAgICAgICB2cCA8PCBMImRhc2hlZCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCQlNfQkVWRUxFRDoKKyAgICAgICAgdnAgPDwgTCJiZXZlbGVkIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEJCU19JTlNFVDoKKyAgICAgICAgdnAgPDwgTCJpbnNldCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCQlNfVU5ERVJMSU5FOgorICAgICAgICB2cCA8PCBMInVuZGVybGluZSI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdnAgPDwgTCIiOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBGaWVsZDo6U2V0Qm9yZGVyU3R5bGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCAKLQkJCQkJCSAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpCi17Ci0JQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKLQotCWludCBuQm9yZGVyU3R5bGUgPSAwOwotCi0JaWYgKHN0cmluZyA9PSAic29saWQiKQotCQluQm9yZGVyU3R5bGUgPSBCQlNfU09MSUQ7Ci0JZWxzZSBpZiAoc3RyaW5nID09ICJiZXZlbGVkIikKLQkJbkJvcmRlclN0eWxlID0gQkJTX0JFVkVMRUQ7Ci0JZWxzZSBpZiAoc3RyaW5nID09ICJkYXNoZWQiKQotCQluQm9yZGVyU3R5bGUgPSBCQlNfREFTSDsKLQllbHNlIGlmIChzdHJpbmcgPT0gImluc2V0IikKLQkJbkJvcmRlclN0eWxlID0gQkJTX0lOU0VUOwotCWVsc2UgaWYgKHN0cmluZyA9PSAidW5kZXJsaW5lIikKLQkJbkJvcmRlclN0eWxlID0gQkJTX1VOREVSTElORTsKLQllbHNlIHJldHVybjsKK3ZvaWQgRmllbGQ6OlNldEJvcmRlclN0eWxlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZykgeworICBBU1NFUlQocERvY3VtZW50KTsKIAotCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCUdldEZvcm1GaWVsZHMocERvY3VtZW50LCBzd0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgIGludCBuQm9yZGVyU3R5bGUgPSAwOwogCi0JZm9yIChpbnQgaT0wLGlzej1GaWVsZEFycmF5LkdldFNpemUoKTsgaTxpc3o7IGkrKykKLQl7Ci0JCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdChpKTsKLQkJQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisgIGlmIChzdHJpbmcgPT0gInNvbGlkIikKKyAgICBuQm9yZGVyU3R5bGUgPSBCQlNfU09MSUQ7CisgIGVsc2UgaWYgKHN0cmluZyA9PSAiYmV2ZWxlZCIpCisgICAgbkJvcmRlclN0eWxlID0gQkJTX0JFVkVMRUQ7CisgIGVsc2UgaWYgKHN0cmluZyA9PSAiZGFzaGVkIikKKyAgICBuQm9yZGVyU3R5bGUgPSBCQlNfREFTSDsKKyAgZWxzZSBpZiAoc3RyaW5nID09ICJpbnNldCIpCisgICAgbkJvcmRlclN0eWxlID0gQkJTX0lOU0VUOworICBlbHNlIGlmIChzdHJpbmcgPT0gInVuZGVybGluZSIpCisgICAgbkJvcmRlclN0eWxlID0gQkJTX1VOREVSTElORTsKKyAgZWxzZQorICAgIHJldHVybjsKIAotCQlpZiAobkNvbnRyb2xJbmRleCA8IDApCi0JCXsKLQkJCUZYX0JPT0wgYlNldCA9IEZBTFNFOwotCQkJZm9yIChpbnQgaj0wLGpzeiA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgajxqc3o7IGorKykKLQkJCXsKLQkJCQlpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBHZXRXaWRnZXQocERvY3VtZW50LCBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGopKSkKLQkJCQl7Ci0JCQkJCWlmIChwV2lkZ2V0LT5HZXRCb3JkZXJTdHlsZSgpICE9IG5Cb3JkZXJTdHlsZSkKLQkJCQkJewotCQkJCQkJcFdpZGdldC0+U2V0Qm9yZGVyU3R5bGUobkJvcmRlclN0eWxlKTsKLQkJCQkJCWJTZXQgPSBUUlVFOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGJTZXQpIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIFRSVUUsIFRSVUUpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYobkNvbnRyb2xJbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpIHJldHVybjsKLQkJCWlmIChDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG5Db250cm9sSW5kZXgpKQotCQkJewotCQkJCWlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IEdldFdpZGdldChwRG9jdW1lbnQsIHBGb3JtQ29udHJvbCkpCi0JCQkJewotCQkJCQlpZiAocFdpZGdldC0+R2V0Qm9yZGVyU3R5bGUoKSAhPSBuQm9yZGVyU3R5bGUpCi0JCQkJCXsKLQkJCQkJCXBXaWRnZXQtPlNldEJvcmRlclN0eWxlKG5Cb3JkZXJTdHlsZSk7Ci0JCQkJCQlVcGRhdGVGb3JtQ29udHJvbChwRG9jdW1lbnQsIHBGb3JtQ29udHJvbCwgVFJVRSwgVFJVRSwgVFJVRSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9CisgICAgICBHZXRGb3JtRmllbGRzKHBEb2N1bWVudCwgc3dGaWVsZE5hbWUpOworICBmb3IgKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkIDogRmllbGRBcnJheSkgeworICAgIGlmIChuQ29udHJvbEluZGV4IDwgMCkgeworICAgICAgRlhfQk9PTCBiU2V0ID0gRkFMU0U7CisgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGkgPCBzejsgKytpKSB7CisgICAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9CisgICAgICAgICAgICAgICAgR2V0V2lkZ2V0KHBEb2N1bWVudCwgcEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKSkpIHsKKyAgICAgICAgICBpZiAocFdpZGdldC0+R2V0Qm9yZGVyU3R5bGUoKSAhPSBuQm9yZGVyU3R5bGUpIHsKKyAgICAgICAgICAgIHBXaWRnZXQtPlNldEJvcmRlclN0eWxlKG5Cb3JkZXJTdHlsZSk7CisgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChiU2V0KQorICAgICAgICBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBUUlVFLCBUUlVFKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKG5Db250cm9sSW5kZXggPj0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKQorICAgICAgICByZXR1cm47CisgICAgICBpZiAoQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0KKyAgICAgICAgICAgICAgcEZvcm1GaWVsZC0+R2V0Q29udHJvbChuQ29udHJvbEluZGV4KSkgeworICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBHZXRXaWRnZXQocERvY3VtZW50LCBwRm9ybUNvbnRyb2wpKSB7CisgICAgICAgICAgaWYgKHBXaWRnZXQtPkdldEJvcmRlclN0eWxlKCkgIT0gbkJvcmRlclN0eWxlKSB7CisgICAgICAgICAgICBwV2lkZ2V0LT5TZXRCb3JkZXJTdHlsZShuQm9yZGVyU3R5bGUpOworICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIFRSVUUsIFRSVUUsIFRSVUUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQogfQogCi1GWF9CT09MIEZpZWxkOjpidXR0b25BbGlnblgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQotCWlmICh2cC5Jc1NldHRpbmcoKSkKLQl7Ci0JCWlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CitGWF9CT09MIEZpZWxkOjpidXR0b25BbGlnblgoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50KTsKIAotCQlpbnQgblZQOwotCQl2cCA+PiBuVlA7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCWlmIChtX2JEZWxheSkKLQkJewotCQkJQWRkRGVsYXlfSW50KEZQX0JVVFRPTkFMSUdOWCwgblZQKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUZpZWxkOjpTZXRCdXR0b25BbGlnblgobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBuVlApOwotCQl9Ci0JfQotCWVsc2UKLQl7CQkKLQkJQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0JCUdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0JCWlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgaW50IG5WUDsKKyAgICB2cCA+PiBuVlA7CiAKLQkJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotCQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKyAgICBpZiAobV9iRGVsYXkpIHsKKyAgICAgIEFkZERlbGF5X0ludChGUF9CVVRUT05BTElHTlgsIG5WUCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXRCdXR0b25BbGlnblgobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuVlApOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCWlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLQkJCXJldHVybiBGQUxTRTsKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCUNQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotCQlpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gRkFMU0U7CisgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7CisgICAgaWYgKCFwRm9ybUNvbnRyb2wpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJQ1BERl9JY29uRml0IEljb25GaXQgPSBwRm9ybUNvbnRyb2wtPkdldEljb25GaXQoKTsKKyAgICBDUERGX0ljb25GaXQgSWNvbkZpdCA9IHBGb3JtQ29udHJvbC0+R2V0SWNvbkZpdCgpOwogCi0JCUZYX0ZMT0FUIGZMZWZ0LGZCb3R0b207Ci0JCUljb25GaXQuR2V0SWNvblBvc2l0aW9uKGZMZWZ0LGZCb3R0b20pOworICAgIEZYX0ZMT0FUIGZMZWZ0LCBmQm90dG9tOworICAgIEljb25GaXQuR2V0SWNvblBvc2l0aW9uKGZMZWZ0LCBmQm90dG9tKTsKIAotCQl2cCA8PCAoRlhfSU5UMzIpZkxlZnQ7Ci0JfQorICAgIHZwIDw8IChpbnQzMl90KWZMZWZ0OworICB9CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLXZvaWQgRmllbGQ6OlNldEJ1dHRvbkFsaWduWChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpCi17Ci0JLy9Ob3Qgc3VwcG9ydGVkLgordm9pZCBGaWVsZDo6U2V0QnV0dG9uQWxpZ25YKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcikgeworICAvLyBOb3Qgc3VwcG9ydGVkLgogfQogCi1GWF9CT09MIEZpZWxkOjpidXR0b25BbGlnblkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgRmllbGQ6OmJ1dHRvbkFsaWduWShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQpOwogCi0JaWYgKHZwLklzU2V0dGluZygpKQotCXsKLQkJaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKLQotCQlpbnQgblZQOwotCQl2cCA+PiBuVlA7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCWlmIChtX2JEZWxheSkKLQkJewotCQkJQWRkRGVsYXlfSW50KEZQX0JVVFRPTkFMSUdOWSwgblZQKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUZpZWxkOjpTZXRCdXR0b25BbGlnblkobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBuVlApOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotCQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgIGludCBuVlA7CisgICAgdnAgPj4gblZQOwogCi0JCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLQkJQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisgICAgaWYgKG1fYkRlbGF5KSB7CisgICAgICBBZGREZWxheV9JbnQoRlBfQlVUVE9OQUxJR05ZLCBuVlApOworICAgIH0gZWxzZSB7CisgICAgICBGaWVsZDo6U2V0QnV0dG9uQWxpZ25ZKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblZQKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgICAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1BVU0hCVVRUT04pCi0JCQlyZXR1cm4gRkFMU0U7CisgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLQkJaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIEZBTFNFOworICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOworICAgIGlmICghcEZvcm1Db250cm9sKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCUNQREZfSWNvbkZpdCBJY29uRml0ID0gcEZvcm1Db250cm9sLT5HZXRJY29uRml0KCk7CisgICAgQ1BERl9JY29uRml0IEljb25GaXQgPSBwRm9ybUNvbnRyb2wtPkdldEljb25GaXQoKTsKIAotCQlGWF9GTE9BVCBmTGVmdCxmQm90dG9tOwotCQlJY29uRml0LkdldEljb25Qb3NpdGlvbihmTGVmdCxmQm90dG9tKTsKKyAgICBGWF9GTE9BVCBmTGVmdCwgZkJvdHRvbTsKKyAgICBJY29uRml0LkdldEljb25Qb3NpdGlvbihmTGVmdCwgZkJvdHRvbSk7CiAKLQkJdnAgPDwgIChGWF9JTlQzMilmQm90dG9tOwotCX0KKyAgICB2cCA8PCAoaW50MzJfdClmQm90dG9tOworICB9CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLXZvaWQgRmllbGQ6OlNldEJ1dHRvbkFsaWduWShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpCi17Ci0JLy9Ob3Qgc3VwcG9ydGVkLgordm9pZCBGaWVsZDo6U2V0QnV0dG9uQWxpZ25ZKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcikgeworICAvLyBOb3Qgc3VwcG9ydGVkLgogfQogCi1GWF9CT09MIEZpZWxkOjpidXR0b25GaXRCb3VuZHMoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgRmllbGQ6OmJ1dHRvbkZpdEJvdW5kcyhJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQpOwogCi0JaWYgKHZwLklzU2V0dGluZygpKQotCXsKLQkJaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJYm9vbCBiVlA7Ci0JCXZwID4+IGJWUDsKKyAgICBib29sIGJWUDsKKyAgICB2cCA+PiBiVlA7CiAKLQkJaWYgKG1fYkRlbGF5KQotCQl7Ci0JCQlBZGREZWxheV9Cb29sKEZQX0JVVFRPTkZJVEJPVU5EUywgYlZQKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUZpZWxkOjpTZXRCdXR0b25GaXRCb3VuZHMobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBiVlApOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotCQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0JCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLQkJQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisgICAgaWYgKG1fYkRlbGF5KSB7CisgICAgICBBZGREZWxheV9Cb29sKEZQX0JVVFRPTkZJVEJPVU5EUywgYlZQKTsKKyAgICB9IGVsc2UgeworICAgICAgRmllbGQ6OlNldEJ1dHRvbkZpdEJvdW5kcyhtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWUCk7CisgICAgfQorICB9IGVsc2UgeworICAgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICAgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotCQkJcmV0dXJuIEZBTFNFOworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1BVU0hCVVRUT04pCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0JCWlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKKyAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKKyAgICBpZiAoIXBGb3JtQ29udHJvbCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlDUERGX0ljb25GaXQgSWNvbkZpdCA9IHBGb3JtQ29udHJvbC0+R2V0SWNvbkZpdCgpOwotCQl2cCA8PCBJY29uRml0LkdldEZpdHRpbmdCb3VuZHMoKTsJCQotCX0KKyAgICBDUERGX0ljb25GaXQgSWNvbkZpdCA9IHBGb3JtQ29udHJvbC0+R2V0SWNvbkZpdCgpOworICAgIHZwIDw8IEljb25GaXQuR2V0Rml0dGluZ0JvdW5kcygpOworICB9CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLXZvaWQgRmllbGQ6OlNldEJ1dHRvbkZpdEJvdW5kcyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGJvb2wgYikKLXsKLQkvL05vdCBzdXBwb3J0ZWQuCit2b2lkIEZpZWxkOjpTZXRCdXR0b25GaXRCb3VuZHMoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGIpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6YnV0dG9uUG9zaXRpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgRmllbGQ6OmJ1dHRvblBvc2l0aW9uKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQpOwogCi0JaWYgKHZwLklzU2V0dGluZygpKQotCXsKLQkJaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJaW50IG5WUDsKLQkJdnAgPj4gblZQOwotCi0JCWlmIChtX2JEZWxheSkKLQkJewotCQkJQWRkRGVsYXlfSW50KEZQX0JVVFRPTlBPU0lUSU9OLCBuVlApOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJRmllbGQ6OlNldEJ1dHRvblBvc2l0aW9uKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgblZQKTsKLQkJfQotCX0KLQllbHNlCi0JewotCQlDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLQkJR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLQkJaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICBpbnQgblZQOworICAgIHZwID4+IG5WUDsKIAotCQlDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0JCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfSW50KEZQX0JVVFRPTlBPU0lUSU9OLCBuVlApOworICAgIH0gZWxzZSB7CisgICAgICBGaWVsZDo6U2V0QnV0dG9uUG9zaXRpb24obV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5WUCk7CisgICAgfQorICB9IGVsc2UgeworICAgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICAgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotCQkJcmV0dXJuIEZBTFNFOworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1BVU0hCVVRUT04pCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0JCWlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKKyAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKKyAgICBpZiAoIXBGb3JtQ29udHJvbCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQl2cCA8PCAgcEZvcm1Db250cm9sLT5HZXRUZXh0UG9zaXRpb24oKTsKLQl9Ci0JcmV0dXJuIFRSVUU7CisgICAgdnAgPDwgcEZvcm1Db250cm9sLT5HZXRUZXh0UG9zaXRpb24oKTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBGaWVsZDo6U2V0QnV0dG9uUG9zaXRpb24oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBpbnQgbnVtYmVyKQotewotCS8vTm90IHN1cHBvcnRlZC4KK3ZvaWQgRmllbGQ6OlNldEJ1dHRvblBvc2l0aW9uKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcikgeworICAvLyBOb3Qgc3VwcG9ydGVkLgogfQogCi1GWF9CT09MIEZpZWxkOjpidXR0b25TY2FsZUhvdyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworRlhfQk9PTCBGaWVsZDo6YnV0dG9uU2NhbGVIb3coSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCk7CiAKLQlpZiAodnAuSXNTZXR0aW5nKCkpCi0JewotCQlpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlpbnQgblZQOwotCQl2cCA+PiBuVlA7CisgICAgaW50IG5WUDsKKyAgICB2cCA+PiBuVlA7CiAKLQkJaWYgKG1fYkRlbGF5KQotCQl7Ci0JCQlBZGREZWxheV9JbnQoRlBfQlVUVE9OU0NBTEVIT1csIG5WUCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlGaWVsZDo6U2V0QnV0dG9uU2NhbGVIb3cobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBuVlApOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKLQkJaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAobV9iRGVsYXkpIHsKKyAgICAgIEFkZERlbGF5X0ludChGUF9CVVRUT05TQ0FMRUhPVywgblZQKTsKKyAgICB9IGVsc2UgeworICAgICAgRmllbGQ6OlNldEJ1dHRvblNjYWxlSG93KG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuVlApOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLQkJQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLQkJaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotCQkJcmV0dXJuIEZBTFNFOworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1BVU0hCVVRUT04pCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0JCWlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKKyAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKKyAgICBpZiAoIXBGb3JtQ29udHJvbCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlDUERGX0ljb25GaXQgSWNvbkZpdCA9IHBGb3JtQ29udHJvbC0+R2V0SWNvbkZpdCgpOwotCQlpZiAoSWNvbkZpdC5Jc1Byb3BvcnRpb25hbFNjYWxlKCkpCi0JCQl2cCA8PCAoRlhfSU5UMzIpMDsKLQkJZWxzZQotCQkJdnAgPDwgKEZYX0lOVDMyKTE7Ci0JfQorICAgIENQREZfSWNvbkZpdCBJY29uRml0ID0gcEZvcm1Db250cm9sLT5HZXRJY29uRml0KCk7CisgICAgaWYgKEljb25GaXQuSXNQcm9wb3J0aW9uYWxTY2FsZSgpKQorICAgICAgdnAgPDwgKGludDMyX3QpMDsKKyAgICBlbHNlCisgICAgICB2cCA8PCAoaW50MzJfdCkxOworICB9CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLXZvaWQgRmllbGQ6OlNldEJ1dHRvblNjYWxlSG93KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgaW50IG51bWJlcikKLXsKLQkvL05vdCBzdXBwb3J0ZWQuCit2b2lkIEZpZWxkOjpTZXRCdXR0b25TY2FsZUhvdyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6YnV0dG9uU2NhbGVXaGVuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIEZpZWxkOjpidXR0b25TY2FsZVdoZW4oSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50KTsKIAotCWlmICh2cC5Jc1NldHRpbmcoKSkKLQl7Ci0JCWlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCWludCBuVlA7Ci0JCXZwID4+IG5WUDsKLQotCQlpZiAobV9iRGVsYXkpCi0JCXsKLQkJCUFkZERlbGF5X0ludChGUF9CVVRUT05TQ0FMRVdIRU4sIG5WUCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlGaWVsZDo6U2V0QnV0dG9uU2NhbGVXaGVuKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgblZQKTsKLQkJfQotCX0KLQllbHNlCi0JewotCQlDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLQkJR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLQkJaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICBpbnQgblZQOworICAgIHZwID4+IG5WUDsKIAotCQlDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopIEZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotCQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKyAgICBpZiAobV9iRGVsYXkpIHsKKyAgICAgIEFkZERlbGF5X0ludChGUF9CVVRUT05TQ0FMRVdIRU4sIG5WUCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXRCdXR0b25TY2FsZVdoZW4obV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuVlApOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCWlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLQkJCXJldHVybiBGQUxTRTsKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCUNQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotCQlpZiAoIXBGb3JtQ29udHJvbCkgcmV0dXJuIEZBTFNFOworICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOworICAgIGlmICghcEZvcm1Db250cm9sKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCUNQREZfSWNvbkZpdCBJY29uRml0ID0gcEZvcm1Db250cm9sLT5HZXRJY29uRml0KCk7Ci0JCWludCBTY2FsZU0gPSBJY29uRml0LkdldFNjYWxlTWV0aG9kKCk7Ci0JCXN3aXRjaCAoU2NhbGVNKQotCQl7Ci0JCQljYXNlIENQREZfSWNvbkZpdDo6QWx3YXlzIDoKLQkJCQl2cCA8PCAgKEZYX0lOVDMyKSBDUERGX0ljb25GaXQ6OkFsd2F5czsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ1BERl9JY29uRml0OjpCaWdnZXIgOgotCQkJCXZwIDw8ICAoRlhfSU5UMzIpIENQREZfSWNvbkZpdDo6QmlnZ2VyOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDUERGX0ljb25GaXQ6Ok5ldmVyIDoKLQkJCQl2cCA8PCAgKEZYX0lOVDMyKSBDUERGX0ljb25GaXQ6Ok5ldmVyOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDUERGX0ljb25GaXQ6OlNtYWxsZXIgOgotCQkJCXZwIDw8ICAoRlhfSU5UMzIpIENQREZfSWNvbkZpdDo6U21hbGxlcjsKLQkJCQlicmVhazsKLQkJfQotCX0KKyAgICBDUERGX0ljb25GaXQgSWNvbkZpdCA9IHBGb3JtQ29udHJvbC0+R2V0SWNvbkZpdCgpOworICAgIGludCBTY2FsZU0gPSBJY29uRml0LkdldFNjYWxlTWV0aG9kKCk7CisgICAgc3dpdGNoIChTY2FsZU0pIHsKKyAgICAgIGNhc2UgQ1BERl9JY29uRml0OjpBbHdheXM6CisgICAgICAgIHZwIDw8IChpbnQzMl90KUNQREZfSWNvbkZpdDo6QWx3YXlzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ1BERl9JY29uRml0OjpCaWdnZXI6CisgICAgICAgIHZwIDw8IChpbnQzMl90KUNQREZfSWNvbkZpdDo6QmlnZ2VyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ1BERl9JY29uRml0OjpOZXZlcjoKKyAgICAgICAgdnAgPDwgKGludDMyX3QpQ1BERl9JY29uRml0OjpOZXZlcjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENQREZfSWNvbkZpdDo6U21hbGxlcjoKKyAgICAgICAgdnAgPDwgKGludDMyX3QpQ1BERl9JY29uRml0OjpTbWFsbGVyOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBGaWVsZDo6U2V0QnV0dG9uU2NhbGVXaGVuKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgaW50IG51bWJlcikKLXsKLQkvL05vdCBzdXBwb3J0ZWQuCit2b2lkIEZpZWxkOjpTZXRCdXR0b25TY2FsZVdoZW4oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyKSB7CisgIC8vIE5vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OmNhbGNPcmRlckluZGV4KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIEZpZWxkOjpjYWxjT3JkZXJJbmRleChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50KTsKIAotCWlmICh2cC5Jc1NldHRpbmcoKSkKLQl7CQotCQlpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwotCi0JCWludCBuVlA7Ci0JCXZwID4+IG5WUDsKLQotCQlpZiAobV9iRGVsYXkpCi0JCXsKLQkJCUFkZERlbGF5X0ludChGUF9DQUxDT1JERVJJTkRFWCwgblZQKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUZpZWxkOjpTZXRDYWxjT3JkZXJJbmRleChtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIG5WUCk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0JCUdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotCQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0JCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLQkJQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCWlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ09NQk9CT1ggJiYgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKLQkJCXJldHVybiBGQUxTRTsKKyAgICBpbnQgblZQOworICAgIHZwID4+IG5WUDsKIAotCQlDUERGU0RLX0ludGVyRm9ybSogcFJESW50ZXJGb3JtID0gbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwotCQlBU1NFUlQocFJESW50ZXJGb3JtICE9IE5VTEwpOworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfSW50KEZQX0NBTENPUkRFUklOREVYLCBuVlApOworICAgIH0gZWxzZSB7CisgICAgICBGaWVsZDo6U2V0Q2FsY09yZGVySW5kZXgobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5WUCk7CisgICAgfQorICB9IGVsc2UgeworICAgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICAgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJQ1BERl9JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBwUkRJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOwotCQlBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9DT01CT0JPWCAmJgorICAgICAgICBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfVEVYVEZJRUxEKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQogCi0JCXZwIDw8IChGWF9JTlQzMilwSW50ZXJGb3JtLT5GaW5kRmllbGRJbkNhbGN1bGF0aW9uT3JkZXIocEZvcm1GaWVsZCk7Ci0JfQorICAgIENQREZTREtfSW50ZXJGb3JtKiBwUkRJbnRlckZvcm0gPSBtX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CisgICAgQ1BERl9JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBwUkRJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOworICAgIHZwIDw8IChpbnQzMl90KXBJbnRlckZvcm0tPkZpbmRGaWVsZEluQ2FsY3VsYXRpb25PcmRlcihwRm9ybUZpZWxkKTsKKyAgfQogCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi12b2lkIEZpZWxkOjpTZXRDYWxjT3JkZXJJbmRleChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpCi17Ci0JLy9Ob3Qgc3VwcG9ydGVkLgordm9pZCBGaWVsZDo6U2V0Q2FsY09yZGVySW5kZXgoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyKSB7CisgIC8vIE5vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OmNoYXJMaW1pdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworRlhfQk9PTCBGaWVsZDo6Y2hhckxpbWl0KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCk7CiAKLQlpZiAodnAuSXNTZXR0aW5nKCkpCi0JewotCQlpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlpbnQgblZQOwotCQl2cCA+PiBuVlA7CisgICAgaW50IG5WUDsKKyAgICB2cCA+PiBuVlA7CiAKLQkJaWYgKG1fYkRlbGF5KQotCQl7Ci0JCQlBZGREZWxheV9JbnQoRlBfQ0hBUkxJTUlULCBuVlApOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJRmllbGQ6OlNldENoYXJMaW1pdChtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIG5WUCk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0JCUdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotCQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfSW50KEZQX0NIQVJMSU1JVCwgblZQKTsKKyAgICB9IGVsc2UgeworICAgICAgRmllbGQ6OlNldENoYXJMaW1pdChtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIG5WUCk7CisgICAgfQorICB9IGVsc2UgeworICAgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICAgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotCQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCi0JCQlyZXR1cm4gRkFMU0U7Ci0KLQkJdnAgPDwgKEZYX0lOVDMyKXBGb3JtRmllbGQtPkdldE1heExlbigpOwotCX0KLQlyZXR1cm4gVFJVRTsKKyAgICB2cCA8PCAoaW50MzJfdClwRm9ybUZpZWxkLT5HZXRNYXhMZW4oKTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBGaWVsZDo6U2V0Q2hhckxpbWl0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgaW50IG51bWJlcikKLXsKLQkvL05vdCBzdXBwb3J0ZWQuCit2b2lkIEZpZWxkOjpTZXRDaGFyTGltaXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyKSB7CisgIC8vIE5vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OmNvbWIoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgRmllbGQ6OmNvbWIoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQpOwogCi0JaWYgKHZwLklzU2V0dGluZygpKQotCXsKLQkJaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJYm9vbCBiVlA7Ci0JCXZwID4+IGJWUDsKKyAgICBib29sIGJWUDsKKyAgICB2cCA+PiBiVlA7CiAKLQkJaWYgKG1fYkRlbGF5KQotCQl7Ci0JCQlBZGREZWxheV9Cb29sKEZQX0NPTUIsIGJWUCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlGaWVsZDo6U2V0Q29tYihtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIGJWUCk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsJCi0JCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotCQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0JCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLQkJQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisgICAgaWYgKG1fYkRlbGF5KSB7CisgICAgICBBZGREZWxheV9Cb29sKEZQX0NPTUIsIGJWUCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXRDb21iKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgYlZQKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgICAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKLQkJCXJldHVybiBGQUxTRTsKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19DT01CKQotCQkJdnAgPDwgdHJ1ZTsKLQkJZWxzZQotCQkJdnAgPDwgZmFsc2U7Ci0JfQorICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfQ09NQikKKyAgICAgIHZwIDw8IHRydWU7CisgICAgZWxzZQorICAgICAgdnAgPDwgZmFsc2U7CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBGaWVsZDo6U2V0Q29tYihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGJvb2wgYikKLXsKLQkvL05vdCBzdXBwb3J0ZWQuCit2b2lkIEZpZWxkOjpTZXRDb21iKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiKSB7CisgIC8vIE5vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OmNvbW1pdE9uU2VsQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIEZpZWxkOjpjb21taXRPblNlbENoYW5nZShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50KTsKIAotCWlmICh2cC5Jc1NldHRpbmcoKSkKLQl7Ci0JCWlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7Ci0KLQkJYm9vbCBiVlA7Ci0JCXZwID4+IGJWUDsKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJaWYgKG1fYkRlbGF5KQotCQl7Ci0JCQlBZGREZWxheV9Cb29sKEZQX0NPTU1JVE9OU0VMQ0hBTkdFLCBiVlApOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJRmllbGQ6OlNldENvbW1pdE9uU2VsQ2hhbmdlKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgYlZQKTsKLQkJfQotCX0KLQllbHNlCi0JewotCQlDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLQkJR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLQkJaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICBib29sIGJWUDsKKyAgICB2cCA+PiBiVlA7CiAKLQkJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotCQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKyAgICBpZiAobV9iRGVsYXkpIHsKKyAgICAgIEFkZERlbGF5X0Jvb2woRlBfQ09NTUlUT05TRUxDSEFOR0UsIGJWUCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXRDb21taXRPblNlbENoYW5nZShtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZQKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgICAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0NPTUJPQk9YICYmIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9MSVNUQk9YKQotCQkJcmV0dXJuIEZBTFNFOworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0NPTUJPQk9YICYmCisgICAgICAgIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9MSVNUQk9YKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQogCi0JCWlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfQ09NTUlUT05TRUxDSEFOR0UpCi0JCQl2cCA8PCB0cnVlOwotCQllbHNlCi0JCQl2cCA8PCBmYWxzZTsKLQl9CisgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19DT01NSVRPTlNFTENIQU5HRSkKKyAgICAgIHZwIDw8IHRydWU7CisgICAgZWxzZQorICAgICAgdnAgPDwgZmFsc2U7CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBGaWVsZDo6U2V0Q29tbWl0T25TZWxDaGFuZ2UoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBib29sIGIpCi17Ci0JLy9Ob3Qgc3VwcG9ydGVkLgordm9pZCBGaWVsZDo6U2V0Q29tbWl0T25TZWxDaGFuZ2UoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGIpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6Y3VycmVudFZhbHVlSW5kaWNlcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworRlhfQk9PTCBGaWVsZDo6Y3VycmVudFZhbHVlSW5kaWNlcyhJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENKU19SdW50aW1lKiBwUnVudGltZSA9IENKU19SdW50aW1lOjpGcm9tQ29udGV4dChjYyk7CiAKLQlpZiAodnAuSXNTZXR0aW5nKCkpCi0JewotCQlpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlDRlhfRFdvcmRBcnJheSBhcnJheTsKKyAgICBDRlhfRFdvcmRBcnJheSBhcnJheTsKIAotCQlpZiAodnAuR2V0VHlwZSgpID09IFZUX251bWJlcikKLQkJewotCQkJaW50IGlTZWxlY3RpbmcgPSAwOwotCQkJdnAgPj4gaVNlbGVjdGluZzsKLQkJCWFycmF5LkFkZChpU2VsZWN0aW5nKTsKLQkJfQotCQllbHNlIGlmICh2cC5Jc0FycmF5T2JqZWN0KCkpCi0JCXsKLQkJCUNKU19BcnJheSBTZWxBcnJheShtX2lzb2xhdGUpOwotCQkJQ0pTX1ZhbHVlIFNlbFZhbHVlKG1faXNvbGF0ZSk7Ci0JCQlpbnQgaVNlbGVjdGluZzsKLQkJCXZwID4+IFNlbEFycmF5OwotCQkJZm9yIChpbnQgaT0wLHN6PVNlbEFycmF5LkdldExlbmd0aCgpOyBpPHN6OyBpKyspCi0JCQl7Ci0JCQkJU2VsQXJyYXkuR2V0RWxlbWVudChpLFNlbFZhbHVlKTsKLQkJCQlpU2VsZWN0aW5nID0gU2VsVmFsdWUuVG9JbnQoKTsKLQkJCQlhcnJheS5BZGQoaVNlbGVjdGluZyk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChtX2JEZWxheSkKLQkJewotCQkJQWRkRGVsYXlfV29yZEFycmF5KEZQX0NVUlJFTlRWQUxVRUlORElDRVMsIGFycmF5KTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUZpZWxkOjpTZXRDdXJyZW50VmFsdWVJbmRpY2VzKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgYXJyYXkpOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotCQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgIGlmICh2cC5HZXRUeXBlKCkgPT0gQ0pTX1ZhbHVlOjpWVF9udW1iZXIpIHsKKyAgICAgIGludCBpU2VsZWN0aW5nID0gMDsKKyAgICAgIHZwID4+IGlTZWxlY3Rpbmc7CisgICAgICBhcnJheS5BZGQoaVNlbGVjdGluZyk7CisgICAgfSBlbHNlIGlmICh2cC5Jc0FycmF5T2JqZWN0KCkpIHsKKyAgICAgIENKU19BcnJheSBTZWxBcnJheShwUnVudGltZSk7CisgICAgICBDSlNfVmFsdWUgU2VsVmFsdWUocFJ1bnRpbWUpOworICAgICAgaW50IGlTZWxlY3Rpbmc7CisgICAgICB2cCA+PiBTZWxBcnJheTsKKyAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IFNlbEFycmF5LkdldExlbmd0aCgpOyBpIDwgc3o7IGkrKykgeworICAgICAgICBTZWxBcnJheS5HZXRFbGVtZW50KGksIFNlbFZhbHVlKTsKKyAgICAgICAgaVNlbGVjdGluZyA9IFNlbFZhbHVlLlRvSW50KCk7CisgICAgICAgIGFycmF5LkFkZChpU2VsZWN0aW5nKTsKKyAgICAgIH0KKyAgICB9CiAKLQkJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotCQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKyAgICBpZiAobV9iRGVsYXkpIHsKKyAgICAgIEFkZERlbGF5X1dvcmRBcnJheShGUF9DVVJSRU5UVkFMVUVJTkRJQ0VTLCBhcnJheSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXRDdXJyZW50VmFsdWVJbmRpY2VzKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbkZvcm1Db250cm9sSW5kZXgsIGFycmF5KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgICAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0NPTUJPQk9YICYmIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9MSVNUQk9YKQotCQkJcmV0dXJuIEZBTFNFOworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0NPTUJPQk9YICYmCisgICAgICAgIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9MSVNUQk9YKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQogCi0JCWlmIChwRm9ybUZpZWxkLT5Db3VudFNlbGVjdGVkSXRlbXMoKSA9PSAxKQotCQkJdnAgPDwgcEZvcm1GaWVsZC0+R2V0U2VsZWN0ZWRJbmRleCgwKTsKLQkJZWxzZSBpZiAocEZvcm1GaWVsZC0+Q291bnRTZWxlY3RlZEl0ZW1zKCkgPiAxKQotCQl7Ci0JCQlDSlNfQXJyYXkgU2VsQXJyYXkobV9pc29sYXRlKTsKLQkJCWZvciAoaW50IGk9MCxzej1wRm9ybUZpZWxkLT5Db3VudFNlbGVjdGVkSXRlbXMoKTsgaTxzejsgaSsrKQotCQkJewotCQkJCVNlbEFycmF5LlNldEVsZW1lbnQoaSwgQ0pTX1ZhbHVlKG1faXNvbGF0ZSxwRm9ybUZpZWxkLT5HZXRTZWxlY3RlZEluZGV4KGkpKSk7Ci0JCQl9Ci0JCQl2cCA8PCBTZWxBcnJheTsKLQkJfQotCQllbHNlCi0JCQl2cCA8PCAtMTsKLQl9CisgICAgaWYgKHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpID09IDEpIHsKKyAgICAgIHZwIDw8IHBGb3JtRmllbGQtPkdldFNlbGVjdGVkSW5kZXgoMCk7CisgICAgfSBlbHNlIGlmIChwRm9ybUZpZWxkLT5Db3VudFNlbGVjdGVkSXRlbXMoKSA+IDEpIHsKKyAgICAgIENKU19BcnJheSBTZWxBcnJheShwUnVudGltZSk7CisgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudFNlbGVjdGVkSXRlbXMoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgU2VsQXJyYXkuU2V0RWxlbWVudCgKKyAgICAgICAgICAgIGksIENKU19WYWx1ZShwUnVudGltZSwgcEZvcm1GaWVsZC0+R2V0U2VsZWN0ZWRJbmRleChpKSkpOworICAgICAgfQorICAgICAgdnAgPDwgU2VsQXJyYXk7CisgICAgfSBlbHNlIHsKKyAgICAgIHZwIDw8IC0xOworICAgIH0KKyAgfQogCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi12b2lkIEZpZWxkOjpTZXRDdXJyZW50VmFsdWVJbmRpY2VzKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgCi0JCQkJCQkJCSAgIGNvbnN0IENGWF9EV29yZEFycmF5JiBhcnJheSkKLXsKLQlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwordm9pZCBGaWVsZDo6U2V0Q3VycmVudFZhbHVlSW5kaWNlcyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9EV29yZEFycmF5JiBhcnJheSkgeworICBBU1NFUlQocERvY3VtZW50KTsKIAotCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCUdldEZvcm1GaWVsZHMocERvY3VtZW50LCBzd0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0KLQlmb3IgKGludCBpPTAsaXN6PUZpZWxkQXJyYXkuR2V0U2l6ZSgpOyBpPGlzejsgaSsrKQotCXsKLQkJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KGkpOwotCQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotCQlpbnQgbkZpZWxkVHlwZSA9IHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpOwotCQlpZiAobkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1ggfHwgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfTElTVEJPWCkKLQkJewotCQkJRlhfRFdPUkQgZHdGaWVsZEZsYWdzID0gcEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpOwotCQkJcEZvcm1GaWVsZC0+Q2xlYXJTZWxlY3Rpb24oVFJVRSk7Ci0KLQkJCWZvciAoaW50IGk9MCxzej1hcnJheS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQkJCXsKLQkJCQlpZiAoaT4wICYmICEoZHdGaWVsZEZsYWdzICYgKDE8PDIxKSkpCi0JCQkJewotCQkJCQlicmVhazsKLQkJCQl9CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9CisgICAgICBHZXRGb3JtRmllbGRzKHBEb2N1bWVudCwgc3dGaWVsZE5hbWUpOworICBmb3IgKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkIDogRmllbGRBcnJheSkgeworICAgIGludCBuRmllbGRUeXBlID0gcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCk7CisgICAgaWYgKG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX0NPTUJPQk9YIHx8IG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX0xJU1RCT1gpIHsKKyAgICAgIEZYX0RXT1JEIGR3RmllbGRGbGFncyA9IHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKTsKKyAgICAgIHBGb3JtRmllbGQtPkNsZWFyU2VsZWN0aW9uKFRSVUUpOwogCi0JCQkJaW50IGlTZWxlY3RpbmcgPSAoRlhfSU5UMzIpYXJyYXkuR2V0QXQoaSk7Ci0JCQkJaWYgKGlTZWxlY3RpbmcgPCBwRm9ybUZpZWxkLT5Db3VudE9wdGlvbnMoKSAmJiAhcEZvcm1GaWVsZC0+SXNJdGVtU2VsZWN0ZWQoaVNlbGVjdGluZykpCi0JCQkJCXBGb3JtRmllbGQtPlNldEl0ZW1TZWxlY3Rpb24oaVNlbGVjdGluZywgVFJVRSk7CisgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBhcnJheS5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICAgIGlmIChpID4gMCAmJiAhKGR3RmllbGRGbGFncyAmICgxIDw8IDIxKSkpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JCQl9Ci0JCQlVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBUUlVFLCBUUlVFKTsKLQkJfQotCX0KKyAgICAgICAgaW50IGlTZWxlY3RpbmcgPSAoaW50MzJfdClhcnJheS5HZXRBdChpKTsKKyAgICAgICAgaWYgKGlTZWxlY3RpbmcgPCBwRm9ybUZpZWxkLT5Db3VudE9wdGlvbnMoKSAmJgorICAgICAgICAgICAgIXBGb3JtRmllbGQtPklzSXRlbVNlbGVjdGVkKGlTZWxlY3RpbmcpKQorICAgICAgICAgIHBGb3JtRmllbGQtPlNldEl0ZW1TZWxlY3Rpb24oaVNlbGVjdGluZywgVFJVRSk7CisgICAgICB9CisgICAgICBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBUUlVFLCBUUlVFKTsKKyAgICB9CisgIH0KIH0KIAotRlhfQk9PTCBGaWVsZDo6ZGVmYXVsdFN0eWxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQkvLyBNUUcgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19OT1RTVVBQT1JUKTsKLQlyZXR1cm4gRkFMU0U7Ci0KLQlpZiAodnAuSXNTZXR0aW5nKCkpCi0JewotCQlpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwotCi0JCTsJCQotCX0KLQllbHNlCi0JewotCQk7Ci0JfQotCXJldHVybiBUUlVFOworRlhfQk9PTCBGaWVsZDo6ZGVmYXVsdFN0eWxlKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBGQUxTRTsKIH0KIAotdm9pZCBGaWVsZDo6U2V0RGVmYXVsdFN0eWxlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCkKLXsKLQkvL05vdCBzdXBwb3J0ZWQuCit2b2lkIEZpZWxkOjpTZXREZWZhdWx0U3R5bGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCkgeworICAvLyBOb3Qgc3VwcG9ydGVkLgogfQogCi1GWF9CT09MIEZpZWxkOjpkZWZhdWx0VmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgRmllbGQ6OmRlZmF1bHRWYWx1ZShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQpOwogCi0JaWYgKHZwLklzU2V0dGluZygpKQotCXsKLQkJaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJQ0ZYX1dpZGVTdHJpbmcgV2lkZVN0cjsKLQkJdnAgPj4gV2lkZVN0cjsgCisgICAgQ0ZYX1dpZGVTdHJpbmcgV2lkZVN0cjsKKyAgICB2cCA+PiBXaWRlU3RyOwogCi0JCWlmIChtX2JEZWxheSkKLQkJewotCQkJQWRkRGVsYXlfV2lkZVN0cmluZyhGUF9ERUZBVUxUVkFMVUUsIFdpZGVTdHIpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJRmllbGQ6OlNldERlZmF1bHRWYWx1ZShtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIFdpZGVTdHIpOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotCQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfV2lkZVN0cmluZyhGUF9ERUZBVUxUVkFMVUUsIFdpZGVTdHIpOworICAgIH0gZWxzZSB7CisgICAgICBGaWVsZDo6U2V0RGVmYXVsdFZhbHVlKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZVN0cik7CisgICAgfQorICB9IGVsc2UgeworICAgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICAgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotCQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotCQlpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1BVU0hCVVRUT04gfHwgCi0JCQlwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfU0lHTkFUVVJFKQotCQkJcmV0dXJuIEZBTFNFOworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1BVU0hCVVRUT04gfHwKKyAgICAgICAgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1NJR05BVFVSRSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KIAotCQl2cCA8PCBwRm9ybUZpZWxkLT5HZXREZWZhdWx0VmFsdWUoKTsKLQl9Ci0JcmV0dXJuIFRSVUU7CisgICAgdnAgPDwgcEZvcm1GaWVsZC0+R2V0RGVmYXVsdFZhbHVlKCk7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CiAKLXZvaWQgRmllbGQ6OlNldERlZmF1bHRWYWx1ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsCi0JCQkJCQkJY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZykKLXsKLQkvL05vdCBzdXBwb3J0ZWQuCit2b2lkIEZpZWxkOjpTZXREZWZhdWx0VmFsdWUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nKSB7CisgIC8vIE5vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OmRvTm90U2Nyb2xsKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIEZpZWxkOjpkb05vdFNjcm9sbChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50KTsKIAotCWlmICh2cC5Jc1NldHRpbmcoKSkKLQl7Ci0JCWlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCWJvb2wgYlZQOwotCQl2cCA+PiBiVlA7CisgICAgYm9vbCBiVlA7CisgICAgdnAgPj4gYlZQOwogCi0JCWlmIChtX2JEZWxheSkKLQkJewotCQkJQWRkRGVsYXlfQm9vbChGUF9ET05PVFNDUk9MTCwgYlZQKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUZpZWxkOjpTZXREb05vdFNjcm9sbChtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIGJWUCk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0JCUdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0JCWlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7Ci0KLQkJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotCQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKyAgICBpZiAobV9iRGVsYXkpIHsKKyAgICAgIEFkZERlbGF5X0Jvb2woRlBfRE9OT1RTQ1JPTEwsIGJWUCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXREb05vdFNjcm9sbChtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIGJWUCk7CisgICAgfQorICB9IGVsc2UgeworICAgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICAgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCi0JCQlyZXR1cm4gRkFMU0U7CisgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfVEVYVEZJRUxEKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCWlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfRE9OT1RTQ1JPTEwpCi0JCQl2cCA8PCB0cnVlOwotCQllbHNlCi0JCQl2cCA8PCBmYWxzZTsKLQl9CisgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19ET05PVFNDUk9MTCkKKyAgICAgIHZwIDw8IHRydWU7CisgICAgZWxzZQorICAgICAgdnAgPDwgZmFsc2U7CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBGaWVsZDo6U2V0RG9Ob3RTY3JvbGwoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBib29sIGIpCi17Ci0JLy9Ob3Qgc3VwcG9ydGVkLgordm9pZCBGaWVsZDo6U2V0RG9Ob3RTY3JvbGwoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGIpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6ZG9Ob3RTcGVsbENoZWNrKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLQlpZiAodnAuSXNTZXR0aW5nKCkpCi0JewotCQlpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwotCi0JCWJvb2wgYlZQOwotCQl2cCA+PiBiVlA7Ci0JfQotCWVsc2UKLQl7Ci0JCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotCQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0JCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLQkJQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CitGWF9CT09MIEZpZWxkOjpkb05vdFNwZWxsQ2hlY2soSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50KTsKIAotCQlpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCAmJiAKLQkJCXBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9DT01CT0JPWCkKLQkJCXJldHVybiBGQUxTRTsKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19ET05PVFNQRUxMQ0hFQ0spCi0JCQl2cCA8PCB0cnVlOwotCQllbHNlCi0JCQl2cCA8PCBmYWxzZTsKLQl9CisgICAgYm9vbCBiVlA7CisgICAgdnAgPj4gYlZQOworICB9IGVsc2UgeworICAgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICAgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQlyZXR1cm4gVFJVRTsKLX0KKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQgJiYKKyAgICAgICAgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0NPTUJPQk9YKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQogCi12b2lkIEZpZWxkOjpTZXREZWxheShGWF9CT09MIGJEZWxheSkKLXsKLQltX2JEZWxheSA9IGJEZWxheTsKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0RPTk9UU1BFTExDSEVDSykKKyAgICAgIHZwIDw8IHRydWU7CisgICAgZWxzZQorICAgICAgdnAgPDwgZmFsc2U7CisgIH0KIAotCWlmICghbV9iRGVsYXkpCi0JewotCQlpZiAobV9wSlNEb2MpCi0JCQltX3BKU0RvYy0+RG9GaWVsZERlbGF5KG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4KTsKLQl9CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIEZpZWxkOjpkZWxheShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaWYgKHZwLklzU2V0dGluZygpKQotCXsKLQkJaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKLQkJCi0JCWJvb2wgYlZQOwotCQl2cCA+PiBiVlA7Cit2b2lkIEZpZWxkOjpTZXREZWxheShGWF9CT09MIGJEZWxheSkgeworICBtX2JEZWxheSA9IGJEZWxheTsKIAotCQlTZXREZWxheShiVlApOwotCX0KLQllbHNlCi0JewotCQl2cCA8PCBtX2JEZWxheTsKLQl9Ci0JcmV0dXJuIFRSVUU7CisgIGlmICghbV9iRGVsYXkpIHsKKyAgICBpZiAobV9wSlNEb2MpCisgICAgICBtX3BKU0RvYy0+RG9GaWVsZERlbGF5KG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4KTsKKyAgfQogfQogCi1GWF9CT09MIEZpZWxkOjpkaXNwbGF5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIEZpZWxkOjpkZWxheShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQlpZiAodnAuSXNTZXR0aW5nKCkpCi0JewotCQlpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgIGJvb2wgYlZQOworICAgIHZwID4+IGJWUDsKIAotCQlpbnQgblZQOwotCQl2cCA+PiBuVlA7CQorICAgIFNldERlbGF5KGJWUCk7CisgIH0gZWxzZSB7CisgICAgdnAgPDwgbV9iRGVsYXk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CiAKLQkJaWYgKG1fYkRlbGF5KQotCQl7Ci0JCQlBZGREZWxheV9JbnQoRlBfRElTUExBWSwgblZQKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUZpZWxkOjpTZXREaXNwbGF5KG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgblZQKTsKLQkJfQotCX0KLQllbHNlCi0JewotCQlDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLQkJR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLQkJaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgRmllbGQ6OmRpc3BsYXkoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0JCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworICAgIGludCBuVlA7CisgICAgdnAgPj4gblZQOwogCi0JCUNQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7Ci0JCUFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfSW50KEZQX0RJU1BMQVksIG5WUCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXREaXNwbGF5KG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgblZQKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgICAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKSk7Ci0JCWlmICghcFdpZGdldClyZXR1cm4gRkFMU0U7CisgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICAgIEFTU0VSVChwRm9ybUZpZWxkKTsKKyAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9CisgICAgICAgIChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOworICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0KKyAgICAgICAgcEludGVyRm9ybS0+R2V0V2lkZ2V0KEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpKTsKKyAgICBpZiAoIXBXaWRnZXQpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJRlhfRFdPUkQgZHdGbGFnID0gcFdpZGdldC0+R2V0RmxhZ3MoKTsKKyAgICBGWF9EV09SRCBkd0ZsYWcgPSBwV2lkZ2V0LT5HZXRGbGFncygpOwogCi0JCWlmIChBTk5PVEZMQUdfSU5WSVNJQkxFICYgZHdGbGFnIHx8IEFOTk9URkxBR19ISURERU4gJiBkd0ZsYWcpIAotCQl7Ci0JCQl2cCA8PCAoRlhfSU5UMzIpMTsKLQkJfQotCQllbHNlIAotCQl7Ci0JCQlpZiAoQU5OT1RGTEFHX1BSSU5UICYgZHdGbGFnKQotCQkJewotCQkJCWlmIChBTk5PVEZMQUdfTk9WSUVXICYgZHdGbGFnKQotCQkJCXsKLQkJCQkJdnAgPDwgKEZYX0lOVDMyKTM7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXZwIDw8IChGWF9JTlQzMikwOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQl2cCA8PCAoRlhfSU5UMzIpMjsKLQkJCX0JCQkJCi0JCX0KLQl9CisgICAgaWYgKEFOTk9URkxBR19JTlZJU0lCTEUgJiBkd0ZsYWcgfHwgQU5OT1RGTEFHX0hJRERFTiAmIGR3RmxhZykgeworICAgICAgdnAgPDwgKGludDMyX3QpMTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKEFOTk9URkxBR19QUklOVCAmIGR3RmxhZykgeworICAgICAgICBpZiAoQU5OT1RGTEFHX05PVklFVyAmIGR3RmxhZykgeworICAgICAgICAgIHZwIDw8IChpbnQzMl90KTM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdnAgPDwgKGludDMyX3QpMDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdnAgPDwgKGludDMyX3QpMjsKKyAgICAgIH0KKyAgICB9CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBGaWVsZDo6U2V0RGlzcGxheShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpCi17Ci0JQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKLQotCUNQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKilwRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwotCUFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwotCi0JQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0JR2V0Rm9ybUZpZWxkcyhwRG9jdW1lbnQsIHN3RmllbGROYW1lLCBGaWVsZEFycmF5KTsKLQotCWZvciAoaW50IGk9MCxpc3o9RmllbGRBcnJheS5HZXRTaXplKCk7IGk8aXN6OyBpKyspCi0JewotCQlDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoaSk7Ci0JCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0JCWlmIChuQ29udHJvbEluZGV4IDwgMCkKLQkJewotCQkJRlhfQk9PTCBiU2V0ID0gRkFMU0U7Ci0JCQlmb3IgKGludCBqPTAsanN6ID0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBqPGpzejsgaisrKQotCQkJewotCQkJCUNQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woaik7Ci0JCQkJQVNTRVJUKHBGb3JtQ29udHJvbCAhPSBOVUxMKTsKK3ZvaWQgRmllbGQ6OlNldERpc3BsYXkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyKSB7CisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKilwRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPQorICAgICAgR2V0Rm9ybUZpZWxkcyhwRG9jdW1lbnQsIHN3RmllbGROYW1lKTsKKyAgZm9yIChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA6IEZpZWxkQXJyYXkpIHsKKyAgICBpZiAobkNvbnRyb2xJbmRleCA8IDApIHsKKyAgICAgIEZYX0JPT0wgYlNldCA9IEZBTFNFOworICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBpIDwgc3o7ICsraSkgeworICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGkpOworICAgICAgICBBU1NFUlQocEZvcm1Db250cm9sKTsKIAotCQkJCWlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpKQotCQkJCXsKLQkJCQkJRlhfRFdPUkQgZHdGbGFnID0gcFdpZGdldC0+R2V0RmxhZ3MoKTsKLQkJCQkJc3dpdGNoIChudW1iZXIpCi0JCQkJCXsKLQkJCQkJY2FzZSAwOgotCQkJCQkJZHdGbGFnICY9ICh+QU5OT1RGTEFHX0lOVklTSUJMRSk7Ci0JCQkJCQlkd0ZsYWcgJj0gKH5BTk5PVEZMQUdfSElEREVOKTsKLQkJCQkJCWR3RmxhZyAmPSAofkFOTk9URkxBR19OT1ZJRVcpOwotCQkJCQkJZHdGbGFnIHw9IEFOTk9URkxBR19QUklOVDsJCQkJCQkJCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAxOgotCQkJCQkJZHdGbGFnICY9ICh+QU5OT1RGTEFHX0lOVklTSUJMRSk7Ci0JCQkJCQlkd0ZsYWcgJj0gKH5BTk5PVEZMQUdfTk9WSUVXKTsKLQkJCQkJCWR3RmxhZyB8PSAoQU5OT1RGTEFHX0hJRERFTiB8IEFOTk9URkxBR19QUklOVCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAyOgotCQkJCQkJZHdGbGFnICY9ICh+QU5OT1RGTEFHX0lOVklTSUJMRSk7Ci0JCQkJCQlkd0ZsYWcgJj0gKH5BTk5PVEZMQUdfUFJJTlQpOwotCQkJCQkJZHdGbGFnICY9ICh+QU5OT1RGTEFHX0hJRERFTik7Ci0JCQkJCQlkd0ZsYWcgJj0gKH5BTk5PVEZMQUdfTk9WSUVXKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDM6Ci0JCQkJCQlkd0ZsYWcgfD0gQU5OT1RGTEFHX05PVklFVzsKLQkJCQkJCWR3RmxhZyB8PSBBTk5PVEZMQUdfUFJJTlQ7Ci0JCQkJCQlkd0ZsYWcgJj0gKH5BTk5PVEZMQUdfSElEREVOKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9CQorICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1Db250cm9sKSkgeworICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZyA9IHBXaWRnZXQtPkdldEZsYWdzKCk7CisgICAgICAgICAgc3dpdGNoIChudW1iZXIpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgZHdGbGFnICY9ICh+QU5OT1RGTEFHX0lOVklTSUJMRSk7CisgICAgICAgICAgICAgIGR3RmxhZyAmPSAofkFOTk9URkxBR19ISURERU4pOworICAgICAgICAgICAgICBkd0ZsYWcgJj0gKH5BTk5PVEZMQUdfTk9WSUVXKTsKKyAgICAgICAgICAgICAgZHdGbGFnIHw9IEFOTk9URkxBR19QUklOVDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgIGR3RmxhZyAmPSAofkFOTk9URkxBR19JTlZJU0lCTEUpOworICAgICAgICAgICAgICBkd0ZsYWcgJj0gKH5BTk5PVEZMQUdfTk9WSUVXKTsKKyAgICAgICAgICAgICAgZHdGbGFnIHw9IChBTk5PVEZMQUdfSElEREVOIHwgQU5OT1RGTEFHX1BSSU5UKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgIGR3RmxhZyAmPSAofkFOTk9URkxBR19JTlZJU0lCTEUpOworICAgICAgICAgICAgICBkd0ZsYWcgJj0gKH5BTk5PVEZMQUdfUFJJTlQpOworICAgICAgICAgICAgICBkd0ZsYWcgJj0gKH5BTk5PVEZMQUdfSElEREVOKTsKKyAgICAgICAgICAgICAgZHdGbGFnICY9ICh+QU5OT1RGTEFHX05PVklFVyk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICBkd0ZsYWcgfD0gQU5OT1RGTEFHX05PVklFVzsKKyAgICAgICAgICAgICAgZHdGbGFnIHw9IEFOTk9URkxBR19QUklOVDsKKyAgICAgICAgICAgICAgZHdGbGFnICY9ICh+QU5OT1RGTEFHX0hJRERFTik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KIAotCQkJCQlpZiAoZHdGbGFnICE9IHBXaWRnZXQtPkdldEZsYWdzKCkpCi0JCQkJCXsKLQkJCQkJCXBXaWRnZXQtPlNldEZsYWdzKGR3RmxhZyk7Ci0JCQkJCQliU2V0ID0gVFJVRTsKLQkJCQkJfQotCQkJCX0KLQkJCX0JCQotCQkJCi0JCQlpZiAoYlNldCkgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgRkFMU0UsIFRSVUUpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYobkNvbnRyb2xJbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpIHJldHVybjsKLQkJCWlmIChDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG5Db250cm9sSW5kZXgpKQotCQkJewotCQkJCWlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpKQotCQkJCXsKKyAgICAgICAgICBpZiAoZHdGbGFnICE9IHBXaWRnZXQtPkdldEZsYWdzKCkpIHsKKyAgICAgICAgICAgIHBXaWRnZXQtPlNldEZsYWdzKGR3RmxhZyk7CisgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KIAotCQkJCQlGWF9EV09SRCBkd0ZsYWcgPSBwV2lkZ2V0LT5HZXRGbGFncygpOwotCQkJCQlzd2l0Y2ggKG51bWJlcikKLQkJCQkJewotCQkJCQljYXNlIDA6Ci0JCQkJCQlkd0ZsYWcgJj0gKH5BTk5PVEZMQUdfSU5WSVNJQkxFKTsKLQkJCQkJCWR3RmxhZyAmPSAofkFOTk9URkxBR19ISURERU4pOwotCQkJCQkJZHdGbGFnICY9ICh+QU5OT1RGTEFHX05PVklFVyk7Ci0JCQkJCQlkd0ZsYWcgfD0gQU5OT1RGTEFHX1BSSU5UOwkJCQkJCQkKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDE6Ci0JCQkJCQlkd0ZsYWcgJj0gKH5BTk5PVEZMQUdfSU5WSVNJQkxFKTsKLQkJCQkJCWR3RmxhZyAmPSAofkFOTk9URkxBR19OT1ZJRVcpOwotCQkJCQkJZHdGbGFnIHw9IChBTk5PVEZMQUdfSElEREVOIHwgQU5OT1RGTEFHX1BSSU5UKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDI6Ci0JCQkJCQlkd0ZsYWcgJj0gKH5BTk5PVEZMQUdfSU5WSVNJQkxFKTsKLQkJCQkJCWR3RmxhZyAmPSAofkFOTk9URkxBR19QUklOVCk7Ci0JCQkJCQlkd0ZsYWcgJj0gKH5BTk5PVEZMQUdfSElEREVOKTsKLQkJCQkJCWR3RmxhZyAmPSAofkFOTk9URkxBR19OT1ZJRVcpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgMzoKLQkJCQkJCWR3RmxhZyB8PSBBTk5PVEZMQUdfTk9WSUVXOwotCQkJCQkJZHdGbGFnIHw9IEFOTk9URkxBR19QUklOVDsKLQkJCQkJCWR3RmxhZyAmPSAofkFOTk9URkxBR19ISURERU4pOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0JCi0JCQkJCWlmIChkd0ZsYWcgIT0gcFdpZGdldC0+R2V0RmxhZ3MoKSkKLQkJCQkJewotCQkJCQkJcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFnKTsKLQkJCQkJCVVwZGF0ZUZvcm1Db250cm9sKHBEb2N1bWVudCwgcEZvcm1Db250cm9sLCBUUlVFLCBGQUxTRSwgVFJVRSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgICAgICBpZiAoYlNldCkKKyAgICAgICAgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgRkFMU0UsIFRSVUUpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAobkNvbnRyb2xJbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCisgICAgICAgIHJldHVybjsKKyAgICAgIGlmIChDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPQorICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG5Db250cm9sSW5kZXgpKSB7CisgICAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpKSB7CisgICAgICAgICAgRlhfRFdPUkQgZHdGbGFnID0gcFdpZGdldC0+R2V0RmxhZ3MoKTsKKyAgICAgICAgICBzd2l0Y2ggKG51bWJlcikgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICBkd0ZsYWcgJj0gKH5BTk5PVEZMQUdfSU5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgZHdGbGFnICY9ICh+QU5OT1RGTEFHX0hJRERFTik7CisgICAgICAgICAgICAgIGR3RmxhZyAmPSAofkFOTk9URkxBR19OT1ZJRVcpOworICAgICAgICAgICAgICBkd0ZsYWcgfD0gQU5OT1RGTEFHX1BSSU5UOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgZHdGbGFnICY9ICh+QU5OT1RGTEFHX0lOVklTSUJMRSk7CisgICAgICAgICAgICAgIGR3RmxhZyAmPSAofkFOTk9URkxBR19OT1ZJRVcpOworICAgICAgICAgICAgICBkd0ZsYWcgfD0gKEFOTk9URkxBR19ISURERU4gfCBBTk5PVEZMQUdfUFJJTlQpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgZHdGbGFnICY9ICh+QU5OT1RGTEFHX0lOVklTSUJMRSk7CisgICAgICAgICAgICAgIGR3RmxhZyAmPSAofkFOTk9URkxBR19QUklOVCk7CisgICAgICAgICAgICAgIGR3RmxhZyAmPSAofkFOTk9URkxBR19ISURERU4pOworICAgICAgICAgICAgICBkd0ZsYWcgJj0gKH5BTk5PVEZMQUdfTk9WSUVXKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgIGR3RmxhZyB8PSBBTk5PVEZMQUdfTk9WSUVXOworICAgICAgICAgICAgICBkd0ZsYWcgfD0gQU5OT1RGTEFHX1BSSU5UOworICAgICAgICAgICAgICBkd0ZsYWcgJj0gKH5BTk5PVEZMQUdfSElEREVOKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChkd0ZsYWcgIT0gcFdpZGdldC0+R2V0RmxhZ3MoKSkgeworICAgICAgICAgICAgcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFnKTsKKyAgICAgICAgICAgIFVwZGF0ZUZvcm1Db250cm9sKHBEb2N1bWVudCwgcEZvcm1Db250cm9sLCBUUlVFLCBGQUxTRSwgVFJVRSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CiB9CiAKLUZYX0JPT0wgRmllbGQ6OmRvYyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaWYgKCF2cC5Jc0dldHRpbmcoKSkgewotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCXZwIDw8IG1fcEpTRG9jLT5HZXRDSlNEb2MoKTsKLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgRmllbGQ6OmRvYyhJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICghdnAuSXNHZXR0aW5nKCkpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgdnAgPDwgbV9wSlNEb2MtPkdldENKU0RvYygpOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6ZWRpdGFibGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQlpZiAodnAuSXNTZXR0aW5nKCkpCi0JewotCQlpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwotCi0JCWJvb2wgYlZQOwotCQl2cCA+PiBiVlA7Ci0JfQotCWVsc2UKLQl7Ci0JCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKLQkJaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgRmllbGQ6OmVkaXRhYmxlKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0JCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworICAgIGJvb2wgYlZQOworICAgIHZwID4+IGJWUDsKKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCWlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ09NQk9CT1gpCi0JCQlyZXR1cm4gRkFMU0U7CisgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ09NQk9CT1gpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19FRElUKQotCQkJdnAgPDwgdHJ1ZTsKLQkJZWxzZQotCQkJdnAgPDwgZmFsc2U7Ci0JfQorICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfRURJVCkKKyAgICAgIHZwIDw8IHRydWU7CisgICAgZWxzZQorICAgICAgdnAgPDwgZmFsc2U7CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6ZXhwb3J0VmFsdWVzKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIEZpZWxkOjpleHBvcnRWYWx1ZXMoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0JR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ0hFQ0tCT1ggJiYKKyAgICAgIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9SQURJT0JVVFRPTikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQogCi0JQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCWlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ0hFQ0tCT1ggJiYgCi0JCXBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9SQURJT0JVVFRPTikKLQkJcmV0dXJuIEZBTFNFOworICAgIGlmICghdnAuSXNBcnJheU9iamVjdCgpKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9IGVsc2UgeworICAgIENKU19SdW50aW1lKiBwUnVudGltZSA9IENKU19SdW50aW1lOjpGcm9tQ29udGV4dChjYyk7CisgICAgQ0pTX0FycmF5IEV4cG9ydFZhbHVzQXJyYXkocFJ1bnRpbWUpOworICAgIGlmIChtX25Gb3JtQ29udHJvbEluZGV4IDwgMCkgeworICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBpIDwgc3o7IGkrKykgeworICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGkpOworICAgICAgICBFeHBvcnRWYWx1c0FycmF5LlNldEVsZW1lbnQoCisgICAgICAgICAgICBpLCBDSlNfVmFsdWUocFJ1bnRpbWUsIHBGb3JtQ29udHJvbC0+R2V0RXhwb3J0VmFsdWUoKS5jX3N0cigpKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtX25Gb3JtQ29udHJvbEluZGV4ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCi0JaWYgKHZwLklzU2V0dGluZygpKQotCXsJCi0JCWlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7Ci0JCWlmICghdnAuSXNBcnJheU9iamVjdCgpKXJldHVybiBGQUxTRTsKLQl9Ci0JZWxzZQotCXsKLQkJQ0pTX0FycmF5IEV4cG9ydFZhbHVzQXJyYXkobV9pc29sYXRlKTsKKyAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9CisgICAgICAgICAgcEZvcm1GaWVsZC0+R2V0Q29udHJvbChtX25Gb3JtQ29udHJvbEluZGV4KTsKKyAgICAgIGlmICghcEZvcm1Db250cm9sKQorICAgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJaWYgKG1fbkZvcm1Db250cm9sSW5kZXggPCAwKQotCQl7Ci0JCQlmb3IgKGludCBpPTAsc3o9cEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBpPHN6OyBpKyspCi0JCQl7Ci0JCQkJQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gcEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKTsKLQkJCQlBU1NFUlQocEZvcm1Db250cm9sICE9IE5VTEwpOwotCi0JCQkJRXhwb3J0VmFsdXNBcnJheS5TZXRFbGVtZW50KGksIENKU19WYWx1ZShtX2lzb2xhdGUscEZvcm1Db250cm9sLT5HZXRFeHBvcnRWYWx1ZSgpLmNfc3RyKCkpKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmKG1fbkZvcm1Db250cm9sSW5kZXggPj0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKSByZXR1cm4gRkFMU0U7Ci0JCQlDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG1fbkZvcm1Db250cm9sSW5kZXgpOwotCQkJaWYgKCFwRm9ybUNvbnRyb2wpIHJldHVybiBGQUxTRTsKLQotCQkJRXhwb3J0VmFsdXNBcnJheS5TZXRFbGVtZW50KDAsIENKU19WYWx1ZShtX2lzb2xhdGUscEZvcm1Db250cm9sLT5HZXRFeHBvcnRWYWx1ZSgpLmNfc3RyKCkpKTsKLQkJfQotCi0JCXZwIDw8IEV4cG9ydFZhbHVzQXJyYXk7Ci0JfQotCi0JcmV0dXJuIFRSVUU7CisgICAgICBFeHBvcnRWYWx1c0FycmF5LlNldEVsZW1lbnQoCisgICAgICAgICAgMCwgQ0pTX1ZhbHVlKHBSdW50aW1lLCBwRm9ybUNvbnRyb2wtPkdldEV4cG9ydFZhbHVlKCkuY19zdHIoKSkpOworICAgIH0KKyAgICB2cCA8PCBFeHBvcnRWYWx1c0FycmF5OworICB9CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIEZpZWxkOjpmaWxlU2VsZWN0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIEZpZWxkOjpmaWxlU2VsZWN0KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0JR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0JaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0JQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCi0JCXJldHVybiBGQUxTRTsKLQotCWlmICh2cC5Jc1NldHRpbmcoKSkKLQl7Ci0JCWlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7Ci0KLQkJYm9vbCBiVlA7Ci0JCXZwID4+IGJWUDsKLQotCX0KLQllbHNlCi0JewotCQlpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0ZJTEVTRUxFQ1QpCi0JCQl2cCA8PCB0cnVlOwotCQllbHNlCi0JCQl2cCA8PCBmYWxzZTsKLQl9Ci0KLQlyZXR1cm4gVFJVRTsKKyAgICBib29sIGJWUDsKKyAgICB2cCA+PiBiVlA7CisgIH0gZWxzZSB7CisgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19GSUxFU0VMRUNUKQorICAgICAgdnAgPDwgdHJ1ZTsKKyAgICBlbHNlCisgICAgICB2cCA8PCBmYWxzZTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6ZmlsbENvbG9yKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIEZpZWxkOjpmaWxsQ29sb3IoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gQ0pTX1J1bnRpbWU6OkZyb21Db250ZXh0KGNjKTsKKyAgQ0pTX0FycmF5IGNyQXJyYXkocFJ1bnRpbWUpOworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlDSlNfQXJyYXkgY3JBcnJheShtX2lzb2xhdGUpOworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCUdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0JaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKLQotCWlmICh2cC5Jc1NldHRpbmcoKSkKLQl7Ci0JCWlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7Ci0JCWlmICghdnAuSXNBcnJheU9iamVjdCgpKSByZXR1cm4gRkFMU0U7Ci0KLQkJdnAgPj4gY3JBcnJheTsKLQotCQlDUFdMX0NvbG9yIGNvbG9yOwotCQljb2xvcjo6Q29udmVydEFycmF5VG9QV0xDb2xvcihjckFycmF5LCBjb2xvcik7Ci0KLQkJaWYgKG1fYkRlbGF5KQotCQl7Ci0JCQlBZGREZWxheV9Db2xvcihGUF9GSUxMQ09MT1IsIGNvbG9yKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUZpZWxkOjpTZXRGaWxsQ29sb3IobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBjb2xvcik7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotCQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKyAgICBpZiAoIXZwLklzQXJyYXlPYmplY3QoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLQkJaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIEZBTFNFOworICAgIHZwID4+IGNyQXJyYXk7CiAKLQkJaW50IGlDb2xvclR5cGU7Ci0JCXBGb3JtQ29udHJvbC0+R2V0QmFja2dyb3VuZENvbG9yKGlDb2xvclR5cGUpOworICAgIENQV0xfQ29sb3IgY29sb3I7CisgICAgY29sb3I6OkNvbnZlcnRBcnJheVRvUFdMQ29sb3IoY3JBcnJheSwgY29sb3IpOworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfQ29sb3IoRlBfRklMTENPTE9SLCBjb2xvcik7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXRGaWxsQ29sb3IobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBjb2xvcik7CisgICAgfQorICB9IGVsc2UgeworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgICBBU1NFUlQocEZvcm1GaWVsZCk7CisgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7CisgICAgaWYgKCFwRm9ybUNvbnRyb2wpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJQ1BXTF9Db2xvciBjb2xvcjsKKyAgICBpbnQgaUNvbG9yVHlwZTsKKyAgICBwRm9ybUNvbnRyb2wtPkdldEJhY2tncm91bmRDb2xvcihpQ29sb3JUeXBlKTsKIAotCQlpZiAoaUNvbG9yVHlwZSA9PSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQpCi0JCXsKLQkJCWNvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfVFJBTlNQQVJFTlQpOwotCQl9Ci0JCWVsc2UgaWYgKGlDb2xvclR5cGUgPT0gQ09MT1JUWVBFX0dSQVkpCi0JCXsKLQkJCWNvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcigwKSk7Ci0JCX0KLQkJZWxzZSBpZiAoaUNvbG9yVHlwZSA9PSBDT0xPUlRZUEVfUkdCKQotCQl7Ci0JCQljb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcigwKSwKLQkJCQlwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKDEpLAotCQkJCXBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoMikpOwotCQl9Ci0JCWVsc2UgaWYgKGlDb2xvclR5cGUgPT0gQ09MT1JUWVBFX0NNWUspCi0JCXsKLQkJCWNvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfQ01ZSywgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcigwKSwKLQkJCQlwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKDEpLAotCQkJCXBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoMiksCi0JCQkJcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcigzKSk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIEZBTFNFOworICAgIENQV0xfQ29sb3IgY29sb3I7CisgICAgaWYgKGlDb2xvclR5cGUgPT0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UKSB7CisgICAgICBjb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX1RSQU5TUEFSRU5UKTsKKyAgICB9IGVsc2UgaWYgKGlDb2xvclR5cGUgPT0gQ09MT1JUWVBFX0dSQVkpIHsKKyAgICAgIGNvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKDApKTsKKyAgICB9IGVsc2UgaWYgKGlDb2xvclR5cGUgPT0gQ09MT1JUWVBFX1JHQikgeworICAgICAgY29sb3IgPQorICAgICAgICAgIENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcigwKSwKKyAgICAgICAgICAgICAgICAgICAgIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoMSksCisgICAgICAgICAgICAgICAgICAgICBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKDIpKTsKKyAgICB9IGVsc2UgaWYgKGlDb2xvclR5cGUgPT0gQ09MT1JUWVBFX0NNWUspIHsKKyAgICAgIGNvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfQ01ZSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcigyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKDMpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KIAotCQljb2xvcjo6Q29udmVydFBXTENvbG9yVG9BcnJheShjb2xvciwgY3JBcnJheSk7Ci0gICAgICAgIHZwICA8PCAgY3JBcnJheTsKLQl9CisgICAgY29sb3I6OkNvbnZlcnRQV0xDb2xvclRvQXJyYXkoY29sb3IsIGNyQXJyYXkpOworICAgIHZwIDw8IGNyQXJyYXk7CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBGaWVsZDo6U2V0RmlsbENvbG9yKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpCi17Ci0JLy9Ob3Qgc3VwcG9ydGVkLgordm9pZCBGaWVsZDo6U2V0RmlsbENvbG9yKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6aGlkZGVuKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLQlpZiAodnAuSXNTZXR0aW5nKCkpCi0JewotCQlpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwotCi0JCWJvb2wgYlZQOwotCQl2cCA+PiBiVlA7Ci0KLQkJaWYgKG1fYkRlbGF5KQotCQl7Ci0JCQlBZGREZWxheV9Cb29sKEZQX0hJRERFTiwgYlZQKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUZpZWxkOjpTZXRIaWRkZW4obV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBiVlApOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotCQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBGaWVsZDo6aGlkZGVuKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLQkJQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisgICAgYm9vbCBiVlA7CisgICAgdnAgPj4gYlZQOwogCi0JCUNQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7Ci0JCUFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfQm9vbChGUF9ISURERU4sIGJWUCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXRIaWRkZW4obV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBiVlApOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCUNQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gcEludGVyRm9ybS0+R2V0V2lkZ2V0KEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpKTsKLQkJaWYgKCFwV2lkZ2V0KSByZXR1cm4gRkFMU0U7CisgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICAgIEFTU0VSVChwRm9ybUZpZWxkKTsKKyAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9CisgICAgICAgIChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOworICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0KKyAgICAgICAgcEludGVyRm9ybS0+R2V0V2lkZ2V0KEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpKTsKKyAgICBpZiAoIXBXaWRnZXQpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJRlhfRFdPUkQgZHdGbGFncyA9IHBXaWRnZXQtPkdldEZsYWdzKCk7CisgICAgRlhfRFdPUkQgZHdGbGFncyA9IHBXaWRnZXQtPkdldEZsYWdzKCk7CiAKLQkJaWYgKEFOTk9URkxBR19JTlZJU0lCTEUgJiBkd0ZsYWdzIHx8IEFOTk9URkxBR19ISURERU4gJiBkd0ZsYWdzKSAKLQkJewotCQkJdnAgPDwgdHJ1ZTsKLQkJfQotCQllbHNlIAotCQkJdnAgPDwgZmFsc2U7Ci0JfQorICAgIGlmIChBTk5PVEZMQUdfSU5WSVNJQkxFICYgZHdGbGFncyB8fCBBTk5PVEZMQUdfSElEREVOICYgZHdGbGFncykKKyAgICAgIHZwIDw8IHRydWU7CisgICAgZWxzZQorICAgICAgdnAgPDwgZmFsc2U7CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBGaWVsZDo6U2V0SGlkZGVuKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgYm9vbCBiKQotewotCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7Cit2b2lkIEZpZWxkOjpTZXRIaWRkZW4oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGIpIHsKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKXBEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9CisgICAgICBHZXRGb3JtRmllbGRzKHBEb2N1bWVudCwgc3dGaWVsZE5hbWUpOworICBmb3IgKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkIDogRmllbGRBcnJheSkgeworICAgIGlmIChuQ29udHJvbEluZGV4IDwgMCkgeworICAgICAgRlhfQk9PTCBiU2V0ID0gRkFMU0U7CisgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGkgPCBzejsgKytpKSB7CisgICAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9CisgICAgICAgICAgICAgICAgcEludGVyRm9ybS0+R2V0V2lkZ2V0KHBGb3JtRmllbGQtPkdldENvbnRyb2woaSkpKSB7CisgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncyA9IHBXaWRnZXQtPkdldEZsYWdzKCk7CiAKLQlDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKLQlBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKLQotCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCUdldEZvcm1GaWVsZHMocERvY3VtZW50LCBzd0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0KLQlmb3IgKGludCBpPTAsaXN6PUZpZWxkQXJyYXkuR2V0U2l6ZSgpOyBpPGlzejsgaSsrKQotCXsKLQkJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KGkpOwotCQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKyAgICAgICAgICBpZiAoYikgeworICAgICAgICAgICAgZHdGbGFncyAmPSAofkFOTk9URkxBR19JTlZJU0lCTEUpOworICAgICAgICAgICAgZHdGbGFncyAmPSAofkFOTk9URkxBR19OT1ZJRVcpOworICAgICAgICAgICAgZHdGbGFncyB8PSAoQU5OT1RGTEFHX0hJRERFTiB8IEFOTk9URkxBR19QUklOVCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGR3RmxhZ3MgJj0gKH5BTk5PVEZMQUdfSU5WSVNJQkxFKTsKKyAgICAgICAgICAgIGR3RmxhZ3MgJj0gKH5BTk5PVEZMQUdfSElEREVOKTsKKyAgICAgICAgICAgIGR3RmxhZ3MgJj0gKH5BTk5PVEZMQUdfTk9WSUVXKTsKKyAgICAgICAgICAgIGR3RmxhZ3MgfD0gQU5OT1RGTEFHX1BSSU5UOworICAgICAgICAgIH0KIAotCQlpZiAobkNvbnRyb2xJbmRleCA8IDApCi0JCXsKLQkJCUZYX0JPT0wgYlNldCA9IEZBTFNFOwotCQkJZm9yIChpbnQgaj0wLGpzeiA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgajxqc3o7IGorKykKLQkJCXsKLQkJCQlpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1GaWVsZC0+R2V0Q29udHJvbChqKSkpCi0JCQkJewkJCQkJCi0JCQkJCUZYX0RXT1JEIGR3RmxhZ3MgPSBwV2lkZ2V0LT5HZXRGbGFncygpOwotCQkJCQkKLQkJCQkJaWYgKGIpCi0JCQkJCXsKLQkJCQkJCWR3RmxhZ3MgJj0gKH5BTk5PVEZMQUdfSU5WSVNJQkxFKTsKLQkJCQkJCWR3RmxhZ3MgJj0gKH5BTk5PVEZMQUdfTk9WSUVXKTsKLQkJCQkJCWR3RmxhZ3MgfD0gKEFOTk9URkxBR19ISURERU4gfCBBTk5PVEZMQUdfUFJJTlQpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJZHdGbGFncyAmPSAofkFOTk9URkxBR19JTlZJU0lCTEUpOwotCQkJCQkJZHdGbGFncyAmPSAofkFOTk9URkxBR19ISURERU4pOwotCQkJCQkJZHdGbGFncyAmPSAofkFOTk9URkxBR19OT1ZJRVcpOwotCQkJCQkJZHdGbGFncyB8PSBBTk5PVEZMQUdfUFJJTlQ7CQotCQkJCQl9CisgICAgICAgICAgaWYgKGR3RmxhZ3MgIT0gcFdpZGdldC0+R2V0RmxhZ3MoKSkgeworICAgICAgICAgICAgcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFncyk7CisgICAgICAgICAgICBiU2V0ID0gVFJVRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KIAotCQkJCQlpZiAoZHdGbGFncyAhPSBwV2lkZ2V0LT5HZXRGbGFncygpKQotCQkJCQl7Ci0JCQkJCQlwV2lkZ2V0LT5TZXRGbGFncyhkd0ZsYWdzKTsJCi0JCQkJCQliU2V0ID0gVFJVRTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KKyAgICAgIGlmIChiU2V0KQorICAgICAgICBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBGQUxTRSwgVFJVRSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChuQ29udHJvbEluZGV4ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkKKyAgICAgICAgcmV0dXJuOworICAgICAgaWYgKENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9CisgICAgICAgICAgICAgIHBGb3JtRmllbGQtPkdldENvbnRyb2wobkNvbnRyb2xJbmRleCkpIHsKKyAgICAgICAgaWYgKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gcEludGVyRm9ybS0+R2V0V2lkZ2V0KHBGb3JtQ29udHJvbCkpIHsKKyAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzID0gcFdpZGdldC0+R2V0RmxhZ3MoKTsKIAotCQkJaWYgKGJTZXQpCi0JCQkJVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgRkFMU0UsIFRSVUUpOwkKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmKG5Db250cm9sSW5kZXggPj0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKSByZXR1cm47Ci0JCQlpZiAoQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gcEZvcm1GaWVsZC0+R2V0Q29udHJvbChuQ29udHJvbEluZGV4KSkKLQkJCXsKLQkJCQlpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1Db250cm9sKSkKLQkJCQl7Ci0JCQkJCUZYX0RXT1JEIGR3RmxhZ3MgPSBwV2lkZ2V0LT5HZXRGbGFncygpOwotCQkJCQkKLQkJCQkJaWYgKGIpCi0JCQkJCXsKLQkJCQkJCWR3RmxhZ3MgJj0gKH5BTk5PVEZMQUdfSU5WSVNJQkxFKTsKLQkJCQkJCWR3RmxhZ3MgJj0gKH5BTk5PVEZMQUdfTk9WSUVXKTsKLQkJCQkJCWR3RmxhZ3MgfD0gKEFOTk9URkxBR19ISURERU4gfCBBTk5PVEZMQUdfUFJJTlQpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJZHdGbGFncyAmPSAofkFOTk9URkxBR19JTlZJU0lCTEUpOwotCQkJCQkJZHdGbGFncyAmPSAofkFOTk9URkxBR19ISURERU4pOwotCQkJCQkJZHdGbGFncyAmPSAofkFOTk9URkxBR19OT1ZJRVcpOwotCQkJCQkJZHdGbGFncyB8PSBBTk5PVEZMQUdfUFJJTlQ7CQotCQkJCQl9CisgICAgICAgICAgaWYgKGIpIHsKKyAgICAgICAgICAgIGR3RmxhZ3MgJj0gKH5BTk5PVEZMQUdfSU5WSVNJQkxFKTsKKyAgICAgICAgICAgIGR3RmxhZ3MgJj0gKH5BTk5PVEZMQUdfTk9WSUVXKTsKKyAgICAgICAgICAgIGR3RmxhZ3MgfD0gKEFOTk9URkxBR19ISURERU4gfCBBTk5PVEZMQUdfUFJJTlQpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkd0ZsYWdzICY9ICh+QU5OT1RGTEFHX0lOVklTSUJMRSk7CisgICAgICAgICAgICBkd0ZsYWdzICY9ICh+QU5OT1RGTEFHX0hJRERFTik7CisgICAgICAgICAgICBkd0ZsYWdzICY9ICh+QU5OT1RGTEFHX05PVklFVyk7CisgICAgICAgICAgICBkd0ZsYWdzIHw9IEFOTk9URkxBR19QUklOVDsKKyAgICAgICAgICB9CiAKLQkJCQkJaWYgKGR3RmxhZ3MgIT0gcFdpZGdldC0+R2V0RmxhZ3MoKSkKLQkJCQkJewotCQkJCQkJcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFncyk7CQotCQkJCQkJVXBkYXRlRm9ybUNvbnRyb2wocERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIFRSVUUsIEZBTFNFLCBUUlVFKTsJCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgICAgaWYgKGR3RmxhZ3MgIT0gcFdpZGdldC0+R2V0RmxhZ3MoKSkgeworICAgICAgICAgICAgcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFncyk7CisgICAgICAgICAgICBVcGRhdGVGb3JtQ29udHJvbChwRG9jdW1lbnQsIHBGb3JtQ29udHJvbCwgVFJVRSwgRkFMU0UsIFRSVUUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQogfQogCi1GWF9CT09MIEZpZWxkOjpoaWdobGlnaHQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgRmllbGQ6OmhpZ2hsaWdodChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQpOwogCi0JaWYgKHZwLklzU2V0dGluZygpKQotCXsKLQkJaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJQ0ZYX0J5dGVTdHJpbmcgc3RyTW9kZTsKLQkJdnAgPj4gc3RyTW9kZTsKKyAgICBDRlhfQnl0ZVN0cmluZyBzdHJNb2RlOworICAgIHZwID4+IHN0ck1vZGU7CiAKLQkJaWYgKG1fYkRlbGF5KQotCQl7Ci0JCQlBZGREZWxheV9TdHJpbmcoRlBfSElHSExJR0hULCBzdHJNb2RlKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUZpZWxkOjpTZXRIaWdobGlnaHQobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBzdHJNb2RlKTsKLQkJfQotCX0KLQllbHNlCi0JewotCQlDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLQkJR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLQkJaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAobV9iRGVsYXkpIHsKKyAgICAgIEFkZERlbGF5X1N0cmluZyhGUF9ISUdITElHSFQsIHN0ck1vZGUpOworICAgIH0gZWxzZSB7CisgICAgICBGaWVsZDo6U2V0SGlnaGxpZ2h0KG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyTW9kZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICAgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotCQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCWlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLQkJCXJldHVybiBGQUxTRTsKKyAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKKyAgICBpZiAoIXBGb3JtQ29udHJvbCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLQkJaWYgKCFwRm9ybUNvbnRyb2wpIHJldHVybiBGQUxTRTsKKyAgICBpbnQgZUhNID0gcEZvcm1Db250cm9sLT5HZXRIaWdobGlnaHRpbmdNb2RlKCk7CisgICAgc3dpdGNoIChlSE0pIHsKKyAgICAgIGNhc2UgQ1BERl9Gb3JtQ29udHJvbDo6Tm9uZToKKyAgICAgICAgdnAgPDwgTCJub25lIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENQREZfRm9ybUNvbnRyb2w6OlB1c2g6CisgICAgICAgIHZwIDw8IEwicHVzaCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDUERGX0Zvcm1Db250cm9sOjpJbnZlcnQ6CisgICAgICAgIHZwIDw8IEwiaW52ZXJ0IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENQREZfRm9ybUNvbnRyb2w6Ok91dGxpbmU6CisgICAgICAgIHZwIDw8IEwib3V0bGluZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDUERGX0Zvcm1Db250cm9sOjpUb2dnbGU6CisgICAgICAgIHZwIDw8IEwidG9nZ2xlIjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CiAKLQkJaW50IGVITSA9IHBGb3JtQ29udHJvbC0+R2V0SGlnaGxpZ2h0aW5nTW9kZSgpOwotCQlzd2l0Y2ggKGVITSkKLQkJewotCQljYXNlIENQREZfRm9ybUNvbnRyb2w6Ok5vbmU6Ci0JCQl2cCAgPDwgIEwibm9uZSI7Ci0JCQlicmVhazsKLQkJY2FzZSBDUERGX0Zvcm1Db250cm9sOjpQdXNoOgotCQkJdnAgIDw8ICBMInB1c2giOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ1BERl9Gb3JtQ29udHJvbDo6SW52ZXJ0OgotCQkJdnAgIDw8ICBMImludmVydCI7Ci0JCQlicmVhazsKLQkJY2FzZSBDUERGX0Zvcm1Db250cm9sOjpPdXRsaW5lOgotCQkJdnAgIDw8ICBMIm91dGxpbmUiOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ1BERl9Gb3JtQ29udHJvbDo6VG9nZ2xlOgotCQkJIHZwICA8PCAgTCJ0b2dnbGUiOwotCQkJIGJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi12b2lkIEZpZWxkOjpTZXRIaWdobGlnaHQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKQotewotCS8vTm90IHN1cHBvcnRlZC4KK3ZvaWQgRmllbGQ6OlNldEhpZ2hsaWdodChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6bGluZVdpZHRoKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIEZpZWxkOjpsaW5lV2lkdGgoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQlpZiAodnAuSXNTZXR0aW5nKCkpCi0JewotCQlpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgIGludCBpV2lkdGg7CisgICAgdnAgPj4gaVdpZHRoOwogCi0JCWludCBpV2lkdGg7Ci0JCXZwID4+IGlXaWR0aDsKKyAgICBpZiAobV9iRGVsYXkpIHsKKyAgICAgIEFkZERlbGF5X0ludChGUF9MSU5FV0lEVEgsIGlXaWR0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXRMaW5lV2lkdGgobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpV2lkdGgpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCWlmIChtX2JEZWxheSkKLQkJewotCQkJQWRkRGVsYXlfSW50KEZQX0xJTkVXSURUSCwgaVdpZHRoKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUZpZWxkOjpTZXRMaW5lV2lkdGgobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBpV2lkdGgpOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotCQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0JCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLQkJQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLQkJQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0JCWlmICghcEZvcm1Db250cm9sKSByZXR1cm4gRkFMU0U7Ci0KLQkJQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKW1fcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKLQkJQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CisgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICAgIEFTU0VSVChwRm9ybUZpZWxkKTsKKyAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKKyAgICBpZiAoIXBGb3JtQ29udHJvbCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlpZighcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKSByZXR1cm4gRkFMU0U7CisgICAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPQorICAgICAgICAoQ1BERlNES19JbnRlckZvcm0qKW1fcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKKyAgICBpZiAoIXBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUZpZWxkLT5HZXRDb250cm9sKDApKTsKLQkJaWYgKCFwV2lkZ2V0KSByZXR1cm4gRkFMU0U7CisgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1GaWVsZC0+R2V0Q29udHJvbCgwKSk7CisgICAgaWYgKCFwV2lkZ2V0KQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCXZwIDw8IChGWF9JTlQzMilwV2lkZ2V0LT5HZXRCb3JkZXJXaWR0aCgpOwotCX0KKyAgICB2cCA8PCAoaW50MzJfdClwV2lkZ2V0LT5HZXRCb3JkZXJXaWR0aCgpOworICB9CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLXZvaWQgRmllbGQ6OlNldExpbmVXaWR0aChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpCi17Ci0JQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKK3ZvaWQgRmllbGQ6OlNldExpbmVXaWR0aChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpIHsKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKXBEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CiAKLQlDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKLQlBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKLQotCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCUdldEZvcm1GaWVsZHMocERvY3VtZW50LCBzd0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0KLQlmb3IgKGludCBpPTAsaXN6PUZpZWxkQXJyYXkuR2V0U2l6ZSgpOyBpPGlzejsgaSsrKQotCXsKLQkJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KGkpOwotCQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0KKyAgICAgIEdldEZvcm1GaWVsZHMocERvY3VtZW50LCBzd0ZpZWxkTmFtZSk7CisgIGZvciAoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgOiBGaWVsZEFycmF5KSB7CisgICAgaWYgKG5Db250cm9sSW5kZXggPCAwKSB7CisgICAgICBGWF9CT09MIGJTZXQgPSBGQUxTRTsKKyAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaSA8IHN6OyArK2kpIHsKKyAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gcEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKTsKKyAgICAgICAgQVNTRVJUKHBGb3JtQ29udHJvbCk7CiAKLQkJaWYgKG5Db250cm9sSW5kZXggPCAwKQotCQl7Ci0JCQlGWF9CT09MIGJTZXQgPSBGQUxTRTsKLQkJCWZvciAoaW50IGo9MCxqc3o9cEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBqPGpzejsgaisrKQotCQkJewotCQkJCUNQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woaik7Ci0JCQkJQVNTRVJUKHBGb3JtQ29udHJvbCAhPSBOVUxMKTsKLQkJCQkKLQkJCQlpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1Db250cm9sKSkKLQkJCQl7Ci0JCQkJCWlmIChudW1iZXIgIT0gcFdpZGdldC0+R2V0Qm9yZGVyV2lkdGgoKSkKLQkJCQkJewotCQkJCQkJcFdpZGdldC0+U2V0Qm9yZGVyV2lkdGgobnVtYmVyKTsKLQkJCQkJCWJTZXQgPSBUUlVFOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGJTZXQpIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIFRSVUUsIFRSVUUpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYobkNvbnRyb2xJbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpIHJldHVybjsKLQkJCWlmIChDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG5Db250cm9sSW5kZXgpKQotCQkJewotCQkJCWlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpKQotCQkJCXsKLQkJCQkJaWYgKG51bWJlciAhPSBwV2lkZ2V0LT5HZXRCb3JkZXJXaWR0aCgpKQotCQkJCQl7Ci0JCQkJCQlwV2lkZ2V0LT5TZXRCb3JkZXJXaWR0aChudW1iZXIpOwotCQkJCQkJVXBkYXRlRm9ybUNvbnRyb2wocERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIFRSVUUsIFRSVUUsIFRSVUUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQorICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1Db250cm9sKSkgeworICAgICAgICAgIGlmIChudW1iZXIgIT0gcFdpZGdldC0+R2V0Qm9yZGVyV2lkdGgoKSkgeworICAgICAgICAgICAgcFdpZGdldC0+U2V0Qm9yZGVyV2lkdGgobnVtYmVyKTsKKyAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGJTZXQpCisgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIFRSVUUsIFRSVUUpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAobkNvbnRyb2xJbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCisgICAgICAgIHJldHVybjsKKyAgICAgIGlmIChDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPQorICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG5Db250cm9sSW5kZXgpKSB7CisgICAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpKSB7CisgICAgICAgICAgaWYgKG51bWJlciAhPSBwV2lkZ2V0LT5HZXRCb3JkZXJXaWR0aCgpKSB7CisgICAgICAgICAgICBwV2lkZ2V0LT5TZXRCb3JkZXJXaWR0aChudW1iZXIpOworICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIFRSVUUsIFRSVUUsIFRSVUUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQogfQogCi1GWF9CT09MIEZpZWxkOjptdWx0aWxpbmUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgRmllbGQ6Om11bHRpbGluZShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQpOwogCi0JaWYgKHZwLklzU2V0dGluZygpKQotCXsKLQkJaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJYm9vbCBiVlA7Ci0JCXZwID4+IGJWUDsKLQotCQlpZiAobV9iRGVsYXkpCi0JCXsKLQkJCUFkZERlbGF5X0Jvb2woRlBfTVVMVElMSU5FLCBiVlApOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJRmllbGQ6OlNldE11bHRpbGluZShtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIGJWUCk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0JCUdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsIEZpZWxkQXJyYXkpOwotCQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgIGJvb2wgYlZQOworICAgIHZwID4+IGJWUDsKIAotCQlDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0JCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfQm9vbChGUF9NVUxUSUxJTkUsIGJWUCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXRNdWx0aWxpbmUobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBiVlApOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCWlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfVEVYVEZJRUxEKQotCQkJcmV0dXJuIEZBTFNFOworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX01VTFRJTElORSkKLQkJCXZwIDw8IHRydWU7Ci0JCWVsc2UKLQkJCXZwIDw8IGZhbHNlOwotCX0KKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX01VTFRJTElORSkKKyAgICAgIHZwIDw8IHRydWU7CisgICAgZWxzZQorICAgICAgdnAgPDwgZmFsc2U7CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBGaWVsZDo6U2V0TXVsdGlsaW5lKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgYm9vbCBiKQotewotCS8vTm90IHN1cHBvcnRlZC4KK3ZvaWQgRmllbGQ6OlNldE11bHRpbGluZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYikgeworICAvLyBOb3Qgc3VwcG9ydGVkLgogfQogCi1GWF9CT09MIEZpZWxkOjptdWx0aXBsZVNlbGVjdGlvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworRlhfQk9PTCBGaWVsZDo6bXVsdGlwbGVTZWxlY3Rpb24oSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCk7CiAKLQlpZiAodnAuSXNTZXR0aW5nKCkpCi0JewotCQlpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlib29sIGJWUDsKLQkJdnAgPj4gYlZQOworICAgIGJvb2wgYlZQOworICAgIHZwID4+IGJWUDsKIAotCQlpZiAobV9iRGVsYXkpCi0JCXsKLQkJCUFkZERlbGF5X0Jvb2woRlBfTVVMVElQTEVTRUxFQ1RJT04sIGJWUCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlGaWVsZDo6U2V0TXVsdGlwbGVTZWxlY3Rpb24obV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBiVlApOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotCQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfQm9vbChGUF9NVUxUSVBMRVNFTEVDVElPTiwgYlZQKTsKKyAgICB9IGVsc2UgeworICAgICAgRmllbGQ6OlNldE11bHRpcGxlU2VsZWN0aW9uKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVlApOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLQkJQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLQkJaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9MSVNUQk9YKQotCQkJcmV0dXJuIEZBTFNFOworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0xJU1RCT1gpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19NVUxUSVNFTEVDVCkKLQkJCXZwIDw8IHRydWU7Ci0JCWVsc2UKLQkJCXZwIDw8IGZhbHNlOwotCX0KKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX01VTFRJU0VMRUNUKQorICAgICAgdnAgPDwgdHJ1ZTsKKyAgICBlbHNlCisgICAgICB2cCA8PCBmYWxzZTsKKyAgfQogCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi12b2lkIEZpZWxkOjpTZXRNdWx0aXBsZVNlbGVjdGlvbihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGJvb2wgYikKLXsKLQkvL05vdCBzdXBwb3J0ZWQuCit2b2lkIEZpZWxkOjpTZXRNdWx0aXBsZVNlbGVjdGlvbihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYikgeworICAvLyBOb3Qgc3VwcG9ydGVkLgogfQogCi1GWF9CT09MIEZpZWxkOjpuYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlpZiAoIXZwLklzR2V0dGluZygpKSByZXR1cm4gRkFMU0U7CitGWF9CT09MIEZpZWxkOjpuYW1lKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKLQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLSAgIAl2cCA8PCBtX0ZpZWxkTmFtZTsKKyAgdnAgPDwgbV9GaWVsZE5hbWU7CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6Om51bUl0ZW1zKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsJCi0JQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0JR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0JaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKLQotCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKLQotCWlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ09NQk9CT1ggJiYKLQkJcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0xJU1RCT1gpCi0JCXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgRmllbGQ6Om51bUl0ZW1zKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAoIXZwLklzR2V0dGluZygpKQorICAgIHJldHVybiBGQUxTRTsKIAotCWlmICghdnAuSXNHZXR0aW5nKCkpIHJldHVybiBGQUxTRTsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JdnAgPDwgKEZYX0lOVDMyKXBGb3JtRmllbGQtPkNvdW50T3B0aW9ucygpOworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ09NQk9CT1ggJiYKKyAgICAgIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9MSVNUQk9YKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLQlyZXR1cm4gVFJVRTsKKyAgdnAgPDwgKGludDMyX3QpcEZvcm1GaWVsZC0+Q291bnRPcHRpb25zKCk7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIEZpZWxkOjpwYWdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlpZiAoIXZwLklzR2V0dGluZygpKSByZXR1cm4gRkFMU0U7CitGWF9CT09MIEZpZWxkOjpwYWdlKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKLQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0JQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotCWlmICghcEZvcm1GaWVsZCkgcmV0dXJuIEZBTFNFOwotCi0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0JQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKW1fcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKLQlBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKLQotCUNGWF9QdHJBcnJheSB3aWRnZXRBcnJheTsKLQlwSW50ZXJGb3JtLT5HZXRXaWRnZXRzKHBGb3JtRmllbGQsIHdpZGdldEFycmF5KTsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JaWYgKHdpZGdldEFycmF5LkdldFNpemUoKSA+IDApCi0JewotCQlDSlNfQXJyYXkgUGFnZUFycmF5KG1faXNvbGF0ZSk7CisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgaWYgKCFwRm9ybUZpZWxkKQorICAgIHJldHVybiBGQUxTRTsKIAotCQlmb3IgKGludCBpPTAsc3o9d2lkZ2V0QXJyYXkuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JCXsKLQkJCUNQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0Kil3aWRnZXRBcnJheS5HZXRBdChpKTsKLQkJCUFTU0VSVChwV2lkZ2V0ICE9IE5VTEwpOworICBzdGQ6OnZlY3RvcjxDUERGU0RLX1dpZGdldCo+IHdpZGdldHM7CisgIG1fcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKS0+R2V0V2lkZ2V0cyhwRm9ybUZpZWxkLCAmd2lkZ2V0cyk7CiAKLQkJCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBXaWRnZXQtPkdldFBhZ2VWaWV3KCk7Ci0JCQlpZighcFBhZ2VWaWV3KQotCQkJCXJldHVybiBGQUxTRTsKKyAgaWYgKHdpZGdldHMuZW1wdHkoKSkgeworICAgIHZwIDw8IChpbnQzMl90KS0xOworICAgIHJldHVybiBUUlVFOworICB9CiAKLQkJCVBhZ2VBcnJheS5TZXRFbGVtZW50KGksIENKU19WYWx1ZShtX2lzb2xhdGUsKEZYX0lOVDMyKXBQYWdlVmlldy0+R2V0UGFnZUluZGV4KCkpKTsKLQkJfQorICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBDSlNfUnVudGltZTo6RnJvbUNvbnRleHQoY2MpOworICBDSlNfQXJyYXkgUGFnZUFycmF5KHBSdW50aW1lKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB3aWRnZXRzLnNpemUoKTsgKytpKSB7CisgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gd2lkZ2V0c1tpXS0+R2V0UGFnZVZpZXcoKTsKKyAgICBpZiAoIXBQYWdlVmlldykKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQl2cCA8PCBQYWdlQXJyYXk7Ci0JfQotCWVsc2UKLQl7Ci0JCXZwIDw8IChGWF9JTlQzMikgLTE7Ci0JfQorICAgIFBhZ2VBcnJheS5TZXRFbGVtZW50KAorICAgICAgICBpLCBDSlNfVmFsdWUocFJ1bnRpbWUsIChpbnQzMl90KXBQYWdlVmlldy0+R2V0UGFnZUluZGV4KCkpKTsKKyAgfQogCi0JcmV0dXJuIFRSVUU7CisgIHZwIDw8IFBhZ2VBcnJheTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OnBhc3N3b3JkKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIEZpZWxkOjpwYXNzd29yZChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50KTsKIAotCWlmICh2cC5Jc1NldHRpbmcoKSkKLQl7Ci0JCWlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCWJvb2wgYlZQOwotCQl2cCA+PiBiVlA7CisgICAgYm9vbCBiVlA7CisgICAgdnAgPj4gYlZQOwogCi0JCWlmIChtX2JEZWxheSkKLQkJewotCQkJQWRkRGVsYXlfQm9vbChGUF9QQVNTV09SRCwgYlZQKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUZpZWxkOjpTZXRQYXNzd29yZChtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIGJWUCk7Ci0JCX0JCi0JfQotCWVsc2UKLQl7Ci0JCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotCQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfQm9vbChGUF9QQVNTV09SRCwgYlZQKTsKKyAgICB9IGVsc2UgeworICAgICAgRmllbGQ6OlNldFBhc3N3b3JkKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgYlZQKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgICAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0JCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0JCWlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfVEVYVEZJRUxEKQotCQkJcmV0dXJuIEZBTFNFOworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX1BBU1NXT1JEKQotCQkJdnAgPDwgdHJ1ZTsKLQkJZWxzZQotCQkJdnAgPDwgZmFsc2U7Ci0JfQorICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfUEFTU1dPUkQpCisgICAgICB2cCA8PCB0cnVlOworICAgIGVsc2UKKyAgICAgIHZwIDw8IGZhbHNlOworICB9CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLXZvaWQgRmllbGQ6OlNldFBhc3N3b3JkKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgYm9vbCBiKQotewotCS8vTm90IHN1cHBvcnRlZC4KK3ZvaWQgRmllbGQ6OlNldFBhc3N3b3JkKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiKSB7CisgIC8vIE5vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OnByaW50KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIEZpZWxkOjpwcmludChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPQorICAgICAgKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBGQUxTRTsKIAotCUNQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7Ci0JQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0JR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7Ci0JaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICBib29sIGJWUDsKKyAgICB2cCA+PiBiVlA7CiAKLQlpZiAodnAuSXNTZXR0aW5nKCkpCi0JewotCQlpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICAgIGZvciAoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgOiBGaWVsZEFycmF5KSB7CisgICAgICBpZiAobV9uRm9ybUNvbnRyb2xJbmRleCA8IDApIHsKKyAgICAgICAgRlhfQk9PTCBiU2V0ID0gRkFMU0U7CisgICAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaSA8IHN6OyArK2kpIHsKKyAgICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPQorICAgICAgICAgICAgICAgICAgcEludGVyRm9ybS0+R2V0V2lkZ2V0KHBGb3JtRmllbGQtPkdldENvbnRyb2woaSkpKSB7CisgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzID0gcFdpZGdldC0+R2V0RmxhZ3MoKTsKKyAgICAgICAgICAgIGlmIChiVlApCisgICAgICAgICAgICAgIGR3RmxhZ3MgfD0gQU5OT1RGTEFHX1BSSU5UOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBkd0ZsYWdzICY9IH5BTk5PVEZMQUdfUFJJTlQ7CiAKLQkJYm9vbCBiVlA7Ci0JCXZwID4+IGJWUDsKKyAgICAgICAgICAgIGlmIChkd0ZsYWdzICE9IHBXaWRnZXQtPkdldEZsYWdzKCkpIHsKKyAgICAgICAgICAgICAgcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFncyk7CisgICAgICAgICAgICAgIGJTZXQgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCWZvciAoaW50IGk9MCxpc3o9RmllbGRBcnJheS5HZXRTaXplKCk7IGk8aXN6OyBpKyspCi0JCXsKLQkJCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdChpKTsKLQkJCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworICAgICAgICBpZiAoYlNldCkKKyAgICAgICAgICBVcGRhdGVGb3JtRmllbGQobV9wRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIEZBTFNFLCBUUlVFKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtX25Gb3JtQ29udHJvbEluZGV4ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkKKyAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPQorICAgICAgICAgICAgICAgIHBGb3JtRmllbGQtPkdldENvbnRyb2wobV9uRm9ybUNvbnRyb2xJbmRleCkpIHsKKyAgICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1Db250cm9sKSkgeworICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncyA9IHBXaWRnZXQtPkdldEZsYWdzKCk7CisgICAgICAgICAgICBpZiAoYlZQKQorICAgICAgICAgICAgICBkd0ZsYWdzIHw9IEFOTk9URkxBR19QUklOVDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZHdGbGFncyAmPSB+QU5OT1RGTEFHX1BSSU5UOwogCi0JCQlpZiAobV9uRm9ybUNvbnRyb2xJbmRleCA8IDApCi0JCQl7Ci0JCQkJRlhfQk9PTCBiU2V0ID0gRkFMU0U7Ci0JCQkJZm9yIChpbnQgaj0wLGpzeiA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgajxqc3o7IGorKykKLQkJCQl7Ci0JCQkJCWlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUZpZWxkLT5HZXRDb250cm9sKGopKSkKLQkJCQkJewotCQkJCQkJRlhfRFdPUkQgZHdGbGFncyA9IHBXaWRnZXQtPkdldEZsYWdzKCk7Ci0JCQkJCQlpZiAoYlZQKQotCQkJCQkJCWR3RmxhZ3MgfD0gQU5OT1RGTEFHX1BSSU5UOwotCQkJCQkJZWxzZQotCQkJCQkJCWR3RmxhZ3MgJj0gfkFOTk9URkxBR19QUklOVDsKLQotCQkJCQkJaWYgKGR3RmxhZ3MgIT0gcFdpZGdldC0+R2V0RmxhZ3MoKSkKLQkJCQkJCXsKLQkJCQkJCQlwV2lkZ2V0LT5TZXRGbGFncyhkd0ZsYWdzKTsKLQkJCQkJCQliU2V0ID0gVFJVRTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChiU2V0KQotCQkJCQlVcGRhdGVGb3JtRmllbGQobV9wRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIEZBTFNFLCBUUlVFKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZihtX25Gb3JtQ29udHJvbEluZGV4ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkgcmV0dXJuIEZBTFNFOwotCQkJCWlmIChDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG1fbkZvcm1Db250cm9sSW5kZXgpKQotCQkJCXsKLQkJCQkJaWYgKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gcEludGVyRm9ybS0+R2V0V2lkZ2V0KHBGb3JtQ29udHJvbCkpCi0JCQkJCXsKLQkJCQkJCUZYX0RXT1JEIGR3RmxhZ3MgPSBwV2lkZ2V0LT5HZXRGbGFncygpOwotCQkJCQkJaWYgKGJWUCkKLQkJCQkJCQlkd0ZsYWdzIHw9IEFOTk9URkxBR19QUklOVDsKLQkJCQkJCWVsc2UKLQkJCQkJCQlkd0ZsYWdzICY9IH5BTk5PVEZMQUdfUFJJTlQ7Ci0KLQkJCQkJCWlmIChkd0ZsYWdzICE9IHBXaWRnZXQtPkdldEZsYWdzKCkpCi0JCQkJCQl7Ci0JCQkJCQkJcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFncyk7Ci0JCQkJCQkJVXBkYXRlRm9ybUNvbnRyb2wobV9wRG9jdW1lbnQsIHBGb3JtRmllbGQtPkdldENvbnRyb2wobV9uRm9ybUNvbnRyb2xJbmRleCksIFRSVUUsIEZBTFNFLCBUUlVFKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JewotCQlDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0JCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCQkKLQkJQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQoR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCkpOwotCQlpZiAoIXBXaWRnZXQpIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIGlmIChkd0ZsYWdzICE9IHBXaWRnZXQtPkdldEZsYWdzKCkpIHsKKyAgICAgICAgICAgICAgcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFncyk7CisgICAgICAgICAgICAgIFVwZGF0ZUZvcm1Db250cm9sKG1fcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG1fbkZvcm1Db250cm9sSW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLCBGQUxTRSwgVFJVRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9CisgICAgICAgIHBJbnRlckZvcm0tPkdldFdpZGdldChHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKSk7CisgICAgaWYgKCFwV2lkZ2V0KQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCWlmIChwV2lkZ2V0LT5HZXRGbGFncygpICYgQU5OT1RGTEFHX1BSSU5UKQotCQkJdnAgPDwgdHJ1ZTsKLQkJZWxzZQotCQkJdnAgPDwgZmFsc2U7Ci0JfQorICAgIGlmIChwV2lkZ2V0LT5HZXRGbGFncygpICYgQU5OT1RGTEFHX1BSSU5UKQorICAgICAgdnAgPDwgdHJ1ZTsKKyAgICBlbHNlCisgICAgICB2cCA8PCBmYWxzZTsKKyAgfQogCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIEZpZWxkOjpyYWRpb3NJblVuaXNvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworRlhfQk9PTCBGaWVsZDo6cmFkaW9zSW5Vbmlzb24oSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBGQUxTRTsKIAotCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCUdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0JaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQlpZiAodnAuSXNTZXR0aW5nKCkpCi0JewotCQlpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOwotCi0JCWJvb2wgYlZQOwotCQl2cCA+PiBiVlA7Ci0KLQl9Ci0JZWxzZQotCXsKLQkJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotCQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKyAgICBib29sIGJWUDsKKyAgICB2cCA+PiBiVlA7CiAKLQkJaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9SQURJT0JVVFRPTikKLQkJCXJldHVybiBGQUxTRTsKKyAgfSBlbHNlIHsKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9SQURJT0JVVFRPTikKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX1JBRElPU0lOVU5JU09OKQotCQkJdnAgPDwgdHJ1ZTsKLQkJZWxzZQotCQkJdnAgPDwgZmFsc2U7Ci0JfQorICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfUkFESU9TSU5VTklTT04pCisgICAgICB2cCA8PCB0cnVlOworICAgIGVsc2UKKyAgICAgIHZwIDw8IGZhbHNlOworICB9CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OnJlYWRvbmx5KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLQlDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotCWlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7Ci0KLQlpZiAodnAuSXNTZXR0aW5nKCkpCi0JewotCQlpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBGaWVsZDo6cmVhZG9ubHkoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBGQUxTRTsKIAotCQlib29sIGJWUDsKLQkJdnAgPj4gYlZQOworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCX0KLQllbHNlCi0JewotCQlDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0JCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworICAgIGJvb2wgYlZQOworICAgIHZwID4+IGJWUDsKIAotCQlpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX1JFQURPTkxZKQotCQkJdnAgPDwgdHJ1ZTsKLQkJZWxzZQotCQkJdnAgPDwgZmFsc2U7Ci0JfQorICB9IGVsc2UgeworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX1JFQURPTkxZKQorICAgICAgdnAgPDwgdHJ1ZTsKKyAgICBlbHNlCisgICAgICB2cCA8PCBmYWxzZTsKKyAgfQogCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIEZpZWxkOjpyZWN0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIEZpZWxkOjpyZWN0KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gQ0pTX1J1bnRpbWU6OkZyb21Db250ZXh0KGNjKTsKKyAgQ0pTX1ZhbHVlIFVwcGVyX0xlZnR4KHBSdW50aW1lKTsKKyAgQ0pTX1ZhbHVlIFVwcGVyX0xlZnR5KHBSdW50aW1lKTsKKyAgQ0pTX1ZhbHVlIExvd2VyX1JpZ2h0eChwUnVudGltZSk7CisgIENKU19WYWx1ZSBMb3dlcl9SaWdodHkocFJ1bnRpbWUpOwogCi0JaWYgKHZwLklzU2V0dGluZygpKQotCXsKLQkJaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKLQkJaWYgKCF2cC5Jc0FycmF5T2JqZWN0KCkpcmV0dXJuIEZBTFNFOworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIXZwLklzQXJyYXlPYmplY3QoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlDSlNfQXJyYXkgcmNBcnJheShtX2lzb2xhdGUpOwotCQl2cCA+PiByY0FycmF5OwotCQlDSlNfVmFsdWUgVXBwZXJfTGVmdHgobV9pc29sYXRlKSwgVXBwZXJfTGVmdHkobV9pc29sYXRlKSwgTG93ZXJfUmlnaHR4KG1faXNvbGF0ZSksIExvd2VyX1JpZ2h0eShtX2lzb2xhdGUpOwotCQlyY0FycmF5LkdldEVsZW1lbnQoMCwgVXBwZXJfTGVmdHgpOwotCQlyY0FycmF5LkdldEVsZW1lbnQoMSwgVXBwZXJfTGVmdHkpOwotCQlyY0FycmF5LkdldEVsZW1lbnQoMiwgTG93ZXJfUmlnaHR4KTsKLQkJcmNBcnJheS5HZXRFbGVtZW50KDMsIExvd2VyX1JpZ2h0eSk7CisgICAgQ0pTX0FycmF5IHJjQXJyYXkocFJ1bnRpbWUpOworICAgIHZwID4+IHJjQXJyYXk7CisgICAgcmNBcnJheS5HZXRFbGVtZW50KDAsIFVwcGVyX0xlZnR4KTsKKyAgICByY0FycmF5LkdldEVsZW1lbnQoMSwgVXBwZXJfTGVmdHkpOworICAgIHJjQXJyYXkuR2V0RWxlbWVudCgyLCBMb3dlcl9SaWdodHgpOworICAgIHJjQXJyYXkuR2V0RWxlbWVudCgzLCBMb3dlcl9SaWdodHkpOwogCi0JCUZYX0ZMT0FUIHBBcnJheVs0XSA9IHswLjBmLDAuMGYsMC4wZiwwLjBmfTsKLQkJcEFycmF5WzBdID0gKEZYX0ZMT0FUKVVwcGVyX0xlZnR4LlRvSW50KCk7Ci0JCXBBcnJheVsxXSA9IChGWF9GTE9BVClMb3dlcl9SaWdodHkuVG9JbnQoKTsKLQkJcEFycmF5WzJdID0gKEZYX0ZMT0FUKUxvd2VyX1JpZ2h0eC5Ub0ludCgpOwotCQlwQXJyYXlbM10gPSAoRlhfRkxPQVQpVXBwZXJfTGVmdHkuVG9JbnQoKTsKLQotCQlDUERGX1JlY3QgY3JSZWN0KHBBcnJheSk7Ci0KLQkJaWYgKG1fYkRlbGF5KQotCQl7Ci0JCQlBZGREZWxheV9SZWN0KEZQX1JFQ1QsIGNyUmVjdCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlGaWVsZDo6U2V0UmVjdChtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIGNyUmVjdCk7Ci0JCX0JCi0JfQotCWVsc2UKLQl7Ci0JCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotCQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0JCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLQkJQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLQkJQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKW1fcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKLQkJQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7Ci0KLQkJQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQoR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCkpOwotCQlpZiAoIXBXaWRnZXQpIHJldHVybiBGQUxTRTsKKyAgICBGWF9GTE9BVCBwQXJyYXlbNF0gPSB7MC4wZiwgMC4wZiwgMC4wZiwgMC4wZn07CisgICAgcEFycmF5WzBdID0gKEZYX0ZMT0FUKVVwcGVyX0xlZnR4LlRvSW50KCk7CisgICAgcEFycmF5WzFdID0gKEZYX0ZMT0FUKUxvd2VyX1JpZ2h0eS5Ub0ludCgpOworICAgIHBBcnJheVsyXSA9IChGWF9GTE9BVClMb3dlcl9SaWdodHguVG9JbnQoKTsKKyAgICBwQXJyYXlbM10gPSAoRlhfRkxPQVQpVXBwZXJfTGVmdHkuVG9JbnQoKTsKIAotCQlDRlhfRmxvYXRSZWN0IGNyUmVjdCA9IHBXaWRnZXQtPkdldFJlY3QoKTsKLQkJQ0pTX1ZhbHVlIFVwcGVyX0xlZnR4KG1faXNvbGF0ZSksVXBwZXJfTGVmdHkobV9pc29sYXRlKSxMb3dlcl9SaWdodHgobV9pc29sYXRlKSxMb3dlcl9SaWdodHkobV9pc29sYXRlKTsKLQkJVXBwZXJfTGVmdHggPSAoRlhfSU5UMzIpY3JSZWN0LmxlZnQ7Ci0JCVVwcGVyX0xlZnR5ID0gKEZYX0lOVDMyKWNyUmVjdC50b3A7Ci0JCUxvd2VyX1JpZ2h0eCA9IChGWF9JTlQzMiljclJlY3QucmlnaHQ7Ci0JCUxvd2VyX1JpZ2h0eSA9IChGWF9JTlQzMiljclJlY3QuYm90dG9tOworICAgIENQREZfUmVjdCBjclJlY3QocEFycmF5KTsKKyAgICBpZiAobV9iRGVsYXkpIHsKKyAgICAgIEFkZERlbGF5X1JlY3QoRlBfUkVDVCwgY3JSZWN0KTsKKyAgICB9IGVsc2UgeworICAgICAgRmllbGQ6OlNldFJlY3QobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBjclJlY3QpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCUNKU19BcnJheSByY0FycmF5KG1faXNvbGF0ZSk7Ci0JCXJjQXJyYXkuU2V0RWxlbWVudCgwLFVwcGVyX0xlZnR4KTsKLQkJcmNBcnJheS5TZXRFbGVtZW50KDEsVXBwZXJfTGVmdHkpOwotCQlyY0FycmF5LlNldEVsZW1lbnQoMixMb3dlcl9SaWdodHgpOwotCQlyY0FycmF5LlNldEVsZW1lbnQoMyxMb3dlcl9SaWdodHkpOworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9CisgICAgICAgIChDUERGU0RLX0ludGVyRm9ybSopbV9wRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOworICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0KKyAgICAgICAgcEludGVyRm9ybS0+R2V0V2lkZ2V0KEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpKTsKKyAgICBpZiAoIXBXaWRnZXQpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJdnAgIDw8ICByY0FycmF5OwkJCQotCX0KKyAgICBDRlhfRmxvYXRSZWN0IGNyUmVjdCA9IHBXaWRnZXQtPkdldFJlY3QoKTsKKyAgICBVcHBlcl9MZWZ0eCA9IChpbnQzMl90KWNyUmVjdC5sZWZ0OworICAgIFVwcGVyX0xlZnR5ID0gKGludDMyX3QpY3JSZWN0LnRvcDsKKyAgICBMb3dlcl9SaWdodHggPSAoaW50MzJfdCljclJlY3QucmlnaHQ7CisgICAgTG93ZXJfUmlnaHR5ID0gKGludDMyX3QpY3JSZWN0LmJvdHRvbTsKIAotCXJldHVybiBUUlVFOworICAgIENKU19BcnJheSByY0FycmF5KHBSdW50aW1lKTsKKyAgICByY0FycmF5LlNldEVsZW1lbnQoMCwgVXBwZXJfTGVmdHgpOworICAgIHJjQXJyYXkuU2V0RWxlbWVudCgxLCBVcHBlcl9MZWZ0eSk7CisgICAgcmNBcnJheS5TZXRFbGVtZW50KDIsIExvd2VyX1JpZ2h0eCk7CisgICAgcmNBcnJheS5TZXRFbGVtZW50KDMsIExvd2VyX1JpZ2h0eSk7CisgICAgdnAgPDwgcmNBcnJheTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBGaWVsZDo6U2V0UmVjdChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGNvbnN0IENQREZfUmVjdCYgcmVjdCkKLXsKLQlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwordm9pZCBGaWVsZDo6U2V0UmVjdChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgcmVjdCkgeworICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IChDUERGU0RLX0ludGVyRm9ybSopcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKIAotCUNQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKilwRG9jdW1lbnQtPkdldEludGVyRm9ybSgpOwotCUFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPQorICAgICAgR2V0Rm9ybUZpZWxkcyhwRG9jdW1lbnQsIHN3RmllbGROYW1lKTsKKyAgZm9yIChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA6IEZpZWxkQXJyYXkpIHsKKyAgICBpZiAobkNvbnRyb2xJbmRleCA8IDApIHsKKyAgICAgIEZYX0JPT0wgYlNldCA9IEZBTFNFOworICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBpIDwgc3o7ICsraSkgeworICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGkpOworICAgICAgICBBU1NFUlQocEZvcm1Db250cm9sKTsKIAotCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCUdldEZvcm1GaWVsZHMocERvY3VtZW50LCBzd0ZpZWxkTmFtZSwgRmllbGRBcnJheSk7CisgICAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpKSB7CisgICAgICAgICAgQ1BERl9SZWN0IGNyUmVjdCA9IHJlY3Q7CiAKLQlmb3IgKGludCBpPTAsaXN6PUZpZWxkQXJyYXkuR2V0U2l6ZSgpOyBpPGlzejsgaSsrKQotCXsKLQkJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KGkpOwotCQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKyAgICAgICAgICBDUERGX1BhZ2UqIHBQREZQYWdlID0gcFdpZGdldC0+R2V0UERGUGFnZSgpOworICAgICAgICAgIGNyUmVjdC5JbnRlcnNlY3QocFBERlBhZ2UtPkdldFBhZ2VCQm94KCkpOwogCi0JCWlmIChuQ29udHJvbEluZGV4IDwgMCkKLQkJewotCQkJRlhfQk9PTCBiU2V0ID0gRkFMU0U7Ci0JCQlmb3IgKGludCBpPTAsIHN6PXBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaTxzejsgaSsrKQotCQkJewotCQkJCUNQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woaSk7Ci0JCQkJQVNTRVJUKHBGb3JtQ29udHJvbCAhPSBOVUxMKTsKLQotCQkJCWlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpKQotCQkJCXsKLQkJCQkJQ1BERl9SZWN0IGNyUmVjdCA9IHJlY3Q7Ci0KLQkJCQkJQ1BERl9QYWdlKiBwUERGUGFnZSA9IHBXaWRnZXQtPkdldFBERlBhZ2UoKTsKLQkJCQkJQVNTRVJUKHBQREZQYWdlICE9IE5VTEwpOwotCi0vLyAJCQkJCUNQREZfUGFnZSogcFBERlBhZ2UgPSBwUGFnZS0+R2V0UGFnZSgpOwotLy8gCQkJCQlBU1NFUlQocFBERlBhZ2UgIT0gTlVMTCk7Ci0KLQkJCQkJY3JSZWN0LkludGVyc2VjdChwUERGUGFnZS0+R2V0UGFnZUJCb3goKSk7Ci0KLQkJCQkJaWYgKCFjclJlY3QuSXNFbXB0eSgpKQotCQkJCQl7Ci0JCQkJCQlDUERGX1JlY3QgcmNPbGQgPSBwV2lkZ2V0LT5HZXRSZWN0KCk7Ci0JCQkJCQlpZiAoY3JSZWN0LmxlZnQgIT0gcmNPbGQubGVmdCB8fAotCQkJCQkJCWNyUmVjdC5yaWdodCAhPSByY09sZC5yaWdodCB8fAotCQkJCQkJCWNyUmVjdC50b3AgIT0gcmNPbGQudG9wIHx8Ci0JCQkJCQkJY3JSZWN0LmJvdHRvbSAhPSByY09sZC5ib3R0b20pCi0JCQkJCQl7Ci0JCQkJCQkJcFdpZGdldC0+U2V0UmVjdChjclJlY3QpOwotCQkJCQkJCWJTZXQgPSBUUlVFOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoYlNldCkgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgVFJVRSwgVFJVRSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZihuQ29udHJvbEluZGV4ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkgcmV0dXJuOwotCQkJaWYgKENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2wobkNvbnRyb2xJbmRleCkpCi0JCQl7Ci0JCQkJaWYgKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gcEludGVyRm9ybS0+R2V0V2lkZ2V0KHBGb3JtQ29udHJvbCkpCi0JCQkJewotCQkJCQlDUERGX1JlY3QgY3JSZWN0ID0gcmVjdDsKLQkJCQkJCi0JCQkJCUNQREZfUGFnZSogcFBERlBhZ2UgPSBwV2lkZ2V0LT5HZXRQREZQYWdlKCk7Ci0JCQkJCUFTU0VSVChwUERGUGFnZSAhPSBOVUxMKTsKKyAgICAgICAgICBpZiAoIWNyUmVjdC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIENQREZfUmVjdCByY09sZCA9IHBXaWRnZXQtPkdldFJlY3QoKTsKKyAgICAgICAgICAgIGlmIChjclJlY3QubGVmdCAhPSByY09sZC5sZWZ0IHx8IGNyUmVjdC5yaWdodCAhPSByY09sZC5yaWdodCB8fAorICAgICAgICAgICAgICAgIGNyUmVjdC50b3AgIT0gcmNPbGQudG9wIHx8IGNyUmVjdC5ib3R0b20gIT0gcmNPbGQuYm90dG9tKSB7CisgICAgICAgICAgICAgIHBXaWRnZXQtPlNldFJlY3QoY3JSZWN0KTsKKyAgICAgICAgICAgICAgYlNldCA9IFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CiAKLS8vIAkJCQkJQ1BERl9QYWdlKiBwUERGUGFnZSA9IHBQYWdlLT5HZXRQYWdlKCk7Ci0vLyAJCQkJCUFTU0VSVChwUERGUGFnZSAhPSBOVUxMKTsKKyAgICAgIGlmIChiU2V0KQorICAgICAgICBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBUUlVFLCBUUlVFKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKG5Db250cm9sSW5kZXggPj0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKQorICAgICAgICByZXR1cm47CisgICAgICBpZiAoQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0KKyAgICAgICAgICAgICAgcEZvcm1GaWVsZC0+R2V0Q29udHJvbChuQ29udHJvbEluZGV4KSkgeworICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1Db250cm9sKSkgeworICAgICAgICAgIENQREZfUmVjdCBjclJlY3QgPSByZWN0OwogCi0JCQkJCWNyUmVjdC5JbnRlcnNlY3QocFBERlBhZ2UtPkdldFBhZ2VCQm94KCkpOworICAgICAgICAgIENQREZfUGFnZSogcFBERlBhZ2UgPSBwV2lkZ2V0LT5HZXRQREZQYWdlKCk7CisgICAgICAgICAgY3JSZWN0LkludGVyc2VjdChwUERGUGFnZS0+R2V0UGFnZUJCb3goKSk7CiAKLQkJCQkJaWYgKCFjclJlY3QuSXNFbXB0eSgpKQotCQkJCQl7Ci0JCQkJCQlDUERGX1JlY3QgcmNPbGQgPSBwV2lkZ2V0LT5HZXRSZWN0KCk7Ci0JCQkJCQlpZiAoY3JSZWN0LmxlZnQgIT0gcmNPbGQubGVmdCB8fAotCQkJCQkJCWNyUmVjdC5yaWdodCAhPSByY09sZC5yaWdodCB8fAotCQkJCQkJCWNyUmVjdC50b3AgIT0gcmNPbGQudG9wIHx8Ci0JCQkJCQkJY3JSZWN0LmJvdHRvbSAhPSByY09sZC5ib3R0b20pCi0JCQkJCQl7Ci0JCQkJCQkJcFdpZGdldC0+U2V0UmVjdChjclJlY3QpOwotCQkJCQkJCVVwZGF0ZUZvcm1Db250cm9sKHBEb2N1bWVudCwgcEZvcm1Db250cm9sLCBUUlVFLCBUUlVFLCBUUlVFKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICAgICAgICBpZiAoIWNyUmVjdC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIENQREZfUmVjdCByY09sZCA9IHBXaWRnZXQtPkdldFJlY3QoKTsKKyAgICAgICAgICAgIGlmIChjclJlY3QubGVmdCAhPSByY09sZC5sZWZ0IHx8IGNyUmVjdC5yaWdodCAhPSByY09sZC5yaWdodCB8fAorICAgICAgICAgICAgICAgIGNyUmVjdC50b3AgIT0gcmNPbGQudG9wIHx8IGNyUmVjdC5ib3R0b20gIT0gcmNPbGQuYm90dG9tKSB7CisgICAgICAgICAgICAgIHBXaWRnZXQtPlNldFJlY3QoY3JSZWN0KTsKKyAgICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocERvY3VtZW50LCBwRm9ybUNvbnRyb2wsIFRSVUUsIFRSVUUsIFRSVUUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQogfQogCi1GWF9CT09MIEZpZWxkOjpyZXF1aXJlZChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0JQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0JR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0JaWYgKHZwLklzU2V0dGluZygpKQotCXsKLQkJaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKLQorRlhfQk9PTCBGaWVsZDo6cmVxdWlyZWQoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBGQUxTRTsKIAotCQlib29sIGJWUDsKLQkJdnAgPj4gYlZQOworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCX0KLQllbHNlCi0JewotCQlDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0JCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworICAgIGJvb2wgYlZQOworICAgIHZwID4+IGJWUDsKIAotCQlpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1BVU0hCVVRUT04pCi0JCQlyZXR1cm4gRkFMU0U7CisgIH0gZWxzZSB7CisgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX1JFUVVJUkVEKQotCQkJdnAgPDwgdHJ1ZTsKLQkJZWxzZQotCQkJdnAgPDwgZmFsc2U7Ci0JfQorICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfUkVRVUlSRUQpCisgICAgICB2cCA8PCB0cnVlOworICAgIGVsc2UKKyAgICAgIHZwIDw8IGZhbHNlOworICB9CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OnJpY2hUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIEZpZWxkOjpyaWNoVGV4dChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50KTsKIAotCWlmICh2cC5Jc1NldHRpbmcoKSkKLQl7Ci0JCWlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCWJvb2wgYlZQOwotCQl2cCA+PiBiVlA7CisgICAgYm9vbCBiVlA7CisgICAgdnAgPj4gYlZQOwogCi0JCWlmIChtX2JEZWxheSkKLQkJewotCQkJQWRkRGVsYXlfQm9vbChGUF9SSUNIVEVYVCwgYlZQKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUZpZWxkOjpTZXRSaWNoVGV4dChtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIGJWUCk7Ci0JCX0JCi0JfQotCWVsc2UKLQl7Ci0JCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotCQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfQm9vbChGUF9SSUNIVEVYVCwgYlZQKTsKKyAgICB9IGVsc2UgeworICAgICAgRmllbGQ6OlNldFJpY2hUZXh0KG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgYlZQKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgICAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0JCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1RFWFRGSUVMRCkKLQkJCXJldHVybiBGQUxTRTsKLQotCQlpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX1JJQ0hURVhUKQotCQkJdnAgPDwgdHJ1ZTsKLQkJZWxzZQotCQkJdnAgPDwgZmFsc2U7Ci0JfQorICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfUklDSFRFWFQpCisgICAgICB2cCA8PCB0cnVlOworICAgIGVsc2UKKyAgICAgIHZwIDw8IGZhbHNlOworICB9CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLXZvaWQgRmllbGQ6OlNldFJpY2hUZXh0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgYm9vbCBiKQotewotCS8vTm90IHN1cHBvcnRlZC4KK3ZvaWQgRmllbGQ6OlNldFJpY2hUZXh0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiKSB7CisgIC8vIE5vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OnJpY2hWYWx1ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIFRSVUU7Ci0JaWYgKHZwLklzU2V0dGluZygpKQotCXsKLQkJaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKLQkJOwotCX0KLQllbHNlCi0JewotCQk7Ci0JfQotCXJldHVybiBUUlVFOworRlhfQk9PTCBGaWVsZDo6cmljaFZhbHVlKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBUUlVFOwogfQogCi12b2lkIEZpZWxkOjpTZXRSaWNoVmFsdWUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4KQotewotCS8vTm90IHN1cHBvcnRlZC4KK3ZvaWQgRmllbGQ6OlNldFJpY2hWYWx1ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4KSB7CisgIC8vIE5vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OnJvdGF0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIEZpZWxkOjpyb3RhdGlvbihJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50KTsKIAotCWlmICh2cC5Jc1NldHRpbmcoKSkKLQl7Ci0JCWlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCWludCBuVlA7Ci0JCXZwID4+IG5WUDsKKyAgICBpbnQgblZQOworICAgIHZwID4+IG5WUDsKIAotCQlpZiAobV9iRGVsYXkpCi0JCXsKLQkJCUFkZERlbGF5X0ludChGUF9ST1RBVElPTiwgblZQKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUZpZWxkOjpTZXRSb3RhdGlvbihtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIG5WUCk7Ci0JCX0JCi0JfQotCWVsc2UKLQl7Ci0JCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotCQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfSW50KEZQX1JPVEFUSU9OLCBuVlApOworICAgIH0gZWxzZSB7CisgICAgICBGaWVsZDo6U2V0Um90YXRpb24obV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBuVlApOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLQkJQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLQkJQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0JCWlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7CisgICAgaWYgKCFwRm9ybUNvbnRyb2wpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJdnAgPDwgKEZYX0lOVDMyKXBGb3JtQ29udHJvbC0+R2V0Um90YXRpb24oKTsKLQl9CisgICAgdnAgPDwgKGludDMyX3QpcEZvcm1Db250cm9sLT5HZXRSb3RhdGlvbigpOworICB9CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLXZvaWQgRmllbGQ6OlNldFJvdGF0aW9uKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgaW50IG51bWJlcikKLXsKLQkvL05vdCBzdXBwb3J0ZWQuCit2b2lkIEZpZWxkOjpTZXRSb3RhdGlvbihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6c3Ryb2tlQ29sb3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgRmllbGQ6OnN0cm9rZUNvbG9yKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBDSlNfUnVudGltZTo6RnJvbUNvbnRleHQoY2MpOworICBDSlNfQXJyYXkgY3JBcnJheShwUnVudGltZSk7CiAKLQlpZiAodnAuSXNTZXR0aW5nKCkpCi0JewotCQlpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlpZiAoIXZwLklzQXJyYXlPYmplY3QoKSlyZXR1cm4gRkFMU0U7CisgICAgaWYgKCF2cC5Jc0FycmF5T2JqZWN0KCkpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJQ0pTX0FycmF5IGNyQXJyYXkobV9pc29sYXRlKTsKLQkJdnAgPj4gY3JBcnJheTsKKyAgICB2cCA+PiBjckFycmF5OwogCi0JCUNQV0xfQ29sb3IgY29sb3I7Ci0JCWNvbG9yOjpDb252ZXJ0QXJyYXlUb1BXTENvbG9yKGNyQXJyYXksIGNvbG9yKTsKKyAgICBDUFdMX0NvbG9yIGNvbG9yOworICAgIGNvbG9yOjpDb252ZXJ0QXJyYXlUb1BXTENvbG9yKGNyQXJyYXksIGNvbG9yKTsKIAotCQlpZiAobV9iRGVsYXkpCi0JCXsKLQkJCUFkZERlbGF5X0NvbG9yKEZQX1NUUk9LRUNPTE9SLCBjb2xvcik7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlGaWVsZDo6U2V0U3Ryb2tlQ29sb3IobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBjb2xvcik7Ci0JCX0JCi0JfQotCWVsc2UKLQl7Ci0JCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotCQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfQ29sb3IoRlBfU1RST0tFQ09MT1IsIGNvbG9yKTsKKyAgICB9IGVsc2UgeworICAgICAgRmllbGQ6OlNldFN0cm9rZUNvbG9yKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcik7CisgICAgfQorICB9IGVsc2UgeworICAgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICAgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotCQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7CisgICAgaWYgKCFwRm9ybUNvbnRyb2wpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0JCWlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKKyAgICBpbnQgaUNvbG9yVHlwZTsKKyAgICBwRm9ybUNvbnRyb2wtPkdldEJvcmRlckNvbG9yKGlDb2xvclR5cGUpOwogCi0JCWludCBpQ29sb3JUeXBlOwotCQlwRm9ybUNvbnRyb2wtPkdldEJvcmRlckNvbG9yKGlDb2xvclR5cGUpOwotCi0JCUNQV0xfQ29sb3IgY29sb3I7Ci0KLQkJaWYgKGlDb2xvclR5cGUgPT0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UKQotCQl7Ci0JCQljb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX1RSQU5TUEFSRU5UKTsKLQkJfQotCQllbHNlIGlmIChpQ29sb3JUeXBlID09IENPTE9SVFlQRV9HUkFZKQotCQl7Ci0JCQljb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcigwKSk7Ci0JCX0KLQkJZWxzZSBpZiAoaUNvbG9yVHlwZSA9PSBDT0xPUlRZUEVfUkdCKQotCQl7Ci0JCQljb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJvcmRlckNvbG9yKDApLAotCQkJCXBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcigxKSwKLQkJCQlwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQm9yZGVyQ29sb3IoMikpOwotCQl9Ci0JCWVsc2UgaWYgKGlDb2xvclR5cGUgPT0gQ09MT1JUWVBFX0NNWUspCi0JCXsKLQkJCWNvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfQ01ZSywgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJvcmRlckNvbG9yKDApLAotCQkJCXBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcigxKSwKLQkJCQlwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQm9yZGVyQ29sb3IoMiksCi0JCQkJcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJvcmRlckNvbG9yKDMpKTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gRkFMU0U7Ci0KLQkJQ0pTX0FycmF5IGNyQXJyYXkobV9pc29sYXRlKTsKLQkJY29sb3I6OkNvbnZlcnRQV0xDb2xvclRvQXJyYXkoY29sb3IsIGNyQXJyYXkpOwotICAgICAgICB2cCAgPDwgIGNyQXJyYXk7Ci0JfQorICAgIENQV0xfQ29sb3IgY29sb3I7CisgICAgaWYgKGlDb2xvclR5cGUgPT0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UKSB7CisgICAgICBjb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX1RSQU5TUEFSRU5UKTsKKyAgICB9IGVsc2UgaWYgKGlDb2xvclR5cGUgPT0gQ09MT1JUWVBFX0dSQVkpIHsKKyAgICAgIGNvbG9yID0KKyAgICAgICAgICBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQm9yZGVyQ29sb3IoMCkpOworICAgIH0gZWxzZSBpZiAoaUNvbG9yVHlwZSA9PSBDT0xPUlRZUEVfUkdCKSB7CisgICAgICBjb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJvcmRlckNvbG9yKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcigxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQm9yZGVyQ29sb3IoMikpOworICAgIH0gZWxzZSBpZiAoaUNvbG9yVHlwZSA9PSBDT0xPUlRZUEVfQ01ZSykgeworICAgICAgY29sb3IgPQorICAgICAgICAgIENQV0xfQ29sb3IoQ09MT1JUWVBFX0NNWUssIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcigwKSwKKyAgICAgICAgICAgICAgICAgICAgIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcigxKSwKKyAgICAgICAgICAgICAgICAgICAgIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcigyKSwKKyAgICAgICAgICAgICAgICAgICAgIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcigzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CiAKLQlyZXR1cm4gVFJVRTsKKyAgICBjb2xvcjo6Q29udmVydFBXTENvbG9yVG9BcnJheShjb2xvciwgY3JBcnJheSk7CisgICAgdnAgPDwgY3JBcnJheTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBGaWVsZDo6U2V0U3Ryb2tlQ29sb3IoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikKLXsKLQkvL05vdCBzdXBwb3J0ZWQuCit2b2lkIEZpZWxkOjpTZXRTdHJva2VDb2xvcihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKSB7CisgIC8vIE5vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OnN0eWxlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIEZpZWxkOjpzdHlsZShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQVNTRVJUKG1fcERvY3VtZW50KTsKIAotCWlmICh2cC5Jc1NldHRpbmcoKSkKLQl7Ci0JCWlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCUNGWF9CeXRlU3RyaW5nIGNzQkNhcHRpb247Ci0JCXZwID4+IGNzQkNhcHRpb247CisgICAgQ0ZYX0J5dGVTdHJpbmcgY3NCQ2FwdGlvbjsKKyAgICB2cCA+PiBjc0JDYXB0aW9uOwogCi0JCWlmIChtX2JEZWxheSkKLQkJewotCQkJQWRkRGVsYXlfU3RyaW5nKEZQX1NUWUxFLCBjc0JDYXB0aW9uKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUZpZWxkOjpTZXRTdHlsZShtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIGNzQkNhcHRpb24pOwotCQl9CQotCX0KLQllbHNlCi0JewotCQlDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLQkJR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLQkJaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAobV9iRGVsYXkpIHsKKyAgICAgIEFkZERlbGF5X1N0cmluZyhGUF9TVFlMRSwgY3NCQ2FwdGlvbik7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXRTdHlsZShtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgY3NCQ2FwdGlvbik7CisgICAgfQorICB9IGVsc2UgeworICAgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICAgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotCQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9SQURJT0JVVFRPTiAmJgorICAgICAgICBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ0hFQ0tCT1gpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CiAKLQkJaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9SQURJT0JVVFRPTiAmJiAKLQkJCXBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9DSEVDS0JPWCkKLQkJCXJldHVybiBGQUxTRTsKLQotCQlDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLQkJaWYgKCFwRm9ybUNvbnRyb2wpIHJldHVybiBGQUxTRTsKKyAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKKyAgICBpZiAoIXBGb3JtQ29udHJvbCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlDRlhfV2lkZVN0cmluZyBjc1dDYXB0aW9uID0gcEZvcm1Db250cm9sLT5HZXROb3JtYWxDYXB0aW9uKCk7Ci0JCUNGWF9CeXRlU3RyaW5nIGNzQkNhcHRpb247CisgICAgQ0ZYX1dpZGVTdHJpbmcgY3NXQ2FwdGlvbiA9IHBGb3JtQ29udHJvbC0+R2V0Tm9ybWFsQ2FwdGlvbigpOworICAgIENGWF9CeXRlU3RyaW5nIGNzQkNhcHRpb247CiAKLQkJc3dpdGNoIChjc1dDYXB0aW9uWzBdKQotCQl7Ci0JCQljYXNlIEwnbCc6Ci0JCQkJY3NCQ2FwdGlvbiA9ICJjaXJjbGUiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBMJzgnOgotCQkJCWNzQkNhcHRpb24gPSAiY3Jvc3MiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBMJ3UnOgotCQkJCWNzQkNhcHRpb24gPSAiZGlhbW9uZCI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEwnbic6Ci0JCQkJY3NCQ2FwdGlvbiA9ICJzcXVhcmUiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBMJ0gnOgotCQkJCWNzQkNhcHRpb24gPSAic3RhciI7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OiAvL0wnNCcKLQkJCQljc0JDYXB0aW9uID0gImNoZWNrIjsKLQkJCQlicmVhazsKLQkJfQotCQl2cCA8PCBjc0JDYXB0aW9uOwotCX0KKyAgICBzd2l0Y2ggKGNzV0NhcHRpb25bMF0pIHsKKyAgICAgIGNhc2UgTCdsJzoKKyAgICAgICAgY3NCQ2FwdGlvbiA9ICJjaXJjbGUiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTCc4JzoKKyAgICAgICAgY3NCQ2FwdGlvbiA9ICJjcm9zcyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBMJ3UnOgorICAgICAgICBjc0JDYXB0aW9uID0gImRpYW1vbmQiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTCduJzoKKyAgICAgICAgY3NCQ2FwdGlvbiA9ICJzcXVhcmUiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTCdIJzoKKyAgICAgICAgY3NCQ2FwdGlvbiA9ICJzdGFyIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiAgLy8gTCc0JworICAgICAgICBjc0JDYXB0aW9uID0gImNoZWNrIjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHZwIDw8IGNzQkNhcHRpb247CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBGaWVsZDo6U2V0U3R5bGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCAKLQkJCQkJIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpCi17Ci0JLy9Ob3Qgc3VwcG9ydGVkLgordm9pZCBGaWVsZDo6U2V0U3R5bGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKSB7CisgIC8vIE5vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OnN1Ym1pdE5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBUUlVFOworRlhfQk9PTCBGaWVsZDo6c3VibWl0TmFtZShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIEZpZWxkOjp0ZXh0Q29sb3IoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgRmllbGQ6OnRleHRDb2xvcihJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBDSlNfUnVudGltZTo6RnJvbUNvbnRleHQoY2MpOworICBDSlNfQXJyYXkgY3JBcnJheShwUnVudGltZSk7CiAKLQlpZiAodnAuSXNTZXR0aW5nKCkpCi0JewotCQlpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlDSlNfQXJyYXkgY3JBcnJheShtX2lzb2xhdGUpOwotCQlpZiAoIXZwLklzQXJyYXlPYmplY3QoKSlyZXR1cm4gRkFMU0U7Ci0JCXZwID4+IGNyQXJyYXk7CisgICAgaWYgKCF2cC5Jc0FycmF5T2JqZWN0KCkpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJQ1BXTF9Db2xvciBjb2xvcjsKLQkJY29sb3I6OkNvbnZlcnRBcnJheVRvUFdMQ29sb3IoY3JBcnJheSwgY29sb3IpOworICAgIHZwID4+IGNyQXJyYXk7CiAKLQkJaWYgKG1fYkRlbGF5KQotCQl7Ci0JCQlBZGREZWxheV9Db2xvcihGUF9URVhUQ09MT1IsIGNvbG9yKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUZpZWxkOjpTZXRUZXh0Q29sb3IobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBjb2xvcik7Ci0JCX0JCi0JfQotCWVsc2UKLQl7Ci0JCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotCQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgIENQV0xfQ29sb3IgY29sb3I7CisgICAgY29sb3I6OkNvbnZlcnRBcnJheVRvUFdMQ29sb3IoY3JBcnJheSwgY29sb3IpOwogCi0JCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLQkJQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisgICAgaWYgKG1fYkRlbGF5KSB7CisgICAgICBBZGREZWxheV9Db2xvcihGUF9URVhUQ09MT1IsIGNvbG9yKTsKKyAgICB9IGVsc2UgeworICAgICAgRmllbGQ6OlNldFRleHRDb2xvcihtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsIGNvbG9yKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgICAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLQkJaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIEZBTFNFOwotCQkKLQkJaW50IGlDb2xvclR5cGU7Ci0JCUZYX0FSR0IgY29sb3I7Ci0JCUNQREZfRGVmYXVsdEFwcGVhcmFuY2UgRmllbGRBcHBlYXJhbmNlID0gcEZvcm1Db250cm9sLT5HZXREZWZhdWx0QXBwZWFyYW5jZSgpOwotCQlGaWVsZEFwcGVhcmFuY2UuR2V0Q29sb3IoY29sb3IsIGlDb2xvclR5cGUpOwotCQlGWF9JTlQzMiBhLHIsZyxiOwotCQlBcmdiRGVjb2RlKGNvbG9yLCBhLCByLCBnLCBiKTsKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7CisgICAgaWYgKCFwRm9ybUNvbnRyb2wpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJQ1BXTF9Db2xvciBjclJldCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgciAvIDI1NS4wZiwKLQkJCQlnIC8gMjU1LjBmLAotCQkJCWIgLyAyNTUuMGYpOworICAgIGludCBpQ29sb3JUeXBlOworICAgIEZYX0FSR0IgY29sb3I7CisgICAgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSBGaWVsZEFwcGVhcmFuY2UgPQorICAgICAgICBwRm9ybUNvbnRyb2wtPkdldERlZmF1bHRBcHBlYXJhbmNlKCk7CisgICAgRmllbGRBcHBlYXJhbmNlLkdldENvbG9yKGNvbG9yLCBpQ29sb3JUeXBlKTsKKyAgICBpbnQzMl90IGEsIHIsIGcsIGI7CisgICAgQXJnYkRlY29kZShjb2xvciwgYSwgciwgZywgYik7CiAKLQkJaWYgKGlDb2xvclR5cGUgPT0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UKQotCQkJY3JSZXQgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9UUkFOU1BBUkVOVCk7CisgICAgQ1BXTF9Db2xvciBjclJldCA9CisgICAgICAgIENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgciAvIDI1NS4wZiwgZyAvIDI1NS4wZiwgYiAvIDI1NS4wZik7CiAKLQkJQ0pTX0FycmF5IGNyQXJyYXkobV9pc29sYXRlKTsKLQkJY29sb3I6OkNvbnZlcnRQV0xDb2xvclRvQXJyYXkoY3JSZXQsIGNyQXJyYXkpOwotICAgICAgICB2cCAgPDwgIGNyQXJyYXk7CQkKLQl9CisgICAgaWYgKGlDb2xvclR5cGUgPT0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UKQorICAgICAgY3JSZXQgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9UUkFOU1BBUkVOVCk7CiAKLQlyZXR1cm4gVFJVRTsKKyAgICBjb2xvcjo6Q29udmVydFBXTENvbG9yVG9BcnJheShjclJldCwgY3JBcnJheSk7CisgICAgdnAgPDwgY3JBcnJheTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBGaWVsZDo6U2V0VGV4dENvbG9yKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpCi17Ci0JLy9Ob3Qgc3VwcG9ydGVkLgordm9pZCBGaWVsZDo6U2V0VGV4dENvbG9yKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6dGV4dEZvbnQoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgRmllbGQ6OnRleHRGb250KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQpOwogCi0JaWYgKHZwLklzU2V0dGluZygpKQotCXsKLQkJaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKCFtX2JDYW5TZXQpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZTsKLQkJdnAgPj4gY3NGb250TmFtZTsKLQkJaWYgKGNzRm9udE5hbWUuSXNFbXB0eSgpKSByZXR1cm4gRkFMU0U7CisgICAgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZTsKKyAgICB2cCA+PiBjc0ZvbnROYW1lOworICAgIGlmIChjc0ZvbnROYW1lLklzRW1wdHkoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlpZiAobV9iRGVsYXkpCi0JCXsKLQkJCUFkZERlbGF5X1N0cmluZyhGUF9URVhURk9OVCwgY3NGb250TmFtZSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlGaWVsZDo6U2V0VGV4dEZvbnQobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBjc0ZvbnROYW1lKTsKLQkJfQkKLQl9Ci0JZWxzZQotCXsKLQkJQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0JCUdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0JCWlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7Ci0KLQkJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotCQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKyAgICBpZiAobV9iRGVsYXkpIHsKKyAgICAgIEFkZERlbGF5X1N0cmluZyhGUF9URVhURk9OVCwgY3NGb250TmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZpZWxkOjpTZXRUZXh0Rm9udChtX3BEb2N1bWVudCwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY3NGb250TmFtZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICAgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLQkJQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0JCWlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKKyAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgICAgQVNTRVJUKHBGb3JtRmllbGQpOworICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOworICAgIGlmICghcEZvcm1Db250cm9sKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCWludCBuRmllbGRUeXBlID0gcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCk7CisgICAgaW50IG5GaWVsZFR5cGUgPSBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKTsKIAotCQlpZiAobkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfUFVTSEJVVFRPTiB8fCAKLQkJCW5GaWVsZFR5cGUgPT0gRklFTERUWVBFX0NPTUJPQk9YIHx8IAotCQkJbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfTElTVEJPWCB8fAotCQkJbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfVEVYVEZJRUxEKQotCQl7Ci0JCQlDUERGX0ZvbnQgKiBwRm9udCA9IHBGb3JtQ29udHJvbC0+R2V0RGVmYXVsdENvbnRyb2xGb250KCk7Ci0JCQlpZiAoIXBGb250KSByZXR1cm4gRkFMU0U7CisgICAgaWYgKG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX1BVU0hCVVRUT04gfHwKKyAgICAgICAgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1ggfHwgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfTElTVEJPWCB8fAorICAgICAgICBuRmllbGRUeXBlID09IEZJRUxEVFlQRV9URVhURklFTEQpIHsKKyAgICAgIENQREZfRm9udCogcEZvbnQgPSBwRm9ybUNvbnRyb2wtPkdldERlZmF1bHRDb250cm9sRm9udCgpOworICAgICAgaWYgKCFwRm9udCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCQl2cCA8PCBwRm9udC0+R2V0QmFzZUZvbnQoKTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gRkFMU0U7Ci0JfQorICAgICAgdnAgPDwgcEZvbnQtPkdldEJhc2VGb250KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBGaWVsZDo6U2V0VGV4dEZvbnQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIGludCBuQ29udHJvbEluZGV4LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKQotewotCS8vTm90IHN1cHBvcnRlZC4KK3ZvaWQgRmllbGQ6OlNldFRleHRGb250KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZykgeworICAvLyBOb3Qgc3VwcG9ydGVkLgogfQogCi1GWF9CT09MIEZpZWxkOjp0ZXh0U2l6ZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworRlhfQk9PTCBGaWVsZDo6dGV4dFNpemUoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCk7CiAKLQlpZiAodnAuSXNTZXR0aW5nKCkpCi0JewotCQlpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlpbnQgblZQOwotCQl2cCA+PiBuVlA7CisgICAgaW50IG5WUDsKKyAgICB2cCA+PiBuVlA7CiAKLQkJaWYgKG1fYkRlbGF5KQotCQl7Ci0JCQlBZGREZWxheV9JbnQoRlBfVEVYVFNJWkUsIG5WUCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlGaWVsZDo6U2V0VGV4dFNpemUobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBuVlApOwotCQl9CQotCX0KLQllbHNlCi0JewotCQlDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLQkJR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLQkJaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKLQotCQlDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0JCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworICAgIGlmIChtX2JEZWxheSkgeworICAgICAgQWRkRGVsYXlfSW50KEZQX1RFWFRTSVpFLCBuVlApOworICAgIH0gZWxzZSB7CisgICAgICBGaWVsZDo6U2V0VGV4dFNpemUobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBuVlApOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCUNQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotCQlpZiAoIXBGb3JtQ29udHJvbClyZXR1cm4gRkFMU0U7CisgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICAgIEFTU0VSVChwRm9ybUZpZWxkKTsKKyAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKKyAgICBpZiAoIXBGb3JtQ29udHJvbCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlDUERGX0RlZmF1bHRBcHBlYXJhbmNlIEZpZWxkQXBwZWFyYW5jZSA9IHBGb3JtQ29udHJvbC0+R2V0RGVmYXVsdEFwcGVhcmFuY2UoKTsKKyAgICBDUERGX0RlZmF1bHRBcHBlYXJhbmNlIEZpZWxkQXBwZWFyYW5jZSA9CisgICAgICAgIHBGb3JtQ29udHJvbC0+R2V0RGVmYXVsdEFwcGVhcmFuY2UoKTsKIAotCQlDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lVGFnOwotCQlGWF9GTE9BVCBmRm9udFNpemU7Ci0JCUZpZWxkQXBwZWFyYW5jZS5HZXRGb250KGNzRm9udE5hbWVUYWcsZkZvbnRTaXplKTsKKyAgICBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lVGFnOworICAgIEZYX0ZMT0FUIGZGb250U2l6ZTsKKyAgICBGaWVsZEFwcGVhcmFuY2UuR2V0Rm9udChjc0ZvbnROYW1lVGFnLCBmRm9udFNpemUpOwogCi0JCXZwIDw8IChpbnQpZkZvbnRTaXplOwotCX0KKyAgICB2cCA8PCAoaW50KWZGb250U2l6ZTsKKyAgfQogCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi12b2lkIEZpZWxkOjpTZXRUZXh0U2l6ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgsIGludCBudW1iZXIpCi17Ci0JLy9Ob3Qgc3VwcG9ydGVkLgordm9pZCBGaWVsZDo6U2V0VGV4dFNpemUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyKSB7CisgIC8vIE5vdCBzdXBwb3J0ZWQuCiB9CiAKLUZYX0JPT0wgRmllbGQ6OnR5cGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgRmllbGQ6OnR5cGUoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAoIXZwLklzR2V0dGluZygpKQorICAgIHJldHVybiBGQUxTRTsKIAotCWlmICghdnAuSXNHZXR0aW5nKCkpIHJldHVybiBGQUxTRTsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0JR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIHN3aXRjaCAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkpIHsKKyAgICBjYXNlIEZJRUxEVFlQRV9VTktOT1dOOgorICAgICAgdnAgPDwgTCJ1bmtub3duIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046CisgICAgICB2cCA8PCBMImJ1dHRvbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZJRUxEVFlQRV9DSEVDS0JPWDoKKyAgICAgIHZwIDw8IEwiY2hlY2tib3giOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046CisgICAgICB2cCA8PCBMInJhZGlvYnV0dG9uIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRklFTERUWVBFX0NPTUJPQk9YOgorICAgICAgdnAgPDwgTCJjb21ib2JveCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZJRUxEVFlQRV9MSVNUQk9YOgorICAgICAgdnAgPDwgTCJsaXN0Ym94IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRklFTERUWVBFX1RFWFRGSUVMRDoKKyAgICAgIHZwIDw8IEwidGV4dCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZJRUxEVFlQRV9TSUdOQVRVUkU6CisgICAgICB2cCA8PCBMInNpZ25hdHVyZSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdnAgPDwgTCJ1bmtub3duIjsKKyAgICAgIGJyZWFrOworICB9CiAKLSAJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0Jc3dpdGNoIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSkKLQl7Ci0JCWNhc2UgRklFTERUWVBFX1VOS05PV046Ci0JCQl2cCA8PCBMInVua25vd24iOwotCQkJYnJlYWs7Ci0JCWNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046Ci0JCQl2cCA8PCBMImJ1dHRvbiI7Ci0JCQlicmVhazsKLQkJY2FzZSBGSUVMRFRZUEVfQ0hFQ0tCT1g6Ci0JCQl2cCA8PCBMImNoZWNrYm94IjsKLQkJCWJyZWFrOwotCQljYXNlIEZJRUxEVFlQRV9SQURJT0JVVFRPTjoKLQkJCXZwIDw8IEwicmFkaW9idXR0b24iOwotCQkJYnJlYWs7Ci0JCWNhc2UgRklFTERUWVBFX0NPTUJPQk9YOgotCQkJdnAgPDwgTCJjb21ib2JveCI7Ci0JCQlicmVhazsKLQkJY2FzZSBGSUVMRFRZUEVfTElTVEJPWDoKLQkJCXZwIDw8IEwibGlzdGJveCI7Ci0JCQlicmVhazsKLQkJY2FzZSBGSUVMRFRZUEVfVEVYVEZJRUxEOgotCQkJdnAgPDwgTCJ0ZXh0IjsKLQkJCWJyZWFrOwotCQljYXNlIEZJRUxEVFlQRV9TSUdOQVRVUkU6Ci0JCQl2cCA8PCBMInNpZ25hdHVyZSI7Ci0JCQlicmVhazsKLQkJZGVmYXVsdCA6Ci0JCQl2cCA8PCBMInVua25vd24iOwotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIEZpZWxkOjp1c2VyTmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworRlhfQk9PTCBGaWVsZDo6dXNlck5hbWUoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIEFTU0VSVChtX3BEb2N1bWVudCk7CiAKLSAgCWlmICh2cC5Jc1NldHRpbmcoKSkKLQl7Ci0JCWlmICghbV9iQ2FuU2V0KSByZXR1cm4gRkFMU0U7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIGlmICghbV9iQ2FuU2V0KQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCUNGWF9XaWRlU3RyaW5nIHN3TmFtZTsKLQkJdnAgPj4gc3dOYW1lOworICAgIENGWF9XaWRlU3RyaW5nIHN3TmFtZTsKKyAgICB2cCA+PiBzd05hbWU7CiAKLQkJaWYgKG1fYkRlbGF5KQotCQl7Ci0JCQlBZGREZWxheV9XaWRlU3RyaW5nKEZQX1VTRVJOQU1FLCBzd05hbWUpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJRmllbGQ6OlNldFVzZXJOYW1lKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgc3dOYW1lKTsKLQkJfQkKLQl9Ci0JZWxzZQotCXsKLQkJQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0JCUdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0JCWlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7Ci0KLSAJCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLQkJQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisgICAgaWYgKG1fYkRlbGF5KSB7CisgICAgICBBZGREZWxheV9XaWRlU3RyaW5nKEZQX1VTRVJOQU1FLCBzd05hbWUpOworICAgIH0gZWxzZSB7CisgICAgICBGaWVsZDo6U2V0VXNlck5hbWUobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBzd05hbWUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCXZwIDw8IChDRlhfV2lkZVN0cmluZylwRm9ybUZpZWxkLT5HZXRBbHRlcm5hdGVOYW1lKCk7Ci0JfQorICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgICB2cCA8PCAoQ0ZYX1dpZGVTdHJpbmcpcEZvcm1GaWVsZC0+R2V0QWx0ZXJuYXRlTmFtZSgpOworICB9CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLXZvaWQgRmllbGQ6OlNldFVzZXJOYW1lKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZykKLXsKLQkvL05vdCBzdXBwb3J0ZWQuCit2b2lkIEZpZWxkOjpTZXRVc2VyTmFtZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KIH0KIAotRlhfQk9PTCBGaWVsZDo6dmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgRmllbGQ6OnZhbHVlKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBDSlNfUnVudGltZTo6RnJvbUNvbnRleHQoY2MpOwogCi0JaWYgKHZwLklzU2V0dGluZygpKQotCXsJCQotCQlpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBpZiAoIW1fYkNhblNldCkKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQlDSlNfV2lkZVN0cmluZ0FycmF5IHN0ckFycmF5OworICAgIENKU19XaWRlU3RyaW5nQXJyYXkgc3RyQXJyYXk7CiAKLQkJaWYgKHZwLklzQXJyYXlPYmplY3QoKSkKLQkJewotCQkJQ0pTX0FycmF5IFZhbHVlQXJyYXkobV9pc29sYXRlKTsKLQkJCXZwLkNvbnZlcnRUb0FycmF5KFZhbHVlQXJyYXkpOwotCQkJZm9yIChpbnQgaSA9IDAsc3ogPSBWYWx1ZUFycmF5LkdldExlbmd0aCgpOyBpIDwgc3o7IGkrKykKLQkJCXsKLQkJCQlDSlNfVmFsdWUgRWxlbWVudFZhbHVlKG1faXNvbGF0ZSk7Ci0JCQkJVmFsdWVBcnJheS5HZXRFbGVtZW50KGksIEVsZW1lbnRWYWx1ZSk7Ci0JCQkJc3RyQXJyYXkuQWRkKEVsZW1lbnRWYWx1ZS5Ub0NGWFdpZGVTdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlDRlhfV2lkZVN0cmluZyBzd1ZhbHVlOwotCQkJdnAgPj4gc3dWYWx1ZTsKKyAgICBpZiAodnAuSXNBcnJheU9iamVjdCgpKSB7CisgICAgICBDSlNfQXJyYXkgVmFsdWVBcnJheShwUnVudGltZSk7CisgICAgICB2cC5Db252ZXJ0VG9BcnJheShWYWx1ZUFycmF5KTsKKyAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IFZhbHVlQXJyYXkuR2V0TGVuZ3RoKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICAgIENKU19WYWx1ZSBFbGVtZW50VmFsdWUocFJ1bnRpbWUpOworICAgICAgICBWYWx1ZUFycmF5LkdldEVsZW1lbnQoaSwgRWxlbWVudFZhbHVlKTsKKyAgICAgICAgc3RyQXJyYXkuQWRkKEVsZW1lbnRWYWx1ZS5Ub0NGWFdpZGVTdHJpbmcoKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIENGWF9XaWRlU3RyaW5nIHN3VmFsdWU7CisgICAgICB2cCA+PiBzd1ZhbHVlOworICAgICAgc3RyQXJyYXkuQWRkKHN3VmFsdWUpOworICAgIH0KIAotCQkJc3RyQXJyYXkuQWRkKHN3VmFsdWUpOwotCQl9CisgICAgaWYgKG1fYkRlbGF5KSB7CisgICAgICBBZGREZWxheV9XaWRlU3RyaW5nQXJyYXkoRlBfVkFMVUUsIHN0ckFycmF5KTsKKyAgICB9IGVsc2UgeworICAgICAgRmllbGQ6OlNldFZhbHVlKG1fcERvY3VtZW50LCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwgc3RyQXJyYXkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JCWlmIChtX2JEZWxheSkKLQkJewotCQkJQWRkRGVsYXlfV2lkZVN0cmluZ0FycmF5KEZQX1ZBTFVFLCBzdHJBcnJheSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlGaWVsZDo6U2V0VmFsdWUobV9wRG9jdW1lbnQsIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LCBzdHJBcnJheSk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0JCUdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0JCWlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICAgIHN3aXRjaCAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkpIHsKKyAgICAgIGNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIGNhc2UgRklFTERUWVBFX0NPTUJPQk9YOgorICAgICAgY2FzZSBGSUVMRFRZUEVfVEVYVEZJRUxEOiB7CisgICAgICAgIENGWF9XaWRlU3RyaW5nIHN3VmFsdWUgPSBwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpOwogCi0gCQlDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0JCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworICAgICAgICBkb3VibGUgZFJldDsKKyAgICAgICAgRlhfQk9PTCBiRG90OworICAgICAgICBpZiAoQ0pTX1B1YmxpY01ldGhvZHM6OkNvbnZlcnRTdHJpbmdUb051bWJlcihzd1ZhbHVlLmNfc3RyKCksIGRSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEb3QpKSB7CisgICAgICAgICAgaWYgKGJEb3QpCisgICAgICAgICAgICB2cCA8PCBkUmV0OworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZwIDw8IGRSZXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdnAgPDwgc3dWYWx1ZTsKKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgRklFTERUWVBFX0xJU1RCT1g6IHsKKyAgICAgICAgaWYgKHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpID4gMSkgeworICAgICAgICAgIENKU19BcnJheSBWYWx1ZUFycmF5KHBSdW50aW1lKTsKKyAgICAgICAgICBDSlNfVmFsdWUgRWxlbWVudFZhbHVlKHBSdW50aW1lKTsKKyAgICAgICAgICBpbnQgaUluZGV4OworICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpOyBpIDwgc3o7IGkrKykgeworICAgICAgICAgICAgaUluZGV4ID0gcEZvcm1GaWVsZC0+R2V0U2VsZWN0ZWRJbmRleChpKTsKKyAgICAgICAgICAgIEVsZW1lbnRWYWx1ZSA9IHBGb3JtRmllbGQtPkdldE9wdGlvblZhbHVlKGlJbmRleCkuY19zdHIoKTsKKyAgICAgICAgICAgIGlmIChGWFNZU193Y3NsZW4oRWxlbWVudFZhbHVlLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCkpID09IDApCisgICAgICAgICAgICAgIEVsZW1lbnRWYWx1ZSA9IHBGb3JtRmllbGQtPkdldE9wdGlvbkxhYmVsKGlJbmRleCkuY19zdHIoKTsKKyAgICAgICAgICAgIFZhbHVlQXJyYXkuU2V0RWxlbWVudChpLCBFbGVtZW50VmFsdWUpOworICAgICAgICAgIH0KKyAgICAgICAgICB2cCA8PCBWYWx1ZUFycmF5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHN3VmFsdWUgPSBwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpOwogCi0KLQotCQlzd2l0Y2ggKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpKQotCQl7Ci0JCWNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCWNhc2UgRklFTERUWVBFX0NPTUJPQk9YOgotCQljYXNlIEZJRUxEVFlQRV9URVhURklFTEQ6Ci0JCQl7Ci0JCQkJQ0ZYX1dpZGVTdHJpbmcgc3dWYWx1ZSA9IHBGb3JtRmllbGQtPkdldFZhbHVlKCk7CisgICAgICAgICAgZG91YmxlIGRSZXQ7CisgICAgICAgICAgRlhfQk9PTCBiRG90OworICAgICAgICAgIGlmIChDSlNfUHVibGljTWV0aG9kczo6Q29udmVydFN0cmluZ1RvTnVtYmVyKHN3VmFsdWUuY19zdHIoKSwgZFJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRG90KSkgeworICAgICAgICAgICAgaWYgKGJEb3QpCisgICAgICAgICAgICAgIHZwIDw8IGRSZXQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHZwIDw8IGRSZXQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZwIDw8IHN3VmFsdWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBGSUVMRFRZUEVfQ0hFQ0tCT1g6CisgICAgICBjYXNlIEZJRUxEVFlQRV9SQURJT0JVVFRPTjogeworICAgICAgICBGWF9CT09MIGJGaW5kID0gRkFMU0U7CisgICAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgICBpZiAoIXBGb3JtRmllbGQtPkdldENvbnRyb2woaSktPklzQ2hlY2tlZCgpKQorICAgICAgICAgICAgY29udGludWU7CiAKLQkJCQlkb3VibGUgZFJldDsKLQkJCQlGWF9CT09MIGJEb3Q7Ci0JCQkJaWYgKENKU19QdWJsaWNNZXRob2RzOjpDb252ZXJ0U3RyaW5nVG9OdW1iZXIoc3dWYWx1ZS5jX3N0cigpLCBkUmV0LCBiRG90KSkKLQkJCQl7Ci0JCQkJCWlmIChiRG90KQotCQkJCQkJdnAgPDwgZFJldDsKLQkJCQkJZWxzZQotCQkJCQkJdnAgPDwgZFJldDsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQl2cCA8PCBzd1ZhbHVlOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgRklFTERUWVBFX0xJU1RCT1g6Ci0JCQl7Ci0JCQkJaWYgKHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpID4gMSkKLQkJCQl7Ci0JCQkJCUNKU19BcnJheSBWYWx1ZUFycmF5KG1faXNvbGF0ZSk7Ci0JCQkJCUNKU19WYWx1ZSBFbGVtZW50VmFsdWUobV9pc29sYXRlKTsKLQkJCQkJaW50IGlJbmRleDsKLQkJCQkJZm9yIChpbnQgaSA9IDAsIHN6ID0gcEZvcm1GaWVsZC0+Q291bnRTZWxlY3RlZEl0ZW1zKCk7IGkgPCBzejsgaSsrKQotCQkJCQl7Ci0JCQkJCQlpSW5kZXggPSBwRm9ybUZpZWxkLT5HZXRTZWxlY3RlZEluZGV4KGkpOwotCQkJCQkJRWxlbWVudFZhbHVlID0gcEZvcm1GaWVsZC0+R2V0T3B0aW9uVmFsdWUoaUluZGV4KS5jX3N0cigpOwotCQkJCQkJaWYgKEZYU1lTX3djc2xlbihFbGVtZW50VmFsdWUuVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSkgPT0gMCkKLQkJCQkJCQlFbGVtZW50VmFsdWUgPSBwRm9ybUZpZWxkLT5HZXRPcHRpb25MYWJlbChpSW5kZXgpLmNfc3RyKCk7Ci0JCQkJCQlWYWx1ZUFycmF5LlNldEVsZW1lbnQoaSwgRWxlbWVudFZhbHVlKTsKLQkJCQkJfQotCQkJCQl2cCA8PCBWYWx1ZUFycmF5OwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlDRlhfV2lkZVN0cmluZyBzd1ZhbHVlID0gcEZvcm1GaWVsZC0+R2V0VmFsdWUoKTsKLQkJCQkKLQkJCQkJZG91YmxlIGRSZXQ7Ci0JCQkJCUZYX0JPT0wgYkRvdDsKLQkJCQkJaWYgKENKU19QdWJsaWNNZXRob2RzOjpDb252ZXJ0U3RyaW5nVG9OdW1iZXIoc3dWYWx1ZS5jX3N0cigpLCBkUmV0LCBiRG90KSkKLQkJCQkJewotCQkJCQkJaWYgKGJEb3QpCi0JCQkJCQkJdnAgPDwgZFJldDsKLQkJCQkJCWVsc2UKLQkJCQkJCQl2cCA8PCBkUmV0OwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJCXZwIDw8IHN3VmFsdWU7CQotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEZJRUxEVFlQRV9DSEVDS0JPWDoKLQkJY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046Ci0JCQl7Ci0JCQkJRlhfQk9PTCBiRmluZCA9IEZBTFNFOwotCQkJCWZvciAoaW50IGkgPSAwICwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGkgPCBzejsgaSsrKQotCQkJCXsKLQkJCQkJaWYgKHBGb3JtRmllbGQtPkdldENvbnRyb2woaSktPklzQ2hlY2tlZCgpKQotCQkJCQl7Ci0JCQkJCQlDRlhfV2lkZVN0cmluZyBzd1ZhbHVlID0gcEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKS0+R2V0RXhwb3J0VmFsdWUoKTsKLQkJCQkJCWRvdWJsZSBkUmV0OwotCQkJCQkJRlhfQk9PTCBiRG90OwotCQkJCQkJaWYgKENKU19QdWJsaWNNZXRob2RzOjpDb252ZXJ0U3RyaW5nVG9OdW1iZXIoc3dWYWx1ZS5jX3N0cigpLCBkUmV0LCBiRG90KSkKLQkJCQkJCXsKLQkJCQkJCQlpZiAoYkRvdCkKLQkJCQkJCQkJdnAgPDwgZFJldDsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCXZwIDw8IGRSZXQ7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQkJdnAgPDwgc3dWYWx1ZTsKKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzd1ZhbHVlID0gcEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKS0+R2V0RXhwb3J0VmFsdWUoKTsKKyAgICAgICAgICBkb3VibGUgZFJldDsKKyAgICAgICAgICBGWF9CT09MIGJEb3REdW1teTsKKyAgICAgICAgICBpZiAoQ0pTX1B1YmxpY01ldGhvZHM6OkNvbnZlcnRTdHJpbmdUb051bWJlcihzd1ZhbHVlLmNfc3RyKCksIGRSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRvdER1bW15KSkgeworICAgICAgICAgICAgdnAgPDwgZFJldDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdnAgPDwgc3dWYWx1ZTsKKyAgICAgICAgICB9CiAKLQkJCQkJCWJGaW5kID0gVFJVRTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoIWJGaW5kKQotCQkJCQl2cCA8PCBMIk9mZiI7CQkJCQkKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJdnAgPDwgcEZvcm1GaWVsZC0+R2V0VmFsdWUoKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQorICAgICAgICAgIGJGaW5kID0gVFJVRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWJGaW5kKQorICAgICAgICAgIHZwIDw8IEwiT2ZmIjsKKyAgICAgIH0gYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB2cCA8PCBwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBGaWVsZDo6U2V0VmFsdWUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsIAotCQkJCQkgaW50IG5Db250cm9sSW5kZXgsIGNvbnN0IENKU19XaWRlU3RyaW5nQXJyYXkmIHN0ckFycmF5KQotewotCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7Cit2b2lkIEZpZWxkOjpTZXRWYWx1ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19XaWRlU3RyaW5nQXJyYXkmIHN0ckFycmF5KSB7CisgIEFTU0VSVChwRG9jdW1lbnQpOwogCi0JaWYgKHN0ckFycmF5LkdldFNpemUoKSA8IDEpIHJldHVybjsKKyAgaWYgKHN0ckFycmF5LkdldFNpemUoKSA8IDEpCisgICAgcmV0dXJuOwogCi0JQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0JR2V0Rm9ybUZpZWxkcyhwRG9jdW1lbnQsIHN3RmllbGROYW1lLCBGaWVsZEFycmF5KTsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0KKyAgICAgIEdldEZvcm1GaWVsZHMocERvY3VtZW50LCBzd0ZpZWxkTmFtZSk7CiAKLQlmb3IgKGludCBpPTAsaXN6PUZpZWxkQXJyYXkuR2V0U2l6ZSgpOyBpPGlzejsgaSsrKQotCXsKLQkJQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KGkpOwotCQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKyAgZm9yIChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA6IEZpZWxkQXJyYXkpIHsKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0RnVsbE5hbWUoKS5Db21wYXJlKHN3RmllbGROYW1lKSAhPSAwKQorICAgICAgY29udGludWU7CiAKLQkJaWYgKHBGb3JtRmllbGQtPkdldEZ1bGxOYW1lKCkuQ29tcGFyZShzd0ZpZWxkTmFtZSkgIT0gMCkKLQkJCWNvbnRpbnVlOworICAgIHN3aXRjaCAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkpIHsKKyAgICAgIGNhc2UgRklFTERUWVBFX1RFWFRGSUVMRDoKKyAgICAgIGNhc2UgRklFTERUWVBFX0NPTUJPQk9YOgorICAgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0VmFsdWUoKSAhPSBzdHJBcnJheS5HZXRBdCgwKSkgeworICAgICAgICAgIENGWF9XaWRlU3RyaW5nIFdpZGVTdHJpbmcgPSBzdHJBcnJheS5HZXRBdCgwKTsKKyAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRWYWx1ZShzdHJBcnJheS5HZXRBdCgwKSwgVFJVRSk7CisgICAgICAgICAgVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgRkFMU0UsIFRSVUUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGSUVMRFRZUEVfQ0hFQ0tCT1g6ICAvLyBtYW50aXM6IDAwMDQ0OTMKKyAgICAgIGNhc2UgRklFTERUWVBFX1JBRElPQlVUVE9OOiB7CisgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpICE9IHN0ckFycmF5LkdldEF0KDApKSB7CisgICAgICAgICAgcEZvcm1GaWVsZC0+U2V0VmFsdWUoc3RyQXJyYXkuR2V0QXQoMCksIFRSVUUpOworICAgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIEZBTFNFLCBUUlVFKTsKKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgRklFTERUWVBFX0xJU1RCT1g6IHsKKyAgICAgICAgRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRTsKIAotCQlzd2l0Y2ggKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpKQotCQl7Ci0JCWNhc2UgRklFTERUWVBFX1RFWFRGSUVMRDoKLQkJY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6Ci0JCQlpZiAocEZvcm1GaWVsZC0+R2V0VmFsdWUoKSAhPSBzdHJBcnJheS5HZXRBdCgwKSkKLQkJCXsKLQkJCQlDRlhfV2lkZVN0cmluZyBXaWRlU3RyaW5nID0gc3RyQXJyYXkuR2V0QXQoMCk7Ci0JCQkJcEZvcm1GaWVsZC0+U2V0VmFsdWUoc3RyQXJyYXkuR2V0QXQoMCksIFRSVUUpOwkKLQkJCQlVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBGQUxTRSwgVFJVRSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBGSUVMRFRZUEVfQ0hFQ0tCT1g6IC8vbWFudGlzOiAwMDA0NDkzCi0JCWNhc2UgRklFTERUWVBFX1JBRElPQlVUVE9OOgotCQkJewotCQkJCWlmIChwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpICE9IHN0ckFycmF5LkdldEF0KDApKQotCQkJCXsKLQkJCQkJcEZvcm1GaWVsZC0+U2V0VmFsdWUoc3RyQXJyYXkuR2V0QXQoMCksIFRSVUUpOwkKLQkJCQkJVXBkYXRlRm9ybUZpZWxkKHBEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgRkFMU0UsIFRSVUUpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEZJRUxEVFlQRV9MSVNUQk9YOgotCQkJewotCQkJCUZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0U7CisgICAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IHN0ckFycmF5LkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgICBpbnQgaUluZGV4ID0gcEZvcm1GaWVsZC0+RmluZE9wdGlvbihzdHJBcnJheS5HZXRBdChpKSk7CiAKLQkJCQlmb3IgKGludCBpPTAsc3o9c3RyQXJyYXkuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JCQkJewotCQkJCQlpbnQgaUluZGV4ID0gcEZvcm1GaWVsZC0+RmluZE9wdGlvbihzdHJBcnJheS5HZXRBdChpKSk7CisgICAgICAgICAgaWYgKCFwRm9ybUZpZWxkLT5Jc0l0ZW1TZWxlY3RlZChpSW5kZXgpKSB7CisgICAgICAgICAgICBiTW9kaWZpZWQgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJCQkJaWYgKCFwRm9ybUZpZWxkLT5Jc0l0ZW1TZWxlY3RlZChpSW5kZXgpKQotCQkJCQl7Ci0JCQkJCQliTW9kaWZpZWQgPSBUUlVFOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoYk1vZGlmaWVkKQotCQkJCXsKLQkJCQkJcEZvcm1GaWVsZC0+Q2xlYXJTZWxlY3Rpb24oVFJVRSk7Ci0JCQkJCWZvciAoaW50IGk9MCxzej1zdHJBcnJheS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQkJCQkJewotCQkJCQkJaW50IGlJbmRleCA9IHBGb3JtRmllbGQtPkZpbmRPcHRpb24oc3RyQXJyYXkuR2V0QXQoaSkpOwotCQkJCQkJcEZvcm1GaWVsZC0+U2V0SXRlbVNlbGVjdGlvbihpSW5kZXgsIFRSVUUsIFRSVUUpOwotCQkJCQl9CisgICAgICAgIGlmIChiTW9kaWZpZWQpIHsKKyAgICAgICAgICBwRm9ybUZpZWxkLT5DbGVhclNlbGVjdGlvbihUUlVFKTsKKyAgICAgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBzdHJBcnJheS5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaUluZGV4ID0gcEZvcm1GaWVsZC0+RmluZE9wdGlvbihzdHJBcnJheS5HZXRBdChpKSk7CisgICAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRJdGVtU2VsZWN0aW9uKGlJbmRleCwgVFJVRSwgVFJVRSk7CisgICAgICAgICAgfQogCi0JCQkJCVVwZGF0ZUZvcm1GaWVsZChwRG9jdW1lbnQsIHBGb3JtRmllbGQsIFRSVUUsIEZBTFNFLCBUUlVFKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoJCQkJCi0JCQlicmVhazsKLQkJfQotCX0KKyAgICAgICAgICBVcGRhdGVGb3JtRmllbGQocERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBGQUxTRSwgVFJVRSk7CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KIH0KIAotRlhfQk9PTCBGaWVsZDo6dmFsdWVBc1N0cmluZyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOworRlhfQk9PTCBGaWVsZDo6dmFsdWVBc1N0cmluZyhJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICghdnAuSXNHZXR0aW5nKCkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JaWYgKCF2cC5Jc0dldHRpbmcoKSkgcmV0dXJuIEZBTFNFOworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotCWlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQorICAgIHJldHVybiBGQUxTRTsKIAotICAgCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLQlBU1NFUlQocEZvcm1GaWVsZCAhPSBOVUxMKTsKKyAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9DSEVDS0JPWCkgeworICAgIGlmICghcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0JaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotCQlyZXR1cm4gRkFMU0U7CisgICAgaWYgKHBGb3JtRmllbGQtPkdldENvbnRyb2woMCktPklzQ2hlY2tlZCgpKQorICAgICAgdnAgPDwgTCJZZXMiOworICAgIGVsc2UKKyAgICAgIHZwIDw8IEwiT2ZmIjsKKyAgfSBlbHNlIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfUkFESU9CVVRUT04gJiYKKyAgICAgICAgICAgICAhKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19SQURJT1NJTlVOSVNPTikpIHsKKyAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICBpZiAocEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKS0+SXNDaGVja2VkKCkpIHsKKyAgICAgICAgdnAgPDwgcEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKS0+R2V0RXhwb3J0VmFsdWUoKS5jX3N0cigpOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZwIDw8IEwiT2ZmIjsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX0xJU1RCT1ggJiYKKyAgICAgICAgICAgICAocEZvcm1GaWVsZC0+Q291bnRTZWxlY3RlZEl0ZW1zKCkgPiAxKSkgeworICAgIHZwIDw8IEwiIjsKKyAgfSBlbHNlIHsKKyAgICB2cCA8PCBwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpLmNfc3RyKCk7CisgIH0KIAotCWlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfQ0hFQ0tCT1gpCi0JewotCQlpZighcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKSByZXR1cm4gRkFMU0U7Ci0KLQkJaWYgKHBGb3JtRmllbGQtPkdldENvbnRyb2woMCktPklzQ2hlY2tlZCgpKQotCQkJdnAgPDwgTCJZZXMiOwotCQllbHNlCi0JCQl2cCA8PCBMIk9mZiI7Ci0JfQotCWVsc2UgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9SQURJT0JVVFRPTiAmJiAhKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19SQURJT1NJTlVOSVNPTikpCi0JewotCQlmb3IgKGludCBpPTAsIHN6PXBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaTxzejsgaSsrKQotCQl7Ci0JCQlpZiAocEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKS0+SXNDaGVja2VkKCkpCi0JCQl7Ci0JCQkJdnAgPDwgcEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKS0+R2V0RXhwb3J0VmFsdWUoKS5jX3N0cigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZQotCQkJCXZwIDw8IEwiT2ZmIjsKLQkJfQotCX0KLQllbHNlIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfTElTVEJPWCAmJiAocEZvcm1GaWVsZC0+Q291bnRTZWxlY3RlZEl0ZW1zKCkgPiAxKSkKLQl7Ci0JCXZwIDw8IEwiIjsKLQl9Ci0JZWxzZQotCQl2cCA8PCBwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpLmNfc3RyKCk7Ci0KLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworRlhfQk9PTCBGaWVsZDo6YnJvd3NlRm9yRmlsZVRvU3VibWl0KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIEZBTFNFOwogCi1GWF9CT09MIEZpZWxkOjpicm93c2VGb3JGaWxlVG9TdWJtaXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLQlDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLCBGaWVsZEFycmF5KTsKLQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0JQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0gCUNQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAgPSBtX3BEb2N1bWVudC0+R2V0RW52KCk7Ci0gCUFTU0VSVChwQXBwICE9IE5VTEwpOwotCi0JaWYgKChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfRklMRVNFTEVDVCkgJiYgCi0JCShwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfVEVYVEZJRUxEKSkKLQl7CQkKLQkJQ0ZYX1dpZGVTdHJpbmcgd3NGaWxlTmFtZSA9IHBBcHAtPkpTX2ZpZWxkQnJvd3NlKCk7Ci0JCWlmKCF3c0ZpbGVOYW1lLklzRW1wdHkoKSkKLQkJewotIAkJCXBGb3JtRmllbGQtPlNldFZhbHVlKHdzRmlsZU5hbWUpOwotIAkJCVVwZGF0ZUZvcm1GaWVsZChtX3BEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgVFJVRSwgVFJVRSk7Ci0gICAgICAgICB9Ci0JfQotCWVsc2UgCi0JCXJldHVybiBGQUxTRTsKLQotCXJldHVybiBUUlVFOworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAgPSBtX3BEb2N1bWVudC0+R2V0RW52KCk7CisgIGlmICgocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0ZJTEVTRUxFQ1QpICYmCisgICAgICAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1RFWFRGSUVMRCkpIHsKKyAgICBDRlhfV2lkZVN0cmluZyB3c0ZpbGVOYW1lID0gcEFwcC0+SlNfZmllbGRCcm93c2UoKTsKKyAgICBpZiAoIXdzRmlsZU5hbWUuSXNFbXB0eSgpKSB7CisgICAgICBwRm9ybUZpZWxkLT5TZXRWYWx1ZSh3c0ZpbGVOYW1lKTsKKyAgICAgIFVwZGF0ZUZvcm1GaWVsZChtX3BEb2N1bWVudCwgcEZvcm1GaWVsZCwgVFJVRSwgVFJVRSwgVFJVRSk7CisgICAgfQorICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KIAorRlhfQk9PTCBGaWVsZDo6YnV0dG9uR2V0Q2FwdGlvbihJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGludCBuZmFjZSA9IDA7CisgIGludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7CisgIGlmIChpU2l6ZSA+PSAxKQorICAgIG5mYWNlID0gcGFyYW1zWzBdLlRvSW50KCk7CiAKLUZYX0JPT0wgRmllbGQ6OmJ1dHRvbkdldENhcHRpb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBGQUxTRTsKIAotCWludCBuZmFjZSA9IDA7Ci0JaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKLQlpZiAoaVNpemUgPj0gMSkKLQkJbmZhY2UgPSBwYXJhbXNbMF0uVG9JbnQoKTsKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1BVU0hCVVRUT04pCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0JR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKKyAgaWYgKCFwRm9ybUNvbnRyb2wpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCQotCWlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLQkJcmV0dXJuIEZBTFNFOwotCi0JQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0JaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIEZBTFNFOwotCQotCWlmIChuZmFjZSA9PSAwKQotCQl2UmV0ID0gcEZvcm1Db250cm9sLT5HZXROb3JtYWxDYXB0aW9uKCkuY19zdHIoKTsKLQllbHNlIGlmIChuZmFjZSA9PSAxKQotCQl2UmV0ID0gcEZvcm1Db250cm9sLT5HZXREb3duQ2FwdGlvbigpLmNfc3RyKCk7Ci0JZWxzZSBpZiAobmZhY2UgPT0gMikKLQkJdlJldCA9IHBGb3JtQ29udHJvbC0+R2V0Um9sbG92ZXJDYXB0aW9uKCkuY19zdHIoKTsKLQllbHNlCi0JCXJldHVybiBGQUxTRTsKKyAgaWYgKG5mYWNlID09IDApCisgICAgdlJldCA9IHBGb3JtQ29udHJvbC0+R2V0Tm9ybWFsQ2FwdGlvbigpLmNfc3RyKCk7CisgIGVsc2UgaWYgKG5mYWNlID09IDEpCisgICAgdlJldCA9IHBGb3JtQ29udHJvbC0+R2V0RG93bkNhcHRpb24oKS5jX3N0cigpOworICBlbHNlIGlmIChuZmFjZSA9PSAyKQorICAgIHZSZXQgPSBwRm9ybUNvbnRyb2wtPkdldFJvbGxvdmVyQ2FwdGlvbigpLmNfc3RyKCk7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLS8vI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQ4MDApCitGWF9CT09MIEZpZWxkOjpidXR0b25HZXRJY29uKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaW50IG5mYWNlID0gMDsKKyAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKKyAgaWYgKGlTaXplID49IDEpCisgICAgbmZhY2UgPSBwYXJhbXNbMF0uVG9JbnQoKTsKIAotRlhfQk9PTCBGaWVsZDo6YnV0dG9uR2V0SWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JaW50IG5mYWNlID0gMDsKLQlpbnQgaVNpemUgPSBwYXJhbXMuc2l6ZSgpOwotCWlmIChpU2l6ZSA+PSAxKQotCQluZmFjZSA9IHBhcmFtc1swXS5Ub0ludCgpOwotCQotCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCUdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0JaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1BVU0hCVVRUT04pCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCQotCWlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLQkJcmV0dXJuIEZBTFNFOworICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKKyAgaWYgKCFwRm9ybUNvbnRyb2wpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0JaWYgKCFwRm9ybUNvbnRyb2wpcmV0dXJuIEZBTFNFOwotCi0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0KLQlDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7Ci0JQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOwotCQotCUpTRlhPYmplY3QgcE9iaiA9IEpTX05ld0Z4RHluYW1pY09iaigqcFJ1bnRpbWUsIHBDb250ZXh0LCBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIkljb24iKSk7Ci0JQVNTRVJUKHBPYmouSXNFbXB0eSgpID09IEZBTFNFKTsKLQkKLQlDSlNfSWNvbiogcEpTX0ljb24gPSAoQ0pTX0ljb24qKUpTX0dldFByaXZhdGUocE9iaik7Ci0JQVNTRVJUKHBKU19JY29uICE9IE5VTEwpOworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqID0gRlhKU19OZXdGeER5bmFtaWNPYmooCisgICAgICBwUnVudGltZS0+R2V0SXNvbGF0ZSgpLCBwUnVudGltZSwgQ0pTX0ljb246Omdfbk9iakRlZm5JRCk7CisgIEFTU0VSVChwT2JqLklzRW1wdHkoKSA9PSBGQUxTRSk7CiAKLQlJY29uKiBwSWNvbiA9IChJY29uKilwSlNfSWNvbi0+R2V0RW1iZWRPYmplY3QoKTsKLQlBU1NFUlQocEljb24gIT0gTlVMTCk7CisgIENKU19JY29uKiBwSlNfSWNvbiA9IChDSlNfSWNvbiopRlhKU19HZXRQcml2YXRlKHBSdW50aW1lLT5HZXRJc29sYXRlKCksIHBPYmopOworICBJY29uKiBwSWNvbiA9IChJY29uKilwSlNfSWNvbi0+R2V0RW1iZWRPYmplY3QoKTsKIAotCUNQREZfU3RyZWFtKiBwSWNvblN0cmVhbSA9IE5VTEw7Ci0JaWYgKG5mYWNlID09IDApCi0JCXBJY29uU3RyZWFtID0gcEZvcm1Db250cm9sLT5HZXROb3JtYWxJY29uKCk7Ci0JZWxzZSBpZiAobmZhY2UgPT0gMSkKLQkJcEljb25TdHJlYW0gPSBwRm9ybUNvbnRyb2wtPkdldERvd25JY29uKCk7Ci0JZWxzZSBpZiAobmZhY2UgPT0gMikKLQkJcEljb25TdHJlYW0gPSBwRm9ybUNvbnRyb2wtPkdldFJvbGxvdmVySWNvbigpOwotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOworICBDUERGX1N0cmVhbSogcEljb25TdHJlYW0gPSBOVUxMOworICBpZiAobmZhY2UgPT0gMCkKKyAgICBwSWNvblN0cmVhbSA9IHBGb3JtQ29udHJvbC0+R2V0Tm9ybWFsSWNvbigpOworICBlbHNlIGlmIChuZmFjZSA9PSAxKQorICAgIHBJY29uU3RyZWFtID0gcEZvcm1Db250cm9sLT5HZXREb3duSWNvbigpOworICBlbHNlIGlmIChuZmFjZSA9PSAyKQorICAgIHBJY29uU3RyZWFtID0gcEZvcm1Db250cm9sLT5HZXRSb2xsb3Zlckljb24oKTsKKyAgZWxzZQorICAgIHJldHVybiBGQUxTRTsKIAotCXBJY29uLT5TZXRTdHJlYW0ocEljb25TdHJlYW0pOwotCXZSZXQgPSBwSlNfSWNvbjsKKyAgcEljb24tPlNldFN0cmVhbShwSWNvblN0cmVhbSk7CisgIHZSZXQgPSBwSlNfSWNvbjsKIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotLy8jcHJhZ21hIHdhcm5pbmcoZGVmYXVsdDogNDgwMCkKLQotRlhfQk9PTCBGaWVsZDo6YnV0dG9uSW1wb3J0SWNvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotI2lmIDAgIAotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKLQotCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCUdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0JaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKLQotCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdCgwKTsKLQlpZiAoIXBGb3JtRmllbGQpcmV0dXJuIEZBTFNFOwotCi0JQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcERvY3VtZW50LT5HZXRFbnYoKTsKLQlBU1NFUlQocEVudik7Ci0KLQlDRlhfV2lkZVN0cmluZyBzSWNvbkZpbGVOYW1lID0gcEVudi0+SlNfZmllbGRCcm93c2UoKTsKLQlpZiAoc0ljb25GaWxlTmFtZS5Jc0VtcHR5KCkpIAotCXsKLQkJdlJldCA9IDE7Ci0JCXJldHVybiBUUlVFOwotCX0KLQotCUNQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKiltX3BEb2N1bWVudC0+R2V0SW50ZXJGb3JtKCk7Ci0JQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7Ci0KLQlDUERGX1N0cmVhbSogcFN0cmVhbSA9IHBJbnRlckZvcm0tPkxvYWRJbWFnZUZyb21GaWxlKHNJY29uRmlsZU5hbWUpOwotCWlmICghcFN0cmVhbSkgCi0JewotCQl2UmV0ID0gLTE7Ci0JCXJldHVybiBUUlVFOwotCX0KLQotCUNQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotCWlmICghcEZvcm1Db250cm9sKXJldHVybiBGQUxTRTsKLQotCXBGb3JtQ29udHJvbC0+U2V0Tm9ybWFsSWNvbihwU3RyZWFtKTsKLQlVcGRhdGVGb3JtQ29udHJvbChtX3BEb2N1bWVudCwgcEZvcm1Db250cm9sLCBUUlVFLCBUUlVFLCBUUlVFKTsKLQotCXZSZXQgPSAwOwotI2VuZGlmIC8vIDAKLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgRmllbGQ6OmJ1dHRvbkltcG9ydEljb24oSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6YnV0dG9uU2V0Q2FwdGlvbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgRmllbGQ6OmJ1dHRvblNldENhcHRpb24oSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OmJ1dHRvblNldEljb24oSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlyZXR1cm4gRkFMU0U7CitGWF9CT09MIEZpZWxkOjpidXR0b25TZXRJY29uKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIEZpZWxkOjpjaGVja1RoaXNCb3goSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIEZpZWxkOjpjaGVja1RoaXNCb3goSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBBU1NFUlQobV9wRG9jdW1lbnQpOwogCi0JaWYgKCFtX2JDYW5TZXQpIHJldHVybiBGQUxTRTsKKyAgaWYgKCFtX2JDYW5TZXQpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKLQlpZiAoaVNpemUgPCAxKQotCQlyZXR1cm4gRkFMU0U7CisgIGludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7CisgIGlmIChpU2l6ZSA8IDEpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JaW50IG5XaWRnZXQgPSBwYXJhbXNbMF0uVG9JbnQoKTsKKyAgaW50IG5XaWRnZXQgPSBwYXJhbXNbMF0uVG9JbnQoKTsKIAotCUZYX0JPT0wgYkNoZWNraXQgPSBUUlVFOwotCWlmIChpU2l6ZSA+PSAyKQotCQliQ2hlY2tpdCA9IHBhcmFtc1sxXS5Ub0Jvb2woKTsKKyAgRlhfQk9PTCBiQ2hlY2tpdCA9IFRSVUU7CisgIGlmIChpU2l6ZSA+PSAyKQorICAgIGJDaGVja2l0ID0gcGFyYW1zWzFdLlRvQm9vbCgpOwogCi0JQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0JR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0JQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLQlpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0NIRUNLQk9YICYmIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9SQURJT0JVVFRPTikKLQkJcmV0dXJuIEZBTFNFOwotCWlmKG5XaWRnZXQgPDAgfHwgbldpZGdldCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCi0JCXJldHVybiBGQUxTRTsKLQlpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKQotCQlwRm9ybUZpZWxkLT5DaGVja0NvbnRyb2wobldpZGdldCwgYkNoZWNraXQsIFRSVUUpOwotCWVsc2UKLQkJcEZvcm1GaWVsZC0+Q2hlY2tDb250cm9sKG5XaWRnZXQsIGJDaGVja2l0LCBUUlVFKTsKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0NIRUNLQk9YICYmCisgICAgICBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUkFESU9CVVRUT04pCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAobldpZGdldCA8IDAgfHwgbldpZGdldCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCisgICAgcmV0dXJuIEZBTFNFOworICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKQorICAgIHBGb3JtRmllbGQtPkNoZWNrQ29udHJvbChuV2lkZ2V0LCBiQ2hlY2tpdCwgVFJVRSk7CisgIGVsc2UKKyAgICBwRm9ybUZpZWxkLT5DaGVja0NvbnRyb2wobldpZGdldCwgYkNoZWNraXQsIFRSVUUpOwogCi0JVXBkYXRlRm9ybUZpZWxkKG1fcERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBUUlVFLCBUUlVFKTsKLQlyZXR1cm4gVFJVRTsKKyAgVXBkYXRlRm9ybUZpZWxkKG1fcERvY3VtZW50LCBwRm9ybUZpZWxkLCBUUlVFLCBUUlVFLCBUUlVFKTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OmNsZWFySXRlbXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgRmllbGQ6OmNsZWFySXRlbXMoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6ZGVmYXVsdElzQ2hlY2tlZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgRmllbGQ6OmRlZmF1bHRJc0NoZWNrZWQoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAoIW1fYkNhblNldCkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlpZiAoIW1fYkNhblNldCkgcmV0dXJuIEZBTFNFOworICBpbnQgaVNpemUgPSBwYXJhbXMuc2l6ZSgpOworICBpZiAoaVNpemUgPCAxKQorICAgIHJldHVybiBGQUxTRTsKIAotCWludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7Ci0JaWYgKGlTaXplIDwgMSkKLQkJcmV0dXJuIEZBTFNFOworICBpbnQgbldpZGdldCA9IHBhcmFtc1swXS5Ub0ludCgpOwogCi0JaW50IG5XaWRnZXQgPSBwYXJhbXNbMF0uVG9JbnQoKTsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0JR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0JQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0JaWYobldpZGdldCA8MCB8fCBuV2lkZ2V0ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkKLQl7Ci0JCXZSZXQgPSBGQUxTRTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQlpZiAoKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9DSEVDS0JPWCkKLQkJfHwgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9SQURJT0JVVFRPTikpCi0JewotCi0JCXZSZXQgPSBUUlVFOwotCX0KLQllbHNlCi0JCXZSZXQgPSBGQUxTRTsKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICBpZiAobldpZGdldCA8IDAgfHwgbldpZGdldCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpIHsKKyAgICB2UmV0ID0gRkFMU0U7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHZSZXQgPSBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfQ0hFQ0tCT1ggfHwKKyAgICAgICAgIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9SQURJT0JVVFRPTjsKIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6ZGVsZXRlSXRlbUF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIFRSVUU7CitGWF9CT09MIEZpZWxkOjpkZWxldGVJdGVtQXQoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gVFJVRTsKIH0KIAotaW50IEpTX0NPTVBBUkVTVFJJTkcoQ0ZYX1dpZGVTdHJpbmcqIHBzMSwgQ0ZYX1dpZGVTdHJpbmcqIHBzMikKLXsKLQlBU1NFUlQocHMxICE9IE5VTEwpOwotCUFTU0VSVChwczIgIT0gTlVMTCk7Ci0KLQlyZXR1cm4gcHMxLT5Db21wYXJlKCpwczIpOworaW50IEpTX0NPTVBBUkVTVFJJTkcoQ0ZYX1dpZGVTdHJpbmcqIHBzMSwgQ0ZYX1dpZGVTdHJpbmcqIHBzMikgeworICByZXR1cm4gcHMxLT5Db21wYXJlKCpwczIpOwogfQogCi0KLUZYX0JPT0wgRmllbGQ6OmdldEFycmF5KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQVNTRVJUKG1fcERvY3VtZW50ICE9IE5VTEwpOwotCi0JQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0JR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0JQ0dXX0FycmF5VGVtcGxhdGU8Q0ZYX1dpZGVTdHJpbmcqPiBzd1NvcnQ7Ci0KLQlmb3IgKGludCBpPTAsc3o9RmllbGRBcnJheS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQl7Ci0JCUNQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gKENQREZfRm9ybUZpZWxkKilGaWVsZEFycmF5LkVsZW1lbnRBdChpKTsKLQkJQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLQkJc3dTb3J0LkFkZChuZXcgQ0ZYX1dpZGVTdHJpbmcocEZvcm1GaWVsZC0+R2V0RnVsbE5hbWUoKSkpOwotCQkKLQl9Ci0Jc3dTb3J0LlNvcnQoSlNfQ09NUEFSRVNUUklORyk7Ci0KLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQlDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7Ci0JQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOworRlhfQk9PTCBGaWVsZDo6Z2V0QXJyYXkoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlDSlNfQXJyYXkgRm9ybUZpZWxkQXJyYXkobV9pc29sYXRlKTsKLQlmb3IgKGludCBqPTAsanN6ID0gc3dTb3J0LkdldFNpemUoKTsgajxqc3o7IGorKykKLQl7Ci0JCUNGWF9XaWRlU3RyaW5nKiBwU3RyID0gc3dTb3J0LkdldEF0KGopOworICBDR1dfQXJyYXlUZW1wbGF0ZTxDRlhfV2lkZVN0cmluZyo+IHN3U29ydDsKIAotCQlKU0ZYT2JqZWN0IHBPYmogPSBKU19OZXdGeER5bmFtaWNPYmooKnBSdW50aW1lLCBwQ29udGV4dCwgSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSwgTCJGaWVsZCIpKTsKLQkJQVNTRVJUKHBPYmouSXNFbXB0eSgpID09IEZBTFNFKTsKKyAgZm9yIChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA6IEZpZWxkQXJyYXkpCisgICAgc3dTb3J0LkFkZChuZXcgQ0ZYX1dpZGVTdHJpbmcocEZvcm1GaWVsZC0+R2V0RnVsbE5hbWUoKSkpOworICBzd1NvcnQuU29ydChKU19DT01QQVJFU1RSSU5HKTsKIAotCQlDSlNfRmllbGQqIHBKU0ZpZWxkID0gKENKU19GaWVsZCopSlNfR2V0UHJpdmF0ZShwT2JqKTsKLQkJQVNTRVJUKHBKU0ZpZWxkICE9IE5VTEwpOworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CisgIEFTU0VSVChwUnVudGltZSk7CiAKLQkJRmllbGQqIHBGaWVsZCA9IChGaWVsZCopcEpTRmllbGQtPkdldEVtYmVkT2JqZWN0KCk7IAotCQlBU1NFUlQocEZpZWxkICE9IE5VTEwpOworICBDSlNfQXJyYXkgRm9ybUZpZWxkQXJyYXkocFJ1bnRpbWUpOworICBmb3IgKGludCBqID0gMCwganN6ID0gc3dTb3J0LkdldFNpemUoKTsgaiA8IGpzejsgaisrKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPENGWF9XaWRlU3RyaW5nPiBwU3RyKHN3U29ydC5HZXRBdChqKSk7CisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmogPSBGWEpTX05ld0Z4RHluYW1pY09iaigKKyAgICAgICAgcFJ1bnRpbWUtPkdldElzb2xhdGUoKSwgcFJ1bnRpbWUsIENKU19GaWVsZDo6Z19uT2JqRGVmbklEKTsKKyAgICBBU1NFUlQoIXBPYmouSXNFbXB0eSgpKTsKIAotCQlwRmllbGQtPkF0dGFjaEZpZWxkKHRoaXMtPm1fcEpTRG9jLCAqcFN0cik7Ci0JCi0JCUNKU19WYWx1ZSBGb3JtRmllbGRWYWx1ZShtX2lzb2xhdGUpOwotCQlGb3JtRmllbGRWYWx1ZSA9IHBKU0ZpZWxkOwotCQlGb3JtRmllbGRBcnJheS5TZXRFbGVtZW50KGosIEZvcm1GaWVsZFZhbHVlKTsKKyAgICBDSlNfRmllbGQqIHBKU0ZpZWxkID0KKyAgICAgICAgKENKU19GaWVsZCopRlhKU19HZXRQcml2YXRlKHBSdW50aW1lLT5HZXRJc29sYXRlKCksIHBPYmopOworICAgIEZpZWxkKiBwRmllbGQgPSAoRmllbGQqKXBKU0ZpZWxkLT5HZXRFbWJlZE9iamVjdCgpOworICAgIHBGaWVsZC0+QXR0YWNoRmllbGQobV9wSlNEb2MsICpwU3RyKTsKIAotCQlkZWxldGUgcFN0cjsKLQl9CisgICAgQ0pTX1ZhbHVlIEZvcm1GaWVsZFZhbHVlKHBSdW50aW1lKTsKKyAgICBGb3JtRmllbGRWYWx1ZSA9IHBKU0ZpZWxkOworICAgIEZvcm1GaWVsZEFycmF5LlNldEVsZW1lbnQoaiwgRm9ybUZpZWxkVmFsdWUpOworICB9CiAKLQl2UmV0ID0gRm9ybUZpZWxkQXJyYXk7Ci0Jc3dTb3J0LlJlbW92ZUFsbCgpOwotCXJldHVybiBUUlVFOworICB2UmV0ID0gRm9ybUZpZWxkQXJyYXk7CisgIHN3U29ydC5SZW1vdmVBbGwoKTsKKyAgcmV0dXJuIFRSVUU7CiB9Ci0JCi1GWF9CT09MIEZpZWxkOjpnZXRJdGVtQXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7Ci0JaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKIAotCWludCBuSWR4ID0gLTE7Ci0JaWYgKGlTaXplID49IDEpCi0JCW5JZHggPSBwYXJhbXNbMF0uVG9JbnQoKTsKK0ZYX0JPT0wgRmllbGQ6OmdldEl0ZW1BdChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7CiAKLQlGWF9CT09MIGJFeHBvcnQgPSBUUlVFOwotCWlmIChpU2l6ZSA+PSAyKQotCQliRXhwb3J0ID0gcGFyYW1zWzFdLlRvQm9vbCgpOworICBpbnQgbklkeCA9IC0xOworICBpZiAoaVNpemUgPj0gMSkKKyAgICBuSWR4ID0gcGFyYW1zWzBdLlRvSW50KCk7CiAKLQlDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotCWlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7CisgIEZYX0JPT0wgYkV4cG9ydCA9IFRSVUU7CisgIGlmIChpU2l6ZSA+PSAyKQorICAgIGJFeHBvcnQgPSBwYXJhbXNbMV0uVG9Cb29sKCk7CiAKLQlDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0JQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBGQUxTRTsKIAotCWlmICgocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX0xJU1RCT1gpCi0JCXx8IChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfQ09NQk9CT1gpKQotCXsKLQkJaWYgKG5JZHggPT0gLTEgfHwgbklkeCA+IHBGb3JtRmllbGQtPkNvdW50T3B0aW9ucygpKQotCQkJbklkeCA9IHBGb3JtRmllbGQtPkNvdW50T3B0aW9ucygpIC0xOwotCQlpZiAoYkV4cG9ydCkKLQkJewotCQkJQ0ZYX1dpZGVTdHJpbmcgc3RydmFsID0gcEZvcm1GaWVsZC0+R2V0T3B0aW9uVmFsdWUobklkeCk7Ci0JCQlpZiAoc3RydmFsLklzRW1wdHkoKSkKLQkJCQl2UmV0ID0gcEZvcm1GaWVsZC0+R2V0T3B0aW9uTGFiZWwobklkeCkuY19zdHIoKTsKLQkJCWVsc2UKLQkJCQl2UmV0ID0gc3RydmFsLmNfc3RyKCk7Ci0JCX0KLQkJZWxzZQotCQkJdlJldCA9IHBGb3JtRmllbGQtPkdldE9wdGlvbkxhYmVsKG5JZHgpLmNfc3RyKCk7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIEZBTFNFOworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIGlmICgocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX0xJU1RCT1gpIHx8CisgICAgICAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX0NPTUJPQk9YKSkgeworICAgIGlmIChuSWR4ID09IC0xIHx8IG5JZHggPiBwRm9ybUZpZWxkLT5Db3VudE9wdGlvbnMoKSkKKyAgICAgIG5JZHggPSBwRm9ybUZpZWxkLT5Db3VudE9wdGlvbnMoKSAtIDE7CisgICAgaWYgKGJFeHBvcnQpIHsKKyAgICAgIENGWF9XaWRlU3RyaW5nIHN0cnZhbCA9IHBGb3JtRmllbGQtPkdldE9wdGlvblZhbHVlKG5JZHgpOworICAgICAgaWYgKHN0cnZhbC5Jc0VtcHR5KCkpCisgICAgICAgIHZSZXQgPSBwRm9ybUZpZWxkLT5HZXRPcHRpb25MYWJlbChuSWR4KS5jX3N0cigpOworICAgICAgZWxzZQorICAgICAgICB2UmV0ID0gc3RydmFsLmNfc3RyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHZSZXQgPSBwRm9ybUZpZWxkLT5HZXRPcHRpb25MYWJlbChuSWR4KS5jX3N0cigpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6Z2V0TG9jayhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgRmllbGQ6OmdldExvY2soSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgRmllbGQ6Omluc2VydEl0ZW1BdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBUUlVFOworRlhfQk9PTCBGaWVsZDo6aW5zZXJ0SXRlbUF0KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OmlzQm94Q2hlY2tlZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgRmllbGQ6OmlzQm94Q2hlY2tlZChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGludCBuSW5kZXggPSAtMTsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPj0gMSkKKyAgICBuSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKIAotCWludCBuSW5kZXggPSAtMTsKLQlpZiAocGFyYW1zLnNpemUoKSA+PSAxKQotCQluSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ0ZYX1B0ckFycmF5IEZpZWxkQXJyYXk7Ci0JR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSxGaWVsZEFycmF5KTsKLQlpZiAoRmllbGRBcnJheS5HZXRTaXplKCkgPD0gMCkgcmV0dXJuIEZBTFNFOwotCi0JQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOwotCi0JaWYobkluZGV4IDwwIHx8IG5JbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCi0JewotCQl2UmV0ID0gRkFMU0U7Ci0JCXJldHVybiBGQUxTRTsKLQl9CisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgaWYgKG5JbmRleCA8IDAgfHwgbkluZGV4ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkgeworICAgIHZSZXQgPSBGQUxTRTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotCWlmICgocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX0NIRUNLQk9YKQotCQl8fCAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKSkKLQl7Ci0JCWlmIChwRm9ybUZpZWxkLT5HZXRDb250cm9sKG5JbmRleCktPklzQ2hlY2tlZCgpICE9MCApCi0JCQl2UmV0ID0gVFJVRTsKLQkJZWxzZQotCQkJdlJldCA9IEZBTFNFOwotCX0KLQllbHNlCi0JCXZSZXQgPSBGQUxTRTsKKyAgaWYgKChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfQ0hFQ0tCT1gpIHx8CisgICAgICAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKSkgeworICAgIGlmIChwRm9ybUZpZWxkLT5HZXRDb250cm9sKG5JbmRleCktPklzQ2hlY2tlZCgpICE9IDApCisgICAgICB2UmV0ID0gVFJVRTsKKyAgICBlbHNlCisgICAgICB2UmV0ID0gRkFMU0U7CisgIH0gZWxzZSB7CisgICAgdlJldCA9IEZBTFNFOworICB9CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OmlzRGVmYXVsdENoZWNrZWQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIEZpZWxkOjppc0RlZmF1bHRDaGVja2VkKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaW50IG5JbmRleCA9IC0xOworICBpZiAocGFyYW1zLnNpemUoKSA+PSAxKQorICAgIG5JbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwogCi0JaW50IG5JbmRleCA9IC0xOwotCWlmIChwYXJhbXMuc2l6ZSgpID49IDEpCi0JCW5JbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlDRlhfUHRyQXJyYXkgRmllbGRBcnJheTsKLQlHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lLEZpZWxkQXJyYXkpOwotCWlmIChGaWVsZEFycmF5LkdldFNpemUoKSA8PSAwKSByZXR1cm4gRkFMU0U7Ci0KLQlDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IChDUERGX0Zvcm1GaWVsZCopRmllbGRBcnJheS5FbGVtZW50QXQoMCk7Ci0JQVNTRVJUKHBGb3JtRmllbGQgIT0gTlVMTCk7Ci0KLQlpZihuSW5kZXggPDAgfHwgbkluZGV4ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkKLQl7Ci0JCXZSZXQgPSBGQUxTRTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQlpZiAoKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9DSEVDS0JPWCkKLQkJfHwgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9SQURJT0JVVFRPTikpCi0JewotCQlpZiAocEZvcm1GaWVsZC0+R2V0Q29udHJvbChuSW5kZXgpLT5Jc0RlZmF1bHRDaGVja2VkKCkgIT0gMCkKLQkJCXZSZXQgPSBUUlVFOwotCQllbHNlCi0JCQl2UmV0ID0gRkFMU0U7Ci0JfQotCWVsc2UKLQkJdlJldCA9IEZBTFNFOworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpIHsKKyAgICB2UmV0ID0gRkFMU0U7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmICgocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX0NIRUNLQk9YKSB8fAorICAgICAgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9SQURJT0JVVFRPTikpIHsKKyAgICBpZiAocEZvcm1GaWVsZC0+R2V0Q29udHJvbChuSW5kZXgpLT5Jc0RlZmF1bHRDaGVja2VkKCkgIT0gMCkKKyAgICAgIHZSZXQgPSBUUlVFOworICAgIGVsc2UKKyAgICAgIHZSZXQgPSBGQUxTRTsKKyAgfSBlbHNlIHsKKyAgICB2UmV0ID0gRkFMU0U7CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c2V0QWN0aW9uKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIFRSVUU7CitGWF9CT09MIEZpZWxkOjpzZXRBY3Rpb24oSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c2V0Rm9jdXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlBU1NFUlQobV9wRG9jdW1lbnQgIT0gTlVMTCk7CitGWF9CT09MIEZpZWxkOjpzZXRGb2N1cyhJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBGQUxTRTsKIAotCUNGWF9QdHJBcnJheSBGaWVsZEFycmF5OwotCUdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUsRmllbGRBcnJheSk7Ci0JaWYgKEZpZWxkQXJyYXkuR2V0U2l6ZSgpIDw9IDApIHJldHVybiBGQUxTRTsKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICBpbnQzMl90IG5Db3VudCA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsKKyAgaWYgKG5Db3VudCA8IDEpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSAoQ1BERl9Gb3JtRmllbGQqKUZpZWxkQXJyYXkuRWxlbWVudEF0KDApOwotCUFTU0VSVChwRm9ybUZpZWxkICE9IE5VTEwpOworICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9CisgICAgICAoQ1BERlNES19JbnRlckZvcm0qKW1fcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKKyAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBOVUxMOworICBpZiAobkNvdW50ID09IDEpIHsKKyAgICBwV2lkZ2V0ID0gcEludGVyRm9ybS0+R2V0V2lkZ2V0KHBGb3JtRmllbGQtPkdldENvbnRyb2woMCkpOworICB9IGVsc2UgeworICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BEb2N1bWVudC0+R2V0RW52KCk7CisgICAgVW5kZXJseWluZ1BhZ2VUeXBlKiBwUGFnZSA9IFVuZGVybHlpbmdGcm9tRlBERlBhZ2UoCisgICAgICAgIHBFbnYtPkZGSV9HZXRDdXJyZW50UGFnZShtX3BEb2N1bWVudC0+R2V0VW5kZXJseWluZ0RvY3VtZW50KCkpKTsKKyAgICBpZiAoIXBQYWdlKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmIChDUERGU0RLX1BhZ2VWaWV3KiBwQ3VyUGFnZVZpZXcgPSBtX3BEb2N1bWVudC0+R2V0UGFnZVZpZXcocFBhZ2UpKSB7CisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgeworICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBUZW1wV2lkZ2V0ID0KKyAgICAgICAgICAgICAgICBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKSkpIHsKKyAgICAgICAgICBpZiAocFRlbXBXaWRnZXQtPkdldFBERlBhZ2UoKSA9PSBwQ3VyUGFnZVZpZXctPkdldFBERlBhZ2UoKSkgeworICAgICAgICAgICAgcFdpZGdldCA9IHBUZW1wV2lkZ2V0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CiAKLQlGWF9JTlQzMiBuQ291bnQgPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7Ci0KLQlpZiAobkNvdW50IDwgMSkgcmV0dXJuIEZBTFNFOwotCi0JQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSAoQ1BERlNES19JbnRlckZvcm0qKW1fcERvY3VtZW50LT5HZXRJbnRlckZvcm0oKTsKLQlBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKLQotCUNQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gTlVMTDsKLQlpZiAobkNvdW50ID09IDEpCi0JewkKLQkJcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUZpZWxkLT5HZXRDb250cm9sKDApKTsKLQl9Ci0JZWxzZQotCXsKLQkJQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcERvY3VtZW50LT5HZXRFbnYoKTsKLQkJQVNTRVJUKHBFbnYpOwotCQlDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopcEVudi0+RkZJX0dldEN1cnJlbnRQYWdlKG1fcERvY3VtZW50LT5HZXREb2N1bWVudCgpKTsKLQkJaWYoIXBQYWdlKQotCQkJcmV0dXJuIEZBTFNFOwotCQlpZiAoQ1BERlNES19QYWdlVmlldyogcEN1clBhZ2VWaWV3ID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VWaWV3KHBQYWdlKSkKLQkJewotCQkJZm9yIChGWF9JTlQzMiBpPTA7IGk8bkNvdW50OyBpKyspCi0JCQl7Ci0JCQkJaWYgKENQREZTREtfV2lkZ2V0KiBwVGVtcFdpZGdldCA9ICBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKSkpCi0JCQkJewkJCQkKLQkJCQkJaWYgKHBUZW1wV2lkZ2V0LT5HZXRQREZQYWdlKCkgPT0gcEN1clBhZ2VWaWV3LT5HZXRQREZQYWdlKCkpCi0JCQkJCXsKLQkJCQkJCXBXaWRnZXQgPSBwVGVtcFdpZGdldDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JaWYgKHBXaWRnZXQpCi0JewotCQltX3BEb2N1bWVudC0+U2V0Rm9jdXNBbm5vdChwV2lkZ2V0KTsKLQl9CisgIGlmIChwV2lkZ2V0KSB7CisgICAgbV9wRG9jdW1lbnQtPlNldEZvY3VzQW5ub3QocFdpZGdldCk7CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c2V0SXRlbXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgRmllbGQ6OnNldEl0ZW1zKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgRmllbGQ6OnNldExvY2soSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlyZXR1cm4gRkFMU0U7CitGWF9CT09MIEZpZWxkOjpzZXRMb2NrKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIEZpZWxkOjpzaWduYXR1cmVHZXRNb2RpZmljYXRpb25zKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIEZBTFNFOworRlhfQk9PTCBGaWVsZDo6c2lnbmF0dXJlR2V0TW9kaWZpY2F0aW9ucyhJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c2lnbmF0dXJlR2V0U2VlZFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIEZBTFNFOworRlhfQk9PTCBGaWVsZDo6c2lnbmF0dXJlR2V0U2VlZFZhbHVlKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIEZpZWxkOjpzaWduYXR1cmVJbmZvKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIEZBTFNFOworRlhfQk9PTCBGaWVsZDo6c2lnbmF0dXJlSW5mbyhJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c2lnbmF0dXJlU2V0U2VlZFZhbHVlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIEZBTFNFOworRlhfQk9PTCBGaWVsZDo6c2lnbmF0dXJlU2V0U2VlZFZhbHVlKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIEZpZWxkOjpzaWduYXR1cmVTaWduKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIEZBTFNFOworRlhfQk9PTCBGaWVsZDo6c2lnbmF0dXJlU2lnbihJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c2lnbmF0dXJlVmFsaWRhdGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlyZXR1cm4gRkFMU0U7CitGWF9CT09MIEZpZWxkOjpzaWduYXR1cmVWYWxpZGF0ZShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBGaWVsZDo6c291cmNlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlpZiAodnAuSXNHZXR0aW5nKCkpCi0JewotCQl2cCA8PCAoQ0pTX09iamVjdCopTlVMTDsKLQl9CitGWF9CT09MIEZpZWxkOjpzb3VyY2UoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKHZwLklzR2V0dGluZygpKSB7CisgICAgdnAgPDwgKENKU19PYmplY3QqKU5VTEw7CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBkZWxheSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK3ZvaWQgRmllbGQ6OkFkZERlbGF5X0ludChlbnVtIEZJRUxEX1BST1AgcHJvcCwgaW50MzJfdCBuKSB7CisgIENKU19EZWxheURhdGEqIHBOZXdEYXRhID0gbmV3IENKU19EZWxheURhdGE7CisgIHBOZXdEYXRhLT5zRmllbGROYW1lID0gbV9GaWVsZE5hbWU7CisgIHBOZXdEYXRhLT5uQ29udHJvbEluZGV4ID0gbV9uRm9ybUNvbnRyb2xJbmRleDsKKyAgcE5ld0RhdGEtPmVQcm9wID0gcHJvcDsKKyAgcE5ld0RhdGEtPm51bSA9IG47CiAKLXZvaWQgRmllbGQ6OkFkZERlbGF5X0ludChlbnVtIEZJRUxEX1BST1AgcHJvcCwgRlhfSU5UMzIgbikKLXsKLQlBU1NFUlQobV9wSlNEb2MgIT0gTlVMTCk7Ci0KLQlDSlNfRGVsYXlEYXRhKiBwTmV3RGF0YSA9IG5ldyBDSlNfRGVsYXlEYXRhOwotCXBOZXdEYXRhLT5zRmllbGROYW1lID0gbV9GaWVsZE5hbWU7Ci0JcE5ld0RhdGEtPm5Db250cm9sSW5kZXggPSBtX25Gb3JtQ29udHJvbEluZGV4OwotCXBOZXdEYXRhLT5lUHJvcCA9IHByb3A7Ci0JcE5ld0RhdGEtPm51bSA9IG47Ci0KLQltX3BKU0RvYy0+QWRkRGVsYXlEYXRhKHBOZXdEYXRhKTsKKyAgbV9wSlNEb2MtPkFkZERlbGF5RGF0YShwTmV3RGF0YSk7CiB9CiAKLXZvaWQgRmllbGQ6OkFkZERlbGF5X0Jvb2woZW51bSBGSUVMRF9QUk9QIHByb3AsYm9vbCBiKQotewotCUFTU0VSVChtX3BKU0RvYyAhPSBOVUxMKTsKLQotCUNKU19EZWxheURhdGEqIHBOZXdEYXRhID0gbmV3IENKU19EZWxheURhdGE7Ci0JcE5ld0RhdGEtPnNGaWVsZE5hbWUgPSBtX0ZpZWxkTmFtZTsKLQlwTmV3RGF0YS0+bkNvbnRyb2xJbmRleCA9IG1fbkZvcm1Db250cm9sSW5kZXg7Ci0JcE5ld0RhdGEtPmVQcm9wID0gcHJvcDsKLQlwTmV3RGF0YS0+YiA9IGI7Cit2b2lkIEZpZWxkOjpBZGREZWxheV9Cb29sKGVudW0gRklFTERfUFJPUCBwcm9wLCBib29sIGIpIHsKKyAgQ0pTX0RlbGF5RGF0YSogcE5ld0RhdGEgPSBuZXcgQ0pTX0RlbGF5RGF0YTsKKyAgcE5ld0RhdGEtPnNGaWVsZE5hbWUgPSBtX0ZpZWxkTmFtZTsKKyAgcE5ld0RhdGEtPm5Db250cm9sSW5kZXggPSBtX25Gb3JtQ29udHJvbEluZGV4OworICBwTmV3RGF0YS0+ZVByb3AgPSBwcm9wOworICBwTmV3RGF0YS0+YiA9IGI7CiAKLQltX3BKU0RvYy0+QWRkRGVsYXlEYXRhKHBOZXdEYXRhKTsKKyAgbV9wSlNEb2MtPkFkZERlbGF5RGF0YShwTmV3RGF0YSk7CiB9CiAKLXZvaWQgRmllbGQ6OkFkZERlbGF5X1N0cmluZyhlbnVtIEZJRUxEX1BST1AgcHJvcCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZykKLXsKLQlBU1NFUlQobV9wSlNEb2MgIT0gTlVMTCk7Ci0KLQlDSlNfRGVsYXlEYXRhKiBwTmV3RGF0YSA9IG5ldyBDSlNfRGVsYXlEYXRhOwotCXBOZXdEYXRhLT5zRmllbGROYW1lID0gbV9GaWVsZE5hbWU7Ci0JcE5ld0RhdGEtPm5Db250cm9sSW5kZXggPSBtX25Gb3JtQ29udHJvbEluZGV4OwotCXBOZXdEYXRhLT5lUHJvcCA9IHByb3A7Ci0JcE5ld0RhdGEtPnN0cmluZyA9IHN0cmluZzsKK3ZvaWQgRmllbGQ6OkFkZERlbGF5X1N0cmluZyhlbnVtIEZJRUxEX1BST1AgcHJvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKSB7CisgIENKU19EZWxheURhdGEqIHBOZXdEYXRhID0gbmV3IENKU19EZWxheURhdGE7CisgIHBOZXdEYXRhLT5zRmllbGROYW1lID0gbV9GaWVsZE5hbWU7CisgIHBOZXdEYXRhLT5uQ29udHJvbEluZGV4ID0gbV9uRm9ybUNvbnRyb2xJbmRleDsKKyAgcE5ld0RhdGEtPmVQcm9wID0gcHJvcDsKKyAgcE5ld0RhdGEtPnN0cmluZyA9IHN0cmluZzsKIAotCW1fcEpTRG9jLT5BZGREZWxheURhdGEocE5ld0RhdGEpOworICBtX3BKU0RvYy0+QWRkRGVsYXlEYXRhKHBOZXdEYXRhKTsKIH0KIAotdm9pZCBGaWVsZDo6QWRkRGVsYXlfV2lkZVN0cmluZyhlbnVtIEZJRUxEX1BST1AgcHJvcCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZykKLXsKLQlBU1NFUlQobV9wSlNEb2MgIT0gTlVMTCk7Ci0KLQlDSlNfRGVsYXlEYXRhKiBwTmV3RGF0YSA9IG5ldyBDSlNfRGVsYXlEYXRhOwotCXBOZXdEYXRhLT5zRmllbGROYW1lID0gbV9GaWVsZE5hbWU7Ci0JcE5ld0RhdGEtPm5Db250cm9sSW5kZXggPSBtX25Gb3JtQ29udHJvbEluZGV4OwotCXBOZXdEYXRhLT5lUHJvcCA9IHByb3A7Ci0JcE5ld0RhdGEtPndpZGVzdHJpbmcgPSBzdHJpbmc7Cit2b2lkIEZpZWxkOjpBZGREZWxheV9XaWRlU3RyaW5nKGVudW0gRklFTERfUFJPUCBwcm9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nKSB7CisgIENKU19EZWxheURhdGEqIHBOZXdEYXRhID0gbmV3IENKU19EZWxheURhdGE7CisgIHBOZXdEYXRhLT5zRmllbGROYW1lID0gbV9GaWVsZE5hbWU7CisgIHBOZXdEYXRhLT5uQ29udHJvbEluZGV4ID0gbV9uRm9ybUNvbnRyb2xJbmRleDsKKyAgcE5ld0RhdGEtPmVQcm9wID0gcHJvcDsKKyAgcE5ld0RhdGEtPndpZGVzdHJpbmcgPSBzdHJpbmc7CiAKLQltX3BKU0RvYy0+QWRkRGVsYXlEYXRhKHBOZXdEYXRhKTsKKyAgbV9wSlNEb2MtPkFkZERlbGF5RGF0YShwTmV3RGF0YSk7CiB9CiAKLXZvaWQgRmllbGQ6OkFkZERlbGF5X1JlY3QoZW51bSBGSUVMRF9QUk9QIHByb3AsIGNvbnN0IENQREZfUmVjdCYgcmVjdCkKLXsKLQlBU1NFUlQobV9wSlNEb2MgIT0gTlVMTCk7Ci0KLQlDSlNfRGVsYXlEYXRhKiBwTmV3RGF0YSA9IG5ldyBDSlNfRGVsYXlEYXRhOwotCXBOZXdEYXRhLT5zRmllbGROYW1lID0gbV9GaWVsZE5hbWU7Ci0JcE5ld0RhdGEtPm5Db250cm9sSW5kZXggPSBtX25Gb3JtQ29udHJvbEluZGV4OwotCXBOZXdEYXRhLT5lUHJvcCA9IHByb3A7Ci0JcE5ld0RhdGEtPnJlY3QgPSByZWN0Owordm9pZCBGaWVsZDo6QWRkRGVsYXlfUmVjdChlbnVtIEZJRUxEX1BST1AgcHJvcCwgY29uc3QgQ1BERl9SZWN0JiByZWN0KSB7CisgIENKU19EZWxheURhdGEqIHBOZXdEYXRhID0gbmV3IENKU19EZWxheURhdGE7CisgIHBOZXdEYXRhLT5zRmllbGROYW1lID0gbV9GaWVsZE5hbWU7CisgIHBOZXdEYXRhLT5uQ29udHJvbEluZGV4ID0gbV9uRm9ybUNvbnRyb2xJbmRleDsKKyAgcE5ld0RhdGEtPmVQcm9wID0gcHJvcDsKKyAgcE5ld0RhdGEtPnJlY3QgPSByZWN0OwogCi0JbV9wSlNEb2MtPkFkZERlbGF5RGF0YShwTmV3RGF0YSk7CisgIG1fcEpTRG9jLT5BZGREZWxheURhdGEocE5ld0RhdGEpOwogfQogCi12b2lkIEZpZWxkOjpBZGREZWxheV9Db2xvcihlbnVtIEZJRUxEX1BST1AgcHJvcCwgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpCi17Ci0JQVNTRVJUKG1fcEpTRG9jICE9IE5VTEwpOwotCi0JQ0pTX0RlbGF5RGF0YSogcE5ld0RhdGEgPSBuZXcgQ0pTX0RlbGF5RGF0YTsKLQlwTmV3RGF0YS0+c0ZpZWxkTmFtZSA9IG1fRmllbGROYW1lOwotCXBOZXdEYXRhLT5uQ29udHJvbEluZGV4ID0gbV9uRm9ybUNvbnRyb2xJbmRleDsKLQlwTmV3RGF0YS0+ZVByb3AgPSBwcm9wOwotCXBOZXdEYXRhLT5jb2xvciA9IGNvbG9yOwordm9pZCBGaWVsZDo6QWRkRGVsYXlfQ29sb3IoZW51bSBGSUVMRF9QUk9QIHByb3AsIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKSB7CisgIENKU19EZWxheURhdGEqIHBOZXdEYXRhID0gbmV3IENKU19EZWxheURhdGE7CisgIHBOZXdEYXRhLT5zRmllbGROYW1lID0gbV9GaWVsZE5hbWU7CisgIHBOZXdEYXRhLT5uQ29udHJvbEluZGV4ID0gbV9uRm9ybUNvbnRyb2xJbmRleDsKKyAgcE5ld0RhdGEtPmVQcm9wID0gcHJvcDsKKyAgcE5ld0RhdGEtPmNvbG9yID0gY29sb3I7CiAKLQltX3BKU0RvYy0+QWRkRGVsYXlEYXRhKHBOZXdEYXRhKTsKKyAgbV9wSlNEb2MtPkFkZERlbGF5RGF0YShwTmV3RGF0YSk7CiB9CiAKLXZvaWQgRmllbGQ6OkFkZERlbGF5X1dvcmRBcnJheShlbnVtIEZJRUxEX1BST1AgcHJvcCwgY29uc3QgQ0ZYX0RXb3JkQXJyYXkmIGFycmF5KQotewotCUFTU0VSVChtX3BKU0RvYyAhPSBOVUxMKTsKLQotCUNKU19EZWxheURhdGEqIHBOZXdEYXRhID0gbmV3IENKU19EZWxheURhdGE7Ci0JcE5ld0RhdGEtPnNGaWVsZE5hbWUgPSBtX0ZpZWxkTmFtZTsKLQlwTmV3RGF0YS0+bkNvbnRyb2xJbmRleCA9IG1fbkZvcm1Db250cm9sSW5kZXg7Ci0JcE5ld0RhdGEtPmVQcm9wID0gcHJvcDsKK3ZvaWQgRmllbGQ6OkFkZERlbGF5X1dvcmRBcnJheShlbnVtIEZJRUxEX1BST1AgcHJvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRFdvcmRBcnJheSYgYXJyYXkpIHsKKyAgQ0pTX0RlbGF5RGF0YSogcE5ld0RhdGEgPSBuZXcgQ0pTX0RlbGF5RGF0YTsKKyAgcE5ld0RhdGEtPnNGaWVsZE5hbWUgPSBtX0ZpZWxkTmFtZTsKKyAgcE5ld0RhdGEtPm5Db250cm9sSW5kZXggPSBtX25Gb3JtQ29udHJvbEluZGV4OworICBwTmV3RGF0YS0+ZVByb3AgPSBwcm9wOwogCi0JZm9yIChpbnQgaT0wLHN6PWFycmF5LkdldFNpemUoKTsgaTxzejsgaSsrKQotCQlwTmV3RGF0YS0+d29yZGFycmF5LkFkZChhcnJheS5HZXRBdChpKSk7CisgIGZvciAoaW50IGkgPSAwLCBzeiA9IGFycmF5LkdldFNpemUoKTsgaSA8IHN6OyBpKyspCisgICAgcE5ld0RhdGEtPndvcmRhcnJheS5BZGQoYXJyYXkuR2V0QXQoaSkpOwogCi0JbV9wSlNEb2MtPkFkZERlbGF5RGF0YShwTmV3RGF0YSk7CisgIG1fcEpTRG9jLT5BZGREZWxheURhdGEocE5ld0RhdGEpOwogfQogCi12b2lkIEZpZWxkOjpBZGREZWxheV9XaWRlU3RyaW5nQXJyYXkoZW51bSBGSUVMRF9QUk9QIHByb3AsIGNvbnN0IENKU19XaWRlU3RyaW5nQXJyYXkmIGFycmF5KQotewotCUFTU0VSVChtX3BKU0RvYyAhPSBOVUxMKTsKLQotCUNKU19EZWxheURhdGEqIHBOZXdEYXRhID0gbmV3IENKU19EZWxheURhdGE7Ci0JcE5ld0RhdGEtPnNGaWVsZE5hbWUgPSBtX0ZpZWxkTmFtZTsKLQlwTmV3RGF0YS0+bkNvbnRyb2xJbmRleCA9IG1fbkZvcm1Db250cm9sSW5kZXg7Ci0JcE5ld0RhdGEtPmVQcm9wID0gcHJvcDsKLQlmb3IgKGludCBpPTAsc3o9YXJyYXkuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JCXBOZXdEYXRhLT53aWRlc3RyaW5nYXJyYXkuQWRkKGFycmF5LkdldEF0KGkpKTsKK3ZvaWQgRmllbGQ6OkFkZERlbGF5X1dpZGVTdHJpbmdBcnJheShlbnVtIEZJRUxEX1BST1AgcHJvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfV2lkZVN0cmluZ0FycmF5JiBhcnJheSkgeworICBDSlNfRGVsYXlEYXRhKiBwTmV3RGF0YSA9IG5ldyBDSlNfRGVsYXlEYXRhOworICBwTmV3RGF0YS0+c0ZpZWxkTmFtZSA9IG1fRmllbGROYW1lOworICBwTmV3RGF0YS0+bkNvbnRyb2xJbmRleCA9IG1fbkZvcm1Db250cm9sSW5kZXg7CisgIHBOZXdEYXRhLT5lUHJvcCA9IHByb3A7CisgIGZvciAoaW50IGkgPSAwLCBzeiA9IGFycmF5LkdldFNpemUoKTsgaSA8IHN6OyBpKyspCisgICAgcE5ld0RhdGEtPndpZGVzdHJpbmdhcnJheS5BZGQoYXJyYXkuR2V0QXQoaSkpOwogCi0JbV9wSlNEb2MtPkFkZERlbGF5RGF0YShwTmV3RGF0YSk7CisgIG1fcEpTRG9jLT5BZGREZWxheURhdGEocE5ld0RhdGEpOwogfQogCi12b2lkIEZpZWxkOjpEb0RlbGF5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0pTX0RlbGF5RGF0YSogcERhdGEpCi17Ci0JQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKLQlBU1NFUlQocERhdGEgIT0gTlVMTCk7Cit2b2lkIEZpZWxkOjpEb0RlbGF5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0pTX0RlbGF5RGF0YSogcERhdGEpIHsKKyAgQVNTRVJUKHBEb2N1bWVudCk7CiAKLQlzd2l0Y2ggKHBEYXRhLT5lUHJvcCkKLQl7Ci0JY2FzZSBGUF9BTElHTk1FTlQ6Ci0JCUZpZWxkOjpTZXRBbGlnbm1lbnQocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5zdHJpbmcpOwotCQlicmVhazsKLQljYXNlIEZQX0JPUkRFUlNUWUxFOgotCQlGaWVsZDo6U2V0Qm9yZGVyU3R5bGUocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5zdHJpbmcpOwotCQlicmVhazsKLQljYXNlIEZQX0JVVFRPTkFMSUdOWDoKLQkJRmllbGQ6OlNldEJ1dHRvbkFsaWduWChwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPm51bSk7Ci0JCWJyZWFrOwotCWNhc2UgRlBfQlVUVE9OQUxJR05ZOgotCQlGaWVsZDo6U2V0QnV0dG9uQWxpZ25ZKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+bnVtKTsKLQkJYnJlYWs7Ci0JY2FzZSBGUF9CVVRUT05GSVRCT1VORFM6Ci0JCUZpZWxkOjpTZXRCdXR0b25GaXRCb3VuZHMocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5iKTsKLQkJYnJlYWs7Ci0JY2FzZSBGUF9CVVRUT05QT1NJVElPTjoKLQkJRmllbGQ6OlNldEJ1dHRvblBvc2l0aW9uKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+bnVtKTsKLQkJYnJlYWs7Ci0JY2FzZSBGUF9CVVRUT05TQ0FMRUhPVzoKLQkJRmllbGQ6OlNldEJ1dHRvblNjYWxlSG93KHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+bnVtKTsKLQkJYnJlYWs7Ci0JY2FzZSBGUF9CVVRUT05TQ0FMRVdIRU46Ci0JCUZpZWxkOjpTZXRCdXR0b25TY2FsZVdoZW4ocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5udW0pOwotCQlicmVhazsKLQljYXNlIEZQX0NBTENPUkRFUklOREVYOgotCQlGaWVsZDo6U2V0Q2FsY09yZGVySW5kZXgocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5udW0pOwotCQlicmVhazsKLQljYXNlIEZQX0NIQVJMSU1JVDoKLQkJRmllbGQ6OlNldENoYXJMaW1pdChwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPm51bSk7Ci0JCWJyZWFrOwotCWNhc2UgRlBfQ09NQjoKLQkJRmllbGQ6OlNldENvbWIocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5iKTsKLQkJYnJlYWs7Ci0JY2FzZSBGUF9DT01NSVRPTlNFTENIQU5HRToKLQkJRmllbGQ6OlNldENvbW1pdE9uU2VsQ2hhbmdlKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+Yik7Ci0JCWJyZWFrOwotCWNhc2UgRlBfQ1VSUkVOVFZBTFVFSU5ESUNFUzoKLQkJRmllbGQ6OlNldEN1cnJlbnRWYWx1ZUluZGljZXMocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT53b3JkYXJyYXkpOwotCQlicmVhazsKLQljYXNlIEZQX0RFRkFVTFRWQUxVRToKLQkJRmllbGQ6OlNldERlZmF1bHRWYWx1ZShwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPndpZGVzdHJpbmcpOwotCQlicmVhazsKLQljYXNlIEZQX0RPTk9UU0NST0xMOgotCQlGaWVsZDo6U2V0RG9Ob3RTY3JvbGwocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5iKTsKLQkJYnJlYWs7Ci0JY2FzZSBGUF9ESVNQTEFZOgotCQlGaWVsZDo6U2V0RGlzcGxheShwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPm51bSk7Ci0JCWJyZWFrOwotCWNhc2UgRlBfRklMTENPTE9SOgotCQlGaWVsZDo6U2V0RmlsbENvbG9yKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+Y29sb3IpOwotCQlicmVhazsKLQljYXNlIEZQX0hJRERFTjoKLQkJRmllbGQ6OlNldEhpZGRlbihwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPmIpOwotCQlicmVhazsKLQljYXNlIEZQX0hJR0hMSUdIVDoKLQkJRmllbGQ6OlNldEhpZ2hsaWdodChwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPnN0cmluZyk7Ci0JCWJyZWFrOwotCWNhc2UgRlBfTElORVdJRFRIOgotCQlGaWVsZDo6U2V0TGluZVdpZHRoKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+bnVtKTsKLQkJYnJlYWs7Ci0JY2FzZSBGUF9NVUxUSUxJTkU6Ci0JCUZpZWxkOjpTZXRNdWx0aWxpbmUocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5iKTsKLQkJYnJlYWs7Ci0JY2FzZSBGUF9NVUxUSVBMRVNFTEVDVElPTjoKLQkJRmllbGQ6OlNldE11bHRpcGxlU2VsZWN0aW9uKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+Yik7Ci0JCWJyZWFrOwotCWNhc2UgRlBfUEFTU1dPUkQ6Ci0JCUZpZWxkOjpTZXRQYXNzd29yZChwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPmIpOwotCQlicmVhazsKLQljYXNlIEZQX1JFQ1Q6Ci0JCUZpZWxkOjpTZXRSZWN0KHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+cmVjdCk7Ci0JCWJyZWFrOwotCWNhc2UgRlBfUklDSFRFWFQ6Ci0JCUZpZWxkOjpTZXRSaWNoVGV4dChwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPmIpOwotCQlicmVhazsKLQljYXNlIEZQX1JJQ0hWQUxVRToKLQkJYnJlYWs7Ci0JY2FzZSBGUF9ST1RBVElPTjoKLQkJRmllbGQ6OlNldFJvdGF0aW9uKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+bnVtKTsKLQkJYnJlYWs7Ci0JY2FzZSBGUF9TVFJPS0VDT0xPUjoKLQkJRmllbGQ6OlNldFN0cm9rZUNvbG9yKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+Y29sb3IpOwotCQlicmVhazsKLQljYXNlIEZQX1NUWUxFOgotCQlGaWVsZDo6U2V0U3R5bGUocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5zdHJpbmcpOwotCQlicmVhazsKLQljYXNlIEZQX1RFWFRDT0xPUjoKLQkJRmllbGQ6OlNldFRleHRDb2xvcihwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPmNvbG9yKTsKLQkJYnJlYWs7Ci0JY2FzZSBGUF9URVhURk9OVDoKLQkJRmllbGQ6OlNldFRleHRGb250KHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+c3RyaW5nKTsKLQkJYnJlYWs7Ci0JY2FzZSBGUF9URVhUU0laRToKLQkJRmllbGQ6OlNldFRleHRTaXplKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+bnVtKTsKLQkJYnJlYWs7Ci0JY2FzZSBGUF9VU0VSTkFNRToKLQkJRmllbGQ6OlNldFVzZXJOYW1lKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+d2lkZXN0cmluZyk7Ci0JCWJyZWFrOwotCWNhc2UgRlBfVkFMVUU6Ci0JCUZpZWxkOjpTZXRWYWx1ZShwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPndpZGVzdHJpbmdhcnJheSk7Ci0JCWJyZWFrOwotCX0KKyAgc3dpdGNoIChwRGF0YS0+ZVByb3ApIHsKKyAgICBjYXNlIEZQX0FMSUdOTUVOVDoKKyAgICAgIEZpZWxkOjpTZXRBbGlnbm1lbnQocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5zdHJpbmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUF9CT1JERVJTVFlMRToKKyAgICAgIEZpZWxkOjpTZXRCb3JkZXJTdHlsZShwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+c3RyaW5nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlBfQlVUVE9OQUxJR05YOgorICAgICAgRmllbGQ6OlNldEJ1dHRvbkFsaWduWChwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPm51bSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZQX0JVVFRPTkFMSUdOWToKKyAgICAgIEZpZWxkOjpTZXRCdXR0b25BbGlnblkocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5udW0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUF9CVVRUT05GSVRCT1VORFM6CisgICAgICBGaWVsZDo6U2V0QnV0dG9uRml0Qm91bmRzKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+Yik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZQX0JVVFRPTlBPU0lUSU9OOgorICAgICAgRmllbGQ6OlNldEJ1dHRvblBvc2l0aW9uKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5udW0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUF9CVVRUT05TQ0FMRUhPVzoKKyAgICAgIEZpZWxkOjpTZXRCdXR0b25TY2FsZUhvdyhwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+bnVtKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlBfQlVUVE9OU0NBTEVXSEVOOgorICAgICAgRmllbGQ6OlNldEJ1dHRvblNjYWxlV2hlbihwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPm51bSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZQX0NBTENPUkRFUklOREVYOgorICAgICAgRmllbGQ6OlNldENhbGNPcmRlckluZGV4KHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5udW0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUF9DSEFSTElNSVQ6CisgICAgICBGaWVsZDo6U2V0Q2hhckxpbWl0KHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+bnVtKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlBfQ09NQjoKKyAgICAgIEZpZWxkOjpTZXRDb21iKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUF9DT01NSVRPTlNFTENIQU5HRToKKyAgICAgIEZpZWxkOjpTZXRDb21taXRPblNlbENoYW5nZShwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+Yik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZQX0NVUlJFTlRWQUxVRUlORElDRVM6CisgICAgICBGaWVsZDo6U2V0Q3VycmVudFZhbHVlSW5kaWNlcyhwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT53b3JkYXJyYXkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUF9ERUZBVUxUVkFMVUU6CisgICAgICBGaWVsZDo6U2V0RGVmYXVsdFZhbHVlKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+d2lkZXN0cmluZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZQX0RPTk9UU0NST0xMOgorICAgICAgRmllbGQ6OlNldERvTm90U2Nyb2xsKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlBfRElTUExBWToKKyAgICAgIEZpZWxkOjpTZXREaXNwbGF5KHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPm51bSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZQX0ZJTExDT0xPUjoKKyAgICAgIEZpZWxkOjpTZXRGaWxsQ29sb3IocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5jb2xvcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZQX0hJRERFTjoKKyAgICAgIEZpZWxkOjpTZXRIaWRkZW4ocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlBfSElHSExJR0hUOgorICAgICAgRmllbGQ6OlNldEhpZ2hsaWdodChwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPnN0cmluZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZQX0xJTkVXSURUSDoKKyAgICAgIEZpZWxkOjpTZXRMaW5lV2lkdGgocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5udW0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUF9NVUxUSUxJTkU6CisgICAgICBGaWVsZDo6U2V0TXVsdGlsaW5lKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+Yik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZQX01VTFRJUExFU0VMRUNUSU9OOgorICAgICAgRmllbGQ6OlNldE11bHRpcGxlU2VsZWN0aW9uKHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlBfUEFTU1dPUkQ6CisgICAgICBGaWVsZDo6U2V0UGFzc3dvcmQocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUF9SRUNUOgorICAgICAgRmllbGQ6OlNldFJlY3QocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+cmVjdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZQX1JJQ0hURVhUOgorICAgICAgRmllbGQ6OlNldFJpY2hUZXh0KHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlBfUklDSFZBTFVFOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBGUF9ST1RBVElPTjoKKyAgICAgIEZpZWxkOjpTZXRSb3RhdGlvbihwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+bnVtKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlBfU1RST0tFQ09MT1I6CisgICAgICBGaWVsZDo6U2V0U3Ryb2tlQ29sb3IocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmNvbG9yKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlBfU1RZTEU6CisgICAgICBGaWVsZDo6U2V0U3R5bGUocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPnN0cmluZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZQX1RFWFRDT0xPUjoKKyAgICAgIEZpZWxkOjpTZXRUZXh0Q29sb3IocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5jb2xvcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZQX1RFWFRGT05UOgorICAgICAgRmllbGQ6OlNldFRleHRGb250KHBEb2N1bWVudCwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5zdHJpbmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUF9URVhUU0laRToKKyAgICAgIEZpZWxkOjpTZXRUZXh0U2l6ZShwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+bnVtKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlBfVVNFUk5BTUU6CisgICAgICBGaWVsZDo6U2V0VXNlck5hbWUocERvY3VtZW50LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPndpZGVzdHJpbmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUF9WQUxVRToKKyAgICAgIEZpZWxkOjpTZXRWYWx1ZShwRG9jdW1lbnQsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+d2lkZXN0cmluZ2FycmF5KTsKKyAgICAgIGJyZWFrOworICB9CiB9CiAKLSNkZWZpbmUgSlNfRklFTERfTUlOV0lEVEgJMQotI2RlZmluZSBKU19GSUVMRF9NSU5IRUlHSFQJMQotCi12b2lkIEZpZWxkOjpBZGRGaWVsZChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsIGludCBuUGFnZUluZGV4LCBpbnQgbkZpZWxkVHlwZSwKLQkJCQkJCQljb25zdCBDRlhfV2lkZVN0cmluZyYgc05hbWUsIGNvbnN0IENQREZfUmVjdCYgcmNDb29yZHMpCi17Ci0JLy9Ob3Qgc3VwcG9ydGVkLgordm9pZCBGaWVsZDo6QWRkRmllbGQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgaW50IG5QYWdlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICBpbnQgbkZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgcmNDb29yZHMpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KIH0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9GaWVsZC5oIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9GaWVsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkODE3OTUKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ZpZWxkLmgKQEAgLTAsMCArMSw1ODQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGUERGU0RLX1NSQ19KQVZBU0NSSVBUX0ZJRUxEX0hfCisjZGVmaW5lIEZQREZTREtfU1JDX0pBVkFTQ1JJUFRfRklFTERfSF8KKworI2luY2x1ZGUgPHN0cmluZz4gIC8vIEZvciBzdGQ6OndzdHJpbmcuCisKKyNpbmNsdWRlICJKU19EZWZpbmUuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9XbmQuaCIgIC8vIEZvciBDUFdMX0NvbG9yLgorCitjbGFzcyBDUERGU0RLX1dpZGdldDsKK2NsYXNzIERvY3VtZW50OworCitlbnVtIEZJRUxEX1BST1AgeworICBGUF9BTElHTk1FTlQsCisgIEZQX0JPUkRFUlNUWUxFLAorICBGUF9CVVRUT05BTElHTlgsCisgIEZQX0JVVFRPTkFMSUdOWSwKKyAgRlBfQlVUVE9ORklUQk9VTkRTLAorICBGUF9CVVRUT05QT1NJVElPTiwKKyAgRlBfQlVUVE9OU0NBTEVIT1csCisgIEZQX0JVVFRPTlNDQUxFV0hFTiwKKyAgRlBfQ0FMQ09SREVSSU5ERVgsCisgIEZQX0NIQVJMSU1JVCwKKyAgRlBfQ09NQiwKKyAgRlBfQ09NTUlUT05TRUxDSEFOR0UsCisgIEZQX0NVUlJFTlRWQUxVRUlORElDRVMsCisgIEZQX0RFRkFVTFRWQUxVRSwKKyAgRlBfRE9OT1RTQ1JPTEwsCisgIEZQX0RJU1BMQVksCisgIEZQX0ZJTExDT0xPUiwKKyAgRlBfSElEREVOLAorICBGUF9ISUdITElHSFQsCisgIEZQX0xJTkVXSURUSCwKKyAgRlBfTVVMVElMSU5FLAorICBGUF9NVUxUSVBMRVNFTEVDVElPTiwKKyAgRlBfUEFTU1dPUkQsCisgIEZQX1JFQ1QsCisgIEZQX1JJQ0hURVhULAorICBGUF9SSUNIVkFMVUUsCisgIEZQX1JPVEFUSU9OLAorICBGUF9TVFJPS0VDT0xPUiwKKyAgRlBfU1RZTEUsCisgIEZQX1RFWFRDT0xPUiwKKyAgRlBfVEVYVEZPTlQsCisgIEZQX1RFWFRTSVpFLAorICBGUF9VU0VSTkFNRSwKKyAgRlBfVkFMVUUKK307CisKK2NsYXNzIENKU19XaWRlU3RyaW5nQXJyYXkgeworIHB1YmxpYzoKKyAgQ0pTX1dpZGVTdHJpbmdBcnJheSgpIHt9CisgIHZpcnR1YWwgfkNKU19XaWRlU3RyaW5nQXJyYXkoKSB7CisgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gbV9EYXRhLkdldFNpemUoKTsgaSA8IHN6OyBpKyspCisgICAgICBkZWxldGUgbV9EYXRhLkdldEF0KGkpOworICAgIG1fRGF0YS5SZW1vdmVBbGwoKTsKKyAgfQorCisgIHZvaWQgQWRkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcpIHsKKyAgICBtX0RhdGEuQWRkKG5ldyBDRlhfV2lkZVN0cmluZyhzdHJpbmcpKTsKKyAgfQorCisgIGludCBHZXRTaXplKCkgY29uc3QgeyByZXR1cm4gbV9EYXRhLkdldFNpemUoKTsgfQorCisgIENGWF9XaWRlU3RyaW5nIEdldEF0KGludCBpKSBjb25zdCB7IHJldHVybiAqbV9EYXRhLkdldEF0KGkpOyB9CisKKyBwcml2YXRlOgorICBDRlhfQXJyYXlUZW1wbGF0ZTxDRlhfV2lkZVN0cmluZyo+IG1fRGF0YTsKK307CisKK3N0cnVjdCBDSlNfRGVsYXlEYXRhIHsKKyAgQ0ZYX1dpZGVTdHJpbmcgc0ZpZWxkTmFtZTsKKyAgaW50IG5Db250cm9sSW5kZXg7CisgIGVudW0gRklFTERfUFJPUCBlUHJvcDsKKyAgaW50MzJfdCBudW07CisgIGJvb2wgYjsKKyAgQ0ZYX0J5dGVTdHJpbmcgc3RyaW5nOworICBDRlhfV2lkZVN0cmluZyB3aWRlc3RyaW5nOworICBDUERGX1JlY3QgcmVjdDsKKyAgQ1BXTF9Db2xvciBjb2xvcjsKKyAgQ0ZYX0RXb3JkQXJyYXkgd29yZGFycmF5OworICBDSlNfV2lkZVN0cmluZ0FycmF5IHdpZGVzdHJpbmdhcnJheTsKK307CisKK2NsYXNzIEZpZWxkIDogcHVibGljIENKU19FbWJlZE9iaiB7CisgcHVibGljOgorICBleHBsaWNpdCBGaWVsZChDSlNfT2JqZWN0KiBwSlNPYmplY3QpOworICB+RmllbGQoKSBvdmVycmlkZTsKKworICBGWF9CT09MIGFsaWdubWVudChJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBib3JkZXJTdHlsZShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgYnV0dG9uQWxpZ25YKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGJ1dHRvbkFsaWduWShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBidXR0b25GaXRCb3VuZHMoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgYnV0dG9uUG9zaXRpb24oSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGJ1dHRvblNjYWxlSG93KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBidXR0b25TY2FsZVdoZW4oSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgY2FsY09yZGVySW5kZXgoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGNoYXJMaW1pdChJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBjb21iKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGNvbW1pdE9uU2VsQ2hhbmdlKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBjdXJyZW50VmFsdWVJbmRpY2VzKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZGVmYXVsdFN0eWxlKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGRlZmF1bHRWYWx1ZShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBkb05vdFNjcm9sbChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZG9Ob3RTcGVsbENoZWNrKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGRlbGF5KElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGRpc3BsYXkoSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZG9jKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGVkaXRhYmxlKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGV4cG9ydFZhbHVlcyhJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBmaWxlU2VsZWN0KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZmlsbENvbG9yKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGhpZGRlbihJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBoaWdobGlnaHQoSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgbGluZVdpZHRoKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIG11bHRpbGluZShJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBtdWx0aXBsZVNlbGVjdGlvbihJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgbmFtZShJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBudW1JdGVtcyhJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBwYWdlKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHBhc3N3b3JkKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHByaW50KElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHJhZGlvc0luVW5pc29uKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCByZWFkb25seShJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCByZWN0KElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHJlcXVpcmVkKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHJpY2hUZXh0KElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHJpY2hWYWx1ZShJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCByb3RhdGlvbihJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBzdHJva2VDb2xvcihJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgc3R5bGUoSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgc3VibWl0TmFtZShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHRleHRDb2xvcihJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCB0ZXh0Rm9udChJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCB0ZXh0U2l6ZShJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCB0eXBlKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHVzZXJOYW1lKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHZhbHVlKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHZhbHVlQXNTdHJpbmcoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBzb3VyY2UoSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisKKyAgRlhfQk9PTCBicm93c2VGb3JGaWxlVG9TdWJtaXQoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgYnV0dG9uR2V0Q2FwdGlvbihJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBidXR0b25HZXRJY29uKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGJ1dHRvbkltcG9ydEljb24oSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgYnV0dG9uU2V0Q2FwdGlvbihJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBidXR0b25TZXRJY29uKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGNoZWNrVGhpc0JveChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBjbGVhckl0ZW1zKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGRlZmF1bHRJc0NoZWNrZWQoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZGVsZXRlSXRlbUF0KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGdldEFycmF5KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGdldEl0ZW1BdChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBnZXRMb2NrKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGluc2VydEl0ZW1BdChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBpc0JveENoZWNrZWQoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgaXNEZWZhdWx0Q2hlY2tlZChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBzZXRBY3Rpb24oSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgc2V0Rm9jdXMoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgc2V0SXRlbXMoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgc2V0TG9jayhJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBzaWduYXR1cmVHZXRNb2RpZmljYXRpb25zKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHNpZ25hdHVyZUdldFNlZWRWYWx1ZShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBzaWduYXR1cmVJbmZvKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHNpZ25hdHVyZVNldFNlZWRWYWx1ZShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBzaWduYXR1cmVTaWduKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHNpZ25hdHVyZVZhbGlkYXRlKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCisgIHN0YXRpYyB2b2lkIFNldEFsaWdubWVudChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpOworICBzdGF0aWMgdm9pZCBTZXRCb3JkZXJTdHlsZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpOworICBzdGF0aWMgdm9pZCBTZXRCdXR0b25BbGlnblgoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyKTsKKyAgc3RhdGljIHZvaWQgU2V0QnV0dG9uQWxpZ25ZKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcik7CisgIHN0YXRpYyB2b2lkIFNldEJ1dHRvbkZpdEJvdW5kcyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYik7CisgIHN0YXRpYyB2b2lkIFNldEJ1dHRvblBvc2l0aW9uKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcik7CisgIHN0YXRpYyB2b2lkIFNldEJ1dHRvblNjYWxlSG93KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcik7CisgIHN0YXRpYyB2b2lkIFNldEJ1dHRvblNjYWxlV2hlbihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpOworICBzdGF0aWMgdm9pZCBTZXRDYWxjT3JkZXJJbmRleChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpOworICBzdGF0aWMgdm9pZCBTZXRDaGFyTGltaXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyKTsKKyAgc3RhdGljIHZvaWQgU2V0Q29tYihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYik7CisgIHN0YXRpYyB2b2lkIFNldENvbW1pdE9uU2VsQ2hhbmdlKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiKTsKKyAgc3RhdGljIHZvaWQgU2V0Q3VycmVudFZhbHVlSW5kaWNlcyhDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9EV29yZEFycmF5JiBhcnJheSk7CisgIHN0YXRpYyB2b2lkIFNldERlZmF1bHRTdHlsZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCk7CisgIHN0YXRpYyB2b2lkIFNldERlZmF1bHRWYWx1ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcpOworICBzdGF0aWMgdm9pZCBTZXREb05vdFNjcm9sbChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYik7CisgIHN0YXRpYyB2b2lkIFNldERpc3BsYXkoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyKTsKKyAgc3RhdGljIHZvaWQgU2V0RmlsbENvbG9yKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOworICBzdGF0aWMgdm9pZCBTZXRIaWRkZW4oQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGIpOworICBzdGF0aWMgdm9pZCBTZXRIaWdobGlnaHQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKTsKKyAgc3RhdGljIHZvaWQgU2V0TGluZVdpZHRoKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcik7CisgIHN0YXRpYyB2b2lkIFNldE11bHRpbGluZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYik7CisgIHN0YXRpYyB2b2lkIFNldE11bHRpcGxlU2VsZWN0aW9uKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiKTsKKyAgc3RhdGljIHZvaWQgU2V0UGFzc3dvcmQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGIpOworICBzdGF0aWMgdm9pZCBTZXRSZWN0KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiByZWN0KTsKKyAgc3RhdGljIHZvaWQgU2V0UmljaFRleHQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGIpOworICBzdGF0aWMgdm9pZCBTZXRSaWNoVmFsdWUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgpOworICBzdGF0aWMgdm9pZCBTZXRSb3RhdGlvbihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpOworICBzdGF0aWMgdm9pZCBTZXRTdHJva2VDb2xvcihDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKTsKKyAgc3RhdGljIHZvaWQgU2V0U3R5bGUoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKTsKKyAgc3RhdGljIHZvaWQgU2V0VGV4dENvbG9yKENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOworICBzdGF0aWMgdm9pZCBTZXRUZXh0Rm9udChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpOworICBzdGF0aWMgdm9pZCBTZXRUZXh0U2l6ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpOworICBzdGF0aWMgdm9pZCBTZXRVc2VyTmFtZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcpOworICBzdGF0aWMgdm9pZCBTZXRWYWx1ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19XaWRlU3RyaW5nQXJyYXkmIHN0ckFycmF5KTsKKworICBzdGF0aWMgdm9pZCBBZGRGaWVsZChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBuUGFnZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJjQ29vcmRzKTsKKworICBzdGF0aWMgdm9pZCBVcGRhdGVGb3JtRmllbGQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFuZ2VNYXJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVzZXRBUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlZnJlc2gpOworICBzdGF0aWMgdm9pZCBVcGRhdGVGb3JtQ29udHJvbChDUERGU0RLX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhbmdlTWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVzZXRBUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVmcmVzaCk7CisKKyAgc3RhdGljIENQREZTREtfV2lkZ2V0KiBHZXRXaWRnZXQoQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wpOworICBzdGF0aWMgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBHZXRGb3JtRmllbGRzKAorICAgICAgQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lKTsKKworICBzdGF0aWMgdm9pZCBEb0RlbGF5KENQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ0pTX0RlbGF5RGF0YSogcERhdGEpOworCisgIEZYX0JPT0wgQXR0YWNoRmllbGQoRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lKTsKKyAgdm9pZCBTZXREZWxheShGWF9CT09MIGJEZWxheSk7CisgIHZvaWQgU2V0SXNvbGF0ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSkgeyBtX2lzb2xhdGUgPSBpc29sYXRlOyB9CisKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgUGFyc2VGaWVsZE5hbWUoY29uc3Qgc3RkOjp3c3RyaW5nJiBzdHJGaWVsZE5hbWVQYXJzZWQsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjp3c3RyaW5nJiBzdHJGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgaW50JiBpQ29udHJvbE5vKTsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBHZXRGb3JtRmllbGRzKAorICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lKSBjb25zdDsKKyAgQ1BERl9Gb3JtQ29udHJvbCogR2V0U21hcnRGaWVsZENvbnRyb2woQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQpOworICBGWF9CT09MIFZhbHVlSXNPY2N1cihDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ0ZYX1dpZGVTdHJpbmcgY3NPcHRMYWJlbCk7CisKKyAgdm9pZCBBZGREZWxheV9JbnQoZW51bSBGSUVMRF9QUk9QIHByb3AsIGludDMyX3Qgbik7CisgIHZvaWQgQWRkRGVsYXlfQm9vbChlbnVtIEZJRUxEX1BST1AgcHJvcCwgYm9vbCBiKTsKKyAgdm9pZCBBZGREZWxheV9TdHJpbmcoZW51bSBGSUVMRF9QUk9QIHByb3AsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpOworICB2b2lkIEFkZERlbGF5X1dpZGVTdHJpbmcoZW51bSBGSUVMRF9QUk9QIHByb3AsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcpOworICB2b2lkIEFkZERlbGF5X1JlY3QoZW51bSBGSUVMRF9QUk9QIHByb3AsIGNvbnN0IENQREZfUmVjdCYgcmVjdCk7CisgIHZvaWQgQWRkRGVsYXlfQ29sb3IoZW51bSBGSUVMRF9QUk9QIHByb3AsIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKTsKKyAgdm9pZCBBZGREZWxheV9Xb3JkQXJyYXkoZW51bSBGSUVMRF9QUk9QIHByb3AsIGNvbnN0IENGWF9EV29yZEFycmF5JiBhcnJheSk7CisgIHZvaWQgQWRkRGVsYXlfV2lkZVN0cmluZ0FycmF5KGVudW0gRklFTERfUFJPUCBwcm9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfV2lkZVN0cmluZ0FycmF5JiBhcnJheSk7CisKKyAgdm9pZCBEb0RlbGF5KCk7CisKKyBwdWJsaWM6CisgIERvY3VtZW50KiBtX3BKU0RvYzsKKyAgQ1BERlNES19Eb2N1bWVudCogbV9wRG9jdW1lbnQ7CisgIENGWF9XaWRlU3RyaW5nIG1fRmllbGROYW1lOworICBpbnQgbV9uRm9ybUNvbnRyb2xJbmRleDsKKyAgRlhfQk9PTCBtX2JDYW5TZXQ7CisKKyAgRlhfQk9PTCBtX2JEZWxheTsKKyAgdjg6Oklzb2xhdGUqIG1faXNvbGF0ZTsKK307CisKK2NsYXNzIENKU19GaWVsZCA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKU19GaWVsZCh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9CisgIH5DSlNfRmllbGQodm9pZCkgb3ZlcnJpZGUge30KKworICB2b2lkIEluaXRJbnN0YW5jZShJSlNfUnVudGltZSogcElSdW50aW1lKSBvdmVycmlkZTsKKworICBERUNMQVJFX0pTX0NMQVNTKCk7CisgIEpTX1NUQVRJQ19QUk9QKGFsaWdubWVudCwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChib3JkZXJTdHlsZSwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChidXR0b25BbGlnblgsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AoYnV0dG9uQWxpZ25ZLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKGJ1dHRvbkZpdEJvdW5kcywgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChidXR0b25Qb3NpdGlvbiwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChidXR0b25TY2FsZUhvdywgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChidXR0b25TY2FsZVdoZW4sIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AoY2FsY09yZGVySW5kZXgsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AoY2hhckxpbWl0LCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKGNvbWIsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AoY29tbWl0T25TZWxDaGFuZ2UsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AoY3VycmVudFZhbHVlSW5kaWNlcywgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChkZWZhdWx0U3R5bGUsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AoZGVmYXVsdFZhbHVlLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKGRvTm90U2Nyb2xsLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKGRvTm90U3BlbGxDaGVjaywgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChkZWxheSwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChkaXNwbGF5LCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKGRvYywgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChlZGl0YWJsZSwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChleHBvcnRWYWx1ZXMsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AoZmlsZVNlbGVjdCwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChmaWxsQ29sb3IsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AoaGlkZGVuLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKGhpZ2hsaWdodCwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChsaW5lV2lkdGgsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AobXVsdGlsaW5lLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKG11bHRpcGxlU2VsZWN0aW9uLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKG5hbWUsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AobnVtSXRlbXMsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AocGFnZSwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChwYXNzd29yZCwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChwcmludCwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChyYWRpb3NJblVuaXNvbiwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChyZWFkb25seSwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChyZWN0LCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKHJlcXVpcmVkLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKHJpY2hUZXh0LCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKHJpY2hWYWx1ZSwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChyb3RhdGlvbiwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChzdHJva2VDb2xvciwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChzdHlsZSwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChzdWJtaXROYW1lLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKHRleHRDb2xvciwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUCh0ZXh0Rm9udCwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUCh0ZXh0U2l6ZSwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUCh0eXBlLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKHVzZXJOYW1lLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKHZhbHVlLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKHZhbHVlQXNTdHJpbmcsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1Aoc291cmNlLCBGaWVsZCk7CisKKyAgSlNfU1RBVElDX01FVEhPRChicm93c2VGb3JGaWxlVG9TdWJtaXQsIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChidXR0b25HZXRDYXB0aW9uLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoYnV0dG9uR2V0SWNvbiwgRmllbGQpOworICBKU19TVEFUSUNfTUVUSE9EKGJ1dHRvbkltcG9ydEljb24sIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChidXR0b25TZXRDYXB0aW9uLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoYnV0dG9uU2V0SWNvbiwgRmllbGQpOworICBKU19TVEFUSUNfTUVUSE9EKGNoZWNrVGhpc0JveCwgRmllbGQpOworICBKU19TVEFUSUNfTUVUSE9EKGNsZWFySXRlbXMsIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChkZWZhdWx0SXNDaGVja2VkLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoZGVsZXRlSXRlbUF0LCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoZ2V0QXJyYXksIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChnZXRJdGVtQXQsIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChnZXRMb2NrLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoaW5zZXJ0SXRlbUF0LCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoaXNCb3hDaGVja2VkLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoaXNEZWZhdWx0Q2hlY2tlZCwgRmllbGQpOworICBKU19TVEFUSUNfTUVUSE9EKHNldEFjdGlvbiwgRmllbGQpOworICBKU19TVEFUSUNfTUVUSE9EKHNldEZvY3VzLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0Qoc2V0SXRlbXMsIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChzZXRMb2NrLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0Qoc2lnbmF0dXJlR2V0TW9kaWZpY2F0aW9ucywgRmllbGQpOworICBKU19TVEFUSUNfTUVUSE9EKHNpZ25hdHVyZUdldFNlZWRWYWx1ZSwgRmllbGQpOworICBKU19TVEFUSUNfTUVUSE9EKHNpZ25hdHVyZUluZm8sIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChzaWduYXR1cmVTZXRTZWVkVmFsdWUsIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChzaWduYXR1cmVTaWduLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0Qoc2lnbmF0dXJlVmFsaWRhdGUsIEZpZWxkKTsKK307CisKKyNlbmRpZiAgLy8gRlBERlNES19TUkNfSkFWQVNDUklQVF9GSUVMRF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9JY29uLmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSWNvbi5jcHAKaW5kZXggOGMwNTExNi4uYmNlNjZjMCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9JY29uLmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ljb24uY3BwCkBAIC0xLDE1ICsxLDE1IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSmF2YVNjcmlwdC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19EZWZpbmUuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1ZhbHVlLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0ljb24uaCIKKyNpbmNsdWRlICJJY29uLmgiCisKKyNpbmNsdWRlICJKU19EZWZpbmUuaCIKKyNpbmNsdWRlICJKU19PYmplY3QuaCIKKyNpbmNsdWRlICJKU19WYWx1ZS5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSWNvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTE3LDUxICsxNyw0MCBAQAogRU5EX0pTX1NUQVRJQ19DT05TVCgpCiAKIEJFR0lOX0pTX1NUQVRJQ19QUk9QKENKU19JY29uKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKG5hbWUpCitKU19TVEFUSUNfUFJPUF9FTlRSWShuYW1lKQogRU5EX0pTX1NUQVRJQ19QUk9QKCkKIAotQkVHSU5fSlNfU1RBVElDX01FVEhPRChDSlNfSWNvbikgCitCRUdJTl9KU19TVEFUSUNfTUVUSE9EKENKU19JY29uKQogRU5EX0pTX1NUQVRJQ19NRVRIT0QoKQogCi1JTVBMRU1FTlRfSlNfQ0xBU1MoQ0pTX0ljb24sSWNvbikKK0lNUExFTUVOVF9KU19DTEFTUyhDSlNfSWNvbiwgSWNvbikKIAotSWNvbjo6SWNvbihDSlNfT2JqZWN0KiBwSlNPYmplY3QpIDogQ0pTX0VtYmVkT2JqKHBKU09iamVjdCksCi0JbV9wSWNvblN0cmVhbShOVUxMKSwKLQltX3N3SWNvbk5hbWUoTCIiKQoteworSWNvbjo6SWNvbihDSlNfT2JqZWN0KiBwSlNPYmplY3QpCisgICAgOiBDSlNfRW1iZWRPYmoocEpTT2JqZWN0KSwgbV9wSWNvblN0cmVhbShOVUxMKSwgbV9zd0ljb25OYW1lKEwiIikge30KKworSWNvbjo6fkljb24oKSB7fQorCit2b2lkIEljb246OlNldFN0cmVhbShDUERGX1N0cmVhbSogcEljb25TdHJlYW0pIHsKKyAgaWYgKHBJY29uU3RyZWFtKQorICAgIG1fcEljb25TdHJlYW0gPSBwSWNvblN0cmVhbTsKIH0KIAotSWNvbjo6fkljb24oKQotewotCitDUERGX1N0cmVhbSogSWNvbjo6R2V0U3RyZWFtKCkgeworICByZXR1cm4gbV9wSWNvblN0cmVhbTsKIH0KIAotdm9pZCBJY29uOjpTZXRTdHJlYW0oQ1BERl9TdHJlYW0qIHBJY29uU3RyZWFtKQotewotCWlmKHBJY29uU3RyZWFtKQotCQltX3BJY29uU3RyZWFtID0gcEljb25TdHJlYW07Cit2b2lkIEljb246OlNldEljb25OYW1lKENGWF9XaWRlU3RyaW5nIG5hbWUpIHsKKyAgbV9zd0ljb25OYW1lID0gbmFtZTsKIH0KIAotQ1BERl9TdHJlYW0qIEljb246OkdldFN0cmVhbSgpCi17Ci0JcmV0dXJuIG1fcEljb25TdHJlYW07CitDRlhfV2lkZVN0cmluZyBJY29uOjpHZXRJY29uTmFtZSgpIHsKKyAgcmV0dXJuIG1fc3dJY29uTmFtZTsKIH0KIAotdm9pZCBJY29uOjpTZXRJY29uTmFtZShDRlhfV2lkZVN0cmluZyBuYW1lKQotewotCW1fc3dJY29uTmFtZSA9IG5hbWU7CitGWF9CT09MIEljb246Om5hbWUoSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAoIXZwLklzR2V0dGluZygpKQorICAgIHJldHVybiBGQUxTRTsKKworICB2cCA8PCBtX3N3SWNvbk5hbWU7CisgIHJldHVybiBUUlVFOwogfQotCi1DRlhfV2lkZVN0cmluZyBJY29uOjpHZXRJY29uTmFtZSgpCi17Ci0JcmV0dXJuIG1fc3dJY29uTmFtZTsKLX0KLQotRlhfQk9PTCBJY29uOjpuYW1lKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlpZighdnAuSXNHZXR0aW5nKCkpcmV0dXJuIEZBTFNFOwotCi0JdnAgPDwgbV9zd0ljb25OYW1lOwotCXJldHVybiBUUlVFOwotfQotCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ljb24uaCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSWNvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYTMxNTMKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ljb24uaApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlBERlNES19TUkNfSkFWQVNDUklQVF9JQ09OX0hfCisjZGVmaW5lIEZQREZTREtfU1JDX0pBVkFTQ1JJUFRfSUNPTl9IXworCisjaW5jbHVkZSAiSlNfRGVmaW5lLmgiCisKK2NsYXNzIEljb24gOiBwdWJsaWMgQ0pTX0VtYmVkT2JqIHsKKyBwdWJsaWM6CisgIEljb24oQ0pTX09iamVjdCogcEpTT2JqZWN0KTsKKyAgfkljb24oKSBvdmVycmlkZTsKKworICBGWF9CT09MIG5hbWUoSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIHZvaWQgU2V0U3RyZWFtKENQREZfU3RyZWFtKiBwSWNvblN0cmVhbSk7CisgIENQREZfU3RyZWFtKiBHZXRTdHJlYW0oKTsKKyAgdm9pZCBTZXRJY29uTmFtZShDRlhfV2lkZVN0cmluZyBuYW1lKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0SWNvbk5hbWUoKTsKKworIHByaXZhdGU6CisgIENQREZfU3RyZWFtKiBtX3BJY29uU3RyZWFtOworICBDRlhfV2lkZVN0cmluZyBtX3N3SWNvbk5hbWU7Cit9OworCitjbGFzcyBDSlNfSWNvbiA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIENKU19JY29uKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge30KKyAgfkNKU19JY29uKCkgb3ZlcnJpZGUge30KKworICBERUNMQVJFX0pTX0NMQVNTKCk7CisgIEpTX1NUQVRJQ19QUk9QKG5hbWUsIEljb24pOworfTsKKworI2VuZGlmICAvLyBGUERGU0RLX1NSQ19KQVZBU0NSSVBUX0lDT05fSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfQ29udGV4dC5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0NvbnRleHQuY3BwCmluZGV4IDI3N2FiYzAuLjlkYmY1ZWQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfQ29udGV4dC5jcHAKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19Db250ZXh0LmNwcApAQCAtMSwzNTUgKzEsMjg0IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSmF2YVNjcmlwdC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oIgotLy8jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1Jlc01nci5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19Db250ZXh0LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19SdW50aW1lLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L3Jlc291cmNlLmgiCisjaW5jbHVkZSAiSlNfQ29udGV4dC5oIgorCisjaW5jbHVkZSAiSlNfRXZlbnRIYW5kbGVyLmgiCisjaW5jbHVkZSAiSlNfUnVudGltZS5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiCisjaW5jbHVkZSAicmVzb3VyY2UuaCIKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0pTX0NvbnRleHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ0pTX0NvbnRleHQ6OkNKU19Db250ZXh0KENKU19SdW50aW1lKiBwUnVudGltZSkgOiAJCi0JbV9wUnVudGltZShwUnVudGltZSksCi0JbV9iQnVzeShGQUxTRSksCi0JbV9iTXNnQm94RW5hYmxlKFRSVUUpCi17Ci0JbV9wRXZlbnRIYW5kbGVyID0gbmV3IENKU19FdmVudEhhbmRsZXIodGhpcyk7CitDSlNfQ29udGV4dDo6Q0pTX0NvbnRleHQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKQorICAgIDogbV9wUnVudGltZShwUnVudGltZSksIG1fYkJ1c3koRkFMU0UpLCBtX2JNc2dCb3hFbmFibGUoVFJVRSkgeworICBtX3BFdmVudEhhbmRsZXIgPSBuZXcgQ0pTX0V2ZW50SGFuZGxlcih0aGlzKTsKIH0KIAotQ0pTX0NvbnRleHQ6On5DSlNfQ29udGV4dCh2b2lkKQotewotCWlmIChtX3BFdmVudEhhbmRsZXIpCi0JewotCQlkZWxldGUgbV9wRXZlbnRIYW5kbGVyOwotCQltX3BFdmVudEhhbmRsZXIgPSBOVUxMOwotCX0KK0NKU19Db250ZXh0Ojp+Q0pTX0NvbnRleHQoKSB7CisgIGRlbGV0ZSBtX3BFdmVudEhhbmRsZXI7CiB9CiAKLUNQREZTREtfRG9jdW1lbnQqIENKU19Db250ZXh0OjpHZXRSZWFkZXJEb2N1bWVudCgpCi17Ci0JQVNTRVJUKG1fcFJ1bnRpbWUgIT0gTlVMTCk7Ci0KLQlyZXR1cm4gbV9wUnVudGltZS0+R2V0UmVhZGVyRG9jdW1lbnQoKTsKK0NQREZTREtfRG9jdW1lbnQqIENKU19Db250ZXh0OjpHZXRSZWFkZXJEb2N1bWVudCgpIHsKKyAgcmV0dXJuIG1fcFJ1bnRpbWUtPkdldFJlYWRlckRvY3VtZW50KCk7CiB9CiAKLUNQREZEb2NfRW52aXJvbm1lbnQqIENKU19Db250ZXh0OjpHZXRSZWFkZXJBcHAoKQotewotCUFTU0VSVChtX3BSdW50aW1lICE9IE5VTEwpOwotCQotCXJldHVybiBtX3BSdW50aW1lLT5HZXRSZWFkZXJBcHAoKTsKK0NQREZEb2NfRW52aXJvbm1lbnQqIENKU19Db250ZXh0OjpHZXRSZWFkZXJBcHAoKSB7CisgIHJldHVybiBtX3BSdW50aW1lLT5HZXRSZWFkZXJBcHAoKTsKIH0KIAotRlhfQk9PTCBDSlNfQ29udGV4dDo6RG9Kb2IoaW50IG5Nb2RlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LCBDRlhfV2lkZVN0cmluZyYgaW5mbykKLXsKLQlpZiAobV9iQnVzeSkKLQl7CQkKLQkJaW5mbyA9IEpTR2V0U3RyaW5nRnJvbUlEKHRoaXMsIElEU19TVFJJTkdfSlNCVVNZKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0JCitGWF9CT09MIENKU19Db250ZXh0OjpSdW5TY3JpcHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyogaW5mbykgeworICB2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShtX3BSdW50aW1lLT5HZXRJc29sYXRlKCkpOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIHY4OjpMb2NrZXIgbG9ja2VyKG1fcFJ1bnRpbWUtPkdldElzb2xhdGUoKSk7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUobV9wUnVudGltZS0+R2V0SXNvbGF0ZSgpKTsKKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gbV9wUnVudGltZS0+TmV3SlNDb250ZXh0KCk7CisgIHY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0X3Njb3BlKGNvbnRleHQpOwogCi0JbV9iQnVzeSA9IFRSVUU7CisgIGlmIChtX2JCdXN5KSB7CisgICAgKmluZm8gPSBKU0dldFN0cmluZ0Zyb21JRCh0aGlzLCBJRFNfU1RSSU5HX0pTQlVTWSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIG1fYkJ1c3kgPSBUUlVFOwogCi0JQVNTRVJUKG1fcFJ1bnRpbWUgIT0gTlVMTCk7Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQlBU1NFUlQobV9wRXZlbnRIYW5kbGVyLT5Jc1ZhbGlkKCkpOworICBBU1NFUlQobV9wRXZlbnRIYW5kbGVyLT5Jc1ZhbGlkKCkpOworICBDSlNfUnVudGltZTo6RmllbGRFdmVudCBldmVudChtX3BFdmVudEhhbmRsZXItPlRhcmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRXZlbnRIYW5kbGVyLT5FdmVudFR5cGUoKSk7CisgIGlmICghbV9wUnVudGltZS0+QWRkRXZlbnRUb1NldChldmVudCkpIHsKKyAgICAqaW5mbyA9IEpTR2V0U3RyaW5nRnJvbUlEKHRoaXMsIElEU19TVFJJTkdfSlNFVkVOVCk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLQlpZiAoIW1fcFJ1bnRpbWUtPkFkZEV2ZW50VG9Mb29wKG1fcEV2ZW50SGFuZGxlci0+VGFyZ2V0TmFtZSgpLCBtX3BFdmVudEhhbmRsZXItPkV2ZW50VHlwZSgpKSkKLQl7Ci0JCWluZm8gPSBKU0dldFN0cmluZ0Zyb21JRCh0aGlzLCBJRFNfU1RSSU5HX0pTRVZFTlQpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQorICBDRlhfV2lkZVN0cmluZyBzRXJyb3JNZXNzYWdlOworICBpbnQgblJldCA9IDA7CisgIGlmIChzY3JpcHQuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgblJldCA9IG1fcFJ1bnRpbWUtPkV4ZWN1dGUodGhpcywgc2NyaXB0LmNfc3RyKCksICZzRXJyb3JNZXNzYWdlKTsKKyAgfQogCi0JRlhKU0VyciBlcnJvciA9e05VTEwsTlVMTCwgMH07Ci0JaW50IG5SZXQgPSAwOwkKKyAgaWYgKG5SZXQgPCAwKSB7CisgICAgKmluZm8gKz0gc0Vycm9yTWVzc2FnZTsKKyAgfSBlbHNlIHsKKyAgICAqaW5mbyA9IEpTR2V0U3RyaW5nRnJvbUlEKHRoaXMsIElEU19TVFJJTkdfUlVOKTsKKyAgfQogCi0JaWYgKHNjcmlwdC5HZXRMZW5ndGgoKSA+IDApCi0JewotCQlpZiAobk1vZGUgPT0gMCkKLQkJewotCQkJblJldCA9IEpTX0V4ZWN1dGUoKm1fcFJ1bnRpbWUsIHRoaXMsIHNjcmlwdC5jX3N0cigpLCBzY3JpcHQuR2V0TGVuZ3RoKCksICZlcnJvcik7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQluUmV0ID0gSlNfUGFyc2UoKm1fcFJ1bnRpbWUsIHRoaXMsIHNjcmlwdC5jX3N0cigpLCBzY3JpcHQuR2V0TGVuZ3RoKCksICZlcnJvcik7Ci0JCX0KLQl9CisgIG1fcFJ1bnRpbWUtPlJlbW92ZUV2ZW50RnJvbVNldChldmVudCk7CisgIG1fcEV2ZW50SGFuZGxlci0+RGVzdHJveSgpOworICBtX2JCdXN5ID0gRkFMU0U7CiAKLQlpZiAoblJldCA8IDApCi0JewotCQlDRlhfV2lkZVN0cmluZyBzTGluZTsKLQkJc0xpbmUuRm9ybWF0KEwiWyBMaW5lOiAlMDVkIHsgJXMgfSBdIDogJXMiLGVycm9yLmxpbm51bS0xLGVycm9yLnNyY2xpbmUsZXJyb3IubWVzc2FnZSk7Ci0KLS8vCQkJVFJBQ0UoTCIvKiAtLS0tLS0tLS0tLS0tLSBKUyBFcnJvciAtLS0tLS0tLS0tLS0tLSAqL1xuIik7Ci0vLwkJCVRSQUNFKHNMaW5lKTsKLS8vCQkJVFJBQ0UoTCJcbiIpOwotCQkvL0NGWF9CeXRlU3RyaW5nIHNUZW1wID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKGVycm9yLm1lc3NhZ2UpOwotCQlpbmZvICs9IHNMaW5lOwotCX0KLQllbHNlCi0JewotCQlpbmZvID0gSlNHZXRTdHJpbmdGcm9tSUQodGhpcywgSURTX1NUUklOR19SVU4pOwotCX0KLQotCW1fcFJ1bnRpbWUtPlJlbW92ZUV2ZW50SW5Mb29wKG1fcEV2ZW50SGFuZGxlci0+VGFyZ2V0TmFtZSgpLCBtX3BFdmVudEhhbmRsZXItPkV2ZW50VHlwZSgpKTsKLQotCW1fcEV2ZW50SGFuZGxlci0+RGVzdHJveSgpOwotCW1fYkJ1c3kgPSBGQUxTRTsJCi0KLQlyZXR1cm4gblJldCA+PSAwOworICByZXR1cm4gblJldCA+PSAwOwogfQogCi1GWF9CT09MIENKU19Db250ZXh0OjpSdW5TY3JpcHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwgQ0ZYX1dpZGVTdHJpbmcmIGluZm8pCi17Ci0Jdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUobV9wUnVudGltZS0+R2V0SXNvbGF0ZSgpKTsKLQl2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKG1fcFJ1bnRpbWUtPkdldElzb2xhdGUoKSk7Ci0Jdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gbV9wUnVudGltZS0+TmV3SlNDb250ZXh0KCk7Ci0Jdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRfc2NvcGUoY29udGV4dCk7Ci0KLQlyZXR1cm4gRG9Kb2IoMCwgc2NyaXB0LCBpbmZvKTsKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uQXBwX0luaXQoKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25BcHBfSW5pdCgpOwogfQogCi1GWF9CT09MIENKU19Db250ZXh0OjpDb21waWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nJiBpbmZvKQotewotCXY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKG1fcFJ1bnRpbWUtPkdldElzb2xhdGUoKSk7Ci0Jdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShtX3BSdW50aW1lLT5HZXRJc29sYXRlKCkpOwotCXY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IG1fcFJ1bnRpbWUtPk5ld0pTQ29udGV4dCgpOwotCXY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0X3Njb3BlKGNvbnRleHQpOwotCi0JcmV0dXJuIERvSm9iKDEsIHNjcmlwdCwgaW5mbyk7Cit2b2lkIENKU19Db250ZXh0OjpPbkRvY19PcGVuKENQREZTREtfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJUYXJnZXROYW1lKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25Eb2NfT3BlbihwRG9jLCBzdHJUYXJnZXROYW1lKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25BcHBfSW5pdCgpCi17Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQltX3BFdmVudEhhbmRsZXItPk9uQXBwX0luaXQoKTsKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uRG9jX1dpbGxQcmludChDUERGU0RLX0RvY3VtZW50KiBwRG9jKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25Eb2NfV2lsbFByaW50KHBEb2MpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkRvY19PcGVuKENQREZTREtfRG9jdW1lbnQqIHBEb2MsIGNvbnN0IENGWF9XaWRlU3RyaW5nICZzdHJUYXJnZXROYW1lKQotewotCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7Ci0JbV9wRXZlbnRIYW5kbGVyLT5PbkRvY19PcGVuKHBEb2Msc3RyVGFyZ2V0TmFtZSk7Cit2b2lkIENKU19Db250ZXh0OjpPbkRvY19EaWRQcmludChDUERGU0RLX0RvY3VtZW50KiBwRG9jKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25Eb2NfRGlkUHJpbnQocERvYyk7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uRG9jX1dpbGxQcmludChDUERGU0RLX0RvY3VtZW50KiBwRG9jKQotewotCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7Ci0JbV9wRXZlbnRIYW5kbGVyLT5PbkRvY19XaWxsUHJpbnQocERvYyk7Cit2b2lkIENKU19Db250ZXh0OjpPbkRvY19XaWxsU2F2ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25Eb2NfV2lsbFNhdmUocERvYyk7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uRG9jX0RpZFByaW50KENQREZTREtfRG9jdW1lbnQqIHBEb2MpCi17Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQltX3BFdmVudEhhbmRsZXItPk9uRG9jX0RpZFByaW50KHBEb2MpOwordm9pZCBDSlNfQ29udGV4dDo6T25Eb2NfRGlkU2F2ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25Eb2NfRGlkU2F2ZShwRG9jKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25Eb2NfV2lsbFNhdmUoQ1BERlNES19Eb2N1bWVudCogcERvYykKLXsKLQlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwotCW1fcEV2ZW50SGFuZGxlci0+T25Eb2NfV2lsbFNhdmUocERvYyk7Cit2b2lkIENKU19Db250ZXh0OjpPbkRvY19XaWxsQ2xvc2UoQ1BERlNES19Eb2N1bWVudCogcERvYykgeworICBtX3BFdmVudEhhbmRsZXItPk9uRG9jX1dpbGxDbG9zZShwRG9jKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25Eb2NfRGlkU2F2ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jKQotewotCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7Ci0JbV9wRXZlbnRIYW5kbGVyLT5PbkRvY19EaWRTYXZlKHBEb2MpOwordm9pZCBDSlNfQ29udGV4dDo6T25QYWdlX09wZW4oQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCkgeworICBtX3BFdmVudEhhbmRsZXItPk9uUGFnZV9PcGVuKHBUYXJnZXQpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkRvY19XaWxsQ2xvc2UoQ1BERlNES19Eb2N1bWVudCogcERvYykKLXsKLQlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwotCW1fcEV2ZW50SGFuZGxlci0+T25Eb2NfV2lsbENsb3NlKHBEb2MpOwordm9pZCBDSlNfQ29udGV4dDo6T25QYWdlX0Nsb3NlKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpIHsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PblBhZ2VfQ2xvc2UocFRhcmdldCk7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uUGFnZV9PcGVuKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpCi17Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQltX3BFdmVudEhhbmRsZXItPk9uUGFnZV9PcGVuKHBUYXJnZXQpOwordm9pZCBDSlNfQ29udGV4dDo6T25QYWdlX0luVmlldyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25QYWdlX0luVmlldyhwVGFyZ2V0KTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25QYWdlX0Nsb3NlKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpCi17Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQltX3BFdmVudEhhbmRsZXItPk9uUGFnZV9DbG9zZShwVGFyZ2V0KTsKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uUGFnZV9PdXRWaWV3KENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpIHsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PblBhZ2VfT3V0VmlldyhwVGFyZ2V0KTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25QYWdlX0luVmlldyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KQotewotCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7Ci0JbV9wRXZlbnRIYW5kbGVyLT5PblBhZ2VfSW5WaWV3KHBUYXJnZXQpOwordm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9Nb3VzZURvd24oYk1vZGlmaWVyLCBiU2hpZnQsIHBUYXJnZXQpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblBhZ2VfT3V0VmlldyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KQotewotCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7Ci0JbV9wRXZlbnRIYW5kbGVyLT5PblBhZ2VfT3V0VmlldyhwVGFyZ2V0KTsKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfTW91c2VFbnRlcihGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgeworICBtX3BFdmVudEhhbmRsZXItPk9uRmllbGRfTW91c2VFbnRlcihiTW9kaWZpZXIsIGJTaGlmdCwgcFRhcmdldCk7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfTW91c2VEb3duKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQgKnBUYXJnZXQpCi17Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQltX3BFdmVudEhhbmRsZXItPk9uRmllbGRfTW91c2VEb3duKGJNb2RpZmllciwgYlNoaWZ0LCBwVGFyZ2V0KTsKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfTW91c2VFeGl0KEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgeworICBtX3BFdmVudEhhbmRsZXItPk9uRmllbGRfTW91c2VFeGl0KGJNb2RpZmllciwgYlNoaWZ0LCBwVGFyZ2V0KTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9Nb3VzZUVudGVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQgKnBUYXJnZXQpCi17Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQltX3BFdmVudEhhbmRsZXItPk9uRmllbGRfTW91c2VFbnRlcihiTW9kaWZpZXIsIGJTaGlmdCwgcFRhcmdldCk7Cit2b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX01vdXNlVXAoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpIHsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX01vdXNlVXAoYk1vZGlmaWVyLCBiU2hpZnQsIHBUYXJnZXQpOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkICpwVGFyZ2V0KQotewotCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7Ci0JbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX01vdXNlRXhpdChiTW9kaWZpZXIsIGJTaGlmdCwgcFRhcmdldCk7Cit2b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSkgeworICBtX3BFdmVudEhhbmRsZXItPk9uRmllbGRfRm9jdXMoYk1vZGlmaWVyLCBiU2hpZnQsIHBUYXJnZXQsIFZhbHVlKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9Nb3VzZVVwKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQgKnBUYXJnZXQpCi17Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQltX3BFdmVudEhhbmRsZXItPk9uRmllbGRfTW91c2VVcChiTW9kaWZpZXIsIGJTaGlmdCwgcFRhcmdldCk7Cit2b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX0JsdXIoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9CbHVyKGJNb2RpZmllciwgYlNoaWZ0LCBwVGFyZ2V0LCBWYWx1ZSk7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKQotewotCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7Ci0JbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX0ZvY3VzKGJNb2RpZmllciwgYlNoaWZ0LCBwVGFyZ2V0LCBWYWx1ZSk7Cit2b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX0NhbGN1bGF0ZShDUERGX0Zvcm1GaWVsZCogcFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlJjKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9DYWxjdWxhdGUocFNvdXJjZSwgcFRhcmdldCwgVmFsdWUsIGJSYyk7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfQmx1cihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpCi17Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQltX3BFdmVudEhhbmRsZXItPk9uRmllbGRfQmx1cihiTW9kaWZpZXIsIGJTaGlmdCwgcFRhcmdldCwgVmFsdWUpOwordm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJXaWxsQ29tbWl0KSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9Gb3JtYXQocFRhcmdldCwgVmFsdWUsIGJXaWxsQ29tbWl0KTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9DYWxjdWxhdGUoQ1BERl9Gb3JtRmllbGQqIHBTb3VyY2UsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wmIGJSYykKLXsKLQlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwotCW1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9DYWxjdWxhdGUocFNvdXJjZSwgcFRhcmdldCwgVmFsdWUsIGJSYyk7Cit2b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX0tleXN0cm9rZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiS2V5RG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBuU2VsRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBuU2VsU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiV2lsbENvbW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpZWxkRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSYykgeworICBtX3BFdmVudEhhbmRsZXItPk9uRmllbGRfS2V5c3Ryb2tlKAorICAgICAgc3RyQ2hhbmdlLCBzdHJDaGFuZ2VFeCwgYktleURvd24sIGJNb2RpZmllciwgblNlbEVuZCwgblNlbFN0YXJ0LCBiU2hpZnQsCisgICAgICBwVGFyZ2V0LCBWYWx1ZSwgYldpbGxDb21taXQsIGJGaWVsZEZ1bGwsIGJSYyk7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uRmllbGRfRm9ybWF0KGludCBuQ29tbWl0S2V5LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MIGJXaWxsQ29tbWl0KQotewotCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7Ci0JbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX0Zvcm1hdChuQ29tbWl0S2V5LCBwVGFyZ2V0LCBWYWx1ZSwgYldpbGxDb21taXQpOwordm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9WYWxpZGF0ZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYktleURvd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlJjKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9WYWxpZGF0ZShzdHJDaGFuZ2UsIHN0ckNoYW5nZUV4LCBiS2V5RG93biwgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNoaWZ0LCBwVGFyZ2V0LCBWYWx1ZSwgYlJjKTsKIH0KIAotCi12b2lkIENKU19Db250ZXh0OjpPbkZpZWxkX0tleXN0cm9rZShpbnQgbkNvbW1pdEtleSwgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAotCQkJCQkJCQkJRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCBiTW9kaWZpZXIsIGludCAmblNlbEVuZCxpbnQgJm5TZWxTdGFydCwKLQkJCQkJCQkJCUZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAotCQkJCQkJCQkJRlhfQk9PTCBiV2lsbENvbW1pdCwgRlhfQk9PTCBiRmllbGRGdWxsLCBGWF9CT09MJiBiUmMpCi17Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQltX3BFdmVudEhhbmRsZXItPk9uRmllbGRfS2V5c3Ryb2tlKG5Db21taXRLZXksIHN0ckNoYW5nZSwgc3RyQ2hhbmdlRXgsIGJLZXlEb3duLAotCQliTW9kaWZpZXIsIG5TZWxFbmQsIG5TZWxTdGFydCwgYlNoaWZ0LCBwVGFyZ2V0LCBWYWx1ZSwgYldpbGxDb21taXQsIGJGaWVsZEZ1bGwsIGJSYyk7Cit2b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9Gb2N1cyhGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgeworICBtX3BFdmVudEhhbmRsZXItPk9uU2NyZWVuX0ZvY3VzKGJNb2RpZmllciwgYlNoaWZ0LCBwU2NyZWVuKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25GaWVsZF9WYWxpZGF0ZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKLQkJCQkJCQkJICAgRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKLQkJCQkJCQkJICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLCBGWF9CT09MJiBiUmMpCi17Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQltX3BFdmVudEhhbmRsZXItPk9uRmllbGRfVmFsaWRhdGUoc3RyQ2hhbmdlLCBzdHJDaGFuZ2VFeCwgYktleURvd24sIGJNb2RpZmllciwgYlNoaWZ0LCBwVGFyZ2V0LCBWYWx1ZSwgYlJjKTsKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uU2NyZWVuX0JsdXIoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fQmx1cihiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uU2NyZWVuX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKLXsKLQlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwotCW1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fRm9jdXMoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwordm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fT3BlbihGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIHsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9PcGVuKGJNb2RpZmllciwgYlNoaWZ0LCBwU2NyZWVuKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fQmx1cihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCi17Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQltX3BFdmVudEhhbmRsZXItPk9uU2NyZWVuX0JsdXIoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwordm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fQ2xvc2UoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIHsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9DbG9zZShiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uU2NyZWVuX09wZW4oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQotewotCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7Ci0JbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9PcGVuKGJNb2RpZmllciwgYlNoaWZ0LCBwU2NyZWVuKTsKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uU2NyZWVuX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fTW91c2VEb3duKGJNb2RpZmllciwgYlNoaWZ0LCBwU2NyZWVuKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fQ2xvc2UoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQotewotCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7Ci0JbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9DbG9zZShiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7Cit2b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9Nb3VzZVVwKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgeworICBtX3BFdmVudEhhbmRsZXItPk9uU2NyZWVuX01vdXNlVXAoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQotewotCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7Ci0JbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9Nb3VzZURvd24oYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwordm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fTW91c2VFbnRlcihGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIHsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9Nb3VzZUVudGVyKGJNb2RpZmllciwgYlNoaWZ0LCBwU2NyZWVuKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fTW91c2VVcChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCi17Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQltX3BFdmVudEhhbmRsZXItPk9uU2NyZWVuX01vdXNlVXAoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwordm9pZCBDSlNfQ29udGV4dDo6T25TY3JlZW5fTW91c2VFeGl0KEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIHsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9Nb3VzZUV4aXQoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9Nb3VzZUVudGVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKLXsKLQlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwotCW1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fTW91c2VFbnRlcihiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7Cit2b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9JblZpZXcoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgeworICBtX3BFdmVudEhhbmRsZXItPk9uU2NyZWVuX0luVmlldyhiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uU2NyZWVuX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCi17Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQltX3BFdmVudEhhbmRsZXItPk9uU2NyZWVuX01vdXNlRXhpdChiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7Cit2b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9PdXRWaWV3KEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgeworICBtX3BFdmVudEhhbmRsZXItPk9uU2NyZWVuX091dFZpZXcoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9JblZpZXcoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQotewotCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7Ci0JbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9JblZpZXcoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwordm9pZCBDSlNfQ29udGV4dDo6T25Cb29rbWFya19Nb3VzZVVwKENQREZfQm9va21hcmsqIHBCb29rTWFyaykgeworICBtX3BFdmVudEhhbmRsZXItPk9uQm9va21hcmtfTW91c2VVcChwQm9va01hcmspOwogfQogCi12b2lkIENKU19Db250ZXh0OjpPblNjcmVlbl9PdXRWaWV3KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKLXsKLQlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwotCW1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fT3V0VmlldyhiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7Cit2b2lkIENKU19Db250ZXh0OjpPbkxpbmtfTW91c2VVcChDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25MaW5rX01vdXNlVXAocFRhcmdldCk7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uQm9va21hcmtfTW91c2VVcChDUERGX0Jvb2ttYXJrKiBwQm9va01hcmspCi17Ci0JQVNTRVJUKG1fcEV2ZW50SGFuZGxlciAhPSBOVUxMKTsKLQltX3BFdmVudEhhbmRsZXItPk9uQm9va21hcmtfTW91c2VVcChwQm9va01hcmspOwordm9pZCBDSlNfQ29udGV4dDo6T25Db25zb2xlX0V4ZWMoKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25Db25zb2xlX0V4ZWMoKTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25MaW5rX01vdXNlVXAoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCkKLXsKLQlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwotCW1fcEV2ZW50SGFuZGxlci0+T25MaW5rX01vdXNlVXAocFRhcmdldCk7Cit2b2lkIENKU19Db250ZXh0OjpPbkV4dGVybmFsX0V4ZWMoKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25FeHRlcm5hbF9FeGVjKCk7CiB9CiAKLXZvaWQgQ0pTX0NvbnRleHQ6Ok9uQ29uc29sZV9FeGVjKCkKLXsKLQlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwotCW1fcEV2ZW50SGFuZGxlci0+T25Db25zb2xlX0V4ZWMoKTsKK3ZvaWQgQ0pTX0NvbnRleHQ6Ok9uQmF0Y2hFeGVjKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpIHsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PbkJhdGNoRXhlYyhwVGFyZ2V0KTsKIH0KIAotdm9pZCBDSlNfQ29udGV4dDo6T25FeHRlcm5hbF9FeGVjKCkKLXsKLQlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwotCW1fcEV2ZW50SGFuZGxlci0+T25FeHRlcm5hbF9FeGVjKCk7Cit2b2lkIENKU19Db250ZXh0OjpPbk1lbnVfRXhlYyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0clRhcmdldE5hbWUpIHsKKyAgbV9wRXZlbnRIYW5kbGVyLT5Pbk1lbnVfRXhlYyhwVGFyZ2V0LCBzdHJUYXJnZXROYW1lKTsKIH0KLQotdm9pZCBDSlNfQ29udGV4dDo6T25CYXRjaEV4ZWMoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCkKLXsKLQlBU1NFUlQobV9wRXZlbnRIYW5kbGVyICE9IE5VTEwpOwkKLQltX3BFdmVudEhhbmRsZXItPk9uQmF0Y2hFeGVjKHBUYXJnZXQpOwotfQotCi12b2lkIENKU19Db250ZXh0OjpPbk1lbnVfRXhlYyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0LGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJUYXJnZXROYW1lKQotewotCUFTU0VSVChtX3BFdmVudEhhbmRsZXIgIT0gTlVMTCk7Ci0JbV9wRXZlbnRIYW5kbGVyLT5Pbk1lbnVfRXhlYyhwVGFyZ2V0LCBzdHJUYXJnZXROYW1lKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19Db250ZXh0LmggYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2VmMTUyCi0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19Db250ZXh0LmgKQEAgLTAsMCArMSwxMzcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGUERGU0RLX1NSQ19KQVZBU0NSSVBUX0pTX0NPTlRFWFRfSF8KKyNkZWZpbmUgRlBERlNES19TUkNfSkFWQVNDUklQVF9KU19DT05URVhUX0hfCisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiCisKK2NsYXNzIENKU19FdmVudEhhbmRsZXI7CitjbGFzcyBDSlNfUnVudGltZTsKKworY2xhc3MgQ0pTX0NvbnRleHQgOiBwdWJsaWMgSUpTX0NvbnRleHQgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pTX0NvbnRleHQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgfkNKU19Db250ZXh0KCkgb3ZlcnJpZGU7CisKKyAgLy8gSUpTX0NvbnRleHQKKyAgRlhfQk9PTCBSdW5TY3JpcHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcqIGluZm8pIG92ZXJyaWRlOworICB2b2lkIE9uQXBwX0luaXQoKSBvdmVycmlkZTsKKyAgdm9pZCBPbkRvY19PcGVuKENQREZTREtfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyVGFyZ2V0TmFtZSkgb3ZlcnJpZGU7CisgIHZvaWQgT25Eb2NfV2lsbFByaW50KENQREZTREtfRG9jdW1lbnQqIHBEb2MpIG92ZXJyaWRlOworICB2b2lkIE9uRG9jX0RpZFByaW50KENQREZTREtfRG9jdW1lbnQqIHBEb2MpIG92ZXJyaWRlOworICB2b2lkIE9uRG9jX1dpbGxTYXZlKENQREZTREtfRG9jdW1lbnQqIHBEb2MpIG92ZXJyaWRlOworICB2b2lkIE9uRG9jX0RpZFNhdmUoQ1BERlNES19Eb2N1bWVudCogcERvYykgb3ZlcnJpZGU7CisgIHZvaWQgT25Eb2NfV2lsbENsb3NlKENQREZTREtfRG9jdW1lbnQqIHBEb2MpIG92ZXJyaWRlOworICB2b2lkIE9uUGFnZV9PcGVuKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpIG92ZXJyaWRlOworICB2b2lkIE9uUGFnZV9DbG9zZShDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KSBvdmVycmlkZTsKKyAgdm9pZCBPblBhZ2VfSW5WaWV3KENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpIG92ZXJyaWRlOworICB2b2lkIE9uUGFnZV9PdXRWaWV3KENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpIG92ZXJyaWRlOworICB2b2lkIE9uRmllbGRfTW91c2VEb3duKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSBvdmVycmlkZTsKKyAgdm9pZCBPbkZpZWxkX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgb3ZlcnJpZGU7CisgIHZvaWQgT25GaWVsZF9Nb3VzZUV4aXQoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpIG92ZXJyaWRlOworICB2b2lkIE9uRmllbGRfTW91c2VVcChGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSBvdmVycmlkZTsKKyAgdm9pZCBPbkZpZWxkX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSkgb3ZlcnJpZGU7CisgIHZvaWQgT25GaWVsZF9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSkgb3ZlcnJpZGU7CisgIHZvaWQgT25GaWVsZF9DYWxjdWxhdGUoQ1BERl9Gb3JtRmllbGQqIHBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSYykgb3ZlcnJpZGU7CisgIHZvaWQgT25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYldpbGxDb21taXQpIG92ZXJyaWRlOworICB2b2lkIE9uRmllbGRfS2V5c3Ryb2tlKENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYktleURvd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBuU2VsRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgblNlbFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJXaWxsQ29tbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpZWxkRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUmMpIG92ZXJyaWRlOworICB2b2lkIE9uRmllbGRfVmFsaWRhdGUoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYktleURvd24sCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUmMpIG92ZXJyaWRlOworICB2b2lkIE9uU2NyZWVuX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlOworICB2b2lkIE9uU2NyZWVuX0JsdXIoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlOworICB2b2lkIE9uU2NyZWVuX09wZW4oRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlOworICB2b2lkIE9uU2NyZWVuX0Nsb3NlKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlOworICB2b2lkIE9uU2NyZWVuX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlOworICB2b2lkIE9uU2NyZWVuX01vdXNlVXAoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlOworICB2b2lkIE9uU2NyZWVuX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlOworICB2b2lkIE9uU2NyZWVuX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlOworICB2b2lkIE9uU2NyZWVuX0luVmlldyhGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlOworICB2b2lkIE9uU2NyZWVuX091dFZpZXcoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlOworICB2b2lkIE9uQm9va21hcmtfTW91c2VVcChDUERGX0Jvb2ttYXJrKiBwQm9va01hcmspIG92ZXJyaWRlOworICB2b2lkIE9uTGlua19Nb3VzZVVwKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpIG92ZXJyaWRlOworICB2b2lkIE9uTWVudV9FeGVjKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0clRhcmdldE5hbWUpIG92ZXJyaWRlOworICB2b2lkIE9uQmF0Y2hFeGVjKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpIG92ZXJyaWRlOworICB2b2lkIE9uQ29uc29sZV9FeGVjKCkgb3ZlcnJpZGU7CisgIHZvaWQgT25FeHRlcm5hbF9FeGVjKCkgb3ZlcnJpZGU7CisgIHZvaWQgRW5hYmxlTWVzc2FnZUJveChGWF9CT09MIGJFbmFibGUpIG92ZXJyaWRlIHsgbV9iTXNnQm94RW5hYmxlID0gYkVuYWJsZTsgfQorCisgIEZYX0JPT0wgSXNNc2dCb3hFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gbV9iTXNnQm94RW5hYmxlOyB9CisKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogR2V0UmVhZGVyQXBwKCk7CisgIENKU19SdW50aW1lKiBHZXRKU1J1bnRpbWUoKSBjb25zdCB7IHJldHVybiBtX3BSdW50aW1lOyB9CisgIENKU19FdmVudEhhbmRsZXIqIEdldEV2ZW50SGFuZGxlcigpIGNvbnN0IHsgcmV0dXJuIG1fcEV2ZW50SGFuZGxlcjsgfQorICBDUERGU0RLX0RvY3VtZW50KiBHZXRSZWFkZXJEb2N1bWVudCgpOworCisgcHJpdmF0ZToKKyAgQ0pTX1J1bnRpbWUqIG1fcFJ1bnRpbWU7CisgIENKU19FdmVudEhhbmRsZXIqIG1fcEV2ZW50SGFuZGxlcjsKKyAgRlhfQk9PTCBtX2JCdXN5OworICBGWF9CT09MIG1fYk1zZ0JveEVuYWJsZTsKK307CisKKyNlbmRpZiAgLy8gRlBERlNES19TUkNfSkFWQVNDUklQVF9KU19DT05URVhUX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0RlZmluZS5oIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19EZWZpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmIzNmY5Ci0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19EZWZpbmUuaApAQCAtMCwwICsxLDQ5MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZQREZTREtfU1JDX0pBVkFTQ1JJUFRfSlNfREVGSU5FX0hfCisjZGVmaW5lIEZQREZTREtfU1JDX0pBVkFTQ1JJUFRfSlNfREVGSU5FX0hfCisKKyNpbmNsdWRlICJKU19PYmplY3QuaCIKKyNpbmNsdWRlICJKU19WYWx1ZS5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9qc2FwaS9meGpzX3Y4LmgiCisjaW5jbHVkZSAicmVzb3VyY2UuaCIKKworc3RydWN0IEpTQ29uc3RTcGVjIHsKKyAgY29uc3Qgd2NoYXJfdCogcE5hbWU7CisgIGRvdWJsZSBudW1iZXI7CisgIGNvbnN0IHdjaGFyX3QqIHN0cmluZzsKKyAgdWludDhfdCB0OyAgLy8gMDpkb3VibGUgMTpzdHIKK307CisKK3N0cnVjdCBKU1Byb3BlcnR5U3BlYyB7CisgIGNvbnN0IHdjaGFyX3QqIHBOYW1lOworICB2ODo6QWNjZXNzb3JHZXR0ZXJDYWxsYmFjayBwUHJvcEdldDsKKyAgdjg6OkFjY2Vzc29yU2V0dGVyQ2FsbGJhY2sgcFByb3BQdXQ7Cit9OworCitzdHJ1Y3QgSlNNZXRob2RTcGVjIHsKKyAgY29uc3Qgd2NoYXJfdCogcE5hbWU7CisgIHY4OjpGdW5jdGlvbkNhbGxiYWNrIHBNZXRob2RDYWxsOworfTsKKworI2RlZmluZSBKU19XSURFU1RSSU5HKHdpZGVzdHJpbmcpIEwjIyAjd2lkZXN0cmluZworI2RlZmluZSBCRUdJTl9KU19TVEFUSUNfQ09OU1QoanNfY2xhc3NfbmFtZSkgXAorICBKU0NvbnN0U3BlYyBqc19jbGFzc19uYW1lOjpKU19DbGFzc19Db25zdHNbXSA9IHsKKyNkZWZpbmUgSlNfU1RBVElDX0NPTlNUX0VOVFJZX05VTUJFUihjb25zdF9uYW1lLCBwVmFsdWUpIFwKKyAgeyBjb25zdF9uYW1lLCBwVmFsdWUsIEwiIiwgMCB9ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLAorCisjZGVmaW5lIEpTX1NUQVRJQ19DT05TVF9FTlRSWV9TVFJJTkcoY29uc3RfbmFtZSwgcFZhbHVlKSBcCisgIHsgY29uc3RfbmFtZSwgMCwgcFZhbHVlLCAxIH0gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICwKKworI2RlZmluZSBFTkRfSlNfU1RBVElDX0NPTlNUKCkgXAorICB7IDAsIDAsIDAsIDAgfSAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICA7CisKKyNkZWZpbmUgQkVHSU5fSlNfU1RBVElDX1BST1AoanNfY2xhc3NfbmFtZSkgXAorICBKU1Byb3BlcnR5U3BlYyBqc19jbGFzc19uYW1lOjpKU19DbGFzc19Qcm9wZXJ0aWVzW10gPSB7CisjZGVmaW5lIEpTX1NUQVRJQ19QUk9QX0VOVFJZKHByb3BfbmFtZSkgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEpTX1dJREVTVFJJTkcocHJvcF9uYW1lKSwgZ2V0XyMjcHJvcF9uYW1lIyNfc3RhdGljLCBcCisgICAgICAgIHNldF8jI3Byb3BfbmFtZSMjX3N0YXRpYyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAsCisKKyNkZWZpbmUgRU5EX0pTX1NUQVRJQ19QUk9QKCkgXAorICB7IDAsIDAsIDAgfSAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgOworCisjZGVmaW5lIEJFR0lOX0pTX1NUQVRJQ19NRVRIT0QoanNfY2xhc3NfbmFtZSkgXAorICBKU01ldGhvZFNwZWMganNfY2xhc3NfbmFtZTo6SlNfQ2xhc3NfTWV0aG9kc1tdID0geworI2RlZmluZSBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKG1ldGhvZF9uYW1lKSAgICAgICAgICAgIFwKKyAgeyBKU19XSURFU1RSSU5HKG1ldGhvZF9uYW1lKSwgbWV0aG9kX25hbWUjI19zdGF0aWMgfSBcCisgICwKKworI2RlZmluZSBFTkRfSlNfU1RBVElDX01FVEhPRCgpIFwKKyAgeyAwLCAwIH0gICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICA7CisKK3RlbXBsYXRlIDxjbGFzcyBDLAorICAgICAgICAgIEZYX0JPT0wgKEM6OipNKShJSlNfQ29udGV4dCosIENKU19Qcm9wVmFsdWUmLCBDRlhfV2lkZVN0cmluZyYpPgordm9pZCBKU1Byb3BHZXR0ZXIoY29uc3QgY2hhciogcHJvcF9uYW1lX3N0cmluZywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNsYXNzX25hbWVfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsKKyAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSBpbmZvLkdldElzb2xhdGUoKTsKKyAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0KKyAgICAgIHN0YXRpY19jYXN0PENKU19SdW50aW1lKj4oRlhKU19HZXRSdW50aW1lRnJvbUlzb2xhdGUoaXNvbGF0ZSkpOworICBpZiAoIXBSdW50aW1lKQorICAgIHJldHVybjsKKyAgSUpTX0NvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCk7CisgIENKU19PYmplY3QqIHBKU09iaiA9IChDSlNfT2JqZWN0KilGWEpTX0dldFByaXZhdGUoaXNvbGF0ZSwgaW5mby5Ib2xkZXIoKSk7CisgIEMqIHBPYmogPSByZWludGVycHJldF9jYXN0PEMqPihwSlNPYmotPkdldEVtYmVkT2JqZWN0KCkpOworICBDRlhfV2lkZVN0cmluZyBzRXJyb3I7CisgIENKU19Qcm9wVmFsdWUgdmFsdWUocFJ1bnRpbWUpOworICB2YWx1ZS5TdGFydEdldHRpbmcoKTsKKyAgaWYgKCEocE9iai0+Kk0pKHBDb250ZXh0LCB2YWx1ZSwgc0Vycm9yKSkgeworICAgIEZYSlNfRXJyb3IoaXNvbGF0ZSwgSlNGb3JtYXRFcnJvclN0cmluZyhjbGFzc19uYW1lX3N0cmluZywgcHJvcF9uYW1lX3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0Vycm9yKSk7CisgICAgcmV0dXJuOworICB9CisgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQoKHY4OjpMb2NhbDx2ODo6VmFsdWU+KXZhbHVlKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEMsCisgICAgICAgICAgRlhfQk9PTCAoQzo6Kk0pKElKU19Db250ZXh0KiwgQ0pTX1Byb3BWYWx1ZSYsIENGWF9XaWRlU3RyaW5nJik+Cit2b2lkIEpTUHJvcFNldHRlcihjb25zdCBjaGFyKiBwcm9wX25hbWVfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2xhc3NfbmFtZV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksCisgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2b2lkPiYgaW5mbykgeworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IGluZm8uR2V0SXNvbGF0ZSgpOworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPQorICAgICAgc3RhdGljX2Nhc3Q8Q0pTX1J1bnRpbWUqPihGWEpTX0dldFJ1bnRpbWVGcm9tSXNvbGF0ZShpc29sYXRlKSk7CisgIGlmICghcFJ1bnRpbWUpCisgICAgcmV0dXJuOworICBJSlNfQ29udGV4dCogcENvbnRleHQgPSBwUnVudGltZS0+R2V0Q3VycmVudENvbnRleHQoKTsKKyAgQ0pTX09iamVjdCogcEpTT2JqID0gKENKU19PYmplY3QqKUZYSlNfR2V0UHJpdmF0ZShpc29sYXRlLCBpbmZvLkhvbGRlcigpKTsKKyAgQyogcE9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Qyo+KHBKU09iai0+R2V0RW1iZWRPYmplY3QoKSk7CisgIENGWF9XaWRlU3RyaW5nIHNFcnJvcjsKKyAgQ0pTX1Byb3BWYWx1ZSBwcm9wVmFsdWUoQ0pTX1ZhbHVlKHBSdW50aW1lLCB2YWx1ZSwgQ0pTX1ZhbHVlOjpWVF91bmtub3duKSk7CisgIHByb3BWYWx1ZS5TdGFydFNldHRpbmcoKTsKKyAgaWYgKCEocE9iai0+Kk0pKHBDb250ZXh0LCBwcm9wVmFsdWUsIHNFcnJvcikpIHsKKyAgICBGWEpTX0Vycm9yKGlzb2xhdGUsIEpTRm9ybWF0RXJyb3JTdHJpbmcoY2xhc3NfbmFtZV9zdHJpbmcsIHByb3BfbmFtZV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNFcnJvcikpOworICB9Cit9CisKKyNkZWZpbmUgSlNfU1RBVElDX1BST1AocHJvcF9uYW1lLCBjbGFzc19uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHZvaWQgZ2V0XyMjcHJvcF9uYW1lIyNfc3RhdGljKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBKU1Byb3BHZXR0ZXI8Y2xhc3NfbmFtZSwgJmNsYXNzX25hbWU6OnByb3BfbmFtZT4oI3Byb3BfbmFtZSwgI2NsYXNzX25hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksIGluZm8pOyAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHZvaWQgc2V0XyMjcHJvcF9uYW1lIyNfc3RhdGljKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWUsICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2b2lkPiYgaW5mbykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBKU1Byb3BTZXR0ZXI8Y2xhc3NfbmFtZSwgJmNsYXNzX25hbWU6OnByb3BfbmFtZT4oI3Byb3BfbmFtZSwgI2NsYXNzX25hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksIHZhbHVlLCBpbmZvKTsgIFwKKyAgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQywKKyAgICAgICAgICBGWF9CT09MIChDOjoqTSkoSUpTX0NvbnRleHQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmKT4KK3ZvaWQgSlNNZXRob2QoY29uc3QgY2hhciogbWV0aG9kX25hbWVfc3RyaW5nLAorICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjbGFzc19uYW1lX3N0cmluZywKKyAgICAgICAgICAgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsKKyAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSBpbmZvLkdldElzb2xhdGUoKTsKKyAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0KKyAgICAgIHN0YXRpY19jYXN0PENKU19SdW50aW1lKj4oRlhKU19HZXRSdW50aW1lRnJvbUlzb2xhdGUoaXNvbGF0ZSkpOworICBpZiAoIXBSdW50aW1lKQorICAgIHJldHVybjsKKyAgSUpTX0NvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCk7CisgIHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4gcGFyYW1ldGVyczsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCAodW5zaWduZWQgaW50KWluZm8uTGVuZ3RoKCk7IGkrKykgeworICAgIHBhcmFtZXRlcnMucHVzaF9iYWNrKENKU19WYWx1ZShwUnVudGltZSwgaW5mb1tpXSwgQ0pTX1ZhbHVlOjpWVF91bmtub3duKSk7CisgIH0KKyAgQ0pTX1ZhbHVlIHZhbHVlUmVzKHBSdW50aW1lKTsKKyAgQ0pTX09iamVjdCogcEpTT2JqID0gKENKU19PYmplY3QqKUZYSlNfR2V0UHJpdmF0ZShpc29sYXRlLCBpbmZvLkhvbGRlcigpKTsKKyAgQyogcE9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Qyo+KHBKU09iai0+R2V0RW1iZWRPYmplY3QoKSk7CisgIENGWF9XaWRlU3RyaW5nIHNFcnJvcjsKKyAgaWYgKCEocE9iai0+Kk0pKHBDb250ZXh0LCBwYXJhbWV0ZXJzLCB2YWx1ZVJlcywgc0Vycm9yKSkgeworICAgIEZYSlNfRXJyb3IoaXNvbGF0ZSwgSlNGb3JtYXRFcnJvclN0cmluZyhjbGFzc19uYW1lX3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX25hbWVfc3RyaW5nLCBzRXJyb3IpKTsKKyAgICByZXR1cm47CisgIH0KKyAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldCh2YWx1ZVJlcy5Ub1Y4VmFsdWUoKSk7Cit9CisKKyNkZWZpbmUgSlNfU1RBVElDX01FVEhPRChtZXRob2RfbmFtZSwgY2xhc3NfbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHZvaWQgbWV0aG9kX25hbWUjI19zdGF0aWMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBKU01ldGhvZDxjbGFzc19uYW1lLCAmY2xhc3NfbmFtZTo6bWV0aG9kX25hbWU+KCNtZXRob2RfbmFtZSwgI2NsYXNzX25hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8pOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIEpTX1NQRUNJQUxfU1RBVElDX01FVEhPRChtZXRob2RfbmFtZSwgY2xhc3NfYWx0ZXJuYXRlLCBjbGFzc19uYW1lKSBcCisgIHN0YXRpYyB2b2lkIG1ldGhvZF9uYW1lIyNfc3RhdGljKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgeyAgICAgICAgICAgICAgICAgICBcCisgICAgSlNNZXRob2Q8Y2xhc3NfYWx0ZXJuYXRlLCAmY2xhc3NfYWx0ZXJuYXRlOjptZXRob2RfbmFtZT4oICAgICAgICAgICAgICBcCisgICAgICAgICNtZXRob2RfbmFtZSwgI2NsYXNzX25hbWUsIGluZm8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworLy8gQWxsIEpTIGNsYXNzZXMgaGF2ZSBhIG5hbWUsIGFuIG9iamVjdCBkZWZpbnRpb24gSUQsIGFuZCB0aGUgYWJpbGl0eSB0bworLy8gcmVnaXN0ZXIgdGhlbXNlbHZlcyB3aXRoIEZYSlNfVjguIFdlIG5ldmVyIG1ha2UgYSBCQVNFIGNsYXNzIG9uIGl0cyBvd24KKy8vIGJlY2F1c2UgaXQgY2FuJ3QgcmVhbGx5IGRvIGFueXRoaW5nLgorI2RlZmluZSBERUNMQVJFX0pTX0NMQVNTX0JBU0VfUEFSVCgpICBcCisgIHN0YXRpYyBjb25zdCB3Y2hhcl90KiBnX3BDbGFzc05hbWU7IFwKKyAgc3RhdGljIGludCBnX25PYmpEZWZuSUQ7ICAgICAgICAgICAgXAorICBzdGF0aWMgdm9pZCBEZWZpbmVKU09iamVjdHModjg6Oklzb2xhdGUqIHBJc29sYXRlLCBGWEpTT0JKVFlQRSBlT2JqVHlwZSk7CisKKyNkZWZpbmUgSU1QTEVNRU5UX0pTX0NMQVNTX0JBU0VfUEFSVChqc19jbGFzc19uYW1lLCBjbGFzc19uYW1lKSAgICAgICAgICAgXAorICBjb25zdCB3Y2hhcl90KiBqc19jbGFzc19uYW1lOjpnX3BDbGFzc05hbWUgPSBKU19XSURFU1RSSU5HKGNsYXNzX25hbWUpOyBcCisgIGludCBqc19jbGFzc19uYW1lOjpnX25PYmpEZWZuSUQgPSAtMTsKKworLy8gQ09OU1QgY2xhc3NlcyBwcm92aWRlIGNvbnN0YW50cywgYnV0IG5vdCBjb25zdHJ1Y3RvcnMsIG1ldGhvZHMsIG9yIHByb3BzLgorI2RlZmluZSBERUNMQVJFX0pTX0NMQVNTX0NPTlNUKCkgXAorICBERUNMQVJFX0pTX0NMQVNTX0JBU0VfUEFSVCgpICAgXAorICBERUNMQVJFX0pTX0NMQVNTX0NPTlNUX1BBUlQoKQorCisjZGVmaW5lIElNUExFTUVOVF9KU19DTEFTU19DT05TVChqc19jbGFzc19uYW1lLCBjbGFzc19uYW1lKSAgICAgICAgICAgICAgXAorICBJTVBMRU1FTlRfSlNfQ0xBU1NfQkFTRV9QQVJUKGpzX2NsYXNzX25hbWUsIGNsYXNzX25hbWUpICAgICAgICAgICAgICAgIFwKKyAgSU1QTEVNRU5UX0pTX0NMQVNTX0NPTlNUX1BBUlQoanNfY2xhc3NfbmFtZSwgY2xhc3NfbmFtZSkgICAgICAgICAgICAgICBcCisgIHZvaWQganNfY2xhc3NfbmFtZTo6RGVmaW5lSlNPYmplY3RzKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTT0JKVFlQRSBlT2JqVHlwZSkgeyAgICAgICAgICAgIFwKKyAgICBnX25PYmpEZWZuSUQgPSBGWEpTX0RlZmluZU9iaihwSXNvbGF0ZSwganNfY2xhc3NfbmFtZTo6Z19wQ2xhc3NOYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU9ialR5cGUsIG51bGxwdHIsIG51bGxwdHIpOyAgICAgICAgICAgXAorICAgIERlZmluZUNvbnN0cyhwSXNvbGF0ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIERFQ0xBUkVfSlNfQ0xBU1NfQ09OU1RfUEFSVCgpICAgXAorICBzdGF0aWMgSlNDb25zdFNwZWMgSlNfQ2xhc3NfQ29uc3RzW107IFwKKyAgc3RhdGljIHZvaWQgRGVmaW5lQ29uc3RzKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSk7CisKKyNkZWZpbmUgSU1QTEVNRU5UX0pTX0NMQVNTX0NPTlNUX1BBUlQoanNfY2xhc3NfbmFtZSwgY2xhc3NfbmFtZSkgICAgICBcCisgIHZvaWQganNfY2xhc3NfbmFtZTo6RGVmaW5lQ29uc3RzKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkgeyAgICAgICAgICAgXAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKEpTX0NsYXNzX0NvbnN0cykgLSAxOyArK2kpIHsgIFwKKyAgICAgIEZYSlNfRGVmaW5lT2JqQ29uc3QoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcElzb2xhdGUsIGdfbk9iakRlZm5JRCwgSlNfQ2xhc3NfQ29uc3RzW2ldLnBOYW1lLCAgICAgICAgICAgXAorICAgICAgICAgIEpTX0NsYXNzX0NvbnN0c1tpXS50ID09IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgPyBGWEpTX05ld051bWJlcihwSXNvbGF0ZSwgSlNfQ2xhc3NfQ29uc3RzW2ldLm51bWJlcikgICBcCisgICAgICAgICAgICAgIDogRlhKU19OZXdTdHJpbmcocElzb2xhdGUsIEpTX0NsYXNzX0NvbnN0c1tpXS5zdHJpbmcpKTsgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvLyBDb252ZW5pZW5jZSBtYWNyb3MgZm9yIGRlY2xhcmluZyBjbGFzc2VzIHdpdGhvdXQgYW4gYWx0ZXJuYXRlLgorI2RlZmluZSBERUNMQVJFX0pTX0NMQVNTKCkgREVDTEFSRV9KU19DTEFTU19SSUNIKCkKKyNkZWZpbmUgSU1QTEVNRU5UX0pTX0NMQVNTKGpzX2NsYXNzX25hbWUsIGNsYXNzX25hbWUpIFwKKyAgSU1QTEVNRU5UX0pTX0NMQVNTX1JJQ0goanNfY2xhc3NfbmFtZSwgY2xhc3NfbmFtZSwgY2xhc3NfbmFtZSkKKworLy8gUmljaCBKUyBjbGFzc2VzIHByb3ZpZGUgY29uc3RhbnRzLCBtZXRob2RzLCBwcm9wZXJ0aWVzLCBhbmQgdGhlIGFiaWxpdHkKKy8vIHRvIGNvbnN0cnVjdCBuYXRpdmUgb2JqZWN0IHN0YXRlLgorI2RlZmluZSBERUNMQVJFX0pTX0NMQVNTX1JJQ0goKSBcCisgIERFQ0xBUkVfSlNfQ0xBU1NfQkFTRV9QQVJUKCkgIFwKKyAgREVDTEFSRV9KU19DTEFTU19DT05TVF9QQVJUKCkgXAorICBERUNMQVJFX0pTX0NMQVNTX1JJQ0hfUEFSVCgpCisKKyNkZWZpbmUgSU1QTEVNRU5UX0pTX0NMQVNTX1JJQ0goanNfY2xhc3NfbmFtZSwgY2xhc3NfYWx0ZXJuYXRlLCBjbGFzc19uYW1lKSBcCisgIElNUExFTUVOVF9KU19DTEFTU19CQVNFX1BBUlQoanNfY2xhc3NfbmFtZSwgY2xhc3NfbmFtZSkgICAgICAgICAgICAgICAgICAgXAorICBJTVBMRU1FTlRfSlNfQ0xBU1NfQ09OU1RfUEFSVChqc19jbGFzc19uYW1lLCBjbGFzc19uYW1lKSAgICAgICAgICAgICAgICAgIFwKKyAgSU1QTEVNRU5UX0pTX0NMQVNTX1JJQ0hfUEFSVChqc19jbGFzc19uYW1lLCBjbGFzc19hbHRlcm5hdGUsIGNsYXNzX25hbWUpICBcCisgIHZvaWQganNfY2xhc3NfbmFtZTo6RGVmaW5lSlNPYmplY3RzKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTT0JKVFlQRSBlT2JqVHlwZSkgeyAgICAgICAgICAgICAgIFwKKyAgICBnX25PYmpEZWZuSUQgPSBGWEpTX0RlZmluZU9iaihwSXNvbGF0ZSwganNfY2xhc3NfbmFtZTo6Z19wQ2xhc3NOYW1lLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU9ialR5cGUsIEpTQ29uc3RydWN0b3IsIEpTRGVzdHJ1Y3Rvcik7ICAgXAorICAgIERlZmluZUNvbnN0cyhwSXNvbGF0ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBEZWZpbmVQcm9wcyhwSXNvbGF0ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRGVmaW5lTWV0aG9kcyhwSXNvbGF0ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgREVDTEFSRV9KU19DTEFTU19SSUNIX1BBUlQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB2b2lkIEpTQ29uc3RydWN0b3IoSUpTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqKTsgXAorICBzdGF0aWMgdm9pZCBKU0Rlc3RydWN0b3Iodjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iaik7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHZvaWQgRGVmaW5lUHJvcHModjg6Oklzb2xhdGUqIHBJc29hbHRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB2b2lkIERlZmluZU1ldGhvZHModjg6Oklzb2xhdGUqIHBJc29hbHRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgSlNQcm9wZXJ0eVNwZWMgSlNfQ2xhc3NfUHJvcGVydGllc1tdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIEpTTWV0aG9kU3BlYyBKU19DbGFzc19NZXRob2RzW107CisKKyNkZWZpbmUgSU1QTEVNRU5UX0pTX0NMQVNTX1JJQ0hfUEFSVChqc19jbGFzc19uYW1lLCBjbGFzc19hbHRlcm5hdGUsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc19uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBqc19jbGFzc19uYW1lOjpKU0NvbnN0cnVjdG9yKElKU19SdW50aW1lKiBwSVJ1bnRpbWUsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmopIHsgICAgICAgICAgICAgIFwKKyAgICBDSlNfT2JqZWN0KiBwT2JqID0gbmV3IGpzX2NsYXNzX25hbWUob2JqKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwT2JqLT5TZXRFbWJlZE9iamVjdChuZXcgY2xhc3NfYWx0ZXJuYXRlKHBPYmopKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGWEpTX1NldFByaXZhdGUobnVsbHB0ciwgb2JqLCAodm9pZCopcE9iaik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwT2JqLT5Jbml0SW5zdGFuY2UocElSdW50aW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBqc19jbGFzc19uYW1lOjpKU0Rlc3RydWN0b3Iodjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iaikgeyAgICAgICAgICAgICAgIFwKKyAgICBqc19jbGFzc19uYW1lKiBwT2JqID0gKGpzX2NsYXNzX25hbWUqKUZYSlNfR2V0UHJpdmF0ZShudWxscHRyLCBvYmopOyAgICAgIFwKKyAgICBwT2JqLT5FeGl0SW5zdGFuY2UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkZWxldGUgcE9iajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBqc19jbGFzc19uYW1lOjpEZWZpbmVQcm9wcyh2ODo6SXNvbGF0ZSogcElzb2xhdGUpIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShKU19DbGFzc19Qcm9wZXJ0aWVzKSAtIDE7ICsraSkgeyAgICAgIFwKKyAgICAgIEZYSlNfRGVmaW5lT2JqUHJvcGVydHkoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBwSXNvbGF0ZSwgZ19uT2JqRGVmbklELCBKU19DbGFzc19Qcm9wZXJ0aWVzW2ldLnBOYW1lLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBKU19DbGFzc19Qcm9wZXJ0aWVzW2ldLnBQcm9wR2V0LCBKU19DbGFzc19Qcm9wZXJ0aWVzW2ldLnBQcm9wUHV0KTsgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBqc19jbGFzc19uYW1lOjpEZWZpbmVNZXRob2RzKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShKU19DbGFzc19NZXRob2RzKSAtIDE7ICsraSkgeyAgICAgICAgIFwKKyAgICAgIEZYSlNfRGVmaW5lT2JqTWV0aG9kKHBJc29sYXRlLCBnX25PYmpEZWZuSUQsIEpTX0NsYXNzX01ldGhvZHNbaV0ucE5hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTX0NsYXNzX01ldGhvZHNbaV0ucE1ldGhvZENhbGwpOyAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvLyBTcGVjaWFsIEpTIGNsYXNzZXMgaW1wbGVtZW50IG1ldGhvZHMsIHByb3BzLCBhbmQgcXVlcmllcywgYnV0IG5vdCBjb25zdHMuCisjZGVmaW5lIERFQ0xBUkVfU1BFQ0lBTF9KU19DTEFTUygpIFwKKyAgREVDTEFSRV9KU19DTEFTU19CQVNFX1BBUlQoKSAgICAgXAorICBERUNMQVJFX0pTX0NMQVNTX0NPTlNUX1BBUlQoKSAgICBcCisgIERFQ0xBUkVfSlNfQ0xBU1NfUklDSF9QQVJUKCkgICAgIFwKKyAgREVDTEFSRV9TUEVDSUFMX0pTX0NMQVNTX1BBUlQoKQorCisjZGVmaW5lIElNUExFTUVOVF9TUEVDSUFMX0pTX0NMQVNTKGpzX2NsYXNzX25hbWUsIGNsYXNzX2FsdGVybmF0ZSwgY2xhc3NfbmFtZSkgXAorICBJTVBMRU1FTlRfSlNfQ0xBU1NfQkFTRV9QQVJUKGpzX2NsYXNzX25hbWUsIGNsYXNzX25hbWUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU1QTEVNRU5UX0pTX0NMQVNTX0NPTlNUX1BBUlQoanNfY2xhc3NfbmFtZSwgY2xhc3NfbmFtZSkgICAgICAgICAgICAgICAgICAgICBcCisgIElNUExFTUVOVF9KU19DTEFTU19SSUNIX1BBUlQoanNfY2xhc3NfbmFtZSwgY2xhc3NfYWx0ZXJuYXRlLCBjbGFzc19uYW1lKSAgICAgXAorICBJTVBMRU1FTlRfU1BFQ0lBTF9KU19DTEFTU19QQVJUKGpzX2NsYXNzX25hbWUsIGNsYXNzX2FsdGVybmF0ZSwgY2xhc3NfbmFtZSkgIFwKKyAgdm9pZCBqc19jbGFzc19uYW1lOjpEZWZpbmVKU09iamVjdHModjg6Oklzb2xhdGUqIHBJc29sYXRlLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNPQkpUWVBFIGVPYmpUeXBlKSB7ICAgICAgICAgICAgICAgICAgXAorICAgIGdfbk9iakRlZm5JRCA9IEZYSlNfRGVmaW5lT2JqKHBJc29sYXRlLCBqc19jbGFzc19uYW1lOjpnX3BDbGFzc05hbWUsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT2JqVHlwZSwgSlNDb25zdHJ1Y3RvciwgSlNEZXN0cnVjdG9yKTsgICAgICBcCisgICAgRGVmaW5lQ29uc3RzKHBJc29sYXRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIERlZmluZVByb3BzKHBJc29sYXRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBEZWZpbmVNZXRob2RzKHBJc29sYXRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRGVmaW5lQWxsUHJvcGVydGllcyhwSXNvbGF0ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgREVDTEFSRV9TUEVDSUFMX0pTX0NMQVNTX1BBUlQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB2b2lkIHF1ZXJ5cHJvcF9zdGF0aWMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6SW50ZWdlcj4mIGluZm8pOyAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB2b2lkIGdldHByb3Bfc3RhdGljKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbyk7IFwKKyAgc3RhdGljIHZvaWQgcHV0cHJvcF9zdGF0aWModjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbyk7IFwKKyAgc3RhdGljIHZvaWQgZGVscHJvcF9zdGF0aWMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpCb29sZWFuPiYgaW5mbyk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHZvaWQgRGVmaW5lQWxsUHJvcGVydGllcyh2ODo6SXNvbGF0ZSogcElzb2xhdGUpOworCisjZGVmaW5lIElNUExFTUVOVF9TUEVDSUFMX0pTX0NMQVNTX1BBUlQoanNfY2xhc3NfbmFtZSwgY2xhc3NfYWx0ZXJuYXRlLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NfbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQganNfY2xhc3NfbmFtZTo6cXVlcnlwcm9wX3N0YXRpYyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OkludGVnZXI+JiBpbmZvKSB7ICAgICAgICAgICAgICAgICBcCisgICAgSlNTcGVjaWFsUHJvcFF1ZXJ5PGNsYXNzX2FsdGVybmF0ZT4oI2NsYXNzX25hbWUsIHByb3BlcnR5LCBpbmZvKTsgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQganNfY2xhc3NfbmFtZTo6Z2V0cHJvcF9zdGF0aWMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgeyAgICAgICAgICAgICAgICAgICBcCisgICAgSlNTcGVjaWFsUHJvcEdldDxjbGFzc19hbHRlcm5hdGU+KCNjbGFzc19uYW1lLCBwcm9wZXJ0eSwgaW5mbyk7ICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQganNfY2xhc3NfbmFtZTo6cHV0cHJvcF9zdGF0aWMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlLCAgICAgICAgICBcCisgICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgeyAgICAgICAgICAgICAgICAgICBcCisgICAgSlNTcGVjaWFsUHJvcFB1dDxjbGFzc19hbHRlcm5hdGU+KCNjbGFzc19uYW1lLCBwcm9wZXJ0eSwgdmFsdWUsIGluZm8pOyBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQganNfY2xhc3NfbmFtZTo6ZGVscHJvcF9zdGF0aWMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OkJvb2xlYW4+JiBpbmZvKSB7ICAgICAgICAgICAgICAgICBcCisgICAgSlNTcGVjaWFsUHJvcERlbDxjbGFzc19hbHRlcm5hdGU+KCNjbGFzc19uYW1lLCBwcm9wZXJ0eSwgaW5mbyk7ICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQganNfY2xhc3NfbmFtZTo6RGVmaW5lQWxsUHJvcGVydGllcyh2ODo6SXNvbGF0ZSogcElzb2xhdGUpIHsgICAgICAgICBcCisgICAgRlhKU19EZWZpbmVPYmpBbGxQcm9wZXJ0aWVzKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBJc29sYXRlLCBnX25PYmpEZWZuSUQsIGpzX2NsYXNzX25hbWU6OnF1ZXJ5cHJvcF9zdGF0aWMsICAgICAgICAgICBcCisgICAgICAgIGpzX2NsYXNzX25hbWU6OmdldHByb3Bfc3RhdGljLCBqc19jbGFzc19uYW1lOjpwdXRwcm9wX3N0YXRpYywgICAgICBcCisgICAgICAgIGpzX2NsYXNzX25hbWU6OmRlbHByb3Bfc3RhdGljKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKwordGVtcGxhdGUgPGNsYXNzIEFsdD4KK3ZvaWQgSlNTcGVjaWFsUHJvcFF1ZXJ5KGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpJbnRlZ2VyPiYgaW5mbykgeworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IGluZm8uR2V0SXNvbGF0ZSgpOworICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgdXRmOF92YWx1ZShwcm9wZXJ0eSk7CisgIENGWF9XaWRlU3RyaW5nIHByb3BuYW1lID0KKyAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOCgqdXRmOF92YWx1ZSwgdXRmOF92YWx1ZS5sZW5ndGgoKSk7CisgIENKU19PYmplY3QqIHBKU09iaiA9CisgICAgICByZWludGVycHJldF9jYXN0PENKU19PYmplY3QqPihGWEpTX0dldFByaXZhdGUoaXNvbGF0ZSwgaW5mby5Ib2xkZXIoKSkpOworICBBbHQqIHBPYmogPSByZWludGVycHJldF9jYXN0PEFsdCo+KHBKU09iai0+R2V0RW1iZWRPYmplY3QoKSk7CisgIEZYX0JPT0wgYlJldCA9IHBPYmotPlF1ZXJ5UHJvcGVydHkocHJvcG5hbWUuY19zdHIoKSk7CisgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQoYlJldCA/IDQgOiAwKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEFsdD4KK3ZvaWQgSlNTcGVjaWFsUHJvcEdldChjb25zdCBjaGFyKiBjbGFzc19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgeworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IGluZm8uR2V0SXNvbGF0ZSgpOworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPQorICAgICAgc3RhdGljX2Nhc3Q8Q0pTX1J1bnRpbWUqPihGWEpTX0dldFJ1bnRpbWVGcm9tSXNvbGF0ZShpc29sYXRlKSk7CisgIGlmICghcFJ1bnRpbWUpCisgICAgcmV0dXJuOworICBJSlNfQ29udGV4dCogcENvbnRleHQgPSBwUnVudGltZS0+R2V0Q3VycmVudENvbnRleHQoKTsKKyAgQ0pTX09iamVjdCogcEpTT2JqID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Q0pTX09iamVjdCo+KEZYSlNfR2V0UHJpdmF0ZShpc29sYXRlLCBpbmZvLkhvbGRlcigpKSk7CisgIEFsdCogcE9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8QWx0Kj4ocEpTT2JqLT5HZXRFbWJlZE9iamVjdCgpKTsKKyAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIHV0ZjhfdmFsdWUocHJvcGVydHkpOworICBDRlhfV2lkZVN0cmluZyBwcm9wbmFtZSA9CisgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoKnV0ZjhfdmFsdWUsIHV0ZjhfdmFsdWUubGVuZ3RoKCkpOworICBDRlhfV2lkZVN0cmluZyBzRXJyb3I7CisgIENKU19Qcm9wVmFsdWUgdmFsdWUocFJ1bnRpbWUpOworICB2YWx1ZS5TdGFydEdldHRpbmcoKTsKKyAgaWYgKCFwT2JqLT5Eb1Byb3BlcnR5KHBDb250ZXh0LCBwcm9wbmFtZS5jX3N0cigpLCB2YWx1ZSwgc0Vycm9yKSkgeworICAgIEZYSlNfRXJyb3IoaXNvbGF0ZSwgSlNGb3JtYXRFcnJvclN0cmluZyhjbGFzc19uYW1lLCAiR2V0UHJvcGVydHkiLCBzRXJyb3IpKTsKKyAgICByZXR1cm47CisgIH0KKyAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldCgodjg6OkxvY2FsPHY4OjpWYWx1ZT4pdmFsdWUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQWx0Pgordm9pZCBKU1NwZWNpYWxQcm9wUHV0KGNvbnN0IGNoYXIqIGNsYXNzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7CisgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7CisgIENKU19SdW50aW1lKiBwUnVudGltZSA9CisgICAgICBzdGF0aWNfY2FzdDxDSlNfUnVudGltZSo+KEZYSlNfR2V0UnVudGltZUZyb21Jc29sYXRlKGlzb2xhdGUpKTsKKyAgaWYgKCFwUnVudGltZSkKKyAgICByZXR1cm47CisgIElKU19Db250ZXh0KiBwQ29udGV4dCA9IHBSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpOworICBDSlNfT2JqZWN0KiBwSlNPYmogPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxDSlNfT2JqZWN0Kj4oRlhKU19HZXRQcml2YXRlKGlzb2xhdGUsIGluZm8uSG9sZGVyKCkpKTsKKyAgQWx0KiBwT2JqID0gcmVpbnRlcnByZXRfY2FzdDxBbHQqPihwSlNPYmotPkdldEVtYmVkT2JqZWN0KCkpOworICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgdXRmOF92YWx1ZShwcm9wZXJ0eSk7CisgIENGWF9XaWRlU3RyaW5nIHByb3BuYW1lID0KKyAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOCgqdXRmOF92YWx1ZSwgdXRmOF92YWx1ZS5sZW5ndGgoKSk7CisgIENGWF9XaWRlU3RyaW5nIHNFcnJvcjsKKyAgQ0pTX1Byb3BWYWx1ZSBQcm9wVmFsdWUoQ0pTX1ZhbHVlKHBSdW50aW1lLCB2YWx1ZSwgQ0pTX1ZhbHVlOjpWVF91bmtub3duKSk7CisgIFByb3BWYWx1ZS5TdGFydFNldHRpbmcoKTsKKyAgaWYgKCFwT2JqLT5Eb1Byb3BlcnR5KHBDb250ZXh0LCBwcm9wbmFtZS5jX3N0cigpLCBQcm9wVmFsdWUsIHNFcnJvcikpIHsKKyAgICBGWEpTX0Vycm9yKGlzb2xhdGUsIEpTRm9ybWF0RXJyb3JTdHJpbmcoY2xhc3NfbmFtZSwgIlB1dFByb3BlcnR5Iiwgc0Vycm9yKSk7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIEFsdD4KK3ZvaWQgSlNTcGVjaWFsUHJvcERlbChjb25zdCBjaGFyKiBjbGFzc19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OkJvb2xlYW4+JiBpbmZvKSB7CisgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7CisgIElKU19SdW50aW1lKiBwUnVudGltZSA9IEZYSlNfR2V0UnVudGltZUZyb21Jc29sYXRlKGlzb2xhdGUpOworICBpZiAoIXBSdW50aW1lKQorICAgIHJldHVybjsKKyAgSUpTX0NvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCk7CisgIENKU19PYmplY3QqIHBKU09iaiA9CisgICAgICByZWludGVycHJldF9jYXN0PENKU19PYmplY3QqPihGWEpTX0dldFByaXZhdGUoaXNvbGF0ZSwgaW5mby5Ib2xkZXIoKSkpOworICBBbHQqIHBPYmogPSByZWludGVycHJldF9jYXN0PEFsdCo+KHBKU09iai0+R2V0RW1iZWRPYmplY3QoKSk7CisgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSB1dGY4X3ZhbHVlKHByb3BlcnR5KTsKKyAgQ0ZYX1dpZGVTdHJpbmcgcHJvcG5hbWUgPQorICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KCp1dGY4X3ZhbHVlLCB1dGY4X3ZhbHVlLmxlbmd0aCgpKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgc0Vycm9yOworICBpZiAoIXBPYmotPkRlbFByb3BlcnR5KHBDb250ZXh0LCBwcm9wbmFtZS5jX3N0cigpLCBzRXJyb3IpKSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgY2JOYW1lOworICAgIGNiTmFtZS5Gb3JtYXQoIiVzLiVzIiwgY2xhc3NfbmFtZSwgIkRlbFByb3BlcnR5Iik7CisgICAgLy8gUHJvYmFibHkgYSBtaXNzaW5nIGNhbGwgdG8gSlNGWF9FcnJvcigpLgorICB9Cit9CisKK3RlbXBsYXRlIDxGWF9CT09MICgqRikoSUpTX0NvbnRleHQqLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmKT4KK3ZvaWQgSlNHbG9iYWxGdW5jKGNvbnN0IGNoYXIqIGZ1bmNfbmFtZV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgeworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPQorICAgICAgc3RhdGljX2Nhc3Q8Q0pTX1J1bnRpbWUqPihGWEpTX0dldFJ1bnRpbWVGcm9tSXNvbGF0ZShpbmZvLkdldElzb2xhdGUoKSkpOworICBpZiAoIXBSdW50aW1lKQorICAgIHJldHVybjsKKyAgSUpTX0NvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCk7CisgIHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4gcGFyYW1ldGVyczsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCAodW5zaWduZWQgaW50KWluZm8uTGVuZ3RoKCk7IGkrKykgeworICAgIHBhcmFtZXRlcnMucHVzaF9iYWNrKENKU19WYWx1ZShwUnVudGltZSwgaW5mb1tpXSwgQ0pTX1ZhbHVlOjpWVF91bmtub3duKSk7CisgIH0KKyAgQ0pTX1ZhbHVlIHZhbHVlUmVzKHBSdW50aW1lKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgc0Vycm9yOworICBpZiAoISgqRikocENvbnRleHQsIHBhcmFtZXRlcnMsIHZhbHVlUmVzLCBzRXJyb3IpKSB7CisgICAgRlhKU19FcnJvcihwUnVudGltZS0+R2V0SXNvbGF0ZSgpLAorICAgICAgICAgICAgICAgSlNGb3JtYXRFcnJvclN0cmluZyhmdW5jX25hbWVfc3RyaW5nLCBudWxscHRyLCBzRXJyb3IpKTsKKyAgICByZXR1cm47CisgIH0KKyAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldCh2YWx1ZVJlcy5Ub1Y4VmFsdWUoKSk7Cit9CisKKyNkZWZpbmUgSlNfU1RBVElDX0dMT0JBTF9GVU4oZnVuX25hbWUpICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHZvaWQgZnVuX25hbWUjI19zdGF0aWMoICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7IFwKKyAgICBKU0dsb2JhbEZ1bmM8ZnVuX25hbWU+KCNmdW5fbmFtZSwgaW5mbyk7ICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIEpTX1NUQVRJQ19ERUNMQVJFX0dMT0JBTF9GVU4oKSAgXAorICBzdGF0aWMgSlNNZXRob2RTcGVjIGdsb2JhbF9tZXRob2RzW107IFwKKyAgc3RhdGljIHZvaWQgRGVmaW5lSlNPYmplY3RzKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkKKworI2RlZmluZSBCRUdJTl9KU19TVEFUSUNfR0xPQkFMX0ZVTihqc19jbGFzc19uYW1lKSBcCisgIEpTTWV0aG9kU3BlYyBqc19jbGFzc19uYW1lOjpnbG9iYWxfbWV0aG9kc1tdID0geworI2RlZmluZSBKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShtZXRob2RfbmFtZSkgXAorICBKU19TVEFUSUNfTUVUSE9EX0VOVFJZKG1ldGhvZF9uYW1lKQorCisjZGVmaW5lIEVORF9KU19TVEFUSUNfR0xPQkFMX0ZVTigpIEVORF9KU19TVEFUSUNfTUVUSE9EKCkKKworI2RlZmluZSBJTVBMRU1FTlRfSlNfU1RBVElDX0dMT0JBTF9GVU4oanNfY2xhc3NfbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQganNfY2xhc3NfbmFtZTo6RGVmaW5lSlNPYmplY3RzKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkgeyAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShnbG9iYWxfbWV0aG9kcykgLSAxOyArK2kpIHsgICAgICAgICAgXAorICAgICAgRlhKU19EZWZpbmVHbG9iYWxNZXRob2QocElzb2xhdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc19jbGFzc19uYW1lOjpnbG9iYWxfbWV0aG9kc1tpXS5wTmFtZSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzX2NsYXNzX25hbWU6Omdsb2JhbF9tZXRob2RzW2ldLnBNZXRob2RDYWxsKTsgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworQ0pTX1ZhbHVlOjpUeXBlIEdFVF9WQUxVRV9UWVBFKHY4OjpMb2NhbDx2ODo6VmFsdWU+IHApOworCisjZW5kaWYgIC8vIEZQREZTREtfU1JDX0pBVkFTQ1JJUFRfSlNfREVGSU5FX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5jcHAKaW5kZXggY2Y1OWVkOS4uZTQxMzE2NiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmNwcApAQCAtMSw2NzYgKzEsNjU5IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSmF2YVNjcmlwdC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuaCIKLS8vI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19SZXNNZ3IuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19SdW50aW1lLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0RlZmluZS5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19PYmplY3QuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfVmFsdWUuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvRG9jdW1lbnQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvRmllbGQuaCIKKyNpbmNsdWRlICJKU19FdmVudEhhbmRsZXIuaCIKKworI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRmllbGQuaCIKKyNpbmNsdWRlICJKU19Db250ZXh0LmgiCisjaW5jbHVkZSAiSlNfRGVmaW5lLmgiCisjaW5jbHVkZSAiSlNfT2JqZWN0LmgiCisjaW5jbHVkZSAiSlNfUnVudGltZS5oIgorI2luY2x1ZGUgIkpTX1ZhbHVlLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCIKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDSlNfRXZlbnRIYW5kbGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ0pTX0V2ZW50SGFuZGxlcjo6Q0pTX0V2ZW50SGFuZGxlcihDSlNfQ29udGV4dCAqIHBDb250ZXh0KQkgOgotCW1fcEpTQ29udGV4dChwQ29udGV4dCksCi0JbV9lRXZlbnRUeXBlKEpFVF9VTktOT1dOKSwKLQltX2JWYWxpZChGQUxTRSksCi0JbV9wV2lkZVN0ckNoYW5nZShOVUxMKSwKLQltX25Db21taXRLZXkoLTEpLAotCW1fYktleURvd24oRkFMU0UpLAotCW1fYk1vZGlmaWVyKEZBTFNFKSwKLQltX2JTaGlmdChGQUxTRSksCi0JbV9wSVNlbEVuZChOVUxMKSwKLQltX25TZWxFbmREdSgwKSwKLQltX3BJU2VsU3RhcnQoTlVMTCksCi0JbV9uU2VsU3RhcnREdSgwKSwKLQltX2JXaWxsQ29tbWl0KEZBTFNFKSwKLQltX3BWYWx1ZShOVUxMKSwKLQltX2JGaWVsZEZ1bGwoRkFMU0UpLAotCW1fcGJSYyhOVUxMKSwKLQltX2JSY0R1KEZBTFNFKSwKLQltX3BTb3VyY2VEb2MoTlVMTCksCi0JbV9wVGFyZ2V0Qm9va01hcmsoTlVMTCksCi0JbV9wVGFyZ2V0RG9jKE5VTEwpLAotCW1fcFRhcmdldEFubm90KE5VTEwpCi17CitDSlNfRXZlbnRIYW5kbGVyOjpDSlNfRXZlbnRIYW5kbGVyKENKU19Db250ZXh0KiBwQ29udGV4dCkKKyAgICA6IG1fcEpTQ29udGV4dChwQ29udGV4dCksCisgICAgICBtX2VFdmVudFR5cGUoSkVUX1VOS05PV04pLAorICAgICAgbV9iVmFsaWQoRkFMU0UpLAorICAgICAgbV9wV2lkZVN0ckNoYW5nZShOVUxMKSwKKyAgICAgIG1fbkNvbW1pdEtleSgtMSksCisgICAgICBtX2JLZXlEb3duKEZBTFNFKSwKKyAgICAgIG1fYk1vZGlmaWVyKEZBTFNFKSwKKyAgICAgIG1fYlNoaWZ0KEZBTFNFKSwKKyAgICAgIG1fcElTZWxFbmQoTlVMTCksCisgICAgICBtX25TZWxFbmREdSgwKSwKKyAgICAgIG1fcElTZWxTdGFydChOVUxMKSwKKyAgICAgIG1fblNlbFN0YXJ0RHUoMCksCisgICAgICBtX2JXaWxsQ29tbWl0KEZBTFNFKSwKKyAgICAgIG1fcFZhbHVlKE5VTEwpLAorICAgICAgbV9iRmllbGRGdWxsKEZBTFNFKSwKKyAgICAgIG1fcGJSYyhOVUxMKSwKKyAgICAgIG1fYlJjRHUoRkFMU0UpLAorICAgICAgbV9wU291cmNlRG9jKE5VTEwpLAorICAgICAgbV9wVGFyZ2V0Qm9va01hcmsoTlVMTCksCisgICAgICBtX3BUYXJnZXREb2MoTlVMTCksCisgICAgICBtX3BUYXJnZXRBbm5vdChOVUxMKSB7fQorCitDSlNfRXZlbnRIYW5kbGVyOjp+Q0pTX0V2ZW50SGFuZGxlcigpIHt9CisKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25BcHBfSW5pdCgpIHsKKyAgSW5pdGlhbChKRVRfQVBQX0lOSVQpOwogfQogCi1DSlNfRXZlbnRIYW5kbGVyOjp+Q0pTX0V2ZW50SGFuZGxlcigpCi17Cit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRG9jX09wZW4oQ1BERlNES19Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyVGFyZ2V0TmFtZSkgeworICBJbml0aWFsKEpFVF9ET0NfT1BFTik7CisKKyAgbV9wVGFyZ2V0RG9jID0gcERvYzsKKyAgbV9zdHJUYXJnZXROYW1lID0gc3RyVGFyZ2V0TmFtZTsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkFwcF9Jbml0KCkKLXsKLQlJbml0aWFsKEpFVF9BUFBfSU5JVCk7Cit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRG9jX1dpbGxQcmludChDUERGU0RLX0RvY3VtZW50KiBwRG9jKSB7CisgIEluaXRpYWwoSkVUX0RPQ19XSUxMUFJJTlQpOworCisgIG1fcFRhcmdldERvYyA9IHBEb2M7CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25Eb2NfT3BlbihDUERGU0RLX0RvY3VtZW50KiBwRG9jLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyVGFyZ2V0TmFtZSkKLXsKLQlJbml0aWFsKEpFVF9ET0NfT1BFTik7Cit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRG9jX0RpZFByaW50KENQREZTREtfRG9jdW1lbnQqIHBEb2MpIHsKKyAgSW5pdGlhbChKRVRfRE9DX0RJRFBSSU5UKTsKIAotCW1fcFRhcmdldERvYyA9IHBEb2M7Ci0JbV9zdHJUYXJnZXROYW1lID0gc3RyVGFyZ2V0TmFtZTsJCisgIG1fcFRhcmdldERvYyA9IHBEb2M7CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25Eb2NfV2lsbFByaW50KENQREZTREtfRG9jdW1lbnQqIHBEb2MpCi17Ci0JSW5pdGlhbChKRVRfRE9DX1dJTExQUklOVCk7Ci0KLQltX3BUYXJnZXREb2MgPSBwRG9jOwkKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25Eb2NfV2lsbFNhdmUoQ1BERlNES19Eb2N1bWVudCogcERvYykgeworICBJbml0aWFsKEpFVF9ET0NfV0lMTFNBVkUpOworICBtX3BUYXJnZXREb2MgPSBwRG9jOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRG9jX0RpZFByaW50KENQREZTREtfRG9jdW1lbnQqIHBEb2MpCi17Ci0JSW5pdGlhbChKRVRfRE9DX0RJRFBSSU5UKTsKLQkKLQltX3BUYXJnZXREb2MgPSBwRG9jOwkJCit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRG9jX0RpZFNhdmUoQ1BERlNES19Eb2N1bWVudCogcERvYykgeworICBJbml0aWFsKEpFVF9ET0NfRElEU0FWRSk7CisKKyAgbV9wVGFyZ2V0RG9jID0gcERvYzsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkRvY19XaWxsU2F2ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jKQotewotCUluaXRpYWwoSkVUX0RPQ19XSUxMU0FWRSk7Ci0JbV9wVGFyZ2V0RG9jID0gcERvYzsJCQordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkRvY19XaWxsQ2xvc2UoQ1BERlNES19Eb2N1bWVudCogcERvYykgeworICBJbml0aWFsKEpFVF9ET0NfV0lMTENMT1NFKTsKKworICBtX3BUYXJnZXREb2MgPSBwRG9jOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRG9jX0RpZFNhdmUoQ1BERlNES19Eb2N1bWVudCogcERvYykKLXsKLQlJbml0aWFsKEpFVF9ET0NfRElEU0FWRSk7CQotCQotCW1fcFRhcmdldERvYyA9IHBEb2M7CQordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblBhZ2VfT3BlbihDUERGU0RLX0RvY3VtZW50KiBwRG9jKSB7CisgIEluaXRpYWwoSkVUX1BBR0VfT1BFTik7CisKKyAgbV9wVGFyZ2V0RG9jID0gcERvYzsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkRvY19XaWxsQ2xvc2UoQ1BERlNES19Eb2N1bWVudCogcERvYykKLXsKLQlJbml0aWFsKEpFVF9ET0NfV0lMTENMT1NFKTsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25QYWdlX0Nsb3NlKENQREZTREtfRG9jdW1lbnQqIHBEb2MpIHsKKyAgSW5pdGlhbChKRVRfUEFHRV9DTE9TRSk7CiAKLQltX3BUYXJnZXREb2MgPSBwRG9jOwkKKyAgbV9wVGFyZ2V0RG9jID0gcERvYzsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblBhZ2VfT3BlbihDUERGU0RLX0RvY3VtZW50KiBwRG9jKQotewotCUluaXRpYWwoSkVUX1BBR0VfT1BFTik7Cit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uUGFnZV9JblZpZXcoQ1BERlNES19Eb2N1bWVudCogcERvYykgeworICBJbml0aWFsKEpFVF9QQUdFX0lOVklFVyk7CiAKLQltX3BUYXJnZXREb2MgPSBwRG9jOworICBtX3BUYXJnZXREb2MgPSBwRG9jOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uUGFnZV9DbG9zZShDUERGU0RLX0RvY3VtZW50KiBwRG9jKQotewotCUluaXRpYWwoSkVUX1BBR0VfQ0xPU0UpOwotCQotCW1fcFRhcmdldERvYyA9IHBEb2M7Cit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uUGFnZV9PdXRWaWV3KENQREZTREtfRG9jdW1lbnQqIHBEb2MpIHsKKyAgSW5pdGlhbChKRVRfUEFHRV9PVVRWSUVXKTsKKworICBtX3BUYXJnZXREb2MgPSBwRG9jOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uUGFnZV9JblZpZXcoQ1BERlNES19Eb2N1bWVudCogcERvYykKLXsKLQlJbml0aWFsKEpFVF9QQUdFX0lOVklFVyk7Ci0JCi0JbV9wVGFyZ2V0RG9jID0gcERvYzsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9Nb3VzZUVudGVyKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgeworICBJbml0aWFsKEpFVF9GSUVMRF9NT1VTRUVOVEVSKTsKKworICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKKyAgbV9iU2hpZnQgPSBiU2hpZnQ7CisKKyAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblBhZ2VfT3V0VmlldyhDUERGU0RLX0RvY3VtZW50KiBwRG9jKQotewotCUluaXRpYWwoSkVUX1BBR0VfT1VUVklFVyk7Ci0JCi0JbV9wVGFyZ2V0RG9jID0gcERvYzsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9Nb3VzZUV4aXQoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgeworICBJbml0aWFsKEpFVF9GSUVMRF9NT1VTRUVYSVQpOworCisgIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOworICBtX2JTaGlmdCA9IGJTaGlmdDsKKyAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkKLXsKLQlJbml0aWFsKEpFVF9GSUVMRF9NT1VTRUVOVEVSKTsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgeworICBJbml0aWFsKEpFVF9GSUVMRF9NT1VTRURPV04pOworICBtX2VFdmVudFR5cGUgPSBKRVRfRklFTERfTU9VU0VET1dOOwogCi0JbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7Ci0JbV9iU2hpZnQgPSBiU2hpZnQ7Ci0KLQlBU1NFUlQocFRhcmdldCAhPSBOVUxMKTsKLQltX3N0clRhcmdldE5hbWUgPSBwVGFyZ2V0LT5HZXRGdWxsTmFtZSgpOworICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKKyAgbV9iU2hpZnQgPSBiU2hpZnQ7CisgIG1fc3RyVGFyZ2V0TmFtZSA9IHBUYXJnZXQtPkdldEZ1bGxOYW1lKCk7CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9Nb3VzZUV4aXQoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkKLXsKLQlJbml0aWFsKEpFVF9GSUVMRF9NT1VTRUVYSVQpOwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX01vdXNlVXAoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSB7CisgIEluaXRpYWwoSkVUX0ZJRUxEX01PVVNFVVApOwogCi0JbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7Ci0JbV9iU2hpZnQgPSBiU2hpZnQ7Ci0JQVNTRVJUKHBUYXJnZXQgIT0gTlVMTCk7Ci0JbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsJCisgIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOworICBtX2JTaGlmdCA9IGJTaGlmdDsKKyAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KQotewotCUluaXRpYWwoSkVUX0ZJRUxEX01PVVNFRE9XTik7Ci0JbV9lRXZlbnRUeXBlID0gSkVUX0ZJRUxEX01PVVNFRE9XTjsKLQkKLQltX2JNb2RpZmllciA9IGJNb2RpZmllcjsKLQltX2JTaGlmdCA9IGJTaGlmdDsJCi0JQVNTRVJUKHBUYXJnZXQgIT0gTlVMTCk7Ci0JbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9Gb2N1cyhGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpIHsKKyAgSW5pdGlhbChKRVRfRklFTERfRk9DVVMpOworCisgIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOworICBtX2JTaGlmdCA9IGJTaGlmdDsKKyAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKKyAgbV9wVmFsdWUgPSAoQ0ZYX1dpZGVTdHJpbmcqKSZWYWx1ZTsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX01vdXNlVXAoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkKLXsKLQlJbml0aWFsKEpFVF9GSUVMRF9NT1VTRVVQKTsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSkgeworICBJbml0aWFsKEpFVF9GSUVMRF9CTFVSKTsKIAotCW1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOwotCW1fYlNoaWZ0ID0gYlNoaWZ0OwotCUFTU0VSVChwVGFyZ2V0ICE9IE5VTEwpOwotCW1fc3RyVGFyZ2V0TmFtZSA9IHBUYXJnZXQtPkdldEZ1bGxOYW1lKCk7CisgIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOworICBtX2JTaGlmdCA9IGJTaGlmdDsKKyAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKKyAgbV9wVmFsdWUgPSAoQ0ZYX1dpZGVTdHJpbmcqKSZWYWx1ZTsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIAotCQkJCQkJCQkJIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSkKLXsKLQlJbml0aWFsKEpFVF9GSUVMRF9GT0NVUyk7Cit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfS2V5c3Ryb2tlKENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBLZXlEb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBuU2VsRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5TZWxTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYldpbGxDb21taXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpZWxkRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlJjKSB7CisgIEluaXRpYWwoSkVUX0ZJRUxEX0tFWVNUUk9LRSk7CiAKLQltX2JNb2RpZmllciA9IGJNb2RpZmllcjsKLQltX2JTaGlmdCA9IGJTaGlmdDsgIAotCUFTU0VSVChwVGFyZ2V0ICE9IE5VTEwpOwotCW1fc3RyVGFyZ2V0TmFtZSA9IHBUYXJnZXQtPkdldEZ1bGxOYW1lKCk7Ci0JbV9wVmFsdWUgPSAoQ0ZYX1dpZGVTdHJpbmcqKSZWYWx1ZTsKKyAgbV9uQ29tbWl0S2V5ID0gMDsKKyAgbV9wV2lkZVN0ckNoYW5nZSA9ICZzdHJDaGFuZ2U7CisgIG1fV2lkZVN0ckNoYW5nZUV4ID0gc3RyQ2hhbmdlRXg7CisgIG1fYktleURvd24gPSBLZXlEb3duOworICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKKyAgbV9wSVNlbEVuZCA9ICZuU2VsRW5kOworICBtX3BJU2VsU3RhcnQgPSAmblNlbFN0YXJ0OworICBtX2JTaGlmdCA9IGJTaGlmdDsKKyAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKKyAgbV9wVmFsdWUgPSAmVmFsdWU7CisgIG1fYldpbGxDb21taXQgPSBiV2lsbENvbW1pdDsKKyAgbV9wYlJjID0gJmJSYzsKKyAgbV9iRmllbGRGdWxsID0gYkZpZWxkRnVsbDsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX0JsdXIoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKLQkJCQkJCQkJCWNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSkKLXsKLQlJbml0aWFsKEpFVF9GSUVMRF9CTFVSKTsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9WYWxpZGF0ZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJLZXlEb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUmMpIHsKKyAgSW5pdGlhbChKRVRfRklFTERfVkFMSURBVEUpOwogCi0JbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7Ci0JbV9iU2hpZnQgPSBiU2hpZnQ7Ci0JQVNTRVJUKHBUYXJnZXQgIT0gTlVMTCk7Ci0JbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKLQltX3BWYWx1ZSA9IChDRlhfV2lkZVN0cmluZyopJlZhbHVlOwkKKyAgbV9wV2lkZVN0ckNoYW5nZSA9ICZzdHJDaGFuZ2U7CisgIG1fV2lkZVN0ckNoYW5nZUV4ID0gc3RyQ2hhbmdlRXg7CisgIG1fYktleURvd24gPSBiS2V5RG93bjsKKyAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7CisgIG1fYlNoaWZ0ID0gYlNoaWZ0OworICBtX3N0clRhcmdldE5hbWUgPSBwVGFyZ2V0LT5HZXRGdWxsTmFtZSgpOworICBtX3BWYWx1ZSA9ICZWYWx1ZTsKKyAgbV9wYlJjID0gJmJSYzsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX0tleXN0cm9rZShpbnQgbkNvbW1pdEtleSwgQ0ZYX1dpZGVTdHJpbmcgJnN0ckNoYW5nZSwKLQkJCQkJCQkJCQkgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LCBGWF9CT09MIEtleURvd24sCi0JCQkJCQkJCQkJIEZYX0JPT0wgYk1vZGlmaWVyLCBpbnQmIG5TZWxFbmQsIGludCYgblNlbFN0YXJ0LAotCQkJCQkJCQkJCSBGWF9CT09MIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCi0JCQkJCQkJCQkJIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwgRlhfQk9PTCBiV2lsbENvbW1pdCwKLQkJCQkJCQkJCQkgIEZYX0JPT0wgYkZpZWxkRnVsbCwgRlhfQk9PTCYgYlJjKQotewotCUluaXRpYWwoSkVUX0ZJRUxEX0tFWVNUUk9LRSk7Ci0JCi0JbV9uQ29tbWl0S2V5ID0gbkNvbW1pdEtleTsKLQltX3BXaWRlU3RyQ2hhbmdlID0gJnN0ckNoYW5nZTsKLQltX1dpZGVTdHJDaGFuZ2VFeCA9IHN0ckNoYW5nZUV4OwotCW1fYktleURvd24gPSBLZXlEb3duOwotCW1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOwotCW1fcElTZWxFbmQgPSAmblNlbEVuZDsKLQltX3BJU2VsU3RhcnQgPSAmblNlbFN0YXJ0OwotCW1fYlNoaWZ0ID0gYlNoaWZ0OwkKLQlBU1NFUlQocFRhcmdldCAhPSBOVUxMKTsKLQltX3N0clRhcmdldE5hbWUgPSBwVGFyZ2V0LT5HZXRGdWxsTmFtZSgpOwotCW1fcFZhbHVlID0gJlZhbHVlOwotCW1fYldpbGxDb21taXQgPSBiV2lsbENvbW1pdDsJCi0JbV9wYlJjID0gJmJSYzsKLQltX2JGaWVsZEZ1bGwgPSBiRmllbGRGdWxsOwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX0NhbGN1bGF0ZShDUERGX0Zvcm1GaWVsZCogcFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlJjKSB7CisgIEluaXRpYWwoSkVUX0ZJRUxEX0NBTENVTEFURSk7CisKKyAgaWYgKHBTb3VyY2UpCisgICAgbV9zdHJTb3VyY2VOYW1lID0gcFNvdXJjZS0+R2V0RnVsbE5hbWUoKTsKKyAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKKyAgbV9wVmFsdWUgPSAmVmFsdWU7CisgIG1fcGJSYyA9ICZiUmM7CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9WYWxpZGF0ZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCi0JCQkJCQkJCQkJRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LAotCQkJCQkJCQkJCUNQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LCBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wmIGJSYykKLXsKLQlJbml0aWFsKEpFVF9GSUVMRF9WQUxJREFURSk7Ci0JCi0JbV9wV2lkZVN0ckNoYW5nZSA9ICZzdHJDaGFuZ2U7Ci0JbV9XaWRlU3RyQ2hhbmdlRXggPSBzdHJDaGFuZ2VFeDsJCi0JbV9iS2V5RG93biA9IGJLZXlEb3duOwotCW1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOwotCW1fYlNoaWZ0ID0gYlNoaWZ0OwotCUFTU0VSVChwVGFyZ2V0ICE9IE5VTEwpOwotCW1fc3RyVGFyZ2V0TmFtZSA9IHBUYXJnZXQtPkdldEZ1bGxOYW1lKCk7Ci0JbV9wVmFsdWUgPSAmVmFsdWU7CQotCW1fcGJSYyA9ICZiUmM7CQordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX0Zvcm1hdChDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJXaWxsQ29tbWl0KSB7CisgIEluaXRpYWwoSkVUX0ZJRUxEX0ZPUk1BVCk7CisKKyAgbV9uQ29tbWl0S2V5ID0gMDsKKyAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKKyAgbV9wVmFsdWUgPSAmVmFsdWU7CisgIG1fYldpbGxDb21taXQgPSBiV2lsbENvbW1pdDsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX0NhbGN1bGF0ZShDUERGX0Zvcm1GaWVsZCogcFNvdXJjZSwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsIAotCQkJCQkJCQkJCSBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wmIGJSYykKLXsKLQlJbml0aWFsKEpFVF9GSUVMRF9DQUxDVUxBVEUpOwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9Gb2N1cyhGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIHsKKyAgSW5pdGlhbChKRVRfU0NSRUVOX0ZPQ1VTKTsKIAotCWlmIChwU291cmNlKQotCQltX3N0clNvdXJjZU5hbWUgPSBwU291cmNlLT5HZXRGdWxsTmFtZSgpOwotCUFTU0VSVChwVGFyZ2V0ICE9IE5VTEwpOwotCW1fc3RyVGFyZ2V0TmFtZSA9IHBUYXJnZXQtPkdldEZ1bGxOYW1lKCk7Ci0gICAgbV9wVmFsdWUgPSAmVmFsdWU7Ci0JbV9wYlJjID0gJmJSYzsKKyAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7CisgIG1fYlNoaWZ0ID0gYlNoaWZ0OworICBtX3BUYXJnZXRBbm5vdCA9IHBTY3JlZW47CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9Gb3JtYXQoaW50IG5Db21taXRLZXksIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAotCQkJCQkJCQkJICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsIEZYX0JPT0wgYldpbGxDb21taXQpCi17Ci0JSW5pdGlhbChKRVRfRklFTERfRk9STUFUKTsKLQkKLQltX25Db21taXRLZXkgPSBuQ29tbWl0S2V5OwkgIAotCUFTU0VSVChwVGFyZ2V0ICE9IE5VTEwpOwotCW1fc3RyVGFyZ2V0TmFtZSA9IHBUYXJnZXQtPkdldEZ1bGxOYW1lKCk7Ci0JbV9wVmFsdWUgPSAmVmFsdWU7Ci0JbV9iV2lsbENvbW1pdCA9IGJXaWxsQ29tbWl0Owordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIHsKKyAgSW5pdGlhbChKRVRfU0NSRUVOX0JMVVIpOworCisgIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOworICBtX2JTaGlmdCA9IGJTaGlmdDsKKyAgbV9wVGFyZ2V0QW5ub3QgPSBwU2NyZWVuOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKLXsKLQlJbml0aWFsKEpFVF9TQ1JFRU5fRk9DVVMpOwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9PcGVuKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIHsKKyAgSW5pdGlhbChKRVRfU0NSRUVOX09QRU4pOwogCi0JbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7Ci0JbV9iU2hpZnQgPSBiU2hpZnQ7Ci0JbV9wVGFyZ2V0QW5ub3QgPSBwU2NyZWVuOworICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKKyAgbV9iU2hpZnQgPSBiU2hpZnQ7CisgIG1fcFRhcmdldEFubm90ID0gcFNjcmVlbjsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKLXsKLQlJbml0aWFsKEpFVF9TQ1JFRU5fQkxVUik7Cit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX0Nsb3NlKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgeworICBJbml0aWFsKEpFVF9TQ1JFRU5fQ0xPU0UpOwogCi0JbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7Ci0JbV9iU2hpZnQgPSBiU2hpZnQ7Ci0JbV9wVGFyZ2V0QW5ub3QgPSBwU2NyZWVuOworICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKKyAgbV9iU2hpZnQgPSBiU2hpZnQ7CisgIG1fcFRhcmdldEFubm90ID0gcFNjcmVlbjsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9PcGVuKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKLXsKLQlJbml0aWFsKEpFVF9TQ1JFRU5fT1BFTik7Cit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgeworICBJbml0aWFsKEpFVF9TQ1JFRU5fTU9VU0VET1dOKTsKIAotCW1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOwotCW1fYlNoaWZ0ID0gYlNoaWZ0OwotCW1fcFRhcmdldEFubm90ID0gcFNjcmVlbjsKKyAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7CisgIG1fYlNoaWZ0ID0gYlNoaWZ0OworICBtX3BUYXJnZXRBbm5vdCA9IHBTY3JlZW47CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fQ2xvc2UoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQotewotCUluaXRpYWwoSkVUX1NDUkVFTl9DTE9TRSk7Cit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX01vdXNlVXAoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgeworICBJbml0aWFsKEpFVF9TQ1JFRU5fTU9VU0VVUCk7CiAKLQltX2JNb2RpZmllciA9IGJNb2RpZmllcjsKLQltX2JTaGlmdCA9IGJTaGlmdDsKLQltX3BUYXJnZXRBbm5vdCA9IHBTY3JlZW47CisgIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOworICBtX2JTaGlmdCA9IGJTaGlmdDsKKyAgbV9wVGFyZ2V0QW5ub3QgPSBwU2NyZWVuOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pCi17Ci0JSW5pdGlhbChKRVRfU0NSRUVOX01PVVNFRE9XTik7Cit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgeworICBJbml0aWFsKEpFVF9TQ1JFRU5fTU9VU0VFTlRFUik7CiAKLQltX2JNb2RpZmllciA9IGJNb2RpZmllcjsKLQltX2JTaGlmdCA9IGJTaGlmdDsKLQltX3BUYXJnZXRBbm5vdCA9IHBTY3JlZW47CisgIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOworICBtX2JTaGlmdCA9IGJTaGlmdDsKKyAgbV9wVGFyZ2V0QW5ub3QgPSBwU2NyZWVuOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX01vdXNlVXAoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQotewotCUluaXRpYWwoSkVUX1NDUkVFTl9NT1VTRVVQKTsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fTW91c2VFeGl0KEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7CisgIEluaXRpYWwoSkVUX1NDUkVFTl9NT1VTRUVYSVQpOwogCi0JbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7Ci0JbV9iU2hpZnQgPSBiU2hpZnQ7Ci0JbV9wVGFyZ2V0QW5ub3QgPSBwU2NyZWVuOworICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKKyAgbV9iU2hpZnQgPSBiU2hpZnQ7CisgIG1fcFRhcmdldEFubm90ID0gcFNjcmVlbjsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9Nb3VzZUVudGVyKEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKLXsKLQlJbml0aWFsKEpFVF9TQ1JFRU5fTU9VU0VFTlRFUik7Cit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX0luVmlldyhGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgeworICBJbml0aWFsKEpFVF9TQ1JFRU5fSU5WSUVXKTsKIAotCW1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOwotCW1fYlNoaWZ0ID0gYlNoaWZ0OwotCW1fcFRhcmdldEFubm90ID0gcFNjcmVlbjsKKyAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7CisgIG1fYlNoaWZ0ID0gYlNoaWZ0OworICBtX3BUYXJnZXRBbm5vdCA9IHBTY3JlZW47CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fTW91c2VFeGl0KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKLXsKLQlJbml0aWFsKEpFVF9TQ1JFRU5fTU9VU0VFWElUKTsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fT3V0VmlldyhGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7CisgIEluaXRpYWwoSkVUX1NDUkVFTl9PVVRWSUVXKTsKIAotCW1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOwotCW1fYlNoaWZ0ID0gYlNoaWZ0OwotCW1fcFRhcmdldEFubm90ID0gcFNjcmVlbjsKKyAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7CisgIG1fYlNoaWZ0ID0gYlNoaWZ0OworICBtX3BUYXJnZXRBbm5vdCA9IHBTY3JlZW47CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fSW5WaWV3KEZYX0JPT0wgYk1vZGlmaWVyLCBGWF9CT09MIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbikKLXsKLQlJbml0aWFsKEpFVF9TQ1JFRU5fSU5WSUVXKTsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25MaW5rX01vdXNlVXAoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCkgeworICBJbml0aWFsKEpFVF9MSU5LX01PVVNFVVApOwogCi0JbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7Ci0JbV9iU2hpZnQgPSBiU2hpZnQ7Ci0JbV9wVGFyZ2V0QW5ub3QgPSBwU2NyZWVuOworICBtX3BUYXJnZXREb2MgPSBwVGFyZ2V0OwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX091dFZpZXcoRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQotewotCUluaXRpYWwoSkVUX1NDUkVFTl9PVVRWSUVXKTsKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25Cb29rbWFya19Nb3VzZVVwKENQREZfQm9va21hcmsqIHBCb29rTWFyaykgeworICBJbml0aWFsKEpFVF9CT09LTUFSS19NT1VTRVVQKTsKIAotCW1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOwotCW1fYlNoaWZ0ID0gYlNoaWZ0OwotCW1fcFRhcmdldEFubm90ID0gcFNjcmVlbjsKKyAgbV9wVGFyZ2V0Qm9va01hcmsgPSBwQm9va01hcms7CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25MaW5rX01vdXNlVXAoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCkKLXsKLQlJbml0aWFsKEpFVF9MSU5LX01PVVNFVVApOwotCQotCW1fcFRhcmdldERvYyA9IHBUYXJnZXQ7CQordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbk1lbnVfRXhlYyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyVGFyZ2V0TmFtZSkgeworICBJbml0aWFsKEpFVF9NRU5VX0VYRUMpOworCisgIG1fcFRhcmdldERvYyA9IHBUYXJnZXQ7CisgIG1fc3RyVGFyZ2V0TmFtZSA9IHN0clRhcmdldE5hbWU7CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25Cb29rbWFya19Nb3VzZVVwKENQREZfQm9va21hcmsqIHBCb29rTWFyaykKLXsKLQlJbml0aWFsKEpFVF9CT09LTUFSS19NT1VTRVVQKTsKLQotCW1fcFRhcmdldEJvb2tNYXJrID0gcEJvb2tNYXJrOwkKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25FeHRlcm5hbF9FeGVjKCkgeworICBJbml0aWFsKEpFVF9FWFRFUk5BTF9FWEVDKTsKIH0KIAotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbk1lbnVfRXhlYyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyVGFyZ2V0TmFtZSkKLXsKLQlJbml0aWFsKEpFVF9NRU5VX0VYRUMpOwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkJhdGNoRXhlYyhDUERGU0RLX0RvY3VtZW50KiBwVGFyZ2V0KSB7CisgIEluaXRpYWwoSkVUX0JBVENIX0VYRUMpOwogCi0JbV9wVGFyZ2V0RG9jID0gcFRhcmdldDsKLQltX3N0clRhcmdldE5hbWUgPSBzdHJUYXJnZXROYW1lOworICBtX3BUYXJnZXREb2MgPSBwVGFyZ2V0OwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRXh0ZXJuYWxfRXhlYygpCi17Ci0JSW5pdGlhbChKRVRfRVhURVJOQUxfRVhFQyk7Cit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uQ29uc29sZV9FeGVjKCkgeworICBJbml0aWFsKEpFVF9DT05TT0xFX0VYRUMpOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uQmF0Y2hFeGVjKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpCi17Ci0JSW5pdGlhbChKRVRfQkFUQ0hfRVhFQyk7Cit2b2lkIENKU19FdmVudEhhbmRsZXI6OkluaXRpYWwoSlNfRVZFTlRfVCB0eXBlKSB7CisgIG1fZUV2ZW50VHlwZSA9IHR5cGU7CiAKLQltX3BUYXJnZXREb2MgPSBwVGFyZ2V0OwkKKyAgbV9zdHJUYXJnZXROYW1lID0gTCIiOworICBtX3N0clNvdXJjZU5hbWUgPSBMIiI7CisgIG1fcFdpZGVTdHJDaGFuZ2UgPSBOVUxMOworICBtX1dpZGVTdHJDaGFuZ2VEdSA9IEwiIjsKKyAgbV9XaWRlU3RyQ2hhbmdlRXggPSBMIiI7CisgIG1fbkNvbW1pdEtleSA9IC0xOworICBtX2JLZXlEb3duID0gRkFMU0U7CisgIG1fYk1vZGlmaWVyID0gRkFMU0U7CisgIG1fYlNoaWZ0ID0gRkFMU0U7CisgIG1fcElTZWxFbmQgPSBOVUxMOworICBtX25TZWxFbmREdSA9IDA7CisgIG1fcElTZWxTdGFydCA9IE5VTEw7CisgIG1fblNlbFN0YXJ0RHUgPSAwOworICBtX2JXaWxsQ29tbWl0ID0gRkFMU0U7CisgIG1fcFZhbHVlID0gTlVMTDsKKyAgbV9iRmllbGRGdWxsID0gRkFMU0U7CisgIG1fcGJSYyA9IE5VTEw7CisgIG1fYlJjRHUgPSBGQUxTRTsKKworICBtX3BTb3VyY2VEb2MgPSBOVUxMOworICBtX3BUYXJnZXRCb29rTWFyayA9IE5VTEw7CisgIG1fcFRhcmdldERvYyA9IE5VTEw7CisgIG1fcFRhcmdldEFubm90ID0gTlVMTDsKKworICBtX2JWYWxpZCA9IFRSVUU7CiB9CiAKLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25Db25zb2xlX0V4ZWMoKQotewotCUluaXRpYWwoSkVUX0NPTlNPTEVfRVhFQyk7Cit2b2lkIENKU19FdmVudEhhbmRsZXI6OkRlc3Ryb3koKSB7CisgIG1fYlZhbGlkID0gRkFMU0U7CiB9CiAKLQotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpJbml0aWFsKEpTX0VWRU5UX1QgdHlwZSkKLXsKLQltX2VFdmVudFR5cGUgPSB0eXBlOwotCi0JbV9zdHJUYXJnZXROYW1lID0gTCIiOwotCW1fc3RyU291cmNlTmFtZSA9IEwiIjsKLQltX3BXaWRlU3RyQ2hhbmdlID0gTlVMTDsKLQltX1dpZGVTdHJDaGFuZ2VEdSA9IEwiIjsKLQltX1dpZGVTdHJDaGFuZ2VFeCA9IEwiIjsKLQltX25Db21taXRLZXkgPSAtMTsKLQltX2JLZXlEb3duID0gRkFMU0U7Ci0JbV9iTW9kaWZpZXIgPSBGQUxTRTsKLQltX2JTaGlmdCA9IEZBTFNFOwotCW1fcElTZWxFbmQgPSBOVUxMOwotCW1fblNlbEVuZER1ID0gMDsKLQltX3BJU2VsU3RhcnQgPSBOVUxMOwotCW1fblNlbFN0YXJ0RHUgPSAwOwotCW1fYldpbGxDb21taXQgPSBGQUxTRTsKLQltX3BWYWx1ZSA9IE5VTEw7Ci0JbV9iRmllbGRGdWxsID0gRkFMU0U7Ci0JbV9wYlJjID0gTlVMTDsKLQltX2JSY0R1ID0gRkFMU0U7Ci0KLQltX3BTb3VyY2VEb2MgPSBOVUxMOwotCW1fcFRhcmdldEJvb2tNYXJrID0gTlVMTDsKLQltX3BUYXJnZXREb2MgPSBOVUxMOwotCW1fcFRhcmdldEFubm90ID0gTlVMTDsKLQotCW1fYlZhbGlkID0gVFJVRTsKK0ZYX0JPT0wgQ0pTX0V2ZW50SGFuZGxlcjo6SXNWYWxpZCgpIHsKKyAgcmV0dXJuIG1fYlZhbGlkOwogfQogCi12b2lkIENKU19FdmVudEhhbmRsZXI6OkRlc3Ryb3koKQotewotCW1fYlZhbGlkID0gRkFMU0U7CitDRlhfV2lkZVN0cmluZyYgQ0pTX0V2ZW50SGFuZGxlcjo6Q2hhbmdlKCkgeworICBpZiAobV9wV2lkZVN0ckNoYW5nZSkgeworICAgIHJldHVybiAqbV9wV2lkZVN0ckNoYW5nZTsKKyAgfQorICByZXR1cm4gbV9XaWRlU3RyQ2hhbmdlRHU7CiB9CiAKLUZYX0JPT0wgQ0pTX0V2ZW50SGFuZGxlcjo6SXNWYWxpZCgpCi17Ci0JcmV0dXJuIG1fYlZhbGlkOworQ0ZYX1dpZGVTdHJpbmcgQ0pTX0V2ZW50SGFuZGxlcjo6Q2hhbmdlRXgoKSB7CisgIHJldHVybiBtX1dpZGVTdHJDaGFuZ2VFeDsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgJiBDSlNfRXZlbnRIYW5kbGVyOjpDaGFuZ2UoKQotewotCWlmIChtX3BXaWRlU3RyQ2hhbmdlICE9IE5VTEwpCi0JCXJldHVybiAqbV9wV2lkZVN0ckNoYW5nZTsKLQllbHNlCi0JewotCQlyZXR1cm4gbV9XaWRlU3RyQ2hhbmdlRHU7Ci0JfQoraW50IENKU19FdmVudEhhbmRsZXI6OkNvbW1pdEtleSgpIHsKKyAgcmV0dXJuIG1fbkNvbW1pdEtleTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ0pTX0V2ZW50SGFuZGxlcjo6Q2hhbmdlRXgoKQotewotCXJldHVybiBtX1dpZGVTdHJDaGFuZ2VFeDsKK0ZYX0JPT0wgQ0pTX0V2ZW50SGFuZGxlcjo6RmllbGRGdWxsKCkgeworICByZXR1cm4gbV9iRmllbGRGdWxsOwogfQogCi1pbnQgQ0pTX0V2ZW50SGFuZGxlcjo6Q29tbWl0S2V5KCkKLXsKLQlyZXR1cm4gbV9uQ29tbWl0S2V5OworRlhfQk9PTCBDSlNfRXZlbnRIYW5kbGVyOjpLZXlEb3duKCkgeworICByZXR1cm4gbV9iS2V5RG93bjsKIH0KIAotRlhfQk9PTCBDSlNfRXZlbnRIYW5kbGVyOjpGaWVsZEZ1bGwoKQotewotCXJldHVybiBtX2JGaWVsZEZ1bGw7CitGWF9CT09MIENKU19FdmVudEhhbmRsZXI6Ok1vZGlmaWVyKCkgeworICByZXR1cm4gbV9iTW9kaWZpZXI7CiB9CiAKLUZYX0JPT0wgQ0pTX0V2ZW50SGFuZGxlcjo6S2V5RG93bigpCi17Ci0JcmV0dXJuIG1fYktleURvd247Citjb25zdCBGWF9XQ0hBUiogQ0pTX0V2ZW50SGFuZGxlcjo6TmFtZSgpIHsKKyAgc3dpdGNoIChtX2VFdmVudFR5cGUpIHsKKyAgICBjYXNlIEpFVF9BUFBfSU5JVDoKKyAgICAgIHJldHVybiBMIkluaXQiOworICAgIGNhc2UgSkVUX0JBVENIX0VYRUM6CisgICAgICByZXR1cm4gTCJFeGVjIjsKKyAgICBjYXNlIEpFVF9CT09LTUFSS19NT1VTRVVQOgorICAgICAgcmV0dXJuIEwiTW91c2UgVXAiOworICAgIGNhc2UgSkVUX0NPTlNPTEVfRVhFQzoKKyAgICAgIHJldHVybiBMIkV4ZWMiOworICAgIGNhc2UgSkVUX0RPQ19ESURQUklOVDoKKyAgICAgIHJldHVybiBMIkRpZFByaW50IjsKKyAgICBjYXNlIEpFVF9ET0NfRElEU0FWRToKKyAgICAgIHJldHVybiBMIkRpZFNhdmUiOworICAgIGNhc2UgSkVUX0RPQ19PUEVOOgorICAgICAgcmV0dXJuIEwiT3BlbiI7CisgICAgY2FzZSBKRVRfRE9DX1dJTExDTE9TRToKKyAgICAgIHJldHVybiBMIldpbGxDbG9zZSI7CisgICAgY2FzZSBKRVRfRE9DX1dJTExQUklOVDoKKyAgICAgIHJldHVybiBMIldpbGxQcmludCI7CisgICAgY2FzZSBKRVRfRE9DX1dJTExTQVZFOgorICAgICAgcmV0dXJuIEwiV2lsbFNhdmUiOworICAgIGNhc2UgSkVUX0VYVEVSTkFMX0VYRUM6CisgICAgICByZXR1cm4gTCJFeGVjIjsKKyAgICBjYXNlIEpFVF9GSUVMRF9GT0NVUzoKKyAgICBjYXNlIEpFVF9TQ1JFRU5fRk9DVVM6CisgICAgICByZXR1cm4gTCJGb2N1cyI7CisgICAgY2FzZSBKRVRfRklFTERfQkxVUjoKKyAgICBjYXNlIEpFVF9TQ1JFRU5fQkxVUjoKKyAgICAgIHJldHVybiBMIkJsdXIiOworICAgIGNhc2UgSkVUX0ZJRUxEX01PVVNFRE9XTjoKKyAgICBjYXNlIEpFVF9TQ1JFRU5fTU9VU0VET1dOOgorICAgICAgcmV0dXJuIEwiTW91c2UgRG93biI7CisgICAgY2FzZSBKRVRfRklFTERfTU9VU0VVUDoKKyAgICBjYXNlIEpFVF9TQ1JFRU5fTU9VU0VVUDoKKyAgICAgIHJldHVybiBMIk1vdXNlIFVwIjsKKyAgICBjYXNlIEpFVF9GSUVMRF9NT1VTRUVOVEVSOgorICAgIGNhc2UgSkVUX1NDUkVFTl9NT1VTRUVOVEVSOgorICAgICAgcmV0dXJuIEwiTW91c2UgRW50ZXIiOworICAgIGNhc2UgSkVUX0ZJRUxEX01PVVNFRVhJVDoKKyAgICBjYXNlIEpFVF9TQ1JFRU5fTU9VU0VFWElUOgorICAgICAgcmV0dXJuIEwiTW91c2UgRXhpdCI7CisgICAgY2FzZSBKRVRfRklFTERfQ0FMQ1VMQVRFOgorICAgICAgcmV0dXJuIEwiQ2FsY3VsYXRlIjsKKyAgICBjYXNlIEpFVF9GSUVMRF9GT1JNQVQ6CisgICAgICByZXR1cm4gTCJGb3JtYXQiOworICAgIGNhc2UgSkVUX0ZJRUxEX0tFWVNUUk9LRToKKyAgICAgIHJldHVybiBMIktleXN0cm9rZSI7CisgICAgY2FzZSBKRVRfRklFTERfVkFMSURBVEU6CisgICAgICByZXR1cm4gTCJWYWxpZGF0ZSI7CisgICAgY2FzZSBKRVRfTElOS19NT1VTRVVQOgorICAgICAgcmV0dXJuIEwiTW91c2UgVXAiOworICAgIGNhc2UgSkVUX01FTlVfRVhFQzoKKyAgICAgIHJldHVybiBMIkV4ZWMiOworICAgIGNhc2UgSkVUX1BBR0VfT1BFTjoKKyAgICBjYXNlIEpFVF9TQ1JFRU5fT1BFTjoKKyAgICAgIHJldHVybiBMIk9wZW4iOworICAgIGNhc2UgSkVUX1BBR0VfQ0xPU0U6CisgICAgY2FzZSBKRVRfU0NSRUVOX0NMT1NFOgorICAgICAgcmV0dXJuIEwiQ2xvc2UiOworICAgIGNhc2UgSkVUX1NDUkVFTl9JTlZJRVc6CisgICAgY2FzZSBKRVRfUEFHRV9JTlZJRVc6CisgICAgICByZXR1cm4gTCJJblZpZXciOworICAgIGNhc2UgSkVUX1BBR0VfT1VUVklFVzoKKyAgICBjYXNlIEpFVF9TQ1JFRU5fT1VUVklFVzoKKyAgICAgIHJldHVybiBMIk91dFZpZXciOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gTCIiOworICB9CisKKyAgcmV0dXJuIEwiIjsKIH0KIAotRlhfQk9PTCBDSlNfRXZlbnRIYW5kbGVyOjpNb2RpZmllcigpCi17Ci0JcmV0dXJuIG1fYk1vZGlmaWVyOworY29uc3QgRlhfV0NIQVIqIENKU19FdmVudEhhbmRsZXI6OlR5cGUoKSB7CisgIHN3aXRjaCAobV9lRXZlbnRUeXBlKSB7CisgICAgY2FzZSBKRVRfQVBQX0lOSVQ6CisgICAgICByZXR1cm4gTCJBcHAiOworICAgIGNhc2UgSkVUX0JBVENIX0VYRUM6CisgICAgICByZXR1cm4gTCJCYXRjaCI7CisgICAgY2FzZSBKRVRfQk9PS01BUktfTU9VU0VVUDoKKyAgICAgIHJldHVybiBMIkJvb2tNYXJrIjsKKyAgICBjYXNlIEpFVF9DT05TT0xFX0VYRUM6CisgICAgICByZXR1cm4gTCJDb25zb2xlIjsKKyAgICBjYXNlIEpFVF9ET0NfRElEUFJJTlQ6CisgICAgY2FzZSBKRVRfRE9DX0RJRFNBVkU6CisgICAgY2FzZSBKRVRfRE9DX09QRU46CisgICAgY2FzZSBKRVRfRE9DX1dJTExDTE9TRToKKyAgICBjYXNlIEpFVF9ET0NfV0lMTFBSSU5UOgorICAgIGNhc2UgSkVUX0RPQ19XSUxMU0FWRToKKyAgICAgIHJldHVybiBMIkRvYyI7CisgICAgY2FzZSBKRVRfRVhURVJOQUxfRVhFQzoKKyAgICAgIHJldHVybiBMIkV4dGVybmFsIjsKKyAgICBjYXNlIEpFVF9GSUVMRF9CTFVSOgorICAgIGNhc2UgSkVUX0ZJRUxEX0ZPQ1VTOgorICAgIGNhc2UgSkVUX0ZJRUxEX01PVVNFRE9XTjoKKyAgICBjYXNlIEpFVF9GSUVMRF9NT1VTRUVOVEVSOgorICAgIGNhc2UgSkVUX0ZJRUxEX01PVVNFRVhJVDoKKyAgICBjYXNlIEpFVF9GSUVMRF9NT1VTRVVQOgorICAgIGNhc2UgSkVUX0ZJRUxEX0NBTENVTEFURToKKyAgICBjYXNlIEpFVF9GSUVMRF9GT1JNQVQ6CisgICAgY2FzZSBKRVRfRklFTERfS0VZU1RST0tFOgorICAgIGNhc2UgSkVUX0ZJRUxEX1ZBTElEQVRFOgorICAgICAgcmV0dXJuIEwiRmllbGQiOworICAgIGNhc2UgSkVUX1NDUkVFTl9GT0NVUzoKKyAgICBjYXNlIEpFVF9TQ1JFRU5fQkxVUjoKKyAgICBjYXNlIEpFVF9TQ1JFRU5fT1BFTjoKKyAgICBjYXNlIEpFVF9TQ1JFRU5fQ0xPU0U6CisgICAgY2FzZSBKRVRfU0NSRUVOX01PVVNFRE9XTjoKKyAgICBjYXNlIEpFVF9TQ1JFRU5fTU9VU0VVUDoKKyAgICBjYXNlIEpFVF9TQ1JFRU5fTU9VU0VFTlRFUjoKKyAgICBjYXNlIEpFVF9TQ1JFRU5fTU9VU0VFWElUOgorICAgIGNhc2UgSkVUX1NDUkVFTl9JTlZJRVc6CisgICAgY2FzZSBKRVRfU0NSRUVOX09VVFZJRVc6CisgICAgICByZXR1cm4gTCJTY3JlZW4iOworICAgIGNhc2UgSkVUX0xJTktfTU9VU0VVUDoKKyAgICAgIHJldHVybiBMIkxpbmsiOworICAgIGNhc2UgSkVUX01FTlVfRVhFQzoKKyAgICAgIHJldHVybiBMIk1lbnUiOworICAgIGNhc2UgSkVUX1BBR0VfT1BFTjoKKyAgICBjYXNlIEpFVF9QQUdFX0NMT1NFOgorICAgIGNhc2UgSkVUX1BBR0VfSU5WSUVXOgorICAgIGNhc2UgSkVUX1BBR0VfT1VUVklFVzoKKyAgICAgIHJldHVybiBMIlBhZ2UiOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gTCIiOworICB9CisKKyAgcmV0dXJuIEwiIjsKIH0KIAotRlhfTFBDV1NUUiBDSlNfRXZlbnRIYW5kbGVyOjpOYW1lKCkKLXsKLQlzd2l0Y2ggKG1fZUV2ZW50VHlwZSkKLQl7Ci0JY2FzZSBKRVRfQVBQX0lOSVQ6CQkJcmV0dXJuIEwiSW5pdCI7Ci0JY2FzZSBKRVRfQkFUQ0hfRVhFQzoJCXJldHVybiBMIkV4ZWMiOwotCWNhc2UgSkVUX0JPT0tNQVJLX01PVVNFVVA6CXJldHVybiBMIk1vdXNlIFVwIjsKLQljYXNlIEpFVF9DT05TT0xFX0VYRUM6CQlyZXR1cm4gTCJFeGVjIjsKLQljYXNlIEpFVF9ET0NfRElEUFJJTlQ6CQlyZXR1cm4gTCJEaWRQcmludCI7Ci0JY2FzZSBKRVRfRE9DX0RJRFNBVkU6CQlyZXR1cm4gTCJEaWRTYXZlIjsKLQljYXNlIEpFVF9ET0NfT1BFTjoJCQlyZXR1cm4gTCJPcGVuIjsKLQljYXNlIEpFVF9ET0NfV0lMTENMT1NFOgkJcmV0dXJuIEwiV2lsbENsb3NlIjsKLQljYXNlIEpFVF9ET0NfV0lMTFBSSU5UOgkJcmV0dXJuIEwiV2lsbFByaW50IjsKLQljYXNlIEpFVF9ET0NfV0lMTFNBVkU6CQlyZXR1cm4gTCJXaWxsU2F2ZSI7Ci0JY2FzZSBKRVRfRVhURVJOQUxfRVhFQzoJCXJldHVybiBMIkV4ZWMiOwotCWNhc2UgSkVUX0ZJRUxEX0ZPQ1VTOgkJCi0JY2FzZSBKRVRfU0NSRUVOX0ZPQ1VTOgkJcmV0dXJuIEwiRm9jdXMiOwotCWNhc2UgSkVUX0ZJRUxEX0JMVVI6CQkKLQljYXNlIEpFVF9TQ1JFRU5fQkxVUjoJCXJldHVybiBMIkJsdXIiOwotCWNhc2UgSkVUX0ZJRUxEX01PVVNFRE9XTjoKLQljYXNlIEpFVF9TQ1JFRU5fTU9VU0VET1dOOglyZXR1cm4gTCJNb3VzZSBEb3duIjsKLQljYXNlIEpFVF9GSUVMRF9NT1VTRVVQOgkJCi0JY2FzZSBKRVRfU0NSRUVOX01PVVNFVVA6CXJldHVybiBMIk1vdXNlIFVwIjsKLQljYXNlIEpFVF9GSUVMRF9NT1VTRUVOVEVSOgotCWNhc2UgSkVUX1NDUkVFTl9NT1VTRUVOVEVSOglyZXR1cm4gTCJNb3VzZSBFbnRlciI7Ci0JY2FzZSBKRVRfRklFTERfTU9VU0VFWElUOgotCWNhc2UgSkVUX1NDUkVFTl9NT1VTRUVYSVQ6CXJldHVybiBMIk1vdXNlIEV4aXQiOwotCWNhc2UgSkVUX0ZJRUxEX0NBTENVTEFURToJcmV0dXJuIEwiQ2FsY3VsYXRlIjsKLQljYXNlIEpFVF9GSUVMRF9GT1JNQVQ6CQlyZXR1cm4gTCJGb3JtYXQiOwotCWNhc2UgSkVUX0ZJRUxEX0tFWVNUUk9LRToJcmV0dXJuIEwiS2V5c3Ryb2tlIjsKLQljYXNlIEpFVF9GSUVMRF9WQUxJREFURToJcmV0dXJuIEwiVmFsaWRhdGUiOwotCWNhc2UgSkVUX0xJTktfTU9VU0VVUDoJCXJldHVybiBMIk1vdXNlIFVwIjsKLQljYXNlIEpFVF9NRU5VX0VYRUM6CQkJcmV0dXJuIEwiRXhlYyI7Ci0JY2FzZSBKRVRfUEFHRV9PUEVOOgkJCi0JY2FzZSBKRVRfU0NSRUVOX09QRU46CQlyZXR1cm4gTCJPcGVuIjsKLQljYXNlIEpFVF9QQUdFX0NMT1NFOgotCWNhc2UgSkVUX1NDUkVFTl9DTE9TRToJCXJldHVybiBMIkNsb3NlIjsKLQljYXNlIEpFVF9TQ1JFRU5fSU5WSUVXOgkKLQljYXNlIEpFVF9QQUdFX0lOVklFVzoJCXJldHVybiBMIkluVmlldyI7Ci0JY2FzZSBKRVRfUEFHRV9PVVRWSUVXOgotCWNhc2UgSkVUX1NDUkVFTl9PVVRWSUVXOglyZXR1cm4gTCJPdXRWaWV3IjsKLQlkZWZhdWx0OgotCQlyZXR1cm4gTCIiOwotCX0KLQotCXJldHVybiBMIiI7CitGWF9CT09MJiBDSlNfRXZlbnRIYW5kbGVyOjpSYygpIHsKKyAgaWYgKG1fcGJSYykgeworICAgIHJldHVybiAqbV9wYlJjOworICB9CisgIHJldHVybiBtX2JSY0R1OwogfQogCi1GWF9MUENXU1RSIENKU19FdmVudEhhbmRsZXI6OlR5cGUoKQotewotCXN3aXRjaCAobV9lRXZlbnRUeXBlKQotCXsKLQljYXNlIEpFVF9BUFBfSU5JVDoJCQlyZXR1cm4gTCJBcHAiOwotCWNhc2UgSkVUX0JBVENIX0VYRUM6CQlyZXR1cm4gTCJCYXRjaCI7Ci0JY2FzZSBKRVRfQk9PS01BUktfTU9VU0VVUDoJcmV0dXJuIEwiQm9va01hcmsiOwkKLQljYXNlIEpFVF9DT05TT0xFX0VYRUM6CQlyZXR1cm4gTCJDb25zb2xlIjsKLQljYXNlIEpFVF9ET0NfRElEUFJJTlQ6Ci0JY2FzZSBKRVRfRE9DX0RJRFNBVkU6Ci0JY2FzZSBKRVRfRE9DX09QRU46Ci0JY2FzZSBKRVRfRE9DX1dJTExDTE9TRToKLQljYXNlIEpFVF9ET0NfV0lMTFBSSU5UOgotCWNhc2UgSkVUX0RPQ19XSUxMU0FWRToJCXJldHVybiBMIkRvYyI7Ci0JY2FzZSBKRVRfRVhURVJOQUxfRVhFQzoJCXJldHVybiBMIkV4dGVybmFsIjsKLQljYXNlIEpFVF9GSUVMRF9CTFVSOgotCWNhc2UgSkVUX0ZJRUxEX0ZPQ1VTOgotCWNhc2UgSkVUX0ZJRUxEX01PVVNFRE9XTjoKLQljYXNlIEpFVF9GSUVMRF9NT1VTRUVOVEVSOgotCWNhc2UgSkVUX0ZJRUxEX01PVVNFRVhJVDoKLQljYXNlIEpFVF9GSUVMRF9NT1VTRVVQOgotCWNhc2UgSkVUX0ZJRUxEX0NBTENVTEFURToKLQljYXNlIEpFVF9GSUVMRF9GT1JNQVQ6Ci0JY2FzZSBKRVRfRklFTERfS0VZU1RST0tFOgotCWNhc2UgSkVUX0ZJRUxEX1ZBTElEQVRFOglyZXR1cm4gTCJGaWVsZCI7Ci0JY2FzZSBKRVRfU0NSRUVOX0ZPQ1VTOgotCWNhc2UgSkVUX1NDUkVFTl9CTFVSOgotCWNhc2UgSkVUX1NDUkVFTl9PUEVOOgotCWNhc2UgSkVUX1NDUkVFTl9DTE9TRToKLQljYXNlIEpFVF9TQ1JFRU5fTU9VU0VET1dOOgotCWNhc2UgSkVUX1NDUkVFTl9NT1VTRVVQOgotCWNhc2UgSkVUX1NDUkVFTl9NT1VTRUVOVEVSOgotCWNhc2UgSkVUX1NDUkVFTl9NT1VTRUVYSVQ6Ci0JY2FzZSBKRVRfU0NSRUVOX0lOVklFVzoKLQljYXNlIEpFVF9TQ1JFRU5fT1VUVklFVzoJcmV0dXJuIEwiU2NyZWVuIjsKLQljYXNlIEpFVF9MSU5LX01PVVNFVVA6CQlyZXR1cm4gTCJMaW5rIjsJCi0JY2FzZSBKRVRfTUVOVV9FWEVDOgkJCXJldHVybiBMIk1lbnUiOwotCWNhc2UgSkVUX1BBR0VfT1BFTjoKLQljYXNlIEpFVF9QQUdFX0NMT1NFOgotCWNhc2UgSkVUX1BBR0VfSU5WSUVXOgotCWNhc2UgSkVUX1BBR0VfT1VUVklFVzpyZXR1cm4gTCJQYWdlIjsKLQlkZWZhdWx0OgotCQlyZXR1cm4gTCIiOwotCX0KLQotCXJldHVybiBMIiI7CitpbnQmIENKU19FdmVudEhhbmRsZXI6OlNlbEVuZCgpIHsKKyAgaWYgKG1fcElTZWxFbmQpIHsKKyAgICByZXR1cm4gKm1fcElTZWxFbmQ7CisgIH0KKyAgcmV0dXJuIG1fblNlbEVuZER1OwogfQogCi1GWF9CT09MJiBDSlNfRXZlbnRIYW5kbGVyOjpSYygpCi17Ci0JaWYgKG1fcGJSYyAhPSBOVUxMKQotCQlyZXR1cm4gKm1fcGJSYzsKLQllbHNlCi0JewkgICAgCi0JCXJldHVybiBtX2JSY0R1OwotCX0KK2ludCYgQ0pTX0V2ZW50SGFuZGxlcjo6U2VsU3RhcnQoKSB7CisgIGlmIChtX3BJU2VsU3RhcnQpIHsKKyAgICByZXR1cm4gKm1fcElTZWxTdGFydDsKKyAgfQorICByZXR1cm4gbV9uU2VsU3RhcnREdTsKIH0KIAotaW50ICYgQ0pTX0V2ZW50SGFuZGxlcjo6U2VsRW5kKCkKLXsKLQlpZiAobV9wSVNlbEVuZCAhPSBOVUxMKQotCXsKLQkJcmV0dXJuICptX3BJU2VsRW5kOwotCX0KLQllbHNlCi0JewotCQlyZXR1cm4gbV9uU2VsRW5kRHU7Ci0JfQorRlhfQk9PTCBDSlNfRXZlbnRIYW5kbGVyOjpTaGlmdCgpIHsKKyAgcmV0dXJuIG1fYlNoaWZ0OwogfQogCi1pbnQgJiBDSlNfRXZlbnRIYW5kbGVyOjpTZWxTdGFydCgpCi17Ci0JaWYgKG1fcElTZWxTdGFydCAhPSBOVUxMKQotCQlyZXR1cm4gKiBtX3BJU2VsU3RhcnQ7Ci0JZWxzZQotCXsKLQkJcmV0dXJuIG1fblNlbFN0YXJ0RHU7Ci0JfQorRmllbGQqIENKU19FdmVudEhhbmRsZXI6OlNvdXJjZSgpIHsKKyAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gbV9wSlNDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBEb2NPYmogPSBGWEpTX05ld0Z4RHluYW1pY09iaigKKyAgICAgIHBSdW50aW1lLT5HZXRJc29sYXRlKCksIHBSdW50aW1lLCBDSlNfRG9jdW1lbnQ6Omdfbk9iakRlZm5JRCk7CisgIEFTU0VSVCghcERvY09iai5Jc0VtcHR5KCkpOworCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwRmllbGRPYmogPSBGWEpTX05ld0Z4RHluYW1pY09iaigKKyAgICAgIHBSdW50aW1lLT5HZXRJc29sYXRlKCksIHBSdW50aW1lLCBDSlNfRmllbGQ6Omdfbk9iakRlZm5JRCk7CisgIEFTU0VSVCghcEZpZWxkT2JqLklzRW1wdHkoKSk7CisKKyAgQ0pTX0RvY3VtZW50KiBwSlNEb2N1bWVudCA9CisgICAgICAoQ0pTX0RvY3VtZW50KilGWEpTX0dldFByaXZhdGUocFJ1bnRpbWUtPkdldElzb2xhdGUoKSwgcERvY09iaik7CisgIERvY3VtZW50KiBwRG9jdW1lbnQgPSAoRG9jdW1lbnQqKXBKU0RvY3VtZW50LT5HZXRFbWJlZE9iamVjdCgpOworICBwRG9jdW1lbnQtPkF0dGFjaERvYyhtX3BUYXJnZXREb2MgPyBtX3BUYXJnZXREb2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbV9wSlNDb250ZXh0LT5HZXRSZWFkZXJEb2N1bWVudCgpKTsKKworICBDSlNfRmllbGQqIHBKU0ZpZWxkID0KKyAgICAgIChDSlNfRmllbGQqKUZYSlNfR2V0UHJpdmF0ZShwUnVudGltZS0+R2V0SXNvbGF0ZSgpLCBwRmllbGRPYmopOworICBGaWVsZCogcEZpZWxkID0gKEZpZWxkKilwSlNGaWVsZC0+R2V0RW1iZWRPYmplY3QoKTsKKyAgcEZpZWxkLT5BdHRhY2hGaWVsZChwRG9jdW1lbnQsIG1fc3RyU291cmNlTmFtZSk7CisgIHJldHVybiBwRmllbGQ7CiB9CiAKLUZYX0JPT0wgQ0pTX0V2ZW50SGFuZGxlcjo6U2hpZnQoKQotewotCXJldHVybiBtX2JTaGlmdDsKK0ZpZWxkKiBDSlNfRXZlbnRIYW5kbGVyOjpUYXJnZXRfRmllbGQoKSB7CisgIENKU19SdW50aW1lKiBwUnVudGltZSA9IG1fcEpTQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwRG9jT2JqID0gRlhKU19OZXdGeER5bmFtaWNPYmooCisgICAgICBwUnVudGltZS0+R2V0SXNvbGF0ZSgpLCBwUnVudGltZSwgQ0pTX0RvY3VtZW50OjpnX25PYmpEZWZuSUQpOworICBBU1NFUlQoIXBEb2NPYmouSXNFbXB0eSgpKTsKKworICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcEZpZWxkT2JqID0gRlhKU19OZXdGeER5bmFtaWNPYmooCisgICAgICBwUnVudGltZS0+R2V0SXNvbGF0ZSgpLCBwUnVudGltZSwgQ0pTX0ZpZWxkOjpnX25PYmpEZWZuSUQpOworICBBU1NFUlQoIXBGaWVsZE9iai5Jc0VtcHR5KCkpOworCisgIENKU19Eb2N1bWVudCogcEpTRG9jdW1lbnQgPQorICAgICAgKENKU19Eb2N1bWVudCopRlhKU19HZXRQcml2YXRlKHBSdW50aW1lLT5HZXRJc29sYXRlKCksIHBEb2NPYmopOworICBEb2N1bWVudCogcERvY3VtZW50ID0gKERvY3VtZW50KilwSlNEb2N1bWVudC0+R2V0RW1iZWRPYmplY3QoKTsKKyAgcERvY3VtZW50LT5BdHRhY2hEb2MobV9wVGFyZ2V0RG9jID8gbV9wVGFyZ2V0RG9jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1fcEpTQ29udGV4dC0+R2V0UmVhZGVyRG9jdW1lbnQoKSk7CisKKyAgQ0pTX0ZpZWxkKiBwSlNGaWVsZCA9CisgICAgICAoQ0pTX0ZpZWxkKilGWEpTX0dldFByaXZhdGUocFJ1bnRpbWUtPkdldElzb2xhdGUoKSwgcEZpZWxkT2JqKTsKKyAgRmllbGQqIHBGaWVsZCA9IChGaWVsZCopcEpTRmllbGQtPkdldEVtYmVkT2JqZWN0KCk7CisgIHBGaWVsZC0+QXR0YWNoRmllbGQocERvY3VtZW50LCBtX3N0clRhcmdldE5hbWUpOworICByZXR1cm4gcEZpZWxkOwogfQogCi1GaWVsZCogQ0pTX0V2ZW50SGFuZGxlcjo6U291cmNlKCkKLXsKLQlBU1NFUlQobV9wSlNDb250ZXh0ICE9IE5VTEwpOwotCi0JQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gbV9wSlNDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKLQotCUpTRlhPYmplY3QgIHBEb2NPYmogPSBKU19OZXdGeER5bmFtaWNPYmooKnBSdW50aW1lLCBtX3BKU0NvbnRleHQsIEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiRG9jdW1lbnQiKSk7Ci0JQVNTRVJUKHBEb2NPYmouSXNFbXB0eSgpID09IEZBTFNFKTsKLQlKU0ZYT2JqZWN0ICBwRmllbGRPYmogPSBKU19OZXdGeER5bmFtaWNPYmooKnBSdW50aW1lLCBtX3BKU0NvbnRleHQsIEpTX0dldE9iakRlZm5JRCgqcFJ1bnRpbWUsIEwiRmllbGQiKSk7Ci0JQVNTRVJUKHBGaWVsZE9iai5Jc0VtcHR5KCkgPT0gRkFMU0UpOwotCi0JQ0pTX0RvY3VtZW50KiBwSlNEb2N1bWVudCA9IChDSlNfRG9jdW1lbnQqKUpTX0dldFByaXZhdGUocERvY09iaik7Ci0JQVNTRVJUKHBKU0RvY3VtZW50ICE9IE5VTEwpOwotCURvY3VtZW50KiBwRG9jdW1lbnQgPSAoRG9jdW1lbnQqKXBKU0RvY3VtZW50LT5HZXRFbWJlZE9iamVjdCgpOwotCUFTU0VSVChwRG9jdW1lbnQgIT0gTlVMTCk7Ci0gCWlmIChtX3BUYXJnZXREb2MgIT0gTlVMTCkKLSAJCXBEb2N1bWVudC0+QXR0YWNoRG9jKG1fcFRhcmdldERvYyk7Ci0gCWVsc2UKLSAJCXBEb2N1bWVudC0+QXR0YWNoRG9jKG1fcEpTQ29udGV4dC0+R2V0UmVhZGVyRG9jdW1lbnQoKSk7Ci0JCi0JLy9pZiAobV9wU291cmNlRmllbGQgPT0gTlVMTCkKLQkvLwlyZXR1cm4gTlVMTDsKLQkvL0NSQU9fV2lkZ2V0ICpwV2lkZ2V0ID0gSUJDTF9XaWRnZXQ6OkdldFdpZGdldChtX3BTb3VyY2VGaWVsZCk7Ci0JLy9DUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IHBXaWRnZXQtPkdldEZvcm1GaWVsZCgpOwotCS8vQVNTRVJUKHBGb3JtRmllbGQpOwotCS8vQ0ZYX1dpZGVTdHJpbmcgY3NGaWVsZE5hbWUgPSBwRm9ybUZpZWxkLT5HZXRGdWxsTmFtZSgpOwotCUNKU19GaWVsZCAqIHBKU0ZpZWxkID0gKENKU19GaWVsZCopSlNfR2V0UHJpdmF0ZShwRmllbGRPYmopOwotCUFTU0VSVChwSlNGaWVsZCAhPSBOVUxMKTsKLQlGaWVsZCAqIHBGaWVsZCA9IChGaWVsZCAqKXBKU0ZpZWxkLT5HZXRFbWJlZE9iamVjdCgpOyAKLQlBU1NFUlQocEZpZWxkICE9IE5VTEwpOwotCXBGaWVsZC0+QXR0YWNoRmllbGQocERvY3VtZW50LCBtX3N0clNvdXJjZU5hbWUpOwotCXJldHVybiBwRmllbGQ7CQorQ0ZYX1dpZGVTdHJpbmcmIENKU19FdmVudEhhbmRsZXI6OlZhbHVlKCkgeworICByZXR1cm4gKm1fcFZhbHVlOwogfQogCi1GaWVsZCogQ0pTX0V2ZW50SGFuZGxlcjo6VGFyZ2V0X0ZpZWxkKCkKLXsKLQlBU1NFUlQobV9wSlNDb250ZXh0ICE9IE5VTEwpOwotCi0JQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gbV9wSlNDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKLQotCUpTRlhPYmplY3QgcERvY09iaiA9IEpTX05ld0Z4RHluYW1pY09iaigqcFJ1bnRpbWUsIG1fcEpTQ29udGV4dCwgSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSwgTCJEb2N1bWVudCIpKTsKLQlBU1NFUlQocERvY09iai5Jc0VtcHR5KCkgPT0gRkFMU0UpOwotCUpTRlhPYmplY3QgcEZpZWxkT2JqID0gSlNfTmV3RnhEeW5hbWljT2JqKCpwUnVudGltZSwgbV9wSlNDb250ZXh0LCBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIkZpZWxkIikpOwotCUFTU0VSVChwRmllbGRPYmouSXNFbXB0eSgpID09IEZBTFNFKTsKLQotCUNKU19Eb2N1bWVudCogcEpTRG9jdW1lbnQgPSAoQ0pTX0RvY3VtZW50KilKU19HZXRQcml2YXRlKHBEb2NPYmopOwotCUFTU0VSVChwSlNEb2N1bWVudCAhPSBOVUxMKTsKLQlEb2N1bWVudCogcERvY3VtZW50ID0gKERvY3VtZW50KilwSlNEb2N1bWVudC0+R2V0RW1iZWRPYmplY3QoKTsKLSAJQVNTRVJUKHBEb2N1bWVudCAhPSBOVUxMKTsKLSAJaWYgKG1fcFRhcmdldERvYyAhPSBOVUxMKQotIAkJcERvY3VtZW50LT5BdHRhY2hEb2MobV9wVGFyZ2V0RG9jKTsKLSAJZWxzZQotIAkJcERvY3VtZW50LT5BdHRhY2hEb2MobV9wSlNDb250ZXh0LT5HZXRSZWFkZXJEb2N1bWVudCgpKTsKLQkKLQlDSlNfRmllbGQqIHBKU0ZpZWxkID0gKENKU19GaWVsZCopSlNfR2V0UHJpdmF0ZShwRmllbGRPYmopOwotCUFTU0VSVChwSlNGaWVsZCAhPSBOVUxMKTsKLQotCUZpZWxkKiBwRmllbGQgPSAoRmllbGQgKilwSlNGaWVsZC0+R2V0RW1iZWRPYmplY3QoKTsgCi0JQVNTRVJUKHBGaWVsZCAhPSBOVUxMKTsKLQotCXBGaWVsZC0+QXR0YWNoRmllbGQocERvY3VtZW50LCBtX3N0clRhcmdldE5hbWUpOwotCXJldHVybiBwRmllbGQ7CQorRlhfQk9PTCBDSlNfRXZlbnRIYW5kbGVyOjpXaWxsQ29tbWl0KCkgeworICByZXR1cm4gbV9iV2lsbENvbW1pdDsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcmIENKU19FdmVudEhhbmRsZXI6OlZhbHVlKCkKLXsKLQlyZXR1cm4gKm1fcFZhbHVlOworQ0ZYX1dpZGVTdHJpbmcgQ0pTX0V2ZW50SGFuZGxlcjo6VGFyZ2V0TmFtZSgpIHsKKyAgcmV0dXJuIG1fc3RyVGFyZ2V0TmFtZTsKIH0KLQotRlhfQk9PTCBDSlNfRXZlbnRIYW5kbGVyOjpXaWxsQ29tbWl0KCkKLXsKLQlyZXR1cm4gbV9iV2lsbENvbW1pdDsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ0pTX0V2ZW50SGFuZGxlcjo6VGFyZ2V0TmFtZSgpCi17Ci0JcmV0dXJuIG1fc3RyVGFyZ2V0TmFtZTsKLX0KLQotCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWYxOWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuaApAQCAtMCwwICsxLDIyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZQREZTREtfU1JDX0pBVkFTQ1JJUFRfSlNfRVZFTlRIQU5ETEVSX0hfCisjZGVmaW5lIEZQREZTREtfU1JDX0pBVkFTQ1JJUFRfSlNfRVZFTlRIQU5ETEVSX0hfCisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorCitjbGFzcyBDSlNfQ29udGV4dDsKK2NsYXNzIENQREZTREtfQW5ub3Q7CitjbGFzcyBDUERGU0RLX0RvY3VtZW50OworY2xhc3MgQ1BERl9Cb29rbWFyazsKK2NsYXNzIENQREZfRm9ybUZpZWxkOworY2xhc3MgRmllbGQ7CisKK2VudW0gSlNfRVZFTlRfVCB7CisgIEpFVF9VTktOT1dOLAorICBKRVRfQVBQX0lOSVQsCisgIEpFVF9ET0NfT1BFTiwKKyAgSkVUX0RPQ19XSUxMUFJJTlQsCisgIEpFVF9ET0NfRElEUFJJTlQsCisgIEpFVF9ET0NfV0lMTFNBVkUsCisgIEpFVF9ET0NfRElEU0FWRSwKKyAgSkVUX0RPQ19XSUxMQ0xPU0UsCisgIEpFVF9QQUdFX09QRU4sCisgIEpFVF9QQUdFX0NMT1NFLAorICBKRVRfUEFHRV9JTlZJRVcsCisgIEpFVF9QQUdFX09VVFZJRVcsCisgIEpFVF9GSUVMRF9NT1VTRURPV04sCisgIEpFVF9GSUVMRF9NT1VTRVVQLAorICBKRVRfRklFTERfTU9VU0VFTlRFUiwKKyAgSkVUX0ZJRUxEX01PVVNFRVhJVCwKKyAgSkVUX0ZJRUxEX0ZPQ1VTLAorICBKRVRfRklFTERfQkxVUiwKKyAgSkVUX0ZJRUxEX0tFWVNUUk9LRSwKKyAgSkVUX0ZJRUxEX1ZBTElEQVRFLAorICBKRVRfRklFTERfQ0FMQ1VMQVRFLAorICBKRVRfRklFTERfRk9STUFULAorICBKRVRfU0NSRUVOX0ZPQ1VTLAorICBKRVRfU0NSRUVOX0JMVVIsCisgIEpFVF9TQ1JFRU5fT1BFTiwKKyAgSkVUX1NDUkVFTl9DTE9TRSwKKyAgSkVUX1NDUkVFTl9NT1VTRURPV04sCisgIEpFVF9TQ1JFRU5fTU9VU0VVUCwKKyAgSkVUX1NDUkVFTl9NT1VTRUVOVEVSLAorICBKRVRfU0NSRUVOX01PVVNFRVhJVCwKKyAgSkVUX1NDUkVFTl9JTlZJRVcsCisgIEpFVF9TQ1JFRU5fT1VUVklFVywKKyAgSkVUX0JBVENIX0VYRUMsCisgIEpFVF9NRU5VX0VYRUMsCisgIEpFVF9DT05TT0xFX0VYRUMsCisgIEpFVF9FWFRFUk5BTF9FWEVDLAorICBKRVRfQk9PS01BUktfTU9VU0VVUCwKKyAgSkVUX0xJTktfTU9VU0VVUAorfTsKKworY2xhc3MgQ0pTX0V2ZW50SGFuZGxlciB7CisgcHVibGljOgorICBDSlNfRXZlbnRIYW5kbGVyKENKU19Db250ZXh0KiBwQ29udGV4dCk7CisgIHZpcnR1YWwgfkNKU19FdmVudEhhbmRsZXIoKTsKKworICB2b2lkIE9uQXBwX0luaXQoKTsKKworICB2b2lkIE9uRG9jX09wZW4oQ1BERlNES19Eb2N1bWVudCogcERvYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0clRhcmdldE5hbWUpOworICB2b2lkIE9uRG9jX1dpbGxQcmludChDUERGU0RLX0RvY3VtZW50KiBwRG9jKTsKKyAgdm9pZCBPbkRvY19EaWRQcmludChDUERGU0RLX0RvY3VtZW50KiBwRG9jKTsKKyAgdm9pZCBPbkRvY19XaWxsU2F2ZShDUERGU0RLX0RvY3VtZW50KiBwRG9jKTsKKyAgdm9pZCBPbkRvY19EaWRTYXZlKENQREZTREtfRG9jdW1lbnQqIHBEb2MpOworICB2b2lkIE9uRG9jX1dpbGxDbG9zZShDUERGU0RLX0RvY3VtZW50KiBwRG9jKTsKKworICB2b2lkIE9uUGFnZV9PcGVuKENQREZTREtfRG9jdW1lbnQqIHBEb2MpOworICB2b2lkIE9uUGFnZV9DbG9zZShDUERGU0RLX0RvY3VtZW50KiBwRG9jKTsKKyAgdm9pZCBPblBhZ2VfSW5WaWV3KENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpOworICB2b2lkIE9uUGFnZV9PdXRWaWV3KENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpOworCisgIHZvaWQgT25GaWVsZF9DYWxjdWxhdGUoQ1BERl9Gb3JtRmllbGQqIHBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSYyk7CisgIHZvaWQgT25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYldpbGxDb21taXQpOworICB2b2lkIE9uRmllbGRfS2V5c3Ryb2tlKENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgS2V5RG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5TZWxFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBuU2VsU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYldpbGxDb21taXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmllbGRGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSYyk7CisgIHZvaWQgT25GaWVsZF9WYWxpZGF0ZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiS2V5RG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSYyk7CisKKyAgdm9pZCBPbkZpZWxkX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCk7CisgIHZvaWQgT25GaWVsZF9Nb3VzZUVudGVyKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpOworICB2b2lkIE9uRmllbGRfTW91c2VFeGl0KEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KTsKKyAgdm9pZCBPbkZpZWxkX01vdXNlVXAoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCk7CisgIHZvaWQgT25GaWVsZF9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSk7CisgIHZvaWQgT25GaWVsZF9Gb2N1cyhGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpOworCisgIHZvaWQgT25TY3JlZW5fRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisgIHZvaWQgT25TY3JlZW5fQmx1cihGWF9CT09MIGJNb2RpZmllciwgRlhfQk9PTCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworICB2b2lkIE9uU2NyZWVuX09wZW4oRlhfQk9PTCBiTW9kaWZpZXIsIEZYX0JPT0wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKyAgdm9pZCBPblNjcmVlbl9DbG9zZShGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKyAgdm9pZCBPblNjcmVlbl9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKyAgdm9pZCBPblNjcmVlbl9Nb3VzZVVwKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKyAgdm9pZCBPblNjcmVlbl9Nb3VzZUVudGVyKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKyAgdm9pZCBPblNjcmVlbl9Nb3VzZUV4aXQoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKyAgdm9pZCBPblNjcmVlbl9JblZpZXcoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKyAgdm9pZCBPblNjcmVlbl9PdXRWaWV3KEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKworICB2b2lkIE9uQm9va21hcmtfTW91c2VVcChDUERGX0Jvb2ttYXJrKiBwQm9va01hcmspOworICB2b2lkIE9uTGlua19Nb3VzZVVwKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpOworCisgIHZvaWQgT25NZW51X0V4ZWMoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyVGFyZ2V0TmFtZSk7CisgIHZvaWQgT25CYXRjaEV4ZWMoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCk7CisgIHZvaWQgT25Db25zb2xlX0V4ZWMoKTsKKyAgdm9pZCBPbkV4dGVybmFsX0V4ZWMoKTsKKworIHB1YmxpYzoKKyAgdm9pZCBJbml0aWFsKEpTX0VWRU5UX1QgdHlwZSk7CisgIHZvaWQgRGVzdHJveSgpOworICBGWF9CT09MIElzVmFsaWQoKTsKKworICBDRlhfV2lkZVN0cmluZyYgQ2hhbmdlKCk7CisgIENGWF9XaWRlU3RyaW5nIENoYW5nZUV4KCk7CisgIGludCBDb21taXRLZXkoKTsKKyAgRlhfQk9PTCBGaWVsZEZ1bGwoKTsKKyAgRlhfQk9PTCBLZXlEb3duKCk7CisgIEZYX0JPT0wgTW9kaWZpZXIoKTsKKyAgY29uc3QgRlhfV0NIQVIqIE5hbWUoKTsKKyAgY29uc3QgRlhfV0NIQVIqIFR5cGUoKTsKKyAgRlhfQk9PTCYgUmMoKTsKKyAgaW50JiBTZWxFbmQoKTsKKyAgaW50JiBTZWxTdGFydCgpOworICBGWF9CT09MIFNoaWZ0KCk7CisgIEZpZWxkKiBTb3VyY2UoKTsKKyAgRmllbGQqIFRhcmdldF9GaWVsZCgpOworICBDRlhfV2lkZVN0cmluZyYgVmFsdWUoKTsKKyAgRlhfQk9PTCBXaWxsQ29tbWl0KCk7CisgIENGWF9XaWRlU3RyaW5nIFRhcmdldE5hbWUoKTsKKworICBKU19FVkVOVF9UIEV2ZW50VHlwZSgpIHsgcmV0dXJuIG1fZUV2ZW50VHlwZTsgfQorCisgcHVibGljOgorICBDSlNfQ29udGV4dCogbV9wSlNDb250ZXh0OworICBKU19FVkVOVF9UIG1fZUV2ZW50VHlwZTsKKyAgRlhfQk9PTCBtX2JWYWxpZDsKKworICBDRlhfV2lkZVN0cmluZyBtX3N0clRhcmdldE5hbWU7CisgIENGWF9XaWRlU3RyaW5nIG1fc3RyU291cmNlTmFtZTsKKyAgQ0ZYX1dpZGVTdHJpbmcqIG1fcFdpZGVTdHJDaGFuZ2U7CisgIENGWF9XaWRlU3RyaW5nIG1fV2lkZVN0ckNoYW5nZUR1OworICBDRlhfV2lkZVN0cmluZyBtX1dpZGVTdHJDaGFuZ2VFeDsKKyAgaW50IG1fbkNvbW1pdEtleTsKKyAgRlhfQk9PTCBtX2JLZXlEb3duOworICBGWF9CT09MIG1fYk1vZGlmaWVyOworICBGWF9CT09MIG1fYlNoaWZ0OworICBpbnQqIG1fcElTZWxFbmQ7CisgIGludCBtX25TZWxFbmREdTsKKyAgaW50KiBtX3BJU2VsU3RhcnQ7CisgIGludCBtX25TZWxTdGFydER1OworICBGWF9CT09MIG1fYldpbGxDb21taXQ7CisgIENGWF9XaWRlU3RyaW5nKiBtX3BWYWx1ZTsKKyAgRlhfQk9PTCBtX2JGaWVsZEZ1bGw7CisgIEZYX0JPT0wqIG1fcGJSYzsKKyAgRlhfQk9PTCBtX2JSY0R1OworCisgIENQREZTREtfRG9jdW1lbnQqIG1fcFNvdXJjZURvYzsKKyAgQ1BERl9Cb29rbWFyayogbV9wVGFyZ2V0Qm9va01hcms7CisgIENQREZTREtfRG9jdW1lbnQqIG1fcFRhcmdldERvYzsKKyAgQ1BERlNES19Bbm5vdCogbV9wVGFyZ2V0QW5ub3Q7Cit9OworCisjZW5kaWYgIC8vIEZQREZTREtfU1JDX0pBVkFTQ1JJUFRfSlNfRVZFTlRIQU5ETEVSX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19HbG9iYWxEYXRhLmNwcAppbmRleCBiNGU0YTViLi40ZDZlZGM4IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfR2xvYmFsRGF0YS5jcHAKQEAgLTEsNTgwICsxLDQ5MCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0phdmFTY3JpcHQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfR2xvYmFsRGF0YS5oIgorI2luY2x1ZGUgIkpTX0dsb2JhbERhdGEuaCIKIAotI2RlZmluZSBKU19NQVhHTE9CQUxEQVRBCQkJKDEwMjQgKiA0IC0gOCkKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZmRybS9meF9jcnlwdC5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiCisKKyNkZWZpbmUgSlNfTUFYR0xPQkFMREFUQSAoMTAyNCAqIDQgLSA4KQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUNKU19HbG9iYWxWYXJpYWJsZUFycmF5OjpDSlNfR2xvYmFsVmFyaWFibGVBcnJheSgpCi17CitDSlNfR2xvYmFsVmFyaWFibGVBcnJheTo6Q0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkoKSB7fQorCitDSlNfR2xvYmFsVmFyaWFibGVBcnJheTo6fkNKU19HbG9iYWxWYXJpYWJsZUFycmF5KCkgeworICBFbXB0eSgpOwogfQogCi1DSlNfR2xvYmFsVmFyaWFibGVBcnJheTo6fkNKU19HbG9iYWxWYXJpYWJsZUFycmF5KCkKLXsKLQlFbXB0eSgpOwordm9pZCBDSlNfR2xvYmFsVmFyaWFibGVBcnJheTo6Q29weShjb25zdCBDSlNfR2xvYmFsVmFyaWFibGVBcnJheSYgYXJyYXkpIHsKKyAgRW1wdHkoKTsKKyAgZm9yIChpbnQgaSA9IDAsIHN6ID0gYXJyYXkuQ291bnQoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBDSlNfS2V5VmFsdWUqIHBPbGRPYmpEYXRhID0gYXJyYXkuR2V0QXQoaSk7CisgICAgc3dpdGNoIChwT2xkT2JqRGF0YS0+blR5cGUpIHsKKyAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX05VTUJFUjogeworICAgICAgICBDSlNfS2V5VmFsdWUqIHBOZXdPYmpEYXRhID0gbmV3IENKU19LZXlWYWx1ZTsKKyAgICAgICAgcE5ld09iakRhdGEtPnNLZXkgPSBwT2xkT2JqRGF0YS0+c0tleTsKKyAgICAgICAgcE5ld09iakRhdGEtPm5UeXBlID0gcE9sZE9iakRhdGEtPm5UeXBlOworICAgICAgICBwTmV3T2JqRGF0YS0+ZERhdGEgPSBwT2xkT2JqRGF0YS0+ZERhdGE7CisgICAgICAgIEFkZChwTmV3T2JqRGF0YSk7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfQk9PTEVBTjogeworICAgICAgICBDSlNfS2V5VmFsdWUqIHBOZXdPYmpEYXRhID0gbmV3IENKU19LZXlWYWx1ZTsKKyAgICAgICAgcE5ld09iakRhdGEtPnNLZXkgPSBwT2xkT2JqRGF0YS0+c0tleTsKKyAgICAgICAgcE5ld09iakRhdGEtPm5UeXBlID0gcE9sZE9iakRhdGEtPm5UeXBlOworICAgICAgICBwTmV3T2JqRGF0YS0+YkRhdGEgPSBwT2xkT2JqRGF0YS0+YkRhdGE7CisgICAgICAgIEFkZChwTmV3T2JqRGF0YSk7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HOiB7CisgICAgICAgIENKU19LZXlWYWx1ZSogcE5ld09iakRhdGEgPSBuZXcgQ0pTX0tleVZhbHVlOworICAgICAgICBwTmV3T2JqRGF0YS0+c0tleSA9IHBPbGRPYmpEYXRhLT5zS2V5OworICAgICAgICBwTmV3T2JqRGF0YS0+blR5cGUgPSBwT2xkT2JqRGF0YS0+blR5cGU7CisgICAgICAgIHBOZXdPYmpEYXRhLT5zRGF0YSA9IHBPbGRPYmpEYXRhLT5zRGF0YTsKKyAgICAgICAgQWRkKHBOZXdPYmpEYXRhKTsKKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9PQkpFQ1Q6IHsKKyAgICAgICAgQ0pTX0tleVZhbHVlKiBwTmV3T2JqRGF0YSA9IG5ldyBDSlNfS2V5VmFsdWU7CisgICAgICAgIHBOZXdPYmpEYXRhLT5zS2V5ID0gcE9sZE9iakRhdGEtPnNLZXk7CisgICAgICAgIHBOZXdPYmpEYXRhLT5uVHlwZSA9IHBPbGRPYmpEYXRhLT5uVHlwZTsKKyAgICAgICAgcE5ld09iakRhdGEtPm9iakRhdGEuQ29weShwT2xkT2JqRGF0YS0+b2JqRGF0YSk7CisgICAgICAgIEFkZChwTmV3T2JqRGF0YSk7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTDogeworICAgICAgICBDSlNfS2V5VmFsdWUqIHBOZXdPYmpEYXRhID0gbmV3IENKU19LZXlWYWx1ZTsKKyAgICAgICAgcE5ld09iakRhdGEtPnNLZXkgPSBwT2xkT2JqRGF0YS0+c0tleTsKKyAgICAgICAgcE5ld09iakRhdGEtPm5UeXBlID0gcE9sZE9iakRhdGEtPm5UeXBlOworICAgICAgICBBZGQocE5ld09iakRhdGEpOworICAgICAgfSBicmVhazsKKyAgICB9CisgIH0KIH0KIAotdm9pZCBDSlNfR2xvYmFsVmFyaWFibGVBcnJheTo6Q29weShjb25zdCBDSlNfR2xvYmFsVmFyaWFibGVBcnJheSYgYXJyYXkpCi17Ci0JRW1wdHkoKTsKLQlmb3IgKGludCBpPTAsc3o9YXJyYXkuQ291bnQoKTsgaTxzejsgaSsrKQotCXsKLQkJQ0pTX0tleVZhbHVlKiBwT2xkT2JqRGF0YSA9IGFycmF5LkdldEF0KGkpOwotCQlBU1NFUlQocE9sZE9iakRhdGEgIT0gTlVMTCk7Ci0KLQkJc3dpdGNoIChwT2xkT2JqRGF0YS0+blR5cGUpCi0JCXsKLQkJY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSOgotCQkJewotCQkJCUNKU19LZXlWYWx1ZSogcE5ld09iakRhdGEgPSBuZXcgQ0pTX0tleVZhbHVlOwotCQkJCXBOZXdPYmpEYXRhLT5zS2V5ID0gcE9sZE9iakRhdGEtPnNLZXk7Ci0JCQkJcE5ld09iakRhdGEtPm5UeXBlID0gcE9sZE9iakRhdGEtPm5UeXBlOwotCQkJCXBOZXdPYmpEYXRhLT5kRGF0YSA9IHBPbGRPYmpEYXRhLT5kRGF0YTsKLQkJCQlBZGQocE5ld09iakRhdGEpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU46Ci0JCQl7Ci0JCQkJQ0pTX0tleVZhbHVlKiBwTmV3T2JqRGF0YSA9IG5ldyBDSlNfS2V5VmFsdWU7Ci0JCQkJcE5ld09iakRhdGEtPnNLZXkgPSBwT2xkT2JqRGF0YS0+c0tleTsKLQkJCQlwTmV3T2JqRGF0YS0+blR5cGUgPSBwT2xkT2JqRGF0YS0+blR5cGU7Ci0JCQkJcE5ld09iakRhdGEtPmJEYXRhID0gcE9sZE9iakRhdGEtPmJEYXRhOwotCQkJCUFkZChwTmV3T2JqRGF0YSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HOgotCQkJewotCQkJCUNKU19LZXlWYWx1ZSogcE5ld09iakRhdGEgPSBuZXcgQ0pTX0tleVZhbHVlOwotCQkJCXBOZXdPYmpEYXRhLT5zS2V5ID0gcE9sZE9iakRhdGEtPnNLZXk7Ci0JCQkJcE5ld09iakRhdGEtPm5UeXBlID0gcE9sZE9iakRhdGEtPm5UeXBlOwotCQkJCXBOZXdPYmpEYXRhLT5zRGF0YSA9IHBPbGRPYmpEYXRhLT5zRGF0YTsKLQkJCQlBZGQocE5ld09iakRhdGEpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVDoKLQkJCXsKLQkJCQlDSlNfS2V5VmFsdWUqIHBOZXdPYmpEYXRhID0gbmV3IENKU19LZXlWYWx1ZTsKLQkJCQlwTmV3T2JqRGF0YS0+c0tleSA9IHBPbGRPYmpEYXRhLT5zS2V5OwotCQkJCXBOZXdPYmpEYXRhLT5uVHlwZSA9IHBPbGRPYmpEYXRhLT5uVHlwZTsKLQkJCQlwTmV3T2JqRGF0YS0+b2JqRGF0YS5Db3B5KHBPbGRPYmpEYXRhLT5vYmpEYXRhKTsKLQkJCQlBZGQocE5ld09iakRhdGEpOwotCQkJfQotCQljYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVUxMOgotCQkJewotCQkJCUNKU19LZXlWYWx1ZSogcE5ld09iakRhdGEgPSBuZXcgQ0pTX0tleVZhbHVlOwotCQkJCXBOZXdPYmpEYXRhLT5zS2V5ID0gcE9sZE9iakRhdGEtPnNLZXk7Ci0JCQkJcE5ld09iakRhdGEtPm5UeXBlID0gcE9sZE9iakRhdGEtPm5UeXBlOwotCQkJCUFkZChwTmV3T2JqRGF0YSk7Ci0JCQl9Ci0JCX0KLQl9Cit2b2lkIENKU19HbG9iYWxWYXJpYWJsZUFycmF5OjpBZGQoQ0pTX0tleVZhbHVlKiBwKSB7CisgIGFycmF5LkFkZChwKTsKIH0KIAotdm9pZCBDSlNfR2xvYmFsVmFyaWFibGVBcnJheTo6QWRkKENKU19LZXlWYWx1ZSogcCkKLXsKLQlhcnJheS5BZGQocCk7CitpbnQgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXk6OkNvdW50KCkgY29uc3QgeworICByZXR1cm4gYXJyYXkuR2V0U2l6ZSgpOwogfQogCi1pbnQgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXk6OkNvdW50KCkgY29uc3QKLXsKLQlyZXR1cm4gYXJyYXkuR2V0U2l6ZSgpOworQ0pTX0tleVZhbHVlKiBDSlNfR2xvYmFsVmFyaWFibGVBcnJheTo6R2V0QXQoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBhcnJheS5HZXRBdChpbmRleCk7CiB9CiAKLUNKU19LZXlWYWx1ZSogQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXk6OkdldEF0KGludCBpbmRleCkgY29uc3QKLXsKLQlyZXR1cm4gYXJyYXkuR2V0QXQoaW5kZXgpOwotfQotCi12b2lkIENKU19HbG9iYWxWYXJpYWJsZUFycmF5OjpFbXB0eSgpCi17Ci0JZm9yIChpbnQgaT0wLHN6PWFycmF5LkdldFNpemUoKTsgaTxzejsgaSsrKQotCQlkZWxldGUgYXJyYXkuR2V0QXQoaSk7Ci0JYXJyYXkuUmVtb3ZlQWxsKCk7Cit2b2lkIENKU19HbG9iYWxWYXJpYWJsZUFycmF5OjpFbXB0eSgpIHsKKyAgZm9yIChpbnQgaSA9IDAsIHN6ID0gYXJyYXkuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKKyAgICBkZWxldGUgYXJyYXkuR2V0QXQoaSk7CisgIGFycmF5LlJlbW92ZUFsbCgpOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDSlNfR2xvYmFsRGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jZGVmaW5lIFJFQURFUl9KU19HTE9CQUxEQVRBX0ZJTEVOQU1FCQkJCUwiUmVhZGVyX0pzR2xvYmFsLkRhdGEiCi0jZGVmaW5lIFBIQU5UT01fSlNfR0xPQkFMREFUQV9GSUxFTkFNRQkJCQlMIlBoYW50b21fSnNHbG9iYWwuRGF0YSIKLSNkZWZpbmUgU0RLX0pTX0dMT0JBTERBVEFfRklMRU5BTUUJCQkJCUwiU0RLX0pzR2xvYmFsLkRhdGEiCisjZGVmaW5lIFJFQURFUl9KU19HTE9CQUxEQVRBX0ZJTEVOQU1FIEwiUmVhZGVyX0pzR2xvYmFsLkRhdGEiCisjZGVmaW5lIFBIQU5UT01fSlNfR0xPQkFMREFUQV9GSUxFTkFNRSBMIlBoYW50b21fSnNHbG9iYWwuRGF0YSIKKyNkZWZpbmUgU0RLX0pTX0dMT0JBTERBVEFfRklMRU5BTUUgTCJTREtfSnNHbG9iYWwuRGF0YSIKIAotc3RhdGljIGNvbnN0IEZYX0JZVEUgSlNfUkM0S0VZW10gPSB7MHgxOSwweGE4LDB4ZTgsMHgwMSwweGY2LDB4YTgsMHhiNiwweDRkLDB4ODIsMHgwNCwKLQkJCQkJCQkweDQ1LDB4NmQsMHhiNCwweGNmLDB4ZDcsMHg3NywweDY3LDB4ZjksMHg3NSwweDlmLAotCQkJCQkJCTB4ZjAsMHhlMCwweDFlLDB4NTEsMHhlZSwweDQ2LDB4ZmQsMHgwYiwweGM5LDB4OTMsCi0JCQkJCQkJMHgyNSwweDU1LDB4NGEsMHhlZSwweGUwLDB4MTYsMHhkMCwweGRmLDB4OGMsMHhmYSwKLQkJCQkJCQkweDJhLDB4YTksMHg0OSwweGZkLDB4OTcsMHgxYywweDBlLDB4MjIsMHgxMywweDI4LAotCQkJCQkJCTB4N2MsMHhhZiwweGM0LDB4ZmMsMHg5YywweDEyLDB4NjUsMHg4YywweDRlLDB4NWIsCi0JCQkJCQkJMHgwNCwweDc1LDB4ODksMHhjOSwweGIxLDB4ZWQsMHg1MCwweGNhLDB4OTYsMHg2ZiwKLQkJCQkJCQkweDFhLDB4N2EsMHhmZSwweDU4LDB4NWQsMHhlYywweDE5LDB4NGEsMHhmNiwweDM1LAotCQkJCQkJCTB4NmEsMHg5NywweDE0LDB4MDAsMHgwZSwweGQwLDB4NmIsMHhiYiwweGQ1LDB4NzUsCi0JCQkJCQkJMHg1NSwweDhiLDB4NmUsMHg2YiwweDE5LDB4YTAsMHhmOCwweDc3LDB4ZDUsMHhhMwotCQkJCQkJCX07CitzdGF0aWMgY29uc3QgdWludDhfdCBKU19SQzRLRVlbXSA9IHsKKyAgICAweDE5LCAweGE4LCAweGU4LCAweDAxLCAweGY2LCAweGE4LCAweGI2LCAweDRkLCAweDgyLCAweDA0LCAweDQ1LCAweDZkLAorICAgIDB4YjQsIDB4Y2YsIDB4ZDcsIDB4NzcsIDB4NjcsIDB4ZjksIDB4NzUsIDB4OWYsIDB4ZjAsIDB4ZTAsIDB4MWUsIDB4NTEsCisgICAgMHhlZSwgMHg0NiwgMHhmZCwgMHgwYiwgMHhjOSwgMHg5MywgMHgyNSwgMHg1NSwgMHg0YSwgMHhlZSwgMHhlMCwgMHgxNiwKKyAgICAweGQwLCAweGRmLCAweDhjLCAweGZhLCAweDJhLCAweGE5LCAweDQ5LCAweGZkLCAweDk3LCAweDFjLCAweDBlLCAweDIyLAorICAgIDB4MTMsIDB4MjgsIDB4N2MsIDB4YWYsIDB4YzQsIDB4ZmMsIDB4OWMsIDB4MTIsIDB4NjUsIDB4OGMsIDB4NGUsIDB4NWIsCisgICAgMHgwNCwgMHg3NSwgMHg4OSwgMHhjOSwgMHhiMSwgMHhlZCwgMHg1MCwgMHhjYSwgMHg5NiwgMHg2ZiwgMHgxYSwgMHg3YSwKKyAgICAweGZlLCAweDU4LCAweDVkLCAweGVjLCAweDE5LCAweDRhLCAweGY2LCAweDM1LCAweDZhLCAweDk3LCAweDE0LCAweDAwLAorICAgIDB4MGUsIDB4ZDAsIDB4NmIsIDB4YmIsIDB4ZDUsIDB4NzUsIDB4NTUsIDB4OGIsIDB4NmUsIDB4NmIsIDB4MTksIDB4YTAsCisgICAgMHhmOCwgMHg3NywgMHhkNSwgMHhhM307CiAKLUNKU19HbG9iYWxEYXRhOjpDSlNfR2xvYmFsRGF0YShDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKQotewotLy8gCUlCYXNlQW5ub3QqIHBCYXNlQW5ub3QgPSBJQmFzZUFubm90OjpHZXRCYXNlQW5ub3QobV9wQXBwKTsKLS8vIAlBU1NFUlQocEJhc2VBbm5vdCAhPSBOVUxMKTsKLS8vIAotLy8gCW1fc0ZpbGVQYXRoID0gcEJhc2VBbm5vdC0+R2V0VXNlclBhdGgoKTsKLQltX3NGaWxlUGF0aCArPSBTREtfSlNfR0xPQkFMREFUQV9GSUxFTkFNRTsKK0NKU19HbG9iYWxEYXRhKiBDSlNfR2xvYmFsRGF0YTo6Z19JbnN0YW5jZSA9IG51bGxwdHI7CiAKLQlMb2FkR2xvYmFsUGVyc2lzdGVudFZhcmlhYmxlcygpOworLy8gc3RhdGljCitDSlNfR2xvYmFsRGF0YSogQ0pTX0dsb2JhbERhdGE6OkdldFJldGFpbmVkSW5zdGFuY2UoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCkgeworICBpZiAoIWdfSW5zdGFuY2UpIHsKKyAgICBnX0luc3RhbmNlID0gbmV3IENKU19HbG9iYWxEYXRhKCk7CisgIH0KKyAgKytnX0luc3RhbmNlLT5tX1JlZkNvdW50OworICByZXR1cm4gZ19JbnN0YW5jZTsKIH0KIAotQ0pTX0dsb2JhbERhdGE6On5DSlNfR2xvYmFsRGF0YSgpCi17Ci0JU2F2ZUdsb2JhbFBlcnNpc2l0ZW50VmFyaWFibGVzKCk7Ci0KLQlmb3IgKGludCBpPTAsc3o9bV9hcnJheUdsb2JhbERhdGEuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JCWRlbGV0ZSBtX2FycmF5R2xvYmFsRGF0YS5HZXRBdChpKTsKLQotCW1fYXJyYXlHbG9iYWxEYXRhLlJlbW92ZUFsbCgpOwordm9pZCBDSlNfR2xvYmFsRGF0YTo6UmVsZWFzZSgpIHsKKyAgaWYgKCEtLW1fUmVmQ291bnQpIHsKKyAgICBkZWxldGUgZ19JbnN0YW5jZTsKKyAgICBnX0luc3RhbmNlID0gbnVsbHB0cjsKKyAgfQogfQogCi1pbnQJQ0pTX0dsb2JhbERhdGE6OkZpbmRHbG9iYWxWYXJpYWJsZShGWF9MUENTVFIgcHJvcG5hbWUpCi17Ci0JQVNTRVJUKHByb3BuYW1lICE9IE5VTEwpOwotCi0JaW50IG5SZXQgPSAtMTsKLQotCWZvciAoaW50IGk9MCxzej1tX2FycmF5R2xvYmFsRGF0YS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQl7Ci0JCUNKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBUZW1wID0gbV9hcnJheUdsb2JhbERhdGEuR2V0QXQoaSk7Ci0JCWlmIChwVGVtcC0+ZGF0YS5zS2V5WzBdID09ICpwcm9wbmFtZSAmJiBwVGVtcC0+ZGF0YS5zS2V5ID09IHByb3BuYW1lKQotCQl7Ci0JCQluUmV0ID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIG5SZXQ7CitDSlNfR2xvYmFsRGF0YTo6Q0pTX0dsb2JhbERhdGEoKSA6IG1fUmVmQ291bnQoMCkgeworICBtX3NGaWxlUGF0aCArPSBTREtfSlNfR0xPQkFMREFUQV9GSUxFTkFNRTsKKyAgTG9hZEdsb2JhbFBlcnNpc3RlbnRWYXJpYWJsZXMoKTsKIH0KIAotQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogQ0pTX0dsb2JhbERhdGE6OkdldEdsb2JhbFZhcmlhYmxlKEZYX0xQQ1NUUiBwcm9wbmFtZSkKLXsKLQlBU1NFUlQocHJvcG5hbWUgIT0gTlVMTCk7CitDSlNfR2xvYmFsRGF0YTo6fkNKU19HbG9iYWxEYXRhKCkgeworICBTYXZlR2xvYmFsUGVyc2lzaXRlbnRWYXJpYWJsZXMoKTsKKyAgZm9yIChpbnQgaSA9IDAsIHN6ID0gbV9hcnJheUdsb2JhbERhdGEuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKKyAgICBkZWxldGUgbV9hcnJheUdsb2JhbERhdGEuR2V0QXQoaSk7CiAKLQlpbnQJbkZpbmQgPSBGaW5kR2xvYmFsVmFyaWFibGUocHJvcG5hbWUpOwotCi0JaWYgKG5GaW5kID49IDApCi0JCXJldHVybiBtX2FycmF5R2xvYmFsRGF0YS5HZXRBdChuRmluZCk7Ci0JZWxzZQotCQlyZXR1cm4gTlVMTDsKKyAgbV9hcnJheUdsb2JhbERhdGEuUmVtb3ZlQWxsKCk7CiB9CiAKLXZvaWQgQ0pTX0dsb2JhbERhdGE6OlNldEdsb2JhbFZhcmlhYmxlTnVtYmVyKEZYX0xQQ1NUUiBwcm9wbmFtZSwgZG91YmxlIGREYXRhKQotewotCUFTU0VSVChwcm9wbmFtZSAhPSBOVUxMKTsKLQlDRlhfQnl0ZVN0cmluZyBzUHJvcE5hbWUgPSBwcm9wbmFtZTsKLQotCXNQcm9wTmFtZS5UcmltTGVmdCgpOwotCXNQcm9wTmFtZS5UcmltUmlnaHQoKTsKLQotCWlmIChzUHJvcE5hbWUuR2V0TGVuZ3RoKCkgPT0gMCkgcmV0dXJuOwotCi0JaWYgKENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBEYXRhID0gR2V0R2xvYmFsVmFyaWFibGUoc1Byb3BOYW1lKSkKLQl7Ci0JCXBEYXRhLT5kYXRhLm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX05VTUJFUjsKLQkJcERhdGEtPmRhdGEuZERhdGEgPSBkRGF0YTsKLQl9Ci0JZWxzZQotCXsKLQkJQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogcE5ld0RhdGEgPSBuZXcgQ0pTX0dsb2JhbERhdGFfRWxlbWVudDsKLQkJcE5ld0RhdGEtPmRhdGEuc0tleSA9IHNQcm9wTmFtZTsKLQkJcE5ld0RhdGEtPmRhdGEublR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSOwotCQlwTmV3RGF0YS0+ZGF0YS5kRGF0YSA9IGREYXRhOwotCi0JCW1fYXJyYXlHbG9iYWxEYXRhLkFkZChwTmV3RGF0YSk7Ci0JfQoraW50IENKU19HbG9iYWxEYXRhOjpGaW5kR2xvYmFsVmFyaWFibGUoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUpIHsKKyAgZm9yIChpbnQgaSA9IDAsIHN6ID0gbV9hcnJheUdsb2JhbERhdGEuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgIENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBUZW1wID0gbV9hcnJheUdsb2JhbERhdGEuR2V0QXQoaSk7CisgICAgaWYgKHBUZW1wLT5kYXRhLnNLZXlbMF0gPT0gKnByb3BuYW1lICYmIHBUZW1wLT5kYXRhLnNLZXkgPT0gcHJvcG5hbWUpCisgICAgICByZXR1cm4gaTsKKyAgfQorICByZXR1cm4gLTE7CiB9CiAKLXZvaWQgQ0pTX0dsb2JhbERhdGE6OlNldEdsb2JhbFZhcmlhYmxlQm9vbGVhbihGWF9MUENTVFIgcHJvcG5hbWUsIGJvb2wgYkRhdGEpCi17Ci0JQVNTRVJUKHByb3BuYW1lICE9IE5VTEwpOwotCUNGWF9CeXRlU3RyaW5nIHNQcm9wTmFtZSA9IHByb3BuYW1lOworQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogQ0pTX0dsb2JhbERhdGE6OkdldEdsb2JhbFZhcmlhYmxlKAorICAgIGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lKSB7CisgIEFTU0VSVChwcm9wbmFtZSk7CiAKLQlzUHJvcE5hbWUuVHJpbUxlZnQoKTsKLQlzUHJvcE5hbWUuVHJpbVJpZ2h0KCk7Ci0KLQlpZiAoc1Byb3BOYW1lLkdldExlbmd0aCgpID09IDApIHJldHVybjsKLQotCWlmIChDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBwRGF0YSA9IEdldEdsb2JhbFZhcmlhYmxlKHNQcm9wTmFtZSkpCi0JewotCQlwRGF0YS0+ZGF0YS5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9CT09MRUFOOwotCQlwRGF0YS0+ZGF0YS5iRGF0YSA9IGJEYXRhOwotCX0KLQllbHNlCi0JewotCQlDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBwTmV3RGF0YSA9IG5ldyBDSlNfR2xvYmFsRGF0YV9FbGVtZW50OwotCQlwTmV3RGF0YS0+ZGF0YS5zS2V5ID0gc1Byb3BOYW1lOwotCQlwTmV3RGF0YS0+ZGF0YS5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9CT09MRUFOOwotCQlwTmV3RGF0YS0+ZGF0YS5iRGF0YSA9IGJEYXRhOwotCi0JCW1fYXJyYXlHbG9iYWxEYXRhLkFkZChwTmV3RGF0YSk7Ci0JfQorICBpbnQgbkZpbmQgPSBGaW5kR2xvYmFsVmFyaWFibGUocHJvcG5hbWUpOworICByZXR1cm4gbkZpbmQgPj0gMCA/IG1fYXJyYXlHbG9iYWxEYXRhLkdldEF0KG5GaW5kKSA6IG51bGxwdHI7CiB9CiAKLXZvaWQgQ0pTX0dsb2JhbERhdGE6OlNldEdsb2JhbFZhcmlhYmxlU3RyaW5nKEZYX0xQQ1NUUiBwcm9wbmFtZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNEYXRhKQotewotCUFTU0VSVChwcm9wbmFtZSAhPSBOVUxMKTsKLQlDRlhfQnl0ZVN0cmluZyBzUHJvcE5hbWUgPSBwcm9wbmFtZTsKK3ZvaWQgQ0pTX0dsb2JhbERhdGE6OlNldEdsb2JhbFZhcmlhYmxlTnVtYmVyKGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGREYXRhKSB7CisgIEFTU0VSVChwcm9wbmFtZSk7CisgIENGWF9CeXRlU3RyaW5nIHNQcm9wTmFtZSA9IHByb3BuYW1lOworICBzUHJvcE5hbWUuVHJpbUxlZnQoKTsKKyAgc1Byb3BOYW1lLlRyaW1SaWdodCgpOworICBpZiAoc1Byb3BOYW1lLkdldExlbmd0aCgpID09IDApCisgICAgcmV0dXJuOwogCi0Jc1Byb3BOYW1lLlRyaW1MZWZ0KCk7Ci0Jc1Byb3BOYW1lLlRyaW1SaWdodCgpOwotCi0JaWYgKHNQcm9wTmFtZS5HZXRMZW5ndGgoKSA9PSAwKSByZXR1cm47Ci0KLQlpZiAoQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogcERhdGEgPSBHZXRHbG9iYWxWYXJpYWJsZShzUHJvcE5hbWUpKQotCXsKLQkJcERhdGEtPmRhdGEublR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HOwotCQlwRGF0YS0+ZGF0YS5zRGF0YSA9IHNEYXRhOwotCX0KLQllbHNlCi0JewotCQlDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBwTmV3RGF0YSA9IG5ldyBDSlNfR2xvYmFsRGF0YV9FbGVtZW50OwotCQlwTmV3RGF0YS0+ZGF0YS5zS2V5ID0gc1Byb3BOYW1lOwotCQlwTmV3RGF0YS0+ZGF0YS5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkc7Ci0JCXBOZXdEYXRhLT5kYXRhLnNEYXRhID0gc0RhdGE7Ci0KLQkJbV9hcnJheUdsb2JhbERhdGEuQWRkKHBOZXdEYXRhKTsKLQl9CisgIGlmIChDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBwRGF0YSA9IEdldEdsb2JhbFZhcmlhYmxlKHNQcm9wTmFtZSkpIHsKKyAgICBwRGF0YS0+ZGF0YS5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVI7CisgICAgcERhdGEtPmRhdGEuZERhdGEgPSBkRGF0YTsKKyAgfSBlbHNlIHsKKyAgICBDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBwTmV3RGF0YSA9IG5ldyBDSlNfR2xvYmFsRGF0YV9FbGVtZW50OworICAgIHBOZXdEYXRhLT5kYXRhLnNLZXkgPSBzUHJvcE5hbWU7CisgICAgcE5ld0RhdGEtPmRhdGEublR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSOworICAgIHBOZXdEYXRhLT5kYXRhLmREYXRhID0gZERhdGE7CisgICAgbV9hcnJheUdsb2JhbERhdGEuQWRkKHBOZXdEYXRhKTsKKyAgfQogfQogCi12b2lkIENKU19HbG9iYWxEYXRhOjpTZXRHbG9iYWxWYXJpYWJsZU9iamVjdChGWF9MUENTVFIgcHJvcG5hbWUsIGNvbnN0IENKU19HbG9iYWxWYXJpYWJsZUFycmF5JiBhcnJheSkKLXsKLQlBU1NFUlQocHJvcG5hbWUgIT0gTlVMTCk7Ci0JQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lID0gcHJvcG5hbWU7Cit2b2lkIENKU19HbG9iYWxEYXRhOjpTZXRHbG9iYWxWYXJpYWJsZUJvb2xlYW4oY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRGF0YSkgeworICBBU1NFUlQocHJvcG5hbWUpOworICBDRlhfQnl0ZVN0cmluZyBzUHJvcE5hbWUgPSBwcm9wbmFtZTsKIAotCXNQcm9wTmFtZS5UcmltTGVmdCgpOwotCXNQcm9wTmFtZS5UcmltUmlnaHQoKTsKKyAgc1Byb3BOYW1lLlRyaW1MZWZ0KCk7CisgIHNQcm9wTmFtZS5UcmltUmlnaHQoKTsKIAotCWlmIChzUHJvcE5hbWUuR2V0TGVuZ3RoKCkgPT0gMCkgcmV0dXJuOworICBpZiAoc1Byb3BOYW1lLkdldExlbmd0aCgpID09IDApCisgICAgcmV0dXJuOwogCi0JaWYgKENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBEYXRhID0gR2V0R2xvYmFsVmFyaWFibGUoc1Byb3BOYW1lKSkKLQl7Ci0JCXBEYXRhLT5kYXRhLm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVDsKLQkJcERhdGEtPmRhdGEub2JqRGF0YS5Db3B5KGFycmF5KTsKLQl9Ci0JZWxzZQotCXsKLQkJQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogcE5ld0RhdGEgPSBuZXcgQ0pTX0dsb2JhbERhdGFfRWxlbWVudDsKLQkJcE5ld0RhdGEtPmRhdGEuc0tleSA9IHNQcm9wTmFtZTsKLQkJcE5ld0RhdGEtPmRhdGEublR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfT0JKRUNUOwotCQlwTmV3RGF0YS0+ZGF0YS5vYmpEYXRhLkNvcHkoYXJyYXkpOwotCQkKLQkJbV9hcnJheUdsb2JhbERhdGEuQWRkKHBOZXdEYXRhKTsKLQl9CisgIGlmIChDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBwRGF0YSA9IEdldEdsb2JhbFZhcmlhYmxlKHNQcm9wTmFtZSkpIHsKKyAgICBwRGF0YS0+ZGF0YS5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9CT09MRUFOOworICAgIHBEYXRhLT5kYXRhLmJEYXRhID0gYkRhdGE7CisgIH0gZWxzZSB7CisgICAgQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogcE5ld0RhdGEgPSBuZXcgQ0pTX0dsb2JhbERhdGFfRWxlbWVudDsKKyAgICBwTmV3RGF0YS0+ZGF0YS5zS2V5ID0gc1Byb3BOYW1lOworICAgIHBOZXdEYXRhLT5kYXRhLm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU47CisgICAgcE5ld0RhdGEtPmRhdGEuYkRhdGEgPSBiRGF0YTsKKworICAgIG1fYXJyYXlHbG9iYWxEYXRhLkFkZChwTmV3RGF0YSk7CisgIH0KIH0KIAotdm9pZCBDSlNfR2xvYmFsRGF0YTo6U2V0R2xvYmFsVmFyaWFibGVOdWxsKEZYX0xQQ1NUUiBwcm9wbmFtZSkKLXsKLQlBU1NFUlQocHJvcG5hbWUgIT0gTlVMTCk7Ci0JQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lID0gcHJvcG5hbWU7Ci0JCi0Jc1Byb3BOYW1lLlRyaW1MZWZ0KCk7Ci0Jc1Byb3BOYW1lLlRyaW1SaWdodCgpOwotCQotCWlmIChzUHJvcE5hbWUuR2V0TGVuZ3RoKCkgPT0gMCkgcmV0dXJuOwotCQotCWlmIChDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBwRGF0YSA9IEdldEdsb2JhbFZhcmlhYmxlKHNQcm9wTmFtZSkpCi0JewotCQlwRGF0YS0+ZGF0YS5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9OVUxMOwotCX0KLQllbHNlCi0JewotCQlDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBwTmV3RGF0YSA9IG5ldyBDSlNfR2xvYmFsRGF0YV9FbGVtZW50OwotCQlwTmV3RGF0YS0+ZGF0YS5zS2V5ID0gc1Byb3BOYW1lOwotCQlwTmV3RGF0YS0+ZGF0YS5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9OVUxMOwotCQkKLQkJbV9hcnJheUdsb2JhbERhdGEuQWRkKHBOZXdEYXRhKTsKLQl9Cit2b2lkIENKU19HbG9iYWxEYXRhOjpTZXRHbG9iYWxWYXJpYWJsZVN0cmluZyhjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRGF0YSkgeworICBBU1NFUlQocHJvcG5hbWUpOworICBDRlhfQnl0ZVN0cmluZyBzUHJvcE5hbWUgPSBwcm9wbmFtZTsKKworICBzUHJvcE5hbWUuVHJpbUxlZnQoKTsKKyAgc1Byb3BOYW1lLlRyaW1SaWdodCgpOworCisgIGlmIChzUHJvcE5hbWUuR2V0TGVuZ3RoKCkgPT0gMCkKKyAgICByZXR1cm47CisKKyAgaWYgKENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBEYXRhID0gR2V0R2xvYmFsVmFyaWFibGUoc1Byb3BOYW1lKSkgeworICAgIHBEYXRhLT5kYXRhLm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX1NUUklORzsKKyAgICBwRGF0YS0+ZGF0YS5zRGF0YSA9IHNEYXRhOworICB9IGVsc2UgeworICAgIENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBOZXdEYXRhID0gbmV3IENKU19HbG9iYWxEYXRhX0VsZW1lbnQ7CisgICAgcE5ld0RhdGEtPmRhdGEuc0tleSA9IHNQcm9wTmFtZTsKKyAgICBwTmV3RGF0YS0+ZGF0YS5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkc7CisgICAgcE5ld0RhdGEtPmRhdGEuc0RhdGEgPSBzRGF0YTsKKworICAgIG1fYXJyYXlHbG9iYWxEYXRhLkFkZChwTmV3RGF0YSk7CisgIH0KIH0KIAotRlhfQk9PTCBDSlNfR2xvYmFsRGF0YTo6U2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KEZYX0xQQ1NUUiBwcm9wbmFtZSwgRlhfQk9PTCBiUGVyc2lzdGVudCkKLXsKLQlBU1NFUlQocHJvcG5hbWUgIT0gTlVMTCk7Ci0JQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lID0gcHJvcG5hbWU7Cit2b2lkIENKU19HbG9iYWxEYXRhOjpTZXRHbG9iYWxWYXJpYWJsZU9iamVjdCgKKyAgICBjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwKKyAgICBjb25zdCBDSlNfR2xvYmFsVmFyaWFibGVBcnJheSYgYXJyYXkpIHsKKyAgQVNTRVJUKHByb3BuYW1lKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lID0gcHJvcG5hbWU7CiAKLQlzUHJvcE5hbWUuVHJpbUxlZnQoKTsKLQlzUHJvcE5hbWUuVHJpbVJpZ2h0KCk7CisgIHNQcm9wTmFtZS5UcmltTGVmdCgpOworICBzUHJvcE5hbWUuVHJpbVJpZ2h0KCk7CiAKLQlpZiAoc1Byb3BOYW1lLkdldExlbmd0aCgpID09IDApIHJldHVybiBGQUxTRTsKKyAgaWYgKHNQcm9wTmFtZS5HZXRMZW5ndGgoKSA9PSAwKQorICAgIHJldHVybjsKIAotCWlmIChDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBwRGF0YSA9IEdldEdsb2JhbFZhcmlhYmxlKHNQcm9wTmFtZSkpCi0JewotCQlwRGF0YS0+YlBlcnNpc3RlbnQgPSBiUGVyc2lzdGVudDsKLQkJcmV0dXJuIFRSVUU7Ci0JfQorICBpZiAoQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogcERhdGEgPSBHZXRHbG9iYWxWYXJpYWJsZShzUHJvcE5hbWUpKSB7CisgICAgcERhdGEtPmRhdGEublR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfT0JKRUNUOworICAgIHBEYXRhLT5kYXRhLm9iakRhdGEuQ29weShhcnJheSk7CisgIH0gZWxzZSB7CisgICAgQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogcE5ld0RhdGEgPSBuZXcgQ0pTX0dsb2JhbERhdGFfRWxlbWVudDsKKyAgICBwTmV3RGF0YS0+ZGF0YS5zS2V5ID0gc1Byb3BOYW1lOworICAgIHBOZXdEYXRhLT5kYXRhLm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVDsKKyAgICBwTmV3RGF0YS0+ZGF0YS5vYmpEYXRhLkNvcHkoYXJyYXkpOwogCi0JcmV0dXJuIEZBTFNFOworICAgIG1fYXJyYXlHbG9iYWxEYXRhLkFkZChwTmV3RGF0YSk7CisgIH0KIH0KIAotRlhfQk9PTCBDSlNfR2xvYmFsRGF0YTo6RGVsZXRlR2xvYmFsVmFyaWFibGUoRlhfTFBDU1RSIHByb3BuYW1lKQotewotCUFTU0VSVChwcm9wbmFtZSAhPSBOVUxMKTsKLQlDRlhfQnl0ZVN0cmluZyBzUHJvcE5hbWUgPSBwcm9wbmFtZTsKK3ZvaWQgQ0pTX0dsb2JhbERhdGE6OlNldEdsb2JhbFZhcmlhYmxlTnVsbChjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSkgeworICBBU1NFUlQocHJvcG5hbWUpOworICBDRlhfQnl0ZVN0cmluZyBzUHJvcE5hbWUgPSBwcm9wbmFtZTsKIAotCXNQcm9wTmFtZS5UcmltTGVmdCgpOwotCXNQcm9wTmFtZS5UcmltUmlnaHQoKTsKKyAgc1Byb3BOYW1lLlRyaW1MZWZ0KCk7CisgIHNQcm9wTmFtZS5UcmltUmlnaHQoKTsKIAotCWlmIChzUHJvcE5hbWUuR2V0TGVuZ3RoKCkgPT0gMCkgcmV0dXJuIEZBTFNFOworICBpZiAoc1Byb3BOYW1lLkdldExlbmd0aCgpID09IDApCisgICAgcmV0dXJuOwogCi0JaW50CW5GaW5kID0gRmluZEdsb2JhbFZhcmlhYmxlKHNQcm9wTmFtZSk7CisgIGlmIChDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBwRGF0YSA9IEdldEdsb2JhbFZhcmlhYmxlKHNQcm9wTmFtZSkpIHsKKyAgICBwRGF0YS0+ZGF0YS5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9OVUxMOworICB9IGVsc2UgeworICAgIENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBOZXdEYXRhID0gbmV3IENKU19HbG9iYWxEYXRhX0VsZW1lbnQ7CisgICAgcE5ld0RhdGEtPmRhdGEuc0tleSA9IHNQcm9wTmFtZTsKKyAgICBwTmV3RGF0YS0+ZGF0YS5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9OVUxMOwogCi0JaWYgKG5GaW5kID49IDApCi0JewotCQlkZWxldGUgbV9hcnJheUdsb2JhbERhdGEuR2V0QXQobkZpbmQpOwotCQltX2FycmF5R2xvYmFsRGF0YS5SZW1vdmVBdChuRmluZCk7Ci0JCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKKyAgICBtX2FycmF5R2xvYmFsRGF0YS5BZGQocE5ld0RhdGEpOworICB9CiB9CiAKLUZYX0lOVDMyIENKU19HbG9iYWxEYXRhOjpHZXRTaXplKCkgY29uc3QKLXsKLQlyZXR1cm4gbV9hcnJheUdsb2JhbERhdGEuR2V0U2l6ZSgpOworRlhfQk9PTCBDSlNfR2xvYmFsRGF0YTo6U2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlBlcnNpc3RlbnQpIHsKKyAgQVNTRVJUKHByb3BuYW1lKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lID0gcHJvcG5hbWU7CisKKyAgc1Byb3BOYW1lLlRyaW1MZWZ0KCk7CisgIHNQcm9wTmFtZS5UcmltUmlnaHQoKTsKKworICBpZiAoc1Byb3BOYW1lLkdldExlbmd0aCgpID09IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIGlmIChDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBwRGF0YSA9IEdldEdsb2JhbFZhcmlhYmxlKHNQcm9wTmFtZSkpIHsKKyAgICBwRGF0YS0+YlBlcnNpc3RlbnQgPSBiUGVyc2lzdGVudDsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKIH0KIAotQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogQ0pTX0dsb2JhbERhdGE6OkdldEF0KGludCBpbmRleCkgY29uc3QKLXsKLQlyZXR1cm4gbV9hcnJheUdsb2JhbERhdGEuR2V0QXQoaW5kZXgpOworRlhfQk9PTCBDSlNfR2xvYmFsRGF0YTo6RGVsZXRlR2xvYmFsVmFyaWFibGUoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUpIHsKKyAgQVNTRVJUKHByb3BuYW1lKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lID0gcHJvcG5hbWU7CisKKyAgc1Byb3BOYW1lLlRyaW1MZWZ0KCk7CisgIHNQcm9wTmFtZS5UcmltUmlnaHQoKTsKKworICBpZiAoc1Byb3BOYW1lLkdldExlbmd0aCgpID09IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIGludCBuRmluZCA9IEZpbmRHbG9iYWxWYXJpYWJsZShzUHJvcE5hbWUpOworCisgIGlmIChuRmluZCA+PSAwKSB7CisgICAgZGVsZXRlIG1fYXJyYXlHbG9iYWxEYXRhLkdldEF0KG5GaW5kKTsKKyAgICBtX2FycmF5R2xvYmFsRGF0YS5SZW1vdmVBdChuRmluZCk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICByZXR1cm4gRkFMU0U7CiB9CiAKLXZvaWQgQ0pTX0dsb2JhbERhdGE6OkxvYWRHbG9iYWxQZXJzaXN0ZW50VmFyaWFibGVzKCkKLXsKLQlGWF9MUEJZVEUgcEJ1ZmZlciA9IE5VTEw7Ci0JRlhfSU5UMzIgbkxlbmd0aCA9IDA7Ci0KLQlMb2FkRmlsZUJ1ZmZlcihtX3NGaWxlUGF0aC5jX3N0cigpLCBwQnVmZmVyLCBuTGVuZ3RoKTsKLQlDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayhwQnVmZmVyLCBuTGVuZ3RoLCBKU19SQzRLRVksIHNpemVvZihKU19SQzRLRVkpKTsKLQotCWlmIChwQnVmZmVyKQotCXsKLQkJRlhfTFBCWVRFIHAgPSBwQnVmZmVyOwotCQlGWF9XT1JEIHdUeXBlID0gKigoRlhfV09SRCopcCk7Ci0JCXAgKz0gc2l6ZW9mKEZYX1dPUkQpOwotCi0JCS8vRlhfV09SRCB3VGVtcCA9IChGWF9XT1JEKSgoJ1gnIDw8IDgpIHwgJ0YnKTsKLQotCQlpZiAod1R5cGUgPT0gKEZYX1dPUkQpKCgnWCcgPDwgOCkgfCAnRicpKQotCQl7Ci0JCQlGWF9XT1JEIHdWZXJzaW9uID0gKigoRlhfV09SRCopcCk7Ci0JCQlwICs9IHNpemVvZihGWF9XT1JEKTsKLQotCQkJQVNTRVJUKHdWZXJzaW9uIDw9IDIpOwotCi0JCQlGWF9EV09SRCBkd0NvdW50ID0gKigoRlhfRFdPUkQqKXApOwotCQkJcCArPSBzaXplb2YoRlhfRFdPUkQpOwotCi0JCQlGWF9EV09SRCBkd1NpemUgPSAqKChGWF9EV09SRCopcCk7Ci0JCQlwICs9IHNpemVvZihGWF9EV09SRCk7Ci0KLQkJCWlmIChkd1NpemUgPT0gbkxlbmd0aCAtIHNpemVvZihGWF9XT1JEKSAqIDIgLSBzaXplb2YoRlhfRFdPUkQpKiAyKQotCQkJewotCQkJCWZvciAoRlhfSU5UMzIgaT0wLHN6PWR3Q291bnQ7IGk8c3o7IGkrKykKLQkJCQl7Ci0JCQkJCWlmIChwID4gcEJ1ZmZlciArIG5MZW5ndGgpCi0JCQkJCQlicmVhazsKLQotCQkJCQlGWF9EV09SRCBkd05hbWVMZW4gPSAqKChGWF9EV09SRCopcCk7Ci0JCQkJCXAgKz0gc2l6ZW9mKEZYX0RXT1JEKTsKLQotCQkJCQlpZiAocCArIGR3TmFtZUxlbiA+IHBCdWZmZXIgKyBuTGVuZ3RoKQotCQkJCQkJYnJlYWs7Ci0KLQkJCQkJQ0ZYX0J5dGVTdHJpbmcgc0VudHJ5ID0gQ0ZYX0J5dGVTdHJpbmcocCwgZHdOYW1lTGVuKTsKLQkJCQkJcCArPSBzaXplb2YoY2hhcikgKiBkd05hbWVMZW47Ci0KLQkJCQkJRlhfV09SRCB3RGF0YVR5cGUgPSAqKChGWF9XT1JEKilwKTsKLQkJCQkJcCArPSBzaXplb2YoRlhfV09SRCk7Ci0KLQkJCQkJc3dpdGNoICh3RGF0YVR5cGUpCi0JCQkJCXsKLQkJCQkJY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSOgotCQkJCQkJewotCQkJCQkJCWRvdWJsZSBkRGF0YSA9IDA7Ci0JCQkJCQkJc3dpdGNoICh3VmVyc2lvbikKLQkJCQkJCQl7Ci0JCQkJCQkJY2FzZSAxOgotCQkJCQkJCQl7Ci0JCQkJCQkJCQlGWF9EV09SRCBkd0RhdGEgPSAqKChGWF9EV09SRCopcCk7Ci0JCQkJCQkJCQlwICs9IHNpemVvZihGWF9EV09SRCk7Ci0JCQkJCQkJCQlkRGF0YSA9IGR3RGF0YTsKLQkJCQkJCQkJfQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDI6Ci0JCQkJCQkJCXsKLQkJCQkJCQkJCWREYXRhID0gKigoZG91YmxlKilwKTsKLQkJCQkJCQkJCXAgKz0gc2l6ZW9mKGRvdWJsZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJCVNldEdsb2JhbFZhcmlhYmxlTnVtYmVyKHNFbnRyeSwgZERhdGEpOwotCQkJCQkJCVNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChzRW50cnksIFRSVUUpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU46Ci0JCQkJCQl7Ci0JCQkJCQkJRlhfV09SRCB3RGF0YSA9ICooKEZYX1dPUkQqKXApOwotCQkJCQkJCXAgKz0gc2l6ZW9mKEZYX1dPUkQpOwotCQkJCQkJCVNldEdsb2JhbFZhcmlhYmxlQm9vbGVhbihzRW50cnksIChib29sKSh3RGF0YSA9PSAxKSk7Ci0JCQkJCQkJU2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KHNFbnRyeSwgVFJVRSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HOgotCQkJCQkJewotCQkJCQkJCUZYX0RXT1JEIGR3TGVuZ3RoID0gKigoRlhfRFdPUkQqKXApOwotCQkJCQkJCXAgKz0gc2l6ZW9mKEZYX0RXT1JEKTsKLQotCQkJCQkJCWlmIChwICsgZHdMZW5ndGggPiBwQnVmZmVyICsgbkxlbmd0aCkKLQkJCQkJCQkJYnJlYWs7Ci0KLQkJCQkJCQlTZXRHbG9iYWxWYXJpYWJsZVN0cmluZyhzRW50cnksIENGWF9CeXRlU3RyaW5nKHAsIGR3TGVuZ3RoKSk7Ci0JCQkJCQkJU2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KHNFbnRyeSwgVFJVRSk7Ci0JCQkJCQkJcCArPSBzaXplb2YoY2hhcikgKiBkd0xlbmd0aDsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVUxMOgotCQkJCQkJewotCQkJCQkJCVNldEdsb2JhbFZhcmlhYmxlTnVsbChzRW50cnkpOwotCQkJCQkJCVNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChzRW50cnksIFRSVUUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUZYX0ZyZWUocEJ1ZmZlcik7Ci0JfQoraW50MzJfdCBDSlNfR2xvYmFsRGF0YTo6R2V0U2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fYXJyYXlHbG9iYWxEYXRhLkdldFNpemUoKTsKIH0KIAotLyoKLXN0cnVjdCBqc19nbG9iYWxfZGF0YWZpbGVfaGVhZGVyCi17Ci0JRlhfV09SRCB0eXBlOyAvL0ZYICgnWCcgPDwgOCkgfCAnRicKLQlGWF9XT1JEIHZlcnNpb247IC8vMS4wCi0JRlhfRFdPUkQgZGF0YWNvdW50OwotfTsKLXN0cnVjdCBqc19nbG9iYWxfZGF0YWZpbGVfZGF0YQotewotCUZYX1dPUkQgdHlwZTsKLQlGWF9EV09SRCBuRGF0YTsKLQlGWF9XT1JEIGJEYXRhOwotCUZYX0RXT1JEIG5TdHJMZW47Ci0JY2hhciogcFN0cjsKLX07Ci0qLwotCi12b2lkIENKU19HbG9iYWxEYXRhOjpTYXZlR2xvYmFsUGVyc2lzaXRlbnRWYXJpYWJsZXMoKQotewotCUZYX0RXT1JEIG5Db3VudCA9IDA7Ci0JQ0ZYX0JpbmFyeUJ1ZiBzRGF0YTsKLQotCWZvciAoaW50IGk9MCxzej1tX2FycmF5R2xvYmFsRGF0YS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQl7Ci0JCUNKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBFbGVtZW50ID0gbV9hcnJheUdsb2JhbERhdGEuR2V0QXQoaSk7Ci0JCUFTU0VSVChwRWxlbWVudCAhPSBOVUxMKTsKLQotCQlpZiAocEVsZW1lbnQtPmJQZXJzaXN0ZW50KQotCQl7Ci0JCQlDRlhfQmluYXJ5QnVmIHNFbGVtZW50OwotCQkJTWFrZUJ5dGVTdHJpbmcocEVsZW1lbnQtPmRhdGEuc0tleSwgJnBFbGVtZW50LT5kYXRhLCBzRWxlbWVudCk7Ci0KLQkJCWlmIChzRGF0YS5HZXRTaXplKCkgKyBzRWxlbWVudC5HZXRTaXplKCkgPiBKU19NQVhHTE9CQUxEQVRBKQotCQkJCWJyZWFrOwotCi0JCQlzRGF0YS5BcHBlbmRCbG9jayhzRWxlbWVudC5HZXRCdWZmZXIoKSwgc0VsZW1lbnQuR2V0U2l6ZSgpKTsKLQkJCW5Db3VudCsrOwotCQl9Ci0JfQotCi0JQ0ZYX0JpbmFyeUJ1ZiBzRmlsZTsKLQotCUZYX1dPUkQgd1R5cGUgPSAoRlhfV09SRCkoKCdYJyA8PCA4KSB8ICdGJyk7Ci0Jc0ZpbGUuQXBwZW5kQmxvY2soJndUeXBlLCBzaXplb2YoRlhfV09SRCkpOwotCUZYX1dPUkQgd1ZlcnNpb24gPSAyOwotCXNGaWxlLkFwcGVuZEJsb2NrKCZ3VmVyc2lvbiwgc2l6ZW9mKEZYX1dPUkQpKTsKLQlzRmlsZS5BcHBlbmRCbG9jaygmbkNvdW50LCBzaXplb2YoRlhfRFdPUkQpKTsKLQlGWF9EV09SRCBkd1NpemUgPSBzRGF0YS5HZXRTaXplKCk7Ci0Jc0ZpbGUuQXBwZW5kQmxvY2soJmR3U2l6ZSwgc2l6ZW9mKEZYX0RXT1JEKSk7Ci0KLQlzRmlsZS5BcHBlbmRCbG9jayhzRGF0YS5HZXRCdWZmZXIoKSwgc0RhdGEuR2V0U2l6ZSgpKTsKLQotCUNSWVBUX0FyY0ZvdXJDcnlwdEJsb2NrKHNGaWxlLkdldEJ1ZmZlcigpLCBzRmlsZS5HZXRTaXplKCksIEpTX1JDNEtFWSwgc2l6ZW9mKEpTX1JDNEtFWSkpOwotCVdyaXRlRmlsZUJ1ZmZlcihtX3NGaWxlUGF0aC5jX3N0cigpLCAoRlhfTFBDU1RSKXNGaWxlLkdldEJ1ZmZlcigpLCBzRmlsZS5HZXRTaXplKCkpOworQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogQ0pTX0dsb2JhbERhdGE6OkdldEF0KGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gbV9hcnJheUdsb2JhbERhdGEuR2V0QXQoaW5kZXgpOwogfQogCi12b2lkIENKU19HbG9iYWxEYXRhOjpMb2FkRmlsZUJ1ZmZlcihGWF9MUENXU1RSIHNGaWxlUGF0aCwgRlhfTFBCWVRFJiBwQnVmZmVyLCBGWF9JTlQzMiYgbkxlbmd0aCkKLXsKLS8vVW5TdXBwb3J0Lgordm9pZCBDSlNfR2xvYmFsRGF0YTo6TG9hZEdsb2JhbFBlcnNpc3RlbnRWYXJpYWJsZXMoKSB7CisgIHVpbnQ4X3QqIHBCdWZmZXIgPSBOVUxMOworICBpbnQzMl90IG5MZW5ndGggPSAwOworCisgIExvYWRGaWxlQnVmZmVyKG1fc0ZpbGVQYXRoLmNfc3RyKCksIHBCdWZmZXIsIG5MZW5ndGgpOworICBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayhwQnVmZmVyLCBuTGVuZ3RoLCBKU19SQzRLRVksIHNpemVvZihKU19SQzRLRVkpKTsKKworICBpZiAocEJ1ZmZlcikgeworICAgIHVpbnQ4X3QqIHAgPSBwQnVmZmVyOworICAgIEZYX1dPUkQgd1R5cGUgPSAqKChGWF9XT1JEKilwKTsKKyAgICBwICs9IHNpemVvZihGWF9XT1JEKTsKKworICAgIC8vIEZYX1dPUkQgd1RlbXAgPSAoRlhfV09SRCkoKCdYJyA8PCA4KSB8ICdGJyk7CisKKyAgICBpZiAod1R5cGUgPT0gKEZYX1dPUkQpKCgnWCcgPDwgOCkgfCAnRicpKSB7CisgICAgICBGWF9XT1JEIHdWZXJzaW9uID0gKigoRlhfV09SRCopcCk7CisgICAgICBwICs9IHNpemVvZihGWF9XT1JEKTsKKworICAgICAgQVNTRVJUKHdWZXJzaW9uIDw9IDIpOworCisgICAgICBGWF9EV09SRCBkd0NvdW50ID0gKigoRlhfRFdPUkQqKXApOworICAgICAgcCArPSBzaXplb2YoRlhfRFdPUkQpOworCisgICAgICBGWF9EV09SRCBkd1NpemUgPSAqKChGWF9EV09SRCopcCk7CisgICAgICBwICs9IHNpemVvZihGWF9EV09SRCk7CisKKyAgICAgIGlmIChkd1NpemUgPT0gbkxlbmd0aCAtIHNpemVvZihGWF9XT1JEKSAqIDIgLSBzaXplb2YoRlhfRFdPUkQpICogMikgeworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gZHdDb3VudDsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgICBpZiAocCA+IHBCdWZmZXIgKyBuTGVuZ3RoKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBGWF9EV09SRCBkd05hbWVMZW4gPSAqKChGWF9EV09SRCopcCk7CisgICAgICAgICAgcCArPSBzaXplb2YoRlhfRFdPUkQpOworCisgICAgICAgICAgaWYgKHAgKyBkd05hbWVMZW4gPiBwQnVmZmVyICsgbkxlbmd0aCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0VudHJ5ID0gQ0ZYX0J5dGVTdHJpbmcocCwgZHdOYW1lTGVuKTsKKyAgICAgICAgICBwICs9IHNpemVvZihjaGFyKSAqIGR3TmFtZUxlbjsKKworICAgICAgICAgIEZYX1dPUkQgd0RhdGFUeXBlID0gKigoRlhfV09SRCopcCk7CisgICAgICAgICAgcCArPSBzaXplb2YoRlhfV09SRCk7CisKKyAgICAgICAgICBzd2l0Y2ggKHdEYXRhVHlwZSkgeworICAgICAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSOiB7CisgICAgICAgICAgICAgIGRvdWJsZSBkRGF0YSA9IDA7CisgICAgICAgICAgICAgIHN3aXRjaCAod1ZlcnNpb24pIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IHsKKyAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RGF0YSA9ICooKEZYX0RXT1JEKilwKTsKKyAgICAgICAgICAgICAgICAgIHAgKz0gc2l6ZW9mKEZYX0RXT1JEKTsKKyAgICAgICAgICAgICAgICAgIGREYXRhID0gZHdEYXRhOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOiB7CisgICAgICAgICAgICAgICAgICBkRGF0YSA9ICooKGRvdWJsZSopcCk7CisgICAgICAgICAgICAgICAgICBwICs9IHNpemVvZihkb3VibGUpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVOdW1iZXIoc0VudHJ5LCBkRGF0YSk7CisgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChzRW50cnksIFRSVUUpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU46IHsKKyAgICAgICAgICAgICAgRlhfV09SRCB3RGF0YSA9ICooKEZYX1dPUkQqKXApOworICAgICAgICAgICAgICBwICs9IHNpemVvZihGWF9XT1JEKTsKKyAgICAgICAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVCb29sZWFuKHNFbnRyeSwgKGJvb2wpKHdEYXRhID09IDEpKTsKKyAgICAgICAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KHNFbnRyeSwgVFJVRSk7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HOiB7CisgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TGVuZ3RoID0gKigoRlhfRFdPUkQqKXApOworICAgICAgICAgICAgICBwICs9IHNpemVvZihGWF9EV09SRCk7CisKKyAgICAgICAgICAgICAgaWYgKHAgKyBkd0xlbmd0aCA+IHBCdWZmZXIgKyBuTGVuZ3RoKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlU3RyaW5nKHNFbnRyeSwgQ0ZYX0J5dGVTdHJpbmcocCwgZHdMZW5ndGgpKTsKKyAgICAgICAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KHNFbnRyeSwgVFJVRSk7CisgICAgICAgICAgICAgIHAgKz0gc2l6ZW9mKGNoYXIpICogZHdMZW5ndGg7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTDogeworICAgICAgICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZU51bGwoc0VudHJ5KTsKKyAgICAgICAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KHNFbnRyeSwgVFJVRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIEZYX0ZyZWUocEJ1ZmZlcik7CisgIH0KIH0KIAotdm9pZCBDSlNfR2xvYmFsRGF0YTo6V3JpdGVGaWxlQnVmZmVyKEZYX0xQQ1dTVFIgc0ZpbGVQYXRoLCBGWF9MUENTVFIgcEJ1ZmZlciwgRlhfSU5UMzIgbkxlbmd0aCkKLXsKLS8vVW5TdXBwb3J0Lgordm9pZCBDSlNfR2xvYmFsRGF0YTo6U2F2ZUdsb2JhbFBlcnNpc2l0ZW50VmFyaWFibGVzKCkgeworICBGWF9EV09SRCBuQ291bnQgPSAwOworICBDRlhfQmluYXJ5QnVmIHNEYXRhOworCisgIGZvciAoaW50IGkgPSAwLCBzeiA9IG1fYXJyYXlHbG9iYWxEYXRhLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBwRWxlbWVudCA9IG1fYXJyYXlHbG9iYWxEYXRhLkdldEF0KGkpOworICAgIGlmIChwRWxlbWVudC0+YlBlcnNpc3RlbnQpIHsKKyAgICAgIENGWF9CaW5hcnlCdWYgc0VsZW1lbnQ7CisgICAgICBNYWtlQnl0ZVN0cmluZyhwRWxlbWVudC0+ZGF0YS5zS2V5LCAmcEVsZW1lbnQtPmRhdGEsIHNFbGVtZW50KTsKKworICAgICAgaWYgKHNEYXRhLkdldFNpemUoKSArIHNFbGVtZW50LkdldFNpemUoKSA+IEpTX01BWEdMT0JBTERBVEEpCisgICAgICAgIGJyZWFrOworCisgICAgICBzRGF0YS5BcHBlbmRCbG9jayhzRWxlbWVudC5HZXRCdWZmZXIoKSwgc0VsZW1lbnQuR2V0U2l6ZSgpKTsKKyAgICAgIG5Db3VudCsrOworICAgIH0KKyAgfQorCisgIENGWF9CaW5hcnlCdWYgc0ZpbGU7CisKKyAgRlhfV09SRCB3VHlwZSA9IChGWF9XT1JEKSgoJ1gnIDw8IDgpIHwgJ0YnKTsKKyAgc0ZpbGUuQXBwZW5kQmxvY2soJndUeXBlLCBzaXplb2YoRlhfV09SRCkpOworICBGWF9XT1JEIHdWZXJzaW9uID0gMjsKKyAgc0ZpbGUuQXBwZW5kQmxvY2soJndWZXJzaW9uLCBzaXplb2YoRlhfV09SRCkpOworICBzRmlsZS5BcHBlbmRCbG9jaygmbkNvdW50LCBzaXplb2YoRlhfRFdPUkQpKTsKKyAgRlhfRFdPUkQgZHdTaXplID0gc0RhdGEuR2V0U2l6ZSgpOworICBzRmlsZS5BcHBlbmRCbG9jaygmZHdTaXplLCBzaXplb2YoRlhfRFdPUkQpKTsKKworICBzRmlsZS5BcHBlbmRCbG9jayhzRGF0YS5HZXRCdWZmZXIoKSwgc0RhdGEuR2V0U2l6ZSgpKTsKKworICBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayhzRmlsZS5HZXRCdWZmZXIoKSwgc0ZpbGUuR2V0U2l6ZSgpLCBKU19SQzRLRVksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihKU19SQzRLRVkpKTsKKyAgV3JpdGVGaWxlQnVmZmVyKG1fc0ZpbGVQYXRoLmNfc3RyKCksIChjb25zdCBGWF9DSEFSKilzRmlsZS5HZXRCdWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgIHNGaWxlLkdldFNpemUoKSk7CiB9CiAKLXZvaWQgQ0pTX0dsb2JhbERhdGE6Ok1ha2VCeXRlU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLCBDSlNfS2V5VmFsdWUqIHBEYXRhLCBDRlhfQmluYXJ5QnVmJiBzRGF0YSkKLXsKLQlBU1NFUlQocERhdGEgIT0gTlVMTCk7Ci0KLQlGWF9XT1JEIHdUeXBlID0gKEZYX1dPUkQpcERhdGEtPm5UeXBlOwotCi0Jc3dpdGNoICh3VHlwZSkKLQl7Ci0JY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSOgotCQl7Ci0JCQlGWF9EV09SRCBkd05hbWVMZW4gPSAoRlhfRFdPUkQpbmFtZS5HZXRMZW5ndGgoKTsKLQkJCXNEYXRhLkFwcGVuZEJsb2NrKCZkd05hbWVMZW4sIHNpemVvZihGWF9EV09SRCkpOwotCQkJc0RhdGEuQXBwZW5kU3RyaW5nKG5hbWUpOwotCi0JCQlzRGF0YS5BcHBlbmRCbG9jaygmd1R5cGUsIHNpemVvZihGWF9XT1JEKSk7Ci0JCQlkb3VibGUgZERhdGEgPSBwRGF0YS0+ZERhdGE7Ci0JCQlzRGF0YS5BcHBlbmRCbG9jaygmZERhdGEsIHNpemVvZihkb3VibGUpKTsKLQkJfQotCQlicmVhazsKLQljYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9CT09MRUFOOgotCQl7Ci0JCQlGWF9EV09SRCBkd05hbWVMZW4gPSAoRlhfRFdPUkQpbmFtZS5HZXRMZW5ndGgoKTsKLQkJCXNEYXRhLkFwcGVuZEJsb2NrKCZkd05hbWVMZW4sIHNpemVvZihGWF9EV09SRCkpOwotCQkJc0RhdGEuQXBwZW5kU3RyaW5nKG5hbWUpOwotCi0JCQlzRGF0YS5BcHBlbmRCbG9jaygmd1R5cGUsIHNpemVvZihGWF9XT1JEKSk7Ci0JCQlGWF9XT1JEIHdEYXRhID0gKEZYX1dPUkQpcERhdGEtPmJEYXRhOwotCQkJc0RhdGEuQXBwZW5kQmxvY2soJndEYXRhLCBzaXplb2YoRlhfV09SRCkpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX1NUUklORzoKLQkJewotCQkJRlhfRFdPUkQgZHdOYW1lTGVuID0gKEZYX0RXT1JEKW5hbWUuR2V0TGVuZ3RoKCk7Ci0JCQlzRGF0YS5BcHBlbmRCbG9jaygmZHdOYW1lTGVuLCBzaXplb2YoRlhfRFdPUkQpKTsKLQkJCXNEYXRhLkFwcGVuZFN0cmluZyhuYW1lKTsKLQotCQkJc0RhdGEuQXBwZW5kQmxvY2soJndUeXBlLCBzaXplb2YoRlhfV09SRCkpOwotCi0JCQlGWF9EV09SRCBkd0RhdGFMZW4gPSAoRlhfRFdPUkQpcERhdGEtPnNEYXRhLkdldExlbmd0aCgpOwotCQkJc0RhdGEuQXBwZW5kQmxvY2soJmR3RGF0YUxlbiwgc2l6ZW9mKEZYX0RXT1JEKSk7Ci0JCQlzRGF0YS5BcHBlbmRTdHJpbmcocERhdGEtPnNEYXRhKTsKLQkJfQotCQlicmVhazsKLQljYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVUxMOgotCQl7Ci0JCQlGWF9EV09SRCBkd05hbWVMZW4gPSAoRlhfRFdPUkQpbmFtZS5HZXRMZW5ndGgoKTsKLQkJCXNEYXRhLkFwcGVuZEJsb2NrKCZkd05hbWVMZW4sIHNpemVvZihGWF9EV09SRCkpOwotCQkJc0RhdGEuQXBwZW5kU3RyaW5nKG5hbWUpOwotCi0JCQlzRGF0YS5BcHBlbmRCbG9jaygmd1R5cGUsIHNpemVvZihGWF9EV09SRCkpOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KK3ZvaWQgQ0pTX0dsb2JhbERhdGE6OkxvYWRGaWxlQnVmZmVyKGNvbnN0IEZYX1dDSEFSKiBzRmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5MZW5ndGgpIHsKKyAgLy8gVW5TdXBwb3J0LgogfQogCit2b2lkIENKU19HbG9iYWxEYXRhOjpXcml0ZUZpbGVCdWZmZXIoY29uc3QgRlhfV0NIQVIqIHNGaWxlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbkxlbmd0aCkgeworICAvLyBVblN1cHBvcnQuCit9CisKK3ZvaWQgQ0pTX0dsb2JhbERhdGE6Ok1ha2VCeXRlU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX0tleVZhbHVlKiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CaW5hcnlCdWYmIHNEYXRhKSB7CisgIEZYX1dPUkQgd1R5cGUgPSAoRlhfV09SRClwRGF0YS0+blR5cGU7CisgIHN3aXRjaCAod1R5cGUpIHsKKyAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVI6IHsKKyAgICAgIEZYX0RXT1JEIGR3TmFtZUxlbiA9IChGWF9EV09SRCluYW1lLkdldExlbmd0aCgpOworICAgICAgc0RhdGEuQXBwZW5kQmxvY2soJmR3TmFtZUxlbiwgc2l6ZW9mKEZYX0RXT1JEKSk7CisgICAgICBzRGF0YS5BcHBlbmRTdHJpbmcobmFtZSk7CisgICAgICBzRGF0YS5BcHBlbmRCbG9jaygmd1R5cGUsIHNpemVvZihGWF9XT1JEKSk7CisKKyAgICAgIGRvdWJsZSBkRGF0YSA9IHBEYXRhLT5kRGF0YTsKKyAgICAgIHNEYXRhLkFwcGVuZEJsb2NrKCZkRGF0YSwgc2l6ZW9mKGRvdWJsZSkpOworICAgIH0gYnJlYWs7CisgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfQk9PTEVBTjogeworICAgICAgRlhfRFdPUkQgZHdOYW1lTGVuID0gKEZYX0RXT1JEKW5hbWUuR2V0TGVuZ3RoKCk7CisgICAgICBzRGF0YS5BcHBlbmRCbG9jaygmZHdOYW1lTGVuLCBzaXplb2YoRlhfRFdPUkQpKTsKKyAgICAgIHNEYXRhLkFwcGVuZFN0cmluZyhuYW1lKTsKKyAgICAgIHNEYXRhLkFwcGVuZEJsb2NrKCZ3VHlwZSwgc2l6ZW9mKEZYX1dPUkQpKTsKKworICAgICAgRlhfV09SRCB3RGF0YSA9IChGWF9XT1JEKXBEYXRhLT5iRGF0YTsKKyAgICAgIHNEYXRhLkFwcGVuZEJsb2NrKCZ3RGF0YSwgc2l6ZW9mKEZYX1dPUkQpKTsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX1NUUklORzogeworICAgICAgRlhfRFdPUkQgZHdOYW1lTGVuID0gKEZYX0RXT1JEKW5hbWUuR2V0TGVuZ3RoKCk7CisgICAgICBzRGF0YS5BcHBlbmRCbG9jaygmZHdOYW1lTGVuLCBzaXplb2YoRlhfRFdPUkQpKTsKKyAgICAgIHNEYXRhLkFwcGVuZFN0cmluZyhuYW1lKTsKKyAgICAgIHNEYXRhLkFwcGVuZEJsb2NrKCZ3VHlwZSwgc2l6ZW9mKEZYX1dPUkQpKTsKKworICAgICAgRlhfRFdPUkQgZHdEYXRhTGVuID0gKEZYX0RXT1JEKXBEYXRhLT5zRGF0YS5HZXRMZW5ndGgoKTsKKyAgICAgIHNEYXRhLkFwcGVuZEJsb2NrKCZkd0RhdGFMZW4sIHNpemVvZihGWF9EV09SRCkpOworICAgICAgc0RhdGEuQXBwZW5kU3RyaW5nKHBEYXRhLT5zRGF0YSk7CisgICAgfSBicmVhazsKKyAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVUxMOiB7CisgICAgICBGWF9EV09SRCBkd05hbWVMZW4gPSAoRlhfRFdPUkQpbmFtZS5HZXRMZW5ndGgoKTsKKyAgICAgIHNEYXRhLkFwcGVuZEJsb2NrKCZkd05hbWVMZW4sIHNpemVvZihGWF9EV09SRCkpOworICAgICAgc0RhdGEuQXBwZW5kU3RyaW5nKG5hbWUpOworICAgICAgc0RhdGEuQXBwZW5kQmxvY2soJndUeXBlLCBzaXplb2YoRlhfRFdPUkQpKTsKKyAgICB9IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19HbG9iYWxEYXRhLmggYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTA3ZmE4Ci0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19HbG9iYWxEYXRhLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGUERGU0RLX1NSQ19KQVZBU0NSSVBUX0pTX0dMT0JBTERBVEFfSF8KKyNkZWZpbmUgRlBERlNES19TUkNfSkFWQVNDUklQVF9KU19HTE9CQUxEQVRBX0hfCisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKKworI2RlZmluZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSIDAKKyNkZWZpbmUgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU4gMQorI2RlZmluZSBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HIDIKKyNkZWZpbmUgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVCAzCisjZGVmaW5lIEpTX0dMT0JBTERBVEFfVFlQRV9OVUxMIDQKKworY2xhc3MgQ0pTX0tleVZhbHVlOworY2xhc3MgQ1BERkRvY19FbnZpcm9ubWVudDsKKworY2xhc3MgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkgeworIHB1YmxpYzoKKyAgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkoKTsKKyAgdmlydHVhbCB+Q0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkoKTsKKworICB2b2lkIEFkZChDSlNfS2V5VmFsdWUqIHApOworICBpbnQgQ291bnQoKSBjb25zdDsKKyAgQ0pTX0tleVZhbHVlKiBHZXRBdChpbnQgaW5kZXgpIGNvbnN0OworICB2b2lkIENvcHkoY29uc3QgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkmIGFycmF5KTsKKworICB2b2lkIEVtcHR5KCk7CisKKyBwcml2YXRlOgorICBDRlhfQXJyYXlUZW1wbGF0ZTxDSlNfS2V5VmFsdWUqPiBhcnJheTsKK307CisKK2NsYXNzIENKU19LZXlWYWx1ZSB7CisgcHVibGljOgorICBDSlNfS2V5VmFsdWUoKSB7fQorICB2aXJ0dWFsIH5DSlNfS2V5VmFsdWUoKSB7fQorCisgIENGWF9CeXRlU3RyaW5nIHNLZXk7CisgIGludCBuVHlwZTsgIC8vIDA6aW50IDE6Ym9vbCAyOnN0cmluZyAzOm9iagorICBkb3VibGUgZERhdGE7CisgIGJvb2wgYkRhdGE7CisgIENGWF9CeXRlU3RyaW5nIHNEYXRhOworICBDSlNfR2xvYmFsVmFyaWFibGVBcnJheSBvYmpEYXRhOworfTsKKworY2xhc3MgQ0pTX0dsb2JhbERhdGFfRWxlbWVudCB7CisgcHVibGljOgorICBDSlNfR2xvYmFsRGF0YV9FbGVtZW50KCkge30KKyAgdmlydHVhbCB+Q0pTX0dsb2JhbERhdGFfRWxlbWVudCgpIHt9CisKKyAgQ0pTX0tleVZhbHVlIGRhdGE7CisgIEZYX0JPT0wgYlBlcnNpc3RlbnQ7Cit9OworCitjbGFzcyBDSlNfR2xvYmFsRGF0YSB7CisgcHVibGljOgorICBzdGF0aWMgQ0pTX0dsb2JhbERhdGEqIEdldFJldGFpbmVkSW5zdGFuY2UoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCk7CisgIHZvaWQgUmVsZWFzZSgpOworCisgIHZvaWQgU2V0R2xvYmFsVmFyaWFibGVOdW1iZXIoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUsIGRvdWJsZSBkRGF0YSk7CisgIHZvaWQgU2V0R2xvYmFsVmFyaWFibGVCb29sZWFuKGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lLCBib29sIGJEYXRhKTsKKyAgdm9pZCBTZXRHbG9iYWxWYXJpYWJsZVN0cmluZyhjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0RhdGEpOworICB2b2lkIFNldEdsb2JhbFZhcmlhYmxlT2JqZWN0KGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19HbG9iYWxWYXJpYWJsZUFycmF5JiBhcnJheSk7CisgIHZvaWQgU2V0R2xvYmFsVmFyaWFibGVOdWxsKGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lKTsKKworICBGWF9CT09MIFNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGVyc2lzdGVudCk7CisgIEZYX0JPT0wgRGVsZXRlR2xvYmFsVmFyaWFibGUoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUpOworCisgIGludDMyX3QgR2V0U2l6ZSgpIGNvbnN0OworICBDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBHZXRBdChpbnQgaW5kZXgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgc3RhdGljIENKU19HbG9iYWxEYXRhKiBnX0luc3RhbmNlOworCisgIENKU19HbG9iYWxEYXRhKCk7CisgIH5DSlNfR2xvYmFsRGF0YSgpOworCisgIHZvaWQgTG9hZEdsb2JhbFBlcnNpc3RlbnRWYXJpYWJsZXMoKTsKKyAgdm9pZCBTYXZlR2xvYmFsUGVyc2lzaXRlbnRWYXJpYWJsZXMoKTsKKworICBDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBHZXRHbG9iYWxWYXJpYWJsZShjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSk7CisgIGludCBGaW5kR2xvYmFsVmFyaWFibGUoY29uc3QgRlhfQ0hBUiogcHJvcG5hbWUpOworCisgIHZvaWQgTG9hZEZpbGVCdWZmZXIoY29uc3QgRlhfV0NIQVIqIHNGaWxlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuTGVuZ3RoKTsKKyAgdm9pZCBXcml0ZUZpbGVCdWZmZXIoY29uc3QgRlhfV0NIQVIqIHNGaWxlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuZ3RoKTsKKyAgdm9pZCBNYWtlQnl0ZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBDSlNfS2V5VmFsdWUqIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgIENGWF9CaW5hcnlCdWYmIHNEYXRhKTsKKworICBzaXplX3QgbV9SZWZDb3VudDsKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q0pTX0dsb2JhbERhdGFfRWxlbWVudCo+IG1fYXJyYXlHbG9iYWxEYXRhOworICBDRlhfV2lkZVN0cmluZyBtX3NGaWxlUGF0aDsKK307CisKKyNlbmRpZiAgLy8gRlBERlNES19TUkNfSkFWQVNDUklQVF9KU19HTE9CQUxEQVRBX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX09iamVjdC5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX09iamVjdC5jcHAKaW5kZXggNjZmZDJiNi4uMDU4ZWMwMiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19PYmplY3QuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfT2JqZWN0LmNwcApAQCAtMSwxNTQgKzEsMTU5IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSmF2YVNjcmlwdC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19EZWZpbmUuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgiCi0vLyAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX01zZ0JveC5oIgotLy8gI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19SZXNNZ3IuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oIgorI2luY2x1ZGUgIkpTX09iamVjdC5oIgogCi1KU19USU1FUl9NQVBBUlJBWSYgR2V0VGltZU1hcCgpCi17CisjaW5jbHVkZSAiSlNfQ29udGV4dC5oIgorI2luY2x1ZGUgIkpTX0RlZmluZS5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mc2RrX21nci5oIiAgLy8gRm9yIENQREZEb2NfRW52aXJvbm1lbnQuCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCIKKworbmFtZXNwYWNlIHsKKworaW50IEZYSlNfTXNnQm94KENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsCisgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHN3TXNnLAorICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBzd1RpdGxlLAorICAgICAgICAgICAgICAgIEZYX1VJTlQgblR5cGUsCisgICAgICAgICAgICAgICAgRlhfVUlOVCBuSWNvbikgeworICBpZiAoIXBBcHApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKENQREZTREtfRG9jdW1lbnQqIHBEb2MgPSBwQXBwLT5HZXRTREtEb2N1bWVudCgpKQorICAgIHBEb2MtPktpbGxGb2N1c0Fubm90KCk7CisKKyAgcmV0dXJuIHBBcHAtPkpTX2FwcEFsZXJ0KHN3TXNnLCBzd1RpdGxlLCBuVHlwZSwgbkljb24pOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworQ0pTX0VtYmVkT2JqOjpDSlNfRW1iZWRPYmooQ0pTX09iamVjdCogcEpTT2JqZWN0KSA6IG1fcEpTT2JqZWN0KHBKU09iamVjdCkge30KKworQ0pTX0VtYmVkT2JqOjp+Q0pTX0VtYmVkT2JqKCkgeworICBtX3BKU09iamVjdCA9IE5VTEw7Cit9CisKK2ludCBDSlNfRW1iZWRPYmo6Ok1zZ0JveChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBzd01zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogc3dUaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VSU5UIG5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkljb24pIHsKKyAgcmV0dXJuIEZYSlNfTXNnQm94KHBBcHAsIHN3TXNnLCBzd1RpdGxlLCBuVHlwZSwgbkljb24pOworfQorCit2b2lkIENKU19FbWJlZE9iajo6QWxlcnQoQ0pTX0NvbnRleHQqIHBDb250ZXh0LCBjb25zdCBGWF9XQ0hBUiogc3dNc2cpIHsKKyAgQ0pTX09iamVjdDo6QWxlcnQocENvbnRleHQsIHN3TXNnKTsKK30KKwordm9pZCBGcmVlT2JqZWN0KGNvbnN0IHY4OjpXZWFrQ2FsbGJhY2tJbmZvPENKU19PYmplY3Q+JiBkYXRhKSB7CisgIENKU19PYmplY3QqIHBKU09iaiA9IGRhdGEuR2V0UGFyYW1ldGVyKCk7CisgIHBKU09iai0+RXhpdEluc3RhbmNlKCk7CisgIGRlbGV0ZSBwSlNPYmo7CisgIEZYSlNfRnJlZVByaXZhdGUoZGF0YS5HZXRJbnRlcm5hbEZpZWxkKDApKTsKK30KKwordm9pZCBEaXNwb3NlT2JqZWN0KGNvbnN0IHY4OjpXZWFrQ2FsbGJhY2tJbmZvPENKU19PYmplY3Q+JiBkYXRhKSB7CisgIENKU19PYmplY3QqIHBKU09iaiA9IGRhdGEuR2V0UGFyYW1ldGVyKCk7CisgIHBKU09iai0+RGlzcG9zZSgpOworICBkYXRhLlNldFNlY29uZFBhc3NDYWxsYmFjayhGcmVlT2JqZWN0KTsKK30KKworQ0pTX09iamVjdDo6Q0pTX09iamVjdCh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkgeworICBtX3BJc29sYXRlID0gcE9iamVjdC0+R2V0SXNvbGF0ZSgpOworICBtX3BWOE9iamVjdC5SZXNldChtX3BJc29sYXRlLCBwT2JqZWN0KTsKK30KKworQ0pTX09iamVjdDo6fkNKU19PYmplY3QoKSB7Cit9CisKK3ZvaWQgQ0pTX09iamVjdDo6TWFrZVdlYWsoKSB7CisgIG1fcFY4T2JqZWN0LlNldFdlYWsodGhpcywgRGlzcG9zZU9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICB2ODo6V2Vha0NhbGxiYWNrVHlwZTo6a0ludGVybmFsRmllbGRzKTsKK30KKwordm9pZCBDSlNfT2JqZWN0OjpEaXNwb3NlKCkgeworICBtX3BWOE9iamVjdC5SZXNldCgpOworfQorCitpbnQgQ0pTX09iamVjdDo6TXNnQm94KENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBzd01zZywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHN3VGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkljb24pIHsKKyAgcmV0dXJuIEZYSlNfTXNnQm94KHBBcHAsIHN3TXNnLCBzd1RpdGxlLCBuVHlwZSwgbkljb24pOworfQorCit2b2lkIENKU19PYmplY3Q6OkFsZXJ0KENKU19Db250ZXh0KiBwQ29udGV4dCwgY29uc3QgRlhfV0NIQVIqIHN3TXNnKSB7CisgIGlmIChwQ29udGV4dC0+SXNNc2dCb3hFbmFibGVkKCkpIHsKKyAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwID0gcENvbnRleHQtPkdldFJlYWRlckFwcCgpOworICAgIGlmIChwQXBwKQorICAgICAgcEFwcC0+SlNfYXBwQWxlcnQoc3dNc2csIE5VTEwsIDAsIDMpOworICB9Cit9CisKK0NKU19UaW1lcjo6Q0pTX1RpbWVyKENKU19FbWJlZE9iaiogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsCisgICAgICAgICAgICAgICAgICAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgblR5cGUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LAorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdFbGFwc2UsCisgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1RpbWVPdXQpCisgICAgOiBtX25UaW1lcklEKDApLAorICAgICAgbV9wRW1iZWRPYmoocE9iaiksCisgICAgICBtX2JQcm9jZXNzaW5nKGZhbHNlKSwKKyAgICAgIG1fYlZhbGlkKHRydWUpLAorICAgICAgbV9uVHlwZShuVHlwZSksCisgICAgICBtX2R3VGltZU91dChkd1RpbWVPdXQpLAorICAgICAgbV9zd0pTY3JpcHQoc2NyaXB0KSwKKyAgICAgIG1fcFJ1bnRpbWUocFJ1bnRpbWUpLAorICAgICAgbV9wQXBwKHBBcHApIHsKKyAgSUZYX1N5c3RlbUhhbmRsZXIqIHBIYW5kbGVyID0gbV9wQXBwLT5HZXRTeXNIYW5kbGVyKCk7CisgIG1fblRpbWVySUQgPSBwSGFuZGxlci0+U2V0VGltZXIoZHdFbGFwc2UsIFRpbWVyUHJvYyk7CisgICgqR2V0R2xvYmFsVGltZXJNYXAoKSlbbV9uVGltZXJJRF0gPSB0aGlzOworICBtX3BSdW50aW1lLT5BZGRPYnNlcnZlcih0aGlzKTsKK30KKworQ0pTX1RpbWVyOjp+Q0pTX1RpbWVyKCkgeworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBHZXRSdW50aW1lKCk7CisgIGlmIChwUnVudGltZSkKKyAgICBwUnVudGltZS0+UmVtb3ZlT2JzZXJ2ZXIodGhpcyk7CisgIEtpbGxKU1RpbWVyKCk7Cit9CisKK3ZvaWQgQ0pTX1RpbWVyOjpLaWxsSlNUaW1lcigpIHsKKyAgaWYgKG1fblRpbWVySUQpIHsKKyAgICBpZiAobV9iVmFsaWQpIHsKKyAgICAgIElGWF9TeXN0ZW1IYW5kbGVyKiBwSGFuZGxlciA9IG1fcEFwcC0+R2V0U3lzSGFuZGxlcigpOworICAgICAgcEhhbmRsZXItPktpbGxUaW1lcihtX25UaW1lcklEKTsKKyAgICB9CisgICAgR2V0R2xvYmFsVGltZXJNYXAoKS0+ZXJhc2UobV9uVGltZXJJRCk7CisgICAgbV9uVGltZXJJRCA9IDA7CisgIH0KK30KKworLy8gc3RhdGljCit2b2lkIENKU19UaW1lcjo6VGltZXJQcm9jKGludCBpZEV2ZW50KSB7CisgIGNvbnN0IGF1dG8gaXQgPSBHZXRHbG9iYWxUaW1lck1hcCgpLT5maW5kKGlkRXZlbnQpOworICBpZiAoaXQgIT0gR2V0R2xvYmFsVGltZXJNYXAoKS0+ZW5kKCkpIHsKKyAgICBDSlNfVGltZXIqIHBUaW1lciA9IGl0LT5zZWNvbmQ7CisgICAgaWYgKCFwVGltZXItPm1fYlByb2Nlc3NpbmcpIHsKKyAgICAgIENGWF9BdXRvUmVzdG9yZXI8Ym9vbD4gc2NvcGVkX3Byb2Nlc3NpbmcoJnBUaW1lci0+bV9iUHJvY2Vzc2luZyk7CisgICAgICBwVGltZXItPm1fYlByb2Nlc3NpbmcgPSB0cnVlOworICAgICAgaWYgKHBUaW1lci0+bV9wRW1iZWRPYmopCisgICAgICAgIHBUaW1lci0+bV9wRW1iZWRPYmotPlRpbWVyUHJvYyhwVGltZXIpOworICAgIH0KKyAgfQorfQorCisvLyBzdGF0aWMKK0NKU19UaW1lcjo6VGltZXJNYXAqIENKU19UaW1lcjo6R2V0R2xvYmFsVGltZXJNYXAoKSB7CiAgIC8vIExlYWsgdGhlIHRpbWVyIGFycmF5IGF0IHNodXRkb3duLgotICBzdGF0aWMgYXV0byogdGltZU1hcCA9IG5ldyBKU19USU1FUl9NQVBBUlJBWTsKLSAgcmV0dXJuICp0aW1lTWFwOworICBzdGF0aWMgYXV0byogc19UaW1lck1hcCA9IG5ldyBUaW1lck1hcDsKKyAgcmV0dXJuIHNfVGltZXJNYXA7CiB9CiAKLWludCBGWEpTX01zZ0JveChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0xQQ1dTVFIgc3dNc2csIEZYX0xQQ1dTVFIgc3dUaXRsZSwgRlhfVUlOVCBuVHlwZSwgRlhfVUlOVCBuSWNvbikKLXsKLQlpbnQgblJldCA9IDA7Ci0KLQlpZihwQXBwKQotCXsKLQkJQ1BERlNES19Eb2N1bWVudCogcERvYyA9IHBBcHAtPkdldEN1cnJlbnREb2MoKTsKLQkJaWYocERvYykKLQkJCXBEb2MtPktpbGxGb2N1c0Fubm90KCk7Ci0JCW5SZXQgPSBwQXBwLT5KU19hcHBBbGVydChzd01zZywgc3dUaXRsZSwgblR5cGUsIG5JY29uKTsKLQl9Ci0KLQlyZXR1cm4gblJldDsKK3ZvaWQgQ0pTX1RpbWVyOjpPbkRlc3Ryb3llZCgpIHsKKyAgbV9iVmFsaWQgPSBmYWxzZTsKIH0KLQotQ1BERlNES19QYWdlVmlldyogRlhKU19HZXRQYWdlVmlldyhJRlhKU19Db250ZXh0KiBjYykKLXsKLQlpZiAoQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2MpCi0JewotCQlpZiAocENvbnRleHQtPkdldFJlYWRlckRvY3VtZW50KCkpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgQ0pTX0VtYmVkT2JqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1DSlNfRW1iZWRPYmo6OkNKU19FbWJlZE9iaihDSlNfT2JqZWN0KiBwSlNPYmplY3QpIDogCi0JbV9wSlNPYmplY3QocEpTT2JqZWN0KQotewotfQotCi1DSlNfRW1iZWRPYmo6On5DSlNfRW1iZWRPYmooKQotewotCW1fcEpTT2JqZWN0ID0gTlVMTDsKLQotfQotCi1DUERGU0RLX1BhZ2VWaWV3KiBDSlNfRW1iZWRPYmo6OkpTR2V0UGFnZVZpZXcoSUZYSlNfQ29udGV4dCogY2MpCi17Ci0JcmV0dXJuIEZYSlNfR2V0UGFnZVZpZXcoY2MpOwotfQotCi1pbnQgQ0pTX0VtYmVkT2JqOjpNc2dCb3goQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LEZYX0xQQ1dTVFIgc3dNc2csRlhfTFBDV1NUUiBzd1RpdGxlLEZYX1VJTlQgblR5cGUsRlhfVUlOVCBuSWNvbikKLXsKLQlyZXR1cm4gRlhKU19Nc2dCb3gocEFwcCwgcFBhZ2VWaWV3LCBzd01zZywgc3dUaXRsZSwgblR5cGUsIG5JY29uKTsKLX0KLQotdm9pZCBDSlNfRW1iZWRPYmo6OkFsZXJ0KENKU19Db250ZXh0KiBwQ29udGV4dCwgRlhfTFBDV1NUUiBzd01zZykKLXsKLQlDSlNfT2JqZWN0OjpBbGVydChwQ29udGV4dCwgc3dNc2cpOwotfQotCi1DSlNfVGltZXIqIENKU19FbWJlZE9iajo6QmVnaW5UaW1lcihDUERGRG9jX0Vudmlyb25tZW50ICogcEFwcCxGWF9VSU5UIG5FbGFwc2UpCi17Ci0JQ0pTX1RpbWVyKiBwVGltZXIgPSBuZXcgQ0pTX1RpbWVyKHRoaXMscEFwcCk7Ci0JcFRpbWVyLT5TZXRKU1RpbWVyKG5FbGFwc2UpOwotCQotCXJldHVybiBwVGltZXI7Ci19Ci0KLXZvaWQgQ0pTX0VtYmVkT2JqOjpFbmRUaW1lcihDSlNfVGltZXIqIHBUaW1lcikKLXsKLQlBU1NFUlQocFRpbWVyICE9IE5VTEwpOwotCXBUaW1lci0+S2lsbEpTVGltZXIoKTsKLQlkZWxldGUgcFRpbWVyOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIENKU19PYmplY3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkICBGcmVlT2JqZWN0KGNvbnN0IHY4OjpXZWFrQ2FsbGJhY2tJbmZvPENKU19PYmplY3Q+JiBkYXRhKQotewotCUNKU19PYmplY3QqIHBKU09iaiAgPSBkYXRhLkdldFBhcmFtZXRlcigpOwotICAgICAgICBwSlNPYmotPkV4aXRJbnN0YW5jZSgpOwotICAgICAgICBkZWxldGUgcEpTT2JqOwotCUpTX0ZyZWVQcml2YXRlKGRhdGEuR2V0SW50ZXJuYWxGaWVsZCgwKSk7Ci19Ci0KLXZvaWQgIERpc3Bvc2VPYmplY3QoY29uc3Qgdjg6OldlYWtDYWxsYmFja0luZm88Q0pTX09iamVjdD4mIGRhdGEpCi17Ci0JQ0pTX09iamVjdCogcEpTT2JqICA9IGRhdGEuR2V0UGFyYW1ldGVyKCk7Ci0gICAgICAgIHBKU09iai0+RGlzcG9zZSgpOwotICAgICAgICBkYXRhLlNldFNlY29uZFBhc3NDYWxsYmFjayhGcmVlT2JqZWN0KTsKLX0KLQotQ0pTX09iamVjdDo6Q0pTX09iamVjdChKU0ZYT2JqZWN0IHBPYmplY3QpIDptX3BFbWJlZE9iaihOVUxMKQotewotCXY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IHBPYmplY3QtPkNyZWF0aW9uQ29udGV4dCgpOwotCW1fcElzb2xhdGUgPSBjb250ZXh0LT5HZXRJc29sYXRlKCk7Ci0JbV9wT2JqZWN0LlJlc2V0KG1fcElzb2xhdGUsIHBPYmplY3QpOwotfTsKLQotQ0pTX09iamVjdDo6fkNKU19PYmplY3Qodm9pZCkKLXsKLQlkZWxldGUgbV9wRW1iZWRPYmo7Ci0JbV9wRW1iZWRPYmogPSBOVUxMOwotCi0JbV9wT2JqZWN0LlJlc2V0KCk7Ci19OwotCi12b2lkCUNKU19PYmplY3Q6Ok1ha2VXZWFrKCkKLXsKLQltX3BPYmplY3QuU2V0V2VhaygKLSAgICAgICAgICAgIHRoaXMsIERpc3Bvc2VPYmplY3QsIHY4OjpXZWFrQ2FsbGJhY2tUeXBlOjprSW50ZXJuYWxGaWVsZHMpOwotfQotCi12b2lkICAgIENKU19PYmplY3Q6OkRpc3Bvc2UoKQotewotICAgICAgICBtX3BPYmplY3QuUmVzZXQoKTsKLX0KLQotQ1BERlNES19QYWdlVmlldyogQ0pTX09iamVjdDo6SlNHZXRQYWdlVmlldyhJRlhKU19Db250ZXh0KiBjYykKLXsKLQlyZXR1cm4gRlhKU19HZXRQYWdlVmlldyhjYyk7Ci19Ci0KLWludCBDSlNfT2JqZWN0OjpNc2dCb3goQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9MUENXU1RSIHN3TXNnLCBGWF9MUENXU1RSIHN3VGl0bGUsIEZYX1VJTlQgblR5cGUsIEZYX1VJTlQgbkljb24pCi17Ci0JcmV0dXJuIEZYSlNfTXNnQm94KHBBcHAsIHBQYWdlVmlldywgc3dNc2csIHN3VGl0bGUsIG5UeXBlLCBuSWNvbik7Ci19Ci0KLXZvaWQgQ0pTX09iamVjdDo6QWxlcnQoQ0pTX0NvbnRleHQqIHBDb250ZXh0LCBGWF9MUENXU1RSIHN3TXNnKQotewotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQotCWlmIChwQ29udGV4dC0+SXNNc2dCb3hFbmFibGVkKCkpCi0JewotCQlDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwID0gcENvbnRleHQtPkdldFJlYWRlckFwcCgpOwotCQlpZihwQXBwKQotCQkJcEFwcC0+SlNfYXBwQWxlcnQoc3dNc2csIE5VTEwsIDAsIDMpOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX09iamVjdC5oIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19PYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTllNWVjCi0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19PYmplY3QuaApAQCAtMCwwICsxLDExNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZQREZTREtfU1JDX0pBVkFTQ1JJUFRfSlNfT0JKRUNUX0hfCisjZGVmaW5lIEZQREZTREtfU1JDX0pBVkFTQ1JJUFRfSlNfT0JKRUNUX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiSlNfUnVudGltZS5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mc2RrX2RlZmluZS5oIiAgLy8gRm9yIEZYX1VJTlQKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvanNhcGkvZnhqc192OC5oIgorCitjbGFzcyBDSlNfQ29udGV4dDsKK2NsYXNzIENKU19PYmplY3Q7CitjbGFzcyBDSlNfVGltZXI7CitjbGFzcyBDUERGRG9jX0Vudmlyb25tZW50OworY2xhc3MgQ0pTX0VtYmVkT2JqIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKU19FbWJlZE9iaihDSlNfT2JqZWN0KiBwSlNPYmplY3QpOworICB2aXJ0dWFsIH5DSlNfRW1iZWRPYmooKTsKKworICB2aXJ0dWFsIHZvaWQgVGltZXJQcm9jKENKU19UaW1lciogcFRpbWVyKSB7fQorCisgIENKU19PYmplY3QqIEdldEpTT2JqZWN0KCkgY29uc3QgeyByZXR1cm4gbV9wSlNPYmplY3Q7IH0KKworICBpbnQgTXNnQm94KENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsCisgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHN3TXNnLAorICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBzd1RpdGxlLAorICAgICAgICAgICAgIEZYX1VJTlQgblR5cGUsCisgICAgICAgICAgICAgRlhfVUlOVCBuSWNvbik7CisgIHZvaWQgQWxlcnQoQ0pTX0NvbnRleHQqIHBDb250ZXh0LCBjb25zdCBGWF9XQ0hBUiogc3dNc2cpOworCisgcHJvdGVjdGVkOgorICBDSlNfT2JqZWN0KiBtX3BKU09iamVjdDsKK307CisKK2NsYXNzIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pTX09iamVjdCh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCk7CisgIHZpcnR1YWwgfkNKU19PYmplY3QoKTsKKworICB2b2lkIE1ha2VXZWFrKCk7CisgIHZvaWQgRGlzcG9zZSgpOworCisgIHZpcnR1YWwgRlhfQk9PTCBJc1R5cGUoY29uc3QgRlhfQ0hBUiogc0NsYXNzTmFtZSkgeyByZXR1cm4gVFJVRTsgfQorICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIEdldENsYXNzTmFtZSgpIHsgcmV0dXJuICIiOyB9CisKKyAgdmlydHVhbCB2b2lkIEluaXRJbnN0YW5jZShJSlNfUnVudGltZSogcElSdW50aW1lKSB7fQorICB2aXJ0dWFsIHZvaWQgRXhpdEluc3RhbmNlKCkge30KKworICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gVG9WOE9iamVjdCgpIHsgcmV0dXJuIG1fcFY4T2JqZWN0LkdldChtX3BJc29sYXRlKTsgfQorCisgIC8vIFRha2VzIG93bmVyc2hpcCBvZiB8cE9ianwuCisgIHZvaWQgU2V0RW1iZWRPYmplY3QoQ0pTX0VtYmVkT2JqKiBwT2JqKSB7IG1fcEVtYmVkT2JqLnJlc2V0KHBPYmopOyB9CisgIENKU19FbWJlZE9iaiogR2V0RW1iZWRPYmplY3QoKSBjb25zdCB7IHJldHVybiBtX3BFbWJlZE9iai5nZXQoKTsgfQorCisgIHN0YXRpYyBpbnQgTXNnQm94KENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBzd01zZywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHN3VGl0bGUsCisgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgblR5cGUsCisgICAgICAgICAgICAgICAgICAgIEZYX1VJTlQgbkljb24pOworICBzdGF0aWMgdm9pZCBBbGVydChDSlNfQ29udGV4dCogcENvbnRleHQsIGNvbnN0IEZYX1dDSEFSKiBzd01zZyk7CisKKyAgdjg6Oklzb2xhdGUqIEdldElzb2xhdGUoKSB7IHJldHVybiBtX3BJc29sYXRlOyB9CisKKyBwcm90ZWN0ZWQ6CisgIHN0ZDo6dW5pcXVlX3B0cjxDSlNfRW1iZWRPYmo+IG1fcEVtYmVkT2JqOworICB2ODo6R2xvYmFsPHY4OjpPYmplY3Q+IG1fcFY4T2JqZWN0OworICB2ODo6SXNvbGF0ZSogbV9wSXNvbGF0ZTsKK307CisKK2NsYXNzIENKU19UaW1lciA6IHB1YmxpYyBDSlNfUnVudGltZTo6T2JzZXJ2ZXIgeworIHB1YmxpYzoKKyAgQ0pTX1RpbWVyKENKU19FbWJlZE9iaiogcE9iaiwKKyAgICAgICAgICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAsCisgICAgICAgICAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICBpbnQgblR5cGUsCisgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LAorICAgICAgICAgICAgRlhfRFdPUkQgZHdFbGFwc2UsCisgICAgICAgICAgICBGWF9EV09SRCBkd1RpbWVPdXQpOworICB+Q0pTX1RpbWVyKCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBLaWxsSlNUaW1lcigpOworCisgIGludCBHZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gbV9uVHlwZTsgfQorICBGWF9EV09SRCBHZXRUaW1lT3V0KCkgY29uc3QgeyByZXR1cm4gbV9kd1RpbWVPdXQ7IH0KKyAgQ0pTX1J1bnRpbWUqIEdldFJ1bnRpbWUoKSBjb25zdCB7IHJldHVybiBtX2JWYWxpZCA/IG1fcFJ1bnRpbWUgOiBudWxscHRyOyB9CisgIENGWF9XaWRlU3RyaW5nIEdldEpTY3JpcHQoKSBjb25zdCB7IHJldHVybiBtX3N3SlNjcmlwdDsgfQorCisgIHN0YXRpYyB2b2lkIFRpbWVyUHJvYyhpbnQgaWRFdmVudCk7CisKKyBwcml2YXRlOgorICB1c2luZyBUaW1lck1hcCA9IHN0ZDo6bWFwPEZYX1VJTlQsIENKU19UaW1lcio+OworICBzdGF0aWMgVGltZXJNYXAqIEdldEdsb2JhbFRpbWVyTWFwKCk7CisKKyAgLy8gQ0pTX1J1bnRpbWU6Ok9ic2VydmVyCisgIHZvaWQgT25EZXN0cm95ZWQoKSBvdmVycmlkZTsKKworICBGWF9EV09SRCBtX25UaW1lcklEOworICBDSlNfRW1iZWRPYmoqIGNvbnN0IG1fcEVtYmVkT2JqOworICBib29sIG1fYlByb2Nlc3Npbmc7CisgIGJvb2wgbV9iVmFsaWQ7CisKKyAgLy8gZGF0YQorICBjb25zdCBpbnQgbV9uVHlwZTsgIC8vIDA6SW50ZXJ2YWw7IDE6VGltZU91dAorICBjb25zdCBGWF9EV09SRCBtX2R3VGltZU91dDsKKyAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgbV9zd0pTY3JpcHQ7CisgIENKU19SdW50aW1lKiBjb25zdCBtX3BSdW50aW1lOworICBDUERGRG9jX0Vudmlyb25tZW50KiBjb25zdCBtX3BBcHA7Cit9OworCisjZW5kaWYgIC8vIEZQREZTREtfU1JDX0pBVkFTQ1JJUFRfSlNfT0JKRUNUX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19SdW50aW1lLmNwcAppbmRleCAzMWQ2MWUzLi5iYTZkNzQ4IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfUnVudGltZS5jcHAKQEAgLTEsMzQxICsxLDMzNyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0phdmFTY3JpcHQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19EZWZpbmUuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1ZhbHVlLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0RvY3VtZW50LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L2FwcC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9jb2xvci5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9Db25zdHMuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvRG9jdW1lbnQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvZXZlbnQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvRmllbGQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSWNvbi5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L3JlcG9ydC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC91dGlsLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvZ2xvYmFsLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L2NvbnNvbGUuaCIKKyNpbmNsdWRlICJKU19SdW50aW1lLmgiCiAKLUNKU19SdW50aW1lRmFjdG9yeTo6fkNKU19SdW50aW1lRmFjdG9yeSgpCi17CisjaW5jbHVkZSAiQ29uc3RzLmgiCisjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJGaWVsZC5oIgorI2luY2x1ZGUgIkljb24uaCIKKyNpbmNsdWRlICJKU19Db250ZXh0LmgiCisjaW5jbHVkZSAiSlNfRGVmaW5lLmgiCisjaW5jbHVkZSAiSlNfRXZlbnRIYW5kbGVyLmgiCisjaW5jbHVkZSAiSlNfR2xvYmFsRGF0YS5oIgorI2luY2x1ZGUgIkpTX09iamVjdC5oIgorI2luY2x1ZGUgIkpTX1ZhbHVlLmgiCisjaW5jbHVkZSAiUHVibGljTWV0aG9kcy5oIgorI2luY2x1ZGUgImFwcC5oIgorI2luY2x1ZGUgImNvbG9yLmgiCisjaW5jbHVkZSAiY29uc29sZS5oIgorI2luY2x1ZGUgImV2ZW50LmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZzZGtfbWdyLmgiICAvLyBGb3IgQ1BERkRvY19FbnZpcm9ubWVudC4KKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oIgorI2luY2x1ZGUgImdsb2JhbC5oIgorI2luY2x1ZGUgInJlcG9ydC5oIgorI2luY2x1ZGUgInV0aWwuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfYXBwLmgiCisjaW5jbHVkZSAieGZhL3NyYy9meGpzZS9zcmMvdmFsdWUuaCIKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworLy8gc3RhdGljCit2b2lkIElKU19SdW50aW1lOjpJbml0aWFsaXplKHVuc2lnbmVkIGludCBzbG90LCB2b2lkKiBpc29sYXRlKSB7CisgIEZYSlNfSW5pdGlhbGl6ZShzbG90LCByZWludGVycHJldF9jYXN0PHY4OjpJc29sYXRlKj4oaXNvbGF0ZSkpOwogfQogCi1JRlhKU19SdW50aW1lKgkJCQkJQ0pTX1J1bnRpbWVGYWN0b3J5OjpOZXdKU1J1bnRpbWUoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCkKLXsKLQlpZiAoIW1fYkluaXQpCi0JewotCQlKU19Jbml0aWFsKCk7Ci0JCW1fYkluaXQgPSBUUlVFOwotCX0KLQlyZXR1cm4gbmV3IENKU19SdW50aW1lKHBBcHApOwotfQotdm9pZAkJCQkJCQlDSlNfUnVudGltZUZhY3Rvcnk6OkFkZFJlZigpCi17Ci0JLy90byBkby5TaG91bGQgYmUgaW1wbGVtZW50ZWQgYXMgYXRvbSBtYW5pcHVsYXRpb24uCi0JbV9uUmVmKys7Ci19Ci12b2lkCQkJCQkJCUNKU19SdW50aW1lRmFjdG9yeTo6UmVsZWFzZSgpCi17CQotCWlmKG1fYkluaXQpCi0JewotCQkvL3RvIGRvLlNob3VsZCBiZSBpbXBsZW1lbnRlZCBhcyBhdG9tIG1hbmlwdWxhdGlvbi4KLQkJaWYgKC0tbV9uUmVmID09IDApCi0JCXsKLQkJCUpTX1JlbGVhc2UoKTsKLQkJCVJlbGVhc2VHbG9iYWxEYXRhKCk7Ci0JCQltX2JJbml0ID0gRkFMU0U7Ci0JCX0KLQl9CisvLyBzdGF0aWMKK0lKU19SdW50aW1lKiBJSlNfUnVudGltZTo6Q3JlYXRlKENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYpIHsKKyAgcmV0dXJuIG5ldyBDSlNfUnVudGltZShwRW52KTsKIH0KIAotdm9pZAkJCQkJCQlDSlNfUnVudGltZUZhY3Rvcnk6OkRlbGV0ZUpTUnVudGltZShJRlhKU19SdW50aW1lKiBwUnVudGltZSkKLXsKLQlpZihwUnVudGltZSkKLQkJZGVsZXRlIChDSlNfUnVudGltZSopcFJ1bnRpbWU7CisvLyBzdGF0aWMKK0NKU19SdW50aW1lKiBDSlNfUnVudGltZTo6RnJvbUNvbnRleHQoY29uc3QgSUpTX0NvbnRleHQqIGNjKSB7CisgIGNvbnN0IENKU19Db250ZXh0KiBwQ29udGV4dCA9IHN0YXRpY19jYXN0PGNvbnN0IENKU19Db250ZXh0Kj4oY2MpOworICByZXR1cm4gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwogfQogCi1DSlNfR2xvYmFsRGF0YSoJQ0pTX1J1bnRpbWVGYWN0b3J5OjpOZXdHbG9iYWxEYXRhKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApCi17Ci0JaWYgKG1fcEdsb2JhbERhdGEpCi0JewotCQltX25HbG9iYWxEYXRhQ291bnQrKzsKLQkJcmV0dXJuIG1fcEdsb2JhbERhdGE7Ci0JfQotCWVsc2UKLQl7Ci0JCW1fbkdsb2JhbERhdGFDb3VudCA9IDE7Ci0JCW1fcEdsb2JhbERhdGEgPSBuZXcgQ0pTX0dsb2JhbERhdGEocEFwcCk7Ci0JCXJldHVybiBtX3BHbG9iYWxEYXRhOwotCX0KK0NKU19SdW50aW1lOjpDSlNfUnVudGltZShDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKQorICAgIDogbV9wQXBwKHBBcHApLAorICAgICAgbV9wRG9jdW1lbnQoTlVMTCksCisgICAgICBtX2JCbG9ja2luZyhGQUxTRSksCisgICAgICBtX2lzb2xhdGUoTlVMTCksCisgICAgICBtX2lzb2xhdGVNYW5hZ2VkKGZhbHNlKSB7CisjaWZuZGVmIFBERl9FTkFCTEVfWEZBCisgIElQREZfSlNQTEFURk9STSogcFBsYXRmb3JtID0gbV9wQXBwLT5HZXRGb3JtRmlsbEluZm8oKS0+bV9wSnNQbGF0Zm9ybTsKKyAgaWYgKHBQbGF0Zm9ybS0+dmVyc2lvbiA8PSAyKSB7CisgICAgdW5zaWduZWQgaW50IGVtYmVkZGVyRGF0YVNsb3QgPSAwOworICAgIHY4OjpJc29sYXRlKiBwRXh0ZXJuYWxJc29sYXRlID0gbnVsbHB0cjsKKyAgICBpZiAocFBsYXRmb3JtLT52ZXJzaW9uID09IDIpIHsKKyAgICAgIHBFeHRlcm5hbElzb2xhdGUgPSByZWludGVycHJldF9jYXN0PHY4OjpJc29sYXRlKj4ocFBsYXRmb3JtLT5tX2lzb2xhdGUpOworICAgICAgZW1iZWRkZXJEYXRhU2xvdCA9IHBQbGF0Zm9ybS0+bV92OEVtYmVkZGVyU2xvdDsKKyNlbHNlCisgIGlmIChDUERGWEZBX0FwcDo6R2V0SW5zdGFuY2UoKS0+R2V0SlNFUnVudGltZSgpKSB7CisgICAgLy8gVE9ETyh0c2VwZXopOiBDUERGWEZBX0FwcCBzaG91bGQgYWxzbyB1c2UgdGhlIGVtYmVkZGVyIHByb3ZpZGVkIGlzb2xhdGUuCisgICAgbV9pc29sYXRlID0gKHY4OjpJc29sYXRlKilDUERGWEZBX0FwcDo6R2V0SW5zdGFuY2UoKS0+R2V0SlNFUnVudGltZSgpOworICB9IGVsc2UgeworICAgIElQREZfSlNQTEFURk9STSogcFBsYXRmb3JtID0gbV9wQXBwLT5HZXRGb3JtRmlsbEluZm8oKS0+bV9wSnNQbGF0Zm9ybTsKKyAgICBpZiAocFBsYXRmb3JtLT52ZXJzaW9uIDw9IDIpIHsKKyAgICAgIHVuc2lnbmVkIGludCBlbWJlZGRlckRhdGFTbG90ID0gMDsKKyAgICAgIHY4OjpJc29sYXRlKiBwRXh0ZXJuYWxJc29sYXRlID0gbnVsbHB0cjsKKyAgICAgIGlmIChwUGxhdGZvcm0tPnZlcnNpb24gPT0gMikgeworICAgICAgICBwRXh0ZXJuYWxJc29sYXRlID0gcmVpbnRlcnByZXRfY2FzdDx2ODo6SXNvbGF0ZSo+KHBQbGF0Zm9ybS0+bV9pc29sYXRlKTsKKyAgICAgICAgZW1iZWRkZXJEYXRhU2xvdCA9IHBQbGF0Zm9ybS0+bV92OEVtYmVkZGVyU2xvdDsKKyAgICAgIH0KKyAgICAgIEZYSlNfSW5pdGlhbGl6ZShlbWJlZGRlckRhdGFTbG90LCBwRXh0ZXJuYWxJc29sYXRlKTsKKyNlbmRpZgorICAgIH0KKyNpZm5kZWYgUERGX0VOQUJMRV9YRkEKKyAgICBGWEpTX0luaXRpYWxpemUoZW1iZWRkZXJEYXRhU2xvdCwgcEV4dGVybmFsSXNvbGF0ZSk7CisjZWxzZQorICAgIG1faXNvbGF0ZU1hbmFnZWQgPSBGWEpTX0dldElzb2xhdGUoJm1faXNvbGF0ZSk7CisgIH0KKworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IG1faXNvbGF0ZTsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7CisgIHY4OjpMb2NrZXIgbG9ja2VyKGlzb2xhdGUpOworICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKGlzb2xhdGUpOworICBpZiAoQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCktPklzSmF2YVNjcmlwdEluaXRpYWxpemVkKCkpIHsKKyAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKU5ld0NvbnRleHQoKTsKKyAgICBGWEpTX0luaXRpYWxpemVSdW50aW1lKEdldElzb2xhdGUoKSwgdGhpcywgJm1fY29udGV4dCwgJm1fU3RhdGljT2JqZWN0cyk7CisgICAgUmVsZWFzZUNvbnRleHQocENvbnRleHQpOworICAgIHJldHVybjsKKyNlbmRpZgorICB9CisjaWZuZGVmIFBERl9FTkFCTEVfWEZBCisgIG1faXNvbGF0ZU1hbmFnZWQgPSBGWEpTX0dldElzb2xhdGUoJm1faXNvbGF0ZSk7CisjZWxzZQorCisjZW5kaWYKKyAgaWYgKG1faXNvbGF0ZU1hbmFnZWQgfHwgRlhKU19HbG9iYWxJc29sYXRlUmVmQ291bnQoKSA9PSAwKQorICAgIERlZmluZUpTT2JqZWN0cygpOworCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgQ1BERlhGQV9BcHA6OkdldEluc3RhbmNlKCktPlNldEphdmFTY3JpcHRJbml0aWFsaXplZChUUlVFKTsKKworI2VuZGlmCisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopTmV3Q29udGV4dCgpOworICBGWEpTX0luaXRpYWxpemVSdW50aW1lKEdldElzb2xhdGUoKSwgdGhpcywgJm1fY29udGV4dCwgJm1fU3RhdGljT2JqZWN0cyk7CisgIFJlbGVhc2VDb250ZXh0KHBDb250ZXh0KTsKIH0KIAotdm9pZCBDSlNfUnVudGltZUZhY3Rvcnk6OlJlbGVhc2VHbG9iYWxEYXRhKCkKLXsKLQltX25HbG9iYWxEYXRhQ291bnQtLTsKLQkKLQlpZiAobV9uR2xvYmFsRGF0YUNvdW50IDw9IDApCi0JewotIAkJZGVsZXRlIG1fcEdsb2JhbERhdGE7Ci0gCQltX3BHbG9iYWxEYXRhID0gTlVMTDsKLQl9CitDSlNfUnVudGltZTo6fkNKU19SdW50aW1lKCkgeworICBmb3IgKGF1dG8qIG9icyA6IG1fb2JzZXJ2ZXJzKQorICAgIG9icy0+T25EZXN0cm95ZWQoKTsKKworICBmb3IgKGludCBpID0gMCwgc3ogPSBtX0NvbnRleHRBcnJheS5HZXRTaXplKCk7IGkgPCBzejsgaSsrKQorICAgIGRlbGV0ZSBtX0NvbnRleHRBcnJheS5HZXRBdChpKTsKKworICBtX0NvbnRleHRBcnJheS5SZW1vdmVBbGwoKTsKKyNpZm5kZWYgUERGX0VOQUJMRV9YRkEKKyAgRlhKU19SZWxlYXNlUnVudGltZShHZXRJc29sYXRlKCksICZtX2NvbnRleHQsICZtX1N0YXRpY09iamVjdHMpOworI2VuZGlmCisKKyAgbV9wQXBwID0gTlVMTDsKKyAgbV9wRG9jdW1lbnQgPSBOVUxMOworICBtX2NvbnRleHQuUmVzZXQoKTsKKworICBpZiAobV9pc29sYXRlTWFuYWdlZCkKKyAgICBtX2lzb2xhdGUtPkRpc3Bvc2UoKTsKIH0KIAotdm9pZCogQ0pTX0FycmF5QnVmZmVyQWxsb2NhdG9yOjpBbGxvY2F0ZShzaXplX3QgbGVuZ3RoKSB7Ci0gICAgcmV0dXJuIGNhbGxvYygxLCBsZW5ndGgpOwordm9pZCBDSlNfUnVudGltZTo6RGVmaW5lSlNPYmplY3RzKCkgeworICB2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShHZXRJc29sYXRlKCkpOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIHY4OjpMb2NrZXIgbG9ja2VyKEdldElzb2xhdGUoKSk7CisjZW5kaWYKKyAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShHZXRJc29sYXRlKCkpOworICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB2ODo6Q29udGV4dDo6TmV3KEdldElzb2xhdGUoKSk7CisgIHY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0X3Njb3BlKGNvbnRleHQpOworCisgIC8vIFRoZSBjYWxsIG9yZGVyIGRldGVybWluZXMgdGhlICJPYmpEZWZJRCIgYXNzaWduZWQgdG8gZWFjaCBjbGFzcy4KKyAgLy8gT2JqRGVmSURzIDAgLSAyCisgIENKU19Cb3JkZXI6OkRlZmluZUpTT2JqZWN0cyhHZXRJc29sYXRlKCksIEZYSlNPQkpUWVBFX1NUQVRJQyk7CisgIENKU19EaXNwbGF5OjpEZWZpbmVKU09iamVjdHMoR2V0SXNvbGF0ZSgpLCBGWEpTT0JKVFlQRV9TVEFUSUMpOworICBDSlNfRm9udDo6RGVmaW5lSlNPYmplY3RzKEdldElzb2xhdGUoKSwgRlhKU09CSlRZUEVfU1RBVElDKTsKKworICAvLyBPYmpEZWZJRHMgMyAtIDUKKyAgQ0pTX0hpZ2hsaWdodDo6RGVmaW5lSlNPYmplY3RzKEdldElzb2xhdGUoKSwgRlhKU09CSlRZUEVfU1RBVElDKTsKKyAgQ0pTX1Bvc2l0aW9uOjpEZWZpbmVKU09iamVjdHMoR2V0SXNvbGF0ZSgpLCBGWEpTT0JKVFlQRV9TVEFUSUMpOworICBDSlNfU2NhbGVIb3c6OkRlZmluZUpTT2JqZWN0cyhHZXRJc29sYXRlKCksIEZYSlNPQkpUWVBFX1NUQVRJQyk7CisKKyAgLy8gT2JqRGVmSURzIDYgLSA4CisgIENKU19TY2FsZVdoZW46OkRlZmluZUpTT2JqZWN0cyhHZXRJc29sYXRlKCksIEZYSlNPQkpUWVBFX1NUQVRJQyk7CisgIENKU19TdHlsZTo6RGVmaW5lSlNPYmplY3RzKEdldElzb2xhdGUoKSwgRlhKU09CSlRZUEVfU1RBVElDKTsKKyAgQ0pTX1pvb210eXBlOjpEZWZpbmVKU09iamVjdHMoR2V0SXNvbGF0ZSgpLCBGWEpTT0JKVFlQRV9TVEFUSUMpOworCisgIC8vIE9iakRlZklEcyA5IC0gMTEKKyAgQ0pTX0FwcDo6RGVmaW5lSlNPYmplY3RzKEdldElzb2xhdGUoKSwgRlhKU09CSlRZUEVfU1RBVElDKTsKKyAgQ0pTX0NvbG9yOjpEZWZpbmVKU09iamVjdHMoR2V0SXNvbGF0ZSgpLCBGWEpTT0JKVFlQRV9TVEFUSUMpOworICBDSlNfQ29uc29sZTo6RGVmaW5lSlNPYmplY3RzKEdldElzb2xhdGUoKSwgRlhKU09CSlRZUEVfU1RBVElDKTsKKworICAvLyBPYmpEZWZJRHMgMTIgLSAxNAorICBDSlNfRG9jdW1lbnQ6OkRlZmluZUpTT2JqZWN0cyhHZXRJc29sYXRlKCksIEZYSlNPQkpUWVBFX0dMT0JBTCk7CisgIENKU19FdmVudDo6RGVmaW5lSlNPYmplY3RzKEdldElzb2xhdGUoKSwgRlhKU09CSlRZUEVfU1RBVElDKTsKKyAgQ0pTX0ZpZWxkOjpEZWZpbmVKU09iamVjdHMoR2V0SXNvbGF0ZSgpLCBGWEpTT0JKVFlQRV9EWU5BTUlDKTsKKworICAvLyBPYmpEZWZJRHMgMTUgLSAxNworICBDSlNfR2xvYmFsOjpEZWZpbmVKU09iamVjdHMoR2V0SXNvbGF0ZSgpLCBGWEpTT0JKVFlQRV9TVEFUSUMpOworICBDSlNfSWNvbjo6RGVmaW5lSlNPYmplY3RzKEdldElzb2xhdGUoKSwgRlhKU09CSlRZUEVfRFlOQU1JQyk7CisgIENKU19VdGlsOjpEZWZpbmVKU09iamVjdHMoR2V0SXNvbGF0ZSgpLCBGWEpTT0JKVFlQRV9TVEFUSUMpOworCisgIC8vIE9iakRlZklEcyAxOCAtIDIwICh0aGVzZSBjYW4ndCBmYWlsLCByZXR1cm4gdm9pZCkuCisgIENKU19QdWJsaWNNZXRob2RzOjpEZWZpbmVKU09iamVjdHMoR2V0SXNvbGF0ZSgpKTsKKyAgQ0pTX0dsb2JhbENvbnN0czo6RGVmaW5lSlNPYmplY3RzKHRoaXMpOworICBDSlNfR2xvYmFsQXJyYXlzOjpEZWZpbmVKU09iamVjdHModGhpcyk7CisKKyAgLy8gT2JqRGVmSURzIDIxIC0gMjIuCisgIENKU19UaW1lck9iajo6RGVmaW5lSlNPYmplY3RzKEdldElzb2xhdGUoKSwgRlhKU09CSlRZUEVfRFlOQU1JQyk7CisgIENKU19QcmludFBhcmFtc09iajo6RGVmaW5lSlNPYmplY3RzKEdldElzb2xhdGUoKSwgRlhKU09CSlRZUEVfRFlOQU1JQyk7CiB9CiAKLXZvaWQqIENKU19BcnJheUJ1ZmZlckFsbG9jYXRvcjo6QWxsb2NhdGVVbmluaXRpYWxpemVkKHNpemVfdCBsZW5ndGgpIHsKLSAgICByZXR1cm4gbWFsbG9jKGxlbmd0aCk7CitJSlNfQ29udGV4dCogQ0pTX1J1bnRpbWU6Ok5ld0NvbnRleHQoKSB7CisgIENKU19Db250ZXh0KiBwID0gbmV3IENKU19Db250ZXh0KHRoaXMpOworICBtX0NvbnRleHRBcnJheS5BZGQocCk7CisgIHJldHVybiBwOwogfQogCi12b2lkIENKU19BcnJheUJ1ZmZlckFsbG9jYXRvcjo6RnJlZSh2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKSB7Ci0gICAgZnJlZShkYXRhKTsKK3ZvaWQgQ0pTX1J1bnRpbWU6OlJlbGVhc2VDb250ZXh0KElKU19Db250ZXh0KiBwQ29udGV4dCkgeworICBDSlNfQ29udGV4dCogcEpTQ29udGV4dCA9IChDSlNfQ29udGV4dCopcENvbnRleHQ7CisKKyAgZm9yIChpbnQgaSA9IDAsIHN6ID0gbV9Db250ZXh0QXJyYXkuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgIGlmIChwSlNDb250ZXh0ID09IG1fQ29udGV4dEFycmF5LkdldEF0KGkpKSB7CisgICAgICBkZWxldGUgcEpTQ29udGV4dDsKKyAgICAgIG1fQ29udGV4dEFycmF5LlJlbW92ZUF0KGkpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDSlNfUnVudGltZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotQ0pTX1J1bnRpbWU6OkNKU19SdW50aW1lKENQREZEb2NfRW52aXJvbm1lbnQgKiBwQXBwKSA6IAotCW1fcEFwcChwQXBwKSwKLQltX3BEb2N1bWVudChOVUxMKSwKLQltX2JCbG9ja2luZyhGQUxTRSksCi0JbV9iUmVnaXN0ZXJlZChGQUxTRSksCi0JbV9wRmllbGRFdmVudFBhdGgoTlVMTCkKLXsKLQltX3BBcnJheUJ1ZmZlckFsbG9jYXRvci5yZXNldChuZXcgQ0pTX0FycmF5QnVmZmVyQWxsb2NhdG9yKCkpOwotCi0Jdjg6Oklzb2xhdGU6OkNyZWF0ZVBhcmFtcyBwYXJhbXM7Ci0JcGFyYW1zLmFycmF5X2J1ZmZlcl9hbGxvY2F0b3IgPSBtX3BBcnJheUJ1ZmZlckFsbG9jYXRvci5nZXQoKTsKLQltX2lzb2xhdGUgPSB2ODo6SXNvbGF0ZTo6TmV3KHBhcmFtcyk7Ci0KLQlJbml0SlNPYmplY3RzKCk7Ci0KLQlDSlNfQ29udGV4dCAqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KilOZXdDb250ZXh0KCk7Ci0JSlNfSW5pdGlhbFJ1bnRpbWUoKnRoaXMsIHRoaXMsIHBDb250ZXh0LCBtX2NvbnRleHQpOwotCVJlbGVhc2VDb250ZXh0KHBDb250ZXh0KTsKK0lKU19Db250ZXh0KiBDSlNfUnVudGltZTo6R2V0Q3VycmVudENvbnRleHQoKSB7CisgIGlmICghbV9Db250ZXh0QXJyYXkuR2V0U2l6ZSgpKQorICAgIHJldHVybiBOVUxMOworICByZXR1cm4gbV9Db250ZXh0QXJyYXkuR2V0QXQobV9Db250ZXh0QXJyYXkuR2V0U2l6ZSgpIC0gMSk7CiB9CiAKLUNKU19SdW50aW1lOjp+Q0pTX1J1bnRpbWUoKQotewotCWZvciAoaW50IGk9MCwgc3o9bV9Db250ZXh0QXJyYXkuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JCWRlbGV0ZSBtX0NvbnRleHRBcnJheS5HZXRBdChpKTsKK3ZvaWQgQ0pTX1J1bnRpbWU6OlNldFJlYWRlckRvY3VtZW50KENQREZTREtfRG9jdW1lbnQqIHBSZWFkZXJEb2MpIHsKKyAgaWYgKG1fcERvY3VtZW50ICE9IHBSZWFkZXJEb2MpIHsKKyAgICB2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShtX2lzb2xhdGUpOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgICAgdjg6OkxvY2tlciBsb2NrZXIobV9pc29sYXRlKTsKKyNlbmRpZgorICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUobV9pc29sYXRlKTsKKyAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPQorICAgICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+OjpOZXcobV9pc29sYXRlLCBtX2NvbnRleHQpOworICAgIHY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0X3Njb3BlKGNvbnRleHQpOwogCi0JbV9Db250ZXh0QXJyYXkuUmVtb3ZlQWxsKCk7Ci0KLQlKU19SZWxlYXNlUnVudGltZSgqdGhpcywgbV9jb250ZXh0KTsKLQotCVJlbW92ZUV2ZW50c0luTG9vcChtX3BGaWVsZEV2ZW50UGF0aCk7Ci0KLQltX3BBcHAgPSBOVUxMOwotCW1fcERvY3VtZW50ID0gTlVMTDsKLQltX3BGaWVsZEV2ZW50UGF0aCA9IE5VTEw7Ci0JbV9jb250ZXh0LlJlc2V0KCk7Ci0KLQkvL21faXNvbGF0ZS0+RXhpdCgpOwotCW1faXNvbGF0ZS0+RGlzcG9zZSgpOworICAgIG1fcERvY3VtZW50ID0gcFJlYWRlckRvYzsKKyAgICBpZiAocFJlYWRlckRvYykgeworICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBUaGlzID0gRlhKU19HZXRUaGlzT2JqKEdldElzb2xhdGUoKSk7CisgICAgICBpZiAoIXBUaGlzLklzRW1wdHkoKSkgeworICAgICAgICBpZiAoRlhKU19HZXRPYmpEZWZuSUQocFRoaXMpID09IENKU19Eb2N1bWVudDo6Z19uT2JqRGVmbklEKSB7CisgICAgICAgICAgaWYgKENKU19Eb2N1bWVudCogcEpTRG9jdW1lbnQgPQorICAgICAgICAgICAgICAgICAgKENKU19Eb2N1bWVudCopRlhKU19HZXRQcml2YXRlKEdldElzb2xhdGUoKSwgcFRoaXMpKSB7CisgICAgICAgICAgICBpZiAoRG9jdW1lbnQqIHBEb2N1bWVudCA9IChEb2N1bWVudCopcEpTRG9jdW1lbnQtPkdldEVtYmVkT2JqZWN0KCkpCisgICAgICAgICAgICAgIHBEb2N1bWVudC0+QXR0YWNoRG9jKHBSZWFkZXJEb2MpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQogfQogCi1GWF9CT09MIENKU19SdW50aW1lOjpJbml0SlNPYmplY3RzKCkKLXsKLQl2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShHZXRJc29sYXRlKCkpOwotCXY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoR2V0SXNvbGF0ZSgpKTsKLQl2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB2ODo6Q29udGV4dDo6TmV3KEdldElzb2xhdGUoKSk7Ci0Jdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRfc2NvcGUoY29udGV4dCk7Ci0JLy8wIC0gOAotCWlmIChDSlNfQm9yZGVyOjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIEZBTFNFOwotCWlmIChDSlNfRGlzcGxheTo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKLQlpZiAoQ0pTX0ZvbnQ6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7Ci0JaWYgKENKU19IaWdobGlnaHQ6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7Ci0JaWYgKENKU19Qb3NpdGlvbjo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKLQlpZiAoQ0pTX1NjYWxlSG93OjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIEZBTFNFOwotCWlmIChDSlNfU2NhbGVXaGVuOjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIEZBTFNFOwotCWlmIChDSlNfU3R5bGU6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7CQotCWlmIChDSlNfWm9vbXR5cGU6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7CQotCi0JLy85IC0gMTEKLQlpZiAoQ0pTX0FwcDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKLQlpZiAoQ0pTX0NvbG9yOjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIEZBTFNFOyAgIAotCWlmIChDSlNfQ29uc29sZTo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsKLQotCS8vMTIgLSAxNAotCWlmIChDSlNfRG9jdW1lbnQ6OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwgMCkgcmV0dXJuIEZBTFNFOyAgCi0JaWYgKENKU19FdmVudDo6SW5pdCgqdGhpcywgSlNfU1RBVElDKSA8IDApIHJldHVybiBGQUxTRTsJCQotCWlmIChDSlNfRmllbGQ6OkluaXQoKnRoaXMsIEpTX0RZTkFNSUMpIDwgMCkgcmV0dXJuIEZBTFNFOyAgICAKLQotCS8vMTUgLSAxNwotCWlmIChDSlNfR2xvYmFsOjpJbml0KCp0aGlzLCBKU19TVEFUSUMpIDwgMCkgcmV0dXJuIEZBTFNFOwkJCi0JaWYgKENKU19JY29uOjpJbml0KCp0aGlzLCBKU19EWU5BTUlDKSA8IDApIHJldHVybiBGQUxTRTsKLQlpZiAoQ0pTX1V0aWw6OkluaXQoKnRoaXMsIEpTX1NUQVRJQykgPCAwKSByZXR1cm4gRkFMU0U7Ci0KLQlpZiAoQ0pTX1B1YmxpY01ldGhvZHM6OkluaXQoKnRoaXMpIDwgMCkgcmV0dXJuIEZBTFNFOwotCWlmIChDSlNfR2xvYmFsQ29uc3RzOjpJbml0KCp0aGlzKSA8IDApIHJldHVybiBGQUxTRTsKLQlpZiAoQ0pTX0dsb2JhbEFycmF5czo6SW5pdCgqdGhpcykgPCAwKSByZXR1cm4gRkFMU0U7Ci0KLQlpZiAoQ0pTX1RpbWVyT2JqOjpJbml0KCp0aGlzLCBKU19EWU5BTUlDKSA8IDApIHJldHVybiBGQUxTRTsKLQlpZiAoQ0pTX1ByaW50UGFyYW1zT2JqOjpJbml0KCp0aGlzLCBKU19EWU5BTUlDKSA8MCkgcmV0dXJuIEZBTFNFOwotCi0JcmV0dXJuIFRSVUU7CitpbnQgQ0pTX1J1bnRpbWU6OkV4ZWN1dGUoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHNjcmlwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyogaW5mbykgeworICBGWEpTRXJyIGVycm9yID0ge307CisgIGludCBuUmV0ID0gRlhKU19FeGVjdXRlKG1faXNvbGF0ZSwgY2MsIHNjcmlwdCwgJmVycm9yKTsKKyAgaWYgKG5SZXQgPCAwKSB7CisgICAgaW5mby0+Rm9ybWF0KEwiWyBMaW5lOiAlMDVkIHsgJXMgfSBdIDogJXMiLCBlcnJvci5saW5udW0gLSAxLCBlcnJvci5zcmNsaW5lLAorICAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlKTsKKyAgfQorICByZXR1cm4gblJldDsKIH0KIAotSUZYSlNfQ29udGV4dCogQ0pTX1J1bnRpbWU6Ok5ld0NvbnRleHQoKQotewotCUNKU19Db250ZXh0ICogcCA9IG5ldyBDSlNfQ29udGV4dCh0aGlzKTsKLQltX0NvbnRleHRBcnJheS5BZGQocCk7Ci0JcmV0dXJuIHA7Citib29sIENKU19SdW50aW1lOjpBZGRFdmVudFRvU2V0KGNvbnN0IEZpZWxkRXZlbnQmIGV2ZW50KSB7CisgIHJldHVybiBtX0ZpZWxkRXZlbnRTZXQuaW5zZXJ0KGV2ZW50KS5zZWNvbmQ7CiB9CiAKLXZvaWQgQ0pTX1J1bnRpbWU6OlJlbGVhc2VDb250ZXh0KElGWEpTX0NvbnRleHQgKiBwQ29udGV4dCkKLXsKLQlDSlNfQ29udGV4dCogcEpTQ29udGV4dCA9IChDSlNfQ29udGV4dCopcENvbnRleHQ7Ci0KLQlmb3IgKGludCBpPTAsIHN6PW1fQ29udGV4dEFycmF5LkdldFNpemUoKTsgaTxzejsgaSsrKQotCXsKLQkJaWYgKHBKU0NvbnRleHQgPT0gbV9Db250ZXh0QXJyYXkuR2V0QXQoaSkpCi0JCXsKLQkJCWRlbGV0ZSBwSlNDb250ZXh0OwotCQkJbV9Db250ZXh0QXJyYXkuUmVtb3ZlQXQoaSk7Ci0JCQlicmVhazsKLQkJfQotCX0KK3ZvaWQgQ0pTX1J1bnRpbWU6OlJlbW92ZUV2ZW50RnJvbVNldChjb25zdCBGaWVsZEV2ZW50JiBldmVudCkgeworICBtX0ZpZWxkRXZlbnRTZXQuZXJhc2UoZXZlbnQpOwogfQogCi1JRlhKU19Db250ZXh0KglDSlNfUnVudGltZTo6R2V0Q3VycmVudENvbnRleHQoKQotewotCWlmKCFtX0NvbnRleHRBcnJheS5HZXRTaXplKCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBtX0NvbnRleHRBcnJheS5HZXRBdChtX0NvbnRleHRBcnJheS5HZXRTaXplKCktMSk7Cit2ODo6TG9jYWw8djg6OkNvbnRleHQ+IENKU19SdW50aW1lOjpOZXdKU0NvbnRleHQoKSB7CisgIHJldHVybiB2ODo6TG9jYWw8djg6OkNvbnRleHQ+OjpOZXcobV9pc29sYXRlLCBtX2NvbnRleHQpOwogfQogCi12b2lkIENKU19SdW50aW1lOjpTZXRSZWFkZXJEb2N1bWVudChDUERGU0RLX0RvY3VtZW50KiBwUmVhZGVyRG9jKQotewotCWlmIChtX3BEb2N1bWVudCAhPSBwUmVhZGVyRG9jKQotCXsKLQkJdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUobV9pc29sYXRlKTsKLQkJdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShtX2lzb2xhdGUpOwotCQl2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPXY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhtX2lzb2xhdGUsIG1fY29udGV4dCk7Ci0JCXY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0X3Njb3BlKGNvbnRleHQpOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCitDRlhfV2lkZVN0cmluZyBDaGFuZ2VPYmpOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIHsKKyAgQ0ZYX1dpZGVTdHJpbmcgc1JldCA9IHN0cjsKKyAgc1JldC5SZXBsYWNlKEwiXyIsIEwiLiIpOworICByZXR1cm4gc1JldDsKK30KK0ZYX0JPT0wgQ0pTX1J1bnRpbWU6OkdldEhWYWx1ZUJ5TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHV0ZjhOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBjb25zdCBGWF9DSEFSKiBuYW1lID0gdXRmOE5hbWUuR2V0Q1N0cigpOwogCi0JCW1fcERvY3VtZW50ID0gcFJlYWRlckRvYzsKKyAgdjg6OkxvY2tlciBsb2NrKEdldElzb2xhdGUoKSk7CisgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKEdldElzb2xhdGUoKSk7CisgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoR2V0SXNvbGF0ZSgpKTsKKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBvbGRfY29udGV4dCA9IEdldElzb2xhdGUoKS0+R2V0Q3VycmVudENvbnRleHQoKTsKKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0KKyAgICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhHZXRJc29sYXRlKCksIG1fY29udGV4dCk7CisgIHY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0X3Njb3BlKGNvbnRleHQpOwogCi0JCWlmIChwUmVhZGVyRG9jKQotCQl7Ci0JCQlKU09iamVjdCBwVGhpcyA9IEpTX0dldFRoaXNPYmooKnRoaXMpOwotCQkJaWYoIXBUaGlzLklzRW1wdHkoKSkKLQkJCXsKLQkJCQlpZiAoSlNfR2V0T2JqRGVmbklEKHBUaGlzKSA9PSBKU19HZXRPYmpEZWZuSUQoKnRoaXMsIEwiRG9jdW1lbnQiKSkKLQkJCQl7Ci0JCQkJCWlmIChDSlNfRG9jdW1lbnQqIHBKU0RvY3VtZW50ID0gKENKU19Eb2N1bWVudCopSlNfR2V0UHJpdmF0ZShwVGhpcykpCi0JCQkJCXsKLQkJCQkJCWlmIChEb2N1bWVudCAqIHBEb2N1bWVudCA9IChEb2N1bWVudCopcEpTRG9jdW1lbnQtPkdldEVtYmVkT2JqZWN0KCkpCi0JCQkJCQkJcERvY3VtZW50LT5BdHRhY2hEb2MocFJlYWRlckRvYyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlKU19TZXRUaGlzT2JqKCp0aGlzLCBKU19HZXRPYmpEZWZuSUQoKnRoaXMsIEwiRG9jdW1lbnQiKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlKU19TZXRUaGlzT2JqKCp0aGlzLCBKU19HZXRPYmpEZWZuSUQoKnRoaXMsIEwiYXBwIikpOwotCQl9Ci0JfQorICAvLyBDYXV0aW9uOiBXZSdyZSBhYm91dCB0byBoYW5kIHRvIFhGQSBhbiBvYmplY3QgdGhhdCBpbiBvcmRlciB0byBpbnZva2UKKyAgLy8gbWV0aG9kcyB3aWxsIHJlcXVpcmUgdGhhdCB0aGUgY3VycmVudCB2ODo6Q29udGV4dCBhbHdheXMgaGFzIGEgcG9pbnRlcgorICAvLyB0byBhIENKU19SdW50aW1lIGluIGl0cyBlbWJlZGRlciBkYXRhIHNsb3QuIFVuZm9ydHVuYXRlbHksIFhGQSBjcmVhdGVzCisgIC8vIGl0cyBvd24gdjg6OkNvbnRleHQgd2hpY2ggaGFzIG5vdCBpbml0aWFsaXplZCB0aGUgZW1iZWRkZXIgZGF0YSBzbG90LgorICAvLyBEbyBzbyBub3cuCisgIC8vIFRPRE8odHNlcGV6KTogcmVkZXNpZ24gUERGLXNpZGUgb2JqZWN0cyB0byBub3QgcmVseSBvbiB2ODo6Q29udGV4dCdzCisgIC8vIGVtYmVkZGVyIGRhdGEgc2xvdHMsIGFuZC9vciB0byBhbHdheXMgdXNlIHRoZSByaWdodCBjb250ZXh0LgorICBGWEpTX1NldFJ1bnRpbWVGb3JWOENvbnRleHQob2xkX2NvbnRleHQsIHRoaXMpOworCisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHByb3B2YWx1ZSA9CisgICAgICBjb250ZXh0LT5HbG9iYWwoKS0+R2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KAorICAgICAgICAgIEdldElzb2xhdGUoKSwgbmFtZSwgdjg6OlN0cmluZzo6a05vcm1hbFN0cmluZywgdXRmOE5hbWUuR2V0TGVuZ3RoKCkpKTsKKworICBpZiAocHJvcHZhbHVlLklzRW1wdHkoKSkgeworICAgIEZYSlNFX1ZhbHVlX1NldFVuZGVmaW5lZChoVmFsdWUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICAoKENGWEpTRV9WYWx1ZSopaFZhbHVlKS0+Rm9yY2VTZXRWYWx1ZShwcm9wdmFsdWUpOworI2VuZGlmCisKKyAgcmV0dXJuIFRSVUU7Cit9CitGWF9CT09MIENKU19SdW50aW1lOjpTZXRIVmFsdWVCeU5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB1dGY4TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFZhbHVlKSB7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgaWYgKHV0ZjhOYW1lLklzRW1wdHkoKSB8fCBoVmFsdWUgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGNvbnN0IEZYX0NIQVIqIG5hbWUgPSB1dGY4TmFtZS5HZXRDU3RyKCk7CisgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IEdldElzb2xhdGUoKTsKKyAgdjg6OkxvY2tlciBsb2NrKHBJc29sYXRlKTsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUocElzb2xhdGUpOworICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKHBJc29sYXRlKTsKKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0KKyAgICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhwSXNvbGF0ZSwgbV9jb250ZXh0KTsKKyAgdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRfc2NvcGUoY29udGV4dCk7CisKKyAgLy8gdjg6OkxvY2FsPHY4OjpDb250ZXh0PiB0bXBDb3RleHQgPQorICAvLyB2ODo6TG9jYWw8djg6OkNvbnRleHQ+OjpOZXcoR2V0SXNvbGF0ZSgpLCBtX2NvbnRleHQpOworICB2ODo6TG9jYWw8djg6OlZhbHVlPiBwcm9wdmFsdWUgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KAorICAgICAgR2V0SXNvbGF0ZSgpLCAoKENGWEpTRV9WYWx1ZSopaFZhbHVlKS0+RGlyZWN0R2V0VmFsdWUoKSk7CisgIGNvbnRleHQtPkdsb2JhbCgpLT5TZXQoCisgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgbmFtZSwgdjg6OlN0cmluZzo6a05vcm1hbFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0ZjhOYW1lLkdldExlbmd0aCgpKSwKKyAgICAgIHByb3B2YWx1ZSk7CisjZW5kaWYKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wJQ0pTX1J1bnRpbWU6OkFkZEV2ZW50VG9Mb29wKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGFyZ2V0TmFtZSwgSlNfRVZFTlRfVCBlRXZlbnRUeXBlKQotewotCWlmIChtX3BGaWVsZEV2ZW50UGF0aCA9PSBOVUxMKQotCXsKLQkJbV9wRmllbGRFdmVudFBhdGggPSBuZXcgQ0pTX0ZpZWxkRXZlbnQ7Ci0JCW1fcEZpZWxkRXZlbnRQYXRoLT5zVGFyZ2V0TmFtZSA9IHNUYXJnZXROYW1lOwotCQltX3BGaWVsZEV2ZW50UGF0aC0+ZUV2ZW50VHlwZSA9IGVFdmVudFR5cGU7Ci0JCW1fcEZpZWxkRXZlbnRQYXRoLT5wTmV4dCA9IE5VTEw7Ci0KLQkJcmV0dXJuIFRSVUU7Ci0JfQotCi0JLy90byBzZWFyY2gKLQlDSlNfRmllbGRFdmVudCogcCA9IG1fcEZpZWxkRXZlbnRQYXRoOwotCUNKU19GaWVsZEV2ZW50KiBwTGFzdCA9IG1fcEZpZWxkRXZlbnRQYXRoOwotCXdoaWxlIChwKQotCXsKLQkJaWYgKHAtPmVFdmVudFR5cGUgPT0gZUV2ZW50VHlwZSAmJiBwLT5zVGFyZ2V0TmFtZSA9PSBzVGFyZ2V0TmFtZSkKLQkJCXJldHVybiBGQUxTRTsKLQotCQlwTGFzdCA9IHA7Ci0JCXAgPSBwLT5wTmV4dDsKLQl9Ci0KLQkvL3RvIGFkZAotCUNKU19GaWVsZEV2ZW50KiBwTmV3ID0gbmV3IENKU19GaWVsZEV2ZW50OwotCXBOZXctPnNUYXJnZXROYW1lID0gc1RhcmdldE5hbWU7Ci0JcE5ldy0+ZUV2ZW50VHlwZSA9IGVFdmVudFR5cGU7Ci0JcE5ldy0+cE5leHQgPSBOVUxMOwotCi0JcExhc3QtPnBOZXh0ID0gcE5ldzsKLQotCXJldHVybiBUUlVFOworI2VuZGlmCit2b2lkIENKU19SdW50aW1lOjpBZGRPYnNlcnZlcihPYnNlcnZlciogb2JzZXJ2ZXIpIHsKKyAgQVNTRVJUKCFwZGZpdW06OkNvbnRhaW5zS2V5KG1fb2JzZXJ2ZXJzLCBvYnNlcnZlcikpOworICBtX29ic2VydmVycy5pbnNlcnQob2JzZXJ2ZXIpOwogfQogCi12b2lkIENKU19SdW50aW1lOjpSZW1vdmVFdmVudEluTG9vcChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RhcmdldE5hbWUsIEpTX0VWRU5UX1QgZUV2ZW50VHlwZSkKLXsKLQlGWF9CT09MIGJGaW5kID0gRkFMU0U7Ci0KLQlDSlNfRmllbGRFdmVudCogcCA9IG1fcEZpZWxkRXZlbnRQYXRoOwotCUNKU19GaWVsZEV2ZW50KiBwTGFzdCA9IE5VTEw7Ci0Jd2hpbGUgKHApCi0JewotCQlpZiAocC0+ZUV2ZW50VHlwZSA9PSBlRXZlbnRUeXBlICYmIHAtPnNUYXJnZXROYW1lID09IHNUYXJnZXROYW1lKQotCQl7Ci0JCQliRmluZCA9IFRSVUU7Ci0JCQlicmVhazsKLQkJfQotCi0JCXBMYXN0ID0gcDsKLQkJcCA9IHAtPnBOZXh0OwotCX0KLQotCWlmIChiRmluZCkKLQl7Ci0JCVJlbW92ZUV2ZW50c0luTG9vcChwKTsKLQotCQlpZiAocCA9PSBtX3BGaWVsZEV2ZW50UGF0aCkKLQkJCW1fcEZpZWxkRXZlbnRQYXRoID0gTlVMTDsKLQotCQlpZiAocExhc3QpCi0JCQlwTGFzdC0+cE5leHQgPSBOVUxMOwotCX0KLX0KLQotdm9pZCBDSlNfUnVudGltZTo6UmVtb3ZlRXZlbnRzSW5Mb29wKENKU19GaWVsZEV2ZW50KiBwU3RhcnQpCi17Ci0JQ0pTX0ZpZWxkRXZlbnQqIHAgPSBwU3RhcnQ7Ci0KLQl3aGlsZSAocCkKLQl7Ci0JCUNKU19GaWVsZEV2ZW50KiBwT2xkID0gcDsKLQkJcCA9IHBPbGQtPnBOZXh0OwotCi0JCWRlbGV0ZSBwT2xkOwotCX0KLX0KLQotdjg6OkxvY2FsPHY4OjpDb250ZXh0PglDSlNfUnVudGltZTo6TmV3SlNDb250ZXh0KCkKLXsKLQlyZXR1cm4gdjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KG1faXNvbGF0ZSwgbV9jb250ZXh0KTsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ2hhbmdlT2JqTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKQotewotCUNGWF9XaWRlU3RyaW5nIHNSZXQgPSBzdHI7Ci0Jc1JldC5SZXBsYWNlKEwiXyIsIEwiLiIpOwotCXJldHVybiBzUmV0Owordm9pZCBDSlNfUnVudGltZTo6UmVtb3ZlT2JzZXJ2ZXIoT2JzZXJ2ZXIqIG9ic2VydmVyKSB7CisgIEFTU0VSVChwZGZpdW06OkNvbnRhaW5zS2V5KG1fb2JzZXJ2ZXJzLCBvYnNlcnZlcikpOworICBtX29ic2VydmVycy5lcmFzZShvYnNlcnZlcik7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuaCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfUnVudGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlY2M1NTMKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuaApAQCAtMCwwICsxLDg2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlBERlNES19TUkNfSkFWQVNDUklQVF9KU19SVU5USU1FX0hfCisjZGVmaW5lIEZQREZTREtfU1JDX0pBVkFTQ1JJUFRfSlNfUlVOVElNRV9IXworCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiSlNfRXZlbnRIYW5kbGVyLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvanNhcGkvZnhqc192OC5oIgorCitjbGFzcyBDSlNfQ29udGV4dDsKKworY2xhc3MgQ0pTX1J1bnRpbWUgOiBwdWJsaWMgSUpTX1J1bnRpbWUgeworIHB1YmxpYzoKKyAgY2xhc3MgT2JzZXJ2ZXIgeworICAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBPbkRlc3Ryb3llZCgpID0gMDsKKworICAgcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk9ic2VydmVyKCkge30KKyAgfTsKKworICB1c2luZyBGaWVsZEV2ZW50ID0gc3RkOjpwYWlyPENGWF9XaWRlU3RyaW5nLCBKU19FVkVOVF9UPjsKKworICBzdGF0aWMgQ0pTX1J1bnRpbWUqIEZyb21Db250ZXh0KGNvbnN0IElKU19Db250ZXh0KiBjYyk7CisKKyAgZXhwbGljaXQgQ0pTX1J1bnRpbWUoQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCk7CisgIH5DSlNfUnVudGltZSgpIG92ZXJyaWRlOworCisgIC8vIElKU19SdW50aW1lCisgIElKU19Db250ZXh0KiBOZXdDb250ZXh0KCkgb3ZlcnJpZGU7CisgIHZvaWQgUmVsZWFzZUNvbnRleHQoSUpTX0NvbnRleHQqIHBDb250ZXh0KSBvdmVycmlkZTsKKyAgSUpTX0NvbnRleHQqIEdldEN1cnJlbnRDb250ZXh0KCkgb3ZlcnJpZGU7CisgIHZvaWQgU2V0UmVhZGVyRG9jdW1lbnQoQ1BERlNES19Eb2N1bWVudCogcFJlYWRlckRvYykgb3ZlcnJpZGU7CisgIENQREZTREtfRG9jdW1lbnQqIEdldFJlYWRlckRvY3VtZW50KCkgb3ZlcnJpZGUgeyByZXR1cm4gbV9wRG9jdW1lbnQ7IH0KKyAgaW50IEV4ZWN1dGUoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzY3JpcHQsCisgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nKiBpbmZvKSBvdmVycmlkZTsKKworICBDUERGRG9jX0Vudmlyb25tZW50KiBHZXRSZWFkZXJBcHAoKSBjb25zdCB7IHJldHVybiBtX3BBcHA7IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGV2ZW50IGlzbid0IGFscmVhZHkgZm91bmQgaW4gdGhlIHNldC4KKyAgYm9vbCBBZGRFdmVudFRvU2V0KGNvbnN0IEZpZWxkRXZlbnQmIGV2ZW50KTsKKyAgdm9pZCBSZW1vdmVFdmVudEZyb21TZXQoY29uc3QgRmllbGRFdmVudCYgZXZlbnQpOworCisgIHZvaWQgQmVnaW5CbG9jaygpIHsgbV9iQmxvY2tpbmcgPSBUUlVFOyB9CisgIHZvaWQgRW5kQmxvY2soKSB7IG1fYkJsb2NraW5nID0gRkFMU0U7IH0KKyAgRlhfQk9PTCBJc0Jsb2NraW5nKCkgY29uc3QgeyByZXR1cm4gbV9iQmxvY2tpbmc7IH0KKworICB2ODo6SXNvbGF0ZSogR2V0SXNvbGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1faXNvbGF0ZTsgfQorICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IE5ld0pTQ29udGV4dCgpOworCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgRlhfQk9PTCBHZXRIVmFsdWVCeU5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB1dGY4TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSkgb3ZlcnJpZGU7CisgIEZYX0JPT0wgU2V0SFZhbHVlQnlOYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdXRmOE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpIG92ZXJyaWRlOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCisgIHZvaWQgQWRkT2JzZXJ2ZXIoT2JzZXJ2ZXIqIG9ic2VydmVyKTsKKyAgdm9pZCBSZW1vdmVPYnNlcnZlcihPYnNlcnZlciogb2JzZXJ2ZXIpOworCisgcHJpdmF0ZToKKyAgdm9pZCBEZWZpbmVKU09iamVjdHMoKTsKKworICBDRlhfQXJyYXlUZW1wbGF0ZTxDSlNfQ29udGV4dCo+IG1fQ29udGV4dEFycmF5OworICBDUERGRG9jX0Vudmlyb25tZW50KiBtX3BBcHA7CisgIENQREZTREtfRG9jdW1lbnQqIG1fcERvY3VtZW50OworICBGWF9CT09MIG1fYkJsb2NraW5nOworICBzdGQ6OnNldDxGaWVsZEV2ZW50PiBtX0ZpZWxkRXZlbnRTZXQ7CisgIHY4OjpJc29sYXRlKiBtX2lzb2xhdGU7CisgIGJvb2wgbV9pc29sYXRlTWFuYWdlZDsKKyAgdjg6Okdsb2JhbDx2ODo6Q29udGV4dD4gbV9jb250ZXh0OworICBzdGQ6OnZlY3Rvcjx2ODo6R2xvYmFsPHY4OjpPYmplY3Q+Kj4gbV9TdGF0aWNPYmplY3RzOworICBzdGQ6OnNldDxPYnNlcnZlcio+IG1fb2JzZXJ2ZXJzOworfTsKKworI2VuZGlmICAvLyBGUERGU0RLX1NSQ19KQVZBU0NSSVBUX0pTX1JVTlRJTUVfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfUnVudGltZV9TdHViLmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfUnVudGltZV9TdHViLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWQ1YTIyCi0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19SdW50aW1lX1N0dWIuY3BwCkBAIC0wLDAgKzEsMTcwIEBACisvLyBDb3B5cmlnaHQgMjAxNSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvZnNka19tZ3IuaCIgIC8vIEZvciBDUERGRG9jX0Vudmlyb25tZW50LgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiCisKK2NsYXNzIENKU19Db250ZXh0U3R1YiBmaW5hbCA6IHB1YmxpYyBJSlNfQ29udGV4dCB7CisgcHVibGljOgorICBDSlNfQ29udGV4dFN0dWIoKSB7fQorICB+Q0pTX0NvbnRleHRTdHViKCkgb3ZlcnJpZGUge30KKworICAvLyBJSlNfQ29udGV4dDoKKyAgRlhfQk9PTCBSdW5TY3JpcHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcqIGluZm8pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICB2b2lkIE9uQXBwX0luaXQoKSBvdmVycmlkZSB7fQorICB2b2lkIE9uRG9jX09wZW4oQ1BERlNES19Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJUYXJnZXROYW1lKSBvdmVycmlkZSB7fQorICB2b2lkIE9uRG9jX1dpbGxQcmludChDUERGU0RLX0RvY3VtZW50KiBwRG9jKSBvdmVycmlkZSB7fQorICB2b2lkIE9uRG9jX0RpZFByaW50KENQREZTREtfRG9jdW1lbnQqIHBEb2MpIG92ZXJyaWRlIHt9CisgIHZvaWQgT25Eb2NfV2lsbFNhdmUoQ1BERlNES19Eb2N1bWVudCogcERvYykgb3ZlcnJpZGUge30KKyAgdm9pZCBPbkRvY19EaWRTYXZlKENQREZTREtfRG9jdW1lbnQqIHBEb2MpIG92ZXJyaWRlIHt9CisgIHZvaWQgT25Eb2NfV2lsbENsb3NlKENQREZTREtfRG9jdW1lbnQqIHBEb2MpIG92ZXJyaWRlIHt9CisgIHZvaWQgT25QYWdlX09wZW4oQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCkgb3ZlcnJpZGUge30KKyAgdm9pZCBPblBhZ2VfQ2xvc2UoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCkgb3ZlcnJpZGUge30KKyAgdm9pZCBPblBhZ2VfSW5WaWV3KENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpIG92ZXJyaWRlIHt9CisgIHZvaWQgT25QYWdlX091dFZpZXcoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCkgb3ZlcnJpZGUge30KKyAgdm9pZCBPbkZpZWxkX01vdXNlRG93bihGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgb3ZlcnJpZGUge30KKyAgdm9pZCBPbkZpZWxkX01vdXNlRW50ZXIoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgb3ZlcnJpZGUge30KKyAgdm9pZCBPbkZpZWxkX01vdXNlRXhpdChGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgb3ZlcnJpZGUge30KKyAgdm9pZCBPbkZpZWxkX01vdXNlVXAoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgb3ZlcnJpZGUge30KKyAgdm9pZCBPbkZpZWxkX0ZvY3VzKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSkgb3ZlcnJpZGUge30KKyAgdm9pZCBPbkZpZWxkX0JsdXIoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKSBvdmVycmlkZSB7fQorICB2b2lkIE9uRmllbGRfQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUmMpIG92ZXJyaWRlIHt9CisgIHZvaWQgT25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYldpbGxDb21taXQpIG92ZXJyaWRlIHt9CisgIHZvaWQgT25GaWVsZF9LZXlzdHJva2UoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBLZXlEb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgblNlbEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5TZWxTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiV2lsbENvbW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGaWVsZEZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlJjKSBvdmVycmlkZSB7fQorICB2b2lkIE9uRmllbGRfVmFsaWRhdGUoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYktleURvd24sCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiUmMpIG92ZXJyaWRlIHt9CisgIHZvaWQgT25TY3JlZW5fRm9jdXMoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgb3ZlcnJpZGUge30KKyAgdm9pZCBPblNjcmVlbl9CbHVyKEZYX0JPT0wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSBvdmVycmlkZSB7fQorICB2b2lkIE9uU2NyZWVuX09wZW4oRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlIHt9CisgIHZvaWQgT25TY3JlZW5fQ2xvc2UoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgb3ZlcnJpZGUge30KKyAgdm9pZCBPblNjcmVlbl9Nb3VzZURvd24oRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSBvdmVycmlkZSB7fQorICB2b2lkIE9uU2NyZWVuX01vdXNlVXAoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlIHt9CisgIHZvaWQgT25TY3JlZW5fTW91c2VFbnRlcihGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgb3ZlcnJpZGUge30KKyAgdm9pZCBPblNjcmVlbl9Nb3VzZUV4aXQoRlhfQk9PTCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSBvdmVycmlkZSB7fQorICB2b2lkIE9uU2NyZWVuX0luVmlldyhGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlIHt9CisgIHZvaWQgT25TY3JlZW5fT3V0VmlldyhGWF9CT09MIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgb3ZlcnJpZGUge30KKyAgdm9pZCBPbkJvb2ttYXJrX01vdXNlVXAoQ1BERl9Cb29rbWFyayogcEJvb2tNYXJrKSBvdmVycmlkZSB7fQorICB2b2lkIE9uTGlua19Nb3VzZVVwKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpIG92ZXJyaWRlIHt9CisgIHZvaWQgT25NZW51X0V4ZWMoQ1BERlNES19Eb2N1bWVudCogcFRhcmdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmKSBvdmVycmlkZSB7fQorICB2b2lkIE9uQmF0Y2hFeGVjKENQREZTREtfRG9jdW1lbnQqIHBUYXJnZXQpIG92ZXJyaWRlIHt9CisgIHZvaWQgT25Db25zb2xlX0V4ZWMoKSBvdmVycmlkZSB7fQorICB2b2lkIE9uRXh0ZXJuYWxfRXhlYygpIG92ZXJyaWRlIHt9CisgIHZvaWQgRW5hYmxlTWVzc2FnZUJveChGWF9CT09MIGJFbmFibGUpIG92ZXJyaWRlIHt9Cit9OworCitjbGFzcyBDSlNfUnVudGltZVN0dWIgZmluYWwgOiBwdWJsaWMgSUpTX1J1bnRpbWUgeworIHB1YmxpYzoKKyAgQ0pTX1J1bnRpbWVTdHViKCkgOiBtX3BEb2MobnVsbHB0cikge30KKyAgfkNKU19SdW50aW1lU3R1YigpIG92ZXJyaWRlIHt9CisKKyAgSUpTX0NvbnRleHQqIE5ld0NvbnRleHQoKSBvdmVycmlkZSB7CisgICAgaWYgKCFtX3BDb250ZXh0KQorICAgICAgbV9wQ29udGV4dC5yZXNldChuZXcgQ0pTX0NvbnRleHRTdHViKCkpOworICAgIHJldHVybiBHZXRDdXJyZW50Q29udGV4dCgpOworICB9CisKKyAgSUpTX0NvbnRleHQqIEdldEN1cnJlbnRDb250ZXh0KCkgb3ZlcnJpZGUgeyByZXR1cm4gbV9wQ29udGV4dC5nZXQoKTsgfQorICB2b2lkIFJlbGVhc2VDb250ZXh0KElKU19Db250ZXh0KiBwQ29udGV4dCkgb3ZlcnJpZGUge30KKworICB2b2lkIFNldFJlYWRlckRvY3VtZW50KENQREZTREtfRG9jdW1lbnQqIHBSZWFkZXJEb2MpIG92ZXJyaWRlIHsKKyAgICBtX3BEb2MgPSBwUmVhZGVyRG9jOworICB9CisgIENQREZTREtfRG9jdW1lbnQqIEdldFJlYWRlckRvY3VtZW50KCkgb3ZlcnJpZGUgeyByZXR1cm4gbV9wRG9jOyB9CisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0SFZhbHVlQnlOYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgdmlydHVhbCBGWF9CT09MIFNldEhWYWx1ZUJ5TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCisgIGludCBFeGVjdXRlKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogc2NyaXB0LAorICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyogaW5mbykgb3ZlcnJpZGUgeworICAgIHJldHVybiAwOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIENQREZTREtfRG9jdW1lbnQqIG1fcERvYzsKKyAgc3RkOjp1bmlxdWVfcHRyPENKU19Db250ZXh0U3R1Yj4gbV9wQ29udGV4dDsKK307CisKKy8vIHN0YXRpYwordm9pZCBJSlNfUnVudGltZTo6SW5pdGlhbGl6ZSh1bnNpZ25lZCBpbnQgc2xvdCwgdm9pZCogaXNvbGF0ZSkgeworfQorCisvLyBzdGF0aWMKK0lKU19SdW50aW1lKiBJSlNfUnVudGltZTo6Q3JlYXRlKENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYpIHsKKyAgcmV0dXJuIG5ldyBDSlNfUnVudGltZVN0dWI7Cit9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX1ZhbHVlLmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfVmFsdWUuY3BwCmluZGV4IDA5NDM4MDIuLmJkMDBhZGMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfVmFsdWUuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfVmFsdWUuY3BwCkBAIC0xLDY2MiArMSw4NzEgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KYXZhU2NyaXB0LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0RlZmluZS5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19PYmplY3QuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfVmFsdWUuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJKU19WYWx1ZS5oIgorCisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiSlNfRGVmaW5lLmgiCisjaW5jbHVkZSAiSlNfT2JqZWN0LmgiCisKK3N0YXRpYyBjb25zdCBGWF9EV09SRCBnX25hblsyXSA9IHswLCAweDdGRjgwMDAwfTsKK3N0YXRpYyBkb3VibGUgR2V0TmFuKCkgeworICByZXR1cm4gKihkb3VibGUqKWdfbmFuOworfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENKU19WYWx1ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLUNKU19WYWx1ZTo6Q0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlKSA6IG1fZVR5cGUoVlRfdW5rbm93biksbV9pc29sYXRlKGlzb2xhdGUpCi17Ci19Ci1DSlNfVmFsdWU6OkNKU19WYWx1ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlLEZYSlNWQUxVRVRZUEUgdCkgOgotCW1fcFZhbHVlKHBWYWx1ZSksIG1fZVR5cGUodCksIG1faXNvbGF0ZShpc29sYXRlKQoteworQ0pTX1ZhbHVlOjpDSlNfVmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKQorICAgIDogbV9lVHlwZShWVF91bmtub3duKSwgbV9wSlNSdW50aW1lKHBSdW50aW1lKSB7CiB9CiAKLUNKU19WYWx1ZTo6Q0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBjb25zdCBpbnQgJmlWYWx1ZSk6bV9pc29sYXRlKGlzb2xhdGUpCi17Ci0Jb3BlcmF0b3IgPShpVmFsdWUpOworQ0pTX1ZhbHVlOjpDSlNfVmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUsIFR5cGUgdCkKKyAgICA6IG1fZVR5cGUodCksIG1fcFZhbHVlKHBWYWx1ZSksIG1fcEpTUnVudGltZShwUnVudGltZSkgewogfQogCi1DSlNfVmFsdWU6OkNKU19WYWx1ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgY29uc3QgYm9vbCAmYlZhbHVlKTptX2lzb2xhdGUoaXNvbGF0ZSkKLXsKLQlvcGVyYXRvciA9KGJWYWx1ZSk7CitDSlNfVmFsdWU6OkNKU19WYWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIGNvbnN0IGludCYgaVZhbHVlKQorICAgIDogbV9wSlNSdW50aW1lKHBSdW50aW1lKSB7CisgIG9wZXJhdG9yPShpVmFsdWUpOwogfQogCi1DSlNfVmFsdWU6OkNKU19WYWx1ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgY29uc3QgZmxvYXQgJmZWYWx1ZSk6bV9pc29sYXRlKGlzb2xhdGUpCi17Ci0Jb3BlcmF0b3IgPShmVmFsdWUpOworQ0pTX1ZhbHVlOjpDSlNfVmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBjb25zdCBib29sJiBiVmFsdWUpCisgICAgOiBtX3BKU1J1bnRpbWUocFJ1bnRpbWUpIHsKKyAgb3BlcmF0b3I9KGJWYWx1ZSk7CiB9CiAKLUNKU19WYWx1ZTo6Q0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBjb25zdCBkb3VibGUgJmRWYWx1ZSk6bV9pc29sYXRlKGlzb2xhdGUpIAotewotCW9wZXJhdG9yID0oZFZhbHVlKTsKK0NKU19WYWx1ZTo6Q0pTX1ZhbHVlKENKU19SdW50aW1lKiBwUnVudGltZSwgY29uc3QgZmxvYXQmIGZWYWx1ZSkKKyAgICA6IG1fcEpTUnVudGltZShwUnVudGltZSkgeworICBvcGVyYXRvcj0oZlZhbHVlKTsKIH0KIAotQ0pTX1ZhbHVlOjpDSlNfVmFsdWUodjg6Oklzb2xhdGUqIGlzb2xhdGUsIEpTRlhPYmplY3QgIHBKc09iaik6bV9pc29sYXRlKGlzb2xhdGUpIAotewotCW9wZXJhdG9yID0ocEpzT2JqKTsKK0NKU19WYWx1ZTo6Q0pTX1ZhbHVlKENKU19SdW50aW1lKiBwUnVudGltZSwgY29uc3QgZG91YmxlJiBkVmFsdWUpCisgICAgOiBtX3BKU1J1bnRpbWUocFJ1bnRpbWUpIHsKKyAgb3BlcmF0b3I9KGRWYWx1ZSk7CiB9CiAKLUNKU19WYWx1ZTo6Q0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBDSlNfT2JqZWN0KiBwSnNPYmopOm1faXNvbGF0ZShpc29sYXRlKSAKLXsKLQlvcGVyYXRvciA9KHBKc09iaik7CitDSlNfVmFsdWU6OkNKU19WYWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwSnNPYmopCisgICAgOiBtX3BKU1J1bnRpbWUocFJ1bnRpbWUpIHsKKyAgb3BlcmF0b3I9KHBKc09iaik7CiB9CiAKLUNKU19WYWx1ZTo6Q0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBDSlNfRG9jdW1lbnQqIHBKc0RvYyk6bV9pc29sYXRlKGlzb2xhdGUpIAotewotCW1fZVR5cGUgPSBWVF9vYmplY3Q7Ci0JaWYgKHBKc0RvYykKLQkJbV9wVmFsdWUgPSAoSlNGWE9iamVjdCkqcEpzRG9jOworQ0pTX1ZhbHVlOjpDSlNfVmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBDSlNfT2JqZWN0KiBwSnNPYmopCisgICAgOiBtX3BKU1J1bnRpbWUocFJ1bnRpbWUpIHsKKyAgb3BlcmF0b3I9KHBKc09iaik7CiB9CiAKLUNKU19WYWx1ZTo6Q0pTX1ZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlLCBGWF9MUENXU1RSIHBXc3RyKTptX2lzb2xhdGUoaXNvbGF0ZSkgCi17Ci0Jb3BlcmF0b3IgPShwV3N0cik7CitDSlNfVmFsdWU6OkNKU19WYWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIENKU19Eb2N1bWVudCogcEpzRG9jKQorICAgIDogbV9wSlNSdW50aW1lKHBSdW50aW1lKSB7CisgIG1fZVR5cGUgPSBWVF9vYmplY3Q7CisgIGlmIChwSnNEb2MpCisgICAgbV9wVmFsdWUgPSBwSnNEb2MtPlRvVjhPYmplY3QoKTsKIH0KIAotQ0pTX1ZhbHVlOjpDSlNfVmFsdWUodjg6Oklzb2xhdGUqIGlzb2xhdGUsIEZYX0xQQ1NUUiBwU3RyKTptX2lzb2xhdGUoaXNvbGF0ZSkgCi17Ci0Jb3BlcmF0b3IgPSAocFN0cik7CitDSlNfVmFsdWU6OkNKU19WYWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIGNvbnN0IEZYX1dDSEFSKiBwV3N0cikKKyAgICA6IG1fcEpTUnVudGltZShwUnVudGltZSkgeworICBvcGVyYXRvcj0ocFdzdHIpOwogfQogCi1DSlNfVmFsdWU6OkNKU19WYWx1ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgQ0pTX0FycmF5JiBhcnJheSk6bV9pc29sYXRlKGlzb2xhdGUpIAotewotCW9wZXJhdG9yID0gKGFycmF5KTsKK0NKU19WYWx1ZTo6Q0pTX1ZhbHVlKENKU19SdW50aW1lKiBwUnVudGltZSwgY29uc3QgRlhfQ0hBUiogcFN0cikKKyAgICA6IG1fcEpTUnVudGltZShwUnVudGltZSkgeworICBvcGVyYXRvcj0ocFN0cik7CiB9CiAKLUNKU19WYWx1ZTo6fkNKU19WYWx1ZSgpCi17CitDSlNfVmFsdWU6OkNKU19WYWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIENKU19BcnJheSYgYXJyYXkpCisgICAgOiBtX3BKU1J1bnRpbWUocFJ1bnRpbWUpIHsKKyAgb3BlcmF0b3I9KGFycmF5KTsKIH0KIAotdm9pZCBDSlNfVmFsdWU6OkF0dGFjaCh2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUsRlhKU1ZBTFVFVFlQRSB0KQotewotCW1fcFZhbHVlID0gcFZhbHVlOwotCW1fZVR5cGUgPSB0OworQ0pTX1ZhbHVlOjp+Q0pTX1ZhbHVlKCkge30KKwordm9pZCBDSlNfVmFsdWU6OkF0dGFjaCh2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUsIFR5cGUgdCkgeworICBtX3BWYWx1ZSA9IHBWYWx1ZTsKKyAgbV9lVHlwZSA9IHQ7CiB9CiAKLXZvaWQgQ0pTX1ZhbHVlOjpBdHRhY2goQ0pTX1ZhbHVlICpwVmFsdWUpCi17Ci0JaWYgKHBWYWx1ZSkKLQkJQXR0YWNoKHBWYWx1ZS0+VG9WOFZhbHVlKCksIHBWYWx1ZS0+R2V0VHlwZSgpKTsKK3ZvaWQgQ0pTX1ZhbHVlOjpBdHRhY2goQ0pTX1ZhbHVlKiBwVmFsdWUpIHsKKyAgaWYgKHBWYWx1ZSkKKyAgICBBdHRhY2gocFZhbHVlLT5Ub1Y4VmFsdWUoKSwgcFZhbHVlLT5HZXRUeXBlKCkpOwogfQogCi12b2lkIENKU19WYWx1ZTo6RGV0YWNoKCkKLXsKLQltX3BWYWx1ZSA9IHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7Ci0JbV9lVHlwZSA9IFZUX3Vua25vd247Cit2b2lkIENKU19WYWx1ZTo6RGV0YWNoKCkgeworICBtX3BWYWx1ZSA9IHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7CisgIG1fZVR5cGUgPSBWVF91bmtub3duOwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIAotaW50IENKU19WYWx1ZTo6VG9JbnQoKSBjb25zdAotewotCXJldHVybiBKU19Ub0ludDMyKG1faXNvbGF0ZSwgbV9wVmFsdWUpOworaW50IENKU19WYWx1ZTo6VG9JbnQoKSBjb25zdCB7CisgIHJldHVybiBGWEpTX1RvSW50MzIobV9wSlNSdW50aW1lLT5HZXRJc29sYXRlKCksIG1fcFZhbHVlKTsKIH0KIAotYm9vbCBDSlNfVmFsdWU6OlRvQm9vbCgpIGNvbnN0Ci17Ci0JcmV0dXJuIEpTX1RvQm9vbGVhbihtX2lzb2xhdGUsIG1fcFZhbHVlKTsKK2Jvb2wgQ0pTX1ZhbHVlOjpUb0Jvb2woKSBjb25zdCB7CisgIHJldHVybiBGWEpTX1RvQm9vbGVhbihtX3BKU1J1bnRpbWUtPkdldElzb2xhdGUoKSwgbV9wVmFsdWUpOwogfQogCi1kb3VibGUgQ0pTX1ZhbHVlOjpUb0RvdWJsZSgpIGNvbnN0Ci17Ci0JcmV0dXJuIEpTX1RvTnVtYmVyKG1faXNvbGF0ZSwgbV9wVmFsdWUpOworZG91YmxlIENKU19WYWx1ZTo6VG9Eb3VibGUoKSBjb25zdCB7CisgIHJldHVybiBGWEpTX1RvTnVtYmVyKG1fcEpTUnVudGltZS0+R2V0SXNvbGF0ZSgpLCBtX3BWYWx1ZSk7CiB9CiAKLWZsb2F0IENKU19WYWx1ZTo6VG9GbG9hdCgpIGNvbnN0Ci17Ci0JcmV0dXJuIChmbG9hdClUb0RvdWJsZSgpOworZmxvYXQgQ0pTX1ZhbHVlOjpUb0Zsb2F0KCkgY29uc3QgeworICByZXR1cm4gKGZsb2F0KVRvRG91YmxlKCk7CiB9CiAKLUNKU19PYmplY3QqIENKU19WYWx1ZTo6VG9DSlNPYmplY3QoKSBjb25zdAotewotCXY4OjpMb2NhbDx2ODo6T2JqZWN0PglwT2JqID0gSlNfVG9PYmplY3QobV9pc29sYXRlLCBtX3BWYWx1ZSk7Ci0JcmV0dXJuIChDSlNfT2JqZWN0KilKU19HZXRQcml2YXRlKG1faXNvbGF0ZSwgcE9iaik7CitDSlNfT2JqZWN0KiBDSlNfVmFsdWU6OlRvQ0pTT2JqZWN0KCkgY29uc3QgeworICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiA9CisgICAgICBGWEpTX1RvT2JqZWN0KG1fcEpTUnVudGltZS0+R2V0SXNvbGF0ZSgpLCBtX3BWYWx1ZSk7CisgIHJldHVybiAoQ0pTX09iamVjdCopRlhKU19HZXRQcml2YXRlKG1fcEpTUnVudGltZS0+R2V0SXNvbGF0ZSgpLCBwT2JqKTsKIH0KIAotdjg6OkxvY2FsPHY4OjpPYmplY3Q+IENKU19WYWx1ZTo6VG9WOE9iamVjdCgpIGNvbnN0Ci17Ci0JcmV0dXJuIEpTX1RvT2JqZWN0KG1faXNvbGF0ZSwgbV9wVmFsdWUpOwordjg6OkxvY2FsPHY4OjpPYmplY3Q+IENKU19WYWx1ZTo6VG9WOE9iamVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIEZYSlNfVG9PYmplY3QobV9wSlNSdW50aW1lLT5HZXRJc29sYXRlKCksIG1fcFZhbHVlKTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ0pTX1ZhbHVlOjpUb0NGWFdpZGVTdHJpbmcoKSBjb25zdAotewotCXJldHVybiBKU19Ub1N0cmluZyhtX2lzb2xhdGUsIG1fcFZhbHVlKTsKK0NGWF9XaWRlU3RyaW5nIENKU19WYWx1ZTo6VG9DRlhXaWRlU3RyaW5nKCkgY29uc3QgeworICByZXR1cm4gRlhKU19Ub1N0cmluZyhtX3BKU1J1bnRpbWUtPkdldElzb2xhdGUoKSwgbV9wVmFsdWUpOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDSlNfVmFsdWU6OlRvQ0ZYQnl0ZVN0cmluZygpIGNvbnN0Ci17Ci0JcmV0dXJuIENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShUb0NGWFdpZGVTdHJpbmcoKSk7CitDRlhfQnl0ZVN0cmluZyBDSlNfVmFsdWU6OlRvQ0ZYQnl0ZVN0cmluZygpIGNvbnN0IHsKKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShUb0NGWFdpZGVTdHJpbmcoKSk7CiB9CiAKLXY4OjpMb2NhbDx2ODo6VmFsdWU+IENKU19WYWx1ZTo6VG9WOFZhbHVlKCkgY29uc3QKLXsKLQlyZXR1cm4gbV9wVmFsdWU7Cit2ODo6TG9jYWw8djg6OlZhbHVlPiBDSlNfVmFsdWU6OlRvVjhWYWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcFZhbHVlOwogfQogCi12ODo6TG9jYWw8djg6OkFycmF5PkNKU19WYWx1ZTo6VG9WOEFycmF5KCkgY29uc3QKLXsKLQlpZiAoSXNBcnJheU9iamVjdCgpKQotCQlyZXR1cm4gdjg6OkxvY2FsPHY4OjpBcnJheT46OkNhc3QoSlNfVG9PYmplY3QobV9pc29sYXRlLCBtX3BWYWx1ZSkpOwotCXJldHVybiB2ODo6TG9jYWw8djg6OkFycmF5PigpOwordjg6OkxvY2FsPHY4OjpBcnJheT4gQ0pTX1ZhbHVlOjpUb1Y4QXJyYXkoKSBjb25zdCB7CisgIGlmIChJc0FycmF5T2JqZWN0KCkpCisgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6QXJyYXk+OjpDYXN0KAorICAgICAgICBGWEpTX1RvT2JqZWN0KG1fcEpTUnVudGltZS0+R2V0SXNvbGF0ZSgpLCBtX3BWYWx1ZSkpOworICByZXR1cm4gdjg6OkxvY2FsPHY4OjpBcnJheT4oKTsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAKLXZvaWQgQ0pTX1ZhbHVlOjpvcGVyYXRvciA9KGludCBpVmFsdWUpCi17Ci0JbV9wVmFsdWUgPSBKU19OZXdOdW1iZXIobV9pc29sYXRlLCBpVmFsdWUpOwotCi0JbV9lVHlwZSA9IFZUX251bWJlcjsKK3ZvaWQgQ0pTX1ZhbHVlOjpvcGVyYXRvcj0oaW50IGlWYWx1ZSkgeworICBtX3BWYWx1ZSA9IEZYSlNfTmV3TnVtYmVyKG1fcEpTUnVudGltZS0+R2V0SXNvbGF0ZSgpLCBpVmFsdWUpOworICBtX2VUeXBlID0gVlRfbnVtYmVyOwogfQogCi12b2lkIENKU19WYWx1ZTo6b3BlcmF0b3IgPShib29sIGJWYWx1ZSkKLXsKLQltX3BWYWx1ZSA9IEpTX05ld0Jvb2xlYW4obV9pc29sYXRlLCBiVmFsdWUpOwotCi0JbV9lVHlwZSA9IFZUX2Jvb2xlYW47Cit2b2lkIENKU19WYWx1ZTo6b3BlcmF0b3I9KGJvb2wgYlZhbHVlKSB7CisgIG1fcFZhbHVlID0gRlhKU19OZXdCb29sZWFuKG1fcEpTUnVudGltZS0+R2V0SXNvbGF0ZSgpLCBiVmFsdWUpOworICBtX2VUeXBlID0gVlRfYm9vbGVhbjsKIH0KIAotdm9pZCBDSlNfVmFsdWU6Om9wZXJhdG9yID0oZG91YmxlIGRWYWx1ZSkKLXsKLQltX3BWYWx1ZSA9IEpTX05ld051bWJlcihtX2lzb2xhdGUsZFZhbHVlKTsKLQotCW1fZVR5cGUgPSBWVF9udW1iZXI7Cit2b2lkIENKU19WYWx1ZTo6b3BlcmF0b3I9KGRvdWJsZSBkVmFsdWUpIHsKKyAgbV9wVmFsdWUgPSBGWEpTX05ld051bWJlcihtX3BKU1J1bnRpbWUtPkdldElzb2xhdGUoKSwgZFZhbHVlKTsKKyAgbV9lVHlwZSA9IFZUX251bWJlcjsKIH0KIAotdm9pZCBDSlNfVmFsdWU6Om9wZXJhdG9yID0gKGZsb2F0IGZWYWx1ZSkKLXsKLQltX3BWYWx1ZSA9IEpTX05ld051bWJlcihtX2lzb2xhdGUsZlZhbHVlKTsKLQltX2VUeXBlID0gVlRfbnVtYmVyOwordm9pZCBDSlNfVmFsdWU6Om9wZXJhdG9yPShmbG9hdCBmVmFsdWUpIHsKKyAgbV9wVmFsdWUgPSBGWEpTX05ld051bWJlcihtX3BKU1J1bnRpbWUtPkdldElzb2xhdGUoKSwgZlZhbHVlKTsKKyAgbV9lVHlwZSA9IFZUX251bWJlcjsKIH0KIAotdm9pZCBDSlNfVmFsdWU6Om9wZXJhdG9yID0odjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopCi17Ci0KLQltX3BWYWx1ZSA9IEpTX05ld09iamVjdChtX2lzb2xhdGUscE9iaik7Ci0KLQltX2VUeXBlID0gVlRfZnhvYmplY3Q7Cit2b2lkIENKU19WYWx1ZTo6b3BlcmF0b3I9KHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqKSB7CisgIG1fcFZhbHVlID0gRlhKU19OZXdPYmplY3QobV9wSlNSdW50aW1lLT5HZXRJc29sYXRlKCksIHBPYmopOworICBtX2VUeXBlID0gVlRfZnhvYmplY3Q7CiB9CiAKLXZvaWQgQ0pTX1ZhbHVlOjpvcGVyYXRvciA9KENKU19PYmplY3QgKiBwT2JqKQotewotCWlmIChwT2JqKQotCQlvcGVyYXRvciA9ICgoSlNGWE9iamVjdCkqcE9iaik7Cit2b2lkIENKU19WYWx1ZTo6b3BlcmF0b3I9KENKU19PYmplY3QqIHBPYmopIHsKKyAgaWYgKHBPYmopCisgICAgb3BlcmF0b3I9KHBPYmotPlRvVjhPYmplY3QoKSk7CiB9CiAKLXZvaWQgQ0pTX1ZhbHVlOjpvcGVyYXRvciA9IChDSlNfRG9jdW1lbnQqIHBKc0RvYykKLXsKLQltX2VUeXBlID0gVlRfb2JqZWN0OwotCWlmIChwSnNEb2MpIHsKLQkJbV9wVmFsdWUgPSBzdGF0aWNfY2FzdDxKU0ZYT2JqZWN0PigqcEpzRG9jKTsKLQl9Cit2b2lkIENKU19WYWx1ZTo6b3BlcmF0b3I9KENKU19Eb2N1bWVudCogcEpzRG9jKSB7CisgIG1fZVR5cGUgPSBWVF9vYmplY3Q7CisgIGlmIChwSnNEb2MpIHsKKyAgICBtX3BWYWx1ZSA9IHBKc0RvYy0+VG9WOE9iamVjdCgpOworICB9CiB9CiAKLXZvaWQgQ0pTX1ZhbHVlOjpvcGVyYXRvciA9KEZYX0xQQ1dTVFIgcFdzdHIpCi17Ci0JbV9wVmFsdWUgPSBKU19OZXdTdHJpbmcobV9pc29sYXRlLCh3Y2hhcl90ICopcFdzdHIpOwotCi0JbV9lVHlwZSA9IFZUX3N0cmluZzsKK3ZvaWQgQ0pTX1ZhbHVlOjpvcGVyYXRvcj0oY29uc3QgRlhfV0NIQVIqIHBXc3RyKSB7CisgIG1fcFZhbHVlID0gRlhKU19OZXdTdHJpbmcobV9wSlNSdW50aW1lLT5HZXRJc29sYXRlKCksICh3Y2hhcl90KilwV3N0cik7CisgIG1fZVR5cGUgPSBWVF9zdHJpbmc7CiB9CiAKLXZvaWQgQ0pTX1ZhbHVlOjpTZXROdWxsKCkKLXsKLQltX3BWYWx1ZSA9IEpTX05ld051bGwoKTsKLQotCW1fZVR5cGUgPSBWVF9udWxsOwordm9pZCBDSlNfVmFsdWU6OlNldE51bGwoKSB7CisgIG1fcFZhbHVlID0gRlhKU19OZXdOdWxsKCk7CisgIG1fZVR5cGUgPSBWVF9udWxsOwogfQogCi12b2lkIENKU19WYWx1ZTo6b3BlcmF0b3IgPSAoRlhfTFBDU1RSIHBTdHIpCi17CQotCW9wZXJhdG9yID0gKENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwocFN0cikuY19zdHIoKSk7Cit2b2lkIENKU19WYWx1ZTo6b3BlcmF0b3I9KGNvbnN0IEZYX0NIQVIqIHBTdHIpIHsKKyAgb3BlcmF0b3I9KENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwocFN0cikuY19zdHIoKSk7CiB9CiAKLXZvaWQgQ0pTX1ZhbHVlOjpvcGVyYXRvciA9IChDSlNfQXJyYXkgJiBhcnJheSkKLXsKLQltX3BWYWx1ZSA9IEpTX05ld09iamVjdDIobV9pc29sYXRlLCh2ODo6TG9jYWw8djg6OkFycmF5PilhcnJheSk7Ci0KLQltX2VUeXBlID0gVlRfb2JqZWN0Owordm9pZCBDSlNfVmFsdWU6Om9wZXJhdG9yPShDSlNfQXJyYXkmIGFycmF5KSB7CisgIG1fcFZhbHVlID0KKyAgICAgIEZYSlNfTmV3T2JqZWN0MihtX3BKU1J1bnRpbWUtPkdldElzb2xhdGUoKSwgKHY4OjpMb2NhbDx2ODo6QXJyYXk+KWFycmF5KTsKKyAgbV9lVHlwZSA9IFZUX29iamVjdDsKIH0KIAotdm9pZCBDSlNfVmFsdWU6Om9wZXJhdG9yID0gKENKU19EYXRlICYgZGF0ZSkKLXsKLQltX3BWYWx1ZSA9IEpTX05ld0RhdGUobV9pc29sYXRlLCAoZG91YmxlKWRhdGUpOwotCi0JbV9lVHlwZSA9IFZUX2RhdGU7Cit2b2lkIENKU19WYWx1ZTo6b3BlcmF0b3I9KENKU19EYXRlJiBkYXRlKSB7CisgIG1fcFZhbHVlID0gRlhKU19OZXdEYXRlKG1fcEpTUnVudGltZS0+R2V0SXNvbGF0ZSgpLCAoZG91YmxlKWRhdGUpOworICBtX2VUeXBlID0gVlRfZGF0ZTsKIH0KIAotdm9pZCBDSlNfVmFsdWU6Om9wZXJhdG9yID0gKENKU19WYWx1ZSB2YWx1ZSkKLXsKLQltX3BWYWx1ZSA9IHZhbHVlLlRvVjhWYWx1ZSgpOwotCi0JbV9lVHlwZSA9IHZhbHVlLm1fZVR5cGU7Ci0gICAgICAgIG1faXNvbGF0ZSA9IHZhbHVlLm1faXNvbGF0ZTsKK3ZvaWQgQ0pTX1ZhbHVlOjpvcGVyYXRvcj0oQ0pTX1ZhbHVlIHZhbHVlKSB7CisgIG1fcFZhbHVlID0gdmFsdWUuVG9WOFZhbHVlKCk7CisgIG1fZVR5cGUgPSB2YWx1ZS5tX2VUeXBlOworICBtX3BKU1J1bnRpbWUgPSB2YWx1ZS5tX3BKU1J1bnRpbWU7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogCi1GWEpTVkFMVUVUWVBFIENKU19WYWx1ZTo6R2V0VHlwZSgpIGNvbnN0Ci17Ci0JaWYobV9wVmFsdWUuSXNFbXB0eSgpKSByZXR1cm4gVlRfdW5rbm93bjsKLQlpZihtX3BWYWx1ZS0+SXNTdHJpbmcoKSkgcmV0dXJuIFZUX3N0cmluZzsKLQlpZihtX3BWYWx1ZS0+SXNOdW1iZXIoKSkgcmV0dXJuIFZUX251bWJlcjsKLQlpZihtX3BWYWx1ZS0+SXNCb29sZWFuKCkpIHJldHVybiBWVF9ib29sZWFuOwotCWlmKG1fcFZhbHVlLT5Jc0RhdGUoKSkgcmV0dXJuIFZUX2RhdGU7Ci0JaWYobV9wVmFsdWUtPklzT2JqZWN0KCkpIHJldHVybiBWVF9vYmplY3Q7Ci0JaWYobV9wVmFsdWUtPklzTnVsbCgpKSByZXR1cm4gVlRfbnVsbDsKLQlpZihtX3BWYWx1ZS0+SXNVbmRlZmluZWQoKSkgcmV0dXJuIFZUX3VuZGVmaW5lZDsKLQlyZXR1cm4gVlRfdW5rbm93bjsKK0NKU19WYWx1ZTo6VHlwZSBDSlNfVmFsdWU6OkdldFR5cGUoKSBjb25zdCB7CisgIGlmIChtX3BWYWx1ZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIFZUX3Vua25vd247CisgIGlmIChtX3BWYWx1ZS0+SXNTdHJpbmcoKSkKKyAgICByZXR1cm4gVlRfc3RyaW5nOworICBpZiAobV9wVmFsdWUtPklzTnVtYmVyKCkpCisgICAgcmV0dXJuIFZUX251bWJlcjsKKyAgaWYgKG1fcFZhbHVlLT5Jc0Jvb2xlYW4oKSkKKyAgICByZXR1cm4gVlRfYm9vbGVhbjsKKyAgaWYgKG1fcFZhbHVlLT5Jc0RhdGUoKSkKKyAgICByZXR1cm4gVlRfZGF0ZTsKKyAgaWYgKG1fcFZhbHVlLT5Jc09iamVjdCgpKQorICAgIHJldHVybiBWVF9vYmplY3Q7CisgIGlmIChtX3BWYWx1ZS0+SXNOdWxsKCkpCisgICAgcmV0dXJuIFZUX251bGw7CisgIGlmIChtX3BWYWx1ZS0+SXNVbmRlZmluZWQoKSkKKyAgICByZXR1cm4gVlRfdW5kZWZpbmVkOworICByZXR1cm4gVlRfdW5rbm93bjsKIH0KIAotRlhfQk9PTCBDSlNfVmFsdWU6OklzQXJyYXlPYmplY3QoKSBjb25zdCAKLXsKLQlpZihtX3BWYWx1ZS5Jc0VtcHR5KCkpIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gbV9wVmFsdWUtPklzQXJyYXkoKTsKK0ZYX0JPT0wgQ0pTX1ZhbHVlOjpJc0FycmF5T2JqZWN0KCkgY29uc3QgeworICBpZiAobV9wVmFsdWUuSXNFbXB0eSgpKQorICAgIHJldHVybiBGQUxTRTsKKyAgcmV0dXJuIG1fcFZhbHVlLT5Jc0FycmF5KCk7CiB9CiAKLUZYX0JPT0wgQ0pTX1ZhbHVlOjpJc0RhdGVPYmplY3QoKSBjb25zdAotewotCWlmKG1fcFZhbHVlLklzRW1wdHkoKSkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBtX3BWYWx1ZS0+SXNEYXRlKCk7CitGWF9CT09MIENKU19WYWx1ZTo6SXNEYXRlT2JqZWN0KCkgY29uc3QgeworICBpZiAobV9wVmFsdWUuSXNFbXB0eSgpKQorICAgIHJldHVybiBGQUxTRTsKKyAgcmV0dXJuIG1fcFZhbHVlLT5Jc0RhdGUoKTsKIH0KIAotLy9DSlNfVmFsdWU6Om9wZXJhdG9yIENKU19BcnJheSgpCi1GWF9CT09MIENKU19WYWx1ZTo6Q29udmVydFRvQXJyYXkoQ0pTX0FycmF5ICZhcnJheSkgY29uc3QKLXsKLQlpZiAoSXNBcnJheU9iamVjdCgpKQotCXsKLQkJYXJyYXkuQXR0YWNoKEpTX1RvQXJyYXkobV9pc29sYXRlLCBtX3BWYWx1ZSkpOwotCQlyZXR1cm4gVFJVRTsKLQl9CisvLyBDSlNfVmFsdWU6Om9wZXJhdG9yIENKU19BcnJheSgpCitGWF9CT09MIENKU19WYWx1ZTo6Q29udmVydFRvQXJyYXkoQ0pTX0FycmF5JiBhcnJheSkgY29uc3QgeworICBpZiAoSXNBcnJheU9iamVjdCgpKSB7CisgICAgYXJyYXkuQXR0YWNoKEZYSlNfVG9BcnJheShtX3BKU1J1bnRpbWUtPkdldElzb2xhdGUoKSwgbV9wVmFsdWUpKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQogCi0JcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgQ0pTX1ZhbHVlOjpDb252ZXJ0VG9EYXRlKENKU19EYXRlICZkYXRlKSBjb25zdAotewotLy8gCWlmIChHZXRUeXBlKCkgPT0gVlRfZGF0ZSkKLS8vIAl7Ci0vLyAJCWRhdGUgPSAoZG91YmxlKSgqdGhpcyk7Ci0vLyAJCXJldHVybiBUUlVFOwotLy8gCX0KK0ZYX0JPT0wgQ0pTX1ZhbHVlOjpDb252ZXJ0VG9EYXRlKENKU19EYXRlJiBkYXRlKSBjb25zdCB7CisgIC8vIAlpZiAoR2V0VHlwZSgpID09IFZUX2RhdGUpCisgIC8vIAl7CisgIC8vIAkJZGF0ZSA9IChkb3VibGUpKCp0aGlzKTsKKyAgLy8gCQlyZXR1cm4gVFJVRTsKKyAgLy8gCX0KIAotCWlmIChJc0RhdGVPYmplY3QoKSkKLQl7Ci0JCWRhdGUuQXR0YWNoKG1fcFZhbHVlKTsKLQkJcmV0dXJuIFRSVUU7Ci0JfQorICBpZiAoSXNEYXRlT2JqZWN0KCkpIHsKKyAgICBkYXRlLkF0dGFjaChtX3BWYWx1ZSk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KIAotCXJldHVybiBGQUxTRTsJCisgIHJldHVybiBGQUxTRTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDSlNfUHJvcFZhbHVlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ0pTX1Byb3BWYWx1ZTo6Q0pTX1Byb3BWYWx1ZShjb25zdCBDSlNfVmFsdWUgJnZhbHVlKSA6IAotCUNKU19WYWx1ZSh2YWx1ZSksCi0JbV9iSXNTZXR0aW5nKDApCi17CitDSlNfUHJvcFZhbHVlOjpDSlNfUHJvcFZhbHVlKGNvbnN0IENKU19WYWx1ZSYgdmFsdWUpCisgICAgOiBDSlNfVmFsdWUodmFsdWUpLCBtX2JJc1NldHRpbmcoMCkge30KKworQ0pTX1Byb3BWYWx1ZTo6Q0pTX1Byb3BWYWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUpCisgICAgOiBDSlNfVmFsdWUocFJ1bnRpbWUpLCBtX2JJc1NldHRpbmcoMCkgewogfQogCi1DSlNfUHJvcFZhbHVlOjpDSlNfUHJvcFZhbHVlKHY4OjpJc29sYXRlKiBpc29sYXRlKSA6IENKU19WYWx1ZShpc29sYXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYklzU2V0dGluZygwKQoteworQ0pTX1Byb3BWYWx1ZTo6fkNKU19Qcm9wVmFsdWUoKSB7CiB9CiAKLUNKU19Qcm9wVmFsdWU6On5DSlNfUHJvcFZhbHVlKCkKLXsKK3ZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I8PChpbnQgaVZhbHVlKSB7CisgIEFTU0VSVCghbV9iSXNTZXR0aW5nKTsKKyAgQ0pTX1ZhbHVlOjpvcGVyYXRvcj0oaVZhbHVlKTsKIH0KIAotRlhfQk9PTCBDSlNfUHJvcFZhbHVlOjpJc1NldHRpbmcoKQotewotCXJldHVybiBtX2JJc1NldHRpbmc7Cit2b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yPj4oaW50JiBpVmFsdWUpIGNvbnN0IHsKKyAgQVNTRVJUKG1fYklzU2V0dGluZyk7CisgIGlWYWx1ZSA9IENKU19WYWx1ZTo6VG9JbnQoKTsKIH0KIAotRlhfQk9PTCBDSlNfUHJvcFZhbHVlOjpJc0dldHRpbmcoKQotewotCXJldHVybiAhbV9iSXNTZXR0aW5nOwordm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvcjw8KGJvb2wgYlZhbHVlKSB7CisgIEFTU0VSVCghbV9iSXNTZXR0aW5nKTsKKyAgQ0pTX1ZhbHVlOjpvcGVyYXRvcj0oYlZhbHVlKTsKIH0KIAotdm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvciA8PChpbnQgaVZhbHVlKQotewotCUFTU0VSVCghbV9iSXNTZXR0aW5nKTsKLQlDSlNfVmFsdWU6Om9wZXJhdG9yID0oaVZhbHVlKTsKK3ZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I+Pihib29sJiBiVmFsdWUpIGNvbnN0IHsKKyAgQVNTRVJUKG1fYklzU2V0dGluZyk7CisgIGJWYWx1ZSA9IENKU19WYWx1ZTo6VG9Cb29sKCk7CiB9CiAKLXZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3IgPj4oaW50ICYgaVZhbHVlKSBjb25zdAotewotCUFTU0VSVChtX2JJc1NldHRpbmcpOwotCWlWYWx1ZSA9IENKU19WYWx1ZTo6VG9JbnQoKTsKK3ZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I8PChkb3VibGUgZFZhbHVlKSB7CisgIEFTU0VSVCghbV9iSXNTZXR0aW5nKTsKKyAgQ0pTX1ZhbHVlOjpvcGVyYXRvcj0oZFZhbHVlKTsKIH0KIAotCi12b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yIDw8KGJvb2wgYlZhbHVlKQotewotCUFTU0VSVCghbV9iSXNTZXR0aW5nKTsKLQlDSlNfVmFsdWU6Om9wZXJhdG9yID0oYlZhbHVlKTsKK3ZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I+Pihkb3VibGUmIGRWYWx1ZSkgY29uc3QgeworICBBU1NFUlQobV9iSXNTZXR0aW5nKTsKKyAgZFZhbHVlID0gQ0pTX1ZhbHVlOjpUb0RvdWJsZSgpOwogfQogCi12b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yID4+KGJvb2wmIGJWYWx1ZSkgY29uc3QKLXsKLQlBU1NFUlQobV9iSXNTZXR0aW5nKTsKLQliVmFsdWUgPSBDSlNfVmFsdWU6OlRvQm9vbCgpOwordm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvcjw8KENKU19PYmplY3QqIHBPYmopIHsKKyAgQVNTRVJUKCFtX2JJc1NldHRpbmcpOworICBDSlNfVmFsdWU6Om9wZXJhdG9yPShwT2JqKTsKIH0KIAotdm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvciA8PChkb3VibGUgZFZhbHVlKQotewotCUFTU0VSVCghbV9iSXNTZXR0aW5nKTsKLQlDSlNfVmFsdWU6Om9wZXJhdG9yID0oZFZhbHVlKTsKK3ZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I+PihDSlNfT2JqZWN0KiYgcHBPYmopIGNvbnN0IHsKKyAgQVNTRVJUKG1fYklzU2V0dGluZyk7CisgIHBwT2JqID0gQ0pTX1ZhbHVlOjpUb0NKU09iamVjdCgpOwogfQogCi12b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yID4+KGRvdWJsZSYgZFZhbHVlKSBjb25zdAotewotCUFTU0VSVChtX2JJc1NldHRpbmcpOwotCWRWYWx1ZSA9IENKU19WYWx1ZTo6VG9Eb3VibGUoKTsKK3ZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I8PChDSlNfRG9jdW1lbnQqIHBKc0RvYykgeworICBBU1NFUlQoIW1fYklzU2V0dGluZyk7CisgIENKU19WYWx1ZTo6b3BlcmF0b3I9KHBKc0RvYyk7CiB9CiAKLXZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3IgPDwoQ0pTX09iamVjdCogcE9iaikKLXsKLQlBU1NFUlQoIW1fYklzU2V0dGluZyk7Ci0JQ0pTX1ZhbHVlOjpvcGVyYXRvciA9IChwT2JqKTsKK3ZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I+PihDSlNfRG9jdW1lbnQqJiBwcEpzRG9jKSBjb25zdCB7CisgIEFTU0VSVChtX2JJc1NldHRpbmcpOworICBwcEpzRG9jID0gc3RhdGljX2Nhc3Q8Q0pTX0RvY3VtZW50Kj4oQ0pTX1ZhbHVlOjpUb0NKU09iamVjdCgpKTsKIH0KIAotdm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvciA+PihDSlNfT2JqZWN0KiYgcHBPYmopIGNvbnN0Ci17Ci0JQVNTRVJUKG1fYklzU2V0dGluZyk7Ci0JcHBPYmogPSBDSlNfVmFsdWU6OlRvQ0pTT2JqZWN0KCk7Cit2b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yPDwodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopIHsKKyAgQVNTRVJUKCFtX2JJc1NldHRpbmcpOworICBDSlNfVmFsdWU6Om9wZXJhdG9yPShwT2JqKTsKIH0KIAotdm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvciA8PChDSlNfRG9jdW1lbnQqIHBKc0RvYykKLXsKLQlBU1NFUlQoIW1fYklzU2V0dGluZyk7Ci0JQ0pTX1ZhbHVlOjpvcGVyYXRvciA9IChwSnNEb2MpOwordm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvcj4+KHY4OjpMb2NhbDx2ODo6T2JqZWN0PiYgcHBPYmopIGNvbnN0IHsKKyAgQVNTRVJUKG1fYklzU2V0dGluZyk7CisgIHBwT2JqID0gQ0pTX1ZhbHVlOjpUb1Y4T2JqZWN0KCk7CiB9CiAKLXZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3IgPj4oQ0pTX0RvY3VtZW50KiYgcHBKc0RvYykgY29uc3QKLXsKLQlBU1NFUlQobV9iSXNTZXR0aW5nKTsKLQlwcEpzRG9jID0gc3RhdGljX2Nhc3Q8Q0pTX0RvY3VtZW50Kj4oQ0pTX1ZhbHVlOjpUb0NKU09iamVjdCgpKTsKK3ZvaWQgQ0pTX1Byb3BWYWx1ZTo6U3RhcnRTZXR0aW5nKCkgeworICBtX2JJc1NldHRpbmcgPSAxOwogfQogCi12b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yPDwoSlNGWE9iamVjdCBwT2JqKQotewotCUFTU0VSVCghbV9iSXNTZXR0aW5nKTsKLQlDSlNfVmFsdWU6Om9wZXJhdG9yID0gKHBPYmopOwordm9pZCBDSlNfUHJvcFZhbHVlOjpTdGFydEdldHRpbmcoKSB7CisgIG1fYklzU2V0dGluZyA9IDA7Cit9Cit2b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yPDwoQ0ZYX0J5dGVTdHJpbmcgc3RyaW5nKSB7CisgIEFTU0VSVCghbV9iSXNTZXR0aW5nKTsKKyAgQ0pTX1ZhbHVlOjpvcGVyYXRvcj0oc3RyaW5nLmNfc3RyKCkpOwogfQogCi12b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yPj4oSlNGWE9iamVjdCAmcHBPYmopIGNvbnN0Ci17Ci0JQVNTRVJUKG1fYklzU2V0dGluZyk7Ci0JcHBPYmogPSBDSlNfVmFsdWU6OlRvVjhPYmplY3QoKTsKK3ZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I+PihDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKSBjb25zdCB7CisgIEFTU0VSVChtX2JJc1NldHRpbmcpOworICBzdHJpbmcgPSBDSlNfVmFsdWU6OlRvQ0ZYQnl0ZVN0cmluZygpOwogfQogCi0KLXZvaWQgQ0pTX1Byb3BWYWx1ZTo6U3RhcnRTZXR0aW5nKCkKLXsKLQltX2JJc1NldHRpbmcgPSAxOwordm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvcjw8KGNvbnN0IEZYX1dDSEFSKiBjX3N0cmluZykgeworICBBU1NFUlQoIW1fYklzU2V0dGluZyk7CisgIENKU19WYWx1ZTo6b3BlcmF0b3I9KGNfc3RyaW5nKTsKIH0KIAotdm9pZCBDSlNfUHJvcFZhbHVlOjpTdGFydEdldHRpbmcoKQotewotCW1fYklzU2V0dGluZyA9IDA7Ci19Ci12b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yIDw8KENGWF9CeXRlU3RyaW5nIHN0cmluZykKLXsKLQlBU1NFUlQoIW1fYklzU2V0dGluZyk7Ci0JQ0pTX1ZhbHVlOjpvcGVyYXRvciA9IChzdHJpbmcuY19zdHIoKSk7Cit2b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yPj4oQ0ZYX1dpZGVTdHJpbmcmIHdpZGVfc3RyaW5nKSBjb25zdCB7CisgIEFTU0VSVChtX2JJc1NldHRpbmcpOworICB3aWRlX3N0cmluZyA9IENKU19WYWx1ZTo6VG9DRlhXaWRlU3RyaW5nKCk7CiB9CiAKLXZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3IgPj4oQ0ZYX0J5dGVTdHJpbmcgJnN0cmluZykgY29uc3QKLXsKLQlBU1NFUlQobV9iSXNTZXR0aW5nKTsKLQlzdHJpbmcgPSBDSlNfVmFsdWU6OlRvQ0ZYQnl0ZVN0cmluZygpOwordm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvcjw8KENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nKSB7CisgIEFTU0VSVCghbV9iSXNTZXR0aW5nKTsKKyAgQ0pTX1ZhbHVlOjpvcGVyYXRvcj0od2lkZV9zdHJpbmcuY19zdHIoKSk7CiB9CiAKLXZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3IgPDwoRlhfTFBDV1NUUiBjX3N0cmluZykKLXsKLQlBU1NFUlQoIW1fYklzU2V0dGluZyk7Ci0JQ0pTX1ZhbHVlOjpvcGVyYXRvciA9KGNfc3RyaW5nKTsKK3ZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I+PihDSlNfQXJyYXkmIGFycmF5KSBjb25zdCB7CisgIEFTU0VSVChtX2JJc1NldHRpbmcpOworICBDb252ZXJ0VG9BcnJheShhcnJheSk7CiB9CiAKLXZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3IgPj4oQ0ZYX1dpZGVTdHJpbmcgJndpZGVfc3RyaW5nKSBjb25zdAotewotCUFTU0VSVChtX2JJc1NldHRpbmcpOwotCXdpZGVfc3RyaW5nID0gQ0pTX1ZhbHVlOjpUb0NGWFdpZGVTdHJpbmcoKTsKK3ZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I8PChDSlNfQXJyYXkmIGFycmF5KSB7CisgIEFTU0VSVCghbV9iSXNTZXR0aW5nKTsKKyAgQ0pTX1ZhbHVlOjpvcGVyYXRvcj0oYXJyYXkpOwogfQogCi12b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yIDw8KENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nKQotewotCUFTU0VSVCghbV9iSXNTZXR0aW5nKTsKLQlDSlNfVmFsdWU6Om9wZXJhdG9yID0gKHdpZGVfc3RyaW5nLmNfc3RyKCkpOwordm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvcj4+KENKU19EYXRlJiBkYXRlKSBjb25zdCB7CisgIEFTU0VSVChtX2JJc1NldHRpbmcpOworICBDb252ZXJ0VG9EYXRlKGRhdGUpOwogfQogCi12b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yID4+KENKU19BcnJheSAmYXJyYXkpIGNvbnN0Ci17Ci0JQVNTRVJUKG1fYklzU2V0dGluZyk7Ci0JQ29udmVydFRvQXJyYXkoYXJyYXkpOwordm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvcjw8KENKU19EYXRlJiBkYXRlKSB7CisgIEFTU0VSVCghbV9iSXNTZXR0aW5nKTsKKyAgQ0pTX1ZhbHVlOjpvcGVyYXRvcj0oZGF0ZSk7CiB9CiAKLXZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3IgPDwoQ0pTX0FycmF5ICZhcnJheSkKLXsKLQlBU1NFUlQoIW1fYklzU2V0dGluZyk7Ci0JQ0pTX1ZhbHVlOjpvcGVyYXRvcj0oYXJyYXkpOworQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3Igdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKSBjb25zdCB7CisgIHJldHVybiBtX3BWYWx1ZTsKIH0KIAotdm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvcj4+KENKU19EYXRlICZkYXRlKSBjb25zdAotewotCUFTU0VSVChtX2JJc1NldHRpbmcpOwotCUNvbnZlcnRUb0RhdGUoZGF0ZSk7CitDSlNfQXJyYXk6OkNKU19BcnJheShDSlNfUnVudGltZSogcFJ1bnRpbWUpIDogbV9wSlNSdW50aW1lKHBSdW50aW1lKSB7CiB9CiAKLXZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I8PChDSlNfRGF0ZSAmZGF0ZSkKLXsKLQlBU1NFUlQoIW1fYklzU2V0dGluZyk7Ci0JQ0pTX1ZhbHVlOjpvcGVyYXRvcj0oZGF0ZSk7CitDSlNfQXJyYXk6On5DSlNfQXJyYXkoKSB7fQorCit2b2lkIENKU19BcnJheTo6QXR0YWNoKHY4OjpMb2NhbDx2ODo6QXJyYXk+IHBBcnJheSkgeworICBtX3BBcnJheSA9IHBBcnJheTsKIH0KIAotQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3Igdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKSBjb25zdAotewotCXJldHVybiBtX3BWYWx1ZTsKK0ZYX0JPT0wgQ0pTX0FycmF5OjpJc0F0dGFjaGVkKCkgeworICByZXR1cm4gRkFMU0U7CiB9CiAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ0pTX0FycmF5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1DSlNfQXJyYXk6OkNKU19BcnJheSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSk6bV9pc29sYXRlKGlzb2xhdGUpCi17Cit2b2lkIENKU19BcnJheTo6R2V0RWxlbWVudCh1bnNpZ25lZCBpbmRleCwgQ0pTX1ZhbHVlJiB2YWx1ZSkgeworICBpZiAobV9wQXJyYXkuSXNFbXB0eSgpKQorICAgIHJldHVybjsKKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcCA9CisgICAgICBGWEpTX0dldEFycmF5RWxlbWVudChtX3BKU1J1bnRpbWUtPkdldElzb2xhdGUoKSwgbV9wQXJyYXksIGluZGV4KTsKKyAgdmFsdWUuQXR0YWNoKHAsIENKU19WYWx1ZTo6VlRfb2JqZWN0KTsKIH0KIAotQ0pTX0FycmF5Ojp+Q0pTX0FycmF5KCkKLXsJCQordm9pZCBDSlNfQXJyYXk6OlNldEVsZW1lbnQodW5zaWduZWQgaW5kZXgsIENKU19WYWx1ZSB2YWx1ZSkgeworICBpZiAobV9wQXJyYXkuSXNFbXB0eSgpKQorICAgIG1fcEFycmF5ID0gRlhKU19OZXdBcnJheShtX3BKU1J1bnRpbWUtPkdldElzb2xhdGUoKSk7CisKKyAgRlhKU19QdXRBcnJheUVsZW1lbnQobV9wSlNSdW50aW1lLT5HZXRJc29sYXRlKCksIG1fcEFycmF5LCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuVG9WOFZhbHVlKCkpOwogfQogCi12b2lkIENKU19BcnJheTo6QXR0YWNoKHY4OjpMb2NhbDx2ODo6QXJyYXk+IHBBcnJheSkKLXsKLQltX3BBcnJheSA9IHBBcnJheTsKK2ludCBDSlNfQXJyYXk6OkdldExlbmd0aCgpIHsKKyAgaWYgKG1fcEFycmF5LklzRW1wdHkoKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIEZYSlNfR2V0QXJyYXlMZW5ndGgobV9wQXJyYXkpOwogfQogCi1GWF9CT09MIENKU19BcnJheTo6SXNBdHRhY2hlZCgpCi17Ci0JcmV0dXJuIEZBTFNFOworQ0pTX0FycmF5OjpvcGVyYXRvciB2ODo6TG9jYWw8djg6OkFycmF5PigpIHsKKyAgaWYgKG1fcEFycmF5LklzRW1wdHkoKSkKKyAgICBtX3BBcnJheSA9IEZYSlNfTmV3QXJyYXkobV9wSlNSdW50aW1lLT5HZXRJc29sYXRlKCkpOworCisgIHJldHVybiBtX3BBcnJheTsKIH0KIAotdm9pZCBDSlNfQXJyYXk6OkdldEVsZW1lbnQodW5zaWduZWQgaW5kZXgsQ0pTX1ZhbHVlICZ2YWx1ZSkKLXsKLQlpZiAobV9wQXJyYXkuSXNFbXB0eSgpKQotCQlyZXR1cm47Ci0Jdjg6OkxvY2FsPHY4OjpWYWx1ZT4gIHAgPSBKU19HZXRBcnJheUVsZW1lbnQobV9pc29sYXRlLCBtX3BBcnJheSxpbmRleCk7Ci0JdmFsdWUuQXR0YWNoKHAsVlRfb2JqZWN0KTsKK0NKU19EYXRlOjpDSlNfRGF0ZShDSlNfUnVudGltZSogcFJ1bnRpbWUpIDogbV9wSlNSdW50aW1lKHBSdW50aW1lKSB7CiB9CiAKLXZvaWQgQ0pTX0FycmF5OjpTZXRFbGVtZW50KHVuc2lnbmVkIGluZGV4LENKU19WYWx1ZSB2YWx1ZSkKLXsKLQlpZiAobV9wQXJyYXkuSXNFbXB0eSgpKQotCQltX3BBcnJheSA9IEpTX05ld0FycmF5KG1faXNvbGF0ZSk7Ci0KLQlKU19QdXRBcnJheUVsZW1lbnQobV9pc29sYXRlLCBtX3BBcnJheSwgaW5kZXgsIHZhbHVlLlRvVjhWYWx1ZSgpLCB2YWx1ZS5HZXRUeXBlKCkpOworQ0pTX0RhdGU6OkNKU19EYXRlKENKU19SdW50aW1lKiBwUnVudGltZSwgZG91YmxlIGRNc2VjVGltZSkKKyAgICA6IG1fcEpTUnVudGltZShwUnVudGltZSkgeworICBtX3BEYXRlID0gRlhKU19OZXdEYXRlKHBSdW50aW1lLT5HZXRJc29sYXRlKCksIGRNc2VjVGltZSk7CiB9CiAKLWludCBDSlNfQXJyYXk6OkdldExlbmd0aCgpCi17Ci0JaWYgKG1fcEFycmF5LklzRW1wdHkoKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIEpTX0dldEFycmF5TGVuZ3RoKG1fcEFycmF5KTsKK0NKU19EYXRlOjpDSlNfRGF0ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgaW50IHllYXIsCisgICAgICAgICAgICAgICAgICAgaW50IG1vbiwKKyAgICAgICAgICAgICAgICAgICBpbnQgZGF5LAorICAgICAgICAgICAgICAgICAgIGludCBob3VyLAorICAgICAgICAgICAgICAgICAgIGludCBtaW4sCisgICAgICAgICAgICAgICAgICAgaW50IHNlYykKKyAgICA6IG1fcEpTUnVudGltZShwUnVudGltZSkgeworICBtX3BEYXRlID0gRlhKU19OZXdEYXRlKHBSdW50aW1lLT5HZXRJc29sYXRlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZURhdGUoeWVhciwgbW9uLCBkYXksIGhvdXIsIG1pbiwgc2VjLCAwKSk7CiB9CiAKLUNKU19BcnJheTo6IG9wZXJhdG9yIHY4OjpMb2NhbDx2ODo6QXJyYXk+KCkKLXsKLQlpZiAobV9wQXJyYXkuSXNFbXB0eSgpKQotCQltX3BBcnJheSA9IEpTX05ld0FycmF5KG1faXNvbGF0ZSk7Ci0KLQlyZXR1cm4gbV9wQXJyYXk7Citkb3VibGUgQ0pTX0RhdGU6Ok1ha2VEYXRlKGludCB5ZWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaG91ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1zKSB7CisgIHJldHVybiBKU19NYWtlRGF0ZShKU19NYWtlRGF5KHllYXIsIG1vbiwgZGF5KSwKKyAgICAgICAgICAgICAgICAgICAgIEpTX01ha2VUaW1lKGhvdXIsIG1pbiwgc2VjLCBtcykpOwogfQogCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENKU19EYXRlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitDSlNfRGF0ZTo6fkNKU19EYXRlKCkge30KIAotQ0pTX0RhdGU6OkNKU19EYXRlKHY4OjpJc29sYXRlKiBpc29sYXRlKSA6bV9pc29sYXRlKGlzb2xhdGUpCi17CitGWF9CT09MIENKU19EYXRlOjpJc1ZhbGlkRGF0ZSgpIHsKKyAgaWYgKG1fcERhdGUuSXNFbXB0eSgpKQorICAgIHJldHVybiBGQUxTRTsKKyAgcmV0dXJuICFKU19Qb3J0SXNOYW4oRlhKU19Ub051bWJlcihtX3BKU1J1bnRpbWUtPkdldElzb2xhdGUoKSwgbV9wRGF0ZSkpOwogfQogCi1DSlNfRGF0ZTo6Q0pTX0RhdGUodjg6Oklzb2xhdGUqIGlzb2xhdGUsZG91YmxlIGRNc2VjX3RpbWUpIAotewotCW1faXNvbGF0ZSA9IGlzb2xhdGU7Ci0JbV9wRGF0ZSA9IEpTX05ld0RhdGUoaXNvbGF0ZSxkTXNlY190aW1lKTsJCQordm9pZCBDSlNfRGF0ZTo6QXR0YWNoKHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBEYXRlKSB7CisgIG1fcERhdGUgPSBwRGF0ZTsKIH0KIAotQ0pTX0RhdGU6OkNKU19EYXRlKHY4OjpJc29sYXRlKiBpc29sYXRlLGludCB5ZWFyLCBpbnQgbW9uLCBpbnQgZGF5LGludCBob3VyLCBpbnQgbWluLCBpbnQgc2VjKSAKLXsKLQltX2lzb2xhdGUgPSBpc29sYXRlOwotCW1fcERhdGUgPSBKU19OZXdEYXRlKGlzb2xhdGUsTWFrZURhdGUoeWVhcixtb24sZGF5LGhvdXIsbWluLHNlYywwKSk7CQoraW50IENKU19EYXRlOjpHZXRZZWFyKCkgeworICBpZiAoSXNWYWxpZERhdGUoKSkKKyAgICByZXR1cm4gSlNfR2V0WWVhckZyb21UaW1lKAorICAgICAgICBKU19Mb2NhbFRpbWUoRlhKU19Ub051bWJlcihtX3BKU1J1bnRpbWUtPkdldElzb2xhdGUoKSwgbV9wRGF0ZSkpKTsKKworICByZXR1cm4gMDsKIH0KIAotZG91YmxlIENKU19EYXRlOjpNYWtlRGF0ZShpbnQgeWVhciwgaW50IG1vbiwgaW50IGRheSxpbnQgaG91ciwgaW50IG1pbiwgaW50IHNlYyxpbnQgbXMpCi17Ci0JcmV0dXJuIEpTX01ha2VEYXRlKEpTX01ha2VEYXkoeWVhcixtb24sZGF5KSwgSlNfTWFrZVRpbWUoaG91cixtaW4sc2VjLG1zKSk7Cit2b2lkIENKU19EYXRlOjpTZXRZZWFyKGludCBpWWVhcikgeworICBkb3VibGUgZGF0ZSA9IE1ha2VEYXRlKGlZZWFyLCBHZXRNb250aCgpLCBHZXREYXkoKSwgR2V0SG91cnMoKSwgR2V0TWludXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdldFNlY29uZHMoKSwgMCk7CisgIEZYSlNfVmFsdWVDb3B5KG1fcERhdGUsIEZYSlNfTmV3RGF0ZShtX3BKU1J1bnRpbWUtPkdldElzb2xhdGUoKSwgZGF0ZSkpOwogfQogCi1DSlNfRGF0ZTo6fkNKU19EYXRlKCkKLXsKK2ludCBDSlNfRGF0ZTo6R2V0TW9udGgoKSB7CisgIGlmIChJc1ZhbGlkRGF0ZSgpKQorICAgIHJldHVybiBKU19HZXRNb250aEZyb21UaW1lKAorICAgICAgICBKU19Mb2NhbFRpbWUoRlhKU19Ub051bWJlcihtX3BKU1J1bnRpbWUtPkdldElzb2xhdGUoKSwgbV9wRGF0ZSkpKTsKKworICByZXR1cm4gMDsKIH0KIAotRlhfQk9PTAlDSlNfRGF0ZTo6SXNWYWxpZERhdGUoKQotewotCWlmKG1fcERhdGUuSXNFbXB0eSgpKSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuICFKU19Qb3J0SXNOYW4oSlNfVG9OdW1iZXIobV9pc29sYXRlLCBtX3BEYXRlKSk7Cit2b2lkIENKU19EYXRlOjpTZXRNb250aChpbnQgaU1vbnRoKSB7CisgIGRvdWJsZSBkYXRlID0gTWFrZURhdGUoR2V0WWVhcigpLCBpTW9udGgsIEdldERheSgpLCBHZXRIb3VycygpLCBHZXRNaW51dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgR2V0U2Vjb25kcygpLCAwKTsKKyAgRlhKU19WYWx1ZUNvcHkobV9wRGF0ZSwgRlhKU19OZXdEYXRlKG1fcEpTUnVudGltZS0+R2V0SXNvbGF0ZSgpLCBkYXRlKSk7CiB9CiAKLXZvaWQgQ0pTX0RhdGU6OkF0dGFjaCh2ODo6TG9jYWw8djg6OlZhbHVlPiBwRGF0ZSkKLXsKLQltX3BEYXRlID0gcERhdGU7CitpbnQgQ0pTX0RhdGU6OkdldERheSgpIHsKKyAgaWYgKElzVmFsaWREYXRlKCkpCisgICAgcmV0dXJuIEpTX0dldERheUZyb21UaW1lKAorICAgICAgICBKU19Mb2NhbFRpbWUoRlhKU19Ub051bWJlcihtX3BKU1J1bnRpbWUtPkdldElzb2xhdGUoKSwgbV9wRGF0ZSkpKTsKKworICByZXR1cm4gMDsKIH0KIAotaW50IENKU19EYXRlOjpHZXRZZWFyKCkKLXsKLQlpZiAoSXNWYWxpZERhdGUoKSkKLQkJcmV0dXJuIEpTX0dldFllYXJGcm9tVGltZShKU19Mb2NhbFRpbWUoSlNfVG9OdW1iZXIobV9pc29sYXRlLCBtX3BEYXRlKSkpOwotCi0JcmV0dXJuIDA7Cit2b2lkIENKU19EYXRlOjpTZXREYXkoaW50IGlEYXkpIHsKKyAgZG91YmxlIGRhdGUgPSBNYWtlRGF0ZShHZXRZZWFyKCksIEdldE1vbnRoKCksIGlEYXksIEdldEhvdXJzKCksIEdldE1pbnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHZXRTZWNvbmRzKCksIDApOworICBGWEpTX1ZhbHVlQ29weShtX3BEYXRlLCBGWEpTX05ld0RhdGUobV9wSlNSdW50aW1lLT5HZXRJc29sYXRlKCksIGRhdGUpKTsKIH0KIAotdm9pZCBDSlNfRGF0ZTo6U2V0WWVhcihpbnQgaVllYXIpCi17Ci0JZG91YmxlIGRhdGUgPSBNYWtlRGF0ZShpWWVhcixHZXRNb250aCgpLEdldERheSgpLEdldEhvdXJzKCksR2V0TWludXRlcygpLEdldFNlY29uZHMoKSwwKTsKLQlKU19WYWx1ZUNvcHkobV9wRGF0ZSwgSlNfTmV3RGF0ZShtX2lzb2xhdGUsZGF0ZSkpOworaW50IENKU19EYXRlOjpHZXRIb3VycygpIHsKKyAgaWYgKElzVmFsaWREYXRlKCkpCisgICAgcmV0dXJuIEpTX0dldEhvdXJGcm9tVGltZSgKKyAgICAgICAgSlNfTG9jYWxUaW1lKEZYSlNfVG9OdW1iZXIobV9wSlNSdW50aW1lLT5HZXRJc29sYXRlKCksIG1fcERhdGUpKSk7CisKKyAgcmV0dXJuIDA7CiB9CiAKLWludCBDSlNfRGF0ZTo6R2V0TW9udGgoKQotewotCWlmIChJc1ZhbGlkRGF0ZSgpKQotCQlyZXR1cm4gSlNfR2V0TW9udGhGcm9tVGltZShKU19Mb2NhbFRpbWUoSlNfVG9OdW1iZXIobV9pc29sYXRlLCBtX3BEYXRlKSkpOwotCi0JcmV0dXJuIDA7Cit2b2lkIENKU19EYXRlOjpTZXRIb3VycyhpbnQgaUhvdXJzKSB7CisgIGRvdWJsZSBkYXRlID0gTWFrZURhdGUoR2V0WWVhcigpLCBHZXRNb250aCgpLCBHZXREYXkoKSwgaUhvdXJzLCBHZXRNaW51dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgR2V0U2Vjb25kcygpLCAwKTsKKyAgRlhKU19WYWx1ZUNvcHkobV9wRGF0ZSwgRlhKU19OZXdEYXRlKG1fcEpTUnVudGltZS0+R2V0SXNvbGF0ZSgpLCBkYXRlKSk7CiB9CiAKLXZvaWQgQ0pTX0RhdGU6OlNldE1vbnRoKGludCBpTW9udGgpCi17CitpbnQgQ0pTX0RhdGU6OkdldE1pbnV0ZXMoKSB7CisgIGlmIChJc1ZhbGlkRGF0ZSgpKQorICAgIHJldHVybiBKU19HZXRNaW5Gcm9tVGltZSgKKyAgICAgICAgSlNfTG9jYWxUaW1lKEZYSlNfVG9OdW1iZXIobV9wSlNSdW50aW1lLT5HZXRJc29sYXRlKCksIG1fcERhdGUpKSk7CiAKLQlkb3VibGUgZGF0ZSA9IE1ha2VEYXRlKEdldFllYXIoKSxpTW9udGgsR2V0RGF5KCksR2V0SG91cnMoKSxHZXRNaW51dGVzKCksR2V0U2Vjb25kcygpLDApOwotCUpTX1ZhbHVlQ29weShtX3BEYXRlLCBKU19OZXdEYXRlKG1faXNvbGF0ZSxkYXRlKSk7Ci0KKyAgcmV0dXJuIDA7CiB9CiAKLWludCBDSlNfRGF0ZTo6R2V0RGF5KCkKLXsKLQlpZiAoSXNWYWxpZERhdGUoKSkKLQkJcmV0dXJuIEpTX0dldERheUZyb21UaW1lKEpTX0xvY2FsVGltZShKU19Ub051bWJlcihtX2lzb2xhdGUsIG1fcERhdGUpKSk7Ci0KLQlyZXR1cm4gMDsKK3ZvaWQgQ0pTX0RhdGU6OlNldE1pbnV0ZXMoaW50IG1pbnV0ZXMpIHsKKyAgZG91YmxlIGRhdGUgPSBNYWtlRGF0ZShHZXRZZWFyKCksIEdldE1vbnRoKCksIEdldERheSgpLCBHZXRIb3VycygpLCBtaW51dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdldFNlY29uZHMoKSwgMCk7CisgIEZYSlNfVmFsdWVDb3B5KG1fcERhdGUsIEZYSlNfTmV3RGF0ZShtX3BKU1J1bnRpbWUtPkdldElzb2xhdGUoKSwgZGF0ZSkpOwogfQogCi12b2lkIENKU19EYXRlOjpTZXREYXkoaW50IGlEYXkpCi17CitpbnQgQ0pTX0RhdGU6OkdldFNlY29uZHMoKSB7CisgIGlmIChJc1ZhbGlkRGF0ZSgpKQorICAgIHJldHVybiBKU19HZXRTZWNGcm9tVGltZSgKKyAgICAgICAgSlNfTG9jYWxUaW1lKEZYSlNfVG9OdW1iZXIobV9wSlNSdW50aW1lLT5HZXRJc29sYXRlKCksIG1fcERhdGUpKSk7CiAKLQlkb3VibGUgZGF0ZSA9IE1ha2VEYXRlKEdldFllYXIoKSxHZXRNb250aCgpLGlEYXksR2V0SG91cnMoKSxHZXRNaW51dGVzKCksR2V0U2Vjb25kcygpLDApOwotCUpTX1ZhbHVlQ29weShtX3BEYXRlLEpTX05ld0RhdGUobV9pc29sYXRlLGRhdGUpKTsKLQorICByZXR1cm4gMDsKIH0KIAotaW50IENKU19EYXRlOjpHZXRIb3VycygpCi17Ci0JaWYgKElzVmFsaWREYXRlKCkpCi0JCXJldHVybiBKU19HZXRIb3VyRnJvbVRpbWUoSlNfTG9jYWxUaW1lKEpTX1RvTnVtYmVyKG1faXNvbGF0ZSwgbV9wRGF0ZSkpKTsKLQotCXJldHVybiAwOwordm9pZCBDSlNfRGF0ZTo6U2V0U2Vjb25kcyhpbnQgc2Vjb25kcykgeworICBkb3VibGUgZGF0ZSA9IE1ha2VEYXRlKEdldFllYXIoKSwgR2V0TW9udGgoKSwgR2V0RGF5KCksIEdldEhvdXJzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TWludXRlcygpLCBzZWNvbmRzLCAwKTsKKyAgRlhKU19WYWx1ZUNvcHkobV9wRGF0ZSwgRlhKU19OZXdEYXRlKG1fcEpTUnVudGltZS0+R2V0SXNvbGF0ZSgpLCBkYXRlKSk7CiB9CiAKLXZvaWQgQ0pTX0RhdGU6OlNldEhvdXJzKGludCBpSG91cnMpCi17Ci0JZG91YmxlIGRhdGUgPSBNYWtlRGF0ZShHZXRZZWFyKCksR2V0TW9udGgoKSxHZXREYXkoKSxpSG91cnMsR2V0TWludXRlcygpLEdldFNlY29uZHMoKSwwKTsKLQlKU19WYWx1ZUNvcHkobV9wRGF0ZSxKU19OZXdEYXRlKG1faXNvbGF0ZSxkYXRlKSk7CitDSlNfRGF0ZTo6b3BlcmF0b3Igdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKSB7CisgIHJldHVybiBtX3BEYXRlOwogfQogCi1pbnQgQ0pTX0RhdGU6OkdldE1pbnV0ZXMoKQotewotCWlmIChJc1ZhbGlkRGF0ZSgpKQotCQlyZXR1cm4gSlNfR2V0TWluRnJvbVRpbWUoSlNfTG9jYWxUaW1lKEpTX1RvTnVtYmVyKG1faXNvbGF0ZSwgbV9wRGF0ZSkpKTsKLQotCXJldHVybiAwOworQ0pTX0RhdGU6Om9wZXJhdG9yIGRvdWJsZSgpIGNvbnN0IHsKKyAgaWYgKG1fcERhdGUuSXNFbXB0eSgpKQorICAgIHJldHVybiAwLjA7CisgIHJldHVybiBGWEpTX1RvTnVtYmVyKG1fcEpTUnVudGltZS0+R2V0SXNvbGF0ZSgpLCBtX3BEYXRlKTsKIH0KIAotdm9pZCBDSlNfRGF0ZTo6U2V0TWludXRlcyhpbnQgbWludXRlcykKLXsKLQlkb3VibGUgZGF0ZSA9IE1ha2VEYXRlKEdldFllYXIoKSxHZXRNb250aCgpLEdldERheSgpLEdldEhvdXJzKCksbWludXRlcyxHZXRTZWNvbmRzKCksMCk7Ci0JSlNfVmFsdWVDb3B5KG1fcERhdGUsSlNfTmV3RGF0ZShtX2lzb2xhdGUsZGF0ZSkpOworQ0ZYX1dpZGVTdHJpbmcgQ0pTX0RhdGU6OlRvU3RyaW5nKCkgY29uc3QgeworICBpZiAobV9wRGF0ZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIEwiIjsKKyAgcmV0dXJuIEZYSlNfVG9TdHJpbmcobV9wSlNSdW50aW1lLT5HZXRJc29sYXRlKCksIG1fcERhdGUpOwogfQogCi1pbnQgQ0pTX0RhdGU6OkdldFNlY29uZHMoKQotewotCWlmIChJc1ZhbGlkRGF0ZSgpKQotCQlyZXR1cm4gSlNfR2V0U2VjRnJvbVRpbWUoSlNfTG9jYWxUaW1lKEpTX1RvTnVtYmVyKG1faXNvbGF0ZSwgbV9wRGF0ZSkpKTsKLQotCXJldHVybiAwOworZG91YmxlIF9nZXRMb2NhbFRaQSgpIHsKKyAgaWYgKCFGU0RLX0lzU2FuZEJveFBvbGljeUVuYWJsZWQoRlBERl9QT0xJQ1lfTUFDSElORVRJTUVfQUNDRVNTKSkKKyAgICByZXR1cm4gMDsKKyAgdGltZV90IHQgPSAwOworICB0aW1lKCZ0KTsKKyAgbG9jYWx0aW1lKCZ0KTsKKyNpZiBfTVNDX1ZFUiA+PSAxOTAwCisgIC8vIEluIGdjYyBhbmQgaW4gVmlzdWFsIFN0dWRpbyBwcmlvciB0byBWUyAyMDE1ICd0aW1lem9uZScgaXMgYSBnbG9iYWwKKyAgLy8gdmFyaWFibGUgZGVjbGFyZWQgaW4gdGltZS5oLiBUaGF0IHZhcmlhYmxlIHdhcyBkZXByZWNhdGVkIGFuZCBpbiBWUyAyMDE1CisgIC8vIGlzIHJlbW92ZWQsIHdpdGggX2dldF90aW1lem9uZSByZXBsYWNpbmcgaXQuCisgIGxvbmcgdGltZXpvbmUgPSAwOworICBfZ2V0X3RpbWV6b25lKCZ0aW1lem9uZSk7CisjZW5kaWYKKyAgcmV0dXJuIChkb3VibGUpKC0odGltZXpvbmUgKiAxMDAwKSk7CiB9CiAKLXZvaWQgQ0pTX0RhdGU6OlNldFNlY29uZHMoaW50IHNlY29uZHMpCi17Ci0JZG91YmxlIGRhdGUgPSBNYWtlRGF0ZShHZXRZZWFyKCksR2V0TW9udGgoKSxHZXREYXkoKSxHZXRIb3VycygpLEdldE1pbnV0ZXMoKSxzZWNvbmRzLDApOwotCUpTX1ZhbHVlQ29weShtX3BEYXRlLEpTX05ld0RhdGUobV9pc29sYXRlLGRhdGUpKTsKK2ludCBfZ2V0RGF5bGlnaHRTYXZpbmdUQShkb3VibGUgZCkgeworICBpZiAoIUZTREtfSXNTYW5kQm94UG9saWN5RW5hYmxlZChGUERGX1BPTElDWV9NQUNISU5FVElNRV9BQ0NFU1MpKQorICAgIHJldHVybiAwOworICB0aW1lX3QgdCA9ICh0aW1lX3QpKGQgLyAxMDAwKTsKKyAgc3RydWN0IHRtKiB0bXAgPSBsb2NhbHRpbWUoJnQpOworICBpZiAoIXRtcCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHRtcC0+dG1faXNkc3QgPiAwKQorICAgIC8vIE9uZSBob3VyLgorICAgIHJldHVybiAoaW50KTYwICogNjAgKiAxMDAwOworICByZXR1cm4gMDsKIH0KIAotQ0pTX0RhdGU6Om9wZXJhdG9yIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCkKLXsKLQlyZXR1cm4gbV9wRGF0ZTsKK2RvdWJsZSBfTW9kKGRvdWJsZSB4LCBkb3VibGUgeSkgeworICBkb3VibGUgciA9IGZtb2QoeCwgeSk7CisgIGlmIChyIDwgMCkKKyAgICByICs9IHk7CisgIHJldHVybiByOwogfQogCi1DSlNfRGF0ZTo6b3BlcmF0b3IgZG91YmxlKCkgY29uc3QKLXsKLQlpZihtX3BEYXRlLklzRW1wdHkoKSkKLQkJcmV0dXJuIDAuMDsKLQlyZXR1cm4gSlNfVG9OdW1iZXIobV9pc29sYXRlLCBtX3BEYXRlKTsKK2ludCBfaXNmaW5pdGUoZG91YmxlIHYpIHsKKyNpZiBfTVNDX1ZFUgorICByZXR1cm4gOjpfZmluaXRlKHYpOworI2Vsc2UKKyAgcmV0dXJuIHN0ZDo6ZmFicyh2KSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWF4KCk7CisjZW5kaWYKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ0pTX0RhdGU6OlRvU3RyaW5nKCkgY29uc3QKLXsKLQlpZihtX3BEYXRlLklzRW1wdHkoKSkKLQkJcmV0dXJuIEwiIjsKLQlyZXR1cm4gSlNfVG9TdHJpbmcobV9pc29sYXRlLCBtX3BEYXRlKTsKK2RvdWJsZSBfdG9JbnRlZ2VyKGRvdWJsZSBuKSB7CisgIHJldHVybiAobiA+PSAwKSA/IEZYU1lTX2Zsb29yKG4pIDogLUZYU1lTX2Zsb29yKC1uKTsKK30KKworYm9vbCBfaXNMZWFwWWVhcihpbnQgeWVhcikgeworICByZXR1cm4gKHllYXIgJSA0ID09IDApICYmICgoeWVhciAlIDEwMCAhPSAwKSB8fCAoeWVhciAlIDQwMCAhPSAwKSk7Cit9CisKK2ludCBfRGF5RnJvbVllYXIoaW50IHkpIHsKKyAgcmV0dXJuIChpbnQpKDM2NSAqICh5IC0gMTk3MC4wKSArIEZYU1lTX2Zsb29yKCh5IC0gMTk2OS4wKSAvIDQpIC0KKyAgICAgICAgICAgICAgIEZYU1lTX2Zsb29yKCh5IC0gMTkwMS4wKSAvIDEwMCkgKworICAgICAgICAgICAgICAgRlhTWVNfZmxvb3IoKHkgLSAxNjAxLjApIC8gNDAwKSk7Cit9CisKK2RvdWJsZSBfVGltZUZyb21ZZWFyKGludCB5KSB7CisgIHJldHVybiA4NjQwMDAwMC4wICogX0RheUZyb21ZZWFyKHkpOworfQorCitkb3VibGUgX1RpbWVGcm9tWWVhck1vbnRoKGludCB5LCBpbnQgbSkgeworICBzdGF0aWMgaW50IGRheXNNb250aFsxMl0gPSB7CisgICAgICAwLCAzMSwgNTksIDkwLCAxMjAsIDE1MSwgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNH07CisgIHN0YXRpYyBpbnQgbGVhcERheXNNb250aFsxMl0gPSB7CisgICAgICAwLCAzMSwgNjAsIDkxLCAxMjEsIDE1MiwgMTgyLCAyMTMsIDI0NCwgMjc0LCAzMDUsIDMzNX07CisgIGludCogcE1vbnRoID0gZGF5c01vbnRoOworICBpZiAoX2lzTGVhcFllYXIoeSkpCisgICAgcE1vbnRoID0gbGVhcERheXNNb250aDsKKyAgcmV0dXJuIF9UaW1lRnJvbVllYXIoeSkgKyAoKGRvdWJsZSlwTW9udGhbbV0pICogODY0MDAwMDA7Cit9CisKK2ludCBfRGF5KGRvdWJsZSB0KSB7CisgIHJldHVybiAoaW50KUZYU1lTX2Zsb29yKHQgLyA4NjQwMDAwMCk7Cit9CisKK2ludCBfWWVhckZyb21UaW1lKGRvdWJsZSB0KSB7CisgIC8vIGVzdGltYXRlIHRoZSB0aW1lLgorICBpbnQgeSA9IDE5NzAgKyBzdGF0aWNfY2FzdDxpbnQ+KHQgLyAoMzY1LjI0MjUgKiA4NjQwMDAwMCkpOworICBpZiAoX1RpbWVGcm9tWWVhcih5KSA8PSB0KSB7CisgICAgd2hpbGUgKF9UaW1lRnJvbVllYXIoeSArIDEpIDw9IHQpCisgICAgICB5Kys7CisgIH0gZWxzZQorICAgIHdoaWxlIChfVGltZUZyb21ZZWFyKHkpID4gdCkKKyAgICAgIHktLTsKKyAgcmV0dXJuIHk7Cit9CisKK2ludCBfRGF5V2l0aGluWWVhcihkb3VibGUgdCkgeworICBpbnQgeWVhciA9IF9ZZWFyRnJvbVRpbWUodCk7CisgIGludCBkYXkgPSBfRGF5KHQpOworICByZXR1cm4gZGF5IC0gX0RheUZyb21ZZWFyKHllYXIpOworfQorCitpbnQgX01vbnRoRnJvbVRpbWUoZG91YmxlIHQpIHsKKyAgaW50IGRheSA9IF9EYXlXaXRoaW5ZZWFyKHQpOworICBpbnQgeWVhciA9IF9ZZWFyRnJvbVRpbWUodCk7CisgIGlmICgwIDw9IGRheSAmJiBkYXkgPCAzMSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKDMxIDw9IGRheSAmJiBkYXkgPCA1OSArIF9pc0xlYXBZZWFyKHllYXIpKQorICAgIHJldHVybiAxOworICBpZiAoKDU5ICsgX2lzTGVhcFllYXIoeWVhcikpIDw9IGRheSAmJiBkYXkgPCAoOTAgKyBfaXNMZWFwWWVhcih5ZWFyKSkpCisgICAgcmV0dXJuIDI7CisgIGlmICgoOTAgKyBfaXNMZWFwWWVhcih5ZWFyKSkgPD0gZGF5ICYmIGRheSA8ICgxMjAgKyBfaXNMZWFwWWVhcih5ZWFyKSkpCisgICAgcmV0dXJuIDM7CisgIGlmICgoMTIwICsgX2lzTGVhcFllYXIoeWVhcikpIDw9IGRheSAmJiBkYXkgPCAoMTUxICsgX2lzTGVhcFllYXIoeWVhcikpKQorICAgIHJldHVybiA0OworICBpZiAoKDE1MSArIF9pc0xlYXBZZWFyKHllYXIpKSA8PSBkYXkgJiYgZGF5IDwgKDE4MSArIF9pc0xlYXBZZWFyKHllYXIpKSkKKyAgICByZXR1cm4gNTsKKyAgaWYgKCgxODEgKyBfaXNMZWFwWWVhcih5ZWFyKSkgPD0gZGF5ICYmIGRheSA8ICgyMTIgKyBfaXNMZWFwWWVhcih5ZWFyKSkpCisgICAgcmV0dXJuIDY7CisgIGlmICgoMjEyICsgX2lzTGVhcFllYXIoeWVhcikpIDw9IGRheSAmJiBkYXkgPCAoMjQzICsgX2lzTGVhcFllYXIoeWVhcikpKQorICAgIHJldHVybiA3OworICBpZiAoKDI0MyArIF9pc0xlYXBZZWFyKHllYXIpKSA8PSBkYXkgJiYgZGF5IDwgKDI3MyArIF9pc0xlYXBZZWFyKHllYXIpKSkKKyAgICByZXR1cm4gODsKKyAgaWYgKCgyNzMgKyBfaXNMZWFwWWVhcih5ZWFyKSkgPD0gZGF5ICYmIGRheSA8ICgzMDQgKyBfaXNMZWFwWWVhcih5ZWFyKSkpCisgICAgcmV0dXJuIDk7CisgIGlmICgoMzA0ICsgX2lzTGVhcFllYXIoeWVhcikpIDw9IGRheSAmJiBkYXkgPCAoMzM0ICsgX2lzTGVhcFllYXIoeWVhcikpKQorICAgIHJldHVybiAxMDsKKyAgaWYgKCgzMzQgKyBfaXNMZWFwWWVhcih5ZWFyKSkgPD0gZGF5ICYmIGRheSA8ICgzNjUgKyBfaXNMZWFwWWVhcih5ZWFyKSkpCisgICAgcmV0dXJuIDExOworCisgIHJldHVybiAtMTsKK30KKworaW50IF9EYXRlRnJvbVRpbWUoZG91YmxlIHQpIHsKKyAgaW50IGRheSA9IF9EYXlXaXRoaW5ZZWFyKHQpOworICBpbnQgeWVhciA9IF9ZZWFyRnJvbVRpbWUodCk7CisgIGJvb2wgbGVhcCA9IF9pc0xlYXBZZWFyKHllYXIpOworICBpbnQgbW9udGggPSBfTW9udGhGcm9tVGltZSh0KTsKKyAgc3dpdGNoIChtb250aCkgeworICAgIGNhc2UgMDoKKyAgICAgIHJldHVybiBkYXkgKyAxOworICAgIGNhc2UgMToKKyAgICAgIHJldHVybiBkYXkgLSAzMDsKKyAgICBjYXNlIDI6CisgICAgICByZXR1cm4gZGF5IC0gNTggLSBsZWFwOworICAgIGNhc2UgMzoKKyAgICAgIHJldHVybiBkYXkgLSA4OSAtIGxlYXA7CisgICAgY2FzZSA0OgorICAgICAgcmV0dXJuIGRheSAtIDExOSAtIGxlYXA7CisgICAgY2FzZSA1OgorICAgICAgcmV0dXJuIGRheSAtIDE1MCAtIGxlYXA7CisgICAgY2FzZSA2OgorICAgICAgcmV0dXJuIGRheSAtIDE4MCAtIGxlYXA7CisgICAgY2FzZSA3OgorICAgICAgcmV0dXJuIGRheSAtIDIxMSAtIGxlYXA7CisgICAgY2FzZSA4OgorICAgICAgcmV0dXJuIGRheSAtIDI0MiAtIGxlYXA7CisgICAgY2FzZSA5OgorICAgICAgcmV0dXJuIGRheSAtIDI3MiAtIGxlYXA7CisgICAgY2FzZSAxMDoKKyAgICAgIHJldHVybiBkYXkgLSAzMDMgLSBsZWFwOworICAgIGNhc2UgMTE6CisgICAgICByZXR1cm4gZGF5IC0gMzMzIC0gbGVhcDsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgIH0KK30KKworZG91YmxlIEpTX0dldERhdGVUaW1lKCkgeworICBpZiAoIUZTREtfSXNTYW5kQm94UG9saWN5RW5hYmxlZChGUERGX1BPTElDWV9NQUNISU5FVElNRV9BQ0NFU1MpKQorICAgIHJldHVybiAwOworICB0aW1lX3QgdCA9IHRpbWUoTlVMTCk7CisgIHN0cnVjdCB0bSogcFRtID0gbG9jYWx0aW1lKCZ0KTsKKworICBpbnQgeWVhciA9IHBUbS0+dG1feWVhciArIDE5MDA7CisgIGRvdWJsZSB0MSA9IF9UaW1lRnJvbVllYXIoeWVhcik7CisKKyAgcmV0dXJuIHQxICsgcFRtLT50bV95ZGF5ICogODY0MDAwMDAuMCArIHBUbS0+dG1faG91ciAqIDM2MDAwMDAuMCArCisgICAgICAgICBwVG0tPnRtX21pbiAqIDYwMDAwLjAgKyBwVG0tPnRtX3NlYyAqIDEwMDAuMDsKK30KKworaW50IEpTX0dldFllYXJGcm9tVGltZShkb3VibGUgZHQpIHsKKyAgcmV0dXJuIF9ZZWFyRnJvbVRpbWUoZHQpOworfQorCitpbnQgSlNfR2V0TW9udGhGcm9tVGltZShkb3VibGUgZHQpIHsKKyAgcmV0dXJuIF9Nb250aEZyb21UaW1lKGR0KTsKK30KKworaW50IEpTX0dldERheUZyb21UaW1lKGRvdWJsZSBkdCkgeworICByZXR1cm4gX0RhdGVGcm9tVGltZShkdCk7Cit9CisKK2ludCBKU19HZXRIb3VyRnJvbVRpbWUoZG91YmxlIGR0KSB7CisgIHJldHVybiAoaW50KV9Nb2QoRlhTWVNfZmxvb3IoKGRvdWJsZSkoZHQgLyAoNjAgKiA2MCAqIDEwMDApKSksIDI0KTsKK30KKworaW50IEpTX0dldE1pbkZyb21UaW1lKGRvdWJsZSBkdCkgeworICByZXR1cm4gKGludClfTW9kKEZYU1lTX2Zsb29yKChkb3VibGUpKGR0IC8gKDYwICogMTAwMCkpKSwgNjApOworfQorCitpbnQgSlNfR2V0U2VjRnJvbVRpbWUoZG91YmxlIGR0KSB7CisgIHJldHVybiAoaW50KV9Nb2QoRlhTWVNfZmxvb3IoKGRvdWJsZSkoZHQgLyAxMDAwKSksIDYwKTsKK30KKworZG91YmxlIEpTX0RhdGVQYXJzZShjb25zdCB3Y2hhcl90KiBzdHJpbmcpIHsKKyAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gdjg6Oklzb2xhdGU6OkdldEN1cnJlbnQoKTsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUocElzb2xhdGUpOworICB2ODo6SGFuZGxlU2NvcGUgc2NvcGUocElzb2xhdGUpOworCisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IHBJc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOworCisgIC8vIFVzZSB0aGUgYnVpbHQtaW4gb2JqZWN0IG1ldGhvZC4KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdiA9CisgICAgICBjb250ZXh0LT5HbG9iYWwoKQorICAgICAgICAgIC0+R2V0KGNvbnRleHQsIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAiRGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5ld1N0cmluZ1R5cGU6OmtOb3JtYWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0xvY2FsQ2hlY2tlZCgpKQorICAgICAgICAgIC5Ub0xvY2FsQ2hlY2tlZCgpOworICBpZiAodi0+SXNPYmplY3QoKSkgeworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvID0gdi0+VG9PYmplY3QoY29udGV4dCkuVG9Mb2NhbENoZWNrZWQoKTsKKyAgICB2ID0gby0+R2V0KGNvbnRleHQsIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAicGFyc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5ld1N0cmluZ1R5cGU6OmtOb3JtYWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvTG9jYWxDaGVja2VkKCkpLlRvTG9jYWxDaGVja2VkKCk7CisgICAgaWYgKHYtPklzRnVuY3Rpb24oKSkgeworICAgICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4gZnVuQyA9IHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+OjpDYXN0KHYpOworCisgICAgICBjb25zdCBpbnQgYXJnYyA9IDE7CisgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gdGltZVN0ciA9IEZYSlNfV1NUb0pTU3RyaW5nKHBJc29sYXRlLCBzdHJpbmcpOworICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gYXJndlthcmdjXSA9IHt0aW1lU3RyfTsKKyAgICAgIHYgPSBmdW5DLT5DYWxsKGNvbnRleHQsIGNvbnRleHQtPkdsb2JhbCgpLCBhcmdjLCBhcmd2KS5Ub0xvY2FsQ2hlY2tlZCgpOworICAgICAgaWYgKHYtPklzTnVtYmVyKCkpIHsKKyAgICAgICAgZG91YmxlIGRhdGUgPSB2LT5Ub051bWJlcihjb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpLT5WYWx1ZSgpOworICAgICAgICBpZiAoIV9pc2Zpbml0ZShkYXRlKSkKKyAgICAgICAgICByZXR1cm4gZGF0ZTsKKyAgICAgICAgcmV0dXJuIGRhdGUgKyBfZ2V0TG9jYWxUWkEoKSArIF9nZXREYXlsaWdodFNhdmluZ1RBKGRhdGUpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworZG91YmxlIEpTX01ha2VEYXkoaW50IG5ZZWFyLCBpbnQgbk1vbnRoLCBpbnQgbkRhdGUpIHsKKyAgaWYgKCFfaXNmaW5pdGUoblllYXIpIHx8ICFfaXNmaW5pdGUobk1vbnRoKSB8fCAhX2lzZmluaXRlKG5EYXRlKSkKKyAgICByZXR1cm4gR2V0TmFuKCk7CisgIGRvdWJsZSB5ID0gX3RvSW50ZWdlcihuWWVhcik7CisgIGRvdWJsZSBtID0gX3RvSW50ZWdlcihuTW9udGgpOworICBkb3VibGUgZHQgPSBfdG9JbnRlZ2VyKG5EYXRlKTsKKyAgZG91YmxlIHltID0geSArIEZYU1lTX2Zsb29yKChkb3VibGUpbSAvIDEyKTsKKyAgZG91YmxlIG1uID0gX01vZChtLCAxMik7CisKKyAgZG91YmxlIHQgPSBfVGltZUZyb21ZZWFyTW9udGgoKGludCl5bSwgKGludCltbik7CisKKyAgaWYgKF9ZZWFyRnJvbVRpbWUodCkgIT0geW0gfHwgX01vbnRoRnJvbVRpbWUodCkgIT0gbW4gfHwKKyAgICAgIF9EYXRlRnJvbVRpbWUodCkgIT0gMSkKKyAgICByZXR1cm4gR2V0TmFuKCk7CisgIHJldHVybiBfRGF5KHQpICsgZHQgLSAxOworfQorCitkb3VibGUgSlNfTWFrZVRpbWUoaW50IG5Ib3VyLCBpbnQgbk1pbiwgaW50IG5TZWMsIGludCBuTXMpIHsKKyAgaWYgKCFfaXNmaW5pdGUobkhvdXIpIHx8ICFfaXNmaW5pdGUobk1pbikgfHwgIV9pc2Zpbml0ZShuU2VjKSB8fAorICAgICAgIV9pc2Zpbml0ZShuTXMpKQorICAgIHJldHVybiBHZXROYW4oKTsKKworICBkb3VibGUgaCA9IF90b0ludGVnZXIobkhvdXIpOworICBkb3VibGUgbSA9IF90b0ludGVnZXIobk1pbik7CisgIGRvdWJsZSBzID0gX3RvSW50ZWdlcihuU2VjKTsKKyAgZG91YmxlIG1pbGxpID0gX3RvSW50ZWdlcihuTXMpOworCisgIHJldHVybiBoICogMzYwMDAwMCArIG0gKiA2MDAwMCArIHMgKiAxMDAwICsgbWlsbGk7Cit9CisKK2RvdWJsZSBKU19NYWtlRGF0ZShkb3VibGUgZGF5LCBkb3VibGUgdGltZSkgeworICBpZiAoIV9pc2Zpbml0ZShkYXkpIHx8ICFfaXNmaW5pdGUodGltZSkpCisgICAgcmV0dXJuIEdldE5hbigpOworCisgIHJldHVybiBkYXkgKiA4NjQwMDAwMCArIHRpbWU7Cit9CisKK2Jvb2wgSlNfUG9ydElzTmFuKGRvdWJsZSBkKSB7CisgIHJldHVybiBkICE9IGQ7Cit9CisKK2RvdWJsZSBKU19Mb2NhbFRpbWUoZG91YmxlIGQpIHsKKyAgcmV0dXJuIEpTX0dldERhdGVUaW1lKCkgKyBfZ2V0RGF5bGlnaHRTYXZpbmdUQShkKTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfVmFsdWUuaCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfVmFsdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTE3Yjc2Ci0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19WYWx1ZS5oCkBAIC0wLDAgKzEsMjExIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlBERlNES19TUkNfSkFWQVNDUklQVF9KU19WQUxVRV9IXworI2RlZmluZSBGUERGU0RLX1NSQ19KQVZBU0NSSVBUX0pTX1ZBTFVFX0hfCisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvanNhcGkvZnhqc192OC5oIgorCitjbGFzcyBDSlNfQXJyYXk7CitjbGFzcyBDSlNfRGF0ZTsKK2NsYXNzIENKU19Eb2N1bWVudDsKK2NsYXNzIENKU19PYmplY3Q7CitjbGFzcyBDSlNfUnVudGltZTsKKworY2xhc3MgQ0pTX1ZhbHVlIHsKKyBwdWJsaWM6CisgIGVudW0gVHlwZSB7CisgICAgVlRfdW5rbm93biwKKyAgICBWVF9zdHJpbmcsCisgICAgVlRfbnVtYmVyLAorICAgIFZUX2Jvb2xlYW4sCisgICAgVlRfZGF0ZSwKKyAgICBWVF9vYmplY3QsCisgICAgVlRfZnhvYmplY3QsCisgICAgVlRfbnVsbCwKKyAgICBWVF91bmRlZmluZWQKKyAgfTsKKworICBDSlNfVmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1ZhbHVlKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlLCBUeXBlIHQpOworICBDSlNfVmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBjb25zdCBpbnQmIGlWYWx1ZSk7CisgIENKU19WYWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIGNvbnN0IGRvdWJsZSYgZFZhbHVlKTsKKyAgQ0pTX1ZhbHVlKENKU19SdW50aW1lKiBwUnVudGltZSwgY29uc3QgZmxvYXQmIGZWYWx1ZSk7CisgIENKU19WYWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIGNvbnN0IGJvb2wmIGJWYWx1ZSk7CisgIENKU19WYWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6T2JqZWN0Pik7CisgIENKU19WYWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIENKU19PYmplY3QqKTsKKyAgQ0pTX1ZhbHVlKENKU19SdW50aW1lKiBwUnVudGltZSwgQ0pTX0RvY3VtZW50Kik7CisgIENKU19WYWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIGNvbnN0IEZYX0NIQVIqIHBTdHIpOworICBDSlNfVmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBjb25zdCBGWF9XQ0hBUiogcFdzdHIpOworICBDSlNfVmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBDSlNfQXJyYXkmIGFycmF5KTsKKworICB+Q0pTX1ZhbHVlKCk7CisKKyAgdm9pZCBTZXROdWxsKCk7CisgIHZvaWQgQXR0YWNoKHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSwgVHlwZSB0KTsKKyAgdm9pZCBBdHRhY2goQ0pTX1ZhbHVlKiBwVmFsdWUpOworICB2b2lkIERldGFjaCgpOworCisgIFR5cGUgR2V0VHlwZSgpIGNvbnN0OworICBpbnQgVG9JbnQoKSBjb25zdDsKKyAgYm9vbCBUb0Jvb2woKSBjb25zdDsKKyAgZG91YmxlIFRvRG91YmxlKCkgY29uc3Q7CisgIGZsb2F0IFRvRmxvYXQoKSBjb25zdDsKKyAgQ0pTX09iamVjdCogVG9DSlNPYmplY3QoKSBjb25zdDsKKyAgQ0ZYX1dpZGVTdHJpbmcgVG9DRlhXaWRlU3RyaW5nKCkgY29uc3Q7CisgIENGWF9CeXRlU3RyaW5nIFRvQ0ZYQnl0ZVN0cmluZygpIGNvbnN0OworICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gVG9WOE9iamVjdCgpIGNvbnN0OworICB2ODo6TG9jYWw8djg6OkFycmF5PiBUb1Y4QXJyYXkoKSBjb25zdDsKKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gVG9WOFZhbHVlKCkgY29uc3Q7CisKKyAgdm9pZCBvcGVyYXRvcj0oaW50IGlWYWx1ZSk7CisgIHZvaWQgb3BlcmF0b3I9KGJvb2wgYlZhbHVlKTsKKyAgdm9pZCBvcGVyYXRvcj0oZG91YmxlKTsKKyAgdm9pZCBvcGVyYXRvcj0oZmxvYXQpOworICB2b2lkIG9wZXJhdG9yPShDSlNfT2JqZWN0Kik7CisgIHZvaWQgb3BlcmF0b3I9KENKU19Eb2N1bWVudCopOworICB2b2lkIG9wZXJhdG9yPSh2ODo6TG9jYWw8djg6Ok9iamVjdD4pOworICB2b2lkIG9wZXJhdG9yPShDSlNfQXJyYXkmKTsKKyAgdm9pZCBvcGVyYXRvcj0oQ0pTX0RhdGUmKTsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgRlhfV0NIQVIqIHBXc3RyKTsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgRlhfQ0hBUiogcFN0cik7CisgIHZvaWQgb3BlcmF0b3I9KENKU19WYWx1ZSB2YWx1ZSk7CisKKyAgRlhfQk9PTCBJc0FycmF5T2JqZWN0KCkgY29uc3Q7CisgIEZYX0JPT0wgSXNEYXRlT2JqZWN0KCkgY29uc3Q7CisgIEZYX0JPT0wgQ29udmVydFRvQXJyYXkoQ0pTX0FycmF5JikgY29uc3Q7CisgIEZYX0JPT0wgQ29udmVydFRvRGF0ZShDSlNfRGF0ZSYpIGNvbnN0OworCisgIENKU19SdW50aW1lKiBHZXRKU1J1bnRpbWUoKSBjb25zdCB7IHJldHVybiBtX3BKU1J1bnRpbWU7IH0KKworIHByb3RlY3RlZDoKKyAgVHlwZSBtX2VUeXBlOworICB2ODo6TG9jYWw8djg6OlZhbHVlPiBtX3BWYWx1ZTsKKyAgQ0pTX1J1bnRpbWUqIG1fcEpTUnVudGltZTsKK307CisKK2NsYXNzIENKU19Qcm9wVmFsdWUgOiBwdWJsaWMgQ0pTX1ZhbHVlIHsKKyBwdWJsaWM6CisgIENKU19Qcm9wVmFsdWUoY29uc3QgQ0pTX1ZhbHVlJik7CisgIENKU19Qcm9wVmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgfkNKU19Qcm9wVmFsdWUoKTsKKworICBGWF9CT09MIElzU2V0dGluZygpIGNvbnN0IHsgcmV0dXJuIG1fYklzU2V0dGluZzsgfQorICBGWF9CT09MIElzR2V0dGluZygpIGNvbnN0IHsgcmV0dXJuICFtX2JJc1NldHRpbmc7IH0KKworICB2b2lkIG9wZXJhdG9yPDwoaW50KTsKKyAgdm9pZCBvcGVyYXRvcj4+KGludCYpIGNvbnN0OworICB2b2lkIG9wZXJhdG9yPDwoYm9vbCk7CisgIHZvaWQgb3BlcmF0b3I+Pihib29sJikgY29uc3Q7CisgIHZvaWQgb3BlcmF0b3I8PChkb3VibGUpOworICB2b2lkIG9wZXJhdG9yPj4oZG91YmxlJikgY29uc3Q7CisgIHZvaWQgb3BlcmF0b3I8PChDSlNfT2JqZWN0KiBwT2JqKTsKKyAgdm9pZCBvcGVyYXRvcj4+KENKU19PYmplY3QqJiBwcE9iaikgY29uc3Q7CisgIHZvaWQgb3BlcmF0b3I8PChDSlNfRG9jdW1lbnQqIHBKc0RvYyk7CisgIHZvaWQgb3BlcmF0b3I+PihDSlNfRG9jdW1lbnQqJiBwcEpzRG9jKSBjb25zdDsKKyAgdm9pZCBvcGVyYXRvcjw8KENGWF9CeXRlU3RyaW5nKTsKKyAgdm9pZCBvcGVyYXRvcj4+KENGWF9CeXRlU3RyaW5nJikgY29uc3Q7CisgIHZvaWQgb3BlcmF0b3I8PChDRlhfV2lkZVN0cmluZyk7CisgIHZvaWQgb3BlcmF0b3I+PihDRlhfV2lkZVN0cmluZyYpIGNvbnN0OworICB2b2lkIG9wZXJhdG9yPDwoY29uc3QgRlhfV0NIQVIqIGNfc3RyaW5nKTsKKyAgdm9pZCBvcGVyYXRvcjw8KHY4OjpMb2NhbDx2ODo6T2JqZWN0Pik7CisgIHZvaWQgb3BlcmF0b3I+Pih2ODo6TG9jYWw8djg6Ok9iamVjdD4mKSBjb25zdDsKKyAgdm9pZCBvcGVyYXRvcj4+KENKU19BcnJheSYgYXJyYXkpIGNvbnN0OworICB2b2lkIG9wZXJhdG9yPDwoQ0pTX0FycmF5JiBhcnJheSk7CisgIHZvaWQgb3BlcmF0b3I8PChDSlNfRGF0ZSYgZGF0ZSk7CisgIHZvaWQgb3BlcmF0b3I+PihDSlNfRGF0ZSYgZGF0ZSkgY29uc3Q7CisgIG9wZXJhdG9yIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCkgY29uc3Q7CisgIHZvaWQgU3RhcnRTZXR0aW5nKCk7CisgIHZvaWQgU3RhcnRHZXR0aW5nKCk7CisKKyBwcml2YXRlOgorICBGWF9CT09MIG1fYklzU2V0dGluZzsKK307CisKK2NsYXNzIENKU19BcnJheSB7CisgcHVibGljOgorICBDSlNfQXJyYXkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgdmlydHVhbCB+Q0pTX0FycmF5KCk7CisKKyAgdm9pZCBBdHRhY2godjg6OkxvY2FsPHY4OjpBcnJheT4gcEFycmF5KTsKKyAgdm9pZCBHZXRFbGVtZW50KHVuc2lnbmVkIGluZGV4LCBDSlNfVmFsdWUmIHZhbHVlKTsKKyAgdm9pZCBTZXRFbGVtZW50KHVuc2lnbmVkIGluZGV4LCBDSlNfVmFsdWUgdmFsdWUpOworICBpbnQgR2V0TGVuZ3RoKCk7CisgIEZYX0JPT0wgSXNBdHRhY2hlZCgpOworICBvcGVyYXRvciB2ODo6TG9jYWw8djg6OkFycmF5PigpOworCisgIENKU19SdW50aW1lKiBHZXRKU1J1bnRpbWUoKSBjb25zdCB7IHJldHVybiBtX3BKU1J1bnRpbWU7IH0KKworIHByaXZhdGU6CisgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IG1fcEFycmF5OworICBDSlNfUnVudGltZSogbV9wSlNSdW50aW1lOworfTsKKworY2xhc3MgQ0pTX0RhdGUgeworICBmcmllbmQgY2xhc3MgQ0pTX1ZhbHVlOworCisgcHVibGljOgorICBDSlNfRGF0ZShDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfRGF0ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIGRvdWJsZSBkTXNlY190aW1lKTsKKyAgQ0pTX0RhdGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICBpbnQgeWVhciwKKyAgICAgICAgICAgaW50IG1vbiwKKyAgICAgICAgICAgaW50IGRheSwKKyAgICAgICAgICAgaW50IGhvdXIsCisgICAgICAgICAgIGludCBtaW4sCisgICAgICAgICAgIGludCBzZWMpOworICB2aXJ0dWFsIH5DSlNfRGF0ZSgpOworICB2b2lkIEF0dGFjaCh2ODo6TG9jYWw8djg6OlZhbHVlPiBwRGF0ZSk7CisKKyAgaW50IEdldFllYXIoKTsKKyAgdm9pZCBTZXRZZWFyKGludCBpWWVhcik7CisKKyAgaW50IEdldE1vbnRoKCk7CisgIHZvaWQgU2V0TW9udGgoaW50IGlNb250aCk7CisKKyAgaW50IEdldERheSgpOworICB2b2lkIFNldERheShpbnQgaURheSk7CisKKyAgaW50IEdldEhvdXJzKCk7CisgIHZvaWQgU2V0SG91cnMoaW50IGlIb3Vycyk7CisKKyAgaW50IEdldE1pbnV0ZXMoKTsKKyAgdm9pZCBTZXRNaW51dGVzKGludCBtaW51dGVzKTsKKworICBpbnQgR2V0U2Vjb25kcygpOworICB2b2lkIFNldFNlY29uZHMoaW50IHNlY29uZHMpOworCisgIG9wZXJhdG9yIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7CisgIG9wZXJhdG9yIGRvdWJsZSgpIGNvbnN0OworCisgIENGWF9XaWRlU3RyaW5nIFRvU3RyaW5nKCkgY29uc3Q7CisKKyAgc3RhdGljIGRvdWJsZQorICBNYWtlRGF0ZShpbnQgeWVhciwgaW50IG1vbiwgaW50IG1kYXksIGludCBob3VyLCBpbnQgbWluLCBpbnQgc2VjLCBpbnQgbXMpOworCisgIEZYX0JPT0wgSXNWYWxpZERhdGUoKTsKKworIHByb3RlY3RlZDoKKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gbV9wRGF0ZTsKKyAgQ0pTX1J1bnRpbWUqIG1fcEpTUnVudGltZTsKK307CisKK2RvdWJsZSBKU19HZXREYXRlVGltZSgpOworaW50IEpTX0dldFllYXJGcm9tVGltZShkb3VibGUgZHQpOworaW50IEpTX0dldE1vbnRoRnJvbVRpbWUoZG91YmxlIGR0KTsKK2ludCBKU19HZXREYXlGcm9tVGltZShkb3VibGUgZHQpOworaW50IEpTX0dldEhvdXJGcm9tVGltZShkb3VibGUgZHQpOworaW50IEpTX0dldE1pbkZyb21UaW1lKGRvdWJsZSBkdCk7CitpbnQgSlNfR2V0U2VjRnJvbVRpbWUoZG91YmxlIGR0KTsKK2RvdWJsZSBKU19EYXRlUGFyc2UoY29uc3Qgd2NoYXJfdCogc3RyaW5nKTsKK2RvdWJsZSBKU19NYWtlRGF5KGludCBuWWVhciwgaW50IG5Nb250aCwgaW50IG5EYXkpOworZG91YmxlIEpTX01ha2VUaW1lKGludCBuSG91ciwgaW50IG5NaW4sIGludCBuU2VjLCBpbnQgbk1zKTsKK2RvdWJsZSBKU19NYWtlRGF0ZShkb3VibGUgZGF5LCBkb3VibGUgdGltZSk7Citib29sIEpTX1BvcnRJc05hbihkb3VibGUgZCk7Citkb3VibGUgSlNfTG9jYWxUaW1lKGRvdWJsZSBkKTsKKworI2VuZGlmICAvLyBGUERGU0RLX1NSQ19KQVZBU0NSSVBUX0pTX1ZBTFVFX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmNwcAppbmRleCA0NjA3ZmM2Li5kMmY3ZmIwIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvUHVibGljTWV0aG9kcy5jcHAKQEAgLTQsMjMwMiArNCwyMDY0IEBACiAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSmF2YVNjcmlwdC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19EZWZpbmUuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1ZhbHVlLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L3Jlc291cmNlLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0NvbnRleHQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfVmFsdWUuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvdXRpbC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9GaWVsZC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9jb2xvci5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19SdW50aW1lLmgiCisjaW5jbHVkZSAiUHVibGljTWV0aG9kcy5oIgogCi1zdGF0aWMgdjg6Oklzb2xhdGUqIEdldElzb2xhdGUoSUZYSlNfQ29udGV4dCogY2MpCi17Ci0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOworI2luY2x1ZGUgPGFsZ29yaXRobT4KIAotCUNKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKLQlBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7CisjaW5jbHVkZSAiRmllbGQuaCIKKyNpbmNsdWRlICJKU19Db250ZXh0LmgiCisjaW5jbHVkZSAiSlNfRGVmaW5lLmgiCisjaW5jbHVkZSAiSlNfRXZlbnRIYW5kbGVyLmgiCisjaW5jbHVkZSAiSlNfT2JqZWN0LmgiCisjaW5jbHVkZSAiSlNfUnVudGltZS5oIgorI2luY2x1ZGUgIkpTX1ZhbHVlLmgiCisjaW5jbHVkZSAiY29sb3IuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfZXh0LmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZzZGtfbWdyLmgiICAvLyBGb3IgQ1BERkRvY19FbnZpcm9ubWVudC4KKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oIgorI2luY2x1ZGUgInJlc291cmNlLmgiCisjaW5jbHVkZSAidXRpbC5oIgogCi0JcmV0dXJuIHBSdW50aW1lLT5HZXRJc29sYXRlKCk7Ci19Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0pTX1B1YmxpY01ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2RlZmluZSBET1VCTEVfQ09SUkVDVAkwLjAwMDAwMDAwMDAwMDAwMQorI2RlZmluZSBET1VCTEVfQ09SUkVDVCAwLjAwMDAwMDAwMDAwMDAwMQogCiBCRUdJTl9KU19TVEFUSUNfR0xPQkFMX0ZVTihDSlNfUHVibGljTWV0aG9kcykKLQlKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRk51bWJlcl9Gb3JtYXQpCi0JSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZOdW1iZXJfS2V5c3Ryb2tlKQotCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGUGVyY2VudF9Gb3JtYXQpCi0JSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZQZXJjZW50X0tleXN0cm9rZSkKLQlKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRkRhdGVfRm9ybWF0RXgpCi0JSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZEYXRlX0tleXN0cm9rZUV4KQotCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGRGF0ZV9Gb3JtYXQpCi0JSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZEYXRlX0tleXN0cm9rZSkKLQlKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlRpbWVfRm9ybWF0RXgpCi0JSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZUaW1lX0tleXN0cm9rZUV4KQotCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGVGltZV9Gb3JtYXQpCi0JSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZUaW1lX0tleXN0cm9rZSkKLQlKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNwZWNpYWxfRm9ybWF0KQotCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU3BlY2lhbF9LZXlzdHJva2UpCi0JSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZTcGVjaWFsX0tleXN0cm9rZUV4KQotCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU2ltcGxlKQotCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGTWFrZU51bWJlcikKLQlKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNpbXBsZV9DYWxjdWxhdGUpCi0JSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZSYW5nZV9WYWxpZGF0ZSkKLQlKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRk1lcmdlQ2hhbmdlKQotCUpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGUGFyc2VEYXRlRXgpCi0JSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZFeHRyYWN0TnVtcykKK0pTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGTnVtYmVyX0Zvcm1hdCkKK0pTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGTnVtYmVyX0tleXN0cm9rZSkKK0pTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGUGVyY2VudF9Gb3JtYXQpCitKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlBlcmNlbnRfS2V5c3Ryb2tlKQorSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZEYXRlX0Zvcm1hdEV4KQorSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZEYXRlX0tleXN0cm9rZUV4KQorSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZEYXRlX0Zvcm1hdCkKK0pTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGRGF0ZV9LZXlzdHJva2UpCitKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlRpbWVfRm9ybWF0RXgpCitKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlRpbWVfS2V5c3Ryb2tlRXgpCitKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlRpbWVfRm9ybWF0KQorSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZUaW1lX0tleXN0cm9rZSkKK0pTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU3BlY2lhbF9Gb3JtYXQpCitKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNwZWNpYWxfS2V5c3Ryb2tlKQorSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZTcGVjaWFsX0tleXN0cm9rZUV4KQorSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZTaW1wbGUpCitKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRk1ha2VOdW1iZXIpCitKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNpbXBsZV9DYWxjdWxhdGUpCitKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlJhbmdlX1ZhbGlkYXRlKQorSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZNZXJnZUNoYW5nZSkKK0pTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGUGFyc2VEYXRlRXgpCitKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRkV4dHJhY3ROdW1zKQogRU5EX0pTX1NUQVRJQ19HTE9CQUxfRlVOKCkKIAogSU1QTEVNRU5UX0pTX1NUQVRJQ19HTE9CQUxfRlVOKENKU19QdWJsaWNNZXRob2RzKQogCi1zdHJ1Y3Qgc3RydV9UYkNvbnZlcnQKLXsKLQlGWF9MUENTVFIgbHBzekpTTWFyazsKLQlGWF9MUENTVFIgbHBzekNwcE1hcms7Ci19Oworc3RhdGljIGNvbnN0IEZYX1dDSEFSKiBjb25zdCBtb250aHNbXSA9IHtMIkphbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiRmViIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJNYXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkFwciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiTWF5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJKdW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkp1bCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiQXVnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJTZXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIk9jdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiTm92IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJEZWMifTsKIAotc3RhdGljIGNvbnN0IHN0cnVfVGJDb252ZXJ0IGZjVGFibGVbXSA9IHsKLQl7ICJtbW1tIiwiJUIiIH0sCi0JeyAibW1tIiwgIiViIiB9LAotCXsgIm1tIiwgICIlbSIgfSwKLQkvLyJtIgotCXsgImRkZGQiLCIlQSIgfSwKLQl7ICJkZGQiLCAiJWEiIH0sCi0JeyAiZGQiLCAgIiVkIiB9LAotCS8vImQiLCAgICIldyIsCi0JeyAieXl5eSIsIiVZIiB9LAotCXsgInl5IiwgICIleSIgfSwKLQl7ICJISCIsICAiJUgiIH0sCi0JLy8iSCIKLQl7ICJoaCIsICAiJUkiIH0sCi0JLy8iaCIKLQl7ICJNTSIsICAiJU0iIH0sCi0JLy8iTSIKLQl7ICJzcyIsICAiJVMiIH0sCi0JLy8icwotCXsgInR0IiwgICIlcCIgfSwKLQkvLyJ0IgotfTsKK3N0YXRpYyBjb25zdCBGWF9XQ0hBUiogY29uc3QgZnVsbG1vbnRoc1tdID0ge0wiSmFudWFyeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkZlYnJ1YXJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiTWFyY2giLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJBcHJpbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIk1heSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkp1bmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJKdWx5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiQXVndXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiU2VwdGVtYmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiT2N0b2JlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIk5vdmVtYmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiRGVjZW1iZXIifTsKIAotc3RhdGljIEZYX0xQQ1dTVFIgbW9udGhzW10gPQotewotCUwiSmFuIiwgTCJGZWIiLCBMIk1hciIsIEwiQXByIiwgTCJNYXkiLCBMIkp1biIsIEwiSnVsIiwgTCJBdWciLCBMIlNlcCIsIEwiT2N0IiwgTCJOb3YiLCBMIkRlYyIKLX07CitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpJc051bWJlcihjb25zdCBGWF9XQ0hBUiogc3RyaW5nKSB7CisgIENGWF9XaWRlU3RyaW5nIHNUcmltID0gU3RyVHJpbShzdHJpbmcpOworICBjb25zdCBGWF9XQ0hBUiogcFRyaW0gPSBzVHJpbS5jX3N0cigpOworICBjb25zdCBGWF9XQ0hBUiogcCA9IHBUcmltOwogCi1zdGF0aWMgRlhfTFBDV1NUUiBmdWxsbW9udGhzW10gPQotewotCUwiSmFudWFyeSIsIEwiRmVicnVhcnkiLCBMIk1hcmNoIiwgTCJBcHJpbCIsIEwiTWF5IiwgTCJKdW5lIiwgTCJKdWx5IiwgTCJBdWd1c3QiLCBMIlNlcHRlbWJlciIsIEwiT2N0b2JlciIsIEwiTm92ZW1iZXIiLCBMIkRlY2VtYmVyIgotfTsKKyAgRlhfQk9PTCBiRG90ID0gRkFMU0U7CisgIEZYX0JPT0wgYktYSlMgPSBGQUxTRTsKIAotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNOdW1iZXIoRlhfTFBDV1NUUiBzdHJpbmcpCi17Ci0JQ0ZYX1dpZGVTdHJpbmcgc1RyaW0gPSBTdHJUcmltKHN0cmluZyk7Ci0JRlhfTFBDV1NUUiBwVHJpbSA9IHNUcmltLmNfc3RyKCk7Ci0JRlhfTFBDV1NUUiBwID0gcFRyaW07CisgIHdjaGFyX3QgYzsKKyAgd2hpbGUgKChjID0gKnApKSB7CisgICAgaWYgKGMgPT0gJy4nIHx8IGMgPT0gJywnKSB7CisgICAgICBpZiAoYkRvdCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgYkRvdCA9IFRSVUU7CisgICAgfSBlbHNlIGlmIChjID09ICctJyB8fCBjID09ICcrJykgeworICAgICAgaWYgKHAgIT0gcFRyaW0pCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9IGVsc2UgaWYgKGMgPT0gJ2UnIHx8IGMgPT0gJ0UnKSB7CisgICAgICBpZiAoYktYSlMpCisgICAgICAgIHJldHVybiBGQUxTRTsKIAorICAgICAgcCsrOworICAgICAgYyA9ICpwOworICAgICAgaWYgKGMgPT0gJysnIHx8IGMgPT0gJy0nKSB7CisgICAgICAgIGJLWEpTID0gVFJVRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFGWFNZU19pc3dkaWdpdChjKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBwKys7CisgIH0KIAotCUZYX0JPT0wgYkRvdCA9IEZBTFNFOwotCUZYX0JPT0wgYktYSlMgPSBGQUxTRTsKLQotCXdjaGFyX3QgYzsKLQl3aGlsZSAoKGMgPSAqcCkpCi0JewotCQlpZiAoYyA9PSAnLicgfHwgYyA9PSAnLCcpCi0JCXsKLQkJCWlmIChiRG90KSByZXR1cm4gRkFMU0U7Ci0JCQliRG90ID0gVFJVRTsKLQkJfQotCQllbHNlIGlmIChjID09ICctJyB8fCBjID09ICcrJykKLQkJewotCQkJaWYgKHAgIT0gcFRyaW0pCi0JCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JCWVsc2UgaWYgKGMgPT0gJ2UnIHx8IGMgPT0gJ0UnKQotCQl7Ci0JCQlpZiAoYktYSlMpIHJldHVybiBGQUxTRTsKLQotCQkJcCsrOwotCQkJYyA9ICpwOwotCQkJaWYgKGMgPT0gJysnIHx8IGMgPT0gJy0nKQotCQkJewotCQkJCWJLWEpTID0gVFJVRTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoIUlzRGlnaXQoYykpCi0JCXsKLQkJCXJldHVybiBGQUxTRTsKLQkJfQotCQlwKys7Ci0JfQotCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpJc0RpZ2l0KHdjaGFyX3QgY2gpCi17Ci0JcmV0dXJuIChjaCA+PSBMJzAnICYmIGNoIDw9IEwnOScpOwotfQotCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpJc0RpZ2l0KGNoYXIgY2gpCi17Ci0JcmV0dXJuIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKTsKLX0KLQotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNBbHBoYWJldGljKHdjaGFyX3QgY2gpCi17Ci0JcmV0dXJuICgoY2ggPj0gTCdhJyAmJiBjaCA8PSBMJ3onKSB8fCAoY2ggPj0gTCdBJyAmJiBjaCA8PSBMJ1onKSk7Ci19Ci0KLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzQWxwaGFOdW1lcmljKHdjaGFyX3QgY2gpCi17Ci0JcmV0dXJuIChJc0RpZ2l0KGNoKSB8fCBJc0FscGhhYmV0aWMoY2gpKTsKLX0KLQotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6bWFza1NhdGlzZmllZCh3Y2hhcl90IGNfQ2hhbmdlLHdjaGFyX3QgY19NYXNrKQotewotCXN3aXRjaCAoY19NYXNrKQotCXsKLQljYXNlIEwnOSc6Ci0gICAgICAgIHJldHVybiBJc0RpZ2l0KGNfQ2hhbmdlKTsKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6Om1hc2tTYXRpc2ZpZWQod2NoYXJfdCBjX0NoYW5nZSwgd2NoYXJfdCBjX01hc2spIHsKKyAgc3dpdGNoIChjX01hc2spIHsKKyAgICBjYXNlIEwnOSc6CisgICAgICByZXR1cm4gRlhTWVNfaXN3ZGlnaXQoY19DaGFuZ2UpOwogICAgIGNhc2UgTCdBJzoKLSAgICAgICAgcmV0dXJuIElzQWxwaGFiZXRpYyhjX0NoYW5nZSk7CisgICAgICByZXR1cm4gRlhTWVNfaXN3YWxwaGEoY19DaGFuZ2UpOwogICAgIGNhc2UgTCdPJzoKLSAgICAgICAgcmV0dXJuIElzQWxwaGFOdW1lcmljKGNfQ2hhbmdlKTsKKyAgICAgIHJldHVybiBGWFNZU19pc3dhbG51bShjX0NoYW5nZSk7CiAgICAgY2FzZSBMJ1gnOgotICAgICAgICByZXR1cm4gVFJVRTsKLQlkZWZhdWx0OgotICAgICAgICByZXR1cm4gKGNfQ2hhbmdlID09IGNfTWFzayk7Ci0JfQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAoY19DaGFuZ2UgPT0gY19NYXNrKTsKKyAgfQogfQogCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjppc1Jlc2VydmVkTWFza0NoYXIod2NoYXJfdCBjaCkKLXsKLQlyZXR1cm4gY2ggPT0gTCc5JyB8fCBjaCA9PSBMJ0EnIHx8IGNoID09IEwnTycgfHwgY2ggPT0gTCdYJzsKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OmlzUmVzZXJ2ZWRNYXNrQ2hhcih3Y2hhcl90IGNoKSB7CisgIHJldHVybiBjaCA9PSBMJzknIHx8IGNoID09IEwnQScgfHwgY2ggPT0gTCdPJyB8fCBjaCA9PSBMJ1gnOwogfQogCi1kb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OkFGX1NpbXBsZShGWF9MUENXU1RSIHNGdWN0aW9uLCBkb3VibGUgZFZhbHVlMSwgZG91YmxlIGRWYWx1ZTIpCi17Ci0JaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sTCJBVkciKSA9PSAwIHx8IEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sTCJTVU0iKSA9PSAwKQotCXsKLQkJcmV0dXJuIGRWYWx1ZTEgKyBkVmFsdWUyOwotCX0KLQllbHNlIGlmIChGWFNZU193Y3NpY21wKHNGdWN0aW9uLCBMIlBSRCIpID09IDApCi0JewotCQlyZXR1cm4gZFZhbHVlMSAqIGRWYWx1ZTI7Ci0JfQotCWVsc2UgaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sTCJNSU4iKSA9PSAwKQotCXsKLQkJcmV0dXJuIEZYX01JTihkVmFsdWUxLCBkVmFsdWUyKTsKLQl9Ci0JZWxzZSBpZiAoRlhTWVNfd2NzaWNtcChzRnVjdGlvbixMIk1BWCIpID09IDApCi0JewotCQlyZXR1cm4gRlhfTUFYKGRWYWx1ZTEsIGRWYWx1ZTIpOwotCX0KLQotCXJldHVybiBkVmFsdWUxOworZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpBRl9TaW1wbGUoY29uc3QgRlhfV0NIQVIqIHNGdWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRWYWx1ZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZFZhbHVlMikgeworICBpZiAoRlhTWVNfd2NzaWNtcChzRnVjdGlvbiwgTCJBVkciKSA9PSAwIHx8CisgICAgICBGWFNZU193Y3NpY21wKHNGdWN0aW9uLCBMIlNVTSIpID09IDApIHsKKyAgICByZXR1cm4gZFZhbHVlMSArIGRWYWx1ZTI7CisgIH0KKyAgaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sIEwiUFJEIikgPT0gMCkgeworICAgIHJldHVybiBkVmFsdWUxICogZFZhbHVlMjsKKyAgfQorICBpZiAoRlhTWVNfd2NzaWNtcChzRnVjdGlvbiwgTCJNSU4iKSA9PSAwKSB7CisgICAgcmV0dXJuIHN0ZDo6bWluKGRWYWx1ZTEsIGRWYWx1ZTIpOworICB9CisgIGlmIChGWFNZU193Y3NpY21wKHNGdWN0aW9uLCBMIk1BWCIpID09IDApIHsKKyAgICByZXR1cm4gc3RkOjptYXgoZFZhbHVlMSwgZFZhbHVlMik7CisgIH0KKyAgcmV0dXJuIGRWYWx1ZTE7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJMVHJpbShGWF9MUENXU1RSIHBTdHIpCi17Ci0Jd2hpbGUgKCpwU3RyICYmICpwU3RyID09IEwnICcpIHBTdHIrKzsKK0NGWF9XaWRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJMVHJpbShjb25zdCBGWF9XQ0hBUiogcFN0cikgeworICB3aGlsZSAoKnBTdHIgJiYgKnBTdHIgPT0gTCcgJykKKyAgICBwU3RyKys7CiAKLQlyZXR1cm4gcFN0cjsKKyAgcmV0dXJuIHBTdHI7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJSVHJpbShGWF9MUENXU1RSIHBTdHIpCi17Ci0JRlhfTFBDV1NUUiBwID0gcFN0cjsKLQl3aGlsZSAoKnApIHArKzsKLQl3aGlsZSAocCA+IHBTdHIgJiYgKihwIC0gMSkgPT0gTCcgJykgcC0tOworQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0clJUcmltKGNvbnN0IEZYX1dDSEFSKiBwU3RyKSB7CisgIGNvbnN0IEZYX1dDSEFSKiBwID0gcFN0cjsKKyAgd2hpbGUgKCpwKQorICAgIHArKzsKKyAgd2hpbGUgKHAgPiBwU3RyICYmICoocCAtIDEpID09IEwnICcpCisgICAgcC0tOwogCi0JcmV0dXJuIENGWF9XaWRlU3RyaW5nKHBTdHIsIHAgLSBwU3RyKTsKKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKHBTdHIsIHAgLSBwU3RyKTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0clRyaW0oRlhfTFBDV1NUUiBwU3RyKQotewotCXJldHVybiBTdHJSVHJpbShTdHJMVHJpbShwU3RyKS5jX3N0cigpKTsKK0NGWF9XaWRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJUcmltKGNvbnN0IEZYX1dDSEFSKiBwU3RyKSB7CisgIHJldHVybiBTdHJSVHJpbShTdHJMVHJpbShwU3RyKS5jX3N0cigpKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0ckxUcmltKEZYX0xQQ1NUUiBwU3RyKQotewotCXdoaWxlICgqcFN0ciAmJiAqcFN0ciA9PSAnICcpIHBTdHIrKzsKK0NGWF9CeXRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJMVHJpbShjb25zdCBGWF9DSEFSKiBwU3RyKSB7CisgIHdoaWxlICgqcFN0ciAmJiAqcFN0ciA9PSAnICcpCisgICAgcFN0cisrOwogCi0gICAgICAgIHJldHVybiBwU3RyOworICByZXR1cm4gcFN0cjsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0clJUcmltKEZYX0xQQ1NUUiBwU3RyKQotewotCUZYX0xQQ1NUUiBwID0gcFN0cjsKLQl3aGlsZSAoKnApIHArKzsKLQl3aGlsZSAocCA+IHBTdHIgJiYgKihwIC0gMSkgPT0gTCcgJykgcC0tOworQ0ZYX0J5dGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0clJUcmltKGNvbnN0IEZYX0NIQVIqIHBTdHIpIHsKKyAgY29uc3QgRlhfQ0hBUiogcCA9IHBTdHI7CisgIHdoaWxlICgqcCkKKyAgICBwKys7CisgIHdoaWxlIChwID4gcFN0ciAmJiAqKHAgLSAxKSA9PSBMJyAnKQorICAgIHAtLTsKIAotCXJldHVybiBDRlhfQnl0ZVN0cmluZyhwU3RyLHAtcFN0cik7CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhwU3RyLCBwIC0gcFN0cik7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJUcmltKEZYX0xQQ1NUUiBwU3RyKQotewotCXJldHVybiBTdHJSVHJpbShTdHJMVHJpbShwU3RyKSk7CitDRlhfQnl0ZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyVHJpbShjb25zdCBGWF9DSEFSKiBwU3RyKSB7CisgIHJldHVybiBTdHJSVHJpbShTdHJMVHJpbShwU3RyKSk7CiB9CiAKLWRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VOdW1iZXIoRlhfTFBDV1NUUiBzd1NvdXJjZSwgRlhfQk9PTCYgYkFsbERpZ2l0cywgRlhfQk9PTCYgYkRvdCwgRlhfQk9PTCYgYlNpZ24sIEZYX0JPT0wmIGJLWEpTKQotewotCWJEb3QgPSBGQUxTRTsKLQliU2lnbiA9IEZBTFNFOwotCWJLWEpTID0gRkFMU0U7Citkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzd1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkFsbERpZ2l0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkRvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlNpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJLWEpTKSB7CisgIGJEb3QgPSBGQUxTRTsKKyAgYlNpZ24gPSBGQUxTRTsKKyAgYktYSlMgPSBGQUxTRTsKIAotCUZYX0JPT0wgYkRpZ2l0RXhpc3QgPSBGQUxTRTsKKyAgRlhfQk9PTCBiRGlnaXRFeGlzdCA9IEZBTFNFOwogCi0JRlhfTFBDV1NUUiBwID0gc3dTb3VyY2U7Ci0Jd2NoYXJfdCBjOworICBjb25zdCBGWF9XQ0hBUiogcCA9IHN3U291cmNlOworICB3Y2hhcl90IGM7CiAKLQlGWF9MUENXU1RSIHBTdGFydCA9IE5VTEw7Ci0JRlhfTFBDV1NUUiBwRW5kID0gTlVMTDsKKyAgY29uc3QgRlhfV0NIQVIqIHBTdGFydCA9IE5VTEw7CisgIGNvbnN0IEZYX1dDSEFSKiBwRW5kID0gTlVMTDsKIAotCXdoaWxlICgoYyA9ICpwKSkKLQl7Ci0JCWlmICghcFN0YXJ0ICYmIGMgIT0gTCcgJykKLQkJewotCQkJcFN0YXJ0ID0gcDsKLQkJfQorICB3aGlsZSAoKGMgPSAqcCkpIHsKKyAgICBpZiAoIXBTdGFydCAmJiBjICE9IEwnICcpIHsKKyAgICAgIHBTdGFydCA9IHA7CisgICAgfQogCi0JCXBFbmQgPSBwOwotCQlwKys7Ci0JfQorICAgIHBFbmQgPSBwOworICAgIHArKzsKKyAgfQogCi0JaWYgKCFwU3RhcnQpCi0JewotCQliQWxsRGlnaXRzID0gRkFMU0U7Ci0JCXJldHVybiAwOwotCX0KKyAgaWYgKCFwU3RhcnQpIHsKKyAgICBiQWxsRGlnaXRzID0gRkFMU0U7CisgICAgcmV0dXJuIDA7CisgIH0KIAotCXdoaWxlIChwRW5kICE9IHBTdGFydCkKLQl7Ci0JCWlmICgqcEVuZCA9PSBMJyAnKQotCQkJcEVuZCAtLTsKLQkJZWxzZQotCQkJYnJlYWs7Ci0JfQorICB3aGlsZSAocEVuZCAhPSBwU3RhcnQpIHsKKyAgICBpZiAoKnBFbmQgPT0gTCcgJykKKyAgICAgIHBFbmQtLTsKKyAgICBlbHNlCisgICAgICBicmVhazsKKyAgfQogCi0JZG91YmxlIGRSZXQgPSAwOwotCXAgPSBwU3RhcnQ7Ci0JYkFsbERpZ2l0cyA9IFRSVUU7Ci0JQ0ZYX1dpZGVTdHJpbmcgc3dEaWdpdHM7CisgIGRvdWJsZSBkUmV0ID0gMDsKKyAgcCA9IHBTdGFydDsKKyAgYkFsbERpZ2l0cyA9IFRSVUU7CisgIENGWF9XaWRlU3RyaW5nIHN3RGlnaXRzOwogCi0Jd2hpbGUgKHAgPD0gcEVuZCkKLQl7Ci0JCWMgPSAqcDsKKyAgd2hpbGUgKHAgPD0gcEVuZCkgeworICAgIGMgPSAqcDsKIAotCQlpZiAoSXNEaWdpdChjKSkKLQkJewotCQkJc3dEaWdpdHMgKz0gYzsKLQkJCWJEaWdpdEV4aXN0ID0gVFJVRTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXN3aXRjaCAoYykKLQkJCXsKLQkJCWNhc2UgTCcgJzoKLQkJCQliQWxsRGlnaXRzID0gRkFMU0U7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEwnLic6Ci0JCQljYXNlIEwnLCc6Ci0JCQkJaWYgKCFiRG90KQotCQkJCXsKLQkJCQkJaWYgKGJEaWdpdEV4aXN0KQotCQkJCQl7Ci0JCQkJCQlzd0RpZ2l0cyArPSBMJy4nOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJc3dEaWdpdHMgKz0gTCcwJzsKLQkJCQkJCXN3RGlnaXRzICs9IEwnLic7Ci0JCQkJCQliRGlnaXRFeGlzdCA9IFRSVUU7Ci0JCQkJCX0KKyAgICBpZiAoRlhTWVNfaXN3ZGlnaXQoYykpIHsKKyAgICAgIHN3RGlnaXRzICs9IGM7CisgICAgICBiRGlnaXRFeGlzdCA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAoYykgeworICAgICAgICBjYXNlIEwnICc6CisgICAgICAgICAgYkFsbERpZ2l0cyA9IEZBTFNFOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEwnLic6CisgICAgICAgIGNhc2UgTCcsJzoKKyAgICAgICAgICBpZiAoIWJEb3QpIHsKKyAgICAgICAgICAgIGlmIChiRGlnaXRFeGlzdCkgeworICAgICAgICAgICAgICBzd0RpZ2l0cyArPSBMJy4nOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc3dEaWdpdHMgKz0gTCcwJzsKKyAgICAgICAgICAgICAgc3dEaWdpdHMgKz0gTCcuJzsKKyAgICAgICAgICAgICAgYkRpZ2l0RXhpc3QgPSBUUlVFOworICAgICAgICAgICAgfQogCi0JCQkJCWJEb3QgPSBUUlVFOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQljYXNlICdlJzoKLQkJCWNhc2UgJ0UnOgotCQkJCWlmICghYktYSlMpCi0JCQkJewotCQkJCQlwKys7Ci0JCQkJCWMgPSAqcDsKLQkJCQkJaWYgKGMgPT0gJysnIHx8IGMgPT0gJy0nKQotCQkJCQl7Ci0JCQkJCQliS1hKUyA9IFRSVUU7Ci0JCQkJCQlzd0RpZ2l0cyArPSAnZSc7Ci0JCQkJCQlzd0RpZ2l0cyArPSBjOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCWNhc2UgTCctJzoKLQkJCQlpZiAoIWJEaWdpdEV4aXN0ICYmICFiU2lnbikKLQkJCQl7Ci0JCQkJCXN3RGlnaXRzICs9IGM7Ci0JCQkJCWJTaWduID0gVFJVRTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJZGVmYXVsdDoKLQkJCQliQWxsRGlnaXRzID0gRkFMU0U7CisgICAgICAgICAgICBiRG90ID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgY2FzZSAnZSc6CisgICAgICAgIGNhc2UgJ0UnOgorICAgICAgICAgIGlmICghYktYSlMpIHsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIGMgPSAqcDsKKyAgICAgICAgICAgIGlmIChjID09ICcrJyB8fCBjID09ICctJykgeworICAgICAgICAgICAgICBiS1hKUyA9IFRSVUU7CisgICAgICAgICAgICAgIHN3RGlnaXRzICs9ICdlJzsKKyAgICAgICAgICAgICAgc3dEaWdpdHMgKz0gYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBMJy0nOgorICAgICAgICAgIGlmICghYkRpZ2l0RXhpc3QgJiYgIWJTaWduKSB7CisgICAgICAgICAgICBzd0RpZ2l0cyArPSBjOworICAgICAgICAgICAgYlNpZ24gPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJBbGxEaWdpdHMgPSBGQUxTRTsKIAotCQkJCWlmIChwICE9IHBTdGFydCAmJiAhYkRvdCAmJiBiRGlnaXRFeGlzdCkKLQkJCQl7Ci0JCQkJCXN3RGlnaXRzICs9IEwnLic7Ci0JCQkJCWJEb3QgPSBUUlVFOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQliRG90ID0gRkFMU0U7Ci0JCQkJCWJEaWdpdEV4aXN0ID0gRkFMU0U7Ci0JCQkJCXN3RGlnaXRzID0gTCIiOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQorICAgICAgICAgIGlmIChwICE9IHBTdGFydCAmJiAhYkRvdCAmJiBiRGlnaXRFeGlzdCkgeworICAgICAgICAgICAgc3dEaWdpdHMgKz0gTCcuJzsKKyAgICAgICAgICAgIGJEb3QgPSBUUlVFOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiRG90ID0gRkFMU0U7CisgICAgICAgICAgICBiRGlnaXRFeGlzdCA9IEZBTFNFOworICAgICAgICAgICAgc3dEaWdpdHMgPSBMIiI7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KIAotCQlwKys7Ci0JfQorICAgIHArKzsKKyAgfQogCi0JaWYgKHN3RGlnaXRzLkdldExlbmd0aCgpID4gMCAmJiBzd0RpZ2l0cy5HZXRMZW5ndGgoKSA8IDE3KQotCXsKLQkJQ0ZYX0J5dGVTdHJpbmcgc0RpZ2l0cyA9IHN3RGlnaXRzLlVURjhFbmNvZGUoKTsKKyAgaWYgKHN3RGlnaXRzLkdldExlbmd0aCgpID4gMCAmJiBzd0RpZ2l0cy5HZXRMZW5ndGgoKSA8IDE3KSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgc0RpZ2l0cyA9IHN3RGlnaXRzLlVURjhFbmNvZGUoKTsKIAotCQlpZiAoYktYSlMpCi0JCXsKLQkJCWRSZXQgPSBhdG9mKHNEaWdpdHMpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKGJEb3QpCi0JCQl7Ci0JCQkJY2hhciogcFN0b3BTdHJpbmc7Ci0JCQkJZFJldCA9IDo6c3RydG9kKHNEaWdpdHMsICZwU3RvcFN0cmluZyk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJZFJldCA9IGF0b2woc0RpZ2l0cyk7Ci0JCQl9Ci0JCX0KKyAgICBpZiAoYktYSlMpIHsKKyAgICAgIGRSZXQgPSBhdG9mKHNEaWdpdHMpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoYkRvdCkgeworICAgICAgICBjaGFyKiBwU3RvcFN0cmluZzsKKyAgICAgICAgZFJldCA9IDo6c3RydG9kKHNEaWdpdHMsICZwU3RvcFN0cmluZyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkUmV0ID0gYXRvbChzRGlnaXRzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KIAotCX0KLQotCXJldHVybiBkUmV0OworICByZXR1cm4gZFJldDsKIH0KIAotZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpQYXJzZVN0cmluZ1RvTnVtYmVyKEZYX0xQQ1dTVFIgc3dTb3VyY2UpCi17Ci0JRlhfQk9PTCBiQWxsRGlnaXRzID0gRkFMU0U7Ci0JRlhfQk9PTCBiRG90ID0gRkFMU0U7Ci0JRlhfQk9PTCBiU2lnbiA9IEZBTFNFOwotCUZYX0JPT0wgYktYSlMgPSBGQUxTRTsKK2RvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VTdHJpbmdUb051bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UpIHsKKyAgRlhfQk9PTCBiQWxsRGlnaXRzID0gRkFMU0U7CisgIEZYX0JPT0wgYkRvdCA9IEZBTFNFOworICBGWF9CT09MIGJTaWduID0gRkFMU0U7CisgIEZYX0JPT0wgYktYSlMgPSBGQUxTRTsKIAotCXJldHVybiBQYXJzZU51bWJlcihzd1NvdXJjZSwgYkFsbERpZ2l0cywgYkRvdCwgYlNpZ24sIGJLWEpTKTsKKyAgcmV0dXJuIFBhcnNlTnVtYmVyKHN3U291cmNlLCBiQWxsRGlnaXRzLCBiRG90LCBiU2lnbiwgYktYSlMpOwogfQogCi1GWF9CT09MCUNKU19QdWJsaWNNZXRob2RzOjpDb252ZXJ0U3RyaW5nVG9OdW1iZXIoRlhfTFBDV1NUUiBzd1NvdXJjZSwgZG91YmxlICYgZFJldCwgRlhfQk9PTCAmIGJEb3QpCi17Ci0JRlhfQk9PTCBiQWxsRGlnaXRzID0gRkFMU0U7Ci0JRlhfQk9PTCBiU2lnbiA9IEZBTFNFOwotCUZYX0JPT0wgYktYSlMgPSBGQUxTRTsKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkNvbnZlcnRTdHJpbmdUb051bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlJiBkUmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJEb3QpIHsKKyAgRlhfQk9PTCBiQWxsRGlnaXRzID0gRkFMU0U7CisgIEZYX0JPT0wgYlNpZ24gPSBGQUxTRTsKKyAgRlhfQk9PTCBiS1hKUyA9IEZBTFNFOwogCi0JZFJldCA9IFBhcnNlTnVtYmVyKHN3U291cmNlLCBiQWxsRGlnaXRzLCBiRG90LCBiU2lnbiwgYktYSlMpOworICBkUmV0ID0gUGFyc2VOdW1iZXIoc3dTb3VyY2UsIGJBbGxEaWdpdHMsIGJEb3QsIGJTaWduLCBiS1hKUyk7CiAKLQlyZXR1cm4gYkFsbERpZ2l0czsKKyAgcmV0dXJuIGJBbGxEaWdpdHM7CiB9CiAKLUNKU19BcnJheSBDSlNfUHVibGljTWV0aG9kczo6QUZfTWFrZUFycmF5RnJvbUxpc3Qodjg6Oklzb2xhdGUqIGlzb2xhdGUsIENKU19WYWx1ZSB2YWwpCi17Ci0JQ0pTX0FycmF5IFN0ckFycmF5KGlzb2xhdGUpOwotCWlmKHZhbC5Jc0FycmF5T2JqZWN0KCkpCi0JewotCQl2YWwuQ29udmVydFRvQXJyYXkoU3RyQXJyYXkpOwotCQlyZXR1cm4gU3RyQXJyYXk7Ci0JfQotCUNGWF9XaWRlU3RyaW5nIHdzU3RyID0gdmFsLlRvQ0ZYV2lkZVN0cmluZygpOwotCUNGWF9CeXRlU3RyaW5nIHQgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUod3NTdHIpOwotCWNvbnN0IGNoYXIgKiBwID0gKGNvbnN0IGNoYXIgKil0OworQ0pTX0FycmF5IENKU19QdWJsaWNNZXRob2RzOjpBRl9NYWtlQXJyYXlGcm9tTGlzdChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSB2YWwpIHsKKyAgQ0pTX0FycmF5IFN0ckFycmF5KHBSdW50aW1lKTsKKyAgaWYgKHZhbC5Jc0FycmF5T2JqZWN0KCkpIHsKKyAgICB2YWwuQ29udmVydFRvQXJyYXkoU3RyQXJyYXkpOworICAgIHJldHVybiBTdHJBcnJheTsKKyAgfQorICBDRlhfV2lkZVN0cmluZyB3c1N0ciA9IHZhbC5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgdCA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh3c1N0cik7CisgIGNvbnN0IGNoYXIqIHAgPSAoY29uc3QgY2hhciopdDsKIAorICBpbnQgY2ggPSAnLCc7CisgIGludCBuSW5kZXggPSAwOwogCi0JaW50IGNoID0gJywnIDsKLQlpbnQgbkluZGV4ID0gMDsKKyAgd2hpbGUgKCpwKSB7CisgICAgY29uc3QgY2hhciogcFRlbXAgPSBzdHJjaHIocCwgY2gpOworICAgIGlmICghcFRlbXApIHsKKyAgICAgIFN0ckFycmF5LlNldEVsZW1lbnQobkluZGV4LCBDSlNfVmFsdWUocFJ1bnRpbWUsIFN0clRyaW0ocCkuY19zdHIoKSkpOworICAgICAgYnJlYWs7CisgICAgfQogCi0Jd2hpbGUgKCpwKQotCXsKLQkJY29uc3QgY2hhciAqIHBUZW1wID0gc3RyY2hyKHAsIGNoKTsKLQkJaWYgKHBUZW1wID09IE5VTEwpCi0JCXsKLQkJCVN0ckFycmF5LlNldEVsZW1lbnQobkluZGV4LCBDSlNfVmFsdWUoaXNvbGF0ZSwgU3RyVHJpbShwKS5jX3N0cigpKSk7Ci0JCQlicmVhazsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWNoYXIgKiBwU3ViID0gbmV3IGNoYXJbcFRlbXAgLSBwICsgMV07Ci0JCQlzdHJuY3B5KHBTdWIsIHAsIHBUZW1wIC0gcCk7Ci0JCQkqKHBTdWIgKyAocFRlbXAgLSBwKSkgPSAnXDAnOworICAgIGNoYXIqIHBTdWIgPSBuZXcgY2hhcltwVGVtcCAtIHAgKyAxXTsKKyAgICBzdHJuY3B5KHBTdWIsIHAsIHBUZW1wIC0gcCk7CisgICAgKihwU3ViICsgKHBUZW1wIC0gcCkpID0gJ1wwJzsKIAotCQkJU3RyQXJyYXkuU2V0RWxlbWVudChuSW5kZXgsIENKU19WYWx1ZShpc29sYXRlLCBTdHJUcmltKHBTdWIpLmNfc3RyKCkpKTsKLQkJCWRlbGV0ZSBbXXBTdWI7CisgICAgU3RyQXJyYXkuU2V0RWxlbWVudChuSW5kZXgsIENKU19WYWx1ZShwUnVudGltZSwgU3RyVHJpbShwU3ViKS5jX3N0cigpKSk7CisgICAgZGVsZXRlW10gcFN1YjsKIAotCQkJbkluZGV4ICsrOwotCQkJcCA9ICsrcFRlbXA7Ci0JCX0KLQotCX0KLQlyZXR1cm4gU3RyQXJyYXk7CisgICAgbkluZGV4Kys7CisgICAgcCA9ICsrcFRlbXA7CisgIH0KKyAgcmV0dXJuIFN0ckFycmF5OwogfQogCi1pbnQgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlU3RyaW5nSW50ZWdlcihjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nLGludCBuU3RhcnQsaW50JiBuU2tpcCwgaW50IG5NYXhTdGVwKQotewotCWludCBuUmV0ID0gMDsKLQluU2tpcCA9IDA7Ci0JZm9yIChpbnQgaT1uU3RhcnQsIHN6PXN0cmluZy5HZXRMZW5ndGgoKTsgaSA8IHN6OyBpKyspCi0JewotCQlpZiAoaS1uU3RhcnQgPiAxMCkKLQkJCWJyZWFrOworaW50IENKU19QdWJsaWNNZXRob2RzOjpQYXJzZVN0cmluZ0ludGVnZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5Ta2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5NYXhTdGVwKSB7CisgIGludCBuUmV0ID0gMDsKKyAgblNraXAgPSAwOworICBmb3IgKGludCBpID0gblN0YXJ0LCBzeiA9IHN0cmluZy5HZXRMZW5ndGgoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAoaSAtIG5TdGFydCA+IDEwKQorICAgICAgYnJlYWs7CiAKLQkJRlhfV0NIQVIgYyA9IHN0cmluZy5HZXRBdChpKTsKLQkJaWYgKElzRGlnaXQoKHdjaGFyX3QpYykpCi0JCXsKLQkJCW5SZXQgPSBuUmV0ICogMTAgKyAoYyAtICcwJyk7Ci0JCQluU2tpcCA9IGkgLSBuU3RhcnQgKyAxOwotCQkJaWYgKG5Ta2lwID49IG5NYXhTdGVwKQotCQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UKLQkJCWJyZWFrOwotCX0KKyAgICBGWF9XQ0hBUiBjID0gc3RyaW5nLkdldEF0KGkpOworICAgIGlmICghRlhTWVNfaXN3ZGlnaXQoYykpCisgICAgICBicmVhazsKIAotCXJldHVybiBuUmV0OworICAgIG5SZXQgPSBuUmV0ICogMTAgKyBGWFNZU190b0RlY2ltYWxEaWdpdFdpZGUoYyk7CisgICAgblNraXAgPSBpIC0gblN0YXJ0ICsgMTsKKyAgICBpZiAoblNraXAgPj0gbk1heFN0ZXApCisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBuUmV0OwogfQogCi1DRlhfV2lkZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VTdHJpbmdTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZywgaW50IG5TdGFydCwgaW50JiBuU2tpcCkKLXsKLQlDRlhfV2lkZVN0cmluZyBzd1JldDsKLQluU2tpcCA9IDA7Ci0JZm9yIChpbnQgaT1uU3RhcnQsIHN6PXN0cmluZy5HZXRMZW5ndGgoKTsgaSA8IHN6OyBpKyspCi0JewotCQlGWF9XQ0hBUiBjID0gc3RyaW5nLkdldEF0KGkpOwotCQlpZiAoKGMgPj0gTCdhJyAmJiBjIDw9IEwneicpIHx8IChjID49IEwnQScgJiYgYyA8PSBMJ1onKSkKLQkJewotCQkJc3dSZXQgKz0gYzsKLQkJCW5Ta2lwID0gaSAtIG5TdGFydCArIDE7Ci0JCX0KLQkJZWxzZQotCQkJYnJlYWs7Ci0JfQorQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlU3RyaW5nU3RyaW5nKAorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcsCisgICAgaW50IG5TdGFydCwKKyAgICBpbnQmIG5Ta2lwKSB7CisgIENGWF9XaWRlU3RyaW5nIHN3UmV0OworICBuU2tpcCA9IDA7CisgIGZvciAoaW50IGkgPSBuU3RhcnQsIHN6ID0gc3RyaW5nLkdldExlbmd0aCgpOyBpIDwgc3o7IGkrKykgeworICAgIEZYX1dDSEFSIGMgPSBzdHJpbmcuR2V0QXQoaSk7CisgICAgaWYgKCFGWFNZU19pc3dkaWdpdChjKSkKKyAgICAgIGJyZWFrOwogCi0JcmV0dXJuIHN3UmV0OworICAgIHN3UmV0ICs9IGM7CisgICAgblNraXAgPSBpIC0gblN0YXJ0ICsgMTsKKyAgfQorCisgIHJldHVybiBzd1JldDsKIH0KIAotZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpQYXJzZU5vcm1hbERhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiB2YWx1ZSwgRlhfQk9PTCYgYldyb25nRm9ybWF0KQotewotCWRvdWJsZSBkdCA9IEpTX0dldERhdGVUaW1lKCk7Citkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlTm9ybWFsRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBiV3JvbmdGb3JtYXQpIHsKKyAgZG91YmxlIGR0ID0gSlNfR2V0RGF0ZVRpbWUoKTsKIAotCWludCBuWWVhciA9IEpTX0dldFllYXJGcm9tVGltZShkdCk7Ci0JaW50IG5Nb250aCA9IEpTX0dldE1vbnRoRnJvbVRpbWUoZHQpICsgMTsKLQlpbnQgbkRheSA9IEpTX0dldERheUZyb21UaW1lKGR0KTsKLQlpbnQgbkhvdXIgPSBKU19HZXRIb3VyRnJvbVRpbWUoZHQpOwotCWludCBuTWluID0gSlNfR2V0TWluRnJvbVRpbWUoZHQpOwotCWludCBuU2VjID0gSlNfR2V0U2VjRnJvbVRpbWUoZHQpOworICBpbnQgblllYXIgPSBKU19HZXRZZWFyRnJvbVRpbWUoZHQpOworICBpbnQgbk1vbnRoID0gSlNfR2V0TW9udGhGcm9tVGltZShkdCkgKyAxOworICBpbnQgbkRheSA9IEpTX0dldERheUZyb21UaW1lKGR0KTsKKyAgaW50IG5Ib3VyID0gSlNfR2V0SG91ckZyb21UaW1lKGR0KTsKKyAgaW50IG5NaW4gPSBKU19HZXRNaW5Gcm9tVGltZShkdCk7CisgIGludCBuU2VjID0gSlNfR2V0U2VjRnJvbVRpbWUoZHQpOwogCi0JaW50IG51bWJlclszXTsKKyAgaW50IG51bWJlclszXTsKIAotCWludCBuU2tpcCA9IDA7Ci0JaW50IG5MZW4gPSB2YWx1ZS5HZXRMZW5ndGgoKTsKLQlpbnQgbkluZGV4ID0gMDsKLQlpbnQgaSA9IDA7Ci0Jd2hpbGUgKGkgPCBuTGVuKQotCXsKLQkJaWYgKG5JbmRleCA+IDIpIGJyZWFrOworICBpbnQgblNraXAgPSAwOworICBpbnQgbkxlbiA9IHZhbHVlLkdldExlbmd0aCgpOworICBpbnQgbkluZGV4ID0gMDsKKyAgaW50IGkgPSAwOworICB3aGlsZSAoaSA8IG5MZW4pIHsKKyAgICBpZiAobkluZGV4ID4gMikKKyAgICAgIGJyZWFrOwogCi0JCUZYX1dDSEFSIGMgPSB2YWx1ZS5HZXRBdChpKTsKLQkJaWYgKElzRGlnaXQoKHdjaGFyX3QpYykpCi0JCXsKLQkJCW51bWJlcltuSW5kZXgrK10gPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGksIG5Ta2lwLCA0KTsKLQkJCWkgKz0gblNraXA7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpICsrOwotCQl9Ci0JfQorICAgIEZYX1dDSEFSIGMgPSB2YWx1ZS5HZXRBdChpKTsKKyAgICBpZiAoRlhTWVNfaXN3ZGlnaXQoYykpIHsKKyAgICAgIG51bWJlcltuSW5kZXgrK10gPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGksIG5Ta2lwLCA0KTsKKyAgICAgIGkgKz0gblNraXA7CisgICAgfSBlbHNlIHsKKyAgICAgIGkrKzsKKyAgICB9CisgIH0KIAotCWlmIChuSW5kZXggPT0gMikKLQl7Ci0JCS8vIGNhc2UyOiBtb250aC9kYXkKLQkJLy8gY2FzZTM6IGRheS9tb250aAotCQlpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAxMikgJiYgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAzMSkpCi0JCXsKLQkJCW5Nb250aCA9IG51bWJlclswXTsKLQkJCW5EYXkgPSBudW1iZXJbMV07Ci0JCX0KLQkJZWxzZSBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAzMSkgJiYgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAxMikpCi0JCXsKLQkJCW5EYXkgPSBudW1iZXJbMF07Ci0JCQluTW9udGggPSBudW1iZXJbMV07Ci0JCX0KKyAgaWYgKG5JbmRleCA9PSAyKSB7CisgICAgLy8gY2FzZTI6IG1vbnRoL2RheQorICAgIC8vIGNhc2UzOiBkYXkvbW9udGgKKyAgICBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAxMikgJiYKKyAgICAgICAgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAzMSkpIHsKKyAgICAgIG5Nb250aCA9IG51bWJlclswXTsKKyAgICAgIG5EYXkgPSBudW1iZXJbMV07CisgICAgfSBlbHNlIGlmICgobnVtYmVyWzBdID49IDEgJiYgbnVtYmVyWzBdIDw9IDMxKSAmJgorICAgICAgICAgICAgICAgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAxMikpIHsKKyAgICAgIG5EYXkgPSBudW1iZXJbMF07CisgICAgICBuTW9udGggPSBudW1iZXJbMV07CisgICAgfQogCi0JCWJXcm9uZ0Zvcm1hdCA9IEZBTFNFOwotCX0KLQllbHNlIGlmIChuSW5kZXggPT0gMykKLQl7Ci0JCS8vIGNhc2UxOiB5ZWFyL21vbnRoL2RheQotCQkvLyBjYXNlMjogbW9udGgvZGF5L3llYXIKLQkJLy8gY2FzZTM6IGRheS9tb250aC95ZWFyCisgICAgaWYgKGJXcm9uZ0Zvcm1hdCkKKyAgICAgICpiV3JvbmdGb3JtYXQgPSBmYWxzZTsKKyAgfSBlbHNlIGlmIChuSW5kZXggPT0gMykgeworICAgIC8vIGNhc2UxOiB5ZWFyL21vbnRoL2RheQorICAgIC8vIGNhc2UyOiBtb250aC9kYXkveWVhcgorICAgIC8vIGNhc2UzOiBkYXkvbW9udGgveWVhcgogCi0JCWlmIChudW1iZXJbMF0gPiAxMiAmJiAobnVtYmVyWzFdID49IDEgJiYgbnVtYmVyWzFdIDw9IDEyKSAmJiAobnVtYmVyWzJdID49IDEgJiYgbnVtYmVyWzJdIDw9IDMxKSkKLQkJewotCQkJblllYXIgPSBudW1iZXJbMF07Ci0JCQluTW9udGggPSBudW1iZXJbMV07Ci0JCQluRGF5ID0gbnVtYmVyWzJdOwotCQl9Ci0JCWVsc2UgaWYgKChudW1iZXJbMF0gPj0gMSAmJiBudW1iZXJbMF0gPD0gMTIpICYmIChudW1iZXJbMV0gPj0gMSAmJiBudW1iZXJbMV0gPD0gMzEpICYmIG51bWJlclsyXSA+IDMxKQotCQl7Ci0JCQluTW9udGggPSBudW1iZXJbMF07Ci0JCQluRGF5ID0gbnVtYmVyWzFdOwotCQkJblllYXIgPSBudW1iZXJbMl07Ci0JCX0KLQkJZWxzZSBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAzMSkgJiYgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAxMikgJiYgbnVtYmVyWzJdID4gMzEpCi0JCXsKLQkJCW5EYXkgPSBudW1iZXJbMF07Ci0JCQluTW9udGggPSBudW1iZXJbMV07Ci0JCQluWWVhciA9IG51bWJlclsyXTsKLQkJfQorICAgIGlmIChudW1iZXJbMF0gPiAxMiAmJiAobnVtYmVyWzFdID49IDEgJiYgbnVtYmVyWzFdIDw9IDEyKSAmJgorICAgICAgICAobnVtYmVyWzJdID49IDEgJiYgbnVtYmVyWzJdIDw9IDMxKSkgeworICAgICAgblllYXIgPSBudW1iZXJbMF07CisgICAgICBuTW9udGggPSBudW1iZXJbMV07CisgICAgICBuRGF5ID0gbnVtYmVyWzJdOworICAgIH0gZWxzZSBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAxMikgJiYKKyAgICAgICAgICAgICAgIChudW1iZXJbMV0gPj0gMSAmJiBudW1iZXJbMV0gPD0gMzEpICYmIG51bWJlclsyXSA+IDMxKSB7CisgICAgICBuTW9udGggPSBudW1iZXJbMF07CisgICAgICBuRGF5ID0gbnVtYmVyWzFdOworICAgICAgblllYXIgPSBudW1iZXJbMl07CisgICAgfSBlbHNlIGlmICgobnVtYmVyWzBdID49IDEgJiYgbnVtYmVyWzBdIDw9IDMxKSAmJgorICAgICAgICAgICAgICAgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAxMikgJiYgbnVtYmVyWzJdID4gMzEpIHsKKyAgICAgIG5EYXkgPSBudW1iZXJbMF07CisgICAgICBuTW9udGggPSBudW1iZXJbMV07CisgICAgICBuWWVhciA9IG51bWJlclsyXTsKKyAgICB9CiAKLQkJYldyb25nRm9ybWF0ID0gRkFMU0U7Ci0JfQotCWVsc2UKLQl7Ci0JCWJXcm9uZ0Zvcm1hdCA9IFRSVUU7Ci0JCXJldHVybiBkdDsKLQl9CisgICAgaWYgKGJXcm9uZ0Zvcm1hdCkKKyAgICAgICpiV3JvbmdGb3JtYXQgPSBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoYldyb25nRm9ybWF0KQorICAgICAgKmJXcm9uZ0Zvcm1hdCA9IHRydWU7CisgICAgcmV0dXJuIGR0OworICB9CiAKLQlDRlhfV2lkZVN0cmluZyBzd1RlbXA7Ci0Jc3dUZW1wLkZvcm1hdChMIiVkLyVkLyVkICVkOiVkOiVkIixuTW9udGgsbkRheSxuWWVhcixuSG91cixuTWluLG5TZWMpOwotCXJldHVybiBKU19EYXRlUGFyc2Uoc3dUZW1wLmNfc3RyKCkpOworICBDRlhfV2lkZVN0cmluZyBzd1RlbXA7CisgIHN3VGVtcC5Gb3JtYXQoTCIlZC8lZC8lZCAlZDolZDolZCIsIG5Nb250aCwgbkRheSwgblllYXIsIG5Ib3VyLCBuTWluLCBuU2VjKTsKKyAgcmV0dXJuIEpTX0RhdGVQYXJzZShzd1RlbXAuY19zdHIoKSk7CiB9CiAKLWRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nICYgdmFsdWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nICYgZm9ybWF0LCBGWF9CT09MJiBiV3JvbmdGb3JtYXQpCi17Ci0JZG91YmxlIGR0ID0gSlNfR2V0RGF0ZVRpbWUoKTsKK2RvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBiV3JvbmdGb3JtYXQpIHsKKyAgZG91YmxlIGR0ID0gSlNfR2V0RGF0ZVRpbWUoKTsKIAotCWlmIChmb3JtYXQuSXNFbXB0eSgpIHx8IHZhbHVlLklzRW1wdHkoKSkKLQkJcmV0dXJuIGR0OworICBpZiAoZm9ybWF0LklzRW1wdHkoKSB8fCB2YWx1ZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIGR0OwogCi0JaW50IG5ZZWFyID0gSlNfR2V0WWVhckZyb21UaW1lKGR0KTsKLQlpbnQgbk1vbnRoID0gSlNfR2V0TW9udGhGcm9tVGltZShkdCkgKyAxOwotCWludCBuRGF5ID0gSlNfR2V0RGF5RnJvbVRpbWUoZHQpOwotCWludCBuSG91ciA9IEpTX0dldEhvdXJGcm9tVGltZShkdCk7Ci0JaW50IG5NaW4gPSBKU19HZXRNaW5Gcm9tVGltZShkdCk7Ci0JaW50IG5TZWMgPSBKU19HZXRTZWNGcm9tVGltZShkdCk7CisgIGludCBuWWVhciA9IEpTX0dldFllYXJGcm9tVGltZShkdCk7CisgIGludCBuTW9udGggPSBKU19HZXRNb250aEZyb21UaW1lKGR0KSArIDE7CisgIGludCBuRGF5ID0gSlNfR2V0RGF5RnJvbVRpbWUoZHQpOworICBpbnQgbkhvdXIgPSBKU19HZXRIb3VyRnJvbVRpbWUoZHQpOworICBpbnQgbk1pbiA9IEpTX0dldE1pbkZyb21UaW1lKGR0KTsKKyAgaW50IG5TZWMgPSBKU19HZXRTZWNGcm9tVGltZShkdCk7CiAKLQlpbnQgblllYXJTdWIgPSA5OTsgLy9uWWVhciAtIDIwMDA7CisgIGludCBuWWVhclN1YiA9IDk5OyAgLy8gblllYXIgLSAyMDAwOwogCi0JRlhfQk9PTCBiUG0gPSBGQUxTRTsKLQlGWF9CT09MIGJFeGl0ID0gRkFMU0U7Ci0JYldyb25nRm9ybWF0ID0gRkFMU0U7CisgIEZYX0JPT0wgYlBtID0gRkFMU0U7CisgIEZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKKyAgYm9vbCBiQmFkRm9ybWF0ID0gZmFsc2U7CiAKLQlpbnQgaT0wOwotCWludCBqPTA7CisgIGludCBpID0gMDsKKyAgaW50IGogPSAwOwogCi0Jd2hpbGUgKGkgPCBmb3JtYXQuR2V0TGVuZ3RoKCkpCi0JewotCQlpZiAoYkV4aXQpIGJyZWFrOworICB3aGlsZSAoaSA8IGZvcm1hdC5HZXRMZW5ndGgoKSkgeworICAgIGlmIChiRXhpdCkKKyAgICAgIGJyZWFrOwogCi0JCUZYX1dDSEFSIGMgPSBmb3JtYXQuR2V0QXQoaSk7Ci0JCXN3aXRjaCAoYykKLQkJewotCQkJY2FzZSAnOic6Ci0JCQljYXNlICcuJzoKLQkJCWNhc2UgJy0nOgotCQkJY2FzZSAnXFwnOgotCQkJY2FzZSAnLyc6Ci0JCQkJaSsrOwotCQkJCWorKzsKLQkJCQlicmVhazsKKyAgICBGWF9XQ0hBUiBjID0gZm9ybWF0LkdldEF0KGkpOworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAnOic6CisgICAgICBjYXNlICcuJzoKKyAgICAgIGNhc2UgJy0nOgorICAgICAgY2FzZSAnXFwnOgorICAgICAgY2FzZSAnLyc6CisgICAgICAgIGkrKzsKKyAgICAgICAgaisrOworICAgICAgICBicmVhazsKIAotCQkJY2FzZSAneSc6Ci0JCQljYXNlICdtJzoKLQkJCWNhc2UgJ2QnOgotCQkJY2FzZSAnSCc6Ci0JCQljYXNlICdoJzoKLQkJCWNhc2UgJ00nOgotCQkJY2FzZSAncyc6Ci0JCQljYXNlICd0JzoKLQkJCQl7Ci0JCQkJCWludCBvbGRqID0gajsKLQkJCQkJaW50IG5Ta2lwID0gMDsKLQkJCQkJaW50IHJlbWFpbmluZyA9IGZvcm1hdC5HZXRMZW5ndGgoKSAtIGkgLSAxOworICAgICAgY2FzZSAneSc6CisgICAgICBjYXNlICdtJzoKKyAgICAgIGNhc2UgJ2QnOgorICAgICAgY2FzZSAnSCc6CisgICAgICBjYXNlICdoJzoKKyAgICAgIGNhc2UgJ00nOgorICAgICAgY2FzZSAncyc6CisgICAgICBjYXNlICd0JzogeworICAgICAgICBpbnQgb2xkaiA9IGo7CisgICAgICAgIGludCBuU2tpcCA9IDA7CisgICAgICAgIGludCByZW1haW5pbmcgPSBmb3JtYXQuR2V0TGVuZ3RoKCkgLSBpIC0gMTsKIAotCQkJCQlpZiAocmVtYWluaW5nID09IDAgfHwgZm9ybWF0LkdldEF0KGkrMSkgIT0gYykKLQkJCQkJewotCQkJCQkJc3dpdGNoIChjKQotCQkJCQkJewotCQkJCQkJCWNhc2UgJ3knOgotCQkJCQkJCQlpKys7Ci0JCQkJCQkJCWorKzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAnbSc6Ci0JCQkJCQkJCW5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwotCQkJCQkJCQlpKys7Ci0JCQkJCQkJCWogKz0gblNraXA7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgJ2QnOgotCQkJCQkJCQluRGF5ID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7Ci0JCQkJCQkJCWkrKzsKLQkJCQkJCQkJaiArPSBuU2tpcDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAnSCc6Ci0JCQkJCQkJCW5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7Ci0JCQkJCQkJCWkrKzsKLQkJCQkJCQkJaiArPSBuU2tpcDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAnaCc6Ci0JCQkJCQkJCW5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7Ci0JCQkJCQkJCWkrKzsKLQkJCQkJCQkJaiArPSBuU2tpcDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAnTSc6Ci0JCQkJCQkJCW5NaW4gPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKLQkJCQkJCQkJaSsrOwotCQkJCQkJCQlqICs9IG5Ta2lwOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlICdzJzoKLQkJCQkJCQkJblNlYyA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwotCQkJCQkJCQlpKys7Ci0JCQkJCQkJCWogKz0gblNraXA7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgJ3QnOgotCQkJCQkJCQliUG0gPSAoaiA8IHZhbHVlLkdldExlbmd0aCgpICYmIHZhbHVlLkdldEF0KGopID09ICdwJyk7Ci0JCQkJCQkJCWkrKzsKLQkJCQkJCQkJaisrOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChyZW1haW5pbmcgPT0gMSB8fCBmb3JtYXQuR2V0QXQoaSsyKSAhPSBjKQotCQkJCQl7Ci0JCQkJCQlzd2l0Y2ggKGMpCi0JCQkJCQl7Ci0JCQkJCQkJY2FzZSAneSc6Ci0JCQkJCQkJCW5ZZWFyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgNCk7Ci0JCQkJCQkJCWkgKz0gMjsKLQkJCQkJCQkJaiArPSBuU2tpcDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAnbSc6Ci0JCQkJCQkJCW5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwotCQkJCQkJCQlpICs9IDI7Ci0JCQkJCQkJCWogKz0gblNraXA7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgJ2QnOgotCQkJCQkJCQluRGF5ID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7Ci0JCQkJCQkJCWkgKz0gMjsKLQkJCQkJCQkJaiArPSBuU2tpcDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAnSCc6Ci0JCQkJCQkJCW5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7Ci0JCQkJCQkJCWkgKz0gMjsKLQkJCQkJCQkJaiArPSBuU2tpcDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAnaCc6Ci0JCQkJCQkJCW5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7Ci0JCQkJCQkJCWkgKz0gMjsKLQkJCQkJCQkJaiArPSBuU2tpcDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSAnTSc6Ci0JCQkJCQkJCW5NaW4gPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKLQkJCQkJCQkJaSArPSAyOwotCQkJCQkJCQlqICs9IG5Ta2lwOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlICdzJzoKLQkJCQkJCQkJblNlYyA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwotCQkJCQkJCQlpICs9IDI7Ci0JCQkJCQkJCWogKz0gblNraXA7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgJ3QnOgotCQkJCQkJCQliUG0gPSAoaiArIDEgPCB2YWx1ZS5HZXRMZW5ndGgoKSAmJiB2YWx1ZS5HZXRBdChqKSA9PSAncCcgJiYgdmFsdWUuR2V0QXQoaisxKSA9PSAnbScpOwotCQkJCQkJCQlpICs9IDI7Ci0JCQkJCQkJCWogKz0gMjsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocmVtYWluaW5nID09IDIgfHwgZm9ybWF0LkdldEF0KGkrMykgIT0gYykKLQkJCQkJewotCQkJCQkJc3dpdGNoIChjKQotCQkJCQkJewotCQkJCQkJCWNhc2UgJ20nOgotCQkJCQkJCQl7Ci0JCQkJCQkJCQlDRlhfV2lkZVN0cmluZyBzTW9udGggPSBQYXJzZVN0cmluZ1N0cmluZyh2YWx1ZSwgaiwgblNraXApOwotCQkJCQkJCQkJRlhfQk9PTCBiRmluZCA9IEZBTFNFOwotCQkJCQkJCQkJZm9yIChpbnQgbSA9IDA7IG0gPCAxMjsgbSsrKQotCQkJCQkJCQkJewotCQkJCQkJCQkJCWlmIChzTW9udGguQ29tcGFyZU5vQ2FzZShtb250aHNbbV0pID09IDApCi0JCQkJCQkJCQkJewotCQkJCQkJCQkJCQluTW9udGggPSBtICsgMTsKLQkJCQkJCQkJCQkJaSs9MzsKLQkJCQkJCQkJCQkJais9blNraXA7Ci0JCQkJCQkJCQkJCWJGaW5kID0gVFJVRTsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQorICAgICAgICBpZiAocmVtYWluaW5nID09IDAgfHwgZm9ybWF0LkdldEF0KGkgKyAxKSAhPSBjKSB7CisgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICd5JzoKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgICAgIG5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOworICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgIGogKz0gblNraXA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICAgIG5EYXkgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBqICs9IG5Ta2lwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0gnOgorICAgICAgICAgICAgICBuSG91ciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOworICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgIGogKz0gblNraXA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgICAgIG5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgaiArPSBuU2tpcDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdNJzoKKyAgICAgICAgICAgICAgbk1pbiA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOworICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgIGogKz0gblNraXA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICAgIG5TZWMgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBqICs9IG5Ta2lwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgICBiUG0gPSAoaiA8IHZhbHVlLkdldExlbmd0aCgpICYmIHZhbHVlLkdldEF0KGopID09ICdwJyk7CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nID09IDEgfHwgZm9ybWF0LkdldEF0KGkgKyAyKSAhPSBjKSB7CisgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICd5JzoKKyAgICAgICAgICAgICAgblllYXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCA0KTsKKyAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgICAgICBqICs9IG5Ta2lwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ20nOgorICAgICAgICAgICAgICBuTW9udGggPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKKyAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgICAgICBqICs9IG5Ta2lwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgICBuRGF5ID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CisgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgICAgaiArPSBuU2tpcDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdIJzoKKyAgICAgICAgICAgICAgbkhvdXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKKyAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgICAgICBqICs9IG5Ta2lwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgICBuSG91ciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOworICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgICAgIGogKz0gblNraXA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnTSc6CisgICAgICAgICAgICAgIG5NaW4gPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKKyAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgICAgICBqICs9IG5Ta2lwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgICBuU2VjID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CisgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgICAgaiArPSBuU2tpcDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgICAgYlBtID0gKGogKyAxIDwgdmFsdWUuR2V0TGVuZ3RoKCkgJiYgdmFsdWUuR2V0QXQoaikgPT0gJ3AnICYmCisgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5HZXRBdChqICsgMSkgPT0gJ20nKTsKKyAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgICAgICBqICs9IDI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChyZW1haW5pbmcgPT0gMiB8fCBmb3JtYXQuR2V0QXQoaSArIDMpICE9IGMpIHsKKyAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ20nOiB7CisgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNNb250aCA9IFBhcnNlU3RyaW5nU3RyaW5nKHZhbHVlLCBqLCBuU2tpcCk7CisgICAgICAgICAgICAgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgZm9yIChpbnQgbSA9IDA7IG0gPCAxMjsgbSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHNNb250aC5Db21wYXJlTm9DYXNlKG1vbnRoc1ttXSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgbk1vbnRoID0gbSArIDE7CisgICAgICAgICAgICAgICAgICBpICs9IDM7CisgICAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOworICAgICAgICAgICAgICAgICAgYkZpbmQgPSBUUlVFOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CiAKLQkJCQkJCQkJCWlmICghYkZpbmQpCi0JCQkJCQkJCQl7Ci0JCQkJCQkJCQkJbk1vbnRoID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMyk7Ci0JCQkJCQkJCQkJaSs9MzsKLQkJCQkJCQkJCQlqICs9IG5Ta2lwOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgJ3knOgotCQkJCQkJCQlicmVhazsKLQkJCQkJCQlkZWZhdWx0OgotCQkJCQkJCQlpKz0zOwotCQkJCQkJCQlqKz0zOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChyZW1haW5pbmcgPT0gMyB8fCBmb3JtYXQuR2V0QXQoaSs0KSAhPSBjKQotCQkJCQl7Ci0JCQkJCQlzd2l0Y2ggKGMpCi0JCQkJCQl7CisgICAgICAgICAgICAgIGlmICghYkZpbmQpIHsKKyAgICAgICAgICAgICAgICBuTW9udGggPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAzKTsKKyAgICAgICAgICAgICAgICBpICs9IDM7CisgICAgICAgICAgICAgICAgaiArPSBuU2tpcDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3knOgorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGkgKz0gMzsKKyAgICAgICAgICAgICAgaiArPSAzOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nID09IDMgfHwgZm9ybWF0LkdldEF0KGkgKyA0KSAhPSBjKSB7CisgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICd5JzoKKyAgICAgICAgICAgICAgblllYXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCA0KTsKKyAgICAgICAgICAgICAgaiArPSBuU2tpcDsKKyAgICAgICAgICAgICAgaSArPSA0OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ20nOiB7CisgICAgICAgICAgICAgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKIAorICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzTW9udGggPSBQYXJzZVN0cmluZ1N0cmluZyh2YWx1ZSwgaiwgblNraXApOworICAgICAgICAgICAgICBzTW9udGguTWFrZUxvd2VyKCk7CiAKLQkJCQkJCQljYXNlICd5JzoKLQkJCQkJCQkJblllYXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCA0KTsKLQkJCQkJCQkJaiArPSBuU2tpcDsKLQkJCQkJCQkJaSArPSA0OwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlICdtJzoKLQkJCQkJCQkJewotCQkJCQkJCQkJRlhfQk9PTCBiRmluZCA9IEZBTFNFOworICAgICAgICAgICAgICBmb3IgKGludCBtID0gMDsgbSA8IDEyOyBtKyspIHsKKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzRnVsbE1vbnRocyA9IGZ1bGxtb250aHNbbV07CisgICAgICAgICAgICAgICAgc0Z1bGxNb250aHMuTWFrZUxvd2VyKCk7CiAKLQkJCQkJCQkJCUNGWF9XaWRlU3RyaW5nIHNNb250aCA9IFBhcnNlU3RyaW5nU3RyaW5nKHZhbHVlLCBqLCBuU2tpcCk7Ci0JCQkJCQkJCQlzTW9udGguTWFrZUxvd2VyKCk7CisgICAgICAgICAgICAgICAgaWYgKHNGdWxsTW9udGhzLkZpbmQoc01vbnRoLmNfc3RyKCksIDApICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICBuTW9udGggPSBtICsgMTsKKyAgICAgICAgICAgICAgICAgIGkgKz0gNDsKKyAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7CisgICAgICAgICAgICAgICAgICBiRmluZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KIAotCQkJCQkJCQkJZm9yIChpbnQgbSA9IDA7IG0gPCAxMjsgbSsrKQotCQkJCQkJCQkJewotCQkJCQkJCQkJCUNGWF9XaWRlU3RyaW5nIHNGdWxsTW9udGhzID0gZnVsbG1vbnRoc1ttXTsKLQkJCQkJCQkJCQlzRnVsbE1vbnRocy5NYWtlTG93ZXIoKTsKKyAgICAgICAgICAgICAgaWYgKCFiRmluZCkgeworICAgICAgICAgICAgICAgIG5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDQpOworICAgICAgICAgICAgICAgIGkgKz0gNDsKKyAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgaSArPSA0OworICAgICAgICAgICAgICBqICs9IDQ7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoaiA+PSB2YWx1ZS5HZXRMZW5ndGgoKSB8fCBmb3JtYXQuR2V0QXQoaSkgIT0gdmFsdWUuR2V0QXQoaikpIHsKKyAgICAgICAgICAgIGJCYWRGb3JtYXQgPSB0cnVlOworICAgICAgICAgICAgYkV4aXQgPSBUUlVFOworICAgICAgICAgIH0KKyAgICAgICAgICBpKys7CisgICAgICAgICAgaisrOworICAgICAgICB9CiAKLQkJCQkJCQkJCQlpZiAoc0Z1bGxNb250aHMuRmluZChzTW9udGguY19zdHIoKSwgMCkgIT0gLTEpCi0JCQkJCQkJCQkJewotCQkJCQkJCQkJCQluTW9udGggPSBtICsgMTsKLQkJCQkJCQkJCQkJaSArPSA0OwotCQkJCQkJCQkJCQlqICs9IG5Ta2lwOwotCQkJCQkJCQkJCQliRmluZCA9IFRSVUU7Ci0JCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KKyAgICAgICAgaWYgKG9sZGogPT0gaikgeworICAgICAgICAgIGJCYWRGb3JtYXQgPSB0cnVlOworICAgICAgICAgIGJFeGl0ID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgfQogCi0JCQkJCQkJCQlpZiAoIWJGaW5kKQotCQkJCQkJCQkJewotCQkJCQkJCQkJCW5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDQpOwotCQkJCQkJCQkJCWkrPTQ7Ci0JCQkJCQkJCQkJaiArPSBuU2tpcDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQlkZWZhdWx0OgotCQkJCQkJCQlpICs9IDQ7Ci0JCQkJCQkJCWogKz0gNDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlpZiAoaiA+PSB2YWx1ZS5HZXRMZW5ndGgoKSB8fCBmb3JtYXQuR2V0QXQoaSkgIT0gdmFsdWUuR2V0QXQoaikpCi0JCQkJCQl7Ci0JCQkJCQkJYldyb25nRm9ybWF0ID0gVFJVRTsKLQkJCQkJCQliRXhpdCA9IFRSVUU7Ci0JCQkJCQl9Ci0JCQkJCQlpKys7Ci0JCQkJCQlqKys7Ci0JCQkJCX0KKyAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKHZhbHVlLkdldExlbmd0aCgpIDw9IGopIHsKKyAgICAgICAgICBiRXhpdCA9IFRSVUU7CisgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0LkdldEF0KGkpICE9IHZhbHVlLkdldEF0KGopKSB7CisgICAgICAgICAgYkJhZEZvcm1hdCA9IHRydWU7CisgICAgICAgICAgYkV4aXQgPSBUUlVFOworICAgICAgICB9CiAKLQkJCQkJaWYgKG9sZGogPT0gaikKLQkJCQkJewotCQkJCQkJYldyb25nRm9ybWF0ID0gVFJVRTsKLQkJCQkJCWJFeGl0ID0gVFJVRTsKLQkJCQkJfQotCQkJCX0KKyAgICAgICAgaSsrOworICAgICAgICBqKys7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQogCi0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWlmICh2YWx1ZS5HZXRMZW5ndGgoKSA8PSBqKQotCQkJCXsKLQkJCQkJYkV4aXQgPSBUUlVFOwotCQkJCX0KLQkJCQllbHNlIGlmIChmb3JtYXQuR2V0QXQoaSkgIT0gdmFsdWUuR2V0QXQoaikpCi0JCQkJewotCQkJCQliV3JvbmdGb3JtYXQgPSBUUlVFOwotCQkJCQliRXhpdCA9IFRSVUU7Ci0JCQkJfQorICBpZiAoYlBtKQorICAgIG5Ib3VyICs9IDEyOwogCi0JCQkJaSsrOwotCQkJCWorKzsKLQkJCQlicmVhazsKLQkJfQotCX0KKyAgaWYgKG5ZZWFyID49IDAgJiYgblllYXIgPD0gblllYXJTdWIpCisgICAgblllYXIgKz0gMjAwMDsKIAotCWlmIChiUG0pIG5Ib3VyICs9IDEyOworICBpZiAobk1vbnRoIDwgMSB8fCBuTW9udGggPiAxMikKKyAgICBiQmFkRm9ybWF0ID0gdHJ1ZTsKIAotCWlmIChuWWVhciA+PSAwICYmIG5ZZWFyIDw9IG5ZZWFyU3ViKQotCQluWWVhciArPSAyMDAwOworICBpZiAobkRheSA8IDEgfHwgbkRheSA+IDMxKQorICAgIGJCYWRGb3JtYXQgPSB0cnVlOwogCi0JaWYgKG5Nb250aCA8IDEgfHwgbk1vbnRoID4gMTIpCi0JCWJXcm9uZ0Zvcm1hdCA9IFRSVUU7CisgIGlmIChuSG91ciA8IDAgfHwgbkhvdXIgPiAyNCkKKyAgICBiQmFkRm9ybWF0ID0gdHJ1ZTsKIAotCWlmIChuRGF5IDwgMSB8fCBuRGF5ID4gMzEpCi0JCWJXcm9uZ0Zvcm1hdCA9IFRSVUU7CisgIGlmIChuTWluIDwgMCB8fCBuTWluID4gNjApCisgICAgYkJhZEZvcm1hdCA9IHRydWU7CiAKLQlpZiAobkhvdXIgPCAwIHx8IG5Ib3VyID4gMjQpCi0JCWJXcm9uZ0Zvcm1hdCA9IFRSVUU7CisgIGlmIChuU2VjIDwgMCB8fCBuU2VjID4gNjApCisgICAgYkJhZEZvcm1hdCA9IHRydWU7CiAKLQlpZiAobk1pbiA8IDAgfHwgbk1pbiA+IDYwKQotCQliV3JvbmdGb3JtYXQgPSBUUlVFOworICBkb3VibGUgZFJldCA9IDA7CiAKLQlpZiAoblNlYyA8IDAgfHwgblNlYyA+IDYwKQotCQliV3JvbmdGb3JtYXQgPSBUUlVFOworICBpZiAoYkJhZEZvcm1hdCkgeworICAgIGRSZXQgPSBQYXJzZU5vcm1hbERhdGUodmFsdWUsICZiQmFkRm9ybWF0KTsKKyAgfSBlbHNlIHsKKyAgICBkUmV0ID0gSlNfTWFrZURhdGUoSlNfTWFrZURheShuWWVhciwgbk1vbnRoIC0gMSwgbkRheSksCisgICAgICAgICAgICAgICAgICAgICAgIEpTX01ha2VUaW1lKG5Ib3VyLCBuTWluLCBuU2VjLCAwKSk7CiAKLQlkb3VibGUgZFJldCA9IDA7CisgICAgaWYgKEpTX1BvcnRJc05hbihkUmV0KSkgeworICAgICAgZFJldCA9IEpTX0RhdGVQYXJzZSh2YWx1ZS5jX3N0cigpKTsKKyAgICB9CisgIH0KIAotCWlmIChiV3JvbmdGb3JtYXQpCi0JewotCQlkUmV0ID0gUGFyc2VOb3JtYWxEYXRlKHZhbHVlLCBiV3JvbmdGb3JtYXQpOwotCX0KLQllbHNlCi0JewotCQlkUmV0ID0gSlNfTWFrZURhdGUoSlNfTWFrZURheShuWWVhcixuTW9udGggLSAxLG5EYXkpLEpTX01ha2VUaW1lKG5Ib3VyLCBuTWluLCBuU2VjLCAwKSk7CisgIGlmIChKU19Qb3J0SXNOYW4oZFJldCkpIHsKKyAgICBkUmV0ID0gUGFyc2VOb3JtYWxEYXRlKHZhbHVlLCAmYkJhZEZvcm1hdCk7CisgIH0KIAotCQlpZiAoSlNfUG9ydElzTmFuKGRSZXQpKQotCQl7Ci0JCQlkUmV0ID0gSlNfRGF0ZVBhcnNlKHZhbHVlLmNfc3RyKCkpOwotCQl9Ci0JfQotCi0JaWYgKEpTX1BvcnRJc05hbihkUmV0KSkKLQl7Ci0JCWRSZXQgPSBQYXJzZU5vcm1hbERhdGUodmFsdWUsIGJXcm9uZ0Zvcm1hdCk7Ci0JfQotCi0JcmV0dXJuIGRSZXQ7Ci0KKyAgaWYgKGJXcm9uZ0Zvcm1hdCkKKyAgICAqYldyb25nRm9ybWF0ID0gYkJhZEZvcm1hdDsKKyAgcmV0dXJuIGRSZXQ7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZShkb3VibGUgZERhdGUsIGNvbnN0IENGWF9XaWRlU3RyaW5nICYgZm9ybWF0KQotewotCUNGWF9XaWRlU3RyaW5nIHNSZXQgPSBMIiIsc1BhcnQgPSBMIiI7CitDRlhfV2lkZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6TWFrZUZvcm1hdERhdGUoZG91YmxlIGREYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmb3JtYXQpIHsKKyAgQ0ZYX1dpZGVTdHJpbmcgc1JldCA9IEwiIiwgc1BhcnQgPSBMIiI7CiAKLQlpbnQgblllYXIgPSBKU19HZXRZZWFyRnJvbVRpbWUoZERhdGUpOwotCWludCBuTW9udGggPSBKU19HZXRNb250aEZyb21UaW1lKGREYXRlKSArIDE7Ci0JaW50IG5EYXkgPSBKU19HZXREYXlGcm9tVGltZShkRGF0ZSk7Ci0JaW50IG5Ib3VyID0gSlNfR2V0SG91ckZyb21UaW1lKGREYXRlKTsKLQlpbnQgbk1pbiA9IEpTX0dldE1pbkZyb21UaW1lKGREYXRlKTsKLQlpbnQgblNlYyA9IEpTX0dldFNlY0Zyb21UaW1lKGREYXRlKTsKKyAgaW50IG5ZZWFyID0gSlNfR2V0WWVhckZyb21UaW1lKGREYXRlKTsKKyAgaW50IG5Nb250aCA9IEpTX0dldE1vbnRoRnJvbVRpbWUoZERhdGUpICsgMTsKKyAgaW50IG5EYXkgPSBKU19HZXREYXlGcm9tVGltZShkRGF0ZSk7CisgIGludCBuSG91ciA9IEpTX0dldEhvdXJGcm9tVGltZShkRGF0ZSk7CisgIGludCBuTWluID0gSlNfR2V0TWluRnJvbVRpbWUoZERhdGUpOworICBpbnQgblNlYyA9IEpTX0dldFNlY0Zyb21UaW1lKGREYXRlKTsKIAotCWludCBpID0gMDsKLQl3aGlsZSAoaSA8IGZvcm1hdC5HZXRMZW5ndGgoKSkKLQl7Ci0JICAgICAgICBGWF9XQ0hBUiBjID0gZm9ybWF0LkdldEF0KGkpOwotICAgICAgICAgICAgICAgIGludCByZW1haW5pbmcgPSBmb3JtYXQuR2V0TGVuZ3RoKCkgLSBpIC0gMTsKLQkJc1BhcnQgPSBMIiI7Ci0JCXN3aXRjaCAoYykKLQkJewotCQkJY2FzZSAneSc6Ci0JCQljYXNlICdtJzoKLQkJCWNhc2UgJ2QnOgotCQkJY2FzZSAnSCc6Ci0JCQljYXNlICdoJzoKLQkJCWNhc2UgJ00nOgotCQkJY2FzZSAncyc6Ci0JCQljYXNlICd0JzoKLQkJCQlpZiAocmVtYWluaW5nID09IDAgfHwgZm9ybWF0LkdldEF0KGkrMSkgIT0gYykKLQkJCQl7Ci0JCQkJCXN3aXRjaCAoYykKLQkJCQkJewotCQkJCQkJY2FzZSAneSc6Ci0JCQkJCQkJc1BhcnQgKz0gYzsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgJ20nOgotCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiVkIixuTW9udGgpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAnZCc6Ci0JCQkJCQkJc1BhcnQuRm9ybWF0KEwiJWQiLG5EYXkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAnSCc6Ci0JCQkJCQkJc1BhcnQuRm9ybWF0KEwiJWQiLG5Ib3VyKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgJ2gnOgotCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiVkIixuSG91cj4xMj9uSG91ciAtIDEyOm5Ib3VyKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgJ00nOgotCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiVkIixuTWluKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgJ3MnOgotCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiVkIixuU2VjKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgJ3QnOgotCQkJCQkJCXNQYXJ0ICs9IG5Ib3VyPjEyPydwJzonYSc7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaSsrOwotCQkJCX0KLQkJCQllbHNlIGlmIChyZW1haW5pbmcgPT0gMSB8fCBmb3JtYXQuR2V0QXQoaSsyKSAhPSBjKQotCQkJCXsKLQkJCQkJc3dpdGNoIChjKQotCQkJCQl7Ci0JCQkJCQljYXNlICd5JzoKLQkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlMDJkIixuWWVhciAtIChuWWVhciAvIDEwMCkgKiAxMDApOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAnbSc6Ci0JCQkJCQkJc1BhcnQuRm9ybWF0KEwiJTAyZCIsbk1vbnRoKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgJ2QnOgotCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiUwMmQiLG5EYXkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAnSCc6Ci0JCQkJCQkJc1BhcnQuRm9ybWF0KEwiJTAyZCIsbkhvdXIpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAnaCc6Ci0JCQkJCQkJc1BhcnQuRm9ybWF0KEwiJTAyZCIsbkhvdXI+MTI/bkhvdXIgLSAxMjpuSG91cik7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlICdNJzoKLQkJCQkJCQlzUGFydC5Gb3JtYXQoTCIlMDJkIixuTWluKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgJ3MnOgotCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiUwMmQiLG5TZWMpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAndCc6Ci0JCQkJCQkJc1BhcnQgPSBuSG91cj4xMj8gTCJwbSI6IEwiYW0iOwotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWkrPTI7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHJlbWFpbmluZyA9PSAyIHx8IGZvcm1hdC5HZXRBdChpKzMpICE9IGMpCi0JCQkJewotCQkJCQlzd2l0Y2ggKGMpCi0JCQkJCXsKLQkJCQkJCWNhc2UgJ20nOgotCQkJCQkJCWkrPTM7Ci0JCQkJCQkJaWYgKG5Nb250aCA+IDAmJm5Nb250aCA8PSAxMikKLQkJCQkJCQkJc1BhcnQgKz0gbW9udGhzW25Nb250aCAtIDFdOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQlpKz0zOwotCQkJCQkJCXNQYXJ0ICs9IGM7Ci0JCQkJCQkJc1BhcnQgKz0gYzsKLQkJCQkJCQlzUGFydCArPSBjOwotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHJlbWFpbmluZyA9PSAzIHx8IGZvcm1hdC5HZXRBdChpKzQpICE9IGMpCi0JCQkJewotCQkJCQlzd2l0Y2ggKGMpCi0JCQkJCXsKLQkJCQkJCWNhc2UgJ3knOgotCQkJCQkJCXNQYXJ0LkZvcm1hdChMIiUwNGQiLG5ZZWFyKTsKLQkJCQkJCQlpICs9IDQ7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlICdtJzoKLQkJCQkJCQlpKz00OwotCQkJCQkJCWlmIChuTW9udGggPiAwJiZuTW9udGggPD0gMTIpCi0JCQkJCQkJCXNQYXJ0ICs9IGZ1bGxtb250aHNbbk1vbnRoIC0gMV07Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlkZWZhdWx0OgotCQkJCQkJCWkgKz0gNDsKLQkJCQkJCQlzUGFydCArPSBjOwotCQkJCQkJCXNQYXJ0ICs9IGM7Ci0JCQkJCQkJc1BhcnQgKz0gYzsKLQkJCQkJCQlzUGFydCArPSBjOwotCQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWkrKzsKLQkJCQkJc1BhcnQgKz0gYzsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWkrKzsKLQkJCQlzUGFydCArPSBjOwotCQkJCWJyZWFrOwotCQl9CisgIGludCBpID0gMDsKKyAgd2hpbGUgKGkgPCBmb3JtYXQuR2V0TGVuZ3RoKCkpIHsKKyAgICBGWF9XQ0hBUiBjID0gZm9ybWF0LkdldEF0KGkpOworICAgIGludCByZW1haW5pbmcgPSBmb3JtYXQuR2V0TGVuZ3RoKCkgLSBpIC0gMTsKKyAgICBzUGFydCA9IEwiIjsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgJ3knOgorICAgICAgY2FzZSAnbSc6CisgICAgICBjYXNlICdkJzoKKyAgICAgIGNhc2UgJ0gnOgorICAgICAgY2FzZSAnaCc6CisgICAgICBjYXNlICdNJzoKKyAgICAgIGNhc2UgJ3MnOgorICAgICAgY2FzZSAndCc6CisgICAgICAgIGlmIChyZW1haW5pbmcgPT0gMCB8fCBmb3JtYXQuR2V0QXQoaSArIDEpICE9IGMpIHsKKyAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ3knOgorICAgICAgICAgICAgICBzUGFydCArPSBjOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ20nOgorICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlZCIsIG5Nb250aCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiVkIiwgbkRheSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnSCc6CisgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiVkIiwgbkhvdXIpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlZCIsIG5Ib3VyID4gMTIgPyBuSG91ciAtIDEyIDogbkhvdXIpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ00nOgorICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlZCIsIG5NaW4pOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlZCIsIG5TZWMpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgICBzUGFydCArPSBuSG91ciA+IDEyID8gJ3AnIDogJ2EnOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaSsrOworICAgICAgICB9IGVsc2UgaWYgKHJlbWFpbmluZyA9PSAxIHx8IGZvcm1hdC5HZXRBdChpICsgMikgIT0gYykgeworICAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAneSc6CisgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiUwMmQiLCBuWWVhciAtIChuWWVhciAvIDEwMCkgKiAxMDApOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ20nOgorICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDJkIiwgbk1vbnRoKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTAyZCIsIG5EYXkpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0gnOgorICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDJkIiwgbkhvdXIpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDJkIiwgbkhvdXIgPiAxMiA/IG5Ib3VyIC0gMTIgOiBuSG91cik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnTSc6CisgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiUwMmQiLCBuTWluKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTAyZCIsIG5TZWMpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgICBzUGFydCA9IG5Ib3VyID4gMTIgPyBMInBtIiA6IEwiYW0iOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaSArPSAyOworICAgICAgICB9IGVsc2UgaWYgKHJlbWFpbmluZyA9PSAyIHx8IGZvcm1hdC5HZXRBdChpICsgMykgIT0gYykgeworICAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgICAgIGkgKz0gMzsKKyAgICAgICAgICAgICAgaWYgKG5Nb250aCA+IDAgJiYgbk1vbnRoIDw9IDEyKQorICAgICAgICAgICAgICAgIHNQYXJ0ICs9IG1vbnRoc1tuTW9udGggLSAxXTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBpICs9IDM7CisgICAgICAgICAgICAgIHNQYXJ0ICs9IGM7CisgICAgICAgICAgICAgIHNQYXJ0ICs9IGM7CisgICAgICAgICAgICAgIHNQYXJ0ICs9IGM7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChyZW1haW5pbmcgPT0gMyB8fCBmb3JtYXQuR2V0QXQoaSArIDQpICE9IGMpIHsKKyAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ3knOgorICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDRkIiwgblllYXIpOworICAgICAgICAgICAgICBpICs9IDQ7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgICAgIGkgKz0gNDsKKyAgICAgICAgICAgICAgaWYgKG5Nb250aCA+IDAgJiYgbk1vbnRoIDw9IDEyKQorICAgICAgICAgICAgICAgIHNQYXJ0ICs9IGZ1bGxtb250aHNbbk1vbnRoIC0gMV07CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgaSArPSA0OworICAgICAgICAgICAgICBzUGFydCArPSBjOworICAgICAgICAgICAgICBzUGFydCArPSBjOworICAgICAgICAgICAgICBzUGFydCArPSBjOworICAgICAgICAgICAgICBzUGFydCArPSBjOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaSsrOworICAgICAgICAgIHNQYXJ0ICs9IGM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpKys7CisgICAgICAgIHNQYXJ0ICs9IGM7CisgICAgICAgIGJyZWFrOworICAgIH0KIAotCQlzUmV0ICs9IHNQYXJ0OwotCX0KKyAgICBzUmV0ICs9IHNQYXJ0OworICB9CiAKLQlyZXR1cm4gc1JldDsKKyAgcmV0dXJuIHNSZXQ7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8vZnVuY3Rpb24gQUZOdW1iZXJfRm9ybWF0KG5EZWMsIHNlcFN0eWxlLCBuZWdTdHlsZSwgY3VyclN0eWxlLCBzdHJDdXJyZW5jeSwgYkN1cnJlbmN5UHJlcGVuZCkKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTnVtYmVyX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQoteworLy8gZnVuY3Rpb24gQUZOdW1iZXJfRm9ybWF0KG5EZWMsIHNlcFN0eWxlLCBuZWdTdHlsZSwgY3VyclN0eWxlLCBzdHJDdXJyZW5jeSwKKy8vIGJDdXJyZW5jeVByZXBlbmQpCitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk51bWJlcl9Gb3JtYXQoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogI2lmIF9GWF9PU18gIT0gX0ZYX0FORFJPSURfCi0Jdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQlDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0JQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gNikgeworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLQlpZiAocGFyYW1zLnNpemUoKSAhPSA2KQotCXsKLQkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQlpZighcEV2ZW50LT5tX3BWYWx1ZSkKLQkJcmV0dXJuIEZBTFNFOwotCUNGWF9XaWRlU3RyaW5nJiBWYWx1ZSA9IHBFdmVudC0+VmFsdWUoKTsKLQlDRlhfQnl0ZVN0cmluZyBzdHJWYWx1ZSA9IFN0clRyaW0oQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKFZhbHVlKSk7CisgIENKU19SdW50aW1lKiBwUnVudGltZSA9IENKU19SdW50aW1lOjpGcm9tQ29udGV4dChjYyk7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKKyAgaWYgKCFwRXZlbnQtPm1fcFZhbHVlKQorICAgIHJldHVybiBGQUxTRTsKIAotCWlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpIHJldHVybiBUUlVFOworICBDRlhfV2lkZVN0cmluZyYgVmFsdWUgPSBwRXZlbnQtPlZhbHVlKCk7CisgIENGWF9CeXRlU3RyaW5nIHN0clZhbHVlID0gU3RyVHJpbShDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVmFsdWUpKTsKKyAgaWYgKHN0clZhbHVlLklzRW1wdHkoKSkKKyAgICByZXR1cm4gVFJVRTsKIAotCWludCBpRGVjID0gcGFyYW1zWzBdLlRvSW50KCk7Ci0JaW50IGlTZXBTdHlsZSA9IHBhcmFtc1sxXS5Ub0ludCgpOwotCWludCBpTmVnU3R5bGUgPSBwYXJhbXNbMl0uVG9JbnQoKTsKLQkvLyBwYXJhbXNbM10gaXMgaUN1cnJTdHlsZSwgaXQncyBub3QgdXNlZC4KLQlzdGQ6OndzdHJpbmcgd3N0ckN1cnJlbmN5KHBhcmFtc1s0XS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKLQlGWF9CT09MIGJDdXJyZW5jeVByZXBlbmQgPSBwYXJhbXNbNV0uVG9Cb29sKCk7CisgIGludCBpRGVjID0gcGFyYW1zWzBdLlRvSW50KCk7CisgIGludCBpU2VwU3R5bGUgPSBwYXJhbXNbMV0uVG9JbnQoKTsKKyAgaW50IGlOZWdTdHlsZSA9IHBhcmFtc1syXS5Ub0ludCgpOworICAvLyBwYXJhbXNbM10gaXMgaUN1cnJTdHlsZSwgaXQncyBub3QgdXNlZC4KKyAgc3RkOjp3c3RyaW5nIHdzdHJDdXJyZW5jeShwYXJhbXNbNF0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7CisgIEZYX0JPT0wgYkN1cnJlbmN5UHJlcGVuZCA9IHBhcmFtc1s1XS5Ub0Jvb2woKTsKIAotCWlmIChpRGVjIDwgMCkgaURlYyA9IC1pRGVjOworICBpZiAoaURlYyA8IDApCisgICAgaURlYyA9IC1pRGVjOwogCi0JaWYgKGlTZXBTdHlsZSA8IDAgfHwgaVNlcFN0eWxlID4gMykKLQkJaVNlcFN0eWxlID0gMDsKKyAgaWYgKGlTZXBTdHlsZSA8IDAgfHwgaVNlcFN0eWxlID4gMykKKyAgICBpU2VwU3R5bGUgPSAwOwogCi0JaWYgKGlOZWdTdHlsZSA8IDAgfHwgaU5lZ1N0eWxlID4gMykKLQkJaU5lZ1N0eWxlID0gMDsKKyAgaWYgKGlOZWdTdHlsZSA8IDAgfHwgaU5lZ1N0eWxlID4gMykKKyAgICBpTmVnU3R5bGUgPSAwOwogCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAvLyBmb3IgcHJvY2Vzc2luZyBkZWNpbWFsIHBsYWNlcworICBzdHJWYWx1ZS5SZXBsYWNlKCIsIiwgIi4iKTsKKyAgZG91YmxlIGRWYWx1ZSA9IGF0b2Yoc3RyVmFsdWUpOworICBpZiAoaURlYyA+IDApCisgICAgZFZhbHVlICs9IERPVUJMRV9DT1JSRUNUOwogCi0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy9mb3IgcHJvY2Vzc2luZyBkZWNpbWFsIHBsYWNlcwotCXN0clZhbHVlLlJlcGxhY2UoIiwiLCAiLiIpOwotCWRvdWJsZSBkVmFsdWUgPSBhdG9mKHN0clZhbHVlKTsKLQlpZiAoaURlYyA+IDApCi0JCWRWYWx1ZSArPSBET1VCTEVfQ09SUkVDVDsKKyAgaW50IGlEZWMyOworICBpbnQgaU5lZ2F0aXZlID0gMDsKIAotCWludCBpRGVjMjsKLQlGWF9CT09MIGJOZWdhdGl2ZSA9IEZBTFNFOworICBzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLCBpRGVjLCAmaURlYzIsICZpTmVnYXRpdmUpOworICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKSB7CisgICAgZFZhbHVlID0gMDsKKyAgICBzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLCBpRGVjLCAmaURlYzIsICZpTmVnYXRpdmUpOworICAgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpIHsKKyAgICAgIHN0clZhbHVlID0gIjAiOworICAgICAgaURlYzIgPSAxOworICAgIH0KKyAgfQogCi0Jc3RyVmFsdWUgPSBmY3Z0KGRWYWx1ZSxpRGVjLCZpRGVjMiwmYk5lZ2F0aXZlKTsKLQlpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQotCXsKLQkJZFZhbHVlID0gMDsKLQkJc3RyVmFsdWUgPSBmY3Z0KGRWYWx1ZSxpRGVjLCZpRGVjMiwmYk5lZ2F0aXZlKTsKLQkJaWYgKHN0clZhbHVlLklzRW1wdHkoKSkKLQkJewotCQkJc3RyVmFsdWUgPSAiMCI7Ci0JCQlpRGVjMiA9IDE7Ci0JCX0KKyAgaWYgKGlEZWMyIDwgMCkgeworICAgIGZvciAoaW50IGlOdW0gPSAwOyBpTnVtIDwgYWJzKGlEZWMyKTsgaU51bSsrKSB7CisgICAgICBzdHJWYWx1ZSA9ICIwIiArIHN0clZhbHVlOworICAgIH0KKyAgICBpRGVjMiA9IDA7CisgIH0KKyAgaW50IGlNYXggPSBzdHJWYWx1ZS5HZXRMZW5ndGgoKTsKKyAgaWYgKGlEZWMyID4gaU1heCkgeworICAgIGZvciAoaW50IGlOdW0gPSAwOyBpTnVtIDw9IGlEZWMyIC0gaU1heDsgaU51bSsrKSB7CisgICAgICBzdHJWYWx1ZSArPSAiMCI7CisgICAgfQorICAgIGlNYXggPSBpRGVjMiArIDE7CisgIH0KKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAvLyBmb3IgcHJvY2Vzc2luZyBzZXBlcmF0b3Igc3R5bGUKKyAgaWYgKGlEZWMyIDwgaU1heCkgeworICAgIGlmIChpU2VwU3R5bGUgPT0gMCB8fCBpU2VwU3R5bGUgPT0gMSkgeworICAgICAgc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnLicpOworICAgICAgaU1heCsrOworICAgIH0gZWxzZSBpZiAoaVNlcFN0eWxlID09IDIgfHwgaVNlcFN0eWxlID09IDMpIHsKKyAgICAgIHN0clZhbHVlLkluc2VydChpRGVjMiwgJywnKTsKKyAgICAgIGlNYXgrKzsKKyAgICB9CiAKLQl9CisgICAgaWYgKGlEZWMyID09IDApCisgICAgICBzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcwJyk7CisgIH0KKyAgaWYgKGlTZXBTdHlsZSA9PSAwIHx8IGlTZXBTdHlsZSA9PSAyKSB7CisgICAgY2hhciBjU2VwZXJhdG9yOworICAgIGlmIChpU2VwU3R5bGUgPT0gMCkKKyAgICAgIGNTZXBlcmF0b3IgPSAnLCc7CisgICAgZWxzZQorICAgICAgY1NlcGVyYXRvciA9ICcuJzsKIAotCWlmIChpRGVjMiA8IDApCi0JewotCQlmb3IgKGludCBpTnVtID0gMDtpTnVtIDwgYWJzKGlEZWMyKTtpTnVtKyspCi0JCXsKLQkJCXN0clZhbHVlID0gIjAiICsgc3RyVmFsdWU7Ci0JCX0KLQkJaURlYzIgPSAwOworICAgIGZvciAoaW50IGlEZWNQb3NpdGl2ZSA9IGlEZWMyIC0gMzsgaURlY1Bvc2l0aXZlID4gMDsgaURlY1Bvc2l0aXZlIC09IDMpIHsKKyAgICAgIHN0clZhbHVlLkluc2VydChpRGVjUG9zaXRpdmUsIGNTZXBlcmF0b3IpOworICAgICAgaU1heCsrOworICAgIH0KKyAgfQogCi0JfQotCWludCBpTWF4ID0gc3RyVmFsdWUuR2V0TGVuZ3RoKCk7Ci0JaWYgKGlEZWMyID4gaU1heCkKLQl7Ci0JCWZvciAoaW50IGlOdW0gPSAwO2lOdW0gPD0gaURlYzIgLSBpTWF4IDtpTnVtKyspCi0JCXsKLQkJCXN0clZhbHVlICs9ICIwIjsKLQkJfQotCQlpTWF4ID0gaURlYzIrMTsKLQl9Ci0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vZm9yIHByb2Nlc3Npbmcgc2VwZXJhdG9yIHN0eWxlCi0JaWYgKGlEZWMyIDwgaU1heCkKLQl7Ci0JCWlmIChpU2VwU3R5bGUgPT0gMCB8fCBpU2VwU3R5bGUgPT0gMSkKLQkJewotCQkJc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnLicpOwotCQkJaU1heCsrOwotCQl9Ci0JCWVsc2UgaWYgKGlTZXBTdHlsZSA9PSAyIHx8IGlTZXBTdHlsZSA9PSAzKQotCQl7Ci0JCQlzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcsJyk7Ci0JCQlpTWF4Kys7Ci0JCX0KKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAvLyBmb3IgcHJvY2Vzc2luZyBjdXJyZW5jeSBzdHJpbmcKIAotCQlpZiAoaURlYzIgPT0gMCkKLQkJCXN0clZhbHVlLkluc2VydChpRGVjMiwgJzAnKTsKLQl9Ci0JaWYgKGlTZXBTdHlsZSA9PSAwIHx8IGlTZXBTdHlsZSA9PSAyKQotCXsKLQkJY2hhciBjU2VwZXJhdG9yOwotCQlpZiAoaVNlcFN0eWxlID09IDApCi0JCQljU2VwZXJhdG9yID0gJywnOwotCQllbHNlCi0JCQljU2VwZXJhdG9yID0gJy4nOworICBWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3RyVmFsdWUpOworICBzdGQ6OndzdHJpbmcgc3RyVmFsdWUyID0gVmFsdWUuY19zdHIoKTsKIAotCQlpbnQgaURlY1Bvc2l0aXZlOwotCQlpRGVjUG9zaXRpdmUgPSBpRGVjMjsKKyAgaWYgKGJDdXJyZW5jeVByZXBlbmQpCisgICAgc3RyVmFsdWUyID0gd3N0ckN1cnJlbmN5ICsgc3RyVmFsdWUyOworICBlbHNlCisgICAgc3RyVmFsdWUyID0gc3RyVmFsdWUyICsgd3N0ckN1cnJlbmN5OwogCi0JCWZvciAoaURlY1Bvc2l0aXZlID0gaURlYzIgLTM7IGlEZWNQb3NpdGl2ZSA+IDA7aURlY1Bvc2l0aXZlIC09IDMpCi0JCXsKLQkJCXN0clZhbHVlLkluc2VydChpRGVjUG9zaXRpdmUsIGNTZXBlcmF0b3IpOwotCQkJaU1heCsrOwotCQl9Ci0JfQorICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgIC8vIGZvciBwcm9jZXNzaW5nIG5lZ2F0aXZlIHN0eWxlCisgIGlmIChpTmVnYXRpdmUpIHsKKyAgICBpZiAoaU5lZ1N0eWxlID09IDApIHsKKyAgICAgIHN0clZhbHVlMi5pbnNlcnQoMCwgTCItIik7CisgICAgfQorICAgIGlmIChpTmVnU3R5bGUgPT0gMiB8fCBpTmVnU3R5bGUgPT0gMykgeworICAgICAgc3RyVmFsdWUyLmluc2VydCgwLCBMIigiKTsKKyAgICAgIHN0clZhbHVlMi5pbnNlcnQoc3RyVmFsdWUyLmxlbmd0aCgpLCBMIikiKTsKKyAgICB9CisgICAgaWYgKGlOZWdTdHlsZSA9PSAxIHx8IGlOZWdTdHlsZSA9PSAzKSB7CisgICAgICBpZiAoRmllbGQqIGZUYXJnZXQgPSBwRXZlbnQtPlRhcmdldF9GaWVsZCgpKSB7CisgICAgICAgIENKU19BcnJheSBhckNvbG9yKHBSdW50aW1lKTsKKyAgICAgICAgQ0pTX1ZhbHVlIHZDb2xFbG0ocFJ1bnRpbWUpOworICAgICAgICB2Q29sRWxtID0gTCJSR0IiOworICAgICAgICBhckNvbG9yLlNldEVsZW1lbnQoMCwgdkNvbEVsbSk7CisgICAgICAgIHZDb2xFbG0gPSAxOworICAgICAgICBhckNvbG9yLlNldEVsZW1lbnQoMSwgdkNvbEVsbSk7CisgICAgICAgIHZDb2xFbG0gPSAwOworICAgICAgICBhckNvbG9yLlNldEVsZW1lbnQoMiwgdkNvbEVsbSk7CiAKLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy9mb3IgcHJvY2Vzc2luZyBjdXJyZW5jeSBzdHJpbmcKKyAgICAgICAgYXJDb2xvci5TZXRFbGVtZW50KDMsIHZDb2xFbG0pOwogCi0JVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHN0clZhbHVlKTsKLQlzdGQ6OndzdHJpbmcgc3RyVmFsdWUyID0gVmFsdWUuY19zdHIoKTsKKyAgICAgICAgQ0pTX1Byb3BWYWx1ZSB2UHJvcChwUnVudGltZSk7CisgICAgICAgIHZQcm9wLlN0YXJ0R2V0dGluZygpOworICAgICAgICB2UHJvcCA8PCBhckNvbG9yOworICAgICAgICB2UHJvcC5TdGFydFNldHRpbmcoKTsKKyAgICAgICAgZlRhcmdldC0+dGV4dENvbG9yKGNjLCB2UHJvcCwgc0Vycm9yKTsgIC8vIHJlZAorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoaU5lZ1N0eWxlID09IDEgfHwgaU5lZ1N0eWxlID09IDMpIHsKKyAgICAgIGlmIChGaWVsZCogZlRhcmdldCA9IHBFdmVudC0+VGFyZ2V0X0ZpZWxkKCkpIHsKKyAgICAgICAgQ0pTX0FycmF5IGFyQ29sb3IocFJ1bnRpbWUpOworICAgICAgICBDSlNfVmFsdWUgdkNvbEVsbShwUnVudGltZSk7CisgICAgICAgIHZDb2xFbG0gPSBMIlJHQiI7CisgICAgICAgIGFyQ29sb3IuU2V0RWxlbWVudCgwLCB2Q29sRWxtKTsKKyAgICAgICAgdkNvbEVsbSA9IDA7CisgICAgICAgIGFyQ29sb3IuU2V0RWxlbWVudCgxLCB2Q29sRWxtKTsKKyAgICAgICAgYXJDb2xvci5TZXRFbGVtZW50KDIsIHZDb2xFbG0pOworICAgICAgICBhckNvbG9yLlNldEVsZW1lbnQoMywgdkNvbEVsbSk7CiAKLQlpZiAoYkN1cnJlbmN5UHJlcGVuZCkKLQkJc3RyVmFsdWUyID0gd3N0ckN1cnJlbmN5ICsgc3RyVmFsdWUyOwotCWVsc2UKLQkJc3RyVmFsdWUyID0gc3RyVmFsdWUyICsgd3N0ckN1cnJlbmN5OworICAgICAgICBDSlNfUHJvcFZhbHVlIHZQcm9wKHBSdW50aW1lKTsKKyAgICAgICAgdlByb3AuU3RhcnRHZXR0aW5nKCk7CisgICAgICAgIGZUYXJnZXQtPnRleHRDb2xvcihjYywgdlByb3AsIHNFcnJvcik7CiAKKyAgICAgICAgQ0pTX0FycmF5IGFQcm9wKHBSdW50aW1lKTsKKyAgICAgICAgdlByb3AuQ29udmVydFRvQXJyYXkoYVByb3ApOwogCisgICAgICAgIENQV0xfQ29sb3IgY3JQcm9wOworICAgICAgICBDUFdMX0NvbG9yIGNyQ29sb3I7CisgICAgICAgIGNvbG9yOjpDb252ZXJ0QXJyYXlUb1BXTENvbG9yKGFQcm9wLCBjclByb3ApOworICAgICAgICBjb2xvcjo6Q29udmVydEFycmF5VG9QV0xDb2xvcihhckNvbG9yLCBjckNvbG9yKTsKIAotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkvL2ZvciBwcm9jZXNzaW5nIG5lZ2F0aXZlIHN0eWxlCi0JaWYgKGJOZWdhdGl2ZSkKLQl7Ci0JCWlmIChpTmVnU3R5bGUgPT0gMCkKLQkJewotCQkJc3RyVmFsdWUyLmluc2VydCgwLEwiLSIpOwotCQl9Ci0JCWlmIChpTmVnU3R5bGUgPT0gMiB8fCBpTmVnU3R5bGUgPT0gMykKLQkJewotCQkJc3RyVmFsdWUyLmluc2VydCgwLEwiKCIpOwotCQkJc3RyVmFsdWUyLmluc2VydChzdHJWYWx1ZTIubGVuZ3RoKCksTCIpIik7Ci0JCX0KLQkJaWYgKGlOZWdTdHlsZSA9PSAxIHx8IGlOZWdTdHlsZSA9PSAzKQotCQl7Ci0JCQlpZiAoRmllbGQgKiBmVGFyZ2V0ID0gcEV2ZW50LT5UYXJnZXRfRmllbGQoKSkKLQkJCXsKLQkJCQlDSlNfQXJyYXkgYXJDb2xvcihpc29sYXRlKTsKLQkJCQlDSlNfVmFsdWUgdkNvbEVsbShpc29sYXRlKTsKLQkJCQl2Q29sRWxtID0gTCJSR0IiOwotCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgwLHZDb2xFbG0pOwotCQkJCXZDb2xFbG0gPSAxOwotCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgxLHZDb2xFbG0pOwotCQkJCXZDb2xFbG0gPSAwOwotCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgyLHZDb2xFbG0pOwotCi0JCQkJYXJDb2xvci5TZXRFbGVtZW50KDMsdkNvbEVsbSk7Ci0KLQkJCQlDSlNfUHJvcFZhbHVlIHZQcm9wKGlzb2xhdGUpOwotCQkJCXZQcm9wLlN0YXJ0R2V0dGluZygpOwotCQkJCXZQcm9wPDxhckNvbG9yOwotCQkJCXZQcm9wLlN0YXJ0U2V0dGluZygpOwotCQkJCWZUYXJnZXQtPnRleHRDb2xvcihjYyx2UHJvcCxzRXJyb3IpOy8vIHJlZAotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChpTmVnU3R5bGUgPT0gMSB8fCBpTmVnU3R5bGUgPT0gMykKLQkJewotCQkJaWYgKEZpZWxkICpmVGFyZ2V0ID0gcEV2ZW50LT5UYXJnZXRfRmllbGQoKSkKLQkJCXsKLQkJCQlDSlNfQXJyYXkgYXJDb2xvcihpc29sYXRlKTsKLQkJCQlDSlNfVmFsdWUgdkNvbEVsbShpc29sYXRlKTsKLQkJCQl2Q29sRWxtID0gTCJSR0IiOwotCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgwLHZDb2xFbG0pOwotCQkJCXZDb2xFbG0gPSAwOwotCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgxLHZDb2xFbG0pOwotCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgyLHZDb2xFbG0pOwotCQkJCWFyQ29sb3IuU2V0RWxlbWVudCgzLHZDb2xFbG0pOwotCi0JCQkJQ0pTX1Byb3BWYWx1ZSB2UHJvcChpc29sYXRlKTsKLQkJCQl2UHJvcC5TdGFydEdldHRpbmcoKTsKLQkJCQlmVGFyZ2V0LT50ZXh0Q29sb3IoY2MsdlByb3Asc0Vycm9yKTsKLQotCQkJCUNKU19BcnJheSBhUHJvcChpc29sYXRlKTsKLQkJCQl2UHJvcC5Db252ZXJ0VG9BcnJheShhUHJvcCk7Ci0KLQkJCQlDUFdMX0NvbG9yIGNyUHJvcDsKLQkJCQlDUFdMX0NvbG9yIGNyQ29sb3I7Ci0JCQkJY29sb3I6OkNvbnZlcnRBcnJheVRvUFdMQ29sb3IoYVByb3AsIGNyUHJvcCk7Ci0JCQkJY29sb3I6OkNvbnZlcnRBcnJheVRvUFdMQ29sb3IoYXJDb2xvciwgY3JDb2xvcik7Ci0KLQkJCQlpZiAoY3JDb2xvciAhPSBjclByb3ApCi0JCQkJewotCQkJCQlDSlNfUHJvcFZhbHVlIHZQcm9wMihpc29sYXRlKTsKLQkJCQkJdlByb3AyLlN0YXJ0R2V0dGluZygpOwotCQkJCQl2UHJvcDI8PGFyQ29sb3I7Ci0JCQkJCXZQcm9wMi5TdGFydFNldHRpbmcoKTsKLSAgICAgCQkJCWZUYXJnZXQtPnRleHRDb2xvcihjYyx2UHJvcDIsc0Vycm9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JVmFsdWUgPSBzdHJWYWx1ZTIuY19zdHIoKTsKKyAgICAgICAgaWYgKGNyQ29sb3IgIT0gY3JQcm9wKSB7CisgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSB2UHJvcDIocFJ1bnRpbWUpOworICAgICAgICAgIHZQcm9wMi5TdGFydEdldHRpbmcoKTsKKyAgICAgICAgICB2UHJvcDIgPDwgYXJDb2xvcjsKKyAgICAgICAgICB2UHJvcDIuU3RhcnRTZXR0aW5nKCk7CisgICAgICAgICAgZlRhcmdldC0+dGV4dENvbG9yKGNjLCB2UHJvcDIsIHNFcnJvcik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgVmFsdWUgPSBzdHJWYWx1ZTIuY19zdHIoKTsKICNlbmRpZgotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotLy9mdW5jdGlvbiBBRk51bWJlcl9LZXlzdHJva2UobkRlYywgc2VwU3R5bGUsIG5lZ1N0eWxlLCBjdXJyU3R5bGUsIHN0ckN1cnJlbmN5LCBiQ3VycmVuY3lQcmVwZW5kKQotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZOdW1iZXJfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKLQlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOworLy8gZnVuY3Rpb24gQUZOdW1iZXJfS2V5c3Ryb2tlKG5EZWMsIHNlcFN0eWxlLCBuZWdTdHlsZSwgY3VyclN0eWxlLCBzdHJDdXJyZW5jeSwKKy8vIGJDdXJyZW5jeVByZXBlbmQpCitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk51bWJlcl9LZXlzdHJva2UoCisgICAgSUpTX0NvbnRleHQqIGNjLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CiAKLQlpZihwYXJhbXMuc2l6ZSgpIDwgMikKLQkJcmV0dXJuIEZBTFNFOwotCWludCBpU2VwU3R5bGUgPSBwYXJhbXNbMV0uVG9JbnQoKTsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPCAyKQorICAgIHJldHVybiBGQUxTRTsKKyAgaW50IGlTZXBTdHlsZSA9IHBhcmFtc1sxXS5Ub0ludCgpOwogCi0JaWYgKGlTZXBTdHlsZSA8IDAgfHwgaVNlcFN0eWxlID4gMykKLQkJaVNlcFN0eWxlID0gMDsKLQlpZighcEV2ZW50LT5tX3BWYWx1ZSkKLQkJcmV0dXJuIEZBTFNFOwotCUNGWF9XaWRlU3RyaW5nICYgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOwotCUNGWF9XaWRlU3RyaW5nICYgd19zdHJDaGFuZ2UgPSBwRXZlbnQtPkNoYW5nZSgpOwotICAgIENGWF9XaWRlU3RyaW5nIHdfc3RyVmFsdWUgPSB2YWw7CisgIGlmIChpU2VwU3R5bGUgPCAwIHx8IGlTZXBTdHlsZSA+IDMpCisgICAgaVNlcFN0eWxlID0gMDsKKyAgaWYgKCFwRXZlbnQtPm1fcFZhbHVlKQorICAgIHJldHVybiBGQUxTRTsKKyAgQ0ZYX1dpZGVTdHJpbmcmIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsKKyAgQ0ZYX1dpZGVTdHJpbmcmIHdfc3RyQ2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgd19zdHJWYWx1ZSA9IHZhbDsKIAotCWlmIChwRXZlbnQtPldpbGxDb21taXQoKSkKLQl7Ci0JCUNGWF9XaWRlU3RyaW5nIHdzdHJDaGFuZ2UgPSB3X3N0ckNoYW5nZTsKLQkJQ0ZYX1dpZGVTdHJpbmcgd3N0clZhbHVlID0gU3RyTFRyaW0od19zdHJWYWx1ZS5jX3N0cigpKTsKLQkJaWYgKHdzdHJWYWx1ZS5Jc0VtcHR5KCkpCi0JCQlyZXR1cm4gVFJVRTsKKyAgaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKSB7CisgICAgQ0ZYX1dpZGVTdHJpbmcgd3N0ckNoYW5nZSA9IHdfc3RyQ2hhbmdlOworICAgIENGWF9XaWRlU3RyaW5nIHdzdHJWYWx1ZSA9IFN0ckxUcmltKHdfc3RyVmFsdWUuY19zdHIoKSk7CisgICAgaWYgKHdzdHJWYWx1ZS5Jc0VtcHR5KCkpCisgICAgICByZXR1cm4gVFJVRTsKIAotCQlDRlhfV2lkZVN0cmluZyBzd1RlbXAgPSB3c3RyVmFsdWU7Ci0JCXN3VGVtcC5SZXBsYWNlKEwiLCIsIEwiLiIpOwotCQlpZiAoIUlzTnVtYmVyKHN3VGVtcC5jX3N0cigpKSkKLQkJewotCQkJcEV2ZW50LT5SYygpID0gRkFMU0U7Ci0JCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU0FGTlVNQkVSX0tFWVNUUk9LRSk7Ci0JCQlBbGVydChwQ29udGV4dCwgc0Vycm9yLmNfc3RyKCkpOwotCQkJcmV0dXJuIFRSVUU7Ci0JCX0KLQkJcmV0dXJuIFRSVUU7IC8vIGl0IGhhcHBlbnMgYWZ0ZXIgdGhlIGxhc3Qga2V5c3Ryb2tlIGFuZCBiZWZvcmUgdmFsaWRhdGluZywKLQl9CisgICAgQ0ZYX1dpZGVTdHJpbmcgc3dUZW1wID0gd3N0clZhbHVlOworICAgIHN3VGVtcC5SZXBsYWNlKEwiLCIsIEwiLiIpOworICAgIGlmICghSXNOdW1iZXIoc3dUZW1wLmNfc3RyKCkpKSB7CisgICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKKyAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTQUZOVU1CRVJfS0VZU1RST0tFKTsKKyAgICAgIEFsZXJ0KHBDb250ZXh0LCBzRXJyb3IuY19zdHIoKSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7ICAvLyBpdCBoYXBwZW5zIGFmdGVyIHRoZSBsYXN0IGtleXN0cm9rZSBhbmQgYmVmb3JlIHZhbGlkYXRpbmcsCisgIH0KIAotCXN0ZDo6d3N0cmluZyB3X3N0clZhbHVlMiA9IHdfc3RyVmFsdWUuY19zdHIoKTsKLQlzdGQ6OndzdHJpbmcgd19zdHJDaGFuZ2UyID0gd19zdHJDaGFuZ2UuY19zdHIoKTsKLQlzdGQ6OndzdHJpbmcgd19zdHJTZWxlY3RlZDsKLQlpZigtMSAhPSBwRXZlbnQtPlNlbFN0YXJ0KCkpCi0JCXdfc3RyU2VsZWN0ZWQgPSB3X3N0clZhbHVlMi5zdWJzdHIocEV2ZW50LT5TZWxTdGFydCgpLChwRXZlbnQtPlNlbEVuZCgpIC0gcEV2ZW50LT5TZWxTdGFydCgpKSk7Ci0JRlhfQk9PTCBiSGFzU2lnbiA9ICh3X3N0clZhbHVlMi5maW5kKCctJykgIT0gLTEpICYmICh3X3N0clNlbGVjdGVkLmZpbmQoJy0nKSA9PSAtMSk7Ci0JaWYgKGJIYXNTaWduKQotCXsKLQkJLy9jYW4ndCBpbnNlcnQgImNoYW5nZSIgaW4gZnJvbnQgdG8gc2lnbiBwb3N0aW9uLgotCQlpZiAocEV2ZW50LT5TZWxTdGFydCgpID09IDApCi0JCXsKLSAgICAgICAgICAgIEZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKLQkJCWJSYyA9IEZBTFNFOwotCQkJcmV0dXJuIFRSVUU7Ci0JCX0KLQl9CisgIHN0ZDo6d3N0cmluZyB3X3N0clZhbHVlMiA9IHdfc3RyVmFsdWUuY19zdHIoKTsKKyAgc3RkOjp3c3RyaW5nIHdfc3RyQ2hhbmdlMiA9IHdfc3RyQ2hhbmdlLmNfc3RyKCk7CisgIHN0ZDo6d3N0cmluZyB3X3N0clNlbGVjdGVkOworICBpZiAoLTEgIT0gcEV2ZW50LT5TZWxTdGFydCgpKQorICAgIHdfc3RyU2VsZWN0ZWQgPSB3X3N0clZhbHVlMi5zdWJzdHIocEV2ZW50LT5TZWxTdGFydCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBFdmVudC0+U2VsRW5kKCkgLSBwRXZlbnQtPlNlbFN0YXJ0KCkpKTsKKyAgYm9vbCBiSGFzU2lnbiA9ICh3X3N0clZhbHVlMi5maW5kKCctJykgIT0gc3RkOjp3c3RyaW5nOjpucG9zKSAmJgorICAgICAgICAgICAgICAgICAgKHdfc3RyU2VsZWN0ZWQuZmluZCgnLScpID09IHN0ZDo6d3N0cmluZzo6bnBvcyk7CisgIGlmIChiSGFzU2lnbikgeworICAgIC8vIGNhbid0IGluc2VydCAiY2hhbmdlIiBpbiBmcm9udCB0byBzaWduIHBvc3Rpb24uCisgICAgaWYgKHBFdmVudC0+U2VsU3RhcnQoKSA9PSAwKSB7CisgICAgICBGWF9CT09MJiBiUmMgPSBwRXZlbnQtPlJjKCk7CisgICAgICBiUmMgPSBGQUxTRTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQogCi0JY2hhciBjU2VwID0gTCcuJzsKKyAgY2hhciBjU2VwID0gTCcuJzsKIAotCXN3aXRjaCAoaVNlcFN0eWxlKQotCXsKLQljYXNlIDA6Ci0JY2FzZSAxOgotCQljU2VwID0gTCcuJzsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCWNhc2UgMzoKLQkJY1NlcCA9IEwnLCc7Ci0JCWJyZWFrOwotCX0KKyAgc3dpdGNoIChpU2VwU3R5bGUpIHsKKyAgICBjYXNlIDA6CisgICAgY2FzZSAxOgorICAgICAgY1NlcCA9IEwnLic7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgY2FzZSAzOgorICAgICAgY1NlcCA9IEwnLCc7CisgICAgICBicmVhazsKKyAgfQogCi0JRlhfQk9PTCBiSGFzU2VwID0gKHdfc3RyVmFsdWUyLmZpbmQoY1NlcCkgIT0gLTEpOwotCWZvciAoc3RkOjp3c3RyaW5nOjppdGVyYXRvciBpdCA9IHdfc3RyQ2hhbmdlMi5iZWdpbigpOyBpdCAhPSB3X3N0ckNoYW5nZTIuZW5kKCk7IGl0KyspCi0JewotCQlpZiAoKml0ID09IGNTZXApCi0JCXsKLQkJCWlmIChiSGFzU2VwKQotCQkJewotCQkJCUZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKLQkJCQliUmMgPSBGQUxTRTsKLQkJCQlyZXR1cm4gVFJVRTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQliSGFzU2VwID0gVFJVRTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCQlpZiAoKml0ID09IEwnLScpCi0JCXsKLQkJCWlmIChiSGFzU2lnbikKLQkJCXsKLQkJCQlGWF9CT09MICZiUmMgPSBwRXZlbnQtPlJjKCk7Ci0JCQkJYlJjID0gRkFMU0U7Ci0JCQkJcmV0dXJuIFRSVUU7Ci0JCQl9Ci0JCQllbHNlIGlmIChpdCAhPSB3X3N0ckNoYW5nZTIuYmVnaW4oKSkgLy9zaWduJ3MgcG9zaXRpb24gaXMgbm90IGNvcnJlY3QKLQkJCXsKLQkJCQlGWF9CT09MICZiUmMgPSBwRXZlbnQtPlJjKCk7Ci0JCQkJYlJjID0gRkFMU0U7Ci0JCQkJcmV0dXJuIFRSVUU7Ci0JCQl9Ci0JCQllbHNlIGlmIChwRXZlbnQtPlNlbFN0YXJ0KCkgIT0gMCkKLQkJCXsKLQkJCQlGWF9CT09MICZiUmMgPSBwRXZlbnQtPlJjKCk7Ci0JCQkJYlJjID0gRkFMU0U7Ci0JCQkJcmV0dXJuIFRSVUU7Ci0JCQl9Ci0JCQliSGFzU2lnbiA9IFRSVUU7Ci0JCQljb250aW51ZTsKLQkJfQorICBib29sIGJIYXNTZXAgPSAod19zdHJWYWx1ZTIuZmluZChjU2VwKSAhPSBzdGQ6OndzdHJpbmc6Om5wb3MpOworICBmb3IgKHN0ZDo6d3N0cmluZzo6aXRlcmF0b3IgaXQgPSB3X3N0ckNoYW5nZTIuYmVnaW4oKTsKKyAgICAgICBpdCAhPSB3X3N0ckNoYW5nZTIuZW5kKCk7IGl0KyspIHsKKyAgICBpZiAoKml0ID09IGNTZXApIHsKKyAgICAgIGlmIChiSGFzU2VwKSB7CisgICAgICAgIEZYX0JPT0wmIGJSYyA9IHBFdmVudC0+UmMoKTsKKyAgICAgICAgYlJjID0gRkFMU0U7CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQorICAgICAgYkhhc1NlcCA9IFRSVUU7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKCppdCA9PSBMJy0nKSB7CisgICAgICBpZiAoYkhhc1NpZ24pIHsKKyAgICAgICAgRlhfQk9PTCYgYlJjID0gcEV2ZW50LT5SYygpOworICAgICAgICBiUmMgPSBGQUxTRTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICB9CisgICAgICAvLyBzaWduJ3MgcG9zaXRpb24gaXMgbm90IGNvcnJlY3QKKyAgICAgIGlmIChpdCAhPSB3X3N0ckNoYW5nZTIuYmVnaW4oKSkgeworICAgICAgICBGWF9CT09MJiBiUmMgPSBwRXZlbnQtPlJjKCk7CisgICAgICAgIGJSYyA9IEZBTFNFOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgICAgIGlmIChwRXZlbnQtPlNlbFN0YXJ0KCkgIT0gMCkgeworICAgICAgICBGWF9CT09MJiBiUmMgPSBwRXZlbnQtPlJjKCk7CisgICAgICAgIGJSYyA9IEZBTFNFOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgICAgIGJIYXNTaWduID0gVFJVRTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KIAotCQlpZiAoIUlzRGlnaXQoKml0KSkKLQkJewotCQkJRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOwotCQkJYlJjID0gRkFMU0U7Ci0JCQlyZXR1cm4gVFJVRTsKLQkJfQotCX0KKyAgICBpZiAoIUZYU1lTX2lzd2RpZ2l0KCppdCkpIHsKKyAgICAgIEZYX0JPT0wmIGJSYyA9IHBFdmVudC0+UmMoKTsKKyAgICAgIGJSYyA9IEZBTFNFOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CiAKLQotCXN0ZDo6d3N0cmluZyB3X3ByZWZpeCA9IHdfc3RyVmFsdWUyLnN1YnN0cigwLHBFdmVudC0+U2VsU3RhcnQoKSk7Ci0Jc3RkOjp3c3RyaW5nIHdfcG9zdGZpeDsKLQlpZiAocEV2ZW50LT5TZWxFbmQoKTwoaW50KXdfc3RyVmFsdWUyLmxlbmd0aCgpKQotCQl3X3Bvc3RmaXggID0gd19zdHJWYWx1ZTIuc3Vic3RyKHBFdmVudC0+U2VsRW5kKCkpOwotCXdfc3RyVmFsdWUyID0gd19wcmVmaXggKyB3X3N0ckNoYW5nZTIgKyB3X3Bvc3RmaXg7Ci0Jd19zdHJWYWx1ZSA9IHdfc3RyVmFsdWUyLmNfc3RyKCk7Ci0JdmFsID0gd19zdHJWYWx1ZTsKLQlyZXR1cm4gVFJVRTsKLQorICBzdGQ6OndzdHJpbmcgd19wcmVmaXggPSB3X3N0clZhbHVlMi5zdWJzdHIoMCwgcEV2ZW50LT5TZWxTdGFydCgpKTsKKyAgc3RkOjp3c3RyaW5nIHdfcG9zdGZpeDsKKyAgaWYgKHBFdmVudC0+U2VsRW5kKCkgPCAoaW50KXdfc3RyVmFsdWUyLmxlbmd0aCgpKQorICAgIHdfcG9zdGZpeCA9IHdfc3RyVmFsdWUyLnN1YnN0cihwRXZlbnQtPlNlbEVuZCgpKTsKKyAgd19zdHJWYWx1ZTIgPSB3X3ByZWZpeCArIHdfc3RyQ2hhbmdlMiArIHdfcG9zdGZpeDsKKyAgd19zdHJWYWx1ZSA9IHdfc3RyVmFsdWUyLmNfc3RyKCk7CisgIHZhbCA9IHdfc3RyVmFsdWU7CisgIHJldHVybiBUUlVFOwogfQogCi0vL2Z1bmN0aW9uIEFGUGVyY2VudF9Gb3JtYXQobkRlYywgc2VwU3R5bGUpCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlBlcmNlbnRfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17CisvLyBmdW5jdGlvbiBBRlBlcmNlbnRfRm9ybWF0KG5EZWMsIHNlcFN0eWxlKQorRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZQZXJjZW50X0Zvcm1hdCgKKyAgICBJSlNfQ29udGV4dCogY2MsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAjaWYgX0ZYX09TXyAhPSBfRlhfQU5EUk9JRF8KLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKLQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0JQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwotCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKIAotICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpCi0JewotCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCWlmKCFwRXZlbnQtPm1fcFZhbHVlKQotCQlyZXR1cm4gRkFMU0U7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpIHsKKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoIXBFdmVudC0+bV9wVmFsdWUpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwotCUNGWF9CeXRlU3RyaW5nIHN0clZhbHVlID0gU3RyVHJpbShDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVmFsdWUpKTsKLQlpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQotCQlyZXR1cm4gVFJVRTsKKyAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOworICBDRlhfQnl0ZVN0cmluZyBzdHJWYWx1ZSA9IFN0clRyaW0oQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKFZhbHVlKSk7CisgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIFRSVUU7CiAKLQlpbnQgaURlYyA9IHBhcmFtc1swXS5Ub0ludCgpOwotCWlmIChpRGVjIDwgMCkKLQkJaURlYyA9IC1pRGVjOworICBpbnQgaURlYyA9IHBhcmFtc1swXS5Ub0ludCgpOworICBpZiAoaURlYyA8IDApCisgICAgaURlYyA9IC1pRGVjOwogCi0JaW50IGlTZXBTdHlsZSA9IHBhcmFtc1sxXS5Ub0ludCgpOwotCWlmIChpU2VwU3R5bGUgPCAwIHx8IGlTZXBTdHlsZSA+IDMpCi0JCWlTZXBTdHlsZSA9IDA7CisgIGludCBpU2VwU3R5bGUgPSBwYXJhbXNbMV0uVG9JbnQoKTsKKyAgaWYgKGlTZXBTdHlsZSA8IDAgfHwgaVNlcFN0eWxlID4gMykKKyAgICBpU2VwU3R5bGUgPSAwOwogCi0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy9mb3IgcHJvY2Vzc2luZyBkZWNpbWFsIHBsYWNlcwotCWRvdWJsZSBkVmFsdWUgPSBhdG9mKHN0clZhbHVlKTsKLQlkVmFsdWUgKj0gMTAwOwotCWlmIChpRGVjID4gMCkKLQkJZFZhbHVlICs9IERPVUJMRV9DT1JSRUNUOy8v0KPV/QorICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgLy8gZm9yIHByb2Nlc3NpbmcgZGVjaW1hbCBwbGFjZXMKKyAgZG91YmxlIGRWYWx1ZSA9IGF0b2Yoc3RyVmFsdWUpOworICBkVmFsdWUgKj0gMTAwOworICBpZiAoaURlYyA+IDApCisgICAgZFZhbHVlICs9IERPVUJMRV9DT1JSRUNUOwogCi0JaW50IGlEZWMyOwotCUZYX0JPT0wgYk5lZ2F0aXZlID0gRkFMU0U7Ci0Jc3RyVmFsdWUgPSBmY3Z0KGRWYWx1ZSxpRGVjLCZpRGVjMiwmYk5lZ2F0aXZlKTsKKyAgaW50IGlEZWMyOworICBpbnQgaU5lZ2F0aXZlID0gMDsKKyAgc3RyVmFsdWUgPSBmY3Z0KGRWYWx1ZSwgaURlYywgJmlEZWMyLCAmaU5lZ2F0aXZlKTsKKyAgaWYgKHN0clZhbHVlLklzRW1wdHkoKSkgeworICAgIGRWYWx1ZSA9IDA7CisgICAgc3RyVmFsdWUgPSBmY3Z0KGRWYWx1ZSwgaURlYywgJmlEZWMyLCAmaU5lZ2F0aXZlKTsKKyAgfQorCisgIGlmIChpRGVjMiA8IDApIHsKKyAgICBmb3IgKGludCBpTnVtID0gMDsgaU51bSA8IGFicyhpRGVjMik7IGlOdW0rKykgeworICAgICAgc3RyVmFsdWUgPSAiMCIgKyBzdHJWYWx1ZTsKKyAgICB9CisgICAgaURlYzIgPSAwOworICB9CisgIGludCBpTWF4ID0gc3RyVmFsdWUuR2V0TGVuZ3RoKCk7CisgIGlmIChpRGVjMiA+IGlNYXgpIHsKKyAgICBmb3IgKGludCBpTnVtID0gMDsgaU51bSA8PSBpRGVjMiAtIGlNYXg7IGlOdW0rKykgeworICAgICAgc3RyVmFsdWUgKz0gIjAiOworICAgIH0KKyAgICBpTWF4ID0gaURlYzIgKyAxOworICB9CisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgLy8gZm9yIHByb2Nlc3Npbmcgc2VwZXJhdG9yIHN0eWxlCisgIGlmIChpRGVjMiA8IGlNYXgpIHsKKyAgICBpZiAoaVNlcFN0eWxlID09IDAgfHwgaVNlcFN0eWxlID09IDEpIHsKKyAgICAgIHN0clZhbHVlLkluc2VydChpRGVjMiwgJy4nKTsKKyAgICAgIGlNYXgrKzsKKyAgICB9IGVsc2UgaWYgKGlTZXBTdHlsZSA9PSAyIHx8IGlTZXBTdHlsZSA9PSAzKSB7CisgICAgICBzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcsJyk7CisgICAgICBpTWF4Kys7CisgICAgfQorCisgICAgaWYgKGlEZWMyID09IDApCisgICAgICBzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcwJyk7CisgIH0KKyAgaWYgKGlTZXBTdHlsZSA9PSAwIHx8IGlTZXBTdHlsZSA9PSAyKSB7CisgICAgY2hhciBjU2VwZXJhdG9yOworICAgIGlmIChpU2VwU3R5bGUgPT0gMCkKKyAgICAgIGNTZXBlcmF0b3IgPSAnLCc7CisgICAgZWxzZQorICAgICAgY1NlcGVyYXRvciA9ICcuJzsKKworICAgIGZvciAoaW50IGlEZWNQb3NpdGl2ZSA9IGlEZWMyIC0gMzsgaURlY1Bvc2l0aXZlID4gMDsgaURlY1Bvc2l0aXZlIC09IDMpIHsKKyAgICAgIHN0clZhbHVlLkluc2VydChpRGVjUG9zaXRpdmUsIGNTZXBlcmF0b3IpOworICAgICAgaU1heCsrOworICAgIH0KKyAgfQorICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAvLyBuZWdhdGl2ZSBtYXJrCisgIGlmIChpTmVnYXRpdmUpCisgICAgc3RyVmFsdWUgPSAiLSIgKyBzdHJWYWx1ZTsKKyAgc3RyVmFsdWUgKz0gIiUiOworICBWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3RyVmFsdWUpOworI2VuZGlmCisgIHJldHVybiBUUlVFOworfQorLy8gQUZQZXJjZW50X0tleXN0cm9rZShuRGVjLCBzZXBTdHlsZSkKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGUGVyY2VudF9LZXlzdHJva2UoCisgICAgSUpTX0NvbnRleHQqIGNjLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gQUZOdW1iZXJfS2V5c3Ryb2tlKGNjLCBwYXJhbXMsIHZSZXQsIHNFcnJvcik7Cit9CisKKy8vIGZ1bmN0aW9uIEFGRGF0ZV9Gb3JtYXRFeChjRm9ybWF0KQorRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0Zvcm1hdEV4KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOworCisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoIXBFdmVudC0+bV9wVmFsdWUpCisgICAgcmV0dXJuIEZBTFNFOworCisgIENGWF9XaWRlU3RyaW5nJiB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7CisgIENGWF9XaWRlU3RyaW5nIHN0clZhbHVlID0gdmFsOworICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQorICAgIHJldHVybiBUUlVFOworCisgIENGWF9XaWRlU3RyaW5nIHNGb3JtYXQgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CisgIGRvdWJsZSBkRGF0ZSA9IDAuMGY7CisKKyAgaWYgKHN0clZhbHVlLkZpbmQoTCJHTVQiKSAhPSAtMSkgeworICAgIC8vIGZvciBHTVQgZm9ybWF0IHRpbWUKKyAgICAvLyBzdWNoIGFzICJUdWUgQXVnIDExIDE0OjI0OjE2IEdNVCswODAwMjAwOSIKKyAgICBkRGF0ZSA9IE1ha2VJbnRlckRhdGUoc3RyVmFsdWUpOworICB9IGVsc2UgeworICAgIGREYXRlID0gTWFrZVJlZ3VsYXJEYXRlKHN0clZhbHVlLCBzRm9ybWF0LCBudWxscHRyKTsKKyAgfQorCisgIGlmIChKU19Qb3J0SXNOYW4oZERhdGUpKSB7CisgICAgQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7CisgICAgc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSU0VEQVRFKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICBzRm9ybWF0LmNfc3RyKCkpOworICAgIEFsZXJ0KHBDb250ZXh0LCBzd01zZy5jX3N0cigpKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICB2YWwgPSBNYWtlRm9ybWF0RGF0ZShkRGF0ZSwgc0Zvcm1hdCk7CisgIHJldHVybiBUUlVFOworfQorCitkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VJbnRlckRhdGUoQ0ZYX1dpZGVTdHJpbmcgc3RyVmFsdWUpIHsKKyAgaW50IG5Ib3VyOworICBpbnQgbk1pbjsKKyAgaW50IG5TZWM7CisgIGludCBuWWVhcjsKKyAgaW50IG5Nb250aDsKKyAgaW50IG5EYXk7CisKKyAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c0FycmF5OworICBDRlhfV2lkZVN0cmluZyBzTW9udGggPSBMIiI7CisgIENGWF9XaWRlU3RyaW5nIHNUZW1wID0gTCIiOworICBpbnQgblNpemUgPSBzdHJWYWx1ZS5HZXRMZW5ndGgoKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG5TaXplOyBpKyspIHsKKyAgICBGWF9XQ0hBUiBjID0gc3RyVmFsdWUuR2V0QXQoaSk7CisgICAgaWYgKGMgPT0gTCcgJyB8fCBjID09IEwnOicpIHsKKyAgICAgIHdzQXJyYXkuQWRkKHNUZW1wKTsKKyAgICAgIHNUZW1wID0gTCIiOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgc1RlbXAgKz0gYzsKKyAgfQorCisgIHdzQXJyYXkuQWRkKHNUZW1wKTsKKyAgaWYgKHdzQXJyYXkuR2V0U2l6ZSgpICE9IDgpCisgICAgcmV0dXJuIDA7CisKKyAgc1RlbXAgPSB3c0FycmF5WzFdOworICBpZiAoc1RlbXAuQ29tcGFyZShMIkphbiIpID09IDApCisgICAgbk1vbnRoID0gMTsKKyAgaWYgKHNUZW1wLkNvbXBhcmUoTCJGZWIiKSA9PSAwKQorICAgIG5Nb250aCA9IDI7CisgIGlmIChzVGVtcC5Db21wYXJlKEwiTWFyIikgPT0gMCkKKyAgICBuTW9udGggPSAzOworICBpZiAoc1RlbXAuQ29tcGFyZShMIkFwciIpID09IDApCisgICAgbk1vbnRoID0gNDsKKyAgaWYgKHNUZW1wLkNvbXBhcmUoTCJNYXkiKSA9PSAwKQorICAgIG5Nb250aCA9IDU7CisgIGlmIChzVGVtcC5Db21wYXJlKEwiSnVuIikgPT0gMCkKKyAgICBuTW9udGggPSA2OworICBpZiAoc1RlbXAuQ29tcGFyZShMIkp1bCIpID09IDApCisgICAgbk1vbnRoID0gNzsKKyAgaWYgKHNUZW1wLkNvbXBhcmUoTCJBdWciKSA9PSAwKQorICAgIG5Nb250aCA9IDg7CisgIGlmIChzVGVtcC5Db21wYXJlKEwiU2VwIikgPT0gMCkKKyAgICBuTW9udGggPSA5OworICBpZiAoc1RlbXAuQ29tcGFyZShMIk9jdCIpID09IDApCisgICAgbk1vbnRoID0gMTA7CisgIGlmIChzVGVtcC5Db21wYXJlKEwiTm92IikgPT0gMCkKKyAgICBuTW9udGggPSAxMTsKKyAgaWYgKHNUZW1wLkNvbXBhcmUoTCJEZWMiKSA9PSAwKQorICAgIG5Nb250aCA9IDEyOworCisgIG5EYXkgPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVsyXS5jX3N0cigpKTsKKyAgbkhvdXIgPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVszXS5jX3N0cigpKTsKKyAgbk1pbiA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzRdLmNfc3RyKCkpOworICBuU2VjID0gKGludClQYXJzZVN0cmluZ1RvTnVtYmVyKHdzQXJyYXlbNV0uY19zdHIoKSk7CisgIG5ZZWFyID0gKGludClQYXJzZVN0cmluZ1RvTnVtYmVyKHdzQXJyYXlbN10uY19zdHIoKSk7CisKKyAgZG91YmxlIGRSZXQgPSBKU19NYWtlRGF0ZShKU19NYWtlRGF5KG5ZZWFyLCBuTW9udGggLSAxLCBuRGF5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU19NYWtlVGltZShuSG91ciwgbk1pbiwgblNlYywgMCkpOworCisgIGlmIChKU19Qb3J0SXNOYW4oZFJldCkpIHsKKyAgICBkUmV0ID0gSlNfRGF0ZVBhcnNlKHN0clZhbHVlLmNfc3RyKCkpOworICB9CisKKyAgcmV0dXJuIGRSZXQ7Cit9CisKKy8vIEFGRGF0ZV9LZXlzdHJva2VFeChjRm9ybWF0KQorRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0tleXN0cm9rZUV4KAorICAgIElKU19Db250ZXh0KiBjYywKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOworCisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKKyAgICBzRXJyb3IgPSBMIkFGRGF0ZV9LZXlzdHJva2VFeCdzIHBhcmFtZXRlcnMnIHNpemUgciBub3QgY29ycmVjdCI7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKSB7CisgICAgaWYgKCFwRXZlbnQtPm1fcFZhbHVlKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIENGWF9XaWRlU3RyaW5nIHN0clZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwogICAgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCi0JewotCQlkVmFsdWUgPSAwOwotCQlzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLGlEZWMsJmlEZWMyLCZiTmVnYXRpdmUpOwotCX0KKyAgICAgIHJldHVybiBUUlVFOwogCi0JaWYgKGlEZWMyIDwgMCkKLQl7Ci0JCWZvciAoaW50IGlOdW0gPSAwOyBpTnVtIDwgYWJzKGlEZWMyKTsgaU51bSsrKQotCQl7Ci0JCQlzdHJWYWx1ZSA9ICIwIiArIHN0clZhbHVlOwotCQl9Ci0JCWlEZWMyID0gMDsKLQotCX0KLQlpbnQgaU1heCA9IHN0clZhbHVlLkdldExlbmd0aCgpOwotCWlmIChpRGVjMiA+IGlNYXgpCi0JewotCQlmb3IgKGludCBpTnVtID0gMDsgaU51bSA8PSBpRGVjMiAtIGlNYXg7IGlOdW0rKykKLQkJewotCQkJc3RyVmFsdWUgKz0gIjAiOwotCQl9Ci0JCWlNYXggPSBpRGVjMisxOwotCX0KLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy9mb3IgcHJvY2Vzc2luZyBzZXBlcmF0b3Igc3R5bGUKLQlpZiAoaURlYzIgPCBpTWF4KQotCXsKLQkJaWYgKGlTZXBTdHlsZSA9PSAwIHx8IGlTZXBTdHlsZSA9PSAxKQotCQl7Ci0JCQlzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcuJyk7Ci0JCQlpTWF4Kys7Ci0JCX0KLQkJZWxzZSBpZiAoaVNlcFN0eWxlID09IDIgfHwgaVNlcFN0eWxlID09IDMpCi0JCXsKLQkJCXN0clZhbHVlLkluc2VydChpRGVjMiwgJywnKTsKLQkJCWlNYXgrKzsKLQkJfQotCi0JCWlmIChpRGVjMiA9PSAwKQotCQkJc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnMCcpOwotCX0KLQlpZiAoaVNlcFN0eWxlID09IDAgfHwgaVNlcFN0eWxlID09IDIpCi0JewotCQljaGFyIGNTZXBlcmF0b3I7Ci0JCWlmIChpU2VwU3R5bGUgPT0gMCkKLQkJCWNTZXBlcmF0b3IgPSAnLCc7Ci0JCWVsc2UKLQkJCWNTZXBlcmF0b3IgPSAnLic7Ci0KLQkJaW50IGlEZWNQb3NpdGl2ZTsKLQkJaURlY1Bvc2l0aXZlID0gaURlYzI7Ci0KLQkJZm9yIChpRGVjUG9zaXRpdmUgPSBpRGVjMiAtMzsgaURlY1Bvc2l0aXZlID4gMDsgaURlY1Bvc2l0aXZlIC09IDMpCi0JCXsKLQkJCXN0clZhbHVlLkluc2VydChpRGVjUG9zaXRpdmUsY1NlcGVyYXRvcik7Ci0JCQlpTWF4Kys7Ci0JCX0KLQl9Ci0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkvL25lZ2F0aXZlIG1hcmsKLQlpZihiTmVnYXRpdmUpCi0JCXN0clZhbHVlID0gIi0iICsgc3RyVmFsdWU7Ci0Jc3RyVmFsdWUgKz0gIiUiOwotCVZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChzdHJWYWx1ZSk7Ci0jZW5kaWYKLQlyZXR1cm4gVFJVRTsKLX0KLS8vQUZQZXJjZW50X0tleXN0cm9rZShuRGVjLCBzZXBTdHlsZSkKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGUGVyY2VudF9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlyZXR1cm4gQUZOdW1iZXJfS2V5c3Ryb2tlKGNjLHBhcmFtcyx2UmV0LHNFcnJvcik7CisgICAgQ0ZYX1dpZGVTdHJpbmcgc0Zvcm1hdCA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgICBib29sIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOworICAgIGRvdWJsZSBkUmV0ID0gTWFrZVJlZ3VsYXJEYXRlKHN0clZhbHVlLCBzRm9ybWF0LCAmYldyb25nRm9ybWF0KTsKKyAgICBpZiAoYldyb25nRm9ybWF0IHx8IEpTX1BvcnRJc05hbihkUmV0KSkgeworICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7CisgICAgICBzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJTRURBVEUpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgc0Zvcm1hdC5jX3N0cigpKTsKKyAgICAgIEFsZXJ0KHBDb250ZXh0LCBzd01zZy5jX3N0cigpKTsKKyAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOwogfQogCi0vL2Z1bmN0aW9uIEFGRGF0ZV9Gb3JtYXRFeChjRm9ybWF0KQotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0Zvcm1hdEV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKLQlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOworRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0Zvcm1hdChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQogCi0JaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKLQl7Ci0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0JaWYoIXBFdmVudC0+bV9wVmFsdWUpCi0JCXJldHVybiBGQUxTRTsKKyAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOworICBjb25zdCBGWF9XQ0hBUiogY0Zvcm1hdHNbXSA9IHtMIm0vZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibS9kL3l5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbS9kZC95eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW0veXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImQtbW1tIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJkLW1tbS15eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZGQtbW1tLXl5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJ5eS1tbS1kZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW1tLXl5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbW1tLXl5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbW0gZCwgeXl5eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW1tbSBkLCB5eXl5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtL2QveXkgaDpNTSB0dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibS9kL3l5IEhIOk1NIn07CiAKLQlDRlhfV2lkZVN0cmluZyYgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOwotCUNGWF9XaWRlU3RyaW5nIHN0clZhbHVlID0gdmFsOwotCWlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCi0JCXJldHVybiBUUlVFOworICBpZiAoaUluZGV4IDwgMCB8fCAoc3RhdGljX2Nhc3Q8c2l6ZV90PihpSW5kZXgpID49IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpKQorICAgIGlJbmRleCA9IDA7CiAKLQlDRlhfV2lkZVN0cmluZyBzRm9ybWF0ID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwotCUZYX0JPT0wgYldyb25nRm9ybWF0ID0gRkFMU0U7Ci0JZG91YmxlIGREYXRlID0gMC4wZjsKLQotCWlmKHN0clZhbHVlLkZpbmQoTCJHTVQiKSAhPSAtMSkKLQl7Ci0JCS8vZm9yIEdNVCBmb3JtYXQgdGltZQotCQkvL3N1Y2ggYXMgIlR1ZSBBdWcgMTEgMTQ6MjQ6MTYgR01UKzA4MDAyMDA5IgotCQlkRGF0ZSA9IE1ha2VJbnRlckRhdGUoc3RyVmFsdWUpOwotCX0KLQllbHNlCi0JewotCQlkRGF0ZSA9IE1ha2VSZWd1bGFyRGF0ZShzdHJWYWx1ZSxzRm9ybWF0LGJXcm9uZ0Zvcm1hdCk7Ci0JfQotCi0JaWYgKEpTX1BvcnRJc05hbihkRGF0ZSkpCi0JewotCQlDRlhfV2lkZVN0cmluZyBzd01zZzsKLQkJc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSU0VEQVRFKS5jX3N0cigpLCBzRm9ybWF0LmNfc3RyKCkpOwotCQlBbGVydChwQ29udGV4dCwgc3dNc2cuY19zdHIoKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQl2YWwgPSAgTWFrZUZvcm1hdERhdGUoZERhdGUsc0Zvcm1hdCk7Ci0JcmV0dXJuIFRSVUU7CisgIHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4gbmV3UGFyYW1zOworICBuZXdQYXJhbXMucHVzaF9iYWNrKAorICAgICAgQ0pTX1ZhbHVlKENKU19SdW50aW1lOjpGcm9tQ29udGV4dChjYyksIGNGb3JtYXRzW2lJbmRleF0pKTsKKyAgcmV0dXJuIEFGRGF0ZV9Gb3JtYXRFeChjYywgbmV3UGFyYW1zLCB2UmV0LCBzRXJyb3IpOwogfQogCi1kb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VJbnRlckRhdGUoQ0ZYX1dpZGVTdHJpbmcgc3RyVmFsdWUpCi17Ci0JaW50IG5Ib3VyOwotCWludCBuTWluOwotCWludCBuU2VjOwotCWludCBuWWVhcjsKLQlpbnQgbk1vbnRoOwotCWludCBuRGF5OworLy8gQUZEYXRlX0tleXN0cm9rZUV4KGNGb3JtYXQpCitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRkRhdGVfS2V5c3Ryb2tlKAorICAgIElKU19Db250ZXh0KiBjYywKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLQlDRlhfV2lkZVN0cmluZ0FycmF5IHdzQXJyYXk7Ci0JQ0ZYX1dpZGVTdHJpbmcgc01vbnRoID0gTCIiOwotCUNGWF9XaWRlU3RyaW5nIHNUZW1wID0gTCIiOwotCWludCBuU2l6ZSA9IHN0clZhbHVlLkdldExlbmd0aCgpOworICBpbnQgaUluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7CisgIGNvbnN0IEZYX1dDSEFSKiBjRm9ybWF0c1tdID0ge0wibS9kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtL2QveXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm1tL2RkL3l5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbS95eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZC1tbW0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImQtbW1tLXl5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJkZC1tbW0teXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMInl5LW1tLWRkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbW0teXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm1tbW0teXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm1tbSBkLCB5eXl5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbW1tIGQsIHl5eXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm0vZC95eSBoOk1NIHR0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtL2QveXkgSEg6TU0ifTsKIAotCWZvcihpbnQgaSA9IDA7IGkgPCBuU2l6ZTsgaSsrKQotCXsKLQkJRlhfV0NIQVIgYyA9IHN0clZhbHVlLkdldEF0KGkpOwotCQlpZihjID09IEwnICcgfHwgYyA9PSBMJzonKQotCQl7Ci0JCQl3c0FycmF5LkFkZChzVGVtcCk7Ci0JCQlzVGVtcCA9IEwiIjsKLQkJCWNvbnRpbnVlOwotCQl9CisgIGlmIChpSW5kZXggPCAwIHx8IChzdGF0aWNfY2FzdDxzaXplX3Q+KGlJbmRleCkgPj0gRlhfQXJyYXlTaXplKGNGb3JtYXRzKSkpCisgICAgaUluZGV4ID0gMDsKIAotCQlzVGVtcCArPSBjOwotCX0KLQotCXdzQXJyYXkuQWRkKHNUZW1wKTsKLQlpZih3c0FycmF5LkdldFNpemUoKSAhPSA4KXJldHVybiAwOwotCi0Jc1RlbXAgPSB3c0FycmF5WzFdOwotCWlmKHNUZW1wLkNvbXBhcmUoTCJKYW4iKSA9PSAwKSBuTW9udGggPSAxOwotCWlmKHNUZW1wLkNvbXBhcmUoTCJGZWIiKSA9PSAwKSBuTW9udGggPSAyOwotCWlmKHNUZW1wLkNvbXBhcmUoTCJNYXIiKSA9PSAwKSBuTW9udGggPSAzOwotCWlmKHNUZW1wLkNvbXBhcmUoTCJBcHIiKSA9PSAwKSBuTW9udGggPSA0OwotCWlmKHNUZW1wLkNvbXBhcmUoTCJNYXkiKSA9PSAwKSBuTW9udGggPSA1OwotCWlmKHNUZW1wLkNvbXBhcmUoTCJKdW4iKSA9PSAwKSBuTW9udGggPSA2OwotCWlmKHNUZW1wLkNvbXBhcmUoTCJKdWwiKSA9PSAwKSBuTW9udGggPSA3OwotCWlmKHNUZW1wLkNvbXBhcmUoTCJBdWciKSA9PSAwKSBuTW9udGggPSA4OwotCWlmKHNUZW1wLkNvbXBhcmUoTCJTZXAiKSA9PSAwKSBuTW9udGggPSA5OwotCWlmKHNUZW1wLkNvbXBhcmUoTCJPY3QiKSA9PSAwKSBuTW9udGggPSAxMDsKLQlpZihzVGVtcC5Db21wYXJlKEwiTm92IikgPT0gMCkgbk1vbnRoID0gMTE7Ci0JaWYoc1RlbXAuQ29tcGFyZShMIkRlYyIpID09IDApIG5Nb250aCA9IDEyOwotCi0JbkRheSA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzJdLmNfc3RyKCkpOwotCW5Ib3VyID0gKGludClQYXJzZVN0cmluZ1RvTnVtYmVyKHdzQXJyYXlbM10uY19zdHIoKSk7Ci0Jbk1pbiA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzRdLmNfc3RyKCkpOwotCW5TZWMgPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVs1XS5jX3N0cigpKTsKLQluWWVhciA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzddLmNfc3RyKCkpOwotCi0JZG91YmxlIGRSZXQgPSBKU19NYWtlRGF0ZShKU19NYWtlRGF5KG5ZZWFyLG5Nb250aCAtIDEsbkRheSksSlNfTWFrZVRpbWUobkhvdXIsIG5NaW4sIG5TZWMsIDApKTsKLQotCWlmIChKU19Qb3J0SXNOYW4oZFJldCkpCi0JewotCQlkUmV0ID0gSlNfRGF0ZVBhcnNlKHN0clZhbHVlLmNfc3RyKCkpOwotCX0KLQotCXJldHVybiBkUmV0OworICBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+IG5ld1BhcmFtczsKKyAgbmV3UGFyYW1zLnB1c2hfYmFjaygKKyAgICAgIENKU19WYWx1ZShDSlNfUnVudGltZTo6RnJvbUNvbnRleHQoY2MpLCBjRm9ybWF0c1tpSW5kZXhdKSk7CisgIHJldHVybiBBRkRhdGVfS2V5c3Ryb2tlRXgoY2MsIG5ld1BhcmFtcywgdlJldCwgc0Vycm9yKTsKIH0KIAotLy9BRkRhdGVfS2V5c3Ryb2tlRXgoY0Zvcm1hdCkKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQlDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0JQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKKy8vIGZ1bmN0aW9uIEFGVGltZV9Gb3JtYXQocHRmKQorRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0Zvcm1hdChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQogCi0JaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKLQl7Ci0JCXNFcnJvciA9IEwiQUZEYXRlX0tleXN0cm9rZUV4J3MgcGFyYW1ldGVycycgc2l6ZSByIG5vdCBjb3JyZWN0IjsKLQkJcmV0dXJuIEZBTFNFOwotCX0KKyAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOworICBjb25zdCBGWF9XQ0hBUiogY0Zvcm1hdHNbXSA9IHtMIkhIOk1NIiwgTCJoOk1NIHR0IiwgTCJISDpNTTpzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiaDpNTTpzcyB0dCJ9OwogCi0JaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKQotCXsKLQkJaWYoIXBFdmVudC0+bV9wVmFsdWUpCi0JCQlyZXR1cm4gRkFMU0U7Ci0JCUNGWF9XaWRlU3RyaW5nIHN0clZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwotCQlpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQotCQkJcmV0dXJuIFRSVUU7CisgIGlmIChpSW5kZXggPCAwIHx8IChzdGF0aWNfY2FzdDxzaXplX3Q+KGlJbmRleCkgPj0gRlhfQXJyYXlTaXplKGNGb3JtYXRzKSkpCisgICAgaUluZGV4ID0gMDsKIAotCQlDRlhfV2lkZVN0cmluZyBzRm9ybWF0ID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwotCQlGWF9CT09MIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOwotCQlkb3VibGUgZFJldCA9IE1ha2VSZWd1bGFyRGF0ZShzdHJWYWx1ZSxzRm9ybWF0LGJXcm9uZ0Zvcm1hdCk7Ci0JCWlmIChiV3JvbmdGb3JtYXQgfHwgSlNfUG9ydElzTmFuKGRSZXQpKQotCQl7Ci0JCQlDRlhfV2lkZVN0cmluZyBzd01zZzsKLQkJCXN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUlNFREFURSkuY19zdHIoKSwgc0Zvcm1hdC5jX3N0cigpKTsKLQkJCUFsZXJ0KHBDb250ZXh0LCBzd01zZy5jX3N0cigpKTsKLQkJCXBFdmVudC0+UmMoKSA9IEZBTFNFOwotCQkJcmV0dXJuIFRSVUU7Ci0JCX0KLQl9Ci0JcmV0dXJuIFRSVUU7CisgIHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4gbmV3UGFyYW1zOworICBuZXdQYXJhbXMucHVzaF9iYWNrKAorICAgICAgQ0pTX1ZhbHVlKENKU19SdW50aW1lOjpGcm9tQ29udGV4dChjYyksIGNGb3JtYXRzW2lJbmRleF0pKTsKKyAgcmV0dXJuIEFGRGF0ZV9Gb3JtYXRFeChjYywgbmV3UGFyYW1zLCB2UmV0LCBzRXJyb3IpOwogfQogCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRkRhdGVfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0Jdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOworRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0tleXN0cm9rZSgKKyAgICBJSlNfQ29udGV4dCogY2MsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQogCi0JaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKLQl7Ci0JCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0JCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKKyAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOworICBjb25zdCBGWF9XQ0hBUiogY0Zvcm1hdHNbXSA9IHtMIkhIOk1NIiwgTCJoOk1NIHR0IiwgTCJISDpNTTpzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiaDpNTTpzcyB0dCJ9OwogCi0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0JCXJldHVybiBGQUxTRTsKLQl9CisgIGlmIChpSW5kZXggPCAwIHx8IChzdGF0aWNfY2FzdDxzaXplX3Q+KGlJbmRleCkgPj0gRlhfQXJyYXlTaXplKGNGb3JtYXRzKSkpCisgICAgaUluZGV4ID0gMDsKIAotCWludCBpSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKLQlGWF9MUENXU1RSIGNGb3JtYXRzW10gPSAge0wibS9kIiwgTCJtL2QveXkiLCBMIm1tL2RkL3l5IiwgTCJtbS95eSIsIEwiZC1tbW0iLCBMImQtbW1tLXl5IiwgTCJkZC1tbW0teXkiLAotCQlMInl5LW1tLWRkIiwgTCJtbW0teXkiLCBMIm1tbW0teXkiLCBMIm1tbSBkLCB5eXl5IiwgTCJtbW1tIGQsIHl5eXkiLAotCQlMIm0vZC95eSBoOk1NIHR0IiwgTCJtL2QveXkgSEg6TU0iIH07Ci0KLQlBU1NFUlQoaUluZGV4IDwgRlhfQXJyYXlTaXplKGNGb3JtYXRzKSk7Ci0KLQlpZiAoaUluZGV4IDwgMCkKLQkJaUluZGV4ID0gMDsKLQlpZiAoaUluZGV4ID49IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpCi0JCWlJbmRleCA9IDA7Ci0JQ0pTX1BhcmFtZXRlcnMgbmV3UGFyYW1zOwotCUNKU19WYWx1ZSB2YWwoaXNvbGF0ZSxjRm9ybWF0c1tpSW5kZXhdKTsKLQluZXdQYXJhbXMucHVzaF9iYWNrKHZhbCk7Ci0JcmV0dXJuIEFGRGF0ZV9Gb3JtYXRFeChjYyxuZXdQYXJhbXMsdlJldCxzRXJyb3IpOworICBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+IG5ld1BhcmFtczsKKyAgbmV3UGFyYW1zLnB1c2hfYmFjaygKKyAgICAgIENKU19WYWx1ZShDSlNfUnVudGltZTo6RnJvbUNvbnRleHQoY2MpLCBjRm9ybWF0c1tpSW5kZXhdKSk7CisgIHJldHVybiBBRkRhdGVfS2V5c3Ryb2tlRXgoY2MsIG5ld1BhcmFtcywgdlJldCwgc0Vycm9yKTsKIH0KIAotLy9BRkRhdGVfS2V5c3Ryb2tlRXgoY0Zvcm1hdCkKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7Ci0KLQlpZiAocGFyYW1zLnNpemUoKSAhPSAxKQotCXsKLQkJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLQkJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCi0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlpbnQgaUluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7Ci0JRlhfTFBDV1NUUiBjRm9ybWF0c1tdID0gIHtMIm0vZCIsIEwibS9kL3l5IiwgTCJtbS9kZC95eSIsIEwibW0veXkiLCBMImQtbW1tIiwgTCJkLW1tbS15eSIsIEwiZGQtbW1tLXl5IiwKLQkJTCJ5eS1tbS1kZCIsIEwibW1tLXl5IiwgTCJtbW1tLXl5IiwgTCJtbW0gZCwgeXl5eSIsIEwibW1tbSBkLCB5eXl5IiwKLQkJTCJtL2QveXkgaDpNTSB0dCIsIEwibS9kL3l5IEhIOk1NIiB9OwotCi0JQVNTRVJUKGlJbmRleDxGWF9BcnJheVNpemUoY0Zvcm1hdHMpKTsKLQotCWlmIChpSW5kZXggPCAwKQotCQlpSW5kZXggPSAwOwotCWlmIChpSW5kZXggPj0gRlhfQXJyYXlTaXplKGNGb3JtYXRzKSkKLQkJaUluZGV4ID0gMDsKLQlDSlNfUGFyYW1ldGVycyBuZXdQYXJhbXM7Ci0JQ0pTX1ZhbHVlIHZhbChpc29sYXRlLGNGb3JtYXRzW2lJbmRleF0pOwotCW5ld1BhcmFtcy5wdXNoX2JhY2sodmFsKTsKLQlyZXR1cm4gQUZEYXRlX0tleXN0cm9rZUV4KGNjLG5ld1BhcmFtcyx2UmV0LHNFcnJvcik7CitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlRpbWVfRm9ybWF0RXgoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gQUZEYXRlX0Zvcm1hdEV4KGNjLCBwYXJhbXMsIHZSZXQsIHNFcnJvcik7CiB9CiAKLS8vZnVuY3Rpb24gQUZUaW1lX0Zvcm1hdChwdGYpCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlRpbWVfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0Jdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwotCi0JaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKLQl7Ci0JCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0JCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCWludCBpSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKLQlGWF9MUENXU1RSIGNGb3JtYXRzW10gPSB7TCJISDpNTSIsIEwiaDpNTSB0dCIsIEwiSEg6TU06c3MiLCBMImg6TU06c3MgdHQifTsKLQotCUFTU0VSVChpSW5kZXg8RlhfQXJyYXlTaXplKGNGb3JtYXRzKSk7Ci0KLQlpZiAoaUluZGV4IDwgMCkKLQkJaUluZGV4ID0gMDsKLQlpZiAoaUluZGV4ID49IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpCi0JCWlJbmRleCA9IDA7Ci0JQ0pTX1BhcmFtZXRlcnMgbmV3UGFyYW1zOwotCUNKU19WYWx1ZSB2YWwoaXNvbGF0ZSxjRm9ybWF0c1tpSW5kZXhdKTsKLQluZXdQYXJhbXMucHVzaF9iYWNrKHZhbCk7Ci0JcmV0dXJuIEFGRGF0ZV9Gb3JtYXRFeChjYyxuZXdQYXJhbXMsdlJldCxzRXJyb3IpOworRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0tleXN0cm9rZUV4KAorICAgIElKU19Db250ZXh0KiBjYywKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIEFGRGF0ZV9LZXlzdHJva2VFeChjYywgcGFyYW1zLCB2UmV0LCBzRXJyb3IpOwogfQogCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlRpbWVfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0Jdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwotCWlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCi0JewotCQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0JCXJldHVybiBGQUxTRTsKLQl9CisvLyBmdW5jdGlvbiBBRlNwZWNpYWxfRm9ybWF0KHBzZikKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU3BlY2lhbF9Gb3JtYXQoCisgICAgSUpTX0NvbnRleHQqIGNjLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogCi0JaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwotCUZYX0xQQ1dTVFIgY0Zvcm1hdHNbXSA9IHtMIkhIOk1NIiwgTCJoOk1NIHR0IiwgTCJISDpNTTpzcyIsIEwiaDpNTTpzcyB0dCJ9OworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotCUFTU0VSVChpSW5kZXg8RlhfQXJyYXlTaXplKGNGb3JtYXRzKSk7CisgIHN0ZDo6c3RyaW5nIGNGb3JtYXQ7CisgIGludCBpSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKIAotCWlmIChpSW5kZXggPCAwKQotCQlpSW5kZXggPSAwOwotCWlmIChpSW5kZXggPj0gRlhfQXJyYXlTaXplKGNGb3JtYXRzKSkKLQkJaUluZGV4ID0gMDsKLQlDSlNfUGFyYW1ldGVycyBuZXdQYXJhbXM7Ci0JQ0pTX1ZhbHVlIHZhbChpc29sYXRlLGNGb3JtYXRzW2lJbmRleF0pOwotCW5ld1BhcmFtcy5wdXNoX2JhY2sodmFsKTsKLQlyZXR1cm4gQUZEYXRlX0tleXN0cm9rZUV4KGNjLG5ld1BhcmFtcyx2UmV0LHNFcnJvcik7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKKyAgaWYgKCFwRXZlbnQtPm1fcFZhbHVlKQorICAgIHJldHVybiBGQUxTRTsKKyAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOworICBzdGQ6OnN0cmluZyBzdHJTcmMgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVmFsdWUpLmNfc3RyKCk7CisKKyAgc3dpdGNoIChpSW5kZXgpIHsKKyAgICBjYXNlIDA6CisgICAgICBjRm9ybWF0ID0gIjk5OTk5IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIGNGb3JtYXQgPSAiOTk5OTktOTk5OSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6IHsKKyAgICAgIHN0ZDo6c3RyaW5nIE51bWJlclN0cjsKKyAgICAgIHV0aWw6OnByaW50eCgiOTk5OTk5OTk5OSIsIHN0clNyYywgTnVtYmVyU3RyKTsKKyAgICAgIGlmIChOdW1iZXJTdHIubGVuZ3RoKCkgPj0gMTApCisgICAgICAgIGNGb3JtYXQgPSAiKDk5OSkgOTk5LTk5OTkiOworICAgICAgZWxzZQorICAgICAgICBjRm9ybWF0ID0gIjk5OS05OTk5IjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDM6CisgICAgICBjRm9ybWF0ID0gIjk5OS05OS05OTk5IjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgc3RkOjpzdHJpbmcgc3RyRGVzOworICB1dGlsOjpwcmludHgoY0Zvcm1hdCwgc3RyU3JjLCBzdHJEZXMpOworICBWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3RyRGVzLmNfc3RyKCkpOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0Zvcm1hdEV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIEFGRGF0ZV9Gb3JtYXRFeChjYyxwYXJhbXMsdlJldCxzRXJyb3IpOworLy8gZnVuY3Rpb24gQUZTcGVjaWFsX0tleXN0cm9rZUV4KG1hc2spCitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNwZWNpYWxfS2V5c3Ryb2tlRXgoCisgICAgSUpTX0NvbnRleHQqIGNjLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CisKKyAgaWYgKHBhcmFtcy5zaXplKCkgPCAxKSB7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoIXBFdmVudC0+bV9wVmFsdWUpCisgICAgcmV0dXJuIEZBTFNFOworICBDRlhfV2lkZVN0cmluZyYgdmFsRXZlbnQgPSBwRXZlbnQtPlZhbHVlKCk7CisKKyAgQ0ZYX1dpZGVTdHJpbmcgd3N0ck1hc2sgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CisgIGlmICh3c3RyTWFzay5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgY29uc3Qgc2l6ZV90IHdzdHJNYXNrTGVuID0gd3N0ck1hc2suR2V0TGVuZ3RoKCk7CisgIGNvbnN0IHN0ZDo6d3N0cmluZyB3c3RyVmFsdWUgPSB2YWxFdmVudC5jX3N0cigpOworCisgIGlmIChwRXZlbnQtPldpbGxDb21taXQoKSkgeworICAgIGlmICh3c3RyVmFsdWUuZW1wdHkoKSkKKyAgICAgIHJldHVybiBUUlVFOworICAgIHNpemVfdCBpSW5kZXhNYXNrID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHdfVmFsdWUgOiB3c3RyVmFsdWUpIHsKKyAgICAgIGlmICghbWFza1NhdGlzZmllZCh3X1ZhbHVlLCB3c3RyTWFza1tpSW5kZXhNYXNrXSkpCisgICAgICAgIGJyZWFrOworICAgICAgaUluZGV4TWFzaysrOworICAgIH0KKworICAgIGlmIChpSW5kZXhNYXNrICE9IHdzdHJNYXNrTGVuIHx8CisgICAgICAgIChpSW5kZXhNYXNrICE9IHdzdHJWYWx1ZS5zaXplKCkgJiYgd3N0ck1hc2tMZW4gIT0gMCkpIHsKKyAgICAgIEFsZXJ0KAorICAgICAgICAgIHBDb250ZXh0LAorICAgICAgICAgIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTQUZOVU1CRVJfS0VZU1RST0tFKS5jX3N0cigpKTsKKyAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIENGWF9XaWRlU3RyaW5nJiB3aWRlQ2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKTsKKyAgc3RkOjp3c3RyaW5nIHdDaGFuZ2UgPSB3aWRlQ2hhbmdlLmNfc3RyKCk7CisgIGlmICh3Q2hhbmdlLmVtcHR5KCkpCisgICAgcmV0dXJuIFRSVUU7CisKKyAgaW50IGlJbmRleE1hc2sgPSBwRXZlbnQtPlNlbFN0YXJ0KCk7CisKKyAgc2l6ZV90IGNvbWJpbmVkX2xlbiA9IHdzdHJWYWx1ZS5sZW5ndGgoKSArIHdDaGFuZ2UubGVuZ3RoKCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgKHBFdmVudC0+U2VsRW5kKCkgLSBwRXZlbnQtPlNlbFN0YXJ0KCkpOworICBpZiAoY29tYmluZWRfbGVuID4gd3N0ck1hc2tMZW4pIHsKKyAgICBBbGVydChwQ29udGV4dCwKKyAgICAgICAgICBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpLmNfc3RyKCkpOworICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgaWYgKGlJbmRleE1hc2sgPj0gd3N0ck1hc2tMZW4gJiYgKCF3Q2hhbmdlLmVtcHR5KCkpKSB7CisgICAgQWxlcnQocENvbnRleHQsCisgICAgICAgICAgSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTV9UT09MT05HKS5jX3N0cigpKTsKKyAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIGZvciAoc3RkOjp3c3RyaW5nOjppdGVyYXRvciBpdCA9IHdDaGFuZ2UuYmVnaW4oKTsgaXQgIT0gd0NoYW5nZS5lbmQoKTsgaXQrKykgeworICAgIGlmIChpSW5kZXhNYXNrID49IHdzdHJNYXNrTGVuKSB7CisgICAgICBBbGVydChwQ29udGV4dCwKKyAgICAgICAgICAgIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1fVE9PTE9ORykuY19zdHIoKSk7CisgICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICB3Y2hhcl90IHdfTWFzayA9IHdzdHJNYXNrW2lJbmRleE1hc2tdOworICAgIGlmICghaXNSZXNlcnZlZE1hc2tDaGFyKHdfTWFzaykpIHsKKyAgICAgICppdCA9IHdfTWFzazsKKyAgICB9CisgICAgd2NoYXJfdCB3X0NoYW5nZSA9ICppdDsKKyAgICBpZiAoIW1hc2tTYXRpc2ZpZWQod19DaGFuZ2UsIHdfTWFzaykpIHsKKyAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGlJbmRleE1hc2srKzsKKyAgfQorCisgIHdpZGVDaGFuZ2UgPSB3Q2hhbmdlLmNfc3RyKCk7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlRpbWVfS2V5c3Ryb2tlRXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlyZXR1cm4gQUZEYXRlX0tleXN0cm9rZUV4KGNjLHBhcmFtcyx2UmV0LHNFcnJvcik7CisvLyBmdW5jdGlvbiBBRlNwZWNpYWxfS2V5c3Ryb2tlKHBzZikKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU3BlY2lhbF9LZXlzdHJva2UoCisgICAgSUpTX0NvbnRleHQqIGNjLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CisgIGlmICghcEV2ZW50LT5tX3BWYWx1ZSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgc3RkOjpzdHJpbmcgY0Zvcm1hdDsKKyAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOworICBDRlhfV2lkZVN0cmluZyYgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOworICBzdGQ6OnN0cmluZyBzdHJTcmMgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUodmFsKS5jX3N0cigpOworICBzdGQ6OndzdHJpbmcgd3N0ckNoYW5nZSA9IHBFdmVudC0+Q2hhbmdlKCkuY19zdHIoKTsKKworICBzd2l0Y2ggKGlJbmRleCkgeworICAgIGNhc2UgMDoKKyAgICAgIGNGb3JtYXQgPSAiOTk5OTkiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgLy8gY0Zvcm1hdCA9ICI5OTk5OS05OTk5IjsKKyAgICAgIGNGb3JtYXQgPSAiOTk5OTk5OTk5IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjogeworICAgICAgc3RkOjpzdHJpbmcgTnVtYmVyU3RyOworICAgICAgdXRpbDo6cHJpbnR4KCI5OTk5OTk5OTk5Iiwgc3RyU3JjLCBOdW1iZXJTdHIpOworICAgICAgaWYgKHN0clNyYy5sZW5ndGgoKSArIHdzdHJDaGFuZ2UubGVuZ3RoKCkgPiA3KQorICAgICAgICAvLyBjRm9ybWF0ID0gIig5OTkpIDk5OS05OTk5IjsKKyAgICAgICAgY0Zvcm1hdCA9ICI5OTk5OTk5OTk5IjsKKyAgICAgIGVsc2UKKyAgICAgICAgLy8gY0Zvcm1hdCA9ICI5OTktOTk5OSI7CisgICAgICAgIGNGb3JtYXQgPSAiOTk5OTk5OSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAzOgorICAgICAgLy8gY0Zvcm1hdCA9ICI5OTktOTktOTk5OSI7CisgICAgICBjRm9ybWF0ID0gIjk5OTk5OTk5OSI7CisgICAgICBicmVhazsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4gcGFyYW1zMjsKKyAgcGFyYW1zMi5wdXNoX2JhY2soQ0pTX1ZhbHVlKENKU19SdW50aW1lOjpGcm9tQ29udGV4dChjYyksIGNGb3JtYXQuY19zdHIoKSkpOworICByZXR1cm4gQUZTcGVjaWFsX0tleXN0cm9rZUV4KGNjLCBwYXJhbXMyLCB2UmV0LCBzRXJyb3IpOwogfQogCi0vL2Z1bmN0aW9uIEFGU3BlY2lhbF9Gb3JtYXQocHNmKQotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTcGVjaWFsX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTWVyZ2VDaGFuZ2UoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnRIYW5kbGVyID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogCi0JaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKLQl7Ci0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0JCXJldHVybiBGQUxTRTsKLQl9CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQogCi0Jc3RkOjpzdHJpbmcgY0Zvcm1hdDsKLQlpbnQgaUluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7CisgIENGWF9XaWRlU3RyaW5nIHN3VmFsdWU7CisgIGlmIChwRXZlbnRIYW5kbGVyLT5tX3BWYWx1ZSkKKyAgICBzd1ZhbHVlID0gcEV2ZW50SGFuZGxlci0+VmFsdWUoKTsKIAotCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKLQlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOworICBpZiAocEV2ZW50SGFuZGxlci0+V2lsbENvbW1pdCgpKSB7CisgICAgdlJldCA9IHN3VmFsdWUuY19zdHIoKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQogCi0JaWYoIXBFdmVudC0+bV9wVmFsdWUpCi0JCXJldHVybiBGQUxTRTsKLQlDRlhfV2lkZVN0cmluZyYgVmFsdWUgPSBwRXZlbnQtPlZhbHVlKCk7Ci0Jc3RkOjpzdHJpbmcgc3RyU3JjID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKFZhbHVlKS5jX3N0cigpOworICBDRlhfV2lkZVN0cmluZyBwcmVmaXgsIHBvc3RmaXg7CiAKLQlzd2l0Y2ggKGlJbmRleCkKLQl7Ci0JY2FzZSAwOgotCQljRm9ybWF0ID0gIjk5OTk5IjsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQljRm9ybWF0ID0gIjk5OTk5LTk5OTkiOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCXsKLQkJCXN0ZDo6c3RyaW5nIE51bWJlclN0cjsKLQkJCXV0aWw6OnByaW50eCgiOTk5OTk5OTk5OSIsIHN0clNyYyxOdW1iZXJTdHIpOwotCQkJaWYgKE51bWJlclN0ci5sZW5ndGgoKSA+PSAxMCApCi0JCQkJY0Zvcm1hdCA9ICIoOTk5KSA5OTktOTk5OSI7Ci0JCQllbHNlCi0JCQkJY0Zvcm1hdCA9ICI5OTktOTk5OSI7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgMzoKLQkJY0Zvcm1hdCA9ICI5OTktOTktOTk5OSI7Ci0JCWJyZWFrOwotCX0KKyAgaWYgKHBFdmVudEhhbmRsZXItPlNlbFN0YXJ0KCkgPj0gMCkKKyAgICBwcmVmaXggPSBzd1ZhbHVlLk1pZCgwLCBwRXZlbnRIYW5kbGVyLT5TZWxTdGFydCgpKTsKKyAgZWxzZQorICAgIHByZWZpeCA9IEwiIjsKIAotCXN0ZDo6c3RyaW5nIHN0ckRlczsKLQl1dGlsOjpwcmludHgoY0Zvcm1hdCxzdHJTcmMsc3RyRGVzKTsKLQlWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3RyRGVzLmNfc3RyKCkpOwotCXJldHVybiBUUlVFOworICBpZiAocEV2ZW50SGFuZGxlci0+U2VsRW5kKCkgPj0gMCAmJgorICAgICAgcEV2ZW50SGFuZGxlci0+U2VsRW5kKCkgPD0gc3dWYWx1ZS5HZXRMZW5ndGgoKSkKKyAgICBwb3N0Zml4ID0gc3dWYWx1ZS5NaWQocEV2ZW50SGFuZGxlci0+U2VsRW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN3VmFsdWUuR2V0TGVuZ3RoKCkgLSBwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSk7CisgIGVsc2UKKyAgICBwb3N0Zml4ID0gTCIiOworCisgIHZSZXQgPSAocHJlZml4ICsgcEV2ZW50SGFuZGxlci0+Q2hhbmdlKCkgKyBwb3N0Zml4KS5jX3N0cigpOworCisgIHJldHVybiBUUlVFOwogfQogCitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlBhcnNlRGF0ZUV4KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQVNTRVJUKHBDb250ZXh0KTsKIAotLy9mdW5jdGlvbiBBRlNwZWNpYWxfS2V5c3Ryb2tlRXgobWFzaykKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU3BlY2lhbF9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQlDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpIHsKKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQogCi0JQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOworICBDRlhfV2lkZVN0cmluZyBzRm9ybWF0ID0gcGFyYW1zWzFdLlRvQ0ZYV2lkZVN0cmluZygpOwogCi0JaWYgKHBhcmFtcy5zaXplKCkgPCAxKQotCXsKLQkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KKyAgZG91YmxlIGREYXRlID0gTWFrZVJlZ3VsYXJEYXRlKHNWYWx1ZSwgc0Zvcm1hdCwgbnVsbHB0cik7CiAKLQlpZighcEV2ZW50LT5tX3BWYWx1ZSkKLQkJcmV0dXJuIEZBTFNFOwotCUNGWF9XaWRlU3RyaW5nJiB2YWxFdmVudCA9IHBFdmVudC0+VmFsdWUoKTsKKyAgaWYgKEpTX1BvcnRJc05hbihkRGF0ZSkpIHsKKyAgICBDRlhfV2lkZVN0cmluZyBzd01zZzsKKyAgICBzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJTRURBVEUpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIHNGb3JtYXQuY19zdHIoKSk7CisgICAgQWxlcnQoKENKU19Db250ZXh0KiljYywgc3dNc2cuY19zdHIoKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLQlDRlhfV2lkZVN0cmluZyB3c3RyTWFzayA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKLQlpZiAod3N0ck1hc2suSXNFbXB0eSgpKQotCQlyZXR1cm4gVFJVRTsKLQotCXN0ZDo6d3N0cmluZyB3c3RyVmFsdWUgPSB2YWxFdmVudC5jX3N0cigpOwotCi0JaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKQotCXsKLQkJaWYgKHdzdHJWYWx1ZS5lbXB0eSgpKQotCQkJcmV0dXJuIFRSVUU7Ci0JCWludCBpSW5kZXhNYXNrID0gMDsKLQkJZm9yIChzdGQ6OndzdHJpbmc6Oml0ZXJhdG9yIGl0ID0gd3N0clZhbHVlLmJlZ2luKCk7IGl0ICE9IHdzdHJWYWx1ZS5lbmQoKTsgaXQrKykKLQkJewotCQkJd2NoYXJfdCB3X1ZhbHVlID0gKml0OwotCQkJaWYgKCFtYXNrU2F0aXNmaWVkKHdfVmFsdWUsd3N0ck1hc2tbaUluZGV4TWFza10pKQotCQkJCWJyZWFrOwotCQkJaUluZGV4TWFzaysrOwotCQl9Ci0KLQkJaWYgKGlJbmRleE1hc2sgIT0gd3N0ck1hc2suR2V0TGVuZ3RoKCkgfHwgKGlJbmRleE1hc2sgIT0gd3N0clZhbHVlLnNpemUoKSAmJiB3c3RyTWFzay5HZXRMZW5ndGgoKSAhPSAwKSkKLQkJewotCQkJQWxlcnQocENvbnRleHQsIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTQUZOVU1CRVJfS0VZU1RST0tFKS5jX3N0cigpKTsKLQkJCXBFdmVudC0+UmMoKSA9IEZBTFNFOwotCQl9Ci0JCXJldHVybiBUUlVFOwotCX0KLQotCUNGWF9XaWRlU3RyaW5nICZ3aWRlQ2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKTsKLQlzdGQ6OndzdHJpbmcgd0NoYW5nZSA9IHdpZGVDaGFuZ2UuY19zdHIoKTsKLQlpZiAod0NoYW5nZS5lbXB0eSgpKQotCQlyZXR1cm4gVFJVRTsKLQotCWludCBpSW5kZXhNYXNrID0gcEV2ZW50LT5TZWxTdGFydCgpOwotCi0JaWYgKHdzdHJWYWx1ZS5sZW5ndGgoKSAtIChwRXZlbnQtPlNlbEVuZCgpLXBFdmVudC0+U2VsU3RhcnQoKSkgKyB3Q2hhbmdlLmxlbmd0aCgpID4gKEZYX0RXT1JEKXdzdHJNYXNrLkdldExlbmd0aCgpKQotCXsKLQkJQWxlcnQocENvbnRleHQsIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1fVE9PTE9ORykuY19zdHIoKSk7Ci0JCXBFdmVudC0+UmMoKSA9IEZBTFNFOwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0KLQlpZiAoaUluZGV4TWFzayA+PSB3c3RyTWFzay5HZXRMZW5ndGgoKSAmJiAoIXdDaGFuZ2UuZW1wdHkoKSkpCi0JewotCQlBbGVydChwQ29udGV4dCwgSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTV9UT09MT05HKS5jX3N0cigpKTsKLQkJcEV2ZW50LT5SYygpID0gRkFMU0U7Ci0JCXJldHVybiBUUlVFOwotCX0KLQotCWZvciAoc3RkOjp3c3RyaW5nOjppdGVyYXRvciBpdCA9IHdDaGFuZ2UuYmVnaW4oKTsgaXQgIT0gd0NoYW5nZS5lbmQoKTsgaXQrKykKLQl7Ci0JCWlmIChpSW5kZXhNYXNrID49IHdzdHJNYXNrLkdldExlbmd0aCgpKQotCQl7Ci0JCQlBbGVydChwQ29udGV4dCwgSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTV9UT09MT05HKS5jX3N0cigpKTsKLQkJCXBFdmVudC0+UmMoKSA9IEZBTFNFOwotCQkJcmV0dXJuIFRSVUU7Ci0JCX0KLQkJd2NoYXJfdCB3X01hc2sgPSB3c3RyTWFza1tpSW5kZXhNYXNrXTsKLQkJaWYgKCFpc1Jlc2VydmVkTWFza0NoYXIod19NYXNrKSkKLQkJewotCQkJKml0ID0gd19NYXNrOwotCQl9Ci0JCXdjaGFyX3Qgd19DaGFuZ2UgPSAqaXQ7Ci0JCWlmICghbWFza1NhdGlzZmllZCh3X0NoYW5nZSx3X01hc2spKQotCQl7Ci0JCQlwRXZlbnQtPlJjKCkgPSBGQUxTRTsKLQkJCXJldHVybiBUUlVFOwotCQl9Ci0JCWlJbmRleE1hc2srKzsKLQl9Ci0KLQl3aWRlQ2hhbmdlID0gd0NoYW5nZS5jX3N0cigpOwotCXJldHVybiBUUlVFOworICB2UmV0ID0gZERhdGU7CisgIHJldHVybiBUUlVFOwogfQogCitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNpbXBsZShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDMpIHsKKyAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICAgIEFTU0VSVChwQ29udGV4dCk7CiAKLS8vZnVuY3Rpb24gQUZTcGVjaWFsX0tleXN0cm9rZShwc2YpCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNwZWNpYWxfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0Jdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKLQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0JQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwotCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7Ci0KLQlpZiAocGFyYW1zLnNpemUoKSAhPSAxKQotCXsKLQkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQotCXN0ZDo6c3RyaW5nIGNGb3JtYXQ7Ci0JaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwotCi0JaWYoIXBFdmVudC0+bV9wVmFsdWUpCi0JCXJldHVybiBGQUxTRTsKLQkvL0NKU19WYWx1ZSB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7Ci0JQ0ZYX1dpZGVTdHJpbmcmIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsKLQlzdGQ6OnN0cmluZyBzdHJTcmMgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUodmFsKS5jX3N0cigpOwotCXN0ZDo6d3N0cmluZyB3c3RyQ2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKS5jX3N0cigpOwotCi0Jc3dpdGNoIChpSW5kZXgpCi0JewotCWNhc2UgMDoKLQkJY0Zvcm1hdCA9ICI5OTk5OSI7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJLy9jRm9ybWF0ID0gIjk5OTk5LTk5OTkiOwotCQljRm9ybWF0ID0gIjk5OTk5OTk5OSI7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJewotCQkJc3RkOjpzdHJpbmcgTnVtYmVyU3RyOwotCQkJdXRpbDo6cHJpbnR4KCI5OTk5OTk5OTk5Iiwgc3RyU3JjLE51bWJlclN0cik7Ci0JCQlpZiAoc3RyU3JjLmxlbmd0aCgpICsgd3N0ckNoYW5nZS5sZW5ndGgoKSA+IDcgKQotCQkJCS8vY0Zvcm1hdCA9ICIoOTk5KSA5OTktOTk5OSI7Ci0JCQkJY0Zvcm1hdCA9ICI5OTk5OTk5OTk5IjsKLQkJCWVsc2UKLQkJCQkvL2NGb3JtYXQgPSAiOTk5LTk5OTkiOwotCQkJCWNGb3JtYXQgPSAiOTk5OTk5OSI7Ci0JCQlicmVhazsKLQkJfQotCWNhc2UgMzoKLQkJLy9jRm9ybWF0ID0gIjk5OS05OS05OTk5IjsKLQkJY0Zvcm1hdCA9ICI5OTk5OTk5OTkiOwotCQlicmVhazsKLQl9Ci0KLQlDSlNfUGFyYW1ldGVycyBwYXJhbXMyOwotCUNKU19WYWx1ZSB2TWFzayhpc29sYXRlLCBjRm9ybWF0LmNfc3RyKCkpOwotCXBhcmFtczIucHVzaF9iYWNrKHZNYXNrKTsKLQotICAgIHJldHVybiBBRlNwZWNpYWxfS2V5c3Ryb2tlRXgoY2MscGFyYW1zMix2UmV0LHNFcnJvcik7CisgIHZSZXQgPSAoZG91YmxlKUFGX1NpbXBsZShwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc1sxXS5Ub0RvdWJsZSgpLCBwYXJhbXNbMl0uVG9Eb3VibGUoKSk7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk1lcmdlQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudEhhbmRsZXIgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0JQVNTRVJUKHBFdmVudEhhbmRsZXIgIT0gTlVMTCk7CitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk1ha2VOdW1iZXIoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7CisgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgICBBU1NFUlQocENvbnRleHQpOwogCi0JaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKLQl7Ci0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlDRlhfV2lkZVN0cmluZyBzd1ZhbHVlOwotCWlmIChwRXZlbnRIYW5kbGVyLT5tX3BWYWx1ZSAhPSBOVUxMKQotCQlzd1ZhbHVlID0gcEV2ZW50SGFuZGxlci0+VmFsdWUoKTsKLQotCWlmIChwRXZlbnRIYW5kbGVyLT5XaWxsQ29tbWl0KCkpCi0JewotCQl2UmV0ID0gc3dWYWx1ZS5jX3N0cigpOwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0KLQlDRlhfV2lkZVN0cmluZyBwcmVmaXgscG9zdGZpeDsKLQotCWlmIChwRXZlbnRIYW5kbGVyLT5TZWxTdGFydCgpID49IDApCi0JCXByZWZpeCA9IHN3VmFsdWUuTWlkKDAscEV2ZW50SGFuZGxlci0+U2VsU3RhcnQoKSk7Ci0JZWxzZQotCQlwcmVmaXggPSBMIiI7Ci0KLQotCWlmIChwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSA+PSAwICYmIHBFdmVudEhhbmRsZXItPlNlbEVuZCgpIDw9IHN3VmFsdWUuR2V0TGVuZ3RoKCkpCi0JCXBvc3RmaXggPSBzd1ZhbHVlLk1pZChwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSwgc3dWYWx1ZS5HZXRMZW5ndGgoKSAtIHBFdmVudEhhbmRsZXItPlNlbEVuZCgpKTsKLQllbHNlIHBvc3RmaXggPSBMIiI7Ci0KLQl2UmV0ID0gKHByZWZpeCArIHBFdmVudEhhbmRsZXItPkNoYW5nZSgpICsgcG9zdGZpeCkuY19zdHIoKTsKLQotCXJldHVybiBUUlVFOworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHZSZXQgPSBQYXJzZVN0cmluZ1RvTnVtYmVyKHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGUGFyc2VEYXRlRXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKLQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CitGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNpbXBsZV9DYWxjdWxhdGUoCisgICAgSUpTX0NvbnRleHQqIGNjLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBpZiAocGFyYW1zLnNpemUoKSAhPSAyKSB7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotCWlmIChwYXJhbXMuc2l6ZSgpICE9IDIpCi0JewotCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQorICBDSlNfVmFsdWUgcGFyYW1zMSA9IHBhcmFtc1sxXTsKKyAgaWYgKCFwYXJhbXMxLklzQXJyYXlPYmplY3QoKSAmJiBwYXJhbXMxLkdldFR5cGUoKSAhPSBDSlNfVmFsdWU6OlZUX3N0cmluZykgeworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLQlDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7Ci0JQ0ZYX1dpZGVTdHJpbmcgc0Zvcm1hdCA9IHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgQ1BERlNES19Eb2N1bWVudCogcFJlYWRlckRvYyA9IHBDb250ZXh0LT5HZXRSZWFkZXJEb2N1bWVudCgpOworICBDUERGU0RLX0ludGVyRm9ybSogcFJlYWRlckludGVyRm9ybSA9IHBSZWFkZXJEb2MtPkdldEludGVyRm9ybSgpOworICBDUERGX0ludGVyRm9ybSogcEludGVyRm9ybSA9IHBSZWFkZXJJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOwogCi0JRlhfQk9PTCBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKLQlkb3VibGUgZERhdGUgPSBNYWtlUmVndWxhckRhdGUoc1ZhbHVlLHNGb3JtYXQsYldyb25nRm9ybWF0KTsKKyAgQ0ZYX1dpZGVTdHJpbmcgc0Z1bmN0aW9uID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOworICBkb3VibGUgZFZhbHVlID0gd2NzY21wKHNGdW5jdGlvbi5jX3N0cigpLCBMIlBSRCIpID09IDAgPyAxLjAgOiAwLjA7CiAKLQlpZiAoSlNfUG9ydElzTmFuKGREYXRlKSkKLQl7Ci0JCUNGWF9XaWRlU3RyaW5nIHN3TXNnOwotCQlzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJTRURBVEUpLmNfc3RyKCksIHNGb3JtYXQuY19zdHIoKSk7Ci0JCUFsZXJ0KChDSlNfQ29udGV4dCAqKWNjLCBzd01zZy5jX3N0cigpKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KKyAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gQ0pTX1J1bnRpbWU6OkZyb21Db250ZXh0KGNjKTsKKyAgQ0pTX0FycmF5IEZpZWxkTmFtZUFycmF5ID0gQUZfTWFrZUFycmF5RnJvbUxpc3QocFJ1bnRpbWUsIHBhcmFtczEpOworICBpbnQgbkZpZWxkc0NvdW50ID0gMDsKIAotCXZSZXQgPSBkRGF0ZTsKLQlyZXR1cm4gVFJVRTsKLX0KKyAgZm9yIChpbnQgaSA9IDAsIGlzeiA9IEZpZWxkTmFtZUFycmF5LkdldExlbmd0aCgpOyBpIDwgaXN6OyBpKyspIHsKKyAgICBDSlNfVmFsdWUganNWYWx1ZShwUnVudGltZSk7CisgICAgRmllbGROYW1lQXJyYXkuR2V0RWxlbWVudChpLCBqc1ZhbHVlKTsKKyAgICBDRlhfV2lkZVN0cmluZyB3c0ZpZWxkTmFtZSA9IGpzVmFsdWUuVG9DRlhXaWRlU3RyaW5nKCk7CiAKLUZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU2ltcGxlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaWYgKHBhcmFtcy5zaXplKCkgIT0gMykKLQl7Ci0JCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwotCQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CisgICAgZm9yIChpbnQgaiA9IDAsIGpzeiA9IHBJbnRlckZvcm0tPkNvdW50RmllbGRzKHdzRmllbGROYW1lKTsgaiA8IGpzejsgaisrKSB7CisgICAgICBpZiAoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBwSW50ZXJGb3JtLT5HZXRGaWVsZChqLCB3c0ZpZWxkTmFtZSkpIHsKKyAgICAgICAgZG91YmxlIGRUZW1wID0gMC4wOwogCi0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0JCXJldHVybiBGQUxTRTsKLQl9CisgICAgICAgIHN3aXRjaCAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkpIHsKKyAgICAgICAgICBjYXNlIEZJRUxEVFlQRV9URVhURklFTEQ6CisgICAgICAgICAgY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6IHsKKyAgICAgICAgICAgIGRUZW1wID0gUGFyc2VTdHJpbmdUb051bWJlcihwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046IHsKKyAgICAgICAgICAgIGRUZW1wID0gMC4wOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgorICAgICAgICAgIGNhc2UgRklFTERUWVBFX1JBRElPQlVUVE9OOiB7CisgICAgICAgICAgICBkVGVtcCA9IDAuMDsKKyAgICAgICAgICAgIGZvciAoaW50IGMgPSAwLCBjc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGMgPCBjc3o7IGMrKykgeworICAgICAgICAgICAgICBpZiAoQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gcEZvcm1GaWVsZC0+R2V0Q29udHJvbChjKSkgeworICAgICAgICAgICAgICAgIGlmIChwRm9ybUN0cmwtPklzQ2hlY2tlZCgpKSB7CisgICAgICAgICAgICAgICAgICBkVGVtcCArPQorICAgICAgICAgICAgICAgICAgICAgIFBhcnNlU3RyaW5nVG9OdW1iZXIocEZvcm1DdHJsLT5HZXRFeHBvcnRWYWx1ZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBGSUVMRFRZUEVfTElTVEJPWDogeworICAgICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpID4gMSkKKyAgICAgICAgICAgICAgYnJlYWs7CiAKLQl2UmV0ID0gKGRvdWJsZSlBRl9TaW1wbGUocGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCksIHBhcmFtc1sxXS5Ub0RvdWJsZSgpLCBwYXJhbXNbMl0uVG9Eb3VibGUoKSk7Ci0JcmV0dXJuIFRSVUU7Ci19CisgICAgICAgICAgICBkVGVtcCA9IFBhcnNlU3RyaW5nVG9OdW1iZXIocEZvcm1GaWVsZC0+R2V0VmFsdWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZNYWtlTnVtYmVyKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKLQl7Ci0JCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwotCQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CisgICAgICAgIGlmIChpID09IDAgJiYgaiA9PSAwICYmICh3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiTUlOIikgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NzY21wKHNGdW5jdGlvbi5jX3N0cigpLCBMIk1BWCIpID09IDApKQorICAgICAgICAgIGRWYWx1ZSA9IGRUZW1wOwogCi0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0JdlJldCA9IFBhcnNlU3RyaW5nVG9OdW1iZXIocGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCkpOwotCXJldHVybiBUUlVFOwotfQorICAgICAgICBkVmFsdWUgPSBBRl9TaW1wbGUoc0Z1bmN0aW9uLmNfc3RyKCksIGRWYWx1ZSwgZFRlbXApOwogCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNpbXBsZV9DYWxjdWxhdGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CisgICAgICAgIG5GaWVsZHNDb3VudCsrOworICAgICAgfQorICAgIH0KKyAgfQogCi0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOworICBpZiAod2NzY21wKHNGdW5jdGlvbi5jX3N0cigpLCBMIkFWRyIpID09IDAgJiYgbkZpZWxkc0NvdW50ID4gMCkKKyAgICBkVmFsdWUgLz0gbkZpZWxkc0NvdW50OwogCi0JaWYgKHBhcmFtcy5zaXplKCkgIT0gMikKLQl7Ci0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0JCXJldHVybiBGQUxTRTsKLQl9CisgIGRWYWx1ZSA9IChkb3VibGUpZmxvb3IoZFZhbHVlICogRlhTWVNfcG93KChkb3VibGUpMTAsIChkb3VibGUpNikgKyAwLjQ5KSAvCisgICAgICAgICAgIEZYU1lTX3BvdygoZG91YmxlKTEwLCAoZG91YmxlKTYpOworICBDSlNfVmFsdWUganNWYWx1ZShwUnVudGltZSwgZFZhbHVlKTsKKyAgaWYgKHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKS0+bV9wVmFsdWUpCisgICAgcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpLT5WYWx1ZSgpID0ganNWYWx1ZS5Ub0NGWFdpZGVTdHJpbmcoKTsKIAotCUNKU19WYWx1ZSBwYXJhbXMxID0gcGFyYW1zWzFdOwotCi0JaWYgKCFwYXJhbXMxLklzQXJyYXlPYmplY3QoKSAmJiBwYXJhbXMxLkdldFR5cGUoKSAhPSBWVF9zdHJpbmcpCi0JewotCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCi0JQ1BERlNES19Eb2N1bWVudCogcFJlYWRlckRvYyA9IHBDb250ZXh0LT5HZXRSZWFkZXJEb2N1bWVudCgpOwotICAgIEFTU0VSVChwUmVhZGVyRG9jICE9IE5VTEwpOwotCi0JQ1BERlNES19JbnRlckZvcm0qIHBSZWFkZXJJbnRlckZvcm0gPSBwUmVhZGVyRG9jLT5HZXRJbnRlckZvcm0oKTsKLQlBU1NFUlQocFJlYWRlckludGVyRm9ybSAhPSBOVUxMKTsKLQotCUNQREZfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFJlYWRlckludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7Ci0JQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7Ci0KLQlkb3VibGUgZFZhbHVlOwotCUNGWF9XaWRlU3RyaW5nIHNGdW5jdGlvbiA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKLQlpZiAod2NzY21wKHNGdW5jdGlvbi5jX3N0cigpLCBMIlBSRCIpID09IDApCi0gICAgCWRWYWx1ZSA9IDEuMDsKLQllbHNlCi0JCWRWYWx1ZSA9IDAuMDsKLQotCUNKU19BcnJheSBGaWVsZE5hbWVBcnJheSA9IEFGX01ha2VBcnJheUZyb21MaXN0KGlzb2xhdGUscGFyYW1zMSk7Ci0KLQlpbnQgbkZpZWxkc0NvdW50ID0gMDsKLQotCWZvciAoaW50IGk9MCxpc3o9RmllbGROYW1lQXJyYXkuR2V0TGVuZ3RoKCk7IGk8aXN6OyBpKyspCi0JewotCQlDSlNfVmFsdWUganNWYWx1ZShpc29sYXRlKTsKLQkJRmllbGROYW1lQXJyYXkuR2V0RWxlbWVudChpLGpzVmFsdWUpOwotCQlDRlhfV2lkZVN0cmluZyB3c0ZpZWxkTmFtZSA9IGpzVmFsdWUuVG9DRlhXaWRlU3RyaW5nKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaj0wLGpzej1wSW50ZXJGb3JtLT5Db3VudEZpZWxkcyh3c0ZpZWxkTmFtZSk7IGo8anN6OyBqKyspCi0JCXsKLQkJCWlmIChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IHBJbnRlckZvcm0tPkdldEZpZWxkKGosIHdzRmllbGROYW1lKSkKLQkJCXsKLQkJCQlkb3VibGUgZFRlbXAgPSAwLjA7Ci0KLQkJCQlzd2l0Y2ggKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpKQotCQkJCXsKLQkJCQljYXNlIEZJRUxEVFlQRV9URVhURklFTEQ6Ci0JCQkJY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6Ci0JCQkJCXsKLQkJCQkJCWRUZW1wID0gUGFyc2VTdHJpbmdUb051bWJlcihwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpLmNfc3RyKCkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQljYXNlIEZJRUxEVFlQRV9QVVNIQlVUVE9OOgotCQkJCQl7Ci0JCQkJCQlkVGVtcCA9IDAuMDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJY2FzZSBGSUVMRFRZUEVfQ0hFQ0tCT1g6Ci0JCQkJY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046Ci0JCQkJCXsKLQkJCQkJCWRUZW1wID0gMC4wOwotCQkJCQkJZm9yIChpbnQgYz0wLGNzej1wRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGM8Y3N6OyBjKyspCi0JCQkJCQl7Ci0JCQkJCQkJaWYgKENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woYykpCi0JCQkJCQkJewotCQkJCQkJCQlpZiAocEZvcm1DdHJsLT5Jc0NoZWNrZWQoKSkKLQkJCQkJCQkJewotCQkJCQkJCQkJZFRlbXAgKz0gUGFyc2VTdHJpbmdUb051bWJlcihwRm9ybUN0cmwtPkdldEV4cG9ydFZhbHVlKCkuY19zdHIoKSk7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlCi0JCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCWNhc2UgRklFTERUWVBFX0xJU1RCT1g6Ci0JCQkJCXsKLQkJCQkJCWRUZW1wID0gMC4wOwotCQkJCQkJaWYgKHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpID4gMSkKLQkJCQkJCQlicmVhazsKLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlkVGVtcCA9IFBhcnNlU3RyaW5nVG9OdW1iZXIocEZvcm1GaWVsZC0+R2V0VmFsdWUoKS5jX3N0cigpKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCWRlZmF1bHQ6Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWlmIChpID09IDAgJiYgaiA9PSAwICYmICh3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiTUlOIikgPT0gMCB8fCB3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiTUFYIikgPT0gMCkpCi0JCQkJCWRWYWx1ZSA9IGRUZW1wOwotCi0JCQkJZFZhbHVlID0gQUZfU2ltcGxlKHNGdW5jdGlvbi5jX3N0cigpLCBkVmFsdWUsIGRUZW1wKTsKLQotCQkJCW5GaWVsZHNDb3VudCsrOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKHdjc2NtcChzRnVuY3Rpb24uY19zdHIoKSwgTCJBVkciKSA9PSAwICYmIG5GaWVsZHNDb3VudCA+IDApCi0JCWRWYWx1ZSAvPSBuRmllbGRzQ291bnQ7Ci0KLQlkVmFsdWUgPSAoZG91YmxlKWZsb29yKGRWYWx1ZSAqIEZYU1lTX3BvdygoZG91YmxlKTEwLChkb3VibGUpNikgKyAwLjQ5KSAvIEZYU1lTX3BvdygoZG91YmxlKTEwLChkb3VibGUpNik7Ci0JQ0pTX1ZhbHVlIGpzVmFsdWUoaXNvbGF0ZSxkVmFsdWUpOwotCWlmKChDSlNfRXZlbnRIYW5kbGVyKilwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCktPm1fcFZhbHVlKQotCQkoKENKU19FdmVudEhhbmRsZXIqKXBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKSktPlZhbHVlKCkgPSBqc1ZhbHVlLlRvQ0ZYV2lkZVN0cmluZygpOwotCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCiAvKiBUaGlzIGZ1bmN0aW9uIHZhbGlkYXRlcyB0aGUgY3VycmVudCBldmVudCB0byBlbnN1cmUgdGhhdCBpdHMgdmFsdWUgaXMKICoqIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLiAqLwogCi1GWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlJhbmdlX1ZhbGlkYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKLQlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOworRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZSYW5nZV9WYWxpZGF0ZSgKKyAgICBJSlNfQ29udGV4dCogY2MsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKIAotCWlmIChwYXJhbXMuc2l6ZSgpICE9IDQpCi0JewotCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQorICBpZiAocGFyYW1zLnNpemUoKSAhPSA0KSB7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotCWlmKCFwRXZlbnQtPm1fcFZhbHVlKQotCQlyZXR1cm4gRkFMU0U7Ci0JaWYgKHBFdmVudC0+VmFsdWUoKS5Jc0VtcHR5KCkgKQotCQlyZXR1cm4gVFJVRTsKLQlkb3VibGUgZEVlbnRWYWx1ZSA9IGF0b2YoQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHBFdmVudC0+VmFsdWUoKSkpOwotCUZYX0JPT0wgYkdyZWF0ZXJUaGFuID0gcGFyYW1zWzBdLlRvQm9vbCgpOwotCWRvdWJsZSBkR3JlYXRlclRoYW4gPSBwYXJhbXNbMV0uVG9Eb3VibGUoKTsKLQlGWF9CT09MIGJMZXNzVGhhbiA9IHBhcmFtc1syXS5Ub0Jvb2woKTsKLQlkb3VibGUgZExlc3NUaGFuID0gcGFyYW1zWzNdLlRvRG91YmxlKCk7Ci0JQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7CisgIGlmICghcEV2ZW50LT5tX3BWYWx1ZSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmIChwRXZlbnQtPlZhbHVlKCkuSXNFbXB0eSgpKQorICAgIHJldHVybiBUUlVFOworICBkb3VibGUgZEVlbnRWYWx1ZSA9IGF0b2YoQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHBFdmVudC0+VmFsdWUoKSkpOworICBGWF9CT09MIGJHcmVhdGVyVGhhbiA9IHBhcmFtc1swXS5Ub0Jvb2woKTsKKyAgZG91YmxlIGRHcmVhdGVyVGhhbiA9IHBhcmFtc1sxXS5Ub0RvdWJsZSgpOworICBGWF9CT09MIGJMZXNzVGhhbiA9IHBhcmFtc1syXS5Ub0Jvb2woKTsKKyAgZG91YmxlIGRMZXNzVGhhbiA9IHBhcmFtc1szXS5Ub0RvdWJsZSgpOworICBDRlhfV2lkZVN0cmluZyBzd01zZzsKIAotCWlmIChiR3JlYXRlclRoYW4gJiYgYkxlc3NUaGFuKQotCXsKLQkJaWYgKGRFZW50VmFsdWUgPCBkR3JlYXRlclRoYW4gfHwgZEVlbnRWYWx1ZSA+IGRMZXNzVGhhbikKLQkJCXN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1JBTkdFMSkuY19zdHIoKSwKLQkJCQkJCSBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSwKLQkJCQkJCSBwYXJhbXNbM10uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7Ci0JfQotCWVsc2UgaWYgKGJHcmVhdGVyVGhhbikKLQl7Ci0JCWlmIChkRWVudFZhbHVlIDwgZEdyZWF0ZXJUaGFuKQotCQkJc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkFOR0UyKS5jX3N0cigpLAotCQkJCQkJIHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKLQl9Ci0JZWxzZSBpZiAoYkxlc3NUaGFuKQotCXsKLQkJaWYgKGRFZW50VmFsdWUgPiBkTGVzc1RoYW4pCi0JCQlzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSQU5HRTMpLmNfc3RyKCksCi0JCQkJCQkgcGFyYW1zWzNdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCkpOwotCX0KKyAgaWYgKGJHcmVhdGVyVGhhbiAmJiBiTGVzc1RoYW4pIHsKKyAgICBpZiAoZEVlbnRWYWx1ZSA8IGRHcmVhdGVyVGhhbiB8fCBkRWVudFZhbHVlID4gZExlc3NUaGFuKQorICAgICAgc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkFOR0UxKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgIHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgIHBhcmFtc1szXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKKyAgfSBlbHNlIGlmIChiR3JlYXRlclRoYW4pIHsKKyAgICBpZiAoZEVlbnRWYWx1ZSA8IGRHcmVhdGVyVGhhbikKKyAgICAgIHN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1JBTkdFMikuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7CisgIH0gZWxzZSBpZiAoYkxlc3NUaGFuKSB7CisgICAgaWYgKGRFZW50VmFsdWUgPiBkTGVzc1RoYW4pCisgICAgICBzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSQU5HRTMpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgcGFyYW1zWzNdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCkpOworICB9CiAKLQlpZiAoIXN3TXNnLklzRW1wdHkoKSkKLQl7Ci0JCUFsZXJ0KHBDb250ZXh0LCBzd01zZy5jX3N0cigpKTsKLQkJcEV2ZW50LT5SYygpID0gRkFMU0U7Ci0JfQotCXJldHVybiBUUlVFOworICBpZiAoIXN3TXNnLklzRW1wdHkoKSkgeworICAgIEFsZXJ0KHBDb250ZXh0LCBzd01zZy5jX3N0cigpKTsKKyAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZFeHRyYWN0TnVtcyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKK0ZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRXh0cmFjdE51bXMoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotCWlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCi0JewotCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQorICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBDSlNfUnVudGltZTo6RnJvbUNvbnRleHQoY2MpOworICBDSlNfQXJyYXkgbnVtcyhwUnVudGltZSk7CiAKLQlDSlNfQXJyYXkgbnVtcyhpc29sYXRlKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgc3RyID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOworICBDRlhfV2lkZVN0cmluZyBzUGFydDsKIAotCUNGWF9XaWRlU3RyaW5nIHN0ciA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKLQlDRlhfV2lkZVN0cmluZyBzUGFydDsKKyAgaWYgKHN0ci5HZXRBdCgwKSA9PSBMJy4nIHx8IHN0ci5HZXRBdCgwKSA9PSBMJywnKQorICAgIHN0ciA9IEwiMCIgKyBzdHI7CiAKLQlpZiAoc3RyLkdldEF0KDApID09IEwnLicgfHwgc3RyLkdldEF0KDApID09IEwnLCcpCi0JCXN0ciA9IEwiMCIgKyBzdHI7CisgIGludCBuSW5kZXggPSAwOworICBmb3IgKGludCBpID0gMCwgc3ogPSBzdHIuR2V0TGVuZ3RoKCk7IGkgPCBzejsgaSsrKSB7CisgICAgRlhfV0NIQVIgd2MgPSBzdHIuR2V0QXQoaSk7CisgICAgaWYgKEZYU1lTX2lzd2RpZ2l0KHdjKSkgeworICAgICAgc1BhcnQgKz0gd2M7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChzUGFydC5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgbnVtcy5TZXRFbGVtZW50KG5JbmRleCwgQ0pTX1ZhbHVlKHBSdW50aW1lLCBzUGFydC5jX3N0cigpKSk7CisgICAgICAgIHNQYXJ0ID0gTCIiOworICAgICAgICBuSW5kZXgrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KIAotCWludCBuSW5kZXggPSAwOwotCWZvciAoaW50IGk9MCwgc3o9c3RyLkdldExlbmd0aCgpOyBpPHN6OyBpKyspCi0JewotCQlGWF9XQ0hBUiB3YyA9IHN0ci5HZXRBdChpKTsKLQkJaWYgKElzRGlnaXQoKHdjaGFyX3Qpd2MpKQotCQl7Ci0JCQlzUGFydCArPSB3YzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChzUGFydC5HZXRMZW5ndGgoKSA+IDApCi0JCQl7Ci0JCQkJbnVtcy5TZXRFbGVtZW50KG5JbmRleCxDSlNfVmFsdWUoaXNvbGF0ZSxzUGFydC5jX3N0cigpKSk7Ci0JCQkJc1BhcnQgPSBMIiI7Ci0JCQkJbkluZGV4ICsrOwotCQkJfQotCQl9Ci0JfQorICBpZiAoc1BhcnQuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgbnVtcy5TZXRFbGVtZW50KG5JbmRleCwgQ0pTX1ZhbHVlKHBSdW50aW1lLCBzUGFydC5jX3N0cigpKSk7CisgIH0KIAotCWlmIChzUGFydC5HZXRMZW5ndGgoKSA+IDApCi0JewotCQludW1zLlNldEVsZW1lbnQobkluZGV4LENKU19WYWx1ZShpc29sYXRlLHNQYXJ0LmNfc3RyKCkpKTsKLQl9CisgIGlmIChudW1zLkdldExlbmd0aCgpID4gMCkKKyAgICB2UmV0ID0gbnVtczsKKyAgZWxzZQorICAgIHZSZXQuU2V0TnVsbCgpOwogCi0JaWYgKG51bXMuR2V0TGVuZ3RoKCkgPiAwKQotCQl2UmV0ID0gbnVtczsKLQllbHNlCi0JCXZSZXQuU2V0TnVsbCgpOwotCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmggYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTNjNGNlCi0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmgKQEAgLTAsMCArMSwxODEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGUERGU0RLX1NSQ19KQVZBU0NSSVBUX1BVQkxJQ01FVEhPRFNfSF8KKyNkZWZpbmUgRlBERlNES19TUkNfSkFWQVNDUklQVF9QVUJMSUNNRVRIT0RTX0hfCisKKyNpbmNsdWRlICJKU19EZWZpbmUuaCIKKworY2xhc3MgQ0pTX1B1YmxpY01ldGhvZHMgOiBwdWJsaWMgQ0pTX09iamVjdCB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlNfUHVibGljTWV0aG9kcyh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkKKyAgICAgIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQorICB+Q0pTX1B1YmxpY01ldGhvZHMoKSBvdmVycmlkZSB7fQorCisgcHVibGljOgorICBzdGF0aWMgRlhfQk9PTCBBRk51bWJlcl9Gb3JtYXQoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIHN0YXRpYyBGWF9CT09MIEFGTnVtYmVyX0tleXN0cm9rZShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgc3RhdGljIEZYX0JPT0wgQUZQZXJjZW50X0Zvcm1hdChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgc3RhdGljIEZYX0JPT0wgQUZQZXJjZW50X0tleXN0cm9rZShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgc3RhdGljIEZYX0JPT0wgQUZEYXRlX0Zvcm1hdEV4KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBzdGF0aWMgRlhfQk9PTCBBRkRhdGVfS2V5c3Ryb2tlRXgoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIHN0YXRpYyBGWF9CT09MIEFGRGF0ZV9Gb3JtYXQoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIHN0YXRpYyBGWF9CT09MIEFGRGF0ZV9LZXlzdHJva2UoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIHN0YXRpYyBGWF9CT09MIEFGVGltZV9Gb3JtYXRFeChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsgIC8vCisgIHN0YXRpYyBGWF9CT09MIEFGVGltZV9LZXlzdHJva2VFeChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgc3RhdGljIEZYX0JPT0wgQUZUaW1lX0Zvcm1hdChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgc3RhdGljIEZYX0JPT0wgQUZUaW1lX0tleXN0cm9rZShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgc3RhdGljIEZYX0JPT0wgQUZTcGVjaWFsX0Zvcm1hdChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgc3RhdGljIEZYX0JPT0wgQUZTcGVjaWFsX0tleXN0cm9rZShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgc3RhdGljIEZYX0JPT0wgQUZTcGVjaWFsX0tleXN0cm9rZUV4KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOyAgLy8KKyAgc3RhdGljIEZYX0JPT0wgQUZTaW1wbGUoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIHN0YXRpYyBGWF9CT09MIEFGTWFrZU51bWJlcihJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgc3RhdGljIEZYX0JPT0wgQUZTaW1wbGVfQ2FsY3VsYXRlKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBzdGF0aWMgRlhfQk9PTCBBRlJhbmdlX1ZhbGlkYXRlKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBzdGF0aWMgRlhfQk9PTCBBRk1lcmdlQ2hhbmdlKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBzdGF0aWMgRlhfQk9PTCBBRlBhcnNlRGF0ZUV4KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBzdGF0aWMgRlhfQk9PTCBBRkV4dHJhY3ROdW1zKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCisgcHVibGljOgorICBKU19TVEFUSUNfR0xPQkFMX0ZVTihBRk51bWJlcl9Gb3JtYXQpOworICBKU19TVEFUSUNfR0xPQkFMX0ZVTihBRk51bWJlcl9LZXlzdHJva2UpOworICBKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlBlcmNlbnRfRm9ybWF0KTsKKyAgSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZQZXJjZW50X0tleXN0cm9rZSk7CisgIEpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGRGF0ZV9Gb3JtYXRFeCk7CisgIEpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGRGF0ZV9LZXlzdHJva2VFeCk7CisgIEpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGRGF0ZV9Gb3JtYXQpOworICBKU19TVEFUSUNfR0xPQkFMX0ZVTihBRkRhdGVfS2V5c3Ryb2tlKTsKKyAgSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZUaW1lX0Zvcm1hdEV4KTsKKyAgSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZUaW1lX0tleXN0cm9rZUV4KTsKKyAgSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZUaW1lX0Zvcm1hdCk7CisgIEpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGVGltZV9LZXlzdHJva2UpOworICBKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlNwZWNpYWxfRm9ybWF0KTsKKyAgSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZTcGVjaWFsX0tleXN0cm9rZSk7CisgIEpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGU3BlY2lhbF9LZXlzdHJva2VFeCk7CisgIEpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGU2ltcGxlKTsKKyAgSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZNYWtlTnVtYmVyKTsKKyAgSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZTaW1wbGVfQ2FsY3VsYXRlKTsKKyAgSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZSYW5nZV9WYWxpZGF0ZSk7CisgIEpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGTWVyZ2VDaGFuZ2UpOworICBKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlBhcnNlRGF0ZUV4KTsKKyAgSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZFeHRyYWN0TnVtcyk7CisKKyAgSlNfU1RBVElDX0RFQ0xBUkVfR0xPQkFMX0ZVTigpOworCisgcHVibGljOgorICBzdGF0aWMgaW50IFBhcnNlU3RyaW5nSW50ZWdlcihjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5Ta2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbk1heFN0ZXApOworICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgUGFyc2VTdHJpbmdTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5Ta2lwKTsKKyAgc3RhdGljIGRvdWJsZSBNYWtlUmVndWxhckRhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBiV3JvbmdGb3JtYXQpOworICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgTWFrZUZvcm1hdERhdGUoZG91YmxlIGREYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZvcm1hdCk7CisgIHN0YXRpYyBGWF9CT09MIENvbnZlcnRTdHJpbmdUb051bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUmIGRSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRG90KTsKKyAgc3RhdGljIGRvdWJsZSBQYXJzZVN0cmluZ1RvTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzd1NvdXJjZSk7CisgIHN0YXRpYyBkb3VibGUgUGFyc2VOb3JtYWxEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogYldyb25nRm9ybWF0KTsKKyAgc3RhdGljIGRvdWJsZSBNYWtlSW50ZXJEYXRlKENGWF9XaWRlU3RyaW5nIHN0clZhbHVlKTsKKyAgc3RhdGljIGRvdWJsZSBQYXJzZU51bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkFsbERpZ2l0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJTaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJLWEpTKTsKKworIHB1YmxpYzoKKyAgc3RhdGljIENGWF9XaWRlU3RyaW5nIFN0ckxUcmltKGNvbnN0IEZYX1dDSEFSKiBwU3RyKTsKKyAgc3RhdGljIENGWF9XaWRlU3RyaW5nIFN0clJUcmltKGNvbnN0IEZYX1dDSEFSKiBwU3RyKTsKKyAgc3RhdGljIENGWF9XaWRlU3RyaW5nIFN0clRyaW0oY29uc3QgRlhfV0NIQVIqIHBTdHIpOworCisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBTdHJMVHJpbShjb25zdCBGWF9DSEFSKiBwU3RyKTsKKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIFN0clJUcmltKGNvbnN0IEZYX0NIQVIqIHBTdHIpOworICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgU3RyVHJpbShjb25zdCBGWF9DSEFSKiBwU3RyKTsKKworICBzdGF0aWMgRlhfQk9PTCBJc051bWJlcihjb25zdCBGWF9DSEFSKiBzdHJpbmcpOworICBzdGF0aWMgRlhfQk9PTCBJc051bWJlcihjb25zdCBGWF9XQ0hBUiogc3RyaW5nKTsKKworICBzdGF0aWMgRlhfQk9PTCBtYXNrU2F0aXNmaWVkKHdjaGFyX3QgY19DaGFuZ2UsIHdjaGFyX3QgY19NYXNrKTsKKyAgc3RhdGljIEZYX0JPT0wgaXNSZXNlcnZlZE1hc2tDaGFyKHdjaGFyX3QgY2gpOworCisgIHN0YXRpYyBkb3VibGUgQUZfU2ltcGxlKGNvbnN0IEZYX1dDSEFSKiBzRnVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRWYWx1ZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkVmFsdWUyKTsKKyAgc3RhdGljIENKU19BcnJheSBBRl9NYWtlQXJyYXlGcm9tTGlzdChDSlNfUnVudGltZSogcFJ1bnRpbWUsIENKU19WYWx1ZSB2YWwpOworfTsKKworI2VuZGlmICAvLyBGUERGU0RLX1NSQ19KQVZBU0NSSVBUX1BVQkxJQ01FVEhPRFNfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvYXBwLmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvYXBwLmNwcAppbmRleCA4OTY2MjI4Li4xNDczZWRiIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2FwcC5jcHAKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9hcHAuY3BwCkBAIC00LDMxICs0LDIwIEBACiAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSmF2YVNjcmlwdC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19EZWZpbmUuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1ZhbHVlLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L2FwcC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvcmVzb3VyY2UuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19SdW50aW1lLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0RvY3VtZW50LmgiCisjaW5jbHVkZSAiYXBwLmgiCiAKKyNpbmNsdWRlIDxtZW1vcnk+CiAKLXN0YXRpYyB2ODo6SXNvbGF0ZSogR2V0SXNvbGF0ZShJRlhKU19Db250ZXh0KiBjYykKLXsKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKLQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0KLQlDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7Ci0JQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOwotCi0JcmV0dXJuIHBSdW50aW1lLT5HZXRJc29sYXRlKCk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGltZXJPYmogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiSlNfQ29udGV4dC5oIgorI2luY2x1ZGUgIkpTX0RlZmluZS5oIgorI2luY2x1ZGUgIkpTX0V2ZW50SGFuZGxlci5oIgorI2luY2x1ZGUgIkpTX09iamVjdC5oIgorI2luY2x1ZGUgIkpTX1J1bnRpbWUuaCIKKyNpbmNsdWRlICJKU19WYWx1ZS5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9mc2RrX21nci5oIiAgLy8gRm9yIENQREZEb2NfRW52aXJvbm1lbnQuCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCIKKyNpbmNsdWRlICJyZXNvdXJjZS5oIgogCiBCRUdJTl9KU19TVEFUSUNfQ09OU1QoQ0pTX1RpbWVyT2JqKQogRU5EX0pTX1NUQVRJQ19DT05TVCgpCkBAIC00Miw4ODYgKzMxLDgwMyBAQAogSU1QTEVNRU5UX0pTX0NMQVNTKENKU19UaW1lck9iaiwgVGltZXJPYmopCiAKIFRpbWVyT2JqOjpUaW1lck9iaihDSlNfT2JqZWN0KiBwSlNPYmplY3QpCi06IENKU19FbWJlZE9iaihwSlNPYmplY3QpLAotbV9wVGltZXIoTlVMTCkKLXsKKyAgICA6IENKU19FbWJlZE9iaihwSlNPYmplY3QpLCBtX3BUaW1lcihOVUxMKSB7fQogCitUaW1lck9iajo6flRpbWVyT2JqKCkge30KKwordm9pZCBUaW1lck9iajo6U2V0VGltZXIoQ0pTX1RpbWVyKiBwVGltZXIpIHsKKyAgbV9wVGltZXIgPSBwVGltZXI7CiB9CiAKLVRpbWVyT2JqOjp+VGltZXJPYmooKQoteworQ0pTX1RpbWVyKiBUaW1lck9iajo6R2V0VGltZXIoKSBjb25zdCB7CisgIHJldHVybiBtX3BUaW1lcjsKIH0KIAotdm9pZCBUaW1lck9iajo6U2V0VGltZXIoQ0pTX1RpbWVyKiBwVGltZXIpCi17Ci0JbV9wVGltZXIgPSBwVGltZXI7Ci19Ci0KLUNKU19UaW1lciogVGltZXJPYmo6OkdldFRpbWVyKCkgY29uc3QKLXsKLQlyZXR1cm4gbV9wVGltZXI7Ci19Ci0KLSNkZWZpbmUgSlNfU1RSX1ZJRVdFUlRZUEVfUkVBREVSCQlMIlJlYWRlciIKLSNkZWZpbmUgSlNfU1RSX1ZJRVdFUlRZUEVfU1RBTkRBUkQJCUwiRXhjaGFuZ2UiCi0jZGVmaW5lIEpTX1NUUl9WSUVXRVJWQVJJQVRJT04JCQlMIkZ1bGwiCi0jZGVmaW5lIEpTX1NUUl9QTEFURk9STQkJCQkJTCJXSU4iCi0jZGVmaW5lIEpTX1NUUl9MQU5HVUFOR0UJCQkJTCJFTlUiCi0jZGVmaW5lIEpTX1NUUl9WSUVXRVJWRVJTSU9OCQkJOAotI2RlZmluZSBKU19OVU1fRk9STVNWRVJTSU9OCQkJCTcKLQotI2RlZmluZSBKU19GSUxFUEFUSF9NQVhMRU4JCQkJMjAwMAotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGFwcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIEpTX1NUUl9WSUVXRVJUWVBFIEwicGRmaXVtIgorI2RlZmluZSBKU19TVFJfVklFV0VSVkFSSUFUSU9OIEwiRnVsbCIKKyNkZWZpbmUgSlNfU1RSX1BMQVRGT1JNIEwiV0lOIgorI2RlZmluZSBKU19TVFJfTEFOR1VBTkdFIEwiRU5VIgorI2RlZmluZSBKU19OVU1fVklFV0VSVkVSU0lPTiA4CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyNkZWZpbmUgSlNfTlVNX1ZJRVdFUlZFUlNJT05fWEZBIDExCisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisjZGVmaW5lIEpTX05VTV9GT1JNU1ZFUlNJT04gNwogCiBCRUdJTl9KU19TVEFUSUNfQ09OU1QoQ0pTX0FwcCkKIEVORF9KU19TVEFUSUNfQ09OU1QoKQogCiBCRUdJTl9KU19TVEFUSUNfUFJPUChDSlNfQXBwKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGFjdGl2ZURvY3MpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoY2FsY3VsYXRlKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGZvcm1zVmVyc2lvbikKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShmcykKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShmdWxsc2NyZWVuKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGxhbmd1YWdlKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKG1lZGlhKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHBsYXRmb3JtKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHJ1bnRpbWVIaWdobGlnaHQpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkodmlld2VyVHlwZSkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWSh2aWV3ZXJWYXJpYXRpb24pCi0JSlNfU1RBVElDX1BST1BfRU5UUlkodmlld2VyVmVyc2lvbikKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGFjdGl2ZURvY3MpCitKU19TVEFUSUNfUFJPUF9FTlRSWShjYWxjdWxhdGUpCitKU19TVEFUSUNfUFJPUF9FTlRSWShmb3Jtc1ZlcnNpb24pCitKU19TVEFUSUNfUFJPUF9FTlRSWShmcykKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGZ1bGxzY3JlZW4pCitKU19TVEFUSUNfUFJPUF9FTlRSWShsYW5ndWFnZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKG1lZGlhKQorSlNfU1RBVElDX1BST1BfRU5UUlkocGxhdGZvcm0pCitKU19TVEFUSUNfUFJPUF9FTlRSWShydW50aW1lSGlnaGxpZ2h0KQorSlNfU1RBVElDX1BST1BfRU5UUlkodmlld2VyVHlwZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHZpZXdlclZhcmlhdGlvbikKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHZpZXdlclZlcnNpb24pCiBFTkRfSlNfU1RBVElDX1BST1AoKQogCiBCRUdJTl9KU19TVEFUSUNfTUVUSE9EKENKU19BcHApCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShhbGVydCkKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGJlZXApCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShicm93c2VGb3JEb2MpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShjbGVhckludGVydmFsKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoY2xlYXJUaW1lT3V0KQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZXhlY0RpYWxvZykKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGV4ZWNNZW51SXRlbSkKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGZpbmRDb21wb25lbnQpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShnb0JhY2spCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShnb0ZvcndhcmQpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShsYXVuY2hVUkwpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShtYWlsTXNnKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkobmV3RkRGKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkobmV3RG9jKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkob3BlbkRvYykKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKG9wZW5GREYpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShwb3BVcE1lbnVFeCkKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHBvcFVwTWVudSkKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHJlc3BvbnNlKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc2V0SW50ZXJ2YWwpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShzZXRUaW1lT3V0KQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShhbGVydCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoYmVlcCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoYnJvd3NlRm9yRG9jKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShjbGVhckludGVydmFsKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShjbGVhclRpbWVPdXQpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGV4ZWNEaWFsb2cpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGV4ZWNNZW51SXRlbSkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZmluZENvbXBvbmVudCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZ29CYWNrKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShnb0ZvcndhcmQpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGxhdW5jaFVSTCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkobWFpbE1zZykKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkobmV3RkRGKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShuZXdEb2MpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKG9wZW5Eb2MpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKG9wZW5GREYpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHBvcFVwTWVudUV4KQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShwb3BVcE1lbnUpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHJlc3BvbnNlKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShzZXRJbnRlcnZhbCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc2V0VGltZU91dCkKIEVORF9KU19TVEFUSUNfTUVUSE9EKCkKIAotSU1QTEVNRU5UX0pTX0NMQVNTKENKU19BcHAsYXBwKQorSU1QTEVNRU5UX0pTX0NMQVNTKENKU19BcHAsIGFwcCkKIAotYXBwOjphcHAoQ0pTX09iamVjdCAqIHBKU09iamVjdCkgOiBDSlNfRW1iZWRPYmoocEpTT2JqZWN0KSAsCi0JbV9iQ2FsY3VsYXRlKHRydWUpLAotCW1fYlJ1bnRpbWVIaWdoTGlnaHQoZmFsc2UpCi0vLwltX3BNZW51SGVhZChOVUxMKQoteworYXBwOjphcHAoQ0pTX09iamVjdCogcEpTT2JqZWN0KQorICAgIDogQ0pTX0VtYmVkT2JqKHBKU09iamVjdCksIG1fYkNhbGN1bGF0ZSh0cnVlKSwgbV9iUnVudGltZUhpZ2hMaWdodChmYWxzZSkge30KKworYXBwOjp+YXBwKCkgeworICBmb3IgKGludCBpID0gMCwgc3ogPSBtX2FUaW1lci5HZXRTaXplKCk7IGkgPCBzejsgaSsrKQorICAgIGRlbGV0ZSBtX2FUaW1lcltpXTsKKworICBtX2FUaW1lci5SZW1vdmVBbGwoKTsKIH0KIAotYXBwOjp+YXBwKHZvaWQpCi17Ci0JZm9yIChpbnQgaT0wLHN6PW1fYVRpbWVyLkdldFNpemUoKTsgaTxzejsgaSsrKQotCQlkZWxldGUgbV9hVGltZXJbaV07CitGWF9CT09MIGFwcDo6YWN0aXZlRG9jcyhJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQltX2FUaW1lci5SZW1vdmVBbGwoKTsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCA9IHBDb250ZXh0LT5HZXRSZWFkZXJBcHAoKTsKKyAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOworICBDUERGU0RLX0RvY3VtZW50KiBwQ3VyRG9jID0gcENvbnRleHQtPkdldFJlYWRlckRvY3VtZW50KCk7CisgIENKU19BcnJheSBhRG9jcyhwUnVudGltZSk7CisgIGlmIChDUERGU0RLX0RvY3VtZW50KiBwRG9jID0gcEFwcC0+R2V0U0RLRG9jdW1lbnQoKSkgeworICAgIENKU19Eb2N1bWVudCogcEpTRG9jdW1lbnQgPSBOVUxMOworICAgIGlmIChwRG9jID09IHBDdXJEb2MpIHsKKyAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqID0gRlhKU19HZXRUaGlzT2JqKHBSdW50aW1lLT5HZXRJc29sYXRlKCkpOworICAgICAgaWYgKEZYSlNfR2V0T2JqRGVmbklEKHBPYmopID09IENKU19Eb2N1bWVudDo6Z19uT2JqRGVmbklEKQorICAgICAgICBwSlNEb2N1bWVudCA9CisgICAgICAgICAgICAoQ0pTX0RvY3VtZW50KilGWEpTX0dldFByaXZhdGUocFJ1bnRpbWUtPkdldElzb2xhdGUoKSwgcE9iaik7CisgICAgfSBlbHNlIHsKKyAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqID0gRlhKU19OZXdGeER5bmFtaWNPYmooCisgICAgICAgICAgcFJ1bnRpbWUtPkdldElzb2xhdGUoKSwgcFJ1bnRpbWUsIENKU19Eb2N1bWVudDo6Z19uT2JqRGVmbklEKTsKKyAgICAgIHBKU0RvY3VtZW50ID0KKyAgICAgICAgICAoQ0pTX0RvY3VtZW50KilGWEpTX0dldFByaXZhdGUocFJ1bnRpbWUtPkdldElzb2xhdGUoKSwgcE9iaik7CisgICAgICBBU1NFUlQocEpTRG9jdW1lbnQpOworICAgIH0KKyAgICBhRG9jcy5TZXRFbGVtZW50KDAsIENKU19WYWx1ZShwUnVudGltZSwgcEpTRG9jdW1lbnQpKTsKKyAgfQorICBpZiAoYURvY3MuR2V0TGVuZ3RoKCkgPiAwKQorICAgIHZwIDw8IGFEb2NzOworICBlbHNlCisgICAgdnAuU2V0TnVsbCgpOworCisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGFwcDo6YWN0aXZlRG9jcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaWYgKHZwLklzR2V0dGluZygpKQotCXsKK0ZYX0JPT0wgYXBwOjpjYWxjdWxhdGUoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICBib29sIGJWUDsKKyAgICB2cCA+PiBiVlA7CisgICAgbV9iQ2FsY3VsYXRlID0gKEZYX0JPT0wpYlZQOwogCi0JCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwotCQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0KLQkJQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCA9IHBDb250ZXh0LT5HZXRSZWFkZXJBcHAoKTsKLQkJQVNTRVJUKHBBcHAgIT0gTlVMTCk7Ci0KLQkJQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwotCQlBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7Ci0KLQkJQ1BERlNES19Eb2N1bWVudCogcEN1ckRvYyA9IHBDb250ZXh0LT5HZXRSZWFkZXJEb2N1bWVudCgpOwotCi0JCUNKU19BcnJheSBhRG9jcyhwUnVudGltZS0+R2V0SXNvbGF0ZSgpKTsKLS8vCQlpbnQgaU51bURvY3MgPSBwQXBwLT5Db3VudERvY3VtZW50cygpOwotCi0vLyAJCWZvcihpbnQgaUluZGV4ID0gMDsgaUluZGV4PGlOdW1Eb2NzOyBpSW5kZXgrKykKLS8vIAkJewotCQkJQ1BERlNES19Eb2N1bWVudCogcERvYyA9IHBBcHAtPkdldEN1cnJlbnREb2MoKTsKLQkJCWlmIChwRG9jKQotCQkJewotCQkJCUNKU19Eb2N1bWVudCAqIHBKU0RvY3VtZW50ID0gTlVMTDsKLQotCQkJCWlmIChwRG9jID09IHBDdXJEb2MpCi0JCQkJewotCQkJCQlKU0ZYT2JqZWN0IHBPYmogPSBKU19HZXRUaGlzT2JqKCpwUnVudGltZSk7Ci0KLQkJCQkJaWYgKEpTX0dldE9iakRlZm5JRChwT2JqKSA9PSBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIkRvY3VtZW50IikpCi0JCQkJCXsKLQkJCQkJCXBKU0RvY3VtZW50ID0gKENKU19Eb2N1bWVudCopSlNfR2V0UHJpdmF0ZShwUnVudGltZS0+R2V0SXNvbGF0ZSgpLHBPYmopOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUpTRlhPYmplY3QgcE9iaiA9IEpTX05ld0Z4RHluYW1pY09iaigqcFJ1bnRpbWUsIHBDb250ZXh0LCBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLEwiRG9jdW1lbnQiKSk7Ci0JCQkJCXBKU0RvY3VtZW50ID0gKENKU19Eb2N1bWVudCopSlNfR2V0UHJpdmF0ZShwUnVudGltZS0+R2V0SXNvbGF0ZSgpLHBPYmopOwotCQkJCQlBU1NFUlQocEpTRG9jdW1lbnQgIT0gTlVMTCk7Ci0KLQotCQkJCQkvLwkJCXBEb2N1bWVudC0+QXR0YWNoRG9jKHBEb2MpOwotCQkJCX0KLQotCQkJCWFEb2NzLlNldEVsZW1lbnQoMCxDSlNfVmFsdWUocFJ1bnRpbWUtPkdldElzb2xhdGUoKSxwSlNEb2N1bWVudCkpOwotCQkJfQotCS8vCQl9Ci0KLQkJaWYgKGFEb2NzLkdldExlbmd0aCgpID4gMCkKLQkJCXZwIDw8IGFEb2NzOwotCQllbHNlCi0JCQl2cC5TZXROdWxsKCk7Ci0JCXJldHVybiBUUlVFOwotCX0KLQlyZXR1cm4gRkFMU0U7CisgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgICBDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwID0gcENvbnRleHQtPkdldFJlYWRlckFwcCgpOworICAgIENKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKKyAgICBDSlNfQXJyYXkgYURvY3MocFJ1bnRpbWUpOworICAgIGlmIChDUERGU0RLX0RvY3VtZW50KiBwRG9jID0gcEFwcC0+R2V0U0RLRG9jdW1lbnQoKSkKKyAgICAgIHBEb2MtPkdldEludGVyRm9ybSgpLT5FbmFibGVDYWxjdWxhdGUoKEZYX0JPT0wpbV9iQ2FsY3VsYXRlKTsKKyAgfSBlbHNlIHsKKyAgICB2cCA8PCAoYm9vbCltX2JDYWxjdWxhdGU7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgYXBwOjpjYWxjdWxhdGUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCWlmICh2cC5Jc1NldHRpbmcoKSkKLQl7Ci0JCWJvb2wgYlZQOwotCQl2cCA+PiBiVlA7Ci0JCW1fYkNhbGN1bGF0ZSA9IChGWF9CT09MKWJWUDsKK0ZYX0JPT0wgYXBwOjpmb3Jtc1ZlcnNpb24oSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAodnAuSXNHZXR0aW5nKCkpIHsKKyAgICB2cCA8PCBKU19OVU1fRk9STVNWRVJTSU9OOworICAgIHJldHVybiBUUlVFOworICB9CiAKLQkJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLQkJQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCi0JCUNQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAgPSBwQ29udGV4dC0+R2V0UmVhZGVyQXBwKCk7Ci0JCUFTU0VSVChwQXBwICE9IE5VTEwpOwotCi0JCUNKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKLQkJQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOwotCi0JCUNKU19BcnJheSBhRG9jcyhwUnVudGltZS0+R2V0SXNvbGF0ZSgpKTsKLQkJaWYgKENQREZTREtfRG9jdW1lbnQqIHBEb2MgPSBwQXBwLT5HZXRDdXJyZW50RG9jKCkpCi0JCXsKLQkJCUNQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKilwRG9jLT5HZXRJbnRlckZvcm0oKTsKLQkJCUFTU0VSVChwSW50ZXJGb3JtICE9IE5VTEwpOwotCQkJcEludGVyRm9ybS0+RW5hYmxlQ2FsY3VsYXRlKChGWF9CT09MKW1fYkNhbGN1bGF0ZSk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJdnAgPDwgKGJvb2wpbV9iQ2FsY3VsYXRlOwotCX0KLQotCXJldHVybiBUUlVFOworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgYXBwOjpmb3Jtc1ZlcnNpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCWlmICh2cC5Jc0dldHRpbmcoKSkKLQl7Ci0JCXZwIDw8IEpTX05VTV9GT1JNU1ZFUlNJT047Ci0JCXJldHVybiBUUlVFOwotCX0KK0ZYX0JPT0wgYXBwOjp2aWV3ZXJUeXBlKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAodnAuSXNHZXR0aW5nKCkpIHsKKyAgICB2cCA8PCBKU19TVFJfVklFV0VSVFlQRTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQogCi0JcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgYXBwOjp2aWV3ZXJUeXBlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlpZiAodnAuSXNHZXR0aW5nKCkpCi0JewotCQl2cCA8PCBMInVua25vd24iOwotCQlyZXR1cm4gVFJVRTsKLQl9CitGWF9CT09MIGFwcDo6dmlld2VyVmFyaWF0aW9uKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKHZwLklzR2V0dGluZygpKSB7CisgICAgdnAgPDwgSlNfU1RSX1ZJRVdFUlZBUklBVElPTjsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQogCi0JcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgYXBwOjp2aWV3ZXJWYXJpYXRpb24oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCWlmICh2cC5Jc0dldHRpbmcoKSkKLQl7Ci0JCXZwIDw8IEpTX1NUUl9WSUVXRVJWQVJJQVRJT047Ci0JCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgYXBwOjp2aWV3ZXJWZXJzaW9uKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAoIXZwLklzR2V0dGluZygpKQorICAgIHJldHVybiBGQUxTRTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBDUERGU0RLX0RvY3VtZW50KiBwQ3VyRG9jID0gcENvbnRleHQtPkdldFJlYWRlckRvY3VtZW50KCk7CisgIENQREZYRkFfRG9jdW1lbnQqIHBEb2MgPSBwQ3VyRG9jLT5HZXRYRkFEb2N1bWVudCgpOworICBpZiAocERvYy0+R2V0RG9jVHlwZSgpID09IDEgfHwgcERvYy0+R2V0RG9jVHlwZSgpID09IDIpIHsKKyAgICB2cCA8PCBKU19OVU1fVklFV0VSVkVSU0lPTl9YRkE7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgdnAgPDwgSlNfTlVNX1ZJRVdFUlZFUlNJT047CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGFwcDo6dmlld2VyVmVyc2lvbihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaWYgKHZwLklzR2V0dGluZygpKQotCXsKLQkJdnAgPDwgSlNfU1RSX1ZJRVdFUlZFUlNJT047Ci0JCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgYXBwOjpwbGF0Zm9ybShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAoIXZwLklzR2V0dGluZygpKQorICAgIHJldHVybiBGQUxTRTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0KKyAgICAgIHN0YXRpY19jYXN0PENKU19Db250ZXh0Kj4oY2MpLT5HZXRKU1J1bnRpbWUoKS0+R2V0UmVhZGVyQXBwKCk7CisgIGlmICghcEVudikKKyAgICByZXR1cm4gRkFMU0U7CisgIENGWF9XaWRlU3RyaW5nIHBsYXRmcm9tID0gcEVudi0+RkZJX0dldFBsYXRmb3JtKCk7CisgIGlmICghcGxhdGZyb20uSXNFbXB0eSgpKSB7CisgICAgdnAgPDwgcGxhdGZyb207CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyNlbmRpZgorICB2cCA8PCBKU19TVFJfUExBVEZPUk07CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGFwcDo6cGxhdGZvcm0oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCWlmICh2cC5Jc0dldHRpbmcoKSkKLQl7Ci0JCXZwIDw8IEpTX1NUUl9QTEFURk9STTsKLQkJcmV0dXJuIFRSVUU7Ci0JfQotCi0JcmV0dXJuIEZBTFNFOworRlhfQk9PTCBhcHA6Omxhbmd1YWdlKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICghdnAuSXNHZXR0aW5nKCkpCisgICAgcmV0dXJuIEZBTFNFOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPQorICAgICAgc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyktPkdldEpTUnVudGltZSgpLT5HZXRSZWFkZXJBcHAoKTsKKyAgaWYgKCFwRW52KQorICAgIHJldHVybiBGQUxTRTsKKyAgQ0ZYX1dpZGVTdHJpbmcgbGFuZ3VhZ2UgPSBwRW52LT5GRklfR2V0TGFuZ3VhZ2UoKTsKKyAgaWYgKCFsYW5ndWFnZS5Jc0VtcHR5KCkpIHsKKyAgICB2cCA8PCBsYW5ndWFnZTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorI2VuZGlmCisgIHZwIDw8IEpTX1NUUl9MQU5HVUFOR0U7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGFwcDo6bGFuZ3VhZ2UoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCWlmICh2cC5Jc0dldHRpbmcoKSkKLQl7Ci0JCXZwIDw8IEpTX1NUUl9MQU5HVUFOR0U7Ci0JCXJldHVybiBUUlVFOwotCX0KKy8vIGNyZWF0ZXMgYSBuZXcgZmRmIG9iamVjdCB0aGF0IGNvbnRhaW5zIG5vIGRhdGEKKy8vIGNvbW1lbnQ6IG5lZWQgcmVhZGVyIHN1cHBvcnQKKy8vIG5vdGU6CisvLyBDRkRGX0RvY3VtZW50ICogQ1BERkRvY19FbnZpcm9ubWVudDo6TmV3RkRGKCk7CitGWF9CT09MIGFwcDo6bmV3RkRGKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIFRSVUU7Cit9CisvLyBvcGVucyBhIHNwZWNpZmllZCBwZGYgZG9jdW1lbnQgYW5kIHJldHVybnMgaXRzIGRvY3VtZW50IG9iamVjdAorLy8gY29tbWVudDpuZWVkIHJlYWRlciBzdXBwb3J0CisvLyBub3RlOiBhcyBkZWZpbmVkIGluIGpzIHJlZmVyZW5jZSwgdGhlIHByb3RvIG9mIHRoaXMgZnVuY3Rpb24ncyBmb3VydGgKKy8vIHBhcm1ldGVycywgaG93IG9sZCBhbiBmZGYgZG9jdW1lbnQgd2hpbGUgZG8gbm90IHNob3cgaXQuCisvLyBDRkRGX0RvY3VtZW50ICogQ1BERkRvY19FbnZpcm9ubWVudDo6T3BlbkZERihzdHJpbmcgc3RyUGF0aCxib29sIGJVc2VyQ29udik7CiAKLQlyZXR1cm4gRkFMU0U7CitGWF9CT09MIGFwcDo6b3BlbkZERihJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBUUlVFOwogfQogCi0vL2NyZWF0ZXMgYSBuZXcgZmRmIG9iamVjdCB0aGF0IGNvbnRhaW5zIG5vIGRhdGEKLS8vY29tbWVudDogbmVlZCByZWFkZXIgc3VwcG9ydAotLy9ub3RlOgotLy9DRkRGX0RvY3VtZW50ICogQ1BERkRvY19FbnZpcm9ubWVudDo6TmV3RkRGKCk7Ci1GWF9CT09MIGFwcDo6bmV3RkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIFRSVUU7Ci19Ci0vL29wZW5zIGEgc3BlY2lmaWVkIHBkZiBkb2N1bWVudCBhbmQgcmV0dXJucyBpdHMgZG9jdW1lbnQgb2JqZWN0Ci0vL2NvbW1lbnQ6bmVlZCByZWFkZXIgc3VwcG9ydAotLy9ub3RlOiBhcyBkZWZpbmVkIGluIGpzIHJlZmVyZW5jZSwgdGhlIHByb3RvIG9mIHRoaXMgZnVuY3Rpb24ncyBmb3VydGggcGFybWV0ZXJzLCBob3cgb2xkIGFuIGZkZiBkb2N1bWVudCB3aGlsZSBkbyBub3Qgc2hvdyBpdC4KLS8vQ0ZERl9Eb2N1bWVudCAqIENQREZEb2NfRW52aXJvbm1lbnQ6Ok9wZW5GREYoc3RyaW5nIHN0clBhdGgsYm9vbCBiVXNlckNvbnYpOworRlhfQk9PTCBhcHA6OmFsZXJ0KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKKyAgaWYgKGlTaXplIDwgMSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLUZYX0JPT0wgYXBwOjpvcGVuRkRGKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIFRSVUU7CisgIENGWF9XaWRlU3RyaW5nIHN3TXNnID0gTCIiOworICBDRlhfV2lkZVN0cmluZyBzd1RpdGxlID0gTCIiOworICBpbnQgaUljb24gPSAwOworICBpbnQgaVR5cGUgPSAwOworCisgIENKU19SdW50aW1lKiBwUnVudGltZSA9IENKU19SdW50aW1lOjpGcm9tQ29udGV4dChjYyk7CisgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gcFJ1bnRpbWUtPkdldElzb2xhdGUoKTsKKworICBpZiAoaVNpemUgPT0gMSkgeworICAgIGlmIChwYXJhbXNbMF0uR2V0VHlwZSgpID09IENKU19WYWx1ZTo6VlRfb2JqZWN0KSB7CisgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiA9IHBhcmFtc1swXS5Ub1Y4T2JqZWN0KCk7CisgICAgICB7CisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSA9CisgICAgICAgICAgICBGWEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSwgcE9iaiwgTCJjTXNnIik7CisgICAgICAgIHN3TXNnID0gQ0pTX1ZhbHVlKHBSdW50aW1lLCBwVmFsdWUsIENKU19WYWx1ZTo6VlRfdW5rbm93bikKKyAgICAgICAgICAgICAgICAgICAgLlRvQ0ZYV2lkZVN0cmluZygpOworCisgICAgICAgIHBWYWx1ZSA9IEZYSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMImNUaXRsZSIpOworICAgICAgICBzd1RpdGxlID0gQ0pTX1ZhbHVlKHBSdW50aW1lLCBwVmFsdWUsIENKU19WYWx1ZTo6VlRfdW5rbm93bikKKyAgICAgICAgICAgICAgICAgICAgICAuVG9DRlhXaWRlU3RyaW5nKCk7CisKKyAgICAgICAgcFZhbHVlID0gRlhKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwibkljb24iKTsKKyAgICAgICAgaUljb24gPSBDSlNfVmFsdWUocFJ1bnRpbWUsIHBWYWx1ZSwgQ0pTX1ZhbHVlOjpWVF91bmtub3duKS5Ub0ludCgpOworCisgICAgICAgIHBWYWx1ZSA9IEZYSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMIm5UeXBlIik7CisgICAgICAgIGlUeXBlID0gQ0pTX1ZhbHVlKHBSdW50aW1lLCBwVmFsdWUsIENKU19WYWx1ZTo6VlRfdW5rbm93bikuVG9JbnQoKTsKKyAgICAgIH0KKworICAgICAgaWYgKHN3TXNnID09IEwiIikgeworICAgICAgICBDSlNfQXJyYXkgY2FycmF5KHBSdW50aW1lKTsKKyAgICAgICAgaWYgKHBhcmFtc1swXS5Db252ZXJ0VG9BcnJheShjYXJyYXkpKSB7CisgICAgICAgICAgaW50IGlMZW5ndGggPSBjYXJyYXkuR2V0TGVuZ3RoKCk7CisgICAgICAgICAgQ0pTX1ZhbHVlKiBwVmFsdWUgPSBuZXcgQ0pTX1ZhbHVlKHBSdW50aW1lKTsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlMZW5ndGg7ICsraSkgeworICAgICAgICAgICAgY2FycmF5LkdldEVsZW1lbnQoaSwgKnBWYWx1ZSk7CisgICAgICAgICAgICBzd01zZyArPSAoKnBWYWx1ZSkuVG9DRlhXaWRlU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAoaSA8IGlMZW5ndGggLSAxKQorICAgICAgICAgICAgICBzd01zZyArPSBMIiwgICI7CisgICAgICAgICAgfQorCisgICAgICAgICAgZGVsZXRlIHBWYWx1ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoc3dUaXRsZSA9PSBMIiIpCisgICAgICAgIHN3VGl0bGUgPSBKU0dldFN0cmluZ0Zyb21JRCgoQ0pTX0NvbnRleHQqKWNjLCBJRFNfU1RSSU5HX0pTQUxFUlQpOworICAgIH0gZWxzZSBpZiAocGFyYW1zWzBdLkdldFR5cGUoKSA9PSBDSlNfVmFsdWU6OlZUX2Jvb2xlYW4pIHsKKyAgICAgIEZYX0JPT0wgYkdldCA9IHBhcmFtc1swXS5Ub0Jvb2woKTsKKyAgICAgIGlmIChiR2V0KQorICAgICAgICBzd01zZyA9IEwidHJ1ZSI7CisgICAgICBlbHNlCisgICAgICAgIHN3TXNnID0gTCJmYWxzZSI7CisKKyAgICAgIHN3VGl0bGUgPSBKU0dldFN0cmluZ0Zyb21JRCgoQ0pTX0NvbnRleHQqKWNjLCBJRFNfU1RSSU5HX0pTQUxFUlQpOworICAgIH0gZWxzZSB7CisgICAgICBzd01zZyA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgICAgIHN3VGl0bGUgPSBKU0dldFN0cmluZ0Zyb21JRCgoQ0pTX0NvbnRleHQqKWNjLCBJRFNfU1RSSU5HX0pTQUxFUlQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAocGFyYW1zWzBdLkdldFR5cGUoKSA9PSBDSlNfVmFsdWU6OlZUX2Jvb2xlYW4pIHsKKyAgICAgIEZYX0JPT0wgYkdldCA9IHBhcmFtc1swXS5Ub0Jvb2woKTsKKyAgICAgIGlmIChiR2V0KQorICAgICAgICBzd01zZyA9IEwidHJ1ZSI7CisgICAgICBlbHNlCisgICAgICAgIHN3TXNnID0gTCJmYWxzZSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHN3TXNnID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOworICAgIH0KKyAgICBzd1RpdGxlID0gSlNHZXRTdHJpbmdGcm9tSUQoKENKU19Db250ZXh0KiljYywgSURTX1NUUklOR19KU0FMRVJUKTsKKworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgaVNpemU7IGkrKykgeworICAgICAgaWYgKGkgPT0gMSkKKyAgICAgICAgaUljb24gPSBwYXJhbXNbaV0uVG9JbnQoKTsKKyAgICAgIGlmIChpID09IDIpCisgICAgICAgIGlUeXBlID0gcGFyYW1zW2ldLlRvSW50KCk7CisgICAgICBpZiAoaSA9PSAzKQorICAgICAgICBzd1RpdGxlID0gcGFyYW1zW2ldLlRvQ0ZYV2lkZVN0cmluZygpOworICAgIH0KKyAgfQorCisgIHBSdW50aW1lLT5CZWdpbkJsb2NrKCk7CisgIHZSZXQgPSBNc2dCb3gocFJ1bnRpbWUtPkdldFJlYWRlckFwcCgpLCBzd01zZy5jX3N0cigpLCBzd1RpdGxlLmNfc3RyKCksIGlUeXBlLAorICAgICAgICAgICAgICAgIGlJY29uKTsKKyAgcFJ1bnRpbWUtPkVuZEJsb2NrKCk7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGFwcDo6YWxlcnQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlpbnQgaVNpemUgPSBwYXJhbXMuc2l6ZSgpOwotCWlmIChpU2l6ZSA8IDEpCi0JCXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgYXBwOjpiZWVwKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPT0gMSkgeworICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOworICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBwUnVudGltZS0+R2V0UmVhZGVyQXBwKCk7CisgICAgcEVudi0+SlNfYXBwQmVlcChwYXJhbXNbMF0uVG9JbnQoKSk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KIAotCUNGWF9XaWRlU3RyaW5nIHN3TXNnID0gTCIiOwotCUNGWF9XaWRlU3RyaW5nIHN3VGl0bGUgPSBMIiI7Ci0JaW50IGlJY29uID0gMDsKLQlpbnQgaVR5cGUgPSAwOwotCi0Jdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSBHZXRJc29sYXRlKGNjKTsKLQotCWlmIChpU2l6ZSA9PSAxKQotCXsKLQkJaWYgKHBhcmFtc1swXS5HZXRUeXBlKCkgPT0gVlRfb2JqZWN0KQotCQl7Ci0JCQlKU09iamVjdCBwT2JqID0gcGFyYW1zWzBdLlRvVjhPYmplY3QoKTsKLQkJCXsKLQkJCQl2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiY01zZyIpOwotCQkJCXN3TXNnID0gQ0pTX1ZhbHVlKGlzb2xhdGUsIHBWYWx1ZSwgVlRfdW5rbm93bikuVG9DRlhXaWRlU3RyaW5nKCk7Ci0KLQkJCQlwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiY1RpdGxlIik7Ci0JCQkJc3dUaXRsZSA9IENKU19WYWx1ZShpc29sYXRlLCBwVmFsdWUsIFZUX3Vua25vd24pLlRvQ0ZYV2lkZVN0cmluZygpOwotCi0JCQkJcFZhbHVlID0gSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMIm5JY29uIik7Ci0JCQkJaUljb24gPSBDSlNfVmFsdWUoaXNvbGF0ZSwgcFZhbHVlLCBWVF91bmtub3duKS5Ub0ludCgpOwotCi0JCQkJcFZhbHVlID0gSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMIm5UeXBlIik7Ci0JCQkJaVR5cGUgPSBDSlNfVmFsdWUoaXNvbGF0ZSwgcFZhbHVlLCBWVF91bmtub3duKS5Ub0ludCgpOwotCQkJfQotCi0JCQlpZiAoc3dNc2cgPT0gTCIiKQotCQkJewotCQkJCUNKU19BcnJheSBjYXJyYXkoaXNvbGF0ZSk7Ci0JCQkJaWYgKHBhcmFtc1swXS5Db252ZXJ0VG9BcnJheShjYXJyYXkpKQotCQkJCXsKLQkJCQkJaW50IGlMZW50aCA9IGNhcnJheS5HZXRMZW5ndGgoKTsKLQkJCQkJQ0pTX1ZhbHVlKiBwVmFsdWUgPSBuZXcgQ0pTX1ZhbHVlKGlzb2xhdGUpOwotLy8JCQkJCWlmIChpTGVudGggPT0gMSkKLS8vCQkJCQkJcFZhbHVlID0gbmV3IENKU19WYWx1ZShpc29sYXRlKTsKLS8vCQkJCQllbHNlIGlmIChpTGVudGggPiAxKQotLy8JCQkJCQlwVmFsdWUgPSBuZXcgQ0pTX1ZhbHVlW2lMZW50aF07Ci0KLQkJCQkJZm9yKGludCBpID0gMDsgaSA8IGlMZW50aDsgaSsrKQotCQkJCQl7Ci0JCQkJCQljYXJyYXkuR2V0RWxlbWVudChpLCAqcFZhbHVlKTsKLQkJCQkJCXN3TXNnICs9ICgqcFZhbHVlKS5Ub0NGWFdpZGVTdHJpbmcoKTsKLQkJCQkJCWlmIChpIDwgaUxlbnRoIC0gMSkKLQkJCQkJCQlzd01zZyArPSBMIiwgICI7Ci0JCQkJCX0KLQotCQkJCQlpZihwVmFsdWUpIGRlbGV0ZSBwVmFsdWU7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoc3dUaXRsZSA9PSBMIiIpCi0JCQkJc3dUaXRsZSA9IEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNBTEVSVCk7Ci0JCX0KLQkJZWxzZSBpZiAocGFyYW1zWzBdLkdldFR5cGUoKSA9PSBWVF9ib29sZWFuKQotCQl7Ci0JCQlGWF9CT09MIGJHZXQgPSBwYXJhbXNbMF0uVG9Cb29sKCk7Ci0JCQlpZiAoYkdldCkKLQkJCQlzd01zZyA9IEwidHJ1ZSI7Ci0JCQllbHNlCi0JCQkJc3dNc2cgPSBMImZhbHNlIjsKLQotCQkJc3dUaXRsZSA9IEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNBTEVSVCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzd01zZyA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKLQkJCXN3VGl0bGUgPSBKU0dldFN0cmluZ0Zyb21JRCgoQ0pTX0NvbnRleHQqKWNjLCBJRFNfU1RSSU5HX0pTQUxFUlQpOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChwYXJhbXNbMF0uR2V0VHlwZSgpID09IFZUX2Jvb2xlYW4pCi0JCXsKLQkJCUZYX0JPT0wgYkdldCA9IHBhcmFtc1swXS5Ub0Jvb2woKTsKLQkJCWlmIChiR2V0KQotCQkJCXN3TXNnID0gTCJ0cnVlIjsKLQkJCWVsc2UKLQkJCQlzd01zZyA9IEwiZmFsc2UiOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3dNc2cgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7Ci0JCX0KLQkJc3dUaXRsZSA9IEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNBTEVSVCk7Ci0KLQkJZm9yKGludCBpID0gMTtpPGlTaXplO2krKykKLQkJewotCQkJaWYgKGkgPT0gMSkKLQkJCQlpSWNvbiA9IHBhcmFtc1tpXS5Ub0ludCgpOwotCQkJaWYgKGkgPT0gMikKLQkJCQlpVHlwZSA9IHBhcmFtc1tpXS5Ub0ludCgpOwotCQkJaWYgKGkgPT0gMykKLQkJCQlzd1RpdGxlID0gcGFyYW1zW2ldLlRvQ0ZYV2lkZVN0cmluZygpOwotCQl9Ci0JfQotCi0KLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQlDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7Ci0JQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOwotCXBSdW50aW1lLT5CZWdpbkJsb2NrKCk7Ci0JdlJldCA9IE1zZ0JveChwUnVudGltZS0+R2V0UmVhZGVyQXBwKCksIEpTR2V0UGFnZVZpZXcoY2MpLCBzd01zZy5jX3N0cigpLCBzd1RpdGxlLmNfc3RyKCksIGlUeXBlLCBpSWNvbik7Ci0JcFJ1bnRpbWUtPkVuZEJsb2NrKCk7Ci0KLQlyZXR1cm4gVFJVRTsKKyAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoKENKU19Db250ZXh0KiljYywgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOworICByZXR1cm4gRkFMU0U7CiB9CiAKLQotRlhfQk9PTCBhcHA6OmJlZXAoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlpZiAocGFyYW1zLnNpemUoKSA9PSAxKQotCXsKLQkJQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLQkJQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwotCQlDUERGRG9jX0Vudmlyb25tZW50ICogcEVudiA9IHBSdW50aW1lLT5HZXRSZWFkZXJBcHAoKTsKLQkJcEVudi0+SlNfYXBwQmVlcChwYXJhbXNbMF0uVG9JbnQoKSk7Ci0JCXJldHVybiBUUlVFOwotCX0KLQotCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLQlyZXR1cm4gRkFMU0U7CitGWF9CT09MIGFwcDo6ZmluZENvbXBvbmVudChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGFwcDo6ZmluZENvbXBvbmVudChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBUUlVFOworRlhfQk9PTCBhcHA6OnBvcFVwTWVudUV4KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIGFwcDo6cG9wVXBNZW51RXgoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlyZXR1cm4gRkFMU0U7CitGWF9CT09MIGFwcDo6ZnMoSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgYXBwOjpmcyhJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIEZBTFNFOworRlhfQk9PTCBhcHA6OnNldEludGVydmFsKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPiAyIHx8IHBhcmFtcy5zaXplKCkgPT0gMCkgeworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgQ0ZYX1dpZGVTdHJpbmcgc2NyaXB0ID0gcGFyYW1zLnNpemUoKSA+IDAgPyBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCkgOiBMIiI7CisgIGlmIChzY3JpcHQuSXNFbXB0eSgpKSB7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNBRk5VTUJFUl9LRVlTVFJPS0UpOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOworICBGWF9EV09SRCBkd0ludGVydmFsID0gcGFyYW1zLnNpemUoKSA+IDEgPyBwYXJhbXNbMV0uVG9JbnQoKSA6IDEwMDA7CisKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCA9IHBSdW50aW1lLT5HZXRSZWFkZXJBcHAoKTsKKyAgQVNTRVJUKHBBcHApOworICBDSlNfVGltZXIqIHBUaW1lciA9CisgICAgICBuZXcgQ0pTX1RpbWVyKHRoaXMsIHBBcHAsIHBSdW50aW1lLCAwLCBzY3JpcHQsIGR3SW50ZXJ2YWwsIDApOworICBtX2FUaW1lci5BZGQocFRpbWVyKTsKKworICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcFJldE9iaiA9IEZYSlNfTmV3RnhEeW5hbWljT2JqKAorICAgICAgcFJ1bnRpbWUtPkdldElzb2xhdGUoKSwgcFJ1bnRpbWUsIENKU19UaW1lck9iajo6Z19uT2JqRGVmbklEKTsKKyAgQ0pTX1RpbWVyT2JqKiBwSlNfVGltZXJPYmogPQorICAgICAgKENKU19UaW1lck9iaiopRlhKU19HZXRQcml2YXRlKHBSdW50aW1lLT5HZXRJc29sYXRlKCksIHBSZXRPYmopOworICBUaW1lck9iaiogcFRpbWVyT2JqID0gKFRpbWVyT2JqKilwSlNfVGltZXJPYmotPkdldEVtYmVkT2JqZWN0KCk7CisgIHBUaW1lck9iai0+U2V0VGltZXIocFRpbWVyKTsKKworICB2UmV0ID0gcFJldE9iajsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgYXBwOjpzZXRJbnRlcnZhbChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0JaWYgKHBhcmFtcy5zaXplKCkgPiAyIHx8IHBhcmFtcy5zaXplKCkgPT0gMCkKLQl7Ci0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0JCXJldHVybiBGQUxTRTsKLQl9CitGWF9CT09MIGFwcDo6c2V0VGltZU91dChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmIChwYXJhbXMuc2l6ZSgpID4gMiB8fCBwYXJhbXMuc2l6ZSgpID09IDApIHsKKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRCgoQ0pTX0NvbnRleHQqKWNjLCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLQlDRlhfV2lkZVN0cmluZyBzY3JpcHQgPSBwYXJhbXMuc2l6ZSgpID4gMCA/ICBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCkgOiBMIiI7Ci0JaWYgKHNjcmlwdC5Jc0VtcHR5KCkpCi0JewotCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU0FGTlVNQkVSX0tFWVNUUk9LRSk7Ci0JCXJldHVybiBUUlVFOwotCX0KKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwogCi0JQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwotCUZYX0RXT1JEIGR3SW50ZXJ2YWwgPSBwYXJhbXMuc2l6ZSgpID4gMSA/IHBhcmFtc1sxXS5Ub0ludCgpIDogMTAwMDsKKyAgQ0ZYX1dpZGVTdHJpbmcgc2NyaXB0ID0gcGFyYW1zLnNpemUoKSA+IDAgPyBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCkgOiBMIiI7CisgIGlmIChzY3JpcHQuSXNFbXB0eSgpKSB7CisgICAgc0Vycm9yID0KKyAgICAgICAgSlNHZXRTdHJpbmdGcm9tSUQoKENKU19Db250ZXh0KiljYywgSURTX1NUUklOR19KU0FGTlVNQkVSX0tFWVNUUk9LRSk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KIAotCUNQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAgPSBwUnVudGltZS0+R2V0UmVhZGVyQXBwKCk7Ci0JQVNTRVJUKHBBcHApOwotCUNKU19UaW1lciogcFRpbWVyID0gbmV3IENKU19UaW1lcih0aGlzLCBwQXBwKTsKLQltX2FUaW1lci5BZGQocFRpbWVyKTsKKyAgRlhfRFdPUkQgZHdUaW1lT3V0ID0gcGFyYW1zLnNpemUoKSA+IDEgPyBwYXJhbXNbMV0uVG9JbnQoKSA6IDEwMDA7CiAKLQlwVGltZXItPlNldFR5cGUoMCk7Ci0JcFRpbWVyLT5TZXRSdW50aW1lKHBSdW50aW1lKTsKLQlwVGltZXItPlNldEpTY3JpcHQoc2NyaXB0KTsKLQlwVGltZXItPlNldFRpbWVPdXQoMCk7Ci0vLwlwVGltZXItPlNldFN0YXJ0VGltZShHZXRUaWNrQ291bnQoKSk7Ci0JcFRpbWVyLT5TZXRKU1RpbWVyKGR3SW50ZXJ2YWwpOworICBDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwID0gcFJ1bnRpbWUtPkdldFJlYWRlckFwcCgpOworICBBU1NFUlQocEFwcCk7CiAKLQlKU0ZYT2JqZWN0IHBSZXRPYmogPSBKU19OZXdGeER5bmFtaWNPYmooKnBSdW50aW1lLCBwQ29udGV4dCwgSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSwgTCJUaW1lck9iaiIpKTsKKyAgQ0pTX1RpbWVyKiBwVGltZXIgPQorICAgICAgbmV3IENKU19UaW1lcih0aGlzLCBwQXBwLCBwUnVudGltZSwgMSwgc2NyaXB0LCBkd1RpbWVPdXQsIGR3VGltZU91dCk7CisgIG1fYVRpbWVyLkFkZChwVGltZXIpOwogCi0JQ0pTX1RpbWVyT2JqKiBwSlNfVGltZXJPYmogPSAoQ0pTX1RpbWVyT2JqKilKU19HZXRQcml2YXRlKHBSdW50aW1lLT5HZXRJc29sYXRlKCkscFJldE9iaik7Ci0JQVNTRVJUKHBKU19UaW1lck9iaiAhPSBOVUxMKTsKKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBSZXRPYmogPSBGWEpTX05ld0Z4RHluYW1pY09iaigKKyAgICAgIHBSdW50aW1lLT5HZXRJc29sYXRlKCksIHBSdW50aW1lLCBDSlNfVGltZXJPYmo6Omdfbk9iakRlZm5JRCk7CisgIENKU19UaW1lck9iaiogcEpTX1RpbWVyT2JqID0KKyAgICAgIChDSlNfVGltZXJPYmoqKUZYSlNfR2V0UHJpdmF0ZShwUnVudGltZS0+R2V0SXNvbGF0ZSgpLCBwUmV0T2JqKTsKKyAgVGltZXJPYmoqIHBUaW1lck9iaiA9IChUaW1lck9iaiopcEpTX1RpbWVyT2JqLT5HZXRFbWJlZE9iamVjdCgpOworICBwVGltZXJPYmotPlNldFRpbWVyKHBUaW1lcik7CiAKLQlUaW1lck9iaiogcFRpbWVyT2JqID0gKFRpbWVyT2JqKilwSlNfVGltZXJPYmotPkdldEVtYmVkT2JqZWN0KCk7Ci0JQVNTRVJUKHBUaW1lck9iaiAhPSBOVUxMKTsKLQotCXBUaW1lck9iai0+U2V0VGltZXIocFRpbWVyKTsKLQotCXZSZXQgPSBwUmV0T2JqOwotCi0JcmV0dXJuIFRSVUU7CisgIHZSZXQgPSBwUmV0T2JqOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBhcHA6OnNldFRpbWVPdXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlpZiAocGFyYW1zLnNpemUoKSA+IDIgfHwgcGFyYW1zLnNpemUoKSA9PSAwKQotCXsKLQkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoKENKU19Db250ZXh0KiljYywgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQorRlhfQk9PTCBhcHA6OmNsZWFyVGltZU91dChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQogCi0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0JQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwotCUFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKKyAgaWYgKHBhcmFtc1swXS5HZXRUeXBlKCkgPT0gQ0pTX1ZhbHVlOjpWVF9meG9iamVjdCkgeworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqID0gcGFyYW1zWzBdLlRvVjhPYmplY3QoKTsKKyAgICBpZiAoRlhKU19HZXRPYmpEZWZuSUQocE9iaikgPT0gQ0pTX1RpbWVyT2JqOjpnX25PYmpEZWZuSUQpIHsKKyAgICAgIGlmIChDSlNfT2JqZWN0KiBwSlNPYmogPSBwYXJhbXNbMF0uVG9DSlNPYmplY3QoKSkgeworICAgICAgICBpZiAoVGltZXJPYmoqIHBUaW1lck9iaiA9IChUaW1lck9iaiopcEpTT2JqLT5HZXRFbWJlZE9iamVjdCgpKSB7CisgICAgICAgICAgaWYgKENKU19UaW1lciogcFRpbWVyID0gcFRpbWVyT2JqLT5HZXRUaW1lcigpKSB7CisgICAgICAgICAgICBwVGltZXItPktpbGxKU1RpbWVyKCk7CiAKLQlDRlhfV2lkZVN0cmluZyBzY3JpcHQgPSBwYXJhbXMuc2l6ZSgpID4gMCA/IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKSA6IEwiIjsKLQlpZiAoc2NyaXB0LklzRW1wdHkoKSkKLQl7Ci0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKChDSlNfQ29udGV4dCopY2MsIElEU19TVFJJTkdfSlNBRk5VTUJFUl9LRVlTVFJPS0UpOwotCQlyZXR1cm4gVFJVRTsKLQl9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBtX2FUaW1lci5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICAgICAgICAgIGlmIChtX2FUaW1lcltpXSA9PSBwVGltZXIpIHsKKyAgICAgICAgICAgICAgICBtX2FUaW1lci5SZW1vdmVBdChpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JRlhfRFdPUkQgZHdUaW1lT3V0ID0gcGFyYW1zLnNpemUoKSA+IDEgPyBwYXJhbXNbMV0uVG9JbnQoKSA6IDEwMDA7CisgICAgICAgICAgICBkZWxldGUgcFRpbWVyOworICAgICAgICAgICAgcFRpbWVyT2JqLT5TZXRUaW1lcihOVUxMKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KIAotCUNQREZEb2NfRW52aXJvbm1lbnQqIHBBcHAgPSBwUnVudGltZS0+R2V0UmVhZGVyQXBwKCk7Ci0JQVNTRVJUKHBBcHApOwotCi0JQ0pTX1RpbWVyKiBwVGltZXIgPSBuZXcgQ0pTX1RpbWVyKHRoaXMsIHBBcHApOwotCW1fYVRpbWVyLkFkZChwVGltZXIpOwotCi0JcFRpbWVyLT5TZXRUeXBlKDEpOwotCXBUaW1lci0+U2V0UnVudGltZShwUnVudGltZSk7Ci0JcFRpbWVyLT5TZXRKU2NyaXB0KHNjcmlwdCk7Ci0JcFRpbWVyLT5TZXRUaW1lT3V0KGR3VGltZU91dCk7Ci0JcFRpbWVyLT5TZXRKU1RpbWVyKGR3VGltZU91dCk7Ci0KLQlKU0ZYT2JqZWN0IHBSZXRPYmogPSBKU19OZXdGeER5bmFtaWNPYmooKnBSdW50aW1lLCBwQ29udGV4dCwgSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSwgTCJUaW1lck9iaiIpKTsKLQotCUNKU19UaW1lck9iaiogcEpTX1RpbWVyT2JqID0gKENKU19UaW1lck9iaiopSlNfR2V0UHJpdmF0ZShwUnVudGltZS0+R2V0SXNvbGF0ZSgpLHBSZXRPYmopOwotCUFTU0VSVChwSlNfVGltZXJPYmogIT0gTlVMTCk7Ci0KLQlUaW1lck9iaiogcFRpbWVyT2JqID0gKFRpbWVyT2JqKilwSlNfVGltZXJPYmotPkdldEVtYmVkT2JqZWN0KCk7Ci0JQVNTRVJUKHBUaW1lck9iaiAhPSBOVUxMKTsKLQotCXBUaW1lck9iai0+U2V0VGltZXIocFRpbWVyKTsKLQotCXZSZXQgPSBwUmV0T2JqOwotCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGFwcDo6Y2xlYXJUaW1lT3V0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0JQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwotCUFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKK0ZYX0JPT0wgYXBwOjpjbGVhckludGVydmFsKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLQlpZiAocGFyYW1zLnNpemUoKSAhPSAxKQotCXsKLQkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoKENKU19Db250ZXh0KiljYywgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQorICBpZiAocGFyYW1zWzBdLkdldFR5cGUoKSA9PSBDSlNfVmFsdWU6OlZUX2Z4b2JqZWN0KSB7CisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmogPSBwYXJhbXNbMF0uVG9WOE9iamVjdCgpOworICAgIGlmIChGWEpTX0dldE9iakRlZm5JRChwT2JqKSA9PSBDSlNfVGltZXJPYmo6Omdfbk9iakRlZm5JRCkgeworICAgICAgaWYgKENKU19PYmplY3QqIHBKU09iaiA9IHBhcmFtc1swXS5Ub0NKU09iamVjdCgpKSB7CisgICAgICAgIGlmIChUaW1lck9iaiogcFRpbWVyT2JqID0gKFRpbWVyT2JqKilwSlNPYmotPkdldEVtYmVkT2JqZWN0KCkpIHsKKyAgICAgICAgICBpZiAoQ0pTX1RpbWVyKiBwVGltZXIgPSBwVGltZXJPYmotPkdldFRpbWVyKCkpIHsKKyAgICAgICAgICAgIHBUaW1lci0+S2lsbEpTVGltZXIoKTsKIAotCWlmIChwYXJhbXNbMF0uR2V0VHlwZSgpID09IFZUX2Z4b2JqZWN0KQotCXsKLQkJSlNGWE9iamVjdCBwT2JqID0gcGFyYW1zWzBdLlRvVjhPYmplY3QoKTsKLQkJewotCQkJaWYgKEpTX0dldE9iakRlZm5JRChwT2JqKSA9PSBKU19HZXRPYmpEZWZuSUQoKnBSdW50aW1lLCBMIlRpbWVyT2JqIikpCi0JCQl7Ci0JCQkJaWYgKENKU19PYmplY3QqIHBKU09iaiA9IHBhcmFtc1swXS5Ub0NKU09iamVjdCgpKQotCQkJCXsKLQkJCQkJaWYgKFRpbWVyT2JqKiBwVGltZXJPYmogPSAoVGltZXJPYmoqKXBKU09iai0+R2V0RW1iZWRPYmplY3QoKSkKLQkJCQkJewotCQkJCQkJaWYgKENKU19UaW1lciogcFRpbWVyID0gcFRpbWVyT2JqLT5HZXRUaW1lcigpKQotCQkJCQkJewotCQkJCQkJCXBUaW1lci0+S2lsbEpTVGltZXIoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IG1fYVRpbWVyLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgICAgICAgaWYgKG1fYVRpbWVyW2ldID09IHBUaW1lcikgeworICAgICAgICAgICAgICAgIG1fYVRpbWVyLlJlbW92ZUF0KGkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJCQkJCQlmb3IgKGludCBpPTAsc3o9bV9hVGltZXIuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JCQkJCQkJewotCQkJCQkJCQlpZiAobV9hVGltZXJbaV0gPT0gcFRpbWVyKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQltX2FUaW1lci5SZW1vdmVBdChpKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQorICAgICAgICAgICAgZGVsZXRlIHBUaW1lcjsKKyAgICAgICAgICAgIHBUaW1lck9iai0+U2V0VGltZXIoTlVMTCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CiAKLQkJCQkJCQlkZWxldGUgcFRpbWVyOwotCQkJCQkJCXBUaW1lck9iai0+U2V0VGltZXIoTlVMTCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgYXBwOjpjbGVhckludGVydmFsKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0JQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwotCUFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKLQotCWlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCi0JewotCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRCgoQ0pTX0NvbnRleHQqKWNjLCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0KLQlpZiAocGFyYW1zWzBdLkdldFR5cGUoKSA9PSBWVF9meG9iamVjdCkKLQl7Ci0JCUpTRlhPYmplY3QgcE9iaiA9IHBhcmFtc1swXS5Ub1Y4T2JqZWN0KCk7Ci0JCXsKLQkJCWlmIChKU19HZXRPYmpEZWZuSUQocE9iaikgPT0gSlNfR2V0T2JqRGVmbklEKCpwUnVudGltZSwgTCJUaW1lck9iaiIpKQotCQkJewotCQkJCWlmIChDSlNfT2JqZWN0KiBwSlNPYmogPSBwYXJhbXNbMF0uVG9DSlNPYmplY3QoKSkKLQkJCQl7Ci0JCQkJCWlmIChUaW1lck9iaiogcFRpbWVyT2JqID0gKFRpbWVyT2JqKilwSlNPYmotPkdldEVtYmVkT2JqZWN0KCkpCi0JCQkJCXsKLQkJCQkJCWlmIChDSlNfVGltZXIqIHBUaW1lciA9IHBUaW1lck9iai0+R2V0VGltZXIoKSkKLQkJCQkJCXsKLQkJCQkJCQlwVGltZXItPktpbGxKU1RpbWVyKCk7Ci0KLQkJCQkJCQlmb3IgKGludCBpPTAsc3o9bV9hVGltZXIuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JCQkJCQkJewotCQkJCQkJCQlpZiAobV9hVGltZXJbaV0gPT0gcFRpbWVyKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQltX2FUaW1lci5SZW1vdmVBdChpKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCi0JCQkJCQkJZGVsZXRlIHBUaW1lcjsKLQkJCQkJCQlwVGltZXJPYmotPlNldFRpbWVyKE5VTEwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIFRSVUU7CitGWF9CT09MIGFwcDo6ZXhlY01lbnVJdGVtKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MIGFwcDo6ZXhlY01lbnVJdGVtKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIEZBTFNFOwordm9pZCBhcHA6OlRpbWVyUHJvYyhDSlNfVGltZXIqIHBUaW1lcikgeworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwVGltZXItPkdldFJ1bnRpbWUoKTsKKworICBzd2l0Y2ggKHBUaW1lci0+R2V0VHlwZSgpKSB7CisgICAgY2FzZSAwOiAgLy8gaW50ZXJ2YWwKKyAgICAgIGlmIChwUnVudGltZSkKKyAgICAgICAgUnVuSnNTY3JpcHQocFJ1bnRpbWUsIHBUaW1lci0+R2V0SlNjcmlwdCgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIGlmIChwVGltZXItPkdldFRpbWVPdXQoKSA+IDApIHsKKyAgICAgICAgaWYgKHBSdW50aW1lKQorICAgICAgICAgIFJ1bkpzU2NyaXB0KHBSdW50aW1lLCBwVGltZXItPkdldEpTY3JpcHQoKSk7CisgICAgICAgIHBUaW1lci0+S2lsbEpTVGltZXIoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9CiB9CiAKLXZvaWQgYXBwOjpUaW1lclByb2MoQ0pTX1RpbWVyKiBwVGltZXIpCi17Ci0JQVNTRVJUKHBUaW1lciAhPSBOVUxMKTsKLQotCXN3aXRjaCAocFRpbWVyLT5HZXRUeXBlKCkpCi0JewotCWNhc2UgMDogLy9pbnRlcnZhbAotCQlSdW5Kc1NjcmlwdChwVGltZXItPkdldFJ1bnRpbWUoKSwgcFRpbWVyLT5HZXRKU2NyaXB0KCkpOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCWlmIChwVGltZXItPkdldFRpbWVPdXQoKSA+IDApCi0JCXsKLQkJCVJ1bkpzU2NyaXB0KHBUaW1lci0+R2V0UnVudGltZSgpLCBwVGltZXItPkdldEpTY3JpcHQoKSk7Ci0JCQlwVGltZXItPktpbGxKU1RpbWVyKCk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCit2b2lkIGFwcDo6UnVuSnNTY3JpcHQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTY3JpcHQpIHsKKyAgaWYgKCFwUnVudGltZS0+SXNCbG9ja2luZygpKSB7CisgICAgSUpTX0NvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0NvbnRleHQoKTsKKyAgICBwQ29udGV4dC0+T25FeHRlcm5hbF9FeGVjKCk7CisgICAgQ0ZYX1dpZGVTdHJpbmcgd3RJbmZvOworICAgIHBDb250ZXh0LT5SdW5TY3JpcHQod3NTY3JpcHQsICZ3dEluZm8pOworICAgIHBSdW50aW1lLT5SZWxlYXNlQ29udGV4dChwQ29udGV4dCk7CisgIH0KIH0KIAotdm9pZCBhcHA6OlJ1bkpzU2NyaXB0KENKU19SdW50aW1lKiBwUnVudGltZSxjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTY3JpcHQpCi17Ci0JQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOwotCi0JaWYgKCFwUnVudGltZS0+SXNCbG9ja2luZygpKQotCXsKLQkJSUZYSlNfQ29udGV4dCogcENvbnRleHQgPSBwUnVudGltZS0+TmV3Q29udGV4dCgpOwotCQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0JCXBDb250ZXh0LT5PbkV4dGVybmFsX0V4ZWMoKTsKLQkJQ0ZYX1dpZGVTdHJpbmcgd3RJbmZvOwotCQlwQ29udGV4dC0+UnVuU2NyaXB0KHdzU2NyaXB0LHd0SW5mbyk7Ci0JCXBSdW50aW1lLT5SZWxlYXNlQ29udGV4dChwQ29udGV4dCk7Ci0JfQotfQotCi1GWF9CT09MIGFwcDo6Z29CYWNrKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17CitGWF9CT09MIGFwcDo6Z29CYWNrKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICAgLy8gTm90IHN1cHBvcnRlZC4KICAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgYXBwOjpnb0ZvcndhcmQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKK0ZYX0JPT0wgYXBwOjpnb0ZvcndhcmQoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogICAvLyBOb3Qgc3VwcG9ydGVkLgogICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBhcHA6Om1haWxNc2coSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCXY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7CitGWF9CT09MIGFwcDo6bWFpbE1zZyhJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmIChwYXJhbXMuc2l6ZSgpIDwgMSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlGWF9CT09MIGJVSSA9IFRSVUU7Ci0JQ0ZYX1dpZGVTdHJpbmcgY1RvID0gTCIiOwotCUNGWF9XaWRlU3RyaW5nIGNDYyA9IEwiIjsKLQlDRlhfV2lkZVN0cmluZyBjQmNjID0gTCIiOwotCUNGWF9XaWRlU3RyaW5nIGNTdWJqZWN0ID0gTCIiOwotCUNGWF9XaWRlU3RyaW5nIGNNc2cgPSBMIiI7CisgIEZYX0JPT0wgYlVJID0gVFJVRTsKKyAgQ0ZYX1dpZGVTdHJpbmcgY1RvID0gTCIiOworICBDRlhfV2lkZVN0cmluZyBjQ2MgPSBMIiI7CisgIENGWF9XaWRlU3RyaW5nIGNCY2MgPSBMIiI7CisgIENGWF9XaWRlU3RyaW5nIGNTdWJqZWN0ID0gTCIiOworICBDRlhfV2lkZVN0cmluZyBjTXNnID0gTCIiOwogCi0JaWYgKHBhcmFtcy5zaXplKCkgPCAxKQotCQlyZXR1cm4gRkFMU0U7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IHN0YXRpY19jYXN0PENKU19Db250ZXh0Kj4oY2MpOworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7CisgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gcFJ1bnRpbWUtPkdldElzb2xhdGUoKTsKIAotCWlmIChwYXJhbXNbMF0uR2V0VHlwZSgpID09IFZUX29iamVjdCkKLQl7Ci0JCUpTT2JqZWN0IHBPYmogPSBwYXJhbXNbMF0uVG9WOE9iamVjdCgpOworICBpZiAocGFyYW1zWzBdLkdldFR5cGUoKSA9PSBDSlNfVmFsdWU6OlZUX29iamVjdCkgeworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqID0gcGFyYW1zWzBdLlRvVjhPYmplY3QoKTsKIAotCQl2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiYlVJIik7Ci0JCWJVSSA9IENKU19WYWx1ZShpc29sYXRlLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQm9vbCgpOworICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSA9IEZYSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMImJVSSIpOworICAgIGJVSSA9IENKU19WYWx1ZShwUnVudGltZSwgcFZhbHVlLCBHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0Jvb2woKTsKIAotCQlwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiY1RvIik7Ci0JCWNUbyA9IENKU19WYWx1ZShpc29sYXRlLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQ0ZYV2lkZVN0cmluZygpOworICAgIHBWYWx1ZSA9IEZYSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMImNUbyIpOworICAgIGNUbyA9IENKU19WYWx1ZShwUnVudGltZSwgcFZhbHVlLCBHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0NGWFdpZGVTdHJpbmcoKTsKIAotCQlwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiY0NjIik7Ci0JCWNDYyA9IENKU19WYWx1ZShpc29sYXRlLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQ0ZYV2lkZVN0cmluZygpOworICAgIHBWYWx1ZSA9IEZYSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMImNDYyIpOworICAgIGNDYyA9IENKU19WYWx1ZShwUnVudGltZSwgcFZhbHVlLCBHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0NGWFdpZGVTdHJpbmcoKTsKIAotCQlwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiY0JjYyIpOwotCQljQmNjID0gQ0pTX1ZhbHVlKGlzb2xhdGUsIHBWYWx1ZSwgR0VUX1ZBTFVFX1RZUEUocFZhbHVlKSkuVG9DRlhXaWRlU3RyaW5nKCk7CisgICAgcFZhbHVlID0gRlhKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiY0JjYyIpOworICAgIGNCY2MgPQorICAgICAgICBDSlNfVmFsdWUocFJ1bnRpbWUsIHBWYWx1ZSwgR0VUX1ZBTFVFX1RZUEUocFZhbHVlKSkuVG9DRlhXaWRlU3RyaW5nKCk7CiAKLQkJcFZhbHVlID0gSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMImNTdWJqZWN0Iik7Ci0JCWNTdWJqZWN0ID0gQ0pTX1ZhbHVlKGlzb2xhdGUsIHBWYWx1ZSwgR0VUX1ZBTFVFX1RZUEUocFZhbHVlKSkuVG9DRlhXaWRlU3RyaW5nKCk7CisgICAgcFZhbHVlID0gRlhKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiY1N1YmplY3QiKTsKKyAgICBjU3ViamVjdCA9CisgICAgICAgIENKU19WYWx1ZShwUnVudGltZSwgcFZhbHVlLCBHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0NGWFdpZGVTdHJpbmcoKTsKIAotCQlwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiY01zZyIpOwotCQljTXNnID0gQ0pTX1ZhbHVlKGlzb2xhdGUsIHBWYWx1ZSwgR0VUX1ZBTFVFX1RZUEUocFZhbHVlKSkuVG9DRlhXaWRlU3RyaW5nKCk7Ci0JfSBlbHNlIHsKLQkJaWYgKHBhcmFtcy5zaXplKCkgPCAyKQotCQkJcmV0dXJuIEZBTFNFOworICAgIHBWYWx1ZSA9IEZYSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMImNNc2ciKTsKKyAgICBjTXNnID0KKyAgICAgICAgQ0pTX1ZhbHVlKHBSdW50aW1lLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQ0ZYV2lkZVN0cmluZygpOworICB9IGVsc2UgeworICAgIGlmIChwYXJhbXMuc2l6ZSgpIDwgMikKKyAgICAgIHJldHVybiBGQUxTRTsKIAotCQliVUkgPSBwYXJhbXNbMF0uVG9Cb29sKCk7Ci0JCWNUbyA9IHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgICBiVUkgPSBwYXJhbXNbMF0uVG9Cb29sKCk7CisgICAgY1RvID0gcGFyYW1zWzFdLlRvQ0ZYV2lkZVN0cmluZygpOwogCi0JCWlmIChwYXJhbXMuc2l6ZSgpID49IDMpCi0JCQljQ2MgPSBwYXJhbXNbMl0uVG9DRlhXaWRlU3RyaW5nKCk7Ci0JCWlmIChwYXJhbXMuc2l6ZSgpID49IDQpCi0JCQljQmNjID0gcGFyYW1zWzNdLlRvQ0ZYV2lkZVN0cmluZygpOwotCQlpZiAocGFyYW1zLnNpemUoKSA+PSA1KQotCQkJY1N1YmplY3QgPSBwYXJhbXNbNF0uVG9DRlhXaWRlU3RyaW5nKCk7Ci0JCWlmIChwYXJhbXMuc2l6ZSgpID49IDYpCi0JCQljTXNnID0gcGFyYW1zWzVdLlRvQ0ZYV2lkZVN0cmluZygpOwotCX0KKyAgICBpZiAocGFyYW1zLnNpemUoKSA+PSAzKQorICAgICAgY0NjID0gcGFyYW1zWzJdLlRvQ0ZYV2lkZVN0cmluZygpOworICAgIGlmIChwYXJhbXMuc2l6ZSgpID49IDQpCisgICAgICBjQmNjID0gcGFyYW1zWzNdLlRvQ0ZYV2lkZVN0cmluZygpOworICAgIGlmIChwYXJhbXMuc2l6ZSgpID49IDUpCisgICAgICBjU3ViamVjdCA9IHBhcmFtc1s0XS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgICBpZiAocGFyYW1zLnNpemUoKSA+PSA2KQorICAgICAgY01zZyA9IHBhcmFtc1s1XS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgfQogCi0JQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcENvbnRleHQtPkdldEpTUnVudGltZSgpOwotCUFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKKyAgcFJ1bnRpbWUtPkJlZ2luQmxvY2soKTsKKyAgcENvbnRleHQtPkdldFJlYWRlckFwcCgpLT5KU19kb2NtYWlsRm9ybShOVUxMLCAwLCBiVUksIGNUby5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNTdWJqZWN0LmNfc3RyKCksIGNDYy5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNCY2MuY19zdHIoKSwgY01zZy5jX3N0cigpKTsKKyAgcFJ1bnRpbWUtPkVuZEJsb2NrKCk7CiAKLQlDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwID0gcENvbnRleHQtPkdldFJlYWRlckFwcCgpOwotCUFTU0VSVChwQXBwICE9IE5VTEwpOwotCi0JcFJ1bnRpbWUtPkJlZ2luQmxvY2soKTsKLQlwQXBwLT5KU19kb2NtYWlsRm9ybShOVUxMLCAwLCBiVUksIGNUby5jX3N0cigpLCBjU3ViamVjdC5jX3N0cigpLCBjQ2MuY19zdHIoKSwgY0JjYy5jX3N0cigpLCBjTXNnLmNfc3RyKCkpOwotCXBSdW50aW1lLT5FbmRCbG9jaygpOwotCi0JcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgYXBwOjpsYXVuY2hVUkwoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKK0ZYX0JPT0wgYXBwOjpsYXVuY2hVUkwoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCiAgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGFwcDo6cnVudGltZUhpZ2hsaWdodChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaWYgKHZwLklzU2V0dGluZygpKQotCXsKLQkJdnA+Pm1fYlJ1bnRpbWVIaWdoTGlnaHQ7Ci0JfQotCWVsc2UKLQl7Ci0JCXZwPDxtX2JSdW50aW1lSGlnaExpZ2h0OwotCX0KK0ZYX0JPT0wgYXBwOjpydW50aW1lSGlnaGxpZ2h0KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgICB2cCA+PiBtX2JSdW50aW1lSGlnaExpZ2h0OworICB9IGVsc2UgeworICAgIHZwIDw8IG1fYlJ1bnRpbWVIaWdoTGlnaHQ7CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBhcHA6OmZ1bGxzY3JlZW4oSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgYXBwOjpmdWxsc2NyZWVuKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgYXBwOjpwb3BVcE1lbnUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlyZXR1cm4gRkFMU0U7CitGWF9CT09MIGFwcDo6cG9wVXBNZW51KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi0KLUZYX0JPT0wgYXBwOjpicm93c2VGb3JEb2MoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKK0ZYX0JPT0wgYXBwOjpicm93c2VGb3JEb2MoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCiAgIHJldHVybiBUUlVFOwogfQogCi1DRlhfV2lkZVN0cmluZyBhcHA6OlN5c1BhdGhUb1BERlBhdGgoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNPbGRQYXRoKQotewotCUNGWF9XaWRlU3RyaW5nIHNSZXQgPSBMIi8iOworQ0ZYX1dpZGVTdHJpbmcgYXBwOjpTeXNQYXRoVG9QREZQYXRoKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzT2xkUGF0aCkgeworICBDRlhfV2lkZVN0cmluZyBzUmV0ID0gTCIvIjsKIAotCWZvciAoaW50IGk9MCxzej1zT2xkUGF0aC5HZXRMZW5ndGgoKTsgaTxzejsgaSsrKQotCXsKLQkJd2NoYXJfdCBjID0gc09sZFBhdGguR2V0QXQoaSk7Ci0JCWlmIChjID09IEwnOicpCi0JCXsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChjID09IEwnXFwnKQotCQkJewotCQkJCXNSZXQgKz0gTCIvIjsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlzUmV0ICs9IGM7Ci0JCQl9Ci0JCX0KLQl9CisgIGZvciAoaW50IGkgPSAwLCBzeiA9IHNPbGRQYXRoLkdldExlbmd0aCgpOyBpIDwgc3o7IGkrKykgeworICAgIHdjaGFyX3QgYyA9IHNPbGRQYXRoLkdldEF0KGkpOworICAgIGlmIChjID09IEwnOicpIHsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGMgPT0gTCdcXCcpIHsKKyAgICAgICAgc1JldCArPSBMIi8iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc1JldCArPSBjOworICAgICAgfQorICAgIH0KKyAgfQogCi0JcmV0dXJuIHNSZXQ7CisgIHJldHVybiBzUmV0OwogfQogCi1GWF9CT09MIGFwcDo6bmV3RG9jKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIEZBTFNFOworRlhfQk9PTCBhcHA6Om5ld0RvYyhJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBhcHA6Om9wZW5Eb2MoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlyZXR1cm4gRkFMU0U7CitGWF9CT09MIGFwcDo6b3BlbkRvYyhJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBhcHA6OnJlc3BvbnNlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQ0ZYX1dpZGVTdHJpbmcgc3dRdWVzdGlvbiA9IEwiIjsKLQlDRlhfV2lkZVN0cmluZyBzd0xhYmVsID0gTCIiOwotCUNGWF9XaWRlU3RyaW5nIHN3VGl0bGUgPSBMIlBERiI7Ci0JQ0ZYX1dpZGVTdHJpbmcgc3dEZWZhdWx0ID0gTCIiOwotCWJvb2wgYlBhc3NXb3JkID0gZmFsc2U7CitGWF9CT09MIGFwcDo6cmVzcG9uc2UoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDRlhfV2lkZVN0cmluZyBzd1F1ZXN0aW9uID0gTCIiOworICBDRlhfV2lkZVN0cmluZyBzd0xhYmVsID0gTCIiOworICBDRlhfV2lkZVN0cmluZyBzd1RpdGxlID0gTCJQREYiOworICBDRlhfV2lkZVN0cmluZyBzd0RlZmF1bHQgPSBMIiI7CisgIGJvb2wgYlBhc3NXb3JkID0gZmFsc2U7CiAKLQl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IEdldElzb2xhdGUoY2MpOworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBDSlNfUnVudGltZTo6RnJvbUNvbnRleHQoY2MpOworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IHBSdW50aW1lLT5HZXRJc29sYXRlKCk7CiAKLQlpbnQgaUxlbmd0aCA9IHBhcmFtcy5zaXplKCk7Ci0JaWYgKGlMZW5ndGggPiAwICYmIHBhcmFtc1swXS5HZXRUeXBlKCkgPT0gVlRfb2JqZWN0KQotCXsKLQkJSlNPYmplY3QgcE9iaiA9IHBhcmFtc1swXS5Ub1Y4T2JqZWN0KCk7Ci0JCXY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSxwT2JqLEwiY1F1ZXN0aW9uIik7Ci0JCXN3UXVlc3Rpb24gPSBDSlNfVmFsdWUoaXNvbGF0ZSxwVmFsdWUsR0VUX1ZBTFVFX1RZUEUocFZhbHVlKSkuVG9DRlhXaWRlU3RyaW5nKCk7CisgIGludCBpTGVuZ3RoID0gcGFyYW1zLnNpemUoKTsKKyAgaWYgKGlMZW5ndGggPiAwICYmIHBhcmFtc1swXS5HZXRUeXBlKCkgPT0gQ0pTX1ZhbHVlOjpWVF9vYmplY3QpIHsKKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiA9IHBhcmFtc1swXS5Ub1Y4T2JqZWN0KCk7CisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlID0KKyAgICAgICAgRlhKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiY1F1ZXN0aW9uIik7CisgICAgc3dRdWVzdGlvbiA9CisgICAgICAgIENKU19WYWx1ZShwUnVudGltZSwgcFZhbHVlLCBHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0NGWFdpZGVTdHJpbmcoKTsKIAotCQlwVmFsdWUgPSBKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUscE9iaixMImNUaXRsZSIpOwotCQlzd1RpdGxlID0gQ0pTX1ZhbHVlKGlzb2xhdGUscFZhbHVlLEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQ0ZYV2lkZVN0cmluZygpOworICAgIHBWYWx1ZSA9IEZYSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMImNUaXRsZSIpOworICAgIHN3VGl0bGUgPQorICAgICAgICBDSlNfVmFsdWUocFJ1bnRpbWUsIHBWYWx1ZSwgR0VUX1ZBTFVFX1RZUEUocFZhbHVlKSkuVG9DRlhXaWRlU3RyaW5nKCk7CiAKLQkJcFZhbHVlID0gSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLHBPYmosTCJjRGVmYXVsdCIpOwotCQlzd0RlZmF1bHQgPSBDSlNfVmFsdWUoaXNvbGF0ZSxwVmFsdWUsR0VUX1ZBTFVFX1RZUEUocFZhbHVlKSkuVG9DRlhXaWRlU3RyaW5nKCk7CisgICAgcFZhbHVlID0gRlhKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIEwiY0RlZmF1bHQiKTsKKyAgICBzd0RlZmF1bHQgPQorICAgICAgICBDSlNfVmFsdWUocFJ1bnRpbWUsIHBWYWx1ZSwgR0VUX1ZBTFVFX1RZUEUocFZhbHVlKSkuVG9DRlhXaWRlU3RyaW5nKCk7CiAKLQkJcFZhbHVlID0gSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLHBPYmosTCJjTGFiZWwiKTsKLQkJc3dMYWJlbCA9IENKU19WYWx1ZShpc29sYXRlLHBWYWx1ZSxHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgICBwVmFsdWUgPSBGWEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSwgcE9iaiwgTCJjTGFiZWwiKTsKKyAgICBzd0xhYmVsID0KKyAgICAgICAgQ0pTX1ZhbHVlKHBSdW50aW1lLCBwVmFsdWUsIEdFVF9WQUxVRV9UWVBFKHBWYWx1ZSkpLlRvQ0ZYV2lkZVN0cmluZygpOwogCi0JCXBWYWx1ZSA9IEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSxwT2JqLEwiYlBhc3N3b3JkIik7Ci0JCWJQYXNzV29yZCA9IENKU19WYWx1ZShpc29sYXRlLHBWYWx1ZSxHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0Jvb2woKTsKLQl9Ci0JZWxzZQotCXsKLQkJc3dpdGNoKGlMZW5ndGgpCi0JCXsKLQkJY2FzZSA1OgotCQkJc3dMYWJlbCA9IHBhcmFtc1s0XS5Ub0NGWFdpZGVTdHJpbmcoKTsKLQkJCS8vIEZBTExUSFJPVUdICi0JCWNhc2UgNDoKLQkJCWJQYXNzV29yZCA9IHBhcmFtc1szXS5Ub0Jvb2woKTsKLQkJCS8vIEZBTExUSFJPVUdICi0JCWNhc2UgMzoKLQkJCXN3RGVmYXVsdCA9IHBhcmFtc1syXS5Ub0NGWFdpZGVTdHJpbmcoKTsKLQkJCS8vIEZBTExUSFJPVUdICi0JCWNhc2UgMjoKLQkJCXN3VGl0bGUgPSBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKCk7Ci0JCQkvLyBGQUxMVEhST1VHSAotCQljYXNlIDE6Ci0JCQlzd1F1ZXN0aW9uID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwotCQkJLy8gRkFMTFRIUk9VR0gKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQorICAgIHBWYWx1ZSA9IEZYSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCBMImJQYXNzd29yZCIpOworICAgIGJQYXNzV29yZCA9IENKU19WYWx1ZShwUnVudGltZSwgcFZhbHVlLCBHRVRfVkFMVUVfVFlQRShwVmFsdWUpKS5Ub0Jvb2woKTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGlMZW5ndGgpIHsKKyAgICAgIGNhc2UgNToKKyAgICAgICAgc3dMYWJlbCA9IHBhcmFtc1s0XS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgICAgIC8vIEZBTExUSFJPVUdICisgICAgICBjYXNlIDQ6CisgICAgICAgIGJQYXNzV29yZCA9IHBhcmFtc1szXS5Ub0Jvb2woKTsKKyAgICAgIC8vIEZBTExUSFJPVUdICisgICAgICBjYXNlIDM6CisgICAgICAgIHN3RGVmYXVsdCA9IHBhcmFtc1syXS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgICAgIC8vIEZBTExUSFJPVUdICisgICAgICBjYXNlIDI6CisgICAgICAgIHN3VGl0bGUgPSBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKCk7CisgICAgICAvLyBGQUxMVEhST1VHSAorICAgICAgY2FzZSAxOgorICAgICAgICBzd1F1ZXN0aW9uID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOworICAgICAgLy8gRkFMTFRIUk9VR0gKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQogCi0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwID0gcENvbnRleHQtPkdldFJlYWRlckFwcCgpOwogCi0JQ1BERkRvY19FbnZpcm9ubWVudCogcEFwcCA9IHBDb250ZXh0LT5HZXRSZWFkZXJBcHAoKTsKLQlBU1NFUlQocEFwcCAhPSBOVUxMKTsKKyAgY29uc3QgaW50IE1BWF9JTlBVVF9CWVRFUyA9IDIwNDg7CisgIHN0ZDo6dW5pcXVlX3B0cjxjaGFyW10+IHBCdWZmKG5ldyBjaGFyW01BWF9JTlBVVF9CWVRFUyArIDJdKTsKKyAgbWVtc2V0KHBCdWZmLmdldCgpLCAwLCBNQVhfSU5QVVRfQllURVMgKyAyKTsKKyAgaW50IG5MZW5ndGhCeXRlcyA9IHBBcHAtPkpTX2FwcFJlc3BvbnNlKAorICAgICAgc3dRdWVzdGlvbi5jX3N0cigpLCBzd1RpdGxlLmNfc3RyKCksIHN3RGVmYXVsdC5jX3N0cigpLCBzd0xhYmVsLmNfc3RyKCksCisgICAgICBiUGFzc1dvcmQsIHBCdWZmLmdldCgpLCBNQVhfSU5QVVRfQllURVMpOworICBpZiAobkxlbmd0aEJ5dGVzIDw9IDApIHsKKyAgICB2UmV0LlNldE51bGwoKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgbkxlbmd0aEJ5dGVzID0gc3RkOjptaW4obkxlbmd0aEJ5dGVzLCBNQVhfSU5QVVRfQllURVMpOwogCi0JY29uc3QgaW50IE1BWF9JTlBVVF9CWVRFUyA9IDIwNDg7Ci0JY2hhciogcEJ1ZmYgPSBuZXcgY2hhcltNQVhfSU5QVVRfQllURVMgKyAyXTsKLQlpZiAoIXBCdWZmKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQltZW1zZXQocEJ1ZmYsIDAsIE1BWF9JTlBVVF9CWVRFUyArIDIpOwotCWludCBuTGVuZ3RoQnl0ZXMgPSBwQXBwLT5KU19hcHBSZXNwb25zZShzd1F1ZXN0aW9uLmNfc3RyKCksIHN3VGl0bGUuY19zdHIoKSwgc3dEZWZhdWx0LmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3TGFiZWwuY19zdHIoKSwgYlBhc3NXb3JkLCBwQnVmZiwgTUFYX0lOUFVUX0JZVEVTKTsKLQlpZiAobkxlbmd0aEJ5dGVzIDw9IDApCi0JewotCQl2UmV0LlNldE51bGwoKTsKLQkJZGVsZXRlW10gcEJ1ZmY7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0JaWYgKG5MZW5ndGhCeXRlcyA+IE1BWF9JTlBVVF9CWVRFUykKLQkJbkxlbmd0aEJ5dGVzID0gTUFYX0lOUFVUX0JZVEVTOwotCi0JdlJldCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGMTZMRSgodW5zaWduZWQgc2hvcnQqKXBCdWZmLCBuTGVuZ3RoQnl0ZXMgLyBzaXplb2YodW5zaWduZWQgc2hvcnQpKS5jX3N0cigpOwotCWRlbGV0ZVtdIHBCdWZmOwotCXJldHVybiBUUlVFOworICBDRlhfV2lkZVN0cmluZyByZXRfc3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEYxNkxFKAorICAgICAgKHVuc2lnbmVkIHNob3J0KilwQnVmZi5nZXQoKSwgbkxlbmd0aEJ5dGVzIC8gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CisgIHZSZXQgPSByZXRfc3RyaW5nLmNfc3RyKCk7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGFwcDo6bWVkaWEoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgYXBwOjptZWRpYShJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBhcHA6OmV4ZWNEaWFsb2coSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgYXBwOjpleGVjRGlhbG9nKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIFRSVUU7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2FwcC5oIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9hcHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWVmMTNlCi0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9hcHAuaApAQCAtMCwwICsxLDIxMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZQREZTREtfU1JDX0pBVkFTQ1JJUFRfQVBQX0hfCisjZGVmaW5lIEZQREZTREtfU1JDX0pBVkFTQ1JJUFRfQVBQX0hfCisKKyNpbmNsdWRlICJKU19EZWZpbmUuaCIKKworY2xhc3MgQ0pTX1J1bnRpbWU7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGltZXJPYmogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitjbGFzcyBDSlNfVGltZXI7CisKK2NsYXNzIFRpbWVyT2JqIDogcHVibGljIENKU19FbWJlZE9iaiB7CisgcHVibGljOgorICBUaW1lck9iaihDSlNfT2JqZWN0KiBwSlNPYmplY3QpOworICB+VGltZXJPYmooKSBvdmVycmlkZTsKKworIHB1YmxpYzoKKyAgdm9pZCBTZXRUaW1lcihDSlNfVGltZXIqIHBUaW1lcik7CisgIENKU19UaW1lciogR2V0VGltZXIoKSBjb25zdDsKKworIHByaXZhdGU6CisgIENKU19UaW1lciogbV9wVGltZXI7Cit9OworCitjbGFzcyBDSlNfVGltZXJPYmogOiBwdWJsaWMgQ0pTX09iamVjdCB7CisgcHVibGljOgorICBDSlNfVGltZXJPYmoodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQorICB+Q0pTX1RpbWVyT2JqKCkgb3ZlcnJpZGUge30KKworICBERUNMQVJFX0pTX0NMQVNTKCk7Cit9OworCitjbGFzcyBhcHAgOiBwdWJsaWMgQ0pTX0VtYmVkT2JqIHsKKyBwdWJsaWM6CisgIGFwcChDSlNfT2JqZWN0KiBwSlNPYmplY3QpOworICB+YXBwKCkgb3ZlcnJpZGU7CisKKyBwdWJsaWM6CisgIEZYX0JPT0wgYWN0aXZlRG9jcyhJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGNhbGN1bGF0ZShJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBmb3Jtc1ZlcnNpb24oSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZnMoSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZnVsbHNjcmVlbihJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGxhbmd1YWdlKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIG1lZGlhKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHBsYXRmb3JtKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHJ1bnRpbWVIaWdobGlnaHQoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCB2aWV3ZXJUeXBlKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgdmlld2VyVmFyaWF0aW9uKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHZpZXdlclZlcnNpb24oSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKworICBGWF9CT09MIGFsZXJ0KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGJlZXAoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgYnJvd3NlRm9yRG9jKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGNsZWFySW50ZXJ2YWwoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgY2xlYXJUaW1lT3V0KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGV4ZWNEaWFsb2coSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZXhlY01lbnVJdGVtKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGZpbmRDb21wb25lbnQoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZ29CYWNrKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGdvRm9yd2FyZChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBsYXVuY2hVUkwoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgbWFpbE1zZyhJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBuZXdGREYoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgbmV3RG9jKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIG9wZW5Eb2MoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgb3BlbkZERihJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBwb3BVcE1lbnVFeChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBwb3BVcE1lbnUoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgcmVzcG9uc2UoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgc2V0SW50ZXJ2YWwoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgc2V0VGltZU91dChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKworICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgU3lzUGF0aFRvUERGUGF0aChjb25zdCBDRlhfV2lkZVN0cmluZyYgc09sZFBhdGgpOworCisgcHJpdmF0ZToKKyAgLy8gQ0pTX0VtYmVkT2JqCisgIHZvaWQgVGltZXJQcm9jKENKU19UaW1lciogcFRpbWVyKSBvdmVycmlkZTsKKyAgdm9pZCBSdW5Kc1NjcmlwdChDSlNfUnVudGltZSogcFJ1bnRpbWUsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NjcmlwdCk7CisKKyAgYm9vbCBtX2JDYWxjdWxhdGU7CisgIGJvb2wgbV9iUnVudGltZUhpZ2hMaWdodDsKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q0pTX1RpbWVyKj4gbV9hVGltZXI7Cit9OworCitjbGFzcyBDSlNfQXBwIDogcHVibGljIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pTX0FwcCh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9CisgIH5DSlNfQXBwKCkgb3ZlcnJpZGUge30KKworICBERUNMQVJFX0pTX0NMQVNTKCk7CisKKyAgSlNfU1RBVElDX1BST1AoYWN0aXZlRG9jcywgYXBwKTsKKyAgSlNfU1RBVElDX1BST1AoY2FsY3VsYXRlLCBhcHApOworICBKU19TVEFUSUNfUFJPUChmb3Jtc1ZlcnNpb24sIGFwcCk7CisgIEpTX1NUQVRJQ19QUk9QKGZzLCBhcHApOworICBKU19TVEFUSUNfUFJPUChmdWxsc2NyZWVuLCBhcHApOworICBKU19TVEFUSUNfUFJPUChsYW5ndWFnZSwgYXBwKTsKKyAgSlNfU1RBVElDX1BST1AobWVkaWEsIGFwcCk7CisgIEpTX1NUQVRJQ19QUk9QKHBsYXRmb3JtLCBhcHApOworICBKU19TVEFUSUNfUFJPUChydW50aW1lSGlnaGxpZ2h0LCBhcHApOworICBKU19TVEFUSUNfUFJPUCh2aWV3ZXJUeXBlLCBhcHApOworICBKU19TVEFUSUNfUFJPUCh2aWV3ZXJWYXJpYXRpb24sIGFwcCk7CisgIEpTX1NUQVRJQ19QUk9QKHZpZXdlclZlcnNpb24sIGFwcCk7CisKKyAgSlNfU1RBVElDX01FVEhPRChhbGVydCwgYXBwKTsKKyAgSlNfU1RBVElDX01FVEhPRChiZWVwLCBhcHApOworICBKU19TVEFUSUNfTUVUSE9EKGJyb3dzZUZvckRvYywgYXBwKTsKKyAgSlNfU1RBVElDX01FVEhPRChjbGVhckludGVydmFsLCBhcHApOworICBKU19TVEFUSUNfTUVUSE9EKGNsZWFyVGltZU91dCwgYXBwKTsKKyAgSlNfU1RBVElDX01FVEhPRChleGVjRGlhbG9nLCBhcHApOworICBKU19TVEFUSUNfTUVUSE9EKGV4ZWNNZW51SXRlbSwgYXBwKTsKKyAgSlNfU1RBVElDX01FVEhPRChmaW5kQ29tcG9uZW50LCBhcHApOworICBKU19TVEFUSUNfTUVUSE9EKGdvQmFjaywgYXBwKTsKKyAgSlNfU1RBVElDX01FVEhPRChnb0ZvcndhcmQsIGFwcCk7CisgIEpTX1NUQVRJQ19NRVRIT0QobGF1bmNoVVJMLCBhcHApOworICBKU19TVEFUSUNfTUVUSE9EKG1haWxNc2csIGFwcCk7CisgIEpTX1NUQVRJQ19NRVRIT0QobmV3RkRGLCBhcHApOworICBKU19TVEFUSUNfTUVUSE9EKG5ld0RvYywgYXBwKTsKKyAgSlNfU1RBVElDX01FVEhPRChvcGVuRG9jLCBhcHApOworICBKU19TVEFUSUNfTUVUSE9EKG9wZW5GREYsIGFwcCk7CisgIEpTX1NUQVRJQ19NRVRIT0QocG9wVXBNZW51RXgsIGFwcCk7CisgIEpTX1NUQVRJQ19NRVRIT0QocG9wVXBNZW51LCBhcHApOworICBKU19TVEFUSUNfTUVUSE9EKHJlc3BvbnNlLCBhcHApOworICBKU19TVEFUSUNfTUVUSE9EKHNldEludGVydmFsLCBhcHApOworICBKU19TVEFUSUNfTUVUSE9EKHNldFRpbWVPdXQsIGFwcCk7Cit9OworCisjZW5kaWYgIC8vIEZQREZTREtfU1JDX0pBVkFTQ1JJUFRfQVBQX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbG9yLmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvY29sb3IuY3BwCmluZGV4IDdmMzZiZTAuLmI5YzQ4MDQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvY29sb3IuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvY29sb3IuY3BwCkBAIC0xLDE3OCArMSwxNTAgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KYXZhU2NyaXB0LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0RlZmluZS5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19PYmplY3QuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfVmFsdWUuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvY29sb3IuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0NvbnRleHQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfUnVudGltZS5oIgorI2luY2x1ZGUgImNvbG9yLmgiCiAKLXN0YXRpYyB2ODo6SXNvbGF0ZSogR2V0SXNvbGF0ZShJRlhKU19Db250ZXh0KiBjYykKLXsKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKLQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CisjaW5jbHVkZSAiSlNfQ29udGV4dC5oIgorI2luY2x1ZGUgIkpTX0RlZmluZS5oIgorI2luY2x1ZGUgIkpTX0V2ZW50SGFuZGxlci5oIgorI2luY2x1ZGUgIkpTX09iamVjdC5oIgorI2luY2x1ZGUgIkpTX1J1bnRpbWUuaCIKKyNpbmNsdWRlICJKU19WYWx1ZS5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiCiAKLQlDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCk7Ci0JQVNTRVJUKHBSdW50aW1lICE9IE5VTEwpOwotCi0JcmV0dXJuIHBSdW50aW1lLT5HZXRJc29sYXRlKCk7Ci19CiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb2xvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBCRUdJTl9KU19TVEFUSUNfQ09OU1QoQ0pTX0NvbG9yKQogRU5EX0pTX1NUQVRJQ19DT05TVCgpCiAKIEJFR0lOX0pTX1NUQVRJQ19QUk9QKENKU19Db2xvcikKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShibGFjaykKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShibHVlKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGN5YW4pCQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGRrR3JheSkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShncmF5KQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGdyZWVuKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGx0R3JheSkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShtYWdlbnRhKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHJlZCkJCi0JSlNfU1RBVElDX1BST1BfRU5UUlkodHJhbnNwYXJlbnQpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkod2hpdGUpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoeWVsbG93KQorSlNfU1RBVElDX1BST1BfRU5UUlkoYmxhY2spCitKU19TVEFUSUNfUFJPUF9FTlRSWShibHVlKQorSlNfU1RBVElDX1BST1BfRU5UUlkoY3lhbikKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGRrR3JheSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGdyYXkpCitKU19TVEFUSUNfUFJPUF9FTlRSWShncmVlbikKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKGx0R3JheSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKG1hZ2VudGEpCitKU19TVEFUSUNfUFJPUF9FTlRSWShyZWQpCitKU19TVEFUSUNfUFJPUF9FTlRSWSh0cmFuc3BhcmVudCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHdoaXRlKQorSlNfU1RBVElDX1BST1BfRU5UUlkoeWVsbG93KQogRU5EX0pTX1NUQVRJQ19QUk9QKCkKIAogQkVHSU5fSlNfU1RBVElDX01FVEhPRChDSlNfQ29sb3IpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShjb252ZXJ0KQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoZXF1YWwpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGNvbnZlcnQpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGVxdWFsKQogRU5EX0pTX1NUQVRJQ19NRVRIT0QoKQogCi1JTVBMRU1FTlRfSlNfQ0xBU1MoQ0pTX0NvbG9yLGNvbG9yKQorSU1QTEVNRU5UX0pTX0NMQVNTKENKU19Db2xvciwgY29sb3IpCiAKLWNvbG9yOjpjb2xvcihDSlNfT2JqZWN0KiBwSlNPYmplY3QpOiBDSlNfRW1iZWRPYmoocEpTT2JqZWN0KQotewotCW1fY3JUcmFuc3BhcmVudCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX1RSQU5TUEFSRU5UKTsKLQltX2NyQmxhY2sgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwKTsKLQltX2NyV2hpdGUgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAxKTsKLQltX2NyUmVkID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLCAxLCAwICwwKTsKLQltX2NyR3JlZW4gPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsIDAsIDEgLDApOwotCW1fY3JCbHVlID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLCAwLCAwICwxKTsKLQltX2NyQ3lhbiA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0NNWUssIDEsIDAgLDAsIDApOwotCW1fY3JNYWdlbnRhID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfQ01ZSywgMCwgMSAsMCwgMCk7Ci0JbV9jclllbGxvdyA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0NNWUssIDAsIDAgLDEsIDApOwotCW1fY3JES0dyYXkgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwLjI1KTsKLQltX2NyR3JheSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDAuNSk7Ci0JbV9jckxUR3JheSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDAuNzUpOworY29sb3I6OmNvbG9yKENKU19PYmplY3QqIHBKU09iamVjdCkgOiBDSlNfRW1iZWRPYmoocEpTT2JqZWN0KSB7CisgIG1fY3JUcmFuc3BhcmVudCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX1RSQU5TUEFSRU5UKTsKKyAgbV9jckJsYWNrID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMCk7CisgIG1fY3JXaGl0ZSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDEpOworICBtX2NyUmVkID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLCAxLCAwLCAwKTsKKyAgbV9jckdyZWVuID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLCAwLCAxLCAwKTsKKyAgbV9jckJsdWUgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsIDAsIDAsIDEpOworICBtX2NyQ3lhbiA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0NNWUssIDEsIDAsIDAsIDApOworICBtX2NyTWFnZW50YSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0NNWUssIDAsIDEsIDAsIDApOworICBtX2NyWWVsbG93ID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfQ01ZSywgMCwgMCwgMSwgMCk7CisgIG1fY3JES0dyYXkgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwLjI1KTsKKyAgbV9jckdyYXkgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwLjUpOworICBtX2NyTFRHcmF5ID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMC43NSk7CiB9CiAKLWNvbG9yOjp+Y29sb3Iodm9pZCkKLXsKK2NvbG9yOjp+Y29sb3IoKSB7CiB9CiAKLXZvaWQgY29sb3I6OkNvbnZlcnRQV0xDb2xvclRvQXJyYXkoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IsIENKU19BcnJheSYgYXJyYXkpCi17Ci0Jc3dpdGNoIChjb2xvci5uQ29sb3JUeXBlKQotCXsKLQljYXNlIENPTE9SVFlQRV9UUkFOU1BBUkVOVDoKLQkJYXJyYXkuU2V0RWxlbWVudCgwLCBDSlNfVmFsdWUoYXJyYXkuR2V0SXNvbGF0ZSgpLCAiVCIpKTsKLQkJYnJlYWs7Ci0JY2FzZSBDT0xPUlRZUEVfR1JBWToKLQkJYXJyYXkuU2V0RWxlbWVudCgwLCBDSlNfVmFsdWUoYXJyYXkuR2V0SXNvbGF0ZSgpLCJHIikpOwotCQlhcnJheS5TZXRFbGVtZW50KDEsIENKU19WYWx1ZShhcnJheS5HZXRJc29sYXRlKCksY29sb3IuZkNvbG9yMSkpOwotCQlicmVhazsKLQljYXNlIENPTE9SVFlQRV9SR0I6Ci0JCWFycmF5LlNldEVsZW1lbnQoMCwgQ0pTX1ZhbHVlKGFycmF5LkdldElzb2xhdGUoKSwiUkdCIikpOwotCQlhcnJheS5TZXRFbGVtZW50KDEsIENKU19WYWx1ZShhcnJheS5HZXRJc29sYXRlKCksY29sb3IuZkNvbG9yMSkpOwotCQlhcnJheS5TZXRFbGVtZW50KDIsIENKU19WYWx1ZShhcnJheS5HZXRJc29sYXRlKCksY29sb3IuZkNvbG9yMikpOwotCQlhcnJheS5TZXRFbGVtZW50KDMsIENKU19WYWx1ZShhcnJheS5HZXRJc29sYXRlKCksY29sb3IuZkNvbG9yMykpOwotCQlicmVhazsKLQljYXNlIENPTE9SVFlQRV9DTVlLOgotCQlhcnJheS5TZXRFbGVtZW50KDAsIENKU19WYWx1ZShhcnJheS5HZXRJc29sYXRlKCksIkNNWUsiKSk7Ci0JCWFycmF5LlNldEVsZW1lbnQoMSwgQ0pTX1ZhbHVlKGFycmF5LkdldElzb2xhdGUoKSxjb2xvci5mQ29sb3IxKSk7Ci0JCWFycmF5LlNldEVsZW1lbnQoMiwgQ0pTX1ZhbHVlKGFycmF5LkdldElzb2xhdGUoKSxjb2xvci5mQ29sb3IyKSk7Ci0JCWFycmF5LlNldEVsZW1lbnQoMywgQ0pTX1ZhbHVlKGFycmF5LkdldElzb2xhdGUoKSxjb2xvci5mQ29sb3IzKSk7Ci0JCWFycmF5LlNldEVsZW1lbnQoNCwgQ0pTX1ZhbHVlKGFycmF5LkdldElzb2xhdGUoKSxjb2xvci5mQ29sb3I0KSk7Ci0JCWJyZWFrOwotCX0KK3ZvaWQgY29sb3I6OkNvbnZlcnRQV0xDb2xvclRvQXJyYXkoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IsIENKU19BcnJheSYgYXJyYXkpIHsKKyAgc3dpdGNoIChjb2xvci5uQ29sb3JUeXBlKSB7CisgICAgY2FzZSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ6CisgICAgICBhcnJheS5TZXRFbGVtZW50KDAsIENKU19WYWx1ZShhcnJheS5HZXRKU1J1bnRpbWUoKSwgIlQiKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENPTE9SVFlQRV9HUkFZOgorICAgICAgYXJyYXkuU2V0RWxlbWVudCgwLCBDSlNfVmFsdWUoYXJyYXkuR2V0SlNSdW50aW1lKCksICJHIikpOworICAgICAgYXJyYXkuU2V0RWxlbWVudCgxLCBDSlNfVmFsdWUoYXJyYXkuR2V0SlNSdW50aW1lKCksIGNvbG9yLmZDb2xvcjEpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ09MT1JUWVBFX1JHQjoKKyAgICAgIGFycmF5LlNldEVsZW1lbnQoMCwgQ0pTX1ZhbHVlKGFycmF5LkdldEpTUnVudGltZSgpLCAiUkdCIikpOworICAgICAgYXJyYXkuU2V0RWxlbWVudCgxLCBDSlNfVmFsdWUoYXJyYXkuR2V0SlNSdW50aW1lKCksIGNvbG9yLmZDb2xvcjEpKTsKKyAgICAgIGFycmF5LlNldEVsZW1lbnQoMiwgQ0pTX1ZhbHVlKGFycmF5LkdldEpTUnVudGltZSgpLCBjb2xvci5mQ29sb3IyKSk7CisgICAgICBhcnJheS5TZXRFbGVtZW50KDMsIENKU19WYWx1ZShhcnJheS5HZXRKU1J1bnRpbWUoKSwgY29sb3IuZkNvbG9yMykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDT0xPUlRZUEVfQ01ZSzoKKyAgICAgIGFycmF5LlNldEVsZW1lbnQoMCwgQ0pTX1ZhbHVlKGFycmF5LkdldEpTUnVudGltZSgpLCAiQ01ZSyIpKTsKKyAgICAgIGFycmF5LlNldEVsZW1lbnQoMSwgQ0pTX1ZhbHVlKGFycmF5LkdldEpTUnVudGltZSgpLCBjb2xvci5mQ29sb3IxKSk7CisgICAgICBhcnJheS5TZXRFbGVtZW50KDIsIENKU19WYWx1ZShhcnJheS5HZXRKU1J1bnRpbWUoKSwgY29sb3IuZkNvbG9yMikpOworICAgICAgYXJyYXkuU2V0RWxlbWVudCgzLCBDSlNfVmFsdWUoYXJyYXkuR2V0SlNSdW50aW1lKCksIGNvbG9yLmZDb2xvcjMpKTsKKyAgICAgIGFycmF5LlNldEVsZW1lbnQoNCwgQ0pTX1ZhbHVlKGFycmF5LkdldEpTUnVudGltZSgpLCBjb2xvci5mQ29sb3I0KSk7CisgICAgICBicmVhazsKKyAgfQogfQogCi12b2lkIGNvbG9yOjpDb252ZXJ0QXJyYXlUb1BXTENvbG9yKENKU19BcnJheSYgYXJyYXksIENQV0xfQ29sb3ImIGNvbG9yKQotewotCWludCBuQXJyYXlMZW4gPSBhcnJheS5HZXRMZW5ndGgoKTsKLQlpZiAobkFycmF5TGVuIDwgMSkgcmV0dXJuOwordm9pZCBjb2xvcjo6Q29udmVydEFycmF5VG9QV0xDb2xvcihDSlNfQXJyYXkmIGFycmF5LCBDUFdMX0NvbG9yJiBjb2xvcikgeworICBpbnQgbkFycmF5TGVuID0gYXJyYXkuR2V0TGVuZ3RoKCk7CisgIGlmIChuQXJyYXlMZW4gPCAxKQorICAgIHJldHVybjsKIAotCUNKU19WYWx1ZSB2YWx1ZShhcnJheS5HZXRJc29sYXRlKCkpOwotCWFycmF5LkdldEVsZW1lbnQoMCwgdmFsdWUpOwotCUNGWF9CeXRlU3RyaW5nIHNTcGFjZSA9IHZhbHVlLlRvQ0ZYQnl0ZVN0cmluZygpOworICBDSlNfVmFsdWUgdmFsdWUoYXJyYXkuR2V0SlNSdW50aW1lKCkpOworICBhcnJheS5HZXRFbGVtZW50KDAsIHZhbHVlKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgc1NwYWNlID0gdmFsdWUuVG9DRlhCeXRlU3RyaW5nKCk7CiAKLQlkb3VibGUgZDEgPSAwOwotCWRvdWJsZSBkMiA9IDA7Ci0JZG91YmxlIGQzID0gMDsKLQlkb3VibGUgZDQgPSAwOworICBkb3VibGUgZDEgPSAwOworICBkb3VibGUgZDIgPSAwOworICBkb3VibGUgZDMgPSAwOworICBkb3VibGUgZDQgPSAwOwogCi0JaWYgKG5BcnJheUxlbiA+IDEpCi0JewotCQlhcnJheS5HZXRFbGVtZW50KDEsIHZhbHVlKTsKLQkJZDEgPSB2YWx1ZS5Ub0RvdWJsZSgpOwotCX0KKyAgaWYgKG5BcnJheUxlbiA+IDEpIHsKKyAgICBhcnJheS5HZXRFbGVtZW50KDEsIHZhbHVlKTsKKyAgICBkMSA9IHZhbHVlLlRvRG91YmxlKCk7CisgIH0KIAotCWlmIChuQXJyYXlMZW4gPiAyKQotCXsKLQkJYXJyYXkuR2V0RWxlbWVudCgyLCB2YWx1ZSk7Ci0JCWQyID0gdmFsdWUuVG9Eb3VibGUoKTsKLQl9CisgIGlmIChuQXJyYXlMZW4gPiAyKSB7CisgICAgYXJyYXkuR2V0RWxlbWVudCgyLCB2YWx1ZSk7CisgICAgZDIgPSB2YWx1ZS5Ub0RvdWJsZSgpOworICB9CiAKLQlpZiAobkFycmF5TGVuID4gMykKLQl7Ci0JCWFycmF5LkdldEVsZW1lbnQoMywgdmFsdWUpOwotCQlkMyA9IHZhbHVlLlRvRG91YmxlKCk7Ci0JfQorICBpZiAobkFycmF5TGVuID4gMykgeworICAgIGFycmF5LkdldEVsZW1lbnQoMywgdmFsdWUpOworICAgIGQzID0gdmFsdWUuVG9Eb3VibGUoKTsKKyAgfQogCi0JaWYgKG5BcnJheUxlbiA+IDQpCi0JewotCQlhcnJheS5HZXRFbGVtZW50KDQsIHZhbHVlKTsKLQkJZDQgPSB2YWx1ZS5Ub0RvdWJsZSgpOwotCX0KKyAgaWYgKG5BcnJheUxlbiA+IDQpIHsKKyAgICBhcnJheS5HZXRFbGVtZW50KDQsIHZhbHVlKTsKKyAgICBkNCA9IHZhbHVlLlRvRG91YmxlKCk7CisgIH0KIAotCWlmIChzU3BhY2UgPT0gIlQiKQotCXsKLQkJY29sb3IgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9UUkFOU1BBUkVOVCk7Ci0JfQotCWVsc2UgaWYgKHNTcGFjZSA9PSAiRyIpCi0JewotCQljb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIChGWF9GTE9BVClkMSk7Ci0JfQotCWVsc2UgaWYgKHNTcGFjZSA9PSAiUkdCIikKLQl7Ci0JCWNvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLCAoRlhfRkxPQVQpZDEsIChGWF9GTE9BVClkMiwgKEZYX0ZMT0FUKWQzKTsKLQl9Ci0JZWxzZSBpZiAoc1NwYWNlID09ICJDTVlLIikKLQl7Ci0JCWNvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfQ01ZSywgKEZYX0ZMT0FUKWQxLCAoRlhfRkxPQVQpZDIsIChGWF9GTE9BVClkMywgKEZYX0ZMT0FUKWQ0KTsKLQl9CisgIGlmIChzU3BhY2UgPT0gIlQiKSB7CisgICAgY29sb3IgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9UUkFOU1BBUkVOVCk7CisgIH0gZWxzZSBpZiAoc1NwYWNlID09ICJHIikgeworICAgIGNvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgKEZYX0ZMT0FUKWQxKTsKKyAgfSBlbHNlIGlmIChzU3BhY2UgPT0gIlJHQiIpIHsKKyAgICBjb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgKEZYX0ZMT0FUKWQxLCAoRlhfRkxPQVQpZDIsIChGWF9GTE9BVClkMyk7CisgIH0gZWxzZSBpZiAoc1NwYWNlID09ICJDTVlLIikgeworICAgIGNvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfQ01ZSywgKEZYX0ZMT0FUKWQxLCAoRlhfRkxPQVQpZDIsIChGWF9GTE9BVClkMywKKyAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWQ0KTsKKyAgfQogfQogCi0jZGVmaW5lIEpTX0lNUExFTUVOVF9DT0xPUlBST1AocHJvcCwgdmFyKVwKLUZYX0JPT0wgY29sb3I6OnByb3AoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKVwKLXtcCi0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYztcCi0Jdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSBwQ29udGV4dC0+R2V0SlNSdW50aW1lKCktPkdldElzb2xhdGUoKTtcCi0JaWYgKHZwLklzR2V0dGluZygpKVwKLQl7XAotCQlDSlNfQXJyYXkgYXJyYXkoaXNvbGF0ZSk7XAotCQlDb252ZXJ0UFdMQ29sb3JUb0FycmF5KHZhciwgYXJyYXkpO1wKLQkJdnAgPDwgYXJyYXk7XAotCX1cCi0JZWxzZVwKLQl7XAotCQlDSlNfQXJyYXkgYXJyYXkoaXNvbGF0ZSk7XAotCQlpZiAoIXZwLkNvbnZlcnRUb0FycmF5KGFycmF5KSkgcmV0dXJuIEZBTFNFO1wKLQkJQ29udmVydEFycmF5VG9QV0xDb2xvcihhcnJheSwgdmFyKTtcCi0JfVwKLQlyZXR1cm4gVFJVRTtcCi19CisjZGVmaW5lIEpTX0lNUExFTUVOVF9DT0xPUlBST1AocHJvcCwgdmFyKSAgICAgICAgICAgICAgICAgXAorICBGWF9CT09MIGNvbG9yOjpwcm9wKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIFwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7ICAgICAgICAgICBcCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gQ0pTX1J1bnRpbWU6OkZyb21Db250ZXh0KGNjKTsgXAorICAgIENKU19BcnJheSBhcnJheShwUnVudGltZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAodnAuSXNHZXR0aW5nKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDb252ZXJ0UFdMQ29sb3JUb0FycmF5KHZhciwgYXJyYXkpOyAgICAgICAgICAgICAgICAgXAorICAgICAgdnAgPDwgYXJyYXk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoIXZwLkNvbnZlcnRUb0FycmF5KGFycmF5KSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gRkFMU0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENvbnZlcnRBcnJheVRvUFdMQ29sb3IoYXJyYXksIHZhcik7ICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBUUlVFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQogCiBKU19JTVBMRU1FTlRfQ09MT1JQUk9QKHRyYW5zcGFyZW50LCBtX2NyVHJhbnNwYXJlbnQpCiBKU19JTVBMRU1FTlRfQ09MT1JQUk9QKGJsYWNrLCBtX2NyQmxhY2spCkBAIC0xODcsNjUgKzE1OSw2NCBAQAogSlNfSU1QTEVNRU5UX0NPTE9SUFJPUChncmF5LCBtX2NyR3JheSkKIEpTX0lNUExFTUVOVF9DT0xPUlBST1AobHRHcmF5LCBtX2NyTFRHcmF5KQogCi1GWF9CT09MIGNvbG9yOjpjb252ZXJ0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0Jdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSBHZXRJc29sYXRlKGNjKTsKLQlpbnQgaVNpemUgPSBwYXJhbXMuc2l6ZSgpOwotCWlmIChpU2l6ZSA8IDIpIHJldHVybiBGQUxTRTsKLQlDSlNfQXJyYXkgYVNvdXJjZShpc29sYXRlKTsKLQlpZiAoIXBhcmFtc1swXS5Db252ZXJ0VG9BcnJheShhU291cmNlKSkgcmV0dXJuIEZBTFNFOworRlhfQk9PTCBjb2xvcjo6Y29udmVydChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7CisgIGlmIChpU2l6ZSA8IDIpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ1BXTF9Db2xvciBjclNvdXJjZTsKLQlDb252ZXJ0QXJyYXlUb1BXTENvbG9yKGFTb3VyY2UsIGNyU291cmNlKTsKKyAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gQ0pTX1J1bnRpbWU6OkZyb21Db250ZXh0KGNjKTsKKyAgQ0pTX0FycmF5IGFTb3VyY2UocFJ1bnRpbWUpOworICBpZiAoIXBhcmFtc1swXS5Db252ZXJ0VG9BcnJheShhU291cmNlKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlDRlhfQnl0ZVN0cmluZyBzRGVzdFNwYWNlID0gcGFyYW1zWzFdLlRvQ0ZYQnl0ZVN0cmluZygpOwotCWludCBuQ29sb3JUeXBlID0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOworICBDUFdMX0NvbG9yIGNyU291cmNlOworICBDb252ZXJ0QXJyYXlUb1BXTENvbG9yKGFTb3VyY2UsIGNyU291cmNlKTsKIAotCWlmIChzRGVzdFNwYWNlID09ICJUIikKLQl7Ci0JCW5Db2xvclR5cGUgPSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ7Ci0JfQotCWVsc2UgaWYgKHNEZXN0U3BhY2UgPT0gIkciKQotCXsKLQkJbkNvbG9yVHlwZSA9IENPTE9SVFlQRV9HUkFZOwotCX0KLQllbHNlIGlmIChzRGVzdFNwYWNlID09ICJSR0IiKQotCXsKLQkJbkNvbG9yVHlwZSA9IENPTE9SVFlQRV9SR0I7Ci0JfQotCWVsc2UgaWYgKHNEZXN0U3BhY2UgPT0gIkNNWUsiKQotCXsKLQkJbkNvbG9yVHlwZSA9IENPTE9SVFlQRV9DTVlLOwotCX0KKyAgQ0ZYX0J5dGVTdHJpbmcgc0Rlc3RTcGFjZSA9IHBhcmFtc1sxXS5Ub0NGWEJ5dGVTdHJpbmcoKTsKKyAgaW50IG5Db2xvclR5cGUgPSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ7CiAKLQlDSlNfQXJyYXkgYURlc3QoaXNvbGF0ZSk7Ci0JQ1BXTF9Db2xvciBjckRlc3QgPSBjclNvdXJjZTsKLQljckRlc3QuQ29udmVydENvbG9yVHlwZShuQ29sb3JUeXBlKTsKLQlDb252ZXJ0UFdMQ29sb3JUb0FycmF5KGNyRGVzdCwgYURlc3QpOwotCXZSZXQgPSBhRGVzdDsKKyAgaWYgKHNEZXN0U3BhY2UgPT0gIlQiKSB7CisgICAgbkNvbG9yVHlwZSA9IENPTE9SVFlQRV9UUkFOU1BBUkVOVDsKKyAgfSBlbHNlIGlmIChzRGVzdFNwYWNlID09ICJHIikgeworICAgIG5Db2xvclR5cGUgPSBDT0xPUlRZUEVfR1JBWTsKKyAgfSBlbHNlIGlmIChzRGVzdFNwYWNlID09ICJSR0IiKSB7CisgICAgbkNvbG9yVHlwZSA9IENPTE9SVFlQRV9SR0I7CisgIH0gZWxzZSBpZiAoc0Rlc3RTcGFjZSA9PSAiQ01ZSyIpIHsKKyAgICBuQ29sb3JUeXBlID0gQ09MT1JUWVBFX0NNWUs7CisgIH0KIAotCXJldHVybiBUUlVFOworICBDSlNfQXJyYXkgYURlc3QocFJ1bnRpbWUpOworICBDUFdMX0NvbG9yIGNyRGVzdCA9IGNyU291cmNlOworICBjckRlc3QuQ29udmVydENvbG9yVHlwZShuQ29sb3JUeXBlKTsKKyAgQ29udmVydFBXTENvbG9yVG9BcnJheShjckRlc3QsIGFEZXN0KTsKKyAgdlJldCA9IGFEZXN0OworCisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGNvbG9yOjplcXVhbChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7Ci0JaWYgKHBhcmFtcy5zaXplKCkgPCAyKSByZXR1cm4gRkFMU0U7CitGWF9CT09MIGNvbG9yOjplcXVhbChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmIChwYXJhbXMuc2l6ZSgpIDwgMikKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlDSlNfQXJyYXkgYXJyYXkxKGlzb2xhdGUpLCBhcnJheTIoaXNvbGF0ZSk7CisgIENKU19SdW50aW1lKiBwUnVudGltZSA9IENKU19SdW50aW1lOjpGcm9tQ29udGV4dChjYyk7CisgIENKU19BcnJheSBhcnJheTEocFJ1bnRpbWUpOworICBDSlNfQXJyYXkgYXJyYXkyKHBSdW50aW1lKTsKKyAgaWYgKCFwYXJhbXNbMF0uQ29udmVydFRvQXJyYXkoYXJyYXkxKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghcGFyYW1zWzFdLkNvbnZlcnRUb0FycmF5KGFycmF5MikpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JaWYgKCFwYXJhbXNbMF0uQ29udmVydFRvQXJyYXkoYXJyYXkxKSkgcmV0dXJuIEZBTFNFOwotCWlmICghcGFyYW1zWzFdLkNvbnZlcnRUb0FycmF5KGFycmF5MikpIHJldHVybiBGQUxTRTsKLQotCUNQV0xfQ29sb3IgY29sb3IxOwotCUNQV0xfQ29sb3IgY29sb3IyOwotCi0JQ29udmVydEFycmF5VG9QV0xDb2xvcihhcnJheTEsIGNvbG9yMSk7Ci0JQ29udmVydEFycmF5VG9QV0xDb2xvcihhcnJheTIsIGNvbG9yMik7Ci0KLQljb2xvcjEuQ29udmVydENvbG9yVHlwZShjb2xvcjIubkNvbG9yVHlwZSk7Ci0KLQl2UmV0ID0gY29sb3IxID09IGNvbG9yMjsKLQlyZXR1cm4gVFJVRTsKKyAgQ1BXTF9Db2xvciBjb2xvcjE7CisgIENQV0xfQ29sb3IgY29sb3IyOworICBDb252ZXJ0QXJyYXlUb1BXTENvbG9yKGFycmF5MSwgY29sb3IxKTsKKyAgQ29udmVydEFycmF5VG9QV0xDb2xvcihhcnJheTIsIGNvbG9yMik7CisgIGNvbG9yMS5Db252ZXJ0Q29sb3JUeXBlKGNvbG9yMi5uQ29sb3JUeXBlKTsKKyAgdlJldCA9IGNvbG9yMSA9PSBjb2xvcjI7CisgIHJldHVybiBUUlVFOwogfQotCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbG9yLmggYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNjM2YzYwotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvY29sb3IuaApAQCAtMCwwICsxLDg1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlBERlNES19TUkNfSkFWQVNDUklQVF9DT0xPUl9IXworI2RlZmluZSBGUERGU0RLX1NSQ19KQVZBU0NSSVBUX0NPTE9SX0hfCisKKyNpbmNsdWRlICJKU19EZWZpbmUuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9XbmQuaCIgIC8vIEZvciBDUFdMX0NvbG9yLgorCitjbGFzcyBjb2xvciA6IHB1YmxpYyBDSlNfRW1iZWRPYmogeworIHB1YmxpYzoKKyAgY29sb3IoQ0pTX09iamVjdCogcEpTT2JqZWN0KTsKKyAgfmNvbG9yKCkgb3ZlcnJpZGU7CisKKyAgRlhfQk9PTCBibGFjayhJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBibHVlKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGN5YW4oSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZGtHcmF5KElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGdyYXkoSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgZ3JlZW4oSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgbHRHcmF5KElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIG1hZ2VudGEoSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgcmVkKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHRyYW5zcGFyZW50KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCB3aGl0ZShJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCB5ZWxsb3coSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisKKyAgRlhfQk9PTCBjb252ZXJ0KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGVxdWFsKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCisgcHVibGljOgorICBzdGF0aWMgdm9pZCBDb252ZXJ0UFdMQ29sb3JUb0FycmF5KGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yLCBDSlNfQXJyYXkmIGFycmF5KTsKKyAgc3RhdGljIHZvaWQgQ29udmVydEFycmF5VG9QV0xDb2xvcihDSlNfQXJyYXkmIGFycmF5LCBDUFdMX0NvbG9yJiBjb2xvcik7CisKKyBwcml2YXRlOgorICBDUFdMX0NvbG9yIG1fY3JUcmFuc3BhcmVudDsKKyAgQ1BXTF9Db2xvciBtX2NyQmxhY2s7CisgIENQV0xfQ29sb3IgbV9jcldoaXRlOworICBDUFdMX0NvbG9yIG1fY3JSZWQ7CisgIENQV0xfQ29sb3IgbV9jckdyZWVuOworICBDUFdMX0NvbG9yIG1fY3JCbHVlOworICBDUFdMX0NvbG9yIG1fY3JDeWFuOworICBDUFdMX0NvbG9yIG1fY3JNYWdlbnRhOworICBDUFdMX0NvbG9yIG1fY3JZZWxsb3c7CisgIENQV0xfQ29sb3IgbV9jckRLR3JheTsKKyAgQ1BXTF9Db2xvciBtX2NyR3JheTsKKyAgQ1BXTF9Db2xvciBtX2NyTFRHcmF5OworfTsKKworY2xhc3MgQ0pTX0NvbG9yIDogcHVibGljIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgQ0pTX0NvbG9yKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge30KKyAgfkNKU19Db2xvcigpIG92ZXJyaWRlIHt9CisKKyAgREVDTEFSRV9KU19DTEFTUygpOworCisgIEpTX1NUQVRJQ19QUk9QKGJsYWNrLCBjb2xvcik7CisgIEpTX1NUQVRJQ19QUk9QKGJsdWUsIGNvbG9yKTsKKyAgSlNfU1RBVElDX1BST1AoY3lhbiwgY29sb3IpOworICBKU19TVEFUSUNfUFJPUChka0dyYXksIGNvbG9yKTsKKyAgSlNfU1RBVElDX1BST1AoZ3JheSwgY29sb3IpOworICBKU19TVEFUSUNfUFJPUChncmVlbiwgY29sb3IpOworICBKU19TVEFUSUNfUFJPUChsdEdyYXksIGNvbG9yKTsKKyAgSlNfU1RBVElDX1BST1AobWFnZW50YSwgY29sb3IpOworICBKU19TVEFUSUNfUFJPUChyZWQsIGNvbG9yKTsKKyAgSlNfU1RBVElDX1BST1AodHJhbnNwYXJlbnQsIGNvbG9yKTsKKyAgSlNfU1RBVElDX1BST1Aod2hpdGUsIGNvbG9yKTsKKyAgSlNfU1RBVElDX1BST1AoeWVsbG93LCBjb2xvcik7CisKKyAgSlNfU1RBVElDX01FVEhPRChjb252ZXJ0LCBjb2xvcik7CisgIEpTX1NUQVRJQ19NRVRIT0QoZXF1YWwsIGNvbG9yKTsKK307CisKKyNlbmRpZiAgLy8gRlBERlNES19TUkNfSkFWQVNDUklQVF9DT0xPUl9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9jb25zb2xlLmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvY29uc29sZS5jcHAKaW5kZXggZjEzMDE3MC4uMDcyZTViNyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9jb25zb2xlLmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbnNvbGUuY3BwCkBAIC0xLDE3ICsxLDE3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSmF2YVNjcmlwdC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19EZWZpbmUuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1ZhbHVlLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L2NvbnNvbGUuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0NvbnRleHQuaCIKKyNpbmNsdWRlICJjb25zb2xlLmgiCisKKyNpbmNsdWRlICJKU19Db250ZXh0LmgiCisjaW5jbHVkZSAiSlNfRGVmaW5lLmgiCisjaW5jbHVkZSAiSlNfRXZlbnRIYW5kbGVyLmgiCisjaW5jbHVkZSAiSlNfT2JqZWN0LmgiCisjaW5jbHVkZSAiSlNfVmFsdWUuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oIgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29uc29sZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtMjIsNDUgKzIyLDQ1IEBACiBFTkRfSlNfU1RBVElDX1BST1AoKQogCiBCRUdJTl9KU19TVEFUSUNfTUVUSE9EKENKU19Db25zb2xlKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoY2xlYXIpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShoaWRlKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkocHJpbnRsbikKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHNob3cpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKGNsZWFyKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShoaWRlKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShwcmludGxuKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShzaG93KQogRU5EX0pTX1NUQVRJQ19NRVRIT0QoKQogCi1JTVBMRU1FTlRfSlNfQ0xBU1MoQ0pTX0NvbnNvbGUsY29uc29sZSkKK0lNUExFTUVOVF9KU19DTEFTUyhDSlNfQ29uc29sZSwgY29uc29sZSkKIAotY29uc29sZTo6Y29uc29sZShDSlNfT2JqZWN0KiBwSlNPYmplY3QpOiBDSlNfRW1iZWRPYmoocEpTT2JqZWN0KQoteworY29uc29sZTo6Y29uc29sZShDSlNfT2JqZWN0KiBwSlNPYmplY3QpIDogQ0pTX0VtYmVkT2JqKHBKU09iamVjdCkge30KKworY29uc29sZTo6fmNvbnNvbGUoKSB7fQorCitGWF9CT09MIGNvbnNvbGU6OmNsZWFyKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLWNvbnNvbGU6On5jb25zb2xlKCkKLXsKK0ZYX0JPT0wgY29uc29sZTo6aGlkZShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGNvbnNvbGU6OmNsZWFyKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIFRSVUU7CitGWF9CT09MIGNvbnNvbGU6OnByaW50bG4oSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAocGFyYW1zLnNpemUoKSA8IDEpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgY29uc29sZTo6aGlkZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBUUlVFOworRlhfQk9PTCBjb25zb2xlOjpzaG93KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgcmV0dXJuIFRSVUU7CiB9Ci0KLUZYX0JPT0wgY29uc29sZTo6cHJpbnRsbihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCWlmIChwYXJhbXMuc2l6ZSgpIDwgMSkKLQl7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0JPT0wgY29uc29sZTo6c2hvdyhJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBUUlVFOwotfQotCi0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9jb25zb2xlLmggYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbnNvbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDkwMTA0Ci0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9jb25zb2xlLmgKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZQREZTREtfU1JDX0pBVkFTQ1JJUFRfQ09OU09MRV9IXworI2RlZmluZSBGUERGU0RLX1NSQ19KQVZBU0NSSVBUX0NPTlNPTEVfSF8KKworI2luY2x1ZGUgIkpTX0RlZmluZS5oIgorCitjbGFzcyBjb25zb2xlIDogcHVibGljIENKU19FbWJlZE9iaiB7CisgcHVibGljOgorICBjb25zb2xlKENKU19PYmplY3QqIHBKU09iamVjdCk7CisgIH5jb25zb2xlKCkgb3ZlcnJpZGU7CisKKyBwdWJsaWM6CisgIEZYX0JPT0wgY2xlYXIoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgaGlkZShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBwcmludGxuKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHNob3coSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Cit9OworCitjbGFzcyBDSlNfQ29uc29sZSA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIENKU19Db25zb2xlKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge30KKyAgfkNKU19Db25zb2xlKCkgb3ZlcnJpZGUge30KKworICBERUNMQVJFX0pTX0NMQVNTKCk7CisKKyAgSlNfU1RBVElDX01FVEhPRChjbGVhciwgY29uc29sZSk7CisgIEpTX1NUQVRJQ19NRVRIT0QoaGlkZSwgY29uc29sZSk7CisgIEpTX1NUQVRJQ19NRVRIT0QocHJpbnRsbiwgY29uc29sZSk7CisgIEpTX1NUQVRJQ19NRVRIT0Qoc2hvdywgY29uc29sZSk7Cit9OworCisjZW5kaWYgIC8vIEZQREZTREtfU1JDX0pBVkFTQ1JJUFRfQ09OU09MRV9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9ldmVudC5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2V2ZW50LmNwcAppbmRleCBmYjU3ZTc0Li4yMzYyYzAxIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2V2ZW50LmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2V2ZW50LmNwcApAQCAtMSwxOSArMSwxOCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0phdmFTY3JpcHQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX09iamVjdC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19WYWx1ZS5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuaCIKLS8vI2luY2x1ZGUgIi4uL2luY2x1ZGUvSlNfUmVzTWdyLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0NvbnRleHQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvZXZlbnQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvRmllbGQuaCIKKyNpbmNsdWRlICJldmVudC5oIgorCisjaW5jbHVkZSAiRmllbGQuaCIKKyNpbmNsdWRlICJKU19Db250ZXh0LmgiCisjaW5jbHVkZSAiSlNfRGVmaW5lLmgiCisjaW5jbHVkZSAiSlNfRXZlbnRIYW5kbGVyLmgiCisjaW5jbHVkZSAiSlNfT2JqZWN0LmgiCisjaW5jbHVkZSAiSlNfVmFsdWUuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oIgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBldmVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC0yMSwzNTkgKzIwLDMyMyBAQAogRU5EX0pTX1NUQVRJQ19DT05TVCgpCiAKIEJFR0lOX0pTX1NUQVRJQ19QUk9QKENKU19FdmVudCkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShjaGFuZ2UpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoY2hhbmdlRXgpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkoY29tbWl0S2V5KQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKGZpZWxkRnVsbCkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShrZXlEb3duKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKG1vZGlmaWVyKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKG5hbWUpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkocmMpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkocmljaENoYW5nZSkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShyaWNoQ2hhbmdlRXgpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkocmljaFZhbHVlKQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHNlbEVuZCkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShzZWxTdGFydCkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShzaGlmdCkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWShzb3VyY2UpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkodGFyZ2V0KQotCUpTX1NUQVRJQ19QUk9QX0VOVFJZKHRhcmdldE5hbWUpCi0JSlNfU1RBVElDX1BST1BfRU5UUlkodHlwZSkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWSh2YWx1ZSkKLQlKU19TVEFUSUNfUFJPUF9FTlRSWSh3aWxsQ29tbWl0KQorSlNfU1RBVElDX1BST1BfRU5UUlkoY2hhbmdlKQorSlNfU1RBVElDX1BST1BfRU5UUlkoY2hhbmdlRXgpCitKU19TVEFUSUNfUFJPUF9FTlRSWShjb21taXRLZXkpCitKU19TVEFUSUNfUFJPUF9FTlRSWShmaWVsZEZ1bGwpCitKU19TVEFUSUNfUFJPUF9FTlRSWShrZXlEb3duKQorSlNfU1RBVElDX1BST1BfRU5UUlkobW9kaWZpZXIpCitKU19TVEFUSUNfUFJPUF9FTlRSWShuYW1lKQorSlNfU1RBVElDX1BST1BfRU5UUlkocmMpCitKU19TVEFUSUNfUFJPUF9FTlRSWShyaWNoQ2hhbmdlKQorSlNfU1RBVElDX1BST1BfRU5UUlkocmljaENoYW5nZUV4KQorSlNfU1RBVElDX1BST1BfRU5UUlkocmljaFZhbHVlKQorSlNfU1RBVElDX1BST1BfRU5UUlkoc2VsRW5kKQorSlNfU1RBVElDX1BST1BfRU5UUlkoc2VsU3RhcnQpCitKU19TVEFUSUNfUFJPUF9FTlRSWShzaGlmdCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHNvdXJjZSkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHRhcmdldCkKK0pTX1NUQVRJQ19QUk9QX0VOVFJZKHRhcmdldE5hbWUpCitKU19TVEFUSUNfUFJPUF9FTlRSWSh0eXBlKQorSlNfU1RBVElDX1BST1BfRU5UUlkodmFsdWUpCitKU19TVEFUSUNfUFJPUF9FTlRSWSh3aWxsQ29tbWl0KQogRU5EX0pTX1NUQVRJQ19QUk9QKCkKIAotQkVHSU5fSlNfU1RBVElDX01FVEhPRChDSlNfRXZlbnQpICAKK0JFR0lOX0pTX1NUQVRJQ19NRVRIT0QoQ0pTX0V2ZW50KQogRU5EX0pTX1NUQVRJQ19NRVRIT0QoKQogCi1JTVBMRU1FTlRfSlNfQ0xBU1MoQ0pTX0V2ZW50LGV2ZW50KQorSU1QTEVNRU5UX0pTX0NMQVNTKENKU19FdmVudCwgZXZlbnQpCiAKLWV2ZW50OjpldmVudChDSlNfT2JqZWN0ICogcEpzT2JqZWN0KSA6IENKU19FbWJlZE9iaihwSnNPYmplY3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgCi17CitldmVudDo6ZXZlbnQoQ0pTX09iamVjdCogcEpzT2JqZWN0KSA6IENKU19FbWJlZE9iaihwSnNPYmplY3QpIHt9CisKK2V2ZW50Ojp+ZXZlbnQoKSB7CiB9CiAKLWV2ZW50Ojp+ZXZlbnQodm9pZCkKLXsKK0ZYX0JPT0wgZXZlbnQ6OmNoYW5nZShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CisgIENGWF9XaWRlU3RyaW5nJiB3Q2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKTsKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgaWYgKHZwLkdldFR5cGUoKSA9PSBDSlNfVmFsdWU6OlZUX3N0cmluZykKKyAgICAgIHZwID4+IHdDaGFuZ2U7CisgIH0gZWxzZSB7CisgICAgdnAgPDwgd0NoYW5nZTsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBldmVudDo6Y2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQlDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0JQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgZXZlbnQ6OmNoYW5nZUV4KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAoIXZwLklzR2V0dGluZygpKQorICAgIHJldHVybiBGQUxTRTsKIAotCUNGWF9XaWRlU3RyaW5nICZ3Q2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKTsKLQlpZiAodnAuSXNTZXR0aW5nKCkpCi0JewotCQlpZiAodnAuR2V0VHlwZSgpID09IFZUX3N0cmluZykKLQkJCXZwID4+IHdDaGFuZ2U7Ci0JfQotCWVsc2UKLQl7Ci0JCXZwIDw8IHdDaGFuZ2U7Ci0JfQotCXJldHVybiBUUlVFOworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CisKKyAgdnAgPDwgcEV2ZW50LT5DaGFuZ2VFeCgpOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBldmVudDo6Y2hhbmdlRXgoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIEZBTFNFOworRlhfQk9PTCBldmVudDo6Y29tbWl0S2V5KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICghdnAuSXNHZXR0aW5nKCkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0JQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwotCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKIAotCXZwIDw8IHBFdmVudC0+Q2hhbmdlRXgoKTsKLQlyZXR1cm4gVFJVRTsJCisgIHZwIDw8IHBFdmVudC0+Q29tbWl0S2V5KCk7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGV2ZW50Ojpjb21taXRLZXkoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIEZBTFNFOworRlhfQk9PTCBldmVudDo6ZmllbGRGdWxsKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKIAotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKLQlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOworICBpZiAoIXZwLklzR2V0dGluZygpICYmCisgICAgICB3Y3NjbXAoKGNvbnN0IHdjaGFyX3QqKXBFdmVudC0+TmFtZSgpLCBMIktleXN0cm9rZSIpICE9IDApCisgICAgcmV0dXJuIEZBTFNFOwogCi0JdnAgPDwgcEV2ZW50LT5Db21taXRLZXkoKTsKLQlyZXR1cm4gVFJVRTsKKyAgaWYgKHBFdmVudC0+RmllbGRGdWxsKCkpCisgICAgdnAgPDwgVFJVRTsKKyAgZWxzZQorICAgIHZwIDw8IEZBTFNFOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBldmVudDo6ZmllbGRGdWxsKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsJCi0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0JQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwotCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CitGWF9CT09MIGV2ZW50OjprZXlEb3duKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlpZiAoIXZwLklzR2V0dGluZygpICYmIHdjc2NtcCgoY29uc3Qgd2NoYXJfdCopcEV2ZW50LT5OYW1lKCksTCJLZXlzdHJva2UiKSAhPSAwKQotCQlyZXR1cm4gRkFMU0U7CisgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKIAotCWlmIChwRXZlbnQtPkZpZWxkRnVsbCgpKQotCQl2cCA8PCBUUlVFOwotCWVsc2UKLQkJdnAgPDwgRkFMU0U7Ci0JcmV0dXJuIFRSVUU7CisgIGlmIChwRXZlbnQtPktleURvd24oKSkKKyAgICB2cCA8PCBUUlVFOworICBlbHNlCisgICAgdnAgPDwgRkFMU0U7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGV2ZW50OjprZXlEb3duKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlpZiAoIXZwLklzR2V0dGluZygpKXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgZXZlbnQ6Om1vZGlmaWVyKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpZiAoIXZwLklzR2V0dGluZygpKQorICAgIHJldHVybiBGQUxTRTsKIAotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKLQlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CiAKLQlpZiAocEV2ZW50LT5LZXlEb3duKCkpCi0JCXZwIDw8IFRSVUU7Ci0JZWxzZQotCQl2cCA8PCBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKKyAgaWYgKHBFdmVudC0+TW9kaWZpZXIoKSkKKyAgICB2cCA8PCBUUlVFOworICBlbHNlCisgICAgdnAgPDwgRkFMU0U7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGV2ZW50Ojptb2RpZmllcihJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gRkFMU0U7CitGWF9CT09MIGV2ZW50OjpuYW1lKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQlDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0JQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogCi0JaWYgKHBFdmVudC0+TW9kaWZpZXIoKSkKLQkJdnAgPDwgVFJVRTsKLQllbHNlCi0JCXZwIDw8IEZBTFNFOwotCXJldHVybiBUUlVFOworICB2cCA8PCBwRXZlbnQtPk5hbWUoKTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgZXZlbnQ6Om5hbWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCWlmICghdnAuSXNHZXR0aW5nKCkpcmV0dXJuIEZBTFNFOworRlhfQk9PTCBldmVudDo6cmMoSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CiAKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQlDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0JQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKLQotCXZwIDw8IHBFdmVudC0+TmFtZSgpOwotCXJldHVybiBUUlVFOworICBGWF9CT09MJiBiUmMgPSBwRXZlbnQtPlJjKCk7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIHZwID4+IGJSYzsKKyAgfSBlbHNlIHsKKyAgICB2cCA8PCBiUmM7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgZXZlbnQ6OnJjKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQlDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0JQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKLQotICAgIEZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKLQlpZiAodnAuSXNTZXR0aW5nKCkpCi0JewotCQl2cD4+YlJjOwotCX0KLQllbHNlCi0JewotCQl2cDw8YlJjOwotCX0KLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgZXZlbnQ6OnJpY2hDaGFuZ2UoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gVFJVRTsKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgIH0gZWxzZSB7CisgICAgOworICB9CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGV2ZW50OjpyaWNoQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlyZXR1cm4gVFJVRTsKLQlpZiAodnAuSXNTZXR0aW5nKCkpCi0JewotCX0KLQllbHNlCi0JewotCQk7Ci0JfQotCXJldHVybiBUUlVFOworRlhfQk9PTCBldmVudDo6cmljaENoYW5nZUV4KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIHJldHVybiBUUlVFOworICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKKyAgfSBlbHNlIHsKKyAgICA7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgZXZlbnQ6OnJpY2hDaGFuZ2VFeChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JcmV0dXJuIFRSVUU7Ci0JaWYgKHZwLklzU2V0dGluZygpKQotCXsKLQl9Ci0JZWxzZQotCXsKLQkJOwotCX0KLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgZXZlbnQ6OnJpY2hWYWx1ZShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICByZXR1cm4gVFJVRTsKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgIH0gZWxzZSB7CisgICAgOworICB9CisgIHJldHVybiBUUlVFOwogfQogCitGWF9CT09MIGV2ZW50OjpzZWxFbmQoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogCi1GWF9CT09MIGV2ZW50OjpyaWNoVmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXJldHVybiBUUlVFOwotCWlmICh2cC5Jc1NldHRpbmcoKSkKLQl7Ci0JfQotCWVsc2UKLQl7Ci0JCTsKLQl9Ci0JcmV0dXJuIFRSVUU7CisgIGlmICh3Y3NjbXAoKGNvbnN0IHdjaGFyX3QqKXBFdmVudC0+TmFtZSgpLCBMIktleXN0cm9rZSIpICE9IDApIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIGludCYgaVNlbEVuZCA9IHBFdmVudC0+U2VsRW5kKCk7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIHZwID4+IGlTZWxFbmQ7CisgIH0gZWxzZSB7CisgICAgdnAgPDwgaVNlbEVuZDsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBldmVudDo6c2VsRW5kKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQlDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0JQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKK0ZYX0JPT0wgZXZlbnQ6OnNlbFN0YXJ0KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CiAKLQlpZiAod2NzY21wKChjb25zdCB3Y2hhcl90KilwRXZlbnQtPk5hbWUoKSxMIktleXN0cm9rZSIpICE9IDApCi0JewotCQlyZXR1cm4gVFJVRTsKLQl9Ci0KLQlpbnQgJmlTZWxFbmQgPSBwRXZlbnQtPlNlbEVuZCgpOwotCWlmICh2cC5Jc1NldHRpbmcoKSkKLQl7Ci0JCXZwID4+IGlTZWxFbmQ7Ci0JfQotCWVsc2UKLQl7Ci0JCXZwIDw8IGlTZWxFbmQ7Ci0JfQotCXJldHVybiBUUlVFOworICBpZiAod2NzY21wKChjb25zdCB3Y2hhcl90KilwRXZlbnQtPk5hbWUoKSwgTCJLZXlzdHJva2UiKSAhPSAwKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaW50JiBpU2VsU3RhcnQgPSBwRXZlbnQtPlNlbFN0YXJ0KCk7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIHZwID4+IGlTZWxTdGFydDsKKyAgfSBlbHNlIHsKKyAgICB2cCA8PCBpU2VsU3RhcnQ7CisgIH0KKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgZXZlbnQ6OnNlbFN0YXJ0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsJCi0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0JQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwotCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CitGWF9CT09MIGV2ZW50OjpzaGlmdChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlpZiAod2NzY21wKChjb25zdCB3Y2hhcl90KilwRXZlbnQtPk5hbWUoKSxMIktleXN0cm9rZSIpICE9IDApCi0JewotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JaW50ICZpU2VsU3RhcnQgPSBwRXZlbnQtPlNlbFN0YXJ0KCk7Ci0JaWYgKHZwLklzU2V0dGluZygpKQotCXsKLQkJdnAgPj4gaVNlbFN0YXJ0OwotCX0KLQllbHNlCi0JewotCQl2cCA8PCBpU2VsU3RhcnQ7Ci0JfQotCXJldHVybiBUUlVFOworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOworICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CisKKyAgaWYgKHBFdmVudC0+U2hpZnQoKSkKKyAgICB2cCA8PCBUUlVFOworICBlbHNlCisgICAgdnAgPDwgRkFMU0U7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIGV2ZW50OjpzaGlmdChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gRkFMU0U7CitGWF9CT09MIGV2ZW50Ojpzb3VyY2UoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQlDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0JQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogCi0JaWYgKHBFdmVudC0+U2hpZnQoKSkKLQkJdnAgPDwgVFJVRTsKLQllbHNlCi0JCXZwIDw8IEZBTFNFOwotCXJldHVybiBUUlVFOworICB2cCA8PCBwRXZlbnQtPlNvdXJjZSgpLT5HZXRKU09iamVjdCgpOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBldmVudDo6c291cmNlKElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlpZiAoIXZwLklzR2V0dGluZygpKXJldHVybiBGQUxTRTsJCitGWF9CT09MIGV2ZW50Ojp0YXJnZXQoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQlDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0JQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogCi0JdnAgPDwgcEV2ZW50LT5Tb3VyY2UoKS0+R2V0SlNPYmplY3QoKTsKLQlyZXR1cm4gVFJVRTsKKyAgdnAgPDwgcEV2ZW50LT5UYXJnZXRfRmllbGQoKS0+R2V0SlNPYmplY3QoKTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgZXZlbnQ6OnRhcmdldChJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gRkFMU0U7CitGWF9CT09MIGV2ZW50Ojp0YXJnZXROYW1lKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQlDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0JQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogCi0JdnA8PHBFdmVudC0+VGFyZ2V0X0ZpZWxkKCktPkdldEpTT2JqZWN0KCk7Ci0JcmV0dXJuIFRSVUU7CisgIHZwIDw8IHBFdmVudC0+VGFyZ2V0TmFtZSgpOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBldmVudDo6dGFyZ2V0TmFtZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gRkFMU0U7CitGWF9CT09MIGV2ZW50Ojp0eXBlKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQlDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0JQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogCi0JdnAgPDwgcEV2ZW50LT5UYXJnZXROYW1lKCk7Ci0JcmV0dXJuIFRSVUU7CisgIHZwIDw8IHBFdmVudC0+VHlwZSgpOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBldmVudDo6dHlwZShJRlhKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaWYgKCF2cC5Jc0dldHRpbmcoKSlyZXR1cm4gRkFMU0U7CitGWF9CT09MIGV2ZW50Ojp2YWx1ZShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogCi0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKLQlBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7Ci0JQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwotCUFTU0VSVChwRXZlbnQgIT0gTlVMTCk7Ci0KLQl2cCA8PCBwRXZlbnQtPlR5cGUoKTsKLQlyZXR1cm4gVFJVRTsKKyAgaWYgKHdjc2NtcCgoY29uc3Qgd2NoYXJfdCopcEV2ZW50LT5UeXBlKCksIEwiRmllbGQiKSAhPSAwKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYgKCFwRXZlbnQtPm1fcFZhbHVlKQorICAgIHJldHVybiBGQUxTRTsKKyAgQ0ZYX1dpZGVTdHJpbmcmIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsKKyAgaWYgKHZwLklzU2V0dGluZygpKSB7CisgICAgdnAgPj4gdmFsOworICB9IGVsc2UgeworICAgIHZwIDw8IHZhbDsKKyAgfQorICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBldmVudDo6dmFsdWUoSUZYSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKLQlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOworRlhfQk9PTCBldmVudDo6d2lsbENvbW1pdChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICghdnAuSXNHZXR0aW5nKCkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JaWYgKHdjc2NtcCgoY29uc3Qgd2NoYXJfdCopcEV2ZW50LT5UeXBlKCksTCJGaWVsZCIpICE9IDApCi0JCXJldHVybiBGQUxTRTsKLQlpZighcEV2ZW50LT5tX3BWYWx1ZSkKLQkJcmV0dXJuIEZBTFNFOwotCUNGWF9XaWRlU3RyaW5nICYgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOwotCWlmICh2cC5Jc1NldHRpbmcoKSkKLQl7Ci0JCXZwID4+IHZhbDsKLQl9Ci0JZWxzZQotCXsKLQkJdnAgPDwgdmFsOwotCX0KLQlyZXR1cm4gVFJVRTsKKyAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOworCisgIGlmIChwRXZlbnQtPldpbGxDb21taXQoKSkKKyAgICB2cCA8PCBUUlVFOworICBlbHNlCisgICAgdnAgPDwgRkFMU0U7CisgIHJldHVybiBUUlVFOwogfQotCi1GWF9CT09MIGV2ZW50Ojp3aWxsQ29tbWl0KElGWEpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlpZiAoIXZwLklzR2V0dGluZygpKXJldHVybiBGQUxTRTsKLQotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7Ci0JQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwotCUNKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKLQlBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwotCi0JaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKQotCQl2cCA8PCBUUlVFOwotCWVsc2UKLQkJdnAgPDwgRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvZXZlbnQuaCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvZXZlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWJlNTcxCi0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9ldmVudC5oCkBAIC0wLDAgKzEsNzYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGUERGU0RLX1NSQ19KQVZBU0NSSVBUX0VWRU5UX0hfCisjZGVmaW5lIEZQREZTREtfU1JDX0pBVkFTQ1JJUFRfRVZFTlRfSF8KKworI2luY2x1ZGUgIkpTX0RlZmluZS5oIgorCitjbGFzcyBldmVudCA6IHB1YmxpYyBDSlNfRW1iZWRPYmogeworIHB1YmxpYzoKKyAgZXZlbnQoQ0pTX09iamVjdCogcEpTT2JqZWN0KTsKKyAgfmV2ZW50KCkgb3ZlcnJpZGU7CisKKyBwdWJsaWM6CisgIEZYX0JPT0wgY2hhbmdlKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGNoYW5nZUV4KElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIGNvbW1pdEtleShJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBmaWVsZEZ1bGwoSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wga2V5RG93bihJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBtb2RpZmllcihJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBuYW1lKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHJjKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHJpY2hDaGFuZ2UoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCByaWNoQ2hhbmdlRXgoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgcmljaFZhbHVlKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHNlbEVuZChJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBzZWxTdGFydChJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBzaGlmdChJSlNfQ29udGV4dCogY2MsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBzb3VyY2UoSUpTX0NvbnRleHQqIGNjLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgdGFyZ2V0KElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHRhcmdldE5hbWUoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCB0eXBlKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHZhbHVlKElKU19Db250ZXh0KiBjYywgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHdpbGxDb21taXQoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCisgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKK307CisKK2NsYXNzIENKU19FdmVudCA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIENKU19FdmVudCh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9CisgIH5DSlNfRXZlbnQoKSBvdmVycmlkZSB7fQorCisgIERFQ0xBUkVfSlNfQ0xBU1MoKTsKKyAgSlNfU1RBVElDX1BST1AoY2hhbmdlLCBldmVudCk7CisgIEpTX1NUQVRJQ19QUk9QKGNoYW5nZUV4LCBldmVudCk7CisgIEpTX1NUQVRJQ19QUk9QKGNvbW1pdEtleSwgZXZlbnQpOworICBKU19TVEFUSUNfUFJPUChmaWVsZEZ1bGwsIGV2ZW50KTsKKyAgSlNfU1RBVElDX1BST1Aoa2V5RG93biwgZXZlbnQpOworICBKU19TVEFUSUNfUFJPUChtb2RpZmllciwgZXZlbnQpOworICBKU19TVEFUSUNfUFJPUChuYW1lLCBldmVudCk7CisgIEpTX1NUQVRJQ19QUk9QKHJjLCBldmVudCk7CisgIEpTX1NUQVRJQ19QUk9QKHJpY2hDaGFuZ2UsIGV2ZW50KTsKKyAgSlNfU1RBVElDX1BST1AocmljaENoYW5nZUV4LCBldmVudCk7CisgIEpTX1NUQVRJQ19QUk9QKHJpY2hWYWx1ZSwgZXZlbnQpOworICBKU19TVEFUSUNfUFJPUChzZWxFbmQsIGV2ZW50KTsKKyAgSlNfU1RBVElDX1BST1Aoc2VsU3RhcnQsIGV2ZW50KTsKKyAgSlNfU1RBVElDX1BST1Aoc2hpZnQsIGV2ZW50KTsKKyAgSlNfU1RBVElDX1BST1Aoc291cmNlLCBldmVudCk7CisgIEpTX1NUQVRJQ19QUk9QKHRhcmdldCwgZXZlbnQpOworICBKU19TVEFUSUNfUFJPUCh0YXJnZXROYW1lLCBldmVudCk7CisgIEpTX1NUQVRJQ19QUk9QKHR5cGUsIGV2ZW50KTsKKyAgSlNfU1RBVElDX1BST1AodmFsdWUsIGV2ZW50KTsKKyAgSlNfU1RBVElDX1BST1Aod2lsbENvbW1pdCwgZXZlbnQpOworfTsKKworI2VuZGlmICAvLyBGUERGU0RLX1NSQ19KQVZBU0NSSVBUX0VWRU5UX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2dsb2JhbC5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2dsb2JhbC5jcHAKaW5kZXggNzA2NTkzMy4uN2E0M2I2NyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9nbG9iYWwuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvZ2xvYmFsLmNwcApAQCAtMSwxOSArMSwyMCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0NvbnRleHQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19HbG9iYWxEYXRhLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX09iamVjdC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19WYWx1ZS5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KYXZhU2NyaXB0LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L2dsb2JhbC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9yZXNvdXJjZS5oIgorI2luY2x1ZGUgImdsb2JhbC5oIgorCisjaW5jbHVkZSAiSlNfQ29udGV4dC5oIgorI2luY2x1ZGUgIkpTX0RlZmluZS5oIgorI2luY2x1ZGUgIkpTX0V2ZW50SGFuZGxlci5oIgorI2luY2x1ZGUgIkpTX0dsb2JhbERhdGEuaCIKKyNpbmNsdWRlICJKU19PYmplY3QuaCIKKyNpbmNsdWRlICJKU19WYWx1ZS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9leHQuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oIgorI2luY2x1ZGUgInJlc291cmNlLmgiCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2xvYmFsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtMzgsNTIgKzM5LDQyIEBACiAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCB2YWx1ZSA9IENIYXNoPENIYXNoPEFDQywgTj46OnZhbHVlLCBOcy4uLj46OnZhbHVlOwogfTsKIAotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBKU0NPTlNUX25TdHJpbmdIYXNoID0KLSAgQ0hhc2g8J3MnLCd0JywncicsJ2knLCduJywnZyc+Ojp2YWx1ZTsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgSlNDT05TVF9uTnVtYmVySGFzaCA9Ci0gIENIYXNoPCduJywndScsJ20nLCdiJywnZScsJ3InPjo6dmFsdWU7Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgaW50IEpTQ09OU1RfbkJvb2xIYXNoID0KLSAgQ0hhc2g8J2InLCdvJywnbycsJ2wnLCdlJywnYScsJ24nPjo6dmFsdWU7Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgaW50IEpTQ09OU1RfbkRhdGVIYXNoID0KLSAgQ0hhc2g8J2QnLCdhJywndCcsJ2UnPjo6dmFsdWU7Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgaW50IEpTQ09OU1Rfbk9iamVjdEhhc2ggPQotICBDSGFzaDwnbycsJ2InLCdqJywnZScsJ2MnLCd0Jz46OnZhbHVlOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBKU0NPTlNUX25GWG9iakhhc2ggPQotICBDSGFzaDwnZicsJ3gnLCdvJywnYicsJ2onPjo6dmFsdWU7Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgaW50IEpTQ09OU1Rfbk51bGxIYXNoID0KLSAgQ0hhc2g8J24nLCd1JywnbCcsJ2wnPjo6dmFsdWU7Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgaW50IEpTQ09OU1RfblVuZGVmSGFzaCA9Ci0gIENIYXNoPCd1JywnbicsJ2QnLCdlJywnZicsJ2knLCduJywnZScsJ2QnPjo6dmFsdWU7Citjb25zdCB1bnNpZ25lZCBpbnQgSlNDT05TVF9uU3RyaW5nSGFzaCA9CisgICAgQ0hhc2g8J3MnLCAndCcsICdyJywgJ2knLCAnbicsICdnJz46OnZhbHVlOworY29uc3QgdW5zaWduZWQgaW50IEpTQ09OU1Rfbk51bWJlckhhc2ggPQorICAgIENIYXNoPCduJywgJ3UnLCAnbScsICdiJywgJ2UnLCAncic+Ojp2YWx1ZTsKK2NvbnN0IHVuc2lnbmVkIGludCBKU0NPTlNUX25Cb29sSGFzaCA9CisgICAgQ0hhc2g8J2InLCAnbycsICdvJywgJ2wnLCAnZScsICdhJywgJ24nPjo6dmFsdWU7Citjb25zdCB1bnNpZ25lZCBpbnQgSlNDT05TVF9uRGF0ZUhhc2ggPSBDSGFzaDwnZCcsICdhJywgJ3QnLCAnZSc+Ojp2YWx1ZTsKK2NvbnN0IHVuc2lnbmVkIGludCBKU0NPTlNUX25PYmplY3RIYXNoID0KKyAgICBDSGFzaDwnbycsICdiJywgJ2onLCAnZScsICdjJywgJ3QnPjo6dmFsdWU7Citjb25zdCB1bnNpZ25lZCBpbnQgSlNDT05TVF9uRlhvYmpIYXNoID0gQ0hhc2g8J2YnLCAneCcsICdvJywgJ2InLCAnaic+Ojp2YWx1ZTsKK2NvbnN0IHVuc2lnbmVkIGludCBKU0NPTlNUX25OdWxsSGFzaCA9IENIYXNoPCduJywgJ3UnLCAnbCcsICdsJz46OnZhbHVlOworY29uc3QgdW5zaWduZWQgaW50IEpTQ09OU1RfblVuZGVmSGFzaCA9CisgICAgQ0hhc2g8J3UnLCAnbicsICdkJywgJ2UnLCAnZicsICdpJywgJ24nLCAnZScsICdkJz46OnZhbHVlOworCitzdGF0aWMgdW5zaWduZWQgSlNfQ2FsY0hhc2goY29uc3Qgd2NoYXJfdCogbWFpbikgeworICByZXR1cm4gKHVuc2lnbmVkKUZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKG1haW4sIEZYU1lTX3djc2xlbihtYWluKSk7Cit9CiAKICNpZmRlZiBfREVCVUcKLWNsYXNzIEhhc2hWZXJpZnkKLXsKLXB1YmxpYzoKK2NsYXNzIEhhc2hWZXJpZnkgeworIHB1YmxpYzoKICAgSGFzaFZlcmlmeSgpOwogfSBnX2hhc2hWZXJpZnk7CiAKLUhhc2hWZXJpZnk6Okhhc2hWZXJpZnkoKQotewotICBBU1NFUlQoSlNDT05TVF9uU3RyaW5nSGFzaCA9PQotICAgIEpTX0NhbGNIYXNoKFZBTFVFX05BTUVfU1RSSU5HLHdjc2xlbihWQUxVRV9OQU1FX1NUUklORykpKTsKLSAgQVNTRVJUKEpTQ09OU1Rfbk51bWJlckhhc2ggPT0KLSAgICBKU19DYWxjSGFzaChWQUxVRV9OQU1FX05VTUJFUix3Y3NsZW4oVkFMVUVfTkFNRV9OVU1CRVIpKSk7Ci0gIEFTU0VSVChKU0NPTlNUX25Cb29sSGFzaCA9PQotICAgIEpTX0NhbGNIYXNoKFZBTFVFX05BTUVfQk9PTEVBTix3Y3NsZW4oVkFMVUVfTkFNRV9CT09MRUFOKSkpOwotICBBU1NFUlQoSlNDT05TVF9uRGF0ZUhhc2ggPT0KLSAgICBKU19DYWxjSGFzaChWQUxVRV9OQU1FX0RBVEUsd2NzbGVuKFZBTFVFX05BTUVfREFURSkpKTsKLSAgQVNTRVJUKEpTQ09OU1Rfbk9iamVjdEhhc2ggPT0KLSAgICBKU19DYWxjSGFzaChWQUxVRV9OQU1FX09CSkVDVCx3Y3NsZW4oVkFMVUVfTkFNRV9PQkpFQ1QpKSk7Ci0gIEFTU0VSVChKU0NPTlNUX25GWG9iakhhc2ggPT0KLSAgICBKU19DYWxjSGFzaChWQUxVRV9OQU1FX0ZYT0JKLHdjc2xlbihWQUxVRV9OQU1FX0ZYT0JKKSkpOwotICBBU1NFUlQoSlNDT05TVF9uTnVsbEhhc2ggPT0KLSAgICBKU19DYWxjSGFzaChWQUxVRV9OQU1FX05VTEwsd2NzbGVuKFZBTFVFX05BTUVfTlVMTCkpKTsKLSAgQVNTRVJUKEpTQ09OU1RfblVuZGVmSGFzaCA9PQotICAgIEpTX0NhbGNIYXNoKFZBTFVFX05BTUVfVU5ERUZJTkVELHdjc2xlbihWQUxVRV9OQU1FX1VOREVGSU5FRCkpKTsKK0hhc2hWZXJpZnk6Okhhc2hWZXJpZnkoKSB7CisgIEFTU0VSVChKU0NPTlNUX25TdHJpbmdIYXNoID09IEpTX0NhbGNIYXNoKGtGWEpTVmFsdWVOYW1lU3RyaW5nKSk7CisgIEFTU0VSVChKU0NPTlNUX25OdW1iZXJIYXNoID09IEpTX0NhbGNIYXNoKGtGWEpTVmFsdWVOYW1lTnVtYmVyKSk7CisgIEFTU0VSVChKU0NPTlNUX25Cb29sSGFzaCA9PSBKU19DYWxjSGFzaChrRlhKU1ZhbHVlTmFtZUJvb2xlYW4pKTsKKyAgQVNTRVJUKEpTQ09OU1RfbkRhdGVIYXNoID09IEpTX0NhbGNIYXNoKGtGWEpTVmFsdWVOYW1lRGF0ZSkpOworICBBU1NFUlQoSlNDT05TVF9uT2JqZWN0SGFzaCA9PSBKU19DYWxjSGFzaChrRlhKU1ZhbHVlTmFtZU9iamVjdCkpOworICBBU1NFUlQoSlNDT05TVF9uRlhvYmpIYXNoID09IEpTX0NhbGNIYXNoKGtGWEpTVmFsdWVOYW1lRnhvYmopKTsKKyAgQVNTRVJUKEpTQ09OU1Rfbk51bGxIYXNoID09IEpTX0NhbGNIYXNoKGtGWEpTVmFsdWVOYW1lTnVsbCkpOworICBBU1NFUlQoSlNDT05TVF9uVW5kZWZIYXNoID09IEpTX0NhbGNIYXNoKGtGWEpTVmFsdWVOYW1lVW5kZWZpbmVkKSk7CiB9CiAjZW5kaWYKIAotCiBCRUdJTl9KU19TVEFUSUNfQ09OU1QoQ0pTX0dsb2JhbCkKIEVORF9KU19TVEFUSUNfQ09OU1QoKQogCkBAIC05MSw1NDIgKzgyLDQzOCBAQAogRU5EX0pTX1NUQVRJQ19QUk9QKCkKIAogQkVHSU5fSlNfU1RBVElDX01FVEhPRChDSlNfR2xvYmFsKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc2V0UGVyc2lzdGVudCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc2V0UGVyc2lzdGVudCkKIEVORF9KU19TVEFUSUNfTUVUSE9EKCkKIAotSU1QTEVNRU5UX1NQRUNJQUxfSlNfQ0xBU1MoQ0pTX0dsb2JhbCwgZ2xvYmFsX2FsdGVybmF0ZSwgZ2xvYmFsKTsKK0lNUExFTUVOVF9TUEVDSUFMX0pTX0NMQVNTKENKU19HbG9iYWwsIEpTR2xvYmFsQWx0ZXJuYXRlLCBnbG9iYWwpOwogCi1GWF9CT09MCUNKU19HbG9iYWw6OkluaXRJbnN0YW5jZShJRlhKU19Db250ZXh0KiBjYykKLXsKLQlDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQotCWdsb2JhbF9hbHRlcm5hdGUqIHBHbG9iYWwgPSAoZ2xvYmFsX2FsdGVybmF0ZSopR2V0RW1iZWRPYmplY3QoKTsKLQlBU1NFUlQocEdsb2JhbCAhPSBOVUxMKTsKLQkKLQlwR2xvYmFsLT5Jbml0aWFsKHBDb250ZXh0LT5HZXRSZWFkZXJBcHAoKSk7Ci0JCi0JcmV0dXJuIFRSVUU7Ci19OwotCi1nbG9iYWxfYWx0ZXJuYXRlOjpnbG9iYWxfYWx0ZXJuYXRlKENKU19PYmplY3QqIHBKU09iamVjdCkKLQk6IENKU19FbWJlZE9iaihwSlNPYmplY3QpLAotCW1fcEFwcChOVUxMKQotewordm9pZCBDSlNfR2xvYmFsOjpJbml0SW5zdGFuY2UoSUpTX1J1bnRpbWUqIHBJUnVudGltZSkgeworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBzdGF0aWNfY2FzdDxDSlNfUnVudGltZSo+KHBJUnVudGltZSk7CisgIEpTR2xvYmFsQWx0ZXJuYXRlKiBwR2xvYmFsID0KKyAgICAgIHN0YXRpY19jYXN0PEpTR2xvYmFsQWx0ZXJuYXRlKj4oR2V0RW1iZWRPYmplY3QoKSk7CisgIHBHbG9iYWwtPkluaXRpYWwocFJ1bnRpbWUtPkdldFJlYWRlckFwcCgpKTsKIH0KIAotZ2xvYmFsX2FsdGVybmF0ZTo6fmdsb2JhbF9hbHRlcm5hdGUodm9pZCkKLXsKLQlBU1NFUlQobV9wQXBwICE9IE5VTEwpOwotCi0vLwlDb21taXRHbG9iYWxQZXJzaXNpdGVudFZhcmlhYmxlcygpOwotCURlc3Ryb3lHbG9iYWxQZXJzaXNpdGVudFZhcmlhYmxlcygpOwotCi0JQ0pTX1J1bnRpbWVGYWN0b3J5KiBwRmFjdG9yeSA9IG1fcEFwcC0+bV9wSlNSdW50aW1lRmFjdG9yeTsKLQlBU1NFUlQocEZhY3RvcnkpOwotCi0JcEZhY3RvcnktPlJlbGVhc2VHbG9iYWxEYXRhKCk7Ci19Ci0gIAotdm9pZCBnbG9iYWxfYWx0ZXJuYXRlOjpJbml0aWFsKENQREZEb2NfRW52aXJvbm1lbnQqIHBBcHApCi17Ci0JbV9wQXBwID0gcEFwcDsKLQotCUNKU19SdW50aW1lRmFjdG9yeSogcEZhY3RvcnkgPSBwQXBwLT5tX3BKU1J1bnRpbWVGYWN0b3J5OwotCUFTU0VSVChwRmFjdG9yeSk7Ci0JbV9wR2xvYmFsRGF0YSA9IHBGYWN0b3J5LT5OZXdHbG9iYWxEYXRhKHBBcHApOwotCVVwZGF0ZUdsb2JhbFBlcnNpc3RlbnRWYXJpYWJsZXMoKTsKK0pTR2xvYmFsQWx0ZXJuYXRlOjpKU0dsb2JhbEFsdGVybmF0ZShDSlNfT2JqZWN0KiBwSlNPYmplY3QpCisgICAgOiBDSlNfRW1iZWRPYmoocEpTT2JqZWN0KSwgbV9wQXBwKE5VTEwpIHsKIH0KIAotRlhfQk9PTAlnbG9iYWxfYWx0ZXJuYXRlOjpRdWVyeVByb3BlcnR5KEZYX0xQQ1dTVFIgcHJvcG5hbWUpCi17Ci0JcmV0dXJuIENGWF9XaWRlU3RyaW5nKHByb3BuYW1lKSAhPSBMInNldFBlcnNpc3RlbnQiOworSlNHbG9iYWxBbHRlcm5hdGU6On5KU0dsb2JhbEFsdGVybmF0ZSgpIHsKKyAgRGVzdHJveUdsb2JhbFBlcnNpc2l0ZW50VmFyaWFibGVzKCk7CisgIG1fcEdsb2JhbERhdGEtPlJlbGVhc2UoKTsKIH0KIAotRlhfQk9PTAlnbG9iYWxfYWx0ZXJuYXRlOjpEZWxQcm9wZXJ0eShJRlhKU19Db250ZXh0KiBjYywgRlhfTFBDV1NUUiBwcm9wbmFtZSwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKLQlqc19nbG9iYWxfZGF0YSogcERhdGEgPSBOVUxMOwotCUNGWF9CeXRlU3RyaW5nIHNQcm9wTmFtZSA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwcm9wbmFtZSk7Ci0KLQlpZiAobV9tYXBHbG9iYWwuTG9va3VwKHNQcm9wTmFtZSwgKEZYX0xQVk9JRCYpcERhdGEpKQotCXsKLQkJcERhdGEtPmJEZWxldGVkID0gVFJVRTsKLQkJcmV0dXJuIFRSVUU7Ci0JfQotCi0JcmV0dXJuIEZBTFNFOwordm9pZCBKU0dsb2JhbEFsdGVybmF0ZTo6SW5pdGlhbChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKSB7CisgIG1fcEFwcCA9IHBBcHA7CisgIG1fcEdsb2JhbERhdGEgPSBDSlNfR2xvYmFsRGF0YTo6R2V0UmV0YWluZWRJbnN0YW5jZShwQXBwKTsKKyAgVXBkYXRlR2xvYmFsUGVyc2lzdGVudFZhcmlhYmxlcygpOwogfQogCi1GWF9CT09MIGdsb2JhbF9hbHRlcm5hdGU6OkRvUHJvcGVydHkoSUZYSlNfQ29udGV4dCogY2MsIEZYX0xQQ1dTVFIgcHJvcG5hbWUsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCWlmICh2cC5Jc1NldHRpbmcoKSkKLQl7Ci0JCUNGWF9CeXRlU3RyaW5nIHNQcm9wTmFtZSA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwcm9wbmFtZSk7Ci0JCXN3aXRjaCAodnAuR2V0VHlwZSgpKQotCQl7Ci0JCWNhc2UgVlRfbnVtYmVyOgotCQkJewotCQkJCWRvdWJsZSBkRGF0YTsKLQkJCQl2cCA+PiBkRGF0YTsKLQkJCQlyZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR0xPQkFMREFUQV9UWVBFX05VTUJFUiwgZERhdGEsIGZhbHNlLCAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIEZBTFNFKTsKLQkJCX0KLQkJY2FzZSBWVF9ib29sZWFuOgotCQkJewotCQkJCWJvb2wgYkRhdGE7Ci0JCQkJdnAgPj4gYkRhdGE7Ci0JCQkJcmV0dXJuIFNldEdsb2JhbFZhcmlhYmxlcyhzUHJvcE5hbWUsIEpTX0dMT0JBTERBVEFfVFlQRV9CT09MRUFOLCAwLCBiRGF0YSwgIiIsIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpLCBGQUxTRSk7Ci0JCQl9Ci0JCWNhc2UgVlRfc3RyaW5nOgotCQkJewotCQkJCUNGWF9CeXRlU3RyaW5nIHNEYXRhOwotCQkJCXZwID4+IHNEYXRhOwotCQkJCXJldHVybiBTZXRHbG9iYWxWYXJpYWJsZXMoc1Byb3BOYW1lLCBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HLCAwLCBmYWxzZSwgc0RhdGEsIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpLCBGQUxTRSk7Ci0JCQl9Ci0JCWNhc2UgVlRfb2JqZWN0OgotCQkJewotCQkJCUpTT2JqZWN0IHBEYXRhOwotCQkJCXZwID4+IHBEYXRhOwotCQkJCXJldHVybiBTZXRHbG9iYWxWYXJpYWJsZXMoc1Byb3BOYW1lLCBKU19HTE9CQUxEQVRBX1RZUEVfT0JKRUNULCAwLCBmYWxzZSwgIiIsIHBEYXRhLCBGQUxTRSk7Ci0JCQl9Ci0JCWNhc2UgVlRfbnVsbDoKLQkJCXsKLQkJCQlyZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR0xPQkFMREFUQV9UWVBFX05VTEwsIDAsIGZhbHNlLCAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIEZBTFNFKTsKLQkJCX0KLQkJY2FzZSBWVF91bmRlZmluZWQ6Ci0JCQl7Ci0JCQkJRGVsUHJvcGVydHkoY2MsIHByb3BuYW1lLCBzRXJyb3IpOwotCQkJCXJldHVybiBUUlVFOwotCQkJfQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWpzX2dsb2JhbF9kYXRhKiBwRGF0YSA9IE5VTEw7Ci0JCUNGWF9CeXRlU3RyaW5nIHNQcm9wTmFtZSA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwcm9wbmFtZSk7Ci0KLQkJaWYgKG1fbWFwR2xvYmFsLkxvb2t1cChzUHJvcE5hbWUsIChGWF9MUFZPSUQmKXBEYXRhKSkKLQkJewotCQkJaWYgKHBEYXRhKQotCQkJewotCQkJCWlmICghcERhdGEtPmJEZWxldGVkKQotCQkJCXsKLQkJCQkJc3dpdGNoIChwRGF0YS0+blR5cGUpCi0JCQkJCXsKLQkJCQkJY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSOgotCQkJCQkJdnAgPDwgcERhdGEtPmREYXRhOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU46Ci0JCQkJCQl2cCA8PCBwRGF0YS0+YkRhdGE7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HOgotCQkJCQkJdnAgPDwgcERhdGEtPnNEYXRhOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVDoKLQkJCQkJCXsKLQkJCQkJCQl2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqID0gdjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpOZXcodnAuR2V0SXNvbGF0ZSgpLHBEYXRhLT5wRGF0YSk7Ci0JCQkJCQkJdnAgPDwgb2JqOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQljYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVUxMOgotCQkJCQkJdnAuU2V0TnVsbCgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIFRSVUU7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXJldHVybiBUUlVFOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQl2cC5TZXROdWxsKCk7Ci0JCQkJcmV0dXJuIFRSVUU7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQl2cC5TZXROdWxsKCk7Ci0JCQlyZXR1cm4gVFJVRTsKLQkJfQotCX0KLQotCXJldHVybiBGQUxTRTsKK0ZYX0JPT0wgSlNHbG9iYWxBbHRlcm5hdGU6OlF1ZXJ5UHJvcGVydHkoY29uc3QgRlhfV0NIQVIqIHByb3BuYW1lKSB7CisgIHJldHVybiBDRlhfV2lkZVN0cmluZyhwcm9wbmFtZSkgIT0gTCJzZXRQZXJzaXN0ZW50IjsKIH0KIAotRlhfQk9PTCBnbG9iYWxfYWx0ZXJuYXRlOjpzZXRQZXJzaXN0ZW50KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0pTX0NvbnRleHQqPihjYyk7Ci0JaWYgKHBhcmFtcy5zaXplKCkgIT0gMikKLQl7Ci0JCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0JCXJldHVybiBGQUxTRTsKLQl9CitGWF9CT09MIEpTR2xvYmFsQWx0ZXJuYXRlOjpEZWxQcm9wZXJ0eShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHJvcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGF1dG8gaXQgPSBtX21hcEdsb2JhbC5maW5kKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwcm9wbmFtZSkpOworICBpZiAoaXQgPT0gbV9tYXBHbG9iYWwuZW5kKCkpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JQ0ZYX0J5dGVTdHJpbmcgc05hbWUgPSBwYXJhbXNbMF0uVG9DRlhCeXRlU3RyaW5nKCk7Ci0KLQlqc19nbG9iYWxfZGF0YSogcERhdGEgPSBOVUxMOwotCWlmIChtX21hcEdsb2JhbC5Mb29rdXAoc05hbWUsIChGWF9MUFZPSUQmKXBEYXRhKSkKLQl7Ci0JCWlmIChwRGF0YSAmJiAhcERhdGEtPmJEZWxldGVkKQotCQl7Ci0JCQlwRGF0YS0+YlBlcnNpc3RlbnQgPSBwYXJhbXNbMV0uVG9Cb29sKCk7Ci0JCQlyZXR1cm4gVFJVRTsKLQkJfQotCX0KLQotCXNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTTk9HTE9CQUwpOwotCXJldHVybiBGQUxTRTsKKyAgaXQtPnNlY29uZC0+YkRlbGV0ZWQgPSBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBnbG9iYWxfYWx0ZXJuYXRlOjpVcGRhdGVHbG9iYWxQZXJzaXN0ZW50VmFyaWFibGVzKCkKLXsKLQlBU1NFUlQobV9wR2xvYmFsRGF0YSAhPSBOVUxMKTsKLQotCWZvciAoaW50IGk9MCxzej1tX3BHbG9iYWxEYXRhLT5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQl7Ci0JCUNKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBEYXRhID0gbV9wR2xvYmFsRGF0YS0+R2V0QXQoaSk7Ci0JCUFTU0VSVChwRGF0YSAhPSBOVUxMKTsKLQotCQlzd2l0Y2ggKHBEYXRhLT5kYXRhLm5UeXBlKQotCQl7Ci0JCWNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX05VTUJFUjoKLQkJCXRoaXMtPlNldEdsb2JhbFZhcmlhYmxlcyhwRGF0YS0+ZGF0YS5zS2V5LCBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSLCBwRGF0YS0+ZGF0YS5kRGF0YSwgZmFsc2UsICIiLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwgcERhdGEtPmJQZXJzaXN0ZW50ID09IDEpOwotCQkJSlNfUHV0T2JqZWN0TnVtYmVyKE5VTEwsKEpTRlhPYmplY3QpKCptX3BKU09iamVjdCksCi0JCQkJCQkJICAgcERhdGEtPmRhdGEuc0tleS5VVEY4RGVjb2RlKCkuY19zdHIoKSwgcERhdGEtPmRhdGEuZERhdGEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU46Ci0JCQl0aGlzLT5TZXRHbG9iYWxWYXJpYWJsZXMocERhdGEtPmRhdGEuc0tleSwgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU4sIDAsIChib29sKShwRGF0YS0+ZGF0YS5iRGF0YSA9PSAxKSwgIiIsIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpLCBwRGF0YS0+YlBlcnNpc3RlbnQgPT0gMSk7Ci0JCQlKU19QdXRPYmplY3RCb29sZWFuKE5VTEwsKEpTRlhPYmplY3QpKCptX3BKU09iamVjdCksCi0JCQkJCQkJCXBEYXRhLT5kYXRhLnNLZXkuVVRGOERlY29kZSgpLmNfc3RyKCksIChib29sKShwRGF0YS0+ZGF0YS5iRGF0YSA9PSAxKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HOgotCQkJdGhpcy0+U2V0R2xvYmFsVmFyaWFibGVzKHBEYXRhLT5kYXRhLnNLZXksIEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkcsIDAsIGZhbHNlLCBwRGF0YS0+ZGF0YS5zRGF0YSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIHBEYXRhLT5iUGVyc2lzdGVudCA9PSAxKTsKLQkJCUpTX1B1dE9iamVjdFN0cmluZyhOVUxMLCAoSlNGWE9iamVjdCkoKm1fcEpTT2JqZWN0KSwKLQkJCQkJCQkgICBwRGF0YS0+ZGF0YS5zS2V5LlVURjhEZWNvZGUoKS5jX3N0cigpLAotCQkJCQkJCSAgIHBEYXRhLT5kYXRhLnNEYXRhLlVURjhEZWNvZGUoKS5jX3N0cigpKTsKLQkJCWJyZWFrOwotCQljYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9PQkpFQ1Q6Ci0JCQl7Ci0JCQkJSUpTX1J1bnRpbWUqIHBSdW50aW1lID0gSlNfR2V0UnVudGltZSgoSlNGWE9iamVjdCkoKm1fcEpTT2JqZWN0KSk7Ci0JCQkJdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmogPSBKU19OZXdGeER5bmFtaWNPYmoocFJ1bnRpbWUsIE5VTEwsIC0xKTsKLQotCQkJCVB1dE9iamVjdFByb3BlcnR5KHBPYmosICZwRGF0YS0+ZGF0YSk7Ci0KLQkJCQl0aGlzLT5TZXRHbG9iYWxWYXJpYWJsZXMocERhdGEtPmRhdGEuc0tleSwgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVCwgMCwgZmFsc2UsICIiLCAKLQkJCQkJKEpTT2JqZWN0KXBPYmosIHBEYXRhLT5iUGVyc2lzdGVudCA9PSAxKTsKLQkJCQlKU19QdXRPYmplY3RPYmplY3QoTlVMTCwoSlNGWE9iamVjdCkoKm1fcEpTT2JqZWN0KSwKLQkJCQkJCQkJICAgcERhdGEtPmRhdGEuc0tleS5VVEY4RGVjb2RlKCkuY19zdHIoKSwgKEpTT2JqZWN0KXBPYmopOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX05VTEw6Ci0JCQl0aGlzLT5TZXRHbG9iYWxWYXJpYWJsZXMocERhdGEtPmRhdGEuc0tleSwgSlNfR0xPQkFMREFUQV9UWVBFX05VTEwsIDAsIGZhbHNlLCAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIHBEYXRhLT5iUGVyc2lzdGVudCA9PSAxKTsKLQkJCUpTX1B1dE9iamVjdE51bGwoTlVMTCwoSlNGWE9iamVjdCkoKm1fcEpTT2JqZWN0KSwKLQkJCQkJCQkgcERhdGEtPmRhdGEuc0tleS5VVEY4RGVjb2RlKCkuY19zdHIoKSk7Ci0JCQlicmVhazsKLQkJfQotCX0KK0ZYX0JPT0wgSlNHbG9iYWxBbHRlcm5hdGU6OkRvUHJvcGVydHkoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHJvcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGlmICh2cC5Jc1NldHRpbmcoKSkgeworICAgIENGWF9CeXRlU3RyaW5nIHNQcm9wTmFtZSA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwcm9wbmFtZSk7CisgICAgc3dpdGNoICh2cC5HZXRUeXBlKCkpIHsKKyAgICAgIGNhc2UgQ0pTX1ZhbHVlOjpWVF9udW1iZXI6IHsKKyAgICAgICAgZG91YmxlIGREYXRhOworICAgICAgICB2cCA+PiBkRGF0YTsKKyAgICAgICAgcmV0dXJuIFNldEdsb2JhbFZhcmlhYmxlcyhzUHJvcE5hbWUsIEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVIsIGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIEZBTFNFKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgQ0pTX1ZhbHVlOjpWVF9ib29sZWFuOiB7CisgICAgICAgIGJvb2wgYkRhdGE7CisgICAgICAgIHZwID4+IGJEYXRhOworICAgICAgICByZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU4sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRhdGEsICIiLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwgRkFMU0UpOworICAgICAgfQorICAgICAgY2FzZSBDSlNfVmFsdWU6OlZUX3N0cmluZzogeworICAgICAgICBDRlhfQnl0ZVN0cmluZyBzRGF0YTsKKyAgICAgICAgdnAgPj4gc0RhdGE7CisgICAgICAgIHJldHVybiBTZXRHbG9iYWxWYXJpYWJsZXMoc1Byb3BOYW1lLCBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBzRGF0YSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIEZBTFNFKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgQ0pTX1ZhbHVlOjpWVF9vYmplY3Q6IHsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBEYXRhOworICAgICAgICB2cCA+PiBwRGF0YTsKKyAgICAgICAgcmV0dXJuIFNldEdsb2JhbFZhcmlhYmxlcyhzUHJvcE5hbWUsIEpTX0dMT0JBTERBVEFfVFlQRV9PQkpFQ1QsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICIiLCBwRGF0YSwgRkFMU0UpOworICAgICAgfQorICAgICAgY2FzZSBDSlNfVmFsdWU6OlZUX251bGw6IHsKKyAgICAgICAgcmV0dXJuIFNldEdsb2JhbFZhcmlhYmxlcyhzUHJvcE5hbWUsIEpTX0dMT0JBTERBVEFfVFlQRV9OVUxMLCAwLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIEZBTFNFKTsKKyAgICAgIH0KKyAgICAgIGNhc2UgQ0pTX1ZhbHVlOjpWVF91bmRlZmluZWQ6IHsKKyAgICAgICAgRGVsUHJvcGVydHkoY2MsIHByb3BuYW1lLCBzRXJyb3IpOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBhdXRvIGl0ID0gbV9tYXBHbG9iYWwuZmluZChDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocHJvcG5hbWUpKTsKKyAgICBpZiAoaXQgPT0gbV9tYXBHbG9iYWwuZW5kKCkpIHsKKyAgICAgIHZwLlNldE51bGwoKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBKU0dsb2JhbERhdGEqIHBEYXRhID0gaXQtPnNlY29uZDsKKyAgICBpZiAocERhdGEtPmJEZWxldGVkKSB7CisgICAgICB2cC5TZXROdWxsKCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgc3dpdGNoIChwRGF0YS0+blR5cGUpIHsKKyAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX05VTUJFUjoKKyAgICAgICAgdnAgPDwgcERhdGEtPmREYXRhOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU46CisgICAgICAgIHZwIDw8IHBEYXRhLT5iRGF0YTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkc6CisgICAgICAgIHZwIDw8IHBEYXRhLT5zRGF0YTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9PQkpFQ1Q6IHsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iaiA9IHY4OjpMb2NhbDx2ODo6T2JqZWN0Pjo6TmV3KAorICAgICAgICAgICAgdnAuR2V0SlNSdW50aW1lKCktPkdldElzb2xhdGUoKSwgcERhdGEtPnBEYXRhKTsKKyAgICAgICAgdnAgPDwgb2JqOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX05VTEw6CisgICAgICAgIHZwLlNldE51bGwoKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQogCi12b2lkIGdsb2JhbF9hbHRlcm5hdGU6OkNvbW1pdEdsb2JhbFBlcnNpc2l0ZW50VmFyaWFibGVzKCkKLXsKLQlBU1NFUlQobV9wR2xvYmFsRGF0YSAhPSBOVUxMKTsKK0ZYX0JPT0wgSlNHbG9iYWxBbHRlcm5hdGU6OnNldFBlcnNpc3RlbnQoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBDSlNfQ29udGV4dCogcENvbnRleHQgPSBzdGF0aWNfY2FzdDxDSlNfQ29udGV4dCo+KGNjKTsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMikgeworICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLQlGWF9QT1NJVElPTgkgcG9zID0gbV9tYXBHbG9iYWwuR2V0U3RhcnRQb3NpdGlvbigpOwotCXdoaWxlIChwb3MpCi0JewotCQlDRlhfQnl0ZVN0cmluZyBuYW1lOyAKLQkJanNfZ2xvYmFsX2RhdGEqIHBEYXRhID0gTlVMTDsKLQkJbV9tYXBHbG9iYWwuR2V0TmV4dEFzc29jKHBvcywgbmFtZSwgKEZYX0xQVk9JRCYpcERhdGEpOwotCQkKLQkJaWYgKHBEYXRhKQotCQl7Ci0JCQlpZiAocERhdGEtPmJEZWxldGVkKQotCQkJewotCQkJCW1fcEdsb2JhbERhdGEtPkRlbGV0ZUdsb2JhbFZhcmlhYmxlKG5hbWUpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXN3aXRjaCAocERhdGEtPm5UeXBlKQotCQkJCXsKLQkJCQljYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVI6Ci0JCQkJCW1fcEdsb2JhbERhdGEtPlNldEdsb2JhbFZhcmlhYmxlTnVtYmVyKG5hbWUsIHBEYXRhLT5kRGF0YSk7Ci0JCQkJCW1fcEdsb2JhbERhdGEtPlNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChuYW1lLCBwRGF0YS0+YlBlcnNpc3RlbnQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9CT09MRUFOOgotCQkJCQltX3BHbG9iYWxEYXRhLT5TZXRHbG9iYWxWYXJpYWJsZUJvb2xlYW4obmFtZSwgcERhdGEtPmJEYXRhKTsKLQkJCQkJbV9wR2xvYmFsRGF0YS0+U2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KG5hbWUsIHBEYXRhLT5iUGVyc2lzdGVudCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX1NUUklORzoKLQkJCQkJbV9wR2xvYmFsRGF0YS0+U2V0R2xvYmFsVmFyaWFibGVTdHJpbmcobmFtZSwgcERhdGEtPnNEYXRhKTsKLQkJCQkJbV9wR2xvYmFsRGF0YS0+U2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KG5hbWUsIHBEYXRhLT5iUGVyc2lzdGVudCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVDoKLQkJCQkJLy9pZiAocERhdGEtPnBEYXRhKQotCQkJCQl7Ci0JCQkJCQlDSlNfR2xvYmFsVmFyaWFibGVBcnJheSBhcnJheTsKLQkJCQkJCXY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmogPSB2ODo6TG9jYWw8djg6Ok9iamVjdD46Ok5ldyhHZXRKU09iamVjdCgpLT5HZXRJc29sYXRlKCkscERhdGEtPnBEYXRhKTsKLQkJCQkJCU9iamVjdFRvQXJyYXkob2JqLCBhcnJheSk7Ci0JCQkJCQltX3BHbG9iYWxEYXRhLT5TZXRHbG9iYWxWYXJpYWJsZU9iamVjdChuYW1lLCBhcnJheSk7Ci0JCQkJCQltX3BHbG9iYWxEYXRhLT5TZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQobmFtZSwgcERhdGEtPmJQZXJzaXN0ZW50KTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVUxMOgotCQkJCQltX3BHbG9iYWxEYXRhLT5TZXRHbG9iYWxWYXJpYWJsZU51bGwobmFtZSk7Ci0JCQkJCW1fcEdsb2JhbERhdGEtPlNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChuYW1lLCBwRGF0YS0+YlBlcnNpc3RlbnQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgIGF1dG8gaXQgPSBtX21hcEdsb2JhbC5maW5kKHBhcmFtc1swXS5Ub0NGWEJ5dGVTdHJpbmcoKSk7CisgIGlmIChpdCAhPSBtX21hcEdsb2JhbC5lbmQoKSkgeworICAgIEpTR2xvYmFsRGF0YSogcERhdGEgPSBpdC0+c2Vjb25kOworICAgIGlmICghcERhdGEtPmJEZWxldGVkKSB7CisgICAgICBwRGF0YS0+YlBlcnNpc3RlbnQgPSBwYXJhbXNbMV0uVG9Cb29sKCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKworICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU05PR0xPQkFMKTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi12b2lkIGdsb2JhbF9hbHRlcm5hdGU6Ok9iamVjdFRvQXJyYXkodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosIENKU19HbG9iYWxWYXJpYWJsZUFycmF5JiBhcnJheSkKLXsKLQl2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBwT2JqLT5DcmVhdGlvbkNvbnRleHQoKTsKLQl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IGNvbnRleHQtPkdldElzb2xhdGUoKTsKLQl2ODo6TG9jYWw8djg6OkFycmF5PiBwS2V5TGlzdCA9IEpTX0dldE9iamVjdEVsZW1lbnROYW1lcyhpc29sYXRlLCBwT2JqKTsKLQlpbnQJbk9iakVsZW1lbnRzID0gcEtleUxpc3QtPkxlbmd0aCgpOwordm9pZCBKU0dsb2JhbEFsdGVybmF0ZTo6VXBkYXRlR2xvYmFsUGVyc2lzdGVudFZhcmlhYmxlcygpIHsKKyAgZm9yIChpbnQgaSA9IDAsIHN6ID0gbV9wR2xvYmFsRGF0YS0+R2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgIENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBEYXRhID0gbV9wR2xvYmFsRGF0YS0+R2V0QXQoaSk7CisgICAgc3dpdGNoIChwRGF0YS0+ZGF0YS5uVHlwZSkgeworICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSOgorICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZXMocERhdGEtPmRhdGEuc0tleSwgSlNfR0xPQkFMREFUQV9UWVBFX05VTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5kYXRhLmREYXRhLCBmYWxzZSwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwgcERhdGEtPmJQZXJzaXN0ZW50ID09IDEpOworICAgICAgICBGWEpTX1B1dE9iamVjdE51bWJlcihOVUxMLCBtX3BKU09iamVjdC0+VG9WOE9iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZGF0YS5zS2V5LlVURjhEZWNvZGUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZGF0YS5kRGF0YSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfQk9PTEVBTjoKKyAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVzKHBEYXRhLT5kYXRhLnNLZXksIEpTX0dMT0JBTERBVEFfVFlQRV9CT09MRUFOLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJvb2wpKHBEYXRhLT5kYXRhLmJEYXRhID09IDEpLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpLCBwRGF0YS0+YlBlcnNpc3RlbnQgPT0gMSk7CisgICAgICAgIEZYSlNfUHV0T2JqZWN0Qm9vbGVhbihOVUxMLCBtX3BKU09iamVjdC0+VG9WOE9iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmRhdGEuc0tleS5VVEY4RGVjb2RlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChib29sKShwRGF0YS0+ZGF0YS5iRGF0YSA9PSAxKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HOgorICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZXMocERhdGEtPmRhdGEuc0tleSwgSlNfR0xPQkFMREFUQV9UWVBFX1NUUklORywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBwRGF0YS0+ZGF0YS5zRGF0YSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+YlBlcnNpc3RlbnQgPT0gMSk7CisgICAgICAgIEZYSlNfUHV0T2JqZWN0U3RyaW5nKE5VTEwsIG1fcEpTT2JqZWN0LT5Ub1Y4T2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5kYXRhLnNLZXkuVVRGOERlY29kZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5kYXRhLnNEYXRhLlVURjhEZWNvZGUoKS5jX3N0cigpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9PQkpFQ1Q6IHsKKyAgICAgICAgdjg6Oklzb2xhdGUqIHBSdW50aW1lID0gbV9wSlNPYmplY3QtPlRvVjhPYmplY3QoKS0+R2V0SXNvbGF0ZSgpOworICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiA9IEZYSlNfTmV3RnhEeW5hbWljT2JqKHBSdW50aW1lLCBOVUxMLCAtMSk7CiAKLQlmb3IgKGludCBpPTA7IGk8bk9iakVsZW1lbnRzOyBpKyspCi0JewotCQkKLQkJQ0ZYX1dpZGVTdHJpbmcgd3MgPSBKU19Ub1N0cmluZyhpc29sYXRlLCBKU19HZXRBcnJheUVsZW1lbnQoaXNvbGF0ZSwgcEtleUxpc3QsIGkpKTsKLQkJQ0ZYX0J5dGVTdHJpbmcgc0tleSA9IHdzLlVURjhFbmNvZGUoKTsKKyAgICAgICAgUHV0T2JqZWN0UHJvcGVydHkocE9iaiwgJnBEYXRhLT5kYXRhKTsKIAotCQl2ODo6TG9jYWw8djg6OlZhbHVlPiB2ID0gSlNfR2V0T2JqZWN0RWxlbWVudChpc29sYXRlLCBwT2JqLCB3cy5jX3N0cigpKTsKLQkJRlhKU1ZBTFVFVFlQRSB2dCA9IEdFVF9WQUxVRV9UWVBFKHYpOwotCQlzd2l0Y2ggKHZ0KQotCQl7Ci0JCWNhc2UgVlRfbnVtYmVyOgotCQkJewotCQkJCUNKU19LZXlWYWx1ZSogcE9iakVsZW1lbnQgPSBuZXcgQ0pTX0tleVZhbHVlOwotCQkJCXBPYmpFbGVtZW50LT5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVI7Ci0JCQkJcE9iakVsZW1lbnQtPnNLZXkgPSBzS2V5OwotCQkJCXBPYmpFbGVtZW50LT5kRGF0YSA9IEpTX1RvTnVtYmVyKGlzb2xhdGUsIHYpOwotCQkJCWFycmF5LkFkZChwT2JqRWxlbWVudCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBWVF9ib29sZWFuOgotCQkJewotCQkJCUNKU19LZXlWYWx1ZSogcE9iakVsZW1lbnQgPSBuZXcgQ0pTX0tleVZhbHVlOwotCQkJCXBPYmpFbGVtZW50LT5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9CT09MRUFOOwotCQkJCXBPYmpFbGVtZW50LT5zS2V5ID0gc0tleTsKLQkJCQlwT2JqRWxlbWVudC0+ZERhdGEgPSBKU19Ub0Jvb2xlYW4oaXNvbGF0ZSwgdik7Ci0JCQkJYXJyYXkuQWRkKHBPYmpFbGVtZW50KTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFZUX3N0cmluZzoKLQkJCXsKLQkJCQlDRlhfQnl0ZVN0cmluZyBzVmFsdWUgPSBDSlNfVmFsdWUoaXNvbGF0ZSwgdiwgVlRfc3RyaW5nKS5Ub0NGWEJ5dGVTdHJpbmcoKTsKLQkJCQlDSlNfS2V5VmFsdWUqIHBPYmpFbGVtZW50ID0gbmV3IENKU19LZXlWYWx1ZTsKLQkJCQlwT2JqRWxlbWVudC0+blR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HOwotCQkJCXBPYmpFbGVtZW50LT5zS2V5ID0gc0tleTsKLQkJCQlwT2JqRWxlbWVudC0+c0RhdGEgPSBzVmFsdWU7Ci0JCQkJYXJyYXkuQWRkKHBPYmpFbGVtZW50KTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFZUX29iamVjdDoKLQkJCXsKLQkJCQlDSlNfS2V5VmFsdWUqIHBPYmpFbGVtZW50ID0gbmV3IENKU19LZXlWYWx1ZTsKLQkJCQlwT2JqRWxlbWVudC0+blR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfT0JKRUNUOwotCQkJCXBPYmpFbGVtZW50LT5zS2V5ID0gc0tleTsKLQkJCQlPYmplY3RUb0FycmF5KEpTX1RvT2JqZWN0KGlzb2xhdGUsIHYpLCBwT2JqRWxlbWVudC0+b2JqRGF0YSk7Ci0JCQkJYXJyYXkuQWRkKHBPYmpFbGVtZW50KTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFZUX251bGw6Ci0JCQl7Ci0JCQkJQ0pTX0tleVZhbHVlKiBwT2JqRWxlbWVudCA9IG5ldyBDSlNfS2V5VmFsdWU7Ci0JCQkJcE9iakVsZW1lbnQtPm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX05VTEw7Ci0JCQkJcE9iakVsZW1lbnQtPnNLZXkgPSBzS2V5OwotCQkJCWFycmF5LkFkZChwT2JqRWxlbWVudCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQorICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZXMocERhdGEtPmRhdGEuc0tleSwgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAiIiwgcE9iaiwgcERhdGEtPmJQZXJzaXN0ZW50ID09IDEpOworICAgICAgICBGWEpTX1B1dE9iamVjdE9iamVjdChOVUxMLCBtX3BKU09iamVjdC0+VG9WOE9iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZGF0YS5zS2V5LlVURjhEZWNvZGUoKS5jX3N0cigpLCBwT2JqKTsKKworICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX05VTEw6CisgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlcyhwRGF0YS0+ZGF0YS5zS2V5LCBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTCwgMCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+YlBlcnNpc3RlbnQgPT0gMSk7CisgICAgICAgIEZYSlNfUHV0T2JqZWN0TnVsbChOVUxMLCBtX3BKU09iamVjdC0+VG9WOE9iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmRhdGEuc0tleS5VVEY4RGVjb2RlKCkuY19zdHIoKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQogfQogCi12b2lkIGdsb2JhbF9hbHRlcm5hdGU6OlB1dE9iamVjdFByb3BlcnR5KHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLCBDSlNfS2V5VmFsdWUqIHBEYXRhKQotewotCUFTU0VSVChwRGF0YSAhPSBOVUxMKTsKLQotCWZvciAoaW50IGk9MCxzej1wRGF0YS0+b2JqRGF0YS5Db3VudCgpOyBpPHN6OyBpKyspCi0JewotCQlDSlNfS2V5VmFsdWUqIHBPYmpEYXRhID0gcERhdGEtPm9iakRhdGEuR2V0QXQoaSk7Ci0JCUFTU0VSVChwT2JqRGF0YSAhPSBOVUxMKTsKLQotCQlzd2l0Y2ggKHBPYmpEYXRhLT5uVHlwZSkKLQkJewotCQljYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVI6Ci0JCQlKU19QdXRPYmplY3ROdW1iZXIoTlVMTCwoSlNPYmplY3QpcE9iaiwgcE9iakRhdGEtPnNLZXkuVVRGOERlY29kZSgpLmNfc3RyKCksIHBPYmpEYXRhLT5kRGF0YSk7Ci0JCQlicmVhazsKLQkJY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfQk9PTEVBTjoKLQkJCUpTX1B1dE9iamVjdEJvb2xlYW4oTlVMTCwoSlNPYmplY3QpcE9iaiwgcE9iakRhdGEtPnNLZXkuVVRGOERlY29kZSgpLmNfc3RyKCksIChib29sKShwT2JqRGF0YS0+YkRhdGEgPT0gMSkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX1NUUklORzoKLQkJCUpTX1B1dE9iamVjdFN0cmluZyhOVUxMLChKU09iamVjdClwT2JqLCBwT2JqRGF0YS0+c0tleS5VVEY4RGVjb2RlKCkuY19zdHIoKSwgcE9iakRhdGEtPnNEYXRhLlVURjhEZWNvZGUoKS5jX3N0cigpKTsKLQkJCWJyZWFrOwotCQljYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9PQkpFQ1Q6Ci0JCQl7Ci0JCQkJSUpTX1J1bnRpbWUqIHBSdW50aW1lID0gSlNfR2V0UnVudGltZSgoSlNGWE9iamVjdCkoKm1fcEpTT2JqZWN0KSk7Ci0JCQkJdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBOZXdPYmogPSBKU19OZXdGeER5bmFtaWNPYmoocFJ1bnRpbWUsIE5VTEwsIC0xKTsKLQkJCQlQdXRPYmplY3RQcm9wZXJ0eShwTmV3T2JqLCBwT2JqRGF0YSk7Ci0JCQkJSlNfUHV0T2JqZWN0T2JqZWN0KE5VTEwsIChKU09iamVjdClwT2JqLCBwT2JqRGF0YS0+c0tleS5VVEY4RGVjb2RlKCkuY19zdHIoKSwgKEpTT2JqZWN0KXBOZXdPYmopOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX05VTEw6Ci0JCQlKU19QdXRPYmplY3ROdWxsKE5VTEwsKEpTT2JqZWN0KXBPYmosIHBPYmpEYXRhLT5zS2V5LlVURjhEZWNvZGUoKS5jX3N0cigpKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQordm9pZCBKU0dsb2JhbEFsdGVybmF0ZTo6Q29tbWl0R2xvYmFsUGVyc2lzaXRlbnRWYXJpYWJsZXMoSUpTX0NvbnRleHQqIGNjKSB7CisgIGZvciAoYXV0byBpdCA9IG1fbWFwR2xvYmFsLmJlZ2luKCk7IGl0ICE9IG1fbWFwR2xvYmFsLmVuZCgpOyArK2l0KSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9IGl0LT5maXJzdDsKKyAgICBKU0dsb2JhbERhdGEqIHBEYXRhID0gaXQtPnNlY29uZDsKKyAgICBpZiAocERhdGEtPmJEZWxldGVkKSB7CisgICAgICBtX3BHbG9iYWxEYXRhLT5EZWxldGVHbG9iYWxWYXJpYWJsZShuYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoIChwRGF0YS0+blR5cGUpIHsKKyAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSOgorICAgICAgICAgIG1fcEdsb2JhbERhdGEtPlNldEdsb2JhbFZhcmlhYmxlTnVtYmVyKG5hbWUsIHBEYXRhLT5kRGF0YSk7CisgICAgICAgICAgbV9wR2xvYmFsRGF0YS0+U2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KG5hbWUsIHBEYXRhLT5iUGVyc2lzdGVudCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU46CisgICAgICAgICAgbV9wR2xvYmFsRGF0YS0+U2V0R2xvYmFsVmFyaWFibGVCb29sZWFuKG5hbWUsIHBEYXRhLT5iRGF0YSk7CisgICAgICAgICAgbV9wR2xvYmFsRGF0YS0+U2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KG5hbWUsIHBEYXRhLT5iUGVyc2lzdGVudCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX1NUUklORzoKKyAgICAgICAgICBtX3BHbG9iYWxEYXRhLT5TZXRHbG9iYWxWYXJpYWJsZVN0cmluZyhuYW1lLCBwRGF0YS0+c0RhdGEpOworICAgICAgICAgIG1fcEdsb2JhbERhdGEtPlNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChuYW1lLCBwRGF0YS0+YlBlcnNpc3RlbnQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9PQkpFQ1Q6CisgICAgICAgICAgeworICAgICAgICAgICAgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkgYXJyYXk7CisgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqID0gdjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpOZXcoCisgICAgICAgICAgICAgICAgR2V0SlNPYmplY3QoKS0+R2V0SXNvbGF0ZSgpLCBwRGF0YS0+cERhdGEpOworICAgICAgICAgICAgT2JqZWN0VG9BcnJheShjYywgb2JqLCBhcnJheSk7CisgICAgICAgICAgICBtX3BHbG9iYWxEYXRhLT5TZXRHbG9iYWxWYXJpYWJsZU9iamVjdChuYW1lLCBhcnJheSk7CisgICAgICAgICAgICBtX3BHbG9iYWxEYXRhLT5TZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+YlBlcnNpc3RlbnQpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTDoKKyAgICAgICAgICBtX3BHbG9iYWxEYXRhLT5TZXRHbG9iYWxWYXJpYWJsZU51bGwobmFtZSk7CisgICAgICAgICAgbV9wR2xvYmFsRGF0YS0+U2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KG5hbWUsIHBEYXRhLT5iUGVyc2lzdGVudCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CiB9CiAKLXZvaWQgZ2xvYmFsX2FsdGVybmF0ZTo6RGVzdHJveUdsb2JhbFBlcnNpc2l0ZW50VmFyaWFibGVzKCkKLXsKLQlGWF9QT1NJVElPTgkgcG9zID0gbV9tYXBHbG9iYWwuR2V0U3RhcnRQb3NpdGlvbigpOwotCXdoaWxlIChwb3MpCi0JewotCQlDRlhfQnl0ZVN0cmluZyBuYW1lOyAKLQkJanNfZ2xvYmFsX2RhdGEqIHBEYXRhID0gTlVMTDsKLQkJbV9tYXBHbG9iYWwuR2V0TmV4dEFzc29jKHBvcywgbmFtZSwgKEZYX0xQVk9JRCYpcERhdGEpOwotCQlkZWxldGUgcERhdGE7Ci0JfQordm9pZCBKU0dsb2JhbEFsdGVybmF0ZTo6T2JqZWN0VG9BcnJheShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfR2xvYmFsVmFyaWFibGVBcnJheSYgYXJyYXkpIHsKKyAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSBwT2JqLT5HZXRJc29sYXRlKCk7CisgIENKU19SdW50aW1lKiBwUnVudGltZSA9IENKU19SdW50aW1lOjpGcm9tQ29udGV4dChjYyk7CiAKLQltX21hcEdsb2JhbC5SZW1vdmVBbGwoKTsKKyAgdjg6OkxvY2FsPHY4OjpBcnJheT4gcEtleUxpc3QgPSBGWEpTX0dldE9iamVjdEVsZW1lbnROYW1lcyhpc29sYXRlLCBwT2JqKTsKKyAgaW50IG5PYmpFbGVtZW50cyA9IHBLZXlMaXN0LT5MZW5ndGgoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuT2JqRWxlbWVudHM7IGkrKykgeworICAgIENGWF9XaWRlU3RyaW5nIHdzID0KKyAgICAgICAgRlhKU19Ub1N0cmluZyhpc29sYXRlLCBGWEpTX0dldEFycmF5RWxlbWVudChpc29sYXRlLCBwS2V5TGlzdCwgaSkpOworICAgIENGWF9CeXRlU3RyaW5nIHNLZXkgPSB3cy5VVEY4RW5jb2RlKCk7CisKKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2ID0gRlhKU19HZXRPYmplY3RFbGVtZW50KGlzb2xhdGUsIHBPYmosIHdzLmNfc3RyKCkpOworICAgIHN3aXRjaCAoR0VUX1ZBTFVFX1RZUEUodikpIHsKKyAgICAgIGNhc2UgQ0pTX1ZhbHVlOjpWVF9udW1iZXI6IHsKKyAgICAgICAgQ0pTX0tleVZhbHVlKiBwT2JqRWxlbWVudCA9IG5ldyBDSlNfS2V5VmFsdWU7CisgICAgICAgIHBPYmpFbGVtZW50LT5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVI7CisgICAgICAgIHBPYmpFbGVtZW50LT5zS2V5ID0gc0tleTsKKyAgICAgICAgcE9iakVsZW1lbnQtPmREYXRhID0gRlhKU19Ub051bWJlcihpc29sYXRlLCB2KTsKKyAgICAgICAgYXJyYXkuQWRkKHBPYmpFbGVtZW50KTsKKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIENKU19WYWx1ZTo6VlRfYm9vbGVhbjogeworICAgICAgICBDSlNfS2V5VmFsdWUqIHBPYmpFbGVtZW50ID0gbmV3IENKU19LZXlWYWx1ZTsKKyAgICAgICAgcE9iakVsZW1lbnQtPm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU47CisgICAgICAgIHBPYmpFbGVtZW50LT5zS2V5ID0gc0tleTsKKyAgICAgICAgcE9iakVsZW1lbnQtPmREYXRhID0gRlhKU19Ub0Jvb2xlYW4oaXNvbGF0ZSwgdik7CisgICAgICAgIGFycmF5LkFkZChwT2JqRWxlbWVudCk7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBDSlNfVmFsdWU6OlZUX3N0cmluZzogeworICAgICAgICBDRlhfQnl0ZVN0cmluZyBzVmFsdWUgPQorICAgICAgICAgICAgQ0pTX1ZhbHVlKHBSdW50aW1lLCB2LCBDSlNfVmFsdWU6OlZUX3N0cmluZykuVG9DRlhCeXRlU3RyaW5nKCk7CisgICAgICAgIENKU19LZXlWYWx1ZSogcE9iakVsZW1lbnQgPSBuZXcgQ0pTX0tleVZhbHVlOworICAgICAgICBwT2JqRWxlbWVudC0+blR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HOworICAgICAgICBwT2JqRWxlbWVudC0+c0tleSA9IHNLZXk7CisgICAgICAgIHBPYmpFbGVtZW50LT5zRGF0YSA9IHNWYWx1ZTsKKyAgICAgICAgYXJyYXkuQWRkKHBPYmpFbGVtZW50KTsKKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIENKU19WYWx1ZTo6VlRfb2JqZWN0OiB7CisgICAgICAgIENKU19LZXlWYWx1ZSogcE9iakVsZW1lbnQgPSBuZXcgQ0pTX0tleVZhbHVlOworICAgICAgICBwT2JqRWxlbWVudC0+blR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfT0JKRUNUOworICAgICAgICBwT2JqRWxlbWVudC0+c0tleSA9IHNLZXk7CisgICAgICAgIE9iamVjdFRvQXJyYXkoY2MsIEZYSlNfVG9PYmplY3QoaXNvbGF0ZSwgdiksIHBPYmpFbGVtZW50LT5vYmpEYXRhKTsKKyAgICAgICAgYXJyYXkuQWRkKHBPYmpFbGVtZW50KTsKKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIENKU19WYWx1ZTo6VlRfbnVsbDogeworICAgICAgICBDSlNfS2V5VmFsdWUqIHBPYmpFbGVtZW50ID0gbmV3IENKU19LZXlWYWx1ZTsKKyAgICAgICAgcE9iakVsZW1lbnQtPm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX05VTEw7CisgICAgICAgIHBPYmpFbGVtZW50LT5zS2V5ID0gc0tleTsKKyAgICAgICAgYXJyYXkuQWRkKHBPYmpFbGVtZW50KTsKKyAgICAgIH0gYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KIH0KIAotCi1GWF9CT09MIGdsb2JhbF9hbHRlcm5hdGU6OlNldEdsb2JhbFZhcmlhYmxlcyhGWF9MUENTVFIgcHJvcG5hbWUsIGludCBuVHlwZSwgCi0JCQkJZG91YmxlIGREYXRhLCBib29sIGJEYXRhLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0RhdGEsIEpTT2JqZWN0IHBEYXRhLCBib29sIGJEZWZhdWx0UGVyc2lzdGVudCkKLXsKLQlpZiAocHJvcG5hbWUgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCi0JanNfZ2xvYmFsX2RhdGEqIHBUZW1wID0gTlVMTDsKLQltX21hcEdsb2JhbC5Mb29rdXAocHJvcG5hbWUsIChGWF9MUFZPSUQmKXBUZW1wKTsKLQotCWlmIChwVGVtcCkKLQl7Ci0JCWlmIChwVGVtcC0+YkRlbGV0ZWQgfHwgcFRlbXAtPm5UeXBlICE9IG5UeXBlKQotCQl7Ci0JCQlwVGVtcC0+ZERhdGEgPSAwOwotCQkJcFRlbXAtPmJEYXRhID0gMDsKLQkJCXBUZW1wLT5zRGF0YSA9ICIiOwotCQkJcFRlbXAtPm5UeXBlID0gblR5cGU7Ci0JCX0KLQotCQlwVGVtcC0+YkRlbGV0ZWQgPSBGQUxTRTsKLQotCQlzd2l0Y2ggKG5UeXBlKQotCQl7Ci0JCWNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX05VTUJFUjoKLQkJCXsKLQkJCQlwVGVtcC0+ZERhdGEgPSBkRGF0YTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9CT09MRUFOOgotCQkJewotCQkJCXBUZW1wLT5iRGF0YSA9IGJEYXRhOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX1NUUklORzoKLQkJCXsKLQkJCQlwVGVtcC0+c0RhdGEgPSBzRGF0YTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9PQkpFQ1Q6Ci0JCQl7Ci0JCQkJcFRlbXAtPnBEYXRhLlJlc2V0KEpTX0dldFJ1bnRpbWUocERhdGEpLCBwRGF0YSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTDoKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIEZBTFNFOwotCQl9CQotCi0JCXJldHVybiBUUlVFOwotCX0KLQotCWpzX2dsb2JhbF9kYXRhKiBwTmV3RGF0YSA9IE5VTEw7Ci0KLQlzd2l0Y2ggKG5UeXBlKQotCXsKLQljYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVI6Ci0JCXsKLQkJCXBOZXdEYXRhID0gbmV3IGpzX2dsb2JhbF9kYXRhOwotCQkJcE5ld0RhdGEtPm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX05VTUJFUjsKLQkJCXBOZXdEYXRhLT5kRGF0YSA9IGREYXRhOwotCQkJcE5ld0RhdGEtPmJQZXJzaXN0ZW50ID0gYkRlZmF1bHRQZXJzaXN0ZW50OwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU46Ci0JCXsKLQkJCXBOZXdEYXRhID0gbmV3IGpzX2dsb2JhbF9kYXRhOwotCQkJcE5ld0RhdGEtPm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU47Ci0JCQlwTmV3RGF0YS0+YkRhdGEgPSBiRGF0YTsKLQkJCXBOZXdEYXRhLT5iUGVyc2lzdGVudCA9IGJEZWZhdWx0UGVyc2lzdGVudDsKLQkJfQotCQlicmVhazsKLQljYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkc6Ci0JCXsKLQkJCXBOZXdEYXRhID0gbmV3IGpzX2dsb2JhbF9kYXRhOwotCQkJcE5ld0RhdGEtPm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX1NUUklORzsKLQkJCXBOZXdEYXRhLT5zRGF0YSA9IHNEYXRhOwotCQkJcE5ld0RhdGEtPmJQZXJzaXN0ZW50ID0gYkRlZmF1bHRQZXJzaXN0ZW50OwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVDoKLQkJewotCQkJcE5ld0RhdGEgPSBuZXcganNfZ2xvYmFsX2RhdGE7Ci0JCQlwTmV3RGF0YS0+blR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfT0JKRUNUOwotCQkJcE5ld0RhdGEtPnBEYXRhLlJlc2V0KEpTX0dldFJ1bnRpbWUocERhdGEpLCBwRGF0YSk7Ci0JCQlwTmV3RGF0YS0+YlBlcnNpc3RlbnQgPSBiRGVmYXVsdFBlcnNpc3RlbnQ7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTDoKLQkJewotCQkJcE5ld0RhdGEgPSBuZXcganNfZ2xvYmFsX2RhdGE7Ci0JCQlwTmV3RGF0YS0+blR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTDsKLQkJCXBOZXdEYXRhLT5iUGVyc2lzdGVudCA9IGJEZWZhdWx0UGVyc2lzdGVudDsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gRkFMU0U7Ci0JfQkKLQotCW1fbWFwR2xvYmFsLlNldEF0KHByb3BuYW1lLCAoRlhfTFBWT0lEKXBOZXdEYXRhKTsKLQotCXJldHVybiBUUlVFOwordm9pZCBKU0dsb2JhbEFsdGVybmF0ZTo6UHV0T2JqZWN0UHJvcGVydHkodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfS2V5VmFsdWUqIHBEYXRhKSB7CisgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBEYXRhLT5vYmpEYXRhLkNvdW50KCk7IGkgPCBzejsgaSsrKSB7CisgICAgQ0pTX0tleVZhbHVlKiBwT2JqRGF0YSA9IHBEYXRhLT5vYmpEYXRhLkdldEF0KGkpOworICAgIHN3aXRjaCAocE9iakRhdGEtPm5UeXBlKSB7CisgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVI6CisgICAgICAgIEZYSlNfUHV0T2JqZWN0TnVtYmVyKE5VTEwsIHBPYmosIHBPYmpEYXRhLT5zS2V5LlVURjhEZWNvZGUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqRGF0YS0+ZERhdGEpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU46CisgICAgICAgIEZYSlNfUHV0T2JqZWN0Qm9vbGVhbihOVUxMLCBwT2JqLCBwT2JqRGF0YS0+c0tleS5VVEY4RGVjb2RlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmpEYXRhLT5iRGF0YSA9PSAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkc6CisgICAgICAgIEZYSlNfUHV0T2JqZWN0U3RyaW5nKE5VTEwsIHBPYmosIHBPYmpEYXRhLT5zS2V5LlVURjhEZWNvZGUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqRGF0YS0+c0RhdGEuVVRGOERlY29kZSgpLmNfc3RyKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVDogeworICAgICAgICB2ODo6SXNvbGF0ZSogcFJ1bnRpbWUgPSBtX3BKU09iamVjdC0+VG9WOE9iamVjdCgpLT5HZXRJc29sYXRlKCk7CisgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwTmV3T2JqID0KKyAgICAgICAgICAgIEZYSlNfTmV3RnhEeW5hbWljT2JqKHBSdW50aW1lLCBOVUxMLCAtMSk7CisgICAgICAgIFB1dE9iamVjdFByb3BlcnR5KHBOZXdPYmosIHBPYmpEYXRhKTsKKyAgICAgICAgRlhKU19QdXRPYmplY3RPYmplY3QoTlVMTCwgcE9iaiwgcE9iakRhdGEtPnNLZXkuVVRGOERlY29kZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXdPYmopOworICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX05VTEw6CisgICAgICAgIEZYSlNfUHV0T2JqZWN0TnVsbChOVUxMLCBwT2JqLCBwT2JqRGF0YS0+c0tleS5VVEY4RGVjb2RlKCkuY19zdHIoKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQogfQogCi1GWEpTVkFMVUVUWVBFIEdFVF9WQUxVRV9UWVBFKHY4OjpMb2NhbDx2ODo6VmFsdWU+IHApCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBuSGFzaCA9IEpTX0NhbGNIYXNoKEpTX0dldFR5cGVvZihwKSk7Cit2b2lkIEpTR2xvYmFsQWx0ZXJuYXRlOjpEZXN0cm95R2xvYmFsUGVyc2lzaXRlbnRWYXJpYWJsZXMoKSB7CisgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG1fbWFwR2xvYmFsKSB7CisgICAgZGVsZXRlIHBhaXIuc2Vjb25kOworICB9CisgIG1fbWFwR2xvYmFsLmNsZWFyKCk7Cit9CisKK0ZYX0JPT0wgSlNHbG9iYWxBbHRlcm5hdGU6OlNldEdsb2JhbFZhcmlhYmxlcyhjb25zdCBGWF9DSEFSKiBwcm9wbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJEZWZhdWx0UGVyc2lzdGVudCkgeworICBpZiAoIXByb3BuYW1lKQorICAgIHJldHVybiBGQUxTRTsKKworICBhdXRvIGl0ID0gbV9tYXBHbG9iYWwuZmluZChwcm9wbmFtZSk7CisgIGlmIChpdCAhPSBtX21hcEdsb2JhbC5lbmQoKSkgeworICAgIEpTR2xvYmFsRGF0YSogcFRlbXAgPSBpdC0+c2Vjb25kOworICAgIGlmIChwVGVtcC0+YkRlbGV0ZWQgfHwgcFRlbXAtPm5UeXBlICE9IG5UeXBlKSB7CisgICAgICBwVGVtcC0+ZERhdGEgPSAwOworICAgICAgcFRlbXAtPmJEYXRhID0gMDsKKyAgICAgIHBUZW1wLT5zRGF0YSA9ICIiOworICAgICAgcFRlbXAtPm5UeXBlID0gblR5cGU7CisgICAgfQorCisgICAgcFRlbXAtPmJEZWxldGVkID0gRkFMU0U7CisgICAgc3dpdGNoIChuVHlwZSkgeworICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSOiB7CisgICAgICAgIHBUZW1wLT5kRGF0YSA9IGREYXRhOworICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU46IHsKKyAgICAgICAgcFRlbXAtPmJEYXRhID0gYkRhdGE7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HOiB7CisgICAgICAgIHBUZW1wLT5zRGF0YSA9IHNEYXRhOworICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVDogeworICAgICAgICBwVGVtcC0+cERhdGEuUmVzZXQocERhdGEtPkdldElzb2xhdGUoKSwgcERhdGEpOworICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX05VTEw6CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIEpTR2xvYmFsRGF0YSogcE5ld0RhdGEgPSBOVUxMOworCisgIHN3aXRjaCAoblR5cGUpIHsKKyAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVI6IHsKKyAgICAgIHBOZXdEYXRhID0gbmV3IEpTR2xvYmFsRGF0YTsKKyAgICAgIHBOZXdEYXRhLT5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVI7CisgICAgICBwTmV3RGF0YS0+ZERhdGEgPSBkRGF0YTsKKyAgICAgIHBOZXdEYXRhLT5iUGVyc2lzdGVudCA9IGJEZWZhdWx0UGVyc2lzdGVudDsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX0JPT0xFQU46IHsKKyAgICAgIHBOZXdEYXRhID0gbmV3IEpTR2xvYmFsRGF0YTsKKyAgICAgIHBOZXdEYXRhLT5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9CT09MRUFOOworICAgICAgcE5ld0RhdGEtPmJEYXRhID0gYkRhdGE7CisgICAgICBwTmV3RGF0YS0+YlBlcnNpc3RlbnQgPSBiRGVmYXVsdFBlcnNpc3RlbnQ7CisgICAgfSBicmVhazsKKyAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkc6IHsKKyAgICAgIHBOZXdEYXRhID0gbmV3IEpTR2xvYmFsRGF0YTsKKyAgICAgIHBOZXdEYXRhLT5uVHlwZSA9IEpTX0dMT0JBTERBVEFfVFlQRV9TVFJJTkc7CisgICAgICBwTmV3RGF0YS0+c0RhdGEgPSBzRGF0YTsKKyAgICAgIHBOZXdEYXRhLT5iUGVyc2lzdGVudCA9IGJEZWZhdWx0UGVyc2lzdGVudDsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVDogeworICAgICAgcE5ld0RhdGEgPSBuZXcgSlNHbG9iYWxEYXRhOworICAgICAgcE5ld0RhdGEtPm5UeXBlID0gSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVDsKKyAgICAgIHBOZXdEYXRhLT5wRGF0YS5SZXNldChwRGF0YS0+R2V0SXNvbGF0ZSgpLCBwRGF0YSk7CisgICAgICBwTmV3RGF0YS0+YlBlcnNpc3RlbnQgPSBiRGVmYXVsdFBlcnNpc3RlbnQ7CisgICAgfSBicmVhazsKKyAgICBjYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9OVUxMOiB7CisgICAgICBwTmV3RGF0YSA9IG5ldyBKU0dsb2JhbERhdGE7CisgICAgICBwTmV3RGF0YS0+blR5cGUgPSBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTDsKKyAgICAgIHBOZXdEYXRhLT5iUGVyc2lzdGVudCA9IGJEZWZhdWx0UGVyc2lzdGVudDsKKyAgICB9IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBtX21hcEdsb2JhbFtwcm9wbmFtZV0gPSBwTmV3RGF0YTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK0NKU19WYWx1ZTo6VHlwZSBHRVRfVkFMVUVfVFlQRSh2ODo6TG9jYWw8djg6OlZhbHVlPiBwKSB7CisgIGNvbnN0IHVuc2lnbmVkIGludCBuSGFzaCA9IEpTX0NhbGNIYXNoKEZYSlNfR2V0VHlwZW9mKHApKTsKIAogICBpZiAobkhhc2ggPT0gSlNDT05TVF9uVW5kZWZIYXNoKQotICAgIHJldHVybiBWVF91bmRlZmluZWQ7CisgICAgcmV0dXJuIENKU19WYWx1ZTo6VlRfdW5kZWZpbmVkOwogICBpZiAobkhhc2ggPT0gSlNDT05TVF9uTnVsbEhhc2gpCi0gICAgcmV0dXJuIFZUX251bGw7CisgICAgcmV0dXJuIENKU19WYWx1ZTo6VlRfbnVsbDsKICAgaWYgKG5IYXNoID09IEpTQ09OU1RfblN0cmluZ0hhc2gpCi0gICAgcmV0dXJuIFZUX3N0cmluZzsKKyAgICByZXR1cm4gQ0pTX1ZhbHVlOjpWVF9zdHJpbmc7CiAgIGlmIChuSGFzaCA9PSBKU0NPTlNUX25OdW1iZXJIYXNoKQotICAgIHJldHVybiBWVF9udW1iZXI7CisgICAgcmV0dXJuIENKU19WYWx1ZTo6VlRfbnVtYmVyOwogICBpZiAobkhhc2ggPT0gSlNDT05TVF9uQm9vbEhhc2gpCi0gICAgcmV0dXJuIFZUX2Jvb2xlYW47CisgICAgcmV0dXJuIENKU19WYWx1ZTo6VlRfYm9vbGVhbjsKICAgaWYgKG5IYXNoID09IEpTQ09OU1RfbkRhdGVIYXNoKQotICAgIHJldHVybiBWVF9kYXRlOworICAgIHJldHVybiBDSlNfVmFsdWU6OlZUX2RhdGU7CiAgIGlmIChuSGFzaCA9PSBKU0NPTlNUX25PYmplY3RIYXNoKQotICAgIHJldHVybiBWVF9vYmplY3Q7CisgICAgcmV0dXJuIENKU19WYWx1ZTo6VlRfb2JqZWN0OwogICBpZiAobkhhc2ggPT0gSlNDT05TVF9uRlhvYmpIYXNoKQotICAgIHJldHVybiBWVF9meG9iamVjdDsKKyAgICByZXR1cm4gQ0pTX1ZhbHVlOjpWVF9meG9iamVjdDsKIAotICByZXR1cm4gVlRfdW5rbm93bjsKKyAgcmV0dXJuIENKU19WYWx1ZTo6VlRfdW5rbm93bjsKIH0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9nbG9iYWwuaCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvZ2xvYmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQyZjYzMgotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvZ2xvYmFsLmgKQEAgLTAsMCArMSw5MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZQREZTREtfU1JDX0pBVkFTQ1JJUFRfR0xPQkFMX0hfCisjZGVmaW5lIEZQREZTREtfU1JDX0pBVkFTQ1JJUFRfR0xPQkFMX0hfCisKKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlICJKU19EZWZpbmUuaCIKKworY2xhc3MgQ0pTX0dsb2JhbERhdGE7CitjbGFzcyBDSlNfR2xvYmFsVmFyaWFibGVBcnJheTsKK2NsYXNzIENKU19LZXlWYWx1ZTsKKworc3RydWN0IEpTR2xvYmFsRGF0YSB7CisgIEpTR2xvYmFsRGF0YSgpIHsKKyAgICBuVHlwZSA9IDA7CisgICAgZERhdGEgPSAwOworICAgIGJEYXRhID0gRkFMU0U7CisgICAgc0RhdGEgPSAiIjsKKyAgICBiUGVyc2lzdGVudCA9IEZBTFNFOworICAgIGJEZWxldGVkID0gRkFMU0U7CisgIH0KKworICB+SlNHbG9iYWxEYXRhKCkgeyBwRGF0YS5SZXNldCgpOyB9CisgIGludCBuVHlwZTsgIC8vIDA6aW50IDE6Ym9vbCAyOnN0cmluZyAzOm9iagorICBkb3VibGUgZERhdGE7CisgIGJvb2wgYkRhdGE7CisgIENGWF9CeXRlU3RyaW5nIHNEYXRhOworICB2ODo6R2xvYmFsPHY4OjpPYmplY3Q+IHBEYXRhOworICBib29sIGJQZXJzaXN0ZW50OworICBib29sIGJEZWxldGVkOworfTsKKworY2xhc3MgSlNHbG9iYWxBbHRlcm5hdGUgOiBwdWJsaWMgQ0pTX0VtYmVkT2JqIHsKKyBwdWJsaWM6CisgIEpTR2xvYmFsQWx0ZXJuYXRlKENKU19PYmplY3QqIHBKU09iamVjdCk7CisgIH5KU0dsb2JhbEFsdGVybmF0ZSgpIG92ZXJyaWRlOworCisgIEZYX0JPT0wgc2V0UGVyc2lzdGVudChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBRdWVyeVByb3BlcnR5KGNvbnN0IEZYX1dDSEFSKiBwcm9wbmFtZSk7CisgIEZYX0JPT0wgRG9Qcm9wZXJ0eShJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHJvcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIERlbFByb3BlcnR5KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHJvcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIHZvaWQgSW5pdGlhbChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwKTsKKworIHByaXZhdGU6CisgIHZvaWQgVXBkYXRlR2xvYmFsUGVyc2lzdGVudFZhcmlhYmxlcygpOworICB2b2lkIENvbW1pdEdsb2JhbFBlcnNpc2l0ZW50VmFyaWFibGVzKElKU19Db250ZXh0KiBjYyk7CisgIHZvaWQgRGVzdHJveUdsb2JhbFBlcnNpc2l0ZW50VmFyaWFibGVzKCk7CisgIEZYX0JPT0wgU2V0R2xvYmFsVmFyaWFibGVzKGNvbnN0IEZYX0NIQVIqIHByb3BuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkRlZmF1bHRQZXJzaXN0ZW50KTsKKyAgdm9pZCBPYmplY3RUb0FycmF5KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkmIGFycmF5KTsKKyAgdm9pZCBQdXRPYmplY3RQcm9wZXJ0eSh2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqLCBDSlNfS2V5VmFsdWUqIHBEYXRhKTsKKworICBzdGQ6Om1hcDxDRlhfQnl0ZVN0cmluZywgSlNHbG9iYWxEYXRhKj4gbV9tYXBHbG9iYWw7CisgIENGWF9XaWRlU3RyaW5nIG1fc0ZpbGVQYXRoOworICBDSlNfR2xvYmFsRGF0YSogbV9wR2xvYmFsRGF0YTsKKyAgQ1BERkRvY19FbnZpcm9ubWVudCogbV9wQXBwOworfTsKKworY2xhc3MgQ0pTX0dsb2JhbCA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKU19HbG9iYWwodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQorICB+Q0pTX0dsb2JhbCgpIG92ZXJyaWRlIHt9CisKKyAgLy8gQ0pTX09iamVjdAorICB2b2lkIEluaXRJbnN0YW5jZShJSlNfUnVudGltZSogcElSdW50aW1lKSBvdmVycmlkZTsKKworICBERUNMQVJFX1NQRUNJQUxfSlNfQ0xBU1MoKTsKKyAgSlNfU1BFQ0lBTF9TVEFUSUNfTUVUSE9EKHNldFBlcnNpc3RlbnQsIEpTR2xvYmFsQWx0ZXJuYXRlLCBnbG9iYWwpOworfTsKKworI2VuZGlmICAvLyBGUERGU0RLX1NSQ19KQVZBU0NSSVBUX0dMT0JBTF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9wdWJsaWNfbWV0aG9kc19lbWJlZGRlcnRlc3QuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9wdWJsaWNfbWV0aG9kc19lbWJlZGRlcnRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MTIxNWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3B1YmxpY19tZXRob2RzX2VtYmVkZGVydGVzdC5jcHAKQEAgLTAsMCArMSwxNjggQEAKKy8vIENvcHlyaWdodCAyMDE1IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgPGNtYXRoPgorCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorI2luY2x1ZGUgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvUHVibGljTWV0aG9kcy5oIgorI2luY2x1ZGUgInRlc3RpbmcvanNfZW1iZWRkZXJfdGVzdC5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgeworCitkb3VibGUgUm91bmREb3duRGF0ZShkb3VibGUgZGF0ZSkgeworICByZXR1cm4gZGF0ZSAtIGZtb2QoZGF0ZSwgODY0MDAwMDApOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgUHVibGljTWV0aG9kc0VtYmVkZGVyVGVzdCA6IHB1YmxpYyBKU0VtYmVkZGVyVGVzdCB7fTsKKworVEVTVF9GKFB1YmxpY01ldGhvZHNFbWJlZGRlclRlc3QsIE1ha2VSZWd1bGFyRGF0ZSkgeworICB2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShpc29sYXRlKCkpOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIHY4OjpMb2NrZXIgbG9ja2VyKGlzb2xhdGUoKSk7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoaXNvbGF0ZSgpKTsKKyAgdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRfc2NvcGUoR2V0VjhDb250ZXh0KCkpOworICBib29sIGJXcm9uZ0Zvcm1hdDsKKyAgZG91YmxlIGRhdGU7CisKKyAgLy8gMTk2OAorICBiV3JvbmdGb3JtYXQgPSBmYWxzZTsKKyAgZGF0ZSA9IENKU19QdWJsaWNNZXRob2RzOjpNYWtlUmVndWxhckRhdGUoTCIwNi8yNS8xOTY4IiwgTCJtbS9kZC95eXl5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJXcm9uZ0Zvcm1hdCk7CisgIGRhdGUgPSBSb3VuZERvd25EYXRlKGRhdGUpOworICBFWFBFQ1RfRE9VQkxFX0VRKC00Nzg2NTYwMDAwMCwgZGF0ZSk7CisgIEVYUEVDVF9GQUxTRShiV3JvbmdGb3JtYXQpOworCisgIC8vIDE5NjgKKyAgYldyb25nRm9ybWF0ID0gZmFsc2U7CisgIGRhdGUgPSBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKEwiMjUwNjE5NjgiLCBMImRkbW15eXl5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJXcm9uZ0Zvcm1hdCk7CisgIGRhdGUgPSBSb3VuZERvd25EYXRlKGRhdGUpOworICBFWFBFQ1RfRE9VQkxFX0VRKC00Nzg2NTYwMDAwMCwgZGF0ZSk7CisgIEVYUEVDVF9GQUxTRShiV3JvbmdGb3JtYXQpOworCisgIC8vIDE5NjgKKyAgYldyb25nRm9ybWF0ID0gZmFsc2U7CisgIGRhdGUgPSBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKEwiMTk2ODA2MjUiLCBMInl5eXltbWRkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJXcm9uZ0Zvcm1hdCk7CisgIGRhdGUgPSBSb3VuZERvd25EYXRlKGRhdGUpOworICBFWFBFQ1RfRE9VQkxFX0VRKC00Nzg2NTYwMDAwMCwgZGF0ZSk7CisgIEVYUEVDVF9GQUxTRShiV3JvbmdGb3JtYXQpOworCisgIC8vIDE5ODUKKyAgYldyb25nRm9ybWF0ID0gZmFsc2U7CisgIGRhdGUgPSBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKEwiMzExMjE5ODUiLCBMImRkbW15eXl5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJXcm9uZ0Zvcm1hdCk7CisgIGRhdGUgPSBSb3VuZERvd25EYXRlKGRhdGUpOworICBFWFBFQ1RfRE9VQkxFX0VRKDUwNDgzNTIwMDAwMC4wLCBkYXRlKTsKKyAgRVhQRUNUX0ZBTFNFKGJXcm9uZ0Zvcm1hdCk7CisKKyAgLy8gMjA4NSwgdGhlIG90aGVyICc4NS4KKyAgYldyb25nRm9ybWF0ID0gZmFsc2U7CisgIGRhdGUgPQorICAgICAgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VSZWd1bGFyRGF0ZShMIjMxMTI4NSIsIEwiZGRtbXl5IiwgJmJXcm9uZ0Zvcm1hdCk7CisgIGRhdGUgPSBSb3VuZERvd25EYXRlKGRhdGUpOworICBFWFBFQ1RfRE9VQkxFX0VRKDM2NjA1OTUyMDAwMDAuMCwgZGF0ZSk7CisgIEVYUEVDVF9GQUxTRShiV3JvbmdGb3JtYXQpOworCisgIC8vIDE5OTUKKyAgYldyb25nRm9ybWF0ID0gZmFsc2U7CisgIGRhdGUgPSBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKEwiMDEwMjE5OTUiLCBMImRkbW15eXl5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJXcm9uZ0Zvcm1hdCk7CisgIGRhdGUgPSBSb3VuZERvd25EYXRlKGRhdGUpOworICBFWFBFQ1RfRE9VQkxFX0VRKDc5MTU5NjgwMDAwMC4wLCBkYXRlKTsKKyAgRVhQRUNUX0ZBTFNFKGJXcm9uZ0Zvcm1hdCk7CisKKyAgLy8gMjA5NSwgdGhlIG90aGVyICc5NS4KKyAgYldyb25nRm9ybWF0ID0gZmFsc2U7CisgIGRhdGUgPQorICAgICAgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VSZWd1bGFyRGF0ZShMIjAxMDI5NSIsIEwiZGRtbXl5IiwgJmJXcm9uZ0Zvcm1hdCk7CisgIGRhdGUgPSBSb3VuZERvd25EYXRlKGRhdGUpOworICBFWFBFQ1RfRE9VQkxFX0VRKDM5NDczNTY4MDAwMDAuMCwgZGF0ZSk7CisgIEVYUEVDVF9GQUxTRShiV3JvbmdGb3JtYXQpOworCisgIC8vIDIwMDUKKyAgYldyb25nRm9ybWF0ID0gZmFsc2U7CisgIGRhdGUgPSBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKEwiMDEwMjIwMDUiLCBMImRkbW15eXl5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJXcm9uZ0Zvcm1hdCk7CisgIGRhdGUgPSBSb3VuZERvd25EYXRlKGRhdGUpOworICBFWFBFQ1RfRE9VQkxFX0VRKDExMDcyMTYwMDAwMDAuMCwgZGF0ZSk7CisgIEVYUEVDVF9GQUxTRShiV3JvbmdGb3JtYXQpOworCisgIC8vIDIwMDUKKyAgYldyb25nRm9ybWF0ID0gZmFsc2U7CisgIGRhdGUgPQorICAgICAgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VSZWd1bGFyRGF0ZShMIjAxMDIwNSIsIEwiZGRtbXl5IiwgJmJXcm9uZ0Zvcm1hdCk7CisgIGRhdGUgPSBSb3VuZERvd25EYXRlKGRhdGUpOworICBFWFBFQ1RfRE9VQkxFX0VRKDExMDcyMTYwMDAwMDAuMCwgZGF0ZSk7CisgIEVYUEVDVF9GQUxTRShiV3JvbmdGb3JtYXQpOworfQorCitURVNUX0YoUHVibGljTWV0aG9kc0VtYmVkZGVyVGVzdCwgTWFrZUZvcm1hdERhdGUpIHsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSgpKTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICB2ODo6TG9ja2VyIGxvY2tlcihpc29sYXRlKCkpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKGlzb2xhdGUoKSk7CisgIHY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0X3Njb3BlKEdldFY4Q29udGV4dCgpKTsKKyAgQ0ZYX1dpZGVTdHJpbmcgZm9ybWF0dGVkX2RhdGU7CisKKyAgLy8gMTk2OC0wNi0yNQorICBmb3JtYXR0ZWRfZGF0ZSA9IENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZSgtNDc5NTIwMDAwMDAsIEwiZGRtbXl5Iik7CisgIEVYUEVDVF9TVFJFUShMIjI1MDY2OCIsIGZvcm1hdHRlZF9kYXRlKTsKKyAgZm9ybWF0dGVkX2RhdGUgPSBDSlNfUHVibGljTWV0aG9kczo6TWFrZUZvcm1hdERhdGUoLTQ3OTUyMDAwMDAwLCBMInl5L21tL2RkIik7CisgIEVYUEVDVF9TVFJFUShMIjY4LzA2LzI1IiwgZm9ybWF0dGVkX2RhdGUpOworCisgIC8vIDE5NjktMTItMzEKKyAgZm9ybWF0dGVkX2RhdGUgPSBDSlNfUHVibGljTWV0aG9kczo6TWFrZUZvcm1hdERhdGUoLTAuMDAwMSwgTCJkZG1teXkiKTsKKyAgRVhQRUNUX1NUUkVRKEwiMzExMjY5IiwgZm9ybWF0dGVkX2RhdGUpOworICBmb3JtYXR0ZWRfZGF0ZSA9IENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZSgtMC4wMDAxLCBMInl5IW1tZGQiKTsKKyAgRVhQRUNUX1NUUkVRKEwiNjkhMTIzMSIsIGZvcm1hdHRlZF9kYXRlKTsKKworICAvLyAxOTcwLTAxLTAxCisgIGZvcm1hdHRlZF9kYXRlID0gQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VGb3JtYXREYXRlKDAsIEwiZGRtbXl5Iik7CisgIEVYUEVDVF9TVFJFUShMIjAxMDE3MCIsIGZvcm1hdHRlZF9kYXRlKTsKKyAgZm9ybWF0dGVkX2RhdGUgPSBDSlNfUHVibGljTWV0aG9kczo6TWFrZUZvcm1hdERhdGUoMCwgTCJtbS15eXl5LWRkIik7CisgIEVYUEVDVF9TVFJFUShMIjAxLTE5NzAtMDEiLCBmb3JtYXR0ZWRfZGF0ZSk7CisKKyAgLy8gMTk4NS0xMi0zMQorICBmb3JtYXR0ZWRfZGF0ZSA9IENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZSg1MDQ4MzUyMDAwMDAuMCwgTCJkZG1teXkiKTsKKyAgRVhQRUNUX1NUUkVRKEwiMzExMjg1IiwgZm9ybWF0dGVkX2RhdGUpOworICBmb3JtYXR0ZWRfZGF0ZSA9IENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZSg1MDQ4MzUyMDAwMDAuMCwgTCJ5eW1tZGQiKTsKKyAgRVhQRUNUX1NUUkVRKEwiODUxMjMxIiwgZm9ybWF0dGVkX2RhdGUpOworCisgIC8vIDE5OTUtMDItMDEKKyAgZm9ybWF0dGVkX2RhdGUgPSBDSlNfUHVibGljTWV0aG9kczo6TWFrZUZvcm1hdERhdGUoNzkxNTk2ODAwMDAwLjAsIEwiZGRtbXl5Iik7CisgIEVYUEVDVF9TVFJFUShMIjAxMDI5NSIsIGZvcm1hdHRlZF9kYXRlKTsKKyAgZm9ybWF0dGVkX2RhdGUgPQorICAgICAgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VGb3JtYXREYXRlKDc5MTU5NjgwMDAwMC4wLCBMInl5eXltbWRkIik7CisgIEVYUEVDVF9TVFJFUShMIjE5OTUwMjAxIiwgZm9ybWF0dGVkX2RhdGUpOworCisgIC8vIDIwMDUtMDItMDEKKyAgZm9ybWF0dGVkX2RhdGUgPQorICAgICAgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VGb3JtYXREYXRlKDExMDcyMTYwMDAwMDAuMCwgTCJkZG1teXkiKTsKKyAgRVhQRUNUX1NUUkVRKEwiMDEwMjA1IiwgZm9ybWF0dGVkX2RhdGUpOworICBmb3JtYXR0ZWRfZGF0ZSA9CisgICAgICBDSlNfUHVibGljTWV0aG9kczo6TWFrZUZvcm1hdERhdGUoMTEwNzIxNjAwMDAwMC4wLCBMInl5eXlkZG1tIik7CisgIEVYUEVDVF9TVFJFUShMIjIwMDUwMTAyIiwgZm9ybWF0dGVkX2RhdGUpOworCisgIC8vIDIwODUtMTItMzEKKyAgZm9ybWF0dGVkX2RhdGUgPQorICAgICAgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VGb3JtYXREYXRlKDM2NjA1OTUyMDAwMDAuMCwgTCJkZG1teXkiKTsKKyAgRVhQRUNUX1NUUkVRKEwiMzExMjg1IiwgZm9ybWF0dGVkX2RhdGUpOworICBmb3JtYXR0ZWRfZGF0ZSA9CisgICAgICBDSlNfUHVibGljTWV0aG9kczo6TWFrZUZvcm1hdERhdGUoMzY2MDU5NTIwMDAwMC4wLCBMInl5eXlkZCIpOworICBFWFBFQ1RfU1RSRVEoTCIyMDg1MzEiLCBmb3JtYXR0ZWRfZGF0ZSk7CisKKyAgLy8gMjA5NS0wMi0wMQorICBmb3JtYXR0ZWRfZGF0ZSA9CisgICAgICBDSlNfUHVibGljTWV0aG9kczo6TWFrZUZvcm1hdERhdGUoMzk0NzM1NjgwMDAwMC4wLCBMImRkbW15eSIpOworICBFWFBFQ1RfU1RSRVEoTCIwMTAyOTUiLCBmb3JtYXR0ZWRfZGF0ZSk7CisgIGZvcm1hdHRlZF9kYXRlID0KKyAgICAgIENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZSgzOTQ3MzU2ODAwMDAwLjAsIEwibW1kZHl5eXkiKTsKKyAgRVhQRUNUX1NUUkVRKEwiMDIwMTIwOTUiLCBmb3JtYXR0ZWRfZGF0ZSk7Cit9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3JlcG9ydC5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3JlcG9ydC5jcHAKaW5kZXggMTQ3OGZlYi4uMmVjMDdmYiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9yZXBvcnQuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvcmVwb3J0LmNwcApAQCAtNCwxMiArNCwxMiBAQAogCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0phdmFTY3JpcHQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX09iamVjdC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19WYWx1ZS5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9yZXBvcnQuaCIKKyNpbmNsdWRlICJyZXBvcnQuaCIKKworI2luY2x1ZGUgIkpTX0RlZmluZS5oIgorI2luY2x1ZGUgIkpTX09iamVjdC5oIgorI2luY2x1ZGUgIkpTX1ZhbHVlLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCIKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZXBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC0yMCwzMCArMjAsMjggQEAKIEVORF9KU19TVEFUSUNfUFJPUCgpCiAKIEJFR0lOX0pTX1NUQVRJQ19NRVRIT0QoQ0pTX1JlcG9ydCkKLQlKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHNhdmUpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWSh3cml0ZVRleHQpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHNhdmUpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHdyaXRlVGV4dCkKIEVORF9KU19TVEFUSUNfTUVUSE9EKCkKIAogSU1QTEVNRU5UX0pTX0NMQVNTKENKU19SZXBvcnQsIFJlcG9ydCkKIAotUmVwb3J0OjpSZXBvcnQoQ0pTX09iamVjdCogcEpTT2JqZWN0KSA6IENKU19FbWJlZE9iaihwSlNPYmplY3QpCi17CitSZXBvcnQ6OlJlcG9ydChDSlNfT2JqZWN0KiBwSlNPYmplY3QpIDogQ0pTX0VtYmVkT2JqKHBKU09iamVjdCkge30KIAotfQorUmVwb3J0Ojp+UmVwb3J0KCkge30KIAotUmVwb3J0Ojp+UmVwb3J0KCkKLXsKLQotfQotCi1GWF9CT09MIFJlcG9ydDo6d3JpdGVUZXh0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17CitGWF9CT09MIFJlcG9ydDo6d3JpdGVUZXh0KElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgogICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBSZXBvcnQ6OnNhdmUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKLXsKK0ZYX0JPT0wgUmVwb3J0OjpzYXZlKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgogICByZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvcmVwb3J0LmggYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3JlcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZDFmNjgKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3JlcG9ydC5oCkBAIC0wLDAgKzEsMzkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGUERGU0RLX1NSQ19KQVZBU0NSSVBUX1JFUE9SVF9IXworI2RlZmluZSBGUERGU0RLX1NSQ19KQVZBU0NSSVBUX1JFUE9SVF9IXworCisjaW5jbHVkZSAiSlNfRGVmaW5lLmgiCisKK2NsYXNzIFJlcG9ydCA6IHB1YmxpYyBDSlNfRW1iZWRPYmogeworIHB1YmxpYzoKKyAgUmVwb3J0KENKU19PYmplY3QqIHBKU09iamVjdCk7CisgIH5SZXBvcnQoKSBvdmVycmlkZTsKKworIHB1YmxpYzoKKyAgRlhfQk9PTCBzYXZlKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHdyaXRlVGV4dChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKK307CisKK2NsYXNzIENKU19SZXBvcnQgOiBwdWJsaWMgQ0pTX09iamVjdCB7CisgcHVibGljOgorICBDSlNfUmVwb3J0KHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge30KKyAgfkNKU19SZXBvcnQoKSBvdmVycmlkZSB7fQorCisgIERFQ0xBUkVfSlNfQ0xBU1MoKTsKKworICBKU19TVEFUSUNfTUVUSE9EKHNhdmUsIFJlcG9ydCkKKyAgSlNfU1RBVElDX01FVEhPRCh3cml0ZVRleHQsIFJlcG9ydCk7Cit9OworCisjZW5kaWYgIC8vIEZQREZTREtfU1JDX0pBVkFTQ1JJUFRfUkVQT1JUX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3Jlc291cmNlLmNwcCBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvcmVzb3VyY2UuY3BwCmluZGV4IDQzNzVkYTMuLmQ5OWU3Y2UgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvcmVzb3VyY2UuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvcmVzb3VyY2UuY3BwCkBAIC00LDYzICs0LDYxIEBACiAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvcmVzb3VyY2UuaCIKKyNpbmNsdWRlICJyZXNvdXJjZS5oIgogCi1DRlhfV2lkZVN0cmluZyBKU0dldFN0cmluZ0Zyb21JRChDSlNfQ29udGV4dCogcENvbnRleHQsIEZYX1VJTlQgaWQpCi17Ci0gICAgc3dpdGNoIChpZCkKLSAgICB7CitDRlhfV2lkZVN0cmluZyBKU0dldFN0cmluZ0Zyb21JRChDSlNfQ29udGV4dCogcENvbnRleHQsIEZYX1VJTlQgaWQpIHsKKyAgc3dpdGNoIChpZCkgewogICAgIGNhc2UgSURTX1NUUklOR19KU0FMRVJUOgotICAgICAgICByZXR1cm4gTCJBbGVydCI7CisgICAgICByZXR1cm4gTCJBbGVydCI7CiAgICAgY2FzZSBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUjoKLSAgICAgICAgcmV0dXJuIEwiSW5jb3JyZWN0IG51bWJlciBvZiBwYXJhbWV0ZXJzIHBhc3NlZCB0byBmdW5jdGlvbi4iOworICAgICAgcmV0dXJuIEwiSW5jb3JyZWN0IG51bWJlciBvZiBwYXJhbWV0ZXJzIHBhc3NlZCB0byBmdW5jdGlvbi4iOwogICAgIGNhc2UgSURTX1NUUklOR19KU0FGTlVNQkVSX0tFWVNUUk9LRToKLSAgICAgICAgcmV0dXJuIEwiVGhlIGlucHV0IHZhbHVlIGlzIGludmFsaWQuIjsKKyAgICAgIHJldHVybiBMIlRoZSBpbnB1dCB2YWx1ZSBpcyBpbnZhbGlkLiI7CiAgICAgY2FzZSBJRFNfU1RSSU5HX0pTUEFSQU1fVE9PTE9ORzoKLSAgICAgICAgcmV0dXJuIEwiVGhlIGlucHV0IHZhbHVlIGlzIHRvbyBsb25nLiI7CisgICAgICByZXR1cm4gTCJUaGUgaW5wdXQgdmFsdWUgaXMgdG9vIGxvbmcuIjsKICAgICBjYXNlIElEU19TVFJJTkdfSlNQQVJTRURBVEU6Ci0gICAgICAgIHJldHVybiBMIlRoZSBpbnB1dCB2YWx1ZSBjYW4ndCBiZSBwYXJzZWQgYXMgYSB2YWxpZCBkYXRlL3RpbWUgKCVzKS4iOworICAgICAgcmV0dXJuIEwiVGhlIGlucHV0IHZhbHVlIGNhbid0IGJlIHBhcnNlZCBhcyBhIHZhbGlkIGRhdGUvdGltZSAoJXMpLiI7CiAgICAgY2FzZSBJRFNfU1RSSU5HX0pTUkFOR0UxOgotICAgICAgICByZXR1cm4gTCJUaGUgaW5wdXQgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMiCi0gICAgICAgICAgICAgICBMIiBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzLiI7CisgICAgICByZXR1cm4gTCJUaGUgaW5wdXQgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMiCisgICAgICAgICAgICAgTCIgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcy4iOwogICAgIGNhc2UgSURTX1NUUklOR19KU1JBTkdFMjoKLSAgICAgICAgcmV0dXJuIEwiVGhlIGlucHV0IHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzLiI7CisgICAgICByZXR1cm4gTCJUaGUgaW5wdXQgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMuIjsKICAgICBjYXNlIElEU19TVFJJTkdfSlNSQU5HRTM6Ci0gICAgICAgIHJldHVybiBMIlRoZSBpbnB1dCB2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcy4iOworICAgICAgcmV0dXJuIEwiVGhlIGlucHV0IHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzLiI7CiAgICAgY2FzZSBJRFNfU1RSSU5HX05PVFNVUFBPUlQ6Ci0gICAgICAgIHJldHVybiBMIk9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkLiI7CisgICAgICByZXR1cm4gTCJPcGVyYXRpb24gbm90IHN1cHBvcnRlZC4iOwogICAgIGNhc2UgSURTX1NUUklOR19KU0JVU1k6Ci0gICAgICAgIHJldHVybiBMIlN5c3RlbSBpcyBidXN5LiI7CisgICAgICByZXR1cm4gTCJTeXN0ZW0gaXMgYnVzeS4iOwogICAgIGNhc2UgSURTX1NUUklOR19KU0VWRU5UOgotICAgICAgICByZXR1cm4gTCJEdXBsaWNhdGUgZm9ybWZpZWxkIGV2ZW50IGZvdW5kLiI7CisgICAgICByZXR1cm4gTCJEdXBsaWNhdGUgZm9ybWZpZWxkIGV2ZW50IGZvdW5kLiI7CiAgICAgY2FzZSBJRFNfU1RSSU5HX1JVTjoKLSAgICAgICAgcmV0dXJuIEwiU2NyaXB0IHJhbiBzdWNjZXNzZnVsbHkuIjsKKyAgICAgIHJldHVybiBMIlNjcmlwdCByYW4gc3VjY2Vzc2Z1bGx5LiI7CiAgICAgY2FzZSBJRFNfU1RSSU5HX0pTUFJJTlQxOgotICAgICAgICByZXR1cm4gTCJUaGUgc2Vjb25kIHBhcmFtZXRlciBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gYSBEYXRlLiI7CisgICAgICByZXR1cm4gTCJUaGUgc2Vjb25kIHBhcmFtZXRlciBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gYSBEYXRlLiI7CiAgICAgY2FzZSBJRFNfU1RSSU5HX0pTUFJJTlQyOgotICAgICAgICByZXR1cm4gTCJUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyBhbiBpbnZhbGlkIERhdGUhIjsKKyAgICAgIHJldHVybiBMIlRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIGFuIGludmFsaWQgRGF0ZSEiOwogICAgIGNhc2UgSURTX1NUUklOR19KU05PR0xPQkFMOgotICAgICAgICByZXR1cm4gTCJHbG9iYWwgdmFsdWUgbm90IGZvdW5kLiI7CisgICAgICByZXR1cm4gTCJHbG9iYWwgdmFsdWUgbm90IGZvdW5kLiI7CiAgICAgY2FzZSBJRFNfU1RSSU5HX0pTUkVBRE9OTFk6Ci0gICAgICAgIHJldHVybiBMIkNhbm5vdCBhc3NpZ24gdG8gcmVhZG9ubHkgcHJvcGVydHkuIjsKKyAgICAgIHJldHVybiBMIkNhbm5vdCBhc3NpZ24gdG8gcmVhZG9ubHkgcHJvcGVydHkuIjsKICAgICBjYXNlIElEU19TVFJJTkdfSlNUWVBFRVJST1I6Ci0gICAgICAgIHJldHVybiBMIkluY29ycmVjdCBwYXJhbWV0ZXIgdHlwZS4iOworICAgICAgcmV0dXJuIEwiSW5jb3JyZWN0IHBhcmFtZXRlciB0eXBlLiI7CiAgICAgY2FzZSBJRFNfU1RSSU5HX0pTVkFMVUVFUlJPUjoKLSAgICAgICAgcmV0dXJuIEwiSW5jb3JyZWN0IHBhcmFtZXRlciB2YWx1ZS4iOworICAgICAgcmV0dXJuIEwiSW5jb3JyZWN0IHBhcmFtZXRlciB2YWx1ZS4iOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBMIiI7Ci0gICAgfQorICAgICAgcmV0dXJuIEwiIjsKKyAgfQogfQogCiBDRlhfV2lkZVN0cmluZyBKU0Zvcm1hdEVycm9yU3RyaW5nKGNvbnN0IGNoYXIqIGNsYXNzX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHByb3BlcnR5X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBkZXRhaWxzKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0ID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChjbGFzc19uYW1lKTsKLSAgICBpZiAocHJvcGVydHlfbmFtZSkgewotICAgICAgICByZXN1bHQgKz0gTCIuIjsKLSAgICAgICAgcmVzdWx0ICs9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwocHJvcGVydHlfbmFtZSk7Ci0gICAgfQotICAgIHJlc3VsdCArPSBMIjogIjsKLSAgICByZXN1bHQgKz0gZGV0YWlsczsKLSAgICByZXR1cm4gcmVzdWx0OworICBDRlhfV2lkZVN0cmluZyByZXN1bHQgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKGNsYXNzX25hbWUpOworICBpZiAocHJvcGVydHlfbmFtZSkgeworICAgIHJlc3VsdCArPSBMIi4iOworICAgIHJlc3VsdCArPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHByb3BlcnR5X25hbWUpOworICB9CisgIHJlc3VsdCArPSBMIjogIjsKKyAgcmVzdWx0ICs9IGRldGFpbHM7CisgIHJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3Jlc291cmNlLmggYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3Jlc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUzYWUxMwotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvcmVzb3VyY2UuaApAQCAtMCwwICsxLDM5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlBERlNES19TUkNfSkFWQVNDUklQVF9SRVNPVVJDRV9IXworI2RlZmluZSBGUERGU0RLX1NSQ19KQVZBU0NSSVBUX1JFU09VUkNFX0hfCisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyaW5nLmgiICAvLyBGb3IgQ0ZYX1dpZGVTdHJpbmcuCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiICAgLy8gRm9yIEZYX1VJTlQuCisKK2NsYXNzIENKU19Db250ZXh0OworCisjZGVmaW5lIElEU19TVFJJTkdfSlNBTEVSVCAyNTYxMworI2RlZmluZSBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUiAyNTYxNAorI2RlZmluZSBJRFNfU1RSSU5HX0pTQUZOVU1CRVJfS0VZU1RST0tFIDI1NjE1CisjZGVmaW5lIElEU19TVFJJTkdfSlNQQVJBTV9UT09MT05HIDI1NjE3CisjZGVmaW5lIElEU19TVFJJTkdfSlNQQVJTRURBVEUgMjU2MTgKKyNkZWZpbmUgSURTX1NUUklOR19KU1JBTkdFMSAyNTYxOQorI2RlZmluZSBJRFNfU1RSSU5HX0pTUkFOR0UyIDI1NjIwCisjZGVmaW5lIElEU19TVFJJTkdfSlNSQU5HRTMgMjU2MjEKKyNkZWZpbmUgSURTX1NUUklOR19OT1RTVVBQT1JUIDI1NjI3CisjZGVmaW5lIElEU19TVFJJTkdfSlNCVVNZIDI1NjI4CisjZGVmaW5lIElEU19TVFJJTkdfSlNFVkVOVCAyNTYyOQorI2RlZmluZSBJRFNfU1RSSU5HX1JVTiAyNTYzMAorI2RlZmluZSBJRFNfU1RSSU5HX0pTUFJJTlQxIDI1NjMyCisjZGVmaW5lIElEU19TVFJJTkdfSlNQUklOVDIgMjU2MzMKKyNkZWZpbmUgSURTX1NUUklOR19KU05PR0xPQkFMIDI1NjM1CisjZGVmaW5lIElEU19TVFJJTkdfSlNSRUFET05MWSAyNTYzNgorI2RlZmluZSBJRFNfU1RSSU5HX0pTVFlQRUVSUk9SIDI1NjM3CisjZGVmaW5lIElEU19TVFJJTkdfSlNWQUxVRUVSUk9SIDI1NjM4CisKK0NGWF9XaWRlU3RyaW5nIEpTR2V0U3RyaW5nRnJvbUlEKENKU19Db250ZXh0KiBwQ29udGV4dCwgRlhfVUlOVCBpZCk7CitDRlhfV2lkZVN0cmluZyBKU0Zvcm1hdEVycm9yU3RyaW5nKGNvbnN0IGNoYXIqIGNsYXNzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHByb3BlcnR5X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBkZXRhaWxzKTsKKworI2VuZGlmICAvLyBGUERGU0RLX1NSQ19KQVZBU0NSSVBUX1JFU09VUkNFX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3V0aWwuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC91dGlsLmNwcAppbmRleCAyNmM1OWEzLi5mZDA4ZDQ5IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3V0aWwuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvdXRpbC5jcHAKQEAgLTEsMzYgKzEsMjggQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KYXZhU2NyaXB0LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0RlZmluZS5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19PYmplY3QuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfVmFsdWUuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvdXRpbC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L3Jlc291cmNlLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0NvbnRleHQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1J1bnRpbWUuaCIKKyNpbmNsdWRlICJmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3V0aWwuaCIKIAotI2lmIF9GWF9PU18gID09IF9GWF9BTkRST0lEXworI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9leHQuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oIgorI2luY2x1ZGUgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oIgorI2luY2x1ZGUgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgiCisjaW5jbHVkZSAiZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuaCIKKyNpbmNsdWRlICJmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX09iamVjdC5oIgorI2luY2x1ZGUgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfUnVudGltZS5oIgorI2luY2x1ZGUgImZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfVmFsdWUuaCIKKyNpbmNsdWRlICJmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuaCIKKyNpbmNsdWRlICJmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3Jlc291cmNlLmgiCisKKyNpZiBfRlhfT1NfID09IF9GWF9BTkRST0lEXwogI2luY2x1ZGUgPGN0eXBlLmg+CiAjZW5kaWYKIAotc3RhdGljIHY4OjpJc29sYXRlKiBHZXRJc29sYXRlKElGWEpTX0NvbnRleHQqIGNjKQotewotCUNKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwotCUFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKLQotCUNKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKLQlBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7Ci0KLQlyZXR1cm4gcFJ1bnRpbWUtPkdldElzb2xhdGUoKTsKLX0KLQogQkVHSU5fSlNfU1RBVElDX0NPTlNUKENKU19VdGlsKQogRU5EX0pTX1NUQVRJQ19DT05TVCgpCiAKQEAgLTM4LDYwOCArMzAsNTIzIEBACiBFTkRfSlNfU1RBVElDX1BST1AoKQogCiBCRUdJTl9KU19TVEFUSUNfTUVUSE9EKENKU19VdGlsKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkocHJpbnRkKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkocHJpbnRmKQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkocHJpbnR4KQotCUpTX1NUQVRJQ19NRVRIT0RfRU5UUlkoc2NhbmQpCi0JSlNfU1RBVElDX01FVEhPRF9FTlRSWShieXRlVG9DaGFyKQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShwcmludGQpCitKU19TVEFUSUNfTUVUSE9EX0VOVFJZKHByaW50ZikKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkocHJpbnR4KQorSlNfU1RBVElDX01FVEhPRF9FTlRSWShzY2FuZCkKK0pTX1NUQVRJQ19NRVRIT0RfRU5UUlkoYnl0ZVRvQ2hhcikKIEVORF9KU19TVEFUSUNfTUVUSE9EKCkKIAotSU1QTEVNRU5UX0pTX0NMQVNTKENKU19VdGlsLHV0aWwpCitJTVBMRU1FTlRfSlNfQ0xBU1MoQ0pTX1V0aWwsIHV0aWwpCiAKLXV0aWw6OnV0aWwoQ0pTX09iamVjdCAqcEpTT2JqZWN0KSA6IENKU19FbWJlZE9iaihwSlNPYmplY3QpCi17Cit1dGlsOjp1dGlsKENKU19PYmplY3QqIHBKU09iamVjdCkgOiBDSlNfRW1iZWRPYmoocEpTT2JqZWN0KSB7fQorCit1dGlsOjp+dXRpbCgpIHsKIH0KIAotdXRpbDo6fnV0aWwodm9pZCkKLXsKLX0KLQotCi1zdHJ1Y3Qgc3RydV9UYkNvbnZlcnQKLXsKLQlGWF9MUENXU1RSIGxwc3pKU01hcms7Ci0JRlhfTFBDV1NUUiBscHN6Q3BwTWFyazsKK3N0cnVjdCBzdHJ1X1RiQ29udmVydCB7CisgIGNvbnN0IEZYX1dDSEFSKiBscHN6SlNNYXJrOworICBjb25zdCBGWF9XQ0hBUiogbHBzekNwcE1hcms7CiB9OwogCiBjb25zdCBzdHJ1X1RiQ29udmVydCBmY1RhYmxlW10gPSB7Ci0JeyBMIm1tbW0iLCBMIiVCIiB9LAotCXsgTCJtbW0iLCBMIiViIiB9LAotCXsgTCJtbSIsICBMIiVtIiB9LAotCS8vIm0iCi0JeyBMImRkZGQiLCBMIiVBIiB9LAotCXsgTCJkZGQiLCBMIiVhIiB9LAotCXsgTCJkZCIsICBMIiVkIiB9LAotCS8vImQiLCAgICIldyIsCi0JeyBMInl5eXkiLCBMIiVZIiB9LAotCXsgTCJ5eSIsICBMIiV5IiB9LAotCXsgTCJISCIsICBMIiVIIiB9LAotCS8vIkgiCi0JeyBMImhoIiwgIEwiJUkiIH0sCi0JLy8iaCIKLQl7IEwiTU0iLCAgTCIlTSIgfSwKLQkvLyJNIgotCXsgTCJzcyIsICBMIiVTIiB9LAotCS8vInMKLQl7IEwiVFQiLCAgTCIlcCIgfSwKLQkvLyJ0IgorICAgIHtMIm1tbW0iLCBMIiVCIn0sCisgICAge0wibW1tIiwgTCIlYiJ9LAorICAgIHtMIm1tIiwgTCIlbSJ9LAorICAgIC8vIm0iCisgICAge0wiZGRkZCIsIEwiJUEifSwKKyAgICB7TCJkZGQiLCBMIiVhIn0sCisgICAge0wiZGQiLCBMIiVkIn0sCisgICAgLy8iZCIsICAgIiV3IiwKKyAgICB7TCJ5eXl5IiwgTCIlWSJ9LAorICAgIHtMInl5IiwgTCIleSJ9LAorICAgIHtMIkhIIiwgTCIlSCJ9LAorICAgIC8vIkgiCisgICAge0wiaGgiLCBMIiVJIn0sCisgICAgLy8iaCIKKyAgICB7TCJNTSIsIEwiJU0ifSwKKyAgICAvLyJNIgorICAgIHtMInNzIiwgTCIlUyJ9LAorICAgIC8vInMKKyAgICB7TCJUVCIsIEwiJXAifSwKKy8vInQiCiAjaWYgZGVmaW5lZChfV0lOMzIpCi0JeyBMInR0IiwgIEwiJXAiIH0sCi0JeyBMImgiLCAgTCIlI0kiIH0sCisgICAge0widHQiLCBMIiVwIn0sCisgICAge0wiaCIsIEwiJSNJIn0sCiAjZWxzZQotCXsgTCJ0dCIsICBMIiVQIiB9LAotCXsgTCJoIiwgIEwiJWwiIH0sCisgICAge0widHQiLCBMIiVQIn0sCisgICAge0wiaCIsIEwiJWwifSwKICNlbmRpZgogfTsKIAotI2RlZmluZSBVVElMX0lOVAkJCTAKLSNkZWZpbmUgVVRJTF9ET1VCTEUJCQkxCi0jZGVmaW5lIFVUSUxfU1RSSU5HCQkJMgorI2RlZmluZSBVVElMX0lOVCAwCisjZGVmaW5lIFVUSUxfRE9VQkxFIDEKKyNkZWZpbmUgVVRJTF9TVFJJTkcgMgogCi1pbnQgdXRpbDo6UGFyc3REYXRhVHlwZShzdGQ6OndzdHJpbmcqIHNGb3JtYXQpCi17Ci0gICAgICAgIHNpemVfdCBpID0gMDsKLQlib29sIGJQZXJjZW50ID0gRkFMU0U7Ci0JZm9yIChpPTA7IGk8c0Zvcm1hdC0+bGVuZ3RoKCk7ICsraSkKLQl7Ci0JCXdjaGFyX3QgYyA9ICgqc0Zvcm1hdClbaV07Ci0JCWlmIChjID09IEwnJScpCi0JCXsKLQkJCWJQZXJjZW50ID0gdHJ1ZTsKLQkJCWNvbnRpbnVlOwotCQl9CitpbnQgdXRpbDo6UGFyc3REYXRhVHlwZShzdGQ6OndzdHJpbmcqIHNGb3JtYXQpIHsKKyAgYm9vbCBiUGVyY2VudCA9IEZBTFNFOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNGb3JtYXQtPmxlbmd0aCgpOyArK2kpIHsKKyAgICB3Y2hhcl90IGMgPSAoKnNGb3JtYXQpW2ldOworICAgIGlmIChjID09IEwnJScpIHsKKyAgICAgIGJQZXJjZW50ID0gdHJ1ZTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KIAotCQlpZiAoYlBlcmNlbnQpCi0JCXsKLQkJCWlmIChjID09IEwnYycgfHwgYyA9PSBMJ0MnIHx8IGMgPT0gTCdkJyB8fCBjID09IEwnaScgfHwgYyA9PSBMJ28nIHx8IGMgPT0gTCd1JyB8fCBjID09IEwneCcgfHwgYyA9PSBMJ1gnKQotCQkJewotCQkJCXJldHVybiBVVElMX0lOVDsKLQkJCX0KLQkJCWVsc2UgaWYgKGMgPT0gTCdlJyB8fCBjID09IEwnRScgfHwgYyA9PSBMJ2YnIHx8IGMgPT0gTCdnJyB8fCBjID09IEwnRycpCi0JCQl7Ci0JCQkJcmV0dXJuIFVUSUxfRE9VQkxFOwotCQkJfQotCQkJZWxzZSBpZiAoYyA9PSBMJ3MnIHx8IGMgPT0gTCdTJykKLQkJCXsKLQkJCQkvLyBNYXAgcyB0byBTIHNpbmNlIHdlIGFsd2F5cyBkZWFsIGludGVybmFsbHkKLQkJCQkvLyB3aXRoIHdjaGFyX3Qgc3RyaW5ncy4KLQkJCQkoKnNGb3JtYXQpW2ldID0gTCdTJzsKLQkJCQlyZXR1cm4gVVRJTF9TVFJJTkc7Ci0JCQl9Ci0JCQllbHNlIGlmIChjID09IEwnLicgfHwgYyA9PSBMJysnIHx8IGMgPT0gTCctJyB8fCBjID09IEwnIycgfHwgYyA9PSBMJyAnIHx8IENKU19QdWJsaWNNZXRob2RzOjpJc0RpZ2l0KGMpKQotCQkJewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZSBicmVhazsKLQkJfQotCX0KKyAgICBpZiAoYlBlcmNlbnQpIHsKKyAgICAgIGlmIChjID09IEwnYycgfHwgYyA9PSBMJ0MnIHx8IGMgPT0gTCdkJyB8fCBjID09IEwnaScgfHwgYyA9PSBMJ28nIHx8CisgICAgICAgICAgYyA9PSBMJ3UnIHx8IGMgPT0gTCd4JyB8fCBjID09IEwnWCcpIHsKKyAgICAgICAgcmV0dXJuIFVUSUxfSU5UOworICAgICAgfQorICAgICAgaWYgKGMgPT0gTCdlJyB8fCBjID09IEwnRScgfHwgYyA9PSBMJ2YnIHx8IGMgPT0gTCdnJyB8fCBjID09IEwnRycpIHsKKyAgICAgICAgcmV0dXJuIFVUSUxfRE9VQkxFOworICAgICAgfQorICAgICAgaWYgKGMgPT0gTCdzJyB8fCBjID09IEwnUycpIHsKKyAgICAgICAgLy8gTWFwIHMgdG8gUyBzaW5jZSB3ZSBhbHdheXMgZGVhbCBpbnRlcm5hbGx5CisgICAgICAgIC8vIHdpdGggd2NoYXJfdCBzdHJpbmdzLgorICAgICAgICAoKnNGb3JtYXQpW2ldID0gTCdTJzsKKyAgICAgICAgcmV0dXJuIFVUSUxfU1RSSU5HOworICAgICAgfQorICAgICAgaWYgKGMgPT0gTCcuJyB8fCBjID09IEwnKycgfHwgYyA9PSBMJy0nIHx8IGMgPT0gTCcjJyB8fCBjID09IEwnICcgfHwKKyAgICAgICAgICBGWFNZU19pc3dkaWdpdChjKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQogCi0JcmV0dXJuIC0xOworICByZXR1cm4gLTE7CiB9CiAKLUZYX0JPT0wgdXRpbDo6cHJpbnRmKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKLQlpZiAoaVNpemUgPCAxKQotCQlyZXR1cm4gRkFMU0U7Ci0Jc3RkOjp3c3RyaW5nIGNfQ29udkNoYXIocGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCkpOwotCXN0ZDo6dmVjdG9yPHN0ZDo6d3N0cmluZz4gY19zdHJDb252ZXJzOwotCWludCBpT2Zmc2V0ID0gMDsKLQlpbnQgaU9mZmVuZCA9IDA7Ci0JY19Db252Q2hhci5pbnNlcnQoY19Db252Q2hhci5iZWdpbigpLEwnUycpOwotCXdoaWxlKGlPZmZzZXQgIT0gLTEpCi0JewotCQlpT2ZmZW5kID0gY19Db252Q2hhci5maW5kKEwiJSIsaU9mZnNldCsxKTsKLQkJc3RkOjp3c3RyaW5nIHN0clN1YjsKLQkJaWYgKGlPZmZlbmQgPT0gLTEpCi0JCQlzdHJTdWIgPSBjX0NvbnZDaGFyLnN1YnN0cihpT2Zmc2V0KTsJCQkKLQkJZWxzZQotCQkJc3RyU3ViID0gY19Db252Q2hhci5zdWJzdHIoaU9mZnNldCAsaU9mZmVuZCAtIGlPZmZzZXQpOwotCQljX3N0ckNvbnZlcnMucHVzaF9iYWNrKHN0clN1Yik7Ci0JCWlPZmZzZXQgPSBpT2ZmZW5kIDsKLQl9CitGWF9CT09MIHV0aWw6OnByaW50ZihJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7CisgIGlmIChpU2l6ZSA8IDEpCisgICAgcmV0dXJuIEZBTFNFOworICBzdGQ6OndzdHJpbmcgY19Db252Q2hhcihwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6d3N0cmluZz4gY19zdHJDb252ZXJzOworICBpbnQgaU9mZnNldCA9IDA7CisgIGludCBpT2ZmZW5kID0gMDsKKyAgY19Db252Q2hhci5pbnNlcnQoY19Db252Q2hhci5iZWdpbigpLCBMJ1MnKTsKKyAgd2hpbGUgKGlPZmZzZXQgIT0gLTEpIHsKKyAgICBpT2ZmZW5kID0gY19Db252Q2hhci5maW5kKEwiJSIsIGlPZmZzZXQgKyAxKTsKKyAgICBzdGQ6OndzdHJpbmcgc3RyU3ViOworICAgIGlmIChpT2ZmZW5kID09IC0xKQorICAgICAgc3RyU3ViID0gY19Db252Q2hhci5zdWJzdHIoaU9mZnNldCk7CisgICAgZWxzZQorICAgICAgc3RyU3ViID0gY19Db252Q2hhci5zdWJzdHIoaU9mZnNldCwgaU9mZmVuZCAtIGlPZmZzZXQpOworICAgIGNfc3RyQ29udmVycy5wdXNoX2JhY2soc3RyU3ViKTsKKyAgICBpT2Zmc2V0ID0gaU9mZmVuZDsKKyAgfQogCi0Jc3RkOjp3c3RyaW5nIGNfc3RyUmVzdWx0OworICBzdGQ6OndzdHJpbmcgY19zdHJSZXN1bHQ7CiAKLQkvL2ZvcihpbnQgaUluZGV4ID0gMTtpSW5kZXggPCBwYXJhbXMuc2l6ZSgpO2lJbmRleCsrKQotCXN0ZDo6d3N0cmluZyBjX3N0ckZvcm1hdDsKLQlmb3IoaW50IGlJbmRleCA9IDA7aUluZGV4IDwgKGludCljX3N0ckNvbnZlcnMuc2l6ZSgpO2lJbmRleCsrKQotCXsKLQkJY19zdHJGb3JtYXQgPSBjX3N0ckNvbnZlcnNbaUluZGV4XTsKLQkJaWYgKGlJbmRleCA9PSAwKQotCQl7Ci0JCQljX3N0clJlc3VsdCA9IGNfc3RyRm9ybWF0OwotCQkJY29udGludWU7Ci0JCX0KKyAgLy8gZm9yKGludCBpSW5kZXggPSAxO2lJbmRleCA8IHBhcmFtcy5zaXplKCk7aUluZGV4KyspCisgIHN0ZDo6d3N0cmluZyBjX3N0ckZvcm1hdDsKKyAgZm9yIChpbnQgaUluZGV4ID0gMDsgaUluZGV4IDwgKGludCljX3N0ckNvbnZlcnMuc2l6ZSgpOyBpSW5kZXgrKykgeworICAgIGNfc3RyRm9ybWF0ID0gY19zdHJDb252ZXJzW2lJbmRleF07CisgICAgaWYgKGlJbmRleCA9PSAwKSB7CisgICAgICBjX3N0clJlc3VsdCA9IGNfc3RyRm9ybWF0OworICAgICAgY29udGludWU7CisgICAgfQogCisgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyU2VnbWVudDsKKyAgICBpZiAoaUluZGV4ID49IGlTaXplKSB7CisgICAgICBjX3N0clJlc3VsdCArPSBjX3N0ckZvcm1hdDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KIAotCQlDRlhfV2lkZVN0cmluZyBzdHJTZWdtZW50OwotCQlpZiAoaUluZGV4ID49IGlTaXplKSB7Ci0JCQljX3N0clJlc3VsdCArPSBjX3N0ckZvcm1hdDsKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgc3dpdGNoIChQYXJzdERhdGFUeXBlKCZjX3N0ckZvcm1hdCkpIHsKKyAgICAgIGNhc2UgVVRJTF9JTlQ6CisgICAgICAgIHN0clNlZ21lbnQuRm9ybWF0KGNfc3RyRm9ybWF0LmNfc3RyKCksIHBhcmFtc1tpSW5kZXhdLlRvSW50KCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVVRJTF9ET1VCTEU6CisgICAgICAgIHN0clNlZ21lbnQuRm9ybWF0KGNfc3RyRm9ybWF0LmNfc3RyKCksIHBhcmFtc1tpSW5kZXhdLlRvRG91YmxlKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVVRJTF9TVFJJTkc6CisgICAgICAgIHN0clNlZ21lbnQuRm9ybWF0KGNfc3RyRm9ybWF0LmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc1tpSW5kZXhdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHN0clNlZ21lbnQuRm9ybWF0KEwiJVMiLCBjX3N0ckZvcm1hdC5jX3N0cigpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNfc3RyUmVzdWx0ICs9IHN0clNlZ21lbnQuR2V0QnVmZmVyKHN0clNlZ21lbnQuR2V0TGVuZ3RoKCkgKyAxKTsKKyAgfQogCi0JCXN3aXRjaCAoUGFyc3REYXRhVHlwZSgmY19zdHJGb3JtYXQpKQotCQl7Ci0JCQljYXNlIFVUSUxfSU5UOgotCQkJCXN0clNlZ21lbnQuRm9ybWF0KGNfc3RyRm9ybWF0LmNfc3RyKCksIHBhcmFtc1tpSW5kZXhdLlRvSW50KCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVVElMX0RPVUJMRToKLQkJCQlzdHJTZWdtZW50LkZvcm1hdChjX3N0ckZvcm1hdC5jX3N0cigpLCBwYXJhbXNbaUluZGV4XS5Ub0RvdWJsZSgpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVVRJTF9TVFJJTkc6Ci0JCQkJc3RyU2VnbWVudC5Gb3JtYXQoY19zdHJGb3JtYXQuY19zdHIoKSwgcGFyYW1zW2lJbmRleF0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXN0clNlZ21lbnQuRm9ybWF0KEwiJVMiLCBjX3N0ckZvcm1hdC5jX3N0cigpKTsKLQkJCQlicmVhazsKLQkJfQotCQljX3N0clJlc3VsdCArPSBzdHJTZWdtZW50LkdldEJ1ZmZlcihzdHJTZWdtZW50LkdldExlbmd0aCgpKzEpOwotCX0KLQotCWNfc3RyUmVzdWx0LmVyYXNlKGNfc3RyUmVzdWx0LmJlZ2luKCkpOwotCXZSZXQgPSBjX3N0clJlc3VsdC5jX3N0cigpOwotCXJldHVybiBUUlVFOworICBjX3N0clJlc3VsdC5lcmFzZShjX3N0clJlc3VsdC5iZWdpbigpKTsKKyAgdlJldCA9IGNfc3RyUmVzdWx0LmNfc3RyKCk7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIHV0aWw6OnByaW50ZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7CitGWF9CT09MIHV0aWw6OnByaW50ZChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7CisgIGlmIChpU2l6ZSA8IDIpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKLQlpZiAoaVNpemUgPCAyKQotCQlyZXR1cm4gRkFMU0U7CisgIENKU19SdW50aW1lKiBwUnVudGltZSA9IENKU19SdW50aW1lOjpGcm9tQ29udGV4dChjYyk7CisgIENKU19WYWx1ZSBwMShwUnVudGltZSk7CisgIHAxID0gcGFyYW1zWzBdOwogCi0JQ0pTX1ZhbHVlIHAxKGlzb2xhdGUpOwotCXAxID0gcGFyYW1zWzBdOworICBDSlNfVmFsdWUgcDIgPSBwYXJhbXNbMV07CisgIENKU19EYXRlIGpzRGF0ZShwUnVudGltZSk7CisgIGlmICghcDIuQ29udmVydFRvRGF0ZShqc0RhdGUpKSB7CisgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoKENKU19Db250ZXh0KiljYywgSURTX1NUUklOR19KU1BSSU5UMSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CiAKLQlDSlNfVmFsdWUgcDIgPSBwYXJhbXNbMV07Ci0JQ0pTX0RhdGUganNEYXRlKGlzb2xhdGUpOwotCWlmICghcDIuQ29udmVydFRvRGF0ZShqc0RhdGUpKQotCXsKLQkJc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoKENKU19Db250ZXh0KiljYywgSURTX1NUUklOR19KU1BSSU5UMSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9CisgIGlmICghanNEYXRlLklzVmFsaWREYXRlKCkpIHsKKyAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRCgoQ0pTX0NvbnRleHQqKWNjLCBJRFNfU1RSSU5HX0pTUFJJTlQyKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KIAotCWlmICghanNEYXRlLklzVmFsaWREYXRlKCkpCi0JewotCQlzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRCgoQ0pTX0NvbnRleHQqKWNjLCBJRFNfU1RSSU5HX0pTUFJJTlQyKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KKyAgaWYgKHAxLkdldFR5cGUoKSA9PSBDSlNfVmFsdWU6OlZUX251bWJlcikgeworICAgIGludCBuRm9ybWF0ID0gcDEuVG9JbnQoKTsKKyAgICBDRlhfV2lkZVN0cmluZyBzd1Jlc3VsdDsKIAotCWlmIChwMS5HZXRUeXBlKCkgPT0gVlRfbnVtYmVyKQotCXsKLQkJaW50IG5Gb3JtYXQgPSBwMS5Ub0ludCgpOwotCQlDRlhfV2lkZVN0cmluZyBzd1Jlc3VsdDsKKyAgICBzd2l0Y2ggKG5Gb3JtYXQpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgc3dSZXN1bHQuRm9ybWF0KEwiRDolMDRkJTAyZCUwMmQlMDJkJTAyZCUwMmQiLCBqc0RhdGUuR2V0WWVhcigpLAorICAgICAgICAgICAgICAgICAgICAgICAganNEYXRlLkdldE1vbnRoKCkgKyAxLCBqc0RhdGUuR2V0RGF5KCksCisgICAgICAgICAgICAgICAgICAgICAgICBqc0RhdGUuR2V0SG91cnMoKSwganNEYXRlLkdldE1pbnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGpzRGF0ZS5HZXRTZWNvbmRzKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgc3dSZXN1bHQuRm9ybWF0KEwiJTA0ZC4lMDJkLiUwMmQgJTAyZDolMDJkOiUwMmQiLCBqc0RhdGUuR2V0WWVhcigpLAorICAgICAgICAgICAgICAgICAgICAgICAganNEYXRlLkdldE1vbnRoKCkgKyAxLCBqc0RhdGUuR2V0RGF5KCksCisgICAgICAgICAgICAgICAgICAgICAgICBqc0RhdGUuR2V0SG91cnMoKSwganNEYXRlLkdldE1pbnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGpzRGF0ZS5HZXRTZWNvbmRzKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgc3dSZXN1bHQuRm9ybWF0KEwiJTA0ZC8lMDJkLyUwMmQgJTAyZDolMDJkOiUwMmQiLCBqc0RhdGUuR2V0WWVhcigpLAorICAgICAgICAgICAgICAgICAgICAgICAganNEYXRlLkdldE1vbnRoKCkgKyAxLCBqc0RhdGUuR2V0RGF5KCksCisgICAgICAgICAgICAgICAgICAgICAgICBqc0RhdGUuR2V0SG91cnMoKSwganNEYXRlLkdldE1pbnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGpzRGF0ZS5HZXRTZWNvbmRzKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CiAKLQkJc3dpdGNoIChuRm9ybWF0KQotCQl7Ci0JCWNhc2UgMDoKLQkJCXN3UmVzdWx0LkZvcm1hdChMIkQ6JTA0ZCUwMmQlMDJkJTAyZCUwMmQlMDJkIiwgCi0JCQkJanNEYXRlLkdldFllYXIoKSwKLQkJCQlqc0RhdGUuR2V0TW9udGgoKSArIDEsCi0JCQkJanNEYXRlLkdldERheSgpLAotCQkJCWpzRGF0ZS5HZXRIb3VycygpLAotCQkJCWpzRGF0ZS5HZXRNaW51dGVzKCksCi0JCQkJanNEYXRlLkdldFNlY29uZHMoKSk7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJc3dSZXN1bHQuRm9ybWF0KEwiJTA0ZC4lMDJkLiUwMmQgJTAyZDolMDJkOiUwMmQiLCAKLQkJCQlqc0RhdGUuR2V0WWVhcigpLAotCQkJCWpzRGF0ZS5HZXRNb250aCgpICsgMSwKLQkJCQlqc0RhdGUuR2V0RGF5KCksCi0JCQkJanNEYXRlLkdldEhvdXJzKCksCi0JCQkJanNEYXRlLkdldE1pbnV0ZXMoKSwKLQkJCQlqc0RhdGUuR2V0U2Vjb25kcygpKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlzd1Jlc3VsdC5Gb3JtYXQoTCIlMDRkLyUwMmQvJTAyZCAlMDJkOiUwMmQ6JTAyZCIsIAotCQkJCWpzRGF0ZS5HZXRZZWFyKCksCi0JCQkJanNEYXRlLkdldE1vbnRoKCkgKyAxLAotCQkJCWpzRGF0ZS5HZXREYXkoKSwKLQkJCQlqc0RhdGUuR2V0SG91cnMoKSwKLQkJCQlqc0RhdGUuR2V0TWludXRlcygpLAotCQkJCWpzRGF0ZS5HZXRTZWNvbmRzKCkpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCX0KKyAgICB2UmV0ID0gc3dSZXN1bHQuY19zdHIoKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAocDEuR2V0VHlwZSgpID09IENKU19WYWx1ZTo6VlRfc3RyaW5nKSB7CisgICAgc3RkOjpiYXNpY19zdHJpbmc8d2NoYXJfdD4gY0Zvcm1hdCA9IHAxLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCk7CiAKLQkJdlJldCA9IHN3UmVzdWx0LmNfc3RyKCk7Ci0JCXJldHVybiBUUlVFOwotCX0KLQllbHNlIGlmIChwMS5HZXRUeXBlKCkgPT0gVlRfc3RyaW5nKQotCXsKLQkJc3RkOjpiYXNpY19zdHJpbmc8d2NoYXJfdD4gY0Zvcm1hdCA9IHAxLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCk7CisgICAgYm9vbCBiWEZBUGljdHVyZSA9IGZhbHNlOworICAgIGlmIChpU2l6ZSA+IDIpIHsKKyAgICAgIGJYRkFQaWN0dXJlID0gcGFyYW1zWzJdLlRvQm9vbCgpOworICAgIH0KIAotCQlib29sIGJYRkFQaWN0dXJlID0gZmFsc2U7Ci0JCWlmIChpU2l6ZSA+IDIpCi0JCXsKLQkJCWJYRkFQaWN0dXJlID0gcGFyYW1zWzJdLlRvQm9vbCgpOwotCQl9CisgICAgaWYgKGJYRkFQaWN0dXJlKSB7CisgICAgICByZXR1cm4gRkFMU0U7ICAvLyBjdXJyZW50bHksIGl0IGRvZXNuJ3Qgc3VwcG9ydCBYRkFQaWN0dXJlLgorICAgIH0KIAotCQlpZiAoYlhGQVBpY3R1cmUpCi0JCXsKLQkJCXJldHVybiBGQUxTRTsgLy9jdXJyZW50bHksIGl0IGRvZXNuJ3Qgc3VwcG9ydCBYRkFQaWN0dXJlLgotCQl9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YoZmNUYWJsZSkgLyBzaXplb2Yoc3RydV9UYkNvbnZlcnQpOyArK2kpIHsKKyAgICAgIGludCBpU3RhcnQgPSAwOworICAgICAgaW50IGlFbmQ7CisgICAgICB3aGlsZSAoKGlFbmQgPSBjRm9ybWF0LmZpbmQoZmNUYWJsZVtpXS5scHN6SlNNYXJrLCBpU3RhcnQpKSAhPSAtMSkgeworICAgICAgICBjRm9ybWF0LnJlcGxhY2UoaUVuZCwgRlhTWVNfd2NzbGVuKGZjVGFibGVbaV0ubHBzekpTTWFyayksCisgICAgICAgICAgICAgICAgICAgICAgICBmY1RhYmxlW2ldLmxwc3pDcHBNYXJrKTsKKyAgICAgICAgaVN0YXJ0ID0gaUVuZDsKKyAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgaW50IGlJbmRleDsKLQkJZm9yKGlJbmRleCA9IDA7aUluZGV4PHNpemVvZihmY1RhYmxlKS9zaXplb2Yoc3RydV9UYkNvbnZlcnQpO2lJbmRleCsrKQotCQl7Ci0JCQlpbnQgaVN0YXJ0ID0gMDsKLQkJCWludCBpRW5kOwotCQkJd2hpbGUoKGlFbmQgPSBjRm9ybWF0LmZpbmQoZmNUYWJsZVtpSW5kZXhdLmxwc3pKU01hcmssIGlTdGFydCkpICE9IC0xKQotCQkJewotCQkJCWNGb3JtYXQucmVwbGFjZShpRW5kLCBGWFNZU193Y3NsZW4oZmNUYWJsZVtpSW5kZXhdLmxwc3pKU01hcmspLCBmY1RhYmxlW2lJbmRleF0ubHBzekNwcE1hcmspOwotCQkJCWlTdGFydCA9IGlFbmQ7Ci0JCQl9Ci0JCX0KKyAgICBpbnQgaVllYXIsIGlNb250aCwgaURheSwgaUhvdXIsIGlNaW4sIGlTZWM7CisgICAgaVllYXIgPSBqc0RhdGUuR2V0WWVhcigpOworICAgIGlNb250aCA9IGpzRGF0ZS5HZXRNb250aCgpOworICAgIGlEYXkgPSBqc0RhdGUuR2V0RGF5KCk7CisgICAgaUhvdXIgPSBqc0RhdGUuR2V0SG91cnMoKTsKKyAgICBpTWluID0ganNEYXRlLkdldE1pbnV0ZXMoKTsKKyAgICBpU2VjID0ganNEYXRlLkdldFNlY29uZHMoKTsKIAotCQlpbnQgaVllYXIsaU1vbnRoLGlEYXksaUhvdXIsaU1pbixpU2VjOwotCQlpWWVhciA9IGpzRGF0ZS5HZXRZZWFyKCk7Ci0JCWlNb250aCA9IGpzRGF0ZS5HZXRNb250aCgpOwotCQlpRGF5ID0ganNEYXRlLkdldERheSgpOwotCQlpSG91ciA9IGpzRGF0ZS5HZXRIb3VycygpOwotCQlpTWluID0ganNEYXRlLkdldE1pbnV0ZXMoKTsKLQkJaVNlYyA9IGpzRGF0ZS5HZXRTZWNvbmRzKCk7CisgICAgc3RydWN0IHRtIHRpbWUgPSB7fTsKKyAgICB0aW1lLnRtX3llYXIgPSBpWWVhciAtIDE5MDA7CisgICAgdGltZS50bV9tb24gPSBpTW9udGg7CisgICAgdGltZS50bV9tZGF5ID0gaURheTsKKyAgICB0aW1lLnRtX2hvdXIgPSBpSG91cjsKKyAgICB0aW1lLnRtX21pbiA9IGlNaW47CisgICAgdGltZS50bV9zZWMgPSBpU2VjOwogCi0JCXN0cnVjdCB0bSB0aW1lID0gezB9OwotCQl0aW1lLnRtX3llYXIgPSBpWWVhci0xOTAwOwotCQl0aW1lLnRtX21vbiA9IGlNb250aDsKLQkJdGltZS50bV9tZGF5ID0gaURheTsKLQkJdGltZS50bV9ob3VyID0gaUhvdXI7Ci0JCXRpbWUudG1fbWluID0gaU1pbjsKLQkJdGltZS50bV9zZWMgPSBpU2VjOwotCQkvL0NPbGVEYXRlVGltZSBjcHBUbShpWWVhcixpTW9udGgrMSxpRGF5LGlIb3VyLGlNaW4saVNlYyk7Ci0JCS8vQ1N0cmluZyBzdHJGb3JtYXQgPSBjcHBUbS5Gb3JtYXQoY0Zvcm1hdC5jX3N0cigpKTsKKyAgICBzdHJ1Y3Qgc3RydV9UYkNvbnZlcnRBZCB7CisgICAgICBjb25zdCBGWF9XQ0hBUiogbHBzekpTTWFyazsKKyAgICAgIGludCBpVmFsdWU7CisgICAgfTsKIAotCQlzdHJ1Y3Qgc3RydV9UYkNvbnZlcnRBZAotCQl7Ci0JCQlGWF9MUENXU1RSIGxwc3pKU01hcms7Ci0JCQlpbnQgICAgIGlWYWx1ZTsKLQkJfTsKKyAgICBzdHJ1X1RiQ29udmVydEFkIGNUYWJsZUFkW10gPSB7CisgICAgICAgIHtMIm0iLCBpTW9udGggKyAxfSwge0wiZCIsIGlEYXl9LAorICAgICAgICB7TCJIIiwgaUhvdXJ9LCAgICAgIHtMImgiLCBpSG91ciA+IDEyID8gaUhvdXIgLSAxMiA6IGlIb3VyfSwKKyAgICAgICAge0wiTSIsIGlNaW59LCAgICAgICB7TCJzIiwgaVNlY30sCisgICAgfTsKIAotCQlzdHJ1X1RiQ29udmVydEFkIGNUYWJsZUFkW10gPXsKLQkJCXsgTCJtIiwgaU1vbnRoKzEgfSwKLQkJCXsgTCJkIiwgaURheSB9LAotCQkJeyBMIkgiLCBpSG91ciB9LAotCQkJeyBMImgiLCBpSG91cj4xMj9pSG91ci0xMjppSG91ciB9LAotCQkJeyBMIk0iLCBpTWluIH0sCi0JCQl7IEwicyIsIGlTZWMgfSwKLQkJfTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihjVGFibGVBZCkgLyBzaXplb2Yoc3RydV9UYkNvbnZlcnRBZCk7ICsraSkgeworICAgICAgd2NoYXJfdCB0c3pWYWx1ZVsxMF07CisgICAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWU7CisgICAgICBzVmFsdWUuRm9ybWF0KEwiJWQiLCBjVGFibGVBZFtpXS5pVmFsdWUpOworICAgICAgbWVtY3B5KHRzelZhbHVlLCAod2NoYXJfdCopc1ZhbHVlLkdldEJ1ZmZlcihzVmFsdWUuR2V0TGVuZ3RoKCkgKyAxKSwKKyAgICAgICAgICAgICAoc1ZhbHVlLkdldExlbmd0aCgpICsgMSkgKiBzaXplb2Yod2NoYXJfdCkpOwogCi0JCS8vY0Zvcm1hdCA9IHN0ckZvcm1hdC5HZXRCdWZmZXIoc3RyRm9ybWF0LkdldExlbmd0aCgpKzEpOwotCQlmb3IoaUluZGV4ID0gMDtpSW5kZXg8c2l6ZW9mKGNUYWJsZUFkKS9zaXplb2Yoc3RydV9UYkNvbnZlcnRBZCk7aUluZGV4KyspCi0JCXsKLQkJCXdjaGFyX3QgdHN6VmFsdWVbMTBdOwotCQkJLy9faXRvdChjVGFibGVBZFtpSW5kZXhdLmlWYWx1ZSx0c3pWYWx1ZSwxMCk7Ci0JCQlDRlhfV2lkZVN0cmluZyBzVmFsdWU7Ci0JCQlzVmFsdWUuRm9ybWF0KEwiJWQiLGNUYWJsZUFkW2lJbmRleF0uaVZhbHVlKTsKLQkJCW1lbWNweSh0c3pWYWx1ZSwgKHdjaGFyX3QgKilzVmFsdWUuR2V0QnVmZmVyKHNWYWx1ZS5HZXRMZW5ndGgoKSsxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc1ZhbHVlLkdldExlbmd0aCgpKzEpKnNpemVvZih3Y2hhcl90KSk7Ci0KLQkJCS8vc3RyRm9ybWF0LlJlcGxhY2UoY1RhYmxlQWRbaUluZGV4XS5scHN6SlNNYXJrLCIlZCIpOwotCQkJLy9zdHJGb3JtYXQuRm9ybWF0KHN0ckZvcm1hdCxjVGFibGVBZFtpSW5kZXhdLmlWYWx1ZSk7Ci0JCQlpbnQgaVN0YXJ0ID0gMDsKLQkJCWludCBpRW5kOwotCQkJd2hpbGUoKGlFbmQgPSBjRm9ybWF0LmZpbmQoY1RhYmxlQWRbaUluZGV4XS5scHN6SlNNYXJrLCBpU3RhcnQpKSAhPSAtMSkKLQkJCXsKLQkJCQlpZiAoaUVuZCA+IDApCi0JCQkJewotCQkJCQlpZiAoY0Zvcm1hdFtpRW5kLTFdID09IEwnJScpCi0JCQkJCXsKLQkJCQkJCWlTdGFydCA9IGlFbmQrMTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNGb3JtYXQucmVwbGFjZShpRW5kLCBGWFNZU193Y3NsZW4oY1RhYmxlQWRbaUluZGV4XS5scHN6SlNNYXJrKSwgdHN6VmFsdWUpOwotCQkJCWlTdGFydCA9IGlFbmQ7Ci0JCQl9Ci0JCX0KLQotCQlDRlhfV2lkZVN0cmluZyBzdHJGb3JtYXQ7Ci0vLwkJc3RyRm9ybWF0LkZvcm1hdChMIiVkLCVkLCVkLCVkLCVkLCVkIixpWWVhciwgaU1vbnRoLCBpRGF5LCBpSG91ciwgaU1pbiwgaVNlYyk7Ci0vLwkJQ1N0cmluZyBzdHJGb3JtYXQgPSBjcHBUbS5Gb3JtYXQoY0Zvcm1hdC5jX3N0cigpKTsKLQkJd2NoYXJfdCBidWZbNjRdID0gezB9OwotCQlzdHJGb3JtYXQgPSB3Y3NmdGltZShidWYsIDY0LCBjRm9ybWF0LmNfc3RyKCksICZ0aW1lKTsKLQkJY0Zvcm1hdCA9IGJ1ZjsKLQkJdlJldCA9IGNGb3JtYXQuY19zdHIoKTsKLQkJLy9ydFJldCA9IHN0ckZvcm1hdC5HZXRCdWZmZXIoc3RyRm9ybWF0LkdldExlbmd0aCgpKzEpOwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JcmV0dXJuIEZBTFNFOwotfQotCi12b2lkIHV0aWw6OnByaW50ZChjb25zdCBzdGQ6OndzdHJpbmcgJmNGb3JtYXQyLCBDSlNfRGF0ZSBqc0RhdGUsIGJvb2wgYlhGQVBpY3R1cmUsIHN0ZDo6d3N0cmluZyAmY1B1cnBvc2UpCi17Ci0Jc3RkOjp3c3RyaW5nIGNGb3JtYXQgPSBjRm9ybWF0MjsKLQkgICAgCi0JaWYgKGJYRkFQaWN0dXJlKQotCXsKLQkJcmV0dXJuIDsgLy9jdXJyZW50bHksIGl0IGRvZXNuJ3Qgc3VwcG9ydCBYRkFQaWN0dXJlLgotCX0KLQotICAgIGludCBpSW5kZXg7Ci0JZm9yKGlJbmRleCA9IDA7aUluZGV4PHNpemVvZihmY1RhYmxlKS9zaXplb2Yoc3RydV9UYkNvbnZlcnQpO2lJbmRleCsrKQotCXsKLQkJaW50IGlTdGFydCA9IDA7Ci0JCWludCBpRW5kOwotCQl3aGlsZSgoaUVuZCA9IGNGb3JtYXQuZmluZChmY1RhYmxlW2lJbmRleF0ubHBzekpTTWFyaywgaVN0YXJ0KSkgIT0gLTEpCi0JCXsKLQkJCWNGb3JtYXQucmVwbGFjZShpRW5kLEZYU1lTX3djc2xlbihmY1RhYmxlW2lJbmRleF0ubHBzekpTTWFyayksIGZjVGFibGVbaUluZGV4XS5scHN6Q3BwTWFyayk7Ci0JCQlpU3RhcnQgPSBpRW5kOwotCQl9Ci0JfQotCi0JaW50IGlZZWFyLGlNb250aCxpRGF5LGlIb3VyLGlNaW4saVNlYzsKLQlpWWVhciA9IGpzRGF0ZS5HZXRZZWFyKCk7Ci0JaU1vbnRoID0ganNEYXRlLkdldE1vbnRoKCk7Ci0JaURheSA9IGpzRGF0ZS5HZXREYXkoKTsKLQlpSG91ciA9IGpzRGF0ZS5HZXRIb3VycygpOwotCWlNaW4gPSBqc0RhdGUuR2V0TWludXRlcygpOwotCWlTZWMgPSBqc0RhdGUuR2V0U2Vjb25kcygpOwotCi0Jc3RydWN0IHRtIHRpbWUgPSB7MH07Ci0JdGltZS50bV95ZWFyID0gaVllYXItMTkwMDsKLQl0aW1lLnRtX21vbiA9IGlNb250aDsKLQl0aW1lLnRtX21kYXkgPSBpRGF5OwotCXRpbWUudG1faG91ciA9IGlIb3VyOwotCXRpbWUudG1fbWluID0gaU1pbjsKLQl0aW1lLnRtX3NlYyA9IGlTZWM7Ci0vLwlDT2xlRGF0ZVRpbWUgY3BwVG0oaVllYXIsaU1vbnRoKzEsaURheSxpSG91cixpTWluLGlTZWMpOwotCS8vQ1N0cmluZyBzdHJGb3JtYXQgPSBjcHBUbS5Gb3JtYXQoY0Zvcm1hdC5jX3N0cigpKTsKLQotCXN0cnVjdCBzdHJ1X1RiQ29udmVydEFkCi0JewotCQlGWF9MUENXU1RSIGxwc3pKU01hcms7Ci0JCWludCAgICAgaVZhbHVlOwotCX07Ci0KLQlzdHJ1X1RiQ29udmVydEFkIGNUYWJsZUFkW10gPXsKLQkJeyBMIm0iLCBpTW9udGgrMSB9LAotCQl7IEwiZCIsIGlEYXkgfSwKLQkJeyBMIkgiLCBpSG91ciB9LAotCQl7IEwiaCIsIGlIb3VyPjEyP2lIb3VyLTEyOmlIb3VyIH0sCi0JCXsgTCJNIiwgaU1pbiB9LAotCQl7IEwicyIsIGlTZWMgfSwKLQl9OwotCi0JLy9jRm9ybWF0ID0gc3RyRm9ybWF0LkdldEJ1ZmZlcihzdHJGb3JtYXQuR2V0TGVuZ3RoKCkrMSk7Ci0JZm9yKGlJbmRleCA9IDA7aUluZGV4PHNpemVvZihjVGFibGVBZCkvc2l6ZW9mKHN0cnVfVGJDb252ZXJ0QWQpO2lJbmRleCsrKQotCXsKLQkJd2NoYXJfdCB0c3pWYWx1ZVsxMF07Ci0JCS8vX2l0b3QoY1RhYmxlQWRbaUluZGV4XS5pVmFsdWUsdHN6VmFsdWUsMTApOwotCQlDRlhfV2lkZVN0cmluZyBzVmFsdWU7Ci0JCXNWYWx1ZS5Gb3JtYXQoTCIlZCIsY1RhYmxlQWRbaUluZGV4XS5pVmFsdWUpOwotCQltZW1jcHkodHN6VmFsdWUsICh3Y2hhcl90ICopc1ZhbHVlLkdldEJ1ZmZlcihzVmFsdWUuR2V0TGVuZ3RoKCkrMSksc1ZhbHVlLkdldExlbmd0aCgpKnNpemVvZih3Y2hhcl90KSk7Ci0KLQotCQkvL3N0ckZvcm1hdC5SZXBsYWNlKGNUYWJsZUFkW2lJbmRleF0ubHBzekpTTWFyaywiJWQiKTsKLQkJLy9zdHJGb3JtYXQuRm9ybWF0KHN0ckZvcm1hdCxjVGFibGVBZFtpSW5kZXhdLmlWYWx1ZSk7Ci0JCWludCBpU3RhcnQgPSAwOwotCQlpbnQgaUVuZDsKLQkJd2hpbGUoKGlFbmQgPSBjRm9ybWF0LmZpbmQoY1RhYmxlQWRbaUluZGV4XS5scHN6SlNNYXJrLCBpU3RhcnQpKSAhPSAtMSkKLQkJewotCQkJaWYgKGlFbmQgPiAwKQotCQkJewotCQkJCWlmIChjRm9ybWF0W2lFbmQtMV0gPT0gTCclJykKLQkJCQl7Ci0JCQkJCWlTdGFydCA9IGlFbmQrMTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJY0Zvcm1hdC5yZXBsYWNlKGlFbmQsRlhTWVNfd2NzbGVuKGNUYWJsZUFkW2lJbmRleF0ubHBzekpTTWFyayksdHN6VmFsdWUpOwotCQkJaVN0YXJ0ID0gaUVuZDsKLQkJfQotCX0KLQotCUNGWF9XaWRlU3RyaW5nIHN0ckZvcm1hdDsKLQl3Y2hhcl90IGJ1Zls2NF0gPSB7MH07Ci0Jc3RyRm9ybWF0ID0gd2NzZnRpbWUoYnVmLCA2NCwgY0Zvcm1hdC5jX3N0cigpLCAmdGltZSk7Ci0JY0Zvcm1hdCA9IGJ1ZjsKLQljUHVycG9zZSA9IGNGb3JtYXQ7Ci19Ci0KLUZYX0JPT0wgdXRpbDo6cHJpbnR4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKLQlpZiAoaVNpemU8MikKLQkJcmV0dXJuIEZBTFNFOwotCUNGWF9XaWRlU3RyaW5nIHNGb3JtYXQgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7Ci0JQ0ZYX1dpZGVTdHJpbmcgc1NvdXJjZSA9IHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKTsKLQlzdGQ6OnN0cmluZyBjRm9ybWF0ID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHNGb3JtYXQpLmNfc3RyKCk7Ci0Jc3RkOjpzdHJpbmcgY1NvdXJjZSA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShzU291cmNlKS5jX3N0cigpOwotCXN0ZDo6c3RyaW5nIGNEZXN0OwotCXByaW50eChjRm9ybWF0LGNTb3VyY2UsY0Rlc3QpOwotCXZSZXQgPSBjRGVzdC5jX3N0cigpOwotCXJldHVybiBUUlVFOwotfQotCi12b2lkIHV0aWw6OnByaW50eChjb25zdCBzdGQ6OnN0cmluZyAmY0Zvcm1hdCxjb25zdCBzdGQ6OnN0cmluZyAmY1NvdXJjZTIsc3RkOjpzdHJpbmcgJmNQdXJwb3NlKQotewotCXN0ZDo6c3RyaW5nIGNTb3VyY2UoY1NvdXJjZTIpOwotCWlmICghY1B1cnBvc2UuZW1wdHkoKSkKLQkJLy9jUHVycG9zZS5jbGVhcigpOwotCQljUHVycG9zZS5lcmFzZSgpOwotCWludCBpdFNvdXJjZSA9IDA7Ci0JaW50IGlTaXplID0gY1NvdXJjZS5zaXplKCk7Ci0JZm9yKGludCBpSW5kZXggPSAwOyBpSW5kZXggPCAoaW50KWNGb3JtYXQuc2l6ZSgpICYmIGl0U291cmNlPGlTaXplOyBpSW5kZXgrKykKLQl7Ci0JCWNoYXIgbGV0dGVyID0gY0Zvcm1hdFtpSW5kZXhdOwotCQlzd2l0Y2gobGV0dGVyKQotCQl7Ci0JCWNhc2UgJz8nOgotCQkJLy9jUHVycG9zZS5wdXNoX2JhY2soY1NvdXJjZVtpdFNvdXJjZV0pOwotCQkJY1B1cnBvc2UgKz0gY1NvdXJjZVtpdFNvdXJjZV07Ci0JCQlpdFNvdXJjZSsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ1gnOgotCQkJewotCQkJCXdoaWxlKGl0U291cmNlIDwgaVNpemUpCi0JCQkJewotCQkJCQlpZiAoKGNTb3VyY2VbaXRTb3VyY2VdPj0nMCcmJmNTb3VyY2VbaXRTb3VyY2VdPD0nOScpIHx8IChjU291cmNlW2l0U291cmNlXT49J2EnICYmIGNTb3VyY2VbaXRTb3VyY2VdPD0neicpIHx8IChjU291cmNlW2l0U291cmNlXT49J0EnICYmIGNTb3VyY2VbaXRTb3VyY2VdPD0nWicpKQotCQkJCQl7Ci0JCQkJCQkvL2NQdXJwb3NlLnB1c2hfYmFjayhjU291cmNlW2l0U291cmNlXSk7Ci0JCQkJCQljUHVycG9zZSArPSBjU291cmNlW2l0U291cmNlXTsKLQkJCQkJCWl0U291cmNlKys7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpdFNvdXJjZSsrOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlICdBJzoKLQkJCXsKLQkJCQl3aGlsZShpdFNvdXJjZSA8IGlTaXplKQotCQkJCXsKLQkJCQkJaWYgKChjU291cmNlW2l0U291cmNlXT49J2EnICYmIGNTb3VyY2VbaXRTb3VyY2VdPD0neicpIHx8IChjU291cmNlW2l0U291cmNlXT49J0EnICYmIGNTb3VyY2VbaXRTb3VyY2VdPD0nWicpKQotCQkJCQl7Ci0JCQkJCQkvL2NQdXJwb3NlLnB1c2hfYmFjayhjU291cmNlW2l0U291cmNlXSk7Ci0JCQkJCQljUHVycG9zZSArPSBjU291cmNlW2l0U291cmNlXTsKLQkJCQkJCWl0U291cmNlKys7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpdFNvdXJjZSsrOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlICc5JzoKLQkJCXsKLQkJCQl3aGlsZShpdFNvdXJjZSA8IGlTaXplKQotCQkJCXsKLQkJCQkJaWYgKGNTb3VyY2VbaXRTb3VyY2VdPj0nMCcmJmNTb3VyY2VbaXRTb3VyY2VdPD0nOScpCi0JCQkJCXsKLQkJCQkJCS8vY1B1cnBvc2UucHVzaF9iYWNrKGNTb3VyY2VbaXRTb3VyY2VdKTsKLQkJCQkJCWNQdXJwb3NlICs9IGNTb3VyY2VbaXRTb3VyY2VdOwotCQkJCQkJaXRTb3VyY2UrKzsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWl0U291cmNlKys7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQljYXNlICcqJzoKLQkJCXsKLQkJCQljUHVycG9zZS5hcHBlbmQoY1NvdXJjZSxpdFNvdXJjZSxpU2l6ZS1pdFNvdXJjZSk7Ci0JCQkJaXRTb3VyY2UgPSBpU2l6ZS0xOwotCQkJCWJyZWFrOwotCQkJfQotCQljYXNlICdcXCc6Ci0JCQlicmVhazsKLQkJY2FzZSAnPic6Ci0JCQl7Ci0JCQkJZm9yKHN0ZDo6c3RyaW5nOjppdGVyYXRvciBpdCA9IGNTb3VyY2UuYmVnaW4oKTtpdCAhPSBjU291cmNlLmVuZCgpOyBpdCsrKQotCQkJCXsKLQkJCQkJKml0ID0gdG91cHBlcigqaXQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJY2FzZSAnPCc6Ci0JCQl7Ci0JCQkJZm9yKHN0ZDo6c3RyaW5nOjppdGVyYXRvciBpdCA9IGNTb3VyY2UuYmVnaW4oKTtpdCAhPSBjU291cmNlLmVuZCgpOyBpdCsrKQotCQkJCXsKLQkJCQkJKml0ID0gdG9sb3dlcigqaXQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJY2FzZSAnPSc6Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCS8vY1B1cnBvc2UucHVzaF9iYWNrKGxldHRlcik7Ci0JCQljUHVycG9zZSArPSBsZXR0ZXI7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotRlhfQk9PTCB1dGlsOjpzY2FuZChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQotewotCXY4OjpJc29sYXRlKiBpc29sYXRlID0gR2V0SXNvbGF0ZShjYyk7Ci0JaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKLQlpZiAoaVNpemUgPCAyKQotCQlyZXR1cm4gRkFMU0U7Ci0KLQlDRlhfV2lkZVN0cmluZyBzRm9ybWF0ID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwotCUNGWF9XaWRlU3RyaW5nIHNEYXRlID0gcGFyYW1zWzFdLlRvQ0ZYV2lkZVN0cmluZygpOwotCWRvdWJsZSBkRGF0ZSA9IEpTX0dldERhdGVUaW1lKCk7Ci0JaWYgKHNEYXRlLkdldExlbmd0aCgpID4gMCkKLQl7Ci0JCUZYX0JPT0wgYldyb25nRm9ybWF0ID0gRkFMU0U7Ci0JCWREYXRlID0gQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VSZWd1bGFyRGF0ZShzRGF0ZSxzRm9ybWF0LGJXcm9uZ0Zvcm1hdCk7Ci0JfQkKLQkKLQlpZiAoIUpTX1BvcnRJc05hbihkRGF0ZSkpCi0JewotCQlDSlNfRGF0ZSBkYXRlKGlzb2xhdGUsZERhdGUpOwotCQl2UmV0ID0gZGF0ZTsKLQl9Ci0JZWxzZQotCXsKLQkJdlJldC5TZXROdWxsKCk7Ci0JfQotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLUZYX0lOVDY0IEZYX2F0b2k2NChjb25zdCBjaGFyICpucHRyKQotewotICAgICAgICBpbnQgYzsgICAgICAgICAgICAgIC8qIGN1cnJlbnQgY2hhciAqLwotICAgICAgICBGWF9JTlQ2NCB0b3RhbDsgICAgICAvKiBjdXJyZW50IHRvdGFsICovCi0gICAgICAgIGludCBzaWduOyAgICAgICAgICAgLyogaWYgJy0nLCB0aGVuIG5lZ2F0aXZlLCBvdGhlcndpc2UgcG9zaXRpdmUgKi8KLQotICAgICAgICAvKiBza2lwIHdoaXRlc3BhY2UgKi8KLSAgICAgICAgd2hpbGUgKCBpc3NwYWNlKChpbnQpKHVuc2lnbmVkIGNoYXIpKm5wdHIpICkKLSAgICAgICAgICAgICsrbnB0cjsKLQotICAgICAgICBjID0gKGludCkodW5zaWduZWQgY2hhcikqbnB0cisrOwotICAgICAgICBzaWduID0gYzsgICAgICAgICAgIC8qIHNhdmUgc2lnbiBpbmRpY2F0aW9uICovCi0gICAgICAgIGlmIChjID09ICctJyB8fCBjID09ICcrJykKLSAgICAgICAgICAgIGMgPSAoaW50KSh1bnNpZ25lZCBjaGFyKSpucHRyKys7ICAgIC8qIHNraXAgc2lnbiAqLwotCi0gICAgICAgIHRvdGFsID0gMDsKLQotICAgICAgICB3aGlsZSAoaXNkaWdpdChjKSkgewotICAgICAgICAgICAgdG90YWwgPSAxMCAqIHRvdGFsICsgKGMgLSAnMCcpOyAgICAgLyogYWNjdW11bGF0ZSBkaWdpdCAqLwotICAgICAgICAgICAgYyA9IChpbnQpKHVuc2lnbmVkIGNoYXIpKm5wdHIrKzsgICAgLyogZ2V0IG5leHQgY2hhciAqLworICAgICAgaW50IGlTdGFydCA9IDA7CisgICAgICBpbnQgaUVuZDsKKyAgICAgIHdoaWxlICgoaUVuZCA9IGNGb3JtYXQuZmluZChjVGFibGVBZFtpXS5scHN6SlNNYXJrLCBpU3RhcnQpKSAhPSAtMSkgeworICAgICAgICBpZiAoaUVuZCA+IDApIHsKKyAgICAgICAgICBpZiAoY0Zvcm1hdFtpRW5kIC0gMV0gPT0gTCclJykgeworICAgICAgICAgICAgaVN0YXJ0ID0gaUVuZCArIDE7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgY0Zvcm1hdC5yZXBsYWNlKGlFbmQsIEZYU1lTX3djc2xlbihjVGFibGVBZFtpXS5scHN6SlNNYXJrKSwgdHN6VmFsdWUpOworICAgICAgICBpU3RhcnQgPSBpRW5kOworICAgICAgfQorICAgIH0KIAotICAgICAgICBpZiAoc2lnbiA9PSAnLScpCi0gICAgICAgICAgICByZXR1cm4gLXRvdGFsOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gdG90YWw7ICAgLyogcmV0dXJuIHJlc3VsdCwgbmVnYXRlZCBpZiBuZWNlc3NhcnkgKi8KKyAgICBDRlhfV2lkZVN0cmluZyBzdHJGb3JtYXQ7CisgICAgd2NoYXJfdCBidWZbNjRdID0ge307CisgICAgc3RyRm9ybWF0ID0gd2NzZnRpbWUoYnVmLCA2NCwgY0Zvcm1hdC5jX3N0cigpLCAmdGltZSk7CisgICAgY0Zvcm1hdCA9IGJ1ZjsKKyAgICB2UmV0ID0gY0Zvcm1hdC5jX3N0cigpOworICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCB1dGlsOjpieXRlVG9DaGFyKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCi17Ci0JaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKLQlpZiAoaVNpemUgPT0gMCkKLQkJcmV0dXJuIEZBTFNFOwotCWludCBuQnl0ZSA9IHBhcmFtc1swXS5Ub0ludCgpOwotCXVuc2lnbmVkIGNoYXIgY0J5dGUgPSAodW5zaWduZWQgY2hhciluQnl0ZTsKLQlDRlhfV2lkZVN0cmluZyBjc1ZhbHVlOwotCWNzVmFsdWUuRm9ybWF0KEwiJWMiLCBjQnl0ZSk7Ci0JdlJldCA9IGNzVmFsdWUuY19zdHIoKTsKLQlyZXR1cm4gVFJVRTsKK3ZvaWQgdXRpbDo6cHJpbnRkKGNvbnN0IHN0ZDo6d3N0cmluZyYgY0Zvcm1hdDIsCisgICAgICAgICAgICAgICAgICBDSlNfRGF0ZSBqc0RhdGUsCisgICAgICAgICAgICAgICAgICBib29sIGJYRkFQaWN0dXJlLAorICAgICAgICAgICAgICAgICAgc3RkOjp3c3RyaW5nJiBjUHVycG9zZSkgeworICBzdGQ6OndzdHJpbmcgY0Zvcm1hdCA9IGNGb3JtYXQyOworCisgIGlmIChiWEZBUGljdHVyZSkgeworICAgIHJldHVybjsgIC8vIGN1cnJlbnRseSwgaXQgZG9lc24ndCBzdXBwb3J0IFhGQVBpY3R1cmUuCisgIH0KKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihmY1RhYmxlKSAvIHNpemVvZihzdHJ1X1RiQ29udmVydCk7ICsraSkgeworICAgIGludCBpU3RhcnQgPSAwOworICAgIGludCBpRW5kOworICAgIHdoaWxlICgoaUVuZCA9IGNGb3JtYXQuZmluZChmY1RhYmxlW2ldLmxwc3pKU01hcmssIGlTdGFydCkpICE9IC0xKSB7CisgICAgICBjRm9ybWF0LnJlcGxhY2UoaUVuZCwgRlhTWVNfd2NzbGVuKGZjVGFibGVbaV0ubHBzekpTTWFyayksCisgICAgICAgICAgICAgICAgICAgICAgZmNUYWJsZVtpXS5scHN6Q3BwTWFyayk7CisgICAgICBpU3RhcnQgPSBpRW5kOworICAgIH0KKyAgfQorCisgIGludCBpWWVhciwgaU1vbnRoLCBpRGF5LCBpSG91ciwgaU1pbiwgaVNlYzsKKyAgaVllYXIgPSBqc0RhdGUuR2V0WWVhcigpOworICBpTW9udGggPSBqc0RhdGUuR2V0TW9udGgoKTsKKyAgaURheSA9IGpzRGF0ZS5HZXREYXkoKTsKKyAgaUhvdXIgPSBqc0RhdGUuR2V0SG91cnMoKTsKKyAgaU1pbiA9IGpzRGF0ZS5HZXRNaW51dGVzKCk7CisgIGlTZWMgPSBqc0RhdGUuR2V0U2Vjb25kcygpOworCisgIHN0cnVjdCB0bSB0aW1lID0ge307CisgIHRpbWUudG1feWVhciA9IGlZZWFyIC0gMTkwMDsKKyAgdGltZS50bV9tb24gPSBpTW9udGg7CisgIHRpbWUudG1fbWRheSA9IGlEYXk7CisgIHRpbWUudG1faG91ciA9IGlIb3VyOworICB0aW1lLnRtX21pbiA9IGlNaW47CisgIHRpbWUudG1fc2VjID0gaVNlYzsKKyAgLy8gIENPbGVEYXRlVGltZSBjcHBUbShpWWVhcixpTW9udGgrMSxpRGF5LGlIb3VyLGlNaW4saVNlYyk7CisgIC8vIENTdHJpbmcgc3RyRm9ybWF0ID0gY3BwVG0uRm9ybWF0KGNGb3JtYXQuY19zdHIoKSk7CisKKyAgc3RydWN0IHN0cnVfVGJDb252ZXJ0QWQgeworICAgIGNvbnN0IEZYX1dDSEFSKiBscHN6SlNNYXJrOworICAgIGludCBpVmFsdWU7CisgIH07CisKKyAgc3RydV9UYkNvbnZlcnRBZCBjVGFibGVBZFtdID0geworICAgICAge0wibSIsIGlNb250aCArIDF9LCB7TCJkIiwgaURheX0sCisgICAgICB7TCJIIiwgaUhvdXJ9LCAgICAgIHtMImgiLCBpSG91ciA+IDEyID8gaUhvdXIgLSAxMiA6IGlIb3VyfSwKKyAgICAgIHtMIk0iLCBpTWlufSwgICAgICAge0wicyIsIGlTZWN9LAorICB9OworCisgIC8vIGNGb3JtYXQgPSBzdHJGb3JtYXQuR2V0QnVmZmVyKHN0ckZvcm1hdC5HZXRMZW5ndGgoKSsxKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YoY1RhYmxlQWQpIC8gc2l6ZW9mKHN0cnVfVGJDb252ZXJ0QWQpOyArK2kpIHsKKyAgICB3Y2hhcl90IHRzelZhbHVlWzEwXTsKKyAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWU7CisgICAgc1ZhbHVlLkZvcm1hdChMIiVkIiwgY1RhYmxlQWRbaV0uaVZhbHVlKTsKKyAgICBtZW1jcHkodHN6VmFsdWUsICh3Y2hhcl90KilzVmFsdWUuR2V0QnVmZmVyKHNWYWx1ZS5HZXRMZW5ndGgoKSArIDEpLAorICAgICAgICAgICBzVmFsdWUuR2V0TGVuZ3RoKCkgKiBzaXplb2Yod2NoYXJfdCkpOworCisgICAgaW50IGlTdGFydCA9IDA7CisgICAgaW50IGlFbmQ7CisgICAgd2hpbGUgKChpRW5kID0gY0Zvcm1hdC5maW5kKGNUYWJsZUFkW2ldLmxwc3pKU01hcmssIGlTdGFydCkpICE9IC0xKSB7CisgICAgICBpZiAoaUVuZCA+IDApIHsKKyAgICAgICAgaWYgKGNGb3JtYXRbaUVuZCAtIDFdID09IEwnJScpIHsKKyAgICAgICAgICBpU3RhcnQgPSBpRW5kICsgMTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgY0Zvcm1hdC5yZXBsYWNlKGlFbmQsIEZYU1lTX3djc2xlbihjVGFibGVBZFtpXS5scHN6SlNNYXJrKSwgdHN6VmFsdWUpOworICAgICAgaVN0YXJ0ID0gaUVuZDsKKyAgICB9CisgIH0KKworICBDRlhfV2lkZVN0cmluZyBzdHJGb3JtYXQ7CisgIHdjaGFyX3QgYnVmWzY0XSA9IHt9OworICBzdHJGb3JtYXQgPSB3Y3NmdGltZShidWYsIDY0LCBjRm9ybWF0LmNfc3RyKCksICZ0aW1lKTsKKyAgY0Zvcm1hdCA9IGJ1ZjsKKyAgY1B1cnBvc2UgPSBjRm9ybWF0OworfQorCitGWF9CT09MIHV0aWw6OnByaW50eChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CisgIGludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7CisgIGlmIChpU2l6ZSA8IDIpCisgICAgcmV0dXJuIEZBTFNFOworICBDRlhfV2lkZVN0cmluZyBzRm9ybWF0ID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOworICBDRlhfV2lkZVN0cmluZyBzU291cmNlID0gcGFyYW1zWzFdLlRvQ0ZYV2lkZVN0cmluZygpOworICBzdGQ6OnN0cmluZyBjRm9ybWF0ID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHNGb3JtYXQpLmNfc3RyKCk7CisgIHN0ZDo6c3RyaW5nIGNTb3VyY2UgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoc1NvdXJjZSkuY19zdHIoKTsKKyAgc3RkOjpzdHJpbmcgY0Rlc3Q7CisgIHByaW50eChjRm9ybWF0LCBjU291cmNlLCBjRGVzdCk7CisgIHZSZXQgPSBjRGVzdC5jX3N0cigpOworICByZXR1cm4gVFJVRTsKK30KKwordm9pZCB1dGlsOjpwcmludHgoY29uc3Qgc3RkOjpzdHJpbmcmIGNGb3JtYXQsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY1NvdXJjZTIsCisgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyYgY1B1cnBvc2UpIHsKKyAgc3RkOjpzdHJpbmcgY1NvdXJjZShjU291cmNlMik7CisgIGlmICghY1B1cnBvc2UuZW1wdHkoKSkKKyAgICAvLyBjUHVycG9zZS5jbGVhcigpOworICAgIGNQdXJwb3NlLmVyYXNlKCk7CisgIGludCBpdFNvdXJjZSA9IDA7CisgIGludCBpU2l6ZSA9IGNTb3VyY2Uuc2l6ZSgpOworICBmb3IgKGludCBpSW5kZXggPSAwOyBpSW5kZXggPCAoaW50KWNGb3JtYXQuc2l6ZSgpICYmIGl0U291cmNlIDwgaVNpemU7CisgICAgICAgaUluZGV4KyspIHsKKyAgICBjaGFyIGxldHRlciA9IGNGb3JtYXRbaUluZGV4XTsKKyAgICBzd2l0Y2ggKGxldHRlcikgeworICAgICAgY2FzZSAnPyc6CisgICAgICAgIGNQdXJwb3NlICs9IGNTb3VyY2VbaXRTb3VyY2VdOworICAgICAgICBpdFNvdXJjZSsrOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1gnOiB7CisgICAgICAgIHdoaWxlIChpdFNvdXJjZSA8IGlTaXplKSB7CisgICAgICAgICAgaWYgKHN0ZDo6aXNkaWdpdChjU291cmNlW2l0U291cmNlXSkgfHwKKyAgICAgICAgICAgICAgKGNTb3VyY2VbaXRTb3VyY2VdID49ICdhJyAmJiBjU291cmNlW2l0U291cmNlXSA8PSAneicpIHx8CisgICAgICAgICAgICAgIChjU291cmNlW2l0U291cmNlXSA+PSAnQScgJiYgY1NvdXJjZVtpdFNvdXJjZV0gPD0gJ1onKSkgeworICAgICAgICAgICAgY1B1cnBvc2UgKz0gY1NvdXJjZVtpdFNvdXJjZV07CisgICAgICAgICAgICBpdFNvdXJjZSsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGl0U291cmNlKys7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSAnQSc6IHsKKyAgICAgICAgd2hpbGUgKGl0U291cmNlIDwgaVNpemUpIHsKKyAgICAgICAgICBpZiAoKGNTb3VyY2VbaXRTb3VyY2VdID49ICdhJyAmJiBjU291cmNlW2l0U291cmNlXSA8PSAneicpIHx8CisgICAgICAgICAgICAgIChjU291cmNlW2l0U291cmNlXSA+PSAnQScgJiYgY1NvdXJjZVtpdFNvdXJjZV0gPD0gJ1onKSkgeworICAgICAgICAgICAgY1B1cnBvc2UgKz0gY1NvdXJjZVtpdFNvdXJjZV07CisgICAgICAgICAgICBpdFNvdXJjZSsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGl0U291cmNlKys7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSAnOSc6IHsKKyAgICAgICAgd2hpbGUgKGl0U291cmNlIDwgaVNpemUpIHsKKyAgICAgICAgICBpZiAoc3RkOjppc2RpZ2l0KGNTb3VyY2VbaXRTb3VyY2VdKSkgeworICAgICAgICAgICAgY1B1cnBvc2UgKz0gY1NvdXJjZVtpdFNvdXJjZV07CisgICAgICAgICAgICBpdFNvdXJjZSsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGl0U291cmNlKys7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICcqJzogeworICAgICAgICBjUHVycG9zZS5hcHBlbmQoY1NvdXJjZSwgaXRTb3VyY2UsIGlTaXplIC0gaXRTb3VyY2UpOworICAgICAgICBpdFNvdXJjZSA9IGlTaXplIC0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICdcXCc6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPic6IHsKKyAgICAgICAgZm9yIChjaGFyJiBjIDogY1NvdXJjZSkKKyAgICAgICAgICBjID0gdG91cHBlcihjKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICc8JzogeworICAgICAgICBmb3IgKGNoYXImIGMgOiBjU291cmNlKQorICAgICAgICAgIGMgPSB0b2xvd2VyKGMpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgJz0nOgorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNQdXJwb3NlICs9IGxldHRlcjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK0ZYX0JPT0wgdXRpbDo6c2NhbmQoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgeworICBpbnQgaVNpemUgPSBwYXJhbXMuc2l6ZSgpOworICBpZiAoaVNpemUgPCAyKQorICAgIHJldHVybiBGQUxTRTsKKworICBDRlhfV2lkZVN0cmluZyBzRm9ybWF0ID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOworICBDRlhfV2lkZVN0cmluZyBzRGF0ZSA9IHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKTsKKyAgZG91YmxlIGREYXRlID0gSlNfR2V0RGF0ZVRpbWUoKTsKKyAgaWYgKHNEYXRlLkdldExlbmd0aCgpID4gMCkgeworICAgIGREYXRlID0gQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VSZWd1bGFyRGF0ZShzRGF0ZSwgc0Zvcm1hdCwgbnVsbHB0cik7CisgIH0KKworICBpZiAoIUpTX1BvcnRJc05hbihkRGF0ZSkpIHsKKyAgICB2UmV0ID0gQ0pTX0RhdGUoQ0pTX1J1bnRpbWU6OkZyb21Db250ZXh0KGNjKSwgZERhdGUpOworICB9IGVsc2UgeworICAgIHZSZXQuU2V0TnVsbCgpOworICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludDY0X3QgRlhfYXRvaTY0KGNvbnN0IGNoYXIqIG5wdHIpIHsKKyAgaW50IGM7ICAgICAgICAgLyogY3VycmVudCBjaGFyICovCisgIGludDY0X3QgdG90YWw7IC8qIGN1cnJlbnQgdG90YWwgKi8KKyAgaW50IHNpZ247ICAgICAgLyogaWYgJy0nLCB0aGVuIG5lZ2F0aXZlLCBvdGhlcndpc2UgcG9zaXRpdmUgKi8KKworICAvKiBza2lwIHdoaXRlc3BhY2UgKi8KKyAgd2hpbGUgKGlzc3BhY2UoKGludCkodW5zaWduZWQgY2hhcikqbnB0cikpCisgICAgKytucHRyOworCisgIGMgPSAoaW50KSh1bnNpZ25lZCBjaGFyKSpucHRyKys7CisgIHNpZ24gPSBjOyAvKiBzYXZlIHNpZ24gaW5kaWNhdGlvbiAqLworICBpZiAoYyA9PSAnLScgfHwgYyA9PSAnKycpCisgICAgYyA9IChpbnQpKHVuc2lnbmVkIGNoYXIpKm5wdHIrKzsgLyogc2tpcCBzaWduICovCisKKyAgdG90YWwgPSAwOworCisgIHdoaWxlIChpc2RpZ2l0KGMpKSB7CisgICAgdG90YWwgPSAxMCAqIHRvdGFsICsgRlhTWVNfdG9EZWNpbWFsRGlnaXQoYyk7IC8qIGFjY3VtdWxhdGUgZGlnaXQgKi8KKyAgICBjID0gKGludCkodW5zaWduZWQgY2hhcikqbnB0cisrOyAvKiBnZXQgbmV4dCBjaGFyICovCisgIH0KKworICByZXR1cm4gc2lnbiA9PSAnLScgPyAtdG90YWwgOiB0b3RhbDsKK30KKworRlhfQk9PTCB1dGlsOjpieXRlVG9DaGFyKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKKyAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKKyAgaWYgKGlTaXplID09IDApCisgICAgcmV0dXJuIEZBTFNFOworICBpbnQgbkJ5dGUgPSBwYXJhbXNbMF0uVG9JbnQoKTsKKyAgdW5zaWduZWQgY2hhciBjQnl0ZSA9ICh1bnNpZ25lZCBjaGFyKW5CeXRlOworICBDRlhfV2lkZVN0cmluZyBjc1ZhbHVlOworICBjc1ZhbHVlLkZvcm1hdChMIiVjIiwgY0J5dGUpOworICB2UmV0ID0gY3NWYWx1ZS5jX3N0cigpOworICByZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvdXRpbC5oIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I5YTE4YwotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvdXRpbC5oCkBAIC0wLDAgKzEsNjggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGUERGU0RLX1NSQ19KQVZBU0NSSVBUX1VUSUxfSF8KKyNkZWZpbmUgRlBERlNES19TUkNfSkFWQVNDUklQVF9VVElMX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+ICAvLyBGb3Igc3RkOjp3c3RyaW5nLgorCisjaW5jbHVkZSAiSlNfRGVmaW5lLmgiCisKK2NsYXNzIHV0aWwgOiBwdWJsaWMgQ0pTX0VtYmVkT2JqIHsKKyBwdWJsaWM6CisgIHV0aWwoQ0pTX09iamVjdCogcEpTT2JqZWN0KTsKKyAgfnV0aWwoKSBvdmVycmlkZTsKKworIHB1YmxpYzoKKyAgRlhfQk9PTCBwcmludGQoSUpTX0NvbnRleHQqIGNjLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7CisgIEZYX0JPT0wgcHJpbnRmKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCisgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworICBGWF9CT09MIHByaW50eChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAorICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBzY2FuZChJSlNfQ29udGV4dCogY2MsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAorICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKKyAgRlhfQk9PTCBieXRlVG9DaGFyKElKU19Db250ZXh0KiBjYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOworCisgcHVibGljOgorICBzdGF0aWMgdm9pZCBwcmludGQoY29uc3Qgc3RkOjp3c3RyaW5nJiBjRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgQ0pTX0RhdGUgRGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlhGQVBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OndzdHJpbmcmIGNQdXJwb3NlKTsKKyAgc3RhdGljIHZvaWQgcHJpbnR4KGNvbnN0IHN0ZDo6c3RyaW5nJiBjRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyYgY1B1cnBvc2UpOworICBzdGF0aWMgaW50IFBhcnN0RGF0YVR5cGUoc3RkOjp3c3RyaW5nKiBzRm9ybWF0KTsKK307CisKK2NsYXNzIENKU19VdGlsIDogcHVibGljIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgQ0pTX1V0aWwodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQorICB+Q0pTX1V0aWwoKSBvdmVycmlkZSB7fQorCisgIERFQ0xBUkVfSlNfQ0xBU1MoKTsKKworICBKU19TVEFUSUNfTUVUSE9EKHByaW50ZCwgdXRpbCk7CisgIEpTX1NUQVRJQ19NRVRIT0QocHJpbnRmLCB1dGlsKTsKKyAgSlNfU1RBVElDX01FVEhPRChwcmludHgsIHV0aWwpOworICBKU19TVEFUSUNfTUVUSE9EKHNjYW5kLCB1dGlsKTsKKyAgSlNfU1RBVElDX01FVEhPRChieXRlVG9DaGFyLCB1dGlsKTsKK307CisKK2ludDY0X3QgRlhfYXRvaTY0KGNvbnN0IGNoYXIqIG5wdHIpOworCisjZW5kaWYgIC8vIEZQREZTREtfU1JDX0pBVkFTQ1JJUFRfVVRJTF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvanNhcGkvZnhqc192OC5jcHAgYi9mcGRmc2RrL3NyYy9qc2FwaS9meGpzX3Y4LmNwcAppbmRleCAwYzBkOGI1Li5iMDZmNzQ3IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9qc2FwaS9meGpzX3Y4LmNwcAorKysgYi9mcGRmc2RrL3NyYy9qc2FwaS9meGpzX3Y4LmNwcApAQCAtMSwxMDY5ICsxLDc3OCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vLi4vY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2V4dC5oIiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2pzYXBpL2Z4anNfdjguaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2ZzZGtfZGVmaW5lLmgiCi0jaW5jbHVkZSAidGltZS5oIgotI2luY2x1ZGUgPGNtYXRoPgotI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvanNhcGkvZnhqc192OC5oIgogCi0jZGVmaW5lIFZBTFVFX05BTUVfU1RSSU5HCQlMInN0cmluZyIKLSNkZWZpbmUgVkFMVUVfTkFNRV9OVU1CRVIJCUwibnVtYmVyIgotI2RlZmluZSBWQUxVRV9OQU1FX0JPT0xFQU4JCUwiYm9vbGVhbiIKLSNkZWZpbmUgVkFMVUVfTkFNRV9EQVRFCQkJTCJkYXRlIgotI2RlZmluZSBWQUxVRV9OQU1FX09CSkVDVAkJTCJvYmplY3QiCi0jZGVmaW5lIFZBTFVFX05BTUVfRlhPQkoJCUwiZnhvYmoiCi0jZGVmaW5lIFZBTFVFX05BTUVfTlVMTAkJCUwibnVsbCIKLSNkZWZpbmUgVkFMVUVfTkFNRV9VTkRFRklORUQJTCJ1bmRlZmluZWQiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCiAKLWNvbnN0IHN0YXRpYyBGWF9EV09SRCBnX25hblsyXSA9IHswLDB4N0ZGODAwMDAgfTsKLXN0YXRpYyBkb3VibGUgR2V0TmFuKCkKLXsKLSAgcmV0dXJuICooZG91YmxlKilnX25hbjsKLX0KK2NvbnN0IHdjaGFyX3Qga0ZYSlNWYWx1ZU5hbWVTdHJpbmdbXSA9IEwic3RyaW5nIjsKK2NvbnN0IHdjaGFyX3Qga0ZYSlNWYWx1ZU5hbWVOdW1iZXJbXSA9IEwibnVtYmVyIjsKK2NvbnN0IHdjaGFyX3Qga0ZYSlNWYWx1ZU5hbWVCb29sZWFuW10gPSBMImJvb2xlYW4iOworY29uc3Qgd2NoYXJfdCBrRlhKU1ZhbHVlTmFtZURhdGVbXSA9IEwiZGF0ZSI7Citjb25zdCB3Y2hhcl90IGtGWEpTVmFsdWVOYW1lT2JqZWN0W10gPSBMIm9iamVjdCI7Citjb25zdCB3Y2hhcl90IGtGWEpTVmFsdWVOYW1lRnhvYmpbXSA9IEwiZnhvYmoiOworY29uc3Qgd2NoYXJfdCBrRlhKU1ZhbHVlTmFtZU51bGxbXSA9IEwibnVsbCI7Citjb25zdCB3Y2hhcl90IGtGWEpTVmFsdWVOYW1lVW5kZWZpbmVkW10gPSBMInVuZGVmaW5lZCI7CiAKKy8vIEtlZXAgdGhpcyBjb25zaXN0ZW50IHdpdGggdGhlIHZhbHVlcyBkZWZpbmVkIGluIGdpbi9wdWJsaWMvY29udGV4dF9ob2xkZXIuaAorLy8gKHdpdGhvdXQgYWN0dWFsbHkgcmVxdWlyaW5nIGEgZGVwZW5kZW5jeSBvbiBnaW4gaXRzZWxmIGZvciB0aGUgc3RhbmRhbG9uZQorLy8gZW1iZWRkZXJzIG9mIFBERkl1bSkuIFRoZSB2YWx1ZSB3ZSB3YW50IHRvIHVzZSBpczoKKy8vICAga1BlckNvbnRleHREYXRhU3RhcnRJbmRleCArIGtFbWJlZGRlclBERml1bSwgd2hpY2ggaXMgMy4KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQga1BlckNvbnRleHREYXRhSW5kZXggPSAzdTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ19lbWJlZGRlckRhdGFTbG90ID0gMXU7CitzdGF0aWMgdjg6Oklzb2xhdGUqIGdfaXNvbGF0ZSA9IG51bGxwdHI7CitzdGF0aWMgc2l6ZV90IGdfaXNvbGF0ZV9yZWZfY291bnQgPSAwOworc3RhdGljIEZYSlNfQXJyYXlCdWZmZXJBbGxvY2F0b3IqIGdfYXJyYXlCdWZmZXJBbGxvY2F0b3IgPSBudWxscHRyOworc3RhdGljIHY4OjpHbG9iYWw8djg6Ok9iamVjdFRlbXBsYXRlPiogZ19EZWZhdWx0R2xvYmFsT2JqZWN0VGVtcGxhdGUgPSBudWxscHRyOwogCi1jbGFzcyBDSlNfUHJpdmF0ZURhdGEKLXsKLXB1YmxpYzoKLQlDSlNfUHJpdmF0ZURhdGEoKTpPYmpEZWZJRCgtMSksIHBQcml2YXRlKE5VTEwpIHt9Ci0JaW50IE9iakRlZklEOwotCUZYX0xQVk9JRAlwUHJpdmF0ZTsKK2NsYXNzIENGWEpTX1Blck9iamVjdERhdGEgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0ZYSlNfUGVyT2JqZWN0RGF0YShpbnQgbk9iakRlZklEKQorICAgICAgOiBtX09iakRlZklEKG5PYmpEZWZJRCksIG1fcFByaXZhdGUobnVsbHB0cikge30KKworICBjb25zdCBpbnQgbV9PYmpEZWZJRDsKKyAgdm9pZCogbV9wUHJpdmF0ZTsKIH07CiAKK2NsYXNzIENGWEpTX09iakRlZmluaXRpb24geworIHB1YmxpYzoKKyAgc3RhdGljIGludCBNYXhJRCh2ODo6SXNvbGF0ZSogcElzb2xhdGUpIHsKKyAgICByZXR1cm4gRlhKU19QZXJJc29sYXRlRGF0YTo6R2V0KHBJc29sYXRlKS0+bV9PYmplY3REZWZuQXJyYXkuc2l6ZSgpOworICB9CiAKLWNsYXNzIENKU19PYmpEZWZpbnRpb24KLXsKLXB1YmxpYzoKLQlDSlNfT2JqRGVmaW50aW9uKHY4OjpJc29sYXRlKiBpc29sYXRlLCBjb25zdCB3Y2hhcl90KiBzT2JqTmFtZSwgRlhKU09CSlRZUEUgZU9ialR5cGUsIExQX0NPTlNUUlVDVE9SIHBDb25zdHJ1Y3RvciwgTFBfREVTVFJVQ1RPUiBwRGVzdHJ1Y3RvciwgdW5zaWduZWQgYkFwcGx5TmV3KToKLQkgIG9iak5hbWUoc09iak5hbWUpLCBvYmpUeXBlKGVPYmpUeXBlKSwgbV9wQ29uc3RydWN0b3IocENvbnN0cnVjdG9yKSwgbV9wRGVzdHJ1Y3RvcihwRGVzdHJ1Y3RvciksbV9iQXBwbHlOZXcoYkFwcGx5TmV3KSxtX2JTZXRBc0dsb2JhbE9iamVjdChGQUxTRSkKLQkgIHsKLQkJICB2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShpc29sYXRlKTsKLQkJICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKGlzb2xhdGUpOworICBzdGF0aWMgQ0ZYSlNfT2JqRGVmaW5pdGlvbiogRm9ySUQodjg6Oklzb2xhdGUqIHBJc29sYXRlLCBpbnQgaWQpIHsKKyAgICAvLyBOb3RlOiBHZXRBdCgpIGhhbHRzIGlmIG91dC1vZi1yYW5nZSBldmVuIGluIHJlbGVhc2UgYnVpbGRzLgorICAgIHJldHVybiBGWEpTX1Blcklzb2xhdGVEYXRhOjpHZXQocElzb2xhdGUpLT5tX09iamVjdERlZm5BcnJheVtpZF07CisgIH0KIAotCQkgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IG9ialRlbXBsYXRlID0gdjg6Ok9iamVjdFRlbXBsYXRlOjpOZXcoaXNvbGF0ZSk7Ci0JCSAgb2JqVGVtcGxhdGUtPlNldEludGVybmFsRmllbGRDb3VudCgyKTsKLQkJICBtX29ialRlbXBsYXRlLlJlc2V0KGlzb2xhdGUsIG9ialRlbXBsYXRlKTsKKyAgQ0ZYSlNfT2JqRGVmaW5pdGlvbih2ODo6SXNvbGF0ZSogaXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzT2JqTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBGWEpTT0JKVFlQRSBlT2JqVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBGWEpTX0NPTlNUUlVDVE9SIHBDb25zdHJ1Y3RvciwKKyAgICAgICAgICAgICAgICAgICAgICBGWEpTX0RFU1RSVUNUT1IgcERlc3RydWN0b3IpCisgICAgICA6IG1fT2JqTmFtZShzT2JqTmFtZSksCisgICAgICAgIG1fT2JqVHlwZShlT2JqVHlwZSksCisgICAgICAgIG1fcENvbnN0cnVjdG9yKHBDb25zdHJ1Y3RvciksCisgICAgICAgIG1fcERlc3RydWN0b3IocERlc3RydWN0b3IpLAorICAgICAgICBtX3BJc29sYXRlKGlzb2xhdGUpIHsKKyAgICB2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShpc29sYXRlKTsKKyAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKGlzb2xhdGUpOwogCi0JCSAvL0RvY3VtZW50IGFzIHRoZSBnbG9iYWwgb2JqZWN0LgotCQkgIGlmKEZYU1lTX3djc2NtcChzT2JqTmFtZSwgTCJEb2N1bWVudCIpID09IDApCi0JCSAgewotCQkJIG1fYlNldEFzR2xvYmFsT2JqZWN0ID0gVFJVRTsKLQkJICB9CisgICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBmdW4gPSB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KGlzb2xhdGUpOworICAgIGZ1bi0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXRJbnRlcm5hbEZpZWxkQ291bnQoMik7CisgICAgbV9GdW5jdGlvblRlbXBsYXRlLlJlc2V0KGlzb2xhdGUsIGZ1bik7CiAKLQkgIH0KLQkgIH5DSlNfT2JqRGVmaW50aW9uKCkKLQkgIHsKLQkJICBtX29ialRlbXBsYXRlLlJlc2V0KCk7Ci0JCSAgbV9TdGF0aWNPYmouUmVzZXQoKTsKLQkgIH0KLXB1YmxpYzoKLQljb25zdCB3Y2hhcl90KiBvYmpOYW1lOwotCUZYSlNPQkpUWVBFIG9ialR5cGU7Ci0JTFBfQ09OU1RSVUNUT1IgbV9wQ29uc3RydWN0b3I7Ci0JTFBfREVTVFJVQ1RPUiBtX3BEZXN0cnVjdG9yOwotCXVuc2lnbmVkIG1fYkFwcGx5TmV3OwotCUZYX0JPT0wJbV9iU2V0QXNHbG9iYWxPYmplY3Q7CisgICAgdjg6OkxvY2FsPHY4OjpTaWduYXR1cmU+IHNpZyA9IHY4OjpTaWduYXR1cmU6Ok5ldyhpc29sYXRlLCBmdW4pOworICAgIG1fU2lnbmF0dXJlLlJlc2V0KGlzb2xhdGUsIHNpZyk7CisgIH0KIAotCXY4OjpHbG9iYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBtX29ialRlbXBsYXRlOwotCXY4OjpHbG9iYWw8djg6Ok9iamVjdD4gbV9TdGF0aWNPYmo7CisgIGludCBBc3NpZ25JRCgpIHsKKyAgICBGWEpTX1Blcklzb2xhdGVEYXRhKiBwRGF0YSA9IEZYSlNfUGVySXNvbGF0ZURhdGE6OkdldChtX3BJc29sYXRlKTsKKyAgICBwRGF0YS0+bV9PYmplY3REZWZuQXJyYXkucHVzaF9iYWNrKHRoaXMpOworICAgIHJldHVybiBwRGF0YS0+bV9PYmplY3REZWZuQXJyYXkuc2l6ZSgpIC0gMTsKKyAgfQorCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IEdldEluc3RhbmNlVGVtcGxhdGUoKSB7CisgICAgdjg6OkVzY2FwYWJsZUhhbmRsZVNjb3BlIHNjb3BlKG1fcElzb2xhdGUpOworICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gZnVuY3Rpb24gPQorICAgICAgICBtX0Z1bmN0aW9uVGVtcGxhdGUuR2V0KG1fcElzb2xhdGUpOworICAgIHJldHVybiBzY29wZS5Fc2NhcGUoZnVuY3Rpb24tPkluc3RhbmNlVGVtcGxhdGUoKSk7CisgIH0KKworICB2ODo6TG9jYWw8djg6OlNpZ25hdHVyZT4gR2V0U2lnbmF0dXJlKCkgeworICAgIHY4OjpFc2NhcGFibGVIYW5kbGVTY29wZSBzY29wZShtX3BJc29sYXRlKTsKKyAgICByZXR1cm4gc2NvcGUuRXNjYXBlKG1fU2lnbmF0dXJlLkdldChtX3BJc29sYXRlKSk7CisgIH0KKworICBjb25zdCB3Y2hhcl90KiBjb25zdCBtX09iak5hbWU7CisgIGNvbnN0IEZYSlNPQkpUWVBFIG1fT2JqVHlwZTsKKyAgY29uc3QgRlhKU19DT05TVFJVQ1RPUiBtX3BDb25zdHJ1Y3RvcjsKKyAgY29uc3QgRlhKU19ERVNUUlVDVE9SIG1fcERlc3RydWN0b3I7CisKKyAgdjg6Oklzb2xhdGUqIG1fcElzb2xhdGU7CisgIHY4OjpHbG9iYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IG1fRnVuY3Rpb25UZW1wbGF0ZTsKKyAgdjg6Okdsb2JhbDx2ODo6U2lnbmF0dXJlPiBtX1NpZ25hdHVyZTsKIH07CiAKLWludCBKU19EZWZpbmVPYmooSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIGNvbnN0IHdjaGFyX3QqIHNPYmpOYW1lLCBGWEpTT0JKVFlQRSBlT2JqVHlwZSwgTFBfQ09OU1RSVUNUT1IgcENvbnN0cnVjdG9yLCBMUF9ERVNUUlVDVE9SIHBEZXN0cnVjdG9yLCB1bnNpZ25lZCBiQXBwbHlOZXcpCi17Ci0Jdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSAodjg6Oklzb2xhdGUqKXBKU1J1bnRpbWU7Ci0Jdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7Ci0Jdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShpc29sYXRlKTsKLQlDRlhfUHRyQXJyYXkqIHBBcnJheSA9IChDRlhfUHRyQXJyYXkqKWlzb2xhdGUtPkdldERhdGEoMCk7Ci0JaWYoIXBBcnJheSkKLQl7Ci0JCXBBcnJheSA9IG5ldyBDRlhfUHRyQXJyYXkoKTsKLQkJaXNvbGF0ZS0+U2V0RGF0YSgwLCBwQXJyYXkpOwotCX0KLQlDSlNfT2JqRGVmaW50aW9uKiBwT2JqRGVmID0gbmV3IENKU19PYmpEZWZpbnRpb24oaXNvbGF0ZSwgc09iak5hbWUsIGVPYmpUeXBlLCBwQ29uc3RydWN0b3IsIHBEZXN0cnVjdG9yLCBiQXBwbHlOZXcpOwotCXBBcnJheS0+QWRkKHBPYmpEZWYpOwotCXJldHVybiBwQXJyYXktPkdldFNpemUoKS0xOworc3RhdGljIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IEdldEdsb2JhbE9iamVjdFRlbXBsYXRlKAorICAgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkgeworICBpbnQgbWF4SUQgPSBDRlhKU19PYmpEZWZpbml0aW9uOjpNYXhJRChwSXNvbGF0ZSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4SUQ7ICsraSkgeworICAgIENGWEpTX09iakRlZmluaXRpb24qIHBPYmpEZWYgPSBDRlhKU19PYmpEZWZpbml0aW9uOjpGb3JJRChwSXNvbGF0ZSwgaSk7CisgICAgaWYgKHBPYmpEZWYtPm1fT2JqVHlwZSA9PSBGWEpTT0JKVFlQRV9HTE9CQUwpCisgICAgICByZXR1cm4gcE9iakRlZi0+R2V0SW5zdGFuY2VUZW1wbGF0ZSgpOworICB9CisgIGlmICghZ19EZWZhdWx0R2xvYmFsT2JqZWN0VGVtcGxhdGUpIHsKKyAgICBnX0RlZmF1bHRHbG9iYWxPYmplY3RUZW1wbGF0ZSA9IG5ldyB2ODo6R2xvYmFsPHY4OjpPYmplY3RUZW1wbGF0ZT47CisgICAgZ19EZWZhdWx0R2xvYmFsT2JqZWN0VGVtcGxhdGUtPlJlc2V0KHBJc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6T2JqZWN0VGVtcGxhdGU6Ok5ldyhwSXNvbGF0ZSkpOworICB9CisgIHJldHVybiBnX0RlZmF1bHRHbG9iYWxPYmplY3RUZW1wbGF0ZS0+R2V0KHBJc29sYXRlKTsKIH0KIAotaW50IEpTX0RlZmluZU9iak1ldGhvZChJSlNfUnVudGltZSogcEpTUnVudGltZSwgaW50IG5PYmpEZWZuSUQsIGNvbnN0IHdjaGFyX3QqIHNNZXRob2ROYW1lLCB2ODo6RnVuY3Rpb25DYWxsYmFjayBwTWV0aG9kQ2FsbCkKLXsKLQl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9ICh2ODo6SXNvbGF0ZSopcEpTUnVudGltZTsKLQl2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShpc29sYXRlKTsKLQl2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKGlzb2xhdGUpOwotCi0JQ0ZYX1dpZGVTdHJpbmcgd3MgPSBDRlhfV2lkZVN0cmluZyhzTWV0aG9kTmFtZSk7Ci0JQ0ZYX0J5dGVTdHJpbmcgYnNNZXRob2ROYW1lID0gd3MuVVRGOEVuY29kZSgpOwotCi0JQ0ZYX1B0ckFycmF5KiBwQXJyYXkgPSAoQ0ZYX1B0ckFycmF5Kilpc29sYXRlLT5HZXREYXRhKDApOwotCWlmKCFwQXJyYXkpIHJldHVybiAwOwotCi0JaWYobk9iakRlZm5JRDwwIHx8IG5PYmpEZWZuSUQ+PSBwQXJyYXktPkdldFNpemUoKSkgcmV0dXJuIDA7Ci0JQ0pTX09iakRlZmludGlvbiogcE9iakRlZiA9IChDSlNfT2JqRGVmaW50aW9uKilwQXJyYXktPkdldEF0KG5PYmpEZWZuSUQpOwotCXY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IG9ialRlbXAgPSB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPjo6TmV3KGlzb2xhdGUsIHBPYmpEZWYtPm1fb2JqVGVtcGxhdGUpOwotCW9ialRlbXAtPlNldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChpc29sYXRlLCBGWF9MUENTVFIoYnNNZXRob2ROYW1lKSwgdjg6Ok5ld1N0cmluZ1R5cGU6OmtOb3JtYWwpLlRvTG9jYWxDaGVja2VkKCksIHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcoaXNvbGF0ZSwgcE1ldGhvZENhbGwpLCB2ODo6UmVhZE9ubHkpOwotCXBPYmpEZWYtPm1fb2JqVGVtcGxhdGUuUmVzZXQoaXNvbGF0ZSxvYmpUZW1wKTsKLQlyZXR1cm4gMDsKK3ZvaWQqIEZYSlNfQXJyYXlCdWZmZXJBbGxvY2F0b3I6OkFsbG9jYXRlKHNpemVfdCBsZW5ndGgpIHsKKyAgcmV0dXJuIGNhbGxvYygxLCBsZW5ndGgpOwogfQogCi1pbnQgSlNfRGVmaW5lT2JqUHJvcGVydHkoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIGludCBuT2JqRGVmbklELCBjb25zdCB3Y2hhcl90KiBzUHJvcE5hbWUsIHY4OjpBY2Nlc3NvckdldHRlckNhbGxiYWNrIHBQcm9wR2V0LCB2ODo6QWNjZXNzb3JTZXR0ZXJDYWxsYmFjayBwUHJvcFB1dCkKLXsKLQl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9ICh2ODo6SXNvbGF0ZSopcEpTUnVudGltZTsKLQl2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShpc29sYXRlKTsKLQl2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKGlzb2xhdGUpOwotCi0JQ0ZYX1dpZGVTdHJpbmcgd3MgPSBDRlhfV2lkZVN0cmluZyhzUHJvcE5hbWUpOwotCUNGWF9CeXRlU3RyaW5nIGJzUHJvcGVydHlOYW1lID0gd3MuVVRGOEVuY29kZSgpOwotCi0JQ0ZYX1B0ckFycmF5KiBwQXJyYXkgPSAoQ0ZYX1B0ckFycmF5Kilpc29sYXRlLT5HZXREYXRhKDApOwotCWlmKCFwQXJyYXkpIHJldHVybiAwOwotCi0JaWYobk9iakRlZm5JRDwwIHx8IG5PYmpEZWZuSUQ+PSBwQXJyYXktPkdldFNpemUoKSkgcmV0dXJuIDA7Ci0JQ0pTX09iakRlZmludGlvbiogcE9iakRlZiA9IChDSlNfT2JqRGVmaW50aW9uKilwQXJyYXktPkdldEF0KG5PYmpEZWZuSUQpOwotCXY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IG9ialRlbXAgPSB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPjo6TmV3KGlzb2xhdGUsIHBPYmpEZWYtPm1fb2JqVGVtcGxhdGUpOwotCW9ialRlbXAtPlNldEFjY2Vzc29yKHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KGlzb2xhdGUsIEZYX0xQQ1NUUihic1Byb3BlcnR5TmFtZSksIHY4OjpOZXdTdHJpbmdUeXBlOjprTm9ybWFsKS5Ub0xvY2FsQ2hlY2tlZCgpLCBwUHJvcEdldCwgcFByb3BQdXQpOwotCXBPYmpEZWYtPm1fb2JqVGVtcGxhdGUuUmVzZXQoaXNvbGF0ZSxvYmpUZW1wKTsKLQlyZXR1cm4gMDsKK3ZvaWQqIEZYSlNfQXJyYXlCdWZmZXJBbGxvY2F0b3I6OkFsbG9jYXRlVW5pbml0aWFsaXplZChzaXplX3QgbGVuZ3RoKSB7CisgIHJldHVybiBtYWxsb2MobGVuZ3RoKTsKIH0KIAotaW50CUpTX0RlZmluZU9iakFsbFByb3BlcnRpZXMoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIGludCBuT2JqRGVmbklELCB2ODo6TmFtZWRQcm9wZXJ0eVF1ZXJ5Q2FsbGJhY2sgcFByb3BRdXJleSwgdjg6Ok5hbWVkUHJvcGVydHlHZXR0ZXJDYWxsYmFjayBwUHJvcEdldCwgdjg6Ok5hbWVkUHJvcGVydHlTZXR0ZXJDYWxsYmFjayBwUHJvcFB1dCwgdjg6Ok5hbWVkUHJvcGVydHlEZWxldGVyQ2FsbGJhY2sgcFByb3BEZWwpCi17Ci0Jdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSAodjg6Oklzb2xhdGUqKXBKU1J1bnRpbWU7Ci0Jdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7Ci0Jdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShpc29sYXRlKTsKLQotCUNGWF9QdHJBcnJheSogcEFycmF5ID0gKENGWF9QdHJBcnJheSopaXNvbGF0ZS0+R2V0RGF0YSgwKTsKLQlpZighcEFycmF5KSByZXR1cm4gMDsKLQotCWlmKG5PYmpEZWZuSUQ8MCB8fCBuT2JqRGVmbklEPj0gcEFycmF5LT5HZXRTaXplKCkpIHJldHVybiAwOwotCUNKU19PYmpEZWZpbnRpb24qIHBPYmpEZWYgPSAoQ0pTX09iakRlZmludGlvbiopcEFycmF5LT5HZXRBdChuT2JqRGVmbklEKTsKLQl2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBvYmpUZW1wID0gdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT46Ok5ldyhpc29sYXRlLCBwT2JqRGVmLT5tX29ialRlbXBsYXRlKTsKLQlvYmpUZW1wLT5TZXROYW1lZFByb3BlcnR5SGFuZGxlcihwUHJvcEdldCwgcFByb3BQdXQsIHBQcm9wUXVyZXksIHBQcm9wRGVsKTsKLQlwT2JqRGVmLT5tX29ialRlbXBsYXRlLlJlc2V0KGlzb2xhdGUsb2JqVGVtcCk7Ci0JcmV0dXJuIDA7Cit2b2lkIEZYSlNfQXJyYXlCdWZmZXJBbGxvY2F0b3I6OkZyZWUodm9pZCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgeworICBmcmVlKGRhdGEpOwogfQogCi1pbnQgSlNfRGVmaW5lT2JqQ29uc3QoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIGludCBuT2JqRGVmbklELCBjb25zdCB3Y2hhcl90KiBzQ29uc3ROYW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBwRGVmYXVsdCkKLXsKLQl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9ICh2ODo6SXNvbGF0ZSopcEpTUnVudGltZTsKLQl2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShpc29sYXRlKTsKLQl2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKGlzb2xhdGUpOwotCi0JQ0ZYX1B0ckFycmF5KiBwQXJyYXkgPSAoQ0ZYX1B0ckFycmF5Kilpc29sYXRlLT5HZXREYXRhKDApOwotCWlmKCFwQXJyYXkpIHJldHVybiAwOwotCi0JQ0ZYX1dpZGVTdHJpbmcgd3MgPSBDRlhfV2lkZVN0cmluZyhzQ29uc3ROYW1lKTsKLQlDRlhfQnl0ZVN0cmluZyBic0NvbnN0TmFtZSA9IHdzLlVURjhFbmNvZGUoKTsKLQotCWlmKG5PYmpEZWZuSUQ8MCB8fCBuT2JqRGVmbklEPj0gcEFycmF5LT5HZXRTaXplKCkpIHJldHVybiAwOwotCUNKU19PYmpEZWZpbnRpb24qIHBPYmpEZWYgPSAoQ0pTX09iakRlZmludGlvbiopcEFycmF5LT5HZXRBdChuT2JqRGVmbklEKTsKLQl2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBvYmpUZW1wID0gdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT46Ok5ldyhpc29sYXRlLCBwT2JqRGVmLT5tX29ialRlbXBsYXRlKTsKLQlvYmpUZW1wLT5TZXQoaXNvbGF0ZSwgRlhfTFBDU1RSKGJzQ29uc3ROYW1lKSwgcERlZmF1bHQpOwotCXBPYmpEZWYtPm1fb2JqVGVtcGxhdGUuUmVzZXQoaXNvbGF0ZSxvYmpUZW1wKTsKLQlyZXR1cm4gMDsKK3ZvaWQgRlhKU19Jbml0aWFsaXplKHVuc2lnbmVkIGludCBlbWJlZGRlckRhdGFTbG90LCB2ODo6SXNvbGF0ZSogcElzb2xhdGUpIHsKKyAgaWYgKGdfaXNvbGF0ZSkgeworICAgIEFTU0VSVChnX2VtYmVkZGVyRGF0YVNsb3QgPT0gZW1iZWRkZXJEYXRhU2xvdCk7CisgICAgQVNTRVJUKGdfaXNvbGF0ZSA9PSBwSXNvbGF0ZSk7CisgICAgcmV0dXJuOworICB9CisgIGdfZW1iZWRkZXJEYXRhU2xvdCA9IGVtYmVkZGVyRGF0YVNsb3Q7CisgIGdfaXNvbGF0ZSA9IHBJc29sYXRlOwogfQogCi1zdGF0aWMgdjg6Okdsb2JhbDx2ODo6T2JqZWN0VGVtcGxhdGU+JiBfZ2V0R2xvYmFsT2JqZWN0VGVtcGxhdGUoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUpCi17Ci0Jdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSAodjg6Oklzb2xhdGUqKXBKU1J1bnRpbWU7Ci0Jdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7Ci0Jdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShpc29sYXRlKTsKK3ZvaWQgRlhKU19SZWxlYXNlKCkgeworICBBU1NFUlQoIWdfaXNvbGF0ZSB8fCBnX2lzb2xhdGVfcmVmX2NvdW50ID09IDApOworICBkZWxldGUgZ19EZWZhdWx0R2xvYmFsT2JqZWN0VGVtcGxhdGU7CisgIGdfRGVmYXVsdEdsb2JhbE9iamVjdFRlbXBsYXRlID0gbnVsbHB0cjsKKyAgZ19pc29sYXRlID0gbnVsbHB0cjsKIAotCUNGWF9QdHJBcnJheSogcEFycmF5ID0gKENGWF9QdHJBcnJheSopaXNvbGF0ZS0+R2V0RGF0YSgwKTsKLQlBU1NFUlQocEFycmF5ICE9IE5VTEwpOwotCWZvcihpbnQgaT0wOyBpPHBBcnJheS0+R2V0U2l6ZSgpOyBpKyspCi0JewotCQlDSlNfT2JqRGVmaW50aW9uKiBwT2JqRGVmID0gKENKU19PYmpEZWZpbnRpb24qKXBBcnJheS0+R2V0QXQoaSk7Ci0JCWlmKHBPYmpEZWYtPm1fYlNldEFzR2xvYmFsT2JqZWN0KQotCQkJcmV0dXJuIHBPYmpEZWYtPm1fb2JqVGVtcGxhdGU7Ci0JfQotCXN0YXRpYyB2ODo6R2xvYmFsPHY4OjpPYmplY3RUZW1wbGF0ZT4gZ2xvYWJhbE9iamVjdFRlbXBsYXRlOwotCXJldHVybiBnbG9hYmFsT2JqZWN0VGVtcGxhdGU7CisgIGRlbGV0ZSBnX2FycmF5QnVmZmVyQWxsb2NhdG9yOworICBnX2FycmF5QnVmZmVyQWxsb2NhdG9yID0gbnVsbHB0cjsKIH0KIAotaW50IEpTX0RlZmluZUdsb2JhbE1ldGhvZChJSlNfUnVudGltZSogcEpTUnVudGltZSwgY29uc3Qgd2NoYXJfdCogc01ldGhvZE5hbWUsIHY4OjpGdW5jdGlvbkNhbGxiYWNrIHBNZXRob2RDYWxsKQotewotCXY4OjpJc29sYXRlKiBpc29sYXRlID0gKHY4OjpJc29sYXRlKilwSlNSdW50aW1lOwotCXY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKGlzb2xhdGUpOwotCXY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoaXNvbGF0ZSk7Ci0KLQlDRlhfV2lkZVN0cmluZyB3cyA9IENGWF9XaWRlU3RyaW5nKHNNZXRob2ROYW1lKTsKLQlDRlhfQnl0ZVN0cmluZyBic01ldGhvZE5hbWUgPSB3cy5VVEY4RW5jb2RlKCk7Ci0KLQl2ODo6TG9jYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IGZ1blRlbXBsID0gdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhpc29sYXRlLCBwTWV0aG9kQ2FsbCk7Ci0Jdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gb2JqVGVtcDsKLQotCXY4OjpHbG9iYWw8djg6Ok9iamVjdFRlbXBsYXRlPiYgZ2xvYmFsT2JqVGVtcCA9IF9nZXRHbG9iYWxPYmplY3RUZW1wbGF0ZShwSlNSdW50aW1lKTsKLQlpZihnbG9iYWxPYmpUZW1wLklzRW1wdHkoKSkKLQkJb2JqVGVtcCA9IHY4OjpPYmplY3RUZW1wbGF0ZTo6TmV3KGlzb2xhdGUpOwotCWVsc2UKLQkJb2JqVGVtcCA9IHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+OjpOZXcoaXNvbGF0ZSwgZ2xvYmFsT2JqVGVtcCk7Ci0Jb2JqVGVtcC0+U2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KGlzb2xhdGUsIEZYX0xQQ1NUUihic01ldGhvZE5hbWUpLCB2ODo6TmV3U3RyaW5nVHlwZTo6a05vcm1hbCkuVG9Mb2NhbENoZWNrZWQoKSwgZnVuVGVtcGwsIHY4OjpSZWFkT25seSk7Ci0KLQlnbG9iYWxPYmpUZW1wLlJlc2V0KGlzb2xhdGUsb2JqVGVtcCk7Ci0KLQlyZXR1cm4gMDsKK2Jvb2wgRlhKU19HZXRJc29sYXRlKHY4OjpJc29sYXRlKiogcFJlc3VsdElzb2xhdGUpIHsKKyAgaWYgKGdfaXNvbGF0ZSkgeworICAgICpwUmVzdWx0SXNvbGF0ZSA9IGdfaXNvbGF0ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gUHJvdmlkZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aGVuIG5vIGV4dGVybmFsIGlzb2xhdGUuCisgIGlmICghZ19hcnJheUJ1ZmZlckFsbG9jYXRvcikKKyAgICBnX2FycmF5QnVmZmVyQWxsb2NhdG9yID0gbmV3IEZYSlNfQXJyYXlCdWZmZXJBbGxvY2F0b3IoKTsKKyAgdjg6Oklzb2xhdGU6OkNyZWF0ZVBhcmFtcyBwYXJhbXM7CisgIHBhcmFtcy5hcnJheV9idWZmZXJfYWxsb2NhdG9yID0gZ19hcnJheUJ1ZmZlckFsbG9jYXRvcjsKKyAgKnBSZXN1bHRJc29sYXRlID0gdjg6Oklzb2xhdGU6Ok5ldyhwYXJhbXMpOworICByZXR1cm4gdHJ1ZTsKIH0KIAotaW50IEpTX0RlZmluZUdsb2JhbENvbnN0KElKU19SdW50aW1lKiBwSlNSdW50aW1lLCBjb25zdCB3Y2hhcl90KiBzQ29uc3ROYW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBwRGVmYXVsdCkKLXsKLQl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9ICh2ODo6SXNvbGF0ZSopcEpTUnVudGltZTsKLQl2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShpc29sYXRlKTsKLQl2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKGlzb2xhdGUpOwotCi0JQ0ZYX1dpZGVTdHJpbmcgd3MgPSBDRlhfV2lkZVN0cmluZyhzQ29uc3ROYW1lKTsKLQlDRlhfQnl0ZVN0cmluZyBic0NvbnN0PSB3cy5VVEY4RW5jb2RlKCk7Ci0KLQl2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBvYmpUZW1wOwotCi0Jdjg6Okdsb2JhbDx2ODo6T2JqZWN0VGVtcGxhdGU+JiBnbG9iYWxPYmpUZW1wID0gX2dldEdsb2JhbE9iamVjdFRlbXBsYXRlKHBKU1J1bnRpbWUpOwotCWlmKGdsb2JhbE9ialRlbXAuSXNFbXB0eSgpKQotCQlvYmpUZW1wID0gdjg6Ok9iamVjdFRlbXBsYXRlOjpOZXcoaXNvbGF0ZSk7Ci0JZWxzZQotCQlvYmpUZW1wID0gdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT46Ok5ldyhpc29sYXRlLCBnbG9iYWxPYmpUZW1wKTsKLQlvYmpUZW1wLT5TZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgoaXNvbGF0ZSwgRlhfTFBDU1RSKGJzQ29uc3QpLCB2ODo6TmV3U3RyaW5nVHlwZTo6a05vcm1hbCkuVG9Mb2NhbENoZWNrZWQoKSwgcERlZmF1bHQsIHY4OjpSZWFkT25seSk7Ci0KLQlnbG9iYWxPYmpUZW1wLlJlc2V0KGlzb2xhdGUsb2JqVGVtcCk7Ci0KLQlyZXR1cm4gMDsKK3NpemVfdCBGWEpTX0dsb2JhbElzb2xhdGVSZWZDb3VudCgpIHsKKyAgcmV0dXJuIGdfaXNvbGF0ZV9yZWZfY291bnQ7CiB9CiAKLQotdm9pZCBKU19Jbml0aWFsUnVudGltZShJSlNfUnVudGltZSogcEpTUnVudGltZSxJRlhKU19SdW50aW1lKiBwRlhSdW50aW1lLCBJRlhKU19Db250ZXh0KiBjb250ZXh0LCB2ODo6R2xvYmFsPHY4OjpDb250ZXh0PiYgdjhQZXJzaXN0ZW50Q29udGV4dCkKLXsKLQl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9ICh2ODo6SXNvbGF0ZSopcEpTUnVudGltZTsKLQl2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShpc29sYXRlKTsKLQl2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKGlzb2xhdGUpOwotCi0Jdjg6Okdsb2JhbDx2ODo6T2JqZWN0VGVtcGxhdGU+JiBnbG9iYWxPYmpUZW1wID0gX2dldEdsb2JhbE9iamVjdFRlbXBsYXRlKHBKU1J1bnRpbWUpOwotCXY4OjpMb2NhbDx2ODo6Q29udGV4dD4gdjhDb250ZXh0ID0gdjg6OkNvbnRleHQ6Ok5ldyhpc29sYXRlLCBOVUxMLCB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPjo6TmV3KGlzb2xhdGUsIGdsb2JhbE9ialRlbXApKTsKLQl2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dF9zY29wZSh2OENvbnRleHQpOwotCi0Jdjg6OkxvY2FsPHY4OjpFeHRlcm5hbD4gcHRyID0gdjg6OkV4dGVybmFsOjpOZXcoaXNvbGF0ZSwgcEZYUnVudGltZSk7Ci0JdjhDb250ZXh0LT5TZXRFbWJlZGRlckRhdGEoMSwgcHRyKTsKLQotCUNGWF9QdHJBcnJheSogcEFycmF5ID0gKENGWF9QdHJBcnJheSopaXNvbGF0ZS0+R2V0RGF0YSgwKTsKLQlpZighcEFycmF5KSByZXR1cm47Ci0KLQlmb3IoaW50IGk9MDsgaTxwQXJyYXktPkdldFNpemUoKTsgaSsrKQotCXsKLQkJQ0pTX09iakRlZmludGlvbiogcE9iakRlZiA9IChDSlNfT2JqRGVmaW50aW9uKilwQXJyYXktPkdldEF0KGkpOwotCQlDRlhfV2lkZVN0cmluZyB3cyA9IENGWF9XaWRlU3RyaW5nKHBPYmpEZWYtPm9iak5hbWUpOwotCQlDRlhfQnl0ZVN0cmluZyBicyA9IHdzLlVURjhFbmNvZGUoKTsKLQkJdjg6OkxvY2FsPHY4OjpTdHJpbmc+IG9iak5hbWUgPSB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChpc29sYXRlLCBicy5jX3N0cigpLCB2ODo6TmV3U3RyaW5nVHlwZTo6a05vcm1hbCwgYnMuR2V0TGVuZ3RoKCkpLlRvTG9jYWxDaGVja2VkKCk7Ci0KLQotCQlpZihwT2JqRGVmLT5vYmpUeXBlID09IEpTX0RZTkFNSUMpCi0JCXsKLQkJCS8vRG9jdW1lbnQgaXMgc2V0IGFzIGdsb2JhbCBvYmplY3QsIG5lZWQgdG8gY29uc3RydWN0IGl0IGZpcnN0LgotCQkJaWYod3MuRXF1YWwoTCJEb2N1bWVudCIpKQotCQkJewotCi0JCQkJQ0pTX1ByaXZhdGVEYXRhKiBwUHJpdmF0ZURhdGEgPSBuZXcgQ0pTX1ByaXZhdGVEYXRhOwotCQkJCXBQcml2YXRlRGF0YS0+T2JqRGVmSUQgPSBpOwotCi0JCQkJdjhDb250ZXh0LT5HbG9iYWwoKS0+R2V0UHJvdG90eXBlKCktPlRvT2JqZWN0KHY4Q29udGV4dCkuVG9Mb2NhbENoZWNrZWQoKS0+U2V0QWxpZ25lZFBvaW50ZXJJbkludGVybmFsRmllbGQoMCwgcFByaXZhdGVEYXRhKTsKLQotCQkJCWlmKHBPYmpEZWYtPm1fcENvbnN0cnVjdG9yKQotCQkJCQlwT2JqRGVmLT5tX3BDb25zdHJ1Y3Rvcihjb250ZXh0LCB2OENvbnRleHQtPkdsb2JhbCgpLT5HZXRQcm90b3R5cGUoKS0+VG9PYmplY3QodjhDb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpLCB2OENvbnRleHQtPkdsb2JhbCgpLT5HZXRQcm90b3R5cGUoKS0+VG9PYmplY3QodjhDb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpKTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCXY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmogPSBKU19OZXdGeER5bmFtaWNPYmoocEpTUnVudGltZSwgY29udGV4dCwgaSk7Ci0JCQl2OENvbnRleHQtPkdsb2JhbCgpLT5TZXQodjhDb250ZXh0LCBvYmpOYW1lLCBvYmopLkZyb21KdXN0KCk7Ci0JCQlwT2JqRGVmLT5tX1N0YXRpY09iai5SZXNldChpc29sYXRlLCBvYmopOwotCQl9Ci0JfQotCXY4UGVyc2lzdGVudENvbnRleHQuUmVzZXQoaXNvbGF0ZSwgdjhDb250ZXh0KTsKKy8vIHN0YXRpYwordm9pZCBGWEpTX1Blcklzb2xhdGVEYXRhOjpTZXRVcCh2ODo6SXNvbGF0ZSogcElzb2xhdGUpIHsKKyAgaWYgKCFwSXNvbGF0ZS0+R2V0RGF0YShnX2VtYmVkZGVyRGF0YVNsb3QpKQorICAgIHBJc29sYXRlLT5TZXREYXRhKGdfZW1iZWRkZXJEYXRhU2xvdCwgbmV3IEZYSlNfUGVySXNvbGF0ZURhdGEoKSk7CiB9CiAKLXZvaWQgSlNfUmVsZWFzZVJ1bnRpbWUoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIHY4OjpHbG9iYWw8djg6OkNvbnRleHQ+JiB2OFBlcnNpc3RlbnRDb250ZXh0KQotewotCXY4OjpJc29sYXRlKiBpc29sYXRlID0gKHY4OjpJc29sYXRlKilwSlNSdW50aW1lOwotCXY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKGlzb2xhdGUpOwotCXY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoaXNvbGF0ZSk7Ci0Jdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gdjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KGlzb2xhdGUsIHY4UGVyc2lzdGVudENvbnRleHQpOwotCXY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0X3Njb3BlKGNvbnRleHQpOwotCi0JQ0ZYX1B0ckFycmF5KiBwQXJyYXkgPSAoQ0ZYX1B0ckFycmF5Kilpc29sYXRlLT5HZXREYXRhKDApOwotCWlmKCFwQXJyYXkpIHJldHVybiA7Ci0KLQlmb3IoaW50IGk9MDsgaTxwQXJyYXktPkdldFNpemUoKTsgaSsrKQotCXsKLQkJQ0pTX09iakRlZmludGlvbiogcE9iakRlZiA9IChDSlNfT2JqRGVmaW50aW9uKilwQXJyYXktPkdldEF0KGkpOwotCQlpZighcE9iakRlZi0+bV9TdGF0aWNPYmouSXNFbXB0eSgpKQotCQl7Ci0JCQl2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiA9IHY4OjpMb2NhbDx2ODo6T2JqZWN0Pjo6TmV3KGlzb2xhdGUsIHBPYmpEZWYtPm1fU3RhdGljT2JqKTsKLQkJCWlmKHBPYmpEZWYtPm1fcERlc3RydWN0b3IpCi0JCQkJcE9iakRlZi0+bV9wRGVzdHJ1Y3RvcihwT2JqKTsKLQkJCUpTX0ZyZWVQcml2YXRlKHBPYmopOwotCQl9Ci0JCWRlbGV0ZSBwT2JqRGVmOwotCX0KLQlkZWxldGUgcEFycmF5OwotCWlzb2xhdGUtPlNldERhdGEoMCxOVUxMKTsKKy8vIHN0YXRpYworRlhKU19QZXJJc29sYXRlRGF0YSogRlhKU19QZXJJc29sYXRlRGF0YTo6R2V0KHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8RlhKU19QZXJJc29sYXRlRGF0YSo+KAorICAgICAgcElzb2xhdGUtPkdldERhdGEoZ19lbWJlZGRlckRhdGFTbG90KSk7CiB9CiAKLXZvaWQgSlNfSW5pdGlhbCgpIAotewotfQotdm9pZCBKU19SZWxlYXNlKCkKLXsKK2ludCBGWEpTX0RlZmluZU9iaih2ODo6SXNvbGF0ZSogcElzb2xhdGUsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogc09iak5hbWUsCisgICAgICAgICAgICAgICAgICAgRlhKU09CSlRZUEUgZU9ialR5cGUsCisgICAgICAgICAgICAgICAgICAgRlhKU19DT05TVFJVQ1RPUiBwQ29uc3RydWN0b3IsCisgICAgICAgICAgICAgICAgICAgRlhKU19ERVNUUlVDVE9SIHBEZXN0cnVjdG9yKSB7CisgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKHBJc29sYXRlKTsKKyAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShwSXNvbGF0ZSk7CiAKKyAgRlhKU19QZXJJc29sYXRlRGF0YTo6U2V0VXAocElzb2xhdGUpOworICBDRlhKU19PYmpEZWZpbml0aW9uKiBwT2JqRGVmID0gbmV3IENGWEpTX09iakRlZmluaXRpb24oCisgICAgICBwSXNvbGF0ZSwgc09iak5hbWUsIGVPYmpUeXBlLCBwQ29uc3RydWN0b3IsIHBEZXN0cnVjdG9yKTsKKyAgcmV0dXJuIHBPYmpEZWYtPkFzc2lnbklEKCk7CiB9Ci1pbnQgSlNfUGFyc2UoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIElGWEpTX0NvbnRleHQqIHBKU0NvbnRleHQsIGNvbnN0IHdjaGFyX3QqIHNjcmlwdCwgbG9uZyBsZW5ndGgsIEZYSlNFcnIqIHBlcnJvcikKLXsKLQl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9ICh2ODo6SXNvbGF0ZSopcEpTUnVudGltZTsKLQl2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShpc29sYXRlKTsKLQl2ODo6VHJ5Q2F0Y2ggdHJ5X2NhdGNoKGlzb2xhdGUpOwogCi0JQ0ZYX1dpZGVTdHJpbmcgd3NTY3JpcHQoc2NyaXB0KTsKLQlDRlhfQnl0ZVN0cmluZyBic1NjcmlwdCA9IHdzU2NyaXB0LlVURjhFbmNvZGUoKTsKLQotCi0gICAgICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IGlzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCk7Ci0Jdjg6OkxvY2FsPHY4OjpTY3JpcHQ+IGNvbXBpbGVkX3NjcmlwdDsKLSAgICAgICAgaWYgKCF2ODo6U2NyaXB0OjpDb21waWxlKGNvbnRleHQsIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KGlzb2xhdGUsIGJzU2NyaXB0LmNfc3RyKCksIHY4OjpOZXdTdHJpbmdUeXBlOjprTm9ybWFsLCBic1NjcmlwdC5HZXRMZW5ndGgoKSkuVG9Mb2NhbENoZWNrZWQoKSkuVG9Mb2NhbCgmY29tcGlsZWRfc2NyaXB0KSkgewotCQl2ODo6U3RyaW5nOjpVdGY4VmFsdWUgZXJyb3IodHJ5X2NhdGNoLkV4Y2VwdGlvbigpKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKK3ZvaWQgRlhKU19EZWZpbmVPYmpNZXRob2Qodjg6Oklzb2xhdGUqIHBJc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbk9iakRlZm5JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogc01ldGhvZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpGdW5jdGlvbkNhbGxiYWNrIHBNZXRob2RDYWxsKSB7CisgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKHBJc29sYXRlKTsKKyAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShwSXNvbGF0ZSk7CisgIENGWF9CeXRlU3RyaW5nIGJzTWV0aG9kTmFtZSA9IENGWF9XaWRlU3RyaW5nKHNNZXRob2ROYW1lKS5VVEY4RW5jb2RlKCk7CisgIENGWEpTX09iakRlZmluaXRpb24qIHBPYmpEZWYgPQorICAgICAgQ0ZYSlNfT2JqRGVmaW5pdGlvbjo6Rm9ySUQocElzb2xhdGUsIG5PYmpEZWZuSUQpOworICBwT2JqRGVmLT5HZXRJbnN0YW5jZVRlbXBsYXRlKCktPlNldCgKKyAgICAgIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCBic01ldGhvZE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpOZXdTdHJpbmdUeXBlOjprTm9ybWFsKS5Ub0xvY2FsQ2hlY2tlZCgpLAorICAgICAgdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhwSXNvbGF0ZSwgcE1ldGhvZENhbGwsIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmpEZWYtPkdldFNpZ25hdHVyZSgpKSwKKyAgICAgIHY4OjpSZWFkT25seSk7CiB9CiAKLWludCBKU19FeGVjdXRlKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCBJRlhKU19Db250ZXh0KiBwSlNDb250ZXh0LCBjb25zdCB3Y2hhcl90KiBzY3JpcHQsIGxvbmcgbGVuZ3RoLCBGWEpTRXJyKiBwZXJyb3IpCi17Ci0Jdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSAodjg6Oklzb2xhdGUqKXBKU1J1bnRpbWU7Ci0Jdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7Ci0Jdjg6OlRyeUNhdGNoIHRyeV9jYXRjaChpc29sYXRlKTsKLQotCUNGWF9XaWRlU3RyaW5nIHdzU2NyaXB0KHNjcmlwdCk7Ci0JQ0ZYX0J5dGVTdHJpbmcgYnNTY3JpcHQgPSB3c1NjcmlwdC5VVEY4RW5jb2RlKCk7Ci0KLSAgICAgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gaXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKTsKLSAgICAgICAgdjg6OkxvY2FsPHY4OjpTY3JpcHQ+IGNvbXBpbGVkX3NjcmlwdDsKLSAgICAgICAgaWYgKCF2ODo6U2NyaXB0OjpDb21waWxlKGNvbnRleHQsIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KGlzb2xhdGUsIGJzU2NyaXB0LmNfc3RyKCksIHY4OjpOZXdTdHJpbmdUeXBlOjprTm9ybWFsLCBic1NjcmlwdC5HZXRMZW5ndGgoKSkuVG9Mb2NhbENoZWNrZWQoKSkuVG9Mb2NhbCgmY29tcGlsZWRfc2NyaXB0KSkgewotCQl2ODo6U3RyaW5nOjpVdGY4VmFsdWUgZXJyb3IodHJ5X2NhdGNoLkV4Y2VwdGlvbigpKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXY4OjpMb2NhbDx2ODo6VmFsdWU+IHJlc3VsdDsKLSAgICAgICAgaWYgKCFjb21waWxlZF9zY3JpcHQtPlJ1bihjb250ZXh0KS5Ub0xvY2FsKCZyZXN1bHQpKSB7Ci0JCXY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBlcnJvcih0cnlfY2F0Y2guRXhjZXB0aW9uKCkpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOwordm9pZCBGWEpTX0RlZmluZU9ialByb3BlcnR5KHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbk9iakRlZm5JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzUHJvcE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkFjY2Vzc29yR2V0dGVyQ2FsbGJhY2sgcFByb3BHZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkFjY2Vzc29yU2V0dGVyQ2FsbGJhY2sgcFByb3BQdXQpIHsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUocElzb2xhdGUpOworICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKHBJc29sYXRlKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnNQcm9wZXJ0eU5hbWUgPSBDRlhfV2lkZVN0cmluZyhzUHJvcE5hbWUpLlVURjhFbmNvZGUoKTsKKyAgQ0ZYSlNfT2JqRGVmaW5pdGlvbiogcE9iakRlZiA9CisgICAgICBDRlhKU19PYmpEZWZpbml0aW9uOjpGb3JJRChwSXNvbGF0ZSwgbk9iakRlZm5JRCk7CisgIHBPYmpEZWYtPkdldEluc3RhbmNlVGVtcGxhdGUoKS0+U2V0QWNjZXNzb3IoCisgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgYnNQcm9wZXJ0eU5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpOZXdTdHJpbmdUeXBlOjprTm9ybWFsKS5Ub0xvY2FsQ2hlY2tlZCgpLAorICAgICAgcFByb3BHZXQsIHBQcm9wUHV0KTsKIH0KIAotdjg6OkxvY2FsPHY4OjpPYmplY3Q+IEpTX05ld0Z4RHluYW1pY09iaihJSlNfUnVudGltZSogcEpTUnVudGltZSwgSUZYSlNfQ29udGV4dCogcEpTQ29udGV4dCwgaW50IG5PYmpEZWZuSUQpCi17Ci0Jdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSAodjg6Oklzb2xhdGUqKXBKU1J1bnRpbWU7Ci0Jdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSk7Ci0gICAgICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IGlzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCk7Ci0JaWYoLTEgPT0gbk9iakRlZm5JRCkKLQl7Ci0JCXY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IG9ialRlbXBsID0gdjg6Ok9iamVjdFRlbXBsYXRlOjpOZXcoaXNvbGF0ZSk7Ci0gICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iajsKLSAgICAgICAgICAgICAgICBpZiAob2JqVGVtcGwtPk5ld0luc3RhbmNlKGNvbnRleHQpLlRvTG9jYWwoJm9iaikpIHJldHVybiBvYmo7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpOwotCX0KLQotCUNGWF9QdHJBcnJheSogcEFycmF5ID0gKENGWF9QdHJBcnJheSopaXNvbGF0ZS0+R2V0RGF0YSgwKTsKLQlpZighcEFycmF5KSByZXR1cm4gdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCk7Ci0KLQotCWlmKG5PYmpEZWZuSUQ8MCB8fCBuT2JqRGVmbklEPj0gcEFycmF5LT5HZXRTaXplKCkpIHJldHVybiB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKTsKLQlDSlNfT2JqRGVmaW50aW9uKiBwT2JqRGVmID0gKENKU19PYmpEZWZpbnRpb24qKXBBcnJheS0+R2V0QXQobk9iakRlZm5JRCk7Ci0KLQl2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBvYmpUZW1wID0gdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT46Ok5ldyhpc29sYXRlLCBwT2JqRGVmLT5tX29ialRlbXBsYXRlKTsKLQl2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqOwotICAgICAgICBpZiAoIW9ialRlbXAtPk5ld0luc3RhbmNlKGNvbnRleHQpLlRvTG9jYWwoJm9iaikpIHJldHVybiB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKTsKLQotCUNKU19Qcml2YXRlRGF0YSogcFByaXZhdGVEYXRhID0gbmV3IENKU19Qcml2YXRlRGF0YTsKLQlwUHJpdmF0ZURhdGEtPk9iakRlZklEID0gbk9iakRlZm5JRDsKLQotCW9iai0+U2V0QWxpZ25lZFBvaW50ZXJJbkludGVybmFsRmllbGQoMCwgcFByaXZhdGVEYXRhKTsKLQlpZihwT2JqRGVmLT5tX3BDb25zdHJ1Y3RvcikKLQkJcE9iakRlZi0+bV9wQ29uc3RydWN0b3IocEpTQ29udGV4dCwgb2JqLCBjb250ZXh0LT5HbG9iYWwoKS0+R2V0UHJvdG90eXBlKCktPlRvT2JqZWN0KGNvbnRleHQpLlRvTG9jYWxDaGVja2VkKCkpOwotCi0JcmV0dXJuIG9iajsKK3ZvaWQgRlhKU19EZWZpbmVPYmpBbGxQcm9wZXJ0aWVzKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuT2JqRGVmbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5hbWVkUHJvcGVydHlRdWVyeUNhbGxiYWNrIHBQcm9wUXVyZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TmFtZWRQcm9wZXJ0eUdldHRlckNhbGxiYWNrIHBQcm9wR2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5hbWVkUHJvcGVydHlTZXR0ZXJDYWxsYmFjayBwUHJvcFB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpOYW1lZFByb3BlcnR5RGVsZXRlckNhbGxiYWNrIHBQcm9wRGVsKSB7CisgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKHBJc29sYXRlKTsKKyAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShwSXNvbGF0ZSk7CisgIENGWEpTX09iakRlZmluaXRpb24qIHBPYmpEZWYgPQorICAgICAgQ0ZYSlNfT2JqRGVmaW5pdGlvbjo6Rm9ySUQocElzb2xhdGUsIG5PYmpEZWZuSUQpOworICBwT2JqRGVmLT5HZXRJbnN0YW5jZVRlbXBsYXRlKCktPlNldE5hbWVkUHJvcGVydHlIYW5kbGVyKHBQcm9wR2V0LCBwUHJvcFB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvcFF1cmV5LCBwUHJvcERlbCk7CiB9CiAKLXY4OjpMb2NhbDx2ODo6T2JqZWN0PiBKU19HZXRTdGF0aWNPYmooSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIGludCBuT2JqRGVmbklEKQotewotCXY4OjpJc29sYXRlKiBpc29sYXRlID0gKHY4OjpJc29sYXRlKilwSlNSdW50aW1lOwotCXY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKGlzb2xhdGUpOwotCi0JQ0ZYX1B0ckFycmF5KiBwQXJyYXkgPSAoQ0ZYX1B0ckFycmF5Kilpc29sYXRlLT5HZXREYXRhKDApOwotCWlmKCFwQXJyYXkpIHJldHVybiB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKTsKLQotCWlmKG5PYmpEZWZuSUQ8MCB8fCBuT2JqRGVmbklEPj0gcEFycmF5LT5HZXRTaXplKCkpIHJldHVybiB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKTsKLQlDSlNfT2JqRGVmaW50aW9uKiBwT2JqRGVmID0gKENKU19PYmpEZWZpbnRpb24qKXBBcnJheS0+R2V0QXQobk9iakRlZm5JRCk7Ci0Jdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iaiA9IHY4OjpMb2NhbDx2ODo6T2JqZWN0Pjo6TmV3KGlzb2xhdGUscE9iakRlZi0+bV9TdGF0aWNPYmopOwotCXJldHVybiBvYmo7Cit2b2lkIEZYSlNfRGVmaW5lT2JqQ29uc3Qodjg6Oklzb2xhdGUqIHBJc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuT2JqRGVmbklELAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHNDb25zdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcERlZmF1bHQpIHsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUocElzb2xhdGUpOworICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKHBJc29sYXRlKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnNDb25zdE5hbWUgPSBDRlhfV2lkZVN0cmluZyhzQ29uc3ROYW1lKS5VVEY4RW5jb2RlKCk7CisgIENGWEpTX09iakRlZmluaXRpb24qIHBPYmpEZWYgPQorICAgICAgQ0ZYSlNfT2JqRGVmaW5pdGlvbjo6Rm9ySUQocElzb2xhdGUsIG5PYmpEZWZuSUQpOworICBwT2JqRGVmLT5HZXRJbnN0YW5jZVRlbXBsYXRlKCktPlNldChwSXNvbGF0ZSwgYnNDb25zdE5hbWUuY19zdHIoKSwgcERlZmF1bHQpOwogfQogCi12b2lkIEpTX1NldFRoaXNPYmooSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIGludCBuVGhpc09iaklEKQotewotCS8vRG8gbm90aGluZy4KK3ZvaWQgRlhKU19EZWZpbmVHbG9iYWxNZXRob2Qodjg6Oklzb2xhdGUqIHBJc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBzTWV0aG9kTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkZ1bmN0aW9uQ2FsbGJhY2sgcE1ldGhvZENhbGwpIHsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUocElzb2xhdGUpOworICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKHBJc29sYXRlKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnNNZXRob2ROYW1lID0gQ0ZYX1dpZGVTdHJpbmcoc01ldGhvZE5hbWUpLlVURjhFbmNvZGUoKTsKKyAgR2V0R2xvYmFsT2JqZWN0VGVtcGxhdGUocElzb2xhdGUpLT5TZXQoCisgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgYnNNZXRob2ROYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TmV3U3RyaW5nVHlwZTo6a05vcm1hbCkuVG9Mb2NhbENoZWNrZWQoKSwKKyAgICAgIHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcocElzb2xhdGUsIHBNZXRob2RDYWxsKSwgdjg6OlJlYWRPbmx5KTsKIH0KLXY4OjpMb2NhbDx2ODo6T2JqZWN0PglKU19HZXRUaGlzT2JqKElKU19SdW50aW1lICogcEpTUnVudGltZSkKLXsKLQkvL1JldHVybiB0aGUgZ2xvYmFsIG9iamVjdC4KLQl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9ICh2ODo6SXNvbGF0ZSopcEpTUnVudGltZTsKLQl2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShpc29sYXRlKTsKLQotCUNGWF9QdHJBcnJheSogcEFycmF5ID0gKENGWF9QdHJBcnJheSopaXNvbGF0ZS0+R2V0RGF0YSgwKTsKLQlpZighcEFycmF5KSByZXR1cm4gdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCk7CiAKLQl2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBpc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOwotCXJldHVybiBjb250ZXh0LT5HbG9iYWwoKS0+R2V0UHJvdG90eXBlKCktPlRvT2JqZWN0KGNvbnRleHQpLlRvTG9jYWxDaGVja2VkKCk7Cit2b2lkIEZYSlNfRGVmaW5lR2xvYmFsQ29uc3Qodjg6Oklzb2xhdGUqIHBJc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHNDb25zdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcERlZmF1bHQpIHsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUocElzb2xhdGUpOworICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKHBJc29sYXRlKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgYnNDb25zdCA9IENGWF9XaWRlU3RyaW5nKHNDb25zdE5hbWUpLlVURjhFbmNvZGUoKTsKKyAgR2V0R2xvYmFsT2JqZWN0VGVtcGxhdGUocElzb2xhdGUpLT5TZXQoCisgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgYnNDb25zdC5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5ld1N0cmluZ1R5cGU6OmtOb3JtYWwpLlRvTG9jYWxDaGVja2VkKCksCisgICAgICBwRGVmYXVsdCwgdjg6OlJlYWRPbmx5KTsKIH0KIAotaW50CUpTX0dldE9iakRlZm5JRCh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaikKLXsKLQlpZihwT2JqLklzRW1wdHkoKSB8fCAhcE9iai0+SW50ZXJuYWxGaWVsZENvdW50KCkpIHJldHVybiAtMTsKLQlDSlNfUHJpdmF0ZURhdGEqIHBQcml2YXRlRGF0YSA9IChDSlNfUHJpdmF0ZURhdGEqKXBPYmotPkdldEFsaWduZWRQb2ludGVyRnJvbUludGVybmFsRmllbGQoMCk7Ci0JaWYocFByaXZhdGVEYXRhKQotCQlyZXR1cm4gcFByaXZhdGVEYXRhLT5PYmpEZWZJRDsKLQlyZXR1cm4gLTE7Ci19Cit2b2lkIEZYSlNfSW5pdGlhbGl6ZVJ1bnRpbWUoCisgICAgdjg6Oklzb2xhdGUqIHBJc29sYXRlLAorICAgIElKU19SdW50aW1lKiBwSVJ1bnRpbWUsCisgICAgdjg6Okdsb2JhbDx2ODo6Q29udGV4dD4qIHBWOFBlcnNpc3RlbnRDb250ZXh0LAorICAgIHN0ZDo6dmVjdG9yPHY4OjpHbG9iYWw8djg6Ok9iamVjdD4qPiogcFN0YXRpY09iamVjdHMpIHsKKyAgaWYgKHBJc29sYXRlID09IGdfaXNvbGF0ZSkKKyAgICArK2dfaXNvbGF0ZV9yZWZfY291bnQ7CiAKLUlKU19SdW50aW1lKiBKU19HZXRSdW50aW1lKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqKQotewotCWlmKHBPYmouSXNFbXB0eSgpKSByZXR1cm4gTlVMTDsKLQl2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBwT2JqLT5DcmVhdGlvbkNvbnRleHQoKTsKLQlpZihjb250ZXh0LklzRW1wdHkoKSkgcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGNvbnRleHQtPkdldElzb2xhdGUoKTsKLX0KKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUocElzb2xhdGUpOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIHY4OjpMb2NrZXIgbG9ja2VyKHBJc29sYXRlKTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShwSXNvbGF0ZSk7CisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gdjhDb250ZXh0ID0KKyAgICAgIHY4OjpDb250ZXh0OjpOZXcocElzb2xhdGUsIE5VTEwsIEdldEdsb2JhbE9iamVjdFRlbXBsYXRlKHBJc29sYXRlKSk7CisgIHY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0X3Njb3BlKHY4Q29udGV4dCk7CiAKLWludCBKU19HZXRPYmpEZWZuSUQoSUpTX1J1bnRpbWUgKiBwSlNSdW50aW1lLCBjb25zdCB3Y2hhcl90KiBwT2JqTmFtZSkKLXsKLQl2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9ICh2ODo6SXNvbGF0ZSopcEpTUnVudGltZTsKLQl2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShpc29sYXRlKTsKKyAgRlhKU19QZXJJc29sYXRlRGF0YTo6U2V0VXAocElzb2xhdGUpOworICB2OENvbnRleHQtPlNldEFsaWduZWRQb2ludGVySW5FbWJlZGRlckRhdGEoa1BlckNvbnRleHREYXRhSW5kZXgsIHBJUnVudGltZSk7CiAKLQlDRlhfUHRyQXJyYXkqIHBBcnJheSA9IChDRlhfUHRyQXJyYXkqKWlzb2xhdGUtPkdldERhdGEoMCk7Ci0JaWYoIXBBcnJheSkgcmV0dXJuIC0xOworICBpbnQgbWF4SUQgPSBDRlhKU19PYmpEZWZpbml0aW9uOjpNYXhJRChwSXNvbGF0ZSk7CisgIHBTdGF0aWNPYmplY3RzLT5yZXNpemUobWF4SUQgKyAxKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhJRDsgKytpKSB7CisgICAgQ0ZYSlNfT2JqRGVmaW5pdGlvbiogcE9iakRlZiA9IENGWEpTX09iakRlZmluaXRpb246OkZvcklEKHBJc29sYXRlLCBpKTsKKyAgICBpZiAocE9iakRlZi0+bV9PYmpUeXBlID09IEZYSlNPQkpUWVBFX0dMT0JBTCkgeworICAgICAgdjhDb250ZXh0LT5HbG9iYWwoKQorICAgICAgICAgIC0+R2V0UHJvdG90eXBlKCkKKyAgICAgICAgICAtPlRvT2JqZWN0KHY4Q29udGV4dCkKKyAgICAgICAgICAuVG9Mb2NhbENoZWNrZWQoKQorICAgICAgICAgIC0+U2V0QWxpZ25lZFBvaW50ZXJJbkludGVybmFsRmllbGQoMCwgbmV3IENGWEpTX1Blck9iamVjdERhdGEoaSkpOwogCi0JZm9yKGludCBpPTA7IGk8cEFycmF5LT5HZXRTaXplKCk7IGkrKykKLQl7Ci0JCUNKU19PYmpEZWZpbnRpb24qIHBPYmpEZWYgPSAoQ0pTX09iakRlZmludGlvbiopcEFycmF5LT5HZXRBdChpKTsKLQkJaWYoRlhTWVNfd2NzY21wKHBPYmpEZWYtPm9iak5hbWUsIHBPYmpOYW1lKSA9PSAwKQotCQkJcmV0dXJuIGk7Ci0JfQotCXJldHVybiAtMTsKLX0KKyAgICAgIGlmIChwT2JqRGVmLT5tX3BDb25zdHJ1Y3RvcikKKyAgICAgICAgcE9iakRlZi0+bV9wQ29uc3RydWN0b3IocElSdW50aW1lLCB2OENvbnRleHQtPkdsb2JhbCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0UHJvdG90eXBlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5Ub09iamVjdCh2OENvbnRleHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0xvY2FsQ2hlY2tlZCgpKTsKKyAgICB9IGVsc2UgaWYgKHBPYmpEZWYtPm1fT2JqVHlwZSA9PSBGWEpTT0JKVFlQRV9TVEFUSUMpIHsKKyAgICAgIENGWF9CeXRlU3RyaW5nIGJzID0gQ0ZYX1dpZGVTdHJpbmcocE9iakRlZi0+bV9PYmpOYW1lKS5VVEY4RW5jb2RlKCk7CisgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gbV9PYmpOYW1lID0KKyAgICAgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgYnMuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TmV3U3RyaW5nVHlwZTo6a05vcm1hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicy5HZXRMZW5ndGgoKSkuVG9Mb2NhbENoZWNrZWQoKTsKIAotdm9pZCBKU19FcnJvcih2ODo6SXNvbGF0ZSogaXNvbGF0ZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG1lc3NhZ2UpCi17Ci0gICAgLy8gQ29udmVyc2lvbiBmcm9tIHBkZml1bSdzIHdjaGFyX3Qgd2lkZS1zdHJpbmdzIHRvIHY4J3MgdWludDE2X3QKLSAgICAvLyB3aWRlLXN0cmluZ3MgaXNuJ3QgaGFuZGxlZCBieSB2OCwgc28gdXNlIFVURjggYXMgYSBjb21tb24KLSAgICAvLyBpbnRlcm1lZGlhdGUgZm9ybWF0LgotICAgIENGWF9CeXRlU3RyaW5nIHV0ZjhfbWVzc2FnZSA9IG1lc3NhZ2UuVVRGOEVuY29kZSgpOwotICAgIGlzb2xhdGUtPlRocm93RXhjZXB0aW9uKHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KGlzb2xhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRmOF9tZXNzYWdlLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5ld1N0cmluZ1R5cGU6OmtOb3JtYWwpLlRvTG9jYWxDaGVja2VkKCkpOworICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iaiA9IEZYSlNfTmV3RnhEeW5hbWljT2JqKHBJc29sYXRlLCBwSVJ1bnRpbWUsIGkpOworICAgICAgdjhDb250ZXh0LT5HbG9iYWwoKS0+U2V0KHY4Q29udGV4dCwgbV9PYmpOYW1lLCBvYmopLkZyb21KdXN0KCk7CisgICAgICBwU3RhdGljT2JqZWN0cy0+YXQoaSkgPSBuZXcgdjg6Okdsb2JhbDx2ODo6T2JqZWN0PihwSXNvbGF0ZSwgb2JqKTsKKyAgICB9CisgIH0KKyAgcFY4UGVyc2lzdGVudENvbnRleHQtPlJlc2V0KHBJc29sYXRlLCB2OENvbnRleHQpOwogfQogCi11bnNpZ25lZCBKU19DYWxjSGFzaChjb25zdCB3Y2hhcl90KiBtYWluLCB1bnNpZ25lZCBuTGVuKQotewotCXJldHVybiAodW5zaWduZWQpRlhfSGFzaENvZGVfU3RyaW5nX0dldFcobWFpbiwgbkxlbik7Ci19Cit2b2lkIEZYSlNfUmVsZWFzZVJ1bnRpbWUodjg6Oklzb2xhdGUqIHBJc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpHbG9iYWw8djg6OkNvbnRleHQ+KiBwVjhQZXJzaXN0ZW50Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx2ODo6R2xvYmFsPHY4OjpPYmplY3Q+Kj4qIHBTdGF0aWNPYmplY3RzKSB7CisgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKHBJc29sYXRlKTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICB2ODo6TG9ja2VyIGxvY2tlcihwSXNvbGF0ZSk7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUocElzb2xhdGUpOworICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPQorICAgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KHBJc29sYXRlLCAqcFY4UGVyc2lzdGVudENvbnRleHQpOworICB2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dF9zY29wZShjb250ZXh0KTsKIAotdW5zaWduZWQgSlNfQ2FsY0hhc2goY29uc3Qgd2NoYXJfdCogbWFpbikKLXsKLQlyZXR1cm4gKHVuc2lnbmVkKUZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKG1haW4sIEZYU1lTX3djc2xlbihtYWluKSk7Ci19Ci1jb25zdCB3Y2hhcl90KglKU19HZXRUeXBlb2Yodjg6OkxvY2FsPHY4OjpWYWx1ZT4gcE9iaikKLXsKLQlpZihwT2JqLklzRW1wdHkoKSkgcmV0dXJuIE5VTEw7Ci0JaWYocE9iai0+SXNTdHJpbmcoKSkKLQkJcmV0dXJuIFZBTFVFX05BTUVfU1RSSU5HOwotCWlmKHBPYmotPklzTnVtYmVyKCkpCi0JCXJldHVybiBWQUxVRV9OQU1FX05VTUJFUjsKLQlpZihwT2JqLT5Jc0Jvb2xlYW4oKSkKLQkJcmV0dXJuIFZBTFVFX05BTUVfQk9PTEVBTjsKLQlpZihwT2JqLT5Jc0RhdGUoKSkKLQkJcmV0dXJuIFZBTFVFX05BTUVfREFURTsKLQlpZihwT2JqLT5Jc09iamVjdCgpKQotCQlyZXR1cm4gVkFMVUVfTkFNRV9PQkpFQ1Q7Ci0JaWYocE9iai0+SXNOdWxsKCkpCi0JCXJldHVybiBWQUxVRV9OQU1FX05VTEw7Ci0JaWYocE9iai0+SXNVbmRlZmluZWQoKSkKLQkJcmV0dXJuIFZBTFVFX05BTUVfVU5ERUZJTkVEOwotCXJldHVybiBOVUxMOworICBGWEpTX1Blcklzb2xhdGVEYXRhKiBwRGF0YSA9IEZYSlNfUGVySXNvbGF0ZURhdGE6OkdldChwSXNvbGF0ZSk7CisgIGlmICghcERhdGEpCisgICAgcmV0dXJuOwogCi19Ci12b2lkIEpTX1NldFByaXZhdGUodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosIHZvaWQqIHApCi17Ci0JSlNfU2V0UHJpdmF0ZShOVUxMLCBwT2JqLCBwKTsKLX0KKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICAvLyBYRkEsIGlmIHByZXNlbnQsIHNob3VsZCBoYXZlIGFscmVhZHkgY2xlYW5lZCBpdHNlbGYgdXAuCisgIEZYU1lTX2Fzc2VydCghcERhdGEtPm1fcEZYSlNFUnVudGltZURhdGEpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCi12b2lkKiBKU19HZXRQcml2YXRlKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqKQotewotCXJldHVybiBKU19HZXRQcml2YXRlKE5VTEwscE9iaik7Ci19CisgIGludCBtYXhJRCA9IENGWEpTX09iakRlZmluaXRpb246Ok1heElEKHBJc29sYXRlKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhJRDsgKytpKSB7CisgICAgQ0ZYSlNfT2JqRGVmaW5pdGlvbiogcE9iakRlZiA9IENGWEpTX09iakRlZmluaXRpb246OkZvcklEKHBJc29sYXRlLCBpKTsKKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iajsKKyAgICBpZiAocE9iakRlZi0+bV9PYmpUeXBlID09IEZYSlNPQkpUWVBFX0dMT0JBTCkgeworICAgICAgcE9iaiA9CisgICAgICAgICAgY29udGV4dC0+R2xvYmFsKCktPkdldFByb3RvdHlwZSgpLT5Ub09iamVjdChjb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpOworICAgIH0gZWxzZSBpZiAocFN0YXRpY09iamVjdHMtPmF0KGkpICYmICFwU3RhdGljT2JqZWN0cy0+YXQoaSktPklzRW1wdHkoKSkgeworICAgICAgcE9iaiA9IHY4OjpMb2NhbDx2ODo6T2JqZWN0Pjo6TmV3KHBJc29sYXRlLCAqcFN0YXRpY09iamVjdHMtPmF0KGkpKTsKKyAgICAgIGRlbGV0ZSBwU3RhdGljT2JqZWN0cy0+YXQoaSk7CisgICAgICBwU3RhdGljT2JqZWN0cy0+YXQoaSkgPSBudWxscHRyOworICAgIH0KIAotdm9pZCBKU19TZXRQcml2YXRlKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwgdm9pZCogcCkKLXsKLQlpZihwT2JqLklzRW1wdHkoKSB8fCAhcE9iai0+SW50ZXJuYWxGaWVsZENvdW50KCkpIHJldHVybjsKLQlDSlNfUHJpdmF0ZURhdGEqIHBQcml2YXRlRGF0YSAgPSAoQ0pTX1ByaXZhdGVEYXRhKilwT2JqLT5HZXRBbGlnbmVkUG9pbnRlckZyb21JbnRlcm5hbEZpZWxkKDApOwotCWlmKCFwUHJpdmF0ZURhdGEpIHJldHVybjsKLQlwUHJpdmF0ZURhdGEtPnBQcml2YXRlID0gcDsKLX0KKyAgICBpZiAoIXBPYmouSXNFbXB0eSgpKSB7CisgICAgICBpZiAocE9iakRlZi0+bV9wRGVzdHJ1Y3RvcikKKyAgICAgICAgcE9iakRlZi0+bV9wRGVzdHJ1Y3RvcihwT2JqKTsKKyAgICAgIEZYSlNfRnJlZVByaXZhdGUocE9iaik7CisgICAgfQorICB9CiAKLXZvaWQqIEpTX0dldFByaXZhdGUoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqKQotewotCWlmKHBPYmouSXNFbXB0eSgpKSByZXR1cm4gTlVMTDsKLQlDSlNfUHJpdmF0ZURhdGEqIHBQcml2YXRlRGF0YSAgPSBOVUxMOwotCWlmKHBPYmotPkludGVybmFsRmllbGRDb3VudCgpKQotICAgICAgICAgICAgICAgIHBQcml2YXRlRGF0YSA9IChDSlNfUHJpdmF0ZURhdGEqKXBPYmotPkdldEFsaWduZWRQb2ludGVyRnJvbUludGVybmFsRmllbGQoMCk7Ci0JZWxzZQotCXsKLQkJLy9JdCBjb3VsZCBiZSBhIGdsb2JhbCBwcm94eSBvYmplY3QuCi0JCXY4OjpMb2NhbDx2ODo6VmFsdWU+IHYgPSBwT2JqLT5HZXRQcm90b3R5cGUoKTsKLSAgICAgICAgICAgICAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9ICh2ODo6SXNvbGF0ZSopcEpTUnVudGltZTsKLSAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBpc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOwotCQlpZih2LT5Jc09iamVjdCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGVEYXRhID0gKENKU19Qcml2YXRlRGF0YSopdi0+VG9PYmplY3QoY29udGV4dCkuVG9Mb2NhbENoZWNrZWQoKS0+R2V0QWxpZ25lZFBvaW50ZXJGcm9tSW50ZXJuYWxGaWVsZCgwKTsKLQl9Ci0JaWYoIXBQcml2YXRlRGF0YSkgcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHBQcml2YXRlRGF0YS0+cFByaXZhdGU7Ci19CisgIGlmIChwSXNvbGF0ZSA9PSBnX2lzb2xhdGUgJiYgLS1nX2lzb2xhdGVfcmVmX2NvdW50ID4gMCkKKyAgICByZXR1cm47CiAKLXZvaWQgSlNfRnJlZVByaXZhdGUodm9pZCogcFByaXZhdGVEYXRhKQotewotICAgICAgICBkZWxldGUgKENKU19Qcml2YXRlRGF0YSopcFByaXZhdGVEYXRhOwotfQorICBmb3IgKGludCBpID0gMDsgaSA8IG1heElEOyArK2kpCisgICAgZGVsZXRlIENGWEpTX09iakRlZmluaXRpb246OkZvcklEKHBJc29sYXRlLCBpKTsKIAotdm9pZCBKU19GcmVlUHJpdmF0ZSh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaikKLXsKLQlpZihwT2JqLklzRW1wdHkoKSB8fCAhcE9iai0+SW50ZXJuYWxGaWVsZENvdW50KCkpIHJldHVybjsKLQlKU19GcmVlUHJpdmF0ZShwT2JqLT5HZXRBbGlnbmVkUG9pbnRlckZyb21JbnRlcm5hbEZpZWxkKDApKTsKLQlwT2JqLT5TZXRBbGlnbmVkUG9pbnRlckluSW50ZXJuYWxGaWVsZCgwLCBOVUxMKTsKKyAgcElzb2xhdGUtPlNldERhdGEoZ19lbWJlZGRlckRhdGFTbG90LCBudWxscHRyKTsKKyAgZGVsZXRlIHBEYXRhOwogfQogCi0KLXY4OjpMb2NhbDx2ODo6VmFsdWU+IEpTX0dldE9iamVjdFZhbHVlKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqKQotewotCXJldHVybiBwT2JqOworSUpTX1J1bnRpbWUqIEZYSlNfR2V0UnVudGltZUZyb21Jc29sYXRlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkgeworICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBwSXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PElKU19SdW50aW1lKj4oCisgICAgICBjb250ZXh0LT5HZXRBbGlnbmVkUG9pbnRlckZyb21FbWJlZGRlckRhdGEoa1BlckNvbnRleHREYXRhSW5kZXgpKTsKIH0KIAotdjg6OkxvY2FsPHY4OjpTdHJpbmc+IFdTVG9KU1N0cmluZyhJSlNfUnVudGltZSogcEpTUnVudGltZSwgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lLCBpbnQgTGVuID0gLTEpCi17Ci0JQ0ZYX1dpZGVTdHJpbmcgd3MgPSBDRlhfV2lkZVN0cmluZyhQcm9wZXJ0eU5hbWUsTGVuKTsKLQlDRlhfQnl0ZVN0cmluZyBicyA9IHdzLlVURjhFbmNvZGUoKTsKLQlpZighcEpTUnVudGltZSkgcEpTUnVudGltZSA9IHY4OjpJc29sYXRlOjpHZXRDdXJyZW50KCk7Ci0JcmV0dXJuIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBKU1J1bnRpbWUsIGJzLmNfc3RyKCksIHY4OjpOZXdTdHJpbmdUeXBlOjprTm9ybWFsKS5Ub0xvY2FsQ2hlY2tlZCgpOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCit2b2lkIEZYSlNfU2V0UnVudGltZUZvclY4Q29udGV4dCh2ODo6TG9jYWw8djg6OkNvbnRleHQ+IHY4Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElKU19SdW50aW1lKiBwSVJ1bnRpbWUpIHsKKyAgdjhDb250ZXh0LT5TZXRBbGlnbmVkUG9pbnRlckluRW1iZWRkZXJEYXRhKGtQZXJDb250ZXh0RGF0YUluZGV4LCBwSVJ1bnRpbWUpOwogfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCi12ODo6TG9jYWw8djg6OlZhbHVlPiBKU19HZXRPYmplY3RFbGVtZW50KElKU19SdW50aW1lKiBwSlNSdW50aW1lLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaixjb25zdCB3Y2hhcl90KiBQcm9wZXJ0eU5hbWUpCi17Ci0JaWYocE9iai5Jc0VtcHR5KCkpIHJldHVybiB2ODo6TG9jYWw8djg6OlZhbHVlPigpOwotICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWw7Ci0JaWYgKCFwT2JqLT5HZXQocEpTUnVudGltZS0+R2V0Q3VycmVudENvbnRleHQoKSwgV1NUb0pTU3RyaW5nKHBKU1J1bnRpbWUsUHJvcGVydHlOYW1lKSkuVG9Mb2NhbCgmdmFsKSkgcmV0dXJuIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7Ci0gICAgICAgIHJldHVybiB2YWw7Ci19CitpbnQgRlhKU19FeGVjdXRlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgSUpTX0NvbnRleHQqIHBKU0NvbnRleHQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHNjcmlwdCwKKyAgICAgICAgICAgICAgICAgRlhKU0VyciogcEVycm9yKSB7CisgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKHBJc29sYXRlKTsKKyAgdjg6OlRyeUNhdGNoIHRyeV9jYXRjaChwSXNvbGF0ZSk7CisgIENGWF9CeXRlU3RyaW5nIGJzU2NyaXB0ID0gQ0ZYX1dpZGVTdHJpbmcoc2NyaXB0KS5VVEY4RW5jb2RlKCk7CisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IHBJc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOworICB2ODo6TG9jYWw8djg6OlNjcmlwdD4gY29tcGlsZWRfc2NyaXB0OworICBpZiAoIXY4OjpTY3JpcHQ6OkNvbXBpbGUoCisgICAgICAgICAgIGNvbnRleHQsIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KAorICAgICAgICAgICAgICAgICAgICAgICAgcElzb2xhdGUsIGJzU2NyaXB0LmNfc3RyKCksIHY4OjpOZXdTdHJpbmdUeXBlOjprTm9ybWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgYnNTY3JpcHQuR2V0TGVuZ3RoKCkpLlRvTG9jYWxDaGVja2VkKCkpCisgICAgICAgICAgIC5Ub0xvY2FsKCZjb21waWxlZF9zY3JpcHQpKSB7CisgICAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIGVycm9yKHRyeV9jYXRjaC5FeGNlcHRpb24oKSk7CisgICAgLy8gVE9ETyh0c2VwZXopOiByZXR1cm4gZXJyb3IgdmlhIHBFcnJvci0+bWVzc2FnZS4KKyAgICByZXR1cm4gLTE7CisgIH0KIAotdjg6OkxvY2FsPHY4OjpBcnJheT4gSlNfR2V0T2JqZWN0RWxlbWVudE5hbWVzKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaikKLXsKLQlpZihwT2JqLklzRW1wdHkoKSkgcmV0dXJuIHY4OjpMb2NhbDx2ODo6QXJyYXk+KCk7Ci0gICAgICAgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IHZhbDsKLQlpZiAoIXBPYmotPkdldFByb3BlcnR5TmFtZXMocEpTUnVudGltZS0+R2V0Q3VycmVudENvbnRleHQoKSkuVG9Mb2NhbCgmdmFsKSkgcmV0dXJuIHY4OjpMb2NhbDx2ODo6QXJyYXk+KCk7Ci0gICAgICAgIHJldHVybiB2YWw7Ci19Ci0KLXZvaWQgSlNfUHV0T2JqZWN0U3RyaW5nKElKU19SdW50aW1lKiBwSlNSdW50aW1lLHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLCBjb25zdCB3Y2hhcl90KiBQcm9wZXJ0eU5hbWUsIGNvbnN0IHdjaGFyX3QqIHNWYWx1ZSkgLy9WVF9zdHJpbmcKLXsKLQlpZihwT2JqLklzRW1wdHkoKSkgcmV0dXJuOwotCXBPYmotPlNldChwSlNSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpLCBXU1RvSlNTdHJpbmcocEpTUnVudGltZSwgUHJvcGVydHlOYW1lKSwgV1NUb0pTU3RyaW5nKHBKU1J1bnRpbWUsIHNWYWx1ZSkpLkZyb21KdXN0KCk7Ci19Ci0KLXZvaWQgSlNfUHV0T2JqZWN0TnVtYmVyKElKU19SdW50aW1lKiBwSlNSdW50aW1lLHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLCBjb25zdCB3Y2hhcl90KiBQcm9wZXJ0eU5hbWUsIGludCBuVmFsdWUpCi17Ci0JaWYocE9iai5Jc0VtcHR5KCkpIHJldHVybjsKLQlwT2JqLT5TZXQocEpTUnVudGltZS0+R2V0Q3VycmVudENvbnRleHQoKSwgV1NUb0pTU3RyaW5nKHBKU1J1bnRpbWUsUHJvcGVydHlOYW1lKSx2ODo6SW50MzI6Ok5ldyhwSlNSdW50aW1lLCBuVmFsdWUpKS5Gcm9tSnVzdCgpOwotfQotCi12b2lkIEpTX1B1dE9iamVjdE51bWJlcihJSlNfUnVudGltZSogcEpTUnVudGltZSx2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lLCBmbG9hdCBmVmFsdWUpCi17Ci0JaWYocE9iai5Jc0VtcHR5KCkpIHJldHVybjsKLQlwT2JqLT5TZXQocEpTUnVudGltZS0+R2V0Q3VycmVudENvbnRleHQoKSwgV1NUb0pTU3RyaW5nKHBKU1J1bnRpbWUsUHJvcGVydHlOYW1lKSx2ODo6TnVtYmVyOjpOZXcocEpTUnVudGltZSwgKGRvdWJsZSlmVmFsdWUpKS5Gcm9tSnVzdCgpOwotfQotCi12b2lkIEpTX1B1dE9iamVjdE51bWJlcihJSlNfUnVudGltZSogcEpTUnVudGltZSx2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lLCBkb3VibGUgZFZhbHVlKQotewotCWlmKHBPYmouSXNFbXB0eSgpKSByZXR1cm47Ci0JcE9iai0+U2V0KHBKU1J1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCksIFdTVG9KU1N0cmluZyhwSlNSdW50aW1lLFByb3BlcnR5TmFtZSksdjg6Ok51bWJlcjo6TmV3KHBKU1J1bnRpbWUsIChkb3VibGUpZFZhbHVlKSkuRnJvbUp1c3QoKTsKLX0KLQotdm9pZCBKU19QdXRPYmplY3RCb29sZWFuKElKU19SdW50aW1lKiBwSlNSdW50aW1lLHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLCBjb25zdCB3Y2hhcl90KiBQcm9wZXJ0eU5hbWUsIGJvb2wgYlZhbHVlKQotewotCWlmKHBPYmouSXNFbXB0eSgpKSByZXR1cm47Ci0JcE9iai0+U2V0KHBKU1J1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCksIFdTVG9KU1N0cmluZyhwSlNSdW50aW1lLFByb3BlcnR5TmFtZSksdjg6OkJvb2xlYW46Ok5ldyhwSlNSdW50aW1lLCBiVmFsdWUpKS5Gcm9tSnVzdCgpOwotfQotCi12b2lkIEpTX1B1dE9iamVjdE9iamVjdChJSlNfUnVudGltZSogcEpTUnVudGltZSx2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcFB1dCkKLXsKLQlpZihwT2JqLklzRW1wdHkoKSkgcmV0dXJuOwotCXBPYmotPlNldChwSlNSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpLCBXU1RvSlNTdHJpbmcocEpTUnVudGltZSxQcm9wZXJ0eU5hbWUpLHBQdXQpLkZyb21KdXN0KCk7Ci19Ci0KLXZvaWQgSlNfUHV0T2JqZWN0TnVsbChJSlNfUnVudGltZSogcEpTUnVudGltZSx2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lKQotewotCWlmKHBPYmouSXNFbXB0eSgpKSByZXR1cm47Ci0JcE9iai0+U2V0KHBKU1J1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCksIFdTVG9KU1N0cmluZyhwSlNSdW50aW1lLFByb3BlcnR5TmFtZSksdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCkpLkZyb21KdXN0KCk7Ci19Ci0KLXY4OjpMb2NhbDx2ODo6QXJyYXk+IEpTX05ld0FycmF5KElKU19SdW50aW1lKiBwSlNSdW50aW1lKQotewotCXJldHVybiB2ODo6QXJyYXk6Ok5ldyhwSlNSdW50aW1lKTsKLX0KLQotdW5zaWduZWQgSlNfUHV0QXJyYXlFbGVtZW50KElKU19SdW50aW1lKiBwSlNSdW50aW1lLCB2ODo6TG9jYWw8djg6OkFycmF5PiBwQXJyYXksdW5zaWduZWQgaW5kZXgsdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlLEZYSlNWQUxVRVRZUEUgZVR5cGUpCi17CQotCWlmKHBBcnJheS5Jc0VtcHR5KCkpIHJldHVybiAwOwotCWlmIChwQXJyYXktPlNldChwSlNSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpLCBpbmRleCwgcFZhbHVlKS5Jc05vdGhpbmcoKSkgcmV0dXJuIDA7Ci0JcmV0dXJuIDE7Ci19Ci0KLXY4OjpMb2NhbDx2ODo6VmFsdWU+IEpTX0dldEFycmF5RWxlbWVudChJSlNfUnVudGltZSogcEpTUnVudGltZSwgdjg6OkxvY2FsPHY4OjpBcnJheT4gcEFycmF5LHVuc2lnbmVkIGluZGV4KQotewotCWlmKHBBcnJheS5Jc0VtcHR5KCkpIHJldHVybiB2ODo6TG9jYWw8djg6OlZhbHVlPigpOwotICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWw7Ci0JaWYgKHBBcnJheS0+R2V0KHBKU1J1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCksIGluZGV4KS5Ub0xvY2FsKCZ2YWwpKSByZXR1cm4gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKLSAgICAgICAgcmV0dXJuIHZhbDsKLX0KLQotdW5zaWduZWQgSlNfR2V0QXJyYXlMZW5ndGgodjg6OkxvY2FsPHY4OjpBcnJheT4gcEFycmF5KQotewotCWlmKHBBcnJheS5Jc0VtcHR5KCkpIHJldHVybiAwOwotCXJldHVybiBwQXJyYXktPkxlbmd0aCgpOworICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXN1bHQ7CisgIGlmICghY29tcGlsZWRfc2NyaXB0LT5SdW4oY29udGV4dCkuVG9Mb2NhbCgmcmVzdWx0KSkgeworICAgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBlcnJvcih0cnlfY2F0Y2guRXhjZXB0aW9uKCkpOworICAgIC8vIFRPRE8odHNlcGV6KTogcmV0dXJuIGVycm9yIHZpYSBwRXJyb3ItPm1lc3NhZ2UuCisgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiAwOwogfQogCi12ODo6TG9jYWw8djg6OlZhbHVlPiBKU19OZXdOdW1iZXIoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsaW50IG51bWJlcikKLXsKLQlyZXR1cm4gdjg6OkludDMyOjpOZXcocEpTUnVudGltZSwgbnVtYmVyKTsKLX0KK3Y4OjpMb2NhbDx2ODo6T2JqZWN0PiBGWEpTX05ld0Z4RHluYW1pY09iaih2ODo6SXNvbGF0ZSogcElzb2xhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUpTX1J1bnRpbWUqIHBJUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbk9iakRlZm5JRCkgeworICB2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShwSXNvbGF0ZSk7CisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IHBJc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOworICBpZiAobk9iakRlZm5JRCA9PSAtMSkgeworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IG9ialRlbXBsID0gdjg6Ok9iamVjdFRlbXBsYXRlOjpOZXcocElzb2xhdGUpOworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmo7CisgICAgaWYgKCFvYmpUZW1wbC0+TmV3SW5zdGFuY2UoY29udGV4dCkuVG9Mb2NhbCgmb2JqKSkKKyAgICAgIHJldHVybiB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKTsKKyAgICByZXR1cm4gb2JqOworICB9CiAKLXY4OjpMb2NhbDx2ODo6VmFsdWU+IEpTX05ld051bWJlcihJSlNfUnVudGltZSogcEpTUnVudGltZSxkb3VibGUgbnVtYmVyKQotewotCXJldHVybiB2ODo6TnVtYmVyOjpOZXcocEpTUnVudGltZSwgbnVtYmVyKTsKLX0KKyAgRlhKU19QZXJJc29sYXRlRGF0YSogcERhdGEgPSBGWEpTX1Blcklzb2xhdGVEYXRhOjpHZXQocElzb2xhdGUpOworICBpZiAoIXBEYXRhKQorICAgIHJldHVybiB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKTsKIAotdjg6OkxvY2FsPHY4OjpWYWx1ZT4gSlNfTmV3TnVtYmVyKElKU19SdW50aW1lKiBwSlNSdW50aW1lLGZsb2F0IG51bWJlcikKLXsKLQlyZXR1cm4gdjg6Ok51bWJlcjo6TmV3KHBKU1J1bnRpbWUsIChmbG9hdCludW1iZXIpOwotfQorICBpZiAobk9iakRlZm5JRCA8IDAgfHwgbk9iakRlZm5JRCA+PSBDRlhKU19PYmpEZWZpbml0aW9uOjpNYXhJRChwSXNvbGF0ZSkpCisgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpOwogCi12ODo6TG9jYWw8djg6OlZhbHVlPiBKU19OZXdCb29sZWFuKElKU19SdW50aW1lKiBwSlNSdW50aW1lLGJvb2wgYikKLXsKLQlyZXR1cm4gdjg6OkJvb2xlYW46Ok5ldyhwSlNSdW50aW1lLCBiKTsKLX0KKyAgQ0ZYSlNfT2JqRGVmaW5pdGlvbiogcE9iakRlZiA9CisgICAgICBDRlhKU19PYmpEZWZpbml0aW9uOjpGb3JJRChwSXNvbGF0ZSwgbk9iakRlZm5JRCk7CisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmo7CisgIGlmICghcE9iakRlZi0+R2V0SW5zdGFuY2VUZW1wbGF0ZSgpLT5OZXdJbnN0YW5jZShjb250ZXh0KS5Ub0xvY2FsKCZvYmopKQorICAgIHJldHVybiB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKTsKIAotdjg6OkxvY2FsPHY4OjpWYWx1ZT4gSlNfTmV3T2JqZWN0KElKU19SdW50aW1lKiBwSlNSdW50aW1lLHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqKQotewotCWlmKHBPYmouSXNFbXB0eSgpKSByZXR1cm4gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKLQlyZXR1cm4gcE9iai0+Q2xvbmUoKTsKLX0KKyAgb2JqLT5TZXRBbGlnbmVkUG9pbnRlckluSW50ZXJuYWxGaWVsZCgwLCBuZXcgQ0ZYSlNfUGVyT2JqZWN0RGF0YShuT2JqRGVmbklEKSk7CisgIGlmIChwT2JqRGVmLT5tX3BDb25zdHJ1Y3RvcikKKyAgICBwT2JqRGVmLT5tX3BDb25zdHJ1Y3RvcihwSVJ1bnRpbWUsIG9iaik7CiAKLXY4OjpMb2NhbDx2ODo6VmFsdWU+IEpTX05ld09iamVjdDIoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsdjg6OkxvY2FsPHY4OjpBcnJheT4gcE9iaikKLXsKLQlpZihwT2JqLklzRW1wdHkoKSkgcmV0dXJuIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7Ci0JcmV0dXJuIHBPYmotPkNsb25lKCk7CisgIHJldHVybiBvYmo7CiB9CiAKK3Y4OjpMb2NhbDx2ODo6T2JqZWN0PiBGWEpTX0dldFRoaXNPYmoodjg6Oklzb2xhdGUqIHBJc29sYXRlKSB7CisgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKHBJc29sYXRlKTsKKyAgaWYgKCFGWEpTX1Blcklzb2xhdGVEYXRhOjpHZXQocElzb2xhdGUpKQorICAgIHJldHVybiB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKTsKIAotdjg6OkxvY2FsPHY4OjpWYWx1ZT4gSlNfTmV3U3RyaW5nKElKU19SdW50aW1lKiBwSlNSdW50aW1lLGNvbnN0IHdjaGFyX3QqIHN0cmluZykKLXsKLQlyZXR1cm4gV1NUb0pTU3RyaW5nKHBKU1J1bnRpbWUsIHN0cmluZyk7CisgIC8vIFJldHVybiB0aGUgZ2xvYmFsIG9iamVjdC4KKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gcElzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCk7CisgIHJldHVybiBjb250ZXh0LT5HbG9iYWwoKS0+R2V0UHJvdG90eXBlKCktPlRvT2JqZWN0KGNvbnRleHQpLlRvTG9jYWxDaGVja2VkKCk7CiB9CiAKLXY4OjpMb2NhbDx2ODo6VmFsdWU+IEpTX05ld1N0cmluZyhJSlNfUnVudGltZSogcEpTUnVudGltZSxjb25zdCB3Y2hhcl90KiBzdHJpbmcsIHVuc2lnbmVkIG5MZW4pCi17Ci0JcmV0dXJuIFdTVG9KU1N0cmluZyhwSlNSdW50aW1lLCBzdHJpbmcsIG5MZW4pOworaW50IEZYSlNfR2V0T2JqRGVmbklEKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqKSB7CisgIGlmIChwT2JqLklzRW1wdHkoKSB8fCAhcE9iai0+SW50ZXJuYWxGaWVsZENvdW50KCkpCisgICAgcmV0dXJuIC0xOworICBDRlhKU19QZXJPYmplY3REYXRhKiBwUGVyT2JqZWN0RGF0YSA9IHN0YXRpY19jYXN0PENGWEpTX1Blck9iamVjdERhdGEqPigKKyAgICAgIHBPYmotPkdldEFsaWduZWRQb2ludGVyRnJvbUludGVybmFsRmllbGQoMCkpOworICBpZiAocFBlck9iamVjdERhdGEpCisgICAgcmV0dXJuIHBQZXJPYmplY3REYXRhLT5tX09iakRlZklEOworICByZXR1cm4gLTE7CiB9CiAKLXY4OjpMb2NhbDx2ODo6VmFsdWU+IEpTX05ld051bGwoKQotewotCXJldHVybiB2ODo6TG9jYWw8djg6OlZhbHVlPigpOwordm9pZCBGWEpTX0Vycm9yKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG1lc3NhZ2UpIHsKKyAgLy8gQ29udmVyc2lvbiBmcm9tIHBkZml1bSdzIHdjaGFyX3Qgd2lkZS1zdHJpbmdzIHRvIHY4J3MgdWludDE2X3QKKyAgLy8gd2lkZS1zdHJpbmdzIGlzbid0IGhhbmRsZWQgYnkgdjgsIHNvIHVzZSBVVEY4IGFzIGEgY29tbW9uCisgIC8vIGludGVybWVkaWF0ZSBmb3JtYXQuCisgIENGWF9CeXRlU3RyaW5nIHV0ZjhfbWVzc2FnZSA9IG1lc3NhZ2UuVVRGOEVuY29kZSgpOworICBwSXNvbGF0ZS0+VGhyb3dFeGNlcHRpb24oCisgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgdXRmOF9tZXNzYWdlLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TmV3U3RyaW5nVHlwZTo6a05vcm1hbCkuVG9Mb2NhbENoZWNrZWQoKSk7CiB9CiAKLXY4OjpMb2NhbDx2ODo6VmFsdWU+IEpTX05ld0RhdGUoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsZG91YmxlIGQpCi17Ci0JcmV0dXJuIHY4OjpEYXRlOjpOZXcocEpTUnVudGltZS0+R2V0Q3VycmVudENvbnRleHQoKSwgZCkuVG9Mb2NhbENoZWNrZWQoKTsKK2NvbnN0IHdjaGFyX3QqIEZYSlNfR2V0VHlwZW9mKHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBPYmopIHsKKyAgaWYgKHBPYmouSXNFbXB0eSgpKQorICAgIHJldHVybiBOVUxMOworICBpZiAocE9iai0+SXNTdHJpbmcoKSkKKyAgICByZXR1cm4ga0ZYSlNWYWx1ZU5hbWVTdHJpbmc7CisgIGlmIChwT2JqLT5Jc051bWJlcigpKQorICAgIHJldHVybiBrRlhKU1ZhbHVlTmFtZU51bWJlcjsKKyAgaWYgKHBPYmotPklzQm9vbGVhbigpKQorICAgIHJldHVybiBrRlhKU1ZhbHVlTmFtZUJvb2xlYW47CisgIGlmIChwT2JqLT5Jc0RhdGUoKSkKKyAgICByZXR1cm4ga0ZYSlNWYWx1ZU5hbWVEYXRlOworICBpZiAocE9iai0+SXNPYmplY3QoKSkKKyAgICByZXR1cm4ga0ZYSlNWYWx1ZU5hbWVPYmplY3Q7CisgIGlmIChwT2JqLT5Jc051bGwoKSkKKyAgICByZXR1cm4ga0ZYSlNWYWx1ZU5hbWVOdWxsOworICBpZiAocE9iai0+SXNVbmRlZmluZWQoKSkKKyAgICByZXR1cm4ga0ZYSlNWYWx1ZU5hbWVVbmRlZmluZWQ7CisgIHJldHVybiBOVUxMOwogfQogCi12ODo6TG9jYWw8djg6OlZhbHVlPiBKU19OZXdWYWx1ZShJSlNfUnVudGltZSogcEpTUnVudGltZSkKLXsKLQlyZXR1cm4gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKK3ZvaWQgRlhKU19TZXRQcml2YXRlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCogcCkgeworICBpZiAocE9iai5Jc0VtcHR5KCkgfHwgIXBPYmotPkludGVybmFsRmllbGRDb3VudCgpKQorICAgIHJldHVybjsKKyAgQ0ZYSlNfUGVyT2JqZWN0RGF0YSogcFBlck9iamVjdERhdGEgPSBzdGF0aWNfY2FzdDxDRlhKU19QZXJPYmplY3REYXRhKj4oCisgICAgICBwT2JqLT5HZXRBbGlnbmVkUG9pbnRlckZyb21JbnRlcm5hbEZpZWxkKDApKTsKKyAgaWYgKCFwUGVyT2JqZWN0RGF0YSkKKyAgICByZXR1cm47CisgIHBQZXJPYmplY3REYXRhLT5tX3BQcml2YXRlID0gcDsKIH0KIAotdjg6OkxvY2FsPHY4OjpWYWx1ZT4gSlNfR2V0TGlzdFZhbHVlKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBwTGlzdCwgaW50IGluZGV4KQotewotCi0gICAgICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IHBKU1J1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCk7Ci0JaWYoIXBMaXN0LklzRW1wdHkoKSAmJiBwTGlzdC0+SXNPYmplY3QoKSkKLQl7Ci0JCXY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmo7Ci0gICAgICAgICAgICAgICAgaWYgKHBMaXN0LT5Ub09iamVjdChjb250ZXh0KS5Ub0xvY2FsKCZvYmopKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmotPkdldChjb250ZXh0LCBpbmRleCkuVG9Mb2NhbCgmdmFsKSkgcmV0dXJuIHZhbDsKLSAgICAgICAgICAgICAgICB9Ci0JfQotCXJldHVybiB2ODo6TG9jYWw8djg6OlZhbHVlPigpOwordm9pZCogRlhKU19HZXRQcml2YXRlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopIHsKKyAgaWYgKHBPYmouSXNFbXB0eSgpKQorICAgIHJldHVybiBudWxscHRyOworICBDRlhKU19QZXJPYmplY3REYXRhKiBwUGVyT2JqZWN0RGF0YSA9IG51bGxwdHI7CisgIGlmIChwT2JqLT5JbnRlcm5hbEZpZWxkQ291bnQoKSkgeworICAgIHBQZXJPYmplY3REYXRhID0gc3RhdGljX2Nhc3Q8Q0ZYSlNfUGVyT2JqZWN0RGF0YSo+KAorICAgICAgICBwT2JqLT5HZXRBbGlnbmVkUG9pbnRlckZyb21JbnRlcm5hbEZpZWxkKDApKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBJdCBjb3VsZCBiZSBhIGdsb2JhbCBwcm94eSBvYmplY3QuCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdiA9IHBPYmotPkdldFByb3RvdHlwZSgpOworICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IHBJc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOworICAgIGlmICh2LT5Jc09iamVjdCgpKSB7CisgICAgICBwUGVyT2JqZWN0RGF0YSA9IHN0YXRpY19jYXN0PENGWEpTX1Blck9iamVjdERhdGEqPigKKyAgICAgICAgICB2LT5Ub09iamVjdChjb250ZXh0KQorICAgICAgICAgICAgICAuVG9Mb2NhbENoZWNrZWQoKQorICAgICAgICAgICAgICAtPkdldEFsaWduZWRQb2ludGVyRnJvbUludGVybmFsRmllbGQoMCkpOworICAgIH0KKyAgfQorICByZXR1cm4gcFBlck9iamVjdERhdGEgPyBwUGVyT2JqZWN0RGF0YS0+bV9wUHJpdmF0ZSA6IG51bGxwdHI7CiB9CiAKLWludAlKU19Ub0ludDMyKElKU19SdW50aW1lKiBwSlNSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpCi17Ci0JaWYocFZhbHVlLklzRW1wdHkoKSkgcmV0dXJuIDA7Ci0gICAgICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IHBKU1J1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCk7Ci0JcmV0dXJuIHBWYWx1ZS0+VG9JbnQzMihjb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpLT5WYWx1ZSgpOwordm9pZCBGWEpTX0ZyZWVQcml2YXRlKHZvaWQqIHBQZXJPYmplY3REYXRhKSB7CisgIGRlbGV0ZSBzdGF0aWNfY2FzdDxDRlhKU19QZXJPYmplY3REYXRhKj4ocFBlck9iamVjdERhdGEpOwogfQogCi1ib29sIEpTX1RvQm9vbGVhbihJSlNfUnVudGltZSogcEpTUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKQotewotCWlmKHBWYWx1ZS5Jc0VtcHR5KCkpIHJldHVybiBmYWxzZTsKLSAgICAgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gcEpTUnVudGltZS0+R2V0Q3VycmVudENvbnRleHQoKTsKLQlyZXR1cm4gcFZhbHVlLT5Ub0Jvb2xlYW4oY29udGV4dCkuVG9Mb2NhbENoZWNrZWQoKS0+VmFsdWUoKTsKK3ZvaWQgRlhKU19GcmVlUHJpdmF0ZSh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaikgeworICBpZiAocE9iai5Jc0VtcHR5KCkgfHwgIXBPYmotPkludGVybmFsRmllbGRDb3VudCgpKQorICAgIHJldHVybjsKKyAgRlhKU19GcmVlUHJpdmF0ZShwT2JqLT5HZXRBbGlnbmVkUG9pbnRlckZyb21JbnRlcm5hbEZpZWxkKDApKTsKKyAgcE9iai0+U2V0QWxpZ25lZFBvaW50ZXJJbkludGVybmFsRmllbGQoMCwgTlVMTCk7CiB9CiAKLWRvdWJsZSBKU19Ub051bWJlcihJSlNfUnVudGltZSogcEpTUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKQotewotCWlmKHBWYWx1ZS5Jc0VtcHR5KCkpIHJldHVybiAwLjA7Ci0gICAgICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IHBKU1J1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCk7Ci0JcmV0dXJuIHBWYWx1ZS0+VG9OdW1iZXIoY29udGV4dCkuVG9Mb2NhbENoZWNrZWQoKS0+VmFsdWUoKTsKK3Y4OjpMb2NhbDx2ODo6U3RyaW5nPiBGWEpTX1dTVG9KU1N0cmluZyh2ODo6SXNvbGF0ZSogcElzb2xhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBMZW4pIHsKKyAgQ0ZYX1dpZGVTdHJpbmcgd3MgPSBDRlhfV2lkZVN0cmluZyhQcm9wZXJ0eU5hbWUsIExlbik7CisgIENGWF9CeXRlU3RyaW5nIGJzID0gd3MuVVRGOEVuY29kZSgpOworICBpZiAoIXBJc29sYXRlKQorICAgIHBJc29sYXRlID0gdjg6Oklzb2xhdGU6OkdldEN1cnJlbnQoKTsKKyAgcmV0dXJuIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCBicy5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5ld1N0cmluZ1R5cGU6OmtOb3JtYWwpLlRvTG9jYWxDaGVja2VkKCk7CiB9CiAKLXY4OjpMb2NhbDx2ODo6T2JqZWN0PiBKU19Ub09iamVjdChJSlNfUnVudGltZSogcEpTUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKQotewotCWlmKHBWYWx1ZS5Jc0VtcHR5KCkpIHJldHVybiB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKTsKLSAgICAgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gcEpTUnVudGltZS0+R2V0Q3VycmVudENvbnRleHQoKTsKLQlyZXR1cm4gcFZhbHVlLT5Ub09iamVjdChjb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpOwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gRlhKU19HZXRPYmplY3RFbGVtZW50KHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBQcm9wZXJ0eU5hbWUpIHsKKyAgaWYgKHBPYmouSXNFbXB0eSgpKQorICAgIHJldHVybiB2ODo6TG9jYWw8djg6OlZhbHVlPigpOworICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWw7CisgIGlmICghcE9iai0+R2V0KHBJc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpLAorICAgICAgICAgICAgICAgICBGWEpTX1dTVG9KU1N0cmluZyhwSXNvbGF0ZSwgUHJvcGVydHlOYW1lKSkuVG9Mb2NhbCgmdmFsKSkKKyAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKKyAgcmV0dXJuIHZhbDsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcJSlNfVG9TdHJpbmcoSUpTX1J1bnRpbWUqIHBKU1J1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSkKLXsKLQlpZihwVmFsdWUuSXNFbXB0eSgpKSByZXR1cm4gTCIiOwotICAgICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBwSlNSdW50aW1lLT5HZXRDdXJyZW50Q29udGV4dCgpOwotCXY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBzKHBWYWx1ZS0+VG9TdHJpbmcoY29udGV4dCkuVG9Mb2NhbENoZWNrZWQoKSk7Ci0JcmV0dXJuIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOCgqcywgcy5sZW5ndGgoKSk7Cit2ODo6TG9jYWw8djg6OkFycmF5PiBGWEpTX0dldE9iamVjdEVsZW1lbnROYW1lcyh2ODo6SXNvbGF0ZSogcElzb2xhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaikgeworICBpZiAocE9iai5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6QXJyYXk+KCk7CisgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IHZhbDsKKyAgaWYgKCFwT2JqLT5HZXRQcm9wZXJ0eU5hbWVzKHBJc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpKS5Ub0xvY2FsKCZ2YWwpKQorICAgIHJldHVybiB2ODo6TG9jYWw8djg6OkFycmF5PigpOworICByZXR1cm4gdmFsOwogfQogCi12ODo6TG9jYWw8djg6OkFycmF5PiBKU19Ub0FycmF5KElKU19SdW50aW1lKiBwSlNSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpCi17Ci0JaWYocFZhbHVlLklzRW1wdHkoKSkgcmV0dXJuIHY4OjpMb2NhbDx2ODo6QXJyYXk+KCk7Ci0gICAgICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IHBKU1J1bnRpbWUtPkdldEN1cnJlbnRDb250ZXh0KCk7Ci0JcmV0dXJuIHY4OjpMb2NhbDx2ODo6QXJyYXk+OjpDYXN0KHBWYWx1ZS0+VG9PYmplY3QoY29udGV4dCkuVG9Mb2NhbENoZWNrZWQoKSk7Cit2b2lkIEZYSlNfUHV0T2JqZWN0U3RyaW5nKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIFByb3BlcnR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogc1ZhbHVlKSB7CisgIGlmIChwT2JqLklzRW1wdHkoKSkKKyAgICByZXR1cm47CisgIHBPYmotPlNldChwSXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKSwKKyAgICAgICAgICAgIEZYSlNfV1NUb0pTU3RyaW5nKHBJc29sYXRlLCBQcm9wZXJ0eU5hbWUpLAorICAgICAgICAgICAgRlhKU19XU1RvSlNTdHJpbmcocElzb2xhdGUsIHNWYWx1ZSkpLkZyb21KdXN0KCk7CiB9CiAKLXZvaWQgSlNfVmFsdWVDb3B5KHY4OjpMb2NhbDx2ODo6VmFsdWU+JiBwVG8sIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBGcm9tKQotewotCXBUbyA9IHBGcm9tOwordm9pZCBGWEpTX1B1dE9iamVjdE51bWJlcih2ODo6SXNvbGF0ZSogcElzb2xhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBQcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuVmFsdWUpIHsKKyAgaWYgKHBPYmouSXNFbXB0eSgpKQorICAgIHJldHVybjsKKyAgcE9iai0+U2V0KHBJc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpLAorICAgICAgICAgICAgRlhKU19XU1RvSlNTdHJpbmcocElzb2xhdGUsIFByb3BlcnR5TmFtZSksCisgICAgICAgICAgICB2ODo6SW50MzI6Ok5ldyhwSXNvbGF0ZSwgblZhbHVlKSkuRnJvbUp1c3QoKTsKIH0KIAotCi0vL0phdmFTY3JpcHQgdGltZSBpbXBsZW1lbnQgYmVnaW4uCi0KLWRvdWJsZSBfZ2V0TG9jYWxUWkEoKQotewotCWlmKCFGU0RLX0lzU2FuZEJveFBvbGljeUVuYWJsZWQoRlBERl9QT0xJQ1lfTUFDSElORVRJTUVfQUNDRVNTKSkKLQkJcmV0dXJuIDA7Ci0JdGltZV90IHQgPSAwOwotCXRpbWUoJnQpOwotCWxvY2FsdGltZSgmdCk7Ci0jaWYgX01TQ19WRVIgPj0gMTkwMAotICAvLyBJbiBnY2MgYW5kIGluIFZpc3VhbCBTdHVkaW8gcHJpb3IgdG8gVlMgMjAxNSAndGltZXpvbmUnIGlzIGEgZ2xvYmFsCi0gIC8vIHZhcmlhYmxlIGRlY2xhcmVkIGluIHRpbWUuaC4gVGhhdCB2YXJpYWJsZSB3YXMgZGVwcmVjYXRlZCBhbmQgaW4gVlMgMjAxNQotICAvLyBpcyByZW1vdmVkLCB3aXRoIF9nZXRfdGltZXpvbmUgcmVwbGFjaW5nIGl0LgotICBsb25nIHRpbWV6b25lID0gMDsKLSAgX2dldF90aW1lem9uZSgmdGltZXpvbmUpOwotI2VuZGlmCi0JcmV0dXJuIChkb3VibGUpKC0odGltZXpvbmUgKiAxMDAwKSk7Cit2b2lkIEZYSlNfUHV0T2JqZWN0TnVtYmVyKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIFByb3BlcnR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZlZhbHVlKSB7CisgIGlmIChwT2JqLklzRW1wdHkoKSkKKyAgICByZXR1cm47CisgIHBPYmotPlNldChwSXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKSwKKyAgICAgICAgICAgIEZYSlNfV1NUb0pTU3RyaW5nKHBJc29sYXRlLCBQcm9wZXJ0eU5hbWUpLAorICAgICAgICAgICAgdjg6Ok51bWJlcjo6TmV3KHBJc29sYXRlLCAoZG91YmxlKWZWYWx1ZSkpLkZyb21KdXN0KCk7CiB9CiAKLWludCBfZ2V0RGF5bGlnaHRTYXZpbmdUQShkb3VibGUgZCkKLXsKLQlpZighRlNES19Jc1NhbmRCb3hQb2xpY3lFbmFibGVkKEZQREZfUE9MSUNZX01BQ0hJTkVUSU1FX0FDQ0VTUykpCi0JCXJldHVybiAwOwotCXRpbWVfdCB0ID0gKHRpbWVfdCkoZC8xMDAwKTsKLQlzdHJ1Y3QgdG0gKiB0bXAgPSBsb2NhbHRpbWUoJnQpOwotCWlmICh0bXAgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JaWYgKHRtcC0+dG1faXNkc3QgPiAwKQotCQkvL09uZSBob3VyLgotCQlyZXR1cm4gKGludCk2MCo2MCoxMDAwOwotCXJldHVybiAwOwordm9pZCBGWEpTX1B1dE9iamVjdE51bWJlcih2ODo6SXNvbGF0ZSogcElzb2xhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBQcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkVmFsdWUpIHsKKyAgaWYgKHBPYmouSXNFbXB0eSgpKQorICAgIHJldHVybjsKKyAgcE9iai0+U2V0KHBJc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpLAorICAgICAgICAgICAgRlhKU19XU1RvSlNTdHJpbmcocElzb2xhdGUsIFByb3BlcnR5TmFtZSksCisgICAgICAgICAgICB2ODo6TnVtYmVyOjpOZXcocElzb2xhdGUsIChkb3VibGUpZFZhbHVlKSkuRnJvbUp1c3QoKTsKIH0KIAotZG91YmxlIF9Nb2QoZG91YmxlIHgsIGRvdWJsZSB5KQoteyAgIAotCWRvdWJsZSByID0gZm1vZCh4LCB5KTsKLQlpZiAociA8IDApIHIgKz0geTsKLQlyZXR1cm4gcjsKK3ZvaWQgRlhKU19QdXRPYmplY3RCb29sZWFuKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVmFsdWUpIHsKKyAgaWYgKHBPYmouSXNFbXB0eSgpKQorICAgIHJldHVybjsKKyAgcE9iai0+U2V0KHBJc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpLAorICAgICAgICAgICAgRlhKU19XU1RvSlNTdHJpbmcocElzb2xhdGUsIFByb3BlcnR5TmFtZSksCisgICAgICAgICAgICB2ODo6Qm9vbGVhbjo6TmV3KHBJc29sYXRlLCBiVmFsdWUpKS5Gcm9tSnVzdCgpOwogfQogCi1pbnQgX2lzZmluaXRlKGRvdWJsZSB2KQotewotI2lmIF9NU0NfVkVSCi0JcmV0dXJuIDo6X2Zpbml0ZSh2KTsKLSNlbHNlCi0JcmV0dXJuIHN0ZDo6ZmFicyh2KSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWF4KCk7Ci0jZW5kaWYKLX0KLQotZG91YmxlIF90b0ludGVnZXIoZG91YmxlIG4pCi17Ci0JcmV0dXJuIChuID49IDApPyBGWFNZU19mbG9vcihuKTogLUZYU1lTX2Zsb29yKC1uKTsKK3ZvaWQgRlhKU19QdXRPYmplY3RPYmplY3Qodjg6Oklzb2xhdGUqIHBJc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcFB1dCkgeworICBpZiAocE9iai5Jc0VtcHR5KCkpCisgICAgcmV0dXJuOworICBwT2JqLT5TZXQocElzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCksCisgICAgICAgICAgICBGWEpTX1dTVG9KU1N0cmluZyhwSXNvbGF0ZSwgUHJvcGVydHlOYW1lKSwgcFB1dCkuRnJvbUp1c3QoKTsKIH0KIAotYm9vbCBfaXNMZWFwWWVhcihpbnQgeWVhcikKLXsKLQlyZXR1cm4gKHllYXIlND09MCkmJigoeWVhciUxMDAhPTApfHwoeWVhciU0MDAhPTApKTsKK3ZvaWQgRlhKU19QdXRPYmplY3ROdWxsKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogUHJvcGVydHlOYW1lKSB7CisgIGlmIChwT2JqLklzRW1wdHkoKSkKKyAgICByZXR1cm47CisgIHBPYmotPlNldChwSXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKSwKKyAgICAgICAgICAgIEZYSlNfV1NUb0pTU3RyaW5nKHBJc29sYXRlLCBQcm9wZXJ0eU5hbWUpLAorICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCkpLkZyb21KdXN0KCk7CiB9CiAKLWludCBfRGF5RnJvbVllYXIoaW50IHkpCi17Ci0JcmV0dXJuIChpbnQpKDM2NSooeSAtIDE5NzAuMCkgKyBGWFNZU19mbG9vcigoeSAtIDE5NjkuMCkvNCkgLSBGWFNZU19mbG9vcigoeSAtIDE5MDEuMCkvMTAwKStGWFNZU19mbG9vcigoeSAtIDE2MDEuMCkvNDAwKSk7Cit2ODo6TG9jYWw8djg6OkFycmF5PiBGWEpTX05ld0FycmF5KHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkgeworICByZXR1cm4gdjg6OkFycmF5OjpOZXcocElzb2xhdGUpOwogfQogCi1kb3VibGUgX1RpbWVGcm9tWWVhcihpbnQgeSkKLXsKLQlyZXR1cm4gICgoZG91YmxlKTg2NDAwMDAwKSAqIF9EYXlGcm9tWWVhcih5KTsKK3Vuc2lnbmVkIEZYSlNfUHV0QXJyYXlFbGVtZW50KHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IHBBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKSB7CisgIGlmIChwQXJyYXkuSXNFbXB0eSgpKQorICAgIHJldHVybiAwOworICBpZiAocEFycmF5LT5TZXQocElzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCksIGluZGV4LCBwVmFsdWUpLklzTm90aGluZygpKQorICAgIHJldHVybiAwOworICByZXR1cm4gMTsKIH0KIAotZG91YmxlIF9UaW1lRnJvbVllYXJNb250aChpbnQgeSwgaW50IG0pCi17Ci0Jc3RhdGljIGludCBkYXlzTW9udGhbMTJdID17IDAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNH07Ci0Jc3RhdGljIGludCBsZWFwRGF5c01vbnRoWzEyXSA9IHsgMCwzMSw2MCw5MSwxMjEsMTUyLDE4MiwyMTMsMjQ0LDI3NCwzMDUsMzM1fTsKLQlpbnQqIHBNb250aCA9IGRheXNNb250aDsKLQlpZihfaXNMZWFwWWVhcih5KSkKLQkJcE1vbnRoID0gbGVhcERheXNNb250aDsKLQlyZXR1cm4gX1RpbWVGcm9tWWVhcih5KSArICgoZG91YmxlKXBNb250aFttXSkqODY0MDAwMDA7Cit2ODo6TG9jYWw8djg6OlZhbHVlPiBGWEpTX0dldEFycmF5RWxlbWVudCh2ODo6SXNvbGF0ZSogcElzb2xhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OkFycmF5PiBwQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbmRleCkgeworICBpZiAocEFycmF5LklzRW1wdHkoKSkKKyAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsOworICBpZiAoIXBBcnJheS0+R2V0KHBJc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpLCBpbmRleCkuVG9Mb2NhbCgmdmFsKSkKKyAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKKyAgcmV0dXJuIHZhbDsKIH0KIAotaW50IF9EYXkoZG91YmxlIHQpCi17Ci0JcmV0dXJuIChpbnQpRlhTWVNfZmxvb3IodCAvIDg2NDAwMDAwKTsKK3Vuc2lnbmVkIEZYSlNfR2V0QXJyYXlMZW5ndGgodjg6OkxvY2FsPHY4OjpBcnJheT4gcEFycmF5KSB7CisgIGlmIChwQXJyYXkuSXNFbXB0eSgpKQorICAgIHJldHVybiAwOworICByZXR1cm4gcEFycmF5LT5MZW5ndGgoKTsKIH0KIAotaW50IF9ZZWFyRnJvbVRpbWUoZG91YmxlIHQpCi17Ci0JLy9lc3RpbWF0ZSB0aGUgdGltZS4KLQlpbnQgeSA9IDE5NzAgKyhpbnQpKHQvKDM2NS4wKjg2NDAwMDAwKSk7Ci0JaWYgKF9UaW1lRnJvbVllYXIoeSkgPD0gdCkKLQl7Ci0JCXdoaWxlKF9UaW1lRnJvbVllYXIoeSsxKSA8PSB0KSB5Kys7Ci0JfQotCWVsc2UKLQkJd2hpbGUoX1RpbWVGcm9tWWVhcih5LTEpID4gdCkgeS0tOwotCXJldHVybiB5Owordjg6OkxvY2FsPHY4OjpWYWx1ZT4gRlhKU19OZXdOdW1iZXIodjg6Oklzb2xhdGUqIHBJc29sYXRlLCBpbnQgbnVtYmVyKSB7CisgIHJldHVybiB2ODo6SW50MzI6Ok5ldyhwSXNvbGF0ZSwgbnVtYmVyKTsKIH0KIAotaW50IF9EYXlXaXRoaW5ZZWFyKGRvdWJsZSB0KQotewotCWludCB5ZWFyID0gX1llYXJGcm9tVGltZSh0KTsKLQlpbnQgZGF5ID0gX0RheSh0KTsKLQlyZXR1cm4gZGF5LV9EYXlGcm9tWWVhcih5ZWFyKTsKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IEZYSlNfTmV3TnVtYmVyKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwgZG91YmxlIG51bWJlcikgeworICByZXR1cm4gdjg6Ok51bWJlcjo6TmV3KHBJc29sYXRlLCBudW1iZXIpOwogfQogCi1pbnQgX01vbnRoRnJvbVRpbWUoZG91YmxlIHQpCi17Ci0JaW50IGRheSA9IF9EYXlXaXRoaW5ZZWFyKHQpOwotCWludCB5ZWFyID0gX1llYXJGcm9tVGltZSh0KTsKLQlpZigwPD1kYXkgJiYgZGF5IDwzMSkKLQkJcmV0dXJuIDA7Ci0JaWYoMzE8PWRheSAmJiBkYXk8IDU5K19pc0xlYXBZZWFyKHllYXIpKQotCQlyZXR1cm4gMTsKLQlpZigoNTkrX2lzTGVhcFllYXIoeWVhcikpPD1kYXkgJiYgZGF5PCg5MCtfaXNMZWFwWWVhcih5ZWFyKSkpCi0JCXJldHVybiAyOwotCWlmKCg5MCtfaXNMZWFwWWVhcih5ZWFyKSk8PWRheSAmJiBkYXk8KDEyMCtfaXNMZWFwWWVhcih5ZWFyKSkpCi0JCXJldHVybiAzOwotCWlmKCgxMjArX2lzTGVhcFllYXIoeWVhcikpPD1kYXkgJiYgZGF5PCgxNTErX2lzTGVhcFllYXIoeWVhcikpKQotCQlyZXR1cm4gNDsKLQlpZigoMTUxK19pc0xlYXBZZWFyKHllYXIpKTw9ZGF5ICYmIGRheTwoMTgxK19pc0xlYXBZZWFyKHllYXIpKSkKLQkJcmV0dXJuIDU7Ci0JaWYoKDE4MStfaXNMZWFwWWVhcih5ZWFyKSk8PWRheSAmJiBkYXk8KDIxMitfaXNMZWFwWWVhcih5ZWFyKSkpCi0JCXJldHVybiA2OwotCWlmKCgyMTIrX2lzTGVhcFllYXIoeWVhcikpPD1kYXkgJiYgZGF5PCgyNDMrX2lzTGVhcFllYXIoeWVhcikpKQotCQlyZXR1cm4gNzsKLQlpZigoMjQzK19pc0xlYXBZZWFyKHllYXIpKTw9ZGF5ICYmIGRheTwoMjczK19pc0xlYXBZZWFyKHllYXIpKSkKLQkJcmV0dXJuIDg7Ci0JaWYoKDI3MytfaXNMZWFwWWVhcih5ZWFyKSk8PWRheSAmJiBkYXk8KDMwNCtfaXNMZWFwWWVhcih5ZWFyKSkpCi0JCXJldHVybiA5OwotCWlmKCgzMDQrX2lzTGVhcFllYXIoeWVhcikpPD1kYXkgJiYgZGF5PCgzMzQrX2lzTGVhcFllYXIoeWVhcikpKQotCQlyZXR1cm4gMTA7Ci0JaWYoKDMzNCtfaXNMZWFwWWVhcih5ZWFyKSk8PWRheSAmJiBkYXk8KDM2NStfaXNMZWFwWWVhcih5ZWFyKSkpCi0JCXJldHVybiAxMTsKLQotCXJldHVybiAtMTsKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IEZYSlNfTmV3TnVtYmVyKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwgZmxvYXQgbnVtYmVyKSB7CisgIHJldHVybiB2ODo6TnVtYmVyOjpOZXcocElzb2xhdGUsIChmbG9hdCludW1iZXIpOwogfQogCi1pbnQgX0RhdGVGcm9tVGltZShkb3VibGUgdCkKLXsKLQlpbnQgZGF5ID0gX0RheVdpdGhpblllYXIodCk7Ci0JaW50IHllYXIgPSBfWWVhckZyb21UaW1lKHQpOwotCWJvb2wgbGVhcCA9IF9pc0xlYXBZZWFyKHllYXIpOwotCWludCBtb250aCA9IF9Nb250aEZyb21UaW1lKHQpOwotCXN3aXRjaCAobW9udGgpCi0JewotCWNhc2UgMDoJIAotCQlyZXR1cm4gZGF5KzE7Ci0JY2FzZSAxOgkgCi0JCXJldHVybiBkYXktMzA7Ci0JY2FzZSAyOgkgCi0JCXJldHVybiBkYXktNTgtbGVhcDsKLQljYXNlIDM6CSAKLQkJcmV0dXJuIGRheS04OS1sZWFwOwotCWNhc2UgNDoJIAotCQlyZXR1cm4gZGF5LTExOS1sZWFwOwotCWNhc2UgNToJIAotCQlyZXR1cm4gZGF5LTE1MC1sZWFwOwotCWNhc2UgNjoJIAotCQlyZXR1cm4gZGF5LTE4MC1sZWFwOwotCWNhc2UgNzoJIAotCQlyZXR1cm4gZGF5LTIxMS1sZWFwOwotCWNhc2UgODoJIAotCQlyZXR1cm4gZGF5LTI0Mi1sZWFwOwotCWNhc2UgOToJIAotCQlyZXR1cm4gZGF5LTI3Mi1sZWFwOwotCWNhc2UgMTA6IAotCQlyZXR1cm4gZGF5LTMwMy1sZWFwOwotCWNhc2UgMTE6IAotCQlyZXR1cm4gZGF5LTMzMy1sZWFwOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAwOwotCX0KK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IEZYSlNfTmV3Qm9vbGVhbih2ODo6SXNvbGF0ZSogcElzb2xhdGUsIGJvb2wgYikgeworICByZXR1cm4gdjg6OkJvb2xlYW46Ok5ldyhwSXNvbGF0ZSwgYik7CiB9CiAKLWRvdWJsZSBKU19HZXREYXRlVGltZSgpCi17Ci0JaWYoIUZTREtfSXNTYW5kQm94UG9saWN5RW5hYmxlZChGUERGX1BPTElDWV9NQUNISU5FVElNRV9BQ0NFU1MpKQotCQlyZXR1cm4gMDsKLQl0aW1lX3QgdCA9IHRpbWUoTlVMTCk7Ci0Jc3RydWN0IHRtKiBwVG0gPSBsb2NhbHRpbWUoJnQpOwotCi0JaW50IHllYXIgPSBwVG0tPnRtX3llYXIrMTkwMDsKLQlkb3VibGUgdDEgPSBfVGltZUZyb21ZZWFyKHllYXIpOwotCi0JcmV0dXJuIHQxICsgcFRtLT50bV95ZGF5Kjg2NDAwMDAwLjAgKyBwVG0tPnRtX2hvdXIqMzYwMDAwMC4wK3BUbS0+dG1fbWluKjYwMDAwLjArcFRtLT50bV9zZWMqMTAwMC4wOwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gRlhKU19OZXdPYmplY3Qodjg6Oklzb2xhdGUqIHBJc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopIHsKKyAgaWYgKHBPYmouSXNFbXB0eSgpKQorICAgIHJldHVybiB2ODo6TG9jYWw8djg6OlZhbHVlPigpOworICByZXR1cm4gcE9iai0+Q2xvbmUoKTsKIH0KIAotaW50IEpTX0dldFllYXJGcm9tVGltZShkb3VibGUgZHQpCi17Ci0JcmV0dXJuIF9ZZWFyRnJvbVRpbWUoZHQpOwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gRlhKU19OZXdPYmplY3QyKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OkFycmF5PiBwT2JqKSB7CisgIGlmIChwT2JqLklzRW1wdHkoKSkKKyAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKKyAgcmV0dXJuIHBPYmotPkNsb25lKCk7CiB9CiAKLWludCBKU19HZXRNb250aEZyb21UaW1lKGRvdWJsZSBkdCkKLXsKLQlyZXR1cm4gX01vbnRoRnJvbVRpbWUoZHQpOwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gRlhKU19OZXdTdHJpbmcodjg6Oklzb2xhdGUqIHBJc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogc3RyaW5nKSB7CisgIHJldHVybiBGWEpTX1dTVG9KU1N0cmluZyhwSXNvbGF0ZSwgc3RyaW5nKTsKIH0KIAotaW50IEpTX0dldERheUZyb21UaW1lKGRvdWJsZSBkdCkKLXsKLQlyZXR1cm4gX0RhdGVGcm9tVGltZShkdCk7Cit2ODo6TG9jYWw8djg6OlZhbHVlPiBGWEpTX05ld051bGwoKSB7CisgIHJldHVybiB2ODo6TG9jYWw8djg6OlZhbHVlPigpOwogfQogCi1pbnQgSlNfR2V0SG91ckZyb21UaW1lKGRvdWJsZSBkdCkKLXsKLQlyZXR1cm4gKGludClfTW9kKEZYU1lTX2Zsb29yKChkb3VibGUpKGR0Lyg2MCo2MCoxMDAwKSkpLCAyNCk7Cit2ODo6TG9jYWw8djg6OlZhbHVlPiBGWEpTX05ld0RhdGUodjg6Oklzb2xhdGUqIHBJc29sYXRlLCBkb3VibGUgZCkgeworICByZXR1cm4gdjg6OkRhdGU6Ok5ldyhwSXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKSwgZCkuVG9Mb2NhbENoZWNrZWQoKTsKIH0KIAotaW50IEpTX0dldE1pbkZyb21UaW1lKGRvdWJsZSBkdCkKLXsKLQlyZXR1cm4gKGludClfTW9kKEZYU1lTX2Zsb29yKChkb3VibGUpKGR0Lyg2MCoxMDAwKSkpLCA2MCk7CitpbnQgRlhKU19Ub0ludDMyKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKSB7CisgIGlmIChwVmFsdWUuSXNFbXB0eSgpKQorICAgIHJldHVybiAwOworICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBwSXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKTsKKyAgcmV0dXJuIHBWYWx1ZS0+VG9JbnQzMihjb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpLT5WYWx1ZSgpOwogfQogCi1pbnQgSlNfR2V0U2VjRnJvbVRpbWUoZG91YmxlIGR0KQotewotCXJldHVybiAoaW50KV9Nb2QoRlhTWVNfZmxvb3IoKGRvdWJsZSkoZHQvMTAwMCkpLCA2MCk7Citib29sIEZYSlNfVG9Cb29sZWFuKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKSB7CisgIGlmIChwVmFsdWUuSXNFbXB0eSgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gcElzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCk7CisgIHJldHVybiBwVmFsdWUtPlRvQm9vbGVhbihjb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpLT5WYWx1ZSgpOwogfQogCi1kb3VibGUgSlNfRGF0ZVBhcnNlKGNvbnN0IHdjaGFyX3QqIHN0cmluZykKLXsKLQl2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSB2ODo6SXNvbGF0ZTo6R2V0Q3VycmVudCgpOwotCXY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKHBJc29sYXRlKTsKLQl2ODo6SGFuZGxlU2NvcGUgc2NvcGUocElzb2xhdGUpOwotCi0Jdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gcElzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCk7Ci0JCi0JLy9Vc2UgdGhlIGJ1aWx0LWluIG9iamVjdCBtZXRob2QuCi0Jdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdiA9IGNvbnRleHQtPkdsb2JhbCgpLT5HZXQoY29udGV4dCwgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJEYXRlIiwgdjg6Ok5ld1N0cmluZ1R5cGU6OmtOb3JtYWwpLlRvTG9jYWxDaGVja2VkKCkpLlRvTG9jYWxDaGVja2VkKCk7Ci0JaWYodi0+SXNPYmplY3QoKSkKLQl7Ci0JCXY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvID0gdi0+VG9PYmplY3QoY29udGV4dCkuVG9Mb2NhbENoZWNrZWQoKTsKLQkJdiA9IG8tPkdldChjb250ZXh0LHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAicGFyc2UiLCB2ODo6TmV3U3RyaW5nVHlwZTo6a05vcm1hbCkuVG9Mb2NhbENoZWNrZWQoKSkuVG9Mb2NhbENoZWNrZWQoKTsKLQkJaWYodi0+SXNGdW5jdGlvbigpKQotCQl7Ci0JCQl2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBmdW5DID0gdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj46OkNhc3Qodik7Ci0KLQkJCWNvbnN0IGludCBhcmdjID0gMTsKLQkJCXY4OjpMb2NhbDx2ODo6U3RyaW5nPiB0aW1lU3RyID0gV1NUb0pTU3RyaW5nKHBJc29sYXRlLCBzdHJpbmcpOwotCQkJdjg6OkxvY2FsPHY4OjpWYWx1ZT4gYXJndlthcmdjXSA9IHt0aW1lU3RyfTsKLQkJCXYgPSBmdW5DLT5DYWxsKGNvbnRleHQsIGNvbnRleHQtPkdsb2JhbCgpLCBhcmdjLCBhcmd2KS5Ub0xvY2FsQ2hlY2tlZCgpOwotCQkJaWYodi0+SXNOdW1iZXIoKSkKLQkJCXsKLQkJCQlkb3VibGUgZGF0ZSA9ICB2LT5Ub051bWJlcihjb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpLT5WYWx1ZSgpOwotCQkJCWlmKCFfaXNmaW5pdGUoZGF0ZSkpIHJldHVybiBkYXRlOwotCQkJCXJldHVybiBkYXRlICsgX2dldExvY2FsVFpBKCkgKyBfZ2V0RGF5bGlnaHRTYXZpbmdUQShkYXRlKTsKLQkJCX0KLQotCQl9Ci0JfQotCXJldHVybiAwOworZG91YmxlIEZYSlNfVG9OdW1iZXIodjg6Oklzb2xhdGUqIHBJc29sYXRlLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpIHsKKyAgaWYgKHBWYWx1ZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIDAuMDsKKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gcElzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCk7CisgIHJldHVybiBwVmFsdWUtPlRvTnVtYmVyKGNvbnRleHQpLlRvTG9jYWxDaGVja2VkKCktPlZhbHVlKCk7CiB9CiAKLWRvdWJsZSBKU19NYWtlRGF5KGludCBuWWVhciwgaW50IG5Nb250aCwgaW50IG5EYXRlKQotewotCWlmICghX2lzZmluaXRlKG5ZZWFyKSB8fCAhX2lzZmluaXRlKG5Nb250aCkgfHwhX2lzZmluaXRlKG5EYXRlKSkKLQkJcmV0dXJuIEdldE5hbigpOwotCWRvdWJsZSB5ID0gX3RvSW50ZWdlcihuWWVhcik7Ci0JZG91YmxlIG0gPSBfdG9JbnRlZ2VyKG5Nb250aCk7Ci0JZG91YmxlIGR0ID0gX3RvSW50ZWdlcihuRGF0ZSk7Ci0JZG91YmxlIHltID0geSArIEZYU1lTX2Zsb29yKChkb3VibGUpbS8xMik7Ci0JZG91YmxlIG1uID0gX01vZChtICwxMik7Ci0KLQlkb3VibGUgdCA9IF9UaW1lRnJvbVllYXJNb250aCgoaW50KXltLChpbnQpbW4pOwotCi0JaWYgKF9ZZWFyRnJvbVRpbWUodCkgIT0geW0gfHwgX01vbnRoRnJvbVRpbWUodCkgIT0gbW4gfHxfRGF0ZUZyb21UaW1lKHQpICE9IDEpCi0JCXJldHVybiBHZXROYW4oKTsKLQlyZXR1cm4gX0RheSh0KStkdC0xOwordjg6OkxvY2FsPHY4OjpPYmplY3Q+IEZYSlNfVG9PYmplY3Qodjg6Oklzb2xhdGUqIHBJc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKSB7CisgIGlmIChwVmFsdWUuSXNFbXB0eSgpKQorICAgIHJldHVybiB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKTsKKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gcElzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCk7CisgIHJldHVybiBwVmFsdWUtPlRvT2JqZWN0KGNvbnRleHQpLlRvTG9jYWxDaGVja2VkKCk7CiB9CiAKLWRvdWJsZSBKU19NYWtlVGltZShpbnQgbkhvdXIsIGludCBuTWluLCBpbnQgblNlYywgaW50IG5NcykKLXsKLQlpZiAoIV9pc2Zpbml0ZShuSG91cikgfHwhX2lzZmluaXRlKG5NaW4pIHx8IV9pc2Zpbml0ZShuU2VjKSB8fCFfaXNmaW5pdGUobk1zKSkKLQkJcmV0dXJuIEdldE5hbigpOwotCi0JZG91YmxlIGggPSBfdG9JbnRlZ2VyKG5Ib3VyKTsKLQlkb3VibGUgbSA9IF90b0ludGVnZXIobk1pbik7Ci0JZG91YmxlIHMgPSBfdG9JbnRlZ2VyKG5TZWMpOwotCWRvdWJsZSBtaWxsaSA9IF90b0ludGVnZXIobk1zKTsKLQotCXJldHVybiBoICogMzYwMDAwMCArIG0gKiA2MDAwMCArIHMgKiAxMDAwICsgbWlsbGk7CitDRlhfV2lkZVN0cmluZyBGWEpTX1RvU3RyaW5nKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKSB7CisgIGlmIChwVmFsdWUuSXNFbXB0eSgpKQorICAgIHJldHVybiBMIiI7CisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IHBJc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOworICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgcyhwVmFsdWUtPlRvU3RyaW5nKGNvbnRleHQpLlRvTG9jYWxDaGVja2VkKCkpOworICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KCpzLCBzLmxlbmd0aCgpKTsKIH0KIAotZG91YmxlIEpTX01ha2VEYXRlKGRvdWJsZSBkYXksIGRvdWJsZSB0aW1lKQotewotCWlmICghX2lzZmluaXRlKGRheSkgfHwhX2lzZmluaXRlKHRpbWUpKQotCQlyZXR1cm4gR2V0TmFuKCk7Ci0KLQlyZXR1cm4gZGF5ICogODY0MDAwMDAgKyB0aW1lOwordjg6OkxvY2FsPHY4OjpBcnJheT4gRlhKU19Ub0FycmF5KHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpIHsKKyAgaWYgKHBWYWx1ZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6QXJyYXk+KCk7CisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IHBJc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOworICByZXR1cm4gdjg6OkxvY2FsPHY4OjpBcnJheT46OkNhc3QocFZhbHVlLT5Ub09iamVjdChjb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpKTsKIH0KIAotYm9vbCBKU19Qb3J0SXNOYW4oZG91YmxlIGQpCi17Ci0JcmV0dXJuIGQgIT0gZDsKK3ZvaWQgRlhKU19WYWx1ZUNvcHkodjg6OkxvY2FsPHY4OjpWYWx1ZT4mIHBUbywgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcEZyb20pIHsKKyAgcFRvID0gcEZyb207CiB9CiAKLWRvdWJsZSBKU19Mb2NhbFRpbWUoZG91YmxlIGQpCi17Ci0JcmV0dXJuIEpTX0dldERhdGVUaW1lKCkgKyBfZ2V0RGF5bGlnaHRTYXZpbmdUQShkKTsKLX0KIAotLy9KYXZhU2NyaXB0IHRpbWUgaW1wbGVtZW50IEVuZC4KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2pzYXBpL2Z4anNfdjhfZW1iZWRkZXJ0ZXN0LmNwcCBiL2ZwZGZzZGsvc3JjL2pzYXBpL2Z4anNfdjhfZW1iZWRkZXJ0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmNlMjdiCi0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9zcmMvanNhcGkvZnhqc192OF9lbWJlZGRlcnRlc3QuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE1IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgInRlc3RpbmcvanNfZW1iZWRkZXJfdGVzdC5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCB3Y2hhcl90IGtTY3JpcHRbXSA9IEwiZnJlZCA9IDciOworCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgRlhKU1Y4RW1iZWRkZXJUZXN0IDogcHVibGljIEpTRW1iZWRkZXJUZXN0IHt9OworCitURVNUX0YoRlhKU1Y4RW1iZWRkZXJUZXN0LCBHZXR0ZXJzKSB7CisgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKGlzb2xhdGUoKSk7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgdjg6OkxvY2tlciBsb2NrZXIoaXNvbGF0ZSgpKTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShpc29sYXRlKCkpOworICB2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dF9zY29wZShHZXRWOENvbnRleHQoKSk7CisKKyAgRlhKU0VyciBlcnJvcjsKKyAgaW50IHN0cyA9IEZYSlNfRXhlY3V0ZShpc29sYXRlKCksIG51bGxwdHIsIGtTY3JpcHQsICZlcnJvcik7CisgIEVYUEVDVF9FUSgwLCBzdHMpOworCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBUaGlzID0gRlhKU19HZXRUaGlzT2JqKGlzb2xhdGUoKSk7CisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGZyZWQgPSBGWEpTX0dldE9iamVjdEVsZW1lbnQoaXNvbGF0ZSgpLCBUaGlzLCBMImZyZWQiKTsKKyAgRVhQRUNUX1RSVUUoZnJlZC0+SXNOdW1iZXIoKSk7Cit9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0J1dHRvbi5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0J1dHRvbi5jcHAKaW5kZXggZjk1NDY5YS4uNWM3ODM4MyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9CdXR0b24uY3BwCisrKyBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfQnV0dG9uLmNwcApAQCAtMSw1MyArMSw0MCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUERGV2luZG93LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9CdXR0b24uaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfVXRpbHMuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9CdXR0b24uaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oIgogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfQnV0dG9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK0NQV0xfQnV0dG9uOjpDUFdMX0J1dHRvbigpIDogbV9iTW91c2VEb3duKEZBTFNFKSB7fQogCi1DUFdMX0J1dHRvbjo6Q1BXTF9CdXR0b24oKSA6Ci0JbV9iTW91c2VEb3duKEZBTFNFKQoteworQ1BXTF9CdXR0b246On5DUFdMX0J1dHRvbigpIHsKIH0KIAotQ1BXTF9CdXR0b246On5DUFdMX0J1dHRvbigpCi17Ci0vLwlQV0xfVFJBQ0UoIn5DUFdMX0J1dHRvblxuIik7CitDRlhfQnl0ZVN0cmluZyBDUFdMX0J1dHRvbjo6R2V0Q2xhc3NOYW1lKCkgY29uc3QgeworICByZXR1cm4gIkNQV0xfQnV0dG9uIjsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9CdXR0b246OkdldENsYXNzTmFtZSgpIGNvbnN0Ci17Ci0JcmV0dXJuICJDUFdMX0J1dHRvbiI7Cit2b2lkIENQV0xfQnV0dG9uOjpPbkNyZWF0ZShQV0xfQ1JFQVRFUEFSQU0mIGNwKSB7CisgIGNwLmVDdXJzb3JUeXBlID0gRlhDVF9IQU5EOwogfQogCi12b2lkIENQV0xfQnV0dG9uOjpPbkNyZWF0ZShQV0xfQ1JFQVRFUEFSQU0gJiBjcCkKLXsKLQljcC5lQ3Vyc29yVHlwZSA9IEZYQ1RfSEFORDsKK0ZYX0JPT0wgQ1BXTF9CdXR0b246Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSB7CisgIENQV0xfV25kOjpPbkxCdXR0b25Eb3duKHBvaW50LCBuRmxhZyk7CisKKyAgbV9iTW91c2VEb3duID0gVFJVRTsKKyAgU2V0Q2FwdHVyZSgpOworCisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIENQV0xfQnV0dG9uOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsIG5GbGFnKTsKK0ZYX0JPT0wgQ1BXTF9CdXR0b246Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgeworICBDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsIG5GbGFnKTsKIAotCW1fYk1vdXNlRG93biA9IFRSVUU7Ci0JU2V0Q2FwdHVyZSgpOwotCQotCXJldHVybiBUUlVFOworICBSZWxlYXNlQ2FwdHVyZSgpOworICBtX2JNb3VzZURvd24gPSBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKIH0KLQotRlhfQk9PTCBDUFdMX0J1dHRvbjo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKLXsKLQlDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsIG5GbGFnKTsKLQotCVJlbGVhc2VDYXB0dXJlKCk7Ci0JbV9iTW91c2VEb3duID0gRkFMU0U7Ci0KLQlyZXR1cm4gVFJVRTsKLX0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9DYXJldC5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0NhcmV0LmNwcAppbmRleCBjZGM3ZDU3Li43NWM5NTEwIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0NhcmV0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0NhcmV0LmNwcApAQCAtMSwxOTcgKzEsMTU5IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QREZXaW5kb3cuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfV25kLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0NhcmV0LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1V0aWxzLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQ2FyZXQuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oIgogCi0jZGVmaW5lIFBXTF9DQVJFVF9GTEFTSElOVEVSVkFMCQk1MDAKKyNkZWZpbmUgUFdMX0NBUkVUX0ZMQVNISU5URVJWQUwgNTAwCiAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIENvbnN0cnVjdGlvbi9EZXN0cnVjdGlvbgotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworQ1BXTF9DYXJldDo6Q1BXTF9DYXJldCgpCisgICAgOiBtX2JGbGFzaChGQUxTRSksCisgICAgICBtX3B0SGVhZCgwLCAwKSwKKyAgICAgIG1fcHRGb290KDAsIDApLAorICAgICAgbV9mV2lkdGgoMC40ZiksCisgICAgICBtX25EZWxheSgwKSB7fQogCi1DUFdMX0NhcmV0OjpDUFdMX0NhcmV0KCkgOgotCW1fYkZsYXNoKEZBTFNFKSwKLQltX3B0SGVhZCgwLDApLAotCW1fcHRGb290KDAsMCksCi0JbV9mV2lkdGgoMC40ZiksCi0JbV9uRGVsYXkoMCkKLXsKK0NQV0xfQ2FyZXQ6On5DUFdMX0NhcmV0KCkge30KKworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9DYXJldDo6R2V0Q2xhc3NOYW1lKCkgY29uc3QgeworICByZXR1cm4gIkNQV0xfQ2FyZXQiOwogfQogCi1DUFdMX0NhcmV0Ojp+Q1BXTF9DYXJldCgpCi17Cit2b2lkIENQV0xfQ2FyZXQ6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiYgc0FwcFN0cmVhbSkgeworICBHZXRDYXJldEFwcChzQXBwU3RyZWFtLCBDUERGX1BvaW50KDAuMGYsIDAuMGYpKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9DYXJldDo6R2V0Q2xhc3NOYW1lKCkgY29uc3QKLXsKLQlyZXR1cm4gIkNQV0xfQ2FyZXQiOwordm9pZCBDUFdMX0NhcmV0OjpEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSkgeworICBpZiAoSXNWaXNpYmxlKCkgJiYgbV9iRmxhc2gpIHsKKyAgICBDUERGX1JlY3QgcmNSZWN0ID0gR2V0Q2FyZXRSZWN0KCk7CisgICAgQ1BERl9SZWN0IHJjQ2xpcCA9IEdldENsaXBSZWN0KCk7CisKKyAgICBDRlhfUGF0aERhdGEgcGF0aDsKKworICAgIHBhdGguU2V0UG9pbnRDb3VudCgyKTsKKworICAgIEZYX0ZMT0FUIGZDYXJldFggPSByY1JlY3QubGVmdCArIG1fZldpZHRoICogMC41ZjsKKyAgICBGWF9GTE9BVCBmQ2FyZXRUb3AgPSByY1JlY3QudG9wOworICAgIEZYX0ZMT0FUIGZDYXJldEJvdHRvbSA9IHJjUmVjdC5ib3R0b207CisKKyAgICBpZiAoIXJjQ2xpcC5Jc0VtcHR5KCkpIHsKKyAgICAgIHJjUmVjdC5JbnRlcnNlY3QocmNDbGlwKTsKKyAgICAgIGlmICghcmNSZWN0LklzRW1wdHkoKSkgeworICAgICAgICBmQ2FyZXRUb3AgPSByY1JlY3QudG9wOworICAgICAgICBmQ2FyZXRCb3R0b20gPSByY1JlY3QuYm90dG9tOworICAgICAgICBwYXRoLlNldFBvaW50KDAsIGZDYXJldFgsIGZDYXJldEJvdHRvbSwgRlhQVF9NT1ZFVE8pOworICAgICAgICBwYXRoLlNldFBvaW50KDEsIGZDYXJldFgsIGZDYXJldFRvcCwgRlhQVF9MSU5FVE8pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBwYXRoLlNldFBvaW50KDAsIGZDYXJldFgsIGZDYXJldEJvdHRvbSwgRlhQVF9NT1ZFVE8pOworICAgICAgcGF0aC5TZXRQb2ludCgxLCBmQ2FyZXRYLCBmQ2FyZXRUb3AsIEZYUFRfTElORVRPKTsKKyAgICB9CisKKyAgICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOworICAgIGdzZC5tX0xpbmVXaWR0aCA9IG1fZldpZHRoOworCisgICAgcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgJmdzZCwgMCwgQXJnYkVuY29kZSgyNTUsIDAsIDAsIDApLAorICAgICAgICAgICAgICAgICAgICAgIEZYRklMTF9BTFRFUk5BVEUpOworICB9CiB9CiAKLXZvaWQgQ1BXTF9DYXJldDo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSkKLXsKLQlHZXRDYXJldEFwcChzQXBwU3RyZWFtLENQREZfUG9pbnQoMC4wZiwwLjBmKSk7Cit2b2lkIENQV0xfQ2FyZXQ6OkdldENhcmV0QXBwKENGWF9CeXRlVGV4dEJ1ZiYgc0FwcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQpIHsKKyAgaWYgKElzVmlzaWJsZSgpICYmIG1fYkZsYXNoKSB7CisgICAgQ0ZYX0J5dGVUZXh0QnVmIHNDYXJldDsKKworICAgIENQREZfUmVjdCByY1JlY3QgPSBHZXRDYXJldFJlY3QoKTsKKyAgICBDUERGX1JlY3QgcmNDbGlwID0gR2V0Q2xpcFJlY3QoKTsKKworICAgIHJjUmVjdCA9IENQV0xfVXRpbHM6Ok9mZnNldFJlY3QocmNSZWN0LCBwdE9mZnNldC54LCBwdE9mZnNldC55KTsKKyAgICByY0NsaXAgPSBDUFdMX1V0aWxzOjpPZmZzZXRSZWN0KHJjQ2xpcCwgcHRPZmZzZXQueCwgcHRPZmZzZXQueSk7CisKKyAgICBzQ2FyZXQgPDwgInFcbiI7CisgICAgaWYgKCFyY0NsaXAuSXNFbXB0eSgpKSB7CisgICAgICBzQ2FyZXQgPDwgcmNDbGlwLmxlZnQgPDwgIiAiIDw8IHJjQ2xpcC5ib3R0b20gKyAyLjVmIDw8ICIgIgorICAgICAgICAgICAgIDw8IHJjQ2xpcC5yaWdodCAtIHJjQ2xpcC5sZWZ0IDw8ICIgIgorICAgICAgICAgICAgIDw8IHJjQ2xpcC50b3AgLSByY0NsaXAuYm90dG9tIC0gNC41ZiA8PCAiIHJlIFcgblxuIjsKKyAgICB9CisgICAgc0NhcmV0IDw8IG1fZldpZHRoIDw8ICIgd1xuMCBHXG4iOworICAgIHNDYXJldCA8PCByY1JlY3QubGVmdCArIG1fZldpZHRoIC8gMiA8PCAiICIgPDwgcmNSZWN0LmJvdHRvbSA8PCAiIG1cbiI7CisgICAgc0NhcmV0IDw8IHJjUmVjdC5sZWZ0ICsgbV9mV2lkdGggLyAyIDw8ICIgIiA8PCByY1JlY3QudG9wIDw8ICIgbCBTXG5RXG4iOworCisgICAgc0FwcFN0cmVhbSA8PCBzQ2FyZXQ7CisgIH0KIH0KIAotdm9pZCBDUFdMX0NhcmV0OjpEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSkKLXsKLQlpZiAoSXNWaXNpYmxlKCkgJiYgbV9iRmxhc2gpCi0JewotCQlDUERGX1JlY3QgcmNSZWN0ID0gR2V0Q2FyZXRSZWN0KCk7Ci0JCUNQREZfUmVjdCByY0NsaXAgPSBHZXRDbGlwUmVjdCgpOwotCi0JCUNGWF9QYXRoRGF0YSBwYXRoOwotCi0JCXBhdGguU2V0UG9pbnRDb3VudCgyKTsKLQkJCi0JCUZYX0ZMT0FUIGZDYXJldFggPSByY1JlY3QubGVmdCArIG1fZldpZHRoICogMC41ZjsKLQkJRlhfRkxPQVQgZkNhcmV0VG9wID0gcmNSZWN0LnRvcDsKLQkJRlhfRkxPQVQgZkNhcmV0Qm90dG9tID0gcmNSZWN0LmJvdHRvbTsKLQotCQlpZiAoIXJjQ2xpcC5Jc0VtcHR5KCkpCi0JCXsKLQkJCXJjUmVjdC5JbnRlcnNlY3QocmNDbGlwKTsKLQkJCWlmICghcmNSZWN0LklzRW1wdHkoKSkKLQkJCXsKLQkJCQlmQ2FyZXRUb3AgPSByY1JlY3QudG9wOwotCQkJCWZDYXJldEJvdHRvbSA9IHJjUmVjdC5ib3R0b207Ci0JCQkJcGF0aC5TZXRQb2ludCgwLCBmQ2FyZXRYLCBmQ2FyZXRCb3R0b20sIEZYUFRfTU9WRVRPKTsKLQkJCQlwYXRoLlNldFBvaW50KDEsIGZDYXJldFgsIGZDYXJldFRvcCwgRlhQVF9MSU5FVE8pOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCXBhdGguU2V0UG9pbnQoMCwgZkNhcmV0WCwgZkNhcmV0Qm90dG9tLCBGWFBUX01PVkVUTyk7Ci0JCQlwYXRoLlNldFBvaW50KDEsIGZDYXJldFgsIGZDYXJldFRvcCwgRlhQVF9MSU5FVE8pOwotCQl9Ci0KLQkJQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKLQkJZ3NkLm1fTGluZVdpZHRoID0gbV9mV2lkdGg7Ci0KLQkJcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgJmdzZCwwLCAgQXJnYkVuY29kZSgyNTUsMCwwLDApLCBGWEZJTExfQUxURVJOQVRFKTsKLQl9CitDRlhfQnl0ZVN0cmluZyBDUFdMX0NhcmV0OjpHZXRDYXJldEFwcGVhcmFuY2VTdHJlYW0oCisgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNDYXJldDsKKyAgR2V0Q2FyZXRBcHAoc0NhcmV0LCBwdE9mZnNldCk7CisgIHJldHVybiBzQ2FyZXQuR2V0Qnl0ZVN0cmluZygpOwogfQogCi12b2lkIENQV0xfQ2FyZXQ6OkdldENhcmV0QXBwKENGWF9CeXRlVGV4dEJ1ZiAmIHNBcHBTdHJlYW0sY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0KQotewotCWlmIChJc1Zpc2libGUoKSAmJiBtX2JGbGFzaCkKLQl7CQotCQlDRlhfQnl0ZVRleHRCdWYgc0NhcmV0OwotCi0JCUNQREZfUmVjdCByY1JlY3QgPSBHZXRDYXJldFJlY3QoKTsKLQkJQ1BERl9SZWN0IHJjQ2xpcCA9IEdldENsaXBSZWN0KCk7Ci0KLQkJcmNSZWN0ID0gQ1BXTF9VdGlsczo6T2Zmc2V0UmVjdChyY1JlY3QscHRPZmZzZXQueCxwdE9mZnNldC55KTsKLQkJcmNDbGlwID0gQ1BXTF9VdGlsczo6T2Zmc2V0UmVjdChyY0NsaXAscHRPZmZzZXQueCxwdE9mZnNldC55KTsKLQotCQlzQ2FyZXQgPDwgInFcbiI7Ci0JCWlmICghcmNDbGlwLklzRW1wdHkoKSkKLQkJewotCQkJc0NhcmV0IDw8IHJjQ2xpcC5sZWZ0IDw8ICIgIiA8PCByY0NsaXAuYm90dG9tICsgMi41ZiA8PCAiICIgCi0JCQkJPDwgcmNDbGlwLnJpZ2h0IC0gcmNDbGlwLmxlZnQgPDwgIiAiIDw8IHJjQ2xpcC50b3AgLSByY0NsaXAuYm90dG9tIC0gNC41ZiA8PCAiIHJlIFcgblxuIjsKLQkJfQotCQlzQ2FyZXQgPDwgbV9mV2lkdGggPDwgIiB3XG4wIEdcbiI7Ci0JCXNDYXJldCA8PCByY1JlY3QubGVmdCArIG1fZldpZHRoLzIgPDwgIiAiIDw8IHJjUmVjdC5ib3R0b20gPDwgIiBtXG4iOwotCQlzQ2FyZXQgPDwgcmNSZWN0LmxlZnQgKyBtX2ZXaWR0aC8yIDw8ICIgIiA8PCByY1JlY3QudG9wIDw8ICIgbCBTXG5RXG4iOwkKLQotCQlzQXBwU3RyZWFtIDw8IHNDYXJldDsJCi0JfQordm9pZCBDUFdMX0NhcmV0OjpUaW1lclByb2MoKSB7CisgIGlmIChtX25EZWxheSA+IDApIHsKKyAgICBtX25EZWxheS0tOworICB9IGVsc2UgeworICAgIG1fYkZsYXNoID0gIW1fYkZsYXNoOworICAgIEludmFsaWRhdGVSZWN0KCk7CisgIH0KIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9DYXJldDo6R2V0Q2FyZXRBcHBlYXJhbmNlU3RyZWFtKGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCkKLXsKLQlDRlhfQnl0ZVRleHRCdWYgc0NhcmV0OwotCUdldENhcmV0QXBwKHNDYXJldCxwdE9mZnNldCk7Ci0JcmV0dXJuIHNDYXJldC5HZXRCeXRlU3RyaW5nKCk7CitDUERGX1JlY3QgQ1BXTF9DYXJldDo6R2V0Q2FyZXRSZWN0KCkgY29uc3QgeworICByZXR1cm4gQ1BERl9SZWN0KG1fcHRGb290LngsIG1fcHRGb290LnksIG1fcHRIZWFkLnggKyBtX2ZXaWR0aCwgbV9wdEhlYWQueSk7CiB9CiAKLXZvaWQgQ1BXTF9DYXJldDo6VGltZXJQcm9jKCkKLXsKLQlpZiAobV9uRGVsYXkgPiAwKQotCXsKLQkJbV9uRGVsYXktLTsJCi0JfQotCWVsc2UKLQl7Ci0JCW1fYkZsYXNoID0gIW1fYkZsYXNoOwotCQlJbnZhbGlkYXRlUmVjdCgpOwotCX0KK3ZvaWQgQ1BXTF9DYXJldDo6U2V0Q2FyZXQoRlhfQk9PTCBiVmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRIZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdEZvb3QpIHsKKyAgaWYgKGJWaXNpYmxlKSB7CisgICAgaWYgKElzVmlzaWJsZSgpKSB7CisgICAgICBpZiAobV9wdEhlYWQueCAhPSBwdEhlYWQueCB8fCBtX3B0SGVhZC55ICE9IHB0SGVhZC55IHx8CisgICAgICAgICAgbV9wdEZvb3QueCAhPSBwdEZvb3QueCB8fCBtX3B0Rm9vdC55ICE9IHB0Rm9vdC55KSB7CisgICAgICAgIG1fcHRIZWFkID0gcHRIZWFkOworICAgICAgICBtX3B0Rm9vdCA9IHB0Rm9vdDsKKworICAgICAgICBtX2JGbGFzaCA9IFRSVUU7CisgICAgICAgIE1vdmUobV9yY0ludmFsaWQsIEZBTFNFLCBUUlVFKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgbV9wdEhlYWQgPSBwdEhlYWQ7CisgICAgICBtX3B0Rm9vdCA9IHB0Rm9vdDsKKworICAgICAgRW5kVGltZXIoKTsKKyAgICAgIEJlZ2luVGltZXIoUFdMX0NBUkVUX0ZMQVNISU5URVJWQUwpOworCisgICAgICBDUFdMX1duZDo6U2V0VmlzaWJsZShUUlVFKTsKKyAgICAgIG1fYkZsYXNoID0gVFJVRTsKKworICAgICAgTW92ZShtX3JjSW52YWxpZCwgRkFMU0UsIFRSVUUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtX3B0SGVhZCA9IENQREZfUG9pbnQoMCwgMCk7CisgICAgbV9wdEZvb3QgPSBDUERGX1BvaW50KDAsIDApOworCisgICAgbV9iRmxhc2ggPSBGQUxTRTsKKyAgICBpZiAoSXNWaXNpYmxlKCkpIHsKKyAgICAgIEVuZFRpbWVyKCk7CisgICAgICBDUFdMX1duZDo6U2V0VmlzaWJsZShGQUxTRSk7CisgICAgfQorICB9CiB9CiAKLUNQREZfUmVjdCBDUFdMX0NhcmV0OjpHZXRDYXJldFJlY3QoKSBjb25zdAotewotCXJldHVybiBDUERGX1JlY3QobV9wdEZvb3QueCwKLQkJCW1fcHRGb290LnksCi0JCQltX3B0SGVhZC54ICsgdGhpcy0+bV9mV2lkdGgsCi0JCQltX3B0SGVhZC55KTsKK3ZvaWQgQ1BXTF9DYXJldDo6SW52YWxpZGF0ZVJlY3QoQ1BERl9SZWN0KiBwUmVjdCkgeworICBpZiAocFJlY3QpIHsKKyAgICBDUERGX1JlY3QgcmNSZWZyZXNoID0gQ1BXTF9VdGlsczo6SW5mbGF0ZVJlY3QoKnBSZWN0LCAwLjVmKTsKKyAgICByY1JlZnJlc2gudG9wICs9IDE7CisgICAgcmNSZWZyZXNoLmJvdHRvbSAtPSAxOworCisgICAgQ1BXTF9XbmQ6OkludmFsaWRhdGVSZWN0KCZyY1JlZnJlc2gpOworICB9IGVsc2UgeworICAgIENQV0xfV25kOjpJbnZhbGlkYXRlUmVjdChwUmVjdCk7CisgIH0KIH0KLQotdm9pZCBDUFdMX0NhcmV0OjpTZXRDYXJldChGWF9CT09MIGJWaXNpYmxlLCBjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLCBjb25zdCBDUERGX1BvaW50ICYgcHRGb290KQotewotCWlmIChiVmlzaWJsZSkKLQl7CQotCQlpZiAoSXNWaXNpYmxlKCkpCi0JCXsKLQkJCWlmIChtX3B0SGVhZC54ICE9IHB0SGVhZC54IHx8IG1fcHRIZWFkLnkgIT0gcHRIZWFkLnkgfHwgCi0JCQkJCW1fcHRGb290LnggIT0gcHRGb290LnggfHwgbV9wdEZvb3QueSAhPSBwdEZvb3QueSkKLQkJCXsKLQkJCQl0aGlzLT5tX3B0SGVhZCA9IHB0SGVhZDsKLQkJCQl0aGlzLT5tX3B0Rm9vdCA9IHB0Rm9vdDsKLQotCQkJCW1fYkZsYXNoID0gVFJVRTsKLQkJCQkvL01vdmUoR2V0Q2FyZXRSZWN0KCksRkFMU0UsVFJVRSk7Ci0JCQkJTW92ZShtX3JjSW52YWxpZCwgRkFMU0UsIFRSVUUpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJdGhpcy0+bV9wdEhlYWQgPSBwdEhlYWQ7Ci0JCQl0aGlzLT5tX3B0Rm9vdCA9IHB0Rm9vdDsKLQotCQkJRW5kVGltZXIoKTsKLQkJCUJlZ2luVGltZXIoUFdMX0NBUkVUX0ZMQVNISU5URVJWQUwpOwotCQkJCi0JCQlDUFdMX1duZDo6U2V0VmlzaWJsZShUUlVFKTsKLQkJCW1fYkZsYXNoID0gVFJVRTsKLQotCQkJLy9Nb3ZlKEdldENhcmV0UmVjdCgpLEZBTFNFLFRSVUUpOwkKLQkJCU1vdmUobV9yY0ludmFsaWQsIEZBTFNFLCBUUlVFKTsKLQkJfQkJCi0JfQotCWVsc2UKLQl7Ci0JCXRoaXMtPm1fcHRIZWFkID0gQ1BERl9Qb2ludCgwLDApOwotCQl0aGlzLT5tX3B0Rm9vdCA9IENQREZfUG9pbnQoMCwwKTsKLQotCQltX2JGbGFzaCA9IEZBTFNFOwotCQlpZiAoSXNWaXNpYmxlKCkpCi0JCXsKLQkJCUVuZFRpbWVyKCk7Ci0JCQlDUFdMX1duZDo6U2V0VmlzaWJsZShGQUxTRSk7Ci0JCX0JCQotCX0KLX0KLQotdm9pZCBDUFdMX0NhcmV0OjpJbnZhbGlkYXRlUmVjdChDUERGX1JlY3QgKiBwUmVjdCkKLXsKLQlpZiAocFJlY3QpCi0JewotCQlDUERGX1JlY3QgcmNSZWZyZXNoID0gQ1BXTF9VdGlsczo6SW5mbGF0ZVJlY3QoKnBSZWN0LDAuNWYpOwotCQlyY1JlZnJlc2gudG9wICs9IDE7Ci0JCXJjUmVmcmVzaC5ib3R0b20gLT0gMTsJCi0JCQotCQlDUFdMX1duZDo6SW52YWxpZGF0ZVJlY3QoJnJjUmVmcmVzaCk7Ci0JfQotCWVsc2UKLQkJQ1BXTF9XbmQ6OkludmFsaWRhdGVSZWN0KHBSZWN0KTsKLX0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9Db21ib0JveC5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0NvbWJvQm94LmNwcAppbmRleCA2NjI3MTg5Li43NTgyYWU0IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0NvbWJvQm94LmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0NvbWJvQm94LmNwcApAQCAtMSw2NjIgKzEsNjQ4IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QREZXaW5kb3cuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfV25kLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGlzdEJveC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Db21ib0JveC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0NvbWJvQm94LmgiCiAKLSNkZWZpbmUgUFdMQ0JfREVGQVVMVEZPTlRTSVpFICAxMi4wZgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXQuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9FZGl0Q3RybC5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0xpc3RCb3guaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2Z3bGV2ZW50LmgiCiAKLSNkZWZpbmUgSXNGbG9hdFplcm8oZikJCQkJCQkoKGYpIDwgMC4wMDAxICYmIChmKSA+IC0wLjAwMDEpCi0jZGVmaW5lIElzRmxvYXRCaWdnZXIoZmEsZmIpCQkJCSgoZmEpID4gKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQotI2RlZmluZSBJc0Zsb2F0U21hbGxlcihmYSxmYikJCQkJKChmYSkgPCAoZmIpICYmICFJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkpCi0jZGVmaW5lIElzRmxvYXRFcXVhbChmYSxmYikJCQkJCUlzRmxvYXRaZXJvKChmYSktKGZiKSkKKyNkZWZpbmUgUFdMQ0JfREVGQVVMVEZPTlRTSVpFIDEyLjBmCiAKKyNkZWZpbmUgSXNGbG9hdFplcm8oZikgKChmKSA8IDAuMDAwMSAmJiAoZikgPiAtMC4wMDAxKQorI2RlZmluZSBJc0Zsb2F0QmlnZ2VyKGZhLCBmYikgKChmYSkgPiAoZmIpICYmICFJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkpCisjZGVmaW5lIElzRmxvYXRTbWFsbGVyKGZhLCBmYikgKChmYSkgPCAoZmIpICYmICFJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkpCisjZGVmaW5lIElzRmxvYXRFcXVhbChmYSwgZmIpIElzRmxvYXRaZXJvKChmYSkgLSAoZmIpKQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfQ0JMaXN0Qm94IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK0ZYX0JPT0wgQ1BXTF9DQkxpc3RCb3g6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgeworICBDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsIG5GbGFnKTsKIAotRlhfQk9PTAlDUFdMX0NCTGlzdEJveDo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKLXsKLQlDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsbkZsYWcpOworICBpZiAobV9iTW91c2VEb3duKSB7CisgICAgUmVsZWFzZUNhcHR1cmUoKTsKKyAgICBtX2JNb3VzZURvd24gPSBGQUxTRTsKIAotCWlmIChtX2JNb3VzZURvd24pCi0JewotCQlSZWxlYXNlQ2FwdHVyZSgpOwotCQltX2JNb3VzZURvd24gPSBGQUxTRTsJCisgICAgaWYgKENsaWVudEhpdFRlc3QocG9pbnQpKSB7CisgICAgICBpZiAoQ1BXTF9XbmQqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkgeworICAgICAgICBwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLCBQTk1fTEJVVFRPTlVQLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfTUFLRURXT1JEKHBvaW50LngsIHBvaW50LnkpKTsKKyAgICAgIH0KIAotCQlpZiAodGhpcy0+Q2xpZW50SGl0VGVzdChwb2ludCkpCi0JCXsKLQkJCWlmIChDUFdMX1duZCAqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkKLQkJCXsKLQkJCQlwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLFBOTV9MQlVUVE9OVVAsMCxQV0xfTUFLRURXT1JEKHBvaW50LngscG9pbnQueSkpOwkJCQotCQkJfQotCQkKLQkJCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKLQkJCU9uTm90aWZ5U2VsQ2hhbmdlZChGQUxTRSxiRXhpdCwgbkZsYWcpOwotCQkJaWYgKGJFeGl0KSByZXR1cm4gRkFMU0U7Ci0JCX0KLQl9CisgICAgICBGWF9CT09MIGJFeGl0ID0gRkFMU0U7CisgICAgICBPbk5vdGlmeVNlbENoYW5nZWQoRkFMU0UsIGJFeGl0LCBuRmxhZyk7CisgICAgICBpZiAoYkV4aXQpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBDUFdMX0NCTGlzdEJveDo6T25LZXlEb3duV2l0aEV4aXQoRlhfV09SRCBuQ2hhciwgRlhfQk9PTCAmIGJFeGl0LCBGWF9EV09SRCBuRmxhZykKLXsKLQlpZiAoIW1fcExpc3QpIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1BXTF9DQkxpc3RCb3g6Ok9uS2V5RG93bldpdGhFeGl0KEZYX1dPUkQgbkNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSB7CisgIGlmICghbV9wTGlzdCkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlzd2l0Y2ggKG5DaGFyKQotCXsKLQlkZWZhdWx0OgotCQlyZXR1cm4gRkFMU0U7Ci0JY2FzZSBGV0xfVktFWV9VcDoKLQljYXNlIEZXTF9WS0VZX0Rvd246Ci0JY2FzZSBGV0xfVktFWV9Ib21lOgotCWNhc2UgRldMX1ZLRVlfTGVmdDoKLQljYXNlIEZXTF9WS0VZX0VuZDoKLQljYXNlIEZXTF9WS0VZX1JpZ2h0OgotCQlicmVhazsJCi0JfQorICBzd2l0Y2ggKG5DaGFyKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBjYXNlIEZXTF9WS0VZX1VwOgorICAgIGNhc2UgRldMX1ZLRVlfRG93bjoKKyAgICBjYXNlIEZXTF9WS0VZX0hvbWU6CisgICAgY2FzZSBGV0xfVktFWV9MZWZ0OgorICAgIGNhc2UgRldMX1ZLRVlfRW5kOgorICAgIGNhc2UgRldMX1ZLRVlfUmlnaHQ6CisgICAgICBicmVhazsKKyAgfQogCi0Jc3dpdGNoIChuQ2hhcikKLQl7Ci0JY2FzZSBGV0xfVktFWV9VcDoKLQkJbV9wTGlzdC0+T25WS19VUChJc1NISUZUcHJlc3NlZChuRmxhZyksSXNDVFJMcHJlc3NlZChuRmxhZykpOwotCQlicmVhazsKLQljYXNlIEZXTF9WS0VZX0Rvd246Ci0JCW1fcExpc3QtPk9uVktfRE9XTihJc1NISUZUcHJlc3NlZChuRmxhZyksSXNDVFJMcHJlc3NlZChuRmxhZykpOwotCQlicmVhazsKLQljYXNlIEZXTF9WS0VZX0hvbWU6Ci0JCW1fcExpc3QtPk9uVktfSE9NRShJc1NISUZUcHJlc3NlZChuRmxhZyksSXNDVFJMcHJlc3NlZChuRmxhZykpOwotCQlicmVhazsKLQljYXNlIEZXTF9WS0VZX0xlZnQ6Ci0JCW1fcExpc3QtPk9uVktfTEVGVChJc1NISUZUcHJlc3NlZChuRmxhZyksSXNDVFJMcHJlc3NlZChuRmxhZykpOwotCQlicmVhazsKLQljYXNlIEZXTF9WS0VZX0VuZDoKLQkJbV9wTGlzdC0+T25WS19FTkQoSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKTsKLQkJYnJlYWs7Ci0JY2FzZSBGV0xfVktFWV9SaWdodDoKLQkJbV9wTGlzdC0+T25WS19SSUdIVChJc1NISUZUcHJlc3NlZChuRmxhZyksSXNDVFJMcHJlc3NlZChuRmxhZykpOwotCQlicmVhazsKLQljYXNlIEZXTF9WS0VZX0RlbGV0ZToKLQkJYnJlYWs7Ci0JfQorICBzd2l0Y2ggKG5DaGFyKSB7CisgICAgY2FzZSBGV0xfVktFWV9VcDoKKyAgICAgIG1fcExpc3QtPk9uVktfVVAoSXNTSElGVHByZXNzZWQobkZsYWcpLCBJc0NUUkxwcmVzc2VkKG5GbGFnKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZXTF9WS0VZX0Rvd246CisgICAgICBtX3BMaXN0LT5PblZLX0RPV04oSXNTSElGVHByZXNzZWQobkZsYWcpLCBJc0NUUkxwcmVzc2VkKG5GbGFnKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZXTF9WS0VZX0hvbWU6CisgICAgICBtX3BMaXN0LT5PblZLX0hPTUUoSXNTSElGVHByZXNzZWQobkZsYWcpLCBJc0NUUkxwcmVzc2VkKG5GbGFnKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZXTF9WS0VZX0xlZnQ6CisgICAgICBtX3BMaXN0LT5PblZLX0xFRlQoSXNTSElGVHByZXNzZWQobkZsYWcpLCBJc0NUUkxwcmVzc2VkKG5GbGFnKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZXTF9WS0VZX0VuZDoKKyAgICAgIG1fcExpc3QtPk9uVktfRU5EKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGV0xfVktFWV9SaWdodDoKKyAgICAgIG1fcExpc3QtPk9uVktfUklHSFQoSXNTSElGVHByZXNzZWQobkZsYWcpLCBJc0NUUkxwcmVzc2VkKG5GbGFnKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZXTF9WS0VZX0RlbGV0ZToKKyAgICAgIGJyZWFrOworICB9CiAKLQlPbk5vdGlmeVNlbENoYW5nZWQoVFJVRSxiRXhpdCwgbkZsYWcpOworICBPbk5vdGlmeVNlbENoYW5nZWQoVFJVRSwgYkV4aXQsIG5GbGFnKTsKIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTAlDUFdMX0NCTGlzdEJveDo6T25DaGFyV2l0aEV4aXQoRlhfV09SRCBuQ2hhciwgRlhfQk9PTCAmIGJFeGl0LCBGWF9EV09SRCBuRmxhZykKLXsKLQlpZiAoIW1fcExpc3QpIHJldHVybiBGQUxTRTsKK0ZYX0JPT0wgQ1BXTF9DQkxpc3RCb3g6Ok9uQ2hhcldpdGhFeGl0KEZYX1dPUkQgbkNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSB7CisgIGlmICghbV9wTGlzdCkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlpZiAoIW1fcExpc3QtPk9uQ2hhcihuQ2hhcixJc1NISUZUcHJlc3NlZChuRmxhZyksSXNDVFJMcHJlc3NlZChuRmxhZykpKSByZXR1cm4gRkFMU0U7CisgIGlmICghbV9wTGlzdC0+T25DaGFyKG5DaGFyLCBJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlpZiAoQ1BXTF9Db21ib0JveCogcENvbWJvQm94ID0gKENQV0xfQ29tYm9Cb3gqKUdldFBhcmVudFdpbmRvdygpKQotCXsKLQkJcENvbWJvQm94LT5TZXRTZWxlY3RUZXh0KCk7Ci0JfQorICBpZiAoQ1BXTF9Db21ib0JveCogcENvbWJvQm94ID0gKENQV0xfQ29tYm9Cb3gqKUdldFBhcmVudFdpbmRvdygpKSB7CisgICAgcENvbWJvQm94LT5TZXRTZWxlY3RUZXh0KCk7CisgIH0KIAotCU9uTm90aWZ5U2VsQ2hhbmdlZChUUlVFLGJFeGl0LG5GbGFnKTsKKyAgT25Ob3RpZnlTZWxDaGFuZ2VkKFRSVUUsIGJFeGl0LCBuRmxhZyk7CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9DQkJ1dHRvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit2b2lkIENQV0xfQ0JCdXR0b246OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiYgc0FwcFN0cmVhbSkgeworICBDUFdMX1duZDo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oc0FwcFN0cmVhbSk7CiAKLXZvaWQgQ1BXTF9DQkJ1dHRvbjo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSkKLXsKLQlDUFdMX1duZDo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oc0FwcFN0cmVhbSk7Ci0JCi0JQ1BERl9SZWN0IHJlY3RXbmQgPSBDUFdMX1duZDo6R2V0V2luZG93UmVjdCgpOwotCQotCWlmIChJc1Zpc2libGUoKSAmJiAhcmVjdFduZC5Jc0VtcHR5KCkpCi0JewotCQlDRlhfQnl0ZVRleHRCdWYgc0J1dHRvbjsJCisgIENQREZfUmVjdCByZWN0V25kID0gQ1BXTF9XbmQ6OkdldFdpbmRvd1JlY3QoKTsKIAotCQlDUERGX1BvaW50IHB0Q2VudGVyID0gdGhpcy0+R2V0Q2VudGVyUG9pbnQoKTsKKyAgaWYgKElzVmlzaWJsZSgpICYmICFyZWN0V25kLklzRW1wdHkoKSkgeworICAgIENGWF9CeXRlVGV4dEJ1ZiBzQnV0dG9uOwogCi0JCUNQREZfUG9pbnQgcHQxKHB0Q2VudGVyLnggLSBQV0xfQ0JCVVRUT05fVFJJQU5HTEVfSEFMRkxFTixwdENlbnRlci55ICsgUFdMX0NCQlVUVE9OX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmKTsKLQkJQ1BERl9Qb2ludCBwdDIocHRDZW50ZXIueCArIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOLHB0Q2VudGVyLnkgKyBQV0xfQ0JCVVRUT05fVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYpOwotCQlDUERGX1BvaW50IHB0MyhwdENlbnRlci54LHB0Q2VudGVyLnkgLSBQV0xfQ0JCVVRUT05fVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYpOworICAgIENQREZfUG9pbnQgcHRDZW50ZXIgPSBHZXRDZW50ZXJQb2ludCgpOwogCi0JCWlmIChJc0Zsb2F0QmlnZ2VyKHJlY3RXbmQucmlnaHQgLSByZWN0V25kLmxlZnQsUFdMX0NCQlVUVE9OX1RSSUFOR0xFX0hBTEZMRU4gKiAyKQotCQkJJiYKLQkJCUlzRmxvYXRCaWdnZXIocmVjdFduZC50b3AgLSByZWN0V25kLmJvdHRvbSxQV0xfQ0JCVVRUT05fVFJJQU5HTEVfSEFMRkxFTikKLQkJCSkKLQkJewotCQkJc0J1dHRvbiA8PCAiMCBnXG4iOwotCQkJc0J1dHRvbiA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBtXG4iOwotCQkJc0J1dHRvbiA8PCBwdDIueCA8PCAiICIgPDwgcHQyLnkgPDwgIiBsXG4iOwotCQkJc0J1dHRvbiA8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgPDwgIiBsXG4iOwotCQkJc0J1dHRvbiA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBsIGZcbiI7CisgICAgQ1BERl9Qb2ludCBwdDEocHRDZW50ZXIueCAtIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOLAorICAgICAgICAgICAgICAgICAgIHB0Q2VudGVyLnkgKyBQV0xfQ0JCVVRUT05fVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYpOworICAgIENQREZfUG9pbnQgcHQyKHB0Q2VudGVyLnggKyBQV0xfQ0JCVVRUT05fVFJJQU5HTEVfSEFMRkxFTiwKKyAgICAgICAgICAgICAgICAgICBwdENlbnRlci55ICsgUFdMX0NCQlVUVE9OX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmKTsKKyAgICBDUERGX1BvaW50IHB0MyhwdENlbnRlci54LAorICAgICAgICAgICAgICAgICAgIHB0Q2VudGVyLnkgLSBQV0xfQ0JCVVRUT05fVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYpOwogCi0JCQlzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IHNCdXR0b24gPDwgIlFcbiI7Ci0JCX0JCi0JfQorICAgIGlmIChJc0Zsb2F0QmlnZ2VyKHJlY3RXbmQucmlnaHQgLSByZWN0V25kLmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgUFdMX0NCQlVUVE9OX1RSSUFOR0xFX0hBTEZMRU4gKiAyKSAmJgorICAgICAgICBJc0Zsb2F0QmlnZ2VyKHJlY3RXbmQudG9wIC0gcmVjdFduZC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgUFdMX0NCQlVUVE9OX1RSSUFOR0xFX0hBTEZMRU4pKSB7CisgICAgICBzQnV0dG9uIDw8ICIwIGdcbiI7CisgICAgICBzQnV0dG9uIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiIG1cbiI7CisgICAgICBzQnV0dG9uIDw8IHB0Mi54IDw8ICIgIiA8PCBwdDIueSA8PCAiIGxcbiI7CisgICAgICBzQnV0dG9uIDw8IHB0My54IDw8ICIgIiA8PCBwdDMueSA8PCAiIGxcbiI7CisgICAgICBzQnV0dG9uIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiIGwgZlxuIjsKKworICAgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBzQnV0dG9uIDw8ICJRXG4iOworICAgIH0KKyAgfQogfQogCi12b2lkIENQV0xfQ0JCdXR0b246OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKQotewotCUNQV0xfV25kOjpEcmF3VGhpc0FwcGVhcmFuY2UocERldmljZSxwVXNlcjJEZXZpY2UpOwordm9pZCBDUFdMX0NCQnV0dG9uOjpEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSkgeworICBDUFdMX1duZDo6RHJhd1RoaXNBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSk7CiAKLQlDUERGX1JlY3QgcmVjdFduZCA9IENQV0xfV25kOjpHZXRXaW5kb3dSZWN0KCk7Ci0JCi0JaWYgKElzVmlzaWJsZSgpICYmICFyZWN0V25kLklzRW1wdHkoKSkKLQl7Ci0JCUNQREZfUG9pbnQgcHRDZW50ZXIgPSB0aGlzLT5HZXRDZW50ZXJQb2ludCgpOworICBDUERGX1JlY3QgcmVjdFduZCA9IENQV0xfV25kOjpHZXRXaW5kb3dSZWN0KCk7CiAKLQkJQ1BERl9Qb2ludCBwdDEocHRDZW50ZXIueCAtIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOLHB0Q2VudGVyLnkgKyBQV0xfQ0JCVVRUT05fVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYpOwotCQlDUERGX1BvaW50IHB0MihwdENlbnRlci54ICsgUFdMX0NCQlVUVE9OX1RSSUFOR0xFX0hBTEZMRU4scHRDZW50ZXIueSArIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOICogMC41Zik7Ci0JCUNQREZfUG9pbnQgcHQzKHB0Q2VudGVyLngscHRDZW50ZXIueSAtIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOICogMC41Zik7CisgIGlmIChJc1Zpc2libGUoKSAmJiAhcmVjdFduZC5Jc0VtcHR5KCkpIHsKKyAgICBDUERGX1BvaW50IHB0Q2VudGVyID0gR2V0Q2VudGVyUG9pbnQoKTsKIAotCQlpZiAoSXNGbG9hdEJpZ2dlcihyZWN0V25kLnJpZ2h0IC0gcmVjdFduZC5sZWZ0LFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOICogMikKLQkJCSYmCi0JCQlJc0Zsb2F0QmlnZ2VyKHJlY3RXbmQudG9wIC0gcmVjdFduZC5ib3R0b20sUFdMX0NCQlVUVE9OX1RSSUFOR0xFX0hBTEZMRU4pCi0JCQkpCi0JCXsKLQkJCUNGWF9QYXRoRGF0YSBwYXRoOworICAgIENQREZfUG9pbnQgcHQxKHB0Q2VudGVyLnggLSBQV0xfQ0JCVVRUT05fVFJJQU5HTEVfSEFMRkxFTiwKKyAgICAgICAgICAgICAgICAgICBwdENlbnRlci55ICsgUFdMX0NCQlVUVE9OX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmKTsKKyAgICBDUERGX1BvaW50IHB0MihwdENlbnRlci54ICsgUFdMX0NCQlVUVE9OX1RSSUFOR0xFX0hBTEZMRU4sCisgICAgICAgICAgICAgICAgICAgcHRDZW50ZXIueSArIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOICogMC41Zik7CisgICAgQ1BERl9Qb2ludCBwdDMocHRDZW50ZXIueCwKKyAgICAgICAgICAgICAgICAgICBwdENlbnRlci55IC0gUFdMX0NCQlVUVE9OX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmKTsKIAotCQkJcGF0aC5TZXRQb2ludENvdW50KDQpOwotCQkJcGF0aC5TZXRQb2ludCgwLCBwdDEueCwgcHQxLnksIEZYUFRfTU9WRVRPKTsKLQkJCXBhdGguU2V0UG9pbnQoMSwgcHQyLngsIHB0Mi55LCBGWFBUX0xJTkVUTyk7Ci0JCQlwYXRoLlNldFBvaW50KDIsIHB0My54LCBwdDMueSwgRlhQVF9MSU5FVE8pOwotCQkJcGF0aC5TZXRQb2ludCgzLCBwdDEueCwgcHQxLnksIEZYUFRfTElORVRPKTsKKyAgICBpZiAoSXNGbG9hdEJpZ2dlcihyZWN0V25kLnJpZ2h0IC0gcmVjdFduZC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOICogMikgJiYKKyAgICAgICAgSXNGbG9hdEJpZ2dlcihyZWN0V25kLnRvcCAtIHJlY3RXbmQuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOKSkgeworICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGg7CiAKLQkJCXBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsIE5VTEwsIAotCQkJCUNQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKFBXTF9ERUZBVUxUX0JMQUNLQ09MT1IsR2V0VHJhbnNwYXJlbmN5KCkpLCAKLQkJCQkwLCBGWEZJTExfQUxURVJOQVRFKTsKLQkJfQotCX0KKyAgICAgIHBhdGguU2V0UG9pbnRDb3VudCg0KTsKKyAgICAgIHBhdGguU2V0UG9pbnQoMCwgcHQxLngsIHB0MS55LCBGWFBUX01PVkVUTyk7CisgICAgICBwYXRoLlNldFBvaW50KDEsIHB0Mi54LCBwdDIueSwgRlhQVF9MSU5FVE8pOworICAgICAgcGF0aC5TZXRQb2ludCgyLCBwdDMueCwgcHQzLnksIEZYUFRfTElORVRPKTsKKyAgICAgIHBhdGguU2V0UG9pbnQoMywgcHQxLngsIHB0MS55LCBGWFBUX0xJTkVUTyk7CisKKyAgICAgIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihQV0xfREVGQVVMVF9CTEFDS0NPTE9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0VHJhbnNwYXJlbmN5KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgRlhGSUxMX0FMVEVSTkFURSk7CisgICAgfQorICB9CiB9CiAKLUZYX0JPT0wJQ1BXTF9DQkJ1dHRvbjo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQotewotCUNQV0xfV25kOjpPbkxCdXR0b25Eb3duKHBvaW50LG5GbGFnKTsKK0ZYX0JPT0wgQ1BXTF9DQkJ1dHRvbjo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIHsKKyAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsIG5GbGFnKTsKIAotCVNldENhcHR1cmUoKTsKKyAgU2V0Q2FwdHVyZSgpOwogCi0JaWYgKENQV0xfV25kICogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKQotCXsJCQotCQlwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLFBOTV9MQlVUVE9ORE9XTiwwLFBXTF9NQUtFRFdPUkQocG9pbnQueCxwb2ludC55KSk7Ci0JfQotCQotCXJldHVybiBUUlVFOworICBpZiAoQ1BXTF9XbmQqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkgeworICAgIHBQYXJlbnQtPk9uTm90aWZ5KHRoaXMsIFBOTV9MQlVUVE9ORE9XTiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICBQV0xfTUFLRURXT1JEKHBvaW50LngsIHBvaW50LnkpKTsKKyAgfQorCisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MCUNQV0xfQ0JCdXR0b246Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JQ1BXTF9XbmQ6Ok9uTEJ1dHRvblVwKHBvaW50LCBuRmxhZyk7CitGWF9CT09MIENQV0xfQ0JCdXR0b246Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgeworICBDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsIG5GbGFnKTsKIAotCVJlbGVhc2VDYXB0dXJlKCk7CisgIFJlbGVhc2VDYXB0dXJlKCk7CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9Db21ib0JveCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitDUFdMX0NvbWJvQm94OjpDUFdMX0NvbWJvQm94KCkKKyAgICA6IG1fcEVkaXQoTlVMTCksCisgICAgICBtX3BCdXR0b24oTlVMTCksCisgICAgICBtX3BMaXN0KE5VTEwpLAorICAgICAgbV9iUG9wdXAoRkFMU0UpLAorICAgICAgbV9uUG9wdXBXaGVyZSgwKSwKKyAgICAgIG1fblNlbGVjdEl0ZW0oLTEpLAorICAgICAgbV9wRmlsbGVyTm90aWZ5KE5VTEwpIHt9CiAKLUNQV0xfQ29tYm9Cb3g6OkNQV0xfQ29tYm9Cb3goKSA6IG1fcEVkaXQoTlVMTCksCi0JbV9wQnV0dG9uKE5VTEwpLAotCW1fcExpc3QoTlVMTCksCi0JbV9iUG9wdXAoRkFMU0UpLAotCW1fblBvcHVwV2hlcmUoMCksCi0JbV9uU2VsZWN0SXRlbSgtMSksCi0JbV9wRmlsbGVyTm90aWZ5KE5VTEwpCi17CitDRlhfQnl0ZVN0cmluZyBDUFdMX0NvbWJvQm94OjpHZXRDbGFzc05hbWUoKSBjb25zdCB7CisgIHJldHVybiAiQ1BXTF9Db21ib0JveCI7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfQ29tYm9Cb3g6OkdldENsYXNzTmFtZSgpIGNvbnN0Ci17Ci0JcmV0dXJuICJDUFdMX0NvbWJvQm94IjsKK3ZvaWQgQ1BXTF9Db21ib0JveDo6T25DcmVhdGUoUFdMX0NSRUFURVBBUkFNJiBjcCkgeworICBjcC5kd0ZsYWdzICY9IH5QV1NfSFNDUk9MTDsKKyAgY3AuZHdGbGFncyAmPSB+UFdTX1ZTQ1JPTEw7CiB9CiAKLXZvaWQgQ1BXTF9Db21ib0JveDo6T25DcmVhdGUoUFdMX0NSRUFURVBBUkFNICYgY3ApCi17Ci0JY3AuZHdGbGFncyAmPSB+UFdTX0hTQ1JPTEw7Ci0JY3AuZHdGbGFncyAmPSB+UFdTX1ZTQ1JPTEw7Cit2b2lkIENQV0xfQ29tYm9Cb3g6OlNldEZvY3VzKCkgeworICBpZiAobV9wRWRpdCkKKyAgICBtX3BFZGl0LT5TZXRGb2N1cygpOwogfQogCi12b2lkIENQV0xfQ29tYm9Cb3g6OlNldEZvY3VzKCkKLXsKLQlpZiAobV9wRWRpdCkKLQkJbV9wRWRpdC0+U2V0Rm9jdXMoKTsKK3ZvaWQgQ1BXTF9Db21ib0JveDo6S2lsbEZvY3VzKCkgeworICBTZXRQb3B1cChGQUxTRSk7CisgIENQV0xfV25kOjpLaWxsRm9jdXMoKTsKIH0KIAotdm9pZCBDUFdMX0NvbWJvQm94OjpLaWxsRm9jdXMoKQotewotCVNldFBvcHVwKEZBTFNFKTsKLQlDUFdMX1duZDo6S2lsbEZvY3VzKCk7CitDRlhfV2lkZVN0cmluZyBDUFdMX0NvbWJvQm94OjpHZXRUZXh0KCkgY29uc3QgeworICBpZiAobV9wRWRpdCkgeworICAgIHJldHVybiBtX3BFZGl0LT5HZXRUZXh0KCk7CisgIH0KKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQV0xfQ29tYm9Cb3g6OkdldFRleHQoKSBjb25zdAotewotCWlmIChtX3BFZGl0KQotCXsKLQkJcmV0dXJuIG1fcEVkaXQtPkdldFRleHQoKTsKLQl9Ci0JcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Cit2b2lkIENQV0xfQ29tYm9Cb3g6OlNldFRleHQoY29uc3QgRlhfV0NIQVIqIHRleHQpIHsKKyAgaWYgKG1fcEVkaXQpCisgICAgbV9wRWRpdC0+U2V0VGV4dCh0ZXh0KTsKIH0KIAotdm9pZCBDUFdMX0NvbWJvQm94OjpTZXRUZXh0KEZYX0xQQ1dTVFIgdGV4dCkKLXsKLQlpZiAobV9wRWRpdCkKLQkJbV9wRWRpdC0+U2V0VGV4dCh0ZXh0KTsKK3ZvaWQgQ1BXTF9Db21ib0JveDo6QWRkU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBzdHJpbmcpIHsKKyAgaWYgKG1fcExpc3QpCisgICAgbV9wTGlzdC0+QWRkU3RyaW5nKHN0cmluZyk7CiB9CiAKLXZvaWQgQ1BXTF9Db21ib0JveDo6QWRkU3RyaW5nKEZYX0xQQ1dTVFIgc3RyaW5nKQotewotCWlmIChtX3BMaXN0KQotCQltX3BMaXN0LT5BZGRTdHJpbmcoc3RyaW5nKTsKK2ludDMyX3QgQ1BXTF9Db21ib0JveDo6R2V0U2VsZWN0KCkgY29uc3QgeworICByZXR1cm4gbV9uU2VsZWN0SXRlbTsKIH0KIAotRlhfSU5UMzIgQ1BXTF9Db21ib0JveDo6R2V0U2VsZWN0KCkgY29uc3QKLXsKLQlyZXR1cm4gbV9uU2VsZWN0SXRlbTsKK3ZvaWQgQ1BXTF9Db21ib0JveDo6U2V0U2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCkgeworICBpZiAobV9wTGlzdCkKKyAgICBtX3BMaXN0LT5TZWxlY3Qobkl0ZW1JbmRleCk7CisKKyAgbV9wRWRpdC0+U2V0VGV4dChtX3BMaXN0LT5HZXRUZXh0KCkuY19zdHIoKSk7CisKKyAgbV9uU2VsZWN0SXRlbSA9IG5JdGVtSW5kZXg7CiB9CiAKLXZvaWQgQ1BXTF9Db21ib0JveDo6U2V0U2VsZWN0KEZYX0lOVDMyIG5JdGVtSW5kZXgpCi17Ci0JaWYgKG1fcExpc3QpCi0JCW1fcExpc3QtPlNlbGVjdChuSXRlbUluZGV4KTsKLQotCW1fcEVkaXQtPlNldFRleHQobV9wTGlzdC0+R2V0VGV4dCgpLmNfc3RyKCkpOwotCi0JbV9uU2VsZWN0SXRlbSA9IG5JdGVtSW5kZXg7Cit2b2lkIENQV0xfQ29tYm9Cb3g6OlNldEVkaXRTZWwoaW50MzJfdCBuU3RhcnRDaGFyLCBpbnQzMl90IG5FbmRDaGFyKSB7CisgIGlmIChtX3BFZGl0KSB7CisgICAgbV9wRWRpdC0+U2V0U2VsKG5TdGFydENoYXIsIG5FbmRDaGFyKTsKKyAgfQogfQogCi12b2lkIENQV0xfQ29tYm9Cb3g6OlNldEVkaXRTZWwoRlhfSU5UMzIgblN0YXJ0Q2hhcixGWF9JTlQzMiBuRW5kQ2hhcikKLXsKLQlpZiAobV9wRWRpdCkKLQl7Ci0JCW1fcEVkaXQtPlNldFNlbChuU3RhcnRDaGFyLG5FbmRDaGFyKTsKLQl9Cit2b2lkIENQV0xfQ29tYm9Cb3g6OkdldEVkaXRTZWwoaW50MzJfdCYgblN0YXJ0Q2hhciwgaW50MzJfdCYgbkVuZENoYXIpIGNvbnN0IHsKKyAgblN0YXJ0Q2hhciA9IC0xOworICBuRW5kQ2hhciA9IC0xOworCisgIGlmIChtX3BFZGl0KSB7CisgICAgbV9wRWRpdC0+R2V0U2VsKG5TdGFydENoYXIsIG5FbmRDaGFyKTsKKyAgfQogfQogCi12b2lkIENQV0xfQ29tYm9Cb3g6OkdldEVkaXRTZWwoRlhfSU5UMzIgJiBuU3RhcnRDaGFyLCBGWF9JTlQzMiAmIG5FbmRDaGFyKSBjb25zdAotewotCW5TdGFydENoYXIgPSAtMTsKLQluRW5kQ2hhciA9IC0xOwotCi0JaWYgKG1fcEVkaXQpCi0JewotCQltX3BFZGl0LT5HZXRTZWwoblN0YXJ0Q2hhcixuRW5kQ2hhcik7Ci0JfQordm9pZCBDUFdMX0NvbWJvQm94OjpDbGVhcigpIHsKKyAgaWYgKG1fcEVkaXQpIHsKKyAgICBtX3BFZGl0LT5DbGVhcigpOworICB9CiB9CiAKLXZvaWQgQ1BXTF9Db21ib0JveDo6Q2xlYXIoKQotewotCWlmIChtX3BFZGl0KQotCXsKLQkJbV9wRWRpdC0+Q2xlYXIoKTsKLQl9Cit2b2lkIENQV0xfQ29tYm9Cb3g6OkNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApIHsKKyAgQ3JlYXRlRWRpdChjcCk7CisgIENyZWF0ZUJ1dHRvbihjcCk7CisgIENyZWF0ZUxpc3RCb3goY3ApOwogfQogCi12b2lkIENQV0xfQ29tYm9Cb3g6OkNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKQotewotCUNyZWF0ZUVkaXQoY3ApOwotCUNyZWF0ZUJ1dHRvbihjcCk7Ci0JQ3JlYXRlTGlzdEJveChjcCk7Cit2b2lkIENQV0xfQ29tYm9Cb3g6OkNyZWF0ZUVkaXQoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCkgeworICBpZiAoIW1fcEVkaXQpIHsKKyAgICBtX3BFZGl0ID0gbmV3IENQV0xfQ0JFZGl0OworICAgIG1fcEVkaXQtPkF0dGFjaEZGTERhdGEobV9wRm9ybUZpbGxlcik7CisKKyAgICBQV0xfQ1JFQVRFUEFSQU0gZWNwID0gY3A7CisgICAgZWNwLnBQYXJlbnRXbmQgPSB0aGlzOworICAgIGVjcC5kd0ZsYWdzID0gUFdTX1ZJU0lCTEUgfCBQV1NfQ0hJTEQgfCBQV1NfQk9SREVSIHwgUEVTX0NFTlRFUiB8CisgICAgICAgICAgICAgICAgICBQRVNfQVVUT1NDUk9MTCB8IFBFU19VTkRPOworCisgICAgaWYgKEhhc0ZsYWcoUFdTX0FVVE9GT05UU0laRSkpCisgICAgICBlY3AuZHdGbGFncyB8PSBQV1NfQVVUT0ZPTlRTSVpFOworCisgICAgaWYgKCFIYXNGbGFnKFBDQlNfQUxMT1dDVVNUT01URVhUKSkKKyAgICAgIGVjcC5kd0ZsYWdzIHw9IFBXU19SRUFET05MWTsKKworICAgIGVjcC5yY1JlY3RXbmQgPSBDUERGX1JlY3QoMCwgMCwgMCwgMCk7CisgICAgZWNwLmR3Qm9yZGVyV2lkdGggPSAwOworICAgIGVjcC5uQm9yZGVyU3R5bGUgPSBQQlNfU09MSUQ7CisKKyAgICBtX3BFZGl0LT5DcmVhdGUoZWNwKTsKKyAgfQogfQogCi12b2lkIENQV0xfQ29tYm9Cb3g6OkNyZWF0ZUVkaXQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApCi17Ci0JaWYgKCFtX3BFZGl0KQotCXsKLQkJbV9wRWRpdCA9IG5ldyBDUFdMX0NCRWRpdDsKLQkJbV9wRWRpdC0+QXR0YWNoRkZMRGF0YShtX3BGb3JtRmlsbGVyKTsKK3ZvaWQgQ1BXTF9Db21ib0JveDo6Q3JlYXRlQnV0dG9uKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApIHsKKyAgaWYgKCFtX3BCdXR0b24pIHsKKyAgICBtX3BCdXR0b24gPSBuZXcgQ1BXTF9DQkJ1dHRvbjsKIAotCQlQV0xfQ1JFQVRFUEFSQU0gZWNwID0gY3A7Ci0JCWVjcC5wUGFyZW50V25kID0gdGhpczsKLQkJZWNwLmR3RmxhZ3MgPSAgUFdTX1ZJU0lCTEUgfCBQV1NfQ0hJTEQgfCBQV1NfQk9SREVSIHwgUEVTX0NFTlRFUiB8IFBFU19BVVRPU0NST0xMIHwgUEVTX1VORE87CisgICAgUFdMX0NSRUFURVBBUkFNIGJjcCA9IGNwOworICAgIGJjcC5wUGFyZW50V25kID0gdGhpczsKKyAgICBiY3AuZHdGbGFncyA9IFBXU19WSVNJQkxFIHwgUFdTX0NISUxEIHwgUFdTX0JPUkRFUiB8IFBXU19CQUNLR1JPVU5EOworICAgIGJjcC5zQmFja2dyb3VuZENvbG9yID0gUFdMX1NDUk9MTEJBUl9CS0NPTE9SOworICAgIGJjcC5zQm9yZGVyQ29sb3IgPSBQV0xfREVGQVVMVF9CTEFDS0NPTE9SOworICAgIGJjcC5kd0JvcmRlcldpZHRoID0gMjsKKyAgICBiY3AubkJvcmRlclN0eWxlID0gUEJTX0JFVkVMRUQ7CisgICAgYmNwLmVDdXJzb3JUeXBlID0gRlhDVF9BUlJPVzsKIAotCQlpZiAoSGFzRmxhZyhQV1NfQVVUT0ZPTlRTSVpFKSkKLQkJCWVjcC5kd0ZsYWdzIHw9IFBXU19BVVRPRk9OVFNJWkU7Ci0KLQkJaWYgKCFIYXNGbGFnKFBDQlNfQUxMT1dDVVNUT01URVhUKSkKLQkJCWVjcC5kd0ZsYWdzIHw9IFBXU19SRUFET05MWTsKLQotCQllY3AucmNSZWN0V25kID0gQ1BERl9SZWN0KDAsMCwwLDApOwotCQllY3AuZHdCb3JkZXJXaWR0aCA9IDA7Ci0JCWVjcC5uQm9yZGVyU3R5bGUgPSBQQlNfU09MSUQ7Ci0KLQkJbV9wRWRpdC0+Q3JlYXRlKGVjcCk7Ci0JfQorICAgIG1fcEJ1dHRvbi0+Q3JlYXRlKGJjcCk7CisgIH0KIH0KIAotdm9pZCBDUFdMX0NvbWJvQm94OjpDcmVhdGVCdXR0b24oY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApCi17Ci0JaWYgKCFtX3BCdXR0b24pCi0JewotCQltX3BCdXR0b24gPSBuZXcgQ1BXTF9DQkJ1dHRvbjsJCit2b2lkIENQV0xfQ29tYm9Cb3g6OkNyZWF0ZUxpc3RCb3goY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCkgeworICBpZiAoIW1fcExpc3QpIHsKKyAgICBtX3BMaXN0ID0gbmV3IENQV0xfQ0JMaXN0Qm94OworICAgIG1fcExpc3QtPkF0dGFjaEZGTERhdGEobV9wRm9ybUZpbGxlcik7CisgICAgUFdMX0NSRUFURVBBUkFNIGxjcCA9IGNwOworICAgIGxjcC5wUGFyZW50V25kID0gdGhpczsKKyAgICBsY3AuZHdGbGFncyA9CisgICAgICAgIFBXU19DSElMRCB8IFBXU19CT1JERVIgfCBQV1NfQkFDS0dST1VORCB8IFBMQlNfSE9WRVJTRUwgfCBQV1NfVlNDUk9MTDsKKyAgICBsY3AubkJvcmRlclN0eWxlID0gUEJTX1NPTElEOworICAgIGxjcC5kd0JvcmRlcldpZHRoID0gMTsKKyAgICBsY3AuZUN1cnNvclR5cGUgPSBGWENUX0FSUk9XOworICAgIGxjcC5yY1JlY3RXbmQgPSBDUERGX1JlY3QoMCwgMCwgMCwgMCk7CiAKLQkJUFdMX0NSRUFURVBBUkFNIGJjcCA9IGNwOwotCQliY3AucFBhcmVudFduZCA9IHRoaXM7Ci0JCWJjcC5kd0ZsYWdzID0gUFdTX1ZJU0lCTEUgfCBQV1NfQ0hJTEQgfCBQV1NfQk9SREVSIHwgUFdTX0JBQ0tHUk9VTkQ7CQotCQliY3Auc0JhY2tncm91bmRDb2xvciA9IFBXTF9TQ1JPTExCQVJfQktDT0xPUjsKLQkJYmNwLnNCb3JkZXJDb2xvciA9IFBXTF9ERUZBVUxUX0JMQUNLQ09MT1I7Ci0JCWJjcC5kd0JvcmRlcldpZHRoID0gMjsKLQkJYmNwLm5Cb3JkZXJTdHlsZSA9IFBCU19CRVZFTEVEOwotCQliY3AuZUN1cnNvclR5cGUgPSBGWENUX0FSUk9XOworICAgIGlmIChjcC5kd0ZsYWdzICYgUFdTX0FVVE9GT05UU0laRSkKKyAgICAgIGxjcC5mRm9udFNpemUgPSBQV0xDQl9ERUZBVUxURk9OVFNJWkU7CisgICAgZWxzZQorICAgICAgbGNwLmZGb250U2l6ZSA9IGNwLmZGb250U2l6ZTsKIAotCQltX3BCdXR0b24tPkNyZWF0ZShiY3ApOwotCX0KKyAgICBpZiAoY3Auc0JvcmRlckNvbG9yLm5Db2xvclR5cGUgPT0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UKQorICAgICAgbGNwLnNCb3JkZXJDb2xvciA9IFBXTF9ERUZBVUxUX0JMQUNLQ09MT1I7CisKKyAgICBpZiAoY3Auc0JhY2tncm91bmRDb2xvci5uQ29sb3JUeXBlID09IENPTE9SVFlQRV9UUkFOU1BBUkVOVCkKKyAgICAgIGxjcC5zQmFja2dyb3VuZENvbG9yID0gUFdMX0RFRkFVTFRfV0hJVEVDT0xPUjsKKworICAgIG1fcExpc3QtPkNyZWF0ZShsY3ApOworICB9CiB9CiAKLXZvaWQgQ1BXTF9Db21ib0JveDo6Q3JlYXRlTGlzdEJveChjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCkKLXsKLQlpZiAoIW1fcExpc3QpCi0JewotCQltX3BMaXN0ID0gbmV3IENQV0xfQ0JMaXN0Qm94OwotCQltX3BMaXN0LT5BdHRhY2hGRkxEYXRhKG1fcEZvcm1GaWxsZXIpOwotCQlQV0xfQ1JFQVRFUEFSQU0gbGNwID0gY3A7Ci0JCWxjcC5wUGFyZW50V25kID0gdGhpczsKLQkJbGNwLmR3RmxhZ3MgPSBQV1NfQ0hJTEQgfCBQV1NfQk9SREVSIHwgUFdTX0JBQ0tHUk9VTkQgfCBQTEJTX0hPVkVSU0VMIHwgUFdTX1ZTQ1JPTEw7Ci0JCWxjcC5uQm9yZGVyU3R5bGUgPSBQQlNfU09MSUQ7Ci0JCWxjcC5kd0JvcmRlcldpZHRoID0gMTsKLQkJbGNwLmVDdXJzb3JUeXBlID0gRlhDVF9BUlJPVzsKLQkJbGNwLnJjUmVjdFduZCA9IENQREZfUmVjdCgwLDAsMCwwKTsKK3ZvaWQgQ1BXTF9Db21ib0JveDo6UmVQb3NDaGlsZFduZCgpIHsKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwogCi0JCWlmIChjcC5kd0ZsYWdzICYgUFdTX0FVVE9GT05UU0laRSkKLQkJCWxjcC5mRm9udFNpemUgPSBQV0xDQl9ERUZBVUxURk9OVFNJWkU7Ci0JCWVsc2UKLQkJCWxjcC5mRm9udFNpemUgPSBjcC5mRm9udFNpemU7CisgIGlmIChtX2JQb3B1cCkgeworICAgIENQREZfUmVjdCByY2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworICAgIENQREZfUmVjdCByY0J1dHRvbiA9IHJjbGllbnQ7CisgICAgQ1BERl9SZWN0IHJjRWRpdCA9IHJjQ2xpZW50OworICAgIENQREZfUmVjdCByY0xpc3QgPSBDUFdMX1duZDo6R2V0V2luZG93UmVjdCgpOwogCi0JCWlmIChjcC5zQm9yZGVyQ29sb3IubkNvbG9yVHlwZSA9PSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQpCi0JCQlsY3Auc0JvcmRlckNvbG9yID0gUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUjsKKyAgICBGWF9GTE9BVCBmT2xkV2luZG93SGVpZ2h0ID0gbV9yY09sZFdpbmRvdy5IZWlnaHQoKTsKKyAgICBGWF9GTE9BVCBmT2xkQ2xpZW50SGVpZ2h0ID0gZk9sZFdpbmRvd0hlaWdodCAtIEdldEJvcmRlcldpZHRoKCkgKiAyOwogCi0JCWlmIChjcC5zQmFja2dyb3VuZENvbG9yLm5Db2xvclR5cGUgPT0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UKQotCQkJbGNwLnNCYWNrZ3JvdW5kQ29sb3IgPSBQV0xfREVGQVVMVF9XSElURUNPTE9SOwkJCisgICAgc3dpdGNoIChtX25Qb3B1cFdoZXJlKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIHJjQnV0dG9uLmxlZnQgPSByY0J1dHRvbi5yaWdodCAtIFBXTF9DT01CT0JPWF9CVVRUT05fV0lEVEg7CiAKLQkJbV9wTGlzdC0+Q3JlYXRlKGxjcCk7Ci0JfQorICAgICAgICBpZiAocmNCdXR0b24ubGVmdCA8IHJjbGllbnQubGVmdCkKKyAgICAgICAgICByY0J1dHRvbi5sZWZ0ID0gcmNsaWVudC5sZWZ0OworCisgICAgICAgIHJjQnV0dG9uLmJvdHRvbSA9IHJjQnV0dG9uLnRvcCAtIGZPbGRDbGllbnRIZWlnaHQ7CisKKyAgICAgICAgcmNFZGl0LnJpZ2h0ID0gcmNCdXR0b24ubGVmdCAtIDEuMGY7CisKKyAgICAgICAgaWYgKHJjRWRpdC5sZWZ0IDwgcmNsaWVudC5sZWZ0KQorICAgICAgICAgIHJjRWRpdC5sZWZ0ID0gcmNsaWVudC5sZWZ0OworCisgICAgICAgIGlmIChyY0VkaXQucmlnaHQgPCByY0VkaXQubGVmdCkKKyAgICAgICAgICByY0VkaXQucmlnaHQgPSByY0VkaXQubGVmdDsKKworICAgICAgICByY0VkaXQuYm90dG9tID0gcmNFZGl0LnRvcCAtIGZPbGRDbGllbnRIZWlnaHQ7CisKKyAgICAgICAgcmNMaXN0LnRvcCAtPSBmT2xkV2luZG93SGVpZ2h0OworCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOgorICAgICAgICByY0J1dHRvbi5sZWZ0ID0gcmNCdXR0b24ucmlnaHQgLSBQV0xfQ09NQk9CT1hfQlVUVE9OX1dJRFRIOworCisgICAgICAgIGlmIChyY0J1dHRvbi5sZWZ0IDwgcmNsaWVudC5sZWZ0KQorICAgICAgICAgIHJjQnV0dG9uLmxlZnQgPSByY2xpZW50LmxlZnQ7CisKKyAgICAgICAgcmNCdXR0b24udG9wID0gcmNCdXR0b24uYm90dG9tICsgZk9sZENsaWVudEhlaWdodDsKKworICAgICAgICByY0VkaXQucmlnaHQgPSByY0J1dHRvbi5sZWZ0IC0gMS4wZjsKKworICAgICAgICBpZiAocmNFZGl0LmxlZnQgPCByY2xpZW50LmxlZnQpCisgICAgICAgICAgcmNFZGl0LmxlZnQgPSByY2xpZW50LmxlZnQ7CisKKyAgICAgICAgaWYgKHJjRWRpdC5yaWdodCA8IHJjRWRpdC5sZWZ0KQorICAgICAgICAgIHJjRWRpdC5yaWdodCA9IHJjRWRpdC5sZWZ0OworCisgICAgICAgIHJjRWRpdC50b3AgPSByY0VkaXQuYm90dG9tICsgZk9sZENsaWVudEhlaWdodDsKKworICAgICAgICByY0xpc3QuYm90dG9tICs9IGZPbGRXaW5kb3dIZWlnaHQ7CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKG1fcEJ1dHRvbikKKyAgICAgIG1fcEJ1dHRvbi0+TW92ZShyY0J1dHRvbiwgVFJVRSwgRkFMU0UpOworCisgICAgaWYgKG1fcEVkaXQpCisgICAgICBtX3BFZGl0LT5Nb3ZlKHJjRWRpdCwgVFJVRSwgRkFMU0UpOworCisgICAgaWYgKG1fcExpc3QpIHsKKyAgICAgIG1fcExpc3QtPlNldFZpc2libGUoVFJVRSk7CisgICAgICBtX3BMaXN0LT5Nb3ZlKHJjTGlzdCwgVFJVRSwgRkFMU0UpOworICAgICAgbV9wTGlzdC0+U2Nyb2xsVG9MaXN0SXRlbShtX25TZWxlY3RJdGVtKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgQ1BERl9SZWN0IHJjQnV0dG9uID0gcmNDbGllbnQ7CisKKyAgICByY0J1dHRvbi5sZWZ0ID0gcmNCdXR0b24ucmlnaHQgLSBQV0xfQ09NQk9CT1hfQlVUVE9OX1dJRFRIOworCisgICAgaWYgKHJjQnV0dG9uLmxlZnQgPCByY0NsaWVudC5sZWZ0KQorICAgICAgcmNCdXR0b24ubGVmdCA9IHJjQ2xpZW50LmxlZnQ7CisKKyAgICBpZiAobV9wQnV0dG9uKQorICAgICAgbV9wQnV0dG9uLT5Nb3ZlKHJjQnV0dG9uLCBUUlVFLCBGQUxTRSk7CisKKyAgICBDUERGX1JlY3QgcmNFZGl0ID0gcmNDbGllbnQ7CisgICAgcmNFZGl0LnJpZ2h0ID0gcmNCdXR0b24ubGVmdCAtIDEuMGY7CisKKyAgICBpZiAocmNFZGl0LmxlZnQgPCByY0NsaWVudC5sZWZ0KQorICAgICAgcmNFZGl0LmxlZnQgPSByY0NsaWVudC5sZWZ0OworCisgICAgaWYgKHJjRWRpdC5yaWdodCA8IHJjRWRpdC5sZWZ0KQorICAgICAgcmNFZGl0LnJpZ2h0ID0gcmNFZGl0LmxlZnQ7CisKKyAgICBpZiAobV9wRWRpdCkKKyAgICAgIG1fcEVkaXQtPk1vdmUocmNFZGl0LCBUUlVFLCBGQUxTRSk7CisKKyAgICBpZiAobV9wTGlzdCkKKyAgICAgIG1fcExpc3QtPlNldFZpc2libGUoRkFMU0UpOworICB9CiB9CiAKLXZvaWQgQ1BXTF9Db21ib0JveDo6UmVQb3NDaGlsZFduZCgpCi17Ci0JQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwotCi0JaWYgKG1fYlBvcHVwKQotCXsKLQkJQ1BERl9SZWN0IHJjbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7Ci0JCUNQREZfUmVjdCByY0J1dHRvbiA9IHJjbGllbnQ7Ci0JCUNQREZfUmVjdCByY0VkaXQgPSByY0NsaWVudDsKLQkJQ1BERl9SZWN0IHJjTGlzdCA9IENQV0xfV25kOjpHZXRXaW5kb3dSZWN0KCk7Ci0KLQkJRlhfRkxPQVQgZk9sZFdpbmRvd0hlaWdodCA9IG1fcmNPbGRXaW5kb3cuSGVpZ2h0KCk7Ci0JCUZYX0ZMT0FUIGZPbGRDbGllbnRIZWlnaHQgPSBmT2xkV2luZG93SGVpZ2h0IC0gR2V0Qm9yZGVyV2lkdGgoKSAqIDI7Ci0JCQotCQlzd2l0Y2ggKG1fblBvcHVwV2hlcmUpCi0JCXsKLQkJY2FzZSAwOgotCQkJcmNCdXR0b24ubGVmdCA9IHJjQnV0dG9uLnJpZ2h0IC0gUFdMX0NPTUJPQk9YX0JVVFRPTl9XSURUSDsKLQotCQkJaWYgKHJjQnV0dG9uLmxlZnQgPCByY2xpZW50LmxlZnQpCi0JCQkJcmNCdXR0b24ubGVmdCA9IHJjbGllbnQubGVmdDsKLQkJCQotCQkJcmNCdXR0b24uYm90dG9tID0gcmNCdXR0b24udG9wIC0gZk9sZENsaWVudEhlaWdodDsKLQotCQkJcmNFZGl0LnJpZ2h0ID0gcmNCdXR0b24ubGVmdCAtIDEuMGY7Ci0KLQkJCWlmIChyY0VkaXQubGVmdCA8IHJjbGllbnQubGVmdCkKLQkJCQlyY0VkaXQubGVmdCA9IHJjbGllbnQubGVmdDsKLQotCQkJaWYgKHJjRWRpdC5yaWdodCA8IHJjRWRpdC5sZWZ0KQotCQkJCXJjRWRpdC5yaWdodCA9IHJjRWRpdC5sZWZ0OwotCi0JCQlyY0VkaXQuYm90dG9tID0gcmNFZGl0LnRvcCAtIGZPbGRDbGllbnRIZWlnaHQ7Ci0KLQkJCXJjTGlzdC50b3AgLT0gZk9sZFdpbmRvd0hlaWdodDsKLQotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCXJjQnV0dG9uLmxlZnQgPSByY0J1dHRvbi5yaWdodCAtIFBXTF9DT01CT0JPWF9CVVRUT05fV0lEVEg7Ci0KLQkJCWlmIChyY0J1dHRvbi5sZWZ0IDwgcmNsaWVudC5sZWZ0KQotCQkJCXJjQnV0dG9uLmxlZnQgPSByY2xpZW50LmxlZnQ7Ci0JCQkKLQkJCXJjQnV0dG9uLnRvcCA9IHJjQnV0dG9uLmJvdHRvbSArIGZPbGRDbGllbnRIZWlnaHQ7Ci0KLQkJCXJjRWRpdC5yaWdodCA9IHJjQnV0dG9uLmxlZnQgLSAxLjBmOwotCi0JCQlpZiAocmNFZGl0LmxlZnQgPCByY2xpZW50LmxlZnQpCi0JCQkJcmNFZGl0LmxlZnQgPSByY2xpZW50LmxlZnQ7Ci0KLQkJCWlmIChyY0VkaXQucmlnaHQgPCByY0VkaXQubGVmdCkKLQkJCQlyY0VkaXQucmlnaHQgPSByY0VkaXQubGVmdDsKLQotCQkJcmNFZGl0LnRvcCA9IHJjRWRpdC5ib3R0b20gKyBmT2xkQ2xpZW50SGVpZ2h0OwotCi0JCQlyY0xpc3QuYm90dG9tICs9IGZPbGRXaW5kb3dIZWlnaHQ7Ci0KLQkJCWJyZWFrOwotCQl9CQkKLQotCQlpZiAobV9wQnV0dG9uKQotCQkJbV9wQnV0dG9uLT5Nb3ZlKHJjQnV0dG9uLFRSVUUsRkFMU0UpOwotCi0JCWlmIChtX3BFZGl0KQotCQkJbV9wRWRpdC0+TW92ZShyY0VkaXQsVFJVRSxGQUxTRSk7Ci0KLQkJaWYgKG1fcExpc3QpCi0JCXsKLQkJCW1fcExpc3QtPlNldFZpc2libGUoVFJVRSk7CQkJCi0JCQltX3BMaXN0LT5Nb3ZlKHJjTGlzdCxUUlVFLEZBTFNFKTsKLQkJCW1fcExpc3QtPlNjcm9sbFRvTGlzdEl0ZW0obV9uU2VsZWN0SXRlbSk7Ci0JCX0KLQl9Ci0JZWxzZQotCXsJCQotCQlDUERGX1JlY3QgcmNCdXR0b24gPSByY0NsaWVudDsKLQotCQlyY0J1dHRvbi5sZWZ0ID0gcmNCdXR0b24ucmlnaHQgLSBQV0xfQ09NQk9CT1hfQlVUVE9OX1dJRFRIOwkKLQkJCi0JCWlmIChyY0J1dHRvbi5sZWZ0IDwgcmNDbGllbnQubGVmdCkKLQkJCXJjQnV0dG9uLmxlZnQgPSByY0NsaWVudC5sZWZ0OwotCi0JCWlmIChtX3BCdXR0b24pCi0JCQltX3BCdXR0b24tPk1vdmUocmNCdXR0b24sVFJVRSxGQUxTRSk7Ci0KLQkJQ1BERl9SZWN0IHJjRWRpdCA9IHJjQ2xpZW50OwotCQlyY0VkaXQucmlnaHQgPSByY0J1dHRvbi5sZWZ0IC0gMS4wZjsKLQotCQlpZiAocmNFZGl0LmxlZnQgPCByY0NsaWVudC5sZWZ0KQotCQkJcmNFZGl0LmxlZnQgPSByY0NsaWVudC5sZWZ0OwotCi0JCWlmIChyY0VkaXQucmlnaHQgPCByY0VkaXQubGVmdCkKLQkJCXJjRWRpdC5yaWdodCA9IHJjRWRpdC5sZWZ0OwotCi0JCWlmIChtX3BFZGl0KQotCQkJbV9wRWRpdC0+TW92ZShyY0VkaXQsVFJVRSxGQUxTRSk7Ci0KLQkJaWYgKG1fcExpc3QpCi0JCQltX3BMaXN0LT5TZXRWaXNpYmxlKEZBTFNFKTsKLQl9Cit2b2lkIENQV0xfQ29tYm9Cb3g6OlNlbGVjdEFsbCgpIHsKKyAgaWYgKG1fcEVkaXQgJiYgSGFzRmxhZyhQQ0JTX0FMTE9XQ1VTVE9NVEVYVCkpCisgICAgbV9wRWRpdC0+U2VsZWN0QWxsKCk7CiB9CiAKLXZvaWQgQ1BXTF9Db21ib0JveDo6U2VsZWN0QWxsKCkKLXsKLQlpZiAobV9wRWRpdCAmJiBIYXNGbGFnKFBDQlNfQUxMT1dDVVNUT01URVhUKSkKLQkJbV9wRWRpdC0+U2VsZWN0QWxsKCk7CitDUERGX1JlY3QgQ1BXTF9Db21ib0JveDo6R2V0Rm9jdXNSZWN0KCkgY29uc3QgeworICByZXR1cm4gQ1BERl9SZWN0KCk7CiB9CiAKLUNQREZfUmVjdCBDUFdMX0NvbWJvQm94OjpHZXRGb2N1c1JlY3QoKSBjb25zdAotewotCXJldHVybiBDUERGX1JlY3QoKTsKK3ZvaWQgQ1BXTF9Db21ib0JveDo6U2V0UG9wdXAoRlhfQk9PTCBiUG9wdXApIHsKKyAgaWYgKCFtX3BMaXN0KQorICAgIHJldHVybjsKKyAgaWYgKGJQb3B1cCA9PSBtX2JQb3B1cCkKKyAgICByZXR1cm47CisgIEZYX0ZMT0FUIGZMaXN0SGVpZ2h0ID0gbV9wTGlzdC0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKKyAgaWYgKCFJc0Zsb2F0QmlnZ2VyKGZMaXN0SGVpZ2h0LCAwLjBmKSkKKyAgICByZXR1cm47CisKKyAgaWYgKGJQb3B1cCkgeworICAgIGlmIChtX3BGaWxsZXJOb3RpZnkpIHsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICAgICAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOworICAgICAgbV9wRmlsbGVyTm90aWZ5LT5PblBvcHVwUHJlT3BlbihHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsIDApOworICAgICAgaWYgKGJFeGl0KQorICAgICAgICByZXR1cm47CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisgICAgICBpbnQzMl90IG5XaGVyZSA9IDA7CisgICAgICBGWF9GTE9BVCBmUG9wdXBSZXQgPSAwLjBmOworICAgICAgRlhfRkxPQVQgZlBvcHVwTWluID0gMC4wZjsKKyAgICAgIGlmIChtX3BMaXN0LT5HZXRDb3VudCgpID4gMykKKyAgICAgICAgZlBvcHVwTWluID0KKyAgICAgICAgICAgIG1fcExpc3QtPkdldEZpcnN0SGVpZ2h0KCkgKiAzICsgbV9wTGlzdC0+R2V0Qm9yZGVyV2lkdGgoKSAqIDI7CisgICAgICBGWF9GTE9BVCBmUG9wdXBNYXggPSBmTGlzdEhlaWdodCArIG1fcExpc3QtPkdldEJvcmRlcldpZHRoKCkgKiAyOworICAgICAgbV9wRmlsbGVyTm90aWZ5LT5RdWVyeVdoZXJlUG9wdXAoR2V0QXR0YWNoZWREYXRhKCksIGZQb3B1cE1pbiwgZlBvcHVwTWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbldoZXJlLCBmUG9wdXBSZXQpOworCisgICAgICBpZiAoSXNGbG9hdEJpZ2dlcihmUG9wdXBSZXQsIDAuMGYpKSB7CisgICAgICAgIG1fYlBvcHVwID0gYlBvcHVwOworCisgICAgICAgIENQREZfUmVjdCByY1dpbmRvdyA9IENQV0xfV25kOjpHZXRXaW5kb3dSZWN0KCk7CisgICAgICAgIG1fcmNPbGRXaW5kb3cgPSByY1dpbmRvdzsKKyAgICAgICAgc3dpdGNoIChuV2hlcmUpIHsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHJjV2luZG93LmJvdHRvbSAtPSBmUG9wdXBSZXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICByY1dpbmRvdy50b3AgKz0gZlBvcHVwUmV0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtX25Qb3B1cFdoZXJlID0gbldoZXJlOworICAgICAgICBNb3ZlKHJjV2luZG93LCBUUlVFLCBUUlVFKTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICAgICAgICBiRXhpdCA9IEZBTFNFOworICAgICAgICBtX3BGaWxsZXJOb3RpZnktPk9uUG9wdXBQb3N0T3BlbihHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsIDApOworICAgICAgICBpZiAoYkV4aXQpCisgICAgICAgICAgcmV0dXJuOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtX2JQb3B1cCA9IGJQb3B1cDsKKyAgICBNb3ZlKG1fcmNPbGRXaW5kb3csIFRSVUUsIFRSVUUpOworICB9CiB9CiAKLXZvaWQgQ1BXTF9Db21ib0JveDo6U2V0UG9wdXAoRlhfQk9PTCBiUG9wdXApCi17Ci0JaWYgKCFtX3BMaXN0KSByZXR1cm47Ci0JaWYgKGJQb3B1cCA9PSBtX2JQb3B1cCkgcmV0dXJuOwotCUZYX0ZMT0FUIGZMaXN0SGVpZ2h0ID0gbV9wTGlzdC0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKLQlpZiAoIUlzRmxvYXRCaWdnZXIoZkxpc3RIZWlnaHQsMC4wZikpIHJldHVybjsKK0ZYX0JPT0wgQ1BXTF9Db21ib0JveDo6T25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKSB7CisgIGlmICghbV9wTGlzdCkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmICghbV9wRWRpdCkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlpZiAoYlBvcHVwKQotCXsKLQkJaWYgKG1fcEZpbGxlck5vdGlmeSkKLQkJewotCQkJRlhfSU5UMzIgbldoZXJlID0gMDsKLQkJCUZYX0ZMT0FUIGZQb3B1cFJldCA9IDAuMGY7Ci0JCQlGWF9GTE9BVCBmUG9wdXBNaW4gPSAwLjBmOwotCQkJaWYgKG1fcExpc3QtPkdldENvdW50KCkgPiAzKQotCQkJCWZQb3B1cE1pbiA9IG1fcExpc3QtPkdldEZpcnN0SGVpZ2h0KCkgKiAzICsgbV9wTGlzdC0+R2V0Qm9yZGVyV2lkdGgoKSAqIDI7Ci0JCQlGWF9GTE9BVCBmUG9wdXBNYXggPSBmTGlzdEhlaWdodCArIG1fcExpc3QtPkdldEJvcmRlcldpZHRoKCkgKiAyOwotCQkJbV9wRmlsbGVyTm90aWZ5LT5RdWVyeVdoZXJlUG9wdXAoR2V0QXR0YWNoZWREYXRhKCksIGZQb3B1cE1pbixmUG9wdXBNYXgsbldoZXJlLGZQb3B1cFJldCk7CisgIG1fblNlbGVjdEl0ZW0gPSAtMTsKIAotCQkJaWYgKElzRmxvYXRCaWdnZXIoZlBvcHVwUmV0LDAuMGYpKQotCQkJewotCQkJCW1fYlBvcHVwID0gYlBvcHVwOworICBzd2l0Y2ggKG5DaGFyKSB7CisgICAgY2FzZSBGV0xfVktFWV9VcDoKKyAgICAgIGlmIChtX3BMaXN0LT5HZXRDdXJTZWwoKSA+IDApIHsKKyAgICAgICAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgICAgICAgIGlmIChtX3BGaWxsZXJOb3RpZnkpIHsKKyAgICAgICAgICBtX3BGaWxsZXJOb3RpZnktPk9uUG9wdXBQcmVPcGVuKEdldEF0dGFjaGVkRGF0YSgpLCBiRXhpdCwgbkZsYWcpOworICAgICAgICAgIGlmIChiRXhpdCkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICBiRXhpdCA9IEZBTFNFOworICAgICAgICAgIG1fcEZpbGxlck5vdGlmeS0+T25Qb3B1cFBvc3RPcGVuKEdldEF0dGFjaGVkRGF0YSgpLCBiRXhpdCwgbkZsYWcpOworICAgICAgICAgIGlmIChiRXhpdCkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICAgICAgICBpZiAobV9wTGlzdC0+T25LZXlEb3duV2l0aEV4aXQobkNoYXIsIGJFeGl0LCBuRmxhZykpIHsKKyAgICAgICAgICBpZiAoYkV4aXQpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgU2V0U2VsZWN0VGV4dCgpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gVFJVRTsKKyAgICBjYXNlIEZXTF9WS0VZX0Rvd246CisgICAgICBpZiAobV9wTGlzdC0+R2V0Q3VyU2VsKCkgPCBtX3BMaXN0LT5HZXRDb3VudCgpIC0gMSkgeworICAgICAgICBGWF9CT09MIGJFeGl0ID0gRkFMU0U7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgICAgICAgaWYgKG1fcEZpbGxlck5vdGlmeSkgeworICAgICAgICAgIG1fcEZpbGxlck5vdGlmeS0+T25Qb3B1cFByZU9wZW4oR2V0QXR0YWNoZWREYXRhKCksIGJFeGl0LCBuRmxhZyk7CisgICAgICAgICAgaWYgKGJFeGl0KQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgIGJFeGl0ID0gRkFMU0U7CisgICAgICAgICAgbV9wRmlsbGVyTm90aWZ5LT5PblBvcHVwUG9zdE9wZW4oR2V0QXR0YWNoZWREYXRhKCksIGJFeGl0LCBuRmxhZyk7CisgICAgICAgICAgaWYgKGJFeGl0KQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisgICAgICAgIGlmIChtX3BMaXN0LT5PbktleURvd25XaXRoRXhpdChuQ2hhciwgYkV4aXQsIG5GbGFnKSkgeworICAgICAgICAgIGlmIChiRXhpdCkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICBTZXRTZWxlY3RUZXh0KCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBUUlVFOworICB9CiAKLQkJCQlDUERGX1JlY3QgcmNXaW5kb3cgPSBDUFdMX1duZDo6R2V0V2luZG93UmVjdCgpOwotCQkJCW1fcmNPbGRXaW5kb3cgPSByY1dpbmRvdzsKLQkJCQlzd2l0Y2ggKG5XaGVyZSkKLQkJCQl7Ci0JCQkJZGVmYXVsdDoKLQkJCQljYXNlIDA6Ci0JCQkJCXJjV2luZG93LmJvdHRvbSAtPSBmUG9wdXBSZXQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMToKLQkJCQkJcmNXaW5kb3cudG9wICs9IGZQb3B1cFJldDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCQotCQkJCW1fblBvcHVwV2hlcmUgPSBuV2hlcmU7Ci0JCQkJTW92ZShyY1dpbmRvdywgVFJVRSwgVFJVRSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJbV9iUG9wdXAgPSBiUG9wdXA7Ci0JCU1vdmUobV9yY09sZFdpbmRvdywgVFJVRSwgVFJVRSk7Ci0JfQorICBpZiAoSGFzRmxhZyhQQ0JTX0FMTE9XQ1VTVE9NVEVYVCkpCisgICAgcmV0dXJuIG1fcEVkaXQtPk9uS2V5RG93bihuQ2hhciwgbkZsYWcpOworCisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTCBDUFdMX0NvbWJvQm94OjpPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JaWYgKCFtX3BMaXN0KSByZXR1cm4gRkFMU0U7Ci0JaWYgKCFtX3BFZGl0KSByZXR1cm4gRkFMU0U7CitGWF9CT09MIENQV0xfQ29tYm9Cb3g6Ok9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykgeworICBpZiAoIW1fcExpc3QpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JbV9uU2VsZWN0SXRlbSA9IC0xOworICBpZiAoIW1fcEVkaXQpCisgICAgcmV0dXJuIEZBTFNFOwogCi0Jc3dpdGNoIChuQ2hhcikKLQl7Ci0JY2FzZSBGV0xfVktFWV9VcDoKLQkJaWYgKG1fcExpc3QtPkdldEN1clNlbCgpID4gMCkKLQkJewotCQkJRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwotCQkJaWYgKG1fcExpc3QtPk9uS2V5RG93bldpdGhFeGl0KG5DaGFyLGJFeGl0LG5GbGFnKSkKLQkJCXsKLQkJCQlpZiAoYkV4aXQpIHJldHVybiBGQUxTRTsKLQkJCQlTZXRTZWxlY3RUZXh0KCk7CQkJCQotCQkJfQotCQl9Ci0JCXJldHVybiBUUlVFOwotCWNhc2UgRldMX1ZLRVlfRG93bjoKLQkJaWYgKG1fcExpc3QtPkdldEN1clNlbCgpIDwgbV9wTGlzdC0+R2V0Q291bnQoKSAtIDEpCi0JCXsKLQkJCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKLQkJCWlmIChtX3BMaXN0LT5PbktleURvd25XaXRoRXhpdChuQ2hhcixiRXhpdCxuRmxhZykpCi0JCQl7Ci0JCQkJaWYgKGJFeGl0KSByZXR1cm4gRkFMU0U7Ci0JCQkJU2V0U2VsZWN0VGV4dCgpOwkJCQkKLQkJCX0KLQkJfQotCQlyZXR1cm4gVFJVRTsKLQl9CisgIG1fblNlbGVjdEl0ZW0gPSAtMTsKKyAgaWYgKEhhc0ZsYWcoUENCU19BTExPV0NVU1RPTVRFWFQpKQorICAgIHJldHVybiBtX3BFZGl0LT5PbkNoYXIobkNoYXIsIG5GbGFnKTsKIAotCWlmIChIYXNGbGFnKFBDQlNfQUxMT1dDVVNUT01URVhUKSkKLQkJcmV0dXJuIG1fcEVkaXQtPk9uS2V5RG93bihuQ2hhcixuRmxhZyk7Ci0JZWxzZQotCQlyZXR1cm4gRkFMU0U7CisgIEZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBpZiAobV9wRmlsbGVyTm90aWZ5KSB7CisgICAgbV9wRmlsbGVyTm90aWZ5LT5PblBvcHVwUHJlT3BlbihHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsIG5GbGFnKTsKKyAgICBpZiAoYkV4aXQpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBtX3BGaWxsZXJOb3RpZnktPk9uUG9wdXBQb3N0T3BlbihHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsIG5GbGFnKTsKKyAgICBpZiAoYkV4aXQpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgcmV0dXJuIG1fcExpc3QtPk9uQ2hhcldpdGhFeGl0KG5DaGFyLCBiRXhpdCwgbkZsYWcpID8gYkV4aXQgOiBGQUxTRTsKIH0KIAotRlhfQk9PTCBDUFdMX0NvbWJvQm94OjpPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JaWYgKCFtX3BMaXN0KSByZXR1cm4gRkFMU0U7Ci0JaWYgKCFtX3BFZGl0KSByZXR1cm4gRkFMU0U7Cit2b2lkIENQV0xfQ29tYm9Cb3g6Ok9uTm90aWZ5KENQV0xfV25kKiBwV25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHdQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbFBhcmFtKSB7CisgIHN3aXRjaCAobXNnKSB7CisgICAgY2FzZSBQTk1fTEJVVFRPTkRPV046CisgICAgICBpZiAocFduZCA9PSBtX3BCdXR0b24pIHsKKyAgICAgICAgU2V0UG9wdXAoIW1fYlBvcHVwKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQTk1fTEJVVFRPTlVQOgorICAgICAgaWYgKG1fcEVkaXQgJiYgbV9wTGlzdCkgeworICAgICAgICBpZiAocFduZCA9PSBtX3BMaXN0KSB7CisgICAgICAgICAgU2V0U2VsZWN0VGV4dCgpOworICAgICAgICAgIFNlbGVjdEFsbCgpOworICAgICAgICAgIG1fcEVkaXQtPlNldEZvY3VzKCk7CisgICAgICAgICAgU2V0UG9wdXAoRkFMU0UpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICB9CiAKLQltX25TZWxlY3RJdGVtID0gLTE7Ci0JRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwotCi0JaWYgKEhhc0ZsYWcoUENCU19BTExPV0NVU1RPTVRFWFQpKQotCXsKLQkJcmV0dXJuIG1fcEVkaXQtPk9uQ2hhcihuQ2hhcixuRmxhZyk7CQkJCi0JfQotCWVsc2UKLQl7Ci0JCWlmIChtX3BMaXN0LT5PbkNoYXJXaXRoRXhpdChuQ2hhcixiRXhpdCxuRmxhZykpCi0JCXsKLQkJCXJldHVybiBiRXhpdDsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gRkFMU0U7Ci0JfQorICBDUFdMX1duZDo6T25Ob3RpZnkocFduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7CiB9CiAKLXZvaWQgQ1BXTF9Db21ib0JveDo6T25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgRlhfSU5UUFRSIHdQYXJhbSwgRlhfSU5UUFRSIGxQYXJhbSkKLXsKLQlzd2l0Y2ggKG1zZykKLQl7Ci0JY2FzZSBQTk1fTEJVVFRPTkRPV046Ci0JCWlmIChwV25kID09IG1fcEJ1dHRvbikKLQkJewotCQkJU2V0UG9wdXAoIW1fYlBvcHVwKTsKLQkJCXJldHVybjsKLQkJfQotCQlicmVhazsKLQljYXNlIFBOTV9MQlVUVE9OVVA6Ci0JCWlmIChtX3BFZGl0ICYmIG1fcExpc3QpCi0JCXsKLQkJCWlmIChwV25kID09IG1fcExpc3QpCi0JCQl7CQkJCi0JCQkJU2V0U2VsZWN0VGV4dCgpOwotCQkJCVNlbGVjdEFsbCgpOwotCQkJCW1fcEVkaXQtPlNldEZvY3VzKCk7Ci0JCQkJU2V0UG9wdXAoRkFMU0UpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCUNQV0xfV25kOjpPbk5vdGlmeShwV25kLG1zZyx3UGFyYW0sbFBhcmFtKTsKK0ZYX0JPT0wgQ1BXTF9Db21ib0JveDo6SXNQb3B1cCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fYlBvcHVwOwogfQogCi1GWF9CT09MIENQV0xfQ29tYm9Cb3g6OklzUG9wdXAoKSBjb25zdAotewotCXJldHVybiBtX2JQb3B1cDsKK3ZvaWQgQ1BXTF9Db21ib0JveDo6U2V0U2VsZWN0VGV4dCgpIHsKKyAgQ0ZYX1dpZGVTdHJpbmcgc3dUZXh0ID0gbV9wTGlzdC0+R2V0VGV4dCgpOworICBtX3BFZGl0LT5TZWxlY3RBbGwoKTsKKyAgbV9wRWRpdC0+UmVwbGFjZVNlbChtX3BMaXN0LT5HZXRUZXh0KCkuY19zdHIoKSk7CisgIG1fcEVkaXQtPlNlbGVjdEFsbCgpOworCisgIG1fblNlbGVjdEl0ZW0gPSBtX3BMaXN0LT5HZXRDdXJTZWwoKTsKIH0KIAotdm9pZCBDUFdMX0NvbWJvQm94OjpTZXRTZWxlY3RUZXh0KCkKLXsKLQlDRlhfV2lkZVN0cmluZyBzd1RleHQgPSBtX3BMaXN0LT5HZXRUZXh0KCk7Ci0JbV9wRWRpdC0+U2VsZWN0QWxsKCk7Ci0JbV9wRWRpdC0+UmVwbGFjZVNlbChtX3BMaXN0LT5HZXRUZXh0KCkuY19zdHIoKSk7Ci0JbV9wRWRpdC0+U2VsZWN0QWxsKCk7Cit2b2lkIENQV0xfQ29tYm9Cb3g6OlNldEZpbGxlck5vdGlmeShJUFdMX0ZpbGxlcl9Ob3RpZnkqIHBOb3RpZnkpIHsKKyAgbV9wRmlsbGVyTm90aWZ5ID0gcE5vdGlmeTsKIAotCW1fblNlbGVjdEl0ZW0gPSBtX3BMaXN0LT5HZXRDdXJTZWwoKTsKKyAgaWYgKG1fcEVkaXQpCisgICAgbV9wRWRpdC0+U2V0RmlsbGVyTm90aWZ5KHBOb3RpZnkpOworCisgIGlmIChtX3BMaXN0KQorICAgIG1fcExpc3QtPlNldEZpbGxlck5vdGlmeShwTm90aWZ5KTsKIH0KLQotRlhfQk9PTCBDUFdMX0NvbWJvQm94OjpJc01vZGlmaWVkKCkgY29uc3QKLXsKLQlyZXR1cm4gbV9wRWRpdC0+SXNNb2RpZmllZCgpOwotfQotCi12b2lkIENQV0xfQ29tYm9Cb3g6OlNldEZpbGxlck5vdGlmeShJUFdMX0ZpbGxlcl9Ob3RpZnkqIHBOb3RpZnkpCi17Ci0JIG1fcEZpbGxlck5vdGlmeSA9IHBOb3RpZnk7Ci0KLQkgaWYgKG1fcEVkaXQpCi0JCSBtX3BFZGl0LT5TZXRGaWxsZXJOb3RpZnkocE5vdGlmeSk7Ci0KLQkgaWYgKG1fcExpc3QpCi0JCSBtX3BMaXN0LT5TZXRGaWxsZXJOb3RpZnkocE5vdGlmeSk7Ci19Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfRWRpdC5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0VkaXQuY3BwCmluZGV4IDY3OGRhNjguLjhkZGI3ZGYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfRWRpdC5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9FZGl0LmNwcApAQCAtMSwxMzIwICsxLDExODcgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BERldpbmRvdy5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9XbmQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRWRpdEN0cmwuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRWRpdC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfVXRpbHMuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQ2FyZXQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRm9udE1hcC5oIgotI2luY2x1ZGUgIi4uLy4uLy4uL2NvcmUvc3JjL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9FZGl0LmgiCiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9FZGl0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zYWZlX3R5cGVzLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3htbC5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0NhcmV0LmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRWRpdEN0cmwuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Gb250TWFwLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU2Nyb2xsQmFyLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfVXRpbHMuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9XbmQuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9md2xldmVudC5oIgogCi1DUFdMX0VkaXQ6OkNQV0xfRWRpdCgpIDogbV9wRmlsbGVyTm90aWZ5KE5VTEwpLCAKLQltX3BTcGVsbENoZWNrKE5VTEwpLAotCW1fYkZvY3VzKEZBTFNFKQotewotCW1fcEZvcm1GaWxsZXIgPSBOVUxMOworQ1BXTF9FZGl0OjpDUFdMX0VkaXQoKQorICAgIDogbV9wRmlsbGVyTm90aWZ5KE5VTEwpLCBtX3BTcGVsbENoZWNrKE5VTEwpLCBtX2JGb2N1cyhGQUxTRSkgeworICBtX3BGb3JtRmlsbGVyID0gTlVMTDsKIH0KIAotQ1BXTF9FZGl0Ojp+Q1BXTF9FZGl0KCkKLXsKLQlBU1NFUlQobV9iRm9jdXMgPT0gRkFMU0UpOworQ1BXTF9FZGl0Ojp+Q1BXTF9FZGl0KCkgeworICBBU1NFUlQobV9iRm9jdXMgPT0gRkFMU0UpOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUFdMX0VkaXQ6OkdldENsYXNzTmFtZSgpIGNvbnN0Ci17Ci0JcmV0dXJuIFBXTF9DTEFTU05BTUVfRURJVDsKK0NGWF9CeXRlU3RyaW5nIENQV0xfRWRpdDo6R2V0Q2xhc3NOYW1lKCkgY29uc3QgeworICByZXR1cm4gUFdMX0NMQVNTTkFNRV9FRElUOwogfQogCi12b2lkIENQV0xfRWRpdDo6T25EZXN0cm95KCkKLXsKK3ZvaWQgQ1BXTF9FZGl0OjpPbkRlc3Ryb3koKSB7fQorCit2b2lkIENQV0xfRWRpdDo6U2V0VGV4dChjb25zdCBGWF9XQ0hBUiogY3NUZXh0KSB7CisgIENGWF9XaWRlU3RyaW5nIHN3VGV4dCA9IGNzVGV4dDsKKworICBpZiAoSGFzRmxhZyhQRVNfUklDSCkpIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBzVmFsdWUgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoc3dUZXh0KTsKKworICAgIGlmIChDWE1MX0VsZW1lbnQqIHBYTUwgPQorICAgICAgICAgICAgQ1hNTF9FbGVtZW50OjpQYXJzZShzVmFsdWUuY19zdHIoKSwgc1ZhbHVlLkdldExlbmd0aCgpKSkgeworICAgICAgaW50MzJfdCBuQ291bnQgPSBwWE1MLT5Db3VudENoaWxkcmVuKCk7CisgICAgICBGWF9CT09MIGJGaXJzdCA9IFRSVUU7CisKKyAgICAgIHN3VGV4dC5FbXB0eSgpOworCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgeworICAgICAgICBpZiAoQ1hNTF9FbGVtZW50KiBwU3ViRWxlbWVudCA9IHBYTUwtPkdldEVsZW1lbnQoaSkpIHsKKyAgICAgICAgICBDRlhfQnl0ZVN0cmluZyB0YWcgPSBwU3ViRWxlbWVudC0+R2V0VGFnTmFtZSgpOworICAgICAgICAgIGlmICh0YWcuRXF1YWxOb0Nhc2UoInAiKSkgeworICAgICAgICAgICAgaW50IG5DaGlsZCA9IHBTdWJFbGVtZW50LT5Db3VudENoaWxkcmVuKCk7CisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzd1NlY3Rpb247CisgICAgICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBuQ2hpbGQ7IGorKykgeworICAgICAgICAgICAgICBzd1NlY3Rpb24gKz0gcFN1YkVsZW1lbnQtPkdldENvbnRlbnQoaik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChiRmlyc3QpCisgICAgICAgICAgICAgIGJGaXJzdCA9IEZBTFNFOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBzd1RleHQgKz0gRldMX1ZLRVlfUmV0dXJuOworICAgICAgICAgICAgc3dUZXh0ICs9IHN3U2VjdGlvbjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZGVsZXRlIHBYTUw7CisgICAgfQorICB9CisKKyAgbV9wRWRpdC0+U2V0VGV4dChzd1RleHQuY19zdHIoKSk7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0OjpTZXRUZXh0KEZYX0xQQ1dTVFIgY3NUZXh0KQotewotCUNGWF9XaWRlU3RyaW5nIHN3VGV4dCA9IGNzVGV4dDsKK3ZvaWQgQ1BXTF9FZGl0OjpSZVBvc0NoaWxkV25kKCkgeworICBpZiAoQ1BXTF9TY3JvbGxCYXIqIHBWU0IgPSBHZXRWU2Nyb2xsQmFyKCkpIHsKKyAgICBDUERGX1JlY3QgcmNXaW5kb3cgPSBtX3JjT2xkV2luZG93OworICAgIENQREZfUmVjdCByY1ZTY3JvbGwgPQorICAgICAgICBDUERGX1JlY3QocmNXaW5kb3cucmlnaHQsIHJjV2luZG93LmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgIHJjV2luZG93LnJpZ2h0ICsgUFdMX1NDUk9MTEJBUl9XSURUSCwgcmNXaW5kb3cudG9wKTsKKyAgICBwVlNCLT5Nb3ZlKHJjVlNjcm9sbCwgVFJVRSwgRkFMU0UpOworICB9CiAKLQlpZiAoSGFzRmxhZyhQRVNfUklDSCkpCi0JewkJCi0JCUNGWF9CeXRlU3RyaW5nIHNWYWx1ZSA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShzd1RleHQpOwotCQkKLQkJaWYgKENYTUxfRWxlbWVudCAqIHBYTUwgPSBDWE1MX0VsZW1lbnQ6OlBhcnNlKHNWYWx1ZS5jX3N0cigpLCBzVmFsdWUuR2V0TGVuZ3RoKCkpKQotCQl7Ci0JCQlGWF9JTlQzMiBuQ291bnQgPSBwWE1MLT5Db3VudENoaWxkcmVuKCk7Ci0JCQlGWF9CT09MIGJGaXJzdCA9IFRSVUU7CisgIGlmIChtX3BFZGl0Q2FyZXQgJiYgIUhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykpCisgICAgbV9wRWRpdENhcmV0LT5TZXRDbGlwUmVjdChDUFdMX1V0aWxzOjpJbmZsYXRlUmVjdCgKKyAgICAgICAgR2V0Q2xpZW50UmVjdCgpLCAxLjBmKSk7ICAvLysxIGZvciBjYXJldCBiZXNpZGUgYm9yZGVyCiAKLQkJCXN3VGV4dC5FbXB0eSgpOwotCi0JCQlmb3IgKEZYX0lOVDMyIGk9MDsgaTxuQ291bnQ7IGkrKykKLQkJCXsKLQkJCQlpZiAoQ1hNTF9FbGVtZW50ICogcFN1YkVsZW1lbnQgPSBwWE1MLT5HZXRFbGVtZW50KGkpKQotCQkJCXsKLQkJCQkJQ0ZYX0J5dGVTdHJpbmcgdGFnPXBTdWJFbGVtZW50LT5HZXRUYWdOYW1lKCk7Ci0JCSAgIAkJCWlmICh0YWcuRXF1YWxOb0Nhc2UoInAiKSkKLQkJCQkJewotCQkJCQkJaW50IG5DaGlsZCA9IHBTdWJFbGVtZW50LT5Db3VudENoaWxkcmVuKCk7Ci0JCQkJCQlDRlhfV2lkZVN0cmluZyBzd1NlY3Rpb247Ci0JCQkJCQlmb3IoRlhfSU5UMzIgaj0wOyBqPG5DaGlsZDsgaisrKQotCQkJCQkJewotCQkJCQkJCXN3U2VjdGlvbiArPSBwU3ViRWxlbWVudC0+R2V0Q29udGVudChqKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJaWYgKGJGaXJzdCliRmlyc3QgPSBGQUxTRTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlzd1RleHQgKz0gRldMX1ZLRVlfUmV0dXJuOwotCQkJCQkJc3dUZXh0ICs9IHN3U2VjdGlvbjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJZGVsZXRlIHBYTUw7Ci0JCX0KLQl9CQotCi0JbV9wRWRpdC0+U2V0VGV4dChzd1RleHQuY19zdHIoKSk7CisgIENQV0xfRWRpdEN0cmw6OlJlUG9zQ2hpbGRXbmQoKTsKIH0KIAotdm9pZCBDUFdMX0VkaXQ6OlJlUG9zQ2hpbGRXbmQoKQotewotCWlmIChDUFdMX1Njcm9sbEJhciAqIHBWU0IgPSB0aGlzLT5HZXRWU2Nyb2xsQmFyKCkpCi0JewotCQkvL2lmIChwVlNCLT5Jc1Zpc2libGUoKSkKLQkJewotCQkJQ1BERl9SZWN0IHJjV2luZG93ID0gbV9yY09sZFdpbmRvdzsJCQotCQkJQ1BERl9SZWN0IHJjVlNjcm9sbCA9IENQREZfUmVjdChyY1dpbmRvdy5yaWdodCwKLQkJCQkJCQkJcmNXaW5kb3cuYm90dG9tLAotCQkJCQkJCQlyY1dpbmRvdy5yaWdodCArIFBXTF9TQ1JPTExCQVJfV0lEVEgsCi0JCQkJCQkJCXJjV2luZG93LnRvcCk7Ci0JCQlwVlNCLT5Nb3ZlKHJjVlNjcm9sbCwgVFJVRSwgRkFMU0UpOwotCQl9Ci0JfQorQ1BERl9SZWN0IENQV0xfRWRpdDo6R2V0Q2xpZW50UmVjdCgpIGNvbnN0IHsKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QoCisgICAgICBHZXRXaW5kb3dSZWN0KCksIChGWF9GTE9BVCkoR2V0Qm9yZGVyV2lkdGgoKSArIEdldElubmVyQm9yZGVyV2lkdGgoKSkpOwogCi0JaWYgKG1fcEVkaXRDYXJldCAmJiAhSGFzRmxhZyhQRVNfVEVYVE9WRVJGTE9XKSkKLQkJbV9wRWRpdENhcmV0LT5TZXRDbGlwUmVjdChDUFdMX1V0aWxzOjpJbmZsYXRlUmVjdChHZXRDbGllbnRSZWN0KCksMS4wZikpOyAvLysxIGZvciBjYXJldCBiZXNpZGUgYm9yZGVyCisgIGlmIChDUFdMX1Njcm9sbEJhciogcFZTQiA9IEdldFZTY3JvbGxCYXIoKSkgeworICAgIGlmIChwVlNCLT5Jc1Zpc2libGUoKSkgeworICAgICAgcmNDbGllbnQucmlnaHQgLT0gUFdMX1NDUk9MTEJBUl9XSURUSDsKKyAgICB9CisgIH0KIAotCUNQV0xfRWRpdEN0cmw6OlJlUG9zQ2hpbGRXbmQoKTsKKyAgcmV0dXJuIHJjQ2xpZW50OwogfQogCi1DUERGX1JlY3QgQ1BXTF9FZGl0OjpHZXRDbGllbnRSZWN0KCkgY29uc3QKLXsKLQlDUERGX1JlY3QgcmNDbGllbnQgPSBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChHZXRXaW5kb3dSZWN0KCksKEZYX0ZMT0FUKShHZXRCb3JkZXJXaWR0aCgpK0dldElubmVyQm9yZGVyV2lkdGgoKSkpOwotCQotCWlmIChDUFdMX1Njcm9sbEJhciAqIHBWU0IgPSB0aGlzLT5HZXRWU2Nyb2xsQmFyKCkpCi0JewotCQlpZiAocFZTQi0+SXNWaXNpYmxlKCkpCi0JCXsKLQkJCXJjQ2xpZW50LnJpZ2h0IC09IFBXTF9TQ1JPTExCQVJfV0lEVEg7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmNDbGllbnQ7Cit2b2lkIENQV0xfRWRpdDo6U2V0QWxpZ25Gb3JtYXRIKFBXTF9FRElUX0FMSUdORk9STUFUX0ggbkZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGFpbnQpIHsKKyAgbV9wRWRpdC0+U2V0QWxpZ25tZW50SCgoaW50MzJfdCluRm9ybWF0LCBiUGFpbnQpOwogfQogCi12b2lkIENQV0xfRWRpdDo6U2V0QWxpZ25Gb3JtYXRIKFBXTF9FRElUX0FMSUdORk9STUFUX0ggbkZvcm1hdCwgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKLXsKLQltX3BFZGl0LT5TZXRBbGlnbm1lbnRIKChGWF9JTlQzMiluRm9ybWF0LCBiUGFpbnQpOwordm9pZCBDUFdMX0VkaXQ6OlNldEFsaWduRm9ybWF0VihQV0xfRURJVF9BTElHTkZPUk1BVF9WIG5Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlBhaW50KSB7CisgIG1fcEVkaXQtPlNldEFsaWdubWVudFYoKGludDMyX3QpbkZvcm1hdCwgYlBhaW50KTsKIH0KIAotdm9pZCBDUFdMX0VkaXQ6OlNldEFsaWduRm9ybWF0VihQV0xfRURJVF9BTElHTkZPUk1BVF9WIG5Gb3JtYXQsIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCi17Ci0JbV9wRWRpdC0+U2V0QWxpZ25tZW50VigoRlhfSU5UMzIpbkZvcm1hdCwgYlBhaW50KTsKK0ZYX0JPT0wgQ1BXTF9FZGl0OjpDYW5TZWxlY3RBbGwoKSBjb25zdCB7CisgIHJldHVybiBHZXRTZWxlY3RXb3JkUmFuZ2UoKSAhPSBtX3BFZGl0LT5HZXRXaG9sZVdvcmRSYW5nZSgpOwogfQogCi1GWF9CT09MCUNQV0xfRWRpdDo6Q2FuU2VsZWN0QWxsKCkgY29uc3QKLXsKLQlyZXR1cm4gIEdldFNlbGVjdFdvcmRSYW5nZSgpICE9IG1fcEVkaXQtPkdldFdob2xlV29yZFJhbmdlKCk7CitGWF9CT09MIENQV0xfRWRpdDo6Q2FuQ2xlYXIoKSBjb25zdCB7CisgIHJldHVybiAhSXNSZWFkT25seSgpICYmIG1fcEVkaXQtPklzU2VsZWN0ZWQoKTsKIH0KIAotRlhfQk9PTAlDUFdMX0VkaXQ6OkNhbkNsZWFyKCkgY29uc3QKLXsKLQlyZXR1cm4gIUlzUmVhZE9ubHkoKSAmJiBtX3BFZGl0LT5Jc1NlbGVjdGVkKCk7CitGWF9CT09MIENQV0xfRWRpdDo6Q2FuQ29weSgpIGNvbnN0IHsKKyAgcmV0dXJuICFIYXNGbGFnKFBFU19QQVNTV09SRCkgJiYgIUhhc0ZsYWcoUEVTX05PUkVBRCkgJiYKKyAgICAgICAgIG1fcEVkaXQtPklzU2VsZWN0ZWQoKTsKIH0KIAotRlhfQk9PTAlDUFdMX0VkaXQ6OkNhbkNvcHkoKSBjb25zdAotewotCXJldHVybiAJIUhhc0ZsYWcoUEVTX1BBU1NXT1JEKSAmJiAhSGFzRmxhZyhQRVNfTk9SRUFEKSAmJiBtX3BFZGl0LT5Jc1NlbGVjdGVkKCk7CitGWF9CT09MIENQV0xfRWRpdDo6Q2FuQ3V0KCkgY29uc3QgeworICByZXR1cm4gQ2FuQ29weSgpICYmICFJc1JlYWRPbmx5KCk7CiB9CiAKLUZYX0JPT0wJQ1BXTF9FZGl0OjpDYW5DdXQoKSBjb25zdAotewotCXJldHVybiAJQ2FuQ29weSgpICYmICFJc1JlYWRPbmx5KCk7CitGWF9CT09MIENQV0xfRWRpdDo6Q2FuUGFzdGUoKSBjb25zdCB7CisgIGlmIChJc1JlYWRPbmx5KCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIENGWF9XaWRlU3RyaW5nIHN3Q2xpcGJvYXJkOworICBpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTSCA9IEdldFN5c3RlbUhhbmRsZXIoKSkKKyAgICBzd0NsaXBib2FyZCA9IHBTSC0+R2V0Q2xpcGJvYXJkVGV4dChHZXRBdHRhY2hlZEhXbmQoKSk7CisKKyAgcmV0dXJuICFzd0NsaXBib2FyZC5Jc0VtcHR5KCk7CiB9CiAKLUZYX0JPT0wJQ1BXTF9FZGl0OjpDYW5QYXN0ZSgpIGNvbnN0Ci17Ci0JaWYgKElzUmVhZE9ubHkoKSkgcmV0dXJuIEZBTFNFOwordm9pZCBDUFdMX0VkaXQ6OkNvcHlUZXh0KCkgeworICBpZiAoIUNhbkNvcHkoKSkKKyAgICByZXR1cm47CiAKLQlDRlhfV2lkZVN0cmluZyBzd0NsaXBib2FyZDsKLQlpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTSCA9IEdldFN5c3RlbUhhbmRsZXIoKSkKLQkJc3dDbGlwYm9hcmQgPSBwU0gtPkdldENsaXBib2FyZFRleHQoR2V0QXR0YWNoZWRIV25kKCkpOworICBDRlhfV2lkZVN0cmluZyBzdHIgPSBtX3BFZGl0LT5HZXRTZWxUZXh0KCk7CiAKLQlyZXR1cm4gIXN3Q2xpcGJvYXJkLklzRW1wdHkoKTsKKyAgaWYgKElGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCkpCisgICAgcFNILT5TZXRDbGlwYm9hcmRUZXh0KEdldEF0dGFjaGVkSFduZCgpLCBzdHIpOwogfQogCi12b2lkIENQV0xfRWRpdDo6Q29weVRleHQoKQotewotCWlmICghQ2FuQ29weSgpKSByZXR1cm47Cit2b2lkIENQV0xfRWRpdDo6UGFzdGVUZXh0KCkgeworICBpZiAoIUNhblBhc3RlKCkpCisgICAgcmV0dXJuOwogCi0JQ0ZYX1dpZGVTdHJpbmcgc3RyID0gbV9wRWRpdC0+R2V0U2VsVGV4dCgpOworICBDRlhfV2lkZVN0cmluZyBzd0NsaXBib2FyZDsKKyAgaWYgKElGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCkpCisgICAgc3dDbGlwYm9hcmQgPSBwU0gtPkdldENsaXBib2FyZFRleHQoR2V0QXR0YWNoZWRIV25kKCkpOwogCi0JaWYgKElGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCkpCi0JCXBTSC0+U2V0Q2xpcGJvYXJkVGV4dChHZXRBdHRhY2hlZEhXbmQoKSwgc3RyKTsKKyAgaWYgKG1fcEZpbGxlck5vdGlmeSkgeworICAgIEZYX0JPT0wgYlJDID0gVFJVRTsKKyAgICBGWF9CT09MIGJFeGl0ID0gRkFMU0U7CisgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyQ2hhbmdlRXg7CisgICAgaW50IG5TZWxTdGFydCA9IDA7CisgICAgaW50IG5TZWxFbmQgPSAwOworICAgIEdldFNlbChuU2VsU3RhcnQsIG5TZWxFbmQpOworICAgIG1fcEZpbGxlck5vdGlmeS0+T25CZWZvcmVLZXlTdHJva2UoR2V0QXR0YWNoZWREYXRhKCksIHN3Q2xpcGJvYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyQ2hhbmdlRXgsIG5TZWxTdGFydCwgblNlbEVuZCwgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSQywgYkV4aXQsIDApOworICAgIGlmICghYlJDKQorICAgICAgcmV0dXJuOworICAgIGlmIChiRXhpdCkKKyAgICAgIHJldHVybjsKKyAgfQorCisgIGlmIChzd0NsaXBib2FyZC5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICBDbGVhcigpOworICAgIEluc2VydFRleHQoc3dDbGlwYm9hcmQuY19zdHIoKSk7CisgIH0KIH0KIAotdm9pZCBDUFdMX0VkaXQ6OlBhc3RlVGV4dCgpCi17Ci0JaWYgKCFDYW5QYXN0ZSgpKSByZXR1cm47Cit2b2lkIENQV0xfRWRpdDo6Q3V0VGV4dCgpIHsKKyAgaWYgKCFDYW5DdXQoKSkKKyAgICByZXR1cm47CiAKLQlDRlhfV2lkZVN0cmluZyBzd0NsaXBib2FyZDsKLQlpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTSCA9IEdldFN5c3RlbUhhbmRsZXIoKSkKLQkJc3dDbGlwYm9hcmQgPSBwU0gtPkdldENsaXBib2FyZFRleHQoR2V0QXR0YWNoZWRIV25kKCkpOworICBDRlhfV2lkZVN0cmluZyBzdHIgPSBtX3BFZGl0LT5HZXRTZWxUZXh0KCk7CiAKLQlpZiAobV9wRmlsbGVyTm90aWZ5KQotCXsKLQkJRlhfQk9PTCBiUkMgPSBUUlVFOwotCQlGWF9CT09MIGJFeGl0ID0gRkFMU0U7Ci0JCUNGWF9XaWRlU3RyaW5nIHN0ckNoYW5nZUV4OwotCQlpbnQgblNlbFN0YXJ0ID0gMDsKLQkJaW50IG5TZWxFbmQgPSAwOwotCQlHZXRTZWwoblNlbFN0YXJ0LCBuU2VsRW5kKTsKLQkJbV9wRmlsbGVyTm90aWZ5LT5PbkJlZm9yZUtleVN0cm9rZShUUlVFLCBHZXRBdHRhY2hlZERhdGEoKSwgMCAsIHN3Q2xpcGJvYXJkLCBzdHJDaGFuZ2VFeCwgblNlbFN0YXJ0LCBuU2VsRW5kLCBUUlVFLCBiUkMsIGJFeGl0LCAwKTsKLQkJaWYgKCFiUkMpIHJldHVybjsKLQkJaWYgKGJFeGl0KSByZXR1cm47Ci0JfQorICBpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTSCA9IEdldFN5c3RlbUhhbmRsZXIoKSkKKyAgICBwU0gtPlNldENsaXBib2FyZFRleHQoR2V0QXR0YWNoZWRIV25kKCksIHN0cik7CiAKLQlpZiAoc3dDbGlwYm9hcmQuR2V0TGVuZ3RoKCkgPiAwKQotCXsKLQkJQ2xlYXIoKTsKLQkJSW5zZXJ0VGV4dChzd0NsaXBib2FyZC5jX3N0cigpKTsKLQl9Ci0KLQlpZiAobV9wRmlsbGVyTm90aWZ5KQotCXsKLQkJRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwotCQltX3BGaWxsZXJOb3RpZnktPk9uQWZ0ZXJLZXlTdHJva2UoVFJVRSwgR2V0QXR0YWNoZWREYXRhKCksIGJFeGl0LDApOwotCQlpZiAoYkV4aXQpIHJldHVybjsKLQl9CisgIG1fcEVkaXQtPkNsZWFyKCk7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0OjpDdXRUZXh0KCkKLXsKLQlpZiAoIUNhbkN1dCgpKSByZXR1cm47Cit2b2lkIENQV0xfRWRpdDo6T25DcmVhdGVkKCkgeworICBDUFdMX0VkaXRDdHJsOjpPbkNyZWF0ZWQoKTsKIAotCUNGWF9XaWRlU3RyaW5nIHN0ciA9IG1fcEVkaXQtPkdldFNlbFRleHQoKTsKKyAgaWYgKENQV0xfU2Nyb2xsQmFyKiBwU2Nyb2xsID0gR2V0VlNjcm9sbEJhcigpKSB7CisgICAgcFNjcm9sbC0+UmVtb3ZlRmxhZyhQV1NfQVVUT1RSQU5TUEFSRU5UKTsKKyAgICBwU2Nyb2xsLT5TZXRUcmFuc3BhcmVuY3koMjU1KTsKKyAgfQogCi0JaWYgKElGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCkpCi0JCXBTSC0+U2V0Q2xpcGJvYXJkVGV4dChHZXRBdHRhY2hlZEhXbmQoKSwgc3RyKTsKKyAgU2V0UGFyYW1CeUZsYWcoKTsKIAotCW1fcEVkaXQtPkNsZWFyKCk7CisgIG1fcmNPbGRXaW5kb3cgPSBHZXRXaW5kb3dSZWN0KCk7CisKKyAgbV9wRWRpdC0+U2V0T3ByTm90aWZ5KHRoaXMpOworICBtX3BFZGl0LT5FbmFibGVPcHJOb3RpZnkoVFJVRSk7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0OjpPbkNyZWF0ZWQoKQotewotCUNQV0xfRWRpdEN0cmw6Ok9uQ3JlYXRlZCgpOwordm9pZCBDUFdMX0VkaXQ6OlNldFBhcmFtQnlGbGFnKCkgeworICBpZiAoSGFzRmxhZyhQRVNfUklHSFQpKSB7CisgICAgbV9wRWRpdC0+U2V0QWxpZ25tZW50SCgyLCBGQUxTRSk7CisgIH0gZWxzZSBpZiAoSGFzRmxhZyhQRVNfTUlERExFKSkgeworICAgIG1fcEVkaXQtPlNldEFsaWdubWVudEgoMSwgRkFMU0UpOworICB9IGVsc2UgeworICAgIG1fcEVkaXQtPlNldEFsaWdubWVudEgoMCwgRkFMU0UpOworICB9CiAKLQlpZiAoQ1BXTF9TY3JvbGxCYXIgKiBwU2Nyb2xsID0gR2V0VlNjcm9sbEJhcigpKQotCXsKLQkJcFNjcm9sbC0+UmVtb3ZlRmxhZyhQV1NfQVVUT1RSQU5TUEFSRU5UKTsKLQkJcFNjcm9sbC0+U2V0VHJhbnNwYXJlbmN5KDI1NSk7Ci0JfQorICBpZiAoSGFzRmxhZyhQRVNfQk9UVE9NKSkgeworICAgIG1fcEVkaXQtPlNldEFsaWdubWVudFYoMiwgRkFMU0UpOworICB9IGVsc2UgaWYgKEhhc0ZsYWcoUEVTX0NFTlRFUikpIHsKKyAgICBtX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDEsIEZBTFNFKTsKKyAgfSBlbHNlIHsKKyAgICBtX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDAsIEZBTFNFKTsKKyAgfQogCi0JU2V0UGFyYW1CeUZsYWcoKTsKKyAgaWYgKEhhc0ZsYWcoUEVTX1BBU1NXT1JEKSkgeworICAgIG1fcEVkaXQtPlNldFBhc3N3b3JkQ2hhcignKicsIEZBTFNFKTsKKyAgfQogCi0JbV9yY09sZFdpbmRvdyA9IEdldFdpbmRvd1JlY3QoKTsKKyAgbV9wRWRpdC0+U2V0TXVsdGlMaW5lKEhhc0ZsYWcoUEVTX01VTFRJTElORSksIEZBTFNFKTsKKyAgbV9wRWRpdC0+U2V0QXV0b1JldHVybihIYXNGbGFnKFBFU19BVVRPUkVUVVJOKSwgRkFMU0UpOworICBtX3BFZGl0LT5TZXRBdXRvRm9udFNpemUoSGFzRmxhZyhQV1NfQVVUT0ZPTlRTSVpFKSwgRkFMU0UpOworICBtX3BFZGl0LT5TZXRBdXRvU2Nyb2xsKEhhc0ZsYWcoUEVTX0FVVE9TQ1JPTEwpLCBGQUxTRSk7CisgIG1fcEVkaXQtPkVuYWJsZVVuZG8oSGFzRmxhZyhQRVNfVU5ETykpOwogCi0JbV9wRWRpdC0+U2V0T3ByTm90aWZ5KHRoaXMpOwotCW1fcEVkaXQtPkVuYWJsZU9wck5vdGlmeShUUlVFKTsKKyAgaWYgKEhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykpIHsKKyAgICBTZXRDbGlwUmVjdChDUERGX1JlY3QoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZikpOworICAgIG1fcEVkaXQtPlNldFRleHRPdmVyZmxvdyhUUlVFLCBGQUxTRSk7CisgIH0gZWxzZSB7CisgICAgaWYgKG1fcEVkaXRDYXJldCkgeworICAgICAgbV9wRWRpdENhcmV0LT5TZXRDbGlwUmVjdChDUFdMX1V0aWxzOjpJbmZsYXRlUmVjdCgKKyAgICAgICAgICBHZXRDbGllbnRSZWN0KCksIDEuMGYpKTsgIC8vKzEgZm9yIGNhcmV0IGJlc2lkZSBib3JkZXIKKyAgICB9CisgIH0KKworICBpZiAoSGFzRmxhZyhQRVNfU1BFTExDSEVDSykpIHsKKyAgICBtX3BTcGVsbENoZWNrID0gR2V0Q3JlYXRpb25QYXJhbSgpLnBTcGVsbENoZWNrOworICB9CiB9CiAKLXZvaWQgQ1BXTF9FZGl0OjpTZXRQYXJhbUJ5RmxhZygpCi17CQotCWlmIChIYXNGbGFnKFBFU19SSUdIVCkpCi0JewotCQltX3BFZGl0LT5TZXRBbGlnbm1lbnRIKDIsIEZBTFNFKTsKLQl9Ci0JZWxzZSBpZiAoSGFzRmxhZyhQRVNfTUlERExFKSkKLQl7Ci0JCW1fcEVkaXQtPlNldEFsaWdubWVudEgoMSwgRkFMU0UpOwotCX0KLQllbHNlCi0JewotCQltX3BFZGl0LT5TZXRBbGlnbm1lbnRIKDAsIEZBTFNFKTsKLQl9Cit2b2lkIENQV0xfRWRpdDo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmJiBzQXBwU3RyZWFtKSB7CisgIENQV0xfV25kOjpHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShzQXBwU3RyZWFtKTsKIAotCWlmIChIYXNGbGFnKFBFU19CT1RUT00pKQotCXsKLQkJbV9wRWRpdC0+U2V0QWxpZ25tZW50VigyLCBGQUxTRSk7Ci0JfQotCWVsc2UgaWYgKEhhc0ZsYWcoUEVTX0NFTlRFUikpCi0JewotCQltX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDEsIEZBTFNFKTsKLQl9Ci0JZWxzZQotCXsKLQkJbV9wRWRpdC0+U2V0QWxpZ25tZW50VigwLCBGQUxTRSk7Ci0JfQorICBDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CisgIENGWF9CeXRlVGV4dEJ1ZiBzTGluZTsKIAotCWlmIChIYXNGbGFnKFBFU19QQVNTV09SRCkpCi0JewotCQltX3BFZGl0LT5TZXRQYXNzd29yZENoYXIoJyonLCBGQUxTRSk7Ci0JfQorICBpbnQzMl90IG5DaGFyQXJyYXkgPSBtX3BFZGl0LT5HZXRDaGFyQXJyYXkoKTsKIAotCW1fcEVkaXQtPlNldE11bHRpTGluZShIYXNGbGFnKFBFU19NVUxUSUxJTkUpLCBGQUxTRSk7Ci0JbV9wRWRpdC0+U2V0QXV0b1JldHVybihIYXNGbGFnKFBFU19BVVRPUkVUVVJOKSwgRkFMU0UpOwotCW1fcEVkaXQtPlNldEF1dG9Gb250U2l6ZShIYXNGbGFnKFBXU19BVVRPRk9OVFNJWkUpLCBGQUxTRSk7Ci0JbV9wRWRpdC0+U2V0QXV0b1Njcm9sbChIYXNGbGFnKFBFU19BVVRPU0NST0xMKSwgRkFMU0UpOwotCW1fcEVkaXQtPkVuYWJsZVVuZG8oSGFzRmxhZyhQRVNfVU5ETykpOworICBpZiAobkNoYXJBcnJheSA+IDApIHsKKyAgICBzd2l0Y2ggKEdldEJvcmRlclN0eWxlKCkpIHsKKyAgICAgIGNhc2UgUEJTX1NPTElEOiB7CisgICAgICAgIHNMaW5lIDw8ICJxXG4iIDw8IEdldEJvcmRlcldpZHRoKCkgPDwgIiB3XG4iCisgICAgICAgICAgICAgIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJvcmRlckNvbG9yKCksIEZBTFNFKQorICAgICAgICAgICAgICA8PCAiIDIgSiAwIGpcbiI7CiAKLQlpZiAoSGFzRmxhZyhQRVNfVEVYVE9WRVJGTE9XKSkKLQl7Ci0JCVNldENsaXBSZWN0KENQREZfUmVjdCgwLjBmLDAuMGYsMC4wZiwwLjBmKSk7Ci0JCW1fcEVkaXQtPlNldFRleHRPdmVyZmxvdyhUUlVFLCBGQUxTRSk7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmIChtX3BFZGl0Q2FyZXQpCi0JCXsKLQkJCW1fcEVkaXRDYXJldC0+U2V0Q2xpcFJlY3QoQ1BXTF9VdGlsczo6SW5mbGF0ZVJlY3QoR2V0Q2xpZW50UmVjdCgpLDEuMGYpKTsgLy8rMSBmb3IgY2FyZXQgYmVzaWRlIGJvcmRlcgotCQl9Ci0JfQorICAgICAgICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBuQ2hhckFycmF5OyBpKyspIHsKKyAgICAgICAgICBzTGluZSA8PCByY0NsaWVudC5sZWZ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgKChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQpIC8gbkNoYXJBcnJheSkgKiBpCisgICAgICAgICAgICAgICAgPDwgIiAiIDw8IHJjQ2xpZW50LmJvdHRvbSA8PCAiIG1cbiIKKyAgICAgICAgICAgICAgICA8PCByY0NsaWVudC5sZWZ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgKChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQpIC8gbkNoYXJBcnJheSkgKiBpCisgICAgICAgICAgICAgICAgPDwgIiAiIDw8IHJjQ2xpZW50LnRvcCA8PCAiIGwgU1xuIjsKKyAgICAgICAgfQogCi0JaWYgKEhhc0ZsYWcoUEVTX1NQRUxMQ0hFQ0spKQotCXsKLQkJbV9wU3BlbGxDaGVjayA9IEdldENyZWF0aW9uUGFyYW0oKS5wU3BlbGxDaGVjazsKLQl9CisgICAgICAgIHNMaW5lIDw8ICJRXG4iOworICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgUEJTX0RBU0g6IHsKKyAgICAgICAgc0xpbmUgPDwgInFcbiIgPDwgR2V0Qm9yZGVyV2lkdGgoKSA8PCAiIHdcbiIKKyAgICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0Qm9yZGVyQ29sb3IoKSwgRkFMU0UpCisgICAgICAgICAgICAgIDw8ICIgMiBKIDAgalxuIgorICAgICAgICAgICAgICA8PCAiWyIgPDwgR2V0Qm9yZGVyRGFzaCgpLm5EYXNoIDw8ICIgIiA8PCBHZXRCb3JkZXJEYXNoKCkubkdhcAorICAgICAgICAgICAgICA8PCAiXSAiIDw8IEdldEJvcmRlckRhc2goKS5uUGhhc2UgPDwgIiBkXG4iOworCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IG5DaGFyQXJyYXk7IGkrKykgeworICAgICAgICAgIHNMaW5lIDw8IHJjQ2xpZW50LmxlZnQgKworICAgICAgICAgICAgICAgICAgICAgICAoKHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCkgLyBuQ2hhckFycmF5KSAqIGkKKyAgICAgICAgICAgICAgICA8PCAiICIgPDwgcmNDbGllbnQuYm90dG9tIDw8ICIgbVxuIgorICAgICAgICAgICAgICAgIDw8IHJjQ2xpZW50LmxlZnQgKworICAgICAgICAgICAgICAgICAgICAgICAoKHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCkgLyBuQ2hhckFycmF5KSAqIGkKKyAgICAgICAgICAgICAgICA8PCAiICIgPDwgcmNDbGllbnQudG9wIDw8ICIgbCBTXG4iOworICAgICAgICB9CisKKyAgICAgICAgc0xpbmUgPDwgIlFcbiI7CisgICAgICB9IGJyZWFrOworICAgIH0KKyAgfQorCisgIHNBcHBTdHJlYW0gPDwgc0xpbmU7CisKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNUZXh0OworCisgIENQREZfUG9pbnQgcHRPZmZzZXQgPSBDUERGX1BvaW50KDAuMGYsIDAuMGYpOworCisgIENQVlRfV29yZFJhbmdlIHdyV2hvbGUgPSBtX3BFZGl0LT5HZXRXaG9sZVdvcmRSYW5nZSgpOworICBDUFZUX1dvcmRSYW5nZSB3clNlbGVjdCA9IEdldFNlbGVjdFdvcmRSYW5nZSgpOworICBDUFZUX1dvcmRSYW5nZSB3clZpc2libGUgPQorICAgICAgKEhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykgPyB3cldob2xlIDogbV9wRWRpdC0+R2V0VmlzaWJsZVdvcmRSYW5nZSgpKTsKKyAgQ1BWVF9Xb3JkUmFuZ2Ugd3JTZWxCZWZvcmUod3JXaG9sZS5CZWdpblBvcywgd3JTZWxlY3QuQmVnaW5Qb3MpOworICBDUFZUX1dvcmRSYW5nZSB3clNlbEFmdGVyKHdyU2VsZWN0LkVuZFBvcywgd3JXaG9sZS5FbmRQb3MpOworCisgIENQVlRfV29yZFJhbmdlIHdyVGVtcCA9CisgICAgICBDUFdMX1V0aWxzOjpPdmVybGFwV29yZFJhbmdlKEdldFNlbGVjdFdvcmRSYW5nZSgpLCB3clZpc2libGUpOworICBDRlhfQnl0ZVN0cmluZyBzRWRpdFNlbCA9CisgICAgICBDUFdMX1V0aWxzOjpHZXRFZGl0U2VsQXBwU3RyZWFtKG1fcEVkaXQsIHB0T2Zmc2V0LCAmd3JUZW1wKTsKKworICBpZiAoc0VkaXRTZWwuR2V0TGVuZ3RoKCkgPiAwKQorICAgIHNUZXh0IDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKFBXTF9ERUZBVUxUX1NFTEJBQ0tDT0xPUikKKyAgICAgICAgICA8PCBzRWRpdFNlbDsKKworICB3clRlbXAgPSBDUFdMX1V0aWxzOjpPdmVybGFwV29yZFJhbmdlKHdyVmlzaWJsZSwgd3JTZWxCZWZvcmUpOworICBDRlhfQnl0ZVN0cmluZyBzRWRpdEJlZm9yZSA9IENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0oCisgICAgICBtX3BFZGl0LCBwdE9mZnNldCwgJndyVGVtcCwgIUhhc0ZsYWcoUEVTX0NIQVJBUlJBWSksCisgICAgICBtX3BFZGl0LT5HZXRQYXNzd29yZENoYXIoKSk7CisKKyAgaWYgKHNFZGl0QmVmb3JlLkdldExlbmd0aCgpID4gMCkKKyAgICBzVGV4dCA8PCAiQlRcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0VGV4dENvbG9yKCkpCisgICAgICAgICAgPDwgc0VkaXRCZWZvcmUgPDwgIkVUXG4iOworCisgIHdyVGVtcCA9IENQV0xfVXRpbHM6Ok92ZXJsYXBXb3JkUmFuZ2Uod3JWaXNpYmxlLCB3clNlbGVjdCk7CisgIENGWF9CeXRlU3RyaW5nIHNFZGl0TWlkID0gQ1BXTF9VdGlsczo6R2V0RWRpdEFwcFN0cmVhbSgKKyAgICAgIG1fcEVkaXQsIHB0T2Zmc2V0LCAmd3JUZW1wLCAhSGFzRmxhZyhQRVNfQ0hBUkFSUkFZKSwKKyAgICAgIG1fcEVkaXQtPkdldFBhc3N3b3JkQ2hhcigpKTsKKworICBpZiAoc0VkaXRNaWQuR2V0TGVuZ3RoKCkgPiAwKQorICAgIHNUZXh0IDw8ICJCVFxuIgorICAgICAgICAgIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDEpKQorICAgICAgICAgIDw8IHNFZGl0TWlkIDw8ICJFVFxuIjsKKworICB3clRlbXAgPSBDUFdMX1V0aWxzOjpPdmVybGFwV29yZFJhbmdlKHdyVmlzaWJsZSwgd3JTZWxBZnRlcik7CisgIENGWF9CeXRlU3RyaW5nIHNFZGl0QWZ0ZXIgPSBDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKAorICAgICAgbV9wRWRpdCwgcHRPZmZzZXQsICZ3clRlbXAsICFIYXNGbGFnKFBFU19DSEFSQVJSQVkpLAorICAgICAgbV9wRWRpdC0+R2V0UGFzc3dvcmRDaGFyKCkpOworCisgIGlmIChzRWRpdEFmdGVyLkdldExlbmd0aCgpID4gMCkKKyAgICBzVGV4dCA8PCAiQlRcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0VGV4dENvbG9yKCkpCisgICAgICAgICAgPDwgc0VkaXRBZnRlciA8PCAiRVRcbiI7CisKKyAgaWYgKEhhc0ZsYWcoUEVTX1NQRUxMQ0hFQ0spKSB7CisgICAgQ0ZYX0J5dGVTdHJpbmcgc1NwZWxsQ2hlY2sgPSBDUFdMX1V0aWxzOjpHZXRTcGVsbENoZWNrQXBwU3RyZWFtKAorICAgICAgICBtX3BFZGl0LCBtX3BTcGVsbENoZWNrLCBwdE9mZnNldCwgJndyVmlzaWJsZSk7CisgICAgaWYgKHNTcGVsbENoZWNrLkdldExlbmd0aCgpID4gMCkKKyAgICAgIHNUZXh0IDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgMSwgMCwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSkKKyAgICAgICAgICAgIDw8IHNTcGVsbENoZWNrOworICB9CisKKyAgaWYgKHNUZXh0LkdldExlbmd0aCgpID4gMCkgeworICAgIENQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKKyAgICBzQXBwU3RyZWFtIDw8ICJxXG4vVHggQk1DXG4iOworCisgICAgaWYgKCFIYXNGbGFnKFBFU19URVhUT1ZFUkZMT1cpKQorICAgICAgc0FwcFN0cmVhbSA8PCByY0NsaWVudC5sZWZ0IDw8ICIgIiA8PCByY0NsaWVudC5ib3R0b20gPDwgIiAiCisgICAgICAgICAgICAgICAgIDw8IHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCA8PCAiICIKKyAgICAgICAgICAgICAgICAgPDwgcmNDbGllbnQudG9wIC0gcmNDbGllbnQuYm90dG9tIDw8ICIgcmUgVyBuXG4iOworCisgICAgc0FwcFN0cmVhbSA8PCBzVGV4dDsKKworICAgIHNBcHBTdHJlYW0gPDwgIkVNQ1xuUVxuIjsKKyAgfQogfQogCi12b2lkIENQV0xfRWRpdDo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSkKLXsKLQlDUFdMX1duZDo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oc0FwcFN0cmVhbSk7Cit2b2lkIENQV0xfRWRpdDo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSkgeworICBDUFdMX1duZDo6RHJhd1RoaXNBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSk7CiAKLQlDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNMaW5lOworICBDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CisgIENGWF9CeXRlVGV4dEJ1ZiBzTGluZTsKIAotCUZYX0lOVDMyIG5DaGFyQXJyYXkgPSBtX3BFZGl0LT5HZXRDaGFyQXJyYXkoKTsKKyAgaW50MzJfdCBuQ2hhckFycmF5ID0gbV9wRWRpdC0+R2V0Q2hhckFycmF5KCk7CisgIEZYX1NBRkVfSU5UMzIgbkNoYXJBcnJheVNhZmUgPSBuQ2hhckFycmF5OworICBuQ2hhckFycmF5U2FmZSAtPSAxOworICBuQ2hhckFycmF5U2FmZSAqPSAyOwogCi0JaWYgKG5DaGFyQXJyYXkgPiAwKQotCXsKLQkJc3dpdGNoIChHZXRCb3JkZXJTdHlsZSgpKQotCQl7Ci0JCWNhc2UgUEJTX1NPTElEOgotCQkJewotCQkJCXNMaW5lIDw8ICJxXG4iIDw8IEdldEJvcmRlcldpZHRoKCkgPDwgIiB3XG4iIAotCQkJCQk8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRCb3JkZXJDb2xvcigpLEZBTFNFKSA8PCAiIDIgSiAwIGpcbiI7CQkJCQkKKyAgaWYgKG5DaGFyQXJyYXkgPiAwICYmIG5DaGFyQXJyYXlTYWZlLklzVmFsaWQoKSkgeworICAgIHN3aXRjaCAoR2V0Qm9yZGVyU3R5bGUoKSkgeworICAgICAgY2FzZSBQQlNfU09MSUQ6IHsKKyAgICAgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKKyAgICAgICAgZ3NkLm1fTGluZVdpZHRoID0gKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCk7CiAKLQkJCQlmb3IgKEZYX0lOVDMyIGk9MTtpPG5DaGFyQXJyYXk7aSsrKQotCQkJCXsKLQkJCQkJc0xpbmUgPDwgcmNDbGllbnQubGVmdCArICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KS9uQ2hhckFycmF5KSppIDw8ICIgIgotCQkJCQkJPDwgcmNDbGllbnQuYm90dG9tIDw8ICIgbVxuIgotCQkJCQkJPDwgcmNDbGllbnQubGVmdCArICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KS9uQ2hhckFycmF5KSppIDw8ICIgIgotCQkJCQkJPDwgcmNDbGllbnQudG9wIDw8ICIgbCBTXG4iOwkJCQkJCQotCQkJCX0KKyAgICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGg7CisgICAgICAgIHBhdGguU2V0UG9pbnRDb3VudChuQ2hhckFycmF5U2FmZS5WYWx1ZU9yRGllKCkpOwogCi0JCQkJc0xpbmUgPDwgIlFcbiI7CQkJCQkKLQkJCX0KLQkJCWJyZWFrOyAKLQkJY2FzZSBQQlNfREFTSDoKLQkJCXsKLQkJCQlzTGluZSA8PCAicVxuIiA8PCBHZXRCb3JkZXJXaWR0aCgpIDw8ICIgd1xuIiAKLQkJCQkJPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0Qm9yZGVyQ29sb3IoKSxGQUxTRSkgPDwgIiAyIEogMCBqXG4iCi0JCQkJCTw8ICJbIiA8PCBHZXRCb3JkZXJEYXNoKCkubkRhc2ggPDwgIiAiIAotCQkJCQk8PCBHZXRCb3JkZXJEYXNoKCkubkdhcCA8PCAiXSAiIAotCQkJCQk8PCBHZXRCb3JkZXJEYXNoKCkublBoYXNlIDw8ICIgZFxuIjsKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNoYXJBcnJheSAtIDE7IGkrKykgeworICAgICAgICAgIHBhdGguU2V0UG9pbnQoCisgICAgICAgICAgICAgIGkgKiAyLAorICAgICAgICAgICAgICByY0NsaWVudC5sZWZ0ICsKKyAgICAgICAgICAgICAgICAgICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KSAvIG5DaGFyQXJyYXkpICogKGkgKyAxKSwKKyAgICAgICAgICAgICAgcmNDbGllbnQuYm90dG9tLCBGWFBUX01PVkVUTyk7CisgICAgICAgICAgcGF0aC5TZXRQb2ludCgKKyAgICAgICAgICAgICAgaSAqIDIgKyAxLAorICAgICAgICAgICAgICByY0NsaWVudC5sZWZ0ICsKKyAgICAgICAgICAgICAgICAgICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KSAvIG5DaGFyQXJyYXkpICogKGkgKyAxKSwKKyAgICAgICAgICAgICAgcmNDbGllbnQudG9wLCBGWFBUX0xJTkVUTyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhdGguR2V0UG9pbnRDb3VudCgpID4gMCkKKyAgICAgICAgICBwRGV2aWNlLT5EcmF3UGF0aCgKKyAgICAgICAgICAgICAgJnBhdGgsIHBVc2VyMkRldmljZSwgJmdzZCwgMCwKKyAgICAgICAgICAgICAgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0Qm9yZGVyQ29sb3IoKSwgMjU1KSwKKyAgICAgICAgICAgICAgRlhGSUxMX0FMVEVSTkFURSk7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBQQlNfREFTSDogeworICAgICAgICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOworICAgICAgICBnc2QubV9MaW5lV2lkdGggPSAoRlhfRkxPQVQpR2V0Qm9yZGVyV2lkdGgoKTsKIAotCQkJCWZvciAoRlhfSU5UMzIgaT0xO2k8bkNoYXJBcnJheTtpKyspCQkJCQkKLQkJCQl7Ci0JCQkJCXNMaW5lIDw8IHJjQ2xpZW50LmxlZnQgKyAoKHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCkvbkNoYXJBcnJheSkqaSA8PCAiICIKLQkJCQkJCTw8IHJjQ2xpZW50LmJvdHRvbSA8PCAiIG1cbiIKLQkJCQkJCTw8IHJjQ2xpZW50LmxlZnQgKyAoKHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCkvbkNoYXJBcnJheSkqaSA8PCAiICIKLQkJCQkJCTw8IHJjQ2xpZW50LnRvcCA8PCAiIGwgU1xuIjsJCi0JCQkJfQorICAgICAgICBnc2QuU2V0RGFzaENvdW50KDIpOworICAgICAgICBnc2QubV9EYXNoQXJyYXlbMF0gPSAoRlhfRkxPQVQpR2V0Qm9yZGVyRGFzaCgpLm5EYXNoOworICAgICAgICBnc2QubV9EYXNoQXJyYXlbMV0gPSAoRlhfRkxPQVQpR2V0Qm9yZGVyRGFzaCgpLm5HYXA7CisgICAgICAgIGdzZC5tX0Rhc2hQaGFzZSA9IChGWF9GTE9BVClHZXRCb3JkZXJEYXNoKCkublBoYXNlOwogCi0JCQkJc0xpbmUgPDwgIlFcbiI7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQkJCi0JfQorICAgICAgICBDRlhfUGF0aERhdGEgcGF0aDsKKyAgICAgICAgcGF0aC5TZXRQb2ludENvdW50KG5DaGFyQXJyYXlTYWZlLlZhbHVlT3JEaWUoKSk7CiAKLQlzQXBwU3RyZWFtIDw8IHNMaW5lOworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ2hhckFycmF5IC0gMTsgaSsrKSB7CisgICAgICAgICAgcGF0aC5TZXRQb2ludCgKKyAgICAgICAgICAgICAgaSAqIDIsCisgICAgICAgICAgICAgIHJjQ2xpZW50LmxlZnQgKworICAgICAgICAgICAgICAgICAgKChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQpIC8gbkNoYXJBcnJheSkgKiAoaSArIDEpLAorICAgICAgICAgICAgICByY0NsaWVudC5ib3R0b20sIEZYUFRfTU9WRVRPKTsKKyAgICAgICAgICBwYXRoLlNldFBvaW50KAorICAgICAgICAgICAgICBpICogMiArIDEsCisgICAgICAgICAgICAgIHJjQ2xpZW50LmxlZnQgKworICAgICAgICAgICAgICAgICAgKChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQpIC8gbkNoYXJBcnJheSkgKiAoaSArIDEpLAorICAgICAgICAgICAgICByY0NsaWVudC50b3AsIEZYUFRfTElORVRPKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGF0aC5HZXRQb2ludENvdW50KCkgPiAwKQorICAgICAgICAgIHBEZXZpY2UtPkRyYXdQYXRoKAorICAgICAgICAgICAgICAmcGF0aCwgcFVzZXIyRGV2aWNlLCAmZ3NkLCAwLAorICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRCb3JkZXJDb2xvcigpLCAyNTUpLAorICAgICAgICAgICAgICBGWEZJTExfQUxURVJOQVRFKTsKKyAgICAgIH0gYnJlYWs7CisgICAgfQorICB9CiAKLQlDRlhfQnl0ZVRleHRCdWYgc1RleHQ7CisgIENQREZfUmVjdCByY0NsaXA7CisgIENQVlRfV29yZFJhbmdlIHdyUmFuZ2UgPSBtX3BFZGl0LT5HZXRWaXNpYmxlV29yZFJhbmdlKCk7CisgIENQVlRfV29yZFJhbmdlKiBwUmFuZ2UgPSBOVUxMOwogCi0JQ1BERl9Qb2ludCBwdE9mZnNldCA9IENQREZfUG9pbnQoMC4wZiwwLjBmKTsKKyAgaWYgKCFIYXNGbGFnKFBFU19URVhUT1ZFUkZMT1cpKSB7CisgICAgcmNDbGlwID0gR2V0Q2xpZW50UmVjdCgpOworICAgIHBSYW5nZSA9ICZ3clJhbmdlOworICB9CisgIElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzSGFuZGxlciA9IEdldFN5c3RlbUhhbmRsZXIoKTsKKyAgSUZYX0VkaXQ6OkRyYXdFZGl0KAorICAgICAgcERldmljZSwgcFVzZXIyRGV2aWNlLCBtX3BFZGl0LAorICAgICAgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dENvbG9yKCksIEdldFRyYW5zcGFyZW5jeSgpKSwKKyAgICAgIENQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKEdldFRleHRTdHJva2VDb2xvcigpLCBHZXRUcmFuc3BhcmVuY3koKSksCisgICAgICByY0NsaXAsIENQREZfUG9pbnQoMC4wZiwgMC4wZiksIHBSYW5nZSwgcFN5c0hhbmRsZXIsIG1fcEZvcm1GaWxsZXIpOwogCi0JQ1BWVF9Xb3JkUmFuZ2Ugd3JXaG9sZSA9IG1fcEVkaXQtPkdldFdob2xlV29yZFJhbmdlKCk7Ci0JQ1BWVF9Xb3JkUmFuZ2Ugd3JTZWxlY3QgPSBHZXRTZWxlY3RXb3JkUmFuZ2UoKTsKLQlDUFZUX1dvcmRSYW5nZSB3clZpc2libGUgPSAoSGFzRmxhZyhQRVNfVEVYVE9WRVJGTE9XKSA/IHdyV2hvbGUgOiBtX3BFZGl0LT5HZXRWaXNpYmxlV29yZFJhbmdlKCkpOwotCUNQVlRfV29yZFJhbmdlIHdyU2VsQmVmb3JlKHdyV2hvbGUuQmVnaW5Qb3Msd3JTZWxlY3QuQmVnaW5Qb3MpOwotCUNQVlRfV29yZFJhbmdlIHdyU2VsQWZ0ZXIod3JTZWxlY3QuRW5kUG9zLHdyV2hvbGUuRW5kUG9zKTsKLQotCUNQVlRfV29yZFJhbmdlIHdyVGVtcCA9IENQV0xfVXRpbHM6Ok92ZXJsYXBXb3JkUmFuZ2UoR2V0U2VsZWN0V29yZFJhbmdlKCksd3JWaXNpYmxlKTsKLQlDRlhfQnl0ZVN0cmluZyBzRWRpdFNlbCA9IENQV0xfVXRpbHM6OkdldEVkaXRTZWxBcHBTdHJlYW0obV9wRWRpdCwgcHRPZmZzZXQsCi0JCQkmd3JUZW1wKTsKLQotCWlmIChzRWRpdFNlbC5HZXRMZW5ndGgoKSA+IDApCi0JCXNUZXh0IDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKFBXTF9ERUZBVUxUX1NFTEJBQ0tDT0xPUikgPDwgc0VkaXRTZWwgOwotCi0Jd3JUZW1wID0gQ1BXTF9VdGlsczo6T3ZlcmxhcFdvcmRSYW5nZSh3clZpc2libGUsd3JTZWxCZWZvcmUpOwotCUNGWF9CeXRlU3RyaW5nIHNFZGl0QmVmb3JlID0gQ1BXTF9VdGlsczo6R2V0RWRpdEFwcFN0cmVhbShtX3BFZGl0LCBwdE9mZnNldCwgIAotCQkJJndyVGVtcCwgIUhhc0ZsYWcoUEVTX0NIQVJBUlJBWSksIG1fcEVkaXQtPkdldFBhc3N3b3JkQ2hhcigpKTsJCQkKLQotCWlmIChzRWRpdEJlZm9yZS5HZXRMZW5ndGgoKSA+IDApCi0JCXNUZXh0IDw8ICJCVFxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRUZXh0Q29sb3IoKSkgPDwgc0VkaXRCZWZvcmUgPDwgIkVUXG4iOwotCi0Jd3JUZW1wID0gQ1BXTF9VdGlsczo6T3ZlcmxhcFdvcmRSYW5nZSh3clZpc2libGUsd3JTZWxlY3QpOwotCUNGWF9CeXRlU3RyaW5nIHNFZGl0TWlkID0gQ1BXTF9VdGlsczo6R2V0RWRpdEFwcFN0cmVhbShtX3BFZGl0LCBwdE9mZnNldCwgCi0JCQkmd3JUZW1wLCAhSGFzRmxhZyhQRVNfQ0hBUkFSUkFZKSwgbV9wRWRpdC0+R2V0UGFzc3dvcmRDaGFyKCkpOwkJCQotCi0JaWYgKHNFZGl0TWlkLkdldExlbmd0aCgpID4gMCkKLQkJc1RleHQgPDwgIkJUXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksMSkpIDw8IHNFZGl0TWlkIDw8ICJFVFxuIjsKLQotCXdyVGVtcCA9IENQV0xfVXRpbHM6Ok92ZXJsYXBXb3JkUmFuZ2Uod3JWaXNpYmxlLHdyU2VsQWZ0ZXIpOwotCUNGWF9CeXRlU3RyaW5nIHNFZGl0QWZ0ZXIgPSBDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKG1fcEVkaXQsIHB0T2Zmc2V0LCAKLQkJCSZ3clRlbXAsICFIYXNGbGFnKFBFU19DSEFSQVJSQVkpLCBtX3BFZGl0LT5HZXRQYXNzd29yZENoYXIoKSk7CQkJCi0KLQlpZiAoc0VkaXRBZnRlci5HZXRMZW5ndGgoKSA+IDApCi0JCXNUZXh0IDw8ICJCVFxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRUZXh0Q29sb3IoKSkgPDwgc0VkaXRBZnRlcjw8ICJFVFxuIjsKLQotCWlmIChIYXNGbGFnKFBFU19TUEVMTENIRUNLKSkKLQl7Ci0JCUNGWF9CeXRlU3RyaW5nIHNTcGVsbENoZWNrID0gQ1BXTF9VdGlsczo6R2V0U3BlbGxDaGVja0FwcFN0cmVhbShtX3BFZGl0LCBtX3BTcGVsbENoZWNrLCBwdE9mZnNldCwgJndyVmlzaWJsZSk7Ci0JCWlmIChzU3BlbGxDaGVjay5HZXRMZW5ndGgoKSA+IDApCi0JCQlzVGV4dCA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsMSwwLDApLEZBTFNFKSA8PCBzU3BlbGxDaGVjazsKLQl9Ci0KLQlpZiAoc1RleHQuR2V0TGVuZ3RoKCkgPiAwKQotCXsKLQkJQ1BERl9SZWN0IHJjQ2xpZW50ID0gdGhpcy0+R2V0Q2xpZW50UmVjdCgpOwotCQlzQXBwU3RyZWFtIDw8ICJxXG4vVHggQk1DXG4iOwotCQkKLQkJaWYgKCFIYXNGbGFnKFBFU19URVhUT1ZFUkZMT1cpKQotCQkJc0FwcFN0cmVhbSA8PCByY0NsaWVudC5sZWZ0IDw8ICIgIiA8PCByY0NsaWVudC5ib3R0b20gPDwgIiAiCi0JCQkJPDwgcmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0IDw8ICIgIiA8PCByY0NsaWVudC50b3AgLSByY0NsaWVudC5ib3R0b20gPDwgIiByZSBXIG5cbiI7Ci0KLQkJc0FwcFN0cmVhbSA8PCBzVGV4dDsKLQotCQlzQXBwU3RyZWFtIDw8ICJFTUNcblFcbiI7Ci0JfQorICBpZiAoSGFzRmxhZyhQRVNfU1BFTExDSEVDSykpIHsKKyAgICBDUFdMX1V0aWxzOjpEcmF3RWRpdFNwZWxsQ2hlY2socERldmljZSwgcFVzZXIyRGV2aWNlLCBtX3BFZGl0LCByY0NsaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUG9pbnQoMC4wZiwgMC4wZiksIHBSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q3JlYXRpb25QYXJhbSgpLnBTcGVsbENoZWNrKTsKKyAgfQogfQogCi12b2lkIENQV0xfRWRpdDo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpCi17Ci0JQ1BXTF9XbmQ6OkRyYXdUaGlzQXBwZWFyYW5jZShwRGV2aWNlLHBVc2VyMkRldmljZSk7CitGWF9CT09MIENQV0xfRWRpdDo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIHsKKyAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsIG5GbGFnKTsKIAotCUNQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKLQlDRlhfQnl0ZVRleHRCdWYgc0xpbmU7CisgIGlmIChIYXNGbGFnKFBFU19URVhUT1ZFUkZMT1cpIHx8IENsaWVudEhpdFRlc3QocG9pbnQpKSB7CisgICAgaWYgKG1fYk1vdXNlRG93bikKKyAgICAgIEludmFsaWRhdGVSZWN0KCk7CiAKLQlGWF9JTlQzMiBuQ2hhckFycmF5ID0gbV9wRWRpdC0+R2V0Q2hhckFycmF5KCk7Ci0JRlhfU0FGRV9JTlQzMiBuQ2hhckFycmF5U2FmZSA9IG5DaGFyQXJyYXk7Ci0JbkNoYXJBcnJheVNhZmUgLT0gMTsKLQluQ2hhckFycmF5U2FmZSAqPSAyOworICAgIG1fYk1vdXNlRG93biA9IFRSVUU7CisgICAgU2V0Q2FwdHVyZSgpOwogCi0JaWYgKG5DaGFyQXJyYXkgPiAwICYmIG5DaGFyQXJyYXlTYWZlLklzVmFsaWQoKSkKLQl7Ci0JCXN3aXRjaCAoR2V0Qm9yZGVyU3R5bGUoKSkKLQkJewotCQljYXNlIFBCU19TT0xJRDoKLQkJCXsKLQkJCQlDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOwotCQkJCWdzZC5tX0xpbmVXaWR0aCA9IChGWF9GTE9BVClHZXRCb3JkZXJXaWR0aCgpOworICAgIG1fcEVkaXQtPk9uTW91c2VEb3duKHBvaW50LCBJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKKyAgfQogCi0JCQkJQ0ZYX1BhdGhEYXRhIHBhdGg7Ci0JCQkJcGF0aC5TZXRQb2ludENvdW50KG5DaGFyQXJyYXlTYWZlLlZhbHVlT3JEaWUoKSk7Ci0KLQkJCQlmb3IgKEZYX0lOVDMyIGk9MDsgaTxuQ2hhckFycmF5LTE7IGkrKykKLQkJCQl7Ci0JCQkJCXBhdGguU2V0UG9pbnQoaSoyLCByY0NsaWVudC5sZWZ0ICsgKChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQpL25DaGFyQXJyYXkpKihpKzEpLAotCQkJCQkJcmNDbGllbnQuYm90dG9tLCBGWFBUX01PVkVUTyk7Ci0JCQkJCXBhdGguU2V0UG9pbnQoaSoyKzEsIHJjQ2xpZW50LmxlZnQgKyAoKHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCkvbkNoYXJBcnJheSkqKGkrMSksCi0JCQkJCQlyY0NsaWVudC50b3AsIEZYUFRfTElORVRPKTsKLQkJCQl9Ci0JCQkJaWYgKHBhdGguR2V0UG9pbnRDb3VudCgpID4gMCkKLQkJCQkJcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgJmdzZCwwLCAgCi0JCQkJCQlDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRCb3JkZXJDb2xvcigpLDI1NSksIEZYRklMTF9BTFRFUk5BVEUpOwotCQkJfQotCQkJYnJlYWs7IAotCQljYXNlIFBCU19EQVNIOgotCQkJewotCQkJCUNGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7Ci0JCQkJZ3NkLm1fTGluZVdpZHRoID0gKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCk7Ci0KLQkJCQlnc2QuU2V0RGFzaENvdW50KDIpOwotCQkJCWdzZC5tX0Rhc2hBcnJheVswXSA9IChGWF9GTE9BVClHZXRCb3JkZXJEYXNoKCkubkRhc2g7Ci0JCQkJZ3NkLm1fRGFzaEFycmF5WzFdID0gKEZYX0ZMT0FUKUdldEJvcmRlckRhc2goKS5uR2FwOwotCQkJCWdzZC5tX0Rhc2hQaGFzZSA9IChGWF9GTE9BVClHZXRCb3JkZXJEYXNoKCkublBoYXNlOwotCi0JCQkJQ0ZYX1BhdGhEYXRhIHBhdGg7Ci0JCQkJcGF0aC5TZXRQb2ludENvdW50KG5DaGFyQXJyYXlTYWZlLlZhbHVlT3JEaWUoKSk7Ci0KLQkJCQlmb3IgKEZYX0lOVDMyIGk9MDsgaTxuQ2hhckFycmF5LTE7IGkrKykKLQkJCQl7Ci0JCQkJCXBhdGguU2V0UG9pbnQoaSoyLCByY0NsaWVudC5sZWZ0ICsgKChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQpL25DaGFyQXJyYXkpKihpKzEpLAotCQkJCQkJcmNDbGllbnQuYm90dG9tLCBGWFBUX01PVkVUTyk7Ci0JCQkJCXBhdGguU2V0UG9pbnQoaSoyKzEsIHJjQ2xpZW50LmxlZnQgKyAoKHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCkvbkNoYXJBcnJheSkqKGkrMSksCi0JCQkJCQlyY0NsaWVudC50b3AsIEZYUFRfTElORVRPKTsKLQkJCQl9Ci0JCQkJaWYgKHBhdGguR2V0UG9pbnRDb3VudCgpID4gMCkKLQkJCQkJcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgJmdzZCwwLAotCQkJCQkJQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0Qm9yZGVyQ29sb3IoKSwyNTUpLCBGWEZJTExfQUxURVJOQVRFKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9CQkKLQl9Ci0KLQlDUERGX1JlY3QgcmNDbGlwOwotCUNQVlRfV29yZFJhbmdlIHdyUmFuZ2UgPSBtX3BFZGl0LT5HZXRWaXNpYmxlV29yZFJhbmdlKCk7Ci0JQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSA9IE5VTEw7Ci0KLQlpZiAoIUhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykpCi0JewotCQlyY0NsaXAgPSBHZXRDbGllbnRSZWN0KCk7Ci0JCXBSYW5nZSA9ICZ3clJhbmdlOwotCX0KLUlGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzSGFuZGxlciA9IEdldFN5c3RlbUhhbmRsZXIoKTsKLQlJRlhfRWRpdDo6RHJhd0VkaXQocERldmljZSxwVXNlcjJEZXZpY2UsbV9wRWRpdCwKLQkJQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dENvbG9yKCksdGhpcy0+R2V0VHJhbnNwYXJlbmN5KCkpLAotCQlDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0U3Ryb2tlQ29sb3IoKSx0aGlzLT5HZXRUcmFuc3BhcmVuY3koKSksCi0JCXJjQ2xpcCxDUERGX1BvaW50KDAuMGYsMC4wZikscFJhbmdlLCBwU3lzSGFuZGxlciwgbV9wRm9ybUZpbGxlcik7Ci0KLQlpZiAoSGFzRmxhZyhQRVNfU1BFTExDSEVDSykpCi0JewotCQlDUFdMX1V0aWxzOjpEcmF3RWRpdFNwZWxsQ2hlY2socERldmljZSxwVXNlcjJEZXZpY2UsbV9wRWRpdCxyY0NsaXAsCi0JCQlDUERGX1BvaW50KDAuMGYsMC4wZikscFJhbmdlLCB0aGlzLT5HZXRDcmVhdGlvblBhcmFtKCkucFNwZWxsQ2hlY2spOwotCX0KKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgQ1BXTF9FZGl0OjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsbkZsYWcpOworRlhfQk9PTCBDUFdMX0VkaXQ6Ok9uTEJ1dHRvbkRibENsayhjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIHsKKyAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRibENsayhwb2ludCwgbkZsYWcpOwogCi0JaWYgKEhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykgfHwgQ2xpZW50SGl0VGVzdChwb2ludCkpCi0JewotCQlpZiAobV9iTW91c2VEb3duKQotCQkJdGhpcy0+SW52YWxpZGF0ZVJlY3QoKTsKKyAgaWYgKEhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykgfHwgQ2xpZW50SGl0VGVzdChwb2ludCkpIHsKKyAgICBtX3BFZGl0LT5TZWxlY3RBbGwoKTsKKyAgfQogCi0JCW1fYk1vdXNlRG93biA9IFRSVUU7CQkKLQkJU2V0Q2FwdHVyZSgpOwotCi0JCW1fcEVkaXQtPk9uTW91c2VEb3duKHBvaW50LElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0JfQotCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MCUNQV0xfRWRpdDo6T25MQnV0dG9uRGJsQ2xrKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRibENsayhwb2ludCwgbkZsYWcpOworI2RlZmluZSBXTV9QV0xFRElUX1VORE8gMHgwMQorI2RlZmluZSBXTV9QV0xFRElUX1JFRE8gMHgwMgorI2RlZmluZSBXTV9QV0xFRElUX0NVVCAweDAzCisjZGVmaW5lIFdNX1BXTEVESVRfQ09QWSAweDA0CisjZGVmaW5lIFdNX1BXTEVESVRfUEFTVEUgMHgwNQorI2RlZmluZSBXTV9QV0xFRElUX0RFTEVURSAweDA2CisjZGVmaW5lIFdNX1BXTEVESVRfU0VMRUNUQUxMIDB4MDcKKyNkZWZpbmUgV01fUFdMRURJVF9TVUdHRVNUIDB4MDgKIAotCWlmIChIYXNGbGFnKFBFU19URVhUT1ZFUkZMT1cpIHx8IENsaWVudEhpdFRlc3QocG9pbnQpKQotCXsKLQkJbV9wRWRpdC0+U2VsZWN0QWxsKCk7Ci0JfQorRlhfQk9PTCBDUFdMX0VkaXQ6Ok9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgeworICBpZiAobV9iTW91c2VEb3duKQorICAgIHJldHVybiBGQUxTRTsKIAotCXJldHVybiBUUlVFOworICBDUFdMX1duZDo6T25SQnV0dG9uVXAocG9pbnQsIG5GbGFnKTsKKworICBpZiAoIUhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykgJiYgIUNsaWVudEhpdFRlc3QocG9pbnQpKQorICAgIHJldHVybiBUUlVFOworCisgIElGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCk7CisgIGlmICghcFNIKQorICAgIHJldHVybiBGQUxTRTsKKworICBTZXRGb2N1cygpOworCisgIENQVlRfV29yZFJhbmdlIHdyTGF0aW4gPSBHZXRMYXRpbldvcmRzUmFuZ2UocG9pbnQpOworICBDRlhfV2lkZVN0cmluZyBzd0xhdGluID0gbV9wRWRpdC0+R2V0UmFuZ2VUZXh0KHdyTGF0aW4pOworCisgIEZYX0hNRU5VIGhQb3B1cCA9IHBTSC0+Q3JlYXRlUG9wdXBNZW51KCk7CisgIGlmICghaFBvcHVwKQorICAgIHJldHVybiBGQUxTRTsKKworICBDRlhfQnl0ZVN0cmluZ0FycmF5IHNTdWdnZXN0V29yZHM7CisgIENQREZfUG9pbnQgcHRQb3B1cCA9IHBvaW50OworCisgIGlmICghSXNSZWFkT25seSgpKSB7CisgICAgaWYgKEhhc0ZsYWcoUEVTX1NQRUxMQ0hFQ0spICYmICFzd0xhdGluLklzRW1wdHkoKSkgeworICAgICAgaWYgKG1fcFNwZWxsQ2hlY2spIHsKKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0xhdGluID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHN3TGF0aW4pOworCisgICAgICAgIGlmICghbV9wU3BlbGxDaGVjay0+Q2hlY2tXb3JkKHNMYXRpbikpIHsKKyAgICAgICAgICBtX3BTcGVsbENoZWNrLT5TdWdnZXN0V29yZHMoc0xhdGluLCBzU3VnZ2VzdFdvcmRzKTsKKworICAgICAgICAgIGludDMyX3QgblN1Z2dlc3QgPSBzU3VnZ2VzdFdvcmRzLkdldFNpemUoKTsKKworICAgICAgICAgIGZvciAoaW50MzJfdCBuV29yZCA9IDA7IG5Xb3JkIDwgblN1Z2dlc3Q7IG5Xb3JkKyspIHsKKyAgICAgICAgICAgIHBTSC0+QXBwZW5kTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX1NVR0dFU1QgKyBuV29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1N1Z2dlc3RXb3Jkc1tuV29yZF0uVVRGOERlY29kZSgpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoblN1Z2dlc3QgPiAwKQorICAgICAgICAgICAgcFNILT5BcHBlbmRNZW51SXRlbShoUG9wdXAsIDAsIEwiIik7CisKKyAgICAgICAgICBwdFBvcHVwID0gR2V0V29yZFJpZ2h0Qm90dG9tUG9pbnQod3JMYXRpbi5FbmRQb3MpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgSVBXTF9Qcm92aWRlciogcFByb3ZpZGVyID0gR2V0UHJvdmlkZXIoKTsKKworICBpZiAoSGFzRmxhZyhQRVNfVU5ETykpIHsKKyAgICBwU0gtPkFwcGVuZE1lbnVJdGVtKAorICAgICAgICBoUG9wdXAsIFdNX1BXTEVESVRfVU5ETywKKyAgICAgICAgcFByb3ZpZGVyID8gcFByb3ZpZGVyLT5Mb2FkUG9wdXBNZW51U3RyaW5nKDApIDogTCImVW5kbyIpOworICAgIHBTSC0+QXBwZW5kTWVudUl0ZW0oCisgICAgICAgIGhQb3B1cCwgV01fUFdMRURJVF9SRURPLAorICAgICAgICBwUHJvdmlkZXIgPyBwUHJvdmlkZXItPkxvYWRQb3B1cE1lbnVTdHJpbmcoMSkgOiBMIiZSZWRvIik7CisgICAgcFNILT5BcHBlbmRNZW51SXRlbShoUG9wdXAsIDAsIEwiIik7CisKKyAgICBpZiAoIW1fcEVkaXQtPkNhblVuZG8oKSkKKyAgICAgIHBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX1VORE8sIEZBTFNFKTsKKyAgICBpZiAoIW1fcEVkaXQtPkNhblJlZG8oKSkKKyAgICAgIHBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX1JFRE8sIEZBTFNFKTsKKyAgfQorCisgIHBTSC0+QXBwZW5kTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NVVCwKKyAgICAgICAgICAgICAgICAgICAgICBwUHJvdmlkZXIgPyBwUHJvdmlkZXItPkxvYWRQb3B1cE1lbnVTdHJpbmcoMikgOiBMIkN1JnQiKTsKKyAgcFNILT5BcHBlbmRNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfQ09QWSwKKyAgICAgICAgICAgICAgICAgICAgICBwUHJvdmlkZXIgPyBwUHJvdmlkZXItPkxvYWRQb3B1cE1lbnVTdHJpbmcoMykgOiBMIiZDb3B5Iik7CisgIHBTSC0+QXBwZW5kTWVudUl0ZW0oCisgICAgICBoUG9wdXAsIFdNX1BXTEVESVRfUEFTVEUsCisgICAgICBwUHJvdmlkZXIgPyBwUHJvdmlkZXItPkxvYWRQb3B1cE1lbnVTdHJpbmcoNCkgOiBMIiZQYXN0ZSIpOworICBwU0gtPkFwcGVuZE1lbnVJdGVtKAorICAgICAgaFBvcHVwLCBXTV9QV0xFRElUX0RFTEVURSwKKyAgICAgIHBQcm92aWRlciA/IHBQcm92aWRlci0+TG9hZFBvcHVwTWVudVN0cmluZyg1KSA6IEwiJkRlbGV0ZSIpOworCisgIENGWF9XaWRlU3RyaW5nIHN3VGV4dCA9IHBTSC0+R2V0Q2xpcGJvYXJkVGV4dChHZXRBdHRhY2hlZEhXbmQoKSk7CisgIGlmIChzd1RleHQuSXNFbXB0eSgpKQorICAgIHBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX1BBU1RFLCBGQUxTRSk7CisKKyAgaWYgKCFtX3BFZGl0LT5Jc1NlbGVjdGVkKCkpIHsKKyAgICBwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9DVVQsIEZBTFNFKTsKKyAgICBwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9DT1BZLCBGQUxTRSk7CisgICAgcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfREVMRVRFLCBGQUxTRSk7CisgIH0KKworICBpZiAoSXNSZWFkT25seSgpKSB7CisgICAgcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfQ1VULCBGQUxTRSk7CisgICAgcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfREVMRVRFLCBGQUxTRSk7CisgICAgcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfUEFTVEUsIEZBTFNFKTsKKyAgfQorCisgIGlmIChIYXNGbGFnKFBFU19QQVNTV09SRCkpIHsKKyAgICBwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9DVVQsIEZBTFNFKTsKKyAgICBwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9DT1BZLCBGQUxTRSk7CisgIH0KKworICBpZiAoSGFzRmxhZyhQRVNfTk9SRUFEKSkgeworICAgIHBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NVVCwgRkFMU0UpOworICAgIHBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NPUFksIEZBTFNFKTsKKyAgfQorCisgIHBTSC0+QXBwZW5kTWVudUl0ZW0oaFBvcHVwLCAwLCBMIiIpOworICBwU0gtPkFwcGVuZE1lbnVJdGVtKAorICAgICAgaFBvcHVwLCBXTV9QV0xFRElUX1NFTEVDVEFMTCwKKyAgICAgIHBQcm92aWRlciA/IHBQcm92aWRlci0+TG9hZFBvcHVwTWVudVN0cmluZyg2KSA6IEwiJlNlbGVjdCBBbGwiKTsKKworICBpZiAobV9wRWRpdC0+R2V0VG90YWxXb3JkcygpID09IDApIHsKKyAgICBwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9TRUxFQ1RBTEwsIEZBTFNFKTsKKyAgfQorCisgIGludDMyX3QgeCwgeTsKKyAgUFdMdG9XbmQocHRQb3B1cCwgeCwgeSk7CisgIHBTSC0+Q2xpZW50VG9TY3JlZW4oR2V0QXR0YWNoZWRIV25kKCksIHgsIHkpOworICBwU0gtPlNldEN1cnNvcihGWENUX0FSUk9XKTsKKyAgaW50MzJfdCBuQ21kID0gcFNILT5UcmFja1BvcHVwTWVudShoUG9wdXAsIHgsIHksIEdldEF0dGFjaGVkSFduZCgpKTsKKworICBzd2l0Y2ggKG5DbWQpIHsKKyAgICBjYXNlIFdNX1BXTEVESVRfVU5ETzoKKyAgICAgIFVuZG8oKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV01fUFdMRURJVF9SRURPOgorICAgICAgUmVkbygpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXTV9QV0xFRElUX0NVVDoKKyAgICAgIEN1dFRleHQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV01fUFdMRURJVF9DT1BZOgorICAgICAgQ29weVRleHQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV01fUFdMRURJVF9QQVNURToKKyAgICAgIFBhc3RlVGV4dCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXTV9QV0xFRElUX0RFTEVURToKKyAgICAgIENsZWFyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdNX1BXTEVESVRfU0VMRUNUQUxMOgorICAgICAgU2VsZWN0QWxsKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdNX1BXTEVESVRfU1VHR0VTVCArIDA6CisgICAgICBTZXRTZWwobV9wRWRpdC0+V29yZFBsYWNlVG9Xb3JkSW5kZXgod3JMYXRpbi5CZWdpblBvcyksCisgICAgICAgICAgICAgbV9wRWRpdC0+V29yZFBsYWNlVG9Xb3JkSW5kZXgod3JMYXRpbi5FbmRQb3MpKTsKKyAgICAgIFJlcGxhY2VTZWwoc1N1Z2dlc3RXb3Jkc1swXS5VVEY4RGVjb2RlKCkuY19zdHIoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdNX1BXTEVESVRfU1VHR0VTVCArIDE6CisgICAgICBTZXRTZWwobV9wRWRpdC0+V29yZFBsYWNlVG9Xb3JkSW5kZXgod3JMYXRpbi5CZWdpblBvcyksCisgICAgICAgICAgICAgbV9wRWRpdC0+V29yZFBsYWNlVG9Xb3JkSW5kZXgod3JMYXRpbi5FbmRQb3MpKTsKKyAgICAgIFJlcGxhY2VTZWwoc1N1Z2dlc3RXb3Jkc1sxXS5VVEY4RGVjb2RlKCkuY19zdHIoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdNX1BXTEVESVRfU1VHR0VTVCArIDI6CisgICAgICBTZXRTZWwobV9wRWRpdC0+V29yZFBsYWNlVG9Xb3JkSW5kZXgod3JMYXRpbi5CZWdpblBvcyksCisgICAgICAgICAgICAgbV9wRWRpdC0+V29yZFBsYWNlVG9Xb3JkSW5kZXgod3JMYXRpbi5FbmRQb3MpKTsKKyAgICAgIFJlcGxhY2VTZWwoc1N1Z2dlc3RXb3Jkc1syXS5VVEY4RGVjb2RlKCkuY19zdHIoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdNX1BXTEVESVRfU1VHR0VTVCArIDM6CisgICAgICBTZXRTZWwobV9wRWRpdC0+V29yZFBsYWNlVG9Xb3JkSW5kZXgod3JMYXRpbi5CZWdpblBvcyksCisgICAgICAgICAgICAgbV9wRWRpdC0+V29yZFBsYWNlVG9Xb3JkSW5kZXgod3JMYXRpbi5FbmRQb3MpKTsKKyAgICAgIFJlcGxhY2VTZWwoc1N1Z2dlc3RXb3Jkc1szXS5VVEY4RGVjb2RlKCkuY19zdHIoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdNX1BXTEVESVRfU1VHR0VTVCArIDQ6CisgICAgICBTZXRTZWwobV9wRWRpdC0+V29yZFBsYWNlVG9Xb3JkSW5kZXgod3JMYXRpbi5CZWdpblBvcyksCisgICAgICAgICAgICAgbV9wRWRpdC0+V29yZFBsYWNlVG9Xb3JkSW5kZXgod3JMYXRpbi5FbmRQb3MpKTsKKyAgICAgIFJlcGxhY2VTZWwoc1N1Z2dlc3RXb3Jkc1s0XS5VVEY4RGVjb2RlKCkuY19zdHIoKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBwU0gtPkRlc3Ryb3lNZW51KGhQb3B1cCk7CisKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLSNkZWZpbmUgV01fUFdMRURJVF9VTkRPCQkJCQkweDAxCi0jZGVmaW5lIFdNX1BXTEVESVRfUkVETwkJCQkJMHgwMgotI2RlZmluZSBXTV9QV0xFRElUX0NVVAkJCQkJMHgwMwotI2RlZmluZSBXTV9QV0xFRElUX0NPUFkJCQkJCTB4MDQKLSNkZWZpbmUgV01fUFdMRURJVF9QQVNURQkJCQkweDA1Ci0jZGVmaW5lIFdNX1BXTEVESVRfREVMRVRFCQkJCTB4MDYKLSNkZWZpbmUgV01fUFdMRURJVF9TRUxFQ1RBTEwJCQkweDA3Ci0jZGVmaW5lIFdNX1BXTEVESVRfU1VHR0VTVAkJCQkweDA4Cit2b2lkIENQV0xfRWRpdDo6T25TZXRGb2N1cygpIHsKKyAgU2V0RWRpdENhcmV0KFRSVUUpOwogCi1GWF9CT09MIENQV0xfRWRpdDo6T25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKLXsKLQlpZiAobV9iTW91c2VEb3duKSByZXR1cm4gRkFMU0U7CisgIGlmICghSXNSZWFkT25seSgpKSB7CisgICAgaWYgKElQV0xfRm9jdXNIYW5kbGVyKiBwRm9jdXNIYW5kbGVyID0gR2V0Rm9jdXNIYW5kbGVyKCkpCisgICAgICBwRm9jdXNIYW5kbGVyLT5PblNldEZvY3VzKHRoaXMpOworICB9CiAKLQlDUFdMX1duZDo6T25SQnV0dG9uVXAocG9pbnQsIG5GbGFnKTsKLQkKLQlpZiAoIUhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykgJiYgIUNsaWVudEhpdFRlc3QocG9pbnQpKSByZXR1cm4gVFJVRTsKLQotCUlGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCk7Ci0JaWYgKCFwU0gpIHJldHVybiBGQUxTRTsKLQotCXRoaXMtPlNldEZvY3VzKCk7Ci0KLQlDUFZUX1dvcmRSYW5nZSB3ckxhdGluID0gR2V0TGF0aW5Xb3Jkc1JhbmdlKHBvaW50KTsKLQlDRlhfV2lkZVN0cmluZyBzd0xhdGluID0gbV9wRWRpdC0+R2V0UmFuZ2VUZXh0KHdyTGF0aW4pOwotCi0JRlhfSE1FTlUgaFBvcHVwID0gcFNILT5DcmVhdGVQb3B1cE1lbnUoKTsKLQlpZiAoIWhQb3B1cCkgcmV0dXJuIEZBTFNFOwotCi0JQ0ZYX0J5dGVTdHJpbmdBcnJheSBzU3VnZ2VzdFdvcmRzOwotCUNQREZfUG9pbnQgcHRQb3B1cCA9IHBvaW50OwotCi0JaWYgKCFJc1JlYWRPbmx5KCkpCi0JewotCQlpZiAoSGFzRmxhZyhQRVNfU1BFTExDSEVDSykgJiYgIXN3TGF0aW4uSXNFbXB0eSgpKQotCQl7Ci0JCQlpZiAobV9wU3BlbGxDaGVjaykKLQkJCXsKLQkJCQlDRlhfQnl0ZVN0cmluZyBzTGF0aW4gPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoc3dMYXRpbik7Ci0KLQkJCQlpZiAoIW1fcFNwZWxsQ2hlY2stPkNoZWNrV29yZChzTGF0aW4pKQotCQkJCXsJCQkJCQkKLQkJCQkJbV9wU3BlbGxDaGVjay0+U3VnZ2VzdFdvcmRzKHNMYXRpbixzU3VnZ2VzdFdvcmRzKTsKLQotCQkJCQlGWF9JTlQzMiBuU3VnZ2VzdCA9IHNTdWdnZXN0V29yZHMuR2V0U2l6ZSgpOwotCi0JCQkJCWZvciAoRlhfSU5UMzIgbldvcmQ9MDsgbldvcmQ8blN1Z2dlc3Q7IG5Xb3JkKyspCi0JCQkJCXsJCi0JCQkJCQlwU0gtPkFwcGVuZE1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9TVUdHRVNUK25Xb3JkLCBzU3VnZ2VzdFdvcmRzW25Xb3JkXS5VVEY4RGVjb2RlKCkpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKG5TdWdnZXN0ID4gMCkKLQkJCQkJCXBTSC0+QXBwZW5kTWVudUl0ZW0oaFBvcHVwLCAwLCBMIiIpOwotCi0JCQkJCXB0UG9wdXAgPSBHZXRXb3JkUmlnaHRCb3R0b21Qb2ludCh3ckxhdGluLkVuZFBvcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JSVBXTF9Qcm92aWRlciogcFByb3ZpZGVyID0gdGhpcy0+R2V0UHJvdmlkZXIoKTsKLQotCWlmIChIYXNGbGFnKFBFU19VTkRPKSkKLQl7Ci0JCXBTSC0+QXBwZW5kTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX1VORE8sIAotCQkJcFByb3ZpZGVyID8gcFByb3ZpZGVyLT5Mb2FkUG9wdXBNZW51U3RyaW5nKDApIDogTCImVW5kbyIpOwotCQlwU0gtPkFwcGVuZE1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9SRURPLAotCQkJcFByb3ZpZGVyID8gcFByb3ZpZGVyLT5Mb2FkUG9wdXBNZW51U3RyaW5nKDEpIDogTCImUmVkbyIpOwotCQlwU0gtPkFwcGVuZE1lbnVJdGVtKGhQb3B1cCwgMCwgTCIiKTsKLQotCQlpZiAoIW1fcEVkaXQtPkNhblVuZG8oKSkKLQkJCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX1VORE8sIEZBTFNFKTsKLQkJaWYgKCFtX3BFZGl0LT5DYW5SZWRvKCkpCi0JCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9SRURPLCBGQUxTRSk7Ci0JfQotCi0JcFNILT5BcHBlbmRNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfQ1VULCAKLQkJcFByb3ZpZGVyID8gcFByb3ZpZGVyLT5Mb2FkUG9wdXBNZW51U3RyaW5nKDIpIDogTCJDdSZ0Iik7Ci0JcFNILT5BcHBlbmRNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfQ09QWSwgCi0JCXBQcm92aWRlciA/IHBQcm92aWRlci0+TG9hZFBvcHVwTWVudVN0cmluZygzKSA6IEwiJkNvcHkiKTsKLQlwU0gtPkFwcGVuZE1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9QQVNURSwgCi0JCXBQcm92aWRlciA/IHBQcm92aWRlci0+TG9hZFBvcHVwTWVudVN0cmluZyg0KSA6IEwiJlBhc3RlIik7Ci0JcFNILT5BcHBlbmRNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfREVMRVRFLCAKLQkJcFByb3ZpZGVyID8gcFByb3ZpZGVyLT5Mb2FkUG9wdXBNZW51U3RyaW5nKDUpIDogTCImRGVsZXRlIik7Ci0KLQlDRlhfV2lkZVN0cmluZyBzd1RleHQgPSBwU0gtPkdldENsaXBib2FyZFRleHQodGhpcy0+R2V0QXR0YWNoZWRIV25kKCkpOwotCWlmIChzd1RleHQuSXNFbXB0eSgpKQotCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9QQVNURSwgRkFMU0UpOwotCi0JaWYgKCFtX3BFZGl0LT5Jc1NlbGVjdGVkKCkpCi0JewotCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9DVVQsIEZBTFNFKTsKLQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfQ09QWSwgRkFMU0UpOwotCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9ERUxFVEUsIEZBTFNFKTsKLQl9Ci0KLQlpZiAoSXNSZWFkT25seSgpKQotCXsKLQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfQ1VULCBGQUxTRSk7Ci0JCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0RFTEVURSwgRkFMU0UpOwotCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9QQVNURSwgRkFMU0UpOwkJCQotCX0KLQotCWlmIChIYXNGbGFnKFBFU19QQVNTV09SRCkpCi0JewotCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9DVVQsIEZBTFNFKTsKLQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfQ09QWSwgRkFMU0UpOwotCX0KLQotCWlmIChIYXNGbGFnKFBFU19OT1JFQUQpKQotCXsKLQkJcFNILT5FbmFibGVNZW51SXRlbShoUG9wdXAsIFdNX1BXTEVESVRfQ1VULCBGQUxTRSk7Ci0JCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0NPUFksIEZBTFNFKTsKLQl9Ci0KLQlwU0gtPkFwcGVuZE1lbnVJdGVtKGhQb3B1cCwgMCwgTCIiKTsKLQlwU0gtPkFwcGVuZE1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9TRUxFQ1RBTEwsCi0JCXBQcm92aWRlciA/IHBQcm92aWRlci0+TG9hZFBvcHVwTWVudVN0cmluZyg2KSA6IEwiJlNlbGVjdCBBbGwiKTsKLQotCWlmIChtX3BFZGl0LT5HZXRUb3RhbFdvcmRzKCkgPT0gMCkKLQl7Ci0JCXBTSC0+RW5hYmxlTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX1NFTEVDVEFMTCwgRkFMU0UpOwotCX0KLQotCUZYX0lOVDMyIHgsIHk7Ci0JUFdMdG9XbmQocHRQb3B1cCwgeCwgeSk7Ci0JcFNILT5DbGllbnRUb1NjcmVlbihHZXRBdHRhY2hlZEhXbmQoKSwgeCwgeSk7Ci0JcFNILT5TZXRDdXJzb3IoRlhDVF9BUlJPVyk7Ci0JRlhfSU5UMzIgbkNtZCA9IHBTSC0+VHJhY2tQb3B1cE1lbnUoaFBvcHVwLAotCQkJCQkgeCwKLQkJCQkJIHksCi0JCQkJCSBHZXRBdHRhY2hlZEhXbmQoKSk7Ci0KLQotCXN3aXRjaCAobkNtZCkKLQl7Ci0JY2FzZSBXTV9QV0xFRElUX1VORE86Ci0JCVVuZG8oKTsKLQkJYnJlYWs7Ci0JY2FzZSBXTV9QV0xFRElUX1JFRE86Ci0JCVJlZG8oKTsKLQkJYnJlYWs7Ci0JY2FzZSBXTV9QV0xFRElUX0NVVDoKLQkJdGhpcy0+Q3V0VGV4dCgpOwotCQlicmVhazsKLQljYXNlIFdNX1BXTEVESVRfQ09QWToKLQkJdGhpcy0+Q29weVRleHQoKTsKLQkJYnJlYWs7Ci0JY2FzZSBXTV9QV0xFRElUX1BBU1RFOgotCQl0aGlzLT5QYXN0ZVRleHQoKTsKLQkJYnJlYWs7Ci0JY2FzZSBXTV9QV0xFRElUX0RFTEVURToKLQkJdGhpcy0+Q2xlYXIoKTsKLQkJYnJlYWs7Ci0JY2FzZSBXTV9QV0xFRElUX1NFTEVDVEFMTDoKLQkJdGhpcy0+U2VsZWN0QWxsKCk7Ci0JCWJyZWFrOwotCWNhc2UgV01fUFdMRURJVF9TVUdHRVNUICsgMDoKLQkJU2V0U2VsKG1fcEVkaXQtPldvcmRQbGFjZVRvV29yZEluZGV4KHdyTGF0aW4uQmVnaW5Qb3MpLG1fcEVkaXQtPldvcmRQbGFjZVRvV29yZEluZGV4KHdyTGF0aW4uRW5kUG9zKSk7Ci0JCVJlcGxhY2VTZWwoc1N1Z2dlc3RXb3Jkc1swXS5VVEY4RGVjb2RlKCkuY19zdHIoKSk7Ci0JCWJyZWFrOwotCWNhc2UgV01fUFdMRURJVF9TVUdHRVNUICsgMToKLQkJU2V0U2VsKG1fcEVkaXQtPldvcmRQbGFjZVRvV29yZEluZGV4KHdyTGF0aW4uQmVnaW5Qb3MpLG1fcEVkaXQtPldvcmRQbGFjZVRvV29yZEluZGV4KHdyTGF0aW4uRW5kUG9zKSk7Ci0JCVJlcGxhY2VTZWwoc1N1Z2dlc3RXb3Jkc1sxXS5VVEY4RGVjb2RlKCkuY19zdHIoKSk7Ci0JCWJyZWFrOwotCWNhc2UgV01fUFdMRURJVF9TVUdHRVNUICsgMjoKLQkJU2V0U2VsKG1fcEVkaXQtPldvcmRQbGFjZVRvV29yZEluZGV4KHdyTGF0aW4uQmVnaW5Qb3MpLG1fcEVkaXQtPldvcmRQbGFjZVRvV29yZEluZGV4KHdyTGF0aW4uRW5kUG9zKSk7Ci0JCVJlcGxhY2VTZWwoc1N1Z2dlc3RXb3Jkc1syXS5VVEY4RGVjb2RlKCkuY19zdHIoKSk7Ci0JCWJyZWFrOwotCWNhc2UgV01fUFdMRURJVF9TVUdHRVNUICsgMzoKLQkJU2V0U2VsKG1fcEVkaXQtPldvcmRQbGFjZVRvV29yZEluZGV4KHdyTGF0aW4uQmVnaW5Qb3MpLG1fcEVkaXQtPldvcmRQbGFjZVRvV29yZEluZGV4KHdyTGF0aW4uRW5kUG9zKSk7Ci0JCVJlcGxhY2VTZWwoc1N1Z2dlc3RXb3Jkc1szXS5VVEY4RGVjb2RlKCkuY19zdHIoKSk7Ci0JCWJyZWFrOwotCWNhc2UgV01fUFdMRURJVF9TVUdHRVNUICsgNDoKLQkJU2V0U2VsKG1fcEVkaXQtPldvcmRQbGFjZVRvV29yZEluZGV4KHdyTGF0aW4uQmVnaW5Qb3MpLG1fcEVkaXQtPldvcmRQbGFjZVRvV29yZEluZGV4KHdyTGF0aW4uRW5kUG9zKSk7Ci0JCVJlcGxhY2VTZWwoc1N1Z2dlc3RXb3Jkc1s0XS5VVEY4RGVjb2RlKCkuY19zdHIoKSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXBTSC0+RGVzdHJveU1lbnUoaFBvcHVwKTsKLQotCXJldHVybiBUUlVFOworICBtX2JGb2N1cyA9IFRSVUU7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0OjpPblNldEZvY3VzKCkKLXsKLQlTZXRFZGl0Q2FyZXQoVFJVRSk7Cit2b2lkIENQV0xfRWRpdDo6T25LaWxsRm9jdXMoKSB7CisgIFNob3dWU2Nyb2xsQmFyKEZBTFNFKTsKIAotCWlmICghSXNSZWFkT25seSgpKQotCXsKLQkJaWYgKElQV0xfRm9jdXNIYW5kbGVyKiBwRm9jdXNIYW5kbGVyID0gR2V0Rm9jdXNIYW5kbGVyKCkpCi0JCQlwRm9jdXNIYW5kbGVyLT5PblNldEZvY3VzKHRoaXMpOwotCX0KKyAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOworICBTZXRDYXJldChGQUxTRSwgQ1BERl9Qb2ludCgwLjBmLCAwLjBmKSwgQ1BERl9Qb2ludCgwLjBmLCAwLjBmKSk7CiAKLQltX2JGb2N1cyA9IFRSVUU7CisgIFNldENoYXJTZXQoMCk7CisKKyAgaWYgKCFJc1JlYWRPbmx5KCkpIHsKKyAgICBpZiAoSVBXTF9Gb2N1c0hhbmRsZXIqIHBGb2N1c0hhbmRsZXIgPSBHZXRGb2N1c0hhbmRsZXIoKSkKKyAgICAgIHBGb2N1c0hhbmRsZXItPk9uS2lsbEZvY3VzKHRoaXMpOworICB9CisKKyAgbV9iRm9jdXMgPSBGQUxTRTsKIH0KIAotdm9pZCBDUFdMX0VkaXQ6Ok9uS2lsbEZvY3VzKCkKLXsKLQlTaG93VlNjcm9sbEJhcihGQUxTRSk7Ci0JCi0JbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwotCVNldENhcmV0KEZBTFNFLCBDUERGX1BvaW50KDAuMGYsMC4wZiksIENQREZfUG9pbnQoMC4wZiwwLjBmKSk7Ci0JCi0JU2V0Q2hhclNldCgwKTsKLQotCWlmICghSXNSZWFkT25seSgpKQotCXsKLQkJaWYgKElQV0xfRm9jdXNIYW5kbGVyKiBwRm9jdXNIYW5kbGVyID0gR2V0Rm9jdXNIYW5kbGVyKCkpCi0JCQlwRm9jdXNIYW5kbGVyLT5PbktpbGxGb2N1cyh0aGlzKTsKLQl9Ci0KLQltX2JGb2N1cyA9IEZBTFNFOwordm9pZCBDUFdMX0VkaXQ6OlNldEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUsIEZYX0JPT0wgYlBhaW50IC8qID0gVFJVRSovKSB7CisgIG1fcEVkaXQtPlNldEhvcnpTY2FsZShuSG9yelNjYWxlLCBiUGFpbnQpOwogfQogCi12b2lkIENQV0xfRWRpdDo6U2V0SG9yelNjYWxlKEZYX0lOVDMyIG5Ib3J6U2NhbGUsIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCi17Ci0JbV9wRWRpdC0+U2V0SG9yelNjYWxlKG5Ib3J6U2NhbGUsIGJQYWludCk7Cit2b2lkIENQV0xfRWRpdDo6U2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UsIEZYX0JPT0wgYlBhaW50IC8qID0gVFJVRSovKSB7CisgIG1fcEVkaXQtPlNldENoYXJTcGFjZShmQ2hhclNwYWNlLCBiUGFpbnQpOwogfQogCi12b2lkIENQV0xfRWRpdDo6U2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UsIEZYX0JPT0wgYlBhaW50LyogPSBUUlVFKi8pCi17Ci0JbV9wRWRpdC0+U2V0Q2hhclNwYWNlKGZDaGFyU3BhY2UsIGJQYWludCk7Cit2b2lkIENQV0xfRWRpdDo6U2V0TGluZUxlYWRpbmcoRlhfRkxPQVQgZkxpbmVMZWFkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlBhaW50IC8qID0gVFJVRSovKSB7CisgIG1fcEVkaXQtPlNldExpbmVMZWFkaW5nKGZMaW5lTGVhZGluZywgYlBhaW50KTsKIH0KIAotdm9pZCBDUFdMX0VkaXQ6OlNldExpbmVMZWFkaW5nKEZYX0ZMT0FUIGZMaW5lTGVhZGluZywgRlhfQk9PTCBiUGFpbnQvKiA9IFRSVUUqLykKLXsKLQltX3BFZGl0LT5TZXRMaW5lTGVhZGluZyhmTGluZUxlYWRpbmcsIGJQYWludCk7CitDRlhfQnl0ZVN0cmluZyBDUFdMX0VkaXQ6OkdldFNlbGVjdEFwcGVhcmFuY2VTdHJlYW0oCisgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQpIGNvbnN0IHsKKyAgQ1BWVF9Xb3JkUmFuZ2Ugd3IgPSBHZXRTZWxlY3RXb3JkUmFuZ2UoKTsKKyAgcmV0dXJuIENQV0xfVXRpbHM6OkdldEVkaXRTZWxBcHBTdHJlYW0obV9wRWRpdCwgcHRPZmZzZXQsICZ3cik7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfRWRpdDo6R2V0U2VsZWN0QXBwZWFyYW5jZVN0cmVhbShjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQpIGNvbnN0Ci17Ci0JQ1BWVF9Xb3JkUmFuZ2Ugd3IgPSBHZXRTZWxlY3RXb3JkUmFuZ2UoKTsKLQlyZXR1cm4gQ1BXTF9VdGlsczo6R2V0RWRpdFNlbEFwcFN0cmVhbShtX3BFZGl0LHB0T2Zmc2V0LCZ3cik7CitDUFZUX1dvcmRSYW5nZSBDUFdMX0VkaXQ6OkdldFNlbGVjdFdvcmRSYW5nZSgpIGNvbnN0IHsKKyAgaWYgKG1fcEVkaXQtPklzU2VsZWN0ZWQoKSkgeworICAgIGludDMyX3QgblN0YXJ0ID0gLTE7CisgICAgaW50MzJfdCBuRW5kID0gLTE7CisKKyAgICBtX3BFZGl0LT5HZXRTZWwoblN0YXJ0LCBuRW5kKTsKKworICAgIENQVlRfV29yZFBsYWNlIHdwU3RhcnQgPSBtX3BFZGl0LT5Xb3JkSW5kZXhUb1dvcmRQbGFjZShuU3RhcnQpOworICAgIENQVlRfV29yZFBsYWNlIHdwRW5kID0gbV9wRWRpdC0+V29yZEluZGV4VG9Xb3JkUGxhY2UobkVuZCk7CisKKyAgICByZXR1cm4gQ1BWVF9Xb3JkUmFuZ2Uod3BTdGFydCwgd3BFbmQpOworICB9CisKKyAgcmV0dXJuIENQVlRfV29yZFJhbmdlKCk7CiB9CiAKLUNQVlRfV29yZFJhbmdlIENQV0xfRWRpdDo6R2V0U2VsZWN0V29yZFJhbmdlKCkgY29uc3QKLXsKLQlpZiAobV9wRWRpdC0+SXNTZWxlY3RlZCgpKQotCXsKLQkJRlhfSU5UMzIgblN0YXJ0ID0gLTE7Ci0JCUZYX0lOVDMyIG5FbmQgPSAtMTsKK0NGWF9CeXRlU3RyaW5nIENQV0xfRWRpdDo6R2V0VGV4dEFwcGVhcmFuY2VTdHJlYW0oCisgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQpIGNvbnN0IHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNSZXQ7CisgIENGWF9CeXRlU3RyaW5nIHNFZGl0ID0gQ1BXTF9VdGlsczo6R2V0RWRpdEFwcFN0cmVhbShtX3BFZGl0LCBwdE9mZnNldCk7CiAKLQkJbV9wRWRpdC0+R2V0U2VsKG5TdGFydCwgbkVuZCk7CisgIGlmIChzRWRpdC5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICBzUmV0IDw8ICJCVFxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRUZXh0Q29sb3IoKSkgPDwgc0VkaXQKKyAgICAgICAgIDw8ICJFVFxuIjsKKyAgfQogCi0JCUNQVlRfV29yZFBsYWNlIHdwU3RhcnQgPSBtX3BFZGl0LT5Xb3JkSW5kZXhUb1dvcmRQbGFjZShuU3RhcnQpOwotCQlDUFZUX1dvcmRQbGFjZSB3cEVuZCA9IG1fcEVkaXQtPldvcmRJbmRleFRvV29yZFBsYWNlKG5FbmQpOwotCi0JCXJldHVybiBDUFZUX1dvcmRSYW5nZSh3cFN0YXJ0LHdwRW5kKTsKLQl9Ci0KLQlyZXR1cm4gQ1BWVF9Xb3JkUmFuZ2UoKTsKKyAgcmV0dXJuIHNSZXQuR2V0Qnl0ZVN0cmluZygpOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUFdMX0VkaXQ6OkdldFRleHRBcHBlYXJhbmNlU3RyZWFtKGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCkgY29uc3QKLXsKLQlDRlhfQnl0ZVRleHRCdWYgc1JldDsKLQlDRlhfQnl0ZVN0cmluZyBzRWRpdCA9IENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0obV9wRWRpdCxwdE9mZnNldCk7Ci0JCi0JaWYgKHNFZGl0LkdldExlbmd0aCgpID4gMCkKLQl7Ci0JCXNSZXQgPDwgIkJUXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldFRleHRDb2xvcigpKSA8PCBzRWRpdCA8PCAiRVRcbiI7Ci0JfQorQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9FZGl0OjpHZXRDYXJldEFwcGVhcmFuY2VTdHJlYW0oCisgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQpIGNvbnN0IHsKKyAgaWYgKG1fcEVkaXRDYXJldCkKKyAgICByZXR1cm4gbV9wRWRpdENhcmV0LT5HZXRDYXJldEFwcGVhcmFuY2VTdHJlYW0ocHRPZmZzZXQpOwogCi0JcmV0dXJuIHNSZXQuR2V0Qnl0ZVN0cmluZygpOworICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9FZGl0OjpHZXRDYXJldEFwcGVhcmFuY2VTdHJlYW0oY29uc3QgQ1BERl9Qb2ludCAmIHB0T2Zmc2V0KSBjb25zdAotewotCWlmIChtX3BFZGl0Q2FyZXQpCi0JCXJldHVybiBtX3BFZGl0Q2FyZXQtPkdldENhcmV0QXBwZWFyYW5jZVN0cmVhbShwdE9mZnNldCk7CitDUERGX1BvaW50IENQV0xfRWRpdDo6R2V0V29yZFJpZ2h0Qm90dG9tUG9pbnQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwV29yZCkgeworICBDUERGX1BvaW50IHB0KDAuMGYsIDAuMGYpOwogCi0JcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7CisgIGlmIChJRlhfRWRpdF9JdGVyYXRvciogcEl0ZXJhdG9yID0gbV9wRWRpdC0+R2V0SXRlcmF0b3IoKSkgeworICAgIENQVlRfV29yZFBsYWNlIHdwT2xkID0gcEl0ZXJhdG9yLT5HZXRBdCgpOworICAgIHBJdGVyYXRvci0+U2V0QXQod3BXb3JkKTsKKyAgICBDUFZUX1dvcmQgd29yZDsKKyAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7CisgICAgICBwdCA9IENQREZfUG9pbnQod29yZC5wdFdvcmQueCArIHdvcmQuZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgIHdvcmQucHRXb3JkLnkgKyB3b3JkLmZEZXNjZW50KTsKKyAgICB9CisKKyAgICBwSXRlcmF0b3ItPlNldEF0KHdwT2xkKTsKKyAgfQorCisgIHJldHVybiBwdDsKIH0KIAotQ1BERl9Qb2ludCBDUFdMX0VkaXQ6OkdldFdvcmRSaWdodEJvdHRvbVBvaW50KGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cFdvcmQpCi17Ci0JQ1BERl9Qb2ludCBwdCgwLjBmLCAwLjBmKTsKLQotCWlmIChJRlhfRWRpdF9JdGVyYXRvciAqIHBJdGVyYXRvciA9IG1fcEVkaXQtPkdldEl0ZXJhdG9yKCkpCi0JewotCQlDUFZUX1dvcmRQbGFjZSB3cE9sZCA9IHBJdGVyYXRvci0+R2V0QXQoKTsKLQkJcEl0ZXJhdG9yLT5TZXRBdCh3cFdvcmQpOwotCQlDUFZUX1dvcmQgd29yZDsKLQkJaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkKLQkJewotCQkJcHQgPSBDUERGX1BvaW50KHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aCwgd29yZC5wdFdvcmQueSArIHdvcmQuZkRlc2NlbnQpOwotCQl9Ci0KLQkJcEl0ZXJhdG9yLT5TZXRBdCh3cE9sZCk7Ci0JfQotCi0JcmV0dXJuIHB0OworRlhfQk9PTCBDUFdMX0VkaXQ6OklzVGV4dEZ1bGwoKSBjb25zdCB7CisgIHJldHVybiBtX3BFZGl0LT5Jc1RleHRGdWxsKCk7CiB9CiAKLUZYX0JPT0wJQ1BXTF9FZGl0OjpJc1RleHRGdWxsKCkgY29uc3QKLXsKLQlyZXR1cm4gbV9wRWRpdC0+SXNUZXh0RnVsbCgpOworRlhfRkxPQVQgQ1BXTF9FZGl0OjpHZXRDaGFyQXJyYXlBdXRvRm9udFNpemUoQ1BERl9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgcmNQbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJBcnJheSkgeworICBpZiAocEZvbnQgJiYgIXBGb250LT5Jc1N0YW5kYXJkRm9udCgpKSB7CisgICAgRlhfUkVDVCByY0JCb3g7CisgICAgcEZvbnQtPkdldEZvbnRCQm94KHJjQkJveCk7CisKKyAgICBDUERGX1JlY3QgcmNDZWxsID0gcmNQbGF0ZTsKKyAgICBGWF9GTE9BVCB4ZGl2ID0gcmNDZWxsLldpZHRoKCkgLyBuQ2hhckFycmF5ICogMTAwMC4wZiAvIHJjQkJveC5XaWR0aCgpOworICAgIEZYX0ZMT0FUIHlkaXYgPSAtcmNDZWxsLkhlaWdodCgpICogMTAwMC4wZiAvIHJjQkJveC5IZWlnaHQoKTsKKworICAgIHJldHVybiB4ZGl2IDwgeWRpdiA/IHhkaXYgOiB5ZGl2OworICB9CisKKyAgcmV0dXJuIDAuMGY7CiB9CiAKLUZYX0ZMT0FUIENQV0xfRWRpdDo6R2V0Q2hhckFycmF5QXV0b0ZvbnRTaXplKENQREZfRm9udCogcEZvbnQsIGNvbnN0IENQREZfUmVjdCYgcmNQbGF0ZSwgRlhfSU5UMzIgbkNoYXJBcnJheSkKLXsKLQlpZiAocEZvbnQgJiYgIXBGb250LT5Jc1N0YW5kYXJkRm9udCgpKQotCXsKLQkJRlhfUkVDVCByY0JCb3g7Ci0JCXBGb250LT5HZXRGb250QkJveChyY0JCb3gpOwordm9pZCBDUFdMX0VkaXQ6OlNldENoYXJBcnJheShpbnQzMl90IG5DaGFyQXJyYXkpIHsKKyAgaWYgKEhhc0ZsYWcoUEVTX0NIQVJBUlJBWSkgJiYgbkNoYXJBcnJheSA+IDApIHsKKyAgICBtX3BFZGl0LT5TZXRDaGFyQXJyYXkobkNoYXJBcnJheSk7CisgICAgbV9wRWRpdC0+U2V0VGV4dE92ZXJmbG93KFRSVUUpOwogCi0JCUNQREZfUmVjdCByY0NlbGwgPSByY1BsYXRlOwotCQlGWF9GTE9BVCB4ZGl2ID0gcmNDZWxsLldpZHRoKCkgLyBuQ2hhckFycmF5ICogMTAwMC4wZiAvIHJjQkJveC5XaWR0aCgpOwotCQlGWF9GTE9BVCB5ZGl2ID0gLSByY0NlbGwuSGVpZ2h0KCkgKiAxMDAwLjBmIC8gcmNCQm94LkhlaWdodCgpOwotCi0JCXJldHVybiB4ZGl2IDwgeWRpdiA/IHhkaXYgOiB5ZGl2OwotCX0KLQotCXJldHVybiAwLjBmOworICAgIGlmIChIYXNGbGFnKFBXU19BVVRPRk9OVFNJWkUpKSB7CisgICAgICBpZiAoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXAgPSBHZXRGb250TWFwKCkpIHsKKyAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplID0gR2V0Q2hhckFycmF5QXV0b0ZvbnRTaXplKAorICAgICAgICAgICAgcEZvbnRNYXAtPkdldFBERkZvbnQoMCksIEdldENsaWVudFJlY3QoKSwgbkNoYXJBcnJheSk7CisgICAgICAgIGlmIChmRm9udFNpemUgPiAwLjBmKSB7CisgICAgICAgICAgbV9wRWRpdC0+U2V0QXV0b0ZvbnRTaXplKEZBTFNFKTsKKyAgICAgICAgICBtX3BFZGl0LT5TZXRGb250U2l6ZShmRm9udFNpemUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ1BXTF9FZGl0OjpTZXRDaGFyQXJyYXkoRlhfSU5UMzIgbkNoYXJBcnJheSkKLXsKLQlpZiAoSGFzRmxhZyhQRVNfQ0hBUkFSUkFZKSAmJiBuQ2hhckFycmF5ID4gMCkKLQl7Ci0JCW1fcEVkaXQtPlNldENoYXJBcnJheShuQ2hhckFycmF5KTsJCi0JCW1fcEVkaXQtPlNldFRleHRPdmVyZmxvdyhUUlVFKTsKLQotCQlpZiAoSGFzRmxhZyhQV1NfQVVUT0ZPTlRTSVpFKSkKLQkJewotCQkJaWYgKElGWF9FZGl0X0ZvbnRNYXAqIHBGb250TWFwID0gdGhpcy0+R2V0Rm9udE1hcCgpKQotCQkJewotCQkJCUZYX0ZMT0FUIGZGb250U2l6ZSA9IEdldENoYXJBcnJheUF1dG9Gb250U2l6ZShwRm9udE1hcC0+R2V0UERGRm9udCgwKSwgR2V0Q2xpZW50UmVjdCgpLCBuQ2hhckFycmF5KTsKLQkJCQlpZiAoZkZvbnRTaXplID4gMC4wZikKLQkJCQl7Ci0JCQkJCW1fcEVkaXQtPlNldEF1dG9Gb250U2l6ZShGQUxTRSk7Ci0JCQkJCW1fcEVkaXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQordm9pZCBDUFdMX0VkaXQ6OlNldExpbWl0Q2hhcihpbnQzMl90IG5MaW1pdENoYXIpIHsKKyAgbV9wRWRpdC0+U2V0TGltaXRDaGFyKG5MaW1pdENoYXIpOwogfQogCi12b2lkIENQV0xfRWRpdDo6U2V0TGltaXRDaGFyKEZYX0lOVDMyIG5MaW1pdENoYXIpCi17Ci0JbV9wRWRpdC0+U2V0TGltaXRDaGFyKG5MaW1pdENoYXIpOwordm9pZCBDUFdMX0VkaXQ6OlJlcGxhY2VTZWwoY29uc3QgRlhfV0NIQVIqIGNzVGV4dCkgeworICBtX3BFZGl0LT5DbGVhcigpOworICBtX3BFZGl0LT5JbnNlcnRUZXh0KGNzVGV4dCk7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0OjpSZXBsYWNlU2VsKEZYX0xQQ1dTVFIgY3NUZXh0KQotewotCW1fcEVkaXQtPkNsZWFyKCk7Ci0JbV9wRWRpdC0+SW5zZXJ0VGV4dChjc1RleHQpOworQ1BERl9SZWN0IENQV0xfRWRpdDo6R2V0Rm9jdXNSZWN0KCkgY29uc3QgeworICByZXR1cm4gQ1BERl9SZWN0KCk7CiB9CiAKLUNQREZfUmVjdCBDUFdMX0VkaXQ6OkdldEZvY3VzUmVjdCgpIGNvbnN0Ci17Ci0JcmV0dXJuIENQREZfUmVjdCgpOwordm9pZCBDUFdMX0VkaXQ6OlNob3dWU2Nyb2xsQmFyKEZYX0JPT0wgYlNob3cpIHsKKyAgaWYgKENQV0xfU2Nyb2xsQmFyKiBwU2Nyb2xsID0gR2V0VlNjcm9sbEJhcigpKSB7CisgICAgaWYgKGJTaG93KSB7CisgICAgICBpZiAoIXBTY3JvbGwtPklzVmlzaWJsZSgpKSB7CisgICAgICAgIHBTY3JvbGwtPlNldFZpc2libGUoVFJVRSk7CisgICAgICAgIENQREZfUmVjdCByY1dpbmRvdyA9IEdldFdpbmRvd1JlY3QoKTsKKyAgICAgICAgbV9yY09sZFdpbmRvdyA9IHJjV2luZG93OworICAgICAgICByY1dpbmRvdy5yaWdodCArPSBQV0xfU0NST0xMQkFSX1dJRFRIOworICAgICAgICBNb3ZlKHJjV2luZG93LCBUUlVFLCBUUlVFKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKHBTY3JvbGwtPklzVmlzaWJsZSgpKSB7CisgICAgICAgIHBTY3JvbGwtPlNldFZpc2libGUoRkFMU0UpOworICAgICAgICBNb3ZlKG1fcmNPbGRXaW5kb3csIFRSVUUsIFRSVUUpOworICAgICAgfQorICAgIH0KKyAgfQogfQogCi12b2lkIENQV0xfRWRpdDo6U2hvd1ZTY3JvbGxCYXIoRlhfQk9PTCBiU2hvdykKLXsKLQlpZiAoQ1BXTF9TY3JvbGxCYXIgKiBwU2Nyb2xsID0gR2V0VlNjcm9sbEJhcigpKQotCXsKLQkJaWYgKGJTaG93KQotCQl7Ci0JCQlpZiAoIXBTY3JvbGwtPklzVmlzaWJsZSgpKQotCQkJewotCQkJCXBTY3JvbGwtPlNldFZpc2libGUoVFJVRSk7Ci0JCQkJQ1BERl9SZWN0IHJjV2luZG93ID0gR2V0V2luZG93UmVjdCgpOwotCQkJCW1fcmNPbGRXaW5kb3cgPSByY1dpbmRvdzsKLQkJCQlyY1dpbmRvdy5yaWdodCArPSBQV0xfU0NST0xMQkFSX1dJRFRIOwkJCQotCQkJCU1vdmUocmNXaW5kb3csIFRSVUUsIFRSVUUpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKHBTY3JvbGwtPklzVmlzaWJsZSgpKQotCQkJewotCQkJCXBTY3JvbGwtPlNldFZpc2libGUoRkFMU0UpOwotCQkJCU1vdmUobV9yY09sZFdpbmRvdywgVFJVRSwgVFJVRSk7Ci0JCQl9CQotCQl9Ci0JfQorRlhfQk9PTCBDUFdMX0VkaXQ6OklzVlNjcm9sbEJhclZpc2libGUoKSBjb25zdCB7CisgIGlmIChDUFdMX1Njcm9sbEJhciogcFNjcm9sbCA9IEdldFZTY3JvbGxCYXIoKSkgeworICAgIHJldHVybiBwU2Nyb2xsLT5Jc1Zpc2libGUoKTsKKyAgfQorCisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTAlDUFdMX0VkaXQ6OklzVlNjcm9sbEJhclZpc2libGUoKSBjb25zdAotewotCWlmIChDUFdMX1Njcm9sbEJhciAqIHBTY3JvbGwgPSBHZXRWU2Nyb2xsQmFyKCkpCi0JewotCQlyZXR1cm4gcFNjcm9sbC0+SXNWaXNpYmxlKCk7Ci0JfQotCi0JcmV0dXJuIEZBTFNFOwordm9pZCBDUFdMX0VkaXQ6OkVuYWJsZVNwZWxsQ2hlY2soRlhfQk9PTCBiRW5hYmxlZCkgeworICBpZiAoYkVuYWJsZWQpCisgICAgQWRkRmxhZyhQRVNfU1BFTExDSEVDSyk7CisgIGVsc2UKKyAgICBSZW1vdmVGbGFnKFBFU19TUEVMTENIRUNLKTsKIH0KIAotdm9pZCBDUFdMX0VkaXQ6OkVuYWJsZVNwZWxsQ2hlY2soRlhfQk9PTCBiRW5hYmxlZCkKLXsKLQlpZiAoYkVuYWJsZWQpCi0JCUFkZEZsYWcoUEVTX1NQRUxMQ0hFQ0spOwotCWVsc2UKLQkJUmVtb3ZlRmxhZyhQRVNfU1BFTExDSEVDSyk7Ci19CitGWF9CT09MIENQV0xfRWRpdDo6T25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKSB7CisgIGlmIChtX2JNb3VzZURvd24pCisgICAgcmV0dXJuIFRSVUU7CiAKLUZYX0JPT0wgQ1BXTF9FZGl0OjpPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JaWYgKG1fYk1vdXNlRG93bikgcmV0dXJuIFRSVUU7CisgIGlmIChuQ2hhciA9PSBGV0xfVktFWV9EZWxldGUpIHsKKyAgICBpZiAobV9wRmlsbGVyTm90aWZ5KSB7CisgICAgICBGWF9CT09MIGJSQyA9IFRSVUU7CisgICAgICBGWF9CT09MIGJFeGl0ID0gRkFMU0U7CisgICAgICBDRlhfV2lkZVN0cmluZyBzdHJDaGFuZ2U7CisgICAgICBDRlhfV2lkZVN0cmluZyBzdHJDaGFuZ2VFeDsKIAotCWlmIChuQ2hhciA9PSBGV0xfVktFWV9EZWxldGUpCi0JewotCQlpZiAobV9wRmlsbGVyTm90aWZ5KQotCQl7Ci0JCQlGWF9CT09MIGJSQyA9IFRSVUU7Ci0JCQlGWF9CT09MIGJFeGl0ID0gRkFMU0U7Ci0JCQlDRlhfV2lkZVN0cmluZyBzdHJDaGFuZ2U7Ci0JCQlDRlhfV2lkZVN0cmluZyBzdHJDaGFuZ2VFeDsKKyAgICAgIGludCBuU2VsU3RhcnQgPSAwOworICAgICAgaW50IG5TZWxFbmQgPSAwOworICAgICAgR2V0U2VsKG5TZWxTdGFydCwgblNlbEVuZCk7CiAKLQkJCWludCBuU2VsU3RhcnQgPSAwOwotCQkJaW50IG5TZWxFbmQgPSAwOwotCQkJR2V0U2VsKG5TZWxTdGFydCwgblNlbEVuZCk7CisgICAgICBpZiAoblNlbFN0YXJ0ID09IG5TZWxFbmQpCisgICAgICAgIG5TZWxFbmQgPSBuU2VsU3RhcnQgKyAxOworICAgICAgbV9wRmlsbGVyTm90aWZ5LT5PbkJlZm9yZUtleVN0cm9rZShHZXRBdHRhY2hlZERhdGEoKSwgc3RyQ2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJDaGFuZ2VFeCwgblNlbFN0YXJ0LCBuU2VsRW5kLCBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUkMsIGJFeGl0LCBuRmxhZyk7CisgICAgICBpZiAoIWJSQykKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgaWYgKGJFeGl0KQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9CiAKLQkJCWlmIChuU2VsU3RhcnQgPT0gblNlbEVuZCkKLQkJCQluU2VsRW5kID0gblNlbFN0YXJ0ICsgMTsKLQkJCW1fcEZpbGxlck5vdGlmeS0+T25CZWZvcmVLZXlTdHJva2UoVFJVRSwgR2V0QXR0YWNoZWREYXRhKCksIEZXTF9WS0VZX0RlbGV0ZSwgc3RyQ2hhbmdlLCBzdHJDaGFuZ2VFeCwgblNlbFN0YXJ0LCBuU2VsRW5kLCBUUlVFLCBiUkMsIGJFeGl0LCBuRmxhZyk7Ci0JCQlpZiAoIWJSQykgcmV0dXJuIEZBTFNFOwkJCQkKLQkJCWlmIChiRXhpdCkgcmV0dXJuIEZBTFNFOwotCQl9Ci0JfQorICBGWF9CT09MIGJSZXQgPSBDUFdMX0VkaXRDdHJsOjpPbktleURvd24obkNoYXIsIG5GbGFnKTsKIAotCUZYX0JPT0wgYlJldCA9IENQV0xfRWRpdEN0cmw6Ok9uS2V5RG93bihuQ2hhciwgIG5GbGFnKTsKKyAgLy8gSW4gY2FzZSBvZiBpbXBsZW1lbnRhdGlvbiBzd2FsbG93IHRoZSBPbktleURvd24gZXZlbnQuCisgIGlmIChJc1Byb2NlZWR0b09uQ2hhcihuQ2hhciwgbkZsYWcpKQorICAgIHJldHVybiBUUlVFOwogCi0JaWYgKG5DaGFyID09IEZXTF9WS0VZX0RlbGV0ZSkKLQl7Ci0JCWlmIChtX3BGaWxsZXJOb3RpZnkpCi0JCXsKLQkJCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKLQkJCW1fcEZpbGxlck5vdGlmeS0+T25BZnRlcktleVN0cm9rZShUUlVFLCBHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsbkZsYWcpOwotCQkJaWYgKGJFeGl0KSByZXR1cm4gRkFMU0U7Ci0JCX0KLQl9Ci0KLQkvL0luIGNhc2Ugb2YgaW1wbGVtZW50YXRpb24gc3dhbGxvdyB0aGUgT25LZXlEb3duIGV2ZW50LgotCWlmKElzUHJvY2VlZHRvT25DaGFyKG5DaGFyLCBuRmxhZykpCi0JCQlyZXR1cm4gVFJVRTsKLQotCXJldHVybiBiUmV0OworICByZXR1cm4gYlJldDsKIH0KIAogLyoqCi0qSW4gY2FzZSBvZiBpbXBsZW1lbnRhdGlvbiBzd2FsbG93IHRoZSBPbktleURvd24gZXZlbnQuIAotKklmIHRoZSBldmVudCBpcyBzd2FsbG93ZWQsIGltcGxlbWVudGF0aW9uIG1heSBkbyBvdGhlciB1bmV4cGVjdGVkIHRoaW5ncywgd2hpY2ggaXMgbm90IHRoZSBjb250cm9sIG1lYW5zIHRvIGRvLgorKkluIGNhc2Ugb2YgaW1wbGVtZW50YXRpb24gc3dhbGxvdyB0aGUgT25LZXlEb3duIGV2ZW50LgorKklmIHRoZSBldmVudCBpcyBzd2FsbG93ZWQsIGltcGxlbWVudGF0aW9uIG1heSBkbyBvdGhlciB1bmV4cGVjdGVkIHRoaW5ncywgd2hpY2gKKyppcyBub3QgdGhlIGNvbnRyb2wgbWVhbnMgdG8gZG8uCiAqLwotRlhfQk9PTCBDUFdMX0VkaXQ6OklzUHJvY2VlZHRvT25DaGFyKEZYX1dPUkQgbktleUNvZGUsIEZYX0RXT1JEIG5GbGFnKQotewotCi0JRlhfQk9PTCBiQ3RybCA9IElzQ1RSTHByZXNzZWQobkZsYWcpOwotCUZYX0JPT0wgYkFsdCA9IElzQUxUcHJlc3NlZChuRmxhZyk7Ci0JaWYoYkN0cmwgJiYgIWJBbHQpCi0JewotCS8vaG90IGtleXMgZm9yIGVkaXQgY29udHJvbC4JCi0JCXN3aXRjaChuS2V5Q29kZSkKLQkJewotCQljYXNlICdDJzoKLQkJY2FzZSAnVic6Ci0JCWNhc2UgJ1gnOgotCQljYXNlICdBJzoKLQkJY2FzZSAnWic6Ci0JCQlyZXR1cm4gVFJVRTsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCS8vY29udHJvbCBjaGFyYWN0ZXJzLgotCXN3aXRjaChuS2V5Q29kZSkKLQl7Ci0JY2FzZSBGV0xfVktFWV9Fc2NhcGU6Ci0JY2FzZSBGV0xfVktFWV9CYWNrOgotCWNhc2UgRldMX1ZLRVlfUmV0dXJuOgotCWNhc2UgRldMX1ZLRVlfU3BhY2U6Ci0JCXJldHVybiBUUlVFOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gRkFMU0U7Ci0KK0ZYX0JPT0wgQ1BXTF9FZGl0OjpJc1Byb2NlZWR0b09uQ2hhcihGWF9XT1JEIG5LZXlDb2RlLCBGWF9EV09SRCBuRmxhZykgeworICBGWF9CT09MIGJDdHJsID0gSXNDVFJMcHJlc3NlZChuRmxhZyk7CisgIEZYX0JPT0wgYkFsdCA9IElzQUxUcHJlc3NlZChuRmxhZyk7CisgIGlmIChiQ3RybCAmJiAhYkFsdCkgeworICAgIC8vIGhvdCBrZXlzIGZvciBlZGl0IGNvbnRyb2wuCisgICAgc3dpdGNoIChuS2V5Q29kZSkgeworICAgICAgY2FzZSAnQyc6CisgICAgICBjYXNlICdWJzoKKyAgICAgIGNhc2UgJ1gnOgorICAgICAgY2FzZSAnQSc6CisgICAgICBjYXNlICdaJzoKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgLy8gY29udHJvbCBjaGFyYWN0ZXJzLgorICBzd2l0Y2ggKG5LZXlDb2RlKSB7CisgICAgY2FzZSBGV0xfVktFWV9Fc2NhcGU6CisgICAgY2FzZSBGV0xfVktFWV9CYWNrOgorICAgIGNhc2UgRldMX1ZLRVlfUmV0dXJuOgorICAgIGNhc2UgRldMX1ZLRVlfU3BhY2U6CisgICAgICByZXR1cm4gVFJVRTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEZBTFNFOworICB9CiB9CiAKLUZYX0JPT0wgQ1BXTF9FZGl0OjpPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JaWYgKG1fYk1vdXNlRG93bikgcmV0dXJuIFRSVUU7CitGWF9CT09MIENQV0xfRWRpdDo6T25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKSB7CisgIGlmIChtX2JNb3VzZURvd24pCisgICAgcmV0dXJuIFRSVUU7CiAKLQlGWF9CT09MIGJSQyA9IFRSVUU7Ci0JRlhfQk9PTCBiRXhpdCA9IEZBTFNFOworICBGWF9CT09MIGJSQyA9IFRSVUU7CisgIEZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKIAotCUZYX0JPT0wgYkN0cmwgPSBJc0NUUkxwcmVzc2VkKG5GbGFnKTsKLQlpZiAoIWJDdHJsKQotCXsKLQkJaWYgKG1fcEZpbGxlck5vdGlmeSkKLQkJewotCQkJQ0ZYX1dpZGVTdHJpbmcgc3dDaGFuZ2U7Ci0JCQlGWF9JTlQzMiBuS2V5Q29kZTsKKyAgaWYgKCFJc0NUUkxwcmVzc2VkKG5GbGFnKSkgeworICAgIGlmIChtX3BGaWxsZXJOb3RpZnkpIHsKKyAgICAgIENGWF9XaWRlU3RyaW5nIHN3Q2hhbmdlOwogCi0JCQlpbnQgblNlbFN0YXJ0ID0gMDsKLQkJCWludCBuU2VsRW5kID0gMDsKLQkJCUdldFNlbChuU2VsU3RhcnQsIG5TZWxFbmQpOworICAgICAgaW50IG5TZWxTdGFydCA9IDA7CisgICAgICBpbnQgblNlbEVuZCA9IDA7CisgICAgICBHZXRTZWwoblNlbFN0YXJ0LCBuU2VsRW5kKTsKIAotCQkJc3dpdGNoIChuQ2hhcikKLQkJCXsKLQkJCWNhc2UgRldMX1ZLRVlfQmFjazoKLQkJCQluS2V5Q29kZSA9IG5DaGFyOwotCQkJCWlmIChuU2VsU3RhcnQgPT0gblNlbEVuZCkKLQkJCQkJblNlbFN0YXJ0ID0gblNlbEVuZCAtIDE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEZXTF9WS0VZX1JldHVybjoKLQkJCQluS2V5Q29kZSA9IG5DaGFyOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQluS2V5Q29kZSA9IDA7Ci0JCQkJc3dDaGFuZ2UgKz0gbkNoYXI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQotCQkJQ0ZYX1dpZGVTdHJpbmcgc3RyQ2hhbmdlRXg7Ci0JCQltX3BGaWxsZXJOb3RpZnktPk9uQmVmb3JlS2V5U3Ryb2tlKFRSVUUsIEdldEF0dGFjaGVkRGF0YSgpLCBuS2V5Q29kZSwgc3dDaGFuZ2UsIHN0ckNoYW5nZUV4LCBuU2VsU3RhcnQsIG5TZWxFbmQsIFRSVUUsIGJSQywgYkV4aXQsIG5GbGFnKTsKLQkJfQotCX0KKyAgICAgIHN3aXRjaCAobkNoYXIpIHsKKyAgICAgICAgY2FzZSBGV0xfVktFWV9CYWNrOgorICAgICAgICAgIGlmIChuU2VsU3RhcnQgPT0gblNlbEVuZCkKKyAgICAgICAgICAgIG5TZWxTdGFydCA9IG5TZWxFbmQgLSAxOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZXTF9WS0VZX1JldHVybjoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBzd0NoYW5nZSArPSBuQ2hhcjsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KIAotCWlmICghYlJDKSByZXR1cm4gVFJVRTsKLQlpZiAoYkV4aXQpIHJldHVybiBGQUxTRTsKKyAgICAgIENGWF9XaWRlU3RyaW5nIHN0ckNoYW5nZUV4OworICAgICAgbV9wRmlsbGVyTm90aWZ5LT5PbkJlZm9yZUtleVN0cm9rZShHZXRBdHRhY2hlZERhdGEoKSwgc3dDaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ckNoYW5nZUV4LCBuU2VsU3RhcnQsIG5TZWxFbmQsIFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSQywgYkV4aXQsIG5GbGFnKTsKKyAgICB9CisgIH0KIAotCWlmIChJRlhfRWRpdF9Gb250TWFwICogcEZvbnRNYXAgPSBHZXRGb250TWFwKCkpCi0JewotCQlGWF9JTlQzMiBuT2xkQ2hhclNldCA9IEdldENoYXJTZXQoKTsKLQkJRlhfSU5UMzIgbk5ld0NoYXJTZXQgPSBwRm9udE1hcC0+Q2hhclNldEZyb21Vbmljb2RlKG5DaGFyLCBERUZBVUxUX0NIQVJTRVQpOwotCQlpZihuT2xkQ2hhclNldCAhPSBuTmV3Q2hhclNldCkKLQkJewotCQkJU2V0Q2hhclNldChuTmV3Q2hhclNldCk7Ci0JCX0KLQl9Ci0JRlhfQk9PTCBiUmV0ID0gQ1BXTF9FZGl0Q3RybDo6T25DaGFyKG5DaGFyLG5GbGFnKTsKKyAgaWYgKCFiUkMpCisgICAgcmV0dXJuIFRSVUU7CisgIGlmIChiRXhpdCkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlpZiAoIWJDdHJsKQotCXsKLQkJaWYgKG1fcEZpbGxlck5vdGlmeSkKLQkJewotCQkJbV9wRmlsbGVyTm90aWZ5LT5PbkFmdGVyS2V5U3Ryb2tlKFRSVUUsIEdldEF0dGFjaGVkRGF0YSgpLCBiRXhpdCxuRmxhZyk7Ci0JCQlpZiAoYkV4aXQpIHJldHVybiBGQUxTRTsKLQkJfQotCX0KKyAgaWYgKElGWF9FZGl0X0ZvbnRNYXAqIHBGb250TWFwID0gR2V0Rm9udE1hcCgpKSB7CisgICAgaW50MzJfdCBuT2xkQ2hhclNldCA9IEdldENoYXJTZXQoKTsKKyAgICBpbnQzMl90IG5OZXdDaGFyU2V0ID0gcEZvbnRNYXAtPkNoYXJTZXRGcm9tVW5pY29kZShuQ2hhciwgREVGQVVMVF9DSEFSU0VUKTsKKyAgICBpZiAobk9sZENoYXJTZXQgIT0gbk5ld0NoYXJTZXQpIHsKKyAgICAgIFNldENoYXJTZXQobk5ld0NoYXJTZXQpOworICAgIH0KKyAgfQogCi0JcmV0dXJuIGJSZXQ7CisgIHJldHVybiBDUFdMX0VkaXRDdHJsOjpPbkNoYXIobkNoYXIsIG5GbGFnKTsKIH0KIAotRlhfQk9PTAlDUFdMX0VkaXQ6Ok9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsIGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JaWYgKEhhc0ZsYWcoUEVTX01VTFRJTElORSkpCi0JewotCQlDUERGX1BvaW50IHB0U2Nyb2xsID0gR2V0U2Nyb2xsUG9zKCk7CitGWF9CT09MIENQV0xfRWRpdDo6T25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSB7CisgIGlmIChIYXNGbGFnKFBFU19NVUxUSUxJTkUpKSB7CisgICAgQ1BERl9Qb2ludCBwdFNjcm9sbCA9IEdldFNjcm9sbFBvcygpOwogCi0JCWlmICh6RGVsdGEgPiAwKQotCQl7Ci0JCQlwdFNjcm9sbC55ICs9IHRoaXMtPkdldEZvbnRTaXplKCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwdFNjcm9sbC55IC09IHRoaXMtPkdldEZvbnRTaXplKCk7Ci0JCX0KLQkJdGhpcy0+U2V0U2Nyb2xsUG9zKHB0U2Nyb2xsKTsKKyAgICBpZiAoekRlbHRhID4gMCkgeworICAgICAgcHRTY3JvbGwueSArPSBHZXRGb250U2l6ZSgpOworICAgIH0gZWxzZSB7CisgICAgICBwdFNjcm9sbC55IC09IEdldEZvbnRTaXplKCk7CisgICAgfQorICAgIFNldFNjcm9sbFBvcyhwdFNjcm9sbCk7CiAKLQkJcmV0dXJuIFRSVUU7Ci0JfQorICAgIHJldHVybiBUUlVFOworICB9CiAKLQlyZXR1cm4gRkFMU0U7CisgIHJldHVybiBGQUxTRTsKIH0KIAotdm9pZCBDUFdMX0VkaXQ6Ok9uSW5zZXJ0UmV0dXJuKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKQotewotCWlmIChIYXNGbGFnKFBFU19TUEVMTENIRUNLKSkKLQl7Ci0JCW1fcEVkaXQtPlJlZnJlc2hXb3JkUmFuZ2UoQ29tYmluZVdvcmRSYW5nZShHZXRMYXRpbldvcmRzUmFuZ2Uob2xkcGxhY2UpLEdldExhdGluV29yZHNSYW5nZShwbGFjZSkpKTsKLQl9Cit2b2lkIENQV0xfRWRpdDo6T25JbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkgeworICBpZiAoSGFzRmxhZyhQRVNfU1BFTExDSEVDSykpIHsKKyAgICBtX3BFZGl0LT5SZWZyZXNoV29yZFJhbmdlKENvbWJpbmVXb3JkUmFuZ2UoR2V0TGF0aW5Xb3Jkc1JhbmdlKG9sZHBsYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TGF0aW5Xb3Jkc1JhbmdlKHBsYWNlKSkpOworICB9CiAKLQlpZiAobV9wRWRpdE5vdGlmeSkKLQl7Ci0JCW1fcEVkaXROb3RpZnktPk9uSW5zZXJ0UmV0dXJuKHBsYWNlLCBvbGRwbGFjZSk7Ci0JfQorICBpZiAobV9wRWRpdE5vdGlmeSkgeworICAgIG1fcEVkaXROb3RpZnktPk9uSW5zZXJ0UmV0dXJuKHBsYWNlLCBvbGRwbGFjZSk7CisgIH0KIH0KIAotdm9pZCBDUFdMX0VkaXQ6Ok9uQmFja1NwYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKQotewotCWlmIChIYXNGbGFnKFBFU19TUEVMTENIRUNLKSkKLQl7Ci0JCW1fcEVkaXQtPlJlZnJlc2hXb3JkUmFuZ2UoQ29tYmluZVdvcmRSYW5nZShHZXRMYXRpbldvcmRzUmFuZ2Uob2xkcGxhY2UpLEdldExhdGluV29yZHNSYW5nZShwbGFjZSkpKTsKLQl9Cit2b2lkIENQV0xfRWRpdDo6T25CYWNrU3BhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkgeworICBpZiAoSGFzRmxhZyhQRVNfU1BFTExDSEVDSykpIHsKKyAgICBtX3BFZGl0LT5SZWZyZXNoV29yZFJhbmdlKENvbWJpbmVXb3JkUmFuZ2UoR2V0TGF0aW5Xb3Jkc1JhbmdlKG9sZHBsYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TGF0aW5Xb3Jkc1JhbmdlKHBsYWNlKSkpOworICB9CiAKLQlpZiAobV9wRWRpdE5vdGlmeSkKLQl7Ci0JCW1fcEVkaXROb3RpZnktPk9uQmFja1NwYWNlKHBsYWNlLCBvbGRwbGFjZSk7Ci0JfQorICBpZiAobV9wRWRpdE5vdGlmeSkgeworICAgIG1fcEVkaXROb3RpZnktPk9uQmFja1NwYWNlKHBsYWNlLCBvbGRwbGFjZSk7CisgIH0KIH0KIAotdm9pZCBDUFdMX0VkaXQ6Ok9uRGVsZXRlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKQotewotCWlmIChIYXNGbGFnKFBFU19TUEVMTENIRUNLKSkKLQl7Ci0JCW1fcEVkaXQtPlJlZnJlc2hXb3JkUmFuZ2UoQ29tYmluZVdvcmRSYW5nZShHZXRMYXRpbldvcmRzUmFuZ2Uob2xkcGxhY2UpLEdldExhdGluV29yZHNSYW5nZShwbGFjZSkpKTsKLQl9Cit2b2lkIENQV0xfRWRpdDo6T25EZWxldGUoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkgeworICBpZiAoSGFzRmxhZyhQRVNfU1BFTExDSEVDSykpIHsKKyAgICBtX3BFZGl0LT5SZWZyZXNoV29yZFJhbmdlKENvbWJpbmVXb3JkUmFuZ2UoR2V0TGF0aW5Xb3Jkc1JhbmdlKG9sZHBsYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TGF0aW5Xb3Jkc1JhbmdlKHBsYWNlKSkpOworICB9CiAKLQlpZiAobV9wRWRpdE5vdGlmeSkKLQl7Ci0JCW1fcEVkaXROb3RpZnktPk9uRGVsZXRlKHBsYWNlLCBvbGRwbGFjZSk7Ci0JfQorICBpZiAobV9wRWRpdE5vdGlmeSkgeworICAgIG1fcEVkaXROb3RpZnktPk9uRGVsZXRlKHBsYWNlLCBvbGRwbGFjZSk7CisgIH0KIH0KIAotdm9pZCBDUFdMX0VkaXQ6Ok9uQ2xlYXIoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpCi17Ci0JaWYgKEhhc0ZsYWcoUEVTX1NQRUxMQ0hFQ0spKQotCXsKLQkJbV9wRWRpdC0+UmVmcmVzaFdvcmRSYW5nZShDb21iaW5lV29yZFJhbmdlKEdldExhdGluV29yZHNSYW5nZShvbGRwbGFjZSksR2V0TGF0aW5Xb3Jkc1JhbmdlKHBsYWNlKSkpOwotCX0KK3ZvaWQgQ1BXTF9FZGl0OjpPbkNsZWFyKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkgeworICBpZiAoSGFzRmxhZyhQRVNfU1BFTExDSEVDSykpIHsKKyAgICBtX3BFZGl0LT5SZWZyZXNoV29yZFJhbmdlKENvbWJpbmVXb3JkUmFuZ2UoR2V0TGF0aW5Xb3Jkc1JhbmdlKG9sZHBsYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TGF0aW5Xb3Jkc1JhbmdlKHBsYWNlKSkpOworICB9CiAKLQlpZiAobV9wRWRpdE5vdGlmeSkKLQl7Ci0JCW1fcEVkaXROb3RpZnktPk9uQ2xlYXIocGxhY2UsIG9sZHBsYWNlKTsKLQl9CisgIGlmIChtX3BFZGl0Tm90aWZ5KSB7CisgICAgbV9wRWRpdE5vdGlmeS0+T25DbGVhcihwbGFjZSwgb2xkcGxhY2UpOworICB9CiB9CiAKLXZvaWQgQ1BXTF9FZGl0OjpPbkluc2VydFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpCi17Ci0JaWYgKEhhc0ZsYWcoUEVTX1NQRUxMQ0hFQ0spKQotCXsKLQkJbV9wRWRpdC0+UmVmcmVzaFdvcmRSYW5nZShDb21iaW5lV29yZFJhbmdlKEdldExhdGluV29yZHNSYW5nZShvbGRwbGFjZSksR2V0TGF0aW5Xb3Jkc1JhbmdlKHBsYWNlKSkpOwotCX0KK3ZvaWQgQ1BXTF9FZGl0OjpPbkluc2VydFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpIHsKKyAgaWYgKEhhc0ZsYWcoUEVTX1NQRUxMQ0hFQ0spKSB7CisgICAgbV9wRWRpdC0+UmVmcmVzaFdvcmRSYW5nZShDb21iaW5lV29yZFJhbmdlKEdldExhdGluV29yZHNSYW5nZShvbGRwbGFjZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldExhdGluV29yZHNSYW5nZShwbGFjZSkpKTsKKyAgfQogCi0JaWYgKG1fcEVkaXROb3RpZnkpCi0JewotCQltX3BFZGl0Tm90aWZ5LT5Pbkluc2VydFdvcmQocGxhY2UsIG9sZHBsYWNlKTsKLQl9CisgIGlmIChtX3BFZGl0Tm90aWZ5KSB7CisgICAgbV9wRWRpdE5vdGlmeS0+T25JbnNlcnRXb3JkKHBsYWNlLCBvbGRwbGFjZSk7CisgIH0KIH0KIAotdm9pZCBDUFdMX0VkaXQ6Ok9uU2V0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkKLXsKK3ZvaWQgQ1BXTF9FZGl0OjpPblNldFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpIHt9CisKK3ZvaWQgQ1BXTF9FZGl0OjpPbkluc2VydFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpIHsKKyAgaWYgKEhhc0ZsYWcoUEVTX1NQRUxMQ0hFQ0spKSB7CisgICAgbV9wRWRpdC0+UmVmcmVzaFdvcmRSYW5nZShDb21iaW5lV29yZFJhbmdlKEdldExhdGluV29yZHNSYW5nZShvbGRwbGFjZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldExhdGluV29yZHNSYW5nZShwbGFjZSkpKTsKKyAgfQorCisgIGlmIChtX3BFZGl0Tm90aWZ5KSB7CisgICAgbV9wRWRpdE5vdGlmeS0+T25JbnNlcnRUZXh0KHBsYWNlLCBvbGRwbGFjZSk7CisgIH0KIH0KIAotdm9pZCBDUFdMX0VkaXQ6Ok9uSW5zZXJ0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkKLXsKLQlpZiAoSGFzRmxhZyhQRVNfU1BFTExDSEVDSykpCi0JewotCQltX3BFZGl0LT5SZWZyZXNoV29yZFJhbmdlKENvbWJpbmVXb3JkUmFuZ2UoR2V0TGF0aW5Xb3Jkc1JhbmdlKG9sZHBsYWNlKSxHZXRMYXRpbldvcmRzUmFuZ2UocGxhY2UpKSk7Ci0JfQotCi0JaWYgKG1fcEVkaXROb3RpZnkpCi0JewotCQltX3BFZGl0Tm90aWZ5LT5Pbkluc2VydFRleHQocGxhY2UsIG9sZHBsYWNlKTsKLQl9Cit2b2lkIENQV0xfRWRpdDo6T25BZGRVbmRvKElGWF9FZGl0X1VuZG9JdGVtKiBwVW5kb0l0ZW0pIHsKKyAgaWYgKG1fcEVkaXROb3RpZnkpIHsKKyAgICBtX3BFZGl0Tm90aWZ5LT5PbkFkZFVuZG8odGhpcyk7CisgIH0KIH0KIAotdm9pZCBDUFdMX0VkaXQ6Ok9uQWRkVW5kbyhJRlhfRWRpdF9VbmRvSXRlbSogcFVuZG9JdGVtKQotewotCWlmIChtX3BFZGl0Tm90aWZ5KQotCXsKLQkJbV9wRWRpdE5vdGlmeS0+T25BZGRVbmRvKHRoaXMpOwotCX0KK0NQVlRfV29yZFJhbmdlIENQV0xfRWRpdDo6Q29tYmluZVdvcmRSYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cjIpIHsKKyAgQ1BWVF9Xb3JkUmFuZ2Ugd3JSZXQ7CisKKyAgaWYgKHdyMS5CZWdpblBvcy5Xb3JkQ21wKHdyMi5CZWdpblBvcykgPCAwKSB7CisgICAgd3JSZXQuQmVnaW5Qb3MgPSB3cjEuQmVnaW5Qb3M7CisgIH0gZWxzZSB7CisgICAgd3JSZXQuQmVnaW5Qb3MgPSB3cjIuQmVnaW5Qb3M7CisgIH0KKworICBpZiAod3IxLkVuZFBvcy5Xb3JkQ21wKHdyMi5FbmRQb3MpIDwgMCkgeworICAgIHdyUmV0LkVuZFBvcyA9IHdyMi5FbmRQb3M7CisgIH0gZWxzZSB7CisgICAgd3JSZXQuRW5kUG9zID0gd3IxLkVuZFBvczsKKyAgfQorCisgIHJldHVybiB3clJldDsKIH0KIAotQ1BWVF9Xb3JkUmFuZ2UgQ1BXTF9FZGl0OjpDb21iaW5lV29yZFJhbmdlKGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cjEsIGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cjIpCi17Ci0JQ1BWVF9Xb3JkUmFuZ2Ugd3JSZXQ7Ci0KLQlpZiAod3IxLkJlZ2luUG9zLldvcmRDbXAod3IyLkJlZ2luUG9zKSA8IDApCi0JewotCQl3clJldC5CZWdpblBvcyA9IHdyMS5CZWdpblBvczsKLQl9Ci0JZWxzZQotCXsKLQkJd3JSZXQuQmVnaW5Qb3MgPSB3cjIuQmVnaW5Qb3M7Ci0JfQotCi0JaWYgKHdyMS5FbmRQb3MuV29yZENtcCh3cjIuRW5kUG9zKSA8IDApCi0JewotCQl3clJldC5FbmRQb3MgPSB3cjIuRW5kUG9zOwotCX0KLQllbHNlCi0JewotCQl3clJldC5FbmRQb3MgPSB3cjEuRW5kUG9zOwotCX0KLQotCXJldHVybiB3clJldDsKK0NQVlRfV29yZFJhbmdlIENQV0xfRWRpdDo6R2V0TGF0aW5Xb3Jkc1JhbmdlKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdCB7CisgIHJldHVybiBHZXRTYW1lV29yZHNSYW5nZShtX3BFZGl0LT5TZWFyY2hXb3JkUGxhY2UocG9pbnQpLCBUUlVFLCBGQUxTRSk7CiB9CiAKLUNQVlRfV29yZFJhbmdlIENQV0xfRWRpdDo6R2V0TGF0aW5Xb3Jkc1JhbmdlKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdAotewotCXJldHVybiBHZXRTYW1lV29yZHNSYW5nZShtX3BFZGl0LT5TZWFyY2hXb3JkUGxhY2UocG9pbnQpLCBUUlVFLCBGQUxTRSk7CitDUFZUX1dvcmRSYW5nZSBDUFdMX0VkaXQ6OkdldExhdGluV29yZHNSYW5nZSgKKyAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IHsKKyAgcmV0dXJuIEdldFNhbWVXb3Jkc1JhbmdlKHBsYWNlLCBUUlVFLCBGQUxTRSk7CiB9CiAKLUNQVlRfV29yZFJhbmdlIENQV0xfRWRpdDo6R2V0TGF0aW5Xb3Jkc1JhbmdlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UpIGNvbnN0Ci17Ci0JcmV0dXJuIEdldFNhbWVXb3Jkc1JhbmdlKHBsYWNlLCBUUlVFLCBGQUxTRSk7CitDUFZUX1dvcmRSYW5nZSBDUFdMX0VkaXQ6OkdldEFyYWJpY1dvcmRzUmFuZ2UoCisgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCB7CisgIHJldHVybiBHZXRTYW1lV29yZHNSYW5nZShwbGFjZSwgRkFMU0UsIFRSVUUpOwogfQogCi1DUFZUX1dvcmRSYW5nZSBDUFdMX0VkaXQ6OkdldEFyYWJpY1dvcmRzUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBwbGFjZSkgY29uc3QKLXsKLQlyZXR1cm4gR2V0U2FtZVdvcmRzUmFuZ2UocGxhY2UsIEZBTFNFLCBUUlVFKTsKKyNkZWZpbmUgUFdMX0lTQVJBQklDV09SRCh3b3JkKSBcCisgICgod29yZCA+PSAweDA2MDAgJiYgd29yZCA8PSAweDA2RkYpIHx8ICh3b3JkID49IDB4RkI1MCAmJiB3b3JkIDw9IDB4RkVGQykpCisKK0NQVlRfV29yZFJhbmdlIENQV0xfRWRpdDo6R2V0U2FtZVdvcmRzUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJMYXRpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQXJhYmljKSBjb25zdCB7CisgIENQVlRfV29yZFJhbmdlIHJhbmdlOworCisgIGlmIChJRlhfRWRpdF9JdGVyYXRvciogcEl0ZXJhdG9yID0gbV9wRWRpdC0+R2V0SXRlcmF0b3IoKSkgeworICAgIENQVlRfV29yZCB3b3JkaW5mbzsKKyAgICBDUFZUX1dvcmRQbGFjZSB3cFN0YXJ0KHBsYWNlKSwgd3BFbmQocGxhY2UpOworICAgIHBJdGVyYXRvci0+U2V0QXQocGxhY2UpOworCisgICAgaWYgKGJMYXRpbikgeworICAgICAgd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkgeworICAgICAgICBpZiAoIXBJdGVyYXRvci0+R2V0V29yZCh3b3JkaW5mbykgfHwKKyAgICAgICAgICAgICFGWF9FRElUX0lTTEFUSU5XT1JEKHdvcmRpbmZvLldvcmQpKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB3cEVuZCA9IHBJdGVyYXRvci0+R2V0QXQoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGJBcmFiaWMpIHsKKyAgICAgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpIHsKKyAgICAgICAgaWYgKCFwSXRlcmF0b3ItPkdldFdvcmQod29yZGluZm8pIHx8ICFQV0xfSVNBUkFCSUNXT1JEKHdvcmRpbmZvLldvcmQpKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHdwRW5kID0gcEl0ZXJhdG9yLT5HZXRBdCgpOworICAgICAgfQorICAgIH0KKworICAgIHBJdGVyYXRvci0+U2V0QXQocGxhY2UpOworCisgICAgaWYgKGJMYXRpbikgeworICAgICAgZG8geworICAgICAgICBpZiAoIXBJdGVyYXRvci0+R2V0V29yZCh3b3JkaW5mbykgfHwKKyAgICAgICAgICAgICFGWF9FRElUX0lTTEFUSU5XT1JEKHdvcmRpbmZvLldvcmQpKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB3cFN0YXJ0ID0gcEl0ZXJhdG9yLT5HZXRBdCgpOworICAgICAgfSB3aGlsZSAocEl0ZXJhdG9yLT5QcmV2V29yZCgpKTsKKyAgICB9IGVsc2UgaWYgKGJBcmFiaWMpIHsKKyAgICAgIGRvIHsKKyAgICAgICAgaWYgKCFwSXRlcmF0b3ItPkdldFdvcmQod29yZGluZm8pIHx8ICFQV0xfSVNBUkFCSUNXT1JEKHdvcmRpbmZvLldvcmQpKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHdwU3RhcnQgPSBwSXRlcmF0b3ItPkdldEF0KCk7CisgICAgICB9IHdoaWxlIChwSXRlcmF0b3ItPlByZXZXb3JkKCkpOworICAgIH0KKworICAgIHJhbmdlLlNldCh3cFN0YXJ0LCB3cEVuZCk7CisgIH0KKworICByZXR1cm4gcmFuZ2U7CiB9CiAKLSNkZWZpbmUgUFdMX0lTQVJBQklDV09SRCh3b3JkKSAoKHdvcmQgPj0gMHgwNjAwICYmIHdvcmQgPD0gMHgwNkZGKSB8fCAod29yZCA+PSAweEZCNTAgJiYgd29yZCA8PSAweEZFRkMpKQotCi1DUFZUX1dvcmRSYW5nZSBDUFdMX0VkaXQ6OkdldFNhbWVXb3Jkc1JhbmdlKGNvbnN0IENQVlRfV29yZFBsYWNlICYgcGxhY2UsIEZYX0JPT0wgYkxhdGluLCBGWF9CT09MIGJBcmFiaWMpIGNvbnN0Ci17Ci0JQ1BWVF9Xb3JkUmFuZ2UgcmFuZ2U7Ci0KLQlpZiAoSUZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcEVkaXQtPkdldEl0ZXJhdG9yKCkpCi0JewotCQlDUFZUX1dvcmQgd29yZGluZm87CQotCQlDUFZUX1dvcmRQbGFjZSB3cFN0YXJ0KHBsYWNlKSx3cEVuZChwbGFjZSk7CQkJCi0JCXBJdGVyYXRvci0+U2V0QXQocGxhY2UpOwkJCQotCQkKLQkJaWYgKGJMYXRpbikKLQkJewotCQkJd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkKLQkJCXsKLQkJCQlpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmRpbmZvKSAmJiBGWF9FRElUX0lTTEFUSU5XT1JEKHdvcmRpbmZvLldvcmQpKQotCQkJCXsKLQkJCQkJd3BFbmQgPSBwSXRlcmF0b3ItPkdldEF0KCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQllbHNlIAotCQkJCQlicmVhazsKLQkJCX07Ci0JCX0KLQkJZWxzZSBpZiAoYkFyYWJpYykKLQkJewotCQkJd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkKLQkJCXsKLQkJCQlpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmRpbmZvKSAmJiBQV0xfSVNBUkFCSUNXT1JEKHdvcmRpbmZvLldvcmQpKQotCQkJCXsKLQkJCQkJd3BFbmQgPSBwSXRlcmF0b3ItPkdldEF0KCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQllbHNlIAotCQkJCQlicmVhazsKLQkJCX07Ci0JCX0KLQotCQlwSXRlcmF0b3ItPlNldEF0KHBsYWNlKTsKLQotCQlpZiAoYkxhdGluKQotCQl7Ci0JCQlkbwotCQkJewotCQkJCWlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZGluZm8pICYmIEZYX0VESVRfSVNMQVRJTldPUkQod29yZGluZm8uV29yZCkpCi0JCQkJewkJCQkJCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQl3cFN0YXJ0ID0gcEl0ZXJhdG9yLT5HZXRBdCgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQl3aGlsZSAocEl0ZXJhdG9yLT5QcmV2V29yZCgpKTsKLQkJfQotCQllbHNlIGlmIChiQXJhYmljKQotCQl7Ci0JCQlkbwotCQkJewotCQkJCWlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZGluZm8pICYmIFBXTF9JU0FSQUJJQ1dPUkQod29yZGluZm8uV29yZCkpCi0JCQkJewkJCQkJCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQl3cFN0YXJ0ID0gcEl0ZXJhdG9yLT5HZXRBdCgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQl3aGlsZSAocEl0ZXJhdG9yLT5QcmV2V29yZCgpKTsKLQkJfQotCi0JCXJhbmdlLlNldCh3cFN0YXJ0LHdwRW5kKTsKLQl9CQotCi0JcmV0dXJuIHJhbmdlOwordm9pZCBDUFdMX0VkaXQ6OkdlbmVyYXRlUGFnZU9iamVjdHMoCisgICAgQ1BERl9QYWdlT2JqZWN0cyogcFBhZ2VPYmplY3RzLAorICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LAorICAgIENGWF9BcnJheVRlbXBsYXRlPENQREZfVGV4dE9iamVjdCo+JiBPYmpBcnJheSkgeworICBJRlhfRWRpdDo6R2VuZXJhdGVQYWdlT2JqZWN0cygKKyAgICAgIHBQYWdlT2JqZWN0cywgbV9wRWRpdCwgcHRPZmZzZXQsIE5VTEwsCisgICAgICBDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0Q29sb3IoKSwgR2V0VHJhbnNwYXJlbmN5KCkpLAorICAgICAgT2JqQXJyYXkpOwogfQogCi12b2lkIENQV0xfRWRpdDo6QWp1c3RBcmFiaWNXb3Jkcyhjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IpCi17Cit2b2lkIENQV0xfRWRpdDo6R2VuZXJhdGVQYWdlT2JqZWN0cyhDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCkgeworICBDRlhfQXJyYXlUZW1wbGF0ZTxDUERGX1RleHRPYmplY3QqPiBPYmpBcnJheTsKKyAgSUZYX0VkaXQ6OkdlbmVyYXRlUGFnZU9iamVjdHMoCisgICAgICBwUGFnZU9iamVjdHMsIG1fcEVkaXQsIHB0T2Zmc2V0LCBOVUxMLAorICAgICAgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dENvbG9yKCksIEdldFRyYW5zcGFyZW5jeSgpKSwKKyAgICAgIE9iakFycmF5KTsKIH0KLQotdm9pZCBDUFdMX0VkaXQ6OkdlbmVyYXRlUGFnZU9iamVjdHMoQ1BERl9QYWdlT2JqZWN0cyogcFBhZ2VPYmplY3RzLCAKLQkJCQkJCQkJCQljb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9UZXh0T2JqZWN0Kj4mIE9iakFycmF5KQotewotCUlGWF9FZGl0OjpHZW5lcmF0ZVBhZ2VPYmplY3RzKHBQYWdlT2JqZWN0cywgbV9wRWRpdCwgcHRPZmZzZXQsIE5VTEwsIENQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKEdldFRleHRDb2xvcigpLEdldFRyYW5zcGFyZW5jeSgpKSwgT2JqQXJyYXkpOwotfQotCi12b2lkIENQV0xfRWRpdDo6R2VuZXJhdGVQYWdlT2JqZWN0cyhDUERGX1BhZ2VPYmplY3RzKiBwUGFnZU9iamVjdHMsIAotCQkJCQkJCQkJY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQpCi17Ci0JQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9UZXh0T2JqZWN0Kj4gT2JqQXJyYXk7Ci0JSUZYX0VkaXQ6OkdlbmVyYXRlUGFnZU9iamVjdHMocFBhZ2VPYmplY3RzLCBtX3BFZGl0LCBwdE9mZnNldCwgTlVMTCwgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dENvbG9yKCksR2V0VHJhbnNwYXJlbmN5KCkpLCBPYmpBcnJheSk7Ci19Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfRWRpdEN0cmwuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9FZGl0Q3RybC5jcHAKaW5kZXggOTBhMTk4YS4uYzUwNWM3ZSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9FZGl0Q3RybC5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9FZGl0Q3RybC5jcHAKQEAgLTEsNzI4ICsxLDYyNCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUERGV2luZG93LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9FZGl0Q3RybC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfVXRpbHMuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQ2FyZXQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRm9udE1hcC5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmgiCiAKLSNkZWZpbmUgSXNGbG9hdFplcm8oZikJCQkJCQkoKGYpIDwgMC4wMDAxICYmIChmKSA+IC0wLjAwMDEpCi0jZGVmaW5lIElzRmxvYXRCaWdnZXIoZmEsZmIpCQkJCSgoZmEpID4gKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQotI2RlZmluZSBJc0Zsb2F0U21hbGxlcihmYSxmYikJCQkJKChmYSkgPCAoZmIpICYmICFJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkpCi0jZGVmaW5lIElzRmxvYXRFcXVhbChmYSxmYikJCQkJCUlzRmxvYXRaZXJvKChmYSktKGZiKSkKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9DYXJldC5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ZvbnRNYXAuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2Z3bGV2ZW50LmgiCiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9FZGl0Q3RybCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgSXNGbG9hdFplcm8oZikgKChmKSA8IDAuMDAwMSAmJiAoZikgPiAtMC4wMDAxKQorI2RlZmluZSBJc0Zsb2F0QmlnZ2VyKGZhLCBmYikgKChmYSkgPiAoZmIpICYmICFJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkpCisjZGVmaW5lIElzRmxvYXRTbWFsbGVyKGZhLCBmYikgKChmYSkgPCAoZmIpICYmICFJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkpCisjZGVmaW5lIElzRmxvYXRFcXVhbChmYSwgZmIpIElzRmxvYXRaZXJvKChmYSkgLSAoZmIpKQogCi1DUFdMX0VkaXRDdHJsOjpDUFdMX0VkaXRDdHJsKCkgOgotCW1fcEVkaXQoTlVMTCksCi0JbV9wRWRpdENhcmV0KE5VTEwpLAotCW1fYk1vdXNlRG93bihGQUxTRSksCi0JbV9wRWRpdE5vdGlmeShOVUxMKSwKLQltX25DaGFyU2V0KERFRkFVTFRfQ0hBUlNFVCksCi0JbV9uQ29kZVBhZ2UoMCkKLXsKLQltX3BFZGl0ID0gSUZYX0VkaXQ6Ok5ld0VkaXQoKTsKLQlBU1NFUlQobV9wRWRpdCAhPSBOVUxMKTsKK0NQV0xfRWRpdEN0cmw6OkNQV0xfRWRpdEN0cmwoKQorICAgIDogbV9wRWRpdChOVUxMKSwKKyAgICAgIG1fcEVkaXRDYXJldChOVUxMKSwKKyAgICAgIG1fYk1vdXNlRG93bihGQUxTRSksCisgICAgICBtX3BFZGl0Tm90aWZ5KE5VTEwpLAorICAgICAgbV9uQ2hhclNldChERUZBVUxUX0NIQVJTRVQpLAorICAgICAgbV9uQ29kZVBhZ2UoMCkgeworICBtX3BFZGl0ID0gSUZYX0VkaXQ6Ok5ld0VkaXQoKTsKKyAgQVNTRVJUKG1fcEVkaXQpOwogfQogCi1DUFdMX0VkaXRDdHJsOjp+Q1BXTF9FZGl0Q3RybCgpCi17Ci0JSUZYX0VkaXQ6OkRlbEVkaXQobV9wRWRpdCk7CitDUFdMX0VkaXRDdHJsOjp+Q1BXTF9FZGl0Q3RybCgpIHsKKyAgSUZYX0VkaXQ6OkRlbEVkaXQobV9wRWRpdCk7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0Q3RybDo6T25DcmVhdGUoUFdMX0NSRUFURVBBUkFNICYgY3ApCi17Ci0JY3AuZUN1cnNvclR5cGUgPSBGWENUX1ZCRUFNOwordm9pZCBDUFdMX0VkaXRDdHJsOjpPbkNyZWF0ZShQV0xfQ1JFQVRFUEFSQU0mIGNwKSB7CisgIGNwLmVDdXJzb3JUeXBlID0gRlhDVF9WQkVBTTsKIH0KIAotdm9pZCBDUFdMX0VkaXRDdHJsOjpPbkNyZWF0ZWQoKQotewotCVNldEZvbnRTaXplKHRoaXMtPkdldENyZWF0aW9uUGFyYW0oKS5mRm9udFNpemUpOwordm9pZCBDUFdMX0VkaXRDdHJsOjpPbkNyZWF0ZWQoKSB7CisgIFNldEZvbnRTaXplKEdldENyZWF0aW9uUGFyYW0oKS5mRm9udFNpemUpOwogCi0JbV9wRWRpdC0+U2V0Rm9udE1hcCh0aGlzLT5HZXRGb250TWFwKCkpOwotCW1fcEVkaXQtPlNldE5vdGlmeSh0aGlzKTsKLQltX3BFZGl0LT5Jbml0aWFsaXplKCk7CisgIG1fcEVkaXQtPlNldEZvbnRNYXAoR2V0Rm9udE1hcCgpKTsKKyAgbV9wRWRpdC0+U2V0Tm90aWZ5KHRoaXMpOworICBtX3BFZGl0LT5Jbml0aWFsaXplKCk7CiB9CiAKLUZYX0JPT0wgQ1BXTF9FZGl0Q3RybDo6SXNXbmRIb3JWKCkKLXsKLQlDUERGX01hdHJpeCBtdCA9IEdldFdpbmRvd01hdHJpeCgpOwotCUNQREZfUG9pbnQgcG9pbnQxKDAsMSk7Ci0JQ1BERl9Qb2ludCBwb2ludDIoMSwxKTsKK0ZYX0JPT0wgQ1BXTF9FZGl0Q3RybDo6SXNXbmRIb3JWKCkgeworICBDRlhfTWF0cml4IG10ID0gR2V0V2luZG93TWF0cml4KCk7CisgIENQREZfUG9pbnQgcG9pbnQxKDAsIDEpOworICBDUERGX1BvaW50IHBvaW50MigxLCAxKTsKIAotCW10LlRyYW5zZm9ybShwb2ludDEueCwgcG9pbnQxLnkpOwotCW10LlRyYW5zZm9ybShwb2ludDIueCwgcG9pbnQyLnkpOworICBtdC5UcmFuc2Zvcm0ocG9pbnQxLngsIHBvaW50MS55KTsKKyAgbXQuVHJhbnNmb3JtKHBvaW50Mi54LCBwb2ludDIueSk7CiAKLQlyZXR1cm4gcG9pbnQyLnkgPT0gcG9pbnQxLnk7CisgIHJldHVybiBwb2ludDIueSA9PSBwb2ludDEueTsKIH0KIAotdm9pZCBDUFdMX0VkaXRDdHJsOjpTZXRDdXJzb3IoKQotewotCWlmIChJc1ZhbGlkKCkpIAotCXsKLQkJaWYgKElGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCkpCi0JCXsKLQkJCWlmIChJc1duZEhvclYoKSkKLQkJCQlwU0gtPlNldEN1cnNvcihGWENUX1ZCRUFNKTsKLQkJCWVsc2UKLQkJCQlwU0gtPlNldEN1cnNvcihGWENUX0hCRUFNKTsKLQkJfQotCX0KK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0Q3Vyc29yKCkgeworICBpZiAoSXNWYWxpZCgpKSB7CisgICAgaWYgKElGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCkpIHsKKyAgICAgIGlmIChJc1duZEhvclYoKSkKKyAgICAgICAgcFNILT5TZXRDdXJzb3IoRlhDVF9WQkVBTSk7CisgICAgICBlbHNlCisgICAgICAgIHBTSC0+U2V0Q3Vyc29yKEZYQ1RfSEJFQU0pOworICAgIH0KKyAgfQogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OlJlUG9zQ2hpbGRXbmQoKQotewotCW1fcEVkaXQtPlNldFBsYXRlUmVjdChHZXRDbGllbnRSZWN0KCkpOwordm9pZCBDUFdMX0VkaXRDdHJsOjpSZVBvc0NoaWxkV25kKCkgeworICBtX3BFZGl0LT5TZXRQbGF0ZVJlY3QoR2V0Q2xpZW50UmVjdCgpKTsKIH0KIAotdm9pZCBDUFdMX0VkaXRDdHJsOjpPbk5vdGlmeShDUFdMX1duZCogcFduZCwgRlhfRFdPUkQgbXNnLCBGWF9JTlRQVFIgd1BhcmFtLCBGWF9JTlRQVFIgbFBhcmFtKQotewotCUNQV0xfV25kOjpPbk5vdGlmeShwV25kLG1zZyx3UGFyYW0sbFBhcmFtKTsKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6T25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3Qgd1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBsUGFyYW0pIHsKKyAgQ1BXTF9XbmQ6Ok9uTm90aWZ5KHBXbmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOwogCi0Jc3dpdGNoIChtc2cpCi0JewotCQljYXNlIFBOTV9TRVRTQ1JPTExJTkZPOgotCQkJc3dpdGNoICh3UGFyYW0pCi0JCQl7Ci0JCQkJY2FzZSBTQlRfVlNDUk9MTDoKLQkJCQkJaWYgKENQV0xfV25kICogcENoaWxkID0gR2V0VlNjcm9sbEJhcigpKQotCQkJCQl7Ci0JCQkJCQlwQ2hpbGQtPk9uTm90aWZ5KHBXbmQsUE5NX1NFVFNDUk9MTElORk8sd1BhcmFtLGxQYXJhbSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBQTk1fU0VUU0NST0xMUE9TOgkJCQotCQkJc3dpdGNoICh3UGFyYW0pCi0JCQl7Ci0JCQkJY2FzZSBTQlRfVlNDUk9MTDoKLQkJCQkJaWYgKENQV0xfV25kICogcENoaWxkID0gR2V0VlNjcm9sbEJhcigpKQotCQkJCQl7Ci0JCQkJCQlwQ2hpbGQtPk9uTm90aWZ5KHBXbmQsUE5NX1NFVFNDUk9MTFBPUyx3UGFyYW0sbFBhcmFtKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFBOTV9TQ1JPTExXSU5ET1c6Ci0JCQl7Ci0JCQkJRlhfRkxPQVQgZlBvcyA9ICooRlhfRkxPQVQqKWxQYXJhbTsKLQkJCQlzd2l0Y2ggKHdQYXJhbSkKLQkJCQl7Ci0JCQkJCWNhc2UgU0JUX1ZTQ1JPTEw6Ci0JCQkJCQltX3BFZGl0LT5TZXRTY3JvbGxQb3MoQ1BERl9Qb2ludChtX3BFZGl0LT5HZXRTY3JvbGxQb3MoKS54LGZQb3MpKTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFBOTV9TRVRDQVJFVElORk86Ci0JCQl7Ci0JCQkJaWYgKFBXTF9DQVJFVF9JTkZPICogcENhcmV0SW5mbyA9IChQV0xfQ0FSRVRfSU5GTyAqKXdQYXJhbSkKLQkJCQl7Ci0JCQkJCXRoaXMtPlNldENhcmV0KHBDYXJldEluZm8tPmJWaXNpYmxlLAotCQkJCQkJcENhcmV0SW5mby0+cHRIZWFkLAotCQkJCQkJcENhcmV0SW5mby0+cHRGb290KTsJCQkJCQotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCX0KKyAgc3dpdGNoIChtc2cpIHsKKyAgICBjYXNlIFBOTV9TRVRTQ1JPTExJTkZPOgorICAgICAgc3dpdGNoICh3UGFyYW0pIHsKKyAgICAgICAgY2FzZSBTQlRfVlNDUk9MTDoKKyAgICAgICAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IEdldFZTY3JvbGxCYXIoKSkgeworICAgICAgICAgICAgcENoaWxkLT5Pbk5vdGlmeShwV25kLCBQTk1fU0VUU0NST0xMSU5GTywgd1BhcmFtLCBsUGFyYW0pOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUE5NX1NFVFNDUk9MTFBPUzoKKyAgICAgIHN3aXRjaCAod1BhcmFtKSB7CisgICAgICAgIGNhc2UgU0JUX1ZTQ1JPTEw6CisgICAgICAgICAgaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBHZXRWU2Nyb2xsQmFyKCkpIHsKKyAgICAgICAgICAgIHBDaGlsZC0+T25Ob3RpZnkocFduZCwgUE5NX1NFVFNDUk9MTFBPUywgd1BhcmFtLCBsUGFyYW0pOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUE5NX1NDUk9MTFdJTkRPVzogeworICAgICAgRlhfRkxPQVQgZlBvcyA9ICooRlhfRkxPQVQqKWxQYXJhbTsKKyAgICAgIHN3aXRjaCAod1BhcmFtKSB7CisgICAgICAgIGNhc2UgU0JUX1ZTQ1JPTEw6CisgICAgICAgICAgbV9wRWRpdC0+U2V0U2Nyb2xsUG9zKENQREZfUG9pbnQobV9wRWRpdC0+R2V0U2Nyb2xsUG9zKCkueCwgZlBvcykpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBQTk1fU0VUQ0FSRVRJTkZPOiB7CisgICAgICBpZiAoUFdMX0NBUkVUX0lORk8qIHBDYXJldEluZm8gPSAoUFdMX0NBUkVUX0lORk8qKXdQYXJhbSkgeworICAgICAgICBTZXRDYXJldChwQ2FyZXRJbmZvLT5iVmlzaWJsZSwgcENhcmV0SW5mby0+cHRIZWFkLCBwQ2FyZXRJbmZvLT5wdEZvb3QpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgIH0KIH0KIAotdm9pZCBDUFdMX0VkaXRDdHJsOjpDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCkKLXsKLQlpZiAoIUlzUmVhZE9ubHkoKSkKLQkJQ3JlYXRlRWRpdENhcmV0KGNwKTsKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6Q3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCkgeworICBpZiAoIUlzUmVhZE9ubHkoKSkKKyAgICBDcmVhdGVFZGl0Q2FyZXQoY3ApOwogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OkNyZWF0ZUVkaXRDYXJldChjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCkKLXsKLQlpZiAoIW1fcEVkaXRDYXJldCkKLQl7Ci0JCW1fcEVkaXRDYXJldCA9IG5ldyBDUFdMX0NhcmV0OwkKLQkJbV9wRWRpdENhcmV0LT5TZXRJbnZhbGlkUmVjdChHZXRDbGllbnRSZWN0KCkpOwordm9pZCBDUFdMX0VkaXRDdHJsOjpDcmVhdGVFZGl0Q2FyZXQoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCkgeworICBpZiAoIW1fcEVkaXRDYXJldCkgeworICAgIG1fcEVkaXRDYXJldCA9IG5ldyBDUFdMX0NhcmV0OworICAgIG1fcEVkaXRDYXJldC0+U2V0SW52YWxpZFJlY3QoR2V0Q2xpZW50UmVjdCgpKTsKIAotCQlQV0xfQ1JFQVRFUEFSQU0JZWNwID0gY3A7Ci0JCWVjcC5wUGFyZW50V25kID0gdGhpczsKLQkJZWNwLmR3RmxhZ3MgPSBQV1NfQ0hJTEQgfCBQV1NfTk9SRUZSRVNIQ0xJUDsKLQkJZWNwLmR3Qm9yZGVyV2lkdGggPSAwOwotCQllY3AubkJvcmRlclN0eWxlID0gUEJTX1NPTElEOwotCQllY3AucmNSZWN0V25kID0gQ1BERl9SZWN0KDAsMCwwLDApOworICAgIFBXTF9DUkVBVEVQQVJBTSBlY3AgPSBjcDsKKyAgICBlY3AucFBhcmVudFduZCA9IHRoaXM7CisgICAgZWNwLmR3RmxhZ3MgPSBQV1NfQ0hJTEQgfCBQV1NfTk9SRUZSRVNIQ0xJUDsKKyAgICBlY3AuZHdCb3JkZXJXaWR0aCA9IDA7CisgICAgZWNwLm5Cb3JkZXJTdHlsZSA9IFBCU19TT0xJRDsKKyAgICBlY3AucmNSZWN0V25kID0gQ1BERl9SZWN0KDAsIDAsIDAsIDApOwogCi0JCW1fcEVkaXRDYXJldC0+Q3JlYXRlKGVjcCk7Ci0JfQorICAgIG1fcEVkaXRDYXJldC0+Q3JlYXRlKGVjcCk7CisgIH0KIH0KIAotdm9pZCBDUFdMX0VkaXRDdHJsOjpTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpCi17Ci0JbV9wRWRpdC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSB7CisgIG1fcEVkaXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7CiB9CiAKLUZYX0ZMT0FUIENQV0xfRWRpdEN0cmw6OkdldEZvbnRTaXplKCkgY29uc3QKLXsKLQlyZXR1cm4gbV9wRWRpdC0+R2V0Rm9udFNpemUoKTsKK0ZYX0ZMT0FUIENQV0xfRWRpdEN0cmw6OkdldEZvbnRTaXplKCkgY29uc3QgeworICByZXR1cm4gbV9wRWRpdC0+R2V0Rm9udFNpemUoKTsKIH0KIAotRlhfQk9PTCBDUFdMX0VkaXRDdHJsOjpPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JaWYgKG1fYk1vdXNlRG93bikgcmV0dXJuIFRSVUU7CitGWF9CT09MIENQV0xfRWRpdEN0cmw6Ok9uS2V5RG93bihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykgeworICBpZiAobV9iTW91c2VEb3duKQorICAgIHJldHVybiBUUlVFOwogCi0JRlhfQk9PTCBiUmV0ID0gQ1BXTF9XbmQ6Ok9uS2V5RG93bihuQ2hhcixuRmxhZyk7CisgIEZYX0JPT0wgYlJldCA9IENQV0xfV25kOjpPbktleURvd24obkNoYXIsIG5GbGFnKTsKIAotCS8vRklMVEVSCi0Jc3dpdGNoIChuQ2hhcikKLQl7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIEZBTFNFOwotCWNhc2UgRldMX1ZLRVlfRGVsZXRlOgotCWNhc2UgRldMX1ZLRVlfVXA6Ci0JY2FzZSBGV0xfVktFWV9Eb3duOgotCWNhc2UgRldMX1ZLRVlfTGVmdDoKLQljYXNlIEZXTF9WS0VZX1JpZ2h0OgotCWNhc2UgRldMX1ZLRVlfSG9tZToKLQljYXNlIEZXTF9WS0VZX0VuZDoKLQljYXNlIEZXTF9WS0VZX0luc2VydDoKLQljYXNlICdDJzoKLQljYXNlICdWJzoKLQljYXNlICdYJzoKLQljYXNlICdBJzoKLQljYXNlICdaJzoKLQljYXNlICdjJzoKLQljYXNlICd2JzoKLQljYXNlICd4JzoKLQljYXNlICdhJzoKLQljYXNlICd6JzoKLQkJYnJlYWs7Ci0JfQorICAvLyBGSUxURVIKKyAgc3dpdGNoIChuQ2hhcikgeworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgY2FzZSBGV0xfVktFWV9EZWxldGU6CisgICAgY2FzZSBGV0xfVktFWV9VcDoKKyAgICBjYXNlIEZXTF9WS0VZX0Rvd246CisgICAgY2FzZSBGV0xfVktFWV9MZWZ0OgorICAgIGNhc2UgRldMX1ZLRVlfUmlnaHQ6CisgICAgY2FzZSBGV0xfVktFWV9Ib21lOgorICAgIGNhc2UgRldMX1ZLRVlfRW5kOgorICAgIGNhc2UgRldMX1ZLRVlfSW5zZXJ0OgorICAgIGNhc2UgJ0MnOgorICAgIGNhc2UgJ1YnOgorICAgIGNhc2UgJ1gnOgorICAgIGNhc2UgJ0EnOgorICAgIGNhc2UgJ1onOgorICAgIGNhc2UgJ2MnOgorICAgIGNhc2UgJ3YnOgorICAgIGNhc2UgJ3gnOgorICAgIGNhc2UgJ2EnOgorICAgIGNhc2UgJ3onOgorICAgICAgYnJlYWs7CisgIH0KIAotCWlmIChuQ2hhciA9PSBGV0xfVktFWV9EZWxldGUpCi0JewotCQlpZiAobV9wRWRpdC0+SXNTZWxlY3RlZCgpKQotCQkJbkNoYXIgPSBGV0xfVktFWV9Vbmtub3duOwotCX0KKyAgaWYgKG5DaGFyID09IEZXTF9WS0VZX0RlbGV0ZSkgeworICAgIGlmIChtX3BFZGl0LT5Jc1NlbGVjdGVkKCkpCisgICAgICBuQ2hhciA9IEZXTF9WS0VZX1Vua25vd247CisgIH0KIAotCXN3aXRjaCAobkNoYXIpCi0JewotCQljYXNlIEZXTF9WS0VZX0RlbGV0ZToJCi0JCQlEZWxldGUoKTsKLQkJCXJldHVybiBUUlVFOwotCQljYXNlIEZXTF9WS0VZX0luc2VydDoKLQkJCWlmIChJc1NISUZUcHJlc3NlZChuRmxhZykpCi0JCQkJUGFzdGVUZXh0KCk7Ci0JCQlyZXR1cm4gVFJVRTsKLQkJY2FzZSBGV0xfVktFWV9VcDoKLQkJCW1fcEVkaXQtPk9uVktfVVAoSXNTSElGVHByZXNzZWQobkZsYWcpLEZBTFNFKTsKLQkJCXJldHVybiBUUlVFOwotCQljYXNlIEZXTF9WS0VZX0Rvd246Ci0JCQltX3BFZGl0LT5PblZLX0RPV04oSXNTSElGVHByZXNzZWQobkZsYWcpLEZBTFNFKTsKLQkJCXJldHVybiBUUlVFOwotCQljYXNlIEZXTF9WS0VZX0xlZnQ6Ci0JCQltX3BFZGl0LT5PblZLX0xFRlQoSXNTSElGVHByZXNzZWQobkZsYWcpLEZBTFNFKTsKLQkJCXJldHVybiBUUlVFOwotCQljYXNlIEZXTF9WS0VZX1JpZ2h0OgotCQkJbV9wRWRpdC0+T25WS19SSUdIVChJc1NISUZUcHJlc3NlZChuRmxhZyksRkFMU0UpOwotCQkJcmV0dXJuIFRSVUU7Ci0JCWNhc2UgRldMX1ZLRVlfSG9tZToKLQkJCW1fcEVkaXQtPk9uVktfSE9NRShJc1NISUZUcHJlc3NlZChuRmxhZyksSXNDVFJMcHJlc3NlZChuRmxhZykpOwotCQkJcmV0dXJuIFRSVUU7Ci0JCWNhc2UgRldMX1ZLRVlfRW5kOgotCQkJbV9wRWRpdC0+T25WS19FTkQoSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKTsKLQkJCXJldHVybiBUUlVFOwotCQljYXNlIEZXTF9WS0VZX1Vua25vd246Ci0JCQlpZiAoIUlzU0hJRlRwcmVzc2VkKG5GbGFnKSkKLQkJCQlDbGVhcigpOwotCQkJZWxzZQotCQkJCUN1dFRleHQoKTsKLQkJCXJldHVybiBUUlVFOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JfQotCQotCXJldHVybiBiUmV0OworICBzd2l0Y2ggKG5DaGFyKSB7CisgICAgY2FzZSBGV0xfVktFWV9EZWxldGU6CisgICAgICBEZWxldGUoKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgRldMX1ZLRVlfSW5zZXJ0OgorICAgICAgaWYgKElzU0hJRlRwcmVzc2VkKG5GbGFnKSkKKyAgICAgICAgUGFzdGVUZXh0KCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICBjYXNlIEZXTF9WS0VZX1VwOgorICAgICAgbV9wRWRpdC0+T25WS19VUChJc1NISUZUcHJlc3NlZChuRmxhZyksIEZBTFNFKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgRldMX1ZLRVlfRG93bjoKKyAgICAgIG1fcEVkaXQtPk9uVktfRE9XTihJc1NISUZUcHJlc3NlZChuRmxhZyksIEZBTFNFKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgRldMX1ZLRVlfTGVmdDoKKyAgICAgIG1fcEVkaXQtPk9uVktfTEVGVChJc1NISUZUcHJlc3NlZChuRmxhZyksIEZBTFNFKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgRldMX1ZLRVlfUmlnaHQ6CisgICAgICBtX3BFZGl0LT5PblZLX1JJR0hUKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgRkFMU0UpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgY2FzZSBGV0xfVktFWV9Ib21lOgorICAgICAgbV9wRWRpdC0+T25WS19IT01FKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgY2FzZSBGV0xfVktFWV9FbmQ6CisgICAgICBtX3BFZGl0LT5PblZLX0VORChJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgRldMX1ZLRVlfVW5rbm93bjoKKyAgICAgIGlmICghSXNTSElGVHByZXNzZWQobkZsYWcpKQorICAgICAgICBDbGVhcigpOworICAgICAgZWxzZQorICAgICAgICBDdXRUZXh0KCk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gYlJldDsKIH0KIAotRlhfQk9PTCBDUFdMX0VkaXRDdHJsOjpPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JaWYgKG1fYk1vdXNlRG93bikgcmV0dXJuIFRSVUU7CitGWF9CT09MIENQV0xfRWRpdEN0cmw6Ok9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykgeworICBpZiAobV9iTW91c2VEb3duKQorICAgIHJldHVybiBUUlVFOwogCi0JQ1BXTF9XbmQ6Ok9uQ2hhcihuQ2hhcixuRmxhZyk7CisgIENQV0xfV25kOjpPbkNoYXIobkNoYXIsIG5GbGFnKTsKIAotCS8vRklMVEVSCi0Jc3dpdGNoIChuQ2hhcikKLQl7Ci0JCWNhc2UgMHgwQToKLQkJY2FzZSAweDFCOgotCQkJcmV0dXJuIEZBTFNFOwkJCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQl9CisgIC8vIEZJTFRFUgorICBzd2l0Y2ggKG5DaGFyKSB7CisgICAgY2FzZSAweDBBOgorICAgIGNhc2UgMHgxQjoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KIAotCUZYX0JPT0wgYkN0cmwgPSBJc0NUUkxwcmVzc2VkKG5GbGFnKTsKLQlGWF9CT09MIGJBbHQgPSBJc0FMVHByZXNzZWQobkZsYWcpOwotCUZYX0JPT0wgYlNoaWZ0ID0gSXNTSElGVHByZXNzZWQobkZsYWcpOworICBGWF9CT09MIGJDdHJsID0gSXNDVFJMcHJlc3NlZChuRmxhZyk7CisgIEZYX0JPT0wgYkFsdCA9IElzQUxUcHJlc3NlZChuRmxhZyk7CisgIEZYX0JPT0wgYlNoaWZ0ID0gSXNTSElGVHByZXNzZWQobkZsYWcpOwogCi0JRlhfV09SRCB3b3JkID0gbkNoYXI7CisgIEZYX1dPUkQgd29yZCA9IG5DaGFyOwogCi0JaWYgKGJDdHJsICYmICFiQWx0KQotCXsKLQkJc3dpdGNoIChuQ2hhcikKLQkJewotCQkJY2FzZSAnQycgLSAnQScgKyAxOgotCQkJCXRoaXMtPkNvcHlUZXh0KCk7Ci0JCQkJcmV0dXJuIFRSVUU7Ci0JCQljYXNlICdWJyAtICdBJyArIDE6Ci0JCQkJdGhpcy0+UGFzdGVUZXh0KCk7Ci0JCQkJcmV0dXJuIFRSVUU7Ci0JCQljYXNlICdYJyAtICdBJyArIDE6Ci0JCQkJdGhpcy0+Q3V0VGV4dCgpOwotCQkJCXJldHVybiBUUlVFOwotCQkJY2FzZSAnQScgLSAnQScgKyAxOgotCQkJCXRoaXMtPlNlbGVjdEFsbCgpOwotCQkJCXJldHVybiBUUlVFOwotCQkJY2FzZSAnWicgLSAnQScgKyAxOgotCQkJCWlmIChiU2hpZnQpCi0JCQkJCVJlZG8oKTsKLQkJCQllbHNlCi0JCQkJCVVuZG8oKTsKLQkJCQlyZXR1cm4gVFJVRTsKLQkJCWRlZmF1bHQ6Ci0JCQkJaWYgKG5DaGFyIDwgMzIpCi0JCQkJCXJldHVybiBGQUxTRTsKLQkJfQotCX0KKyAgaWYgKGJDdHJsICYmICFiQWx0KSB7CisgICAgc3dpdGNoIChuQ2hhcikgeworICAgICAgY2FzZSAnQycgLSAnQScgKyAxOgorICAgICAgICBDb3B5VGV4dCgpOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIGNhc2UgJ1YnIC0gJ0EnICsgMToKKyAgICAgICAgUGFzdGVUZXh0KCk7CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgY2FzZSAnWCcgLSAnQScgKyAxOgorICAgICAgICBDdXRUZXh0KCk7CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgY2FzZSAnQScgLSAnQScgKyAxOgorICAgICAgICBTZWxlY3RBbGwoKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICBjYXNlICdaJyAtICdBJyArIDE6CisgICAgICAgIGlmIChiU2hpZnQpCisgICAgICAgICAgUmVkbygpOworICAgICAgICBlbHNlCisgICAgICAgICAgVW5kbygpOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmIChuQ2hhciA8IDMyKQorICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0KIAotCWlmIChJc1JlYWRPbmx5KCkpIHJldHVybiBUUlVFOworICBpZiAoSXNSZWFkT25seSgpKQorICAgIHJldHVybiBUUlVFOwogCi0JaWYgKG1fcEVkaXQtPklzU2VsZWN0ZWQoKSAmJiB3b3JkID09ICBGV0xfVktFWV9CYWNrKQotCQl3b3JkID0gRldMX1ZLRVlfVW5rbm93bjsKKyAgaWYgKG1fcEVkaXQtPklzU2VsZWN0ZWQoKSAmJiB3b3JkID09IEZXTF9WS0VZX0JhY2spCisgICAgd29yZCA9IEZXTF9WS0VZX1Vua25vd247CiAKLQlDbGVhcigpOworICBDbGVhcigpOwogCi0Jc3dpdGNoICh3b3JkKQotCXsKLQljYXNlIEZXTF9WS0VZX0JhY2s6Ci0JCUJhY2tzcGFjZSgpOwotCQlicmVhazsKLQljYXNlIEZXTF9WS0VZX1JldHVybjoJCi0JCUluc2VydFJldHVybigpOwotCQlicmVhazsKLQljYXNlIEZXTF9WS0VZX1Vua25vd246Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWlmIChJc0lOU0VSVHByZXNzZWQobkZsYWcpKQotCQkJRGVsZXRlKCk7Ci0JCUluc2VydFdvcmQod29yZCwgdGhpcy0+R2V0Q2hhclNldCgpKTsKLQkJYnJlYWs7Ci0JfQorICBzd2l0Y2ggKHdvcmQpIHsKKyAgICBjYXNlIEZXTF9WS0VZX0JhY2s6CisgICAgICBCYWNrc3BhY2UoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRldMX1ZLRVlfUmV0dXJuOgorICAgICAgSW5zZXJ0UmV0dXJuKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZXTF9WS0VZX1Vua25vd246CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKElzSU5TRVJUcHJlc3NlZChuRmxhZykpCisgICAgICAgIERlbGV0ZSgpOworICAgICAgSW5zZXJ0V29yZCh3b3JkLCBHZXRDaGFyU2V0KCkpOworICAgICAgYnJlYWs7CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBDUFdMX0VkaXRDdHJsOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsbkZsYWcpOworRlhfQk9PTCBDUFdMX0VkaXRDdHJsOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgeworICBDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCwgbkZsYWcpOwogCi0JaWYgKENsaWVudEhpdFRlc3QocG9pbnQpKQotCXsJCQotCQlpZiAobV9iTW91c2VEb3duKQotCQkJdGhpcy0+SW52YWxpZGF0ZVJlY3QoKTsKKyAgaWYgKENsaWVudEhpdFRlc3QocG9pbnQpKSB7CisgICAgaWYgKG1fYk1vdXNlRG93bikKKyAgICAgIEludmFsaWRhdGVSZWN0KCk7CiAKLQkJbV9iTW91c2VEb3duID0gVFJVRTsJCQotCQlTZXRDYXB0dXJlKCk7CisgICAgbV9iTW91c2VEb3duID0gVFJVRTsKKyAgICBTZXRDYXB0dXJlKCk7CiAKLQkJbV9wRWRpdC0+T25Nb3VzZURvd24ocG9pbnQsSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKTsKLQl9CisgICAgbV9wRWRpdC0+T25Nb3VzZURvd24ocG9pbnQsIElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOworICB9CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgQ1BXTF9FZGl0Q3RybDo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKLXsKLQlDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsbkZsYWcpOworRlhfQk9PTCBDUFdMX0VkaXRDdHJsOjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIHsKKyAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvblVwKHBvaW50LCBuRmxhZyk7CiAKLQlpZiAobV9iTW91c2VEb3duKQotCXsKLQkJLy9jYW4gcmVjZWl2ZSBrZXlib3JkIG1lc3NhZ2UKLQkJaWYgKENsaWVudEhpdFRlc3QocG9pbnQpICYmICF0aGlzLT5Jc0ZvY3VzZWQoKSkKLQkJCVNldEZvY3VzKCk7CQorICBpZiAobV9iTW91c2VEb3duKSB7CisgICAgLy8gY2FuIHJlY2VpdmUga2V5Ym9yZCBtZXNzYWdlCisgICAgaWYgKENsaWVudEhpdFRlc3QocG9pbnQpICYmICFJc0ZvY3VzZWQoKSkKKyAgICAgIFNldEZvY3VzKCk7CiAKLQkJUmVsZWFzZUNhcHR1cmUoKTsKLQkJbV9iTW91c2VEb3duID0gRkFMU0U7Ci0JfQorICAgIFJlbGVhc2VDYXB0dXJlKCk7CisgICAgbV9iTW91c2VEb3duID0gRkFMU0U7CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBDUFdMX0VkaXRDdHJsOjpPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQotewotCUNQV0xfV25kOjpPbk1vdXNlTW92ZShwb2ludCxuRmxhZyk7CitGWF9CT09MIENQV0xfRWRpdEN0cmw6Ok9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgeworICBDUFdMX1duZDo6T25Nb3VzZU1vdmUocG9pbnQsIG5GbGFnKTsKIAotCWlmIChtX2JNb3VzZURvd24pCi0JCW1fcEVkaXQtPk9uTW91c2VNb3ZlKHBvaW50LEZBTFNFLEZBTFNFKTsKKyAgaWYgKG1fYk1vdXNlRG93bikKKyAgICBtX3BFZGl0LT5Pbk1vdXNlTW92ZShwb2ludCwgRkFMU0UsIEZBTFNFKTsKIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotQ1BERl9SZWN0IENQV0xfRWRpdEN0cmw6OkdldENvbnRlbnRSZWN0KCkgY29uc3QKLXsKLQlyZXR1cm4gbV9wRWRpdC0+R2V0Q29udGVudFJlY3QoKTsKK0NQREZfUmVjdCBDUFdMX0VkaXRDdHJsOjpHZXRDb250ZW50UmVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEVkaXQtPkdldENvbnRlbnRSZWN0KCk7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0RWRpdENhcmV0KEZYX0JPT0wgYlZpc2libGUpCi17Ci0JQ1BERl9Qb2ludCBwdEhlYWQoMCwwKSxwdEZvb3QoMCwwKTsKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0RWRpdENhcmV0KEZYX0JPT0wgYlZpc2libGUpIHsKKyAgQ1BERl9Qb2ludCBwdEhlYWQoMCwgMCksIHB0Rm9vdCgwLCAwKTsKIAotCWlmIChiVmlzaWJsZSkKLQl7Ci0JCUdldENhcmV0SW5mbyhwdEhlYWQscHRGb290KTsKLQl9CisgIGlmIChiVmlzaWJsZSkgeworICAgIEdldENhcmV0SW5mbyhwdEhlYWQsIHB0Rm9vdCk7CisgIH0KIAotCUNQVlRfV29yZFBsYWNlIHdwVGVtcCA9IG1fcEVkaXQtPkdldENhcmV0V29yZFBsYWNlKCk7Ci0JdGhpcy0+SU9uU2V0Q2FyZXQoYlZpc2libGUscHRIZWFkLHB0Rm9vdCx3cFRlbXApOworICBDUFZUX1dvcmRQbGFjZSB3cFRlbXAgPSBtX3BFZGl0LT5HZXRDYXJldFdvcmRQbGFjZSgpOworICBJT25TZXRDYXJldChiVmlzaWJsZSwgcHRIZWFkLCBwdEZvb3QsIHdwVGVtcCk7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0Q3RybDo6R2V0Q2FyZXRJbmZvKENQREZfUG9pbnQgJiBwdEhlYWQsIENQREZfUG9pbnQgJiBwdEZvb3QpIGNvbnN0Ci17Ci0JaWYgKElGWF9FZGl0X0l0ZXJhdG9yICogcEl0ZXJhdG9yID0gbV9wRWRpdC0+R2V0SXRlcmF0b3IoKSkKLQl7Ci0JCXBJdGVyYXRvci0+U2V0QXQobV9wRWRpdC0+R2V0Q2FyZXQoKSk7Ci0JCUNQVlRfV29yZCB3b3JkOwotCQlDUFZUX0xpbmUgbGluZTsKLQkJaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkKLQkJewotCQkJcHRIZWFkLnggPSB3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGg7Ci0JCQlwdEhlYWQueSA9IHdvcmQucHRXb3JkLnkgKyB3b3JkLmZBc2NlbnQ7Ci0JCQlwdEZvb3QueCA9IHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aDsKLQkJCXB0Rm9vdC55ID0gd29yZC5wdFdvcmQueSArIHdvcmQuZkRlc2NlbnQ7Ci0JCX0KLQkJZWxzZSBpZiAocEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpKQotCQl7CQkJCQotCQkJcHRIZWFkLnggPSBsaW5lLnB0TGluZS54OwotCQkJcHRIZWFkLnkgPSBsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZUFzY2VudDsKLQkJCXB0Rm9vdC54ID0gbGluZS5wdExpbmUueDsKLQkJCXB0Rm9vdC55ID0gbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVEZXNjZW50OwotCQl9Ci0JfQordm9pZCBDUFdMX0VkaXRDdHJsOjpHZXRDYXJldEluZm8oQ1BERl9Qb2ludCYgcHRIZWFkLCBDUERGX1BvaW50JiBwdEZvb3QpIGNvbnN0IHsKKyAgaWYgKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBtX3BFZGl0LT5HZXRJdGVyYXRvcigpKSB7CisgICAgcEl0ZXJhdG9yLT5TZXRBdChtX3BFZGl0LT5HZXRDYXJldCgpKTsKKyAgICBDUFZUX1dvcmQgd29yZDsKKyAgICBDUFZUX0xpbmUgbGluZTsKKyAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7CisgICAgICBwdEhlYWQueCA9IHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aDsKKyAgICAgIHB0SGVhZC55ID0gd29yZC5wdFdvcmQueSArIHdvcmQuZkFzY2VudDsKKyAgICAgIHB0Rm9vdC54ID0gd29yZC5wdFdvcmQueCArIHdvcmQuZldpZHRoOworICAgICAgcHRGb290LnkgPSB3b3JkLnB0V29yZC55ICsgd29yZC5mRGVzY2VudDsKKyAgICB9IGVsc2UgaWYgKHBJdGVyYXRvci0+R2V0TGluZShsaW5lKSkgeworICAgICAgcHRIZWFkLnggPSBsaW5lLnB0TGluZS54OworICAgICAgcHRIZWFkLnkgPSBsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZUFzY2VudDsKKyAgICAgIHB0Rm9vdC54ID0gbGluZS5wdExpbmUueDsKKyAgICAgIHB0Rm9vdC55ID0gbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVEZXNjZW50OworICAgIH0KKyAgfQogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OkdldENhcmV0UG9zKEZYX0lOVDMyJiB4LCBGWF9JTlQzMiYgeSkgY29uc3QKLXsKLQlDUERGX1BvaW50IHB0SGVhZCgwLDApLCBwdEZvb3QoMCwwKTsKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6R2V0Q2FyZXRQb3MoaW50MzJfdCYgeCwgaW50MzJfdCYgeSkgY29uc3QgeworICBDUERGX1BvaW50IHB0SGVhZCgwLCAwKSwgcHRGb290KDAsIDApOwogCi0JR2V0Q2FyZXRJbmZvKHB0SGVhZCxwdEZvb3QpOworICBHZXRDYXJldEluZm8ocHRIZWFkLCBwdEZvb3QpOwogCi0JUFdMdG9XbmQocHRIZWFkLCB4LCB5KTsKKyAgUFdMdG9XbmQocHRIZWFkLCB4LCB5KTsKIH0KIAotdm9pZCBDUFdMX0VkaXRDdHJsOjpTZXRDYXJldChGWF9CT09MIGJWaXNpYmxlLCBjb25zdCBDUERGX1BvaW50ICYgcHRIZWFkLCBjb25zdCBDUERGX1BvaW50ICYgcHRGb290KQotewotCWlmIChtX3BFZGl0Q2FyZXQpCi0JewotCQlpZiAoIUlzRm9jdXNlZCgpIHx8IG1fcEVkaXQtPklzU2VsZWN0ZWQoKSkKLQkJCWJWaXNpYmxlID0gRkFMU0U7Cit2b2lkIENQV0xfRWRpdEN0cmw6OlNldENhcmV0KEZYX0JPT0wgYlZpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0SGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRGb290KSB7CisgIGlmIChtX3BFZGl0Q2FyZXQpIHsKKyAgICBpZiAoIUlzRm9jdXNlZCgpIHx8IG1fcEVkaXQtPklzU2VsZWN0ZWQoKSkKKyAgICAgIGJWaXNpYmxlID0gRkFMU0U7CiAKLQkJbV9wRWRpdENhcmV0LT5TZXRDYXJldChiVmlzaWJsZSwgcHRIZWFkLCBwdEZvb3QpOwotCX0KKyAgICBtX3BFZGl0Q2FyZXQtPlNldENhcmV0KGJWaXNpYmxlLCBwdEhlYWQsIHB0Rm9vdCk7CisgIH0KIH0KIAotRlhfQk9PTAlDUFdMX0VkaXRDdHJsOjpJc01vZGlmaWVkKCkgY29uc3QKLXsKLQlyZXR1cm4gbV9wRWRpdC0+SXNNb2RpZmllZCgpOworQ0ZYX1dpZGVTdHJpbmcgQ1BXTF9FZGl0Q3RybDo6R2V0VGV4dCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEVkaXQtPkdldFRleHQoKTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BXTF9FZGl0Q3RybDo6R2V0VGV4dCgpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fcEVkaXQtPkdldFRleHQoKTsKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0U2VsKGludDMyX3QgblN0YXJ0Q2hhciwgaW50MzJfdCBuRW5kQ2hhcikgeworICBtX3BFZGl0LT5TZXRTZWwoblN0YXJ0Q2hhciwgbkVuZENoYXIpOwogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OlNldFNlbChGWF9JTlQzMiBuU3RhcnRDaGFyLEZYX0lOVDMyIG5FbmRDaGFyKQotewotCW1fcEVkaXQtPlNldFNlbChuU3RhcnRDaGFyLCBuRW5kQ2hhcik7Cit2b2lkIENQV0xfRWRpdEN0cmw6OkdldFNlbChpbnQzMl90JiBuU3RhcnRDaGFyLCBpbnQzMl90JiBuRW5kQ2hhcikgY29uc3QgeworICBtX3BFZGl0LT5HZXRTZWwoblN0YXJ0Q2hhciwgbkVuZENoYXIpOwogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OkdldFNlbChGWF9JTlQzMiAmIG5TdGFydENoYXIsIEZYX0lOVDMyICYgbkVuZENoYXIgKSBjb25zdAotewotCW1fcEVkaXQtPkdldFNlbChuU3RhcnRDaGFyLCBuRW5kQ2hhcik7Cit2b2lkIENQV0xfRWRpdEN0cmw6OkNsZWFyKCkgeworICBpZiAoIUlzUmVhZE9ubHkoKSkKKyAgICBtX3BFZGl0LT5DbGVhcigpOwogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OkNsZWFyKCkKLXsKLQlpZiAoIUlzUmVhZE9ubHkoKSkKLQkJbV9wRWRpdC0+Q2xlYXIoKTsKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6U2VsZWN0QWxsKCkgeworICBtX3BFZGl0LT5TZWxlY3RBbGwoKTsKIH0KIAotdm9pZCBDUFdMX0VkaXRDdHJsOjpTZWxlY3RBbGwoKQotewotCW1fcEVkaXQtPlNlbGVjdEFsbCgpOwordm9pZCBDUFdMX0VkaXRDdHJsOjpQYWludCgpIHsKKyAgaWYgKG1fcEVkaXQpCisgICAgbV9wRWRpdC0+UGFpbnQoKTsKIH0KIAotdm9pZCBDUFdMX0VkaXRDdHJsOjpQYWludCgpCi17Ci0JaWYgKG1fcEVkaXQpCi0JCW1fcEVkaXQtPlBhaW50KCk7Cit2b2lkIENQV0xfRWRpdEN0cmw6OkVuYWJsZVJlZnJlc2goRlhfQk9PTCBiUmVmcmVzaCkgeworICBpZiAobV9wRWRpdCkKKyAgICBtX3BFZGl0LT5FbmFibGVSZWZyZXNoKGJSZWZyZXNoKTsKIH0KIAotdm9pZCBDUFdMX0VkaXRDdHJsOjpFbmFibGVSZWZyZXNoKEZYX0JPT0wgYlJlZnJlc2gpCi17Ci0JaWYgKG1fcEVkaXQpCi0JCW1fcEVkaXQtPkVuYWJsZVJlZnJlc2goYlJlZnJlc2gpOworaW50MzJfdCBDUFdMX0VkaXRDdHJsOjpHZXRDYXJldCgpIGNvbnN0IHsKKyAgaWYgKG1fcEVkaXQpCisgICAgcmV0dXJuIG1fcEVkaXQtPkdldENhcmV0KCk7CisKKyAgcmV0dXJuIC0xOwogfQogCi1GWF9JTlQzMiBDUFdMX0VkaXRDdHJsOjpHZXRDYXJldCgpIGNvbnN0Ci17Ci0JaWYgKG1fcEVkaXQpCi0JCXJldHVybiBtX3BFZGl0LT5HZXRDYXJldCgpOwotCi0JcmV0dXJuIC0xOwordm9pZCBDUFdMX0VkaXRDdHJsOjpTZXRDYXJldChpbnQzMl90IG5Qb3MpIHsKKyAgaWYgKG1fcEVkaXQpCisgICAgbV9wRWRpdC0+U2V0Q2FyZXQoblBvcyk7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0Q2FyZXQoRlhfSU5UMzIgblBvcykKLXsKLQlpZiAobV9wRWRpdCkKLQkJbV9wRWRpdC0+U2V0Q2FyZXQoblBvcyk7CitpbnQzMl90IENQV0xfRWRpdEN0cmw6OkdldFRvdGFsV29yZHMoKSBjb25zdCB7CisgIGlmIChtX3BFZGl0KQorICAgIHJldHVybiBtX3BFZGl0LT5HZXRUb3RhbFdvcmRzKCk7CisKKyAgcmV0dXJuIDA7CiB9CiAKLUZYX0lOVDMyIENQV0xfRWRpdEN0cmw6OkdldFRvdGFsV29yZHMoKSBjb25zdAotewotCWlmIChtX3BFZGl0KQotCQlyZXR1cm4gbV9wRWRpdC0+R2V0VG90YWxXb3JkcygpOwotCi0JcmV0dXJuIDA7Cit2b2lkIENQV0xfRWRpdEN0cmw6OlNldFNjcm9sbFBvcyhjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBpZiAobV9wRWRpdCkKKyAgICBtX3BFZGl0LT5TZXRTY3JvbGxQb3MocG9pbnQpOwogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OlNldFNjcm9sbFBvcyhjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLQlpZiAobV9wRWRpdCkKLQkJbV9wRWRpdC0+U2V0U2Nyb2xsUG9zKHBvaW50KTsKK0NQREZfUG9pbnQgQ1BXTF9FZGl0Q3RybDo6R2V0U2Nyb2xsUG9zKCkgY29uc3QgeworICBpZiAobV9wRWRpdCkKKyAgICByZXR1cm4gbV9wRWRpdC0+R2V0U2Nyb2xsUG9zKCk7CisKKyAgcmV0dXJuIENQREZfUG9pbnQoMC4wZiwgMC4wZik7CiB9CiAKLUNQREZfUG9pbnQgQ1BXTF9FZGl0Q3RybDo6R2V0U2Nyb2xsUG9zKCkgY29uc3QKLXsKLQlpZiAobV9wRWRpdCkKLQkJcmV0dXJuIG1fcEVkaXQtPkdldFNjcm9sbFBvcygpOworQ1BERl9Gb250KiBDUFdMX0VkaXRDdHJsOjpHZXRDYXJldEZvbnQoKSBjb25zdCB7CisgIGludDMyX3QgbkZvbnRJbmRleCA9IDA7CiAKLQlyZXR1cm4gQ1BERl9Qb2ludCgwLjBmLCAwLjBmKTsKKyAgaWYgKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBtX3BFZGl0LT5HZXRJdGVyYXRvcigpKSB7CisgICAgcEl0ZXJhdG9yLT5TZXRBdChtX3BFZGl0LT5HZXRDYXJldCgpKTsKKyAgICBDUFZUX1dvcmQgd29yZDsKKyAgICBDUFZUX1NlY3Rpb24gc2VjdGlvbjsKKyAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7CisgICAgICBuRm9udEluZGV4ID0gd29yZC5uRm9udEluZGV4OworICAgIH0gZWxzZSBpZiAoSGFzRmxhZyhQRVNfUklDSCkpIHsKKyAgICAgIGlmIChwSXRlcmF0b3ItPkdldFNlY3Rpb24oc2VjdGlvbikpIHsKKyAgICAgICAgbkZvbnRJbmRleCA9IHNlY3Rpb24uV29yZFByb3BzLm5Gb250SW5kZXg7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKElGWF9FZGl0X0ZvbnRNYXAqIHBGb250TWFwID0gR2V0Rm9udE1hcCgpKQorICAgIHJldHVybiBwRm9udE1hcC0+R2V0UERGRm9udChuRm9udEluZGV4KTsKKworICByZXR1cm4gTlVMTDsKIH0KIAotQ1BERl9Gb250ICogQ1BXTF9FZGl0Q3RybDo6R2V0Q2FyZXRGb250KCkgY29uc3QKLXsKLQlGWF9JTlQzMiBuRm9udEluZGV4ID0gMDsKK0ZYX0ZMT0FUIENQV0xfRWRpdEN0cmw6OkdldENhcmV0Rm9udFNpemUoKSBjb25zdCB7CisgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IEdldEZvbnRTaXplKCk7CiAKLQlpZiAoSUZYX0VkaXRfSXRlcmF0b3IgKiBwSXRlcmF0b3IgPSBtX3BFZGl0LT5HZXRJdGVyYXRvcigpKQotCXsKLQkJcEl0ZXJhdG9yLT5TZXRBdChtX3BFZGl0LT5HZXRDYXJldCgpKTsKLQkJQ1BWVF9Xb3JkIHdvcmQ7Ci0JCUNQVlRfU2VjdGlvbiBzZWN0aW9uOwotCQlpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKQotCQl7Ci0JCQluRm9udEluZGV4ID0gd29yZC5uRm9udEluZGV4OwotCQl9Ci0JCWVsc2UgaWYgKEhhc0ZsYWcoUEVTX1JJQ0gpKQotCQl7Ci0JCQlpZiAocEl0ZXJhdG9yLT5HZXRTZWN0aW9uKHNlY3Rpb24pKQotCQkJewkJCQkKLQkJCQluRm9udEluZGV4ID0gc2VjdGlvbi5Xb3JkUHJvcHMubkZvbnRJbmRleDsKLQkJCX0KLQkJfQotCX0KKyAgaWYgKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBtX3BFZGl0LT5HZXRJdGVyYXRvcigpKSB7CisgICAgcEl0ZXJhdG9yLT5TZXRBdChtX3BFZGl0LT5HZXRDYXJldCgpKTsKKyAgICBDUFZUX1dvcmQgd29yZDsKKyAgICBDUFZUX1NlY3Rpb24gc2VjdGlvbjsKKyAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7CisgICAgICBmRm9udFNpemUgPSB3b3JkLmZGb250U2l6ZTsKKyAgICB9IGVsc2UgaWYgKEhhc0ZsYWcoUEVTX1JJQ0gpKSB7CisgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRTZWN0aW9uKHNlY3Rpb24pKSB7CisgICAgICAgIGZGb250U2l6ZSA9IHNlY3Rpb24uV29yZFByb3BzLmZGb250U2l6ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KIAotCWlmIChJRlhfRWRpdF9Gb250TWFwICogcEZvbnRNYXAgPSBHZXRGb250TWFwKCkpCi0JCXJldHVybiBwRm9udE1hcC0+R2V0UERGRm9udChuRm9udEluZGV4KTsKLQllbHNlCi0JCXJldHVybiBOVUxMOworICByZXR1cm4gZkZvbnRTaXplOwogfQogCi1GWF9GTE9BVCBDUFdMX0VkaXRDdHJsOjpHZXRDYXJldEZvbnRTaXplKCkgY29uc3QKLXsKLQlGWF9GTE9BVCBmRm9udFNpemUgPSBHZXRGb250U2l6ZSgpOwotCi0JaWYgKElGWF9FZGl0X0l0ZXJhdG9yICogcEl0ZXJhdG9yID0gbV9wRWRpdC0+R2V0SXRlcmF0b3IoKSkKLQl7Ci0JCXBJdGVyYXRvci0+U2V0QXQobV9wRWRpdC0+R2V0Q2FyZXQoKSk7Ci0JCUNQVlRfV29yZCB3b3JkOwotCQlDUFZUX1NlY3Rpb24gc2VjdGlvbjsKLQkJaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkKLQkJewotCQkJZkZvbnRTaXplID0gd29yZC5mRm9udFNpemU7Ci0JCX0KLQkJZWxzZSBpZiAoSGFzRmxhZyhQRVNfUklDSCkpCi0JCXsKLQkJCWlmIChwSXRlcmF0b3ItPkdldFNlY3Rpb24oc2VjdGlvbikpCi0JCQl7CQkJCQotCQkJCWZGb250U2l6ZSA9IHNlY3Rpb24uV29yZFByb3BzLmZGb250U2l6ZTsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiBmRm9udFNpemU7Cit2b2lkIENQV0xfRWRpdEN0cmw6OlNldFRleHQoY29uc3QgRlhfV0NIQVIqIGNzVGV4dCkgeworICBtX3BFZGl0LT5TZXRUZXh0KGNzVGV4dCk7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0VGV4dChGWF9MUENXU1RSIGNzVGV4dCkKLXsKLQltX3BFZGl0LT5TZXRUZXh0KGNzVGV4dCk7Cit2b2lkIENQV0xfRWRpdEN0cmw6OkNvcHlUZXh0KCkge30KKwordm9pZCBDUFdMX0VkaXRDdHJsOjpQYXN0ZVRleHQoKSB7fQorCit2b2lkIENQV0xfRWRpdEN0cmw6OkN1dFRleHQoKSB7fQorCit2b2lkIENQV0xfRWRpdEN0cmw6OlNob3dWU2Nyb2xsQmFyKEZYX0JPT0wgYlNob3cpIHt9CisKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6SW5zZXJ0VGV4dChjb25zdCBGWF9XQ0hBUiogY3NUZXh0KSB7CisgIGlmICghSXNSZWFkT25seSgpKQorICAgIG1fcEVkaXQtPkluc2VydFRleHQoY3NUZXh0KTsKIH0KIAotdm9pZCBDUFdMX0VkaXRDdHJsOjpDb3B5VGV4dCgpCi17Cit2b2lkIENQV0xfRWRpdEN0cmw6Okluc2VydFdvcmQoRlhfV09SRCB3b3JkLCBpbnQzMl90IG5DaGFyc2V0KSB7CisgIGlmICghSXNSZWFkT25seSgpKQorICAgIG1fcEVkaXQtPkluc2VydFdvcmQod29yZCwgbkNoYXJzZXQpOwogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OlBhc3RlVGV4dCgpCi17Cit2b2lkIENQV0xfRWRpdEN0cmw6Okluc2VydFJldHVybigpIHsKKyAgaWYgKCFJc1JlYWRPbmx5KCkpCisgICAgbV9wRWRpdC0+SW5zZXJ0UmV0dXJuKCk7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0Q3RybDo6Q3V0VGV4dCgpCi17Cit2b2lkIENQV0xfRWRpdEN0cmw6OkRlbGV0ZSgpIHsKKyAgaWYgKCFJc1JlYWRPbmx5KCkpCisgICAgbV9wRWRpdC0+RGVsZXRlKCk7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0Q3RybDo6U2hvd1ZTY3JvbGxCYXIoRlhfQk9PTCBiU2hvdykKLXsKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6QmFja3NwYWNlKCkgeworICBpZiAoIUlzUmVhZE9ubHkoKSkKKyAgICBtX3BFZGl0LT5CYWNrc3BhY2UoKTsKIH0KIAotdm9pZCBDUFdMX0VkaXRDdHJsOjpJbnNlcnRUZXh0KEZYX0xQQ1dTVFIgY3NUZXh0KQotewotCWlmICghSXNSZWFkT25seSgpKQotCQltX3BFZGl0LT5JbnNlcnRUZXh0KGNzVGV4dCk7CitGWF9CT09MIENQV0xfRWRpdEN0cmw6OkNhblVuZG8oKSBjb25zdCB7CisgIHJldHVybiAhSXNSZWFkT25seSgpICYmIG1fcEVkaXQtPkNhblVuZG8oKTsKIH0KIAotdm9pZCBDUFdMX0VkaXRDdHJsOjpJbnNlcnRXb3JkKEZYX1dPUkQgd29yZCwgRlhfSU5UMzIgbkNoYXJzZXQpCi17Ci0JaWYgKCFJc1JlYWRPbmx5KCkpCi0JCW1fcEVkaXQtPkluc2VydFdvcmQod29yZCwgbkNoYXJzZXQpOworRlhfQk9PTCBDUFdMX0VkaXRDdHJsOjpDYW5SZWRvKCkgY29uc3QgeworICByZXR1cm4gIUlzUmVhZE9ubHkoKSAmJiBtX3BFZGl0LT5DYW5SZWRvKCk7CiB9CiAKLXZvaWQgQ1BXTF9FZGl0Q3RybDo6SW5zZXJ0UmV0dXJuKCkKLXsKLQlpZiAoIUlzUmVhZE9ubHkoKSkKLQkJbV9wRWRpdC0+SW5zZXJ0UmV0dXJuKCk7Cit2b2lkIENQV0xfRWRpdEN0cmw6OlJlZG8oKSB7CisgIGlmIChDYW5SZWRvKCkpCisgICAgbV9wRWRpdC0+UmVkbygpOwogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OkRlbGV0ZSgpCi17Ci0JaWYgKCFJc1JlYWRPbmx5KCkpCi0JCW1fcEVkaXQtPkRlbGV0ZSgpOwordm9pZCBDUFdMX0VkaXRDdHJsOjpVbmRvKCkgeworICBpZiAoQ2FuVW5kbygpKQorICAgIG1fcEVkaXQtPlVuZG8oKTsKIH0KIAotdm9pZCBDUFdMX0VkaXRDdHJsOjpCYWNrc3BhY2UoKQotewotCWlmICghSXNSZWFkT25seSgpKQotCQltX3BFZGl0LT5CYWNrc3BhY2UoKTsKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6SU9uU2V0U2Nyb2xsSW5mb1koRlhfRkxPQVQgZlBsYXRlTWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGxhdGVNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29udGVudE1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNtYWxsU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkJpZ1N0ZXApIHsKKyAgUFdMX1NDUk9MTF9JTkZPIEluZm87CisKKyAgSW5mby5mUGxhdGVXaWR0aCA9IGZQbGF0ZU1heCAtIGZQbGF0ZU1pbjsKKyAgSW5mby5mQ29udGVudE1pbiA9IGZDb250ZW50TWluOworICBJbmZvLmZDb250ZW50TWF4ID0gZkNvbnRlbnRNYXg7CisgIEluZm8uZlNtYWxsU3RlcCA9IGZTbWFsbFN0ZXA7CisgIEluZm8uZkJpZ1N0ZXAgPSBmQmlnU3RlcDsKKworICBPbk5vdGlmeSh0aGlzLCBQTk1fU0VUU0NST0xMSU5GTywgU0JUX1ZTQ1JPTEwsIChpbnRwdHJfdCkmSW5mbyk7CisKKyAgaWYgKElzRmxvYXRCaWdnZXIoSW5mby5mUGxhdGVXaWR0aCwgSW5mby5mQ29udGVudE1heCAtIEluZm8uZkNvbnRlbnRNaW4pIHx8CisgICAgICBJc0Zsb2F0RXF1YWwoSW5mby5mUGxhdGVXaWR0aCwgSW5mby5mQ29udGVudE1heCAtIEluZm8uZkNvbnRlbnRNaW4pKSB7CisgICAgU2hvd1ZTY3JvbGxCYXIoRkFMU0UpOworICB9IGVsc2UgeworICAgIFNob3dWU2Nyb2xsQmFyKFRSVUUpOworICB9CiB9CiAKLUZYX0JPT0wJQ1BXTF9FZGl0Q3RybDo6Q2FuVW5kbygpIGNvbnN0Ci17Ci0JcmV0dXJuICFJc1JlYWRPbmx5KCkgJiYgbV9wRWRpdC0+Q2FuVW5kbygpOwordm9pZCBDUFdMX0VkaXRDdHJsOjpJT25TZXRTY3JvbGxQb3NZKEZYX0ZMT0FUIGZ5KSB7CisgIE9uTm90aWZ5KHRoaXMsIFBOTV9TRVRTQ1JPTExQT1MsIFNCVF9WU0NST0xMLCAoaW50cHRyX3QpJmZ5KTsKIH0KIAotRlhfQk9PTAlDUFdMX0VkaXRDdHJsOjpDYW5SZWRvKCkgY29uc3QKLXsKLQlyZXR1cm4gIUlzUmVhZE9ubHkoKSAmJiBtX3BFZGl0LT5DYW5SZWRvKCk7Cit2b2lkIENQV0xfRWRpdEN0cmw6OklPblNldENhcmV0KEZYX0JPT0wgYlZpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0SGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRGb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIHsKKyAgUFdMX0NBUkVUX0lORk8gY0luZm87CisgIGNJbmZvLmJWaXNpYmxlID0gYlZpc2libGU7CisgIGNJbmZvLnB0SGVhZCA9IHB0SGVhZDsKKyAgY0luZm8ucHRGb290ID0gcHRGb290OworCisgIE9uTm90aWZ5KHRoaXMsIFBOTV9TRVRDQVJFVElORk8sIChpbnRwdHJfdCkmY0luZm8sIChpbnRwdHJfdClOVUxMKTsKIH0KIAotdm9pZCBDUFdMX0VkaXRDdHJsOjpSZWRvKCkKLXsKLQlpZiAoQ2FuUmVkbygpKQotCQltX3BFZGl0LT5SZWRvKCk7Cit2b2lkIENQV0xfRWRpdEN0cmw6OklPbkNhcmV0Q2hhbmdlKGNvbnN0IENQVlRfU2VjUHJvcHMmIHNlY1Byb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyYgd29yZFByb3BzKSB7fQorCit2b2lkIENQV0xfRWRpdEN0cmw6OklPbkNvbnRlbnRDaGFuZ2UoY29uc3QgQ1BERl9SZWN0JiByY0NvbnRlbnQpIHsKKyAgaWYgKElzVmFsaWQoKSkgeworICAgIGlmIChtX3BFZGl0Tm90aWZ5KSB7CisgICAgICBtX3BFZGl0Tm90aWZ5LT5PbkNvbnRlbnRDaGFuZ2UocmNDb250ZW50KTsKKyAgICB9CisgIH0KIH0KIAotdm9pZCBDUFdMX0VkaXRDdHJsOjpVbmRvKCkKLXsKLQlpZiAoQ2FuVW5kbygpKQotCQltX3BFZGl0LT5VbmRvKCk7Cit2b2lkIENQV0xfRWRpdEN0cmw6OklPbkludmFsaWRhdGVSZWN0KENQREZfUmVjdCogcFJlY3QpIHsKKyAgSW52YWxpZGF0ZVJlY3QocFJlY3QpOwogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OklPblNldFNjcm9sbEluZm9ZKEZYX0ZMT0FUIGZQbGF0ZU1pbiwgRlhfRkxPQVQgZlBsYXRlTWF4LCAKLQkJCQkJCQkJCQkJCUZYX0ZMT0FUIGZDb250ZW50TWluLCBGWF9GTE9BVCBmQ29udGVudE1heCwgCi0JCQkJCQkJCQkJCQlGWF9GTE9BVCBmU21hbGxTdGVwLCBGWF9GTE9BVCBmQmlnU3RlcCkKLXsKLQlQV0xfU0NST0xMX0lORk8gSW5mbzsKLQotCUluZm8uZlBsYXRlV2lkdGggPSBmUGxhdGVNYXggLSBmUGxhdGVNaW47Ci0JSW5mby5mQ29udGVudE1pbiA9IGZDb250ZW50TWluOwotCUluZm8uZkNvbnRlbnRNYXggPSBmQ29udGVudE1heDsKLQlJbmZvLmZTbWFsbFN0ZXAgPSBmU21hbGxTdGVwOwotCUluZm8uZkJpZ1N0ZXAgPSBmQmlnU3RlcDsKLQotCXRoaXMtPk9uTm90aWZ5KHRoaXMsUE5NX1NFVFNDUk9MTElORk8sU0JUX1ZTQ1JPTEwsKEZYX0lOVFBUUikmSW5mbyk7Ci0KLS8vCVBXTF9UUkFDRSgic2V0IHNjcm9sbCBpbmZvOiVmXG4iLGZDb250ZW50TWF4IC0gZkNvbnRlbnRNaW4pOwotCi0JaWYgKElzRmxvYXRCaWdnZXIoSW5mby5mUGxhdGVXaWR0aCxJbmZvLmZDb250ZW50TWF4LUluZm8uZkNvbnRlbnRNaW4pCi0JCXx8IElzRmxvYXRFcXVhbChJbmZvLmZQbGF0ZVdpZHRoLEluZm8uZkNvbnRlbnRNYXgtSW5mby5mQ29udGVudE1pbikpCi0JewotCQl0aGlzLT5TaG93VlNjcm9sbEJhcihGQUxTRSk7CQkKLQl9Ci0JZWxzZQotCXsKLQkJdGhpcy0+U2hvd1ZTY3JvbGxCYXIoVFJVRSk7Ci0JfQoraW50MzJfdCBDUFdMX0VkaXRDdHJsOjpHZXRDaGFyU2V0KCkgY29uc3QgeworICByZXR1cm4gbV9uQ2hhclNldCA8IDAgPyBERUZBVUxUX0NIQVJTRVQgOiBtX25DaGFyU2V0OwogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OklPblNldFNjcm9sbFBvc1koRlhfRkxPQVQgZnkpCi17Ci0vLwlQV0xfVFJBQ0UoInNldCBzY3JvbGwgcG9zaXRpb246JWZcbiIsZnkpOwotCXRoaXMtPk9uTm90aWZ5KHRoaXMsUE5NX1NFVFNDUk9MTFBPUyxTQlRfVlNDUk9MTCwoRlhfSU5UUFRSKSZmeSk7Cit2b2lkIENQV0xfRWRpdEN0cmw6OkdldFRleHRSYW5nZShjb25zdCBDUERGX1JlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuU3RhcnRDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbkVuZENoYXIpIGNvbnN0IHsKKyAgblN0YXJ0Q2hhciA9IG1fcEVkaXQtPldvcmRQbGFjZVRvV29yZEluZGV4KAorICAgICAgbV9wRWRpdC0+U2VhcmNoV29yZFBsYWNlKENQREZfUG9pbnQocmVjdC5sZWZ0LCByZWN0LnRvcCkpKTsKKyAgbkVuZENoYXIgPSBtX3BFZGl0LT5Xb3JkUGxhY2VUb1dvcmRJbmRleCgKKyAgICAgIG1fcEVkaXQtPlNlYXJjaFdvcmRQbGFjZShDUERGX1BvaW50KHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKSkpOwogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OklPblNldENhcmV0KEZYX0JPT0wgYlZpc2libGUsIGNvbnN0IENQREZfUG9pbnQgJiBwdEhlYWQsIGNvbnN0IENQREZfUG9pbnQgJiBwdEZvb3QsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkKLXsKLQlQV0xfQ0FSRVRfSU5GTyBjSW5mbzsKLQljSW5mby5iVmlzaWJsZSA9IGJWaXNpYmxlOwotCWNJbmZvLnB0SGVhZCA9IHB0SGVhZDsKLQljSW5mby5wdEZvb3QgPSBwdEZvb3Q7Ci0KLQl0aGlzLT5Pbk5vdGlmeSh0aGlzLFBOTV9TRVRDQVJFVElORk8sKEZYX0lOVFBUUikmY0luZm8sKEZYX0lOVFBUUilOVUxMKTsKK0NGWF9XaWRlU3RyaW5nIENQV0xfRWRpdEN0cmw6OkdldFRleHQoaW50MzJfdCYgblN0YXJ0Q2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbkVuZENoYXIpIGNvbnN0IHsKKyAgQ1BWVF9Xb3JkUGxhY2Ugd3BTdGFydCA9IG1fcEVkaXQtPldvcmRJbmRleFRvV29yZFBsYWNlKG5TdGFydENoYXIpOworICBDUFZUX1dvcmRQbGFjZSB3cEVuZCA9IG1fcEVkaXQtPldvcmRJbmRleFRvV29yZFBsYWNlKG5FbmRDaGFyKTsKKyAgcmV0dXJuIG1fcEVkaXQtPkdldFJhbmdlVGV4dChDUFZUX1dvcmRSYW5nZSh3cFN0YXJ0LCB3cEVuZCkpOwogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OklPbkNhcmV0Q2hhbmdlKGNvbnN0IENQVlRfU2VjUHJvcHMgJiBzZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgJiB3b3JkUHJvcHMpCi17Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0Q3RybDo6SU9uQ29udGVudENoYW5nZShjb25zdCBDUERGX1JlY3QmIHJjQ29udGVudCkKLXsKLQlpZiAodGhpcy0+SXNWYWxpZCgpKQotCXsKLQkJaWYgKG1fcEVkaXROb3RpZnkpCi0JCXsKLQkJCW1fcEVkaXROb3RpZnktPk9uQ29udGVudENoYW5nZShyY0NvbnRlbnQpOwotCQl9Ci0JfQotfQotCi12b2lkIENQV0xfRWRpdEN0cmw6OklPbkludmFsaWRhdGVSZWN0KENQREZfUmVjdCAqIHBSZWN0KQotewotCXRoaXMtPkludmFsaWRhdGVSZWN0KHBSZWN0KTsKLX0KLQotRlhfSU5UMzIgQ1BXTF9FZGl0Q3RybDo6R2V0Q2hhclNldCgpIGNvbnN0Ci17Ci0JaWYgKG1fbkNoYXJTZXQgPCAwKQotCQlyZXR1cm4gREVGQVVMVF9DSEFSU0VUOyAKLQllbHNlCi0JCXJldHVybiBtX25DaGFyU2V0OwotfQotCi12b2lkIENQV0xfRWRpdEN0cmw6OkdldFRleHRSYW5nZShjb25zdCBDUERGX1JlY3QmIHJlY3QsIEZYX0lOVDMyICYgblN0YXJ0Q2hhciwgRlhfSU5UMzIgJiBuRW5kQ2hhcikgY29uc3QKLXsKLQluU3RhcnRDaGFyID0gbV9wRWRpdC0+V29yZFBsYWNlVG9Xb3JkSW5kZXgobV9wRWRpdC0+U2VhcmNoV29yZFBsYWNlKENQREZfUG9pbnQocmVjdC5sZWZ0LCByZWN0LnRvcCkpKTsKLQluRW5kQ2hhciA9IG1fcEVkaXQtPldvcmRQbGFjZVRvV29yZEluZGV4KG1fcEVkaXQtPlNlYXJjaFdvcmRQbGFjZShDUERGX1BvaW50KHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKSkpOwotfQotCi1DRlhfV2lkZVN0cmluZyBDUFdMX0VkaXRDdHJsOjpHZXRUZXh0KEZYX0lOVDMyICYgblN0YXJ0Q2hhciwgRlhfSU5UMzIgJiBuRW5kQ2hhcikgY29uc3QKLXsKLQlDUFZUX1dvcmRQbGFjZSB3cFN0YXJ0ID0gbV9wRWRpdC0+V29yZEluZGV4VG9Xb3JkUGxhY2UoblN0YXJ0Q2hhcik7Ci0JQ1BWVF9Xb3JkUGxhY2Ugd3BFbmQgPSBtX3BFZGl0LT5Xb3JkSW5kZXhUb1dvcmRQbGFjZShuRW5kQ2hhcik7Ci0JcmV0dXJuIG1fcEVkaXQtPkdldFJhbmdlVGV4dChDUFZUX1dvcmRSYW5nZSh3cFN0YXJ0LCB3cEVuZCkpOwotfQotCi12b2lkCUNQV0xfRWRpdEN0cmw6OlNldFJlYWR5VG9JbnB1dCgpCi17Ci0JaWYgKG1fYk1vdXNlRG93bikKLQl7Ci0JCVJlbGVhc2VDYXB0dXJlKCk7Ci0JCW1fYk1vdXNlRG93biA9IEZBTFNFOwotCX0KK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0UmVhZHlUb0lucHV0KCkgeworICBpZiAobV9iTW91c2VEb3duKSB7CisgICAgUmVsZWFzZUNhcHR1cmUoKTsKKyAgICBtX2JNb3VzZURvd24gPSBGQUxTRTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9Gb250TWFwLmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfRm9udE1hcC5jcHAKaW5kZXggNTc4NTExMy4uODlhNzViMiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9Gb250TWFwLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0ZvbnRNYXAuY3BwCkBAIC0xLDYwMSArMSw0OTggQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BERldpbmRvdy5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9XbmQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRm9udE1hcC5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ZvbnRNYXAuaCIKIAotI2RlZmluZSBERUZBVUxUX0ZPTlRfTkFNRQkJCSJIZWx2ZXRpY2EiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9tb2R1bGUuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9XbmQuaCIKIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfRm9udE1hcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK25hbWVzcGFjZSB7CiAKLUNQV0xfRm9udE1hcDo6Q1BXTF9Gb250TWFwKElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlcikgOiAJCi0JbV9wUERGRG9jKE5VTEwpLAotCW1fcFN5c3RlbUhhbmRsZXIocFN5c3RlbUhhbmRsZXIpCi17Ci0JQVNTRVJUKG1fcFN5c3RlbUhhbmRsZXIgIT0gTlVMTCk7Citjb25zdCBjaGFyIGtEZWZhdWx0Rm9udE5hbWVbXSA9ICJIZWx2ZXRpY2EiOworCitjb25zdCBjaGFyKiBjb25zdCBnX3NERVN0YW5kYXJkRm9udE5hbWVbXSA9IHsiQ291cmllciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291cmllci1Cb2xkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VyaWVyLUJvbGRPYmxpcXVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VyaWVyLU9ibGlxdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHZldGljYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsdmV0aWNhLUJvbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsdmV0aWNhLU9ibGlxdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRpbWVzLVJvbWFuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaW1lcy1Cb2xkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaW1lcy1JdGFsaWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRpbWVzLUJvbGRJdGFsaWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN5bWJvbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWmFwZkRpbmdiYXRzIn07CisKK30gIC8vIG5hbWVzcGFjZQorCitDUFdMX0ZvbnRNYXA6OkNQV0xfRm9udE1hcChJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpCisgICAgOiBtX3BQREZEb2MoTlVMTCksIG1fcFN5c3RlbUhhbmRsZXIocFN5c3RlbUhhbmRsZXIpIHsKKyAgQVNTRVJUKG1fcFN5c3RlbUhhbmRsZXIpOwogfQogCi1DUFdMX0ZvbnRNYXA6On5DUFdMX0ZvbnRNYXAoKQotewotCWlmIChtX3BQREZEb2MpCi0JewotCQlkZWxldGUgbV9wUERGRG9jOwotCQltX3BQREZEb2MgPSBOVUxMOwotCX0KK0NQV0xfRm9udE1hcDo6fkNQV0xfRm9udE1hcCgpIHsKKyAgZGVsZXRlIG1fcFBERkRvYzsKKyAgbV9wUERGRG9jID0gTlVMTDsKIAotCUVtcHR5KCk7CisgIEVtcHR5KCk7CiB9CiAKLXZvaWQgQ1BXTF9Gb250TWFwOjpTZXRTeXN0ZW1IYW5kbGVyKElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlcikKLXsKLQltX3BTeXN0ZW1IYW5kbGVyID0gcFN5c3RlbUhhbmRsZXI7Cit2b2lkIENQV0xfRm9udE1hcDo6U2V0U3lzdGVtSGFuZGxlcihJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpIHsKKyAgbV9wU3lzdGVtSGFuZGxlciA9IHBTeXN0ZW1IYW5kbGVyOwogfQogCi1DUERGX0RvY3VtZW50KiBDUFdMX0ZvbnRNYXA6OkdldERvY3VtZW50KCkKLXsKLQlpZiAoIW1fcFBERkRvYykKLQl7Ci0JCWlmIChDUERGX01vZHVsZU1ncjo6R2V0KCkpCi0JCXsKLQkJCW1fcFBERkRvYyA9IG5ldyBDUERGX0RvY3VtZW50OwotCQkJbV9wUERGRG9jLT5DcmVhdGVOZXdEb2MoKTsKLQkJfQotCX0KK0NQREZfRG9jdW1lbnQqIENQV0xfRm9udE1hcDo6R2V0RG9jdW1lbnQoKSB7CisgIGlmICghbV9wUERGRG9jKSB7CisgICAgaWYgKENQREZfTW9kdWxlTWdyOjpHZXQoKSkgeworICAgICAgbV9wUERGRG9jID0gbmV3IENQREZfRG9jdW1lbnQ7CisgICAgICBtX3BQREZEb2MtPkNyZWF0ZU5ld0RvYygpOworICAgIH0KKyAgfQogCi0JcmV0dXJuIG1fcFBERkRvYzsKKyAgcmV0dXJuIG1fcFBERkRvYzsKIH0KIAotQ1BERl9Gb250KiBDUFdMX0ZvbnRNYXA6OkdldFBERkZvbnQoRlhfSU5UMzIgbkZvbnRJbmRleCkKLXsKLQlpZiAobkZvbnRJbmRleCA+PTAgJiYgbkZvbnRJbmRleCA8IG1fYURhdGEuR2V0U2l6ZSgpKQotCXsKLQkJaWYgKENQV0xfRm9udE1hcF9EYXRhKiBwRGF0YSA9IG1fYURhdGEuR2V0QXQobkZvbnRJbmRleCkpCi0JCXsKLQkJCXJldHVybiBwRGF0YS0+cEZvbnQ7Ci0JCX0KLQl9CitDUERGX0ZvbnQqIENQV0xfRm9udE1hcDo6R2V0UERGRm9udChpbnQzMl90IG5Gb250SW5kZXgpIHsKKyAgaWYgKG5Gb250SW5kZXggPj0gMCAmJiBuRm9udEluZGV4IDwgbV9hRGF0YS5HZXRTaXplKCkpIHsKKyAgICBpZiAoQ1BXTF9Gb250TWFwX0RhdGEqIHBEYXRhID0gbV9hRGF0YS5HZXRBdChuRm9udEluZGV4KSkgeworICAgICAgcmV0dXJuIHBEYXRhLT5wRm9udDsKKyAgICB9CisgIH0KIAotCXJldHVybiBOVUxMOworICByZXR1cm4gTlVMTDsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9Gb250TWFwOjpHZXRQREZGb250QWxpYXMoRlhfSU5UMzIgbkZvbnRJbmRleCkKLXsKLQlpZiAobkZvbnRJbmRleCA+PTAgJiYgbkZvbnRJbmRleCA8IG1fYURhdGEuR2V0U2l6ZSgpKQotCXsKLQkJaWYgKENQV0xfRm9udE1hcF9EYXRhKiBwRGF0YSA9IG1fYURhdGEuR2V0QXQobkZvbnRJbmRleCkpCi0JCXsKLQkJCXJldHVybiBwRGF0YS0+c0ZvbnROYW1lOwotCQl9Ci0JfQorQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9Gb250TWFwOjpHZXRQREZGb250QWxpYXMoaW50MzJfdCBuRm9udEluZGV4KSB7CisgIGlmIChuRm9udEluZGV4ID49IDAgJiYgbkZvbnRJbmRleCA8IG1fYURhdGEuR2V0U2l6ZSgpKSB7CisgICAgaWYgKENQV0xfRm9udE1hcF9EYXRhKiBwRGF0YSA9IG1fYURhdGEuR2V0QXQobkZvbnRJbmRleCkpIHsKKyAgICAgIHJldHVybiBwRGF0YS0+c0ZvbnROYW1lOworICAgIH0KKyAgfQogCi0JcmV0dXJuICIiOworICByZXR1cm4gIiI7CiB9CiAKLUZYX0JPT0wgQ1BXTF9Gb250TWFwOjpLbm93V29yZChGWF9JTlQzMiBuRm9udEluZGV4LCBGWF9XT1JEIHdvcmQpCi17Ci0JaWYgKG5Gb250SW5kZXggPj0wICYmIG5Gb250SW5kZXggPCBtX2FEYXRhLkdldFNpemUoKSkKLQl7Ci0JCWlmIChtX2FEYXRhLkdldEF0KG5Gb250SW5kZXgpKQotCQl7CQotCQkJcmV0dXJuIENoYXJDb2RlRnJvbVVuaWNvZGUobkZvbnRJbmRleCwgd29yZCkgPj0gMDsKLQkJfQotCX0KK0ZYX0JPT0wgQ1BXTF9Gb250TWFwOjpLbm93V29yZChpbnQzMl90IG5Gb250SW5kZXgsIEZYX1dPUkQgd29yZCkgeworICBpZiAobkZvbnRJbmRleCA+PSAwICYmIG5Gb250SW5kZXggPCBtX2FEYXRhLkdldFNpemUoKSkgeworICAgIGlmIChtX2FEYXRhLkdldEF0KG5Gb250SW5kZXgpKSB7CisgICAgICByZXR1cm4gQ2hhckNvZGVGcm9tVW5pY29kZShuRm9udEluZGV4LCB3b3JkKSA+PSAwOworICAgIH0KKyAgfQogCi0JcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0lOVDMyIENQV0xfRm9udE1hcDo6R2V0V29yZEZvbnRJbmRleChGWF9XT1JEIHdvcmQsIEZYX0lOVDMyIG5DaGFyc2V0LCBGWF9JTlQzMiBuRm9udEluZGV4KQotewotCWlmIChuRm9udEluZGV4ID4gMCkKLQl7Ci0JCWlmIChLbm93V29yZChuRm9udEluZGV4LCB3b3JkKSkKLQkJCXJldHVybiBuRm9udEluZGV4OwotCX0KLQllbHNlCi0JewotCQlpZiAoY29uc3QgQ1BXTF9Gb250TWFwX0RhdGEqIHBEYXRhID0gR2V0Rm9udE1hcERhdGEoMCkpCi0JCXsKLQkJCWlmIChuQ2hhcnNldCA9PSBERUZBVUxUX0NIQVJTRVQgfHwgCi0JCQkJcERhdGEtPm5DaGFyc2V0ID09IFNZTUJPTF9DSEFSU0VUIHx8IAotCQkJCW5DaGFyc2V0ID09IHBEYXRhLT5uQ2hhcnNldCkKLQkJCXsKLQkJCQlpZiAoS25vd1dvcmQoMCwgd29yZCkpCi0JCQkJewotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CitpbnQzMl90IENQV0xfRm9udE1hcDo6R2V0V29yZEZvbnRJbmRleChGWF9XT1JEIHdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRm9udEluZGV4KSB7CisgIGlmIChuRm9udEluZGV4ID4gMCkgeworICAgIGlmIChLbm93V29yZChuRm9udEluZGV4LCB3b3JkKSkKKyAgICAgIHJldHVybiBuRm9udEluZGV4OworICB9IGVsc2UgeworICAgIGlmIChjb25zdCBDUFdMX0ZvbnRNYXBfRGF0YSogcERhdGEgPSBHZXRGb250TWFwRGF0YSgwKSkgeworICAgICAgaWYgKG5DaGFyc2V0ID09IERFRkFVTFRfQ0hBUlNFVCB8fCBwRGF0YS0+bkNoYXJzZXQgPT0gU1lNQk9MX0NIQVJTRVQgfHwKKyAgICAgICAgICBuQ2hhcnNldCA9PSBwRGF0YS0+bkNoYXJzZXQpIHsKKyAgICAgICAgaWYgKEtub3dXb3JkKDAsIHdvcmQpKQorICAgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKyAgfQogCi0JRlhfSU5UMzIgbk5ld0ZvbnRJbmRleCA9IC0xOwotCi0Jbk5ld0ZvbnRJbmRleCA9IHRoaXMtPkdldEZvbnRJbmRleChHZXROYXRpdmVGb250TmFtZShuQ2hhcnNldCksIG5DaGFyc2V0LCBUUlVFKTsKLQlpZiAobk5ld0ZvbnRJbmRleCA+PSAwKQotCXsKLQkJaWYgKEtub3dXb3JkKG5OZXdGb250SW5kZXgsIHdvcmQpKQotCQkJcmV0dXJuIG5OZXdGb250SW5kZXg7Ci0JfQotCi0Jbk5ld0ZvbnRJbmRleCA9IHRoaXMtPkdldEZvbnRJbmRleCgiQXJpYWwgVW5pY29kZSBNUyIsIERFRkFVTFRfQ0hBUlNFVCwgRkFMU0UpOwotCWlmIChuTmV3Rm9udEluZGV4ID49IDApCi0JewotCQlpZiAoS25vd1dvcmQobk5ld0ZvbnRJbmRleCwgd29yZCkpCi0JCXJldHVybiBuTmV3Rm9udEluZGV4OwotCX0KLQotCXJldHVybiAtMTsKKyAgaW50MzJfdCBuTmV3Rm9udEluZGV4ID0KKyAgICAgIEdldEZvbnRJbmRleChHZXROYXRpdmVGb250TmFtZShuQ2hhcnNldCksIG5DaGFyc2V0LCBUUlVFKTsKKyAgaWYgKG5OZXdGb250SW5kZXggPj0gMCkgeworICAgIGlmIChLbm93V29yZChuTmV3Rm9udEluZGV4LCB3b3JkKSkKKyAgICAgIHJldHVybiBuTmV3Rm9udEluZGV4OworICB9CisgIG5OZXdGb250SW5kZXggPSBHZXRGb250SW5kZXgoIkFyaWFsIFVuaWNvZGUgTVMiLCBERUZBVUxUX0NIQVJTRVQsIEZBTFNFKTsKKyAgaWYgKG5OZXdGb250SW5kZXggPj0gMCkgeworICAgIGlmIChLbm93V29yZChuTmV3Rm9udEluZGV4LCB3b3JkKSkKKyAgICAgIHJldHVybiBuTmV3Rm9udEluZGV4OworICB9CisgIHJldHVybiAtMTsKIH0KIAotRlhfSU5UMzIgQ1BXTF9Gb250TWFwOjpDaGFyQ29kZUZyb21Vbmljb2RlKEZYX0lOVDMyIG5Gb250SW5kZXgsIEZYX1dPUkQgd29yZCkKLXsKLQlpZiAoQ1BXTF9Gb250TWFwX0RhdGEqIHBEYXRhID0gbV9hRGF0YS5HZXRBdChuRm9udEluZGV4KSkKLQl7Ci0JCWlmIChwRGF0YS0+cEZvbnQpCi0JCXsKLQkJCWlmIChwRGF0YS0+cEZvbnQtPklzVW5pY29kZUNvbXBhdGlibGUoKSkKLQkJCXsKLQkJCQlpbnQgbkNoYXJDb2RlID0gcERhdGEtPnBGb250LT5DaGFyQ29kZUZyb21Vbmljb2RlKHdvcmQpOwotCQkJCXBEYXRhLT5wRm9udC0+R2x5cGhGcm9tQ2hhckNvZGUobkNoYXJDb2RlKTsKLQkJCQlyZXR1cm4gbkNoYXJDb2RlOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmICh3b3JkIDwgMHhGRikKLQkJCQkJcmV0dXJuIHdvcmQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gLTE7CitpbnQzMl90IENQV0xfRm9udE1hcDo6Q2hhckNvZGVGcm9tVW5pY29kZShpbnQzMl90IG5Gb250SW5kZXgsIEZYX1dPUkQgd29yZCkgeworICBpZiAoQ1BXTF9Gb250TWFwX0RhdGEqIHBEYXRhID0gbV9hRGF0YS5HZXRBdChuRm9udEluZGV4KSkgeworICAgIGlmIChwRGF0YS0+cEZvbnQpIHsKKyAgICAgIGlmIChwRGF0YS0+cEZvbnQtPklzVW5pY29kZUNvbXBhdGlibGUoKSkgeworICAgICAgICBpbnQgbkNoYXJDb2RlID0gcERhdGEtPnBGb250LT5DaGFyQ29kZUZyb21Vbmljb2RlKHdvcmQpOworICAgICAgICBwRGF0YS0+cEZvbnQtPkdseXBoRnJvbUNoYXJDb2RlKG5DaGFyQ29kZSk7CisgICAgICAgIHJldHVybiBuQ2hhckNvZGU7CisgICAgICB9CisgICAgICBpZiAod29yZCA8IDB4RkYpCisgICAgICAgIHJldHVybiB3b3JkOworICAgIH0KKyAgfQorICByZXR1cm4gLTE7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfRm9udE1hcDo6R2V0TmF0aXZlRm9udE5hbWUoRlhfSU5UMzIgbkNoYXJzZXQpCi17Ci0JLy9zZWFyY2hpbmcgbmF0aXZlIGZvbnQgaXMgc2xvdywgc28gd2UgbXVzdCBzYXZlIHRpbWUKLQlmb3IgKEZYX0lOVDMyIGk9MCxzej1tX2FOYXRpdmVGb250LkdldFNpemUoKTsgaTxzejsgaSsrKQotCXsKLQkJaWYgKENQV0xfRm9udE1hcF9OYXRpdmUqIHBEYXRhID0gbV9hTmF0aXZlRm9udC5HZXRBdChpKSkKLQkJewotCQkJaWYgKHBEYXRhLT5uQ2hhcnNldCA9PSBuQ2hhcnNldCkKLQkJCQlyZXR1cm4gcERhdGEtPnNGb250TmFtZTsKLQkJfQotCX0KK0NGWF9CeXRlU3RyaW5nIENQV0xfRm9udE1hcDo6R2V0TmF0aXZlRm9udE5hbWUoaW50MzJfdCBuQ2hhcnNldCkgeworICAvLyBzZWFyY2hpbmcgbmF0aXZlIGZvbnQgaXMgc2xvdywgc28gd2UgbXVzdCBzYXZlIHRpbWUKKyAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYU5hdGl2ZUZvbnQuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgIGlmIChDUFdMX0ZvbnRNYXBfTmF0aXZlKiBwRGF0YSA9IG1fYU5hdGl2ZUZvbnQuR2V0QXQoaSkpIHsKKyAgICAgIGlmIChwRGF0YS0+bkNoYXJzZXQgPT0gbkNoYXJzZXQpCisgICAgICAgIHJldHVybiBwRGF0YS0+c0ZvbnROYW1lOworICAgIH0KKyAgfQogCi0JQ0ZYX0J5dGVTdHJpbmcgc05ldyA9IEdldE5hdGl2ZUZvbnQobkNoYXJzZXQpOworICBDRlhfQnl0ZVN0cmluZyBzTmV3ID0gR2V0TmF0aXZlRm9udChuQ2hhcnNldCk7CiAKLQlpZiAoIXNOZXcuSXNFbXB0eSgpKQotCXsKLQkJQ1BXTF9Gb250TWFwX05hdGl2ZSogcE5ld0RhdGEgPSBuZXcgQ1BXTF9Gb250TWFwX05hdGl2ZTsKLQkJcE5ld0RhdGEtPm5DaGFyc2V0ID0gbkNoYXJzZXQ7Ci0JCXBOZXdEYXRhLT5zRm9udE5hbWUgPSBzTmV3OworICBpZiAoIXNOZXcuSXNFbXB0eSgpKSB7CisgICAgQ1BXTF9Gb250TWFwX05hdGl2ZSogcE5ld0RhdGEgPSBuZXcgQ1BXTF9Gb250TWFwX05hdGl2ZTsKKyAgICBwTmV3RGF0YS0+bkNoYXJzZXQgPSBuQ2hhcnNldDsKKyAgICBwTmV3RGF0YS0+c0ZvbnROYW1lID0gc05ldzsKIAotCQltX2FOYXRpdmVGb250LkFkZChwTmV3RGF0YSk7Ci0JfQorICAgIG1fYU5hdGl2ZUZvbnQuQWRkKHBOZXdEYXRhKTsKKyAgfQogCi0JcmV0dXJuIHNOZXc7CisgIHJldHVybiBzTmV3OwogfQogCi12b2lkIENQV0xfRm9udE1hcDo6RW1wdHkoKQotewotCXsKLQkJZm9yIChGWF9JTlQzMiBpPTAsIHN6PW1fYURhdGEuR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JCQlkZWxldGUgbV9hRGF0YS5HZXRBdChpKTsKK3ZvaWQgQ1BXTF9Gb250TWFwOjpFbXB0eSgpIHsKKyAgeworICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FEYXRhLkdldFNpemUoKTsgaSA8IHN6OyBpKyspCisgICAgICBkZWxldGUgbV9hRGF0YS5HZXRBdChpKTsKIAotCQltX2FEYXRhLlJlbW92ZUFsbCgpOwotCX0KLQl7Ci0JCWZvciAoRlhfSU5UMzIgaT0wLCBzej1tX2FOYXRpdmVGb250LkdldFNpemUoKTsgaTxzejsgaSsrKQotCQkJZGVsZXRlIG1fYU5hdGl2ZUZvbnQuR2V0QXQoaSk7CisgICAgbV9hRGF0YS5SZW1vdmVBbGwoKTsKKyAgfQorICB7CisgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYU5hdGl2ZUZvbnQuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKKyAgICAgIGRlbGV0ZSBtX2FOYXRpdmVGb250LkdldEF0KGkpOwogCi0JCW1fYU5hdGl2ZUZvbnQuUmVtb3ZlQWxsKCk7Ci0JfQorICAgIG1fYU5hdGl2ZUZvbnQuUmVtb3ZlQWxsKCk7CisgIH0KIH0KIAotdm9pZCBDUFdMX0ZvbnRNYXA6OkluaXRpYWwoRlhfTFBDU1RSIGZvbnRuYW1lKQotewotCUNGWF9CeXRlU3RyaW5nIHNGb250TmFtZSA9IGZvbnRuYW1lOwotCi0JaWYgKHNGb250TmFtZS5Jc0VtcHR5KCkpCi0JCXNGb250TmFtZSA9IERFRkFVTFRfRk9OVF9OQU1FOwotCi0JR2V0Rm9udEluZGV4KHNGb250TmFtZSwgQU5TSV9DSEFSU0VULCBGQUxTRSk7Ci0KLQkvL0dldEZvbnRJbmRleCh0aGlzLT5HZXROYXRpdmVGb250TmFtZShuQ2hhcnNldCksIG5DaGFyc2V0KTsKLX0KLQkKLQotLyoKLUxpc3Qgb2YgY3VycmVudGx5IHN1cHBvcnRlZCBzdGFuZGFyZCBmb250czoKLUNvdXJpZXIsIENvdXJpZXItQm9sZCwgQ291cmllci1Cb2xkT2JsaXF1ZSwgQ291cmllci1PYmxpcXVlCi1IZWx2ZXRpY2EsIEhlbHZldGljYS1Cb2xkLCBIZWx2ZXRpY2EtQm9sZE9ibGlxdWUsIEhlbHZldGljYS1PYmxpcXVlCi1UaW1lcy1Sb21hbiwgVGltZXMtQm9sZCwgVGltZXMtSXRhbGljLCBUaW1lcy1Cb2xkSXRhbGljCi1TeW1ib2wsIFphcGZEaW5nYmF0cwotKi8KLQotY29uc3QgY2hhciogZ19zREVTdGFuZGFyZEZvbnROYW1lW10gPSB7IkNvdXJpZXIiLCAiQ291cmllci1Cb2xkIiwgIkNvdXJpZXItQm9sZE9ibGlxdWUiLCAiQ291cmllci1PYmxpcXVlIiwKLQkiSGVsdmV0aWNhIiwgIkhlbHZldGljYS1Cb2xkIiwgIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIsICJIZWx2ZXRpY2EtT2JsaXF1ZSIsCi0JIlRpbWVzLVJvbWFuIiwgIlRpbWVzLUJvbGQiLCAiVGltZXMtSXRhbGljIiwgIlRpbWVzLUJvbGRJdGFsaWMiLAotCSJTeW1ib2wiLCAiWmFwZkRpbmdiYXRzIn07Ci0KLUZYX0JPT0wJQ1BXTF9Gb250TWFwOjpJc1N0YW5kYXJkRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lKQotewotCWZvciAoRlhfSU5UMzIgaT0wOyBpPDE0OyBpKyspCi0JewotCQlpZiAoc0ZvbnROYW1lID09IGdfc0RFU3RhbmRhcmRGb250TmFtZVtpXSkKLQkJCXJldHVybiBUUlVFOwotCX0KLQotCXJldHVybiBGQUxTRTsKK3ZvaWQgQ1BXTF9Gb250TWFwOjpJbml0aWFsaXplKCkgeworICBHZXRGb250SW5kZXgoa0RlZmF1bHRGb250TmFtZSwgQU5TSV9DSEFSU0VULCBGQUxTRSk7CiB9CiAKLUZYX0lOVDMyIENQV0xfRm9udE1hcDo6RmluZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwgRlhfSU5UMzIgbkNoYXJzZXQpCi17Ci0JZm9yIChGWF9JTlQzMiBpPTAsc3o9bV9hRGF0YS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQl7Ci0JCWlmIChDUFdMX0ZvbnRNYXBfRGF0YSogcERhdGEgPSBtX2FEYXRhLkdldEF0KGkpKQotCQl7Ci0JCQlpZiAobkNoYXJzZXQgPT0gREVGQVVMVF9DSEFSU0VUIHx8IG5DaGFyc2V0ID09IHBEYXRhLT5uQ2hhcnNldCkKLQkJCXsKLQkJCQlpZiAoc0ZvbnROYW1lLklzRW1wdHkoKSB8fCBwRGF0YS0+c0ZvbnROYW1lID09IHNGb250TmFtZSkKLQkJCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQl9CitGWF9CT09MIENQV0xfRm9udE1hcDo6SXNTdGFuZGFyZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSkgeworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoZ19zREVTdGFuZGFyZEZvbnROYW1lKTsgKytpKSB7CisgICAgaWYgKHNGb250TmFtZSA9PSBnX3NERVN0YW5kYXJkRm9udE5hbWVbaV0pCisgICAgICByZXR1cm4gVFJVRTsKKyAgfQogCi0JcmV0dXJuIC0xOworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0lOVDMyIENQV0xfRm9udE1hcDo6R2V0Rm9udEluZGV4KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsIEZYX0lOVDMyIG5DaGFyc2V0LCBGWF9CT09MIGJGaW5kKQotewotCUZYX0lOVDMyIG5Gb250SW5kZXggPSBGaW5kRm9udChFbmNvZGVGb250QWxpYXMoc0ZvbnROYW1lLCBuQ2hhcnNldCksIG5DaGFyc2V0KTsKLQlpZiAobkZvbnRJbmRleCA+PSAwKSByZXR1cm4gbkZvbnRJbmRleDsKK2ludDMyX3QgQ1BXTF9Gb250TWFwOjpGaW5kRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJzZXQpIHsKKyAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYURhdGEuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgIGlmIChDUFdMX0ZvbnRNYXBfRGF0YSogcERhdGEgPSBtX2FEYXRhLkdldEF0KGkpKSB7CisgICAgICBpZiAobkNoYXJzZXQgPT0gREVGQVVMVF9DSEFSU0VUIHx8IG5DaGFyc2V0ID09IHBEYXRhLT5uQ2hhcnNldCkgeworICAgICAgICBpZiAoc0ZvbnROYW1lLklzRW1wdHkoKSB8fCBwRGF0YS0+c0ZvbnROYW1lID09IHNGb250TmFtZSkKKyAgICAgICAgICByZXR1cm4gaTsKKyAgICAgIH0KKyAgICB9CisgIH0KIAotLy8JbkZvbnRJbmRleCA9IEZpbmRGb250KCIiLCBuQ2hhcnNldCk7Ci0vLwlpZiAobkZvbnRJbmRleCA+PSAwKSByZXR1cm4gbkZvbnRJbmRleDsKLQotCUNGWF9CeXRlU3RyaW5nIHNBbGlhczsKLQlDUERGX0ZvbnQqIHBGb250ID0gTlVMTDsKLQotCWlmIChiRmluZCkKLQkJcEZvbnQgPSBGaW5kRm9udFNhbWVDaGFyc2V0KHNBbGlhcywgbkNoYXJzZXQpOwotCi0JaWYgKCFwRm9udCkKLQl7Ci0JCUNGWF9CeXRlU3RyaW5nIHNUZW1wID0gc0ZvbnROYW1lOwotCQlwRm9udCA9IEFkZEZvbnRUb0RvY3VtZW50KEdldERvY3VtZW50KCksIHNUZW1wLCBuQ2hhcnNldCk7Ci0KLQkJLyoKLQkJaWYgKEZpbmRGb250KHNBbGlhcykpCi0JCXsKLQkJCXNBbGlhcyA9IEVuY29kZUZvbnRBbGlhcyhzVGVtcCwgbkNoYXJzZXQpOwotCQl9Ci0JCWVsc2UKLQkJKi8KLQkJewotCQkJc0FsaWFzID0gRW5jb2RlRm9udEFsaWFzKHNUZW1wLCBuQ2hhcnNldCk7Ci0JCX0JCQotCX0KLQotCUFkZGVkRm9udChwRm9udCwgc0FsaWFzKTsKLQotCXJldHVybiBBZGRGb250RGF0YShwRm9udCwgc0FsaWFzLCBuQ2hhcnNldCk7CisgIHJldHVybiAtMTsKIH0KIAotRlhfSU5UMzIgQ1BXTF9Gb250TWFwOjpHZXRQV0xGb250SW5kZXgoRlhfV09SRCB3b3JkLCBGWF9JTlQzMiBuQ2hhcnNldCkKLXsKLQlGWF9JTlQzMiBuRmluZCA9IC0xOworaW50MzJfdCBDUFdMX0ZvbnRNYXA6OkdldEZvbnRJbmRleChjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGaW5kKSB7CisgIGludDMyX3QgbkZvbnRJbmRleCA9IEZpbmRGb250KEVuY29kZUZvbnRBbGlhcyhzRm9udE5hbWUsIG5DaGFyc2V0KSwgbkNoYXJzZXQpOworICBpZiAobkZvbnRJbmRleCA+PSAwKQorICAgIHJldHVybiBuRm9udEluZGV4OwogCi0JZm9yIChGWF9JTlQzMiBpPTAsc3o9bV9hRGF0YS5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQl7Ci0JCWlmIChDUFdMX0ZvbnRNYXBfRGF0YSogcERhdGEgPSBtX2FEYXRhLkdldEF0KGkpKQotCQl7Ci0JCQlpZiAocERhdGEtPm5DaGFyc2V0ID09IG5DaGFyc2V0KQotCQkJewotCQkJCW5GaW5kID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KKyAgQ0ZYX0J5dGVTdHJpbmcgc0FsaWFzOworICBDUERGX0ZvbnQqIHBGb250ID0gTlVMTDsKKyAgaWYgKGJGaW5kKQorICAgIHBGb250ID0gRmluZEZvbnRTYW1lQ2hhcnNldChzQWxpYXMsIG5DaGFyc2V0KTsKIAotCUNQREZfRm9udCogcE5ld0ZvbnQgPSBHZXRQREZGb250KG5GaW5kKTsKLQotCWlmICghcE5ld0ZvbnQpIHJldHVybiAtMTsKLQotCS8qCi0JaWYgKENQREZfRm9udCogcEZvbnQgPSBHZXRQREZGb250KG5GaW5kKSkKLQl7Ci0JCVBXTEZvbnQuQWRkV29yZFRvRm9udERpY3QocEZvbnREaWN0LCB3b3JkKTsKLQl9Ci0JKi8KLQotCUNGWF9CeXRlU3RyaW5nIHNBbGlhcyA9IEVuY29kZUZvbnRBbGlhcygiQXJpYWxfQ2hyb21lIiwgbkNoYXJzZXQpOwotCUFkZGVkRm9udChwTmV3Rm9udCwgc0FsaWFzKTsKLQotCXJldHVybiBBZGRGb250RGF0YShwTmV3Rm9udCwgc0FsaWFzLCBuQ2hhcnNldCk7CisgIGlmICghcEZvbnQpIHsKKyAgICBDRlhfQnl0ZVN0cmluZyBzVGVtcCA9IHNGb250TmFtZTsKKyAgICBwRm9udCA9IEFkZEZvbnRUb0RvY3VtZW50KEdldERvY3VtZW50KCksIHNUZW1wLCBuQ2hhcnNldCk7CisgICAgc0FsaWFzID0gRW5jb2RlRm9udEFsaWFzKHNUZW1wLCBuQ2hhcnNldCk7CisgIH0KKyAgQWRkZWRGb250KHBGb250LCBzQWxpYXMpOworICByZXR1cm4gQWRkRm9udERhdGEocEZvbnQsIHNBbGlhcywgbkNoYXJzZXQpOwogfQogCi1DUERGX0ZvbnQqIENQV0xfRm9udE1hcDo6RmluZEZvbnRTYW1lQ2hhcnNldChDRlhfQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcywgRlhfSU5UMzIgbkNoYXJzZXQpCi17Ci0JcmV0dXJuIE5VTEw7CitpbnQzMl90IENQV0xfRm9udE1hcDo6R2V0UFdMRm9udEluZGV4KEZYX1dPUkQgd29yZCwgaW50MzJfdCBuQ2hhcnNldCkgeworICBpbnQzMl90IG5GaW5kID0gLTE7CisKKyAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYURhdGEuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgIGlmIChDUFdMX0ZvbnRNYXBfRGF0YSogcERhdGEgPSBtX2FEYXRhLkdldEF0KGkpKSB7CisgICAgICBpZiAocERhdGEtPm5DaGFyc2V0ID09IG5DaGFyc2V0KSB7CisgICAgICAgIG5GaW5kID0gaTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgQ1BERl9Gb250KiBwTmV3Rm9udCA9IEdldFBERkZvbnQobkZpbmQpOworCisgIGlmICghcE5ld0ZvbnQpCisgICAgcmV0dXJuIC0xOworCisgIENGWF9CeXRlU3RyaW5nIHNBbGlhcyA9IEVuY29kZUZvbnRBbGlhcygiQXJpYWxfQ2hyb21lIiwgbkNoYXJzZXQpOworICBBZGRlZEZvbnQocE5ld0ZvbnQsIHNBbGlhcyk7CisKKyAgcmV0dXJuIEFkZEZvbnREYXRhKHBOZXdGb250LCBzQWxpYXMsIG5DaGFyc2V0KTsKIH0KIAotRlhfSU5UMzIgQ1BXTF9Gb250TWFwOjpBZGRGb250RGF0YShDUERGX0ZvbnQqIHBGb250LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcywgRlhfSU5UMzIgbkNoYXJzZXQpCi17Ci0JQ1BXTF9Gb250TWFwX0RhdGEqIHBOZXdEYXRhID0gbmV3IENQV0xfRm9udE1hcF9EYXRhOwotCXBOZXdEYXRhLT5wRm9udCA9IHBGb250OwotCXBOZXdEYXRhLT5zRm9udE5hbWUgPSBzRm9udEFsaWFzOwotCXBOZXdEYXRhLT5uQ2hhcnNldCA9IG5DaGFyc2V0OwotCi0JbV9hRGF0YS5BZGQocE5ld0RhdGEpOwotCi0JcmV0dXJuIG1fYURhdGEuR2V0U2l6ZSgpIC0xOworQ1BERl9Gb250KiBDUFdMX0ZvbnRNYXA6OkZpbmRGb250U2FtZUNoYXJzZXQoQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DaGFyc2V0KSB7CisgIHJldHVybiBOVUxMOwogfQogCi12b2lkIENQV0xfRm9udE1hcDo6QWRkZWRGb250KENQREZfRm9udCogcEZvbnQsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udEFsaWFzKQoteworaW50MzJfdCBDUFdMX0ZvbnRNYXA6OkFkZEZvbnREYXRhKENQREZfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhcnNldCkgeworICBDUFdMX0ZvbnRNYXBfRGF0YSogcE5ld0RhdGEgPSBuZXcgQ1BXTF9Gb250TWFwX0RhdGE7CisgIHBOZXdEYXRhLT5wRm9udCA9IHBGb250OworICBwTmV3RGF0YS0+c0ZvbnROYW1lID0gc0ZvbnRBbGlhczsKKyAgcE5ld0RhdGEtPm5DaGFyc2V0ID0gbkNoYXJzZXQ7CisKKyAgbV9hRGF0YS5BZGQocE5ld0RhdGEpOworCisgIHJldHVybiBtX2FEYXRhLkdldFNpemUoKSAtIDE7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfRm9udE1hcDo6R2V0Rm9udE5hbWUoRlhfSU5UMzIgbkZvbnRJbmRleCkKLXsKLQlpZiAobkZvbnRJbmRleCA+PTAgJiYgbkZvbnRJbmRleCA8IG1fYURhdGEuR2V0U2l6ZSgpKQotCXsKLQkJaWYgKENQV0xfRm9udE1hcF9EYXRhKiBwRGF0YSA9IG1fYURhdGEuR2V0QXQobkZvbnRJbmRleCkpCi0JCXsKLQkJCXJldHVybiBwRGF0YS0+c0ZvbnROYW1lOwotCQl9Ci0JfQordm9pZCBDUFdMX0ZvbnRNYXA6OkFkZGVkRm9udChDUERGX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcykge30KIAotCXJldHVybiAiIjsKK0NGWF9CeXRlU3RyaW5nIENQV0xfRm9udE1hcDo6R2V0Rm9udE5hbWUoaW50MzJfdCBuRm9udEluZGV4KSB7CisgIGlmIChuRm9udEluZGV4ID49IDAgJiYgbkZvbnRJbmRleCA8IG1fYURhdGEuR2V0U2l6ZSgpKSB7CisgICAgaWYgKENQV0xfRm9udE1hcF9EYXRhKiBwRGF0YSA9IG1fYURhdGEuR2V0QXQobkZvbnRJbmRleCkpIHsKKyAgICAgIHJldHVybiBwRGF0YS0+c0ZvbnROYW1lOworICAgIH0KKyAgfQorCisgIHJldHVybiAiIjsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9Gb250TWFwOjpHZXROYXRpdmVGb250KEZYX0lOVDMyIG5DaGFyc2V0KQotewotCUNGWF9CeXRlU3RyaW5nIHNGb250TmFtZTsKK0NGWF9CeXRlU3RyaW5nIENQV0xfRm9udE1hcDo6R2V0TmF0aXZlRm9udChpbnQzMl90IG5DaGFyc2V0KSB7CisgIGlmIChuQ2hhcnNldCA9PSBERUZBVUxUX0NIQVJTRVQpCisgICAgbkNoYXJzZXQgPSBHZXROYXRpdmVDaGFyc2V0KCk7CiAKLQlpZiAobkNoYXJzZXQgPT0gREVGQVVMVF9DSEFSU0VUKQotCQluQ2hhcnNldCA9IEdldE5hdGl2ZUNoYXJzZXQoKTsKKyAgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnROYW1lID0gR2V0RGVmYXVsdEZvbnRCeUNoYXJzZXQobkNoYXJzZXQpOworICBpZiAobV9wU3lzdGVtSGFuZGxlcikgeworICAgIGlmIChtX3BTeXN0ZW1IYW5kbGVyLT5GaW5kTmF0aXZlVHJ1ZVR5cGVGb250KG5DaGFyc2V0LCBzRm9udE5hbWUpKQorICAgICAgcmV0dXJuIHNGb250TmFtZTsKIAotCXNGb250TmFtZSA9IEdldERlZmF1bHRGb250QnlDaGFyc2V0KG5DaGFyc2V0KTsKLQotCWlmIChtX3BTeXN0ZW1IYW5kbGVyKQotCXsKLQkJaWYgKG1fcFN5c3RlbUhhbmRsZXItPkZpbmROYXRpdmVUcnVlVHlwZUZvbnQobkNoYXJzZXQsIHNGb250TmFtZSkpCi0JCQlyZXR1cm4gc0ZvbnROYW1lOwotCi0JCXNGb250TmFtZSA9IG1fcFN5c3RlbUhhbmRsZXItPkdldE5hdGl2ZVRydWVUeXBlRm9udChuQ2hhcnNldCk7Ci0JfQotCi0JcmV0dXJuIHNGb250TmFtZTsKKyAgICBzRm9udE5hbWUgPSBtX3BTeXN0ZW1IYW5kbGVyLT5HZXROYXRpdmVUcnVlVHlwZUZvbnQobkNoYXJzZXQpOworICB9CisgIHJldHVybiBzRm9udE5hbWU7CiB9CiAKLUNQREZfRm9udCogQ1BXTF9Gb250TWFwOjpBZGRGb250VG9Eb2N1bWVudChDUERGX0RvY3VtZW50KiBwRG9jLCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lLCBGWF9CWVRFIG5DaGFyc2V0KQotewotCWlmIChJc1N0YW5kYXJkRm9udChzRm9udE5hbWUpKQotCQlyZXR1cm4gQWRkU3RhbmRhcmRGb250KHBEb2MsIHNGb250TmFtZSk7Ci0JZWxzZQotCQlyZXR1cm4gQWRkU3lzdGVtRm9udChwRG9jLCBzRm9udE5hbWUsIG5DaGFyc2V0KTsKK0NQREZfRm9udCogQ1BXTF9Gb250TWFwOjpBZGRGb250VG9Eb2N1bWVudChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBuQ2hhcnNldCkgeworICBpZiAoSXNTdGFuZGFyZEZvbnQoc0ZvbnROYW1lKSkKKyAgICByZXR1cm4gQWRkU3RhbmRhcmRGb250KHBEb2MsIHNGb250TmFtZSk7CisKKyAgcmV0dXJuIEFkZFN5c3RlbUZvbnQocERvYywgc0ZvbnROYW1lLCBuQ2hhcnNldCk7CiB9CiAKLUNQREZfRm9udCogQ1BXTF9Gb250TWFwOjpBZGRTdGFuZGFyZEZvbnQoQ1BERl9Eb2N1bWVudCogcERvYywgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSkKLXsKLQlpZiAoIXBEb2MpIHJldHVybiBOVUxMOworQ1BERl9Gb250KiBDUFdMX0ZvbnRNYXA6OkFkZFN0YW5kYXJkRm9udChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lKSB7CisgIGlmICghcERvYykKKyAgICByZXR1cm4gTlVMTDsKIAotCUNQREZfRm9udCogcEZvbnQgPSBOVUxMOworICBDUERGX0ZvbnQqIHBGb250ID0gTlVMTDsKIAotCWlmIChzRm9udE5hbWUgPT0gIlphcGZEaW5nYmF0cyIpCi0JCXBGb250ID0gcERvYy0+QWRkU3RhbmRhcmRGb250KHNGb250TmFtZSwgTlVMTCk7Ci0JZWxzZQotCXsKLQkJQ1BERl9Gb250RW5jb2RpbmcgZmUoUERGRk9OVF9FTkNPRElOR19XSU5BTlNJKTsKLQkJcEZvbnQgPSBwRG9jLT5BZGRTdGFuZGFyZEZvbnQoc0ZvbnROYW1lLCAmZmUpOwotCX0KKyAgaWYgKHNGb250TmFtZSA9PSAiWmFwZkRpbmdiYXRzIikgeworICAgIHBGb250ID0gcERvYy0+QWRkU3RhbmRhcmRGb250KHNGb250TmFtZSwgTlVMTCk7CisgIH0gZWxzZSB7CisgICAgQ1BERl9Gb250RW5jb2RpbmcgZmUoUERGRk9OVF9FTkNPRElOR19XSU5BTlNJKTsKKyAgICBwRm9udCA9IHBEb2MtPkFkZFN0YW5kYXJkRm9udChzRm9udE5hbWUsICZmZSk7CisgIH0KIAotCXJldHVybiBwRm9udDsKKyAgcmV0dXJuIHBGb250OwogfQogCi1DUERGX0ZvbnQqIENQV0xfRm9udE1hcDo6QWRkU3lzdGVtRm9udChDUERGX0RvY3VtZW50KiBwRG9jLCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lLCBGWF9CWVRFIG5DaGFyc2V0KQotewotCWlmICghcERvYykgcmV0dXJuIE5VTEw7CitDUERGX0ZvbnQqIENQV0xfRm9udE1hcDo6QWRkU3lzdGVtRm9udChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbkNoYXJzZXQpIHsKKyAgaWYgKCFwRG9jKQorICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHNGb250TmFtZS5Jc0VtcHR5KCkpIHNGb250TmFtZSA9IEdldE5hdGl2ZUZvbnQobkNoYXJzZXQpOwotCWlmIChuQ2hhcnNldCA9PSBERUZBVUxUX0NIQVJTRVQpIG5DaGFyc2V0ID0gR2V0TmF0aXZlQ2hhcnNldCgpOworICBpZiAoc0ZvbnROYW1lLklzRW1wdHkoKSkKKyAgICBzRm9udE5hbWUgPSBHZXROYXRpdmVGb250KG5DaGFyc2V0KTsKKyAgaWYgKG5DaGFyc2V0ID09IERFRkFVTFRfQ0hBUlNFVCkKKyAgICBuQ2hhcnNldCA9IEdldE5hdGl2ZUNoYXJzZXQoKTsKIAotCWlmIChtX3BTeXN0ZW1IYW5kbGVyKQotCQlyZXR1cm4gbV9wU3lzdGVtSGFuZGxlci0+QWRkTmF0aXZlVHJ1ZVR5cGVGb250VG9QREYocERvYywgc0ZvbnROYW1lLCBuQ2hhcnNldCk7Ci0JCi0JcmV0dXJuIE5VTEw7CisgIGlmIChtX3BTeXN0ZW1IYW5kbGVyKQorICAgIHJldHVybiBtX3BTeXN0ZW1IYW5kbGVyLT5BZGROYXRpdmVUcnVlVHlwZUZvbnRUb1BERihwRG9jLCBzRm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFyc2V0KTsKKworICByZXR1cm4gTlVMTDsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9Gb250TWFwOjpFbmNvZGVGb250QWxpYXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwgRlhfSU5UMzIgbkNoYXJzZXQpCi17Ci0JQ0ZYX0J5dGVTdHJpbmcgc1Bvc3RmaXg7Ci0Jc1Bvc3RmaXguRm9ybWF0KCJfJTAyWCIsIG5DaGFyc2V0KTsKLQlyZXR1cm4gRW5jb2RlRm9udEFsaWFzKHNGb250TmFtZSkgKyBzUG9zdGZpeDsKK0NGWF9CeXRlU3RyaW5nIENQV0xfRm9udE1hcDo6RW5jb2RlRm9udEFsaWFzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DaGFyc2V0KSB7CisgIENGWF9CeXRlU3RyaW5nIHNQb3N0Zml4OworICBzUG9zdGZpeC5Gb3JtYXQoIl8lMDJYIiwgbkNoYXJzZXQpOworICByZXR1cm4gRW5jb2RlRm9udEFsaWFzKHNGb250TmFtZSkgKyBzUG9zdGZpeDsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9Gb250TWFwOjpFbmNvZGVGb250QWxpYXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSkKLXsKLQlDRlhfQnl0ZVN0cmluZyBzUmV0ID0gc0ZvbnROYW1lOwotCXNSZXQuUmVtb3ZlKCcgJyk7Ci0JcmV0dXJuIHNSZXQ7CitDRlhfQnl0ZVN0cmluZyBDUFdMX0ZvbnRNYXA6OkVuY29kZUZvbnRBbGlhcyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lKSB7CisgIENGWF9CeXRlU3RyaW5nIHNSZXQgPSBzRm9udE5hbWU7CisgIHNSZXQuUmVtb3ZlKCcgJyk7CisgIHJldHVybiBzUmV0OwogfQogCi1GWF9JTlQzMiBDUFdMX0ZvbnRNYXA6OkdldEZvbnRNYXBDb3VudCgpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fYURhdGEuR2V0U2l6ZSgpOworaW50MzJfdCBDUFdMX0ZvbnRNYXA6OkdldEZvbnRNYXBDb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fYURhdGEuR2V0U2l6ZSgpOwogfQogCi1jb25zdCBDUFdMX0ZvbnRNYXBfRGF0YSogQ1BXTF9Gb250TWFwOjpHZXRGb250TWFwRGF0YShGWF9JTlQzMiBuSW5kZXgpIGNvbnN0Ci17Ci0JaWYgKG5JbmRleCA+PTAgJiYgbkluZGV4IDwgbV9hRGF0YS5HZXRTaXplKCkpCi0JewotCQlyZXR1cm4gbV9hRGF0YS5HZXRBdChuSW5kZXgpOwotCX0KK2NvbnN0IENQV0xfRm9udE1hcF9EYXRhKiBDUFdMX0ZvbnRNYXA6OkdldEZvbnRNYXBEYXRhKGludDMyX3QgbkluZGV4KSBjb25zdCB7CisgIGlmIChuSW5kZXggPj0gMCAmJiBuSW5kZXggPCBtX2FEYXRhLkdldFNpemUoKSkgeworICAgIHJldHVybiBtX2FEYXRhLkdldEF0KG5JbmRleCk7CisgIH0KIAotCXJldHVybiBOVUxMOworICByZXR1cm4gTlVMTDsKIH0KIAotRlhfSU5UMzIgQ1BXTF9Gb250TWFwOjpHZXROYXRpdmVDaGFyc2V0KCkKLXsKLQlGWF9CWVRFIG5DaGFyc2V0ID0gQU5TSV9DSEFSU0VUOwotCUZYX0lOVDMyIGlDb2RlUGFnZSA9IEZYU1lTX0dldEFDUCgpOwotCXN3aXRjaCAoaUNvZGVQYWdlKQotCXsKLQljYXNlIDkzMjovL0phcGFuCi0JCW5DaGFyc2V0ID0gU0hJRlRKSVNfQ0hBUlNFVDsKLQkJYnJlYWs7Ci0JY2FzZSA5MzY6Ly9DaGluZXNlIChQUkMsIFNpbmdhcG9yZSkKLQkJbkNoYXJzZXQgPSBHQjIzMTJfQ0hBUlNFVDsKLQkJYnJlYWs7Ci0JY2FzZSA5NTA6Ly9DaGluZXNlIChUYWl3YW47IEhvbmcgS29uZyBTQVIsIFBSQykKLQkJbkNoYXJzZXQgPSBHQjIzMTJfQ0hBUlNFVDsKLQkJYnJlYWs7Ci0JY2FzZSAxMjUyOi8vV2luZG93cyAzLjEgTGF0aW4gMSAoVVMsIFdlc3Rlcm4gRXVyb3BlKQotCQluQ2hhcnNldCA9IEFOU0lfQ0hBUlNFVDsKLQkJYnJlYWs7Ci0JY2FzZSA4NzQ6Ly9UaGFpCi0JCW5DaGFyc2V0ID0gVEhBSV9DSEFSU0VUOwotCQlicmVhazsKLQljYXNlIDk0OTovL0tvcmVhbgotCQluQ2hhcnNldCA9IEhBTkdVTF9DSEFSU0VUOwotCQlicmVhazsKLQljYXNlIDEyMDA6Ly9Vbmljb2RlIChCTVAgb2YgSVNPIDEwNjQ2KQotCQluQ2hhcnNldCA9IEFOU0lfQ0hBUlNFVDsKLQkJYnJlYWs7Ci0JY2FzZSAxMjUwOi8vV2luZG93cyAzLjEgRWFzdGVybiBFdXJvcGVhbgotCQluQ2hhcnNldCA9IEVBU1RFVVJPUEVfQ0hBUlNFVDsKLQkJYnJlYWs7Ci0JY2FzZSAxMjUxOi8vV2luZG93cyAzLjEgQ3lyaWxsaWMKLQkJbkNoYXJzZXQgPSBSVVNTSUFOX0NIQVJTRVQ7Ci0JCWJyZWFrOwotCWNhc2UgMTI1MzovL1dpbmRvd3MgMy4xIEdyZWVrCi0JCW5DaGFyc2V0ID0gR1JFRUtfQ0hBUlNFVDsKLQkJYnJlYWs7Ci0JY2FzZSAxMjU0Oi8vV2luZG93cyAzLjEgVHVya2lzaAotCQluQ2hhcnNldCA9IFRVUktJU0hfQ0hBUlNFVDsKLQkJYnJlYWs7Ci0JY2FzZSAxMjU1Oi8vSGVicmV3Ci0JCW5DaGFyc2V0ID0gSEVCUkVXX0NIQVJTRVQ7Ci0JCWJyZWFrOwotCWNhc2UgMTI1NjovL0FyYWJpYwotCQluQ2hhcnNldCA9IEFSQUJJQ19DSEFSU0VUOwotCQlicmVhazsKLQljYXNlIDEyNTc6Ly9CYWx0aWMKLQkJbkNoYXJzZXQgPSBCQUxUSUNfQ0hBUlNFVDsKLQkJYnJlYWs7Ci0JY2FzZSAxMjU4Oi8vVmlldG5hbWVzZQotCQluQ2hhcnNldCA9IFZJRVROQU1FU0VfQ0hBUlNFVDsKLQkJYnJlYWs7Ci0JY2FzZSAxMzYxOi8vS29yZWFuKEpvaGFiKQotCQluQ2hhcnNldCA9IEpPSEFCX0NIQVJTRVQ7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gbkNoYXJzZXQ7CitpbnQzMl90IENQV0xfRm9udE1hcDo6R2V0TmF0aXZlQ2hhcnNldCgpIHsKKyAgdWludDhfdCBuQ2hhcnNldCA9IEFOU0lfQ0hBUlNFVDsKKyAgaW50MzJfdCBpQ29kZVBhZ2UgPSBGWFNZU19HZXRBQ1AoKTsKKyAgc3dpdGNoIChpQ29kZVBhZ2UpIHsKKyAgICBjYXNlIDkzMjogIC8vIEphcGFuCisgICAgICBuQ2hhcnNldCA9IFNISUZUSklTX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDkzNjogIC8vIENoaW5lc2UgKFBSQywgU2luZ2Fwb3JlKQorICAgICAgbkNoYXJzZXQgPSBHQjIzMTJfQ0hBUlNFVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgOTUwOiAgLy8gQ2hpbmVzZSAoVGFpd2FuOyBIb25nIEtvbmcgU0FSLCBQUkMpCisgICAgICBuQ2hhcnNldCA9IEdCMjMxMl9DSEFSU0VUOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjUyOiAgLy8gV2luZG93cyAzLjEgTGF0aW4gMSAoVVMsIFdlc3Rlcm4gRXVyb3BlKQorICAgICAgbkNoYXJzZXQgPSBBTlNJX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg3NDogIC8vIFRoYWkKKyAgICAgIG5DaGFyc2V0ID0gVEhBSV9DSEFSU0VUOworICAgICAgYnJlYWs7CisgICAgY2FzZSA5NDk6ICAvLyBLb3JlYW4KKyAgICAgIG5DaGFyc2V0ID0gSEFOR1VMX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyMDA6ICAvLyBVbmljb2RlIChCTVAgb2YgSVNPIDEwNjQ2KQorICAgICAgbkNoYXJzZXQgPSBBTlNJX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyNTA6ICAvLyBXaW5kb3dzIDMuMSBFYXN0ZXJuIEV1cm9wZWFuCisgICAgICBuQ2hhcnNldCA9IEVBU1RFVVJPUEVfQ0hBUlNFVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTI1MTogIC8vIFdpbmRvd3MgMy4xIEN5cmlsbGljCisgICAgICBuQ2hhcnNldCA9IFJVU1NJQU5fQ0hBUlNFVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTI1MzogIC8vIFdpbmRvd3MgMy4xIEdyZWVrCisgICAgICBuQ2hhcnNldCA9IEdSRUVLX0NIQVJTRVQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyNTQ6ICAvLyBXaW5kb3dzIDMuMSBUdXJraXNoCisgICAgICBuQ2hhcnNldCA9IFRVUktJU0hfQ0hBUlNFVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTI1NTogIC8vIEhlYnJldworICAgICAgbkNoYXJzZXQgPSBIRUJSRVdfQ0hBUlNFVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTI1NjogIC8vIEFyYWJpYworICAgICAgbkNoYXJzZXQgPSBBUkFCSUNfQ0hBUlNFVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTI1NzogIC8vIEJhbHRpYworICAgICAgbkNoYXJzZXQgPSBCQUxUSUNfQ0hBUlNFVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTI1ODogIC8vIFZpZXRuYW1lc2UKKyAgICAgIG5DaGFyc2V0ID0gVklFVE5BTUVTRV9DSEFSU0VUOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMzYxOiAgLy8gS29yZWFuKEpvaGFiKQorICAgICAgbkNoYXJzZXQgPSBKT0hBQl9DSEFSU0VUOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIG5DaGFyc2V0OwogfQogCiBjb25zdCBDUFdMX0ZvbnRNYXA6OkNoYXJzZXRGb250TWFwIENQV0xfRm9udE1hcDo6ZGVmYXVsdFRURk1hcFtdID0gewotCXsgQU5TSV9DSEFSU0VULCAiSGVsdmV0aWNhIiB9LAotCXsgR0IyMzEyX0NIQVJTRVQsICJTaW1TdW4iIH0sCi0JeyBDSElORVNFQklHNV9DSEFSU0VULCAiTWluZ0xpVSIgfSwKLQl7IFNISUZUSklTX0NIQVJTRVQsICJNUyBHb3RoaWMiIH0sCi0JeyBIQU5HVUxfQ0hBUlNFVCwgIkJhdGFuZyIgfSwKLQl7IFJVU1NJQU5fQ0hBUlNFVCwgIkFyaWFsIiB9LAotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fTElOVVhfIHx8IF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0JeyBFQVNURVVST1BFX0NIQVJTRVQsICJBcmlhbCIgfSwKKyAgICB7QU5TSV9DSEFSU0VULCAiSGVsdmV0aWNhIn0sICAgICAge0dCMjMxMl9DSEFSU0VULCAiU2ltU3VuIn0sCisgICAge0NISU5FU0VCSUc1X0NIQVJTRVQsICJNaW5nTGlVIn0sIHtTSElGVEpJU19DSEFSU0VULCAiTVMgR290aGljIn0sCisgICAge0hBTkdVTF9DSEFSU0VULCAiQmF0YW5nIn0sICAgICAgIHtSVVNTSUFOX0NIQVJTRVQsICJBcmlhbCJ9LAorI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fTElOVVhfIHx8IFwKKyAgICBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworICAgIHtFQVNURVVST1BFX0NIQVJTRVQsICJBcmlhbCJ9LAogI2Vsc2UKLQl7IEVBU1RFVVJPUEVfQ0hBUlNFVCwgIlRhaG9tYSIgfSwKKyAgICB7RUFTVEVVUk9QRV9DSEFSU0VULCAiVGFob21hIn0sCiAjZW5kaWYKLQl7IEFSQUJJQ19DSEFSU0VULCAiQXJpYWwiIH0sCi0JeyAtMSwgTlVMTCB9Ci19OworICAgIHtBUkFCSUNfQ0hBUlNFVCwgIkFyaWFsIn0sICAgICAgICB7LTEsIE5VTEx9fTsKIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9Gb250TWFwOjpHZXREZWZhdWx0Rm9udEJ5Q2hhcnNldChGWF9JTlQzMiBuQ2hhcnNldCkKLXsKLQlpbnQgaSA9IDA7Ci0Jd2hpbGUgKGRlZmF1bHRUVEZNYXBbaV0uY2hhcnNldCAhPSAtMSkgewotCQlpZiAobkNoYXJzZXQgPT0gZGVmYXVsdFRURk1hcFtpXS5jaGFyc2V0KQotCQkJcmV0dXJuIGRlZmF1bHRUVEZNYXBbaV0uZm9udG5hbWU7Ci0gICAgICAgICsraTsKLQl9Ci0JcmV0dXJuICIiOworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9Gb250TWFwOjpHZXREZWZhdWx0Rm9udEJ5Q2hhcnNldChpbnQzMl90IG5DaGFyc2V0KSB7CisgIGludCBpID0gMDsKKyAgd2hpbGUgKGRlZmF1bHRUVEZNYXBbaV0uY2hhcnNldCAhPSAtMSkgeworICAgIGlmIChuQ2hhcnNldCA9PSBkZWZhdWx0VFRGTWFwW2ldLmNoYXJzZXQpCisgICAgICByZXR1cm4gZGVmYXVsdFRURk1hcFtpXS5mb250bmFtZTsKKyAgICArK2k7CisgIH0KKyAgcmV0dXJuICIiOwogfQogCi1GWF9JTlQzMiBDUFdMX0ZvbnRNYXA6OkNoYXJTZXRGcm9tVW5pY29kZShGWF9XT1JEIHdvcmQsIEZYX0lOVDMyIG5PbGRDaGFyc2V0KQotewotCWlmKG1fcFN5c3RlbUhhbmRsZXIgJiYgKC0xICE9IG1fcFN5c3RlbUhhbmRsZXItPkdldENoYXJTZXQoKSkpCi0JCXJldHVybiBtX3BTeXN0ZW1IYW5kbGVyLT5HZXRDaGFyU2V0KCk7Ci0JLy90byBhdm9pZCBDSksgRm9udCB0byBzaG93IEFTQ0lJCi0JaWYgKHdvcmQgPCAweDdGKSByZXR1cm4gQU5TSV9DSEFSU0VUOwotCS8vZm9sbG93IHRoZSBvbGQgY2hhcnNldAotCWlmIChuT2xkQ2hhcnNldCAhPSBERUZBVUxUX0NIQVJTRVQpIHJldHVybiBuT2xkQ2hhcnNldDsKK2ludDMyX3QgQ1BXTF9Gb250TWFwOjpDaGFyU2V0RnJvbVVuaWNvZGUoRlhfV09SRCB3b3JkLCBpbnQzMl90IG5PbGRDaGFyc2V0KSB7CisgIGlmIChtX3BTeXN0ZW1IYW5kbGVyICYmICgtMSAhPSBtX3BTeXN0ZW1IYW5kbGVyLT5HZXRDaGFyU2V0KCkpKQorICAgIHJldHVybiBtX3BTeXN0ZW1IYW5kbGVyLT5HZXRDaGFyU2V0KCk7CisgIC8vIHRvIGF2b2lkIENKSyBGb250IHRvIHNob3cgQVNDSUkKKyAgaWYgKHdvcmQgPCAweDdGKQorICAgIHJldHVybiBBTlNJX0NIQVJTRVQ7CisgIC8vIGZvbGxvdyB0aGUgb2xkIGNoYXJzZXQKKyAgaWYgKG5PbGRDaGFyc2V0ICE9IERFRkFVTFRfQ0hBUlNFVCkKKyAgICByZXR1cm4gbk9sZENoYXJzZXQ7CiAKLQkvL2ZpbmQgbmV3IGNoYXJzZXQKLQlpZiAoKHdvcmQgPj0gMHg0RTAwICYmIHdvcmQgPD0gMHg5RkE1KSB8fCAKLQkJKHdvcmQgPj0gMHhFN0M3ICYmIHdvcmQgPD0gMHhFN0YzKSB8fAotCQkod29yZCA+PSAweDMwMDAgJiYgd29yZCA8PSAweDMwM0YpIHx8IC8vo6kiobYiICKhtyIgIqGjIiAioaIiIAotCQkod29yZCA+PSAweDIwMDAgJiYgd29yZCA8PSAweDIwNkYpKQotCXsKLQkJcmV0dXJuIEdCMjMxMl9DSEFSU0VUOwotCX0KKyAgLy8gZmluZCBuZXcgY2hhcnNldAorICBpZiAoKHdvcmQgPj0gMHg0RTAwICYmIHdvcmQgPD0gMHg5RkE1KSB8fAorICAgICAgKHdvcmQgPj0gMHhFN0M3ICYmIHdvcmQgPD0gMHhFN0YzKSB8fAorICAgICAgKHdvcmQgPj0gMHgzMDAwICYmIHdvcmQgPD0gMHgzMDNGKSB8fAorICAgICAgKHdvcmQgPj0gMHgyMDAwICYmIHdvcmQgPD0gMHgyMDZGKSkgeworICAgIHJldHVybiBHQjIzMTJfQ0hBUlNFVDsKKyAgfQogCi0JaWYgKCgod29yZCA+PSAweDMwNDApICYmICh3b3JkIDw9IDB4MzA5RikpIHx8Ci0JCSgod29yZCA+PSAweDMwQTApICYmICh3b3JkIDw9IDB4MzBGRikpIHx8Ci0JCSgod29yZCA+PSAweDMxRjApICYmICh3b3JkIDw9IDB4MzFGRikpIHx8Ci0JCSgod29yZCA+PSAweEZGMDApICYmICh3b3JkIDw9IDB4RkZFRikpICkKLQl7Ci0JCXJldHVybiBTSElGVEpJU19DSEFSU0VUOwotCX0KKyAgaWYgKCgod29yZCA+PSAweDMwNDApICYmICh3b3JkIDw9IDB4MzA5RikpIHx8CisgICAgICAoKHdvcmQgPj0gMHgzMEEwKSAmJiAod29yZCA8PSAweDMwRkYpKSB8fAorICAgICAgKCh3b3JkID49IDB4MzFGMCkgJiYgKHdvcmQgPD0gMHgzMUZGKSkgfHwKKyAgICAgICgod29yZCA+PSAweEZGMDApICYmICh3b3JkIDw9IDB4RkZFRikpKSB7CisgICAgcmV0dXJuIFNISUZUSklTX0NIQVJTRVQ7CisgIH0KIAotCWlmICgoKHdvcmQgPj0gMHhBQzAwKSAmJiAod29yZCA8PSAweEQ3QUYpKSB8fAotCQkoKHdvcmQgPj0gMHgxMTAwKSAmJiAod29yZCA8PSAweDExRkYpKSB8fAotCQkoKHdvcmQgPj0gMHgzMTMwKSAmJiAod29yZCA8PSAweDMxOEYpKSkKLQl7Ci0JCXJldHVybiBIQU5HVUxfQ0hBUlNFVDsKLQl9CisgIGlmICgoKHdvcmQgPj0gMHhBQzAwKSAmJiAod29yZCA8PSAweEQ3QUYpKSB8fAorICAgICAgKCh3b3JkID49IDB4MTEwMCkgJiYgKHdvcmQgPD0gMHgxMUZGKSkgfHwKKyAgICAgICgod29yZCA+PSAweDMxMzApICYmICh3b3JkIDw9IDB4MzE4RikpKSB7CisgICAgcmV0dXJuIEhBTkdVTF9DSEFSU0VUOworICB9CiAKLQlpZiAod29yZCA+PSAweDBFMDAgJiYgd29yZCA8PSAweDBFN0YpCi0JCXJldHVybiBUSEFJX0NIQVJTRVQ7CisgIGlmICh3b3JkID49IDB4MEUwMCAmJiB3b3JkIDw9IDB4MEU3RikKKyAgICByZXR1cm4gVEhBSV9DSEFSU0VUOwogCi0JaWYgKCh3b3JkID49IDB4MDM3MCAmJiB3b3JkIDw9IDB4MDNGRikgfHwKLQkJKHdvcmQgPj0gMHgxRjAwICYmIHdvcmQgPD0gMHgxRkZGKSkKLQkJcmV0dXJuIEdSRUVLX0NIQVJTRVQ7CisgIGlmICgod29yZCA+PSAweDAzNzAgJiYgd29yZCA8PSAweDAzRkYpIHx8ICh3b3JkID49IDB4MUYwMCAmJiB3b3JkIDw9IDB4MUZGRikpCisgICAgcmV0dXJuIEdSRUVLX0NIQVJTRVQ7CiAKLQlpZiAoKHdvcmQgPj0gMHgwNjAwICYmIHdvcmQgPD0gMHgwNkZGKSB8fAotCQkod29yZCA+PSAweEZCNTAgJiYgd29yZCA8PSAweEZFRkMpKQotCQlyZXR1cm4gQVJBQklDX0NIQVJTRVQ7CisgIGlmICgod29yZCA+PSAweDA2MDAgJiYgd29yZCA8PSAweDA2RkYpIHx8ICh3b3JkID49IDB4RkI1MCAmJiB3b3JkIDw9IDB4RkVGQykpCisgICAgcmV0dXJuIEFSQUJJQ19DSEFSU0VUOwogCi0JaWYgKHdvcmQgPj0gMHgwNTkwICYmIHdvcmQgPD0gMHgwNUZGKQotCQlyZXR1cm4gSEVCUkVXX0NIQVJTRVQ7CisgIGlmICh3b3JkID49IDB4MDU5MCAmJiB3b3JkIDw9IDB4MDVGRikKKyAgICByZXR1cm4gSEVCUkVXX0NIQVJTRVQ7CiAKLQlpZiAod29yZCA+PSAweDA0MDAgJiYgd29yZCA8PSAweDA0RkYpCi0JCXJldHVybiBSVVNTSUFOX0NIQVJTRVQ7CisgIGlmICh3b3JkID49IDB4MDQwMCAmJiB3b3JkIDw9IDB4MDRGRikKKyAgICByZXR1cm4gUlVTU0lBTl9DSEFSU0VUOwogCi0JaWYgKHdvcmQgPj0gMHgwMTAwICYmIHdvcmQgPD0gMHgwMjRGKQotCQlyZXR1cm4gRUFTVEVVUk9QRV9DSEFSU0VUOworICBpZiAod29yZCA+PSAweDAxMDAgJiYgd29yZCA8PSAweDAyNEYpCisgICAgcmV0dXJuIEVBU1RFVVJPUEVfQ0hBUlNFVDsKIAotCWlmICh3b3JkID49IDB4MUUwMCAmJiB3b3JkIDw9IDB4MUVGRikKLQkJcmV0dXJuIFZJRVROQU1FU0VfQ0hBUlNFVDsKKyAgaWYgKHdvcmQgPj0gMHgxRTAwICYmIHdvcmQgPD0gMHgxRUZGKQorICAgIHJldHVybiBWSUVUTkFNRVNFX0NIQVJTRVQ7CiAKLQlyZXR1cm4gQU5TSV9DSEFSU0VUOworICByZXR1cm4gQU5TSV9DSEFSU0VUOwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9Eb2NGb250TWFwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworQ1BXTF9Eb2NGb250TWFwOjpDUFdMX0RvY0ZvbnRNYXAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcEF0dGFjaGVkRG9jKQorICAgIDogQ1BXTF9Gb250TWFwKHBTeXN0ZW1IYW5kbGVyKSwgbV9wQXR0YWNoZWREb2MocEF0dGFjaGVkRG9jKSB7fQogCi1DUFdMX0RvY0ZvbnRNYXA6OkNQV0xfRG9jRm9udE1hcChJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIsIENQREZfRG9jdW1lbnQqIHBBdHRhY2hlZERvYykgCi0JOiBDUFdMX0ZvbnRNYXAocFN5c3RlbUhhbmRsZXIpLAotCW1fcEF0dGFjaGVkRG9jKHBBdHRhY2hlZERvYykKLXsKLX0KK0NQV0xfRG9jRm9udE1hcDo6fkNQV0xfRG9jRm9udE1hcCgpIHt9CiAKLUNQV0xfRG9jRm9udE1hcDo6fkNQV0xfRG9jRm9udE1hcCgpCi17Ci19Ci0KLUNQREZfRG9jdW1lbnQqIENQV0xfRG9jRm9udE1hcDo6R2V0RG9jdW1lbnQoKQotewotCXJldHVybiBtX3BBdHRhY2hlZERvYzsKK0NQREZfRG9jdW1lbnQqIENQV0xfRG9jRm9udE1hcDo6R2V0RG9jdW1lbnQoKSB7CisgIHJldHVybiBtX3BBdHRhY2hlZERvYzsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfSWNvbi5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0ljb24uY3BwCmluZGV4IDVlM2U2ZTUuLjZhZmQ3NmMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfSWNvbi5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9JY29uLmNwcApAQCAtMSwyNzIgKzEsMjIyIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QREZXaW5kb3cuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfV25kLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ljb24uaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfVXRpbHMuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9JY29uLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfVXRpbHMuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9XbmQuaCIKIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0ltYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK0NQV0xfSW1hZ2U6OkNQV0xfSW1hZ2UoKSA6IG1fcFBERlN0cmVhbShOVUxMKSB7fQogCi1DUFdMX0ltYWdlOjpDUFdMX0ltYWdlKCkgOiBtX3BQREZTdHJlYW0oTlVMTCkKLXsKK0NQV0xfSW1hZ2U6On5DUFdMX0ltYWdlKCkge30KKworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9JbWFnZTo6R2V0SW1hZ2VBcHBTdHJlYW0oKSB7CisgIENGWF9CeXRlVGV4dEJ1ZiBzQXBwU3RyZWFtOworCisgIENGWF9CeXRlU3RyaW5nIHNBbGlhcyA9IEdldEltYWdlQWxpYXMoKTsKKyAgQ1BERl9SZWN0IHJjUGxhdGUgPSBHZXRDbGllbnRSZWN0KCk7CisgIENGWF9NYXRyaXggbXQ7CisgIG10LlNldFJldmVyc2UoR2V0SW1hZ2VNYXRyaXgoKSk7CisKKyAgRlhfRkxPQVQgZkhTY2FsZSA9IDEuMGY7CisgIEZYX0ZMT0FUIGZWU2NhbGUgPSAxLjBmOworICBHZXRTY2FsZShmSFNjYWxlLCBmVlNjYWxlKTsKKworICBGWF9GTE9BVCBmeCA9IDAuMGY7CisgIEZYX0ZMT0FUIGZ5ID0gMC4wZjsKKyAgR2V0SW1hZ2VPZmZzZXQoZngsIGZ5KTsKKworICBpZiAobV9wUERGU3RyZWFtICYmIHNBbGlhcy5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICBzQXBwU3RyZWFtIDw8ICJxXG4iOworICAgIHNBcHBTdHJlYW0gPDwgcmNQbGF0ZS5sZWZ0IDw8ICIgIiA8PCByY1BsYXRlLmJvdHRvbSA8PCAiICIKKyAgICAgICAgICAgICAgIDw8IHJjUGxhdGUucmlnaHQgLSByY1BsYXRlLmxlZnQgPDwgIiAiCisgICAgICAgICAgICAgICA8PCByY1BsYXRlLnRvcCAtIHJjUGxhdGUuYm90dG9tIDw8ICIgcmUgVyBuXG4iOworCisgICAgc0FwcFN0cmVhbSA8PCBmSFNjYWxlIDw8ICIgMCAwICIgPDwgZlZTY2FsZSA8PCAiICIgPDwgcmNQbGF0ZS5sZWZ0ICsgZngKKyAgICAgICAgICAgICAgIDw8ICIgIiA8PCByY1BsYXRlLmJvdHRvbSArIGZ5IDw8ICIgY21cbiI7CisgICAgc0FwcFN0cmVhbSA8PCBtdC5HZXRBKCkgPDwgIiAiIDw8IG10LkdldEIoKSA8PCAiICIgPDwgbXQuR2V0QygpIDw8ICIgIgorICAgICAgICAgICAgICAgPDwgbXQuR2V0RCgpIDw8ICIgIiA8PCBtdC5HZXRFKCkgPDwgIiAiIDw8IG10LkdldEYoKSA8PCAiIGNtXG4iOworCisgICAgc0FwcFN0cmVhbSA8PCAiMCBnIDAgRyAxIHcgLyIgPDwgc0FsaWFzIDw8ICIgRG9cbiIKKyAgICAgICAgICAgICAgIDw8ICJRXG4iOworICB9CisKKyAgcmV0dXJuIHNBcHBTdHJlYW0uR2V0Qnl0ZVN0cmluZygpOwogfQogCi1DUFdMX0ltYWdlOjp+Q1BXTF9JbWFnZSgpCi17Cit2b2lkIENQV0xfSW1hZ2U6OlNldFBERlN0cmVhbShDUERGX1N0cmVhbSogcFN0cmVhbSkgeworICBtX3BQREZTdHJlYW0gPSBwU3RyZWFtOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUFdMX0ltYWdlOjpHZXRJbWFnZUFwcFN0cmVhbSgpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07Ci0KLQlDRlhfQnl0ZVN0cmluZyBzQWxpYXMgPSB0aGlzLT5HZXRJbWFnZUFsaWFzKCk7Ci0JQ1BERl9SZWN0IHJjUGxhdGUgPSBHZXRDbGllbnRSZWN0KCk7Ci0JQ1BERl9NYXRyaXggbXQ7Ci0JbXQuU2V0UmV2ZXJzZShHZXRJbWFnZU1hdHJpeCgpKTsKLQotCUZYX0ZMT0FUIGZIU2NhbGUgPSAxLjBmOwotCUZYX0ZMT0FUIGZWU2NhbGUgPSAxLjBmOwotCUdldFNjYWxlKGZIU2NhbGUsZlZTY2FsZSk7Ci0KLQlGWF9GTE9BVCBmeCA9IDAuMGY7Ci0JRlhfRkxPQVQgZnkgPSAwLjBmOwotCUdldEltYWdlT2Zmc2V0KGZ4LGZ5KTsKLQotCWlmIChtX3BQREZTdHJlYW0gJiYgc0FsaWFzLkdldExlbmd0aCgpPjApCi0JewotCQlzQXBwU3RyZWFtIDw8ICJxXG4iOwotCQlzQXBwU3RyZWFtIDw8IHJjUGxhdGUubGVmdCA8PCAiICIgPDwgcmNQbGF0ZS5ib3R0b20gPDwgIiAiCi0JCQk8PCByY1BsYXRlLnJpZ2h0IC0gcmNQbGF0ZS5sZWZ0IDw8ICIgIiA8PCByY1BsYXRlLnRvcCAtIHJjUGxhdGUuYm90dG9tIDw8ICIgcmUgVyBuXG4iOwotCi0JCXNBcHBTdHJlYW0gPDwgZkhTY2FsZSA8PCAiIDAgMCAiIDw8IGZWU2NhbGUgPDwgIiAiIDw8IHJjUGxhdGUubGVmdCArIGZ4IDw8ICIgIiA8PCByY1BsYXRlLmJvdHRvbSArIGZ5IDw8ICIgY21cbiI7Ci0JCXNBcHBTdHJlYW0gPDwgbXQuR2V0QSgpIDw8ICIgIiA8PCBtdC5HZXRCKCkgPDwgIiAiIDw8IG10LkdldEMoKSA8PCAiICIgPDwgbXQuR2V0RCgpIDw8ICIgIiA8PCBtdC5HZXRFKCkgPDwgIiAiIDw8IG10LkdldEYoKSA8PCAiIGNtXG4iOwotCi0JCXNBcHBTdHJlYW0gPDwgIjAgZyAwIEcgMSB3IC8iIDw8IHNBbGlhcyA8PCAiIERvXG4iIDw8ICJRXG4iOwotCX0KLQotCXJldHVybiBzQXBwU3RyZWFtLkdldEJ5dGVTdHJpbmcoKTsKK0NQREZfU3RyZWFtKiBDUFdMX0ltYWdlOjpHZXRQREZTdHJlYW0oKSB7CisgIHJldHVybiBtX3BQREZTdHJlYW07CiB9CiAKLXZvaWQgQ1BXTF9JbWFnZTo6U2V0UERGU3RyZWFtKENQREZfU3RyZWFtICogcFN0cmVhbSkKLXsKLQltX3BQREZTdHJlYW0gPSBwU3RyZWFtOwordm9pZCBDUFdMX0ltYWdlOjpHZXRJbWFnZVNpemUoRlhfRkxPQVQmIGZXaWR0aCwgRlhfRkxPQVQmIGZIZWlnaHQpIHsKKyAgZldpZHRoID0gMC4wZjsKKyAgZkhlaWdodCA9IDAuMGY7CisKKyAgaWYgKG1fcFBERlN0cmVhbSkgeworICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wUERGU3RyZWFtLT5HZXREaWN0KCkpIHsKKyAgICAgIENQREZfUmVjdCByZWN0ID0gcERpY3QtPkdldFJlY3QoIkJCb3giKTsKKworICAgICAgZldpZHRoID0gcmVjdC5yaWdodCAtIHJlY3QubGVmdDsKKyAgICAgIGZIZWlnaHQgPSByZWN0LnRvcCAtIHJlY3QuYm90dG9tOworICAgIH0KKyAgfQogfQogCi1DUERGX1N0cmVhbSAqIENQV0xfSW1hZ2U6OkdldFBERlN0cmVhbSgpCi17Ci0JcmV0dXJuIHRoaXMtPm1fcFBERlN0cmVhbTsKK0NGWF9NYXRyaXggQ1BXTF9JbWFnZTo6R2V0SW1hZ2VNYXRyaXgoKSB7CisgIGlmIChtX3BQREZTdHJlYW0pIHsKKyAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcFBERlN0cmVhbS0+R2V0RGljdCgpKSB7CisgICAgICByZXR1cm4gcERpY3QtPkdldE1hdHJpeCgiTWF0cml4Iik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIENGWF9NYXRyaXgoKTsKIH0KIAotdm9pZCBDUFdMX0ltYWdlOjpHZXRJbWFnZVNpemUoRlhfRkxPQVQgJiBmV2lkdGgsRlhfRkxPQVQgJiBmSGVpZ2h0KQotewotCWZXaWR0aCA9IDAuMGY7Ci0JZkhlaWdodCA9IDAuMGY7CitDRlhfQnl0ZVN0cmluZyBDUFdMX0ltYWdlOjpHZXRJbWFnZUFsaWFzKCkgeworICBpZiAoIW1fc0ltYWdlQWxpYXMuSXNFbXB0eSgpKQorICAgIHJldHVybiBtX3NJbWFnZUFsaWFzOwogCi0JaWYgKG1fcFBERlN0cmVhbSkKLQl7Ci0JCWlmIChDUERGX0RpY3Rpb25hcnkgKiBwRGljdCA9IG1fcFBERlN0cmVhbS0+R2V0RGljdCgpKQotCQl7Ci0JCQlDUERGX1JlY3QgcmVjdCA9IHBEaWN0LT5HZXRSZWN0KCJCQm94Iik7CisgIGlmIChtX3BQREZTdHJlYW0pIHsKKyAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcFBERlN0cmVhbS0+R2V0RGljdCgpKSB7CisgICAgICByZXR1cm4gcERpY3QtPkdldFN0cmluZygiTmFtZSIpOworICAgIH0KKyAgfQogCi0JCQlmV2lkdGggPSByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0OwotCQkJZkhlaWdodCA9IHJlY3QudG9wIC0gcmVjdC5ib3R0b207Ci0JCX0KLQl9CisgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwogfQogCi1DUERGX01hdHJpeAlDUFdMX0ltYWdlOjpHZXRJbWFnZU1hdHJpeCgpCi17Ci0JaWYgKG1fcFBERlN0cmVhbSkKLQl7Ci0JCWlmIChDUERGX0RpY3Rpb25hcnkgKiBwRGljdCA9IG1fcFBERlN0cmVhbS0+R2V0RGljdCgpKQotCQl7Ci0JCQlyZXR1cm4gcERpY3QtPkdldE1hdHJpeCgiTWF0cml4Iik7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gQ1BERl9NYXRyaXgoKTsKK3ZvaWQgQ1BXTF9JbWFnZTo6U2V0SW1hZ2VBbGlhcyhjb25zdCBGWF9DSEFSKiBzSW1hZ2VBbGlhcykgeworICBtX3NJbWFnZUFsaWFzID0gc0ltYWdlQWxpYXM7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfSW1hZ2U6OkdldEltYWdlQWxpYXMoKQotewotCWlmIChtX3NJbWFnZUFsaWFzLklzRW1wdHkoKSkKLQl7Ci0JCWlmIChtX3BQREZTdHJlYW0pCi0JCXsKLQkJCWlmIChDUERGX0RpY3Rpb25hcnkgKiBwRGljdCA9IG1fcFBERlN0cmVhbS0+R2V0RGljdCgpKQkJCi0JCQl7Ci0JCQkJcmV0dXJuIHBEaWN0LT5HZXRTdHJpbmcoIk5hbWUiKTsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JCXJldHVybiBtX3NJbWFnZUFsaWFzOwotCi0JcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Cit2b2lkIENQV0xfSW1hZ2U6OkdldFNjYWxlKEZYX0ZMT0FUJiBmSFNjYWxlLCBGWF9GTE9BVCYgZlZTY2FsZSkgeworICBmSFNjYWxlID0gMS4wZjsKKyAgZlZTY2FsZSA9IDEuMGY7CiB9CiAKLXZvaWQgQ1BXTF9JbWFnZTo6U2V0SW1hZ2VBbGlhcyhGWF9MUENTVFIgc0ltYWdlQWxpYXMpCi17Ci0JbV9zSW1hZ2VBbGlhcyA9IHNJbWFnZUFsaWFzOwordm9pZCBDUFdMX0ltYWdlOjpHZXRJbWFnZU9mZnNldChGWF9GTE9BVCYgeCwgRlhfRkxPQVQmIHkpIHsKKyAgeCA9IDAuMGY7CisgIHkgPSAwLjBmOwogfQogCi12b2lkIENQV0xfSW1hZ2U6OkdldFNjYWxlKEZYX0ZMT0FUICYgZkhTY2FsZSxGWF9GTE9BVCAmIGZWU2NhbGUpCi17Ci0JZkhTY2FsZSA9IDEuMGY7Ci0JZlZTY2FsZSA9IDEuMGY7CitDUFdMX0ljb246OkNQV0xfSWNvbigpIDogbV9wSWNvbkZpdChOVUxMKSB7fQorCitDUFdMX0ljb246On5DUFdMX0ljb24oKSB7fQorCitpbnQzMl90IENQV0xfSWNvbjo6R2V0U2NhbGVNZXRob2QoKSB7CisgIGlmIChtX3BJY29uRml0KQorICAgIHJldHVybiBtX3BJY29uRml0LT5HZXRTY2FsZU1ldGhvZCgpOworCisgIHJldHVybiAwOwogfQogCitGWF9CT09MIENQV0xfSWNvbjo6SXNQcm9wb3J0aW9uYWxTY2FsZSgpIHsKKyAgaWYgKG1fcEljb25GaXQpCisgICAgcmV0dXJuIG1fcEljb25GaXQtPklzUHJvcG9ydGlvbmFsU2NhbGUoKTsKIAotdm9pZCBDUFdMX0ltYWdlOjpHZXRJbWFnZU9mZnNldChGWF9GTE9BVCAmIHgsRlhfRkxPQVQgJiB5KQotewotCXggPSAwLjBmOwotCXkgPSAwLjBmOworICByZXR1cm4gRkFMU0U7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9JY29uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotQ1BXTF9JY29uOjpDUFdMX0ljb24oKSA6IG1fcEljb25GaXQoTlVMTCkKLXsKK3ZvaWQgQ1BXTF9JY29uOjpHZXRJY29uUG9zaXRpb24oRlhfRkxPQVQmIGZMZWZ0LCBGWF9GTE9BVCYgZkJvdHRvbSkgeworICBpZiAobV9wSWNvbkZpdCkgeworICAgIGZMZWZ0ID0gMC4wZjsKKyAgICBmQm90dG9tID0gMC4wZjsKKyAgICBDUERGX0FycmF5KiBwQSA9CisgICAgICAgIG1fcEljb25GaXQtPm1fcERpY3QgPyBtX3BJY29uRml0LT5tX3BEaWN0LT5HZXRBcnJheSgiQSIpIDogTlVMTDsKKyAgICBpZiAocEEpIHsKKyAgICAgIEZYX0RXT1JEIGR3Q291bnQgPSBwQS0+R2V0Q291bnQoKTsKKyAgICAgIGlmIChkd0NvdW50ID4gMCkKKyAgICAgICAgZkxlZnQgPSBwQS0+R2V0TnVtYmVyKDApOworICAgICAgaWYgKGR3Q291bnQgPiAxKQorICAgICAgICBmQm90dG9tID0gcEEtPkdldE51bWJlcigxKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZkxlZnQgPSAwLjBmOworICAgIGZCb3R0b20gPSAwLjBmOworICB9CiB9CiAKLUNQV0xfSWNvbjo6fkNQV0xfSWNvbigpCi17CitGWF9CT09MIENQV0xfSWNvbjo6R2V0Rml0dGluZ0JvdW5kcygpIHsKKyAgaWYgKG1fcEljb25GaXQpCisgICAgcmV0dXJuIG1fcEljb25GaXQtPkdldEZpdHRpbmdCb3VuZHMoKTsKKworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0lOVDMyIENQV0xfSWNvbjo6R2V0U2NhbGVNZXRob2QoKQotewotCWlmIChtX3BJY29uRml0KQotCQlyZXR1cm4gbV9wSWNvbkZpdC0+R2V0U2NhbGVNZXRob2QoKTsKK3ZvaWQgQ1BXTF9JY29uOjpHZXRTY2FsZShGWF9GTE9BVCYgZkhTY2FsZSwgRlhfRkxPQVQmIGZWU2NhbGUpIHsKKyAgZkhTY2FsZSA9IDEuMGY7CisgIGZWU2NhbGUgPSAxLjBmOwogCi0JcmV0dXJuIDA7CisgIGlmIChtX3BQREZTdHJlYW0pIHsKKyAgICBGWF9GTE9BVCBmSW1hZ2VXaWR0aCwgZkltYWdlSGVpZ2h0OworICAgIEZYX0ZMT0FUIGZQbGF0ZVdpZHRoLCBmUGxhdGVIZWlnaHQ7CisKKyAgICBDUERGX1JlY3QgcmNQbGF0ZSA9IEdldENsaWVudFJlY3QoKTsKKyAgICBmUGxhdGVXaWR0aCA9IHJjUGxhdGUucmlnaHQgLSByY1BsYXRlLmxlZnQ7CisgICAgZlBsYXRlSGVpZ2h0ID0gcmNQbGF0ZS50b3AgLSByY1BsYXRlLmJvdHRvbTsKKworICAgIEdldEltYWdlU2l6ZShmSW1hZ2VXaWR0aCwgZkltYWdlSGVpZ2h0KTsKKworICAgIGludDMyX3QgblNjYWxlTWV0aG9kID0gR2V0U2NhbGVNZXRob2QoKTsKKworICAgIHN3aXRjaCAoblNjYWxlTWV0aG9kKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgY2FzZSAwOgorICAgICAgICBmSFNjYWxlID0gZlBsYXRlV2lkdGggLyBQV0xfTUFYKGZJbWFnZVdpZHRoLCAxLjBmKTsKKyAgICAgICAgZlZTY2FsZSA9IGZQbGF0ZUhlaWdodCAvIFBXTF9NQVgoZkltYWdlSGVpZ2h0LCAxLjBmKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE6CisgICAgICAgIGlmIChmUGxhdGVXaWR0aCA8IGZJbWFnZVdpZHRoKQorICAgICAgICAgIGZIU2NhbGUgPSBmUGxhdGVXaWR0aCAvIFBXTF9NQVgoZkltYWdlV2lkdGgsIDEuMGYpOworICAgICAgICBpZiAoZlBsYXRlSGVpZ2h0IDwgZkltYWdlSGVpZ2h0KQorICAgICAgICAgIGZWU2NhbGUgPSBmUGxhdGVIZWlnaHQgLyBQV0xfTUFYKGZJbWFnZUhlaWdodCwgMS4wZik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICBpZiAoZlBsYXRlV2lkdGggPiBmSW1hZ2VXaWR0aCkKKyAgICAgICAgICBmSFNjYWxlID0gZlBsYXRlV2lkdGggLyBQV0xfTUFYKGZJbWFnZVdpZHRoLCAxLjBmKTsKKyAgICAgICAgaWYgKGZQbGF0ZUhlaWdodCA+IGZJbWFnZUhlaWdodCkKKyAgICAgICAgICBmVlNjYWxlID0gZlBsYXRlSGVpZ2h0IC8gUFdMX01BWChmSW1hZ2VIZWlnaHQsIDEuMGYpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgRlhfRkxPQVQgZk1pblNjYWxlOworICAgIGlmIChJc1Byb3BvcnRpb25hbFNjYWxlKCkpIHsKKyAgICAgIGZNaW5TY2FsZSA9IFBXTF9NSU4oZkhTY2FsZSwgZlZTY2FsZSk7CisgICAgICBmSFNjYWxlID0gZk1pblNjYWxlOworICAgICAgZlZTY2FsZSA9IGZNaW5TY2FsZTsKKyAgICB9CisgIH0KIH0KIAotRlhfQk9PTAlDUFdMX0ljb246OklzUHJvcG9ydGlvbmFsU2NhbGUoKQotewotCWlmIChtX3BJY29uRml0KQotCQlyZXR1cm4gbV9wSWNvbkZpdC0+SXNQcm9wb3J0aW9uYWxTY2FsZSgpOwordm9pZCBDUFdMX0ljb246OkdldEltYWdlT2Zmc2V0KEZYX0ZMT0FUJiB4LCBGWF9GTE9BVCYgeSkgeworICBGWF9GTE9BVCBmTGVmdCwgZkJvdHRvbTsKIAotCXJldHVybiBGQUxTRTsKKyAgR2V0SWNvblBvc2l0aW9uKGZMZWZ0LCBmQm90dG9tKTsKKyAgeCA9IDAuMGY7CisgIHkgPSAwLjBmOworCisgIEZYX0ZMT0FUIGZJbWFnZVdpZHRoLCBmSW1hZ2VIZWlnaHQ7CisgIEdldEltYWdlU2l6ZShmSW1hZ2VXaWR0aCwgZkltYWdlSGVpZ2h0KTsKKworICBGWF9GTE9BVCBmSFNjYWxlLCBmVlNjYWxlOworICBHZXRTY2FsZShmSFNjYWxlLCBmVlNjYWxlKTsKKworICBGWF9GTE9BVCBmSW1hZ2VGYWN0V2lkdGggPSBmSW1hZ2VXaWR0aCAqIGZIU2NhbGU7CisgIEZYX0ZMT0FUIGZJbWFnZUZhY3RIZWlnaHQgPSBmSW1hZ2VIZWlnaHQgKiBmVlNjYWxlOworCisgIEZYX0ZMT0FUIGZQbGF0ZVdpZHRoLCBmUGxhdGVIZWlnaHQ7CisgIENQREZfUmVjdCByY1BsYXRlID0gR2V0Q2xpZW50UmVjdCgpOworICBmUGxhdGVXaWR0aCA9IHJjUGxhdGUucmlnaHQgLSByY1BsYXRlLmxlZnQ7CisgIGZQbGF0ZUhlaWdodCA9IHJjUGxhdGUudG9wIC0gcmNQbGF0ZS5ib3R0b207CisKKyAgeCA9IChmUGxhdGVXaWR0aCAtIGZJbWFnZUZhY3RXaWR0aCkgKiBmTGVmdDsKKyAgeSA9IChmUGxhdGVIZWlnaHQgLSBmSW1hZ2VGYWN0SGVpZ2h0KSAqIGZCb3R0b207CiB9Ci0KLXZvaWQgQ1BXTF9JY29uOjpHZXRJY29uUG9zaXRpb24oRlhfRkxPQVQgJiBmTGVmdCwgRlhfRkxPQVQgJiBmQm90dG9tKQotewotCWlmIChtX3BJY29uRml0KQotCXsKLQkJLy9tX3BJY29uRml0LT5HZXRJY29uUG9zaXRpb24oZkxlZnQsZkJvdHRvbSk7Ci0JCWZMZWZ0ID0gMC4wZjsKLQkJZkJvdHRvbSA9IDAuMGY7Ci0JCUNQREZfQXJyYXkqIHBBID0gbV9wSWNvbkZpdC0+bV9wRGljdCA/IG1fcEljb25GaXQtPm1fcERpY3QtPkdldEFycmF5KCJBIikgOiBOVUxMOwotCQlpZiAocEEgIT0gTlVMTCkKLQkJewotCQkJRlhfRFdPUkQgZHdDb3VudCA9IHBBLT5HZXRDb3VudCgpOwotCQkJaWYgKGR3Q291bnQgPiAwKSBmTGVmdCA9IHBBLT5HZXROdW1iZXIoMCk7Ci0JCQlpZiAoZHdDb3VudCA+IDEpIGZCb3R0b20gPSBwQS0+R2V0TnVtYmVyKDEpOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWZMZWZ0ID0gMC4wZjsKLQkJZkJvdHRvbSA9IDAuMGY7Ci0JfQotfQotCi1GWF9CT09MIENQV0xfSWNvbjo6R2V0Rml0dGluZ0JvdW5kcygpCi17Ci0JaWYgKG1fcEljb25GaXQpCi0JCXJldHVybiBtX3BJY29uRml0LT5HZXRGaXR0aW5nQm91bmRzKCk7Ci0KLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLXZvaWQgQ1BXTF9JY29uOjpHZXRTY2FsZShGWF9GTE9BVCAmIGZIU2NhbGUsRlhfRkxPQVQgJiBmVlNjYWxlKQotewotCWZIU2NhbGUgPSAxLjBmOwotCWZWU2NhbGUgPSAxLjBmOwotCQotCWlmIChtX3BQREZTdHJlYW0pCi0JewotCQlGWF9GTE9BVCBmSW1hZ2VXaWR0aCxmSW1hZ2VIZWlnaHQ7Ci0JCUZYX0ZMT0FUIGZQbGF0ZVdpZHRoLGZQbGF0ZUhlaWdodDsKLQotCQlDUERGX1JlY3QgcmNQbGF0ZSA9IHRoaXMtPkdldENsaWVudFJlY3QoKTsJCi0JCWZQbGF0ZVdpZHRoID0gcmNQbGF0ZS5yaWdodCAtIHJjUGxhdGUubGVmdDsKLQkJZlBsYXRlSGVpZ2h0ID0gcmNQbGF0ZS50b3AgLSByY1BsYXRlLmJvdHRvbTsKLQotCQlHZXRJbWFnZVNpemUoZkltYWdlV2lkdGgsZkltYWdlSGVpZ2h0KTsKLQotCQlGWF9JTlQzMiBuU2NhbGVNZXRob2QgPSB0aGlzLT5HZXRTY2FsZU1ldGhvZCgpOwotCi0JCS8qCi0JCWVudW0gU2NhbGVNZXRob2QKLQkJewotCQkJQWx3YXlzID0gMCwJLy9BLCBBbHdheXMgc2NhbGUKLQkJCUJpZ2dlciwJCS8vQiwgU2NhbGUgb25seSB3aGVuIHRoZSBpY29uIGlzIGJpZ2dlciB0aGFuIHRoZSBhbm5vdGF0aW9uIHJlY3RhbmdsZQotCQkJU21hbGxlciwJLy9TLCBTY2FsZSBvbmx5IHdoZW4gdGhlIGljb24gaXMgc21hbGxlciB0aGVuIHRoZSBhbm5vdGF0aW9uIHJlY3RhbmdsZQotCQkJTmV2ZXIJCS8vTiwgTmV2ZXIgc2NhbGUKLQkJfTsKLQkJKi8KLQotCQlzd2l0Y2ggKG5TY2FsZU1ldGhvZCkKLQkJewotCQlkZWZhdWx0OgotCQljYXNlIDA6Ci0JCQlmSFNjYWxlID0gZlBsYXRlV2lkdGggLyBQV0xfTUFYKGZJbWFnZVdpZHRoLDEuMGYpOwotCQkJZlZTY2FsZSA9IGZQbGF0ZUhlaWdodCAvIFBXTF9NQVgoZkltYWdlSGVpZ2h0LDEuMGYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCWlmIChmUGxhdGVXaWR0aCA8IGZJbWFnZVdpZHRoKQotCQkJCWZIU2NhbGUgPSBmUGxhdGVXaWR0aCAvIFBXTF9NQVgoZkltYWdlV2lkdGgsMS4wZik7Ci0JCQlpZiAoZlBsYXRlSGVpZ2h0IDwgZkltYWdlSGVpZ2h0KQotCQkJCWZWU2NhbGUgPSBmUGxhdGVIZWlnaHQgLyBQV0xfTUFYKGZJbWFnZUhlaWdodCwxLjBmKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlpZiAoZlBsYXRlV2lkdGggPiBmSW1hZ2VXaWR0aCkKLQkJCQlmSFNjYWxlID0gZlBsYXRlV2lkdGggLyBQV0xfTUFYKGZJbWFnZVdpZHRoLDEuMGYpOwotCQkJaWYgKGZQbGF0ZUhlaWdodCA+IGZJbWFnZUhlaWdodCkKLQkJCQlmVlNjYWxlID0gZlBsYXRlSGVpZ2h0IC8gUFdMX01BWChmSW1hZ2VIZWlnaHQsMS4wZik7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJYnJlYWs7Ci0JCX0KLQotCQlGWF9GTE9BVCBmTWluU2NhbGU7Ci0JCWlmIChJc1Byb3BvcnRpb25hbFNjYWxlKCkpCi0JCXsKLQkJCWZNaW5TY2FsZSA9IFBXTF9NSU4oZkhTY2FsZSxmVlNjYWxlKTsKLQkJCWZIU2NhbGUgPSBmTWluU2NhbGU7Ci0JCQlmVlNjYWxlID0gZk1pblNjYWxlOwotCQl9Ci0JfQotfQotCi12b2lkIENQV0xfSWNvbjo6R2V0SW1hZ2VPZmZzZXQoRlhfRkxPQVQgJiB4LEZYX0ZMT0FUICYgeSkKLXsKLQlGWF9GTE9BVCBmTGVmdCxmQm90dG9tOwotCi0JdGhpcy0+R2V0SWNvblBvc2l0aW9uKGZMZWZ0LGZCb3R0b20pOwotCXggPSAwLjBmOwotCXkgPSAwLjBmOwotCi0JRlhfRkxPQVQgZkltYWdlV2lkdGgsZkltYWdlSGVpZ2h0OwotCUdldEltYWdlU2l6ZShmSW1hZ2VXaWR0aCxmSW1hZ2VIZWlnaHQpOwotCi0JRlhfRkxPQVQgZkhTY2FsZSxmVlNjYWxlOwotCUdldFNjYWxlKGZIU2NhbGUsZlZTY2FsZSk7Ci0KLQlGWF9GTE9BVCBmSW1hZ2VGYWN0V2lkdGggPSBmSW1hZ2VXaWR0aCAqIGZIU2NhbGU7Ci0JRlhfRkxPQVQgZkltYWdlRmFjdEhlaWdodCA9IGZJbWFnZUhlaWdodCAqIGZWU2NhbGU7Ci0KLQlGWF9GTE9BVCBmUGxhdGVXaWR0aCxmUGxhdGVIZWlnaHQ7Ci0JQ1BERl9SZWN0IHJjUGxhdGUgPSB0aGlzLT5HZXRDbGllbnRSZWN0KCk7CQotCWZQbGF0ZVdpZHRoID0gcmNQbGF0ZS5yaWdodCAtIHJjUGxhdGUubGVmdDsKLQlmUGxhdGVIZWlnaHQgPSByY1BsYXRlLnRvcCAtIHJjUGxhdGUuYm90dG9tOwotCi0JeCA9IChmUGxhdGVXaWR0aCAtIGZJbWFnZUZhY3RXaWR0aCkgKiBmTGVmdDsKLQl5ID0gKGZQbGF0ZUhlaWdodCAtIGZJbWFnZUZhY3RIZWlnaHQpICAqIGZCb3R0b207Ci19Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfSWNvbkxpc3QuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9JY29uTGlzdC5jcHAKaW5kZXggOTkwZjhiOC4uYzY4NDlkMCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9JY29uTGlzdC5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9JY29uTGlzdC5jcHAKQEAgLTEsNTkyICsxLDUwMCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUERGV2luZG93LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9MaXN0Q3RybC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9JY29uTGlzdC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGFiZWwuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9JY29uTGlzdC5oIgogCi0jZGVmaW5lIFBXTF9JY29uTGlzdF9JVEVNX0lDT05fTEVGVE1BUkdJTgkJMTAuMGYKLSNkZWZpbmUgUFdMX0ljb25MaXN0X0lURU1fV0lEVEgJCQkJCTIwLjBmCi0jZGVmaW5lIFBXTF9JY29uTGlzdF9JVEVNX0hFSUdIVAkJCQkyMC4wZgotI2RlZmluZSBQV0xfSWNvbkxpc3RfSVRFTV9TUEFDRQkJCQkJNC4wZgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0xhYmVsLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGlzdEN0cmwuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2Z3bGV2ZW50LmgiCiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0ljb25MaXN0X0l0ZW0gLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBQV0xfSWNvbkxpc3RfSVRFTV9JQ09OX0xFRlRNQVJHSU4gMTAuMGYKKyNkZWZpbmUgUFdMX0ljb25MaXN0X0lURU1fV0lEVEggMjAuMGYKKyNkZWZpbmUgUFdMX0ljb25MaXN0X0lURU1fSEVJR0hUIDIwLjBmCisjZGVmaW5lIFBXTF9JY29uTGlzdF9JVEVNX1NQQUNFIDQuMGYKIAotQ1BXTF9JY29uTGlzdF9JdGVtOjpDUFdMX0ljb25MaXN0X0l0ZW0oKSA6IAotCW1fbkljb25JbmRleCgtMSksIAotCW1fcERhdGEoTlVMTCksCi0JbV9iU2VsZWN0ZWQoRkFMU0UpLAotCW1fcFRleHQoTlVMTCkKLXsKK0NQV0xfSWNvbkxpc3RfSXRlbTo6Q1BXTF9JY29uTGlzdF9JdGVtKCkKKyAgICA6IG1fbkljb25JbmRleCgtMSksIG1fcERhdGEoTlVMTCksIG1fYlNlbGVjdGVkKEZBTFNFKSwgbV9wVGV4dChOVUxMKSB7fQorCitDUFdMX0ljb25MaXN0X0l0ZW06On5DUFdMX0ljb25MaXN0X0l0ZW0oKSB7fQorCitDRlhfQnl0ZVN0cmluZyBDUFdMX0ljb25MaXN0X0l0ZW06OkdldENsYXNzTmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuICJDUFdMX0ljb25MaXN0X0l0ZW0iOwogfQogCi1DUFdMX0ljb25MaXN0X0l0ZW06On5DUFdMX0ljb25MaXN0X0l0ZW0oKQoteworRlhfRkxPQVQgQ1BXTF9JY29uTGlzdF9JdGVtOjpHZXRJdGVtSGVpZ2h0KEZYX0ZMT0FUIGZMaW1pdFdpZHRoKSB7CisgIHJldHVybiBQV0xfSWNvbkxpc3RfSVRFTV9IRUlHSFQ7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfSWNvbkxpc3RfSXRlbTo6R2V0Q2xhc3NOYW1lKCkgY29uc3QKLXsKLQlyZXR1cm4gIkNQV0xfSWNvbkxpc3RfSXRlbSI7Cit2b2lkIENQV0xfSWNvbkxpc3RfSXRlbTo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSkgeworICBDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CisKKyAgaWYgKG1fYlNlbGVjdGVkKSB7CisgICAgaWYgKElzRW5hYmxlZCgpKSB7CisgICAgICBDUFdMX1V0aWxzOjpEcmF3RmlsbFJlY3QoCisgICAgICAgICAgcERldmljZSwgcFVzZXIyRGV2aWNlLCByY0NsaWVudCwKKyAgICAgICAgICBDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihQV0xfREVGQVVMVF9TRUxCQUNLQ09MT1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0VHJhbnNwYXJlbmN5KCkpKTsKKyAgICB9IGVsc2UgeworICAgICAgQ1BXTF9VdGlsczo6RHJhd0ZpbGxSZWN0KAorICAgICAgICAgIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNDbGllbnQsCisgICAgICAgICAgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoUFdMX0RFRkFVTFRfTElHSFRHUkFZQ09MT1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0VHJhbnNwYXJlbmN5KCkpKTsKKyAgICB9CisgIH0KKworICBDUERGX1JlY3QgcmNJY29uID0gcmNDbGllbnQ7CisgIHJjSWNvbi5sZWZ0ICs9IFBXTF9JY29uTGlzdF9JVEVNX0lDT05fTEVGVE1BUkdJTjsKKyAgcmNJY29uLnJpZ2h0ID0gcmNJY29uLmxlZnQgKyBQV0xfSWNvbkxpc3RfSVRFTV9XSURUSDsKKworICBDUFdMX1V0aWxzOjpEcmF3SWNvbkFwcFN0cmVhbShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIG1fbkljb25JbmRleCwgcmNJY29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NySWNvbiwgbV9wVGV4dC0+R2V0VGV4dENvbG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFRyYW5zcGFyZW5jeSgpKTsKIH0KIAotRlhfRkxPQVQgQ1BXTF9JY29uTGlzdF9JdGVtOjpHZXRJdGVtSGVpZ2h0KEZYX0ZMT0FUIGZMaW1pdFdpZHRoKQotewotCXJldHVybiBQV0xfSWNvbkxpc3RfSVRFTV9IRUlHSFQ7Cit2b2lkIENQV0xfSWNvbkxpc3RfSXRlbTo6U2V0U2VsZWN0KEZYX0JPT0wgYlNlbGVjdGVkKSB7CisgIG1fYlNlbGVjdGVkID0gYlNlbGVjdGVkOworCisgIGlmIChiU2VsZWN0ZWQpCisgICAgbV9wVGV4dC0+U2V0VGV4dENvbG9yKFBXTF9ERUZBVUxUX1dISVRFQ09MT1IpOworICBlbHNlCisgICAgbV9wVGV4dC0+U2V0VGV4dENvbG9yKFBXTF9ERUZBVUxUX0JMQUNLQ09MT1IpOwogfQogCi12b2lkIENQV0xfSWNvbkxpc3RfSXRlbTo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpCi17Ci0JQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwotCi0JaWYgKG1fYlNlbGVjdGVkKQotCXsKLQkJaWYgKHRoaXMtPklzRW5hYmxlZCgpKQotCQl7Ci0JCQlDUFdMX1V0aWxzOjpEcmF3RmlsbFJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByY0NsaWVudCwgCi0JCQkJQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoUFdMX0RFRkFVTFRfU0VMQkFDS0NPTE9SLHRoaXMtPkdldFRyYW5zcGFyZW5jeSgpKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlDUFdMX1V0aWxzOjpEcmF3RmlsbFJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByY0NsaWVudCwgCi0JCQkJQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoUFdMX0RFRkFVTFRfTElHSFRHUkFZQ09MT1IsdGhpcy0+R2V0VHJhbnNwYXJlbmN5KCkpKTsKLQkJfQotCX0KLQotCUNQREZfUmVjdCByY0ljb24gPSByY0NsaWVudDsKLQlyY0ljb24ubGVmdCArPSBQV0xfSWNvbkxpc3RfSVRFTV9JQ09OX0xFRlRNQVJHSU47Ci0JcmNJY29uLnJpZ2h0ID0gcmNJY29uLmxlZnQgKyBQV0xfSWNvbkxpc3RfSVRFTV9XSURUSDsKLQotCUNQV0xfVXRpbHM6OkRyYXdJY29uQXBwU3RyZWFtKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgbV9uSWNvbkluZGV4LCByY0ljb24sIAotCQltX2NySWNvbiwgbV9wVGV4dC0+R2V0VGV4dENvbG9yKCksIHRoaXMtPkdldFRyYW5zcGFyZW5jeSgpKTsKK0ZYX0JPT0wgQ1BXTF9JY29uTGlzdF9JdGVtOjpJc1NlbGVjdGVkKCkgY29uc3QgeworICByZXR1cm4gbV9iU2VsZWN0ZWQ7CiB9CiAKLXZvaWQgQ1BXTF9JY29uTGlzdF9JdGVtOjpTZXRTZWxlY3QoRlhfQk9PTCBiU2VsZWN0ZWQpCi17Ci0JbV9iU2VsZWN0ZWQgPSBiU2VsZWN0ZWQ7Cit2b2lkIENQV0xfSWNvbkxpc3RfSXRlbTo6Q3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCkgeworICBtX3BUZXh0ID0gbmV3IENQV0xfTGFiZWw7CiAKLQlpZiAoYlNlbGVjdGVkKQotCQltX3BUZXh0LT5TZXRUZXh0Q29sb3IoUFdMX0RFRkFVTFRfV0hJVEVDT0xPUik7Ci0JZWxzZQotCQltX3BUZXh0LT5TZXRUZXh0Q29sb3IoUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUik7Ci0KKyAgUFdMX0NSRUFURVBBUkFNIGxjcCA9IGNwOworICBsY3AucFBhcmVudFduZCA9IHRoaXM7CisgIGxjcC5kd0ZsYWdzID0gUFdTX0NISUxEIHwgUFdTX1ZJU0lCTEUgfCBQRVNfTEVGVCB8IFBFU19DRU5URVI7CisgIGxjcC5zVGV4dENvbG9yID0gUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUjsKKyAgbGNwLmZGb250U2l6ZSA9IDEyOworICBtX3BUZXh0LT5DcmVhdGUobGNwKTsKIH0KIAotRlhfQk9PTAlDUFdMX0ljb25MaXN0X0l0ZW06OklzU2VsZWN0ZWQoKSBjb25zdAotewotCXJldHVybiBtX2JTZWxlY3RlZDsKK3ZvaWQgQ1BXTF9JY29uTGlzdF9JdGVtOjpTZXREYXRhKHZvaWQqIHBEYXRhKSB7CisgIG1fcERhdGEgPSBwRGF0YTsKIH0KIAotdm9pZCBDUFdMX0ljb25MaXN0X0l0ZW06OkNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKQotewotCW1fcFRleHQgPSBuZXcgQ1BXTF9MYWJlbDsKLQotCVBXTF9DUkVBVEVQQVJBTSBsY3AgPSBjcDsKLQlsY3AucFBhcmVudFduZCA9IHRoaXM7Ci0JbGNwLmR3RmxhZ3MgPSBQV1NfQ0hJTEQgfCBQV1NfVklTSUJMRSB8IFBFU19MRUZUIHwgUEVTX0NFTlRFUjsKLQlsY3Auc1RleHRDb2xvciA9IFBXTF9ERUZBVUxUX0JMQUNLQ09MT1I7Ci0JbGNwLmZGb250U2l6ZSA9IDEyOwotCW1fcFRleHQtPkNyZWF0ZShsY3ApOwordm9pZCBDUFdMX0ljb25MaXN0X0l0ZW06OlNldEljb24oaW50MzJfdCBuSWNvbkluZGV4KSB7CisgIG1fbkljb25JbmRleCA9IG5JY29uSW5kZXg7CiB9CiAKLXZvaWQgQ1BXTF9JY29uTGlzdF9JdGVtOjpTZXREYXRhKHZvaWQqIHBEYXRhKQotewotCW1fcERhdGEgPSBwRGF0YTsKK3ZvaWQgQ1BXTF9JY29uTGlzdF9JdGVtOjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIHsKKyAgbV9wVGV4dC0+U2V0VGV4dChzdHIuY19zdHIoKSk7CiB9CiAKLXZvaWQgQ1BXTF9JY29uTGlzdF9JdGVtOjpTZXRJY29uKEZYX0lOVDMyIG5JY29uSW5kZXgpCi17Ci0JbV9uSWNvbkluZGV4ID0gbkljb25JbmRleDsKK0NGWF9XaWRlU3RyaW5nIENQV0xfSWNvbkxpc3RfSXRlbTo6R2V0VGV4dCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcFRleHQtPkdldFRleHQoKTsKIH0KIAotdm9pZCBDUFdMX0ljb25MaXN0X0l0ZW06OlNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikKLXsKLQltX3BUZXh0LT5TZXRUZXh0KHN0ci5jX3N0cigpKTsKK3ZvaWQgQ1BXTF9JY29uTGlzdF9JdGVtOjpSZVBvc0NoaWxkV25kKCkgeworICBDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CisKKyAgcmNDbGllbnQubGVmdCArPQorICAgICAgKFBXTF9JY29uTGlzdF9JVEVNX0lDT05fTEVGVE1BUkdJTiArIFBXTF9JY29uTGlzdF9JVEVNX1dJRFRIICsKKyAgICAgICBQV0xfSWNvbkxpc3RfSVRFTV9JQ09OX0xFRlRNQVJHSU4pOworCisgIG1fcFRleHQtPk1vdmUocmNDbGllbnQsIFRSVUUsIEZBTFNFKTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BXTF9JY29uTGlzdF9JdGVtOjpHZXRUZXh0KCkgY29uc3QKLXsKLQlyZXR1cm4gbV9wVGV4dC0+R2V0VGV4dCgpOwordm9pZCBDUFdMX0ljb25MaXN0X0l0ZW06OlNldEljb25GaWxsQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpIHsKKyAgbV9jckljb24gPSBjb2xvcjsKIH0KIAotdm9pZCBDUFdMX0ljb25MaXN0X0l0ZW06OlJlUG9zQ2hpbGRXbmQoKQotewotCUNQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKK3ZvaWQgQ1BXTF9JY29uTGlzdF9JdGVtOjpPbkVuYWJsZWQoKSB7CisgIGlmIChtX2JTZWxlY3RlZCkKKyAgICBtX3BUZXh0LT5TZXRUZXh0Q29sb3IoUFdMX0RFRkFVTFRfV0hJVEVDT0xPUik7CisgIGVsc2UKKyAgICBtX3BUZXh0LT5TZXRUZXh0Q29sb3IoUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUik7CiAKLQlyY0NsaWVudC5sZWZ0ICs9IChQV0xfSWNvbkxpc3RfSVRFTV9JQ09OX0xFRlRNQVJHSU4gKyBQV0xfSWNvbkxpc3RfSVRFTV9XSURUSCArIFBXTF9JY29uTGlzdF9JVEVNX0lDT05fTEVGVE1BUkdJTik7Ci0KLQltX3BUZXh0LT5Nb3ZlKHJjQ2xpZW50LCBUUlVFLCBGQUxTRSk7CisgIEludmFsaWRhdGVSZWN0KCk7CiB9CiAKLXZvaWQgQ1BXTF9JY29uTGlzdF9JdGVtOjpTZXRJY29uRmlsbENvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKQotewotCW1fY3JJY29uID0gY29sb3I7Cit2b2lkIENQV0xfSWNvbkxpc3RfSXRlbTo6T25EaXNhYmxlZCgpIHsKKyAgbV9wVGV4dC0+U2V0VGV4dENvbG9yKFBXTF9ERUZBVUxUX0hFQVZZR1JBWUNPTE9SKTsKKworICBJbnZhbGlkYXRlUmVjdCgpOwogfQogCi12b2lkIENQV0xfSWNvbkxpc3RfSXRlbTo6T25FbmFibGVkKCkKLXsKLQlpZiAobV9iU2VsZWN0ZWQpCi0JCW1fcFRleHQtPlNldFRleHRDb2xvcihQV0xfREVGQVVMVF9XSElURUNPTE9SKTsKLQllbHNlCi0JCW1fcFRleHQtPlNldFRleHRDb2xvcihQV0xfREVGQVVMVF9CTEFDS0NPTE9SKTsKK0NQV0xfSWNvbkxpc3RfQ29udGVudDo6Q1BXTF9JY29uTGlzdF9Db250ZW50KGludDMyX3Qgbkxpc3RDb3VudCkKKyAgICA6IG1fblNlbGVjdEluZGV4KC0xKSwKKyAgICAgIG1fcE5vdGlmeShOVUxMKSwKKyAgICAgIG1fYkVuYWJsZU5vdGlmeShUUlVFKSwKKyAgICAgIG1fYk1vdXNlRG93bihGQUxTRSksCisgICAgICBtX25MaXN0Q291bnQobkxpc3RDb3VudCkge30KIAotCXRoaXMtPkludmFsaWRhdGVSZWN0KCk7CitDUFdMX0ljb25MaXN0X0NvbnRlbnQ6On5DUFdMX0ljb25MaXN0X0NvbnRlbnQoKSB7fQorCit2b2lkIENQV0xfSWNvbkxpc3RfQ29udGVudDo6Q3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCkgeworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX25MaXN0Q291bnQ7IGkrKykgeworICAgIENQV0xfSWNvbkxpc3RfSXRlbSogcE5ld0l0ZW0gPSBuZXcgQ1BXTF9JY29uTGlzdF9JdGVtKCk7CisKKyAgICBQV0xfQ1JFQVRFUEFSQU0gaWNwID0gY3A7CisgICAgaWNwLnBQYXJlbnRXbmQgPSB0aGlzOworICAgIGljcC5kd0ZsYWdzID0gUFdTX0NISUxEIHwgUFdTX1ZJU0lCTEUgfCBQV1NfTk9SRUZSRVNIQ0xJUDsKKyAgICBwTmV3SXRlbS0+Q3JlYXRlKGljcCk7CisgIH0KKworICBTZXRJdGVtU3BhY2UoUFdMX0ljb25MaXN0X0lURU1fU1BBQ0UpOworICBSZXNldENvbnRlbnQoMCk7CisKKyAgaWYgKENQV0xfV25kKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpIHsKKyAgICBDUERGX1JlY3QgcmNTY3JvbGwgPSBHZXRTY3JvbGxBcmVhKCk7CisgICAgR2V0U2Nyb2xsUG9zKCk7CisKKyAgICBQV0xfU0NST0xMX0lORk8gc0luZm87CisgICAgc0luZm8uZkNvbnRlbnRNaW4gPSByY1Njcm9sbC5ib3R0b207CisgICAgc0luZm8uZkNvbnRlbnRNYXggPSByY1Njcm9sbC50b3A7CisgICAgc0luZm8uZlBsYXRlV2lkdGggPSBHZXRDbGllbnRSZWN0KCkuSGVpZ2h0KCk7CisgICAgc0luZm8uZlNtYWxsU3RlcCA9IDEzLjBmOworICAgIHNJbmZvLmZCaWdTdGVwID0gc0luZm8uZlBsYXRlV2lkdGg7CisKKyAgICBwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0VUU0NST0xMSU5GTywgU0JUX1ZTQ1JPTEwsIChpbnRwdHJfdCkmc0luZm8pOworICB9CiB9CiAKLXZvaWQgQ1BXTF9JY29uTGlzdF9JdGVtOjpPbkRpc2FibGVkKCkKLXsKLQltX3BUZXh0LT5TZXRUZXh0Q29sb3IoUFdMX0RFRkFVTFRfSEVBVllHUkFZQ09MT1IpOworRlhfQk9PTCBDUFdMX0ljb25MaXN0X0NvbnRlbnQ6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgeworICBTZXRGb2N1cygpOwogCi0JdGhpcy0+SW52YWxpZGF0ZVJlY3QoKTsKKyAgU2V0Q2FwdHVyZSgpOworICBtX2JNb3VzZURvd24gPSBUUlVFOworCisgIGludDMyX3Qgbkl0ZW1JbmRleCA9IEZpbmRJdGVtSW5kZXgocG9pbnQpOworICBTZXRTZWxlY3Qobkl0ZW1JbmRleCk7CisgIFNjcm9sbFRvSXRlbShuSXRlbUluZGV4KTsKKworICByZXR1cm4gVFJVRTsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9JY29uTGlzdF9Db250ZW50IC0tLS0tLS0tLS0tLS0tLS0tICovCitGWF9CT09MIENQV0xfSWNvbkxpc3RfQ29udGVudDo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIHsKKyAgbV9iTW91c2VEb3duID0gRkFMU0U7CisgIFJlbGVhc2VDYXB0dXJlKCk7CiAKLUNQV0xfSWNvbkxpc3RfQ29udGVudDo6Q1BXTF9JY29uTGlzdF9Db250ZW50KEZYX0lOVDMyIG5MaXN0Q291bnQpIDogCi0JbV9uU2VsZWN0SW5kZXgoLTEpLAotCW1fcE5vdGlmeShOVUxMKSwKLQltX2JFbmFibGVOb3RpZnkoVFJVRSksCi0JbV9iTW91c2VEb3duKEZBTFNFKSwKLQltX25MaXN0Q291bnQobkxpc3RDb3VudCkKLXsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUNQV0xfSWNvbkxpc3RfQ29udGVudDo6fkNQV0xfSWNvbkxpc3RfQ29udGVudCgpCi17CitGWF9CT09MIENQV0xfSWNvbkxpc3RfQ29udGVudDo6T25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIHsKKyAgaWYgKG1fYk1vdXNlRG93bikgeworICAgIGludDMyX3Qgbkl0ZW1JbmRleCA9IEZpbmRJdGVtSW5kZXgocG9pbnQpOworICAgIFNldFNlbGVjdChuSXRlbUluZGV4KTsKKyAgICBTY3JvbGxUb0l0ZW0obkl0ZW1JbmRleCk7CisgIH0KKworICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBDUFdMX0ljb25MaXN0X0NvbnRlbnQ6OkNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKQotewotCWZvciAoRlhfSU5UMzIgaT0wOyBpPG1fbkxpc3RDb3VudDsgaSsrKQotCXsKLQkJQ1BXTF9JY29uTGlzdF9JdGVtKiBwTmV3SXRlbSA9IG5ldyBDUFdMX0ljb25MaXN0X0l0ZW0oKTsKK0ZYX0JPT0wgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpIHsKKyAgc3dpdGNoIChuQ2hhcikgeworICAgIGNhc2UgRldMX1ZLRVlfVXA6CisgICAgICBpZiAobV9uU2VsZWN0SW5kZXggPiAwKSB7CisgICAgICAgIGludDMyX3Qgbkl0ZW1JbmRleCA9IG1fblNlbGVjdEluZGV4IC0gMTsKKyAgICAgICAgU2V0U2VsZWN0KG5JdGVtSW5kZXgpOworICAgICAgICBTY3JvbGxUb0l0ZW0obkl0ZW1JbmRleCk7CisgICAgICB9CisgICAgICByZXR1cm4gVFJVRTsKKyAgICBjYXNlIEZXTF9WS0VZX0Rvd246CisgICAgICBpZiAobV9uU2VsZWN0SW5kZXggPCBtX25MaXN0Q291bnQgLSAxKSB7CisgICAgICAgIGludDMyX3Qgbkl0ZW1JbmRleCA9IG1fblNlbGVjdEluZGV4ICsgMTsKKyAgICAgICAgU2V0U2VsZWN0KG5JdGVtSW5kZXgpOworICAgICAgICBTY3JvbGxUb0l0ZW0obkl0ZW1JbmRleCk7CisgICAgICB9CisgICAgICByZXR1cm4gVFJVRTsKKyAgfQogCi0JCVBXTF9DUkVBVEVQQVJBTSBpY3AgPSBjcDsKLQkJaWNwLnBQYXJlbnRXbmQgPSB0aGlzOwotCQlpY3AuZHdGbGFncyA9IFBXU19DSElMRCB8IFBXU19WSVNJQkxFIHwgUFdTX05PUkVGUkVTSENMSVA7Ci0JCXBOZXdJdGVtLT5DcmVhdGUoaWNwKTsKLQl9Ci0KLQl0aGlzLT5TZXRJdGVtU3BhY2UoUFdMX0ljb25MaXN0X0lURU1fU1BBQ0UpOwotCXRoaXMtPlJlc2V0Q29udGVudCgwKTsKLQotCWlmIChDUFdMX1duZCAqIHBQYXJlbnQgPSB0aGlzLT5HZXRQYXJlbnRXaW5kb3coKSkKLQl7Ci0JCUNQREZfUmVjdCByY1Njcm9sbCA9IHRoaXMtPkdldFNjcm9sbEFyZWEoKTsKLQkJdGhpcy0+R2V0U2Nyb2xsUG9zKCk7Ci0KLQkJUFdMX1NDUk9MTF9JTkZPIHNJbmZvOwotCQlzSW5mby5mQ29udGVudE1pbiA9IHJjU2Nyb2xsLmJvdHRvbTsKLQkJc0luZm8uZkNvbnRlbnRNYXggPSByY1Njcm9sbC50b3A7Ci0JCXNJbmZvLmZQbGF0ZVdpZHRoID0gR2V0Q2xpZW50UmVjdCgpLkhlaWdodCgpOwotCQlzSW5mby5mU21hbGxTdGVwID0gMTMuMGY7Ci0JCXNJbmZvLmZCaWdTdGVwID0gc0luZm8uZlBsYXRlV2lkdGg7Ci0KLQkJcFBhcmVudC0+T25Ob3RpZnkodGhpcywgUE5NX1NFVFNDUk9MTElORk8sIFNCVF9WU0NST0xMLCAoRlhfSU5UUFRSKSZzSW5mbyk7Ci0JfQorICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wJQ1BXTF9JY29uTGlzdF9Db250ZW50OjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JU2V0Rm9jdXMoKTsKK2ludDMyX3QgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpGaW5kSXRlbUluZGV4KGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIGludDMyX3QgbkluZGV4ID0gMDsKKyAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYUNoaWxkcmVuLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKSB7CisgICAgICBDUERGX1JlY3QgcmNXbmQgPSBwQ2hpbGQtPkNoaWxkVG9QYXJlbnQocENoaWxkLT5HZXRXaW5kb3dSZWN0KCkpOwogCi0JU2V0Q2FwdHVyZSgpOwotCW1fYk1vdXNlRG93biA9IFRSVUU7CisgICAgICBpZiAocG9pbnQueSA8IHJjV25kLnRvcCkgeworICAgICAgICBuSW5kZXggPSBpOworICAgICAgfQorICAgIH0KKyAgfQogCi0JRlhfSU5UMzIgbkl0ZW1JbmRleCA9IEZpbmRJdGVtSW5kZXgocG9pbnQpOwotCVNldFNlbGVjdChuSXRlbUluZGV4KTsKLQlTY3JvbGxUb0l0ZW0obkl0ZW1JbmRleCk7Ci0KLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIG5JbmRleDsKIH0KIAotRlhfQk9PTAlDUFdMX0ljb25MaXN0X0NvbnRlbnQ6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JbV9iTW91c2VEb3duID0gRkFMU0U7Ci0JUmVsZWFzZUNhcHR1cmUoKTsKK3ZvaWQgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpTY3JvbGxUb0l0ZW0oaW50MzJfdCBuSXRlbUluZGV4KSB7CisgIENQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKIAotCXJldHVybiBUUlVFOworICBpZiAoQ1BXTF9JY29uTGlzdF9JdGVtKiBwSXRlbSA9IEdldExpc3RJdGVtKG5JdGVtSW5kZXgpKSB7CisgICAgQ1BERl9SZWN0IHJjT3JpZ2luID0gcEl0ZW0tPkdldFdpbmRvd1JlY3QoKTsKKyAgICBDUERGX1JlY3QgcmNXbmQgPSBwSXRlbS0+Q2hpbGRUb1BhcmVudChyY09yaWdpbik7CisKKyAgICBpZiAoIShyY1duZC5ib3R0b20gPiByY0NsaWVudC5ib3R0b20gJiYgcmNXbmQudG9wIDwgcmNDbGllbnQudG9wKSkgeworICAgICAgQ1BERl9Qb2ludCBwdFNjcm9sbCA9IEdldFNjcm9sbFBvcygpOworCisgICAgICBpZiAocmNXbmQudG9wID4gcmNDbGllbnQudG9wKSB7CisgICAgICAgIHB0U2Nyb2xsLnkgPSByY09yaWdpbi50b3A7CisgICAgICB9IGVsc2UgaWYgKHJjV25kLmJvdHRvbSA8IHJjQ2xpZW50LmJvdHRvbSkgeworICAgICAgICBwdFNjcm9sbC55ID0gcmNPcmlnaW4uYm90dG9tICsgcmNDbGllbnQuSGVpZ2h0KCk7CisgICAgICB9CisKKyAgICAgIFNldFNjcm9sbFBvcyhwdFNjcm9sbCk7CisgICAgICBSZXNldEZhY2UoKTsKKyAgICAgIEludmFsaWRhdGVSZWN0KCk7CisgICAgICBpZiAoQ1BXTF9XbmQqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkgeworICAgICAgICBwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0VUU0NST0xMUE9TLCBTQlRfVlNDUk9MTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGludHB0cl90KSZwdFNjcm9sbC55KTsKKyAgICAgIH0KKyAgICB9CisgIH0KIH0KIAotRlhfQk9PTCBDUFdMX0ljb25MaXN0X0NvbnRlbnQ6Ok9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JaWYgKG1fYk1vdXNlRG93bikKLQl7Ci0JCUZYX0lOVDMyIG5JdGVtSW5kZXggPSBGaW5kSXRlbUluZGV4KHBvaW50KTsKLQkJU2V0U2VsZWN0KG5JdGVtSW5kZXgpOwotCQlTY3JvbGxUb0l0ZW0obkl0ZW1JbmRleCk7Ci0JfQordm9pZCBDUFdMX0ljb25MaXN0X0NvbnRlbnQ6OlNldFNlbGVjdChpbnQzMl90IG5JbmRleCkgeworICBpZiAobV9uU2VsZWN0SW5kZXggIT0gbkluZGV4KSB7CisgICAgU2VsZWN0SXRlbShtX25TZWxlY3RJbmRleCwgRkFMU0UpOworICAgIFNlbGVjdEl0ZW0obkluZGV4LCBUUlVFKTsKKyAgICBtX25TZWxlY3RJbmRleCA9IG5JbmRleDsKIAotCXJldHVybiBUUlVFOworICAgIGlmIChJUFdMX0ljb25MaXN0X05vdGlmeSogcE5vdGlmeSA9IEdldE5vdGlmeSgpKQorICAgICAgcE5vdGlmeS0+T25Ob3RlTGlzdFNlbENoYW5nZWQobkluZGV4KTsKKyAgfQogfQogCi1GWF9CT09MCUNQV0xfSWNvbkxpc3RfQ29udGVudDo6T25LZXlEb3duKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQotewotCXN3aXRjaCAobkNoYXIpCi0JewotCWNhc2UgRldMX1ZLRVlfVXA6Ci0JCWlmIChtX25TZWxlY3RJbmRleCA+IDApCi0JCXsKLQkJCUZYX0lOVDMyIG5JdGVtSW5kZXggPSBtX25TZWxlY3RJbmRleCAtIDE7Ci0JCQlTZXRTZWxlY3Qobkl0ZW1JbmRleCk7Ci0JCQlTY3JvbGxUb0l0ZW0obkl0ZW1JbmRleCk7Ci0JCX0KLQkJcmV0dXJuIFRSVUU7Ci0JY2FzZSBGV0xfVktFWV9Eb3duOgotCQlpZiAobV9uU2VsZWN0SW5kZXggPCBtX25MaXN0Q291bnQtMSkKLQkJewotCQkJRlhfSU5UMzIgbkl0ZW1JbmRleCA9IG1fblNlbGVjdEluZGV4ICsgMTsKLQkJCVNldFNlbGVjdChuSXRlbUluZGV4KTsKLQkJCVNjcm9sbFRvSXRlbShuSXRlbUluZGV4KTsKLQkJfQotCQlyZXR1cm4gVFJVRTsKLQl9Ci0KLQlyZXR1cm4gRkFMU0U7CitpbnQzMl90IENQV0xfSWNvbkxpc3RfQ29udGVudDo6R2V0U2VsZWN0KCkgY29uc3QgeworICByZXR1cm4gbV9uU2VsZWN0SW5kZXg7CiB9CiAKLUZYX0lOVDMyIENQV0xfSWNvbkxpc3RfQ29udGVudDo6RmluZEl0ZW1JbmRleChjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLQlGWF9JTlQzMiBuSW5kZXggPSAwOwotCWZvciAoRlhfSU5UMzIgaT0wLHN6PW1fYUNoaWxkcmVuLkdldFNpemUoKTsgaTxzejsgaSsrKQotCXsKLQkJaWYgKENQV0xfV25kICogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpCi0JCXsKLQkJCUNQREZfUmVjdCByY1duZCA9IHBDaGlsZC0+Q2hpbGRUb1BhcmVudChwQ2hpbGQtPkdldFdpbmRvd1JlY3QoKSk7Ci0KLQkJCWlmIChwb2ludC55IDwgcmNXbmQudG9wKQotCQkJewotCQkJCW5JbmRleCA9IGk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gbkluZGV4OworSVBXTF9JY29uTGlzdF9Ob3RpZnkqIENQV0xfSWNvbkxpc3RfQ29udGVudDo6R2V0Tm90aWZ5KCkgY29uc3QgeworICBpZiAobV9iRW5hYmxlTm90aWZ5KQorICAgIHJldHVybiBtX3BOb3RpZnk7CisgIHJldHVybiBOVUxMOwogfQogCi12b2lkIENQV0xfSWNvbkxpc3RfQ29udGVudDo6U2Nyb2xsVG9JdGVtKEZYX0lOVDMyIG5JdGVtSW5kZXgpCi17Ci0JQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwotCi0JaWYgKENQV0xfSWNvbkxpc3RfSXRlbSogcEl0ZW0gPSBHZXRMaXN0SXRlbShuSXRlbUluZGV4KSkKLQl7Ci0JCUNQREZfUmVjdCByY09yaWdpbiA9IHBJdGVtLT5HZXRXaW5kb3dSZWN0KCk7Ci0JCUNQREZfUmVjdCByY1duZCA9IHBJdGVtLT5DaGlsZFRvUGFyZW50KHJjT3JpZ2luKTsKLQotCQlpZiAoIShyY1duZC5ib3R0b20gPiByY0NsaWVudC5ib3R0b20gJiYgcmNXbmQudG9wIDwgcmNDbGllbnQudG9wKSkKLQkJewotCQkJQ1BERl9Qb2ludCBwdFNjcm9sbCA9IEdldFNjcm9sbFBvcygpOwotCi0JCQlpZiAocmNXbmQudG9wID4gcmNDbGllbnQudG9wKQotCQkJewotCQkJCXB0U2Nyb2xsLnkgPSByY09yaWdpbi50b3A7Ci0JCQl9Ci0JCQllbHNlIGlmIChyY1duZC5ib3R0b20gPCByY0NsaWVudC5ib3R0b20pCi0JCQl7Ci0JCQkJcHRTY3JvbGwueSA9IHJjT3JpZ2luLmJvdHRvbSArIHJjQ2xpZW50LkhlaWdodCgpOwkJCQkJCi0JCQl9Ci0KLQkJCXRoaXMtPlNldFNjcm9sbFBvcyhwdFNjcm9sbCk7Ci0JCQl0aGlzLT5SZXNldEZhY2UoKTsKLQkJCXRoaXMtPkludmFsaWRhdGVSZWN0KCk7Ci0JCQlpZiAoQ1BXTF9XbmQqIHBQYXJlbnQgPSB0aGlzLT5HZXRQYXJlbnRXaW5kb3coKSkKLQkJCXsKLQkJCQlwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0VUU0NST0xMUE9TLCBTQlRfVlNDUk9MTCwgKEZYX0lOVFBUUikmcHRTY3JvbGwueSk7Ci0JCQl9Ci0JCX0KLQl9Cit2b2lkIENQV0xfSWNvbkxpc3RfQ29udGVudDo6U2V0Tm90aWZ5KElQV0xfSWNvbkxpc3RfTm90aWZ5KiBwTm90aWZ5KSB7CisgIG1fcE5vdGlmeSA9IHBOb3RpZnk7CiB9CiAKLXZvaWQgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpTZXRTZWxlY3QoRlhfSU5UMzIgbkluZGV4KQotewotCWlmIChtX25TZWxlY3RJbmRleCAhPSBuSW5kZXgpCi0JewotCQlTZWxlY3RJdGVtKG1fblNlbGVjdEluZGV4LCBGQUxTRSk7Ci0JCVNlbGVjdEl0ZW0obkluZGV4LCBUUlVFKTsKLQkJbV9uU2VsZWN0SW5kZXggPSBuSW5kZXg7Ci0KLQkJaWYgKElQV0xfSWNvbkxpc3RfTm90aWZ5KiBwTm90aWZ5ID0gR2V0Tm90aWZ5KCkpCi0JCQlwTm90aWZ5LT5Pbk5vdGVMaXN0U2VsQ2hhbmdlZChuSW5kZXgpOwotCX0KK3ZvaWQgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpFbmFibGVOb3RpZnkoRlhfQk9PTCBiTm90aWZ5KSB7CisgIG1fYkVuYWJsZU5vdGlmeSA9IGJOb3RpZnk7CiB9CiAKLUZYX0lOVDMyIENQV0xfSWNvbkxpc3RfQ29udGVudDo6R2V0U2VsZWN0KCkgY29uc3QKLXsKLQlyZXR1cm4gbV9uU2VsZWN0SW5kZXg7Cit2b2lkIENQV0xfSWNvbkxpc3RfQ29udGVudDo6U2VsZWN0SXRlbShpbnQzMl90IG5JdGVtSW5kZXgsIEZYX0JPT0wgYlNlbGVjdCkgeworICBpZiAoQ1BXTF9JY29uTGlzdF9JdGVtKiBwSXRlbSA9IEdldExpc3RJdGVtKG5JdGVtSW5kZXgpKSB7CisgICAgcEl0ZW0tPlNldFNlbGVjdChiU2VsZWN0KTsKKyAgICBwSXRlbS0+SW52YWxpZGF0ZVJlY3QoKTsKKyAgfQogfQogCi1JUFdMX0ljb25MaXN0X05vdGlmeSogQ1BXTF9JY29uTGlzdF9Db250ZW50OjpHZXROb3RpZnkoKSBjb25zdAotewotCWlmIChtX2JFbmFibGVOb3RpZnkpCi0JCXJldHVybiBtX3BOb3RpZnk7Ci0JcmV0dXJuIE5VTEw7CitDUFdMX0ljb25MaXN0X0l0ZW0qIENQV0xfSWNvbkxpc3RfQ29udGVudDo6R2V0TGlzdEl0ZW0oCisgICAgaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdCB7CisgIGlmIChuSXRlbUluZGV4ID49IDAgJiYgbkl0ZW1JbmRleCA8IG1fYUNoaWxkcmVuLkdldFNpemUoKSkgeworICAgIGlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQobkl0ZW1JbmRleCkpIHsKKyAgICAgIGlmIChwQ2hpbGQtPkdldENsYXNzTmFtZSgpID09ICJDUFdMX0ljb25MaXN0X0l0ZW0iKSB7CisgICAgICAgIHJldHVybiAoQ1BXTF9JY29uTGlzdF9JdGVtKilwQ2hpbGQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpTZXROb3RpZnkoSVBXTF9JY29uTGlzdF9Ob3RpZnkqIHBOb3RpZnkpCi17Ci0JbV9wTm90aWZ5ID0gcE5vdGlmeTsKK3ZvaWQgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpTZXRMaXN0RGF0YShpbnQzMl90IG5JdGVtSW5kZXgsIHZvaWQqIHBEYXRhKSB7CisgIGlmIChDUFdMX0ljb25MaXN0X0l0ZW0qIHBJdGVtID0gR2V0TGlzdEl0ZW0obkl0ZW1JbmRleCkpCisgICAgcEl0ZW0tPlNldERhdGEocERhdGEpOwogfQogCi12b2lkIENQV0xfSWNvbkxpc3RfQ29udGVudDo6RW5hYmxlTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSkKLXsKLQltX2JFbmFibGVOb3RpZnkgPSBiTm90aWZ5Owordm9pZCBDUFdMX0ljb25MaXN0X0NvbnRlbnQ6OlNldExpc3RJY29uKGludDMyX3Qgbkl0ZW1JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JY29uSW5kZXgpIHsKKyAgaWYgKENQV0xfSWNvbkxpc3RfSXRlbSogcEl0ZW0gPSBHZXRMaXN0SXRlbShuSXRlbUluZGV4KSkKKyAgICBwSXRlbS0+U2V0SWNvbihuSWNvbkluZGV4KTsKIH0KIAotdm9pZCBDUFdMX0ljb25MaXN0X0NvbnRlbnQ6OlNlbGVjdEl0ZW0oRlhfSU5UMzIgbkl0ZW1JbmRleCwgRlhfQk9PTCBiU2VsZWN0KQotewotCWlmIChDUFdMX0ljb25MaXN0X0l0ZW0qIHBJdGVtID0gR2V0TGlzdEl0ZW0obkl0ZW1JbmRleCkpCi0JewotCQlwSXRlbS0+U2V0U2VsZWN0KGJTZWxlY3QpOwotCQlwSXRlbS0+SW52YWxpZGF0ZVJlY3QoKTsJCQotCX0KK3ZvaWQgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpTZXRMaXN0U3RyaW5nKGludDMyX3Qgbkl0ZW1JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIHsKKyAgaWYgKENQV0xfSWNvbkxpc3RfSXRlbSogcEl0ZW0gPSBHZXRMaXN0SXRlbShuSXRlbUluZGV4KSkKKyAgICBwSXRlbS0+U2V0VGV4dChzdHIpOwogfQogCi1DUFdMX0ljb25MaXN0X0l0ZW0qIENQV0xfSWNvbkxpc3RfQ29udGVudDo6R2V0TGlzdEl0ZW0oRlhfSU5UMzIgbkl0ZW1JbmRleCkgY29uc3QKLXsKLQlpZiAobkl0ZW1JbmRleCA+PSAwICYmIG5JdGVtSW5kZXg8bV9hQ2hpbGRyZW4uR2V0U2l6ZSgpKQotCXsKLQkJaWYgKENQV0xfV25kICogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQobkl0ZW1JbmRleCkpCi0JCXsKLQkJCWlmIChwQ2hpbGQtPkdldENsYXNzTmFtZSgpID09ICJDUFdMX0ljb25MaXN0X0l0ZW0iKQotCQkJewotCQkJCXJldHVybiAoQ1BXTF9JY29uTGlzdF9JdGVtKilwQ2hpbGQ7Ci0JCQl9Ci0JCX0KLQl9CitDRlhfV2lkZVN0cmluZyBDUFdMX0ljb25MaXN0X0NvbnRlbnQ6OkdldExpc3RTdHJpbmcoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdCB7CisgIGlmIChDUFdMX0ljb25MaXN0X0l0ZW0qIHBJdGVtID0gR2V0TGlzdEl0ZW0obkl0ZW1JbmRleCkpCisgICAgcmV0dXJuIHBJdGVtLT5HZXRUZXh0KCk7CiAKLQlyZXR1cm4gTlVMTDsKKyAgcmV0dXJuIEwiIjsKIH0KIAotdm9pZCBDUFdMX0ljb25MaXN0X0NvbnRlbnQ6OlNldExpc3REYXRhKEZYX0lOVDMyIG5JdGVtSW5kZXgsIHZvaWQqIHBEYXRhKQotewotCWlmIChDUFdMX0ljb25MaXN0X0l0ZW0qIHBJdGVtID0gR2V0TGlzdEl0ZW0obkl0ZW1JbmRleCkpCi0JCXBJdGVtLT5TZXREYXRhKHBEYXRhKTsKK3ZvaWQgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpTZXRJY29uRmlsbENvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKSB7CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FDaGlsZHJlbi5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkgeworICAgICAgaWYgKHBDaGlsZC0+R2V0Q2xhc3NOYW1lKCkgPT0gIkNQV0xfSWNvbkxpc3RfSXRlbSIpIHsKKyAgICAgICAgQ1BXTF9JY29uTGlzdF9JdGVtKiBwSXRlbSA9IChDUFdMX0ljb25MaXN0X0l0ZW0qKXBDaGlsZDsKKyAgICAgICAgcEl0ZW0tPlNldEljb25GaWxsQ29sb3IoY29sb3IpOworICAgICAgICBwSXRlbS0+SW52YWxpZGF0ZVJlY3QoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KIH0KIAotdm9pZCBDUFdMX0ljb25MaXN0X0NvbnRlbnQ6OlNldExpc3RJY29uKEZYX0lOVDMyIG5JdGVtSW5kZXgsIEZYX0lOVDMyIG5JY29uSW5kZXgpCi17Ci0JaWYgKENQV0xfSWNvbkxpc3RfSXRlbSogcEl0ZW0gPSBHZXRMaXN0SXRlbShuSXRlbUluZGV4KSkKLQkJcEl0ZW0tPlNldEljb24obkljb25JbmRleCk7CitDUFdMX0ljb25MaXN0OjpDUFdMX0ljb25MaXN0KGludDMyX3Qgbkxpc3RDb3VudCkKKyAgICA6IG1fcExpc3RDb250ZW50KE5VTEwpLCBtX25MaXN0Q291bnQobkxpc3RDb3VudCkge30KKworQ1BXTF9JY29uTGlzdDo6fkNQV0xfSWNvbkxpc3QoKSB7fQorCit2b2lkIENQV0xfSWNvbkxpc3Q6OlJlUG9zQ2hpbGRXbmQoKSB7CisgIENQV0xfV25kOjpSZVBvc0NoaWxkV25kKCk7CisKKyAgaWYgKG1fcExpc3RDb250ZW50KQorICAgIG1fcExpc3RDb250ZW50LT5Nb3ZlKEdldENsaWVudFJlY3QoKSwgVFJVRSwgRkFMU0UpOwogfQogCi12b2lkIENQV0xfSWNvbkxpc3RfQ29udGVudDo6U2V0TGlzdFN0cmluZyhGWF9JTlQzMiBuSXRlbUluZGV4LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKQotewotCWlmIChDUFdMX0ljb25MaXN0X0l0ZW0qIHBJdGVtID0gR2V0TGlzdEl0ZW0obkl0ZW1JbmRleCkpCi0JCXBJdGVtLT5TZXRUZXh0KHN0cik7Cit2b2lkIENQV0xfSWNvbkxpc3Q6OkNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApIHsKKyAgbV9wTGlzdENvbnRlbnQgPSBuZXcgQ1BXTF9JY29uTGlzdF9Db250ZW50KG1fbkxpc3RDb3VudCk7CisKKyAgUFdMX0NSRUFURVBBUkFNIGNjcCA9IGNwOworICBjY3AucFBhcmVudFduZCA9IHRoaXM7CisgIGNjcC5kd0ZsYWdzID0gUFdTX0NISUxEIHwgUFdTX1ZJU0lCTEU7CisgIG1fcExpc3RDb250ZW50LT5DcmVhdGUoY2NwKTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BXTF9JY29uTGlzdF9Db250ZW50OjpHZXRMaXN0U3RyaW5nKEZYX0lOVDMyIG5JdGVtSW5kZXgpIGNvbnN0Ci17Ci0JaWYgKENQV0xfSWNvbkxpc3RfSXRlbSogcEl0ZW0gPSBHZXRMaXN0SXRlbShuSXRlbUluZGV4KSkKLQkJcmV0dXJuIHBJdGVtLT5HZXRUZXh0KCk7Ci0KLQlyZXR1cm4gTCIiOwordm9pZCBDUFdMX0ljb25MaXN0OjpPbkNyZWF0ZWQoKSB7CisgIGlmIChDUFdMX1Njcm9sbEJhciogcFNjcm9sbEJhciA9IEdldFZTY3JvbGxCYXIoKSkgeworICAgIHBTY3JvbGxCYXItPlJlbW92ZUZsYWcoUFdTX0FVVE9UUkFOU1BBUkVOVCk7CisgICAgcFNjcm9sbEJhci0+U2V0VHJhbnNwYXJlbmN5KDI1NSk7CisgICAgcFNjcm9sbEJhci0+U2V0Tm90aWZ5Rm9yZXZlcihUUlVFKTsKKyAgfQogfQogCi12b2lkIENQV0xfSWNvbkxpc3RfQ29udGVudDo6U2V0SWNvbkZpbGxDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikKLXsKLQlmb3IgKEZYX0lOVDMyIGk9MCxzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQl7Ci0JCWlmIChDUFdMX1duZCAqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKQotCQl7Ci0JCQlpZiAocENoaWxkLT5HZXRDbGFzc05hbWUoKSA9PSAiQ1BXTF9JY29uTGlzdF9JdGVtIikKLQkJCXsKLQkJCQlDUFdMX0ljb25MaXN0X0l0ZW0qIHBJdGVtID0gKENQV0xfSWNvbkxpc3RfSXRlbSopcENoaWxkOwotCQkJCXBJdGVtLT5TZXRJY29uRmlsbENvbG9yKGNvbG9yKTsKLQkJCQlwSXRlbS0+SW52YWxpZGF0ZVJlY3QoKTsKLQkJCX0KLQkJfQotCX0KK3ZvaWQgQ1BXTF9JY29uTGlzdDo6T25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3Qgd1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBsUGFyYW0pIHsKKyAgQ1BXTF9XbmQ6Ok9uTm90aWZ5KHBXbmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOwogCisgIGlmICh3UGFyYW0gPT0gU0JUX1ZTQ1JPTEwpIHsKKyAgICBzd2l0Y2ggKG1zZykgeworICAgICAgY2FzZSBQTk1fU0VUU0NST0xMSU5GTzoKKyAgICAgICAgaWYgKFBXTF9TQ1JPTExfSU5GTyogcEluZm8gPSAoUFdMX1NDUk9MTF9JTkZPKilsUGFyYW0pIHsKKyAgICAgICAgICBpZiAoQ1BXTF9TY3JvbGxCYXIqIHBTY3JvbGxCYXIgPSBHZXRWU2Nyb2xsQmFyKCkpIHsKKyAgICAgICAgICAgIGlmIChwSW5mby0+ZkNvbnRlbnRNYXggLSBwSW5mby0+ZkNvbnRlbnRNaW4gPiBwSW5mby0+ZlBsYXRlV2lkdGgpIHsKKyAgICAgICAgICAgICAgaWYgKCFwU2Nyb2xsQmFyLT5Jc1Zpc2libGUoKSkgeworICAgICAgICAgICAgICAgIHBTY3JvbGxCYXItPlNldFZpc2libGUoVFJVRSk7CisgICAgICAgICAgICAgICAgUmVQb3NDaGlsZFduZCgpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpZiAocFNjcm9sbEJhci0+SXNWaXNpYmxlKCkpIHsKKyAgICAgICAgICAgICAgICBwU2Nyb2xsQmFyLT5TZXRWaXNpYmxlKEZBTFNFKTsKKyAgICAgICAgICAgICAgICBSZVBvc0NoaWxkV25kKCk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAobV9wTGlzdENvbnRlbnQpCisgICAgICAgICAgICAgICAgbV9wTGlzdENvbnRlbnQtPlNldFNjcm9sbFBvcyhDUERGX1BvaW50KDAuMGYsIDAuMGYpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcFNjcm9sbEJhci0+T25Ob3RpZnkocFduZCwgUE5NX1NFVFNDUk9MTElORk8sIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgICAgY2FzZSBQTk1fU0NST0xMV0lORE9XOgorICAgICAgICBpZiAobV9wTGlzdENvbnRlbnQpIHsKKyAgICAgICAgICBtX3BMaXN0Q29udGVudC0+U2V0U2Nyb2xsUG9zKENQREZfUG9pbnQoMC4wZiwgKihGWF9GTE9BVCopbFBhcmFtKSk7CisgICAgICAgICAgbV9wTGlzdENvbnRlbnQtPlJlc2V0RmFjZSgpOworICAgICAgICAgIG1fcExpc3RDb250ZW50LT5JbnZhbGlkYXRlUmVjdChOVUxMKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgICBjYXNlIFBOTV9TRVRTQ1JPTExQT1M6CisgICAgICAgIGlmIChDUFdMX1Njcm9sbEJhciogcFNjcm9sbEJhciA9IEdldFZTY3JvbGxCYXIoKSkKKyAgICAgICAgICBwU2Nyb2xsQmFyLT5Pbk5vdGlmeShwV25kLCBQTk1fU0VUU0NST0xMUE9TLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgIH0KIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9JY29uTGlzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotQ1BXTF9JY29uTGlzdDo6Q1BXTF9JY29uTGlzdChGWF9JTlQzMiBuTGlzdENvdW50KSA6IAotCW1fcExpc3RDb250ZW50KE5VTEwpLAotCW1fbkxpc3RDb3VudChuTGlzdENvdW50KQotewordm9pZCBDUFdMX0ljb25MaXN0OjpTZXRTZWxlY3QoaW50MzJfdCBuSW5kZXgpIHsKKyAgbV9wTGlzdENvbnRlbnQtPlNldFNlbGVjdChuSW5kZXgpOwogfQogCi1DUFdMX0ljb25MaXN0Ojp+Q1BXTF9JY29uTGlzdCgpCi17Cit2b2lkIENQV0xfSWNvbkxpc3Q6OlNldFRvcEl0ZW0oaW50MzJfdCBuSW5kZXgpIHsKKyAgbV9wTGlzdENvbnRlbnQtPlNjcm9sbFRvSXRlbShuSW5kZXgpOwogfQogCi12b2lkIENQV0xfSWNvbkxpc3Q6OlJlUG9zQ2hpbGRXbmQoKQotewotCUNQV0xfV25kOjpSZVBvc0NoaWxkV25kKCk7Ci0KLQlpZiAobV9wTGlzdENvbnRlbnQpCi0JCW1fcExpc3RDb250ZW50LT5Nb3ZlKEdldENsaWVudFJlY3QoKSwgVFJVRSwgRkFMU0UpOworaW50MzJfdCBDUFdMX0ljb25MaXN0OjpHZXRTZWxlY3QoKSBjb25zdCB7CisgIHJldHVybiBtX3BMaXN0Q29udGVudC0+R2V0U2VsZWN0KCk7CiB9CiAKLXZvaWQgQ1BXTF9JY29uTGlzdDo6Q3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApCi17Ci0JbV9wTGlzdENvbnRlbnQgPSBuZXcgQ1BXTF9JY29uTGlzdF9Db250ZW50KG1fbkxpc3RDb3VudCk7Ci0KLQlQV0xfQ1JFQVRFUEFSQU0gY2NwID0gY3A7Ci0JY2NwLnBQYXJlbnRXbmQgPSB0aGlzOwotCWNjcC5kd0ZsYWdzID0gUFdTX0NISUxEIHwgUFdTX1ZJU0lCTEU7Ci0JbV9wTGlzdENvbnRlbnQtPkNyZWF0ZShjY3ApOwordm9pZCBDUFdMX0ljb25MaXN0OjpTZXROb3RpZnkoSVBXTF9JY29uTGlzdF9Ob3RpZnkqIHBOb3RpZnkpIHsKKyAgbV9wTGlzdENvbnRlbnQtPlNldE5vdGlmeShwTm90aWZ5KTsKIH0KIAotdm9pZCBDUFdMX0ljb25MaXN0OjpPbkNyZWF0ZWQoKQotewotCWlmIChDUFdMX1Njcm9sbEJhciogcFNjcm9sbEJhciA9IHRoaXMtPkdldFZTY3JvbGxCYXIoKSkKLQl7Ci0JCXBTY3JvbGxCYXItPlJlbW92ZUZsYWcoUFdTX0FVVE9UUkFOU1BBUkVOVCk7Ci0JCXBTY3JvbGxCYXItPlNldFRyYW5zcGFyZW5jeSgyNTUpOwotCQlwU2Nyb2xsQmFyLT5TZXROb3RpZnlGb3JldmVyKFRSVUUpOwotCX0KK3ZvaWQgQ1BXTF9JY29uTGlzdDo6RW5hYmxlTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSkgeworICBtX3BMaXN0Q29udGVudC0+RW5hYmxlTm90aWZ5KGJOb3RpZnkpOwogfQogCi12b2lkIENQV0xfSWNvbkxpc3Q6Ok9uTm90aWZ5KENQV0xfV25kKiBwV25kLCBGWF9EV09SRCBtc2csIEZYX0lOVFBUUiB3UGFyYW0sIEZYX0lOVFBUUiBsUGFyYW0pCi17Ci0JQ1BXTF9XbmQ6Ok9uTm90aWZ5KHBXbmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOwotCi0JaWYgKHdQYXJhbSA9PSBTQlRfVlNDUk9MTCkKLQl7CQkKLQkJc3dpdGNoIChtc2cpCi0JCXsKLQkJY2FzZSBQTk1fU0VUU0NST0xMSU5GTzoKLQkJCWlmIChQV0xfU0NST0xMX0lORk8qIHBJbmZvID0gKFBXTF9TQ1JPTExfSU5GTyopbFBhcmFtKQotCQkJewotCQkJCWlmIChDUFdMX1Njcm9sbEJhciogcFNjcm9sbEJhciA9IHRoaXMtPkdldFZTY3JvbGxCYXIoKSkKLQkJCQl7Ci0JCQkJCWlmIChwSW5mby0+ZkNvbnRlbnRNYXggLSBwSW5mby0+ZkNvbnRlbnRNaW4gPiBwSW5mby0+ZlBsYXRlV2lkdGgpCi0JCQkJCXsKLQkJCQkJCWlmICghcFNjcm9sbEJhci0+SXNWaXNpYmxlKCkpCi0JCQkJCQl7Ci0JCQkJCQkJcFNjcm9sbEJhci0+U2V0VmlzaWJsZShUUlVFKTsKLQkJCQkJCQlSZVBvc0NoaWxkV25kKCk7CQkJCi0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlpZiAocFNjcm9sbEJhci0+SXNWaXNpYmxlKCkpCi0JCQkJCQl7Ci0JCQkJCQkJcFNjcm9sbEJhci0+U2V0VmlzaWJsZShGQUxTRSk7Ci0JCQkJCQkJUmVQb3NDaGlsZFduZCgpOwotCQkJCQkJfQotCi0JCQkJCQlpZiAobV9wTGlzdENvbnRlbnQpCi0JCQkJCQkJbV9wTGlzdENvbnRlbnQtPlNldFNjcm9sbFBvcyhDUERGX1BvaW50KDAuMGYsMC4wZikpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlwU2Nyb2xsQmFyLT5Pbk5vdGlmeShwV25kLFBOTV9TRVRTQ1JPTExJTkZPLHdQYXJhbSxsUGFyYW0pOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJY2FzZSBQTk1fU0NST0xMV0lORE9XOgotCQkJaWYgKG1fcExpc3RDb250ZW50KQotCQkJewotCQkJCW1fcExpc3RDb250ZW50LT5TZXRTY3JvbGxQb3MoQ1BERl9Qb2ludCgwLjBmLCAqKEZYX0ZMT0FUKilsUGFyYW0pKTsKLQkJCQltX3BMaXN0Q29udGVudC0+UmVzZXRGYWNlKCk7Ci0JCQkJbV9wTGlzdENvbnRlbnQtPkludmFsaWRhdGVSZWN0KE5VTEwpOwotCQkJfQotCQkJcmV0dXJuOwotCQljYXNlIFBOTV9TRVRTQ1JPTExQT1M6Ci0JCQlpZiAoQ1BXTF9TY3JvbGxCYXIqIHBTY3JvbGxCYXIgPSB0aGlzLT5HZXRWU2Nyb2xsQmFyKCkpCi0JCQkJcFNjcm9sbEJhci0+T25Ob3RpZnkocFduZCxQTk1fU0VUU0NST0xMUE9TLHdQYXJhbSxsUGFyYW0pOwotCQkJcmV0dXJuOwotCQl9Ci0JfQordm9pZCBDUFdMX0ljb25MaXN0OjpTZXRMaXN0RGF0YShpbnQzMl90IG5JdGVtSW5kZXgsIHZvaWQqIHBEYXRhKSB7CisgIG1fcExpc3RDb250ZW50LT5TZXRMaXN0RGF0YShuSXRlbUluZGV4LCBwRGF0YSk7CiB9CiAKLXZvaWQgQ1BXTF9JY29uTGlzdDo6U2V0U2VsZWN0KEZYX0lOVDMyIG5JbmRleCkKLXsKLQltX3BMaXN0Q29udGVudC0+U2V0U2VsZWN0KG5JbmRleCk7Cit2b2lkIENQV0xfSWNvbkxpc3Q6OlNldExpc3RJY29uKGludDMyX3Qgbkl0ZW1JbmRleCwgaW50MzJfdCBuSWNvbkluZGV4KSB7CisgIG1fcExpc3RDb250ZW50LT5TZXRMaXN0SWNvbihuSXRlbUluZGV4LCBuSWNvbkluZGV4KTsKIH0KIAotdm9pZCBDUFdMX0ljb25MaXN0OjpTZXRUb3BJdGVtKEZYX0lOVDMyIG5JbmRleCkKLXsKLQltX3BMaXN0Q29udGVudC0+U2Nyb2xsVG9JdGVtKG5JbmRleCk7Cit2b2lkIENQV0xfSWNvbkxpc3Q6OlNldExpc3RTdHJpbmcoaW50MzJfdCBuSXRlbUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIHsKKyAgbV9wTGlzdENvbnRlbnQtPlNldExpc3RTdHJpbmcobkl0ZW1JbmRleCwgc3RyKTsKIH0KIAotRlhfSU5UMzIgQ1BXTF9JY29uTGlzdDo6R2V0U2VsZWN0KCkgY29uc3QKLXsKLQlyZXR1cm4gbV9wTGlzdENvbnRlbnQtPkdldFNlbGVjdCgpOworQ0ZYX1dpZGVTdHJpbmcgQ1BXTF9JY29uTGlzdDo6R2V0TGlzdFN0cmluZyhpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcExpc3RDb250ZW50LT5HZXRMaXN0U3RyaW5nKG5JdGVtSW5kZXgpOwogfQogCi12b2lkIENQV0xfSWNvbkxpc3Q6OlNldE5vdGlmeShJUFdMX0ljb25MaXN0X05vdGlmeSogcE5vdGlmeSkKLXsKLQltX3BMaXN0Q29udGVudC0+U2V0Tm90aWZ5KHBOb3RpZnkpOwordm9pZCBDUFdMX0ljb25MaXN0OjpTZXRJY29uRmlsbENvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKSB7CisgIG1fcExpc3RDb250ZW50LT5TZXRJY29uRmlsbENvbG9yKGNvbG9yKTsKIH0KIAotdm9pZCBDUFdMX0ljb25MaXN0OjpFbmFibGVOb3RpZnkoRlhfQk9PTCBiTm90aWZ5KQotewotCW1fcExpc3RDb250ZW50LT5FbmFibGVOb3RpZnkoYk5vdGlmeSk7CitGWF9CT09MIENQV0xfSWNvbkxpc3Q6Ok9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSB7CisgIENQREZfUG9pbnQgcHRTY3JvbGwgPSBtX3BMaXN0Q29udGVudC0+R2V0U2Nyb2xsUG9zKCk7CisgIENQREZfUmVjdCByY1Njcm9sbCA9IG1fcExpc3RDb250ZW50LT5HZXRTY3JvbGxBcmVhKCk7CisgIENQREZfUmVjdCByY0NvbnRlbnRzID0gbV9wTGlzdENvbnRlbnQtPkdldENsaWVudFJlY3QoKTsKKworICBpZiAocmNTY3JvbGwudG9wIC0gcmNTY3JvbGwuYm90dG9tID4gcmNDb250ZW50cy5IZWlnaHQoKSkgeworICAgIENQREZfUG9pbnQgcHROZXcgPSBwdFNjcm9sbDsKKworICAgIGlmICh6RGVsdGEgPiAwKQorICAgICAgcHROZXcueSArPSAzMDsKKyAgICBlbHNlCisgICAgICBwdE5ldy55IC09IDMwOworCisgICAgaWYgKHB0TmV3LnkgPiByY1Njcm9sbC50b3ApCisgICAgICBwdE5ldy55ID0gcmNTY3JvbGwudG9wOworICAgIGlmIChwdE5ldy55IDwgcmNTY3JvbGwuYm90dG9tICsgcmNDb250ZW50cy5IZWlnaHQoKSkKKyAgICAgIHB0TmV3LnkgPSByY1Njcm9sbC5ib3R0b20gKyByY0NvbnRlbnRzLkhlaWdodCgpOworICAgIGlmIChwdE5ldy55IDwgcmNTY3JvbGwuYm90dG9tKQorICAgICAgcHROZXcueSA9IHJjU2Nyb2xsLmJvdHRvbTsKKworICAgIGlmIChwdE5ldy55ICE9IHB0U2Nyb2xsLnkpIHsKKyAgICAgIG1fcExpc3RDb250ZW50LT5TZXRTY3JvbGxQb3MocHROZXcpOworICAgICAgbV9wTGlzdENvbnRlbnQtPlJlc2V0RmFjZSgpOworICAgICAgbV9wTGlzdENvbnRlbnQtPkludmFsaWRhdGVSZWN0KE5VTEwpOworCisgICAgICBpZiAoQ1BXTF9TY3JvbGxCYXIqIHBTY3JvbGxCYXIgPSBHZXRWU2Nyb2xsQmFyKCkpCisgICAgICAgIHBTY3JvbGxCYXItPk9uTm90aWZ5KHRoaXMsIFBOTV9TRVRTQ1JPTExQT1MsIFNCVF9WU0NST0xMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50cHRyX3QpJnB0TmV3LnkpOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKworICByZXR1cm4gRkFMU0U7CiB9Ci0KLXZvaWQgQ1BXTF9JY29uTGlzdDo6U2V0TGlzdERhdGEoRlhfSU5UMzIgbkl0ZW1JbmRleCwgdm9pZCogcERhdGEpCi17Ci0JbV9wTGlzdENvbnRlbnQtPlNldExpc3REYXRhKG5JdGVtSW5kZXgsIHBEYXRhKTsKLX0KLQotdm9pZCBDUFdMX0ljb25MaXN0OjpTZXRMaXN0SWNvbihGWF9JTlQzMiBuSXRlbUluZGV4LCBGWF9JTlQzMiBuSWNvbkluZGV4KQotewotCW1fcExpc3RDb250ZW50LT5TZXRMaXN0SWNvbihuSXRlbUluZGV4LCBuSWNvbkluZGV4KTsKLX0KLQotdm9pZCBDUFdMX0ljb25MaXN0OjpTZXRMaXN0U3RyaW5nKEZYX0lOVDMyIG5JdGVtSW5kZXgsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpCi17Ci0JbV9wTGlzdENvbnRlbnQtPlNldExpc3RTdHJpbmcobkl0ZW1JbmRleCwgc3RyKTsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ1BXTF9JY29uTGlzdDo6R2V0TGlzdFN0cmluZyhGWF9JTlQzMiBuSXRlbUluZGV4KSBjb25zdAotewotCXJldHVybiBtX3BMaXN0Q29udGVudC0+R2V0TGlzdFN0cmluZyhuSXRlbUluZGV4KTsKLX0KLQotdm9pZCBDUFdMX0ljb25MaXN0OjpTZXRJY29uRmlsbENvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKQotewotCW1fcExpc3RDb250ZW50LT5TZXRJY29uRmlsbENvbG9yKGNvbG9yKTsKLX0KLQotRlhfQk9PTAlDUFdMX0ljb25MaXN0OjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQotewotCUNQREZfUG9pbnQgcHRTY3JvbGwgPSBtX3BMaXN0Q29udGVudC0+R2V0U2Nyb2xsUG9zKCk7Ci0JQ1BERl9SZWN0IHJjU2Nyb2xsID0gbV9wTGlzdENvbnRlbnQtPkdldFNjcm9sbEFyZWEoKTsKLQlDUERGX1JlY3QgcmNDb250ZW50cyA9IG1fcExpc3RDb250ZW50LT5HZXRDbGllbnRSZWN0KCk7Ci0KLQlpZiAocmNTY3JvbGwudG9wIC0gcmNTY3JvbGwuYm90dG9tID4gcmNDb250ZW50cy5IZWlnaHQoKSkKLQl7Ci0JCUNQREZfUG9pbnQgcHROZXcgPSBwdFNjcm9sbDsKLQotCQlpZiAoekRlbHRhID4gMCkKLQkJCXB0TmV3LnkgKz0gMzA7Ci0JCWVsc2UKLQkJCXB0TmV3LnkgLT0gMzA7Ci0KLQkJaWYgKHB0TmV3LnkgPiByY1Njcm9sbC50b3ApCi0JCQlwdE5ldy55ID0gcmNTY3JvbGwudG9wOwotCQlpZiAocHROZXcueSA8IHJjU2Nyb2xsLmJvdHRvbSArIHJjQ29udGVudHMuSGVpZ2h0KCkpCi0JCQlwdE5ldy55ID0gcmNTY3JvbGwuYm90dG9tICsgcmNDb250ZW50cy5IZWlnaHQoKTsKLQkJaWYgKHB0TmV3LnkgPCByY1Njcm9sbC5ib3R0b20pCi0JCQlwdE5ldy55ID0gcmNTY3JvbGwuYm90dG9tOwotCi0JCWlmIChwdE5ldy55ICE9IHB0U2Nyb2xsLnkpCi0JCXsKLQkJCW1fcExpc3RDb250ZW50LT5TZXRTY3JvbGxQb3MocHROZXcpOwotCQkJbV9wTGlzdENvbnRlbnQtPlJlc2V0RmFjZSgpOwotCQkJbV9wTGlzdENvbnRlbnQtPkludmFsaWRhdGVSZWN0KE5VTEwpOwotCQkJCi0JCQlpZiAoQ1BXTF9TY3JvbGxCYXIqIHBTY3JvbGxCYXIgPSB0aGlzLT5HZXRWU2Nyb2xsQmFyKCkpCi0JCQkJcFNjcm9sbEJhci0+T25Ob3RpZnkodGhpcywgUE5NX1NFVFNDUk9MTFBPUywgU0JUX1ZTQ1JPTEwsIChGWF9JTlRQVFIpJnB0TmV3LnkpOwotCi0JCQlyZXR1cm4gVFJVRTsKLQkJfQotCX0KLQotCXJldHVybiBGQUxTRTsKLX0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9MYWJlbC5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0xhYmVsLmNwcAppbmRleCAxODU4MGYzLi40ZjhhMGRkIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0xhYmVsLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0xhYmVsLmNwcApAQCAtMSwxODcgKzEsMTUwIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QREZXaW5kb3cuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfV25kLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0xhYmVsLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1V0aWxzLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGFiZWwuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oIgogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfTGFiZWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLUNQV0xfTGFiZWw6OkNQV0xfTGFiZWwoKSA6IG1fcEVkaXQoTlVMTCkKLXsKLQltX3BFZGl0ID0gSUZYX0VkaXQ6Ok5ld0VkaXQoKTsKLQotCUFTU0VSVChtX3BFZGl0ICE9IE5VTEwpOworQ1BXTF9MYWJlbDo6Q1BXTF9MYWJlbCgpIDogbV9wRWRpdChOVUxMKSB7CisgIG1fcEVkaXQgPSBJRlhfRWRpdDo6TmV3RWRpdCgpOworICBBU1NFUlQobV9wRWRpdCk7CiB9CiAKLUNQV0xfTGFiZWw6On5DUFdMX0xhYmVsKCkKLXsKLQlJRlhfRWRpdDo6RGVsRWRpdChtX3BFZGl0KTsKK0NQV0xfTGFiZWw6On5DUFdMX0xhYmVsKCkgeworICBJRlhfRWRpdDo6RGVsRWRpdChtX3BFZGl0KTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9MYWJlbDo6R2V0Q2xhc3NOYW1lKCkgY29uc3QKLXsKLQlyZXR1cm4gIkNQV0xfTGFiZWwiOworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9MYWJlbDo6R2V0Q2xhc3NOYW1lKCkgY29uc3QgeworICByZXR1cm4gIkNQV0xfTGFiZWwiOwogfQogCi12b2lkIENQV0xfTGFiZWw6Ok9uQ3JlYXRlZCgpCi17Ci0JU2V0UGFyYW1CeUZsYWcoKTsKLQlTZXRGb250U2l6ZSh0aGlzLT5HZXRDcmVhdGlvblBhcmFtKCkuZkZvbnRTaXplKTsKK3ZvaWQgQ1BXTF9MYWJlbDo6T25DcmVhdGVkKCkgeworICBTZXRQYXJhbUJ5RmxhZygpOworICBTZXRGb250U2l6ZShHZXRDcmVhdGlvblBhcmFtKCkuZkZvbnRTaXplKTsKIAotCW1fcEVkaXQtPlNldEZvbnRNYXAodGhpcy0+R2V0Rm9udE1hcCgpKTsKLQltX3BFZGl0LT5Jbml0aWFsaXplKCk7CisgIG1fcEVkaXQtPlNldEZvbnRNYXAoR2V0Rm9udE1hcCgpKTsKKyAgbV9wRWRpdC0+SW5pdGlhbGl6ZSgpOwogCi0JaWYgKEhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykpCi0JewotCQlTZXRDbGlwUmVjdChDUERGX1JlY3QoMC4wZiwwLjBmLDAuMGYsMC4wZikpOwotCQltX3BFZGl0LT5TZXRUZXh0T3ZlcmZsb3coVFJVRSk7Ci0JfQorICBpZiAoSGFzRmxhZyhQRVNfVEVYVE9WRVJGTE9XKSkgeworICAgIFNldENsaXBSZWN0KENQREZfUmVjdCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKSk7CisgICAgbV9wRWRpdC0+U2V0VGV4dE92ZXJmbG93KFRSVUUpOworICB9CiB9CiAKLXZvaWQgQ1BXTF9MYWJlbDo6U2V0VGV4dChGWF9MUENXU1RSIGNzVGV4dCkKLXsKLQltX3BFZGl0LT5TZXRUZXh0KGNzVGV4dCk7Cit2b2lkIENQV0xfTGFiZWw6OlNldFRleHQoY29uc3QgRlhfV0NIQVIqIGNzVGV4dCkgeworICBtX3BFZGl0LT5TZXRUZXh0KGNzVGV4dCk7CiB9CiAKLXZvaWQgQ1BXTF9MYWJlbDo6UmVQb3NDaGlsZFduZCgpCi17Ci0JbV9wRWRpdC0+U2V0UGxhdGVSZWN0KEdldENsaWVudFJlY3QoKSk7Cit2b2lkIENQV0xfTGFiZWw6OlJlUG9zQ2hpbGRXbmQoKSB7CisgIG1fcEVkaXQtPlNldFBsYXRlUmVjdChHZXRDbGllbnRSZWN0KCkpOwogfQogCi12b2lkIENQV0xfTGFiZWw6OlNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkKLXsKLQltX3BFZGl0LT5TZXRGb250U2l6ZShmRm9udFNpemUpOwordm9pZCBDUFdMX0xhYmVsOjpTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpIHsKKyAgbV9wRWRpdC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKIH0KIAotRlhfRkxPQVQgQ1BXTF9MYWJlbDo6R2V0Rm9udFNpemUoKSBjb25zdAotewotCXJldHVybiBtX3BFZGl0LT5HZXRGb250U2l6ZSgpOworRlhfRkxPQVQgQ1BXTF9MYWJlbDo6R2V0Rm9udFNpemUoKSBjb25zdCB7CisgIHJldHVybiBtX3BFZGl0LT5HZXRGb250U2l6ZSgpOwogfQogCi12b2lkIENQV0xfTGFiZWw6OlNldFBhcmFtQnlGbGFnKCkKLXsJCi0JaWYgKEhhc0ZsYWcoUEVTX0xFRlQpKQotCXsKLQkJbV9wRWRpdC0+U2V0QWxpZ25tZW50SCgwKTsKLQl9Ci0JZWxzZSBpZiAoSGFzRmxhZyhQRVNfTUlERExFKSkKLQl7Ci0JCW1fcEVkaXQtPlNldEFsaWdubWVudEgoMSk7Ci0JfQotCWVsc2UgaWYgKEhhc0ZsYWcoUEVTX1JJR0hUKSkKLQl7Ci0JCW1fcEVkaXQtPlNldEFsaWdubWVudEgoMik7Ci0JfQotCWVsc2UKLQl7Ci0JCW1fcEVkaXQtPlNldEFsaWdubWVudEgoMCk7Ci0JfQordm9pZCBDUFdMX0xhYmVsOjpTZXRQYXJhbUJ5RmxhZygpIHsKKyAgaWYgKEhhc0ZsYWcoUEVTX0xFRlQpKSB7CisgICAgbV9wRWRpdC0+U2V0QWxpZ25tZW50SCgwKTsKKyAgfSBlbHNlIGlmIChIYXNGbGFnKFBFU19NSURETEUpKSB7CisgICAgbV9wRWRpdC0+U2V0QWxpZ25tZW50SCgxKTsKKyAgfSBlbHNlIGlmIChIYXNGbGFnKFBFU19SSUdIVCkpIHsKKyAgICBtX3BFZGl0LT5TZXRBbGlnbm1lbnRIKDIpOworICB9IGVsc2UgeworICAgIG1fcEVkaXQtPlNldEFsaWdubWVudEgoMCk7CisgIH0KIAotCWlmIChIYXNGbGFnKFBFU19UT1ApKQotCXsKLQkJbV9wRWRpdC0+U2V0QWxpZ25tZW50VigwKTsKLQl9Ci0JZWxzZSBpZiAoSGFzRmxhZyhQRVNfQ0VOVEVSKSkKLQl7Ci0JCW1fcEVkaXQtPlNldEFsaWdubWVudFYoMSk7Ci0JfQotCWVsc2UgaWYgKEhhc0ZsYWcoUEVTX0JPVFRPTSkpCi0JewotCQltX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDIpOwotCX0KLQllbHNlCi0JewotCQltX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDApOwotCX0KKyAgaWYgKEhhc0ZsYWcoUEVTX1RPUCkpIHsKKyAgICBtX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDApOworICB9IGVsc2UgaWYgKEhhc0ZsYWcoUEVTX0NFTlRFUikpIHsKKyAgICBtX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDEpOworICB9IGVsc2UgaWYgKEhhc0ZsYWcoUEVTX0JPVFRPTSkpIHsKKyAgICBtX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDIpOworICB9IGVsc2UgeworICAgIG1fcEVkaXQtPlNldEFsaWdubWVudFYoMCk7CisgIH0KIAotCWlmIChIYXNGbGFnKFBFU19QQVNTV09SRCkpCi0JewotCQltX3BFZGl0LT5TZXRQYXNzd29yZENoYXIoJyonKTsKLQl9CisgIGlmIChIYXNGbGFnKFBFU19QQVNTV09SRCkpIHsKKyAgICBtX3BFZGl0LT5TZXRQYXNzd29yZENoYXIoJyonKTsKKyAgfQogCi0JbV9wRWRpdC0+U2V0TXVsdGlMaW5lKEhhc0ZsYWcoUEVTX01VTFRJTElORSkpOwotCW1fcEVkaXQtPlNldEF1dG9SZXR1cm4oSGFzRmxhZyhQRVNfQVVUT1JFVFVSTikpOwotCW1fcEVkaXQtPlNldEF1dG9Gb250U2l6ZShIYXNGbGFnKFBXU19BVVRPRk9OVFNJWkUpKTsKLQltX3BFZGl0LT5TZXRBdXRvU2Nyb2xsKEhhc0ZsYWcoUEVTX0FVVE9TQ1JPTEwpKTsKKyAgbV9wRWRpdC0+U2V0TXVsdGlMaW5lKEhhc0ZsYWcoUEVTX01VTFRJTElORSkpOworICBtX3BFZGl0LT5TZXRBdXRvUmV0dXJuKEhhc0ZsYWcoUEVTX0FVVE9SRVRVUk4pKTsKKyAgbV9wRWRpdC0+U2V0QXV0b0ZvbnRTaXplKEhhc0ZsYWcoUFdTX0FVVE9GT05UU0laRSkpOworICBtX3BFZGl0LT5TZXRBdXRvU2Nyb2xsKEhhc0ZsYWcoUEVTX0FVVE9TQ1JPTEwpKTsKIH0KIAotdm9pZCBDUFdMX0xhYmVsOjpEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSkKLXsKLQlDUFdMX1duZDo6RHJhd1RoaXNBcHBlYXJhbmNlKHBEZXZpY2UscFVzZXIyRGV2aWNlKTsKK3ZvaWQgQ1BXTF9MYWJlbDo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UpIHsKKyAgQ1BXTF9XbmQ6OkRyYXdUaGlzQXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UpOwogCi0JR2V0Q2xpZW50UmVjdCgpOworICBHZXRDbGllbnRSZWN0KCk7CiAKLQlDUERGX1JlY3QgcmNDbGlwOwotCUNQVlRfV29yZFJhbmdlIHdyUmFuZ2UgPSBtX3BFZGl0LT5HZXRWaXNpYmxlV29yZFJhbmdlKCk7Ci0JQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSA9IE5VTEw7CisgIENQREZfUmVjdCByY0NsaXA7CisgIENQVlRfV29yZFJhbmdlIHdyUmFuZ2UgPSBtX3BFZGl0LT5HZXRWaXNpYmxlV29yZFJhbmdlKCk7CisgIENQVlRfV29yZFJhbmdlKiBwUmFuZ2UgPSBOVUxMOwogCi0JaWYgKCFIYXNGbGFnKFBFU19URVhUT1ZFUkZMT1cpKQotCXsKLQkJcmNDbGlwID0gR2V0Q2xpZW50UmVjdCgpOwotCQlwUmFuZ2UgPSAmd3JSYW5nZTsKLQl9Ci1JRlhfU3lzdGVtSGFuZGxlciogcFN5c0hhbmRsZXIgPSBHZXRTeXN0ZW1IYW5kbGVyKCk7Ci0JSUZYX0VkaXQ6OkRyYXdFZGl0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgbV9wRWRpdCwKLQkJQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dENvbG9yKCksIHRoaXMtPkdldFRyYW5zcGFyZW5jeSgpKSwKLQkJQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dFN0cm9rZUNvbG9yKCksIHRoaXMtPkdldFRyYW5zcGFyZW5jeSgpKSwKLQkJcmNDbGlwLCBDUERGX1BvaW50KDAuMGYsMC4wZiksIHBSYW5nZSxwU3lzSGFuZGxlciwgTlVMTCk7CisgIGlmICghSGFzRmxhZyhQRVNfVEVYVE9WRVJGTE9XKSkgeworICAgIHJjQ2xpcCA9IEdldENsaWVudFJlY3QoKTsKKyAgICBwUmFuZ2UgPSAmd3JSYW5nZTsKKyAgfQorICBJRlhfU3lzdGVtSGFuZGxlciogcFN5c0hhbmRsZXIgPSBHZXRTeXN0ZW1IYW5kbGVyKCk7CisgIElGWF9FZGl0OjpEcmF3RWRpdCgKKyAgICAgIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgbV9wRWRpdCwKKyAgICAgIENQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKEdldFRleHRDb2xvcigpLCBHZXRUcmFuc3BhcmVuY3koKSksCisgICAgICBDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0U3Ryb2tlQ29sb3IoKSwgR2V0VHJhbnNwYXJlbmN5KCkpLAorICAgICAgcmNDbGlwLCBDUERGX1BvaW50KDAuMGYsIDAuMGYpLCBwUmFuZ2UsIHBTeXNIYW5kbGVyLCBOVUxMKTsKIH0KIAotdm9pZCBDUFdMX0xhYmVsOjpTZXRIb3J6U2NhbGUoRlhfSU5UMzIgbkhvcnpTY2FsZSkKLXsKLQltX3BFZGl0LT5TZXRIb3J6U2NhbGUobkhvcnpTY2FsZSk7Cit2b2lkIENQV0xfTGFiZWw6OlNldEhvcnpTY2FsZShpbnQzMl90IG5Ib3J6U2NhbGUpIHsKKyAgbV9wRWRpdC0+U2V0SG9yelNjYWxlKG5Ib3J6U2NhbGUpOwogfQogCi12b2lkIENQV0xfTGFiZWw6OlNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlKQotewotCW1fcEVkaXQtPlNldENoYXJTcGFjZShmQ2hhclNwYWNlKTsKK3ZvaWQgQ1BXTF9MYWJlbDo6U2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpIHsKKyAgbV9wRWRpdC0+U2V0Q2hhclNwYWNlKGZDaGFyU3BhY2UpOwogfQogCi1DUERGX1JlY3QgQ1BXTF9MYWJlbDo6R2V0Q29udGVudFJlY3QoKSBjb25zdAotewotCXJldHVybiBtX3BFZGl0LT5HZXRDb250ZW50UmVjdCgpOworQ1BERl9SZWN0IENQV0xfTGFiZWw6OkdldENvbnRlbnRSZWN0KCkgY29uc3QgeworICByZXR1cm4gbV9wRWRpdC0+R2V0Q29udGVudFJlY3QoKTsKIH0KIAotdm9pZCBDUFdMX0xhYmVsOjpHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKQotewotCUNQV0xfV25kOjpHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShzQXBwU3RyZWFtKTsKK3ZvaWQgQ1BXTF9MYWJlbDo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmJiBzQXBwU3RyZWFtKSB7CisgIENQV0xfV25kOjpHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShzQXBwU3RyZWFtKTsKIAotCXNBcHBTdHJlYW0gPDwgR2V0VGV4dEFwcGVhcmFuY2VTdHJlYW0oQ1BERl9Qb2ludCgwLjBmLCAwLjBmKSk7CisgIHNBcHBTdHJlYW0gPDwgR2V0VGV4dEFwcGVhcmFuY2VTdHJlYW0oQ1BERl9Qb2ludCgwLjBmLCAwLjBmKSk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfTGFiZWw6OkdldFRleHRBcHBlYXJhbmNlU3RyZWFtKGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCkgY29uc3QKLXsKLQlDRlhfQnl0ZVRleHRCdWYgc1JldDsKLQlDRlhfQnl0ZVN0cmluZyBzRWRpdCA9IENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0obV9wRWRpdCxwdE9mZnNldCk7Ci0JCi0JaWYgKHNFZGl0LkdldExlbmd0aCgpID4gMCkKLQl7Ci0JCXNSZXQgPDwgIkJUXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldFRleHRDb2xvcigpKSA8PCBzRWRpdCA8PCAiRVRcbiI7Ci0JfQorQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9MYWJlbDo6R2V0VGV4dEFwcGVhcmFuY2VTdHJlYW0oCisgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQpIGNvbnN0IHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNSZXQ7CisgIENGWF9CeXRlU3RyaW5nIHNFZGl0ID0gQ1BXTF9VdGlsczo6R2V0RWRpdEFwcFN0cmVhbShtX3BFZGl0LCBwdE9mZnNldCk7CiAKLQlyZXR1cm4gc1JldC5HZXRCeXRlU3RyaW5nKCk7CisgIGlmIChzRWRpdC5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICBzUmV0IDw8ICJCVFxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRUZXh0Q29sb3IoKSkgPDwgc0VkaXQKKyAgICAgICAgIDw8ICJFVFxuIjsKKyAgfQorCisgIHJldHVybiBzUmV0LkdldEJ5dGVTdHJpbmcoKTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BXTF9MYWJlbDo6R2V0VGV4dCgpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fcEVkaXQtPkdldFRleHQoKTsKK0NGWF9XaWRlU3RyaW5nIENQV0xfTGFiZWw6OkdldFRleHQoKSBjb25zdCB7CisgIHJldHVybiBtX3BFZGl0LT5HZXRUZXh0KCk7CiB9CiAKLXZvaWQgQ1BXTF9MYWJlbDo6U2V0TGltaXRDaGFyKEZYX0lOVDMyIG5MaW1pdENoYXIpCi17Ci0JbV9wRWRpdC0+U2V0TGltaXRDaGFyKG5MaW1pdENoYXIpOwordm9pZCBDUFdMX0xhYmVsOjpTZXRMaW1pdENoYXIoaW50MzJfdCBuTGltaXRDaGFyKSB7CisgIG1fcEVkaXQtPlNldExpbWl0Q2hhcihuTGltaXRDaGFyKTsKIH0KIAotRlhfSU5UMzIgQ1BXTF9MYWJlbDo6R2V0VG90YWxXb3JkcygpCi17Ci0JaWYgKG1fcEVkaXQpCi0JCXJldHVybiBtX3BFZGl0LT5HZXRUb3RhbFdvcmRzKCk7CitpbnQzMl90IENQV0xfTGFiZWw6OkdldFRvdGFsV29yZHMoKSB7CisgIGlmIChtX3BFZGl0KQorICAgIHJldHVybiBtX3BFZGl0LT5HZXRUb3RhbFdvcmRzKCk7CiAKLQlyZXR1cm4gMDsKKyAgcmV0dXJuIDA7CiB9Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTGlzdEJveC5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0xpc3RCb3guY3BwCmluZGV4IDAzNWQ4MTkuLmUzZTgzZjkgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTGlzdEJveC5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9MaXN0Qm94LmNwcApAQCAtMSw2MzIgKzEsNTMyIEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QREZXaW5kb3cuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfV25kLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0xpc3RCb3guaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfVXRpbHMuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU2Nyb2xsQmFyLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXQuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9MaXN0Qm94LmgiCiAKLSNkZWZpbmUgSXNGbG9hdFplcm8oZikJCQkJCQkoKGYpIDwgMC4wMDAxICYmIChmKSA+IC0wLjAwMDEpCi0jZGVmaW5lIElzRmxvYXRCaWdnZXIoZmEsZmIpCQkJCSgoZmEpID4gKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQotI2RlZmluZSBJc0Zsb2F0U21hbGxlcihmYSxmYikJCQkJKChmYSkgPCAoZmIpICYmICFJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkpCi0jZGVmaW5lIElzRmxvYXRFcXVhbChmYSxmYikJCQkJCUlzRmxvYXRaZXJvKChmYSktKGZiKSkKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9FZGl0LmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRWRpdEN0cmwuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2Z3bGV2ZW50LmgiCiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0xpc3RfTm90aWZ5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIElzRmxvYXRaZXJvKGYpICgoZikgPCAwLjAwMDEgJiYgKGYpID4gLTAuMDAwMSkKKyNkZWZpbmUgSXNGbG9hdEJpZ2dlcihmYSwgZmIpICgoZmEpID4gKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQorI2RlZmluZSBJc0Zsb2F0U21hbGxlcihmYSwgZmIpICgoZmEpIDwgKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQorI2RlZmluZSBJc0Zsb2F0RXF1YWwoZmEsIGZiKSBJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkKIAotQ1BXTF9MaXN0X05vdGlmeTo6Q1BXTF9MaXN0X05vdGlmeShDUFdMX0xpc3RCb3gqIHBMaXN0KSA6IG1fcExpc3QocExpc3QpCi17Ci0JQVNTRVJUKG1fcExpc3QgIT0gTlVMTCk7CitDUFdMX0xpc3RfTm90aWZ5OjpDUFdMX0xpc3RfTm90aWZ5KENQV0xfTGlzdEJveCogcExpc3QpIDogbV9wTGlzdChwTGlzdCkgeworICBBU1NFUlQobV9wTGlzdCk7CiB9CiAKLUNQV0xfTGlzdF9Ob3RpZnk6On5DUFdMX0xpc3RfTm90aWZ5KCkKLXsKK0NQV0xfTGlzdF9Ob3RpZnk6On5DUFdMX0xpc3RfTm90aWZ5KCkge30KKwordm9pZCBDUFdMX0xpc3RfTm90aWZ5OjpJT25TZXRTY3JvbGxJbmZvWShGWF9GTE9BVCBmUGxhdGVNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQbGF0ZU1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNvbnRlbnRNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50TWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU21hbGxTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQmlnU3RlcCkgeworICBQV0xfU0NST0xMX0lORk8gSW5mbzsKKworICBJbmZvLmZQbGF0ZVdpZHRoID0gZlBsYXRlTWF4IC0gZlBsYXRlTWluOworICBJbmZvLmZDb250ZW50TWluID0gZkNvbnRlbnRNaW47CisgIEluZm8uZkNvbnRlbnRNYXggPSBmQ29udGVudE1heDsKKyAgSW5mby5mU21hbGxTdGVwID0gZlNtYWxsU3RlcDsKKyAgSW5mby5mQmlnU3RlcCA9IGZCaWdTdGVwOworCisgIG1fcExpc3QtPk9uTm90aWZ5KG1fcExpc3QsIFBOTV9TRVRTQ1JPTExJTkZPLCBTQlRfVlNDUk9MTCwgKGludHB0cl90KSZJbmZvKTsKKworICBpZiAoQ1BXTF9TY3JvbGxCYXIqIHBTY3JvbGwgPSBtX3BMaXN0LT5HZXRWU2Nyb2xsQmFyKCkpIHsKKyAgICBpZiAoSXNGbG9hdEJpZ2dlcihJbmZvLmZQbGF0ZVdpZHRoLCBJbmZvLmZDb250ZW50TWF4IC0gSW5mby5mQ29udGVudE1pbikgfHwKKyAgICAgICAgSXNGbG9hdEVxdWFsKEluZm8uZlBsYXRlV2lkdGgsIEluZm8uZkNvbnRlbnRNYXggLSBJbmZvLmZDb250ZW50TWluKSkgeworICAgICAgaWYgKHBTY3JvbGwtPklzVmlzaWJsZSgpKSB7CisgICAgICAgIHBTY3JvbGwtPlNldFZpc2libGUoRkFMU0UpOworICAgICAgICBtX3BMaXN0LT5SZVBvc0NoaWxkV25kKCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghcFNjcm9sbC0+SXNWaXNpYmxlKCkpIHsKKyAgICAgICAgcFNjcm9sbC0+U2V0VmlzaWJsZShUUlVFKTsKKyAgICAgICAgbV9wTGlzdC0+UmVQb3NDaGlsZFduZCgpOworICAgICAgfQorICAgIH0KKyAgfQogfQogCi12b2lkIENQV0xfTGlzdF9Ob3RpZnk6OklPblNldFNjcm9sbEluZm9ZKEZYX0ZMT0FUIGZQbGF0ZU1pbiwgRlhfRkxPQVQgZlBsYXRlTWF4LCAKLQkJCQkJCQkJCQkJCUZYX0ZMT0FUIGZDb250ZW50TWluLCBGWF9GTE9BVCBmQ29udGVudE1heCwgCi0JCQkJCQkJCQkJCQlGWF9GTE9BVCBmU21hbGxTdGVwLCBGWF9GTE9BVCBmQmlnU3RlcCkKLXsKLQlQV0xfU0NST0xMX0lORk8gSW5mbzsKLQotCUluZm8uZlBsYXRlV2lkdGggPSBmUGxhdGVNYXggLSBmUGxhdGVNaW47Ci0JSW5mby5mQ29udGVudE1pbiA9IGZDb250ZW50TWluOwotCUluZm8uZkNvbnRlbnRNYXggPSBmQ29udGVudE1heDsKLQlJbmZvLmZTbWFsbFN0ZXAgPSBmU21hbGxTdGVwOwotCUluZm8uZkJpZ1N0ZXAgPSBmQmlnU3RlcDsKLQotCW1fcExpc3QtPk9uTm90aWZ5KG1fcExpc3QsUE5NX1NFVFNDUk9MTElORk8sU0JUX1ZTQ1JPTEwsKEZYX0lOVFBUUikmSW5mbyk7Ci0KLQlpZiAoQ1BXTF9TY3JvbGxCYXIgKiBwU2Nyb2xsID0gbV9wTGlzdC0+R2V0VlNjcm9sbEJhcigpKQotCXsKLQkJaWYgKElzRmxvYXRCaWdnZXIoSW5mby5mUGxhdGVXaWR0aCxJbmZvLmZDb250ZW50TWF4LUluZm8uZkNvbnRlbnRNaW4pCi0JCQl8fCBJc0Zsb2F0RXF1YWwoSW5mby5mUGxhdGVXaWR0aCxJbmZvLmZDb250ZW50TWF4LUluZm8uZkNvbnRlbnRNaW4pKQotCQl7Ci0JCQlpZiAocFNjcm9sbC0+SXNWaXNpYmxlKCkpCi0JCQl7Ci0JCQkJcFNjcm9sbC0+U2V0VmlzaWJsZShGQUxTRSk7Ci0JCQkJbV9wTGlzdC0+UmVQb3NDaGlsZFduZCgpOwotCQkJfQkJCQotCQl9Ci0JCWVsc2UKLQkJewotCQkJaWYgKCFwU2Nyb2xsLT5Jc1Zpc2libGUoKSkKLQkJCXsKLQkJCQlwU2Nyb2xsLT5TZXRWaXNpYmxlKFRSVUUpOwkKLQkJCQltX3BMaXN0LT5SZVBvc0NoaWxkV25kKCk7Ci0JCQl9Ci0JCX0KLQl9CQordm9pZCBDUFdMX0xpc3RfTm90aWZ5OjpJT25TZXRTY3JvbGxQb3NZKEZYX0ZMT0FUIGZ5KSB7CisgIG1fcExpc3QtPk9uTm90aWZ5KG1fcExpc3QsIFBOTV9TRVRTQ1JPTExQT1MsIFNCVF9WU0NST0xMLCAoaW50cHRyX3QpJmZ5KTsKIH0KIAotdm9pZCBDUFdMX0xpc3RfTm90aWZ5OjpJT25TZXRTY3JvbGxQb3NZKEZYX0ZMT0FUIGZ5KQotewotCW1fcExpc3QtPk9uTm90aWZ5KG1fcExpc3QsUE5NX1NFVFNDUk9MTFBPUyxTQlRfVlNDUk9MTCwoRlhfSU5UUFRSKSZmeSk7Cit2b2lkIENQV0xfTGlzdF9Ob3RpZnk6OklPbkludmFsaWRhdGVSZWN0KENQREZfUmVjdCogcFJlY3QpIHsKKyAgbV9wTGlzdC0+SW52YWxpZGF0ZVJlY3QocFJlY3QpOwogfQogCi12b2lkIENQV0xfTGlzdF9Ob3RpZnk6OklPbkludmFsaWRhdGVSZWN0KENQREZfUmVjdCAqIHBSZWN0KQotewotCW1fcExpc3QtPkludmFsaWRhdGVSZWN0KHBSZWN0KTsKK0NQV0xfTGlzdEJveDo6Q1BXTF9MaXN0Qm94KCkKKyAgICA6IG1fcExpc3QoTlVMTCksCisgICAgICBtX3BMaXN0Tm90aWZ5KE5VTEwpLAorICAgICAgbV9iTW91c2VEb3duKEZBTFNFKSwKKyAgICAgIG1fYkhvdmVyU2VsKEZBTFNFKSwKKyAgICAgIG1fcEZpbGxlck5vdGlmeShOVUxMKSB7CisgIG1fcExpc3QgPSBJRlhfTGlzdDo6TmV3TGlzdCgpOwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9MaXN0Qm94IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotQ1BXTF9MaXN0Qm94OjpDUFdMX0xpc3RCb3goKSA6Ci0JbV9wTGlzdChOVUxMKSwKLQltX3BMaXN0Tm90aWZ5KE5VTEwpLAotCW1fYk1vdXNlRG93bihGQUxTRSksCi0JbV9iSG92ZXJTZWwoRkFMU0UpLAotCW1fcEZpbGxlck5vdGlmeShOVUxMKQotewotCW1fcExpc3QgPSBJRlhfTGlzdDo6TmV3TGlzdCgpOwotCi0JQVNTRVJUKG1fcExpc3QgIT0gTlVMTCk7CitDUFdMX0xpc3RCb3g6On5DUFdMX0xpc3RCb3goKSB7CisgIElGWF9MaXN0OjpEZWxMaXN0KG1fcExpc3QpOworICBkZWxldGUgbV9wTGlzdE5vdGlmeTsKKyAgbV9wTGlzdE5vdGlmeSA9IE5VTEw7CiB9CiAKLUNQV0xfTGlzdEJveDo6fkNQV0xfTGlzdEJveCgpCi17Ci0JSUZYX0xpc3Q6OkRlbExpc3QobV9wTGlzdCk7Ci0JCi0JaWYgKG1fcExpc3ROb3RpZnkpCi0JewotCQlkZWxldGUgbV9wTGlzdE5vdGlmeTsKLQkJbV9wTGlzdE5vdGlmeSA9IE5VTEw7Ci0JfQorQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9MaXN0Qm94OjpHZXRDbGFzc05hbWUoKSBjb25zdCB7CisgIHJldHVybiAiQ1BXTF9MaXN0Qm94IjsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9MaXN0Qm94OjpHZXRDbGFzc05hbWUoKSBjb25zdAotewkKLQlyZXR1cm4gIkNQV0xfTGlzdEJveCI7Cit2b2lkIENQV0xfTGlzdEJveDo6T25DcmVhdGVkKCkgeworICBpZiAobV9wTGlzdCkgeworICAgIGRlbGV0ZSBtX3BMaXN0Tm90aWZ5OworCisgICAgbV9wTGlzdC0+U2V0Rm9udE1hcChHZXRGb250TWFwKCkpOworICAgIG1fcExpc3QtPlNldE5vdGlmeShtX3BMaXN0Tm90aWZ5ID0gbmV3IENQV0xfTGlzdF9Ob3RpZnkodGhpcykpOworCisgICAgU2V0SG92ZXJTZWwoSGFzRmxhZyhQTEJTX0hPVkVSU0VMKSk7CisgICAgbV9wTGlzdC0+U2V0TXVsdGlwbGVTZWwoSGFzRmxhZyhQTEJTX01VTFRJUExFU0VMKSk7CisgICAgbV9wTGlzdC0+U2V0Rm9udFNpemUoR2V0Q3JlYXRpb25QYXJhbSgpLmZGb250U2l6ZSk7CisKKyAgICBtX2JIb3ZlclNlbCA9IEhhc0ZsYWcoUExCU19IT1ZFUlNFTCk7CisgIH0KIH0KIAotdm9pZCBDUFdMX0xpc3RCb3g6Ok9uQ3JlYXRlZCgpCi17Ci0JaWYgKG1fcExpc3QpCi0JewotCQlpZiAobV9wTGlzdE5vdGlmeSkgZGVsZXRlIG1fcExpc3ROb3RpZnk7Ci0KLQkJbV9wTGlzdC0+U2V0Rm9udE1hcChHZXRGb250TWFwKCkpOwotCQltX3BMaXN0LT5TZXROb3RpZnkobV9wTGlzdE5vdGlmeSA9IG5ldyBDUFdMX0xpc3RfTm90aWZ5KHRoaXMpKTsKLQkKLQkJU2V0SG92ZXJTZWwoSGFzRmxhZyhQTEJTX0hPVkVSU0VMKSk7CQotCQltX3BMaXN0LT5TZXRNdWx0aXBsZVNlbChIYXNGbGFnKFBMQlNfTVVMVElQTEVTRUwpKTsKLQkJbV9wTGlzdC0+U2V0Rm9udFNpemUodGhpcy0+R2V0Q3JlYXRpb25QYXJhbSgpLmZGb250U2l6ZSk7CQotCi0JCW1fYkhvdmVyU2VsID0gSGFzRmxhZyhQTEJTX0hPVkVSU0VMKTsKLQl9Cit2b2lkIENQV0xfTGlzdEJveDo6T25EZXN0cm95KCkgeworICBkZWxldGUgbV9wTGlzdE5vdGlmeTsKKyAgbV9wTGlzdE5vdGlmeSA9IE5VTEw7CiB9CiAKLXZvaWQgQ1BXTF9MaXN0Qm94OjpPbkRlc3Ryb3koKQotewotCWlmIChtX3BMaXN0Tm90aWZ5KQotCXsKLQkJZGVsZXRlIG1fcExpc3ROb3RpZnk7Ci0JCW1fcExpc3ROb3RpZnkgPSBOVUxMOwotCX0KK3ZvaWQgQ1BXTF9MaXN0Qm94OjpHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYmIHNBcHBTdHJlYW0pIHsKKyAgQ1BXTF9XbmQ6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKHNBcHBTdHJlYW0pOworCisgIENGWF9CeXRlVGV4dEJ1ZiBzTGlzdEl0ZW1zOworCisgIGlmIChtX3BMaXN0KSB7CisgICAgQ1BERl9SZWN0IHJjUGxhdGUgPSBtX3BMaXN0LT5HZXRQbGF0ZVJlY3QoKTsKKyAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9wTGlzdC0+R2V0Q291bnQoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgIENQREZfUmVjdCByY0l0ZW0gPSBtX3BMaXN0LT5HZXRJdGVtUmVjdChpKTsKKworICAgICAgaWYgKHJjSXRlbS5ib3R0b20gPiByY1BsYXRlLnRvcCB8fCByY0l0ZW0udG9wIDwgcmNQbGF0ZS5ib3R0b20pCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBDUERGX1BvaW50IHB0T2Zmc2V0KHJjSXRlbS5sZWZ0LCAocmNJdGVtLnRvcCArIHJjSXRlbS5ib3R0b20pICogMC41Zik7CisgICAgICBpZiAobV9wTGlzdC0+SXNJdGVtU2VsZWN0ZWQoaSkpIHsKKyAgICAgICAgc0xpc3RJdGVtcyA8PCBDUFdMX1V0aWxzOjpHZXRSZWN0RmlsbEFwcFN0cmVhbSgKKyAgICAgICAgICAgIHJjSXRlbSwgUFdMX0RFRkFVTFRfU0VMQkFDS0NPTE9SKTsKKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0l0ZW0gPQorICAgICAgICAgICAgQ1BXTF9VdGlsczo6R2V0RWRpdEFwcFN0cmVhbShtX3BMaXN0LT5HZXRJdGVtRWRpdChpKSwgcHRPZmZzZXQpOworICAgICAgICBpZiAoc0l0ZW0uR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgc0xpc3RJdGVtcyA8PCAiQlRcbiIKKyAgICAgICAgICAgICAgICAgICAgIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKFBXTF9ERUZBVUxUX1NFTFRFWFRDT0xPUikKKyAgICAgICAgICAgICAgICAgICAgIDw8IHNJdGVtIDw8ICJFVFxuIjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0l0ZW0gPQorICAgICAgICAgICAgQ1BXTF9VdGlsczo6R2V0RWRpdEFwcFN0cmVhbShtX3BMaXN0LT5HZXRJdGVtRWRpdChpKSwgcHRPZmZzZXQpOworICAgICAgICBpZiAoc0l0ZW0uR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgc0xpc3RJdGVtcyA8PCAiQlRcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0VGV4dENvbG9yKCkpCisgICAgICAgICAgICAgICAgICAgICA8PCBzSXRlbSA8PCAiRVRcbiI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoc0xpc3RJdGVtcy5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICBDRlhfQnl0ZVRleHRCdWYgc0NsaXA7CisgICAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworCisgICAgc0NsaXAgPDwgInFcbiI7CisgICAgc0NsaXAgPDwgcmNDbGllbnQubGVmdCA8PCAiICIgPDwgcmNDbGllbnQuYm90dG9tIDw8ICIgIgorICAgICAgICAgIDw8IHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCA8PCAiICIKKyAgICAgICAgICA8PCByY0NsaWVudC50b3AgLSByY0NsaWVudC5ib3R0b20gPDwgIiByZSBXIG5cbiI7CisKKyAgICBzQ2xpcCA8PCBzTGlzdEl0ZW1zIDw8ICJRXG4iOworCisgICAgc0FwcFN0cmVhbSA8PCAiL1R4IEJNQ1xuIiA8PCBzQ2xpcCA8PCAiRU1DXG4iOworICB9CiB9CiAKLXZvaWQgQ1BXTF9MaXN0Qm94OjpHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKQotewotCUNQV0xfV25kOjpHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShzQXBwU3RyZWFtKTsKK3ZvaWQgQ1BXTF9MaXN0Qm94OjpEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlKSB7CisgIENQV0xfV25kOjpEcmF3VGhpc0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlKTsKIAotCUNGWF9CeXRlVGV4dEJ1ZiBzTGlzdEl0ZW1zOworICBpZiAobV9wTGlzdCkgeworICAgIENQREZfUmVjdCByY1BsYXRlID0gbV9wTGlzdC0+R2V0UGxhdGVSZWN0KCk7CisgICAgQ1BERl9SZWN0IHJjTGlzdCA9IEdldExpc3RSZWN0KCk7CisgICAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwogCi0JaWYgKG1fcExpc3QpCi0JewotCQlDUERGX1JlY3QgcmNQbGF0ZSA9IG1fcExpc3QtPkdldFBsYXRlUmVjdCgpOwotCQlmb3IgKEZYX0lOVDMyIGk9MCxzej1tX3BMaXN0LT5HZXRDb3VudCgpOyBpPHN6OyBpKyspCi0JCXsKLQkJCUNQREZfUmVjdCByY0l0ZW0gPSBtX3BMaXN0LT5HZXRJdGVtUmVjdChpKTsKKyAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9wTGlzdC0+R2V0Q291bnQoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgIENQREZfUmVjdCByY0l0ZW0gPSBtX3BMaXN0LT5HZXRJdGVtUmVjdChpKTsKKyAgICAgIGlmIChyY0l0ZW0uYm90dG9tID4gcmNQbGF0ZS50b3AgfHwgcmNJdGVtLnRvcCA8IHJjUGxhdGUuYm90dG9tKQorICAgICAgICBjb250aW51ZTsKIAotCQkJaWYgKHJjSXRlbS5ib3R0b20gPiByY1BsYXRlLnRvcCB8fCByY0l0ZW0udG9wIDwgcmNQbGF0ZS5ib3R0b20pIGNvbnRpbnVlOwotCQkJCi0JCQlDUERGX1BvaW50IHB0T2Zmc2V0KHJjSXRlbS5sZWZ0LCAocmNJdGVtLnRvcCArIHJjSXRlbS5ib3R0b20pICogMC41Zik7Ci0JCQlpZiAobV9wTGlzdC0+SXNJdGVtU2VsZWN0ZWQoaSkpCi0JCQl7Ci0JCQkJc0xpc3RJdGVtcyA8PCBDUFdMX1V0aWxzOjpHZXRSZWN0RmlsbEFwcFN0cmVhbShyY0l0ZW0sUFdMX0RFRkFVTFRfU0VMQkFDS0NPTE9SKTsKLQkJCQlDRlhfQnl0ZVN0cmluZyBzSXRlbSA9IENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0obV9wTGlzdC0+R2V0SXRlbUVkaXQoaSksIHB0T2Zmc2V0KTsKLQkJCQlpZiAoc0l0ZW0uR2V0TGVuZ3RoKCkgPiAwKQotCQkJCXsKLQkJCQkJc0xpc3RJdGVtcyA8PCAiQlRcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oUFdMX0RFRkFVTFRfU0VMVEVYVENPTE9SKSA8PCBzSXRlbSA8PCAiRVRcbiI7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCUNGWF9CeXRlU3RyaW5nIHNJdGVtID0gQ1BXTF9VdGlsczo6R2V0RWRpdEFwcFN0cmVhbShtX3BMaXN0LT5HZXRJdGVtRWRpdChpKSwgcHRPZmZzZXQpOwotCQkJCWlmIChzSXRlbS5HZXRMZW5ndGgoKSA+IDApCi0JCQkJewotCQkJCQlzTGlzdEl0ZW1zIDw8ICJCVFxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRUZXh0Q29sb3IoKSkgPDwgc0l0ZW0gPDwgIkVUXG4iOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICAgIENQREZfUG9pbnQgcHRPZmZzZXQocmNJdGVtLmxlZnQsIChyY0l0ZW0udG9wICsgcmNJdGVtLmJvdHRvbSkgKiAwLjVmKTsKKyAgICAgIGlmIChJRlhfRWRpdCogcEVkaXQgPSBtX3BMaXN0LT5HZXRJdGVtRWRpdChpKSkgeworICAgICAgICBDUERGX1JlY3QgcmNDb250ZW50ID0gcEVkaXQtPkdldENvbnRlbnRSZWN0KCk7CisgICAgICAgIGlmIChyY0NvbnRlbnQuV2lkdGgoKSA+IHJjQ2xpZW50LldpZHRoKCkpCisgICAgICAgICAgcmNJdGVtLkludGVyc2VjdChyY0xpc3QpOworICAgICAgICBlbHNlCisgICAgICAgICAgcmNJdGVtLkludGVyc2VjdChyY0NsaWVudCk7CisgICAgICB9CiAKLQlpZiAoc0xpc3RJdGVtcy5HZXRMZW5ndGgoKSA+IDApCi0JewotCQlDRlhfQnl0ZVRleHRCdWYgc0NsaXA7CQkJCi0JCUNQREZfUmVjdCByY0NsaWVudCA9IHRoaXMtPkdldENsaWVudFJlY3QoKTsKLQotCQlzQ2xpcCA8PCAicVxuIjsKLQkJc0NsaXAgPDwgcmNDbGllbnQubGVmdCA8PCAiICIgPDwgcmNDbGllbnQuYm90dG9tIDw8ICIgIgotCQkJPDwgcmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0IDw8ICIgIiA8PAlyY0NsaWVudC50b3AgLSByY0NsaWVudC5ib3R0b20gPDwgIiByZSBXIG5cbiI7Ci0KLQkJc0NsaXAgPDwgc0xpc3RJdGVtcyA8PCAiUVxuIjsKLQotCQlzQXBwU3RyZWFtIDw8ICIvVHggQk1DXG4iIDw8IHNDbGlwIDw8ICJFTUNcbiI7Ci0JfQorICAgICAgaWYgKG1fcExpc3QtPklzSXRlbVNlbGVjdGVkKGkpKSB7CisgICAgICAgIElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzSGFuZGxlciA9IEdldFN5c3RlbUhhbmRsZXIoKTsKKyAgICAgICAgaWYgKHBTeXNIYW5kbGVyICYmIHBTeXNIYW5kbGVyLT5Jc1NlbGVjdGlvbkltcGxlbWVudGVkKCkpIHsKKyAgICAgICAgICBJRlhfRWRpdDo6RHJhd0VkaXQoCisgICAgICAgICAgICAgIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgbV9wTGlzdC0+R2V0SXRlbUVkaXQoaSksCisgICAgICAgICAgICAgIENQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKEdldFRleHRDb2xvcigpKSwKKyAgICAgICAgICAgICAgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dFN0cm9rZUNvbG9yKCkpLCByY0xpc3QsCisgICAgICAgICAgICAgIHB0T2Zmc2V0LCBOVUxMLCBwU3lzSGFuZGxlciwgbV9wRm9ybUZpbGxlcik7CisgICAgICAgICAgcFN5c0hhbmRsZXItPk91dHB1dFNlbGVjdGVkUmVjdChtX3BGb3JtRmlsbGVyLCByY0l0ZW0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdGaWxsUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZSgyNTUsIDAsIDUxLCAxMTMpKTsKKyAgICAgICAgICBJRlhfRWRpdDo6RHJhd0VkaXQocERldmljZSwgcFVzZXIyRGV2aWNlLCBtX3BMaXN0LT5HZXRJdGVtRWRpdChpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLCAwLCByY0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0T2Zmc2V0LCBOVUxMLCBwU3lzSGFuZGxlciwgbV9wRm9ybUZpbGxlcik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzSGFuZGxlciA9IEdldFN5c3RlbUhhbmRsZXIoKTsKKyAgICAgICAgSUZYX0VkaXQ6OkRyYXdFZGl0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgbV9wTGlzdC0+R2V0SXRlbUVkaXQoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0Q29sb3IoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0U3Ryb2tlQ29sb3IoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByY0xpc3QsIHB0T2Zmc2V0LCBOVUxMLCBwU3lzSGFuZGxlciwgTlVMTCk7CisgICAgICB9CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ1BXTF9MaXN0Qm94OjpEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSkKLXsKLQlDUFdMX1duZDo6RHJhd1RoaXNBcHBlYXJhbmNlKHBEZXZpY2UscFVzZXIyRGV2aWNlKTsKK0ZYX0JPT0wgQ1BXTF9MaXN0Qm94OjpPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpIHsKKyAgQ1BXTF9XbmQ6Ok9uS2V5RG93bihuQ2hhciwgbkZsYWcpOwogCi0JaWYgKG1fcExpc3QpCi0JewotCQlDUERGX1JlY3QgcmNQbGF0ZSA9IG1fcExpc3QtPkdldFBsYXRlUmVjdCgpOwotCQlDUERGX1JlY3QgcmNMaXN0ID0gR2V0TGlzdFJlY3QoKTsKLQkJQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworICBpZiAoIW1fcExpc3QpCisgICAgcmV0dXJuIEZBTFNFOwogCi0JCWZvciAoRlhfSU5UMzIgaT0wLHN6PW1fcExpc3QtPkdldENvdW50KCk7IGk8c3o7IGkrKykKLQkJewotCQkJQ1BERl9SZWN0IHJjSXRlbSA9IG1fcExpc3QtPkdldEl0ZW1SZWN0KGkpOwotCQkJaWYgKHJjSXRlbS5ib3R0b20gPiByY1BsYXRlLnRvcCB8fCByY0l0ZW0udG9wIDwgcmNQbGF0ZS5ib3R0b20pIGNvbnRpbnVlOwotCQkJCi0JCQlDUERGX1BvaW50IHB0T2Zmc2V0KHJjSXRlbS5sZWZ0LCAocmNJdGVtLnRvcCArIHJjSXRlbS5ib3R0b20pICogMC41Zik7Ci0JCQlpZiAoSUZYX0VkaXQqIHBFZGl0ID0gbV9wTGlzdC0+R2V0SXRlbUVkaXQoaSkpCi0JCQl7Ci0JCQkJQ1BERl9SZWN0IHJjQ29udGVudCA9IHBFZGl0LT5HZXRDb250ZW50UmVjdCgpOwotCQkJCWlmIChyY0NvbnRlbnQuV2lkdGgoKSA+IHJjQ2xpZW50LldpZHRoKCkpCi0JCQkJCXJjSXRlbS5JbnRlcnNlY3QocmNMaXN0KTsKLQkJCQllbHNlCi0JCQkJCXJjSXRlbS5JbnRlcnNlY3QocmNDbGllbnQpOwotCQkJfQorICBzd2l0Y2ggKG5DaGFyKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBjYXNlIEZXTF9WS0VZX1VwOgorICAgIGNhc2UgRldMX1ZLRVlfRG93bjoKKyAgICBjYXNlIEZXTF9WS0VZX0hvbWU6CisgICAgY2FzZSBGV0xfVktFWV9MZWZ0OgorICAgIGNhc2UgRldMX1ZLRVlfRW5kOgorICAgIGNhc2UgRldMX1ZLRVlfUmlnaHQ6CisgICAgICBicmVhazsKKyAgfQogCi0JCQlpZiAobV9wTGlzdC0+SXNJdGVtU2VsZWN0ZWQoaSkpCi0JCQl7Ci0JCQkvLwlDUFdMX1V0aWxzOjpEcmF3RmlsbFJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByY0l0ZW0sIEFyZ2JFbmNvZGUoMjU1LDAsNTEsMTEzKSk7Ci0JCQkJSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXNIYW5kbGVyID0gR2V0U3lzdGVtSGFuZGxlcigpOwotCQkJCWlmKHBTeXNIYW5kbGVyICYmIHBTeXNIYW5kbGVyLT5Jc1NlbGVjdGlvbkltcGxlbWVudGVkKCkpCi0JCQkJewotCQkJCQlJRlhfRWRpdDo6RHJhd0VkaXQocERldmljZSwgcFVzZXIyRGV2aWNlLCBtX3BMaXN0LT5HZXRJdGVtRWRpdChpKSwgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dENvbG9yKCkpLCBDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0U3Ryb2tlQ29sb3IoKSksCi0JCQkJCQlyY0xpc3QsIHB0T2Zmc2V0LCBOVUxMLHBTeXNIYW5kbGVyLCBtX3BGb3JtRmlsbGVyKTsKLQkJCQkJcFN5c0hhbmRsZXItPk91dHB1dFNlbGVjdGVkUmVjdChtX3BGb3JtRmlsbGVyLCByY0l0ZW0pOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlDUFdMX1V0aWxzOjpEcmF3RmlsbFJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByY0l0ZW0sIEFyZ2JFbmNvZGUoMjU1LDAsNTEsMTEzKSk7Ci0JCQkJCUlGWF9FZGl0OjpEcmF3RWRpdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIG1fcExpc3QtPkdldEl0ZW1FZGl0KGkpLCBBcmdiRW5jb2RlKDI1NSwyNTUsMjU1LDI1NSksIDAsCi0JCQkJCQlyY0xpc3QsIHB0T2Zmc2V0LCBOVUxMLCBwU3lzSGFuZGxlciwgbV9wRm9ybUZpbGxlcik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCUlGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzSGFuZGxlciA9IEdldFN5c3RlbUhhbmRsZXIoKTsKLQkJCQlJRlhfRWRpdDo6RHJhd0VkaXQocERldmljZSwgcFVzZXIyRGV2aWNlLCBtX3BMaXN0LT5HZXRJdGVtRWRpdChpKSwgCi0JCQkJCQlDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0Q29sb3IoKSksCi0JCQkJCQlDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0U3Ryb2tlQ29sb3IoKSksCi0JCQkJCQlyY0xpc3QsIHB0T2Zmc2V0LCBOVUxMLHBTeXNIYW5kbGVyLCBOVUxMKTsKKyAgc3dpdGNoIChuQ2hhcikgeworICAgIGNhc2UgRldMX1ZLRVlfVXA6CisgICAgICBtX3BMaXN0LT5PblZLX1VQKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGV0xfVktFWV9Eb3duOgorICAgICAgbV9wTGlzdC0+T25WS19ET1dOKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGV0xfVktFWV9Ib21lOgorICAgICAgbV9wTGlzdC0+T25WS19IT01FKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGV0xfVktFWV9MZWZ0OgorICAgICAgbV9wTGlzdC0+T25WS19MRUZUKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGV0xfVktFWV9FbmQ6CisgICAgICBtX3BMaXN0LT5PblZLX0VORChJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRldMX1ZLRVlfUmlnaHQ6CisgICAgICBtX3BMaXN0LT5PblZLX1JJR0hUKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGV0xfVktFWV9EZWxldGU6CisgICAgICBicmVhazsKKyAgfQogCi0JCQl9Ci0JCX0KLQl9CisgIEZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKKyAgT25Ob3RpZnlTZWxDaGFuZ2VkKFRSVUUsIGJFeGl0LCBuRmxhZyk7CisKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgQ1BXTF9MaXN0Qm94OjpPbktleURvd24oRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JQ1BXTF9XbmQ6Ok9uS2V5RG93bihuQ2hhciwgbkZsYWcpOworRlhfQk9PTCBDUFdMX0xpc3RCb3g6Ok9uQ2hhcihGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZykgeworICBDUFdMX1duZDo6T25DaGFyKG5DaGFyLCBuRmxhZyk7CiAKLQlpZiAoIW1fcExpc3QpIHJldHVybiBGQUxTRTsKKyAgaWYgKCFtX3BMaXN0KQorICAgIHJldHVybiBGQUxTRTsKIAotCXN3aXRjaCAobkNoYXIpCi0JewotCWRlZmF1bHQ6Ci0JCXJldHVybiBGQUxTRTsKLQljYXNlIEZXTF9WS0VZX1VwOgotCWNhc2UgRldMX1ZLRVlfRG93bjoKLQljYXNlIEZXTF9WS0VZX0hvbWU6Ci0JY2FzZSBGV0xfVktFWV9MZWZ0OgotCWNhc2UgRldMX1ZLRVlfRW5kOgotCWNhc2UgRldMX1ZLRVlfUmlnaHQ6Ci0JCWJyZWFrOwkKLQl9CisgIGlmICghbV9wTGlzdC0+T25DaGFyKG5DaGFyLCBJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKSkKKyAgICByZXR1cm4gRkFMU0U7CiAKLQlzd2l0Y2ggKG5DaGFyKQotCXsKLQljYXNlIEZXTF9WS0VZX1VwOgotCQltX3BMaXN0LT5PblZLX1VQKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0JCWJyZWFrOwotCWNhc2UgRldMX1ZLRVlfRG93bjoKLQkJbV9wTGlzdC0+T25WS19ET1dOKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0JCWJyZWFrOwotCWNhc2UgRldMX1ZLRVlfSG9tZToKLQkJbV9wTGlzdC0+T25WS19IT01FKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0JCWJyZWFrOwotCWNhc2UgRldMX1ZLRVlfTGVmdDoKLQkJbV9wTGlzdC0+T25WS19MRUZUKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0JCWJyZWFrOwotCWNhc2UgRldMX1ZLRVlfRW5kOgotCQltX3BMaXN0LT5PblZLX0VORChJc1NISUZUcHJlc3NlZChuRmxhZyksSXNDVFJMcHJlc3NlZChuRmxhZykpOwotCQlicmVhazsKLQljYXNlIEZXTF9WS0VZX1JpZ2h0OgotCQltX3BMaXN0LT5PblZLX1JJR0hUKElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0JCWJyZWFrOwotCWNhc2UgRldMX1ZLRVlfRGVsZXRlOgotCQlicmVhazsKLQl9CisgIEZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKKyAgT25Ob3RpZnlTZWxDaGFuZ2VkKFRSVUUsIGJFeGl0LCBuRmxhZyk7CiAKLQlGWF9CT09MIGJFeGl0ID0gRkFMU0U7Ci0JT25Ob3RpZnlTZWxDaGFuZ2VkKFRSVUUsYkV4aXQsbkZsYWcpOwotCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIENQV0xfTGlzdEJveDo6T25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKQotewotCUNQV0xfV25kOjpPbkNoYXIobkNoYXIsbkZsYWcpOworRlhfQk9PTCBDUFdMX0xpc3RCb3g6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSB7CisgIENQV0xfV25kOjpPbkxCdXR0b25Eb3duKHBvaW50LCBuRmxhZyk7CiAKLQlpZiAoIW1fcExpc3QpIHJldHVybiBGQUxTRTsKKyAgaWYgKENsaWVudEhpdFRlc3QocG9pbnQpKSB7CisgICAgbV9iTW91c2VEb3duID0gVFJVRTsKKyAgICBTZXRGb2N1cygpOworICAgIFNldENhcHR1cmUoKTsKIAotCWlmICghbV9wTGlzdC0+T25DaGFyKG5DaGFyLElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAobV9wTGlzdCkKKyAgICAgIG1fcExpc3QtPk9uTW91c2VEb3duKHBvaW50LCBJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKKyAgfQogCi0JRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwotCU9uTm90aWZ5U2VsQ2hhbmdlZChUUlVFLGJFeGl0LCBuRmxhZyk7Ci0KLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgQ1BXTF9MaXN0Qm94OjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsbkZsYWcpOworRlhfQk9PTCBDUFdMX0xpc3RCb3g6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgeworICBDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsIG5GbGFnKTsKIAotCWlmIChDbGllbnRIaXRUZXN0KHBvaW50KSkKLQl7Ci0JCW1fYk1vdXNlRG93biA9IFRSVUU7Ci0JCVNldEZvY3VzKCk7Ci0JCVNldENhcHR1cmUoKTsKKyAgaWYgKG1fYk1vdXNlRG93bikgeworICAgIFJlbGVhc2VDYXB0dXJlKCk7CisgICAgbV9iTW91c2VEb3duID0gRkFMU0U7CisgIH0KIAotCQlpZiAobV9wTGlzdCkKLQkJCW1fcExpc3QtPk9uTW91c2VEb3duKHBvaW50LElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0JfQorICBGWF9CT09MIGJFeGl0ID0gRkFMU0U7CisgIE9uTm90aWZ5U2VsQ2hhbmdlZChGQUxTRSwgYkV4aXQsIG5GbGFnKTsKIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotRlhfQk9PTCBDUFdMX0xpc3RCb3g6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JQ1BXTF9XbmQ6Ok9uTEJ1dHRvblVwKHBvaW50LG5GbGFnKTsKLQotCWlmIChtX2JNb3VzZURvd24pCi0JewotCQlSZWxlYXNlQ2FwdHVyZSgpOwotCQltX2JNb3VzZURvd24gPSBGQUxTRTsKLQl9Ci0KLQlGWF9CT09MIGJFeGl0ID0gRkFMU0U7Ci0JT25Ob3RpZnlTZWxDaGFuZ2VkKEZBTFNFLGJFeGl0LG5GbGFnKTsKLQotCXJldHVybiBUUlVFOwordm9pZCBDUFdMX0xpc3RCb3g6OlNldEhvdmVyU2VsKEZYX0JPT0wgYkhvdmVyU2VsKSB7CisgIG1fYkhvdmVyU2VsID0gYkhvdmVyU2VsOwogfQogCi12b2lkIENQV0xfTGlzdEJveDo6U2V0SG92ZXJTZWwoRlhfQk9PTCBiSG92ZXJTZWwpCi17Ci0JbV9iSG92ZXJTZWwgPSBiSG92ZXJTZWw7CitGWF9CT09MIENQV0xfTGlzdEJveDo6T25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSB7CisgIENQV0xfV25kOjpPbk1vdXNlTW92ZShwb2ludCwgbkZsYWcpOworCisgIGlmIChtX2JIb3ZlclNlbCAmJiAhSXNDYXB0dXJlTW91c2UoKSAmJiBDbGllbnRIaXRUZXN0KHBvaW50KSkgeworICAgIGlmIChtX3BMaXN0KQorICAgICAgbV9wTGlzdC0+U2VsZWN0KG1fcExpc3QtPkdldEl0ZW1JbmRleChwb2ludCkpOworICB9CisKKyAgaWYgKG1fYk1vdXNlRG93bikgeworICAgIGlmIChtX3BMaXN0KQorICAgICAgbV9wTGlzdC0+T25Nb3VzZU1vdmUocG9pbnQsIElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOworICB9CisKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgQ1BXTF9MaXN0Qm94OjpPbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQotewotCUNQV0xfV25kOjpPbk1vdXNlTW92ZShwb2ludCwgbkZsYWcpOwordm9pZCBDUFdMX0xpc3RCb3g6Ok9uTm90aWZ5KENQV0xfV25kKiBwV25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCB3UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbFBhcmFtKSB7CisgIENQV0xfV25kOjpPbk5vdGlmeShwV25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKIAotCWlmIChtX2JIb3ZlclNlbCAmJiAhSXNDYXB0dXJlTW91c2UoKSAmJiBDbGllbnRIaXRUZXN0KHBvaW50KSkKLQl7Ci0JCWlmIChtX3BMaXN0KQotCQkJbV9wTGlzdC0+U2VsZWN0KG1fcExpc3QtPkdldEl0ZW1JbmRleChwb2ludCkpOwotCX0KKyAgRlhfRkxPQVQgZlBvczsKIAotCWlmIChtX2JNb3VzZURvd24pCi0JewotCQlpZiAobV9wTGlzdCkKLQkJCW1fcExpc3QtPk9uTW91c2VNb3ZlKHBvaW50LElzU0hJRlRwcmVzc2VkKG5GbGFnKSxJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0JfQkKLQotCXJldHVybiBUUlVFOworICBzd2l0Y2ggKG1zZykgeworICAgIGNhc2UgUE5NX1NFVFNDUk9MTElORk86CisgICAgICBzd2l0Y2ggKHdQYXJhbSkgeworICAgICAgICBjYXNlIFNCVF9WU0NST0xMOgorICAgICAgICAgIGlmIChDUFdMX1duZCogcENoaWxkID0gR2V0VlNjcm9sbEJhcigpKSB7CisgICAgICAgICAgICBwQ2hpbGQtPk9uTm90aWZ5KHBXbmQsIFBOTV9TRVRTQ1JPTExJTkZPLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQTk1fU0VUU0NST0xMUE9TOgorICAgICAgc3dpdGNoICh3UGFyYW0pIHsKKyAgICAgICAgY2FzZSBTQlRfVlNDUk9MTDoKKyAgICAgICAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IEdldFZTY3JvbGxCYXIoKSkgeworICAgICAgICAgICAgcENoaWxkLT5Pbk5vdGlmeShwV25kLCBQTk1fU0VUU0NST0xMUE9TLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQTk1fU0NST0xMV0lORE9XOgorICAgICAgZlBvcyA9ICooRlhfRkxPQVQqKWxQYXJhbTsKKyAgICAgIHN3aXRjaCAod1BhcmFtKSB7CisgICAgICAgIGNhc2UgU0JUX1ZTQ1JPTEw6CisgICAgICAgICAgaWYgKG1fcExpc3QpCisgICAgICAgICAgICBtX3BMaXN0LT5TZXRTY3JvbGxQb3MoQ1BERl9Qb2ludCgwLCBmUG9zKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQogfQogCi12b2lkIENQV0xfTGlzdEJveDo6T25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgRlhfSU5UUFRSIHdQYXJhbSwgRlhfSU5UUFRSIGxQYXJhbSkKLXsKLQlDUFdMX1duZDo6T25Ob3RpZnkocFduZCxtc2csd1BhcmFtLGxQYXJhbSk7Ci0KLQlGWF9GTE9BVCBmUG9zOwkKLQkKLQlzd2l0Y2ggKG1zZykKLQl7Ci0JY2FzZSBQTk1fU0VUU0NST0xMSU5GTzoKLQkJc3dpdGNoICh3UGFyYW0pCi0JCXsKLQkJY2FzZSBTQlRfVlNDUk9MTDoKLQkJCWlmIChDUFdMX1duZCAqIHBDaGlsZCA9IEdldFZTY3JvbGxCYXIoKSkKLQkJCXsKLQkJCQlwQ2hpbGQtPk9uTm90aWZ5KHBXbmQsUE5NX1NFVFNDUk9MTElORk8sd1BhcmFtLGxQYXJhbSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQljYXNlIFBOTV9TRVRTQ1JPTExQT1M6CQkJCi0JCXN3aXRjaCAod1BhcmFtKQotCQl7Ci0JCWNhc2UgU0JUX1ZTQ1JPTEw6Ci0JCQlpZiAoQ1BXTF9XbmQgKiBwQ2hpbGQgPSBHZXRWU2Nyb2xsQmFyKCkpCi0JCQl7Ci0JCQkJcENoaWxkLT5Pbk5vdGlmeShwV25kLFBOTV9TRVRTQ1JPTExQT1Msd1BhcmFtLGxQYXJhbSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQljYXNlIFBOTV9TQ1JPTExXSU5ET1c6Ci0JCWZQb3MgPSAqKEZYX0ZMT0FUKilsUGFyYW07Ci0JCXN3aXRjaCAod1BhcmFtKQotCQl7Ci0JCWNhc2UgU0JUX1ZTQ1JPTEw6Ci0JCQlpZiAobV9wTGlzdCkKLQkJCQltX3BMaXN0LT5TZXRTY3JvbGxQb3MoQ1BERl9Qb2ludCgwLGZQb3MpKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCX0KK3ZvaWQgQ1BXTF9MaXN0Qm94OjpLaWxsRm9jdXMoKSB7CisgIENQV0xfV25kOjpLaWxsRm9jdXMoKTsKIH0KIAotdm9pZCBDUFdMX0xpc3RCb3g6OktpbGxGb2N1cygpCi17Ci0JQ1BXTF9XbmQ6OktpbGxGb2N1cygpOwordm9pZCBDUFdMX0xpc3RCb3g6OlJlUG9zQ2hpbGRXbmQoKSB7CisgIENQV0xfV25kOjpSZVBvc0NoaWxkV25kKCk7CiAKLQkvKgotCWlmICh0aGlzLT5Jc011bHRpcGxlU2VsKCkpCi0JewotCQlmb3IoRlhfSU5UMzIgaT0wO2k8dGhpcy0+R2V0Q291bnQoKTtpKyspCi0JCXsKLQkJCWlmICh0aGlzLT5Jc0xpc3RJdGVtU2VsZWN0ZWQoaSkpCi0JCQl7Ci0JCQkJaWYgKCFJc0xpc3RJdGVtVmlzaWJsZShpKSkKLQkJCQkJdGhpcy0+U2Nyb2xsVG9MaXN0SXRlbShpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JewotCQlpZiAoIUlzTGlzdEl0ZW1WaXNpYmxlKHRoaXMtPkdldEN1clNlbCgpKSkKLQkJCXRoaXMtPlNjcm9sbFRvTGlzdEl0ZW0odGhpcy0+R2V0Q3VyU2VsKCkpOwotCX0KLQotCVNldExpc3RJdGVtQ2FyZXQobV9uQ2FyZXRJbmRleCxGQUxTRSk7Ci0JKi8KKyAgaWYgKG1fcExpc3QpCisgICAgbV9wTGlzdC0+U2V0UGxhdGVSZWN0KEdldExpc3RSZWN0KCkpOwogfQogCi12b2lkIENQV0xfTGlzdEJveDo6UmVQb3NDaGlsZFduZCgpCi17Ci0JQ1BXTF9XbmQ6OlJlUG9zQ2hpbGRXbmQoKTsKK3ZvaWQgQ1BXTF9MaXN0Qm94OjpPbk5vdGlmeVNlbENoYW5nZWQoRlhfQk9PTCBiS2V5RG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkV4aXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSB7CisgIGlmICghbV9wRmlsbGVyTm90aWZ5KQorICAgIHJldHVybjsKIAotCWlmIChtX3BMaXN0KQotCQltX3BMaXN0LT5TZXRQbGF0ZVJlY3QoR2V0TGlzdFJlY3QoKSk7CisgIEZYX0JPT0wgYlJDID0gVFJVRTsKKyAgQ0ZYX1dpZGVTdHJpbmcgc3dDaGFuZ2UgPSBHZXRUZXh0KCk7CisgIENGWF9XaWRlU3RyaW5nIHN0ckNoYW5nZUV4OworICBpbnQgblNlbFN0YXJ0ID0gMDsKKyAgaW50IG5TZWxFbmQgPSBzd0NoYW5nZS5HZXRMZW5ndGgoKTsKKyAgbV9wRmlsbGVyTm90aWZ5LT5PbkJlZm9yZUtleVN0cm9rZShHZXRBdHRhY2hlZERhdGEoKSwgc3dDaGFuZ2UsIHN0ckNoYW5nZUV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TZWxTdGFydCwgblNlbEVuZCwgYktleURvd24sIGJSQywgYkV4aXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkZsYWcpOwogfQogCi12b2lkIENQV0xfTGlzdEJveDo6T25Ob3RpZnlTZWxDaGFuZ2VkKEZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgJiBiRXhpdCwgIEZYX0RXT1JEIG5GbGFnKQotewotCWlmIChtX3BGaWxsZXJOb3RpZnkpCi0JewkJCi0JCUZYX0JPT0wgYlJDID0gVFJVRTsKLQkJQ0ZYX1dpZGVTdHJpbmcgc3dDaGFuZ2UgPSBHZXRUZXh0KCk7Ci0JCUNGWF9XaWRlU3RyaW5nIHN0ckNoYW5nZUV4OwotCQlpbnQgblNlbFN0YXJ0ID0gMDsKLQkJaW50IG5TZWxFbmQgPSBzd0NoYW5nZS5HZXRMZW5ndGgoKTsKLQkJbV9wRmlsbGVyTm90aWZ5LT5PbkJlZm9yZUtleVN0cm9rZShGQUxTRSwgR2V0QXR0YWNoZWREYXRhKCksIDAsIHN3Q2hhbmdlLCBzdHJDaGFuZ2VFeCwgblNlbFN0YXJ0LCBuU2VsRW5kLCBiS2V5RG93biwgYlJDLCBiRXhpdCwgbkZsYWcpOwotCQlpZiAoYkV4aXQpIHJldHVybjsKK0NQREZfUmVjdCBDUFdMX0xpc3RCb3g6OkdldEZvY3VzUmVjdCgpIGNvbnN0IHsKKyAgaWYgKG1fcExpc3QgJiYgbV9wTGlzdC0+SXNNdWx0aXBsZVNlbCgpKSB7CisgICAgQ1BERl9SZWN0IHJjQ2FyZXQgPSBtX3BMaXN0LT5HZXRJdGVtUmVjdChtX3BMaXN0LT5HZXRDYXJldCgpKTsKKyAgICByY0NhcmV0LkludGVyc2VjdChHZXRDbGllbnRSZWN0KCkpOworICAgIHJldHVybiByY0NhcmV0OworICB9CiAKLQkJbV9wRmlsbGVyTm90aWZ5LT5PbkFmdGVyS2V5U3Ryb2tlKEZBTFNFLCBHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsbkZsYWcpOwotCX0KKyAgcmV0dXJuIENQV0xfV25kOjpHZXRGb2N1c1JlY3QoKTsKIH0KIAotQ1BERl9SZWN0IENQV0xfTGlzdEJveDo6R2V0Rm9jdXNSZWN0KCkgY29uc3QKLXsKLQlpZiAobV9wTGlzdCAmJiBtX3BMaXN0LT5Jc011bHRpcGxlU2VsKCkpCi0JewotCQlDUERGX1JlY3QgcmNDYXJldCA9IG1fcExpc3QtPkdldEl0ZW1SZWN0KG1fcExpc3QtPkdldENhcmV0KCkpOwotCQlyY0NhcmV0LkludGVyc2VjdChHZXRDbGllbnRSZWN0KCkpOwotCQlyZXR1cm4gcmNDYXJldDsKLQl9Ci0JCi0JcmV0dXJuIENQV0xfV25kOjpHZXRGb2N1c1JlY3QoKTsKK3ZvaWQgQ1BXTF9MaXN0Qm94OjpBZGRTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHN0cmluZykgeworICBpZiAobV9wTGlzdCkgeworICAgIG1fcExpc3QtPkFkZFN0cmluZyhzdHJpbmcpOworICB9CiB9CiAKLXZvaWQgQ1BXTF9MaXN0Qm94OjpBZGRTdHJpbmcoRlhfTFBDV1NUUiBzdHJpbmcpCi17Ci0JaWYgKG1fcExpc3QpCi0JewkJCi0JCW1fcExpc3QtPkFkZFN0cmluZyhzdHJpbmcpOwotCX0KK0NGWF9XaWRlU3RyaW5nIENQV0xfTGlzdEJveDo6R2V0VGV4dCgpIGNvbnN0IHsKKyAgaWYgKG1fcExpc3QpCisgICAgcmV0dXJuIG1fcExpc3QtPkdldFRleHQoKTsKKworICByZXR1cm4gTCIiOwogfQogCi12b2lkIENQV0xfTGlzdEJveDo6U2V0VGV4dChGWF9MUENXU1RSIGNzVGV4dCxGWF9CT09MIGJSZWZyZXNoKQotewotCS8vcmV0dXJuIENQREZfTGlzdDo6U2V0VGV4dChjc1RleHQsYlJlZnJlc2gpOwordm9pZCBDUFdMX0xpc3RCb3g6OlNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgeworICBpZiAobV9wTGlzdCkKKyAgICBtX3BMaXN0LT5TZXRGb250U2l6ZShmRm9udFNpemUpOwogfQogCi1DRlhfV2lkZVN0cmluZyBDUFdMX0xpc3RCb3g6OkdldFRleHQoKSBjb25zdAotewotCWlmIChtX3BMaXN0KQotCQlyZXR1cm4gbV9wTGlzdC0+R2V0VGV4dCgpOwotCi0JcmV0dXJuIEwiIjsKK0ZYX0ZMT0FUIENQV0xfTGlzdEJveDo6R2V0Rm9udFNpemUoKSBjb25zdCB7CisgIGlmIChtX3BMaXN0KQorICAgIHJldHVybiBtX3BMaXN0LT5HZXRGb250U2l6ZSgpOworICByZXR1cm4gMC4wZjsKIH0KIAotdm9pZCBDUFdMX0xpc3RCb3g6OlNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkKLXsKLQlpZiAobV9wTGlzdCkKLQkJbV9wTGlzdC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKK3ZvaWQgQ1BXTF9MaXN0Qm94OjpTZWxlY3QoaW50MzJfdCBuSXRlbUluZGV4KSB7CisgIGlmIChtX3BMaXN0KQorICAgIG1fcExpc3QtPlNlbGVjdChuSXRlbUluZGV4KTsKIH0KIAotRlhfRkxPQVQgQ1BXTF9MaXN0Qm94OjpHZXRGb250U2l6ZSgpIGNvbnN0Ci17Ci0JaWYgKG1fcExpc3QpCi0JCXJldHVybiBtX3BMaXN0LT5HZXRGb250U2l6ZSgpOwotCXJldHVybiAwLjBmOwordm9pZCBDUFdMX0xpc3RCb3g6OlNldENhcmV0KGludDMyX3Qgbkl0ZW1JbmRleCkgeworICBpZiAobV9wTGlzdCkKKyAgICBtX3BMaXN0LT5TZXRDYXJldChuSXRlbUluZGV4KTsKIH0KIAotdm9pZCBDUFdMX0xpc3RCb3g6OlNlbGVjdChGWF9JTlQzMiBuSXRlbUluZGV4KQotewotCWlmIChtX3BMaXN0KQotCQltX3BMaXN0LT5TZWxlY3Qobkl0ZW1JbmRleCk7Cit2b2lkIENQV0xfTGlzdEJveDo6U2V0VG9wVmlzaWJsZUluZGV4KGludDMyX3Qgbkl0ZW1JbmRleCkgeworICBpZiAobV9wTGlzdCkKKyAgICBtX3BMaXN0LT5TZXRUb3BJdGVtKG5JdGVtSW5kZXgpOwogfQogCi12b2lkIENQV0xfTGlzdEJveDo6U2V0Q2FyZXQoRlhfSU5UMzIgbkl0ZW1JbmRleCkKLXsKLQlpZiAobV9wTGlzdCkKLQkJbV9wTGlzdC0+U2V0Q2FyZXQobkl0ZW1JbmRleCk7Cit2b2lkIENQV0xfTGlzdEJveDo6U2Nyb2xsVG9MaXN0SXRlbShpbnQzMl90IG5JdGVtSW5kZXgpIHsKKyAgaWYgKG1fcExpc3QpCisgICAgbV9wTGlzdC0+U2Nyb2xsVG9MaXN0SXRlbShuSXRlbUluZGV4KTsKIH0KIAotdm9pZCBDUFdMX0xpc3RCb3g6OlNldFRvcFZpc2libGVJbmRleChGWF9JTlQzMiBuSXRlbUluZGV4KQotewotCWlmIChtX3BMaXN0KQotCQltX3BMaXN0LT5TZXRUb3BJdGVtKG5JdGVtSW5kZXgpOwordm9pZCBDUFdMX0xpc3RCb3g6OlJlc2V0Q29udGVudCgpIHsKKyAgaWYgKG1fcExpc3QpCisgICAgbV9wTGlzdC0+RW1wdHkoKTsKIH0KIAotdm9pZCBDUFdMX0xpc3RCb3g6OlNjcm9sbFRvTGlzdEl0ZW0oRlhfSU5UMzIgbkl0ZW1JbmRleCkKLXsKLQlpZiAobV9wTGlzdCkKLQkJbV9wTGlzdC0+U2Nyb2xsVG9MaXN0SXRlbShuSXRlbUluZGV4KTsKK3ZvaWQgQ1BXTF9MaXN0Qm94OjpSZXNldCgpIHsKKyAgaWYgKG1fcExpc3QpCisgICAgbV9wTGlzdC0+Q2FuY2VsKCk7CiB9CiAKLXZvaWQgQ1BXTF9MaXN0Qm94OjpSZXNldENvbnRlbnQoKQotewotCWlmIChtX3BMaXN0KQotCQltX3BMaXN0LT5FbXB0eSgpOworRlhfQk9PTCBDUFdMX0xpc3RCb3g6OklzTXVsdGlwbGVTZWwoKSBjb25zdCB7CisgIGlmIChtX3BMaXN0KQorICAgIHJldHVybiBtX3BMaXN0LT5Jc011bHRpcGxlU2VsKCk7CisKKyAgcmV0dXJuIEZBTFNFOwogfQogCi12b2lkIENQV0xfTGlzdEJveDo6UmVzZXQoKQotewotCWlmIChtX3BMaXN0KQotCQltX3BMaXN0LT5DYW5jZWwoKTsKK2ludDMyX3QgQ1BXTF9MaXN0Qm94OjpHZXRDYXJldEluZGV4KCkgY29uc3QgeworICBpZiAobV9wTGlzdCkKKyAgICByZXR1cm4gbV9wTGlzdC0+R2V0Q2FyZXQoKTsKKworICByZXR1cm4gLTE7CiB9CiAKLUZYX0JPT0wgQ1BXTF9MaXN0Qm94OjpJc011bHRpcGxlU2VsKCkgY29uc3QKLXsKLQlpZiAobV9wTGlzdCkKLQkJcmV0dXJuIG1fcExpc3QtPklzTXVsdGlwbGVTZWwoKTsKK2ludDMyX3QgQ1BXTF9MaXN0Qm94OjpHZXRDdXJTZWwoKSBjb25zdCB7CisgIGlmIChtX3BMaXN0KQorICAgIHJldHVybiBtX3BMaXN0LT5HZXRTZWxlY3QoKTsKIAotCXJldHVybiBGQUxTRTsKKyAgcmV0dXJuIC0xOwogfQogCi1GWF9JTlQzMiBDUFdMX0xpc3RCb3g6OkdldENhcmV0SW5kZXgoKSBjb25zdAotewotCWlmIChtX3BMaXN0KQotCQlyZXR1cm4gbV9wTGlzdC0+R2V0Q2FyZXQoKTsKK0ZYX0JPT0wgQ1BXTF9MaXN0Qm94OjpJc0l0ZW1TZWxlY3RlZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0IHsKKyAgaWYgKG1fcExpc3QpCisgICAgcmV0dXJuIG1fcExpc3QtPklzSXRlbVNlbGVjdGVkKG5JdGVtSW5kZXgpOwogCi0JcmV0dXJuIC0xOworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0lOVDMyIENQV0xfTGlzdEJveDo6R2V0Q3VyU2VsKCkgY29uc3QKLXsKLQlpZiAobV9wTGlzdCkKLQkJcmV0dXJuIG1fcExpc3QtPkdldFNlbGVjdCgpOworaW50MzJfdCBDUFdMX0xpc3RCb3g6OkdldFRvcFZpc2libGVJbmRleCgpIGNvbnN0IHsKKyAgaWYgKG1fcExpc3QpIHsKKyAgICBtX3BMaXN0LT5TY3JvbGxUb0xpc3RJdGVtKG1fcExpc3QtPkdldEZpcnN0U2VsZWN0ZWQoKSk7CisgICAgcmV0dXJuIG1fcExpc3QtPkdldFRvcEl0ZW0oKTsKKyAgfQogCi0JcmV0dXJuIC0xOworICByZXR1cm4gLTE7CiB9CiAKLUZYX0JPT0wgQ1BXTF9MaXN0Qm94OjpJc0l0ZW1TZWxlY3RlZChGWF9JTlQzMiBuSXRlbUluZGV4KSBjb25zdAotewotCWlmIChtX3BMaXN0KQotCQlyZXR1cm4gbV9wTGlzdC0+SXNJdGVtU2VsZWN0ZWQobkl0ZW1JbmRleCk7CitpbnQzMl90IENQV0xfTGlzdEJveDo6R2V0Q291bnQoKSBjb25zdCB7CisgIGlmIChtX3BMaXN0KQorICAgIHJldHVybiBtX3BMaXN0LT5HZXRDb3VudCgpOwogCi0JcmV0dXJuIEZBTFNFOworICByZXR1cm4gMDsKIH0KIAotRlhfSU5UMzIgQ1BXTF9MaXN0Qm94OjpHZXRUb3BWaXNpYmxlSW5kZXgoKSBjb25zdAotewotCWlmIChtX3BMaXN0KQotCXsKLQkJbV9wTGlzdC0+U2Nyb2xsVG9MaXN0SXRlbShtX3BMaXN0LT5HZXRGaXJzdFNlbGVjdGVkKCkpOwotCQlyZXR1cm4gbV9wTGlzdC0+R2V0VG9wSXRlbSgpOwotCX0KK2ludDMyX3QgQ1BXTF9MaXN0Qm94OjpGaW5kTmV4dChpbnQzMl90IG5JbmRleCwgRlhfV0NIQVIgbkNoYXIpIGNvbnN0IHsKKyAgaWYgKG1fcExpc3QpCisgICAgcmV0dXJuIG1fcExpc3QtPkZpbmROZXh0KG5JbmRleCwgbkNoYXIpOwogCi0JcmV0dXJuIC0xOworICByZXR1cm4gbkluZGV4OwogfQogCi1GWF9JTlQzMiBDUFdMX0xpc3RCb3g6OkdldENvdW50KCkgY29uc3QKLXsKLQlpZiAobV9wTGlzdCkKLQkJcmV0dXJuIG1fcExpc3QtPkdldENvdW50KCk7CitDUERGX1JlY3QgQ1BXTF9MaXN0Qm94OjpHZXRDb250ZW50UmVjdCgpIGNvbnN0IHsKKyAgaWYgKG1fcExpc3QpCisgICAgcmV0dXJuIG1fcExpc3QtPkdldENvbnRlbnRSZWN0KCk7CiAKLQlyZXR1cm4gMDsKKyAgcmV0dXJuIENQREZfUmVjdCgpOwogfQogCi1GWF9JTlQzMiBDUFdMX0xpc3RCb3g6OkZpbmROZXh0KEZYX0lOVDMyIG5JbmRleCxGWF9XQ0hBUiBuQ2hhcikgY29uc3QKLXsKLQlpZiAobV9wTGlzdCkKLQkJcmV0dXJuIG1fcExpc3QtPkZpbmROZXh0KG5JbmRleCxuQ2hhcik7CitGWF9GTE9BVCBDUFdMX0xpc3RCb3g6OkdldEZpcnN0SGVpZ2h0KCkgY29uc3QgeworICBpZiAobV9wTGlzdCkKKyAgICByZXR1cm4gbV9wTGlzdC0+R2V0Rmlyc3RIZWlnaHQoKTsKIAotCXJldHVybiBuSW5kZXg7CisgIHJldHVybiAwLjBmOwogfQogCi1DUERGX1JlY3QgQ1BXTF9MaXN0Qm94OjpHZXRDb250ZW50UmVjdCgpIGNvbnN0Ci17Ci0JaWYgKG1fcExpc3QpCi0JCXJldHVybiBtX3BMaXN0LT5HZXRDb250ZW50UmVjdCgpOwotCi0JcmV0dXJuIENQREZfUmVjdCgpOworQ1BERl9SZWN0IENQV0xfTGlzdEJveDo6R2V0TGlzdFJlY3QoKSBjb25zdCB7CisgIHJldHVybiBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdCgKKyAgICAgIEdldFdpbmRvd1JlY3QoKSwgKEZYX0ZMT0FUKShHZXRCb3JkZXJXaWR0aCgpICsgR2V0SW5uZXJCb3JkZXJXaWR0aCgpKSk7CiB9CiAKLUZYX0ZMT0FUIENQV0xfTGlzdEJveDo6R2V0Rmlyc3RIZWlnaHQoKSBjb25zdAotewotCWlmIChtX3BMaXN0KQotCQlyZXR1cm4gbV9wTGlzdC0+R2V0Rmlyc3RIZWlnaHQoKTsKK0ZYX0JPT0wgQ1BXTF9MaXN0Qm94OjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIHsKKyAgaWYgKCFtX3BMaXN0KQorICAgIHJldHVybiBGQUxTRTsKIAotCXJldHVybiAwLjBmOworICBpZiAoekRlbHRhIDwgMCkgeworICAgIG1fcExpc3QtPk9uVktfRE9XTihJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKKyAgfSBlbHNlIHsKKyAgICBtX3BMaXN0LT5PblZLX1VQKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOworICB9CisKKyAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOworICBPbk5vdGlmeVNlbENoYW5nZWQoRkFMU0UsIGJFeGl0LCBuRmxhZyk7CisgIHJldHVybiBUUlVFOwogfQotCi1DUERGX1JlY3QgQ1BXTF9MaXN0Qm94OjpHZXRMaXN0UmVjdCgpIGNvbnN0Ci17Ci0JcmV0dXJuIENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KEdldFdpbmRvd1JlY3QoKSwoRlhfRkxPQVQpKEdldEJvcmRlcldpZHRoKCkrR2V0SW5uZXJCb3JkZXJXaWR0aCgpKSk7Ci19Ci0KLUZYX0JPT0wJQ1BXTF9MaXN0Qm94OjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQotewotCWlmICghbV9wTGlzdCkgcmV0dXJuIEZBTFNFOwotCi0JaWYgKHpEZWx0YSA8IDApCi0JewotCQltX3BMaXN0LT5PblZLX0RPV04oSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKTsKLQl9Ci0JZWxzZQotCXsKLQkJbV9wTGlzdC0+T25WS19VUChJc1NISUZUcHJlc3NlZChuRmxhZyksSXNDVFJMcHJlc3NlZChuRmxhZykpOwotCX0KLQotCUZYX0JPT0wgYkV4aXQgPSBGQUxTRTsKLQlPbk5vdGlmeVNlbENoYW5nZWQoRkFMU0UsYkV4aXQsIG5GbGFnKTsKLQlyZXR1cm4gVFJVRTsKLX0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9MaXN0Q3RybC5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0xpc3RDdHJsLmNwcAppbmRleCA5YWMxOGZkLi42ZDk2MjdiIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0xpc3RDdHJsLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0xpc3RDdHJsLmNwcApAQCAtMSwyNDUgKzEsMjA1IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QREZXaW5kb3cuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfV25kLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0xpc3RDdHJsLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGlzdEN0cmwuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9XbmQuaCIKIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0xpc3RDdHJsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK0NQV0xfTGlzdEN0cmw6OkNQV0xfTGlzdEN0cmwoKQorICAgIDogbV9yY0NvbnRlbnQoMCwgMCwgMCwgMCksCisgICAgICBtX3B0U2Nyb2xsKDAsIDApLAorICAgICAgbV9mSXRlbVNwYWNlKDAuMGYpLAorICAgICAgbV9mVG9wU3BhY2UoMC4wZiksCisgICAgICBtX2ZCb3R0b21TcGFjZSgwLjBmKSB7fQogCi1DUFdMX0xpc3RDdHJsOjpDUFdMX0xpc3RDdHJsKCkgOiAKLQltX3JjQ29udGVudCgwLDAsMCwwKSwKLQltX3B0U2Nyb2xsKDAsMCksIAotCW1fZkl0ZW1TcGFjZSgwLjBmKSwKLQltX2ZUb3BTcGFjZSgwLjBmKSwKLQltX2ZCb3R0b21TcGFjZSgwLjBmKQoteworQ1BXTF9MaXN0Q3RybDo6fkNQV0xfTGlzdEN0cmwoKSB7fQorCit2b2lkIENQV0xfTGlzdEN0cmw6OlNldFNjcm9sbFBvcyhjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBtX3B0U2Nyb2xsID0gcG9pbnQ7CisKKyAgaWYgKG1fcHRTY3JvbGwueCA8IG1fcmNDb250ZW50LmxlZnQpCisgICAgbV9wdFNjcm9sbC54ID0gbV9yY0NvbnRlbnQubGVmdDsKKworICBpZiAobV9wdFNjcm9sbC54ID4gbV9yY0NvbnRlbnQucmlnaHQpCisgICAgbV9wdFNjcm9sbC54ID0gbV9yY0NvbnRlbnQucmlnaHQ7CisKKyAgaWYgKG1fcHRTY3JvbGwueSA+IG1fcmNDb250ZW50LnRvcCkKKyAgICBtX3B0U2Nyb2xsLnkgPSBtX3JjQ29udGVudC50b3A7CisKKyAgaWYgKG1fcHRTY3JvbGwueSA8IG1fcmNDb250ZW50LmJvdHRvbSkKKyAgICBtX3B0U2Nyb2xsLnkgPSBtX3JjQ29udGVudC5ib3R0b207CiB9CiAKLUNQV0xfTGlzdEN0cmw6On5DUFdMX0xpc3RDdHJsKCkKLXsKK0NQREZfUG9pbnQgQ1BXTF9MaXN0Q3RybDo6R2V0U2Nyb2xsUG9zKCkgY29uc3QgeworICByZXR1cm4gbV9wdFNjcm9sbDsKIH0KIAotdm9pZCBDUFdMX0xpc3RDdHJsOjpTZXRTY3JvbGxQb3MoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0JbV9wdFNjcm9sbCA9IHBvaW50OwotCi0JaWYgKG1fcHRTY3JvbGwueCA8IG1fcmNDb250ZW50LmxlZnQpCi0JCW1fcHRTY3JvbGwueCA9IG1fcmNDb250ZW50LmxlZnQ7Ci0KLQlpZiAobV9wdFNjcm9sbC54ID4gbV9yY0NvbnRlbnQucmlnaHQpCi0JCW1fcHRTY3JvbGwueCA9IG1fcmNDb250ZW50LnJpZ2h0OwotCi0JaWYgKG1fcHRTY3JvbGwueSA+IG1fcmNDb250ZW50LnRvcCkKLQkJbV9wdFNjcm9sbC55ID0gbV9yY0NvbnRlbnQudG9wOwotCi0JaWYgKG1fcHRTY3JvbGwueSA8IG1fcmNDb250ZW50LmJvdHRvbSkKLQkJbV9wdFNjcm9sbC55ID0gbV9yY0NvbnRlbnQuYm90dG9tOwkKK0NQREZfUmVjdCBDUFdMX0xpc3RDdHJsOjpHZXRTY3JvbGxBcmVhKCkgY29uc3QgeworICByZXR1cm4gbV9yY0NvbnRlbnQ7CiB9CiAKLUNQREZfUG9pbnQgQ1BXTF9MaXN0Q3RybDo6R2V0U2Nyb2xsUG9zKCkgY29uc3QKLXsKLQlyZXR1cm4gbV9wdFNjcm9sbDsKK3ZvaWQgQ1BXTF9MaXN0Q3RybDo6UmVzZXRGYWNlKCkgeworICBSZXNldEFsbChGQUxTRSwgMCk7CiB9CiAKLUNQREZfUmVjdCBDUFdMX0xpc3RDdHJsOjpHZXRTY3JvbGxBcmVhKCkgY29uc3QKLXsKLQlyZXR1cm4gbV9yY0NvbnRlbnQ7Cit2b2lkIENQV0xfTGlzdEN0cmw6OlJlc2V0Q29udGVudChpbnQzMl90IG5TdGFydCkgeworICBpZiAoblN0YXJ0IDwgMCkKKyAgICBuU3RhcnQgPSAwOworICBpZiAoblN0YXJ0ID49IDAgJiYgblN0YXJ0IDwgbV9hQ2hpbGRyZW4uR2V0U2l6ZSgpKQorICAgIFJlc2V0QWxsKFRSVUUsIG5TdGFydCk7CiB9CiAKLXZvaWQgQ1BXTF9MaXN0Q3RybDo6UmVzZXRGYWNlKCkKLXsKLQlSZXNldEFsbChGQUxTRSwgMCk7CitGWF9GTE9BVCBDUFdMX0xpc3RDdHJsOjpHZXRDb250ZW50c0hlaWdodChGWF9GTE9BVCBmTGltaXRXaWR0aCkgeworICBGWF9GTE9BVCBmUmV0ID0gbV9mVG9wU3BhY2U7CisKKyAgRlhfRkxPQVQgZkJvcmRlcldpZHRoID0gKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCk7CisKKyAgaWYgKGZMaW1pdFdpZHRoID4gZkJvcmRlcldpZHRoICogMikgeworICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FDaGlsZHJlbi5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKSB7CisgICAgICAgIEZYX0ZMT0FUIGZMZWZ0ID0gcENoaWxkLT5HZXRJdGVtTGVmdE1hcmdpbigpOworICAgICAgICBGWF9GTE9BVCBmUmlnaHQgPSBwQ2hpbGQtPkdldEl0ZW1SaWdodE1hcmdpbigpOworCisgICAgICAgIGZSZXQgKz0gcENoaWxkLT5HZXRJdGVtSGVpZ2h0KGZMaW1pdFdpZHRoIC0gZkJvcmRlcldpZHRoICogMiAtIGZMZWZ0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJpZ2h0KTsKKyAgICAgICAgZlJldCArPSBtX2ZJdGVtU3BhY2U7CisgICAgICB9CisgICAgfQorCisgICAgZlJldCAtPSBtX2ZJdGVtU3BhY2U7CisgIH0KKworICBmUmV0ICs9IG1fZkJvdHRvbVNwYWNlOworCisgIHJldHVybiBmUmV0OwogfQogCi12b2lkIENQV0xfTGlzdEN0cmw6OlJlc2V0Q29udGVudChGWF9JTlQzMiBuU3RhcnQpCi17Ci0JaWYgKG5TdGFydCA8IDApCi0JCW5TdGFydCA9IDA7Ci0JaWYgKG5TdGFydCA+PSAwICYmIG5TdGFydCA8IG1fYUNoaWxkcmVuLkdldFNpemUoKSkKLQkJUmVzZXRBbGwoVFJVRSwgblN0YXJ0KTsKK3ZvaWQgQ1BXTF9MaXN0Q3RybDo6UmVzZXRBbGwoRlhfQk9PTCBiTW92ZSwgaW50MzJfdCBuU3RhcnQpIHsKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworCisgIEZYX0ZMT0FUIGZXaWR0aCA9IHJjQ2xpZW50LldpZHRoKCk7CisKKyAgRlhfRkxPQVQgZnkgPSAwLjBmIC0gbV9mVG9wU3BhY2U7CisKKyAgaWYgKG5TdGFydCAtIDEgPj0gMCAmJiBuU3RhcnQgLSAxIDwgbV9hQ2hpbGRyZW4uR2V0U2l6ZSgpKQorICAgIGlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoblN0YXJ0IC0gMSkpCisgICAgICBmeSA9IHBDaGlsZC0+R2V0V2luZG93UmVjdCgpLmJvdHRvbSAtIG1fZkl0ZW1TcGFjZTsKKworICBmb3IgKGludDMyX3QgaSA9IG5TdGFydCwgc3ogPSBtX2FDaGlsZHJlbi5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkgeworICAgICAgRlhfRkxPQVQgZkxlZnQgPSBwQ2hpbGQtPkdldEl0ZW1MZWZ0TWFyZ2luKCk7CisgICAgICBGWF9GTE9BVCBmUmlnaHQgPSBwQ2hpbGQtPkdldEl0ZW1SaWdodE1hcmdpbigpOworCisgICAgICBwQ2hpbGQtPlNldENoaWxkTWF0cml4KENGWF9NYXRyaXgoMSwgMCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5sZWZ0IC0gbV9wdFNjcm9sbC54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LnRvcCAtIG1fcHRTY3JvbGwueSkpOworCisgICAgICBpZiAoYk1vdmUpIHsKKyAgICAgICAgRlhfRkxPQVQgZkl0ZW1IZWlnaHQgPSBwQ2hpbGQtPkdldEl0ZW1IZWlnaHQoZldpZHRoIC0gZkxlZnQgLSBmUmlnaHQpOworICAgICAgICBwQ2hpbGQtPk1vdmUoQ1BERl9SZWN0KGZMZWZ0LCBmeSAtIGZJdGVtSGVpZ2h0LCBmV2lkdGggLSBmUmlnaHQsIGZ5KSwKKyAgICAgICAgICAgICAgICAgICAgIFRSVUUsIEZBTFNFKTsKKyAgICAgICAgZnkgLT0gZkl0ZW1IZWlnaHQ7CisgICAgICAgIGZ5IC09IG1fZkl0ZW1TcGFjZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmeSArPSBtX2ZJdGVtU3BhY2U7CisKKyAgZnkgLT0gbV9mQm90dG9tU3BhY2U7CisKKyAgaWYgKGJNb3ZlKSB7CisgICAgbV9yY0NvbnRlbnQubGVmdCA9IDA7CisgICAgbV9yY0NvbnRlbnQudG9wID0gMDsKKyAgICBtX3JjQ29udGVudC5yaWdodCA9IGZXaWR0aDsKKyAgICBtX3JjQ29udGVudC5ib3R0b20gPSBmeTsKKyAgfQogfQogCi1GWF9GTE9BVCBDUFdMX0xpc3RDdHJsOjpHZXRDb250ZW50c0hlaWdodChGWF9GTE9BVCBmTGltaXRXaWR0aCkKLXsKLQlGWF9GTE9BVCBmUmV0ID0gbV9mVG9wU3BhY2U7Ci0KLQlGWF9GTE9BVCBmQm9yZGVyV2lkdGggPSAoRlhfRkxPQVQpdGhpcy0+R2V0Qm9yZGVyV2lkdGgoKTsKLQotCWlmIChmTGltaXRXaWR0aCA+IGZCb3JkZXJXaWR0aCogMikKLQl7Ci0JCWZvciAoRlhfSU5UMzIgaT0wLHN6PW1fYUNoaWxkcmVuLkdldFNpemUoKTsgaTxzejsgaSsrKQotCQl7Ci0JCQlpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKQotCQkJewotCQkJCUZYX0ZMT0FUIGZMZWZ0ID0gcENoaWxkLT5HZXRJdGVtTGVmdE1hcmdpbigpOwotCQkJCUZYX0ZMT0FUIGZSaWdodCA9IHBDaGlsZC0+R2V0SXRlbVJpZ2h0TWFyZ2luKCk7Ci0KLQkJCQlmUmV0ICs9IHBDaGlsZC0+R2V0SXRlbUhlaWdodChmTGltaXRXaWR0aCAtIGZCb3JkZXJXaWR0aCogMiAtIGZMZWZ0IC0gZlJpZ2h0KTsKLQkJCQlmUmV0ICs9IG1fZkl0ZW1TcGFjZTsKLQkJCX0KLQkJfQotCi0JCWZSZXQgLT0gbV9mSXRlbVNwYWNlOwotCX0KLQotCWZSZXQgKz0gbV9mQm90dG9tU3BhY2U7Ci0KLQlyZXR1cm4gZlJldDsKK3ZvaWQgQ1BXTF9MaXN0Q3RybDo6U2V0SXRlbVNwYWNlKEZYX0ZMT0FUIGZTcGFjZSkgeworICBtX2ZJdGVtU3BhY2UgPSBmU3BhY2U7CiB9CiAKLXZvaWQgQ1BXTF9MaXN0Q3RybDo6UmVzZXRBbGwoRlhfQk9PTCBiTW92ZSwgRlhfSU5UMzIgblN0YXJ0KQotewotCUNQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKLQotCUZYX0ZMT0FUIGZXaWR0aCA9IHJjQ2xpZW50LldpZHRoKCk7Ci0KLQlGWF9GTE9BVCBmeSA9IDAuMGYgLSBtX2ZUb3BTcGFjZTsKLQotCWlmIChuU3RhcnQtMSA+PSAwICYmIG5TdGFydC0xIDwgbV9hQ2hpbGRyZW4uR2V0U2l6ZSgpKQotCQlpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KG5TdGFydC0xKSkKLQkJCWZ5ID0gcENoaWxkLT5HZXRXaW5kb3dSZWN0KCkuYm90dG9tIC0gbV9mSXRlbVNwYWNlOwotCi0JZm9yIChGWF9JTlQzMiBpPW5TdGFydCxzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQl7Ci0JCWlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpCi0JCXsKLQkJCUZYX0ZMT0FUIGZMZWZ0ID0gcENoaWxkLT5HZXRJdGVtTGVmdE1hcmdpbigpOwotCQkJRlhfRkxPQVQgZlJpZ2h0ID0gcENoaWxkLT5HZXRJdGVtUmlnaHRNYXJnaW4oKTsKLQotCQkJcENoaWxkLT5TZXRDaGlsZE1hdHJpeCgKLQkJCQlDUERGX01hdHJpeCgxLDAsMCwxLCAKLQkJCQlyY0NsaWVudC5sZWZ0IC0gbV9wdFNjcm9sbC54LCAKLQkJCQlyY0NsaWVudC50b3AgLSBtX3B0U2Nyb2xsLnkpCi0JCQkJKTsKLQotCQkJaWYgKGJNb3ZlKQotCQkJewotCQkJCUZYX0ZMT0FUIGZJdGVtSGVpZ2h0ID0gcENoaWxkLT5HZXRJdGVtSGVpZ2h0KGZXaWR0aCAtIGZMZWZ0IC0gZlJpZ2h0KTsKLQkJCQlwQ2hpbGQtPk1vdmUoQ1BERl9SZWN0KGZMZWZ0LCBmeS1mSXRlbUhlaWdodCwgZldpZHRoIC0gZlJpZ2h0LCBmeSksIFRSVUUsIEZBTFNFKTsKLQkJCQlmeSAtPSBmSXRlbUhlaWdodDsKLQkJCQlmeSAtPSBtX2ZJdGVtU3BhY2U7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlmeSArPSBtX2ZJdGVtU3BhY2U7Ci0KLQlmeSAtPSBtX2ZCb3R0b21TcGFjZTsKLQotCWlmIChiTW92ZSkKLQl7Ci0JCW1fcmNDb250ZW50LmxlZnQgPSAwOwotCQltX3JjQ29udGVudC50b3AgPSAwOwotCQltX3JjQ29udGVudC5yaWdodCA9IGZXaWR0aDsKLQkJbV9yY0NvbnRlbnQuYm90dG9tID0gZnk7Ci0JfQordm9pZCBDUFdMX0xpc3RDdHJsOjpTZXRUb3BTcGFjZShGWF9GTE9BVCBmU3BhY2UpIHsKKyAgbV9mVG9wU3BhY2UgPSBmU3BhY2U7CiB9CiAKLXZvaWQgQ1BXTF9MaXN0Q3RybDo6U2V0SXRlbVNwYWNlKEZYX0ZMT0FUIGZTcGFjZSkKLXsKLQltX2ZJdGVtU3BhY2UgPSBmU3BhY2U7Cit2b2lkIENQV0xfTGlzdEN0cmw6OlNldEJvdHRvbVNwYWNlKEZYX0ZMT0FUIGZTcGFjZSkgeworICBtX2ZCb3R0b21TcGFjZSA9IGZTcGFjZTsKIH0KIAotdm9pZCBDUFdMX0xpc3RDdHJsOjpTZXRUb3BTcGFjZShGWF9GTE9BVCBmU3BhY2UpCi17Ci0JbV9mVG9wU3BhY2UgPSBmU3BhY2U7Cit2b2lkIENQV0xfTGlzdEN0cmw6OlJlUG9zQ2hpbGRXbmQoKSB7CisgIFJlc2V0RmFjZSgpOwogfQogCi12b2lkIENQV0xfTGlzdEN0cmw6OlNldEJvdHRvbVNwYWNlKEZYX0ZMT0FUIGZTcGFjZSkKLXsKLQltX2ZCb3R0b21TcGFjZSA9IGZTcGFjZTsKK3ZvaWQgQ1BXTF9MaXN0Q3RybDo6RHJhd0NoaWxkQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSkgeworICBwRGV2aWNlLT5TYXZlU3RhdGUoKTsKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworICBDUERGX1JlY3QgcmNUZW1wID0gcmNDbGllbnQ7CisgIHBVc2VyMkRldmljZS0+VHJhbnNmb3JtUmVjdChyY1RlbXApOworICBGWF9SRUNUIHJjQ2xpcCgoaW50MzJfdClyY1RlbXAubGVmdCwgKGludDMyX3QpcmNUZW1wLmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgKGludDMyX3QpcmNUZW1wLnJpZ2h0LCAoaW50MzJfdClyY1RlbXAudG9wKTsKKworICBwRGV2aWNlLT5TZXRDbGlwX1JlY3QoJnJjQ2xpcCk7CisKKyAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYUNoaWxkcmVuLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKSB7CisgICAgICBDUERGX1JlY3QgcmNDaGlsZCA9IHBDaGlsZC0+Q2hpbGRUb1BhcmVudChwQ2hpbGQtPkdldFdpbmRvd1JlY3QoKSk7CisgICAgICBpZiAoIShyY0NoaWxkLnRvcCA8IHJjQ2xpZW50LmJvdHRvbSB8fCByY0NoaWxkLmJvdHRvbSA+IHJjQ2xpZW50LnRvcCkpIHsKKyAgICAgICAgQ0ZYX01hdHJpeCBtdCA9IHBDaGlsZC0+R2V0Q2hpbGRNYXRyaXgoKTsKKyAgICAgICAgaWYgKG10LklzSWRlbnRpdHkoKSkgeworICAgICAgICAgIHBDaGlsZC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtdC5Db25jYXQoKnBVc2VyMkRldmljZSk7CisgICAgICAgICAgcENoaWxkLT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCAmbXQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CiB9CiAKLXZvaWQgQ1BXTF9MaXN0Q3RybDo6UmVQb3NDaGlsZFduZCgpCi17Ci0JUmVzZXRGYWNlKCk7CitpbnQzMl90IENQV0xfTGlzdEN0cmw6OkdldEl0ZW1JbmRleChDUFdMX1duZCogcEl0ZW0pIHsKKyAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYUNoaWxkcmVuLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAocEl0ZW0gPT0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpCisgICAgICByZXR1cm4gaTsKKyAgfQorCisgIHJldHVybiAtMTsKIH0KIAotdm9pZCBDUFdMX0xpc3RDdHJsOjpEcmF3Q2hpbGRBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpCi17Ci0JcERldmljZS0+U2F2ZVN0YXRlKCk7Ci0JQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwotCUNQREZfUmVjdCByY1RlbXAgPSByY0NsaWVudDsKLQlwVXNlcjJEZXZpY2UtPlRyYW5zZm9ybVJlY3QocmNUZW1wKTsKLQlGWF9SRUNUIHJjQ2xpcCgoRlhfSU5UMzIpcmNUZW1wLmxlZnQsCi0JCShGWF9JTlQzMilyY1RlbXAuYm90dG9tLAotCQkoRlhfSU5UMzIpcmNUZW1wLnJpZ2h0LAotCQkoRlhfSU5UMzIpcmNUZW1wLnRvcCk7CitDUERGX1BvaW50IENQV0xfTGlzdEN0cmw6OkluVG9PdXQoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0IHsKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwogCi0JcERldmljZS0+U2V0Q2xpcF9SZWN0KCZyY0NsaXApOwotCi0JZm9yIChGWF9JTlQzMiBpPTAsc3o9bV9hQ2hpbGRyZW4uR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JewotCQlpZiAoQ1BXTF9XbmQgKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkKLQkJewotCQkJQ1BERl9SZWN0IHJjQ2hpbGQgPSBwQ2hpbGQtPkNoaWxkVG9QYXJlbnQocENoaWxkLT5HZXRXaW5kb3dSZWN0KCkpOwotCQkJaWYgKCEocmNDaGlsZC50b3AgPCByY0NsaWVudC5ib3R0b20gfHwgcmNDaGlsZC5ib3R0b20gPiByY0NsaWVudC50b3ApKQotCQkJewotCQkJCUNQREZfTWF0cml4IG10ID0gcENoaWxkLT5HZXRDaGlsZE1hdHJpeCgpOwotCQkJCWlmIChtdC5Jc0lkZW50aXR5KCkpCi0JCQkJewotCQkJCQlwQ2hpbGQtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UscFVzZXIyRGV2aWNlKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJbXQuQ29uY2F0KCpwVXNlcjJEZXZpY2UpOwotCQkJCQlwQ2hpbGQtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsJm10KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CisgIHJldHVybiBDUERGX1BvaW50KHBvaW50LnggKyByY0NsaWVudC5sZWZ0IC0gbV9wdFNjcm9sbC54LAorICAgICAgICAgICAgICAgICAgICBwb2ludC55ICsgcmNDbGllbnQudG9wIC0gbV9wdFNjcm9sbC55KTsKIH0KIAotRlhfSU5UMzIgQ1BXTF9MaXN0Q3RybDo6R2V0SXRlbUluZGV4KENQV0xfV25kKiBwSXRlbSkKLXsKLQlmb3IgKEZYX0lOVDMyIGk9MCwgc3o9bV9hQ2hpbGRyZW4uR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JewotCQlpZiAocEl0ZW0gPT0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpCi0JCQlyZXR1cm4gaTsKLQl9CitDUERGX1BvaW50IENQV0xfTGlzdEN0cmw6Ok91dFRvSW4oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0IHsKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwogCi0JcmV0dXJuIC0xOworICByZXR1cm4gQ1BERl9Qb2ludChwb2ludC54IC0gcmNDbGllbnQubGVmdCArIG1fcHRTY3JvbGwueCwKKyAgICAgICAgICAgICAgICAgICAgcG9pbnQueSAtIHJjQ2xpZW50LnRvcCArIG1fcHRTY3JvbGwueSk7CiB9CiAKLUNQREZfUG9pbnQgQ1BXTF9MaXN0Q3RybDo6SW5Ub091dChjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3QKLXsKLQlDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CitDUERGX1JlY3QgQ1BXTF9MaXN0Q3RybDo6SW5Ub091dChjb25zdCBDUERGX1JlY3QmIHJlY3QpIGNvbnN0IHsKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwogCi0JcmV0dXJuIENQREZfUG9pbnQocG9pbnQueCArIHJjQ2xpZW50LmxlZnQgLSBtX3B0U2Nyb2xsLngsIAotCQlwb2ludC55ICsgcmNDbGllbnQudG9wIC0gbV9wdFNjcm9sbC55KTsKKyAgcmV0dXJuIENQREZfUmVjdChyZWN0LmxlZnQgKyByY0NsaWVudC5sZWZ0IC0gbV9wdFNjcm9sbC54LAorICAgICAgICAgICAgICAgICAgIHJlY3QuYm90dG9tICsgcmNDbGllbnQudG9wIC0gbV9wdFNjcm9sbC55LAorICAgICAgICAgICAgICAgICAgIHJlY3QucmlnaHQgKyByY0NsaWVudC5sZWZ0IC0gbV9wdFNjcm9sbC54LAorICAgICAgICAgICAgICAgICAgIHJlY3QudG9wICsgcmNDbGllbnQudG9wIC0gbV9wdFNjcm9sbC55KTsKIH0KIAotQ1BERl9Qb2ludCBDUFdMX0xpc3RDdHJsOjpPdXRUb0luKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdAotewotCUNQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKK0NQREZfUmVjdCBDUFdMX0xpc3RDdHJsOjpPdXRUb0luKGNvbnN0IENQREZfUmVjdCYgcmVjdCkgY29uc3QgeworICBDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CiAKLQlyZXR1cm4gQ1BERl9Qb2ludChwb2ludC54IC0gcmNDbGllbnQubGVmdCArIG1fcHRTY3JvbGwueCwgCi0JCXBvaW50LnkgLSByY0NsaWVudC50b3AgKyBtX3B0U2Nyb2xsLnkpOworICByZXR1cm4gQ1BERl9SZWN0KHJlY3QubGVmdCAtIHJjQ2xpZW50LmxlZnQgKyBtX3B0U2Nyb2xsLngsCisgICAgICAgICAgICAgICAgICAgcmVjdC5ib3R0b20gLSByY0NsaWVudC50b3AgKyBtX3B0U2Nyb2xsLnksCisgICAgICAgICAgICAgICAgICAgcmVjdC5yaWdodCAtIHJjQ2xpZW50LmxlZnQgKyBtX3B0U2Nyb2xsLngsCisgICAgICAgICAgICAgICAgICAgcmVjdC50b3AgLSByY0NsaWVudC50b3AgKyBtX3B0U2Nyb2xsLnkpOwogfQotCi1DUERGX1JlY3QgQ1BXTF9MaXN0Q3RybDo6SW5Ub091dChjb25zdCBDUERGX1JlY3QmIHJlY3QpIGNvbnN0Ci17Ci0JQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwotCi0JcmV0dXJuIENQREZfUmVjdChyZWN0LmxlZnQgKyByY0NsaWVudC5sZWZ0IC0gbV9wdFNjcm9sbC54LAotCQlyZWN0LmJvdHRvbSArIHJjQ2xpZW50LnRvcCAtIG1fcHRTY3JvbGwueSwKLQkJcmVjdC5yaWdodCArIHJjQ2xpZW50LmxlZnQgLSBtX3B0U2Nyb2xsLngsCi0JCXJlY3QudG9wICsgcmNDbGllbnQudG9wIC0gbV9wdFNjcm9sbC55KTsKLX0KLQotQ1BERl9SZWN0IENQV0xfTGlzdEN0cmw6Ok91dFRvSW4oY29uc3QgQ1BERl9SZWN0JiByZWN0KSBjb25zdAotewotCUNQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKLQotCXJldHVybiBDUERGX1JlY3QocmVjdC5sZWZ0IC0gcmNDbGllbnQubGVmdCArIG1fcHRTY3JvbGwueCwKLQkJcmVjdC5ib3R0b20gLSByY0NsaWVudC50b3AgKyBtX3B0U2Nyb2xsLnksCi0JCXJlY3QucmlnaHQgLSByY0NsaWVudC5sZWZ0ICsgbV9wdFNjcm9sbC54LAotCQlyZWN0LnRvcCAtIHJjQ2xpZW50LnRvcCArIG1fcHRTY3JvbGwueSk7Ci19Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTm90ZS5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX05vdGUuY3BwCmluZGV4IDMzZDFiM2IuLjc2MDk2N2IgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTm90ZS5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9Ob3RlLmNwcApAQCAtMSwxNzc3ICsxLDE1MDkgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BERldpbmRvdy5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9XbmQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQnV0dG9uLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXQuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGlzdEN0cmwuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU2Nyb2xsQmFyLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX05vdGUuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGFiZWwuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfRWRpdC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfVXRpbHMuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfQ2FyZXQuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9Ob3RlLmgiCiAKLSNkZWZpbmUgUE9QVVBfSVRFTV9IRUFEX0JPVFRPTQkJCQkJMy4wZgotI2RlZmluZSBQT1BVUF9JVEVNX0JPVFRPTVdJRFRICQkJCQkxLjBmCi0jZGVmaW5lIFBPUFVQX0lURU1fU0lERU1BUkdJTgkJCQkJMy4wZgotI2RlZmluZSBQT1BVUF9JVEVNX1NQQUNFCQkJCQkJNC4wZgotI2RlZmluZSBQT1BVUF9JVEVNX1RFWFRfSU5ERU5UCQkJCQkyLjBmCi0jZGVmaW5lIFBPUFVQX0lURU1fQk9SREVSQ09MT1IJCQkJCUNQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgODAvMjU1LjBmLCA4MC8yNTUuMGYsIDgwLzI1NS4wZikKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9CdXR0b24uaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9DYXJldC5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0VkaXQuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9FZGl0Q3RybC5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0xhYmVsLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGlzdEN0cmwuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oIgogCi0jZGVmaW5lIElzRmxvYXRaZXJvKGYpCQkJCQkJKChmKSA8IDAuMDAwMSAmJiAoZikgPiAtMC4wMDAxKQotI2RlZmluZSBJc0Zsb2F0QmlnZ2VyKGZhLGZiKQkJCQkoKGZhKSA+IChmYikgJiYgIUlzRmxvYXRaZXJvKChmYSkgLSAoZmIpKSkKLSNkZWZpbmUgSXNGbG9hdFNtYWxsZXIoZmEsZmIpCQkJCSgoZmEpIDwgKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQotI2RlZmluZSBJc0Zsb2F0RXF1YWwoZmEsZmIpCQkJCQlJc0Zsb2F0WmVybygoZmEpLShmYikpCi0KKyNkZWZpbmUgUE9QVVBfSVRFTV9IRUFEX0JPVFRPTSAzLjBmCisjZGVmaW5lIFBPUFVQX0lURU1fQk9UVE9NV0lEVEggMS4wZgorI2RlZmluZSBQT1BVUF9JVEVNX1NJREVNQVJHSU4gMy4wZgorI2RlZmluZSBQT1BVUF9JVEVNX1NQQUNFIDQuMGYKKyNkZWZpbmUgUE9QVVBfSVRFTV9URVhUX0lOREVOVCAyLjBmCisjZGVmaW5lIFBPUFVQX0lURU1fQk9SREVSQ09MT1IgXAorICBDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsIDgwIC8gMjU1LjBmLCA4MCAvIDI1NS4wZiwgODAgLyAyNTUuMGYpCiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9Ob3RlX09wdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBJc0Zsb2F0WmVybyhmKSAoKGYpIDwgMC4wMDAxICYmIChmKSA+IC0wLjAwMDEpCisjZGVmaW5lIElzRmxvYXRCaWdnZXIoZmEsIGZiKSAoKGZhKSA+IChmYikgJiYgIUlzRmxvYXRaZXJvKChmYSkgLSAoZmIpKSkKKyNkZWZpbmUgSXNGbG9hdFNtYWxsZXIoZmEsIGZiKSAoKGZhKSA8IChmYikgJiYgIUlzRmxvYXRaZXJvKChmYSkgLSAoZmIpKSkKKyNkZWZpbmUgSXNGbG9hdEVxdWFsKGZhLCBmYikgSXNGbG9hdFplcm8oKGZhKSAtIChmYikpCiAKLUNQV0xfTm90ZV9PcHRpb25zOjpDUFdMX05vdGVfT3B0aW9ucygpIDogbV9wVGV4dChOVUxMKQotewotfQorQ1BXTF9Ob3RlX09wdGlvbnM6OkNQV0xfTm90ZV9PcHRpb25zKCkgOiBtX3BUZXh0KE5VTEwpIHt9CiAKLUNQV0xfTm90ZV9PcHRpb25zOjp+Q1BXTF9Ob3RlX09wdGlvbnMoKQotewotfQorQ1BXTF9Ob3RlX09wdGlvbnM6On5DUFdMX05vdGVfT3B0aW9ucygpIHt9CiAKLXZvaWQgQ1BXTF9Ob3RlX09wdGlvbnM6OlNldFRleHRDb2xvcihjb25zdCBDUFdMX0NvbG9yICYgY29sb3IpCi17Ci0JQ1BXTF9XbmQ6OlNldFRleHRDb2xvcihjb2xvcik7Cit2b2lkIENQV0xfTm90ZV9PcHRpb25zOjpTZXRUZXh0Q29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpIHsKKyAgQ1BXTF9XbmQ6OlNldFRleHRDb2xvcihjb2xvcik7CiAKLQlpZiAobV9wVGV4dCkKLQkJbV9wVGV4dC0+U2V0VGV4dENvbG9yKGNvbG9yKTsKKyAgaWYgKG1fcFRleHQpCisgICAgbV9wVGV4dC0+U2V0VGV4dENvbG9yKGNvbG9yKTsKIH0KIAotdm9pZCBDUFdMX05vdGVfT3B0aW9uczo6UmVQb3NDaGlsZFduZCgpCi17Ci0JaWYgKHRoaXMtPklzVmFsaWQoKSkKLQl7Ci0JCUFTU0VSVChtX3BUZXh0ICE9IE5VTEwpOwordm9pZCBDUFdMX05vdGVfT3B0aW9uczo6UmVQb3NDaGlsZFduZCgpIHsKKyAgaWYgKElzVmFsaWQoKSkgeworICAgIENQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKIAotCQlDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7Ci0KLQkJaWYgKHJjQ2xpZW50LldpZHRoKCkgPiAxNS4wZikKLQkJewotCQkJcmNDbGllbnQucmlnaHQgLT0gMTUuMGY7Ci0JCQltX3BUZXh0LT5Nb3ZlKHJjQ2xpZW50LCBUUlVFLCBGQUxTRSk7Ci0JCQltX3BUZXh0LT5TZXRWaXNpYmxlKFRSVUUpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJbV9wVGV4dC0+TW92ZShDUERGX1JlY3QoMCwwLDAsMCksIFRSVUUsIEZBTFNFKTsKLQkJCW1fcFRleHQtPlNldFZpc2libGUoRkFMU0UpOwotCQl9Ci0JfQorICAgIGlmIChyY0NsaWVudC5XaWR0aCgpID4gMTUuMGYpIHsKKyAgICAgIHJjQ2xpZW50LnJpZ2h0IC09IDE1LjBmOworICAgICAgbV9wVGV4dC0+TW92ZShyY0NsaWVudCwgVFJVRSwgRkFMU0UpOworICAgICAgbV9wVGV4dC0+U2V0VmlzaWJsZShUUlVFKTsKKyAgICB9IGVsc2UgeworICAgICAgbV9wVGV4dC0+TW92ZShDUERGX1JlY3QoMCwgMCwgMCwgMCksIFRSVUUsIEZBTFNFKTsKKyAgICAgIG1fcFRleHQtPlNldFZpc2libGUoRkFMU0UpOworICAgIH0KKyAgfQogfQogCi12b2lkIENQV0xfTm90ZV9PcHRpb25zOjpDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCkKLXsKLQltX3BUZXh0ID0gbmV3IENQV0xfTGFiZWw7Ci0JUFdMX0NSRUFURVBBUkFNIHRjcCA9IGNwOwotCXRjcC5wUGFyZW50V25kID0gdGhpczsKLQl0Y3AuZHdGbGFncyA9IFBXU19DSElMRCB8IFBXU19WSVNJQkxFOwotCW1fcFRleHQtPkNyZWF0ZSh0Y3ApOwordm9pZCBDUFdMX05vdGVfT3B0aW9uczo6Q3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCkgeworICBtX3BUZXh0ID0gbmV3IENQV0xfTGFiZWw7CisgIFBXTF9DUkVBVEVQQVJBTSB0Y3AgPSBjcDsKKyAgdGNwLnBQYXJlbnRXbmQgPSB0aGlzOworICB0Y3AuZHdGbGFncyA9IFBXU19DSElMRCB8IFBXU19WSVNJQkxFOworICBtX3BUZXh0LT5DcmVhdGUodGNwKTsKIH0KIAotdm9pZCBDUFdMX05vdGVfT3B0aW9uczo6U2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RleHQpCi17Ci0JbV9wVGV4dC0+U2V0VGV4dChzVGV4dC5jX3N0cigpKTsKK3ZvaWQgQ1BXTF9Ob3RlX09wdGlvbnM6OlNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNUZXh0KSB7CisgIG1fcFRleHQtPlNldFRleHQoc1RleHQuY19zdHIoKSk7CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlX09wdGlvbnM6OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKQotewotCUNQV0xfV25kOjpEcmF3VGhpc0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlKTsKK3ZvaWQgQ1BXTF9Ob3RlX09wdGlvbnM6OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSkgeworICBDUFdMX1duZDo6RHJhd1RoaXNBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSk7CiAKLQlDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7Ci0JcmNDbGllbnQubGVmdCA9IHJjQ2xpZW50LnJpZ2h0IC0gMTUuMGY7CisgIENQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKKyAgcmNDbGllbnQubGVmdCA9IHJjQ2xpZW50LnJpZ2h0IC0gMTUuMGY7CiAKLQlDUERGX1BvaW50IHB0Q2VudGVyID0gQ1BERl9Qb2ludCgocmNDbGllbnQubGVmdCArIHJjQ2xpZW50LnJpZ2h0KSAqIDAuNWYsIChyY0NsaWVudC50b3AgKyByY0NsaWVudC5ib3R0b20pICogMC41Zik7CisgIENQREZfUG9pbnQgcHRDZW50ZXIgPSBDUERGX1BvaW50KChyY0NsaWVudC5sZWZ0ICsgcmNDbGllbnQucmlnaHQpICogMC41ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJjQ2xpZW50LnRvcCArIHJjQ2xpZW50LmJvdHRvbSkgKiAwLjVmKTsKIAotCUNQREZfUG9pbnQgcHQxKHB0Q2VudGVyLnggLSAyLjBmLCBwdENlbnRlci55ICsgMi4wZiAqIDAuNWYpOwotCUNQREZfUG9pbnQgcHQyKHB0Q2VudGVyLnggKyAyLjBmLCBwdENlbnRlci55ICsgMi4wZiAqIDAuNWYpOwotCUNQREZfUG9pbnQgcHQzKHB0Q2VudGVyLngsIHB0Q2VudGVyLnkgLSAzLjBmICogMC41Zik7CisgIENQREZfUG9pbnQgcHQxKHB0Q2VudGVyLnggLSAyLjBmLCBwdENlbnRlci55ICsgMi4wZiAqIDAuNWYpOworICBDUERGX1BvaW50IHB0MihwdENlbnRlci54ICsgMi4wZiwgcHRDZW50ZXIueSArIDIuMGYgKiAwLjVmKTsKKyAgQ1BERl9Qb2ludCBwdDMocHRDZW50ZXIueCwgcHRDZW50ZXIueSAtIDMuMGYgKiAwLjVmKTsKIAotCUNGWF9QYXRoRGF0YSBwYXRoOworICBDRlhfUGF0aERhdGEgcGF0aDsKIAotCXBhdGguU2V0UG9pbnRDb3VudCg0KTsKLQlwYXRoLlNldFBvaW50KDAsIHB0MS54LCBwdDEueSwgRlhQVF9NT1ZFVE8pOwotCXBhdGguU2V0UG9pbnQoMSwgcHQyLngsIHB0Mi55LCBGWFBUX0xJTkVUTyk7Ci0JcGF0aC5TZXRQb2ludCgyLCBwdDMueCwgcHQzLnksIEZYUFRfTElORVRPKTsKLQlwYXRoLlNldFBvaW50KDMsIHB0MS54LCBwdDEueSwgRlhQVF9MSU5FVE8pOworICBwYXRoLlNldFBvaW50Q291bnQoNCk7CisgIHBhdGguU2V0UG9pbnQoMCwgcHQxLngsIHB0MS55LCBGWFBUX01PVkVUTyk7CisgIHBhdGguU2V0UG9pbnQoMSwgcHQyLngsIHB0Mi55LCBGWFBUX0xJTkVUTyk7CisgIHBhdGguU2V0UG9pbnQoMiwgcHQzLngsIHB0My55LCBGWFBUX0xJTkVUTyk7CisgIHBhdGguU2V0UG9pbnQoMywgcHQxLngsIHB0MS55LCBGWFBUX0xJTkVUTyk7CiAKLQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCBOVUxMLCAKLQkJQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dENvbG9yKCksR2V0VHJhbnNwYXJlbmN5KCkpLCAKLQkJMCwgRlhGSUxMX0FMVEVSTkFURSk7CisgIHBEZXZpY2UtPkRyYXdQYXRoKAorICAgICAgJnBhdGgsIHBVc2VyMkRldmljZSwgTlVMTCwKKyAgICAgIENQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKEdldFRleHRDb2xvcigpLCBHZXRUcmFuc3BhcmVuY3koKSksIDAsCisgICAgICBGWEZJTExfQUxURVJOQVRFKTsKIH0KIAotQ1BERl9SZWN0IENQV0xfTm90ZV9PcHRpb25zOjpHZXRDb250ZW50UmVjdCgpIGNvbnN0Ci17Ci0JQVNTRVJUKG1fcFRleHQgIT0gTlVMTCk7Ci0KLQlDUERGX1JlY3QgcmNUZXh0ID0gbV9wVGV4dC0+R2V0Q29udGVudFJlY3QoKTsKLQlyY1RleHQucmlnaHQgKz0gMTUuMGY7Ci0JcmV0dXJuIHJjVGV4dDsKK0NQREZfUmVjdCBDUFdMX05vdGVfT3B0aW9uczo6R2V0Q29udGVudFJlY3QoKSBjb25zdCB7CisgIENQREZfUmVjdCByY1RleHQgPSBtX3BUZXh0LT5HZXRDb250ZW50UmVjdCgpOworICByY1RleHQucmlnaHQgKz0gMTUuMGY7CisgIHJldHVybiByY1RleHQ7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9Ob3RlX0VkaXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitDUFdMX05vdGVfRWRpdDo6Q1BXTF9Ob3RlX0VkaXQoKQorICAgIDogbV9iRW5hYmxlTm90aWZ5KFRSVUUpLAorICAgICAgbV9mT2xkSXRlbUhlaWdodCgwLjBmKSwKKyAgICAgIG1fYlNpemVDaGFuZ2VkKEZBTFNFKSwKKyAgICAgIG1fZk9sZE1pbigwLjBmKSwKKyAgICAgIG1fZk9sZE1heCgwLjBmKSB7fQogCi1DUFdMX05vdGVfRWRpdDo6Q1BXTF9Ob3RlX0VkaXQoKSA6IG1fYkVuYWJsZU5vdGlmeShUUlVFKSwKLQltX2ZPbGRJdGVtSGVpZ2h0KDAuMGYpLAotCW1fYlNpemVDaGFuZ2VkKEZBTFNFKSwKLQltX2ZPbGRNaW4oMC4wZiksCi0JbV9mT2xkTWF4KDAuMGYpCi17Ci19CitDUFdMX05vdGVfRWRpdDo6fkNQV0xfTm90ZV9FZGl0KCkge30KIAotQ1BXTF9Ob3RlX0VkaXQ6On5DUFdMX05vdGVfRWRpdCgpCi17Ci19Cit2b2lkIENQV0xfTm90ZV9FZGl0OjpSZVBvc0NoaWxkV25kKCkgeworICBtX2JFbmFibGVOb3RpZnkgPSBGQUxTRTsKKyAgQ1BXTF9FZGl0OjpSZVBvc0NoaWxkV25kKCk7CisgIG1fYkVuYWJsZU5vdGlmeSA9IFRSVUU7CiAKLXZvaWQgQ1BXTF9Ob3RlX0VkaXQ6OlJlUG9zQ2hpbGRXbmQoKQotewotCW1fYkVuYWJsZU5vdGlmeSA9IEZBTFNFOwkKLQlDUFdMX0VkaXQ6OlJlUG9zQ2hpbGRXbmQoKTsKLQltX2JFbmFibGVOb3RpZnkgPSBUUlVFOwotCi0JbV9mT2xkSXRlbUhlaWdodCA9IHRoaXMtPkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7CisgIG1fZk9sZEl0ZW1IZWlnaHQgPSBHZXRDb250ZW50UmVjdCgpLkhlaWdodCgpOwogfQogCi12b2lkIENQV0xfTm90ZV9FZGl0OjpTZXRUZXh0KEZYX0xQQ1dTVFIgY3NUZXh0KQotewotCW1fYkVuYWJsZU5vdGlmeSA9IEZBTFNFOwotCUNQV0xfRWRpdDo6U2V0VGV4dChjc1RleHQpOwotCW1fYkVuYWJsZU5vdGlmeSA9IFRSVUU7CQotCW1fZk9sZEl0ZW1IZWlnaHQgPSB0aGlzLT5HZXRDb250ZW50UmVjdCgpLkhlaWdodCgpOwordm9pZCBDUFdMX05vdGVfRWRpdDo6U2V0VGV4dChjb25zdCBGWF9XQ0hBUiogY3NUZXh0KSB7CisgIG1fYkVuYWJsZU5vdGlmeSA9IEZBTFNFOworICBDUFdMX0VkaXQ6OlNldFRleHQoY3NUZXh0KTsKKyAgbV9iRW5hYmxlTm90aWZ5ID0gVFJVRTsKKyAgbV9mT2xkSXRlbUhlaWdodCA9IEdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlX0VkaXQ6Ok9uU2V0Rm9jdXMoKQotewotCW1fYkVuYWJsZU5vdGlmeSA9IEZBTFNFOwkKLQlDUFdMX0VkaXQ6Ok9uU2V0Rm9jdXMoKTsKLQltX2JFbmFibGVOb3RpZnkgPSBUUlVFOwkKK3ZvaWQgQ1BXTF9Ob3RlX0VkaXQ6Ok9uU2V0Rm9jdXMoKSB7CisgIG1fYkVuYWJsZU5vdGlmeSA9IEZBTFNFOworICBDUFdMX0VkaXQ6Ok9uU2V0Rm9jdXMoKTsKKyAgbV9iRW5hYmxlTm90aWZ5ID0gVFJVRTsKIAotCXRoaXMtPkVuYWJsZVNwZWxsQ2hlY2soVFJVRSk7CisgIEVuYWJsZVNwZWxsQ2hlY2soVFJVRSk7CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlX0VkaXQ6Ok9uS2lsbEZvY3VzKCkKLXsKLQl0aGlzLT5FbmFibGVTcGVsbENoZWNrKEZBTFNFKTsKK3ZvaWQgQ1BXTF9Ob3RlX0VkaXQ6Ok9uS2lsbEZvY3VzKCkgeworICBFbmFibGVTcGVsbENoZWNrKEZBTFNFKTsKIAotCWlmIChDUFdMX1duZCogcFBhcmVudCA9IHRoaXMtPkdldFBhcmVudFdpbmRvdygpKQotCXsKLQkJaWYgKENQV0xfV25kKiBwR3JhbmQgPSBwUGFyZW50LT5HZXRQYXJlbnRXaW5kb3coKSkKLQkJewotCQkJQVNTRVJUKHBHcmFuZC0+R2V0Q2xhc3NOYW1lKCkgPT0gIkNQV0xfTm90ZUl0ZW0iKTsKKyAgaWYgKENQV0xfV25kKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpIHsKKyAgICBpZiAoQ1BXTF9XbmQqIHBHcmFuZCA9IHBQYXJlbnQtPkdldFBhcmVudFdpbmRvdygpKSB7CisgICAgICBBU1NFUlQocEdyYW5kLT5HZXRDbGFzc05hbWUoKSA9PSAiQ1BXTF9Ob3RlSXRlbSIpOwogCi0JCQlDUFdMX05vdGVJdGVtKiBwTm90ZUl0ZW0gPSAoQ1BXTF9Ob3RlSXRlbSopcEdyYW5kOworICAgICAgQ1BXTF9Ob3RlSXRlbSogcE5vdGVJdGVtID0gKENQV0xfTm90ZUl0ZW0qKXBHcmFuZDsKIAotCQkJcE5vdGVJdGVtLT5PbkNvbnRlbnRzVmFsaWRhdGUoKTsKLQkJfQotCX0KKyAgICAgIHBOb3RlSXRlbS0+T25Db250ZW50c1ZhbGlkYXRlKCk7CisgICAgfQorICB9CiAKLQlDUFdMX0VkaXQ6Ok9uS2lsbEZvY3VzKCk7CisgIENQV0xfRWRpdDo6T25LaWxsRm9jdXMoKTsKIH0KIAotdm9pZCBDUFdMX05vdGVfRWRpdDo6T25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgRlhfSU5UUFRSIHdQYXJhbSwgRlhfSU5UUFRSIGxQYXJhbSkKLXsKLQlpZiAobV9iRW5hYmxlTm90aWZ5KQotCXsKLQkJaWYgKHdQYXJhbSA9PSBTQlRfVlNDUk9MTCkKLQkJewotCQkJc3dpdGNoIChtc2cpCi0JCQl7Ci0JCQljYXNlIFBOTV9TRVRTQ1JPTExJTkZPOgkKLQkJCQlpZiAoUFdMX1NDUk9MTF9JTkZPKiBwSW5mbyA9IChQV0xfU0NST0xMX0lORk8qKWxQYXJhbSkKLQkJCQl7CQotCQkJCQlpZiAoIUlzRmxvYXRFcXVhbChwSW5mby0+ZkNvbnRlbnRNYXgsIG1fZk9sZE1heCkgfHwgCi0JCQkJCQkhSXNGbG9hdEVxdWFsKHBJbmZvLT5mQ29udGVudE1pbiwgbV9mT2xkTWluKSkKLQkJCQkJewotCQkJCQkJbV9iU2l6ZUNoYW5nZWQgPSBUUlVFOwkJCQkKLQkJCQkJCWlmIChDUFdMX1duZCAqIHBQYXJlbnQgPSB0aGlzLT5HZXRQYXJlbnRXaW5kb3coKSkKLQkJCQkJCXsKLQkJCQkJCQlwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLCBQTk1fTk9URUVESVRDSEFOR0VELCAwLCAwKTsKLQkJCQkJCX0KK3ZvaWQgQ1BXTF9Ob3RlX0VkaXQ6Ok9uTm90aWZ5KENQV0xfV25kKiBwV25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3Qgd1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbFBhcmFtKSB7CisgIGlmIChtX2JFbmFibGVOb3RpZnkpIHsKKyAgICBpZiAod1BhcmFtID09IFNCVF9WU0NST0xMKSB7CisgICAgICBzd2l0Y2ggKG1zZykgeworICAgICAgICBjYXNlIFBOTV9TRVRTQ1JPTExJTkZPOgorICAgICAgICAgIGlmIChQV0xfU0NST0xMX0lORk8qIHBJbmZvID0gKFBXTF9TQ1JPTExfSU5GTyopbFBhcmFtKSB7CisgICAgICAgICAgICBpZiAoIUlzRmxvYXRFcXVhbChwSW5mby0+ZkNvbnRlbnRNYXgsIG1fZk9sZE1heCkgfHwKKyAgICAgICAgICAgICAgICAhSXNGbG9hdEVxdWFsKHBJbmZvLT5mQ29udGVudE1pbiwgbV9mT2xkTWluKSkgeworICAgICAgICAgICAgICBtX2JTaXplQ2hhbmdlZCA9IFRSVUU7CisgICAgICAgICAgICAgIGlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKSB7CisgICAgICAgICAgICAgICAgcFBhcmVudC0+T25Ob3RpZnkodGhpcywgUE5NX05PVEVFRElUQ0hBTkdFRCwgMCwgMCk7CisgICAgICAgICAgICAgIH0KIAotCQkJCQkJbV9mT2xkTWF4ID0gcEluZm8tPmZDb250ZW50TWF4OwotCQkJCQkJbV9mT2xkTWluID0gcEluZm8tPmZDb250ZW50TWluOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9CQkKLQl9CisgICAgICAgICAgICAgIG1fZk9sZE1heCA9IHBJbmZvLT5mQ29udGVudE1heDsKKyAgICAgICAgICAgICAgbV9mT2xkTWluID0gcEluZm8tPmZDb250ZW50TWluOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQogCi0JQ1BXTF9FZGl0OjpPbk5vdGlmeShwV25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKKyAgQ1BXTF9FZGl0OjpPbk5vdGlmeShwV25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKIAotCWlmIChtX2JFbmFibGVOb3RpZnkpCi0JewotCQlzd2l0Y2ggKG1zZykKLQkJewotCQljYXNlIFBOTV9TRVRDQVJFVElORk86Ci0JCQlpZiAoUFdMX0NBUkVUX0lORk8gKiBwSW5mbyA9IChQV0xfQ0FSRVRfSU5GTyopd1BhcmFtKQotCQkJewotCQkJCVBXTF9DQVJFVF9JTkZPIG5ld0luZm8gPSAqcEluZm87Ci0JCQkJbmV3SW5mby5iVmlzaWJsZSA9IFRSVUU7Ci0JCQkJbmV3SW5mby5wdEhlYWQgPSB0aGlzLT5DaGlsZFRvUGFyZW50KHBJbmZvLT5wdEhlYWQpOwotCQkJCW5ld0luZm8ucHRGb290ID0gdGhpcy0+Q2hpbGRUb1BhcmVudChwSW5mby0+cHRGb290KTsKKyAgaWYgKG1fYkVuYWJsZU5vdGlmeSkgeworICAgIHN3aXRjaCAobXNnKSB7CisgICAgICBjYXNlIFBOTV9TRVRDQVJFVElORk86CisgICAgICAgIGlmIChQV0xfQ0FSRVRfSU5GTyogcEluZm8gPSAoUFdMX0NBUkVUX0lORk8qKXdQYXJhbSkgeworICAgICAgICAgIFBXTF9DQVJFVF9JTkZPIG5ld0luZm8gPSAqcEluZm87CisgICAgICAgICAgbmV3SW5mby5iVmlzaWJsZSA9IFRSVUU7CisgICAgICAgICAgbmV3SW5mby5wdEhlYWQgPSBDaGlsZFRvUGFyZW50KHBJbmZvLT5wdEhlYWQpOworICAgICAgICAgIG5ld0luZm8ucHRGb290ID0gQ2hpbGRUb1BhcmVudChwSW5mby0+cHRGb290KTsKIAotCQkJCWlmIChDUFdMX1duZCAqIHBQYXJlbnQgPSB0aGlzLT5HZXRQYXJlbnRXaW5kb3coKSkKLQkJCQl7Ci0JCQkJCXBQYXJlbnQtPk9uTm90aWZ5KHRoaXMsIFBOTV9TRVRDQVJFVElORk8sIChGWF9JTlRQVFIpJm5ld0luZm8sIDApOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JfQorICAgICAgICAgIGlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKSB7CisgICAgICAgICAgICBwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0VUQ0FSRVRJTkZPLCAoaW50cHRyX3QpJm5ld0luZm8sIDApOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KIH0KIAotRlhfRkxPQVQgQ1BXTF9Ob3RlX0VkaXQ6OkdldEl0ZW1IZWlnaHQoRlhfRkxPQVQgZkxpbWl0V2lkdGgpCi17Ci0JaWYgKGZMaW1pdFdpZHRoID4gMCkKLQl7Ci0JCWlmICghbV9iU2l6ZUNoYW5nZWQpCi0JCQlyZXR1cm4gbV9mT2xkSXRlbUhlaWdodDsKK0ZYX0ZMT0FUIENQV0xfTm90ZV9FZGl0OjpHZXRJdGVtSGVpZ2h0KEZYX0ZMT0FUIGZMaW1pdFdpZHRoKSB7CisgIGlmIChmTGltaXRXaWR0aCA+IDApIHsKKyAgICBpZiAoIW1fYlNpemVDaGFuZ2VkKQorICAgICAgcmV0dXJuIG1fZk9sZEl0ZW1IZWlnaHQ7CiAKLQkJbV9iU2l6ZUNoYW5nZWQgPSBGQUxTRTsJCisgICAgbV9iU2l6ZUNoYW5nZWQgPSBGQUxTRTsKIAotCQl0aGlzLT5FbmFibGVOb3RpZnkoRkFMU0UpOwotCQl0aGlzLT5FbmFibGVSZWZyZXNoKEZBTFNFKTsKLQkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KEZBTFNFKTsKKyAgICBFbmFibGVOb3RpZnkoRkFMU0UpOworICAgIEVuYWJsZVJlZnJlc2goRkFMU0UpOworICAgIG1fcEVkaXQtPkVuYWJsZU5vdGlmeShGQUxTRSk7CiAKLQkJLy9DUERGX1JlY3QgcmNPbGQgPSB0aGlzLT5HZXRXaW5kb3dSZWN0KCk7Ci0KLQkJdGhpcy0+TW92ZShDUERGX1JlY3QoMCwwLGZMaW1pdFdpZHRoLDApLCBUUlVFLCBGQUxTRSk7Ci0JCUZYX0ZMT0FUIGZSZXQgPSB0aGlzLT5HZXRDb250ZW50UmVjdCgpLkhlaWdodCgpOwotCi0JCS8vdGhpcy0+TW92ZShyY09sZCwgVFJVRSwgRkFMU0UpOworICAgIE1vdmUoQ1BERl9SZWN0KDAsIDAsIGZMaW1pdFdpZHRoLCAwKSwgVFJVRSwgRkFMU0UpOworICAgIEZYX0ZMT0FUIGZSZXQgPSBHZXRDb250ZW50UmVjdCgpLkhlaWdodCgpOwogCi0JCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShUUlVFKTsKLQkJdGhpcy0+RW5hYmxlTm90aWZ5KFRSVUUpOwotCQl0aGlzLT5FbmFibGVSZWZyZXNoKFRSVUUpOworICAgIG1fcEVkaXQtPkVuYWJsZU5vdGlmeShUUlVFKTsKKyAgICBFbmFibGVOb3RpZnkoVFJVRSk7CisgICAgRW5hYmxlUmVmcmVzaChUUlVFKTsKIAotCQlyZXR1cm4gZlJldDsKLQl9CisgICAgcmV0dXJuIGZSZXQ7CisgIH0KIAotCXJldHVybiAwOworICByZXR1cm4gMDsKIH0KIAotRlhfRkxPQVQgQ1BXTF9Ob3RlX0VkaXQ6OkdldEl0ZW1MZWZ0TWFyZ2luKCkKLXsKLQlyZXR1cm4gUE9QVVBfSVRFTV9URVhUX0lOREVOVDsKK0ZYX0ZMT0FUIENQV0xfTm90ZV9FZGl0OjpHZXRJdGVtTGVmdE1hcmdpbigpIHsKKyAgcmV0dXJuIFBPUFVQX0lURU1fVEVYVF9JTkRFTlQ7CiB9CiAKLUZYX0ZMT0FUIENQV0xfTm90ZV9FZGl0OjpHZXRJdGVtUmlnaHRNYXJnaW4oKQotewotCXJldHVybiBQT1BVUF9JVEVNX1RFWFRfSU5ERU5UOworRlhfRkxPQVQgQ1BXTF9Ob3RlX0VkaXQ6OkdldEl0ZW1SaWdodE1hcmdpbigpIHsKKyAgcmV0dXJuIFBPUFVQX0lURU1fVEVYVF9JTkRFTlQ7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfTm90ZV9MQkJveCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDUFdMX05vdGVfTEJCb3g6OkNQV0xfTm90ZV9MQkJveCgpIHt9CiAKLUNQV0xfTm90ZV9MQkJveDo6Q1BXTF9Ob3RlX0xCQm94KCkKLXsKLX0KK0NQV0xfTm90ZV9MQkJveDo6fkNQV0xfTm90ZV9MQkJveCgpIHt9CiAKLUNQV0xfTm90ZV9MQkJveDo6fkNQV0xfTm90ZV9MQkJveCgpCi17Ci19Cit2b2lkIENQV0xfTm90ZV9MQkJveDo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSkgeworICBDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CiAKLXZvaWQgQ1BXTF9Ob3RlX0xCQm94OjpEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSkKLXsKLQlDUERGX1JlY3QgcmNDbGllbnQgPSB0aGlzLT5HZXRDbGllbnRSZWN0KCk7CisgIENGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7CisgIGdzZC5tX0xpbmVXaWR0aCA9IDEuMGY7CiAKLQlDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOwotCWdzZC5tX0xpbmVXaWR0aCA9IDEuMGY7CisgIENGWF9QYXRoRGF0YSBwYXRoQ3Jvc3M7CiAKLQlDRlhfUGF0aERhdGEgcGF0aENyb3NzOworICBwYXRoQ3Jvc3MuU2V0UG9pbnRDb3VudCg0KTsKKyAgcGF0aENyb3NzLlNldFBvaW50KDAsIHJjQ2xpZW50LmxlZnQsIHJjQ2xpZW50LnRvcCwgRlhQVF9NT1ZFVE8pOworICBwYXRoQ3Jvc3MuU2V0UG9pbnQoMSwgcmNDbGllbnQucmlnaHQsIHJjQ2xpZW50LmJvdHRvbSwgRlhQVF9MSU5FVE8pOworICBwYXRoQ3Jvc3MuU2V0UG9pbnQoMiwgcmNDbGllbnQubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LmJvdHRvbSArIHJjQ2xpZW50LkhlaWdodCgpICogMC41ZiwgRlhQVF9NT1ZFVE8pOworICBwYXRoQ3Jvc3MuU2V0UG9pbnQoMywgcmNDbGllbnQubGVmdCArIHJjQ2xpZW50LldpZHRoKCkgKiAwLjVmLAorICAgICAgICAgICAgICAgICAgICAgcmNDbGllbnQuYm90dG9tLCBGWFBUX0xJTkVUTyk7CiAKLQlwYXRoQ3Jvc3MuU2V0UG9pbnRDb3VudCg0KTsKLQlwYXRoQ3Jvc3MuU2V0UG9pbnQoMCwgcmNDbGllbnQubGVmdCwgcmNDbGllbnQudG9wLCBGWFBUX01PVkVUTyk7Ci0JcGF0aENyb3NzLlNldFBvaW50KDEsIHJjQ2xpZW50LnJpZ2h0LCByY0NsaWVudC5ib3R0b20sIEZYUFRfTElORVRPKTsKLQlwYXRoQ3Jvc3MuU2V0UG9pbnQoMiwgcmNDbGllbnQubGVmdCwgcmNDbGllbnQuYm90dG9tICsgcmNDbGllbnQuSGVpZ2h0KCkgKiAwLjVmLCBGWFBUX01PVkVUTyk7Ci0JcGF0aENyb3NzLlNldFBvaW50KDMsIHJjQ2xpZW50LmxlZnQgKyByY0NsaWVudC5XaWR0aCgpICogMC41ZiwgcmNDbGllbnQuYm90dG9tLCBGWFBUX0xJTkVUTyk7Ci0JCi0JcERldmljZS0+RHJhd1BhdGgoJnBhdGhDcm9zcywgcFVzZXIyRGV2aWNlLCAmZ3NkLCAKLQkJMCwgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dENvbG9yKCksdGhpcy0+R2V0VHJhbnNwYXJlbmN5KCkpLCBGWEZJTExfQUxURVJOQVRFKTsKKyAgcERldmljZS0+RHJhd1BhdGgoCisgICAgICAmcGF0aENyb3NzLCBwVXNlcjJEZXZpY2UsICZnc2QsIDAsCisgICAgICBDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0Q29sb3IoKSwgR2V0VHJhbnNwYXJlbmN5KCkpLAorICAgICAgRlhGSUxMX0FMVEVSTkFURSk7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfTm90ZV9SQkJveCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDUFdMX05vdGVfUkJCb3g6OkNQV0xfTm90ZV9SQkJveCgpIHt9CiAKLUNQV0xfTm90ZV9SQkJveDo6Q1BXTF9Ob3RlX1JCQm94KCkKLXsKLX0KK0NQV0xfTm90ZV9SQkJveDo6fkNQV0xfTm90ZV9SQkJveCgpIHt9CiAKLUNQV0xfTm90ZV9SQkJveDo6fkNQV0xfTm90ZV9SQkJveCgpCi17Ci19Cit2b2lkIENQV0xfTm90ZV9SQkJveDo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSkgeworICBDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CiAKLXZvaWQgQ1BXTF9Ob3RlX1JCQm94OjpEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSkKLXsKLQlDUERGX1JlY3QgcmNDbGllbnQgPSB0aGlzLT5HZXRDbGllbnRSZWN0KCk7CisgIENGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7CisgIGdzZC5tX0xpbmVXaWR0aCA9IDEuMGY7CiAKLQlDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOwotCWdzZC5tX0xpbmVXaWR0aCA9IDEuMGY7CisgIENGWF9QYXRoRGF0YSBwYXRoQ3Jvc3M7CiAKLQlDRlhfUGF0aERhdGEgcGF0aENyb3NzOworICBwYXRoQ3Jvc3MuU2V0UG9pbnRDb3VudCg0KTsKKyAgcGF0aENyb3NzLlNldFBvaW50KDAsIHJjQ2xpZW50LnJpZ2h0LCByY0NsaWVudC50b3AsIEZYUFRfTU9WRVRPKTsKKyAgcGF0aENyb3NzLlNldFBvaW50KDEsIHJjQ2xpZW50LmxlZnQsIHJjQ2xpZW50LmJvdHRvbSwgRlhQVF9MSU5FVE8pOworICBwYXRoQ3Jvc3MuU2V0UG9pbnQoMiwgcmNDbGllbnQucmlnaHQsCisgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5ib3R0b20gKyByY0NsaWVudC5IZWlnaHQoKSAqIDAuNWYsIEZYUFRfTU9WRVRPKTsKKyAgcGF0aENyb3NzLlNldFBvaW50KDMsIHJjQ2xpZW50LmxlZnQgKyByY0NsaWVudC5XaWR0aCgpICogMC41ZiwKKyAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LmJvdHRvbSwgRlhQVF9MSU5FVE8pOwogCi0JcGF0aENyb3NzLlNldFBvaW50Q291bnQoNCk7Ci0JcGF0aENyb3NzLlNldFBvaW50KDAsIHJjQ2xpZW50LnJpZ2h0LCByY0NsaWVudC50b3AsIEZYUFRfTU9WRVRPKTsKLQlwYXRoQ3Jvc3MuU2V0UG9pbnQoMSwgcmNDbGllbnQubGVmdCwgcmNDbGllbnQuYm90dG9tLCBGWFBUX0xJTkVUTyk7Ci0JcGF0aENyb3NzLlNldFBvaW50KDIsIHJjQ2xpZW50LnJpZ2h0LCByY0NsaWVudC5ib3R0b20gKyByY0NsaWVudC5IZWlnaHQoKSAqIDAuNWYsIEZYUFRfTU9WRVRPKTsKLQlwYXRoQ3Jvc3MuU2V0UG9pbnQoMywgcmNDbGllbnQubGVmdCArIHJjQ2xpZW50LldpZHRoKCkgKiAwLjVmLCByY0NsaWVudC5ib3R0b20sIEZYUFRfTElORVRPKTsKLQkKLQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aENyb3NzLCBwVXNlcjJEZXZpY2UsICZnc2QsIAotCQkwLCBDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0Q29sb3IoKSx0aGlzLT5HZXRUcmFuc3BhcmVuY3koKSksIEZYRklMTF9BTFRFUk5BVEUpOworICBwRGV2aWNlLT5EcmF3UGF0aCgKKyAgICAgICZwYXRoQ3Jvc3MsIHBVc2VyMkRldmljZSwgJmdzZCwgMCwKKyAgICAgIENQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKEdldFRleHRDb2xvcigpLCBHZXRUcmFuc3BhcmVuY3koKSksCisgICAgICBGWEZJTExfQUxURVJOQVRFKTsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfTm90ZV9JY29uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK0NQV0xfTm90ZV9JY29uOjpDUFdMX05vdGVfSWNvbigpIDogbV9uVHlwZSgwKSB7fQogCi1DUFdMX05vdGVfSWNvbjo6Q1BXTF9Ob3RlX0ljb24oKSA6IG1fblR5cGUoMCkKLXsKLX0KK0NQV0xfTm90ZV9JY29uOjp+Q1BXTF9Ob3RlX0ljb24oKSB7fQogCi1DUFdMX05vdGVfSWNvbjo6fkNQV0xfTm90ZV9JY29uKCkKLXsKLX0KLQotdm9pZCBDUFdMX05vdGVfSWNvbjo6U2V0SWNvblR5cGUoRlhfSU5UMzIgblR5cGUpCi17Ci0JbV9uVHlwZSA9IG5UeXBlOwordm9pZCBDUFdMX05vdGVfSWNvbjo6U2V0SWNvblR5cGUoaW50MzJfdCBuVHlwZSkgeworICBtX25UeXBlID0gblR5cGU7CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlX0ljb246OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKQotewotCUNQV0xfVXRpbHM6OkRyYXdJY29uQXBwU3RyZWFtKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgbV9uVHlwZSwgR2V0Q2xpZW50UmVjdCgpLCAKLQkJdGhpcy0+R2V0QmFja2dyb3VuZENvbG9yKCksIFBXTF9ERUZBVUxUX0JMQUNLQ09MT1IsIHRoaXMtPkdldFRyYW5zcGFyZW5jeSgpKTsKK3ZvaWQgQ1BXTF9Ob3RlX0ljb246OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSkgeworICBDUFdMX1V0aWxzOjpEcmF3SWNvbkFwcFN0cmVhbShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIG1fblR5cGUsIEdldENsaWVudFJlY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0QmFja2dyb3VuZENvbG9yKCksIFBXTF9ERUZBVUxUX0JMQUNLQ09MT1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFRyYW5zcGFyZW5jeSgpKTsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfTm90ZV9DbG9zZUJveCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitDUFdMX05vdGVfQ2xvc2VCb3g6OkNQV0xfTm90ZV9DbG9zZUJveCgpIDogbV9iTW91c2VEb3duKEZBTFNFKSB7fQogCi1DUFdMX05vdGVfQ2xvc2VCb3g6OkNQV0xfTm90ZV9DbG9zZUJveCgpIDogbV9iTW91c2VEb3duKEZBTFNFKQotewotfQorQ1BXTF9Ob3RlX0Nsb3NlQm94Ojp+Q1BXTF9Ob3RlX0Nsb3NlQm94KCkge30KIAotQ1BXTF9Ob3RlX0Nsb3NlQm94Ojp+Q1BXTF9Ob3RlX0Nsb3NlQm94KCkKLXsKLX0KK3ZvaWQgQ1BXTF9Ob3RlX0Nsb3NlQm94OjpEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlKSB7CisgIENQV0xfQnV0dG9uOjpEcmF3VGhpc0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlKTsKIAotdm9pZCBDUFdMX05vdGVfQ2xvc2VCb3g6OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKQotewotCUNQV0xfQnV0dG9uOjpEcmF3VGhpc0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlKTsKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworICByY0NsaWVudCA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJjQ2xpZW50LCAyLjBmKTsKIAotCUNQREZfUmVjdCByY0NsaWVudCA9IHRoaXMtPkdldENsaWVudFJlY3QoKTsKLQlyY0NsaWVudCA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJjQ2xpZW50LCAyLjBmKTsKKyAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKKyAgZ3NkLm1fTGluZVdpZHRoID0gMS4wZjsKIAotCUNGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7Ci0JZ3NkLm1fTGluZVdpZHRoID0gMS4wZjsKKyAgQ0ZYX1BhdGhEYXRhIHBhdGhDcm9zczsKIAotCUNGWF9QYXRoRGF0YSBwYXRoQ3Jvc3M7CisgIGlmIChtX2JNb3VzZURvd24pIHsKKyAgICByY0NsaWVudC5sZWZ0ICs9IDAuNWY7CisgICAgcmNDbGllbnQucmlnaHQgKz0gMC41ZjsKKyAgICByY0NsaWVudC50b3AgLT0gMC41ZjsKKyAgICByY0NsaWVudC5ib3R0b20gLT0gMC41ZjsKKyAgfQogCi0JaWYgKG1fYk1vdXNlRG93bikKLQl7Ci0JCXJjQ2xpZW50LmxlZnQgKz0gMC41ZjsKLQkJcmNDbGllbnQucmlnaHQgKz0gMC41ZjsKLQkJcmNDbGllbnQudG9wIC09IDAuNWY7Ci0JCXJjQ2xpZW50LmJvdHRvbSAtPSAwLjVmOwotCX0KKyAgcGF0aENyb3NzLlNldFBvaW50Q291bnQoNCk7CisgIHBhdGhDcm9zcy5TZXRQb2ludCgwLCByY0NsaWVudC5sZWZ0LCByY0NsaWVudC5ib3R0b20sIEZYUFRfTU9WRVRPKTsKKyAgcGF0aENyb3NzLlNldFBvaW50KDEsIHJjQ2xpZW50LnJpZ2h0LCByY0NsaWVudC50b3AsIEZYUFRfTElORVRPKTsKKyAgcGF0aENyb3NzLlNldFBvaW50KDIsIHJjQ2xpZW50LmxlZnQsIHJjQ2xpZW50LnRvcCwgRlhQVF9NT1ZFVE8pOworICBwYXRoQ3Jvc3MuU2V0UG9pbnQoMywgcmNDbGllbnQucmlnaHQsIHJjQ2xpZW50LmJvdHRvbSwgRlhQVF9MSU5FVE8pOwogCi0JcGF0aENyb3NzLlNldFBvaW50Q291bnQoNCk7Ci0JcGF0aENyb3NzLlNldFBvaW50KDAsIHJjQ2xpZW50LmxlZnQsIHJjQ2xpZW50LmJvdHRvbSwgRlhQVF9NT1ZFVE8pOwotCXBhdGhDcm9zcy5TZXRQb2ludCgxLCByY0NsaWVudC5yaWdodCwgcmNDbGllbnQudG9wLCBGWFBUX0xJTkVUTyk7Ci0JcGF0aENyb3NzLlNldFBvaW50KDIsIHJjQ2xpZW50LmxlZnQsIHJjQ2xpZW50LnRvcCwgRlhQVF9NT1ZFVE8pOwotCXBhdGhDcm9zcy5TZXRQb2ludCgzLCByY0NsaWVudC5yaWdodCwgcmNDbGllbnQuYm90dG9tLCBGWFBUX0xJTkVUTyk7Ci0JCi0JcERldmljZS0+RHJhd1BhdGgoJnBhdGhDcm9zcywgcFVzZXIyRGV2aWNlLCAmZ3NkLCAKLQkJMCwgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dENvbG9yKCksdGhpcy0+R2V0VHJhbnNwYXJlbmN5KCkpLCBGWEZJTExfQUxURVJOQVRFKTsKKyAgcERldmljZS0+RHJhd1BhdGgoCisgICAgICAmcGF0aENyb3NzLCBwVXNlcjJEZXZpY2UsICZnc2QsIDAsCisgICAgICBDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0Q29sb3IoKSwgR2V0VHJhbnNwYXJlbmN5KCkpLAorICAgICAgRlhGSUxMX0FMVEVSTkFURSk7CiB9CiAKLUZYX0JPT0wgQ1BXTF9Ob3RlX0Nsb3NlQm94OjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JU2V0Qm9yZGVyU3R5bGUoUEJTX0lOU0VUKTsKLQlJbnZhbGlkYXRlUmVjdChOVUxMKTsKK0ZYX0JPT0wgQ1BXTF9Ob3RlX0Nsb3NlQm94OjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbkZsYWcpIHsKKyAgU2V0Qm9yZGVyU3R5bGUoUEJTX0lOU0VUKTsKKyAgSW52YWxpZGF0ZVJlY3QoTlVMTCk7CiAKLQltX2JNb3VzZURvd24gPSBUUlVFOworICBtX2JNb3VzZURvd24gPSBUUlVFOwogCi0JcmV0dXJuIENQV0xfQnV0dG9uOjpPbkxCdXR0b25Eb3duKHBvaW50LG5GbGFnKTsKKyAgcmV0dXJuIENQV0xfQnV0dG9uOjpPbkxCdXR0b25Eb3duKHBvaW50LCBuRmxhZyk7CiB9CiAKLUZYX0JPT0wJQ1BXTF9Ob3RlX0Nsb3NlQm94OjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQotewotCW1fYk1vdXNlRG93biA9IEZBTFNFOworRlhfQk9PTCBDUFdMX05vdGVfQ2xvc2VCb3g6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSB7CisgIG1fYk1vdXNlRG93biA9IEZBTFNFOwogCi0JU2V0Qm9yZGVyU3R5bGUoUEJTX0JFVkVMRUQpOwotCUludmFsaWRhdGVSZWN0KE5VTEwpOworICBTZXRCb3JkZXJTdHlsZShQQlNfQkVWRUxFRCk7CisgIEludmFsaWRhdGVSZWN0KE5VTEwpOwogCi0JcmV0dXJuIENQV0xfQnV0dG9uOjpPbkxCdXR0b25VcChwb2ludCxuRmxhZyk7CisgIHJldHVybiBDUFdMX0J1dHRvbjo6T25MQnV0dG9uVXAocG9pbnQsIG5GbGFnKTsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfTm90ZV9Db250ZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitDUFdMX05vdGVfQ29udGVudHM6OkNQV0xfTm90ZV9Db250ZW50cygpIDogbV9wRWRpdChOVUxMKSB7fQogCi1DUFdMX05vdGVfQ29udGVudHM6OkNQV0xfTm90ZV9Db250ZW50cygpIDogbV9wRWRpdChOVUxMKQotewotfQorQ1BXTF9Ob3RlX0NvbnRlbnRzOjp+Q1BXTF9Ob3RlX0NvbnRlbnRzKCkge30KIAotQ1BXTF9Ob3RlX0NvbnRlbnRzOjp+Q1BXTF9Ob3RlX0NvbnRlbnRzKCkKLXsKK0NGWF9CeXRlU3RyaW5nIENQV0xfTm90ZV9Db250ZW50czo6R2V0Q2xhc3NOYW1lKCkgY29uc3QgeworICByZXR1cm4gIkNQV0xfTm90ZV9Db250ZW50cyI7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfTm90ZV9Db250ZW50czo6R2V0Q2xhc3NOYW1lKCkgY29uc3QKLXsKLQlyZXR1cm4gIkNQV0xfTm90ZV9Db250ZW50cyI7Ci19Cit2b2lkIENQV0xfTm90ZV9Db250ZW50czo6Q3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCkgeworICBtX3BFZGl0ID0gbmV3IENQV0xfTm90ZV9FZGl0OworICBQV0xfQ1JFQVRFUEFSQU0gZWNwID0gY3A7CisgIGVjcC5wUGFyZW50V25kID0gdGhpczsKKyAgZWNwLmR3RmxhZ3MgPSBQV1NfVklTSUJMRSB8IFBXU19DSElMRCB8IFBFU19NVUxUSUxJTkUgfCBQRVNfQVVUT1JFVFVSTiB8CisgICAgICAgICAgICAgICAgUEVTX1RFWFRPVkVSRkxPVyB8IFBFU19VTkRPIHwgUEVTX1NQRUxMQ0hFQ0s7CiAKLXZvaWQgQ1BXTF9Ob3RlX0NvbnRlbnRzOjpDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCkKLXsKLQltX3BFZGl0ID0gbmV3IENQV0xfTm90ZV9FZGl0OwotCVBXTF9DUkVBVEVQQVJBTSBlY3AgPSBjcDsKLQllY3AucFBhcmVudFduZCA9IHRoaXM7Ci0JZWNwLmR3RmxhZ3MgPSBQV1NfVklTSUJMRSB8IFBXU19DSElMRCB8IFBFU19NVUxUSUxJTkUgfCBQRVNfQVVUT1JFVFVSTiB8IFBFU19URVhUT1ZFUkZMT1cgfCBQRVNfVU5ETyB8IFBFU19TUEVMTENIRUNLOwotCi0JbV9wRWRpdC0+RW5hYmxlTm90aWZ5KEZBTFNFKTsKLQltX3BFZGl0LT5DcmVhdGUoZWNwKTsKLQltX3BFZGl0LT5FbmFibGVOb3RpZnkoVFJVRSk7CisgIG1fcEVkaXQtPkVuYWJsZU5vdGlmeShGQUxTRSk7CisgIG1fcEVkaXQtPkNyZWF0ZShlY3ApOworICBtX3BFZGl0LT5FbmFibGVOb3RpZnkoVFJVRSk7CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlX0NvbnRlbnRzOjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGV4dCkKLXsKLQlpZiAobV9wRWRpdCkKLQl7Ci0JCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShGQUxTRSk7Ci0JCW1fcEVkaXQtPlNldFRleHQoc1RleHQuY19zdHIoKSk7Ci0JCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShUUlVFKTsKLQkJT25Ob3RpZnkobV9wRWRpdCwgUE5NX05PVEVFRElUQ0hBTkdFRCwgMCwgMCk7Ci0JfQordm9pZCBDUFdMX05vdGVfQ29udGVudHM6OlNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNUZXh0KSB7CisgIGlmIChtX3BFZGl0KSB7CisgICAgbV9wRWRpdC0+RW5hYmxlTm90aWZ5KEZBTFNFKTsKKyAgICBtX3BFZGl0LT5TZXRUZXh0KHNUZXh0LmNfc3RyKCkpOworICAgIG1fcEVkaXQtPkVuYWJsZU5vdGlmeShUUlVFKTsKKyAgICBPbk5vdGlmeShtX3BFZGl0LCBQTk1fTk9URUVESVRDSEFOR0VELCAwLCAwKTsKKyAgfQogfQogCi1DRlhfV2lkZVN0cmluZyBDUFdMX05vdGVfQ29udGVudHM6OkdldFRleHQoKSBjb25zdAotewotCWlmIChtX3BFZGl0KQotCQlyZXR1cm4gbV9wRWRpdC0+R2V0VGV4dCgpOworQ0ZYX1dpZGVTdHJpbmcgQ1BXTF9Ob3RlX0NvbnRlbnRzOjpHZXRUZXh0KCkgY29uc3QgeworICBpZiAobV9wRWRpdCkKKyAgICByZXR1cm4gbV9wRWRpdC0+R2V0VGV4dCgpOwogCi0JcmV0dXJuIEwiIjsKKyAgcmV0dXJuIEwiIjsKIH0KIAotQ1BXTF9Ob3RlSXRlbSogQ1BXTF9Ob3RlX0NvbnRlbnRzOjpDcmVhdGVTdWJJdGVtKCkKLXsKLQlDUFdMX05vdGVJdGVtKiBwTm90ZUl0ZW0gPSBuZXcgQ1BXTF9Ob3RlSXRlbTsKLQlQV0xfQ1JFQVRFUEFSQU0gaWNwID0gdGhpcy0+R2V0Q3JlYXRpb25QYXJhbSgpOwotCWljcC5wUGFyZW50V25kID0gdGhpczsKLQlpY3AuZHdGbGFncyA9ICBQV1NfQ0hJTEQgfCBQV1NfVklTSUJMRSB8IFBXU19CQUNLR1JPVU5EOwotCXBOb3RlSXRlbS0+Q3JlYXRlKGljcCk7CitDUFdMX05vdGVJdGVtKiBDUFdMX05vdGVfQ29udGVudHM6OkNyZWF0ZVN1Ykl0ZW0oKSB7CisgIENQV0xfTm90ZUl0ZW0qIHBOb3RlSXRlbSA9IG5ldyBDUFdMX05vdGVJdGVtOworICBQV0xfQ1JFQVRFUEFSQU0gaWNwID0gR2V0Q3JlYXRpb25QYXJhbSgpOworICBpY3AucFBhcmVudFduZCA9IHRoaXM7CisgIGljcC5kd0ZsYWdzID0gUFdTX0NISUxEIHwgUFdTX1ZJU0lCTEUgfCBQV1NfQkFDS0dST1VORDsKKyAgcE5vdGVJdGVtLT5DcmVhdGUoaWNwKTsKKworICBwTm90ZUl0ZW0tPk9uQ3JlYXRlTm90ZUl0ZW0oKTsKIAotCXBOb3RlSXRlbS0+T25DcmVhdGVOb3RlSXRlbSgpOwotCQotCXBOb3RlSXRlbS0+UmVzZXRTdWJqZWN0TmFtZShtX2FDaGlsZHJlbi5HZXRTaXplKCkgLSAxKTsKKyAgcE5vdGVJdGVtLT5SZXNldFN1YmplY3ROYW1lKG1fYUNoaWxkcmVuLkdldFNpemUoKSAtIDEpOwogCi0JRlhfU1lTVEVNVElNRSBzdDsKLQlpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTSCA9IHRoaXMtPkdldFN5c3RlbUhhbmRsZXIoKSkKLQkJc3QgPSBwU0gtPkdldExvY2FsVGltZSgpOwotCXBOb3RlSXRlbS0+U2V0RGF0ZVRpbWUoc3QpOworICBGWF9TWVNURU1USU1FIHN0OworICBpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTSCA9IEdldFN5c3RlbUhhbmRsZXIoKSkKKyAgICBzdCA9IHBTSC0+R2V0TG9jYWxUaW1lKCk7CisgIHBOb3RlSXRlbS0+U2V0RGF0ZVRpbWUoc3QpOwogCi0JcE5vdGVJdGVtLT5TZXRDb250ZW50cyhMIiIpOworICBwTm90ZUl0ZW0tPlNldENvbnRlbnRzKEwiIik7CiAKLQl0aGlzLT5Pbk5vdGlmeShwTm90ZUl0ZW0sIFBOTV9OT1RFRURJVENIQU5HRUQsIDAsIDApOwkKKyAgT25Ob3RpZnkocE5vdGVJdGVtLCBQTk1fTk9URUVESVRDSEFOR0VELCAwLCAwKTsKIAotCXJldHVybiBwTm90ZUl0ZW07CisgIHJldHVybiBwTm90ZUl0ZW07CiB9CiAKLUZYX0lOVDMyIENQV0xfTm90ZV9Db250ZW50czo6Q291bnRTdWJJdGVtcygpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fYUNoaWxkcmVuLkdldFNpemUoKSAtIDE7CitpbnQzMl90IENQV0xfTm90ZV9Db250ZW50czo6Q291bnRTdWJJdGVtcygpIGNvbnN0IHsKKyAgcmV0dXJuIG1fYUNoaWxkcmVuLkdldFNpemUoKSAtIDE7CiB9CiAKLUlQV0xfTm90ZUl0ZW0qIENQV0xfTm90ZV9Db250ZW50czo6R2V0U3ViSXRlbXMoRlhfSU5UMzIgaW5kZXgpIGNvbnN0Ci17Ci0JRlhfSU5UMzIgbkluZGV4ID0gaW5kZXggKyAxOworSVBXTF9Ob3RlSXRlbSogQ1BXTF9Ob3RlX0NvbnRlbnRzOjpHZXRTdWJJdGVtcyhpbnQzMl90IGluZGV4KSBjb25zdCB7CisgIGludDMyX3QgbkluZGV4ID0gaW5kZXggKyAxOwogCi0JaWYgKG5JbmRleCA+IDAgJiYgbkluZGV4IDwgbV9hQ2hpbGRyZW4uR2V0U2l6ZSgpKQotCQlpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KG5JbmRleCkpCi0JCXsKLQkJCUFTU0VSVChwQ2hpbGQtPkdldENsYXNzTmFtZSgpID09ICJDUFdMX05vdGVJdGVtIik7Ci0JCQlDUFdMX05vdGVJdGVtKiBwSXRlbSA9IChDUFdMX05vdGVJdGVtKilwQ2hpbGQ7Ci0JCQlyZXR1cm4gcEl0ZW07Ci0JCX0KLQlyZXR1cm4gTlVMTDsKKyAgaWYgKG5JbmRleCA+IDAgJiYgbkluZGV4IDwgbV9hQ2hpbGRyZW4uR2V0U2l6ZSgpKSB7CisgICAgaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChuSW5kZXgpKSB7CisgICAgICBBU1NFUlQocENoaWxkLT5HZXRDbGFzc05hbWUoKSA9PSAiQ1BXTF9Ob3RlSXRlbSIpOworICAgICAgQ1BXTF9Ob3RlSXRlbSogcEl0ZW0gPSAoQ1BXTF9Ob3RlSXRlbSopcENoaWxkOworICAgICAgcmV0dXJuIHBJdGVtOworICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBDUFdMX05vdGVfQ29udGVudHM6OkRlbGV0ZVN1Ykl0ZW0oSVBXTF9Ob3RlSXRlbSogcE5vdGVJdGVtKQotewotCUZYX0lOVDMyIG5JbmRleCA9IHRoaXMtPkdldEl0ZW1JbmRleCgoQ1BXTF9Ob3RlSXRlbSopcE5vdGVJdGVtKTsKK3ZvaWQgQ1BXTF9Ob3RlX0NvbnRlbnRzOjpEZWxldGVTdWJJdGVtKElQV0xfTm90ZUl0ZW0qIHBOb3RlSXRlbSkgeworICBpbnQzMl90IG5JbmRleCA9IEdldEl0ZW1JbmRleCgoQ1BXTF9Ob3RlSXRlbSopcE5vdGVJdGVtKTsKIAotCWlmIChuSW5kZXggPiAwKQotCXsKLQkJaWYgKENQV0xfTm90ZUl0ZW0qIHBQV0xOb3RlSXRlbSA9IChDUFdMX05vdGVJdGVtKilwTm90ZUl0ZW0pCi0JCXsKLQkJCXBQV0xOb3RlSXRlbS0+S2lsbEZvY3VzKCk7Ci0JCQlwUFdMTm90ZUl0ZW0tPkRlc3Ryb3koKTsKLQkJCWRlbGV0ZSBwUFdMTm90ZUl0ZW07Ci0JCX0KKyAgaWYgKG5JbmRleCA+IDApIHsKKyAgICBpZiAoQ1BXTF9Ob3RlSXRlbSogcFBXTE5vdGVJdGVtID0gKENQV0xfTm90ZUl0ZW0qKXBOb3RlSXRlbSkgeworICAgICAgcFBXTE5vdGVJdGVtLT5LaWxsRm9jdXMoKTsKKyAgICAgIHBQV0xOb3RlSXRlbS0+RGVzdHJveSgpOworICAgICAgZGVsZXRlIHBQV0xOb3RlSXRlbTsKKyAgICB9CiAKLQkJZm9yIChGWF9JTlQzMiBpPW5JbmRleCxzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQkJewotCQkJaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkKLQkJCXsKLQkJCQlBU1NFUlQocENoaWxkLT5HZXRDbGFzc05hbWUoKSA9PSAiQ1BXTF9Ob3RlSXRlbSIpOwotCQkJCUNQV0xfTm90ZUl0ZW0qIHBJdGVtID0gKENQV0xfTm90ZUl0ZW0qKXBDaGlsZDsKLQkJCQlwSXRlbS0+UmVzZXRTdWJqZWN0TmFtZShpKTsKLQkJCX0KLQkJfQorICAgIGZvciAoaW50MzJfdCBpID0gbkluZGV4LCBzeiA9IG1fYUNoaWxkcmVuLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgIGlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpIHsKKyAgICAgICAgQVNTRVJUKHBDaGlsZC0+R2V0Q2xhc3NOYW1lKCkgPT0gIkNQV0xfTm90ZUl0ZW0iKTsKKyAgICAgICAgQ1BXTF9Ob3RlSXRlbSogcEl0ZW0gPSAoQ1BXTF9Ob3RlSXRlbSopcENoaWxkOworICAgICAgICBwSXRlbS0+UmVzZXRTdWJqZWN0TmFtZShpKTsKKyAgICAgIH0KKyAgICB9CiAKLQkJdGhpcy0+T25Ob3RpZnkodGhpcywgUE5NX05PVEVFRElUQ0hBTkdFRCwgMCwgMCk7Ci0JfQorICAgIE9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFRURJVENIQU5HRUQsIDAsIDApOworICB9CiB9CiAKLUlQV0xfTm90ZUl0ZW0qIENQV0xfTm90ZV9Db250ZW50czo6R2V0SGl0Tm90ZUl0ZW0oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCi17Ci0JQ1BERl9Qb2ludCBwdCA9IHRoaXMtPlBhcmVudFRvQ2hpbGQocG9pbnQpOworSVBXTF9Ob3RlSXRlbSogQ1BXTF9Ob3RlX0NvbnRlbnRzOjpHZXRIaXROb3RlSXRlbShjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBDUERGX1BvaW50IHB0ID0gUGFyZW50VG9DaGlsZChwb2ludCk7CiAKLQlmb3IgKEZYX0lOVDMyIGk9MCxzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQl7Ci0JCWlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpCi0JCXsKLQkJCWlmIChwQ2hpbGQtPkdldENsYXNzTmFtZSgpID09ICJDUFdMX05vdGVJdGVtIikKLQkJCXsKLQkJCQlDUFdMX05vdGVJdGVtKiBwTm90ZUl0ZW0gPSAoQ1BXTF9Ob3RlSXRlbSopcENoaWxkOwotCQkJCWlmIChJUFdMX05vdGVJdGVtKiBwUmV0ID0gcE5vdGVJdGVtLT5HZXRIaXROb3RlSXRlbShwdCkpCi0JCQkJCXJldHVybiBwUmV0OwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBOVUxMOworICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9hQ2hpbGRyZW4uR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgIGlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpIHsKKyAgICAgIGlmIChwQ2hpbGQtPkdldENsYXNzTmFtZSgpID09ICJDUFdMX05vdGVJdGVtIikgeworICAgICAgICBDUFdMX05vdGVJdGVtKiBwTm90ZUl0ZW0gPSAoQ1BXTF9Ob3RlSXRlbSopcENoaWxkOworICAgICAgICBpZiAoSVBXTF9Ob3RlSXRlbSogcFJldCA9IHBOb3RlSXRlbS0+R2V0SGl0Tm90ZUl0ZW0ocHQpKQorICAgICAgICAgIHJldHVybiBwUmV0OworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBDUFdMX05vdGVfQ29udGVudHM6Ok9uTm90aWZ5KENQV0xfV25kKiBwV25kLCBGWF9EV09SRCBtc2csIEZYX0lOVFBUUiB3UGFyYW0sIEZYX0lOVFBUUiBsUGFyYW0pCi17Ci0Jc3dpdGNoIChtc2cpCi0JewotCWNhc2UgUE5NX05PVEVFRElUQ0hBTkdFRDoKLQkJewotCQkJRlhfSU5UMzIgbkluZGV4ID0gdGhpcy0+R2V0SXRlbUluZGV4KHBXbmQpOwotCQkJaWYgKG5JbmRleCA8IDApIG5JbmRleCA9IDA7Cit2b2lkIENQV0xfTm90ZV9Db250ZW50czo6T25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHdQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBsUGFyYW0pIHsKKyAgc3dpdGNoIChtc2cpIHsKKyAgICBjYXNlIFBOTV9OT1RFRURJVENIQU5HRUQ6IHsKKyAgICAgIGludDMyX3QgbkluZGV4ID0gR2V0SXRlbUluZGV4KHBXbmQpOworICAgICAgaWYgKG5JbmRleCA8IDApCisgICAgICAgIG5JbmRleCA9IDA7CiAKLQkJCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShGQUxTRSk7CQotCQkJdGhpcy0+UmVzZXRDb250ZW50KG5JbmRleCk7Ci0JCQltX3BFZGl0LT5FbmFibGVOb3RpZnkoVFJVRSk7CisgICAgICBtX3BFZGl0LT5FbmFibGVOb3RpZnkoRkFMU0UpOworICAgICAgUmVzZXRDb250ZW50KG5JbmRleCk7CisgICAgICBtX3BFZGl0LT5FbmFibGVOb3RpZnkoVFJVRSk7CiAKLQkJCWZvciAoRlhfSU5UMzIgaT1uSW5kZXgrMSwgc3o9bV9hQ2hpbGRyZW4uR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JCQl7Ci0JCQkJaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkKLQkJCQkJcENoaWxkLT5Pbk5vdGlmeSh0aGlzLCBQTk1fTk9URVJFU0VULCAwLCAwKTsKLQkJCX0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gbkluZGV4ICsgMSwgc3ogPSBtX2FDaGlsZHJlbi5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICAgIGlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpCisgICAgICAgICAgcENoaWxkLT5Pbk5vdGlmeSh0aGlzLCBQTk1fTk9URVJFU0VULCAwLCAwKTsKKyAgICAgIH0KIAotCQkJaWYgKENQV0xfV25kICogcFBhcmVudCA9IHRoaXMtPkdldFBhcmVudFdpbmRvdygpKQotCQkJewotCQkJCXBQYXJlbnQtPk9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFRURJVENIQU5HRUQsIDAsIDApOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQljYXNlIFBOTV9TQ1JPTExXSU5ET1c6Ci0JCXRoaXMtPlNldFNjcm9sbFBvcyhDUERGX1BvaW50KDAuMGYsICooRlhfRkxPQVQqKWxQYXJhbSkpOwotCQl0aGlzLT5SZXNldEZhY2UoKTsKLQkJSW52YWxpZGF0ZVJlY3QoTlVMTCk7Ci0JCXJldHVybjsJCQotCWNhc2UgUE5NX1NFVENBUkVUSU5GTzoKLQkJaWYgKFBXTF9DQVJFVF9JTkZPICogcEluZm8gPSAoUFdMX0NBUkVUX0lORk8qKXdQYXJhbSkKLQkJewotCQkJUFdMX0NBUkVUX0lORk8gbmV3SW5mbyA9ICpwSW5mbzsKLQkJCW5ld0luZm8uYlZpc2libGUgPSBUUlVFOwotCQkJbmV3SW5mby5wdEhlYWQgPSB0aGlzLT5DaGlsZFRvUGFyZW50KHBJbmZvLT5wdEhlYWQpOwotCQkJbmV3SW5mby5wdEZvb3QgPSB0aGlzLT5DaGlsZFRvUGFyZW50KHBJbmZvLT5wdEZvb3QpOworICAgICAgaWYgKENQV0xfV25kKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpIHsKKyAgICAgICAgcFBhcmVudC0+T25Ob3RpZnkodGhpcywgUE5NX05PVEVFRElUQ0hBTkdFRCwgMCwgMCk7CisgICAgICB9CisgICAgfQorICAgICAgcmV0dXJuOworICAgIGNhc2UgUE5NX1NDUk9MTFdJTkRPVzoKKyAgICAgIFNldFNjcm9sbFBvcyhDUERGX1BvaW50KDAuMGYsICooRlhfRkxPQVQqKWxQYXJhbSkpOworICAgICAgUmVzZXRGYWNlKCk7CisgICAgICBJbnZhbGlkYXRlUmVjdChOVUxMKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFBOTV9TRVRDQVJFVElORk86CisgICAgICBpZiAoUFdMX0NBUkVUX0lORk8qIHBJbmZvID0gKFBXTF9DQVJFVF9JTkZPKil3UGFyYW0pIHsKKyAgICAgICAgUFdMX0NBUkVUX0lORk8gbmV3SW5mbyA9ICpwSW5mbzsKKyAgICAgICAgbmV3SW5mby5iVmlzaWJsZSA9IFRSVUU7CisgICAgICAgIG5ld0luZm8ucHRIZWFkID0gQ2hpbGRUb1BhcmVudChwSW5mby0+cHRIZWFkKTsKKyAgICAgICAgbmV3SW5mby5wdEZvb3QgPSBDaGlsZFRvUGFyZW50KHBJbmZvLT5wdEZvb3QpOwogCi0JCQlpZiAoQ1BXTF9XbmQgKiBwUGFyZW50ID0gdGhpcy0+R2V0UGFyZW50V2luZG93KCkpCi0JCQl7Ci0JCQkJcFBhcmVudC0+T25Ob3RpZnkodGhpcywgUE5NX1NFVENBUkVUSU5GTywgKEZYX0lOVFBUUikmbmV3SW5mbywgMCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCWNhc2UgUE5NX05PVEVSRVNFVDoKLQkJewotCQkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KEZBTFNFKTsJCi0JCQl0aGlzLT5SZXNldENvbnRlbnQoMCk7Ci0JCQltX3BFZGl0LT5FbmFibGVOb3RpZnkoVFJVRSk7CisgICAgICAgIGlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKSB7CisgICAgICAgICAgcFBhcmVudC0+T25Ob3RpZnkodGhpcywgUE5NX1NFVENBUkVUSU5GTywgKGludHB0cl90KSZuZXdJbmZvLCAwKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuOworICAgIGNhc2UgUE5NX05PVEVSRVNFVDogeworICAgICAgbV9wRWRpdC0+RW5hYmxlTm90aWZ5KEZBTFNFKTsKKyAgICAgIFJlc2V0Q29udGVudCgwKTsKKyAgICAgIG1fcEVkaXQtPkVuYWJsZU5vdGlmeShUUlVFKTsKIAotCQkJZm9yIChGWF9JTlQzMiBpPTEsIHN6PW1fYUNoaWxkcmVuLkdldFNpemUoKTsgaTxzejsgaSsrKQotCQkJewotCQkJCWlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpCi0JCQkJCXBDaGlsZC0+T25Ob3RpZnkodGhpcywgUE5NX05PVEVSRVNFVCwgMCwgMCk7Ci0JCQl9CQorICAgICAgZm9yIChpbnQzMl90IGkgPSAxLCBzeiA9IG1fYUNoaWxkcmVuLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkKKyAgICAgICAgICBwQ2hpbGQtPk9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFUkVTRVQsIDAsIDApOworICAgICAgfQogCi0JCQltX3BFZGl0LT5FbmFibGVOb3RpZnkoRkFMU0UpOwkKLQkJCXRoaXMtPlJlc2V0Q29udGVudCgwKTsKLQkJCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShUUlVFKTsKLQkJfQotCQlyZXR1cm47Ci0JfQorICAgICAgbV9wRWRpdC0+RW5hYmxlTm90aWZ5KEZBTFNFKTsKKyAgICAgIFJlc2V0Q29udGVudCgwKTsKKyAgICAgIG1fcEVkaXQtPkVuYWJsZU5vdGlmeShUUlVFKTsKKyAgICB9CisgICAgICByZXR1cm47CisgIH0KIAotCUNQV0xfV25kOjpPbk5vdGlmeShwV25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKKyAgQ1BXTF9XbmQ6Ok9uTm90aWZ5KHBXbmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOwogfQogCi1GWF9CT09MCUNQV0xfTm90ZV9Db250ZW50czo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQotewotCWlmIChDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCxuRmxhZykpIHJldHVybiBUUlVFOworRlhfQk9PTCBDUFdMX05vdGVfQ29udGVudHM6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgeworICBpZiAoQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsIG5GbGFnKSkKKyAgICByZXR1cm4gVFJVRTsKIAotCWlmICghbV9wRWRpdC0+SXNGb2N1c2VkKCkpCi0JewotCQltX3BFZGl0LT5TZXRGb2N1cygpOwotCX0KKyAgaWYgKCFtX3BFZGl0LT5Jc0ZvY3VzZWQoKSkgeworICAgIG1fcEVkaXQtPlNldEZvY3VzKCk7CisgIH0KIAotCXJldHVybiBUUlVFOworICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBDUFdMX05vdGVfQ29udGVudHM6OlNldEVkaXRGb2N1cyhGWF9CT09MIGJMYXN0KQotewotCWlmICghbV9wRWRpdC0+SXNGb2N1c2VkKCkpCi0JewotCQltX3BFZGl0LT5TZXRGb2N1cygpOwotCQltX3BFZGl0LT5TZXRDYXJldChiTGFzdCA/IG1fcEVkaXQtPkdldFRvdGFsV29yZHMoKSA6IDApOwotCX0KK3ZvaWQgQ1BXTF9Ob3RlX0NvbnRlbnRzOjpTZXRFZGl0Rm9jdXMoRlhfQk9PTCBiTGFzdCkgeworICBpZiAoIW1fcEVkaXQtPklzRm9jdXNlZCgpKSB7CisgICAgbV9wRWRpdC0+U2V0Rm9jdXMoKTsKKyAgICBtX3BFZGl0LT5TZXRDYXJldChiTGFzdCA/IG1fcEVkaXQtPkdldFRvdGFsV29yZHMoKSA6IDApOworICB9CiB9CiAKLUNQV0xfRWRpdCogQ1BXTF9Ob3RlX0NvbnRlbnRzOjpHZXRFZGl0KCkgY29uc3QKLXsKLQlyZXR1cm4gbV9wRWRpdDsKK0NQV0xfRWRpdCogQ1BXTF9Ob3RlX0NvbnRlbnRzOjpHZXRFZGl0KCkgY29uc3QgeworICByZXR1cm4gbV9wRWRpdDsKIH0KIAotdm9pZCBDUFdMX05vdGVfQ29udGVudHM6OkVuYWJsZU1vZGlmeShGWF9CT09MIGJFbmFibGVkKQotewotCWlmICghYkVuYWJsZWQpCi0JCW1fcEVkaXQtPkFkZEZsYWcoUFdTX1JFQURPTkxZKTsKLQllbHNlCi0JCW1fcEVkaXQtPlJlbW92ZUZsYWcoUFdTX1JFQURPTkxZKTsKK3ZvaWQgQ1BXTF9Ob3RlX0NvbnRlbnRzOjpFbmFibGVNb2RpZnkoRlhfQk9PTCBiRW5hYmxlZCkgeworICBpZiAoIWJFbmFibGVkKQorICAgIG1fcEVkaXQtPkFkZEZsYWcoUFdTX1JFQURPTkxZKTsKKyAgZWxzZQorICAgIG1fcEVkaXQtPlJlbW92ZUZsYWcoUFdTX1JFQURPTkxZKTsKIAotCWZvciAoRlhfSU5UMzIgaT0wLHN6PW1fYUNoaWxkcmVuLkdldFNpemUoKTsgaTxzejsgaSsrKQotCXsKLQkJaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkKLQkJewotCQkJaWYgKHBDaGlsZC0+R2V0Q2xhc3NOYW1lKCkgPT0gIkNQV0xfTm90ZUl0ZW0iKQotCQkJewotCQkJCUNQV0xfTm90ZUl0ZW0qIHBOb3RlSXRlbSA9IChDUFdMX05vdGVJdGVtKilwQ2hpbGQ7Ci0JCQkJcE5vdGVJdGVtLT5FbmFibGVNb2RpZnkoYkVuYWJsZWQpOwotCQkJfQotCQl9Ci0JfQorICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9hQ2hpbGRyZW4uR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgeworICAgIGlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpIHsKKyAgICAgIGlmIChwQ2hpbGQtPkdldENsYXNzTmFtZSgpID09ICJDUFdMX05vdGVJdGVtIikgeworICAgICAgICBDUFdMX05vdGVJdGVtKiBwTm90ZUl0ZW0gPSAoQ1BXTF9Ob3RlSXRlbSopcENoaWxkOworICAgICAgICBwTm90ZUl0ZW0tPkVuYWJsZU1vZGlmeShiRW5hYmxlZCk7CisgICAgICB9CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlX0NvbnRlbnRzOjpFbmFibGVSZWFkKEZYX0JPT0wgYkVuYWJsZWQpCi17Ci0JaWYgKCFiRW5hYmxlZCkKLQkJbV9wRWRpdC0+QWRkRmxhZyhQRVNfTk9SRUFEKTsKLQllbHNlCi0JCW1fcEVkaXQtPlJlbW92ZUZsYWcoUEVTX05PUkVBRCk7Cit2b2lkIENQV0xfTm90ZV9Db250ZW50czo6RW5hYmxlUmVhZChGWF9CT09MIGJFbmFibGVkKSB7CisgIGlmICghYkVuYWJsZWQpCisgICAgbV9wRWRpdC0+QWRkRmxhZyhQRVNfTk9SRUFEKTsKKyAgZWxzZQorICAgIG1fcEVkaXQtPlJlbW92ZUZsYWcoUEVTX05PUkVBRCk7CiAKLQlmb3IgKEZYX0lOVDMyIGk9MCxzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQl7Ci0JCWlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpCi0JCXsKLQkJCWlmIChwQ2hpbGQtPkdldENsYXNzTmFtZSgpID09ICJDUFdMX05vdGVJdGVtIikKLQkJCXsKLQkJCQlDUFdMX05vdGVJdGVtKiBwTm90ZUl0ZW0gPSAoQ1BXTF9Ob3RlSXRlbSopcENoaWxkOwotCQkJCXBOb3RlSXRlbS0+RW5hYmxlUmVhZChiRW5hYmxlZCk7Ci0JCQl9Ci0JCX0KLQl9CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FDaGlsZHJlbi5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkgeworICAgICAgaWYgKHBDaGlsZC0+R2V0Q2xhc3NOYW1lKCkgPT0gIkNQV0xfTm90ZUl0ZW0iKSB7CisgICAgICAgIENQV0xfTm90ZUl0ZW0qIHBOb3RlSXRlbSA9IChDUFdMX05vdGVJdGVtKilwQ2hpbGQ7CisgICAgICAgIHBOb3RlSXRlbS0+RW5hYmxlUmVhZChiRW5hYmxlZCk7CisgICAgICB9CisgICAgfQorICB9CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9Ob3RlSXRlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitDUFdMX05vdGVJdGVtOjpDUFdMX05vdGVJdGVtKCkKKyAgICA6IG1fcFN1YmplY3QoTlVMTCksCisgICAgICBtX3BEYXRlVGltZShOVUxMKSwKKyAgICAgIG1fcENvbnRlbnRzKE5VTEwpLAorICAgICAgbV9wUHJpdmF0ZURhdGEoTlVMTCksCisgICAgICBtX3NBdXRob3IoTCIiKSwKKyAgICAgIG1fZk9sZEl0ZW1IZWlnaHQoMC4wZiksCisgICAgICBtX2JTaXplQ2hhbmdlZChGQUxTRSksCisgICAgICBtX2JBbGxvd01vZGlmeShUUlVFKSB7fQogCi1DUFdMX05vdGVJdGVtOjpDUFdMX05vdGVJdGVtKCkgOgotCW1fcFN1YmplY3QoTlVMTCksCi0JbV9wRGF0ZVRpbWUoTlVMTCksCi0JbV9wQ29udGVudHMoTlVMTCksCi0JbV9wUHJpdmF0ZURhdGEoTlVMTCksCi0JbV9zQXV0aG9yKEwiIiksCi0JbV9mT2xkSXRlbUhlaWdodCgwLjBmKSwKLQltX2JTaXplQ2hhbmdlZChGQUxTRSksCi0JbV9iQWxsb3dNb2RpZnkoVFJVRSkKLXsKLX0KK0NQV0xfTm90ZUl0ZW06On5DUFdMX05vdGVJdGVtKCkge30KIAotQ1BXTF9Ob3RlSXRlbTo6fkNQV0xfTm90ZUl0ZW0oKQoteworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9Ob3RlSXRlbTo6R2V0Q2xhc3NOYW1lKCkgY29uc3QgeworICByZXR1cm4gIkNQV0xfTm90ZUl0ZW0iOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUFdMX05vdGVJdGVtOjpHZXRDbGFzc05hbWUoKSBjb25zdAotewotCXJldHVybiAiQ1BXTF9Ob3RlSXRlbSI7Ci19Cit2b2lkIENQV0xfTm90ZUl0ZW06OkNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApIHsKKyAgQ1BXTF9Db2xvciBzVGV4dENvbG9yOwogCi12b2lkIENQV0xfTm90ZUl0ZW06OkNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKQotewotCUNQV0xfQ29sb3Igc1RleHRDb2xvcjsKKyAgaWYgKENQV0xfVXRpbHM6OklzQmxhY2tPcldoaXRlKEdldEJhY2tncm91bmRDb2xvcigpKSkKKyAgICBzVGV4dENvbG9yID0gUFdMX0RFRkFVTFRfV0hJVEVDT0xPUjsKKyAgZWxzZQorICAgIHNUZXh0Q29sb3IgPSBQV0xfREVGQVVMVF9CTEFDS0NPTE9SOwogCi0JaWYgKENQV0xfVXRpbHM6OklzQmxhY2tPcldoaXRlKHRoaXMtPkdldEJhY2tncm91bmRDb2xvcigpKSkKLQkJc1RleHRDb2xvciA9IFBXTF9ERUZBVUxUX1dISVRFQ09MT1I7Ci0JZWxzZQotCQlzVGV4dENvbG9yID0gUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUjsKKyAgbV9wU3ViamVjdCA9IG5ldyBDUFdMX0xhYmVsOworICBQV0xfQ1JFQVRFUEFSQU0gc2NwID0gY3A7CisgIHNjcC5wUGFyZW50V25kID0gdGhpczsKKyAgc2NwLmR3RmxhZ3MgPSBQV1NfVklTSUJMRSB8IFBXU19DSElMRCB8IFBFU19MRUZUIHwgUEVTX1RPUDsKKyAgc2NwLnNUZXh0Q29sb3IgPSBzVGV4dENvbG9yOworICBtX3BTdWJqZWN0LT5DcmVhdGUoc2NwKTsKIAotCW1fcFN1YmplY3QgPSBuZXcgQ1BXTF9MYWJlbDsKLQlQV0xfQ1JFQVRFUEFSQU0gc2NwID0gY3A7Ci0Jc2NwLnBQYXJlbnRXbmQgPSB0aGlzOwotCXNjcC5kd0ZsYWdzID0gUFdTX1ZJU0lCTEUgfCBQV1NfQ0hJTEQgfCBQRVNfTEVGVCB8IFBFU19UT1A7Ci0Jc2NwLnNUZXh0Q29sb3IgPSBzVGV4dENvbG9yOwotCW1fcFN1YmplY3QtPkNyZWF0ZShzY3ApOworICBtX3BEYXRlVGltZSA9IG5ldyBDUFdMX0xhYmVsOworICBQV0xfQ1JFQVRFUEFSQU0gZGNwID0gY3A7CisgIGRjcC5wUGFyZW50V25kID0gdGhpczsKKyAgZGNwLmR3RmxhZ3MgPSBQV1NfVklTSUJMRSB8IFBXU19DSElMRCB8IFBFU19SSUdIVCB8IFBFU19UT1A7CisgIGRjcC5zVGV4dENvbG9yID0gc1RleHRDb2xvcjsKKyAgbV9wRGF0ZVRpbWUtPkNyZWF0ZShkY3ApOwogCi0JbV9wRGF0ZVRpbWUgPSBuZXcgQ1BXTF9MYWJlbDsKLQlQV0xfQ1JFQVRFUEFSQU0gZGNwID0gY3A7Ci0JZGNwLnBQYXJlbnRXbmQgPSB0aGlzOwotCWRjcC5kd0ZsYWdzID0gUFdTX1ZJU0lCTEUgfCBQV1NfQ0hJTEQgfCBQRVNfUklHSFQgfCBQRVNfVE9QOwotCWRjcC5zVGV4dENvbG9yID0gc1RleHRDb2xvcjsKLQltX3BEYXRlVGltZS0+Q3JlYXRlKGRjcCk7Ci0KLQltX3BDb250ZW50cyA9IG5ldyBDUFdMX05vdGVfQ29udGVudHM7Ci0JUFdMX0NSRUFURVBBUkFNIGNjcCA9IGNwOwotCWNjcC5wUGFyZW50V25kID0gdGhpczsKLQkvL2NjcC5zQmFja2dyb3VuZENvbG9yID0gUFdMX0RFRkFVTFRfV0hJVEVDT0xPUjsKLQljY3Auc0JhY2tncm91bmRDb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgMjQwLzI1NS4wZiwgMjQwLzI1NS4wZiwgMjQwLzI1NS4wZik7Ci0JY2NwLmR3RmxhZ3MgPSBQV1NfVklTSUJMRSB8IFBXU19DSElMRCB8IFBXU19CQUNLR1JPVU5EOwotCW1fcENvbnRlbnRzLT5DcmVhdGUoY2NwKTsKLQltX3BDb250ZW50cy0+U2V0SXRlbVNwYWNlKFBPUFVQX0lURU1fU1BBQ0UpOwotCW1fcENvbnRlbnRzLT5TZXRUb3BTcGFjZShQT1BVUF9JVEVNX1NQQUNFKTsKLQltX3BDb250ZW50cy0+U2V0Qm90dG9tU3BhY2UoUE9QVVBfSVRFTV9TUEFDRSk7CisgIG1fcENvbnRlbnRzID0gbmV3IENQV0xfTm90ZV9Db250ZW50czsKKyAgUFdMX0NSRUFURVBBUkFNIGNjcCA9IGNwOworICBjY3AucFBhcmVudFduZCA9IHRoaXM7CisgIGNjcC5zQmFja2dyb3VuZENvbG9yID0KKyAgICAgIENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgMjQwIC8gMjU1LjBmLCAyNDAgLyAyNTUuMGYsIDI0MCAvIDI1NS4wZik7CisgIGNjcC5kd0ZsYWdzID0gUFdTX1ZJU0lCTEUgfCBQV1NfQ0hJTEQgfCBQV1NfQkFDS0dST1VORDsKKyAgbV9wQ29udGVudHMtPkNyZWF0ZShjY3ApOworICBtX3BDb250ZW50cy0+U2V0SXRlbVNwYWNlKFBPUFVQX0lURU1fU1BBQ0UpOworICBtX3BDb250ZW50cy0+U2V0VG9wU3BhY2UoUE9QVVBfSVRFTV9TUEFDRSk7CisgIG1fcENvbnRlbnRzLT5TZXRCb3R0b21TcGFjZShQT1BVUF9JVEVNX1NQQUNFKTsKIH0KIAotdm9pZCBDUFdMX05vdGVJdGVtOjpSZVBvc0NoaWxkV25kKCkKLXsKLQlpZiAodGhpcy0+SXNWYWxpZCgpKQotCXsKLQkJQVNTRVJUKG1fcFN1YmplY3QgIT0gTlVMTCk7Ci0JCUFTU0VSVChtX3BEYXRlVGltZSAhPSBOVUxMKTsKLQkJQVNTRVJUKG1fcENvbnRlbnRzICE9IE5VTEwpOwordm9pZCBDUFdMX05vdGVJdGVtOjpSZVBvc0NoaWxkV25kKCkgeworICBpZiAoSXNWYWxpZCgpKSB7CisgICAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwogCi0JCUNQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKKyAgICBDUERGX1JlY3QgcmNTdWJqZWN0ID0gcmNDbGllbnQ7CisgICAgcmNTdWJqZWN0LmxlZnQgKz0gUE9QVVBfSVRFTV9URVhUX0lOREVOVDsKKyAgICByY1N1YmplY3QudG9wID0gcmNDbGllbnQudG9wOworICAgIHJjU3ViamVjdC5yaWdodCA9CisgICAgICAgIFBXTF9NSU4ocmNTdWJqZWN0LmxlZnQgKyBtX3BTdWJqZWN0LT5HZXRDb250ZW50UmVjdCgpLldpZHRoKCkgKyAxLjBmLAorICAgICAgICAgICAgICAgIHJjQ2xpZW50LnJpZ2h0KTsKKyAgICByY1N1YmplY3QuYm90dG9tID0gcmNTdWJqZWN0LnRvcCAtIG1fcFN1YmplY3QtPkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7CisgICAgcmNTdWJqZWN0Lk5vcm1hbGl6ZSgpOworICAgIG1fcFN1YmplY3QtPk1vdmUocmNTdWJqZWN0LCBUUlVFLCBGQUxTRSk7CisgICAgbV9wU3ViamVjdC0+U2V0VmlzaWJsZShDUFdMX1V0aWxzOjpDb250YWluc1JlY3QocmNDbGllbnQsIHJjU3ViamVjdCkpOwogCi0JCUNQREZfUmVjdCByY1N1YmplY3QgPSByY0NsaWVudDsKLQkJcmNTdWJqZWN0LmxlZnQgKz0gUE9QVVBfSVRFTV9URVhUX0lOREVOVDsKLQkJcmNTdWJqZWN0LnRvcCA9IHJjQ2xpZW50LnRvcDsKLQkJcmNTdWJqZWN0LnJpZ2h0ID0gUFdMX01JTihyY1N1YmplY3QubGVmdCArIG1fcFN1YmplY3QtPkdldENvbnRlbnRSZWN0KCkuV2lkdGgoKSArIDEuMGYsIHJjQ2xpZW50LnJpZ2h0KTsKLQkJcmNTdWJqZWN0LmJvdHRvbSA9IHJjU3ViamVjdC50b3AgLSBtX3BTdWJqZWN0LT5HZXRDb250ZW50UmVjdCgpLkhlaWdodCgpOwotCQlyY1N1YmplY3QuTm9ybWFsaXplKCk7Ci0JCW1fcFN1YmplY3QtPk1vdmUocmNTdWJqZWN0LCBUUlVFLCBGQUxTRSk7Ci0JCW1fcFN1YmplY3QtPlNldFZpc2libGUoQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KHJjQ2xpZW50LCByY1N1YmplY3QpKTsKLQotCQlDUERGX1JlY3QgcmNEYXRlID0gcmNDbGllbnQ7Ci0JCXJjRGF0ZS5yaWdodCAtPSBQT1BVUF9JVEVNX1RFWFRfSU5ERU5UOwotCQlyY0RhdGUubGVmdCA9IFBXTF9NQVgocmNEYXRlLnJpZ2h0IC0gbV9wRGF0ZVRpbWUtPkdldENvbnRlbnRSZWN0KCkuV2lkdGgoKSAtIDEuMGYsIHJjU3ViamVjdC5yaWdodCk7Ci0JCXJjRGF0ZS5ib3R0b20gPSByY0RhdGUudG9wIC0gbV9wRGF0ZVRpbWUtPkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7Ci0JCXJjRGF0ZS5Ob3JtYWxpemUoKTsKLQkJbV9wRGF0ZVRpbWUtPk1vdmUocmNEYXRlLCBUUlVFLCBGQUxTRSk7Ci0JCW1fcERhdGVUaW1lLT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNEYXRlKSk7CisgICAgQ1BERl9SZWN0IHJjRGF0ZSA9IHJjQ2xpZW50OworICAgIHJjRGF0ZS5yaWdodCAtPSBQT1BVUF9JVEVNX1RFWFRfSU5ERU5UOworICAgIHJjRGF0ZS5sZWZ0ID0KKyAgICAgICAgUFdMX01BWChyY0RhdGUucmlnaHQgLSBtX3BEYXRlVGltZS0+R2V0Q29udGVudFJlY3QoKS5XaWR0aCgpIC0gMS4wZiwKKyAgICAgICAgICAgICAgICByY1N1YmplY3QucmlnaHQpOworICAgIHJjRGF0ZS5ib3R0b20gPSByY0RhdGUudG9wIC0gbV9wRGF0ZVRpbWUtPkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7CisgICAgcmNEYXRlLk5vcm1hbGl6ZSgpOworICAgIG1fcERhdGVUaW1lLT5Nb3ZlKHJjRGF0ZSwgVFJVRSwgRkFMU0UpOworICAgIG1fcERhdGVUaW1lLT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNEYXRlKSk7CiAKLQkJQ1BERl9SZWN0IHJjQ29udGVudHMgPSByY0NsaWVudDsKLQkJcmNDb250ZW50cy5sZWZ0ICs9IDEuMGY7Ci0JCXJjQ29udGVudHMucmlnaHQgLT0gMS4wZjsKLQkJcmNDb250ZW50cy50b3AgPSByY0RhdGUuYm90dG9tIC0gUE9QVVBfSVRFTV9IRUFEX0JPVFRPTTsKLQkJcmNDb250ZW50cy5ib3R0b20gKz0gUE9QVVBfSVRFTV9CT1RUT01XSURUSDsKLQkJcmNDb250ZW50cy5Ob3JtYWxpemUoKTsKLQkJbV9wQ29udGVudHMtPk1vdmUocmNDb250ZW50cywgVFJVRSwgRkFMU0UpOwotCQltX3BDb250ZW50cy0+U2V0VmlzaWJsZShDUFdMX1V0aWxzOjpDb250YWluc1JlY3QocmNDbGllbnQsIHJjQ29udGVudHMpKTsKLQl9CisgICAgQ1BERl9SZWN0IHJjQ29udGVudHMgPSByY0NsaWVudDsKKyAgICByY0NvbnRlbnRzLmxlZnQgKz0gMS4wZjsKKyAgICByY0NvbnRlbnRzLnJpZ2h0IC09IDEuMGY7CisgICAgcmNDb250ZW50cy50b3AgPSByY0RhdGUuYm90dG9tIC0gUE9QVVBfSVRFTV9IRUFEX0JPVFRPTTsKKyAgICByY0NvbnRlbnRzLmJvdHRvbSArPSBQT1BVUF9JVEVNX0JPVFRPTVdJRFRIOworICAgIHJjQ29udGVudHMuTm9ybWFsaXplKCk7CisgICAgbV9wQ29udGVudHMtPk1vdmUocmNDb250ZW50cywgVFJVRSwgRkFMU0UpOworICAgIG1fcENvbnRlbnRzLT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNDb250ZW50cykpOworICB9CiAKLQlTZXRDbGlwUmVjdChDUFdMX1V0aWxzOjpJbmZsYXRlUmVjdChHZXRXaW5kb3dSZWN0KCksMS4wZikpOworICBTZXRDbGlwUmVjdChDUFdMX1V0aWxzOjpJbmZsYXRlUmVjdChHZXRXaW5kb3dSZWN0KCksIDEuMGYpKTsKIH0KIAotdm9pZCBDUFdMX05vdGVJdGVtOjpTZXRQcml2YXRlRGF0YSh2b2lkKiBwRGF0YSkKLXsKLQltX3BQcml2YXRlRGF0YSA9IHBEYXRhOwordm9pZCBDUFdMX05vdGVJdGVtOjpTZXRQcml2YXRlRGF0YSh2b2lkKiBwRGF0YSkgeworICBtX3BQcml2YXRlRGF0YSA9IHBEYXRhOwogfQogCi12b2lkIENQV0xfTm90ZUl0ZW06OlNldEJrQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpCi17Ci0JQ1BXTF9Db2xvciBzQksgPSBjb2xvcjsKLQl0aGlzLT5TZXRCYWNrZ3JvdW5kQ29sb3Ioc0JLKTsKK3ZvaWQgQ1BXTF9Ob3RlSXRlbTo6U2V0QmtDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikgeworICBDUFdMX0NvbG9yIHNCSyA9IGNvbG9yOworICBTZXRCYWNrZ3JvdW5kQ29sb3Ioc0JLKTsKIAotCUNQV0xfQ29sb3Igc1RleHRDb2xvcjsKKyAgQ1BXTF9Db2xvciBzVGV4dENvbG9yOwogCi0JaWYgKENQV0xfVXRpbHM6OklzQmxhY2tPcldoaXRlKHNCSykpCi0JCXNUZXh0Q29sb3IgPSBQV0xfREVGQVVMVF9XSElURUNPTE9SOwotCWVsc2UKLQkJc1RleHRDb2xvciA9IFBXTF9ERUZBVUxUX0JMQUNLQ09MT1I7CisgIGlmIChDUFdMX1V0aWxzOjpJc0JsYWNrT3JXaGl0ZShzQkspKQorICAgIHNUZXh0Q29sb3IgPSBQV0xfREVGQVVMVF9XSElURUNPTE9SOworICBlbHNlCisgICAgc1RleHRDb2xvciA9IFBXTF9ERUZBVUxUX0JMQUNLQ09MT1I7CiAKLQl0aGlzLT5TZXRUZXh0Q29sb3Ioc1RleHRDb2xvcik7Ci0JaWYgKG1fcFN1YmplY3QpCi0JCW1fcFN1YmplY3QtPlNldFRleHRDb2xvcihzVGV4dENvbG9yKTsKLQlpZiAobV9wRGF0ZVRpbWUpCi0JCW1fcERhdGVUaW1lLT5TZXRUZXh0Q29sb3Ioc1RleHRDb2xvcik7CisgIFNldFRleHRDb2xvcihzVGV4dENvbG9yKTsKKyAgaWYgKG1fcFN1YmplY3QpCisgICAgbV9wU3ViamVjdC0+U2V0VGV4dENvbG9yKHNUZXh0Q29sb3IpOworICBpZiAobV9wRGF0ZVRpbWUpCisgICAgbV9wRGF0ZVRpbWUtPlNldFRleHRDb2xvcihzVGV4dENvbG9yKTsKIAotCXRoaXMtPkludmFsaWRhdGVSZWN0KE5VTEwpOworICBJbnZhbGlkYXRlUmVjdChudWxscHRyKTsKIAotCWlmIChJUFdMX05vdGVOb3RpZnkqIHBOb3RpZnkgPSBHZXROb3RlTm90aWZ5KCkpCi0JewotCQlwTm90aWZ5LT5PblNldEJrQ29sb3IodGhpcyk7Ci0JfQorICBpZiAoSVBXTF9Ob3RlTm90aWZ5KiBwTm90aWZ5ID0gR2V0Tm90ZU5vdGlmeSgpKSB7CisgICAgcE5vdGlmeS0+T25TZXRCa0NvbG9yKHRoaXMpOworICB9CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlSXRlbTo6U2V0U3ViamVjdE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNOYW1lKQotewotCWlmIChtX3BTdWJqZWN0KQotCXsKLQkJbV9wU3ViamVjdC0+U2V0VGV4dChzTmFtZS5jX3N0cigpKTsKLQl9Cit2b2lkIENQV0xfTm90ZUl0ZW06OlNldFN1YmplY3ROYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzTmFtZSkgeworICBpZiAobV9wU3ViamVjdCkgeworICAgIG1fcFN1YmplY3QtPlNldFRleHQoc05hbWUuY19zdHIoKSk7CisgIH0KIAotCWlmIChJUFdMX05vdGVOb3RpZnkqIHBOb3RpZnkgPSBHZXROb3RlTm90aWZ5KCkpCi0JewotCQlwTm90aWZ5LT5PblNldFN1YmplY3ROYW1lKHRoaXMpOwotCX0KKyAgaWYgKElQV0xfTm90ZU5vdGlmeSogcE5vdGlmeSA9IEdldE5vdGVOb3RpZnkoKSkgeworICAgIHBOb3RpZnktPk9uU2V0U3ViamVjdE5hbWUodGhpcyk7CisgIH0KIH0KIAotdm9pZCBDUFdMX05vdGVJdGVtOjpTZXRBdXRob3JOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzTmFtZSkKLXsKLQltX3NBdXRob3IgPSBzTmFtZTsKLQlSZXNldFN1YmplY3ROYW1lKC0xKTsJCit2b2lkIENQV0xfTm90ZUl0ZW06OlNldEF1dGhvck5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNOYW1lKSB7CisgIG1fc0F1dGhvciA9IHNOYW1lOworICBSZXNldFN1YmplY3ROYW1lKC0xKTsKIAotCWlmIChJUFdMX05vdGVOb3RpZnkqIHBOb3RpZnkgPSBHZXROb3RlTm90aWZ5KCkpCi0JewotCQlwTm90aWZ5LT5PblNldEF1dGhvck5hbWUodGhpcyk7Ci0JfQorICBpZiAoSVBXTF9Ob3RlTm90aWZ5KiBwTm90aWZ5ID0gR2V0Tm90ZU5vdGlmeSgpKSB7CisgICAgcE5vdGlmeS0+T25TZXRBdXRob3JOYW1lKHRoaXMpOworICB9CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlSXRlbTo6UmVzZXRTdWJqZWN0TmFtZShGWF9JTlQzMiBuSXRlbUluZGV4KQotewotCWlmIChuSXRlbUluZGV4IDwgMCkKLQl7Ci0JCWlmIChDUFdMX1duZCogcFBhcmVudCA9IHRoaXMtPkdldFBhcmVudFdpbmRvdygpKQotCQl7Ci0JCQlBU1NFUlQocFBhcmVudC0+R2V0Q2xhc3NOYW1lKCkgPT0gIkNQV0xfTm90ZV9Db250ZW50cyIpOwotCi0JCQlDUFdMX05vdGVfQ29udGVudHMqIHBDb250ZW50cyA9IChDUFdMX05vdGVfQ29udGVudHMqKXBQYXJlbnQ7Ci0JCQluSXRlbUluZGV4ID0gcENvbnRlbnRzLT5HZXRJdGVtSW5kZXgodGhpcyk7Ci0JCX0KLQl9Cit2b2lkIENQV0xfTm90ZUl0ZW06OlJlc2V0U3ViamVjdE5hbWUoaW50MzJfdCBuSXRlbUluZGV4KSB7CisgIGlmIChuSXRlbUluZGV4IDwgMCkgeworICAgIGlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKSB7CisgICAgICBBU1NFUlQocFBhcmVudC0+R2V0Q2xhc3NOYW1lKCkgPT0gIkNQV0xfTm90ZV9Db250ZW50cyIpOwogCi0JY29uc3QgQ1BXTF9Ob3RlKiBwTm90ZSA9IEdldE5vdGUoKTsKLQlBU1NFUlQocE5vdGUgIT0gTlVMTCk7CisgICAgICBDUFdMX05vdGVfQ29udGVudHMqIHBDb250ZW50cyA9IChDUFdMX05vdGVfQ29udGVudHMqKXBQYXJlbnQ7CisgICAgICBuSXRlbUluZGV4ID0gcENvbnRlbnRzLT5HZXRJdGVtSW5kZXgodGhpcyk7CisgICAgfQorICB9CiAKLQlDRlhfV2lkZVN0cmluZyBzU3ViamVjdDsKLQlzU3ViamVjdC5Gb3JtYXQocE5vdGUtPkdldFJlcGx5U3RyaW5nKCkuY19zdHIoKSwgbkl0ZW1JbmRleCk7CisgIGNvbnN0IENQV0xfTm90ZSogcE5vdGUgPSBHZXROb3RlKCk7CisgIENGWF9XaWRlU3RyaW5nIHNTdWJqZWN0OworICBzU3ViamVjdC5Gb3JtYXQocE5vdGUtPkdldFJlcGx5U3RyaW5nKCkuY19zdHIoKSwgbkl0ZW1JbmRleCk7CiAKLQlpZiAoIW1fc0F1dGhvci5Jc0VtcHR5KCkpCi0JewotCQlzU3ViamVjdCArPSBMIiAtICI7Ci0JCXNTdWJqZWN0ICs9IG1fc0F1dGhvcjsKLQl9Ci0JdGhpcy0+U2V0U3ViamVjdE5hbWUoc1N1YmplY3QpOwotCXRoaXMtPlJlUG9zQ2hpbGRXbmQoKTsKKyAgaWYgKCFtX3NBdXRob3IuSXNFbXB0eSgpKSB7CisgICAgc1N1YmplY3QgKz0gTCIgLSAiOworICAgIHNTdWJqZWN0ICs9IG1fc0F1dGhvcjsKKyAgfQorICBTZXRTdWJqZWN0TmFtZShzU3ViamVjdCk7CisgIFJlUG9zQ2hpbGRXbmQoKTsKIH0KIAotdm9pZCBDUFdMX05vdGVJdGVtOjpTZXREYXRlVGltZShGWF9TWVNURU1USU1FIHRpbWUpCi17Ci0JbV9kdE5vdGUgPSB0aW1lOwordm9pZCBDUFdMX05vdGVJdGVtOjpTZXREYXRlVGltZShGWF9TWVNURU1USU1FIHRpbWUpIHsKKyAgbV9kdE5vdGUgPSB0aW1lOwogCi0JQ0ZYX1dpZGVTdHJpbmcgc3dUaW1lOwotCXN3VGltZS5Gb3JtYXQoTCIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCIsIHRpbWUud1llYXIsIHRpbWUud01vbnRoLCB0aW1lLndEYXksIHRpbWUud0hvdXIsIHRpbWUud01pbnV0ZSwgdGltZS53U2Vjb25kKTsKLQlpZiAobV9wRGF0ZVRpbWUpCi0JewotCQltX3BEYXRlVGltZS0+U2V0VGV4dChzd1RpbWUuY19zdHIoKSk7Ci0JfQorICBDRlhfV2lkZVN0cmluZyBzd1RpbWU7CisgIHN3VGltZS5Gb3JtYXQoTCIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCIsIHRpbWUud1llYXIsIHRpbWUud01vbnRoLAorICAgICAgICAgICAgICAgIHRpbWUud0RheSwgdGltZS53SG91ciwgdGltZS53TWludXRlLCB0aW1lLndTZWNvbmQpOworICBpZiAobV9wRGF0ZVRpbWUpIHsKKyAgICBtX3BEYXRlVGltZS0+U2V0VGV4dChzd1RpbWUuY19zdHIoKSk7CisgIH0KIAotCXRoaXMtPlJlUG9zQ2hpbGRXbmQoKTsKKyAgUmVQb3NDaGlsZFduZCgpOwogCi0JaWYgKElQV0xfTm90ZU5vdGlmeSogcE5vdGlmeSA9IEdldE5vdGVOb3RpZnkoKSkKLQl7Ci0JCXBOb3RpZnktPk9uU2V0RGF0ZVRpbWUodGhpcyk7Ci0JfQorICBpZiAoSVBXTF9Ob3RlTm90aWZ5KiBwTm90aWZ5ID0gR2V0Tm90ZU5vdGlmeSgpKSB7CisgICAgcE5vdGlmeS0+T25TZXREYXRlVGltZSh0aGlzKTsKKyAgfQogfQogCi12b2lkIENQV0xfTm90ZUl0ZW06OlNldENvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzQ29udGVudHMpCi17Ci0JaWYgKG1fcENvbnRlbnRzKQotCXsKLQkJbV9wQ29udGVudHMtPlNldFRleHQoc0NvbnRlbnRzKTsKLQl9Cit2b2lkIENQV0xfTm90ZUl0ZW06OlNldENvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzQ29udGVudHMpIHsKKyAgaWYgKG1fcENvbnRlbnRzKSB7CisgICAgbV9wQ29udGVudHMtPlNldFRleHQoc0NvbnRlbnRzKTsKKyAgfQogCi0JaWYgKElQV0xfTm90ZU5vdGlmeSogcE5vdGlmeSA9IEdldE5vdGVOb3RpZnkoKSkKLQl7Ci0JCXBOb3RpZnktPk9uU2V0Q29udGVudHModGhpcyk7Ci0JfQorICBpZiAoSVBXTF9Ob3RlTm90aWZ5KiBwTm90aWZ5ID0gR2V0Tm90ZU5vdGlmeSgpKSB7CisgICAgcE5vdGlmeS0+T25TZXRDb250ZW50cyh0aGlzKTsKKyAgfQogfQogCi1DUFdMX05vdGVJdGVtKiBDUFdMX05vdGVJdGVtOjpHZXRQYXJlbnROb3RlSXRlbSgpIGNvbnN0Ci17Ci0JaWYgKENQV0xfV25kKiBwUGFyZW50ID0gdGhpcy0+R2V0UGFyZW50V2luZG93KCkpCi0JewotCQlpZiAoQ1BXTF9XbmQqIHBHcmFuZCA9IHBQYXJlbnQtPkdldFBhcmVudFdpbmRvdygpKQotCQl7Ci0JCQlBU1NFUlQocEdyYW5kLT5HZXRDbGFzc05hbWUoKSA9PSAiQ1BXTF9Ob3RlSXRlbSIpOwotCQkJcmV0dXJuIChDUFdMX05vdGVJdGVtKilwR3JhbmQ7Ci0JCX0KLQl9CitDUFdMX05vdGVJdGVtKiBDUFdMX05vdGVJdGVtOjpHZXRQYXJlbnROb3RlSXRlbSgpIGNvbnN0IHsKKyAgaWYgKENQV0xfV25kKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpIHsKKyAgICBpZiAoQ1BXTF9XbmQqIHBHcmFuZCA9IHBQYXJlbnQtPkdldFBhcmVudFdpbmRvdygpKSB7CisgICAgICBBU1NFUlQocEdyYW5kLT5HZXRDbGFzc05hbWUoKSA9PSAiQ1BXTF9Ob3RlSXRlbSIpOworICAgICAgcmV0dXJuIChDUFdMX05vdGVJdGVtKilwR3JhbmQ7CisgICAgfQorICB9CiAKLQlyZXR1cm4gTlVMTDsKKyAgcmV0dXJuIE5VTEw7CiB9CiAKLUlQV0xfTm90ZUl0ZW0qIENQV0xfTm90ZUl0ZW06OkdldFBhcmVudEl0ZW0oKSBjb25zdAotewotCXJldHVybiBHZXRQYXJlbnROb3RlSXRlbSgpOworSVBXTF9Ob3RlSXRlbSogQ1BXTF9Ob3RlSXRlbTo6R2V0UGFyZW50SXRlbSgpIGNvbnN0IHsKKyAgcmV0dXJuIEdldFBhcmVudE5vdGVJdGVtKCk7CiB9CiAKLUNQV0xfRWRpdCogQ1BXTF9Ob3RlSXRlbTo6R2V0RWRpdCgpIGNvbnN0Ci17Ci0JaWYgKG1fcENvbnRlbnRzKQotCQlyZXR1cm4gbV9wQ29udGVudHMtPkdldEVkaXQoKTsKLQlyZXR1cm4gTlVMTDsKK0NQV0xfRWRpdCogQ1BXTF9Ob3RlSXRlbTo6R2V0RWRpdCgpIGNvbnN0IHsKKyAgaWYgKG1fcENvbnRlbnRzKQorICAgIHJldHVybiBtX3BDb250ZW50cy0+R2V0RWRpdCgpOworICByZXR1cm4gTlVMTDsKIH0KIAotdm9pZCogQ1BXTF9Ob3RlSXRlbTo6R2V0UHJpdmF0ZURhdGEoKSBjb25zdAotewotCXJldHVybiBtX3BQcml2YXRlRGF0YTsKK3ZvaWQqIENQV0xfTm90ZUl0ZW06OkdldFByaXZhdGVEYXRhKCkgY29uc3QgeworICByZXR1cm4gbV9wUHJpdmF0ZURhdGE7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQV0xfTm90ZUl0ZW06OkdldEF1dGhvck5hbWUoKSBjb25zdAotewotCXJldHVybiBtX3NBdXRob3I7IAorQ0ZYX1dpZGVTdHJpbmcgQ1BXTF9Ob3RlSXRlbTo6R2V0QXV0aG9yTmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fc0F1dGhvcjsKIH0KIAotQ1BXTF9Db2xvciBDUFdMX05vdGVJdGVtOjpHZXRCa0NvbG9yKCkgY29uc3QKLXsKLQlyZXR1cm4gdGhpcy0+R2V0QmFja2dyb3VuZENvbG9yKCk7CitDUFdMX0NvbG9yIENQV0xfTm90ZUl0ZW06OkdldEJrQ29sb3IoKSBjb25zdCB7CisgIHJldHVybiBHZXRCYWNrZ3JvdW5kQ29sb3IoKTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BXTF9Ob3RlSXRlbTo6R2V0Q29udGVudHMoKSBjb25zdAotewotCWlmIChtX3BDb250ZW50cykKLQkJcmV0dXJuIG1fcENvbnRlbnRzLT5HZXRUZXh0KCk7CitDRlhfV2lkZVN0cmluZyBDUFdMX05vdGVJdGVtOjpHZXRDb250ZW50cygpIGNvbnN0IHsKKyAgaWYgKG1fcENvbnRlbnRzKQorICAgIHJldHVybiBtX3BDb250ZW50cy0+R2V0VGV4dCgpOwogCi0JcmV0dXJuIEwiIjsKKyAgcmV0dXJuIEwiIjsKIH0KIAotRlhfU1lTVEVNVElNRSBDUFdMX05vdGVJdGVtOjpHZXREYXRlVGltZSgpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fZHROb3RlOworRlhfU1lTVEVNVElNRSBDUFdMX05vdGVJdGVtOjpHZXREYXRlVGltZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fZHROb3RlOwogfQogCi1DRlhfV2lkZVN0cmluZyBDUFdMX05vdGVJdGVtOjpHZXRTdWJqZWN0TmFtZSgpIGNvbnN0Ci17Ci0JaWYgKG1fcFN1YmplY3QpCi0JCXJldHVybiBtX3BTdWJqZWN0LT5HZXRUZXh0KCk7CitDRlhfV2lkZVN0cmluZyBDUFdMX05vdGVJdGVtOjpHZXRTdWJqZWN0TmFtZSgpIGNvbnN0IHsKKyAgaWYgKG1fcFN1YmplY3QpCisgICAgcmV0dXJuIG1fcFN1YmplY3QtPkdldFRleHQoKTsKIAotCXJldHVybiBMIiI7CisgIHJldHVybiBMIiI7CiB9CiAKLUNQV0xfTm90ZUl0ZW0qIENQV0xfTm90ZUl0ZW06OkNyZWF0ZU5vdGVJdGVtKCkKLXsKLQlpZiAobV9wQ29udGVudHMpCi0JCXJldHVybiBtX3BDb250ZW50cy0+Q3JlYXRlU3ViSXRlbSgpOworQ1BXTF9Ob3RlSXRlbSogQ1BXTF9Ob3RlSXRlbTo6Q3JlYXRlTm90ZUl0ZW0oKSB7CisgIGlmIChtX3BDb250ZW50cykKKyAgICByZXR1cm4gbV9wQ29udGVudHMtPkNyZWF0ZVN1Ykl0ZW0oKTsKIAotCXJldHVybiBOVUxMOworICByZXR1cm4gTlVMTDsKIH0KIAotSVBXTF9Ob3RlSXRlbSogQ1BXTF9Ob3RlSXRlbTo6Q3JlYXRlU3ViSXRlbSgpCi17Ci0JcmV0dXJuIENyZWF0ZU5vdGVJdGVtKCk7CitJUFdMX05vdGVJdGVtKiBDUFdMX05vdGVJdGVtOjpDcmVhdGVTdWJJdGVtKCkgeworICByZXR1cm4gQ3JlYXRlTm90ZUl0ZW0oKTsKIH0KIAotRlhfSU5UMzIgQ1BXTF9Ob3RlSXRlbTo6Q291bnRTdWJJdGVtcygpIGNvbnN0Ci17Ci0JaWYgKG1fcENvbnRlbnRzKQotCQlyZXR1cm4gbV9wQ29udGVudHMtPkNvdW50U3ViSXRlbXMoKTsKK2ludDMyX3QgQ1BXTF9Ob3RlSXRlbTo6Q291bnRTdWJJdGVtcygpIGNvbnN0IHsKKyAgaWYgKG1fcENvbnRlbnRzKQorICAgIHJldHVybiBtX3BDb250ZW50cy0+Q291bnRTdWJJdGVtcygpOwogCi0JcmV0dXJuIDA7CisgIHJldHVybiAwOwogfQogCi1JUFdMX05vdGVJdGVtKiBDUFdMX05vdGVJdGVtOjpHZXRTdWJJdGVtcyhGWF9JTlQzMiBpbmRleCkgY29uc3QKLXsKLQlpZiAobV9wQ29udGVudHMpCi0JCXJldHVybiBtX3BDb250ZW50cy0+R2V0U3ViSXRlbXMoaW5kZXgpOworSVBXTF9Ob3RlSXRlbSogQ1BXTF9Ob3RlSXRlbTo6R2V0U3ViSXRlbXMoaW50MzJfdCBpbmRleCkgY29uc3QgeworICBpZiAobV9wQ29udGVudHMpCisgICAgcmV0dXJuIG1fcENvbnRlbnRzLT5HZXRTdWJJdGVtcyhpbmRleCk7CiAKLQlyZXR1cm4gTlVMTDsKKyAgcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlSXRlbTo6RGVsZXRlU3ViSXRlbShJUFdMX05vdGVJdGVtKiBwTm90ZUl0ZW0pCi17Ci0JdGhpcy0+S2lsbEZvY3VzKCk7Cit2b2lkIENQV0xfTm90ZUl0ZW06OkRlbGV0ZVN1Ykl0ZW0oSVBXTF9Ob3RlSXRlbSogcE5vdGVJdGVtKSB7CisgIEtpbGxGb2N1cygpOwogCi0JaWYgKElQV0xfTm90ZU5vdGlmeSogcE5vdGlmeSA9IEdldE5vdGVOb3RpZnkoKSkKLQl7Ci0JCXBOb3RpZnktPk9uSXRlbURlbGV0ZShwTm90ZUl0ZW0pOwotCX0KKyAgaWYgKElQV0xfTm90ZU5vdGlmeSogcE5vdGlmeSA9IEdldE5vdGVOb3RpZnkoKSkgeworICAgIHBOb3RpZnktPk9uSXRlbURlbGV0ZShwTm90ZUl0ZW0pOworICB9CiAKLQlpZiAobV9wQ29udGVudHMpCi0JCW1fcENvbnRlbnRzLT5EZWxldGVTdWJJdGVtKHBOb3RlSXRlbSk7CisgIGlmIChtX3BDb250ZW50cykKKyAgICBtX3BDb250ZW50cy0+RGVsZXRlU3ViSXRlbShwTm90ZUl0ZW0pOwogfQogCi1JUFdMX05vdGVJdGVtKiBDUFdMX05vdGVJdGVtOjpHZXRIaXROb3RlSXRlbShjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLQlDUERGX1BvaW50IHB0ID0gdGhpcy0+UGFyZW50VG9DaGlsZChwb2ludCk7CitJUFdMX05vdGVJdGVtKiBDUFdMX05vdGVJdGVtOjpHZXRIaXROb3RlSXRlbShjb25zdCBDUERGX1BvaW50JiBwb2ludCkgeworICBDUERGX1BvaW50IHB0ID0gUGFyZW50VG9DaGlsZChwb2ludCk7CiAKLQlpZiAodGhpcy0+V25kSGl0VGVzdChwdCkpCi0JewotCQlpZiAobV9wQ29udGVudHMpCi0JCXsKLQkJCWlmIChJUFdMX05vdGVJdGVtKiBwTm90ZUl0ZW0gPSBtX3BDb250ZW50cy0+R2V0SGl0Tm90ZUl0ZW0ocHQpKQotCQkJCXJldHVybiBwTm90ZUl0ZW07Ci0JCX0KKyAgaWYgKFduZEhpdFRlc3QocHQpKSB7CisgICAgaWYgKG1fcENvbnRlbnRzKSB7CisgICAgICBpZiAoSVBXTF9Ob3RlSXRlbSogcE5vdGVJdGVtID0gbV9wQ29udGVudHMtPkdldEhpdE5vdGVJdGVtKHB0KSkKKyAgICAgICAgcmV0dXJuIHBOb3RlSXRlbTsKKyAgICB9CiAKLQkJcmV0dXJuIHRoaXM7Ci0JfQorICAgIHJldHVybiB0aGlzOworICB9CiAKLQlyZXR1cm4gTlVMTDsKKyAgcmV0dXJuIE5VTEw7CiB9CiAKLUlQV0xfTm90ZUl0ZW0qIENQV0xfTm90ZUl0ZW06OkdldEZvY3VzZWROb3RlSXRlbSgpIGNvbnN0Ci17Ci0JaWYgKGNvbnN0IENQV0xfV25kKiBwV25kID0gdGhpcy0+R2V0Rm9jdXNlZCgpKQotCXsKLQkJaWYgKHBXbmQtPkdldENsYXNzTmFtZSgpID09ICJDUFdMX0VkaXQiKQotCQl7Ci0JCQlpZiAoQ1BXTF9XbmQqIHBQYXJlbnQgPSBwV25kLT5HZXRQYXJlbnRXaW5kb3coKSkKLQkJCXsKLQkJCQlBU1NFUlQocFBhcmVudC0+R2V0Q2xhc3NOYW1lKCkgPT0gIkNQV0xfTm90ZV9Db250ZW50cyIpOwotCQkJCQotCQkJCWlmIChDUFdMX1duZCogcEdyYW5kID0gcFBhcmVudC0+R2V0UGFyZW50V2luZG93KCkpCi0JCQkJewotCQkJCQlBU1NFUlQocEdyYW5kLT5HZXRDbGFzc05hbWUoKSA9PSAiQ1BXTF9Ob3RlSXRlbSIpOwkJCQkJCi0JCQkJCXJldHVybiAoQ1BXTF9Ob3RlSXRlbSopcEdyYW5kOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KK0lQV0xfTm90ZUl0ZW0qIENQV0xfTm90ZUl0ZW06OkdldEZvY3VzZWROb3RlSXRlbSgpIGNvbnN0IHsKKyAgaWYgKGNvbnN0IENQV0xfV25kKiBwV25kID0gR2V0Rm9jdXNlZCgpKSB7CisgICAgaWYgKHBXbmQtPkdldENsYXNzTmFtZSgpID09ICJDUFdMX0VkaXQiKSB7CisgICAgICBpZiAoQ1BXTF9XbmQqIHBQYXJlbnQgPSBwV25kLT5HZXRQYXJlbnRXaW5kb3coKSkgeworICAgICAgICBBU1NFUlQocFBhcmVudC0+R2V0Q2xhc3NOYW1lKCkgPT0gIkNQV0xfTm90ZV9Db250ZW50cyIpOworCisgICAgICAgIGlmIChDUFdMX1duZCogcEdyYW5kID0gcFBhcmVudC0+R2V0UGFyZW50V2luZG93KCkpIHsKKyAgICAgICAgICBBU1NFUlQocEdyYW5kLT5HZXRDbGFzc05hbWUoKSA9PSAiQ1BXTF9Ob3RlSXRlbSIpOworICAgICAgICAgIHJldHVybiAoQ1BXTF9Ob3RlSXRlbSopcEdyYW5kOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CiAKLQlyZXR1cm4gTlVMTDsKKyAgcmV0dXJuIE5VTEw7CiB9CiAKLUZYX0ZMT0FUIENQV0xfTm90ZUl0ZW06OkdldEl0ZW1IZWlnaHQoRlhfRkxPQVQgZkxpbWl0V2lkdGgpCi17Ci0JaWYgKGZMaW1pdFdpZHRoID4gMCkKLQl7Ci0JCWlmICghbV9iU2l6ZUNoYW5nZWQpCi0JCQlyZXR1cm4gbV9mT2xkSXRlbUhlaWdodDsKK0ZYX0ZMT0FUIENQV0xfTm90ZUl0ZW06OkdldEl0ZW1IZWlnaHQoRlhfRkxPQVQgZkxpbWl0V2lkdGgpIHsKKyAgaWYgKGZMaW1pdFdpZHRoID4gMCkgeworICAgIGlmICghbV9iU2l6ZUNoYW5nZWQpCisgICAgICByZXR1cm4gbV9mT2xkSXRlbUhlaWdodDsKIAotCQltX2JTaXplQ2hhbmdlZCA9IEZBTFNFOworICAgIG1fYlNpemVDaGFuZ2VkID0gRkFMU0U7CiAKLQkJQVNTRVJUKG1fcFN1YmplY3QgIT0gTlVMTCk7Ci0JCUFTU0VSVChtX3BEYXRlVGltZSAhPSBOVUxMKTsKLQkJQVNTRVJUKG1fcENvbnRlbnRzICE9IE5VTEwpOworICAgIEZYX0ZMT0FUIGZSZXQgPSBtX3BEYXRlVGltZS0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKKyAgICBGWF9GTE9BVCBmQm9yZGVyV2lkdGggPSAoRlhfRkxPQVQpR2V0Qm9yZGVyV2lkdGgoKTsKKyAgICBpZiAoZkxpbWl0V2lkdGggPiBmQm9yZGVyV2lkdGggKiAyKQorICAgICAgZlJldCArPSBtX3BDb250ZW50cy0+R2V0Q29udGVudHNIZWlnaHQoZkxpbWl0V2lkdGggLSBmQm9yZGVyV2lkdGggKiAyKTsKKyAgICBmUmV0ICs9IFBPUFVQX0lURU1fSEVBRF9CT1RUT00gKyBQT1BVUF9JVEVNX0JPVFRPTVdJRFRIICsgZkJvcmRlcldpZHRoICogMjsKIAotCQlGWF9GTE9BVCBmUmV0ID0gbV9wRGF0ZVRpbWUtPkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7Ci0JCUZYX0ZMT0FUIGZCb3JkZXJXaWR0aCA9IChGWF9GTE9BVCl0aGlzLT5HZXRCb3JkZXJXaWR0aCgpOwotCQlpZiAoZkxpbWl0V2lkdGggPiBmQm9yZGVyV2lkdGggKiAyKQotCQkJZlJldCArPSBtX3BDb250ZW50cy0+R2V0Q29udGVudHNIZWlnaHQoZkxpbWl0V2lkdGggLSBmQm9yZGVyV2lkdGggKiAyKTsKLQkJZlJldCArPSBQT1BVUF9JVEVNX0hFQURfQk9UVE9NICsgUE9QVVBfSVRFTV9CT1RUT01XSURUSCArIGZCb3JkZXJXaWR0aCAqIDI7Ci0KLQkJcmV0dXJuIG1fZk9sZEl0ZW1IZWlnaHQgPSBmUmV0OwotCX0KKyAgICByZXR1cm4gbV9mT2xkSXRlbUhlaWdodCA9IGZSZXQ7CisgIH0KIAotCXJldHVybiAwOworICByZXR1cm4gMDsKIH0KIAotRlhfRkxPQVQgQ1BXTF9Ob3RlSXRlbTo6R2V0SXRlbUxlZnRNYXJnaW4oKQotewotCXJldHVybiBQT1BVUF9JVEVNX1NJREVNQVJHSU47CitGWF9GTE9BVCBDUFdMX05vdGVJdGVtOjpHZXRJdGVtTGVmdE1hcmdpbigpIHsKKyAgcmV0dXJuIFBPUFVQX0lURU1fU0lERU1BUkdJTjsKIH0KIAotRlhfRkxPQVQgQ1BXTF9Ob3RlSXRlbTo6R2V0SXRlbVJpZ2h0TWFyZ2luKCkKLXsKLQlyZXR1cm4gUE9QVVBfSVRFTV9TSURFTUFSR0lOOworRlhfRkxPQVQgQ1BXTF9Ob3RlSXRlbTo6R2V0SXRlbVJpZ2h0TWFyZ2luKCkgeworICByZXR1cm4gUE9QVVBfSVRFTV9TSURFTUFSR0lOOwogfQogCi1GWF9CT09MCUNQV0xfTm90ZUl0ZW06Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQotewotCWlmICghbV9wQ29udGVudHMtPlduZEhpdFRlc3QobV9wQ29udGVudHMtPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkKLQl7Ci0JCVNldE5vdGVGb2N1cyhGQUxTRSk7Ci0JfQorRlhfQk9PTCBDUFdMX05vdGVJdGVtOjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgeworICBpZiAoIW1fcENvbnRlbnRzLT5XbmRIaXRUZXN0KG1fcENvbnRlbnRzLT5QYXJlbnRUb0NoaWxkKHBvaW50KSkpIHsKKyAgICBTZXROb3RlRm9jdXMoRkFMU0UpOworICB9CiAKLQlDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCxuRmxhZyk7CisgIENQV0xfV25kOjpPbkxCdXR0b25Eb3duKHBvaW50LCBuRmxhZyk7CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wJQ1BXTF9Ob3RlSXRlbTo6T25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKLXsKLQlpZiAoIW1fcENvbnRlbnRzLT5XbmRIaXRUZXN0KG1fcENvbnRlbnRzLT5QYXJlbnRUb0NoaWxkKHBvaW50KSkpCi0JewotCQlTZXROb3RlRm9jdXMoRkFMU0UpOwotCQlQb3B1cE5vdGVJdGVtTWVudShwb2ludCk7CitGWF9CT09MIENQV0xfTm90ZUl0ZW06Ok9uUkJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgeworICBpZiAoIW1fcENvbnRlbnRzLT5XbmRIaXRUZXN0KG1fcENvbnRlbnRzLT5QYXJlbnRUb0NoaWxkKHBvaW50KSkpIHsKKyAgICBTZXROb3RlRm9jdXMoRkFMU0UpOworICAgIFBvcHVwTm90ZUl0ZW1NZW51KHBvaW50KTsKIAotCQlyZXR1cm4gVFJVRTsKLQl9CisgICAgcmV0dXJuIFRSVUU7CisgIH0KIAotCXJldHVybiBDUFdMX1duZDo6T25SQnV0dG9uVXAocG9pbnQsbkZsYWcpOworICByZXR1cm4gQ1BXTF9XbmQ6Ok9uUkJ1dHRvblVwKHBvaW50LCBuRmxhZyk7CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlSXRlbTo6T25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgRlhfSU5UUFRSIHdQYXJhbSwgRlhfSU5UUFRSIGxQYXJhbSkKLXsKLQlzd2l0Y2ggKG1zZykKLQl7Ci0JY2FzZSBQTk1fTk9URUVESVRDSEFOR0VEOgkKLQkJbV9iU2l6ZUNoYW5nZWQgPSBUUlVFOwordm9pZCBDUFdMX05vdGVJdGVtOjpPbk5vdGlmeShDUFdMX1duZCogcFduZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCB3UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IGxQYXJhbSkgeworICBzd2l0Y2ggKG1zZykgeworICAgIGNhc2UgUE5NX05PVEVFRElUQ0hBTkdFRDoKKyAgICAgIG1fYlNpemVDaGFuZ2VkID0gVFJVRTsKIAotCQlpZiAoQ1BXTF9XbmQqIHBQYXJlbnQgPSB0aGlzLT5HZXRQYXJlbnRXaW5kb3coKSkKLQkJewotCQkJcFBhcmVudC0+T25Ob3RpZnkodGhpcywgUE5NX05PVEVFRElUQ0hBTkdFRCwgMCwgMCk7Ci0JCX0KLQkJcmV0dXJuOwkKLQljYXNlIFBOTV9TRVRDQVJFVElORk86Ci0JCWlmIChQV0xfQ0FSRVRfSU5GTyAqIHBJbmZvID0gKFBXTF9DQVJFVF9JTkZPKil3UGFyYW0pCi0JCXsKLQkJCVBXTF9DQVJFVF9JTkZPIG5ld0luZm8gPSAqcEluZm87Ci0JCQluZXdJbmZvLmJWaXNpYmxlID0gVFJVRTsKLQkJCW5ld0luZm8ucHRIZWFkID0gdGhpcy0+Q2hpbGRUb1BhcmVudChwSW5mby0+cHRIZWFkKTsKLQkJCW5ld0luZm8ucHRGb290ID0gdGhpcy0+Q2hpbGRUb1BhcmVudChwSW5mby0+cHRGb290KTsKKyAgICAgIGlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKSB7CisgICAgICAgIHBQYXJlbnQtPk9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFRURJVENIQU5HRUQsIDAsIDApOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIGNhc2UgUE5NX1NFVENBUkVUSU5GTzoKKyAgICAgIGlmIChQV0xfQ0FSRVRfSU5GTyogcEluZm8gPSAoUFdMX0NBUkVUX0lORk8qKXdQYXJhbSkgeworICAgICAgICBQV0xfQ0FSRVRfSU5GTyBuZXdJbmZvID0gKnBJbmZvOworICAgICAgICBuZXdJbmZvLmJWaXNpYmxlID0gVFJVRTsKKyAgICAgICAgbmV3SW5mby5wdEhlYWQgPSBDaGlsZFRvUGFyZW50KHBJbmZvLT5wdEhlYWQpOworICAgICAgICBuZXdJbmZvLnB0Rm9vdCA9IENoaWxkVG9QYXJlbnQocEluZm8tPnB0Rm9vdCk7CisKKyAgICAgICAgaWYgKENQV0xfV25kKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpIHsKKyAgICAgICAgICBwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0VUQ0FSRVRJTkZPLCAoaW50cHRyX3QpJm5ld0luZm8sIDApOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgY2FzZSBQTk1fTk9URVJFU0VUOgorICAgICAgbV9iU2l6ZUNoYW5nZWQgPSBUUlVFOworICAgICAgbV9wQ29udGVudHMtPk9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFUkVTRVQsIDAsIDApOwogCi0JCQlpZiAoQ1BXTF9XbmQgKiBwUGFyZW50ID0gdGhpcy0+R2V0UGFyZW50V2luZG93KCkpCi0JCQl7Ci0JCQkJcFBhcmVudC0+T25Ob3RpZnkodGhpcywgUE5NX1NFVENBUkVUSU5GTywgKEZYX0lOVFBUUikmbmV3SW5mbywgMCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCWNhc2UgUE5NX05PVEVSRVNFVDoKLQkJbV9iU2l6ZUNoYW5nZWQgPSBUUlVFOwotCQltX3BDb250ZW50cy0+T25Ob3RpZnkodGhpcywgUE5NX05PVEVSRVNFVCwgMCwgMCk7Ci0JCQotCQlyZXR1cm47Ci0JfQorICAgICAgcmV0dXJuOworICB9CiAKLQlDUFdMX1duZDo6T25Ob3RpZnkocFduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7CisgIENQV0xfV25kOjpPbk5vdGlmeShwV25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKIH0KIAotdm9pZCBDUFdMX05vdGVJdGVtOjpQb3B1cE5vdGVJdGVtTWVudShjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsKLQlpZiAoSVBXTF9Ob3RlTm90aWZ5KiBwTm90aWZ5ID0gR2V0Tm90ZU5vdGlmeSgpKQotCXsKLQkJRlhfSU5UMzIgeCx5OwotCQlQV0x0b1duZChwb2ludCwgeCwgeSk7Ci0JCWlmIChJRlhfU3lzdGVtSGFuZGxlciogcFNIID0gR2V0U3lzdGVtSGFuZGxlcigpKQotCQkJcFNILT5DbGllbnRUb1NjcmVlbihHZXRBdHRhY2hlZEhXbmQoKSwgeCwgeSk7Ci0JCXBOb3RpZnktPk9uUG9wdXBNZW51KHRoaXMsIHgsIHkpOwotCX0KK3ZvaWQgQ1BXTF9Ob3RlSXRlbTo6UG9wdXBOb3RlSXRlbU1lbnUoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgaWYgKElQV0xfTm90ZU5vdGlmeSogcE5vdGlmeSA9IEdldE5vdGVOb3RpZnkoKSkgeworICAgIGludDMyX3QgeCwgeTsKKyAgICBQV0x0b1duZChwb2ludCwgeCwgeSk7CisgICAgaWYgKElGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCkpCisgICAgICBwU0gtPkNsaWVudFRvU2NyZWVuKEdldEF0dGFjaGVkSFduZCgpLCB4LCB5KTsKKyAgICBwTm90aWZ5LT5PblBvcHVwTWVudSh0aGlzLCB4LCB5KTsKKyAgfQogfQogCi1jb25zdCBDUFdMX05vdGUqIENQV0xfTm90ZUl0ZW06OkdldE5vdGUoKSBjb25zdAotewotCWlmIChjb25zdCBDUFdMX1duZCogcFJvb3QgPSB0aGlzLT5HZXRSb290V25kKCkpCi0JewotCQlBU1NFUlQocFJvb3QtPkdldENsYXNzTmFtZSgpID09ICJDUFdMX05vdGVJdGVtIik7Ci0JCUNQV0xfTm90ZUl0ZW0qIHBOb3RlSXRlbSA9IChDUFdMX05vdGVJdGVtKilwUm9vdDsKLQkJaWYgKHBOb3RlSXRlbS0+SXNUb3BJdGVtKCkpCi0JCXsKLQkJCXJldHVybiAoQ1BXTF9Ob3RlKilwTm90ZUl0ZW07Ci0JCX0KLQl9Citjb25zdCBDUFdMX05vdGUqIENQV0xfTm90ZUl0ZW06OkdldE5vdGUoKSBjb25zdCB7CisgIGlmIChjb25zdCBDUFdMX1duZCogcFJvb3QgPSBHZXRSb290V25kKCkpIHsKKyAgICBBU1NFUlQocFJvb3QtPkdldENsYXNzTmFtZSgpID09ICJDUFdMX05vdGVJdGVtIik7CisgICAgQ1BXTF9Ob3RlSXRlbSogcE5vdGVJdGVtID0gKENQV0xfTm90ZUl0ZW0qKXBSb290OworICAgIGlmIChwTm90ZUl0ZW0tPklzVG9wSXRlbSgpKSB7CisgICAgICByZXR1cm4gKENQV0xfTm90ZSopcE5vdGVJdGVtOworICAgIH0KKyAgfQogCi0JcmV0dXJuIE5VTEw7CisgIHJldHVybiBOVUxMOwogfQogCi1JUFdMX05vdGVOb3RpZnkqIENQV0xfTm90ZUl0ZW06OkdldE5vdGVOb3RpZnkoKSBjb25zdAotewotCWlmIChjb25zdCBDUFdMX05vdGUqIHBOb3RlID0gR2V0Tm90ZSgpKQotCQlyZXR1cm4gcE5vdGUtPkdldE5vdGVOb3RpZnkoKTsKK0lQV0xfTm90ZU5vdGlmeSogQ1BXTF9Ob3RlSXRlbTo6R2V0Tm90ZU5vdGlmeSgpIGNvbnN0IHsKKyAgaWYgKGNvbnN0IENQV0xfTm90ZSogcE5vdGUgPSBHZXROb3RlKCkpCisgICAgcmV0dXJuIHBOb3RlLT5HZXROb3RlTm90aWZ5KCk7CiAKLQlyZXR1cm4gTlVMTDsKKyAgcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlSXRlbTo6T25DcmVhdGVOb3RlSXRlbSgpCi17Ci0JaWYgKElQV0xfTm90ZU5vdGlmeSogcE5vdGlmeSA9IEdldE5vdGVOb3RpZnkoKSkKLQl7Ci0JCXBOb3RpZnktPk9uSXRlbUNyZWF0ZSh0aGlzKTsKLQl9Cit2b2lkIENQV0xfTm90ZUl0ZW06Ok9uQ3JlYXRlTm90ZUl0ZW0oKSB7CisgIGlmIChJUFdMX05vdGVOb3RpZnkqIHBOb3RpZnkgPSBHZXROb3RlTm90aWZ5KCkpIHsKKyAgICBwTm90aWZ5LT5Pbkl0ZW1DcmVhdGUodGhpcyk7CisgIH0KIH0KIAotdm9pZCBDUFdMX05vdGVJdGVtOjpPbkNvbnRlbnRzVmFsaWRhdGUoKQotewotCWlmIChJUFdMX05vdGVOb3RpZnkqIHBOb3RpZnkgPSBHZXROb3RlTm90aWZ5KCkpCi0JewotCQlwTm90aWZ5LT5PblNldENvbnRlbnRzKHRoaXMpOwotCX0KK3ZvaWQgQ1BXTF9Ob3RlSXRlbTo6T25Db250ZW50c1ZhbGlkYXRlKCkgeworICBpZiAoSVBXTF9Ob3RlTm90aWZ5KiBwTm90aWZ5ID0gR2V0Tm90ZU5vdGlmeSgpKSB7CisgICAgcE5vdGlmeS0+T25TZXRDb250ZW50cyh0aGlzKTsKKyAgfQogfQogCi12b2lkIENQV0xfTm90ZUl0ZW06OlNldE5vdGVGb2N1cyhGWF9CT09MIGJMYXN0KQotewotCW1fcENvbnRlbnRzLT5TZXRFZGl0Rm9jdXMoYkxhc3QpOwordm9pZCBDUFdMX05vdGVJdGVtOjpTZXROb3RlRm9jdXMoRlhfQk9PTCBiTGFzdCkgeworICBtX3BDb250ZW50cy0+U2V0RWRpdEZvY3VzKGJMYXN0KTsKIH0KIAotdm9pZCBDUFdMX05vdGVJdGVtOjpFbmFibGVNb2RpZnkoRlhfQk9PTCBiRW5hYmxlZCkKLXsKLQltX3BDb250ZW50cy0+RW5hYmxlTW9kaWZ5KGJFbmFibGVkKTsKLQltX2JBbGxvd01vZGlmeSA9IGJFbmFibGVkOwordm9pZCBDUFdMX05vdGVJdGVtOjpFbmFibGVNb2RpZnkoRlhfQk9PTCBiRW5hYmxlZCkgeworICBtX3BDb250ZW50cy0+RW5hYmxlTW9kaWZ5KGJFbmFibGVkKTsKKyAgbV9iQWxsb3dNb2RpZnkgPSBiRW5hYmxlZDsKIH0KIAotdm9pZCBDUFdMX05vdGVJdGVtOjpFbmFibGVSZWFkKEZYX0JPT0wgYkVuYWJsZWQpCi17Ci0JbV9wQ29udGVudHMtPkVuYWJsZVJlYWQoYkVuYWJsZWQpOwordm9pZCBDUFdMX05vdGVJdGVtOjpFbmFibGVSZWFkKEZYX0JPT0wgYkVuYWJsZWQpIHsKKyAgbV9wQ29udGVudHMtPkVuYWJsZVJlYWQoYkVuYWJsZWQpOwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfTm90ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitDUFdMX05vdGU6OkNQV0xfTm90ZShJUG9wdXBfTm90ZSogcFBvcHVwTm90ZSwKKyAgICAgICAgICAgICAgICAgICAgIElQV0xfTm90ZU5vdGlmeSogcE5vdGVOb3RpZnksCisgICAgICAgICAgICAgICAgICAgICBJUFdMX05vdGVIYW5kbGVyKiBwTm90ZUhhbmRsZXIpCisgICAgOiBtX3BBdXRob3IoTlVMTCksCisgICAgICBtX3BJY29uKE5VTEwpLAorICAgICAgbV9wQ2xvc2VCb3goTlVMTCksCisgICAgICBtX3BMQkJveChOVUxMKSwKKyAgICAgIG1fcFJCQm94KE5VTEwpLAorICAgICAgbV9wQ29udGVudHNCYXIoTlVMTCksCisgICAgICBtX3BPcHRpb25zKE5VTEwpLAorICAgICAgbV9wTm90ZU5vdGlmeShwTm90ZU5vdGlmeSksCisgICAgICBtX2JSZXNpemluZyhGQUxTRSksCisgICAgICBtX2JFbmFibGVOb3RpZnkoVFJVRSkge30KIAotQ1BXTF9Ob3RlOjpDUFdMX05vdGUoSVBvcHVwX05vdGUqIHBQb3B1cE5vdGUsIElQV0xfTm90ZU5vdGlmeSogcE5vdGVOb3RpZnksIElQV0xfTm90ZUhhbmRsZXIqIHBOb3RlSGFuZGxlcikgOiAKLQltX3BBdXRob3IoTlVMTCksCi0JbV9wSWNvbihOVUxMKSwKLQltX3BDbG9zZUJveChOVUxMKSwKLQltX3BMQkJveChOVUxMKSwKLQltX3BSQkJveChOVUxMKSwKLQltX3BDb250ZW50c0JhcihOVUxMKSwKLQltX3BPcHRpb25zKE5VTEwpLAotCW1fcE5vdGVOb3RpZnkocE5vdGVOb3RpZnkpLAotCW1fYlJlc2l6aW5nKEZBTFNFKSwKLQltX3JjQ2FwdGlvbigwLDAsMCwwKSwKLQltX2JFbmFsYmxlTm90aWZ5KFRSVUUpLAotCW1fcFBvcHVwTm90ZShwUG9wdXBOb3RlKQotewotfQorQ1BXTF9Ob3RlOjp+Q1BXTF9Ob3RlKCkge30KIAotQ1BXTF9Ob3RlOjp+Q1BXTF9Ob3RlKCkKLXsKK0lQV0xfTm90ZUl0ZW0qIENQV0xfTm90ZTo6UmVwbHkoKSB7CisgIHJldHVybiBDcmVhdGVOb3RlSXRlbSgpOwogfQogCi1JUFdMX05vdGVJdGVtKiBDUFdMX05vdGU6OlJlcGx5KCkKLXsKLQlyZXR1cm4gQ3JlYXRlTm90ZUl0ZW0oKTsKK3ZvaWQgQ1BXTF9Ob3RlOjpFbmFibGVOb3RpZnkoRlhfQk9PTCBiRW5hYmxlZCkgeworICBtX2JFbmFibGVOb3RpZnkgPSBiRW5hYmxlZDsKIH0KIAotdm9pZCBDUFdMX05vdGU6OkVuYWJsZU5vdGlmeShGWF9CT09MIGJFbmFibGVkKQotewotCW1fYkVuYWxibGVOb3RpZnkgPSBiRW5hYmxlZDsKK3ZvaWQgQ1BXTF9Ob3RlOjpSZVBvc0NoaWxkV25kKCkgeworICBSZVBvc05vdGVDaGlsZHJlbigpOworICBtX3BDb250ZW50cy0+T25Ob3RpZnkodGhpcywgUE5NX05PVEVSRVNFVCwgMCwgMCk7CisgIFJlc2V0U2Nyb2xsQmFyKCk7CisgIG1fcENvbnRlbnRzLT5Pbk5vdGlmeSh0aGlzLCBQTk1fTk9URVJFU0VULCAwLCAwKTsKKyAgT25Ob3RpZnkodGhpcywgUE5NX05PVEVFRElUQ0hBTkdFRCwgMCwgMCk7CisgIGlmIChjb25zdCBDUFdMX1duZCogcFduZCA9IEdldEZvY3VzZWQoKSkgeworICAgIGlmIChwV25kLT5HZXRDbGFzc05hbWUoKSA9PSAiQ1BXTF9FZGl0IikgeworICAgICAgQ1BXTF9FZGl0KiBwRWRpdCA9IChDUFdMX0VkaXQqKXBXbmQ7CisgICAgICBwRWRpdC0+U2V0Q2FyZXQocEVkaXQtPkdldENhcmV0KCkpOworICAgIH0KKyAgfQogfQogCi12b2lkIENQV0xfTm90ZTo6UmVQb3NDaGlsZFduZCgpCi17Ci0JUmVQb3NOb3RlQ2hpbGRyZW4oKTsKLQltX3BDb250ZW50cy0+T25Ob3RpZnkodGhpcywgUE5NX05PVEVSRVNFVCwgMCwgMCk7Ci0JUmVzZXRTY3JvbGxCYXIoKTsKLQltX3BDb250ZW50cy0+T25Ob3RpZnkodGhpcywgUE5NX05PVEVSRVNFVCwgMCwgMCk7Ci0JdGhpcy0+T25Ob3RpZnkodGhpcywgUE5NX05PVEVFRElUQ0hBTkdFRCwgMCwgMCk7Ci0JLy/NrLK9Ci0JaWYgKGNvbnN0IENQV0xfV25kKiBwV25kID0gdGhpcy0+R2V0Rm9jdXNlZCgpKQotCXsKLQkJaWYgKHBXbmQtPkdldENsYXNzTmFtZSgpID09ICJDUFdMX0VkaXQiKQotCQl7Ci0JCQlDUFdMX0VkaXQqIHBFZGl0ID0gKENQV0xfRWRpdCopcFduZDsKLQkJCXBFZGl0LT5TZXRDYXJldChwRWRpdC0+R2V0Q2FyZXQoKSk7Ci0JCX0KLQl9Ci0JLy9DUERGX1BvaW50IHB0TmV3ID0gbV9wQ29udGVudHMtPkdldFNjcm9sbFBvcygpOwotCS8vbV9wQ29udGVudHNCYXItPk9uTm90aWZ5KHRoaXMsIFBOTV9TRVRTQ1JPTExQT1MsIFNCVF9WU0NST0xMLCAoRlhfSU5UUFRSKSZwdE5ldy55KTsKLX0KK0ZYX0JPT0wgQ1BXTF9Ob3RlOjpSZXNldFNjcm9sbEJhcigpIHsKKyAgRlhfQk9PTCBiU2Nyb2xsQ2hhbmdlZCA9IEZBTFNFOwogCi1GWF9CT09MIENQV0xfTm90ZTo6UmVzZXRTY3JvbGxCYXIoKQotewotCUZYX0JPT0wgYlNjcm9sbENoYW5nZWQgPSBGQUxTRTsKLQotCWlmIChTY3JvbGxCYXJTaG91bGRWaXNpYmxlKCkpCi0JewotCQlpZiAoIW1fcENvbnRlbnRzQmFyLT5Jc1Zpc2libGUoKSkKLQkJewotCQkJbV9wQ29udGVudHNCYXItPlNldFZpc2libGUoVFJVRSk7Ci0JCQlpZiAobV9wQ29udGVudHNCYXItPklzVmlzaWJsZSgpKQotCQkJewotCQkJCW1fcENvbnRlbnRzQmFyLT5JbnZhbGlkYXRlUmVjdChOVUxMKTsKLQkJCQliU2Nyb2xsQ2hhbmdlZCA9IFRSVUU7Ci0JCQl9Ci0JCX0JCi0JfQotCWVsc2UKLQl7Ci0JCWlmIChtX3BDb250ZW50c0Jhci0+SXNWaXNpYmxlKCkpCi0JCXsKLQkJCW1fcENvbnRlbnRzQmFyLT5TZXRWaXNpYmxlKEZBTFNFKTsKLQkJCW1fcENvbnRlbnRzQmFyLT5JbnZhbGlkYXRlUmVjdChOVUxMKTsKKyAgaWYgKFNjcm9sbEJhclNob3VsZFZpc2libGUoKSkgeworICAgIGlmICghbV9wQ29udGVudHNCYXItPklzVmlzaWJsZSgpKSB7CisgICAgICBtX3BDb250ZW50c0Jhci0+U2V0VmlzaWJsZShUUlVFKTsKKyAgICAgIGlmIChtX3BDb250ZW50c0Jhci0+SXNWaXNpYmxlKCkpIHsKKyAgICAgICAgbV9wQ29udGVudHNCYXItPkludmFsaWRhdGVSZWN0KE5VTEwpOworICAgICAgICBiU2Nyb2xsQ2hhbmdlZCA9IFRSVUU7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChtX3BDb250ZW50c0Jhci0+SXNWaXNpYmxlKCkpIHsKKyAgICAgIG1fcENvbnRlbnRzQmFyLT5TZXRWaXNpYmxlKEZBTFNFKTsKKyAgICAgIG1fcENvbnRlbnRzQmFyLT5JbnZhbGlkYXRlUmVjdChOVUxMKTsKIAotCQkJYlNjcm9sbENoYW5nZWQgPSBUUlVFOwotCQl9Ci0JfQorICAgICAgYlNjcm9sbENoYW5nZWQgPSBUUlVFOworICAgIH0KKyAgfQogCi0JaWYgKGJTY3JvbGxDaGFuZ2VkKQotCXsKLQkJQ1BERl9SZWN0IHJjTm90ZSA9IHRoaXMtPkdldENsaWVudFJlY3QoKTsKLQkJQ1BERl9SZWN0IHJjQ29udGVudHMgPSBtX3BDb250ZW50cy0+R2V0V2luZG93UmVjdCgpOwotCQlyY0NvbnRlbnRzLnJpZ2h0ID0gcmNOb3RlLnJpZ2h0IC0gMy4wZjsKLQkJaWYgKG1fcENvbnRlbnRzQmFyLT5Jc1Zpc2libGUoKSkKLQkJCXJjQ29udGVudHMucmlnaHQgLT0gUFdMX1NDUk9MTEJBUl9XSURUSDsKLQkJbV9wQ29udGVudHMtPk1vdmUocmNDb250ZW50cywgVFJVRSwgVFJVRSk7Ci0JCW1fcENvbnRlbnRzLT5TZXRTY3JvbGxQb3MoQ1BERl9Qb2ludCgwLjBmLDAuMGYpKTsKLQkJbV9wQ29udGVudHMtPkludmFsaWRhdGVSZWN0KE5VTEwpOwotCX0KKyAgaWYgKGJTY3JvbGxDaGFuZ2VkKSB7CisgICAgQ1BERl9SZWN0IHJjTm90ZSA9IEdldENsaWVudFJlY3QoKTsKKyAgICBDUERGX1JlY3QgcmNDb250ZW50cyA9IG1fcENvbnRlbnRzLT5HZXRXaW5kb3dSZWN0KCk7CisgICAgcmNDb250ZW50cy5yaWdodCA9IHJjTm90ZS5yaWdodCAtIDMuMGY7CisgICAgaWYgKG1fcENvbnRlbnRzQmFyLT5Jc1Zpc2libGUoKSkKKyAgICAgIHJjQ29udGVudHMucmlnaHQgLT0gUFdMX1NDUk9MTEJBUl9XSURUSDsKKyAgICBtX3BDb250ZW50cy0+TW92ZShyY0NvbnRlbnRzLCBUUlVFLCBUUlVFKTsKKyAgICBtX3BDb250ZW50cy0+U2V0U2Nyb2xsUG9zKENQREZfUG9pbnQoMC4wZiwgMC4wZikpOworICAgIG1fcENvbnRlbnRzLT5JbnZhbGlkYXRlUmVjdChOVUxMKTsKKyAgfQogCi0JcmV0dXJuIGJTY3JvbGxDaGFuZ2VkOworICByZXR1cm4gYlNjcm9sbENoYW5nZWQ7CiB9CiAKLUZYX0JPT0wgQ1BXTF9Ob3RlOjpTY3JvbGxCYXJTaG91bGRWaXNpYmxlKCkKLXsKLQlDUERGX1JlY3QgcmNDb250ZW50c0ZhY3QgPSBtX3BDb250ZW50cy0+R2V0U2Nyb2xsQXJlYSgpOwotCUNQREZfUmVjdCByY0NvbnRlbnRzQ2xpZW50ID0gbV9wQ29udGVudHMtPkdldENsaWVudFJlY3QoKTsKK0ZYX0JPT0wgQ1BXTF9Ob3RlOjpTY3JvbGxCYXJTaG91bGRWaXNpYmxlKCkgeworICBDUERGX1JlY3QgcmNDb250ZW50c0ZhY3QgPSBtX3BDb250ZW50cy0+R2V0U2Nyb2xsQXJlYSgpOworICBDUERGX1JlY3QgcmNDb250ZW50c0NsaWVudCA9IG1fcENvbnRlbnRzLT5HZXRDbGllbnRSZWN0KCk7CiAKLQlyZXR1cm4gcmNDb250ZW50c0ZhY3QuSGVpZ2h0KCkgPiByY0NvbnRlbnRzQ2xpZW50LkhlaWdodCgpOwkKKyAgcmV0dXJuIHJjQ29udGVudHNGYWN0LkhlaWdodCgpID4gcmNDb250ZW50c0NsaWVudC5IZWlnaHQoKTsKIH0KIAotdm9pZCBDUFdMX05vdGU6OlNldE9wdGlvbnNUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGV4dCkKLXsKLQlpZiAobV9wT3B0aW9ucykKLQkJbV9wT3B0aW9ucy0+U2V0VGV4dChzVGV4dCk7Cit2b2lkIENQV0xfTm90ZTo6U2V0T3B0aW9uc1RleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNUZXh0KSB7CisgIGlmIChtX3BPcHRpb25zKQorICAgIG1fcE9wdGlvbnMtPlNldFRleHQoc1RleHQpOwogCi0JUmVQb3NOb3RlQ2hpbGRyZW4oKTsKKyAgUmVQb3NOb3RlQ2hpbGRyZW4oKTsKIH0KIAotdm9pZCBDUFdMX05vdGU6OlJlUG9zTm90ZUNoaWxkcmVuKCkKLXsKLQlpZiAobV9iUmVzaXppbmcpIHJldHVybjsKK3ZvaWQgQ1BXTF9Ob3RlOjpSZVBvc05vdGVDaGlsZHJlbigpIHsKKyAgaWYgKG1fYlJlc2l6aW5nKQorICAgIHJldHVybjsKIAotCW1fYlJlc2l6aW5nID0gVFJVRTsKKyAgbV9iUmVzaXppbmcgPSBUUlVFOwogCi0JaWYgKHRoaXMtPklzVmFsaWQoKSkKLQl7Ci0JCUFTU0VSVChtX3BTdWJqZWN0ICE9IE5VTEwpOwotCQlBU1NFUlQobV9wRGF0ZVRpbWUgIT0gTlVMTCk7Ci0JCUFTU0VSVChtX3BDb250ZW50cyAhPSBOVUxMKTsKLQkJQVNTRVJUKG1fcEF1dGhvciAhPSBOVUxMKTsKLQkJQVNTRVJUKG1fcENsb3NlQm94ICE9IE5VTEwpOwotCQlBU1NFUlQobV9wSWNvbiAhPSBOVUxMKTsKLQkJQVNTRVJUKG1fcExCQm94ICE9IE5VTEwpOwotCQlBU1NFUlQobV9wUkJCb3ggIT0gTlVMTCk7Ci0JCUFTU0VSVChtX3BDb250ZW50c0JhciAhPSBOVUxMKTsKLQkJQVNTRVJUKG1fcE9wdGlvbnMgIT0gTlVMTCk7CisgIGlmIChJc1ZhbGlkKCkpIHsKKyAgICBDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CiAKLQkJQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworICAgIENQREZfUmVjdCByY0ljb24gPSByY0NsaWVudDsKKyAgICByY0ljb24udG9wIC09IDIuMGY7CisgICAgcmNJY29uLnJpZ2h0ID0gcmNJY29uLmxlZnQgKyAxNC4wZjsKKyAgICByY0ljb24uYm90dG9tID0gcmNJY29uLnRvcCAtIDE0LjBmOworICAgIHJjSWNvbi5Ob3JtYWxpemUoKTsKKyAgICBtX3BJY29uLT5Nb3ZlKHJjSWNvbiwgVFJVRSwgRkFMU0UpOworICAgIG1fcEljb24tPlNldFZpc2libGUoQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KHJjQ2xpZW50LCByY0ljb24pKTsKIAotCQlDUERGX1JlY3QgcmNJY29uID0gcmNDbGllbnQ7Ci0JCXJjSWNvbi50b3AgLT0gMi4wZjsKLQkJcmNJY29uLnJpZ2h0ID0gcmNJY29uLmxlZnQgKyAxNC4wZjsKLQkJcmNJY29uLmJvdHRvbSA9IHJjSWNvbi50b3AgLSAxNC4wZjsKLQkJcmNJY29uLk5vcm1hbGl6ZSgpOwotCQltX3BJY29uLT5Nb3ZlKHJjSWNvbiwgVFJVRSwgRkFMU0UpOwotCQltX3BJY29uLT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNJY29uKSk7CisgICAgQ1BERl9SZWN0IHJjQ2xvc2VCb3ggPSByY0NsaWVudDsKKyAgICByY0Nsb3NlQm94LnJpZ2h0IC09IDEuMGY7CisgICAgcmNDbG9zZUJveC50b3AgLT0gMS4wZjsKKyAgICByY0Nsb3NlQm94LmxlZnQgPSByY0Nsb3NlQm94LnJpZ2h0IC0gMTQuMGY7CisgICAgcmNDbG9zZUJveC5ib3R0b20gPSByY0Nsb3NlQm94LnRvcCAtIDE0LjBmOworICAgIHJjQ2xvc2VCb3guTm9ybWFsaXplKCk7CisgICAgbV9wQ2xvc2VCb3gtPk1vdmUocmNDbG9zZUJveCwgVFJVRSwgRkFMU0UpOworICAgIG1fcENsb3NlQm94LT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNDbG9zZUJveCkpOwogCi0JCUNQREZfUmVjdCByY0Nsb3NlQm94ID0gcmNDbGllbnQ7Ci0JCXJjQ2xvc2VCb3gucmlnaHQgLT0gMS4wZjsKLQkJcmNDbG9zZUJveC50b3AgLT0gMS4wZjsKLQkJcmNDbG9zZUJveC5sZWZ0ID0gcmNDbG9zZUJveC5yaWdodCAtIDE0LjBmOwotCQlyY0Nsb3NlQm94LmJvdHRvbSA9IHJjQ2xvc2VCb3gudG9wIC0gMTQuMGY7Ci0JCXJjQ2xvc2VCb3guTm9ybWFsaXplKCk7Ci0JCW1fcENsb3NlQm94LT5Nb3ZlKHJjQ2xvc2VCb3gsIFRSVUUsIEZBTFNFKTsKLQkJbV9wQ2xvc2VCb3gtPlNldFZpc2libGUoQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KHJjQ2xpZW50LCByY0Nsb3NlQm94KSk7CisgICAgQ1BERl9SZWN0IHJjRGF0ZSA9IHJjQ2xpZW50OworICAgIHJjRGF0ZS5yaWdodCA9IHJjQ2xvc2VCb3gubGVmdCAtIFBPUFVQX0lURU1fVEVYVF9JTkRFTlQ7CisgICAgcmNEYXRlLmxlZnQgPQorICAgICAgICBQV0xfTUFYKHJjRGF0ZS5yaWdodCAtIG1fcERhdGVUaW1lLT5HZXRDb250ZW50UmVjdCgpLldpZHRoKCkgLSAxLjBmLAorICAgICAgICAgICAgICAgIHJjSWNvbi5yaWdodCArIDEuMGYpOworICAgIHJjRGF0ZS50b3AgPSByY0NsaWVudC50b3AgLSAyLjBmOworICAgIHJjRGF0ZS5ib3R0b20gPSByY0RhdGUudG9wIC0gbV9wRGF0ZVRpbWUtPkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7CisgICAgcmNEYXRlLk5vcm1hbGl6ZSgpOworICAgIG1fcERhdGVUaW1lLT5Nb3ZlKHJjRGF0ZSwgVFJVRSwgRkFMU0UpOworICAgIG1fcERhdGVUaW1lLT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNEYXRlKSk7CiAKLQkJQ1BERl9SZWN0IHJjRGF0ZSA9IHJjQ2xpZW50OwotCQlyY0RhdGUucmlnaHQgPSByY0Nsb3NlQm94LmxlZnQgLSBQT1BVUF9JVEVNX1RFWFRfSU5ERU5UOwotCQlyY0RhdGUubGVmdCA9IFBXTF9NQVgocmNEYXRlLnJpZ2h0IC0gbV9wRGF0ZVRpbWUtPkdldENvbnRlbnRSZWN0KCkuV2lkdGgoKSAtIDEuMGYsIHJjSWNvbi5yaWdodCArIDEuMGYpOwotCQlyY0RhdGUudG9wID0gcmNDbGllbnQudG9wIC0gMi4wZjsKLQkJcmNEYXRlLmJvdHRvbSA9IHJjRGF0ZS50b3AgLSBtX3BEYXRlVGltZS0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKLQkJcmNEYXRlLk5vcm1hbGl6ZSgpOwotCQltX3BEYXRlVGltZS0+TW92ZShyY0RhdGUsIFRSVUUsIEZBTFNFKTsKLQkJbV9wRGF0ZVRpbWUtPlNldFZpc2libGUoQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KHJjQ2xpZW50LCByY0RhdGUpKTsKKyAgICBDUERGX1JlY3QgcmNTdWJqZWN0ID0gcmNDbGllbnQ7CisgICAgcmNTdWJqZWN0LnRvcCA9IHJjQ2xpZW50LnRvcCAtIDIuMGY7CisgICAgcmNTdWJqZWN0LmxlZnQgPSByY0ljb24ucmlnaHQgKyBQT1BVUF9JVEVNX1RFWFRfSU5ERU5UOworICAgIHJjU3ViamVjdC5yaWdodCA9CisgICAgICAgIFBXTF9NSU4ocmNTdWJqZWN0LmxlZnQgKyBtX3BTdWJqZWN0LT5HZXRDb250ZW50UmVjdCgpLldpZHRoKCkgKyAxLjBmLAorICAgICAgICAgICAgICAgIHJjRGF0ZS5sZWZ0IC0gMS4wZik7CisgICAgcmNTdWJqZWN0LmJvdHRvbSA9IHJjU3ViamVjdC50b3AgLSBtX3BTdWJqZWN0LT5HZXRDb250ZW50UmVjdCgpLkhlaWdodCgpOworICAgIHJjU3ViamVjdC5Ob3JtYWxpemUoKTsKKyAgICBtX3BTdWJqZWN0LT5Nb3ZlKHJjU3ViamVjdCwgVFJVRSwgRkFMU0UpOworICAgIG1fcFN1YmplY3QtPlNldFZpc2libGUoQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KHJjQ2xpZW50LCByY1N1YmplY3QpKTsKIAotCQlDUERGX1JlY3QgcmNTdWJqZWN0ID0gcmNDbGllbnQ7Ci0JCXJjU3ViamVjdC50b3AgPSByY0NsaWVudC50b3AgLSAyLjBmOwotCQlyY1N1YmplY3QubGVmdCA9IHJjSWNvbi5yaWdodCArIFBPUFVQX0lURU1fVEVYVF9JTkRFTlQ7Ci0JCXJjU3ViamVjdC5yaWdodCA9IFBXTF9NSU4ocmNTdWJqZWN0LmxlZnQgKyBtX3BTdWJqZWN0LT5HZXRDb250ZW50UmVjdCgpLldpZHRoKCkgKyAxLjBmLCByY0RhdGUubGVmdCAtIDEuMGYpOwotCQlyY1N1YmplY3QuYm90dG9tID0gcmNTdWJqZWN0LnRvcCAtIG1fcFN1YmplY3QtPkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7Ci0JCXJjU3ViamVjdC5Ob3JtYWxpemUoKTsKLQkJbV9wU3ViamVjdC0+TW92ZShyY1N1YmplY3QsIFRSVUUsIEZBTFNFKTsJCi0JCW1fcFN1YmplY3QtPlNldFZpc2libGUoQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KHJjQ2xpZW50LCByY1N1YmplY3QpKTsKLQotCQlDUERGX1JlY3QgcmNPcHRpb25zID0gcmNDbGllbnQ7Ci0JCXJjT3B0aW9ucy5sZWZ0ID0gUFdMX01BWChyY09wdGlvbnMucmlnaHQgLSBtX3BPcHRpb25zLT5HZXRDb250ZW50UmVjdCgpLldpZHRoKCksIHJjSWNvbi5yaWdodCArIDEuMGYpOwotCQlyY09wdGlvbnMudG9wID0gcmNTdWJqZWN0LmJvdHRvbSAtIDQuMGY7Ci0JCXJjT3B0aW9ucy5ib3R0b20gPSByY09wdGlvbnMudG9wIC0gbV9wT3B0aW9ucy0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKLQkJcmNPcHRpb25zLk5vcm1hbGl6ZSgpOwotCQltX3BPcHRpb25zLT5Nb3ZlKHJjT3B0aW9ucywgVFJVRSwgRkFMU0UpOwotCQltX3BPcHRpb25zLT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNPcHRpb25zKSk7Ci0KLQkJQ1BERl9SZWN0IHJjQXV0aG9yID0gcmNDbGllbnQ7Ci0JCXJjQXV0aG9yLnRvcCA9IHJjU3ViamVjdC5ib3R0b20gLSA0LjBmOwotCQlyY0F1dGhvci5sZWZ0ID0gcmNTdWJqZWN0LmxlZnQ7Ci0JCXJjQXV0aG9yLnJpZ2h0ID0gUFdMX01JTihyY1N1YmplY3QubGVmdCArIG1fcEF1dGhvci0+R2V0Q29udGVudFJlY3QoKS5XaWR0aCgpICsgMS4wZiwgcmNPcHRpb25zLmxlZnQgLSAxLjBmKTsKLQkJcmNBdXRob3IuYm90dG9tID0gcmNBdXRob3IudG9wIC0gbV9wQXV0aG9yLT5HZXRDb250ZW50UmVjdCgpLkhlaWdodCgpOwotCQlyY0F1dGhvci5Ob3JtYWxpemUoKTsKLQkJbV9wQXV0aG9yLT5Nb3ZlKHJjQXV0aG9yLCBUUlVFLCBGQUxTRSk7Ci0JCW1fcEF1dGhvci0+U2V0VmlzaWJsZShDUFdMX1V0aWxzOjpDb250YWluc1JlY3QocmNDbGllbnQsIHJjQXV0aG9yKSk7Ci0KLQkJQ1BERl9SZWN0IHJjTEJCb3ggPSByY0NsaWVudDsKLQkJcmNMQkJveC50b3AgPSByY0xCQm94LmJvdHRvbSArIDcuMGY7Ci0JCXJjTEJCb3gucmlnaHQgPSByY0xCQm94LmxlZnQgKyA3LjBmOwotCQlyY0xCQm94Lk5vcm1hbGl6ZSgpOwotCQltX3BMQkJveC0+TW92ZShyY0xCQm94LCBUUlVFLCBGQUxTRSk7Ci0JCW1fcExCQm94LT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNMQkJveCkpOwotCi0JCUNQREZfUmVjdCByY1JCQm94ID0gcmNDbGllbnQ7Ci0JCXJjUkJCb3gudG9wID0gcmNSQkJveC5ib3R0b20gKyA3LjBmOwotCQlyY1JCQm94LmxlZnQgPSByY1JCQm94LnJpZ2h0IC0gNy4wZjsKLQkJcmNSQkJveC5Ob3JtYWxpemUoKTsKLQkJbV9wUkJCb3gtPk1vdmUocmNSQkJveCwgVFJVRSwgRkFMU0UpOwotCQltX3BSQkJveC0+U2V0VmlzaWJsZShDUFdMX1V0aWxzOjpDb250YWluc1JlY3QocmNDbGllbnQsIHJjUkJCb3gpKTsKLQotCQlDUERGX1JlY3QgcmNDb250ZW50cyA9IHJjQ2xpZW50OwotCQlyY0NvbnRlbnRzLnRvcCA9IHJjQXV0aG9yLmJvdHRvbSAtIFBPUFVQX0lURU1fSEVBRF9CT1RUT007Ci0JCXJjQ29udGVudHMubGVmdCArPSAzLjBmOwotCQlyY0NvbnRlbnRzLnJpZ2h0IC09IDMuMGY7Ci0JCWlmIChtX3BDb250ZW50c0Jhci0+SXNWaXNpYmxlKCkpCi0JCQlyY0NvbnRlbnRzLnJpZ2h0IC09IFBXTF9TQ1JPTExCQVJfV0lEVEg7Ci0JCXJjQ29udGVudHMuYm90dG9tICs9IDE0LjBmOwotCQlyY0NvbnRlbnRzLk5vcm1hbGl6ZSgpOwotCQltX3BDb250ZW50cy0+TW92ZShyY0NvbnRlbnRzLCBGQUxTRSwgRkFMU0UpOwotCQltX3BDb250ZW50cy0+U2V0VmlzaWJsZShDUFdMX1V0aWxzOjpDb250YWluc1JlY3QocmNDbGllbnQsIHJjQ29udGVudHMpKTsKLQotCQlDUERGX1JlY3QgcmNDb250ZW50c0JhciA9IHJjQ29udGVudHM7Ci0JCXJjQ29udGVudHNCYXIucmlnaHQgPSByY0NsaWVudC5yaWdodCAtIDMuMGY7Ci0JCXJjQ29udGVudHNCYXIubGVmdCA9IHJjQ29udGVudHNCYXIucmlnaHQgLSBQV0xfU0NST0xMQkFSX1dJRFRIOwotCQlyY0NvbnRlbnRzQmFyLk5vcm1hbGl6ZSgpOwotCQltX3BDb250ZW50c0Jhci0+TW92ZShyY0NvbnRlbnRzQmFyLCBUUlVFLCBGQUxTRSk7Ci0JCQotCQltX3JjQ2FwdGlvbiA9IHJjQ2xpZW50OwotCQltX3JjQ2FwdGlvbi5ib3R0b20gPSByY0NvbnRlbnRzLnRvcDsKLQl9Ci0KLQltX2JSZXNpemluZyA9IEZBTFNFOwotfQotCi0vLzAtbm9ybWFsIC8gMS1jYXB0aW9uIC8gMi1sZWZ0Ym90dG9tIGNvcm5lciAvIDMtcmlnaHRib3R0b20gY29ybmVyIC8gNC1jbG9zZSAvIDUtb3B0aW9ucyAKLUZYX0lOVDMyIENQV0xfTm90ZTo6Tm90ZUhpdFRlc3QoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0Ci17Ci0JQVNTRVJUKG1fcFN1YmplY3QgIT0gTlVMTCk7Ci0JQVNTRVJUKG1fcERhdGVUaW1lICE9IE5VTEwpOwotCUFTU0VSVChtX3BDb250ZW50cyAhPSBOVUxMKTsKLQlBU1NFUlQobV9wQXV0aG9yICE9IE5VTEwpOwotCUFTU0VSVChtX3BJY29uICE9IE5VTEwpOwotCUFTU0VSVChtX3BDb250ZW50c0JhciAhPSBOVUxMKTsKKyAgICBDUERGX1JlY3QgcmNPcHRpb25zID0gcmNDbGllbnQ7CisgICAgcmNPcHRpb25zLmxlZnQgPQorICAgICAgICBQV0xfTUFYKHJjT3B0aW9ucy5yaWdodCAtIG1fcE9wdGlvbnMtPkdldENvbnRlbnRSZWN0KCkuV2lkdGgoKSwKKyAgICAgICAgICAgICAgICByY0ljb24ucmlnaHQgKyAxLjBmKTsKKyAgICByY09wdGlvbnMudG9wID0gcmNTdWJqZWN0LmJvdHRvbSAtIDQuMGY7CisgICAgcmNPcHRpb25zLmJvdHRvbSA9IHJjT3B0aW9ucy50b3AgLSBtX3BPcHRpb25zLT5HZXRDb250ZW50UmVjdCgpLkhlaWdodCgpOworICAgIHJjT3B0aW9ucy5Ob3JtYWxpemUoKTsKKyAgICBtX3BPcHRpb25zLT5Nb3ZlKHJjT3B0aW9ucywgVFJVRSwgRkFMU0UpOworICAgIG1fcE9wdGlvbnMtPlNldFZpc2libGUoQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KHJjQ2xpZW50LCByY09wdGlvbnMpKTsKIAotCUFTU0VSVChtX3BDbG9zZUJveCAhPSBOVUxMKTsKLQlBU1NFUlQobV9wTEJCb3ggIT0gTlVMTCk7Ci0JQVNTRVJUKG1fcFJCQm94ICE9IE5VTEwpOwotCUFTU0VSVChtX3BPcHRpb25zICE9IE5VTEwpOworICAgIENQREZfUmVjdCByY0F1dGhvciA9IHJjQ2xpZW50OworICAgIHJjQXV0aG9yLnRvcCA9IHJjU3ViamVjdC5ib3R0b20gLSA0LjBmOworICAgIHJjQXV0aG9yLmxlZnQgPSByY1N1YmplY3QubGVmdDsKKyAgICByY0F1dGhvci5yaWdodCA9CisgICAgICAgIFBXTF9NSU4ocmNTdWJqZWN0LmxlZnQgKyBtX3BBdXRob3ItPkdldENvbnRlbnRSZWN0KCkuV2lkdGgoKSArIDEuMGYsCisgICAgICAgICAgICAgICAgcmNPcHRpb25zLmxlZnQgLSAxLjBmKTsKKyAgICByY0F1dGhvci5ib3R0b20gPSByY0F1dGhvci50b3AgLSBtX3BBdXRob3ItPkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7CisgICAgcmNBdXRob3IuTm9ybWFsaXplKCk7CisgICAgbV9wQXV0aG9yLT5Nb3ZlKHJjQXV0aG9yLCBUUlVFLCBGQUxTRSk7CisgICAgbV9wQXV0aG9yLT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNBdXRob3IpKTsKIAotCUdldENsaWVudFJlY3QoKTsKKyAgICBDUERGX1JlY3QgcmNMQkJveCA9IHJjQ2xpZW50OworICAgIHJjTEJCb3gudG9wID0gcmNMQkJveC5ib3R0b20gKyA3LjBmOworICAgIHJjTEJCb3gucmlnaHQgPSByY0xCQm94LmxlZnQgKyA3LjBmOworICAgIHJjTEJCb3guTm9ybWFsaXplKCk7CisgICAgbV9wTEJCb3gtPk1vdmUocmNMQkJveCwgVFJVRSwgRkFMU0UpOworICAgIG1fcExCQm94LT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNMQkJveCkpOwogCi0JaWYgKG1fcFN1YmplY3QtPlduZEhpdFRlc3QobV9wU3ViamVjdC0+UGFyZW50VG9DaGlsZChwb2ludCkpKSByZXR1cm4gMTsKLQlpZiAobV9wRGF0ZVRpbWUtPlduZEhpdFRlc3QobV9wRGF0ZVRpbWUtPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkgcmV0dXJuIDE7Ci0JaWYgKG1fcEF1dGhvci0+V25kSGl0VGVzdChtX3BBdXRob3ItPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkgcmV0dXJuIDE7Ci0JaWYgKG1fcEljb24tPlduZEhpdFRlc3QobV9wSWNvbi0+UGFyZW50VG9DaGlsZChwb2ludCkpKSByZXR1cm4gMTsKKyAgICBDUERGX1JlY3QgcmNSQkJveCA9IHJjQ2xpZW50OworICAgIHJjUkJCb3gudG9wID0gcmNSQkJveC5ib3R0b20gKyA3LjBmOworICAgIHJjUkJCb3gubGVmdCA9IHJjUkJCb3gucmlnaHQgLSA3LjBmOworICAgIHJjUkJCb3guTm9ybWFsaXplKCk7CisgICAgbV9wUkJCb3gtPk1vdmUocmNSQkJveCwgVFJVRSwgRkFMU0UpOworICAgIG1fcFJCQm94LT5TZXRWaXNpYmxlKENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChyY0NsaWVudCwgcmNSQkJveCkpOwogCi0JaWYgKG1fcENvbnRlbnRzLT5XbmRIaXRUZXN0KG1fcENvbnRlbnRzLT5QYXJlbnRUb0NoaWxkKHBvaW50KSkpIHJldHVybiAwOwotCWlmIChtX3BDb250ZW50c0Jhci0+V25kSGl0VGVzdChtX3BDb250ZW50c0Jhci0+UGFyZW50VG9DaGlsZChwb2ludCkpKSByZXR1cm4gMDsKKyAgICBDUERGX1JlY3QgcmNDb250ZW50cyA9IHJjQ2xpZW50OworICAgIHJjQ29udGVudHMudG9wID0gcmNBdXRob3IuYm90dG9tIC0gUE9QVVBfSVRFTV9IRUFEX0JPVFRPTTsKKyAgICByY0NvbnRlbnRzLmxlZnQgKz0gMy4wZjsKKyAgICByY0NvbnRlbnRzLnJpZ2h0IC09IDMuMGY7CisgICAgaWYgKG1fcENvbnRlbnRzQmFyLT5Jc1Zpc2libGUoKSkKKyAgICAgIHJjQ29udGVudHMucmlnaHQgLT0gUFdMX1NDUk9MTEJBUl9XSURUSDsKKyAgICByY0NvbnRlbnRzLmJvdHRvbSArPSAxNC4wZjsKKyAgICByY0NvbnRlbnRzLk5vcm1hbGl6ZSgpOworICAgIG1fcENvbnRlbnRzLT5Nb3ZlKHJjQ29udGVudHMsIEZBTFNFLCBGQUxTRSk7CisgICAgbV9wQ29udGVudHMtPlNldFZpc2libGUoQ1BXTF9VdGlsczo6Q29udGFpbnNSZWN0KHJjQ2xpZW50LCByY0NvbnRlbnRzKSk7CiAKLQlpZiAobV9wQ2xvc2VCb3gtPlduZEhpdFRlc3QobV9wQ2xvc2VCb3gtPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkgcmV0dXJuIDQ7Ci0JaWYgKG1fcExCQm94LT5XbmRIaXRUZXN0KG1fcExCQm94LT5QYXJlbnRUb0NoaWxkKHBvaW50KSkpIHJldHVybiAyOwotCWlmIChtX3BSQkJveC0+V25kSGl0VGVzdChtX3BSQkJveC0+UGFyZW50VG9DaGlsZChwb2ludCkpKSByZXR1cm4gMzsKLQlpZiAobV9wT3B0aW9ucy0+V25kSGl0VGVzdChtX3BPcHRpb25zLT5QYXJlbnRUb0NoaWxkKHBvaW50KSkpIHJldHVybiA1OworICAgIENQREZfUmVjdCByY0NvbnRlbnRzQmFyID0gcmNDb250ZW50czsKKyAgICByY0NvbnRlbnRzQmFyLnJpZ2h0ID0gcmNDbGllbnQucmlnaHQgLSAzLjBmOworICAgIHJjQ29udGVudHNCYXIubGVmdCA9IHJjQ29udGVudHNCYXIucmlnaHQgLSBQV0xfU0NST0xMQkFSX1dJRFRIOworICAgIHJjQ29udGVudHNCYXIuTm9ybWFsaXplKCk7CisgICAgbV9wQ29udGVudHNCYXItPk1vdmUocmNDb250ZW50c0JhciwgVFJVRSwgRkFMU0UpOworICB9CiAKLQlyZXR1cm4gMTsKKyAgbV9iUmVzaXppbmcgPSBGQUxTRTsKIH0KIAotdm9pZCBDUFdMX05vdGU6OkNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKQotewotCUNQV0xfTm90ZUl0ZW06OkNyZWF0ZUNoaWxkV25kKGNwKTsKK3ZvaWQgQ1BXTF9Ob3RlOjpDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKSB7CisgIENQV0xfTm90ZUl0ZW06OkNyZWF0ZUNoaWxkV25kKGNwKTsKIAotCUNQV0xfQ29sb3Igc1RleHRDb2xvcjsKKyAgQ1BXTF9Db2xvciBzVGV4dENvbG9yOwogCi0JaWYgKENQV0xfVXRpbHM6OklzQmxhY2tPcldoaXRlKHRoaXMtPkdldEJhY2tncm91bmRDb2xvcigpKSkKLQkJc1RleHRDb2xvciA9IFBXTF9ERUZBVUxUX1dISVRFQ09MT1I7Ci0JZWxzZQotCQlzVGV4dENvbG9yID0gUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUjsKKyAgaWYgKENQV0xfVXRpbHM6OklzQmxhY2tPcldoaXRlKEdldEJhY2tncm91bmRDb2xvcigpKSkKKyAgICBzVGV4dENvbG9yID0gUFdMX0RFRkFVTFRfV0hJVEVDT0xPUjsKKyAgZWxzZQorICAgIHNUZXh0Q29sb3IgPSBQV0xfREVGQVVMVF9CTEFDS0NPTE9SOwogCi0JbV9wQXV0aG9yID0gbmV3IENQV0xfTGFiZWw7Ci0JUFdMX0NSRUFURVBBUkFNIGFjcCA9IGNwOwotCWFjcC5wUGFyZW50V25kID0gdGhpczsKLQlhY3AuZHdGbGFncyA9IFBXU19WSVNJQkxFIHwgUFdTX0NISUxEIHwgUEVTX0xFRlQgfCBQRVNfVE9QOwotCWFjcC5zVGV4dENvbG9yID0gc1RleHRDb2xvcjsKLQltX3BBdXRob3ItPkNyZWF0ZShhY3ApOwkgCisgIG1fcEF1dGhvciA9IG5ldyBDUFdMX0xhYmVsOworICBQV0xfQ1JFQVRFUEFSQU0gYWNwID0gY3A7CisgIGFjcC5wUGFyZW50V25kID0gdGhpczsKKyAgYWNwLmR3RmxhZ3MgPSBQV1NfVklTSUJMRSB8IFBXU19DSElMRCB8IFBFU19MRUZUIHwgUEVTX1RPUDsKKyAgYWNwLnNUZXh0Q29sb3IgPSBzVGV4dENvbG9yOworICBtX3BBdXRob3ItPkNyZWF0ZShhY3ApOwogCi0JbV9wQ2xvc2VCb3ggPSBuZXcgQ1BXTF9Ob3RlX0Nsb3NlQm94OwotCVBXTF9DUkVBVEVQQVJBTSBjY3AgPSBjcDsKLQljY3AucFBhcmVudFduZCA9IHRoaXM7Ci0JY2NwLmR3Qm9yZGVyV2lkdGggPSAyOwotCWNjcC5uQm9yZGVyU3R5bGUgPSBQQlNfQkVWRUxFRDsKLQljY3AuZHdGbGFncyA9IFBXU19WSVNJQkxFIHwgUFdTX0NISUxEIHwgUFdTX0JPUkRFUjsKLQljY3Auc1RleHRDb2xvciA9IHNUZXh0Q29sb3I7Ci0JbV9wQ2xvc2VCb3gtPkNyZWF0ZShjY3ApOworICBtX3BDbG9zZUJveCA9IG5ldyBDUFdMX05vdGVfQ2xvc2VCb3g7CisgIFBXTF9DUkVBVEVQQVJBTSBjY3AgPSBjcDsKKyAgY2NwLnBQYXJlbnRXbmQgPSB0aGlzOworICBjY3AuZHdCb3JkZXJXaWR0aCA9IDI7CisgIGNjcC5uQm9yZGVyU3R5bGUgPSBQQlNfQkVWRUxFRDsKKyAgY2NwLmR3RmxhZ3MgPSBQV1NfVklTSUJMRSB8IFBXU19DSElMRCB8IFBXU19CT1JERVI7CisgIGNjcC5zVGV4dENvbG9yID0gc1RleHRDb2xvcjsKKyAgbV9wQ2xvc2VCb3gtPkNyZWF0ZShjY3ApOwogCi0JbV9wSWNvbiA9IG5ldyBDUFdMX05vdGVfSWNvbjsKLQlQV0xfQ1JFQVRFUEFSQU0gaWNwID0gY3A7Ci0JaWNwLnBQYXJlbnRXbmQgPSB0aGlzOwotCWljcC5kd0ZsYWdzID0gUFdTX1ZJU0lCTEUgfCBQV1NfQ0hJTEQ7Ci0JbV9wSWNvbi0+Q3JlYXRlKGljcCk7CisgIG1fcEljb24gPSBuZXcgQ1BXTF9Ob3RlX0ljb247CisgIFBXTF9DUkVBVEVQQVJBTSBpY3AgPSBjcDsKKyAgaWNwLnBQYXJlbnRXbmQgPSB0aGlzOworICBpY3AuZHdGbGFncyA9IFBXU19WSVNJQkxFIHwgUFdTX0NISUxEOworICBtX3BJY29uLT5DcmVhdGUoaWNwKTsKIAotCW1fcE9wdGlvbnMgPSBuZXcgQ1BXTF9Ob3RlX09wdGlvbnM7Ci0JUFdMX0NSRUFURVBBUkFNIG9jcCA9IGNwOwotCW9jcC5wUGFyZW50V25kID0gdGhpczsKLQlvY3AuZHdGbGFncyA9IFBXU19DSElMRCB8IFBXU19WSVNJQkxFOwotCW9jcC5zVGV4dENvbG9yID0gc1RleHRDb2xvcjsKLQltX3BPcHRpb25zLT5DcmVhdGUob2NwKTsKKyAgbV9wT3B0aW9ucyA9IG5ldyBDUFdMX05vdGVfT3B0aW9uczsKKyAgUFdMX0NSRUFURVBBUkFNIG9jcCA9IGNwOworICBvY3AucFBhcmVudFduZCA9IHRoaXM7CisgIG9jcC5kd0ZsYWdzID0gUFdTX0NISUxEIHwgUFdTX1ZJU0lCTEU7CisgIG9jcC5zVGV4dENvbG9yID0gc1RleHRDb2xvcjsKKyAgbV9wT3B0aW9ucy0+Q3JlYXRlKG9jcCk7CiAKLQltX3BMQkJveCA9IG5ldyBDUFdMX05vdGVfTEJCb3g7Ci0JUFdMX0NSRUFURVBBUkFNIGxjcCA9IGNwOwotCWxjcC5wUGFyZW50V25kID0gdGhpczsKLQlsY3AuZHdGbGFncyA9IFBXU19WSVNJQkxFIHwgUFdTX0NISUxEOwotCWxjcC5lQ3Vyc29yVHlwZSA9IEZYQ1RfTkVTVzsKLQlsY3Auc1RleHRDb2xvciA9IHNUZXh0Q29sb3I7Ci0JbV9wTEJCb3gtPkNyZWF0ZShsY3ApOworICBtX3BMQkJveCA9IG5ldyBDUFdMX05vdGVfTEJCb3g7CisgIFBXTF9DUkVBVEVQQVJBTSBsY3AgPSBjcDsKKyAgbGNwLnBQYXJlbnRXbmQgPSB0aGlzOworICBsY3AuZHdGbGFncyA9IFBXU19WSVNJQkxFIHwgUFdTX0NISUxEOworICBsY3AuZUN1cnNvclR5cGUgPSBGWENUX05FU1c7CisgIGxjcC5zVGV4dENvbG9yID0gc1RleHRDb2xvcjsKKyAgbV9wTEJCb3gtPkNyZWF0ZShsY3ApOwogCi0JbV9wUkJCb3ggPSBuZXcgQ1BXTF9Ob3RlX1JCQm94OwotCVBXTF9DUkVBVEVQQVJBTSByY3AgPSBjcDsKLQlyY3AucFBhcmVudFduZCA9IHRoaXM7Ci0JcmNwLmR3RmxhZ3MgPSBQV1NfVklTSUJMRSB8IFBXU19DSElMRDsKLQlyY3AuZUN1cnNvclR5cGUgPSBGWENUX05XU0U7Ci0JcmNwLnNUZXh0Q29sb3IgPSBzVGV4dENvbG9yOwotCW1fcFJCQm94LT5DcmVhdGUocmNwKTsKKyAgbV9wUkJCb3ggPSBuZXcgQ1BXTF9Ob3RlX1JCQm94OworICBQV0xfQ1JFQVRFUEFSQU0gcmNwID0gY3A7CisgIHJjcC5wUGFyZW50V25kID0gdGhpczsKKyAgcmNwLmR3RmxhZ3MgPSBQV1NfVklTSUJMRSB8IFBXU19DSElMRDsKKyAgcmNwLmVDdXJzb3JUeXBlID0gRlhDVF9OV1NFOworICByY3Auc1RleHRDb2xvciA9IHNUZXh0Q29sb3I7CisgIG1fcFJCQm94LT5DcmVhdGUocmNwKTsKIAotCW1fcENvbnRlbnRzQmFyID0gbmV3IENQV0xfU2Nyb2xsQmFyKFNCVF9WU0NST0xMKTsKLQlQV0xfQ1JFQVRFUEFSQU0gc2NwID0gY3A7Ci0Jc2NwLnBQYXJlbnRXbmQgPSB0aGlzOwotCXNjcC5zQmFja2dyb3VuZENvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLCAyNDAvMjU1LjBmLCAyNDAvMjU1LjBmLCAyNDAvMjU1LjBmKTsKLQlzY3AuZHdGbGFncyA9IFBXU19DSElMRCB8IFBXU19WSVNJQkxFIHwgUFdTX0JBQ0tHUk9VTkQ7Ci0JbV9wQ29udGVudHNCYXItPkNyZWF0ZShzY3ApOwotCW1fcENvbnRlbnRzQmFyLT5TZXROb3RpZnlGb3JldmVyKFRSVUUpOworICBtX3BDb250ZW50c0JhciA9IG5ldyBDUFdMX1Njcm9sbEJhcihTQlRfVlNDUk9MTCk7CisgIFBXTF9DUkVBVEVQQVJBTSBzY3AgPSBjcDsKKyAgc2NwLnBQYXJlbnRXbmQgPSB0aGlzOworICBzY3Auc0JhY2tncm91bmRDb2xvciA9CisgICAgICBDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsIDI0MCAvIDI1NS4wZiwgMjQwIC8gMjU1LjBmLCAyNDAgLyAyNTUuMGYpOworICBzY3AuZHdGbGFncyA9IFBXU19DSElMRCB8IFBXU19WSVNJQkxFIHwgUFdTX0JBQ0tHUk9VTkQ7CisgIG1fcENvbnRlbnRzQmFyLT5DcmVhdGUoc2NwKTsKKyAgbV9wQ29udGVudHNCYXItPlNldE5vdGlmeUZvcmV2ZXIoVFJVRSk7CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlOjpTZXRTdWJqZWN0TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc05hbWUpCi17Ci0JQ1BXTF9Ob3RlSXRlbTo6U2V0U3ViamVjdE5hbWUoc05hbWUpOwotCVJlUG9zQ2hpbGRXbmQoKTsKK3ZvaWQgQ1BXTF9Ob3RlOjpTZXRTdWJqZWN0TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc05hbWUpIHsKKyAgQ1BXTF9Ob3RlSXRlbTo6U2V0U3ViamVjdE5hbWUoc05hbWUpOworICBSZVBvc0NoaWxkV25kKCk7CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlOjpTZXRBdXRob3JOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzTmFtZSkKLXsKLQlpZiAobV9wQXV0aG9yKQotCXsKLQkJbV9wQXV0aG9yLT5TZXRUZXh0KHNOYW1lLmNfc3RyKCkpOwotCQlSZVBvc0NoaWxkV25kKCk7Ci0JfQordm9pZCBDUFdMX05vdGU6OlNldEF1dGhvck5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNOYW1lKSB7CisgIGlmIChtX3BBdXRob3IpIHsKKyAgICBtX3BBdXRob3ItPlNldFRleHQoc05hbWUuY19zdHIoKSk7CisgICAgUmVQb3NDaGlsZFduZCgpOworICB9CiAKLQlpZiAoSVBXTF9Ob3RlTm90aWZ5KiBwTm90aWZ5ID0gR2V0Tm90ZU5vdGlmeSgpKQotCXsKLQkJcE5vdGlmeS0+T25TZXRBdXRob3JOYW1lKHRoaXMpOwotCX0KKyAgaWYgKElQV0xfTm90ZU5vdGlmeSogcE5vdGlmeSA9IEdldE5vdGVOb3RpZnkoKSkgeworICAgIHBOb3RpZnktPk9uU2V0QXV0aG9yTmFtZSh0aGlzKTsKKyAgfQogfQogCi1DRlhfV2lkZVN0cmluZyBDUFdMX05vdGU6OkdldEF1dGhvck5hbWUoKSBjb25zdAotewotCWlmIChtX3BBdXRob3IpCi0JCXJldHVybiBtX3BBdXRob3ItPkdldFRleHQoKTsKK0NGWF9XaWRlU3RyaW5nIENQV0xfTm90ZTo6R2V0QXV0aG9yTmFtZSgpIGNvbnN0IHsKKyAgaWYgKG1fcEF1dGhvcikKKyAgICByZXR1cm4gbV9wQXV0aG9yLT5HZXRUZXh0KCk7CiAKLQlyZXR1cm4gTCIiOworICByZXR1cm4gTCIiOwogfQogCi1GWF9CT09MIENQV0xfTm90ZTo6T25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwgY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKLXsKLQlDUERGX1BvaW50IHB0U2Nyb2xsID0gbV9wQ29udGVudHMtPkdldFNjcm9sbFBvcygpOwotCUNQREZfUmVjdCByY1Njcm9sbCA9IG1fcENvbnRlbnRzLT5HZXRTY3JvbGxBcmVhKCk7Ci0JQ1BERl9SZWN0IHJjQ29udGVudHMgPSBtX3BDb250ZW50cy0+R2V0Q2xpZW50UmVjdCgpOworRlhfQk9PTCBDUFdMX05vdGU6Ok9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBuRmxhZykgeworICBDUERGX1BvaW50IHB0U2Nyb2xsID0gbV9wQ29udGVudHMtPkdldFNjcm9sbFBvcygpOworICBDUERGX1JlY3QgcmNTY3JvbGwgPSBtX3BDb250ZW50cy0+R2V0U2Nyb2xsQXJlYSgpOworICBDUERGX1JlY3QgcmNDb250ZW50cyA9IG1fcENvbnRlbnRzLT5HZXRDbGllbnRSZWN0KCk7CiAKLQlpZiAocmNTY3JvbGwudG9wIC0gcmNTY3JvbGwuYm90dG9tID4gcmNDb250ZW50cy5IZWlnaHQoKSkKLQl7Ci0JCUNQREZfUG9pbnQgcHROZXcgPSBwdFNjcm9sbDsKKyAgaWYgKHJjU2Nyb2xsLnRvcCAtIHJjU2Nyb2xsLmJvdHRvbSA+IHJjQ29udGVudHMuSGVpZ2h0KCkpIHsKKyAgICBDUERGX1BvaW50IHB0TmV3ID0gcHRTY3JvbGw7CiAKLQkJaWYgKHpEZWx0YSA+IDApCi0JCQlwdE5ldy55ICs9IDMwOwotCQllbHNlCi0JCQlwdE5ldy55IC09IDMwOworICAgIGlmICh6RGVsdGEgPiAwKQorICAgICAgcHROZXcueSArPSAzMDsKKyAgICBlbHNlCisgICAgICBwdE5ldy55IC09IDMwOwogCi0JCWlmIChwdE5ldy55ID4gcmNTY3JvbGwudG9wKQotCQkJcHROZXcueSA9IHJjU2Nyb2xsLnRvcDsKLQkJaWYgKHB0TmV3LnkgPCByY1Njcm9sbC5ib3R0b20gKyByY0NvbnRlbnRzLkhlaWdodCgpKQotCQkJcHROZXcueSA9IHJjU2Nyb2xsLmJvdHRvbSArIHJjQ29udGVudHMuSGVpZ2h0KCk7Ci0JCWlmIChwdE5ldy55IDwgcmNTY3JvbGwuYm90dG9tKQotCQkJcHROZXcueSA9IHJjU2Nyb2xsLmJvdHRvbTsKKyAgICBpZiAocHROZXcueSA+IHJjU2Nyb2xsLnRvcCkKKyAgICAgIHB0TmV3LnkgPSByY1Njcm9sbC50b3A7CisgICAgaWYgKHB0TmV3LnkgPCByY1Njcm9sbC5ib3R0b20gKyByY0NvbnRlbnRzLkhlaWdodCgpKQorICAgICAgcHROZXcueSA9IHJjU2Nyb2xsLmJvdHRvbSArIHJjQ29udGVudHMuSGVpZ2h0KCk7CisgICAgaWYgKHB0TmV3LnkgPCByY1Njcm9sbC5ib3R0b20pCisgICAgICBwdE5ldy55ID0gcmNTY3JvbGwuYm90dG9tOwogCi0JCWlmIChwdE5ldy55ICE9IHB0U2Nyb2xsLnkpCi0JCXsKLQkJCW1fcENvbnRlbnRzLT5Pbk5vdGlmeSh0aGlzLCBQTk1fTk9URVJFU0VULCAwLCAwKTsKLQkJCW1fcENvbnRlbnRzLT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0NST0xMV0lORE9XLCBTQlRfVlNDUk9MTCwgKEZYX0lOVFBUUikmcHROZXcueSk7CQkJCi0JCQltX3BDb250ZW50c0Jhci0+T25Ob3RpZnkodGhpcywgUE5NX1NFVFNDUk9MTFBPUywgU0JUX1ZTQ1JPTEwsIChGWF9JTlRQVFIpJnB0TmV3LnkpOworICAgIGlmIChwdE5ldy55ICE9IHB0U2Nyb2xsLnkpIHsKKyAgICAgIG1fcENvbnRlbnRzLT5Pbk5vdGlmeSh0aGlzLCBQTk1fTk9URVJFU0VULCAwLCAwKTsKKyAgICAgIG1fcENvbnRlbnRzLT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0NST0xMV0lORE9XLCBTQlRfVlNDUk9MTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50cHRyX3QpJnB0TmV3LnkpOworICAgICAgbV9wQ29udGVudHNCYXItPk9uTm90aWZ5KHRoaXMsIFBOTV9TRVRTQ1JPTExQT1MsIFNCVF9WU0NST0xMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnRwdHJfdCkmcHROZXcueSk7CiAKLQkJCXJldHVybiBUUlVFOwotCQl9Ci0JfQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CiAKLQlyZXR1cm4gRkFMU0U7CisgIHJldHVybiBGQUxTRTsKIH0KIAotdm9pZCBDUFdMX05vdGU6Ok9uTm90aWZ5KENQV0xfV25kKiBwV25kLCBGWF9EV09SRCBtc2csIEZYX0lOVFBUUiB3UGFyYW0sIEZYX0lOVFBUUiBsUGFyYW0pCi17Ci0Jc3dpdGNoIChtc2cpCi0JewotCWNhc2UgUE5NX05PVEVFRElUQ0hBTkdFRDoKLQkJewotCQkJQ1BERl9SZWN0IHJjU2Nyb2xsID0gbV9wQ29udGVudHMtPkdldFNjcm9sbEFyZWEoKTsKLQkJCQordm9pZCBDUFdMX05vdGU6Ok9uTm90aWZ5KENQV0xfV25kKiBwV25kLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCB3UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbFBhcmFtKSB7CisgIHN3aXRjaCAobXNnKSB7CisgICAgY2FzZSBQTk1fTk9URUVESVRDSEFOR0VEOiB7CisgICAgICBDUERGX1JlY3QgcmNTY3JvbGwgPSBtX3BDb250ZW50cy0+R2V0U2Nyb2xsQXJlYSgpOworCisgICAgICBQV0xfU0NST0xMX0lORk8gc0luZm87CisgICAgICBzSW5mby5mQ29udGVudE1pbiA9IHJjU2Nyb2xsLmJvdHRvbTsKKyAgICAgIHNJbmZvLmZDb250ZW50TWF4ID0gcmNTY3JvbGwudG9wOworICAgICAgc0luZm8uZlBsYXRlV2lkdGggPSBtX3BDb250ZW50cy0+R2V0Q2xpZW50UmVjdCgpLkhlaWdodCgpOworICAgICAgc0luZm8uZlNtYWxsU3RlcCA9IDEzLjBmOworICAgICAgc0luZm8uZkJpZ1N0ZXAgPSBzSW5mby5mUGxhdGVXaWR0aDsKKworICAgICAgaWYgKEZYU1lTX21lbWNtcCgmbV9PbGRTY3JvbGxJbmZvLCAmc0luZm8sIHNpemVvZihQV0xfU0NST0xMX0lORk8pKSAhPQorICAgICAgICAgIDApIHsKKyAgICAgICAgRlhfQk9PTCBiU2Nyb2xsQ2hhbmdlZCA9IEZBTFNFOwogCi0JCQlQV0xfU0NST0xMX0lORk8gc0luZm87Ci0JCQlzSW5mby5mQ29udGVudE1pbiA9IHJjU2Nyb2xsLmJvdHRvbTsKLQkJCXNJbmZvLmZDb250ZW50TWF4ID0gcmNTY3JvbGwudG9wOwotCQkJc0luZm8uZlBsYXRlV2lkdGggPSBtX3BDb250ZW50cy0+R2V0Q2xpZW50UmVjdCgpLkhlaWdodCgpOwotCQkJc0luZm8uZlNtYWxsU3RlcCA9IDEzLjBmOwotCQkJc0luZm8uZkJpZ1N0ZXAgPSBzSW5mby5mUGxhdGVXaWR0aDsKKyAgICAgICAgaWYgKGxQYXJhbSA8IDMpIHsKKyAgICAgICAgICBiU2Nyb2xsQ2hhbmdlZCA9IFJlc2V0U2Nyb2xsQmFyKCk7CisgICAgICAgICAgaWYgKGJTY3JvbGxDaGFuZ2VkKSB7CisgICAgICAgICAgICBsUGFyYW0rKzsKKyAgICAgICAgICAgIG1fcENvbnRlbnRzLT5Pbk5vdGlmeSh0aGlzLCBQTk1fTk9URVJFU0VULCAwLCAwKTsKKyAgICAgICAgICAgIE9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFRURJVENIQU5HRUQsIDAsIGxQYXJhbSk7CisgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJCWlmIChGWFNZU19tZW1jbXAoJm1fT2xkU2Nyb2xsSW5mbywgJnNJbmZvLCBzaXplb2YoUFdMX1NDUk9MTF9JTkZPKSkgIT0gMCkKLQkJCXsKLQkJCQlGWF9CT09MIGJTY3JvbGxDaGFuZ2VkID0gRkFMU0U7CisgICAgICAgIGlmICghYlNjcm9sbENoYW5nZWQpIHsKKyAgICAgICAgICBpZiAobV9wQ29udGVudHNCYXItPklzVmlzaWJsZSgpKSB7CisgICAgICAgICAgICBtX3BDb250ZW50c0Jhci0+T25Ob3RpZnkocFduZCwgUE5NX1NFVFNDUk9MTElORk8sIFNCVF9WU0NST0xMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnRwdHJfdCkmc0luZm8pOworICAgICAgICAgICAgbV9PbGRTY3JvbGxJbmZvID0gc0luZm87CiAKLQkJCQlpZiAobFBhcmFtIDwgMykgLy+3wNa5y8DRrbu3IG1hbnRpczoxNTc1OQotCQkJCXsKLQkJCQkJYlNjcm9sbENoYW5nZWQgPSBSZXNldFNjcm9sbEJhcigpOwotCQkJCQlpZiAoYlNjcm9sbENoYW5nZWQpCi0JCQkJCXsKLQkJCQkJCWxQYXJhbSsrOwotCQkJCQkJbV9wQ29udGVudHMtPk9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFUkVTRVQsIDAsIDApOwotCQkJCQkJdGhpcy0+T25Ob3RpZnkodGhpcywgUE5NX05PVEVFRElUQ0hBTkdFRCwgMCwgbFBhcmFtKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZiAoIWJTY3JvbGxDaGFuZ2VkKQotCQkJCXsKLQkJCQkJaWYgKG1fcENvbnRlbnRzQmFyLT5Jc1Zpc2libGUoKSkKLQkJCQkJewotCQkJCQkJbV9wQ29udGVudHNCYXItPk9uTm90aWZ5KHBXbmQsIFBOTV9TRVRTQ1JPTExJTkZPLCBTQlRfVlNDUk9MTCwgKEZYX0lOVFBUUikmc0luZm8pOwotCQkJCQkJbV9PbGRTY3JvbGxJbmZvID0gc0luZm87CisgICAgICAgICAgICBDUERGX1BvaW50IHB0U2Nyb2xsID0gbV9wQ29udGVudHMtPkdldFNjcm9sbFBvcygpOworICAgICAgICAgICAgQ1BERl9Qb2ludCBwdE9sZCA9IHB0U2Nyb2xsOwogCi0JCQkJCQlDUERGX1BvaW50IHB0U2Nyb2xsID0gbV9wQ29udGVudHMtPkdldFNjcm9sbFBvcygpOwotCQkJCQkJQ1BERl9Qb2ludCBwdE9sZCA9IHB0U2Nyb2xsOworICAgICAgICAgICAgaWYgKHB0U2Nyb2xsLnkgPiBzSW5mby5mQ29udGVudE1heCkKKyAgICAgICAgICAgICAgcHRTY3JvbGwueSA9IHNJbmZvLmZDb250ZW50TWF4OworICAgICAgICAgICAgaWYgKHB0U2Nyb2xsLnkgPCBzSW5mby5mQ29udGVudE1pbiArIHNJbmZvLmZQbGF0ZVdpZHRoKQorICAgICAgICAgICAgICBwdFNjcm9sbC55ID0gc0luZm8uZkNvbnRlbnRNaW4gKyBzSW5mby5mUGxhdGVXaWR0aDsKKyAgICAgICAgICAgIGlmIChwdFNjcm9sbC55IDwgc0luZm8uZkNvbnRlbnRNaW4pCisgICAgICAgICAgICAgIHB0U2Nyb2xsLnkgPSBzSW5mby5mQ29udGVudE1pbjsKIAotCQkJCQkJaWYgKHB0U2Nyb2xsLnkgPiBzSW5mby5mQ29udGVudE1heCkKLQkJCQkJCQlwdFNjcm9sbC55ID0gc0luZm8uZkNvbnRlbnRNYXg7Ci0JCQkJCQlpZiAocHRTY3JvbGwueSA8IHNJbmZvLmZDb250ZW50TWluICsgc0luZm8uZlBsYXRlV2lkdGgpCi0JCQkJCQkJcHRTY3JvbGwueSA9IHNJbmZvLmZDb250ZW50TWluICsgc0luZm8uZlBsYXRlV2lkdGg7Ci0JCQkJCQlpZiAocHRTY3JvbGwueSA8IHNJbmZvLmZDb250ZW50TWluKQotCQkJCQkJCXB0U2Nyb2xsLnkgPSBzSW5mby5mQ29udGVudE1pbjsKKyAgICAgICAgICAgIGlmIChwdE9sZC55ICE9IHB0U2Nyb2xsLnkpIHsKKyAgICAgICAgICAgICAgbV9wQ29udGVudHNCYXItPk9uTm90aWZ5KHRoaXMsIFBOTV9TRVRTQ1JPTExQT1MsIFNCVF9WU0NST0xMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludHB0cl90KSZwdFNjcm9sbC55KTsKKyAgICAgICAgICAgICAgbV9wQ29udGVudHNCYXItPkludmFsaWRhdGVSZWN0KE5VTEwpOworICAgICAgICAgICAgICBtX3BDb250ZW50cy0+T25Ob3RpZnkodGhpcywgUE5NX1NDUk9MTFdJTkRPVywgU0JUX1ZTQ1JPTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50cHRyX3QpJnB0U2Nyb2xsLnkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KIAotCQkJCQkJaWYgKHB0T2xkLnkgIT0gcHRTY3JvbGwueSkKLQkJCQkJCXsKLQkJCQkJCQltX3BDb250ZW50c0Jhci0+T25Ob3RpZnkodGhpcywgUE5NX1NFVFNDUk9MTFBPUywgU0JUX1ZTQ1JPTEwsIChGWF9JTlRQVFIpJnB0U2Nyb2xsLnkpOwotCQkJCQkJCW1fcENvbnRlbnRzQmFyLT5JbnZhbGlkYXRlUmVjdChOVUxMKTsKLQkJCQkJCQltX3BDb250ZW50cy0+T25Ob3RpZnkodGhpcywgUE5NX1NDUk9MTFdJTkRPVywgU0JUX1ZTQ1JPTEwsIChGWF9JTlRQVFIpJnB0U2Nyb2xsLnkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9CisgICAgICBtX3BDb250ZW50cy0+SW52YWxpZGF0ZVJlY3QoTlVMTCk7CiAKLQkJbV9wQ29udGVudHMtPkludmFsaWRhdGVSZWN0KE5VTEwpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgUE5NX1NDUk9MTFdJTkRPVzoKKyAgICAgIGlmIChtX3BDb250ZW50cykKKyAgICAgICAgbV9wQ29udGVudHMtPk9uTm90aWZ5KHBXbmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOworICAgICAgcmV0dXJuOworICAgIGNhc2UgUE5NX1NFVFNDUk9MTFBPUzoKKyAgICAgIGlmIChtX3BDb250ZW50c0JhcikKKyAgICAgICAgbV9wQ29udGVudHNCYXItPk9uTm90aWZ5KHBXbmQsIFBOTV9TRVRTQ1JPTExQT1MsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgIHJldHVybjsKKyAgfQogCi0JCXJldHVybjsKLQljYXNlIFBOTV9TQ1JPTExXSU5ET1c6Ci0JCWlmIChtX3BDb250ZW50cykKLQkJCW1fcENvbnRlbnRzLT5Pbk5vdGlmeShwV25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKLQkJcmV0dXJuOwotCWNhc2UgUE5NX1NFVFNDUk9MTFBPUzoKLQkJaWYgKG1fcENvbnRlbnRzQmFyKQotCQkJbV9wQ29udGVudHNCYXItPk9uTm90aWZ5KHBXbmQsUE5NX1NFVFNDUk9MTFBPUyx3UGFyYW0sbFBhcmFtKTsKLQkJcmV0dXJuOwotCX0KKyAgaWYgKG1zZyA9PSBQTk1fU0VUQ0FSRVRJTkZPICYmIElzVmFsaWQoKSkgeworICAgIGlmIChQV0xfQ0FSRVRfSU5GTyogcEluZm8gPSAoUFdMX0NBUkVUX0lORk8qKXdQYXJhbSkgeworICAgICAgaWYgKG1fcENvbnRlbnRzKSB7CisgICAgICAgIENQREZfUmVjdCByY0NsaWVudCA9IG1fcENvbnRlbnRzLT5HZXRDbGllbnRSZWN0KCk7CisgICAgICAgIGlmIChwSW5mby0+cHRIZWFkLnkgPiByY0NsaWVudC50b3ApIHsKKyAgICAgICAgICBDUERGX1BvaW50IHB0ID0gbV9wQ29udGVudHMtPk91dFRvSW4ocEluZm8tPnB0SGVhZCk7CisgICAgICAgICAgbV9wQ29udGVudHMtPk9uTm90aWZ5KHRoaXMsIFBOTV9TQ1JPTExXSU5ET1csIFNCVF9WU0NST0xMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50cHRyX3QpJnB0LnkpOwogCi0JaWYgKG1zZyA9PSBQTk1fU0VUQ0FSRVRJTkZPICYmIElzVmFsaWQoKSkKLQl7Ci0JCWlmIChQV0xfQ0FSRVRfSU5GTyAqIHBJbmZvID0gKFBXTF9DQVJFVF9JTkZPKil3UGFyYW0pCi0JCXsKLQkJCWlmIChtX3BDb250ZW50cykKLQkJCXsKLQkJCQlDUERGX1JlY3QgcmNDbGllbnQgPSBtX3BDb250ZW50cy0+R2V0Q2xpZW50UmVjdCgpOwotCQkJCWlmIChwSW5mby0+cHRIZWFkLnkgPiByY0NsaWVudC50b3ApCi0JCQkJewotCQkJCQlDUERGX1BvaW50IHB0ID0gbV9wQ29udGVudHMtPk91dFRvSW4ocEluZm8tPnB0SGVhZCk7Ci0JCQkJCW1fcENvbnRlbnRzLT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0NST0xMV0lORE9XLCBTQlRfVlNDUk9MTCwgKEZYX0lOVFBUUikmcHQueSk7CisgICAgICAgICAgQ1BERl9Qb2ludCBwdFNjcm9sbCA9IG1fcENvbnRlbnRzLT5HZXRTY3JvbGxQb3MoKTsKKyAgICAgICAgICBtX3BDb250ZW50c0Jhci0+T25Ob3RpZnkodGhpcywgUE5NX1NFVFNDUk9MTFBPUywgU0JUX1ZTQ1JPTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnRwdHJfdCkmcHRTY3JvbGwueSk7CiAKLQkJCQkJQ1BERl9Qb2ludCBwdFNjcm9sbCA9IG1fcENvbnRlbnRzLT5HZXRTY3JvbGxQb3MoKTsKLQkJCQkJbV9wQ29udGVudHNCYXItPk9uTm90aWZ5KHRoaXMsIFBOTV9TRVRTQ1JPTExQT1MsIFNCVF9WU0NST0xMLCAoRlhfSU5UUFRSKSZwdFNjcm9sbC55KTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCQotCQkJCWlmIChwSW5mby0+cHRGb290LnkgPCByY0NsaWVudC5ib3R0b20pCi0JCQkJewotCQkJCQlDUERGX1BvaW50IHB0ID0gbV9wQ29udGVudHMtPk91dFRvSW4ocEluZm8tPnB0Rm9vdCk7Ci0JCQkJCXB0LnkgKz0gcmNDbGllbnQuSGVpZ2h0KCk7Ci0JCQkJCW1fcENvbnRlbnRzLT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0NST0xMV0lORE9XLCBTQlRfVlNDUk9MTCwgKEZYX0lOVFBUUikmcHQueSk7CisgICAgICAgIGlmIChwSW5mby0+cHRGb290LnkgPCByY0NsaWVudC5ib3R0b20pIHsKKyAgICAgICAgICBDUERGX1BvaW50IHB0ID0gbV9wQ29udGVudHMtPk91dFRvSW4ocEluZm8tPnB0Rm9vdCk7CisgICAgICAgICAgcHQueSArPSByY0NsaWVudC5IZWlnaHQoKTsKKyAgICAgICAgICBtX3BDb250ZW50cy0+T25Ob3RpZnkodGhpcywgUE5NX1NDUk9MTFdJTkRPVywgU0JUX1ZTQ1JPTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnRwdHJfdCkmcHQueSk7CiAKLQkJCQkJQ1BERl9Qb2ludCBwdFNjcm9sbCA9IG1fcENvbnRlbnRzLT5HZXRTY3JvbGxQb3MoKTsKLQkJCQkJbV9wQ29udGVudHNCYXItPk9uTm90aWZ5KHRoaXMsIFBOTV9TRVRTQ1JPTExQT1MsIFNCVF9WU0NST0xMLCAoRlhfSU5UUFRSKSZwdFNjcm9sbC55KTsKKyAgICAgICAgICBDUERGX1BvaW50IHB0U2Nyb2xsID0gbV9wQ29udGVudHMtPkdldFNjcm9sbFBvcygpOworICAgICAgICAgIG1fcENvbnRlbnRzQmFyLT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0VUU0NST0xMUE9TLCBTQlRfVlNDUk9MTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludHB0cl90KSZwdFNjcm9sbC55KTsKIAotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQorICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQogCi0JQ1BXTF9Ob3RlSXRlbTo6T25Ob3RpZnkocFduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7CisgIENQV0xfTm90ZUl0ZW06Ok9uTm90aWZ5KHBXbmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOwogfQogCi12b2lkIENQV0xfTm90ZTo6U2V0QmtDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikKLXsKLQlDUFdMX05vdGVJdGVtOjpTZXRCa0NvbG9yKGNvbG9yKTsKK3ZvaWQgQ1BXTF9Ob3RlOjpTZXRCa0NvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKSB7CisgIENQV0xfTm90ZUl0ZW06OlNldEJrQ29sb3IoY29sb3IpOwogCi0JQ1BXTF9Db2xvciBzQksgPSBjb2xvcjsKLQlDUFdMX0NvbG9yIHNUZXh0Q29sb3I7Ci0JaWYgKENQV0xfVXRpbHM6OklzQmxhY2tPcldoaXRlKHNCSykpCi0JCXNUZXh0Q29sb3IgPSBQV0xfREVGQVVMVF9XSElURUNPTE9SOwotCWVsc2UKLQkJc1RleHRDb2xvciA9IFBXTF9ERUZBVUxUX0JMQUNLQ09MT1I7CisgIENQV0xfQ29sb3Igc0JLID0gY29sb3I7CisgIENQV0xfQ29sb3Igc1RleHRDb2xvcjsKKyAgaWYgKENQV0xfVXRpbHM6OklzQmxhY2tPcldoaXRlKHNCSykpCisgICAgc1RleHRDb2xvciA9IFBXTF9ERUZBVUxUX1dISVRFQ09MT1I7CisgIGVsc2UKKyAgICBzVGV4dENvbG9yID0gUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUjsKIAotCWlmIChtX3BDbG9zZUJveCkKLQkJbV9wQ2xvc2VCb3gtPlNldFRleHRDb2xvcihzVGV4dENvbG9yKTsKLQlpZiAobV9wQXV0aG9yKQotCQltX3BBdXRob3ItPlNldFRleHRDb2xvcihzVGV4dENvbG9yKTsKLQlpZiAobV9wT3B0aW9ucykKLQkJbV9wT3B0aW9ucy0+U2V0VGV4dENvbG9yKHNUZXh0Q29sb3IpOwotCWlmIChtX3BMQkJveCkKLQkJbV9wTEJCb3gtPlNldFRleHRDb2xvcihzVGV4dENvbG9yKTsKLQlpZiAobV9wUkJCb3gpCi0JCW1fcFJCQm94LT5TZXRUZXh0Q29sb3Ioc1RleHRDb2xvcik7CisgIGlmIChtX3BDbG9zZUJveCkKKyAgICBtX3BDbG9zZUJveC0+U2V0VGV4dENvbG9yKHNUZXh0Q29sb3IpOworICBpZiAobV9wQXV0aG9yKQorICAgIG1fcEF1dGhvci0+U2V0VGV4dENvbG9yKHNUZXh0Q29sb3IpOworICBpZiAobV9wT3B0aW9ucykKKyAgICBtX3BPcHRpb25zLT5TZXRUZXh0Q29sb3Ioc1RleHRDb2xvcik7CisgIGlmIChtX3BMQkJveCkKKyAgICBtX3BMQkJveC0+U2V0VGV4dENvbG9yKHNUZXh0Q29sb3IpOworICBpZiAobV9wUkJCb3gpCisgICAgbV9wUkJCb3gtPlNldFRleHRDb2xvcihzVGV4dENvbG9yKTsKIH0KIAotRlhfQk9PTAlDUFdMX05vdGU6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQotewotCWlmIChtX3BPcHRpb25zLT5XbmRIaXRUZXN0KG1fcE9wdGlvbnMtPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkKLQl7Ci0JCWlmIChJUFdMX05vdGVOb3RpZnkqIHBOb3RpZnkgPSB0aGlzLT5HZXROb3RlTm90aWZ5KCkpCi0JCXsKLQkJCUZYX0lOVDMyIHgsIHk7Ci0JCQlQV0x0b1duZChwb2ludCwgeCwgeSk7Ci0JCQlpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTSCA9IEdldFN5c3RlbUhhbmRsZXIoKSkKLQkJCQlwU0gtPkNsaWVudFRvU2NyZWVuKEdldEF0dGFjaGVkSFduZCgpLCB4LCB5KTsKLQkJCXRoaXMtPktpbGxGb2N1cygpOwotCQkJcE5vdGlmeS0+T25Qb3B1cE1lbnUoeCwgeSk7CitGWF9CT09MIENQV0xfTm90ZTo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIHsKKyAgaWYgKG1fcE9wdGlvbnMtPlduZEhpdFRlc3QobV9wT3B0aW9ucy0+UGFyZW50VG9DaGlsZChwb2ludCkpKSB7CisgICAgaWYgKElQV0xfTm90ZU5vdGlmeSogcE5vdGlmeSA9IEdldE5vdGVOb3RpZnkoKSkgeworICAgICAgaW50MzJfdCB4LCB5OworICAgICAgUFdMdG9XbmQocG9pbnQsIHgsIHkpOworICAgICAgaWYgKElGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCkpCisgICAgICAgIHBTSC0+Q2xpZW50VG9TY3JlZW4oR2V0QXR0YWNoZWRIV25kKCksIHgsIHkpOworICAgICAgS2lsbEZvY3VzKCk7CisgICAgICBwTm90aWZ5LT5PblBvcHVwTWVudSh4LCB5KTsKIAotCQkJcmV0dXJuIFRSVUU7Ci0JCX0KLQl9CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KIAotCXJldHVybiBDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCxuRmxhZyk7CisgIHJldHVybiBDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCwgbkZsYWcpOwogfQogCi1GWF9CT09MCUNQV0xfTm90ZTo6T25SQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKLXsKLQlyZXR1cm4gQ1BXTF9XbmQ6Ok9uUkJ1dHRvblVwKHBvaW50LG5GbGFnKTsKK0ZYX0JPT0wgQ1BXTF9Ob3RlOjpPblJCdXR0b25VcChjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIHsKKyAgcmV0dXJuIENQV0xfV25kOjpPblJCdXR0b25VcChwb2ludCwgbkZsYWcpOwogfQogCi1jb25zdCBDUFdMX05vdGUqIENQV0xfTm90ZTo6R2V0Tm90ZSgpIGNvbnN0Ci17Ci0JcmV0dXJuIHRoaXM7Citjb25zdCBDUFdMX05vdGUqIENQV0xfTm90ZTo6R2V0Tm90ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHRoaXM7CiB9CiAKLUlQV0xfTm90ZU5vdGlmeSogQ1BXTF9Ob3RlOjpHZXROb3RlTm90aWZ5KCkgY29uc3QKLXsKLQlpZiAobV9iRW5hbGJsZU5vdGlmeSkKLQkJcmV0dXJuIG1fcE5vdGVOb3RpZnk7Ci0KLQlyZXR1cm4gTlVMTDsKK0lQV0xfTm90ZU5vdGlmeSogQ1BXTF9Ob3RlOjpHZXROb3RlTm90aWZ5KCkgY29uc3QgeworICByZXR1cm4gbV9iRW5hYmxlTm90aWZ5ID8gbV9wTm90ZU5vdGlmeSA6IG51bGxwdHI7CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlOjpTZXRJY29uVHlwZShGWF9JTlQzMiBuVHlwZSkKLXsKLQlpZiAobV9wSWNvbikKLQkJbV9wSWNvbi0+U2V0SWNvblR5cGUoblR5cGUpOwordm9pZCBDUFdMX05vdGU6OlNldEljb25UeXBlKGludDMyX3QgblR5cGUpIHsKKyAgaWYgKG1fcEljb24pCisgICAgbV9wSWNvbi0+U2V0SWNvblR5cGUoblR5cGUpOwogfQogCi12b2lkIENQV0xfTm90ZTo6RW5hYmxlTW9kaWZ5KEZYX0JPT0wgYkVuYWJsZWQpCi17Ci0JbV9wQ29udGVudHMtPkVuYWJsZU1vZGlmeShiRW5hYmxlZCk7Cit2b2lkIENQV0xfTm90ZTo6RW5hYmxlTW9kaWZ5KEZYX0JPT0wgYkVuYWJsZWQpIHsKKyAgbV9wQ29udGVudHMtPkVuYWJsZU1vZGlmeShiRW5hYmxlZCk7CiB9CiAKLXZvaWQgQ1BXTF9Ob3RlOjpFbmFibGVSZWFkKEZYX0JPT0wgYkVuYWJsZWQpCi17Ci0JbV9wQ29udGVudHMtPkVuYWJsZVJlYWQoYkVuYWJsZWQpOwordm9pZCBDUFdMX05vdGU6OkVuYWJsZVJlYWQoRlhfQk9PTCBiRW5hYmxlZCkgeworICBtX3BDb250ZW50cy0+RW5hYmxlUmVhZChiRW5hYmxlZCk7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQV0xfTm90ZTo6R2V0UmVwbHlTdHJpbmcoKSBjb25zdAotewotCXJldHVybiBtX3NSZXBseVN0cmluZzsKK0NGWF9XaWRlU3RyaW5nIENQV0xfTm90ZTo6R2V0UmVwbHlTdHJpbmcoKSBjb25zdCB7CisgIHJldHVybiBtX3NSZXBseVN0cmluZzsKIH0KIAotdm9pZCBDUFdMX05vdGU6OlNldFJlcGx5U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcpCi17Ci0JbV9zUmVwbHlTdHJpbmcgPSBzdHJpbmc7Cit2b2lkIENQV0xfTm90ZTo6U2V0UmVwbHlTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZykgeworICBtX3NSZXBseVN0cmluZyA9IHN0cmluZzsKIH0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuY3BwCmluZGV4IDc3MmUxODQuLmM0ODA1MmQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfU2Nyb2xsQmFyLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1Njcm9sbEJhci5jcHAKQEAgLTEsMTM1MyArMSwxMTc3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QREZXaW5kb3cuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfV25kLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1Njcm9sbEJhci5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1Njcm9sbEJhci5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1V0aWxzLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfV25kLmgiCiAKLSNkZWZpbmUgSXNGbG9hdFplcm8oZikJCQkJCQkoKGYpIDwgMC4wMDAxICYmIChmKSA+IC0wLjAwMDEpCi0jZGVmaW5lIElzRmxvYXRCaWdnZXIoZmEsZmIpCQkJCSgoZmEpID4gKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQotI2RlZmluZSBJc0Zsb2F0U21hbGxlcihmYSxmYikJCQkJKChmYSkgPCAoZmIpICYmICFJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkpCi0jZGVmaW5lIElzRmxvYXRFcXVhbChmYSxmYikJCQkJCUlzRmxvYXRaZXJvKChmYSktKGZiKSkKKyNkZWZpbmUgSXNGbG9hdFplcm8oZikgKChmKSA8IDAuMDAwMSAmJiAoZikgPiAtMC4wMDAxKQorI2RlZmluZSBJc0Zsb2F0QmlnZ2VyKGZhLCBmYikgKChmYSkgPiAoZmIpICYmICFJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkpCisjZGVmaW5lIElzRmxvYXRTbWFsbGVyKGZhLCBmYikgKChmYSkgPCAoZmIpICYmICFJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkpCisjZGVmaW5lIElzRmxvYXRFcXVhbChmYSwgZmIpIElzRmxvYXRaZXJvKChmYSkgLSAoZmIpKQogCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUFdMX0ZMT0FUUkFOR0UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1QV0xfRkxPQVRSQU5HRTo6UFdMX0ZMT0FUUkFOR0UoKQotewotCURlZmF1bHQoKTsKK1BXTF9GTE9BVFJBTkdFOjpQV0xfRkxPQVRSQU5HRSgpIHsKKyAgRGVmYXVsdCgpOwogfQogCi1QV0xfRkxPQVRSQU5HRTo6UFdMX0ZMT0FUUkFOR0UoRlhfRkxPQVQgbWluLEZYX0ZMT0FUIG1heCkKLXsKLQlTZXQobWluLG1heCk7CitQV0xfRkxPQVRSQU5HRTo6UFdMX0ZMT0FUUkFOR0UoRlhfRkxPQVQgbWluLCBGWF9GTE9BVCBtYXgpIHsKKyAgU2V0KG1pbiwgbWF4KTsKIH0KIAotdm9pZCBQV0xfRkxPQVRSQU5HRTo6RGVmYXVsdCgpCi17Ci0JZk1pbiA9IDA7Ci0JZk1heCA9IDA7Cit2b2lkIFBXTF9GTE9BVFJBTkdFOjpEZWZhdWx0KCkgeworICBmTWluID0gMDsKKyAgZk1heCA9IDA7CiB9CiAKLXZvaWQgUFdMX0ZMT0FUUkFOR0U6OlNldChGWF9GTE9BVCBtaW4sRlhfRkxPQVQgbWF4KQotewotCWlmIChtaW4gPiBtYXgpCi0JewotCQlmTWluID0gbWF4OwotCQlmTWF4ID0gbWluOwotCX0KLQllbHNlCi0JewotCQlmTWluID0gbWluOwotCQlmTWF4ID0gbWF4OwotCX0KK3ZvaWQgUFdMX0ZMT0FUUkFOR0U6OlNldChGWF9GTE9BVCBtaW4sIEZYX0ZMT0FUIG1heCkgeworICBpZiAobWluID4gbWF4KSB7CisgICAgZk1pbiA9IG1heDsKKyAgICBmTWF4ID0gbWluOworICB9IGVsc2UgeworICAgIGZNaW4gPSBtaW47CisgICAgZk1heCA9IG1heDsKKyAgfQogfQogCi1GWF9CT09MCVBXTF9GTE9BVFJBTkdFOjpJbihGWF9GTE9BVCB4KSBjb25zdAotewotCXJldHVybiAoSXNGbG9hdEJpZ2dlcih4LGZNaW4pIHx8IElzRmxvYXRFcXVhbCh4LCBmTWluKSkgJiYgCi0JCShJc0Zsb2F0U21hbGxlcih4LCBmTWF4KSB8fCBJc0Zsb2F0RXF1YWwoeCwgZk1heCkpOworRlhfQk9PTCBQV0xfRkxPQVRSQU5HRTo6SW4oRlhfRkxPQVQgeCkgY29uc3QgeworICByZXR1cm4gKElzRmxvYXRCaWdnZXIoeCwgZk1pbikgfHwgSXNGbG9hdEVxdWFsKHgsIGZNaW4pKSAmJgorICAgICAgICAgKElzRmxvYXRTbWFsbGVyKHgsIGZNYXgpIHx8IElzRmxvYXRFcXVhbCh4LCBmTWF4KSk7CiB9CiAKLUZYX0ZMT0FUIFBXTF9GTE9BVFJBTkdFOjpHZXRXaWR0aCgpIGNvbnN0Ci17Ci0JcmV0dXJuIGZNYXggLSBmTWluOworRlhfRkxPQVQgUFdMX0ZMT0FUUkFOR0U6OkdldFdpZHRoKCkgY29uc3QgeworICByZXR1cm4gZk1heCAtIGZNaW47CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUFdMX1NDUk9MTF9QUklWQVRFREFUQSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLVBXTF9TQ1JPTExfUFJJVkFURURBVEE6OlBXTF9TQ1JPTExfUFJJVkFURURBVEEoKQotewotCURlZmF1bHQoKTsKK1BXTF9TQ1JPTExfUFJJVkFURURBVEE6OlBXTF9TQ1JPTExfUFJJVkFURURBVEEoKSB7CisgIERlZmF1bHQoKTsKIH0KIAotdm9pZCBQV0xfU0NST0xMX1BSSVZBVEVEQVRBOjpEZWZhdWx0KCkKLXsKLQlTY3JvbGxSYW5nZS5EZWZhdWx0KCk7Ci0JZlNjcm9sbFBvcyA9IFNjcm9sbFJhbmdlLmZNaW47Ci0JZkNsaWVudFdpZHRoID0gMDsKLQlmQmlnU3RlcCA9IDEwOwotCWZTbWFsbFN0ZXAgPSAxOwordm9pZCBQV0xfU0NST0xMX1BSSVZBVEVEQVRBOjpEZWZhdWx0KCkgeworICBTY3JvbGxSYW5nZS5EZWZhdWx0KCk7CisgIGZTY3JvbGxQb3MgPSBTY3JvbGxSYW5nZS5mTWluOworICBmQ2xpZW50V2lkdGggPSAwOworICBmQmlnU3RlcCA9IDEwOworICBmU21hbGxTdGVwID0gMTsKIH0KIAotdm9pZCBQV0xfU0NST0xMX1BSSVZBVEVEQVRBOjpTZXRTY3JvbGxSYW5nZShGWF9GTE9BVCBtaW4sRlhfRkxPQVQgbWF4KQotewotCVNjcm9sbFJhbmdlLlNldChtaW4sbWF4KTsKK3ZvaWQgUFdMX1NDUk9MTF9QUklWQVRFREFUQTo6U2V0U2Nyb2xsUmFuZ2UoRlhfRkxPQVQgbWluLCBGWF9GTE9BVCBtYXgpIHsKKyAgU2Nyb2xsUmFuZ2UuU2V0KG1pbiwgbWF4KTsKIAotCWlmIChJc0Zsb2F0U21hbGxlcihmU2Nyb2xsUG9zLCBTY3JvbGxSYW5nZS5mTWluKSkKLQkJZlNjcm9sbFBvcyA9IFNjcm9sbFJhbmdlLmZNaW47Ci0JaWYgKElzRmxvYXRCaWdnZXIoZlNjcm9sbFBvcywgU2Nyb2xsUmFuZ2UuZk1heCkpCi0JCWZTY3JvbGxQb3MgPSBTY3JvbGxSYW5nZS5mTWF4OwkJCisgIGlmIChJc0Zsb2F0U21hbGxlcihmU2Nyb2xsUG9zLCBTY3JvbGxSYW5nZS5mTWluKSkKKyAgICBmU2Nyb2xsUG9zID0gU2Nyb2xsUmFuZ2UuZk1pbjsKKyAgaWYgKElzRmxvYXRCaWdnZXIoZlNjcm9sbFBvcywgU2Nyb2xsUmFuZ2UuZk1heCkpCisgICAgZlNjcm9sbFBvcyA9IFNjcm9sbFJhbmdlLmZNYXg7CiB9CiAKLXZvaWQgUFdMX1NDUk9MTF9QUklWQVRFREFUQTo6U2V0Q2xpZW50V2lkdGgoRlhfRkxPQVQgd2lkdGgpCi17Ci0JZkNsaWVudFdpZHRoID0gd2lkdGg7Cit2b2lkIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OlNldENsaWVudFdpZHRoKEZYX0ZMT0FUIHdpZHRoKSB7CisgIGZDbGllbnRXaWR0aCA9IHdpZHRoOwogfQogCi12b2lkIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OlNldFNtYWxsU3RlcChGWF9GTE9BVCBzdGVwKQotewotCWZTbWFsbFN0ZXAgPSBzdGVwOwordm9pZCBQV0xfU0NST0xMX1BSSVZBVEVEQVRBOjpTZXRTbWFsbFN0ZXAoRlhfRkxPQVQgc3RlcCkgeworICBmU21hbGxTdGVwID0gc3RlcDsKIH0KIAotdm9pZCBQV0xfU0NST0xMX1BSSVZBVEVEQVRBOjpTZXRCaWdTdGVwKEZYX0ZMT0FUIHN0ZXApCi17Ci0JZkJpZ1N0ZXAgPSBzdGVwOwordm9pZCBQV0xfU0NST0xMX1BSSVZBVEVEQVRBOjpTZXRCaWdTdGVwKEZYX0ZMT0FUIHN0ZXApIHsKKyAgZkJpZ1N0ZXAgPSBzdGVwOwogfQogCi1GWF9CT09MIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OlNldFBvcyhGWF9GTE9BVCBwb3MpCi17Ci0JaWYgKFNjcm9sbFJhbmdlLkluKHBvcykpCi0JewotCQlmU2Nyb2xsUG9zID0gcG9zOwotCQlyZXR1cm4gVFJVRTsKLQl9Ci0JcmV0dXJuIEZBTFNFOworRlhfQk9PTCBQV0xfU0NST0xMX1BSSVZBVEVEQVRBOjpTZXRQb3MoRlhfRkxPQVQgcG9zKSB7CisgIGlmIChTY3JvbGxSYW5nZS5Jbihwb3MpKSB7CisgICAgZlNjcm9sbFBvcyA9IHBvczsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9CiAKLXZvaWQgUFdMX1NDUk9MTF9QUklWQVRFREFUQTo6QWRkU21hbGwoKQotewotCWlmICghU2V0UG9zKGZTY3JvbGxQb3MgKyBmU21hbGxTdGVwKSkKLQkJU2V0UG9zKFNjcm9sbFJhbmdlLmZNYXgpOwordm9pZCBQV0xfU0NST0xMX1BSSVZBVEVEQVRBOjpBZGRTbWFsbCgpIHsKKyAgaWYgKCFTZXRQb3MoZlNjcm9sbFBvcyArIGZTbWFsbFN0ZXApKQorICAgIFNldFBvcyhTY3JvbGxSYW5nZS5mTWF4KTsKIH0KIAotdm9pZCBQV0xfU0NST0xMX1BSSVZBVEVEQVRBOjpTdWJTbWFsbCgpCi17Ci0JaWYgKCFTZXRQb3MoZlNjcm9sbFBvcyAtIGZTbWFsbFN0ZXApKQotCQlTZXRQb3MoU2Nyb2xsUmFuZ2UuZk1pbik7Cit2b2lkIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OlN1YlNtYWxsKCkgeworICBpZiAoIVNldFBvcyhmU2Nyb2xsUG9zIC0gZlNtYWxsU3RlcCkpCisgICAgU2V0UG9zKFNjcm9sbFJhbmdlLmZNaW4pOwogfQogCi12b2lkIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OkFkZEJpZygpCi17Ci0JaWYgKCFTZXRQb3MoZlNjcm9sbFBvcyArIGZCaWdTdGVwKSkKLQkJU2V0UG9zKFNjcm9sbFJhbmdlLmZNYXgpOwkJCit2b2lkIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OkFkZEJpZygpIHsKKyAgaWYgKCFTZXRQb3MoZlNjcm9sbFBvcyArIGZCaWdTdGVwKSkKKyAgICBTZXRQb3MoU2Nyb2xsUmFuZ2UuZk1heCk7CiB9CiAKLXZvaWQgUFdMX1NDUk9MTF9QUklWQVRFREFUQTo6U3ViQmlnKCkKLXsKLQlpZiAoIVNldFBvcyhmU2Nyb2xsUG9zIC0gZkJpZ1N0ZXApKQotCQlTZXRQb3MoU2Nyb2xsUmFuZ2UuZk1pbik7Cit2b2lkIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OlN1YkJpZygpIHsKKyAgaWYgKCFTZXRQb3MoZlNjcm9sbFBvcyAtIGZCaWdTdGVwKSkKKyAgICBTZXRQb3MoU2Nyb2xsUmFuZ2UuZk1pbik7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9TQkJ1dHRvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitDUFdMX1NCQnV0dG9uOjpDUFdMX1NCQnV0dG9uKFBXTF9TQ1JPTExCQVJfVFlQRSBlU2Nyb2xsQmFyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX1NCQlVUVE9OX1RZUEUgZUJ1dHRvblR5cGUpIHsKKyAgbV9lU2Nyb2xsQmFyVHlwZSA9IGVTY3JvbGxCYXJUeXBlOworICBtX2VTQkJ1dHRvblR5cGUgPSBlQnV0dG9uVHlwZTsKIAotQ1BXTF9TQkJ1dHRvbjo6Q1BXTF9TQkJ1dHRvbihQV0xfU0NST0xMQkFSX1RZUEUgZVNjcm9sbEJhclR5cGUsUFdMX1NCQlVUVE9OX1RZUEUgZUJ1dHRvblR5cGUpCi17Ci0JbV9lU2Nyb2xsQmFyVHlwZSA9IGVTY3JvbGxCYXJUeXBlOwotCW1fZVNCQnV0dG9uVHlwZSA9IGVCdXR0b25UeXBlOwotCi0JbV9iTW91c2VEb3duID0gRkFMU0U7CisgIG1fYk1vdXNlRG93biA9IEZBTFNFOwogfQogCi1DUFdMX1NCQnV0dG9uOjp+Q1BXTF9TQkJ1dHRvbigpCi17CitDUFdMX1NCQnV0dG9uOjp+Q1BXTF9TQkJ1dHRvbigpIHt9CiAKK0NGWF9CeXRlU3RyaW5nIENQV0xfU0JCdXR0b246OkdldENsYXNzTmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuICJDUFdMX1NCQnV0dG9uIjsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9TQkJ1dHRvbjo6R2V0Q2xhc3NOYW1lKCkgY29uc3QKLXsKLQlyZXR1cm4gIkNQV0xfU0JCdXR0b24iOwordm9pZCBDUFdMX1NCQnV0dG9uOjpPbkNyZWF0ZShQV0xfQ1JFQVRFUEFSQU0mIGNwKSB7CisgIGNwLmVDdXJzb3JUeXBlID0gRlhDVF9BUlJPVzsKIH0KIAotdm9pZCBDUFdMX1NCQnV0dG9uOjpPbkNyZWF0ZShQV0xfQ1JFQVRFUEFSQU0gJiBjcCkKLXsKLQljcC5lQ3Vyc29yVHlwZSA9IEZYQ1RfQVJST1c7Cit2b2lkIENQV0xfU0JCdXR0b246OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiYgc0FwcFN0cmVhbSkgeworICBDUFdMX1duZDo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oc0FwcFN0cmVhbSk7CisKKyAgaWYgKCFJc1Zpc2libGUoKSkKKyAgICByZXR1cm47CisKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNCdXR0b247CisKKyAgQ1BERl9SZWN0IHJlY3RXbmQgPSBHZXRXaW5kb3dSZWN0KCk7CisKKyAgaWYgKHJlY3RXbmQuSXNFbXB0eSgpKQorICAgIHJldHVybjsKKworICBzQXBwU3RyZWFtIDw8ICJxXG4iOworCisgIENQREZfUG9pbnQgcHRDZW50ZXIgPSBHZXRDZW50ZXJQb2ludCgpOworCisgIHN3aXRjaCAobV9lU2Nyb2xsQmFyVHlwZSkgeworICAgIGNhc2UgU0JUX0hTQ1JPTEw6CisgICAgICBzd2l0Y2ggKG1fZVNCQnV0dG9uVHlwZSkgeworICAgICAgICBjYXNlIFBTQlRfTUlOOiB7CisgICAgICAgICAgQ1BERl9Qb2ludCBwdDEocHRDZW50ZXIueCAtIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41ZiwgcHRDZW50ZXIueSk7CisgICAgICAgICAgQ1BERl9Qb2ludCBwdDIocHRDZW50ZXIueCArIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwdENlbnRlci55ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4pOworICAgICAgICAgIENQREZfUG9pbnQgcHQzKHB0Q2VudGVyLnggKyBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHRDZW50ZXIueSAtIFBXTF9UUklBTkdMRV9IQUxGTEVOKTsKKworICAgICAgICAgIGlmIChyZWN0V25kLnJpZ2h0IC0gcmVjdFduZC5sZWZ0ID4gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAyICYmCisgICAgICAgICAgICAgIHJlY3RXbmQudG9wIC0gcmVjdFduZC5ib3R0b20gPiBQV0xfVFJJQU5HTEVfSEFMRkxFTikgeworICAgICAgICAgICAgc0J1dHRvbiA8PCAiMCBnXG4iOworICAgICAgICAgICAgc0J1dHRvbiA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBtXG4iOworICAgICAgICAgICAgc0J1dHRvbiA8PCBwdDIueCA8PCAiICIgPDwgcHQyLnkgPDwgIiBsXG4iOworICAgICAgICAgICAgc0J1dHRvbiA8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgPDwgIiBsXG4iOworICAgICAgICAgICAgc0J1dHRvbiA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBsIGZcbiI7CisKKyAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0J1dHRvbjsKKyAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgUFNCVF9NQVg6IHsKKyAgICAgICAgICBDUERGX1BvaW50IHB0MShwdENlbnRlci54ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmLCBwdENlbnRlci55KTsKKyAgICAgICAgICBDUERGX1BvaW50IHB0MihwdENlbnRlci54IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHB0Q2VudGVyLnkgKyBQV0xfVFJJQU5HTEVfSEFMRkxFTik7CisgICAgICAgICAgQ1BERl9Qb2ludCBwdDMocHRDZW50ZXIueCAtIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwdENlbnRlci55IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4pOworCisgICAgICAgICAgaWYgKHJlY3RXbmQucmlnaHQgLSByZWN0V25kLmxlZnQgPiBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDIgJiYKKyAgICAgICAgICAgICAgcmVjdFduZC50b3AgLSByZWN0V25kLmJvdHRvbSA+IFBXTF9UUklBTkdMRV9IQUxGTEVOKSB7CisgICAgICAgICAgICBzQnV0dG9uIDw8ICIwIGdcbiI7CisgICAgICAgICAgICBzQnV0dG9uIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiIG1cbiI7CisgICAgICAgICAgICBzQnV0dG9uIDw8IHB0Mi54IDw8ICIgIiA8PCBwdDIueSA8PCAiIGxcbiI7CisgICAgICAgICAgICBzQnV0dG9uIDw8IHB0My54IDw8ICIgIiA8PCBwdDMueSA8PCAiIGxcbiI7CisgICAgICAgICAgICBzQnV0dG9uIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiIGwgZlxuIjsKKworICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQnV0dG9uOworICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0JUX1ZTQ1JPTEw6CisgICAgICBzd2l0Y2ggKG1fZVNCQnV0dG9uVHlwZSkgeworICAgICAgICBjYXNlIFBTQlRfTUlOOiB7CisgICAgICAgICAgQ1BERl9Qb2ludCBwdDEocHRDZW50ZXIueCAtIFBXTF9UUklBTkdMRV9IQUxGTEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgIHB0Q2VudGVyLnkgLSBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYpOworICAgICAgICAgIENQREZfUG9pbnQgcHQyKHB0Q2VudGVyLnggKyBQV0xfVFJJQU5HTEVfSEFMRkxFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwdENlbnRlci55IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmKTsKKyAgICAgICAgICBDUERGX1BvaW50IHB0MyhwdENlbnRlci54LCBwdENlbnRlci55ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmKTsKKworICAgICAgICAgIGlmIChyZWN0V25kLnJpZ2h0IC0gcmVjdFduZC5sZWZ0ID4gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAyICYmCisgICAgICAgICAgICAgIHJlY3RXbmQudG9wIC0gcmVjdFduZC5ib3R0b20gPiBQV0xfVFJJQU5HTEVfSEFMRkxFTikgeworICAgICAgICAgICAgc0J1dHRvbiA8PCAiMCBnXG4iOworICAgICAgICAgICAgc0J1dHRvbiA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBtXG4iOworICAgICAgICAgICAgc0J1dHRvbiA8PCBwdDIueCA8PCAiICIgPDwgcHQyLnkgPDwgIiBsXG4iOworICAgICAgICAgICAgc0J1dHRvbiA8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgPDwgIiBsXG4iOworICAgICAgICAgICAgc0J1dHRvbiA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBsIGZcbiI7CisKKyAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0J1dHRvbjsKKyAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgUFNCVF9NQVg6IHsKKyAgICAgICAgICBDUERGX1BvaW50IHB0MShwdENlbnRlci54IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgcHRDZW50ZXIueSArIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41Zik7CisgICAgICAgICAgQ1BERl9Qb2ludCBwdDIocHRDZW50ZXIueCArIFBXTF9UUklBTkdMRV9IQUxGTEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgIHB0Q2VudGVyLnkgKyBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYpOworICAgICAgICAgIENQREZfUG9pbnQgcHQzKHB0Q2VudGVyLngsIHB0Q2VudGVyLnkgLSBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYpOworCisgICAgICAgICAgaWYgKHJlY3RXbmQucmlnaHQgLSByZWN0V25kLmxlZnQgPiBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDIgJiYKKyAgICAgICAgICAgICAgcmVjdFduZC50b3AgLSByZWN0V25kLmJvdHRvbSA+IFBXTF9UUklBTkdMRV9IQUxGTEVOKSB7CisgICAgICAgICAgICBzQnV0dG9uIDw8ICIwIGdcbiI7CisgICAgICAgICAgICBzQnV0dG9uIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiIG1cbiI7CisgICAgICAgICAgICBzQnV0dG9uIDw8IHB0Mi54IDw8ICIgIiA8PCBwdDIueSA8PCAiIGxcbiI7CisgICAgICAgICAgICBzQnV0dG9uIDw8IHB0My54IDw8ICIgIiA8PCBwdDMueSA8PCAiIGxcbiI7CisgICAgICAgICAgICBzQnV0dG9uIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiIGwgZlxuIjsKKworICAgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQnV0dG9uOworICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIHNBcHBTdHJlYW0gPDwgIlFcbiI7CiB9CiAKLXZvaWQgQ1BXTF9TQkJ1dHRvbjo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSkKLXsKLQlDUFdMX1duZDo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oc0FwcFN0cmVhbSk7Cit2b2lkIENQV0xfU0JCdXR0b246OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlKSB7CisgIGlmICghSXNWaXNpYmxlKCkpCisgICAgcmV0dXJuOwogCi0JaWYgKCFJc1Zpc2libGUoKSkgcmV0dXJuOworICBDUERGX1JlY3QgcmVjdFduZCA9IEdldFdpbmRvd1JlY3QoKTsKKyAgaWYgKHJlY3RXbmQuSXNFbXB0eSgpKQorICAgIHJldHVybjsKIAotCUNGWF9CeXRlVGV4dEJ1ZiBzQnV0dG9uOworICBDUERGX1BvaW50IHB0Q2VudGVyID0gR2V0Q2VudGVyUG9pbnQoKTsKKyAgaW50MzJfdCBuVHJhbnNwYXJhbmN5ID0gR2V0VHJhbnNwYXJlbmN5KCk7CiAKLQlDUERGX1JlY3QgcmVjdFduZCA9IEdldFdpbmRvd1JlY3QoKTsKKyAgc3dpdGNoIChtX2VTY3JvbGxCYXJUeXBlKSB7CisgICAgY2FzZSBTQlRfSFNDUk9MTDoKKyAgICAgIENQV0xfV25kOjpEcmF3VGhpc0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlKTsKKyAgICAgIHN3aXRjaCAobV9lU0JCdXR0b25UeXBlKSB7CisgICAgICAgIGNhc2UgUFNCVF9NSU46IHsKKyAgICAgICAgICBDUERGX1BvaW50IHB0MShwdENlbnRlci54IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmLCBwdENlbnRlci55KTsKKyAgICAgICAgICBDUERGX1BvaW50IHB0MihwdENlbnRlci54ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHB0Q2VudGVyLnkgKyBQV0xfVFJJQU5HTEVfSEFMRkxFTik7CisgICAgICAgICAgQ1BERl9Qb2ludCBwdDMocHRDZW50ZXIueCArIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwdENlbnRlci55IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4pOwogCi0JaWYgKHJlY3RXbmQuSXNFbXB0eSgpKSByZXR1cm47CisgICAgICAgICAgaWYgKHJlY3RXbmQucmlnaHQgLSByZWN0V25kLmxlZnQgPiBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDIgJiYKKyAgICAgICAgICAgICAgcmVjdFduZC50b3AgLSByZWN0V25kLmJvdHRvbSA+IFBXTF9UUklBTkdMRV9IQUxGTEVOKSB7CisgICAgICAgICAgICBDRlhfUGF0aERhdGEgcGF0aDsKIAotCXNBcHBTdHJlYW0gPDwgInFcbiI7CisgICAgICAgICAgICBwYXRoLlNldFBvaW50Q291bnQoNCk7CisgICAgICAgICAgICBwYXRoLlNldFBvaW50KDAsIHB0MS54LCBwdDEueSwgRlhQVF9NT1ZFVE8pOworICAgICAgICAgICAgcGF0aC5TZXRQb2ludCgxLCBwdDIueCwgcHQyLnksIEZYUFRfTElORVRPKTsKKyAgICAgICAgICAgIHBhdGguU2V0UG9pbnQoMiwgcHQzLngsIHB0My55LCBGWFBUX0xJTkVUTyk7CisgICAgICAgICAgICBwYXRoLlNldFBvaW50KDMsIHB0MS54LCBwdDEueSwgRlhQVF9MSU5FVE8pOwogCi0JQ1BERl9Qb2ludCBwdENlbnRlciA9IHRoaXMtPkdldENlbnRlclBvaW50KCk7CisgICAgICAgICAgICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUiwgblRyYW5zcGFyYW5jeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBGWEZJTExfQUxURVJOQVRFKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgUFNCVF9NQVg6IHsKKyAgICAgICAgICBDUERGX1BvaW50IHB0MShwdENlbnRlci54ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmLCBwdENlbnRlci55KTsKKyAgICAgICAgICBDUERGX1BvaW50IHB0MihwdENlbnRlci54IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHB0Q2VudGVyLnkgKyBQV0xfVFJJQU5HTEVfSEFMRkxFTik7CisgICAgICAgICAgQ1BERl9Qb2ludCBwdDMocHRDZW50ZXIueCAtIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwdENlbnRlci55IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4pOwogCi0Jc3dpdGNoICh0aGlzLT5tX2VTY3JvbGxCYXJUeXBlKQotCXsKLQkJY2FzZSBTQlRfSFNDUk9MTDoKLQkJCXN3aXRjaCAodGhpcy0+bV9lU0JCdXR0b25UeXBlKQotCQkJewotCQkJCWNhc2UgUFNCVF9NSU46Ci0JCQkJCXsKLQkJCQkJCUNQREZfUG9pbnQgcHQxKHB0Q2VudGVyLnggLSBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYscHRDZW50ZXIueSk7Ci0JCQkJCQlDUERGX1BvaW50IHB0MihwdENlbnRlci54ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmLHB0Q2VudGVyLnkgKyBQV0xfVFJJQU5HTEVfSEFMRkxFTik7Ci0JCQkJCQlDUERGX1BvaW50IHB0MyhwdENlbnRlci54ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmLHB0Q2VudGVyLnkgLSBQV0xfVFJJQU5HTEVfSEFMRkxFTik7CisgICAgICAgICAgaWYgKHJlY3RXbmQucmlnaHQgLSByZWN0V25kLmxlZnQgPiBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDIgJiYKKyAgICAgICAgICAgICAgcmVjdFduZC50b3AgLSByZWN0V25kLmJvdHRvbSA+IFBXTF9UUklBTkdMRV9IQUxGTEVOKSB7CisgICAgICAgICAgICBDRlhfUGF0aERhdGEgcGF0aDsKIAotCQkJCQkJaWYgKHJlY3RXbmQucmlnaHQgLSByZWN0V25kLmxlZnQgPiBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDIgJiYKLQkJCQkJCQlyZWN0V25kLnRvcCAtIHJlY3RXbmQuYm90dG9tID4gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKQotCQkJCQkJewotCQkJCQkJCXNCdXR0b24gPDwgIjAgZ1xuIjsKLQkJCQkJCQlzQnV0dG9uIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiIG1cbiI7Ci0JCQkJCQkJc0J1dHRvbiA8PCBwdDIueCA8PCAiICIgPDwgcHQyLnkgPDwgIiBsXG4iOwotCQkJCQkJCXNCdXR0b24gPDwgcHQzLnggPDwgIiAiIDw8IHB0My55IDw8ICIgbFxuIjsKLQkJCQkJCQlzQnV0dG9uIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiIGwgZlxuIjsKKyAgICAgICAgICAgIHBhdGguU2V0UG9pbnRDb3VudCg0KTsKKyAgICAgICAgICAgIHBhdGguU2V0UG9pbnQoMCwgcHQxLngsIHB0MS55LCBGWFBUX01PVkVUTyk7CisgICAgICAgICAgICBwYXRoLlNldFBvaW50KDEsIHB0Mi54LCBwdDIueSwgRlhQVF9MSU5FVE8pOworICAgICAgICAgICAgcGF0aC5TZXRQb2ludCgyLCBwdDMueCwgcHQzLnksIEZYUFRfTElORVRPKTsKKyAgICAgICAgICAgIHBhdGguU2V0UG9pbnQoMywgcHQxLngsIHB0MS55LCBGWFBUX0xJTkVUTyk7CiAKLQkJCQkJCQlzQXBwU3RyZWFtIDw8IHNCdXR0b247CQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUFNCVF9NQVg6Ci0JCQkJCXsKLQkJCQkJCUNQREZfUG9pbnQgcHQxKHB0Q2VudGVyLnggKyBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYscHRDZW50ZXIueSk7Ci0JCQkJCQlDUERGX1BvaW50IHB0MihwdENlbnRlci54IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmLHB0Q2VudGVyLnkgKyBQV0xfVFJJQU5HTEVfSEFMRkxFTik7Ci0JCQkJCQlDUERGX1BvaW50IHB0MyhwdENlbnRlci54IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmLHB0Q2VudGVyLnkgLSBQV0xfVFJJQU5HTEVfSEFMRkxFTik7CisgICAgICAgICAgICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUiwgblRyYW5zcGFyYW5jeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBGWEZJTExfQUxURVJOQVRFKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFNCVF9WU0NST0xMOgorICAgICAgc3dpdGNoIChtX2VTQkJ1dHRvblR5cGUpIHsKKyAgICAgICAgY2FzZSBQU0JUX01JTjogeworICAgICAgICAgIC8vIGRyYXcgYm9yZGVyCisgICAgICAgICAgQ1BERl9SZWN0IHJjRHJhdyA9IHJlY3RXbmQ7CisgICAgICAgICAgQ1BXTF9VdGlsczo6RHJhd1N0cm9rZVJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByY0RyYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LCAxMDAsIDEwMCwgMTAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjBmKTsKIAotCQkJCQkJaWYgKHJlY3RXbmQucmlnaHQgLSByZWN0V25kLmxlZnQgPiBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDIgJiYKLQkJCQkJCQlyZWN0V25kLnRvcCAtIHJlY3RXbmQuYm90dG9tID4gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKQotCQkJCQkJewotCQkJCQkJCXNCdXR0b24gPDwgIjAgZ1xuIjsKLQkJCQkJCQlzQnV0dG9uIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiIG1cbiI7Ci0JCQkJCQkJc0J1dHRvbiA8PCBwdDIueCA8PCAiICIgPDwgcHQyLnkgPDwgIiBsXG4iOwotCQkJCQkJCXNCdXR0b24gPDwgcHQzLnggPDwgIiAiIDw8IHB0My55IDw8ICIgbFxuIjsKLQkJCQkJCQlzQnV0dG9uIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiIGwgZlxuIjsKKyAgICAgICAgICAvLyBkcmF3IGlubmVyIGJvcmRlcgorICAgICAgICAgIHJjRHJhdyA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJlY3RXbmQsIDAuNWYpOworICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNEcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwgMjU1LCAyNTUsIDI1NSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wZik7CiAKLQkJCQkJCQlzQXBwU3RyZWFtIDw8IHNCdXR0b247CQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgU0JUX1ZTQ1JPTEw6Ci0JCQlzd2l0Y2godGhpcy0+bV9lU0JCdXR0b25UeXBlKQotCQkJewotCQkJCWNhc2UgUFNCVF9NSU46Ci0JCQkJCXsKLQkJCQkJCUNQREZfUG9pbnQgcHQxKHB0Q2VudGVyLnggLSBQV0xfVFJJQU5HTEVfSEFMRkxFTixwdENlbnRlci55IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmKTsKLQkJCQkJCUNQREZfUG9pbnQgcHQyKHB0Q2VudGVyLnggKyBQV0xfVFJJQU5HTEVfSEFMRkxFTixwdENlbnRlci55IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmKTsKLQkJCQkJCUNQREZfUG9pbnQgcHQzKHB0Q2VudGVyLngscHRDZW50ZXIueSArIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41Zik7CisgICAgICAgICAgLy8gZHJhdyBiYWNrZ3JvdW5kCiAKLQkJCQkJCWlmIChyZWN0V25kLnJpZ2h0IC0gcmVjdFduZC5sZWZ0ID4gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAyICYmCi0JCQkJCQkJcmVjdFduZC50b3AgLSByZWN0V25kLmJvdHRvbSA+IFBXTF9UUklBTkdMRV9IQUxGTEVOICkKLQkJCQkJCXsKLQkJCQkJCQlzQnV0dG9uIDw8ICIwIGdcbiI7Ci0JCQkJCQkJc0J1dHRvbiA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBtXG4iOwotCQkJCQkJCXNCdXR0b24gPDwgcHQyLnggPDwgIiAiIDw8IHB0Mi55IDw8ICIgbFxuIjsKLQkJCQkJCQlzQnV0dG9uIDw8IHB0My54IDw8ICIgIiA8PCBwdDMueSA8PCAiIGxcbiI7Ci0JCQkJCQkJc0J1dHRvbiA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBsIGZcbiI7CisgICAgICAgICAgcmNEcmF3ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmVjdFduZCwgMS4wZik7CiAKLQkJCQkJCQlzQXBwU3RyZWFtIDw8IHNCdXR0b247CQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUFNCVF9NQVg6Ci0JCQkJCXsKLQkJCQkJCUNQREZfUG9pbnQgcHQxKHB0Q2VudGVyLnggLSBQV0xfVFJJQU5HTEVfSEFMRkxFTixwdENlbnRlci55ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmKTsKLQkJCQkJCUNQREZfUG9pbnQgcHQyKHB0Q2VudGVyLnggKyBQV0xfVFJJQU5HTEVfSEFMRkxFTixwdENlbnRlci55ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmKTsKLQkJCQkJCUNQREZfUG9pbnQgcHQzKHB0Q2VudGVyLngscHRDZW50ZXIueSAtIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41Zik7CisgICAgICAgICAgaWYgKElzRW5hYmxlZCgpKQorICAgICAgICAgICAgQ1BXTF9VdGlsczo6RHJhd1NoYWRvdyhwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIFRSVUUsIEZBTFNFLCByY0RyYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5UcmFuc3BhcmFuY3ksIDgwLCAyMjApOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdGaWxsUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSkpOwogCi0JCQkJCQlpZiAocmVjdFduZC5yaWdodCAtIHJlY3RXbmQubGVmdCA+IFBXTF9UUklBTkdMRV9IQUxGTEVOICogMiAmJgotCQkJCQkJCXJlY3RXbmQudG9wIC0gcmVjdFduZC5ib3R0b20gPiBQV0xfVFJJQU5HTEVfSEFMRkxFTiApCi0JCQkJCQl7Ci0JCQkJCQkJc0J1dHRvbiA8PCAiMCBnXG4iOwotCQkJCQkJCXNCdXR0b24gPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IDw8ICIgbVxuIjsKLQkJCQkJCQlzQnV0dG9uIDw8IHB0Mi54IDw8ICIgIiA8PCBwdDIueSA8PCAiIGxcbiI7Ci0JCQkJCQkJc0J1dHRvbiA8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgPDwgIiBsXG4iOwotCQkJCQkJCXNCdXR0b24gPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IDw8ICIgbCBmXG4iOworICAgICAgICAgIC8vIGRyYXcgYXJyb3cKIAotCQkJCQkJCXNBcHBTdHJlYW0gPDwgc0J1dHRvbjsJCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCX0KKyAgICAgICAgICBpZiAocmVjdFduZC50b3AgLSByZWN0V25kLmJvdHRvbSA+IDYuMGYpIHsKKyAgICAgICAgICAgIEZYX0ZMT0FUIGZYID0gcmVjdFduZC5sZWZ0ICsgMS41ZjsKKyAgICAgICAgICAgIEZYX0ZMT0FUIGZZID0gcmVjdFduZC5ib3R0b207CisgICAgICAgICAgICBDUERGX1BvaW50IHB0c1s3XSA9IHtDUERGX1BvaW50KGZYICsgMi41ZiwgZlkgKyA0LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUG9pbnQoZlggKyAyLjVmLCBmWSArIDMuMGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Qb2ludChmWCArIDQuNWYsIGZZICsgNS4wZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BvaW50KGZYICsgNi41ZiwgZlkgKyAzLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUG9pbnQoZlggKyA2LjVmLCBmWSArIDQuMGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Qb2ludChmWCArIDQuNWYsIGZZICsgNi4wZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BvaW50KGZYICsgMi41ZiwgZlkgKyA0LjBmKX07CiAKLQlzQXBwU3RyZWFtIDw8ICJRXG4iOworICAgICAgICAgICAgaWYgKElzRW5hYmxlZCgpKQorICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3RmlsbEFyZWEoCisgICAgICAgICAgICAgICAgICBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0cywgNywKKyAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwgMjU1LCAyNTUsIDI1NSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3RmlsbEFyZWEocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdHMsIDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfREVGQVVMVF9IRUFWWUdSQVlDT0xPUiwgMjU1KSk7CisgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFBTQlRfTUFYOiB7CisgICAgICAgICAgLy8gZHJhdyBib3JkZXIKKyAgICAgICAgICBDUERGX1JlY3QgcmNEcmF3ID0gcmVjdFduZDsKKyAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdiRW5jb2RlKG5UcmFuc3BhcmFuY3ksIDEwMCwgMTAwLCAxMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMGYpOworCisgICAgICAgICAgLy8gZHJhdyBpbm5lciBib3JkZXIKKyAgICAgICAgICByY0RyYXcgPSBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0V25kLCAwLjVmKTsKKyAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdiRW5jb2RlKG5UcmFuc3BhcmFuY3ksIDI1NSwgMjU1LCAyNTUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMGYpOworCisgICAgICAgICAgLy8gZHJhdyBiYWNrZ3JvdW5kCisgICAgICAgICAgcmNEcmF3ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmVjdFduZCwgMS4wZik7CisgICAgICAgICAgaWYgKElzRW5hYmxlZCgpKQorICAgICAgICAgICAgQ1BXTF9VdGlsczo6RHJhd1NoYWRvdyhwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIFRSVUUsIEZBTFNFLCByY0RyYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5UcmFuc3BhcmFuY3ksIDgwLCAyMjApOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdGaWxsUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSkpOworCisgICAgICAgICAgLy8gZHJhdyBhcnJvdworCisgICAgICAgICAgaWYgKHJlY3RXbmQudG9wIC0gcmVjdFduZC5ib3R0b20gPiA2LjBmKSB7CisgICAgICAgICAgICBGWF9GTE9BVCBmWCA9IHJlY3RXbmQubGVmdCArIDEuNWY7CisgICAgICAgICAgICBGWF9GTE9BVCBmWSA9IHJlY3RXbmQuYm90dG9tOworCisgICAgICAgICAgICBDUERGX1BvaW50IHB0c1s3XSA9IHtDUERGX1BvaW50KGZYICsgMi41ZiwgZlkgKyA1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUG9pbnQoZlggKyAyLjVmLCBmWSArIDYuMGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Qb2ludChmWCArIDQuNWYsIGZZICsgNC4wZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BvaW50KGZYICsgNi41ZiwgZlkgKyA2LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUG9pbnQoZlggKyA2LjVmLCBmWSArIDUuMGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Qb2ludChmWCArIDQuNWYsIGZZICsgMy4wZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BvaW50KGZYICsgMi41ZiwgZlkgKyA1LjBmKX07CisKKyAgICAgICAgICAgIGlmIChJc0VuYWJsZWQoKSkKKyAgICAgICAgICAgICAgQ1BXTF9VdGlsczo6RHJhd0ZpbGxBcmVhKAorICAgICAgICAgICAgICAgICAgcERldmljZSwgcFVzZXIyRGV2aWNlLCBwdHMsIDcsCisgICAgICAgICAgICAgICAgICBBcmdiRW5jb2RlKG5UcmFuc3BhcmFuY3ksIDI1NSwgMjU1LCAyNTUpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgQ1BXTF9VdGlsczo6RHJhd0ZpbGxBcmVhKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRzLCA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0RFRkFVTFRfSEVBVllHUkFZQ09MT1IsIDI1NSkpOworICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBQU0JUX1BPUzogeworICAgICAgICAgIC8vIGRyYXcgYm9yZGVyCisgICAgICAgICAgQ1BERl9SZWN0IHJjRHJhdyA9IHJlY3RXbmQ7CisgICAgICAgICAgQ1BXTF9VdGlsczo6RHJhd1N0cm9rZVJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByY0RyYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LCAxMDAsIDEwMCwgMTAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjBmKTsKKworICAgICAgICAgIC8vIGRyYXcgaW5uZXIgYm9yZGVyCisgICAgICAgICAgcmNEcmF3ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmVjdFduZCwgMC41Zik7CisgICAgICAgICAgQ1BXTF9VdGlsczo6RHJhd1N0cm9rZVJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByY0RyYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LCAyNTUsIDI1NSwgMjU1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjBmKTsKKworICAgICAgICAgIGlmIChJc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgLy8gZHJhdyBzaGFkb3cgZWZmZWN0CisKKyAgICAgICAgICAgIENQREZfUG9pbnQgcHRUb3AgPSBDUERGX1BvaW50KHJlY3RXbmQubGVmdCwgcmVjdFduZC50b3AgLSAxLjBmKTsKKyAgICAgICAgICAgIENQREZfUG9pbnQgcHRCb3R0b20gPQorICAgICAgICAgICAgICAgIENQREZfUG9pbnQocmVjdFduZC5sZWZ0LCByZWN0V25kLmJvdHRvbSArIDEuMGYpOworCisgICAgICAgICAgICBwdFRvcC54ICs9IDEuNWY7CisgICAgICAgICAgICBwdEJvdHRvbS54ICs9IDEuNWY7CisKKyAgICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRUb3AsIHB0Qm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LCAyMTAsIDIxMCwgMjEwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMGYpOworCisgICAgICAgICAgICBwdFRvcC54ICs9IDEuMGY7CisgICAgICAgICAgICBwdEJvdHRvbS54ICs9IDEuMGY7CisKKyAgICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRUb3AsIHB0Qm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LCAyMjAsIDIyMCwgMjIwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMGYpOworCisgICAgICAgICAgICBwdFRvcC54ICs9IDEuMGY7CisgICAgICAgICAgICBwdEJvdHRvbS54ICs9IDEuMGY7CisKKyAgICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRUb3AsIHB0Qm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LCAyNDAsIDI0MCwgMjQwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMGYpOworCisgICAgICAgICAgICBwdFRvcC54ICs9IDEuMGY7CisgICAgICAgICAgICBwdEJvdHRvbS54ICs9IDEuMGY7CisKKyAgICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRUb3AsIHB0Qm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LCAyNDAsIDI0MCwgMjQwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMGYpOworCisgICAgICAgICAgICBwdFRvcC54ICs9IDEuMGY7CisgICAgICAgICAgICBwdEJvdHRvbS54ICs9IDEuMGY7CisKKyAgICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRUb3AsIHB0Qm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LCAyMTAsIDIxMCwgMjEwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMGYpOworCisgICAgICAgICAgICBwdFRvcC54ICs9IDEuMGY7CisgICAgICAgICAgICBwdEJvdHRvbS54ICs9IDEuMGY7CisKKyAgICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRUb3AsIHB0Qm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LCAxODAsIDE4MCwgMTgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMGYpOworCisgICAgICAgICAgICBwdFRvcC54ICs9IDEuMGY7CisgICAgICAgICAgICBwdEJvdHRvbS54ICs9IDEuMGY7CisKKyAgICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRUb3AsIHB0Qm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LCAxNTAsIDE1MCwgMTUwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMGYpOworCisgICAgICAgICAgICBwdFRvcC54ICs9IDEuMGY7CisgICAgICAgICAgICBwdEJvdHRvbS54ICs9IDEuMGY7CisKKyAgICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRUb3AsIHB0Qm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LCAxNTAsIDE1MCwgMTUwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMGYpOworCisgICAgICAgICAgICBwdFRvcC54ICs9IDEuMGY7CisgICAgICAgICAgICBwdEJvdHRvbS54ICs9IDEuMGY7CisKKyAgICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRUb3AsIHB0Qm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LCAxODAsIDE4MCwgMTgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMGYpOworCisgICAgICAgICAgICBwdFRvcC54ICs9IDEuMGY7CisgICAgICAgICAgICBwdEJvdHRvbS54ICs9IDEuMGY7CisKKyAgICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRUb3AsIHB0Qm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LCAyMTAsIDIxMCwgMjEwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMGYpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3RmlsbFJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByY0RyYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBkcmF3IGZyaWN0aW9uCisKKyAgICAgICAgICBpZiAocmVjdFduZC5IZWlnaHQoKSA+IDguMGYpIHsKKyAgICAgICAgICAgIEZYX0NPTE9SUkVGIGNyU3Ryb2tlID0gQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LCAxMjAsIDEyMCwgMTIwKTsKKyAgICAgICAgICAgIGlmICghSXNFbmFibGVkKCkpCisgICAgICAgICAgICAgIGNyU3Ryb2tlID0gQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoCisgICAgICAgICAgICAgICAgICBQV0xfREVGQVVMVF9IRUFWWUdSQVlDT0xPUiwgMjU1KTsKKworICAgICAgICAgICAgRlhfRkxPQVQgbkZyaWN0aW9uV2lkdGggPSA1LjBmOworICAgICAgICAgICAgRlhfRkxPQVQgbkZyaWN0aW9uSGVpZ2h0ID0gNS41ZjsKKworICAgICAgICAgICAgQ1BERl9Qb2ludCBwdExlZnQgPQorICAgICAgICAgICAgICAgIENQREZfUG9pbnQocHRDZW50ZXIueCAtIG5GcmljdGlvbldpZHRoIC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0Q2VudGVyLnkgLSBuRnJpY3Rpb25IZWlnaHQgLyAyLjBmICsgMC41Zik7CisgICAgICAgICAgICBDUERGX1BvaW50IHB0UmlnaHQgPQorICAgICAgICAgICAgICAgIENQREZfUG9pbnQocHRDZW50ZXIueCArIG5GcmljdGlvbldpZHRoIC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0Q2VudGVyLnkgLSBuRnJpY3Rpb25IZWlnaHQgLyAyLjBmICsgMC41Zik7CisKKyAgICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRMZWZ0LCBwdFJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JTdHJva2UsIDEuMGYpOworCisgICAgICAgICAgICBwdExlZnQueSArPSAyLjBmOworICAgICAgICAgICAgcHRSaWdodC55ICs9IDIuMGY7CisKKyAgICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRMZWZ0LCBwdFJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JTdHJva2UsIDEuMGYpOworCisgICAgICAgICAgICBwdExlZnQueSArPSAyLjBmOworICAgICAgICAgICAgcHRSaWdodC55ICs9IDIuMGY7CisKKyAgICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRMZWZ0LCBwdFJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JTdHJva2UsIDEuMGYpOworICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQogfQogCi12b2lkIENQV0xfU0JCdXR0b246OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKQotewotCWlmICghSXNWaXNpYmxlKCkpIHJldHVybjsKK0ZYX0JPT0wgQ1BXTF9TQkJ1dHRvbjo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIHsKKyAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsIG5GbGFnKTsKIAotCUNQREZfUmVjdCByZWN0V25kID0gR2V0V2luZG93UmVjdCgpOwotCWlmIChyZWN0V25kLklzRW1wdHkoKSkgcmV0dXJuOworICBpZiAoQ1BXTF9XbmQqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkKKyAgICBwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLCBQTk1fTEJVVFRPTkRPV04sIDAsIChpbnRwdHJfdCkmcG9pbnQpOwogCi0JQ1BERl9Qb2ludCBwdENlbnRlciA9IHRoaXMtPkdldENlbnRlclBvaW50KCk7Ci0JRlhfSU5UMzIgblRyYW5zcGFyYW5jeSA9IHRoaXMtPkdldFRyYW5zcGFyZW5jeSgpOworICBtX2JNb3VzZURvd24gPSBUUlVFOworICBTZXRDYXB0dXJlKCk7CiAKLQlzd2l0Y2ggKHRoaXMtPm1fZVNjcm9sbEJhclR5cGUpCi0JewotCWNhc2UgU0JUX0hTQ1JPTEw6Ci0JCUNQV0xfV25kOjpEcmF3VGhpc0FwcGVhcmFuY2UocERldmljZSxwVXNlcjJEZXZpY2UpOwotCQlzd2l0Y2ggKHRoaXMtPm1fZVNCQnV0dG9uVHlwZSkKLQkJewotCQljYXNlIFBTQlRfTUlOOgotCQkJewotCQkJCUNQREZfUG9pbnQgcHQxKHB0Q2VudGVyLnggLSBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYscHRDZW50ZXIueSk7Ci0JCQkJQ1BERl9Qb2ludCBwdDIocHRDZW50ZXIueCArIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41ZixwdENlbnRlci55ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4pOwotCQkJCUNQREZfUG9pbnQgcHQzKHB0Q2VudGVyLnggKyBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYscHRDZW50ZXIueSAtIFBXTF9UUklBTkdMRV9IQUxGTEVOKTsKLQotCQkJCWlmIChyZWN0V25kLnJpZ2h0IC0gcmVjdFduZC5sZWZ0ID4gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAyICYmCi0JCQkJCXJlY3RXbmQudG9wIC0gcmVjdFduZC5ib3R0b20gPiBQV0xfVFJJQU5HTEVfSEFMRkxFTiApCi0JCQkJewotCQkJCQlDRlhfUGF0aERhdGEgcGF0aDsKLQotCQkJCQlwYXRoLlNldFBvaW50Q291bnQoNCk7Ci0JCQkJCXBhdGguU2V0UG9pbnQoMCwgcHQxLngsIHB0MS55LCBGWFBUX01PVkVUTyk7Ci0JCQkJCXBhdGguU2V0UG9pbnQoMSwgcHQyLngsIHB0Mi55LCBGWFBUX0xJTkVUTyk7Ci0JCQkJCXBhdGguU2V0UG9pbnQoMiwgcHQzLngsIHB0My55LCBGWFBUX0xJTkVUTyk7Ci0JCQkJCXBhdGguU2V0UG9pbnQoMywgcHQxLngsIHB0MS55LCBGWFBUX0xJTkVUTyk7Ci0KLQkJCQkJcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgTlVMTCwgCi0JCQkJCQlDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihQV0xfREVGQVVMVF9CTEFDS0NPTE9SLG5UcmFuc3BhcmFuY3kpLCAKLQkJCQkJCTAsIEZYRklMTF9BTFRFUk5BVEUpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFBTQlRfTUFYOgotCQkJewotCQkJCUNQREZfUG9pbnQgcHQxKHB0Q2VudGVyLnggKyBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYscHRDZW50ZXIueSk7Ci0JCQkJQ1BERl9Qb2ludCBwdDIocHRDZW50ZXIueCAtIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41ZixwdENlbnRlci55ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4pOwotCQkJCUNQREZfUG9pbnQgcHQzKHB0Q2VudGVyLnggLSBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYscHRDZW50ZXIueSAtIFBXTF9UUklBTkdMRV9IQUxGTEVOKTsKLQotCQkJCWlmIChyZWN0V25kLnJpZ2h0IC0gcmVjdFduZC5sZWZ0ID4gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAyICYmCi0JCQkJCXJlY3RXbmQudG9wIC0gcmVjdFduZC5ib3R0b20gPiBQV0xfVFJJQU5HTEVfSEFMRkxFTiApCi0JCQkJewotCQkJCQlDRlhfUGF0aERhdGEgcGF0aDsKLQotCQkJCQlwYXRoLlNldFBvaW50Q291bnQoNCk7Ci0JCQkJCXBhdGguU2V0UG9pbnQoMCwgcHQxLngsIHB0MS55LCBGWFBUX01PVkVUTyk7Ci0JCQkJCXBhdGguU2V0UG9pbnQoMSwgcHQyLngsIHB0Mi55LCBGWFBUX0xJTkVUTyk7Ci0JCQkJCXBhdGguU2V0UG9pbnQoMiwgcHQzLngsIHB0My55LCBGWFBUX0xJTkVUTyk7Ci0JCQkJCXBhdGguU2V0UG9pbnQoMywgcHQxLngsIHB0MS55LCBGWFBUX0xJTkVUTyk7Ci0KLQkJCQkJcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgTlVMTCwgCi0JCQkJCQlDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihQV0xfREVGQVVMVF9CTEFDS0NPTE9SLG5UcmFuc3BhcmFuY3kpLCAKLQkJCQkJCTAsIEZYRklMTF9BTFRFUk5BVEUpOwkKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU0JUX1ZTQ1JPTEw6Ci0JCXN3aXRjaCh0aGlzLT5tX2VTQkJ1dHRvblR5cGUpCi0JCXsKLQkJY2FzZSBQU0JUX01JTjoKLQkJCXsKLQkJCQkvL2RyYXcgYm9yZGVyCi0JCQkJQ1BERl9SZWN0IHJjRHJhdyA9IHJlY3RXbmQ7Ci0JCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZVJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByY0RyYXcsIAotCQkJCQlBcmdiRW5jb2RlKG5UcmFuc3BhcmFuY3ksMTAwLDEwMCwxMDApLDAuMGYpOwotCi0JCQkJLy9kcmF3IGlubmVyIGJvcmRlcgotCQkJCXJjRHJhdyA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJlY3RXbmQsMC41Zik7Ci0JCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZVJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByY0RyYXcsIAotCQkJCQlBcmdiRW5jb2RlKG5UcmFuc3BhcmFuY3ksMjU1LDI1NSwyNTUpLDEuMGYpOwotCi0JCQkJLy9kcmF3IGJhY2tncm91bmQKLQotCQkJCXJjRHJhdyA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJlY3RXbmQsMS4wZik7Ci0KLQkJCQlpZiAodGhpcy0+SXNFbmFibGVkKCkpCi0JCQkJCUNQV0xfVXRpbHM6OkRyYXdTaGFkb3cocERldmljZSwgcFVzZXIyRGV2aWNlLCBUUlVFLCBGQUxTRSwgcmNEcmF3LCBuVHJhbnNwYXJhbmN5LCA4MCwgMjIwKTsKLQkJCQllbHNlCi0JCQkJCUNQV0xfVXRpbHM6OkRyYXdGaWxsUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywgQXJnYkVuY29kZSgyNTUsMjU1LDI1NSwyNTUpKTsKLQotCQkJCS8vZHJhdyBhcnJvdwotCi0JCQkJaWYgKHJlY3RXbmQudG9wIC0gcmVjdFduZC5ib3R0b20gPiA2LjBmICkKLQkJCQl7Ci0JCQkJCUZYX0ZMT0FUIGZYID0gcmVjdFduZC5sZWZ0ICsgMS41ZjsKLQkJCQkJRlhfRkxPQVQgZlkgPSByZWN0V25kLmJvdHRvbTsKLQkJCQkJQ1BERl9Qb2ludCBwdHNbN10gPSB7Ci0JCQkJCQkJCUNQREZfUG9pbnQoZlgrMi41ZiwgZlkrNC4wZiksCi0JCQkJCQkJCUNQREZfUG9pbnQoZlgrMi41ZiwgZlkrMy4wZiksCi0JCQkJCQkJCUNQREZfUG9pbnQoZlgrNC41ZiwgZlkrNS4wZiksCi0JCQkJCQkJCUNQREZfUG9pbnQoZlgrNi41ZiwgZlkrMy4wZiksCi0JCQkJCQkJCUNQREZfUG9pbnQoZlgrNi41ZiwgZlkrNC4wZiksCi0JCQkJCQkJCUNQREZfUG9pbnQoZlgrNC41ZiwgZlkrNi4wZiksCi0JCQkJCQkJCUNQREZfUG9pbnQoZlgrMi41ZiwgZlkrNC4wZil9OwotCQkJCQkKLQotCQkJCQlpZiAodGhpcy0+SXNFbmFibGVkKCkpCi0JCQkJCQlDUFdMX1V0aWxzOjpEcmF3RmlsbEFyZWEocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdHMsIDcsIEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwyNTUsMjU1LDI1NSkpOwotCQkJCQllbHNlCi0JCQkJCQlDUFdMX1V0aWxzOjpEcmF3RmlsbEFyZWEocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdHMsIDcsIAotCQkJCQkJCUNQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKFBXTF9ERUZBVUxUX0hFQVZZR1JBWUNPTE9SLDI1NSkpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFBTQlRfTUFYOgotCQkJewotCQkJCS8vZHJhdyBib3JkZXIKLQkJCQlDUERGX1JlY3QgcmNEcmF3ID0gcmVjdFduZDsKLQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywgCi0JCQkJCUFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwxMDAsMTAwLDEwMCksMC4wZik7Ci0JCQkJCi0JCQkJLy9kcmF3IGlubmVyIGJvcmRlcgotCQkJCXJjRHJhdyA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJlY3RXbmQsMC41Zik7Ci0JCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZVJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByY0RyYXcsIAotCQkJCQlBcmdiRW5jb2RlKG5UcmFuc3BhcmFuY3ksMjU1LDI1NSwyNTUpLDEuMGYpOwotCi0JCQkJLy9kcmF3IGJhY2tncm91bmQKLQkJCQlyY0RyYXcgPSBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0V25kLDEuMGYpOwotCQkJCWlmICh0aGlzLT5Jc0VuYWJsZWQoKSkKLQkJCQkJQ1BXTF9VdGlsczo6RHJhd1NoYWRvdyhwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIFRSVUUsIEZBTFNFLCByY0RyYXcsIG5UcmFuc3BhcmFuY3ksIDgwLCAyMjApOwotCQkJCWVsc2UKLQkJCQkJQ1BXTF9VdGlsczo6RHJhd0ZpbGxSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNEcmF3LCBBcmdiRW5jb2RlKDI1NSwyNTUsMjU1LDI1NSkpOwotCi0JCQkJLy9kcmF3IGFycm93Ci0KLQkJCQlpZiAocmVjdFduZC50b3AgLSByZWN0V25kLmJvdHRvbSA+IDYuMGYgKQotCQkJCXsKLQkJCQkJRlhfRkxPQVQgZlggPSByZWN0V25kLmxlZnQgKyAxLjVmOwotCQkJCQlGWF9GTE9BVCBmWSA9IHJlY3RXbmQuYm90dG9tOwotCi0JCQkJCUNQREZfUG9pbnQgcHRzWzddID0gewotCQkJCQkJCQlDUERGX1BvaW50KGZYKzIuNWYsIGZZKzUuMGYpLAotCQkJCQkJCQlDUERGX1BvaW50KGZYKzIuNWYsIGZZKzYuMGYpLAotCQkJCQkJCQlDUERGX1BvaW50KGZYKzQuNWYsIGZZKzQuMGYpLAotCQkJCQkJCQlDUERGX1BvaW50KGZYKzYuNWYsIGZZKzYuMGYpLAotCQkJCQkJCQlDUERGX1BvaW50KGZYKzYuNWYsIGZZKzUuMGYpLAotCQkJCQkJCQlDUERGX1BvaW50KGZYKzQuNWYsIGZZKzMuMGYpLAotCQkJCQkJCQlDUERGX1BvaW50KGZYKzIuNWYsIGZZKzUuMGYpfTsKLQkJCQkJCi0KLQkJCQkJaWYgKHRoaXMtPklzRW5hYmxlZCgpKQotCQkJCQkJQ1BXTF9VdGlsczo6RHJhd0ZpbGxBcmVhKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRzLCA3LCBBcmdiRW5jb2RlKG5UcmFuc3BhcmFuY3ksMjU1LDI1NSwyNTUpKTsKLQkJCQkJZWxzZQotCQkJCQkJQ1BXTF9VdGlsczo6RHJhd0ZpbGxBcmVhKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRzLCA3LCAKLQkJCQkJCQlDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihQV0xfREVGQVVMVF9IRUFWWUdSQVlDT0xPUiwyNTUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBQU0JUX1BPUzoKLQkJCXsKLQkJCQkvL0NQV0xfV25kOjpEcmF3VGhpc0FwcGVhcmFuY2UocERldmljZSxwVXNlcjJEZXZpY2UpOwotCi0JCQkJLy9kcmF3IGJvcmRlcgotCQkJCUNQREZfUmVjdCByY0RyYXcgPSByZWN0V25kOwotCQkJCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNEcmF3LCAKLQkJCQkJQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LDEwMCwxMDAsMTAwKSwwLjBmKTsKLQkJCQkKLQkJCQkvL2RyYXcgaW5uZXIgYm9yZGVyCi0JCQkJcmNEcmF3ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmVjdFduZCwwLjVmKTsKLQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywgCi0JCQkJCUFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwyNTUsMjU1LDI1NSksMS4wZik7Ci0KLQkJCQlpZiAodGhpcy0+SXNFbmFibGVkKCkpCi0JCQkJewotCQkJCQkvL2RyYXcgc2hhZG93IGVmZmVjdAkJCQkJCQotCQkJCQkKLQkJCQkJQ1BERl9Qb2ludCBwdFRvcCA9IENQREZfUG9pbnQocmVjdFduZC5sZWZ0LHJlY3RXbmQudG9wLTEuMGYpOwotCQkJCQlDUERGX1BvaW50IHB0Qm90dG9tID0gQ1BERl9Qb2ludChyZWN0V25kLmxlZnQscmVjdFduZC5ib3R0b20rMS4wZik7Ci0KLQkJCQkJcHRUb3AueCArPSAxLjVmOwotCQkJCQlwdEJvdHRvbS54ICs9IDEuNWY7Ci0JCQkJCQotCQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0VG9wLCBwdEJvdHRvbSwgCi0JCQkJCQlBcmdiRW5jb2RlKG5UcmFuc3BhcmFuY3ksMjEwLDIxMCwyMTApLDEuMGYpOwotCi0JCQkJCXB0VG9wLnggKz0gMS4wZjsKLQkJCQkJcHRCb3R0b20ueCArPSAxLjBmOwotCQkJCQkKLQkJCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdFRvcCwgcHRCb3R0b20sIAotCQkJCQkJQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LDIyMCwyMjAsMjIwKSwxLjBmKTsKLQotCQkJCQlwdFRvcC54ICs9IDEuMGY7Ci0JCQkJCXB0Qm90dG9tLnggKz0gMS4wZjsKLQkJCQkJCi0JCQkJCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRUb3AsIHB0Qm90dG9tLCAKLQkJCQkJCUFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwyNDAsMjQwLDI0MCksMS4wZik7Ci0KLQkJCQkJcHRUb3AueCArPSAxLjBmOwotCQkJCQlwdEJvdHRvbS54ICs9IDEuMGY7Ci0JCQkJCQotCQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0VG9wLCBwdEJvdHRvbSwgCi0JCQkJCQlBcmdiRW5jb2RlKG5UcmFuc3BhcmFuY3ksMjQwLDI0MCwyNDApLDEuMGYpOwotCi0JCQkJCXB0VG9wLnggKz0gMS4wZjsKLQkJCQkJcHRCb3R0b20ueCArPSAxLjBmOwotCQkJCQkKLQkJCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdFRvcCwgcHRCb3R0b20sIAotCQkJCQkJQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LDIxMCwyMTAsMjEwKSwxLjBmKTsKLQotCQkJCQlwdFRvcC54ICs9IDEuMGY7Ci0JCQkJCXB0Qm90dG9tLnggKz0gMS4wZjsKLQkJCQkJCi0JCQkJCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRUb3AsIHB0Qm90dG9tLCAKLQkJCQkJCUFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwxODAsMTgwLDE4MCksMS4wZik7Ci0KLQkJCQkJcHRUb3AueCArPSAxLjBmOwotCQkJCQlwdEJvdHRvbS54ICs9IDEuMGY7Ci0JCQkJCQotCQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0VG9wLCBwdEJvdHRvbSwgCi0JCQkJCQlBcmdiRW5jb2RlKG5UcmFuc3BhcmFuY3ksMTUwLDE1MCwxNTApLDEuMGYpOwotCi0JCQkJCXB0VG9wLnggKz0gMS4wZjsKLQkJCQkJcHRCb3R0b20ueCArPSAxLjBmOwotCQkJCQkKLQkJCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdFRvcCwgcHRCb3R0b20sIAotCQkJCQkJQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LDE1MCwxNTAsMTUwKSwxLjBmKTsKLQotCQkJCQlwdFRvcC54ICs9IDEuMGY7Ci0JCQkJCXB0Qm90dG9tLnggKz0gMS4wZjsKLQkJCQkJCi0JCQkJCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRUb3AsIHB0Qm90dG9tLCAKLQkJCQkJCUFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwxODAsMTgwLDE4MCksMS4wZik7Ci0KLQkJCQkJcHRUb3AueCArPSAxLjBmOwotCQkJCQlwdEJvdHRvbS54ICs9IDEuMGY7Ci0JCQkJCQotCQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0VG9wLCBwdEJvdHRvbSwgCi0JCQkJCQlBcmdiRW5jb2RlKG5UcmFuc3BhcmFuY3ksMjEwLDIxMCwyMTApLDEuMGYpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlDUFdMX1V0aWxzOjpEcmF3RmlsbFJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByY0RyYXcsIEFyZ2JFbmNvZGUoMjU1LDI1NSwyNTUsMjU1KSk7Ci0JCQkJfQotCi0JCQkJLy9kcmF3IGZyaWN0aW9uCi0KLQkJCQlpZiAocmVjdFduZC5IZWlnaHQoKSA+IDguMGYpCi0JCQkJewotCQkJCQlGWF9DT0xPUlJFRiBjclN0cm9rZSA9IEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwxMjAsMTIwLDEyMCk7Ci0JCQkJCWlmICghdGhpcy0+SXNFbmFibGVkKCkpCi0JCQkJCQljclN0cm9rZSA9IENQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKFBXTF9ERUZBVUxUX0hFQVZZR1JBWUNPTE9SLDI1NSk7Ci0KLQkJCQkJRlhfRkxPQVQgbkZyaWN0aW9uV2lkdGggPSA1LjBmOwotCQkJCQlGWF9GTE9BVCBuRnJpY3Rpb25IZWlnaHQgPSA1LjVmOwotCi0JCQkJCUNQREZfUG9pbnQgcHRMZWZ0ID0gQ1BERl9Qb2ludChwdENlbnRlci54IC0gbkZyaWN0aW9uV2lkdGggLyAyLjBmLCBwdENlbnRlci55IC0gbkZyaWN0aW9uSGVpZ2h0IC8gMi4wZiArIDAuNWYpOwotCQkJCQlDUERGX1BvaW50IHB0UmlnaHQgPSBDUERGX1BvaW50KHB0Q2VudGVyLnggKyBuRnJpY3Rpb25XaWR0aCAvIDIuMGYsIHB0Q2VudGVyLnkgLSBuRnJpY3Rpb25IZWlnaHQgLyAyLjBmICsgMC41Zik7Ci0KLQkJCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdExlZnQsIHB0UmlnaHQsIAotCQkJCQkJY3JTdHJva2UsMS4wZik7Ci0KLQkJCQkJcHRMZWZ0LnkgKz0gMi4wZjsKLQkJCQkJcHRSaWdodC55ICs9IDIuMGY7Ci0KLQkJCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdExlZnQsIHB0UmlnaHQsIAotCQkJCQkJY3JTdHJva2UsMS4wZik7Ci0KLQkJCQkJcHRMZWZ0LnkgKz0gMi4wZjsKLQkJCQkJcHRSaWdodC55ICs9IDIuMGY7Ci0KLQkJCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdExlZnQsIHB0UmlnaHQsIAotCQkJCQkJY3JTdHJva2UsMS4wZik7Ci0KLQkJCQkJLyoKLQkJCQkJcHRMZWZ0LnkgKz0gMS41ZjsKLQkJCQkJcHRSaWdodC55ICs9IDEuNWY7Ci0KLQkJCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdExlZnQsIHB0UmlnaHQsIAotCQkJCQkJQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LDE1MCwxNTAsMTUwKSwxLjBmKTsKLQkJCQkJCSovCi0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIENQV0xfU0JCdXR0b246Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKLXsKLQlDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCxuRmxhZyk7CitGWF9CT09MIENQV0xfU0JCdXR0b246Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgeworICBDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsIG5GbGFnKTsKIAotCWlmIChDUFdMX1duZCAqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkKLQkJcFBhcmVudC0+T25Ob3RpZnkodGhpcyxQTk1fTEJVVFRPTkRPV04sMCwoRlhfSU5UUFRSKSZwb2ludCk7CisgIGlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKQorICAgIHBQYXJlbnQtPk9uTm90aWZ5KHRoaXMsIFBOTV9MQlVUVE9OVVAsIDAsIChpbnRwdHJfdCkmcG9pbnQpOwogCi0JbV9iTW91c2VEb3duID0gVFJVRTsKLQlTZXRDYXB0dXJlKCk7CisgIG1fYk1vdXNlRG93biA9IEZBTFNFOworICBSZWxlYXNlQ2FwdHVyZSgpOwogCi0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIENQV0xfU0JCdXR0b246Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JQ1BXTF9XbmQ6Ok9uTEJ1dHRvblVwKHBvaW50LG5GbGFnKTsKK0ZYX0JPT0wgQ1BXTF9TQkJ1dHRvbjo6T25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSB7CisgIENQV0xfV25kOjpPbk1vdXNlTW92ZShwb2ludCwgbkZsYWcpOwogCi0JaWYgKENQV0xfV25kICogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKQotCQlwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLFBOTV9MQlVUVE9OVVAsMCwoRlhfSU5UUFRSKSZwb2ludCk7CisgIGlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKSB7CisgICAgcFBhcmVudC0+T25Ob3RpZnkodGhpcywgUE5NX01PVVNFTU9WRSwgMCwgKGludHB0cl90KSZwb2ludCk7CisgIH0KIAotCW1fYk1vdXNlRG93biA9IEZBTFNFOwotCVJlbGVhc2VDYXB0dXJlKCk7Ci0KLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUZYX0JPT0wgQ1BXTF9TQkJ1dHRvbjo6T25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKLXsKLQlDUFdMX1duZDo6T25Nb3VzZU1vdmUocG9pbnQsbkZsYWcpOworQ1BXTF9TY3JvbGxCYXI6OkNQV0xfU2Nyb2xsQmFyKFBXTF9TQ1JPTExCQVJfVFlQRSBzYlR5cGUpCisgICAgOiBtX3NiVHlwZShzYlR5cGUpLAorICAgICAgbV9wTWluQnV0dG9uKE5VTEwpLAorICAgICAgbV9wTWF4QnV0dG9uKE5VTEwpLAorICAgICAgbV9wUG9zQnV0dG9uKE5VTEwpLAorICAgICAgbV9iTW91c2VEb3duKEZBTFNFKSwKKyAgICAgIG1fYk1pbk9yTWF4KEZBTFNFKSwKKyAgICAgIG1fYk5vdGlmeUZvcmV2ZXIoVFJVRSkge30KIAotCWlmIChDUFdMX1duZCAqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkKLQl7CQkKLQkJcFBhcmVudC0+T25Ob3RpZnkodGhpcyxQTk1fTU9VU0VNT1ZFLDAsKEZYX0lOVFBUUikmcG9pbnQpOworQ1BXTF9TY3JvbGxCYXI6On5DUFdMX1Njcm9sbEJhcigpIHt9CiAKLQkJLyoKLQkJaWYgKG1fYk1vdXNlRG93biAmJiAobV9lU0JCdXR0b25UeXBlID09IFBTQlRfTUlOIHx8IG1fZVNCQnV0dG9uVHlwZSA9PSBQU0JUX01BWCkpCi0JCXsKLQkJCWlmICghcFBhcmVudC0+T25Ob3RpZnkodGhpcyxQTk1fTEJVVFRPTkRPV04sbkZsYWdzLChGWF9JTlRQVFIpJnBvaW50KSkKLQkJCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQkJKi8KLQl9Ci0KLQlyZXR1cm4gVFJVRTsKK0NGWF9CeXRlU3RyaW5nIENQV0xfU2Nyb2xsQmFyOjpHZXRDbGFzc05hbWUoKSBjb25zdCB7CisgIHJldHVybiAiQ1BXTF9TY3JvbGxCYXIiOwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfU2Nyb2xsQmFyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotQ1BXTF9TY3JvbGxCYXI6OkNQV0xfU2Nyb2xsQmFyKFBXTF9TQ1JPTExCQVJfVFlQRSBzYlR5cGUpOgotCW1fc2JUeXBlKHNiVHlwZSksCi0JbV9wTWluQnV0dG9uKE5VTEwpLAotCW1fcE1heEJ1dHRvbihOVUxMKSwKLQltX3BQb3NCdXR0b24oTlVMTCksCi0JbV9iTW91c2VEb3duKEZBTFNFKSwKLQltX2JNaW5Pck1heChGQUxTRSksCi0JbV9iTm90aWZ5Rm9yZXZlcihUUlVFKQotewordm9pZCBDUFdMX1Njcm9sbEJhcjo6T25DcmVhdGUoUFdMX0NSRUFURVBBUkFNJiBjcCkgeworICBjcC5lQ3Vyc29yVHlwZSA9IEZYQ1RfQVJST1c7CiB9CiAKLUNQV0xfU2Nyb2xsQmFyOjp+Q1BXTF9TY3JvbGxCYXIoKQotewordm9pZCBDUFdMX1Njcm9sbEJhcjo6UmVQb3NDaGlsZFduZCgpIHsKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworICBDUERGX1JlY3QgcmNNaW5CdXR0b24sIHJjTWF4QnV0dG9uOworICBGWF9GTE9BVCBmQldpZHRoID0gMDsKKworICBzd2l0Y2ggKG1fc2JUeXBlKSB7CisgICAgY2FzZSBTQlRfSFNDUk9MTDoKKyAgICAgIGlmIChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQgPgorICAgICAgICAgIFBXTF9TQ1JPTExCQVJfQlVUVE9OX1dJRFRIICogMiArIFBXTF9TQ1JPTExCQVJfUE9TQlVUVE9OX01JTldJRFRIICsKKyAgICAgICAgICAgICAgMikgeworICAgICAgICByY01pbkJ1dHRvbiA9CisgICAgICAgICAgICBDUERGX1JlY3QocmNDbGllbnQubGVmdCwgcmNDbGllbnQuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LmxlZnQgKyBQV0xfU0NST0xMQkFSX0JVVFRPTl9XSURUSCwgcmNDbGllbnQudG9wKTsKKyAgICAgICAgcmNNYXhCdXR0b24gPSBDUERGX1JlY3QocmNDbGllbnQucmlnaHQgLSBQV0xfU0NST0xMQkFSX0JVVFRPTl9XSURUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDbGllbnQuYm90dG9tLCByY0NsaWVudC5yaWdodCwgcmNDbGllbnQudG9wKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZCV2lkdGggPSAocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0IC0KKyAgICAgICAgICAgICAgICAgICBQV0xfU0NST0xMQkFSX1BPU0JVVFRPTl9NSU5XSURUSCAtIDIpIC8KKyAgICAgICAgICAgICAgICAgIDI7CisKKyAgICAgICAgaWYgKGZCV2lkdGggPiAwKSB7CisgICAgICAgICAgcmNNaW5CdXR0b24gPSBDUERGX1JlY3QocmNDbGllbnQubGVmdCwgcmNDbGllbnQuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LmxlZnQgKyBmQldpZHRoLCByY0NsaWVudC50b3ApOworICAgICAgICAgIHJjTWF4QnV0dG9uID0gQ1BERl9SZWN0KHJjQ2xpZW50LnJpZ2h0IC0gZkJXaWR0aCwgcmNDbGllbnQuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LnJpZ2h0LCByY0NsaWVudC50b3ApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFNldFZpc2libGUoRkFMU0UpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFNCVF9WU0NST0xMOgorICAgICAgaWYgKElzRmxvYXRCaWdnZXIocmNDbGllbnQudG9wIC0gcmNDbGllbnQuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgUFdMX1NDUk9MTEJBUl9CVVRUT05fV0lEVEggKiAyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfU0NST0xMQkFSX1BPU0JVVFRPTl9NSU5XSURUSCArIDIpKSB7CisgICAgICAgIHJjTWluQnV0dG9uID0KKyAgICAgICAgICAgIENQREZfUmVjdChyY0NsaWVudC5sZWZ0LCByY0NsaWVudC50b3AgLSBQV0xfU0NST0xMQkFSX0JVVFRPTl9XSURUSCwKKyAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5yaWdodCwgcmNDbGllbnQudG9wKTsKKyAgICAgICAgcmNNYXhCdXR0b24gPSBDUERGX1JlY3QocmNDbGllbnQubGVmdCwgcmNDbGllbnQuYm90dG9tLCByY0NsaWVudC5yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDbGllbnQuYm90dG9tICsgUFdMX1NDUk9MTEJBUl9CVVRUT05fV0lEVEgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZkJXaWR0aCA9IChyY0NsaWVudC50b3AgLSByY0NsaWVudC5ib3R0b20gLQorICAgICAgICAgICAgICAgICAgIFBXTF9TQ1JPTExCQVJfUE9TQlVUVE9OX01JTldJRFRIIC0gMikgLworICAgICAgICAgICAgICAgICAgMjsKKworICAgICAgICBpZiAoSXNGbG9hdEJpZ2dlcihmQldpZHRoLCAwKSkgeworICAgICAgICAgIHJjTWluQnV0dG9uID0gQ1BERl9SZWN0KHJjQ2xpZW50LmxlZnQsIHJjQ2xpZW50LnRvcCAtIGZCV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDbGllbnQucmlnaHQsIHJjQ2xpZW50LnRvcCk7CisgICAgICAgICAgcmNNYXhCdXR0b24gPSBDUERGX1JlY3QocmNDbGllbnQubGVmdCwgcmNDbGllbnQuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LnJpZ2h0LCByY0NsaWVudC5ib3R0b20gKyBmQldpZHRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBTZXRWaXNpYmxlKEZBTFNFKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAobV9wTWluQnV0dG9uKQorICAgIG1fcE1pbkJ1dHRvbi0+TW92ZShyY01pbkJ1dHRvbiwgVFJVRSwgRkFMU0UpOworICBpZiAobV9wTWF4QnV0dG9uKQorICAgIG1fcE1heEJ1dHRvbi0+TW92ZShyY01heEJ1dHRvbiwgVFJVRSwgRkFMU0UpOworICBNb3ZlUG9zQnV0dG9uKEZBTFNFKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9TY3JvbGxCYXI6OkdldENsYXNzTmFtZSgpIGNvbnN0Ci17Ci0JcmV0dXJuICJDUFdMX1Njcm9sbEJhciI7Cit2b2lkIENQV0xfU2Nyb2xsQmFyOjpHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYmIHNBcHBTdHJlYW0pIHsKKyAgQ1BERl9SZWN0IHJlY3RXbmQgPSBHZXRXaW5kb3dSZWN0KCk7CisKKyAgaWYgKElzVmlzaWJsZSgpICYmICFyZWN0V25kLklzRW1wdHkoKSkgeworICAgIENGWF9CeXRlVGV4dEJ1ZiBzQnV0dG9uOworCisgICAgc0J1dHRvbiA8PCAicVxuIjsKKyAgICBzQnV0dG9uIDw8ICIwIHdcbiIKKyAgICAgICAgICAgIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJhY2tncm91bmRDb2xvcigpLCBUUlVFKTsKKyAgICBzQnV0dG9uIDw8IHJlY3RXbmQubGVmdCA8PCAiICIgPDwgcmVjdFduZC5ib3R0b20gPDwgIiAiCisgICAgICAgICAgICA8PCByZWN0V25kLnJpZ2h0IC0gcmVjdFduZC5sZWZ0IDw8ICIgIgorICAgICAgICAgICAgPDwgcmVjdFduZC50b3AgLSByZWN0V25kLmJvdHRvbSA8PCAiIHJlIGIgUVxuIjsKKworICAgIHNBcHBTdHJlYW0gPDwgc0J1dHRvbjsKKyAgfQogfQogCi12b2lkIENQV0xfU2Nyb2xsQmFyOjpPbkNyZWF0ZShQV0xfQ1JFQVRFUEFSQU0gJiBjcCkKLXsKLQljcC5lQ3Vyc29yVHlwZSA9IEZYQ1RfQVJST1c7Cit2b2lkIENQV0xfU2Nyb2xsQmFyOjpEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UpIHsKKyAgQ1BERl9SZWN0IHJlY3RXbmQgPSBHZXRXaW5kb3dSZWN0KCk7CisKKyAgaWYgKElzVmlzaWJsZSgpICYmICFyZWN0V25kLklzRW1wdHkoKSkgeworICAgIENQV0xfVXRpbHM6OkRyYXdGaWxsUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJlY3RXbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJhY2tncm91bmRDb2xvcigpLCBHZXRUcmFuc3BhcmVuY3koKSk7CisKKyAgICBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZSgKKyAgICAgICAgcERldmljZSwgcFVzZXIyRGV2aWNlLAorICAgICAgICBDUERGX1BvaW50KHJlY3RXbmQubGVmdCArIDIuMGYsIHJlY3RXbmQudG9wIC0gMi4wZiksCisgICAgICAgIENQREZfUG9pbnQocmVjdFduZC5sZWZ0ICsgMi4wZiwgcmVjdFduZC5ib3R0b20gKyAyLjBmKSwKKyAgICAgICAgQXJnYkVuY29kZShHZXRUcmFuc3BhcmVuY3koKSwgMTAwLCAxMDAsIDEwMCksIDEuMGYpOworCisgICAgQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUoCisgICAgICAgIHBEZXZpY2UsIHBVc2VyMkRldmljZSwKKyAgICAgICAgQ1BERl9Qb2ludChyZWN0V25kLnJpZ2h0IC0gMi4wZiwgcmVjdFduZC50b3AgLSAyLjBmKSwKKyAgICAgICAgQ1BERl9Qb2ludChyZWN0V25kLnJpZ2h0IC0gMi4wZiwgcmVjdFduZC5ib3R0b20gKyAyLjBmKSwKKyAgICAgICAgQXJnYkVuY29kZShHZXRUcmFuc3BhcmVuY3koKSwgMTAwLCAxMDAsIDEwMCksIDEuMGYpOworICB9CiB9CiAKLXZvaWQgQ1BXTF9TY3JvbGxCYXI6OlJlUG9zQ2hpbGRXbmQoKQotewotCUNQREZfUmVjdCByY0NsaWVudCA9IHRoaXMtPkdldENsaWVudFJlY3QoKTsKK0ZYX0JPT0wgQ1BXTF9TY3JvbGxCYXI6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKSB7CisgIENQV0xfV25kOjpPbkxCdXR0b25Eb3duKHBvaW50LCBuRmxhZyk7CiAKLS8qCi0Jc3dpdGNoKG1fc2JUeXBlKQotCXsKLQkJY2FzZSBTQlRfSFNDUk9MTDoKLQkJCWlmIChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQgPCBQV0xfU0NST0xMQkFSX1dJRFRIIHx8Ci0JCQkJcmNDbGllbnQudG9wIC0gcmNDbGllbnQuYm90dG9tIDwgUFdMX1NDUk9MTEJBUl9XSURUSCkKLQkJCXsKLQkJCQlTZXRWaXNpYmxlKEZBTFNFKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFNCVF9WU0NST0xMOgotCQkJaWYgKHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCA8IFBXTF9TQ1JPTExCQVJfV0lEVEggfHwKLQkJCQlyY0NsaWVudC50b3AgLSByY0NsaWVudC5ib3R0b20gPCBQV0xfU0NST0xMQkFSX1dJRFRIKQotCQkJewotCQkJCVNldFZpc2libGUoRkFMU0UpOwotCQkJfQotCQkJYnJlYWs7Ci0JfQkKLSovCi0JQ1BERl9SZWN0IHJjTWluQnV0dG9uLHJjTWF4QnV0dG9uOworICBpZiAoSGFzRmxhZyhQV1NfQVVUT1RSQU5TUEFSRU5UKSkgeworICAgIGlmIChHZXRUcmFuc3BhcmVuY3koKSAhPSAyNTUpIHsKKyAgICAgIFNldFRyYW5zcGFyZW5jeSgyNTUpOworICAgICAgSW52YWxpZGF0ZVJlY3QoKTsKKyAgICB9CisgIH0KIAotCUZYX0ZMT0FUIGZCV2lkdGggPSAwOworICBDUERGX1JlY3QgcmNNaW5BcmVhLCByY01heEFyZWE7CiAKLQlzd2l0Y2ggKG1fc2JUeXBlKQotCXsKLQljYXNlIFNCVF9IU0NST0xMOgotCQlpZiAocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0ID4gUFdMX1NDUk9MTEJBUl9CVVRUT05fV0lEVEggKiAyICsgUFdMX1NDUk9MTEJBUl9QT1NCVVRUT05fTUlOV0lEVEggKyAyKQotCQl7Ci0JCQlyY01pbkJ1dHRvbiA9IENQREZfUmVjdChyY0NsaWVudC5sZWZ0LHJjQ2xpZW50LmJvdHRvbSwKLQkJCQlyY0NsaWVudC5sZWZ0ICsgUFdMX1NDUk9MTEJBUl9CVVRUT05fV0lEVEgscmNDbGllbnQudG9wKTsKLQkJCXJjTWF4QnV0dG9uID0gQ1BERl9SZWN0KHJjQ2xpZW50LnJpZ2h0IC0gUFdMX1NDUk9MTEJBUl9CVVRUT05fV0lEVEgscmNDbGllbnQuYm90dG9tLAotCQkJCXJjQ2xpZW50LnJpZ2h0LHJjQ2xpZW50LnRvcCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlmQldpZHRoID0gKHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCAtIFBXTF9TQ1JPTExCQVJfUE9TQlVUVE9OX01JTldJRFRIIC0gMikgLyAyOworICBpZiAobV9wUG9zQnV0dG9uICYmIG1fcFBvc0J1dHRvbi0+SXNWaXNpYmxlKCkpIHsKKyAgICBDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CisgICAgQ1BERl9SZWN0IHJjUG9zQnV0dG9uID0gbV9wUG9zQnV0dG9uLT5HZXRXaW5kb3dSZWN0KCk7CiAKLQkJCWlmIChmQldpZHRoID4gMCkKLQkJCXsKLQkJCQlyY01pbkJ1dHRvbiA9IENQREZfUmVjdChyY0NsaWVudC5sZWZ0LHJjQ2xpZW50LmJvdHRvbSwKLQkJCQkJcmNDbGllbnQubGVmdCArIGZCV2lkdGgscmNDbGllbnQudG9wKTsKLQkJCQlyY01heEJ1dHRvbiA9IENQREZfUmVjdChyY0NsaWVudC5yaWdodCAtIGZCV2lkdGgscmNDbGllbnQuYm90dG9tLAotCQkJCQlyY0NsaWVudC5yaWdodCxyY0NsaWVudC50b3ApOwotCQkJfQotCQkJZWxzZSBTZXRWaXNpYmxlKEZBTFNFKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNCVF9WU0NST0xMOgotCQlpZiAoSXNGbG9hdEJpZ2dlcihyY0NsaWVudC50b3AgLSByY0NsaWVudC5ib3R0b20sIFBXTF9TQ1JPTExCQVJfQlVUVE9OX1dJRFRIICogMiArIFBXTF9TQ1JPTExCQVJfUE9TQlVUVE9OX01JTldJRFRIICsgMikpCi0JCXsKLQkJCXJjTWluQnV0dG9uID0gQ1BERl9SZWN0KHJjQ2xpZW50LmxlZnQscmNDbGllbnQudG9wIC0gUFdMX1NDUk9MTEJBUl9CVVRUT05fV0lEVEgsCi0JCQkJcmNDbGllbnQucmlnaHQscmNDbGllbnQudG9wKTsKLQkJCXJjTWF4QnV0dG9uID0gQ1BERl9SZWN0KHJjQ2xpZW50LmxlZnQscmNDbGllbnQuYm90dG9tLAotCQkJCXJjQ2xpZW50LnJpZ2h0LHJjQ2xpZW50LmJvdHRvbSArIFBXTF9TQ1JPTExCQVJfQlVUVE9OX1dJRFRIKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWZCV2lkdGggPSAocmNDbGllbnQudG9wIC0gcmNDbGllbnQuYm90dG9tIC0gUFdMX1NDUk9MTEJBUl9QT1NCVVRUT05fTUlOV0lEVEggLSAyKSAvIDI7CisgICAgc3dpdGNoIChtX3NiVHlwZSkgeworICAgICAgY2FzZSBTQlRfSFNDUk9MTDoKKyAgICAgICAgcmNNaW5BcmVhID0gQ1BERl9SZWN0KHJjQ2xpZW50LmxlZnQgKyBQV0xfU0NST0xMQkFSX0JVVFRPTl9XSURUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LmJvdHRvbSwgcmNQb3NCdXR0b24ubGVmdCwgcmNDbGllbnQudG9wKTsKKyAgICAgICAgcmNNYXhBcmVhID0gQ1BERl9SZWN0KHJjUG9zQnV0dG9uLnJpZ2h0LCByY0NsaWVudC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5yaWdodCAtIFBXTF9TQ1JPTExCQVJfQlVUVE9OX1dJRFRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDbGllbnQudG9wKTsKIAotCQkJaWYgKElzRmxvYXRCaWdnZXIoZkJXaWR0aCwgMCkpCi0JCQl7Ci0JCQkJcmNNaW5CdXR0b24gPSBDUERGX1JlY3QocmNDbGllbnQubGVmdCxyY0NsaWVudC50b3AgLSBmQldpZHRoLAotCQkJCQlyY0NsaWVudC5yaWdodCxyY0NsaWVudC50b3ApOwotCQkJCXJjTWF4QnV0dG9uID0gQ1BERl9SZWN0KHJjQ2xpZW50LmxlZnQscmNDbGllbnQuYm90dG9tLAotCQkJCQlyY0NsaWVudC5yaWdodCxyY0NsaWVudC5ib3R0b20gKyBmQldpZHRoKTsKLQkJCX0KLQkJCWVsc2UgU2V0VmlzaWJsZShGQUxTRSk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQkKLQkKLS8vCWlmIChJc1Zpc2libGUoKSkKLQl7Ci0JCWlmIChtX3BNaW5CdXR0b24pCi0JCQltX3BNaW5CdXR0b24tPk1vdmUocmNNaW5CdXR0b24sVFJVRSxGQUxTRSk7Ci0JCQotCQlpZiAobV9wTWF4QnV0dG9uKQotCQkJbV9wTWF4QnV0dG9uLT5Nb3ZlKHJjTWF4QnV0dG9uLFRSVUUsRkFMU0UpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0JUX1ZTQ1JPTEw6CisgICAgICAgIHJjTWluQXJlYSA9IENQREZfUmVjdChyY0NsaWVudC5sZWZ0LCByY1Bvc0J1dHRvbi50b3AsIHJjQ2xpZW50LnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDbGllbnQudG9wIC0gUFdMX1NDUk9MTEJBUl9CVVRUT05fV0lEVEgpOworICAgICAgICByY01heEFyZWEgPSBDUERGX1JlY3QocmNDbGllbnQubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LmJvdHRvbSArIFBXTF9TQ1JPTExCQVJfQlVUVE9OX1dJRFRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDbGllbnQucmlnaHQsIHJjUG9zQnV0dG9uLmJvdHRvbSk7CisgICAgICAgIGJyZWFrOworICAgIH0KIAotCQlNb3ZlUG9zQnV0dG9uKEZBTFNFKTsKLQl9CisgICAgcmNNaW5BcmVhLk5vcm1hbGl6ZSgpOworICAgIHJjTWF4QXJlYS5Ob3JtYWxpemUoKTsKKworICAgIGlmIChyY01pbkFyZWEuQ29udGFpbnMocG9pbnQueCwgcG9pbnQueSkpIHsKKyAgICAgIG1fc0RhdGEuU3ViQmlnKCk7CisgICAgICBNb3ZlUG9zQnV0dG9uKFRSVUUpOworICAgICAgTm90aWZ5U2Nyb2xsV2luZG93KCk7CisgICAgfQorCisgICAgaWYgKHJjTWF4QXJlYS5Db250YWlucyhwb2ludC54LCBwb2ludC55KSkgeworICAgICAgbV9zRGF0YS5BZGRCaWcoKTsKKyAgICAgIE1vdmVQb3NCdXR0b24oVFJVRSk7CisgICAgICBOb3RpZnlTY3JvbGxXaW5kb3coKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBDUFdMX1Njcm9sbEJhcjo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSkKLXsKLQlDUERGX1JlY3QgcmVjdFduZCA9IEdldFdpbmRvd1JlY3QoKTsKK0ZYX0JPT0wgQ1BXTF9TY3JvbGxCYXI6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50LCBGWF9EV09SRCBuRmxhZykgeworICBDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsIG5GbGFnKTsKIAotCWlmIChJc1Zpc2libGUoKSAmJiAhcmVjdFduZC5Jc0VtcHR5KCkpCi0JewotCQlDRlhfQnl0ZVRleHRCdWYgc0J1dHRvbjsJCQorICBpZiAoSGFzRmxhZyhQV1NfQVVUT1RSQU5TUEFSRU5UKSkgeworICAgIGlmIChHZXRUcmFuc3BhcmVuY3koKSAhPSBQV0xfU0NST0xMQkFSX1RSQU5TUEFSQU5DWSkgeworICAgICAgU2V0VHJhbnNwYXJlbmN5KFBXTF9TQ1JPTExCQVJfVFJBTlNQQVJBTkNZKTsKKyAgICAgIEludmFsaWRhdGVSZWN0KCk7CisgICAgfQorICB9CiAKLQkJc0J1dHRvbiA8PCAicVxuIjsKLQkJc0J1dHRvbiA8PCAiMCB3XG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJhY2tncm91bmRDb2xvcigpLFRSVUUpOwotCQlzQnV0dG9uIDw8IHJlY3RXbmQubGVmdCA8PCAiICIgPDwgcmVjdFduZC5ib3R0b20gPDwgIiAiCi0JCQkJPDwgcmVjdFduZC5yaWdodCAtIHJlY3RXbmQubGVmdCA8PCAiICIgPDwgcmVjdFduZC50b3AgLSByZWN0V25kLmJvdHRvbSA8PCAiIHJlIGIgUVxuIjsJCisgIEVuZFRpbWVyKCk7CisgIG1fYk1vdXNlRG93biA9IEZBTFNFOwogCi0JCXNBcHBTdHJlYW0gPDwgc0J1dHRvbjsJCi0JfQorICByZXR1cm4gVFJVRTsKIH0KIAotdm9pZCBDUFdMX1Njcm9sbEJhcjo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpCi17Ci0vLwlDUFdMX1duZDo6RHJhd1RoaXNBcHBlYXJhbmNlKHBEZXZpY2UscFVzZXIyRGV2aWNlKTsKLQlDUERGX1JlY3QgcmVjdFduZCA9IEdldFdpbmRvd1JlY3QoKTsKK3ZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uTm90aWZ5KENQV0xfV25kKiBwV25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3Qgd1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbFBhcmFtKSB7CisgIENQV0xfV25kOjpPbk5vdGlmeShwV25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKIAotCWlmIChJc1Zpc2libGUoKSAmJiAhcmVjdFduZC5Jc0VtcHR5KCkpCi0JewotCQlDUFdMX1V0aWxzOjpEcmF3RmlsbFJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByZWN0V25kLCB0aGlzLT5HZXRCYWNrZ3JvdW5kQ29sb3IoKSwgR2V0VHJhbnNwYXJlbmN5KCkpOworICBzd2l0Y2ggKG1zZykgeworICAgIGNhc2UgUE5NX0xCVVRUT05ET1dOOgorICAgICAgaWYgKHBXbmQgPT0gbV9wTWluQnV0dG9uKSB7CisgICAgICAgIE9uTWluQnV0dG9uTEJEb3duKCooQ1BERl9Qb2ludCopbFBhcmFtKTsKKyAgICAgIH0KIAotCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIAotCQkJQ1BERl9Qb2ludChyZWN0V25kLmxlZnQrMi4wZixyZWN0V25kLnRvcC0yLjBmKSwgQ1BERl9Qb2ludChyZWN0V25kLmxlZnQrMi4wZixyZWN0V25kLmJvdHRvbSsyLjBmKSwgCi0JCQlBcmdiRW5jb2RlKHRoaXMtPkdldFRyYW5zcGFyZW5jeSgpLDEwMCwxMDAsMTAwKSwxLjBmKTsKKyAgICAgIGlmIChwV25kID09IG1fcE1heEJ1dHRvbikgeworICAgICAgICBPbk1heEJ1dHRvbkxCRG93bigqKENQREZfUG9pbnQqKWxQYXJhbSk7CisgICAgICB9CiAKLQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCAKLQkJCUNQREZfUG9pbnQocmVjdFduZC5yaWdodC0yLjBmLHJlY3RXbmQudG9wLTIuMGYpLCBDUERGX1BvaW50KHJlY3RXbmQucmlnaHQtMi4wZixyZWN0V25kLmJvdHRvbSsyLjBmKSwgCi0JCQlBcmdiRW5jb2RlKHRoaXMtPkdldFRyYW5zcGFyZW5jeSgpLDEwMCwxMDAsMTAwKSwxLjBmKTsKLQl9CisgICAgICBpZiAocFduZCA9PSBtX3BQb3NCdXR0b24pIHsKKyAgICAgICAgT25Qb3NCdXR0b25MQkRvd24oKihDUERGX1BvaW50KilsUGFyYW0pOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQTk1fTEJVVFRPTlVQOgorICAgICAgaWYgKHBXbmQgPT0gbV9wTWluQnV0dG9uKSB7CisgICAgICAgIE9uTWluQnV0dG9uTEJVcCgqKENQREZfUG9pbnQqKWxQYXJhbSk7CisgICAgICB9CisKKyAgICAgIGlmIChwV25kID09IG1fcE1heEJ1dHRvbikgeworICAgICAgICBPbk1heEJ1dHRvbkxCVXAoKihDUERGX1BvaW50KilsUGFyYW0pOworICAgICAgfQorCisgICAgICBpZiAocFduZCA9PSBtX3BQb3NCdXR0b24pIHsKKyAgICAgICAgT25Qb3NCdXR0b25MQlVwKCooQ1BERl9Qb2ludCopbFBhcmFtKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUE5NX01PVVNFTU9WRToKKyAgICAgIGlmIChwV25kID09IG1fcE1pbkJ1dHRvbikgeworICAgICAgICBPbk1pbkJ1dHRvbk1vdXNlTW92ZSgqKENQREZfUG9pbnQqKWxQYXJhbSk7CisgICAgICB9CisKKyAgICAgIGlmIChwV25kID09IG1fcE1heEJ1dHRvbikgeworICAgICAgICBPbk1heEJ1dHRvbk1vdXNlTW92ZSgqKENQREZfUG9pbnQqKWxQYXJhbSk7CisgICAgICB9CisKKyAgICAgIGlmIChwV25kID09IG1fcFBvc0J1dHRvbikgeworICAgICAgICBPblBvc0J1dHRvbk1vdXNlTW92ZSgqKENQREZfUG9pbnQqKWxQYXJhbSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBOTV9TRVRTQ1JPTExJTkZPOiB7CisgICAgICBpZiAoUFdMX1NDUk9MTF9JTkZPKiBwSW5mbyA9IChQV0xfU0NST0xMX0lORk8qKWxQYXJhbSkgeworICAgICAgICBpZiAoRlhTWVNfbWVtY21wKCZtX09yaWdpbkluZm8sIHBJbmZvLCBzaXplb2YoUFdMX1NDUk9MTF9JTkZPKSkgIT0gMCkgeworICAgICAgICAgIG1fT3JpZ2luSW5mbyA9ICpwSW5mbzsKKyAgICAgICAgICBGWF9GTE9BVCBmTWF4ID0KKyAgICAgICAgICAgICAgcEluZm8tPmZDb250ZW50TWF4IC0gcEluZm8tPmZDb250ZW50TWluIC0gcEluZm8tPmZQbGF0ZVdpZHRoOworICAgICAgICAgIGZNYXggPSBmTWF4ID4gMC4wZiA/IGZNYXggOiAwLjBmOworICAgICAgICAgIFNldFNjcm9sbFJhbmdlKDAsIGZNYXgsIHBJbmZvLT5mUGxhdGVXaWR0aCk7CisgICAgICAgICAgU2V0U2Nyb2xsU3RlcChwSW5mby0+ZkJpZ1N0ZXAsIHBJbmZvLT5mU21hbGxTdGVwKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBQTk1fU0VUU0NST0xMUE9TOiB7CisgICAgICBGWF9GTE9BVCBmUG9zID0gKihGWF9GTE9BVCopbFBhcmFtOworICAgICAgc3dpdGNoIChtX3NiVHlwZSkgeworICAgICAgICBjYXNlIFNCVF9IU0NST0xMOgorICAgICAgICAgIGZQb3MgPSBmUG9zIC0gbV9PcmlnaW5JbmZvLmZDb250ZW50TWluOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNCVF9WU0NST0xMOgorICAgICAgICAgIGZQb3MgPSBtX09yaWdpbkluZm8uZkNvbnRlbnRNYXggLSBmUG9zOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgU2V0U2Nyb2xsUG9zKGZQb3MpOworICAgIH0gYnJlYWs7CisgIH0KIH0KIAotRlhfQk9PTCBDUFdMX1Njcm9sbEJhcjo6T25MQnV0dG9uRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQotewotCUNQV0xfV25kOjpPbkxCdXR0b25Eb3duKHBvaW50LG5GbGFnKTsKK3ZvaWQgQ1BXTF9TY3JvbGxCYXI6OkNyZWF0ZUJ1dHRvbnMoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCkgeworICBQV0xfQ1JFQVRFUEFSQU0gc2NwID0gY3A7CisgIHNjcC5wUGFyZW50V25kID0gdGhpczsKKyAgc2NwLmR3Qm9yZGVyV2lkdGggPSAyOworICBzY3AubkJvcmRlclN0eWxlID0gUEJTX0JFVkVMRUQ7CiAKLQkvL1NldEZvY3VzKCk7CisgIHNjcC5kd0ZsYWdzID0KKyAgICAgIFBXU19WSVNJQkxFIHwgUFdTX0NISUxEIHwgUFdTX0JPUkRFUiB8IFBXU19CQUNLR1JPVU5EIHwgUFdTX05PUkVGUkVTSENMSVA7CiAKLQlpZiAoSGFzRmxhZyhQV1NfQVVUT1RSQU5TUEFSRU5UKSkKLQl7Ci0JCWlmIChHZXRUcmFuc3BhcmVuY3koKSAhPSAyNTUpCi0JCXsKLQkJCVNldFRyYW5zcGFyZW5jeSgyNTUpOwotCQkJSW52YWxpZGF0ZVJlY3QoKTsKLQkJfQotCX0KKyAgaWYgKCFtX3BNaW5CdXR0b24pIHsKKyAgICBtX3BNaW5CdXR0b24gPSBuZXcgQ1BXTF9TQkJ1dHRvbihtX3NiVHlwZSwgUFNCVF9NSU4pOworICAgIG1fcE1pbkJ1dHRvbi0+Q3JlYXRlKHNjcCk7CisgIH0KIAotCUNQREZfUmVjdCByY01pbkFyZWEscmNNYXhBcmVhOworICBpZiAoIW1fcE1heEJ1dHRvbikgeworICAgIG1fcE1heEJ1dHRvbiA9IG5ldyBDUFdMX1NCQnV0dG9uKG1fc2JUeXBlLCBQU0JUX01BWCk7CisgICAgbV9wTWF4QnV0dG9uLT5DcmVhdGUoc2NwKTsKKyAgfQogCi0JaWYgKG1fcFBvc0J1dHRvbiAmJiBtX3BQb3NCdXR0b24tPklzVmlzaWJsZSgpKQotCXsKLQkJQ1BERl9SZWN0IHJjQ2xpZW50ID0gdGhpcy0+R2V0Q2xpZW50UmVjdCgpOwotCQlDUERGX1JlY3QgcmNQb3NCdXR0b24gPSBtX3BQb3NCdXR0b24tPkdldFdpbmRvd1JlY3QoKTsKLQotCQlzd2l0Y2ggKG1fc2JUeXBlKQotCQl7Ci0JCWNhc2UgU0JUX0hTQ1JPTEw6Ci0JCQlyY01pbkFyZWEgPSBDUERGX1JlY3QocmNDbGllbnQubGVmdCArIFBXTF9TQ1JPTExCQVJfQlVUVE9OX1dJRFRILHJjQ2xpZW50LmJvdHRvbSwKLQkJCQkJCQlyY1Bvc0J1dHRvbi5sZWZ0LHJjQ2xpZW50LnRvcCk7Ci0JCQlyY01heEFyZWEgPSBDUERGX1JlY3QocmNQb3NCdXR0b24ucmlnaHQscmNDbGllbnQuYm90dG9tLAotCQkJCQkJCXJjQ2xpZW50LnJpZ2h0IC0gUFdMX1NDUk9MTEJBUl9CVVRUT05fV0lEVEgscmNDbGllbnQudG9wKTsKLQotCQkJYnJlYWs7Ci0JCWNhc2UgU0JUX1ZTQ1JPTEw6Ci0JCQlyY01pbkFyZWEgPSBDUERGX1JlY3QocmNDbGllbnQubGVmdCxyY1Bvc0J1dHRvbi50b3AsCi0JCQkJCQkJcmNDbGllbnQucmlnaHQscmNDbGllbnQudG9wIC0gUFdMX1NDUk9MTEJBUl9CVVRUT05fV0lEVEgpOwotCQkJcmNNYXhBcmVhID0gQ1BERl9SZWN0KHJjQ2xpZW50LmxlZnQscmNDbGllbnQuYm90dG9tICsgUFdMX1NDUk9MTEJBUl9CVVRUT05fV0lEVEgsCi0JCQkJCQkJcmNDbGllbnQucmlnaHQscmNQb3NCdXR0b24uYm90dG9tKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcmNNaW5BcmVhLk5vcm1hbGl6ZSgpOwotCQlyY01heEFyZWEuTm9ybWFsaXplKCk7Ci0KLQkJaWYgKHJjTWluQXJlYS5Db250YWlucyhwb2ludC54LHBvaW50LnkpKQotCQl7Ci0JCQltX3NEYXRhLlN1YkJpZygpOwotCQkJTW92ZVBvc0J1dHRvbihUUlVFKTsKLQkJCU5vdGlmeVNjcm9sbFdpbmRvdygpOwotCQl9Ci0KLQkJaWYgKHJjTWF4QXJlYS5Db250YWlucyhwb2ludC54LHBvaW50LnkpKQotCQl7Ci0JCQltX3NEYXRhLkFkZEJpZygpOwotCQkJTW92ZVBvc0J1dHRvbihUUlVFKTsKLQkJCU5vdGlmeVNjcm9sbFdpbmRvdygpOwotCQl9Ci0JfQotCi0JcmV0dXJuIFRSVUU7CisgIGlmICghbV9wUG9zQnV0dG9uKSB7CisgICAgbV9wUG9zQnV0dG9uID0gbmV3IENQV0xfU0JCdXR0b24obV9zYlR5cGUsIFBTQlRfUE9TKTsKKyAgICBtX3BQb3NCdXR0b24tPlNldFZpc2libGUoRkFMU0UpOworICAgIG1fcFBvc0J1dHRvbi0+Q3JlYXRlKHNjcCk7CisgIH0KIH0KIAotRlhfQk9PTCBDUFdMX1Njcm9sbEJhcjo6T25MQnV0dG9uVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZykKLXsKLQlDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsbkZsYWcpOworRlhfRkxPQVQgQ1BXTF9TY3JvbGxCYXI6OkdldFNjcm9sbEJhcldpZHRoKCkgY29uc3QgeworICBpZiAoIUlzVmlzaWJsZSgpKQorICAgIHJldHVybiAwOwogCi0JaWYgKEhhc0ZsYWcoUFdTX0FVVE9UUkFOU1BBUkVOVCkpCi0JewotCQlpZiAoR2V0VHJhbnNwYXJlbmN5KCkgIT0gUFdMX1NDUk9MTEJBUl9UUkFOU1BBUkFOQ1kpCi0JCXsKLQkJCVNldFRyYW5zcGFyZW5jeShQV0xfU0NST0xMQkFSX1RSQU5TUEFSQU5DWSk7Ci0JCQlJbnZhbGlkYXRlUmVjdCgpOwotCQl9Ci0JfQotCi0JRW5kVGltZXIoKTsKLQltX2JNb3VzZURvd24gPSBGQUxTRTsKLQotCXJldHVybiBUUlVFOworICByZXR1cm4gUFdMX1NDUk9MTEJBUl9XSURUSDsKIH0KIAotdm9pZCBDUFdMX1Njcm9sbEJhcjo6T25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgRlhfSU5UUFRSIHdQYXJhbSwgRlhfSU5UUFRSIGxQYXJhbSkKLXsKLQlDUFdMX1duZDo6T25Ob3RpZnkocFduZCxtc2csd1BhcmFtLGxQYXJhbSk7Cit2b2lkIENQV0xfU2Nyb2xsQmFyOjpTZXRTY3JvbGxSYW5nZShGWF9GTE9BVCBmTWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDbGllbnRXaWR0aCkgeworICBpZiAobV9wUG9zQnV0dG9uKSB7CisgICAgbV9zRGF0YS5TZXRTY3JvbGxSYW5nZShmTWluLCBmTWF4KTsKKyAgICBtX3NEYXRhLlNldENsaWVudFdpZHRoKGZDbGllbnRXaWR0aCk7CiAKLQlzd2l0Y2ggKG1zZykKLQl7Ci0JY2FzZSBQTk1fTEJVVFRPTkRPV046CQkJCi0JCWlmIChwV25kID09IG1fcE1pbkJ1dHRvbikKLQkJewotCQkJT25NaW5CdXR0b25MQkRvd24oKihDUERGX1BvaW50KilsUGFyYW0pOwotCQl9Ci0KLQkJaWYgKHBXbmQgPT0gbV9wTWF4QnV0dG9uKQotCQl7Ci0JCQlPbk1heEJ1dHRvbkxCRG93bigqKENQREZfUG9pbnQqKWxQYXJhbSk7Ci0JCX0KLQotCQlpZiAocFduZCA9PSBtX3BQb3NCdXR0b24pCi0JCXsKLQkJCU9uUG9zQnV0dG9uTEJEb3duKCooQ1BERl9Qb2ludCopbFBhcmFtKTsJCQkJCi0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBQTk1fTEJVVFRPTlVQOgotCQlpZiAocFduZCA9PSBtX3BNaW5CdXR0b24pCi0JCXsKLQkJCU9uTWluQnV0dG9uTEJVcCgqKENQREZfUG9pbnQqKWxQYXJhbSk7CQkKLQkJfQotCi0JCWlmIChwV25kID09IG1fcE1heEJ1dHRvbikKLQkJewotCQkJT25NYXhCdXR0b25MQlVwKCooQ1BERl9Qb2ludCopbFBhcmFtKTsJCQkJCi0JCX0KLQotCQlpZiAocFduZCA9PSBtX3BQb3NCdXR0b24pCi0JCXsKLQkJCU9uUG9zQnV0dG9uTEJVcCgqKENQREZfUG9pbnQqKWxQYXJhbSk7CQkJCi0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBQTk1fTU9VU0VNT1ZFOgotCQlpZiAocFduZCA9PSBtX3BNaW5CdXR0b24pCi0JCXsKLQkJCU9uTWluQnV0dG9uTW91c2VNb3ZlKCooQ1BERl9Qb2ludCopbFBhcmFtKTsKLQkJfQotCi0JCWlmIChwV25kID09IG1fcE1heEJ1dHRvbikKLQkJewotCQkJT25NYXhCdXR0b25Nb3VzZU1vdmUoKihDUERGX1BvaW50KilsUGFyYW0pOwkJCQkKLQkJfQotCi0JCWlmIChwV25kID09IG1fcFBvc0J1dHRvbikKLQkJewotCQkJT25Qb3NCdXR0b25Nb3VzZU1vdmUoKihDUERGX1BvaW50KilsUGFyYW0pOwkJCQkKLQkJfQotCQlicmVhazsKLQljYXNlIFBOTV9TRVRTQ1JPTExJTkZPOgotCQl7Ci0JCQlpZiAoUFdMX1NDUk9MTF9JTkZPICogcEluZm8gPSAoUFdMX1NDUk9MTF9JTkZPKilsUGFyYW0pCi0JCQl7Ci0JCQkJaWYgKEZYU1lTX21lbWNtcCgmbV9PcmlnaW5JbmZvLCBwSW5mbywgc2l6ZW9mKFBXTF9TQ1JPTExfSU5GTykpICE9IDApCi0JCQkJewotCQkJCQltX09yaWdpbkluZm8gPSAqcEluZm87Ci0JCQkJCUZYX0ZMT0FUIGZNYXggPSBwSW5mby0+ZkNvbnRlbnRNYXggLSBwSW5mby0+ZkNvbnRlbnRNaW4gLSBwSW5mby0+ZlBsYXRlV2lkdGg7Ci0JCQkJCWZNYXggPSBmTWF4ID4gMC4wZiA/IGZNYXggOiAwLjBmOwotCQkJCQl0aGlzLT5TZXRTY3JvbGxSYW5nZSgwLGZNYXgsIHBJbmZvLT5mUGxhdGVXaWR0aCk7Ci0JCQkJCXRoaXMtPlNldFNjcm9sbFN0ZXAocEluZm8tPmZCaWdTdGVwLHBJbmZvLT5mU21hbGxTdGVwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBQTk1fU0VUU0NST0xMUE9TOgotCQl7Ci0JCQlGWF9GTE9BVCBmUG9zID0gKihGWF9GTE9BVCopbFBhcmFtOwotCQkJc3dpdGNoICh0aGlzLT5tX3NiVHlwZSkKLQkJCXsKLQkJCWNhc2UgU0JUX0hTQ1JPTEw6Ci0JCQkJZlBvcyA9IGZQb3MgLSBtX09yaWdpbkluZm8uZkNvbnRlbnRNaW47Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNCVF9WU0NST0xMOgotCQkJCWZQb3MgPSBtX09yaWdpbkluZm8uZkNvbnRlbnRNYXggLSBmUG9zOwotCQkJCWJyZWFrOwotCQkJfQotCQkJdGhpcy0+U2V0U2Nyb2xsUG9zKGZQb3MpOwotCQl9Ci0JCWJyZWFrOwotCX0KKyAgICBpZiAoSXNGbG9hdFNtYWxsZXIobV9zRGF0YS5TY3JvbGxSYW5nZS5HZXRXaWR0aCgpLCAwLjBmKSkgeworICAgICAgbV9wUG9zQnV0dG9uLT5TZXRWaXNpYmxlKEZBTFNFKTsKKyAgICB9IGVsc2UgeworICAgICAgbV9wUG9zQnV0dG9uLT5TZXRWaXNpYmxlKFRSVUUpOworICAgICAgTW92ZVBvc0J1dHRvbihUUlVFKTsKKyAgICB9CisgIH0KIH0KIAotdm9pZCBDUFdMX1Njcm9sbEJhcjo6Q3JlYXRlQnV0dG9ucyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCkKLXsKLQlQV0xfQ1JFQVRFUEFSQU0Jc2NwID0gY3A7Ci0Jc2NwLnBQYXJlbnRXbmQgPSB0aGlzOwotCXNjcC5kd0JvcmRlcldpZHRoID0gMjsKLQlzY3AubkJvcmRlclN0eWxlID0gUEJTX0JFVkVMRUQ7Ci0JCi0Jc2NwLmR3RmxhZ3MgPSBQV1NfVklTSUJMRSB8IFBXU19DSElMRCB8IFBXU19CT1JERVIgfCBQV1NfQkFDS0dST1VORCB8IFBXU19OT1JFRlJFU0hDTElQOwordm9pZCBDUFdMX1Njcm9sbEJhcjo6U2V0U2Nyb2xsUG9zKEZYX0ZMT0FUIGZQb3MpIHsKKyAgRlhfRkxPQVQgZk9sZFBvcyA9IG1fc0RhdGEuZlNjcm9sbFBvczsKIAotCWlmICghbV9wTWluQnV0dG9uKSAKLQl7Ci0JCW1fcE1pbkJ1dHRvbiA9IG5ldyBDUFdMX1NCQnV0dG9uKG1fc2JUeXBlLFBTQlRfTUlOKTsKLQkJbV9wTWluQnV0dG9uLT5DcmVhdGUoc2NwKTsKLQl9CisgIG1fc0RhdGEuU2V0UG9zKGZQb3MpOwogCi0JaWYgKCFtX3BNYXhCdXR0b24pCi0JewotCQltX3BNYXhCdXR0b24gPSBuZXcgQ1BXTF9TQkJ1dHRvbihtX3NiVHlwZSxQU0JUX01BWCk7Ci0JCW1fcE1heEJ1dHRvbi0+Q3JlYXRlKHNjcCk7Ci0JfQotCi0JaWYgKCFtX3BQb3NCdXR0b24pCi0JewotCQltX3BQb3NCdXR0b24gPSBuZXcgQ1BXTF9TQkJ1dHRvbihtX3NiVHlwZSxQU0JUX1BPUyk7Ci0JCW1fcFBvc0J1dHRvbi0+U2V0VmlzaWJsZShGQUxTRSk7Ci0JCW1fcFBvc0J1dHRvbi0+Q3JlYXRlKHNjcCk7Ci0JfQorICBpZiAoIUlzRmxvYXRFcXVhbChtX3NEYXRhLmZTY3JvbGxQb3MsIGZPbGRQb3MpKQorICAgIE1vdmVQb3NCdXR0b24oVFJVRSk7CiB9CiAKLUZYX0ZMT0FUIENQV0xfU2Nyb2xsQmFyOjpHZXRTY3JvbGxCYXJXaWR0aCgpIGNvbnN0Ci17Ci0JaWYgKCFJc1Zpc2libGUoKSkgcmV0dXJuIDA7Ci0KLQlyZXR1cm4gUFdMX1NDUk9MTEJBUl9XSURUSDsKK3ZvaWQgQ1BXTF9TY3JvbGxCYXI6OlNldFNjcm9sbFN0ZXAoRlhfRkxPQVQgZkJpZ1N0ZXAsIEZYX0ZMT0FUIGZTbWFsbFN0ZXApIHsKKyAgbV9zRGF0YS5TZXRCaWdTdGVwKGZCaWdTdGVwKTsKKyAgbV9zRGF0YS5TZXRTbWFsbFN0ZXAoZlNtYWxsU3RlcCk7CiB9CiAKLXZvaWQgQ1BXTF9TY3JvbGxCYXI6OlNldFNjcm9sbFJhbmdlKEZYX0ZMT0FUIGZNaW4sRlhfRkxPQVQgZk1heCxGWF9GTE9BVCBmQ2xpZW50V2lkdGgpCi17Ci0JaWYgKG1fcFBvc0J1dHRvbikKLQl7Ci0JCW1fc0RhdGEuU2V0U2Nyb2xsUmFuZ2UoZk1pbixmTWF4KTsKLQkJbV9zRGF0YS5TZXRDbGllbnRXaWR0aChmQ2xpZW50V2lkdGgpOwordm9pZCBDUFdMX1Njcm9sbEJhcjo6TW92ZVBvc0J1dHRvbihGWF9CT09MIGJSZWZyZXNoKSB7CisgIEFTU0VSVChtX3BNaW5CdXR0b24pOworICBBU1NFUlQobV9wTWF4QnV0dG9uKTsKIAotCQlpZiAoSXNGbG9hdFNtYWxsZXIobV9zRGF0YS5TY3JvbGxSYW5nZS5HZXRXaWR0aCgpLCAwLjBmKSkKLQkJewotCQkJbV9wUG9zQnV0dG9uLT5TZXRWaXNpYmxlKEZBTFNFKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCW1fcFBvc0J1dHRvbi0+U2V0VmlzaWJsZShUUlVFKTsJCi0JCQlNb3ZlUG9zQnV0dG9uKFRSVUUpOwotCQl9Ci0JfQorICBpZiAobV9wUG9zQnV0dG9uLT5Jc1Zpc2libGUoKSkgeworICAgIENQREZfUmVjdCByY0NsaWVudDsKKyAgICBDUERGX1JlY3QgcmNQb3NBcmVhLCByY1Bvc0J1dHRvbjsKKworICAgIHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworICAgIHJjUG9zQXJlYSA9IEdldFNjcm9sbEFyZWEoKTsKKworICAgIEZYX0ZMT0FUIGZMZWZ0LCBmUmlnaHQsIGZUb3AsIGZCb3R0b207CisKKyAgICBzd2l0Y2ggKG1fc2JUeXBlKSB7CisgICAgICBjYXNlIFNCVF9IU0NST0xMOgorICAgICAgICBmTGVmdCA9IFRydWVUb0ZhY2UobV9zRGF0YS5mU2Nyb2xsUG9zKTsKKyAgICAgICAgZlJpZ2h0ID0gVHJ1ZVRvRmFjZShtX3NEYXRhLmZTY3JvbGxQb3MgKyBtX3NEYXRhLmZDbGllbnRXaWR0aCk7CisKKyAgICAgICAgaWYgKGZSaWdodCAtIGZMZWZ0IDwgUFdMX1NDUk9MTEJBUl9QT1NCVVRUT05fTUlOV0lEVEgpCisgICAgICAgICAgZlJpZ2h0ID0gZkxlZnQgKyBQV0xfU0NST0xMQkFSX1BPU0JVVFRPTl9NSU5XSURUSDsKKworICAgICAgICBpZiAoZlJpZ2h0ID4gcmNQb3NBcmVhLnJpZ2h0KSB7CisgICAgICAgICAgZlJpZ2h0ID0gcmNQb3NBcmVhLnJpZ2h0OworICAgICAgICAgIGZMZWZ0ID0gZlJpZ2h0IC0gUFdMX1NDUk9MTEJBUl9QT1NCVVRUT05fTUlOV0lEVEg7CisgICAgICAgIH0KKworICAgICAgICByY1Bvc0J1dHRvbiA9IENQREZfUmVjdChmTGVmdCwgcmNQb3NBcmVhLmJvdHRvbSwgZlJpZ2h0LCByY1Bvc0FyZWEudG9wKTsKKworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0JUX1ZTQ1JPTEw6CisgICAgICAgIGZCb3R0b20gPSBUcnVlVG9GYWNlKG1fc0RhdGEuZlNjcm9sbFBvcyArIG1fc0RhdGEuZkNsaWVudFdpZHRoKTsKKyAgICAgICAgZlRvcCA9IFRydWVUb0ZhY2UobV9zRGF0YS5mU2Nyb2xsUG9zKTsKKworICAgICAgICBpZiAoSXNGbG9hdFNtYWxsZXIoZlRvcCAtIGZCb3R0b20sIFBXTF9TQ1JPTExCQVJfUE9TQlVUVE9OX01JTldJRFRIKSkKKyAgICAgICAgICBmQm90dG9tID0gZlRvcCAtIFBXTF9TQ1JPTExCQVJfUE9TQlVUVE9OX01JTldJRFRIOworCisgICAgICAgIGlmIChJc0Zsb2F0U21hbGxlcihmQm90dG9tLCByY1Bvc0FyZWEuYm90dG9tKSkgeworICAgICAgICAgIGZCb3R0b20gPSByY1Bvc0FyZWEuYm90dG9tOworICAgICAgICAgIGZUb3AgPSBmQm90dG9tICsgUFdMX1NDUk9MTEJBUl9QT1NCVVRUT05fTUlOV0lEVEg7CisgICAgICAgIH0KKworICAgICAgICByY1Bvc0J1dHRvbiA9IENQREZfUmVjdChyY1Bvc0FyZWEubGVmdCwgZkJvdHRvbSwgcmNQb3NBcmVhLnJpZ2h0LCBmVG9wKTsKKworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBtX3BQb3NCdXR0b24tPk1vdmUocmNQb3NCdXR0b24sIFRSVUUsIGJSZWZyZXNoKTsKKyAgfQogfQogCi12b2lkIENQV0xfU2Nyb2xsQmFyOjpTZXRTY3JvbGxQb3MoRlhfRkxPQVQgZlBvcykKLXsKLQlGWF9GTE9BVCBmT2xkUG9zID0gbV9zRGF0YS5mU2Nyb2xsUG9zOwordm9pZCBDUFdMX1Njcm9sbEJhcjo6T25NaW5CdXR0b25MQkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgbV9zRGF0YS5TdWJTbWFsbCgpOworICBNb3ZlUG9zQnV0dG9uKFRSVUUpOworICBOb3RpZnlTY3JvbGxXaW5kb3coKTsKIAotCW1fc0RhdGEuU2V0UG9zKGZQb3MpOworICBtX2JNaW5Pck1heCA9IFRSVUU7CiAKLQlpZiAoIUlzRmxvYXRFcXVhbChtX3NEYXRhLmZTY3JvbGxQb3MsIGZPbGRQb3MpKQotCQlNb3ZlUG9zQnV0dG9uKFRSVUUpOworICBFbmRUaW1lcigpOworICBCZWdpblRpbWVyKDEwMCk7CiB9CiAKLXZvaWQgQ1BXTF9TY3JvbGxCYXI6OlNldFNjcm9sbFN0ZXAoRlhfRkxPQVQgZkJpZ1N0ZXAsRlhfRkxPQVQgZlNtYWxsU3RlcCkKLXsKLQltX3NEYXRhLlNldEJpZ1N0ZXAoZkJpZ1N0ZXApOwotCW1fc0RhdGEuU2V0U21hbGxTdGVwKGZTbWFsbFN0ZXApOwordm9pZCBDUFdMX1Njcm9sbEJhcjo6T25NaW5CdXR0b25MQlVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7fQorCit2b2lkIENQV0xfU2Nyb2xsQmFyOjpPbk1pbkJ1dHRvbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50JiBwb2ludCkge30KKwordm9pZCBDUFdMX1Njcm9sbEJhcjo6T25NYXhCdXR0b25MQkRvd24oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgbV9zRGF0YS5BZGRTbWFsbCgpOworICBNb3ZlUG9zQnV0dG9uKFRSVUUpOworICBOb3RpZnlTY3JvbGxXaW5kb3coKTsKKworICBtX2JNaW5Pck1heCA9IEZBTFNFOworCisgIEVuZFRpbWVyKCk7CisgIEJlZ2luVGltZXIoMTAwKTsKIH0KIAotdm9pZCBDUFdMX1Njcm9sbEJhcjo6TW92ZVBvc0J1dHRvbihGWF9CT09MIGJSZWZyZXNoKQotewotCUFTU0VSVCAobV9wUG9zQnV0dG9uICE9IE5VTEwpOwotCUFTU0VSVCAobV9wTWluQnV0dG9uICE9IE5VTEwpOwotCUFTU0VSVCAobV9wTWF4QnV0dG9uICE9IE5VTEwpOwordm9pZCBDUFdMX1Njcm9sbEJhcjo6T25NYXhCdXR0b25MQlVwKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7fQogCi0JaWYgKG1fcFBvc0J1dHRvbi0+SXNWaXNpYmxlKCkpCi0Jewordm9pZCBDUFdMX1Njcm9sbEJhcjo6T25NYXhCdXR0b25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHt9CiAKK3ZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uUG9zQnV0dG9uTEJEb3duKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSB7CisgIG1fYk1vdXNlRG93biA9IFRSVUU7CiAKKyAgaWYgKG1fcFBvc0J1dHRvbikgeworICAgIENQREZfUmVjdCByY1Bvc0J1dHRvbiA9IG1fcFBvc0J1dHRvbi0+R2V0V2luZG93UmVjdCgpOwogCi0KLQkJQ1BERl9SZWN0IHJjQ2xpZW50OwotCQlDUERGX1JlY3QgcmNQb3NBcmVhLHJjUG9zQnV0dG9uOwkKLQotCQlyY0NsaWVudCA9IHRoaXMtPkdldENsaWVudFJlY3QoKTsKLQkJcmNQb3NBcmVhID0gR2V0U2Nyb2xsQXJlYSgpOwotCi0JCUZYX0ZMT0FUIGZMZWZ0LGZSaWdodCxmVG9wLGZCb3R0b207Ci0KLQkJc3dpdGNoIChtX3NiVHlwZSkKLQkJewotCQljYXNlIFNCVF9IU0NST0xMOgotCQkJZkxlZnQgPSBUcnVlVG9GYWNlKG1fc0RhdGEuZlNjcm9sbFBvcyk7Ci0JCQlmUmlnaHQgPSBUcnVlVG9GYWNlKG1fc0RhdGEuZlNjcm9sbFBvcyArIG1fc0RhdGEuZkNsaWVudFdpZHRoKTsKLQotCQkJaWYgKGZSaWdodCAtIGZMZWZ0IDwgUFdMX1NDUk9MTEJBUl9QT1NCVVRUT05fTUlOV0lEVEgpCi0JCQkJZlJpZ2h0ID0gZkxlZnQgKyBQV0xfU0NST0xMQkFSX1BPU0JVVFRPTl9NSU5XSURUSDsKLQotCQkJaWYgKGZSaWdodCA+IHJjUG9zQXJlYS5yaWdodCkKLQkJCXsKLQkJCQlmUmlnaHQgPSByY1Bvc0FyZWEucmlnaHQ7Ci0JCQkJZkxlZnQgPSBmUmlnaHQgLSBQV0xfU0NST0xMQkFSX1BPU0JVVFRPTl9NSU5XSURUSDsKLQkJCX0KLQotCQkJcmNQb3NCdXR0b24gPSBDUERGX1JlY3QoZkxlZnQgLAotCQkJCQkJCQlyY1Bvc0FyZWEuYm90dG9tLAotCQkJCQkJCQlmUmlnaHQgLAotCQkJCQkJCQlyY1Bvc0FyZWEudG9wKTsKLQkJCQotCQkJYnJlYWs7Ci0JCWNhc2UgU0JUX1ZTQ1JPTEw6Ci0JCQlmQm90dG9tID0gVHJ1ZVRvRmFjZShtX3NEYXRhLmZTY3JvbGxQb3MgKyBtX3NEYXRhLmZDbGllbnRXaWR0aCk7Ci0JCQlmVG9wID0gVHJ1ZVRvRmFjZShtX3NEYXRhLmZTY3JvbGxQb3MpOwotCi0JCQlpZiAoSXNGbG9hdFNtYWxsZXIoZlRvcCAtIGZCb3R0b20sIFBXTF9TQ1JPTExCQVJfUE9TQlVUVE9OX01JTldJRFRIKSkKLQkJCQlmQm90dG9tID0gZlRvcCAtIFBXTF9TQ1JPTExCQVJfUE9TQlVUVE9OX01JTldJRFRIOwotCQkJCi0JCQlpZiAoSXNGbG9hdFNtYWxsZXIoZkJvdHRvbSwgcmNQb3NBcmVhLmJvdHRvbSkpCi0JCQl7Ci0JCQkJZkJvdHRvbSA9IHJjUG9zQXJlYS5ib3R0b207Ci0JCQkJZlRvcCA9IGZCb3R0b20gKyBQV0xfU0NST0xMQkFSX1BPU0JVVFRPTl9NSU5XSURUSDsKLQkJCX0KLQotCQkJcmNQb3NCdXR0b24gPSBDUERGX1JlY3QocmNQb3NBcmVhLmxlZnQsCi0JCQkJCQkJCWZCb3R0b20sCQkJCQkJCQkKLQkJCQkJCQkJcmNQb3NBcmVhLnJpZ2h0LAotCQkJCQkJCQlmVG9wKTsKLQkJCQotCQkJYnJlYWs7Ci0JCX0KLQotCQltX3BQb3NCdXR0b24tPk1vdmUocmNQb3NCdXR0b24sVFJVRSxiUmVmcmVzaCk7Ci0JfQorICAgIHN3aXRjaCAobV9zYlR5cGUpIHsKKyAgICAgIGNhc2UgU0JUX0hTQ1JPTEw6CisgICAgICAgIG1fbk9sZFBvcyA9IHBvaW50Lng7CisgICAgICAgIG1fZk9sZFBvc0J1dHRvbiA9IHJjUG9zQnV0dG9uLmxlZnQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTQlRfVlNDUk9MTDoKKyAgICAgICAgbV9uT2xkUG9zID0gcG9pbnQueTsKKyAgICAgICAgbV9mT2xkUG9zQnV0dG9uID0gcmNQb3NCdXR0b24udG9wOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KIH0KIAotdm9pZCBDUFdMX1Njcm9sbEJhcjo6T25NaW5CdXR0b25MQkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KQotewotCW1fc0RhdGEuU3ViU21hbGwoKTsKLQlNb3ZlUG9zQnV0dG9uKFRSVUUpOwotCU5vdGlmeVNjcm9sbFdpbmRvdygpOwotCi0JbV9iTWluT3JNYXggPSBUUlVFOwotCi0JRW5kVGltZXIoKTsKLQlCZWdpblRpbWVyKDEwMCk7Cit2b2lkIENQV0xfU2Nyb2xsQmFyOjpPblBvc0J1dHRvbkxCVXAoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgaWYgKG1fYk1vdXNlRG93bikgeworICAgIGlmICghbV9iTm90aWZ5Rm9yZXZlcikKKyAgICAgIE5vdGlmeVNjcm9sbFdpbmRvdygpOworICB9CisgIG1fYk1vdXNlRG93biA9IEZBTFNFOwogfQogCi12b2lkIENQV0xfU2Nyb2xsQmFyOjpPbk1pbkJ1dHRvbkxCVXAoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KQotewordm9pZCBDUFdMX1Njcm9sbEJhcjo6T25Qb3NCdXR0b25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIHsKKyAgRlhfRkxPQVQgZk9sZFNjcm9sbFBvcyA9IG1fc0RhdGEuZlNjcm9sbFBvczsKKworICBGWF9GTE9BVCBmTmV3UG9zID0gMDsKKworICBzd2l0Y2ggKG1fc2JUeXBlKSB7CisgICAgY2FzZSBTQlRfSFNDUk9MTDoKKyAgICAgIGlmIChGWFNZU19mYWJzKHBvaW50LnggLSBtX25PbGRQb3MpIDwgMSkKKyAgICAgICAgcmV0dXJuOworICAgICAgZk5ld1BvcyA9IEZhY2VUb1RydWUobV9mT2xkUG9zQnV0dG9uICsgcG9pbnQueCAtIG1fbk9sZFBvcyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNCVF9WU0NST0xMOgorICAgICAgaWYgKEZYU1lTX2ZhYnMocG9pbnQueSAtIG1fbk9sZFBvcykgPCAxKQorICAgICAgICByZXR1cm47CisgICAgICBmTmV3UG9zID0gRmFjZVRvVHJ1ZShtX2ZPbGRQb3NCdXR0b24gKyBwb2ludC55IC0gbV9uT2xkUG9zKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKG1fYk1vdXNlRG93bikgeworICAgIHN3aXRjaCAobV9zYlR5cGUpIHsKKyAgICAgIGNhc2UgU0JUX0hTQ1JPTEw6CisKKyAgICAgICAgaWYgKElzRmxvYXRTbWFsbGVyKGZOZXdQb3MsIG1fc0RhdGEuU2Nyb2xsUmFuZ2UuZk1pbikpIHsKKyAgICAgICAgICBmTmV3UG9zID0gbV9zRGF0YS5TY3JvbGxSYW5nZS5mTWluOworICAgICAgICB9CisKKyAgICAgICAgaWYgKElzRmxvYXRCaWdnZXIoZk5ld1BvcywgbV9zRGF0YS5TY3JvbGxSYW5nZS5mTWF4KSkgeworICAgICAgICAgIGZOZXdQb3MgPSBtX3NEYXRhLlNjcm9sbFJhbmdlLmZNYXg7CisgICAgICAgIH0KKworICAgICAgICBtX3NEYXRhLlNldFBvcyhmTmV3UG9zKTsKKworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0JUX1ZTQ1JPTEw6CisKKyAgICAgICAgaWYgKElzRmxvYXRTbWFsbGVyKGZOZXdQb3MsIG1fc0RhdGEuU2Nyb2xsUmFuZ2UuZk1pbikpIHsKKyAgICAgICAgICBmTmV3UG9zID0gbV9zRGF0YS5TY3JvbGxSYW5nZS5mTWluOworICAgICAgICB9CisKKyAgICAgICAgaWYgKElzRmxvYXRCaWdnZXIoZk5ld1BvcywgbV9zRGF0YS5TY3JvbGxSYW5nZS5mTWF4KSkgeworICAgICAgICAgIGZOZXdQb3MgPSBtX3NEYXRhLlNjcm9sbFJhbmdlLmZNYXg7CisgICAgICAgIH0KKworICAgICAgICBtX3NEYXRhLlNldFBvcyhmTmV3UG9zKTsKKworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIUlzRmxvYXRFcXVhbChmT2xkU2Nyb2xsUG9zLCBtX3NEYXRhLmZTY3JvbGxQb3MpKSB7CisgICAgICBNb3ZlUG9zQnV0dG9uKFRSVUUpOworCisgICAgICBpZiAobV9iTm90aWZ5Rm9yZXZlcikKKyAgICAgICAgTm90aWZ5U2Nyb2xsV2luZG93KCk7CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uTWluQnV0dG9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkKLXsJCit2b2lkIENQV0xfU2Nyb2xsQmFyOjpOb3RpZnlTY3JvbGxXaW5kb3coKSB7CisgIGlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKSB7CisgICAgRlhfRkxPQVQgZlBvczsKKyAgICBzd2l0Y2ggKG1fc2JUeXBlKSB7CisgICAgICBjYXNlIFNCVF9IU0NST0xMOgorICAgICAgICBmUG9zID0gbV9PcmlnaW5JbmZvLmZDb250ZW50TWluICsgbV9zRGF0YS5mU2Nyb2xsUG9zOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0JUX1ZTQ1JPTEw6CisgICAgICAgIGZQb3MgPSBtX09yaWdpbkluZm8uZkNvbnRlbnRNYXggLSBtX3NEYXRhLmZTY3JvbGxQb3M7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0NST0xMV0lORE9XLCAoaW50cHRyX3QpbV9zYlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgKGludHB0cl90KSZmUG9zKTsKKyAgfQogfQogCi12b2lkIENQV0xfU2Nyb2xsQmFyOjpPbk1heEJ1dHRvbkxCRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpCi17Ci0JbV9zRGF0YS5BZGRTbWFsbCgpOwotCU1vdmVQb3NCdXR0b24oVFJVRSk7Ci0JTm90aWZ5U2Nyb2xsV2luZG93KCk7CitDUERGX1JlY3QgQ1BXTF9TY3JvbGxCYXI6OkdldFNjcm9sbEFyZWEoKSBjb25zdCB7CisgIENQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKKyAgQ1BERl9SZWN0IHJjQXJlYTsKIAotCW1fYk1pbk9yTWF4ID0gRkFMU0U7Ci0JCi0JRW5kVGltZXIoKTsKLQlCZWdpblRpbWVyKDEwMCk7CisgIGlmICghbV9wTWluQnV0dG9uIHx8ICFtX3BNYXhCdXR0b24pCisgICAgcmV0dXJuIHJjQ2xpZW50OworCisgIENQREZfUmVjdCByY01pbiA9IG1fcE1pbkJ1dHRvbi0+R2V0V2luZG93UmVjdCgpOworICBDUERGX1JlY3QgcmNNYXggPSBtX3BNYXhCdXR0b24tPkdldFdpbmRvd1JlY3QoKTsKKworICBGWF9GTE9BVCBmTWluV2lkdGggPSByY01pbi5yaWdodCAtIHJjTWluLmxlZnQ7CisgIEZYX0ZMT0FUIGZNaW5IZWlnaHQgPSByY01pbi50b3AgLSByY01pbi5ib3R0b207CisgIEZYX0ZMT0FUIGZNYXhXaWR0aCA9IHJjTWF4LnJpZ2h0IC0gcmNNYXgubGVmdDsKKyAgRlhfRkxPQVQgZk1heEhlaWdodCA9IHJjTWF4LnRvcCAtIHJjTWF4LmJvdHRvbTsKKworICBzd2l0Y2ggKG1fc2JUeXBlKSB7CisgICAgY2FzZSBTQlRfSFNDUk9MTDoKKyAgICAgIGlmIChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQgPiBmTWluV2lkdGggKyBmTWF4V2lkdGggKyAyKSB7CisgICAgICAgIHJjQXJlYSA9IENQREZfUmVjdChyY0NsaWVudC5sZWZ0ICsgZk1pbldpZHRoICsgMSwgcmNDbGllbnQuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDbGllbnQucmlnaHQgLSBmTWF4V2lkdGggLSAxLCByY0NsaWVudC50b3ApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmNBcmVhID0gQ1BERl9SZWN0KHJjQ2xpZW50LmxlZnQgKyBmTWluV2lkdGggKyAxLCByY0NsaWVudC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5sZWZ0ICsgZk1pbldpZHRoICsgMSwgcmNDbGllbnQudG9wKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0JUX1ZTQ1JPTEw6CisgICAgICBpZiAocmNDbGllbnQudG9wIC0gcmNDbGllbnQuYm90dG9tID4gZk1pbkhlaWdodCArIGZNYXhIZWlnaHQgKyAyKSB7CisgICAgICAgIHJjQXJlYSA9IENQREZfUmVjdChyY0NsaWVudC5sZWZ0LCByY0NsaWVudC5ib3R0b20gKyBmTWluSGVpZ2h0ICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LnJpZ2h0LCByY0NsaWVudC50b3AgLSBmTWF4SGVpZ2h0IC0gMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByY0FyZWEgPSBDUERGX1JlY3QocmNDbGllbnQubGVmdCwgcmNDbGllbnQuYm90dG9tICsgZk1pbkhlaWdodCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5yaWdodCwgcmNDbGllbnQuYm90dG9tICsgZk1pbkhlaWdodCArIDEpOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKworICByY0FyZWEuTm9ybWFsaXplKCk7CisKKyAgcmV0dXJuIHJjQXJlYTsKIH0KIAotdm9pZCBDUFdMX1Njcm9sbEJhcjo6T25NYXhCdXR0b25MQlVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkKLXsKK0ZYX0ZMT0FUIENQV0xfU2Nyb2xsQmFyOjpUcnVlVG9GYWNlKEZYX0ZMT0FUIGZUcnVlKSB7CisgIENQREZfUmVjdCByY1Bvc0FyZWE7CisgIHJjUG9zQXJlYSA9IEdldFNjcm9sbEFyZWEoKTsKKworICBGWF9GTE9BVCBmRmFjdFdpZHRoID0gbV9zRGF0YS5TY3JvbGxSYW5nZS5HZXRXaWR0aCgpICsgbV9zRGF0YS5mQ2xpZW50V2lkdGg7CisgIGZGYWN0V2lkdGggPSBmRmFjdFdpZHRoID09IDAgPyAxIDogZkZhY3RXaWR0aDsKKworICBGWF9GTE9BVCBmRmFjZSA9IDA7CisKKyAgc3dpdGNoIChtX3NiVHlwZSkgeworICAgIGNhc2UgU0JUX0hTQ1JPTEw6CisgICAgICBmRmFjZSA9IHJjUG9zQXJlYS5sZWZ0ICsKKyAgICAgICAgICAgICAgZlRydWUgKiAocmNQb3NBcmVhLnJpZ2h0IC0gcmNQb3NBcmVhLmxlZnQpIC8gZkZhY3RXaWR0aDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0JUX1ZTQ1JPTEw6CisgICAgICBmRmFjZSA9IHJjUG9zQXJlYS50b3AgLQorICAgICAgICAgICAgICBmVHJ1ZSAqIChyY1Bvc0FyZWEudG9wIC0gcmNQb3NBcmVhLmJvdHRvbSkgLyBmRmFjdFdpZHRoOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gZkZhY2U7CiB9CiAKLXZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uTWF4QnV0dG9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkKLXsJCitGWF9GTE9BVCBDUFdMX1Njcm9sbEJhcjo6RmFjZVRvVHJ1ZShGWF9GTE9BVCBmRmFjZSkgeworICBDUERGX1JlY3QgcmNQb3NBcmVhOworICByY1Bvc0FyZWEgPSBHZXRTY3JvbGxBcmVhKCk7CisKKyAgRlhfRkxPQVQgZkZhY3RXaWR0aCA9IG1fc0RhdGEuU2Nyb2xsUmFuZ2UuR2V0V2lkdGgoKSArIG1fc0RhdGEuZkNsaWVudFdpZHRoOworICBmRmFjdFdpZHRoID0gZkZhY3RXaWR0aCA9PSAwID8gMSA6IGZGYWN0V2lkdGg7CisKKyAgRlhfRkxPQVQgZlRydWUgPSAwOworCisgIHN3aXRjaCAobV9zYlR5cGUpIHsKKyAgICBjYXNlIFNCVF9IU0NST0xMOgorICAgICAgZlRydWUgPSAoZkZhY2UgLSByY1Bvc0FyZWEubGVmdCkgKiBmRmFjdFdpZHRoIC8KKyAgICAgICAgICAgICAgKHJjUG9zQXJlYS5yaWdodCAtIHJjUG9zQXJlYS5sZWZ0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0JUX1ZTQ1JPTEw6CisgICAgICBmVHJ1ZSA9IChyY1Bvc0FyZWEudG9wIC0gZkZhY2UpICogZkZhY3RXaWR0aCAvCisgICAgICAgICAgICAgIChyY1Bvc0FyZWEudG9wIC0gcmNQb3NBcmVhLmJvdHRvbSk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBmVHJ1ZTsKIH0KIAotdm9pZCBDUFdMX1Njcm9sbEJhcjo6T25Qb3NCdXR0b25MQkRvd24oY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KQotewotCW1fYk1vdXNlRG93biA9IFRSVUU7Ci0KLQlpZiAobV9wUG9zQnV0dG9uKQotCXsKLQkJQ1BERl9SZWN0IHJjUG9zQnV0dG9uID0gbV9wUG9zQnV0dG9uLT5HZXRXaW5kb3dSZWN0KCk7Ci0KLQkJc3dpdGNoKG1fc2JUeXBlKQotCQl7Ci0JCWNhc2UgU0JUX0hTQ1JPTEw6Ci0JCQltX25PbGRQb3MgPSBwb2ludC54OwotCQkJbV9mT2xkUG9zQnV0dG9uID0gcmNQb3NCdXR0b24ubGVmdDsKLQkJCWJyZWFrOwotCQljYXNlIFNCVF9WU0NST0xMOgotCQkJbV9uT2xkUG9zID0gcG9pbnQueTsKLQkJCW1fZk9sZFBvc0J1dHRvbiA9IHJjUG9zQnV0dG9uLnRvcDsKLQkJCWJyZWFrOwotCQl9Ci0JfQordm9pZCBDUFdMX1Njcm9sbEJhcjo6Q3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCkgeworICBDcmVhdGVCdXR0b25zKGNwKTsKIH0KIAotdm9pZCBDUFdMX1Njcm9sbEJhcjo6T25Qb3NCdXR0b25MQlVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkKLXsKLQlpZiAobV9iTW91c2VEb3duKQotCXsKLQkJaWYgKCFtX2JOb3RpZnlGb3JldmVyKQotCQkJTm90aWZ5U2Nyb2xsV2luZG93KCk7Ci0JfQotCW1fYk1vdXNlRG93biA9IEZBTFNFOwordm9pZCBDUFdMX1Njcm9sbEJhcjo6VGltZXJQcm9jKCkgeworICBQV0xfU0NST0xMX1BSSVZBVEVEQVRBIHNUZW1wID0gbV9zRGF0YTsKKworICBpZiAobV9iTWluT3JNYXgpCisgICAgbV9zRGF0YS5TdWJTbWFsbCgpOworICBlbHNlCisgICAgbV9zRGF0YS5BZGRTbWFsbCgpOworCisgIGlmIChGWFNZU19tZW1jbXAoJm1fc0RhdGEsICZzVGVtcCwgc2l6ZW9mKFBXTF9TQ1JPTExfUFJJVkFURURBVEEpKSAhPSAwKSB7CisgICAgTW92ZVBvc0J1dHRvbihUUlVFKTsKKyAgICBOb3RpZnlTY3JvbGxXaW5kb3coKTsKKyAgfQogfQotCi12b2lkIENQV0xfU2Nyb2xsQmFyOjpPblBvc0J1dHRvbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpCi17Ci0JRlhfRkxPQVQgZk9sZFNjcm9sbFBvcyA9IG1fc0RhdGEuZlNjcm9sbFBvczsKLQotCUZYX0ZMT0FUIGZOZXdQb3MgPSAwOwotCi0Jc3dpdGNoIChtX3NiVHlwZSkKLQl7Ci0JY2FzZSBTQlRfSFNDUk9MTDoKLQkJaWYgKEZYU1lTX2ZhYnMocG9pbnQueCAtIG1fbk9sZFBvcykgPCAxKSByZXR1cm47Ci0JCWZOZXdQb3MgPSBGYWNlVG9UcnVlKG1fZk9sZFBvc0J1dHRvbiArIHBvaW50LnggLSBtX25PbGRQb3MpOwotCQlicmVhazsKLQljYXNlIFNCVF9WU0NST0xMOgotCQlpZiAoRlhTWVNfZmFicyhwb2ludC55IC0gbV9uT2xkUG9zKSA8IDEpIHJldHVybjsKLQkJZk5ld1BvcyA9IEZhY2VUb1RydWUobV9mT2xkUG9zQnV0dG9uICsgcG9pbnQueSAtIG1fbk9sZFBvcyk7Ci0JCWJyZWFrOwotCX0KLQotCWlmIChtX2JNb3VzZURvd24pCi0JewotCQlzd2l0Y2ggKG1fc2JUeXBlKQotCQl7Ci0JCWNhc2UgU0JUX0hTQ1JPTEw6Ci0KLQkJCWlmIChJc0Zsb2F0U21hbGxlcihmTmV3UG9zLCBtX3NEYXRhLlNjcm9sbFJhbmdlLmZNaW4pKQotCQkJewotCQkJCWZOZXdQb3MgPSBtX3NEYXRhLlNjcm9sbFJhbmdlLmZNaW47Ci0JCQl9Ci0KLQkJCWlmIChJc0Zsb2F0QmlnZ2VyKGZOZXdQb3MsIG1fc0RhdGEuU2Nyb2xsUmFuZ2UuZk1heCkpCi0JCQl7Ci0JCQkJZk5ld1BvcyA9IG1fc0RhdGEuU2Nyb2xsUmFuZ2UuZk1heDsKLQkJCX0KLQotCQkJbV9zRGF0YS5TZXRQb3MoZk5ld1Bvcyk7Ci0JCQkKLQkJCWJyZWFrOwotCQljYXNlIFNCVF9WU0NST0xMOgotCQkKLQkJCWlmIChJc0Zsb2F0U21hbGxlcihmTmV3UG9zLCBtX3NEYXRhLlNjcm9sbFJhbmdlLmZNaW4pKQotCQkJewotCQkJCWZOZXdQb3MgPSBtX3NEYXRhLlNjcm9sbFJhbmdlLmZNaW47Ci0JCQl9Ci0KLQkJCWlmIChJc0Zsb2F0QmlnZ2VyKGZOZXdQb3MsIG1fc0RhdGEuU2Nyb2xsUmFuZ2UuZk1heCkpCi0JCQl7Ci0JCQkJZk5ld1BvcyA9IG1fc0RhdGEuU2Nyb2xsUmFuZ2UuZk1heDsKLQkJCX0JCi0KLQkJCW1fc0RhdGEuU2V0UG9zKGZOZXdQb3MpOwotCQkKLQkJCWJyZWFrOwotCQl9CQotCQkKLQkJaWYgKCFJc0Zsb2F0RXF1YWwoZk9sZFNjcm9sbFBvcywgbV9zRGF0YS5mU2Nyb2xsUG9zKSkKLQkJewkJCQotCQkJTW92ZVBvc0J1dHRvbihUUlVFKTsKLQotCQkJaWYgKG1fYk5vdGlmeUZvcmV2ZXIpCi0JCQkJTm90aWZ5U2Nyb2xsV2luZG93KCk7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok5vdGlmeVNjcm9sbFdpbmRvdygpCi17Ci0JaWYgKENQV0xfV25kICogcFBhcmVudCA9IHRoaXMtPkdldFBhcmVudFdpbmRvdygpKQotCXsKLQkJRlhfRkxPQVQgZlBvczsKLQkJc3dpdGNoICh0aGlzLT5tX3NiVHlwZSkKLQkJewotCQljYXNlIFNCVF9IU0NST0xMOgotCQkJZlBvcyA9IG1fT3JpZ2luSW5mby5mQ29udGVudE1pbiArIG1fc0RhdGEuZlNjcm9sbFBvczsKLQkJCWJyZWFrOwotCQljYXNlIFNCVF9WU0NST0xMOgotCQkJZlBvcyA9IG1fT3JpZ2luSW5mby5mQ29udGVudE1heCAtIG1fc0RhdGEuZlNjcm9sbFBvczsKLQkJCWJyZWFrOwotCQl9CQotCQlwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLFBOTV9TQ1JPTExXSU5ET1csKEZYX0lOVFBUUiltX3NiVHlwZSwoRlhfSU5UUFRSKSZmUG9zKTsKLQl9Ci19Ci0KLUNQREZfUmVjdCBDUFdMX1Njcm9sbEJhcjo6R2V0U2Nyb2xsQXJlYSgpIGNvbnN0Ci17Ci0JQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwotCUNQREZfUmVjdCByY0FyZWE7Ci0KLQlpZiAoIW1fcE1pbkJ1dHRvbiB8fCAhbV9wTWF4QnV0dG9uKXJldHVybiByY0NsaWVudDsKLQotCUNQREZfUmVjdCByY01pbiA9IG1fcE1pbkJ1dHRvbi0+R2V0V2luZG93UmVjdCgpOwotCUNQREZfUmVjdCByY01heCA9IG1fcE1heEJ1dHRvbi0+R2V0V2luZG93UmVjdCgpOwotCi0JRlhfRkxPQVQgZk1pbldpZHRoID0gcmNNaW4ucmlnaHQgLSByY01pbi5sZWZ0OwotCUZYX0ZMT0FUIGZNaW5IZWlnaHQgPSByY01pbi50b3AgLSByY01pbi5ib3R0b207Ci0JRlhfRkxPQVQgZk1heFdpZHRoID0gcmNNYXgucmlnaHQgLSByY01heC5sZWZ0OwotCUZYX0ZMT0FUIGZNYXhIZWlnaHQgPSByY01heC50b3AgLSByY01heC5ib3R0b207Ci0KLQlzd2l0Y2gobV9zYlR5cGUpCi0JewotCWNhc2UgU0JUX0hTQ1JPTEw6Ci0JCWlmIChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQgPiBmTWluV2lkdGggKyBmTWF4V2lkdGggKyAyKQotCQl7Ci0JCQlyY0FyZWEgPSBDUERGX1JlY3QocmNDbGllbnQubGVmdCArIGZNaW5XaWR0aCArIDEscmNDbGllbnQuYm90dG9tLAotCQkJCQkJcmNDbGllbnQucmlnaHQgLSBmTWF4V2lkdGggLSAxLHJjQ2xpZW50LnRvcCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlyY0FyZWEgPSBDUERGX1JlY3QocmNDbGllbnQubGVmdCArIGZNaW5XaWR0aCArIDEscmNDbGllbnQuYm90dG9tLAotCQkJCQkJcmNDbGllbnQubGVmdCArIGZNaW5XaWR0aCArIDEscmNDbGllbnQudG9wKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNCVF9WU0NST0xMOgotCQlpZiAocmNDbGllbnQudG9wIC0gcmNDbGllbnQuYm90dG9tID4gZk1pbkhlaWdodCArIGZNYXhIZWlnaHQgKyAyKQotCQl7Ci0JCQlyY0FyZWEgPSBDUERGX1JlY3QocmNDbGllbnQubGVmdCxyY0NsaWVudC5ib3R0b20gKyBmTWluSGVpZ2h0ICsgMSwKLQkJCQkJCXJjQ2xpZW50LnJpZ2h0LHJjQ2xpZW50LnRvcCAtIGZNYXhIZWlnaHQgLSAxKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJjQXJlYSA9IENQREZfUmVjdChyY0NsaWVudC5sZWZ0LHJjQ2xpZW50LmJvdHRvbSArIGZNaW5IZWlnaHQgKyAxLAotCQkJCQkJcmNDbGllbnQucmlnaHQscmNDbGllbnQuYm90dG9tICsgZk1pbkhlaWdodCArIDEpOwotCQl9Ci0JCWJyZWFrOwotCX0KLQkKLQlyY0FyZWEuTm9ybWFsaXplKCk7Ci0KLQlyZXR1cm4gcmNBcmVhOwotfQotCi1GWF9GTE9BVCBDUFdMX1Njcm9sbEJhcjo6VHJ1ZVRvRmFjZShGWF9GTE9BVCBmVHJ1ZSkKLXsKLQlDUERGX1JlY3QgcmNQb3NBcmVhOwkKLQlyY1Bvc0FyZWEgPSBHZXRTY3JvbGxBcmVhKCk7Ci0KLQlGWF9GTE9BVCBmRmFjdFdpZHRoID0gbV9zRGF0YS5TY3JvbGxSYW5nZS5HZXRXaWR0aCgpICsgbV9zRGF0YS5mQ2xpZW50V2lkdGg7Ci0JZkZhY3RXaWR0aCA9IGZGYWN0V2lkdGggPT0gMCA/IDEgOiBmRmFjdFdpZHRoOwotCi0JRlhfRkxPQVQgZkZhY2UgPSAwOwotCi0Jc3dpdGNoKG1fc2JUeXBlKQotCXsKLQljYXNlIFNCVF9IU0NST0xMOgotCQlmRmFjZSA9IHJjUG9zQXJlYS5sZWZ0ICsgZlRydWUgKiAocmNQb3NBcmVhLnJpZ2h0IC0gcmNQb3NBcmVhLmxlZnQpIC8gZkZhY3RXaWR0aDsKLQkJYnJlYWs7Ci0JY2FzZSBTQlRfVlNDUk9MTDoKLQkJZkZhY2UgPSByY1Bvc0FyZWEudG9wIC0gZlRydWUgKiAocmNQb3NBcmVhLnRvcCAtIHJjUG9zQXJlYS5ib3R0b20pIC8gZkZhY3RXaWR0aDsKLQkJYnJlYWs7Ci0JfQkKLQotCXJldHVybiBmRmFjZTsKLX0KLQotRlhfRkxPQVQgQ1BXTF9TY3JvbGxCYXI6OkZhY2VUb1RydWUoRlhfRkxPQVQgZkZhY2UpCi17Ci0JQ1BERl9SZWN0IHJjUG9zQXJlYTsJCi0JcmNQb3NBcmVhID0gR2V0U2Nyb2xsQXJlYSgpOwotCi0JRlhfRkxPQVQgZkZhY3RXaWR0aCA9IG1fc0RhdGEuU2Nyb2xsUmFuZ2UuR2V0V2lkdGgoKSArIG1fc0RhdGEuZkNsaWVudFdpZHRoOwotCWZGYWN0V2lkdGggPSBmRmFjdFdpZHRoID09IDAgPyAxIDogZkZhY3RXaWR0aDsKLQotCUZYX0ZMT0FUIGZUcnVlID0gMDsKLQotCXN3aXRjaChtX3NiVHlwZSkKLQl7Ci0JY2FzZSBTQlRfSFNDUk9MTDoKLQkJZlRydWUgPSAgKGZGYWNlIC0gcmNQb3NBcmVhLmxlZnQpICogZkZhY3RXaWR0aCAvIChyY1Bvc0FyZWEucmlnaHQgLSByY1Bvc0FyZWEubGVmdCk7Ci0JCWJyZWFrOwotCWNhc2UgU0JUX1ZTQ1JPTEw6Ci0JCWZUcnVlID0gKHJjUG9zQXJlYS50b3AgLSBmRmFjZSkgKiBmRmFjdFdpZHRoIC8gKHJjUG9zQXJlYS50b3AgLSByY1Bvc0FyZWEuYm90dG9tKTsKLQkJYnJlYWs7Ci0JfQkKLQotCXJldHVybiBmVHJ1ZTsKLX0KLQotdm9pZCBDUFdMX1Njcm9sbEJhcjo6Q3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNICYgY3ApCi17Ci0JQ3JlYXRlQnV0dG9ucyhjcCk7Ci19Ci0KLXZvaWQgQ1BXTF9TY3JvbGxCYXI6OlRpbWVyUHJvYygpCi17Ci0JUFdMX1NDUk9MTF9QUklWQVRFREFUQSBzVGVtcCA9IG1fc0RhdGE7Ci0KLQlpZiAobV9iTWluT3JNYXgpbV9zRGF0YS5TdWJTbWFsbCgpOwkKLQllbHNlIG1fc0RhdGEuQWRkU21hbGwoKTsKLQotCWlmIChGWFNZU19tZW1jbXAoJm1fc0RhdGEsICZzVGVtcCwgc2l6ZW9mKFBXTF9TQ1JPTExfUFJJVkFURURBVEEpKSAhPSAwKQotCXsKLQkJTW92ZVBvc0J1dHRvbihUUlVFKTsKLQkJTm90aWZ5U2Nyb2xsV2luZG93KCk7Ci0JfQotfQotCi0vKgotdm9pZCBDUFdMX1Njcm9sbEJhcjo6T25TZXRGb2N1cygpCi17Ci0JaWYgKEdldFRyYW5zcGFyZW5jeSgpICE9IDI1NSkKLQl7Ci0JCVNldFRyYW5zcGFyZW5jeSgyNTUpOwotCQlJbnZhbGlkYXRlUmVjdCgpOwotCX0KLX0KLQotdm9pZCBDUFdMX1Njcm9sbEJhcjo6T25LaWxsRm9jdXMoKQotewotCWlmIChHZXRUcmFuc3BhcmVuY3koKSAhPSBQV0xfU0NST0xMQkFSX1RSQU5TUEFSQU5DWSkKLQl7Ci0JCVNldFRyYW5zcGFyZW5jeShQV0xfU0NST0xMQkFSX1RSQU5TUEFSQU5DWSk7Ci0JCUludmFsaWRhdGVSZWN0KCk7Ci0JfQotfQotKi8KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TaWduYXR1cmUuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TaWduYXR1cmUuY3BwCmluZGV4IDVkNzljZTkuLmY3YzczZDAgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfU2lnbmF0dXJlLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1NpZ25hdHVyZS5jcHAKQEAgLTEsMjIwICsxLDE3NiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUERGV2luZG93LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9JY29uLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1NpZ25hdHVyZS5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9MYWJlbC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ljb24uaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9MYWJlbC5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1NpZ25hdHVyZS5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1V0aWxzLmgiCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfV25kLmgiCiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX1NpZ25hdHVyZV9JbWFnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK0NQV0xfU2lnbmF0dXJlX0ltYWdlOjpDUFdMX1NpZ25hdHVyZV9JbWFnZSgpIDogbV9wSW1hZ2UoTlVMTCkge30KIAotQ1BXTF9TaWduYXR1cmVfSW1hZ2U6OkNQV0xfU2lnbmF0dXJlX0ltYWdlKCkgOiBtX3BJbWFnZShOVUxMKQoteworQ1BXTF9TaWduYXR1cmVfSW1hZ2U6On5DUFdMX1NpZ25hdHVyZV9JbWFnZSgpIHt9CisKK3ZvaWQgQ1BXTF9TaWduYXR1cmVfSW1hZ2U6OlNldEltYWdlKENGWF9ESUJTb3VyY2UqIHBJbWFnZSkgeworICBtX3BJbWFnZSA9IHBJbWFnZTsKIH0KIAotQ1BXTF9TaWduYXR1cmVfSW1hZ2U6On5DUFdMX1NpZ25hdHVyZV9JbWFnZSgpCi17CitDRlhfRElCU291cmNlKiBDUFdMX1NpZ25hdHVyZV9JbWFnZTo6R2V0SW1hZ2UoKSB7CisgIHJldHVybiBtX3BJbWFnZTsKIH0KIAotdm9pZCBDUFdMX1NpZ25hdHVyZV9JbWFnZTo6U2V0SW1hZ2UoQ0ZYX0RJQlNvdXJjZSogcEltYWdlKQotewotCW1fcEltYWdlID0gcEltYWdlOwordm9pZCBDUFdMX1NpZ25hdHVyZV9JbWFnZTo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlKSB7CisgIENQV0xfV25kOjpEcmF3VGhpc0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlKTsKKworICBpZiAobV9wSW1hZ2UpIHsKKyAgICBDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CisKKyAgICBGWF9GTE9BVCB4LCB5OworICAgIHBVc2VyMkRldmljZS0+VHJhbnNmb3JtKHJjQ2xpZW50LmxlZnQsIHJjQ2xpZW50LnRvcCwgeCwgeSk7CisKKyAgICBwRGV2aWNlLT5TdHJldGNoRElCaXRzKG1fcEltYWdlLCAoaW50MzJfdCl4LCAoaW50MzJfdCl5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpcmNDbGllbnQuV2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KXJjQ2xpZW50LkhlaWdodCgpKTsKKyAgfQogfQogCi1DRlhfRElCU291cmNlKiBDUFdMX1NpZ25hdHVyZV9JbWFnZTo6R2V0SW1hZ2UoKQotewotCXJldHVybiBtX3BJbWFnZTsKK3ZvaWQgQ1BXTF9TaWduYXR1cmVfSW1hZ2U6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKAorICAgIENGWF9CeXRlVGV4dEJ1ZiYgc0FwcFN0cmVhbSkgeworICBzQXBwU3RyZWFtIDw8IENQV0xfSW1hZ2U6OkdldEltYWdlQXBwU3RyZWFtKCk7CiB9CiAKLXZvaWQgQ1BXTF9TaWduYXR1cmVfSW1hZ2U6OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKQotewotCUNQV0xfV25kOjpEcmF3VGhpc0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlKTsKK3ZvaWQgQ1BXTF9TaWduYXR1cmVfSW1hZ2U6OkdldFNjYWxlKEZYX0ZMT0FUJiBmSFNjYWxlLCBGWF9GTE9BVCYgZlZTY2FsZSkgeworICBGWF9GTE9BVCBmSW1hZ2VXLCBmSW1hZ2VIOwogCi0JaWYgKG1fcEltYWdlKQotCXsKLQkJQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworICBHZXRJbWFnZVNpemUoZkltYWdlVywgZkltYWdlSCk7CiAKLQkJRlhfRkxPQVQgeCwgeTsKLQkJcFVzZXIyRGV2aWNlLT5UcmFuc2Zvcm0ocmNDbGllbnQubGVmdCwgcmNDbGllbnQudG9wLCB4LCB5KTsKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwogCi0JCXBEZXZpY2UtPlN0cmV0Y2hESUJpdHMobV9wSW1hZ2UsIChGWF9JTlQzMil4LCAoRlhfSU5UMzIpeSwgCi0JCQkoRlhfSU5UMzIpcmNDbGllbnQuV2lkdGgoKSwgKEZYX0lOVDMyKXJjQ2xpZW50LkhlaWdodCgpKTsKLQl9CisgIGZIU2NhbGUgPSByY0NsaWVudC5XaWR0aCgpIC8gZkltYWdlVzsKKyAgZlZTY2FsZSA9IHJjQ2xpZW50LkhlaWdodCgpIC8gZkltYWdlSDsKIH0KIAotdm9pZCBDUFdMX1NpZ25hdHVyZV9JbWFnZTo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSkKLXsKLQlzQXBwU3RyZWFtIDw8IENQV0xfSW1hZ2U6OkdldEltYWdlQXBwU3RyZWFtKCk7CitDUFdMX1NpZ25hdHVyZTo6Q1BXTF9TaWduYXR1cmUoKQorICAgIDogbV9wVGV4dChOVUxMKSwKKyAgICAgIG1fcERlc2NyaXB0aW9uKE5VTEwpLAorICAgICAgbV9wSW1hZ2UoTlVMTCksCisgICAgICBtX2JUZXh0RXhpc3QoVFJVRSksCisgICAgICBtX2JJbWFnZUV4aXN0KEZBTFNFKSwKKyAgICAgIG1fYkZsYWdFeGlzdChUUlVFKSB7fQorCitDUFdMX1NpZ25hdHVyZTo6fkNQV0xfU2lnbmF0dXJlKCkge30KKwordm9pZCBDUFdMX1NpZ25hdHVyZTo6U2V0VGV4dEZsYWcoRlhfQk9PTCBiVGV4dEV4aXN0KSB7CisgIG1fYlRleHRFeGlzdCA9IGJUZXh0RXhpc3Q7CisKKyAgUmVQb3NDaGlsZFduZCgpOwogfQogCi12b2lkIENQV0xfU2lnbmF0dXJlX0ltYWdlOjpHZXRTY2FsZShGWF9GTE9BVCAmIGZIU2NhbGUsRlhfRkxPQVQgJiBmVlNjYWxlKQotewotCUZYX0ZMT0FUIGZJbWFnZVcsIGZJbWFnZUg7Cit2b2lkIENQV0xfU2lnbmF0dXJlOjpTZXRJbWFnZUZsYWcoRlhfQk9PTCBiSW1hZ2VFeGlzdCkgeworICBtX2JJbWFnZUV4aXN0ID0gYkltYWdlRXhpc3Q7CiAKLQlHZXRJbWFnZVNpemUoZkltYWdlVywgZkltYWdlSCk7Ci0KLQlDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7Ci0KLQlmSFNjYWxlID0gcmNDbGllbnQuV2lkdGgoKSAvIGZJbWFnZVc7Ci0JZlZTY2FsZSA9IHJjQ2xpZW50LkhlaWdodCgpIC8gZkltYWdlSDsJCisgIFJlUG9zQ2hpbGRXbmQoKTsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfU2lnbmF0dXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1DUFdMX1NpZ25hdHVyZTo6Q1BXTF9TaWduYXR1cmUoKSA6IAotCW1fcFRleHQoTlVMTCksCi0JbV9wRGVzY3JpcHRpb24oTlVMTCksCi0JbV9wSW1hZ2UoTlVMTCksCi0JbV9iVGV4dEV4aXN0KFRSVUUpLAotCW1fYkltYWdlRXhpc3QoRkFMU0UpLAotCW1fYkZsYWdFeGlzdChUUlVFKQotewordm9pZCBDUFdMX1NpZ25hdHVyZTo6U2V0Rm94aXRGbGFnKEZYX0JPT0wgYkZsYWdFeGlzdCkgeworICBtX2JGbGFnRXhpc3QgPSBiRmxhZ0V4aXN0OwogfQogCi1DUFdMX1NpZ25hdHVyZTo6fkNQV0xfU2lnbmF0dXJlKCkKLXsKK3ZvaWQgQ1BXTF9TaWduYXR1cmU6OlNldFRleHQoY29uc3QgRlhfV0NIQVIqIHNUZXh0KSB7CisgIG1fcFRleHQtPlNldFRleHQoc1RleHQpOworCisgIFJlUG9zQ2hpbGRXbmQoKTsKIH0KIAotdm9pZCBDUFdMX1NpZ25hdHVyZTo6U2V0VGV4dEZsYWcoRlhfQk9PTCBiVGV4dEV4aXN0KQotewotCW1fYlRleHRFeGlzdCA9IGJUZXh0RXhpc3Q7Cit2b2lkIENQV0xfU2lnbmF0dXJlOjpTZXREZXNjcmlwdGlvbihjb25zdCBGWF9XQ0hBUiogc3RyaW5nKSB7CisgIG1fcERlc2NyaXB0aW9uLT5TZXRUZXh0KHN0cmluZyk7CiAKLQlSZVBvc0NoaWxkV25kKCk7CisgIFJlUG9zQ2hpbGRXbmQoKTsKIH0KIAotdm9pZCBDUFdMX1NpZ25hdHVyZTo6U2V0SW1hZ2VGbGFnKEZYX0JPT0wgYkltYWdlRXhpc3QpCi17Ci0JbV9iSW1hZ2VFeGlzdCA9IGJJbWFnZUV4aXN0Owordm9pZCBDUFdMX1NpZ25hdHVyZTo6U2V0SW1hZ2UoQ0ZYX0RJQlNvdXJjZSogcEltYWdlKSB7CisgIG1fcEltYWdlLT5TZXRJbWFnZShwSW1hZ2UpOwogCi0JUmVQb3NDaGlsZFduZCgpOworICBSZVBvc0NoaWxkV25kKCk7CiB9CiAKLXZvaWQgQ1BXTF9TaWduYXR1cmU6OlNldEZveGl0RmxhZyhGWF9CT09MIGJGbGFnRXhpc3QpCi17Ci0JbV9iRmxhZ0V4aXN0ID0gYkZsYWdFeGlzdDsKK3ZvaWQgQ1BXTF9TaWduYXR1cmU6OlNldEltYWdlU3RyZWFtKENQREZfU3RyZWFtKiBwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogc0ltYWdlQWxpYXMpIHsKKyAgbV9wSW1hZ2UtPlNldFBERlN0cmVhbShwU3RyZWFtKTsKKyAgbV9wSW1hZ2UtPlNldEltYWdlQWxpYXMoc0ltYWdlQWxpYXMpOworCisgIFJlUG9zQ2hpbGRXbmQoKTsKIH0KIAotdm9pZCBDUFdMX1NpZ25hdHVyZTo6U2V0VGV4dChGWF9MUENXU1RSIHNUZXh0KQotewotCW1fcFRleHQtPlNldFRleHQoc1RleHQpOwordm9pZCBDUFdMX1NpZ25hdHVyZTo6UmVQb3NDaGlsZFduZCgpIHsKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwogCi0JUmVQb3NDaGlsZFduZCgpOworICBDUERGX1JlY3QgcmNUZXh0ID0gcmNDbGllbnQ7CisgIENQREZfUmVjdCByY0Rlc2NyaXB0aW9uID0gcmNDbGllbnQ7CisKKyAgRlhfQk9PTCBiVGV4dFZpc2libGUgPSBtX2JUZXh0RXhpc3QgJiYgbV9wVGV4dC0+R2V0VGV4dCgpLkdldExlbmd0aCgpID4gMDsKKworICBpZiAoKGJUZXh0VmlzaWJsZSB8fCBtX2JJbWFnZUV4aXN0KSAmJgorICAgICAgbV9wRGVzY3JpcHRpb24tPkdldFRleHQoKS5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICBpZiAocmNDbGllbnQuV2lkdGgoKSA+PSByY0NsaWVudC5IZWlnaHQoKSkgeworICAgICAgcmNUZXh0LnJpZ2h0ID0gcmNUZXh0LmxlZnQgKyByY0NsaWVudC5XaWR0aCgpIC8gMi4wZjsKKyAgICAgIHJjRGVzY3JpcHRpb24ubGVmdCA9IHJjRGVzY3JpcHRpb24ucmlnaHQgLSByY0NsaWVudC5XaWR0aCgpIC8gMi4wZjsKKyAgICB9IGVsc2UgeworICAgICAgcmNUZXh0LmJvdHRvbSA9IHJjVGV4dC50b3AgLSByY0NsaWVudC5IZWlnaHQoKSAvIDIuMGY7CisgICAgICByY0Rlc2NyaXB0aW9uLnRvcCA9IHJjRGVzY3JpcHRpb24uYm90dG9tICsgcmNDbGllbnQuSGVpZ2h0KCkgLyAyLjBmOworICAgIH0KKyAgfQorCisgIG1fcFRleHQtPlNldFZpc2libGUoYlRleHRWaXNpYmxlKTsKKyAgbV9wSW1hZ2UtPlNldFZpc2libGUobV9iSW1hZ2VFeGlzdCk7CisKKyAgbV9wVGV4dC0+TW92ZShyY1RleHQsIFRSVUUsIEZBTFNFKTsKKyAgbV9wSW1hZ2UtPk1vdmUocmNUZXh0LCBUUlVFLCBGQUxTRSk7CisgIG1fcERlc2NyaXB0aW9uLT5Nb3ZlKHJjRGVzY3JpcHRpb24sIFRSVUUsIEZBTFNFKTsKIH0KIAotdm9pZCBDUFdMX1NpZ25hdHVyZTo6U2V0RGVzY3JpcHRpb24oRlhfTFBDV1NUUiBzdHJpbmcpCi17Ci0JbV9wRGVzY3JpcHRpb24tPlNldFRleHQoc3RyaW5nKTsKK3ZvaWQgQ1BXTF9TaWduYXR1cmU6OkNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApIHsKKyAgbV9wSW1hZ2UgPSBuZXcgQ1BXTF9TaWduYXR1cmVfSW1hZ2U7CisgIFBXTF9DUkVBVEVQQVJBTSBpY3AgPSBjcDsKKyAgaWNwLnBQYXJlbnRXbmQgPSB0aGlzOworICBpY3AuZHdGbGFncyA9IFBXU19DSElMRCB8IFBXU19WSVNJQkxFOworICBpY3Auc1RleHRDb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDApOworICBtX3BJbWFnZS0+Q3JlYXRlKGljcCk7CiAKLQlSZVBvc0NoaWxkV25kKCk7CisgIG1fcFRleHQgPSBuZXcgQ1BXTF9MYWJlbDsKKyAgUFdMX0NSRUFURVBBUkFNIGFjcCA9IGNwOworICBhY3AucFBhcmVudFduZCA9IHRoaXM7CisgIGFjcC5kd0ZsYWdzID0gUFdTX0NISUxEIHwgUFdTX1ZJU0lCTEUgfCBQV1NfQVVUT0ZPTlRTSVpFIHwgUEVTX01VTFRJTElORSB8CisgICAgICAgICAgICAgICAgUEVTX0FVVE9SRVRVUk4gfCBQRVNfTUlERExFIHwgUEVTX0NFTlRFUjsKKyAgYWNwLnNUZXh0Q29sb3IgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwKTsKKyAgbV9wVGV4dC0+Q3JlYXRlKGFjcCk7CisKKyAgbV9wRGVzY3JpcHRpb24gPSBuZXcgQ1BXTF9MYWJlbDsKKyAgUFdMX0NSRUFURVBBUkFNIGRjcCA9IGNwOworICBkY3AucFBhcmVudFduZCA9IHRoaXM7CisgIGRjcC5kd0ZsYWdzID0gUFdTX0NISUxEIHwgUFdTX1ZJU0lCTEUgfCBQV1NfQVVUT0ZPTlRTSVpFIHwgUEVTX01VTFRJTElORSB8CisgICAgICAgICAgICAgICAgUEVTX0FVVE9SRVRVUk4gfCBQRVNfTEVGVCB8IFBFU19DRU5URVI7CisgIGRjcC5zVGV4dENvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMCk7CisgIG1fcERlc2NyaXB0aW9uLT5DcmVhdGUoZGNwKTsKIH0KIAotdm9pZCBDUFdMX1NpZ25hdHVyZTo6U2V0SW1hZ2UoQ0ZYX0RJQlNvdXJjZSogcEltYWdlKQotewotCW1fcEltYWdlLT5TZXRJbWFnZShwSW1hZ2UpOwordm9pZCBDUFdMX1NpZ25hdHVyZTo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlKSB7CisgIENQV0xfV25kOjpEcmF3VGhpc0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlKTsKIAotCVJlUG9zQ2hpbGRXbmQoKTsKKyAgaWYgKG1fYkZsYWdFeGlzdCkgeworICAgIENQV0xfVXRpbHM6OkRyYXdJY29uQXBwU3RyZWFtKAorICAgICAgICBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIFBXTF9JQ09OVFlQRV9GT1hJVCwKKyAgICAgICAgQ1BXTF9VdGlsczo6R2V0Q2VudGVyU3F1YXJlKEdldENsaWVudFJlY3QoKSksCisgICAgICAgIENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgMC45MWYsIDAuODU1ZiwgMC45MmYpLAorICAgICAgICBDUFdMX0NvbG9yKENPTE9SVFlQRV9UUkFOU1BBUkVOVCksIDI1NSk7CisgIH0KIH0KIAotdm9pZCBDUFdMX1NpZ25hdHVyZTo6U2V0SW1hZ2VTdHJlYW0oQ1BERl9TdHJlYW0gKiBwU3RyZWFtLCBGWF9MUENTVFIgc0ltYWdlQWxpYXMpCi17Ci0JbV9wSW1hZ2UtPlNldFBERlN0cmVhbShwU3RyZWFtKTsKLQltX3BJbWFnZS0+U2V0SW1hZ2VBbGlhcyhzSW1hZ2VBbGlhcyk7Ci0KLQlSZVBvc0NoaWxkV25kKCk7Cit2b2lkIENQV0xfU2lnbmF0dXJlOjpHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYmIHNBcHBTdHJlYW0pIHsKKyAgQ1BXTF9XbmQ6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKHNBcHBTdHJlYW0pOwogfQotCi12b2lkIENQV0xfU2lnbmF0dXJlOjpSZVBvc0NoaWxkV25kKCkKLXsKLQlDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7Ci0KLQlDUERGX1JlY3QgcmNUZXh0ID0gcmNDbGllbnQ7Ci0JQ1BERl9SZWN0IHJjRGVzY3JpcHRpb24gPSByY0NsaWVudDsKLQotCUZYX0JPT0wgYlRleHRWaXNpYmxlID0gbV9iVGV4dEV4aXN0ICYmIG1fcFRleHQtPkdldFRleHQoKS5HZXRMZW5ndGgoKSA+IDA7Ci0JCi0JaWYgKChiVGV4dFZpc2libGUgfHwgbV9iSW1hZ2VFeGlzdCkgJiYKLQkJbV9wRGVzY3JpcHRpb24tPkdldFRleHQoKS5HZXRMZW5ndGgoKSA+IDApCi0JewotCQlpZiAocmNDbGllbnQuV2lkdGgoKSA+PSByY0NsaWVudC5IZWlnaHQoKSkKLQkJewotCQkJcmNUZXh0LnJpZ2h0ID0gcmNUZXh0LmxlZnQgKyByY0NsaWVudC5XaWR0aCgpIC8gMi4wZjsKLQkJCXJjRGVzY3JpcHRpb24ubGVmdCA9IHJjRGVzY3JpcHRpb24ucmlnaHQgLSByY0NsaWVudC5XaWR0aCgpIC8gMi4wZjsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJjVGV4dC5ib3R0b20gPSByY1RleHQudG9wIC0gcmNDbGllbnQuSGVpZ2h0KCkgLyAyLjBmOwotCQkJcmNEZXNjcmlwdGlvbi50b3AgPSByY0Rlc2NyaXB0aW9uLmJvdHRvbSArIHJjQ2xpZW50LkhlaWdodCgpIC8gMi4wZjsKLQkJfQotCX0KLQotCW1fcFRleHQtPlNldFZpc2libGUoYlRleHRWaXNpYmxlKTsKLQltX3BJbWFnZS0+U2V0VmlzaWJsZShtX2JJbWFnZUV4aXN0KTsKLQotCW1fcFRleHQtPk1vdmUocmNUZXh0LCBUUlVFLCBGQUxTRSk7Ci0JbV9wSW1hZ2UtPk1vdmUocmNUZXh0LCBUUlVFLCBGQUxTRSk7Ci0JbV9wRGVzY3JpcHRpb24tPk1vdmUocmNEZXNjcmlwdGlvbiwgVFJVRSwgRkFMU0UpOwotfQotCi12b2lkIENQV0xfU2lnbmF0dXJlOjpDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCkKLXsKLQltX3BJbWFnZSA9IG5ldyBDUFdMX1NpZ25hdHVyZV9JbWFnZTsKLQlQV0xfQ1JFQVRFUEFSQU0gaWNwID0gY3A7Ci0JaWNwLnBQYXJlbnRXbmQgPSB0aGlzOwotCWljcC5kd0ZsYWdzID0gUFdTX0NISUxEIHwgUFdTX1ZJU0lCTEU7Ci0JaWNwLnNUZXh0Q29sb3IgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwKTsKLQltX3BJbWFnZS0+Q3JlYXRlKGljcCk7Ci0KLQltX3BUZXh0ID0gbmV3IENQV0xfTGFiZWw7Ci0JUFdMX0NSRUFURVBBUkFNIGFjcCA9IGNwOwotCWFjcC5wUGFyZW50V25kID0gdGhpczsKLQlhY3AuZHdGbGFncyA9IFBXU19DSElMRCB8IFBXU19WSVNJQkxFIHwgUFdTX0FVVE9GT05UU0laRSB8IFBFU19NVUxUSUxJTkUgfCBQRVNfQVVUT1JFVFVSTiB8IFBFU19NSURETEUgfCBQRVNfQ0VOVEVSOwotCWFjcC5zVGV4dENvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMCk7Ci0JbV9wVGV4dC0+Q3JlYXRlKGFjcCk7Ci0KLQltX3BEZXNjcmlwdGlvbiA9IG5ldyBDUFdMX0xhYmVsOwotCVBXTF9DUkVBVEVQQVJBTSBkY3AgPSBjcDsKLQlkY3AucFBhcmVudFduZCA9IHRoaXM7Ci0JZGNwLmR3RmxhZ3MgPSBQV1NfQ0hJTEQgfCBQV1NfVklTSUJMRSB8IFBXU19BVVRPRk9OVFNJWkUgfCBQRVNfTVVMVElMSU5FIHwgUEVTX0FVVE9SRVRVUk4gfCBQRVNfTEVGVCB8IFBFU19DRU5URVI7Ci0JZGNwLnNUZXh0Q29sb3IgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwKTsKLQltX3BEZXNjcmlwdGlvbi0+Q3JlYXRlKGRjcCk7Ci19Ci0KLXZvaWQgQ1BXTF9TaWduYXR1cmU6OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKQotewotCUNQV0xfV25kOjpEcmF3VGhpc0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlKTsKLQotCWlmIChtX2JGbGFnRXhpc3QpCi0JCUNQV0xfVXRpbHM6OkRyYXdJY29uQXBwU3RyZWFtKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgUFdMX0lDT05UWVBFX0ZPWElULCBDUFdMX1V0aWxzOjpHZXRDZW50ZXJTcXVhcmUoR2V0Q2xpZW50UmVjdCgpKSwKLQkJCUNQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwwLjkxZiwwLjg1NWYsMC45MmYpLCBDUFdMX0NvbG9yKENPTE9SVFlQRV9UUkFOU1BBUkVOVCksIDI1NSk7Ci0KLQkvKgotCUNQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKLQotCUNGWF9QYXRoRGF0YSBwYXRoOwotCi0JcGF0aC5TZXRQb2ludENvdW50KDIpOwotCXBhdGguU2V0UG9pbnQoMCwgcmNDbGllbnQubGVmdCwgKHJjQ2xpZW50LnRvcCArIHJjQ2xpZW50LmJvdHRvbSkgKiAwLjVmLCBGWFBUX01PVkVUTyk7Ci0JcGF0aC5TZXRQb2ludCgxLCByY0NsaWVudC5yaWdodCwgKHJjQ2xpZW50LnRvcCArIHJjQ2xpZW50LmJvdHRvbSkgKiAwLjVmLCBGWFBUX0xJTkVUTyk7Ci0KLQlDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOwotCWdzZC5TZXREYXNoQ291bnQoMik7CQkJCQotCWdzZC5tX0Rhc2hBcnJheVswXSA9IDYuMGY7Ci0JZ3NkLm1fRGFzaEFycmF5WzFdID0gNi4wZjsKLQlnc2QubV9EYXNoUGhhc2UgPSAwOwkKLQkKLQlnc2QubV9MaW5lV2lkdGggPSAxMC4wZjsKLQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCAmZ3NkLCAwLCBBcmdiRW5jb2RlKDI1NSwyNTUsMCwwKSwgRlhGSUxMX0FMVEVSTkFURSk7Ci0JKi8KLX0KLQotdm9pZCBDUFdMX1NpZ25hdHVyZTo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSkKLXsKLQlDUFdMX1duZDo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oc0FwcFN0cmVhbSk7Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TcGVjaWFsQnV0dG9uLmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfU3BlY2lhbEJ1dHRvbi5jcHAKaW5kZXggNjA5YmVlYi4uNTJmMjVmYyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TcGVjaWFsQnV0dG9uLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1NwZWNpYWxCdXR0b24uY3BwCkBAIC0xLDExMCArMSw4MCBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUERGV2luZG93LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9CdXR0b24uaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfU3BlY2lhbEJ1dHRvbi5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0J1dHRvbi5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1NwZWNpYWxCdXR0b24uaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oIgogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9QdXNoQnV0dG9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK0NQV0xfUHVzaEJ1dHRvbjo6Q1BXTF9QdXNoQnV0dG9uKCkge30KIAotQ1BXTF9QdXNoQnV0dG9uOjpDUFdMX1B1c2hCdXR0b24oKQoteworQ1BXTF9QdXNoQnV0dG9uOjp+Q1BXTF9QdXNoQnV0dG9uKCkge30KKworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9QdXNoQnV0dG9uOjpHZXRDbGFzc05hbWUoKSBjb25zdCB7CisgIHJldHVybiAiQ1BXTF9QdXNoQnV0dG9uIjsKIH0KIAotQ1BXTF9QdXNoQnV0dG9uOjp+Q1BXTF9QdXNoQnV0dG9uKCkKLXsKK0NQREZfUmVjdCBDUFdMX1B1c2hCdXR0b246OkdldEZvY3VzUmVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KEdldFdpbmRvd1JlY3QoKSwgKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCkpOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUFdMX1B1c2hCdXR0b246OkdldENsYXNzTmFtZSgpIGNvbnN0Ci17Ci0JcmV0dXJuICJDUFdMX1B1c2hCdXR0b24iOworQ1BXTF9DaGVja0JveDo6Q1BXTF9DaGVja0JveCgpIDogbV9iQ2hlY2tlZChGQUxTRSkge30KKworQ1BXTF9DaGVja0JveDo6fkNQV0xfQ2hlY2tCb3goKSB7fQorCitDRlhfQnl0ZVN0cmluZyBDUFdMX0NoZWNrQm94OjpHZXRDbGFzc05hbWUoKSBjb25zdCB7CisgIHJldHVybiAiQ1BXTF9DaGVja0JveCI7CiB9CiAKLUNQREZfUmVjdCBDUFdMX1B1c2hCdXR0b246OkdldEZvY3VzUmVjdCgpIGNvbnN0Ci17Ci0JcmV0dXJuIENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHRoaXMtPkdldFdpbmRvd1JlY3QoKSwoRlhfRkxPQVQpR2V0Qm9yZGVyV2lkdGgoKSk7Cit2b2lkIENQV0xfQ2hlY2tCb3g6OlNldENoZWNrKEZYX0JPT0wgYkNoZWNrKSB7CisgIG1fYkNoZWNrZWQgPSBiQ2hlY2s7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0NoZWNrQm94IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotQ1BXTF9DaGVja0JveDo6Q1BXTF9DaGVja0JveCgpIDogbV9iQ2hlY2tlZChGQUxTRSkKLXsKK0ZYX0JPT0wgQ1BXTF9DaGVja0JveDo6SXNDaGVja2VkKCkgY29uc3QgeworICByZXR1cm4gbV9iQ2hlY2tlZDsKIH0KIAotQ1BXTF9DaGVja0JveDo6fkNQV0xfQ2hlY2tCb3goKQoteworRlhfQk9PTCBDUFdMX0NoZWNrQm94OjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIHsKKyAgaWYgKElzUmVhZE9ubHkoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgU2V0Q2hlY2soIUlzQ2hlY2tlZCgpKTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfQ2hlY2tCb3g6OkdldENsYXNzTmFtZSgpIGNvbnN0Ci17Ci0JcmV0dXJuICJDUFdMX0NoZWNrQm94IjsKK0ZYX0JPT0wgQ1BXTF9DaGVja0JveDo6T25DaGFyKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKSB7CisgIFNldENoZWNrKCFJc0NoZWNrZWQoKSk7CisgIHJldHVybiBUUlVFOwogfQogCi12b2lkIENQV0xfQ2hlY2tCb3g6OlNldENoZWNrKEZYX0JPT0wgYkNoZWNrKQotewotCW1fYkNoZWNrZWQgPSBiQ2hlY2s7CitDUFdMX1JhZGlvQnV0dG9uOjpDUFdMX1JhZGlvQnV0dG9uKCkgOiBtX2JDaGVja2VkKEZBTFNFKSB7fQorCitDUFdMX1JhZGlvQnV0dG9uOjp+Q1BXTF9SYWRpb0J1dHRvbigpIHt9CisKK0NGWF9CeXRlU3RyaW5nIENQV0xfUmFkaW9CdXR0b246OkdldENsYXNzTmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuICJDUFdMX1JhZGlvQnV0dG9uIjsKIH0KIAotRlhfQk9PTCBDUFdMX0NoZWNrQm94OjpJc0NoZWNrZWQoKSBjb25zdAotewotCXJldHVybiBtX2JDaGVja2VkOworRlhfQk9PTCBDUFdMX1JhZGlvQnV0dG9uOjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50JiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpIHsKKyAgaWYgKElzUmVhZE9ubHkoKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgU2V0Q2hlY2soVFJVRSk7CisgIHJldHVybiBUUlVFOwogfQogCi1GWF9CT09MIENQV0xfQ2hlY2tCb3g6Ok9uTEJ1dHRvblVwKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JaWYgKElzUmVhZE9ubHkoKSkgcmV0dXJuIEZBTFNFOwotCi0JU2V0Q2hlY2soIUlzQ2hlY2tlZCgpKTsKLQlyZXR1cm4gVFJVRTsKK3ZvaWQgQ1BXTF9SYWRpb0J1dHRvbjo6U2V0Q2hlY2soRlhfQk9PTCBiQ2hlY2spIHsKKyAgbV9iQ2hlY2tlZCA9IGJDaGVjazsKIH0KIAotRlhfQk9PTCBDUFdMX0NoZWNrQm94OjpPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JU2V0Q2hlY2soIUlzQ2hlY2tlZCgpKTsKLQlyZXR1cm4gVFJVRTsKK0ZYX0JPT0wgQ1BXTF9SYWRpb0J1dHRvbjo6SXNDaGVja2VkKCkgY29uc3QgeworICByZXR1cm4gbV9iQ2hlY2tlZDsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfUmFkaW9CdXR0b24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1DUFdMX1JhZGlvQnV0dG9uOjpDUFdMX1JhZGlvQnV0dG9uKCkgOiBtX2JDaGVja2VkKEZBTFNFKQoteworRlhfQk9PTCBDUFdMX1JhZGlvQnV0dG9uOjpPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpIHsKKyAgU2V0Q2hlY2soVFJVRSk7CisgIHJldHVybiBUUlVFOwogfQotCi1DUFdMX1JhZGlvQnV0dG9uOjp+Q1BXTF9SYWRpb0J1dHRvbigpCi17Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfUmFkaW9CdXR0b246OkdldENsYXNzTmFtZSgpIGNvbnN0Ci17Ci0JcmV0dXJuICJDUFdMX1JhZGlvQnV0dG9uIjsKLX0KLQotRlhfQk9PTAlDUFdMX1JhZGlvQnV0dG9uOjpPbkxCdXR0b25VcChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQotewotCWlmIChJc1JlYWRPbmx5KCkpIHJldHVybiBGQUxTRTsKLQotCVNldENoZWNrKFRSVUUpOwotCXJldHVybiBUUlVFOwotfQotCi12b2lkIENQV0xfUmFkaW9CdXR0b246OlNldENoZWNrKEZYX0JPT0wgYkNoZWNrKQotewotCW1fYkNoZWNrZWQgPSBiQ2hlY2s7Ci19Ci0KLUZYX0JPT0wgQ1BXTF9SYWRpb0J1dHRvbjo6SXNDaGVja2VkKCkgY29uc3QKLXsKLQlyZXR1cm4gbV9iQ2hlY2tlZDsKLX0KLQotRlhfQk9PTCBDUFdMX1JhZGlvQnV0dG9uOjpPbkNoYXIoRlhfV09SRCBuQ2hhciwgRlhfRFdPUkQgbkZsYWcpCi17Ci0JU2V0Q2hlY2soVFJVRSk7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfVXRpbHMuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9VdGlscy5jcHAKaW5kZXggYjU3ZjhlMC4uMjdiYThiYyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9VdGlscy5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9VdGlscy5jcHAKQEAgLTEsMjg0MSArMSwzNjg2IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QREZXaW5kb3cuaCIKLSNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QV0xfV25kLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1V0aWxzLmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0ljb24uaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oIgogCi0jZGVmaW5lIElzRmxvYXRaZXJvKGYpCQkJCQkJKChmKSA8IDAuMDAwMSAmJiAoZikgPiAtMC4wMDAxKQotI2RlZmluZSBJc0Zsb2F0QmlnZ2VyKGZhLGZiKQkJCQkoKGZhKSA+IChmYikgJiYgIUlzRmxvYXRaZXJvKChmYSkgLSAoZmIpKSkKLSNkZWZpbmUgSXNGbG9hdFNtYWxsZXIoZmEsZmIpCQkJCSgoZmEpIDwgKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQotI2RlZmluZSBJc0Zsb2F0RXF1YWwoZmEsZmIpCQkJCQlJc0Zsb2F0WmVybygoZmEpLShmYikpCisjaW5jbHVkZSA8YWxnb3JpdGhtPgogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfVXRpbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaW5jbHVkZSAiZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfSWNvbi5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oIgogCi1DRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoY29uc3QgQ1BXTF9QYXRoRGF0YSogcFBhdGhEYXRhLCBGWF9JTlQzMiBuQ291bnQpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIGNzQVA7CisjZGVmaW5lIElzRmxvYXRaZXJvKGYpICgoZikgPCAwLjAwMDEgJiYgKGYpID4gLTAuMDAwMSkKKyNkZWZpbmUgSXNGbG9hdEJpZ2dlcihmYSwgZmIpICgoZmEpID4gKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQorI2RlZmluZSBJc0Zsb2F0U21hbGxlcihmYSwgZmIpICgoZmEpIDwgKGZiKSAmJiAhSXNGbG9hdFplcm8oKGZhKSAtIChmYikpKQorI2RlZmluZSBJc0Zsb2F0RXF1YWwoZmEsIGZiKSBJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkKIAotCWZvciAoRlhfSU5UMzIgaT0wOyBpPG5Db3VudDsgaSsrKQotCXsKLQkJc3dpdGNoIChwUGF0aERhdGFbaV0udHlwZSkKLQkJewotCQljYXNlIFBXTFBUX01PVkVUTzoKLQkJCWNzQVAgPDwgcFBhdGhEYXRhW2ldLnBvaW50LnggPDwgIiAiIDw8IHBQYXRoRGF0YVtpXS5wb2ludC55IDw8ICIgbVxuIjsKLQkJCWJyZWFrOwotCQljYXNlIFBXTFBUX0xJTkVUTzoKLQkJCWNzQVAgPDwgcFBhdGhEYXRhW2ldLnBvaW50LnggPDwgIiAiIDw8IHBQYXRoRGF0YVtpXS5wb2ludC55IDw8ICIgbFxuIjsKLQkJCWJyZWFrOwotCQljYXNlIFBXTFBUX0JFWklFUlRPOgotCQkJY3NBUCA8PCBwUGF0aERhdGFbaV0ucG9pbnQueCA8PCAiICIgPDwgcFBhdGhEYXRhW2ldLnBvaW50LnkgPDwgIiAiCi0JCQkJIDw8IHBQYXRoRGF0YVtpKzFdLnBvaW50LnggPDwgIiAiIDw8IHBQYXRoRGF0YVtpKzFdLnBvaW50LnkgPDwgIiAiCi0JCQkJIDw8IHBQYXRoRGF0YVtpKzJdLnBvaW50LnggPDwgIiAiIDw8IHBQYXRoRGF0YVtpKzJdLnBvaW50LnkgPDwgIiBjXG4iOworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0QXBwU3RyZWFtRnJvbUFycmF5KGNvbnN0IENQV0xfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCkgeworICBDRlhfQnl0ZVRleHRCdWYgY3NBUDsKKworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgeworICAgIHN3aXRjaCAocFBhdGhEYXRhW2ldLnR5cGUpIHsKKyAgICAgIGNhc2UgUFdMUFRfTU9WRVRPOgorICAgICAgICBjc0FQIDw8IHBQYXRoRGF0YVtpXS5wb2ludC54IDw8ICIgIiA8PCBwUGF0aERhdGFbaV0ucG9pbnQueSA8PCAiIG1cbiI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQV0xQVF9MSU5FVE86CisgICAgICAgIGNzQVAgPDwgcFBhdGhEYXRhW2ldLnBvaW50LnggPDwgIiAiIDw8IHBQYXRoRGF0YVtpXS5wb2ludC55IDw8ICIgbFxuIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBXTFBUX0JFWklFUlRPOgorICAgICAgICBjc0FQIDw8IHBQYXRoRGF0YVtpXS5wb2ludC54IDw8ICIgIiA8PCBwUGF0aERhdGFbaV0ucG9pbnQueSA8PCAiICIKKyAgICAgICAgICAgICA8PCBwUGF0aERhdGFbaSArIDFdLnBvaW50LnggPDwgIiAiIDw8IHBQYXRoRGF0YVtpICsgMV0ucG9pbnQueQorICAgICAgICAgICAgIDw8ICIgIiA8PCBwUGF0aERhdGFbaSArIDJdLnBvaW50LnggPDwgIiAiCisgICAgICAgICAgICAgPDwgcFBhdGhEYXRhW2kgKyAyXS5wb2ludC55IDw8ICIgY1xuIjsKIAotCQkJaSArPSAyOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KKyAgICAgICAgaSArPSAyOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQogCi0JcmV0dXJuIGNzQVAuR2V0Qnl0ZVN0cmluZygpOworICByZXR1cm4gY3NBUC5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKLXZvaWQgQ1BXTF9VdGlsczo6R2V0UGF0aERhdGFGcm9tQXJyYXkoQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUFdMX1BhdGhEYXRhKiBwUGF0aERhdGEsIEZYX0lOVDMyIG5Db3VudCkKLXsKLQlwYXRoLlNldFBvaW50Q291bnQobkNvdW50KTsKK3ZvaWQgQ1BXTF9VdGlsczo6R2V0UGF0aERhdGFGcm9tQXJyYXkoQ0ZYX1BhdGhEYXRhJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50KSB7CisgIHBhdGguU2V0UG9pbnRDb3VudChuQ291bnQpOwogCi0JZm9yIChGWF9JTlQzMiBpPTA7IGk8bkNvdW50OyBpKyspCi0JewotCQlzd2l0Y2ggKHBQYXRoRGF0YVtpXS50eXBlKQotCQl7Ci0JCWNhc2UgUFdMUFRfTU9WRVRPOgotCQkJcGF0aC5TZXRQb2ludChpLCBwUGF0aERhdGFbaV0ucG9pbnQueCwgcFBhdGhEYXRhW2ldLnBvaW50LnksIEZYUFRfTU9WRVRPKTsKLQkJCWJyZWFrOwotCQljYXNlIFBXTFBUX0xJTkVUTzoKLQkJCXBhdGguU2V0UG9pbnQoaSwgcFBhdGhEYXRhW2ldLnBvaW50LngsIHBQYXRoRGF0YVtpXS5wb2ludC55LCBGWFBUX0xJTkVUTyk7Ci0JCQlicmVhazsKLQkJY2FzZSBQV0xQVF9CRVpJRVJUTzoKLQkJCXBhdGguU2V0UG9pbnQoaSwgcFBhdGhEYXRhW2ldLnBvaW50LngsIHBQYXRoRGF0YVtpXS5wb2ludC55LCBGWFBUX0JFWklFUlRPKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7CisgICAgc3dpdGNoIChwUGF0aERhdGFbaV0udHlwZSkgeworICAgICAgY2FzZSBQV0xQVF9NT1ZFVE86CisgICAgICAgIHBhdGguU2V0UG9pbnQoaSwgcFBhdGhEYXRhW2ldLnBvaW50LngsIHBQYXRoRGF0YVtpXS5wb2ludC55LAorICAgICAgICAgICAgICAgICAgICAgIEZYUFRfTU9WRVRPKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBXTFBUX0xJTkVUTzoKKyAgICAgICAgcGF0aC5TZXRQb2ludChpLCBwUGF0aERhdGFbaV0ucG9pbnQueCwgcFBhdGhEYXRhW2ldLnBvaW50LnksCisgICAgICAgICAgICAgICAgICAgICAgRlhQVF9MSU5FVE8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUFdMUFRfQkVaSUVSVE86CisgICAgICAgIHBhdGguU2V0UG9pbnQoaSwgcFBhdGhEYXRhW2ldLnBvaW50LngsIHBQYXRoRGF0YVtpXS5wb2ludC55LAorICAgICAgICAgICAgICAgICAgICAgIEZYUFRfQkVaSUVSVE8pOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQogfQogCitDUERGX1JlY3QgQ1BXTF9VdGlsczo6TWF4UmVjdChjb25zdCBDUERGX1JlY3QmIHJlY3QxLCBjb25zdCBDUERGX1JlY3QmIHJlY3QyKSB7CisgIENQREZfUmVjdCByY1JldDsKIAotQ1BERl9SZWN0IENQV0xfVXRpbHM6Ok1heFJlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmVjdDEsY29uc3QgQ1BERl9SZWN0ICYgcmVjdDIpCi17Ci0JQ1BERl9SZWN0IHJjUmV0OworICByY1JldC5sZWZ0ID0gUFdMX01JTihyZWN0MS5sZWZ0LCByZWN0Mi5sZWZ0KTsKKyAgcmNSZXQuYm90dG9tID0gUFdMX01JTihyZWN0MS5ib3R0b20sIHJlY3QyLmJvdHRvbSk7CisgIHJjUmV0LnJpZ2h0ID0gUFdMX01BWChyZWN0MS5yaWdodCwgcmVjdDIucmlnaHQpOworICByY1JldC50b3AgPSBQV0xfTUFYKHJlY3QxLnRvcCwgcmVjdDIudG9wKTsKIAotCXJjUmV0LmxlZnQgPSBQV0xfTUlOKHJlY3QxLmxlZnQscmVjdDIubGVmdCk7Ci0JcmNSZXQuYm90dG9tID0gUFdMX01JTihyZWN0MS5ib3R0b20scmVjdDIuYm90dG9tKTsKLQlyY1JldC5yaWdodCA9IFBXTF9NQVgocmVjdDEucmlnaHQscmVjdDIucmlnaHQpOwotCXJjUmV0LnRvcCA9IFBXTF9NQVgocmVjdDEudG9wLHJlY3QyLnRvcCk7Ci0KLQlyZXR1cm4gcmNSZXQ7CisgIHJldHVybiByY1JldDsKIH0KIAotQ1BERl9SZWN0IENQV0xfVXRpbHM6Ok9mZnNldFJlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCxGWF9GTE9BVCB4LEZYX0ZMT0FUIHkpCi17Ci0JcmV0dXJuIENQREZfUmVjdChyZWN0LmxlZnQgKyB4LHJlY3QuYm90dG9tICsgeSwKLQkJcmVjdC5yaWdodCArIHgscmVjdC50b3AgKyB5KTsKK0NQREZfUmVjdCBDUFdMX1V0aWxzOjpPZmZzZXRSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5KSB7CisgIHJldHVybiBDUERGX1JlY3QocmVjdC5sZWZ0ICsgeCwgcmVjdC5ib3R0b20gKyB5LCByZWN0LnJpZ2h0ICsgeCwKKyAgICAgICAgICAgICAgICAgICByZWN0LnRvcCArIHkpOwogfQogCi1GWF9CT09MIENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChjb25zdCBDUERGX1JlY3QmIHJjUGFyZW50LCBjb25zdCBDUERGX1JlY3QmIHJjQ2hpbGQpCi17Ci0JcmV0dXJuIHJjQ2hpbGQubGVmdCA+PSByY1BhcmVudC5sZWZ0ICYmIHJjQ2hpbGQuYm90dG9tID49IHJjUGFyZW50LmJvdHRvbSAmJgotCQkJcmNDaGlsZC5yaWdodCA8PSByY1BhcmVudC5yaWdodCAmJiByY0NoaWxkLnRvcCA8PSByY1BhcmVudC50b3A7CitGWF9CT09MIENQV0xfVXRpbHM6OkNvbnRhaW5zUmVjdChjb25zdCBDUERGX1JlY3QmIHJjUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiByY0NoaWxkKSB7CisgIHJldHVybiByY0NoaWxkLmxlZnQgPj0gcmNQYXJlbnQubGVmdCAmJiByY0NoaWxkLmJvdHRvbSA+PSByY1BhcmVudC5ib3R0b20gJiYKKyAgICAgICAgIHJjQ2hpbGQucmlnaHQgPD0gcmNQYXJlbnQucmlnaHQgJiYgcmNDaGlsZC50b3AgPD0gcmNQYXJlbnQudG9wOwogfQogCi1GWF9CT09MIENQV0xfVXRpbHM6OkludGVyc2VjdFJlY3QoY29uc3QgQ1BERl9SZWN0JiByZWN0MSwgY29uc3QgQ1BERl9SZWN0JiByZWN0MikKLXsKLQlGWF9GTE9BVCBsZWZ0ID0gcmVjdDEubGVmdCA+IHJlY3QyLmxlZnQgPyByZWN0MS5sZWZ0IDogcmVjdDIubGVmdDsKLQlGWF9GTE9BVCByaWdodCA9IHJlY3QxLnJpZ2h0IDwgcmVjdDIucmlnaHQgPyByZWN0MS5yaWdodCA6IHJlY3QyLnJpZ2h0OwotCUZYX0ZMT0FUIGJvdHRvbSA9IHJlY3QxLmJvdHRvbSA+IHJlY3QyLmJvdHRvbSA/IHJlY3QxLmJvdHRvbSA6IHJlY3QyLmJvdHRvbTsKLQlGWF9GTE9BVCB0b3AgPSByZWN0MS50b3AgPCByZWN0Mi50b3AgPyByZWN0MS50b3AgOiByZWN0Mi50b3A7CitGWF9CT09MIENQV0xfVXRpbHM6OkludGVyc2VjdFJlY3QoY29uc3QgQ1BERl9SZWN0JiByZWN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJlY3QyKSB7CisgIEZYX0ZMT0FUIGxlZnQgPSByZWN0MS5sZWZ0ID4gcmVjdDIubGVmdCA/IHJlY3QxLmxlZnQgOiByZWN0Mi5sZWZ0OworICBGWF9GTE9BVCByaWdodCA9IHJlY3QxLnJpZ2h0IDwgcmVjdDIucmlnaHQgPyByZWN0MS5yaWdodCA6IHJlY3QyLnJpZ2h0OworICBGWF9GTE9BVCBib3R0b20gPSByZWN0MS5ib3R0b20gPiByZWN0Mi5ib3R0b20gPyByZWN0MS5ib3R0b20gOiByZWN0Mi5ib3R0b207CisgIEZYX0ZMT0FUIHRvcCA9IHJlY3QxLnRvcCA8IHJlY3QyLnRvcCA/IHJlY3QxLnRvcCA6IHJlY3QyLnRvcDsKIAotCXJldHVybiBsZWZ0IDwgcmlnaHQgJiYgYm90dG9tIDwgdG9wOworICByZXR1cm4gbGVmdCA8IHJpZ2h0ICYmIGJvdHRvbSA8IHRvcDsKIH0KIAotQ1BERl9Qb2ludCBDUFdMX1V0aWxzOjpPZmZzZXRQb2ludChjb25zdCBDUERGX1BvaW50JiBwb2ludCxGWF9GTE9BVCB4LEZYX0ZMT0FUIHkpCi17Ci0JcmV0dXJuIENQREZfUG9pbnQocG9pbnQueCArIHgscG9pbnQueSArIHkpOworQ1BERl9Qb2ludCBDUFdMX1V0aWxzOjpPZmZzZXRQb2ludChjb25zdCBDUERGX1BvaW50JiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSkgeworICByZXR1cm4gQ1BERl9Qb2ludChwb2ludC54ICsgeCwgcG9pbnQueSArIHkpOwogfQogCi1DUFZUX1dvcmRSYW5nZSBDUFdMX1V0aWxzOjpPdmVybGFwV29yZFJhbmdlKGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3IxLCBjb25zdCBDUFZUX1dvcmRSYW5nZSAmIHdyMikKLXsKLQlDUFZUX1dvcmRSYW5nZSB3clJldDsKK0NQVlRfV29yZFJhbmdlIENQV0xfVXRpbHM6Ok92ZXJsYXBXb3JkUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyMikgeworICBDUFZUX1dvcmRSYW5nZSB3clJldDsKIAotCWlmICh3cjIuRW5kUG9zLldvcmRDbXAod3IxLkJlZ2luUG9zKSA8IDAgfHwgd3IyLkJlZ2luUG9zLldvcmRDbXAod3IxLkVuZFBvcykgPiAwKSByZXR1cm4gd3JSZXQ7Ci0JaWYgKHdyMS5FbmRQb3MuV29yZENtcCh3cjIuQmVnaW5Qb3MpIDwgMCB8fCB3cjEuQmVnaW5Qb3MuV29yZENtcCh3cjIuRW5kUG9zKSA+IDApIHJldHVybiB3clJldDsKKyAgaWYgKHdyMi5FbmRQb3MuV29yZENtcCh3cjEuQmVnaW5Qb3MpIDwgMCB8fAorICAgICAgd3IyLkJlZ2luUG9zLldvcmRDbXAod3IxLkVuZFBvcykgPiAwKQorICAgIHJldHVybiB3clJldDsKKyAgaWYgKHdyMS5FbmRQb3MuV29yZENtcCh3cjIuQmVnaW5Qb3MpIDwgMCB8fAorICAgICAgd3IxLkJlZ2luUG9zLldvcmRDbXAod3IyLkVuZFBvcykgPiAwKQorICAgIHJldHVybiB3clJldDsKIAotCWlmICh3cjEuQmVnaW5Qb3MuV29yZENtcCh3cjIuQmVnaW5Qb3MpIDwgMCkKLQl7Ci0JCXdyUmV0LkJlZ2luUG9zID0gd3IyLkJlZ2luUG9zOwotCX0KLQllbHNlCi0JewotCQl3clJldC5CZWdpblBvcyA9IHdyMS5CZWdpblBvczsKLQl9CisgIGlmICh3cjEuQmVnaW5Qb3MuV29yZENtcCh3cjIuQmVnaW5Qb3MpIDwgMCkgeworICAgIHdyUmV0LkJlZ2luUG9zID0gd3IyLkJlZ2luUG9zOworICB9IGVsc2UgeworICAgIHdyUmV0LkJlZ2luUG9zID0gd3IxLkJlZ2luUG9zOworICB9CiAKLQlpZiAod3IxLkVuZFBvcy5Xb3JkQ21wKHdyMi5FbmRQb3MpIDwgMCkKLQl7Ci0JCXdyUmV0LkVuZFBvcyA9IHdyMS5FbmRQb3M7Ci0JfQotCWVsc2UKLQl7Ci0JCXdyUmV0LkVuZFBvcyA9IHdyMi5FbmRQb3M7Ci0JfQorICBpZiAod3IxLkVuZFBvcy5Xb3JkQ21wKHdyMi5FbmRQb3MpIDwgMCkgeworICAgIHdyUmV0LkVuZFBvcyA9IHdyMS5FbmRQb3M7CisgIH0gZWxzZSB7CisgICAgd3JSZXQuRW5kUG9zID0gd3IyLkVuZFBvczsKKyAgfQogCi0JcmV0dXJuIHdyUmV0OworICByZXR1cm4gd3JSZXQ7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFQX0NoZWNrKGNvbnN0IENQREZfUmVjdCAmIGNyQkJveCkKLXsKLQlDRlhfQnl0ZVRleHRCdWYgY3NBUDsKK0NGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFQX0NoZWNrKGNvbnN0IENQREZfUmVjdCYgY3JCQm94KSB7CisgIGNvbnN0IEZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OworICBjb25zdCBGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207CiAKLQlGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKLQlGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207CisgIENQV0xfUG9pbnQgcHRzWzhdWzNdID0ge3tDUFdMX1BvaW50KDAuMjhmLCAwLjUyZiksIENQV0xfUG9pbnQoMC4yN2YsIDAuNDhmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfUG9pbnQoMC4yOWYsIDAuNDBmKX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHtDUFdMX1BvaW50KDAuMzBmLCAwLjMzZiksIENQV0xfUG9pbnQoMC4zMWYsIDAuMjlmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfUG9pbnQoMC4zMWYsIDAuMjhmKX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHtDUFdMX1BvaW50KDAuMzlmLCAwLjI4ZiksIENQV0xfUG9pbnQoMC40OWYsIDAuMjlmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfUG9pbnQoMC43N2YsIDAuNjdmKX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHtDUFdMX1BvaW50KDAuNzZmLCAwLjY4ZiksIENQV0xfUG9pbnQoMC43OGYsIDAuNjlmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfUG9pbnQoMC43NmYsIDAuNzVmKX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHtDUFdMX1BvaW50KDAuNzZmLCAwLjc1ZiksIENQV0xfUG9pbnQoMC43M2YsIDAuODBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfUG9pbnQoMC42OGYsIDAuNzVmKX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHtDUFdMX1BvaW50KDAuNjhmLCAwLjc0ZiksIENQV0xfUG9pbnQoMC42OGYsIDAuNzRmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfUG9pbnQoMC40NGYsIDAuNDdmKX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHtDUFdMX1BvaW50KDAuNDNmLCAwLjQ3ZiksIENQV0xfUG9pbnQoMC40MGYsIDAuNDdmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfUG9pbnQoMC40MWYsIDAuNThmKX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHtDUFdMX1BvaW50KDAuNDBmLCAwLjYwZiksIENQV0xfUG9pbnQoMC4yOGYsIDAuNjZmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfUG9pbnQoMC4zMGYsIDAuNTZmKX19OwogCi0JY29uc3QgRlhfSU5UMzIgbnVtID0gODsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUocHRzKTsgKytpKSB7CisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBGWF9BcnJheVNpemUocHRzWzBdKTsgKytqKSB7CisgICAgICBwdHNbaV1bal0ueCA9IHB0c1tpXVtqXS54ICogZldpZHRoICsgY3JCQm94LmxlZnQ7CisgICAgICBwdHNbaV1bal0ueSAqPSBwdHNbaV1bal0ueSAqIGZIZWlnaHQgKyBjckJCb3guYm90dG9tOworICAgIH0KKyAgfQogCi0JQ1BXTF9Qb2ludCBwdHNbbnVtKjNdID0gCi0JewotCQkvLzEKLQkJQ1BXTF9Qb2ludCgwLjI4ZiwgMC41MmYpLCAKLQkJQ1BXTF9Qb2ludCgwLjI3ZiwgMC40OGYpLAotCQlDUFdMX1BvaW50KDAuMjlmLCAwLjQwZiksCisgIENGWF9CeXRlVGV4dEJ1ZiBjc0FQOworICBjc0FQIDw8IHB0c1swXVswXS54IDw8ICIgIiA8PCBwdHNbMF1bMF0ueSA8PCAiIG1cbiI7CiAKLQkJLy8yCi0JCUNQV0xfUG9pbnQoMC4zMGYsIDAuMzNmKSwgCi0JCUNQV0xfUG9pbnQoMC4zMWYsIDAuMjlmKSwKLQkJQ1BXTF9Qb2ludCgwLjMxZiwgMC4yOGYpLAorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShwdHMpOyArK2kpIHsKKyAgICBzaXplX3Qgbk5leHQgPSBpIDwgRlhfQXJyYXlTaXplKHB0cykgLSAxID8gaSArIDEgOiAwOwogCi0JCS8vMwotCQlDUFdMX1BvaW50KDAuMzlmLCAwLjI4ZiksIAotCQlDUFdMX1BvaW50KDAuNDlmLCAwLjI5ZiksCi0JCUNQV0xfUG9pbnQoMC43N2YsIDAuNjdmKSwKKyAgICBGWF9GTE9BVCBweDEgPSBwdHNbaV1bMV0ueCAtIHB0c1tpXVswXS54OworICAgIEZYX0ZMT0FUIHB5MSA9IHB0c1tpXVsxXS55IC0gcHRzW2ldWzBdLnk7CisgICAgRlhfRkxPQVQgcHgyID0gcHRzW2ldWzJdLnggLSBwdHNbbk5leHRdWzBdLng7CisgICAgRlhfRkxPQVQgcHkyID0gcHRzW2ldWzJdLnkgLSBwdHNbbk5leHRdWzBdLnk7CiAKLQkJLy80Ci0JCUNQV0xfUG9pbnQoMC43NmYsIDAuNjhmKSwgCi0JCUNQV0xfUG9pbnQoMC43OGYsIDAuNjlmKSwKLQkJQ1BXTF9Qb2ludCgwLjc2ZiwgMC43NWYpLAotCi0JCS8vNQotCQlDUFdMX1BvaW50KDAuNzZmLCAwLjc1ZiksIAotCQlDUFdMX1BvaW50KDAuNzNmLCAwLjgwZiksCi0JCUNQV0xfUG9pbnQoMC42OGYsIDAuNzVmKSwKLQotCQkvLzYKLQkJQ1BXTF9Qb2ludCgwLjY4ZiwgMC43NGYpLCAKLQkJQ1BXTF9Qb2ludCgwLjY4ZiwgMC43NGYpLAotCQlDUFdMX1BvaW50KDAuNDRmLCAwLjQ3ZiksCi0KLQkJLy83Ci0JCUNQV0xfUG9pbnQoMC40M2YsIDAuNDdmKSwgCi0JCUNQV0xfUG9pbnQoMC40MGYsIDAuNDdmKSwKLQkJQ1BXTF9Qb2ludCgwLjQxZiwgMC41OGYpLAotCi0JCS8vOAotCQlDUFdMX1BvaW50KDAuNDBmLCAwLjYwZiksIAotCQlDUFdMX1BvaW50KDAuMjhmLCAwLjY2ZiksCi0JCUNQV0xfUG9pbnQoMC4zMGYsIDAuNTZmKQotCX07Ci0KLQlmb3IgKEZYX0lOVDMyIGo9MDsgajxudW0qMzsgaisrKQotCXsKLQkJcHRzW2pdLnggKj0gZldpZHRoOwotCQlwdHNbal0ueCArPSBjckJCb3gubGVmdDsKLQotCQlwdHNbal0ueSAqPSBmSGVpZ2h0OwotCQlwdHNbal0ueSArPSBjckJCb3guYm90dG9tOwotCX0KLQotCWNzQVAgPDwgcHRzWzBdLnggPDwgIiAiIDw8IHB0c1swXS55IDw8ICIgbVxuIjsKLQotCWZvciAoRlhfSU5UMzIgaT0wOyBpPG51bTsgaSsrKQotCXsKLQkJRlhfSU5UMzIgbkN1ciA9IGkqMzsKLQkJRlhfSU5UMzIgbjEgPSBpKjMgKyAxOwotCQlGWF9JTlQzMiBuMiA9IGkqMyArIDI7Ci0JCUZYX0lOVDMyIG5OZXh0ID0gKGkgPCBudW0tMSA/IChpKzEpKjMgOiAwKTsKLQotCQlGWF9GTE9BVCBweDEgPSBwdHNbbjFdLnggLSBwdHNbbkN1cl0ueDsKLQkJRlhfRkxPQVQgcHkxID0gcHRzW24xXS55IC0gcHRzW25DdXJdLnk7Ci0JCUZYX0ZMT0FUIHB4MiA9IHB0c1tuMl0ueCAtIHB0c1tuTmV4dF0ueDsKLQkJRlhfRkxPQVQgcHkyID0gcHRzW24yXS55IC0gcHRzW25OZXh0XS55OwotCi0JCWNzQVAgPDwgcHRzW25DdXJdLnggKyBweDEgKiBQV0xfQkVaSUVSIDw8ICIgIiA8PCBwdHNbbkN1cl0ueSArIHB5MSAqIFBXTF9CRVpJRVIgPDwgIiAiIAotCQkJPDwgcHRzW25OZXh0XS54ICsgcHgyICogUFdMX0JFWklFUiA8PCAiICIgPDwgcHRzW25OZXh0XS55ICsgcHkyICogUFdMX0JFWklFUiA8PCAiICIKLQkJCTw8IHB0c1tuTmV4dF0ueCA8PCAiICIgPDwgcHRzW25OZXh0XS55IDw8ICIgY1xuIjsKLQl9CisgICAgY3NBUCA8PCBwdHNbaV1bMF0ueCArIHB4MSAqIFBXTF9CRVpJRVIgPDwgIiAiCisgICAgICAgICA8PCBwdHNbaV1bMF0ueSArIHB5MSAqIFBXTF9CRVpJRVIgPDwgIiAiCisgICAgICAgICA8PCBwdHNbbk5leHRdWzBdLnggKyBweDIgKiBQV0xfQkVaSUVSIDw8ICIgIgorICAgICAgICAgPDwgcHRzW25OZXh0XVswXS55ICsgcHkyICogUFdMX0JFWklFUiA8PCAiICIgPDwgcHRzW25OZXh0XVswXS54IDw8ICIgIgorICAgICAgICAgPDwgcHRzW25OZXh0XVswXS55IDw8ICIgY1xuIjsKKyAgfQogCi0JcmV0dXJuIGNzQVAuR2V0Qnl0ZVN0cmluZygpOworICByZXR1cm4gY3NBUC5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFQX0NpcmNsZShjb25zdCBDUERGX1JlY3QgJiBjckJCb3gpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIGNzQVA7CitDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBUF9DaXJjbGUoY29uc3QgQ1BERl9SZWN0JiBjckJCb3gpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIGNzQVA7CiAKLQlGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKLQlGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207CisgIEZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OworICBGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207CiAKLQlDUERGX1BvaW50IHB0MShjckJCb3gubGVmdCxjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDIpOwotCUNQREZfUG9pbnQgcHQyKGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMixjckJCb3gudG9wKTsKLQlDUERGX1BvaW50IHB0MyhjckJCb3gucmlnaHQsY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyKTsKLQlDUERGX1BvaW50IHB0NChjckJCb3gubGVmdCArIGZXaWR0aCAvIDIsY3JCQm94LmJvdHRvbSk7CisgIENQREZfUG9pbnQgcHQxKGNyQkJveC5sZWZ0LCBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDIpOworICBDUERGX1BvaW50IHB0MihjckJCb3gubGVmdCArIGZXaWR0aCAvIDIsIGNyQkJveC50b3ApOworICBDUERGX1BvaW50IHB0MyhjckJCb3gucmlnaHQsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMik7CisgIENQREZfUG9pbnQgcHQ0KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMiwgY3JCQm94LmJvdHRvbSk7CiAKLQljc0FQIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiIG1cbiI7CisgIGNzQVAgPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IDw8ICIgbVxuIjsKIAotCUZYX0ZMT0FUIHB4ID0gcHQyLnggLSBwdDEueDsKLQlGWF9GTE9BVCBweSA9IHB0Mi55IC0gcHQxLnk7CisgIEZYX0ZMT0FUIHB4ID0gcHQyLnggLSBwdDEueDsKKyAgRlhfRkxPQVQgcHkgPSBwdDIueSAtIHB0MS55OwogCi0JY3NBUCA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgKyBweSAqIFBXTF9CRVpJRVIgPDwgIiAiIAotCQk8PCBwdDIueCAtIHB4ICogUFdMX0JFWklFUiA8PCAiICIgPDwgcHQyLnkgPDwgIiAiCi0JCTw8IHB0Mi54IDw8ICIgIiA8PCBwdDIueSA8PCAiIGNcbiI7CisgIGNzQVAgPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55ICsgcHkgKiBQV0xfQkVaSUVSIDw8ICIgIgorICAgICAgIDw8IHB0Mi54IC0gcHggKiBQV0xfQkVaSUVSIDw8ICIgIiA8PCBwdDIueSA8PCAiICIgPDwgcHQyLnggPDwgIiAiCisgICAgICAgPDwgcHQyLnkgPDwgIiBjXG4iOwogCi0JcHggPSBwdDMueCAtIHB0Mi54OwotCXB5ID0gcHQyLnkgLSBwdDMueTsKKyAgcHggPSBwdDMueCAtIHB0Mi54OworICBweSA9IHB0Mi55IC0gcHQzLnk7CiAKLQljc0FQIDw8IHB0Mi54ICsgcHggKiBQV0xfQkVaSUVSIDw8ICIgIiA8PCBwdDIueSA8PCAiICIgCi0JCTw8IHB0My54IDw8ICIgIiA8PCBwdDMueSArIHB5ICogUFdMX0JFWklFUiA8PCAiICIKLQkJPDwgcHQzLnggPDwgIiAiIDw8IHB0My55IDw8ICIgY1xuIjsKKyAgY3NBUCA8PCBwdDIueCArIHB4ICogUFdMX0JFWklFUiA8PCAiICIgPDwgcHQyLnkgPDwgIiAiIDw8IHB0My54IDw8ICIgIgorICAgICAgIDw8IHB0My55ICsgcHkgKiBQV0xfQkVaSUVSIDw8ICIgIiA8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgPDwgIiBjXG4iOwogCi0JcHggPSBwdDMueCAtIHB0NC54OwotCXB5ID0gcHQzLnkgLSBwdDQueTsKKyAgcHggPSBwdDMueCAtIHB0NC54OworICBweSA9IHB0My55IC0gcHQ0Lnk7CiAKLQljc0FQIDw8IHB0My54IDw8ICIgIiA8PCBwdDMueSAtIHB5ICogUFdMX0JFWklFUiA8PCAiICIgCi0JCTw8IHB0NC54ICsgcHggKiBQV0xfQkVaSUVSIDw8ICIgIiA8PCBwdDQueSA8PCAiICIKLQkJPDwgcHQ0LnggPDwgIiAiIDw8IHB0NC55IDw8ICIgY1xuIjsKKyAgY3NBUCA8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgLSBweSAqIFBXTF9CRVpJRVIgPDwgIiAiCisgICAgICAgPDwgcHQ0LnggKyBweCAqIFBXTF9CRVpJRVIgPDwgIiAiIDw8IHB0NC55IDw8ICIgIiA8PCBwdDQueCA8PCAiICIKKyAgICAgICA8PCBwdDQueSA8PCAiIGNcbiI7CiAKLQlweCA9IHB0NC54IC0gcHQxLng7Ci0JcHkgPSBwdDEueSAtIHB0NC55OworICBweCA9IHB0NC54IC0gcHQxLng7CisgIHB5ID0gcHQxLnkgLSBwdDQueTsKIAotCWNzQVAgPDwgcHQ0LnggLSBweCAqIFBXTF9CRVpJRVIgPDwgIiAiIDw8IHB0NC55IDw8ICIgIiAKLQkJPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IC0gcHkgKiBQV0xfQkVaSUVSIDw8ICIgIgotCQk8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBjXG4iOworICBjc0FQIDw8IHB0NC54IC0gcHggKiBQV0xfQkVaSUVSIDw8ICIgIiA8PCBwdDQueSA8PCAiICIgPDwgcHQxLnggPDwgIiAiCisgICAgICAgPDwgcHQxLnkgLSBweSAqIFBXTF9CRVpJRVIgPDwgIiAiIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiIGNcbiI7CiAKLQlyZXR1cm4gY3NBUC5HZXRCeXRlU3RyaW5nKCk7CisgIHJldHVybiBjc0FQLkdldEJ5dGVTdHJpbmcoKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0QVBfQ3Jvc3MoY29uc3QgQ1BERl9SZWN0ICYgY3JCQm94KQotewotCUNGWF9CeXRlVGV4dEJ1ZiBjc0FQOworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0QVBfQ3Jvc3MoY29uc3QgQ1BERl9SZWN0JiBjckJCb3gpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIGNzQVA7CiAKLQljc0FQIDw8IGNyQkJveC5sZWZ0IDw8ICIgIiA8PCBjckJCb3gudG9wIDw8ICIgbVxuIjsKLQljc0FQIDw8IGNyQkJveC5yaWdodCA8PCAiICIgPDwgY3JCQm94LmJvdHRvbSA8PCAiIGxcbiI7Ci0JY3NBUCA8PCBjckJCb3gubGVmdCA8PCAiICIgPDwgY3JCQm94LmJvdHRvbSA8PCAiIG1cbiI7Ci0JY3NBUCA8PCBjckJCb3gucmlnaHQgPDwgIiAiIDw8IGNyQkJveC50b3AgPDwgIiBsXG4iOworICBjc0FQIDw8IGNyQkJveC5sZWZ0IDw8ICIgIiA8PCBjckJCb3gudG9wIDw8ICIgbVxuIjsKKyAgY3NBUCA8PCBjckJCb3gucmlnaHQgPDwgIiAiIDw8IGNyQkJveC5ib3R0b20gPDwgIiBsXG4iOworICBjc0FQIDw8IGNyQkJveC5sZWZ0IDw8ICIgIiA8PCBjckJCb3guYm90dG9tIDw8ICIgbVxuIjsKKyAgY3NBUCA8PCBjckJCb3gucmlnaHQgPDwgIiAiIDw8IGNyQkJveC50b3AgPDwgIiBsXG4iOwogCi0JcmV0dXJuIGNzQVAuR2V0Qnl0ZVN0cmluZygpOworICByZXR1cm4gY3NBUC5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFQX0RpYW1vbmQoY29uc3QgQ1BERl9SZWN0ICYgY3JCQm94KQotewotCUNGWF9CeXRlVGV4dEJ1ZiBjc0FQOworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0QVBfRGlhbW9uZChjb25zdCBDUERGX1JlY3QmIGNyQkJveCkgeworICBDRlhfQnl0ZVRleHRCdWYgY3NBUDsKIAotCUZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OwotCUZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKKyAgRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7CisgIEZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKIAotCUNQREZfUG9pbnQgcHQxKGNyQkJveC5sZWZ0LGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMik7Ci0JQ1BERl9Qb2ludCBwdDIoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLGNyQkJveC50b3ApOwotCUNQREZfUG9pbnQgcHQzKGNyQkJveC5yaWdodCxjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDIpOwotCUNQREZfUG9pbnQgcHQ0KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMixjckJCb3guYm90dG9tKTsKLQkKLQljc0FQIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiIG1cbiI7Ci0JY3NBUCA8PCBwdDIueCA8PCAiICIgPDwgcHQyLnkgPDwgIiBsXG4iOwotCWNzQVAgPDwgcHQzLnggPDwgIiAiIDw8IHB0My55IDw8ICIgbFxuIjsKLQljc0FQIDw8IHB0NC54IDw8ICIgIiA8PCBwdDQueSA8PCAiIGxcbiI7Ci0JY3NBUCA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBsXG4iOworICBDUERGX1BvaW50IHB0MShjckJCb3gubGVmdCwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyKTsKKyAgQ1BERl9Qb2ludCBwdDIoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLCBjckJCb3gudG9wKTsKKyAgQ1BERl9Qb2ludCBwdDMoY3JCQm94LnJpZ2h0LCBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDIpOworICBDUERGX1BvaW50IHB0NChjckJCb3gubGVmdCArIGZXaWR0aCAvIDIsIGNyQkJveC5ib3R0b20pOworCisgIGNzQVAgPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IDw8ICIgbVxuIjsKKyAgY3NBUCA8PCBwdDIueCA8PCAiICIgPDwgcHQyLnkgPDwgIiBsXG4iOworICBjc0FQIDw8IHB0My54IDw8ICIgIiA8PCBwdDMueSA8PCAiIGxcbiI7CisgIGNzQVAgPDwgcHQ0LnggPDwgIiAiIDw8IHB0NC55IDw8ICIgbFxuIjsKKyAgY3NBUCA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBsXG4iOwogCi0JcmV0dXJuIGNzQVAuR2V0Qnl0ZVN0cmluZygpOworICByZXR1cm4gY3NBUC5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFQX1NxdWFyZShjb25zdCBDUERGX1JlY3QgJiBjckJCb3gpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIGNzQVA7CitDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBUF9TcXVhcmUoY29uc3QgQ1BERl9SZWN0JiBjckJCb3gpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIGNzQVA7CiAKLQljc0FQIDw8IGNyQkJveC5sZWZ0IDw8ICIgIiA8PCBjckJCb3gudG9wIDw8ICIgbVxuIjsKLQljc0FQIDw8IGNyQkJveC5yaWdodCA8PCAiICIgPDwgY3JCQm94LnRvcCA8PCAiIGxcbiI7Ci0JY3NBUCA8PCBjckJCb3gucmlnaHQgPDwgIiAiIDw8IGNyQkJveC5ib3R0b20gPDwgIiBsXG4iOwotCWNzQVAgPDwgY3JCQm94LmxlZnQgPDwgIiAiIDw8IGNyQkJveC5ib3R0b20gPDwgIiBsXG4iOwotCWNzQVAgPDwgY3JCQm94LmxlZnQgPDwgIiAiIDw8IGNyQkJveC50b3AgPDwgIiBsXG4iOworICBjc0FQIDw8IGNyQkJveC5sZWZ0IDw8ICIgIiA8PCBjckJCb3gudG9wIDw8ICIgbVxuIjsKKyAgY3NBUCA8PCBjckJCb3gucmlnaHQgPDwgIiAiIDw8IGNyQkJveC50b3AgPDwgIiBsXG4iOworICBjc0FQIDw8IGNyQkJveC5yaWdodCA8PCAiICIgPDwgY3JCQm94LmJvdHRvbSA8PCAiIGxcbiI7CisgIGNzQVAgPDwgY3JCQm94LmxlZnQgPDwgIiAiIDw8IGNyQkJveC5ib3R0b20gPDwgIiBsXG4iOworICBjc0FQIDw8IGNyQkJveC5sZWZ0IDw8ICIgIiA8PCBjckJCb3gudG9wIDw8ICIgbFxuIjsKIAotCXJldHVybiBjc0FQLkdldEJ5dGVTdHJpbmcoKTsKKyAgcmV0dXJuIGNzQVAuR2V0Qnl0ZVN0cmluZygpOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBUF9TdGFyKGNvbnN0IENQREZfUmVjdCAmIGNyQkJveCkKLXsKLQlDRlhfQnl0ZVRleHRCdWYgY3NBUDsKK0NGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFQX1N0YXIoY29uc3QgQ1BERl9SZWN0JiBjckJCb3gpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIGNzQVA7CiAKLQlGWF9GTE9BVCBmUmFkaXVzID0gKGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tKS8oMSsoRlhfRkxPQVQpY29zKFBXTF9QSS81LjBmKSk7Ci0JQ1BERl9Qb2ludCBwdENlbnRlciA9IENQREZfUG9pbnQoKGNyQkJveC5sZWZ0ICsgY3JCQm94LnJpZ2h0KSAvIDIuMGYsKGNyQkJveC50b3AgKyBjckJCb3guYm90dG9tKSAvIDIuMGYpOwotCQotCUZYX0ZMT0FUIHB4WzVdLHB5WzVdOworICBGWF9GTE9BVCBmUmFkaXVzID0KKyAgICAgIChjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbSkgLyAoMSArIChGWF9GTE9BVCljb3MoUFdMX1BJIC8gNS4wZikpOworICBDUERGX1BvaW50IHB0Q2VudGVyID0gQ1BERl9Qb2ludCgoY3JCQm94LmxlZnQgKyBjckJCb3gucmlnaHQpIC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNyQkJveC50b3AgKyBjckJCb3guYm90dG9tKSAvIDIuMGYpOwogCi0JRlhfRkxPQVQgZkFuZ2VsID0gUFdMX1BJLzEwLjBmOworICBGWF9GTE9BVCBweFs1XSwgcHlbNV07CiAKLQlmb3IgKEZYX0lOVDMyIGk9MDsgaTw1OyBpKyspCi0JewotCQlweFtpXSA9IHB0Q2VudGVyLnggKyBmUmFkaXVzICogKEZYX0ZMT0FUKWNvcyhmQW5nZWwpOwotCQlweVtpXSA9IHB0Q2VudGVyLnkgKyBmUmFkaXVzICogKEZYX0ZMT0FUKXNpbihmQW5nZWwpOworICBGWF9GTE9BVCBmQW5nZWwgPSBQV0xfUEkgLyAxMC4wZjsKIAotCQlmQW5nZWwgKz0gUFdMX1BJICogMiAvIDUuMGY7Ci0JfQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICBweFtpXSA9IHB0Q2VudGVyLnggKyBmUmFkaXVzICogKEZYX0ZMT0FUKWNvcyhmQW5nZWwpOworICAgIHB5W2ldID0gcHRDZW50ZXIueSArIGZSYWRpdXMgKiAoRlhfRkxPQVQpc2luKGZBbmdlbCk7CiAKLQljc0FQIDw8IHB4WzBdIDw8ICIgIiA8PCBweVswXSA8PCAiIG1cbiI7CisgICAgZkFuZ2VsICs9IFBXTF9QSSAqIDIgLyA1LjBmOworICB9CiAKLQlGWF9JTlQzMiBuTmV4dCA9IDA7Ci0JZm9yIChGWF9JTlQzMiBqPTA7IGo8NTsgaisrKQotCXsKLQkJbk5leHQgKz0gMjsKLQkJaWYgKG5OZXh0ID49IDUpIG5OZXh0IC09IDU7Ci0JCWNzQVAgPDwgcHhbbk5leHRdIDw8ICIgIiA8PCBweVtuTmV4dF0gPDwgIiBsXG4iOwotCX0KKyAgY3NBUCA8PCBweFswXSA8PCAiICIgPDwgcHlbMF0gPDwgIiBtXG4iOworCisgIGludDMyX3Qgbk5leHQgPSAwOworICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCA1OyBqKyspIHsKKyAgICBuTmV4dCArPSAyOworICAgIGlmIChuTmV4dCA+PSA1KQorICAgICAgbk5leHQgLT0gNTsKKyAgICBjc0FQIDw8IHB4W25OZXh0XSA8PCAiICIgPDwgcHlbbk5leHRdIDw8ICIgbFxuIjsKKyAgfQogCi0JcmV0dXJuIGNzQVAuR2V0Qnl0ZVN0cmluZygpOworICByZXR1cm4gY3NBUC5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFQX0hhbGZDaXJjbGUoY29uc3QgQ1BERl9SZWN0ICYgY3JCQm94LEZYX0ZMT0FUIGZSb3RhdGUpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIGNzQVA7CitDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBUF9IYWxmQ2lyY2xlKGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUm90YXRlKSB7CisgIENGWF9CeXRlVGV4dEJ1ZiBjc0FQOwogCi0JRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7Ci0JRlhfRkxPQVQgZkhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOworICBGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKKyAgRlhfRkxPQVQgZkhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOwogCi0JQ1BERl9Qb2ludCBwdDEoLWZXaWR0aC8yLDApOwotCUNQREZfUG9pbnQgcHQyKDAsZkhlaWdodC8yKTsKLQlDUERGX1BvaW50IHB0MyhmV2lkdGgvMiwwKTsKKyAgQ1BERl9Qb2ludCBwdDEoLWZXaWR0aCAvIDIsIDApOworICBDUERGX1BvaW50IHB0MigwLCBmSGVpZ2h0IC8gMik7CisgIENQREZfUG9pbnQgcHQzKGZXaWR0aCAvIDIsIDApOwogCi0JRlhfRkxPQVQgcHgscHk7CisgIEZYX0ZMT0FUIHB4LCBweTsKIAotCWNzQVAgPDwgY29zKGZSb3RhdGUpIDw8ICIgIiA8PCBzaW4oZlJvdGF0ZSkgPDwgIiAiIDw8IC1zaW4oZlJvdGF0ZSkgPDwgIiAiIDw8IGNvcyhmUm90YXRlKSA8PCAiICIgCi0JCTw8IGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMiA8PCAiICIgPDwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyIDw8ICIgY21cbiI7CisgIGNzQVAgPDwgY29zKGZSb3RhdGUpIDw8ICIgIiA8PCBzaW4oZlJvdGF0ZSkgPDwgIiAiIDw8IC1zaW4oZlJvdGF0ZSkgPDwgIiAiCisgICAgICAgPDwgY29zKGZSb3RhdGUpIDw8ICIgIiA8PCBjckJCb3gubGVmdCArIGZXaWR0aCAvIDIgPDwgIiAiCisgICAgICAgPDwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyIDw8ICIgY21cbiI7CiAKKyAgY3NBUCA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBtXG4iOwogCi0JY3NBUCA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBtXG4iOworICBweCA9IHB0Mi54IC0gcHQxLng7CisgIHB5ID0gcHQyLnkgLSBwdDEueTsKIAotCXB4ID0gcHQyLnggLSBwdDEueDsKLQlweSA9IHB0Mi55IC0gcHQxLnk7CisgIGNzQVAgPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55ICsgcHkgKiBQV0xfQkVaSUVSIDw8ICIgIgorICAgICAgIDw8IHB0Mi54IC0gcHggKiBQV0xfQkVaSUVSIDw8ICIgIiA8PCBwdDIueSA8PCAiICIgPDwgcHQyLnggPDwgIiAiCisgICAgICAgPDwgcHQyLnkgPDwgIiBjXG4iOwogCi0JY3NBUCA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgKyBweSAqIFBXTF9CRVpJRVIgPDwgIiAiIAotCQk8PCBwdDIueCAtIHB4ICogUFdMX0JFWklFUiA8PCAiICIgPDwgcHQyLnkgPDwgIiAiCi0JCTw8IHB0Mi54IDw8ICIgIiA8PCBwdDIueSA8PCAiIGNcbiI7Ci0KLQlweCA9IHB0My54IC0gcHQyLng7Ci0JcHkgPSBwdDIueSAtIHB0My55OworICBweCA9IHB0My54IC0gcHQyLng7CisgIHB5ID0gcHQyLnkgLSBwdDMueTsKIAotCWNzQVAgPDwgcHQyLnggKyBweCAqIFBXTF9CRVpJRVIgPDwgIiAiIDw8IHB0Mi55IDw8ICIgIiAKLQkJPDwgcHQzLnggPDwgIiAiIDw8IHB0My55ICsgcHkgKiBQV0xfQkVaSUVSIDw8ICIgIgotCQk8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgPDwgIiBjXG4iOworICBjc0FQIDw8IHB0Mi54ICsgcHggKiBQV0xfQkVaSUVSIDw8ICIgIiA8PCBwdDIueSA8PCAiICIgPDwgcHQzLnggPDwgIiAiCisgICAgICAgPDwgcHQzLnkgKyBweSAqIFBXTF9CRVpJRVIgPDwgIiAiIDw8IHB0My54IDw8ICIgIiA8PCBwdDMueSA8PCAiIGNcbiI7CiAKLQlyZXR1cm4gY3NBUC5HZXRCeXRlU3RyaW5nKCk7CisgIHJldHVybiBjc0FQLkdldEJ5dGVTdHJpbmcoKTsKIH0KIAorQ1BERl9SZWN0IENQV0xfVXRpbHM6OkluZmxhdGVSZWN0KGNvbnN0IENQREZfUmVjdCYgcmNSZWN0LCBGWF9GTE9BVCBmU2l6ZSkgeworICBpZiAocmNSZWN0LklzRW1wdHkoKSkKKyAgICByZXR1cm4gcmNSZWN0OwogCi1DUERGX1JlY3QgQ1BXTF9VdGlsczo6SW5mbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmNSZWN0LCBGWF9GTE9BVCBmU2l6ZSkKLXsKLQlpZiAocmNSZWN0LklzRW1wdHkoKSkgcmV0dXJuIHJjUmVjdDsKLQotCUNQREZfUmVjdCByY05ldyhyY1JlY3QubGVmdCAtIGZTaXplLAotCQkJCQlyY1JlY3QuYm90dG9tIC0gZlNpemUsCi0JCQkJCXJjUmVjdC5yaWdodCArIGZTaXplLAotCQkJCQlyY1JlY3QudG9wICsgZlNpemUpOwotCXJjTmV3Lk5vcm1hbGl6ZSgpOwotCXJldHVybiByY05ldzsKKyAgQ1BERl9SZWN0IHJjTmV3KHJjUmVjdC5sZWZ0IC0gZlNpemUsIHJjUmVjdC5ib3R0b20gLSBmU2l6ZSwKKyAgICAgICAgICAgICAgICAgIHJjUmVjdC5yaWdodCArIGZTaXplLCByY1JlY3QudG9wICsgZlNpemUpOworICByY05ldy5Ob3JtYWxpemUoKTsKKyAgcmV0dXJuIHJjTmV3OwogfQogCi1DUERGX1JlY3QgQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmNSZWN0LCBGWF9GTE9BVCBmU2l6ZSkKLXsKLQlpZiAocmNSZWN0LklzRW1wdHkoKSkgcmV0dXJuIHJjUmVjdDsKK0NQREZfUmVjdCBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChjb25zdCBDUERGX1JlY3QmIHJjUmVjdCwgRlhfRkxPQVQgZlNpemUpIHsKKyAgaWYgKHJjUmVjdC5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIHJjUmVjdDsKIAotCUNQREZfUmVjdCByY05ldyhyY1JlY3QubGVmdCArIGZTaXplLAotCQkJCQlyY1JlY3QuYm90dG9tICsgZlNpemUsCi0JCQkJCXJjUmVjdC5yaWdodCAtIGZTaXplLAotCQkJCQlyY1JlY3QudG9wIC0gZlNpemUpOwotCXJjTmV3Lk5vcm1hbGl6ZSgpOwotCXJldHVybiByY05ldzsKKyAgQ1BERl9SZWN0IHJjTmV3KHJjUmVjdC5sZWZ0ICsgZlNpemUsIHJjUmVjdC5ib3R0b20gKyBmU2l6ZSwKKyAgICAgICAgICAgICAgICAgIHJjUmVjdC5yaWdodCAtIGZTaXplLCByY1JlY3QudG9wIC0gZlNpemUpOworICByY05ldy5Ob3JtYWxpemUoKTsKKyAgcmV0dXJuIHJjTmV3OwogfQogCi1DUERGX1JlY3QgQ1BXTF9VdGlsczo6U2NhbGVSZWN0KGNvbnN0IENQREZfUmVjdCAmIHJjUmVjdCxGWF9GTE9BVCBmU2NhbGUpCi17Ci0JRlhfRkxPQVQgZkhhbGZXaWR0aCA9IChyY1JlY3QucmlnaHQgLSByY1JlY3QubGVmdCkgLyAyLjBmOwotCUZYX0ZMT0FUIGZIYWxmSGVpZ2h0ID0gKHJjUmVjdC50b3AgLSByY1JlY3QuYm90dG9tKSAvIDIuMGY7CitDUERGX1JlY3QgQ1BXTF9VdGlsczo6U2NhbGVSZWN0KGNvbnN0IENQREZfUmVjdCYgcmNSZWN0LCBGWF9GTE9BVCBmU2NhbGUpIHsKKyAgRlhfRkxPQVQgZkhhbGZXaWR0aCA9IChyY1JlY3QucmlnaHQgLSByY1JlY3QubGVmdCkgLyAyLjBmOworICBGWF9GTE9BVCBmSGFsZkhlaWdodCA9IChyY1JlY3QudG9wIC0gcmNSZWN0LmJvdHRvbSkgLyAyLjBmOwogCi0JQ1BERl9Qb2ludCBwdENlbnRlciA9IENQREZfUG9pbnQoKHJjUmVjdC5sZWZ0ICsgcmNSZWN0LnJpZ2h0KSAvIDIsKHJjUmVjdC50b3AgKyByY1JlY3QuYm90dG9tKSAvIDIpOworICBDUERGX1BvaW50IHB0Q2VudGVyID0gQ1BERl9Qb2ludCgocmNSZWN0LmxlZnQgKyByY1JlY3QucmlnaHQpIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJjUmVjdC50b3AgKyByY1JlY3QuYm90dG9tKSAvIDIpOwogCi0JcmV0dXJuIENQREZfUmVjdChwdENlbnRlci54IC0gZkhhbGZXaWR0aCAqIGZTY2FsZSwKLQkJCQlwdENlbnRlci55IC0gZkhhbGZIZWlnaHQgKiBmU2NhbGUsCi0JCQkJcHRDZW50ZXIueCArIGZIYWxmV2lkdGggKiBmU2NhbGUsCi0JCQkJcHRDZW50ZXIueSArIGZIYWxmSGVpZ2h0ICogZlNjYWxlKTsKKyAgcmV0dXJuIENQREZfUmVjdCgKKyAgICAgIHB0Q2VudGVyLnggLSBmSGFsZldpZHRoICogZlNjYWxlLCBwdENlbnRlci55IC0gZkhhbGZIZWlnaHQgKiBmU2NhbGUsCisgICAgICBwdENlbnRlci54ICsgZkhhbGZXaWR0aCAqIGZTY2FsZSwgcHRDZW50ZXIueSArIGZIYWxmSGVpZ2h0ICogZlNjYWxlKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0UmVjdEZpbGxBcHBTdHJlYW0oY29uc3QgQ1BERl9SZWN0ICYgcmVjdCxjb25zdCBDUFdMX0NvbG9yICYgY29sb3IpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07CitDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRSZWN0RmlsbEFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikgeworICBDRlhfQnl0ZVRleHRCdWYgc0FwcFN0cmVhbTsKKworICBDRlhfQnl0ZVN0cmluZyBzQ29sb3IgPSBHZXRDb2xvckFwcFN0cmVhbShjb2xvciwgVFJVRSk7CisgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBzQ29sb3I7CisgICAgc0FwcFN0cmVhbSA8PCByZWN0LmxlZnQgPDwgIiAiIDw8IHJlY3QuYm90dG9tIDw8ICIgIgorICAgICAgICAgICAgICAgPDwgcmVjdC5yaWdodCAtIHJlY3QubGVmdCA8PCAiICIgPDwgcmVjdC50b3AgLSByZWN0LmJvdHRvbQorICAgICAgICAgICAgICAgPDwgIiByZSBmXG5RXG4iOworICB9CiAKLQlDRlhfQnl0ZVN0cmluZyBzQ29sb3IgPSBHZXRDb2xvckFwcFN0cmVhbShjb2xvcixUUlVFKTsKLQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKLQl7Ci0JCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgc0NvbG9yOwotCQlzQXBwU3RyZWFtIDw8IHJlY3QubGVmdCA8PCAiICIgPDwgcmVjdC5ib3R0b20gPDwgIiAiCi0JCQk8PCByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0IDw8ICIgIiA8PCByZWN0LnRvcCAtIHJlY3QuYm90dG9tIDw8ICIgcmUgZlxuUVxuIjsJCQotCX0KLQkKLQlyZXR1cm4gc0FwcFN0cmVhbS5HZXRCeXRlU3RyaW5nKCk7CisgIHJldHVybiBzQXBwU3RyZWFtLkdldEJ5dGVTdHJpbmcoKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0Q2lyY2xlRmlsbEFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QgJiByZWN0LGNvbnN0IENQV0xfQ29sb3IgJiBjb2xvcikKLXsKLQlDRlhfQnl0ZVRleHRCdWYgc0FwcFN0cmVhbTsKK0NGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldENpcmNsZUZpbGxBcHBTdHJlYW0oY29uc3QgQ1BERl9SZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikgeworICBDRlhfQnl0ZVRleHRCdWYgc0FwcFN0cmVhbTsKKworICBDRlhfQnl0ZVN0cmluZyBzQ29sb3IgPSBHZXRDb2xvckFwcFN0cmVhbShjb2xvciwgVFJVRSk7CisgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBzQ29sb3IgPDwgQ1BXTF9VdGlsczo6R2V0QVBfQ2lyY2xlKHJlY3QpIDw8ICJmXG5RXG4iOworICB9CiAKLQlDRlhfQnl0ZVN0cmluZyBzQ29sb3IgPSBHZXRDb2xvckFwcFN0cmVhbShjb2xvcixUUlVFKTsKLQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKLQl7Ci0JCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgc0NvbG9yIDw8IENQV0xfVXRpbHM6OkdldEFQX0NpcmNsZShyZWN0KSA8PCAiZlxuUVxuIjsJCQotCX0KLQkKLQlyZXR1cm4gc0FwcFN0cmVhbS5HZXRCeXRlU3RyaW5nKCk7CisgIHJldHVybiBzQXBwU3RyZWFtLkdldEJ5dGVTdHJpbmcoKTsKIH0KIAotQ1BERl9SZWN0IENQV0xfVXRpbHM6OkdldENlbnRlclNxdWFyZShjb25zdCBDUERGX1JlY3QgJiByZWN0KQotewotCUZYX0ZMT0FUIGZXaWR0aCA9IHJlY3QucmlnaHQgLSAgcmVjdC5sZWZ0OwotCUZYX0ZMT0FUIGZIZWlnaHQgPSByZWN0LnRvcCAtIHJlY3QuYm90dG9tOworQ1BERl9SZWN0IENQV0xfVXRpbHM6OkdldENlbnRlclNxdWFyZShjb25zdCBDUERGX1JlY3QmIHJlY3QpIHsKKyAgRlhfRkxPQVQgZldpZHRoID0gcmVjdC5yaWdodCAtIHJlY3QubGVmdDsKKyAgRlhfRkxPQVQgZkhlaWdodCA9IHJlY3QudG9wIC0gcmVjdC5ib3R0b207CiAKLQlGWF9GTE9BVCBmQ2VudGVyWCA9IChyZWN0LmxlZnQgKyByZWN0LnJpZ2h0KS8yLjBmOwotCUZYX0ZMT0FUIGZDZW50ZXJZID0gKHJlY3QudG9wICsgcmVjdC5ib3R0b20pLzIuMGY7CisgIEZYX0ZMT0FUIGZDZW50ZXJYID0gKHJlY3QubGVmdCArIHJlY3QucmlnaHQpIC8gMi4wZjsKKyAgRlhfRkxPQVQgZkNlbnRlclkgPSAocmVjdC50b3AgKyByZWN0LmJvdHRvbSkgLyAyLjBmOwogCi0JRlhfRkxPQVQgZlJhZGl1cyA9IChmV2lkdGggPiBmSGVpZ2h0KSA/IGZIZWlnaHQgLyAyIDogZldpZHRoIC8gMjsKKyAgRlhfRkxPQVQgZlJhZGl1cyA9IChmV2lkdGggPiBmSGVpZ2h0KSA/IGZIZWlnaHQgLyAyIDogZldpZHRoIC8gMjsKIAotCXJldHVybiBDUERGX1JlY3QoZkNlbnRlclggLSBmUmFkaXVzLGZDZW50ZXJZIC0gZlJhZGl1cyxmQ2VudGVyWCArIGZSYWRpdXMsZkNlbnRlclkgKyBmUmFkaXVzKTsKKyAgcmV0dXJuIENQREZfUmVjdChmQ2VudGVyWCAtIGZSYWRpdXMsIGZDZW50ZXJZIC0gZlJhZGl1cywgZkNlbnRlclggKyBmUmFkaXVzLAorICAgICAgICAgICAgICAgICAgIGZDZW50ZXJZICsgZlJhZGl1cyk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0oSUZYX0VkaXQqIHBFZGl0LCBjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQsIGNvbnN0IENQVlRfV29yZFJhbmdlICogcFJhbmdlLCAKLQkJCQkJCQkJCQkJCQkJRlhfQk9PTCBiQ29udGludW91cywgRlhfV09SRCBTdWJXb3JkKQotewotCXJldHVybiBJRlhfRWRpdDo6R2V0RWRpdEFwcGVhcmFuY2VTdHJlYW0ocEVkaXQscHRPZmZzZXQscFJhbmdlLGJDb250aW51b3VzLFN1YldvcmQpOworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0RWRpdEFwcFN0cmVhbShJRlhfRWRpdCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDb250aW51b3VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIFN1YldvcmQpIHsKKyAgcmV0dXJuIElGWF9FZGl0OjpHZXRFZGl0QXBwZWFyYW5jZVN0cmVhbShwRWRpdCwgcHRPZmZzZXQsIHBSYW5nZSwgYkNvbnRpbnVvdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViV29yZCk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEVkaXRTZWxBcHBTdHJlYW0oSUZYX0VkaXQqIHBFZGl0LCBjb25zdCBDUERGX1BvaW50ICYgcHRPZmZzZXQsIAotCQkJCQkJCQljb25zdCBDUFZUX1dvcmRSYW5nZSAqIHBSYW5nZSkKLXsKLQlyZXR1cm4gSUZYX0VkaXQ6OkdldFNlbGVjdEFwcGVhcmFuY2VTdHJlYW0ocEVkaXQscHRPZmZzZXQscFJhbmdlKTsKK0NGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEVkaXRTZWxBcHBTdHJlYW0oSUZYX0VkaXQqIHBFZGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSkgeworICByZXR1cm4gSUZYX0VkaXQ6OkdldFNlbGVjdEFwcGVhcmFuY2VTdHJlYW0ocEVkaXQsIHB0T2Zmc2V0LCBwUmFuZ2UpOwogfQogCi1zdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0U3F1aWdnbHlBcHBlYXJhbmNlU3RyZWFtKEZYX0ZMT0FUIGZTdGFydFgsIEZYX0ZMT0FUIGZFbmRYLCBGWF9GTE9BVCBmWSwgRlhfRkxPQVQgZlN0ZXApCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNSZXQ7CitzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0U3F1aWdnbHlBcHBlYXJhbmNlU3RyZWFtKEZYX0ZMT0FUIGZTdGFydFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZFbmRYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlN0ZXApIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNSZXQ7CiAKLQlzUmV0IDw8ICIwIHdcbiIgPDwgZlN0YXJ0WCA8PCAiICIgPDwgZlkgPDwgIiBtXG4iOworICBzUmV0IDw8ICIwIHdcbiIgPDwgZlN0YXJ0WCA8PCAiICIgPDwgZlkgPDwgIiBtXG4iOwogCi0JRlhfRkxPQVQgZng7Ci0JRlhfSU5UMzIgaTsKKyAgRlhfRkxPQVQgZng7CisgIGludDMyX3QgaTsKIAotCWZvciAoaT0xLGZ4PWZTdGFydFgrZlN0ZXA7IGZ4PGZFbmRYOyBmeCs9ZlN0ZXAsaSsrKQotCXsKLQkJc1JldCA8PCBmeCA8PCAiICIgPDwgZlkgKyAoaSYxKSpmU3RlcCA8PCAiIGxcbiI7Ci0JfQorICBmb3IgKGkgPSAxLCBmeCA9IGZTdGFydFggKyBmU3RlcDsgZnggPCBmRW5kWDsgZnggKz0gZlN0ZXAsIGkrKykgeworICAgIHNSZXQgPDwgZnggPDwgIiAiIDw8IGZZICsgKGkgJiAxKSAqIGZTdGVwIDw8ICIgbFxuIjsKKyAgfQogCi0Jc1JldCA8PCAiU1xuIjsKKyAgc1JldCA8PCAiU1xuIjsKIAotCXJldHVybiBzUmV0LkdldEJ5dGVTdHJpbmcoKTsKKyAgcmV0dXJuIHNSZXQuR2V0Qnl0ZVN0cmluZygpOwogfQogCi1zdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0V29yZFNwZWxsQ2hlY2tBcHBlYXJhbmNlU3RyZWFtKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IsIGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCwKLQkJCQkJCQkJCQkJCQkJCQkgIGNvbnN0IENQVlRfV29yZFJhbmdlICYgd3JXb3JkKQotewotCUNGWF9CeXRlVGV4dEJ1ZiBzUmV0Oworc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldFdvcmRTcGVsbENoZWNrQXBwZWFyYW5jZVN0cmVhbSgKKyAgICBJRlhfRWRpdF9JdGVyYXRvciogcEl0ZXJhdG9yLAorICAgIGNvbnN0IENQREZfUG9pbnQmIHB0T2Zmc2V0LAorICAgIGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cldvcmQpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNSZXQ7CiAKLQlGWF9GTE9BVCBmU3RhcnRYID0gMC4wZjsKLQlGWF9GTE9BVCBmRW5kWCA9IDAuMGY7Ci0JRlhfRkxPQVQgZlkgPSAwLjBmOwotCUZYX0ZMT0FUIGZTdGVwID0gMC4wZjsgCisgIEZYX0ZMT0FUIGZTdGFydFggPSAwLjBmOworICBGWF9GTE9BVCBmRW5kWCA9IDAuMGY7CisgIEZYX0ZMT0FUIGZZID0gMC4wZjsKKyAgRlhfRkxPQVQgZlN0ZXAgPSAwLjBmOwogCi0JRlhfQk9PTCBiQnJlYWsgPSBGQUxTRTsKKyAgRlhfQk9PTCBiQnJlYWsgPSBGQUxTRTsKIAotCWlmIChwSXRlcmF0b3IpCi0JewotCQlwSXRlcmF0b3ItPlNldEF0KHdyV29yZC5CZWdpblBvcyk7CisgIGlmIChwSXRlcmF0b3IpIHsKKyAgICBwSXRlcmF0b3ItPlNldEF0KHdyV29yZC5CZWdpblBvcyk7CiAKLQkJZG8KLQkJewotCQkJQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7CisgICAgZG8geworICAgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7CiAKLQkJCUNQVlRfTGluZSBsaW5lOwkJCQkKLQkJCWlmIChwSXRlcmF0b3ItPkdldExpbmUobGluZSkpCi0JCQl7Ci0JCQkJZlkgPSBsaW5lLnB0TGluZS55OwotCQkJCWZTdGVwID0gKGxpbmUuZkxpbmVBc2NlbnQgLSBsaW5lLmZMaW5lRGVzY2VudCkgLyAxNi4wZjsKLQkJCX0KKyAgICAgIENQVlRfTGluZSBsaW5lOworICAgICAgaWYgKHBJdGVyYXRvci0+R2V0TGluZShsaW5lKSkgeworICAgICAgICBmWSA9IGxpbmUucHRMaW5lLnk7CisgICAgICAgIGZTdGVwID0gKGxpbmUuZkxpbmVBc2NlbnQgLSBsaW5lLmZMaW5lRGVzY2VudCkgLyAxNi4wZjsKKyAgICAgIH0KIAotCQkJaWYgKHBsYWNlLkxpbmVDbXAod3JXb3JkLkJlZ2luUG9zKSA9PSAwKQotCQkJewotCQkJCXBJdGVyYXRvci0+U2V0QXQod3JXb3JkLkJlZ2luUG9zKTsKLQkJCQlDUFZUX1dvcmQgd29yZDsKLQkJCQlpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKQotCQkJCXsKLQkJCQkJZlN0YXJ0WCA9IHdvcmQucHRXb3JkLng7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWZTdGFydFggPSBsaW5lLnB0TGluZS54OwotCQkJfQorICAgICAgaWYgKHBsYWNlLkxpbmVDbXAod3JXb3JkLkJlZ2luUG9zKSA9PSAwKSB7CisgICAgICAgIHBJdGVyYXRvci0+U2V0QXQod3JXb3JkLkJlZ2luUG9zKTsKKyAgICAgICAgQ1BWVF9Xb3JkIHdvcmQ7CisgICAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKKyAgICAgICAgICBmU3RhcnRYID0gd29yZC5wdFdvcmQueDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZlN0YXJ0WCA9IGxpbmUucHRMaW5lLng7CisgICAgICB9CiAKLQkJCWlmIChwbGFjZS5MaW5lQ21wKHdyV29yZC5FbmRQb3MpID09IDApCi0JCQl7Ci0JCQkJcEl0ZXJhdG9yLT5TZXRBdCh3cldvcmQuRW5kUG9zKTsKLQkJCQlDUFZUX1dvcmQgd29yZDsKLQkJCQlpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKQotCQkJCXsKLQkJCQkJZkVuZFggPSB3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGg7Ci0JCQkJfQorICAgICAgaWYgKHBsYWNlLkxpbmVDbXAod3JXb3JkLkVuZFBvcykgPT0gMCkgeworICAgICAgICBwSXRlcmF0b3ItPlNldEF0KHdyV29yZC5FbmRQb3MpOworICAgICAgICBDUFZUX1dvcmQgd29yZDsKKyAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgeworICAgICAgICAgIGZFbmRYID0gd29yZC5wdFdvcmQueCArIHdvcmQuZldpZHRoOworICAgICAgICB9CiAKLQkJCQliQnJlYWsgPSBUUlVFOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWZFbmRYID0gbGluZS5wdExpbmUueCArIGxpbmUuZkxpbmVXaWR0aDsKLQkJCX0KKyAgICAgICAgYkJyZWFrID0gVFJVRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZFbmRYID0gbGluZS5wdExpbmUueCArIGxpbmUuZkxpbmVXaWR0aDsKKyAgICAgIH0KIAotCQkJc1JldCA8PCBHZXRTcXVpZ2dseUFwcGVhcmFuY2VTdHJlYW0oZlN0YXJ0WCArIHB0T2Zmc2V0LngsIGZFbmRYICsgcHRPZmZzZXQueCwgZlkgKyBwdE9mZnNldC55LGZTdGVwKTsKKyAgICAgIHNSZXQgPDwgR2V0U3F1aWdnbHlBcHBlYXJhbmNlU3RyZWFtKAorICAgICAgICAgIGZTdGFydFggKyBwdE9mZnNldC54LCBmRW5kWCArIHB0T2Zmc2V0LngsIGZZICsgcHRPZmZzZXQueSwgZlN0ZXApOwogCi0JCQlpZiAoYkJyZWFrKSBicmVhazsKLQkJfQotCQl3aGlsZSAocEl0ZXJhdG9yLT5OZXh0TGluZSgpKTsKLQl9CisgICAgICBpZiAoYkJyZWFrKQorICAgICAgICBicmVhazsKKyAgICB9IHdoaWxlIChwSXRlcmF0b3ItPk5leHRMaW5lKCkpOworICB9CiAKLQlyZXR1cm4gc1JldC5HZXRCeXRlU3RyaW5nKCk7CisgIHJldHVybiBzUmV0LkdldEJ5dGVTdHJpbmcoKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0U3BlbGxDaGVja0FwcFN0cmVhbShJRlhfRWRpdCogcEVkaXQsIElQV0xfU3BlbGxDaGVjayogcFNwZWxsQ2hlY2ssIGNvbnN0IENQREZfUG9pbnQgJiBwdE9mZnNldCwKLQkJCQkJCQkJY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgKiBwUmFuZ2UpCi17Ci0JQVNTRVJUKHBFZGl0ICE9IE5VTEwpOwotCUFTU0VSVChwU3BlbGxDaGVjayAhPSBOVUxMKTsKK0NGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldFNwZWxsQ2hlY2tBcHBTdHJlYW0oCisgICAgSUZYX0VkaXQqIHBFZGl0LAorICAgIElQV0xfU3BlbGxDaGVjayogcFNwZWxsQ2hlY2ssCisgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsCisgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSkgeworICBDRlhfQnl0ZVRleHRCdWYgc1JldDsKIAotCUNGWF9CeXRlVGV4dEJ1ZiBzUmV0OworICBpZiAocFJhbmdlICYmIHBSYW5nZS0+SXNFeGlzdCgpKSB7CisgICAgaWYgKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBwRWRpdC0+R2V0SXRlcmF0b3IoKSkgeworICAgICAgcEl0ZXJhdG9yLT5TZXRBdChwUmFuZ2UtPkJlZ2luUG9zKTsKIAotCWlmIChwUmFuZ2UgJiYgcFJhbmdlLT5Jc0V4aXN0KCkpCi0JewotCQlpZiAoSUZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IHBFZGl0LT5HZXRJdGVyYXRvcigpKQotCQl7Ci0JCQlwSXRlcmF0b3ItPlNldEF0KHBSYW5nZS0+QmVnaW5Qb3MpOworICAgICAgRlhfQk9PTCBiTGF0aW5Xb3JkID0gRkFMU0U7CisgICAgICBDUFZUX1dvcmRQbGFjZSB3cFdvcmRTdGFydDsKKyAgICAgIENGWF9CeXRlU3RyaW5nIHNXb3JkOwogCi0JCQlGWF9CT09MIGJMYXRpbldvcmQgPSBGQUxTRTsKLQkJCUNQVlRfV29yZFBsYWNlIHdwV29yZFN0YXJ0OwotCQkJQ0ZYX0J5dGVTdHJpbmcgc1dvcmQ7CisgICAgICBDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZTsKKyAgICAgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpIHsKKyAgICAgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7CisgICAgICAgIGlmIChwUmFuZ2UgJiYgcGxhY2UuV29yZENtcChwUmFuZ2UtPkVuZFBvcykgPiAwKQorICAgICAgICAgIGJyZWFrOwogCi0JCQlDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZTsKLQkJCXdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpCi0JCQl7Ci0JCQkJQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7Ci0JCQkJaWYgKHBSYW5nZSAmJiBwbGFjZS5Xb3JkQ21wKHBSYW5nZS0+RW5kUG9zKSA+IDApIGJyZWFrOwkJCQkKKyAgICAgICAgQ1BWVF9Xb3JkIHdvcmQ7CisgICAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKKyAgICAgICAgICBpZiAoRlhfRURJVF9JU0xBVElOV09SRCh3b3JkLldvcmQpKSB7CisgICAgICAgICAgICBpZiAoIWJMYXRpbldvcmQpIHsKKyAgICAgICAgICAgICAgd3BXb3JkU3RhcnQgPSBwbGFjZTsKKyAgICAgICAgICAgICAgYkxhdGluV29yZCA9IFRSVUU7CisgICAgICAgICAgICB9CiAKLQkJCQlDUFZUX1dvcmQgd29yZDsKLQkJCQlpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKQotCQkJCXsKLQkJCQkJaWYgKEZYX0VESVRfSVNMQVRJTldPUkQod29yZC5Xb3JkKSkKLQkJCQkJewotCQkJCQkJaWYgKCFiTGF0aW5Xb3JkKQotCQkJCQkJewotCQkJCQkJCXdwV29yZFN0YXJ0ID0gcGxhY2U7Ci0JCQkJCQkJYkxhdGluV29yZCA9IFRSVUU7CQkJCQkJCQkKLQkJCQkJCX0KKyAgICAgICAgICAgIHNXb3JkICs9IChjaGFyKXdvcmQuV29yZDsKKyAgICAgICAgICAgIG9sZHBsYWNlID0gcGxhY2U7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChiTGF0aW5Xb3JkKSB7CisgICAgICAgICAgICAgIGlmICghcFNwZWxsQ2hlY2stPkNoZWNrV29yZChzV29yZCkpIHsKKyAgICAgICAgICAgICAgICBzUmV0IDw8IEdldFdvcmRTcGVsbENoZWNrQXBwZWFyYW5jZVN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgcEl0ZXJhdG9yLCBwdE9mZnNldCwgQ1BWVF9Xb3JkUmFuZ2Uod3BXb3JkU3RhcnQsIG9sZHBsYWNlKSk7CisgICAgICAgICAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdChwbGFjZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYkxhdGluV29yZCA9IEZBTFNFOworICAgICAgICAgICAgfQogCi0JCQkJCQlzV29yZCArPSAoY2hhcil3b3JkLldvcmQ7Ci0JCQkJCQlvbGRwbGFjZSA9IHBsYWNlOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJaWYgKGJMYXRpbldvcmQpCi0JCQkJCQl7Ci0JCQkJCQkJaWYgKCFwU3BlbGxDaGVjay0+Q2hlY2tXb3JkKHNXb3JkKSkKLQkJCQkJCQl7Ci0JCQkJCQkJCXNSZXQgPDwgR2V0V29yZFNwZWxsQ2hlY2tBcHBlYXJhbmNlU3RyZWFtKHBJdGVyYXRvcixwdE9mZnNldCxDUFZUX1dvcmRSYW5nZSh3cFdvcmRTdGFydCxvbGRwbGFjZSkpOwotCQkJCQkJCQlwSXRlcmF0b3ItPlNldEF0KHBsYWNlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJYkxhdGluV29yZCA9IEZBTFNFOwotCQkJCQkJfQotCi0JCQkJCQlzV29yZC5FbXB0eSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWlmIChiTGF0aW5Xb3JkKQotCQkJCQl7Ci0JCQkJCQlpZiAoIXBTcGVsbENoZWNrLT5DaGVja1dvcmQoc1dvcmQpKQotCQkJCQkJCXNSZXQgPDwgR2V0V29yZFNwZWxsQ2hlY2tBcHBlYXJhbmNlU3RyZWFtKHBJdGVyYXRvcixwdE9mZnNldCxDUFZUX1dvcmRSYW5nZSh3cFdvcmRTdGFydCxvbGRwbGFjZSkpOwotCQkJCQkJYkxhdGluV29yZCA9IEZBTFNFOwotCQkJCQkJc1dvcmQuRW1wdHkoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgIHNXb3JkLkVtcHR5KCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChiTGF0aW5Xb3JkKSB7CisgICAgICAgICAgICBpZiAoIXBTcGVsbENoZWNrLT5DaGVja1dvcmQoc1dvcmQpKQorICAgICAgICAgICAgICBzUmV0IDw8IEdldFdvcmRTcGVsbENoZWNrQXBwZWFyYW5jZVN0cmVhbSgKKyAgICAgICAgICAgICAgICAgIHBJdGVyYXRvciwgcHRPZmZzZXQsIENQVlRfV29yZFJhbmdlKHdwV29yZFN0YXJ0LCBvbGRwbGFjZSkpOworICAgICAgICAgICAgYkxhdGluV29yZCA9IEZBTFNFOworICAgICAgICAgICAgc1dvcmQuRW1wdHkoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KIAotCQkJaWYgKGJMYXRpbldvcmQpCi0JCQl7Ci0JCQkJaWYgKCFwU3BlbGxDaGVjay0+Q2hlY2tXb3JkKHNXb3JkKSkKLQkJCQkJc1JldCA8PCBHZXRXb3JkU3BlbGxDaGVja0FwcGVhcmFuY2VTdHJlYW0ocEl0ZXJhdG9yLHB0T2Zmc2V0LENQVlRfV29yZFJhbmdlKHdwV29yZFN0YXJ0LG9sZHBsYWNlKSk7CisgICAgICBpZiAoYkxhdGluV29yZCkgeworICAgICAgICBpZiAoIXBTcGVsbENoZWNrLT5DaGVja1dvcmQoc1dvcmQpKQorICAgICAgICAgIHNSZXQgPDwgR2V0V29yZFNwZWxsQ2hlY2tBcHBlYXJhbmNlU3RyZWFtKAorICAgICAgICAgICAgICBwSXRlcmF0b3IsIHB0T2Zmc2V0LCBDUFZUX1dvcmRSYW5nZSh3cFdvcmRTdGFydCwgb2xkcGxhY2UpKTsKIAotCQkJCWJMYXRpbldvcmQgPSBGQUxTRTsKLQkJCQlzV29yZC5FbXB0eSgpOwotCQkJfQotCQl9Ci0JfQorICAgICAgICBiTGF0aW5Xb3JkID0gRkFMU0U7CisgICAgICAgIHNXb3JkLkVtcHR5KCk7CisgICAgICB9CisgICAgfQorICB9CiAKLQlyZXR1cm4gc1JldC5HZXRCeXRlU3RyaW5nKCk7CisgIHJldHVybiBzUmV0LkdldEJ5dGVTdHJpbmcoKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0VGV4dEFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsSUZYX0VkaXRfRm9udE1hcCAqIHBGb250TWFwLAotCQkJCQkJCQkJCQkJCQljb25zdCBDRlhfV2lkZVN0cmluZyAmIHNUZXh0LCBGWF9JTlQzMiBuQWxpZ25tZW50SCwgRlhfSU5UMzIgbkFsaWdubWVudFYsCi0JCQkJCQkJCQkJCQkJCUZYX0ZMT0FUIGZGb250U2l6ZSwgRlhfQk9PTCBiTXVsdGlMaW5lLCBGWF9CT09MIGJBdXRvUmV0dXJuLCBjb25zdCBDUFdMX0NvbG9yICYgY3JUZXh0KQotewotCUNGWF9CeXRlVGV4dEJ1ZiBzUmV0OworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0VGV4dEFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QmIHJjQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQWxpZ25tZW50SCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQWxpZ25tZW50ViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJNdWx0aUxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkF1dG9SZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyVGV4dCkgeworICBDRlhfQnl0ZVRleHRCdWYgc1JldDsKIAotCWlmIChJRlhfRWRpdCAqIHBFZGl0ID0gSUZYX0VkaXQ6Ok5ld0VkaXQoKSkKLQl7Ci0JCXBFZGl0LT5TZXRGb250TWFwKHBGb250TWFwKTsKLQkJcEVkaXQtPlNldFBsYXRlUmVjdChyY0JCb3gpOwotCQlwRWRpdC0+U2V0QWxpZ25tZW50SChuQWxpZ25tZW50SCk7Ci0JCXBFZGl0LT5TZXRBbGlnbm1lbnRWKG5BbGlnbm1lbnRWKTsKLQkJcEVkaXQtPlNldE11bHRpTGluZShiTXVsdGlMaW5lKTsKLQkJcEVkaXQtPlNldEF1dG9SZXR1cm4oYkF1dG9SZXR1cm4pOwotCQlpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkKLQkJCXBFZGl0LT5TZXRBdXRvRm9udFNpemUoVFJVRSk7Ci0JCWVsc2UKLQkJCXBFZGl0LT5TZXRGb250U2l6ZShmRm9udFNpemUpOworICBpZiAoSUZYX0VkaXQqIHBFZGl0ID0gSUZYX0VkaXQ6Ok5ld0VkaXQoKSkgeworICAgIHBFZGl0LT5TZXRGb250TWFwKHBGb250TWFwKTsKKyAgICBwRWRpdC0+U2V0UGxhdGVSZWN0KHJjQkJveCk7CisgICAgcEVkaXQtPlNldEFsaWdubWVudEgobkFsaWdubWVudEgpOworICAgIHBFZGl0LT5TZXRBbGlnbm1lbnRWKG5BbGlnbm1lbnRWKTsKKyAgICBwRWRpdC0+U2V0TXVsdGlMaW5lKGJNdWx0aUxpbmUpOworICAgIHBFZGl0LT5TZXRBdXRvUmV0dXJuKGJBdXRvUmV0dXJuKTsKKyAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkKKyAgICAgIHBFZGl0LT5TZXRBdXRvRm9udFNpemUoVFJVRSk7CisgICAgZWxzZQorICAgICAgcEVkaXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7CiAKLQkJcEVkaXQtPkluaXRpYWxpemUoKTsKLQkJcEVkaXQtPlNldFRleHQoc1RleHQuY19zdHIoKSk7CisgICAgcEVkaXQtPkluaXRpYWxpemUoKTsKKyAgICBwRWRpdC0+U2V0VGV4dChzVGV4dC5jX3N0cigpKTsKIAotCQlDRlhfQnl0ZVN0cmluZyBzRWRpdCA9IENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0ocEVkaXQsIENQREZfUG9pbnQoMC4wZiwwLjBmKSk7Ci0JCWlmIChzRWRpdC5HZXRMZW5ndGgoKSA+IDApCi0JCXsKLQkJCXNSZXQgPDwgIkJUXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCkgPDwgc0VkaXQgPDwgIkVUXG4iOwotCQl9Ci0JCUlGWF9FZGl0OjpEZWxFZGl0KHBFZGl0KTsKLQl9CisgICAgQ0ZYX0J5dGVTdHJpbmcgc0VkaXQgPQorICAgICAgICBDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKHBFZGl0LCBDUERGX1BvaW50KDAuMGYsIDAuMGYpKTsKKyAgICBpZiAoc0VkaXQuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICBzUmV0IDw8ICJCVFxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQpIDw8IHNFZGl0CisgICAgICAgICAgIDw8ICJFVFxuIjsKKyAgICB9CisgICAgSUZYX0VkaXQ6OkRlbEVkaXQocEVkaXQpOworICB9CiAKLQlyZXR1cm4gc1JldC5HZXRCeXRlU3RyaW5nKCk7CisgIHJldHVybiBzUmV0LkdldEJ5dGVTdHJpbmcoKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0UHVzaEJ1dHRvbkFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsCi0JCQkJCQkJCQkJCUlGWF9FZGl0X0ZvbnRNYXAgKiBwRm9udE1hcCwKLQkJCQkJCQkJCQkJQ1BERl9TdHJlYW0gKiBwSWNvblN0cmVhbSwKLQkJCQkJCQkJCQkJQ1BERl9JY29uRml0ICYgSWNvbkZpdCwKLQkJCQkJCQkJCQkJY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiBzTGFiZWwsCQkJCQkJCQkJCQkKLQkJCQkJCQkJCQkJY29uc3QgQ1BXTF9Db2xvciAmIGNyVGV4dCwKLQkJCQkJCQkJCQkJRlhfRkxPQVQgZkZvbnRTaXplLAotCQkJCQkJCQkJCQlGWF9JTlQzMiBuTGF5T3V0KQotewotCWNvbnN0IEZYX0ZMT0FUIGZBdXRvRm9udFNjYWxlID0gMS4wZiAvIDMuMGY7CQorQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0UHVzaEJ1dHRvbkFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QmIHJjQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwSWNvblN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9JY29uRml0JiBJY29uRml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc0xhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjclRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGF5T3V0KSB7CisgIGNvbnN0IEZYX0ZMT0FUIGZBdXRvRm9udFNjYWxlID0gMS4wZiAvIDMuMGY7CiAKLQlpZiAoSUZYX0VkaXQgKiBwRWRpdCA9IElGWF9FZGl0OjpOZXdFZGl0KCkpCi0JewotCQlwRWRpdC0+U2V0Rm9udE1hcChwRm9udE1hcCk7Ci0JCXBFZGl0LT5TZXRBbGlnbm1lbnRIKDEpOwotCQlwRWRpdC0+U2V0QWxpZ25tZW50VigxKTsKLQkJcEVkaXQtPlNldE11bHRpTGluZShGQUxTRSk7Ci0JCXBFZGl0LT5TZXRBdXRvUmV0dXJuKEZBTFNFKTsKLQkJaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpCi0JCQlwRWRpdC0+U2V0QXV0b0ZvbnRTaXplKFRSVUUpOwotCQllbHNlCi0JCQlwRWRpdC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKKyAgaWYgKElGWF9FZGl0KiBwRWRpdCA9IElGWF9FZGl0OjpOZXdFZGl0KCkpIHsKKyAgICBwRWRpdC0+U2V0Rm9udE1hcChwRm9udE1hcCk7CisgICAgcEVkaXQtPlNldEFsaWdubWVudEgoMSk7CisgICAgcEVkaXQtPlNldEFsaWdubWVudFYoMSk7CisgICAgcEVkaXQtPlNldE11bHRpTGluZShGQUxTRSk7CisgICAgcEVkaXQtPlNldEF1dG9SZXR1cm4oRkFMU0UpOworICAgIGlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKQorICAgICAgcEVkaXQtPlNldEF1dG9Gb250U2l6ZShUUlVFKTsKKyAgICBlbHNlCisgICAgICBwRWRpdC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKIAotCQlwRWRpdC0+SW5pdGlhbGl6ZSgpOwotCQlwRWRpdC0+U2V0VGV4dChzTGFiZWwuY19zdHIoKSk7CisgICAgcEVkaXQtPkluaXRpYWxpemUoKTsKKyAgICBwRWRpdC0+U2V0VGV4dChzTGFiZWwuY19zdHIoKSk7CiAKLQkJQ1BERl9SZWN0IHJjTGFiZWxDb250ZW50ID0gcEVkaXQtPkdldENvbnRlbnRSZWN0KCk7Ci0JCUNQV0xfSWNvbiBJY29uOwotCQlQV0xfQ1JFQVRFUEFSQU0gY3A7Ci0JCWNwLmR3RmxhZ3MgPSBQV1NfVklTSUJMRTsKLQkJSWNvbi5DcmVhdGUoY3ApOwotCQlJY29uLlNldEljb25GaXQoJkljb25GaXQpOwotCQlJY29uLlNldFBERlN0cmVhbShwSWNvblN0cmVhbSk7CisgICAgQ1BERl9SZWN0IHJjTGFiZWxDb250ZW50ID0gcEVkaXQtPkdldENvbnRlbnRSZWN0KCk7CisgICAgQ1BXTF9JY29uIEljb247CisgICAgUFdMX0NSRUFURVBBUkFNIGNwOworICAgIGNwLmR3RmxhZ3MgPSBQV1NfVklTSUJMRTsKKyAgICBJY29uLkNyZWF0ZShjcCk7CisgICAgSWNvbi5TZXRJY29uRml0KCZJY29uRml0KTsKKyAgICBJY29uLlNldFBERlN0cmVhbShwSWNvblN0cmVhbSk7CiAKLQkJQ1BERl9SZWN0IHJjTGFiZWwgPSBDUERGX1JlY3QoMCwwLDAsMCk7Ci0JCUNQREZfUmVjdCByY0ljb24gPSBDUERGX1JlY3QoMCwwLDAsMCk7Ci0JCUZYX0ZMT0FUIGZXaWR0aCA9IDAuMGY7Ci0JCUZYX0ZMT0FUIGZIZWlnaHQgPSAwLjBmOworICAgIENQREZfUmVjdCByY0xhYmVsID0gQ1BERl9SZWN0KDAsIDAsIDAsIDApOworICAgIENQREZfUmVjdCByY0ljb24gPSBDUERGX1JlY3QoMCwgMCwgMCwgMCk7CisgICAgRlhfRkxPQVQgZldpZHRoID0gMC4wZjsKKyAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gMC4wZjsKIAotCQlzd2l0Y2ggKG5MYXlPdXQpCi0JCXsKLQkJY2FzZSBQUEJMX0xBQkVMOgotCQkJcmNMYWJlbCA9IHJjQkJveDsKLQkJCXJjSWNvbiA9IENQREZfUmVjdCgwLDAsMCwwKTsKLQkJCWJyZWFrOwotCQljYXNlIFBQQkxfSUNPTjoKLQkJCXJjSWNvbiA9IHJjQkJveDsKLQkJCXJjTGFiZWwgPSBDUERGX1JlY3QoMCwwLDAsMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBQUEJMX0lDT05UT1BMQUJFTEJPVFRPTToKKyAgICBzd2l0Y2ggKG5MYXlPdXQpIHsKKyAgICAgIGNhc2UgUFBCTF9MQUJFTDoKKyAgICAgICAgcmNMYWJlbCA9IHJjQkJveDsKKyAgICAgICAgcmNJY29uID0gQ1BERl9SZWN0KDAsIDAsIDAsIDApOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUFBCTF9JQ09OOgorICAgICAgICByY0ljb24gPSByY0JCb3g7CisgICAgICAgIHJjTGFiZWwgPSBDUERGX1JlY3QoMCwgMCwgMCwgMCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQUEJMX0lDT05UT1BMQUJFTEJPVFRPTToKIAotCQkJaWYgKHBJY29uU3RyZWFtKQotCQkJewotCQkJCWlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKQotCQkJCXsKLQkJCQkJZkhlaWdodCA9IHJjQkJveC50b3AgLSByY0JCb3guYm90dG9tOwotCQkJCQlyY0xhYmVsID0gQ1BERl9SZWN0KHJjQkJveC5sZWZ0LHJjQkJveC5ib3R0b20scmNCQm94LnJpZ2h0LHJjQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogZkF1dG9Gb250U2NhbGUpOwotCQkJCQlyY0ljb24gPSBDUERGX1JlY3QocmNCQm94LmxlZnQscmNMYWJlbC50b3AscmNCQm94LnJpZ2h0LHJjQkJveC50b3ApOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlmSGVpZ2h0ID0gcmNMYWJlbENvbnRlbnQuSGVpZ2h0KCk7CisgICAgICAgIGlmIChwSWNvblN0cmVhbSkgeworICAgICAgICAgIGlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKSB7CisgICAgICAgICAgICBmSGVpZ2h0ID0gcmNCQm94LnRvcCAtIHJjQkJveC5ib3R0b207CisgICAgICAgICAgICByY0xhYmVsID0gQ1BERl9SZWN0KHJjQkJveC5sZWZ0LCByY0JCb3guYm90dG9tLCByY0JCb3gucmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogZkF1dG9Gb250U2NhbGUpOworICAgICAgICAgICAgcmNJY29uID0KKyAgICAgICAgICAgICAgICBDUERGX1JlY3QocmNCQm94LmxlZnQsIHJjTGFiZWwudG9wLCByY0JCb3gucmlnaHQsIHJjQkJveC50b3ApOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmSGVpZ2h0ID0gcmNMYWJlbENvbnRlbnQuSGVpZ2h0KCk7CiAKLQkJCQkJaWYgKHJjQkJveC5ib3R0b20gKyBmSGVpZ2h0ID4gcmNCQm94LnRvcCkKLQkJCQkJewkJCQotCQkJCQkJcmNJY29uID0gQ1BERl9SZWN0KDAsMCwwLDApOwkJCQkKLQkJCQkJCXJjTGFiZWwgPSByY0JCb3g7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlyY0xhYmVsID0gQ1BERl9SZWN0KHJjQkJveC5sZWZ0LHJjQkJveC5ib3R0b20scmNCQm94LnJpZ2h0LHJjQkJveC5ib3R0b20gKyBmSGVpZ2h0KTsKLQkJCQkJCXJjSWNvbiA9IENQREZfUmVjdChyY0JCb3gubGVmdCxyY0xhYmVsLnRvcCxyY0JCb3gucmlnaHQscmNCQm94LnRvcCk7CQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXJjTGFiZWwgPSByY0JCb3g7Ci0JCQkJcmNJY29uID0gQ1BERl9SZWN0KDAsMCwwLDApOwotCQkJfQorICAgICAgICAgICAgaWYgKHJjQkJveC5ib3R0b20gKyBmSGVpZ2h0ID4gcmNCQm94LnRvcCkgeworICAgICAgICAgICAgICByY0ljb24gPSBDUERGX1JlY3QoMCwgMCwgMCwgMCk7CisgICAgICAgICAgICAgIHJjTGFiZWwgPSByY0JCb3g7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICByY0xhYmVsID0gQ1BERl9SZWN0KHJjQkJveC5sZWZ0LCByY0JCb3guYm90dG9tLCByY0JCb3gucmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LmJvdHRvbSArIGZIZWlnaHQpOworICAgICAgICAgICAgICByY0ljb24gPQorICAgICAgICAgICAgICAgICAgQ1BERl9SZWN0KHJjQkJveC5sZWZ0LCByY0xhYmVsLnRvcCwgcmNCQm94LnJpZ2h0LCByY0JCb3gudG9wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmNMYWJlbCA9IHJjQkJveDsKKyAgICAgICAgICByY0ljb24gPSBDUERGX1JlY3QoMCwgMCwgMCwgMCk7CisgICAgICAgIH0KIAotCQkJYnJlYWs7Ci0JCWNhc2UgUFBCTF9MQUJFTFRPUElDT05CT1RUT006CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQUEJMX0xBQkVMVE9QSUNPTkJPVFRPTToKIAotCQkJaWYgKHBJY29uU3RyZWFtKQotCQkJewotCQkJCWlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKQotCQkJCXsKLQkJCQkJZkhlaWdodCA9IHJjQkJveC50b3AgLSByY0JCb3guYm90dG9tOwotCQkJCQlyY0xhYmVsID0gQ1BERl9SZWN0KHJjQkJveC5sZWZ0LHJjQkJveC50b3AgLSBmSGVpZ2h0ICogZkF1dG9Gb250U2NhbGUgLHJjQkJveC5yaWdodCxyY0JCb3gudG9wKTsKLQkJCQkJcmNJY29uID0gQ1BERl9SZWN0KHJjQkJveC5sZWZ0LHJjQkJveC5ib3R0b20scmNCQm94LnJpZ2h0LHJjTGFiZWwuYm90dG9tKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJZkhlaWdodCA9IHJjTGFiZWxDb250ZW50LkhlaWdodCgpOworICAgICAgICBpZiAocEljb25TdHJlYW0pIHsKKyAgICAgICAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkgeworICAgICAgICAgICAgZkhlaWdodCA9IHJjQkJveC50b3AgLSByY0JCb3guYm90dG9tOworICAgICAgICAgICAgcmNMYWJlbCA9CisgICAgICAgICAgICAgICAgQ1BERl9SZWN0KHJjQkJveC5sZWZ0LCByY0JCb3gudG9wIC0gZkhlaWdodCAqIGZBdXRvRm9udFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICByY0JCb3gucmlnaHQsIHJjQkJveC50b3ApOworICAgICAgICAgICAgcmNJY29uID0gQ1BERl9SZWN0KHJjQkJveC5sZWZ0LCByY0JCb3guYm90dG9tLCByY0JCb3gucmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNMYWJlbC5ib3R0b20pOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmSGVpZ2h0ID0gcmNMYWJlbENvbnRlbnQuSGVpZ2h0KCk7CiAKLQkJCQkJaWYgKHJjQkJveC5ib3R0b20gKyBmSGVpZ2h0ID4gcmNCQm94LnRvcCkKLQkJCQkJewkJCQotCQkJCQkJcmNJY29uID0gQ1BERl9SZWN0KDAsMCwwLDApOwkJCQkKLQkJCQkJCXJjTGFiZWwgPSByY0JCb3g7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlyY0xhYmVsID0gQ1BERl9SZWN0KHJjQkJveC5sZWZ0LHJjQkJveC50b3AgLSBmSGVpZ2h0LHJjQkJveC5yaWdodCxyY0JCb3gudG9wKTsKLQkJCQkJCXJjSWNvbiA9IENQREZfUmVjdChyY0JCb3gubGVmdCxyY0JCb3guYm90dG9tLHJjQkJveC5yaWdodCxyY0xhYmVsLmJvdHRvbSk7CQkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlyY0xhYmVsID0gcmNCQm94OwotCQkJCXJjSWNvbiA9IENQREZfUmVjdCgwLDAsMCwwKTsKLQkJCX0KKyAgICAgICAgICAgIGlmIChyY0JCb3guYm90dG9tICsgZkhlaWdodCA+IHJjQkJveC50b3ApIHsKKyAgICAgICAgICAgICAgcmNJY29uID0gQ1BERl9SZWN0KDAsIDAsIDAsIDApOworICAgICAgICAgICAgICByY0xhYmVsID0gcmNCQm94OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgcmNMYWJlbCA9IENQREZfUmVjdChyY0JCb3gubGVmdCwgcmNCQm94LnRvcCAtIGZIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LnJpZ2h0LCByY0JCb3gudG9wKTsKKyAgICAgICAgICAgICAgcmNJY29uID0gQ1BERl9SZWN0KHJjQkJveC5sZWZ0LCByY0JCb3guYm90dG9tLCByY0JCb3gucmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0xhYmVsLmJvdHRvbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJjTGFiZWwgPSByY0JCb3g7CisgICAgICAgICAgcmNJY29uID0gQ1BERl9SZWN0KDAsIDAsIDAsIDApOworICAgICAgICB9CiAKLQkJCWJyZWFrOwotCQljYXNlIFBQQkxfSUNPTkxFRlRMQUJFTFJJR0hUOgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUFBCTF9JQ09OTEVGVExBQkVMUklHSFQ6CiAKLQkJCWlmIChwSWNvblN0cmVhbSkKLQkJCXsKLQkJCQlpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkKLQkJCQl7Ci0JCQkJCWZXaWR0aCA9IHJjQkJveC5yaWdodCAtIHJjQkJveC5sZWZ0OwotCQkJCQlyY0xhYmVsID0gQ1BERl9SZWN0KHJjQkJveC5yaWdodCAtIGZXaWR0aCAqIGZBdXRvRm9udFNjYWxlLHJjQkJveC5ib3R0b20scmNCQm94LnJpZ2h0LHJjQkJveC50b3ApOwotCQkJCQlyY0ljb24gPSBDUERGX1JlY3QocmNCQm94LmxlZnQscmNCQm94LmJvdHRvbSxyY0xhYmVsLmxlZnQscmNCQm94LnRvcCk7CisgICAgICAgIGlmIChwSWNvblN0cmVhbSkgeworICAgICAgICAgIGlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKSB7CisgICAgICAgICAgICBmV2lkdGggPSByY0JCb3gucmlnaHQgLSByY0JCb3gubGVmdDsKKyAgICAgICAgICAgIHJjTGFiZWwgPSBDUERGX1JlY3QocmNCQm94LnJpZ2h0IC0gZldpZHRoICogZkF1dG9Gb250U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC5ib3R0b20sIHJjQkJveC5yaWdodCwgcmNCQm94LnRvcCk7CisgICAgICAgICAgICByY0ljb24gPQorICAgICAgICAgICAgICAgIENQREZfUmVjdChyY0JCb3gubGVmdCwgcmNCQm94LmJvdHRvbSwgcmNMYWJlbC5sZWZ0LCByY0JCb3gudG9wKTsKIAotCQkJCQlpZiAocmNMYWJlbENvbnRlbnQuV2lkdGgoKSA8IGZXaWR0aCAqIGZBdXRvRm9udFNjYWxlKQotCQkJCQl7CQkJCQkJCQotCQkJCQl9Ci0JCQkJCWVsc2UgCi0JCQkJCXsKLQkJCQkJCWlmIChyY0xhYmVsQ29udGVudC5XaWR0aCgpIDwgZldpZHRoKQotCQkJCQkJewotCQkJCQkJCXJjTGFiZWwgPSBDUERGX1JlY3QocmNCQm94LnJpZ2h0IC0gcmNMYWJlbENvbnRlbnQuV2lkdGgoKSxyY0JCb3guYm90dG9tLHJjQkJveC5yaWdodCxyY0JCb3gudG9wKTsKLQkJCQkJCQlyY0ljb24gPSBDUERGX1JlY3QocmNCQm94LmxlZnQscmNCQm94LmJvdHRvbSxyY0xhYmVsLmxlZnQscmNCQm94LnRvcCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJcmNMYWJlbCA9IHJjQkJveDsKLQkJCQkJCQlyY0ljb24gPSBDUERGX1JlY3QoMCwwLDAsMCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJZldpZHRoID0gcmNMYWJlbENvbnRlbnQuV2lkdGgoKTsKKyAgICAgICAgICAgIGlmIChyY0xhYmVsQ29udGVudC5XaWR0aCgpIDwgZldpZHRoICogZkF1dG9Gb250U2NhbGUpIHsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGlmIChyY0xhYmVsQ29udGVudC5XaWR0aCgpIDwgZldpZHRoKSB7CisgICAgICAgICAgICAgICAgcmNMYWJlbCA9IENQREZfUmVjdChyY0JCb3gucmlnaHQgLSByY0xhYmVsQ29udGVudC5XaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LmJvdHRvbSwgcmNCQm94LnJpZ2h0LCByY0JCb3gudG9wKTsKKyAgICAgICAgICAgICAgICByY0ljb24gPSBDUERGX1JlY3QocmNCQm94LmxlZnQsIHJjQkJveC5ib3R0b20sIHJjTGFiZWwubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LnRvcCk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmNMYWJlbCA9IHJjQkJveDsKKyAgICAgICAgICAgICAgICByY0ljb24gPSBDUERGX1JlY3QoMCwgMCwgMCwgMCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZldpZHRoID0gcmNMYWJlbENvbnRlbnQuV2lkdGgoKTsKIAotCQkJCQlpZiAocmNCQm94LmxlZnQgKyBmV2lkdGggPiByY0JCb3gucmlnaHQpCi0JCQkJCXsKLQkJCQkJCXJjTGFiZWwgPSByY0JCb3g7Ci0JCQkJCQlyY0ljb24gPSBDUERGX1JlY3QoMCwwLDAsMCk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlyY0xhYmVsID0gQ1BERl9SZWN0KHJjQkJveC5yaWdodCAtIGZXaWR0aCxyY0JCb3guYm90dG9tLHJjQkJveC5yaWdodCxyY0JCb3gudG9wKTsKLQkJCQkJCXJjSWNvbiA9IENQREZfUmVjdChyY0JCb3gubGVmdCxyY0JCb3guYm90dG9tLHJjTGFiZWwubGVmdCxyY0JCb3gudG9wKTsJCQkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlyY0xhYmVsID0gcmNCQm94OwotCQkJCXJjSWNvbiA9IENQREZfUmVjdCgwLDAsMCwwKTsKLQkJCX0KKyAgICAgICAgICAgIGlmIChyY0JCb3gubGVmdCArIGZXaWR0aCA+IHJjQkJveC5yaWdodCkgeworICAgICAgICAgICAgICByY0xhYmVsID0gcmNCQm94OworICAgICAgICAgICAgICByY0ljb24gPSBDUERGX1JlY3QoMCwgMCwgMCwgMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICByY0xhYmVsID0gQ1BERl9SZWN0KHJjQkJveC5yaWdodCAtIGZXaWR0aCwgcmNCQm94LmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0JCb3gucmlnaHQsIHJjQkJveC50b3ApOworICAgICAgICAgICAgICByY0ljb24gPSBDUERGX1JlY3QocmNCQm94LmxlZnQsIHJjQkJveC5ib3R0b20sIHJjTGFiZWwubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC50b3ApOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByY0xhYmVsID0gcmNCQm94OworICAgICAgICAgIHJjSWNvbiA9IENQREZfUmVjdCgwLCAwLCAwLCAwKTsKKyAgICAgICAgfQogCi0JCQlicmVhazsKLQkJY2FzZSBQUEJMX0xBQkVMTEVGVElDT05SSUdIVDoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBQQkxfTEFCRUxMRUZUSUNPTlJJR0hUOgogCi0JCQlpZiAocEljb25TdHJlYW0pCi0JCQl7Ci0JCQkJaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpCi0JCQkJewotCQkJCQlmV2lkdGggPSByY0JCb3gucmlnaHQgLSByY0JCb3gubGVmdDsKLQkJCQkJcmNMYWJlbCA9IENQREZfUmVjdChyY0JCb3gubGVmdCxyY0JCb3guYm90dG9tLHJjQkJveC5sZWZ0ICsgZldpZHRoICogZkF1dG9Gb250U2NhbGUscmNCQm94LnRvcCk7Ci0JCQkJCXJjSWNvbiA9IENQREZfUmVjdChyY0xhYmVsLnJpZ2h0LHJjQkJveC5ib3R0b20scmNCQm94LnJpZ2h0LHJjQkJveC50b3ApOworICAgICAgICBpZiAocEljb25TdHJlYW0pIHsKKyAgICAgICAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkgeworICAgICAgICAgICAgZldpZHRoID0gcmNCQm94LnJpZ2h0IC0gcmNCQm94LmxlZnQ7CisgICAgICAgICAgICByY0xhYmVsID0KKyAgICAgICAgICAgICAgICBDUERGX1JlY3QocmNCQm94LmxlZnQsIHJjQkJveC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC5sZWZ0ICsgZldpZHRoICogZkF1dG9Gb250U2NhbGUsIHJjQkJveC50b3ApOworICAgICAgICAgICAgcmNJY29uID0gQ1BERl9SZWN0KHJjTGFiZWwucmlnaHQsIHJjQkJveC5ib3R0b20sIHJjQkJveC5yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0JCb3gudG9wKTsKIAotCQkJCQlpZiAocmNMYWJlbENvbnRlbnQuV2lkdGgoKSA8IGZXaWR0aCAqIGZBdXRvRm9udFNjYWxlKQotCQkJCQl7CQkJCQkJCQotCQkJCQl9Ci0JCQkJCWVsc2UgCi0JCQkJCXsKLQkJCQkJCWlmIChyY0xhYmVsQ29udGVudC5XaWR0aCgpIDwgZldpZHRoKQotCQkJCQkJewotCQkJCQkJCXJjTGFiZWwgPSBDUERGX1JlY3QocmNCQm94LmxlZnQscmNCQm94LmJvdHRvbSxyY0JCb3gubGVmdCArIHJjTGFiZWxDb250ZW50LldpZHRoKCkscmNCQm94LnRvcCk7Ci0JCQkJCQkJcmNJY29uID0gQ1BERl9SZWN0KHJjTGFiZWwucmlnaHQscmNCQm94LmJvdHRvbSxyY0JCb3gucmlnaHQscmNCQm94LnRvcCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJcmNMYWJlbCA9IHJjQkJveDsKLQkJCQkJCQlyY0ljb24gPSBDUERGX1JlY3QoMCwwLDAsMCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJZldpZHRoID0gcmNMYWJlbENvbnRlbnQuV2lkdGgoKTsKKyAgICAgICAgICAgIGlmIChyY0xhYmVsQ29udGVudC5XaWR0aCgpIDwgZldpZHRoICogZkF1dG9Gb250U2NhbGUpIHsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGlmIChyY0xhYmVsQ29udGVudC5XaWR0aCgpIDwgZldpZHRoKSB7CisgICAgICAgICAgICAgICAgcmNMYWJlbCA9CisgICAgICAgICAgICAgICAgICAgIENQREZfUmVjdChyY0JCb3gubGVmdCwgcmNCQm94LmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC5sZWZ0ICsgcmNMYWJlbENvbnRlbnQuV2lkdGgoKSwgcmNCQm94LnRvcCk7CisgICAgICAgICAgICAgICAgcmNJY29uID0gQ1BERl9SZWN0KHJjTGFiZWwucmlnaHQsIHJjQkJveC5ib3R0b20sIHJjQkJveC5yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LnRvcCk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmNMYWJlbCA9IHJjQkJveDsKKyAgICAgICAgICAgICAgICByY0ljb24gPSBDUERGX1JlY3QoMCwgMCwgMCwgMCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZldpZHRoID0gcmNMYWJlbENvbnRlbnQuV2lkdGgoKTsKIAotCQkJCQlpZiAocmNCQm94LmxlZnQgKyBmV2lkdGggPiByY0JCb3gucmlnaHQpCi0JCQkJCXsKLQkJCQkJCXJjTGFiZWwgPSByY0JCb3g7Ci0JCQkJCQlyY0ljb24gPSBDUERGX1JlY3QoMCwwLDAsMCk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlyY0xhYmVsID0gQ1BERl9SZWN0KHJjQkJveC5sZWZ0LHJjQkJveC5ib3R0b20scmNCQm94LmxlZnQgKyBmV2lkdGgscmNCQm94LnRvcCk7Ci0JCQkJCQlyY0ljb24gPSBDUERGX1JlY3QocmNMYWJlbC5yaWdodCxyY0JCb3guYm90dG9tLHJjQkJveC5yaWdodCxyY0JCb3gudG9wKTsJCQotCQkJCQl9CQotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlyY0xhYmVsID0gcmNCQm94OwotCQkJCXJjSWNvbiA9IENQREZfUmVjdCgwLDAsMCwwKTsKLQkJCX0KKyAgICAgICAgICAgIGlmIChyY0JCb3gubGVmdCArIGZXaWR0aCA+IHJjQkJveC5yaWdodCkgeworICAgICAgICAgICAgICByY0xhYmVsID0gcmNCQm94OworICAgICAgICAgICAgICByY0ljb24gPSBDUERGX1JlY3QoMCwgMCwgMCwgMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICByY0xhYmVsID0gQ1BERl9SZWN0KHJjQkJveC5sZWZ0LCByY0JCb3guYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC5sZWZ0ICsgZldpZHRoLCByY0JCb3gudG9wKTsKKyAgICAgICAgICAgICAgcmNJY29uID0gQ1BERl9SZWN0KHJjTGFiZWwucmlnaHQsIHJjQkJveC5ib3R0b20sIHJjQkJveC5yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC50b3ApOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByY0xhYmVsID0gcmNCQm94OworICAgICAgICAgIHJjSWNvbiA9IENQREZfUmVjdCgwLCAwLCAwLCAwKTsKKyAgICAgICAgfQogCi0JCQlicmVhazsKLQkJY2FzZSBQUEJMX0xBQkVMT1ZFUklDT046Ci0JCQlyY0xhYmVsID0gcmNCQm94OwotCQkJcmNJY29uID0gcmNCQm94OwotCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBQQkxfTEFCRUxPVkVSSUNPTjoKKyAgICAgICAgcmNMYWJlbCA9IHJjQkJveDsKKyAgICAgICAgcmNJY29uID0gcmNCQm94OworICAgICAgICBicmVhazsKKyAgICB9CiAKLQkJQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW0sc1RlbXA7CisgICAgQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW0sIHNUZW1wOwogCi0JCWlmICghcmNJY29uLklzRW1wdHkoKSkKLQkJewotCQkJSWNvbi5Nb3ZlKHJjSWNvbiwgRkFMU0UsIEZBTFNFKTsKLQkJCXNUZW1wIDw8IEljb24uR2V0SW1hZ2VBcHBTdHJlYW0oKTsKLQkJfQorICAgIGlmICghcmNJY29uLklzRW1wdHkoKSkgeworICAgICAgSWNvbi5Nb3ZlKHJjSWNvbiwgRkFMU0UsIEZBTFNFKTsKKyAgICAgIHNUZW1wIDw8IEljb24uR2V0SW1hZ2VBcHBTdHJlYW0oKTsKKyAgICB9CiAKLQkJSWNvbi5EZXN0cm95KCk7CisgICAgSWNvbi5EZXN0cm95KCk7CiAKLQkJaWYgKCFyY0xhYmVsLklzRW1wdHkoKSkKLQkJewotCQkJcEVkaXQtPlNldFBsYXRlUmVjdChyY0xhYmVsKTsKLQkJCUNGWF9CeXRlU3RyaW5nIHNFZGl0ID0gQ1BXTF9VdGlsczo6R2V0RWRpdEFwcFN0cmVhbShwRWRpdCxDUERGX1BvaW50KDAuMGYsMC4wZikpOwotCQkJaWYgKHNFZGl0LkdldExlbmd0aCgpID4gMCkKLQkJCXsKLQkJCQlzVGVtcCA8PCAiQlRcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0KSA8PCBzRWRpdCA8PCAiRVRcbiI7Ci0JCQl9Ci0JCX0KKyAgICBpZiAoIXJjTGFiZWwuSXNFbXB0eSgpKSB7CisgICAgICBwRWRpdC0+U2V0UGxhdGVSZWN0KHJjTGFiZWwpOworICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0VkaXQgPQorICAgICAgICAgIENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0ocEVkaXQsIENQREZfUG9pbnQoMC4wZiwgMC4wZikpOworICAgICAgaWYgKHNFZGl0LkdldExlbmd0aCgpID4gMCkgeworICAgICAgICBzVGVtcCA8PCAiQlRcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0KSA8PCBzRWRpdAorICAgICAgICAgICAgICA8PCAiRVRcbiI7CisgICAgICB9CisgICAgfQogCi0JCUlGWF9FZGl0OjpEZWxFZGl0KHBFZGl0KTsKKyAgICBJRlhfRWRpdDo6RGVsRWRpdChwRWRpdCk7CiAKLQkJaWYgKHNUZW1wLkdldFNpemUoKSA+IDApCi0JCXsKLQkJCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgcmNCQm94LmxlZnQgPDwgIiAiIDw8IHJjQkJveC5ib3R0b20gPDwgIiAiCi0JCQkJPDwgcmNCQm94LnJpZ2h0IC0gcmNCQm94LmxlZnQgPDwgIiAiIDw8IHJjQkJveC50b3AgLSByY0JCb3guYm90dG9tIDw8ICIgcmUgVyBuXG4iOwotCQkJc0FwcFN0cmVhbSA8PCBzVGVtcCA8PCAiUVxuIjsKLQkJfQorICAgIGlmIChzVGVtcC5HZXRTaXplKCkgPiAwKSB7CisgICAgICBzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IHJjQkJveC5sZWZ0IDw8ICIgIiA8PCByY0JCb3guYm90dG9tIDw8ICIgIgorICAgICAgICAgICAgICAgICA8PCByY0JCb3gucmlnaHQgLSByY0JCb3gubGVmdCA8PCAiICIKKyAgICAgICAgICAgICAgICAgPDwgcmNCQm94LnRvcCAtIHJjQkJveC5ib3R0b20gPDwgIiByZSBXIG5cbiI7CisgICAgICBzQXBwU3RyZWFtIDw8IHNUZW1wIDw8ICJRXG4iOworICAgIH0KIAotCQlyZXR1cm4gc0FwcFN0cmVhbS5HZXRCeXRlU3RyaW5nKCk7Ci0JfQorICAgIHJldHVybiBzQXBwU3RyZWFtLkdldEJ5dGVTdHJpbmcoKTsKKyAgfQogCi0JcmV0dXJuICIiOworICByZXR1cm4gIiI7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbnN0IENQV0xfQ29sb3IgJiBjb2xvcixjb25zdCBGWF9CT09MICYgYkZpbGxPclN0cm9rZSkKLXsKLQlDRlhfQnl0ZVRleHRCdWYgc0NvbG9yU3RyZWFtOworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29uc3QgQ1BXTF9Db2xvciYgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9CT09MJiBiRmlsbE9yU3Ryb2tlKSB7CisgIENGWF9CeXRlVGV4dEJ1ZiBzQ29sb3JTdHJlYW07CiAKLQlzd2l0Y2ggKGNvbG9yLm5Db2xvclR5cGUpCi0JewkJCi0JY2FzZSBDT0xPUlRZUEVfUkdCOgotCQlzQ29sb3JTdHJlYW0gPDwgY29sb3IuZkNvbG9yMSA8PCAiICIgPDwgY29sb3IuZkNvbG9yMiA8PCAiICIgPDwgY29sb3IuZkNvbG9yMyA8PCAiICIgCi0JCQk8PCAoYkZpbGxPclN0cm9rZSA/ICJyZyIgOiAiUkciKSA8PCAiXG4iOwotCQlicmVhazsKLQljYXNlIENPTE9SVFlQRV9HUkFZOgotCQlzQ29sb3JTdHJlYW0gPDwgY29sb3IuZkNvbG9yMSA8PCAiICIgPDwgKGJGaWxsT3JTdHJva2UgPyAiZyIgOiAiRyIpIDw8ICJcbiI7Ci0JCWJyZWFrOwotCWNhc2UgQ09MT1JUWVBFX0NNWUs6Ci0JCXNDb2xvclN0cmVhbSA8PCBjb2xvci5mQ29sb3IxIDw8ICIgIiA8PCBjb2xvci5mQ29sb3IyIDw8ICIgIiA8PCBjb2xvci5mQ29sb3IzIDw8ICIgIiA8PCBjb2xvci5mQ29sb3I0IDw8ICIgIiAKLQkJCTw8IChiRmlsbE9yU3Ryb2tlID8gImsiIDogIksiKSA8PCAiXG4iOwotCQlicmVhazsKLQl9CisgIHN3aXRjaCAoY29sb3IubkNvbG9yVHlwZSkgeworICAgIGNhc2UgQ09MT1JUWVBFX1JHQjoKKyAgICAgIHNDb2xvclN0cmVhbSA8PCBjb2xvci5mQ29sb3IxIDw8ICIgIiA8PCBjb2xvci5mQ29sb3IyIDw8ICIgIgorICAgICAgICAgICAgICAgICAgIDw8IGNvbG9yLmZDb2xvcjMgPDwgIiAiIDw8IChiRmlsbE9yU3Ryb2tlID8gInJnIiA6ICJSRyIpCisgICAgICAgICAgICAgICAgICAgPDwgIlxuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ09MT1JUWVBFX0dSQVk6CisgICAgICBzQ29sb3JTdHJlYW0gPDwgY29sb3IuZkNvbG9yMSA8PCAiICIgPDwgKGJGaWxsT3JTdHJva2UgPyAiZyIgOiAiRyIpCisgICAgICAgICAgICAgICAgICAgPDwgIlxuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ09MT1JUWVBFX0NNWUs6CisgICAgICBzQ29sb3JTdHJlYW0gPDwgY29sb3IuZkNvbG9yMSA8PCAiICIgPDwgY29sb3IuZkNvbG9yMiA8PCAiICIKKyAgICAgICAgICAgICAgICAgICA8PCBjb2xvci5mQ29sb3IzIDw8ICIgIiA8PCBjb2xvci5mQ29sb3I0IDw8ICIgIgorICAgICAgICAgICAgICAgICAgIDw8IChiRmlsbE9yU3Ryb2tlID8gImsiIDogIksiKSA8PCAiXG4iOworICAgICAgYnJlYWs7CisgIH0KIAotCXJldHVybiBzQ29sb3JTdHJlYW0uR2V0Qnl0ZVN0cmluZygpOworICByZXR1cm4gc0NvbG9yU3RyZWFtLkdldEJ5dGVTdHJpbmcoKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0Qm9yZGVyQXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCAmIHJlY3QsIEZYX0ZMT0FUIGZXaWR0aCwKLQkJCQkJCQkJCQkJCWNvbnN0IENQV0xfQ29sb3IgJiBjb2xvciwgY29uc3QgQ1BXTF9Db2xvciAmIGNyTGVmdFRvcCwgY29uc3QgQ1BXTF9Db2xvciAmIGNyUmlnaHRCb3R0b20sCi0JCQkJCQkJCQkJCQlGWF9JTlQzMiBuU3R5bGUsIGNvbnN0IENQV0xfRGFzaCAmIGRhc2gpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07Ci0JQ0ZYX0J5dGVTdHJpbmcgc0NvbG9yOworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0Qm9yZGVyQXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JMZWZ0VG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyUmlnaHRCb3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9EYXNoJiBkYXNoKSB7CisgIENGWF9CeXRlVGV4dEJ1ZiBzQXBwU3RyZWFtOworICBDRlhfQnl0ZVN0cmluZyBzQ29sb3I7CiAKLQlGWF9GTE9BVCBmTGVmdCA9IHJlY3QubGVmdDsKLQlGWF9GTE9BVCBmUmlnaHQgPSByZWN0LnJpZ2h0OwotCUZYX0ZMT0FUIGZUb3AgPSByZWN0LnRvcDsKLQlGWF9GTE9BVCBmQm90dG9tID0gcmVjdC5ib3R0b207CisgIEZYX0ZMT0FUIGZMZWZ0ID0gcmVjdC5sZWZ0OworICBGWF9GTE9BVCBmUmlnaHQgPSByZWN0LnJpZ2h0OworICBGWF9GTE9BVCBmVG9wID0gcmVjdC50b3A7CisgIEZYX0ZMT0FUIGZCb3R0b20gPSByZWN0LmJvdHRvbTsKIAotCWlmIChmV2lkdGggPiAwLjBmKQotCXsKLQkJRlhfRkxPQVQgZkhhbGZXaWR0aCA9IGZXaWR0aCAvIDIuMGY7CisgIGlmIChmV2lkdGggPiAwLjBmKSB7CisgICAgRlhfRkxPQVQgZkhhbGZXaWR0aCA9IGZXaWR0aCAvIDIuMGY7CiAKLQkJc0FwcFN0cmVhbSA8PCAicVxuIjsKKyAgICBzQXBwU3RyZWFtIDw8ICJxXG4iOwogCi0JCXN3aXRjaCAoblN0eWxlKQotCQl7Ci0JCWRlZmF1bHQ6Ci0JCWNhc2UgUEJTX1NPTElEOgotCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsVFJVRSk7Ci0JCQlpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkKLQkJCXsKLQkJCQlzQXBwU3RyZWFtIDw8IHNDb2xvcjsKLQkJCQlzQXBwU3RyZWFtIDw8IGZMZWZ0IDw8ICIgIiA8PCBmQm90dG9tIDw8ICIgIiA8PCBmUmlnaHQgLSBmTGVmdCA8PCAiICIgPDwgZlRvcCAtIGZCb3R0b20gPDwgIiByZVxuIjsKLQkJCQlzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZldpZHRoIDw8ICIgIiA8PCBmQm90dG9tICsgZldpZHRoIDw8ICIgIiAKLQkJCQkJPDwgZlJpZ2h0IC0gZkxlZnQgLSBmV2lkdGggKiAyIDw8ICIgIiA8PCBmVG9wIC0gZkJvdHRvbSAtIGZXaWR0aCAqIDIgPDwgIiByZVxuIjsKLQkJCQlzQXBwU3RyZWFtIDw8ICJmKlxuIjsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFBCU19EQVNIOgotCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsRkFMU0UpOwotCQkJaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApCi0JCQl7Ci0JCQkJc0FwcFN0cmVhbSA8PCBzQ29sb3I7Ci0JCQkJc0FwcFN0cmVhbSA8PCBmV2lkdGggPDwgIiB3IiA8PCAiIFsiIDw8IGRhc2gubkRhc2ggPDwgIiAiIDw8IGRhc2gubkdhcCA8PCAiXSAiIDw8IGRhc2gublBoYXNlIDw8ICIgZFxuIjsKLQkJCQlzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZldpZHRoIC8gMiA8PCAiICIgPDwgZkJvdHRvbSArIGZXaWR0aCAvIDIgPDwgIiBtXG4iOwotCQkJCXNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmV2lkdGggLyAyIDw8ICIgIiA8PCBmVG9wIC0gZldpZHRoIC8gMiA8PCAiIGxcbiI7Ci0JCQkJc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmV2lkdGggLyAyIDw8ICIgIiA8PCBmVG9wIC0gZldpZHRoIC8gMiA8PCAiIGxcbiI7Ci0JCQkJc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmV2lkdGggLyAyIDw8ICIgIiA8PCBmQm90dG9tICsgZldpZHRoIC8gMiA8PCAiIGxcbiI7Ci0JCQkJc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZXaWR0aCAvIDIgPDwgIiAiIDw8IGZCb3R0b20gKyBmV2lkdGggLyAyIDw8ICIgbCBTXG4iOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUEJTX0JFVkVMRUQ6Ci0JCWNhc2UgUEJTX0lOU0VUOgotCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JMZWZ0VG9wLFRSVUUpOwotCQkJaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApCi0JCQl7Ci0JCQkJc0FwcFN0cmVhbSA8PCBzQ29sb3I7Ci0JCQkJc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZIYWxmV2lkdGggPDwgIiAiIDw8IGZCb3R0b20gKyBmSGFsZldpZHRoIDw8ICIgbVxuIjsKLQkJCQlzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZkhhbGZXaWR0aCA8PCAiICIgPDwgZlRvcCAtIGZIYWxmV2lkdGggPDwgIiBsXG4iOwotCQkJCXNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCA8PCAiICIgPDwgZlRvcCAtIGZIYWxmV2lkdGggPDwgIiBsXG4iOwotCQkJCXNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCAqIDIgPDwgIiAiIDw8IGZUb3AgLSBmSGFsZldpZHRoICogMiA8PCAiIGxcbiI7Ci0JCQkJc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZIYWxmV2lkdGggKiAyIDw8ICIgIiA8PCBmVG9wIC0gZkhhbGZXaWR0aCAqIDIgPDwgIiBsXG4iOwotCQkJCXNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoICogMiA8PCAiICIgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGggKiAyIDw8ICIgbCBmXG4iOwotCQkJfQorICAgIHN3aXRjaCAoblN0eWxlKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgY2FzZSBQQlNfU09MSUQ6CisgICAgICAgIHNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLCBUUlVFKTsKKyAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IHNDb2xvcjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0IDw8ICIgIiA8PCBmQm90dG9tIDw8ICIgIiA8PCBmUmlnaHQgLSBmTGVmdCA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGZUb3AgLSBmQm90dG9tIDw8ICIgcmVcbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZXaWR0aCA8PCAiICIgPDwgZkJvdHRvbSArIGZXaWR0aCA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGZSaWdodCAtIGZMZWZ0IC0gZldpZHRoICogMiA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGZUb3AgLSBmQm90dG9tIC0gZldpZHRoICogMiA8PCAiIHJlXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgImYqXG4iOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQQlNfREFTSDoKKyAgICAgICAgc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsIEZBTFNFKTsKKyAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IHNDb2xvcjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZXaWR0aCA8PCAiIHciCisgICAgICAgICAgICAgICAgICAgICA8PCAiIFsiIDw8IGRhc2gubkRhc2ggPDwgIiAiIDw8IGRhc2gubkdhcCA8PCAiXSAiCisgICAgICAgICAgICAgICAgICAgICA8PCBkYXNoLm5QaGFzZSA8PCAiIGRcbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZXaWR0aCAvIDIgPDwgIiAiIDw8IGZCb3R0b20gKyBmV2lkdGggLyAyCisgICAgICAgICAgICAgICAgICAgICA8PCAiIG1cbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZXaWR0aCAvIDIgPDwgIiAiIDw8IGZUb3AgLSBmV2lkdGggLyAyCisgICAgICAgICAgICAgICAgICAgICA8PCAiIGxcbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmV2lkdGggLyAyIDw8ICIgIiA8PCBmVG9wIC0gZldpZHRoIC8gMgorICAgICAgICAgICAgICAgICAgICAgPDwgIiBsXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZldpZHRoIC8gMiA8PCAiICIgPDwgZkJvdHRvbSArIGZXaWR0aCAvIDIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgbFxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZldpZHRoIC8gMiA8PCAiICIgPDwgZkJvdHRvbSArIGZXaWR0aCAvIDIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgbCBTXG4iOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQQlNfQkVWRUxFRDoKKyAgICAgIGNhc2UgUEJTX0lOU0VUOgorICAgICAgICBzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjckxlZnRUb3AsIFRSVUUpOworICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoIDw8ICIgIiA8PCBmQm90dG9tICsgZkhhbGZXaWR0aAorICAgICAgICAgICAgICAgICAgICAgPDwgIiBtXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoIDw8ICIgIiA8PCBmVG9wIC0gZkhhbGZXaWR0aAorICAgICAgICAgICAgICAgICAgICAgPDwgIiBsXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCA8PCAiICIgPDwgZlRvcCAtIGZIYWxmV2lkdGgKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgbFxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZIYWxmV2lkdGggKiAyIDw8ICIgIiA8PCBmVG9wIC0gZkhhbGZXaWR0aCAqIDIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgbFxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZkhhbGZXaWR0aCAqIDIgPDwgIiAiIDw8IGZUb3AgLSBmSGFsZldpZHRoICogMgorICAgICAgICAgICAgICAgICAgICAgPDwgIiBsXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoICogMiA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGZCb3R0b20gKyBmSGFsZldpZHRoICogMiA8PCAiIGwgZlxuIjsKKyAgICAgICAgfQogCi0JCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclJpZ2h0Qm90dG9tLFRSVUUpOwotCQkJaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApCi0JCQl7Ci0JCQkJc0FwcFN0cmVhbSA8PCBzQ29sb3I7Ci0JCQkJc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmSGFsZldpZHRoIDw8ICIgIiA8PAlmVG9wIC0gZkhhbGZXaWR0aCA8PCAiIG1cbiI7Ci0JCQkJc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmSGFsZldpZHRoIDw8ICIgIiA8PAlmQm90dG9tICsgZkhhbGZXaWR0aCA8PCAiIGxcbiI7Ci0JCQkJc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZIYWxmV2lkdGggPDwgIiAiIDw8IAlmQm90dG9tICsgZkhhbGZXaWR0aCA8PCAiIGxcbiI7Ci0JCQkJc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZIYWxmV2lkdGggKiAyIDw8ICIgIiA8PCBmQm90dG9tICsgZkhhbGZXaWR0aCAqIDIgPDwgIiBsXG4iOwotCQkJCXNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCAqIDIgPDwgIiAiIDw8IGZCb3R0b20gKyBmSGFsZldpZHRoICogMiA8PCAiIGxcbiI7Ci0JCQkJc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmSGFsZldpZHRoICogMiA8PCAiICIgPDwgZlRvcCAtIGZIYWxmV2lkdGggKiAyIDw8ICIgbCBmXG4iOwotCQkJfQorICAgICAgICBzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclJpZ2h0Qm90dG9tLCBUUlVFKTsKKyAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IHNDb2xvcjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZIYWxmV2lkdGggPDwgIiAiIDw8IGZUb3AgLSBmSGFsZldpZHRoCisgICAgICAgICAgICAgICAgICAgICA8PCAiIG1cbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmSGFsZldpZHRoIDw8ICIgIiA8PCBmQm90dG9tICsgZkhhbGZXaWR0aAorICAgICAgICAgICAgICAgICAgICAgPDwgIiBsXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoIDw8ICIgIiA8PCBmQm90dG9tICsgZkhhbGZXaWR0aAorICAgICAgICAgICAgICAgICAgICAgPDwgIiBsXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoICogMiA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGZCb3R0b20gKyBmSGFsZldpZHRoICogMiA8PCAiIGxcbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmSGFsZldpZHRoICogMiA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGZCb3R0b20gKyBmSGFsZldpZHRoICogMiA8PCAiIGxcbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmSGFsZldpZHRoICogMiA8PCAiICIgPDwgZlRvcCAtIGZIYWxmV2lkdGggKiAyCisgICAgICAgICAgICAgICAgICAgICA8PCAiIGwgZlxuIjsKKyAgICAgICAgfQorCisgICAgICAgIHNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLCBUUlVFKTsKKyAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IHNDb2xvcjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0IDw8ICIgIiA8PCBmQm90dG9tIDw8ICIgIiA8PCBmUmlnaHQgLSBmTGVmdCA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGZUb3AgLSBmQm90dG9tIDw8ICIgcmVcbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZIYWxmV2lkdGggPDwgIiAiIDw8IGZCb3R0b20gKyBmSGFsZldpZHRoIDw8ICIgIgorICAgICAgICAgICAgICAgICAgICAgPDwgZlJpZ2h0IC0gZkxlZnQgLSBmSGFsZldpZHRoICogMiA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGZUb3AgLSBmQm90dG9tIC0gZkhhbGZXaWR0aCAqIDIgPDwgIiByZSBmKlxuIjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUEJTX1VOREVSTElORUQ6CisgICAgICAgIHNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLCBGQUxTRSk7CisgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQ29sb3I7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmV2lkdGggPDwgIiB3XG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgPDwgIiAiIDw8IGZCb3R0b20gKyBmV2lkdGggLyAyIDw8ICIgbVxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCA8PCAiICIgPDwgZkJvdHRvbSArIGZXaWR0aCAvIDIgPDwgIiBsIFNcbiI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQogCi0JCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb2xvcixUUlVFKTsKLQkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQotCQkJewotCQkJCXNBcHBTdHJlYW0gPDwgc0NvbG9yOwotCQkJCXNBcHBTdHJlYW0gPDwgZkxlZnQgPDwgIiAiIDw8IGZCb3R0b20gPDwgIiAiIDw8CWZSaWdodCAtIGZMZWZ0IDw8ICIgIiA8PCBmVG9wIC0gZkJvdHRvbSA8PCAiIHJlXG4iOwotCQkJCXNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoIDw8ICIgIiA8PCBmQm90dG9tICsgZkhhbGZXaWR0aCA8PCAiICIgCi0JCQkJCTw8IGZSaWdodCAtIGZMZWZ0IC0gZkhhbGZXaWR0aCAqIDIgPDwgIiAiIDw8IGZUb3AgLSBmQm90dG9tIC0gZkhhbGZXaWR0aCAqIDIgPDwgIiByZSBmKlxuIjsJCQkJCQkKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFBCU19VTkRFUkxJTkVEOgotCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsRkFMU0UpOwotCQkJaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApCi0JCQl7Ci0JCQkJc0FwcFN0cmVhbSA8PCBzQ29sb3I7Ci0JCQkJc0FwcFN0cmVhbSA8PCBmV2lkdGggPDwgIiB3XG4iOwotCQkJCXNBcHBTdHJlYW0gPDwgZkxlZnQgPDwgIiAiIDw8IGZCb3R0b20gKyBmV2lkdGggLyAyIDw8ICIgbVxuIjsKLQkJCQlzQXBwU3RyZWFtIDw8IGZSaWdodCA8PCAiICIgPDwgZkJvdHRvbSArIGZXaWR0aCAvIDIgPDwgIiBsIFNcbiI7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQkKLQkJc0FwcFN0cmVhbSA8PCAiUVxuIjsKLQl9CisgICAgc0FwcFN0cmVhbSA8PCAiUVxuIjsKKyAgfQogCi0JcmV0dXJuIHNBcHBTdHJlYW0uR2V0Qnl0ZVN0cmluZygpOworICByZXR1cm4gc0FwcFN0cmVhbS5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldENpcmNsZUJvcmRlckFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QgJiByZWN0LCBGWF9GTE9BVCBmV2lkdGgsCi0JCQkJCQkJCQkJCQljb25zdCBDUFdMX0NvbG9yICYgY29sb3IsIGNvbnN0IENQV0xfQ29sb3IgJiBjckxlZnRUb3AsIGNvbnN0IENQV0xfQ29sb3IgJiBjclJpZ2h0Qm90dG9tLAotCQkJCQkJCQkJCQkJRlhfSU5UMzIgblN0eWxlLCBjb25zdCBDUFdMX0Rhc2ggJiBkYXNoKQotewotCUNGWF9CeXRlVGV4dEJ1ZiBzQXBwU3RyZWFtOwotCUNGWF9CeXRlU3RyaW5nIHNDb2xvcjsKK0NGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldENpcmNsZUJvcmRlckFwcFN0cmVhbSgKKyAgICBjb25zdCBDUERGX1JlY3QmIHJlY3QsCisgICAgRlhfRkxPQVQgZldpZHRoLAorICAgIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yLAorICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyTGVmdFRvcCwKKyAgICBjb25zdCBDUFdMX0NvbG9yJiBjclJpZ2h0Qm90dG9tLAorICAgIGludDMyX3QgblN0eWxlLAorICAgIGNvbnN0IENQV0xfRGFzaCYgZGFzaCkgeworICBDRlhfQnl0ZVRleHRCdWYgc0FwcFN0cmVhbTsKKyAgQ0ZYX0J5dGVTdHJpbmcgc0NvbG9yOwogCi0JCisgIGlmIChmV2lkdGggPiAwLjBmKSB7CisgICAgc0FwcFN0cmVhbSA8PCAicVxuIjsKIAorICAgIHN3aXRjaCAoblN0eWxlKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgY2FzZSBQQlNfU09MSUQ6CisgICAgICBjYXNlIFBCU19VTkRFUkxJTkVEOiB7CisgICAgICAgIHNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLCBGQUxTRSk7CisgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBmV2lkdGggPDwgIiB3XG4iIDw8IHNDb2xvcgorICAgICAgICAgICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0QVBfQ2lyY2xlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJlY3QsIGZXaWR0aCAvIDIuMGYpKQorICAgICAgICAgICAgICAgICAgICAgPDwgIiBTXG5RXG4iOworICAgICAgICB9CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBQQlNfREFTSDogeworICAgICAgICBzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb2xvciwgRkFMU0UpOworICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgInFcbiIgPDwgZldpZHRoIDw8ICIgd1xuIgorICAgICAgICAgICAgICAgICAgICAgPDwgIlsiIDw8IGRhc2gubkRhc2ggPDwgIiAiIDw8IGRhc2gubkdhcCA8PCAiXSAiCisgICAgICAgICAgICAgICAgICAgICA8PCBkYXNoLm5QaGFzZSA8PCAiIGRcbiIgPDwgc0NvbG9yCisgICAgICAgICAgICAgICAgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRBUF9DaXJjbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmVjdCwgZldpZHRoIC8gMi4wZikpCisgICAgICAgICAgICAgICAgICAgICA8PCAiIFNcblFcbiI7CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIFBCU19CRVZFTEVEOiB7CisgICAgICAgIEZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmV2lkdGggLyAyLjBmOwogCisgICAgICAgIHNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLCBGQUxTRSk7CisgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBmSGFsZldpZHRoIDw8ICIgd1xuIiA8PCBzQ29sb3IKKyAgICAgICAgICAgICAgICAgICAgIDw8IENQV0xfVXRpbHM6OkdldEFQX0NpcmNsZShyZWN0KSA8PCAiIFNcblFcbiI7CisgICAgICAgIH0KIAorICAgICAgICBzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjckxlZnRUb3AsIEZBTFNFKTsKKyAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IGZIYWxmV2lkdGggPDwgIiB3XG4iIDw8IHNDb2xvcgorICAgICAgICAgICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0QVBfSGFsZkNpcmNsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0LCBmSGFsZldpZHRoICogMC43NWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9QSSAvIDQuMGYpCisgICAgICAgICAgICAgICAgICAgICA8PCAiIFNcblFcbiI7CisgICAgICAgIH0KIAotCWlmIChmV2lkdGggPiAwLjBmKQotCXsKLQkJc0FwcFN0cmVhbSA8PCAicVxuIjsKKyAgICAgICAgc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JSaWdodEJvdHRvbSwgRkFMU0UpOworICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgInFcbiIgPDwgZkhhbGZXaWR0aCA8PCAiIHdcbiIgPDwgc0NvbG9yCisgICAgICAgICAgICAgICAgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRBUF9IYWxmQ2lyY2xlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJlY3QsIGZIYWxmV2lkdGggKiAwLjc1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX1BJICogNSAvIDQuMGYpCisgICAgICAgICAgICAgICAgICAgICA8PCAiIFNcblFcbiI7CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIFBCU19JTlNFVDogeworICAgICAgICBGWF9GTE9BVCBmSGFsZldpZHRoID0gZldpZHRoIC8gMi4wZjsKIAotCQlzd2l0Y2ggKG5TdHlsZSkKLQkJewotCQlkZWZhdWx0OgotCQljYXNlIFBCU19TT0xJRDoKLQkJY2FzZSBQQlNfVU5ERVJMSU5FRDoKLQkJCXsKLQkJCQlzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb2xvcixGQUxTRSk7Ci0JCQkJaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApCi0JCQkJewotCQkJCQlzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IGZXaWR0aCA8PCAiIHdcbiIgPDwgc0NvbG9yIAotCQkJCQkJPDwgQ1BXTF9VdGlsczo6R2V0QVBfQ2lyY2xlKENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJlY3QsZldpZHRoIC8gMi4wZikpCi0JCQkJCQk8PCAiIFNcblFcbiI7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUEJTX0RBU0g6Ci0JCQl7Ci0JCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsRkFMU0UpOwotCQkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQotCQkJCXsKLQkJCQkJc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBmV2lkdGggPDwgIiB3XG4iIAotCQkJCQkJPDwgIlsiIDw8IGRhc2gubkRhc2ggPDwgIiAiIDw8IGRhc2gubkdhcCA8PCAiXSAiIDw8IGRhc2gublBoYXNlIDw8ICIgZFxuIiAKLQkJCQkJCTw8IHNDb2xvciA8PCBDUFdMX1V0aWxzOjpHZXRBUF9DaXJjbGUoQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmVjdCxmV2lkdGggLyAyLjBmKSkKLQkJCQkJCTw8ICIgU1xuUVxuIjsKLQkJCQl9CQkJCQkJCi0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBQQlNfQkVWRUxFRDoKLQkJCXsKLQkJCQlGWF9GTE9BVCBmSGFsZldpZHRoID0gZldpZHRoIC8gMi4wZjsKKyAgICAgICAgc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsIEZBTFNFKTsKKyAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IGZIYWxmV2lkdGggPDwgIiB3XG4iIDw8IHNDb2xvcgorICAgICAgICAgICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0QVBfQ2lyY2xlKHJlY3QpIDw8ICIgU1xuUVxuIjsKKyAgICAgICAgfQogCi0JCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsRkFMU0UpOwotCQkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQotCQkJCXsKLQkJCQkJc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBmSGFsZldpZHRoIDw8ICIgd1xuIgotCQkJCQkJPDwgc0NvbG9yIDw8IENQV0xfVXRpbHM6OkdldEFQX0NpcmNsZShyZWN0KQotCQkJCQkJPDwgIiBTXG5RXG4iOwotCQkJCX0JCQkJCQorICAgICAgICBzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjckxlZnRUb3AsIEZBTFNFKTsKKyAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IGZIYWxmV2lkdGggPDwgIiB3XG4iIDw8IHNDb2xvcgorICAgICAgICAgICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0QVBfSGFsZkNpcmNsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0LCBmSGFsZldpZHRoICogMC43NWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9QSSAvIDQuMGYpCisgICAgICAgICAgICAgICAgICAgICA8PCAiIFNcblFcbiI7CisgICAgICAgIH0KIAotCQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyTGVmdFRvcCxGQUxTRSk7Ci0JCQkJaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApCi0JCQkJewotCQkJCQlzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IGZIYWxmV2lkdGggPDwgIiB3XG4iCi0JCQkJCQk8PCBzQ29sb3IgPDwgQ1BXTF9VdGlsczo6R2V0QVBfSGFsZkNpcmNsZShDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0LGZIYWxmV2lkdGggKiAwLjc1ZiksUFdMX1BJLzQuMGYpCi0JCQkJCQk8PCAiIFNcblFcbiI7Ci0JCQkJfQkKKyAgICAgICAgc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JSaWdodEJvdHRvbSwgRkFMU0UpOworICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgInFcbiIgPDwgZkhhbGZXaWR0aCA8PCAiIHdcbiIgPDwgc0NvbG9yCisgICAgICAgICAgICAgICAgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRBUF9IYWxmQ2lyY2xlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJlY3QsIGZIYWxmV2lkdGggKiAwLjc1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX1BJICogNSAvIDQuMGYpCisgICAgICAgICAgICAgICAgICAgICA8PCAiIFNcblFcbiI7CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisgICAgfQogCi0JCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JSaWdodEJvdHRvbSxGQUxTRSk7Ci0JCQkJaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApCi0JCQkJewotCQkJCQlzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IGZIYWxmV2lkdGggPDwgIiB3XG4iCi0JCQkJCQk8PCBzQ29sb3IgPDwgQ1BXTF9VdGlsczo6R2V0QVBfSGFsZkNpcmNsZShDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0LGZIYWxmV2lkdGggKiAwLjc1ZiksUFdMX1BJKjUvNC4wZikKLQkJCQkJCTw8ICIgU1xuUVxuIjsKLQkJCQl9CQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUEJTX0lOU0VUOgotCQkJewotCQkJCUZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmV2lkdGggLyAyLjBmOwotCi0JCQkJc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsRkFMU0UpOwotCQkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQotCQkJCXsKLQkJCQkJc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBmSGFsZldpZHRoIDw8ICIgd1xuIgotCQkJCQkJPDwgc0NvbG9yIDw8IENQV0xfVXRpbHM6OkdldEFQX0NpcmNsZShyZWN0KQotCQkJCQkJPDwgIiBTXG5RXG4iOwotCQkJCX0KLQotCQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyTGVmdFRvcCxGQUxTRSk7Ci0JCQkJaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApCi0JCQkJewotCQkJCQlzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IGZIYWxmV2lkdGggPDwgIiB3XG4iCi0JCQkJCQk8PCBzQ29sb3IgPDwgQ1BXTF9VdGlsczo6R2V0QVBfSGFsZkNpcmNsZShDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0LGZIYWxmV2lkdGggKiAwLjc1ZiksUFdMX1BJLzQuMGYpCi0JCQkJCQk8PCAiIFNcblFcbiI7Ci0JCQkJfQkKLQotCQkJCXNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyUmlnaHRCb3R0b20sRkFMU0UpOwotCQkJCWlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKQotCQkJCXsKLQkJCQkJc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBmSGFsZldpZHRoIDw8ICIgd1xuIgotCQkJCQkJPDwgc0NvbG9yIDw8IENQV0xfVXRpbHM6OkdldEFQX0hhbGZDaXJjbGUoQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmVjdCxmSGFsZldpZHRoICogMC43NWYpLFBXTF9QSSo1LzQuMGYpCi0JCQkJCQk8PCAiIFNcblFcbiI7Ci0JCQkJfQkJCQkJCQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJCi0JCXNBcHBTdHJlYW0gPDwgIlFcbiI7Ci0JfQorICAgIHNBcHBTdHJlYW0gPDwgIlFcbiI7CisgIH0KIAotCXJldHVybiBzQXBwU3RyZWFtLkdldEJ5dGVTdHJpbmcoKTsKKyAgcmV0dXJuIHNBcHBTdHJlYW0uR2V0Qnl0ZVN0cmluZygpOwogfQogCi1DUFdMX0NvbG9yIENQV0xfVXRpbHM6OlN1YnN0cmFjdENvbG9yKGNvbnN0IENQV0xfQ29sb3IgJiBzQ29sb3IsRlhfRkxPQVQgZkNvbG9yU3ViKQotewotCUNQV0xfQ29sb3Igc1JldDsKLQlzUmV0Lm5Db2xvclR5cGUgPSBzQ29sb3IubkNvbG9yVHlwZTsKK0NQV0xfQ29sb3IgQ1BXTF9VdGlsczo6U3Vic3RyYWN0Q29sb3IoY29uc3QgQ1BXTF9Db2xvciYgc0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29sb3JTdWIpIHsKKyAgQ1BXTF9Db2xvciBzUmV0OworICBzUmV0Lm5Db2xvclR5cGUgPSBzQ29sb3IubkNvbG9yVHlwZTsKIAotCXN3aXRjaCAoc0NvbG9yLm5Db2xvclR5cGUpCi0JewotCWNhc2UgQ09MT1JUWVBFX1RSQU5TUEFSRU5UOgotCQlzUmV0Lm5Db2xvclR5cGUgPSBDT0xPUlRZUEVfUkdCOwotCQlzUmV0LmZDb2xvcjEgPSBQV0xfTUFYKDEgLSBmQ29sb3JTdWIsMC4wZik7Ci0JCXNSZXQuZkNvbG9yMiA9IFBXTF9NQVgoMSAtIGZDb2xvclN1YiwwLjBmKTsKLQkJc1JldC5mQ29sb3IzID0gUFdMX01BWCgxIC0gZkNvbG9yU3ViLDAuMGYpOwotCQlicmVhazsKLQljYXNlIENPTE9SVFlQRV9SR0I6Ci0JY2FzZSBDT0xPUlRZUEVfR1JBWToKLQljYXNlIENPTE9SVFlQRV9DTVlLOgotCQlzUmV0LmZDb2xvcjEgPSBQV0xfTUFYKHNDb2xvci5mQ29sb3IxIC0gZkNvbG9yU3ViLDAuMGYpOwotCQlzUmV0LmZDb2xvcjIgPSBQV0xfTUFYKHNDb2xvci5mQ29sb3IyIC0gZkNvbG9yU3ViLDAuMGYpOwotCQlzUmV0LmZDb2xvcjMgPSBQV0xfTUFYKHNDb2xvci5mQ29sb3IzIC0gZkNvbG9yU3ViLDAuMGYpOwotCQlzUmV0LmZDb2xvcjQgPSBQV0xfTUFYKHNDb2xvci5mQ29sb3I0IC0gZkNvbG9yU3ViLDAuMGYpOwotCQlicmVhazsKLQl9CQorICBzd2l0Y2ggKHNDb2xvci5uQ29sb3JUeXBlKSB7CisgICAgY2FzZSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ6CisgICAgICBzUmV0Lm5Db2xvclR5cGUgPSBDT0xPUlRZUEVfUkdCOworICAgICAgc1JldC5mQ29sb3IxID0gUFdMX01BWCgxIC0gZkNvbG9yU3ViLCAwLjBmKTsKKyAgICAgIHNSZXQuZkNvbG9yMiA9IFBXTF9NQVgoMSAtIGZDb2xvclN1YiwgMC4wZik7CisgICAgICBzUmV0LmZDb2xvcjMgPSBQV0xfTUFYKDEgLSBmQ29sb3JTdWIsIDAuMGYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDT0xPUlRZUEVfUkdCOgorICAgIGNhc2UgQ09MT1JUWVBFX0dSQVk6CisgICAgY2FzZSBDT0xPUlRZUEVfQ01ZSzoKKyAgICAgIHNSZXQuZkNvbG9yMSA9IFBXTF9NQVgoc0NvbG9yLmZDb2xvcjEgLSBmQ29sb3JTdWIsIDAuMGYpOworICAgICAgc1JldC5mQ29sb3IyID0gUFdMX01BWChzQ29sb3IuZkNvbG9yMiAtIGZDb2xvclN1YiwgMC4wZik7CisgICAgICBzUmV0LmZDb2xvcjMgPSBQV0xfTUFYKHNDb2xvci5mQ29sb3IzIC0gZkNvbG9yU3ViLCAwLjBmKTsKKyAgICAgIHNSZXQuZkNvbG9yNCA9IFBXTF9NQVgoc0NvbG9yLmZDb2xvcjQgLSBmQ29sb3JTdWIsIDAuMGYpOworICAgICAgYnJlYWs7CisgIH0KIAotCXJldHVybiBzUmV0OworICByZXR1cm4gc1JldDsKIH0KIAotQ1BXTF9Db2xvciBDUFdMX1V0aWxzOjpEZXZpZGVDb2xvcihjb25zdCBDUFdMX0NvbG9yICYgc0NvbG9yLEZYX0ZMT0FUIGZDb2xvckRldmlkZSkKLXsKLQlDUFdMX0NvbG9yIHNSZXQ7Ci0Jc1JldC5uQ29sb3JUeXBlID0gc0NvbG9yLm5Db2xvclR5cGU7CitDUFdMX0NvbG9yIENQV0xfVXRpbHM6OkRldmlkZUNvbG9yKGNvbnN0IENQV0xfQ29sb3ImIHNDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNvbG9yRGV2aWRlKSB7CisgIENQV0xfQ29sb3Igc1JldDsKKyAgc1JldC5uQ29sb3JUeXBlID0gc0NvbG9yLm5Db2xvclR5cGU7CiAKLQlzd2l0Y2ggKHNDb2xvci5uQ29sb3JUeXBlKQotCXsKLQljYXNlIENPTE9SVFlQRV9UUkFOU1BBUkVOVDoKLQkJc1JldC5uQ29sb3JUeXBlID0gQ09MT1JUWVBFX1JHQjsKLQkJc1JldC5mQ29sb3IxID0gMSAvIGZDb2xvckRldmlkZTsKLQkJc1JldC5mQ29sb3IyID0gMSAvIGZDb2xvckRldmlkZTsKLQkJc1JldC5mQ29sb3IzID0gMSAvIGZDb2xvckRldmlkZTsKLQkJYnJlYWs7Ci0JY2FzZSBDT0xPUlRZUEVfUkdCOgotCWNhc2UgQ09MT1JUWVBFX0dSQVk6Ci0JY2FzZSBDT0xPUlRZUEVfQ01ZSzoKLQkJc1JldCA9IHNDb2xvcjsKLQkJc1JldC5mQ29sb3IxIC89IGZDb2xvckRldmlkZTsKLQkJc1JldC5mQ29sb3IyIC89IGZDb2xvckRldmlkZTsKLQkJc1JldC5mQ29sb3IzIC89IGZDb2xvckRldmlkZTsKLQkJc1JldC5mQ29sb3I0IC89IGZDb2xvckRldmlkZTsKLQkJYnJlYWs7Ci0JfQkKKyAgc3dpdGNoIChzQ29sb3IubkNvbG9yVHlwZSkgeworICAgIGNhc2UgQ09MT1JUWVBFX1RSQU5TUEFSRU5UOgorICAgICAgc1JldC5uQ29sb3JUeXBlID0gQ09MT1JUWVBFX1JHQjsKKyAgICAgIHNSZXQuZkNvbG9yMSA9IDEgLyBmQ29sb3JEZXZpZGU7CisgICAgICBzUmV0LmZDb2xvcjIgPSAxIC8gZkNvbG9yRGV2aWRlOworICAgICAgc1JldC5mQ29sb3IzID0gMSAvIGZDb2xvckRldmlkZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ09MT1JUWVBFX1JHQjoKKyAgICBjYXNlIENPTE9SVFlQRV9HUkFZOgorICAgIGNhc2UgQ09MT1JUWVBFX0NNWUs6CisgICAgICBzUmV0ID0gc0NvbG9yOworICAgICAgc1JldC5mQ29sb3IxIC89IGZDb2xvckRldmlkZTsKKyAgICAgIHNSZXQuZkNvbG9yMiAvPSBmQ29sb3JEZXZpZGU7CisgICAgICBzUmV0LmZDb2xvcjMgLz0gZkNvbG9yRGV2aWRlOworICAgICAgc1JldC5mQ29sb3I0IC89IGZDb2xvckRldmlkZTsKKyAgICAgIGJyZWFrOworICB9CiAKLQlyZXR1cm4gc1JldDsKKyAgcmV0dXJuIHNSZXQ7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFwcFN0cmVhbV9DaGVjayhjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsIGNvbnN0IENQV0xfQ29sb3IgJiBjclRleHQpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNBUDsKLQlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LFRSVUUpIDw8IENQV0xfVXRpbHM6OkdldEFQX0NoZWNrKHJjQkJveCkgPDwgImZcblFcbiI7Ci0JcmV0dXJuIHNBUC5HZXRCeXRlU3RyaW5nKCk7CitDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBcHBTdHJlYW1fQ2hlY2soY29uc3QgQ1BERl9SZWN0JiByY0JCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0KSB7CisgIENGWF9CeXRlVGV4dEJ1ZiBzQVA7CisgIHNBUCA8PCAicVxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQsIFRSVUUpCisgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRBUF9DaGVjayhyY0JCb3gpIDw8ICJmXG5RXG4iOworICByZXR1cm4gc0FQLkdldEJ5dGVTdHJpbmcoKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0QXBwU3RyZWFtX0NpcmNsZShjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsIGNvbnN0IENQV0xfQ29sb3IgJiBjclRleHQpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNBUDsKLQlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LFRSVUUpIDw8IENQV0xfVXRpbHM6OkdldEFQX0NpcmNsZShyY0JCb3gpIDw8ICJmXG5RXG4iOwotCXJldHVybiBzQVAuR2V0Qnl0ZVN0cmluZygpOworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0QXBwU3RyZWFtX0NpcmNsZShjb25zdCBDUERGX1JlY3QmIHJjQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0KSB7CisgIENGWF9CeXRlVGV4dEJ1ZiBzQVA7CisgIHNBUCA8PCAicVxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQsIFRSVUUpCisgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRBUF9DaXJjbGUocmNCQm94KSA8PCAiZlxuUVxuIjsKKyAgcmV0dXJuIHNBUC5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFwcFN0cmVhbV9Dcm9zcyhjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsIGNvbnN0IENQV0xfQ29sb3IgJiBjclRleHQpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNBUDsKLQlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LEZBTFNFKSA8PCBDUFdMX1V0aWxzOjpHZXRBUF9Dcm9zcyhyY0JCb3gpIDw8ICJTXG5RXG4iOwotCXJldHVybiBzQVAuR2V0Qnl0ZVN0cmluZygpOworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0QXBwU3RyZWFtX0Nyb3NzKGNvbnN0IENQREZfUmVjdCYgcmNCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyVGV4dCkgeworICBDRlhfQnl0ZVRleHRCdWYgc0FQOworICBzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LCBGQUxTRSkKKyAgICAgIDw8IENQV0xfVXRpbHM6OkdldEFQX0Nyb3NzKHJjQkJveCkgPDwgIlNcblFcbiI7CisgIHJldHVybiBzQVAuR2V0Qnl0ZVN0cmluZygpOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBcHBTdHJlYW1fRGlhbW9uZChjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsIGNvbnN0IENQV0xfQ29sb3IgJiBjclRleHQpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNBUDsKLQlzQVAgPDwgInFcbjEgd1xuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQsVFJVRSkgPDwgQ1BXTF9VdGlsczo6R2V0QVBfRGlhbW9uZChyY0JCb3gpIDw8ICJmXG5RXG4iOwotCXJldHVybiBzQVAuR2V0Qnl0ZVN0cmluZygpOworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0QXBwU3RyZWFtX0RpYW1vbmQoY29uc3QgQ1BERl9SZWN0JiByY0JCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjclRleHQpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNBUDsKKyAgc0FQIDw8ICJxXG4xIHdcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LCBUUlVFKQorICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0QVBfRGlhbW9uZChyY0JCb3gpIDw8ICJmXG5RXG4iOworICByZXR1cm4gc0FQLkdldEJ5dGVTdHJpbmcoKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0QXBwU3RyZWFtX1NxdWFyZShjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsIGNvbnN0IENQV0xfQ29sb3IgJiBjclRleHQpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNBUDsKLQlzQVAgPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LFRSVUUpIDw8IENQV0xfVXRpbHM6OkdldEFQX1NxdWFyZShyY0JCb3gpIDw8ICJmXG5RXG4iOwotCXJldHVybiBzQVAuR2V0Qnl0ZVN0cmluZygpOworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0QXBwU3RyZWFtX1NxdWFyZShjb25zdCBDUERGX1JlY3QmIHJjQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0KSB7CisgIENGWF9CeXRlVGV4dEJ1ZiBzQVA7CisgIHNBUCA8PCAicVxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQsIFRSVUUpCisgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRBUF9TcXVhcmUocmNCQm94KSA8PCAiZlxuUVxuIjsKKyAgcmV0dXJuIHNBUC5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFwcFN0cmVhbV9TdGFyKGNvbnN0IENQREZfUmVjdCAmIHJjQkJveCwgY29uc3QgQ1BXTF9Db2xvciAmIGNyVGV4dCkKLXsKLQlDRlhfQnl0ZVRleHRCdWYgc0FQOwotCXNBUCA8PCAicVxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQsVFJVRSkgPDwgQ1BXTF9VdGlsczo6R2V0QVBfU3RhcihyY0JCb3gpIDw8ICJmXG5RXG4iOwotCXJldHVybiBzQVAuR2V0Qnl0ZVN0cmluZygpOworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0QXBwU3RyZWFtX1N0YXIoY29uc3QgQ1BERl9SZWN0JiByY0JCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjclRleHQpIHsKKyAgQ0ZYX0J5dGVUZXh0QnVmIHNBUDsKKyAgc0FQIDw8ICJxXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCwgVFJVRSkKKyAgICAgIDw8IENQV0xfVXRpbHM6OkdldEFQX1N0YXIocmNCQm94KSA8PCAiZlxuUVxuIjsKKyAgcmV0dXJuIHNBUC5HZXRCeXRlU3RyaW5nKCk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldENoZWNrQm94QXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCAmIHJjQkJveCwKLQkJCQkJCQkJCQkJCQlGWF9JTlQzMiBuU3R5bGUsCi0JCQkJCQkJCQkJCQkJY29uc3QgQ1BXTF9Db2xvciAmIGNyVGV4dCkKLXsKLQlDUERGX1JlY3QgcmNDZW50ZXIgPSBHZXRDZW50ZXJTcXVhcmUocmNCQm94KTsKLQlzd2l0Y2ggKG5TdHlsZSkKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIFBDU19DSEVDSzoKLQkJcmV0dXJuIEdldEFwcFN0cmVhbV9DaGVjayhyY0NlbnRlcixjclRleHQpOwotCWNhc2UgUENTX0NJUkNMRToKLQkJcmV0dXJuIEdldEFwcFN0cmVhbV9DaXJjbGUoU2NhbGVSZWN0KHJjQ2VudGVyLDIuMGYvMy4wZiksY3JUZXh0KTsKLQljYXNlIFBDU19DUk9TUzoKLQkJcmV0dXJuIEdldEFwcFN0cmVhbV9Dcm9zcyhyY0NlbnRlcixjclRleHQpOwotCWNhc2UgUENTX0RJQU1PTkQ6Ci0JCXJldHVybiBHZXRBcHBTdHJlYW1fRGlhbW9uZChTY2FsZVJlY3QocmNDZW50ZXIsMi4wZi8zLjBmKSxjclRleHQpOwkJCi0JY2FzZSBQQ1NfU1FVQVJFOgotCQlyZXR1cm4gR2V0QXBwU3RyZWFtX1NxdWFyZShTY2FsZVJlY3QocmNDZW50ZXIsMi4wZi8zLjBmKSxjclRleHQpOwotCWNhc2UgUENTX1NUQVI6Ci0JCXJldHVybiBHZXRBcHBTdHJlYW1fU3RhcihTY2FsZVJlY3QocmNDZW50ZXIsMi4wZi8zLjBmKSxjclRleHQpOwotCX0KK0NGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldENoZWNrQm94QXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCYgcmNCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjclRleHQpIHsKKyAgQ1BERl9SZWN0IHJjQ2VudGVyID0gR2V0Q2VudGVyU3F1YXJlKHJjQkJveCk7CisgIHN3aXRjaCAoblN0eWxlKSB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIFBDU19DSEVDSzoKKyAgICAgIHJldHVybiBHZXRBcHBTdHJlYW1fQ2hlY2socmNDZW50ZXIsIGNyVGV4dCk7CisgICAgY2FzZSBQQ1NfQ0lSQ0xFOgorICAgICAgcmV0dXJuIEdldEFwcFN0cmVhbV9DaXJjbGUoU2NhbGVSZWN0KHJjQ2VudGVyLCAyLjBmIC8gMy4wZiksIGNyVGV4dCk7CisgICAgY2FzZSBQQ1NfQ1JPU1M6CisgICAgICByZXR1cm4gR2V0QXBwU3RyZWFtX0Nyb3NzKHJjQ2VudGVyLCBjclRleHQpOworICAgIGNhc2UgUENTX0RJQU1PTkQ6CisgICAgICByZXR1cm4gR2V0QXBwU3RyZWFtX0RpYW1vbmQoU2NhbGVSZWN0KHJjQ2VudGVyLCAyLjBmIC8gMy4wZiksIGNyVGV4dCk7CisgICAgY2FzZSBQQ1NfU1FVQVJFOgorICAgICAgcmV0dXJuIEdldEFwcFN0cmVhbV9TcXVhcmUoU2NhbGVSZWN0KHJjQ2VudGVyLCAyLjBmIC8gMy4wZiksIGNyVGV4dCk7CisgICAgY2FzZSBQQ1NfU1RBUjoKKyAgICAgIHJldHVybiBHZXRBcHBTdHJlYW1fU3RhcihTY2FsZVJlY3QocmNDZW50ZXIsIDIuMGYgLyAzLjBmKSwgY3JUZXh0KTsKKyAgfQogfQogCi1DRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRSYWRpb0J1dHRvbkFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QgJiByY0JCb3gsCi0JCQkJCQkJCQkJCQkJRlhfSU5UMzIgblN0eWxlLAotCQkJCQkJCQkJCQkJCWNvbnN0IENQV0xfQ29sb3IgJiBjclRleHQpCi17Ci0JQ1BERl9SZWN0IHJjQ2VudGVyID0gR2V0Q2VudGVyU3F1YXJlKHJjQkJveCk7Ci0Jc3dpdGNoIChuU3R5bGUpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBQQ1NfQ0hFQ0s6Ci0JCXJldHVybiBHZXRBcHBTdHJlYW1fQ2hlY2socmNDZW50ZXIsY3JUZXh0KTsKLQljYXNlIFBDU19DSVJDTEU6Ci0JCXJldHVybiBHZXRBcHBTdHJlYW1fQ2lyY2xlKFNjYWxlUmVjdChyY0NlbnRlciwxLjBmLzIuMGYpLGNyVGV4dCk7Ci0JY2FzZSBQQ1NfQ1JPU1M6Ci0JCXJldHVybiBHZXRBcHBTdHJlYW1fQ3Jvc3MocmNDZW50ZXIsY3JUZXh0KTsKLQljYXNlIFBDU19ESUFNT05EOgotCQlyZXR1cm4gR2V0QXBwU3RyZWFtX0RpYW1vbmQoU2NhbGVSZWN0KHJjQ2VudGVyLDIuMGYvMy4wZiksY3JUZXh0KTsJCQotCWNhc2UgUENTX1NRVUFSRToKLQkJcmV0dXJuIEdldEFwcFN0cmVhbV9TcXVhcmUoU2NhbGVSZWN0KHJjQ2VudGVyLDIuMGYvMy4wZiksY3JUZXh0KTsKLQljYXNlIFBDU19TVEFSOgotCQlyZXR1cm4gR2V0QXBwU3RyZWFtX1N0YXIoU2NhbGVSZWN0KHJjQ2VudGVyLDIuMGYvMy4wZiksY3JUZXh0KTsKLQl9CitDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRSYWRpb0J1dHRvbkFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QmIHJjQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0KSB7CisgIENQREZfUmVjdCByY0NlbnRlciA9IEdldENlbnRlclNxdWFyZShyY0JCb3gpOworICBzd2l0Y2ggKG5TdHlsZSkgeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSBQQ1NfQ0hFQ0s6CisgICAgICByZXR1cm4gR2V0QXBwU3RyZWFtX0NoZWNrKHJjQ2VudGVyLCBjclRleHQpOworICAgIGNhc2UgUENTX0NJUkNMRToKKyAgICAgIHJldHVybiBHZXRBcHBTdHJlYW1fQ2lyY2xlKFNjYWxlUmVjdChyY0NlbnRlciwgMS4wZiAvIDIuMGYpLCBjclRleHQpOworICAgIGNhc2UgUENTX0NST1NTOgorICAgICAgcmV0dXJuIEdldEFwcFN0cmVhbV9Dcm9zcyhyY0NlbnRlciwgY3JUZXh0KTsKKyAgICBjYXNlIFBDU19ESUFNT05EOgorICAgICAgcmV0dXJuIEdldEFwcFN0cmVhbV9EaWFtb25kKFNjYWxlUmVjdChyY0NlbnRlciwgMi4wZiAvIDMuMGYpLCBjclRleHQpOworICAgIGNhc2UgUENTX1NRVUFSRToKKyAgICAgIHJldHVybiBHZXRBcHBTdHJlYW1fU3F1YXJlKFNjYWxlUmVjdChyY0NlbnRlciwgMi4wZiAvIDMuMGYpLCBjclRleHQpOworICAgIGNhc2UgUENTX1NUQVI6CisgICAgICByZXR1cm4gR2V0QXBwU3RyZWFtX1N0YXIoU2NhbGVSZWN0KHJjQ2VudGVyLCAyLjBmIC8gMy4wZiksIGNyVGV4dCk7CisgIH0KIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0RHJvcEJ1dHRvbkFwcFN0cmVhbShjb25zdCBDUERGX1JlY3QgJiByY0JCb3gpCi17Ci0JQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07CitDRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXREcm9wQnV0dG9uQXBwU3RyZWFtKGNvbnN0IENQREZfUmVjdCYgcmNCQm94KSB7CisgIENGWF9CeXRlVGV4dEJ1ZiBzQXBwU3RyZWFtOwogCi0JaWYgKCFyY0JCb3guSXNFbXB0eSgpKQotCXsKLQkJc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsMjIwLjBmLzI1NS4wZiwyMjAuMGYvMjU1LjBmLDIyMC4wZi8yNTUuMGYpLFRSVUUpOwotCQlzQXBwU3RyZWFtIDw8IHJjQkJveC5sZWZ0IDw8ICIgIiA8PCByY0JCb3guYm90dG9tIDw8ICIgIiAKLQkJCQk8PCByY0JCb3gucmlnaHQgLSByY0JCb3gubGVmdCA8PCAiICIgPDwgcmNCQm94LnRvcCAtIHJjQkJveC5ib3R0b20gPDwgIiByZSBmXG4iOwotCQlzQXBwU3RyZWFtIDw8ICJRXG4iOworICBpZiAoIXJjQkJveC5Jc0VtcHR5KCkpIHsKKyAgICBzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgMjIwLjBmIC8gMjU1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwLjBmIC8gMjU1LjBmLCAyMjAuMGYgLyAyNTUuMGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpOworICAgIHNBcHBTdHJlYW0gPDwgcmNCQm94LmxlZnQgPDwgIiAiIDw8IHJjQkJveC5ib3R0b20gPDwgIiAiCisgICAgICAgICAgICAgICA8PCByY0JCb3gucmlnaHQgLSByY0JCb3gubGVmdCA8PCAiICIKKyAgICAgICAgICAgICAgIDw8IHJjQkJveC50b3AgLSByY0JCb3guYm90dG9tIDw8ICIgcmUgZlxuIjsKKyAgICBzQXBwU3RyZWFtIDw8ICJRXG4iOwogCi0JCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgCi0JCQlDUFdMX1V0aWxzOjpHZXRCb3JkZXJBcHBTdHJlYW0ocmNCQm94LDIsQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwwKSxDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLDEpLENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksMC41KSxQQlNfQkVWRUxFRCxDUFdMX0Rhc2goMywwLDApKSAKLQkJCTw8ICJRXG4iOworICAgIHNBcHBTdHJlYW0gPDwgInFcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Qm9yZGVyQXBwU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveCwgMiwgQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMC41KSwgUEJTX0JFVkVMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9EYXNoKDMsIDAsIDApKQorICAgICAgICAgICAgICAgPDwgIlFcbiI7CiAKLQkJQ1BERl9Qb2ludCBwdENlbnRlciA9IENQREZfUG9pbnQoKHJjQkJveC5sZWZ0ICsgcmNCQm94LnJpZ2h0KS8yLChyY0JCb3gudG9wICsgcmNCQm94LmJvdHRvbSkvMik7Ci0JCWlmIChJc0Zsb2F0QmlnZ2VyKHJjQkJveC5yaWdodCAtIHJjQkJveC5sZWZ0LDYpICYmIElzRmxvYXRCaWdnZXIocmNCQm94LnRvcCAtIHJjQkJveC5ib3R0b20sNikpCi0JCXsKLQkJCXNBcHBTdHJlYW0gPDwgInFcbiIgPDwgIiAwIGdcbiI7Ci0JCQlzQXBwU3RyZWFtIDw8IHB0Q2VudGVyLnggLSAzIDw8ICIgIiA8PCBwdENlbnRlci55ICsgMS41ZiA8PCAiIG1cbiI7Ci0JCQlzQXBwU3RyZWFtIDw8IHB0Q2VudGVyLnggKyAzIDw8ICIgIiA8PCBwdENlbnRlci55ICsgMS41ZiA8PCAiIGxcbiI7Ci0JCQlzQXBwU3RyZWFtIDw8IHB0Q2VudGVyLnggPDwgIiAiIDw8IHB0Q2VudGVyLnkgLSAxLjVmIDw8ICIgbFxuIjsKLQkJCXNBcHBTdHJlYW0gPDwgcHRDZW50ZXIueCAtIDMgPDwgIiAiIDw8IHB0Q2VudGVyLnkgKyAxLjVmIDw8ICIgbCBmXG4iOwotCQkJc0FwcFN0cmVhbSA8PCAiUVxuIjsKLQkJfQotCX0KKyAgICBDUERGX1BvaW50IHB0Q2VudGVyID0gQ1BERl9Qb2ludCgocmNCQm94LmxlZnQgKyByY0JCb3gucmlnaHQpIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmNCQm94LnRvcCArIHJjQkJveC5ib3R0b20pIC8gMik7CisgICAgaWYgKElzRmxvYXRCaWdnZXIocmNCQm94LnJpZ2h0IC0gcmNCQm94LmxlZnQsIDYpICYmCisgICAgICAgIElzRmxvYXRCaWdnZXIocmNCQm94LnRvcCAtIHJjQkJveC5ib3R0b20sIDYpKSB7CisgICAgICBzQXBwU3RyZWFtIDw8ICJxXG4iCisgICAgICAgICAgICAgICAgIDw8ICIgMCBnXG4iOworICAgICAgc0FwcFN0cmVhbSA8PCBwdENlbnRlci54IC0gMyA8PCAiICIgPDwgcHRDZW50ZXIueSArIDEuNWYgPDwgIiBtXG4iOworICAgICAgc0FwcFN0cmVhbSA8PCBwdENlbnRlci54ICsgMyA8PCAiICIgPDwgcHRDZW50ZXIueSArIDEuNWYgPDwgIiBsXG4iOworICAgICAgc0FwcFN0cmVhbSA8PCBwdENlbnRlci54IDw8ICIgIiA8PCBwdENlbnRlci55IC0gMS41ZiA8PCAiIGxcbiI7CisgICAgICBzQXBwU3RyZWFtIDw8IHB0Q2VudGVyLnggLSAzIDw8ICIgIiA8PCBwdENlbnRlci55ICsgMS41ZiA8PCAiIGwgZlxuIjsKKyAgICAgIHNBcHBTdHJlYW0gPDwgIlFcbiI7CisgICAgfQorICB9CiAKLQlyZXR1cm4gc0FwcFN0cmVhbS5HZXRCeXRlU3RyaW5nKCk7CisgIHJldHVybiBzQXBwU3RyZWFtLkdldEJ5dGVTdHJpbmcoKTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpDb252ZXJ0Q01ZSzJHUkFZKEZYX0ZMT0FUIGRDLEZYX0ZMT0FUIGRNLEZYX0ZMT0FUIGRZLEZYX0ZMT0FUIGRLLEZYX0ZMT0FUICZkR3JheSkKLXsKLQlpZiAoZEM8MCB8fCBkQz4xIHx8IGRNPDAgfHwgZE0+MSB8fCBkWSA8IDAgfHwgZFkgPjEgfHwgZEsgPCAwIHx8IGRLID4xKQotCQlyZXR1cm47Ci0JZEdyYXkgPSAxLjBmIC0gRlhfTUlOKDEuMGYsMC4zZipkQyswLjU5ZiAqIGRNICsgMC4xMWYqZFkrZEspOwordm9pZCBDUFdMX1V0aWxzOjpDb252ZXJ0Q01ZSzJHUkFZKEZYX0ZMT0FUIGRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBkR3JheSkgeworICBpZiAoZEMgPCAwIHx8IGRDID4gMSB8fCBkTSA8IDAgfHwgZE0gPiAxIHx8IGRZIDwgMCB8fCBkWSA+IDEgfHwgZEsgPCAwIHx8CisgICAgICBkSyA+IDEpCisgICAgcmV0dXJuOworICBkR3JheSA9IDEuMGYgLSBzdGQ6Om1pbigxLjBmLCAwLjNmICogZEMgKyAwLjU5ZiAqIGRNICsgMC4xMWYgKiBkWSArIGRLKTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpDb252ZXJ0R1JBWTJDTVlLKEZYX0ZMT0FUIGRHcmF5LEZYX0ZMT0FUICAmZEMsRlhfRkxPQVQgJmRNLEZYX0ZMT0FUICZkWSxGWF9GTE9BVCAmZEspCi17Ci0JaWYgKGRHcmF5IDwwIHx8IGRHcmF5ID4xKQotCQlyZXR1cm47Ci0JZEMgPSAwLjBmOwotCWRNID0gMC4wZjsKLQlkWSA9IDAuMGY7Ci0JZEsgPSAxLjBmLWRHcmF5Owordm9pZCBDUFdMX1V0aWxzOjpDb252ZXJ0R1JBWTJDTVlLKEZYX0ZMT0FUIGRHcmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBkQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBkSykgeworICBpZiAoZEdyYXkgPCAwIHx8IGRHcmF5ID4gMSkKKyAgICByZXR1cm47CisgIGRDID0gMC4wZjsKKyAgZE0gPSAwLjBmOworICBkWSA9IDAuMGY7CisgIGRLID0gMS4wZiAtIGRHcmF5OwogfQogCi12b2lkIENQV0xfVXRpbHM6OkNvbnZlcnRHUkFZMlJHQihGWF9GTE9BVCBkR3JheSxGWF9GTE9BVCAmZFIsRlhfRkxPQVQgJmRHLEZYX0ZMT0FUICZkQikKLXsKLQlpZiAoZEdyYXkgPDAgfHwgZEdyYXkgPjEpCi0JCXJldHVybjsKLQlkUiA9IGRHcmF5OwotCWRHID0gZEdyYXk7Ci0JZEIgPSBkR3JheTsKK3ZvaWQgQ1BXTF9VdGlsczo6Q29udmVydEdSQVkyUkdCKEZYX0ZMT0FUIGRHcmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGRSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGRHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGRCKSB7CisgIGlmIChkR3JheSA8IDAgfHwgZEdyYXkgPiAxKQorICAgIHJldHVybjsKKyAgZFIgPSBkR3JheTsKKyAgZEcgPSBkR3JheTsKKyAgZEIgPSBkR3JheTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpDb252ZXJ0UkdCMkdSQVkoRlhfRkxPQVQgZFIsRlhfRkxPQVQgZEcsRlhfRkxPQVQgZEIsRlhfRkxPQVQgJmRHcmF5KQotewotCWlmIChkUjwwIHx8IGRSPjEgfHwgZEc8MCB8fCBkRyA+IDAgfHwgZEIgPCAwIHx8IGRCID4xKQotCQlyZXR1cm47Ci0JZEdyYXkgPSAwLjNmKmRSKzAuNTlmKmRHKzAuMTFmKmRCOwordm9pZCBDUFdMX1V0aWxzOjpDb252ZXJ0UkdCMkdSQVkoRlhfRkxPQVQgZFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGRHcmF5KSB7CisgIGlmIChkUiA8IDAgfHwgZFIgPiAxIHx8IGRHIDwgMCB8fCBkRyA+IDAgfHwgZEIgPCAwIHx8IGRCID4gMSkKKyAgICByZXR1cm47CisgIGRHcmF5ID0gMC4zZiAqIGRSICsgMC41OWYgKiBkRyArIDAuMTFmICogZEI7CiB9CiAKLXZvaWQgQ1BXTF9VdGlsczo6Q29udmVydENNWUsyUkdCKEZYX0ZMT0FUIGRDLEZYX0ZMT0FUIGRNLEZYX0ZMT0FUIGRZLEZYX0ZMT0FUIGRLLEZYX0ZMT0FUICZkUixGWF9GTE9BVCAmZEcsRlhfRkxPQVQgJmRCKQotewotCWlmIChkQyA8MCB8fCBkQz4xIHx8IGRNIDwgMCB8fCBkTSA+IDEgfHwgZFkgPCAwIHx8IGRZID4gMSB8fCBkSyA8IDAgfHwgZEsgPiAxICkKLQkJcmV0dXJuOwotCWRSID0gMS4wZiAtIEZYX01JTigxLjBmLCBkQyArIGRLKTsKLQlkRyA9IDEuMGYgLSBGWF9NSU4oMS4wZiwgZE0gKyBkSyk7Ci0JZEIgPSAxLjBmIC0gRlhfTUlOKDEuMGYsIGRZICsgZEspOwordm9pZCBDUFdMX1V0aWxzOjpDb252ZXJ0Q01ZSzJSR0IoRlhfRkxPQVQgZEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZEssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZEIpIHsKKyAgaWYgKGRDIDwgMCB8fCBkQyA+IDEgfHwgZE0gPCAwIHx8IGRNID4gMSB8fCBkWSA8IDAgfHwgZFkgPiAxIHx8IGRLIDwgMCB8fAorICAgICAgZEsgPiAxKQorICAgIHJldHVybjsKKyAgZFIgPSAxLjBmIC0gc3RkOjptaW4oMS4wZiwgZEMgKyBkSyk7CisgIGRHID0gMS4wZiAtIHN0ZDo6bWluKDEuMGYsIGRNICsgZEspOworICBkQiA9IDEuMGYgLSBzdGQ6Om1pbigxLjBmLCBkWSArIGRLKTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpDb252ZXJ0UkdCMkNNWUsoRlhfRkxPQVQgZFIsRlhfRkxPQVQgZEcsRlhfRkxPQVQgZEIsRlhfRkxPQVQgJmRDLEZYX0ZMT0FUICZkTSxGWF9GTE9BVCAmZFksRlhfRkxPQVQgJmRLKQotewotCWlmIChkUjwwIHx8IGRSPjEgfHwgZEc8MCB8fCBkRz4xIHx8IGRCPDAgfHwgZEI+MSkKLQkJcmV0dXJuOwordm9pZCBDUFdMX1V0aWxzOjpDb252ZXJ0UkdCMkNNWUsoRlhfRkxPQVQgZFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGRLKSB7CisgIGlmIChkUiA8IDAgfHwgZFIgPiAxIHx8IGRHIDwgMCB8fCBkRyA+IDEgfHwgZEIgPCAwIHx8IGRCID4gMSkKKyAgICByZXR1cm47CiAKLQlkQyA9IDEuMGYgLSBkUjsKLQlkTSA9IDEuMGYgLSBkRzsKLQlkWSA9IDEuMGYgLSBkQjsKLQlkSyA9IEZYX01JTihkQywgRlhfTUlOKGRNLCBkWSkpOworICBkQyA9IDEuMGYgLSBkUjsKKyAgZE0gPSAxLjBmIC0gZEc7CisgIGRZID0gMS4wZiAtIGRCOworICBkSyA9IHN0ZDo6bWluKGRDLCBzdGQ6Om1pbihkTSwgZFkpKTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpQV0xDb2xvclRvQVJHQihjb25zdCBDUFdMX0NvbG9yJiBjb2xvciwgRlhfSU5UMzImIGFscGhhLCBGWF9GTE9BVCYgcmVkLCBGWF9GTE9BVCYgZ3JlZW4sIEZYX0ZMT0FUJiBibHVlKQotewotCXN3aXRjaCAoY29sb3IubkNvbG9yVHlwZSkKLQl7Ci0JY2FzZSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ6Ci0JCXsKLQkJCWFscGhhID0gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIENPTE9SVFlQRV9HUkFZOgotCQl7Ci0JCQlDb252ZXJ0R1JBWTJSR0IoY29sb3IuZkNvbG9yMSwgcmVkLCBncmVlbiwgYmx1ZSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBDT0xPUlRZUEVfUkdCOgotCQl7Ci0JCQlyZWQgPSBjb2xvci5mQ29sb3IxOwotCQkJZ3JlZW4gPSBjb2xvci5mQ29sb3IyOwotCQkJYmx1ZSA9IGNvbG9yLmZDb2xvcjM7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBDT0xPUlRZUEVfQ01ZSzoKLQkJewotCQkJQ29udmVydENNWUsyUkdCKGNvbG9yLmZDb2xvcjEsIGNvbG9yLmZDb2xvcjIsIGNvbG9yLmZDb2xvcjMsIGNvbG9yLmZDb2xvcjQsCi0JCQkJcmVkLCBncmVlbiwgYmx1ZSk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQordm9pZCBDUFdMX1V0aWxzOjpQV0xDb2xvclRvQVJHQihjb25zdCBDUFdMX0NvbG9yJiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBncmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGJsdWUpIHsKKyAgc3dpdGNoIChjb2xvci5uQ29sb3JUeXBlKSB7CisgICAgY2FzZSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ6IHsKKyAgICAgIGFscGhhID0gMDsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgQ09MT1JUWVBFX0dSQVk6IHsKKyAgICAgIENvbnZlcnRHUkFZMlJHQihjb2xvci5mQ29sb3IxLCByZWQsIGdyZWVuLCBibHVlKTsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgQ09MT1JUWVBFX1JHQjogeworICAgICAgcmVkID0gY29sb3IuZkNvbG9yMTsKKyAgICAgIGdyZWVuID0gY29sb3IuZkNvbG9yMjsKKyAgICAgIGJsdWUgPSBjb2xvci5mQ29sb3IzOworICAgIH0gYnJlYWs7CisgICAgY2FzZSBDT0xPUlRZUEVfQ01ZSzogeworICAgICAgQ29udmVydENNWUsyUkdCKGNvbG9yLmZDb2xvcjEsIGNvbG9yLmZDb2xvcjIsIGNvbG9yLmZDb2xvcjMsCisgICAgICAgICAgICAgICAgICAgICAgY29sb3IuZkNvbG9yNCwgcmVkLCBncmVlbiwgYmx1ZSk7CisgICAgfSBicmVhazsKKyAgfQogfQogCi1GWF9DT0xPUlJFRiBDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvciwgRlhfSU5UMzIgblRyYW5zcGFyYW5jeSkKLXsKLQlGWF9JTlQzMiBuQWxwaGEgPSBuVHJhbnNwYXJhbmN5OwotCUZYX0ZMT0FUIGRSZWQgPSAwOwotCUZYX0ZMT0FUIGRHcmVlbiA9IDA7Ci0JRlhfRkxPQVQgZEJsdWUgPSAwOworRlhfQ09MT1JSRUYgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5UcmFuc3BhcmFuY3kpIHsKKyAgaW50MzJfdCBuQWxwaGEgPSBuVHJhbnNwYXJhbmN5OworICBGWF9GTE9BVCBkUmVkID0gMDsKKyAgRlhfRkxPQVQgZEdyZWVuID0gMDsKKyAgRlhfRkxPQVQgZEJsdWUgPSAwOwogCi0JUFdMQ29sb3JUb0FSR0IoY29sb3IsIG5BbHBoYSwgZFJlZCwgZEdyZWVuLCBkQmx1ZSk7CisgIFBXTENvbG9yVG9BUkdCKGNvbG9yLCBuQWxwaGEsIGRSZWQsIGRHcmVlbiwgZEJsdWUpOwogCi0JcmV0dXJuIEFyZ2JFbmNvZGUobkFscGhhLCAoRlhfSU5UMzIpKGRSZWQqMjU1KSwgKEZYX0lOVDMyKShkR3JlZW4qMjU1KSwgKEZYX0lOVDMyKShkQmx1ZSoyNTUpKTsKKyAgcmV0dXJuIEFyZ2JFbmNvZGUobkFscGhhLCAoaW50MzJfdCkoZFJlZCAqIDI1NSksIChpbnQzMl90KShkR3JlZW4gKiAyNTUpLAorICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCkoZEJsdWUgKiAyNTUpKTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpEcmF3RmlsbFJlY3QoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSxjb25zdCBDUERGX1JlY3QgJiByZWN0LAotCQkJCQkJCSAgY29uc3QgRlhfQ09MT1JSRUYgJiBjb2xvcikKLXsKLQlDRlhfUGF0aERhdGEgcGF0aDsKLQlDUERGX1JlY3QgcmNUZW1wKHJlY3QpOwkKLQlwYXRoLkFwcGVuZFJlY3QocmNUZW1wLmxlZnQscmNUZW1wLmJvdHRvbSxyY1RlbXAucmlnaHQscmNUZW1wLnRvcCk7Ci0JcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgTlVMTCwgY29sb3IsIDAsIEZYRklMTF9XSU5ESU5HKTsKK3ZvaWQgQ1BXTF9VdGlsczo6RHJhd0ZpbGxSZWN0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DT0xPUlJFRiYgY29sb3IpIHsKKyAgQ0ZYX1BhdGhEYXRhIHBhdGg7CisgIENQREZfUmVjdCByY1RlbXAocmVjdCk7CisgIHBhdGguQXBwZW5kUmVjdChyY1RlbXAubGVmdCwgcmNUZW1wLmJvdHRvbSwgcmNUZW1wLnJpZ2h0LCByY1RlbXAudG9wKTsKKyAgcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgTlVMTCwgY29sb3IsIDAsIEZYRklMTF9XSU5ESU5HKTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpEcmF3RmlsbEFyZWEoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKLQkJCQkJCQljb25zdCBDUERGX1BvaW50KiBwUHRzLCBGWF9JTlQzMiBuQ291bnQsIGNvbnN0IEZYX0NPTE9SUkVGJiBjb2xvcikKLXsKLQlDRlhfUGF0aERhdGEgcGF0aDsKLQlwYXRoLlNldFBvaW50Q291bnQobkNvdW50KTsKK3ZvaWQgQ1BXTF9VdGlsczo6RHJhd0ZpbGxBcmVhKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50KiBwUHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DT0xPUlJFRiYgY29sb3IpIHsKKyAgQ0ZYX1BhdGhEYXRhIHBhdGg7CisgIHBhdGguU2V0UG9pbnRDb3VudChuQ291bnQpOwogCi0JcGF0aC5TZXRQb2ludCgwLCBwUHRzWzBdLngsIHBQdHNbMF0ueSwgRlhQVF9NT1ZFVE8pOwotCWZvciAoRlhfSU5UMzIgaT0xOyBpPG5Db3VudDsgaSsrKQotCQlwYXRoLlNldFBvaW50KGksIHBQdHNbaV0ueCwgcFB0c1tpXS55LCBGWFBUX0xJTkVUTyk7CisgIHBhdGguU2V0UG9pbnQoMCwgcFB0c1swXS54LCBwUHRzWzBdLnksIEZYUFRfTU9WRVRPKTsKKyAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgbkNvdW50OyBpKyspCisgICAgcGF0aC5TZXRQb2ludChpLCBwUHRzW2ldLngsIHBQdHNbaV0ueSwgRlhQVF9MSU5FVE8pOwogCi0JcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgTlVMTCwgY29sb3IsIDAsIEZYRklMTF9BTFRFUk5BVEUpOworICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCBOVUxMLCBjb2xvciwgMCwgRlhGSUxMX0FMVEVSTkFURSk7CiB9CiAKK3ZvaWQgQ1BXTF9VdGlsczo6RHJhd1N0cm9rZVJlY3QoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NPTE9SUkVGJiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZldpZHRoKSB7CisgIENGWF9QYXRoRGF0YSBwYXRoOworICBDUERGX1JlY3QgcmNUZW1wKHJlY3QpOworICBwYXRoLkFwcGVuZFJlY3QocmNUZW1wLmxlZnQsIHJjVGVtcC5ib3R0b20sIHJjVGVtcC5yaWdodCwgcmNUZW1wLnRvcCk7CisKLXZvaWQgQ1BXTF9VdGlsczo6RHJhd1N0cm9rZVJlY3QoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSxjb25zdCBDUERGX1JlY3QgJiByZWN0LAotCQkJCQkJCSAgY29uc3QgRlhfQ09MT1JSRUYgJiBjb2xvciwgRlhfRkxPQVQgZldpZHRoKQotewotCUNGWF9QYXRoRGF0YSBwYXRoOwotCUNQREZfUmVjdCByY1RlbXAocmVjdCk7CQotCXBhdGguQXBwZW5kUmVjdChyY1RlbXAubGVmdCxyY1RlbXAuYm90dG9tLHJjVGVtcC5yaWdodCxyY1RlbXAudG9wKTsKLQkKLQlDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOwotCWdzZC5tX0xpbmVXaWR0aCA9IGZXaWR0aDsKKyAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKKyAgZ3NkLm1fTGluZVdpZHRoID0gZldpZHRoOwogCi0JcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgJmdzZCwgMCwgY29sb3IsIEZYRklMTF9BTFRFUk5BVEUpOworICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCAmZ3NkLCAwLCBjb2xvciwgRlhGSUxMX0FMVEVSTkFURSk7CiB9CiAKLXZvaWQgQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKLQkJCQkJCQljb25zdCBDUERGX1BvaW50ICYgcHRNb3ZlVG8sIGNvbnN0IENQREZfUG9pbnQgJiBwdExpbmVUbywgY29uc3QgRlhfQ09MT1JSRUYgJiBjb2xvciwgRlhfRkxPQVQgZldpZHRoKQotewotCUNGWF9QYXRoRGF0YSBwYXRoOwotCXBhdGguU2V0UG9pbnRDb3VudCgyKTsKLQlwYXRoLlNldFBvaW50KDAsIHB0TW92ZVRvLngsIHB0TW92ZVRvLnksIEZYUFRfTU9WRVRPKTsKLQlwYXRoLlNldFBvaW50KDEsIHB0TGluZVRvLngsIHB0TGluZVRvLnksIEZYUFRfTElORVRPKTsKK3ZvaWQgQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BvaW50JiBwdE1vdmVUbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRMaW5lVG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NPTE9SUkVGJiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZldpZHRoKSB7CisgIENGWF9QYXRoRGF0YSBwYXRoOworICBwYXRoLlNldFBvaW50Q291bnQoMik7CisgIHBhdGguU2V0UG9pbnQoMCwgcHRNb3ZlVG8ueCwgcHRNb3ZlVG8ueSwgRlhQVF9NT1ZFVE8pOworICBwYXRoLlNldFBvaW50KDEsIHB0TGluZVRvLngsIHB0TGluZVRvLnksIEZYUFRfTElORVRPKTsKIAotCUNGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7Ci0JZ3NkLm1fTGluZVdpZHRoID0gZldpZHRoOworICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOworICBnc2QubV9MaW5lV2lkdGggPSBmV2lkdGg7CiAKLQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCAmZ3NkLCAwLCBjb2xvciwgRlhGSUxMX0FMVEVSTkFURSk7CisgIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsICZnc2QsIDAsIGNvbG9yLCBGWEZJTExfQUxURVJOQVRFKTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpEcmF3RmlsbFJlY3QoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSxjb25zdCBDUERGX1JlY3QgJiByZWN0LAotCQkJCQkJCSAgY29uc3QgQ1BXTF9Db2xvciAmIGNvbG9yLCBGWF9JTlQzMiBuVHJhbnNwYXJhbmN5KQotewotCUNQV0xfVXRpbHM6OkRyYXdGaWxsUmVjdChwRGV2aWNlLHBVc2VyMkRldmljZSxyZWN0LFBXTENvbG9yVG9GWENvbG9yKGNvbG9yLG5UcmFuc3BhcmFuY3kpKTsKK3ZvaWQgQ1BXTF9VdGlsczo6RHJhd0ZpbGxSZWN0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblRyYW5zcGFyYW5jeSkgeworICBDUFdMX1V0aWxzOjpEcmF3RmlsbFJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMQ29sb3JUb0ZYQ29sb3IoY29sb3IsIG5UcmFuc3BhcmFuY3kpKTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpEcmF3U2hhZG93KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0JCQkJCQkJCQkJCQkJCUZYX0JPT0wgYlZlcnRpY2FsLCBGWF9CT09MIGJIb3Jpem9udGFsLCBDUERGX1JlY3QgcmVjdCwKLQkJCQkJCQkJCQkJCQkJRlhfSU5UMzIgblRyYW5zcGFyYW5jeSwgRlhfSU5UMzIgblN0YXJ0R3JheSwgRlhfSU5UMzIgbkVuZEdyYXkpCi17Ci0JRlhfRkxPQVQgZlN0ZXBHcmF5ID0gMS4wZjsKK3ZvaWQgQ1BXTF9VdGlsczo6RHJhd1NoYWRvdyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJWZXJ0aWNhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJIb3Jpem9udGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVjdCByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblRyYW5zcGFyYW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TdGFydEdyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRW5kR3JheSkgeworICBGWF9GTE9BVCBmU3RlcEdyYXkgPSAxLjBmOwogCi0JaWYgKGJWZXJ0aWNhbCkKLQl7Ci0JCWZTdGVwR3JheSA9IChuRW5kR3JheSAtIG5TdGFydEdyYXkpIC8gcmVjdC5IZWlnaHQoKTsKKyAgaWYgKGJWZXJ0aWNhbCkgeworICAgIGZTdGVwR3JheSA9IChuRW5kR3JheSAtIG5TdGFydEdyYXkpIC8gcmVjdC5IZWlnaHQoKTsKIAotCQlmb3IgKEZYX0ZMT0FUIGZ5PXJlY3QuYm90dG9tKzAuNWY7IGZ5PD1yZWN0LnRvcC0wLjVmOyBmeSs9MS4wZikKLQkJewkJCQotCQkJRlhfSU5UMzIgbkdyYXkgPSBuU3RhcnRHcmF5ICsgKEZYX0lOVDMyKShmU3RlcEdyYXkgKiAoZnktcmVjdC5ib3R0b20pKTsKLQkJCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgQ1BERl9Qb2ludChyZWN0LmxlZnQsIGZ5KSwKLQkJCQlDUERGX1BvaW50KHJlY3QucmlnaHQsIGZ5KSwgQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LCBuR3JheSwgbkdyYXksIG5HcmF5KSwgMS41Zik7Ci0JCX0KLQl9CisgICAgZm9yIChGWF9GTE9BVCBmeSA9IHJlY3QuYm90dG9tICsgMC41ZjsgZnkgPD0gcmVjdC50b3AgLSAwLjVmOyBmeSArPSAxLjBmKSB7CisgICAgICBpbnQzMl90IG5HcmF5ID0gblN0YXJ0R3JheSArIChpbnQzMl90KShmU3RlcEdyYXkgKiAoZnkgLSByZWN0LmJvdHRvbSkpOworICAgICAgQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUoCisgICAgICAgICAgcERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX1BvaW50KHJlY3QubGVmdCwgZnkpLAorICAgICAgICAgIENQREZfUG9pbnQocmVjdC5yaWdodCwgZnkpLAorICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwgbkdyYXksIG5HcmF5LCBuR3JheSksIDEuNWYpOworICAgIH0KKyAgfQogCi0JaWYgKGJIb3Jpem9udGFsKQotCXsKLQkJZlN0ZXBHcmF5ID0gKG5FbmRHcmF5IC0gblN0YXJ0R3JheSkgLyByZWN0LldpZHRoKCk7CisgIGlmIChiSG9yaXpvbnRhbCkgeworICAgIGZTdGVwR3JheSA9IChuRW5kR3JheSAtIG5TdGFydEdyYXkpIC8gcmVjdC5XaWR0aCgpOwogCi0JCWZvciAoRlhfRkxPQVQgZng9cmVjdC5sZWZ0KzAuNWY7IGZ4PD1yZWN0LnJpZ2h0LTAuNWY7IGZ4Kz0xLjBmKQotCQl7CQkJCi0JCQlGWF9JTlQzMiBuR3JheSA9IG5TdGFydEdyYXkgKyAoRlhfSU5UMzIpKGZTdGVwR3JheSAqIChmeC1yZWN0LmxlZnQpKTsKLQkJCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgQ1BERl9Qb2ludChmeCwgcmVjdC5ib3R0b20pLAotCQkJCUNQREZfUG9pbnQoZngsIHJlY3QudG9wKSwgQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LCBuR3JheSwgbkdyYXksIG5HcmF5KSwgMS41Zik7Ci0JCX0KLQl9CisgICAgZm9yIChGWF9GTE9BVCBmeCA9IHJlY3QubGVmdCArIDAuNWY7IGZ4IDw9IHJlY3QucmlnaHQgLSAwLjVmOyBmeCArPSAxLjBmKSB7CisgICAgICBpbnQzMl90IG5HcmF5ID0gblN0YXJ0R3JheSArIChpbnQzMl90KShmU3RlcEdyYXkgKiAoZnggLSByZWN0LmxlZnQpKTsKKyAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKAorICAgICAgICAgIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgQ1BERl9Qb2ludChmeCwgcmVjdC5ib3R0b20pLAorICAgICAgICAgIENQREZfUG9pbnQoZngsIHJlY3QudG9wKSwKKyAgICAgICAgICBBcmdiRW5jb2RlKG5UcmFuc3BhcmFuY3ksIG5HcmF5LCBuR3JheSwgbkdyYXkpLCAxLjVmKTsKKyAgICB9CisgIH0KIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpEcmF3Qm9yZGVyKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0JCQkJCQkJCQkJCQljb25zdCBDUERGX1JlY3QgJiByZWN0LCBGWF9GTE9BVCBmV2lkdGgsCi0JCQkJCQkJCQkJCQljb25zdCBDUFdMX0NvbG9yICYgY29sb3IsIGNvbnN0IENQV0xfQ29sb3IgJiBjckxlZnRUb3AsIGNvbnN0IENQV0xfQ29sb3IgJiBjclJpZ2h0Qm90dG9tLAotCQkJCQkJCQkJCQkJRlhfSU5UMzIgblN0eWxlLCBjb25zdCBDUFdMX0Rhc2ggJiBkYXNoLCBGWF9JTlQzMiBuVHJhbnNwYXJhbmN5KQotewotCUZYX0ZMT0FUIGZMZWZ0ID0gcmVjdC5sZWZ0OwotCUZYX0ZMT0FUIGZSaWdodCA9IHJlY3QucmlnaHQ7Ci0JRlhfRkxPQVQgZlRvcCA9IHJlY3QudG9wOwotCUZYX0ZMT0FUIGZCb3R0b20gPSByZWN0LmJvdHRvbTsKK3ZvaWQgQ1BXTF9VdGlsczo6RHJhd0JvcmRlcihDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyTGVmdFRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjclJpZ2h0Qm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblRyYW5zcGFyYW5jeSkgeworICBGWF9GTE9BVCBmTGVmdCA9IHJlY3QubGVmdDsKKyAgRlhfRkxPQVQgZlJpZ2h0ID0gcmVjdC5yaWdodDsKKyAgRlhfRkxPQVQgZlRvcCA9IHJlY3QudG9wOworICBGWF9GTE9BVCBmQm90dG9tID0gcmVjdC5ib3R0b207CiAKLQlpZiAoZldpZHRoID4gMC4wZikKLQl7Ci0JCUZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmV2lkdGggLyAyLjBmOworICBpZiAoZldpZHRoID4gMC4wZikgeworICAgIEZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmV2lkdGggLyAyLjBmOwogCi0JCXN3aXRjaCAoblN0eWxlKQotCQl7Ci0JCWRlZmF1bHQ6Ci0JCWNhc2UgUEJTX1NPTElEOgotCQkJewotCQkJCUNGWF9QYXRoRGF0YSBwYXRoOwotCQkJCXBhdGguQXBwZW5kUmVjdChmTGVmdCwgZkJvdHRvbSwgZlJpZ2h0LCBmVG9wKTsKLQkJCQlwYXRoLkFwcGVuZFJlY3QoZkxlZnQgKyBmV2lkdGgsIGZCb3R0b20gKyBmV2lkdGgsIGZSaWdodCAtIGZXaWR0aCwgZlRvcCAtIGZXaWR0aCk7Ci0JCQkJcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgTlVMTCwgUFdMQ29sb3JUb0ZYQ29sb3IoY29sb3IsblRyYW5zcGFyYW5jeSksIDAsIEZYRklMTF9BTFRFUk5BVEUpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUEJTX0RBU0g6Ci0JCQl7Ci0JCQkJQ0ZYX1BhdGhEYXRhIHBhdGg7CisgICAgc3dpdGNoIChuU3R5bGUpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICBjYXNlIFBCU19TT0xJRDogeworICAgICAgICBDRlhfUGF0aERhdGEgcGF0aDsKKyAgICAgICAgcGF0aC5BcHBlbmRSZWN0KGZMZWZ0LCBmQm90dG9tLCBmUmlnaHQsIGZUb3ApOworICAgICAgICBwYXRoLkFwcGVuZFJlY3QoZkxlZnQgKyBmV2lkdGgsIGZCb3R0b20gKyBmV2lkdGgsIGZSaWdodCAtIGZXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZUb3AgLSBmV2lkdGgpOworICAgICAgICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xDb2xvclRvRlhDb2xvcihjb2xvciwgblRyYW5zcGFyYW5jeSksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRklMTF9BTFRFUk5BVEUpOworICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgUEJTX0RBU0g6IHsKKyAgICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGg7CisKKyAgICAgICAgcGF0aC5TZXRQb2ludENvdW50KDUpOworICAgICAgICBwYXRoLlNldFBvaW50KDAsIGZMZWZ0ICsgZldpZHRoIC8gMi4wZiwgZkJvdHRvbSArIGZXaWR0aCAvIDIuMGYsCisgICAgICAgICAgICAgICAgICAgICAgRlhQVF9NT1ZFVE8pOworICAgICAgICBwYXRoLlNldFBvaW50KDEsIGZMZWZ0ICsgZldpZHRoIC8gMi4wZiwgZlRvcCAtIGZXaWR0aCAvIDIuMGYsCisgICAgICAgICAgICAgICAgICAgICAgRlhQVF9MSU5FVE8pOworICAgICAgICBwYXRoLlNldFBvaW50KDIsIGZSaWdodCAtIGZXaWR0aCAvIDIuMGYsIGZUb3AgLSBmV2lkdGggLyAyLjBmLAorICAgICAgICAgICAgICAgICAgICAgIEZYUFRfTElORVRPKTsKKyAgICAgICAgcGF0aC5TZXRQb2ludCgzLCBmUmlnaHQgLSBmV2lkdGggLyAyLjBmLCBmQm90dG9tICsgZldpZHRoIC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgICBGWFBUX0xJTkVUTyk7CisgICAgICAgIHBhdGguU2V0UG9pbnQoNCwgZkxlZnQgKyBmV2lkdGggLyAyLjBmLCBmQm90dG9tICsgZldpZHRoIC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgICBGWFBUX0xJTkVUTyk7CisKKyAgICAgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKKyAgICAgICAgZ3NkLlNldERhc2hDb3VudCgyKTsKKyAgICAgICAgZ3NkLm1fRGFzaEFycmF5WzBdID0gMy4wZjsKKyAgICAgICAgZ3NkLm1fRGFzaEFycmF5WzFdID0gMy4wZjsKKyAgICAgICAgZ3NkLm1fRGFzaFBoYXNlID0gMDsKIAotCQkJCXBhdGguU2V0UG9pbnRDb3VudCg1KTsKLQkJCQlwYXRoLlNldFBvaW50KDAsIGZMZWZ0ICsgZldpZHRoIC8gMi4wZiwgZkJvdHRvbSArIGZXaWR0aCAvIDIuMGYsIEZYUFRfTU9WRVRPKTsKLQkJCQlwYXRoLlNldFBvaW50KDEsIGZMZWZ0ICsgZldpZHRoIC8gMi4wZiwgZlRvcCAtIGZXaWR0aCAvIDIuMGYsIEZYUFRfTElORVRPKTsKLQkJCQlwYXRoLlNldFBvaW50KDIsIGZSaWdodCAtIGZXaWR0aCAvIDIuMGYsIGZUb3AgLSBmV2lkdGggLyAyLjBmLCBGWFBUX0xJTkVUTyk7Ci0JCQkJcGF0aC5TZXRQb2ludCgzLCBmUmlnaHQgLSBmV2lkdGggLyAyLjBmLCBmQm90dG9tICsgZldpZHRoIC8gMi4wZiwgRlhQVF9MSU5FVE8pOwotCQkJCXBhdGguU2V0UG9pbnQoNCwgZkxlZnQgKyBmV2lkdGggLyAyLjBmLCBmQm90dG9tICsgZldpZHRoIC8gMi4wZiwgRlhQVF9MSU5FVE8pOworICAgICAgICBnc2QubV9MaW5lV2lkdGggPSBmV2lkdGg7CisgICAgICAgIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsICZnc2QsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTENvbG9yVG9GWENvbG9yKGNvbG9yLCBuVHJhbnNwYXJhbmN5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhGSUxMX1dJTkRJTkcpOworICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgUEJTX0JFVkVMRUQ6CisgICAgICBjYXNlIFBCU19JTlNFVDogeworICAgICAgICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOworICAgICAgICBnc2QubV9MaW5lV2lkdGggPSBmSGFsZldpZHRoOwogCi0JCQkJQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKLQkJCQlnc2QuU2V0RGFzaENvdW50KDIpOwkJCQkKLQkJCQlnc2QubV9EYXNoQXJyYXlbMF0gPSAzLjBmOwotCQkJCWdzZC5tX0Rhc2hBcnJheVsxXSA9IDMuMGY7Ci0JCQkJZ3NkLm1fRGFzaFBoYXNlID0gMDsJCi0JCQkJCi0JCQkJZ3NkLm1fTGluZVdpZHRoID0gZldpZHRoOwotCQkJCXBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsICZnc2QsIDAsIFBXTENvbG9yVG9GWENvbG9yKGNvbG9yLG5UcmFuc3BhcmFuY3kpLCBGWEZJTExfV0lORElORyk7CQkJCQotCQkJfQkJCQotCQkJYnJlYWs7Ci0JCWNhc2UgUEJTX0JFVkVMRUQ6Ci0JCWNhc2UgUEJTX0lOU0VUOgkKLQkJCXsKLQkJCQlDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOwotCQkJCWdzZC5tX0xpbmVXaWR0aCA9IGZIYWxmV2lkdGg7CisgICAgICAgIENGWF9QYXRoRGF0YSBwYXRoTFQ7CiAKLQkJCQlDRlhfUGF0aERhdGEgcGF0aExUOworICAgICAgICBwYXRoTFQuU2V0UG9pbnRDb3VudCg3KTsKKyAgICAgICAgcGF0aExULlNldFBvaW50KDAsIGZMZWZ0ICsgZkhhbGZXaWR0aCwgZkJvdHRvbSArIGZIYWxmV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBGWFBUX01PVkVUTyk7CisgICAgICAgIHBhdGhMVC5TZXRQb2ludCgxLCBmTGVmdCArIGZIYWxmV2lkdGgsIGZUb3AgLSBmSGFsZldpZHRoLCBGWFBUX0xJTkVUTyk7CisgICAgICAgIHBhdGhMVC5TZXRQb2ludCgyLCBmUmlnaHQgLSBmSGFsZldpZHRoLCBmVG9wIC0gZkhhbGZXaWR0aCwgRlhQVF9MSU5FVE8pOworICAgICAgICBwYXRoTFQuU2V0UG9pbnQoMywgZlJpZ2h0IC0gZkhhbGZXaWR0aCAqIDIsIGZUb3AgLSBmSGFsZldpZHRoICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYUFRfTElORVRPKTsKKyAgICAgICAgcGF0aExULlNldFBvaW50KDQsIGZMZWZ0ICsgZkhhbGZXaWR0aCAqIDIsIGZUb3AgLSBmSGFsZldpZHRoICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYUFRfTElORVRPKTsKKyAgICAgICAgcGF0aExULlNldFBvaW50KDUsIGZMZWZ0ICsgZkhhbGZXaWR0aCAqIDIsIGZCb3R0b20gKyBmSGFsZldpZHRoICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYUFRfTElORVRPKTsKKyAgICAgICAgcGF0aExULlNldFBvaW50KDYsIGZMZWZ0ICsgZkhhbGZXaWR0aCwgZkJvdHRvbSArIGZIYWxmV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBGWFBUX0xJTkVUTyk7CiAKLQkJCQlwYXRoTFQuU2V0UG9pbnRDb3VudCg3KTsKLQkJCQlwYXRoTFQuU2V0UG9pbnQoMCwgZkxlZnQgKyBmSGFsZldpZHRoLCBmQm90dG9tICsgZkhhbGZXaWR0aCwgRlhQVF9NT1ZFVE8pOwotCQkJCXBhdGhMVC5TZXRQb2ludCgxLCBmTGVmdCArIGZIYWxmV2lkdGgsIGZUb3AgLSBmSGFsZldpZHRoLCBGWFBUX0xJTkVUTyk7Ci0JCQkJcGF0aExULlNldFBvaW50KDIsIGZSaWdodCAtIGZIYWxmV2lkdGgsIGZUb3AgLSBmSGFsZldpZHRoLCBGWFBUX0xJTkVUTyk7Ci0JCQkJcGF0aExULlNldFBvaW50KDMsIGZSaWdodCAtIGZIYWxmV2lkdGggKiAyLCBmVG9wIC0gZkhhbGZXaWR0aCAqIDIsIEZYUFRfTElORVRPKTsKLQkJCQlwYXRoTFQuU2V0UG9pbnQoNCwgZkxlZnQgKyBmSGFsZldpZHRoICogMiwgZlRvcCAtIGZIYWxmV2lkdGggKiAyLCBGWFBUX0xJTkVUTyk7Ci0JCQkJcGF0aExULlNldFBvaW50KDUsIGZMZWZ0ICsgZkhhbGZXaWR0aCAqIDIsIGZCb3R0b20gKyBmSGFsZldpZHRoICogMiwgRlhQVF9MSU5FVE8pOwotCQkJCXBhdGhMVC5TZXRQb2ludCg2LCBmTGVmdCArIGZIYWxmV2lkdGgsIGZCb3R0b20gKyBmSGFsZldpZHRoLCBGWFBUX0xJTkVUTyk7CisgICAgICAgIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoTFQsIHBVc2VyMkRldmljZSwgJmdzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMQ29sb3JUb0ZYQ29sb3IoY3JMZWZ0VG9wLCBuVHJhbnNwYXJhbmN5KSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhGSUxMX0FMVEVSTkFURSk7CiAKLQkJCQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aExULCBwVXNlcjJEZXZpY2UsICZnc2QsIFBXTENvbG9yVG9GWENvbG9yKGNyTGVmdFRvcCxuVHJhbnNwYXJhbmN5KSwgMCwgRlhGSUxMX0FMVEVSTkFURSk7CisgICAgICAgIENGWF9QYXRoRGF0YSBwYXRoUkI7CiAKLQkJCQlDRlhfUGF0aERhdGEgcGF0aFJCOworICAgICAgICBwYXRoUkIuU2V0UG9pbnRDb3VudCg3KTsKKyAgICAgICAgcGF0aFJCLlNldFBvaW50KDAsIGZSaWdodCAtIGZIYWxmV2lkdGgsIGZUb3AgLSBmSGFsZldpZHRoLCBGWFBUX01PVkVUTyk7CisgICAgICAgIHBhdGhSQi5TZXRQb2ludCgxLCBmUmlnaHQgLSBmSGFsZldpZHRoLCBmQm90dG9tICsgZkhhbGZXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYUFRfTElORVRPKTsKKyAgICAgICAgcGF0aFJCLlNldFBvaW50KDIsIGZMZWZ0ICsgZkhhbGZXaWR0aCwgZkJvdHRvbSArIGZIYWxmV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBGWFBUX0xJTkVUTyk7CisgICAgICAgIHBhdGhSQi5TZXRQb2ludCgzLCBmTGVmdCArIGZIYWxmV2lkdGggKiAyLCBmQm90dG9tICsgZkhhbGZXaWR0aCAqIDIsCisgICAgICAgICAgICAgICAgICAgICAgICBGWFBUX0xJTkVUTyk7CisgICAgICAgIHBhdGhSQi5TZXRQb2ludCg0LCBmUmlnaHQgLSBmSGFsZldpZHRoICogMiwgZkJvdHRvbSArIGZIYWxmV2lkdGggKiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhQVF9MSU5FVE8pOworICAgICAgICBwYXRoUkIuU2V0UG9pbnQoNSwgZlJpZ2h0IC0gZkhhbGZXaWR0aCAqIDIsIGZUb3AgLSBmSGFsZldpZHRoICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYUFRfTElORVRPKTsKKyAgICAgICAgcGF0aFJCLlNldFBvaW50KDYsIGZSaWdodCAtIGZIYWxmV2lkdGgsIGZUb3AgLSBmSGFsZldpZHRoLCBGWFBUX0xJTkVUTyk7CiAKLQkJCQlwYXRoUkIuU2V0UG9pbnRDb3VudCg3KTsKLQkJCQlwYXRoUkIuU2V0UG9pbnQoMCwgZlJpZ2h0IC0gZkhhbGZXaWR0aCwgZlRvcCAtIGZIYWxmV2lkdGgsIEZYUFRfTU9WRVRPKTsKLQkJCQlwYXRoUkIuU2V0UG9pbnQoMSwgZlJpZ2h0IC0gZkhhbGZXaWR0aCwgZkJvdHRvbSArIGZIYWxmV2lkdGgsIEZYUFRfTElORVRPKTsKLQkJCQlwYXRoUkIuU2V0UG9pbnQoMiwgZkxlZnQgKyBmSGFsZldpZHRoLCBmQm90dG9tICsgZkhhbGZXaWR0aCwgRlhQVF9MSU5FVE8pOwotCQkJCXBhdGhSQi5TZXRQb2ludCgzLCBmTGVmdCArIGZIYWxmV2lkdGggKiAyLCBmQm90dG9tICsgZkhhbGZXaWR0aCAqIDIsIEZYUFRfTElORVRPKTsKLQkJCQlwYXRoUkIuU2V0UG9pbnQoNCwgZlJpZ2h0IC0gZkhhbGZXaWR0aCAqIDIsIGZCb3R0b20gKyBmSGFsZldpZHRoICogMiwgRlhQVF9MSU5FVE8pOwotCQkJCXBhdGhSQi5TZXRQb2ludCg1LCBmUmlnaHQgLSBmSGFsZldpZHRoICogMiwgZlRvcCAtIGZIYWxmV2lkdGggKiAyLCBGWFBUX0xJTkVUTyk7Ci0JCQkJcGF0aFJCLlNldFBvaW50KDYsIGZSaWdodCAtIGZIYWxmV2lkdGgsIGZUb3AgLSBmSGFsZldpZHRoLCBGWFBUX0xJTkVUTyk7CisgICAgICAgIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoUkIsIHBVc2VyMkRldmljZSwgJmdzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMQ29sb3JUb0ZYQ29sb3IoY3JSaWdodEJvdHRvbSwgblRyYW5zcGFyYW5jeSksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRklMTF9BTFRFUk5BVEUpOwogCi0JCQkJcERldmljZS0+RHJhd1BhdGgoJnBhdGhSQiwgcFVzZXIyRGV2aWNlLCAmZ3NkLCBQV0xDb2xvclRvRlhDb2xvcihjclJpZ2h0Qm90dG9tLG5UcmFuc3BhcmFuY3kpLCAwLCBGWEZJTExfQUxURVJOQVRFKTsKKyAgICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGg7CiAKLQkJCQlDRlhfUGF0aERhdGEgcGF0aDsKKyAgICAgICAgcGF0aC5BcHBlbmRSZWN0KGZMZWZ0LCBmQm90dG9tLCBmUmlnaHQsIGZUb3ApOworICAgICAgICBwYXRoLkFwcGVuZFJlY3QoZkxlZnQgKyBmSGFsZldpZHRoLCBmQm90dG9tICsgZkhhbGZXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZSaWdodCAtIGZIYWxmV2lkdGgsIGZUb3AgLSBmSGFsZldpZHRoKTsKIAotCQkJCXBhdGguQXBwZW5kUmVjdChmTGVmdCwgZkJvdHRvbSwgZlJpZ2h0LCBmVG9wKTsKLQkJCQlwYXRoLkFwcGVuZFJlY3QoZkxlZnQgKyBmSGFsZldpZHRoLCBmQm90dG9tICsgZkhhbGZXaWR0aCwgZlJpZ2h0IC0gZkhhbGZXaWR0aCwgZlRvcCAtIGZIYWxmV2lkdGgpOworICAgICAgICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCAmZ3NkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xDb2xvclRvRlhDb2xvcihjb2xvciwgblRyYW5zcGFyYW5jeSksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRklMTF9BTFRFUk5BVEUpOworICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgUEJTX1VOREVSTElORUQ6IHsKKyAgICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGg7CiAKLQkJCQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCAmZ3NkLCBQV0xDb2xvclRvRlhDb2xvcihjb2xvcixuVHJhbnNwYXJhbmN5KSwgMCwgRlhGSUxMX0FMVEVSTkFURSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBQQlNfVU5ERVJMSU5FRDoKLQkJCXsKLQkJCQlDRlhfUGF0aERhdGEgcGF0aDsKKyAgICAgICAgcGF0aC5TZXRQb2ludENvdW50KDIpOworICAgICAgICBwYXRoLlNldFBvaW50KDAsIGZMZWZ0LCBmQm90dG9tICsgZldpZHRoIC8gMiwgRlhQVF9NT1ZFVE8pOworICAgICAgICBwYXRoLlNldFBvaW50KDEsIGZSaWdodCwgZkJvdHRvbSArIGZXaWR0aCAvIDIsIEZYUFRfTElORVRPKTsKIAotCQkJCXBhdGguU2V0UG9pbnRDb3VudCgyKTsKLQkJCQlwYXRoLlNldFBvaW50KDAsIGZMZWZ0LCBmQm90dG9tICsgZldpZHRoIC8gMiwgRlhQVF9NT1ZFVE8pOwotCQkJCXBhdGguU2V0UG9pbnQoMSwgZlJpZ2h0LCBmQm90dG9tICsgZldpZHRoIC8gMiwgRlhQVF9MSU5FVE8pOwotCQkJCQotCQkJCUNGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7Ci0JCQkJZ3NkLm1fTGluZVdpZHRoID0gZldpZHRoOworICAgICAgICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOworICAgICAgICBnc2QubV9MaW5lV2lkdGggPSBmV2lkdGg7CiAKLQkJCQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCAmZ3NkLDAsICBQV0xDb2xvclRvRlhDb2xvcihjb2xvcixuVHJhbnNwYXJhbmN5KSwgRlhGSUxMX0FMVEVSTkFURSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBQQlNfU0hBRE9XOgotCQkJewotCQkJCUNGWF9QYXRoRGF0YSBwYXRoOwotCQkJCXBhdGguQXBwZW5kUmVjdChmTGVmdCwgZkJvdHRvbSwgZlJpZ2h0LCBmVG9wKTsKLQkJCQlwYXRoLkFwcGVuZFJlY3QoZkxlZnQgKyBmV2lkdGgsIGZCb3R0b20gKyBmV2lkdGgsIGZSaWdodCAtIGZXaWR0aCwgZlRvcCAtIGZXaWR0aCk7Ci0JCQkJcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgTlVMTCwgUFdMQ29sb3JUb0ZYQ29sb3IoY29sb3IsblRyYW5zcGFyYW5jeS8yKSwgMCwgRlhGSUxMX0FMVEVSTkFURSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCX0KKyAgICAgICAgcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgJmdzZCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMQ29sb3JUb0ZYQ29sb3IoY29sb3IsIG5UcmFuc3BhcmFuY3kpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWEZJTExfQUxURVJOQVRFKTsKKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIFBCU19TSEFET1c6IHsKKyAgICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGg7CisgICAgICAgIHBhdGguQXBwZW5kUmVjdChmTGVmdCwgZkJvdHRvbSwgZlJpZ2h0LCBmVG9wKTsKKyAgICAgICAgcGF0aC5BcHBlbmRSZWN0KGZMZWZ0ICsgZldpZHRoLCBmQm90dG9tICsgZldpZHRoLCBmUmlnaHQgLSBmV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBmVG9wIC0gZldpZHRoKTsKKyAgICAgICAgcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMQ29sb3JUb0ZYQ29sb3IoY29sb3IsIG5UcmFuc3BhcmFuY3kgLyAyKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhGSUxMX0FMVEVSTkFURSk7CisgICAgICB9IGJyZWFrOworICAgIH0KKyAgfQogfQogCi1zdGF0aWMgdm9pZCBBZGRTcXVpZ2dseVBhdGgoQ0ZYX1BhdGhEYXRhICYgUGF0aERhdGEsIEZYX0ZMT0FUIGZTdGFydFgsIEZYX0ZMT0FUIGZFbmRYLCBGWF9GTE9BVCBmWSwgRlhfRkxPQVQgZlN0ZXApCi17Ci0JUGF0aERhdGEuQWRkUG9pbnRDb3VudCgxKTsKLQlQYXRoRGF0YS5TZXRQb2ludChQYXRoRGF0YS5HZXRQb2ludENvdW50KCkgLSAxLCBmU3RhcnRYLCBmWSwgRlhQVF9NT1ZFVE8pOworc3RhdGljIHZvaWQgQWRkU3F1aWdnbHlQYXRoKENGWF9QYXRoRGF0YSYgUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlN0YXJ0WCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRW5kWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU3RlcCkgeworICBQYXRoRGF0YS5BZGRQb2ludENvdW50KDEpOworICBQYXRoRGF0YS5TZXRQb2ludChQYXRoRGF0YS5HZXRQb2ludENvdW50KCkgLSAxLCBmU3RhcnRYLCBmWSwgRlhQVF9NT1ZFVE8pOwogCi0JRlhfRkxPQVQgZng7Ci0JRlhfSU5UMzIgaTsKKyAgRlhfRkxPQVQgZng7CisgIGludDMyX3QgaTsKIAotCWZvciAoaT0xLGZ4PWZTdGFydFgrZlN0ZXA7IGZ4PGZFbmRYOyBmeCs9ZlN0ZXAsaSsrKQotCXsKLQkJUGF0aERhdGEuQWRkUG9pbnRDb3VudCgxKTsKLQkJUGF0aERhdGEuU2V0UG9pbnQoUGF0aERhdGEuR2V0UG9pbnRDb3VudCgpIC0gMSwgZngsIGZZICsgKGkmMSkqZlN0ZXAsIEZYUFRfTElORVRPKTsKLQl9CisgIGZvciAoaSA9IDEsIGZ4ID0gZlN0YXJ0WCArIGZTdGVwOyBmeCA8IGZFbmRYOyBmeCArPSBmU3RlcCwgaSsrKSB7CisgICAgUGF0aERhdGEuQWRkUG9pbnRDb3VudCgxKTsKKyAgICBQYXRoRGF0YS5TZXRQb2ludChQYXRoRGF0YS5HZXRQb2ludENvdW50KCkgLSAxLCBmeCwgZlkgKyAoaSAmIDEpICogZlN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgRlhQVF9MSU5FVE8pOworICB9CiB9CiAKLXN0YXRpYyB2b2lkIEFkZFNwZWxsQ2hlY2tPYmooQ0ZYX1BhdGhEYXRhICYgUGF0aERhdGEsIElGWF9FZGl0KiBwRWRpdCwgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyV29yZCkKLXsKLQlGWF9GTE9BVCBmU3RhcnRYID0gMC4wZjsKLQlGWF9GTE9BVCBmRW5kWCA9IDAuMGY7Ci0JRlhfRkxPQVQgZlkgPSAwLjBmOwotCUZYX0ZMT0FUIGZTdGVwID0gMC4wZjsgCitzdGF0aWMgdm9pZCBBZGRTcGVsbENoZWNrT2JqKENGWF9QYXRoRGF0YSYgUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9FZGl0KiBwRWRpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyV29yZCkgeworICBGWF9GTE9BVCBmU3RhcnRYID0gMC4wZjsKKyAgRlhfRkxPQVQgZkVuZFggPSAwLjBmOworICBGWF9GTE9BVCBmWSA9IDAuMGY7CisgIEZYX0ZMT0FUIGZTdGVwID0gMC4wZjsKIAotCUZYX0JPT0wgYkJyZWFrID0gRkFMU0U7CisgIEZYX0JPT0wgYkJyZWFrID0gRkFMU0U7CiAKLQlpZiAoSUZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IHBFZGl0LT5HZXRJdGVyYXRvcigpKQotCXsKLQkJcEl0ZXJhdG9yLT5TZXRBdCh3cldvcmQuQmVnaW5Qb3MpOworICBpZiAoSUZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IHBFZGl0LT5HZXRJdGVyYXRvcigpKSB7CisgICAgcEl0ZXJhdG9yLT5TZXRBdCh3cldvcmQuQmVnaW5Qb3MpOwogCi0JCWRvCi0JCXsKLQkJCUNQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOworICAgIGRvIHsKKyAgICAgIENQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOwogCi0JCQlDUFZUX0xpbmUgbGluZTsJCQkJCi0JCQlpZiAocEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpKQotCQkJewotCQkJCWZZID0gbGluZS5wdExpbmUueTsKLQkJCQlmU3RlcCA9IChsaW5lLmZMaW5lQXNjZW50IC0gbGluZS5mTGluZURlc2NlbnQpIC8gMTYuMGY7Ci0JCQl9CisgICAgICBDUFZUX0xpbmUgbGluZTsKKyAgICAgIGlmIChwSXRlcmF0b3ItPkdldExpbmUobGluZSkpIHsKKyAgICAgICAgZlkgPSBsaW5lLnB0TGluZS55OworICAgICAgICBmU3RlcCA9IChsaW5lLmZMaW5lQXNjZW50IC0gbGluZS5mTGluZURlc2NlbnQpIC8gMTYuMGY7CisgICAgICB9CiAKLQkJCWlmIChwbGFjZS5MaW5lQ21wKHdyV29yZC5CZWdpblBvcykgPT0gMCkKLQkJCXsKLQkJCQlwSXRlcmF0b3ItPlNldEF0KHdyV29yZC5CZWdpblBvcyk7Ci0JCQkJQ1BWVF9Xb3JkIHdvcmQ7Ci0JCQkJaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkKLQkJCQl7Ci0JCQkJCWZTdGFydFggPSB3b3JkLnB0V29yZC54OwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlmU3RhcnRYID0gbGluZS5wdExpbmUueDsKLQkJCX0KKyAgICAgIGlmIChwbGFjZS5MaW5lQ21wKHdyV29yZC5CZWdpblBvcykgPT0gMCkgeworICAgICAgICBwSXRlcmF0b3ItPlNldEF0KHdyV29yZC5CZWdpblBvcyk7CisgICAgICAgIENQVlRfV29yZCB3b3JkOworICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7CisgICAgICAgICAgZlN0YXJ0WCA9IHdvcmQucHRXb3JkLng7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZTdGFydFggPSBsaW5lLnB0TGluZS54OworICAgICAgfQogCi0JCQlpZiAocGxhY2UuTGluZUNtcCh3cldvcmQuRW5kUG9zKSA9PSAwKQotCQkJewotCQkJCXBJdGVyYXRvci0+U2V0QXQod3JXb3JkLkVuZFBvcyk7Ci0JCQkJQ1BWVF9Xb3JkIHdvcmQ7Ci0JCQkJaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkKLQkJCQl7Ci0JCQkJCWZFbmRYID0gd29yZC5wdFdvcmQueCArIHdvcmQuZldpZHRoOwotCQkJCX0KKyAgICAgIGlmIChwbGFjZS5MaW5lQ21wKHdyV29yZC5FbmRQb3MpID09IDApIHsKKyAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdCh3cldvcmQuRW5kUG9zKTsKKyAgICAgICAgQ1BWVF9Xb3JkIHdvcmQ7CisgICAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKKyAgICAgICAgICBmRW5kWCA9IHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aDsKKyAgICAgICAgfQogCi0JCQkJYkJyZWFrID0gVFJVRTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlmRW5kWCA9IGxpbmUucHRMaW5lLnggKyBsaW5lLmZMaW5lV2lkdGg7Ci0JCQl9CisgICAgICAgIGJCcmVhayA9IFRSVUU7CisgICAgICB9IGVsc2UgeworICAgICAgICBmRW5kWCA9IGxpbmUucHRMaW5lLnggKyBsaW5lLmZMaW5lV2lkdGg7CisgICAgICB9CiAKLQkJCUFkZFNxdWlnZ2x5UGF0aChQYXRoRGF0YSwgZlN0YXJ0WCwgZkVuZFgsIGZZLCBmU3RlcCk7CisgICAgICBBZGRTcXVpZ2dseVBhdGgoUGF0aERhdGEsIGZTdGFydFgsIGZFbmRYLCBmWSwgZlN0ZXApOwogCi0JCQlpZiAoYkJyZWFrKSBicmVhazsKLQkJfQotCQl3aGlsZSAocEl0ZXJhdG9yLT5OZXh0TGluZSgpKTsKLQl9CisgICAgICBpZiAoYkJyZWFrKQorICAgICAgICBicmVhazsKKyAgICB9IHdoaWxlIChwSXRlcmF0b3ItPk5leHRMaW5lKCkpOworICB9CiB9CiAKLXZvaWQgQ1BXTF9VdGlsczo6RHJhd0VkaXRTcGVsbENoZWNrKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsIElGWF9FZGl0KiBwRWRpdCwgCi0JCQkJCQljb25zdCBDUERGX1JlY3QmIHJjQ2xpcCwgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsIAotCQkJCQkJSVBXTF9TcGVsbENoZWNrICogcFNwZWxsQ2hlY2spCi17Ci0JY29uc3QgRlhfQ09MT1JSRUYgY3JTcGVsbCA9IEFyZ2JFbmNvZGUoMjU1LDI1NSwwLDApOwordm9pZCBDUFdMX1V0aWxzOjpEcmF3RWRpdFNwZWxsQ2hlY2soQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9FZGl0KiBwRWRpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgcmNDbGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Qb2ludCYgcHRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBXTF9TcGVsbENoZWNrKiBwU3BlbGxDaGVjaykgeworICBjb25zdCBGWF9DT0xPUlJFRiBjclNwZWxsID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMCwgMCk7CiAKLQkvL2ZvciBzcGVsbGNoZWNrCi0JRlhfQk9PTCBiTGF0aW5Xb3JkID0gRkFMU0U7Ci0JQ1BWVF9Xb3JkUGxhY2Ugd3BXb3JkU3RhcnQ7Ci0JQ0ZYX0J5dGVTdHJpbmcgc0xhdGluV29yZDsKKyAgLy8gZm9yIHNwZWxsY2hlY2sKKyAgRlhfQk9PTCBiTGF0aW5Xb3JkID0gRkFMU0U7CisgIENQVlRfV29yZFBsYWNlIHdwV29yZFN0YXJ0OworICBDRlhfQnl0ZVN0cmluZyBzTGF0aW5Xb3JkOwogCi0JQ0ZYX1BhdGhEYXRhIHBhdGhTcGVsbDsKKyAgQ0ZYX1BhdGhEYXRhIHBhdGhTcGVsbDsKIAotCXBEZXZpY2UtPlNhdmVTdGF0ZSgpOworICBwRGV2aWNlLT5TYXZlU3RhdGUoKTsKIAotCWlmICghcmNDbGlwLklzRW1wdHkoKSkKLQl7Ci0JCUNQREZfUmVjdCByY1RlbXAgPSByY0NsaXA7Ci0JCXBVc2VyMkRldmljZS0+VHJhbnNmb3JtUmVjdChyY1RlbXApOwotCQlGWF9SRUNUIHJjRGV2Q2xpcDsKLQkJcmNEZXZDbGlwLmxlZnQgPSAoRlhfSU5UMzIpcmNUZW1wLmxlZnQ7Ci0JCXJjRGV2Q2xpcC5yaWdodCA9IChGWF9JTlQzMilyY1RlbXAucmlnaHQ7Ci0JCXJjRGV2Q2xpcC50b3AgPSAoRlhfSU5UMzIpcmNUZW1wLnRvcDsKLQkJcmNEZXZDbGlwLmJvdHRvbSA9IChGWF9JTlQzMilyY1RlbXAuYm90dG9tOwotCQlwRGV2aWNlLT5TZXRDbGlwX1JlY3QoJnJjRGV2Q2xpcCk7Ci0JfQorICBpZiAoIXJjQ2xpcC5Jc0VtcHR5KCkpIHsKKyAgICBDUERGX1JlY3QgcmNUZW1wID0gcmNDbGlwOworICAgIHBVc2VyMkRldmljZS0+VHJhbnNmb3JtUmVjdChyY1RlbXApOworICAgIEZYX1JFQ1QgcmNEZXZDbGlwOworICAgIHJjRGV2Q2xpcC5sZWZ0ID0gKGludDMyX3QpcmNUZW1wLmxlZnQ7CisgICAgcmNEZXZDbGlwLnJpZ2h0ID0gKGludDMyX3QpcmNUZW1wLnJpZ2h0OworICAgIHJjRGV2Q2xpcC50b3AgPSAoaW50MzJfdClyY1RlbXAudG9wOworICAgIHJjRGV2Q2xpcC5ib3R0b20gPSAoaW50MzJfdClyY1RlbXAuYm90dG9tOworICAgIHBEZXZpY2UtPlNldENsaXBfUmVjdCgmcmNEZXZDbGlwKTsKKyAgfQogCi0JaWYgKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBwRWRpdC0+R2V0SXRlcmF0b3IoKSkKLQl7Ci0JCWlmIChwRWRpdC0+R2V0Rm9udE1hcCgpKQotCQl7Ci0JCQlpZiAocFJhbmdlKQotCQkJCXBJdGVyYXRvci0+U2V0QXQocFJhbmdlLT5CZWdpblBvcyk7Ci0JCQllbHNlCi0JCQkJcEl0ZXJhdG9yLT5TZXRBdCgwKTsKKyAgaWYgKElGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBwRWRpdC0+R2V0SXRlcmF0b3IoKSkgeworICAgIGlmIChwRWRpdC0+R2V0Rm9udE1hcCgpKSB7CisgICAgICBpZiAocFJhbmdlKQorICAgICAgICBwSXRlcmF0b3ItPlNldEF0KHBSYW5nZS0+QmVnaW5Qb3MpOworICAgICAgZWxzZQorICAgICAgICBwSXRlcmF0b3ItPlNldEF0KDApOwogCi0JCQlDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZTsJCQkKKyAgICAgIENQVlRfV29yZFBsYWNlIG9sZHBsYWNlOworCisgICAgICB3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKSB7CisgICAgICAgIENQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOworICAgICAgICBpZiAocFJhbmdlICYmIHBsYWNlLldvcmRDbXAocFJhbmdlLT5FbmRQb3MpID4gMCkKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBDUFZUX1dvcmQgd29yZDsKKyAgICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgeworICAgICAgICAgIGlmIChGWF9FRElUX0lTTEFUSU5XT1JEKHdvcmQuV29yZCkpIHsKKyAgICAgICAgICAgIGlmICghYkxhdGluV29yZCkgeworICAgICAgICAgICAgICB3cFdvcmRTdGFydCA9IHBsYWNlOworICAgICAgICAgICAgICBiTGF0aW5Xb3JkID0gVFJVRTsKKyAgICAgICAgICAgIH0KIAotCQkJd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkKLQkJCXsKLQkJCQlDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKLQkJCQlpZiAocFJhbmdlICYmIHBsYWNlLldvcmRDbXAocFJhbmdlLT5FbmRQb3MpID4gMCkgYnJlYWs7CQkJCQorICAgICAgICAgICAgc0xhdGluV29yZCArPSAoY2hhcil3b3JkLldvcmQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChiTGF0aW5Xb3JkKSB7CisgICAgICAgICAgICAgIGlmICghc0xhdGluV29yZC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAocFNwZWxsQ2hlY2sgJiYgIXBTcGVsbENoZWNrLT5DaGVja1dvcmQoc0xhdGluV29yZCkpIHsKKyAgICAgICAgICAgICAgICAgIEFkZFNwZWxsQ2hlY2tPYmoocGF0aFNwZWxsLCBwRWRpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BWVF9Xb3JkUmFuZ2Uod3BXb3JkU3RhcnQsIG9sZHBsYWNlKSk7CisgICAgICAgICAgICAgICAgICBwSXRlcmF0b3ItPlNldEF0KHBsYWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYkxhdGluV29yZCA9IEZBTFNFOworICAgICAgICAgICAgfQogCi0JCQkJQ1BWVF9Xb3JkIHdvcmQ7CQkJCQotCQkJCWlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpCi0JCQkJewotCQkJCQlpZiAoRlhfRURJVF9JU0xBVElOV09SRCh3b3JkLldvcmQpKQotCQkJCQl7Ci0JCQkJCQlpZiAoIWJMYXRpbldvcmQpCi0JCQkJCQl7Ci0JCQkJCQkJd3BXb3JkU3RhcnQgPSBwbGFjZTsKLQkJCQkJCQliTGF0aW5Xb3JkID0gVFJVRTsJCQkJCQkJCQotCQkJCQkJfQorICAgICAgICAgICAgc0xhdGluV29yZC5FbXB0eSgpOworICAgICAgICAgIH0KIAotCQkJCQkJc0xhdGluV29yZCArPSAoY2hhcil3b3JkLldvcmQ7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlpZiAoYkxhdGluV29yZCkKLQkJCQkJCXsKLQkJCQkJCQlpZiAoIXNMYXRpbldvcmQuSXNFbXB0eSgpKQotCQkJCQkJCXsKLQkJCQkJCQkJaWYgKHBTcGVsbENoZWNrICYmICFwU3BlbGxDaGVjay0+Q2hlY2tXb3JkKHNMYXRpbldvcmQpKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQlBZGRTcGVsbENoZWNrT2JqKHBhdGhTcGVsbCxwRWRpdCxDUFZUX1dvcmRSYW5nZSh3cFdvcmRTdGFydCxvbGRwbGFjZSkpOwkJCQkJCQkJCQotCQkJCQkJCQkJcEl0ZXJhdG9yLT5TZXRBdChwbGFjZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJYkxhdGluV29yZCA9IEZBTFNFOwotCQkJCQkJfQorICAgICAgICAgIG9sZHBsYWNlID0gcGxhY2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGJMYXRpbldvcmQpIHsKKyAgICAgICAgICAgIGlmICghc0xhdGluV29yZC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgaWYgKHBTcGVsbENoZWNrICYmICFwU3BlbGxDaGVjay0+Q2hlY2tXb3JkKHNMYXRpbldvcmQpKSB7CisgICAgICAgICAgICAgICAgQWRkU3BlbGxDaGVja09iaihwYXRoU3BlbGwsIHBFZGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BWVF9Xb3JkUmFuZ2Uod3BXb3JkU3RhcnQsIG9sZHBsYWNlKSk7CisgICAgICAgICAgICAgICAgcEl0ZXJhdG9yLT5TZXRBdChwbGFjZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJMYXRpbldvcmQgPSBGQUxTRTsKKyAgICAgICAgICB9CiAKLQkJCQkJCXNMYXRpbldvcmQuRW1wdHkoKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJb2xkcGxhY2UgPSBwbGFjZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJaWYgKGJMYXRpbldvcmQpCi0JCQkJCXsKLQkJCQkJCWlmICghc0xhdGluV29yZC5Jc0VtcHR5KCkpCi0JCQkJCQl7Ci0JCQkJCQkJaWYgKHBTcGVsbENoZWNrICYmICFwU3BlbGxDaGVjay0+Q2hlY2tXb3JkKHNMYXRpbldvcmQpKQotCQkJCQkJCXsKLQkJCQkJCQkJQWRkU3BlbGxDaGVja09iaihwYXRoU3BlbGwscEVkaXQsQ1BWVF9Xb3JkUmFuZ2Uod3BXb3JkU3RhcnQsb2xkcGxhY2UpKTsJCQkJCQkJCQkKLQkJCQkJCQkJcEl0ZXJhdG9yLT5TZXRBdChwbGFjZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYkxhdGluV29yZCA9IEZBTFNFOwotCQkJCQl9CisgICAgICAgICAgc0xhdGluV29yZC5FbXB0eSgpOworICAgICAgICB9CisgICAgICB9CiAKLQkJCQkJc0xhdGluV29yZC5FbXB0eSgpOwotCQkJCX0KLQkJCX0KKyAgICAgIGlmICghc0xhdGluV29yZC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKHBTcGVsbENoZWNrICYmICFwU3BlbGxDaGVjay0+Q2hlY2tXb3JkKHNMYXRpbldvcmQpKSB7CisgICAgICAgICAgQWRkU3BlbGxDaGVja09iaihwYXRoU3BlbGwsIHBFZGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BWVF9Xb3JkUmFuZ2Uod3BXb3JkU3RhcnQsIG9sZHBsYWNlKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KIAotCQkJaWYgKCFzTGF0aW5Xb3JkLklzRW1wdHkoKSkgCi0JCQl7Ci0JCQkJaWYgKHBTcGVsbENoZWNrICYmICFwU3BlbGxDaGVjay0+Q2hlY2tXb3JkKHNMYXRpbldvcmQpKQotCQkJCXsKLQkJCQkJQWRkU3BlbGxDaGVja09iaihwYXRoU3BlbGwscEVkaXQsQ1BWVF9Xb3JkUmFuZ2Uod3BXb3JkU3RhcnQsb2xkcGxhY2UpKTsJCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCUNGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7Ci0JZ3NkLm1fTGluZVdpZHRoID0gMDsKLQlpZiAocGF0aFNwZWxsLkdldFBvaW50Q291bnQoKSA+IDApCi0JCXBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoU3BlbGwsIHBVc2VyMkRldmljZSwgJmdzZCwgMCwgY3JTcGVsbCwgRlhGSUxMX0FMVEVSTkFURSk7CisgIENGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7CisgIGdzZC5tX0xpbmVXaWR0aCA9IDA7CisgIGlmIChwYXRoU3BlbGwuR2V0UG9pbnRDb3VudCgpID4gMCkKKyAgICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aFNwZWxsLCBwVXNlcjJEZXZpY2UsICZnc2QsIDAsIGNyU3BlbGwsCisgICAgICAgICAgICAgICAgICAgICAgRlhGSUxMX0FMVEVSTkFURSk7CiAKLQlwRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsKKyAgcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CiB9CiAKLUZYX0JPT0wgQ1BXTF9VdGlsczo6SXNCbGFja09yV2hpdGUoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpCi17Ci0Jc3dpdGNoIChjb2xvci5uQ29sb3JUeXBlKQotCXsKLQljYXNlIENPTE9SVFlQRV9UUkFOU1BBUkVOVDoKLQkJcmV0dXJuIEZBTFNFOwotCWNhc2UgQ09MT1JUWVBFX0dSQVk6Ci0JCXJldHVybiBjb2xvci5mQ29sb3IxIDwgMC41ZjsKLQljYXNlIENPTE9SVFlQRV9SR0I6Ci0JCXJldHVybiBjb2xvci5mQ29sb3IxICsgY29sb3IuZkNvbG9yMiArIGNvbG9yLmZDb2xvcjMgPCAxLjVmOwotCWNhc2UgQ09MT1JUWVBFX0NNWUs6Ci0JCXJldHVybiBjb2xvci5mQ29sb3IxICsgY29sb3IuZkNvbG9yMiArIGNvbG9yLmZDb2xvcjMgKyBjb2xvci5mQ29sb3I0ID4gMi4wZjsKLQl9CitGWF9CT09MIENQV0xfVXRpbHM6OklzQmxhY2tPcldoaXRlKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKSB7CisgIHN3aXRjaCAoY29sb3IubkNvbG9yVHlwZSkgeworICAgIGNhc2UgQ09MT1JUWVBFX1RSQU5TUEFSRU5UOgorICAgICAgcmV0dXJuIEZBTFNFOworICAgIGNhc2UgQ09MT1JUWVBFX0dSQVk6CisgICAgICByZXR1cm4gY29sb3IuZkNvbG9yMSA8IDAuNWY7CisgICAgY2FzZSBDT0xPUlRZUEVfUkdCOgorICAgICAgcmV0dXJuIGNvbG9yLmZDb2xvcjEgKyBjb2xvci5mQ29sb3IyICsgY29sb3IuZkNvbG9yMyA8IDEuNWY7CisgICAgY2FzZSBDT0xPUlRZUEVfQ01ZSzoKKyAgICAgIHJldHVybiBjb2xvci5mQ29sb3IxICsgY29sb3IuZkNvbG9yMiArIGNvbG9yLmZDb2xvcjMgKyBjb2xvci5mQ29sb3I0ID4KKyAgICAgICAgICAgICAyLjBmOworICB9CiAKLQlyZXR1cm4gVFJVRTsKKyAgcmV0dXJuIFRSVUU7CiB9CiAKLUNQV0xfQ29sb3IgQ1BXTF9VdGlsczo6R2V0UmV2ZXJzZUNvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKQotewotCUNQV0xfQ29sb3IgY3JSZXQgPSBjb2xvcjsKK0NQV0xfQ29sb3IgQ1BXTF9VdGlsczo6R2V0UmV2ZXJzZUNvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKSB7CisgIENQV0xfQ29sb3IgY3JSZXQgPSBjb2xvcjsKIAotCXN3aXRjaCAoY29sb3IubkNvbG9yVHlwZSkKLQl7Ci0JY2FzZSBDT0xPUlRZUEVfR1JBWToKLQkJY3JSZXQuZkNvbG9yMSA9IDEuMGYgLSBjclJldC5mQ29sb3IxOwotCQlicmVhazsKLQljYXNlIENPTE9SVFlQRV9SR0I6Ci0JCWNyUmV0LmZDb2xvcjEgPSAxLjBmIC0gY3JSZXQuZkNvbG9yMTsKLQkJY3JSZXQuZkNvbG9yMiA9IDEuMGYgLSBjclJldC5mQ29sb3IyOwotCQljclJldC5mQ29sb3IzID0gMS4wZiAtIGNyUmV0LmZDb2xvcjM7Ci0JCWJyZWFrOwotCWNhc2UgQ09MT1JUWVBFX0NNWUs6Ci0JCWNyUmV0LmZDb2xvcjEgPSAxLjBmIC0gY3JSZXQuZkNvbG9yMTsKLQkJY3JSZXQuZkNvbG9yMiA9IDEuMGYgLSBjclJldC5mQ29sb3IyOwotCQljclJldC5mQ29sb3IzID0gMS4wZiAtIGNyUmV0LmZDb2xvcjM7Ci0JCWNyUmV0LmZDb2xvcjQgPSAxLjBmIC0gY3JSZXQuZkNvbG9yNDsKLQkJYnJlYWs7Ci0JfQorICBzd2l0Y2ggKGNvbG9yLm5Db2xvclR5cGUpIHsKKyAgICBjYXNlIENPTE9SVFlQRV9HUkFZOgorICAgICAgY3JSZXQuZkNvbG9yMSA9IDEuMGYgLSBjclJldC5mQ29sb3IxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDT0xPUlRZUEVfUkdCOgorICAgICAgY3JSZXQuZkNvbG9yMSA9IDEuMGYgLSBjclJldC5mQ29sb3IxOworICAgICAgY3JSZXQuZkNvbG9yMiA9IDEuMGYgLSBjclJldC5mQ29sb3IyOworICAgICAgY3JSZXQuZkNvbG9yMyA9IDEuMGYgLSBjclJldC5mQ29sb3IzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDT0xPUlRZUEVfQ01ZSzoKKyAgICAgIGNyUmV0LmZDb2xvcjEgPSAxLjBmIC0gY3JSZXQuZkNvbG9yMTsKKyAgICAgIGNyUmV0LmZDb2xvcjIgPSAxLjBmIC0gY3JSZXQuZkNvbG9yMjsKKyAgICAgIGNyUmV0LmZDb2xvcjMgPSAxLjBmIC0gY3JSZXQuZkNvbG9yMzsKKyAgICAgIGNyUmV0LmZDb2xvcjQgPSAxLjBmIC0gY3JSZXQuZkNvbG9yNDsKKyAgICAgIGJyZWFrOworICB9CiAKLQlyZXR1cm4gY3JSZXQ7CisgIHJldHVybiBjclJldDsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0SWNvbkFwcFN0cmVhbShGWF9JTlQzMiBuVHlwZSwgY29uc3QgQ1BERl9SZWN0JiByZWN0LCBjb25zdCBDUFdMX0NvbG9yJiBjckZpbGwsIAotCQkJCQkJCQkJCQkJY29uc3QgQ1BXTF9Db2xvciYgY3JTdHJva2UpCi17Ci0JQ0ZYX0J5dGVTdHJpbmcgc0FwcFN0cmVhbSA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyU3Ryb2tlLCBGQUxTRSk7Ci0Jc0FwcFN0cmVhbSArPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjckZpbGwsIFRSVUUpOworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0SWNvbkFwcFN0cmVhbShpbnQzMl90IG5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyRmlsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JTdHJva2UpIHsKKyAgQ0ZYX0J5dGVTdHJpbmcgc0FwcFN0cmVhbSA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyU3Ryb2tlLCBGQUxTRSk7CisgIHNBcHBTdHJlYW0gKz0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JGaWxsLCBUUlVFKTsKIAotCUNGWF9CeXRlU3RyaW5nIHNQYXRoOwotCUNGWF9QYXRoRGF0YSBwYXRoOworICBDRlhfQnl0ZVN0cmluZyBzUGF0aDsKKyAgQ0ZYX1BhdGhEYXRhIHBhdGg7CiAKLQlzd2l0Y2ggKG5UeXBlKQotCXsKLQljYXNlIFBXTF9JQ09OVFlQRV9DSEVDS01BUks6Ci0JCUdldEdyYXBoaWNzX0NoZWNrbWFyayhzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsJCi0JCWJyZWFrOwotCWNhc2UgUFdMX0lDT05UWVBFX0NJUkNMRToKLQkJR2V0R3JhcGhpY3NfQ2lyY2xlKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOwotCQlicmVhazsKLQljYXNlIFBXTF9JQ09OVFlQRV9DT01NRU5UOgotCQlHZXRHcmFwaGljc19Db21tZW50KHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOwotCQlicmVhazsKLQljYXNlIFBXTF9JQ09OVFlQRV9DUk9TUzoKLQkJR2V0R3JhcGhpY3NfQ3Jvc3Moc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1NUUkVBTSk7Ci0JCWJyZWFrOwotCWNhc2UgUFdMX0lDT05UWVBFX0hFTFA6Ci0JCUdldEdyYXBoaWNzX0hlbHAoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1NUUkVBTSk7Ci0JCWJyZWFrOwotCWNhc2UgUFdMX0lDT05UWVBFX0lOU0VSVFRFWFQ6Ci0JCUdldEdyYXBoaWNzX0luc2VydFRleHQoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1NUUkVBTSk7Ci0JCWJyZWFrOwotCWNhc2UgUFdMX0lDT05UWVBFX0tFWToKLQkJR2V0R3JhcGhpY3NfS2V5KHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOwotCQlicmVhazsKLQljYXNlIFBXTF9JQ09OVFlQRV9ORVdQQVJBR1JBUEg6Ci0JCUdldEdyYXBoaWNzX05ld1BhcmFncmFwaChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfVEVYVE5PVEU6Ci0JCUdldEdyYXBoaWNzX1RleHROb3RlKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOwotCQlicmVhazsKLQljYXNlIFBXTF9JQ09OVFlQRV9QQVJBR1JBUEg6Ci0JCUdldEdyYXBoaWNzX1BhcmFncmFwaChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfUklHSFRBUlJPVzoKLQkJR2V0R3JhcGhpY3NfUmlnaHRBcnJvdyhzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfUklHSFRQT0lOVEVSOgotCQlHZXRHcmFwaGljc19SaWdodFBvaW50ZXIoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1NUUkVBTSk7Ci0JCWJyZWFrOwotCWNhc2UgUFdMX0lDT05UWVBFX1NUQVI6Ci0JCUdldEdyYXBoaWNzX1N0YXIoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1NUUkVBTSk7Ci0JCWJyZWFrOwotCWNhc2UgUFdMX0lDT05UWVBFX1VQQVJST1c6Ci0JCUdldEdyYXBoaWNzX1VwQXJyb3coc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1NUUkVBTSk7Ci0JCWJyZWFrOwotCWNhc2UgUFdMX0lDT05UWVBFX1VQTEVGVEFSUk9XOgotCQlHZXRHcmFwaGljc19VcExlZnRBcnJvdyhzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfR1JBUEg6Ci0JCUdldEdyYXBoaWNzX0dyYXBoKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOwotCQlicmVhazsKLQljYXNlIFBXTF9JQ09OVFlQRV9QQVBFUkNMSVA6Ci0JCUdldEdyYXBoaWNzX1BhcGVyY2xpcChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfQVRUQUNITUVOVDoKLQkJR2V0R3JhcGhpY3NfQXR0YWNobWVudChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfVEFHOgotCQlHZXRHcmFwaGljc19UYWcoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1NUUkVBTSk7Ci0JCWJyZWFrOwotCWNhc2UgUFdMX0lDT05UWVBFX0ZPWElUOgotCQlHZXRHcmFwaGljc19Gb3hpdChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKLQkJYnJlYWs7Ci0JfQorICBzd2l0Y2ggKG5UeXBlKSB7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfQ0hFQ0tNQVJLOgorICAgICAgR2V0R3JhcGhpY3NfQ2hlY2ttYXJrKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfQ0lSQ0xFOgorICAgICAgR2V0R3JhcGhpY3NfQ2lyY2xlKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfQ09NTUVOVDoKKyAgICAgIEdldEdyYXBoaWNzX0NvbW1lbnQoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1NUUkVBTSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9DUk9TUzoKKyAgICAgIEdldEdyYXBoaWNzX0Nyb3NzKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfSEVMUDoKKyAgICAgIEdldEdyYXBoaWNzX0hlbHAoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1NUUkVBTSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9JTlNFUlRURVhUOgorICAgICAgR2V0R3JhcGhpY3NfSW5zZXJ0VGV4dChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdMX0lDT05UWVBFX0tFWToKKyAgICAgIEdldEdyYXBoaWNzX0tleShzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdMX0lDT05UWVBFX05FV1BBUkFHUkFQSDoKKyAgICAgIEdldEdyYXBoaWNzX05ld1BhcmFncmFwaChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdMX0lDT05UWVBFX1RFWFROT1RFOgorICAgICAgR2V0R3JhcGhpY3NfVGV4dE5vdGUoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1NUUkVBTSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9QQVJBR1JBUEg6CisgICAgICBHZXRHcmFwaGljc19QYXJhZ3JhcGgoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1NUUkVBTSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9SSUdIVEFSUk9XOgorICAgICAgR2V0R3JhcGhpY3NfUmlnaHRBcnJvdyhzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdMX0lDT05UWVBFX1JJR0hUUE9JTlRFUjoKKyAgICAgIEdldEdyYXBoaWNzX1JpZ2h0UG9pbnRlcihzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdMX0lDT05UWVBFX1NUQVI6CisgICAgICBHZXRHcmFwaGljc19TdGFyKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfVVBBUlJPVzoKKyAgICAgIEdldEdyYXBoaWNzX1VwQXJyb3coc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1NUUkVBTSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9VUExFRlRBUlJPVzoKKyAgICAgIEdldEdyYXBoaWNzX1VwTGVmdEFycm93KHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfR1JBUEg6CisgICAgICBHZXRHcmFwaGljc19HcmFwaChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdMX0lDT05UWVBFX1BBUEVSQ0xJUDoKKyAgICAgIEdldEdyYXBoaWNzX1BhcGVyY2xpcChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdMX0lDT05UWVBFX0FUVEFDSE1FTlQ6CisgICAgICBHZXRHcmFwaGljc19BdHRhY2htZW50KHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfVEFHOgorICAgICAgR2V0R3JhcGhpY3NfVGFnKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9TVFJFQU0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfRk9YSVQ6CisgICAgICBHZXRHcmFwaGljc19Gb3hpdChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfU1RSRUFNKTsKKyAgICAgIGJyZWFrOworICB9CiAKLQlzQXBwU3RyZWFtICs9IHNQYXRoOwotCWlmIChjclN0cm9rZS5uQ29sb3JUeXBlICE9IENPTE9SVFlQRV9UUkFOU1BBUkVOVCkKLQkJc0FwcFN0cmVhbSArPSAiQipcbiI7Ci0JZWxzZQotCQlzQXBwU3RyZWFtICs9ICJmKlxuIjsKKyAgc0FwcFN0cmVhbSArPSBzUGF0aDsKKyAgaWYgKGNyU3Ryb2tlLm5Db2xvclR5cGUgIT0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UKQorICAgIHNBcHBTdHJlYW0gKz0gIkIqXG4iOworICBlbHNlCisgICAgc0FwcFN0cmVhbSArPSAiZipcbiI7CiAKLQlyZXR1cm4gc0FwcFN0cmVhbTsKKyAgcmV0dXJuIHNBcHBTdHJlYW07CiB9CiAKLXZvaWQgQ1BXTF9VdGlsczo6RHJhd0ljb25BcHBTdHJlYW0oQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSwKLQkJCQkJCUZYX0lOVDMyIG5UeXBlLCBjb25zdCBDUERGX1JlY3QgJiByZWN0LCBjb25zdCBDUFdMX0NvbG9yJiBjckZpbGwsIGNvbnN0IENQV0xfQ29sb3ImIGNyU3Ryb2tlLCBjb25zdCBGWF9JTlQzMiBuVHJhbnNwYXJhbmN5KQotewotCUNGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7Ci0JZ3NkLm1fTGluZVdpZHRoID0gMS4wZjsKK3ZvaWQgQ1BXTF9VdGlsczo6RHJhd0ljb25BcHBTdHJlYW0oQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyRmlsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JTdHJva2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgblRyYW5zcGFyYW5jeSkgeworICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOworICBnc2QubV9MaW5lV2lkdGggPSAxLjBmOwogCi0JQ0ZYX0J5dGVTdHJpbmcgc1BhdGg7Ci0JQ0ZYX1BhdGhEYXRhIHBhdGg7CisgIENGWF9CeXRlU3RyaW5nIHNQYXRoOworICBDRlhfUGF0aERhdGEgcGF0aDsKIAotCXN3aXRjaCAoblR5cGUpCi0JewotCWNhc2UgUFdMX0lDT05UWVBFX0NIRUNLTUFSSzoKLQkJR2V0R3JhcGhpY3NfQ2hlY2ttYXJrKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7Ci0JCWJyZWFrOwotCWNhc2UgUFdMX0lDT05UWVBFX0NJUkNMRToKLQkJR2V0R3JhcGhpY3NfQ2lyY2xlKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7Ci0JCWJyZWFrOwotCWNhc2UgUFdMX0lDT05UWVBFX0NPTU1FTlQ6Ci0JCUdldEdyYXBoaWNzX0NvbW1lbnQoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1BBVEhEQVRBKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfQ1JPU1M6Ci0JCUdldEdyYXBoaWNzX0Nyb3NzKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7Ci0JCWJyZWFrOwotCWNhc2UgUFdMX0lDT05UWVBFX0hFTFA6Ci0JCUdldEdyYXBoaWNzX0hlbHAoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1BBVEhEQVRBKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfSU5TRVJUVEVYVDoKLQkJR2V0R3JhcGhpY3NfSW5zZXJ0VGV4dChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOwotCQlicmVhazsKLQljYXNlIFBXTF9JQ09OVFlQRV9LRVk6Ci0JCUdldEdyYXBoaWNzX0tleShzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOwotCQlicmVhazsKLQljYXNlIFBXTF9JQ09OVFlQRV9ORVdQQVJBR1JBUEg6Ci0JCUdldEdyYXBoaWNzX05ld1BhcmFncmFwaChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOwotCQlicmVhazsKLQljYXNlIFBXTF9JQ09OVFlQRV9URVhUTk9URToKLQkJR2V0R3JhcGhpY3NfVGV4dE5vdGUoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1BBVEhEQVRBKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfUEFSQUdSQVBIOgotCQlHZXRHcmFwaGljc19QYXJhZ3JhcGgoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1BBVEhEQVRBKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfUklHSFRBUlJPVzoKLQkJR2V0R3JhcGhpY3NfUmlnaHRBcnJvdyhzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOwotCQlicmVhazsKLQljYXNlIFBXTF9JQ09OVFlQRV9SSUdIVFBPSU5URVI6Ci0JCUdldEdyYXBoaWNzX1JpZ2h0UG9pbnRlcihzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOwotCQlicmVhazsKLQljYXNlIFBXTF9JQ09OVFlQRV9TVEFSOgotCQlHZXRHcmFwaGljc19TdGFyKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7Ci0JCWJyZWFrOwotCWNhc2UgUFdMX0lDT05UWVBFX1VQQVJST1c6Ci0JCUdldEdyYXBoaWNzX1VwQXJyb3coc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1BBVEhEQVRBKTsKLQkJYnJlYWs7Ci0JY2FzZSBQV0xfSUNPTlRZUEVfVVBMRUZUQVJST1c6Ci0JCUdldEdyYXBoaWNzX1VwTGVmdEFycm93KHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7Ci0JCWJyZWFrOwotCWNhc2UgUFdMX0lDT05UWVBFX0dSQVBIOgotCQlHZXRHcmFwaGljc19HcmFwaChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOwotCQlicmVhazsKLQljYXNlIFBXTF9JQ09OVFlQRV9QQVBFUkNMSVA6Ci0JCUdldEdyYXBoaWNzX1BhcGVyY2xpcChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOwotCQlicmVhazsKLQljYXNlIFBXTF9JQ09OVFlQRV9BVFRBQ0hNRU5UOgotCQlHZXRHcmFwaGljc19BdHRhY2htZW50KHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7Ci0JCWJyZWFrOwotCWNhc2UgUFdMX0lDT05UWVBFX1RBRzoKLQkJR2V0R3JhcGhpY3NfVGFnKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7Ci0JCWJyZWFrOwotCWNhc2UgUFdMX0lDT05UWVBFX0ZPWElUOgotCQlHZXRHcmFwaGljc19Gb3hpdChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm47Ci0JfQorICBzd2l0Y2ggKG5UeXBlKSB7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfQ0hFQ0tNQVJLOgorICAgICAgR2V0R3JhcGhpY3NfQ2hlY2ttYXJrKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9DSVJDTEU6CisgICAgICBHZXRHcmFwaGljc19DaXJjbGUoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1BBVEhEQVRBKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdMX0lDT05UWVBFX0NPTU1FTlQ6CisgICAgICBHZXRHcmFwaGljc19Db21tZW50KHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9DUk9TUzoKKyAgICAgIEdldEdyYXBoaWNzX0Nyb3NzKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9IRUxQOgorICAgICAgR2V0R3JhcGhpY3NfSGVscChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfSU5TRVJUVEVYVDoKKyAgICAgIEdldEdyYXBoaWNzX0luc2VydFRleHQoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1BBVEhEQVRBKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdMX0lDT05UWVBFX0tFWToKKyAgICAgIEdldEdyYXBoaWNzX0tleShzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfTkVXUEFSQUdSQVBIOgorICAgICAgR2V0R3JhcGhpY3NfTmV3UGFyYWdyYXBoKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9URVhUTk9URToKKyAgICAgIEdldEdyYXBoaWNzX1RleHROb3RlKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9QQVJBR1JBUEg6CisgICAgICBHZXRHcmFwaGljc19QYXJhZ3JhcGgoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1BBVEhEQVRBKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdMX0lDT05UWVBFX1JJR0hUQVJST1c6CisgICAgICBHZXRHcmFwaGljc19SaWdodEFycm93KHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9SSUdIVFBPSU5URVI6CisgICAgICBHZXRHcmFwaGljc19SaWdodFBvaW50ZXIoc1BhdGgsIHBhdGgsIHJlY3QsIFBXTFBUX1BBVEhEQVRBKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFdMX0lDT05UWVBFX1NUQVI6CisgICAgICBHZXRHcmFwaGljc19TdGFyKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9VUEFSUk9XOgorICAgICAgR2V0R3JhcGhpY3NfVXBBcnJvdyhzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfVVBMRUZUQVJST1c6CisgICAgICBHZXRHcmFwaGljc19VcExlZnRBcnJvdyhzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfR1JBUEg6CisgICAgICBHZXRHcmFwaGljc19HcmFwaChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfUEFQRVJDTElQOgorICAgICAgR2V0R3JhcGhpY3NfUGFwZXJjbGlwKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9BVFRBQ0hNRU5UOgorICAgICAgR2V0R3JhcGhpY3NfQXR0YWNobWVudChzUGF0aCwgcGF0aCwgcmVjdCwgUFdMUFRfUEFUSERBVEEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQV0xfSUNPTlRZUEVfVEFHOgorICAgICAgR2V0R3JhcGhpY3NfVGFnKHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBXTF9JQ09OVFlQRV9GT1hJVDoKKyAgICAgIEdldEdyYXBoaWNzX0ZveGl0KHNQYXRoLCBwYXRoLCByZWN0LCBQV0xQVF9QQVRIREFUQSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuOworICB9CiAKLQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCAmZ3NkLCAKLQkJUFdMQ29sb3JUb0ZYQ29sb3IoY3JGaWxsLG5UcmFuc3BhcmFuY3kpLCBQV0xDb2xvclRvRlhDb2xvcihjclN0cm9rZSxuVHJhbnNwYXJhbmN5KSwgRlhGSUxMX0FMVEVSTkFURSk7CisgIHBEZXZpY2UtPkRyYXdQYXRoKAorICAgICAgJnBhdGgsIHBVc2VyMkRldmljZSwgJmdzZCwgUFdMQ29sb3JUb0ZYQ29sb3IoY3JGaWxsLCBuVHJhbnNwYXJhbmN5KSwKKyAgICAgIFBXTENvbG9yVG9GWENvbG9yKGNyU3Ryb2tlLCBuVHJhbnNwYXJhbmN5KSwgRlhGSUxMX0FMVEVSTkFURSk7CiB9CiAKLXZvaWQgQ1BXTF9VdGlsczo6R2V0R3JhcGhpY3NfQ2hlY2ttYXJrKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkKLXsKLQlGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKLQlGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207Cit2b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX0NoZWNrbWFyayhDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpIHsKKyAgRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7CisgIEZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKIAotCUNQV0xfUGF0aERhdGEgUGF0aEFycmF5W10gPSAKLQl7Ci0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCAgKyBmV2lkdGggLyAxNS4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAyIC8gNS4wZiksUFdMUFRfTU9WRVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICArIGZXaWR0aCAvIDE1LjBmICsgUFdMX0JFWklFUiooZldpZHRoIC8gNy4wZiAtIGZXaWR0aCAvIDE1LjBmKSwgCi0JCQkJCSAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAyIC8gNS4wZiArIFBXTF9CRVpJRVIqKGZIZWlnaHQgKiAyIC8gNy4wZiAtIGZIZWlnaHQgKiAyIC8gNS4wZikpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDQuNWYgKyBQV0xfQkVaSUVSKihmV2lkdGggLyA1LjBmIC0gZldpZHRoIC8gNC41ZiksCi0JCQkJCSAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAxNi4wZiArIFBXTF9CRVpJRVIqKGZIZWlnaHQgLyA1LjBmIC0gZkhlaWdodCAvIDE2LjBmKSksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gNC41ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAxNi4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gNC41ZiArIFBXTF9CRVpJRVIqKGZXaWR0aCAvIDQuNGYgLSBmV2lkdGggLyA0LjVmKSwKLQkJICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDE2LjBmIC0gUFdMX0JFWklFUipmSGVpZ2h0IC8gMTYuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDMuMGYgKyBQV0xfQkVaSUVSKihmV2lkdGggLyA0LjBmIC0gZldpZHRoIC8gMy4wZiksCi0JCSAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMy4wZiwgY3JCQm94LmJvdHRvbSksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMy4wZiArIFBXTF9CRVpJRVIqZldpZHRoKigxLzcuMGYgKyAyLzE1LjBmKSwKLQkJICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgUFdMX0JFWklFUipmSGVpZ2h0ICogNCAvIDUuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCAgKyBmV2lkdGggKiAxNCAvIDE1LjBmICsgUFdMX0JFWklFUipmV2lkdGgqKDEvNy4wZiAtIDcvMTUuMGYpLAotCQkgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMTUvMTYuMGYgKyBQV0xfQkVaSUVSKihmSGVpZ2h0ICogNC81LjBmIC0gZkhlaWdodCAqIDE1LzE2LjBmKSksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICArIGZXaWR0aCAqIDE0IC8gMTUuMGYsY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAxNSAvIDE2LjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgICsgZldpZHRoICogMTQgLyAxNS4wZiArIFBXTF9CRVpJRVIqKGZXaWR0aCAqIDcgLyAxNS4wZiAtIGZXaWR0aCAqIDE0IC8gMTUuMGYpLAotCQkgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMTUgLyAxNi4wZiArIFBXTF9CRVpJRVIqKGZIZWlnaHQgKiA4IC8gNy4wZiAtIGZIZWlnaHQgKiAxNSAvIDE2LjBmKSksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMy42ZiArIFBXTF9CRVpJRVIqKGZXaWR0aCAvIDMuNGYgLSBmV2lkdGggLyAzLjZmKSwKLQkJICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDMuNWYgKyBQV0xfQkVaSUVSKihmSGVpZ2h0IC8gMy41ZiAtIGZIZWlnaHQgLyAzLjVmKSksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMy42ZixjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDMuNWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDMuNmYsCi0JCSAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAzLjVmICsgUFdMX0JFWklFUiooZkhlaWdodCAvIDQuMGYgLSBmSGVpZ2h0IC8gMy41ZikpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCAgKyBmV2lkdGggLyAxNS4wZiArIFBXTF9CRVpJRVIqKGZXaWR0aCAvIDMuNWYgLSBmV2lkdGggLyAxNS4wZiksCi0JCSAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAyIC8gNS4wZiArIFBXTF9CRVpJRVIqKGZIZWlnaHQgKiAzLjVmIC8gNS4wZiAtIGZIZWlnaHQgKiAyIC8gNS4wZikpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCAgKyBmV2lkdGggLyAxNS4wZixjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDIgLyA1LjBmKSwgUFdMUFRfQkVaSUVSVE8pCi0JfTsKKyAgQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbXSA9IHsKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDE1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMiAvIDUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KAorICAgICAgICAgICAgICBjckJCb3gubGVmdCArIGZXaWR0aCAvIDE1LjBmICsKKyAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiAoZldpZHRoIC8gNy4wZiAtIGZXaWR0aCAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAyIC8gNS4wZiArCisgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogKGZIZWlnaHQgKiAyIC8gNy4wZiAtIGZIZWlnaHQgKiAyIC8gNS4wZikpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDQuNWYgKworICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiAoZldpZHRoIC8gNS4wZiAtIGZXaWR0aCAvIDQuNWYpLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAxNi4wZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIChmSGVpZ2h0IC8gNS4wZiAtIGZIZWlnaHQgLyAxNi4wZikpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDQuNWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAxNi4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDQuNWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogKGZXaWR0aCAvIDQuNGYgLSBmV2lkdGggLyA0LjVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDE2LjBmIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIGZIZWlnaHQgLyAxNi4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDMuMGYgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogKGZXaWR0aCAvIDQuMGYgLSBmV2lkdGggLyAzLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMy4wZiwgY3JCQm94LmJvdHRvbSksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDMuMGYgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZldpZHRoICogKDEgLyA3LjBmICsgMiAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgUFdMX0JFWklFUiAqIGZIZWlnaHQgKiA0IC8gNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDE0IC8gMTUuMGYgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZldpZHRoICogKDEgLyA3LjBmIC0gNyAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDE1IC8gMTYuMGYgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogKGZIZWlnaHQgKiA0IC8gNS4wZiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkhlaWdodCAqIDE1IC8gMTYuMGYpKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMTQgLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDE1IC8gMTYuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoCisgICAgICAgICAgICAgIGNyQkJveC5sZWZ0ICsgZldpZHRoICogMTQgLyAxNS4wZiArCisgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogKGZXaWR0aCAqIDcgLyAxNS4wZiAtIGZXaWR0aCAqIDE0IC8gMTUuMGYpLAorICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDE1IC8gMTYuMGYgKworICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIChmSGVpZ2h0ICogOCAvIDcuMGYgLSBmSGVpZ2h0ICogMTUgLyAxNi4wZikpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDMuNmYgKworICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiAoZldpZHRoIC8gMy40ZiAtIGZXaWR0aCAvIDMuNmYpLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAzLjVmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogKGZIZWlnaHQgLyAzLjVmIC0gZkhlaWdodCAvIDMuNWYpKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAzLjZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMy41ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDMuNmYsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDMuNWYgKworICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiAoZkhlaWdodCAvIDQuMGYgLSBmSGVpZ2h0IC8gMy41ZikpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludCgKKyAgICAgICAgICAgICAgY3JCQm94LmxlZnQgKyBmV2lkdGggLyAxNS4wZiArCisgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogKGZXaWR0aCAvIDMuNWYgLSBmV2lkdGggLyAxNS4wZiksCisgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMiAvIDUuMGYgKworICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIChmSGVpZ2h0ICogMy41ZiAvIDUuMGYgLSBmSGVpZ2h0ICogMiAvIDUuMGYpKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDIgLyA1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pfTsKIAotCWlmKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQotCQlzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCAxNik7Ci0JZWxzZQotCQlHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDE2KTsKKyAgaWYgKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQorICAgIHNQYXRoRGF0YSA9IEdldEFwcFN0cmVhbUZyb21BcnJheShQYXRoQXJyYXksIDE2KTsKKyAgZWxzZQorICAgIEdldFBhdGhEYXRhRnJvbUFycmF5KHBhdGgsIFBhdGhBcnJheSwgMTYpOwogfQogCi12b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX0NpcmNsZShDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLCBDRlhfUGF0aERhdGEmIHBhdGgsIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LCBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpCi17Ci0JRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7Ci0JRlhfRkxPQVQgZkhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOwordm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19DaXJjbGUoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKSB7CisgIEZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OworICBGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207CiAKLQlDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0KLQl7Ci0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8xNS4wZixjckJCb3guYm90dG9tICsgZkhlaWdodC8yLjBmKSwgUFdMUFRfTU9WRVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzE1LjBmLAotCQkgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzIuMGYgKyBQV0xfQkVaSUVSKihmSGVpZ2h0KjE0LzE1LjBmIC0gZkhlaWdodC8yLjBmKSksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIuMGYgLSBQV0xfQkVaSUVSKihmV2lkdGgvMi4wZiAtIGZXaWR0aC8xNS4wZiksIGNyQkJveC50b3AgLSBmSGVpZ2h0LzE1LjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMi4wZixjckJCb3gudG9wIC0gZkhlaWdodC8xNS4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIuMGYgKyBQV0xfQkVaSUVSKihmV2lkdGgqMTQvMTUuMGYgLSBmV2lkdGgvMi4wZiksIGNyQkJveC50b3AgLSBmSGVpZ2h0LzE1LjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzE1LjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8yLjBmICsgUFdMX0JFWklFUiooZkhlaWdodCoxNC8xNS4wZiAtIGZIZWlnaHQvMi4wZikpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgvMTUuMGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzIuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgvMTUuMGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzIuMGYgLSBQV0xfQkVaSUVSKihmSGVpZ2h0LzIuMGYgLSBmSGVpZ2h0LzE1LjBmKSksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIuMGYgKyBQV0xfQkVaSUVSKihmV2lkdGgqMTQvMTUuMGYgLSBmV2lkdGgvMi4wZiksIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzE1LjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMi4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMTUuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8yLjBmIC0gUFdMX0JFWklFUiooZldpZHRoLzIuMGYgLSBmV2lkdGgvMTUuMGYpLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8xNS4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzE1LjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8yLjBmIC0gUFdMX0JFWklFUiooZkhlaWdodC8yLjBmIC0gZkhlaWdodC8xNS4wZikpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8xNS4wZixjckJCb3guYm90dG9tICsgZkhlaWdodC8yLjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMy8xNS4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMi4wZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCozLzE1LjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8yLjBmICsgUFdMX0JFWklFUiooZkhlaWdodCo0LzUuMGYgLSBmSGVpZ2h0LzIuMGYpKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMi4wZiAtIFBXTF9CRVpJRVIqKGZXaWR0aC8yLjBmIC0gZldpZHRoKjMvMTUuMGYpLCBjckJCb3gudG9wIC0gZkhlaWdodCozLzE1LjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMi4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMy8xNS4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIuMGYgKyBQV0xfQkVaSUVSKihmV2lkdGgqNC81LjBmIC0gZldpZHRoLzIuMGYpLCBjckJCb3gudG9wIC0gZkhlaWdodCozLzE1LjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjMvMTUuMGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzIuMGYgKyBQV0xfQkVaSUVSKihmSGVpZ2h0KjQvNS4wZiAtIGZIZWlnaHQvMi4wZikpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMy8xNS4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMi4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCozLzE1LjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8yLjBmIC0gUFdMX0JFWklFUiooZkhlaWdodCo0LzUuMGYgLSBmSGVpZ2h0LzIuMGYpKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMi4wZiArIFBXTF9CRVpJRVIqKGZXaWR0aCo0LzUuMGYgLSBmV2lkdGgvMi4wZiksIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjMvMTUuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8yLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCozLzE1LjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMi4wZiAtIFBXTF9CRVpJRVIqKGZXaWR0aCo0LzUuMGYgLSBmV2lkdGgvMi4wZiksIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjMvMTUuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCozLzE1LjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8yLjBmIC0gUFdMX0JFWklFUiooZkhlaWdodCo0LzUuMGYgLSBmSGVpZ2h0LzIuMGYpKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMy8xNS4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMi4wZiksIFBXTFBUX0JFWklFUlRPKQotCX07CisgIENQV0xfUGF0aERhdGEgUGF0aEFycmF5W10gPSB7CisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDIuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDIuMGYgKworICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiAoZkhlaWdodCAqIDE0IC8gMTUuMGYgLSBmSGVpZ2h0IC8gMi4wZikpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDIuMGYgLQorICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiAoZldpZHRoIC8gMi4wZiAtIGZXaWR0aCAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gMTUuMGYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDIuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gMTUuMGYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDIuMGYgKworICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiAoZldpZHRoICogMTQgLyAxNS4wZiAtIGZXaWR0aCAvIDIuMGYpLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgLyAxNS4wZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDE1LjBmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyLjBmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogKGZIZWlnaHQgKiAxNCAvIDE1LjBmIC0gZkhlaWdodCAvIDIuMGYpKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDE1LjBmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyLjBmIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogKGZIZWlnaHQgLyAyLjBmIC0gZkhlaWdodCAvIDE1LjBmKSksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMi4wZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIChmV2lkdGggKiAxNCAvIDE1LjBmIC0gZldpZHRoIC8gMi4wZiksCisgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDE1LjBmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLjBmIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogKGZXaWR0aCAvIDIuMGYgLSBmV2lkdGggLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDE1LjBmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMi4wZiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIChmSGVpZ2h0IC8gMi4wZiAtIGZIZWlnaHQgLyAxNS4wZikpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDE1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMi4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDMgLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDIuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMyAvIDE1LjBmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyLjBmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogKGZIZWlnaHQgKiA0IC8gNS4wZiAtIGZIZWlnaHQgLyAyLjBmKSksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMi4wZiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIChmV2lkdGggLyAyLjBmIC0gZldpZHRoICogMyAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMyAvIDE1LjBmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMyAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMi4wZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIChmV2lkdGggKiA0IC8gNS4wZiAtIGZXaWR0aCAvIDIuMGYpLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAzIC8gMTUuMGYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAzIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDIuMGYgKworICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiAoZkhlaWdodCAqIDQgLyA1LjBmIC0gZkhlaWdodCAvIDIuMGYpKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMyAvIDE1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMi4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAzIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDIuMGYgLQorICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiAoZkhlaWdodCAqIDQgLyA1LjBmIC0gZkhlaWdodCAvIDIuMGYpKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLjBmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogKGZXaWR0aCAqIDQgLyA1LjBmIC0gZldpZHRoIC8gMi4wZiksCisgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDMgLyAxNS4wZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDMgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDIuMGYgLQorICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiAoZldpZHRoICogNCAvIDUuMGYgLSBmV2lkdGggLyAyLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMyAvIDE1LjBmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAzIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDIuMGYgLQorICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiAoZkhlaWdodCAqIDQgLyA1LjBmIC0gZkhlaWdodCAvIDIuMGYpKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAzIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pfTsKIAotCWlmKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQotCQlzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCAyNik7Ci0JZWxzZQotCQlHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDI2KTsKKyAgaWYgKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQorICAgIHNQYXRoRGF0YSA9IEdldEFwcFN0cmVhbUZyb21BcnJheShQYXRoQXJyYXksIDI2KTsKKyAgZWxzZQorICAgIEdldFBhdGhEYXRhRnJvbUFycmF5KHBhdGgsIFBhdGhBcnJheSwgMjYpOwogfQogCi12b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX0NvbW1lbnQoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKQotewotCUZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OwotCUZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKK3ZvaWQgQ1BXTF9VdGlsczo6R2V0R3JhcGhpY3NfQ29tbWVudChDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpIHsKKyAgRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7CisgIEZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKIAotCUNQV0xfUGF0aERhdGEgUGF0aEFycmF5W10gPSAKLQl7Ci0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8xNS4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQvNi4wZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8xNS4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQvNi4wZiArIFBXTF9CRVpJRVIqKGZIZWlnaHQvNi4wZiAtIGZIZWlnaHQvMTAuMGYpKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMi8xNS4wZiAtIFBXTF9CRVpJRVIqZldpZHRoLzE1LjBmLCBjckJCb3gudG9wIC0gZkhlaWdodC8xMC4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjIvMTUuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzEwLjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjIvMTUuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzEwLjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCoyLzE1LjBmICsgUFdMX0JFWklFUipmV2lkdGgvMTUuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzEwLjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzE1LjBmLCBjckJCb3gudG9wIC0gZkhlaWdodC82ICsgUFdMX0JFWklFUiooZkhlaWdodC82LjBmIC0gZkhlaWdodC8xMC4wZikpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgvMTUuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzYuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgvMTUuMGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzMuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzE1LjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCo0LzE1LjBmICsgUFdMX0JFWklFUipmSGVpZ2h0LzE1LjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjIvMTUuMGYgKyBQV0xfQkVaSUVSKmZXaWR0aC8xNS4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqNC8xNS4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCoyLzE1LjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCo0LzE1LjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqNS8xNS4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqNC8xNS4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCo1LzE1LjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCoyLzE1ICsgUFdMX0JFWklFUipmSGVpZ2h0KjIvMTUuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCo1LzE1LjBmIC0gUFdMX0JFWklFUipmV2lkdGgqMi8xNS4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMi8xNS4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjYvMzAuMGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjIvMTUuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCo3LzMwLjBmICsgUFdMX0JFWklFUipmV2lkdGgvMzAuMGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjIvMTUuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCo3LzMwLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCoyLzE1LjBmICsgUFdMX0JFWklFUipmSGVpZ2h0KjIvMTUuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCo3LzMwLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCo0LzE1LjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMi8xNS4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqNC8xNS4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCoyLzE1LjBmIC0gUFdMX0JFWklFUipmV2lkdGgvMTUuMGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjQvMTUuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8xNS4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMy4wZiAtIFBXTF9CRVpJRVIqZkhlaWdodC8xNS4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzE1LjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8zLjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMTUuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzYuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMi8xNS4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqOC8zMC4wZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMi8xNS4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqOC8zMC4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCoyLzE1LCBjckJCb3gudG9wIC0gZkhlaWdodCoyNS82MC4wZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMi8xNS4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMjUvNjAuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMi8xNS4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMTcvMzAuMGYpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjQvMTUuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjE3LzMwLjBmKSwgUFdMUFRfTElORVRPKQotCX07CisgIENQV0xfUGF0aERhdGEgUGF0aEFycmF5W10gPSB7CisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAxNS4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQgLyA2LjBmKSwKKyAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAvIDYuMGYgKworICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiAoZkhlaWdodCAvIDYuMGYgLSBmSGVpZ2h0IC8gMTAuMGYpKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAyIC8gMTUuMGYgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZldpZHRoIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgLyAxMC4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDIgLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAvIDEwLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDIgLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAvIDEwLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAyIC8gMTUuMGYgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZldpZHRoIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgLyAxMC4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gNiArCisgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIChmSGVpZ2h0IC8gNi4wZiAtIGZIZWlnaHQgLyAxMC4wZikpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAvIDYuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAzLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDQgLyAxNS4wZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiBmSGVpZ2h0IC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMiAvIDE1LjBmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIGZXaWR0aCAvIDE1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogNCAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDIgLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDQgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDUgLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDQgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiA1IC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAyIC8gMTUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZkhlaWdodCAqIDIgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDUgLyAxNS4wZiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiBmV2lkdGggKiAyIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAyIC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiA2IC8gMzAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAyIC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiA3IC8gMzAuMGYgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZldpZHRoIC8gMzAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAyIC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiA3IC8gMzAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAyIC8gMTUuMGYgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZkhlaWdodCAqIDIgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDcgLyAzMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDQgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDIgLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDQgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAyIC8gMTUuMGYgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZldpZHRoIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiA0IC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDMuMGYgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZkhlaWdodCAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAzLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMTUuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gNi4wZiksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDIgLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDggLyAzMC4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMiAvIDE1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogOCAvIDMwLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDIgLyAxNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDI1IC8gNjAuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDIgLyAxNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDI1IC8gNjAuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMiAvIDE1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMTcgLyAzMC4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogNCAvIDE1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMTcgLyAzMC4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyl9OwogCi0JaWYodHlwZSA9PSBQV0xQVF9TVFJFQU0pCi0JCXNQYXRoRGF0YSA9IEdldEFwcFN0cmVhbUZyb21BcnJheShQYXRoQXJyYXksIDMwKTsKLQllbHNlCi0JCUdldFBhdGhEYXRhRnJvbUFycmF5KHBhdGgsIFBhdGhBcnJheSwgMzApOworICBpZiAodHlwZSA9PSBQV0xQVF9TVFJFQU0pCisgICAgc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgMzApOworICBlbHNlCisgICAgR2V0UGF0aERhdGFGcm9tQXJyYXkocGF0aCwgUGF0aEFycmF5LCAzMCk7CiB9CiAKLXZvaWQgQ1BXTF9VdGlsczo6R2V0R3JhcGhpY3NfQ3Jvc3MoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKQotewotCUZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OwotCUZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKLQkvL0ZYX0ZMT0FUIGZjYXRlcmNvcm5lciA9IChGWF9GTE9BVClzcXJ0KGZXaWR0aCpmV2lkdGggKyBmSGVpZ2h0KmZIZWlnaHQpOwotCUNQV0xfUG9pbnQgY2VudGVyX3BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzIpOwordm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19Dcm9zcyhDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpIHsKKyAgRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7CisgIEZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKKyAgQ1BXTF9Qb2ludCBjZW50ZXJfcG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDIpOwogCi0JQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbXSA9IAotCXsKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNlbnRlcl9wb2ludC54LCBjZW50ZXJfcG9pbnQueSArIGZIZWlnaHQvMTAuMGYpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY2VudGVyX3BvaW50LnggKyBmV2lkdGgqMC4zZiwgY2VudGVyX3BvaW50LnkgKyBmSGVpZ2h0LzEwLjBmICsgZldpZHRoKjAuM2YpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY2VudGVyX3BvaW50LnggKyBmV2lkdGgvMTAuMGYgKyBmV2lkdGgqMC4zZiwgY2VudGVyX3BvaW50LnkgKyBmSGVpZ2h0KjAuM2YpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY2VudGVyX3BvaW50LnggKyBmV2lkdGgvMTAuMGYsIGNlbnRlcl9wb2ludC55KSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNlbnRlcl9wb2ludC54ICsgZldpZHRoLzEwLjBmICsgZldpZHRoKjAuM2YsIGNlbnRlcl9wb2ludC55IC0gZkhlaWdodCowLjNmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNlbnRlcl9wb2ludC54ICsgZldpZHRoKjAuM2YsIGNlbnRlcl9wb2ludC55IC0gZkhlaWdodC8xMC4wZiAtIGZIZWlnaHQqMC4zZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjZW50ZXJfcG9pbnQueCwgY2VudGVyX3BvaW50LnkgLSBmSGVpZ2h0LzEwLjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNlbnRlcl9wb2ludC54IC0gZldpZHRoKjAuM2YsIGNlbnRlcl9wb2ludC55IC0gZkhlaWdodC8xMCAtIGZIZWlnaHQqMC4zZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjZW50ZXJfcG9pbnQueCAtIGZXaWR0aC8xMC4wZiAtIGZXaWR0aCowLjNmLCBjZW50ZXJfcG9pbnQueSAtIGZIZWlnaHQqMC4zZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjZW50ZXJfcG9pbnQueCAtIGZXaWR0aC8xMCwgY2VudGVyX3BvaW50LnkpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY2VudGVyX3BvaW50LnggLSBmV2lkdGgvMTAgLSBmV2lkdGgqMC4zZiwgY2VudGVyX3BvaW50LnkgKyBmSGVpZ2h0KjAuM2YpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY2VudGVyX3BvaW50LnggLSBmV2lkdGgqMC4zZiwgY2VudGVyX3BvaW50LnkgKyBmSGVpZ2h0LzEwLjBmICsgZkhlaWdodCowLjNmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNlbnRlcl9wb2ludC54LCBjZW50ZXJfcG9pbnQueSArIGZIZWlnaHQvMTAuMGYpLCBQV0xQVF9MSU5FVE8pCi0JfTsKKyAgQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbXSA9IHsKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjZW50ZXJfcG9pbnQueCwgY2VudGVyX3BvaW50LnkgKyBmSGVpZ2h0IC8gMTAuMGYpLAorICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY2VudGVyX3BvaW50LnggKyBmV2lkdGggKiAwLjNmLAorICAgICAgICAgICAgICAgICAgICAgY2VudGVyX3BvaW50LnkgKyBmSGVpZ2h0IC8gMTAuMGYgKyBmV2lkdGggKiAwLjNmKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNlbnRlcl9wb2ludC54ICsgZldpZHRoIC8gMTAuMGYgKyBmV2lkdGggKiAwLjNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlcl9wb2ludC55ICsgZkhlaWdodCAqIDAuM2YpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNlbnRlcl9wb2ludC54ICsgZldpZHRoIC8gMTAuMGYsIGNlbnRlcl9wb2ludC55KSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjZW50ZXJfcG9pbnQueCArIGZXaWR0aCAvIDEwLjBmICsgZldpZHRoICogMC4zZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXJfcG9pbnQueSAtIGZIZWlnaHQgKiAwLjNmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjZW50ZXJfcG9pbnQueCArIGZXaWR0aCAqIDAuM2YsCisgICAgICAgICAgICAgICAgICAgICBjZW50ZXJfcG9pbnQueSAtIGZIZWlnaHQgLyAxMC4wZiAtIGZIZWlnaHQgKiAwLjNmKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNlbnRlcl9wb2ludC54LCBjZW50ZXJfcG9pbnQueSAtIGZIZWlnaHQgLyAxMC4wZiksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjZW50ZXJfcG9pbnQueCAtIGZXaWR0aCAqIDAuM2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyX3BvaW50LnkgLSBmSGVpZ2h0IC8gMTAgLSBmSGVpZ2h0ICogMC4zZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY2VudGVyX3BvaW50LnggLSBmV2lkdGggLyAxMC4wZiAtIGZXaWR0aCAqIDAuM2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyX3BvaW50LnkgLSBmSGVpZ2h0ICogMC4zZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY2VudGVyX3BvaW50LnggLSBmV2lkdGggLyAxMCwgY2VudGVyX3BvaW50LnkpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNlbnRlcl9wb2ludC54IC0gZldpZHRoIC8gMTAgLSBmV2lkdGggKiAwLjNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlcl9wb2ludC55ICsgZkhlaWdodCAqIDAuM2YpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNlbnRlcl9wb2ludC54IC0gZldpZHRoICogMC4zZiwKKyAgICAgICAgICAgICAgICAgICAgIGNlbnRlcl9wb2ludC55ICsgZkhlaWdodCAvIDEwLjBmICsgZkhlaWdodCAqIDAuM2YpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY2VudGVyX3BvaW50LngsIGNlbnRlcl9wb2ludC55ICsgZkhlaWdodCAvIDEwLjBmKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pfTsKIAotCWlmKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQotCQlzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCAxMyk7Ci0JZWxzZQotCQlHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDEzKTsKKyAgaWYgKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQorICAgIHNQYXRoRGF0YSA9IEdldEFwcFN0cmVhbUZyb21BcnJheShQYXRoQXJyYXksIDEzKTsKKyAgZWxzZQorICAgIEdldFBhdGhEYXRhRnJvbUFycmF5KHBhdGgsIFBhdGhBcnJheSwgMTMpOwogfQogCi12b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX0hlbHAoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKQotewotCUZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OwotCUZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKK3ZvaWQgQ1BXTF9VdGlsczo6R2V0R3JhcGhpY3NfSGVscChDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpIHsKKyAgRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7CisgIEZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKIAotCUNQV0xfUGF0aERhdGEgUGF0aEFycmF5W10gPSAKLQl7Ci0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC82MC4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMi4wZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC82MC4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMi4wZiArIFBXTF9CRVpJRVIqKGZIZWlnaHQvNjAuMGYgLSBmSGVpZ2h0LzIuMGYpKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMi4wZiAtIFBXTF9CRVpJRVIqKGZXaWR0aC8yLjBmIC0gZldpZHRoLzYwLjBmKSwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvNjAuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8yLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC82MC4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIuMGYgKyBQV0xfQkVaSUVSKmZXaWR0aCoyOS82MC4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvNjAuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgvNjAuMGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzIuMGYgKyBQV0xfQkVaSUVSKihmSGVpZ2h0LzYwLjBmIC0gZkhlaWdodC8yLjBmKSksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC82MC4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMi4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC82MC4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMi4wZiArIFBXTF9CRVpJRVIqZkhlaWdodCoyOS82MC4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIuMGYgKyBQV0xfQkVaSUVSKmZXaWR0aCoyOS82MC4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQvNjAuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8yLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodC82MC4wZiksIFBXTFBUX0JFWklFUlRPKSwJCQotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMi4wZiAtIFBXTF9CRVpJRVIqZldpZHRoKjI5LzYwLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodC82MC4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzYwLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8yLjBmICArIFBXTF9CRVpJRVIqZkhlaWdodCoyOS82MC4wZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzYwLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8yLjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4yN2YsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMzZmKSwgUFdMUFRfTU9WRVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMjdmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjM2ZiArIFBXTF9CRVpJRVIqZkhlaWdodCowLjIzZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNWYgLSBQV0xfQkVaSUVSKmZXaWR0aCowLjIzZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC44N2YpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjVmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjg3ZiksIFBXTFBUX0JFWklFUlRPKSwJCQotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC41ZiArIFBXTF9CRVpJRVIqZldpZHRoKjAuMjNmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjg3ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjI3ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4zNmYgKyBQV0xfQkVaSUVSKmZIZWlnaHQqMC4yM2YpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMC4yN2YsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMzZmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjAuMjdmIC0gZldpZHRoKjAuMDhmKjAuMmYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMzZmIC0gZkhlaWdodCowLjE1ZiowLjdmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjAuMzVmICsgZldpZHRoKjAuMDhmKjAuMmYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuNTFmICsgZkhlaWdodCowLjE1ZiowLjJmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjAuMzVmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjUxZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjM1ZiAtIGZXaWR0aCowLjFmKjAuNWYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuNTFmIC0gZkhlaWdodCowLjE1ZiowLjNmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjAuNDVmIC0gZldpZHRoKjAuMWYqMC41ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC42OGYgKyBmSGVpZ2h0KjAuMTVmKjAuNWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMC40NWYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuNjhmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjAuNDVmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjMwZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMC40NWYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuMzBmIC0gZldpZHRoKjAuMWYqMC43ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjU1ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4zMGYgLSBmV2lkdGgqMC4xZiowLjdmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjAuNTVmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjMwZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjU1ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC42NmYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjAuNTVmIC0gZldpZHRoKjAuMWYqMC4wNWYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuNjZmICsgZkhlaWdodCowLjE4ZiowLjVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjAuNDVmIC0gZldpZHRoKjAuMWYqMC4wNWYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuNDhmIC0gZkhlaWdodCowLjE4ZiowLjNmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjAuNDVmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjQ4ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjQ1ZiArIGZXaWR0aCowLjA4ZiowLjJmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjQ4ZiArIGZIZWlnaHQqMC4xOGYqMC4yZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjM3ZiAtIGZXaWR0aCowLjA4ZiowLjJmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjM2ZiAtIGZIZWlnaHQqMC4xOGYqMC43ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjM3ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4zNmYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMC4zN2YsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMzZmICsgUFdMX0JFWklFUipmSGVpZ2h0KjAuMTNmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC41ZiArIFBXTF9CRVpJRVIqZldpZHRoKjAuMTNmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjc3ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNWYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuNzdmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC41ZiAtIFBXTF9CRVpJRVIqZldpZHRoKjAuMTNmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjc3ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMzdmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjM2ZiArIFBXTF9CRVpJRVIqZkhlaWdodCowLjEzZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMzdmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjM2ZiksIFBXTFBUX0JFWklFUlRPKSwJCQotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4zN2YsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMzZmIC0gZldpZHRoKjAuMWYqMC42ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMjdmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjM2ZiAtIGZXaWR0aCowLjFmKjAuNmYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjI3ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4zNmYpLCBQV0xQVF9CRVpJRVJUTyksCQkKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjU2ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4xM2YpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjAuNTZmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjEzZiArIFBXTF9CRVpJRVIqZkhlaWdodCowLjA1NWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMC41MDVmIC0gUFdMX0JFWklFUipmV2lkdGgqMC4wOTVmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjE4NWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMC41MDVmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjE4NWYpLCBQV0xQVF9CRVpJRVJUTyksCQkKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjUwNWYgKyBQV0xfQkVaSUVSKmZXaWR0aCowLjA2NWYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuMTg1ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjQ0ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4xM2YgKyBQV0xfQkVaSUVSKmZIZWlnaHQqMC4wNTVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjAuNDRmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjEzZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjQ0ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4xM2YgLSBQV0xfQkVaSUVSKmZIZWlnaHQqMC4wNTVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjAuNTA1ZiArIFBXTF9CRVpJRVIqZldpZHRoKjAuMDY1ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4wNzVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjAuNTA1ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4wNzVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjAuNTA1ZiAtIFBXTF9CRVpJRVIqZldpZHRoKjAuMDY1ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4wNzVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjAuNTZmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjEzZiAtIFBXTF9CRVpJRVIqZkhlaWdodCowLjA1NWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMC41NmYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuMTNmKSwgUFdMUFRfQkVaSUVSVE8pCi0JfTsKKyAgQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbXSA9IHsKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDYwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMi4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyA2MC4wZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMi4wZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIChmSGVpZ2h0IC8gNjAuMGYgLSBmSGVpZ2h0IC8gMi4wZikpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDIuMGYgLQorICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiAoZldpZHRoIC8gMi4wZiAtIGZXaWR0aCAvIDYwLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gNjAuMGYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDIuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyA2MC4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDIuMGYgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZldpZHRoICogMjkgLyA2MC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDYwLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDYwLjBmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyLjBmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogKGZIZWlnaHQgLyA2MC4wZiAtIGZIZWlnaHQgLyAyLjBmKSksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDYwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMi4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyA2MC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDIuMGYgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZkhlaWdodCAqIDI5IC8gNjAuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLjBmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIGZXaWR0aCAqIDI5IC8gNjAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgLyA2MC4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDIuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gNjAuMGYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDIuMGYgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZldpZHRoICogMjkgLyA2MC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAvIDYwLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gNjAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyLjBmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIGZIZWlnaHQgKiAyOSAvIDYwLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gNjAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4yN2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjM2ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjI3ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMzZmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIGZIZWlnaHQgKiAwLjIzZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNWYgLSBQV0xfQkVaSUVSICogZldpZHRoICogMC4yM2YsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuODdmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC44N2YpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjVmICsgUFdMX0JFWklFUiAqIGZXaWR0aCAqIDAuMjNmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjg3ZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuMjdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4zNmYgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZkhlaWdodCAqIDAuMjNmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuMjdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4zNmYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMC4yN2YgLSBmV2lkdGggKiAwLjA4ZiAqIDAuMmYsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMzZmIC0gZkhlaWdodCAqIDAuMTVmICogMC43ZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuMzVmICsgZldpZHRoICogMC4wOGYgKiAwLjJmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjUxZiArIGZIZWlnaHQgKiAwLjE1ZiAqIDAuMmYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjM1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuNTFmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuMzVmIC0gZldpZHRoICogMC4xZiAqIDAuNWYsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuNTFmIC0gZkhlaWdodCAqIDAuMTVmICogMC4zZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuNDVmIC0gZldpZHRoICogMC4xZiAqIDAuNWYsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuNjhmICsgZkhlaWdodCAqIDAuMTVmICogMC41ZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuNDVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC42OGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMC40NWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjMwZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMC40NWYsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMzBmIC0gZldpZHRoICogMC4xZiAqIDAuN2YpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjU1ZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4zMGYgLSBmV2lkdGggKiAwLjFmICogMC43ZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuNTVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4zMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMC41NWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjY2ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMC41NWYgLSBmV2lkdGggKiAwLjFmICogMC4wNWYsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuNjZmICsgZkhlaWdodCAqIDAuMThmICogMC41ZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuNDVmIC0gZldpZHRoICogMC4xZiAqIDAuMDVmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjQ4ZiAtIGZIZWlnaHQgKiAwLjE4ZiAqIDAuM2YpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjQ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuNDhmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuNDVmICsgZldpZHRoICogMC4wOGYgKiAwLjJmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjQ4ZiArIGZIZWlnaHQgKiAwLjE4ZiAqIDAuMmYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjM3ZiAtIGZXaWR0aCAqIDAuMDhmICogMC4yZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4zNmYgLSBmSGVpZ2h0ICogMC4xOGYgKiAwLjdmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMC4zN2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjM2ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjM3ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMzZmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIGZIZWlnaHQgKiAwLjEzZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNWYgKyBQV0xfQkVaSUVSICogZldpZHRoICogMC4xM2YsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuNzdmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC43N2YpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjVmIC0gUFdMX0JFWklFUiAqIGZXaWR0aCAqIDAuMTNmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjc3ZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4zN2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjM2ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiBmSGVpZ2h0ICogMC4xM2YpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjM3ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMzZmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4zN2YsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMzZmIC0gZldpZHRoICogMC4xZiAqIDAuNmYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuMjdmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjM2ZiAtIGZXaWR0aCAqIDAuMWYgKiAwLjZmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjI3ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMzZmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuNTZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4xM2YpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuNTZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4xM2YgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZkhlaWdodCAqIDAuMDU1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjUwNWYgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZldpZHRoICogMC4wOTVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4xODVmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuNTA1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMTg1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjUwNWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZldpZHRoICogMC4wNjVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4xODVmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuNDRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4xM2YgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZkhlaWdodCAqIDAuMDU1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjQ0ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMTNmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuNDRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4xM2YgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZkhlaWdodCAqIDAuMDU1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjUwNWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZldpZHRoICogMC4wNjVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4wNzVmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuNTA1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMDc1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjUwNWYgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZldpZHRoICogMC4wNjVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4wNzVmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuNTZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4xM2YgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfQkVaSUVSICogZkhlaWdodCAqIDAuMDU1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjU2ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMTNmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pfTsKIAotCWlmKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQotCQlzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCA1OSk7Ci0JZWxzZQotCQlHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDU5KTsKKyAgaWYgKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQorICAgIHNQYXRoRGF0YSA9IEdldEFwcFN0cmVhbUZyb21BcnJheShQYXRoQXJyYXksIDU5KTsKKyAgZWxzZQorICAgIEdldFBhdGhEYXRhRnJvbUFycmF5KHBhdGgsIFBhdGhBcnJheSwgNTkpOwogfQogCi12b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX0luc2VydFRleHQoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKQotewotCUZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OwotCUZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKK3ZvaWQgQ1BXTF9VdGlsczo6R2V0R3JhcGhpY3NfSW5zZXJ0VGV4dChDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpIHsKKyAgRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7CisgIEZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKIAotCUNQV0xfUGF0aERhdGEgUGF0aEFycmF5W10gPSAKLQl7Ci0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8xMCwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMTApLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMi8xNSksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgvMTAsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzEwKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzEwLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8xMCksIFBXTFBUX0xJTkVUTykKLQl9OworICBDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0geworICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMTAsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMTApLAorICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLCBjckJCb3gudG9wIC0gZkhlaWdodCAqIDIgLyAxNSksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAxMCwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAxMCksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDEwLCBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDEwKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pfTsKIAotCWlmKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQotCQlzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCA0KTsKLQllbHNlCi0JCUdldFBhdGhEYXRhRnJvbUFycmF5KHBhdGgsIFBhdGhBcnJheSwgNCk7CisgIGlmICh0eXBlID09IFBXTFBUX1NUUkVBTSkKKyAgICBzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCA0KTsKKyAgZWxzZQorICAgIEdldFBhdGhEYXRhRnJvbUFycmF5KHBhdGgsIFBhdGhBcnJheSwgNCk7CiB9CiAKLXZvaWQgQ1BXTF9VdGlsczo6R2V0R3JhcGhpY3NfS2V5KENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkKLXsKLQlGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKLQlGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207Ci0JRlhfRkxPQVQgayA9IC1mSGVpZ2h0L2ZXaWR0aDsKLQlDUFdMX1BvaW50IHRhaWw7Ci0JQ1BXTF9Qb2ludCBDaWNsZUNlbnRlcjsKLQl0YWlsLnggPSBjckJCb3gubGVmdCArIGZXaWR0aCowLjlmOwotCXRhaWwueSA9IGsqKHRhaWwueCAtIGNyQkJveC5yaWdodCkgKyBjckJCb3guYm90dG9tOwotCUNpY2xlQ2VudGVyLnggPSBjckJCb3gubGVmdCArIGZXaWR0aCowLjE1ZjsKLQlDaWNsZUNlbnRlci55ID0gayooQ2ljbGVDZW50ZXIueCAtIGNyQkJveC5yaWdodCkgKyBjckJCb3guYm90dG9tOwordm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19LZXkoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKSB7CisgIEZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OworICBGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207CisgIEZYX0ZMT0FUIGsgPSAtZkhlaWdodCAvIGZXaWR0aDsKKyAgQ1BXTF9Qb2ludCB0YWlsOworICBDUFdMX1BvaW50IENpY2xlQ2VudGVyOworICB0YWlsLnggPSBjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuOWY7CisgIHRhaWwueSA9IGsgKiAodGFpbC54IC0gY3JCQm94LnJpZ2h0KSArIGNyQkJveC5ib3R0b207CisgIENpY2xlQ2VudGVyLnggPSBjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuMTVmOworICBDaWNsZUNlbnRlci55ID0gayAqIChDaWNsZUNlbnRlci54IC0gY3JCQm94LnJpZ2h0KSArIGNyQkJveC5ib3R0b207CiAKLQlDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0gCi0JewotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQodGFpbC54ICsgZldpZHRoLzMwLjBmLCAtZldpZHRoLzMwLjBmL2sgKyB0YWlsLnkpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQodGFpbC54ICsgZldpZHRoLzMwLjBmIC0gZldpZHRoKjAuMThmLCAtaypmV2lkdGgqMC4xOGYgLSBmV2lkdGgvMzAvayArIHRhaWwueSksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludCh0YWlsLnggKyBmV2lkdGgvMzAgLSBmV2lkdGgqMC4xOGYgKyBmV2lkdGgqMC4wN2YsCi0JCSAgICAgICAgICAgICAgLWZXaWR0aCowLjA3Zi9rIC0gaypmV2lkdGgqMC4xOGYgLSBmV2lkdGgvMzAvayArIHRhaWwueSksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludCh0YWlsLnggKyBmV2lkdGgvMzAgLSBmV2lkdGgqMC4xOGYgLSBmV2lkdGgvMjAgKyBmV2lkdGgqMC4wN2YsCi0JCSAgICAgICAgICAgICAgLWZXaWR0aCowLjA3Zi9rIC0gaypmV2lkdGgvMjAgLSBrKmZXaWR0aCowLjE4ZiAtIGZXaWR0aC8zMC9rICsgdGFpbC55KSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KHRhaWwueCArIGZXaWR0aC8zMCAtIGZXaWR0aCowLjE4ZiAtIGZXaWR0aC8yMCwKLQkJICAgICAgICAgICAgICAtaypmV2lkdGgvMjAgLSBrKmZXaWR0aCowLjE4ZiAtIGZXaWR0aC8zMC9rICsgdGFpbC55KSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KHRhaWwueCArIGZXaWR0aC8zMCAtIGZXaWR0aCowLjE4ZiAtIGZXaWR0aC8yMCAtIGZXaWR0aC8xNSwKLQkJICAgICAgICAgICAgICAtaypmV2lkdGgvMTUgLSBrKmZXaWR0aC8yMCAtIGsqZldpZHRoKjAuMThmIC0gZldpZHRoLzMwL2sgKyB0YWlsLnkpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQodGFpbC54ICsgZldpZHRoLzMwIC0gZldpZHRoKjAuMThmIC0gZldpZHRoLzIwIC0gZldpZHRoLzE1ICsgZldpZHRoKjAuMDdmLAotCQkgICAgICAgICAgICAgIC1mV2lkdGgqMC4wN2YvayAtIGsqZldpZHRoLzE1IC0gaypmV2lkdGgvMjAgLSBrKmZXaWR0aCowLjE4ZiAtIGZXaWR0aC8zMC9rICsgdGFpbC55KSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KHRhaWwueCArIGZXaWR0aC8zMCAtIGZXaWR0aCowLjE4ZiAtIGZXaWR0aC8yMCAtIGZXaWR0aC8xNSAtIGZXaWR0aC8yMCArIGZXaWR0aCowLjA3ZiwKLQkJICAgICAgICAgICAgICAtZldpZHRoKjAuMDdmL2sgKyAtaypmV2lkdGgvMjAgKyAtaypmV2lkdGgvMTUgLSBrKmZXaWR0aC8yMCAtIGsqZldpZHRoKjAuMThmIC0gZldpZHRoLzMwL2sgKyB0YWlsLnkpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQodGFpbC54ICsgZldpZHRoLzMwIC0gZldpZHRoKjAuMThmIC0gZldpZHRoLzIwIC0gZldpZHRoLzE1IC0gZldpZHRoLzIwLAotCQkgICAgICAgICAgICAgIC1rKmZXaWR0aC8yMCArIC1rKmZXaWR0aC8xNSAtIGsqZldpZHRoLzIwIC0gaypmV2lkdGgqMC4xOGYgLSBmV2lkdGgvMzAvayArIHRhaWwueSksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludCh0YWlsLnggKyBmV2lkdGgvMzAgLSBmV2lkdGgqMC40NWYsIC1rKmZXaWR0aCowLjQ1ZiAtIGZXaWR0aC8zMC9rICsgdGFpbC55KSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KHRhaWwueCArIGZXaWR0aC8zMCAtIGZXaWR0aCowLjQ1ZiArIGZXaWR0aCowLjJmLAotCQkgICAgICAgICAgICAgIC1mV2lkdGgqMC40Zi9rIC0gaypmV2lkdGgqMC40NWYgLSBmV2lkdGgvMzAvayArIHRhaWwueSksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KENpY2xlQ2VudGVyLnggKyBmV2lkdGgqMC4yZiwgLSBmV2lkdGgqMC4xZi9rICsgQ2ljbGVDZW50ZXIueSksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KENpY2xlQ2VudGVyLngsIENpY2xlQ2VudGVyLnkpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChDaWNsZUNlbnRlci54IC0gZldpZHRoLzYwLjBmLCAtaypmV2lkdGgvNjAgKyBDaWNsZUNlbnRlci55KSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoQ2ljbGVDZW50ZXIueCAtIGZXaWR0aC82MCwgLWsqZldpZHRoLzYwICsgQ2ljbGVDZW50ZXIueSksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KENpY2xlQ2VudGVyLngsIENpY2xlQ2VudGVyLnkpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChDaWNsZUNlbnRlci54IC0gZldpZHRoKjAuMjJmLCBmV2lkdGgqMC4zNWYvayArIENpY2xlQ2VudGVyLnkgLSBmSGVpZ2h0KjAuMDVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQodGFpbC54IC0gZldpZHRoLzMwIC0gZldpZHRoKjAuNDVmIC0gZldpZHRoKjAuMThmLCBmV2lkdGgqMC4wNWYvayAtIGsqZldpZHRoKjAuNDVmICsgZldpZHRoLzMwL2sgKyB0YWlsLnkgLSBmSGVpZ2h0KjAuMDVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQodGFpbC54IC0gZldpZHRoLzMwLjBmIC0gZldpZHRoKjAuNDVmLCAtaypmV2lkdGgqMC40NWYgKyBmV2lkdGgvMzAuMGYvayArIHRhaWwueSksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KHRhaWwueCAtIGZXaWR0aC8zMC4wZiwgZldpZHRoLzMwLjBmL2sgKyB0YWlsLnkpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQodGFpbC54ICsgZldpZHRoLzMwLCAtZldpZHRoLzMwL2sgKyB0YWlsLnkpLCBQV0xQVF9MSU5FVE8pLAkJCi0gCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoQ2ljbGVDZW50ZXIueCArIGZXaWR0aCowLjA4ZiwgaypmV2lkdGgqMC4wOGYgKyBDaWNsZUNlbnRlci55KSwgUFdMUFRfTU9WRVRPKSwKLSAJCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChDaWNsZUNlbnRlci54ICsgZldpZHRoKjAuMDhmICsgZldpZHRoKjAuMWYsIC1mV2lkdGgqMC4xZi9rICsgaypmV2lkdGgqMC4wOGYgKyBDaWNsZUNlbnRlci55KSwgUFdMUFRfQkVaSUVSVE8pLAotIAkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KENpY2xlQ2VudGVyLnggKyBmV2lkdGgqMC4yMmYgKyBmV2lkdGgqMC4xZiwgaypmV2lkdGgqMC4yMmYgKyBDaWNsZUNlbnRlci55IC0gZldpZHRoKjAuMWYvayksIFBXTFBUX0JFWklFUlRPKSwKLSAJCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChDaWNsZUNlbnRlci54ICsgZldpZHRoKjAuMjJmLCBrKmZXaWR0aCowLjIyZiArIENpY2xlQ2VudGVyLnkpLCBQV0xQVF9CRVpJRVJUTyksCi0gCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoQ2ljbGVDZW50ZXIueCArIGZXaWR0aCowLjIyZiAtIGZXaWR0aCowLjFmLCBmV2lkdGgqMC4xZi9rICsgaypmV2lkdGgqMC4yMmYgKyBDaWNsZUNlbnRlci55KSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoQ2ljbGVDZW50ZXIueCArIGZXaWR0aCowLjA4ZiAtIGZXaWR0aCowLjFmLCBmV2lkdGgqMC4xZi9rICsgaypmV2lkdGgqMC4wOGYgKyBDaWNsZUNlbnRlci55KSwgUFdMUFRfQkVaSUVSVE8pLAotIAkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KENpY2xlQ2VudGVyLnggKyBmV2lkdGgqMC4wOGYsIGsqZldpZHRoKjAuMDhmICsgQ2ljbGVDZW50ZXIueSksIFBXTFBUX0JFWklFUlRPKQotCX07CisgIENQV0xfUGF0aERhdGEgUGF0aEFycmF5W10gPSB7CisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQodGFpbC54ICsgZldpZHRoIC8gMzAuMGYsIC1mV2lkdGggLyAzMC4wZiAvIGsgKyB0YWlsLnkpLAorICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQodGFpbC54ICsgZldpZHRoIC8gMzAuMGYgLSBmV2lkdGggKiAwLjE4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtayAqIGZXaWR0aCAqIDAuMThmIC0gZldpZHRoIC8gMzAgLyBrICsgdGFpbC55KSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludCh0YWlsLnggKyBmV2lkdGggLyAzMCAtIGZXaWR0aCAqIDAuMThmICsgZldpZHRoICogMC4wN2YsCisgICAgICAgICAgICAgICAgICAgICAtZldpZHRoICogMC4wN2YgLyBrIC0gayAqIGZXaWR0aCAqIDAuMThmIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICBmV2lkdGggLyAzMCAvIGsgKyB0YWlsLnkpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQodGFpbC54ICsgZldpZHRoIC8gMzAgLSBmV2lkdGggKiAwLjE4ZiAtIGZXaWR0aCAvIDIwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBmV2lkdGggKiAwLjA3ZiwKKyAgICAgICAgICAgICAgICAgICAgIC1mV2lkdGggKiAwLjA3ZiAvIGsgLSBrICogZldpZHRoIC8gMjAgLQorICAgICAgICAgICAgICAgICAgICAgICAgIGsgKiBmV2lkdGggKiAwLjE4ZiAtIGZXaWR0aCAvIDMwIC8gayArIHRhaWwueSksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludCgKKyAgICAgICAgICAgICAgdGFpbC54ICsgZldpZHRoIC8gMzAgLSBmV2lkdGggKiAwLjE4ZiAtIGZXaWR0aCAvIDIwLAorICAgICAgICAgICAgICAtayAqIGZXaWR0aCAvIDIwIC0gayAqIGZXaWR0aCAqIDAuMThmIC0gZldpZHRoIC8gMzAgLyBrICsgdGFpbC55KSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KAorICAgICAgICAgICAgICB0YWlsLnggKyBmV2lkdGggLyAzMCAtIGZXaWR0aCAqIDAuMThmIC0gZldpZHRoIC8gMjAgLSBmV2lkdGggLyAxNSwKKyAgICAgICAgICAgICAgLWsgKiBmV2lkdGggLyAxNSAtIGsgKiBmV2lkdGggLyAyMCAtIGsgKiBmV2lkdGggKiAwLjE4ZiAtCisgICAgICAgICAgICAgICAgICBmV2lkdGggLyAzMCAvIGsgKyB0YWlsLnkpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQodGFpbC54ICsgZldpZHRoIC8gMzAgLSBmV2lkdGggKiAwLjE4ZiAtIGZXaWR0aCAvIDIwIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICBmV2lkdGggLyAxNSArIGZXaWR0aCAqIDAuMDdmLAorICAgICAgICAgICAgICAgICAgICAgLWZXaWR0aCAqIDAuMDdmIC8gayAtIGsgKiBmV2lkdGggLyAxNSAtIGsgKiBmV2lkdGggLyAyMCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgayAqIGZXaWR0aCAqIDAuMThmIC0gZldpZHRoIC8gMzAgLyBrICsgdGFpbC55KSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KHRhaWwueCArIGZXaWR0aCAvIDMwIC0gZldpZHRoICogMC4xOGYgLSBmV2lkdGggLyAyMCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgZldpZHRoIC8gMTUgLSBmV2lkdGggLyAyMCArIGZXaWR0aCAqIDAuMDdmLAorICAgICAgICAgICAgICAgICAgICAgLWZXaWR0aCAqIDAuMDdmIC8gayArIC1rICogZldpZHRoIC8gMjAgKyAtayAqIGZXaWR0aCAvIDE1IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICBrICogZldpZHRoIC8gMjAgLSBrICogZldpZHRoICogMC4xOGYgLQorICAgICAgICAgICAgICAgICAgICAgICAgIGZXaWR0aCAvIDMwIC8gayArIHRhaWwueSksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludCh0YWlsLnggKyBmV2lkdGggLyAzMCAtIGZXaWR0aCAqIDAuMThmIC0gZldpZHRoIC8gMjAgLQorICAgICAgICAgICAgICAgICAgICAgICAgIGZXaWR0aCAvIDE1IC0gZldpZHRoIC8gMjAsCisgICAgICAgICAgICAgICAgICAgICAtayAqIGZXaWR0aCAvIDIwICsgLWsgKiBmV2lkdGggLyAxNSAtIGsgKiBmV2lkdGggLyAyMCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgayAqIGZXaWR0aCAqIDAuMThmIC0gZldpZHRoIC8gMzAgLyBrICsgdGFpbC55KSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KHRhaWwueCArIGZXaWR0aCAvIDMwIC0gZldpZHRoICogMC40NWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWsgKiBmV2lkdGggKiAwLjQ1ZiAtIGZXaWR0aCAvIDMwIC8gayArIHRhaWwueSksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQodGFpbC54ICsgZldpZHRoIC8gMzAgLSBmV2lkdGggKiAwLjQ1ZiArIGZXaWR0aCAqIDAuMmYsCisgICAgICAgICAgICAgICAgICAgICAtZldpZHRoICogMC40ZiAvIGsgLSBrICogZldpZHRoICogMC40NWYgLSBmV2lkdGggLyAzMCAvIGsgKworICAgICAgICAgICAgICAgICAgICAgICAgIHRhaWwueSksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KENpY2xlQ2VudGVyLnggKyBmV2lkdGggKiAwLjJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1mV2lkdGggKiAwLjFmIC8gayArIENpY2xlQ2VudGVyLnkpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoQ2ljbGVDZW50ZXIueCwgQ2ljbGVDZW50ZXIueSksIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChDaWNsZUNlbnRlci54IC0gZldpZHRoIC8gNjAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWsgKiBmV2lkdGggLyA2MCArIENpY2xlQ2VudGVyLnkpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoQ2ljbGVDZW50ZXIueCAtIGZXaWR0aCAvIDYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1rICogZldpZHRoIC8gNjAgKyBDaWNsZUNlbnRlci55KSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KENpY2xlQ2VudGVyLngsIENpY2xlQ2VudGVyLnkpLCBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoQ2ljbGVDZW50ZXIueCAtIGZXaWR0aCAqIDAuMjJmLAorICAgICAgICAgICAgICAgICAgICAgZldpZHRoICogMC4zNWYgLyBrICsgQ2ljbGVDZW50ZXIueSAtIGZIZWlnaHQgKiAwLjA1ZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KHRhaWwueCAtIGZXaWR0aCAvIDMwIC0gZldpZHRoICogMC40NWYgLSBmV2lkdGggKiAwLjE4ZiwKKyAgICAgICAgICAgICAgICAgICAgIGZXaWR0aCAqIDAuMDVmIC8gayAtIGsgKiBmV2lkdGggKiAwLjQ1ZiArIGZXaWR0aCAvIDMwIC8gayArCisgICAgICAgICAgICAgICAgICAgICAgICAgdGFpbC55IC0gZkhlaWdodCAqIDAuMDVmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQodGFpbC54IC0gZldpZHRoIC8gMzAuMGYgLSBmV2lkdGggKiAwLjQ1ZiwKKyAgICAgICAgICAgICAgICAgICAgIC1rICogZldpZHRoICogMC40NWYgKyBmV2lkdGggLyAzMC4wZiAvIGsgKyB0YWlsLnkpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludCh0YWlsLnggLSBmV2lkdGggLyAzMC4wZiwgZldpZHRoIC8gMzAuMGYgLyBrICsgdGFpbC55KSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KHRhaWwueCArIGZXaWR0aCAvIDMwLCAtZldpZHRoIC8gMzAgLyBrICsgdGFpbC55KSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChDaWNsZUNlbnRlci54ICsgZldpZHRoICogMC4wOGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgayAqIGZXaWR0aCAqIDAuMDhmICsgQ2ljbGVDZW50ZXIueSksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoQ2ljbGVDZW50ZXIueCArIGZXaWR0aCAqIDAuMDhmICsgZldpZHRoICogMC4xZiwKKyAgICAgICAgICAgICAgICAgICAgIC1mV2lkdGggKiAwLjFmIC8gayArIGsgKiBmV2lkdGggKiAwLjA4ZiArIENpY2xlQ2VudGVyLnkpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChDaWNsZUNlbnRlci54ICsgZldpZHRoICogMC4yMmYgKyBmV2lkdGggKiAwLjFmLAorICAgICAgICAgICAgICAgICAgICAgayAqIGZXaWR0aCAqIDAuMjJmICsgQ2ljbGVDZW50ZXIueSAtIGZXaWR0aCAqIDAuMWYgLyBrKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoQ2ljbGVDZW50ZXIueCArIGZXaWR0aCAqIDAuMjJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgKiBmV2lkdGggKiAwLjIyZiArIENpY2xlQ2VudGVyLnkpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoQ2ljbGVDZW50ZXIueCArIGZXaWR0aCAqIDAuMjJmIC0gZldpZHRoICogMC4xZiwKKyAgICAgICAgICAgICAgICAgICAgIGZXaWR0aCAqIDAuMWYgLyBrICsgayAqIGZXaWR0aCAqIDAuMjJmICsgQ2ljbGVDZW50ZXIueSksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KENpY2xlQ2VudGVyLnggKyBmV2lkdGggKiAwLjA4ZiAtIGZXaWR0aCAqIDAuMWYsCisgICAgICAgICAgICAgICAgICAgICBmV2lkdGggKiAwLjFmIC8gayArIGsgKiBmV2lkdGggKiAwLjA4ZiArIENpY2xlQ2VudGVyLnkpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChDaWNsZUNlbnRlci54ICsgZldpZHRoICogMC4wOGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgayAqIGZXaWR0aCAqIDAuMDhmICsgQ2ljbGVDZW50ZXIueSksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKX07CiAKLQlpZih0eXBlID09IFBXTFBUX1NUUkVBTSkKLQkJc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgMjgpOwotCWVsc2UKLQkJR2V0UGF0aERhdGFGcm9tQXJyYXkocGF0aCwgUGF0aEFycmF5LCAyOCk7CisgIGlmICh0eXBlID09IFBXTFBUX1NUUkVBTSkKKyAgICBzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCAyOCk7CisgIGVsc2UKKyAgICBHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDI4KTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19OZXdQYXJhZ3JhcGgoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKQotewotCUZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OwotCUZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKK3ZvaWQgQ1BXTF9VdGlsczo6R2V0R3JhcGhpY3NfTmV3UGFyYWdyYXBoKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkgeworICBGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKKyAgRlhfRkxPQVQgZkhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOwogCi0JQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbXSA9IAotCXsKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzIwLjBmKSwgUFdMUFRfTU9WRVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzEwLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodC8yLjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC8xMC4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQvMi4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8yLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodC8yMC4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjEyZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMTcvMzAuMGYpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4xMmYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzEwLjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMjJmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8xMC4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjIyZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMTcvMzAuMGYgLSBmV2lkdGgqMC4xNGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4zOGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzEwLjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNDhmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8xMC4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjQ4ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMTcvMzAuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4zOGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjE3LzMwLjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMzhmLCBjckJCb3guYm90dG9tICsgZldpZHRoKjAuMjRmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMjJmLCBjckJCb3gudG9wIC0gZkhlaWdodCoxNy8zMC4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjEyZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMTcvMzAuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC42ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMTAuMGYpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC43ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMTAuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC43ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMTAuMGYgKyBmSGVpZ2h0LzcuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC45N2YsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzEwLjBmICsgZkhlaWdodC83LjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC45N2YsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjE3LzMwLjBmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC43ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMTcvMzAuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjZmLCBjckJCb3gudG9wIC0gZkhlaWdodCoxNy8zMC4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjZmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8xMC4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjdmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC83ICsgZkhlaWdodCowLjE4ZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjg1ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvNyArIGZIZWlnaHQqMC4xOGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjg1ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMTcvMzAuMGYgLSBmSGVpZ2h0KjAuMDhmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC43ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMTcvMzAuMGYgLSBmSGVpZ2h0KjAuMDhmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC43ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvNyArIGZIZWlnaHQqMC4xOGYpLCBQV0xQVF9MSU5FVE8pCi0JfTsKKyAgQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbXSA9IHsKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDIuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gMjAuMGYpLAorICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAxMC4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQgLyAyLjBmKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDEwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gMi4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodCAvIDIwLjBmKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4xMmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAxNyAvIDMwLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuMTJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMTAuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4yMmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAxMC4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjIyZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMTcgLyAzMC4wZiAtIGZXaWR0aCAqIDAuMTRmKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4zOGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAxMC4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjQ4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDEwLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNDhmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMTcgLyAzMC4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjM4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDE3IC8gMzAuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4zOGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZXaWR0aCAqIDAuMjRmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuMjJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMTcgLyAzMC4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjEyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDE3IC8gMzAuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC42ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDEwLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuN2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAxMC4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjdmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAxMC4wZiArIGZIZWlnaHQgLyA3LjBmKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC45N2YsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDEwLjBmICsgZkhlaWdodCAvIDcuMGYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuOTdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMTcgLyAzMC4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuN2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAxNyAvIDMwLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC42ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDE3IC8gMzAuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC42ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDEwLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuN2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyA3ICsgZkhlaWdodCAqIDAuMThmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuODVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gNyArIGZIZWlnaHQgKiAwLjE4ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuODVmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAxNyAvIDMwLjBmIC0gZkhlaWdodCAqIDAuMDhmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjdmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAxNyAvIDMwLjBmIC0gZkhlaWdodCAqIDAuMDhmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gNyArIGZIZWlnaHQgKiAwLjE4ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyl9OwogCi0JaWYodHlwZSA9PSBQV0xQVF9TVFJFQU0pCi0JCXNQYXRoRGF0YSA9IEdldEFwcFN0cmVhbUZyb21BcnJheShQYXRoQXJyYXksIDI4KTsKLQllbHNlCi0JCUdldFBhdGhEYXRhRnJvbUFycmF5KHBhdGgsIFBhdGhBcnJheSwgMjgpOworICBpZiAodHlwZSA9PSBQV0xQVF9TVFJFQU0pCisgICAgc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgMjgpOworICBlbHNlCisgICAgR2V0UGF0aERhdGFGcm9tQXJyYXkocGF0aCwgUGF0aEFycmF5LCAyOCk7CiB9CiAKLXZvaWQgQ1BXTF9VdGlsczo6R2V0R3JhcGhpY3NfVGV4dE5vdGUoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKQotewotCUZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OwotCUZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKK3ZvaWQgQ1BXTF9VdGlsczo6R2V0R3JhcGhpY3NfVGV4dE5vdGUoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKSB7CisgIEZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OworICBGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207CiAKLQlDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0gCi0JewotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjMvMTAuMGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzE1LjBmKSwgUFdMUFRfTU9WRVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjcvMTAuMGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjQvMTUuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzEwLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCo0LzE1LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC8xMC4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQvMTUuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMTAuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzE1LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzEwLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8xNS4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMy8xMC4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMTUuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzEwLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCo0LzE1LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCozLzEwLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC8xNS4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMy8xMC4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqNC8xNS4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgvMTAuMGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjQvMTUuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvNS4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqNC8xNS4wZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgvNS4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqNC8xNS4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC81LjBmLCBjckJCb3gudG9wIC0gZkhlaWdodCo3LzE1LjBmKSwgUFdMUFRfTU9WRVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC81LjBmLCBjckJCb3gudG9wIC0gZkhlaWdodCo3LzE1LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzUuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjEwLzE1LjBmKSwgUFdMUFRfTU9WRVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCozLzEwLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodCoxMC8xNS4wZiksIFBXTFBUX0xJTkVUTykKLQl9OworICBDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0geworICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDMgLyAxMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDcgLyAxMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDQgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoIC8gMTAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiA0IC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDEwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMTAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAxMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAzIC8gMTAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoIC8gMTAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiA0IC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDMgLyAxMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAzIC8gMTAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiA0IC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDEwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogNCAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiA0IC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiA0IC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDcgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoIC8gNS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDcgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyA1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMTAgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMyAvIDEwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMTAgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyl9OwogCi0JaWYodHlwZSA9PSBQV0xQVF9TVFJFQU0pCi0JCXNQYXRoRGF0YSA9IEdldEFwcFN0cmVhbUZyb21BcnJheShQYXRoQXJyYXksIDE3KTsKLQllbHNlCi0JCUdldFBhdGhEYXRhRnJvbUFycmF5KHBhdGgsIFBhdGhBcnJheSwgMTcpOworICBpZiAodHlwZSA9PSBQV0xQVF9TVFJFQU0pCisgICAgc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgMTcpOworICBlbHNlCisgICAgR2V0UGF0aERhdGFGcm9tQXJyYXkocGF0aCwgUGF0aEFycmF5LCAxNyk7CiB9CiAKLXZvaWQgQ1BXTF9VdGlsczo6R2V0R3JhcGhpY3NfUGFyYWdyYXBoKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkKLXsKLQlGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKLQlGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207Cit2b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX1BhcmFncmFwaChDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpIHsKKyAgRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7CisgIEZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKIAotCUNQV0xfUGF0aERhdGEgUGF0aEFycmF5W10gPQotCXsKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzE1LjBmKSwgUFdMUFRfTU9WRVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuN2YsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzE1LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuN2YsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzE1LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNjM0ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMTUuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC42MzRmLCBjckJCb3gudG9wIC0gZkhlaWdodCoyLzE1LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNTY2ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMi8xNS4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjU2NmYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzE1LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIuMGYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0LzE1LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzE1LjBmIC0gZkhlaWdodCowLjRmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMmYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzE1LjBmIC0gZkhlaWdodCowLjRmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4yZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQvMTUuMGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8yLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodC8xNS4wZiksIFBXTFBUX0JFWklFUlRPKQotCX07CisgIENQV0xfUGF0aERhdGEgUGF0aEFycmF5W10gPSB7CisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodCAvIDE1LjBmKSwKKyAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC43ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQgLyAxNS4wZiksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuN2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjYzNGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjYzNGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAyIC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC41NjZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMiAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNTY2ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDIuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAxNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gMTUuMGYgLSBmSGVpZ2h0ICogMC40ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gMTUuMGYgLSBmSGVpZ2h0ICogMC40ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuMmYsIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gMTUuMGYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDIuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gMTUuMGYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKX07CiAKLQlpZih0eXBlID09IFBXTFBUX1NUUkVBTSkKLQkJc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgMTIpOwotCWVsc2UKLQkJR2V0UGF0aERhdGFGcm9tQXJyYXkocGF0aCwgUGF0aEFycmF5LCAxMik7CisgIGlmICh0eXBlID09IFBXTFBUX1NUUkVBTSkKKyAgICBzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCAxMik7CisgIGVsc2UKKyAgICBHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDEyKTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19SaWdodEFycm93KENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkKLXsKLQlGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKLQlGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207Cit2b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX1JpZ2h0QXJyb3coQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKSB7CisgIEZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OworICBGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207CiAKLQlDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0gCi0JewotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzE1LjBmLCBjckJCb3gudG9wIC0gZkhlaWdodC8yLjBmKSwgUFdMUFRfTU9WRVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIuMGYgKyBmV2lkdGgvOC4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvNS4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8yLjBmLCBjckJCb3guYm90dG9tICsgZkhlaWdodC81LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC8xNS4wZiAtIGZXaWR0aCowLjE1ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQvMi4wZiAtIGZXaWR0aC8yNS4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjFmLCBjckJCb3gudG9wIC0gZkhlaWdodC8yLjBmIC0gZldpZHRoLzI1LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMWYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzIuMGYgKyBmV2lkdGgvMjUuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzE1LjBmIC0gZldpZHRoKjAuMTVmLCBjckJCb3gudG9wIC0gZkhlaWdodC8yLjBmICsgZldpZHRoLzI1LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzUuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMi4wZiArIGZXaWR0aC84LjBmLCBjckJCb3gudG9wIC0gZkhlaWdodC81LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC8xNS4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQvMi4wZiksIFBXTFBUX0xJTkVUTykKLQl9OworICBDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0geworICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDE1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gMi4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLjBmICsgZldpZHRoIC8gOC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMi4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDE1LjBmIC0gZldpZHRoICogMC4xNWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgLyAyLjBmIC0gZldpZHRoIC8gMjUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4xZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAvIDIuMGYgLSBmV2lkdGggLyAyNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gMi4wZiArIGZXaWR0aCAvIDI1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAxNS4wZiAtIGZXaWR0aCAqIDAuMTVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gMi4wZiArIGZXaWR0aCAvIDI1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDIuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gNS4wZiksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDIuMGYgKyBmV2lkdGggLyA4LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoIC8gMTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgLyAyLjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKX07CiAKLQlpZih0eXBlID09IFBXTFBUX1NUUkVBTSkKLQkJc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgMTApOwotCWVsc2UKLQkJR2V0UGF0aERhdGFGcm9tQXJyYXkocGF0aCwgUGF0aEFycmF5LCAxMCk7CisgIGlmICh0eXBlID09IFBXTFBUX1NUUkVBTSkKKyAgICBzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCAxMCk7CisgIGVsc2UKKyAgICBHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDEwKTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19SaWdodFBvaW50ZXIoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKQotewotCUZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OwotCUZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKK3ZvaWQgQ1BXTF9VdGlsczo6R2V0R3JhcGhpY3NfUmlnaHRQb2ludGVyKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkgeworICBGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKKyAgRlhfRkxPQVQgZkhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOwogCi0JQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbXSA9IAotCXsKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC8zMC4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQvMi4wZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8zMC4wZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvNi4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCo0LzE1LjBmLCBjckJCb3gudG9wIC0gZkhlaWdodC8yLjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzMwLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodC82LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC8zMC4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQvMi4wZiksIFBXTFBUX0xJTkVUTykKLQl9OworICBDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0geworICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDMwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gMi4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAzMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDYuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogNCAvIDE1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gMi4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAzMC4wZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQgLyA2LjBmKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDMwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0IC8gMi4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyl9OwogCi0JaWYodHlwZSA9PSBQV0xQVF9TVFJFQU0pCi0JCXNQYXRoRGF0YSA9IEdldEFwcFN0cmVhbUZyb21BcnJheShQYXRoQXJyYXksIDUpOwotCWVsc2UKLQkJR2V0UGF0aERhdGFGcm9tQXJyYXkocGF0aCwgUGF0aEFycmF5LCA1KTsKKyAgaWYgKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQorICAgIHNQYXRoRGF0YSA9IEdldEFwcFN0cmVhbUZyb21BcnJheShQYXRoQXJyYXksIDUpOworICBlbHNlCisgICAgR2V0UGF0aERhdGFGcm9tQXJyYXkocGF0aCwgUGF0aEFycmF5LCA1KTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19TdGFyKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkKLXsKLQlGWF9GTE9BVCBmTG9uZ1JhZGl1cyA9IChjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbSkvKDErKEZYX0ZMT0FUKWNvcyhQV0xfUEkvNS4wZikpOwotCWZMb25nUmFkaXVzID0gZkxvbmdSYWRpdXMgKiAwLjdmOwotCUZYX0ZMT0FUIGZTaG9ydFJhZGl1cyA9IGZMb25nUmFkaXVzICogMC41NWY7Ci0JQ1BERl9Qb2ludCBwdENlbnRlciA9IENQREZfUG9pbnQoKGNyQkJveC5sZWZ0ICsgY3JCQm94LnJpZ2h0KSAvIDIuMGYsKGNyQkJveC50b3AgKyBjckJCb3guYm90dG9tKSAvIDIuMGYpOwotCQotCUZYX0ZMT0FUIHB4MVs1XSwgcHkxWzVdOwotCUZYX0ZMT0FUIHB4Mls1XSwgcHkyWzVdOwordm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19TdGFyKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkgeworICBGWF9GTE9BVCBmTG9uZ1JhZGl1cyA9CisgICAgICAoY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b20pIC8gKDEgKyAoRlhfRkxPQVQpY29zKFBXTF9QSSAvIDUuMGYpKTsKKyAgZkxvbmdSYWRpdXMgPSBmTG9uZ1JhZGl1cyAqIDAuN2Y7CisgIEZYX0ZMT0FUIGZTaG9ydFJhZGl1cyA9IGZMb25nUmFkaXVzICogMC41NWY7CisgIENQREZfUG9pbnQgcHRDZW50ZXIgPSBDUERGX1BvaW50KChjckJCb3gubGVmdCArIGNyQkJveC5yaWdodCkgLyAyLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3JCQm94LnRvcCArIGNyQkJveC5ib3R0b20pIC8gMi4wZik7CiAKLQlGWF9GTE9BVCBmQW5nZWwgPSBQV0xfUEkvMTAuMGY7CisgIEZYX0ZMT0FUIHB4MVs1XSwgcHkxWzVdOworICBGWF9GTE9BVCBweDJbNV0sIHB5Mls1XTsKIAotCWZvciAoRlhfSU5UMzIgaT0wOyBpPDU7IGkrKykKLQl7Ci0JCXB4MVtpXSA9IHB0Q2VudGVyLnggKyBmTG9uZ1JhZGl1cyAqIChGWF9GTE9BVCljb3MoZkFuZ2VsKTsKLQkJcHkxW2ldID0gcHRDZW50ZXIueSArIGZMb25nUmFkaXVzICogKEZYX0ZMT0FUKXNpbihmQW5nZWwpOworICBGWF9GTE9BVCBmQW5nZWwgPSBQV0xfUEkgLyAxMC4wZjsKIAotCQlmQW5nZWwgKz0gUFdMX1BJICogMiAvIDUuMGY7Ci0JfQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICBweDFbaV0gPSBwdENlbnRlci54ICsgZkxvbmdSYWRpdXMgKiAoRlhfRkxPQVQpY29zKGZBbmdlbCk7CisgICAgcHkxW2ldID0gcHRDZW50ZXIueSArIGZMb25nUmFkaXVzICogKEZYX0ZMT0FUKXNpbihmQW5nZWwpOwogCi0JZkFuZ2VsID0gUFdMX1BJLzUuMGYgKyBQV0xfUEkvMTAuMGY7CisgICAgZkFuZ2VsICs9IFBXTF9QSSAqIDIgLyA1LjBmOworICB9CiAKLQlmb3IgKEZYX0lOVDMyIGo9MDsgajw1OyBqKyspCi0JewotCQlweDJbal0gPSBwdENlbnRlci54ICsgZlNob3J0UmFkaXVzICogKEZYX0ZMT0FUKWNvcyhmQW5nZWwpOwotCQlweTJbal0gPSBwdENlbnRlci55ICsgZlNob3J0UmFkaXVzICogKEZYX0ZMT0FUKXNpbihmQW5nZWwpOworICBmQW5nZWwgPSBQV0xfUEkgLyA1LjBmICsgUFdMX1BJIC8gMTAuMGY7CiAKLQkJZkFuZ2VsICs9IFBXTF9QSSAqIDIgLyA1LjBmOwotCX0KKyAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgNTsgaisrKSB7CisgICAgcHgyW2pdID0gcHRDZW50ZXIueCArIGZTaG9ydFJhZGl1cyAqIChGWF9GTE9BVCljb3MoZkFuZ2VsKTsKKyAgICBweTJbal0gPSBwdENlbnRlci55ICsgZlNob3J0UmFkaXVzICogKEZYX0ZMT0FUKXNpbihmQW5nZWwpOwogCi0JQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbMTFdOwotCVBhdGhBcnJheVswXSA9IENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChweDFbMF0sIHB5MVswXSksIFBXTFBUX01PVkVUTyk7Ci0JUGF0aEFycmF5WzFdID0gQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KHB4MlswXSwgcHkyWzBdKSwgUFdMUFRfTElORVRPKTsKKyAgICBmQW5nZWwgKz0gUFdMX1BJICogMiAvIDUuMGY7CisgIH0KIAotCWZvcihGWF9JTlQzMiBrID0gMDsgayA8IDQ7IGsrKykKLQl7Ci0JCVBhdGhBcnJheVsoaysxKSoyXSA9IENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChweDFbaysxXSwgcHkxW2srMV0pLCBQV0xQVF9MSU5FVE8pOwotCQlQYXRoQXJyYXlbKGsrMSkqMiArIDFdID0gQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KHB4MltrKzFdLCBweTJbaysxXSksIFBXTFBUX0xJTkVUTyk7Ci0JfQorICBDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVsxMV07CisgIFBhdGhBcnJheVswXSA9IENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChweDFbMF0sIHB5MVswXSksIFBXTFBUX01PVkVUTyk7CisgIFBhdGhBcnJheVsxXSA9IENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChweDJbMF0sIHB5MlswXSksIFBXTFBUX0xJTkVUTyk7CisKKyAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgNDsgaysrKSB7CisgICAgUGF0aEFycmF5WyhrICsgMSkgKiAyXSA9CisgICAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChweDFbayArIDFdLCBweTFbayArIDFdKSwgUFdMUFRfTElORVRPKTsKKyAgICBQYXRoQXJyYXlbKGsgKyAxKSAqIDIgKyAxXSA9CisgICAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChweDJbayArIDFdLCBweTJbayArIDFdKSwgUFdMUFRfTElORVRPKTsKKyAgfQogCi0JUGF0aEFycmF5WzEwXSA9IENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChweDFbMF0sIHB5MVswXSksIFBXTFBUX0xJTkVUTyk7CisgIFBhdGhBcnJheVsxMF0gPSBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQocHgxWzBdLCBweTFbMF0pLCBQV0xQVF9MSU5FVE8pOwogCi0JaWYodHlwZSA9PSBQV0xQVF9TVFJFQU0pCi0JCXNQYXRoRGF0YSA9IEdldEFwcFN0cmVhbUZyb21BcnJheShQYXRoQXJyYXksIDExKTsKLQllbHNlCi0JCUdldFBhdGhEYXRhRnJvbUFycmF5KHBhdGgsIFBhdGhBcnJheSwgMTEpOworICBpZiAodHlwZSA9PSBQV0xQVF9TVFJFQU0pCisgICAgc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgMTEpOworICBlbHNlCisgICAgR2V0UGF0aERhdGFGcm9tQXJyYXkocGF0aCwgUGF0aEFycmF5LCAxMSk7CiB9CiAKLXZvaWQgQ1BXTF9VdGlsczo6R2V0R3JhcGhpY3NfVXBBcnJvdyhDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLCBDRlhfUGF0aERhdGEmIHBhdGgsIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LCBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpCi17Ci0JRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7Ci0JRlhfRkxPQVQgZkhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOwordm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19VcEFycm93KENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkgeworICBGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKKyAgRlhfRkxPQVQgZkhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOwogCi0JQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbXSA9IAotCXsKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzE1LjBmKSwgUFdMUFRfTU9WRVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC8xMC4wZiwgY3JCQm94LnRvcCAtIGZXaWR0aCozLzUuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC42ZiwgY3JCQm94LnRvcCAtIGZXaWR0aCozLzUuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC42ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMTUuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC40ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQvMTUuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC40ZiwgY3JCQm94LnRvcCAtIGZXaWR0aCozLzUuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMTAsIGNyQkJveC50b3AgLSBmV2lkdGgqMy81LjBmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzIuMGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0LzE1LjBmKSwgUFdMUFRfTElORVRPKQotCX07CisgIENQV0xfUGF0aERhdGEgUGF0aEFycmF5W10gPSB7CisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodCAvIDE1LjBmKSwKKyAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDEwLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmV2lkdGggKiAzIC8gNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmV2lkdGggKiAzIC8gNS4wZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMTUuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC40ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDE1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZXaWR0aCAqIDMgLyA1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDEwLCBjckJCb3gudG9wIC0gZldpZHRoICogMyAvIDUuMGYpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLjBmLCBjckJCb3gudG9wIC0gZkhlaWdodCAvIDE1LjBmKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pfTsKIAotCWlmKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQotCQlzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCA4KTsKLQllbHNlCi0JCUdldFBhdGhEYXRhRnJvbUFycmF5KHBhdGgsIFBhdGhBcnJheSwgOCk7CisgIGlmICh0eXBlID09IFBXTFBUX1NUUkVBTSkKKyAgICBzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCA4KTsKKyAgZWxzZQorICAgIEdldFBhdGhEYXRhRnJvbUFycmF5KHBhdGgsIFBhdGhBcnJheSwgOCk7CiB9CiAKLXZvaWQgQ1BXTF9VdGlsczo6R2V0R3JhcGhpY3NfVXBMZWZ0QXJyb3coQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKQotewotCUZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OwotCUZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKLQlDUFdMX1BvaW50IGxlZnR1cChjckJCb3gubGVmdCwgY3JCQm94LnRvcCk7Ci0JQ1BXTF9Qb2ludCByaWdodGRvd24oY3JCQm94LnJpZ2h0LCBjckJCb3guYm90dG9tKTsKLQlGWF9GTE9BVCBrID0gLWZIZWlnaHQvZldpZHRoOwotCUNQV0xfUG9pbnQgdGFpbDsKLQl0YWlsLnggPSBjckJCb3gubGVmdCArIGZXaWR0aCo0LzUuMGY7Ci0JdGFpbC55ID0gayoodGFpbC54IC0gY3JCQm94LnJpZ2h0KSArIHJpZ2h0ZG93bi55Owordm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19VcExlZnRBcnJvdyhDRlhfQnl0ZVN0cmluZyYgc1BhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgY3JCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQV0xfUEFUSF9UWVBFIHR5cGUpIHsKKyAgRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7CisgIEZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKKyAgQ1BXTF9Qb2ludCBsZWZ0dXAoY3JCQm94LmxlZnQsIGNyQkJveC50b3ApOworICBDUFdMX1BvaW50IHJpZ2h0ZG93bihjckJCb3gucmlnaHQsIGNyQkJveC5ib3R0b20pOworICBGWF9GTE9BVCBrID0gLWZIZWlnaHQgLyBmV2lkdGg7CisgIENQV0xfUG9pbnQgdGFpbDsKKyAgdGFpbC54ID0gY3JCQm94LmxlZnQgKyBmV2lkdGggKiA0IC8gNS4wZjsKKyAgdGFpbC55ID0gayAqICh0YWlsLnggLSBjckJCb3gucmlnaHQpICsgcmlnaHRkb3duLnk7CiAKLQlDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0gCi0JewotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvMjAuMGYsIGsqKGNyQkJveC5sZWZ0ICsgZldpZHRoLzIwLjBmIC0gcmlnaHRkb3duLngpICsgcmlnaHRkb3duLnkpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoZkhlaWdodCoxNy82MC4wZi9rICsgdGFpbC54ICsgZldpZHRoLzEwLjBmICsgZldpZHRoLzUuMGYsCi0JCSAgICAgICAgICAgICAgLWZXaWR0aC81LjBmL2sgKyB0YWlsLnkgLSBmV2lkdGgvMTAuMGYvayArIGZIZWlnaHQqMTcvNjAuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoZkhlaWdodCoxNy82MC4wZi9rICsgdGFpbC54ICsgZldpZHRoLzEwLjBmLAotCQkgICAgICAgICAgICAgIHRhaWwueSAtIGZXaWR0aC8xMC4wZi9rICsgZkhlaWdodCoxNy82MC4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludCh0YWlsLnggKyBmV2lkdGgvMTAuMGYsIHRhaWwueSAtIGZXaWR0aC8xMC4wZi9rKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KHRhaWwueCAtIGZXaWR0aC8xMC4wZiwgdGFpbC55ICsgZldpZHRoLzEwLjBmL2spLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoZkhlaWdodCoxNy82MC4wZi9rICsgdGFpbC54IC0gZldpZHRoLzEwLjBmLCB0YWlsLnkgKyBmV2lkdGgvMTAuMGYvayArIGZIZWlnaHQqMTcvNjAuMGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoZkhlaWdodCoxNy82MC4wZi9rICsgdGFpbC54IC0gZldpZHRoLzEwLjBmIC0gZldpZHRoLzUuMGYsCi0JCSAgICAgICAgICAgICAgZldpZHRoLzUuMGYvayArIHRhaWwueSArIGZXaWR0aC8xMC4wZi9rICsgZkhlaWdodCoxNy82MC4wZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC8yMC4wZiwgayooY3JCQm94LmxlZnQgKyBmV2lkdGgvMjAuMGYgLSByaWdodGRvd24ueCkgKyByaWdodGRvd24ueSksIFBXTFBUX0xJTkVUTykKLQl9OworICBDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0geworICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KAorICAgICAgICAgICAgICBjckJCb3gubGVmdCArIGZXaWR0aCAvIDIwLjBmLAorICAgICAgICAgICAgICBrICogKGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMjAuMGYgLSByaWdodGRvd24ueCkgKyByaWdodGRvd24ueSksCisgICAgICAgICAgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChmSGVpZ2h0ICogMTcgLyA2MC4wZiAvIGsgKyB0YWlsLnggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmV2lkdGggLyAxMC4wZiArIGZXaWR0aCAvIDUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWZXaWR0aCAvIDUuMGYgLyBrICsgdGFpbC55IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZldpZHRoIC8gMTAuMGYgLyBrICsgZkhlaWdodCAqIDE3IC8gNjAuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGZIZWlnaHQgKiAxNyAvIDYwLjBmIC8gayArIHRhaWwueCArIGZXaWR0aCAvIDEwLjBmLAorICAgICAgICAgICAgICAgICAgICAgdGFpbC55IC0gZldpZHRoIC8gMTAuMGYgLyBrICsgZkhlaWdodCAqIDE3IC8gNjAuMGYpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQodGFpbC54ICsgZldpZHRoIC8gMTAuMGYsIHRhaWwueSAtIGZXaWR0aCAvIDEwLjBmIC8gayksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludCh0YWlsLnggLSBmV2lkdGggLyAxMC4wZiwgdGFpbC55ICsgZldpZHRoIC8gMTAuMGYgLyBrKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGZIZWlnaHQgKiAxNyAvIDYwLjBmIC8gayArIHRhaWwueCAtIGZXaWR0aCAvIDEwLjBmLAorICAgICAgICAgICAgICAgICAgICAgdGFpbC55ICsgZldpZHRoIC8gMTAuMGYgLyBrICsgZkhlaWdodCAqIDE3IC8gNjAuMGYpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoZkhlaWdodCAqIDE3IC8gNjAuMGYgLyBrICsgdGFpbC54IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZldpZHRoIC8gMTAuMGYgLSBmV2lkdGggLyA1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZXaWR0aCAvIDUuMGYgLyBrICsgdGFpbC55ICsgZldpZHRoIC8gMTAuMGYgLyBrICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkhlaWdodCAqIDE3IC8gNjAuMGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KAorICAgICAgICAgICAgICBjckJCb3gubGVmdCArIGZXaWR0aCAvIDIwLjBmLAorICAgICAgICAgICAgICBrICogKGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMjAuMGYgLSByaWdodGRvd24ueCkgKyByaWdodGRvd24ueSksCisgICAgICAgICAgUFdMUFRfTElORVRPKX07CiAKLQlpZih0eXBlID09IFBXTFBUX1NUUkVBTSkKLQkJc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgOCk7Ci0JZWxzZQotCQlHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDgpOworICBpZiAodHlwZSA9PSBQV0xQVF9TVFJFQU0pCisgICAgc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgOCk7CisgIGVsc2UKKyAgICBHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDgpOwogfQogCi12b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX0dyYXBoKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkKLXsKLQlGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKLQlGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207Cit2b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX0dyYXBoKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkgeworICBGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKKyAgRlhfRkxPQVQgZkhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOwogCi0JQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbXSA9IAotCXsKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMDVmLCBjckJCb3gudG9wIC0gZldpZHRoKjAuMTVmKSwgUFdMUFRfTU9WRVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMjVmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjE1ZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjI3NWYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuMDhmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMDVmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjA4ZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjA1ZiwgY3JCQm94LnRvcCAtIGZXaWR0aCowLjE1ZiksIFBXTFBUX0xJTkVUTyksCisgIENQV0xfUGF0aERhdGEgUGF0aEFycmF5W10gPSB7CisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjA1ZiwgY3JCQm94LnRvcCAtIGZXaWR0aCAqIDAuMTVmKSwKKyAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4yNWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjE1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjI3NWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjA4ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjA1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMDhmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuMDVmLCBjckJCb3gudG9wIC0gZldpZHRoICogMC4xNWYpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCiAKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMjc1ZiwgY3JCQm94LnRvcCAtIGZXaWR0aCowLjQ1ZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjQ3NWYsIGNyQkJveC50b3AgLSBmV2lkdGgqMC40NWYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC40NzVmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjA4ZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjI3NWYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuMDhmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuMjc1ZiwgY3JCQm94LnRvcCAtIGZXaWR0aCowLjQ1ZiksIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjI3NWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZXaWR0aCAqIDAuNDVmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNDc1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZldpZHRoICogMC40NWYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC40NzVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4wOGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4yNzVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4wOGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4yNzVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmV2lkdGggKiAwLjQ1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCiAKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNWYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMDVmKSwgUFdMUFRfTU9WRVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuN2YsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMDVmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuN2YsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuMDhmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNWYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuMDhmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNWYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMDVmKSwgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNWYsIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4wNWYpLAorICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjdmLCBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMDVmKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC43ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMDhmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjA4ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjVmLCBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMDVmKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAogCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjcyNWYsIGNyQkJveC50b3AgLSBmV2lkdGgqMC4zNWYpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC45MjVmLCBjckJCb3gudG9wIC0gZldpZHRoKjAuMzVmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuOTI1ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4wOGYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC43MjVmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjA4ZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjcyNWYsIGNyQkJveC50b3AgLSBmV2lkdGgqMC4zNWYpLCBQV0xQVF9MSU5FVE8pCi0JfTsKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNzI1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZldpZHRoICogMC4zNWYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC45MjVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmV2lkdGggKiAwLjM1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjkyNWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjA4ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjcyNWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjA4ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjcyNWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZXaWR0aCAqIDAuMzVmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKX07CiAKLQlpZih0eXBlID09IFBXTFBUX1NUUkVBTSkKLQkJc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgMjApOwotCWVsc2UKLQkJR2V0UGF0aERhdGFGcm9tQXJyYXkocGF0aCwgUGF0aEFycmF5LCAyMCk7CisgIGlmICh0eXBlID09IFBXTFBUX1NUUkVBTSkKKyAgICBzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCAyMCk7CisgIGVsc2UKKyAgICBHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDIwKTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19QYXBlcmNsaXAoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKQotewotCUZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OwotCUZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKK3ZvaWQgQ1BXTF9VdGlsczo6R2V0R3JhcGhpY3NfUGFwZXJjbGlwKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkgeworICBGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKKyAgRlhfRkxPQVQgZkhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOwogCi0JQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbXSA9IAotCXsKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzYwLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjI1ZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aC82MCwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4yNWYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvNjAsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuMjVmIC0gZldpZHRoKjU3LzYwLjBmKjAuMzVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzMwLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjI1ZiAtIGZXaWR0aCo1Ny82MC4wZiowLjM1ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC8zMCwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4yNWYpLCBQV0xQVF9CRVpJRVJUTyksCisgIENQV0xfUGF0aERhdGEgUGF0aEFycmF5W10gPSB7CisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyA2MCwgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjI1ZiksCisgICAgICAgICAgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4yNWYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gNjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjI1ZiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZXaWR0aCAqIDU3IC8gNjAuMGYgKiAwLjM1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAzMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMjVmIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZldpZHRoICogNTcgLyA2MC4wZiAqIDAuMzVmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4yNWYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCiAKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC8zMCwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4zM2YpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzMwLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjMzZiArIGZIZWlnaHQvMTUqMC41ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC8zMCAtIGZXaWR0aCowLjEyZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4zM2YgKyBmSGVpZ2h0LzE1KjAuNWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgvMzAgLSBmV2lkdGgqMC4xMmYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMzNmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzMwIC0gZldpZHRoKjAuMTJmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjJmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC8zMCAtIGZXaWR0aCowLjEyZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4yZiAtIChmV2lkdGgqNTcvNjAuMGYgLSBmV2lkdGgqMC4yNGYpKjAuMjVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvNjAgKyBmV2lkdGgqMC4xMmYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuMmYgLSAoZldpZHRoKjU3LzYwLjBmIC0gZldpZHRoKjAuMjRmKSowLjI1ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzYwICsgZldpZHRoKjAuMTJmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjJmKSwgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDMwLCBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMzNmKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDMwLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjMzZiArIGZIZWlnaHQgLyAxNSAqIDAuNWYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAzMCAtIGZXaWR0aCAqIDAuMTJmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjMzZiArIGZIZWlnaHQgLyAxNSAqIDAuNWYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAzMCAtIGZXaWR0aCAqIDAuMTJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4zM2YpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCiAKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzYwICsgZldpZHRoKjAuMTJmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjJmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzYwICsgZldpZHRoKjAuMTJmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjJmICsgKGZXaWR0aCoxMS8xMi4wZiAtIGZXaWR0aCowLjM2ZikqMC4yNWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgvMTUgLSBmV2lkdGgqMC4yNGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMmYgKyAoZldpZHRoKjExLzEyLjBmIC0gZldpZHRoKjAuMzZmKSowLjI1ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC8xNSAtIGZXaWR0aCowLjI0ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4yZiksIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAzMCAtIGZXaWR0aCAqIDAuMTJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4yZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoIC8gMzAgLSBmV2lkdGggKiAwLjEyZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4yZiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgKGZXaWR0aCAqIDU3IC8gNjAuMGYgLSBmV2lkdGggKiAwLjI0ZikgKiAwLjI1ZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gNjAgKyBmV2lkdGggKiAwLjEyZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4yZiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgKGZXaWR0aCAqIDU3IC8gNjAuMGYgLSBmV2lkdGggKiAwLjI0ZikgKiAwLjI1ZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gNjAgKyBmV2lkdGggKiAwLjEyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMmYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDYwICsgZldpZHRoICogMC4xMmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjJmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAvIDYwICsgZldpZHRoICogMC4xMmYsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMmYgKworICAgICAgICAgICAgICAgICAgICAgICAgIChmV2lkdGggKiAxMSAvIDEyLjBmIC0gZldpZHRoICogMC4zNmYpICogMC4yNWYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAxNSAtIGZXaWR0aCAqIDAuMjRmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjJmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZldpZHRoICogMTEgLyAxMi4wZiAtIGZXaWR0aCAqIDAuMzZmKSAqIDAuMjVmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoIC8gMTUgLSBmV2lkdGggKiAwLjI0ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMmYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCiAKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC8xNSAtIGZXaWR0aCowLjI0ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4yNWYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzE1IC0gZldpZHRoKjAuMjRmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjI1ZiAtIChmV2lkdGgqMTQvMTUuMGYgLSBmV2lkdGgqMC41M2YpKjAuMjVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4yOWYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuMjVmIC0gKGZXaWR0aCoxNC8xNS4wZiAtIGZXaWR0aCowLjUzZikqMC4yNWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjI5ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4yNWYpLCBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoIC8gMTUgLSBmV2lkdGggKiAwLjI0ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMjVmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAxNSAtIGZXaWR0aCAqIDAuMjRmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjI1ZiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgKGZXaWR0aCAqIDE0IC8gMTUuMGYgLSBmV2lkdGggKiAwLjUzZikgKiAwLjI1ZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4yOWYsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMjVmIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAoZldpZHRoICogMTQgLyAxNS4wZiAtIGZXaWR0aCAqIDAuNTNmKSAqIDAuMjVmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjI5ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuMjVmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAogCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjI5ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4zM2YpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4yOWYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMzNmICsgZldpZHRoKjAuMTJmKjAuMzVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4xN2YsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMzNmICsgZldpZHRoKjAuMTJmKjAuMzVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4xN2YsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMzNmKSwgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4yOWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjMzZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjI5ZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4zM2YgKyBmV2lkdGggKiAwLjEyZiAqIDAuMzVmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjE3ZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4zM2YgKyBmV2lkdGggKiAwLjEyZiAqIDAuMzVmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjE3ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMzNmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAogCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjE3ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4zZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjE3ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4zZiAtIGZXaWR0aCooMTQvMTUuMGYgLSAwLjI5ZikqMC4zNWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgvMTUgLSBmV2lkdGgqMC4xMmYsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0KjAuM2YgLSBmV2lkdGgqKDE0LzE1LjBmIC0gMC4yOWYpKjAuMzVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoLzE1IC0gZldpZHRoKjAuMTJmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjNmKSwgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4xN2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjNmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuMTdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4zZiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZXaWR0aCAqICgxNCAvIDE1LjBmIC0gMC4yOWYpICogMC4zNWYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoIC8gMTUgLSBmV2lkdGggKiAwLjEyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3guYm90dG9tICsgZkhlaWdodCAqIDAuM2YgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmV2lkdGggKiAoMTQgLyAxNS4wZiAtIDAuMjlmKSAqIDAuMzVmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAvIDE1IC0gZldpZHRoICogMC4xMmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjNmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAogCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgvMTUgLSBmV2lkdGgqMC4xMmYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMjVmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aC8xNSAtIGZXaWR0aCowLjEyZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4yNWYgKyBmV2lkdGgqMC4zNWYqKDExLzEyLjBmIC0gMC4xMmYpKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgvNjAsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMjVmICsgZldpZHRoKjAuMzVmKigxMS8xMi4wZiAtIDAuMTJmKSksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoLzYwLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjI1ZiksIFBXTFBUX0JFWklFUlRPKQotCX07CisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoIC8gMTUgLSBmV2lkdGggKiAwLjEyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMjVmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggLyAxNSAtIGZXaWR0aCAqIDAuMTJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4yNWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmV2lkdGggKiAwLjM1ZiAqICgxMSAvIDEyLjBmIC0gMC4xMmYpKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gNjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjI1ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZXaWR0aCAqIDAuMzVmICogKDExIC8gMTIuMGYgLSAwLjEyZikpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyA2MCwgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjI1ZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pfTsKIAotCWlmKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQotCQlzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCAzMyk7Ci0JZWxzZQotCQlHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDMzKTsJCisgIGlmICh0eXBlID09IFBXTFBUX1NUUkVBTSkKKyAgICBzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCAzMyk7CisgIGVsc2UKKyAgICBHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDMzKTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19BdHRhY2htZW50KENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkKLXsKLQlGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKLQlGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207Cit2b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX0F0dGFjaG1lbnQoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKSB7CisgIEZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OworICBGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207CiAKLQlDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0gCi0JewotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4yNWYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMWYpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC40ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4yM2YpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC40ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC41ZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjRmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjVmICsgZldpZHRoKjAuMDRmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC42ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC41ZiArIGZXaWR0aCowLjA0ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNmYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuNWYpLCBQV0xQVF9CRVpJRVJUTyksCisgIENQV0xfUGF0aERhdGEgUGF0aEFycmF5W10gPSB7CisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjI1ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjFmKSwKKyAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC40ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjIzZiksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC41ZiksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjVmICsgZldpZHRoICogMC4wNGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC41ZiArIGZXaWR0aCAqIDAuMDRmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC42ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjVmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCiAKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNmYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMjNmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjI1ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4xZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjI1ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4xZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjRmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjIzZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjZmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjIzZiksIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjZmLCBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuMjNmKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuMjVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4xZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjI1ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjFmKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC40ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjIzZiksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNmYsIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4yM2YpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCiAKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuNWYpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC40ZiAtIGZXaWR0aCowLjI1ZiowLjRmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4xNWYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuNjVmICsgZkhlaWdodCowLjE1ZiowLjRmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4xNWYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuNjVmKSwgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC40ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjVmKSwKKyAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC40ZiAtIGZXaWR0aCAqIDAuMjVmICogMC40ZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC41ZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4xNWYsCisgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuNjVmICsgZkhlaWdodCAqIDAuMTVmICogMC40ZiksCisgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC4xNWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjY1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKIAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjAuMTVmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjY1ZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMC4xNWYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuNjVmICsgZkhlaWdodCowLjE1ZiowLjRmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC42ZiArIGZXaWR0aCowLjI1ZiowLjRmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjVmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC42ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC41ZiksIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjE1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuNjVmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjE1ZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC42NWYgKyBmSGVpZ2h0ICogMC4xNWYgKiAwLjRmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjZmICsgZldpZHRoICogMC4yNWYgKiAwLjRmLAorICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjVmKSwKKyAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjZmLCBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuNWYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKIAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC42ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC41ZiArIGZXaWR0aCowLjA0ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuNWYgKyBmV2lkdGgqMC4wNGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjRmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjVmKSwgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC42ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuNWYgKyBmV2lkdGggKiAwLjA0ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjVmICsgZldpZHRoICogMC4wNGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjRmLCBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuNWYpLAorICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKIAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC41ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC42NWYpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC41ZiwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQqMC4xZiksIFBXTFBUX0xJTkVUTykKLQl9OworICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC41ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjY1ZiksCisgICAgICAgICAgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjFmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKX07CiAKLQlpZih0eXBlID09IFBXTFBUX1NUUkVBTSkKLQkJc1BhdGhEYXRhID0gR2V0QXBwU3RyZWFtRnJvbUFycmF5KFBhdGhBcnJheSwgMjQpOwotCWVsc2UKLQkJR2V0UGF0aERhdGFGcm9tQXJyYXkocGF0aCwgUGF0aEFycmF5LCAyNCk7CisgIGlmICh0eXBlID09IFBXTFBUX1NUUkVBTSkKKyAgICBzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCAyNCk7CisgIGVsc2UKKyAgICBHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDI0KTsKIH0KIAotdm9pZCBDUFdMX1V0aWxzOjpHZXRHcmFwaGljc19UYWcoQ0ZYX0J5dGVTdHJpbmcmIHNQYXRoRGF0YSwgQ0ZYX1BhdGhEYXRhJiBwYXRoLCBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwgY29uc3QgUFdMX1BBVEhfVFlQRSB0eXBlKQotewotCUZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OwotCUZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKK3ZvaWQgQ1BXTF9VdGlsczo6R2V0R3JhcGhpY3NfVGFnKENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlY3QmIGNyQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkgeworICBGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKKyAgRlhfRkxPQVQgZkhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOwogCi0JQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbXSA9IAotCXsKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMWYpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC4xZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC41ZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjNmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjFmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjFmLCBjckJCb3guYm90dG9tICsgZkhlaWdodCowLjFmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjFmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjFmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuMWYpLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGgqMC40ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4zZiksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGgqMC4yZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQqMC4zZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCowLjRmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjVmKSwgUFdMUFRfTU9WRVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCowLjJmLCBjckJCb3gudG9wIC0gZkhlaWdodCowLjVmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoKjAuNGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuN2YpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoKjAuMmYsIGNyQkJveC50b3AgLSBmSGVpZ2h0KjAuN2YpLCBQV0xQVF9MSU5FVE8pCi0JfTsKKyAgQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbXSA9IHsKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4xZiksCisgICAgICAgICAgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuMWYsIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC41ZiksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuM2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgKiAwLjFmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogMC4xZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMC4xZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjFmKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC40ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjFmKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5sZWZ0ICsgZldpZHRoICogMC40ZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjNmKSwKKyAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YSgKKyAgICAgICAgICBDUFdMX1BvaW50KGNyQkJveC5yaWdodCAtIGZXaWR0aCAqIDAuMmYsIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC4zZiksCisgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gubGVmdCArIGZXaWR0aCAqIDAuNGYsIGNyQkJveC50b3AgLSBmSGVpZ2h0ICogMC41ZiksCisgICAgICAgICAgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoCisgICAgICAgICAgQ1BXTF9Qb2ludChjckJCb3gucmlnaHQgLSBmV2lkdGggKiAwLjJmLCBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuNWYpLAorICAgICAgICAgIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LmxlZnQgKyBmV2lkdGggKiAwLjRmLCBjckJCb3gudG9wIC0gZkhlaWdodCAqIDAuN2YpLAorICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKAorICAgICAgICAgIENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0IC0gZldpZHRoICogMC4yZiwgY3JCQm94LnRvcCAtIGZIZWlnaHQgKiAwLjdmKSwKKyAgICAgICAgICBQV0xQVF9MSU5FVE8pfTsKIAotCWlmKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQotCQlzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCAxMik7Ci0JZWxzZQotCQlHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDEyKTsKKyAgaWYgKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQorICAgIHNQYXRoRGF0YSA9IEdldEFwcFN0cmVhbUZyb21BcnJheShQYXRoQXJyYXksIDEyKTsKKyAgZWxzZQorICAgIEdldFBhdGhEYXRhRnJvbUFycmF5KHBhdGgsIFBhdGhBcnJheSwgMTIpOwogfQogCi12b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX0ZveGl0KENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsIENGWF9QYXRoRGF0YSYgcGF0aCwgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkKLXsKLQlGWF9GTE9BVCBmT3V0V2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKLQlGWF9GTE9BVCBmT3V0SGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207Cit2b2lkIENQV0xfVXRpbHM6OkdldEdyYXBoaWNzX0ZveGl0KENGWF9CeXRlU3RyaW5nJiBzUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoRGF0YSYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZWN0JiBjckJCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBXTF9QQVRIX1RZUEUgdHlwZSkgeworICBGWF9GTE9BVCBmT3V0V2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKKyAgRlhfRkxPQVQgZk91dEhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOwogCi0JQ1BERl9SZWN0IGNySW5Cb3ggPSBjckJCb3g7Ci0JY3JJbkJveC5sZWZ0ID0gY3JCQm94LmxlZnQgKyBmT3V0V2lkdGgqMC4wOGY7Ci0JY3JJbkJveC5yaWdodCA9IGNyQkJveC5yaWdodCAtIGZPdXRXaWR0aCowLjA4ZjsKLQljckluQm94LnRvcCA9IGNyQkJveC50b3AgLSBmT3V0SGVpZ2h0KjAuMDhmOwotCWNySW5Cb3guYm90dG9tID0gY3JCQm94LmJvdHRvbSArIGZPdXRIZWlnaHQqMC4wOGY7CisgIENQREZfUmVjdCBjckluQm94ID0gY3JCQm94OworICBjckluQm94LmxlZnQgPSBjckJCb3gubGVmdCArIGZPdXRXaWR0aCAqIDAuMDhmOworICBjckluQm94LnJpZ2h0ID0gY3JCQm94LnJpZ2h0IC0gZk91dFdpZHRoICogMC4wOGY7CisgIGNySW5Cb3gudG9wID0gY3JCQm94LnRvcCAtIGZPdXRIZWlnaHQgKiAwLjA4ZjsKKyAgY3JJbkJveC5ib3R0b20gPSBjckJCb3guYm90dG9tICsgZk91dEhlaWdodCAqIDAuMDhmOwogCi0JRlhfRkxPQVQgZldpZHRoID0gY3JJbkJveC5yaWdodCAtIGNySW5Cb3gubGVmdDsKLQlGWF9GTE9BVCBmSGVpZ2h0ID0gY3JJbkJveC50b3AgLSBjckluQm94LmJvdHRvbTsKKyAgRlhfRkxPQVQgZldpZHRoID0gY3JJbkJveC5yaWdodCAtIGNySW5Cb3gubGVmdDsKKyAgRlhfRkxPQVQgZkhlaWdodCA9IGNySW5Cb3gudG9wIC0gY3JJbkJveC5ib3R0b207CiAKLQlDUFdMX1BhdGhEYXRhIFBhdGhBcnJheVtdID0gCi0JewotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JJbkJveC5sZWZ0LCBjckluQm94LnRvcCksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQgKyBmV2lkdGgqMC40NWYsIGNySW5Cb3gudG9wKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCArIGZXaWR0aCowLjQ1ZiwgY3JJbkJveC50b3AgLSBQV0xfQkVaSUVSICogZkhlaWdodCAqIDAuNGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQgKyBmV2lkdGgqMC40NWYgIC0gUFdMX0JFWklFUiAqIGZXaWR0aCAqIDAuNDVmLCBjckluQm94LnRvcCAtIGZIZWlnaHQqMC40ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCwgY3JJbkJveC50b3AgLSBmSGVpZ2h0KjAuNGYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQsIGNySW5Cb3gudG9wKSwgUFdMUFRfTElORVRPKSwKKyAgQ1BXTF9QYXRoRGF0YSBQYXRoQXJyYXlbXSA9IHsKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQsIGNySW5Cb3gudG9wKSwgUFdMUFRfTU9WRVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQgKyBmV2lkdGggKiAwLjQ1ZiwgY3JJbkJveC50b3ApLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCArIGZXaWR0aCAqIDAuNDVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNySW5Cb3gudG9wIC0gUFdMX0JFWklFUiAqIGZIZWlnaHQgKiAwLjRmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCArIGZXaWR0aCAqIDAuNDVmIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0JFWklFUiAqIGZXaWR0aCAqIDAuNDVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNySW5Cb3gudG9wIC0gZkhlaWdodCAqIDAuNGYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JJbkJveC5sZWZ0LCBjckluQm94LnRvcCAtIGZIZWlnaHQgKiAwLjRmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCwgY3JJbkJveC50b3ApLCBQV0xQVF9MSU5FVE8pLAogCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQgKyBmV2lkdGgqMC42MGYsIGNySW5Cb3gudG9wKSwgUFdMUFRfTU9WRVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCArIGZXaWR0aCowLjc1ZiwgY3JJbkJveC50b3ApLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JJbkJveC5sZWZ0ICsgZldpZHRoKjAuNzVmLCBjckluQm94LnRvcCAtIFBXTF9CRVpJRVIgKiBmSGVpZ2h0ICogMC43ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCArIGZXaWR0aCowLjc1ZiAgLSBQV0xfQkVaSUVSICogZldpZHRoICogMC43NWYsIGNySW5Cb3gudG9wIC0gZkhlaWdodCowLjdmKSwgUFdMUFRfQkVaSUVSVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JJbkJveC5sZWZ0LCBjckluQm94LnRvcCAtIGZIZWlnaHQqMC43ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCwgY3JJbkJveC50b3AgLSBmSGVpZ2h0KjAuNTVmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCArIFBXTF9CRVpJRVIgKiBmV2lkdGgqMC42MGYsIGNySW5Cb3gudG9wIC0gZkhlaWdodCowLjU1ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCArIGZXaWR0aCAqIDAuNjBmLCBjckluQm94LnRvcCAtIFBXTF9CRVpJRVIgKiBmSGVpZ2h0ICogMC41NWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQgKyBmV2lkdGggKiAwLjYwZiwgY3JJbkJveC50b3ApLCBQV0xQVF9CRVpJRVJUTyksCi0KLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCArIGZXaWR0aCowLjkwZiwgY3JJbkJveC50b3ApLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JJbkJveC5sZWZ0ICsgZldpZHRoKjAuOTBmLCBjckluQm94LnRvcCAtIFBXTF9CRVpJRVIgKiBmSGVpZ2h0ICogMC44NWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQgKyBmV2lkdGgqMC45MGYgIC0gUFdMX0JFWklFUiAqIGZXaWR0aCAqIDAuOTBmLCBjckluQm94LnRvcCAtIGZIZWlnaHQqMC44NWYpLCBQV0xQVF9CRVpJRVJUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQsIGNySW5Cb3gudG9wIC0gZkhlaWdodCowLjg1ZiksIFBXTFBUX0JFWklFUlRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCwgY3JJbkJveC5ib3R0b20pLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JJbkJveC5yaWdodCwgY3JJbkJveC5ib3R0b20pLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JJbkJveC5yaWdodCwgY3JJbkJveC50b3ApLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JJbkJveC5sZWZ0ICsgZldpZHRoKjAuOTBmLCBjckluQm94LnRvcCksIFBXTFBUX0xJTkVUTyksCi0KLQkJLyoKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0LCBjckJCb3gudG9wKSwgUFdMUFRfTU9WRVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodCwgY3JCQm94LnRvcCksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQsIGNyQkJveC5ib3R0b20pLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQsIGNyQkJveC5ib3R0b20pLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQsIGNyQkJveC50b3ApLCBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCArIGZXaWR0aCAqIDAuNjBmLCBjckluQm94LnRvcCksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX01PVkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JJbkJveC5sZWZ0ICsgZldpZHRoICogMC43NWYsIGNySW5Cb3gudG9wKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQgKyBmV2lkdGggKiAwLjc1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckluQm94LnRvcCAtIFBXTF9CRVpJRVIgKiBmSGVpZ2h0ICogMC43ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQgKyBmV2lkdGggKiAwLjc1ZiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiBmV2lkdGggKiAwLjc1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckluQm94LnRvcCAtIGZIZWlnaHQgKiAwLjdmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCwgY3JJbkJveC50b3AgLSBmSGVpZ2h0ICogMC43ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQsIGNySW5Cb3gudG9wIC0gZkhlaWdodCAqIDAuNTVmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQgKyBQV0xfQkVaSUVSICogZldpZHRoICogMC42MGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JJbkJveC50b3AgLSBmSGVpZ2h0ICogMC41NWYpLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9CRVpJRVJUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JJbkJveC5sZWZ0ICsgZldpZHRoICogMC42MGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JJbkJveC50b3AgLSBQV0xfQkVaSUVSICogZkhlaWdodCAqIDAuNTVmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCArIGZXaWR0aCAqIDAuNjBmLCBjckluQm94LnRvcCksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKIAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQrZk91dFdpZHRoKjAuMDRmLCBjckJCb3gudG9wLWZPdXRIZWlnaHQqMC4wNGYpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0LWZPdXRXaWR0aCowLjA0ZiwgY3JCQm94LnRvcC1mT3V0SGVpZ2h0KjAuMDRmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodC1mT3V0V2lkdGgqMC4wNGYsIGNyQkJveC5ib3R0b20rZk91dEhlaWdodCowLjA0ZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCtmT3V0V2lkdGgqMC4wNGYsIGNyQkJveC5ib3R0b20rZk91dEhlaWdodCowLjA0ZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCtmT3V0V2lkdGgqMC4wNGYsIGNyQkJveC50b3AtZk91dEhlaWdodCowLjA0ZiksIFBXTFBUX0xJTkVUTyksCi0JCSovCi0JfTsKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQgKyBmV2lkdGggKiAwLjkwZiwgY3JJbkJveC50b3ApLAorICAgICAgICAgICAgICAgICAgICBQV0xQVF9NT1ZFVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCArIGZXaWR0aCAqIDAuOTBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNySW5Cb3gudG9wIC0gUFdMX0JFWklFUiAqIGZIZWlnaHQgKiAwLjg1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQgKyBmV2lkdGggKiAwLjkwZiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9CRVpJRVIgKiBmV2lkdGggKiAwLjkwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckluQm94LnRvcCAtIGZIZWlnaHQgKiAwLjg1ZiksCisgICAgICAgICAgICAgICAgICAgIFBXTFBUX0JFWklFUlRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LmxlZnQsIGNySW5Cb3gudG9wIC0gZkhlaWdodCAqIDAuODVmKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfQkVaSUVSVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCwgY3JJbkJveC5ib3R0b20pLCBQV0xQVF9MSU5FVE8pLAorICAgICAgQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gucmlnaHQsIGNySW5Cb3guYm90dG9tKSwgUFdMUFRfTElORVRPKSwKKyAgICAgIENQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckluQm94LnJpZ2h0LCBjckluQm94LnRvcCksIFBXTFBUX0xJTkVUTyksCisgICAgICBDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JJbkJveC5sZWZ0ICsgZldpZHRoICogMC45MGYsIGNySW5Cb3gudG9wKSwKKyAgICAgICAgICAgICAgICAgICAgUFdMUFRfTElORVRPKSwKKyAgfTsKIAotCWlmKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQotCQlzUGF0aERhdGEgPSBHZXRBcHBTdHJlYW1Gcm9tQXJyYXkoUGF0aEFycmF5LCAyMyk7Ci0JZWxzZQotCQlHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDIzKTsKKyAgaWYgKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQorICAgIHNQYXRoRGF0YSA9IEdldEFwcFN0cmVhbUZyb21BcnJheShQYXRoQXJyYXksIDIzKTsKKyAgZWxzZQorICAgIEdldFBhdGhEYXRhRnJvbUFycmF5KHBhdGgsIFBhdGhBcnJheSwgMjMpOwogfQogCi12b2lkIENQV0xfQ29sb3I6OkNvbnZlcnRDb2xvclR5cGUoRlhfSU5UMzIgbkNvbG9yVHlwZSkKLXsKLQlzd2l0Y2ggKHRoaXMtPm5Db2xvclR5cGUpCi0JewotCWNhc2UgQ09MT1JUWVBFX1RSQU5TUEFSRU5UOgotCQlicmVhazsKLQljYXNlIENPTE9SVFlQRV9HUkFZOgotCQlzd2l0Y2ggKG5Db2xvclR5cGUpCi0JCXsKLQkJY2FzZSBDT0xPUlRZUEVfUkdCOgotCQkJQ1BXTF9VdGlsczo6Q29udmVydEdSQVkyUkdCKHRoaXMtPmZDb2xvcjEsIHRoaXMtPmZDb2xvcjEsIHRoaXMtPmZDb2xvcjIsIHRoaXMtPmZDb2xvcjMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ09MT1JUWVBFX0NNWUs6Ci0JCQlDUFdMX1V0aWxzOjpDb252ZXJ0R1JBWTJDTVlLKHRoaXMtPmZDb2xvcjEsIHRoaXMtPmZDb2xvcjEsIHRoaXMtPmZDb2xvcjIsIHRoaXMtPmZDb2xvcjMsIHRoaXMtPmZDb2xvcjQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBDT0xPUlRZUEVfUkdCOgotCQlzd2l0Y2ggKG5Db2xvclR5cGUpCi0JCXsKLQkJY2FzZSBDT0xPUlRZUEVfR1JBWToKLQkJCUNQV0xfVXRpbHM6OkNvbnZlcnRSR0IyR1JBWSh0aGlzLT5mQ29sb3IxLCB0aGlzLT5mQ29sb3IyLCB0aGlzLT5mQ29sb3IzLCB0aGlzLT5mQ29sb3IxKTsKLQkJCWJyZWFrOwotCQljYXNlIENPTE9SVFlQRV9DTVlLOgotCQkJQ1BXTF9VdGlsczo6Q29udmVydFJHQjJDTVlLKHRoaXMtPmZDb2xvcjEsIHRoaXMtPmZDb2xvcjIsIHRoaXMtPmZDb2xvcjMsIHRoaXMtPmZDb2xvcjEsIHRoaXMtPmZDb2xvcjIsIHRoaXMtPmZDb2xvcjMsIHRoaXMtPmZDb2xvcjQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBDT0xPUlRZUEVfQ01ZSzoKLQkJc3dpdGNoIChuQ29sb3JUeXBlKQotCQl7Ci0JCWNhc2UgQ09MT1JUWVBFX0dSQVk6Ci0JCQlDUFdMX1V0aWxzOjpDb252ZXJ0Q01ZSzJHUkFZKHRoaXMtPmZDb2xvcjEsIHRoaXMtPmZDb2xvcjIsIHRoaXMtPmZDb2xvcjMsIHRoaXMtPmZDb2xvcjQsIHRoaXMtPmZDb2xvcjEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ09MT1JUWVBFX1JHQjoKLQkJCUNQV0xfVXRpbHM6OkNvbnZlcnRDTVlLMlJHQih0aGlzLT5mQ29sb3IxLCB0aGlzLT5mQ29sb3IyLCB0aGlzLT5mQ29sb3IzLCB0aGlzLT5mQ29sb3I0LCB0aGlzLT5mQ29sb3IxLCB0aGlzLT5mQ29sb3IyLCB0aGlzLT5mQ29sb3IzKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQl0aGlzLT5uQ29sb3JUeXBlID0gbkNvbG9yVHlwZTsKK3ZvaWQgQ1BXTF9Db2xvcjo6Q29udmVydENvbG9yVHlwZShpbnQzMl90IG90aGVyX25Db2xvclR5cGUpIHsKKyAgc3dpdGNoIChvdGhlcl9uQ29sb3JUeXBlKSB7CisgICAgY2FzZSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ6CisgICAgICBicmVhazsKKyAgICBjYXNlIENPTE9SVFlQRV9HUkFZOgorICAgICAgc3dpdGNoIChvdGhlcl9uQ29sb3JUeXBlKSB7CisgICAgICAgIGNhc2UgQ09MT1JUWVBFX1JHQjoKKyAgICAgICAgICBDUFdMX1V0aWxzOjpDb252ZXJ0R1JBWTJSR0IoZkNvbG9yMSwgZkNvbG9yMSwgZkNvbG9yMiwgZkNvbG9yMyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ09MT1JUWVBFX0NNWUs6CisgICAgICAgICAgQ1BXTF9VdGlsczo6Q29udmVydEdSQVkyQ01ZSyhmQ29sb3IxLCBmQ29sb3IxLCBmQ29sb3IyLCBmQ29sb3IzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkNvbG9yNCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIENPTE9SVFlQRV9SR0I6CisgICAgICBzd2l0Y2ggKG90aGVyX25Db2xvclR5cGUpIHsKKyAgICAgICAgY2FzZSBDT0xPUlRZUEVfR1JBWToKKyAgICAgICAgICBDUFdMX1V0aWxzOjpDb252ZXJ0UkdCMkdSQVkoZkNvbG9yMSwgZkNvbG9yMiwgZkNvbG9yMywgZkNvbG9yMSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ09MT1JUWVBFX0NNWUs6CisgICAgICAgICAgQ1BXTF9VdGlsczo6Q29udmVydFJHQjJDTVlLKGZDb2xvcjEsIGZDb2xvcjIsIGZDb2xvcjMsIGZDb2xvcjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb2xvcjIsIGZDb2xvcjMsIGZDb2xvcjQpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBDT0xPUlRZUEVfQ01ZSzoKKyAgICAgIHN3aXRjaCAob3RoZXJfbkNvbG9yVHlwZSkgeworICAgICAgICBjYXNlIENPTE9SVFlQRV9HUkFZOgorICAgICAgICAgIENQV0xfVXRpbHM6OkNvbnZlcnRDTVlLMkdSQVkoZkNvbG9yMSwgZkNvbG9yMiwgZkNvbG9yMywgZkNvbG9yNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb2xvcjEpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENPTE9SVFlQRV9SR0I6CisgICAgICAgICAgQ1BXTF9VdGlsczo6Q29udmVydENNWUsyUkdCKGZDb2xvcjEsIGZDb2xvcjIsIGZDb2xvcjMsIGZDb2xvcjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb2xvcjEsIGZDb2xvcjIsIGZDb2xvcjMpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKyAgbkNvbG9yVHlwZSA9IG90aGVyX25Db2xvclR5cGU7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9XbmQuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9XbmQuY3BwCmluZGV4IDY5NTM1ZDcuLmQwYWFhNzggMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfV25kLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1duZC5jcHAKQEAgLTEsNTgxICsxLDQ1NiBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUERGV2luZG93LmgiCi0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oIgotI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuaCIKKyNpbmNsdWRlIDxtYXA+CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfVGltZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9VdGlscy5oIgorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oIgogCi1zdGF0aWMgQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0lOVDMyLCBDUFdMX1RpbWVyKj4mIEdldFBXTFRpbWVNYXAoKQoteworc3RhdGljIHN0ZDo6bWFwPGludDMyX3QsIENQV0xfVGltZXIqPiYgR2V0UFdMVGltZU1hcCgpIHsKICAgLy8gTGVhayB0aGUgb2JqZWN0IGF0IHNodXRkb3duLgotICBzdGF0aWMgYXV0byB0aW1lTWFwID0gbmV3IENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9JTlQzMiwgQ1BXTF9UaW1lcio+OworICBzdGF0aWMgYXV0byB0aW1lTWFwID0gbmV3IHN0ZDo6bWFwPGludDMyX3QsIENQV0xfVGltZXIqPjsKICAgcmV0dXJuICp0aW1lTWFwOwogfQogCi1DUFdMX1RpbWVyOjpDUFdMX1RpbWVyKENQV0xfVGltZXJIYW5kbGVyKiBwQXR0YWNoZWQsIElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlcikgOiAKLQltX25UaW1lcklEKDApLAotCW1fcEF0dGFjaGVkKHBBdHRhY2hlZCksCi0JbV9wU3lzdGVtSGFuZGxlcihwU3lzdGVtSGFuZGxlcikKLXsKLQlBU1NFUlQobV9wQXR0YWNoZWQgIT0gTlVMTCk7Ci0JQVNTRVJUKG1fcFN5c3RlbUhhbmRsZXIgIT0gTlVMTCk7CitDUFdMX1RpbWVyOjpDUFdMX1RpbWVyKENQV0xfVGltZXJIYW5kbGVyKiBwQXR0YWNoZWQsCisgICAgICAgICAgICAgICAgICAgICAgIElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlcikKKyAgICA6IG1fblRpbWVySUQoMCksIG1fcEF0dGFjaGVkKHBBdHRhY2hlZCksIG1fcFN5c3RlbUhhbmRsZXIocFN5c3RlbUhhbmRsZXIpIHsKKyAgQVNTRVJUKG1fcEF0dGFjaGVkKTsKKyAgQVNTRVJUKG1fcFN5c3RlbUhhbmRsZXIpOwogfQogCi1DUFdMX1RpbWVyOjp+Q1BXTF9UaW1lcigpCi17Ci0JS2lsbFBXTFRpbWVyKCk7CitDUFdMX1RpbWVyOjp+Q1BXTF9UaW1lcigpIHsKKyAgS2lsbFBXTFRpbWVyKCk7CiB9CiAKLUZYX0lOVDMyIENQV0xfVGltZXI6OlNldFBXTFRpbWVyKEZYX0lOVDMyIG5FbGFwc2UpCi17CQotCWlmIChtX25UaW1lcklEICE9IDApIEtpbGxQV0xUaW1lcigpOwotCW1fblRpbWVySUQgPSBtX3BTeXN0ZW1IYW5kbGVyLT5TZXRUaW1lcihuRWxhcHNlLCBUaW1lclByb2MpOwotCUdldFBXTFRpbWVNYXAoKS5TZXRBdChtX25UaW1lcklELCB0aGlzKTsKLQlyZXR1cm4gbV9uVGltZXJJRDsKK2ludDMyX3QgQ1BXTF9UaW1lcjo6U2V0UFdMVGltZXIoaW50MzJfdCBuRWxhcHNlKSB7CisgIGlmIChtX25UaW1lcklEICE9IDApCisgICAgS2lsbFBXTFRpbWVyKCk7CisgIG1fblRpbWVySUQgPSBtX3BTeXN0ZW1IYW5kbGVyLT5TZXRUaW1lcihuRWxhcHNlLCBUaW1lclByb2MpOworCisgIEdldFBXTFRpbWVNYXAoKVttX25UaW1lcklEXSA9IHRoaXM7CisgIHJldHVybiBtX25UaW1lcklEOwogfQogCi12b2lkIENQV0xfVGltZXI6OktpbGxQV0xUaW1lcigpCi17Ci0JaWYgKG1fblRpbWVySUQgIT0gMCkKLQl7Ci0JCW1fcFN5c3RlbUhhbmRsZXItPktpbGxUaW1lcihtX25UaW1lcklEKTsKLQkJR2V0UFdMVGltZU1hcCgpLlJlbW92ZUtleShtX25UaW1lcklEKTsKLQkJbV9uVGltZXJJRCA9IDA7Ci0JfQordm9pZCBDUFdMX1RpbWVyOjpLaWxsUFdMVGltZXIoKSB7CisgIGlmIChtX25UaW1lcklEID09IDApCisgICAgcmV0dXJuOworCisgIG1fcFN5c3RlbUhhbmRsZXItPktpbGxUaW1lcihtX25UaW1lcklEKTsKKyAgR2V0UFdMVGltZU1hcCgpLmVyYXNlKG1fblRpbWVySUQpOworICBtX25UaW1lcklEID0gMDsKIH0KIAotdm9pZCBDUFdMX1RpbWVyOjpUaW1lclByb2MoRlhfSU5UMzIgaWRFdmVudCkKLXsKLQlDUFdMX1RpbWVyKiBwVGltZXIgPSBOVUxMOwotCWlmIChHZXRQV0xUaW1lTWFwKCkuTG9va3VwKGlkRXZlbnQsIHBUaW1lcikpCi0JewotCQlpZiAocFRpbWVyKQotCQl7CQkJCi0JCQlpZiAocFRpbWVyLT5tX3BBdHRhY2hlZCkgCi0JCQkJcFRpbWVyLT5tX3BBdHRhY2hlZC0+VGltZXJQcm9jKCk7Ci0JCX0KLQl9Cit2b2lkIENQV0xfVGltZXI6OlRpbWVyUHJvYyhpbnQzMl90IGlkRXZlbnQpIHsKKyAgYXV0byBpdCA9IEdldFBXTFRpbWVNYXAoKS5maW5kKGlkRXZlbnQpOworICBpZiAoaXQgPT0gR2V0UFdMVGltZU1hcCgpLmVuZCgpKQorICAgIHJldHVybjsKKworICBDUFdMX1RpbWVyKiBwVGltZXIgPSBpdC0+c2Vjb25kOworICBpZiAocFRpbWVyLT5tX3BBdHRhY2hlZCkKKyAgICBwVGltZXItPm1fcEF0dGFjaGVkLT5UaW1lclByb2MoKTsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9UaW1lckhhbmRsZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK0NQV0xfVGltZXJIYW5kbGVyOjpDUFdMX1RpbWVySGFuZGxlcigpIDogbV9wVGltZXIoTlVMTCkge30KIAotQ1BXTF9UaW1lckhhbmRsZXI6OkNQV0xfVGltZXJIYW5kbGVyKCkgOiBtX3BUaW1lcihOVUxMKQoteworQ1BXTF9UaW1lckhhbmRsZXI6On5DUFdMX1RpbWVySGFuZGxlcigpIHsKKyAgZGVsZXRlIG1fcFRpbWVyOwogfQogCi1DUFdMX1RpbWVySGFuZGxlcjo6fkNQV0xfVGltZXJIYW5kbGVyKCkKLXsKLQlpZiAobV9wVGltZXIpIGRlbGV0ZSBtX3BUaW1lcjsKK3ZvaWQgQ1BXTF9UaW1lckhhbmRsZXI6OkJlZ2luVGltZXIoaW50MzJfdCBuRWxhcHNlKSB7CisgIGlmICghbV9wVGltZXIpCisgICAgbV9wVGltZXIgPSBuZXcgQ1BXTF9UaW1lcih0aGlzLCBHZXRTeXN0ZW1IYW5kbGVyKCkpOworCisgIGlmIChtX3BUaW1lcikKKyAgICBtX3BUaW1lci0+U2V0UFdMVGltZXIobkVsYXBzZSk7CiB9CiAKLXZvaWQgQ1BXTF9UaW1lckhhbmRsZXI6OkJlZ2luVGltZXIoRlhfSU5UMzIgbkVsYXBzZSkKLXsKLQlpZiAoIW1fcFRpbWVyKQotCQltX3BUaW1lciA9IG5ldyBDUFdMX1RpbWVyKHRoaXMsIEdldFN5c3RlbUhhbmRsZXIoKSk7Ci0KLQlpZiAobV9wVGltZXIpCi0JCW1fcFRpbWVyLT5TZXRQV0xUaW1lcihuRWxhcHNlKTsKK3ZvaWQgQ1BXTF9UaW1lckhhbmRsZXI6OkVuZFRpbWVyKCkgeworICBpZiAobV9wVGltZXIpCisgICAgbV9wVGltZXItPktpbGxQV0xUaW1lcigpOwogfQogCi12b2lkIENQV0xfVGltZXJIYW5kbGVyOjpFbmRUaW1lcigpCi17Ci0JaWYgKG1fcFRpbWVyKQotCQltX3BUaW1lci0+S2lsbFBXTFRpbWVyKCk7Ci19Cit2b2lkIENQV0xfVGltZXJIYW5kbGVyOjpUaW1lclByb2MoKSB7fQogCi12b2lkIENQV0xfVGltZXJIYW5kbGVyOjpUaW1lclByb2MoKQotewotfQorY2xhc3MgQ1BXTF9Nc2dDb250cm9sIHsKKyAgZnJpZW5kIGNsYXNzIENQV0xfV25kOwogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9Nc2dDb250cm9sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyBwdWJsaWM6CisgIGV4cGxpY2l0IENQV0xfTXNnQ29udHJvbChDUFdMX1duZCogcFduZCkgeworICAgIG1fcENyZWF0ZWRXbmQgPSBwV25kOworICAgIERlZmF1bHQoKTsKKyAgfQogCi1jbGFzcyBDUFdMX01zZ0NvbnRyb2wKLXsKLQlmcmllbmQgY2xhc3MgQ1BXTF9XbmQ7CisgIH5DUFdMX01zZ0NvbnRyb2woKSB7CisgICAgRGVmYXVsdCgpOworICB9CiAKLXB1YmxpYzoKLQlDUFdMX01zZ0NvbnRyb2woQ1BXTF9XbmQgKiBwV25kKQotCXsKLS8vCQlQV0xfVFJBQ0UoIm5ldyBDUFdMX01zZ0NvbnRyb2xcbiIpOwotCQltX3BDcmVhdGVkV25kID0gcFduZDsKLQkJRGVmYXVsdCgpOwotCX0KKyAgdm9pZCBEZWZhdWx0KCkgeworICAgIG1fYU1vdXNlUGF0aC5SZW1vdmVBbGwoKTsKKyAgICBtX2FLZXlib2FyZFBhdGguUmVtb3ZlQWxsKCk7CisgICAgbV9wTWFpbk1vdXNlV25kID0gTlVMTDsKKyAgICBtX3BNYWluS2V5Ym9hcmRXbmQgPSBOVUxMOworICB9CiAKLQl+Q1BXTF9Nc2dDb250cm9sKCkKLQl7Ci0vLwkJUFdMX1RSQUNFKCJ+Q1BXTF9Nc2dDb250cm9sXG4iKTsKLQkJRGVmYXVsdCgpOwotCX0KKyAgRlhfQk9PTCBJc1duZENyZWF0ZWQoY29uc3QgQ1BXTF9XbmQqIHBXbmQpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9wQ3JlYXRlZFduZCA9PSBwV25kOworICB9CiAKLQl2b2lkIERlZmF1bHQoKQotCXsKLQkJbV9hTW91c2VQYXRoLlJlbW92ZUFsbCgpOwotCQltX2FLZXlib2FyZFBhdGguUmVtb3ZlQWxsKCk7Ci0JCW1fcE1haW5Nb3VzZVduZCA9IE5VTEw7Ci0JCW1fcE1haW5LZXlib2FyZFduZCA9IE5VTEw7Ci0JfQorICBGWF9CT09MIElzTWFpbkNhcHR1cmVNb3VzZShjb25zdCBDUFdMX1duZCogcFduZCkgY29uc3QgeworICAgIHJldHVybiBwV25kID09IG1fcE1haW5Nb3VzZVduZDsKKyAgfQogCi0JRlhfQk9PTCBJc1duZENyZWF0ZWQoY29uc3QgQ1BXTF9XbmQgKiBwV25kKSBjb25zdAotCXsKLQkJcmV0dXJuIG1fcENyZWF0ZWRXbmQgPT0gcFduZDsKLQl9CisgIEZYX0JPT0wgSXNXbmRDYXB0dXJlTW91c2UoY29uc3QgQ1BXTF9XbmQqIHBXbmQpIGNvbnN0IHsKKyAgICBpZiAocFduZCkgeworICAgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYU1vdXNlUGF0aC5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICAgIGlmIChtX2FNb3VzZVBhdGguR2V0QXQoaSkgPT0gcFduZCkKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgICB9CiAKLQlGWF9CT09MIElzTWFpbkNhcHR1cmVNb3VzZShjb25zdCBDUFdMX1duZCAqIHBXbmQpIGNvbnN0Ci0JewotCQlyZXR1cm4gcFduZCA9PSBtX3BNYWluTW91c2VXbmQ7Ci0JfQorICAgIHJldHVybiBGQUxTRTsKKyAgfQogCi0JRlhfQk9PTCBJc1duZENhcHR1cmVNb3VzZShjb25zdCBDUFdMX1duZCAqIHBXbmQpIGNvbnN0Ci0JewotCQlpZiAocFduZCkKLQkJCWZvciggRlhfSU5UMzIgaT0wLHN6PW1fYU1vdXNlUGF0aC5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQkJCQlpZiAobV9hTW91c2VQYXRoLkdldEF0KGkpID09IHBXbmQpCi0JCQkJCXJldHVybiBUUlVFOworICBGWF9CT09MIElzTWFpbkNhcHR1cmVLZXlib2FyZChjb25zdCBDUFdMX1duZCogcFduZCkgY29uc3QgeworICAgIHJldHVybiBwV25kID09IG1fcE1haW5LZXlib2FyZFduZDsKKyAgfQogCi0JCXJldHVybiBGQUxTRTsKLQl9CisgIEZYX0JPT0wgSXNXbmRDYXB0dXJlS2V5Ym9hcmQoY29uc3QgQ1BXTF9XbmQqIHBXbmQpIGNvbnN0IHsKKyAgICBpZiAocFduZCkgeworICAgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYUtleWJvYXJkUGF0aC5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICAgIGlmIChtX2FLZXlib2FyZFBhdGguR2V0QXQoaSkgPT0gcFduZCkKKyAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgICB9CiAKLQlGWF9CT09MIElzTWFpbkNhcHR1cmVLZXlib2FyZChjb25zdCBDUFdMX1duZCAqIHBXbmQpIGNvbnN0Ci0JewotCQlyZXR1cm4gcFduZCA9PSBtX3BNYWluS2V5Ym9hcmRXbmQ7Ci0JfQorICAgIHJldHVybiBGQUxTRTsKKyAgfQogCisgIHZvaWQgU2V0Rm9jdXMoQ1BXTF9XbmQqIHBXbmQpIHsKKyAgICBtX2FLZXlib2FyZFBhdGguUmVtb3ZlQWxsKCk7CiAKLQlGWF9CT09MIElzV25kQ2FwdHVyZUtleWJvYXJkKGNvbnN0IENQV0xfV25kICogcFduZCkgY29uc3QKLQl7Ci0JCWlmIChwV25kKQotCQkJZm9yKCBGWF9JTlQzMiBpPTAsc3o9bV9hS2V5Ym9hcmRQYXRoLkdldFNpemUoKTsgaTxzejsgaSsrKQotCQkJCWlmIChtX2FLZXlib2FyZFBhdGguR2V0QXQoaSkgPT0gcFduZCkKLQkJCQkJcmV0dXJuIFRSVUU7Ci0JCQotCQlyZXR1cm4gRkFMU0U7Ci0JfQorICAgIGlmIChwV25kKSB7CisgICAgICBtX3BNYWluS2V5Ym9hcmRXbmQgPSBwV25kOwogCi0Jdm9pZCBTZXRGb2N1cyhDUFdMX1duZCAqIHBXbmQpCi0JewotCQltX2FLZXlib2FyZFBhdGguUmVtb3ZlQWxsKCk7CisgICAgICBDUFdMX1duZCogcFBhcmVudCA9IHBXbmQ7CisgICAgICB3aGlsZSAocFBhcmVudCkgeworICAgICAgICBtX2FLZXlib2FyZFBhdGguQWRkKHBQYXJlbnQpOworICAgICAgICBwUGFyZW50ID0gcFBhcmVudC0+R2V0UGFyZW50V2luZG93KCk7CisgICAgICB9CiAKLQkJaWYgKHBXbmQpCi0JCXsKLQkJCW1fcE1haW5LZXlib2FyZFduZCA9IHBXbmQ7CisgICAgICBwV25kLT5PblNldEZvY3VzKCk7CisgICAgfQorICB9CiAKLQkJCUNQV0xfV25kICogcFBhcmVudCA9IHBXbmQ7Ci0JCQl3aGlsZSAocFBhcmVudCkKLQkJCXsKLQkJCQltX2FLZXlib2FyZFBhdGguQWRkKHBQYXJlbnQpOwotCQkJCXBQYXJlbnQgPSBwUGFyZW50LT5HZXRQYXJlbnRXaW5kb3coKTsKLQkJCX0KKyAgdm9pZCBLaWxsRm9jdXMoKSB7CisgICAgaWYgKG1fYUtleWJvYXJkUGF0aC5HZXRTaXplKCkgPiAwKQorICAgICAgaWYgKENQV0xfV25kKiBwV25kID0gbV9hS2V5Ym9hcmRQYXRoLkdldEF0KDApKQorICAgICAgICBwV25kLT5PbktpbGxGb2N1cygpOwogCi0JCQlwV25kLT5PblNldEZvY3VzKCk7Ci0JCX0KLQl9CisgICAgbV9wTWFpbktleWJvYXJkV25kID0gTlVMTDsKKyAgICBtX2FLZXlib2FyZFBhdGguUmVtb3ZlQWxsKCk7CisgIH0KIAotCXZvaWQgS2lsbEZvY3VzKCkKLQl7Ci0JCWlmIChtX2FLZXlib2FyZFBhdGguR2V0U2l6ZSgpID4gMCkKLQkJCWlmIChDUFdMX1duZCogcFduZCA9IG1fYUtleWJvYXJkUGF0aC5HZXRBdCgwKSkKLQkJCQlwV25kLT5PbktpbGxGb2N1cygpOworICB2b2lkIFNldENhcHR1cmUoQ1BXTF9XbmQqIHBXbmQpIHsKKyAgICBtX2FNb3VzZVBhdGguUmVtb3ZlQWxsKCk7CiAKLQkJbV9wTWFpbktleWJvYXJkV25kID0gTlVMTDsKLQkJbV9hS2V5Ym9hcmRQYXRoLlJlbW92ZUFsbCgpOwotCX0KKyAgICBpZiAocFduZCkgeworICAgICAgbV9wTWFpbk1vdXNlV25kID0gcFduZDsKIAotCXZvaWQgU2V0Q2FwdHVyZShDUFdMX1duZCAqIHBXbmQpCi0JewotCQltX2FNb3VzZVBhdGguUmVtb3ZlQWxsKCk7CisgICAgICBDUFdMX1duZCogcFBhcmVudCA9IHBXbmQ7CisgICAgICB3aGlsZSAocFBhcmVudCkgeworICAgICAgICBtX2FNb3VzZVBhdGguQWRkKHBQYXJlbnQpOworICAgICAgICBwUGFyZW50ID0gcFBhcmVudC0+R2V0UGFyZW50V2luZG93KCk7CisgICAgICB9CisgICAgfQorICB9CiAKLQkJaWYgKHBXbmQpCi0JCXsKLQkJCW1fcE1haW5Nb3VzZVduZCA9IHBXbmQ7CisgIHZvaWQgUmVsZWFzZUNhcHR1cmUoKSB7CisgICAgbV9wTWFpbk1vdXNlV25kID0gTlVMTDsKKyAgICBtX2FNb3VzZVBhdGguUmVtb3ZlQWxsKCk7CisgIH0KIAotCQkJQ1BXTF9XbmQgKiBwUGFyZW50ID0gcFduZDsKLQkJCXdoaWxlIChwUGFyZW50KQotCQkJewotCQkJCW1fYU1vdXNlUGF0aC5BZGQocFBhcmVudCk7Ci0JCQkJcFBhcmVudCA9IHBQYXJlbnQtPkdldFBhcmVudFdpbmRvdygpOwotCQkJfQotCQl9Ci0JfQotCi0Jdm9pZCBSZWxlYXNlQ2FwdHVyZSgpCi0JewotCQltX3BNYWluTW91c2VXbmQgPSBOVUxMOwotCQltX2FNb3VzZVBhdGguUmVtb3ZlQWxsKCk7Ci0JfQotCi1wcml2YXRlOgotCUNGWF9BcnJheVRlbXBsYXRlPENQV0xfV25kKj4JbV9hTW91c2VQYXRoOwotCUNGWF9BcnJheVRlbXBsYXRlPENQV0xfV25kKj4JbV9hS2V5Ym9hcmRQYXRoOwotCUNQV0xfV25kKgkJCQkJCW1fcENyZWF0ZWRXbmQ7Ci0JQ1BXTF9XbmQqCQkJCQkJbV9wTWFpbk1vdXNlV25kOwotCUNQV0xfV25kKgkJCQkJCW1fcE1haW5LZXlib2FyZFduZDsKKyBwcml2YXRlOgorICBDRlhfQXJyYXlUZW1wbGF0ZTxDUFdMX1duZCo+IG1fYU1vdXNlUGF0aDsKKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BXTF9XbmQqPiBtX2FLZXlib2FyZFBhdGg7CisgIENQV0xfV25kKiBtX3BDcmVhdGVkV25kOworICBDUFdMX1duZCogbV9wTWFpbk1vdXNlV25kOworICBDUFdMX1duZCogbV9wTWFpbktleWJvYXJkV25kOwogfTsKIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfV25kIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK0NQV0xfV25kOjpDUFdMX1duZCgpCisgICAgOiBtX3BWU2Nyb2xsQmFyKE5VTEwpLAorICAgICAgbV9yY1dpbmRvdygpLAorICAgICAgbV9yY0NsaXAoKSwKKyAgICAgIG1fYkNyZWF0ZWQoRkFMU0UpLAorICAgICAgbV9iVmlzaWJsZShGQUxTRSksCisgICAgICBtX2JOb3RpZnlpbmcoRkFMU0UpLAorICAgICAgbV9iRW5hYmxlZChUUlVFKSB7fQogCi1DUFdMX1duZDo6Q1BXTF9XbmQoKSA6Ci0JbV9wVlNjcm9sbEJhcihOVUxMKSwKLQltX3JjV2luZG93KCksCi0JbV9yY0NsaXAoKSwKLQltX2JDcmVhdGVkKEZBTFNFKSwJCQkKLQltX2JWaXNpYmxlKEZBTFNFKSwKLQltX2JOb3RpZnlpbmcoRkFMU0UpLAotCW1fYkVuYWJsZWQoVFJVRSkKLXsKK0NQV0xfV25kOjp+Q1BXTF9XbmQoKSB7CisgIEFTU0VSVChtX2JDcmVhdGVkID09IEZBTFNFKTsKIH0KIAotQ1BXTF9XbmQ6On5DUFdMX1duZCgpCi17Ci0JQVNTRVJUKG1fYkNyZWF0ZWQgPT0gRkFMU0UpOworQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9XbmQ6OkdldENsYXNzTmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuICJDUFdMX1duZCI7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQV0xfV25kOjpHZXRDbGFzc05hbWUoKSBjb25zdAotewotCXJldHVybiAiQ1BXTF9XbmQiOwordm9pZCBDUFdMX1duZDo6Q3JlYXRlKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApIHsKKyAgaWYgKCFJc1ZhbGlkKCkpIHsKKyAgICBtX3NQcml2YXRlUGFyYW0gPSBjcDsKKworICAgIE9uQ3JlYXRlKG1fc1ByaXZhdGVQYXJhbSk7CisKKyAgICBtX3NQcml2YXRlUGFyYW0ucmNSZWN0V25kLk5vcm1hbGl6ZSgpOworICAgIG1fcmNXaW5kb3cgPSBtX3NQcml2YXRlUGFyYW0ucmNSZWN0V25kOworICAgIG1fcmNDbGlwID0gQ1BXTF9VdGlsczo6SW5mbGF0ZVJlY3QobV9yY1dpbmRvdywgMS4wZik7CisKKyAgICBDcmVhdGVNc2dDb250cm9sKCk7CisKKyAgICBpZiAobV9zUHJpdmF0ZVBhcmFtLnBQYXJlbnRXbmQpCisgICAgICBtX3NQcml2YXRlUGFyYW0ucFBhcmVudFduZC0+T25Ob3RpZnkodGhpcywgUE5NX0FERENISUxEKTsKKworICAgIFBXTF9DUkVBVEVQQVJBTSBjY3AgPSBtX3NQcml2YXRlUGFyYW07CisKKyAgICBjY3AuZHdGbGFncyAmPSAweEZGRkYwMDAwTDsgIC8vIHJlbW92ZSBzdWIgc3R5bGVzCisgICAgY2NwLm10Q2hpbGQgPSBDRlhfTWF0cml4KDEsIDAsIDAsIDEsIDAsIDApOworCisgICAgQ3JlYXRlU2Nyb2xsQmFyKGNjcCk7CisgICAgQ3JlYXRlQ2hpbGRXbmQoY2NwKTsKKworICAgIG1fYlZpc2libGUgPSBIYXNGbGFnKFBXU19WSVNJQkxFKTsKKworICAgIE9uQ3JlYXRlZCgpOworCisgICAgUmVQb3NDaGlsZFduZCgpOworICAgIG1fYkNyZWF0ZWQgPSBUUlVFOworICB9CiB9CiAKLXZvaWQgQ1BXTF9XbmQ6OkNyZWF0ZShjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCkKLXsKLQlpZiAoIUlzVmFsaWQoKSkKLQl7Ci0JCW1fc1ByaXZhdGVQYXJhbSA9IGNwOwordm9pZCBDUFdMX1duZDo6T25DcmVhdGUoUFdMX0NSRUFURVBBUkFNJiBjcCkge30KIAotCQlPbkNyZWF0ZShtX3NQcml2YXRlUGFyYW0pOwordm9pZCBDUFdMX1duZDo6T25DcmVhdGVkKCkge30KIAotCQltX3NQcml2YXRlUGFyYW0ucmNSZWN0V25kLk5vcm1hbGl6ZSgpOwotCQltX3JjV2luZG93ID0gbV9zUHJpdmF0ZVBhcmFtLnJjUmVjdFduZDsKLQkJbV9yY0NsaXAgPSBDUFdMX1V0aWxzOjpJbmZsYXRlUmVjdChtX3JjV2luZG93LDEuMGYpOwordm9pZCBDUFdMX1duZDo6T25EZXN0cm95KCkge30KIAotCQlDcmVhdGVNc2dDb250cm9sKCk7Ci0KLQkJaWYgKG1fc1ByaXZhdGVQYXJhbS5wUGFyZW50V25kKQotCQkJbV9zUHJpdmF0ZVBhcmFtLnBQYXJlbnRXbmQtPk9uTm90aWZ5KHRoaXMsIFBOTV9BRERDSElMRCk7Ci0KLQkJUFdMX0NSRUFURVBBUkFNIGNjcCA9IG1fc1ByaXZhdGVQYXJhbTsKLQotCQljY3AuZHdGbGFncyAmPSAweEZGRkYwMDAwTDsgLy9yZW1vdmUgc3ViIHN0eWxlcwotCQljY3AubXRDaGlsZCA9IENQREZfTWF0cml4KDEsMCwwLDEsMCwwKTsKLQkJCi0JCUNyZWF0ZVNjcm9sbEJhcihjY3ApOwotCQlDcmVhdGVDaGlsZFduZChjY3ApOyAKLQotCQltX2JWaXNpYmxlID0gSGFzRmxhZyhQV1NfVklTSUJMRSk7Ci0KLQkJT25DcmVhdGVkKCk7Ci0KLQkJUmVQb3NDaGlsZFduZCgpOwotCQltX2JDcmVhdGVkID0gVFJVRTsKLQl9Cit2b2lkIENQV0xfV25kOjpJbnZhbGlkYXRlRm9jdXNIYW5kbGVyKElQV0xfRm9jdXNIYW5kbGVyKiBoYW5kbGVyKSB7CisgIGlmIChtX3NQcml2YXRlUGFyYW0ucEZvY3VzSGFuZGxlciA9PSBoYW5kbGVyKQorICAgIG1fc1ByaXZhdGVQYXJhbS5wRm9jdXNIYW5kbGVyID0gbnVsbHB0cjsKIH0KIAotdm9pZCBDUFdMX1duZDo6T25DcmVhdGUoUFdMX0NSRUFURVBBUkFNICYgY3ApCi17Cit2b2lkIENQV0xfV25kOjpJbnZhbGlkYXRlUHJvdmlkZXIoSVBXTF9Qcm92aWRlciogcHJvdmlkZXIpIHsKKyAgaWYgKG1fc1ByaXZhdGVQYXJhbS5wUHJvdmlkZXIgPT0gcHJvdmlkZXIpCisgICAgbV9zUHJpdmF0ZVBhcmFtLnBQcm92aWRlciA9IG51bGxwdHI7CiB9CiAKLXZvaWQgQ1BXTF9XbmQ6Ok9uQ3JlYXRlZCgpCi17Cit2b2lkIENQV0xfV25kOjpEZXN0cm95KCkgeworICBLaWxsRm9jdXMoKTsKKworICBPbkRlc3Ryb3koKTsKKworICBpZiAobV9iQ3JlYXRlZCkgeworICAgIGZvciAoaW50MzJfdCBpID0gbV9hQ2hpbGRyZW4uR2V0U2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgIGlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW5baV0pIHsKKyAgICAgICAgcENoaWxkLT5EZXN0cm95KCk7CisgICAgICAgIGRlbGV0ZSBwQ2hpbGQ7CisgICAgICAgIHBDaGlsZCA9IE5VTEw7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG1fc1ByaXZhdGVQYXJhbS5wUGFyZW50V25kKQorICAgICAgbV9zUHJpdmF0ZVBhcmFtLnBQYXJlbnRXbmQtPk9uTm90aWZ5KHRoaXMsIFBOTV9SRU1PVkVDSElMRCk7CisgICAgbV9iQ3JlYXRlZCA9IEZBTFNFOworICB9CisKKyAgRGVzdHJveU1zZ0NvbnRyb2woKTsKKworICBGWFNZU19tZW1zZXQoJm1fc1ByaXZhdGVQYXJhbSwgMCwgc2l6ZW9mKFBXTF9DUkVBVEVQQVJBTSkpOworICBtX2FDaGlsZHJlbi5SZW1vdmVBbGwoKTsKKyAgbV9wVlNjcm9sbEJhciA9IE5VTEw7CiB9CiAKLXZvaWQgQ1BXTF9XbmQ6Ok9uRGVzdHJveSgpCi17Cit2b2lkIENQV0xfV25kOjpNb3ZlKGNvbnN0IENQREZfUmVjdCYgcmNOZXcsIEZYX0JPT0wgYlJlc2V0LCBGWF9CT09MIGJSZWZyZXNoKSB7CisgIGlmIChJc1ZhbGlkKCkpIHsKKyAgICBDUERGX1JlY3QgcmNPbGQgPSBHZXRXaW5kb3dSZWN0KCk7CisKKyAgICBtX3JjV2luZG93ID0gcmNOZXc7CisgICAgbV9yY1dpbmRvdy5Ob3JtYWxpemUoKTsKKworICAgIGlmIChyY09sZC5sZWZ0ICE9IHJjTmV3LmxlZnQgfHwgcmNPbGQucmlnaHQgIT0gcmNOZXcucmlnaHQgfHwKKyAgICAgICAgcmNPbGQudG9wICE9IHJjTmV3LnRvcCB8fCByY09sZC5ib3R0b20gIT0gcmNOZXcuYm90dG9tKSB7CisgICAgICBpZiAoYlJlc2V0KSB7CisgICAgICAgIFJlUG9zQ2hpbGRXbmQoKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGJSZWZyZXNoKSB7CisgICAgICBJbnZhbGlkYXRlUmVjdE1vdmUocmNPbGQsIHJjTmV3KTsKKyAgICB9CisKKyAgICBtX3NQcml2YXRlUGFyYW0ucmNSZWN0V25kID0gbV9yY1dpbmRvdzsKKyAgfQogfQogCi12b2lkIENQV0xfV25kOjpEZXN0cm95KCkKLXsKLQlLaWxsRm9jdXMoKTsKK3ZvaWQgQ1BXTF9XbmQ6OkludmFsaWRhdGVSZWN0TW92ZShjb25zdCBDUERGX1JlY3QmIHJjT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVjdCYgcmNOZXcpIHsKKyAgQ1BERl9SZWN0IHJjVW5pb24gPSByY09sZDsKKyAgcmNVbmlvbi5VbmlvbihyY05ldyk7CiAKLQlPbkRlc3Ryb3koKTsKLQotCWlmIChtX2JDcmVhdGVkKQotCXsKLQkJZm9yIChGWF9JTlQzMiBpID0gbV9hQ2hpbGRyZW4uR2V0U2l6ZSgpLTE7IGkgPj0gMDsgaSAtLSkKLQkJewotCQkJaWYgKENQV0xfV25kICogcENoaWxkID0gbV9hQ2hpbGRyZW5baV0pCi0JCQl7Ci0JCQkJcENoaWxkLT5EZXN0cm95KCk7Ci0JCQkJZGVsZXRlIHBDaGlsZDsKLQkJCQlwQ2hpbGQgPSBOVUxMOwotCQkJfQotCQl9Ci0KLQkJaWYgKG1fc1ByaXZhdGVQYXJhbS5wUGFyZW50V25kKQotCQkJbV9zUHJpdmF0ZVBhcmFtLnBQYXJlbnRXbmQtPk9uTm90aWZ5KHRoaXMsIFBOTV9SRU1PVkVDSElMRCk7Ci0JCW1fYkNyZWF0ZWQgPSBGQUxTRTsKLQl9Ci0KLQlEZXN0cm95TXNnQ29udHJvbCgpOwotCi0JRlhTWVNfbWVtc2V0KCZtX3NQcml2YXRlUGFyYW0sIDAsIHNpemVvZihQV0xfQ1JFQVRFUEFSQU0pKTsKLQltX2FDaGlsZHJlbi5SZW1vdmVBbGwoKTsJCi0JbV9wVlNjcm9sbEJhciA9IE5VTEw7CisgIEludmFsaWRhdGVSZWN0KCZyY1VuaW9uKTsKIH0KIAotdm9pZCBDUFdMX1duZDo6TW92ZShjb25zdCBDUERGX1JlY3QgJiByY05ldywgRlhfQk9PTCBiUmVzZXQsRlhfQk9PTCBiUmVmcmVzaCkKLXsKLQlpZiAoSXNWYWxpZCgpKQotCXsKLQkJQ1BERl9SZWN0IHJjT2xkID0gdGhpcy0+R2V0V2luZG93UmVjdCgpOwotCi0JCW1fcmNXaW5kb3cgPSByY05ldzsKLQkJbV9yY1dpbmRvdy5Ob3JtYWxpemUoKTsKLQkJLy9tX3JjQ2xpcCA9IENQV0xfVXRpbHM6OkluZmxhdGVSZWN0KG1fcmNXaW5kb3csMS4wZik7IC8vZm9yIHNwZWNpYWwgY2FyZXQgCi0KLQkJaWYgKHJjT2xkLmxlZnQgIT0gcmNOZXcubGVmdCB8fCByY09sZC5yaWdodCAhPSByY05ldy5yaWdodCB8fAotCQkJcmNPbGQudG9wICE9IHJjTmV3LnRvcCB8fCByY09sZC5ib3R0b20gIT0gcmNOZXcuYm90dG9tKQotCQl7Ci0JCQlpZiAoYlJlc2V0KQotCQkJewotCQkJCVJlUG9zQ2hpbGRXbmQoKTsJCi0JCQl9CQotCi0JCX0KLQkJaWYgKGJSZWZyZXNoKQotCQl7CQotCQkJSW52YWxpZGF0ZVJlY3RNb3ZlKHJjT2xkLHJjTmV3KTsKLQkJfQotCi0JCW1fc1ByaXZhdGVQYXJhbS5yY1JlY3RXbmQgPSBtX3JjV2luZG93OwotCX0KK3ZvaWQgQ1BXTF9XbmQ6OkdldEFwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmJiBzQXBwU3RyZWFtKSB7CisgIGlmIChJc1ZhbGlkKCkgJiYgSXNWaXNpYmxlKCkpIHsKKyAgICBHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShzQXBwU3RyZWFtKTsKKyAgICBHZXRDaGlsZEFwcGVhcmFuY2VTdHJlYW0oc0FwcFN0cmVhbSk7CisgIH0KIH0KIAotdm9pZCAgQ1BXTF9XbmQ6OkludmFsaWRhdGVSZWN0TW92ZShjb25zdCBDUERGX1JlY3QgJiByY09sZCwgY29uc3QgQ1BERl9SZWN0ICYgcmNOZXcpCi17Ci0JQ1BERl9SZWN0IHJjVW5pb24gPSByY09sZDsKLQlyY1VuaW9uLlVuaW9uKHJjTmV3KTsKKy8vIGlmIGRvbid0IHNldCxHZXQgZGVmYXVsdCBhcHBlcmFuY2Ugc3RyZWFtCit2b2lkIENQV0xfV25kOjpHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYmIHNBcHBTdHJlYW0pIHsKKyAgQ1BERl9SZWN0IHJlY3RXbmQgPSBHZXRXaW5kb3dSZWN0KCk7CisgIGlmICghcmVjdFduZC5Jc0VtcHR5KCkpIHsKKyAgICBDRlhfQnl0ZVRleHRCdWYgc1RoaXM7CiAKLQlJbnZhbGlkYXRlUmVjdCgmcmNVbmlvbik7CisgICAgaWYgKEhhc0ZsYWcoUFdTX0JBQ0tHUk9VTkQpKQorICAgICAgc1RoaXMgPDwgQ1BXTF9VdGlsczo6R2V0UmVjdEZpbGxBcHBTdHJlYW0ocmVjdFduZCwgR2V0QmFja2dyb3VuZENvbG9yKCkpOwogCi0JLyoKLQlDUERGX1JlY3QgU3ViQXJyYXlbNF07IAorICAgIGlmIChIYXNGbGFnKFBXU19CT1JERVIpKSB7CisgICAgICBzVGhpcyA8PCBDUFdMX1V0aWxzOjpHZXRCb3JkZXJBcHBTdHJlYW0oCisgICAgICAgICAgcmVjdFduZCwgKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCksIEdldEJvcmRlckNvbG9yKCksCisgICAgICAgICAgR2V0Qm9yZGVyTGVmdFRvcENvbG9yKEdldEJvcmRlclN0eWxlKCkpLAorICAgICAgICAgIEdldEJvcmRlclJpZ2h0Qm90dG9tQ29sb3IoR2V0Qm9yZGVyU3R5bGUoKSksIEdldEJvcmRlclN0eWxlKCksCisgICAgICAgICAgR2V0Qm9yZGVyRGFzaCgpKTsKKyAgICB9CiAKLQlyY09sZC5TdWJzdHJhY3Q0KHJjTmV3LFN1YkFycmF5KTsKLQlmb3IgKEZYX0lOVDMyIGk9MDtpPDQ7aSsrKQotCXsKLQkJaWYgKFN1YkFycmF5W2ldLmxlZnQgPT0gMCAmJgotCQkJU3ViQXJyYXlbaV0ucmlnaHQgPT0gMCAmJgotCQkJU3ViQXJyYXlbaV0udG9wID09IDAgJiYKLQkJCVN1YkFycmF5W2ldLmJvdHRvbSA9PSAwKWNvbnRpbnVlOwotCi0JCUludmFsaWRhdGVSZWN0KCZDUFdMX1V0aWxzOjpJbmZsYXRlUmVjdChTdWJBcnJheVtpXSwyKSk7Ci0JfQotCi0JcmNOZXcuU3Vic3RyYWN0NChyY09sZCxTdWJBcnJheSk7Ci0JZm9yIChGWF9JTlQzMiBqPTA7ajw0O2orKykKLQl7Ci0JCWlmIChTdWJBcnJheVtqXS5sZWZ0ID09IDAgJiYKLQkJCVN1YkFycmF5W2pdLnJpZ2h0ID09IDAgJiYKLQkJCVN1YkFycmF5W2pdLnRvcCA9PSAwICYmCi0JCQlTdWJBcnJheVtqXS5ib3R0b20gPT0gMCljb250aW51ZTsKLQotCQlJbnZhbGlkYXRlUmVjdCgmQ1BXTF9VdGlsczo6SW5mbGF0ZVJlY3QoU3ViQXJyYXlbal0sMikpOwotCX0KLQkqLworICAgIHNBcHBTdHJlYW0gPDwgc1RoaXM7CisgIH0KIH0KIAotdm9pZCBDUFdMX1duZDo6R2V0QXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVN0cmluZyAmIHNBcHBTdHJlYW0pCi17Ci0JaWYgKElzVmFsaWQoKSkKLQl7Ci0JCUNGWF9CeXRlVGV4dEJ1ZiBzVGV4dEJ1ZjsKLQkJR2V0QXBwZWFyYW5jZVN0cmVhbShzVGV4dEJ1Zik7Ci0JCXNBcHBTdHJlYW0gKz0gc1RleHRCdWYuR2V0Qnl0ZVN0cmluZygpOwotCX0KK3ZvaWQgQ1BXTF9XbmQ6OkdldENoaWxkQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYmIHNBcHBTdHJlYW0pIHsKKyAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYUNoaWxkcmVuLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKSB7CisgICAgICBwQ2hpbGQtPkdldEFwcGVhcmFuY2VTdHJlYW0oc0FwcFN0cmVhbSk7CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ1BXTF9XbmQ6OkdldEFwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSkKLXsKLQlpZiAoSXNWYWxpZCgpICYmIElzVmlzaWJsZSgpKQotCXsKLQkJR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oc0FwcFN0cmVhbSk7Ci0JCUdldENoaWxkQXBwZWFyYW5jZVN0cmVhbShzQXBwU3RyZWFtKTsKLQl9Cit2b2lkIENQV0xfV25kOjpEcmF3QXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlKSB7CisgIGlmIChJc1ZhbGlkKCkgJiYgSXNWaXNpYmxlKCkpIHsKKyAgICBEcmF3VGhpc0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlKTsKKyAgICBEcmF3Q2hpbGRBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSk7CisgIH0KIH0KIAotLy9pZiBkb24ndCBzZXQsR2V0IGRlZmF1bHQgYXBwZXJhbmNlIHN0cmVhbQotdm9pZCBDUFdMX1duZDo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmICYgc0FwcFN0cmVhbSkKLXsKLQlDUERGX1JlY3QgcmVjdFduZCA9IEdldFdpbmRvd1JlY3QoKTsKLQlpZiAoIXJlY3RXbmQuSXNFbXB0eSgpKQotCXsKLQkJQ0ZYX0J5dGVUZXh0QnVmIHNUaGlzOwordm9pZCBDUFdMX1duZDo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlKSB7CisgIENQREZfUmVjdCByZWN0V25kID0gR2V0V2luZG93UmVjdCgpOworICBpZiAoIXJlY3RXbmQuSXNFbXB0eSgpKSB7CisgICAgaWYgKEhhc0ZsYWcoUFdTX0JBQ0tHUk9VTkQpKSB7CisgICAgICBDUERGX1JlY3QgcmNDbGllbnQgPSBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdCgKKyAgICAgICAgICByZWN0V25kLCAoRlhfRkxPQVQpKEdldEJvcmRlcldpZHRoKCkgKyBHZXRJbm5lckJvcmRlcldpZHRoKCkpKTsKKyAgICAgIENQV0xfVXRpbHM6OkRyYXdGaWxsUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJhY2tncm91bmRDb2xvcigpLCBHZXRUcmFuc3BhcmVuY3koKSk7CisgICAgfQogCi0JCWlmIChIYXNGbGFnKFBXU19CQUNLR1JPVU5EKSkKLQkJCXNUaGlzIDw8IENQV0xfVXRpbHM6OkdldFJlY3RGaWxsQXBwU3RyZWFtKHJlY3RXbmQsdGhpcy0+R2V0QmFja2dyb3VuZENvbG9yKCkpOwotCi0JCWlmIChIYXNGbGFnKFBXU19CT1JERVIpKQotCQkJc1RoaXMgPDwgQ1BXTF9VdGlsczo6R2V0Qm9yZGVyQXBwU3RyZWFtKHJlY3RXbmQsCi0JCQkJCQkJCQkoRlhfRkxPQVQpR2V0Qm9yZGVyV2lkdGgoKSwKLQkJCQkJCQkJCUdldEJvcmRlckNvbG9yKCksCi0JCQkJCQkJCQl0aGlzLT5HZXRCb3JkZXJMZWZ0VG9wQ29sb3IodGhpcy0+R2V0Qm9yZGVyU3R5bGUoKSksCi0JCQkJCQkJCQl0aGlzLT5HZXRCb3JkZXJSaWdodEJvdHRvbUNvbG9yKHRoaXMtPkdldEJvcmRlclN0eWxlKCkpLAotCQkJCQkJCQkJdGhpcy0+R2V0Qm9yZGVyU3R5bGUoKSwKLQkJCQkJCQkJCXRoaXMtPkdldEJvcmRlckRhc2goKSk7Ci0KLQkJc0FwcFN0cmVhbSA8PCBzVGhpczsKLQl9CisgICAgaWYgKEhhc0ZsYWcoUFdTX0JPUkRFUikpCisgICAgICBDUFdMX1V0aWxzOjpEcmF3Qm9yZGVyKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmVjdFduZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCksIEdldEJvcmRlckNvbG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJvcmRlckxlZnRUb3BDb2xvcihHZXRCb3JkZXJTdHlsZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qm9yZGVyUmlnaHRCb3R0b21Db2xvcihHZXRCb3JkZXJTdHlsZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qm9yZGVyU3R5bGUoKSwgR2V0VHJhbnNwYXJlbmN5KCkpOworICB9CiB9CiAKLXZvaWQgQ1BXTF9XbmQ6OkdldENoaWxkQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKQotewotCWZvciAoRlhfSU5UMzIgaT0wLHN6PW1fYUNoaWxkcmVuLkdldFNpemUoKTsgaTxzejsgaSsrKQotCXsKLQkJaWYgKENQV0xfV25kICogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpCi0JCXsKLQkJCXBDaGlsZC0+R2V0QXBwZWFyYW5jZVN0cmVhbShzQXBwU3RyZWFtKTsKLQkJfQotCX0KK3ZvaWQgQ1BXTF9XbmQ6OkRyYXdDaGlsZEFwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlKSB7CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FDaGlsZHJlbi5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkgeworICAgICAgQ0ZYX01hdHJpeCBtdCA9IHBDaGlsZC0+R2V0Q2hpbGRNYXRyaXgoKTsKKyAgICAgIGlmIChtdC5Jc0lkZW50aXR5KCkpIHsKKyAgICAgICAgcENoaWxkLT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbXQuQ29uY2F0KCpwVXNlcjJEZXZpY2UpOworICAgICAgICBwQ2hpbGQtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsICZtdCk7CisgICAgICB9CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ1BXTF9XbmQ6OkRyYXdBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpCi17Ci0JaWYgKElzVmFsaWQoKSAmJiBJc1Zpc2libGUoKSkKLQl7Ci0JCURyYXdUaGlzQXBwZWFyYW5jZShwRGV2aWNlLHBVc2VyMkRldmljZSk7Ci0JCURyYXdDaGlsZEFwcGVhcmFuY2UocERldmljZSxwVXNlcjJEZXZpY2UpOwotCX0KK3ZvaWQgQ1BXTF9XbmQ6OkludmFsaWRhdGVSZWN0KENQREZfUmVjdCogcFJlY3QpIHsKKyAgaWYgKElzVmFsaWQoKSkgeworICAgIENQREZfUmVjdCByY1JlZnJlc2ggPSBwUmVjdCA/ICpwUmVjdCA6IEdldFdpbmRvd1JlY3QoKTsKKworICAgIGlmICghSGFzRmxhZyhQV1NfTk9SRUZSRVNIQ0xJUCkpIHsKKyAgICAgIENQREZfUmVjdCByY0NsaXAgPSBHZXRDbGlwUmVjdCgpOworICAgICAgaWYgKCFyY0NsaXAuSXNFbXB0eSgpKSB7CisgICAgICAgIHJjUmVmcmVzaC5JbnRlcnNlY3QocmNDbGlwKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBGWF9SRUNUIHJjV2luID0gUFdMdG9XbmQocmNSZWZyZXNoKTsKKyAgICByY1dpbi5sZWZ0IC09IFBXTF9JTlZBTElEQVRFX0lORkxBVEU7CisgICAgcmNXaW4udG9wIC09IFBXTF9JTlZBTElEQVRFX0lORkxBVEU7CisgICAgcmNXaW4ucmlnaHQgKz0gUFdMX0lOVkFMSURBVEVfSU5GTEFURTsKKyAgICByY1dpbi5ib3R0b20gKz0gUFdMX0lOVkFMSURBVEVfSU5GTEFURTsKKworICAgIGlmIChJRlhfU3lzdGVtSGFuZGxlciogcFNIID0gR2V0U3lzdGVtSGFuZGxlcigpKSB7CisgICAgICBpZiAoRlhfSFdORCBoV25kID0gR2V0QXR0YWNoZWRIV25kKCkpIHsKKyAgICAgICAgcFNILT5JbnZhbGlkYXRlUmVjdChoV25kLCByY1dpbik7CisgICAgICB9CisgICAgfQorICB9CiB9CiAKLXZvaWQgQ1BXTF9XbmQ6OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKQotewotCUNQREZfUmVjdCByZWN0V25kID0gR2V0V2luZG93UmVjdCgpOwotCWlmICghcmVjdFduZC5Jc0VtcHR5KCkpCi0JewkJCi0JCWlmIChIYXNGbGFnKFBXU19CQUNLR1JPVU5EKSkKLQkJewotCQkJQ1BERl9SZWN0IHJjQ2xpZW50ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmVjdFduZCwoRlhfRkxPQVQpKEdldEJvcmRlcldpZHRoKCkrR2V0SW5uZXJCb3JkZXJXaWR0aCgpKSk7Ci0JCQlDUFdMX1V0aWxzOjpEcmF3RmlsbFJlY3QocERldmljZSxwVXNlcjJEZXZpY2UscmNDbGllbnQsdGhpcy0+R2V0QmFja2dyb3VuZENvbG9yKCksR2V0VHJhbnNwYXJlbmN5KCkpOwotCQl9CisjZGVmaW5lIFBXTF9JTVBMRU1FTlRfS0VZX01FVEhPRChrZXlfbWV0aG9kX25hbWUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlhfQk9PTCBDUFdMX1duZDo6a2V5X21ldGhvZF9uYW1lKEZYX1dPUkQgbkNoYXIsIEZYX0RXT1JEIG5GbGFnKSB7ICAgXAorICAgIGlmIChJc1ZhbGlkKCkgJiYgSXNWaXNpYmxlKCkgJiYgSXNFbmFibGVkKCkpIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoSXNXbmRDYXB0dXJlS2V5Ym9hcmQodGhpcykpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYUNoaWxkcmVuLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsgXAorICAgICAgICAgIGlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpIHsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoSXNXbmRDYXB0dXJlS2V5Ym9hcmQocENoaWxkKSkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgcmV0dXJuIHBDaGlsZC0+a2V5X21ldGhvZF9uYW1lKG5DaGFyLCBuRmxhZyk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gRkFMU0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CiAKLQkJaWYgKEhhc0ZsYWcoUFdTX0JPUkRFUikpCi0JCQlDUFdMX1V0aWxzOjpEcmF3Qm9yZGVyKHBEZXZpY2UsCi0JCQkJCQkJCXBVc2VyMkRldmljZSwKLQkJCQkJCQkJcmVjdFduZCwKLQkJCQkJCQkJKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCksCi0JCQkJCQkJCUdldEJvcmRlckNvbG9yKCksCi0JCQkJCQkJCXRoaXMtPkdldEJvcmRlckxlZnRUb3BDb2xvcih0aGlzLT5HZXRCb3JkZXJTdHlsZSgpKSwKLQkJCQkJCQkJdGhpcy0+R2V0Qm9yZGVyUmlnaHRCb3R0b21Db2xvcih0aGlzLT5HZXRCb3JkZXJTdHlsZSgpKSwKLQkJCQkJCQkJdGhpcy0+R2V0Qm9yZGVyU3R5bGUoKSwKLQkJCQkJCQkJdGhpcy0+R2V0Qm9yZGVyRGFzaCgpLAotCQkJCQkJCQlHZXRUcmFuc3BhcmVuY3koKSk7CQkJCQkJCQkKLQl9Ci19Ci0KLXZvaWQgQ1BXTF9XbmQ6OkRyYXdDaGlsZEFwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSkKLXsKLQlmb3IgKEZYX0lOVDMyIGk9MCxzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQl7Ci0JCWlmIChDUFdMX1duZCAqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKQotCQl7Ci0JCQlDUERGX01hdHJpeCBtdCA9IHBDaGlsZC0+R2V0Q2hpbGRNYXRyaXgoKTsKLQkJCWlmIChtdC5Jc0lkZW50aXR5KCkpCi0JCQl7Ci0JCQkJcENoaWxkLT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLHBVc2VyMkRldmljZSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJbXQuQ29uY2F0KCpwVXNlcjJEZXZpY2UpOwotCQkJCXBDaGlsZC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwmbXQpOwotCQkJfQotCQl9Ci0JfQotfQotCi12b2lkIENQV0xfV25kOjpJbnZhbGlkYXRlUmVjdChDUERGX1JlY3QqIHBSZWN0KQotewotCWlmIChJc1ZhbGlkKCkpCi0JewotCQlDUERGX1JlY3QgcmNSZWZyZXNoID0gcFJlY3QgPyAqcFJlY3QgOiBHZXRXaW5kb3dSZWN0KCk7Ci0KLQkJaWYgKCFIYXNGbGFnKFBXU19OT1JFRlJFU0hDTElQKSkKLQkJewotCQkJQ1BERl9SZWN0IHJjQ2xpcCA9IEdldENsaXBSZWN0KCk7CQkKLQkJCWlmICghcmNDbGlwLklzRW1wdHkoKSkKLQkJCXsKLQkJCQlyY1JlZnJlc2guSW50ZXJzZWN0KHJjQ2xpcCk7Ci0JCQl9Ci0JCX0KLQotCQlGWF9SRUNUIHJjV2luID0gUFdMdG9XbmQocmNSZWZyZXNoKTsKLQkJcmNXaW4ubGVmdCAtPSBQV0xfSU5WQUxJREFURV9JTkZMQVRFOwotCQlyY1dpbi50b3AgLT0gUFdMX0lOVkFMSURBVEVfSU5GTEFURTsKLQkJcmNXaW4ucmlnaHQgKz0gUFdMX0lOVkFMSURBVEVfSU5GTEFURTsKLQkJcmNXaW4uYm90dG9tICs9IFBXTF9JTlZBTElEQVRFX0lORkxBVEU7Ci0KLQkJaWYgKElGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCkpCi0JCXsKLQkJCWlmIChGWF9IV05EIGhXbmQgPSBHZXRBdHRhY2hlZEhXbmQoKSkKLQkJCXsKLQkJCQlwU0gtPkludmFsaWRhdGVSZWN0KGhXbmQsIHJjV2luKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotI2RlZmluZSBQV0xfSU1QTEVNRU5UX0tFWV9NRVRIT0Qoa2V5X21ldGhvZF9uYW1lKVwKLUZYX0JPT0wgQ1BXTF9XbmQ6OmtleV9tZXRob2RfbmFtZShGWF9XT1JEIG5DaGFyLCBGWF9EV09SRCBuRmxhZylcCi17XAotCWlmIChJc1ZhbGlkKCkgJiYgSXNWaXNpYmxlKCkgJiYgSXNFbmFibGVkKCkpXAotCXtcCi0JCWlmIChJc1duZENhcHR1cmVLZXlib2FyZCh0aGlzKSlcCi0JCXtcCi0JCQlmb3IgKEZYX0lOVDMyIGk9MCxzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKylcCi0JCQl7XAotCQkJCWlmIChDUFdMX1duZCAqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKVwKLQkJCQl7XAotCQkJCQlpZiAoSXNXbmRDYXB0dXJlS2V5Ym9hcmQocENoaWxkKSlcCi0JCQkJCXtcCi0JCQkJCQlyZXR1cm4gcENoaWxkLT5rZXlfbWV0aG9kX25hbWUobkNoYXIsbkZsYWcpO1wKLQkJCQkJfVwKLQkJCQl9XAotCQkJfVwKLQkJfVwKLQl9XAotCXJldHVybiBGQUxTRTtcCi19Ci0KLSNkZWZpbmUgUFdMX0lNUExFTUVOVF9NT1VTRV9NRVRIT0QobW91c2VfbWV0aG9kX25hbWUpXAotRlhfQk9PTCBDUFdMX1duZDo6bW91c2VfbWV0aG9kX25hbWUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LCBGWF9EV09SRCBuRmxhZylcCi17XAotCWlmIChJc1ZhbGlkKCkgJiYgSXNWaXNpYmxlKCkgJiYgSXNFbmFibGVkKCkpXAotCXtcCi0JCWlmIChJc1duZENhcHR1cmVNb3VzZSh0aGlzKSlcCi0JCXtcCi0JCQlmb3IgKEZYX0lOVDMyIGk9MCxzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKylcCi0JCQl7XAotCQkJCWlmIChDUFdMX1duZCAqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKVwKLQkJCQl7XAotCQkJCQlpZiAoSXNXbmRDYXB0dXJlTW91c2UocENoaWxkKSlcCi0JCQkJCXtcCi0JCQkJCQlyZXR1cm4gcENoaWxkLT5tb3VzZV9tZXRob2RfbmFtZShwQ2hpbGQtPlBhcmVudFRvQ2hpbGQocG9pbnQpLG5GbGFnKTtcCi0JCQkJCX1cCi0JCQkJfVwKLQkJCX1cCi0JCQlTZXRDdXJzb3IoKTtcCi0JCX1cCi0JCWVsc2VcCi0JCXtcCi0JCQlmb3IgKEZYX0lOVDMyIGk9MCxzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKylcCi0JCQl7XAotCQkJCWlmIChDUFdMX1duZCAqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKVwKLQkJCQl7XAotCQkJCQlpZiAocENoaWxkLT5XbmRIaXRUZXN0KHBDaGlsZC0+UGFyZW50VG9DaGlsZChwb2ludCkpKVwKLQkJCQkJe1wKLQkJCQkJCXJldHVybiBwQ2hpbGQtPm1vdXNlX21ldGhvZF9uYW1lKHBDaGlsZC0+UGFyZW50VG9DaGlsZChwb2ludCksbkZsYWcpO1wKLQkJCQkJfVwKLQkJCQl9XAotCQkJfVwKLQkJCWlmICh0aGlzLT5XbmRIaXRUZXN0KHBvaW50KSlcCi0JCQkJU2V0Q3Vyc29yKCk7XAotCQl9XAotCX1cCi0JcmV0dXJuIEZBTFNFO1wKLX0KKyNkZWZpbmUgUFdMX0lNUExFTUVOVF9NT1VTRV9NRVRIT0QobW91c2VfbWV0aG9kX25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGWF9CT09MIENQV0xfV25kOjptb3VzZV9tZXRob2RfbmFtZShjb25zdCBDUERGX1BvaW50JiBwb2ludCwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSB7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoSXNWYWxpZCgpICYmIElzVmlzaWJsZSgpICYmIElzRW5hYmxlZCgpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKElzV25kQ2FwdHVyZU1vdXNlKHRoaXMpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FDaGlsZHJlbi5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7ICAgICAgIFwKKyAgICAgICAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKElzV25kQ2FwdHVyZU1vdXNlKHBDaGlsZCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIHJldHVybiBwQ2hpbGQtPm1vdXNlX21ldGhvZF9uYW1lKHBDaGlsZC0+UGFyZW50VG9DaGlsZChwb2ludCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkZsYWcpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTZXRDdXJzb3IoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYUNoaWxkcmVuLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsgICAgICAgXAorICAgICAgICAgIGlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAocENoaWxkLT5XbmRIaXRUZXN0KHBDaGlsZC0+UGFyZW50VG9DaGlsZChwb2ludCkpKSB7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgcmV0dXJuIHBDaGlsZC0+bW91c2VfbWV0aG9kX25hbWUocENoaWxkLT5QYXJlbnRUb0NoaWxkKHBvaW50KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuRmxhZyk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChXbmRIaXRUZXN0KHBvaW50KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBTZXRDdXJzb3IoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gRkFMU0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CiAKIFBXTF9JTVBMRU1FTlRfS0VZX01FVEhPRChPbktleURvd24pCiBQV0xfSU1QTEVNRU5UX0tFWV9NRVRIT0QoT25LZXlVcCkKQEAgLTU4Nyw3NjEgKzQ2Miw1NzYgQEAKIFBXTF9JTVBMRU1FTlRfTU9VU0VfTUVUSE9EKE9uTUJ1dHRvbkRibENsaykKIFBXTF9JTVBMRU1FTlRfTU9VU0VfTUVUSE9EKE9uTUJ1dHRvbkRvd24pCiBQV0xfSU1QTEVNRU5UX01PVVNFX01FVEhPRChPbk1CdXR0b25VcCkKLVBXTF9JTVBMRU1FTlRfTU9VU0VfTUVUSE9EKE9uUkJ1dHRvbkRibENsaykKIFBXTF9JTVBMRU1FTlRfTU9VU0VfTUVUSE9EKE9uUkJ1dHRvbkRvd24pCiBQV0xfSU1QTEVNRU5UX01PVVNFX01FVEhPRChPblJCdXR0b25VcCkKIFBXTF9JTVBMRU1FTlRfTU9VU0VfTUVUSE9EKE9uTW91c2VNb3ZlKQogCi1GWF9CT09MCUNQV0xfV25kOjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50ICYgcG9pbnQsIEZYX0RXT1JEIG5GbGFnKQotewotCWlmIChJc1ZhbGlkKCkgJiYgSXNWaXNpYmxlKCkgJiYgSXNFbmFibGVkKCkpCi0JewotCQlTZXRDdXJzb3IoKTsKLQkJaWYgKElzV25kQ2FwdHVyZUtleWJvYXJkKHRoaXMpKQotCQl7Ci0JCQlmb3IgKEZYX0lOVDMyIGk9MCxzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQkJCXsKLQkJCQlpZiAoQ1BXTF9XbmQgKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkKLQkJCQl7Ci0JCQkJCWlmIChJc1duZENhcHR1cmVLZXlib2FyZChwQ2hpbGQpKQotCQkJCQl7Ci0JCQkJCQlyZXR1cm4gcENoaWxkLT5Pbk1vdXNlV2hlZWwoekRlbHRhLHBDaGlsZC0+UGFyZW50VG9DaGlsZChwb2ludCksIG5GbGFnKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gRkFMU0U7CitGWF9CT09MIENQV0xfV25kOjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUG9pbnQmIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIG5GbGFnKSB7CisgIGlmIChJc1ZhbGlkKCkgJiYgSXNWaXNpYmxlKCkgJiYgSXNFbmFibGVkKCkpIHsKKyAgICBTZXRDdXJzb3IoKTsKKyAgICBpZiAoSXNXbmRDYXB0dXJlS2V5Ym9hcmQodGhpcykpIHsKKyAgICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FDaGlsZHJlbi5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICAgIGlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpIHsKKyAgICAgICAgICBpZiAoSXNXbmRDYXB0dXJlS2V5Ym9hcmQocENoaWxkKSkgeworICAgICAgICAgICAgcmV0dXJuIHBDaGlsZC0+T25Nb3VzZVdoZWVsKHpEZWx0YSwgcENoaWxkLT5QYXJlbnRUb0NoaWxkKHBvaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuRmxhZyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBGQUxTRTsKIH0KIAotdm9pZCBDUFdMX1duZDo6QWRkQ2hpbGQoQ1BXTF9XbmQgKiBwV25kKQotewotCW1fYUNoaWxkcmVuLkFkZChwV25kKTsKK3ZvaWQgQ1BXTF9XbmQ6OkFkZENoaWxkKENQV0xfV25kKiBwV25kKSB7CisgIG1fYUNoaWxkcmVuLkFkZChwV25kKTsKIH0KIAotdm9pZCBDUFdMX1duZDo6UmVtb3ZlQ2hpbGQoQ1BXTF9XbmQgKiBwV25kKQotewotCWZvciAoRlhfSU5UMzIgaSA9IG1fYUNoaWxkcmVuLkdldFNpemUoKS0xOyBpID49IDA7IGkgLS0pCi0JewotCQlpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKQotCQl7Ci0JCQlpZiAocENoaWxkID09IHBXbmQpCi0JCQl7Ci0JCQkJbV9hQ2hpbGRyZW4uUmVtb3ZlQXQoaSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Cit2b2lkIENQV0xfV25kOjpSZW1vdmVDaGlsZChDUFdMX1duZCogcFduZCkgeworICBmb3IgKGludDMyX3QgaSA9IG1fYUNoaWxkcmVuLkdldFNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkgeworICAgICAgaWYgKHBDaGlsZCA9PSBwV25kKSB7CisgICAgICAgIG1fYUNoaWxkcmVuLlJlbW92ZUF0KGkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KIH0KIAotdm9pZCBDUFdMX1duZDo6T25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsIEZYX0RXT1JEIG1zZywgRlhfSU5UUFRSIHdQYXJhbSwgRlhfSU5UUFRSIGxQYXJhbSkKLXsKLQlzd2l0Y2ggKG1zZykKLQl7Ci0JY2FzZSBQTk1fQUREQ0hJTEQ6Ci0JCXRoaXMtPkFkZENoaWxkKHBXbmQpOwotCQlicmVhazsKLQljYXNlIFBOTV9SRU1PVkVDSElMRDoKLQkJdGhpcy0+UmVtb3ZlQ2hpbGQocFduZCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KK3ZvaWQgQ1BXTF9XbmQ6Ok9uTm90aWZ5KENQV0xfV25kKiBwV25kLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3Qgd1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbFBhcmFtKSB7CisgIHN3aXRjaCAobXNnKSB7CisgICAgY2FzZSBQTk1fQUREQ0hJTEQ6CisgICAgICBBZGRDaGlsZChwV25kKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUE5NX1JFTU9WRUNISUxEOgorICAgICAgUmVtb3ZlQ2hpbGQocFduZCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KIH0KIAotRlhfQk9PTCBDUFdMX1duZDo6SXNWYWxpZCgpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fYkNyZWF0ZWQ7CitGWF9CT09MIENQV0xfV25kOjpJc1ZhbGlkKCkgY29uc3QgeworICByZXR1cm4gbV9iQ3JlYXRlZDsKIH0KIAotUFdMX0NSRUFURVBBUkFNIENQV0xfV25kOjpHZXRDcmVhdGlvblBhcmFtKCkgY29uc3QKLXsKLQlyZXR1cm4gbV9zUHJpdmF0ZVBhcmFtOworY29uc3QgUFdMX0NSRUFURVBBUkFNJiBDUFdMX1duZDo6R2V0Q3JlYXRpb25QYXJhbSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbTsKIH0KIAotQ1BXTF9XbmQqIENQV0xfV25kOjpHZXRQYXJlbnRXaW5kb3coKSBjb25zdAotewotCXJldHVybiBtX3NQcml2YXRlUGFyYW0ucFBhcmVudFduZDsKK0NQV0xfV25kKiBDUFdMX1duZDo6R2V0UGFyZW50V2luZG93KCkgY29uc3QgeworICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLnBQYXJlbnRXbmQ7CiB9CiAKLUNQREZfUmVjdCBDUFdMX1duZDo6R2V0T3JpZ2luV2luZG93UmVjdCgpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5yY1JlY3RXbmQ7CitDUERGX1JlY3QgQ1BXTF9XbmQ6OkdldFdpbmRvd1JlY3QoKSBjb25zdCB7CisgIHJldHVybiBtX3JjV2luZG93OwogfQogCitDUERGX1JlY3QgQ1BXTF9XbmQ6OkdldENsaWVudFJlY3QoKSBjb25zdCB7CisgIENQREZfUmVjdCByY1dpbmRvdyA9IEdldFdpbmRvd1JlY3QoKTsKKyAgQ1BERl9SZWN0IHJjQ2xpZW50ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QoCisgICAgICByY1dpbmRvdywgKEZYX0ZMT0FUKShHZXRCb3JkZXJXaWR0aCgpICsgR2V0SW5uZXJCb3JkZXJXaWR0aCgpKSk7CisgIGlmIChDUFdMX1Njcm9sbEJhciogcFZTQiA9IEdldFZTY3JvbGxCYXIoKSkKKyAgICByY0NsaWVudC5yaWdodCAtPSBwVlNCLT5HZXRTY3JvbGxCYXJXaWR0aCgpOworCi1DUERGX1JlY3QgQ1BXTF9XbmQ6OkdldFdpbmRvd1JlY3QoKSBjb25zdAotewotCXJldHVybiBtX3JjV2luZG93OworICByY0NsaWVudC5Ob3JtYWxpemUoKTsKKyAgcmV0dXJuIHJjV2luZG93LkNvbnRhaW5zKHJjQ2xpZW50KSA/IHJjQ2xpZW50IDogQ1BERl9SZWN0KCk7CiB9CiAKLUNQREZfUmVjdCBDUFdMX1duZDo6R2V0Q2xpZW50UmVjdCgpIGNvbnN0Ci17Ci0JQ1BERl9SZWN0IHJjV2luZG93ID0gR2V0V2luZG93UmVjdCgpOwotCUNQREZfUmVjdCByY0NsaWVudCA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJjV2luZG93LChGWF9GTE9BVCkoR2V0Qm9yZGVyV2lkdGgoKStHZXRJbm5lckJvcmRlcldpZHRoKCkpKTsKLQotCWlmIChDUFdMX1Njcm9sbEJhciAqIHBWU0IgPSB0aGlzLT5HZXRWU2Nyb2xsQmFyKCkpCi0JCXJjQ2xpZW50LnJpZ2h0IC09IHBWU0ItPkdldFNjcm9sbEJhcldpZHRoKCk7Ci0KLQlyY0NsaWVudC5Ob3JtYWxpemUoKTsKLQotCWlmIChyY1dpbmRvdy5Db250YWlucyhyY0NsaWVudCkpCi0JCXJldHVybiByY0NsaWVudDsKLQllbHNlCi0JCXJldHVybiBDUERGX1JlY3QoKTsKK0NQREZfUG9pbnQgQ1BXTF9XbmQ6OkdldENlbnRlclBvaW50KCkgY29uc3QgeworICBDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CisgIHJldHVybiBDUERGX1BvaW50KChyY0NsaWVudC5sZWZ0ICsgcmNDbGllbnQucmlnaHQpICogMC41ZiwKKyAgICAgICAgICAgICAgICAgICAgKHJjQ2xpZW50LnRvcCArIHJjQ2xpZW50LmJvdHRvbSkgKiAwLjVmKTsKIH0KIAotQ1BERl9Qb2ludCBDUFdMX1duZDo6R2V0Q2VudGVyUG9pbnQoKSBjb25zdAotewotCUNQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKLQotCXJldHVybiBDUERGX1BvaW50KChyY0NsaWVudC5sZWZ0ICsgcmNDbGllbnQucmlnaHQpICogMC41ZiwKLQkJKHJjQ2xpZW50LnRvcCArIHJjQ2xpZW50LmJvdHRvbSkgKiAwLjVmKTsKK0ZYX0JPT0wgQ1BXTF9XbmQ6Okhhc0ZsYWcoRlhfRFdPUkQgZHdGbGFncykgY29uc3QgeworICByZXR1cm4gKG1fc1ByaXZhdGVQYXJhbS5kd0ZsYWdzICYgZHdGbGFncykgIT0gMDsKIH0KIAotQ1BERl9SZWN0IENQV0xfV25kOjpHZXRDbGllbnRDZW50ZXJTcXVhcmUoKSBjb25zdAotewotCXJldHVybiBDUFdMX1V0aWxzOjpHZXRDZW50ZXJTcXVhcmUoR2V0Q2xpZW50UmVjdCgpKTsKK3ZvaWQgQ1BXTF9XbmQ6OlJlbW92ZUZsYWcoRlhfRFdPUkQgZHdGbGFncykgeworICBtX3NQcml2YXRlUGFyYW0uZHdGbGFncyAmPSB+ZHdGbGFnczsKIH0KIAotQ1BERl9SZWN0IENQV0xfV25kOjpHZXRXaW5kb3dDZW50ZXJTcXVhcmUoKSBjb25zdAotewotCXJldHVybiBDUFdMX1V0aWxzOjpHZXRDZW50ZXJTcXVhcmUoQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QoR2V0V2luZG93UmVjdCgpLDAuMWYpKTsKK3ZvaWQgQ1BXTF9XbmQ6OkFkZEZsYWcoRlhfRFdPUkQgZHdGbGFncykgeworICBtX3NQcml2YXRlUGFyYW0uZHdGbGFncyB8PSBkd0ZsYWdzOwogfQogCi1GWF9CT09MIENQV0xfV25kOjpIYXNGbGFnKEZYX0RXT1JEIGR3RmxhZ3MpIGNvbnN0Ci17Ci0JcmV0dXJuIChtX3NQcml2YXRlUGFyYW0uZHdGbGFncyAmIGR3RmxhZ3MpICE9IDA7CitDUFdMX0NvbG9yIENQV0xfV25kOjpHZXRCYWNrZ3JvdW5kQ29sb3IoKSBjb25zdCB7CisgIHJldHVybiBtX3NQcml2YXRlUGFyYW0uc0JhY2tncm91bmRDb2xvcjsKIH0KIAotdm9pZCBDUFdMX1duZDo6UmVtb3ZlRmxhZyhGWF9EV09SRCBkd0ZsYWdzKQotewotCW1fc1ByaXZhdGVQYXJhbS5kd0ZsYWdzICY9IH5kd0ZsYWdzOwordm9pZCBDUFdMX1duZDo6U2V0QmFja2dyb3VuZENvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKSB7CisgIG1fc1ByaXZhdGVQYXJhbS5zQmFja2dyb3VuZENvbG9yID0gY29sb3I7CiB9CiAKLXZvaWQgQ1BXTF9XbmQ6OkFkZEZsYWcoRlhfRFdPUkQgZHdGbGFncykKLXsKLQltX3NQcml2YXRlUGFyYW0uZHdGbGFncyB8PSBkd0ZsYWdzOwordm9pZCBDUFdMX1duZDo6U2V0VGV4dENvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKSB7CisgIG1fc1ByaXZhdGVQYXJhbS5zVGV4dENvbG9yID0gY29sb3I7CiB9CiAKLUNQV0xfQ29sb3IgQ1BXTF9XbmQ6OkdldEJhY2tncm91bmRDb2xvcigpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5zQmFja2dyb3VuZENvbG9yOwordm9pZCBDUFdMX1duZDo6U2V0VGV4dFN0cm9rZUNvbG9yKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKSB7CisgIG1fc1ByaXZhdGVQYXJhbS5zVGV4dFN0cm9rZUNvbG9yID0gY29sb3I7CiB9CiAKLXZvaWQgQ1BXTF9XbmQ6OlNldEJhY2tncm91bmRDb2xvcihjb25zdCBDUFdMX0NvbG9yICYgY29sb3IpCi17Ci0JbV9zUHJpdmF0ZVBhcmFtLnNCYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcjsKK0NQV0xfQ29sb3IgQ1BXTF9XbmQ6OkdldFRleHRDb2xvcigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5zVGV4dENvbG9yOwogfQogCi12b2lkIENQV0xfV25kOjpTZXRUZXh0Q29sb3IoY29uc3QgQ1BXTF9Db2xvciAmIGNvbG9yKQotewotCW1fc1ByaXZhdGVQYXJhbS5zVGV4dENvbG9yID0gY29sb3I7CitDUFdMX0NvbG9yIENQV0xfV25kOjpHZXRUZXh0U3Ryb2tlQ29sb3IoKSBjb25zdCB7CisgIHJldHVybiBtX3NQcml2YXRlUGFyYW0uc1RleHRTdHJva2VDb2xvcjsKIH0KIAotdm9pZCBDUFdMX1duZDo6U2V0VGV4dFN0cm9rZUNvbG9yKGNvbnN0IENQV0xfQ29sb3IgJiBjb2xvcikKLXsKLQltX3NQcml2YXRlUGFyYW0uc1RleHRTdHJva2VDb2xvciA9IGNvbG9yOworaW50MzJfdCBDUFdMX1duZDo6R2V0Qm9yZGVyU3R5bGUoKSBjb25zdCB7CisgIHJldHVybiBtX3NQcml2YXRlUGFyYW0ubkJvcmRlclN0eWxlOwogfQogCi1DUFdMX0NvbG9yIENQV0xfV25kOjpHZXRUZXh0Q29sb3IoKSBjb25zdAotewotCXJldHVybiBtX3NQcml2YXRlUGFyYW0uc1RleHRDb2xvcjsKK3ZvaWQgQ1BXTF9XbmQ6OlNldEJvcmRlclN0eWxlKGludDMyX3QgbkJvcmRlclN0eWxlKSB7CisgIGlmIChIYXNGbGFnKFBXU19CT1JERVIpKQorICAgIG1fc1ByaXZhdGVQYXJhbS5uQm9yZGVyU3R5bGUgPSBuQm9yZGVyU3R5bGU7CiB9CiAKLUNQV0xfQ29sb3IgQ1BXTF9XbmQ6OkdldFRleHRTdHJva2VDb2xvcigpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5zVGV4dFN0cm9rZUNvbG9yOwotfQoraW50MzJfdCBDUFdMX1duZDo6R2V0Qm9yZGVyV2lkdGgoKSBjb25zdCB7CisgIGlmIChIYXNGbGFnKFBXU19CT1JERVIpKQorICAgIHJldHVybiBtX3NQcml2YXRlUGFyYW0uZHdCb3JkZXJXaWR0aDsKIAotRlhfSU5UMzIgQ1BXTF9XbmQ6OkdldEJvcmRlclN0eWxlKCkgY29uc3QKLXsKLQlyZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLm5Cb3JkZXJTdHlsZTsKKyAgcmV0dXJuIDA7CiB9CiAKLXZvaWQgQ1BXTF9XbmQ6OlNldEJvcmRlclN0eWxlKEZYX0lOVDMyIG5Cb3JkZXJTdHlsZSkKLXsKLQlpZiAoSGFzRmxhZyhQV1NfQk9SREVSKSkKLQkJbV9zUHJpdmF0ZVBhcmFtLm5Cb3JkZXJTdHlsZSA9IG5Cb3JkZXJTdHlsZTsKK2ludDMyX3QgQ1BXTF9XbmQ6OkdldElubmVyQm9yZGVyV2lkdGgoKSBjb25zdCB7CisgIHJldHVybiAwOwogfQogCi1GWF9JTlQzMiBDUFdMX1duZDo6R2V0Qm9yZGVyV2lkdGgoKSBjb25zdAotewotCWlmIChIYXNGbGFnKFBXU19CT1JERVIpKQotCQlyZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLmR3Qm9yZGVyV2lkdGg7CitDUFdMX0NvbG9yIENQV0xfV25kOjpHZXRCb3JkZXJDb2xvcigpIGNvbnN0IHsKKyAgaWYgKEhhc0ZsYWcoUFdTX0JPUkRFUikpCisgICAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5zQm9yZGVyQ29sb3I7CiAKLQlyZXR1cm4gMDsKKyAgcmV0dXJuIENQV0xfQ29sb3IoKTsKIH0KIAotRlhfSU5UMzIgQ1BXTF9XbmQ6OkdldElubmVyQm9yZGVyV2lkdGgoKSBjb25zdAotewotCS8qCi0Jc3dpdGNoIChHZXRCb3JkZXJTdHlsZSgpKQotCXsKLQljYXNlIFBCU19CRVZFTEVEOgotCWNhc2UgUEJTX0lOU0VUOgotCQlyZXR1cm4gR2V0Qm9yZGVyV2lkdGgoKSAvIDI7Ci0JfQotCSovCi0JcmV0dXJuIDA7Citjb25zdCBDUFdMX0Rhc2gmIENQV0xfV25kOjpHZXRCb3JkZXJEYXNoKCkgY29uc3QgeworICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLnNEYXNoOwogfQogCi12b2lkIENQV0xfV25kOjpTZXRCb3JkZXJXaWR0aChGWF9JTlQzMiBuQm9yZGVyV2lkdGgpCi17Ci0JaWYgKEhhc0ZsYWcoUFdTX0JPUkRFUikpCi0JCW1fc1ByaXZhdGVQYXJhbS5kd0JvcmRlcldpZHRoID0gbkJvcmRlcldpZHRoOwordm9pZCogQ1BXTF9XbmQ6OkdldEF0dGFjaGVkRGF0YSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5wQXR0YWNoZWREYXRhOwogfQogCi1DUFdMX0NvbG9yIENQV0xfV25kOjpHZXRCb3JkZXJDb2xvcigpIGNvbnN0Ci17Ci0JaWYgKEhhc0ZsYWcoUFdTX0JPUkRFUikpCi0JCXJldHVybiBtX3NQcml2YXRlUGFyYW0uc0JvcmRlckNvbG9yOworQ1BXTF9TY3JvbGxCYXIqIENQV0xfV25kOjpHZXRWU2Nyb2xsQmFyKCkgY29uc3QgeworICBpZiAoSGFzRmxhZyhQV1NfVlNDUk9MTCkpCisgICAgcmV0dXJuIG1fcFZTY3JvbGxCYXI7CiAKLQlyZXR1cm4gQ1BXTF9Db2xvcigpOworICByZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBDUFdMX1duZDo6U2V0Qm9yZGVyQ29sb3IoY29uc3QgQ1BXTF9Db2xvciAmIGNvbG9yKQotewotCWlmIChIYXNGbGFnKFBXU19CT1JERVIpKQotCQltX3NQcml2YXRlUGFyYW0uc0JvcmRlckNvbG9yID0gY29sb3I7Cit2b2lkIENQV0xfV25kOjpDcmVhdGVTY3JvbGxCYXIoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCkgeworICBDcmVhdGVWU2Nyb2xsQmFyKGNwKTsKIH0KIAotQ1BXTF9EYXNoIENQV0xfV25kOjpHZXRCb3JkZXJEYXNoKCkgY29uc3QKLXsKLQlyZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLnNEYXNoOwotfQordm9pZCBDUFdMX1duZDo6Q3JlYXRlVlNjcm9sbEJhcihjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKSB7CisgIGlmICghbV9wVlNjcm9sbEJhciAmJiBIYXNGbGFnKFBXU19WU0NST0xMKSkgeworICAgIFBXTF9DUkVBVEVQQVJBTSBzY3AgPSBjcDsKIAotdm9pZCogQ1BXTF9XbmQ6OkdldEF0dGFjaGVkRGF0YSgpIGNvbnN0Ci17Ci0JcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5wQXR0YWNoZWREYXRhOwotfQorICAgIC8vIGZsYWdzCisgICAgc2NwLmR3RmxhZ3MgPQorICAgICAgICBQV1NfQ0hJTEQgfCBQV1NfQkFDS0dST1VORCB8IFBXU19BVVRPVFJBTlNQQVJFTlQgfCBQV1NfTk9SRUZSRVNIQ0xJUDsKIAotdm9pZCBDUFdMX1duZDo6U2V0Qm9yZGVyRGFzaChjb25zdCBDUFdMX0Rhc2ggJiBzRGFzaCkKLXsKLQlpZiAoSGFzRmxhZyhQV1NfQk9SREVSKSkKLQkJbV9zUHJpdmF0ZVBhcmFtLnNEYXNoID0gc0Rhc2g7Ci19CisgICAgc2NwLnBQYXJlbnRXbmQgPSB0aGlzOworICAgIHNjcC5zQmFja2dyb3VuZENvbG9yID0gUFdMX0RFRkFVTFRfV0hJVEVDT0xPUjsKKyAgICBzY3AuZUN1cnNvclR5cGUgPSBGWENUX0FSUk9XOworICAgIHNjcC5uVHJhbnNwYXJlbmN5ID0gUFdMX1NDUk9MTEJBUl9UUkFOU1BBUkFOQ1k7CiAKLUNQV0xfU2Nyb2xsQmFyKiBDUFdMX1duZDo6R2V0VlNjcm9sbEJhcigpIGNvbnN0Ci17Ci0JaWYgKEhhc0ZsYWcoUFdTX1ZTQ1JPTEwpKQotCQlyZXR1cm4gbV9wVlNjcm9sbEJhcjsKLQotCXJldHVybiBOVUxMOworICAgIG1fcFZTY3JvbGxCYXIgPSBuZXcgQ1BXTF9TY3JvbGxCYXIoU0JUX1ZTQ1JPTEwpOworICAgIG1fcFZTY3JvbGxCYXItPkNyZWF0ZShzY3ApOworICB9CiB9CiAKLXZvaWQgQ1BXTF9XbmQ6OkNyZWF0ZVNjcm9sbEJhcihjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCkKLXsKLQlDcmVhdGVWU2Nyb2xsQmFyKGNwKTsKK3ZvaWQgQ1BXTF9XbmQ6OlNldENhcHR1cmUoKSB7CisgIGlmIChDUFdMX01zZ0NvbnRyb2wqIHBNc2dDdHJsID0gR2V0TXNnQ29udHJvbCgpKQorICAgIHBNc2dDdHJsLT5TZXRDYXB0dXJlKHRoaXMpOwogfQogCi12b2lkIENQV0xfV25kOjpDcmVhdGVWU2Nyb2xsQmFyKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSAmIGNwKQotewotCWlmICghbV9wVlNjcm9sbEJhciAmJiBIYXNGbGFnKFBXU19WU0NST0xMKSkKLQl7Ci0JCVBXTF9DUkVBVEVQQVJBTSBzY3AgPSBjcDsKK3ZvaWQgQ1BXTF9XbmQ6OlJlbGVhc2VDYXB0dXJlKCkgeworICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9hQ2hpbGRyZW4uR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKKyAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKQorICAgICAgcENoaWxkLT5SZWxlYXNlQ2FwdHVyZSgpOwogCi0JCS8vZmxhZ3MKLQkJc2NwLmR3RmxhZ3MgPSBQV1NfQ0hJTER8IFBXU19CQUNLR1JPVU5EIHwgUFdTX0FVVE9UUkFOU1BBUkVOVCB8IFBXU19OT1JFRlJFU0hDTElQOwotCQkKLQkJc2NwLnBQYXJlbnRXbmQgPSB0aGlzOwotCQlzY3Auc0JhY2tncm91bmRDb2xvciA9IFBXTF9ERUZBVUxUX1dISVRFQ09MT1I7Ci0JCXNjcC5lQ3Vyc29yVHlwZSA9IEZYQ1RfQVJST1c7Ci0JCXNjcC5uVHJhbnNwYXJlbmN5ID0gUFdMX1NDUk9MTEJBUl9UUkFOU1BBUkFOQ1k7Ci0KLQkJaWYgKChtX3BWU2Nyb2xsQmFyID0gbmV3IENQV0xfU2Nyb2xsQmFyKFNCVF9WU0NST0xMKSkpCi0JCQltX3BWU2Nyb2xsQmFyLT5DcmVhdGUoc2NwKTsKLQl9CisgIGlmIChDUFdMX01zZ0NvbnRyb2wqIHBNc2dDdHJsID0gR2V0TXNnQ29udHJvbCgpKQorICAgIHBNc2dDdHJsLT5SZWxlYXNlQ2FwdHVyZSgpOwogfQogCi12b2lkIENQV0xfV25kOjpTZXRDYXB0dXJlKCkKLXsKLQlpZiAoQ1BXTF9Nc2dDb250cm9sICogcE1zZ0N0cmwgPSBHZXRNc2dDb250cm9sKCkpCi0JCXBNc2dDdHJsLT5TZXRDYXB0dXJlKHRoaXMpOwordm9pZCBDUFdMX1duZDo6U2V0Rm9jdXMoKSB7CisgIGlmIChDUFdMX01zZ0NvbnRyb2wqIHBNc2dDdHJsID0gR2V0TXNnQ29udHJvbCgpKSB7CisgICAgaWYgKCFwTXNnQ3RybC0+SXNNYWluQ2FwdHVyZUtleWJvYXJkKHRoaXMpKQorICAgICAgcE1zZ0N0cmwtPktpbGxGb2N1cygpOworICAgIHBNc2dDdHJsLT5TZXRGb2N1cyh0aGlzKTsKKyAgfQogfQogCi12b2lkIENQV0xfV25kOjpSZWxlYXNlQ2FwdHVyZSgpCi17Ci0JZm9yIChGWF9JTlQzMiBpPTAsc3o9bV9hQ2hpbGRyZW4uR2V0U2l6ZSgpOyBpPHN6OyBpKyspCi0JCWlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpCi0JCQlwQ2hpbGQtPlJlbGVhc2VDYXB0dXJlKCk7Ci0KLQlpZiAoQ1BXTF9Nc2dDb250cm9sICogcE1zZ0N0cmwgPSBHZXRNc2dDb250cm9sKCkpCi0JCXBNc2dDdHJsLT5SZWxlYXNlQ2FwdHVyZSgpOwordm9pZCBDUFdMX1duZDo6S2lsbEZvY3VzKCkgeworICBpZiAoQ1BXTF9Nc2dDb250cm9sKiBwTXNnQ3RybCA9IEdldE1zZ0NvbnRyb2woKSkgeworICAgIGlmIChwTXNnQ3RybC0+SXNXbmRDYXB0dXJlS2V5Ym9hcmQodGhpcykpCisgICAgICBwTXNnQ3RybC0+S2lsbEZvY3VzKCk7CisgIH0KIH0KIAotdm9pZCBDUFdMX1duZDo6U2V0Rm9jdXMoKQotewotCWlmIChDUFdMX01zZ0NvbnRyb2wgKiBwTXNnQ3RybCA9IEdldE1zZ0NvbnRyb2woKSkKLQl7Ci0JCWlmICghcE1zZ0N0cmwtPklzTWFpbkNhcHR1cmVLZXlib2FyZCh0aGlzKSkKLQkJCXBNc2dDdHJsLT5LaWxsRm9jdXMoKTsKLQkJcE1zZ0N0cmwtPlNldEZvY3VzKHRoaXMpOwotCX0KLX0KLQotdm9pZCBDUFdMX1duZDo6S2lsbEZvY3VzKCkKLXsKLQlpZiAoQ1BXTF9Nc2dDb250cm9sICogcE1zZ0N0cmwgPSBHZXRNc2dDb250cm9sKCkpCi0JewotCQlpZiAocE1zZ0N0cmwtPklzV25kQ2FwdHVyZUtleWJvYXJkKHRoaXMpKQotCQkJcE1zZ0N0cmwtPktpbGxGb2N1cygpOwotCX0KLX0KK3ZvaWQgQ1BXTF9XbmQ6Ok9uU2V0Rm9jdXMoKSB7fQogCi12b2lkIENQV0xfV25kOjpPblNldEZvY3VzKCkKLXsKLX0KK3ZvaWQgQ1BXTF9XbmQ6Ok9uS2lsbEZvY3VzKCkge30KIAotdm9pZCBDUFdMX1duZDo6T25LaWxsRm9jdXMoKQoteworRlhfQk9PTCBDUFdMX1duZDo6V25kSGl0VGVzdChjb25zdCBDUERGX1BvaW50JiBwb2ludCkgY29uc3QgeworICByZXR1cm4gSXNWYWxpZCgpICYmIElzVmlzaWJsZSgpICYmIEdldFdpbmRvd1JlY3QoKS5Db250YWlucyhwb2ludC54LCBwb2ludC55KTsKIH0KIAotRlhfQk9PTAlDUFdMX1duZDo6V25kSGl0VGVzdChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpIGNvbnN0Ci17Ci0JcmV0dXJuIElzVmFsaWQoKSAmJiBJc1Zpc2libGUoKSAmJiBHZXRXaW5kb3dSZWN0KCkuQ29udGFpbnMocG9pbnQueCxwb2ludC55KTsKK0ZYX0JPT0wgQ1BXTF9XbmQ6OkNsaWVudEhpdFRlc3QoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0IHsKKyAgcmV0dXJuIElzVmFsaWQoKSAmJiBJc1Zpc2libGUoKSAmJiBHZXRDbGllbnRSZWN0KCkuQ29udGFpbnMocG9pbnQueCwgcG9pbnQueSk7CiB9CiAKLUZYX0JPT0wgQ1BXTF9XbmQ6OkNsaWVudEhpdFRlc3QoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50KSBjb25zdAotewotCXJldHVybiBJc1ZhbGlkKCkgJiYgSXNWaXNpYmxlKCkgJiYgR2V0Q2xpZW50UmVjdCgpLkNvbnRhaW5zKHBvaW50LngscG9pbnQueSk7Ci19Citjb25zdCBDUFdMX1duZCogQ1BXTF9XbmQ6OkdldFJvb3RXbmQoKSBjb25zdCB7CisgIGlmIChtX3NQcml2YXRlUGFyYW0ucFBhcmVudFduZCkKKyAgICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLnBQYXJlbnRXbmQtPkdldFJvb3RXbmQoKTsKIAotY29uc3QgQ1BXTF9XbmQgKiBDUFdMX1duZDo6R2V0Um9vdFduZCgpIGNvbnN0Ci17Ci0JaWYgKG1fc1ByaXZhdGVQYXJhbS5wUGFyZW50V25kKQotCQlyZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLnBQYXJlbnRXbmQtPkdldFJvb3RXbmQoKTsKLQllbHNlCi0JCXJldHVybiB0aGlzOworICByZXR1cm4gdGhpczsKIH0KIAotdm9pZCBDUFdMX1duZDo6U2V0VmlzaWJsZShGWF9CT09MIGJWaXNpYmxlKQotewotCWlmIChJc1ZhbGlkKCkpCi0JewotCQlmb3IgKEZYX0lOVDMyIGk9MCxzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQkJewotCQkJaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkKLQkJCXsKLQkJCQlwQ2hpbGQtPlNldFZpc2libGUoYlZpc2libGUpOwotCQkJfQotCQl9Cit2b2lkIENQV0xfV25kOjpTZXRWaXNpYmxlKEZYX0JPT0wgYlZpc2libGUpIHsKKyAgaWYgKElzVmFsaWQoKSkgeworICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FDaGlsZHJlbi5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKSB7CisgICAgICAgIHBDaGlsZC0+U2V0VmlzaWJsZShiVmlzaWJsZSk7CisgICAgICB9CisgICAgfQogCi0JCWlmIChiVmlzaWJsZSAhPSBtX2JWaXNpYmxlKQotCQl7Ci0JCQltX2JWaXNpYmxlID0gYlZpc2libGU7Ci0JCQlSZVBvc0NoaWxkV25kKCk7CQkKLQkJCUludmFsaWRhdGVSZWN0KCk7Ci0JCX0JCi0JfQorICAgIGlmIChiVmlzaWJsZSAhPSBtX2JWaXNpYmxlKSB7CisgICAgICBtX2JWaXNpYmxlID0gYlZpc2libGU7CisgICAgICBSZVBvc0NoaWxkV25kKCk7CisgICAgICBJbnZhbGlkYXRlUmVjdCgpOworICAgIH0KKyAgfQogfQogCi12b2lkIENQV0xfV25kOjpTZXRDbGlwUmVjdChjb25zdCBDUERGX1JlY3QgJiByZWN0KQotewotCW1fcmNDbGlwID0gcmVjdDsKLQltX3JjQ2xpcC5Ob3JtYWxpemUoKTsKK3ZvaWQgQ1BXTF9XbmQ6OlNldENsaXBSZWN0KGNvbnN0IENQREZfUmVjdCYgcmVjdCkgeworICBtX3JjQ2xpcCA9IHJlY3Q7CisgIG1fcmNDbGlwLk5vcm1hbGl6ZSgpOwogfQogCi1DUERGX1JlY3QgQ1BXTF9XbmQ6OkdldENsaXBSZWN0KCkgY29uc3QKLXsKLQlyZXR1cm4gbV9yY0NsaXA7Citjb25zdCBDUERGX1JlY3QmIENQV0xfV25kOjpHZXRDbGlwUmVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcmNDbGlwOwogfQogCi1GWF9CT09MCUNQV0xfV25kOjpJc1JlYWRPbmx5KCkgY29uc3QKLXsKLQlyZXR1cm4gSGFzRmxhZyhQV1NfUkVBRE9OTFkpOworRlhfQk9PTCBDUFdMX1duZDo6SXNSZWFkT25seSgpIGNvbnN0IHsKKyAgcmV0dXJuIEhhc0ZsYWcoUFdTX1JFQURPTkxZKTsKIH0KIAotdm9pZCBDUFdMX1duZDo6UmVQb3NDaGlsZFduZCgpCi17Ci0JQ1BERl9SZWN0IHJjQ29udGVudCA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KEdldFdpbmRvd1JlY3QoKSwoRlhfRkxPQVQpKEdldEJvcmRlcldpZHRoKCkrR2V0SW5uZXJCb3JkZXJXaWR0aCgpKSk7Cit2b2lkIENQV0xfV25kOjpSZVBvc0NoaWxkV25kKCkgeworICBDUERGX1JlY3QgcmNDb250ZW50ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QoCisgICAgICBHZXRXaW5kb3dSZWN0KCksIChGWF9GTE9BVCkoR2V0Qm9yZGVyV2lkdGgoKSArIEdldElubmVyQm9yZGVyV2lkdGgoKSkpOwogCi0JQ1BXTF9TY3JvbGxCYXIgKiBwVlNCID0gdGhpcy0+R2V0VlNjcm9sbEJhcigpOworICBDUFdMX1Njcm9sbEJhciogcFZTQiA9IEdldFZTY3JvbGxCYXIoKTsKIAotCUNQREZfUmVjdCByY1ZTY3JvbGwgPSBDUERGX1JlY3QocmNDb250ZW50LnJpZ2h0IC0gUFdMX1NDUk9MTEJBUl9XSURUSCwKLQkJCQkJCQlyY0NvbnRlbnQuYm90dG9tLAotCQkJCQkJCXJjQ29udGVudC5yaWdodC0xLjBmLAotCQkJCQkJCXJjQ29udGVudC50b3ApOworICBDUERGX1JlY3QgcmNWU2Nyb2xsID0KKyAgICAgIENQREZfUmVjdChyY0NvbnRlbnQucmlnaHQgLSBQV0xfU0NST0xMQkFSX1dJRFRILCByY0NvbnRlbnQuYm90dG9tLAorICAgICAgICAgICAgICAgIHJjQ29udGVudC5yaWdodCAtIDEuMGYsIHJjQ29udGVudC50b3ApOwogCi0JaWYgKHBWU0IpIHBWU0ItPk1vdmUocmNWU2Nyb2xsLFRSVUUsRkFMU0UpOworICBpZiAocFZTQikKKyAgICBwVlNCLT5Nb3ZlKHJjVlNjcm9sbCwgVFJVRSwgRkFMU0UpOwogfQogCi12b2lkIENQV0xfV25kOjpDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0gJiBjcCkKLXsKLX0KK3ZvaWQgQ1BXTF9XbmQ6OkNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApIHt9CiAKLXZvaWQgQ1BXTF9XbmQ6OlNldEN1cnNvcigpCi17Ci0JaWYgKElzVmFsaWQoKSkgCi0JewotCQlpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTSCA9IEdldFN5c3RlbUhhbmRsZXIoKSkKLQkJewotCQkJRlhfSU5UMzIgbkN1cnNvclR5cGUgPSB0aGlzLT5HZXRDcmVhdGlvblBhcmFtKCkuZUN1cnNvclR5cGU7Ci0JCQlwU0gtPlNldEN1cnNvcihuQ3Vyc29yVHlwZSk7Ci0JCX0KLQl9Cit2b2lkIENQV0xfV25kOjpTZXRDdXJzb3IoKSB7CisgIGlmIChJc1ZhbGlkKCkpIHsKKyAgICBpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTSCA9IEdldFN5c3RlbUhhbmRsZXIoKSkgeworICAgICAgaW50MzJfdCBuQ3Vyc29yVHlwZSA9IEdldENyZWF0aW9uUGFyYW0oKS5lQ3Vyc29yVHlwZTsKKyAgICAgIHBTSC0+U2V0Q3Vyc29yKG5DdXJzb3JUeXBlKTsKKyAgICB9CisgIH0KIH0KIAotdm9pZCBDUFdMX1duZDo6Q3JlYXRlTXNnQ29udHJvbCgpCi17Ci0JaWYgKCFtX3NQcml2YXRlUGFyYW0ucE1zZ0NvbnRyb2wpCi0JCW1fc1ByaXZhdGVQYXJhbS5wTXNnQ29udHJvbCA9IG5ldyBDUFdMX01zZ0NvbnRyb2wodGhpcyk7Cit2b2lkIENQV0xfV25kOjpDcmVhdGVNc2dDb250cm9sKCkgeworICBpZiAoIW1fc1ByaXZhdGVQYXJhbS5wTXNnQ29udHJvbCkKKyAgICBtX3NQcml2YXRlUGFyYW0ucE1zZ0NvbnRyb2wgPSBuZXcgQ1BXTF9Nc2dDb250cm9sKHRoaXMpOwogfQogCi12b2lkIENQV0xfV25kOjpEZXN0cm95TXNnQ29udHJvbCgpCi17Ci0JaWYgKENQV0xfTXNnQ29udHJvbCogcE1zZ0NvbnRyb2wgPSBHZXRNc2dDb250cm9sKCkpCi0JCWlmIChwTXNnQ29udHJvbC0+SXNXbmRDcmVhdGVkKHRoaXMpKQotCQkJZGVsZXRlIHBNc2dDb250cm9sOwordm9pZCBDUFdMX1duZDo6RGVzdHJveU1zZ0NvbnRyb2woKSB7CisgIGlmIChDUFdMX01zZ0NvbnRyb2wqIHBNc2dDb250cm9sID0gR2V0TXNnQ29udHJvbCgpKQorICAgIGlmIChwTXNnQ29udHJvbC0+SXNXbmRDcmVhdGVkKHRoaXMpKQorICAgICAgZGVsZXRlIHBNc2dDb250cm9sOwogfQogCi1DUFdMX01zZ0NvbnRyb2wqIENQV0xfV25kOjpHZXRNc2dDb250cm9sKCkgY29uc3QKLXsKLQlyZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLnBNc2dDb250cm9sOworQ1BXTF9Nc2dDb250cm9sKiBDUFdMX1duZDo6R2V0TXNnQ29udHJvbCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5wTXNnQ29udHJvbDsKIH0KIAotRlhfQk9PTCBDUFdMX1duZDo6SXNDYXB0dXJlTW91c2UoKSBjb25zdAotewotCXJldHVybiBJc1duZENhcHR1cmVNb3VzZSh0aGlzKTsKK0ZYX0JPT0wgQ1BXTF9XbmQ6OklzQ2FwdHVyZU1vdXNlKCkgY29uc3QgeworICByZXR1cm4gSXNXbmRDYXB0dXJlTW91c2UodGhpcyk7CiB9CiAKLUZYX0JPT0wgQ1BXTF9XbmQ6OklzV25kQ2FwdHVyZU1vdXNlKGNvbnN0IENQV0xfV25kICogcFduZCkgY29uc3QKLXsKLQlpZiAoQ1BXTF9Nc2dDb250cm9sICogcEN0cmwgPSBHZXRNc2dDb250cm9sKCkpCi0JCXJldHVybiBwQ3RybC0+SXNXbmRDYXB0dXJlTW91c2UocFduZCk7CitGWF9CT09MIENQV0xfV25kOjpJc1duZENhcHR1cmVNb3VzZShjb25zdCBDUFdMX1duZCogcFduZCkgY29uc3QgeworICBpZiAoQ1BXTF9Nc2dDb250cm9sKiBwQ3RybCA9IEdldE1zZ0NvbnRyb2woKSkKKyAgICByZXR1cm4gcEN0cmwtPklzV25kQ2FwdHVyZU1vdXNlKHBXbmQpOwogCi0JcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgQ1BXTF9XbmQ6OklzV25kQ2FwdHVyZUtleWJvYXJkKGNvbnN0IENQV0xfV25kICogcFduZCkgY29uc3QKLXsKLQlpZiAoQ1BXTF9Nc2dDb250cm9sICogcEN0cmwgPSBHZXRNc2dDb250cm9sKCkpCi0JCXJldHVybiBwQ3RybC0+SXNXbmRDYXB0dXJlS2V5Ym9hcmQocFduZCk7CitGWF9CT09MIENQV0xfV25kOjpJc1duZENhcHR1cmVLZXlib2FyZChjb25zdCBDUFdMX1duZCogcFduZCkgY29uc3QgeworICBpZiAoQ1BXTF9Nc2dDb250cm9sKiBwQ3RybCA9IEdldE1zZ0NvbnRyb2woKSkKKyAgICByZXR1cm4gcEN0cmwtPklzV25kQ2FwdHVyZUtleWJvYXJkKHBXbmQpOwogCi0JcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9CiAKLUZYX0JPT0wgQ1BXTF9XbmQ6OklzRm9jdXNlZCgpIGNvbnN0Ci17Ci0JaWYgKENQV0xfTXNnQ29udHJvbCAqIHBDdHJsID0gR2V0TXNnQ29udHJvbCgpKQotCQlyZXR1cm4gcEN0cmwtPklzTWFpbkNhcHR1cmVLZXlib2FyZCh0aGlzKTsKK0ZYX0JPT0wgQ1BXTF9XbmQ6OklzRm9jdXNlZCgpIGNvbnN0IHsKKyAgaWYgKENQV0xfTXNnQ29udHJvbCogcEN0cmwgPSBHZXRNc2dDb250cm9sKCkpCisgICAgcmV0dXJuIHBDdHJsLT5Jc01haW5DYXB0dXJlS2V5Ym9hcmQodGhpcyk7CiAKLQlyZXR1cm4gRkFMU0U7CisgIHJldHVybiBGQUxTRTsKIH0KIAotQ1BERl9SZWN0IENQV0xfV25kOjpHZXRGb2N1c1JlY3QoKSBjb25zdAotewotCXJldHVybiBDUFdMX1V0aWxzOjpJbmZsYXRlUmVjdCh0aGlzLT5HZXRXaW5kb3dSZWN0KCksMSk7CitDUERGX1JlY3QgQ1BXTF9XbmQ6OkdldEZvY3VzUmVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIENQV0xfVXRpbHM6OkluZmxhdGVSZWN0KEdldFdpbmRvd1JlY3QoKSwgMSk7CiB9CiAKLUZYX0ZMT0FUIENQV0xfV25kOjpHZXRGb250U2l6ZSgpIGNvbnN0Ci17Ci0JcmV0dXJuIHRoaXMtPm1fc1ByaXZhdGVQYXJhbS5mRm9udFNpemU7CitGWF9GTE9BVCBDUFdMX1duZDo6R2V0Rm9udFNpemUoKSBjb25zdCB7CisgIHJldHVybiBtX3NQcml2YXRlUGFyYW0uZkZvbnRTaXplOwogfQogCi12b2lkIENQV0xfV25kOjpTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpCi17Ci0JdGhpcy0+bV9zUHJpdmF0ZVBhcmFtLmZGb250U2l6ZSA9IGZGb250U2l6ZTsKK3ZvaWQgQ1BXTF9XbmQ6OlNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgeworICBtX3NQcml2YXRlUGFyYW0uZkZvbnRTaXplID0gZkZvbnRTaXplOwogfQogCi1JRlhfU3lzdGVtSGFuZGxlciogQ1BXTF9XbmQ6OkdldFN5c3RlbUhhbmRsZXIoKSBjb25zdAotewotCXJldHVybiBtX3NQcml2YXRlUGFyYW0ucFN5c3RlbUhhbmRsZXI7CitJRlhfU3lzdGVtSGFuZGxlciogQ1BXTF9XbmQ6OkdldFN5c3RlbUhhbmRsZXIoKSBjb25zdCB7CisgIHJldHVybiBtX3NQcml2YXRlUGFyYW0ucFN5c3RlbUhhbmRsZXI7CiB9CiAKLUlQV0xfRm9jdXNIYW5kbGVyKiBDUFdMX1duZDo6R2V0Rm9jdXNIYW5kbGVyKCkgY29uc3QKLXsKLQlyZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLnBGb2N1c0hhbmRsZXI7CitJUFdMX0ZvY3VzSGFuZGxlciogQ1BXTF9XbmQ6OkdldEZvY3VzSGFuZGxlcigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5wRm9jdXNIYW5kbGVyOwogfQogCi1JUFdMX1Byb3ZpZGVyKiBDUFdMX1duZDo6R2V0UHJvdmlkZXIoKSBjb25zdAotewotCXJldHVybiBtX3NQcml2YXRlUGFyYW0ucFByb3ZpZGVyOworSVBXTF9Qcm92aWRlciogQ1BXTF9XbmQ6OkdldFByb3ZpZGVyKCkgY29uc3QgeworICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLnBQcm92aWRlcjsKIH0KIAotSUZYX0VkaXRfRm9udE1hcCogQ1BXTF9XbmQ6OkdldEZvbnRNYXAoKSBjb25zdAotewotCXJldHVybiBtX3NQcml2YXRlUGFyYW0ucEZvbnRNYXA7CitJRlhfRWRpdF9Gb250TWFwKiBDUFdMX1duZDo6R2V0Rm9udE1hcCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5wRm9udE1hcDsKIH0KIAotQ1BXTF9Db2xvciBDUFdMX1duZDo6R2V0Qm9yZGVyTGVmdFRvcENvbG9yKEZYX0lOVDMyIG5Cb3JkZXJTdHlsZSkgY29uc3QKLXsKLQlDUFdMX0NvbG9yIGNvbG9yOworQ1BXTF9Db2xvciBDUFdMX1duZDo6R2V0Qm9yZGVyTGVmdFRvcENvbG9yKGludDMyX3QgbkJvcmRlclN0eWxlKSBjb25zdCB7CisgIENQV0xfQ29sb3IgY29sb3I7CiAKLQlzd2l0Y2ggKG5Cb3JkZXJTdHlsZSkKLQl7Ci0JCWNhc2UgUEJTX1NPTElEOgotCQkJYnJlYWs7Ci0JCWNhc2UgUEJTX0RBU0g6Ci0JCQlicmVhazsKLQkJY2FzZSBQQlNfQkVWRUxFRDoKLQkJCWNvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwxKTsKLQkJCWJyZWFrOwotCQljYXNlIFBCU19JTlNFVDoKLQkJCWNvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwwLjVmKTsKLQkJCWJyZWFrOwotCQljYXNlIFBCU19VTkRFUkxJTkVEOgotCQkJYnJlYWs7Ci0JfQorICBzd2l0Y2ggKG5Cb3JkZXJTdHlsZSkgeworICAgIGNhc2UgUEJTX1NPTElEOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBQQlNfREFTSDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUEJTX0JFVkVMRUQ6CisgICAgICBjb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQQlNfSU5TRVQ6CisgICAgICBjb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDAuNWYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQQlNfVU5ERVJMSU5FRDoKKyAgICAgIGJyZWFrOworICB9CiAKLQlyZXR1cm4gY29sb3I7CisgIHJldHVybiBjb2xvcjsKIH0KIAotQ1BXTF9Db2xvciBDUFdMX1duZDo6R2V0Qm9yZGVyUmlnaHRCb3R0b21Db2xvcihGWF9JTlQzMiBuQm9yZGVyU3R5bGUpIGNvbnN0Ci17Ci0JQ1BXTF9Db2xvciBjb2xvcjsKK0NQV0xfQ29sb3IgQ1BXTF9XbmQ6OkdldEJvcmRlclJpZ2h0Qm90dG9tQ29sb3IoaW50MzJfdCBuQm9yZGVyU3R5bGUpIGNvbnN0IHsKKyAgQ1BXTF9Db2xvciBjb2xvcjsKIAotCXN3aXRjaCAobkJvcmRlclN0eWxlKQotCXsKLQkJY2FzZSBQQlNfU09MSUQ6Ci0JCQlicmVhazsKLQkJY2FzZSBQQlNfREFTSDoKLQkJCWJyZWFrOwotCQljYXNlIFBCU19CRVZFTEVEOgotCQkJY29sb3IgPSBDUFdMX1V0aWxzOjpEZXZpZGVDb2xvcihHZXRCYWNrZ3JvdW5kQ29sb3IoKSwyKTsKLQkJCWJyZWFrOwotCQljYXNlIFBCU19JTlNFVDoKLQkJCWNvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwwLjc1Zik7Ci0JCQlicmVhazsKLQkJY2FzZSBQQlNfVU5ERVJMSU5FRDoKLQkJCWJyZWFrOwotCX0KKyAgc3dpdGNoIChuQm9yZGVyU3R5bGUpIHsKKyAgICBjYXNlIFBCU19TT0xJRDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUEJTX0RBU0g6CisgICAgICBicmVhazsKKyAgICBjYXNlIFBCU19CRVZFTEVEOgorICAgICAgY29sb3IgPSBDUFdMX1V0aWxzOjpEZXZpZGVDb2xvcihHZXRCYWNrZ3JvdW5kQ29sb3IoKSwgMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBCU19JTlNFVDoKKyAgICAgIGNvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMC43NWYpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQQlNfVU5ERVJMSU5FRDoKKyAgICAgIGJyZWFrOworICB9CiAKLQlyZXR1cm4gY29sb3I7CisgIHJldHVybiBjb2xvcjsKIH0KIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotRlhfSU5UMzIgQ1BXTF9XbmQ6OkdldFRyYW5zcGFyZW5jeSgpCi17Ci0JcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5uVHJhbnNwYXJlbmN5OworaW50MzJfdCBDUFdMX1duZDo6R2V0VHJhbnNwYXJlbmN5KCkgeworICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLm5UcmFuc3BhcmVuY3k7CiB9CiAKLXZvaWQgQ1BXTF9XbmQ6OlNldFRyYW5zcGFyZW5jeShGWF9JTlQzMiBuVHJhbnNwYXJlbmN5KQotewotCWZvciAoRlhfSU5UMzIgaT0wLHN6PW1fYUNoaWxkcmVuLkdldFNpemUoKTsgaTxzejsgaSsrKQotCXsKLQkJaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkKLQkJewotCQkJcENoaWxkLT5TZXRUcmFuc3BhcmVuY3koblRyYW5zcGFyZW5jeSk7Ci0JCX0KLQl9Cit2b2lkIENQV0xfV25kOjpTZXRUcmFuc3BhcmVuY3koaW50MzJfdCBuVHJhbnNwYXJlbmN5KSB7CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FDaGlsZHJlbi5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkgeworICAgICAgcENoaWxkLT5TZXRUcmFuc3BhcmVuY3koblRyYW5zcGFyZW5jeSk7CisgICAgfQorICB9CiAKLQltX3NQcml2YXRlUGFyYW0ublRyYW5zcGFyZW5jeSA9IG5UcmFuc3BhcmVuY3k7CisgIG1fc1ByaXZhdGVQYXJhbS5uVHJhbnNwYXJlbmN5ID0gblRyYW5zcGFyZW5jeTsKIH0KIAotQ1BERl9NYXRyaXgJQ1BXTF9XbmQ6OkdldFdpbmRvd01hdHJpeCgpIGNvbnN0Ci17Ci0JQ1BERl9NYXRyaXggbXQgPSB0aGlzLT5HZXRDaGlsZFRvUm9vdCgpOworQ0ZYX01hdHJpeCBDUFdMX1duZDo6R2V0V2luZG93TWF0cml4KCkgY29uc3QgeworICBDRlhfTWF0cml4IG10ID0gR2V0Q2hpbGRUb1Jvb3QoKTsKIAotCWlmIChJUFdMX1Byb3ZpZGVyKiBwUHJvdmlkZXIgPSBHZXRQcm92aWRlcigpKQotCXsKLQkJbXQuQ29uY2F0KHBQcm92aWRlci0+R2V0V2luZG93TWF0cml4KEdldEF0dGFjaGVkRGF0YSgpKSk7Ci0JCXJldHVybiBtdDsKLQl9CisgIGlmIChJUFdMX1Byb3ZpZGVyKiBwUHJvdmlkZXIgPSBHZXRQcm92aWRlcigpKSB7CisgICAgbXQuQ29uY2F0KHBQcm92aWRlci0+R2V0V2luZG93TWF0cml4KEdldEF0dGFjaGVkRGF0YSgpKSk7CisgICAgcmV0dXJuIG10OworICB9CiAKLS8qCi0JaWYgKENSZWFkZXJfQXBwKiBwQXBwID0gQ1BXTF9Nb2R1bGU6OkdldFJlYWRlckFwcCgpKQotCQlpZiAoQ1JlYWRlcl9Eb2N1bWVudCogcERvY3VtZW50ID0gcEFwcC0+R2V0Q3VycmVudERvY3VtZW50KCkpCi0JCQlpZiAoQ1JlYWRlcl9Eb2NWaWV3KiBwRG9jVmlldyA9IHBEb2N1bWVudC0+R2V0Q3VycmVudERvY1ZpZXcoKSkKLQkJCXsKLQkJCQlDUERGX01hdHJpeCBtdFBhZ2VWaWV3OwotCQkJCXBEb2NWaWV3LT5HZXRDdXJyZW50TWF0cml4KG10UGFnZVZpZXcpOwotCQkJCW10LkNvbmNhdChtdFBhZ2VWaWV3KTsKLQkJCQlyZXR1cm4gbXQ7Ci0JCQl9CQkKLQkJCQotKi8KKyAgcmV0dXJuIG10OworfQogCi0JcmV0dXJuIG10Owordm9pZCBDUFdMX1duZDo6UFdMdG9XbmQoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIGludDMyX3QmIHgsIGludDMyX3QmIHkpIGNvbnN0IHsKKyAgQ0ZYX01hdHJpeCBtdCA9IEdldFdpbmRvd01hdHJpeCgpOworICBDUERGX1BvaW50IHB0ID0gcG9pbnQ7CisgIG10LlRyYW5zZm9ybShwdC54LCBwdC55KTsKKyAgeCA9IChpbnQzMl90KShwdC54ICsgMC41KTsKKyAgeSA9IChpbnQzMl90KShwdC55ICsgMC41KTsKIH0KIAotdm9pZCBDUFdMX1duZDo6UFdMdG9XbmQoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQsIEZYX0lOVDMyJiB4LCBGWF9JTlQzMiYgeSkgY29uc3QKLXsKLQlDUERGX01hdHJpeCBtdCA9IEdldFdpbmRvd01hdHJpeCgpOwotCUNQREZfUG9pbnQgcHQgPSBwb2ludDsKLQltdC5UcmFuc2Zvcm0ocHQueCxwdC55KTsKLQl4ID0gKEZYX0lOVDMyKShwdC54KzAuNSk7Ci0JeSA9IChGWF9JTlQzMikocHQueSswLjUpOworRlhfUkVDVCBDUFdMX1duZDo6UFdMdG9XbmQoY29uc3QgQ1BERl9SZWN0JiByZWN0KSBjb25zdCB7CisgIENQREZfUmVjdCByY1RlbXAgPSByZWN0OworICBDRlhfTWF0cml4IG10ID0gR2V0V2luZG93TWF0cml4KCk7CisgIG10LlRyYW5zZm9ybVJlY3QocmNUZW1wKTsKKyAgcmV0dXJuIEZYX1JFQ1QoKGludDMyX3QpKHJjVGVtcC5sZWZ0ICsgMC41KSwgKGludDMyX3QpKHJjVGVtcC5ib3R0b20gKyAwLjUpLAorICAgICAgICAgICAgICAgICAoaW50MzJfdCkocmNUZW1wLnJpZ2h0ICsgMC41KSwgKGludDMyX3QpKHJjVGVtcC50b3AgKyAwLjUpKTsKIH0KIAotRlhfUkVDVCBDUFdMX1duZDo6UFdMdG9XbmQoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkgY29uc3QKLXsKLQlDUERGX1JlY3QgcmNUZW1wID0gcmVjdDsKLQlDUERGX01hdHJpeCBtdCA9IEdldFdpbmRvd01hdHJpeCgpOwotCW10LlRyYW5zZm9ybVJlY3QocmNUZW1wKTsJCi0JcmV0dXJuIEZYX1JFQ1QoKEZYX0lOVDMyKShyY1RlbXAubGVmdCswLjUpLCAoRlhfSU5UMzIpKHJjVGVtcC5ib3R0b20rMC41KSwgKEZYX0lOVDMyKShyY1RlbXAucmlnaHQrMC41KSwgKEZYX0lOVDMyKShyY1RlbXAudG9wKzAuNSkpOworRlhfSFdORCBDUFdMX1duZDo6R2V0QXR0YWNoZWRIV25kKCkgY29uc3QgeworICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLmhBdHRhY2hlZFduZDsKIH0KIAotRlhfSFdORCBDUFdMX1duZDo6R2V0QXR0YWNoZWRIV25kKCkgY29uc3QKLXsKLQlyZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLmhBdHRhY2hlZFduZDsKK0NQREZfUG9pbnQgQ1BXTF9XbmQ6OkNoaWxkVG9QYXJlbnQoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0IHsKKyAgQ0ZYX01hdHJpeCBtdCA9IEdldENoaWxkTWF0cml4KCk7CisgIGlmIChtdC5Jc0lkZW50aXR5KCkpCisgICAgcmV0dXJuIHBvaW50OworCisgIENQREZfUG9pbnQgcHQgPSBwb2ludDsKKyAgbXQuVHJhbnNmb3JtKHB0LngsIHB0LnkpOworICByZXR1cm4gcHQ7CiB9CiAKLUNQREZfUG9pbnQgQ1BXTF9XbmQ6OkNoaWxkVG9QYXJlbnQoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0Ci17Ci0JQ1BERl9NYXRyaXggbXQgPSBHZXRDaGlsZE1hdHJpeCgpOwotCWlmIChtdC5Jc0lkZW50aXR5KCkpCi0JCXJldHVybiBwb2ludDsKLQllbHNlCi0JewotCQlDUERGX1BvaW50IHB0ID0gcG9pbnQ7Ci0JCW10LlRyYW5zZm9ybShwdC54LHB0LnkpOwotCQlyZXR1cm4gcHQ7Ci0JfQotfQorQ1BERl9SZWN0IENQV0xfV25kOjpDaGlsZFRvUGFyZW50KGNvbnN0IENQREZfUmVjdCYgcmVjdCkgY29uc3QgeworICBDRlhfTWF0cml4IG10ID0gR2V0Q2hpbGRNYXRyaXgoKTsKKyAgaWYgKG10LklzSWRlbnRpdHkoKSkKKyAgICByZXR1cm4gcmVjdDsKIAotQ1BERl9SZWN0IENQV0xfV25kOjpDaGlsZFRvUGFyZW50KGNvbnN0IENQREZfUmVjdCYgcmVjdCkgY29uc3QKLXsKLQlDUERGX01hdHJpeCBtdCA9IEdldENoaWxkTWF0cml4KCk7Ci0JaWYgKG10LklzSWRlbnRpdHkoKSkKLQkJcmV0dXJuIHJlY3Q7Ci0JZWxzZQotCXsKLQkJQ1BERl9SZWN0IHJjID0gcmVjdDsKLQkJbXQuVHJhbnNmb3JtUmVjdChyYyk7Ci0JCXJldHVybiByYzsKLQl9CisgIENQREZfUmVjdCByYyA9IHJlY3Q7CisgIG10LlRyYW5zZm9ybVJlY3QocmMpOworICByZXR1cm4gcmM7CiB9CiAKLUNQREZfUG9pbnQgQ1BXTF9XbmQ6OlBhcmVudFRvQ2hpbGQoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0Ci17Ci0JQ1BERl9NYXRyaXggbXQgPSBHZXRDaGlsZE1hdHJpeCgpOwotCWlmIChtdC5Jc0lkZW50aXR5KCkpCi0JCXJldHVybiBwb2ludDsKLQllbHNlCi0JewotCQltdC5TZXRSZXZlcnNlKG10KTsKLQkJQ1BERl9Qb2ludCBwdCA9IHBvaW50OwotCQltdC5UcmFuc2Zvcm0ocHQueCxwdC55KTsKLQkJcmV0dXJuIHB0OwotCX0KLX0KK0NQREZfUG9pbnQgQ1BXTF9XbmQ6OlBhcmVudFRvQ2hpbGQoY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpIGNvbnN0IHsKKyAgQ0ZYX01hdHJpeCBtdCA9IEdldENoaWxkTWF0cml4KCk7CisgIGlmIChtdC5Jc0lkZW50aXR5KCkpCisgICAgcmV0dXJuIHBvaW50OwogCi1DUERGX1JlY3QgQ1BXTF9XbmQ6OlBhcmVudFRvQ2hpbGQoY29uc3QgQ1BERl9SZWN0JiByZWN0KSBjb25zdAotewotCUNQREZfTWF0cml4IG10ID0gR2V0Q2hpbGRNYXRyaXgoKTsKLQlpZiAobXQuSXNJZGVudGl0eSgpKQotCQlyZXR1cm4gcmVjdDsKLQllbHNlCi0JewotCQltdC5TZXRSZXZlcnNlKG10KTsKLQkJQ1BERl9SZWN0IHJjID0gcmVjdDsKLQkJbXQuVHJhbnNmb3JtUmVjdChyYyk7Ci0JCXJldHVybiByYzsKLQl9CisgIG10LlNldFJldmVyc2UobXQpOworICBDUERGX1BvaW50IHB0ID0gcG9pbnQ7CisgIG10LlRyYW5zZm9ybShwdC54LCBwdC55KTsKKyAgcmV0dXJuIHB0OwogfQogCi1DUERGX01hdHJpeCBDUFdMX1duZDo6R2V0Q2hpbGRUb1Jvb3QoKSBjb25zdAotewotCUNQREZfTWF0cml4IG10KDEsMCwwLDEsMCwwKTsKLQkKLQlpZiAoSGFzRmxhZyhQV1NfQ0hJTEQpKQotCXsKLQkJY29uc3QgQ1BXTF9XbmQqIHBQYXJlbnQgPSB0aGlzOwotCQl3aGlsZSAocFBhcmVudCkKLQkJewotCQkJbXQuQ29uY2F0KHBQYXJlbnQtPkdldENoaWxkTWF0cml4KCkpOwotCQkJcFBhcmVudCA9IHBQYXJlbnQtPkdldFBhcmVudFdpbmRvdygpOwotCQl9Ci0JfQorQ1BERl9SZWN0IENQV0xfV25kOjpQYXJlbnRUb0NoaWxkKGNvbnN0IENQREZfUmVjdCYgcmVjdCkgY29uc3QgeworICBDRlhfTWF0cml4IG10ID0gR2V0Q2hpbGRNYXRyaXgoKTsKKyAgaWYgKG10LklzSWRlbnRpdHkoKSkKKyAgICByZXR1cm4gcmVjdDsKIAotCXJldHVybiBtdDsKKyAgbXQuU2V0UmV2ZXJzZShtdCk7CisgIENQREZfUmVjdCByYyA9IHJlY3Q7CisgIG10LlRyYW5zZm9ybVJlY3QocmMpOworICByZXR1cm4gcmM7CiB9CiAKLUNQREZfTWF0cml4IENQV0xfV25kOjpHZXRDaGlsZE1hdHJpeCgpIGNvbnN0Ci17Ci0JaWYgKEhhc0ZsYWcoUFdTX0NISUxEKSkKLQkJcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5tdENoaWxkOworQ0ZYX01hdHJpeCBDUFdMX1duZDo6R2V0Q2hpbGRUb1Jvb3QoKSBjb25zdCB7CisgIENGWF9NYXRyaXggbXQoMSwgMCwgMCwgMSwgMCwgMCk7CisgIGlmIChIYXNGbGFnKFBXU19DSElMRCkpIHsKKyAgICBjb25zdCBDUFdMX1duZCogcFBhcmVudCA9IHRoaXM7CisgICAgd2hpbGUgKHBQYXJlbnQpIHsKKyAgICAgIG10LkNvbmNhdChwUGFyZW50LT5HZXRDaGlsZE1hdHJpeCgpKTsKKyAgICAgIHBQYXJlbnQgPSBwUGFyZW50LT5HZXRQYXJlbnRXaW5kb3coKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG10OworfQorCitDRlhfTWF0cml4IENQV0xfV25kOjpHZXRDaGlsZE1hdHJpeCgpIGNvbnN0IHsKKyAgaWYgKEhhc0ZsYWcoUFdTX0NISUxEKSkKKyAgICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLm10Q2hpbGQ7CiAKLQlyZXR1cm4gQ1BERl9NYXRyaXgoMSwwLDAsMSwwLDApOworICByZXR1cm4gQ0ZYX01hdHJpeCgxLCAwLCAwLCAxLCAwLCAwKTsKIH0KIAotdm9pZCBDUFdMX1duZDo6U2V0Q2hpbGRNYXRyaXgoY29uc3QgQ1BERl9NYXRyaXgmIG10KQotewotCW1fc1ByaXZhdGVQYXJhbS5tdENoaWxkID0gbXQ7Cit2b2lkIENQV0xfV25kOjpTZXRDaGlsZE1hdHJpeChjb25zdCBDRlhfTWF0cml4JiBtdCkgeworICBtX3NQcml2YXRlUGFyYW0ubXRDaGlsZCA9IG10OwogfQogCi1jb25zdCBDUFdMX1duZCoJQ1BXTF9XbmQ6OkdldEZvY3VzZWQoKSBjb25zdAotewotCWlmIChDUFdMX01zZ0NvbnRyb2wgKiBwTXNnQ3RybCA9IEdldE1zZ0NvbnRyb2woKSkKLQl7Ci0JCXJldHVybiBwTXNnQ3RybC0+bV9wTWFpbktleWJvYXJkV25kOwotCX0KK2NvbnN0IENQV0xfV25kKiBDUFdMX1duZDo6R2V0Rm9jdXNlZCgpIGNvbnN0IHsKKyAgaWYgKENQV0xfTXNnQ29udHJvbCogcE1zZ0N0cmwgPSBHZXRNc2dDb250cm9sKCkpIHsKKyAgICByZXR1cm4gcE1zZ0N0cmwtPm1fcE1haW5LZXlib2FyZFduZDsKKyAgfQogCi0JcmV0dXJuIE5VTEw7CisgIHJldHVybiBOVUxMOwogfQogCi12b2lkIENQV0xfV25kOjpFbmFibGVXaW5kb3coRlhfQk9PTCBiRW5hYmxlKQotewotCWlmIChtX2JFbmFibGVkICE9IGJFbmFibGUpCi0JewotCQlmb3IgKEZYX0lOVDMyIGk9MCxzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKLQkJewotCQkJaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBtX2FDaGlsZHJlbi5HZXRBdChpKSkKLQkJCXsKLQkJCQlwQ2hpbGQtPkVuYWJsZVdpbmRvdyhiRW5hYmxlKTsKLQkJCX0KLQkJfQordm9pZCBDUFdMX1duZDo6RW5hYmxlV2luZG93KEZYX0JPT0wgYkVuYWJsZSkgeworICBpZiAobV9iRW5hYmxlZCAhPSBiRW5hYmxlKSB7CisgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYUNoaWxkcmVuLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgIGlmIChDUFdMX1duZCogcENoaWxkID0gbV9hQ2hpbGRyZW4uR2V0QXQoaSkpIHsKKyAgICAgICAgcENoaWxkLT5FbmFibGVXaW5kb3coYkVuYWJsZSk7CisgICAgICB9CisgICAgfQogCi0JCXRoaXMtPm1fYkVuYWJsZWQgPSBiRW5hYmxlOworICAgIG1fYkVuYWJsZWQgPSBiRW5hYmxlOwogCi0JCWlmIChiRW5hYmxlKQotCQkJdGhpcy0+T25FbmFibGVkKCk7Ci0JCWVsc2UKLQkJCXRoaXMtPk9uRGlzYWJsZWQoKTsKLQl9CisgICAgaWYgKGJFbmFibGUpCisgICAgICBPbkVuYWJsZWQoKTsKKyAgICBlbHNlCisgICAgICBPbkRpc2FibGVkKCk7CisgIH0KIH0KIAotRlhfQk9PTCBDUFdMX1duZDo6SXNFbmFibGVkKCkKLXsKLQlyZXR1cm4gbV9iRW5hYmxlZDsKK0ZYX0JPT0wgQ1BXTF9XbmQ6OklzRW5hYmxlZCgpIHsKKyAgcmV0dXJuIG1fYkVuYWJsZWQ7CiB9CiAKLXZvaWQgQ1BXTF9XbmQ6Ok9uRW5hYmxlZCgpCi17Ci19Cit2b2lkIENQV0xfV25kOjpPbkVuYWJsZWQoKSB7fQogCi12b2lkIENQV0xfV25kOjpPbkRpc2FibGVkKCkKLXsKLX0KK3ZvaWQgQ1BXTF9XbmQ6Ok9uRGlzYWJsZWQoKSB7fQogCi1GWF9CT09MIENQV0xfV25kOjpJc0NUUkxwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdAotewotCWlmIChJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIgPSBHZXRTeXN0ZW1IYW5kbGVyKCkpCi0JewotCQlyZXR1cm4gcFN5c3RlbUhhbmRsZXItPklzQ1RSTEtleURvd24obkZsYWcpOwotCX0KK0ZYX0JPT0wgQ1BXTF9XbmQ6OklzQ1RSTHByZXNzZWQoRlhfRFdPUkQgbkZsYWcpIGNvbnN0IHsKKyAgaWYgKElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlciA9IEdldFN5c3RlbUhhbmRsZXIoKSkgeworICAgIHJldHVybiBwU3lzdGVtSGFuZGxlci0+SXNDVFJMS2V5RG93bihuRmxhZyk7CisgIH0KIAotCXJldHVybiBGQUxTRTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MCUNQV0xfV25kOjpJc1NISUZUcHJlc3NlZChGWF9EV09SRCBuRmxhZykgY29uc3QKLXsKLQlpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyID0gR2V0U3lzdGVtSGFuZGxlcigpKQotCXsKLQkJcmV0dXJuIHBTeXN0ZW1IYW5kbGVyLT5Jc1NISUZUS2V5RG93bihuRmxhZyk7Ci0JfQorRlhfQk9PTCBDUFdMX1duZDo6SXNTSElGVHByZXNzZWQoRlhfRFdPUkQgbkZsYWcpIGNvbnN0IHsKKyAgaWYgKElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlciA9IEdldFN5c3RlbUhhbmRsZXIoKSkgeworICAgIHJldHVybiBwU3lzdGVtSGFuZGxlci0+SXNTSElGVEtleURvd24obkZsYWcpOworICB9CiAKLQlyZXR1cm4gRkFMU0U7CisgIHJldHVybiBGQUxTRTsKIH0KIAotRlhfQk9PTAlDUFdMX1duZDo6SXNBTFRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdAotewotCWlmIChJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIgPSBHZXRTeXN0ZW1IYW5kbGVyKCkpCi0JewotCQlyZXR1cm4gcFN5c3RlbUhhbmRsZXItPklzQUxUS2V5RG93bihuRmxhZyk7Ci0JfQorRlhfQk9PTCBDUFdMX1duZDo6SXNBTFRwcmVzc2VkKEZYX0RXT1JEIG5GbGFnKSBjb25zdCB7CisgIGlmIChJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIgPSBHZXRTeXN0ZW1IYW5kbGVyKCkpIHsKKyAgICByZXR1cm4gcFN5c3RlbUhhbmRsZXItPklzQUxUS2V5RG93bihuRmxhZyk7CisgIH0KIAotCXJldHVybiBGQUxTRTsKKyAgcmV0dXJuIEZBTFNFOwogfQogCi1GWF9CT09MCUNQV0xfV25kOjpJc0lOU0VSVHByZXNzZWQoRlhfRFdPUkQgbkZsYWcpIGNvbnN0Ci17Ci0JaWYgKElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlciA9IEdldFN5c3RlbUhhbmRsZXIoKSkKLQl7Ci0JCXJldHVybiBwU3lzdGVtSGFuZGxlci0+SXNJTlNFUlRLZXlEb3duKG5GbGFnKTsKLQl9CitGWF9CT09MIENQV0xfV25kOjpJc0lOU0VSVHByZXNzZWQoRlhfRFdPUkQgbkZsYWcpIGNvbnN0IHsKKyAgaWYgKElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlciA9IEdldFN5c3RlbUhhbmRsZXIoKSkgeworICAgIHJldHVybiBwU3lzdGVtSGFuZGxlci0+SXNJTlNFUlRLZXlEb3duKG5GbGFnKTsKKyAgfQogCi0JcmV0dXJuIEZBTFNFOworICByZXR1cm4gRkFMU0U7CiB9Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3Jlc291cmNlLmggYi9mcGRmc2RrL3NyYy9yZXNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmEyMDk1Li4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvc3JjL3Jlc291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIEZQREZTREtfU1JDX1JFU09VUkNFX0hfCi0jZGVmaW5lIEZQREZTREtfU1JDX1JFU09VUkNFX0hfCi0KLS8ve3tOT19ERVBFTkRFTkNJRVN9fQotLy8gTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gZ2VuZXJhdGVkIGluY2x1ZGUgZmlsZS4KLS8vIFVzZWQgYnkgZnBkZnNka2RsbC5yYwotLy8KLS8vIE5leHQgZGVmYXVsdCB2YWx1ZXMgZm9yIG5ldyBvYmplY3RzCi0vLwotI2lmZGVmIEFQU1RVRElPX0lOVk9LRUQKLSNpZm5kZWYgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUwotI2RlZmluZSBfQVBTX05FWFRfUkVTT1VSQ0VfVkFMVUUgICAgICAgIDEwNAotI2RlZmluZSBfQVBTX05FWFRfQ09NTUFORF9WQUxVRSAgICAgICAgIDQwMDAxCi0jZGVmaW5lIF9BUFNfTkVYVF9DT05UUk9MX1ZBTFVFICAgICAgICAgMTAwMAotI2RlZmluZSBfQVBTX05FWFRfU1lNRURfVkFMVUUgICAgICAgICAgIDEwMQotI2VuZGlmCi0jZW5kaWYKLQotI2VuZGlmICAvLyBGUERGU0RLX1NSQ19SRVNPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvcGRmaXVtLmduaSBiL3BkZml1bS5nbmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM3MWRiOQotLS0gL2Rldi9udWxsCisrKyBiL3BkZml1bS5nbmkKQEAgLTAsMCArMSwyMCBAQAorIyBDb3B5cmlnaHQgMjAxNSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjIFRoaXMgZmlsZSBjb250YWlucyBQREZpdW0tcmVsYXRlZCBidWlsZCBmbGFncy4KKworZGVjbGFyZV9hcmdzKCkgeworICAjIE9uIEFuZHJvaWQgdGhlcmUncyBubyBzeXN0ZW0gRnJlZVR5cGUuIE9uIFdpbmRvd3MgYW5kIE1hYywgb25seSBhIGZldworICAjIG1ldGhvZHMgYXJlIHVzZWQgZnJvbSBpdC4KKyAgcGRmaXVtX2J1bmRsZV9mcmVldHlwZSA9ICFpc19saW51eAorCisgICMgQnVpbGQgUERGaXVtIGVpdGhlciB3aXRoIG9yIHdpdGhvdXQgdjggc3VwcG9ydC4KKyAgcGRmX2VuYWJsZV92OCA9IHRydWUKKworICAjIEJ1aWxkIFBERml1bSBlaXRoZXIgd2l0aCBvciB3aXRob3V0IFhGQSBGb3JtcyBzdXBwb3J0LgorICBwZGZfZW5hYmxlX3hmYSA9IGZhbHNlCisKKyAgIyBCdWlsZCBQREZpdW0gYWdhaW5zdCBza2lhIChleHBlcmltZW50YWwpIHJhdGhlciB0aGFuIGFnZy4KKyAgcGRmX3VzZV9za2lhID0gZmFsc2UKK30KZGlmZiAtLWdpdCBhL3BkZml1bS5neXAgYi9wZGZpdW0uZ3lwCmluZGV4IGM4MjE1ZTcuLmIyY2JiMzAgMTAwNjQ0Ci0tLSBhL3BkZml1bS5neXAKKysrIGIvcGRmaXVtLmd5cApAQCAtMSwyOCArMSw0OSBAQAorIyBDb3B5cmlnaHQgMjAxNSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCiB7CiAgICd2YXJpYWJsZXMnOiB7CisgICAgIyBUT0RPKHRoYWtpcyk6IEVuYWJsZSB0aGlzLCBwZGZpdW06MjkKKyAgICAjJ2Nocm9taXVtX2NvZGUnOiAxLAogICAgICdwZGZfdXNlX3NraWElJzogMCwKKyAgICAncGRmX2VuYWJsZV92OCUnOiAxLAorICAgICdwZGZfZW5hYmxlX3hmYSUnOiAwLCAjIFNldCB0byAxIGJ5IHN0YW5kYWxvbmUuZ3lwaSBpbiBhIHN0YW5kYWxvbmUgYnVpbGQuCiAgICAgJ2NvbmRpdGlvbnMnOiBbCiAgICAgICBbJ09TPT0ibGludXgiJywgewogICAgICAgICAnYnVuZGxlX2ZyZWV0eXBlJSc6IDAsCiAgICAgICB9LCB7ICAjIE9uIEFuZHJvaWQgdGhlcmUncyBubyBzeXN0ZW0gRnJlZVR5cGUuIE9uIFdpbmRvd3MgYW5kIE1hYywgb25seSBhCiAgICAgICAgICAgICAjIGZldyBtZXRob2RzIGFyZSB1c2VkIGZyb20gaXQuCiAgICAgICAgICdidW5kbGVfZnJlZXR5cGUlJzogMSwKLSAgICAgIH1dLCAgICAKKyAgICAgIH1dLAogICAgIF0sCiAgIH0sCiAgICd0YXJnZXRfZGVmYXVsdHMnOiB7CiAgICAgJ2RlZmluZXMnIDogWwotICAgICAgJ19GUERGU0RLX0xJQicsCi0gICAgICAnX05PX0dESVBMVVNfJywgICMgd29ya2Fyb3VuZCB0ZXh0IHJlbmRlcmluZyBpc3N1ZXMgb24gV2luZG93cwogICAgICAgJ09QSl9TVEFUSUMnLAorICAgICAgJ1BOR19QUkVGSVgnLAorICAgICAgJ1BOR1BSRUZJWF9IJywKKyAgICAgICdQTkdfVVNFX1JFQURfTUFDUk9TJywKKyAgICAgICdWOF9ERVBSRUNBVElPTl9XQVJOSU5HUycsCisgICAgICAnX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MnLAogICAgIF0sCiAgICAgJ2luY2x1ZGVfZGlycyc6IFsKKyAgICAgICMgVGhpcyBpcyBpbXBsaWNpdCBpbiBHTi4KKyAgICAgICc8KERFUFRIKScsCisgICAgICAnLicsCiAgICAgICAndGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZScsCisgICAgICAndGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZScsCiAgICAgXSwKICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgIFsncGRmX3VzZV9za2lhPT0xJywgewogICAgICAgICAnZGVmaW5lcyc6IFsnX1NLSUFfU1VQUE9SVF8nXSwKICAgICAgIH1dLAorICAgICAgWydwZGZfZW5hYmxlX3Y4PT0xJywgeworICAgICAgICAnZGVmaW5lcyc6IFsnUERGX0VOQUJMRV9WOCddLAorICAgICAgfV0sCisgICAgICBbJ3BkZl9lbmFibGVfeGZhPT0xJywgeworICAgICAgICAnZGVmaW5lcyc6IFsnUERGX0VOQUJMRV9YRkEnXSwKKyAgICAgIH1dLAogICAgICAgWydPUz09ImxpbnV4IicsIHsKICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCiAgICAgICAgICAgWyd0YXJnZXRfYXJjaD09Ing2NCInLCB7CkBAIC0zNiw4ICs1NywxOCBAQAogICAgICAgfV0sCiAgICAgXSwKICAgICAnbXN2c19kaXNhYmxlZF93YXJuaW5ncyc6IFsKLSAgICAgIDQwMDUsIDQwMTgsIDQxNDYsIDQzMzMsIDQzNDUsIDQyNjcKKyAgICAgIDQwMDUsIDQwMTgsIDQxNDYsIDQzMzMsIDQzNDUsIDQyNjcsCisgICAgICAjIFRPRE8odGhlc3RpZyk6IEZpeCBhbGwgaW5zdGFuY2VzLCByZW1vdmUgdGhpcywgcGRmaXVtOjI5CisgICAgICA0MjQ1LCA0MzEwLCA0Mzg5LCA0NzAxLCA0NzAyLCA0NzA2LCA0ODAwLAogICAgIF0sCisgICAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgICdjbGFuZ193YXJuaW5nX2ZsYWdzJzogWworICAgICAgICAjIFRPRE8odGhlc3RpZyk6IEZpeCBhbGwgaW5zdGFuY2VzLCByZW1vdmUgdGhpcywgcGRmaXVtOjI5CisgICAgICAgICctV25vLXNpZ24tY29tcGFyZScsCisgICAgICBdLAorICAgICAgIyBNYWtlIHN1cmUgQ2hyb21pdW0ncyBidWlsZC9jb21tb24uZ3lwaSBkb2Vzbid0IHJlLWFkZCB0aGUgZmxhZyBvbiBsaW51eC4KKyAgICAgICdjZmxhZ3NfY2MhJzogWyAnLVdzaWduLWNvbXBhcmUnIF0sCisgICAgfSwKICAgfSwKICAgJ3RhcmdldHMnOiBbCiAgICAgewpAQCAtNTYsMTAgKzg3LDggQEAKICAgICAgICAgJ2Z4ZWRpdCcsCiAgICAgICAgICdmeGdlJywKICAgICAgICAgJ2phdmFzY3JpcHQnLAotICAgICAgICAnanNhcGknLAogICAgICAgICAncGRmd2luZG93JywKICAgICAgIF0sCi0gICAgICAnbGRmbGFncyc6IFsgJy1MPChQUk9EVUNUX0RJUiknLF0sCiAgICAgICAnc291cmNlcyc6IFsKICAgICAgICAgJ2ZwZGZzZGsvaW5jbHVkZS9mc2RrX2FjdGlvbmhhbmRsZXIuaCcsCiAgICAgICAgICdmcGRmc2RrL2luY2x1ZGUvZnNka19hbm5vdGhhbmRsZXIuaCcsCkBAIC04Niw4ICsxMTUsNiBAQAogICAgICAgICAnZnBkZnNkay9zcmMvZnNka19iYXNlZm9ybS5jcHAnLAogICAgICAgICAnZnBkZnNkay9zcmMvZnNka19tZ3IuY3BwJywKICAgICAgICAgJ2ZwZGZzZGsvc3JjL2ZzZGtfcmVuZGVyY29udGV4dC5jcHAnLAotICAgICAgICAnZnBkZnNkay9zcmMvZnBkZnNka2RsbC5yYycsCi0gICAgICAgICdmcGRmc2RrL3NyYy9yZXNvdXJjZS5oJywKICAgICAgICAgJ3B1YmxpYy9mcGRmX2RhdGFhdmFpbC5oJywKICAgICAgICAgJ3B1YmxpYy9mcGRmX2RvYy5oJywKICAgICAgICAgJ3B1YmxpYy9mcGRmX2VkaXQuaCcsCkBAIC0xMDUsMTQgKzEzMiwxNCBAQAogICAgICAgICAncHVibGljL2ZwZGZ2aWV3LmgnLAogICAgICAgXSwKICAgICAgICdjb25kaXRpb25zJzogWwotICAgICAgICBbJ09TIT0id2luIicsIHsKLSAgICAgICAgICAnc291cmNlcyEnOiBbCi0gICAgICAgICAgICAnZnBkZnNkay9zcmMvZnBkZnNka2RsbC5yYycsCi0gICAgICAgICAgXSwKKyAgICAgICAgWydwZGZfZW5hYmxlX3hmYT09MScsIHsKKyAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAgICAgJ2ZwZGZ4ZmEnLAorICAgICAgICAgICBdLAogICAgICAgICB9XSwKICAgICAgICAgWydidW5kbGVfZnJlZXR5cGU9PTEnLCB7CiAgICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgICAgICd0aGlyZF9wYXJ0eS90aGlyZF9wYXJ0eS5neXA6ZnJlZXR5cGUnLAorICAgICAgICAgICAgJ3RoaXJkX3BhcnR5L3RoaXJkX3BhcnR5Lmd5cDpmeF9mcmVldHlwZScsCiAgICAgICAgICAgXSwKICAgICAgICAgfSwgewogICAgICAgICAgICdsaW5rX3NldHRpbmdzJzogewpAQCAtMTQ3LDcgKzE3NCw2IEBACiAgICAgewogICAgICAgJ3RhcmdldF9uYW1lJzogJ2Zkcm0nLAogICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAotICAgICAgJ2xkZmxhZ3MnOiBbICctTDwoUFJPRFVDVF9ESVIpJyxdLAogICAgICAgJ3NvdXJjZXMnOiBbCiAgICAgICAgICdjb3JlL2luY2x1ZGUvZmRybS9meF9jcnlwdC5oJywKICAgICAgICAgJ2NvcmUvc3JjL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0LmNwcCcsCkBAIC0xNTgsNyArMTg0LDYgQEAKICAgICB7CiAgICAgICAndGFyZ2V0X25hbWUnOiAnZnBkZmRvYycsCiAgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCi0gICAgICAnbGRmbGFncyc6IFsgJy1MPChQUk9EVUNUX0RJUiknLF0sCiAgICAgICAnc291cmNlcyc6IFsKICAgICAgICAgJ2NvcmUvaW5jbHVkZS9mcGRmZG9jL2ZwZGZfYXAuaCcsCiAgICAgICAgICdjb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oJywKQEAgLTE4OCw5ICsyMTMsNyBAQAogICAgIHsKICAgICAgICd0YXJnZXRfbmFtZSc6ICdmcGRmYXBpJywKICAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKLSAgICAgICdsZGZsYWdzJzogWyAnLUw8KFBST0RVQ1RfRElSKScsXSwKICAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAnY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZmFwaS5oJywKICAgICAgICAgJ2NvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfbW9kdWxlLmgnLAogICAgICAgICAnY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9vYmplY3RzLmgnLAogICAgICAgICAnY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlLmgnLApAQCAtMjUwLDggKzI3Myw2IEBACiAgICAgICAgICdjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1VuaUpJUy1VQ1MyLUhXLVZfNC5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9VbmlKSVMtVUNTMi1IXzQuY3BwJywKICAgICAgICAgJ2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvVW5pSklTLVVDUzItVl80LmNwcCcsCi0gICAgICAgICdjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfY21hcHMvSmFwYW4xL1VuaUpJUy1VVEYxNi1IXzUuY3BwJywKLSAgICAgICAgJ2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9KYXBhbjEvVW5pSklTLVVURjE2LVZfNS5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0phcGFuMS9WXzEuY3BwJywKICAgICAgICAgJ2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9jbWFwcy9Lb3JlYTEvQWRvYmUtS29yZWExLVVDUzJfMi5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnBkZmFwaS9mcGRmX2NtYXBzL0tvcmVhMS9jbWFwc19rb3JlYTEuY3BwJywKQEAgLTI3MCw3ICsyOTEsNiBAQAogICAgICAgICAnY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2NyZWF0ZS5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2RvYy5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnBkZmFwaS9mcGRmX2VkaXQvZnBkZl9lZGl0X2ltYWdlLmNwcCcsCi0gICAgICAgICdjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9jb21tb24uaCcsCiAgICAgICAgICdjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mb250X2ludC5oJywKICAgICAgICAgJ2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9mb250L2ZwZGZfZm9udC5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnBkZmFwaS9mcGRmX2ZvbnQvZnBkZl9mb250X2NoYXJzZXQuY3BwJywKQEAgLTI4OCwxNSArMzA4LDE0IEBACiAgICAgICAgICdjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFnZS9mcGRmX3BhZ2VfcGF0aC5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX3BhdHRlcm4uY3BwJywKICAgICAgICAgJ2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL3BhZ2VpbnQuaCcsCi0gICAgICAgICdjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZpbHRlcnNfaW50LmgnLAogICAgICAgICAnY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGUuY3BwJywKICAgICAgICAgJ2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZG9jdW1lbnQuY3BwJywKICAgICAgICAgJ2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZW5jcnlwdC5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9mZGYuY3BwJywKLSAgICAgICAgJ2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfZmlsdGVycy5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9vYmplY3RzLmNwcCcsCiAgICAgICAgICdjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX3BhcnNlci5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl91dGlsaXR5LmNwcCcsCisgICAgICAgICdjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL3BhcnNlcl9pbnQuaCcsCiAgICAgICAgICdjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyLmNwcCcsCiAgICAgICAgICdjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2NhY2hlLmNwcCcsCiAgICAgICAgICdjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX2ltYWdlLmNwcCcsCkBAIC0zMDksNyArMzI4LDYgQEAKICAgICB7CiAgICAgICAndGFyZ2V0X25hbWUnOiAnZnBkZnRleHQnLAogICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAotICAgICAgJ2xkZmxhZ3MnOiBbICctTDwoUFJPRFVDVF9ESVIpJyxdLAogICAgICAgJ3NvdXJjZXMnOiBbCiAgICAgICAgICdjb3JlL2luY2x1ZGUvZnBkZnRleHQvZnBkZl90ZXh0LmgnLAogICAgICAgICAnY29yZS9zcmMvZnBkZnRleHQvZnBkZl90ZXh0LmNwcCcsCkBAIC0zMTksODIgKzMzNyw0NyBAQAogICAgICAgICAnY29yZS9zcmMvZnBkZnRleHQvdHh0cHJvYy5oJywKICAgICAgICAgJ2NvcmUvc3JjL2ZwZGZ0ZXh0L3VuaWNvZGVub3JtYWxpemF0aW9uLmNwcCcsCiAgICAgICAgICdjb3JlL3NyYy9mcGRmdGV4dC91bmljb2Rlbm9ybWFsaXphdGlvbmRhdGEuY3BwJywKKyAgICAgICAgJ2NvcmUvc3JjL2ZwZGZ0ZXh0L3VuaWNvZGVub3JtYWxpemF0aW9uZGF0YS5oJywKICAgICAgIF0sCiAgICAgfSwKICAgICB7CiAgICAgICAndGFyZ2V0X25hbWUnOiAnZnhjb2RlYycsCiAgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCi0gICAgICAnaW5jbHVkZV9kaXJzJzogWworICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwobGlianBlZ19neXBfcGF0aCk6bGlianBlZycsCisgICAgICAgICd0aGlyZF9wYXJ0eS90aGlyZF9wYXJ0eS5neXA6ZnhfbGNtczInLAorICAgICAgICAndGhpcmRfcGFydHkvdGhpcmRfcGFydHkuZ3lwOmZ4X2xpYm9wZW5qcGVnJywKKyAgICAgICAgJ3RoaXJkX3BhcnR5L3RoaXJkX3BhcnR5Lmd5cDpmeF96bGliJywKICAgICAgIF0sCi0gICAgICAnbGRmbGFncyc6IFsgJy1MPChQUk9EVUNUX0RJUiknLF0sCi0gICAgICAnbXN2c19zZXR0aW5ncyc6IHsKLSAgICAgICAgJ1ZDQ0xDb21waWxlclRvb2wnOiB7Ci0gICAgICAgICAgIyBVbnJlc29sdmVkIHdhcm5pbmdzIGluIGZ4X2NvZGVjX2pweF9vcGouY3BwCi0gICAgICAgICAgIyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3BkZml1bS9pc3N1ZXMvZGV0YWlsP2lkPTEwMAotICAgICAgICAgICdXYXJuQXNFcnJvcic6ICdmYWxzZScsCi0gICAgICAgIH0sCi0gICAgICB9LAogICAgICAgJ3NvdXJjZXMnOiBbCiAgICAgICAgICdjb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oJywKICAgICAgICAgJ2NvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjX2RlZi5oJywKLSAgICAgICAgJ2NvcmUvaW5jbHVkZS9meGNvZGVjL2Z4X2NvZGVjX3Byb3ZpZGVyLmgnLAorICAgICAgICAnY29yZS9pbmNsdWRlL2Z4Y29kZWMvZnhfY29kZWNfZmxhdGUuaCcsCiAgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2NvZGVjL2NvZGVjX2ludC5oJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWMuY3BwJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZmF4LmNwcCcsCiAgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZsYXRlLmNwcCcsCiAgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ljYy5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qYmlnLmNwcCcsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2piaWdfZW5jLmNwcCcsCiAgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pwZWcuY3BwJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanB4X29wai5jcHAnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9pbmNsdWRlL2Z4X29wZW5qcGVnLmgnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfYmlvLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfY2lvLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfZHd0LmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfZXZlbnQuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9mdW5jdGlvbl9saXN0LmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfaW1hZ2UuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9pbnZlcnQuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9qMmsuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9qMmtfbGliLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfanB0LmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfbWN0LmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfbXFjLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfb3BlbmpwZWcuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9vcGVuanBlZ19qcDIuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9vcGpfY2xvY2suYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9waS5jJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X3Jhdy5jJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvc3JjL2Z4X3QxLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9zcmMvZnhfdDIuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF90Y2QuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF90Z3QuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvaW5jbHVkZS9meF96bGliLmgnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX2FkbGVyMzIuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfY29tcHJlc3MuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfY3JjMzIuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfZGVmbGF0ZS5jJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl9nemNsb3NlLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX2d6bGliLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX2d6cmVhZC5jJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl9nendyaXRlLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX2luZmJhY2suYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfaW5mZmFzdC5jJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9zcmMvZnhfemxpYl9pbmZsYXRlLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX2luZnRyZWVzLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX3RyZWVzLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3NyYy9meF96bGliX3VuY29tcHIuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvc3JjL2Z4X3psaWJfenV0aWwuYycsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0FyaXRoRGVjb2Rlci5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Bcml0aERlY29kZXIuaCcsCiAgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0FyaXRoSW50RGVjb2Rlci5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9Bcml0aEludERlY29kZXIuaCcsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0FyaXRoUWUuaCcsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0JpdFN0cmVhbS5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9CaXRTdHJlYW0uaCcsCiAgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0NvbnRleHQuY3BwJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfQ29udGV4dC5oJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfRGVmaW5lLmgnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HZW5lcmFsRGVjb2Rlci5jcHAnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HZW5lcmFsRGVjb2Rlci5oJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR3JkUHJvYy5jcHAnLAorICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HcmRQcm9jLmgnLAorICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HcnJkUHJvYy5jcHAnLAorICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9HcnJkUHJvYy5oJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR3NpZFByb2MuY3BwJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfR3NpZFByb2MuaCcsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h0cmRQcm9jLmNwcCcsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX0h0cmRQcm9jLmgnLAogICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuRGVjb2Rlci5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuRGVjb2Rlci5oJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlLmNwcCcsCkBAIC00MDMsOTggKzM4Niw0NiBAQAogICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9JbWFnZS5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9JbWFnZS5oJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfTGlzdC5oJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfTW9kdWxlLmgnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9PYmplY3QuY3BwJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfT2JqZWN0LmgnLAogICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9QYWdlLmgnLAogICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9QYXR0ZXJuRGljdC5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9QYXR0ZXJuRGljdC5oJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfUGRkUHJvYy5jcHAnLAorICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9QZGRQcm9jLmgnLAorICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TZGRQcm9jLmNwcCcsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1NkZFByb2MuaCcsCiAgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1NlZ21lbnQuY3BwJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU2VnbWVudC5oJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfU3ltYm9sRGljdC5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9qYmlnMi9KQmlnMl9TeW1ib2xEaWN0LmgnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zY2FtMDIuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNjZ2F0cy5jJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc2NudnJ0LmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zZXJyLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zZ2FtbWEuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNnbXQuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNoYWxmLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zaW50cnAuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNpbzAuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNpbzEuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNsdXQuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNtZDUuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNtdHJ4LmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zbmFtZWQuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNvcHQuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXNwYWNrLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zcGNzLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zcGx1Z2luLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zcHMyLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zc2FtcC5jJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvc3JjL2Z4X2Ntc3NtLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zdHlwZXMuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXN2aXJ0LmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9sY21zMi9zcmMvZnhfY21zd3RwbnQuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xjbXMyL3NyYy9meF9jbXN4Zm9ybS5jJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9jZGVycm9yLmgnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2NkanBlZy5oJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjYXBpbWluLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNhcGlzdGQuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY2NvZWZjdC5jJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjY29sb3IuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY2RjdG1nci5jJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjaHVmZi5jJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjaW5pdC5jJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjbWFpbmN0LmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNtYXJrZXIuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY21hc3Rlci5jJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjb21hcGkuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY3BhcmFtLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNwaHVmZi5jJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pjcHJlcGN0LmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamNzYW1wbGUuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qY3RyYW5zLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamRhcGltaW4uYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZGFwaXN0ZC5jJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkY29lZmN0LmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamRjb2xvci5jJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkZGN0bWdyLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamRodWZmLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamRpbnB1dC5jJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkbWFpbmN0LmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamRtYXJrZXIuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZG1hc3Rlci5jJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkbWVyZ2UuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZHBodWZmLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamRwb3N0Y3QuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZHNhbXBsZS5jJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pkdHJhbnMuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZXJyb3IuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qZmRjdGZzdC5jJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2pmZGN0aW50LmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfamlkY3Rmc3QuYycsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvZnBkZmFwaV9qaWRjdGludC5jJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2ppZGN0cmVkLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfam1lbW1nci5jJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9mcGRmYXBpX2ptZW1ub2JzLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ZwZGZhcGlfanV0aWxzLmMnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2pjaHVmZi5oJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9qY29uZmlnLmgnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2pkY3QuaCcsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvamRodWZmLmgnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2plcnJvci5oJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9qaW5jbHVkZS5oJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9qbWVtc3lzLmgnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ptb3JlY2ZnLmgnLAotICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2pwZWdpbnQuaCcsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvanBlZ2xpYi5oJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9qdmVyc2lvbi5oJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9tYWtlZmlsZScsCi0gICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvdHJhbnN1cHAuaCcsCisgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2piaWcyL0pCaWcyX1RyZFByb2MuY3BwJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvamJpZzIvSkJpZzJfVHJkUHJvYy5oJywKICAgICAgIF0sCisgICAgICAnbXN2c19zZXR0aW5ncyc6IHsKKyAgICAgICAgJ1ZDQ0xDb21waWxlclRvb2wnOiB7CisgICAgICAgICAgIyBVbnJlc29sdmVkIHdhcm5pbmdzIGluIGZ4X2NvZGVjX2pweF9vcGouY3BwCisgICAgICAgICAgIyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3BkZml1bS9pc3N1ZXMvZGV0YWlsP2lkPTEwMAorICAgICAgICAgICdXYXJuQXNFcnJvcic6ICdmYWxzZScsCisgICAgICAgIH0sCisgICAgICB9LAogICAgICAgJ2NvbmRpdGlvbnMnOiBbCisgICAgICAgIFsncGRmX2VuYWJsZV94ZmE9PTEnLCB7CisgICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgICAgICd0aGlyZF9wYXJ0eS90aGlyZF9wYXJ0eS5neXA6ZnhfbHBuZycsCisgICAgICAgICAgICAndGhpcmRfcGFydHkvdGhpcmRfcGFydHkuZ3lwOmZ4X3RpZmYnLAorICAgICAgICAgIF0sCisgICAgICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19ibXAuY3BwJywKKyAgICAgICAgICAgICdjb3JlL3NyYy9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2dpZi5jcHAnLAorICAgICAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfcG5nLmNwcCcsCisgICAgICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19wcm9ncmVzcy5jcHAnLAorICAgICAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfcHJvZ3Jlc3MuaCcsCisgICAgICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9jb2RlYy9meF9jb2RlY190aWZmLmNwcCcsCisgICAgICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9sYm1wL2Z4X2JtcC5jcHAnLAorICAgICAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGJtcC9meF9ibXAuaCcsCisgICAgICAgICAgICAnY29yZS9zcmMvZnhjb2RlYy9sZ2lmL2Z4X2dpZi5jcHAnLAorICAgICAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvbGdpZi9meF9naWYuaCcsCisgICAgICAgICAgXSwKKyAgICAgICAgfV0sCiAgICAgICAgIFsnb3NfcG9zaXg9PTEnLCB7CiAgICAgICAgICAgIyBjb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL3NyYy9meF9tY3QuYyBkb2VzIGFuIHBvaW50ZXItdG8taW50CiAgICAgICAgICAgIyBjb252ZXJzaW9uIHRvIGNoZWNrIHRoYXQgYW4gYWRkcmVzcyBpcyAxNi1iaXQgYWxpZ25lZCAoYmVuaWduKS4KQEAgLTUwNSwyOCArNDM2LDI1IEBACiAgICAgewogICAgICAgJ3RhcmdldF9uYW1lJzogJ2Z4Y3J0JywKICAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKLSAgICAgICdsZGZsYWdzJzogWyAnLUw8KFBST0RVQ1RfRElSKScsXSwKICAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAnY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2FyYi5oJywKICAgICAgICAgJ2NvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oJywKKyAgICAgICAgJ2NvcmUvaW5jbHVkZS9meGNydC9meF9iaWRpLmgnLAogICAgICAgICAnY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgnLAogICAgICAgICAnY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2V4dC5oJywKICAgICAgICAgJ2NvcmUvaW5jbHVkZS9meGNydC9meF9tZW1vcnkuaCcsCisgICAgICAgICdjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc2FmZV90eXBlcy5oJywKICAgICAgICAgJ2NvcmUvaW5jbHVkZS9meGNydC9meF9zdHJlYW0uaCcsCiAgICAgICAgICdjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyaW5nLmgnLAogICAgICAgICAnY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oJywKICAgICAgICAgJ2NvcmUvaW5jbHVkZS9meGNydC9meF91Y2QuaCcsCiAgICAgICAgICdjb3JlL2luY2x1ZGUvZnhjcnQvZnhfeG1sLmgnLAogICAgICAgICAnY29yZS9zcmMvZnhjcnQvZXh0ZW5zaW9uLmgnLAotICAgICAgICAnY29yZS9zcmMvZnhjcnQvZnhfc2FmZV90eXBlcy5oJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3BsYXRmb3Jtcy5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnhjcnQvZnhjcnRfcGxhdGZvcm1zLmgnLAogICAgICAgICAnY29yZS9zcmMvZnhjcnQvZnhjcnRfcG9zaXguY3BwJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y3J0L2Z4Y3J0X3Bvc2l4LmgnLAogICAgICAgICAnY29yZS9zcmMvZnhjcnQvZnhjcnRfd2luZG93cy5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnhjcnQvZnhjcnRfd2luZG93cy5oJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Y3J0L2Z4X2FyYWJpYy5jcHAnLAotICAgICAgICAnY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmgnLAogICAgICAgICAnY29yZS9zcmMvZnhjcnQvZnhfYmFzaWNfYXJyYXkuY3BwJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2JzdHJpbmcuY3BwJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX2J1ZmZlci5jcHAnLApAQCAtNTM5LDYgKzQ2Nyw3IEBACiAgICAgICAgICdjb3JlL3NyYy9meGNydC9meF9iYXNpY191dGYuY3BwJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3V0aWwuY3BwJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3dzdHJpbmcuY3BwJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y3J0L2Z4X2JpZGkuY3BwJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnhjcnQvZnhfdWNkZGF0YS5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnhjcnQvZnhfdW5pY29kZS5jcHAnLApAQCAtNTQ3LDExICs0NzYsMjIgQEAKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y3J0L3BsZXguaCcsCiAgICAgICAgICdjb3JlL3NyYy9meGNydC94bWxfaW50LmgnLAogICAgICAgXSwKKyAgICAgICdjb25kaXRpb25zJzogWworICAgICAgICBbJ3BkZl9lbmFibGVfeGZhPT0xJywgeworICAgICAgICAgICdzb3VyY2VzJzogWworICAgICAgICAgICAgJ2NvcmUvaW5jbHVkZS9meGNydC9meF9hcmIuaCcsCisgICAgICAgICAgICAnY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmNwcCcsCisgICAgICAgICAgICAnY29yZS9zcmMvZnhjcnQvZnhfYXJhYmljLmgnLAorICAgICAgICAgIF0sCisgICAgICAgIH1dLAorICAgICAgXSwKICAgICB9LAogICAgIHsKICAgICAgICd0YXJnZXRfbmFtZSc6ICdmeGdlJywKICAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKLSAgICAgICdsZGZsYWdzJzogWyAnLUw8KFBST0RVQ1RfRElSKScsXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICd0aGlyZF9wYXJ0eS90aGlyZF9wYXJ0eS5neXA6ZnhfYWdnJywKKyAgICAgIF0sCiAgICAgICAnc291cmNlcyc6IFsKICAgICAgICAgJ2NvcmUvaW5jbHVkZS9meGdlL2ZwZi5oJywKICAgICAgICAgJ2NvcmUvaW5jbHVkZS9meGdlL2Z4X2RpYi5oJywKQEAgLTU2MCwyMyArNTAwLDggQEAKICAgICAgICAgJ2NvcmUvaW5jbHVkZS9meGdlL2Z4X2dlLmgnLAogICAgICAgICAnY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZ2VfYXBwbGUuaCcsCiAgICAgICAgICdjb3JlL2luY2x1ZGUvZnhnZS9meF9nZV93aW4zMi5oJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Z2UvYWdnL2luY2x1ZGUvZnhmeF9hZ2dfYmFzaWNzLmgnLAotICAgICAgICAnY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meGZ4X2FnZ19jbGlwX2xpYW5nX2JhcnNreS5oJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Z2UvYWdnL2luY2x1ZGUvZnhmeF9hZ2dfY29udl9kYXNoLmgnLAotICAgICAgICAnY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meGZ4X2FnZ19jb252X3N0cm9rZS5oJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Z2UvYWdnL2luY2x1ZGUvZnhmeF9hZ2dfY3VydmVzLmgnLAotICAgICAgICAnY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meGZ4X2FnZ19wYXRoX3N0b3JhZ2UuaCcsCi0gICAgICAgICdjb3JlL3NyYy9meGdlL2FnZy9pbmNsdWRlL2Z4ZnhfYWdnX3Jhc3Rlcml6ZXJfc2NhbmxpbmVfYWEuaCcsCi0gICAgICAgICdjb3JlL3NyYy9meGdlL2FnZy9pbmNsdWRlL2Z4ZnhfYWdnX3JlbmRlcmVyX3NjYW5saW5lLmgnLAotICAgICAgICAnY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meGZ4X2FnZ19yZW5kZXJpbmdfYnVmZmVyLmgnLAotICAgICAgICAnY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meGZ4X2FnZ19zY2FubGluZV91LmgnLAogICAgICAgICAnY29yZS9zcmMvZnhnZS9hZ2cvaW5jbHVkZS9meF9hZ2dfZHJpdmVyLmgnLAotICAgICAgICAnY29yZS9zcmMvZnhnZS9hZ2cvc3JjL2Z4ZnhfYWdnX2N1cnZlcy5jcHAnLAotICAgICAgICAnY29yZS9zcmMvZnhnZS9hZ2cvc3JjL2Z4ZnhfYWdnX2RyaXZlci5jcHAnLAotICAgICAgICAnY29yZS9zcmMvZnhnZS9hZ2cvc3JjL2Z4ZnhfYWdnX3BhdGhfc3RvcmFnZS5jcHAnLAotICAgICAgICAnY29yZS9zcmMvZnhnZS9hZ2cvc3JjL2Z4ZnhfYWdnX3Jhc3Rlcml6ZXJfc2NhbmxpbmVfYWEuY3BwJywKLSAgICAgICAgJ2NvcmUvc3JjL2Z4Z2UvYWdnL3NyYy9meGZ4X2FnZ192Y2dlbl9kYXNoLmNwcCcsCi0gICAgICAgICdjb3JlL3NyYy9meGdlL2FnZy9zcmMvZnhmeF9hZ2dfdmNnZW5fc3Ryb2tlLmNwcCcsCisgICAgICAgICdjb3JlL3NyYy9meGdlL2FnZy9zcmMvZnhfYWdnX2RyaXZlci5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udC5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnhnZS9hbmRyb2lkL2ZwZl9za2lhZm9udC5oJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Z2UvYW5kcm9pZC9mcGZfc2tpYWZvbnRtZ3IuY3BwJywKQEAgLTU5Nyw2ICs1MjIsNyBAQAogICAgICAgICAnY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX2VuZ2luZS5jcHAnLAogICAgICAgICAnY29yZS9zcmMvZnhnZS9kaWIvZnhfZGliX21haW4uY3BwJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Z2UvZGliL2Z4X2RpYl90cmFuc2Zvcm0uY3BwJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvY2hyb21lZm9udGRhdGEuaCcsCiAgICAgICAgICdjb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0RGluZ2JhdHMuYycsCiAgICAgICAgICdjb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0Rml4ZWQuYycsCiAgICAgICAgICdjb3JlL3NyYy9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0Rml4ZWRCb2xkLmMnLApAQCAtNjI0LDYgKzU1MCwxMiBAQAogICAgICAgICAnY29yZS9zcmMvZnhnZS9nZS9meF9nZV90ZXh0LmNwcCcsCiAgICAgICAgICdjb3JlL3NyYy9meGdlL2dlL3RleHRfaW50LmgnLAogICAgICAgXSwKKyAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICdjbGFuZ193YXJuaW5nX2ZsYWdzJzogWworICAgICAgICAgICMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3BkZml1bS9pc3N1ZXMvZGV0YWlsP2lkPTE4OAorICAgICAgICAgICctV25vLXN3aXRjaCcsCisgICAgICAgIF0sCisgICAgICB9LAogICAgICAgJ2NvbmRpdGlvbnMnOiBbCiAgICAgICAgIFsncGRmX3VzZV9za2lhPT0xJywgewogICAgICAgICAgICdzb3VyY2VzJzogWwpAQCAtNjYzLDEyICs1OTUsMTAgQEAKICAgICB7CiAgICAgICAndGFyZ2V0X25hbWUnOiAnZnhlZGl0JywKICAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKLSAgICAgICdsZGZsYWdzJzogWyAnLUw8KFBST0RVQ1RfRElSKScsXSwKICAgICAgICdzb3VyY2VzJzogWwogICAgICAgICAnZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meF9lZGl0LmgnLAogICAgICAgICAnZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meGV0X2VkaXQuaCcsCiAgICAgICAgICdmcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfbGlzdC5oJywKLSAgICAgICAgJ2ZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhldF9zdHViLmgnLAogICAgICAgICAnZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfYXAuY3BwJywKICAgICAgICAgJ2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X2VkaXQuY3BwJywKICAgICAgICAgJ2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X2xpc3QuY3BwJywKQEAgLTY3OSwxMCArNjA5LDcgQEAKICAgICB7CiAgICAgICAndGFyZ2V0X25hbWUnOiAncGRmd2luZG93JywKICAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKLSAgICAgICdsZGZsYWdzJzogWyAnLUw8KFBST0RVQ1RfRElSKScsXSwKICAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAnZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9JUERGV2luZG93LmgnLAotICAgICAgICAnZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QREZXaW5kb3cuaCcsCiAgICAgICAgICdmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9CdXR0b24uaCcsCiAgICAgICAgICdmcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9DYXJldC5oJywKICAgICAgICAgJ2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0NvbWJvQm94LmgnLApAQCAtNzIyLDg0ICs2NDksNzcgQEAKICAgICB7CiAgICAgICAndGFyZ2V0X25hbWUnOiAnamF2YXNjcmlwdCcsCiAgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCi0gICAgICAnaW5jbHVkZV9kaXJzJzogWwotICAgICAgICAnPChERVBUSCkvdjgnLAotICAgICAgICAnPChERVBUSCkvdjgvaW5jbHVkZScsCi0gICAgICBdLAotICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgJzwoREVQVEgpL3Y4L3Rvb2xzL2d5cC92OC5neXA6djgnLAotICAgICAgXSwKLSAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWwotICAgICAgICAnPChERVBUSCkvdjgvdG9vbHMvZ3lwL3Y4Lmd5cDp2OCcsCi0gICAgICBdLAotICAgICAgJ2xkZmxhZ3MnOiBbICctTDwoUFJPRFVDVF9ESVIpJyxdLAogICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICdmcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9hcHAuaCcsCi0gICAgICAgICdmcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9jb2xvci5oJywKLSAgICAgICAgJ2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2NvbnNvbGUuaCcsCi0gICAgICAgICdmcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9Db25zdHMuaCcsCi0gICAgICAgICdmcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9Eb2N1bWVudC5oJywKLSAgICAgICAgJ2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L2V2ZW50LmgnLAotICAgICAgICAnZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvRmllbGQuaCcsCi0gICAgICAgICdmcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9nbG9iYWwuaCcsCi0gICAgICAgICdmcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9JY29uLmgnLAogICAgICAgICAnZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSUphdmFTY3JpcHQuaCcsCi0gICAgICAgICdmcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KYXZhU2NyaXB0LmgnLAotICAgICAgICAnZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oJywKLSAgICAgICAgJ2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0RlZmluZS5oJywKLSAgICAgICAgJ2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oJywKLSAgICAgICAgJ2ZwZGZzZGsvaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuaCcsCi0gICAgICAgICdmcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19PYmplY3QuaCcsCi0gICAgICAgICdmcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9KU19SdW50aW1lLmgnLAotICAgICAgICAnZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvSlNfVmFsdWUuaCcsCi0gICAgICAgICdmcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmgnLAotICAgICAgICAnZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvcmVwb3J0LmgnLAotICAgICAgICAnZnBkZnNkay9pbmNsdWRlL2phdmFzY3JpcHQvcmVzb3VyY2UuaCcsCi0gICAgICAgICdmcGRmc2RrL2luY2x1ZGUvamF2YXNjcmlwdC91dGlsLmgnLAotICAgICAgICAnZnBkZnNkay9zcmMvamF2YXNjcmlwdC9hcHAuY3BwJywKLSAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvY29sb3IuY3BwJywKLSAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvY29uc29sZS5jcHAnLAotICAgICAgICAnZnBkZnNkay9zcmMvamF2YXNjcmlwdC9Db25zdHMuY3BwJywKLSAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvRG9jdW1lbnQuY3BwJywKLSAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvZXZlbnQuY3BwJywKLSAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvRmllbGQuY3BwJywKLSAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvZ2xvYmFsLmNwcCcsCi0gICAgICAgICdmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0ljb24uY3BwJywKLSAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfQ29udGV4dC5jcHAnLAotICAgICAgICAnZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuY3BwJywKLSAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfR2xvYmFsRGF0YS5jcHAnLAotICAgICAgICAnZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19PYmplY3QuY3BwJywKLSAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfUnVudGltZS5jcHAnLAotICAgICAgICAnZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19WYWx1ZS5jcHAnLAotICAgICAgICAnZnBkZnNkay9zcmMvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmNwcCcsCi0gICAgICAgICdmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3JlcG9ydC5jcHAnLAotICAgICAgICAnZnBkZnNkay9zcmMvamF2YXNjcmlwdC9yZXNvdXJjZS5jcHAnLAotICAgICAgICAnZnBkZnNkay9zcmMvamF2YXNjcmlwdC91dGlsLmNwcCcsCisgICAgICAgICdmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX1J1bnRpbWVfU3R1Yi5jcHAnLAogICAgICAgXSwKLSAgICB9LAotICAgIHsKLSAgICAgICd0YXJnZXRfbmFtZSc6ICdqc2FwaScsCi0gICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCi0gICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAnPChERVBUSCkvdjgvdG9vbHMvZ3lwL3Y4Lmd5cDp2OCcsCi0gICAgICBdLAotICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCi0gICAgICAgICc8KERFUFRIKS92OC90b29scy9neXAvdjguZ3lwOnY4JywKLSAgICAgIF0sCi0gICAgICAnaW5jbHVkZV9kaXJzJzogWwotICAgICAgICAnPChERVBUSCkvdjgnLAotICAgICAgICAnPChERVBUSCkvdjgvaW5jbHVkZScsCi0gICAgICBdLAotICAgICAgJ2xkZmxhZ3MnOiBbICctTDwoUFJPRFVDVF9ESVIpJyxdLAotICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICdmcGRmc2RrL2luY2x1ZGUvanNhcGkvZnhqc192OC5oJywKLSAgICAgICAgJ2ZwZGZzZGsvc3JjL2pzYXBpL2Z4anNfdjguY3BwJywKKyAgICAgICdjb25kaXRpb25zJzogWworICAgICAgICBbJ3BkZl9lbmFibGVfdjg9PTEnLCB7CisgICAgICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKKyAgICAgICAgICAgICc8KERFUFRIKS92OCcsCisgICAgICAgICAgICAnPChERVBUSCkvdjgvaW5jbHVkZScsCisgICAgICAgICAgXSwKKyAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAgICAgJzwoREVQVEgpL3Y4L3Rvb2xzL2d5cC92OC5neXA6djgnLAorICAgICAgICAgIF0sCisgICAgICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICAgICAnPChERVBUSCkvdjgvdG9vbHMvZ3lwL3Y4Lmd5cDp2OCcsCisgICAgICAgICAgXSwKKyAgICAgICAgICAnc291cmNlcyEnOiBbCisgICAgICAgICAgICAnZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19SdW50aW1lX1N0dWIuY3BwJywKKyAgICAgICAgICBdLAorICAgICAgICAgICdzb3VyY2VzJzogWworICAgICAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvQ29uc3RzLmNwcCcsCisgICAgICAgICAgICAnZnBkZnNkay9zcmMvamF2YXNjcmlwdC9Db25zdHMuaCcsCisgICAgICAgICAgICAnZnBkZnNkay9zcmMvamF2YXNjcmlwdC9Eb2N1bWVudC5jcHAnLAorICAgICAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvRG9jdW1lbnQuaCcsCisgICAgICAgICAgICAnZnBkZnNkay9zcmMvamF2YXNjcmlwdC9GaWVsZC5jcHAnLAorICAgICAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvRmllbGQuaCcsCisgICAgICAgICAgICAnZnBkZnNkay9zcmMvamF2YXNjcmlwdC9JY29uLmNwcCcsCisgICAgICAgICAgICAnZnBkZnNkay9zcmMvamF2YXNjcmlwdC9JY29uLmgnLAorICAgICAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfQ29udGV4dC5jcHAnLAorICAgICAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oJywKKyAgICAgICAgICAgICdmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0RlZmluZS5oJywKKyAgICAgICAgICAgICdmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5jcHAnLAorICAgICAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmgnLAorICAgICAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfR2xvYmFsRGF0YS5jcHAnLAorICAgICAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfR2xvYmFsRGF0YS5oJywKKyAgICAgICAgICAgICdmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX09iamVjdC5jcHAnLAorICAgICAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgnLAorICAgICAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfUnVudGltZS5jcHAnLAorICAgICAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvSlNfUnVudGltZS5oJywKKyAgICAgICAgICAgICdmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L0pTX1ZhbHVlLmNwcCcsCisgICAgICAgICAgICAnZnBkZnNkay9zcmMvamF2YXNjcmlwdC9KU19WYWx1ZS5oJywKKyAgICAgICAgICAgICdmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuY3BwJywKKyAgICAgICAgICAgICdmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuaCcsCisgICAgICAgICAgICAnZnBkZnNkay9zcmMvamF2YXNjcmlwdC9hcHAuY3BwJywKKyAgICAgICAgICAgICdmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2FwcC5jcHAnLAorICAgICAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvYXBwLmgnLAorICAgICAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvY29sb3IuY3BwJywKKyAgICAgICAgICAgICdmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbG9yLmNwcCcsCisgICAgICAgICAgICAnZnBkZnNkay9zcmMvamF2YXNjcmlwdC9jb2xvci5oJywKKyAgICAgICAgICAgICdmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbnNvbGUuY3BwJywKKyAgICAgICAgICAgICdmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbnNvbGUuY3BwJywKKyAgICAgICAgICAgICdmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2NvbnNvbGUuaCcsCisgICAgICAgICAgICAnZnBkZnNkay9zcmMvamF2YXNjcmlwdC9ldmVudC5jcHAnLAorICAgICAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvZXZlbnQuaCcsCisgICAgICAgICAgICAnZnBkZnNkay9zcmMvamF2YXNjcmlwdC9nbG9iYWwuY3BwJywKKyAgICAgICAgICAgICdmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2dsb2JhbC5oJywKKyAgICAgICAgICAgICdmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3JlcG9ydC5jcHAnLAorICAgICAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvcmVwb3J0LmgnLAorICAgICAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvcmVzb3VyY2UuY3BwJywKKyAgICAgICAgICAgICdmcGRmc2RrL3NyYy9qYXZhc2NyaXB0L3Jlc291cmNlLmgnLAorICAgICAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvdXRpbC5jcHAnLAorICAgICAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvdXRpbC5oJywKKyAgICAgICAgICAgICdmcGRmc2RrL2luY2x1ZGUvanNhcGkvZnhqc192OC5oJywKKyAgICAgICAgICAgICdmcGRmc2RrL3NyYy9qc2FwaS9meGpzX3Y4LmNwcCcsCisgICAgICAgICAgXSwKKyAgICAgICAgfV0sCiAgICAgICBdLAogICAgIH0sCiAgICAgewogICAgICAgJ3RhcmdldF9uYW1lJzogJ2Zvcm1maWxsZXInLAogICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAotICAgICAgJ2xkZmxhZ3MnOiBbICctTDwoUFJPRFVDVF9ESVIpJyxdLAogICAgICAgJ3NvdXJjZXMnOiBbCiAgICAgICAgICdmcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfQ0JBX0ZvbnRtYXAuaCcsCiAgICAgICAgICdmcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfQ2hlY2tCb3guaCcsCkBAIC04MDcsMjMgKzcyNywxOCBAQAogICAgICAgICAnZnBkZnNkay9pbmNsdWRlL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuaCcsCiAgICAgICAgICdmcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfSUZvcm1GaWxsZXIuaCcsCiAgICAgICAgICdmcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfTGlzdEJveC5oJywKLSAgICAgICAgJ2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9Ob3RpZnkuaCcsCiAgICAgICAgICdmcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfUHVzaEJ1dHRvbi5oJywKICAgICAgICAgJ2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9SYWRpb0J1dHRvbi5oJywKICAgICAgICAgJ2ZwZGZzZGsvaW5jbHVkZS9mb3JtZmlsbGVyL0ZGTF9UZXh0RmllbGQuaCcsCi0gICAgICAgICdmcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9GRkxfVXRpbHMuaCcsCi0gICAgICAgICdmcGRmc2RrL2luY2x1ZGUvZm9ybWZpbGxlci9Gb3JtRmlsbGVyLmgnLAogICAgICAgICAnZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfQ0JBX0ZvbnRtYXAuY3BwJywKICAgICAgICAgJ2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NoZWNrQm94LmNwcCcsCiAgICAgICAgICdmcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9Db21ib0JveC5jcHAnLAogICAgICAgICAnZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5jcHAnLAogICAgICAgICAnZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfSUZvcm1GaWxsZXIuY3BwJywKICAgICAgICAgJ2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0xpc3RCb3guY3BwJywKLSAgICAgICAgJ2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX05vdGlmeS5jcHAnLAogICAgICAgICAnZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfUHVzaEJ1dHRvbi5jcHAnLAogICAgICAgICAnZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfUmFkaW9CdXR0b24uY3BwJywKICAgICAgICAgJ2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1RleHRGaWVsZC5jcHAnLAotICAgICAgICAnZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfVXRpbHMuY3BwJywKICAgICAgIF0sCiAgICAgfSwKICAgICB7CkBAIC04MzMsMTggKzc0OCwzMyBAQAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3RfbWFpbicsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCiAgICAgICAgICdwZGZpdW0nLAotICAgICAgXSwKLSAgICAgICdpbmNsdWRlX2RpcnMnOiBbCi0gICAgICAgICc8KERFUFRIKScKKyAgICAgICAgJ3Rlc3Rfc3VwcG9ydCcsCiAgICAgICBdLAogICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnRfY2lkX3VuaXR0ZXN0LmNwcCcsCisgICAgICAgICdjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfZm9udC9mcGRmX2ZvbnRfdW5pdHRlc3QuY3BwJywKKyAgICAgICAgJ2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYWdlL2ZwZGZfcGFnZV9wYXJzZXJfb2xkX3VuaXR0ZXN0LmNwcCcsCisgICAgICAgICdjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZV91bml0dGVzdC5jcHAnLAorICAgICAgICAnY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhcnNlci9mcGRmX3BhcnNlcl9wYXJzZXJfdW5pdHRlc3QuY3BwJywKKyAgICAgICAgJ2NvcmUvc3JjL2ZwZGZ0ZXh0L2ZwZGZfdGV4dF9pbnRfdW5pdHRlc3QuY3BwJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanB4X3VuaXR0ZXN0LmNwcCcsCiAgICAgICAgICdjb3JlL3NyYy9meGNydC9meF9iYXNpY19ic3RyaW5nX3VuaXR0ZXN0LmNwcCcsCiAgICAgICAgICdjb3JlL3NyYy9meGNydC9meF9iYXNpY19tZW1tZ3JfdW5pdHRlc3QuY3BwJywKICAgICAgICAgJ2NvcmUvc3JjL2Z4Y3J0L2Z4X2Jhc2ljX3dzdHJpbmdfdW5pdHRlc3QuY3BwJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y3J0L2Z4X2JpZGlfdW5pdHRlc3QuY3BwJywKKyAgICAgICAgJ2NvcmUvc3JjL2Z4Y3J0L2Z4X2V4dGVuc2lvbl91bml0dGVzdC5jcHAnLAorICAgICAgICAnY29yZS9zcmMvZnhjcnQvZnhfc3lzdGVtX3VuaXR0ZXN0LmNwcCcsCiAgICAgICAgICd0ZXN0aW5nL2Z4X3N0cmluZ190ZXN0aGVscGVycy5oJywKICAgICAgICAgJ3Rlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmNwcCcsCiAgICAgICBdLAorICAgICAgJ2NvbmRpdGlvbnMnOiBbCisgICAgICAgIFsncGRmX2VuYWJsZV94ZmE9PTEnLCB7CisgICAgICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICAgICAneGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXJfdW5pdHRlc3QuY3BwJywKKyAgICAgICAgICAgICd4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfdXRpbHNfaW1wX3VuaXR0ZXN0LmNwcCcsCisgICAgICAgICAgXSwKKyAgICAgICAgfV0sCisgICAgICBdLAogICAgIH0sCiAgICAgewogICAgICAgJ3RhcmdldF9uYW1lJzogJ3BkZml1bV9lbWJlZGRlcnRlc3RzJywKQEAgLTg1MiwxOSArNzgyLDIxIEBACiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9nbW9jay5neXA6Z21vY2snLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLAotICAgICAgICAnPChERVBUSCkvdjgvdG9vbHMvZ3lwL3Y4Lmd5cDp2OF9saWJwbGF0Zm9ybScsCiAgICAgICAgICdwZGZpdW0nLAotICAgICAgXSwKLSAgICAgICdpbmNsdWRlX2RpcnMnOiBbCi0gICAgICAgICc8KERFUFRIKScsCi0gICAgICAgICc8KERFUFRIKS92OCcsCisgICAgICAgICd0ZXN0X3N1cHBvcnQnLAogICAgICAgXSwKICAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnY29yZS9zcmMvZnBkZmFwaS9mcGRmX3BhZ2UvZnBkZl9wYWdlX2Z1bmNfZW1iZWRkZXJ0ZXN0LmNwcCcsCiAgICAgICAgICdjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZV9lbWJlZGRlcnRlc3QuY3BwJywKICAgICAgICAgJ2NvcmUvc3JjL2ZwZGZhcGkvZnBkZl9wYXJzZXIvZnBkZl9wYXJzZXJfcGFyc2VyX2VtYmVkZGVydGVzdC5jcHAnLAorICAgICAgICAnY29yZS9zcmMvZnBkZmFwaS9mcGRmX3JlbmRlci9mcGRmX3JlbmRlcl9sb2FkaW1hZ2VfZW1iZWRkZXJ0ZXN0LmNwcCcsCisgICAgICAgICdjb3JlL3NyYy9mcGRmYXBpL2ZwZGZfcmVuZGVyL2ZwZGZfcmVuZGVyX3BhdHRlcm5fZW1iZWRkZXJ0ZXN0LmNwcCcsCiAgICAgICAgICdmcGRmc2RrL3NyYy9mcGRmX2RhdGFhdmFpbF9lbWJlZGRlcnRlc3QuY3BwJywKICAgICAgICAgJ2ZwZGZzZGsvc3JjL2ZwZGZkb2NfZW1iZWRkZXJ0ZXN0LmNwcCcsCisgICAgICAgICdmcGRmc2RrL3NyYy9mcGRmZWRpdF9lbWJlZGRlcnRlc3QuY3BwJywKKyAgICAgICAgJ2ZwZGZzZGsvc3JjL2ZwZGZleHRfZW1iZWRkZXJ0ZXN0LmNwcCcsCiAgICAgICAgICdmcGRmc2RrL3NyYy9mcGRmZm9ybWZpbGxfZW1iZWRkZXJ0ZXN0LmNwcCcsCisgICAgICAgICdmcGRmc2RrL3NyYy9mcGRmc2F2ZV9lbWJlZGRlcnRlc3QuY3BwJywKICAgICAgICAgJ2ZwZGZzZGsvc3JjL2ZwZGZ0ZXh0X2VtYmVkZGVydGVzdC5jcHAnLAogICAgICAgICAnZnBkZnNkay9zcmMvZnBkZnZpZXdfY19hcGlfdGVzdC5jJywKICAgICAgICAgJ2ZwZGZzZGsvc3JjL2ZwZGZ2aWV3X2NfYXBpX3Rlc3QuaCcsCkBAIC04NzMsOSArODA1LDgxIEBACiAgICAgICAgICd0ZXN0aW5nL2VtYmVkZGVyX3Rlc3QuaCcsCiAgICAgICAgICd0ZXN0aW5nL2VtYmVkZGVyX3Rlc3RfbW9ja19kZWxlZ2F0ZS5oJywKICAgICAgICAgJ3Rlc3RpbmcvZW1iZWRkZXJfdGVzdF90aW1lcl9oYW5kbGluZ19kZWxlZ2F0ZS5oJywKKyAgICAgIF0sCisgICAgICAnY29uZGl0aW9ucyc6IFsKKyAgICAgICAgWydwZGZfZW5hYmxlX3hmYT09MScsIHsKKyAgICAgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgICAgICd4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfcGFyc2VyX2ltcF9lbWJlZGRlcnRlc3QuY3BwJywKKyAgICAgICAgICBdLAorICAgICAgICB9XSwKKyAgICAgICAgWydwZGZfZW5hYmxlX3Y4PT0xJywgeworICAgICAgICAgICdpbmNsdWRlX2RpcnMnOiBbCisgICAgICAgICAgICAnPChERVBUSCkvdjgnLAorICAgICAgICAgICAgJzwoREVQVEgpL3Y4L2luY2x1ZGUnLAorICAgICAgICAgIF0sCisgICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgICAgICc8KERFUFRIKS92OC90b29scy9neXAvdjguZ3lwOnY4JywKKyAgICAgICAgICAgICc8KERFUFRIKS92OC90b29scy9neXAvdjguZ3lwOnY4X2xpYnBsYXRmb3JtJywKKyAgICAgICAgICBdLAorICAgICAgICAgICdzb3VyY2VzJzogWworICAgICAgICAgICAgJ2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvcHVibGljX21ldGhvZHNfZW1iZWRkZXJ0ZXN0LmNwcCcsCisgICAgICAgICAgICAnZnBkZnNkay9zcmMvanNhcGkvZnhqc192OF9lbWJlZGRlcnRlc3QuY3BwJywKKyAgICAgICAgICAgICd0ZXN0aW5nL2pzX2VtYmVkZGVyX3Rlc3QuY3BwJywKKyAgICAgICAgICAgICd0ZXN0aW5nL2pzX2VtYmVkZGVyX3Rlc3QuaCcsCisgICAgICAgICAgXSwKKyAgICAgICAgfV0sCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3Rlc3Rfc3VwcG9ydCcsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnPChERVBUSCkvdGVzdGluZy9nbW9jay5neXA6Z21vY2snLAorICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLAorICAgICAgXSwKKyAgICAgICdzb3VyY2VzJzogWwogICAgICAgICAndGVzdGluZy9meF9zdHJpbmdfdGVzdGhlbHBlcnMuY3BwJywKICAgICAgICAgJ3Rlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmgnLAorICAgICAgICAndGVzdGluZy90ZXN0X3N1cHBvcnQuY3BwJywKKyAgICAgICAgJ3Rlc3RpbmcvdGVzdF9zdXBwb3J0LmgnLAorICAgICAgICAndGVzdGluZy91dGlscy9wYXRoX3NlcnZpY2UuY3BwJywKKyAgICAgIF0sCisgICAgICAnY29uZGl0aW9ucyc6IFsKKyAgICAgICAgWydwZGZfZW5hYmxlX3Y4PT0xJywgeworICAgICAgICAgICdpbmNsdWRlX2RpcnMnOiBbCisgICAgICAgICAgICAnPChERVBUSCkvdjgnLAorICAgICAgICAgICAgJzwoREVQVEgpL3Y4L2luY2x1ZGUnLAorICAgICAgICAgIF0sCisgICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgICAgICc8KERFUFRIKS92OC90b29scy9neXAvdjguZ3lwOnY4JywKKyAgICAgICAgICAgICc8KERFUFRIKS92OC90b29scy9neXAvdjguZ3lwOnY4X2xpYnBsYXRmb3JtJywKKyAgICAgICAgICBdLAorICAgICAgICB9XSwKICAgICAgIF0sCiAgICAgfSwKICAgXSwKKyAgJ2NvbmRpdGlvbnMnOiBbCisgICAgWydwZGZfZW5hYmxlX3hmYT09MScsIHsKKyAgICAgICd0YXJnZXRzJzogWworICAgICAgICB7CisgICAgICAgICAgJ3RhcmdldF9uYW1lJzogJ2ZwZGZ4ZmEnLAorICAgICAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAgICAgJ2phdmFzY3JpcHQnLAorICAgICAgICAgICAgJ3hmYS5neXA6eGZhJywKKyAgICAgICAgICBdLAorICAgICAgICAgICdzb3VyY2VzJzogWworICAgICAgICAgICAgJ2ZwZGZzZGsvc3JjL2ZwZGZ4ZmEvZnBkZnhmYV9hcHAuY3BwJywKKyAgICAgICAgICAgICdmcGRmc2RrL3NyYy9mcGRmeGZhL2ZwZGZ4ZmFfZG9jLmNwcCcsCisgICAgICAgICAgICAnZnBkZnNkay9zcmMvZnBkZnhmYS9mcGRmeGZhX3BhZ2UuY3BwJywKKyAgICAgICAgICAgICdmcGRmc2RrL3NyYy9mcGRmeGZhL2ZwZGZ4ZmFfdXRpbC5jcHAnLAorICAgICAgICAgICAgJ2ZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfYXBwLmgnLAorICAgICAgICAgICAgJ2ZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfZG9jLmgnLAorICAgICAgICAgICAgJ2ZwZGZzZGsvaW5jbHVkZS9mcGRmeGZhL2ZwZGZ4ZmFfcGFnZS5oJywKKyAgICAgICAgICAgICdmcGRmc2RrL2luY2x1ZGUvZnBkZnhmYS9mcGRmeGZhX3V0aWwuaCcsCisgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICAgIF0KKyAgICB9XSwKKyAgXQogfQpkaWZmIC0tZ2l0IGEvcHVibGljL0RFUFMgYi9wdWJsaWMvREVQUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDAwNWNhCi0tLSAvZGV2L251bGwKKysrIGIvcHVibGljL0RFUFMKQEAgLTAsMCArMSw4IEBACitpbmNsdWRlX3J1bGVzID0gWworICAjIHB1YmxpYy8gbmVlZHMgdG8gYmUgc3RhbmRhbG9uZS4gRXhwbGljaXRseSBkaXNhbGxvdyBldmVyeXRoaW5nLgorICAnLWNvcmUnLAorICAnLWZwZGZzZGsnLAorICAnLXRlc3RpbmcnLAorICAnLXRoaXJkX3BhcnR5JywKKyAgJy12OCcsCitdCmRpZmYgLS1naXQgYS9wdWJsaWMvZnBkZl9kYXRhYXZhaWwuaCBiL3B1YmxpYy9mcGRmX2RhdGFhdmFpbC5oCmluZGV4IDMxN2EzNTUuLjBmOGZmN2QgMTAwNjQ0Ci0tLSBhL3B1YmxpYy9mcGRmX2RhdGFhdmFpbC5oCisrKyBiL3B1YmxpYy9mcGRmX2RhdGFhdmFpbC5oCkBAIC0xMSwxMSArMTEsMTggQEAKIAogI2luY2x1ZGUgImZwZGZ2aWV3LmgiCiAKLS8qKiBUaGUgcmVzdWx0IG9mIHRoZSBwcm9jZXNzIHdoaWNoIGNoZWNrIGxpbmVhcml6ZWQgUERGLiAqLwotI2RlZmluZSBGU0RLX0lTX0xJTkVBUklaRUQgICAgICAgICAgMQotI2RlZmluZSBGU0RLX05PVF9MSU5FQVJJWkVEICAgICAgICAgMAotI2RlZmluZSBGU0RLX1VOS05PV19MSU5FQVJJWkVEICAgICAgLTEKKyNkZWZpbmUgUERGX0xJTkVBUklaQVRJT05fVU5LTk9XTiAtMQorI2RlZmluZSBQREZfTk9UX0xJTkVBUklaRUQgMAorI2RlZmluZSBQREZfTElORUFSSVpFRCAxCiAKKyNkZWZpbmUgUERGX0RBVEFfRVJST1IgLTEKKyNkZWZpbmUgUERGX0RBVEFfTk9UQVZBSUwgMAorI2RlZmluZSBQREZfREFUQV9BVkFJTCAxCisKKyNkZWZpbmUgUERGX0ZPUk1fRVJST1IgLTEKKyNkZWZpbmUgUERGX0ZPUk1fTk9UQVZBSUwgMAorI2RlZmluZSBQREZfRk9STV9BVkFJTCAxCisjZGVmaW5lIFBERl9GT1JNX05PVEVYSVNUIDIKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKQEAgLTI2LDI4ICszMywyOSBAQAogICogICAgICAgICAgSW50ZXJmYWNlIGZvciBjaGVja2luZyB3aGV0aGVyIHRoZSBzZWN0aW9uIG9mIHRoZSBmaWxlIGlzIGF2YWlsYWJsZS4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgX0ZYX0ZJTEVBVkFJTCB7Ci0gICAgLyoqCi0gICAgICogVmVyc2lvbiBudW1iZXIgb2YgdGhlIGludGVyZmFjZS4gQ3VycmVudGx5IG11c3QgYmUgMS4KLSAgICAgKi8KLSAgICBpbnQgdmVyc2lvbjsKKyAgLyoqCisgICAqIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UuIEN1cnJlbnRseSBtdXN0IGJlIDEuCisgICAqLworICBpbnQgdmVyc2lvbjsKIAotICAgIC8qKgotICAgICAqIE1ldGhvZDogSXNEYXRhQXZhaWwKLSAgICAgKiAgICAgIFJlcG9ydCB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZGF0YSBzZWN0aW9uIGlzIGF2YWlsYWJsZS4gQSBzZWN0aW9uIGlzIGF2YWlsYWJsZSBvbmx5IGlmIGFsbCBieXRlcyBpbiB0aGUgc2VjdGlvbiBpcyBhdmFpbGFibGUuCi0gICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgICogICAgICAxCi0gICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgICogICAgICBZZXMKLSAgICAgKiBQYXJhbWV0ZXJzOgotICAgICAqICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICAqICAgICAgb2Zmc2V0ICAgICAgLSAgIFRoZSBvZmZzZXQgb2YgdGhlIGRhdGEgc2VjdGlvbiBpbiB0aGUgZmlsZS4KLSAgICAgKiAgICAgIHNpemUgICAgICAgIC0gICBUaGUgc2l6ZSBvZiB0aGUgZGF0YSBzZWN0aW9uCi0gICAgICogUmV0dXJuIFZhbHVlOgotICAgICAqICAgICAgdHJ1ZSBtZWFucyB0aGUgc3BlY2lmaWVkIGRhdGEgc2VjdGlvbiBpcyBhdmFpbGFibGUuCi0gICAgICogQ29tbWVudHM6Ci0gICAgICogICAgICBDYWxsZWQgYnkgRm94aXQgU0RLIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGRhdGEgc2VjdGlvbiBpcyByZWFkeS4KLSAgICAgKi8KLSAgICBGUERGX0JPT0wgKCpJc0RhdGFBdmFpbCkoc3RydWN0IF9GWF9GSUxFQVZBSUwqIHBUaGlzLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisgIC8qKgorICAgKiBNZXRob2Q6IElzRGF0YUF2YWlsCisgICAqICAgICAgUmVwb3J0IHdoZXRoZXIgdGhlIHNwZWNpZmllZCBkYXRhIHNlY3Rpb24gaXMgYXZhaWxhYmxlLiBBIHNlY3Rpb24gaXMKKyAgICogYXZhaWxhYmxlIG9ubHkgaWYgYWxsIGJ5dGVzIGluIHRoZSBzZWN0aW9uIGlzIGF2YWlsYWJsZS4KKyAgICogSW50ZXJmYWNlIFZlcnNpb246CisgICAqICAgICAgMQorICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgICogICAgICBZZXMKKyAgICogUGFyYW1ldGVyczoKKyAgICogICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICAqICAgICAgb2Zmc2V0ICAgICAgLSAgIFRoZSBvZmZzZXQgb2YgdGhlIGRhdGEgc2VjdGlvbiBpbiB0aGUgZmlsZS4KKyAgICogICAgICBzaXplICAgICAgICAtICAgVGhlIHNpemUgb2YgdGhlIGRhdGEgc2VjdGlvbgorICAgKiBSZXR1cm4gVmFsdWU6CisgICAqICAgICAgdHJ1ZSBtZWFucyB0aGUgc3BlY2lmaWVkIGRhdGEgc2VjdGlvbiBpcyBhdmFpbGFibGUuCisgICAqIENvbW1lbnRzOgorICAgKiAgICAgIENhbGxlZCBieSBGb3hpdCBTREsgdG8gY2hlY2sgd2hldGhlciB0aGUgZGF0YSBzZWN0aW9uIGlzIHJlYWR5LgorICAgKi8KKyAgRlBERl9CT09MICgqSXNEYXRhQXZhaWwpKHN0cnVjdCBfRlhfRklMRUFWQUlMKiBwVGhpcywgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpOwogfSBGWF9GSUxFQVZBSUw7CiAKIHR5cGVkZWYgdm9pZCogRlBERl9BVkFJTDsKQEAgLTU3LDIxICs2NSwyNiBAQAogKiAgICAgICAgICAgQ3JlYXRlIGEgZG9jdW1lbnQgYXZhaWxhYmlsaXR5IHByb3ZpZGVyLgogKgogKiBQYXJhbWV0ZXJzOgotKiAgICAgICAgICAgZmlsZV9hdmFpbCAgLSAgIFBvaW50ZXIgdG8gZmlsZSBhdmFpbGFiaWxpdHkgaW50ZXJmYWNlIHRvIGNoZWNrIGF2YWlsYWJpbGl0eSBvZiBmaWxlIGRhdGEuCi0qICAgICAgICAgICBmaWxlICAgICAgICAtICAgUG9pbnRlciB0byBhIGZpbGUgYWNjZXNzIGludGVyZmFjZSBmb3IgcmVhZGluZyBkYXRhIGZyb20gZmlsZS4KKyogICAgICAgICAgIGZpbGVfYXZhaWwgIC0gICBQb2ludGVyIHRvIGZpbGUgYXZhaWxhYmlsaXR5IGludGVyZmFjZSB0byBjaGVjaworKiBhdmFpbGFiaWxpdHkgb2YgZmlsZSBkYXRhLgorKiAgICAgICAgICAgZmlsZSAgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBmaWxlIGFjY2VzcyBpbnRlcmZhY2UgZm9yIHJlYWRpbmcgZGF0YQorKiBmcm9tIGZpbGUuCiAqIFJldHVybiB2YWx1ZToKICogICAgICAgICAgIEEgaGFuZGxlIHRvIHRoZSBkb2N1bWVudCBhdmFpbGFiaWxpdHkgcHJvdmlkZXIuIE5VTEwgZm9yIGVycm9yLgogKiBDb21tZW50czoKLSogICAgICAgICAgIEFwcGxpY2F0aW9uIG11c3QgY2FsbCBGUERGQXZhaWxfRGVzdHJveSB3aGVuIGRvbmUgd2l0aCB0aGUgYXZhaWxhYmlsaXR5IHByb3ZpZGVyLgorKiAgICAgICAgICAgQXBwbGljYXRpb24gbXVzdCBjYWxsIEZQREZBdmFpbF9EZXN0cm95IHdoZW4gZG9uZSB3aXRoIHRoZQorKiBhdmFpbGFiaWxpdHkgcHJvdmlkZXIuCiAqLwotRExMRVhQT1JUIEZQREZfQVZBSUwgU1REQ0FMTCBGUERGQXZhaWxfQ3JlYXRlKEZYX0ZJTEVBVkFJTCogZmlsZV9hdmFpbCwgRlBERl9GSUxFQUNDRVNTKiBmaWxlKTsKK0RMTEVYUE9SVCBGUERGX0FWQUlMIFNURENBTEwgRlBERkF2YWlsX0NyZWF0ZShGWF9GSUxFQVZBSUwqIGZpbGVfYXZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9GSUxFQUNDRVNTKiBmaWxlKTsKIAogLyoqCiAqIEZ1bmN0aW9uOiBGUERGQXZhaWxfRGVzdHJveQogKiAgICAgICAgICAgRGVzdHJveSBhIGRvY3VtZW50IGF2YWlsaWJpdHkgcHJvdmlkZXIuCiAqCiAqIFBhcmFtZXRlcnM6Ci0qICAgICAgICAgICBhdmFpbCAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciByZXR1cm5lZCBieSBGUERGQXZhaWxfQ3JlYXRlCisqICAgICAgICAgICBhdmFpbCAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciByZXR1cm5lZCBieQorKiBGUERGQXZhaWxfQ3JlYXRlCiAqIFJldHVybiBWYWx1ZToKICogICAgICAgICAgIE5vbmUuCiAqLwpAQCAtNzksNjMgKzkyLDgxIEBACiAKIC8qKgogICogSW50ZXJmYWNlOiBGWF9ET1dOTE9BREhJTlRTCi0gKiAgICAgICAgICBEb3dubG9hZCBoaW50cyBpbnRlcmZhY2UuIFVzZWQgdG8gcmVjZWl2ZSBoaW50cyBmb3IgZnVydGhlciBkb3dubG9hZGluZy4KKyAqICAgICAgICAgIERvd25sb2FkIGhpbnRzIGludGVyZmFjZS4gVXNlZCB0byByZWNlaXZlIGhpbnRzIGZvciBmdXJ0aGVyCisgKiBkb3dubG9hZGluZy4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgX0ZYX0RPV05MT0FESElOVFMgewotICAgIC8qKgotICAgICAqIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UuIEN1cnJlbnRseSBtdXN0IGJlIDEuCi0gICAgICovCi0gICAgaW50IHZlcnNpb247CisgIC8qKgorICAgKiBWZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlLiBDdXJyZW50bHkgbXVzdCBiZSAxLgorICAgKi8KKyAgaW50IHZlcnNpb247CiAKLSAgICAvKioKLSAgICAgKiBNZXRob2Q6IEFkZFNlZ21lbnQKLSAgICAgKiAgICAgIEFkZCBhIHNlY3Rpb24gdG8gYmUgZG93bmxvYWRlZC4KLSAgICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAgKiAgICAgIDEKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAgKiAgICAgIFllcwotICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICogICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgICogICAgICBvZmZzZXQgICAgICAtICAgVGhlIG9mZnNldCBvZiB0aGUgaGludCByZXBvcnRlZCB0byBiZSBkb3dubG9hZGVkLgotICAgICAqICAgICAgc2l6ZSAgICAgICAgLSAgIFRoZSBzaXplIG9mIHRoZSBoaW50IHJlcG9ydGVkIHRvIGJlIGRvd25sb2FkZWQuCi0gICAgICogUmV0dXJuIFZhbHVlOgotICAgICAqICAgICAgTm9uZS4KLSAgICAgKiBDb21tZW50czoKLSAgICAgKiAgICAgIENhbGxlZCBieSBGb3hpdCBTREsgdG8gcmVwb3J0IHNvbWUgZG93bmxvYWRpbmcgaGludHMgZm9yIGRvd25sb2FkIG1hbmFnZXIuCi0gICAgICogICAgICBUaGUgcG9zaXRpb24gYW5kIHNpemUgb2Ygc2VjdGlvbiBtYXkgYmUgbm90IGFjY3VyYXRlLCBwYXJ0IG9mIHRoZSBzZWN0aW9uIG1pZ2h0IGJlIGFscmVhZHkgYXZhaWxhYmxlLgotICAgICAqICAgICAgVGhlIGRvd25sb2FkIG1hbmFnZXIgbXVzdCBkZWFsIHdpdGggdGhhdCB0byBtYXhpbWl6ZSBkb3dubG9hZCBlZmZpY2llbmN5LgotICAgICAqLwotICAgIHZvaWQgKCpBZGRTZWdtZW50KShzdHJ1Y3QgX0ZYX0RPV05MT0FESElOVFMqIHBUaGlzLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisgIC8qKgorICAgKiBNZXRob2Q6IEFkZFNlZ21lbnQKKyAgICogICAgICBBZGQgYSBzZWN0aW9uIHRvIGJlIGRvd25sb2FkZWQuCisgICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAgKiAgICAgIDEKKyAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICAqICAgICAgWWVzCisgICAqIFBhcmFtZXRlcnM6CisgICAqICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAgKiAgICAgIG9mZnNldCAgICAgIC0gICBUaGUgb2Zmc2V0IG9mIHRoZSBoaW50IHJlcG9ydGVkIHRvIGJlIGRvd25sb2FkZWQuCisgICAqICAgICAgc2l6ZSAgICAgICAgLSAgIFRoZSBzaXplIG9mIHRoZSBoaW50IHJlcG9ydGVkIHRvIGJlIGRvd25sb2FkZWQuCisgICAqIFJldHVybiBWYWx1ZToKKyAgICogICAgICBOb25lLgorICAgKiBDb21tZW50czoKKyAgICogICAgICBDYWxsZWQgYnkgRm94aXQgU0RLIHRvIHJlcG9ydCBzb21lIGRvd25sb2FkaW5nIGhpbnRzIGZvciBkb3dubG9hZAorICAgKiBtYW5hZ2VyLgorICAgKiAgICAgIFRoZSBwb3NpdGlvbiBhbmQgc2l6ZSBvZiBzZWN0aW9uIG1heSBiZSBub3QgYWNjdXJhdGUsIHBhcnQgb2YgdGhlCisgICAqIHNlY3Rpb24gbWlnaHQgYmUgYWxyZWFkeSBhdmFpbGFibGUuCisgICAqICAgICAgVGhlIGRvd25sb2FkIG1hbmFnZXIgbXVzdCBkZWFsIHdpdGggdGhhdCB0byBtYXhpbWl6ZSBkb3dubG9hZAorICAgKiBlZmZpY2llbmN5LgorICAgKi8KKyAgdm9pZCAoKkFkZFNlZ21lbnQpKHN0cnVjdCBfRlhfRE9XTkxPQURISU5UUyogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpOwogfSBGWF9ET1dOTE9BREhJTlRTOwogCiAvKioKICogRnVuY3Rpb246IEZQREZBdmFpbF9Jc0RvY0F2YWlsCi0qICAgICAgICAgICBDaGVjayB3aGV0aGVyIHRoZSBkb2N1bWVudCBpcyByZWFkeSBmb3IgbG9hZGluZywgaWYgbm90LCBnZXQgZG93bmxvYWQgaGludHMuCisqICAgICAgICAgICBDaGVjayB3aGV0aGVyIHRoZSBkb2N1bWVudCBpcyByZWFkeSBmb3IgbG9hZGluZywgaWYgbm90LCBnZXQKKyogZG93bmxvYWQgaGludHMuCiAqCiAqIFBhcmFtZXRlcnM6Ci0qICAgICAgICAgICBhdmFpbCAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciByZXR1cm5lZCBieSBGUERGQXZhaWxfQ3JlYXRlCi0qICAgICAgICAgICBoaW50cyAgICAgICAtICAgUG9pbnRlciB0byBhIGRvd25sb2FkIGhpbnRzIGludGVyZmFjZSwgcmVjZWl2aW5nIGdlbmVyYXRlZCBoaW50cworKiAgICAgICAgICAgYXZhaWwgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudCBhdmFpbGFiaWxpdHkgcHJvdmlkZXIgcmV0dXJuZWQgYnkKKyogRlBERkF2YWlsX0NyZWF0ZQorKiAgICAgICAgICAgaGludHMgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3dubG9hZCBoaW50cyBpbnRlcmZhY2UsIHJlY2VpdmluZworKiBnZW5lcmF0ZWQgaGludHMKICogUmV0dXJuIHZhbHVlOgotKiAgICAgICAgICAgTm9uLXplcm8gZm9yIHBhZ2UgaXMgZnVsbHkgYXZhaWxhYmxlLCAwIGZvciBwYWdlIG5vdCB5ZXQgYXZhaWxhYmxlLgorKiAgICAgICAgICAgUERGX0RBVEFfRVJST1I6IEEgY29tbW9uIGVycm9yIGlzIHJldHVybmVkLiBJdCBjYW4ndCB0ZWxsCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlaHRlciBkYXRhIGFyZSBhdmFpbGFiZSBvciBub3QuCisqICAgICAgICAgICBQREZfREFUQV9OT1RBVkFJTDogRGF0YSBhcmUgbm90IHlldCBhdmFpbGFibGUuCisqICAgICAgICAgICBQREZfREFUQV9BVkFJTDogRGF0YSBhcmUgYXZhaWxhYmxlLgogKiBDb21tZW50czoKLSogICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW5ldmVyIG5ldyBkYXRhIGFycml2ZWQsIGFuZCBwcm9jZXNzIGFsbCB0aGUKLSogICAgICAgICAgIGdlbmVyYXRlZCBkb3dubG9hZCBoaW50cyBpZiBhbnksIHVudGlsIHRoZSBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIHZhbHVlLiBUaGVuIHRoZQotKiAgICAgICAgICAgYXBwbGljYXRpb24gY2FuIGNhbGwgRlBERkF2YWlsX0dldERvY3VtZW50KCkgdG8gZ2V0IGEgZG9jdW1lbnQgaGFuZGxlLgorKiAgICAgICAgICAgQXBwbGljYXRpb25zIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbmV2ZXIgbmV3IGRhdGEgYXJyaXZlZCwKKyogICAgICAgICAgIGFuZCBwcm9jZXNzIGFsbCB0aGUgZ2VuZXJhdGVkIGRvd25sb2FkIGhpbnRzIGlmIGFueSwgdW50aWwgdGhlCisqICAgICAgICAgICBmdW5jdGlvbiByZXR1cm5zIFBERl9EQVRBX0VSUk9SIG9yIFBERl9EQVRBX0FWQUlMLiBUaGVuCisqICAgICAgICAgICBhcHBsaWNhdGlvbnMgY2FuIGNhbGwgRlBERkF2YWlsX0dldERvY3VtZW50KCkgdG8gZ2V0IGEgZG9jdW1lbnQKKyogICAgICAgICAgIGhhbmRsZS4KICovCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERkF2YWlsX0lzRG9jQXZhaWwoRlBERl9BVkFJTCBhdmFpbCwgRlhfRE9XTkxPQURISU5UUyogaGludHMpOworRExMRVhQT1JUIGludCBTVERDQUxMCitGUERGQXZhaWxfSXNEb2NBdmFpbChGUERGX0FWQUlMIGF2YWlsLCBGWF9ET1dOTE9BREhJTlRTKiBoaW50cyk7CiAKIC8qKgogKiBGdW5jdGlvbjogRlBERkF2YWlsX0dldERvY3VtZW50CiAqICAgICAgICAgICBHZXQgZG9jdW1lbnQgZnJvbSB0aGUgYXZhaWxhYmlsaXR5IHByb3ZpZGVyLgogKgogKiBQYXJhbWV0ZXJzOgotKiAgICAgICAgICAgYXZhaWwgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudCBhdmFpbGFiaWxpdHkgcHJvdmlkZXIgcmV0dXJuZWQgYnkgRlBERkF2YWlsX0NyZWF0ZQorKiAgICAgICAgICAgYXZhaWwgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudCBhdmFpbGFiaWxpdHkgcHJvdmlkZXIgcmV0dXJuZWQgYnkKKyogRlBERkF2YWlsX0NyZWF0ZQogKiAgICAgcGFzc3dvcmQgIC0gICBPcHRpb25hbCBwYXNzd29yZCBmb3IgZGVjcnlwdGluZyB0aGUgUERGIGZpbGUuCiAqIFJldHVybiB2YWx1ZToKICogICAgICAgICAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQuCiAqIENvbW1lbnRzOgotKiAgICAgICAgICAgQWZ0ZXIgRlBERkF2YWlsX0lzRG9jQXZhaWwoKSByZXR1cm5zIFRSVUUsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvCi0qICAgICAgICAgICBnZXQgdGhlIGRvY3VtZW50IGhhbmRsZS4gVG8gY2xvc2UgdGhlIGRvY3VtZW50LCB1c2UgRlBERl9DbG9zZURvY3VtZW50IGZ1bmN0aW9uLgorKiAgICAgICAgICAgQWZ0ZXIgRlBERkF2YWlsX0lzRG9jQXZhaWwoKSByZXR1cm5zIFRSVUUsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQKKyogY2FsbCB0aGlzIGZ1bmN0aW9uIHRvCisqICAgICAgICAgICBnZXQgdGhlIGRvY3VtZW50IGhhbmRsZS4gVG8gY2xvc2UgdGhlIGRvY3VtZW50LCB1c2UKKyogRlBERl9DbG9zZURvY3VtZW50IGZ1bmN0aW9uLgogKi8KIERMTEVYUE9SVCBGUERGX0RPQ1VNRU5UIFNURENBTEwgRlBERkF2YWlsX0dldERvY3VtZW50KEZQREZfQVZBSUwgYXZhaWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgcGFzc3dvcmQpOwpAQCAtMTQ5LDcgKzE4MCw4IEBACiAqIFJldHVybiBWYWx1ZToKICogICAgICAgICAgIFplcm8tYmFzZWQgaW5kZXggZm9yIHRoZSBmaXJzdCBhdmFpbGFibGUgcGFnZS4KICogQ29tbWVudHM6Ci0qICAgICAgICAgICBGb3IgbW9zdCBsaW5lYXJpemVkIFBERnMsIHRoZSBmaXJzdCBhdmFpbGFibGUgcGFnZSB3b3VsZCBiZSBqdXN0IHRoZSBmaXJzdCBwYWdlLCBob3dldmVyLAorKiAgICAgICAgICAgRm9yIG1vc3QgbGluZWFyaXplZCBQREZzLCB0aGUgZmlyc3QgYXZhaWxhYmxlIHBhZ2Ugd291bGQgYmUganVzdCB0aGUKKyogZmlyc3QgcGFnZSwgaG93ZXZlciwKICogICAgICAgICAgIHNvbWUgUERGcyBtaWdodCBtYWtlIG90aGVyIHBhZ2UgdG8gYmUgdGhlIGZpcnN0IGF2YWlsYWJsZSBwYWdlLgogKiAgICAgICAgICAgRm9yIG5vbi1saW5lYXJpemVkIFBERiwgdGhpcyBmdW5jdGlvbiB3aWxsIGFsd2F5cyByZXR1cm4gemVyby4KICovCkBAIC0xNTcsNjEgKzE4OSw4MiBAQAogCiAvKioKICogRnVuY3Rpb246IEZQREZBdmFpbF9Jc1BhZ2VBdmFpbAotKiAgICAgICAgICAgQ2hlY2sgd2hldGhlciBhIHBhZ2UgaXMgcmVhZHkgZm9yIGxvYWRpbmcsIGlmIG5vdCwgZ2V0IGRvd25sb2FkIGhpbnRzLgorKiAgICAgICAgICAgQ2hlY2sgd2hldGhlciBhIHBhZ2UgaXMgcmVhZHkgZm9yIGxvYWRpbmcsIGlmIG5vdCwgZ2V0IGRvd25sb2FkCisqIGhpbnRzLgogKgogKiBQYXJhbWV0ZXJzOgotKiAgICAgICAgICAgYXZhaWwgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudCBhdmFpbGFiaWxpdHkgcHJvdmlkZXIgcmV0dXJuZWQgYnkgRlBERkF2YWlsX0NyZWF0ZQorKiAgICAgICAgICAgYXZhaWwgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudCBhdmFpbGFiaWxpdHkgcHJvdmlkZXIgcmV0dXJuZWQgYnkKKyogRlBERkF2YWlsX0NyZWF0ZQogKiAgICAgICAgICAgcGFnZV9pbmRleCAgLSAgIEluZGV4IG51bWJlciBvZiB0aGUgcGFnZS4gMCBmb3IgdGhlIGZpcnN0IHBhZ2UuCi0qICAgICAgICAgICBoaW50cyAgICAgICAtICAgUG9pbnRlciB0byBhIGRvd25sb2FkIGhpbnRzIGludGVyZmFjZSwgcmVjZWl2aW5nIGdlbmVyYXRlZCBoaW50cworKiAgICAgICAgICAgaGludHMgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3dubG9hZCBoaW50cyBpbnRlcmZhY2UsIHJlY2VpdmluZworKiBnZW5lcmF0ZWQgaGludHMKICogUmV0dXJuIHZhbHVlOgotKiAgICAgICAgICAgTm9uLXplcm8gZm9yIHBhZ2UgaXMgZnVsbHkgYXZhaWxhYmxlLCAwIGZvciBwYWdlIG5vdCB5ZXQgYXZhaWxhYmxlLgorKiAgICAgICAgICAgUERGX0RBVEFfRVJST1I6IEEgY29tbW9uIGVycm9yIGlzIHJldHVybmVkLiBJdCBjYW4ndCB0ZWxsCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlaHRlciBkYXRhIGFyZSBhdmFpbGFiZSBvciBub3QuCisqICAgICAgICAgICBQREZfREFUQV9OT1RBVkFJTDogRGF0YSBhcmUgbm90IHlldCBhdmFpbGFibGUuCisqICAgICAgICAgICBQREZfREFUQV9BVkFJTDogRGF0YSBhcmUgYXZhaWxhYmxlLgogKiBDb21tZW50czoKLSogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2FsbCBiZSBjYWxsZWQgb25seSBhZnRlciBGUERGQXZhaWxfR2V0RG9jdW1lbnQgaWYgY2FsbGVkLgotKiAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbmV2ZXIgbmV3IGRhdGEgYXJyaXZlZCwgYW5kIHByb2Nlc3MgYWxsIHRoZQotKiAgICAgICAgICAgZ2VuZXJhdGVkIGRvd25sb2FkIGhpbnRzIGlmIGFueSwgdW50aWwgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gdmFsdWUuIFRoZW4gdGhlCi0qICAgICAgICAgICBhcHBsaWNhdGlvbiBjYW4gcGVyZm9ybSBwYWdlIGxvYWRpbmcuCisqICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgb25seSBhZnRlciBGUERGQXZhaWxfR2V0RG9jdW1lbnQgaXMKKyogICAgICAgICAgIGNhbGxlZC4gQXBwbGljYXRpb25zIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbmV2ZXIgbmV3IGRhdGEKKyogICAgICAgICAgIGFycml2ZWQgYW5kIHByb2Nlc3MgYWxsIHRoZSBnZW5lcmF0ZWQgZG93bmxvYWQgaGludHMgaWYgYW55LCB1bnRpbAorKiAgICAgICAgICAgdGhpcyBmdW5jdGlvbiByZXR1cm5zIFBERl9EQVRBX0VSUk9SIG9yIFBERl9EQVRBX0FWQUlMLiBUaGVuCisqICAgICAgICAgICBhcHBsaWNhdGlvbnMgY2FuIHBlcmZvcm0gcGFnZSBsb2FkaW5nLgogKi8KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGQXZhaWxfSXNQYWdlQXZhaWwoRlBERl9BVkFJTCBhdmFpbCwgaW50IHBhZ2VfaW5kZXgsIEZYX0RPV05MT0FESElOVFMqIGhpbnRzKTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGQXZhaWxfSXNQYWdlQXZhaWwoRlBERl9BVkFJTCBhdmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RPV05MT0FESElOVFMqIGhpbnRzKTsKIAogLyoqCiAqIEZ1bmN0aW9uOiBGUERGQXZhaWxfSVNGb3JtQXZhaWwKLSogICAgICAgICAgIENoZWNrIHdoZXRoZXIgRm9ybSBkYXRhIGlzIHJlYWR5IGZvciBpbml0LCBpZiBub3QsIGdldCBkb3dubG9hZCBoaW50cy4KKyogICAgICAgICAgIENoZWNrIHdoZXRoZXIgRm9ybSBkYXRhIGlzIHJlYWR5IGZvciBpbml0LCBpZiBub3QsIGdldCBkb3dubG9hZAorKiBoaW50cy4KICoKICogUGFyYW1ldGVyczoKLSogICAgICAgICAgIGF2YWlsICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQgYXZhaWxhYmlsaXR5IHByb3ZpZGVyIHJldHVybmVkIGJ5IEZQREZBdmFpbF9DcmVhdGUKLSogICAgICAgICAgIGhpbnRzICAgICAgIC0gICBQb2ludGVyIHRvIGEgZG93bmxvYWQgaGludHMgaW50ZXJmYWNlLCByZWNlaXZpbmcgZ2VuZXJhdGVkIGhpbnRzCisqICAgICAgICAgICBhdmFpbCAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciByZXR1cm5lZCBieQorKiBGUERGQXZhaWxfQ3JlYXRlCisqICAgICAgICAgICBoaW50cyAgICAgICAtICAgUG9pbnRlciB0byBhIGRvd25sb2FkIGhpbnRzIGludGVyZmFjZSwgcmVjZWl2aW5nCisqIGdlbmVyYXRlZCBoaW50cwogKiBSZXR1cm4gdmFsdWU6Ci0qICAgICAgICAgICBOb24temVybyBmb3IgRm9ybSBkYXRhIGlzIGZ1bGx5IGF2YWlsYWJsZSwgMCBmb3IgRm9ybSBkYXRhIG5vdCB5ZXQgYXZhaWxhYmxlLgotKiAgICAgICAgICAgRGV0YWlsczogLTEgLSBlcnJvciwgdGhlIGlucHV0IHBhcmFtZXRlciBub3QgY29ycmVjdCwgc3VjaCBhcyBoaW50cyBpcyBudWxsLgotKiAgICAgICAgICAgICAgICAgICAgMCAgLSBkYXRhIG5vdCBhdmFpbGFibGUKLSogICAgICAgICAgICAgICAgICAgIDEgIC0gZGF0YSBhdmFpbGFibGUKLSogICAgICAgICAgICAgICAgICAgIDIgIC0gbm8gZm9ybSBkYXRhLgorKiAgICAgICAgICAgUERGX0ZPUk1fRVJST1IgICAgLSBBIGNvbW1vbiBlcm9yLCBpbiBnZW5lcmFsIGluY29ycmVjdCBwYXJhbWV0ZXJzLAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlICdoaW50cycgaXMgbnVsbHB0ci4KKyogICAgICAgICAgIFBERl9GT1JNX05PVEFWQUlMIC0gZGF0YSBub3QgYXZhaWxhYmxlCisqICAgICAgICAgICBQREZfRk9STV9BVkFJTCAgICAtIGRhdGEgYXZhaWxhYmxlCisqICAgICAgICAgICBQREZfRk9STV9OT1RFWElTVCAtIG5vIGZvcm0gZGF0YQogKiBDb21tZW50czoKLSogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2FsbCBiZSBjYWxsZWQgb25seSBhZnRlciBGUERGQXZhaWxfR2V0RG9jdW1lbnQgaWYgY2FsbGVkLgotKiAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbmV2ZXIgbmV3IGRhdGEgYXJyaXZlZCwgYW5kIHByb2Nlc3MgYWxsIHRoZQotKiAgICAgICAgICAgZ2VuZXJhdGVkIGRvd25sb2FkIGhpbnRzIGlmIGFueSwgdW50aWwgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gdmFsdWUuIFRoZW4gdGhlCi0qICAgICAgICAgICBhcHBsaWNhdGlvbiBjYW4gcGVyZm9ybSBwYWdlIGxvYWRpbmcuIFJlY29tbWVuZCB0byBjYWxsIEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQKKyogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBvbmx5IGFmdGVyIEZQREZBdmFpbF9HZXREb2N1bWVudCBpcworKiAgICAgICAgICAgY2FsbGVkLgorKiAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbmV2ZXIgbmV3IGRhdGEgYXJyaXZlZCwKKyogYW5kIHByb2Nlc3MgYWxsIHRoZQorKiAgICAgICAgICAgZ2VuZXJhdGVkIGRvd25sb2FkIGhpbnRzIGlmIGFueSwgdW50aWwgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8KKyogdmFsdWUuIFRoZW4gdGhlCisqICAgICAgICAgICBhcHBsaWNhdGlvbiBjYW4gcGVyZm9ybSBwYWdlIGxvYWRpbmcuIFJlY29tbWVuZCB0byBjYWxsCisqIEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQKICogICAgICAgICAgIGFmdGVyIHRoZSBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIHZhbHVlLgogKi8KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGQXZhaWxfSXNGb3JtQXZhaWwoRlBERl9BVkFJTCBhdmFpbCwgRlhfRE9XTkxPQURISU5UUyogaGludHMpOworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZBdmFpbF9Jc0Zvcm1BdmFpbChGUERGX0FWQUlMIGF2YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ET1dOTE9BREhJTlRTKiBoaW50cyk7CiAKIC8qKgogKiBGdW5jdGlvbjogRlBERkF2YWlsX0lzTGluZWFyaXplZAogKiAgICAgICAgICAgVG8gY2hlY2sgd2hldGhlciBhIGRvY3VtZW50IGlzIExpbmVhcml6ZWQgUERGIGZpbGUuCiAqCiAqIFBhcmFtZXRlcnM6Ci0qICAgICAgICAgICBhdmFpbCAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciByZXR1cm5lZCBieSBGUERGQXZhaWxfQ3JlYXRlCisqICAgICAgICAgICBhdmFpbCAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciByZXR1cm5lZCBieQorKiBGUERGQXZhaWxfQ3JlYXRlCiAqIFJldHVybiB2YWx1ZToKLSogICAgICAgICAgIHJldHVybiBUUlVFIG1lYW5zIHRoZSBkb2N1bWVudCBpcyBsaW5lYXJpemVkIFBERiBlbHNlIG5vdC4KLSogICAgICAgICAgIEZTREtfSVNfTElORUFSSVpFRCBpcyBhIGxpbmVhcml6ZSBmaWxlLgotKiAgICAgICAgICAgRlNES19OT1RfTElORUFSSVpFRCBpcyBub3QgYSBsaW5lYXJpemUgZmlsZS4KLSogICAgICAgICAgIEZTREtfVU5LTk9XX0xJTkVBUklaRUQgZG9uJ3Qga25vdyB3aGV0aGVyIHRoZSBmaWxlIGlzIGEgbGluZWFyaXplIGZpbGUuCisqICAgICAgICAgICBQREZfTElORUFSSVpFRCBpcyBhIGxpbmVhcml6ZSBmaWxlLgorKiAgICAgICAgICAgUERGX05PVF9MSU5FQVJJWkVEIGlzIG5vdCBhIGxpbmVhcml6ZSBmaWxlLgorKiAgICAgICAgICAgUERGX0xJTkVBUklaQVRJT05fVU5LTk9XTiBkb2Vzbid0IGtub3cgd2hldGhlciB0aGUgZmlsZSBpcyBhCisqbGluZWFyaXplIGZpbGUuCisqCiAqIENvbW1lbnRzOgotKiAgICAgICAgICAgSXQgcmV0dXJuIFRSVUUvRkFMU0UgYXMgc29vbiBhcyB3ZSBoYXZlIGZpcnN0IDFLIGRhdGEuICBJZiB0aGUgZmlsZSdzIHNpemUgbGVzcyB0aGFuCi0qICAgICAgICAgICAxSyx3ZSBkb24ndCBrbm93biB3aGV0aGVyIHRoZSBQREYgaXMgYSBsaW5lYXJpemVkIGZpbGUuCisqICAgICAgICAgICBJdCByZXR1cm4gUERGX0xJTkVBUklaRUQgb3IgUERGX05PVF9MSU5FQVJJWkVEIGFzIHNvb24gYXMKKyogICAgICAgICAgIHdlIGhhdmUgZmlyc3QgMUsgZGF0YS4gIElmIHRoZSBmaWxlJ3Mgc2l6ZSBsZXNzIHRoYW4gMUssIGl0IHJldHVybnMKKyogICAgICAgICAgIFBERl9MSU5FQVJJWkFUSU9OX1VOS05PV04gYmVjYXVzZSB0aGVyZSBpcyBub3QgZW5vdWdoIGluZm9ybWF0aW9uIHRvCisqICAgICAgICAgICB0ZWxsIHdoZXRoZXIgYSBQREYgZmlsZSBpcyBhIGxpbmVhcml6ZWQgZmlsZSBvciBub3QuCiAqCiAqLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZBdmFpbF9Jc0xpbmVhcml6ZWQoRlBERl9BVkFJTCBhdmFpbCk7CitETExFWFBPUlQgaW50IFNURENBTEwgRlBERkF2YWlsX0lzTGluZWFyaXplZChGUERGX0FWQUlMIGF2YWlsKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9wdWJsaWMvZnBkZl9kb2MuaCBiL3B1YmxpYy9mcGRmX2RvYy5oCmluZGV4IDUxMWJhZGIuLmRlMDVlYjMgMTAwNjQ0Ci0tLSBhL3B1YmxpYy9mcGRmX2RvYy5oCisrKyBiL3B1YmxpYy9mcGRmX2RvYy5oCkBAIC0xNSwyNCArMTUsMzIgQEAKICNlbmRpZgogCiAvLyBGdW5jdGlvbjogRlBERkJvb2ttYXJrX0dldEZpcnN0Q2hpbGQKLS8vICAgICAgICAgIEdldCB0aGUgZmlyc3QgY2hpbGQgb2YgYSBib29rbWFyayBpdGVtLCBvciB0aGUgZmlyc3QgdG9wIGxldmVsIGJvb2ttYXJrIGl0ZW0uCisvLyAgICAgICAgICBHZXQgdGhlIGZpcnN0IGNoaWxkIG9mIGEgYm9va21hcmsgaXRlbSwgb3IgdGhlIGZpcnN0IHRvcCBsZXZlbAorLy8gICAgICAgICAgYm9va21hcmsgaXRlbS4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQgb3IgRlBERl9Mb2FkTWVtRG9jdW1lbnQuCi0vLyAgICAgICAgICBib29rbWFyayAgICAtICAgSGFuZGxlIHRvIHRoZSBjdXJyZW50IGJvb2ttYXJrLiBDYW4gYmUgTlVMTCBpZiB5b3Ugd2FudCB0byBnZXQgdGhlIGZpcnN0IHRvcCBsZXZlbCBpdGVtLgorLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQuIFJldHVybmVkIGJ5CisvLyAgICAgICAgICBGUERGX0xvYWREb2N1bWVudCBvciBGUERGX0xvYWRNZW1Eb2N1bWVudC4KKy8vICAgICAgICAgIGJvb2ttYXJrICAgIC0gICBIYW5kbGUgdG8gdGhlIGN1cnJlbnQgYm9va21hcmsuIENhbiBiZSBOVUxMIGlmIHlvdQorLy8gICAgICAgICAgd2FudCB0byBnZXQgdGhlIGZpcnN0IHRvcCBsZXZlbCBpdGVtLgogLy8gUmV0dXJuIHZhbHVlOgotLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBmaXJzdCBjaGlsZCBvciB0b3AgbGV2ZWwgYm9va21hcmsgaXRlbS4gTlVMTCBpZiBubyBjaGlsZCBvciB0b3AgbGV2ZWwgYm9va21hcmsgZm91bmQuCisvLyAgICAgICAgICBIYW5kbGUgdG8gdGhlIGZpcnN0IGNoaWxkIG9yIHRvcCBsZXZlbCBib29rbWFyayBpdGVtLiBOVUxMIGlmIG5vCisvLyAgICAgICAgICBjaGlsZCBvciB0b3AgbGV2ZWwgYm9va21hcmsgZm91bmQuCiAvLwotRExMRVhQT1JUIEZQREZfQk9PS01BUksgU1REQ0FMTCBGUERGQm9va21hcmtfR2V0Rmlyc3RDaGlsZChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0JPT0tNQVJLIGJvb2ttYXJrKTsKK0RMTEVYUE9SVCBGUERGX0JPT0tNQVJLIFNURENBTEwKK0ZQREZCb29rbWFya19HZXRGaXJzdENoaWxkKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfQk9PS01BUksgYm9va21hcmspOwogCiAvLyBGdW5jdGlvbjogRlBERkJvb2ttYXJrX0dldE5leHRTaWJsaW5nCiAvLyAgICAgICAgICBHZXQgbmV4dCBib29rbWFyayBpdGVtIGF0IHRoZSBzYW1lIGxldmVsLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gdGhlIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBvciBGUERGX0xvYWRNZW1Eb2N1bWVudC4KKy8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gdGhlIGRvY3VtZW50LiBSZXR1cm5lZCBieQorLy8gICAgICAgICAgRlBERl9Mb2FkRG9jdW1lbnQgb3IgRlBERl9Mb2FkTWVtRG9jdW1lbnQuCiAvLyAgICAgICAgICBib29rbWFyayAgICAtICAgSGFuZGxlIHRvIHRoZSBjdXJyZW50IGJvb2ttYXJrLiBDYW5ub3QgYmUgTlVMTC4KIC8vIFJldHVybiB2YWx1ZToKLS8vICAgICAgICAgIEhhbmRsZSB0byB0aGUgbmV4dCBib29rbWFyayBpdGVtIGF0IHRoZSBzYW1lIGxldmVsLiBOVUxMIGlmIHRoaXMgaXMgdGhlIGxhc3QgYm9va21hcmsgYXQgdGhpcyBsZXZlbC4KKy8vICAgICAgICAgIEhhbmRsZSB0byB0aGUgbmV4dCBib29rbWFyayBpdGVtIGF0IHRoZSBzYW1lIGxldmVsLiBOVUxMIGlmIHRoaXMgaXMKKy8vICAgICAgICAgIHRoZSBsYXN0IGJvb2ttYXJrIGF0IHRoaXMgbGV2ZWwuCiAvLwotRExMRVhQT1JUIEZQREZfQk9PS01BUksgU1REQ0FMTCBGUERGQm9va21hcmtfR2V0TmV4dFNpYmxpbmcoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9CT09LTUFSSyBib29rbWFyayk7CitETExFWFBPUlQgRlBERl9CT09LTUFSSyBTVERDQUxMCitGUERGQm9va21hcmtfR2V0TmV4dFNpYmxpbmcoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9CT09LTUFSSyBib29rbWFyayk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGQm9va21hcmtfR2V0VGl0bGUKIC8vICAgICAgICAgIEdldCB0aXRsZSBvZiBhIGJvb2ttYXJrLgpAQCAtNDMsMjcgKzUxLDM4IEBACiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdGhlIHRpdGxlIGNvbnN1bWVzLCBpbmNsdWRpbmcgdHJhaWxpbmcgemVyb3MuCiAvLyBDb21tZW50czoKLS8vICAgICAgICAgIFJlZ2FyZGxlc3Mgb2YgdGhlIHBsYXRmb3JtLCB0aGUgdGl0bGUgaXMgYWx3YXlzIGluIFVURi0xNkxFIGVuY29kaW5nLiBUaGF0IG1lYW5zIHRoZSBidWZmZXIKLS8vICAgICAgICAgIGNhbiBiZSB0cmVhdGVkIGFzIGFuIGFycmF5IG9mIFdPUkQgKG9uIEludGVsIGFuZCBjb21wYXRpYmxlIENQVXMpLCBlYWNoIFdPUkQgcmVwcmVzZW50aW5nIHRoZSBVbmljb2RlIG9mCi0vLyAgICAgICAgICBhIGNoYXJhY3Rlcihzb21lIHNwZWNpYWwgVW5pY29kZSBtYXkgdGFrZSAyIFdPUkRzKS5UaGUgc3RyaW5nIGlzIGZvbGxvd2VkIGJ5IHR3byBieXRlcyBvZiB6ZXJvCisvLyAgICAgICAgICBSZWdhcmRsZXNzIG9mIHRoZSBwbGF0Zm9ybSwgdGhlIHRpdGxlIGlzIGFsd2F5cyBpbiBVVEYtMTZMRQorLy8gICAgICAgICAgZW5jb2RpbmcuIFRoYXQgbWVhbnMgdGhlIGJ1ZmZlcgorLy8gICAgICAgICAgY2FuIGJlIHRyZWF0ZWQgYXMgYW4gYXJyYXkgb2YgV09SRCAob24gSW50ZWwgYW5kIGNvbXBhdGlibGUgQ1BVcyksCisvLyAgICAgICAgICBlYWNoIFdPUkQgcmVwcmVzZW50aW5nIHRoZSBVbmljb2RlIG9mCisvLyAgICAgICAgICBhIGNoYXJhY3Rlcihzb21lIHNwZWNpYWwgVW5pY29kZSBtYXkgdGFrZSAyIFdPUkRzKS5UaGUgc3RyaW5nIGlzCisvLyAgICAgICAgICBmb2xsb3dlZCBieSB0d28gYnl0ZXMgb2YgemVybwogLy8gICAgICAgICAgaW5kaWNhdGluZyB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCiAvLwotLy8gICAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBhbHdheXMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBidWZmZXIsIGV2ZW4gaWYgbm8gYnVmZmVyIGlzIHNwZWNpZmllZAotLy8gICAgICAgICAgb3IgdGhlIGJ1ZmZlciBzaXplIGlzIGxlc3MgdGhlbiByZXF1aXJlZC4gSW4gdGhlc2UgY2FzZXMsIHRoZSBidWZmZXIgd2lsbCBub3QgYmUgbW9kaWZpZWQuCisvLyAgICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGFsd2F5cyBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IKKy8vICAgICAgICAgIHRoZSBidWZmZXIsIGV2ZW4gaWYgbm8gYnVmZmVyIGlzIHNwZWNpZmllZAorLy8gICAgICAgICAgb3IgdGhlIGJ1ZmZlciBzaXplIGlzIGxlc3MgdGhlbiByZXF1aXJlZC4gSW4gdGhlc2UgY2FzZXMsIHRoZSBidWZmZXIKKy8vICAgICAgICAgIHdpbGwgbm90IGJlIG1vZGlmaWVkLgogLy8KLURMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERkJvb2ttYXJrX0dldFRpdGxlKEZQREZfQk9PS01BUksgYm9va21hcmssIHZvaWQqIGJ1ZmZlciwgdW5zaWduZWQgbG9uZyBidWZsZW4pOworRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGQm9va21hcmtfR2V0VGl0bGUoRlBERl9CT09LTUFSSyBib29rbWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmbGVuKTsKIAogLy8gRnVuY3Rpb246IEZQREZCb29rbWFya19GaW5kCiAvLyAgICAgICAgICBGaW5kIGEgYm9va21hcmsgaW4gdGhlIGRvY3VtZW50LCB1c2luZyB0aGUgYm9va21hcmsgdGl0bGUuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IG9yIEZQREZfTG9hZE1lbURvY3VtZW50LgotLy8gICAgICAgICAgdGl0bGUgICAgICAgLSAgIFRoZSBVVEYtMTZMRSBlbmNvZGVkIFVuaWNvZGUgc3RyaW5nIGZvciB0aGUgYm9va21hcmsgdGl0bGUgdG8gYmUgc2VhcmNoZWQuIENhbid0IGJlIE5VTEwuCisvLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4gUmV0dXJuZWQgYnkKKy8vICAgICAgICAgIEZQREZfTG9hZERvY3VtZW50IG9yIEZQREZfTG9hZE1lbURvY3VtZW50LgorLy8gICAgICAgICAgdGl0bGUgICAgICAgLSAgIFRoZSBVVEYtMTZMRSBlbmNvZGVkIFVuaWNvZGUgc3RyaW5nIGZvciB0aGUgYm9va21hcmsKKy8vICAgICAgICAgIHRpdGxlIHRvIGJlIHNlYXJjaGVkLiBDYW4ndCBiZSBOVUxMLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBmb3VuZCBib29rbWFyayBpdGVtLiBOVUxMIGlmIHRoZSB0aXRsZSBjYW4ndCBiZSBmb3VuZC4KIC8vIENvbW1lbnRzOgotLy8gICAgICAgICAgSXQgYWx3YXlzIHJldHVybnMgdGhlIGZpcnN0IGZvdW5kIGJvb2ttYXJrIGlmIG1vcmUgdGhhbiBvbmUgYm9va21hcmtzIGhhdmUgdGhlIHNhbWUgdGl0bGUuCisvLyAgICAgICAgICBJdCBhbHdheXMgcmV0dXJucyB0aGUgZmlyc3QgZm91bmQgYm9va21hcmsgaWYgbW9yZSB0aGFuIG9uZQorLy8gICAgICAgICAgYm9va21hcmtzIGhhdmUgdGhlIHNhbWUgdGl0bGUuCiAvLwotRExMRVhQT1JUIEZQREZfQk9PS01BUksgU1REQ0FMTCBGUERGQm9va21hcmtfRmluZChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX1dJREVTVFJJTkcgdGl0bGUpOworRExMRVhQT1JUIEZQREZfQk9PS01BUksgU1REQ0FMTCBGUERGQm9va21hcmtfRmluZChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgdGl0bGUpOwogCiAvLyBGdW5jdGlvbjogRlBERkJvb2ttYXJrX0dldERlc3QKIC8vICAgICAgICAgIEdldCB0aGUgZGVzdGluYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgYm9va21hcmsgaXRlbS4KQEAgLTcxLDI2ICs5MCwyOSBAQAogLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQuCiAvLyAgICAgICAgICBib29rbWFyayAgICAtICAgSGFuZGxlIHRvIHRoZSBib29rbWFyay4KIC8vIFJldHVybiB2YWx1ZToKLS8vICAgICAgICAgIEhhbmRsZSB0byB0aGUgZGVzdGluYXRpb24gZGF0YS4gTlVMTCBpZiBubyBkZXN0aW5hdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBib29rbWFyay4KKy8vICAgICAgICAgIEhhbmRsZSB0byB0aGUgZGVzdGluYXRpb24gZGF0YS4gTlVMTCBpZiBubyBkZXN0aW5hdGlvbiBpcyBhc3NvY2lhdGVkCisvLyAgICAgICAgICB3aXRoIHRoaXMgYm9va21hcmsuCiAvLwotRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZCb29rbWFya19HZXREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfQk9PS01BUksgYm9va21hcmspOworRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZCb29rbWFya19HZXREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09LTUFSSyBib29rbWFyayk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGQm9va21hcmtfR2V0QWN0aW9uCiAvLyAgICAgICAgICBHZXQgdGhlIGFjdGlvbiBhc3NvY2lhdGVkIHdpdGggYSBib29rbWFyayBpdGVtLgogLy8gUGFyYW1ldGVyczoKIC8vICAgICAgICAgIGJvb2ttYXJrICAgIC0gICBIYW5kbGUgdG8gdGhlIGJvb2ttYXJrLgogLy8gUmV0dXJuIHZhbHVlOgotLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBhY3Rpb24gZGF0YS4gTlVMTCBpZiBubyBhY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYm9va21hcmsuIEluIHRoaXMgY2FzZSwgdGhlCisvLyAgICAgICAgICBIYW5kbGUgdG8gdGhlIGFjdGlvbiBkYXRhLiBOVUxMIGlmIG5vIGFjdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcworLy8gICAgICAgICAgYm9va21hcmsuIEluIHRoaXMgY2FzZSwgdGhlCiAvLyAgICAgICAgICBhcHBsaWNhdGlvbiBzaG91bGQgdHJ5IEZQREZCb29rbWFya19HZXREZXN0LgogLy8KIERMTEVYUE9SVCBGUERGX0FDVElPTiBTVERDQUxMIEZQREZCb29rbWFya19HZXRBY3Rpb24oRlBERl9CT09LTUFSSyBib29rbWFyayk7CiAKLSNkZWZpbmUgUERGQUNUSU9OX1VOU1VQUE9SVEVEICAgICAgIDAgICAgICAgLy8gVW5zdXBwb3J0ZWQgYWN0aW9uIHR5cGUuCi0jZGVmaW5lIFBERkFDVElPTl9HT1RPICAgICAgICAgICAgICAxICAgICAgIC8vIEdvIHRvIGEgZGVzdGluYXRpb24gd2l0aGluIGN1cnJlbnQgZG9jdW1lbnQuCi0jZGVmaW5lIFBERkFDVElPTl9SRU1PVEVHT1RPICAgICAgICAyICAgICAgIC8vIEdvIHRvIGEgZGVzdGluYXRpb24gd2l0aGluIGFub3RoZXIgZG9jdW1lbnQuCi0jZGVmaW5lIFBERkFDVElPTl9VUkkgICAgICAgICAgICAgICAzICAgICAgIC8vIFVuaXZlcnNhbCBSZXNvdXJjZSBJZGVudGlmaWVyLCBpbmNsdWRpbmcgd2ViIHBhZ2VzIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlciBJbnRlcm5ldCBiYXNlZCByZXNvdXJjZXMuCi0jZGVmaW5lIFBERkFDVElPTl9MQVVOQ0ggICAgICAgICAgICA0ICAgICAgIC8vIExhdW5jaCBhbiBhcHBsaWNhdGlvbiBvciBvcGVuIGEgZmlsZS4KKyNkZWZpbmUgUERGQUNUSU9OX1VOU1VQUE9SVEVEIDAgIC8vIFVuc3VwcG9ydGVkIGFjdGlvbiB0eXBlLgorI2RlZmluZSBQREZBQ1RJT05fR09UTyAxICAgICAgICAgLy8gR28gdG8gYSBkZXN0aW5hdGlvbiB3aXRoaW4gY3VycmVudCBkb2N1bWVudC4KKyNkZWZpbmUgUERGQUNUSU9OX1JFTU9URUdPVE8gMiAgIC8vIEdvIHRvIGEgZGVzdGluYXRpb24gd2l0aGluIGFub3RoZXIgZG9jdW1lbnQuCisjZGVmaW5lIFBERkFDVElPTl9VUkkgMyAgICAgICAgICAvLyBVbml2ZXJzYWwgUmVzb3VyY2UgSWRlbnRpZmllciwgaW5jbHVkaW5nIHdlYgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFnZXMgYW5kIG90aGVyIEludGVybmV0IGJhc2VkIHJlc291cmNlcy4KKyNkZWZpbmUgUERGQUNUSU9OX0xBVU5DSCA0ICAgICAgIC8vIExhdW5jaCBhbiBhcHBsaWNhdGlvbiBvciBvcGVuIGEgZmlsZS4KIAogLy8gRnVuY3Rpb246IEZQREZBY3Rpb25fR2V0VHlwZQogLy8gICAgICAgICAgR2V0IHR5cGUgb2YgYW4gYWN0aW9uLgpAQCAtMTA1LDE1ICsxMjcsMzggQEAKIC8vICAgICAgICAgIEdldCBkZXN0aW5hdGlvbiBvZiBhbiBhY3Rpb24uCiAvLyBQYXJhbWV0ZXJzOgogLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQuCi0vLyAgICAgICAgICBhY3Rpb24gICAgICAtICAgSGFuZGxlIHRvIHRoZSBhY3Rpb24uIEl0IG11c3QgYmUgYSBHT1RPIG9yIFJFTU9URUdPVE8gYWN0aW9uLgorLy8gICAgICAgICAgYWN0aW9uICAgICAgLSAgIEhhbmRsZSB0byB0aGUgYWN0aW9uLiBJdCBtdXN0IGJlIGEgR09UTyBvcgorLy8gICAgICAgICAgUkVNT1RFR09UTyBhY3Rpb24uCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBIYW5kbGUgdG8gdGhlIGRlc3RpbmF0aW9uIGRhdGEuCiAvLyBDb21tZW50czoKLS8vICAgICAgICAgIEluIGNhc2Ugb2YgcmVtb3RlIGdvdG8gYWN0aW9uLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGZpcnN0IHVzZSBGUERGQWN0aW9uX0dldEZpbGVQYXRoIHRvCi0vLyAgICAgICAgICBnZXQgZmlsZSBwYXRoLCB0aGVuIGxvYWQgdGhhdCBwYXJ0aWN1bGFyIGRvY3VtZW50LCBhbmQgdXNlIGl0cyBkb2N1bWVudCBoYW5kbGUgdG8gY2FsbCB0aGlzCisvLyAgICAgICAgICBJbiBjYXNlIG9mIHJlbW90ZSBnb3RvIGFjdGlvbiwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBmaXJzdCB1c2UKKy8vICAgICAgICAgIEZQREZBY3Rpb25fR2V0RmlsZVBhdGggdG8KKy8vICAgICAgICAgIGdldCBmaWxlIHBhdGgsIHRoZW4gbG9hZCB0aGF0IHBhcnRpY3VsYXIgZG9jdW1lbnQsIGFuZCB1c2UgaXRzCisvLyAgICAgICAgICBkb2N1bWVudCBoYW5kbGUgdG8gY2FsbCB0aGlzCiAvLyAgICAgICAgICBmdW5jdGlvbi4KIC8vCi1ETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERkFjdGlvbl9HZXREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfQUNUSU9OIGFjdGlvbik7CitETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERkFjdGlvbl9HZXREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQUNUSU9OIGFjdGlvbik7CisKKy8vIEZ1bmN0aW9uOiBGUERGQWN0aW9uX0dldEZpbGVQYXRoCisvLyAgICAgICAgICBHZXQgZmlsZSBwYXRoIG9mIGEgcmVtb3RlIGdvdG8gYWN0aW9uLgorLy8gUGFyYW1ldGVyczoKKy8vICAgICAgICAgIGFjdGlvbiAgICAtICAgSGFuZGxlIHRvIHRoZSBhY3Rpb24uIE11c3QgYmUgYSBSRU1PVEVHT1RPIG9yCisvLyAgICAgICAgICAgICAgICAgICAgICAgIExBVU5DSCBhY3Rpb24uCisvLyAgICAgICAgICBidWZmZXIgICAgLSAgIEEgYnVmZmVyIGZvciBvdXRwdXQgdGhlIHBhdGggc3RyaW5nLiBDYW4gYmUgTlVMTC4KKy8vICAgICAgICAgIGJ1ZmxlbiAgICAtICAgVGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLCBudW1iZXIgb2YgYnl0ZXMuIENhbiBiZSAwLgorLy8gUmV0dXJuIHZhbHVlOgorLy8gICAgICAgICAgTnVtYmVyIG9mIGJ5dGVzIHRoZSBmaWxlIHBhdGggY29uc3VtZXMsIGluY2x1ZGluZyB0cmFpbGluZyB6ZXJvLgorLy8KKy8vIENvbW1lbnRzOgorLy8gICAgICAgICAgVGhlIGZpbGUgcGF0aCBpcyBVVEYtOCBlbmNvZGVkLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YKKy8vICAgICAgICAgIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgYnVmZmVyLCBldmVuIHdoZW4gdGhlcmUgaXMgbm8gYnVmZmVyCisvLyAgICAgICAgICBzcGVjaWZpZWQsIG9yIHRoZSBidWZmZXIgc2l6ZSBpcyBsZXNzIHRoZW4gcmVxdWlyZWQuIEluIHRoaXMgY2FzZSwKKy8vICAgICAgICAgIHRoZSBidWZmZXIgd2lsbCBub3QgYmUgbW9kaWZpZWQuCisvLworRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTAorRlBERkFjdGlvbl9HZXRGaWxlUGF0aChGUERGX0FDVElPTiBhY3Rpb24sIHZvaWQqIGJ1ZmZlciwgdW5zaWduZWQgbG9uZyBidWZsZW4pOwogCiAvLyBGdW5jdGlvbjogRlBERkFjdGlvbl9HZXRVUklQYXRoCiAvLyAgICAgICAgICBHZXQgVVJJIHBhdGggb2YgYSBVUkkgYWN0aW9uLgpAQCAtMTI3LDEyICsxNzIsMTQgQEAKIC8vIENvbW1lbnRzOgogLy8gICAgICAgICAgVGhlIFVSSSBwYXRoIGlzIGFsd2F5cyBlbmNvZGVkIGluIDctYml0IEFTQ0lJLgogLy8KLS8vICAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgYWx3YXlzIGluZGljYXRlZCBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBidWZmZXIsIGV2ZW4gd2hlbiB0aGVyZSBpcwotLy8gICAgICAgICAgbm8gYnVmZmVyIHNwZWNpZmllZCwgb3IgdGhlIGJ1ZmZlciBzaXplIGlzIGxlc3MgdGhlbiByZXF1aXJlZC4gSW4gdGhpcyBjYXNlLCB0aGUgYnVmZmVyIHdpbGwgbm90Ci0vLyAgICAgICAgICBiZSBtb2RpZmllZC4KKy8vICAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIGJ1ZmZlciwKKy8vICAgICAgICAgIGV2ZW4gd2hlbiB0aGVyZSBpcyBubyBidWZmZXIgc3BlY2lmaWVkLCBvciB0aGUgYnVmZmVyIHNpemUgaXMgbGVzcworLy8gICAgICAgICAgdGhlbiByZXF1aXJlZC4gSW4gdGhpcyBjYXNlLCB0aGUgYnVmZmVyIHdpbGwgbm90IGJlIG1vZGlmaWVkLgogLy8KLURMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERkFjdGlvbl9HZXRVUklQYXRoKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfQUNUSU9OIGFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgdW5zaWduZWQgbG9uZyBidWZsZW4pOworRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGQWN0aW9uX0dldFVSSVBhdGgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQUNUSU9OIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmbGVuKTsKIAogLy8gRnVuY3Rpb246IEZQREZEZXN0X0dldFBhZ2VJbmRleAogLy8gICAgICAgICAgR2V0IHBhZ2UgaW5kZXggb2YgYSBkZXN0aW5hdGlvbi4KQEAgLTE0Miw2MyArMTg5LDk5IEBACiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUaGUgcGFnZSBpbmRleC4gU3RhcnRpbmcgZnJvbSAwIGZvciB0aGUgZmlyc3QgcGFnZS4KIC8vCi1ETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZEZXN0X0dldFBhZ2VJbmRleChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0RFU1QgZGVzdCk7CitETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZEZXN0X0dldFBhZ2VJbmRleChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9ERVNUIGRlc3QpOwogCiAvLyBGdW5jdGlvbjogRlBERkxpbmtfR2V0TGlua0F0UG9pbnQKLS8vICAgICAgICAgIEZpbmQgYSBsaW5rIGF0IHNwZWNpZmllZCBwb2ludCBvbiBhIGRvY3VtZW50IHBhZ2UuCisvLyAgICAgRmluZCBhIGxpbmsgYXQgc3BlY2lmaWVkIHBvaW50IG9uIGEgZG9jdW1lbnQgcGFnZS4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBkb2N1bWVudCBwYWdlLgotLy8gICAgICAgICAgeCAgICAgICAgICAgLSAgIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LCBzcGVjaWZpZWQgaW4gcGFnZSBjb29yZGluYXRlIHN5c3RlbS4KLS8vICAgICAgICAgIHkgICAgICAgICAgIC0gICBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCwgc3BlY2lmaWVkIGluIHBhZ2UgY29vcmRpbmF0ZSBzeXN0ZW0uCisvLyAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQgcGFnZS4KKy8vICAgICB4ICAgICAgICAgICAtICAgVGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQsIHNwZWNpZmllZCBpbiBwYWdlCisvLyAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGUgc3lzdGVtLgorLy8gICAgIHkgICAgICAgICAgIC0gICBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCwgc3BlY2lmaWVkIGluIHBhZ2UKKy8vICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZSBzeXN0ZW0uCiAvLyBSZXR1cm4gdmFsdWU6Ci0vLyAgICAgICAgICBIYW5kbGUgdG8gdGhlIGxpbmsuIE5VTEwgaWYgbm8gbGluayBmb3VuZCBhdCB0aGF0IHBvaW50LgorLy8gICAgIEhhbmRsZSB0byB0aGUgbGluay4gTlVMTCBpZiBubyBsaW5rIGZvdW5kIGF0IHRoYXQgcG9pbnQuCiAvLyBDb21tZW50czoKLS8vICAgICAgICAgIFRoZSBwb2ludCBjb29yZGluYXRlcyBhcmUgc3BlY2lmaWVkIGluIHBhZ2UgY29vcmRpbmF0ZSBzeXN0ZW0uIFlvdSBjYW4gY29udmVydCBjb29yZGluYXRlcwotLy8gICAgICAgICAgZnJvbSBzY3JlZW4gc3lzdGVtIHRvIHBhZ2Ugc3lzdGVtIHVzaW5nIEZQREZfRGV2aWNlVG9QYWdlIGZ1bmN0aW9ucy4KKy8vICAgICBUaGUgcG9pbnQgY29vcmRpbmF0ZXMgYXJlIHNwZWNpZmllZCBpbiBwYWdlIGNvb3JkaW5hdGUgc3lzdGVtLiBZb3UgY2FuCisvLyAgICAgY29udmVydCBjb29yZGluYXRlcyBmcm9tIHNjcmVlbiBzeXN0ZW0gdG8gcGFnZSBzeXN0ZW0gdXNpbmcKKy8vICAgICBGUERGX0RldmljZVRvUGFnZSgpLgogLy8KLURMTEVYUE9SVCBGUERGX0xJTksgU1REQ0FMTCBGUERGTGlua19HZXRMaW5rQXRQb2ludChGUERGX1BBR0UgcGFnZSwgZG91YmxlIHgsIGRvdWJsZSB5KTsKK0RMTEVYUE9SVCBGUERGX0xJTksgU1REQ0FMTCBGUERGTGlua19HZXRMaW5rQXRQb2ludChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeSk7CisKKy8vIEZ1bmN0aW9uOiBGUERGTGlua19HZXRMaW5rWk9yZGVyQXRQb2ludAorLy8gICAgIEZpbmQgdGhlIHotb3JkZXIgb2YgYSBsaW5rIGF0IHNwZWNpZmllZCBwb2ludCBvbiBhIGRvY3VtZW50IHBhZ2UuCisvLyBQYXJhbWV0ZXJzOgorLy8gICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGRvY3VtZW50IHBhZ2UuCisvLyAgICAgeCAgICAgICAgICAgLSAgIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LCBzcGVjaWZpZWQgaW4gcGFnZQorLy8gICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlIHN5c3RlbS4KKy8vICAgICB5ICAgICAgICAgICAtICAgVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQsIHNwZWNpZmllZCBpbiBwYWdlCisvLyAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGUgc3lzdGVtLgorLy8gUmV0dXJuIHZhbHVlOgorLy8gICAgIFotb3JkZXIgb2YgdGhlIGxpbmssIG9yIC0xIGlmIG5vIGxpbmsgZm91bmQgYXQgdGhhdCBwb2ludC4KKy8vICAgICBIaWdoZXIgbnVtYmVycyBhcmUgY2xvc2VyIHRvIHRoZSBmcm9udC4KKy8vIENvbW1lbnRzOgorLy8gICAgIFRoZSBwb2ludCBjb29yZGluYXRlcyBhcmUgc3BlY2lmaWVkIGluIHBhZ2UgY29vcmRpbmF0ZSBzeXN0ZW0uIFlvdSBjYW4KKy8vICAgICBjb252ZXJ0IGNvb3JkaW5hdGVzIGZyb20gc2NyZWVuIHN5c3RlbSB0byBwYWdlIHN5c3RlbSB1c2luZworLy8gICAgIEZQREZfRGV2aWNlVG9QYWdlKCkuCisvLworRExMRVhQT1JUIGludCBTVERDQUxMCitGUERGTGlua19HZXRMaW5rWk9yZGVyQXRQb2ludChGUERGX1BBR0UgcGFnZSwgZG91YmxlIHgsIGRvdWJsZSB5KTsKIAogLy8gRnVuY3Rpb246IEZQREZMaW5rX0dldERlc3QKIC8vICAgICAgICAgIEdldCBkZXN0aW5hdGlvbiBpbmZvIG9mIGEgbGluay4KIC8vIFBhcmFtZXRlcnM6CiAvLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4KLS8vICAgICAgICAgIGxpbmsgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGxpbmsuIFJldHVybmVkIGJ5IEZQREZMaW5rX0dldExpbmtBdFBvaW50LgorLy8gICAgICAgICAgbGluayAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgbGluay4gUmV0dXJuZWQgYnkKKy8vICAgICAgICAgIEZQREZMaW5rX0dldExpbmtBdFBvaW50LgogLy8gUmV0dXJuIHZhbHVlOgotLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBkZXN0aW5hdGlvbi4gTlVMTCBpZiB0aGVyZSBpcyBubyBkZXN0aW5hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmssIGluIHRoaXMgY2FzZQorLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBkZXN0aW5hdGlvbi4gTlVMTCBpZiB0aGVyZSBpcyBubyBkZXN0aW5hdGlvbgorLy8gICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLCBpbiB0aGlzIGNhc2UKIC8vICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgdHJ5IEZQREZMaW5rX0dldEFjdGlvbi4KIC8vCi1ETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERkxpbmtfR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0xJTksgbGluayk7CitETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERkxpbmtfR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9MSU5LIGxpbmspOwogCiAvLyBGdW5jdGlvbjogRlBERkxpbmtfR2V0QWN0aW9uCiAvLyAgICAgICAgICBHZXQgYWN0aW9uIGluZm8gb2YgYSBsaW5rLgogLy8gUGFyYW1ldGVyczoKIC8vICAgICAgICAgIGxpbmsgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGxpbmsuCiAvLyBSZXR1cm4gdmFsdWU6Ci0vLyAgICAgICAgICBIYW5kbGUgdG8gdGhlIGFjdGlvbi4gTlVMTCBpZiB0aGVyZSBpcyBubyBhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLgorLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBhY3Rpb24uIE5VTEwgaWYgdGhlcmUgaXMgbm8gYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUKKy8vICAgICAgICAgIGxpbmsuCiAvLwogRExMRVhQT1JUIEZQREZfQUNUSU9OIFNURENBTEwgRlBERkxpbmtfR2V0QWN0aW9uKEZQREZfTElOSyBsaW5rKTsKIAogLy8gRnVuY3Rpb246IEZQREZMaW5rX0VudW1lcmF0ZQotLy8gICAgICAgICAgVGhpcyBmdW5jdGlvbiB3b3VsZCBlbnVtZXJhdGUgYWxsIHRoZSBsaW5rIGFubm90YXRpb25zIGluIGEgc2luZ2xlIFBERiBwYWdlLgorLy8gICAgICAgICAgVGhpcyBmdW5jdGlvbiB3b3VsZCBlbnVtZXJhdGUgYWxsIHRoZSBsaW5rIGFubm90YXRpb25zIGluIGEgc2luZ2xlCisvLyAgICAgICAgICBQREYgcGFnZS4KIC8vIFBhcmFtZXRlcnM6CiAvLyAgICAgICAgICBwYWdlW2luXSAgICAgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuCi0vLyAgICAgICAgICBzdGFydFBvc1tpbixvdXRdICAgIC0gICBUaGUgc3RhcnQgcG9zaXRpb24gdG8gZW51bWVyYXRlIHRoZSBsaW5rIGFubm90YXRpb25zLCB3aGljaCBzaG91bGQgYmUgc3BlY2lmaWVkIHRvIHN0YXJ0IGZyb20KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAgIDAgZm9yIHRoZSBmaXJzdCBjYWxsLCBhbmQgd291bGQgcmVjZWl2ZSB0aGUgbmV4dCBwb3NpdGlvbiBmb3IgZW51bWVyYXRpbmcgdG8gc3RhcnQgZnJvbS4KKy8vICAgICAgICAgIHN0YXJ0UG9zW2luLG91dF0gICAgLSAgIFRoZSBzdGFydCBwb3NpdGlvbiB0byBlbnVtZXJhdGUgdGhlIGxpbmsKKy8vICAgICAgICAgIGFubm90YXRpb25zLCB3aGljaCBzaG91bGQgYmUgc3BlY2lmaWVkIHRvIHN0YXJ0IGZyb20KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAgIDAgZm9yIHRoZSBmaXJzdCBjYWxsLCBhbmQgd291bGQgcmVjZWl2ZSB0aGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBwb3NpdGlvbiBmb3IgZW51bWVyYXRpbmcgdG8gc3RhcnQgZnJvbS4KIC8vICAgICAgICAgIGxpbmtBbm5vdFtvdXRdICAgICAgLSAgIFJlY2VpdmUgdGhlIGxpbmsgaGFuZGxlLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVFJVRSBpZiBzdWNjY2VlZCwgZWxzZSBGYWxzZTsKIC8vCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkxpbmtfRW51bWVyYXRlKEZQREZfUEFHRSBwYWdlLCBpbnQqIHN0YXJ0UG9zLCBGUERGX0xJTksqIGxpbmtBbm5vdCk7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkxpbmtfRW51bWVyYXRlKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHN0YXJ0UG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0xJTksqIGxpbmtBbm5vdCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGTGlua19HZXRBbm5vdFJlY3QKLS8vICAgICAgICAgIEdldCB0aGUgYW5ub3RhdGlvbiByZWN0YW5nbGUuIChTcGVjaWZpZWQgYnkgdGhlIKGwUmVjdKGxIGVudHJ5IG9mIGFubm90YXRpb24gZGljdGlvbmFyeSkuCisvLyAgICAgICAgICBHZXQgdGhlIGFubm90YXRpb24gcmVjdGFuZ2xlLiAoU3BlY2lmaWVkIGJ5IHRoZSChsFJlY3ShsSBlbnRyeSBvZgorLy8gICAgICAgICAgYW5ub3RhdGlvbiBkaWN0aW9uYXJ5KS4KIC8vIFBhcmFtZXRlcnM6CiAvLyAgICAgICAgICBsaW5rQW5ub3RbaW5dICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGxpbmsgYW5ub3RhdGlvbi4KIC8vICAgICAgICAgIHJlY3Rbb3V0XSAgICAgICAgICAgLSAgIFRoZSBhbm5vdGF0aW9uIHJlY3QuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUUlVFIGlmIHN1Y2NjZWVkLCBlbHNlIEZhbHNlOwogLy8KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGTGlua19HZXRBbm5vdFJlY3QoRlBERl9MSU5LIGxpbmtBbm5vdCwgRlNfUkVDVEYqIHJlY3QpOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZMaW5rX0dldEFubm90UmVjdChGUERGX0xJTksgbGlua0Fubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19SRUNURiogcmVjdCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGTGlua19Db3VudFF1YWRQb2ludHMKIC8vICAgICAgICAgIEdldCB0aGUgY291bnQgb2YgcXVhZHJpbGF0ZXJhbCBwb2ludHMgdG8gdGhlIGxpbmsgYW5ub3RhdGlvbi4KQEAgLTIxMiwyMSArMjk1LDIxIEBACiAvKiBfRlNfREVGX1NUUlVDVFVSRV9RVUFEUE9JTlRTRl8gKi8KICNpZm5kZWYgX0ZTX0RFRl9TVFJVQ1RVUkVfUVVBRFBPSU5UU0ZfCiAjZGVmaW5lIF9GU19ERUZfU1RSVUNUVVJFX1FVQURQT0lOVFNGXwotdHlwZWRlZiBzdHJ1Y3QgX0ZTX1FVQURQT0lOVFNGCi17Ci0gICAgRlNfRkxPQVQgIHgxOwotICAgIEZTX0ZMT0FUICB5MTsKLSAgICBGU19GTE9BVCAgeDI7Ci0gICAgRlNfRkxPQVQgIHkyOwotICAgIEZTX0ZMT0FUICB4MzsKLSAgICBGU19GTE9BVCAgeTM7Ci0gICAgRlNfRkxPQVQgIHg0OwotICAgIEZTX0ZMT0FUICB5NDsKK3R5cGVkZWYgc3RydWN0IF9GU19RVUFEUE9JTlRTRiB7CisgIEZTX0ZMT0FUIHgxOworICBGU19GTE9BVCB5MTsKKyAgRlNfRkxPQVQgeDI7CisgIEZTX0ZMT0FUIHkyOworICBGU19GTE9BVCB4MzsKKyAgRlNfRkxPQVQgeTM7CisgIEZTX0ZMT0FUIHg0OworICBGU19GTE9BVCB5NDsKIH0gRlNfUVVBRFBPSU5UU0Y7CiAjZW5kaWYgLyogX0ZTX0RFRl9TVFJVQ1RVUkVfUVVBRFBPSU5UU0ZfICovCiAKIC8vIEZ1bmN0aW9uOiBGUERGTGlua19HZXRRdWFkUG9pbnRzCi0vLyAgICAgICAgICBHZXQgdGhlIHF1YWRyaWxhdGVyYWwgcG9pbnRzIGZvciB0aGUgc3BlY2lmaWVkIGluZGV4IGluIHRoZSBsaW5rIGFubm90YXRpb24uCisvLyAgICAgICAgICBHZXQgdGhlIHF1YWRyaWxhdGVyYWwgcG9pbnRzIGZvciB0aGUgc3BlY2lmaWVkIGluZGV4IGluIHRoZSBsaW5rCisvLyAgICAgICAgICBhbm5vdGF0aW9uLgogLy8gUGFyYW1ldGVyczoKIC8vICAgICAgICAgIGxpbmtBbm5vdFtpbl0gICAgICAgLSAgIEhhbmRsZSB0byB0aGUgbGluayBhbm5vdGF0aW9uLgogLy8gICAgICAgICAgcXVhZEluZGV4W2luXSAgICAgICAtICAgVGhlIHNwZWNpZmllZCBxdWFkIHBvaW50cyBpbmRleC4KQEAgLTIzNCwzMyArMzE3LDQ2IEBACiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUcnVlIGlmIHN1Y2NlZWQsIGVsc2UgRmFsc2UuCiAvLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZMaW5rX0dldFF1YWRQb2ludHMoRlBERl9MSU5LIGxpbmtBbm5vdCwgaW50IHF1YWRJbmRleCwgRlNfUVVBRFBPSU5UU0YqIHF1YWRQb2ludHMpOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZMaW5rX0dldFF1YWRQb2ludHMoRlBERl9MSU5LIGxpbmtBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFkSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19RVUFEUE9JTlRTRiogcXVhZFBvaW50cyk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX0dldE1ldGFUZXh0Ci0vLyAgICAgICAgICBHZXQgYSB0ZXh0IGZyb20gbWV0YSBkYXRhIG9mIHRoZSBkb2N1bWVudC4gUmVzdWx0IGlzIGVuY29kZWQgaW4gVVRGLTE2TEUuCisvLyAgICAgICAgICBHZXQgYSB0ZXh0IGZyb20gbWV0YSBkYXRhIG9mIHRoZSBkb2N1bWVudC4gUmVzdWx0IGlzIGVuY29kZWQgaW4KKy8vICAgICAgICAgIFVURi0xNkxFLgogLy8gUGFyYW1ldGVyczoKIC8vICAgICAgICAgIGRvYyAgICAgICAgIC0gICBIYW5kbGUgdG8gYSBkb2N1bWVudAotLy8gICAgICAgICAgdGFnICAgICAgICAgLSAgIFRoZSB0YWcgZm9yIHRoZSBtZXRhIGRhdGEuIEN1cnJlbnRseSwgSXQgY2FuIGJlICJUaXRsZSIsICJBdXRob3IiLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICJTdWJqZWN0IiwgIktleXdvcmRzIiwgIkNyZWF0b3IiLCAiUHJvZHVjZXIiLCAiQ3JlYXRpb25EYXRlIiwgb3IgIk1vZERhdGUiLgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGVzZSB0YWdzIGFuZCB0aGVpciByZXNwZWN0aXZlIHZhbHVlcywKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICBwbGVhc2UgcmVmZXIgdG8gUERGIFJlZmVyZW5jZSAxLjYsIHNlY3Rpb24gMTAuMi4xLCAiRG9jdW1lbnQgSW5mb3JtYXRpb24gRGljdGlvbmFyeSIuCisvLyAgICAgICAgICB0YWcgICAgICAgICAtICAgVGhlIHRhZyBmb3IgdGhlIG1ldGEgZGF0YS4gQ3VycmVudGx5LCBJdCBjYW4gYmUKKy8vICAgICAgICAgICJUaXRsZSIsICJBdXRob3IiLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICJTdWJqZWN0IiwgIktleXdvcmRzIiwgIkNyZWF0b3IiLCAiUHJvZHVjZXIiLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICJDcmVhdGlvbkRhdGUiLCBvciAiTW9kRGF0ZSIuCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9mIHRoZXNlIHRhZ3MgYW5kIHRoZWlyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZSB2YWx1ZXMsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgcGxlYXNlIHJlZmVyIHRvIFBERiBSZWZlcmVuY2UgMS42LCBzZWN0aW9uIDEwLjIuMSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9jdW1lbnQgSW5mb3JtYXRpb24gRGljdGlvbmFyeSIuCiAvLyAgICAgICAgICBidWZmZXIgICAgICAtICAgQSBidWZmZXIgZm9yIG91dHB1dCB0aGUgdGl0bGUuIENhbiBiZSBOVUxMLgogLy8gICAgICAgICAgYnVmbGVuICAgICAgLSAgIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciwgbnVtYmVyIG9mIGJ5dGVzLiBDYW4gYmUgMC4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE51bWJlciBvZiBieXRlcyB0aGUgdGl0bGUgY29uc3VtZXMsIGluY2x1ZGluZyB0cmFpbGluZyB6ZXJvcy4KIC8vIENvbW1lbnRzOgotLy8gICAgICAgICAgTm8gbWF0dGVyIG9uIHdoYXQgcGxhdGZvcm0sIHRoZSB0aXRsZSBpcyBhbHdheXMgb3V0cHV0IGluIFVURi0xNkxFIGVuY29kaW5nLCB3aGljaCBtZWFucyB0aGUgYnVmZmVyCi0vLyAgICAgICAgICBjYW4gYmUgcmVnYXJkZWQgYXMgYW4gYXJyYXkgb2YgV09SRCAob24gSW50ZWwgYW5kIGNvbXBhdGlibGUgQ1BVcyksIGVhY2ggV09SRCByZXByZXNlbnQgdGhlIFVuaWNvZGUgb2YKLS8vICAgICAgICAgIGEgY2hhcmFjdGVyIChzb21lIHNwZWNpYWwgVW5pY29kZSBtYXkgdGFrZSAyIFdPUkRzKS4gVGhlIHN0cmluZyBpcyBmb2xsb3dlZCBieSB0d28gYnl0ZXMgb2YgemVybworLy8gICAgICAgICAgTm8gbWF0dGVyIG9uIHdoYXQgcGxhdGZvcm0sIHRoZSB0aXRsZSBpcyBhbHdheXMgb3V0cHV0IGluIFVURi0xNkxFCisvLyAgICAgICAgICBlbmNvZGluZywgd2hpY2ggbWVhbnMgdGhlIGJ1ZmZlcgorLy8gICAgICAgICAgY2FuIGJlIHJlZ2FyZGVkIGFzIGFuIGFycmF5IG9mIFdPUkQgKG9uIEludGVsIGFuZCBjb21wYXRpYmxlIENQVXMpLAorLy8gICAgICAgICAgZWFjaCBXT1JEIHJlcHJlc2VudCB0aGUgVW5pY29kZSBvZgorLy8gICAgICAgICAgYSBjaGFyYWN0ZXIgKHNvbWUgc3BlY2lhbCBVbmljb2RlIG1heSB0YWtlIDIgV09SRHMpLiBUaGUgc3RyaW5nIGlzCisvLyAgICAgICAgICBmb2xsb3dlZCBieSB0d28gYnl0ZXMgb2YgemVybwogLy8gICAgICAgICAgaW5kaWNhdGluZyBlbmQgb2YgdGhlIHN0cmluZy4KIC8vCi0vLyAgICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGFsd2F5cyBpbmRpY2F0ZWQgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgYnVmZmVyLCBldmVuIHdoZW4gdGhlcmUgaXMKLS8vICAgICAgICAgIG5vIGJ1ZmZlciBzcGVjaWZpZWQsIG9yIHRoZSBidWZmZXIgc2l6ZSBpcyBsZXNzIHRoZW4gcmVxdWlyZWQuIEluIHRoaXMgY2FzZSwgdGhlIGJ1ZmZlciB3aWxsIG5vdAorLy8gICAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBhbHdheXMgaW5kaWNhdGVkIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlCisvLyAgICAgICAgICBidWZmZXIsIGV2ZW4gd2hlbiB0aGVyZSBpcworLy8gICAgICAgICAgbm8gYnVmZmVyIHNwZWNpZmllZCwgb3IgdGhlIGJ1ZmZlciBzaXplIGlzIGxlc3MgdGhlbiByZXF1aXJlZC4gSW4KKy8vICAgICAgICAgIHRoaXMgY2FzZSwgdGhlIGJ1ZmZlciB3aWxsIG5vdAogLy8gICAgICAgICAgYmUgbW9kaWZpZWQuCiAvLwotRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGX0dldE1ldGFUZXh0KEZQREZfRE9DVU1FTlQgZG9jLCBGUERGX0JZVEVTVFJJTkcgdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgdW5zaWduZWQgbG9uZyBidWZsZW4pOwotCitETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZfR2V0TWV0YVRleHQoRlBERl9ET0NVTUVOVCBkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBidWZsZW4pOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL3B1YmxpYy9mcGRmX2VkaXQuaCBiL3B1YmxpYy9mcGRmX2VkaXQuaAppbmRleCBkOTdmYmRiLi42NGVlZjI2IDEwMDY0NAotLS0gYS9wdWJsaWMvZnBkZl9lZGl0LmgKKysrIGIvcHVibGljL2ZwZGZfZWRpdC5oCkBAIC03LDE2ICs3LDIyIEBACiAjaWZuZGVmIFBVQkxJQ19GUERGX0VESVRfSF8KICNkZWZpbmUgUFVCTElDX0ZQREZfRURJVF9IXwogCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKICNpbmNsdWRlICJmcGRmdmlldy5oIgogCi0vLyBEZWZpbmUgYWxsIHR5cGVzIHVzZWQgaW4gdGhlIFNESy4gTm90ZSB0aGV5IGNhbiBiZSBzaW1wbHkgcmVnYXJkZWQgYXMgb3BhcXVlIHBvaW50ZXJzCisvLyBEZWZpbmUgYWxsIHR5cGVzIHVzZWQgaW4gdGhlIFNESy4gTm90ZSB0aGV5IGNhbiBiZSBzaW1wbHkgcmVnYXJkZWQgYXMgb3BhcXVlCisvLyBwb2ludGVycwogLy8gb3IgbG9uZyBpbnRlZ2VyIG51bWJlcnMuCiAKLSNkZWZpbmUgRlBERl9BUkdCKGEscixnLGIpICAgICAgKCgoKEZYX0RXT1JEKSgoKEZYX0JZVEUpKGIpfCgoRlhfV09SRCkoKEZYX0JZVEUpKGcpKTw8OCkpfCgoKEZYX0RXT1JEKShGWF9CWVRFKShyKSk8PDE2KSkpKSB8ICgoKEZYX0RXT1JEKShGWF9CWVRFKShhKSk8PDI0KSkKLSNkZWZpbmUgRlBERl9HZXRCVmFsdWUoYXJnYikgICAgKChGWF9CWVRFKShhcmdiKSkKLSNkZWZpbmUgRlBERl9HZXRHVmFsdWUoYXJnYikgICAgKChGWF9CWVRFKSgoKEZYX1dPUkQpKGFyZ2IpKSA+PiA4KSkKLSNkZWZpbmUgRlBERl9HZXRSVmFsdWUoYXJnYikgICAgKChGWF9CWVRFKSgoYXJnYik+PjE2KSkKLSNkZWZpbmUgRlBERl9HZXRBVmFsdWUoYXJnYikgICAgKChGWF9CWVRFKSgoYXJnYik+PjI0KSkKKyNkZWZpbmUgRlBERl9BUkdCKGEsIHIsIGcsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoKHVpbnQzMl90KSgoKHVpbnQ4X3QpKGIpIHwgKChGWF9XT1JEKSgodWludDhfdCkoZykpIDw8IDgpKSB8IFwKKyAgICAgICAgICAgICAgICAoKChGWF9EV09SRCkodWludDhfdCkocikpIDw8IDE2KSkpKSB8ICAgICAgICAgICAgIFwKKyAgICgoKEZYX0RXT1JEKSh1aW50OF90KShhKSkgPDwgMjQpKQorI2RlZmluZSBGUERGX0dldEJWYWx1ZShhcmdiKSAoKHVpbnQ4X3QpKGFyZ2IpKQorI2RlZmluZSBGUERGX0dldEdWYWx1ZShhcmdiKSAoKHVpbnQ4X3QpKCgodWludDE2X3QpKGFyZ2IpKSA+PiA4KSkKKyNkZWZpbmUgRlBERl9HZXRSVmFsdWUoYXJnYikgKCh1aW50OF90KSgoYXJnYikgPj4gMTYpKQorI2RlZmluZSBGUERGX0dldEFWYWx1ZShhcmdiKSAoKHVpbnQ4X3QpKChhcmdiKSA+PiAyNCkpCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CkBAIC00NSw3ICs1MSw4IEBACiAvLyBGdW5jdGlvbjogRlBERlBhZ2VfTmV3CiAvLyAgICAgICAgICBDb25zdHJ1Y3QgYW4gZW1wdHkgcGFnZS4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBhbmQgRlBERl9DcmVhdGVOZXdEb2N1bWVudC4KKy8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50CisvLyAgICAgICAgICBhbmQgRlBERl9DcmVhdGVOZXdEb2N1bWVudC4KIC8vICAgICAgICAgIHBhZ2VfaW5kZXggIC0gICBUaGUgaW5kZXggb2YgYSBwYWdlLgogLy8gICAgICAgICAgd2lkdGggICAgICAgLSAgIFRoZSBwYWdlIHdpZHRoLgogLy8gICAgICAgICAgaGVpZ2h0ICAgICAgLSAgIFRoZSBwYWdlIGhlaWdodC4KQEAgLTUzLDIxICs2MCwyNyBAQAogLy8gICAgICAgICAgVGhlIGhhbmRsZSB0byB0aGUgcGFnZS4KIC8vIENvbW1lbnRzOgogLy8gICAgICAgICAgTG9hZGVkIHBhZ2UgY2FuIGJlIGRlbGV0ZWQgYnkgRlBERlBhZ2VfRGVsZXRlLgotRExMRVhQT1JUIEZQREZfUEFHRSBTVERDQUxMIEZQREZQYWdlX05ldyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBpbnQgcGFnZV9pbmRleCwgZG91YmxlIHdpZHRoLCBkb3VibGUgaGVpZ2h0KTsKK0RMTEVYUE9SVCBGUERGX1BBR0UgU1REQ0FMTCBGUERGUGFnZV9OZXcoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGhlaWdodCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGUGFnZV9EZWxldGUKIC8vICAgICAgICAgIERlbGV0ZSBhIFBERiBwYWdlLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGFuZCBGUERGX0NyZWF0ZU5ld0RvY3VtZW50LgorLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQKKy8vICAgICAgICAgIGFuZCBGUERGX0NyZWF0ZU5ld0RvY3VtZW50LgogLy8gICAgICAgICAgcGFnZV9pbmRleCAgLSAgIFRoZSBpbmRleCBvZiBhIHBhZ2UuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBOb25lLgogRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9EZWxldGUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgaW50IHBhZ2VfaW5kZXgpOwogCiAvLyBGdW5jdGlvbjogRlBERlBhZ2VfR2V0Um90YXRpb24KLS8vICAgICAgICAgIEdldCB0aGUgcGFnZSByb3RhdGlvbi4gT25lIG9mIGZvbGxvd2luZyB2YWx1ZXMgd2lsbCBiZSByZXR1cm5lZDogMCgwKSwgMSg5MCksIDIoMTgwKSwgMygyNzApLgorLy8gICAgICAgICAgR2V0IHRoZSBwYWdlIHJvdGF0aW9uLiBPbmUgb2YgZm9sbG93aW5nIHZhbHVlcyB3aWxsIGJlIHJldHVybmVkOgorLy8gICAgICAgICAgMCgwKSwgMSg5MCksIDIoMTgwKSwgMygyNzApLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gYSBwYWdlLiBSZXR1cm5lZCBieSBGUERGUGFnZV9OZXcgb3IgRlBERl9Mb2FkUGFnZS4KKy8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gYSBwYWdlLiBSZXR1cm5lZCBieSBGUERGUGFnZV9OZXcgb3IKKy8vICAgICAgICAgIEZQREZfTG9hZFBhZ2UuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUaGUgUERGIHBhZ2Ugcm90YXRpb24uCiAvLyBDb21tZW50OgpAQCAtNzUsOSArODgsMTEgQEAKIERMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGUGFnZV9HZXRSb3RhdGlvbihGUERGX1BBR0UgcGFnZSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGUGFnZV9TZXRSb3RhdGlvbgotLy8gICAgICAgICAgU2V0IHBhZ2Ugcm90YXRpb24uIE9uZSBvZiBmb2xsb3dpbmcgdmFsdWVzIHdpbGwgYmUgc2V0OiAwKDApLCAxKDkwKSwgMigxODApLCAzKDI3MCkuCisvLyAgICAgICAgICBTZXQgcGFnZSByb3RhdGlvbi4gT25lIG9mIGZvbGxvd2luZyB2YWx1ZXMgd2lsbCBiZSBzZXQ6IDAoMCksIDEoOTApLAorLy8gICAgICAgICAgMigxODApLCAzKDI3MCkuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byBhIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZQYWdlX05ldyBvciBGUERGX0xvYWRQYWdlLgorLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byBhIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZQYWdlX05ldyBvcgorLy8gICAgICAgICAgRlBERl9Mb2FkUGFnZS4KIC8vICAgICAgICAgIHJvdGF0ZSAgICAgIC0gICBUaGUgdmFsdWUgb2YgdGhlIFBERiBwYWdlIHJvdGF0aW9uLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTm9uZS4KQEAgLTg3LDE5ICsxMDIsMjQgQEAKIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VfU2V0Um90YXRpb24oRlBERl9QQUdFIHBhZ2UsIGludCByb3RhdGUpOwogCiAvLyBGdW5jdGlvbjogRlBERlBhZ2VfSW5zZXJ0T2JqZWN0Ci0vLyAgICAgICAgICBJbnNlcnQgYW4gb2JqZWN0IHRvIHRoZSBwYWdlLiBUaGUgcGFnZSBvYmplY3QgaXMgYXV0b21hdGljYWxseSBmcmVlZC4KKy8vICAgICAgICAgIEluc2VydCBhbiBvYmplY3QgdG8gdGhlIHBhZ2UuIFRoZSBwYWdlIG9iamVjdCBpcyBhdXRvbWF0aWNhbGx5CisvLyAgICAgICAgICBmcmVlZC4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIGEgcGFnZS4gUmV0dXJuZWQgYnkgRlBERlBhZ2VfTmV3IG9yIEZQREZfTG9hZFBhZ2UuCi0vLyAgICAgICAgICBwYWdlX29iaiAgICAtICAgSGFuZGxlIHRvIGEgcGFnZSBvYmplY3QuIFJldHVybmVkIGJ5IEZQREZQYWdlT2JqX05ld1RleHRPYmosRlBERlBhZ2VPYmpfTmV3VGV4dE9iakV4IGFuZAorLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byBhIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZQYWdlX05ldyBvcgorLy8gICAgICAgICAgRlBERl9Mb2FkUGFnZS4KKy8vICAgICAgICAgIHBhZ2Vfb2JqICAgIC0gICBIYW5kbGUgdG8gYSBwYWdlIG9iamVjdC4gUmV0dXJuZWQgYnkKKy8vICAgICAgICAgIEZQREZQYWdlT2JqX05ld1RleHRPYmosRlBERlBhZ2VPYmpfTmV3VGV4dE9iakV4IGFuZAogLy8gICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZQYWdlT2JqX05ld1BhdGhPYmouCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBOb25lLgotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9JbnNlcnRPYmplY3QoRlBERl9QQUdFIHBhZ2UsIEZQREZfUEFHRU9CSkVDVCBwYWdlX29iaik7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlX0luc2VydE9iamVjdChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRU9CSkVDVCBwYWdlX29iaik7CiAKIC8vIEZ1bmN0aW9uOiBGUERGUGFnZV9Db3VudE9iamVjdAogLy8gICAgICAgICAgR2V0IG51bWJlciBvZiBwYWdlIG9iamVjdHMgaW5zaWRlIHRoZSBwYWdlLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gYSBwYWdlLiBSZXR1cm5lZCBieSBGUERGUGFnZV9OZXcgb3IgRlBERl9Mb2FkUGFnZS4KKy8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gYSBwYWdlLiBSZXR1cm5lZCBieSBGUERGUGFnZV9OZXcgb3IKKy8vICAgICAgICAgIEZQREZfTG9hZFBhZ2UuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUaGUgbnVtYmVyIG9mIHRoZSBwYWdlIG9iamVjdC4KIERMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGUGFnZV9Db3VudE9iamVjdChGUERGX1BBR0UgcGFnZSk7CkBAIC0xMDcsMTYgKzEyNywxOSBAQAogLy8gRnVuY3Rpb246IEZQREZQYWdlX0dldE9iamVjdAogLy8gICAgICAgICAgR2V0IHBhZ2Ugb2JqZWN0IGJ5IGluZGV4LgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gYSBwYWdlLiBSZXR1cm5lZCBieSBGUERGUGFnZV9OZXcgb3IgRlBERl9Mb2FkUGFnZS4KKy8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gYSBwYWdlLiBSZXR1cm5lZCBieSBGUERGUGFnZV9OZXcgb3IKKy8vICAgICAgICAgIEZQREZfTG9hZFBhZ2UuCiAvLyAgICAgICAgICBpbmRleCAgICAgICAtICAgVGhlIGluZGV4IG9mIGEgcGFnZSBvYmplY3QuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUaGUgaGFuZGxlIG9mIHRoZSBwYWdlIG9iamVjdC4gTnVsbCBmb3IgZmFpbGVkLgogRExMRVhQT1JUIEZQREZfUEFHRU9CSkVDVCBTVERDQUxMIEZQREZQYWdlX0dldE9iamVjdChGUERGX1BBR0UgcGFnZSwgaW50IGluZGV4KTsKIAogLy8gRnVuY3Rpb246IEZQREZQYWdlX0hhc1RyYW5zcGFyZW5jeQotLy8gICAgICAgICAgQ2hlY2sgdGhhdCB3aGV0aGVyIHRoZSBjb250ZW50IG9mIHNwZWNpZmllZCBQREYgcGFnZSBjb250YWlucyB0cmFuc3BhcmVuY3kuCisvLyAgICAgICAgICBDaGVjayB0aGF0IHdoZXRoZXIgdGhlIGNvbnRlbnQgb2Ygc3BlY2lmaWVkIFBERiBwYWdlIGNvbnRhaW5zCisvLyAgICAgICAgICB0cmFuc3BhcmVuY3kuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byBhIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZQYWdlX05ldyBvciBGUERGX0xvYWRQYWdlLgorLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byBhIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZQYWdlX05ldyBvcgorLy8gICAgICAgICAgRlBERl9Mb2FkUGFnZS4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRSVUUgbWVhbnMgdGhhdCB0aGUgUERGIHBhZ2UgZG9lcyBjb250YWlucyB0cmFuc3BhcmVuY3kuCiAvLyAgICAgICAgICBPdGhlcndpc2UsIHJldHVybnMgRkFMU0UuCkBAIC0xMjUsMTEgKzE0OCwxMyBAQAogLy8gRnVuY3Rpb246IEZQREZQYWdlX0dlbmVyYXRlQ29udGVudAogLy8gICAgICAgICAgR2VuZXJhdGUgUERGIFBhZ2UgY29udGVudC4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIGEgcGFnZS4gUmV0dXJuZWQgYnkgRlBERlBhZ2VfTmV3IG9yIEZQREZfTG9hZFBhZ2UuCisvLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIGEgcGFnZS4gUmV0dXJuZWQgYnkgRlBERlBhZ2VfTmV3IG9yCisvLyAgICAgICAgICBGUERGX0xvYWRQYWdlLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuCiAvLyBDb21tZW50OgotLy8gICAgICAgICAgQmVmb3JlIHlvdSBzYXZlIHRoZSBwYWdlIHRvIGEgZmlsZSwgb3IgcmVsb2FkIHRoZSBwYWdlLCB5b3UgbXVzdCBjYWxsIHRoZSBGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQgZnVuY3Rpb24uCisvLyAgICAgICAgICBCZWZvcmUgeW91IHNhdmUgdGhlIHBhZ2UgdG8gYSBmaWxlLCBvciByZWxvYWQgdGhlIHBhZ2UsIHlvdSBtdXN0CisvLyAgICAgICAgICBjYWxsIHRoZSBGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQgZnVuY3Rpb24uCiAvLyAgICAgICAgICBPciB0aGUgY2hhbmdlZCBpbmZvcm1hdGlvbiB3aWxsIGJlIGxvc3QuCiBETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50KEZQREZfUEFHRSBwYWdlKTsKIApAQCAtMTQwLDE4ICsxNjUsMjEgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogLy8gRnVuY3Rpb246IEZQREZQYWdlT2JqX0hhc1RyYW5zcGFyZW5jeQotLy8gICAgICAgICAgQ2hlY2sgdGhhdCB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgUERGIHBhZ2Ugb2JqZWN0IGNvbnRhaW5zIHRyYW5zcGFyZW5jeS4KKy8vICAgICAgICAgIENoZWNrIHRoYXQgd2hldGhlciB0aGUgc3BlY2lmaWVkIFBERiBwYWdlIG9iamVjdCBjb250YWlucworLy8gICAgICAgICAgdHJhbnNwYXJlbmN5LgogLy8gUGFyYW1ldGVyczoKIC8vICAgICAgICAgIHBhZ2VPYmplY3QgIC0gICBIYW5kbGUgdG8gYSBwYWdlIG9iamVjdC4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRSVUUgbWVhbnMgdGhhdCB0aGUgUERGIHBhZ2Ugb2JqZWN0IGRvZXMgY29udGFpbnMgdHJhbnNwYXJlbmN5LgogLy8gICAgICAgICAgT3RoZXJ3aXNlLCByZXR1cm5zIEZBTFNFLgotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZQYWdlT2JqX0hhc1RyYW5zcGFyZW5jeShGUERGX1BBR0VPQkpFQ1QgcGFnZU9iamVjdCk7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwKK0ZQREZQYWdlT2JqX0hhc1RyYW5zcGFyZW5jeShGUERGX1BBR0VPQkpFQ1QgcGFnZU9iamVjdCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGUGFnZU9ial9UcmFuc2Zvcm0KIC8vICAgICAgICAgIFRyYW5zZm9ybSAoc2NhbGUsIHJvdGF0ZSwgc2hlYXIsIG1vdmUpIHBhZ2Ugb2JqZWN0LgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBhZ2Vfb2JqZWN0IC0gICBIYW5kbGUgdG8gYSBwYWdlIG9iamVjdC4gUmV0dXJuZWQgYnkgRlBERlBhZ2VPYmpfTmV3SW1hZ2VPYmouCisvLyAgICAgICAgICBwYWdlX29iamVjdCAtICAgSGFuZGxlIHRvIGEgcGFnZSBvYmplY3QuIFJldHVybmVkIGJ5CisvLyAgICAgICAgICBGUERGUGFnZU9ial9OZXdJbWFnZU9iai4KIC8vICAgICAgICAgIGEgICAgICAgICAgIC0gICBUaGUgY29lZmZpY2llbnQgImEiIG9mIHRoZSBtYXRyaXguCiAvLyAgICAgICAgICBiICAgICAgICAgICAtICAgVGhlIGNvZWZmaWNpZW50ICJiIiBvZiB0aGUgbWF0cml4LgogLy8gICAgICAgICAgYyAgICAgICAgICAgLSAgIFRoZSBjb2VmZmljaWVudCAiYyIgb2YgdGhlIG1hdHJpeC4KQEAgLTE2MSw3ICsxODksMTIgQEAKIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE5vbmUuCiBETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlT2JqX1RyYW5zZm9ybShGUERGX1BBR0VPQkpFQ1QgcGFnZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgYywgZG91YmxlIGQsIGRvdWJsZSBlLCBkb3VibGUgZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGYpOwogCiAvLyBGdW5jdGlvbjogRlBERlBhZ2VfVHJhbnNmb3JtQW5ub3RzCiAvLyAgICAgICAgICBUcmFuc2Zvcm0gKHNjYWxlLCByb3RhdGUsIHNoZWFyLCBtb3ZlKSBhbGwgYW5ub3RzIGluIGEgcGFnZS4KQEAgLTE3NiwxNCArMjA5LDE5IEBACiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBOb25lLgogRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9UcmFuc2Zvcm1Bbm5vdHMoRlBERl9QQUdFIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSBjLCBkb3VibGUgZCwgZG91YmxlIGUsIGRvdWJsZSBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZik7CiAKIC8vIFRoZSBwYWdlIG9iamVjdCBjb25zdGFudHMuCi0jZGVmaW5lIEZQREZfUEFHRU9CSl9URVhUICAgICAgIDEKLSNkZWZpbmUgRlBERl9QQUdFT0JKX1BBVEggICAgICAgMgotI2RlZmluZSBGUERGX1BBR0VPQkpfSU1BR0UgICAgICAzCi0jZGVmaW5lIEZQREZfUEFHRU9CSl9TSEFESU5HICAgIDQKLSNkZWZpbmUgRlBERl9QQUdFT0JKX0ZPUk0gICAgICAgNQorI2RlZmluZSBGUERGX1BBR0VPQkpfVEVYVCAxCisjZGVmaW5lIEZQREZfUEFHRU9CSl9QQVRIIDIKKyNkZWZpbmUgRlBERl9QQUdFT0JKX0lNQUdFIDMKKyNkZWZpbmUgRlBERl9QQUdFT0JKX1NIQURJTkcgNAorI2RlZmluZSBGUERGX1BBR0VPQkpfRk9STSA1CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vCkBAIC0xOTQsMzEgKzIzMiw0MiBAQAogLy8gRnVuY3Rpb246IEZQREZQYWdlT2JqX05ld0ltZ2VPYmoKIC8vICAgICAgICAgIENyZWF0ZSBhIG5ldyBJbWFnZSBPYmplY3QuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IG9yIEZQREZfQ3JlYXRlTmV3RG9jdW1lbnQgZnVuY3Rpb24uCisvLyAgICAgICAgICBkb2N1bWVudCAgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkKKy8vICAgICAgICAgIEZQREZfTG9hZERvY3VtZW50IG9yIEZQREZfQ3JlYXRlTmV3RG9jdW1lbnQgZnVuY3Rpb24uCiAvLyBSZXR1cm4gVmFsdWU6CiAvLyAgICAgICAgICBIYW5kbGUgb2YgaW1hZ2Ugb2JqZWN0LgotRExMRVhQT1JUIEZQREZfUEFHRU9CSkVDVCBTVERDQUxMIEZQREZQYWdlT2JqX05ld0ltZ2VPYmooRlBERl9ET0NVTUVOVCBkb2N1bWVudCk7Ci0KK0RMTEVYUE9SVCBGUERGX1BBR0VPQkpFQ1QgU1REQ0FMTAorRlBERlBhZ2VPYmpfTmV3SW1nZU9iaihGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKIAogLy8gRnVuY3Rpb246IEZQREZJbWFnZU9ial9Mb2FkSnBlZ0ZpbGUKLS8vICAgICAgICAgIExvYWQgSW1hZ2UgZnJvbSBhIEpQRUcgaW1hZ2UgZmlsZSBhbmQgdGhlbiBzZXQgaXQgdG8gYW4gaW1hZ2Ugb2JqZWN0LgorLy8gICAgICAgICAgTG9hZCBJbWFnZSBmcm9tIGEgSlBFRyBpbWFnZSBmaWxlIGFuZCB0aGVuIHNldCBpdCB0byBhbiBpbWFnZQorLy8gICAgICAgICAgb2JqZWN0LgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBhZ2VzICAgICAgICAgICAtICAgUG9pbnRlcnMgdG8gdGhlIHN0YXJ0IG9mIGFsbCBsb2FkZWQgcGFnZXMsIGNvdWxkIGJlIE5VTEwuCisvLyAgICAgICAgICBwYWdlcyAgICAgICAgICAgLSAgIFBvaW50ZXJzIHRvIHRoZSBzdGFydCBvZiBhbGwgbG9hZGVkIHBhZ2VzLCBjb3VsZAorLy8gICAgICAgICAgYmUgTlVMTC4KIC8vICAgICAgICAgIG5Db3VudCAgICAgICAgICAtICAgTnVtYmVyIG9mIHBhZ2VzLCBjb3VsZCBiZSAwLgotLy8gICAgICAgICAgaW1hZ2Vfb2JqZWN0ICAgIC0gICBIYW5kbGUgb2YgaW1hZ2Ugb2JqZWN0IHJldHVybmVkIGJ5IEZQREZQYWdlT2JqX05ld0ltZ2VPYmouCi0vLyAgICAgICAgICBmaWxlQWNjZXNzICAgICAgLSAgIFRoZSBjdXN0b20gZmlsZSBhY2Nlc3MgaGFuZGxlciwgd2hpY2ggc3BlY2lmaWVzIHRoZSBKUEVHIGltYWdlIGZpbGUuCisvLyAgICAgICAgICBpbWFnZV9vYmplY3QgICAgLSAgIEhhbmRsZSBvZiBpbWFnZSBvYmplY3QgcmV0dXJuZWQgYnkKKy8vICAgICAgICAgIEZQREZQYWdlT2JqX05ld0ltZ2VPYmouCisvLyAgICAgICAgICBmaWxlQWNjZXNzICAgICAgLSAgIFRoZSBjdXN0b20gZmlsZSBhY2Nlc3MgaGFuZGxlciwgd2hpY2ggc3BlY2lmaWVzCisvLyAgICAgICAgICB0aGUgSlBFRyBpbWFnZSBmaWxlLgogLy8gIFJldHVybiBWYWx1ZToKIC8vICAgICAgICAgIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgRkFMU0Ugb3RoZXJ3aXNlLgogLy8gIE5vdGU6Ci0vLyAgICAgICAgICBUaGUgaW1hZ2Ugb2JqZWN0IG1pZ2h0IGFscmVhZHkgaGFzIGFuIGFzc29jaWF0ZWQgaW1hZ2UsIHdoaWNoIGlzIHNoYXJlZCBhbmQgY2FjaGVkIGJ5IHRoZSBsb2FkZWQgcGFnZXMsIEluIHRoaXMgY2FzZSwgd2UgbmVlZCB0byBjbGVhciB0aGUgY2FjaGUgb2YgaW1hZ2UgZm9yIGFsbCB0aGUgbG9hZGVkIHBhZ2VzLgorLy8gICAgICAgICAgVGhlIGltYWdlIG9iamVjdCBtaWdodCBhbHJlYWR5IGhhcyBhbiBhc3NvY2lhdGVkIGltYWdlLCB3aGljaCBpcworLy8gICAgICAgICAgc2hhcmVkIGFuZCBjYWNoZWQgYnkgdGhlIGxvYWRlZCBwYWdlcywgSW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvCisvLyAgICAgICAgICBjbGVhciB0aGUgY2FjaGUgb2YgaW1hZ2UgZm9yIGFsbCB0aGUgbG9hZGVkIHBhZ2VzLgogLy8gICAgICAgICAgUGFzcyBwYWdlcyBhbmQgY291bnQgdG8gdGhpcyBBUEkgdG8gY2xlYXIgdGhlIGltYWdlIGNhY2hlLgotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZJbWFnZU9ial9Mb2FkSnBlZ0ZpbGUoRlBERl9QQUdFKiBwYWdlcywgaW50IG5Db3VudCxGUERGX1BBR0VPQkpFQ1QgaW1hZ2Vfb2JqZWN0LCBGUERGX0ZJTEVBQ0NFU1MqIGZpbGVBY2Nlc3MpOwotCitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwKK0ZQREZJbWFnZU9ial9Mb2FkSnBlZ0ZpbGUoRlBERl9QQUdFKiBwYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFT0JKRUNUIGltYWdlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9GSUxFQUNDRVNTKiBmaWxlQWNjZXNzKTsKIAogLy8gRnVuY3Rpb246IEZQREZJbWFnZU9ial9TZXRNYXRyaXgKIC8vICAgICAgICAgIFNldCB0aGUgbWF0cml4IG9mIGFuIGltYWdlIG9iamVjdC4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBpbWFnZV9vYmplY3QgICAgLSAgIEhhbmRsZSBvZiBpbWFnZSBvYmplY3QgcmV0dXJuZWQgYnkgRlBERlBhZ2VPYmpfTmV3SW1nZU9iai4KKy8vICAgICAgICAgIGltYWdlX29iamVjdCAgICAtICAgSGFuZGxlIG9mIGltYWdlIG9iamVjdCByZXR1cm5lZCBieQorLy8gICAgICAgICAgRlBERlBhZ2VPYmpfTmV3SW1nZU9iai4KIC8vICAgICAgICAgIGEgICAgICAgICAgICAgICAtICAgVGhlIGNvZWZmaWNpZW50ICJhIiBvZiB0aGUgbWF0cml4LgogLy8gICAgICAgICAgYiAgICAgICAgICAgICAgIC0gICBUaGUgY29lZmZpY2llbnQgImIiIG9mIHRoZSBtYXRyaXguCiAvLyAgICAgICAgICBjICAgICAgICAgICAgICAgLSAgIFRoZSBjb2VmZmljaWVudCAiYyIgb2YgdGhlIG1hdHJpeC4KQEAgLTIyOCwxOCArMjc3LDI4IEBACiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4KIERMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGSW1hZ2VPYmpfU2V0TWF0cml4KEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSBjLCBkb3VibGUgZCwgZG91YmxlIGUsIGRvdWJsZSBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZik7CiAKIC8vIEZ1bmN0aW9uOiBGUERGSW1hZ2VPYmpfU2V0Qml0bWFwCiAvLyAgICAgICAgICBTZXQgdGhlIGJpdG1hcCB0byBhbiBpbWFnZSBvYmplY3QuCiAvLyBQYXJhbWV0ZXJzOgogLy8gICAgICAgICAgcGFnZXMgICAgICAgICAgIC0gICBQb2ludGVyJ3MgdG8gdGhlIHN0YXJ0IG9mIGFsbCBsb2FkZWQgcGFnZXMuCiAvLyAgICAgICAgICBuQ291bnQgICAgICAgICAgLSAgIE51bWJlciBvZiBwYWdlcy4KLS8vICAgICAgICAgIGltYWdlX29iamVjdCAgICAtICAgSGFuZGxlIG9mIGltYWdlIG9iamVjdCByZXR1cm5lZCBieSBGUERGUGFnZU9ial9OZXdJbWdlT2JqLgotLy8gICAgICAgICAgYml0bWFwICAgICAgICAgIC0gICBUaGUgaGFuZGxlIG9mIHRoZSBiaXRtYXAgd2hpY2ggeW91IHdhbnQgdG8gc2V0IGl0IHRvIHRoZSBpbWFnZSBvYmplY3QuCisvLyAgICAgICAgICBpbWFnZV9vYmplY3QgICAgLSAgIEhhbmRsZSBvZiBpbWFnZSBvYmplY3QgcmV0dXJuZWQgYnkKKy8vICAgICAgICAgIEZQREZQYWdlT2JqX05ld0ltZ2VPYmouCisvLyAgICAgICAgICBiaXRtYXAgICAgICAgICAgLSAgIFRoZSBoYW5kbGUgb2YgdGhlIGJpdG1hcCB3aGljaCB5b3Ugd2FudCB0byBzZXQKKy8vICAgICAgICAgIGl0IHRvIHRoZSBpbWFnZSBvYmplY3QuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGSW1hZ2VPYmpfU2V0Qml0bWFwKEZQREZfUEFHRSogcGFnZXMsaW50IG5Db3VudCxGUERGX1BBR0VPQkpFQ1QgaW1hZ2Vfb2JqZWN0LCBGUERGX0JJVE1BUCBiaXRtYXApOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZJbWFnZU9ial9TZXRCaXRtYXAoRlBERl9QQUdFKiBwYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0VPQkpFQ1QgaW1hZ2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CSVRNQVAgYml0bWFwKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9wdWJsaWMvZnBkZl9leHQuaCBiL3B1YmxpYy9mcGRmX2V4dC5oCmluZGV4IDgwMTZkMmUuLmM4MGRjYmIgMTAwNjQ0Ci0tLSBhL3B1YmxpYy9mcGRmX2V4dC5oCisrKyBiL3B1YmxpYy9mcGRmX2V4dC5oCkBAIC0xMyw0NSArMTMsNDQgQEAKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKLS8vZmxhZ3MgZm9yIHR5cGUgb2YgdW5zdXBwb3J0IG9iamVjdC4KLSNkZWZpbmUgRlBERl9VTlNQX0RPQ19YRkFGT1JNICAgICAgICAgICAgICAgMQotI2RlZmluZSBGUERGX1VOU1BfRE9DX1BPUlRBQkxFQ09MTEVDVElPTiAgICAyCi0jZGVmaW5lIEZQREZfVU5TUF9ET0NfQVRUQUNITUVOVCAgICAgICAgICAgIDMKLSNkZWZpbmUgRlBERl9VTlNQX0RPQ19TRUNVUklUWSAgICAgICAgICAgICAgNAotI2RlZmluZSBGUERGX1VOU1BfRE9DX1NIQVJFRFJFVklFVyAgICAgICAgICA1Ci0jZGVmaW5lIEZQREZfVU5TUF9ET0NfU0hBUkVERk9STV9BQ1JPQkFUICAgIDYKKy8vIGZsYWdzIGZvciB0eXBlIG9mIHVuc3VwcG9ydCBvYmplY3QuCisjZGVmaW5lIEZQREZfVU5TUF9ET0NfWEZBRk9STSAxCisjZGVmaW5lIEZQREZfVU5TUF9ET0NfUE9SVEFCTEVDT0xMRUNUSU9OIDIKKyNkZWZpbmUgRlBERl9VTlNQX0RPQ19BVFRBQ0hNRU5UIDMKKyNkZWZpbmUgRlBERl9VTlNQX0RPQ19TRUNVUklUWSA0CisjZGVmaW5lIEZQREZfVU5TUF9ET0NfU0hBUkVEUkVWSUVXIDUKKyNkZWZpbmUgRlBERl9VTlNQX0RPQ19TSEFSRURGT1JNX0FDUk9CQVQgNgogI2RlZmluZSBGUERGX1VOU1BfRE9DX1NIQVJFREZPUk1fRklMRVNZU1RFTSA3Ci0jZGVmaW5lIEZQREZfVU5TUF9ET0NfU0hBUkVERk9STV9FTUFJTCAgICAgIDgKLSNkZWZpbmUgRlBERl9VTlNQX0FOTk9UXzNEQU5OT1QgICAgICAgICAgICAgMTEKLSNkZWZpbmUgRlBERl9VTlNQX0FOTk9UX01PVklFICAgICAgICAgICAgICAgMTIKLSNkZWZpbmUgRlBERl9VTlNQX0FOTk9UX1NPVU5EICAgICAgICAgICAgICAgMTMKLSNkZWZpbmUgRlBERl9VTlNQX0FOTk9UX1NDUkVFTl9NRURJQSAgICAgICAgMTQKLSNkZWZpbmUgRlBERl9VTlNQX0FOTk9UX1NDUkVFTl9SSUNITUVESUEgICAgMTUKLSNkZWZpbmUgRlBERl9VTlNQX0FOTk9UX0FUVEFDSE1FTlQgICAgICAgICAgMTYKLSNkZWZpbmUgRlBERl9VTlNQX0FOTk9UX1NJRyAgICAgICAgICAgICAgICAgMTcKKyNkZWZpbmUgRlBERl9VTlNQX0RPQ19TSEFSRURGT1JNX0VNQUlMIDgKKyNkZWZpbmUgRlBERl9VTlNQX0FOTk9UXzNEQU5OT1QgMTEKKyNkZWZpbmUgRlBERl9VTlNQX0FOTk9UX01PVklFIDEyCisjZGVmaW5lIEZQREZfVU5TUF9BTk5PVF9TT1VORCAxMworI2RlZmluZSBGUERGX1VOU1BfQU5OT1RfU0NSRUVOX01FRElBIDE0CisjZGVmaW5lIEZQREZfVU5TUF9BTk5PVF9TQ1JFRU5fUklDSE1FRElBIDE1CisjZGVmaW5lIEZQREZfVU5TUF9BTk5PVF9BVFRBQ0hNRU5UIDE2CisjZGVmaW5lIEZQREZfVU5TUF9BTk5PVF9TSUcgMTcKIAotdHlwZWRlZiBzdHJ1Y3QgX1VOU1VQUE9SVF9JTkZPCi17Ci0gICAgLyoqCi0gICAgKiBWZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlLiBDdXJyZW50bHkgbXVzdCBiZSAxLgotICAgICoqLwotICAgIGludCB2ZXJzaW9uOwordHlwZWRlZiBzdHJ1Y3QgX1VOU1VQUE9SVF9JTkZPIHsKKyAgLyoqCisgICogVmVyc2lvbiBudW1iZXIgb2YgdGhlIGludGVyZmFjZS4gQ3VycmVudGx5IG11c3QgYmUgMS4KKyAgKiovCisgIGludCB2ZXJzaW9uOwogCi0gICAgLyoqCi0gICAgKiBNZXRob2Q6IEZTREtfVW5TdXBwb3J0X0hhbmRsZXIKLSAgICAqICAgICAgICAgICAgVW5TdXBwb3J0IE9iamVjdCBwcm9jZXNzIGhhbmRsaW5nIGZ1bmN0aW9uLgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgWWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICogICAgICAgblR5cGUgICAgICAgLSAgIFRoZSB0eXBlIG9mIHVuc3VwcG9ydE9iamVjdAotICAgICogICBSZXR1cm4gdmFsdWU6Ci0gICAgKiAgICAgICBOb25lLgotICAgICogKi8KKyAgLyoqCisgICogTWV0aG9kOiBGU0RLX1VuU3VwcG9ydF9IYW5kbGVyCisgICogICAgICAgICAgICBVblN1cHBvcnQgT2JqZWN0IHByb2Nlc3MgaGFuZGxpbmcgZnVuY3Rpb24uCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgWWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICAgICAgblR5cGUgICAgICAgLSAgIFRoZSB0eXBlIG9mIHVuc3VwcG9ydE9iamVjdAorICAqICAgUmV0dXJuIHZhbHVlOgorICAqICAgICAgIE5vbmUuCisgICogKi8KIAotICAgIHZvaWQoKkZTREtfVW5TdXBwb3J0X0hhbmRsZXIpKHN0cnVjdCBfVU5TVVBQT1JUX0lORk8qIHBUaGlzLCBpbnQgblR5cGUpOworICB2b2lkICgqRlNES19VblN1cHBvcnRfSGFuZGxlcikoc3RydWN0IF9VTlNVUFBPUlRfSU5GTyogcFRoaXMsIGludCBuVHlwZSk7CiB9IFVOU1VQUE9SVF9JTkZPOwogCiAvKioKQEAgLTYzLDM3ICs2Miw0MCBAQAogICogICAgICAgICAgVFJVRSBtZWFucyBzdWNjZXNzZnVsLiBGQUxTRSBtZWFucyBmYWlscy4KICAqKi8KIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZTREtfU2V0VW5TcE9ialByb2Nlc3NIYW5kbGVyKFVOU1VQUE9SVF9JTkZPKiB1bnNwX2luZm8pOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMCitGU0RLX1NldFVuU3BPYmpQcm9jZXNzSGFuZGxlcihVTlNVUFBPUlRfSU5GTyogdW5zcF9pbmZvKTsKIAotLy9mbGFncyBmb3IgcGFnZSBtb2RlLgorLy8gZmxhZ3MgZm9yIHBhZ2UgbW9kZS4KIAotLy9Vbmtub3duIHZhbHVlCi0jZGVmaW5lIFBBR0VNT0RFX1VOS05PV04gICAgICAgIC0xCisvLyBVbmtub3duIHZhbHVlCisjZGVmaW5lIFBBR0VNT0RFX1VOS05PV04gLTEKIAotLy9OZWl0aGVyIGRvY3VtZW50IG91dGxpbmUgbm9yIHRodW1ibmFpbCBpbWFnZXMgdmlzaWJsZQotI2RlZmluZSBQQUdFTU9ERV9VU0VOT05FICAgICAgICAwCisvLyBOZWl0aGVyIGRvY3VtZW50IG91dGxpbmUgbm9yIHRodW1ibmFpbCBpbWFnZXMgdmlzaWJsZQorI2RlZmluZSBQQUdFTU9ERV9VU0VOT05FIDAKIAotLy9Eb2N1bWVudCBvdXRsaW5lIHZpc2libGUKLSNkZWZpbmUgUEFHRU1PREVfVVNFT1VUTElORVMgICAgMQorLy8gRG9jdW1lbnQgb3V0bGluZSB2aXNpYmxlCisjZGVmaW5lIFBBR0VNT0RFX1VTRU9VVExJTkVTIDEKIAotLy9UaHVtYm5pYWwgaW1hZ2VzIHZpc2libGUKLSNkZWZpbmUgUEFHRU1PREVfVVNFVEhVTUJTICAgICAgMgorLy8gVGh1bWJuaWFsIGltYWdlcyB2aXNpYmxlCisjZGVmaW5lIFBBR0VNT0RFX1VTRVRIVU1CUyAyCiAKLS8vRnVsbC1zY3JlZW4gbW9kZSwgd2l0aCBubyBtZW51IGJhciwgd2luZG93IGNvbnRyb2xzLCBvciBhbnkgb3RoZXIgd2luZG93IHZpc2libGUKLSNkZWZpbmUgUEFHRU1PREVfRlVMTFNDUkVFTiAgICAgMworLy8gRnVsbC1zY3JlZW4gbW9kZSwgd2l0aCBubyBtZW51IGJhciwgd2luZG93IGNvbnRyb2xzLCBvciBhbnkgb3RoZXIgd2luZG93CisvLyB2aXNpYmxlCisjZGVmaW5lIFBBR0VNT0RFX0ZVTExTQ1JFRU4gMwogCi0vL09wdGlvbmFsIGNvbnRlbnQgZ3JvdXAgcGFuZWwgdmlzaWJsZQotI2RlZmluZSBQQUdFTU9ERV9VU0VPQyAgICAgICAgICA0CisvLyBPcHRpb25hbCBjb250ZW50IGdyb3VwIHBhbmVsIHZpc2libGUKKyNkZWZpbmUgUEFHRU1PREVfVVNFT0MgNAogCi0vL0F0dGFjaG1lbnRzIHBhbmVsIHZpc2libGUKKy8vIEF0dGFjaG1lbnRzIHBhbmVsIHZpc2libGUKICNkZWZpbmUgUEFHRU1PREVfVVNFQVRUQUNITUVOVFMgNQogCi0KIC8qKgogICogRnVuY3Rpb246IEZQREZEb2NfR2V0UGFnZU1vZGUKLSAqICAgICAgICAgICBHZXQgdGhlIGRvY3VtZW50J3MgUGFnZU1vZGUoSG93IHRoZSBkb2N1bWVudCBzaG91bGQgYmUgZGlzcGxheWVkIHdoZW4gb3BlbmVkKQorICogICAgICAgICAgIEdldCB0aGUgZG9jdW1lbnQncyBQYWdlTW9kZShIb3cgdGhlIGRvY3VtZW50IHNob3VsZCBiZSBkaXNwbGF5ZWQKKyAqd2hlbiBvcGVuZWQpCiAgKiBQYXJhbWV0ZXJzOgotICogICAgICAgICAgZG9jICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KKyAqICAgICAgICAgIGRvYyAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQKKyAqZnVuY3Rpb24uCiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBUaGUgZmxhZ3MgZm9yIHBhZ2UgbW9kZS4KICAqKi8KZGlmZiAtLWdpdCBhL3B1YmxpYy9mcGRmX2ZsYXR0ZW4uaCBiL3B1YmxpYy9mcGRmX2ZsYXR0ZW4uaAppbmRleCBmMDZhN2NmLi5hZjc3YzI5IDEwMDY0NAotLS0gYS9wdWJsaWMvZnBkZl9mbGF0dGVuLmgKKysrIGIvcHVibGljL2ZwZGZfZmxhdHRlbi5oCkBAIC0xMCwyNyArMTAsMzEgQEAKICNpbmNsdWRlICJmcGRmdmlldy5oIgogCiAvLyBSZXN1bHQgY29kZXMuCi0jZGVmaW5lIEZMQVRURU5fRkFJTCAgICAgICAgICAgIDAgICAvLyBGbGF0dGVuIG9wZXJhdGlvbiBmYWlsZWQuCi0jZGVmaW5lIEZMQVRURU5fU1VDQ0VTUyAgICAgICAgIDEgICAvLyBGbGF0dGVuIG9wZXJhdGlvbiBzdWNjZWVkLgotI2RlZmluZSBGTEFUVEVOX05PVEhJTkdUT0RPICAgICAyICAgLy8gVGhlcmUgaXMgbm90aGluZyB0byBiZSBmbGF0dGVuZWQuCisjZGVmaW5lIEZMQVRURU5fRkFJTCAwICAgICAgICAgLy8gRmxhdHRlbiBvcGVyYXRpb24gZmFpbGVkLgorI2RlZmluZSBGTEFUVEVOX1NVQ0NFU1MgMSAgICAgIC8vIEZsYXR0ZW4gb3BlcmF0aW9uIHN1Y2NlZWQuCisjZGVmaW5lIEZMQVRURU5fTk9USElOR1RPRE8gMiAgLy8gVGhlcmUgaXMgbm90aGluZyB0byBiZSBmbGF0dGVuZWQuCiAKIC8vIEZsYWdzLgotI2RlZmluZSBGTEFUX05PUk1BTERJU1BMQVkgICAgIDAKLSNkZWZpbmUgRkxBVF9QUklOVCAgICAgICAgICAgICAxCisjZGVmaW5lIEZMQVRfTk9STUFMRElTUExBWSAwCisjZGVmaW5lIEZMQVRfUFJJTlQgMQogCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKIC8vIEZ1bmN0aW9uOiBGUERGUGFnZV9GbGF0dGVuCi0vLyAgICAgICAgICBNYWtlIGFubm90YXRpb25zIGFuZCBmb3JtIGZpZWxkcyBiZWNvbWUgcGFydCBvZiB0aGUgcGFnZSBjb250ZW50cyBpdHNlbGYuCisvLyAgICAgICAgICBNYWtlIGFubm90YXRpb25zIGFuZCBmb3JtIGZpZWxkcyBiZWNvbWUgcGFydCBvZiB0aGUgcGFnZSBjb250ZW50cworLy8gICAgICAgICAgaXRzZWxmLgogLy8gUGFyYW1ldGVyczoKIC8vICAgICAgICAgIHBhZ2UgIC0gSGFuZGxlIHRvIHRoZSBwYWdlLCBhcyByZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlKCkuCi0vLyAgICAgICAgICBuRmxhZyAtIEludGVuZGVkIHVzZSBvZiB0aGUgZmxhdHRlbmVkIHJlc3VsdDogMCBmb3Igbm9ybWFsIGRpc3BsYXksIDEgZm9yIHByaW50aW5nLgorLy8gICAgICAgICAgbkZsYWcgLSBJbnRlbmRlZCB1c2Ugb2YgdGhlIGZsYXR0ZW5lZCByZXN1bHQ6IDAgZm9yIG5vcm1hbCBkaXNwbGF5LAorLy8gICAgICAgICAgMSBmb3IgcHJpbnRpbmcuCiAvLyBSZXR1cm4gdmFsdWU6Ci0vLyAgICAgICAgICBFaXRoZXIgRkxBVFRFTl9GQUlMLCBGTEFUVEVOX1NVQ0NFU1MsIG9yIEZMQVRURU5fTk9USElOR1RPRE8gKHNlZSBhYm92ZSkuCisvLyAgICAgICAgICBFaXRoZXIgRkxBVFRFTl9GQUlMLCBGTEFUVEVOX1NVQ0NFU1MsIG9yIEZMQVRURU5fTk9USElOR1RPRE8gKHNlZQorLy8gICAgICAgICAgYWJvdmUpLgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBDdXJyZW50bHksIGFsbCBmYWlsdXJlcyByZXR1cm4gRkxBVFRFTl9GQUlMLCB3aXRoIG5vIGluZGljYXRpb24gZm9yIHRoZSByZWFzb24KKy8vICAgICAgICAgIEN1cnJlbnRseSwgYWxsIGZhaWx1cmVzIHJldHVybiBGTEFUVEVOX0ZBSUwsIHdpdGggbm8gaW5kaWNhdGlvbiBmb3IKKy8vICAgICAgICAgIHRoZSByZWFzb24KIC8vICAgICAgICAgIGZvciB0aGUgZmFpbHVyZS4KIERMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGUGFnZV9GbGF0dGVuKEZQREZfUEFHRSBwYWdlLCBpbnQgbkZsYWcpOwogCmRpZmYgLS1naXQgYS9wdWJsaWMvZnBkZl9mb3JtZmlsbC5oIGIvcHVibGljL2ZwZGZfZm9ybWZpbGwuaAppbmRleCBhMWI5ZWMyLi5iM2JiYjkyIDEwMDY0NAotLS0gYS9wdWJsaWMvZnBkZl9mb3JtZmlsbC5oCisrKyBiL3B1YmxpYy9mcGRmX2Zvcm1maWxsLmgKQEAgLTExLDU0NyArMTEsMTAzMiBAQAogCiB0eXBlZGVmIHZvaWQqIEZQREZfRk9STUhBTkRMRTsKIAorI2lmZGVmIFBERl9FTkFCTEVfWEZBCisjZGVmaW5lIERPQ1RZUEVfUERGIDAgICAgICAgICAgLy8gTm9ybWFsIHBkZiBEb2N1bWVudAorI2RlZmluZSBET0NUWVBFX0RZTkFNSUNfWEZBIDEgIC8vIER5bmFtaWMgeGZhIERvY3VtZW50IFR5cGUKKyNkZWZpbmUgRE9DVFlQRV9TVEFUSUNfWEZBIDIgICAvLyBTdGF0aWMgeGZhIERvY3VtZW50IFR5cGUKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKwogLy8gRXhwb3J0ZWQgRnVuY3Rpb25zCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKLXR5cGVkZWYgc3RydWN0IF9JUERGX0pzUGxhdGZvcm0KLXsKLS8qKgotKiBWZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlLiBDdXJyZW50bHkgbXVzdCBiZSAxLgotICAgICoqLwotICAgIGludCB2ZXJzaW9uOwordHlwZWRlZiBzdHJ1Y3QgX0lQREZfSnNQbGF0Zm9ybSB7CisgIC8qKgorICAqIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UuIEN1cnJlbnRseSBtdXN0IGJlIDIuCisgICoqLworICBpbnQgdmVyc2lvbjsKIAotICAgIC8qKgotICAgICogTWV0aG9kOiBhcHBfYWxlcnQKLSAgICAqICAgICAgICAgICBwb3AgdXAgYSBkaWFsb2cgdG8gc2hvdyB3YXJuaW5nIG9yIGhpbnQuCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICB5ZXMKLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCi0gICAgKiAgICAgICAgICAgTXNnICAgICAgICAgLSAgIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkLgotICAgICogICAgICAgICAgIFRpdGxlICAgICAgIC0gICBUaGUgdGl0bGUgb2YgdGhlIGRpYWxvZy4KLSAgICAqICAgICAgICAgICBUeXBlICAgICAgICAtICAgVGhlIHN0eXBlIG9mIGJ1dHRvbiBncm91cC4KLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMC1PSyhkZWZhdWx0KTsKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMS1PSyxDYW5jZWw7Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDItWWVzLE5POwotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAzLVllcywgTk8sIENhbmNlbC4KLSAgICAqICAgICAgICAgICBuSWNvbiAgICAgICAtICAgVGhlIEljb24gdHlwZS4KLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMC1FcnJvcihkZWZhdWx0KTsKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMS1XYXJuaW5nOwotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAyLVF1ZXN0aW9uOwotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAzLVN0YXR1cy4KLSAgICAqIFJldHVybiBWYWx1ZToKLSAgICAqICAgICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGNvdWxkIGJlIHRoZSBmb2xvd2luZyB0eXBlOgotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAxLU9LOwotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAyLUNhbmNlbDsKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMy1OTzsKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgNC1ZZXM7Ci0gICAgKi8KLSAgICBpbnQgKCphcHBfYWxlcnQpKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcywgRlBERl9XSURFU1RSSU5HIE1zZywgRlBERl9XSURFU1RSSU5HIFRpdGxlLCBpbnQgVHlwZSwgaW50IEljb24pOworICAvKiBWZXJzaW9uIDEuICovCiAKLSAgICAvKioKLSAgICAqIE1ldGhvZDogYXBwX2JlZXAKLSAgICAqICAgICAgICAgICBDYXVzZXMgdGhlIHN5c3RlbSB0byBwbGF5IGEgc291bmQuCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICB5ZXMKLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCi0gICAgKiAgICAgICAgICAgblR5cGUgICAgICAgLSAgIFRoZSBzb3VuZCB0eXBlLgotICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gRXJyb3IKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtIFdhcm5pbmcKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAtIFF1ZXN0aW9uCi0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgLSBTdGF0dXMKLSAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAtIERlZmF1bHQgKGRlZmF1bHQgdmFsdWUpCi0gICAgKiBSZXR1cm4gVmFsdWU6Ci0gICAgKiAgICAgICAgICAgTm9uZQotICAgICovCi0gICAgdm9pZCAoKmFwcF9iZWVwKShzdHJ1Y3QgX0lQREZfSnNQbGF0Zm9ybSogcFRoaXMsICBpbnQgblR5cGUpOworICAvKioKKyAgKiBNZXRob2Q6IGFwcF9hbGVydAorICAqICAgICAgICAgICBwb3AgdXAgYSBkaWFsb2cgdG8gc2hvdyB3YXJuaW5nIG9yIGhpbnQuCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCisgICogICAgICAgICAgIE1zZyAgICAgICAgIC0gICBBIHN0cmluZyBjb250YWluaW5nIHRoZSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZC4KKyAgKiAgICAgICAgICAgVGl0bGUgICAgICAgLSAgIFRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nLgorICAqICAgICAgICAgICBUeXBlICAgICAgICAtICAgVGhlIHN0eXBlIG9mIGJ1dHRvbiBncm91cC4KKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAtT0soZGVmYXVsdCk7CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAxLU9LLENhbmNlbDsKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDItWWVzLE5POworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMy1ZZXMsIE5PLCBDYW5jZWwuCisgICogICAgICAgICAgIG5JY29uICAgICAgIC0gICBUaGUgSWNvbiB0eXBlLgorICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMC1FcnJvcihkZWZhdWx0KTsKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEtV2FybmluZzsKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDItUXVlc3Rpb247CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAzLVN0YXR1cy4KKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDQtQXN0ZXJpc2sKKyAgKiBSZXR1cm4gVmFsdWU6CisgICogICAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgY291bGQgYmUgdGhlIGZvbG93aW5nIHR5cGU6CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAxLU9LOworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgMi1DYW5jZWw7CisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAzLU5POworICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgNC1ZZXM7CisgICovCisgIGludCAoKmFwcF9hbGVydCkoc3RydWN0IF9JUERGX0pzUGxhdGZvcm0qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBNc2csCisgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIFRpdGxlLAorICAgICAgICAgICAgICAgICAgIGludCBUeXBlLAorICAgICAgICAgICAgICAgICAgIGludCBJY29uKTsKIAotICAgIC8qKgotICAgICogTWV0aG9kOiBhcHBfcmVzcG9uc2UKLSAgICAqICAgICAgICAgICBEaXNwbGF5cyBhIGRpYWxvZyBib3ggY29udGFpbmluZyBhIHF1ZXN0aW9uIGFuZCBhbiBlbnRyeSBmaWVsZCBmb3IgdGhlIHVzZXIgdG8gcmVwbHkgdG8gdGhlIHF1ZXN0aW9uLgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZgotICAgICogICAgICAgICAgIFF1ZXN0aW9uICAgIC0gICBUaGUgcXVlc3Rpb24gdG8gYmUgcG9zZWQgdG8gdGhlIHVzZXIuCi0gICAgKiAgICAgICAgICAgVGl0bGUgICAgICAgLSAgIFRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nIGJveC4KLSAgICAqICAgICAgICAgICBEZWZhdWx0ICAgICAtICAgQSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYW5zd2VyIHRvIHRoZSBxdWVzdGlvbi4gSWYgbm90IHNwZWNpZmllZCwgbm8gZGVmYXVsdCB2YWx1ZSBpcyBwcmVzZW50ZWQuCi0gICAgKiAgICAgICAgICAgY0xhYmVsICAgICAgLSAgIEEgc2hvcnQgc3RyaW5nIHRvIGFwcGVhciBpbiBmcm9udCBvZiBhbmQgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgZWRpdCB0ZXh0IGZpZWxkLgotICAgICogICAgICAgICAgIGJQYXNzd29yZCAgIC0gICBJZiB0cnVlLCBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlcidzIHJlc3BvbnNlIHNob3VsZCBzaG93IGFzIGFzdGVyaXNrcyAoKikgb3IgYnVsbGV0cyAoPykgdG8gbWFzayB0aGUgcmVzcG9uc2UsIHdoaWNoIG1pZ2h0IGJlIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi4gVGhlIGRlZmF1bHQgaXMgZmFsc2UuCi0gICAgKiAgICAgICAgICAgcmVzcG9uc2UgICAgLSAgIEEgc3RyaW5nIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgU0RLLCB0byByZWNlaXZlIHRoZSB1c2VyJ3MgcmVzcG9uc2UuCi0gICAgKiAgICAgICAgICAgbGVuZ3RoICAgICAgLSAgIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciwgbnVtYmVyIG9mIGJ5dGVzLiBDdXJyZW50bHksIEl0J3MgYWx3YXlzIGJlIDIwNDguCi0gICAgKiBSZXR1cm4gVmFsdWU6Ci0gICAgKiAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdGhlIGNvbXBsZXRlIHVzZXIgaW5wdXQgd291bGQgYWN0dWFsbHkgcmVxdWlyZSwgbm90IGluY2x1ZGluZyB0cmFpbGluZyB6ZXJvcywgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgdGhlIGxlbmd0aAotICAgICogICAgICAgcGFyYW1ldGVyIG9yIHRoZSBwcmVzZW5jZSBvZiB0aGUgcmVzcG9uc2UgYnVmZmVyLgotICAgICogQ29tbWVudHM6Ci0gICAgKiAgICAgICBObyBtYXR0ZXIgb24gd2hhdCBwbGF0Zm9ybSwgdGhlIHJlc3BvbnNlIGJ1ZmZlciBzaG91bGQgYmUgYWx3YXlzIHdyaXR0ZW4gdXNpbmcgVVRGLTE2TEUgZW5jb2RpbmcuIElmIGEgcmVzcG9uc2UgYnVmZmVyIGlzCi0gICAgKiAgICAgICBwcmVzZW50IGFuZCB0aGUgc2l6ZSBvZiB0aGUgdXNlciBpbnB1dCBleGNlZWRzIHRoZSBjYXBhY2l0eSBvZiB0aGUgYnVmZmVyIGFzIHNwZWNpZmllZCBieSB0aGUgbGVuZ3RoIHBhcmFtZXRlciwgb25seSB0aGUKLSAgICAqICAgICAgIGZpcnN0ICJsZW5ndGgiIGJ5dGVzIG9mIHRoZSB1c2VyIGlucHV0IGFyZSB0byBiZSB3cml0dGVuIHRvIHRoZSBidWZmZXIuCi0gICAgKi8KLSAgICBpbnQgKCphcHBfcmVzcG9uc2UpKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcywgRlBERl9XSURFU1RSSU5HIFF1ZXN0aW9uLCBGUERGX1dJREVTVFJJTkcgVGl0bGUsIEZQREZfV0lERVNUUklORyBEZWZhdWx0LCBGUERGX1dJREVTVFJJTkcgY0xhYmVsLCBGUERGX0JPT0wgYlBhc3N3b3JkLCB2b2lkKiByZXNwb25zZSwgaW50IGxlbmd0aCk7CisgIC8qKgorICAqIE1ldGhvZDogYXBwX2JlZXAKKyAgKiAgICAgICAgICAgQ2F1c2VzIHRoZSBzeXN0ZW0gdG8gcGxheSBhIHNvdW5kLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZgorICAqICAgICAgICAgICBuVHlwZSAgICAgICAtICAgVGhlIHNvdW5kIHR5cGUuCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gRXJyb3IKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBXYXJuaW5nCisgICogICAgICAgICAgICAgICAgICAgICAgICAgICAyIC0gUXVlc3Rpb24KKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgLSBTdGF0dXMKKyAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgLSBEZWZhdWx0IChkZWZhdWx0IHZhbHVlKQorICAqIFJldHVybiBWYWx1ZToKKyAgKiAgICAgICAgICAgTm9uZQorICAqLworICB2b2lkICgqYXBwX2JlZXApKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcywgaW50IG5UeXBlKTsKIAotICAgIC8qCi0gICAgKiBNZXRob2Q6IERvY19nZXRGaWxlUGF0aAotICAgICogICAgICAgICAgIEdldCB0aGUgZmlsZSBwYXRoIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50LgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZgotICAgICogICAgICAgICAgIGZpbGVQYXRoICAgIC0gICBUaGUgc3RyaW5nIGJ1ZmZlciB0byByZWNlaXZlIHRoZSBmaWxlIHBhdGguIENhbiBiZSBOVUxMLgotICAgICogICAgICAgICAgIGxlbmd0aCAgICAgIC0gICBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIsIG51bWJlciBvZiBieXRlcy4gQ2FuIGJlIDAuCi0gICAgKiBSZXR1cm4gVmFsdWU6Ci0gICAgKiAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdGhlIGZpbGVQYXRoIGNvbnN1bWVzLCBpbmNsdWRpbmcgdHJhaWxpbmcgemVyb3MuCi0gICAgKiBDb21tZW50czoKLSAgICAqICAgICAgIFRoZSBmaWxlUGF0aCBzaG91bGQgYmUgYWx3YXlzIGlucHV0IGluIGxvY2FsIGVuY29kaW5nLgotICAgICoKLSAgICAqICAgICAgIFRoZSByZXR1cm4gdmFsdWUgYWx3YXlzIGluZGljYXRlZCBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBidWZmZXIsIGV2ZW4gd2hlbiB0aGVyZSBpcwotICAgICogICAgICAgbm8gYnVmZmVyIHNwZWNpZmllZCwgb3IgdGhlIGJ1ZmZlciBzaXplIGlzIGxlc3MgdGhlbiByZXF1aXJlZC4gSW4gdGhpcyBjYXNlLCB0aGUgYnVmZmVyIHdpbGwgbm90Ci0gICAgKiAgICAgICBiZSBtb2RpZmllZC4KLSAgICAqLwotICAgIGludCAoKkRvY19nZXRGaWxlUGF0aCkoc3RydWN0IF9JUERGX0pzUGxhdGZvcm0qIHBUaGlzLCB2b2lkKiBmaWxlUGF0aCwgaW50IGxlbmd0aCk7CisgIC8qKgorICAqIE1ldGhvZDogYXBwX3Jlc3BvbnNlCisgICogICAgICAgICAgIERpc3BsYXlzIGEgZGlhbG9nIGJveCBjb250YWluaW5nIGEgcXVlc3Rpb24gYW5kIGFuIGVudHJ5IGZpZWxkIGZvcgorICAqIHRoZSB1c2VyIHRvIHJlcGx5IHRvIHRoZSBxdWVzdGlvbi4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKKyAgKiAgICAgICAgICAgUXVlc3Rpb24gICAgLSAgIFRoZSBxdWVzdGlvbiB0byBiZSBwb3NlZCB0byB0aGUgdXNlci4KKyAgKiAgICAgICAgICAgVGl0bGUgICAgICAgLSAgIFRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nIGJveC4KKyAgKiAgICAgICAgICAgRGVmYXVsdCAgICAgLSAgIEEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGFuc3dlciB0byB0aGUgcXVlc3Rpb24uIElmCisgICogbm90IHNwZWNpZmllZCwgbm8gZGVmYXVsdCB2YWx1ZSBpcyBwcmVzZW50ZWQuCisgICogICAgICAgICAgIGNMYWJlbCAgICAgIC0gICBBIHNob3J0IHN0cmluZyB0byBhcHBlYXIgaW4gZnJvbnQgb2YgYW5kIG9uIHRoZQorICAqIHNhbWUgbGluZSBhcyB0aGUgZWRpdCB0ZXh0IGZpZWxkLgorICAqICAgICAgICAgICBiUGFzc3dvcmQgICAtICAgSWYgdHJ1ZSwgaW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIncyByZXNwb25zZSBzaG91bGQKKyAgKiBzaG93IGFzIGFzdGVyaXNrcyAoKikgb3IgYnVsbGV0cyAoPykgdG8gbWFzayB0aGUgcmVzcG9uc2UsIHdoaWNoIG1pZ2h0IGJlCisgICogc2Vuc2l0aXZlIGluZm9ybWF0aW9uLiBUaGUgZGVmYXVsdCBpcyBmYWxzZS4KKyAgKiAgICAgICAgICAgcmVzcG9uc2UgICAgLSAgIEEgc3RyaW5nIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgU0RLLCB0byByZWNlaXZlIHRoZQorICAqIHVzZXIncyByZXNwb25zZS4KKyAgKiAgICAgICAgICAgbGVuZ3RoICAgICAgLSAgIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciwgbnVtYmVyIG9mIGJ5dGVzLgorICAqIEN1cnJlbnRseSwgSXQncyBhbHdheXMgYmUgMjA0OC4KKyAgKiBSZXR1cm4gVmFsdWU6CisgICogICAgICAgTnVtYmVyIG9mIGJ5dGVzIHRoZSBjb21wbGV0ZSB1c2VyIGlucHV0IHdvdWxkIGFjdHVhbGx5IHJlcXVpcmUsIG5vdAorICAqIGluY2x1ZGluZyB0cmFpbGluZyB6ZXJvcywgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgdGhlIGxlbmd0aAorICAqICAgICAgIHBhcmFtZXRlciBvciB0aGUgcHJlc2VuY2Ugb2YgdGhlIHJlc3BvbnNlIGJ1ZmZlci4KKyAgKiBDb21tZW50czoKKyAgKiAgICAgICBObyBtYXR0ZXIgb24gd2hhdCBwbGF0Zm9ybSwgdGhlIHJlc3BvbnNlIGJ1ZmZlciBzaG91bGQgYmUgYWx3YXlzCisgICogd3JpdHRlbiB1c2luZyBVVEYtMTZMRSBlbmNvZGluZy4gSWYgYSByZXNwb25zZSBidWZmZXIgaXMKKyAgKiAgICAgICBwcmVzZW50IGFuZCB0aGUgc2l6ZSBvZiB0aGUgdXNlciBpbnB1dCBleGNlZWRzIHRoZSBjYXBhY2l0eSBvZiB0aGUKKyAgKiBidWZmZXIgYXMgc3BlY2lmaWVkIGJ5IHRoZSBsZW5ndGggcGFyYW1ldGVyLCBvbmx5IHRoZQorICAqICAgICAgIGZpcnN0ICJsZW5ndGgiIGJ5dGVzIG9mIHRoZSB1c2VyIGlucHV0IGFyZSB0byBiZSB3cml0dGVuIHRvIHRoZQorICAqIGJ1ZmZlci4KKyAgKi8KKyAgaW50ICgqYXBwX3Jlc3BvbnNlKShzdHJ1Y3QgX0lQREZfSnNQbGF0Zm9ybSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIFF1ZXN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBUaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgY0xhYmVsLAorICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiUGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCk7CiAKKyAgLyoKKyAgKiBNZXRob2Q6IERvY19nZXRGaWxlUGF0aAorICAqICAgICAgICAgICBHZXQgdGhlIGZpbGUgcGF0aCBvZiB0aGUgY3VycmVudCBkb2N1bWVudC4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKKyAgKiAgICAgICAgICAgZmlsZVBhdGggICAgLSAgIFRoZSBzdHJpbmcgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGZpbGUgcGF0aC4gQ2FuIGJlCisgICogTlVMTC4KKyAgKiAgICAgICAgICAgbGVuZ3RoICAgICAgLSAgIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciwgbnVtYmVyIG9mIGJ5dGVzLiBDYW4gYmUKKyAgKiAwLgorICAqIFJldHVybiBWYWx1ZToKKyAgKiAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdGhlIGZpbGVQYXRoIGNvbnN1bWVzLCBpbmNsdWRpbmcgdHJhaWxpbmcgemVyb3MuCisgICogQ29tbWVudHM6CisgICogICAgICAgVGhlIGZpbGVQYXRoIHNob3VsZCBiZSBhbHdheXMgaW5wdXQgaW4gbG9jYWwgZW5jb2RpbmcuCisgICoKKyAgKiAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGFsd2F5cyBpbmRpY2F0ZWQgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUKKyAgKiBidWZmZXIsIGV2ZW4gd2hlbiB0aGVyZSBpcworICAqICAgICAgIG5vIGJ1ZmZlciBzcGVjaWZpZWQsIG9yIHRoZSBidWZmZXIgc2l6ZSBpcyBsZXNzIHRoZW4gcmVxdWlyZWQuIEluIHRoaXMKKyAgKiBjYXNlLCB0aGUgYnVmZmVyIHdpbGwgbm90CisgICogICAgICAgYmUgbW9kaWZpZWQuCisgICovCisgIGludCAoKkRvY19nZXRGaWxlUGF0aCkoc3RydWN0IF9JUERGX0pzUGxhdGZvcm0qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpOwogCi0gICAgLyoKLSAgICAqIE1ldGhvZDogRG9jX21haWwKLSAgICAqICAgICAgICAgICBNYWlscyB0aGUgZGF0YSBidWZmZXIgYXMgYW4gYXR0YWNobWVudCB0byBhbGwgcmVjaXBpZW50cywgd2l0aCBvciB3aXRob3V0IHVzZXIgaW50ZXJhY3Rpb24uCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICB5ZXMKLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCi0gICAgKiAgICAgICAgICAgbWFpbERhdGEgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyIHRvIGJlIHNlbnQuQ2FuIGJlIE5VTEwuCi0gICAgKiAgICAgICAgICAgbGVuZ3RoICAgICAgLSAgIFRoZSBzaXplLGluIGJ5dGVzLCBvZiB0aGUgYnVmZmVyIHBvaW50ZWQgYnkgbWFpbERhdGEgcGFyYW1ldGVyLkNhbiBiZSAwLgotICAgICogICAgICAgICAgIGJVSSAgICAgICAgIC0gICBJZiB0cnVlLCB0aGUgcmVzdCBvZiB0aGUgcGFyYW1ldGVycyBhcmUgdXNlZCBpbiBhIGNvbXBvc2UtbmV3LW1lc3NhZ2Ugd2luZG93IHRoYXQgaXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyLiBJZiBmYWxzZSwgdGhlIGNUbyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQgYW5kIGFsbCBvdGhlcnMgYXJlIG9wdGlvbmFsLgotICAgICogICAgICAgICAgIFRvICAgICAgICAgIC0gICBBIHNlbWljb2xvbi1kZWxpbWl0ZWQgbGlzdCBvZiByZWNpcGllbnRzIGZvciB0aGUgbWVzc2FnZS4KLSAgICAqICAgICAgICAgICBTdWJqZWN0ICAgICAtICAgVGhlIHN1YmplY3Qgb2YgdGhlIG1lc3NhZ2UuIFRoZSBsZW5ndGggbGltaXQgaXMgNjQgS0IuCi0gICAgKiAgICAgICAgICAgQ0MgICAgICAgICAgLSAgIEEgc2VtaWNvbG9uLWRlbGltaXRlZCBsaXN0IG9mIENDIHJlY2lwaWVudHMgZm9yIHRoZSBtZXNzYWdlLgotICAgICogICAgICAgICAgIEJDQyAgICAgICAgIC0gICBBIHNlbWljb2xvbi1kZWxpbWl0ZWQgbGlzdCBvZiBCQ0MgcmVjaXBpZW50cyBmb3IgdGhlIG1lc3NhZ2UuCi0gICAgKiAgICAgICAgICAgTXNnICAgICAgICAgLSAgIFRoZSBjb250ZW50IG9mIHRoZSBtZXNzYWdlLiBUaGUgbGVuZ3RoIGxpbWl0IGlzIDY0IEtCLgotICAgICogUmV0dXJuIFZhbHVlOgotICAgICogICAgICAgICAgIE5vbmUuCi0gICAgKiBDb21tZW50czoKLSAgICAqICAgICAgICAgICBJZiB0aGUgcGFyYW1ldGVyIG1haWxEYXRhIGlzIE5VTEwgb3IgbGVuZ3RoIGlzIDAsIHRoZSBjdXJyZW50IGRvY3VtZW50IHdpbGwgYmUgbWFpbGVkIGFzIGFuIGF0dGFjaG1lbnQgdG8gYWxsIHJlY2lwaWVudHMuCi0gICAgKi8KLSAgICB2b2lkICgqRG9jX21haWwpKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcyx2b2lkKiBtYWlsRGF0YSwgaW50IGxlbmd0aCxGUERGX0JPT0wgYlVJLCBGUERGX1dJREVTVFJJTkcgVG8sIEZQREZfV0lERVNUUklORyBTdWJqZWN0LCBGUERGX1dJREVTVFJJTkcgQ0MsIEZQREZfV0lERVNUUklORyBCQ0MsIEZQREZfV0lERVNUUklORyBNc2cpOworICAvKgorICAqIE1ldGhvZDogRG9jX21haWwKKyAgKiAgICAgICAgICAgTWFpbHMgdGhlIGRhdGEgYnVmZmVyIGFzIGFuIGF0dGFjaG1lbnQgdG8gYWxsIHJlY2lwaWVudHMsIHdpdGggb3IKKyAgKiB3aXRob3V0IHVzZXIgaW50ZXJhY3Rpb24uCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCisgICogICAgICAgICAgIG1haWxEYXRhICAgIC0gICBQb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciB0byBiZSBzZW50LkNhbiBiZSBOVUxMLgorICAqICAgICAgICAgICBsZW5ndGggICAgICAtICAgVGhlIHNpemUsaW4gYnl0ZXMsIG9mIHRoZSBidWZmZXIgcG9pbnRlZCBieQorICAqIG1haWxEYXRhIHBhcmFtZXRlci5DYW4gYmUgMC4KKyAgKiAgICAgICAgICAgYlVJICAgICAgICAgLSAgIElmIHRydWUsIHRoZSByZXN0IG9mIHRoZSBwYXJhbWV0ZXJzIGFyZSB1c2VkIGluIGEKKyAgKiBjb21wb3NlLW5ldy1tZXNzYWdlIHdpbmRvdyB0aGF0IGlzIGRpc3BsYXllZCB0byB0aGUgdXNlci4gSWYgZmFsc2UsIHRoZSBjVG8KKyAgKiBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQgYW5kIGFsbCBvdGhlcnMgYXJlIG9wdGlvbmFsLgorICAqICAgICAgICAgICBUbyAgICAgICAgICAtICAgQSBzZW1pY29sb24tZGVsaW1pdGVkIGxpc3Qgb2YgcmVjaXBpZW50cyBmb3IgdGhlCisgICogbWVzc2FnZS4KKyAgKiAgICAgICAgICAgU3ViamVjdCAgICAgLSAgIFRoZSBzdWJqZWN0IG9mIHRoZSBtZXNzYWdlLiBUaGUgbGVuZ3RoIGxpbWl0IGlzIDY0CisgICogS0IuCisgICogICAgICAgICAgIENDICAgICAgICAgIC0gICBBIHNlbWljb2xvbi1kZWxpbWl0ZWQgbGlzdCBvZiBDQyByZWNpcGllbnRzIGZvcgorICAqIHRoZSBtZXNzYWdlLgorICAqICAgICAgICAgICBCQ0MgICAgICAgICAtICAgQSBzZW1pY29sb24tZGVsaW1pdGVkIGxpc3Qgb2YgQkNDIHJlY2lwaWVudHMgZm9yCisgICogdGhlIG1lc3NhZ2UuCisgICogICAgICAgICAgIE1zZyAgICAgICAgIC0gICBUaGUgY29udGVudCBvZiB0aGUgbWVzc2FnZS4gVGhlIGxlbmd0aCBsaW1pdCBpcyA2NAorICAqIEtCLgorICAqIFJldHVybiBWYWx1ZToKKyAgKiAgICAgICAgICAgTm9uZS4KKyAgKiBDb21tZW50czoKKyAgKiAgICAgICAgICAgSWYgdGhlIHBhcmFtZXRlciBtYWlsRGF0YSBpcyBOVUxMIG9yIGxlbmd0aCBpcyAwLCB0aGUgY3VycmVudAorICAqIGRvY3VtZW50IHdpbGwgYmUgbWFpbGVkIGFzIGFuIGF0dGFjaG1lbnQgdG8gYWxsIHJlY2lwaWVudHMuCisgICovCisgIHZvaWQgKCpEb2NfbWFpbCkoc3RydWN0IF9JUERGX0pzUGxhdGZvcm0qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgIHZvaWQqIG1haWxEYXRhLAorICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIGJVSSwKKyAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgVG8sCisgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIFN1YmplY3QsCisgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIENDLAorICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBCQ0MsCisgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIE1zZyk7CiAKKyAgLyoKKyAgKiBNZXRob2Q6IERvY19wcmludAorICAqICAgICAgICAgICBQcmludHMgYWxsIG9yIGEgc3BlY2lmaWMgbnVtYmVyIG9mIHBhZ2VzIG9mIHRoZSBkb2N1bWVudC4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICAgICAgICAgIGJVSSAgICAgICAgIC0gICBJZiB0cnVlLCB3aWxsIGNhdXNlIGEgVUkgdG8gYmUgcHJlc2VudGVkIHRvIHRoZQorICAqIHVzZXIgdG8gb2J0YWluIHByaW50aW5nIGluZm9ybWF0aW9uIGFuZCBjb25maXJtIHRoZSBhY3Rpb24uCisgICogICAgICAgICAgIG5TdGFydCAgICAgIC0gICBBIDAtYmFzZWQgaW5kZXggdGhhdCBkZWZpbmVzIHRoZSBzdGFydCBvZiBhbgorICAqIGluY2x1c2l2ZSByYW5nZSBvZiBwYWdlcy4KKyAgKiAgICAgICAgICAgbkVuZCAgICAgICAgLSAgIEEgMC1iYXNlZCBpbmRleCB0aGF0IGRlZmluZXMgdGhlIGVuZCBvZiBhbgorICAqIGluY2x1c2l2ZSBwYWdlIHJhbmdlLgorICAqICAgICAgICAgICBiU2lsZW50ICAgICAtICAgSWYgdHJ1ZSwgc3VwcHJlc3NlcyB0aGUgY2FuY2VsIGRpYWxvZyBib3ggd2hpbGUKKyAgKiB0aGUgZG9jdW1lbnQgaXMgcHJpbnRpbmcuIFRoZSBkZWZhdWx0IGlzIGZhbHNlLgorICAqICAgICAgICAgICBiU2hyaW5rVG9GaXQgICAgLSAgIElmIHRydWUsIHRoZSBwYWdlIGlzIHNocnVuayAoaWYgbmVjZXNzYXJ5KSB0bworICAqIGZpdCB3aXRoaW4gdGhlIGltYWdlYWJsZSBhcmVhIG9mIHRoZSBwcmludGVkIHBhZ2UuCisgICogICAgICAgICAgIGJQcmludEFzSW1hZ2UgICAtICAgSWYgdHJ1ZSwgcHJpbnQgcGFnZXMgYXMgYW4gaW1hZ2UuCisgICogICAgICAgICAgIGJSZXZlcnNlICAgIC0gICBJZiB0cnVlLCBwcmludCBmcm9tIG5FbmQgdG8gblN0YXJ0LgorICAqICAgICAgICAgICBiQW5ub3RhdGlvbnMgICAgLSAgIElmIHRydWUgKHRoZSBkZWZhdWx0KSwgYW5ub3RhdGlvbnMgYXJlCisgICogcHJpbnRlZC4KKyAgKi8KKyAgdm9pZCAoKkRvY19wcmludCkoc3RydWN0IF9JUERGX0pzUGxhdGZvcm0qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wgYlVJLAorICAgICAgICAgICAgICAgICAgICBpbnQgblN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBpbnQgbkVuZCwKKyAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIGJTaWxlbnQsCisgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiU2hyaW5rVG9GaXQsCisgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiUHJpbnRBc0ltYWdlLAorICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wgYlJldmVyc2UsCisgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiQW5ub3RhdGlvbnMpOwogCi0gICAgLyoKLSAgICAqIE1ldGhvZDogRG9jX3ByaW50Ci0gICAgKiAgICAgICAgICAgUHJpbnRzIGFsbCBvciBhIHNwZWNpZmljIG51bWJlciBvZiBwYWdlcyBvZiB0aGUgZG9jdW1lbnQuCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICB5ZXMKLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICogICAgICAgICAgIGJVSSAgICAgICAgIC0gICBJZiB0cnVlLCB3aWxsIGNhdXNlIGEgVUkgdG8gYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyIHRvIG9idGFpbiBwcmludGluZyBpbmZvcm1hdGlvbiBhbmQgY29uZmlybSB0aGUgYWN0aW9uLgotICAgICogICAgICAgICAgIG5TdGFydCAgICAgIC0gICBBIDAtYmFzZWQgaW5kZXggdGhhdCBkZWZpbmVzIHRoZSBzdGFydCBvZiBhbiBpbmNsdXNpdmUgcmFuZ2Ugb2YgcGFnZXMuCi0gICAgKiAgICAgICAgICAgbkVuZCAgICAgICAgLSAgIEEgMC1iYXNlZCBpbmRleCB0aGF0IGRlZmluZXMgdGhlIGVuZCBvZiBhbiBpbmNsdXNpdmUgcGFnZSByYW5nZS4KLSAgICAqICAgICAgICAgICBiU2lsZW50ICAgICAtICAgSWYgdHJ1ZSwgc3VwcHJlc3NlcyB0aGUgY2FuY2VsIGRpYWxvZyBib3ggd2hpbGUgdGhlIGRvY3VtZW50IGlzIHByaW50aW5nLiBUaGUgZGVmYXVsdCBpcyBmYWxzZS4KLSAgICAqICAgICAgICAgICBiU2hyaW5rVG9GaXQgICAgLSAgIElmIHRydWUsIHRoZSBwYWdlIGlzIHNocnVuayAoaWYgbmVjZXNzYXJ5KSB0byBmaXQgd2l0aGluIHRoZSBpbWFnZWFibGUgYXJlYSBvZiB0aGUgcHJpbnRlZCBwYWdlLgotICAgICogICAgICAgICAgIGJQcmludEFzSW1hZ2UgICAtICAgSWYgdHJ1ZSwgcHJpbnQgcGFnZXMgYXMgYW4gaW1hZ2UuCi0gICAgKiAgICAgICAgICAgYlJldmVyc2UgICAgLSAgIElmIHRydWUsIHByaW50IGZyb20gbkVuZCB0byBuU3RhcnQuCi0gICAgKiAgICAgICAgICAgYkFubm90YXRpb25zICAgIC0gICBJZiB0cnVlICh0aGUgZGVmYXVsdCksIGFubm90YXRpb25zIGFyZSBwcmludGVkLgotICAgICovCi0gICAgdm9pZCAoKkRvY19wcmludCkoc3RydWN0IF9JUERGX0pzUGxhdGZvcm0qIHBUaGlzLCBGUERGX0JPT0wgYlVJLCBpbnQgblN0YXJ0LCBpbnQgbkVuZCwgRlBERl9CT09MIGJTaWxlbnQgLEZQREZfQk9PTCBiU2hyaW5rVG9GaXQsRlBERl9CT09MIGJQcmludEFzSW1hZ2UgLEZQREZfQk9PTCBiUmV2ZXJzZSAsRlBERl9CT09MIGJBbm5vdGF0aW9ucyk7CisgIC8qCisgICogTWV0aG9kOiBEb2Nfc3VibWl0Rm9ybQorICAqICAgICAgICAgICBTZW5kIHRoZSBmb3JtIGRhdGEgdG8gYSBzcGVjaWZpZWQgVVJMLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZgorICAqICAgICAgICAgICBmb3JtRGF0YSAgICAtICAgUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgdG8gYmUgc2VudC4KKyAgKiAgICAgICAgICAgbGVuZ3RoICAgICAgLSAgIFRoZSBzaXplLGluIGJ5dGVzLCBvZiB0aGUgYnVmZmVyIHBvaW50ZWQgYnkKKyAgKiBmb3JtRGF0YSBwYXJhbWV0ZXIuCisgICogICAgICAgICAgIFVSTCAgICAgICAgIC0gICBUaGUgVVJMIHRvIHNlbmQgdG8uCisgICogUmV0dXJuIFZhbHVlOgorICAqICAgICAgICAgICBOb25lLgorICAqCisgICovCisgIHZvaWQgKCpEb2Nfc3VibWl0Rm9ybSkoc3RydWN0IF9JUERGX0pzUGxhdGZvcm0qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGZvcm1EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIFVSTCk7CiAKLSAgICAvKgotICAgICogTWV0aG9kOiBEb2Nfc3VibWl0Rm9ybQotICAgICogICAgICAgICAgIFNlbmQgdGhlIGZvcm0gZGF0YSB0byBhIHNwZWNpZmllZCBVUkwuCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICB5ZXMKLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCi0gICAgKiAgICAgICAgICAgZm9ybURhdGEgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyIHRvIGJlIHNlbnQuCi0gICAgKiAgICAgICAgICAgbGVuZ3RoICAgICAgLSAgIFRoZSBzaXplLGluIGJ5dGVzLCBvZiB0aGUgYnVmZmVyIHBvaW50ZWQgYnkgZm9ybURhdGEgcGFyYW1ldGVyLgotICAgICogICAgICAgICAgIFVSTCAgICAgICAgIC0gICBUaGUgVVJMIHRvIHNlbmQgdG8uCi0gICAgKiBSZXR1cm4gVmFsdWU6Ci0gICAgKiAgICAgICAgICAgTm9uZS4KLSAgICAqCi0gICAgKi8KLSAgICB2b2lkICgqRG9jX3N1Ym1pdEZvcm0pKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcyx2b2lkKiBmb3JtRGF0YSwgaW50IGxlbmd0aCwgRlBERl9XSURFU1RSSU5HIFVSTCk7CisgIC8qCisgICogTWV0aG9kOiBEb2NfZ290b1BhZ2UKKyAgKiAgICAgICAgICAgSnVtcCB0byBhIHNwZWNpZmllZCBwYWdlLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZgorICAqICAgICAgICAgICBuUGFnZU51bSAgICAtICAgVGhlIHNwZWNpZmllZCBwYWdlIG51bWJlciwgemVybyBmb3IgdGhlIGZpcnN0CisgICogcGFnZS4KKyAgKiBSZXR1cm4gVmFsdWU6CisgICogICAgICAgICAgIE5vbmUuCisgICoKKyAgKi8KKyAgdm9pZCAoKkRvY19nb3RvUGFnZSkoc3RydWN0IF9JUERGX0pzUGxhdGZvcm0qIHBUaGlzLCBpbnQgblBhZ2VOdW0pOworICAvKgorICAqIE1ldGhvZDogRmllbGRfYnJvd3NlCisgICogICAgICAgICAgIFNob3cgYSBmaWxlIHNlbGVjdGlvbiBkaWFsb2csIGFuZCByZXR1cm4gdGhlIHNlbGVjdGVkIGZpbGUgcGF0aC4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICAgICAgICAgIGZpbGVQYXRoICAgIC0gICBQb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciB0byByZWNlaXZlIHRoZSBmaWxlCisgICogcGF0aC5DYW4gYmUgTlVMTC4KKyAgKiAgICAgICAgICAgbGVuZ3RoICAgICAgLSAgIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciwgbnVtYmVyIG9mIGJ5dGVzLiBDYW4gYmUKKyAgKiAwLgorICAqIFJldHVybiBWYWx1ZToKKyAgKiAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdGhlIGZpbGVQYXRoIGNvbnN1bWVzLCBpbmNsdWRpbmcgdHJhaWxpbmcgemVyb3MuCisgICogQ29tbWVudHM6CisgICogICAgICAgVGhlIGZpbGVQYXRoIHNob3VsZSBiZSBhbHdheXMgaW5wdXQgaW4gbG9jYWwgZW5jb2RpbmcuCisgICovCisgIGludCAoKkZpZWxkX2Jyb3dzZSkoc3RydWN0IF9JUERGX0pzUGxhdGZvcm0qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpOwogCi0gICAgLyoKLSAgICAqIE1ldGhvZDogRG9jX2dvdG9QYWdlCi0gICAgKiAgICAgICAgICAgSnVtcCB0byBhIHNwZWNpZmllZCBwYWdlLgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZgotICAgICogICAgICAgICAgIG5QYWdlTnVtICAgIC0gICBUaGUgc3BlY2lmaWVkIHBhZ2UgbnVtYmVyLCB6ZXJvIGZvciB0aGUgZmlyc3QgcGFnZS4KLSAgICAqIFJldHVybiBWYWx1ZToKLSAgICAqICAgICAgICAgICBOb25lLgotICAgICoKLSAgICAqLwotICAgIHZvaWQgKCpEb2NfZ290b1BhZ2UpKHN0cnVjdCBfSVBERl9Kc1BsYXRmb3JtKiBwVGhpcywgaW50IG5QYWdlTnVtKTsKLSAgICAvKgotICAgICogTWV0aG9kOiBGaWVsZF9icm93c2UKLSAgICAqICAgICAgICAgICBTaG93IGEgZmlsZSBzZWxlY3Rpb24gZGlhbG9nLCBhbmQgcmV0dXJuIHRoZSBzZWxlY3RlZCBmaWxlIHBhdGguCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICB5ZXMKLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICogICAgICAgICAgIGZpbGVQYXRoICAgIC0gICBQb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciB0byByZWNlaXZlIHRoZSBmaWxlIHBhdGguQ2FuIGJlIE5VTEwuCi0gICAgKiAgICAgICAgICAgbGVuZ3RoICAgICAgLSAgIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciwgbnVtYmVyIG9mIGJ5dGVzLiBDYW4gYmUgMC4KLSAgICAqIFJldHVybiBWYWx1ZToKLSAgICAqICAgICAgIE51bWJlciBvZiBieXRlcyB0aGUgZmlsZVBhdGggY29uc3VtZXMsIGluY2x1ZGluZyB0cmFpbGluZyB6ZXJvcy4KLSAgICAqIENvbW1lbnRzOgotICAgICogICAgICAgVGhlIGZpbGVQYXRoIHNob3VsZSBiZSBhbHdheXMgaW5wdXQgaW4gbG9jYWwgZW5jb2RpbmcuCi0gICAgKi8KLSAgICBpbnQgICgqRmllbGRfYnJvd3NlKShzdHJ1Y3QgX0lQREZfSnNQbGF0Zm9ybSogcFRoaXMsdm9pZCogZmlsZVBhdGgsIGludCBsZW5ndGgpOworICAvKioKKyAgKiAgIHBvaW50ZXIgdG8gRlBERl9GT1JNRklMTElORk8gaW50ZXJmYWNlLgorICAqKi8KKyAgdm9pZCogbV9wRm9ybWZpbGxpbmZvOwogCi0gICAgLyoqCi0gICAgKiAgIHBvaW50ZXIgdG8gRlBERl9GT1JNRklMTElORk8gaW50ZXJmYWNlLgotICAgICoqLwotICAgIHZvaWQqICAgbV9wRm9ybWZpbGxpbmZvOworICAvKiBWZXJzaW9uIDIuICovCisKKyAgdm9pZCogbV9pc29sYXRlOyAgICAgICAgICAgICAgIC8qIFVudXNlZCBpbiB2MywgcmV0YWluIGZvciBjb21wYXRpYmlsaXR5LiAqLworICB1bnNpZ25lZCBpbnQgbV92OEVtYmVkZGVyU2xvdDsgLyogVW51c2VkIGluIHYzLCByZXRhaW4gZm9yIGNvbXBhdGliaWxpdHkuICovCisKKyAgLyogVmVyc2lvbiAzLiAqLworICAvKiBWZXJzaW9uIDMgbW92ZXMgbV9Jc29sYXRlIGFuZCBtX3Y4RW1iZWRkZXJTbG90IHRvIEZQREZfTElCUkFSWV9DT05GSUcuICovCisKIH0gSVBERl9KU1BMQVRGT1JNOwogCiAvLyBGbGFncyBmb3IgQ3Vyc29yIHR5cGUKLSNkZWZpbmUgRlhDVF9BUlJPVyAgMAotI2RlZmluZSBGWENUX05FU1cgICAxCi0jZGVmaW5lIEZYQ1RfTldTRSAgIDIKLSNkZWZpbmUgRlhDVF9WQkVBTSAgMwotI2RlZmluZSBGWENUX0hCRUFNICA0Ci0jZGVmaW5lIEZYQ1RfSEFORCAgIDUKKyNkZWZpbmUgRlhDVF9BUlJPVyAwCisjZGVmaW5lIEZYQ1RfTkVTVyAxCisjZGVmaW5lIEZYQ1RfTldTRSAyCisjZGVmaW5lIEZYQ1RfVkJFQU0gMworI2RlZmluZSBGWENUX0hCRUFNIDQKKyNkZWZpbmUgRlhDVF9IQU5EIDUKIAogLyoqCi0gKiBEZWNsYXJlcyBvZiBhIHBvaW50ZXIgdHlwZSB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoZSBGRklfU2V0VGltZXIgbWV0aG9kLgorICogRGVjbGFyZXMgb2YgYSBwb2ludGVyIHR5cGUgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgRkZJX1NldFRpbWVyCisgKm1ldGhvZC4KICAqIFBhcmFtZXRlcnM6CiAgKiAgICAgICAgICBpZEV2ZW50ICAgICAtICAgSWRlbnRpZmllciBvZiB0aGUgdGltZXIuCiAgKiBSZXR1cm4gdmFsdWU6CiAgKiAgICAgICAgICBOb25lLgogICoqLwotdHlwZWRlZiB2b2lkICAgICgqVGltZXJDYWxsYmFjaykoaW50IGlkRXZlbnQpOwordHlwZWRlZiB2b2lkICgqVGltZXJDYWxsYmFjaykoaW50IGlkRXZlbnQpOwogCiAvKioKICAqIERlY2xhcmVzIG9mIGEgc3RydWN0IHR5cGUgdG8gdGhlIGxvY2FsIHN5c3RlbSB0aW1lLgogKiovCi10eXBlZGVmIHN0cnVjdCBfRlBERl9TWVNURU1USU1FCi17Ci0gICAgdW5zaWduZWQgc2hvcnQgd1llYXI7ICAgICAgICAgICAvKiB5ZWFycyBzaW5jZSAxOTAwICovCi0gICAgdW5zaWduZWQgc2hvcnQgd01vbnRoOyAgICAgICAgICAvKiBtb250aHMgc2luY2UgSmFudWFyeSAtIFswLDExXSAqLwotICAgIHVuc2lnbmVkIHNob3J0IHdEYXlPZldlZWs7ICAgICAgLyogZGF5cyBzaW5jZSBTdW5kYXkgLSBbMCw2XSAqLwotICAgIHVuc2lnbmVkIHNob3J0IHdEYXk7ICAgICAgICAgICAgLyogZGF5IG9mIHRoZSBtb250aCAtIFsxLDMxXSAqLwotICAgIHVuc2lnbmVkIHNob3J0IHdIb3VyOyAgICAgICAgICAgLyogaG91cnMgc2luY2UgbWlkbmlnaHQgLSBbMCwyM10gKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB3TWludXRlOyAgICAgICAgIC8qIG1pbnV0ZXMgYWZ0ZXIgdGhlIGhvdXIgLSBbMCw1OV0gKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB3U2Vjb25kOyAgICAgICAgIC8qIHNlY29uZHMgYWZ0ZXIgdGhlIG1pbnV0ZSAtIFswLDU5XSAqLwotICAgIHVuc2lnbmVkIHNob3J0IHdNaWxsaXNlY29uZHM7ICAgLyogbWlsbGlzZWNvbmRzIGFmdGVyIHRoZSBzZWNvbmQgLSBbMCw5OTldICovCi19RlBERl9TWVNURU1USU1FOwordHlwZWRlZiBzdHJ1Y3QgX0ZQREZfU1lTVEVNVElNRSB7CisgIHVuc2lnbmVkIHNob3J0IHdZZWFyOyAgICAgICAgIC8qIHllYXJzIHNpbmNlIDE5MDAgKi8KKyAgdW5zaWduZWQgc2hvcnQgd01vbnRoOyAgICAgICAgLyogbW9udGhzIHNpbmNlIEphbnVhcnkgLSBbMCwxMV0gKi8KKyAgdW5zaWduZWQgc2hvcnQgd0RheU9mV2VlazsgICAgLyogZGF5cyBzaW5jZSBTdW5kYXkgLSBbMCw2XSAqLworICB1bnNpZ25lZCBzaG9ydCB3RGF5OyAgICAgICAgICAvKiBkYXkgb2YgdGhlIG1vbnRoIC0gWzEsMzFdICovCisgIHVuc2lnbmVkIHNob3J0IHdIb3VyOyAgICAgICAgIC8qIGhvdXJzIHNpbmNlIG1pZG5pZ2h0IC0gWzAsMjNdICovCisgIHVuc2lnbmVkIHNob3J0IHdNaW51dGU7ICAgICAgIC8qIG1pbnV0ZXMgYWZ0ZXIgdGhlIGhvdXIgLSBbMCw1OV0gKi8KKyAgdW5zaWduZWQgc2hvcnQgd1NlY29uZDsgICAgICAgLyogc2Vjb25kcyBhZnRlciB0aGUgbWludXRlIC0gWzAsNTldICovCisgIHVuc2lnbmVkIHNob3J0IHdNaWxsaXNlY29uZHM7IC8qIG1pbGxpc2Vjb25kcyBhZnRlciB0aGUgc2Vjb25kIC0gWzAsOTk5XSAqLworfSBGUERGX1NZU1RFTVRJTUU7CiAKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorLy8gWEZBCisvKioKKyAqIEBuYW1lIFBhZ2V2aWV3ICBldmVudCBmbGFncworICovCisvKkB7Ki8KKy8qKiBAYnJpZWYgQWZ0ZXIgYSBuZXcgcGFnZXZpZXcgaXMgYWRkZWQuICovCisjZGVmaW5lIEZYRkFfUEFHRVZJRVdFVkVOVF9QT1NUQURERUQgMQorLyoqIEBicmllZiBBZnRlciBhIHBhZ2V2aWV3IGlzIHJlbW92ZWQuICovCisjZGVmaW5lIEZYRkFfUEFHRVZJRVdFVkVOVF9QT1NUUkVNT1ZFRCAzCisvKkB9Ki8KIAotdHlwZWRlZiBzdHJ1Y3QgIF9GUERGX0ZPUk1GSUxMSU5GTwotewotICAgIC8qKgotICAgICAqIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UuIEN1cnJlbnRseSBtdXN0IGJlIDEuCi0gICAgICoqLwotICAgIGludCB2ZXJzaW9uOworLy8gbWVudQorLyoqCisgKiBAbmFtZSBNYWNybyBEZWZpbml0aW9ucyBmb3IgUmlnaHQgQ29udGV4dCBNZW51IEZlYXR1cmVzIE9mIFhGQSBGaWVsZHMKKyAqLworLypAeyovCisjZGVmaW5lIEZYRkFfTUVNVV9DT1BZIDEKKyNkZWZpbmUgRlhGQV9NRU1VX0NVVCAyCisjZGVmaW5lIEZYRkFfTUVNVV9TRUxFQ1RBTEwgNAorI2RlZmluZSBGWEZBX01FTVVfVU5ETyA4CisjZGVmaW5lIEZYRkFfTUVNVV9SRURPIDE2CisjZGVmaW5lIEZYRkFfTUVNVV9QQVNURSAzMgorLypAfSovCiAKLSAgICAgICAgLyoqCi0gICAgICogTWV0aG9kOiBSZWxlYXNlCi0gICAgICogICAgICAgICAgR2l2ZSBpbXBsZW1lbnRhdGlvbiBhIGNoYW5jZSB0byByZWxlYXNlIGFueSBkYXRhIGFmdGVyIHRoZSBpbnRlcmZhY2UgaXMgbm8gbG9uZ2VyIHVzZWQKLSAgICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAgKiAgICAgICAgICAxCi0gICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgICogICAgICAgICAgTm8KLSAgICAgKiBDb21tZW50czoKLSAgICAgKiAgICAgICAgICBDYWxsZWQgYnkgRm94aXQgU0RLIGR1cmluZyB0aGUgZmluYWwgY2xlYW51cCBwcm9jZXNzLgotICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCi0gICAgICogUmV0dXJuIFZhbHVlOgotICAgICAqICAgICAgICAgIE5vbmUKLSAgICAgKi8KKy8vIGZpbGUgdHlwZQorLyoqCisgKiBAbmFtZSBNYWNybyBEZWZpbml0aW9ucyBmb3IgRmlsZSBUeXBlLgorICovCisvKkB7Ki8KKyNkZWZpbmUgRlhGQV9TQVZFQVNfWE1MIDEKKyNkZWZpbmUgRlhGQV9TQVZFQVNfWERQIDIKKy8qQH0qLworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCi0gICAgdm9pZCAoKlJlbGVhc2UpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzKTsKK3R5cGVkZWYgc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyB7CisgIC8qKgorICAgKiBWZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlLiBDdXJyZW50bHkgbXVzdCBiZSAxICh3aGVuIFBERml1bSBpcyBidWlsdAorICAgKiAgd2l0aG91dCB0aGUgWEZBIG1vZHVsZSkgb3IgbXVzdCBiZSAyICh3aGVuIGJ1aWx0IHdpdGggdGhlIFhGQSBtb2R1bGUpLgorICAgKiovCisgIGludCB2ZXJzaW9uOwogCi0gICAgLyoqCi0gICAgICogTWV0aG9kOiBGRklfSW52YWxpZGF0ZQotICAgICAqICAgICAgICAgIEludmFsaWRhdGUgdGhlIGNsaWVudCBhcmVhIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZS4KLSAgICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAgKiAgICAgICAgICAxCi0gICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgICAgICogICAgICAgICAgIHllcwotICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCi0gICAgICogICAgICAgICAgbGVmdCAgICAgICAgLSAgIExlZnQgcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlIGNvb3JkaW5hdGUuCi0gICAgICogICAgICAgICAgdG9wICAgICAgICAgLSAgIFRvcCAgcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlIGNvb3JkaW5hdGUuCi0gICAgICogICAgICAgICAgcmlnaHQgICAgICAgLSAgIFJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZSAgY29vcmRpbmF0ZS4KLSAgICAgKiAgICAgICAgICBib3R0b20gICAgICAtICAgQm90dG9tIHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZSBjb29yZGluYXRlLgotICAgICAqIFJldHVybiBWYWx1ZToKLSAgICAgKiAgICAgICAgICBOb25lLgotICAgICAqCi0gICAgICpjb21tZW50czoKLSAgICAgKiAgICAgICAgICBBbGwgcG9zaXRpb25zIGFyZSBtZWFzdXJlZCBpbiBQREYgInVzZXIgc3BhY2UiLgotICAgICAqICAgICAgICAgIEltcGxlbWVudGF0aW9uIHNob3VsZCBjYWxsIEZQREZfUmVuZGVyUGFnZUJpdG1hcCgpIGZ1bmN0aW9uIGZvciByZXBhaW50aW5nIGEgc3BlY2lmaWVkIHBhZ2UgYXJlYS4KLSAgICAqLwotICAgIHZvaWQgKCpGRklfSW52YWxpZGF0ZSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsRlBERl9QQUdFIHBhZ2UsIGRvdWJsZSBsZWZ0LCBkb3VibGUgdG9wLCBkb3VibGUgcmlnaHQsIGRvdWJsZSBib3R0b20pOworICAvKiBWZXJzaW9uIDEuICovCisgIC8qKgorICAgKk1ldGhvZDogUmVsZWFzZQorICAgKiAgICAgICAgIEdpdmUgaW1wbGVtZW50YXRpb24gYSBjaGFuY2UgdG8gcmVsZWFzZSBhbnkgZGF0YSBhZnRlciB0aGUKKyAgICogICAgICAgICBpbnRlcmZhY2UgaXMgbm8gbG9uZ2VyIHVzZWQKKyAgICpJbnRlcmZhY2UgVmVyc2lvbjoKKyAgICogICAgICAgICAxCisgICAqSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICAqICAgICAgICAgTm8KKyAgICpDb21tZW50czoKKyAgICogICAgICAgICBDYWxsZWQgYnkgRm94aXQgU0RLIGR1cmluZyB0aGUgZmluYWwgY2xlYW51cCBwcm9jZXNzLgorICAgKlBhcmFtZXRlcnM6CisgICAqICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCisgICAqUmV0dXJuIFZhbHVlOgorICAgKiAgICAgICAgIE5vbmUKKyAgICovCisgIHZvaWQgKCpSZWxlYXNlKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcyk7CiAKLSAgICAvKioKLSAgICAgKiBNZXRob2Q6IEZGSV9PdXRwdXRTZWxlY3RlZFJlY3QKLSAgICAgKiAgICAgICAgICBXaGVuIHVzZXIgaXMgdGFraW5nIHRoZSBtb3VzZSB0byBzZWxlY3QgdGV4dHMgb24gYSBmb3JtIGZpZWxkLCB0aGlzIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwga2VlcAotICAgICAqICAgICAgICAgIHJldHVybmluZyB0aGUgc2VsZWN0ZWQgYXJlYXMgdG8gdGhlIGltcGxlbWVudGF0aW9uLgotICAgICAqCi0gICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgICogICAgICAgICAgMQotICAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICAqICAgICAgICAgIE5vCi0gICAgICogUGFyYW1ldGVyczoKLSAgICAgKiAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgICogICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZSBmdW5jdGlvbi4KLSAgICAgKiAgICAgICAgICBsZWZ0ICAgICAgICAtICAgTGVmdCBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UgY29vcmRpbmF0ZS4KLSAgICAgKiAgICAgICAgICB0b3AgICAgICAgICAtICAgVG9wICBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UgY29vcmRpbmF0ZS4KLSAgICAgKiAgICAgICAgICByaWdodCAgICAgICAtICAgUmlnaHQgcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlICBjb29yZGluYXRlLgotICAgICAqICAgICAgICAgIGJvdHRvbSAgICAgIC0gICBCb3R0b20gcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlIGNvb3JkaW5hdGUuCi0gICAgICogUmV0dXJuIFZhbHVlOgotICAgICAqICAgICAgICAgIE5vbmUuCi0gICAgICoKLSAgICAgKiBjb21tZW50czoKLSAgICAgKiAgICAgICAgICBUaGlzIENBTExCQUNLIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIHNwZWNpYWwgdGV4dCBzZWxlY3Rpb24gZWZmZWN0LiBJbXBsZW1lbnRhdGlvbiBzaG91bGQKLSAgICAgKiAgICAgICAgICBmaXJzdCByZWNvcmRzIHRoZSByZXR1cm5lZCByZWN0YW5nbGVzLCB0aGVuIGRyYXcgdGhlbSBvbmUgYnkgb25lIGF0IHRoZSBwYWludGluZyBwZXJpb2QsIGxhc3QscmVtb3ZlIGFsbAotICAgICAqICAgICAgICAgIHRoZSByZWNvcmRlZCByZWN0YW5nbGVzIHdoZW4gZmluaXNoIHBhaW50aW5nLgotICAgICovCi0gICAgdm9pZCAoKkZGSV9PdXRwdXRTZWxlY3RlZFJlY3QpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLEZQREZfUEFHRSBwYWdlLCBkb3VibGUgbGVmdCwgZG91YmxlIHRvcCwgZG91YmxlIHJpZ2h0LCBkb3VibGUgYm90dG9tKTsKKyAgLyoqCisgICAqIE1ldGhvZDogRkZJX0ludmFsaWRhdGUKKyAgICogICAgICAgICAgSW52YWxpZGF0ZSB0aGUgY2xpZW50IGFyZWEgd2l0aGluIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlLgorICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgICogICAgICAgICAgMQorICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgICAgICogICAgICAgICAgIHllcworICAgKiBQYXJhbWV0ZXJzOgorICAgKiAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UKKyAgICpmdW5jdGlvbi4KKyAgICogICAgICAgICAgbGVmdCAgICAgICAgLSAgIExlZnQgcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlCisgICAqY29vcmRpbmF0ZS4KKyAgICogICAgICAgICAgdG9wICAgICAgICAgLSAgIFRvcCAgcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlCisgICAqY29vcmRpbmF0ZS4KKyAgICogICAgICAgICAgcmlnaHQgICAgICAgLSAgIFJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZQorICAgKmNvb3JkaW5hdGUuCisgICAqICAgICAgICAgIGJvdHRvbSAgICAgIC0gICBCb3R0b20gcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlCisgICAqY29vcmRpbmF0ZS4KKyAgICogUmV0dXJuIFZhbHVlOgorICAgKiAgICAgICAgICBOb25lLgorICAgKgorICAgKmNvbW1lbnRzOgorICAgKiAgICAgICAgICBBbGwgcG9zaXRpb25zIGFyZSBtZWFzdXJlZCBpbiBQREYgInVzZXIgc3BhY2UiLgorICAgKiAgICAgICAgICBJbXBsZW1lbnRhdGlvbiBzaG91bGQgY2FsbCBGUERGX1JlbmRlclBhZ2VCaXRtYXAoKSBmdW5jdGlvbiBmb3IKKyAgICpyZXBhaW50aW5nIGEgc3BlY2lmaWVkIHBhZ2UgYXJlYS4KKyAgKi8KKyAgdm9pZCAoKkZGSV9JbnZhbGlkYXRlKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYm90dG9tKTsKIAotICAgIC8qKgotICAgICogTWV0aG9kOiBGRklfU2V0Q3Vyc29yCi0gICAgKiAgICAgICAgICAgU2V0IHRoZSBDdXJzb3Igc2hhcGUuCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICB5ZXMKLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgKiAgICAgICBuQ3Vyc29yVHlwZSAtICAgQ3Vyc29yIHR5cGUuIHNlZSBGbGFncyBmb3IgQ3Vyc29yIHR5cGUgZm9yIHRoZSBkZXRhaWxzLgotICAgICogICBSZXR1cm4gdmFsdWU6Ci0gICAgKiAgICAgICBOb25lLgotICAgICogKi8KLSAgICB2b2lkICgqRkZJX1NldEN1cnNvcikoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIGludCBuQ3Vyc29yVHlwZSk7CisgIC8qKgorICAgKiBNZXRob2Q6IEZGSV9PdXRwdXRTZWxlY3RlZFJlY3QKKyAgICogICAgICAgICAgV2hlbiB1c2VyIGlzIHRha2luZyB0aGUgbW91c2UgdG8gc2VsZWN0IHRleHRzIG9uIGEgZm9ybSBmaWVsZCwKKyAgICogdGhpcyBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGtlZXAKKyAgICogICAgICAgICAgcmV0dXJuaW5nIHRoZSBzZWxlY3RlZCBhcmVhcyB0byB0aGUgaW1wbGVtZW50YXRpb24uCisgICAqCisgICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAgKiAgICAgICAgICAxCisgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAgKiAgICAgICAgICBObworICAgKiBQYXJhbWV0ZXJzOgorICAgKiAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UKKyAgICogZnVuY3Rpb24uCisgICAqICAgICAgICAgIGxlZnQgICAgICAgIC0gICBMZWZ0IHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZQorICAgKiBjb29yZGluYXRlLgorICAgKiAgICAgICAgICB0b3AgICAgICAgICAtICAgVG9wICBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UKKyAgICogY29vcmRpbmF0ZS4KKyAgICogICAgICAgICAgcmlnaHQgICAgICAgLSAgIFJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZQorICAgKiBjb29yZGluYXRlLgorICAgKiAgICAgICAgICBib3R0b20gICAgICAtICAgQm90dG9tIHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZQorICAgKiBjb29yZGluYXRlLgorICAgKiBSZXR1cm4gVmFsdWU6CisgICAqICAgICAgICAgIE5vbmUuCisgICAqCisgICAqIGNvbW1lbnRzOgorICAgKiAgICAgICAgICBUaGlzIENBTExCQUNLIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIHNwZWNpYWwgdGV4dAorICAgKiBzZWxlY3Rpb24gZWZmZWN0LiBJbXBsZW1lbnRhdGlvbiBzaG91bGQKKyAgICogICAgICAgICAgZmlyc3QgcmVjb3JkcyB0aGUgcmV0dXJuZWQgcmVjdGFuZ2xlcywgdGhlbiBkcmF3IHRoZW0gb25lIGJ5IG9uZQorICAgKiBhdCB0aGUgcGFpbnRpbmcgcGVyaW9kLCBsYXN0LHJlbW92ZSBhbGwKKyAgICogICAgICAgICAgdGhlIHJlY29yZGVkIHJlY3RhbmdsZXMgd2hlbiBmaW5pc2ggcGFpbnRpbmcuCisgICovCisgIHZvaWQgKCpGRklfT3V0cHV0U2VsZWN0ZWRSZWN0KShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGJvdHRvbSk7CiAKLSAgICAvKioKLSAgICAqIE1ldGhvZDogRkZJX1NldFRpbWVyCi0gICAgKiAgICAgICAgICAgVGhpcyBtZXRob2QgaW5zdGFsbHMgYSBzeXN0ZW0gdGltZXIuIEEgdGltZS1vdXQgdmFsdWUgaXMgc3BlY2lmaWVkLAotICAgICogICAgICAgICAgIGFuZCBldmVyeSB0aW1lIGEgdGltZS1vdXQgb2NjdXJzLCB0aGUgc3lzdGVtIHBhc3NlcyBhIG1lc3NhZ2UgdG8KLSAgICAqICAgICAgICAgICB0aGUgVGltZXJQcm9jIGNhbGxiYWNrIGZ1bmN0aW9uLgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICogICAgICAgdUVsYXBzZSAgICAgLSAgIFNwZWNpZmllcyB0aGUgdGltZS1vdXQgdmFsdWUsIGluIG1pbGxpc2Vjb25kcy4KLSAgICAqICAgICAgIGxwVGltZXJGdW5jIC0gICBBIHBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLVRpbWVyQ2FsbGJhY2suCi0gICAgKiAgIFJldHVybiB2YWx1ZToKLSAgICAqICAgICAgIFRoZSB0aW1lciBpZGVudGlmaWVyIG9mIHRoZSBuZXcgdGltZXIgaWYgdGhlIGZ1bmN0aW9uIGlzIHN1Y2Nlc3NmdWwuCi0gICAgKiAgICAgICBBbiBhcHBsaWNhdGlvbiBwYXNzZXMgdGhpcyB2YWx1ZSB0byB0aGUgRkZJX0tpbGxUaW1lciBtZXRob2QgdG8ga2lsbAotICAgICogICAgICAgdGhlIHRpbWVyLiBOb256ZXJvIGlmIGl0IGlzIHN1Y2Nlc3NmdWw7IG90aGVyd2lzZSwgaXQgaXMgemVyby4KLSAgICAqICovCi0gICAgaW50ICAoKkZGSV9TZXRUaW1lcikoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIGludCB1RWxhcHNlLCBUaW1lckNhbGxiYWNrIGxwVGltZXJGdW5jKTsKKyAgLyoqCisgICogTWV0aG9kOiBGRklfU2V0Q3Vyc29yCisgICogICAgICAgICAgIFNldCB0aGUgQ3Vyc29yIHNoYXBlLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAqICAgICAgIG5DdXJzb3JUeXBlIC0gICBDdXJzb3IgdHlwZS4gc2VlIEZsYWdzIGZvciBDdXJzb3IgdHlwZSBmb3IgdGhlCisgICogZGV0YWlscy4KKyAgKiAgIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBOb25lLgorICAqICovCisgIHZvaWQgKCpGRklfU2V0Q3Vyc29yKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgaW50IG5DdXJzb3JUeXBlKTsKIAotICAgIC8qKgotICAgICogTWV0aG9kOiBGRklfS2lsbFRpbWVyCi0gICAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qga2lsbHMgdGhlIHRpbWVyIGV2ZW50IGlkZW50aWZpZWQgYnkgbklERXZlbnQsIHNldCBieSBhbiBlYXJsaWVyIGNhbGwgdG8gRkZJX1NldFRpbWVyLgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICogICAgICAgblRpbWVySUQgICAgLSAgIFRoZSB0aW1lciBJRCByZXR1cm4gYnkgRkZJX1NldFRpbWVyIGZ1bmN0aW9uLgotICAgICogICBSZXR1cm4gdmFsdWU6Ci0gICAgKiAgICAgICBOb25lLgotICAgICogKi8KLSAgICB2b2lkICgqRkZJX0tpbGxUaW1lcikoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIGludCBuVGltZXJJRCk7CisgIC8qKgorICAqIE1ldGhvZDogRkZJX1NldFRpbWVyCisgICogICAgICAgICAgIFRoaXMgbWV0aG9kIGluc3RhbGxzIGEgc3lzdGVtIHRpbWVyLiBBIHRpbWUtb3V0IHZhbHVlIGlzCisgICogc3BlY2lmaWVkLAorICAqICAgICAgICAgICBhbmQgZXZlcnkgdGltZSBhIHRpbWUtb3V0IG9jY3VycywgdGhlIHN5c3RlbSBwYXNzZXMgYSBtZXNzYWdlIHRvCisgICogICAgICAgICAgIHRoZSBUaW1lclByb2MgY2FsbGJhY2sgZnVuY3Rpb24uCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICAgICAgdUVsYXBzZSAgICAgLSAgIFNwZWNpZmllcyB0aGUgdGltZS1vdXQgdmFsdWUsIGluIG1pbGxpc2Vjb25kcy4KKyAgKiAgICAgICBscFRpbWVyRnVuYyAtICAgQSBwb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbi1UaW1lckNhbGxiYWNrLgorICAqICAgUmV0dXJuIHZhbHVlOgorICAqICAgICAgIFRoZSB0aW1lciBpZGVudGlmaWVyIG9mIHRoZSBuZXcgdGltZXIgaWYgdGhlIGZ1bmN0aW9uIGlzIHN1Y2Nlc3NmdWwuCisgICogICAgICAgQW4gYXBwbGljYXRpb24gcGFzc2VzIHRoaXMgdmFsdWUgdG8gdGhlIEZGSV9LaWxsVGltZXIgbWV0aG9kIHRvIGtpbGwKKyAgKiAgICAgICB0aGUgdGltZXIuIE5vbnplcm8gaWYgaXQgaXMgc3VjY2Vzc2Z1bDsgb3RoZXJ3aXNlLCBpdCBpcyB6ZXJvLgorICAqICovCisgIGludCAoKkZGSV9TZXRUaW1lcikoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHVFbGFwc2UsCisgICAgICAgICAgICAgICAgICAgICAgVGltZXJDYWxsYmFjayBscFRpbWVyRnVuYyk7CiAKKyAgLyoqCisgICogTWV0aG9kOiBGRklfS2lsbFRpbWVyCisgICogICAgICAgICAgIFRoaXMgbWV0aG9kIGtpbGxzIHRoZSB0aW1lciBldmVudCBpZGVudGlmaWVkIGJ5IG5JREV2ZW50LCBzZXQgYnkKKyAgKiBhbiBlYXJsaWVyIGNhbGwgdG8gRkZJX1NldFRpbWVyLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAqICAgICAgIG5UaW1lcklEICAgIC0gICBUaGUgdGltZXIgSUQgcmV0dXJuIGJ5IEZGSV9TZXRUaW1lciBmdW5jdGlvbi4KKyAgKiAgIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBOb25lLgorICAqICovCisgIHZvaWQgKCpGRklfS2lsbFRpbWVyKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgaW50IG5UaW1lcklEKTsKIAotICAgIC8qKgotICAgICogTWV0aG9kOiBGRklfR2V0TG9jYWxUaW1lCi0gICAgKiAgICAgICAgICAgVGhpcyBtZXRob2QgcmVjZWl2ZXMgdGhlIGN1cnJlbnQgbG9jYWwgdGltZSBvbiB0aGUgc3lzdGVtLgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgeWVzCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICogICBSZXR1cm4gdmFsdWU6Ci0gICAgKiAgICAgICBOb25lLgotICAgICogKi8KLSAgICBGUERGX1NZU1RFTVRJTUUgKCpGRklfR2V0TG9jYWxUaW1lKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcyk7CisgIC8qKgorICAqIE1ldGhvZDogRkZJX0dldExvY2FsVGltZQorICAqICAgICAgICAgICBUaGlzIG1ldGhvZCByZWNlaXZlcyB0aGUgY3VycmVudCBsb2NhbCB0aW1lIG9uIHRoZSBzeXN0ZW0uCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICBSZXR1cm4gdmFsdWU6CisgICogICAgICAgTm9uZS4KKyAgKiAqLworICBGUERGX1NZU1RFTVRJTUUgKCpGRklfR2V0TG9jYWxUaW1lKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcyk7CiAKLSAgICAvKioKLSAgICAqIE1ldGhvZDogRkZJX09uQ2hhbmdlCi0gICAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIHRvIG5vdGlmeSBpbXBsZW1lbnRhdGlvbiB3aGVuIHRoZSB2YWx1ZSBvZiBhbnkgRm9ybUZpZWxkIG9uIHRoZSBkb2N1bWVudCBoYWQgYmVlbiBjaGFuZ2VkLgotICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgKiAgICAgICAgICAgMQotICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgKiAgICAgICAgICAgbm8KLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgKiAgIFJldHVybiB2YWx1ZToKLSAgICAqICAgICAgIE5vbmUuCi0gICAgKiAqLwotICAgIHZvaWQgKCpGRklfT25DaGFuZ2UpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzKTsKKyAgLyoqCisgICogTWV0aG9kOiBGRklfT25DaGFuZ2UKKyAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIHRvIG5vdGlmeSBpbXBsZW1lbnRhdGlvbiB3aGVuIHRoZQorICAqIHZhbHVlIG9mIGFueSBGb3JtRmllbGQgb24gdGhlIGRvY3VtZW50IGhhZCBiZWVuIGNoYW5nZWQuCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgbm8KKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBOb25lLgorICAqICovCisgIHZvaWQgKCpGRklfT25DaGFuZ2UpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzKTsKIAotICAgIC8qKgotICAgICogTWV0aG9kOiBGRklfR2V0UGFnZQotICAgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHJlY2VpdmVzIHRoZSBwYWdlIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWVkIHBhZ2UgaW5kZXguCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICB5ZXMKLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgKiAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KLSAgICAqICAgICAgIG5QYWdlSW5kZXggIC0gICBJbmRleCBudW1iZXIgb2YgdGhlIHBhZ2UuIDAgZm9yIHRoZSBmaXJzdCBwYWdlLgotICAgICogUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgotICAgICogQ29tbWVudHM6Ci0gICAgKiAgICAgICBJbiBzb21lIGNhc2VzLCB0aGUgZG9jdW1lbnQtbGV2ZWwgSmF2YVNjcmlwdCBhY3Rpb24gbWF5IHJlZmVyIHRvIGEgcGFnZSB3aGljaCBoYWRuJ3QgYmVlbiBsb2FkZWQgeWV0LgotICAgICogICAgICAgVG8gc3VjY2Vzc2Z1bGx5IHJ1biB0aGUgamF2YXNjcmlwdCBhY3Rpb24sIGltcGxlbWVudGF0aW9uIG5lZWQgdG8gbG9hZCB0aGUgcGFnZSBmb3IgU0RLLgotICAgICogKi8KLSAgICBGUERGX1BBR0UgICAoKkZGSV9HZXRQYWdlKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgaW50IG5QYWdlSW5kZXgpOworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9HZXRQYWdlCisgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHJlY2VpdmVzIHRoZSBwYWdlIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWVkCisgICogcGFnZSBpbmRleC4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudAorICAqIGZ1bmN0aW9uLgorICAqICAgICAgIG5QYWdlSW5kZXggIC0gICBJbmRleCBudW1iZXIgb2YgdGhlIHBhZ2UuIDAgZm9yIHRoZSBmaXJzdCBwYWdlLgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCisgICogQ29tbWVudHM6CisgICogICAgICAgSW4gc29tZSBjYXNlcywgdGhlIGRvY3VtZW50LWxldmVsIEphdmFTY3JpcHQgYWN0aW9uIG1heSByZWZlciB0byBhCisgICogcGFnZSB3aGljaCBoYWRuJ3QgYmVlbiBsb2FkZWQgeWV0LgorICAqICAgICAgIFRvIHN1Y2Nlc3NmdWxseSBydW4gdGhlIGphdmFzY3JpcHQgYWN0aW9uLCBpbXBsZW1lbnRhdGlvbiBuZWVkIHRvIGxvYWQKKyAgKiB0aGUgcGFnZSBmb3IgU0RLLgorICAqICovCisgIEZQREZfUEFHRSAgICgqRkZJX0dldFBhZ2UpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBpbnQgblBhZ2VJbmRleCk7CiAKLSAgICAvKioKLSAgICAqIE1ldGhvZDogRkZJX0dldEN1cnJlbnRQYWdlCi0gICAgKiAgICAgICBUaGlzIG1ldGhvZCByZWNlaXZlcyB0aGUgY3VycmVudCBwYWdlIHBvaW50ZXIuCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICB5ZXMKLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgKiAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KLSAgICAqIFJldHVybiB2YWx1ZToKLSAgICAqICAgICAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZSBmdW5jdGlvbi4KLSAgICAqICovCi0gICAgRlBERl9QQUdFICAgKCpGRklfR2V0Q3VycmVudFBhZ2UpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKKyAgLyoqCisgICogTWV0aG9kOiBGRklfR2V0Q3VycmVudFBhZ2UKKyAgKiAgICAgICBUaGlzIG1ldGhvZCByZWNlaXZlcyB0aGUgY3VycmVudCBwYWdlIHBvaW50ZXIuCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQKKyAgKiBmdW5jdGlvbi4KKyAgKiBSZXR1cm4gdmFsdWU6CisgICogICAgICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgorICAqICovCisgIEZQREZfUEFHRSAgICgqRkZJX0dldEN1cnJlbnRQYWdlKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9ET0NVTUVOVCBkb2N1bWVudCk7CiAKLSAgICAvKioKLSAgICAqIE1ldGhvZDogRkZJX0dldFJvdGF0aW9uCi0gICAgKiAgICAgICAgICAgVGhpcyBtZXRob2QgcmVjZWl2ZXMgY3VycmVudGx5IHJvdGF0aW9uIG9mIHRoZSBwYWdlIHZpZXcuCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICB5ZXMKLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgKiAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCi0gICAgKiBSZXR1cm4gdmFsdWU6Ci0gICAgKiAgICAgICBUaGUgcGFnZSByb3RhdGlvbi4gU2hvdWxkIGJlIDAoMCBkZWdyZWUpLDEoOTAgZGVncmVlKSwyKDE4MCBkZWdyZWUpLDMoMjcwIGRlZ3JlZSksIGluIGEgY2xvY2t3aXNlIGRpcmVjdGlvbi4KLSAgICAqICovCi0gICAgaW50ICAgICAoKkZGSV9HZXRSb3RhdGlvbikoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfUEFHRSBwYWdlKTsKKyAgLyoqCisgICogTWV0aG9kOiBGRklfR2V0Um90YXRpb24KKyAgKiAgICAgICAgICAgVGhpcyBtZXRob2QgcmVjZWl2ZXMgY3VycmVudGx5IHJvdGF0aW9uIG9mIHRoZSBwYWdlIHZpZXcuCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBUaGUgcGFnZSByb3RhdGlvbi4gU2hvdWxkIGJlIDAoMCBkZWdyZWUpLDEoOTAgZGVncmVlKSwyKDE4MAorICAqIGRlZ3JlZSksMygyNzAgZGVncmVlKSwgaW4gYSBjbG9ja3dpc2UgZGlyZWN0aW9uLgorICAqICovCisgIGludCAoKkZGSV9HZXRSb3RhdGlvbikoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfUEFHRSBwYWdlKTsKIAotICAgIC8qKgotICAgICogTWV0aG9kOiBGRklfRXhlY3V0ZU5hbWVkQWN0aW9uCi0gICAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBleGVjdXRlIGFuIG5hbWVkIGFjdGlvbi4KKyAgLyoqCisgICogTWV0aG9kOiBGRklfRXhlY3V0ZU5hbWVkQWN0aW9uCisgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgZXhlY3V0ZSBhbiBuYW1lZCBhY3Rpb24uCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAqICAgICAgIG5hbWVkQWN0aW9uICAgICAtICAgQSBieXRlIHN0cmluZyB3aGljaCBpbmRpY2F0ZXMgdGhlIG5hbWVkIGFjdGlvbiwKKyAgKiB0ZXJtaW5hdGVkIGJ5IDAuCisgICogUmV0dXJuIHZhbHVlOgorICAqICAgICAgIE5vbmUuCisgICogQ29tbWVudHM6CisgICogICAgICAgU2VlIHRoZSBuYW1lZCBhY3Rpb25zIGRlc2NyaXB0aW9uIG9mIDw8UERGIFJlZmVyZW5jZSwgdmVyc2lvbiAxLjc+PgorICAqIGZvciBtb3JlIGRldGFpbHMuCisgICogKi8KKyAgdm9pZCAoKkZGSV9FeGVjdXRlTmFtZWRBY3Rpb24pKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIG5hbWVkQWN0aW9uKTsKKyAgLyoqCisgICogQGJyaWVmIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSB0ZXh0IGZpZWxkIGlzIGdldHRpbmcgb3IgbG9zaW5nIGEKKyAgKiBmb2N1cy4KKyAgKgorICAqIEBwYXJhbVtpbl0gcFRoaXMgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiBAcGFyYW1baW5dIHZhbHVlICAgICAgVGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgZm9ybSBmaWVsZCwgaW4gVVRGLTE2TEUKKyAgKiBmb3JtYXQuCisgICogQHBhcmFtW2luXSB2YWx1ZUxlbiAgIFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB2YWx1ZSwgbnVtYmVyIG9mIGNoYXJhY3RlcnMKKyAgKiAobm90IGJ5dGVzKS4KKyAgKiBAcGFyYW1baW5dIGlzX2ZvY3VzICAgVHJ1ZSBpZiB0aGUgZm9ybSBmaWVsZCBpcyBnZXR0aW5nIGEgZm9jdXMsIEZhbHNlIGZvcgorICAqIGxvc2luZyBhIGZvY3VzLgorICAqCisgICogQHJldHVybiBOb25lLgorICAqCisgICogQG5vdGUgQ3VycmVudGx5LG9ubHkgc3VwcG9ydCB0ZXh0IGZpZWxkIGFuZCBjb21ib2JveCBmaWVsZC4KKyAgKiAqLworICB2b2lkICgqRkZJX1NldFRleHRGaWVsZEZvY3VzKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RXT1JEIHZhbHVlTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wgaXNfZm9jdXMpOworCisgIC8qKgorICAqIE1ldGhvZDogRkZJX0RvVVJJQWN0aW9uCisgICogICAgICAgICAgIFRoaXMgYWN0aW9uIHJlc29sdmVzIHRvIGEgdW5pZm9ybSByZXNvdXJjZSBpZGVudGlmaWVyLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIE5vCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAqICAgICAgIGJzVVJJICAgICAgICAgICAtICAgQSBieXRlIHN0cmluZyB3aGljaCBpbmRpY2F0ZXMgdGhlIHVuaWZvcm0gcmVzb3VyY2UKKyAgKiBpZGVudGlmaWVyLCB0ZXJtaW5hdGVkIGJ5IDAuCisgICogUmV0dXJuIHZhbHVlOgorICAqICAgICAgIE5vbmUuCisgICogQ29tbWVudHM6CisgICogICAgICAgU2VlIHRoZSBVUkkgYWN0aW9ucyBkZXNjcmlwdGlvbiBvZiA8PFBERiBSZWZlcmVuY2UsIHZlcnNpb24gMS43Pj4gZm9yCisgICogbW9yZSBkZXRhaWxzLgorICAqICovCisgIHZvaWQgKCpGRklfRG9VUklBY3Rpb24pKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgYnNVUkkpOworCisgIC8qKgorICAqIE1ldGhvZDogRkZJX0RvR29Ub0FjdGlvbgorICAqICAgICAgICAgICBUaGlzIGFjdGlvbiBjaGFuZ2VzIHRoZSB2aWV3IHRvIGEgc3BlY2lmaWVkIGRlc3RpbmF0aW9uLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIE5vCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAqICAgICAgIG5QYWdlSW5kZXggICAgICAtICAgVGhlIGluZGV4IG9mIHRoZSBQREYgcGFnZS4KKyAgKiAgICAgICB6b29tTW9kZSAgICAgICAgLSAgIFRoZSB6b29tIG1vZGUgZm9yIHZpZXdpbmcgcGFnZS5TZWUgTWFjcm9zCisgICoiUERGWk9PTV9YWFgiIGRlZmluZWQgaW4gImZwZGZkb2MuaCIuCisgICogICAgICAgZlBvc0FycmF5ICAgICAgIC0gICBUaGUgZmxvYXQgYXJyYXkgd2hpY2ggY2FycmllcyB0aGUgcG9zaXRpb24gaW5mby4KKyAgKiAgICAgICBzaXplb2ZBcnJheSAgICAgLSAgIFRoZSBzaXplIG9mIGZsb2F0IGFycmF5LgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBOb25lLgorICAqIENvbW1lbnRzOgorICAqICAgICAgIFNlZSB0aGUgRGVzdGluYXRpb25zIGRlc2NyaXB0aW9uIG9mIDw8UERGIFJlZmVyZW5jZSwgdmVyc2lvbiAxLjc+PiBpbgorICAqOC4yLjEgZm9yIG1vcmUgZGV0YWlscy4KKyAgKiovCisgIHZvaWQgKCpGRklfRG9Hb1RvQWN0aW9uKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuUGFnZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHpvb21Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZQb3NBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplb2ZBcnJheSk7CisKKyAgLyoqCisgICogICBwb2ludGVyIHRvIElQREZfSlNQTEFURk9STSBpbnRlcmZhY2UKKyAgKiovCisgIElQREZfSlNQTEFURk9STSogbV9wSnNQbGF0Zm9ybTsKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIC8qIFZlcnNpb24gMi4gKi8KKyAgLyoqCisgICAgKiBNZXRob2Q6IEZGSV9EaXNwbGF5Q2FyZXQKKyAgICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIHNob3cgdGhlIGNhcmV0IGF0IHNwZWNpZmllZCBwb3NpdGlvbi4KICAgICAqIEludGVyZmFjZSBWZXJzaW9uOgogICAgICogICAgICAgICAgIDEKICAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgogICAgICogICAgICAgICAgIHllcwogICAgICogUGFyYW1ldGVyczoKICAgICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgKiAgICAgICBuYW1lZEFjdGlvbiAgICAgLSAgIEEgYnl0ZSBzdHJpbmcgd2hpY2ggaW5kaWNhdGVzIHRoZSBuYW1lZCBhY3Rpb24sIHRlcm1pbmF0ZWQgYnkgMC4KKyAgICAqICAgICAgIHBhZ2UgICAgICAgICAgICAtICAgSGFuZGxlIHRvIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UKKyAgICAqZnVuY3Rpb24uCisgICAgKiAgICAgICBsZWZ0ICAgICAgICAgICAgLSAgIExlZnQgcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlCisgICAgKmNvb3JkaW5hdGUuCisgICAgKiAgICAgICB0b3AgICAgICAgICAgICAgLSAgIFRvcCBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UKKyAgICAqY29vcmRpbmF0ZS4KKyAgICAqICAgICAgIHJpZ2h0ICAgICAgICAgICAtICAgUmlnaHQgcG9zaXRpb24gb2YgdGhlIGNsaWVudCBhcmVhIGluIFBERiBwYWdlCisgICAgKmNvb3JkaW5hdGUuCisgICAgKiAgICAgICBib3R0b20gICAgICAgICAgLSAgIEJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UKKyAgICAqY29vcmRpbmF0ZS4KICAgICAqIFJldHVybiB2YWx1ZToKICAgICAqICAgICAgIE5vbmUuCi0gICAgKiBDb21tZW50czoKLSAgICAqICAgICAgIFNlZSB0aGUgbmFtZWQgYWN0aW9ucyBkZXNjcmlwdGlvbiBvZiA8PFBERiBSZWZlcmVuY2UsIHZlcnNpb24gMS43Pj4gZm9yIG1vcmUgZGV0YWlscy4KLSAgICAqICovCi0gICAgdm9pZCAgICAoKkZGSV9FeGVjdXRlTmFtZWRBY3Rpb24pKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX0JZVEVTVFJJTkcgbmFtZWRBY3Rpb24pOwotICAgIC8qKgotICAgICogQGJyaWVmIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSB0ZXh0IGZpZWxkIGlzIGdldHRpbmcgb3IgbG9zaW5nIGEgZm9jdXMuCi0gICAgKgotICAgICogQHBhcmFtW2luXSBwVGhpcyAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgotICAgICogQHBhcmFtW2luXSB2YWx1ZSAgICAgIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGZvcm0gZmllbGQsIGluIFVURi0xNkxFIGZvcm1hdC4KLSAgICAqIEBwYXJhbVtpbl0gdmFsdWVMZW4gICBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdmFsdWUsIG51bWJlciBvZiBjaGFyYWN0ZXJzIChub3QgYnl0ZXMpLgotICAgICogQHBhcmFtW2luXSBpc19mb2N1cyAgIFRydWUgaWYgdGhlIGZvcm0gZmllbGQgaXMgZ2V0dGluZyBhIGZvY3VzLCBGYWxzZSBmb3IgbG9zaW5nIGEgZm9jdXMuCi0gICAgKgotICAgICogQHJldHVybiBOb25lLgotICAgICoKLSAgICAqIEBub3RlIEN1cnJlbnRseSxvbmx5IHN1cHBvcnQgdGV4dCBmaWVsZCBhbmQgY29tYm9ib3ggZmllbGQuCi0gICAgKiAqLwotICAgIHZvaWQgICAgKCpGRklfU2V0VGV4dEZpZWxkRm9jdXMpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX1dJREVTVFJJTkcgdmFsdWUsIEZQREZfRFdPUkQgdmFsdWVMZW4sIEZQREZfQk9PTCBpc19mb2N1cyk7Ci0KLQotICAgIC8qKgotICAgICogTWV0aG9kOiBGRklfRG9VUklBY3Rpb24KLSAgICAqICAgICAgICAgICBUaGlzIGFjdGlvbiByZXNvbHZlcyB0byBhIHVuaWZvcm0gcmVzb3VyY2UgaWRlbnRpZmllci4KLSAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICogICAgICAgICAgIDEKLSAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICogICAgICAgICAgIE5vCi0gICAgKiBQYXJhbWV0ZXJzOgotICAgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KLSAgICAqICAgICAgIGJzVVJJICAgICAgICAgICAtICAgQSBieXRlIHN0cmluZyB3aGljaCBpbmRpY2F0ZXMgdGhlIHVuaWZvcm0gcmVzb3VyY2UgaWRlbnRpZmllciwgdGVybWluYXRlZCBieSAwLgotICAgICogUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgTm9uZS4KLSAgICAqIENvbW1lbnRzOgotICAgICogICAgICAgU2VlIHRoZSBVUkkgYWN0aW9ucyBkZXNjcmlwdGlvbiBvZiA8PFBERiBSZWZlcmVuY2UsIHZlcnNpb24gMS43Pj4gZm9yIG1vcmUgZGV0YWlscy4KLSAgICAqICovCi0gICAgdm9pZCAgICAoKkZGSV9Eb1VSSUFjdGlvbikoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfQllURVNUUklORyBic1VSSSk7Ci0KLSAgICAvKioKLSAgICAqIE1ldGhvZDogRkZJX0RvR29Ub0FjdGlvbgotICAgICogICAgICAgICAgIFRoaXMgYWN0aW9uIGNoYW5nZXMgdGhlIHZpZXcgdG8gYSBzcGVjaWZpZWQgZGVzdGluYXRpb24uCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICBObwotICAgICogUGFyYW1ldGVyczoKLSAgICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCi0gICAgKiAgICAgICBuUGFnZUluZGV4ICAgICAgLSAgIFRoZSBpbmRleCBvZiB0aGUgUERGIHBhZ2UuCi0gICAgKiAgICAgICB6b29tTW9kZSAgICAgICAgLSAgIFRoZSB6b29tIG1vZGUgZm9yIHZpZXdpbmcgcGFnZS5TZWUgTWFjcm9zICJQREZaT09NX1hYWCIgZGVmaW5lZCBpbiAiZnBkZmRvYy5oIi4KLSAgICAqICAgICAgIGZQb3NBcnJheSAgICAgICAtICAgVGhlIGZsb2F0IGFycmF5IHdoaWNoIGNhcnJpZXMgdGhlIHBvc2l0aW9uIGluZm8uCi0gICAgKiAgICAgICBzaXplb2ZBcnJheSAgICAgLSAgIFRoZSBzaXplIG9mIGZsb2F0IGFycmF5LgotICAgICogUmV0dXJuIHZhbHVlOgotICAgICogICAgICAgTm9uZS4KLSAgICAqIENvbW1lbnRzOgotICAgICogICAgICAgU2VlIHRoZSBEZXN0aW5hdGlvbnMgZGVzY3JpcHRpb24gb2YgPDxQREYgUmVmZXJlbmNlLCB2ZXJzaW9uIDEuNz4+IGluIDguMi4xIGZvciBtb3JlIGRldGFpbHMuCiAgICAgKiovCi0gICAgdm9pZCAgICAoKkZGSV9Eb0dvVG9BY3Rpb24pKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBpbnQgblBhZ2VJbmRleCwgaW50IHpvb21Nb2RlLCBmbG9hdCogZlBvc0FycmF5LCBpbnQgc2l6ZW9mQXJyYXkpOwotICAgIC8qKgotICAgICogICBwb2ludGVyIHRvIElQREZfSlNQTEFURk9STSBpbnRlcmZhY2UKLSAgICAqKi8KLSAgICBJUERGX0pTUExBVEZPUk0qICAgIG1fcEpzUGxhdGZvcm07CisgIHZvaWQgKCpGRklfRGlzcGxheUNhcmV0KShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIGJWaXNpYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGJvdHRvbSk7CisKKyAgLyoqCisgICogTWV0aG9kOiBGRklfR2V0Q3VycmVudFBhZ2VJbmRleAorICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGdldCB0aGUgY3VycmVudCBwYWdlIGluZGV4LgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICBkb2N1bWVudCAgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQKKyAgKmZ1bmN0aW9uLgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBUaGUgaW5kZXggb2YgY3VycmVudCBwYWdlLgorICAqKi8KKyAgaW50ICgqRkZJX0dldEN1cnJlbnRQYWdlSW5kZXgpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9ET0NVTUVOVCBkb2N1bWVudCk7CisKKyAgLyoqCisgICogTWV0aG9kOiBGRklfU2V0Q3VycmVudFBhZ2UKKyAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBzZXQgdGhlIGN1cnJlbnQgcGFnZS4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50CisgICpmdW5jdGlvbi4KKyAgKiAgICAgICBpQ3VyUGFnZSAgICAgICAgLSAgIFRoZSBpbmRleCBvZiB0aGUgUERGIHBhZ2UuCisgICogUmV0dXJuIHZhbHVlOgorICAqICAgICAgIE5vbmUuCisgICoqLworICB2b2lkICgqRkZJX1NldEN1cnJlbnRQYWdlKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlDdXJQYWdlKTsKKworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9Hb3RvVVJMCisgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgbGluayB0byB0aGUgc3BlY2lmaWVkIFVSTC4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICBubworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICBkb2N1bWVudCAgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQKKyAgKmZ1bmN0aW9uLgorICAqICAgICAgIHdzVVJMICAgICAgICAgICAtICAgVGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgVVJMLCBpbiBVVEYtMTZMRSBmb3JtYXQuCisgICogUmV0dXJuIHZhbHVlOgorICAqICAgICAgIE5vbmUuCisgICoqLworICB2b2lkICgqRkZJX0dvdG9VUkwpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgIEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHdzVVJMKTsKKworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9HZXRQYWdlVmlld1JlY3QKKyAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBnZXQgdGhlIGN1cnJlbnQgcGFnZSB2aWV3IHJlY3RhbmdsZS4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICAgICAgcGFnZSAgICAgICAgICAgIC0gICBIYW5kbGUgdG8gcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorICAqZnVuY3Rpb24uCisgICogICAgICAgbGVmdCAgICAgICAgICAgIC0gICBUaGUgcG9pbnRlciB0byByZWNlaXZlIGxlZnQgcG9zaXRpb24gb2YgdGhlIHBhZ2UKKyAgKnZpZXcgYXJlYSBpbiBQREYgcGFnZSBjb29yZGluYXRlLgorICAqICAgICAgIHRvcCAgICAgICAgICAgICAtICAgVGhlIHBvaW50ZXIgdG8gcmVjZWl2ZSB0b3AgcG9zaXRpb24gb2YgdGhlIHBhZ2UKKyAgKnZpZXcgYXJlYSBpbiBQREYgcGFnZSBjb29yZGluYXRlLgorICAqICAgICAgIHJpZ2h0ICAgICAgICAgICAtICAgVGhlIHBvaW50ZXIgdG8gcmVjZWl2ZSByaWdodCBwb3NpdGlvbiBvZiB0aGUKKyAgKmNsaWVudCBhcmVhIGluIFBERiBwYWdlIGNvb3JkaW5hdGUuCisgICogICAgICAgYm90dG9tICAgICAgICAgIC0gICBUaGUgcG9pbnRlciB0byByZWNlaXZlIGJvdHRvbSBwb3NpdGlvbiBvZiB0aGUKKyAgKmNsaWVudCBhcmVhIGluIFBERiBwYWdlIGNvb3JkaW5hdGUuCisgICogUmV0dXJuIHZhbHVlOgorICAqICAgICAgIE5vbmUuCisgICoqLworICB2b2lkICgqRkZJX0dldFBhZ2VWaWV3UmVjdCkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYm90dG9tKTsKKyAgLyoqCisgICogTWV0aG9kOiBGRklfUG9wdXBNZW51CisgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgdHJhY2sgdGhlIHJpZ2h0IGNvbnRleHQgbWVudSBmb3IgWEZBIGZpZWxkcy4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICAgICAgcGFnZSAgICAgICAgICAgIC0gICBIYW5kbGUgdG8gcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorICAqZnVuY3Rpb24uCisgICogICAgICAgaFdpZGdldCAgICAgICAgIC0gICBIYW5kbGUgdG8gWEZBIGZpZWxkcy4KKyAgKiAgICAgICBtZW51RmxhZyAgICAgICAgLSAgIFRoZSBtZW51IGZsYWdzLiBQbGVhc2UgcmVmZXIgdG8gbWFjcm8gZGVmaW5pdGlvbgorICAqb2YgRlhGQV9NRU1VX1hYWCBhbmQgdGhpcyBjYW4gYmUgb25lIG9yIGEgY29tYmluYXRpb24gb2YgdGhlc2UgbWFjcm9zLgorICAqICAgICAgIHggICAgICAgICAgICAgICAtICAgWCBwb3NpdGlvbiBvZiB0aGUgY2xpZW50IGFyZWEgaW4gUERGIHBhZ2UKKyAgKmNvb3JkaW5hdGUuCisgICogICAgICAgeSAgICAgICAgICAgICAgIC0gICBZIHBvc2l0aW9uIG9mIHRoZSBjbGllbnQgYXJlYSBpbiBQREYgcGFnZQorICAqY29vcmRpbmF0ZS4KKyAgKiBSZXR1cm4gdmFsdWU6CisgICogICAgICAgVFJVRSBpbmRpY2F0ZXMgc3VjY2Vzczsgb3RoZXJ3aXNlIGZhbHNlLgorICAqKi8KKyAgRlBERl9CT09MICgqRkZJX1BvcHVwTWVudSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsIEZQREZfUEFHRSBwYWdlLCBGUERGX1dJREdFVCBoV2lkZ2V0LCBpbnQgbWVudUZsYWcsIGZsb2F0IHgsIGZsb2F0IHkpOworCisgIC8qKgorICAqIE1ldGhvZDogRkZJX09wZW5GaWxlCisgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgb3BlbiB0aGUgc3BlY2lmaWVkIGZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkIG1vZGUuCisgICogSW50ZXJmYWNlIFZlcnNpb24KKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICAgICAgZmlsZUZsYWcgICAgICAgIC0gICBUaGUgZmlsZSBmbGFnLlBsZWFzZSByZWZlciB0byBtYWNybyBkZWZpbml0aW9uIG9mCisgICpGWEZBX1NBVkVBU19YWFggYW5kIHRoaXMgY2FuIGJlIG9uZSBvZiB0aGVzZSBtYWNyb3MuCisgICogICAgICAgd3NVUkwgICAgICAgICAgIC0gICBUaGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBmaWxlIFVSTCwgaW4gVVRGLTE2TEUKKyAgKmZvcm1hdC4KKyAgKiAgICAgICBtb2RlICAgICAgICAgICAgLSAgIFRoZSBtb2RlIGZvciBvcGVuIGZpbGUuCisgICogUmV0dXJuIHZhbHVlOgorICAqICAgICAgIFRoZSBoYW5kbGUgdG8gRlBERl9GSUxFSEFORExFUi4KKyAgKiovCisgIEZQREZfRklMRUhBTkRMRVIqICgqRkZJX09wZW5GaWxlKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyB3c1VSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1vZGUpOworCisgIC8qKgorICAqIE1ldGhvZDogRkZJX0VtYWlsVG8KKyAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBlbWFpbCB0aGUgc3BlY2lmaWVkIGZpbGUgc3RyZWFtIHRvIHRoZSBzcGVjaWZpZWQKKyAgKmNvbnRhY3Rlci4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICAgICAgcEZpbGVIYW5kbGVyICAgIC0gICBIYW5kbGUgdG8gdGhlIEZQREZfRklMRUhBTkRMRVIuCisgICogICAgICAgcFRvICAgICAgICAgICAgIC0gICBBIHNlbWljb2xvbi1kZWxpbWl0ZWQgbGlzdCBvZiByZWNpcGllbnRzIGZvciB0aGUKKyAgKm1lc3NhZ2UsaW4gVVRGLTE2TEUgZm9ybWF0LgorICAqICAgICAgIHBTdWJqZWN0ICAgICAgICAtICAgVGhlIHN1YmplY3Qgb2YgdGhlIG1lc3NhZ2UsaW4gVVRGLTE2TEUgZm9ybWF0LgorICAqICAgICAgIHBDQyAgICAgICAgICAgICAtICAgQSBzZW1pY29sb24tZGVsaW1pdGVkIGxpc3Qgb2YgQ0MgcmVjaXBpZW50cyBmb3IKKyAgKnRoZSBtZXNzYWdlLGluIFVURi0xNkxFIGZvcm1hdC4KKyAgKiAgICAgICBwQmNjICAgICAgICAgICAgLSAgIEEgc2VtaWNvbG9uLWRlbGltaXRlZCBsaXN0IG9mIEJDQyByZWNpcGllbnRzIGZvcgorICAqdGhlIG1lc3NhZ2UsaW4gVVRGLTE2TEUgZm9ybWF0LgorICAqICAgICAgIHBNc2cgICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgdG8gYmUgc2VudC5DYW4gYmUKKyAgKk5VTEwsaW4gVVRGLTE2TEUgZm9ybWF0LgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBOb25lLgorICAqKi8KKyAgdm9pZCAoKkZGSV9FbWFpbFRvKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZJTEVIQU5ETEVSKiBmaWxlSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgcFRvLAorICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBwU3ViamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgcENDLAorICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBwQmNjLAorICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBwTXNnKTsKKworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9VcGxvYWRUbworICAqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGdldCB1cGxvYWQgdGhlIHNwZWNpZmllZCBmaWxlIHN0cmVhbSB0byB0aGUKKyAgKnNwZWNpZmllZCBVUkwuCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAqICAgICAgIHBGaWxlSGFuZGxlciAgICAtICAgSGFuZGxlIHRvIHRoZSBGUERGX0ZJTEVIQU5ETEVSLgorICAqICAgICAgIGZpbGVGbGFnICAgICAgICAtICAgVGhlIGZpbGUgZmxhZy5QbGVhc2UgcmVmZXIgdG8gbWFjcm8gZGVmaW5pdGlvbiBvZgorICAqRlhGQV9TQVZFQVNfWFhYIGFuZCB0aGlzIGNhbiBiZSBvbmUgb2YgdGhlc2UgbWFjcm9zLgorICAqICAgICAgIHVwbG9hZFRvICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgVVJMIHBhdGgsIGluIFVURi0xNkxFIGZvcm1hdC4KKyAgKiBSZXR1cm4gdmFsdWU6CisgICogICAgICAgTm9uZS4KKyAgKiovCisgIHZvaWQgKCpGRklfVXBsb2FkVG8pKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZJTEVIQU5ETEVSKiBmaWxlSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgdXBsb2FkVG8pOworCisgIC8qKgorICAqIE1ldGhvZDogRkZJX0dldFBsYXRmb3JtCisgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgZ2V0IHRoZSBjdXJyZW50IHBsYXRmb3JtLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICBwbGF0Zm9ybSAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlCisgICpwbGF0Zm9ybS5DYW4gYmUgTlVMTCxpbiBVVEYtMTZMRSBmb3JtYXQuCisgICogICAgICAgbGVuZ3RoICAgICAgICAgIC0gICBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIsIG51bWJlciBvZiBieXRlcy4gQ2FuIGJlCisgICowLgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIsIG51bWJlciBvZiBieXRlcy4KKyAgKiovCisgIGludCAoKkZGSV9HZXRQbGF0Zm9ybSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGxhdGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCk7CisKKyAgLyoqCisgICogTWV0aG9kOiBGRklfR2V0TGFuZ3VhZ2UKKyAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBnZXQgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuCisgICogSW50ZXJmYWNlIFZlcnNpb246CisgICogICAgICAgICAgIDEKKyAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgKiAgICAgICAgICAgeWVzCisgICogUGFyYW1ldGVyczoKKyAgKiAgICAgICBwVGhpcyAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICAqICAgICAgIGxhbmd1YWdlICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgY3VycmVudAorICAqbGFuZ3VhZ2UuQ2FuIGJlIE5VTEwuCisgICogICAgICAgbGVuZ3RoICAgICAgICAgIC0gICBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIsIG51bWJlciBvZiBieXRlcy4gQ2FuIGJlCisgICowLgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIsIG51bWJlciBvZiBieXRlcy4KKyAgKiovCisgIGludCAoKkZGSV9HZXRMYW5ndWFnZSkoc3RydWN0IF9GUERGX0ZPUk1GSUxMSU5GTyogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogbGFuZ3VhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCk7CisKKyAgLyoqCisgICogTWV0aG9kOiBGRklfRG93bmxvYWRGcm9tVVJMCisgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgZG93bmxvYWQgdGhlIHNwZWNpZmllZCBmaWxlIGZyb20gdGhlIFVSTC4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgIHBUaGlzICAgICAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYuCisgICogICAgICAgVVJMICAgICAgICAgICAgIC0gICBUaGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBmaWxlIFVSTCwgaW4gVVRGLTE2TEUKKyAgKmZvcm1hdC4KKyAgKiBSZXR1cm4gdmFsdWU6CisgICogICAgICAgVGhlIGhhbmRsZSB0byBGUERGX0ZJTEVIQU5ETEVSLgorICAqKi8KKyAgRlBERl9MUEZJTEVIQU5ETEVSICAoKkZGSV9Eb3dubG9hZEZyb21VUkwpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX1dJREVTVFJJTkcgVVJMKTsKKyAgLyoqCisgICogTWV0aG9kOiBGRklfUG9zdFJlcXVlc3RVUkwKKyAgKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBwb3N0IHRoZSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgVVJMLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICB3c1VSTCAgICAgICAgICAgLSAgIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIHNlcnZlciBVUkwsIGluIFVURi0xNkxFCisgICpmb3JtYXQuCisgICogICAgICAgd3NEYXRhICAgICAgICAgIC0gICBUaGUgcG9zdCBkYXRhLGluIFVURi0xNkxFIGZvcm1hdC4KKyAgKiAgICAgICB3c0NvbnRlbnRUeXBlICAgLSAgIFRoZSBjb250ZW50IHR5cGUgb2YgdGhlIHJlcXVlc3QgZGF0YSxpbiBVVEYtMTZMRQorICAqZm9ybWF0LgorICAqICAgICAgIHdzRW5jb2RlICAgICAgICAtICAgVGhlIGVuY29kZSB0eXBlLGluIFVURi0xNkxFIGZvcm1hdC4KKyAgKiAgICAgICB3c0hlYWRlciAgICAgICAgLSAgIFRoZSByZXF1ZXN0IGhlYWRlcixpbiBVVEYtMTZMRSBmb3JtYXQuCisgICogICAgICAgcmVzcG9uc2UgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBGUERGX0JTVFIgdG8gcmVjZWl2ZSB0aGUgcmVzcG9uc2UKKyAgKmRhdGEgZnJvbSBzZXJ2ZXIsLGluIFVURi0xNkxFIGZvcm1hdC4KKyAgKiBSZXR1cm4gdmFsdWU6CisgICogICAgICAgVFJVRSBpbmRpY2F0ZXMgc3VjY2Vzcywgb3RoZXJ3aXNlIEZBTFNFLgorICAqKi8KKyAgRlBERl9CT09MICAgKCpGRklfUG9zdFJlcXVlc3RVUkwpKHN0cnVjdCBfRlBERl9GT1JNRklMTElORk8qIHBUaGlzLCBGUERGX1dJREVTVFJJTkcgd3NVUkwsIEZQREZfV0lERVNUUklORyB3c0RhdGEsIEZQREZfV0lERVNUUklORyB3c0NvbnRlbnRUeXBlLCBGUERGX1dJREVTVFJJTkcgd3NFbmNvZGUsIEZQREZfV0lERVNUUklORyB3c0hlYWRlciwgRlBERl9CU1RSKiByZXNwb25lKTsKKworICAvKioKKyAgKiBNZXRob2Q6IEZGSV9QdXRSZXF1ZXN0VVJMCisgICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgcHV0IHRoZSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgVVJMLgorICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAqICAgICAgICAgICAxCisgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICogICAgICAgICAgIHllcworICAqIFBhcmFtZXRlcnM6CisgICogICAgICAgcFRoaXMgICAgICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZi4KKyAgKiAgICAgICB3c1VSTCAgICAgICAgICAgLSAgIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIHNlcnZlciBVUkwsIGluIFVURi0xNkxFCisgICpmb3JtYXQuCisgICogICAgICAgd3NEYXRhICAgICAgICAgIC0gICBUaGUgcHV0IGRhdGEsIGluIFVURi0xNkxFIGZvcm1hdC4KKyAgKiAgICAgICB3c0VuY29kZSAgICAgICAgLSAgIFRoZSBlbmNvZGUgdHlwZSwgaW4gVVRSLTE2TEUgZm9ybWF0LgorICAqIFJldHVybiB2YWx1ZToKKyAgKiAgICAgICBUUlVFIGluZGljYXRlcyBzdWNjZXNzLCBvdGhlcndpc2UgRkFMU0UuCisgICoqLworICBGUERGX0JPT0wgICAoKkZGSV9QdXRSZXF1ZXN0VVJMKShzdHJ1Y3QgX0ZQREZfRk9STUZJTExJTkZPKiBwVGhpcywgRlBERl9XSURFU1RSSU5HIHdzVVJMLCBGUERGX1dJREVTVFJJTkcgd3NEYXRhLCBGUERGX1dJREVTVFJJTkcgd3NFbmNvZGUpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCiB9IEZQREZfRk9STUZJTExJTkZPOwogCi0KLQogLyoqCiAgKiBGdW5jdGlvbjogRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudAogICogICAgICAgICAgSW5pdCBmb3JtIGZpbGwgZW52aXJvbm1lbnQuCiAgKiBDb21tZW50czoKICAqICAgICAgICAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgYW55IGZvcm0gZmlsbCBvcGVyYXRpb24uCiAgKiBQYXJhbWV0ZXJzOgotICogICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgorICogICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5CisgKkZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgogICogICAgICAgICAgcEZvcm1GaWxsSW5mbyAgIC0gICBQb2ludGVyIHRvIGEgRlBERl9GT1JNRklMTElORk8gc3RydWN0dXJlLgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgUmV0dXJuIGhhbmRsZXIgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIE5VTEwgbWVhbnMgZmFpbHMuCiAgKiovCi1ETExFWFBPUlQgRlBERl9GT1JNSEFORExFIFNURENBTEwgRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0ZPUk1GSUxMSU5GTyogZm9ybUluZm8pOworRExMRVhQT1JUIEZQREZfRk9STUhBTkRMRSBTVERDQUxMCitGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRk9STUZJTExJTkZPKiBmb3JtSW5mbyk7CiAKIC8qKgogICogRnVuY3Rpb246IEZQREZET0NfRXhpdEZvcm1GaWxsRW52aXJvbm1lbnQKICAqICAgICAgICAgIEV4aXQgZm9ybSBmaWxsIGVudmlyb25tZW50LgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCisgKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICpGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTlVMTC4KICAqKi8KQEAgLTU1OSwyNDYgKzEwNDQsMzg3IEBACiAKIC8qKgogICogRnVuY3Rpb246IEZPUk1fT25BZnRlckxvYWRQYWdlCi0gKiAgICAgICAgICBUaGlzIG1ldGhvZCBpcyByZXF1aXJlZCBmb3IgaW1wbGVtZW50aW5nIGFsbCB0aGUgZm9ybSByZWxhdGVkIGZ1bmN0aW9ucy4gU2hvdWxkIGJlIGludm9rZWQgYWZ0ZXIgdXNlcgotICogICAgICAgICAgc3VjY2Vzc2Z1bGx5IGxvYWRlZCBhIFBERiBwYWdlLCBhbmQgbWV0aG9kIEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQgaGFkIGJlZW4gaW52b2tlZC4KKyAqICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIHJlcXVpcmVkIGZvciBpbXBsZW1lbnRpbmcgYWxsIHRoZSBmb3JtIHJlbGF0ZWQKKyAqZnVuY3Rpb25zLiBTaG91bGQgYmUgaW52b2tlZCBhZnRlciB1c2VyCisgKiAgICAgICAgICBzdWNjZXNzZnVsbHkgbG9hZGVkIGEgUERGIHBhZ2UsIGFuZCBtZXRob2QKKyAqRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudCBoYWQgYmVlbiBpbnZva2VkLgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCisgKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICpGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTk9ORS4KICAqKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9PbkFmdGVyTG9hZFBhZ2UoRlBERl9QQUdFIHBhZ2UsIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9PbkFmdGVyTG9hZFBhZ2UoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKTsKIAogLyoqCiAgKiBGdW5jdGlvbjogRk9STV9PbkJlZm9yZUNsb3NlUGFnZQotICogICAgICAgICAgVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgZm9yIGltcGxlbWVudGluZyBhbGwgdGhlIGZvcm0gcmVsYXRlZCBmdW5jdGlvbnMuIFNob3VsZCBiZSBpbnZva2VkIGJlZm9yZSB1c2VyCisgKiAgICAgICAgICBUaGlzIG1ldGhvZCBpcyByZXF1aXJlZCBmb3IgaW1wbGVtZW50aW5nIGFsbCB0aGUgZm9ybSByZWxhdGVkCisgKmZ1bmN0aW9ucy4gU2hvdWxkIGJlIGludm9rZWQgYmVmb3JlIHVzZXIKICAqICAgICAgICAgIGNsb3NlIHRoZSBQREYgcGFnZS4KICAqIFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgotICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkgRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KKyAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UKKyAqZnVuY3Rpb24uCisgKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICpGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTk9ORS4KICAqKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9PbkJlZm9yZUNsb3NlUGFnZShGUERGX1BBR0UgcGFnZSwgRlBERl9GT1JNSEFORExFIGhIYW5kbGUpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGT1JNX09uQmVmb3JlQ2xvc2VQYWdlKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKTsKIAogLyoqCiAqIEZ1bmN0aW9uOiBGT1JNX0RvRG9jdW1lbnRKU0FjdGlvbgotKiAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgZm9yIHBlcmZvcm1pbmcgRG9jdW1lbnQtbGV2ZWwgSmF2YVNjcmlwdCBhY3Rpb24uIEl0IHNob3VsZCBiZSBpbnZva2VkIGFmdGVyIHRoZSBQREYgZG9jdW1lbnQKKyogICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIHJlcXVpcmVkIGZvciBwZXJmb3JtaW5nIERvY3VtZW50LWxldmVsIEphdmFTY3JpcHQKKyphY3Rpb24uIEl0IHNob3VsZCBiZSBpbnZva2VkIGFmdGVyIHRoZSBQREYgZG9jdW1lbnQKICogICAgICAgICAgIGhhZCBiZWVuIGxvYWRlZC4KICogUGFyYW1ldGVyczoKLSogICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCisqICAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorKkZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCiAqIFJldHVybiBWYWx1ZToKICogICAgICAgICAgIE5PTkUKICogQ29tbWVudHM6Ci0qICAgICAgICAgICBJZiB0aGVyZSBpcyBEb2N1bWVudC1sZXZlbCBKYXZhU2NyaXB0IGFjdGlvbiBlbWJlZGRlZCBpbiB0aGUgZG9jdW1lbnQsIHRoaXMgbWV0aG9kIHdpbGwgZXhlY3V0ZSB0aGUgamF2YXNjcmlwdCBhY3Rpb247CisqICAgICAgICAgICBJZiB0aGVyZSBpcyBEb2N1bWVudC1sZXZlbCBKYXZhU2NyaXB0IGFjdGlvbiBlbWJlZGRlZCBpbiB0aGUKKypkb2N1bWVudCwgdGhpcyBtZXRob2Qgd2lsbCBleGVjdXRlIHRoZSBqYXZhc2NyaXB0IGFjdGlvbjsKICogICAgICAgICAgIG90aGVyd2lzZSwgdGhlIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcuCiAqKi8KIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9Eb0RvY3VtZW50SlNBY3Rpb24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUpOwogCi0KIC8qKgogKiBGdW5jdGlvbjogRk9STV9Eb0RvY3VtZW50T3BlbkFjdGlvbgotKiAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgZm9yIHBlcmZvcm1pbmcgb3Blbi1hY3Rpb24gd2hlbiB0aGUgZG9jdW1lbnQgaXMgb3BlbmVkLgorKiAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgZm9yIHBlcmZvcm1pbmcgb3Blbi1hY3Rpb24gd2hlbiB0aGUgZG9jdW1lbnQKKyppcyBvcGVuZWQuCiAqIFBhcmFtZXRlcnM6Ci0qICAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieSBGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorKiAgICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkKKypGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgogKiBSZXR1cm4gVmFsdWU6CiAqICAgICAgICAgICBOT05FCiAqIENvbW1lbnRzOgotKiAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBkbyBub3RoaW5nIGlmIHRoZXJlIGlzIG5vIG9wZW4tYWN0aW9ucyBlbWJlZGRlZCBpbiB0aGUgZG9jdW1lbnQuCisqICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcgaWYgdGhlcmUgaXMgbm8gb3Blbi1hY3Rpb25zIGVtYmVkZGVkIGluCisqdGhlIGRvY3VtZW50LgogKiovCiBETExFWFBPUlQgdm9pZCBTVERDQUxMIEZPUk1fRG9Eb2N1bWVudE9wZW5BY3Rpb24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUpOwogCi0KIC8vIGFkZGl0aW9uYWwgYWN0aW9ucyB0eXBlIG9mIGRvY3VtZW50LgotI2RlZmluZSBGUERGRE9DX0FBQ1RJT05fV0MgICAgICAweDEwICAgICAgICAvL1dDLCBiZWZvcmUgY2xvc2luZyBkb2N1bWVudCwgSmF2YVNjcmlwdCBhY3Rpb24uCi0jZGVmaW5lIEZQREZET0NfQUFDVElPTl9XUyAgICAgIDB4MTEgICAgICAgIC8vV1MsIGJlZm9yZSBzYXZpbmcgZG9jdW1lbnQsIEphdmFTY3JpcHQgYWN0aW9uLgotI2RlZmluZSBGUERGRE9DX0FBQ1RJT05fRFMgICAgICAweDEyICAgICAgICAvL0RTLCBhZnRlciBzYXZpbmcgZG9jdW1lbnQsIEphdmFTY3JpcHQgYWN0aW9uLgotI2RlZmluZSBGUERGRE9DX0FBQ1RJT05fV1AgICAgICAweDEzICAgICAgICAvL1dQLCBiZWZvcmUgcHJpbnRpbmcgZG9jdW1lbnQsIEphdmFTY3JpcHQgYWN0aW9uLgotI2RlZmluZSBGUERGRE9DX0FBQ1RJT05fRFAgICAgICAweDE0ICAgICAgICAvL0RQLCBhZnRlciBwcmludGluZyBkb2N1bWVudCwgSmF2YVNjcmlwdCBhY3Rpb24uCisjZGVmaW5lIEZQREZET0NfQUFDVElPTl9XQyBcCisgIDB4MTAgIC8vIFdDLCBiZWZvcmUgY2xvc2luZyBkb2N1bWVudCwgSmF2YVNjcmlwdCBhY3Rpb24uCisjZGVmaW5lIEZQREZET0NfQUFDVElPTl9XUyBcCisgIDB4MTEgIC8vIFdTLCBiZWZvcmUgc2F2aW5nIGRvY3VtZW50LCBKYXZhU2NyaXB0IGFjdGlvbi4KKyNkZWZpbmUgRlBERkRPQ19BQUNUSU9OX0RTIDB4MTIgIC8vIERTLCBhZnRlciBzYXZpbmcgZG9jdW1lbnQsIEphdmFTY3JpcHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjdGlvbi4KKyNkZWZpbmUgRlBERkRPQ19BQUNUSU9OX1dQIFwKKyAgMHgxMyAgLy8gV1AsIGJlZm9yZSBwcmludGluZyBkb2N1bWVudCwgSmF2YVNjcmlwdCBhY3Rpb24uCisjZGVmaW5lIEZQREZET0NfQUFDVElPTl9EUCBcCisgIDB4MTQgIC8vIERQLCBhZnRlciBwcmludGluZyBkb2N1bWVudCwgSmF2YVNjcmlwdCBhY3Rpb24uCisKIC8qKgogKiBGdW5jdGlvbjogRk9STV9Eb0RvY3VtZW50QUFjdGlvbgotKiAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgZm9yIHBlcmZvcm1pbmcgdGhlIGRvY3VtZW50J3MgYWRkaXRpb25hbC1hY3Rpb24uCisqICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyByZXF1aXJlZCBmb3IgcGVyZm9ybWluZyB0aGUgZG9jdW1lbnQncworKmFkZGl0aW9uYWwtYWN0aW9uLgogKiBQYXJhbWV0ZXJzOgotKiAgICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkgRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KLSogICAgICAgICAgIGFhVHlwZSAgICAgIC0gICBUaGUgdHlwZSBvZiB0aGUgYWRkaXRpb25hbC1hY3Rpb25zIHdoaWNoIGRlZmluZWQgYWJvdmUuCisqICAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorKkZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCisqICAgICAgICAgICBhYVR5cGUgICAgICAtICAgVGhlIHR5cGUgb2YgdGhlIGFkZGl0aW9uYWwtYWN0aW9ucyB3aGljaCBkZWZpbmVkCisqYWJvdmUuCiAqIFJldHVybiBWYWx1ZToKICogICAgICAgICAgIE5PTkUKICogQ29tbWVudHM6Ci0qICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGRvIG5vdGhpbmcgaWYgdGhlcmUgaXMgbm8gZG9jdW1lbnQgYWRkaXRpb25hbC1hY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFhVHlwZS4KKyogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgZG8gbm90aGluZyBpZiB0aGVyZSBpcyBubyBkb2N1bWVudAorKmFkZGl0aW9uYWwtYWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhYVR5cGUuCiAqKi8KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGT1JNX0RvRG9jdW1lbnRBQWN0aW9uKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLCBpbnQgYWFUeXBlKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9Eb0RvY3VtZW50QUFjdGlvbihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWFUeXBlKTsKIAogLy8gQWRkaXRpb25hbC1hY3Rpb24gdHlwZXMgb2YgcGFnZSBvYmplY3QKLSNkZWZpbmUgRlBERlBBR0VfQUFDVElPTl9PUEVOICAgICAgIDAgICAgICAgLy8gL08gLS0gQW4gYWN0aW9uIHRvIGJlIHBlcmZvcm1lZCB3aGVuIHRoZSBwYWdlIGlzIG9wZW5lZAotI2RlZmluZSBGUERGUEFHRV9BQUNUSU9OX0NMT1NFICAgICAgMSAgICAgICAvLyAvQyAtLSBBbiBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkIHdoZW4gdGhlIHBhZ2UgaXMgY2xvc2VkCisjZGVmaW5lIEZQREZQQUdFX0FBQ1RJT05fT1BFTiBcCisgIDAgIC8vIC9PIC0tIEFuIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQgd2hlbiB0aGUgcGFnZSBpcyBvcGVuZWQKKyNkZWZpbmUgRlBERlBBR0VfQUFDVElPTl9DTE9TRSBcCisgIDEgIC8vIC9DIC0tIEFuIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQgd2hlbiB0aGUgcGFnZSBpcyBjbG9zZWQKIAogLyoqCiAqIEZ1bmN0aW9uOiBGT1JNX0RvUGFnZUFBY3Rpb24KLSogICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIHJlcXVpcmVkIGZvciBwZXJmb3JtaW5nIHRoZSBwYWdlIG9iamVjdCdzIGFkZGl0aW9uYWwtYWN0aW9uIHdoZW4gb3BlbmVkIG9yIGNsb3NlZC4KKyogICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIHJlcXVpcmVkIGZvciBwZXJmb3JtaW5nIHRoZSBwYWdlIG9iamVjdCdzCisqYWRkaXRpb25hbC1hY3Rpb24gd2hlbiBvcGVuZWQgb3IgY2xvc2VkLgogKiBQYXJhbWV0ZXJzOgotKiAgICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZSBmdW5jdGlvbi4KLSogICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCi0qICAgICAgICAgICBhYVR5cGUgICAgICAtICAgVGhlIHR5cGUgb2YgdGhlIHBhZ2Ugb2JqZWN0J3MgYWRkaXRpb25hbC1hY3Rpb25zIHdoaWNoIGRlZmluZWQgYWJvdmUuCisqICAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlCisqZnVuY3Rpb24uCisqICAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorKkZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCisqICAgICAgICAgICBhYVR5cGUgICAgICAtICAgVGhlIHR5cGUgb2YgdGhlIHBhZ2Ugb2JqZWN0J3MgYWRkaXRpb25hbC1hY3Rpb25zCisqd2hpY2ggZGVmaW5lZCBhYm92ZS4KICogUmV0dXJuIFZhbHVlOgogKiAgICAgICAgICAgTk9ORQogKiBDb21tZW50czoKLSogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgZG8gbm90aGluZyBpZiBubyBhZGRpdGlvbmFsLWFjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYWFUeXBlIGV4aXN0cy4KKyogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgZG8gbm90aGluZyBpZiBubyBhZGRpdGlvbmFsLWFjdGlvbiBjb3JyZXNwb25kaW5nIHRvCisqdGhlIHNwZWNpZmllZCBhYVR5cGUgZXhpc3RzLgogKiovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZPUk1fRG9QYWdlQUFjdGlvbihGUERGX1BBR0UgcGFnZSwgRlBERl9GT1JNSEFORExFIGhIYW5kbGUsIGludCBhYVR5cGUpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGT1JNX0RvUGFnZUFBY3Rpb24oRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhYVR5cGUpOwogCiAvKioKICAqIEZ1bmN0aW9uOiBGT1JNX09uTW91c2VNb3ZlCiAgKiAgICAgICAgICBZb3UgY2FuIGNhbGwgdGhpcyBtZW1iZXIgZnVuY3Rpb24gd2hlbiB0aGUgbW91c2UgY3Vyc29yIG1vdmVzLgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCi0gKiAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgorICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkKKyAqRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KKyAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UKKyAqZnVuY3Rpb24uCiAgKiAgICAgICAgICBtb2RpZmllciAgICAgICAgLSAgIEluZGljYXRlcyB3aGV0aGVyIHZhcmlvdXMgdmlydHVhbCBrZXlzIGFyZSBkb3duLgotICogICAgICAgICAgcGFnZV94ICAgICAgLSAgIFNwZWNpZmllcyB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSBjdXJzb3IgaW4gUERGIHVzZXIgc3BhY2UuCi0gKiAgICAgICAgICBwYWdlX3kgICAgICAtICAgU3BlY2lmaWVzIHRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGN1cnNvciBpbiBQREYgdXNlciBzcGFjZS4KKyAqICAgICAgICAgIHBhZ2VfeCAgICAgIC0gICBTcGVjaWZpZXMgdGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgY3Vyc29yIGluIFBERiB1c2VyCisgKnNwYWNlLgorICogICAgICAgICAgcGFnZV95ICAgICAgLSAgIFNwZWNpZmllcyB0aGUgeS1jb29yZGluYXRlIG9mIHRoZSBjdXJzb3IgaW4gUERGIHVzZXIKKyAqc3BhY2UuCiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBUUlVFIGluZGljYXRlcyBzdWNjZXNzOyBvdGhlcndpc2UgZmFsc2UuCiAgKiovCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9Pbk1vdXNlTW92ZShGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSxGUERGX1BBR0UgcGFnZSwgaW50IG1vZGlmaWVyLCBkb3VibGUgcGFnZV94LCBkb3VibGUgcGFnZV95KTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uTW91c2VNb3ZlKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSk7CiAKIC8qKgogICogRnVuY3Rpb246IEZPUk1fT25MQnV0dG9uRG93bgotICogICAgICAgICAgWW91IGNhbiBjYWxsIHRoaXMgbWVtYmVyIGZ1bmN0aW9uIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgbGVmdCBtb3VzZSBidXR0b24uCisgKiAgICAgICAgICBZb3UgY2FuIGNhbGwgdGhpcyBtZW1iZXIgZnVuY3Rpb24gd2hlbiB0aGUgdXNlciBwcmVzc2VzIHRoZSBsZWZ0CisgKm1vdXNlIGJ1dHRvbi4KICAqIFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieSBGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgotICogICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZSBmdW5jdGlvbi4KKyAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5CisgKkZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCisgKiAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlCisgKmZ1bmN0aW9uLgogICogICAgICAgICAgbW9kaWZpZXIgICAgICAgIC0gICBJbmRpY2F0ZXMgd2hldGhlciB2YXJpb3VzIHZpcnR1YWwga2V5cyBhcmUgZG93bi4KLSAqICAgICAgICAgIHBhZ2VfeCAgICAgIC0gICBTcGVjaWZpZXMgdGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgY3Vyc29yIGluIFBERiB1c2VyIHNwYWNlLgotICogICAgICAgICAgcGFnZV95ICAgICAgLSAgIFNwZWNpZmllcyB0aGUgeS1jb29yZGluYXRlIG9mIHRoZSBjdXJzb3IgaW4gUERGIHVzZXIgc3BhY2UuCisgKiAgICAgICAgICBwYWdlX3ggICAgICAtICAgU3BlY2lmaWVzIHRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGN1cnNvciBpbiBQREYgdXNlcgorICpzcGFjZS4KKyAqICAgICAgICAgIHBhZ2VfeSAgICAgIC0gICBTcGVjaWZpZXMgdGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgY3Vyc29yIGluIFBERiB1c2VyCisgKnNwYWNlLgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgVFJVRSBpbmRpY2F0ZXMgc3VjY2Vzczsgb3RoZXJ3aXNlIGZhbHNlLgogICoqLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25MQnV0dG9uRG93bihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSxGUERGX1BBR0UgcGFnZSwgaW50IG1vZGlmaWVyLCBkb3VibGUgcGFnZV94LCBkb3VibGUgcGFnZV95KTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uTEJ1dHRvbkRvd24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpOwogCiAvKioKICAqIEZ1bmN0aW9uOiBGT1JNX09uTEJ1dHRvblVwCi0gKiAgICAgICAgICBZb3UgY2FuIGNhbGwgdGhpcyBtZW1iZXIgZnVuY3Rpb24gd2hlbiB0aGUgdXNlciByZWxlYXNlcyB0aGUgbGVmdCBtb3VzZSBidXR0b24uCisgKiAgICAgICAgICBZb3UgY2FuIGNhbGwgdGhpcyBtZW1iZXIgZnVuY3Rpb24gd2hlbiB0aGUgdXNlciByZWxlYXNlcyB0aGUgbGVmdAorICptb3VzZSBidXR0b24uCiAgKiBQYXJhbWV0ZXJzOgotICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkgRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KLSAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCisgKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICpGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorICogICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorICpmdW5jdGlvbi4KICAqICAgICAgICAgIG1vZGlmaWVyICAgIC0gICBJbmRpY2F0ZXMgd2hldGhlciB2YXJpb3VzIHZpcnR1YWwga2V5cyBhcmUgZG93bi4KICAqICAgICAgICAgIHBhZ2VfeCAgICAgIC0gICBTcGVjaWZpZXMgdGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgY3Vyc29yIGluIGRldmljZS4KICAqICAgICAgICAgIHBhZ2VfeSAgICAgIC0gICBTcGVjaWZpZXMgdGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgY3Vyc29yIGluIGRldmljZS4KICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIFRSVUUgaW5kaWNhdGVzIHN1Y2Nlc3M7IG90aGVyd2lzZSBmYWxzZS4KICAqKi8KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uTEJ1dHRvblVwKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLEZQREZfUEFHRSBwYWdlLCBpbnQgbW9kaWZpZXIsIGRvdWJsZSBwYWdlX3gsIGRvdWJsZSBwYWdlX3kpOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25MQnV0dG9uVXAoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV95KTsKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PblJCdXR0b25Eb3duKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV95KTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uUkJ1dHRvblVwKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSk7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKIC8qKgogICogRnVuY3Rpb246IEZPUk1fT25LZXlEb3duCiAgKiAgICAgICAgICBZb3UgY2FuIGNhbGwgdGhpcyBtZW1iZXIgZnVuY3Rpb24gd2hlbiBhIG5vbnN5c3RlbSBrZXkgaXMgcHJlc3NlZC4KICAqIFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieSBGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgotICogICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZSBmdW5jdGlvbi4KKyAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5CisgKkZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCisgKiAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlCisgKmZ1bmN0aW9uLgogICogICAgICAgICAgbktleUNvZGUgICAgLSAgIEluZGljYXRlcyB3aGV0aGVyIHZhcmlvdXMgdmlydHVhbCBrZXlzIGFyZSBkb3duLgotICogICAgICAgICAgbW9kaWZpZXIgICAgLSAgIENvbnRhaW5zIHRoZSBzY2FuIGNvZGUsIGtleS10cmFuc2l0aW9uIGNvZGUsIHByZXZpb3VzIGtleSBzdGF0ZSwgYW5kIGNvbnRleHQgY29kZS4KKyAqICAgICAgICAgIG1vZGlmaWVyICAgIC0gICBDb250YWlucyB0aGUgc2NhbiBjb2RlLCBrZXktdHJhbnNpdGlvbiBjb2RlLAorICpwcmV2aW91cyBrZXkgc3RhdGUsIGFuZCBjb250ZXh0IGNvZGUuCiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBUUlVFIGluZGljYXRlcyBzdWNjZXNzOyBvdGhlcndpc2UgZmFsc2UuCiAgKiovCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PbktleURvd24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUsRlBERl9QQUdFIHBhZ2UsIGludCBuS2V5Q29kZSwgaW50IG1vZGlmaWVyKTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uS2V5RG93bihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbktleUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyKTsKIAogLyoqCiAgKiBGdW5jdGlvbjogRk9STV9PbktleVVwCiAgKiAgICAgICAgICBZb3UgY2FuIGNhbGwgdGhpcyBtZW1iZXIgZnVuY3Rpb24gd2hlbiBhIG5vbnN5c3RlbSBrZXkgaXMgcmVsZWFzZWQuCiAgKiBQYXJhbWV0ZXJzOgotICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkgRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KLSAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCisgKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICpGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorICogICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorICpmdW5jdGlvbi4KICAqICAgICAgICAgIG5LZXlDb2RlICAgIC0gICBUaGUgdmlydHVhbC1rZXkgY29kZSBvZiB0aGUgZ2l2ZW4ga2V5LgotICogICAgICAgICAgbW9kaWZpZXIgICAgLSAgIENvbnRhaW5zIHRoZSBzY2FuIGNvZGUsIGtleS10cmFuc2l0aW9uIGNvZGUsIHByZXZpb3VzIGtleSBzdGF0ZSwgYW5kIGNvbnRleHQgY29kZS4KKyAqICAgICAgICAgIG1vZGlmaWVyICAgIC0gICBDb250YWlucyB0aGUgc2NhbiBjb2RlLCBrZXktdHJhbnNpdGlvbiBjb2RlLAorICpwcmV2aW91cyBrZXkgc3RhdGUsIGFuZCBjb250ZXh0IGNvZGUuCiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBUUlVFIGluZGljYXRlcyBzdWNjZXNzOyBvdGhlcndpc2UgZmFsc2UuCiAgKiovCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PbktleVVwKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLEZQREZfUEFHRSBwYWdlLCBpbnQgbktleUNvZGUsIGludCBtb2RpZmllcik7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PbktleVVwKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5LZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXIpOwogCiAvKioKICAqIEZ1bmN0aW9uOiBGT1JNX09uQ2hhcgotICogICAgICAgICAgWW91IGNhbiBjYWxsIHRoaXMgbWVtYmVyIGZ1bmN0aW9uIHdoZW4gYSBrZXlzdHJva2UgdHJhbnNsYXRlcyB0byBhIG5vbnN5c3RlbSBjaGFyYWN0ZXIuCisgKiAgICAgICAgICBZb3UgY2FuIGNhbGwgdGhpcyBtZW1iZXIgZnVuY3Rpb24gd2hlbiBhIGtleXN0cm9rZSB0cmFuc2xhdGVzIHRvIGEKKyAqbm9uc3lzdGVtIGNoYXJhY3Rlci4KICAqIFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieSBGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgotICogICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZSBmdW5jdGlvbi4KKyAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5CisgKkZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCisgKiAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlCisgKmZ1bmN0aW9uLgogICogICAgICAgICAgbkNoYXIgICAgICAgLSAgIFRoZSBjaGFyYWN0ZXIgY29kZSB2YWx1ZSBvZiB0aGUga2V5LgotICogICAgICAgICAgbW9kaWZpZXIgICAgLSAgIENvbnRhaW5zIHRoZSBzY2FuIGNvZGUsIGtleS10cmFuc2l0aW9uIGNvZGUsIHByZXZpb3VzIGtleSBzdGF0ZSwgYW5kIGNvbnRleHQgY29kZS4KKyAqICAgICAgICAgIG1vZGlmaWVyICAgIC0gICBDb250YWlucyB0aGUgc2NhbiBjb2RlLCBrZXktdHJhbnNpdGlvbiBjb2RlLAorICpwcmV2aW91cyBrZXkgc3RhdGUsIGFuZCBjb250ZXh0IGNvZGUuCiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBUUlVFIGluZGljYXRlcyBzdWNjZXNzOyBvdGhlcndpc2UgZmFsc2UuCiAgKiovCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PbkNoYXIoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsRlBERl9QQUdFIHBhZ2UsIGludCBuQ2hhciwgaW50IG1vZGlmaWVyKTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uQ2hhcihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyKTsKIAogLyoqCiAgKiBGdW5jdGlvbjogRk9STV9Gb3JjZVRvS2lsbEZvY3VzLgotICogICAgICAgICAgWW91IGNhbiBjYWxsIHRoaXMgbWVtYmVyIGZ1bmN0aW9uIHRvIGZvcmNlIHRvIGtpbGwgdGhlIGZvY3VzIG9mIHRoZSBmb3JtIGZpZWxkIHdoaWNoIGdvdCBmb2N1cy4KLSAqICAgICAgICAgIEl0IHdvdWxkIGtpbGwgdGhlIGZvY3VzIG9uIHRoZSBmb3JtIGZpZWxkLCBzYXZlIHRoZSB2YWx1ZSBvZiBmb3JtIGZpZWxkIGlmIGl0J3MgY2hhbmdlZCBieSB1c2VyLgorICogICAgICAgICAgWW91IGNhbiBjYWxsIHRoaXMgbWVtYmVyIGZ1bmN0aW9uIHRvIGZvcmNlIHRvIGtpbGwgdGhlIGZvY3VzIG9mIHRoZQorICpmb3JtIGZpZWxkIHdoaWNoIGdvdCBmb2N1cy4KKyAqICAgICAgICAgIEl0IHdvdWxkIGtpbGwgdGhlIGZvY3VzIG9uIHRoZSBmb3JtIGZpZWxkLCBzYXZlIHRoZSB2YWx1ZSBvZiBmb3JtCisgKmZpZWxkIGlmIGl0J3MgY2hhbmdlZCBieSB1c2VyLgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCisgKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICpGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgVFJVRSBpbmRpY2F0ZXMgc3VjY2Vzczsgb3RoZXJ3aXNlIGZhbHNlLgogICoqLwogRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fRm9yY2VUb0tpbGxGb2N1cyhGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSk7CiAKIC8vIEZpZWxkIFR5cGVzCi0jZGVmaW5lIEZQREZfRk9STUZJRUxEX1VOS05PV04gICAgICAwICAgICAgIC8vIFVua25vd24uCi0jZGVmaW5lIEZQREZfRk9STUZJRUxEX1BVU0hCVVRUT04gICAxICAgICAgIC8vIHB1c2ggYnV0dG9uIHR5cGUuCi0jZGVmaW5lIEZQREZfRk9STUZJRUxEX0NIRUNLQk9YICAgICAyICAgICAgIC8vIGNoZWNrIGJveCB0eXBlLgotI2RlZmluZSBGUERGX0ZPUk1GSUVMRF9SQURJT0JVVFRPTiAgMyAgICAgICAvLyByYWRpbyBidXR0b24gdHlwZS4KLSNkZWZpbmUgRlBERl9GT1JNRklFTERfQ09NQk9CT1ggICAgIDQgICAgICAgLy8gY29tYm8gYm94IHR5cGUuCi0jZGVmaW5lIEZQREZfRk9STUZJRUxEX0xJU1RCT1ggICAgICA1ICAgICAgIC8vIGxpc3QgYm94IHR5cGUuCi0jZGVmaW5lIEZQREZfRk9STUZJRUxEX1RFWFRGSUVMRCAgICA2ICAgICAgIC8vIHRleHQgZmllbGQgdHlwZS4KKyNkZWZpbmUgRlBERl9GT1JNRklFTERfVU5LTk9XTiAwICAgICAgLy8gVW5rbm93bi4KKyNkZWZpbmUgRlBERl9GT1JNRklFTERfUFVTSEJVVFRPTiAxICAgLy8gcHVzaCBidXR0b24gdHlwZS4KKyNkZWZpbmUgRlBERl9GT1JNRklFTERfQ0hFQ0tCT1ggMiAgICAgLy8gY2hlY2sgYm94IHR5cGUuCisjZGVmaW5lIEZQREZfRk9STUZJRUxEX1JBRElPQlVUVE9OIDMgIC8vIHJhZGlvIGJ1dHRvbiB0eXBlLgorI2RlZmluZSBGUERGX0ZPUk1GSUVMRF9DT01CT0JPWCA0ICAgICAvLyBjb21ibyBib3ggdHlwZS4KKyNkZWZpbmUgRlBERl9GT1JNRklFTERfTElTVEJPWCA1ICAgICAgLy8gbGlzdCBib3ggdHlwZS4KKyNkZWZpbmUgRlBERl9GT1JNRklFTERfVEVYVEZJRUxEIDYgICAgLy8gdGV4dCBmaWVsZCB0eXBlLgorI2lmZGVmIFBERl9FTkFCTEVfWEZBCisjZGVmaW5lIEZQREZfRk9STUZJRUxEX1hGQSA3ICAgICAgICAgIC8vIHRleHQgZmllbGQgdHlwZS4KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworLyoqCisgKiBGdW5jdGlvbjogRlBERlBhZ2VfSGFzRm9ybUZpZWxkQXRQb2ludAorICogICAgIEdldCB0aGUgZm9ybSBmaWVsZCB0eXBlIGJ5IHBvaW50LgorICogUGFyYW1ldGVyczoKKyAqICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICogICAgICAgICAgICAgICAgICAgICBGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50KCkuCisgKiAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZSgpLgorICogICAgIHBhZ2VfeCAgICAgIC0gICBYIHBvc2l0aW9uIGluIFBERiAidXNlciBzcGFjZSIuCisgKiAgICAgcGFnZV95ICAgICAgLSAgIFkgcG9zaXRpb24gaW4gUERGICJ1c2VyIHNwYWNlIi4KKyAqIFJldHVybiBWYWx1ZToKKyAqICAgICBSZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGZvcm0gZmllbGQ7IC0xIGluZGljYXRlcyBubyBmaWVsZC4KKyAqICAgICBTZWUgZmllbGQgdHlwZXMgYWJvdmUuCisgKiovCitETExFWFBPUlQgaW50IFNURENBTEwgRlBERlBhZ2VfSGFzRm9ybUZpZWxkQXRQb2ludChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpOwogCiAvKioKICAqIEZ1bmN0aW9uOiBGUERQYWdlX0hhc0Zvcm1GaWVsZEF0UG9pbnQKLSAqICAgICAgICAgIENoZWNrIHRoZSBmb3JtIGZpbGVkIHBvc2l0aW9uIGJ5IHBvaW50LgotICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCi0gKiAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgotICogICAgICAgICAgcGFnZV94ICAgICAgLSAgIFggcG9zaXRpb24gaW4gUERGICJ1c2VyIHNwYWNlIi4KLSAqICAgICAgICAgIHBhZ2VfeSAgICAgIC0gICBZIHBvc2l0aW9uIGluIFBERiAidXNlciBzcGFjZSIuCi0gKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAgICAgICBSZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGZvcm1maWxlZDsgLTEgaW5kaWNhdGVzIG5vIGZpZWxkcy4KKyAqICAgICBERVBSRUNBVEVELiBQbGVhc2UgdXNlIEZQREZQYWdlX0hhc0Zvcm1GaWVsZEF0UG9pbnQuCiAgKiovCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBEUGFnZV9IYXNGb3JtRmllbGRBdFBvaW50KEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLEZQREZfUEFHRSBwYWdlLGRvdWJsZSBwYWdlX3gsIGRvdWJsZSBwYWdlX3kpOworRExMRVhQT1JUIGludCBTVERDQUxMIEZQRFBhZ2VfSGFzRm9ybUZpZWxkQXRQb2ludChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpOworCisvKioKKyAqIEZ1bmN0aW9uOiBGUERGUGFnZV9Gb3JtRmllbGRaT3JkZXJBdFBvaW50CisgKiAgICAgR2V0IHRoZSBmb3JtIGZpZWxkIHotb3JkZXIgYnkgcG9pbnQuCisgKiBQYXJhbWV0ZXJzOgorICogICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgIEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQoKS4KKyAqICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlKCkuCisgKiAgICAgcGFnZV94ICAgICAgLSAgIFggcG9zaXRpb24gaW4gUERGICJ1c2VyIHNwYWNlIi4KKyAqICAgICBwYWdlX3kgICAgICAtICAgWSBwb3NpdGlvbiBpbiBQREYgInVzZXIgc3BhY2UiLgorICogUmV0dXJuIFZhbHVlOgorICogICAgIFJldHVybiB0aGUgei1vcmRlciBvZiB0aGUgZm9ybSBmaWVsZDsgLTEgaW5kaWNhdGVzIG5vIGZpZWxkLgorICogICAgIEhpZ2hlciBudW1iZXJzIGFyZSBjbG9zZXIgdG8gdGhlIGZyb250LgorICoqLworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZQYWdlX0Zvcm1GaWVsZFpPcmRlckF0UG9pbnQoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV95KTsKIAogLyoqCiAgKiBGdW5jdGlvbjogRlBERl9TZXRGb3JtRmllbGRIaWdobGlnaHRDb2xvcgotICogICAgICAgICAgU2V0IHRoZSBoaWdobGlnaHQgY29sb3Igb2Ygc3BlY2lmaWVkIG9yIGFsbCB0aGUgZm9ybSBmaWVsZHMgaW4gdGhlIGRvY3VtZW50LgorICogICAgICAgICAgU2V0IHRoZSBoaWdobGlnaHQgY29sb3Igb2Ygc3BlY2lmaWVkIG9yIGFsbCB0aGUgZm9ybSBmaWVsZHMgaW4gdGhlCisgKmRvY3VtZW50LgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5IEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQuCi0gKiAgICAgICAgICBkb2MgICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCi0gKiAgICAgICAgICBmaWVsZFR5cGUgICAtICAgQSAzMi1iaXQgaW50ZWdlciBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGEgZm9ybSBmaWVsZChkZWZpbmVkIGFib3ZlKS4KLSAqICAgICAgICAgIGNvbG9yICAgICAgIC0gICBUaGUgaGlnaGxpZ2h0IGNvbG9yIG9mIHRoZSBmb3JtIGZpZWxkLkNvbnN0cnVjdGVkIGJ5IDB4eHhycmdnYmIuCisgKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieQorICpGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorICogICAgICAgICAgZG9jICAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQuIFJldHVybmVkIGJ5CisgKkZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgorICogICAgICAgICAgZmllbGRUeXBlICAgLSAgIEEgMzItYml0IGludGVnZXIgaW5kaWNhdGluZyB0aGUgdHlwZSBvZiBhIGZvcm0KKyAqZmllbGQoZGVmaW5lZCBhYm92ZSkuCisgKiAgICAgICAgICBjb2xvciAgICAgICAtICAgVGhlIGhpZ2hsaWdodCBjb2xvciBvZiB0aGUgZm9ybSBmaWVsZC5Db25zdHJ1Y3RlZCBieQorICoweHh4cnJnZ2JiLgogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTk9ORS4KICAqIENvbW1lbnRzOgotICogICAgICAgICAgV2hlbiB0aGUgcGFyYW1ldGVyIGZpZWxkVHlwZSBpcyBzZXQgdG8gemVybywgdGhlIGhpZ2hsaWdodCBjb2xvciB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIHRoZSBmb3JtIGZpZWxkcyBpbiB0aGUKKyAqICAgICAgICAgIFdoZW4gdGhlIHBhcmFtZXRlciBmaWVsZFR5cGUgaXMgc2V0IHRvIHplcm8sIHRoZSBoaWdobGlnaHQgY29sb3IKKyAqd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCB0aGUgZm9ybSBmaWVsZHMgaW4gdGhlCiAgKiAgICAgICAgICBkb2N1bWVudC4KLSAqICAgICAgICAgIFBsZWFzZSByZWZyZXNoIHRoZSBjbGllbnQgd2luZG93IHRvIHNob3cgdGhlIGhpZ2hsaWdodCBpbW1lZGlhdGVseSBpZiBuZWNlc3NhcnkuCisgKiAgICAgICAgICBQbGVhc2UgcmVmcmVzaCB0aGUgY2xpZW50IHdpbmRvdyB0byBzaG93IHRoZSBoaWdobGlnaHQgaW1tZWRpYXRlbHkKKyAqaWYgbmVjZXNzYXJ5LgogICoqLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1NldEZvcm1GaWVsZEhpZ2hsaWdodENvbG9yKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLCBpbnQgZmllbGRUeXBlLCB1bnNpZ25lZCBsb25nIGNvbG9yKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9TZXRGb3JtRmllbGRIaWdobGlnaHRDb2xvcihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgY29sb3IpOwogCiAvKioKICAqIEZ1bmN0aW9uOiBGUERGX1NldEZvcm1GaWVsZEhpZ2hsaWdodEFscGhhCi0gKiAgICAgICAgICBTZXQgdGhlIHRyYW5zcGFyZW5jeSBvZiB0aGUgZm9ybSBmaWVsZCBoaWdobGlnaHQgY29sb3IgaW4gdGhlIGRvY3VtZW50LgorICogICAgICAgICAgU2V0IHRoZSB0cmFuc3BhcmVuY3kgb2YgdGhlIGZvcm0gZmllbGQgaGlnaGxpZ2h0IGNvbG9yIGluIHRoZQorICpkb2N1bWVudC4KICAqIFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieSBGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgotICogICAgICAgICAgZG9jICAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgotICogICAgICAgICAgYWxwaGEgICAgICAgLSAgIFRoZSB0cmFuc3BhcmVuY3kgb2YgdGhlIGZvcm0gZmllbGQgaGlnaGxpZ2h0IGNvbG9yLiBiZXR3ZWVuIDAtMjU1LgorICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkKKyAqRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KKyAqICAgICAgICAgIGRvYyAgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGRvY3VtZW50LiBSZXR1cm5lZCBieQorICpGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KKyAqICAgICAgICAgIGFscGhhICAgICAgIC0gICBUaGUgdHJhbnNwYXJlbmN5IG9mIHRoZSBmb3JtIGZpZWxkIGhpZ2hsaWdodCBjb2xvci4KKyAqYmV0d2VlbiAwLTI1NS4KICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIE5PTkUuCiAgKiovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfU2V0Rm9ybUZpZWxkSGlnaGxpZ2h0QWxwaGEoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsIHVuc2lnbmVkIGNoYXIgYWxwaGEpOwotCitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfU2V0Rm9ybUZpZWxkSGlnaGxpZ2h0QWxwaGEoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBhbHBoYSk7CiAKIC8qKgogICogRnVuY3Rpb246IEZQREZfUmVtb3ZlRm9ybUZpZWxkSGlnaGxpZ2h0CiAgKiAgICAgICAgICBSZW1vdmUgdGhlIGZvcm0gZmllbGQgaGlnaGxpZ2h0IGNvbG9yIGluIHRoZSBkb2N1bWVudC4KICAqIFBhcmFtZXRlcnM6Ci0gKiAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieSBGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkKKyAqRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIE5PTkUuCiAgKiBDb21tZW50czoKLSAqICAgICAgICAgIFBsZWFzZSByZWZyZXNoIHRoZSBjbGllbnQgd2luZG93IHRvIHJlbW92ZSB0aGUgaGlnaGxpZ2h0IGltbWVkaWF0ZWx5IGlmIG5lY2Vzc2FyeS4KKyAqICAgICAgICAgIFBsZWFzZSByZWZyZXNoIHRoZSBjbGllbnQgd2luZG93IHRvIHJlbW92ZSB0aGUgaGlnaGxpZ2h0IGltbWVkaWF0ZWx5CisgKmlmIG5lY2Vzc2FyeS4KICAqKi8KIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9SZW1vdmVGb3JtRmllbGRIaWdobGlnaHQoRlBERl9GT1JNSEFORExFIGhIYW5kbGUpOwogCkBAIC04MDYsMjcgKzE0MzIsMjYxIEBACiAqIEZ1bmN0aW9uOiBGUERGX0ZGTERyYXcKICogICAgICAgICAgIFJlbmRlciBGb3JtRmVpbGRzIG9uIGEgcGFnZSB0byBhIGRldmljZSBpbmRlcGVuZGVudCBiaXRtYXAuCiAqIFBhcmFtZXRlcnM6Ci0qICAgICAgICAgICBoSGFuZGxlICAgICAtICAgSGFuZGxlIHRvIHRoZSBmb3JtIGZpbGwgbW9kdWxlLiBSZXR1cm5lZCBieSBGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgotKiAgICAgICAgICAgYml0bWFwICAgICAgLSAgIEhhbmRsZSB0byB0aGUgZGV2aWNlIGluZGVwZW5kZW50IGJpdG1hcCAoYXMgdGhlIG91dHB1dCBidWZmZXIpLgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBoYW5kbGUgY2FuIGJlIGNyZWF0ZWQgYnkgRlBERkJpdG1hcF9DcmVhdGUgZnVuY3Rpb24uCi0qICAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgotKiAgICAgICAgICAgc3RhcnRfeCAgICAgLSAgIExlZnQgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgZGV2aWNlIGNvb3JkaW5hdGUuCi0qICAgICAgICAgICBzdGFydF95ICAgICAtICAgVG9wIHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IGFyZWEgaW4gdGhlIGRldmljZSBjb29yZGluYXRlLgorKiAgICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkKKypGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorKiAgICAgICAgICAgYml0bWFwICAgICAgLSAgIEhhbmRsZSB0byB0aGUgZGV2aWNlIGluZGVwZW5kZW50IGJpdG1hcCAoYXMgdGhlCisqb3V0cHV0IGJ1ZmZlcikuCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwIGhhbmRsZSBjYW4gYmUgY3JlYXRlZCBieSBGUERGQml0bWFwX0NyZWF0ZQorKmZ1bmN0aW9uLgorKiAgICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorKmZ1bmN0aW9uLgorKiAgICAgICAgICAgc3RhcnRfeCAgICAgLSAgIExlZnQgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUKKypkZXZpY2UgY29vcmRpbmF0ZS4KKyogICAgICAgICAgIHN0YXJ0X3kgICAgIC0gICBUb3AgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgZGV2aWNlCisqY29vcmRpbmF0ZS4KICogICAgICAgICAgIHNpemVfeCAgICAgIC0gICBIb3Jpem9udGFsIHNpemUgKGluIHBpeGVscykgZm9yIGRpc3BsYXlpbmcgdGhlIHBhZ2UuCiAqICAgICAgICAgICBzaXplX3kgICAgICAtICAgVmVydGljYWwgc2l6ZSAoaW4gcGl4ZWxzKSBmb3IgZGlzcGxheWluZyB0aGUgcGFnZS4KLSogICAgICAgICAgIHJvdGF0ZSAgICAgIC0gICBQYWdlIG9yaWVudGF0aW9uOiAwIChub3JtYWwpLCAxIChyb3RhdGVkIDkwIGRlZ3JlZXMgY2xvY2t3aXNlKSwKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAocm90YXRlZCAxODAgZGVncmVlcyksIDMgKHJvdGF0ZWQgOTAgZGVncmVlcyBjb3VudGVyLWNsb2Nrd2lzZSkuCi0qICAgICAgICAgICBmbGFncyAgICAgICAtICAgMCBmb3Igbm9ybWFsIGRpc3BsYXksIG9yIGNvbWJpbmF0aW9uIG9mIGZsYWdzIGRlZmluZWQgYWJvdmUuCisqICAgICAgICAgICByb3RhdGUgICAgICAtICAgUGFnZSBvcmllbnRhdGlvbjogMCAobm9ybWFsKSwgMSAocm90YXRlZCA5MCBkZWdyZWVzCisqY2xvY2t3aXNlKSwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAocm90YXRlZCAxODAgZGVncmVlcyksIDMgKHJvdGF0ZWQgOTAgZGVncmVlcworKmNvdW50ZXItY2xvY2t3aXNlKS4KKyogICAgICAgICAgIGZsYWdzICAgICAgIC0gICAwIGZvciBub3JtYWwgZGlzcGxheSwgb3IgY29tYmluYXRpb24gb2YgZmxhZ3MKKypkZWZpbmVkIGFib3ZlLgogKiBSZXR1cm4gVmFsdWU6CiAqICAgICAgICAgICBOb25lLgogKiBDb21tZW50czoKLSogICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIHRvIG9ubHkgcmVuZGVyIGFubm90YXRpb25zIGFuZCBGb3JtRmllbGRzIG9uIHRoZSBwYWdlLgotKiAgICAgICAgICAgV2l0aG91dCBGUERGX0FOTk9UIHNwZWNpZmllZCBmb3IgZmxhZ3MsIFJlbmRlcmluZyBmdW5jdGlvbnMgc3VjaCBhcyBGUERGX1JlbmRlclBhZ2VCaXRtYXAgb3IgRlBERl9SZW5kZXJQYWdlQml0bWFwX1N0YXJ0IHdpbGwgb25seSByZW5kZXIgcGFnZSBjb250ZW50cyh3aXRob3V0IGFubm90YXRpb25zKSB0byBhIGJpdG1hcC4KLSogICAgICAgICAgIEluIG9yZGVyIHRvIGltcGxlbWVudCB0aGUgRm9ybUZpbGwgZnVuY3Rpb25zLEltcGxlbWVudGF0aW9uIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIGFmdGVyIHJlbmRlcmluZyBmdW5jdGlvbnMgZmluaXNoIHJlbmRlcmluZyB0aGUgcGFnZSBjb250ZW50cy4KKyogICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIHRvIG9ubHkgcmVuZGVyIGFubm90YXRpb25zIGFuZCBGb3JtRmllbGRzIG9uCisqdGhlIHBhZ2UuCisqICAgICAgICAgICBXaXRob3V0IEZQREZfQU5OT1Qgc3BlY2lmaWVkIGZvciBmbGFncywgUmVuZGVyaW5nIGZ1bmN0aW9ucyBzdWNoIGFzCisqRlBERl9SZW5kZXJQYWdlQml0bWFwIG9yIEZQREZfUmVuZGVyUGFnZUJpdG1hcF9TdGFydCB3aWxsIG9ubHkgcmVuZGVyIHBhZ2UKKypjb250ZW50cyh3aXRob3V0IGFubm90YXRpb25zKSB0byBhIGJpdG1hcC4KKyogICAgICAgICAgIEluIG9yZGVyIHRvIGltcGxlbWVudCB0aGUgRm9ybUZpbGwgZnVuY3Rpb25zLEltcGxlbWVudGF0aW9uIHNob3VsZAorKmNhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucyBmaW5pc2ggcmVuZGVyaW5nIHRoZSBwYWdlIGNvbnRlbnRzLgogKiovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfRkZMRHJhdyhGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSxGUERGX0JJVE1BUCBiaXRtYXAsIEZQREZfUEFHRSBwYWdlLCBpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LCBpbnQgc2l6ZV95LCBpbnQgcm90YXRlLCBpbnQgZmxhZ3MpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0ZGTERyYXcoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JJVE1BUCBiaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpOwogCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKy8qKgorICogRnVuY3Rpb246IEZQREZfSGFzWEZBRmllbGQKKyAqICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIHRvIGNoZWNrIHdoZXRoZXIgYSBwZGYgZG9jdW1lbnQKKyAqaGFzIFhGQSBmaWVsZHMuCisgKiBQYXJhbWV0ZXJzOgorICogICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQgICAgICAgICAgICAgICAgLSAgICAgICBIYW5kbGUgdG8gZG9jdW1lbnQuCisgKlJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgorICogICAgICAgICAgICAgICAgICAgICAgZG9jVHlwZSAgICAgICAgICAgICAgICAgLSAgICAgICBEb2N1bWVudCB0eXBlIGRlZmluZWQgYXMKKyAqRE9DVFlQRV94eHguCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAgICAgICAgICAgICAgICAgICBUUlVFIGluZGljYXRlcyB0aGF0IHRoZSBpbnB1dCBkb2N1bWVudCBoYXMgWEZBIGZpZWxkcywKKyAqb3RoZXJ3aXNlIEZBTFNFLgorICoqLworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfSGFzWEZBRmllbGQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZG9jVHlwZSk7CisKKy8qKgorICogRnVuY3Rpb246IEZQREZfTG9hZFhGQQorICogICAgICAgICAgSWYgdGhlIGRvY3VtZW50IGNvbnNpc3RzIG9mIFhGQSBmaWVsZHMsIHRoZXJlIHNob3VsZCBjYWxsIHRoaXMKKyAqbWV0aG9kIHRvIGxvYWQgWEZBIGZpZWxkcy4KKyAqIFBhcmFtZXRlcnM6CisgKiAgICAgICAgICBkb2N1bWVudCAgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkKKyAqRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAgICAgICBUUlVFIGluZGljYXRlcyBzdWNjZXNzLG90aGVyd2lzZSBGQUxTRS4KKyAqKi8KK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX0xvYWRYRkEoRlBERl9ET0NVTUVOVCBkb2N1bWVudCk7CisKKy8qKgorICogRnVuY3Rpb246IEZQREZfV2lkZ2V0X1VuZG8KKyAqICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgaW1wbGVtZW50IHRoZSB1bmRvIGZlYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQgeGZhCisgKmZpZWxkLgorICogUGFyYW1ldGVyczoKKyAqICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieQorICpGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KKyAqICAgICAgICAgIGhXaWRnZXQgICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSB4ZmEgZmllbGQuCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAgICAgICBOb25lLgorICoqLworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9VbmRvKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURHRVQgaFdpZGdldCk7CisvKioKKyAqIEZ1bmN0aW9uOiBGUERGX1dpZGdldF9SZWRvCisgKiAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGltcGxlbWVudCB0aGUgcmVkbyBmZWF0dXJlIGZvciB0aGUgc3BlY2lmaWVkIHhmYQorICpmaWVsZC4KKyAqIFBhcmFtZXRlcnM6CisgKiAgICAgICAgICBkb2N1bWVudCAgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkKKyAqRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCisgKiAgICAgICAgICBoV2lkZ2V0ICAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgeGZhIGZpZWxkLgorICogUmV0dXJuIFZhbHVlOgorICogICAgICAgICAgTm9uZS4KKyAqKi8KK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfUmVkbyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQpOworLyoqCisgKiBGdW5jdGlvbjogRlBERl9XaWRnZXRfU2VsZWN0QWxsCisgKiAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGltcGxlbWVudCB0aGUgc2VsZWN0IGFsbCBmZWF0dXJlIGZvciB0aGUgc3BlY2lmaWVkCisgKnhmYSBmaWVsZC4KKyAqIFBhcmFtZXRlcnM6CisgKiAgICAgICAgICBkb2N1bWVudCAgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkKKyAqRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCisgKiAgICAgICAgICBoV2lkZ2V0ICAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgeGZhIGZpZWxkLgorICogUmV0dXJuIFZhbHVlOgorICogICAgICAgICAgTm9uZS4KKyAqKi8KK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfU2VsZWN0QWxsKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREdFVCBoV2lkZ2V0KTsKKy8qKgorICogRnVuY3Rpb246IEZQREZfV2lkZ2V0X0NvcHkKKyAqICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgaW1wbGVtZW50IHRoZSBjb3B5IGZlYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQgeGZhCisgKmZpZWxkLgorICogUGFyYW1ldGVyczoKKyAqICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieQorICpGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KKyAqICAgICAgICAgIGhXaWRnZXQgICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSB4ZmEgZmllbGQuCisgKiAgICAgICAgICB3c1RleHQgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgY29waWVkCisgKmRhdGEsIGluIFVURi0xNkxFIGZvcm1hdC4KKyAqICAgICAgICAgIHNpemUgICAgICAgICAgICAtICAgVGhlIGRhdGEgYnVmZmVyIHNpemUuCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAgICAgICBOb25lLgorICoqLworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9Db3B5KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURHRVQgaFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgd3NUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQqIHNpemUpOworLyoqCisgKiBGdW5jdGlvbjogRlBERl9XaWRnZXRfQ3V0CisgKiAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGltcGxlbWVudCB0aGUgY3V0IGZlYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQgeGZhCisgKmZpZWxkLgorICogUGFyYW1ldGVyczoKKyAqICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieQorICpGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KKyAqICAgICAgICAgIGhXaWRnZXQgICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSB4ZmEgZmllbGQuCisgKiAgICAgICAgICB3c1RleHQgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgY3V0CisgKmRhdGEsaW4gVVRGLTE2TEUgZm9ybWF0LgorICogICAgICAgICAgc2l6ZSAgICAgICAgICAgIC0gICBUaGUgZGF0YSBidWZmZXIgc2l6ZSxub3QgdGhlIGJ5dGUgbnVtYmVyLgorICogUmV0dXJuIFZhbHVlOgorICogICAgICAgICAgTm9uZS4KKyAqKi8KK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfQ3V0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREdFVCBoV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHdzVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQqIHNpemUpOworLyoqCisgKiBGdW5jdGlvbjogRlBERl9XaWRnZXRfUGFzdGUKKyAqICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgaW1wbGVtZW50IHRoZSBwYXN0ZSBmZWF0dXJlIGZvciB0aGUgc3BlY2lmaWVkIHhmYQorICpmaWVsZC4KKyAqIFBhcmFtZXRlcnM6CisgKiAgICAgICAgICBkb2N1bWVudCAgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkKKyAqRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCisgKiAgICAgICAgICBoV2lkZ2V0ICAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgeGZhIGZpZWxkLgorICogICAgICAgICAgd3NUZXh0ICAgICAgICAgIC0gICBUaGUgcGFzdGUgdGV4dCBidWZmZXIsIGluIFVURi0xNkxFIGZvcm1hdC4KKyAqICAgICAgICAgIHNpemUgICAgICAgICAgICAtICAgVGhlIGRhdGEgYnVmZmVyIHNpemUsbm90IHRoZSBieXRlIG51bWJlci4KKyAqIFJldHVybiBWYWx1ZToKKyAqICAgICAgICAgIE5vbmUuCisgKiovCitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfV2lkZ2V0X1Bhc3RlKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyB3c1RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQgc2l6ZSk7CisvKioKKyAqIEZ1bmN0aW9uOiBGUERGX1dpZGdldF9SZXBsYWNlU3BlbGxDaGVja1dvcmQKKyAqICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgaW1wbGVtZW50IHRoZSBzcGVsbCBjaGVjayBmZWF0dXJlIGZvciB0aGUgc3BlY2lmaWVkCisgKnhmYSBmaWVsZC4KKyAqIFBhcmFtZXRlcnM6CisgKiAgICAgICAgICBkb2N1bWVudCAgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkKKyAqRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCisgKiAgICAgICAgICBoV2lkZ2V0ICAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgeGZhIGZpZWxkLgorICogICAgICAgICAgeCAgICAgICAgICAgICAgIC0gICBUaGUgeCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBvaW50LgorICogICAgICAgICAgeSAgICAgICAgICAgICAgIC0gICBUaGUgeSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBvaW50LgorICogICAgICAgICAgYnNUZXh0ICAgICAgICAgIC0gICBUaGUgdGV4dCBidWZmZXIgbmVlZGVkIHRvIGJlIHNwZWNrIGNoZWNrLCBpbgorICpVVEYtMTZMRSBmb3JtYXQuCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAgICAgICBOb25lLgorICoqLworRExMRVhQT1JUIHZvaWQgU1REQ0FMTAorRlBERl9XaWRnZXRfUmVwbGFjZVNwZWxsQ2hlY2tXb3JkKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURHRVQgaFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIGJzVGV4dCk7CisvKioKKyAqIEZ1bmN0aW9uOiBGUERGX1dpZGdldF9HZXRTcGVsbENoZWNrV29yZHMKKyAqICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgaW1wbGVtZW50IHRoZSBzcGVsbCBjaGVjayBmZWF0dXJlIGZvciB0aGUgc3BlY2lmaWVkCisgKnhmYSBmaWVsZC4KKyAqIFBhcmFtZXRlcnM6CisgKiAgICAgICAgICBkb2N1bWVudCAgICAgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkKKyAqRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCisgKiAgICAgICAgICBoV2lkZ2V0ICAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgeGZhIGZpZWxkLgorICogICAgICAgICAgeCAgICAgICAgICAgICAgIC0gICBUaGUgeCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBvaW50LgorICogICAgICAgICAgeSAgICAgICAgICAgICAgIC0gICBUaGUgeSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBvaW50LgorICogICAgICAgICAgc3RyaW5nSGFuZGxlICAgIC0gICBQb2ludGVyIHRvIEZQREZfU1RSSU5HSEFORExFIHRvIHJlY2VpdmUgdGhlCisgKnNwZWNrIGNoZWNrIHRleHQgYnVmZmVyLCBpbiBVVEYtMTZMRSBmb3JtYXQuCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAgICAgICBOb25lLgorICoqLworRExMRVhQT1JUIHZvaWQgU1REQ0FMTAorRlBERl9XaWRnZXRfR2V0U3BlbGxDaGVja1dvcmRzKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURHRVQgaFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9TVFJJTkdIQU5ETEUqIHN0cmluZ0hhbmRsZSk7CisvKioKKyAqIEZ1bmN0aW9uOiBGUERGX1N0cmluZ0hhbmRsZUNvdW50cworICogICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBnZXQgdGhlIGNvdW50IG9mIHRoZSB0ZXh0IGJ1ZmZlci4KKyAqIFBhcmFtZXRlcnM6CisgKiAgICAgICAgICBzdHJpbmdIYW5kbGUgICAgLSAgIFBvaW50ZXIgdG8gRlBERl9TVFJJTkdIQU5ETEUuCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAgICAgICBOb25lLgorICoqLworRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfU3RyaW5nSGFuZGxlQ291bnRzKEZQREZfU1RSSU5HSEFORExFIHN0cmluZ0hhbmRsZSk7CisvKioKKyAqIEZ1bmN0aW9uOiBGUERGX1N0cmluZ0hhbmRsZUdldFN0cmluZ0J5SW5kZXgKKyAqICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgZ2V0IHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhlIHRleHQgYnVmZmVyLgorICogUGFyYW1ldGVyczoKKyAqICAgICAgICAgIHN0cmluZ0hhbmRsZSAgICAtICAgUG9pbnRlciB0byBGUERGX1NUUklOR0hBTkRMRS4KKyAqICAgICAgICAgIGluZGV4ICAgICAgICAgICAtICAgVGhlIHNwZWNpZmllZCBpbmRleCBvZiB0ZXh0IGJ1ZmZlci4KKyAqICAgICAgICAgIGJzVGV4dCAgICAgICAgICAtICAgUG9pbnRlciB0byBkYXRhIGJ1ZmZlciB0byByZWNlaXZlIHRoZSB0ZXh0CisgKmJ1ZmZlciwgaW4gVVRGLTE2TEUgZm9ybWF0LgorICogICAgICAgICAgc2l6ZSAgICAgICAgICAgIC0gICBUaGUgYnl0ZSBzaXplIG9mIGRhdGEgYnVmZmVyLgorICogUmV0dXJuIFZhbHVlOgorICogICAgICAgICAgVFJVRSBpbmRpY2F0ZXMgc3VjY2Vzcywgb3RoZXJ3aXNlIEZBTFNFLgorICoqLworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMCitGUERGX1N0cmluZ0hhbmRsZUdldFN0cmluZ0J5SW5kZXgoRlBERl9TVFJJTkdIQU5ETEUgc3RyaW5nSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgYnNUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQqIHNpemUpOworLyoqCisgKiBGdW5jdGlvbjogRlBERl9TdHJpbmdIYW5kbGVSZWxlYXNlCisgKiAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIHJlbGVhc2UgdGhlIEZQREZfU1RSSU5HSEFORExFLgorICogUGFyYW1ldGVyczoKKyAqICAgICAgICAgIHN0cmluZ0hhbmRsZSAgICAtICAgUG9pbnRlciB0byBGUERGX1NUUklOR0hBTkRMRS4KKyAqIFJldHVybiBWYWx1ZToKKyAqICAgICAgICAgIE5vbmUuCisgKiovCitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfU3RyaW5nSGFuZGxlUmVsZWFzZShGUERGX1NUUklOR0hBTkRMRSBzdHJpbmdIYW5kbGUpOworLyoqCisgKiBGdW5jdGlvbjogRlBERl9TdHJpbmdIYW5kbGVBZGRTdHJpbmcKKyAqICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgYWRkIHRoZSBzcGVjaWZpZWQgdGV4dCBidWZmZXIuCisgKiBQYXJhbWV0ZXJzOgorICogICAgICAgICAgc3RyaW5nSGFuZGxlICAgIC0gICBQb2ludGVyIHRvIEZQREZfU1RSSU5HSEFORExFLgorICogICAgICAgICAgYnNUZXh0ICAgICAgICAgIC0gICBQb2ludGVyIHRvIGRhdGEgYnVmZmVyIG9mIHRoZSB0ZXh0IGJ1ZmZlciwgaW4KKyAqVVRGLTE2TEUgZm9ybWF0LgorICogICAgICAgICAgc2l6ZSAgICAgICAgICAgIC0gICBUaGUgYnl0ZSBzaXplIG9mIGRhdGEgYnVmZmVyLgorICogUmV0dXJuIFZhbHVlOgorICogICAgICAgICAgVFJVRSBpbmRpY2F0ZXMgc3VjY2Vzcywgb3RoZXJ3aXNlIEZBTFNFLgorICoqLworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMCitGUERGX1N0cmluZ0hhbmRsZUFkZFN0cmluZyhGUERGX1NUUklOR0hBTkRMRSBzdHJpbmdIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgYnNUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBzaXplKTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9wdWJsaWMvZnBkZl9md2xldmVudC5oIGIvcHVibGljL2ZwZGZfZndsZXZlbnQuaAppbmRleCBmYTRmMTQ0Li4yMmMwMWU0IDEwMDY0NAotLS0gYS9wdWJsaWMvZnBkZl9md2xldmVudC5oCisrKyBiL3B1YmxpYy9mcGRmX2Z3bGV2ZW50LmgKQEAgLTEzLDkwICsxMyw4NCBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAotdHlwZWRlZiBpbnQgICAgICAgICBGUERGX0lOVDMyOwordHlwZWRlZiBpbnQgRlBERl9JTlQzMjsKIHR5cGVkZWYgdW5zaWduZWQgaW50IEZQREZfVUlOVDMyOwotdHlwZWRlZiBmbG9hdCAgICAgICBGUERGX0ZMT0FUOwotLy9ldmVudCB0eXBlCi10eXBlZGVmIGVudW0KLXsKLSAgICBGV0xfRVZFTlRUWVBFX01vdXNlID0gMCAsCi0gICAgRldMX0VWRU5UVFlQRV9Nb3VzZVdoZWVsLAotICAgIEZXTF9FVkVOVFRZUEVfS2V5ICAgICAgICwKK3R5cGVkZWYgZmxvYXQgRlBERl9GTE9BVDsKKy8vIGV2ZW50IHR5cGUKK3R5cGVkZWYgZW51bSB7CisgIEZXTF9FVkVOVFRZUEVfTW91c2UgPSAwLAorICBGV0xfRVZFTlRUWVBFX01vdXNlV2hlZWwsCisgIEZXTF9FVkVOVFRZUEVfS2V5LAogfSBGV0xfRVZFTlRUWVBFOwogCi0vL2tleSBmbGFnCi10eXBlZGVmIGVudW0KLXsKLSAgICBGV0xfRVZFTlRGTEFHX1NoaWZ0S2V5ICAgICAgICAgID0gMSA8PCAwLAotICAgIEZXTF9FVkVOVEZMQUdfQ29udHJvbEtleSAgICAgICAgPSAxIDw8IDEsCi0gICAgRldMX0VWRU5URkxBR19BbHRLZXkgICAgICAgICAgICA9IDEgPDwgMiwKLSAgICBGV0xfRVZFTlRGTEFHX01ldGFLZXkgICAgICAgICAgID0gMSA8PCAzLAotICAgIEZXTF9FVkVOVEZMQUdfS2V5UGFkICAgICAgICAgICAgPSAxIDw8IDQsCi0gICAgRldMX0VWRU5URkxBR19BdXRvUmVwZWF0ICAgICAgICA9IDEgPDwgNSwKLSAgICBGV0xfRVZFTlRGTEFHX0xlZnRCdXR0b25Eb3duICAgID0gMSA8PCA2LAotICAgIEZXTF9FVkVOVEZMQUdfTWlkZGxlQnV0dG9uRG93biAgPSAxIDw8IDcsCi0gICAgRldMX0VWRU5URkxBR19SaWdodEJ1dHRvbkRvd24gICA9IDEgPDwgOCwKKy8vIGtleSBmbGFnCit0eXBlZGVmIGVudW0geworICBGV0xfRVZFTlRGTEFHX1NoaWZ0S2V5ID0gMSA8PCAwLAorICBGV0xfRVZFTlRGTEFHX0NvbnRyb2xLZXkgPSAxIDw8IDEsCisgIEZXTF9FVkVOVEZMQUdfQWx0S2V5ID0gMSA8PCAyLAorICBGV0xfRVZFTlRGTEFHX01ldGFLZXkgPSAxIDw8IDMsCisgIEZXTF9FVkVOVEZMQUdfS2V5UGFkID0gMSA8PCA0LAorICBGV0xfRVZFTlRGTEFHX0F1dG9SZXBlYXQgPSAxIDw8IDUsCisgIEZXTF9FVkVOVEZMQUdfTGVmdEJ1dHRvbkRvd24gPSAxIDw8IDYsCisgIEZXTF9FVkVOVEZMQUdfTWlkZGxlQnV0dG9uRG93biA9IDEgPDwgNywKKyAgRldMX0VWRU5URkxBR19SaWdodEJ1dHRvbkRvd24gPSAxIDw8IDgsCiB9IEZXTF9FVkVOVEZMQUc7CiAKIC8vIE1vdXNlIG1lc3NhZ2UgY29tbWFuZAotdHlwZWRlZiBlbnVtCi17Ci0gICAgRldMX0VWRU5UTU9VU0VDTURfTEJ1dHRvbkRvd24gPSAxLAotICAgIEZXTF9FVkVOVE1PVVNFQ01EX0xCdXR0b25VcCwKLSAgICBGV0xfRVZFTlRNT1VTRUNNRF9MQnV0dG9uRGJsQ2xrLAotICAgIEZXTF9FVkVOVE1PVVNFQ01EX1JCdXR0b25Eb3duLAotICAgIEZXTF9FVkVOVE1PVVNFQ01EX1JCdXR0b25VcCwKLSAgICBGV0xfRVZFTlRNT1VTRUNNRF9SQnV0dG9uRGJsQ2xrLAotICAgIEZXTF9FVkVOVE1PVVNFQ01EX01CdXR0b25Eb3duLAotICAgIEZXTF9FVkVOVE1PVVNFQ01EX01CdXR0b25VcCwKLSAgICBGV0xfRVZFTlRNT1VTRUNNRF9NQnV0dG9uRGJsQ2xrLAotICAgIEZXTF9FVkVOVE1PVVNFQ01EX01vdXNlTW92ZSwKLSAgICBGV0xfRVZFTlRNT1VTRUNNRF9Nb3VzZUVudGVyLAotICAgIEZXTF9FVkVOVE1PVVNFQ01EX01vdXNlSG92ZXIsCi0gICAgRldMX0VWRU5UTU9VU0VDTURfTW91c2VMZWF2ZSwKK3R5cGVkZWYgZW51bSB7CisgIEZXTF9FVkVOVE1PVVNFQ01EX0xCdXR0b25Eb3duID0gMSwKKyAgRldMX0VWRU5UTU9VU0VDTURfTEJ1dHRvblVwLAorICBGV0xfRVZFTlRNT1VTRUNNRF9MQnV0dG9uRGJsQ2xrLAorICBGV0xfRVZFTlRNT1VTRUNNRF9SQnV0dG9uRG93biwKKyAgRldMX0VWRU5UTU9VU0VDTURfUkJ1dHRvblVwLAorICBGV0xfRVZFTlRNT1VTRUNNRF9SQnV0dG9uRGJsQ2xrLAorICBGV0xfRVZFTlRNT1VTRUNNRF9NQnV0dG9uRG93biwKKyAgRldMX0VWRU5UTU9VU0VDTURfTUJ1dHRvblVwLAorICBGV0xfRVZFTlRNT1VTRUNNRF9NQnV0dG9uRGJsQ2xrLAorICBGV0xfRVZFTlRNT1VTRUNNRF9Nb3VzZU1vdmUsCisgIEZXTF9FVkVOVE1PVVNFQ01EX01vdXNlRW50ZXIsCisgIEZXTF9FVkVOVE1PVVNFQ01EX01vdXNlSG92ZXIsCisgIEZXTF9FVkVOVE1PVVNFQ01EX01vdXNlTGVhdmUsCiB9IEZXTF9FVkVOVF9NT1VTRUNNRDsKIAotLy9tb3VzZSBldmVudAotc3RydWN0IEZXTF9FVkVOVF9NT1VTRQotewotICAgIEZQREZfVUlOVDMyIGNvbW1hbmQ7Ci0gICAgRlBERl9EV09SRCBmbGFnOwotICAgIEZQREZfRkxPQVQgeDsKLSAgICBGUERGX0ZMT0FUIHk7CisvLyBtb3VzZSBldmVudAorc3RydWN0IEZXTF9FVkVOVF9NT1VTRSB7CisgIEZQREZfVUlOVDMyIGNvbW1hbmQ7CisgIEZQREZfRFdPUkQgZmxhZzsKKyAgRlBERl9GTE9BVCB4OworICBGUERGX0ZMT0FUIHk7CiB9OwogCi0vL21vdXNlIHdoZWVsCi1zdHJ1Y3QgRldMX0VWRU5UX01PVVNFV0hFRUwKLXsKLSAgICBGUERGX0RXT1JEIGZsYWc7Ci0gICAgRlBERl9GTE9BVCB4OwotICAgIEZQREZfRkxPQVQgeTsKLSAgICBGUERGX0ZMT0FUIGRlbHRhWDsKLSAgICBGUERGX0ZMT0FUIGRlbHRhWTsKKy8vIG1vdXNlIHdoZWVsCitzdHJ1Y3QgRldMX0VWRU5UX01PVVNFV0hFRUwgeworICBGUERGX0RXT1JEIGZsYWc7CisgIEZQREZfRkxPQVQgeDsKKyAgRlBERl9GTE9BVCB5OworICBGUERGX0ZMT0FUIGRlbHRhWDsKKyAgRlBERl9GTE9BVCBkZWx0YVk7CiB9OwogCi0vL3ZpcnR1YWwga2V5Y29kZQotdHlwZWRlZiBlbnVtCi17Ci0gIEZXTF9WS0VZX0JhY2sgICAgID0gMHgwOCwKLSAgRldMX1ZLRVlfVGFiICAgICAgPSAweDA5LAotICBGV0xfVktFWV9DbGVhciAgICA9IDB4MEMsCi0gIEZXTF9WS0VZX1JldHVybiAgID0gMHgwRCwKLSAgRldMX1ZLRVlfU2hpZnQgICAgPSAweDEwLAotICBGV0xfVktFWV9Db250cm9sICA9IDB4MTEsCi0gIEZXTF9WS0VZX01lbnUgICAgID0gMHgxMiwKLSAgRldMX1ZLRVlfUGF1c2UgICAgPSAweDEzLAotICBGV0xfVktFWV9DYXBpdGFsICA9IDB4MTQsCi0gIEZXTF9WS0VZX0thbmEgICAgID0gMHgxNSwKLSAgRldMX1ZLRVlfSGFuZ3VsICAgPSAweDE1LAotICBGV0xfVktFWV9KdW5qYSAgICA9IDB4MTcsCi0gIEZXTF9WS0VZX0ZpbmFsICAgID0gMHgxOCwKLSAgRldMX1ZLRVlfSGFuamEgICAgPSAweDE5LAotICBGV0xfVktFWV9LYW5qaSAgICA9IDB4MTksCi0gIEZXTF9WS0VZX0VzY2FwZSAgID0gMHgxQiwKLSAgRldMX1ZLRVlfQ29udmVydCAgPSAweDFDLAorLy8gdmlydHVhbCBrZXljb2RlCit0eXBlZGVmIGVudW0geworICBGV0xfVktFWV9CYWNrID0gMHgwOCwKKyAgRldMX1ZLRVlfVGFiID0gMHgwOSwKKyAgRldMX1ZLRVlfQ2xlYXIgPSAweDBDLAorICBGV0xfVktFWV9SZXR1cm4gPSAweDBELAorICBGV0xfVktFWV9TaGlmdCA9IDB4MTAsCisgIEZXTF9WS0VZX0NvbnRyb2wgPSAweDExLAorICBGV0xfVktFWV9NZW51ID0gMHgxMiwKKyAgRldMX1ZLRVlfUGF1c2UgPSAweDEzLAorICBGV0xfVktFWV9DYXBpdGFsID0gMHgxNCwKKyAgRldMX1ZLRVlfS2FuYSA9IDB4MTUsCisgIEZXTF9WS0VZX0hhbmd1bCA9IDB4MTUsCisgIEZXTF9WS0VZX0p1bmphID0gMHgxNywKKyAgRldMX1ZLRVlfRmluYWwgPSAweDE4LAorICBGV0xfVktFWV9IYW5qYSA9IDB4MTksCisgIEZXTF9WS0VZX0thbmppID0gMHgxOSwKKyAgRldMX1ZLRVlfRXNjYXBlID0gMHgxQiwKKyAgRldMX1ZLRVlfQ29udmVydCA9IDB4MUMsCiAgIEZXTF9WS0VZX05vbkNvbnZlcnQgPSAweDFELAotICBGV0xfVktFWV9BY2NlcHQgICAgPSAweDFFLAorICBGV0xfVktFWV9BY2NlcHQgPSAweDFFLAogICBGV0xfVktFWV9Nb2RlQ2hhbmdlID0gMHgxRiwKICAgRldMX1ZLRVlfU3BhY2UgPSAweDIwLAogICBGV0xfVktFWV9QcmlvciA9IDB4MjEsCkBAIC0yNDgsNDEgKzI0MiwzNiBAQAogICBGV0xfVktFWV9Vbmtub3duID0gMCwKIH0gRldMX1ZLRVlDT0RFOwogCi0vL2tleSBldmVudCBjb21tYW5kCi10eXBlZGVmIGVudW0KLXsKLSAgICBGV0xfRVZFTlRLRVlDTURfS2V5RG93biA9IDEsCi0gICAgRldMX0VWRU5US0VZQ01EX0tleVVwLAotICAgIEZXTF9FVkVOVEtFWUNNRF9DaGFyLAorLy8ga2V5IGV2ZW50IGNvbW1hbmQKK3R5cGVkZWYgZW51bSB7CisgIEZXTF9FVkVOVEtFWUNNRF9LZXlEb3duID0gMSwKKyAgRldMX0VWRU5US0VZQ01EX0tleVVwLAorICBGV0xfRVZFTlRLRVlDTURfQ2hhciwKIH0gRldMX0VWRU5US0VZQ01EOwogCi0vL2tleSBldmVudAotc3RydWN0IEZXTF9FVkVOVF9LRVkKLXsKLSAgICBGUERGX1VJTlQzMiBjb21tYW5kOwotICAgIEZQREZfRFdPUkQgZmxhZzsKLSAgICB1bmlvbgotICAgIHsKLSAgICAgICAgLy9WaXJ0dWFsIGtleSBjb2RlLgotICAgICAgICBGUERGX1VJTlQzMiB2a2NvZGU7Ci0gICAgICAgIC8vQ2hhcmFjdGVyIGNvZGUuCi0gICAgICAgIEZQREZfRFdPUkQgY2hhcmNvZGU7Ci0gICAgfWNvZGU7CisvLyBrZXkgZXZlbnQKK3N0cnVjdCBGV0xfRVZFTlRfS0VZIHsKKyAgRlBERl9VSU5UMzIgY29tbWFuZDsKKyAgRlBERl9EV09SRCBmbGFnOworICB1bmlvbiB7CisgICAgLy8gVmlydHVhbCBrZXkgY29kZS4KKyAgICBGUERGX1VJTlQzMiB2a2NvZGU7CisgICAgLy8gQ2hhcmFjdGVyIGNvZGUuCisgICAgRlBERl9EV09SRCBjaGFyY29kZTsKKyAgfSBjb2RlOwogfTsKIAotLy9ldmVudCB0eXBlCi1zdHJ1Y3QgRldMX0VWRU5UCi17Ci0gICAgLy9zdHJ1Y3R1cmUgc2l6ZS4KLSAgICBGUERGX1VJTlQzMiBzaXplOwotICAgIC8vRldMX0VWRU5UVFlQRS4KLSAgICBGUERGX1VJTlQzMiB0eXBlOwotICAgIHVuaW9uCi0gICAgewotICAgICAgICBzdHJ1Y3QgRldMX0VWRU5UX01PVVNFIG1vdXNlOwotICAgICAgICBzdHJ1Y3QgRldMX0VWRU5UX01PVVNFV0hFRUwgd2hlZWw7Ci0gICAgICAgIHN0cnVjdCBGV0xfRVZFTlRfS0VZIGtleTsKLSAgICB9czsKKy8vIGV2ZW50IHR5cGUKK3N0cnVjdCBGV0xfRVZFTlQgeworICAvLyBzdHJ1Y3R1cmUgc2l6ZS4KKyAgRlBERl9VSU5UMzIgc2l6ZTsKKyAgLy8gRldMX0VWRU5UVFlQRS4KKyAgRlBERl9VSU5UMzIgdHlwZTsKKyAgdW5pb24geworICAgIHN0cnVjdCBGV0xfRVZFTlRfTU9VU0UgbW91c2U7CisgICAgc3RydWN0IEZXTF9FVkVOVF9NT1VTRVdIRUVMIHdoZWVsOworICAgIHN0cnVjdCBGV0xfRVZFTlRfS0VZIGtleTsKKyAgfSBzOwogfTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9wdWJsaWMvZnBkZl9wcG8uaCBiL3B1YmxpYy9mcGRmX3Bwby5oCmluZGV4IDJlMDMzZjEuLmU3ZDc3NjcgMTAwNjQ0Ci0tLSBhL3B1YmxpYy9mcGRmX3Bwby5oCisrKyBiL3B1YmxpYy9mcGRmX3Bwby5oCkBAIC0xOSwyMSArMTksMjYgQEAKIC8vICAgICAgICAgIGRlc3RfZG9jICAgIC0gICBUaGUgZGVzdGluYXRpb24gZG9jdW1lbnQgd2hpY2ggYWRkIHRoZSBwYWdlcy4KIC8vICAgICAgICAgIHNyY19kb2MgICAgIC0gICBBIGRvY3VtZW50IHRvIGJlIGltcG9ydGVkLgogLy8gICAgICAgICAgcGFnZXJhbmdlICAgLSAgIEEgcGFnZSByYW5nZSBzdHJpbmcsIFN1Y2ggYXMgIjEsMyw1LTciLgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoaXMgcGFyYW1ldGVyIGlzIE5VTEwsIGl0IHdvdWxkIGltcG9ydCBhbGwgcGFnZXMgaW4gc3JjX2RvYy4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIHBhcmFtZXRlciBpcyBOVUxMLCBpdCB3b3VsZCBpbXBvcnQgYWxsIHBhZ2VzCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gc3JjX2RvYy4KIC8vICAgICAgICAgIGluZGV4ICAgICAgIC0gICBUaGUgcGFnZSBpbmRleCB3YW50ZWQgdG8gaW5zZXJ0IGZyb20uCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUUlVFIGZvciBzdWNjZWVkLCBGQUxTRSBmb3IgRmFpbGVkLgotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfSW1wb3J0UGFnZXMoRlBERl9ET0NVTUVOVCBkZXN0X2RvYyxGUERGX0RPQ1VNRU5UIHNyY19kb2MsIEZQREZfQllURVNUUklORyBwYWdlcmFuZ2UsIGludCBpbmRleCk7Ci0KK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX0ltcG9ydFBhZ2VzKEZQREZfRE9DVU1FTlQgZGVzdF9kb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RPQ1VNRU5UIHNyY19kb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgcGFnZXJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KTsKIAogLy8gRnVuY3Rpb246IEZQREZfQ29weVZpZXdlclByZWZlcmVuY2VzCiAvLyAgICAgICAgICBDb3B5IHRoZSB2aWV3ZXIgcHJlZmVyZW5jZXMgZnJvbSBvbmUgUERGIGRvY3VtZW50IHRvIGFub3RoZXIuI2VuZGlmCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgZGVzdF9kb2MgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudCB0byB3cml0ZSB0aGUgdmlld2VyIHByZWZlcmVuY2VzIHRvLgorLy8gICAgICAgICAgZGVzdF9kb2MgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudCB0byB3cml0ZSB0aGUgdmlld2VyIHByZWZlcmVuY2VzCisvLyAgICAgICAgICB0by4KIC8vICAgICAgICAgIHNyY19kb2MgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQgd2l0aCB0aGUgdmlld2VyIHByZWZlcmVuY2VzLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVFJVRSBmb3Igc3VjY2VzcywgRkFMU0UgZm9yIGZhaWx1cmUuCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9Db3B5Vmlld2VyUHJlZmVyZW5jZXMoRlBERl9ET0NVTUVOVCBkZXN0X2RvYywgRlBERl9ET0NVTUVOVCBzcmNfZG9jKTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX0NvcHlWaWV3ZXJQcmVmZXJlbmNlcyhGUERGX0RPQ1VNRU5UIGRlc3RfZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRE9DVU1FTlQgc3JjX2RvYyk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvcHVibGljL2ZwZGZfcHJvZ3Jlc3NpdmUuaCBiL3B1YmxpYy9mcGRmX3Byb2dyZXNzaXZlLmgKaW5kZXggMDU4ZjU0Yi4uZjM1MmZmOSAxMDA2NDQKLS0tIGEvcHVibGljL2ZwZGZfcHJvZ3Jlc3NpdmUuaAorKysgYi9wdWJsaWMvZnBkZl9wcm9ncmVzc2l2ZS5oCkBAIC05LDgwICs5LDEwMiBAQAogCiAjaW5jbHVkZSAiZnBkZnZpZXcuaCIKIAotLy9GbGFncyBmb3IgcHJvZ3Jlc3NpdmUgcHJvY2VzcyBzdGF0dXMuCi0jZGVmaW5lIEZQREZfUkVOREVSX1JFQURFUiAgICAgICAgICAwCi0jZGVmaW5lIEZQREZfUkVOREVSX1RPQkVDT1VOVElOVUVEICAxCi0jZGVmaW5lIEZQREZfUkVOREVSX0RPTkUgICAgICAgICAgICAyCi0jZGVmaW5lIEZQREZfUkVOREVSX0ZBSUxFRCAgICAgICAgICAzCi0KKy8vIEZsYWdzIGZvciBwcm9ncmVzc2l2ZSBwcm9jZXNzIHN0YXR1cy4KKyNkZWZpbmUgRlBERl9SRU5ERVJfUkVBREVSIDAKKyNkZWZpbmUgRlBERl9SRU5ERVJfVE9CRUNPVU5USU5VRUQgMQorI2RlZmluZSBGUERGX1JFTkRFUl9ET05FIDIKKyNkZWZpbmUgRlBERl9SRU5ERVJfRkFJTEVEIDMKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgogCisvLyBJRlBERl9SRU5ERVJJTkZPIGludGVyZmFjZS4KK3R5cGVkZWYgc3RydWN0IF9JRlNES19QQVVTRSB7CisgIC8qKgorICAqIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UuIEN1cnJlbnRseSBtdXN0IGJlIDEuCisgICoqLworICBpbnQgdmVyc2lvbjsKIAotLy9JRlBERl9SRU5ERVJJTkZPIGludGVyZmFjZS4KLXR5cGVkZWYgc3RydWN0IF9JRlNES19QQVVTRQotewotICAgIC8qKgotICAgICogVmVyc2lvbiBudW1iZXIgb2YgdGhlIGludGVyZmFjZS4gQ3VycmVudGx5IG11c3QgYmUgMS4KLSAgICAqKi8KLSAgICBpbnQgdmVyc2lvbjsKKyAgLyoKKyAgKiBNZXRob2Q6IE5lZWRUb1BhdXNlTm93CisgICogICAgICAgICAgIENoZWNrIGlmIHdlIG5lZWQgdG8gcGF1c2UgYSBwcm9ncmVzc2l2ZSBwcm9jZXNzIG5vdy4KKyAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgKiAgICAgICAgICAgMQorICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAqICAgICAgICAgICB5ZXMKKyAgKiBQYXJhbWV0ZXJzOgorICAqICAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKKyAgKiBSZXR1cm4gVmFsdWU6CisgICogICAgICAgICAgICBOb24temVybyBmb3IgcGF1c2Ugbm93LCAwIGZvciBjb250aW51ZS4KKyAgKgorICAqLworICBGUERGX0JPT0wgKCpOZWVkVG9QYXVzZU5vdykoc3RydWN0IF9JRlNES19QQVVTRSogcFRoaXMpOwogCi0gICAgLyoKLSAgICAqIE1ldGhvZDogTmVlZFRvUGF1c2VOb3cKLSAgICAqICAgICAgICAgICBDaGVjayBpZiB3ZSBuZWVkIHRvIHBhdXNlIGEgcHJvZ3Jlc3NpdmUgcHJvY2VzcyBub3cuCi0gICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAqICAgICAgICAgICAxCi0gICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAqICAgICAgICAgICB5ZXMKLSAgICAqIFBhcmFtZXRlcnM6Ci0gICAgKiAgICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCi0gICAgKiBSZXR1cm4gVmFsdWU6Ci0gICAgKiAgICAgICAgICAgIE5vbi16ZXJvIGZvciBwYXVzZSBub3csIDAgZm9yIGNvbnRpbnVlLgotICAgICoKLSAgICAqLwotICAgIEZQREZfQk9PTCAoKk5lZWRUb1BhdXNlTm93KSAoc3RydWN0IF9JRlNES19QQVVTRSogcFRoaXMpOwotCi0gICAgLy9BIHVzZXIgZGVmaW5lZCBkYXRhIHBvaW50ZXIsIHVzZWQgYnkgdXNlcidzIGFwcGxpY2F0aW9uLiBDYW4gYmUgTlVMTC4KLSAgICB2b2lkKiAgICAgICB1c2VyOworICAvLyBBIHVzZXIgZGVmaW5lZCBkYXRhIHBvaW50ZXIsIHVzZWQgYnkgdXNlcidzIGFwcGxpY2F0aW9uLiBDYW4gYmUgTlVMTC4KKyAgdm9pZCogdXNlcjsKIH0gSUZTREtfUEFVU0U7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX1JlbmRlclBhZ2VCaXRtYXBfU3RhcnQKLS8vICAgICAgICAgIFN0YXJ0IHRvIHJlbmRlciBwYWdlIGNvbnRlbnRzIHRvIGEgZGV2aWNlIGluZGVwZW5kZW50IGJpdG1hcCBwcm9ncmVzc2l2ZWx5LgorLy8gICAgICAgICAgU3RhcnQgdG8gcmVuZGVyIHBhZ2UgY29udGVudHMgdG8gYSBkZXZpY2UgaW5kZXBlbmRlbnQgYml0bWFwCisvLyAgICAgICAgICBwcm9ncmVzc2l2ZWx5LgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGJpdG1hcCAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGRldmljZSBpbmRlcGVuZGVudCBiaXRtYXAgKGFzIHRoZSBvdXRwdXQgYnVmZmVyKS4KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAgaGFuZGxlIGNhbiBiZSBjcmVhdGVkIGJ5IEZQREZCaXRtYXBfQ3JlYXRlIGZ1bmN0aW9uLgotLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZSBmdW5jdGlvbi4KLS8vICAgICAgICAgIHN0YXJ0X3ggICAgIC0gICBMZWZ0IHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IGFyZWEgaW4gdGhlIGJpdG1hcCBjb29yZGluYXRlLgotLy8gICAgICAgICAgc3RhcnRfeSAgICAgLSAgIFRvcCBwaXhlbCBwb3NpdGlvbiBvZiB0aGUgZGlzcGxheSBhcmVhIGluIHRoZSBiaXRtYXAgY29vcmRpbmF0ZS4KKy8vICAgICAgICAgIGJpdG1hcCAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGRldmljZSBpbmRlcGVuZGVudCBiaXRtYXAgKGFzIHRoZQorLy8gICAgICAgICAgb3V0cHV0IGJ1ZmZlcikuCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwIGhhbmRsZSBjYW4gYmUgY3JlYXRlZCBieSBGUERGQml0bWFwX0NyZWF0ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgorLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorLy8gICAgICAgICAgZnVuY3Rpb24uCisvLyAgICAgICAgICBzdGFydF94ICAgICAtICAgTGVmdCBwaXhlbCBwb3NpdGlvbiBvZiB0aGUgZGlzcGxheSBhcmVhIGluIHRoZQorLy8gICAgICAgICAgYml0bWFwIGNvb3JkaW5hdGUuCisvLyAgICAgICAgICBzdGFydF95ICAgICAtICAgVG9wIHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IGFyZWEgaW4gdGhlIGJpdG1hcAorLy8gICAgICAgICAgY29vcmRpbmF0ZS4KIC8vICAgICAgICAgIHNpemVfeCAgICAgIC0gICBIb3Jpem9udGFsIHNpemUgKGluIHBpeGVscykgZm9yIGRpc3BsYXlpbmcgdGhlIHBhZ2UuCiAvLyAgICAgICAgICBzaXplX3kgICAgICAtICAgVmVydGljYWwgc2l6ZSAoaW4gcGl4ZWxzKSBmb3IgZGlzcGxheWluZyB0aGUgcGFnZS4KLS8vICAgICAgICAgIHJvdGF0ZSAgICAgIC0gICBQYWdlIG9yaWVudGF0aW9uOiAwIChub3JtYWwpLCAxIChyb3RhdGVkIDkwIGRlZ3JlZXMgY2xvY2t3aXNlKSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAocm90YXRlZCAxODAgZGVncmVlcyksIDMgKHJvdGF0ZWQgOTAgZGVncmVlcyBjb3VudGVyLWNsb2Nrd2lzZSkuCi0vLyAgICAgICAgICBmbGFncyAgICAgICAtICAgMCBmb3Igbm9ybWFsIGRpc3BsYXksIG9yIGNvbWJpbmF0aW9uIG9mIGZsYWdzIGRlZmluZWQgYWJvdmUuCi0vLyAgICAgICAgICBwYXVzZSAgICAgICAtICAgVGhlIElGU0RLX1BBVVNFIGludGVyZmFjZS5BIGNhbGxiYWNrIG1lY2hhbmlzbSBhbGxvd2luZyB0aGUgcGFnZSByZW5kZXJpbmcgcHJvY2VzcworLy8gICAgICAgICAgcm90YXRlICAgICAgLSAgIFBhZ2Ugb3JpZW50YXRpb246IDAgKG5vcm1hbCksIDEgKHJvdGF0ZWQgOTAgZGVncmVlcworLy8gICAgICAgICAgY2xvY2t3aXNlKSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAocm90YXRlZCAxODAgZGVncmVlcyksIDMgKHJvdGF0ZWQgOTAgZGVncmVlcworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyLWNsb2Nrd2lzZSkuCisvLyAgICAgICAgICBmbGFncyAgICAgICAtICAgMCBmb3Igbm9ybWFsIGRpc3BsYXksIG9yIGNvbWJpbmF0aW9uIG9mIGZsYWdzCisvLyAgICAgICAgICBkZWZpbmVkIGFib3ZlLgorLy8gICAgICAgICAgcGF1c2UgICAgICAgLSAgIFRoZSBJRlNES19QQVVTRSBpbnRlcmZhY2UuQSBjYWxsYmFjayBtZWNoYW5pc20KKy8vICAgICAgICAgIGFsbG93aW5nIHRoZSBwYWdlIHJlbmRlcmluZyBwcm9jZXNzCiAvLyBSZXR1cm4gdmFsdWU6Ci0vLyAgICAgICAgICBSZW5kZXJpbmcgU3RhdHVzLiBTZWUgZmxhZ3MgZm9yIHByb2dyZXNzaXZlIHByb2Nlc3Mgc3RhdHVzIGZvciB0aGUgZGV0YWlscy4KKy8vICAgICAgICAgIFJlbmRlcmluZyBTdGF0dXMuIFNlZSBmbGFncyBmb3IgcHJvZ3Jlc3NpdmUgcHJvY2VzcyBzdGF0dXMgZm9yIHRoZQorLy8gICAgICAgICAgZGV0YWlscy4KIC8vCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERl9SZW5kZXJQYWdlQml0bWFwX1N0YXJ0KEZQREZfQklUTUFQIGJpdG1hcCwgRlBERl9QQUdFIHBhZ2UsIGludCBzdGFydF94LCBpbnQgc3RhcnRfeSwgaW50IHNpemVfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksIGludCByb3RhdGUsIGludCBmbGFncyxJRlNES19QQVVTRSAqIHBhdXNlKTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGX1JlbmRlclBhZ2VCaXRtYXBfU3RhcnQoRlBERl9CSVRNQVAgYml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGU0RLX1BBVVNFKiBwYXVzZSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX1JlbmRlclBhZ2VfQ29udGludWUKIC8vICAgICAgICAgIENvbnRpbnVlIHJlbmRlcmluZyBhIFBERiBwYWdlLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCi0vLyAgICAgICAgICBwYXVzZSAgICAgICAtICAgVGhlIElGU0RLX1BBVVNFIGludGVyZmFjZS5BIGNhbGxiYWNrIG1lY2hhbmlzbSBhbGxvd2luZyB0aGUgcGFnZSByZW5kZXJpbmcgcHJvY2VzcwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHBhdXNlZCBiZWZvcmUgaXQncyBmaW5pc2hlZC4gVGhpcyBjYW4gYmUgTlVMTCBpZiB5b3UgZG9uJ3Qgd2FudCB0byBwYXVzZS4KKy8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UKKy8vICAgICAgICAgIGZ1bmN0aW9uLgorLy8gICAgICAgICAgcGF1c2UgICAgICAgLSAgIFRoZSBJRlNES19QQVVTRSBpbnRlcmZhY2UuQSBjYWxsYmFjayBtZWNoYW5pc20KKy8vICAgICAgICAgIGFsbG93aW5nIHRoZSBwYWdlIHJlbmRlcmluZyBwcm9jZXNzCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcGF1c2VkIGJlZm9yZSBpdCdzIGZpbmlzaGVkLiBUaGlzIGNhbiBiZSBOVUxMCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgeW91IGRvbid0IHdhbnQgdG8gcGF1c2UuCiAvLyBSZXR1cm4gdmFsdWU6Ci0vLyAgICAgICAgICBUaGUgcmVuZGVyaW5nIHN0YXR1cy4gU2VlIGZsYWdzIGZvciBwcm9ncmVzc2l2ZSBwcm9jZXNzIHN0YXR1cyBmb3IgdGhlIGRldGFpbHMuCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERl9SZW5kZXJQYWdlX0NvbnRpbnVlKEZQREZfUEFHRSBwYWdlLElGU0RLX1BBVVNFICogcGF1c2UpOworLy8gICAgICAgICAgVGhlIHJlbmRlcmluZyBzdGF0dXMuIFNlZSBmbGFncyBmb3IgcHJvZ3Jlc3NpdmUgcHJvY2VzcyBzdGF0dXMgZm9yCisvLyAgICAgICAgICB0aGUgZGV0YWlscy4KK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGX1JlbmRlclBhZ2VfQ29udGludWUoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGU0RLX1BBVVNFKiBwYXVzZSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX1JlbmRlclBhZ2VfQ2xvc2UKLS8vICAgICAgICAgIFJlbGVhc2UgdGhlIHJlc291cmNlIGFsbG9jYXRlIGR1cmluZyBwYWdlIHJlbmRlcmluZy4gTmVlZCB0byBiZSBjYWxsZWQgYWZ0ZXIgZmluaXNoaW5nIHJlbmRlcmluZyBvcgorLy8gICAgICAgICAgUmVsZWFzZSB0aGUgcmVzb3VyY2UgYWxsb2NhdGUgZHVyaW5nIHBhZ2UgcmVuZGVyaW5nLiBOZWVkIHRvIGJlCisvLyAgICAgICAgICBjYWxsZWQgYWZ0ZXIgZmluaXNoaW5nIHJlbmRlcmluZyBvcgogLy8gICAgICAgICAgY2FuY2VsIHRoZSByZW5kZXJpbmcuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZSBmdW5jdGlvbi4KKy8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UKKy8vICAgICAgICAgIGZ1bmN0aW9uLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTlVMTAogRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1JlbmRlclBhZ2VfQ2xvc2UoRlBERl9QQUdFIHBhZ2UpOwpkaWZmIC0tZ2l0IGEvcHVibGljL2ZwZGZfc2F2ZS5oIGIvcHVibGljL2ZwZGZfc2F2ZS5oCmluZGV4IGFhMzI2MDMuLjRlZWEwNTQgMTAwNjQ0Ci0tLSBhL3B1YmxpYy9mcGRmX3NhdmUuaAorKysgYi9wdWJsaWMvZnBkZl9zYXZlLmgKQEAgLTEzLDY2ICsxMyw3MiBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAotCiAvLyBTdHJ1Y3R1cmUgZm9yIGN1c3RvbSBmaWxlIHdyaXRlCiB0eXBlZGVmIHN0cnVjdCBGUERGX0ZJTEVXUklURV8geworICAvLworICAvLyBWZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlLiBDdXJyZW50bHkgbXVzdCBiZSAxLgorICAvLworICBpbnQgdmVyc2lvbjsKIAotICAgIC8vCi0gICAgLy9WZXJzaW9uIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlLiBDdXJyZW50bHkgbXVzdCBiZSAxLgotICAgIC8vCi0gICAgaW50IHZlcnNpb247Ci0KLSAgICAvLwotICAgIC8vIE1ldGhvZDogV3JpdGVCbG9jawotICAgIC8vICAgICAgICAgIE91dHB1dCBhIGJsb2NrIG9mIGRhdGEgaW4geW91ciBjdXN0b20gd2F5LgotICAgIC8vIEludGVyZmFjZSBWZXJzaW9uOgotICAgIC8vICAgICAgICAgIDEKLSAgICAvLyBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAvLyAgICAgICAgICBZZXMKLSAgICAvLyBDb21tZW50czoKLSAgICAvLyAgICAgICAgICBDYWxsZWQgYnkgZnVuY3Rpb24gRlBERl9TYXZlRG9jdW1lbnQKLSAgICAvLyBQYXJhbWV0ZXJzOgotICAgIC8vICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgaXRzZWxmCi0gICAgLy8gICAgICAgICAgcERhdGEgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBidWZmZXIgdG8gb3V0cHV0Ci0gICAgLy8gICAgICAgICAgc2l6ZSAgICAgICAgLSAgIFRoZSBzaXplIG9mIHRoZSBidWZmZXIuCi0gICAgLy8gUmV0dXJuIHZhbHVlOgotICAgIC8vICAgICAgICAgIFNob3VsZCBiZSBub24temVybyBpZiBzdWNjZXNzZnVsLCB6ZXJvIGZvciBlcnJvci4KLSAgICAvLwotICAgIGludCAgICAgKCpXcml0ZUJsb2NrKShzdHJ1Y3QgRlBERl9GSUxFV1JJVEVfKiBwVGhpcywgY29uc3Qgdm9pZCogcERhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CisgIC8vCisgIC8vIE1ldGhvZDogV3JpdGVCbG9jaworICAvLyAgICAgICAgICBPdXRwdXQgYSBibG9jayBvZiBkYXRhIGluIHlvdXIgY3VzdG9tIHdheS4KKyAgLy8gSW50ZXJmYWNlIFZlcnNpb246CisgIC8vICAgICAgICAgIDEKKyAgLy8gSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgIC8vICAgICAgICAgIFllcworICAvLyBDb21tZW50czoKKyAgLy8gICAgICAgICAgQ2FsbGVkIGJ5IGZ1bmN0aW9uIEZQREZfU2F2ZURvY3VtZW50CisgIC8vIFBhcmFtZXRlcnM6CisgIC8vICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgaXRzZWxmCisgIC8vICAgICAgICAgIHBEYXRhICAgICAgIC0gICBQb2ludGVyIHRvIGEgYnVmZmVyIHRvIG91dHB1dAorICAvLyAgICAgICAgICBzaXplICAgICAgICAtICAgVGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KKyAgLy8gUmV0dXJuIHZhbHVlOgorICAvLyAgICAgICAgICBTaG91bGQgYmUgbm9uLXplcm8gaWYgc3VjY2Vzc2Z1bCwgemVybyBmb3IgZXJyb3IuCisgIC8vCisgIGludCAoKldyaXRlQmxvY2spKHN0cnVjdCBGUERGX0ZJTEVXUklURV8qIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzaXplKTsKIAogfSBGUERGX0ZJTEVXUklURTsKIAogLyoqIEBicmllZiBJbmNyZW1lbnRhbC4gKi8KLSNkZWZpbmUgRlBERl9JTkNSRU1FTlRBTCAgICAgICAgMQorI2RlZmluZSBGUERGX0lOQ1JFTUVOVEFMIDEKIC8qKiBAYnJpZWYgTm8gSW5jcmVtZW50YWwuICovCi0jZGVmaW5lIEZQREZfTk9fSU5DUkVNRU5UQUwgICAgIDIKKyNkZWZpbmUgRlBERl9OT19JTkNSRU1FTlRBTCAyCiAvKiogQGJyaWVmIFJlbW92ZSBzZWN1cml0eS4gKi8KLSNkZWZpbmUgRlBERl9SRU1PVkVfU0VDVVJJVFkgICAgMworI2RlZmluZSBGUERGX1JFTU9WRV9TRUNVUklUWSAzCiAKIC8vIEZ1bmN0aW9uOiBGUERGX1NhdmVBc0NvcHkKIC8vICAgICAgICAgIFNhdmVzIHRoZSBjb3B5IG9mIHNwZWNpZmllZCBkb2N1bWVudCBpbiBjdXN0b20gd2F5LgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBhbmQgRlBERl9DcmVhdGVOZXdEb2N1bWVudC4KKy8vICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieQorLy8gICAgICAgICAgRlBERl9Mb2FkRG9jdW1lbnQgYW5kIEZQREZfQ3JlYXRlTmV3RG9jdW1lbnQuCiAvLyAgICAgICAgICBwRmlsZVdyaXRlICAgICAgLSAgIEEgcG9pbnRlciB0byBhIGN1c3RvbSBmaWxlIHdyaXRlIHN0cnVjdHVyZS4KIC8vICAgICAgICAgIGZsYWdzICAgICAgICAgICAtICAgVGhlIGNyZWF0aW5nIGZsYWdzLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVFJVRSBmb3Igc3VjY2VlZCwgRkFMU0UgZm9yIGZhaWxlZC4KIC8vCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9TYXZlQXNDb3B5KCAgICBGUERGX0RPQ1VNRU5UIGRvY3VtZW50LEZQREZfRklMRVdSSVRFICogcEZpbGVXcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQgZmxhZ3MgKTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX1NhdmVBc0NvcHkoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9GSUxFV1JJVEUqIHBGaWxlV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQgZmxhZ3MpOwogCiAvLyBGdW5jdGlvbjogRlBERl9TYXZlV2l0aFZlcnNpb24KLS8vICAgICAgICAgIFNhbWUgYXMgZnVuY3Rpb24gOjpGUERGX1NhdmVBc0NvcHksIGV4Y2VwdCB0aGUgZmlsZSB2ZXJzaW9uIG9mIHRoZSBzYXZlZCBkb2N1bWVudCBjb3VsZCBiZSBzcGVjaWZpZWQgYnkgdXNlci4KKy8vICAgICAgICAgIFNhbWUgYXMgZnVuY3Rpb24gOjpGUERGX1NhdmVBc0NvcHksIGV4Y2VwdCB0aGUgZmlsZSB2ZXJzaW9uIG9mIHRoZQorLy8gICAgICAgICAgc2F2ZWQgZG9jdW1lbnQgY291bGQgYmUgc3BlY2lmaWVkIGJ5IHVzZXIuCiAvLyBQYXJhbWV0ZXJzOgogLy8gICAgICAgICAgZG9jdW1lbnQgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuCiAvLyAgICAgICAgICBwRmlsZVdyaXRlICAgICAgLSAgIEEgcG9pbnRlciB0byBhIGN1c3RvbSBmaWxlIHdyaXRlIHN0cnVjdHVyZS4KIC8vICAgICAgICAgIGZsYWdzICAgICAgICAgICAtICAgVGhlIGNyZWF0aW5nIGZsYWdzLgotLy8gICAgICAgICAgZmlsZVZlcnNpb24gICAgIC0gICBUaGUgUERGIGZpbGUgdmVyc2lvbi4gRmlsZSB2ZXJzaW9uOiAxNCBmb3IgMS40LCAxNSBmb3IgMS41LCAuLi4KKy8vICAgICAgICAgIGZpbGVWZXJzaW9uICAgICAtICAgVGhlIFBERiBmaWxlIHZlcnNpb24uIEZpbGUgdmVyc2lvbjogMTQgZm9yIDEuNCwKKy8vICAgICAgICAgIDE1IGZvciAxLjUsIC4uLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVFJVRSBpZiBzdWNjZWVkLCBGQUxTRSBpZiBmYWlsZWQuCiAvLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfU2F2ZVdpdGhWZXJzaW9uKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsRlBERl9GSUxFV1JJVEUgKiBwRmlsZVdyaXRlLAotICAgIEZQREZfRFdPUkQgZmxhZ3MsIGludCBmaWxlVmVyc2lvbik7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9TYXZlV2l0aFZlcnNpb24oRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZJTEVXUklURSogcEZpbGVXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxlVmVyc2lvbik7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvcHVibGljL2ZwZGZfc2VhcmNoZXguaCBiL3B1YmxpYy9mcGRmX3NlYXJjaGV4LmgKaW5kZXggMWQ0M2VhYi4uYTZiNmUxYiAxMDA2NDQKLS0tIGEvcHVibGljL2ZwZGZfc2VhcmNoZXguaAorKysgYi9wdWJsaWMvZnBkZl9zZWFyY2hleC5oCkBAIC0xNiwxMSArMTYsMTQgQEAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9HZXRDaGFySW5kZXhGcm9tVGV4dEluZGV4CiAvLyAgICAgIEdldCB0aGUgYWN0dWFsbHkgY2hhciBpbmRleCBpbiB0ZXh0X3BhZ2UncyBpbnRlcm5hbCBjaGFyIGxpc3QuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgotLy8gICAgICAgICAgblRleHRJbmRleCAgLSAgIFRoZSBpbmRleCBvZiB0aGUgdGV4dCBpbiB0aGUgc3RyaW5nIGdldCBmcm9tIEZQREZUZXh0X0dldFRleHQuCisvLyAgICAgICAgICB0ZXh0X3BhZ2UgICAtICAgSGFuZGxlIHRvIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KKy8vICAgICAgICAgIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgorLy8gICAgICAgICAgblRleHRJbmRleCAgLSAgIFRoZSBpbmRleCBvZiB0aGUgdGV4dCBpbiB0aGUgc3RyaW5nIGdldCBmcm9tCisvLyAgICAgICAgICBGUERGVGV4dF9HZXRUZXh0LgogLy8gIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIGluIGludGVybmFsIGNoYXJsaXN0LiAtMSBmb3IgZXJyb3IuCi1ETExFWFBPUlQgaW50IFNURENBTEwgIEZQREZUZXh0X0dldENoYXJJbmRleEZyb21UZXh0SW5kZXgoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsIGludCBuVGV4dEluZGV4KTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTAorRlBERlRleHRfR2V0Q2hhckluZGV4RnJvbVRleHRJbmRleChGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwgaW50IG5UZXh0SW5kZXgpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL3B1YmxpYy9mcGRmX3N5c2ZvbnRpbmZvLmggYi9wdWJsaWMvZnBkZl9zeXNmb250aW5mby5oCmluZGV4IGRiYWRiODkuLmMyZGE3NGIgMTAwNjQ0Ci0tLSBhL3B1YmxpYy9mcGRmX3N5c2ZvbnRpbmZvLmgKKysrIGIvcHVibGljL2ZwZGZfc3lzZm9udGluZm8uaApAQCAtMTAsMjIgKzEwLDIyIEBACiAjaW5jbHVkZSAiZnBkZnZpZXcuaCIKIAogLyogQ2hhcmFjdGVyIHNldHMgZm9yIHRoZSBmb250ICovCi0jZGVmaW5lIEZYRk9OVF9BTlNJX0NIQVJTRVQgICAgIDAKLSNkZWZpbmUgRlhGT05UX0RFRkFVTFRfQ0hBUlNFVCAgMQotI2RlZmluZSBGWEZPTlRfU1lNQk9MX0NIQVJTRVQgICAyCisjZGVmaW5lIEZYRk9OVF9BTlNJX0NIQVJTRVQgMAorI2RlZmluZSBGWEZPTlRfREVGQVVMVF9DSEFSU0VUIDEKKyNkZWZpbmUgRlhGT05UX1NZTUJPTF9DSEFSU0VUIDIKICNkZWZpbmUgRlhGT05UX1NISUZUSklTX0NIQVJTRVQgMTI4Ci0jZGVmaW5lIEZYRk9OVF9IQU5HRVVMX0NIQVJTRVQgIDEyOQotI2RlZmluZSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQgICAxMzQKLSNkZWZpbmUgRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQgIDEzNgorI2RlZmluZSBGWEZPTlRfSEFOR0VVTF9DSEFSU0VUIDEyOQorI2RlZmluZSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQgMTM0CisjZGVmaW5lIEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUIDEzNgogCiAvKiBGb250IHBpdGNoIGFuZCBmYW1pbHkgZmxhZ3MgKi8KLSNkZWZpbmUgRlhGT05UX0ZGX0ZJWEVEUElUQ0ggICAgMQotI2RlZmluZSBGWEZPTlRfRkZfUk9NQU4gICAgICAgICAoMTw8NCkKLSNkZWZpbmUgRlhGT05UX0ZGX1NDUklQVCAgICAgICAgKDQ8PDQpCisjZGVmaW5lIEZYRk9OVF9GRl9GSVhFRFBJVENIIDEKKyNkZWZpbmUgRlhGT05UX0ZGX1JPTUFOICgxIDw8IDQpCisjZGVmaW5lIEZYRk9OVF9GRl9TQ1JJUFQgKDQgPDwgNCkKIAogLyogVHlwaWNhbCB3ZWlnaHQgdmFsdWVzICovCi0jZGVmaW5lIEZYRk9OVF9GV19OT1JNQUwgICAgICAgIDQwMAotI2RlZmluZSBGWEZPTlRfRldfQk9MRCAgICAgICAgICA3MDAKKyNkZWZpbmUgRlhGT05UX0ZXX05PUk1BTCA0MDAKKyNkZWZpbmUgRlhGT05UX0ZXX0JPTEQgNzAwCiAKIC8vIEV4cG9ydGVkIEZ1bmN0aW9ucwogI2lmZGVmIF9fY3BsdXNwbHVzCkBAIC0zNywxNjggKzM3LDIwMCBAQAogICogICAgICAgICAgSW50ZXJmYWNlIGZvciBnZXR0aW5nIHN5c3RlbSBmb250IGluZm9ybWF0aW9uIGFuZCBmb250IG1hcHBpbmcKICAqLwogdHlwZWRlZiBzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8gewotICAgIC8qKgotICAgICAqIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UuIEN1cnJlbnRseSBtdXN0IGJlIDEuCi0gICAgICoqLwotICAgIGludCB2ZXJzaW9uOworICAvKioKKyAgICogVmVyc2lvbiBudW1iZXIgb2YgdGhlIGludGVyZmFjZS4gQ3VycmVudGx5IG11c3QgYmUgMS4KKyAgICoqLworICBpbnQgdmVyc2lvbjsKIAotICAgIC8qKgotICAgICAqIE1ldGhvZDogUmVsZWFzZQotICAgICAqICAgICAgICAgIEdpdmUgaW1wbGVtZW50YXRpb24gYSBjaGFuY2UgdG8gcmVsZWFzZSBhbnkgZGF0YSBhZnRlciB0aGUgaW50ZXJmYWNlIGlzIG5vIGxvbmdlciB1c2VkCi0gICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgICogICAgICAgICAgMQotICAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICAqICAgICAgICAgIE5vCi0gICAgICogQ29tbWVudHM6Ci0gICAgICogICAgICAgICAgQ2FsbGVkIGJ5IEZveGl0IFNESyBkdXJpbmcgdGhlIGZpbmFsIGNsZWFudXAgcHJvY2Vzcy4KLSAgICAgKiBQYXJhbWV0ZXJzOgotICAgICAqICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZgotICAgICAqIFJldHVybiBWYWx1ZToKLSAgICAgKiAgICAgICAgICBOb25lCi0gICAgICovCi0gICAgdm9pZCAoKlJlbGVhc2UpKHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMpOworICAvKioKKyAgICogTWV0aG9kOiBSZWxlYXNlCisgICAqICAgICAgICAgIEdpdmUgaW1wbGVtZW50YXRpb24gYSBjaGFuY2UgdG8gcmVsZWFzZSBhbnkgZGF0YSBhZnRlciB0aGUKKyAgICogaW50ZXJmYWNlIGlzIG5vIGxvbmdlciB1c2VkCisgICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAgKiAgICAgICAgICAxCisgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAgKiAgICAgICAgICBObworICAgKiBDb21tZW50czoKKyAgICogICAgICAgICAgQ2FsbGVkIGJ5IEZveGl0IFNESyBkdXJpbmcgdGhlIGZpbmFsIGNsZWFudXAgcHJvY2Vzcy4KKyAgICogUGFyYW1ldGVyczoKKyAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCisgICAqIFJldHVybiBWYWx1ZToKKyAgICogICAgICAgICAgTm9uZQorICAgKi8KKyAgdm9pZCAoKlJlbGVhc2UpKHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMpOwogCi0gICAgLyoqCi0gICAgICogTWV0aG9kOiBFbnVtRm9udHMKLSAgICAgKiAgICAgICAgICBFbnVtZXJhdGUgYWxsIGZvbnRzIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtCi0gICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgICogICAgICAgICAgMQotICAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICAqICAgICAgICAgIE5vCi0gICAgICogQ29tbWVudHM6Ci0gICAgICogICAgICAgICAgSW1wbGVtZW50YXRpb24gc2hvdWxkIGNhbGwgRlBERl9BZGRJbnRhbGxlZEZvbnQoKSBmdW5jdGlvbiBmb3IgZWFjaCBmb250IGZvdW5kLgotICAgICAqICAgICAgICAgIE9ubHkgVHJ1ZVR5cGUvT3BlblR5cGUgYW5kIFR5cGUxIGZvbnRzIGFyZSBhY2NlcHRlZCBieSBGb3hpdCBTREsuCi0gICAgICogUGFyYW1ldGVyczoKLSAgICAgKiAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKLSAgICAgKiAgICAgICAgICBwTWFwcGVyICAgICAtICAgQW4gb3BhcXVlIHBvaW50ZXIgdG8gaW50ZXJuYWwgZm9udCBtYXBwZXIsIHVzZWQgd2hlbiBjYWxsaW5nIEZQREZfQWRkSW5zdGFsbGVkRm9udAotICAgICAqIFJldHVybiBWYWx1ZToKLSAgICAgKiAgICAgICAgICBOb25lCi0gICAgICovCi0gICAgdm9pZCAoKkVudW1Gb250cykoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcywgdm9pZCogcE1hcHBlcik7CisgIC8qKgorICAgKiBNZXRob2Q6IEVudW1Gb250cworICAgKiAgICAgICAgICBFbnVtZXJhdGUgYWxsIGZvbnRzIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtCisgICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAgKiAgICAgICAgICAxCisgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAgKiAgICAgICAgICBObworICAgKiBDb21tZW50czoKKyAgICogICAgICAgICAgSW1wbGVtZW50YXRpb24gc2hvdWxkIGNhbGwgRlBERl9BZGRJbnRhbGxlZEZvbnQoKSBmdW5jdGlvbiBmb3IKKyAgICogZWFjaCBmb250IGZvdW5kLgorICAgKiAgICAgICAgICBPbmx5IFRydWVUeXBlL09wZW5UeXBlIGFuZCBUeXBlMSBmb250cyBhcmUgYWNjZXB0ZWQgYnkgRm94aXQgU0RLLgorICAgKiBQYXJhbWV0ZXJzOgorICAgKiAgICAgICAgICBwVGhpcyAgICAgICAtICAgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIHN0cnVjdHVyZSBpdHNlbGYKKyAgICogICAgICAgICAgcE1hcHBlciAgICAgLSAgIEFuIG9wYXF1ZSBwb2ludGVyIHRvIGludGVybmFsIGZvbnQgbWFwcGVyLCB1c2VkCisgICAqIHdoZW4gY2FsbGluZyBGUERGX0FkZEluc3RhbGxlZEZvbnQKKyAgICogUmV0dXJuIFZhbHVlOgorICAgKiAgICAgICAgICBOb25lCisgICAqLworICB2b2lkICgqRW51bUZvbnRzKShzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCB2b2lkKiBwTWFwcGVyKTsKIAotICAgIC8qKgotICAgICAqIE1ldGhvZDogTWFwRm9udAotICAgICAqICAgICAgICAgIFVzZSB0aGUgc3lzdGVtIGZvbnQgbWFwcGVyIHRvIGdldCBhIGZvbnQgaGFuZGxlIGZyb20gcmVxdWVzdGVkIHBhcmFtZXRlcnMKLSAgICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAgKiAgICAgICAgICAxCi0gICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgICogICAgICAgICAgWWVzIG9ubHkgaWYgR2V0Rm9udCBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLgotICAgICAqIENvbW1lbnRzOgotICAgICAqICAgICAgICAgIElmIHRoZSBzeXN0ZW0gc3VwcG9ydHMgbmF0aXZlIGZvbnQgbWFwcGVyIChsaWtlIFdpbmRvd3MpLCBpbXBsZW1lbnRhdGlvbiBjYW4gaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGdldCBhIGZvbnQgaGFuZGxlLgotICAgICAqICAgICAgICAgIE90aGVyd2lzZSwgRm94aXQgU0RLIHdpbGwgZG8gdGhlIG1hcHBpbmcgYW5kIHRoZW4gY2FsbCBHZXRGb250IG1ldGhvZC4KLSAgICAgKiAgICAgICAgICBPbmx5IFRydWVUeXBlL09wZW5UeXBlIGFuZCBUeXBlMSBmb250cyBhcmUgYWNjZXB0ZWQgYnkgRm94aXQgU0RLLgotICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCi0gICAgICogICAgICAgICAgd2VpZ2h0ICAgICAgLSAgIFdlaWdodCBvZiB0aGUgcmVxdWVzdGVkIGZvbnQuIDQwMCBpcyBub3JtYWwgYW5kIDcwMCBpcyBib2xkLgotICAgICAqICAgICAgICAgIGJJdGFsaWMgICAgIC0gICBJdGFsaWMgb3B0aW9uIG9mIHRoZSByZXF1ZXN0ZWQgZm9udCwgVFJVRSBvciBGQUxTRS4KLSAgICAgKiAgICAgICAgICBjaGFyc2V0ICAgICAtICAgQ2hhcmFjdGVyIHNldCBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdGVkIGZvbnQuIFNlZSBhYm92ZSBkZWZpbmVkIGNvbnN0YW50cy4KLSAgICAgKiAgICAgICAgICBwaXRjaF9mYW1pbHkgLSAgQSBjb21iaW5hdGlvbiBvZiBmbGFncy4gU2VlIGFib3ZlIGRlZmluZWQgY29uc3RhbnRzLgotICAgICAqICAgICAgICAgIGZhY2UgICAgICAgIC0gICBUeXBlZmFjZSBuYW1lLiBDdXJyZW50bHkgdXNlIHN5c3RlbSBsb2NhbCBlbmNvZGluZyBvbmx5LgotICAgICAqICAgICAgICAgIGJFeGFjdCAgICAgIC0gICBQb2ludGVyIHRvIGFuIGJvb2xlYW4gdmFsdWUgcmVjZWl2aW5nIHRoZSBpbmRpY2F0b3Igd2hldGhlciBtYXBwZXIgZm91bmQgdGhlIGV4YWN0IG1hdGNoLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBtYXBwZXIgaXMgbm90IHN1cmUgd2hldGhlciBpdCdzIGV4YWN0IG1hdGNoLCBpZ25vcmUgdGhpcyBwYXJhbXRlci4KLSAgICAgKiBSZXR1cm4gVmFsdWU6Ci0gICAgICogICAgICAgICAgQW4gb3BhcXVlIHBvaW50ZXIgZm9yIGZvbnQgaGFuZGxlLCBvciBOVUxMIGlmIHN5c3RlbSBtYXBwaW5nIGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgICoqLwotICAgIHZvaWQqICgqTWFwRm9udCkoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcywgaW50IHdlaWdodCwgaW50IGJJdGFsaWMsIGludCBjaGFyc2V0LCBpbnQgcGl0Y2hfZmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmFjZSwgaW50KiBiRXhhY3QpOworICAvKioKKyAgICogTWV0aG9kOiBNYXBGb250CisgICAqICAgICAgICAgIFVzZSB0aGUgc3lzdGVtIGZvbnQgbWFwcGVyIHRvIGdldCBhIGZvbnQgaGFuZGxlIGZyb20gcmVxdWVzdGVkCisgICAqcGFyYW1ldGVycworICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgICogICAgICAgICAgMQorICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgICogICAgICAgICAgWWVzIG9ubHkgaWYgR2V0Rm9udCBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLgorICAgKiBDb21tZW50czoKKyAgICogICAgICAgICAgSWYgdGhlIHN5c3RlbSBzdXBwb3J0cyBuYXRpdmUgZm9udCBtYXBwZXIgKGxpa2UgV2luZG93cyksCisgICAqaW1wbGVtZW50YXRpb24gY2FuIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBnZXQgYSBmb250IGhhbmRsZS4KKyAgICogICAgICAgICAgT3RoZXJ3aXNlLCBGb3hpdCBTREsgd2lsbCBkbyB0aGUgbWFwcGluZyBhbmQgdGhlbiBjYWxsIEdldEZvbnQKKyAgICptZXRob2QuCisgICAqICAgICAgICAgIE9ubHkgVHJ1ZVR5cGUvT3BlblR5cGUgYW5kIFR5cGUxIGZvbnRzIGFyZSBhY2NlcHRlZCBieSBGb3hpdCBTREsuCisgICAqIFBhcmFtZXRlcnM6CisgICAqICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZgorICAgKiAgICAgICAgICB3ZWlnaHQgICAgICAtICAgV2VpZ2h0IG9mIHRoZSByZXF1ZXN0ZWQgZm9udC4gNDAwIGlzIG5vcm1hbCBhbmQKKyAgICo3MDAgaXMgYm9sZC4KKyAgICogICAgICAgICAgYkl0YWxpYyAgICAgLSAgIEl0YWxpYyBvcHRpb24gb2YgdGhlIHJlcXVlc3RlZCBmb250LCBUUlVFIG9yCisgICAqRkFMU0UuCisgICAqICAgICAgICAgIGNoYXJzZXQgICAgIC0gICBDaGFyYWN0ZXIgc2V0IGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0ZWQgZm9udC4KKyAgICpTZWUgYWJvdmUgZGVmaW5lZCBjb25zdGFudHMuCisgICAqICAgICAgICAgIHBpdGNoX2ZhbWlseSAtICBBIGNvbWJpbmF0aW9uIG9mIGZsYWdzLiBTZWUgYWJvdmUgZGVmaW5lZAorICAgKmNvbnN0YW50cy4KKyAgICogICAgICAgICAgZmFjZSAgICAgICAgLSAgIFR5cGVmYWNlIG5hbWUuIEN1cnJlbnRseSB1c2Ugc3lzdGVtIGxvY2FsIGVuY29kaW5nCisgICAqb25seS4KKyAgICogICAgICAgICAgYkV4YWN0ICAgICAgLSAgIFBvaW50ZXIgdG8gYSBib29sZWFuIHZhbHVlIHJlY2VpdmluZyB0aGUgaW5kaWNhdG9yCisgICAqd2hldGhlciBtYXBwZXIgZm91bmQgdGhlIGV4YWN0IG1hdGNoLgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgbWFwcGVyIGlzIG5vdCBzdXJlIHdoZXRoZXIgaXQncyBleGFjdCBtYXRjaCwKKyAgICppZ25vcmUgdGhpcyBwYXJhbXRlci4KKyAgICogUmV0dXJuIFZhbHVlOgorICAgKiAgICAgICAgICBBbiBvcGFxdWUgcG9pbnRlciBmb3IgZm9udCBoYW5kbGUsIG9yIE5VTEwgaWYgc3lzdGVtIG1hcHBpbmcgaXMKKyAgICpub3Qgc3VwcG9ydGVkLgorICAgKiovCisgIHZvaWQqICgqTWFwRm9udCkoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiSXRhbGljLAorICAgICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHksCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmFjZSwKKyAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wqIGJFeGFjdCk7CiAKLSAgICAvKioKLSAgICAgKiBNZXRob2Q6IEdldEZvbnQKLSAgICAgKiAgICAgICAgICBHZXQgYSBoYW5kbGUgdG8gYSBwYXJ0aWN1bGFyIGZvbnQgYnkgaXRzIGludGVybmFsIElECi0gICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgICogICAgICAgICAgMQotICAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICAqICAgICAgICAgIFllcyBvbmx5IGlmIE1hcEZvbnQgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC4KLSAgICAgKiBDb21tZW50czoKLSAgICAgKiAgICAgICAgICBJZiB0aGUgc3lzdGVtIG1hcHBpbmcgbm90IHN1cHBvcnRlZCwgRm94aXQgU0RLIHdpbGwgZG8gdGhlIGZvbnQgbWFwcGluZyBhbmQgdXNlIHRoaXMgbWV0aG9kIHRvIGdldCBhIGZvbnQgaGFuZGxlLgotICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCi0gICAgICogICAgICAgICAgZmFjZSAgICAgICAgLSAgIFR5cGVmYWNlIG5hbWUuIEN1cnJlbnRseSB1c2Ugc3lzdGVtIGxvY2FsIGVuY29kaW5nIG9ubHkuCi0gICAgICogUmV0dXJuIFZhbHVlOgotICAgICAqICAgICAgICAgIEFuIG9wYXF1ZSBwb2ludGVyIGZvciBmb250IGhhbmRsZS4KLSAgICAgKiovCi0gICAgdm9pZCogKCpHZXRGb250KShzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCBjb25zdCBjaGFyKiBmYWNlKTsKKyAgLyoqCisgICAqIE1ldGhvZDogR2V0Rm9udAorICAgKiAgICAgICAgICBHZXQgYSBoYW5kbGUgdG8gYSBwYXJ0aWN1bGFyIGZvbnQgYnkgaXRzIGludGVybmFsIElECisgICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAgKiAgICAgICAgICAxCisgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAgKiAgICAgICAgICBZZXMgb25seSBpZiBNYXBGb250IG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuCisgICAqIENvbW1lbnRzOgorICAgKiAgICAgICAgICBJZiB0aGUgc3lzdGVtIG1hcHBpbmcgbm90IHN1cHBvcnRlZCwgRm94aXQgU0RLIHdpbGwgZG8gdGhlIGZvbnQKKyAgICptYXBwaW5nIGFuZCB1c2UgdGhpcyBtZXRob2QgdG8gZ2V0IGEgZm9udCBoYW5kbGUuCisgICAqIFBhcmFtZXRlcnM6CisgICAqICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZgorICAgKiAgICAgICAgICBmYWNlICAgICAgICAtICAgVHlwZWZhY2UgbmFtZS4gQ3VycmVudGx5IHVzZSBzeXN0ZW0gbG9jYWwgZW5jb2RpbmcKKyAgICpvbmx5LgorICAgKiBSZXR1cm4gVmFsdWU6CisgICAqICAgICAgICAgIEFuIG9wYXF1ZSBwb2ludGVyIGZvciBmb250IGhhbmRsZS4KKyAgICoqLworICB2b2lkKiAoKkdldEZvbnQpKHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMsIGNvbnN0IGNoYXIqIGZhY2UpOwogCi0gICAgLyoqCi0gICAgICogTWV0aG9kOiBHZXRGb250RGF0YQotICAgICAqICAgICAgICAgIEdldCBmb250IGRhdGEgZnJvbSBhIGZvbnQKLSAgICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAgKiAgICAgICAgICAxCi0gICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgICogICAgICAgICAgWWVzCi0gICAgICogQ29tbWVudHM6Ci0gICAgICogICAgICAgICAgQ2FuIHJlYWQgZWl0aGVyIGZ1bGwgZm9udCBmaWxlLCBvciBhIHBhcnRpY3VsYXIgVHJ1ZVR5cGUvT3BlblR5cGUgdGFibGUKLSAgICAgKiBQYXJhbWV0ZXJzOgotICAgICAqICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZgotICAgICAqICAgICAgICAgIGhGb250ICAgICAgIC0gICBGb250IGhhbmRsZSByZXR1cm5lZCBieSBNYXBGb250IG9yIEdldEZvbnQgbWV0aG9kCi0gICAgICogICAgICAgICAgdGFibGUgICAgICAgLSAgIFRydWVUeXBlL09wZW5UeXBlIHRhYmxlIGlkZW50aWZpZXIgKHJlZmVyIHRvIFRydWVUeXBlIHNwZWNpZmljYXRpb24pLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAwIGZvciB0aGUgd2hvbGUgZm9udCBmaWxlLgotICAgICAqICAgICAgICAgIGJ1ZmZlciAgICAgIC0gICBUaGUgYnVmZmVyIHJlY2VpdmluZyB0aGUgZm9udCBkYXRhLiBDYW4gYmUgTlVMTCBpZiBub3QgcHJvdmlkZWQKLSAgICAgKiAgICAgICAgICBidWZfc2l6ZSAgICAtICAgQnVmZmVyIHNpemUsIGNhbiBiZSB6ZXJvIGlmIG5vdCBwcm92aWRlZAotICAgICAqIFJldHVybiBWYWx1ZToKLSAgICAgKiAgICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgbmVlZGVkLCBpZiBidWZmZXIgbm90IHByb3ZpZGVkIG9yIG5vdCBsYXJnZSBlbm91Z2gsCi0gICAgICogICAgICAgICAgb3IgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaW50byBidWZmZXIgb3RoZXJ3aXNlLgotICAgICAqKi8KLSAgICB1bnNpZ25lZCBsb25nICgqR2V0Rm9udERhdGEpKHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMsIHZvaWQqIGhGb250LAotICAgICAgICAgICAgdW5zaWduZWQgaW50IHRhYmxlLCB1bnNpZ25lZCBjaGFyKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgYnVmX3NpemUpOworICAvKioKKyAgICogTWV0aG9kOiBHZXRGb250RGF0YQorICAgKiAgICAgICAgICBHZXQgZm9udCBkYXRhIGZyb20gYSBmb250CisgICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAgKiAgICAgICAgICAxCisgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAgKiAgICAgICAgICBZZXMKKyAgICogQ29tbWVudHM6CisgICAqICAgICAgICAgIENhbiByZWFkIGVpdGhlciBmdWxsIGZvbnQgZmlsZSwgb3IgYSBwYXJ0aWN1bGFyIFRydWVUeXBlL09wZW5UeXBlCisgICAqdGFibGUKKyAgICogUGFyYW1ldGVyczoKKyAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCisgICAqICAgICAgICAgIGhGb250ICAgICAgIC0gICBGb250IGhhbmRsZSByZXR1cm5lZCBieSBNYXBGb250IG9yIEdldEZvbnQgbWV0aG9kCisgICAqICAgICAgICAgIHRhYmxlICAgICAgIC0gICBUcnVlVHlwZS9PcGVuVHlwZSB0YWJsZSBpZGVudGlmaWVyIChyZWZlciB0bworICAgKlRydWVUeXBlIHNwZWNpZmljYXRpb24pLgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgMCBmb3IgdGhlIHdob2xlIGZvbnQgZmlsZS4KKyAgICogICAgICAgICAgYnVmZmVyICAgICAgLSAgIFRoZSBidWZmZXIgcmVjZWl2aW5nIHRoZSBmb250IGRhdGEuIENhbiBiZSBOVUxMIGlmCisgICAqbm90IHByb3ZpZGVkCisgICAqICAgICAgICAgIGJ1Zl9zaXplICAgIC0gICBCdWZmZXIgc2l6ZSwgY2FuIGJlIHplcm8gaWYgbm90IHByb3ZpZGVkCisgICAqIFJldHVybiBWYWx1ZToKKyAgICogICAgICAgICAgTnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCwgaWYgYnVmZmVyIG5vdCBwcm92aWRlZCBvciBub3QgbGFyZ2UKKyAgICplbm91Z2gsCisgICAqICAgICAgICAgIG9yIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGludG8gYnVmZmVyIG90aGVyd2lzZS4KKyAgICoqLworICB1bnNpZ25lZCBsb25nICgqR2V0Rm9udERhdGEpKHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogaEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1Zl9zaXplKTsKIAotICAgIC8qKgotICAgICAqIE1ldGhvZDogR2V0RmFjZU5hbWUKLSAgICAgKiAgICAgICAgICBHZXQgZmFjZSBuYW1lIGZyb20gYSBmb250IGhhbmRsZQotICAgICAqIEludGVyZmFjZSBWZXJzaW9uOgotICAgICAqICAgICAgICAgIDEKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKLSAgICAgKiAgICAgICAgICBObwotICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCi0gICAgICogICAgICAgICAgaEZvbnQgICAgICAgLSAgIEZvbnQgaGFuZGxlIHJldHVybmVkIGJ5IE1hcEZvbnQgb3IgR2V0Rm9udCBtZXRob2QKLSAgICAgKiAgICAgICAgICBidWZmZXIgICAgICAtICAgVGhlIGJ1ZmZlciByZWNlaXZpbmcgdGhlIGZhY2UgbmFtZS4gQ2FuIGJlIE5VTEwgaWYgbm90IHByb3ZpZGVkCi0gICAgICogICAgICAgICAgYnVmX3NpemUgICAgLSAgIEJ1ZmZlciBzaXplLCBjYW4gYmUgemVybyBpZiBub3QgcHJvdmlkZWQKLSAgICAgKiBSZXR1cm4gVmFsdWU6Ci0gICAgICogICAgICAgICAgTnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCwgaWYgYnVmZmVyIG5vdCBwcm92aWRlZCBvciBub3QgbGFyZ2UgZW5vdWdoLAotICAgICAqICAgICAgICAgIG9yIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGludG8gYnVmZmVyIG90aGVyd2lzZS4KLSAgICAgKiovCi0gICAgdW5zaWduZWQgbG9uZyAoKkdldEZhY2VOYW1lKShzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCB2b2lkKiBoRm9udCwgY2hhciogYnVmZmVyLCB1bnNpZ25lZCBsb25nIGJ1Zl9zaXplKTsKKyAgLyoqCisgICAqIE1ldGhvZDogR2V0RmFjZU5hbWUKKyAgICogICAgICAgICAgR2V0IGZhY2UgbmFtZSBmcm9tIGEgZm9udCBoYW5kbGUKKyAgICogSW50ZXJmYWNlIFZlcnNpb246CisgICAqICAgICAgICAgIDEKKyAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6CisgICAqICAgICAgICAgIE5vCisgICAqIFBhcmFtZXRlcnM6CisgICAqICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZgorICAgKiAgICAgICAgICBoRm9udCAgICAgICAtICAgRm9udCBoYW5kbGUgcmV0dXJuZWQgYnkgTWFwRm9udCBvciBHZXRGb250IG1ldGhvZAorICAgKiAgICAgICAgICBidWZmZXIgICAgICAtICAgVGhlIGJ1ZmZlciByZWNlaXZpbmcgdGhlIGZhY2UgbmFtZS4gQ2FuIGJlIE5VTEwgaWYKKyAgICpub3QgcHJvdmlkZWQKKyAgICogICAgICAgICAgYnVmX3NpemUgICAgLSAgIEJ1ZmZlciBzaXplLCBjYW4gYmUgemVybyBpZiBub3QgcHJvdmlkZWQKKyAgICogUmV0dXJuIFZhbHVlOgorICAgKiAgICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgbmVlZGVkLCBpZiBidWZmZXIgbm90IHByb3ZpZGVkIG9yIG5vdCBsYXJnZQorICAgKmVub3VnaCwKKyAgICogICAgICAgICAgb3IgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaW50byBidWZmZXIgb3RoZXJ3aXNlLgorICAgKiovCisgIHVuc2lnbmVkIGxvbmcgKCpHZXRGYWNlTmFtZSkoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBoRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBidWZfc2l6ZSk7CiAKLSAgICAvKioKLSAgICAgKiBNZXRob2Q6IEdldEZvbnRDaGFyc2V0Ci0gICAgICogICAgICAgICAgR2V0IGNoYXJhY3RlciBzZXQgaW5mb3JtYXRpb24gZm9yIGEgZm9udCBoYW5kbGUKLSAgICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKLSAgICAgKiAgICAgICAgICAxCi0gICAgICogSW1wbGVtZW50YXRpb24gUmVxdWlyZWQ6Ci0gICAgICogICAgICAgICAgTm8KLSAgICAgKiBQYXJhbWV0ZXJzOgotICAgICAqICAgICAgICAgIHBUaGlzICAgICAgIC0gICBQb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlIGl0c2VsZgotICAgICAqICAgICAgICAgIGhGb250ICAgICAgIC0gICBGb250IGhhbmRsZSByZXR1cm5lZCBieSBNYXBGb250IG9yIEdldEZvbnQgbWV0aG9kCi0gICAgICogUmV0dXJuIFZhbHVlOgotICAgICAqICAgICAgICAgIENoYXJhY3RlciBzZXQgaWRlbnRpZmllci4gU2VlIGRlZmluZWQgY29uc3RhbnRzIGFib3ZlLgotICAgICAqKi8KLSAgICBpbnQgKCpHZXRGb250Q2hhcnNldCkoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcywgdm9pZCogaEZvbnQpOworICAvKioKKyAgICogTWV0aG9kOiBHZXRGb250Q2hhcnNldAorICAgKiAgICAgICAgICBHZXQgY2hhcmFjdGVyIHNldCBpbmZvcm1hdGlvbiBmb3IgYSBmb250IGhhbmRsZQorICAgKiBJbnRlcmZhY2UgVmVyc2lvbjoKKyAgICogICAgICAgICAgMQorICAgKiBJbXBsZW1lbnRhdGlvbiBSZXF1aXJlZDoKKyAgICogICAgICAgICAgTm8KKyAgICogUGFyYW1ldGVyczoKKyAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCisgICAqICAgICAgICAgIGhGb250ICAgICAgIC0gICBGb250IGhhbmRsZSByZXR1cm5lZCBieSBNYXBGb250IG9yIEdldEZvbnQgbWV0aG9kCisgICAqIFJldHVybiBWYWx1ZToKKyAgICogICAgICAgICAgQ2hhcmFjdGVyIHNldCBpZGVudGlmaWVyLiBTZWUgZGVmaW5lZCBjb25zdGFudHMgYWJvdmUuCisgICAqKi8KKyAgaW50ICgqR2V0Rm9udENoYXJzZXQpKHN0cnVjdCBfRlBERl9TWVNGT05USU5GTyogcFRoaXMsIHZvaWQqIGhGb250KTsKIAotICAgIC8qKgotICAgICAqIE1ldGhvZDogRGVsZXRlRm9udAotICAgICAqICAgICAgICAgIERlbGV0ZSBhIGZvbnQgaGFuZGxlCi0gICAgICogSW50ZXJmYWNlIFZlcnNpb246Ci0gICAgICogICAgICAgICAgMQotICAgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgotICAgICAqICAgICAgICAgIFllcwotICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCi0gICAgICogICAgICAgICAgaEZvbnQgICAgICAgLSAgIEZvbnQgaGFuZGxlIHJldHVybmVkIGJ5IE1hcEZvbnQgb3IgR2V0Rm9udCBtZXRob2QKLSAgICAgKiBSZXR1cm4gVmFsdWU6Ci0gICAgICogICAgICAgICAgTm9uZQotICAgICAqKi8KLSAgICB2b2lkICgqRGVsZXRlRm9udCkoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcywgdm9pZCogaEZvbnQpOworICAvKioKKyAgICogTWV0aG9kOiBEZWxldGVGb250CisgICAqICAgICAgICAgIERlbGV0ZSBhIGZvbnQgaGFuZGxlCisgICAqIEludGVyZmFjZSBWZXJzaW9uOgorICAgKiAgICAgICAgICAxCisgICAqIEltcGxlbWVudGF0aW9uIFJlcXVpcmVkOgorICAgKiAgICAgICAgICBZZXMKKyAgICogUGFyYW1ldGVyczoKKyAgICogICAgICAgICAgcFRoaXMgICAgICAgLSAgIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBzdHJ1Y3R1cmUgaXRzZWxmCisgICAqICAgICAgICAgIGhGb250ICAgICAgIC0gICBGb250IGhhbmRsZSByZXR1cm5lZCBieSBNYXBGb250IG9yIEdldEZvbnQgbWV0aG9kCisgICAqIFJldHVybiBWYWx1ZToKKyAgICogICAgICAgICAgTm9uZQorICAgKiovCisgIHZvaWQgKCpEZWxldGVGb250KShzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCB2b2lkKiBoRm9udCk7CiB9IEZQREZfU1lTRk9OVElORk87CiAKIC8qKgogICogU3RydWN0OiBGUERGX0NoYXJzZXRGb250TWFwCiAgKiAgICBQcm92aWRlcyB0aGUgbmFtZSBvZiBhIGZvbnQgdG8gdXNlIGZvciBhIGdpdmVuIGNoYXJzZXQgdmFsdWUuCiAgKiovCi10eXBlZGVmIHN0cnVjdCBGUERGX0NoYXJzZXRGb250TWFwXwotewotICAgIGludCBjaGFyc2V0OyAgLy8gQ2hhcmFjdGVyIFNldCBFbnVtIHZhbHVlLCBzZWUgRlhGT05UXypfQ0hBUlNFVCBhYm92ZS4KLSAgICBjb25zdCBjaGFyKiBmb250bmFtZTsgIC8vIE5hbWUgb2YgZGVmYXVsdCBmb250IHRvIHVzZSB3aXRoIHRoYXQgY2hhcnNldC4KK3R5cGVkZWYgc3RydWN0IEZQREZfQ2hhcnNldEZvbnRNYXBfIHsKKyAgaW50IGNoYXJzZXQ7ICAvLyBDaGFyYWN0ZXIgU2V0IEVudW0gdmFsdWUsIHNlZSBGWEZPTlRfKl9DSEFSU0VUIGFib3ZlLgorICBjb25zdCBjaGFyKiBmb250bmFtZTsgIC8vIE5hbWUgb2YgZGVmYXVsdCBmb250IHRvIHVzZSB3aXRoIHRoYXQgY2hhcnNldC4KIH0gRlBERl9DaGFyc2V0Rm9udE1hcDsKIAogLyoqCkBAIC0yMTcsNyArMjQ5LDggQEAKICAqIEZ1bmN0aW9uOiBGUERGX0FkZEluc3RhbGxlZEZvbnQKICAqICAgICAgICAgIEFkZCBhIHN5c3RlbSBmb250IHRvIHRoZSBsaXN0IGluIEZveGl0IFNESy4KICAqIENvbW1lbnRzOgotICogICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBkdXJpbmcgdGhlIHN5c3RlbSBmb250IGxpc3QgYnVpbGRpbmcgcHJvY2Vzcy4KKyAqICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgZHVyaW5nIHRoZSBzeXN0ZW0gZm9udCBsaXN0IGJ1aWxkaW5nCisgKnByb2Nlc3MuCiAgKiBQYXJhbWV0ZXJzOgogICogICAgICAgICAgbWFwcGVyICAgICAgICAgIC0gICBPcGFxdWUgcG9pbnRlciB0byBGb3hpdCBmb250IG1hcHBlcgogICogICAgICAgICAgZmFjZSAgICAgICAgICAgIC0gICBUaGUgZm9udCBmYWNlIG5hbWUKQEAgLTIyNSwxMyArMjU4LDE2IEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBOb25lLgogICoqLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0FkZEluc3RhbGxlZEZvbnQodm9pZCogbWFwcGVyLCBjb25zdCBjaGFyKiBmYWNlLCBpbnQgY2hhcnNldCk7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfQWRkSW5zdGFsbGVkRm9udCh2b2lkKiBtYXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYXJzZXQpOwogCiAvKioKICAqIEZ1bmN0aW9uOiBGUERGX1NldFN5c3RlbUZvbnRJbmZvCiAgKiAgICAgICAgICBTZXQgdGhlIHN5c3RlbSBmb250IGluZm8gaW50ZXJmYWNlIGludG8gRm94aXQgU0RLCiAgKiBDb21tZW50czoKLSAqICAgICAgICAgIFBsYXRmb3JtIHN1cHBvcnQgaW1wbGVtZW50YXRpb24gc2hvdWxkIGltcGxlbWVudCByZXF1aXJlZCBtZXRob2RzIG9mIEZGREZfU1lTRk9OVElORk8gaW50ZXJmYWNlLAorICogICAgICAgICAgUGxhdGZvcm0gc3VwcG9ydCBpbXBsZW1lbnRhdGlvbiBzaG91bGQgaW1wbGVtZW50IHJlcXVpcmVkIG1ldGhvZHMgb2YKKyAqRkZERl9TWVNGT05USU5GTyBpbnRlcmZhY2UsCiAgKiAgICAgICAgICB0aGVuIGNhbGwgdGhpcyBmdW5jdGlvbiBkdXJpbmcgU0RLIGluaXRpYWxpemF0aW9uIHByb2Nlc3MuCiAgKiBQYXJhbWV0ZXJzOgogICogICAgICAgICAgcEZvbnRJbmZvICAgICAgIC0gICBQb2ludGVyIHRvIGEgRlBERl9TWVNGT05USU5GTyBzdHJ1Y3R1cmUKQEAgLTI0NCwxNCArMjgwLDE4IEBACiAgKiBGdW5jdGlvbjogRlBERl9HZXREZWZhdWx0U3lzdGVtRm9udEluZm8KICAqICAgICAgICAgIEdldCBkZWZhdWx0IHN5c3RlbSBmb250IGluZm8gaW50ZXJmYWNlIGZvciBjdXJyZW50IHBsYXRmb3JtCiAgKiBDb21tZW50czoKLSAqICAgICAgICAgIEZvciBzb21lIHBsYXRmb3JtcyBGb3hpdCBTREsgaW1wbGVtZW50IGEgZGVmYXVsdCB2ZXJzaW9uIG9mIHN5c3RlbSBmb250IGluZm8gaW50ZXJmYWNlLgotICogICAgICAgICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2FuIGJlIHVzZWQgaW4gRlBERl9TZXRTeXN0ZW1Gb250SW5mbyBmdW5jdGlvbi4KKyAqICAgICAgICAgIEZvciBzb21lIHBsYXRmb3JtcyBGb3hpdCBTREsgaW1wbGVtZW50IGEgZGVmYXVsdCB2ZXJzaW9uIG9mIHN5c3RlbQorICpmb250IGluZm8gaW50ZXJmYWNlLgorICogICAgICAgICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2FuIGJlIHVzZWQgaW4gRlBERl9TZXRTeXN0ZW1Gb250SW5mbworICpmdW5jdGlvbi4KICAqIFBhcmFtZXRlcnM6CiAgKiAgICAgICAgICBOb25lCiAgKiBSZXR1cm4gVmFsdWU6Ci0gKiAgICAgICAgICBQb2ludGVyIHRvIGEgRlBERl9TWVNGT05USU5GTyBzdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgZGVmYXVsdCBpbnRlcmZhY2UuCisgKiAgICAgICAgICBQb2ludGVyIHRvIGEgRlBERl9TWVNGT05USU5GTyBzdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgZGVmYXVsdAorICppbnRlcmZhY2UuCiAgKiAgICAgICAgICBPciBOVUxMIGlmIHRoZSBwbGF0Zm9ybSBkb2Vzbid0IGhhdmUgYSBkZWZhdWx0IGludGVyZmFjZS4KLSAqICAgICAgICAgIEFwcGxpY2F0aW9uIHNob3VsZCBjYWxsIEZQREZfRnJlZU1lbW9yeSB0byBmcmVlIHRoZSByZXR1cm5lZCBwb2ludGVyLgorICogICAgICAgICAgQXBwbGljYXRpb24gc2hvdWxkIGNhbGwgRlBERl9GcmVlTWVtb3J5IHRvIGZyZWUgdGhlIHJldHVybmVkCisgKnBvaW50ZXIuCiAgKiovCiBETExFWFBPUlQgRlBERl9TWVNGT05USU5GTyogU1REQ0FMTCBGUERGX0dldERlZmF1bHRTeXN0ZW1Gb250SW5mbygpOwogCmRpZmYgLS1naXQgYS9wdWJsaWMvZnBkZl90ZXh0LmggYi9wdWJsaWMvZnBkZl90ZXh0LmgKaW5kZXggMzJmNWM3Yy4uMzJjYzEzMSAxMDA2NDQKLS0tIGEvcHVibGljL2ZwZGZfdGV4dC5oCisrKyBiL3B1YmxpYy9mcGRmX3RleHQuaApAQCAtMTcsMTkgKzE3LDIzIEBACiAvLyBGdW5jdGlvbjogRlBERlRleHRfTG9hZFBhZ2UKIC8vICAgICAgICAgIFByZXBhcmUgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGNoYXJhY3RlcnMgaW4gYSBwYWdlLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBhZ2UgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZSBmdW5jdGlvbiAoaW4gRlBERlZJRVcgbW9kdWxlKS4KKy8vICAgICAgICAgIHBhZ2UgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZSBmdW5jdGlvbgorLy8gICAgICAgICAgKGluIEZQREZWSUVXIG1vZHVsZSkuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBBIGhhbmRsZSB0byB0aGUgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KIC8vICAgICAgICAgIE5VTEwgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuCiAvLyBDb21tZW50czoKLS8vICAgICAgICAgIEFwcGxpY2F0aW9uIG11c3QgY2FsbCBGUERGVGV4dF9DbG9zZVBhZ2UgdG8gcmVsZWFzZSB0aGUgdGV4dCBwYWdlIGluZm9ybWF0aW9uLgorLy8gICAgICAgICAgQXBwbGljYXRpb24gbXVzdCBjYWxsIEZQREZUZXh0X0Nsb3NlUGFnZSB0byByZWxlYXNlIHRoZSB0ZXh0IHBhZ2UKKy8vICAgICAgICAgIGluZm9ybWF0aW9uLgogLy8KIERMTEVYUE9SVCBGUERGX1RFWFRQQUdFIFNURENBTEwgRlBERlRleHRfTG9hZFBhZ2UoRlBERl9QQUdFIHBhZ2UpOwogCiAvLyBGdW5jdGlvbjogRlBERlRleHRfQ2xvc2VQYWdlCi0vLyAgICAgICAgICBSZWxlYXNlIGFsbCByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCisvLyAgICAgICAgICBSZWxlYXNlIGFsbCByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbgorLy8gICAgICAgICAgc3RydWN0dXJlLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHRleHRfcGFnZSAgIC0gICBIYW5kbGUgdG8gYSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlLiBSZXR1cm5lZCBieSBGUERGVGV4dF9Mb2FkUGFnZSBmdW5jdGlvbi4KKy8vICAgICAgICAgIHRleHRfcGFnZSAgIC0gICBIYW5kbGUgdG8gYSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlLgorLy8gICAgICAgICAgUmV0dXJuZWQgYnkgRlBERlRleHRfTG9hZFBhZ2UgZnVuY3Rpb24uCiAvLyBSZXR1cm4gVmFsdWU6CiAvLyAgICAgICAgICBOb25lLgogLy8KQEAgLTM4LDEzICs0MiwxNyBAQAogLy8gRnVuY3Rpb246IEZQREZUZXh0X0NvdW50Q2hhcnMKIC8vICAgICAgICAgIEdldCBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhIHBhZ2UuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgorLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCisvLyAgICAgICAgICBSZXR1cm5lZCBieSBGUERGVGV4dF9Mb2FkUGFnZSBmdW5jdGlvbi4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBwYWdlLiBSZXR1cm4gLTEgZm9yIGVycm9yLgotLy8gICAgICAgICAgR2VuZXJhdGVkIGNoYXJhY3RlcnMsIGxpa2UgYWRkaXRpb25hbCBzcGFjZSBjaGFyYWN0ZXJzLCBuZXcgbGluZSBjaGFyYWN0ZXJzLCBhcmUgYWxzbyBjb3VudGVkLgorLy8gICAgICAgICAgR2VuZXJhdGVkIGNoYXJhY3RlcnMsIGxpa2UgYWRkaXRpb25hbCBzcGFjZSBjaGFyYWN0ZXJzLCBuZXcgbGluZQorLy8gICAgICAgICAgY2hhcmFjdGVycywgYXJlIGFsc28gY291bnRlZC4KIC8vIENvbW1lbnRzOgotLy8gICAgICAgICAgQ2hhcmFjdGVycyBpbiBhIHBhZ2UgZm9ybSBhICJzdHJlYW0iLCBpbnNpZGUgdGhlIHN0cmVhbSwgZWFjaCBjaGFyYWN0ZXIgaGFzIGFuIGluZGV4LgotLy8gICAgICAgICAgV2Ugd2lsbCB1c2UgdGhlIGluZGV4IHBhcmFtZXRlcnMgaW4gbWFueSBvZiBGUERGVEVYVCBmdW5jdGlvbnMuIFRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHBhZ2UKKy8vICAgICAgICAgIENoYXJhY3RlcnMgaW4gYSBwYWdlIGZvcm0gYSAic3RyZWFtIiwgaW5zaWRlIHRoZSBzdHJlYW0sIGVhY2gKKy8vICAgICAgICAgIGNoYXJhY3RlciBoYXMgYW4gaW5kZXguCisvLyAgICAgICAgICBXZSB3aWxsIHVzZSB0aGUgaW5kZXggcGFyYW1ldGVycyBpbiBtYW55IG9mIEZQREZURVhUIGZ1bmN0aW9ucy4gVGhlCisvLyAgICAgICAgICBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHBhZ2UKIC8vICAgICAgICAgIGhhcyBhbiBpbmRleCB2YWx1ZSBvZiB6ZXJvLgogLy8KIERMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGVGV4dF9Db3VudENoYXJzKEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlKTsKQEAgLTUyLDE0OSArNjAsMjEzIEBACiAvLyBGdW5jdGlvbjogRlBERlRleHRfR2V0VW5pY29kZQogLy8gICAgICAgICAgR2V0IFVuaWNvZGUgb2YgYSBjaGFyYWN0ZXIgaW4gYSBwYWdlLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHRleHRfcGFnZSAgIC0gICBIYW5kbGUgdG8gYSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlLiBSZXR1cm5lZCBieSBGUERGVGV4dF9Mb2FkUGFnZSBmdW5jdGlvbi4KKy8vICAgICAgICAgIHRleHRfcGFnZSAgIC0gICBIYW5kbGUgdG8gYSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlLgorLy8gICAgICAgICAgUmV0dXJuZWQgYnkgRlBERlRleHRfTG9hZFBhZ2UgZnVuY3Rpb24uCiAvLyAgICAgICAgICBpbmRleCAgICAgICAtICAgWmVyby1iYXNlZCBpbmRleCBvZiB0aGUgY2hhcmFjdGVyLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVGhlIFVuaWNvZGUgb2YgdGhlIHBhcnRpY3VsYXIgY2hhcmFjdGVyLgotLy8gICAgICAgICAgSWYgYSBjaGFyYWN0ZXIgaXMgbm90IGVuY29kZWQgaW4gVW5pY29kZSBhbmQgRm94aXQgZW5naW5lIGNhbid0IGNvbnZlcnQgdG8gVW5pY29kZSwKKy8vICAgICAgICAgIElmIGEgY2hhcmFjdGVyIGlzIG5vdCBlbmNvZGVkIGluIFVuaWNvZGUgYW5kIEZveGl0IGVuZ2luZSBjYW4ndAorLy8gICAgICAgICAgY29udmVydCB0byBVbmljb2RlLAogLy8gICAgICAgICAgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHplcm8uCiAvLwotRExMRVhQT1JUIHVuc2lnbmVkIGludCBTVERDQUxMIEZQREZUZXh0X0dldFVuaWNvZGUoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsIGludCBpbmRleCk7CitETExFWFBPUlQgdW5zaWduZWQgaW50IFNURENBTEwgRlBERlRleHRfR2V0VW5pY29kZShGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9HZXRGb250U2l6ZQogLy8gICAgICAgICAgR2V0IHRoZSBmb250IHNpemUgb2YgYSBwYXJ0aWN1bGFyIGNoYXJhY3Rlci4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICB0ZXh0X3BhZ2UgICAtICAgSGFuZGxlIHRvIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gUmV0dXJuZWQgYnkgRlBERlRleHRfTG9hZFBhZ2UgZnVuY3Rpb24uCisvLyAgICAgICAgICB0ZXh0X3BhZ2UgICAtICAgSGFuZGxlIHRvIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KKy8vICAgICAgICAgIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgogLy8gICAgICAgICAgaW5kZXggICAgICAgLSAgIFplcm8tYmFzZWQgaW5kZXggb2YgdGhlIGNoYXJhY3Rlci4KIC8vIFJldHVybiB2YWx1ZToKLS8vICAgICAgICAgIFRoZSBmb250IHNpemUgb2YgdGhlIHBhcnRpY3VsYXIgY2hhcmFjdGVyLCBtZWFzdXJlZCBpbiBwb2ludHMgKGFib3V0IDEvNzIgaW5jaCkuCisvLyAgICAgICAgICBUaGUgZm9udCBzaXplIG9mIHRoZSBwYXJ0aWN1bGFyIGNoYXJhY3RlciwgbWVhc3VyZWQgaW4gcG9pbnRzIChhYm91dAorLy8gICAgICAgICAgMS83MiBpbmNoKS4KIC8vICAgICAgICAgIFRoaXMgaXMgdGhlIHR5cG9ncmFwaGljIHNpemUgb2YgdGhlIGZvbnQgKHNvIGNhbGxlZCAiZW0gc2l6ZSIpLgogLy8KLURMTEVYUE9SVCBkb3VibGUgU1REQ0FMTCBGUERGVGV4dF9HZXRGb250U2l6ZShGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwgaW50IGluZGV4KTsKK0RMTEVYUE9SVCBkb3VibGUgU1REQ0FMTCBGUERGVGV4dF9HZXRGb250U2l6ZShGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpOwogCiAvLyBGdW5jdGlvbjogRlBERlRleHRfR2V0Q2hhckJveAogLy8gICAgICAgICAgR2V0IGJvdW5kaW5nIGJveCBvZiBhIHBhcnRpY3VsYXIgY2hhcmFjdGVyLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHRleHRfcGFnZSAgIC0gICBIYW5kbGUgdG8gYSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlLiBSZXR1cm5lZCBieSBGUERGVGV4dF9Mb2FkUGFnZSBmdW5jdGlvbi4KKy8vICAgICAgICAgIHRleHRfcGFnZSAgIC0gICBIYW5kbGUgdG8gYSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlLgorLy8gICAgICAgICAgUmV0dXJuZWQgYnkgRlBERlRleHRfTG9hZFBhZ2UgZnVuY3Rpb24uCiAvLyAgICAgICAgICBpbmRleCAgICAgICAtICAgWmVyby1iYXNlZCBpbmRleCBvZiB0aGUgY2hhcmFjdGVyLgotLy8gICAgICAgICAgbGVmdCAgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgbnVtYmVyIHJlY2VpdmluZyBsZWZ0IHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgYm94LgotLy8gICAgICAgICAgcmlnaHQgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgbnVtYmVyIHJlY2VpdmluZyByaWdodCBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIGJveC4KLS8vICAgICAgICAgIGJvdHRvbSAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIG51bWJlciByZWNlaXZpbmcgYm90dG9tIHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgYm94LgotLy8gICAgICAgICAgdG9wICAgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgbnVtYmVyIHJlY2VpdmluZyB0b3AgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciBib3guCisvLyAgICAgICAgICBsZWZ0ICAgICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSBudW1iZXIgcmVjZWl2aW5nIGxlZnQgcG9zaXRpb24KKy8vICAgICAgICAgIG9mIHRoZSBjaGFyYWN0ZXIgYm94LgorLy8gICAgICAgICAgcmlnaHQgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgbnVtYmVyIHJlY2VpdmluZyByaWdodCBwb3NpdGlvbgorLy8gICAgICAgICAgb2YgdGhlIGNoYXJhY3RlciBib3guCisvLyAgICAgICAgICBib3R0b20gICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSBudW1iZXIgcmVjZWl2aW5nIGJvdHRvbSBwb3NpdGlvbgorLy8gICAgICAgICAgb2YgdGhlIGNoYXJhY3RlciBib3guCisvLyAgICAgICAgICB0b3AgICAgICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSBudW1iZXIgcmVjZWl2aW5nIHRvcCBwb3NpdGlvbiBvZgorLy8gICAgICAgICAgdGhlIGNoYXJhY3RlciBib3guCiAvLyBSZXR1cm4gVmFsdWU6CiAvLyAgICAgICAgICBOb25lLgogLy8gQ29tbWVudHM6CiAvLyAgICAgICAgICBBbGwgcG9zaXRpb25zIGFyZSBtZWFzdXJlZCBpbiBQREYgInVzZXIgc3BhY2UiLgogLy8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlRleHRfR2V0Q2hhckJveChGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwgaW50IGluZGV4LCBkb3VibGUqIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByaWdodCwgZG91YmxlKiBib3R0b20sIGRvdWJsZSogdG9wKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlRleHRfR2V0Q2hhckJveChGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0b3ApOwogCiAvLyBGdW5jdGlvbjogRlBERlRleHRfR2V0Q2hhckluZGV4QXRQb3MKLS8vICAgICAgICAgIEdldCB0aGUgaW5kZXggb2YgYSBjaGFyYWN0ZXIgYXQgb3IgbmVhcmJ5IGEgY2VydGFpbiBwb3NpdGlvbiBvbiB0aGUgcGFnZS4KKy8vICAgICAgICAgIEdldCB0aGUgaW5kZXggb2YgYSBjaGFyYWN0ZXIgYXQgb3IgbmVhcmJ5IGEgY2VydGFpbiBwb3NpdGlvbiBvbiB0aGUKKy8vICAgICAgICAgIHBhZ2UuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgorLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCisvLyAgICAgICAgICBSZXR1cm5lZCBieSBGUERGVGV4dF9Mb2FkUGFnZSBmdW5jdGlvbi4KIC8vICAgICAgICAgIHggICAgICAgICAgIC0gICBYIHBvc2l0aW9uIGluIFBERiAidXNlciBzcGFjZSIuCiAvLyAgICAgICAgICB5ICAgICAgICAgICAtICAgWSBwb3NpdGlvbiBpbiBQREYgInVzZXIgc3BhY2UiLgotLy8gICAgICAgICAgeFRvbGVyYW5jZSAgLSAgIEFuIHgtYXhpcyB0b2xlcmFuY2UgdmFsdWUgZm9yIGNoYXJhY3RlciBoaXQgZGV0ZWN0aW9uLCBpbiBwb2ludCB1bml0LgotLy8gICAgICAgICAgeVRvbGVyYW5jZSAgLSAgIEEgeS1heGlzIHRvbGVyYW5jZSB2YWx1ZSBmb3IgY2hhcmFjdGVyIGhpdCBkZXRlY3Rpb24sIGluIHBvaW50IHVuaXQuCisvLyAgICAgICAgICB4VG9sZXJhbmNlICAtICAgQW4geC1heGlzIHRvbGVyYW5jZSB2YWx1ZSBmb3IgY2hhcmFjdGVyIGhpdAorLy8gICAgICAgICAgZGV0ZWN0aW9uLCBpbiBwb2ludCB1bml0LgorLy8gICAgICAgICAgeVRvbGVyYW5jZSAgLSAgIEEgeS1heGlzIHRvbGVyYW5jZSB2YWx1ZSBmb3IgY2hhcmFjdGVyIGhpdAorLy8gICAgICAgICAgZGV0ZWN0aW9uLCBpbiBwb2ludCB1bml0LgogLy8gUmV0dXJuIFZhbHVlOgogLy8gICAgICAgICAgVGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIGNoYXJhY3RlciBhdCwgb3IgbmVhcmJ5IHRoZSBwb2ludCAoeCx5KS4KLS8vICAgICAgICAgIElmIHRoZXJlIGlzIG5vIGNoYXJhY3RlciBhdCBvciBuZWFyYnkgdGhlIHBvaW50LCByZXR1cm4gdmFsdWUgd2lsbCBiZSAtMS4KKy8vICAgICAgICAgIElmIHRoZXJlIGlzIG5vIGNoYXJhY3RlciBhdCBvciBuZWFyYnkgdGhlIHBvaW50LCByZXR1cm4gdmFsdWUgd2lsbAorLy8gICAgICAgICAgYmUgLTEuCiAvLyAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMsIC0zIHdpbGwgYmUgcmV0dXJuZWQuCiAvLwogRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZUZXh0X0dldENoYXJJbmRleEF0UG9zKEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHhUb3JlbGFuY2UsIGRvdWJsZSB5VG9sZXJhbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeFRvbGVyYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeVRvbGVyYW5jZSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9HZXRUZXh0CiAvLyAgICAgICAgICBFeHRyYWN0IHVuaWNvZGUgdGV4dCBzdHJpbmcgZnJvbSB0aGUgcGFnZS4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICB0ZXh0X3BhZ2UgICAtICAgSGFuZGxlIHRvIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gUmV0dXJuZWQgYnkgRlBERlRleHRfTG9hZFBhZ2UgZnVuY3Rpb24uCisvLyAgICAgICAgICB0ZXh0X3BhZ2UgICAtICAgSGFuZGxlIHRvIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KKy8vICAgICAgICAgIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgogLy8gICAgICAgICAgc3RhcnRfaW5kZXggLSAgIEluZGV4IGZvciB0aGUgc3RhcnQgY2hhcmFjdGVycy4KIC8vICAgICAgICAgIGNvdW50ICAgICAgIC0gICBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSBleHRyYWN0ZWQuCi0vLyAgICAgICAgICByZXN1bHQgICAgICAtICAgQSBidWZmZXIgKGFsbG9jYXRlZCBieSBhcHBsaWNhdGlvbikgcmVjZWl2aW5nIHRoZSBleHRyYWN0ZWQgdW5pY29kZXMuCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBtdXN0IGJlIGFibGUgdG8gaG9sZCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcGx1cyBhIHRlcm1pbmF0b3IuCisvLyAgICAgICAgICByZXN1bHQgICAgICAtICAgQSBidWZmZXIgKGFsbG9jYXRlZCBieSBhcHBsaWNhdGlvbikgcmVjZWl2aW5nIHRoZQorLy8gICAgICAgICAgZXh0cmFjdGVkIHVuaWNvZGVzLgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzaXplIG9mIHRoZSBidWZmZXIgbXVzdCBiZSBhYmxlIHRvIGhvbGQgdGhlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcGx1cyBhIHRlcm1pbmF0b3IuCiAvLyBSZXR1cm4gVmFsdWU6Ci0vLyAgICAgICAgICBOdW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuIGludG8gdGhlIHJlc3VsdCBidWZmZXIsIGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgdGVybWluYXRvci4KKy8vICAgICAgICAgIE51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4gaW50byB0aGUgcmVzdWx0IGJ1ZmZlciwgaW5jbHVkaW5nIHRoZQorLy8gICAgICAgICAgdHJhaWxpbmcgdGVybWluYXRvci4KIC8vIENvbW1lbnRzOgogLy8gICAgICAgICAgVGhpcyBmdW5jdGlvbiBpZ25vcmVzIGNoYXJhY3RlcnMgd2l0aG91dCB1bmljb2RlIGluZm9ybWF0aW9uLgogLy8KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGVGV4dF9HZXRUZXh0KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLCBpbnQgc3RhcnRfaW5kZXgsIGludCBjb3VudCwgdW5zaWduZWQgc2hvcnQqIHJlc3VsdCk7CitETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfR2V0VGV4dChGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0KiByZXN1bHQpOwogCiAvLyBGdW5jdGlvbjogRlBERlRleHRfQ291bnRSZWN0cwogLy8gICAgICAgICAgQ291bnQgbnVtYmVyIG9mIHJlY3Rhbmd1bGFyIGFyZWFzIG9jY3VwaWVkIGJ5IGEgc2VnbWVudCBvZiB0ZXh0cy4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICB0ZXh0X3BhZ2UgICAtICAgSGFuZGxlIHRvIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gUmV0dXJuZWQgYnkgRlBERlRleHRfTG9hZFBhZ2UgZnVuY3Rpb24uCisvLyAgICAgICAgICB0ZXh0X3BhZ2UgICAtICAgSGFuZGxlIHRvIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4KKy8vICAgICAgICAgIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgogLy8gICAgICAgICAgc3RhcnRfaW5kZXggLSAgIEluZGV4IGZvciB0aGUgc3RhcnQgY2hhcmFjdGVycy4KIC8vICAgICAgICAgIGNvdW50ICAgICAgIC0gICBOdW1iZXIgb2YgY2hhcmFjdGVycy4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE51bWJlciBvZiByZWN0YW5nbGVzLiBaZXJvIGZvciBlcnJvci4KIC8vIENvbW1lbnRzOgotLy8gICAgICAgICAgVGhpcyBmdW5jdGlvbiwgYWxvbmcgd2l0aCBGUERGVGV4dF9HZXRSZWN0IGNhbiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucyB0byBkZXRlY3QgdGhlIHBvc2l0aW9uCi0vLyAgICAgICAgICBvbiB0aGUgcGFnZSBmb3IgYSB0ZXh0IHNlZ21lbnQsIHNvIHByb3BlciBhcmVhcyBjYW4gYmUgaGlnaGxpZ2h0ZWQgb3Igc29tZXRoaW5nLgotLy8gICAgICAgICAgRlBERlRFWFQgd2lsbCBhdXRvbWF0aWNhbGx5IG1lcmdlIHNtYWxsIGNoYXJhY3RlciBib3hlcyBpbnRvIGJpZ2dlciBvbmUgaWYgdGhvc2UgY2hhcmFjdGVycworLy8gICAgICAgICAgVGhpcyBmdW5jdGlvbiwgYWxvbmcgd2l0aCBGUERGVGV4dF9HZXRSZWN0IGNhbiBiZSB1c2VkIGJ5CisvLyAgICAgICAgICBhcHBsaWNhdGlvbnMgdG8gZGV0ZWN0IHRoZSBwb3NpdGlvbgorLy8gICAgICAgICAgb24gdGhlIHBhZ2UgZm9yIGEgdGV4dCBzZWdtZW50LCBzbyBwcm9wZXIgYXJlYXMgY2FuIGJlIGhpZ2hsaWdodGVkCisvLyAgICAgICAgICBvciBzb21ldGhpbmcuCisvLyAgICAgICAgICBGUERGVEVYVCB3aWxsIGF1dG9tYXRpY2FsbHkgbWVyZ2Ugc21hbGwgY2hhcmFjdGVyIGJveGVzIGludG8gYmlnZ2VyCisvLyAgICAgICAgICBvbmUgaWYgdGhvc2UgY2hhcmFjdGVycwogLy8gICAgICAgICAgYXJlIG9uIHRoZSBzYW1lIGxpbmUgYW5kIHVzZSBzYW1lIGZvbnQgc2V0dGluZ3MuCiAvLwotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZUZXh0X0NvdW50UmVjdHMoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsIGludCBzdGFydF9pbmRleCwgaW50IGNvdW50KTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGVGV4dF9Db3VudFJlY3RzKEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KTsKIAogLy8gRnVuY3Rpb246IEZQREZUZXh0X0dldFJlY3QKLS8vICAgICAgICAgIEdldCBhIHJlY3Rhbmd1bGFyIGFyZWEgZnJvbSB0aGUgcmVzdWx0IGdlbmVyYXRlZCBieSBGUERGVGV4dF9Db3VudFJlY3RzLgorLy8gICAgICAgICAgR2V0IGEgcmVjdGFuZ3VsYXIgYXJlYSBmcm9tIHRoZSByZXN1bHQgZ2VuZXJhdGVkIGJ5CisvLyAgICAgICAgICBGUERGVGV4dF9Db3VudFJlY3RzLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHRleHRfcGFnZSAgIC0gICBIYW5kbGUgdG8gYSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlLiBSZXR1cm5lZCBieSBGUERGVGV4dF9Mb2FkUGFnZSBmdW5jdGlvbi4KKy8vICAgICAgICAgIHRleHRfcGFnZSAgIC0gICBIYW5kbGUgdG8gYSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlLgorLy8gICAgICAgICAgUmV0dXJuZWQgYnkgRlBERlRleHRfTG9hZFBhZ2UgZnVuY3Rpb24uCiAvLyAgICAgICAgICByZWN0X2luZGV4ICAtICAgWmVyby1iYXNlZCBpbmRleCBmb3IgdGhlIHJlY3RhbmdsZS4KLS8vICAgICAgICAgIGxlZnQgICAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcmVjdGFuZ2xlIGxlZnQgYm91bmRhcnkuCi0vLyAgICAgICAgICB0b3AgICAgICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHJlY3RhbmdsZSB0b3AgYm91bmRhcnkuCi0vLyAgICAgICAgICByaWdodCAgICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHJlY3RhbmdsZSByaWdodCBib3VuZGFyeS4KLS8vICAgICAgICAgIGJvdHRvbSAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcmVjdGFuZ2xlIGJvdHRvbSBib3VuZGFyeS4KKy8vICAgICAgICAgIGxlZnQgICAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcmVjdGFuZ2xlCisvLyAgICAgICAgICBsZWZ0IGJvdW5kYXJ5LgorLy8gICAgICAgICAgdG9wICAgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSByZWN0YW5nbGUKKy8vICAgICAgICAgIHRvcCBib3VuZGFyeS4KKy8vICAgICAgICAgIHJpZ2h0ICAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcmVjdGFuZ2xlCisvLyAgICAgICAgICByaWdodCBib3VuZGFyeS4KKy8vICAgICAgICAgIGJvdHRvbSAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcmVjdGFuZ2xlCisvLyAgICAgICAgICBib3R0b20gYm91bmRhcnkuCiAvLyBSZXR1cm4gVmFsdWU6CiAvLyAgICAgICAgICBOb25lLgogLy8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlRleHRfR2V0UmVjdChGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwgaW50IHJlY3RfaW5kZXgsIGRvdWJsZSogbGVmdCwgZG91YmxlKiB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmlnaHQsIGRvdWJsZSogYm90dG9tKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlRleHRfR2V0UmVjdChGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVjdF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJvdHRvbSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9HZXRCb3VuZGVkVGV4dAogLy8gICAgICAgICAgRXh0cmFjdCB1bmljb2RlIHRleHQgd2l0aGluIGEgcmVjdGFuZ3VsYXIgYm91bmRhcnkgb24gdGhlIHBhZ2UuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgorLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCisvLyAgICAgICAgICBSZXR1cm5lZCBieSBGUERGVGV4dF9Mb2FkUGFnZSBmdW5jdGlvbi4KIC8vICAgICAgICAgIGxlZnQgICAgICAgIC0gICBMZWZ0IGJvdW5kYXJ5LgogLy8gICAgICAgICAgdG9wICAgICAgICAgLSAgIFRvcCBib3VuZGFyeS4KIC8vICAgICAgICAgIHJpZ2h0ICAgICAgIC0gICBSaWdodCBib3VuZGFyeS4KIC8vICAgICAgICAgIGJvdHRvbSAgICAgIC0gICBCb3R0b20gYm91bmRhcnkuCiAvLyAgICAgICAgICBidWZmZXIgICAgICAtICAgQSB1bmljb2RlIGJ1ZmZlci4KLS8vICAgICAgICAgIGJ1ZmxlbiAgICAgIC0gICBOdW1iZXIgb2YgY2hhcmFjdGVycyAobm90IGJ5dGVzKSBmb3IgdGhlIGJ1ZmZlciwgZXhjbHVkaW5nIGFuIGFkZGl0aW9uYWwgdGVybWluYXRvci4KKy8vICAgICAgICAgIGJ1ZmxlbiAgICAgIC0gICBOdW1iZXIgb2YgY2hhcmFjdGVycyAobm90IGJ5dGVzKSBmb3IgdGhlIGJ1ZmZlciwKKy8vICAgICAgICAgIGV4Y2x1ZGluZyBhbiBhZGRpdGlvbmFsIHRlcm1pbmF0b3IuCiAvLyBSZXR1cm4gVmFsdWU6Ci0vLyAgICAgICAgICBJZiBidWZmZXIgaXMgTlVMTCBvciBidWZsZW4gaXMgemVybywgcmV0dXJuIG51bWJlciBvZiBjaGFyYWN0ZXJzIChub3QgYnl0ZXMpIG9mIHRleHQgcHJlc2VudCB3aXRoaW4KLS8vICAgICAgICAgIHRoZSByZWN0YW5nbGUsIGV4Y2x1ZGluZyBhIHRlcm1pbmF0aW5nIE5VTC4gIEdlbmVyYWxseSB5b3Ugc2hvdWxkIHBhc3MgYSBidWZmZXIgYXQgbGVhc3Qgb25lIGxhcmdlcgotLy8gICAgICAgICAgdGhhbiB0aGlzIGlmIHlvdSB3YW50IGEgdGVybWluYXRpbmcgTlVMLCB3aGljaCB3aWxsIGJlIHByb3ZpZGVkIGlmIHNwYWNlIGlzIGF2YWlsYWJsZS4KLS8vICAgICAgICAgIE90aGVyd2lzZSwgcmV0dXJuIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvcGllZCBpbnRvIHRoZSBidWZmZXIsIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgTlVMCisvLyAgICAgICAgICBJZiBidWZmZXIgaXMgTlVMTCBvciBidWZsZW4gaXMgemVybywgcmV0dXJuIG51bWJlciBvZiBjaGFyYWN0ZXJzCisvLyAgICAgICAgICAobm90IGJ5dGVzKSBvZiB0ZXh0IHByZXNlbnQgd2l0aGluCisvLyAgICAgICAgICB0aGUgcmVjdGFuZ2xlLCBleGNsdWRpbmcgYSB0ZXJtaW5hdGluZyBOVUwuICBHZW5lcmFsbHkgeW91IHNob3VsZAorLy8gICAgICAgICAgcGFzcyBhIGJ1ZmZlciBhdCBsZWFzdCBvbmUgbGFyZ2VyCisvLyAgICAgICAgICB0aGFuIHRoaXMgaWYgeW91IHdhbnQgYSB0ZXJtaW5hdGluZyBOVUwsIHdoaWNoIHdpbGwgYmUgcHJvdmlkZWQgaWYKKy8vICAgICAgICAgIHNwYWNlIGlzIGF2YWlsYWJsZS4KKy8vICAgICAgICAgIE90aGVyd2lzZSwgcmV0dXJuIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvcGllZCBpbnRvIHRoZSBidWZmZXIsCisvLyAgICAgICAgICBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIE5VTAogLy8gICAgICAgICAgd2hlbiBzcGFjZSBmb3IgaXQgaXMgYXZhaWxhYmxlLgogLy8gQ29tbWVudDoKLS8vICAgICAgICAgIElmIHRoZSBidWZmZXIgaXMgdG9vIHNtYWxsLCBhcyBtdWNoIHRleHQgYXMgd2lsbCBmaXQgaXMgY29waWVkIGludG8gaXQuCisvLyAgICAgICAgICBJZiB0aGUgYnVmZmVyIGlzIHRvbyBzbWFsbCwgYXMgbXVjaCB0ZXh0IGFzIHdpbGwgZml0IGlzIGNvcGllZCBpbnRvCisvLyAgICAgICAgICBpdC4KIC8vCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfR2V0Qm91bmRlZFRleHQoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsZG91YmxlIGxlZnQsIGRvdWJsZSB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJpZ2h0LCBkb3VibGUgYm90dG9tLHVuc2lnbmVkIHNob3J0KiBidWZmZXIsaW50IGJ1Zmxlbik7Ci0KK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGVGV4dF9HZXRCb3VuZGVkVGV4dChGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0KiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zmxlbik7CiAKIC8vIEZsYWdzIHVzZWQgYnkgRlBERlRleHRfRmluZFN0YXJ0IGZ1bmN0aW9uLgotI2RlZmluZSBGUERGX01BVENIQ0FTRSAgICAgIDB4MDAwMDAwMDEgICAgICAvL0lmIG5vdCBzZXQsIGl0IHdpbGwgbm90IG1hdGNoIGNhc2UgYnkgZGVmYXVsdC4KLSNkZWZpbmUgRlBERl9NQVRDSFdIT0xFV09SRCAweDAwMDAwMDAyICAgICAgLy9JZiBub3Qgc2V0LCBpdCB3aWxsIG5vdCBtYXRjaCB0aGUgd2hvbGUgd29yZCBieSBkZWZhdWx0LgorI2RlZmluZSBGUERGX01BVENIQ0FTRSBcCisgIDB4MDAwMDAwMDEgIC8vIElmIG5vdCBzZXQsIGl0IHdpbGwgbm90IG1hdGNoIGNhc2UgYnkgZGVmYXVsdC4KKyNkZWZpbmUgRlBERl9NQVRDSFdIT0xFV09SRCBcCisgIDB4MDAwMDAwMDIgIC8vIElmIG5vdCBzZXQsIGl0IHdpbGwgbm90IG1hdGNoIHRoZSB3aG9sZSB3b3JkIGJ5IGRlZmF1bHQuCiAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9GaW5kU3RhcnQKIC8vICAgICAgICAgIFN0YXJ0IGEgc2VhcmNoLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHRleHRfcGFnZSAgIC0gICBIYW5kbGUgdG8gYSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlLiBSZXR1cm5lZCBieSBGUERGVGV4dF9Mb2FkUGFnZSBmdW5jdGlvbi4KKy8vICAgICAgICAgIHRleHRfcGFnZSAgIC0gICBIYW5kbGUgdG8gYSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlLgorLy8gICAgICAgICAgUmV0dXJuZWQgYnkgRlBERlRleHRfTG9hZFBhZ2UgZnVuY3Rpb24uCiAvLyAgICAgICAgICBmaW5kd2hhdCAgICAtICAgQSB1bmljb2RlIG1hdGNoIHBhdHRlcm4uCiAvLyAgICAgICAgICBmbGFncyAgICAgICAtICAgT3B0aW9uIGZsYWdzLgogLy8gICAgICAgICAgc3RhcnRfaW5kZXggLSAgIFN0YXJ0IGZyb20gdGhpcyBjaGFyYWN0ZXIuIC0xIGZvciBlbmQgb2YgdGhlIHBhZ2UuCiAvLyBSZXR1cm4gVmFsdWU6Ci0vLyAgICAgICAgICBBIGhhbmRsZSBmb3IgdGhlIHNlYXJjaCBjb250ZXh0LiBGUERGVGV4dF9GaW5kQ2xvc2UgbXVzdCBiZSBjYWxsZWQgdG8gcmVsZWFzZSB0aGlzIGhhbmRsZS4KKy8vICAgICAgICAgIEEgaGFuZGxlIGZvciB0aGUgc2VhcmNoIGNvbnRleHQuIEZQREZUZXh0X0ZpbmRDbG9zZSBtdXN0IGJlIGNhbGxlZAorLy8gICAgICAgICAgdG8gcmVsZWFzZSB0aGlzIGhhbmRsZS4KIC8vCi1ETExFWFBPUlQgRlBERl9TQ0hIQU5ETEUgU1REQ0FMTCBGUERGVGV4dF9GaW5kU3RhcnQoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsIEZQREZfV0lERVNUUklORyBmaW5kd2hhdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgc3RhcnRfaW5kZXgpOworRExMRVhQT1JUIEZQREZfU0NISEFORExFIFNURENBTEwgRlBERlRleHRfRmluZFN0YXJ0KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyBmaW5kd2hhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9pbmRleCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9GaW5kTmV4dAogLy8gICAgICAgICAgU2VhcmNoIGluIHRoZSBkaXJlY3Rpb24gZnJvbSBwYWdlIHN0YXJ0IHRvIGVuZC4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBoYW5kbGUgICAgICAtICAgQSBzZWFyY2ggY29udGV4dCBoYW5kbGUgcmV0dXJuZWQgYnkgRlBERlRleHRfRmluZFN0YXJ0LgorLy8gICAgICAgICAgaGFuZGxlICAgICAgLSAgIEEgc2VhcmNoIGNvbnRleHQgaGFuZGxlIHJldHVybmVkIGJ5CisvLyAgICAgICAgICBGUERGVGV4dF9GaW5kU3RhcnQuCiAvLyBSZXR1cm4gVmFsdWU6CiAvLyAgICAgICAgICBXaGV0aGVyIGEgbWF0Y2ggaXMgZm91bmQuCiAvLwpAQCAtMjAzLDcgKzI3NSw4IEBACiAvLyBGdW5jdGlvbjogRlBERlRleHRfRmluZFByZXYKIC8vICAgICAgICAgIFNlYXJjaCBpbiB0aGUgZGlyZWN0aW9uIGZyb20gcGFnZSBlbmQgdG8gc3RhcnQuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgaGFuZGxlICAgICAgLSAgIEEgc2VhcmNoIGNvbnRleHQgaGFuZGxlIHJldHVybmVkIGJ5IEZQREZUZXh0X0ZpbmRTdGFydC4KKy8vICAgICAgICAgIGhhbmRsZSAgICAgIC0gICBBIHNlYXJjaCBjb250ZXh0IGhhbmRsZSByZXR1cm5lZCBieQorLy8gICAgICAgICAgRlBERlRleHRfRmluZFN0YXJ0LgogLy8gUmV0dXJuIFZhbHVlOgogLy8gICAgICAgICAgV2hldGhlciBhIG1hdGNoIGlzIGZvdW5kLgogLy8KQEAgLTIxMiw3ICsyODUsOCBAQAogLy8gRnVuY3Rpb246IEZQREZUZXh0X0dldFNjaFJlc3VsdEluZGV4CiAvLyAgICAgICAgICBHZXQgdGhlIHN0YXJ0aW5nIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgc2VhcmNoIHJlc3VsdC4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBoYW5kbGUgICAgICAtICAgQSBzZWFyY2ggY29udGV4dCBoYW5kbGUgcmV0dXJuZWQgYnkgRlBERlRleHRfRmluZFN0YXJ0LgorLy8gICAgICAgICAgaGFuZGxlICAgICAgLSAgIEEgc2VhcmNoIGNvbnRleHQgaGFuZGxlIHJldHVybmVkIGJ5CisvLyAgICAgICAgICBGUERGVGV4dF9GaW5kU3RhcnQuCiAvLyBSZXR1cm4gVmFsdWU6CiAvLyAgICAgICAgICBJbmRleCBmb3IgdGhlIHN0YXJ0aW5nIGNoYXJhY3Rlci4KIC8vCkBAIC0yMjEsNyArMjk1LDggQEAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9HZXRTY2hDb3VudAogLy8gICAgICAgICAgR2V0IHRoZSBudW1iZXIgb2YgbWF0Y2hlZCBjaGFyYWN0ZXJzIGluIHRoZSBzZWFyY2ggcmVzdWx0LgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGhhbmRsZSAgICAgIC0gICBBIHNlYXJjaCBjb250ZXh0IGhhbmRsZSByZXR1cm5lZCBieSBGUERGVGV4dF9GaW5kU3RhcnQuCisvLyAgICAgICAgICBoYW5kbGUgICAgICAtICAgQSBzZWFyY2ggY29udGV4dCBoYW5kbGUgcmV0dXJuZWQgYnkKKy8vICAgICAgICAgIEZQREZUZXh0X0ZpbmRTdGFydC4KIC8vIFJldHVybiBWYWx1ZToKIC8vICAgICAgICAgIE51bWJlciBvZiBtYXRjaGVkIGNoYXJhY3RlcnMuCiAvLwpAQCAtMjMwLDcgKzMwNSw4IEBACiAvLyBGdW5jdGlvbjogRlBERlRleHRfRmluZENsb3NlCiAvLyAgICAgICAgICBSZWxlYXNlIGEgc2VhcmNoIGNvbnRleHQuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgaGFuZGxlICAgICAgLSAgIEEgc2VhcmNoIGNvbnRleHQgaGFuZGxlIHJldHVybmVkIGJ5IEZQREZUZXh0X0ZpbmRTdGFydC4KKy8vICAgICAgICAgIGhhbmRsZSAgICAgIC0gICBBIHNlYXJjaCBjb250ZXh0IGhhbmRsZSByZXR1cm5lZCBieQorLy8gICAgICAgICAgRlBERlRleHRfRmluZFN0YXJ0LgogLy8gUmV0dXJuIFZhbHVlOgogLy8gICAgICAgICAgTm9uZS4KIC8vCkBAIC0yMzksMTYgKzMxNSwyMiBAQAogLy8gRnVuY3Rpb246IEZQREZMaW5rX0xvYWRXZWJMaW5rcwogLy8gICAgICAgICAgUHJlcGFyZSBpbmZvcm1hdGlvbiBhYm91dCB3ZWJsaW5rcyBpbiBhIHBhZ2UuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuIFJldHVybmVkIGJ5IEZQREZUZXh0X0xvYWRQYWdlIGZ1bmN0aW9uLgorLy8gICAgICAgICAgdGV4dF9wYWdlICAgLSAgIEhhbmRsZSB0byBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCisvLyAgICAgICAgICBSZXR1cm5lZCBieSBGUERGVGV4dF9Mb2FkUGFnZSBmdW5jdGlvbi4KIC8vIFJldHVybiBWYWx1ZToKIC8vICAgICAgICAgIEEgaGFuZGxlIHRvIHRoZSBwYWdlJ3MgbGlua3MgaW5mb3JtYXRpb24gc3RydWN0dXJlLgogLy8gICAgICAgICAgTlVMTCBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KIC8vIENvbW1lbnRzOgotLy8gICAgICAgICAgV2VibGlua3MgYXJlIHRob3NlIGxpbmtzIGltcGxpY2l0bHkgZW1iZWRkZWQgaW4gUERGIHBhZ2VzLiBQREYgYWxzbyBoYXMgYSB0eXBlIG9mCi0vLyAgICAgICAgICBhbm5vdGF0aW9uIGNhbGxlZCAibGluayIsIEZQREZURVhUIGRvZXNuJ3QgZGVhbCB3aXRoIHRoYXQga2luZCBvZiBsaW5rLgotLy8gICAgICAgICAgRlBERlRFWFQgd2VibGluayBmZWF0dXJlIGlzIHVzZWZ1bCBmb3IgYXV0b21hdGljYWxseSBkZXRlY3RpbmcgbGlua3MgaW4gdGhlIHBhZ2UKLS8vICAgICAgICAgIGNvbnRlbnRzLiBGb3IgZXhhbXBsZSwgdGhpbmdzIGxpa2UgImh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20iIHdpbGwgYmUgZGV0ZWN0ZWQsCi0vLyAgICAgICAgICBzbyBhcHBsaWNhdGlvbnMgY2FuIGFsbG93IHVzZXIgdG8gY2xpY2sgb24gdGhvc2UgY2hhcmFjdGVycyB0byBhY3RpdmF0ZSB0aGUgbGluaywKKy8vICAgICAgICAgIFdlYmxpbmtzIGFyZSB0aG9zZSBsaW5rcyBpbXBsaWNpdGx5IGVtYmVkZGVkIGluIFBERiBwYWdlcy4gUERGIGFsc28KKy8vICAgICAgICAgIGhhcyBhIHR5cGUgb2YKKy8vICAgICAgICAgIGFubm90YXRpb24gY2FsbGVkICJsaW5rIiwgRlBERlRFWFQgZG9lc24ndCBkZWFsIHdpdGggdGhhdCBraW5kIG9mCisvLyAgICAgICAgICBsaW5rLgorLy8gICAgICAgICAgRlBERlRFWFQgd2VibGluayBmZWF0dXJlIGlzIHVzZWZ1bCBmb3IgYXV0b21hdGljYWxseSBkZXRlY3RpbmcgbGlua3MKKy8vICAgICAgICAgIGluIHRoZSBwYWdlCisvLyAgICAgICAgICBjb250ZW50cy4gRm9yIGV4YW1wbGUsIHRoaW5ncyBsaWtlICJodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tIgorLy8gICAgICAgICAgd2lsbCBiZSBkZXRlY3RlZCwKKy8vICAgICAgICAgIHNvIGFwcGxpY2F0aW9ucyBjYW4gYWxsb3cgdXNlciB0byBjbGljayBvbiB0aG9zZSBjaGFyYWN0ZXJzIHRvCisvLyAgICAgICAgICBhY3RpdmF0ZSB0aGUgbGluaywKIC8vICAgICAgICAgIGV2ZW4gdGhlIFBERiBkb2Vzbid0IGNvbWUgd2l0aCBsaW5rIGFubm90YXRpb25zLgogLy8KIC8vICAgICAgICAgIEZQREZMaW5rX0Nsb3NlV2ViTGlua3MgbXVzdCBiZSBjYWxsZWQgdG8gcmVsZWFzZSByZXNvdXJjZXMuCkBAIC0yNzAsMTIgKzM1MiwxNyBAQAogLy8gICAgICAgICAgbGlua19wYWdlICAgLSAgIEhhbmRsZSByZXR1cm5lZCBieSBGUERGTGlua19Mb2FkV2ViTGlua3MuCiAvLyAgICAgICAgICBsaW5rX2luZGV4ICAtICAgWmVyby1iYXNlZCBpbmRleCBmb3IgdGhlIGxpbmsuCiAvLyAgICAgICAgICBidWZmZXIgICAgICAtICAgQSB1bmljb2RlIGJ1ZmZlci4KLS8vICAgICAgICAgIGJ1ZmxlbiAgICAgIC0gICBOdW1iZXIgb2YgY2hhcmFjdGVycyAobm90IGJ5dGVzKSBmb3IgdGhlIGJ1ZmZlciwgaW5jbHVkaW5nIGFuIGFkZGl0aW9uYWwgdGVybWluYXRvci4KKy8vICAgICAgICAgIGJ1ZmxlbiAgICAgIC0gICBOdW1iZXIgb2YgY2hhcmFjdGVycyAobm90IGJ5dGVzKSBmb3IgdGhlIGJ1ZmZlciwKKy8vICAgICAgICAgIGluY2x1ZGluZyBhbiBhZGRpdGlvbmFsIHRlcm1pbmF0b3IuCiAvLyBSZXR1cm4gVmFsdWU6Ci0vLyAgICAgICAgICBJZiBidWZmZXIgaXMgTlVMTCBvciBidWZsZW4gaXMgemVybywgcmV0dXJuIG51bWJlciBvZiBjaGFyYWN0ZXJzIChub3QgYnl0ZXMgYW5kIGFuIGFkZGl0aW9uYWwgdGVybWluYXRvciBpcyBhbHNvIGNvdW50ZWQpIG5lZWRlZCwKKy8vICAgICAgICAgIElmIGJ1ZmZlciBpcyBOVUxMIG9yIGJ1ZmxlbiBpcyB6ZXJvLCByZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMKKy8vICAgICAgICAgIChub3QgYnl0ZXMgYW5kIGFuIGFkZGl0aW9uYWwgdGVybWluYXRvciBpcyBhbHNvIGNvdW50ZWQpIG5lZWRlZCwKIC8vICAgICAgICAgIG90aGVyd2lzZSwgcmV0dXJuIG51bWJlciBvZiBjaGFyYWN0ZXJzIGNvcGllZCBpbnRvIHRoZSBidWZmZXIuCiAvLwotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZMaW5rX0dldFVSTChGUERGX1BBR0VMSU5LIGxpbmtfcGFnZSwgaW50IGxpbmtfaW5kZXgsIHVuc2lnbmVkIHNob3J0KiBidWZmZXIsaW50IGJ1Zmxlbik7CitETExFWFBPUlQgaW50IFNURENBTEwgRlBERkxpbmtfR2V0VVJMKEZQREZfUEFHRUxJTksgbGlua19wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGlua19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zmxlbik7CiAKIC8vIEZ1bmN0aW9uOiBGUERGTGlua19Db3VudFJlY3RzCiAvLyAgICAgICAgICBDb3VudCBudW1iZXIgb2YgcmVjdGFuZ3VsYXIgYXJlYXMgZm9yIHRoZSBsaW5rLgpAQCAtMjg1LDcgKzM3Miw4IEBACiAvLyBSZXR1cm4gVmFsdWU6CiAvLyAgICAgICAgICBOdW1iZXIgb2YgcmVjdGFuZ3VsYXIgYXJlYXMgZm9yIHRoZSBsaW5rLgogLy8KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGTGlua19Db3VudFJlY3RzKEZQREZfUEFHRUxJTksgbGlua19wYWdlLCBpbnQgbGlua19pbmRleCk7CitETExFWFBPUlQgaW50IFNURENBTEwgRlBERkxpbmtfQ291bnRSZWN0cyhGUERGX1BBR0VMSU5LIGxpbmtfcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5rX2luZGV4KTsKIAogLy8gRnVuY3Rpb246IEZQREZMaW5rX0dldFJlY3QKIC8vICAgICAgICAgIEZldGNoIHRoZSBib3VuZGFyaWVzIG9mIGEgcmVjdGFuZ2xlIGZvciBhIGxpbmsuCkBAIC0yOTMsMTUgKzM4MSwyNCBAQAogLy8gICAgICAgICAgbGlua19wYWdlICAgLSAgIEhhbmRsZSByZXR1cm5lZCBieSBGUERGTGlua19Mb2FkV2ViTGlua3MuCiAvLyAgICAgICAgICBsaW5rX2luZGV4ICAtICAgWmVyby1iYXNlZCBpbmRleCBmb3IgdGhlIGxpbmsuCiAvLyAgICAgICAgICByZWN0X2luZGV4ICAtICAgWmVyby1iYXNlZCBpbmRleCBmb3IgYSByZWN0YW5nbGUuCi0vLyAgICAgICAgICBsZWZ0ICAgICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHJlY3RhbmdsZSBsZWZ0IGJvdW5kYXJ5LgotLy8gICAgICAgICAgdG9wICAgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSByZWN0YW5nbGUgdG9wIGJvdW5kYXJ5LgotLy8gICAgICAgICAgcmlnaHQgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSByZWN0YW5nbGUgcmlnaHQgYm91bmRhcnkuCi0vLyAgICAgICAgICBib3R0b20gICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHJlY3RhbmdsZSBib3R0b20gYm91bmRhcnkuCisvLyAgICAgICAgICBsZWZ0ICAgICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHJlY3RhbmdsZQorLy8gICAgICAgICAgbGVmdCBib3VuZGFyeS4KKy8vICAgICAgICAgIHRvcCAgICAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcmVjdGFuZ2xlCisvLyAgICAgICAgICB0b3AgYm91bmRhcnkuCisvLyAgICAgICAgICByaWdodCAgICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHJlY3RhbmdsZQorLy8gICAgICAgICAgcmlnaHQgYm91bmRhcnkuCisvLyAgICAgICAgICBib3R0b20gICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHJlY3RhbmdsZQorLy8gICAgICAgICAgYm90dG9tIGJvdW5kYXJ5LgogLy8gUmV0dXJuIFZhbHVlOgogLy8gICAgICAgICAgTm9uZS4KIC8vCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZMaW5rX0dldFJlY3QoRlBERl9QQUdFTElOSyBsaW5rX3BhZ2UsIGludCBsaW5rX2luZGV4LCBpbnQgcmVjdF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGxlZnQsIGRvdWJsZSogdG9wLGRvdWJsZSogcmlnaHQsIGRvdWJsZSogYm90dG9tKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERkxpbmtfR2V0UmVjdChGUERGX1BBR0VMSU5LIGxpbmtfcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGlua19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVjdF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJvdHRvbSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGTGlua19DbG9zZVdlYkxpbmtzCiAvLyAgICAgICAgICBSZWxlYXNlIHJlc291cmNlcyB1c2VkIGJ5IHdlYmxpbmsgZmVhdHVyZS4KQEAgLTMxMiw3ICs0MDksNiBAQAogLy8KIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERkxpbmtfQ2xvc2VXZWJMaW5rcyhGUERGX1BBR0VMSU5LIGxpbmtfcGFnZSk7CiAKLQogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL3B1YmxpYy9mcGRmX3RyYW5zZm9ybXBhZ2UuaCBiL3B1YmxpYy9mcGRmX3RyYW5zZm9ybXBhZ2UuaAppbmRleCA2Mjc4YjlkLi41NjlkZjJhIDEwMDY0NAotLS0gYS9wdWJsaWMvZnBkZl90cmFuc2Zvcm1wYWdlLmgKKysrIGIvcHVibGljL2ZwZGZfdHJhbnNmb3JtcGFnZS5oCkBAIC0yNSw3ICsyNSwxMSBAQAogKiBAcGFyYW1baW5dIHRvcCAgICAtIFRoZSB0b3Agb2YgdGhlIHJlY3RhbmdsZS4KICogQHJldHZhbCBOb25lLgogKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VfU2V0TWVkaWFCb3goRlBERl9QQUdFIHBhZ2UsIGZsb2F0IGxlZnQsIGZsb2F0IGJvdHRvbSwgZmxvYXQgcmlnaHQsIGZsb2F0IHRvcCk7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlX1NldE1lZGlhQm94KEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0b3ApOwogCiAvKioKICogIFNldCAiQ3JvcEJveCIgZW50cnkgdG8gdGhlIHBhZ2UgZGljdGlvbmFyeS4KQEAgLTM2LDQyICs0MCw2NiBAQAogKiBAcGFyYW1baW5dIHRvcCAgICAtIFRoZSB0b3Agb2YgdGhlIHJlY3RhbmdsZS4KICogQHJldHZhbCBOb25lLgogKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VfU2V0Q3JvcEJveChGUERGX1BBR0UgcGFnZSwgZmxvYXQgbGVmdCwgZmxvYXQgYm90dG9tLCBmbG9hdCByaWdodCwgZmxvYXQgdG9wKTsKLQorRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9TZXRDcm9wQm94KEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRvcCk7CiAKIC8qKiAgR2V0ICJNZWRpYUJveCIgZW50cnkgZnJvbSB0aGUgcGFnZSBkaWN0aW9uYXJ5LgogKiBAcGFyYW1baW5dIHBhZ2UgICAtIEhhbmRsZSB0byBhIHBhZ2UuCi0qIEBwYXJhbVtpbl0gbGVmdCAgIC0gUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIGxlZnQgb2YgdGhlIHJlY3RhbmdsZS4KLSogQHBhcmFtW2luXSBib3R0b20gLSBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgYm90dG9tIG9mIHRoZSByZWN0YW5nbGUuCi0qIEBwYXJhbVtpbl0gcmlnaHQgIC0gUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHJpZ2h0IG9mIHRoZSByZWN0YW5nbGUuCi0qIEBwYXJhbVtpbl0gdG9wICAgIC0gUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHRvcCBvZiB0aGUgcmVjdGFuZ2xlLgorKiBAcGFyYW1baW5dIGxlZnQgICAtIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSBsZWZ0IG9mIHRoZQorKiByZWN0YW5nbGUuCisqIEBwYXJhbVtpbl0gYm90dG9tIC0gUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIGJvdHRvbSBvZiB0aGUKKyogcmVjdGFuZ2xlLgorKiBAcGFyYW1baW5dIHJpZ2h0ICAtIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSByaWdodCBvZiB0aGUKKyogcmVjdGFuZ2xlLgorKiBAcGFyYW1baW5dIHRvcCAgICAtIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSB0b3Agb2YgdGhlCisqIHJlY3RhbmdsZS4KICogQHJldHZhbCBUcnVlIGlmIHN1Y2Nlc3MsZWxzZSBmYWlsLgogKi8KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9HZXRNZWRpYUJveChGUERGX1BBR0UgcGFnZSwgZmxvYXQqIGxlZnQsIGZsb2F0KiBib3R0b20sIGZsb2F0KiByaWdodCwgZmxvYXQqIHRvcCk7CitETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VfR2V0TWVkaWFCb3goRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHRvcCk7CiAKIC8qKiAgR2V0ICJDcm9wQm94IiBlbnRyeSBmcm9tIHRoZSBwYWdlIGRpY3Rpb25hcnkuCiAqIEBwYXJhbVtpbl0gcGFnZSAgIC0gSGFuZGxlIHRvIGEgcGFnZS4KLSogQHBhcmFtW2luXSBsZWZ0ICAgLSBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgbGVmdCBvZiB0aGUgcmVjdGFuZ2xlLgotKiBAcGFyYW1baW5dIGJvdHRvbSAtIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSBib3R0b20gb2YgdGhlIHJlY3RhbmdsZS4KLSogQHBhcmFtW2luXSByaWdodCAgLSBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgcmlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KLSogQHBhcmFtW2luXSB0b3AgICAgLSBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgdG9wIG9mIHRoZSByZWN0YW5nbGUuCisqIEBwYXJhbVtpbl0gbGVmdCAgIC0gUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIGxlZnQgb2YgdGhlCisqIHJlY3RhbmdsZS4KKyogQHBhcmFtW2luXSBib3R0b20gLSBQb2ludGVyIHRvIGEgZG91YmxlIHZhbHVlIHJlY2VpdmluZyB0aGUgYm90dG9tIG9mIHRoZQorKiByZWN0YW5nbGUuCisqIEBwYXJhbVtpbl0gcmlnaHQgIC0gUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHJpZ2h0IG9mIHRoZQorKiByZWN0YW5nbGUuCisqIEBwYXJhbVtpbl0gdG9wICAgIC0gUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHRvcCBvZiB0aGUKKyogcmVjdGFuZ2xlLgogKiBAcmV0dmFsIFRydWUgaWYgc3VjY2VzcyxlbHNlIGZhaWwuCiAqLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZQYWdlX0dldENyb3BCb3goRlBERl9QQUdFIHBhZ2UsIGZsb2F0KiBsZWZ0LCBmbG9hdCogYm90dG9tLCBmbG9hdCogcmlnaHQsIGZsb2F0KiB0b3ApOworRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZQYWdlX0dldENyb3BCb3goRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdG9wKTsKIAogLyoqCi0qIFRyYW5zZm9ybSB0aGUgd2hvbGUgcGFnZSB3aXRoIGEgc3BlY2lmaWVkIG1hdHJpeCwgdGhlbiBjbGlwIHRoZSBwYWdlIGNvbnRlbnQgcmVnaW9uLgorKiBUcmFuc2Zvcm0gdGhlIHdob2xlIHBhZ2Ugd2l0aCBhIHNwZWNpZmllZCBtYXRyaXgsIHRoZW4gY2xpcCB0aGUgcGFnZSBjb250ZW50CisqIHJlZ2lvbi4KICoKICogQHBhcmFtW2luXSBwYWdlICAgICAgICAtIEEgcGFnZSBoYW5kbGUuCiAqIEBwYXJhbVtpbl0gbWF0cml4ICAgICAgLSBUaGUgdHJhbnNmb3JtIG1hdHJpeC4KICogQHBhcmFtW2luXSBjbGlwUmVjdCAgICAtIEEgcmVjdGFuZ2xlIHBhZ2UgYXJlYSB0byBiZSBjbGlwcGVkLgotKiBATm90ZS4gVGhpcyBmdW5jdGlvbiB3aWxsIHRyYW5zZm9ybSB0aGUgd2hvbGUgcGFnZSwgYW5kIHdvdWxkIHRha2UgZWZmZWN0IHRvIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgcGFnZS4KKyogQE5vdGUuIFRoaXMgZnVuY3Rpb24gd2lsbCB0cmFuc2Zvcm0gdGhlIHdob2xlIHBhZ2UsIGFuZCB3b3VsZCB0YWtlIGVmZmVjdCB0bworKiBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIHBhZ2UuCiAqLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZQYWdlX1RyYW5zRm9ybVdpdGhDbGlwKEZQREZfUEFHRSBwYWdlLCBGU19NQVRSSVgqIG1hdHJpeCwgRlNfUkVDVEYqIGNsaXBSZWN0KTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9UcmFuc0Zvcm1XaXRoQ2xpcChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19NQVRSSVgqIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19SRUNURiogY2xpcFJlY3QpOwogCiAvKioKICogVHJhbnNmb3JtIChzY2FsZSwgcm90YXRlLCBzaGVhciwgbW92ZSkgdGhlIGNsaXAgcGF0aCBvZiBwYWdlIG9iamVjdC4KLSogQHBhcmFtW2luXSBwYWdlX29iamVjdCAtIEhhbmRsZSB0byBhIHBhZ2Ugb2JqZWN0LiBSZXR1cm5lZCBieSBGUERGUGFnZU9ial9OZXdJbWFnZU9iai4KKyogQHBhcmFtW2luXSBwYWdlX29iamVjdCAtIEhhbmRsZSB0byBhIHBhZ2Ugb2JqZWN0LiBSZXR1cm5lZCBieQorKiBGUERGUGFnZU9ial9OZXdJbWFnZU9iai4KICogQHBhcmFtW2luXSBhICAtIFRoZSBjb2VmZmljaWVudCAiYSIgb2YgdGhlIG1hdHJpeC4KICogQHBhcmFtW2luXSBiICAtIFRoZSBjb2VmZmljaWVudCAiYiIgb2YgdGhlIG1hdHJpeC4KICogQHBhcmFtW2luXSBjICAtIFRoZSBjb2VmZmljaWVudCAiYyIgb2YgdGhlIG1hdHJpeC4KQEAgLTgwLDcgKzEwOCwxNCBAQAogKiBAcGFyYW1baW5dIGYgIC0gVGhlIGNvZWZmaWNpZW50ICJmIiBvZiB0aGUgbWF0cml4LgogKiBAcmV0dmFsIE5vbmUuCiAqLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZU9ial9UcmFuc2Zvcm1DbGlwUGF0aChGUERGX1BBR0VPQkpFQ1QgcGFnZV9vYmplY3QsZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgYywgZG91YmxlIGQsIGRvdWJsZSBlLCBkb3VibGUgZik7CitETExFWFBPUlQgdm9pZCBTVERDQUxMCitGUERGUGFnZU9ial9UcmFuc2Zvcm1DbGlwUGF0aChGUERGX1BBR0VPQkpFQ1QgcGFnZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGYpOwogCiAvKioKICogQ3JlYXRlIGEgbmV3IGNsaXAgcGF0aCwgd2l0aCBhIHJlY3RhbmdsZSBpbnNlcnRlZC4KQEAgLTkxLDcgKzEyNiwxMCBAQAogKiBAcGFyYW1baW5dIHRvcCAgICAtIFRoZSB0b3Agb2YgdGhlIGNsaXAgYm94LgogKiBAcmV0dmFsIGEgaGFuZGxlIHRvIHRoZSBjbGlwIHBhdGguCiAqLwotRExMRVhQT1JUIEZQREZfQ0xJUFBBVEggU1REQ0FMTCBGUERGX0NyZWF0ZUNsaXBQYXRoKGZsb2F0IGxlZnQsIGZsb2F0IGJvdHRvbSwgZmxvYXQgcmlnaHQsIGZsb2F0IHRvcCk7CitETExFWFBPUlQgRlBERl9DTElQUEFUSCBTVERDQUxMIEZQREZfQ3JlYXRlQ2xpcFBhdGgoZmxvYXQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdG9wKTsKIAogLyoqCiAqIERlc3Ryb3kgdGhlIGNsaXAgcGF0aC4KQEAgLTEwMywxNCArMTQxLDE3IEBACiBETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfRGVzdHJveUNsaXBQYXRoKEZQREZfQ0xJUFBBVEggY2xpcFBhdGgpOwogCiAvKioKLSogQ2xpcCB0aGUgcGFnZSBjb250ZW50LCB0aGUgcGFnZSBjb250ZW50IHRoYXQgb3V0c2lkZSB0aGUgY2xpcHBpbmcgcmVnaW9uIGJlY29tZSBpbnZpc2libGUuCisqIENsaXAgdGhlIHBhZ2UgY29udGVudCwgdGhlIHBhZ2UgY29udGVudCB0aGF0IG91dHNpZGUgdGhlIGNsaXBwaW5nIHJlZ2lvbgorKiBiZWNvbWUgaW52aXNpYmxlLgogKgogKiBAcGFyYW1baW5dIHBhZ2UgICAgICAgIC0gQSBwYWdlIGhhbmRsZS4KICogQHBhcmFtW2luXSBjbGlwUGF0aCAgICAtIEEgaGFuZGxlIHRvIHRoZSBjbGlwIHBhdGguCi0qIEBOb3RlLiBBIGNsaXAgcGF0aCB3aWxsIGJlIGluc2VydGVkIGJlZm9yZSB0aGUgcGFnZSBjb250ZW50IHN0cmVhbSBvciBjb250ZW50IGFycmF5LiBJbiB0aGlzIHdheSwgdGhlIHBhZ2UgY29udGVudCB3aWxsIGJlIGNsaXBwZWQKKyogQE5vdGUuIEEgY2xpcCBwYXRoIHdpbGwgYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBwYWdlIGNvbnRlbnQgc3RyZWFtIG9yIGNvbnRlbnQKKyogYXJyYXkuIEluIHRoaXMgd2F5LCB0aGUgcGFnZSBjb250ZW50IHdpbGwgYmUgY2xpcHBlZAogKiBieSB0aGlzIGNsaXAgcGF0aC4KICovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlX0luc2VydENsaXBQYXRoKEZQREZfUEFHRSBwYWdlLEZQREZfQ0xJUFBBVEggY2xpcFBhdGgpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9JbnNlcnRDbGlwUGF0aChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9DTElQUEFUSCBjbGlwUGF0aCk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvcHVibGljL2ZwZGZ2aWV3LmggYi9wdWJsaWMvZnBkZnZpZXcuaAppbmRleCBlYWIzNzM5Li44NzMxMjkyIDEwMDY0NAotLS0gYS9wdWJsaWMvZnBkZnZpZXcuaAorKysgYi9wdWJsaWMvZnBkZnZpZXcuaApAQCAtMTQsMjcgKzE0LDM1IEBACiAjaW5jbHVkZSA8d2luZG93cy5oPgogI2VuZGlmCiAKLS8vIERhdGEgdHlwZXMKLXR5cGVkZWYgdm9pZCogRlBERl9NT0RVTEVNR1I7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKy8vICBUT0RPOiByZW1vdmUgdGhlICNkZWZpbmUgd2hlbiBYRkEgaXMgb2ZmaWNpYWxseSBpbiBwZGZpdW0KKyNkZWZpbmUgUERGX1VTRV9YRkEKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAogLy8gUERGIHR5cGVzCi10eXBlZGVmIHZvaWQqIEZQREZfRE9DVU1FTlQ7Ci10eXBlZGVmIHZvaWQqIEZQREZfUEFHRTsKLXR5cGVkZWYgdm9pZCogRlBERl9QQUdFT0JKRUNUOyAgICAvLyBQYWdlIG9iamVjdCh0ZXh0LCBwYXRoLCBldGMpCi10eXBlZGVmIHZvaWQqIEZQREZfUEFUSDsKLXR5cGVkZWYgdm9pZCogRlBERl9DTElQUEFUSDsKLXR5cGVkZWYgdm9pZCogRlBERl9CSVRNQVA7Ci10eXBlZGVmIHZvaWQqIEZQREZfRk9OVDsKLXR5cGVkZWYgdm9pZCogRlBERl9URVhUUEFHRTsKLXR5cGVkZWYgdm9pZCogRlBERl9TQ0hIQU5ETEU7Ci10eXBlZGVmIHZvaWQqIEZQREZfUEFHRUxJTks7Ci10eXBlZGVmIHZvaWQqIEZQREZfSE1PRFVMRTsKLXR5cGVkZWYgdm9pZCogRlBERl9ET0NTQ0hIQU5ETEU7Ci10eXBlZGVmIHZvaWQqIEZQREZfQk9PS01BUks7Ci10eXBlZGVmIHZvaWQqIEZQREZfREVTVDsKIHR5cGVkZWYgdm9pZCogRlBERl9BQ1RJT047Cit0eXBlZGVmIHZvaWQqIEZQREZfQklUTUFQOwordHlwZWRlZiB2b2lkKiBGUERGX0JPT0tNQVJLOwordHlwZWRlZiB2b2lkKiBGUERGX0NMSVBQQVRIOwordHlwZWRlZiB2b2lkKiBGUERGX0RFU1Q7Cit0eXBlZGVmIHZvaWQqIEZQREZfRE9DU0NISEFORExFOwordHlwZWRlZiB2b2lkKiBGUERGX0RPQ1VNRU5UOwordHlwZWRlZiB2b2lkKiBGUERGX0ZPTlQ7Cit0eXBlZGVmIHZvaWQqIEZQREZfSE1PRFVMRTsKIHR5cGVkZWYgdm9pZCogRlBERl9MSU5LOwordHlwZWRlZiB2b2lkKiBGUERGX01PRFVMRU1HUjsKK3R5cGVkZWYgdm9pZCogRlBERl9QQUdFOwordHlwZWRlZiB2b2lkKiBGUERGX1BBR0VMSU5LOwordHlwZWRlZiB2b2lkKiBGUERGX1BBR0VPQkpFQ1Q7ICAvLyBQYWdlIG9iamVjdCh0ZXh0LCBwYXRoLCBldGMpCiB0eXBlZGVmIHZvaWQqIEZQREZfUEFHRVJBTkdFOwordHlwZWRlZiB2b2lkKiBGUERGX1BBVEg7Cit0eXBlZGVmIHZvaWQqIEZQREZfU0NISEFORExFOwordHlwZWRlZiB2b2lkKiBGUERGX1RFWFRQQUdFOworCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK3R5cGVkZWYgdm9pZCogRlBERl9TVFJJTkdIQU5ETEU7Cit0eXBlZGVmIHZvaWQqIEZQREZfV0lER0VUOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCiAvLyBCYXNpYyBkYXRhIHR5cGVzCiB0eXBlZGVmIGludCBGUERGX0JPT0w7CkBAIC00Miw2NiArNTAsODUgQEAKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBGUERGX0RXT1JEOwogdHlwZWRlZiBmbG9hdCBGU19GTE9BVDsKIAorI2lmZGVmIFBERl9FTkFCTEVfWEZBCit0eXBlZGVmIHZvaWQqIEZQREZfTFBWT0lEOwordHlwZWRlZiB2b2lkIGNvbnN0KiBGUERGX0xQQ1ZPSUQ7Cit0eXBlZGVmIGNoYXIgY29uc3QqIEZQREZfTFBDU1RSOwordHlwZWRlZiBpbnQgRlBERl9SRVNVTFQ7CisjZW5kaWYKKwogLy8gRHVwbGV4IHR5cGVzCiB0eXBlZGVmIGVudW0gX0ZQREZfRFVQTEVYVFlQRV8gewotICAgIER1cGxleFVuZGVmaW5lZCA9IDAsCi0gICAgU2ltcGxleCwKLSAgICBEdXBsZXhGbGlwU2hvcnRFZGdlLAotICAgIER1cGxleEZsaXBMb25nRWRnZQorICBEdXBsZXhVbmRlZmluZWQgPSAwLAorICBTaW1wbGV4LAorICBEdXBsZXhGbGlwU2hvcnRFZGdlLAorICBEdXBsZXhGbGlwTG9uZ0VkZ2UKIH0gRlBERl9EVVBMRVhUWVBFOwogCiAvLyBTdHJpbmcgdHlwZXMKIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgRlBERl9XQ0hBUjsKIHR5cGVkZWYgdW5zaWduZWQgY2hhciBjb25zdCogRlBERl9MUENCWVRFOwogCi0vLyBGUERGU0RLIG1heSB1c2UgdGhyZWUgdHlwZXMgb2Ygc3RyaW5nczogYnl0ZSBzdHJpbmcsIHdpZGUgc3RyaW5nIChVVEYtMTZMRSBlbmNvZGVkKSwgYW5kIHBsYXRmb3JtIGRlcGVuZGVudCBzdHJpbmcKKy8vIEZQREZTREsgbWF5IHVzZSB0aHJlZSB0eXBlcyBvZiBzdHJpbmdzOiBieXRlIHN0cmluZywgd2lkZSBzdHJpbmcgKFVURi0xNkxFCisvLyBlbmNvZGVkKSwgYW5kIHBsYXRmb3JtIGRlcGVuZGVudCBzdHJpbmcKIHR5cGVkZWYgY29uc3QgY2hhciogRlBERl9CWVRFU1RSSU5HOwogCi10eXBlZGVmIGNvbnN0IHVuc2lnbmVkIHNob3J0KiBGUERGX1dJREVTVFJJTkc7ICAgICAgICAvLyBGb3hpdCBQREYgU0RLIGFsd2F5cyB1c2UgVVRGLTE2TEUgZW5jb2Rpbmcgd2lkZSBzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlYWNoIGNoYXJhY3RlciB1c2UgMiBieXRlcyAoZXhjZXB0IHN1cnJvZ2F0aW9uKSwgd2l0aCBsb3cgYnl0ZSBmaXJzdC4KKy8vIEZQREZTREsgYWx3YXlzIHVzZXMgVVRGLTE2TEUgZW5jb2RlZCB3aWRlIHN0cmluZ3MsIGVhY2ggY2hhcmFjdGVyIHVzZXMgMgorLy8gYnl0ZXMgKGV4Y2VwdCBzdXJyb2dhdGlvbiksIHdpdGggdGhlIGxvdyBieXRlIGZpcnN0LgordHlwZWRlZiBjb25zdCB1bnNpZ25lZCBzaG9ydCogRlBERl9XSURFU1RSSU5HOwogCi0vLyBGb3IgV2luZG93cyBwcm9ncmFtbWVyczogZm9yIG1vc3QgY2FzZSBpdCdzIE9LIHRvIHRyZWF0IEZQREZfV0lERVNUUklORyBhcyBXaW5kb3dzIHVuaWNvZGUgc3RyaW5nLAotLy8gICAgICAgaG93ZXZlciwgc3BlY2lhbCBjYXJlIG5lZWRzIHRvIGJlIHRha2VuIGlmIHlvdSBleHBlY3QgdG8gcHJvY2VzcyBVbmljb2RlIGxhcmdlciB0aGFuIDB4ZmZmZi4KLS8vIEZvciBMaW51eC9Vbml4IHByb2dyYW1tZXJzOiBtb3N0IGNvbXBpbGVyL2xpYnJhcnkgZW52aXJvbm1lbnQgdXNlcyA0IGJ5dGVzIGZvciBhIFVuaWNvZGUgY2hhcmFjdGVyLAotLy8gICAgICB5b3UgaGF2ZSB0byBjb252ZXJ0IGJldHdlZW4gRlBERl9XSURFU1RSSU5HIGFuZCBzeXN0ZW0gd2lkZSBzdHJpbmcgYnkgeW91cnNlbGYuCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKy8vIFN0cnVjdHVyZSBmb3IgYSBieXRlIHN0cmluZy4KKy8vIE5vdGUsIGEgYnl0ZSBzdHJpbmcgY29tbW9ubHkgbWVhbnMgYSBVVEYtMTZMRSBmb3JtYXRlZCBzdHJpbmcuCit0eXBlZGVmIHN0cnVjdCBfRlBERl9CU1RSIHsKKyAgLy8gU3RyaW5nIGJ1ZmZlci4KKyAgY2hhciogc3RyOworICAvLyBMZW5ndGggb2YgdGhlIHN0cmluZywgaW4gYnl0ZXMuCisgIGludCBsZW47Cit9IEZQREZfQlNUUjsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAorLy8gRm9yIFdpbmRvd3MgcHJvZ3JhbW1lcnM6IEluIG1vc3QgY2FzZXMgaXQncyBPSyB0byB0cmVhdCBGUERGX1dJREVTVFJJTkcgYXMgYQorLy8gV2luZG93cyB1bmljb2RlIHN0cmluZywgaG93ZXZlciwgc3BlY2lhbCBjYXJlIG5lZWRzIHRvIGJlIHRha2VuIGlmIHlvdQorLy8gZXhwZWN0IHRvIHByb2Nlc3MgVW5pY29kZSBsYXJnZXIgdGhhbiAweGZmZmYuCisvLworLy8gRm9yIExpbnV4L1VuaXggcHJvZ3JhbW1lcnM6IG1vc3QgY29tcGlsZXIvbGlicmFyeSBlbnZpcm9ubWVudHMgdXNlIDQgYnl0ZXMKKy8vIGZvciBhIFVuaWNvZGUgY2hhcmFjdGVyLCBhbmQgeW91IGhhdmUgdG8gY29udmVydCBiZXR3ZWVuIEZQREZfV0lERVNUUklORyBhbmQKKy8vIHN5c3RlbSB3aWRlIHN0cmluZyBieSB5b3Vyc2VsZi4KICNpZmRlZiBfV0lOMzJfV0NFCiB0eXBlZGVmIGNvbnN0IHVuc2lnbmVkIHNob3J0KiBGUERGX1NUUklORzsKICNlbHNlCiB0eXBlZGVmIGNvbnN0IGNoYXIqIEZQREZfU1RSSU5HOwogI2VuZGlmCiAKLS8qKiBAYnJpZWYgTWF0cml4IGZvciB0cmFuc2Zvcm1hdGlvbi4gKi8KLXR5cGVkZWYgc3RydWN0IF9GU19NQVRSSVhfCi17Ci0gICAgZmxvYXQgICBhOyAgLyoqPCBAYnJpZWYgQ29lZmZpY2llbnQgYS4qLwotICAgIGZsb2F0ICAgYjsgIC8qKjwgQGJyaWVmIENvZWZmaWNpZW50IGIuKi8KLSAgICBmbG9hdCAgIGM7ICAvKio8IEBicmllZiBDb2VmZmljaWVudCBjLiovCi0gICAgZmxvYXQgICBkOyAgLyoqPCBAYnJpZWYgQ29lZmZpY2llbnQgZC4qLwotICAgIGZsb2F0ICAgZTsgIC8qKjwgQGJyaWVmIENvZWZmaWNpZW50IGUuKi8KLSAgICBmbG9hdCAgIGY7ICAvKio8IEBicmllZiBDb2VmZmljaWVudCBmLiovCisvLyBNYXRyaXggZm9yIHRyYW5zZm9ybWF0aW9uLgordHlwZWRlZiBzdHJ1Y3QgX0ZTX01BVFJJWF8geworICBmbG9hdCBhOworICBmbG9hdCBiOworICBmbG9hdCBjOworICBmbG9hdCBkOworICBmbG9hdCBlOworICBmbG9hdCBmOwogfSBGU19NQVRSSVg7CiAKLS8qKiBAYnJpZWYgUmVjdGFuZ2xlIGFyZWEoZmxvYXQpIGluIGRldmljZSBvciBwYWdlIGNvb3JkaW5hdGlvbiBzeXN0ZW0uICovCi10eXBlZGVmIHN0cnVjdCBfRlNfUkVDVEZfCi17Ci0gICAgLyoqQHsqLwotICAgIC8qKiBAYnJpZWYgVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgbGVmdC10b3AgY29ybmVyLiAqLwotICAgIGZsb2F0ICAgbGVmdDsKLSAgICAvKiogQGJyaWVmIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGxlZnQtdG9wIGNvcm5lci4gKi8KLSAgICBmbG9hdCAgIHRvcDsKLSAgICAvKiogQGJyaWVmIFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHJpZ2h0LWJvdHRvbSBjb3JuZXIuICovCi0gICAgZmxvYXQgICByaWdodDsKLSAgICAvKiogQGJyaWVmIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHJpZ2h0LWJvdHRvbSBjb3JuZXIuICovCi0gICAgZmxvYXQgICBib3R0b207Ci0gICAgLyoqQH0qLwotfSogRlNfTFBSRUNURiwgRlNfUkVDVEY7Ci0vKiogQGJyaWVmIENvbnN0IFBvaW50ZXIgdG8gOjpGU19SRUNURiBzdHJ1Y3R1cmUuKi8KKy8vIFJlY3RhbmdsZSBhcmVhKGZsb2F0KSBpbiBkZXZpY2Ugb3IgcGFnZSBjb29yZGluYXRlIHN5c3RlbS4KK3R5cGVkZWYgc3RydWN0IF9GU19SRUNURl8geworICAvLyBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBsZWZ0LXRvcCBjb3JuZXIuCisgIGZsb2F0IGxlZnQ7CisgIC8vIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGxlZnQtdG9wIGNvcm5lci4KKyAgZmxvYXQgdG9wOworICAvLyBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSByaWdodC1ib3R0b20gY29ybmVyLgorICBmbG9hdCByaWdodDsKKyAgLy8gVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgcmlnaHQtYm90dG9tIGNvcm5lci4KKyAgZmxvYXQgYm90dG9tOworfSAqIEZTX0xQUkVDVEYsIEZTX1JFQ1RGOworCisvLyBDb25zdCBQb2ludGVyIHRvIEZTX1JFQ1RGIHN0cnVjdHVyZS4KIHR5cGVkZWYgY29uc3QgRlNfUkVDVEYqIEZTX0xQQ1JFQ1RGOwogCiAjaWYgZGVmaW5lZChfV0lOMzIpICYmIGRlZmluZWQoRlBERlNES19FWFBPUlRTKQogLy8gT24gV2luZG93cyBzeXN0ZW0sIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgaW4gYSBETEwKLSNkZWZpbmUgRExMRVhQT1JUIF9fZGVjbHNwZWMoIGRsbGV4cG9ydCApCisjZGVmaW5lIERMTEVYUE9SVCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKICNkZWZpbmUgU1REQ0FMTCBfX3N0ZGNhbGwKICNlbHNlCiAjZGVmaW5lIERMTEVYUE9SVApAQCAtMTIwLDkgKzE0Nyw0NSBAQAogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTm9uZS4KIC8vIENvbW1lbnRzOgotLy8gICAgICAgICAgWW91IGhhdmUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGJlZm9yZSB5b3UgY2FuIGNhbGwgYW55IFBERiBwcm9jZXNzaW5nIGZ1bmN0aW9ucy4KKy8vICAgICAgICAgIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGNhbGwgRlBERl9Jbml0TGlicmFyeVdpdGhDb25maWcoKSBmb3IKKy8vICAgICAgICAgIGJhY2t3YXJkcyBjb21hdGliaWxpdHkgcHVycG9zZXMuCiBETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfSW5pdExpYnJhcnkoKTsKIAorLy8gUHJvY2Vzcy13aWRlIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyB0aGUgbGlicmFyeS4KK3R5cGVkZWYgc3RydWN0IEZQREZfTElCUkFSWV9DT05GSUdfIHsKKyAgLy8gVmVyc2lvbiBudW1iZXIgb2YgdGhlIGludGVyZmFjZS4gQ3VycmVudGx5IG11c3QgYmUgMi4KKyAgaW50IHZlcnNpb247CisKKyAgLy8gQXJyYXkgb2YgcGF0aHMgdG8gc2NhbiBpbiBwbGFjZSBvZiB0aGUgZGVmYXVsdHMgd2hlbiB1c2luZyBidWlsdC1pbgorICAvLyBGWEdFIGZvbnQgbG9hZGluZyBjb2RlLiBUaGUgYXJyYXkgaXMgdGVybWluYXRlZCBieSBhIE5VTEwgcG9pbnRlci4KKyAgLy8gVGhlIEFycmF5IG1heSBiZSBOVUxMIGl0c2VsZiB0byB1c2UgdGhlIGRlZmF1bHQgcGF0aHMuIE1heSBiZSBpZ25vcmVkCisgIC8vIGVudGlyZWx5IGRlcGVuZGluZyB1cG9uIHRoZSBwbGF0Zm9ybS4KKyAgY29uc3QgY2hhcioqIG1fcFVzZXJGb250UGF0aHM7CisKKyAgLy8gVmVyc2lvbiAyLgorCisgIC8vIHBvaW50ZXIgdG8gdGhlIHY4OjpJc29sYXRlIHRvIHVzZSwgb3IgTlVMTCB0byBmb3JjZSBQREZpdW0gdG8gY3JlYXRlIG9uZS4KKyAgdm9pZCogbV9wSXNvbGF0ZTsKKworICAvLyBUaGUgZW1iZWRkZXIgZGF0YSBzbG90IHRvIHVzZSBpbiB0aGUgdjg6Oklzb2xhdGUgdG8gc3RvcmUgUERGaXVtJ3MKKyAgLy8gcGVyLWlzb2xhdGUgZGF0YS4gVGhlIHZhbHVlIG5lZWRzIHRvIGJlIGJldHdlZW4gMCBhbmQKKyAgLy8gdjg6OkludGVybmFsczo6a051bUlzb2xhdGVEYXRhTG90cyAoZXhjbHVzaXZlKS4gTm90ZSB0aGF0IDAgaXMgZmluZQorICAvLyBmb3IgbW9zdCBlbWJlZGRlcnMuCisgIHVuc2lnbmVkIGludCBtX3Y4RW1iZWRkZXJTbG90OworfSBGUERGX0xJQlJBUllfQ09ORklHOworCisvLyBGdW5jdGlvbjogRlBERl9Jbml0TGlicmFyeVdpdGhDb25maWcKKy8vICAgICAgICAgIEluaXRpYWxpemUgdGhlIEZQREZTREsgbGlicmFyeQorLy8gUGFyYW1ldGVyczoKKy8vICAgICAgICAgIGNvbmZpZyAtIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYXMgYWJvdmUuCisvLyBSZXR1cm4gdmFsdWU6CisvLyAgICAgICAgICBOb25lLgorLy8gQ29tbWVudHM6CisvLyAgICAgICAgICBZb3UgaGF2ZSB0byBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIHlvdSBjYW4gY2FsbCBhbnkgUERGCisvLyAgICAgICAgICBwcm9jZXNzaW5nIGZ1bmN0aW9ucy4KK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9Jbml0TGlicmFyeVdpdGhDb25maWcoCisgICAgY29uc3QgRlBERl9MSUJSQVJZX0NPTkZJRyogY29uZmlnKTsKKwogLy8gRnVuY3Rpb246IEZQREZfRGVzdHJveUxpYmFyeQogLy8gICAgICAgICAgUmVsZWFzZSBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGUgRlBERlNESyBsaWJyYXJ5LgogLy8gUGFyYW1ldGVyczoKQEAgLTEzMCwyOCArMTkzLDMyIEBACiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBOb25lLgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBZb3UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiB0byByZWxlYXNlIGFsbCBtZW1vcnkgYmxvY2tzIGFsbG9jYXRlZCBieSB0aGUgbGlicmFyeS4KLS8vICAgICAgICAgIEFmdGVyIHRoaXMgZnVuY3Rpb24gY2FsbGVkLCB5b3Ugc2hvdWxkIG5vdCBjYWxsIGFueSBQREYgcHJvY2Vzc2luZyBmdW5jdGlvbnMuCisvLyAgICAgICAgICBZb3UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiB0byByZWxlYXNlIGFsbCBtZW1vcnkgYmxvY2tzIGFsbG9jYXRlZCBieQorLy8gICAgICAgICAgdGhlIGxpYnJhcnkuCisvLyAgICAgICAgICBBZnRlciB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgeW91IHNob3VsZCBub3QgY2FsbCBhbnkgUERGCisvLyAgICAgICAgICBwcm9jZXNzaW5nIGZ1bmN0aW9ucy4KIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9EZXN0cm95TGlicmFyeSgpOwogCi0vL1BvbGljeSBmb3IgYWNjZXNzaW5nIHRoZSBsb2NhbCBtYWNoaW5lIHRpbWUuCi0jZGVmaW5lIEZQREZfUE9MSUNZX01BQ0hJTkVUSU1FX0FDQ0VTUyAgMAorLy8gUG9saWN5IGZvciBhY2Nlc3NpbmcgdGhlIGxvY2FsIG1hY2hpbmUgdGltZS4KKyNkZWZpbmUgRlBERl9QT0xJQ1lfTUFDSElORVRJTUVfQUNDRVNTIDAKIAogLy8gRnVuY3Rpb246IEZQREZfU2V0U2FuZEJveFBvbGljeQogLy8gICAgICAgICAgU2V0IHRoZSBwb2xpY3kgZm9yIHRoZSBzYW5kYm94IGVudmlyb25tZW50LgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBvbGljeSAgICAgIC0gICBUaGUgc3BlY2lmaWVkIHBvbGljeSBmb3Igc2V0dGluZywgZm9yIGV4YW1wbGU6RlBERl9QT0xJQ1lfTUFDSElORVRJTUVfQUNDRVNTLgotLy8gICAgICAgICAgZW5hYmxlICAgICAgLSAgIFRydWUgZm9yIGVuYWJsZSwgRmFsc2UgZm9yIGRpc2FibGUgdGhlIHBvbGljeS4KKy8vICAgICAgICAgIHBvbGljeSAtICAgVGhlIHNwZWNpZmllZCBwb2xpY3kgZm9yIHNldHRpbmcsIGZvciBleGFtcGxlOgorLy8gICAgICAgICAgICAgICAgICAgICBGUERGX1BPTElDWV9NQUNISU5FVElNRV9BQ0NFU1MuCisvLyAgICAgICAgICBlbmFibGUgLSAgIFRydWUgdG8gZW5hYmxlLCBmYWxzZSB0byBkaXNhYmxlIHRoZSBwb2xpY3kuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBOb25lLgotRExMRVhQT1JUIHZvaWQgIFNURENBTEwgRlBERl9TZXRTYW5kQm94UG9saWN5KEZQREZfRFdPUkQgcG9saWN5LCBGUERGX0JPT0wgZW5hYmxlKTsKK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9TZXRTYW5kQm94UG9saWN5KEZQREZfRFdPUkQgcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIGVuYWJsZSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX0xvYWREb2N1bWVudAogLy8gICAgICAgICAgT3BlbiBhbmQgbG9hZCBhIFBERiBkb2N1bWVudC4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBmaWxlX3BhdGggW2luXSAtICBQYXRoIHRvIHRoZSBQREYgZmlsZSAoaW5jbHVkaW5nIGV4dGVuc2lvbikuCi0vLyAgICAgICAgICBwYXNzd29yZCBbaW5dICAtICBBIHN0cmluZyB1c2VkIGFzIHRoZSBwYXNzd29yZCBmb3IgUERGIGZpbGUuCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBubyBwYXNzd29yZCBuZWVkZWQsIGVtcHR5IG9yIE5VTEwgY2FuIGJlIHVzZWQuCisvLyAgICAgICAgICBmaWxlX3BhdGggLSAgUGF0aCB0byB0aGUgUERGIGZpbGUgKGluY2x1ZGluZyBleHRlbnNpb24pLgorLy8gICAgICAgICAgcGFzc3dvcmQgIC0gIEEgc3RyaW5nIHVzZWQgYXMgdGhlIHBhc3N3b3JkIGZvciB0aGUgUERGIGZpbGUuCisvLyAgICAgICAgICAgICAgICAgICAgICAgSWYgbm8gcGFzc3dvcmQgaXMgbmVlZGVkLCBlbXB0eSBvciBOVUxMIGNhbiBiZSB1c2VkLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgQSBoYW5kbGUgdG8gdGhlIGxvYWRlZCBkb2N1bWVudCwgb3IgTlVMTCBvbiBmYWlsdXJlLgogLy8gQ29tbWVudHM6CkBAIC0xNTksMjE2ICsyMjYsMzU1IEBACiAvLyAgICAgICAgICBJZiB0aGlzIGZ1bmN0aW9uIGZhaWxzLCB5b3UgY2FuIHVzZSBGUERGX0dldExhc3RFcnJvcigpIHRvIHJldHJpZXZlCiAvLyAgICAgICAgICB0aGUgcmVhc29uIHdoeSBpdCBmYWlsZWQuCiBETExFWFBPUlQgRlBERl9ET0NVTUVOVCBTVERDQUxMIEZQREZfTG9hZERvY3VtZW50KEZQREZfU1RSSU5HIGZpbGVfcGF0aCwKLSAgICBGUERGX0JZVEVTVFJJTkcgcGFzc3dvcmQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgcGFzc3dvcmQpOwogCiAvLyBGdW5jdGlvbjogRlBERl9Mb2FkTWVtRG9jdW1lbnQKIC8vICAgICAgICAgIE9wZW4gYW5kIGxvYWQgYSBQREYgZG9jdW1lbnQgZnJvbSBtZW1vcnkuCiAvLyBQYXJhbWV0ZXJzOgogLy8gICAgICAgICAgZGF0YV9idWYgICAgLSAgIFBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgUERGIGRvY3VtZW50LgogLy8gICAgICAgICAgc2l6ZSAgICAgICAgLSAgIE51bWJlciBvZiBieXRlcyBpbiB0aGUgUERGIGRvY3VtZW50LgotLy8gICAgICAgICAgcGFzc3dvcmQgICAgLSAgIEEgc3RyaW5nIHVzZWQgYXMgdGhlIHBhc3N3b3JkIGZvciBQREYgZmlsZS4KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBubyBwYXNzd29yZCBuZWVkZWQsIGVtcHR5IG9yIE5VTEwgY2FuIGJlIHVzZWQuCisvLyAgICAgICAgICBwYXNzd29yZCAgICAtICAgQSBzdHJpbmcgdXNlZCBhcyB0aGUgcGFzc3dvcmQgZm9yIHRoZSBQREYgZmlsZS4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBubyBwYXNzd29yZCBpcyBuZWVkZWQsIGVtcHR5IG9yIE5VTEwgY2FuIGJlIHVzZWQuCiAvLyBSZXR1cm4gdmFsdWU6Ci0vLyAgICAgICAgICBBIGhhbmRsZSB0byB0aGUgbG9hZGVkIGRvY3VtZW50LiBJZiBmYWlsZWQsIE5VTEwgaXMgcmV0dXJuZWQuCisvLyAgICAgICAgICBBIGhhbmRsZSB0byB0aGUgbG9hZGVkIGRvY3VtZW50LCBvciBOVUxMIG9uIGZhaWx1cmUuCiAvLyBDb21tZW50czoKIC8vICAgICAgICAgIFRoZSBtZW1vcnkgYnVmZmVyIG11c3QgcmVtYWluIHZhbGlkIHdoZW4gdGhlIGRvY3VtZW50IGlzIG9wZW4uCi0vLyAgICAgICAgICBMb2FkZWQgZG9jdW1lbnQgY2FuIGJlIGNsb3NlZCBieSBGUERGX0Nsb3NlRG9jdW1lbnQuCisvLyAgICAgICAgICBUaGUgbG9hZGVkIGRvY3VtZW50IGNhbiBiZSBjbG9zZWQgYnkgRlBERl9DbG9zZURvY3VtZW50LgogLy8gICAgICAgICAgSWYgdGhpcyBmdW5jdGlvbiBmYWlscywgeW91IGNhbiB1c2UgRlBERl9HZXRMYXN0RXJyb3IoKSB0byByZXRyaWV2ZQotLy8gICAgICAgICAgdGhlIHJlYXNvbiB3aHkgaXQgZmFpbHMuCi0vLworLy8gICAgICAgICAgdGhlIHJlYXNvbiB3aHkgaXQgZmFpbGVkLgorLy8gTm90ZXM6CisvLyAgICAgICAgICBJZiBQREZpdW0gaXMgYnVpbHQgd2l0aCB0aGUgWEZBIG1vZHVsZSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsCisvLyAgICAgICAgICBGUERGX0xvYWRYRkEoKSBmdW5jdGlvbiBhZnRlciB0aGUgUERGIGRvY3VtZW50IGxvYWRlZCB0byBzdXBwb3J0IFhGQQorLy8gICAgICAgICAgZmllbGRzIGRlZmluZWQgaW4gdGhlIGZwZGZmb3JtZmlsbC5oIGZpbGUuCiBETExFWFBPUlQgRlBERl9ET0NVTUVOVCBTVERDQUxMIEZQREZfTG9hZE1lbURvY3VtZW50KGNvbnN0IHZvaWQqIGRhdGFfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgRlBERl9CWVRFU1RSSU5HIHBhc3N3b3JkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyBwYXNzd29yZCk7CiAKIC8vIFN0cnVjdHVyZSBmb3IgY3VzdG9tIGZpbGUgYWNjZXNzLgogdHlwZWRlZiBzdHJ1Y3QgewotICAgIC8vIEZpbGUgbGVuZ3RoLCBpbiBieXRlcy4KLSAgICB1bnNpZ25lZCBsb25nICAgbV9GaWxlTGVuOworICAvLyBGaWxlIGxlbmd0aCwgaW4gYnl0ZXMuCisgIHVuc2lnbmVkIGxvbmcgbV9GaWxlTGVuOwogCi0gICAgLy8gQSBmdW5jdGlvbiBwb2ludGVyIGZvciBnZXR0aW5nIGEgYmxvY2sgb2YgZGF0YSBmcm9tIHNwZWNpZmljIHBvc2l0aW9uLgotICAgIC8vIFBvc2l0aW9uIGlzIHNwZWNpZmllZCBieSBieXRlIG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KLSAgICAvLyBUaGUgcG9zaXRpb24gYW5kIHNpemUgd2lsbCBuZXZlciBnbyBvdXQgcmFuZ2Ugb2YgZmlsZSBsZW5ndGguCi0gICAgLy8gSXQgbWF5IGJlIHBvc3NpYmxlIGZvciBGUERGU0RLIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBtdWx0aXBsZSB0aW1lcyBmb3Igc2FtZSBwb3NpdGlvbi4KLSAgICAvLyBSZXR1cm4gdmFsdWU6IHNob3VsZCBiZSBub24temVybyBpZiBzdWNjZXNzZnVsLCB6ZXJvIGZvciBlcnJvci4KLSAgICBpbnQgICAgICAgICAgICAgKCptX0dldEJsb2NrKSh2b2lkKiBwYXJhbSwgdW5zaWduZWQgbG9uZyBwb3NpdGlvbiwgdW5zaWduZWQgY2hhciogcEJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplKTsKKyAgLy8gQSBmdW5jdGlvbiBwb2ludGVyIGZvciBnZXR0aW5nIGEgYmxvY2sgb2YgZGF0YSBmcm9tIGEgc3BlY2lmaWMgcG9zaXRpb24uCisgIC8vIFBvc2l0aW9uIGlzIHNwZWNpZmllZCBieSBieXRlIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisgIC8vIFRoZSBwb3NpdGlvbiBhbmQgc2l6ZSB3aWxsIG5ldmVyIGdvIG91dCBvZiByYW5nZSBvZiB0aGUgZmlsZSBsZW5ndGguCisgIC8vIEl0IG1heSBiZSBwb3NzaWJsZSBmb3IgRlBERlNESyB0byBjYWxsIHRoaXMgZnVuY3Rpb24gbXVsdGlwbGUgdGltZXMgZm9yCisgIC8vIHRoZSBzYW1lIHBvc2l0aW9uLgorICAvLyBSZXR1cm4gdmFsdWU6IHNob3VsZCBiZSBub24temVybyBpZiBzdWNjZXNzZnVsLCB6ZXJvIGZvciBlcnJvci4KKyAgaW50ICgqbV9HZXRCbG9jaykodm9pZCogcGFyYW0sCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHBCdWYsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiAKLSAgICAvLyBBIGN1c3RvbSBwb2ludGVyIGZvciBhbGwgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgZGF0YS4KLSAgICAvLyBUaGlzIHBvaW50ZXIgd2lsbCBiZSB1c2VkIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8gbV9HZXRCbG9jayBjYWxsYmFjay4KLSAgICB2b2lkKiAgICAgICAgICAgbV9QYXJhbTsKKyAgLy8gQSBjdXN0b20gcG9pbnRlciBmb3IgYWxsIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGRhdGEuICBUaGlzIHBvaW50ZXIgd2lsbAorICAvLyBiZSB1c2VkIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8gdGhlIG1fR2V0QmxvY2sgY2FsbGJhY2suCisgIHZvaWQqIG1fUGFyYW07CiB9IEZQREZfRklMRUFDQ0VTUzsKIAorI2lmZGVmIFBERl9FTkFCTEVfWEZBCisvKioKKyAqIEBicmllZiBTdHJ1Y3R1cmUgZm9yIGZpbGUgcmVhZGluZyBvciB3cml0aW5nIChJL08pLgorICoKKyAqIEBub3RlIFRoaXMgaXMgYSBoYW5kbGVyIGFuZCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgY2FsbGVycy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX0ZQREZfRklMRUhBTkRMRVIgeworICAvKioKKyAgICogQGJyaWVmIFVzZXItZGVmaW5lZCBkYXRhLgorICAgKiBAbm90ZSBDYWxsZXJzIGNhbiB1c2UgdGhpcyBmaWVsZCB0byB0cmFjayBjb250cm9scy4KKyAgICovCisgIEZQREZfTFBWT0lEIGNsaWVudERhdGE7CisgIC8qKgorICAgKiBAYnJpZWYgQ2FsbGJhY2sgZnVuY3Rpb24gdG8gcmVsZWFzZSB0aGUgY3VycmVudCBmaWxlIHN0cmVhbSBvYmplY3QuCisgICAqCisgICAqIEBwYXJhbVtpbl0gY2xpZW50RGF0YSAgICBQb2ludGVyIHRvIHVzZXItZGVmaW5lZCBkYXRhLgorICAgKgorICAgKiBAcmV0dXJuIE5vbmUuCisgICAqLworICB2b2lkICgqUmVsZWFzZSkoRlBERl9MUFZPSUQgY2xpZW50RGF0YSk7CisgIC8qKgorICAgKiBAYnJpZWYgQ2FsbGJhY2sgZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIGN1cnJlbnQgZmlsZSBzdHJlYW0gc2l6ZS4KKyAgICoKKyAgICogQHBhcmFtW2luXSBjbGllbnREYXRhICAgIFBvaW50ZXIgdG8gdXNlci1kZWZpbmVkIGRhdGEuCisgICAqCisgICAqIEByZXR1cm4gU2l6ZSBvZiBmaWxlIHN0cmVhbS4KKyAgICovCisgIEZQREZfRFdPUkQgKCpHZXRTaXplKShGUERGX0xQVk9JRCBjbGllbnREYXRhKTsKKyAgLyoqCisgICAqIEBicmllZiBDYWxsYmFjayBmdW5jdGlvbiB0byByZWFkIGRhdGEgZnJvbSB0aGUgY3VycmVudCBmaWxlIHN0cmVhbS4KKyAgICoKKyAgICogQHBhcmFtW2luXSAgIGNsaWVudERhdGEgIFBvaW50ZXIgdG8gdXNlci1kZWZpbmVkIGRhdGEuCisgICAqIEBwYXJhbVtpbl0gICBvZmZzZXQgICAgICBPZmZzZXQgcG9zaXRpb24gc3RhcnRzIGZyb20gdGhlIGJlZ2lubmluZyBvZiBmaWxlCisgICAqIHN0cmVhbS4gVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHJlYWRpbmcgcG9zaXRpb24uCisgICAqIEBwYXJhbVtpbl0gICBidWZmZXIgICAgICBNZW1vcnkgYnVmZmVyIHRvIHN0b3JlIGRhdGEgd2hpY2ggYXJlIHJlYWQgZnJvbQorICAgKiBmaWxlIHN0cmVhbS4gVGhpcyBwYXJhbWV0ZXIgc2hvdWxkIG5vdCBiZSA8Yj5OVUxMPC9iPi4KKyAgICogQHBhcmFtW2luXSAgIHNpemUgICAgICAgIFNpemUgb2YgZGF0YSB3aGljaCBzaG91bGQgYmUgcmVhZCBmcm9tIGZpbGUKKyAgICogc3RyZWFtLCBpbiBieXRlcy4gVGhlIGJ1ZmZlciBpbmRpY2F0ZWQgYnkgdGhlIHBhcmFtZXRlciA8aT5idWZmZXI8L2k+CisgICAqIHNob3VsZCBiZSBlbm91Z2ggdG8gc3RvcmUgc3BlY2lmaWVkIGRhdGEuCisgICAqCisgICAqIEByZXR1cm4gMCBmb3Igc3VjY2Vzcywgb3RoZXIgdmFsdWUgZm9yIGZhaWx1cmUuCisgICAqLworICBGUERGX1JFU1VMVCAoKlJlYWRCbG9jaykoRlBERl9MUFZPSUQgY2xpZW50RGF0YSwgRlBERl9EV09SRCBvZmZzZXQsIEZQREZfTFBWT0lEIGJ1ZmZlciwgRlBERl9EV09SRCBzaXplKTsKKyAgLyoqCisgICAqIEBicmllZiAgIENhbGxiYWNrIGZ1bmN0aW9uIHRvIHdyaXRlIGRhdGEgaW50byB0aGUgY3VycmVudCBmaWxlIHN0cmVhbS4KKyAgICoKKyAgICogQHBhcmFtW2luXSAgIGNsaWVudERhdGEgIFBvaW50ZXIgdG8gdXNlci1kZWZpbmVkIGRhdGEuCisgICAqIEBwYXJhbVtpbl0gICBvZmZzZXQgICAgICBPZmZzZXQgcG9zaXRpb24gc3RhcnRzIGZyb20gdGhlIGJlZ2lubmluZyBvZiBmaWxlCisgICAqIHN0cmVhbS4gVGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdyaXRpbmcgcG9zaXRpb24uCisgICAqIEBwYXJhbVtpbl0gICBidWZmZXIgICAgICBNZW1vcnkgYnVmZmVyIGNvbnRhaW5zIGRhdGEgd2hpY2ggaXMgd3JpdHRlbiBpbnRvCisgICAqIGZpbGUgc3RyZWFtLiBUaGlzIHBhcmFtZXRlciBzaG91bGQgbm90IGJlIDxiPk5VTEw8L2I+LgorICAgKiBAcGFyYW1baW5dICAgc2l6ZSAgICAgICAgU2l6ZSBvZiBkYXRhIHdoaWNoIHNob3VsZCBiZSB3cml0dGVuIGludG8gZmlsZQorICAgKiBzdHJlYW0sIGluIGJ5dGVzLgorICAgKgorICAgKiBAcmV0dXJuIDAgZm9yIHN1Y2Nlc3MsIG90aGVyIHZhbHVlIGZvciBmYWlsdXJlLgorICAgKi8KKyAgRlBERl9SRVNVTFQgKCpXcml0ZUJsb2NrKShGUERGX0xQVk9JRCBjbGllbnREYXRhLCBGUERGX0RXT1JEIG9mZnNldCwgRlBERl9MUENWT0lEIGJ1ZmZlciwgRlBERl9EV09SRCBzaXplKTsKKyAgLyoqCisgICAqIEBicmllZiAgIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGZsdXNoIGFsbCBpbnRlcm5hbCBhY2Nlc3NpbmcgYnVmZmVycy4KKyAgICoKKyAgICogQHBhcmFtW2luXSAgIGNsaWVudERhdGEgIFBvaW50ZXIgdG8gdXNlci1kZWZpbmVkIGRhdGEuCisgICAqCisgICAqIEByZXR1cm4gMCBmb3Igc3VjY2Vzcywgb3RoZXIgdmFsdWUgZm9yIGZhaWx1cmUuCisgICAqLworICBGUERGX1JFU1VMVCAoKkZsdXNoKShGUERGX0xQVk9JRCBjbGllbnREYXRhKTsKKyAgLyoqCisgICAqIEBicmllZiAgIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGNoYW5nZSBmaWxlIHNpemUuCisgICAqCisgICAqIEBkZXRhaWxzIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHVuZGVyIHdyaXRpbmcgbW9kZSB1c3VhbGx5LiBJbXBsZW1lbnRlcgorICAgKiBjYW4gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gcmVhbGl6ZSBpdCBiYXNlZCBvbiBhcHBsaWNhdGlvbiByZXF1ZXN0cy4KKyAgICoKKyAgICogQHBhcmFtW2luXSAgIGNsaWVudERhdGEgIFBvaW50ZXIgdG8gdXNlci1kZWZpbmVkIGRhdGEuCisgICAqIEBwYXJhbVtpbl0gICBzaXplICAgICAgICBOZXcgc2l6ZSBvZiBmaWxlIHN0cmVhbSwgaW4gYnl0ZXMuCisgICAqCisgICAqIEByZXR1cm4gMCBmb3Igc3VjY2Vzcywgb3RoZXIgdmFsdWUgZm9yIGZhaWx1cmUuCisgICAqLworICBGUERGX1JFU1VMVCAoKlRydW5jYXRlKShGUERGX0xQVk9JRCBjbGllbnREYXRhLCBGUERGX0RXT1JEIHNpemUpOworCit9IEZQREZfRklMRUhBTkRMRVIsICpGUERGX0xQRklMRUhBTkRMRVI7CisKKyNlbmRpZgogLy8gRnVuY3Rpb246IEZQREZfTG9hZEN1c3RvbURvY3VtZW50CiAvLyAgICAgICAgICBMb2FkIFBERiBkb2N1bWVudCBmcm9tIGEgY3VzdG9tIGFjY2VzcyBkZXNjcmlwdG9yLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBGaWxlQWNjZXNzIC0gICBBIHN0cnVjdHVyZSBmb3IgYWNjZXNzIHRoZSBmaWxlLgorLy8gICAgICAgICAgcEZpbGVBY2Nlc3MgLSAgIEEgc3RydWN0dXJlIGZvciBhY2Nlc3NpbmcgdGhlIGZpbGUuCiAvLyAgICAgICAgICBwYXNzd29yZCAgICAtICAgT3B0aW9uYWwgcGFzc3dvcmQgZm9yIGRlY3J5cHRpbmcgdGhlIFBERiBmaWxlLgogLy8gUmV0dXJuIHZhbHVlOgotLy8gICAgICAgICAgQSBoYW5kbGUgdG8gdGhlIGxvYWRlZCBkb2N1bWVudC4gSWYgZmFpbGVkLCBOVUxMIGlzIHJldHVybmVkLgorLy8gICAgICAgICAgQSBoYW5kbGUgdG8gdGhlIGxvYWRlZCBkb2N1bWVudCwgb3IgTlVMTCBvbiBmYWlsdXJlLgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIG1haW50YWluIHRoZSBmaWxlIHJlc291cmNlcyBiZWluZyB2YWxpZCB1bnRpbCB0aGUgUERGIGRvY3VtZW50IGNsb3NlLgotLy8gICAgICAgICAgTG9hZGVkIGRvY3VtZW50IGNhbiBiZSBjbG9zZWQgYnkgRlBERl9DbG9zZURvY3VtZW50LgotRExMRVhQT1JUIEZQREZfRE9DVU1FTlQgU1REQ0FMTCBGUERGX0xvYWRDdXN0b21Eb2N1bWVudChGUERGX0ZJTEVBQ0NFU1MqIHBGaWxlQWNjZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgcGFzc3dvcmQpOworLy8gICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIG11c3Qga2VlcCB0aGUgZmlsZSByZXNvdXJjZXMgdmFsaWQgdW50aWwgdGhlIFBERgorLy8gICAgICAgICAgZG9jdW1lbnQgaXMgY2xvc2VkLgorLy8KKy8vICAgICAgICAgIFRoZSBsb2FkZWQgZG9jdW1lbnQgY2FuIGJlIGNsb3NlZCB3aXRoIEZQREZfQ2xvc2VEb2N1bWVudC4KKy8vIE5vdGVzOgorLy8gICAgICAgICAgSWYgUERGaXVtIGlzIGJ1aWx0IHdpdGggdGhlIFhGQSBtb2R1bGUsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgY2FsbAorLy8gICAgICAgICAgRlBERl9Mb2FkWEZBKCkgZnVuY3Rpb24gYWZ0ZXIgdGhlIFBERiBkb2N1bWVudCBsb2FkZWQgdG8gc3VwcG9ydCBYRkEKKy8vICAgICAgICAgIGZpZWxkcyBkZWZpbmVkIGluIHRoZSBmcGRmZm9ybWZpbGwuaCBmaWxlLgorRExMRVhQT1JUIEZQREZfRE9DVU1FTlQgU1REQ0FMTAorRlBERl9Mb2FkQ3VzdG9tRG9jdW1lbnQoRlBERl9GSUxFQUNDRVNTKiBwRmlsZUFjY2VzcywgRlBERl9CWVRFU1RSSU5HIHBhc3N3b3JkKTsKIAogLy8gRnVuY3Rpb246IEZQREZfR2V0RmlsZVZlcnNpb24KLS8vICAgICAgICAgIEdldCB0aGUgZmlsZSB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpYyBQREYgZG9jdW1lbnQuCisvLyAgICAgICAgICBHZXQgdGhlIGZpbGUgdmVyc2lvbiBvZiB0aGUgZ2l2ZW4gUERGIGRvY3VtZW50LgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGRvYyAgICAgICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuCi0vLyAgICAgICAgICBmaWxlVmVyc2lvbiAtICAgVGhlIFBERiBmaWxlIHZlcnNpb24uIEZpbGUgdmVyc2lvbjogMTQgZm9yIDEuNCwgMTUgZm9yIDEuNSwgLi4uCisvLyAgICAgICAgICBkb2MgICAgICAgICAtICAgSGFuZGxlIHRvIGEgZG9jdW1lbnQuCisvLyAgICAgICAgICBmaWxlVmVyc2lvbiAtICAgVGhlIFBERiBmaWxlIHZlcnNpb24uIEZpbGUgdmVyc2lvbjogMTQgZm9yIDEuNCwgMTUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgMS41LCAuLi4KIC8vIFJldHVybiB2YWx1ZToKLS8vICAgICAgICAgIFRSVUUgaWYgdGhpcyBjYWxsIHN1Y2NlZWQsIElmIGZhaWxlZCwgRkFMU0UgaXMgcmV0dXJuZWQuCisvLyAgICAgICAgICBUcnVlIGlmIHN1Y2NlZWRzLCBmYWxzZSBvdGhlcndpc2UuCiAvLyBDb21tZW50czoKLS8vICAgICAgICAgIElmIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkIGJ5IGZ1bmN0aW9uIDo6RlBERl9DcmVhdGVOZXdEb2N1bWVudCwgdGhlbiB0aGlzIGZ1bmN0aW9uIHdvdWxkIGFsd2F5cyBmYWlsLgotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfR2V0RmlsZVZlcnNpb24oRlBERl9ET0NVTUVOVCBkb2MsIGludCogZmlsZVZlcnNpb24pOworLy8gICAgICAgICAgSWYgdGhlIGRvY3VtZW50IHdhcyBjcmVhdGVkIGJ5IEZQREZfQ3JlYXRlTmV3RG9jdW1lbnQsCisvLyAgICAgICAgICB0aGVuIHRoaXMgZnVuY3Rpb24gd2lsbCBhbHdheXMgZmFpbC4KK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX0dldEZpbGVWZXJzaW9uKEZQREZfRE9DVU1FTlQgZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBmaWxlVmVyc2lvbik7CiAKLSNkZWZpbmUgRlBERl9FUlJfU1VDQ0VTUyAgICAgICAgMCAgICAgICAvLyBObyBlcnJvci4KLSNkZWZpbmUgRlBERl9FUlJfVU5LTk9XTiAgICAgICAgMSAgICAgICAvLyBVbmtub3duIGVycm9yLgotI2RlZmluZSBGUERGX0VSUl9GSUxFICAgICAgICAgICAyICAgICAgIC8vIEZpbGUgbm90IGZvdW5kIG9yIGNvdWxkIG5vdCBiZSBvcGVuZWQuCi0jZGVmaW5lIEZQREZfRVJSX0ZPUk1BVCAgICAgICAgIDMgICAgICAgLy8gRmlsZSBub3QgaW4gUERGIGZvcm1hdCBvciBjb3JydXB0ZWQuCi0jZGVmaW5lIEZQREZfRVJSX1BBU1NXT1JEICAgICAgIDQgICAgICAgLy8gUGFzc3dvcmQgcmVxdWlyZWQgb3IgaW5jb3JyZWN0IHBhc3N3b3JkLgotI2RlZmluZSBGUERGX0VSUl9TRUNVUklUWSAgICAgICA1ICAgICAgIC8vIFVuc3VwcG9ydGVkIHNlY3VyaXR5IHNjaGVtZS4KLSNkZWZpbmUgRlBERl9FUlJfUEFHRSAgICAgICAgICAgNiAgICAgICAvLyBQYWdlIG5vdCBmb3VuZCBvciBjb250ZW50IGVycm9yLgorI2RlZmluZSBGUERGX0VSUl9TVUNDRVNTIDAgICAgLy8gTm8gZXJyb3IuCisjZGVmaW5lIEZQREZfRVJSX1VOS05PV04gMSAgICAvLyBVbmtub3duIGVycm9yLgorI2RlZmluZSBGUERGX0VSUl9GSUxFIDIgICAgICAgLy8gRmlsZSBub3QgZm91bmQgb3IgY291bGQgbm90IGJlIG9wZW5lZC4KKyNkZWZpbmUgRlBERl9FUlJfRk9STUFUIDMgICAgIC8vIEZpbGUgbm90IGluIFBERiBmb3JtYXQgb3IgY29ycnVwdGVkLgorI2RlZmluZSBGUERGX0VSUl9QQVNTV09SRCA0ICAgLy8gUGFzc3dvcmQgcmVxdWlyZWQgb3IgaW5jb3JyZWN0IHBhc3N3b3JkLgorI2RlZmluZSBGUERGX0VSUl9TRUNVUklUWSA1ICAgLy8gVW5zdXBwb3J0ZWQgc2VjdXJpdHkgc2NoZW1lLgorI2RlZmluZSBGUERGX0VSUl9QQUdFIDYgICAgICAgLy8gUGFnZSBub3QgZm91bmQgb3IgY29udGVudCBlcnJvci4KKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorI2RlZmluZSBGUERGX0VSUl9YRkFMT0FEIDcgICAgLy8gTG9hZCBYRkEgZXJyb3IuCisjZGVmaW5lIEZQREZfRVJSX1hGQUxBWU9VVCA4ICAvLyBMYXlvdXQgWEZBIGVycm9yLgorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCiAvLyBGdW5jdGlvbjogRlBERl9HZXRMYXN0RXJyb3IKLS8vICAgICAgICAgIEdldCBsYXN0IGVycm9yIGNvZGUgd2hlbiBhbiBTREsgZnVuY3Rpb24gZmFpbGVkLgorLy8gICAgICAgICAgR2V0IGxhc3QgZXJyb3IgY29kZSB3aGVuIGEgZnVuY3Rpb24gZmFpbHMuCiAvLyBQYXJhbWV0ZXJzOgogLy8gICAgICAgICAgTm9uZS4KIC8vIFJldHVybiB2YWx1ZToKLS8vICAgICAgICAgIEEgMzItYml0IGludGVnZXIgaW5kaWNhdGluZyBlcnJvciBjb2RlcyAoZGVmaW5lZCBhYm92ZSkuCisvLyAgICAgICAgICBBIDMyLWJpdCBpbnRlZ2VyIGluZGljYXRpbmcgZXJyb3IgY29kZSBhcyBkZWZpbmVkIGFib3ZlLgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBJZiB0aGUgcHJldmlvdXMgU0RLIGNhbGwgc3VjY2VlZGVkLCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24KLS8vICAgICAgICAgIGlzIG5vdCBkZWZpbmVkLgotLy8KKy8vICAgICAgICAgIElmIHRoZSBwcmV2aW91cyBTREsgY2FsbCBzdWNjZWVkZWQsIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcworLy8gICAgICAgICAgZnVuY3Rpb24gaXMgbm90IGRlZmluZWQuCiBETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZfR2V0TGFzdEVycm9yKCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX0dldERvY1Blcm1pc3Npb24KIC8vICAgICAgICAgIEdldCBmaWxlIHBlcm1pc3Npb24gZmxhZ3Mgb2YgdGhlIGRvY3VtZW50LgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgorLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byBhIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudC4KIC8vIFJldHVybiB2YWx1ZToKLS8vICAgICAgICAgIEEgMzItYml0IGludGVnZXIgaW5kaWNhdGluZyBwZXJtaXNzaW9uIGZsYWdzLiBQbGVhc2UgcmVmZXIgdG8gUERGIFJlZmVyZW5jZSBmb3IKLS8vICAgICAgICAgIGRldGFpbGVkIGRlc2NyaXB0aW9uLiBJZiB0aGUgZG9jdW1lbnQgaXMgbm90IHByb3RlY3RlZCwgMHhmZmZmZmZmZiB3aWxsIGJlIHJldHVybmVkLgotLy8KKy8vICAgICAgICAgIEEgMzItYml0IGludGVnZXIgaW5kaWNhdGluZyBwZXJtaXNzaW9uIGZsYWdzLiBQbGVhc2UgcmVmZXIgdG8gdGhlCisvLyAgICAgICAgICBQREYgUmVmZXJlbmNlIGZvciBkZXRhaWxlZCBkZXNjcmlwdGlvbnMuIElmIHRoZSBkb2N1bWVudCBpcyBub3QKKy8vICAgICAgICAgIHByb3RlY3RlZCwgMHhmZmZmZmZmZiB3aWxsIGJlIHJldHVybmVkLgogRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGX0dldERvY1Blcm1pc3Npb25zKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpOwogCiAvLyBGdW5jdGlvbjogRlBERl9HZXRTZWN1cml0eUhhbmRsZXJSZXZpc2lvbgotLy8gICAgICAgICAgR2V0IHRoZSByZXZpc2lvbiBmb3Igc2VjdXJpdHkgaGFuZGxlci4KKy8vICAgICAgICAgIEdldCB0aGUgcmV2aXNpb24gZm9yIHRoZSBzZWN1cml0eSBoYW5kbGVyLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgorLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byBhIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudC4KIC8vIFJldHVybiB2YWx1ZToKLS8vICAgICAgICAgIFRoZSBzZWN1cml0eSBoYW5kbGVyIHJldmlzaW9uIG51bWJlci4gUGxlYXNlIHJlZmVyIHRvIFBERiBSZWZlcmVuY2UgZm9yCi0vLyAgICAgICAgICBkZXRhaWxlZCBkZXNjcmlwdGlvbi4gSWYgdGhlIGRvY3VtZW50IGlzIG5vdCBwcm90ZWN0ZWQsIC0xIHdpbGwgYmUgcmV0dXJuZWQuCi0vLworLy8gICAgICAgICAgVGhlIHNlY3VyaXR5IGhhbmRsZXIgcmV2aXNpb24gbnVtYmVyLiBQbGVhc2UgcmVmZXIgdG8gdGhlIFBERgorLy8gICAgICAgICAgUmVmZXJlbmNlIGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uLiBJZiB0aGUgZG9jdW1lbnQgaXMgbm90CisvLyAgICAgICAgICBwcm90ZWN0ZWQsIC0xIHdpbGwgYmUgcmV0dXJuZWQuCiBETExFWFBPUlQgaW50IFNURENBTEwgRlBERl9HZXRTZWN1cml0eUhhbmRsZXJSZXZpc2lvbihGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKIAogLy8gRnVuY3Rpb246IEZQREZfR2V0UGFnZUNvdW50Ci0vLyAgICAgICAgICBHZXQgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGluIGEgZG9jdW1lbnQuCisvLyAgICAgICAgICBHZXQgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBkb2N1bWVudC4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KKy8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50LgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVG90YWwgbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBkb2N1bWVudC4KLS8vCiBETExFWFBPUlQgaW50IFNURENBTEwgRlBERl9HZXRQYWdlQ291bnQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX0xvYWRQYWdlCi0vLyAgICAgICAgICBMb2FkIGEgcGFnZSBpbnNpZGUgYSBkb2N1bWVudC4KKy8vICAgICAgICAgIExvYWQgYSBwYWdlIGluc2lkZSB0aGUgZG9jdW1lbnQuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQgZnVuY3Rpb24uCisvLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudAogLy8gICAgICAgICAgcGFnZV9pbmRleCAgLSAgIEluZGV4IG51bWJlciBvZiB0aGUgcGFnZS4gMCBmb3IgdGhlIGZpcnN0IHBhZ2UuCiAvLyBSZXR1cm4gdmFsdWU6Ci0vLyAgICAgICAgICBBIGhhbmRsZSB0byB0aGUgbG9hZGVkIHBhZ2UuIElmIGZhaWxlZCwgTlVMTCBpcyByZXR1cm5lZC4KKy8vICAgICAgICAgIEEgaGFuZGxlIHRvIHRoZSBsb2FkZWQgcGFnZSwgb3IgTlVMTCBpZiBwYWdlIGxvYWQgZmFpbHMuCiAvLyBDb21tZW50czoKLS8vICAgICAgICAgIExvYWRlZCBwYWdlIGNhbiBiZSByZW5kZXJlZCB0byBkZXZpY2VzIHVzaW5nIEZQREZfUmVuZGVyUGFnZSBmdW5jdGlvbi4KLS8vICAgICAgICAgIExvYWRlZCBwYWdlIGNhbiBiZSBjbG9zZWQgYnkgRlBERl9DbG9zZVBhZ2UuCi0vLwotRExMRVhQT1JUIEZQREZfUEFHRSBTVERDQUxMIEZQREZfTG9hZFBhZ2UoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgaW50IHBhZ2VfaW5kZXgpOworLy8gICAgICAgICAgVGhlIGxvYWRlZCBwYWdlIGNhbiBiZSByZW5kZXJlZCB0byBkZXZpY2VzIHVzaW5nIEZQREZfUmVuZGVyUGFnZS4KKy8vICAgICAgICAgIFRoZSBsb2FkZWQgcGFnZSBjYW4gYmUgY2xvc2VkIHVzaW5nIEZQREZfQ2xvc2VQYWdlLgorRExMRVhQT1JUIEZQREZfUEFHRSBTVERDQUxMIEZQREZfTG9hZFBhZ2UoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWdlX2luZGV4KTsKIAogLy8gRnVuY3Rpb246IEZQREZfR2V0UGFnZVdpZHRoCiAvLyAgICAgICAgICBHZXQgcGFnZSB3aWR0aC4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgorLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZS4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFBhZ2Ugd2lkdGggKGV4Y2x1ZGluZyBub24tZGlzcGxheWFibGUgYXJlYSkgbWVhc3VyZWQgaW4gcG9pbnRzLgogLy8gICAgICAgICAgT25lIHBvaW50IGlzIDEvNzIgaW5jaCAoYXJvdW5kIDAuMzUyOCBtbSkuCi0vLwogRExMRVhQT1JUIGRvdWJsZSBTVERDQUxMIEZQREZfR2V0UGFnZVdpZHRoKEZQREZfUEFHRSBwYWdlKTsKIAogLy8gRnVuY3Rpb246IEZQREZfR2V0UGFnZUhlaWdodAogLy8gICAgICAgICAgR2V0IHBhZ2UgaGVpZ2h0LgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCisvLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgUGFnZSBoZWlnaHQgKGV4Y2x1ZGluZyBub24tZGlzcGxheWFibGUgYXJlYSkgbWVhc3VyZWQgaW4gcG9pbnRzLgogLy8gICAgICAgICAgT25lIHBvaW50IGlzIDEvNzIgaW5jaCAoYXJvdW5kIDAuMzUyOCBtbSkKLS8vCiBETExFWFBPUlQgZG91YmxlIFNURENBTEwgRlBERl9HZXRQYWdlSGVpZ2h0KEZQREZfUEFHRSBwYWdlKTsKIAogLy8gRnVuY3Rpb246IEZQREZfR2V0UGFnZVNpemVCeUluZGV4Ci0vLyAgICAgICAgICBHZXQgdGhlIHNpemUgb2YgYSBwYWdlIGJ5IGluZGV4LgorLy8gICAgICAgICAgR2V0IHRoZSBzaXplIG9mIHRoZSBwYWdlIGF0IHRoZSBnaXZlbiBpbmRleC4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KKy8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50LgogLy8gICAgICAgICAgcGFnZV9pbmRleCAgLSAgIFBhZ2UgaW5kZXgsIHplcm8gZm9yIHRoZSBmaXJzdCBwYWdlLgotLy8gICAgICAgICAgd2lkdGggICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSBwYWdlIHdpZHRoIChpbiBwb2ludHMpLgotLy8gICAgICAgICAgaGVpZ2h0ICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSBwYWdlIGhlaWdodCAoaW4gcG9pbnRzKS4KKy8vICAgICAgICAgIHdpZHRoICAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIHRvIHJlY2VpdmUgdGhlIHBhZ2Ugd2lkdGgKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAoaW4gcG9pbnRzKS4KKy8vICAgICAgICAgIGhlaWdodCAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIHRvIHJlY2VpdmUgdGhlIHBhZ2UgaGVpZ2h0CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgKGluIHBvaW50cykuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBOb24temVybyBmb3Igc3VjY2Vzcy4gMCBmb3IgZXJyb3IgKGRvY3VtZW50IG9yIHBhZ2Ugbm90IGZvdW5kKS4KLS8vCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERl9HZXRQYWdlU2l6ZUJ5SW5kZXgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgaW50IHBhZ2VfaW5kZXgsIGRvdWJsZSogd2lkdGgsIGRvdWJsZSogaGVpZ2h0KTsKK0RMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGX0dldFBhZ2VTaXplQnlJbmRleChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWdlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBoZWlnaHQpOwogCi0vLyBQYWdlIHJlbmRlcmluZyBmbGFncy4gVGhleSBjYW4gYmUgY29tYmluZWQgd2l0aCBiaXQgT1IuCi0jZGVmaW5lIEZQREZfQU5OT1QgICAgICAgICAgMHgwMSAgICAgICAgLy8gU2V0IGlmIGFubm90YXRpb25zIGFyZSB0byBiZSByZW5kZXJlZC4KLSNkZWZpbmUgRlBERl9MQ0RfVEVYVCAgICAgICAweDAyICAgICAgICAvLyBTZXQgaWYgdXNpbmcgdGV4dCByZW5kZXJpbmcgb3B0aW1pemVkIGZvciBMQ0QgZGlzcGxheS4KLSNkZWZpbmUgRlBERl9OT19OQVRJVkVURVhUICAweDA0ICAgICAgICAvLyBEb24ndCB1c2UgdGhlIG5hdGl2ZSB0ZXh0IG91dHB1dCBhdmFpbGFibGUgb24gc29tZSBwbGF0Zm9ybXMKLSNkZWZpbmUgRlBERl9HUkFZU0NBTEUgICAgICAweDA4ICAgICAgICAvLyBHcmF5c2NhbGUgb3V0cHV0LgotI2RlZmluZSBGUERGX0RFQlVHX0lORk8gICAgIDB4ODAgICAgICAgIC8vIFNldCBpZiB5b3Ugd2FudCB0byBnZXQgc29tZSBkZWJ1ZyBpbmZvLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBsZWFzZSBkaXNjdXNzIHdpdGggRm94aXQgZmlyc3QgaWYgeW91IG5lZWQgdG8gY29sbGVjdCBkZWJ1ZyBpbmZvLgotI2RlZmluZSBGUERGX05PX0NBVENIICAgICAgIDB4MTAwICAgICAgIC8vIFNldCBpZiB5b3UgZG9uJ3Qgd2FudCB0byBjYXRjaCBleGNlcHRpb24uCi0jZGVmaW5lIEZQREZfUkVOREVSX0xJTUlURURJTUFHRUNBQ0hFICAgMHgyMDAgICAvLyBMaW1pdCBpbWFnZSBjYWNoZSBzaXplLgotI2RlZmluZSBGUERGX1JFTkRFUl9GT1JDRUhBTEZUT05FICAgICAgIDB4NDAwICAgLy8gQWx3YXlzIHVzZSBoYWxmdG9uZSBmb3IgaW1hZ2Ugc3RyZXRjaGluZy4KLSNkZWZpbmUgRlBERl9QUklOVElORyAgICAgICAweDgwMCAgIC8vIFJlbmRlciBmb3IgcHJpbnRpbmcuCi0jZGVmaW5lIEZQREZfUkVOREVSX05PX1NNT09USFRFWFQgICAweDEwMDAgIC8vIFNldCB0byBkaXNhYmxlIGFudGktYWxpYXNpbmcgb24gdGV4dC4KLSNkZWZpbmUgRlBERl9SRU5ERVJfTk9fU01PT1RISU1BR0UgIDB4MjAwMCAgLy8gU2V0IHRvIGRpc2FibGUgYW50aS1hbGlhc2luZyBvbiBpbWFnZXMuCi0jZGVmaW5lIEZQREZfUkVOREVSX05PX1NNT09USFBBVEggICAweDQwMDAgIC8vIFNldCB0byBkaXNhYmxlIGFudGktYWxpYXNpbmcgb24gcGF0aHMuCi0jZGVmaW5lIEZQREZfUkVWRVJTRV9CWVRFX09SREVSICAgICAweDEwICAgICAgICAvL3NldCB3aGV0aGVyIHJlbmRlciBpbiBhIHJldmVyc2UgQnl0ZSBvcmRlciwgdGhpcyBmbGFnIG9ubHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZW5hYmxlIHdoZW4gcmVuZGVyIHRvIGEgYml0bWFwLgorLy8gUGFnZSByZW5kZXJpbmcgZmxhZ3MuIFRoZXkgY2FuIGJlIGNvbWJpbmVkIHdpdGggYml0LXdpc2UgT1IuCisvLworLy8gU2V0IGlmIGFubm90YXRpb25zIGFyZSB0byBiZSByZW5kZXJlZC4KKyNkZWZpbmUgRlBERl9BTk5PVCAweDAxCisvLyBTZXQgaWYgdXNpbmcgdGV4dCByZW5kZXJpbmcgb3B0aW1pemVkIGZvciBMQ0QgZGlzcGxheS4KKyNkZWZpbmUgRlBERl9MQ0RfVEVYVCAweDAyCisvLyBEb24ndCB1c2UgdGhlIG5hdGl2ZSB0ZXh0IG91dHB1dCBhdmFpbGFibGUgb24gc29tZSBwbGF0Zm9ybXMKKyNkZWZpbmUgRlBERl9OT19OQVRJVkVURVhUIDB4MDQKKy8vIEdyYXlzY2FsZSBvdXRwdXQuCisjZGVmaW5lIEZQREZfR1JBWVNDQUxFIDB4MDgKKy8vIFNldCBpZiB5b3Ugd2FudCB0byBnZXQgc29tZSBkZWJ1ZyBpbmZvLgorI2RlZmluZSBGUERGX0RFQlVHX0lORk8gMHg4MAorLy8gU2V0IGlmIHlvdSBkb24ndCB3YW50IHRvIGNhdGNoIGV4Y2VwdGlvbnMuCisjZGVmaW5lIEZQREZfTk9fQ0FUQ0ggMHgxMDAKKy8vIExpbWl0IGltYWdlIGNhY2hlIHNpemUuCisjZGVmaW5lIEZQREZfUkVOREVSX0xJTUlURURJTUFHRUNBQ0hFIDB4MjAwCisvLyBBbHdheXMgdXNlIGhhbGZ0b25lIGZvciBpbWFnZSBzdHJldGNoaW5nLgorI2RlZmluZSBGUERGX1JFTkRFUl9GT1JDRUhBTEZUT05FIDB4NDAwCisvLyBSZW5kZXIgZm9yIHByaW50aW5nLgorI2RlZmluZSBGUERGX1BSSU5USU5HIDB4ODAwCisvLyBTZXQgdG8gZGlzYWJsZSBhbnRpLWFsaWFzaW5nIG9uIHRleHQuCisjZGVmaW5lIEZQREZfUkVOREVSX05PX1NNT09USFRFWFQgMHgxMDAwCisvLyBTZXQgdG8gZGlzYWJsZSBhbnRpLWFsaWFzaW5nIG9uIGltYWdlcy4KKyNkZWZpbmUgRlBERl9SRU5ERVJfTk9fU01PT1RISU1BR0UgMHgyMDAwCisvLyBTZXQgdG8gZGlzYWJsZSBhbnRpLWFsaWFzaW5nIG9uIHBhdGhzLgorI2RlZmluZSBGUERGX1JFTkRFUl9OT19TTU9PVEhQQVRIIDB4NDAwMAorLy8gU2V0IHdoZXRoZXIgdG8gcmVuZGVyIGluIGEgcmV2ZXJzZSBCeXRlIG9yZGVyLCB0aGlzIGZsYWcgaXMgb25seSB1c2VkIHdoZW4KKy8vIHJlbmRlcmluZyB0byBhIGJpdG1hcC4KKyNkZWZpbmUgRlBERl9SRVZFUlNFX0JZVEVfT1JERVIgMHgxMAorCiAjaWZkZWYgX1dJTjMyCiAvLyBGdW5jdGlvbjogRlBERl9SZW5kZXJQYWdlCi0vLyAgICAgICAgICBSZW5kZXIgY29udGVudHMgaW4gYSBwYWdlIHRvIGEgZGV2aWNlIChzY3JlZW4sIGJpdG1hcCwgb3IgcHJpbnRlcikuCi0vLyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIG9uIFdpbmRvd3Mgc3lzdGVtLgorLy8gICAgICAgICAgUmVuZGVyIGNvbnRlbnRzIG9mIGEgcGFnZSB0byBhIGRldmljZSAoc2NyZWVuLCBiaXRtYXAsIG9yIHByaW50ZXIpLgorLy8gICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBvbiBXaW5kb3dzLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGRjICAgICAgICAgIC0gICBIYW5kbGUgdG8gZGV2aWNlIGNvbnRleHQuCi0vLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgotLy8gICAgICAgICAgc3RhcnRfeCAgICAgLSAgIExlZnQgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgZGV2aWNlIGNvb3JkaW5hdGUuCi0vLyAgICAgICAgICBzdGFydF95ICAgICAtICAgVG9wIHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IGFyZWEgaW4gdGhlIGRldmljZSBjb29yZGluYXRlLgorLy8gICAgICAgICAgZGMgICAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgZGV2aWNlIGNvbnRleHQuCisvLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlLgorLy8gICAgICAgICAgc3RhcnRfeCAgICAgLSAgIExlZnQgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSBjb29yZGluYXRlcy4KKy8vICAgICAgICAgIHN0YXJ0X3kgICAgIC0gICBUb3AgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiBkZXZpY2UKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlcy4KIC8vICAgICAgICAgIHNpemVfeCAgICAgIC0gICBIb3Jpem9udGFsIHNpemUgKGluIHBpeGVscykgZm9yIGRpc3BsYXlpbmcgdGhlIHBhZ2UuCiAvLyAgICAgICAgICBzaXplX3kgICAgICAtICAgVmVydGljYWwgc2l6ZSAoaW4gcGl4ZWxzKSBmb3IgZGlzcGxheWluZyB0aGUgcGFnZS4KLS8vICAgICAgICAgIHJvdGF0ZSAgICAgIC0gICBQYWdlIG9yaWVudGF0aW9uOiAwIChub3JtYWwpLCAxIChyb3RhdGVkIDkwIGRlZ3JlZXMgY2xvY2t3aXNlKSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAocm90YXRlZCAxODAgZGVncmVlcyksIDMgKHJvdGF0ZWQgOTAgZGVncmVlcyBjb3VudGVyLWNsb2Nrd2lzZSkuCi0vLyAgICAgICAgICBmbGFncyAgICAgICAtICAgMCBmb3Igbm9ybWFsIGRpc3BsYXksIG9yIGNvbWJpbmF0aW9uIG9mIGZsYWdzIGRlZmluZWQgYWJvdmUuCisvLyAgICAgICAgICByb3RhdGUgICAgICAtICAgUGFnZSBvcmllbnRhdGlvbjoKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKG5vcm1hbCkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKHJvdGF0ZWQgOTAgZGVncmVlcyBjbG9ja3dpc2UpCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIChyb3RhdGVkIDE4MCBkZWdyZWVzKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAocm90YXRlZCA5MCBkZWdyZWVzIGNvdW50ZXItY2xvY2t3aXNlKQorLy8gICAgICAgICAgZmxhZ3MgICAgICAgLSAgIDAgZm9yIG5vcm1hbCBkaXNwbGF5LCBvciBjb21iaW5hdGlvbiBvZiBmbGFncworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgYWJvdmUuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBOb25lLgotLy8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9SZW5kZXJQYWdlKEhEQyBkYywgRlBERl9QQUdFIHBhZ2UsIGludCBzdGFydF94LCBpbnQgc3RhcnRfeSwgaW50IHNpemVfeCwgaW50IHNpemVfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsIGludCBmbGFncyk7CitETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfUmVuZGVyUGFnZShIREMgZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpOwogI2VuZGlmCiAKIC8vIEZ1bmN0aW9uOiBGUERGX1JlbmRlclBhZ2VCaXRtYXAKLS8vICAgICAgICAgIFJlbmRlciBjb250ZW50cyBpbiBhIHBhZ2UgdG8gYSBkZXZpY2UgaW5kZXBlbmRlbnQgYml0bWFwCisvLyAgICAgICAgICBSZW5kZXIgY29udGVudHMgb2YgYSBwYWdlIHRvIGEgZGV2aWNlIGluZGVwZW5kZW50IGJpdG1hcC4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBiaXRtYXAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBkZXZpY2UgaW5kZXBlbmRlbnQgYml0bWFwIChhcyB0aGUgb3V0cHV0IGJ1ZmZlcikuCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwIGhhbmRsZSBjYW4gYmUgY3JlYXRlZCBieSBGUERGQml0bWFwX0NyZWF0ZSBmdW5jdGlvbi4KLS8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCi0vLyAgICAgICAgICBzdGFydF94ICAgICAtICAgTGVmdCBwaXhlbCBwb3NpdGlvbiBvZiB0aGUgZGlzcGxheSBhcmVhIGluIHRoZSBiaXRtYXAgY29vcmRpbmF0ZS4KLS8vICAgICAgICAgIHN0YXJ0X3kgICAgIC0gICBUb3AgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgYml0bWFwIGNvb3JkaW5hdGUuCisvLyAgICAgICAgICBiaXRtYXAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBkZXZpY2UgaW5kZXBlbmRlbnQgYml0bWFwIChhcyB0aGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgYnVmZmVyKS4gVGhlIGJpdG1hcCBoYW5kbGUgY2FuIGJlIGNyZWF0ZWQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBieSBGUERGQml0bWFwX0NyZWF0ZS4KKy8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UKKy8vICAgICAgICAgIHN0YXJ0X3ggICAgIC0gICBMZWZ0IHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IGFyZWEgaW4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXAgY29vcmRpbmF0ZXMuCisvLyAgICAgICAgICBzdGFydF95ICAgICAtICAgVG9wIHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IGFyZWEgaW4gYml0bWFwCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMuCiAvLyAgICAgICAgICBzaXplX3ggICAgICAtICAgSG9yaXpvbnRhbCBzaXplIChpbiBwaXhlbHMpIGZvciBkaXNwbGF5aW5nIHRoZSBwYWdlLgogLy8gICAgICAgICAgc2l6ZV95ICAgICAgLSAgIFZlcnRpY2FsIHNpemUgKGluIHBpeGVscykgZm9yIGRpc3BsYXlpbmcgdGhlIHBhZ2UuCi0vLyAgICAgICAgICByb3RhdGUgICAgICAtICAgUGFnZSBvcmllbnRhdGlvbjogMCAobm9ybWFsKSwgMSAocm90YXRlZCA5MCBkZWdyZWVzIGNsb2Nrd2lzZSksCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKHJvdGF0ZWQgMTgwIGRlZ3JlZXMpLCAzIChyb3RhdGVkIDkwIGRlZ3JlZXMgY291bnRlci1jbG9ja3dpc2UpLgotLy8gICAgICAgICAgZmxhZ3MgICAgICAgLSAgIDAgZm9yIG5vcm1hbCBkaXNwbGF5LCBvciBjb21iaW5hdGlvbiBvZiBmbGFncyBkZWZpbmVkIGFib3ZlLgorLy8gICAgICAgICAgcm90YXRlICAgICAgLSAgIFBhZ2Ugb3JpZW50YXRpb246CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIChub3JtYWwpCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIChyb3RhdGVkIDkwIGRlZ3JlZXMgY2xvY2t3aXNlKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAocm90YXRlZCAxODAgZGVncmVlcykKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgKHJvdGF0ZWQgOTAgZGVncmVlcyBjb3VudGVyLWNsb2Nrd2lzZSkKKy8vICAgICAgICAgIGZsYWdzICAgICAgIC0gICAwIGZvciBub3JtYWwgZGlzcGxheSwgb3IgY29tYmluYXRpb24gb2YgZmxhZ3MKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGFib3ZlLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTm9uZS4KLS8vCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfUmVuZGVyUGFnZUJpdG1hcChGUERGX0JJVE1BUCBiaXRtYXAsIEZQREZfUEFHRSBwYWdlLCBpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LCBpbnQgc2l6ZV95LCBpbnQgcm90YXRlLCBpbnQgZmxhZ3MpOworRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1JlbmRlclBhZ2VCaXRtYXAoRlBERl9CSVRNQVAgYml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKIAogLy8gRnVuY3Rpb246IEZQREZfQ2xvc2VQYWdlCiAvLyAgICAgICAgICBDbG9zZSBhIGxvYWRlZCBQREYgcGFnZS4KQEAgLTM3Niw3ICs1ODIsNiBAQAogLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgbG9hZGVkIHBhZ2UuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBOb25lLgotLy8KIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9DbG9zZVBhZ2UoRlBERl9QQUdFIHBhZ2UpOwogCiAvLyBGdW5jdGlvbjogRlBERl9DbG9zZURvY3VtZW50CkBAIC0zODUsMTc3ICs1OTAsMjUyIEBACiAvLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIHRoZSBsb2FkZWQgZG9jdW1lbnQuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBOb25lLgotLy8KIERMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9DbG9zZURvY3VtZW50KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpOwogCiAvLyBGdW5jdGlvbjogRlBERl9EZXZpY2VUb1BhZ2UKLS8vICAgICAgICAgIENvbnZlcnQgdGhlIHNjcmVlbiBjb29yZGluYXRlIG9mIGEgcG9pbnQgdG8gcGFnZSBjb29yZGluYXRlLgorLy8gICAgICAgICAgQ29udmVydCB0aGUgc2NyZWVuIGNvb3JkaW5hdGVzIG9mIGEgcG9pbnQgdG8gcGFnZSBjb29yZGluYXRlcy4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlIGZ1bmN0aW9uLgotLy8gICAgICAgICAgc3RhcnRfeCAgICAgLSAgIExlZnQgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgZGV2aWNlIGNvb3JkaW5hdGUuCi0vLyAgICAgICAgICBzdGFydF95ICAgICAtICAgVG9wIHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IGFyZWEgaW4gdGhlIGRldmljZSBjb29yZGluYXRlLgorLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZS4KKy8vICAgICAgICAgIHN0YXJ0X3ggICAgIC0gICBMZWZ0IHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IGFyZWEgaW4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UgY29vcmRpbmF0ZXMuCisvLyAgICAgICAgICBzdGFydF95ICAgICAtICAgVG9wIHBpeGVsIHBvc2l0aW9uIG9mIHRoZSBkaXNwbGF5IGFyZWEgaW4gZGV2aWNlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXMuCiAvLyAgICAgICAgICBzaXplX3ggICAgICAtICAgSG9yaXpvbnRhbCBzaXplIChpbiBwaXhlbHMpIGZvciBkaXNwbGF5aW5nIHRoZSBwYWdlLgogLy8gICAgICAgICAgc2l6ZV95ICAgICAgLSAgIFZlcnRpY2FsIHNpemUgKGluIHBpeGVscykgZm9yIGRpc3BsYXlpbmcgdGhlIHBhZ2UuCi0vLyAgICAgICAgICByb3RhdGUgICAgICAtICAgUGFnZSBvcmllbnRhdGlvbjogMCAobm9ybWFsKSwgMSAocm90YXRlZCA5MCBkZWdyZWVzIGNsb2Nrd2lzZSksCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKHJvdGF0ZWQgMTgwIGRlZ3JlZXMpLCAzIChyb3RhdGVkIDkwIGRlZ3JlZXMgY291bnRlci1jbG9ja3dpc2UpLgotLy8gICAgICAgICAgZGV2aWNlX3ggICAgLSAgIFggdmFsdWUgaW4gZGV2aWNlIGNvb3JkaW5hdGUsIGZvciB0aGUgcG9pbnQgdG8gYmUgY29udmVydGVkLgotLy8gICAgICAgICAgZGV2aWNlX3kgICAgLSAgIFkgdmFsdWUgaW4gZGV2aWNlIGNvb3JkaW5hdGUsIGZvciB0aGUgcG9pbnQgdG8gYmUgY29udmVydGVkLgotLy8gICAgICAgICAgcGFnZV94ICAgICAgLSAgIEEgUG9pbnRlciB0byBhIGRvdWJsZSByZWNlaXZpbmcgdGhlIGNvbnZlcnRlZCBYIHZhbHVlIGluIHBhZ2UgY29vcmRpbmF0ZS4KLS8vICAgICAgICAgIHBhZ2VfeSAgICAgIC0gICBBIFBvaW50ZXIgdG8gYSBkb3VibGUgcmVjZWl2aW5nIHRoZSBjb252ZXJ0ZWQgWSB2YWx1ZSBpbiBwYWdlIGNvb3JkaW5hdGUuCisvLyAgICAgICAgICByb3RhdGUgICAgICAtICAgUGFnZSBvcmllbnRhdGlvbjoKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKG5vcm1hbCkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKHJvdGF0ZWQgOTAgZGVncmVlcyBjbG9ja3dpc2UpCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIChyb3RhdGVkIDE4MCBkZWdyZWVzKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAocm90YXRlZCA5MCBkZWdyZWVzIGNvdW50ZXItY2xvY2t3aXNlKQorLy8gICAgICAgICAgZGV2aWNlX3ggICAgLSAgIFggdmFsdWUgaW4gZGV2aWNlIGNvb3JkaW5hdGVzIHRvIGJlIGNvbnZlcnRlZC4KKy8vICAgICAgICAgIGRldmljZV95ICAgIC0gICBZIHZhbHVlIGluIGRldmljZSBjb29yZGluYXRlcyB0byBiZSBjb252ZXJ0ZWQuCisvLyAgICAgICAgICBwYWdlX3ggICAgICAtICAgQSBwb2ludGVyIHRvIGEgZG91YmxlIHJlY2VpdmluZyB0aGUgY29udmVydGVkIFgKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpbiBwYWdlIGNvb3JkaW5hdGVzLgorLy8gICAgICAgICAgcGFnZV95ICAgICAgLSAgIEEgcG9pbnRlciB0byBhIGRvdWJsZSByZWNlaXZpbmcgdGhlIGNvbnZlcnRlZCBZCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaW4gcGFnZSBjb29yZGluYXRlcy4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE5vbmUuCiAvLyBDb21tZW50czoKLS8vICAgICAgICAgIFRoZSBwYWdlIGNvb3JkaW5hdGUgc3lzdGVtIGhhcyBpdHMgb3JpZ2luIGF0IGxlZnQtYm90dG9tIGNvcm5lciBvZiB0aGUgcGFnZSwgd2l0aCBYIGF4aXMgZ29lcyBhbG9uZwotLy8gICAgICAgICAgdGhlIGJvdHRvbSBzaWRlIHRvIHRoZSByaWdodCwgYW5kIFkgYXhpcyBnb2VzIGFsb25nIHRoZSBsZWZ0IHNpZGUgdXB3YXJkLiBOT1RFOiB0aGlzIGNvb3JkaW5hdGUgc3lzdGVtCi0vLyAgICAgICAgICBjYW4gYmUgYWx0ZXJlZCB3aGVuIHlvdSB6b29tLCBzY3JvbGwsIG9yIHJvdGF0ZSBhIHBhZ2UsIGhvd2V2ZXIsIGEgcG9pbnQgb24gdGhlIHBhZ2Ugc2hvdWxkIGFsd2F5cyBoYXZlCisvLyAgICAgICAgICBUaGUgcGFnZSBjb29yZGluYXRlIHN5c3RlbSBoYXMgaXRzIG9yaWdpbiBhdCB0aGUgbGVmdC1ib3R0b20gY29ybmVyCisvLyAgICAgICAgICBvZiB0aGUgcGFnZSwgd2l0aCB0aGUgWC1heGlzIG9uIHRoZSBib3R0b20gZ29pbmcgdG8gdGhlIHJpZ2h0LCBhbmQKKy8vICAgICAgICAgIHRoZSBZLWF4aXMgb24gdGhlIGxlZnQgc2lkZSBnb2luZyB1cC4KKy8vCisvLyAgICAgICAgICBOT1RFOiB0aGlzIGNvb3JkaW5hdGUgc3lzdGVtIGNhbiBiZSBhbHRlcmVkIHdoZW4geW91IHpvb20sIHNjcm9sbCwKKy8vICAgICAgICAgIG9yIHJvdGF0ZSBhIHBhZ2UsIGhvd2V2ZXIsIGEgcG9pbnQgb24gdGhlIHBhZ2Ugc2hvdWxkIGFsd2F5cyBoYXZlCiAvLyAgICAgICAgICB0aGUgc2FtZSBjb29yZGluYXRlIHZhbHVlcyBpbiB0aGUgcGFnZSBjb29yZGluYXRlIHN5c3RlbS4KIC8vCi0vLyAgICAgICAgICBUaGUgZGV2aWNlIGNvb3JkaW5hdGUgc3lzdGVtIGlzIGRldmljZSBkZXBlbmRlbnQuIEZvciBzY3JlZW4gZGV2aWNlLCBpdHMgb3JpZ2luIGlzIGF0IGxlZnQtdG9wCi0vLyAgICAgICAgICBjb3JuZXIgb2YgdGhlIHdpbmRvdy4gSG93ZXZlciB0aGlzIG9yaWdpbiBjYW4gYmUgYWx0ZXJlZCBieSBXaW5kb3dzIGNvb3JkaW5hdGUgdHJhbnNmb3JtYXRpb24KLS8vICAgICAgICAgIHV0aWxpdGllcy4gWW91IG11c3QgbWFrZSBzdXJlIHRoZSBzdGFydF94LCBzdGFydF95LCBzaXplX3gsIHNpemVfeSBhbmQgcm90YXRlIHBhcmFtZXRlcnMgaGF2ZSBleGFjdGx5Ci0vLyAgICAgICAgICBzYW1lIHZhbHVlcyBhcyB5b3UgdXNlZCBpbiBGUERGX1JlbmRlclBhZ2UoKSBmdW5jdGlvbiBjYWxsLgorLy8gICAgICAgICAgVGhlIGRldmljZSBjb29yZGluYXRlIHN5c3RlbSBpcyBkZXZpY2UgZGVwZW5kZW50LiBGb3Igc2NyZWVuIGRldmljZSwKKy8vICAgICAgICAgIGl0cyBvcmlnaW4gaXMgYXQgdGhlIGxlZnQtdG9wIGNvcm5lciBvZiB0aGUgd2luZG93LiBIb3dldmVyIHRoaXMKKy8vICAgICAgICAgIG9yaWdpbiBjYW4gYmUgYWx0ZXJlZCBieSB0aGUgV2luZG93cyBjb29yZGluYXRlIHRyYW5zZm9ybWF0aW9uCisvLyAgICAgICAgICB1dGlsaXRpZXMuCiAvLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0RldmljZVRvUGFnZShGUERGX1BBR0UgcGFnZSwgaW50IHN0YXJ0X3gsIGludCBzdGFydF95LCBpbnQgc2l6ZV94LCBpbnQgc2l6ZV95LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwgaW50IGRldmljZV94LCBpbnQgZGV2aWNlX3ksIGRvdWJsZSogcGFnZV94LCBkb3VibGUqIHBhZ2VfeSk7CisvLyAgICAgICAgICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhlIHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95CisvLyAgICAgICAgICBhbmQgcm90YXRlIHBhcmFtZXRlcnMgaGF2ZSBleGFjdGx5IHNhbWUgdmFsdWVzIGFzIHlvdSB1c2VkIGluCisvLyAgICAgICAgICB0aGUgRlBERl9SZW5kZXJQYWdlKCkgZnVuY3Rpb24gY2FsbC4KK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9EZXZpY2VUb1BhZ2UoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRldmljZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGV2aWNlX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcGFnZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBhZ2VfeSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX1BhZ2VUb0RldmljZQotLy8gICAgICAgICAgQ29udmVydCB0aGUgcGFnZSBjb29yZGluYXRlIG9mIGEgcG9pbnQgdG8gc2NyZWVuIGNvb3JkaW5hdGUuCisvLyAgICAgICAgICBDb252ZXJ0IHRoZSBwYWdlIGNvb3JkaW5hdGVzIG9mIGEgcG9pbnQgdG8gc2NyZWVuIGNvb3JkaW5hdGVzLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCi0vLyAgICAgICAgICBzdGFydF94ICAgICAtICAgTGVmdCBwaXhlbCBwb3NpdGlvbiBvZiB0aGUgZGlzcGxheSBhcmVhIGluIHRoZSBkZXZpY2UgY29vcmRpbmF0ZS4KLS8vICAgICAgICAgIHN0YXJ0X3kgICAgIC0gICBUb3AgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiB0aGUgZGV2aWNlIGNvb3JkaW5hdGUuCisvLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlLgorLy8gICAgICAgICAgc3RhcnRfeCAgICAgLSAgIExlZnQgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSBjb29yZGluYXRlcy4KKy8vICAgICAgICAgIHN0YXJ0X3kgICAgIC0gICBUb3AgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbiBkZXZpY2UKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlcy4KIC8vICAgICAgICAgIHNpemVfeCAgICAgIC0gICBIb3Jpem9udGFsIHNpemUgKGluIHBpeGVscykgZm9yIGRpc3BsYXlpbmcgdGhlIHBhZ2UuCiAvLyAgICAgICAgICBzaXplX3kgICAgICAtICAgVmVydGljYWwgc2l6ZSAoaW4gcGl4ZWxzKSBmb3IgZGlzcGxheWluZyB0aGUgcGFnZS4KLS8vICAgICAgICAgIHJvdGF0ZSAgICAgIC0gICBQYWdlIG9yaWVudGF0aW9uOiAwIChub3JtYWwpLCAxIChyb3RhdGVkIDkwIGRlZ3JlZXMgY2xvY2t3aXNlKSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAocm90YXRlZCAxODAgZGVncmVlcyksIDMgKHJvdGF0ZWQgOTAgZGVncmVlcyBjb3VudGVyLWNsb2Nrd2lzZSkuCi0vLyAgICAgICAgICBwYWdlX3ggICAgICAtICAgWCB2YWx1ZSBpbiBwYWdlIGNvb3JkaW5hdGUsIGZvciB0aGUgcG9pbnQgdG8gYmUgY29udmVydGVkLgotLy8gICAgICAgICAgcGFnZV95ICAgICAgLSAgIFkgdmFsdWUgaW4gcGFnZSBjb29yZGluYXRlLCBmb3IgdGhlIHBvaW50IHRvIGJlIGNvbnZlcnRlZC4KLS8vICAgICAgICAgIGRldmljZV94ICAgIC0gICBBIHBvaW50ZXIgdG8gYW4gaW50ZWdlciByZWNlaXZpbmcgdGhlIHJlc3VsdCBYIHZhbHVlIGluIGRldmljZSBjb29yZGluYXRlLgotLy8gICAgICAgICAgZGV2aWNlX3kgICAgLSAgIEEgcG9pbnRlciB0byBhbiBpbnRlZ2VyIHJlY2VpdmluZyB0aGUgcmVzdWx0IFkgdmFsdWUgaW4gZGV2aWNlIGNvb3JkaW5hdGUuCisvLyAgICAgICAgICByb3RhdGUgICAgICAtICAgUGFnZSBvcmllbnRhdGlvbjoKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKG5vcm1hbCkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKHJvdGF0ZWQgOTAgZGVncmVlcyBjbG9ja3dpc2UpCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIChyb3RhdGVkIDE4MCBkZWdyZWVzKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAocm90YXRlZCA5MCBkZWdyZWVzIGNvdW50ZXItY2xvY2t3aXNlKQorLy8gICAgICAgICAgcGFnZV94ICAgICAgLSAgIFggdmFsdWUgaW4gcGFnZSBjb29yZGluYXRlcy4KKy8vICAgICAgICAgIHBhZ2VfeSAgICAgIC0gICBZIHZhbHVlIGluIHBhZ2UgY29vcmRpbmF0ZS4KKy8vICAgICAgICAgIGRldmljZV94ICAgIC0gICBBIHBvaW50ZXIgdG8gYW4gaW50ZWdlciByZWNlaXZpbmcgdGhlIHJlc3VsdCBYCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaW4gZGV2aWNlIGNvb3JkaW5hdGVzLgorLy8gICAgICAgICAgZGV2aWNlX3kgICAgLSAgIEEgcG9pbnRlciB0byBhbiBpbnRlZ2VyIHJlY2VpdmluZyB0aGUgcmVzdWx0IFkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpbiBkZXZpY2UgY29vcmRpbmF0ZXMuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBOb25lLgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBTZWUgY29tbWVudHMgb2YgRlBERl9EZXZpY2VUb1BhZ2UoKSBmdW5jdGlvbi4KLS8vCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfUGFnZVRvRGV2aWNlKEZQREZfUEFHRSBwYWdlLCBpbnQgc3RhcnRfeCwgaW50IHN0YXJ0X3ksIGludCBzaXplX3gsIGludCBzaXplX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRlLCBkb3VibGUgcGFnZV94LCBkb3VibGUgcGFnZV95LCBpbnQqIGRldmljZV94LCBpbnQqIGRldmljZV95KTsKKy8vICAgICAgICAgIFNlZSBjb21tZW50cyBmb3IgRlBERl9EZXZpY2VUb1BhZ2UoKS4KK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9QYWdlVG9EZXZpY2UoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBkZXZpY2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBkZXZpY2VfeSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGQml0bWFwX0NyZWF0ZQotLy8gICAgICAgICAgQ3JlYXRlIGEgRm94aXQgRGV2aWNlIEluZGVwZW5kZW50IEJpdG1hcCAoRlhESUIpLgorLy8gICAgICAgICAgQ3JlYXRlIGEgZGV2aWNlIGluZGVwZW5kZW50IGJpdG1hcCAoRlhESUIpLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIHdpZHRoICAgICAgIC0gICBOdW1iZXIgb2YgcGl4ZWxzIGluIGEgaG9yaXpvbnRhbCBsaW5lIG9mIHRoZSBiaXRtYXAuIE11c3QgYmUgZ3JlYXRlciB0aGFuIDAuCi0vLyAgICAgICAgICBoZWlnaHQgICAgICAtICAgTnVtYmVyIG9mIHBpeGVscyBpbiBhIHZlcnRpY2FsIGxpbmUgb2YgdGhlIGJpdG1hcC4gTXVzdCBiZSBncmVhdGVyIHRoYW4gMC4KLS8vICAgICAgICAgIGFscGhhICAgICAgIC0gICBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIGFscGhhIGNoYW5uZWwgaXMgdXNlZC4gTm9uLXplcm8gZm9yIHVzaW5nIGFscGhhLCB6ZXJvIGZvciBub3QgdXNpbmcuCisvLyAgICAgICAgICB3aWR0aCAgICAgICAtICAgVGhlIG51bWJlciBvZiBwaXhlbHMgaW4gd2lkdGggZm9yIHRoZSBiaXRtYXAuCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgTXVzdCBiZSBncmVhdGVyIHRoYW4gMC4KKy8vICAgICAgICAgIGhlaWdodCAgICAgIC0gICBUaGUgbnVtYmVyIG9mIHBpeGVscyBpbiBoZWlnaHQgZm9yIHRoZSBiaXRtYXAuCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgTXVzdCBiZSBncmVhdGVyIHRoYW4gMC4KKy8vICAgICAgICAgIGFscGhhICAgICAgIC0gICBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBhbHBoYSBjaGFubmVsIGlzIHVzZWQuCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uLXplcm8gZm9yIHVzaW5nIGFscGhhLCB6ZXJvIGZvciBub3QgdXNpbmcuCiAvLyBSZXR1cm4gdmFsdWU6Ci0vLyAgICAgICAgICBUaGUgY3JlYXRlZCBiaXRtYXAgaGFuZGxlLCBvciBOVUxMIGlmIHBhcmFtZXRlciBlcnJvciBvciBvdXQgb2YgbWVtb3J5LgorLy8gICAgICAgICAgVGhlIGNyZWF0ZWQgYml0bWFwIGhhbmRsZSwgb3IgTlVMTCBpZiBhIHBhcmFtZXRlciBlcnJvciBvciBvdXQgb2YKKy8vICAgICAgICAgIG1lbW9yeS4KIC8vIENvbW1lbnRzOgotLy8gICAgICAgICAgQW4gRlhESUIgYWx3YXlzIHVzZSA0IGJ5dGUgcGVyIHBpeGVsLiBUaGUgZmlyc3QgYnl0ZSBvZiBhIHBpeGVsIGlzIGFsd2F5cyBkb3VibGUgd29yZCBhbGlnbmVkLgotLy8gICAgICAgICAgRWFjaCBwaXhlbCBjb250YWlucyByZWQgKFIpLCBncmVlbiAoRyksIGJsdWUgKEIpIGFuZCBvcHRpb25hbGx5IGFscGhhIChBKSB2YWx1ZXMuCi0vLyAgICAgICAgICBUaGUgYnl0ZSBvcmRlciBpcyBCR1J4ICh0aGUgbGFzdCBieXRlIHVudXNlZCBpZiBubyBhbHBoYSBjaGFubmVsKSBvciBCR1JBLgorLy8gICAgICAgICAgVGhlIGJpdG1hcCBhbHdheXMgdXNlcyA0IGJ5dGVzIHBlciBwaXhlbC4gVGhlIGZpcnN0IGJ5dGUgaXMgYWx3YXlzCisvLyAgICAgICAgICBkb3VibGUgd29yZCBhbGlnbmVkLgogLy8KLS8vICAgICAgICAgIFRoZSBwaXhlbHMgaW4gYSBob3Jpem9udGFsIGxpbmUgKGFsc28gY2FsbGVkIHNjYW4gbGluZSkgYXJlIHN0b3JlZCBzaWRlIGJ5IHNpZGUsIHdpdGggbGVmdCBtb3N0Ci0vLyAgICAgICAgICBwaXhlbCBzdG9yZWQgZmlyc3QgKHdpdGggbG93ZXIgbWVtb3J5IGFkZHJlc3MpLiBFYWNoIHNjYW4gbGluZSB1c2VzIHdpZHRoKjQgYnl0ZXMuCisvLyAgICAgICAgICBUaGUgYnl0ZSBvcmRlciBpcyBCR1J4ICh0aGUgbGFzdCBieXRlIHVudXNlZCBpZiBubyBhbHBoYSBjaGFubmVsKSBvcgorLy8gICAgICAgICAgQkdSQS4KIC8vCi0vLyAgICAgICAgICBTY2FuIGxpbmVzIGFyZSBzdG9yZWQgb25lIGFmdGVyIGFub3RoZXIsIHdpdGggdG9wIG1vc3Qgc2NhbiBsaW5lIHN0b3JlZCBmaXJzdC4gVGhlcmUgaXMgbm8gZ2FwCi0vLyAgICAgICAgICBiZXR3ZWVuIGFkamFjZW50IHNjYW4gbGluZXMuCisvLyAgICAgICAgICBUaGUgcGl4ZWxzIGluIGEgaG9yaXpvbnRhbCBsaW5lIGFyZSBzdG9yZWQgc2lkZSBieSBzaWRlLCB3aXRoIHRoZQorLy8gICAgICAgICAgbGVmdCBtb3N0IHBpeGVsIHN0b3JlZCBmaXJzdCAod2l0aCBsb3dlciBtZW1vcnkgYWRkcmVzcykuCisvLyAgICAgICAgICBFYWNoIGxpbmUgdXNlcyB3aWR0aCAqIDQgYnl0ZXMuCiAvLwotLy8gICAgICAgICAgVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgZW5vdWdoIG1lbW9yeSBmb3IgaG9sZGluZyBhbGwgcGl4ZWxzIGluIHRoZSBiaXRtYXAsIGJ1dCBpdCBkb2Vzbid0Ci0vLyAgICAgICAgICBpbml0aWFsaXplIHRoZSBidWZmZXIuIEFwcGxpY2F0aW9ucyBjYW4gdXNlIEZQREZCaXRtYXBfRmlsbFJlY3QgdG8gZmlsbCB0aGUgYml0bWFwIHVzaW5nIGFueSBjb2xvci4KLURMTEVYUE9SVCBGUERGX0JJVE1BUCBTVERDQUxMIEZQREZCaXRtYXBfQ3JlYXRlKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGFscGhhKTsKKy8vICAgICAgICAgIExpbmVzIGFyZSBzdG9yZWQgb25lIGFmdGVyIGFub3RoZXIsIHdpdGggdGhlIHRvcCBtb3N0IGxpbmUgc3RvcmVkCisvLyAgICAgICAgICBmaXJzdC4gVGhlcmUgaXMgbm8gZ2FwIGJldHdlZW4gYWRqYWNlbnQgbGluZXMuCisvLworLy8gICAgICAgICAgVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgZW5vdWdoIG1lbW9yeSBmb3IgaG9sZGluZyBhbGwgcGl4ZWxzIGluIHRoZQorLy8gICAgICAgICAgYml0bWFwLCBidXQgaXQgZG9lc24ndCBpbml0aWFsaXplIHRoZSBidWZmZXIuIEFwcGxpY2F0aW9ucyBjYW4gdXNlCisvLyAgICAgICAgICBGUERGQml0bWFwX0ZpbGxSZWN0IHRvIGZpbGwgdGhlIGJpdG1hcCB1c2luZyBhbnkgY29sb3IuCitETExFWFBPUlQgRlBERl9CSVRNQVAgU1REQ0FMTCBGUERGQml0bWFwX0NyZWF0ZShpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhKTsKIAogLy8gTW9yZSBESUIgZm9ybWF0cwotI2RlZmluZSBGUERGQml0bWFwX0dyYXkgICAgIDEgICAgICAgLy8gR3JheSBzY2FsZSBiaXRtYXAsIG9uZSBieXRlIHBlciBwaXhlbC4KLSNkZWZpbmUgRlBERkJpdG1hcF9CR1IgICAgICAyICAgICAgIC8vIDMgYnl0ZXMgcGVyIHBpeGVsLCBieXRlIG9yZGVyOiBibHVlLCBncmVlbiwgcmVkLgotI2RlZmluZSBGUERGQml0bWFwX0JHUnggICAgIDMgICAgICAgLy8gNCBieXRlcyBwZXIgcGl4ZWwsIGJ5dGUgb3JkZXI6IGJsdWUsIGdyZWVuLCByZWQsIHVudXNlZC4KLSNkZWZpbmUgRlBERkJpdG1hcF9CR1JBICAgICA0ICAgICAgIC8vIDQgYnl0ZXMgcGVyIHBpeGVsLCBieXRlIG9yZGVyOiBibHVlLCBncmVlbiwgcmVkLCBhbHBoYS4KKy8vIEdyYXkgc2NhbGUgYml0bWFwLCBvbmUgYnl0ZSBwZXIgcGl4ZWwuCisjZGVmaW5lIEZQREZCaXRtYXBfR3JheSAxCisvLyAzIGJ5dGVzIHBlciBwaXhlbCwgYnl0ZSBvcmRlcjogYmx1ZSwgZ3JlZW4sIHJlZC4KKyNkZWZpbmUgRlBERkJpdG1hcF9CR1IgMgorLy8gNCBieXRlcyBwZXIgcGl4ZWwsIGJ5dGUgb3JkZXI6IGJsdWUsIGdyZWVuLCByZWQsIHVudXNlZC4KKyNkZWZpbmUgRlBERkJpdG1hcF9CR1J4IDMKKy8vIDQgYnl0ZXMgcGVyIHBpeGVsLCBieXRlIG9yZGVyOiBibHVlLCBncmVlbiwgcmVkLCBhbHBoYS4KKyNkZWZpbmUgRlBERkJpdG1hcF9CR1JBIDQKIAogLy8gRnVuY3Rpb246IEZQREZCaXRtYXBfQ3JlYXRlRXgKLS8vICAgICAgICAgIENyZWF0ZSBhIEZveGl0IERldmljZSBJbmRlcGVuZGVudCBCaXRtYXAgKEZYRElCKQorLy8gICAgICAgICAgQ3JlYXRlIGEgZGV2aWNlIGluZGVwZW5kZW50IGJpdG1hcCAoRlhESUIpCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgd2lkdGggICAgICAgLSAgIE51bWJlciBvZiBwaXhlbHMgaW4gYSBob3Jpem9udGFsIGxpbmUgb2YgdGhlIGJpdG1hcC4gTXVzdCBiZSBncmVhdGVyIHRoYW4gMC4KLS8vICAgICAgICAgIGhlaWdodCAgICAgIC0gICBOdW1iZXIgb2YgcGl4ZWxzIGluIGEgdmVydGljYWwgbGluZSBvZiB0aGUgYml0bWFwLiBNdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLgotLy8gICAgICAgICAgZm9ybWF0ICAgICAgLSAgIEEgbnVtYmVyIGluZGljYXRpbmcgZm9yIGJpdG1hcCBmb3JtYXQsIGFzIGRlZmluZWQgYWJvdmUuCi0vLyAgICAgICAgICBmaXJzdF9zY2FuICAtICAgQSBwb2ludGVyIHRvIHRoZSBmaXJzdCBieXRlIG9mIGZpcnN0IHNjYW4gbGluZSwgZm9yIGV4dGVybmFsIGJ1ZmZlcgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkuIElmIHRoaXMgcGFyYW1ldGVyIGlzIE5VTEwsIHRoZW4gdGhlIFNESyB3aWxsIGNyZWF0ZSBpdHMgb3duIGJ1ZmZlci4KLS8vICAgICAgICAgIHN0cmlkZSAgICAgIC0gICBOdW1iZXIgb2YgYnl0ZXMgZm9yIGVhY2ggc2NhbiBsaW5lLCBmb3IgZXh0ZXJuYWwgYnVmZmVyIG9ubHkuLgorLy8gICAgICAgICAgd2lkdGggICAgICAgLSAgIFRoZSBudW1iZXIgb2YgcGl4ZWxzIGluIHdpZHRoIGZvciB0aGUgYml0bWFwLgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIE11c3QgYmUgZ3JlYXRlciB0aGFuIDAuCisvLyAgICAgICAgICBoZWlnaHQgICAgICAtICAgVGhlIG51bWJlciBvZiBwaXhlbHMgaW4gaGVpZ2h0IGZvciB0aGUgYml0bWFwLgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIE11c3QgYmUgZ3JlYXRlciB0aGFuIDAuCisvLyAgICAgICAgICBmb3JtYXQgICAgICAtICAgQSBudW1iZXIgaW5kaWNhdGluZyBmb3IgYml0bWFwIGZvcm1hdCwgYXMgZGVmaW5lZAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlLgorLy8gICAgICAgICAgZmlyc3Rfc2NhbiAgLSAgIEEgcG9pbnRlciB0byB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgZmlyc3QgbGluZSBpZgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIGFuIGV4dGVybmFsIGJ1ZmZlci4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgTlVMTCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIHRoZSBhIG5ldyBidWZmZXIgd2lsbCBiZSBjcmVhdGVkLgorLy8gICAgICAgICAgc3RyaWRlICAgICAgLSAgIE51bWJlciBvZiBieXRlcyBmb3IgZWFjaCBzY2FuIGxpbmUsIGZvciBleHRlcm5hbAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBvbmx5LgogLy8gUmV0dXJuIHZhbHVlOgotLy8gICAgICAgICAgVGhlIGNyZWF0ZWQgYml0bWFwIGhhbmRsZSwgb3IgTlVMTCBpZiBwYXJhbWV0ZXIgZXJyb3Igb3Igb3V0IG9mIG1lbW9yeS4KKy8vICAgICAgICAgIFRoZSBiaXRtYXAgaGFuZGxlLCBvciBOVUxMIGlmIHBhcmFtZXRlciBlcnJvciBvciBvdXQgb2YgbWVtb3J5LgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBTaW1pbGFyIHRvIEZQREZCaXRtYXBfQ3JlYXRlIGZ1bmN0aW9uLCB3aXRoIG1vcmUgZm9ybWF0cyBhbmQgZXh0ZXJuYWwgYnVmZmVyIHN1cHBvcnRlZC4KLS8vICAgICAgICAgIEJpdG1hcCBjcmVhdGVkIGJ5IHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgaW4gYW55IHBsYWNlIHRoYXQgYSBGUERGX0JJVE1BUCBoYW5kbGUgaXMKKy8vICAgICAgICAgIFNpbWlsYXIgdG8gRlBERkJpdG1hcF9DcmVhdGUgZnVuY3Rpb24sIGJ1dCBhbGxvd3MgZm9yIG1vcmUgZm9ybWF0cworLy8gICAgICAgICAgYW5kIGFuIGV4dGVybmFsIGJ1ZmZlciBpcyBzdXBwb3J0ZWQuIFRoZSBiaXRtYXAgY3JlYXRlZCBieSB0aGlzCisvLyAgICAgICAgICBmdW5jdGlvbiBjYW4gYmUgdXNlZCBpbiBhbnkgcGxhY2UgdGhhdCBhIEZQREZfQklUTUFQIGhhbmRsZSBpcwogLy8gICAgICAgICAgcmVxdWlyZWQuCiAvLwotLy8gICAgICAgICAgSWYgZXh0ZXJuYWwgc2NhbmxpbmUgYnVmZmVyIGlzIHVzZWQsIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBkZXN0cm95IHRoZSBidWZmZXIKLS8vICAgICAgICAgIGJ5IGl0c2VsZi4gRlBERkJpdG1hcF9EZXN0cm95IGZ1bmN0aW9uIHdpbGwgbm90IGRlc3Ryb3kgdGhlIGJ1ZmZlci4KLS8vCi1ETExFWFBPUlQgRlBERl9CSVRNQVAgU1REQ0FMTCBGUERGQml0bWFwX0NyZWF0ZUV4KGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCwgdm9pZCogZmlyc3Rfc2NhbiwgaW50IHN0cmlkZSk7CisvLyAgICAgICAgICBJZiBhbiBleHRlcm5hbCBidWZmZXIgaXMgdXNlZCwgdGhlbiB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGRlc3Ryb3kKKy8vICAgICAgICAgIHRoZSBidWZmZXIgYnkgaXRzZWxmLiBGUERGQml0bWFwX0Rlc3Ryb3kgZnVuY3Rpb24gd2lsbCBub3QgZGVzdHJveQorLy8gICAgICAgICAgdGhlIGJ1ZmZlci4KK0RMTEVYUE9SVCBGUERGX0JJVE1BUCBTVERDQUxMIEZQREZCaXRtYXBfQ3JlYXRlRXgoaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBmaXJzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKTsKIAogLy8gRnVuY3Rpb246IEZQREZCaXRtYXBfRmlsbFJlY3QKLS8vICAgICAgICAgIEZpbGwgYSByZWN0YW5nbGUgYXJlYSBpbiBhbiBGWERJQi4KKy8vICAgICAgICAgIEZpbGwgYSByZWN0YW5nbGUgaW4gYSBiaXRtYXAuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgYml0bWFwICAgICAgLSAgIFRoZSBoYW5kbGUgdG8gdGhlIGJpdG1hcC4gUmV0dXJuZWQgYnkgRlBERkJpdG1hcF9DcmVhdGUgZnVuY3Rpb24uCi0vLyAgICAgICAgICBsZWZ0ICAgICAgICAtICAgVGhlIGxlZnQgc2lkZSBwb3NpdGlvbi4gU3RhcnRpbmcgZnJvbSAwIGF0IHRoZSBsZWZ0LW1vc3QgcGl4ZWwuCi0vLyAgICAgICAgICB0b3AgICAgICAgICAtICAgVGhlIHRvcCBzaWRlIHBvc2l0aW9uLiBTdGFydGluZyBmcm9tIDAgYXQgdGhlIHRvcC1tb3N0IHNjYW4gbGluZS4KLS8vICAgICAgICAgIHdpZHRoICAgICAgIC0gICBOdW1iZXIgb2YgcGl4ZWxzIHRvIGJlIGZpbGxlZCBpbiBlYWNoIHNjYW4gbGluZS4KLS8vICAgICAgICAgIGhlaWdodCAgICAgIC0gICBOdW1iZXIgb2Ygc2NhbiBsaW5lcyB0byBiZSBmaWxsZWQuCi0vLyAgICAgICAgICBjb2xvciAgICAgICAtICAgQSAzMi1iaXQgdmFsdWUgc3BlY2lmaW5nIHRoZSBjb2xvciwgaW4gODg4OCBBUkdCIGZvcm1hdC4KKy8vICAgICAgICAgIGJpdG1hcCAgICAgIC0gICBUaGUgaGFuZGxlIHRvIHRoZSBiaXRtYXAuIFJldHVybmVkIGJ5CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERkJpdG1hcF9DcmVhdGUuCisvLyAgICAgICAgICBsZWZ0ICAgICAgICAtICAgVGhlIGxlZnQgcG9zaXRpb24uIFN0YXJ0aW5nIGZyb20gMCBhdCB0aGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0LW1vc3QgcGl4ZWwuCisvLyAgICAgICAgICB0b3AgICAgICAgICAtICAgVGhlIHRvcCBwb3NpdGlvbi4gU3RhcnRpbmcgZnJvbSAwIGF0IHRoZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHRvcC1tb3N0IGxpbmUuCisvLyAgICAgICAgICB3aWR0aCAgICAgICAtICAgV2lkdGggaW4gcGl4ZWxzIHRvIGJlIGZpbGxlZC4KKy8vICAgICAgICAgIGhlaWdodCAgICAgIC0gICBIZWlnaHQgaW4gcGl4ZWxzIHRvIGJlIGZpbGxlZC4KKy8vICAgICAgICAgIGNvbG9yICAgICAgIC0gICBBIDMyLWJpdCB2YWx1ZSBzcGVjaWZpbmcgdGhlIGNvbG9yLCBpbiA4ODg4IEFSR0IKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBOb25lLgogLy8gQ29tbWVudHM6Ci0vLyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHNldCB0aGUgY29sb3IgYW5kIChvcHRpb25hbGx5KSBhbHBoYSB2YWx1ZSBpbiBzcGVjaWZpZWQgcmVnaW9uIG9mIHRoZSBiaXRtYXAuCi0vLyAgICAgICAgICBOT1RFOiBJZiBhbHBoYSBjaGFubmVsIGlzIHVzZWQsIHRoaXMgZnVuY3Rpb24gZG9lcyBOT1QgY29tcG9zaXRlIHRoZSBiYWNrZ3JvdW5kIHdpdGggdGhlIHNvdXJjZSBjb2xvciwKLS8vICAgICAgICAgIGluc3RlYWQgdGhlIGJhY2tncm91bmQgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgc291cmNlIGNvbG9yIGFuZCBhbHBoYS4KLS8vICAgICAgICAgIElmIGFscGhhIGNoYW5uZWwgaXMgbm90IHVzZWQsIHRoZSAiYWxwaGEiIHBhcmFtZXRlciBpcyBpZ25vcmVkLgorLy8gICAgICAgICAgVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBjb2xvciBhbmQgKG9wdGlvbmFsbHkpIGFscGhhIHZhbHVlIGluIHRoZQorLy8gICAgICAgICAgc3BlY2lmaWVkIHJlZ2lvbiBvZiB0aGUgYml0bWFwLgogLy8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERkJpdG1hcF9GaWxsUmVjdChGUERGX0JJVE1BUCBiaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEZQREZfRFdPUkQgY29sb3IpOworLy8gICAgICAgICAgTk9URTogSWYgdGhlIGFscGhhIGNoYW5uZWwgaXMgdXNlZCwgdGhpcyBmdW5jdGlvbiBkb2VzIE5PVAorLy8gICAgICAgICAgY29tcG9zaXRlIHRoZSBiYWNrZ3JvdW5kIHdpdGggdGhlIHNvdXJjZSBjb2xvciwgaW5zdGVhZCB0aGUKKy8vICAgICAgICAgIGJhY2tncm91bmQgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgc291cmNlIGNvbG9yIGFuZCB0aGUgYWxwaGEuCisvLworLy8gICAgICAgICAgSWYgdGhlIGFscGhhIGNoYW5uZWwgaXMgbm90IHVzZWQsIHRoZSBhbHBoYSBwYXJhbWV0ZXIgaXMgaWdub3JlZC4KK0RMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERkJpdG1hcF9GaWxsUmVjdChGUERGX0JJVE1BUCBiaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RXT1JEIGNvbG9yKTsKIAogLy8gRnVuY3Rpb246IEZQREZCaXRtYXBfR2V0QnVmZmVyCi0vLyAgICAgICAgICBHZXQgZGF0YSBidWZmZXIgb2YgYW4gRlhESUIKKy8vICAgICAgICAgIEdldCBkYXRhIGJ1ZmZlciBvZiBhIGJpdG1hcC4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBiaXRtYXAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBiaXRtYXAuIFJldHVybmVkIGJ5IEZQREZCaXRtYXBfQ3JlYXRlIGZ1bmN0aW9uLgorLy8gICAgICAgICAgYml0bWFwICAgICAgLSAgIEhhbmRsZSB0byB0aGUgYml0bWFwLiBSZXR1cm5lZCBieSBGUERGQml0bWFwX0NyZWF0ZS4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRoZSBwb2ludGVyIHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBiaXRtYXAgYnVmZmVyLgogLy8gQ29tbWVudHM6CiAvLyAgICAgICAgICBUaGUgc3RyaWRlIG1heSBiZSBtb3JlIHRoYW4gd2lkdGggKiBudW1iZXIgb2YgYnl0ZXMgcGVyIHBpeGVsCi0vLyAgICAgICAgICBBcHBsaWNhdGlvbnMgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGdldCB0aGUgYml0bWFwIGJ1ZmZlciBwb2ludGVyLCB0aGVuIG1hbmlwdWxhdGUgYW55IGNvbG9yCi0vLyAgICAgICAgICBhbmQvb3IgYWxwaGEgdmFsdWVzIGZvciBhbnkgcGl4ZWxzIGluIHRoZSBiaXRtYXAuCisvLworLy8gICAgICAgICAgQXBwbGljYXRpb25zIGNhbiB1c2UgdGhpcyBmdW5jdGlvbiB0byBnZXQgdGhlIGJpdG1hcCBidWZmZXIgcG9pbnRlciwKKy8vICAgICAgICAgIHRoZW4gbWFuaXB1bGF0ZSBhbnkgY29sb3IgYW5kL29yIGFscGhhIHZhbHVlcyBmb3IgYW55IHBpeGVscyBpbiB0aGUKKy8vICAgICAgICAgIGJpdG1hcC4KKy8vCisvLyAgICAgICAgICBUaGUgZGF0YSBpcyBpbiBCR1JBIGZvcm1hdC4gV2hlcmUgdGhlIEEgbWF5YmUgdW51c2VkIGlmIGFscGhhIHdhcworLy8gICAgICAgICAgbm90IHNwZWNpZmllZC4KIERMTEVYUE9SVCB2b2lkKiBTVERDQUxMIEZQREZCaXRtYXBfR2V0QnVmZmVyKEZQREZfQklUTUFQIGJpdG1hcCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGQml0bWFwX0dldFdpZHRoCi0vLyAgICAgICAgICBHZXQgd2lkdGggb2YgYW4gRlhESUIuCisvLyAgICAgICAgICBHZXQgd2lkdGggb2YgYSBiaXRtYXAuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgYml0bWFwICAgICAgLSAgIEhhbmRsZSB0byB0aGUgYml0bWFwLiBSZXR1cm5lZCBieSBGUERGQml0bWFwX0NyZWF0ZSBmdW5jdGlvbi4KKy8vICAgICAgICAgIGJpdG1hcCAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGJpdG1hcC4gUmV0dXJuZWQgYnkgRlBERkJpdG1hcF9DcmVhdGUuCiAvLyBSZXR1cm4gdmFsdWU6Ci0vLyAgICAgICAgICBUaGUgbnVtYmVyIG9mIHBpeGVscyBpbiBhIGhvcml6b250YWwgbGluZSBvZiB0aGUgYml0bWFwLgorLy8gICAgICAgICAgVGhlIHdpZHRoIG9mIHRoZSBiaXRtYXAgaW4gcGl4ZWxzLgogRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZCaXRtYXBfR2V0V2lkdGgoRlBERl9CSVRNQVAgYml0bWFwKTsKIAogLy8gRnVuY3Rpb246IEZQREZCaXRtYXBfR2V0SGVpZ2h0Ci0vLyAgICAgICAgICBHZXQgaGVpZ2h0IG9mIGFuIEZYRElCLgorLy8gICAgICAgICAgR2V0IGhlaWdodCBvZiBhIGJpdG1hcC4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBiaXRtYXAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBiaXRtYXAuIFJldHVybmVkIGJ5IEZQREZCaXRtYXBfQ3JlYXRlIGZ1bmN0aW9uLgorLy8gICAgICAgICAgYml0bWFwICAgICAgLSAgIEhhbmRsZSB0byB0aGUgYml0bWFwLiBSZXR1cm5lZCBieSBGUERGQml0bWFwX0NyZWF0ZS4KIC8vIFJldHVybiB2YWx1ZToKLS8vICAgICAgICAgIFRoZSBudW1iZXIgb2YgcGl4ZWxzIGluIGEgdmVydGljYWwgbGluZSBvZiB0aGUgYml0bWFwLgorLy8gICAgICAgICAgVGhlIGhlaWdodCBvZiB0aGUgYml0bWFwIGluIHBpeGVscy4KIERMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGQml0bWFwX0dldEhlaWdodChGUERGX0JJVE1BUCBiaXRtYXApOwogCiAvLyBGdW5jdGlvbjogRlBERkJpdG1hcF9HZXRTdHJpZGUKLS8vICAgICAgICAgIEdldCBudW1iZXIgb2YgYnl0ZXMgZm9yIGVhY2ggc2NhbiBsaW5lIGluIHRoZSBiaXRtYXAgYnVmZmVyLgorLy8gICAgICAgICAgR2V0IG51bWJlciBvZiBieXRlcyBmb3IgZWFjaCBsaW5lIGluIHRoZSBiaXRtYXAgYnVmZmVyLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGJpdG1hcCAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGJpdG1hcC4gUmV0dXJuZWQgYnkgRlBERkJpdG1hcF9DcmVhdGUgZnVuY3Rpb24uCisvLyAgICAgICAgICBiaXRtYXAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBiaXRtYXAuIFJldHVybmVkIGJ5IEZQREZCaXRtYXBfQ3JlYXRlLgogLy8gUmV0dXJuIHZhbHVlOgotLy8gICAgICAgICAgVGhlIG51bWJlciBvZiBieXRlcyBmb3IgZWFjaCBzY2FuIGxpbmUgaW4gdGhlIGJpdG1hcCBidWZmZXIuCisvLyAgICAgICAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIGZvciBlYWNoIGxpbmUgaW4gdGhlIGJpdG1hcCBidWZmZXIuCiAvLyBDb21tZW50czoKLS8vICAgICAgICAgIFRoZSBzdHJpZGUgbWF5IGJlIG1vcmUgdGhhbiB3aWR0aCAqIG51bWJlciBvZiBieXRlcyBwZXIgcGl4ZWwKKy8vICAgICAgICAgIFRoZSBzdHJpZGUgbWF5IGJlIG1vcmUgdGhhbiB3aWR0aCAqIG51bWJlciBvZiBieXRlcyBwZXIgcGl4ZWwuCiBETExFWFBPUlQgaW50IFNURENBTEwgRlBERkJpdG1hcF9HZXRTdHJpZGUoRlBERl9CSVRNQVAgYml0bWFwKTsKIAogLy8gRnVuY3Rpb246IEZQREZCaXRtYXBfRGVzdHJveQotLy8gICAgICAgICAgRGVzdHJveSBhbiBGWERJQiBhbmQgcmVsZWFzZSBhbGwgcmVsYXRlZCBidWZmZXJzLgorLy8gICAgICAgICAgRGVzdHJveSBhIGJpdG1hcCBhbmQgcmVsZWFzZSBhbGwgcmVsYXRlZCBidWZmZXJzLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGJpdG1hcCAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGJpdG1hcC4gUmV0dXJuZWQgYnkgRlBERkJpdG1hcF9DcmVhdGUgZnVuY3Rpb24uCisvLyAgICAgICAgICBiaXRtYXAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBiaXRtYXAuIFJldHVybmVkIGJ5IEZQREZCaXRtYXBfQ3JlYXRlLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTm9uZS4KIC8vIENvbW1lbnRzOgotLy8gICAgICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBkZXN0cm95IGFueSBleHRlcm5hbCBidWZmZXIuCi0vLworLy8gICAgICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBkZXN0cm95IGFueSBleHRlcm5hbCBidWZmZXJzIHByb3ZpZGVkIHdoZW4KKy8vICAgICAgICAgIHRoZSBiaXRtYXAgd2FzIGNyZWF0ZWQuCiBETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZCaXRtYXBfRGVzdHJveShGUERGX0JJVE1BUCBiaXRtYXApOwogCiAvLyBGdW5jdGlvbjogRlBERl9WSUVXRVJSRUZfR2V0UHJpbnRTY2FsaW5nCkBAIC01NjQsOCArODQ0LDggQEAKIC8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gdGhlIGxvYWRlZCBkb2N1bWVudC4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE5vbmUuCi0vLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfVklFV0VSUkVGX0dldFByaW50U2NhbGluZyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKK0RMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTAorRlBERl9WSUVXRVJSRUZfR2V0UHJpbnRTY2FsaW5nKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpOwogCiAvLyBGdW5jdGlvbjogRlBERl9WSUVXRVJSRUZfR2V0TnVtQ29waWVzCiAvLyAgICAgICAgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY29waWVzIHRvIGJlIHByaW50ZWQuCkBAIC01NzMsNyArODUzLDYgQEAKIC8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gdGhlIGxvYWRlZCBkb2N1bWVudC4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRoZSBudW1iZXIgb2YgY29waWVzIHRvIGJlIHByaW50ZWQuCi0vLwogRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfVklFV0VSUkVGX0dldE51bUNvcGllcyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKIAogLy8gRnVuY3Rpb246IEZQREZfVklFV0VSUkVGX0dldFByaW50UGFnZVJhbmdlCkBAIC01ODIsMTcgKzg2MSwxOCBAQAogLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byB0aGUgbG9hZGVkIGRvY3VtZW50LgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVGhlIHByaW50IHBhZ2UgcmFuZ2UgdG8gYmUgdXNlZCBmb3IgcHJpbnRpbmcuCi0vLwotRExMRVhQT1JUIEZQREZfUEFHRVJBTkdFIFNURENBTEwgRlBERl9WSUVXRVJSRUZfR2V0UHJpbnRQYWdlUmFuZ2UoRlBERl9ET0NVTUVOVCBkb2N1bWVudCk7CitETExFWFBPUlQgRlBERl9QQUdFUkFOR0UgU1REQ0FMTAorRlBERl9WSUVXRVJSRUZfR2V0UHJpbnRQYWdlUmFuZ2UoRlBERl9ET0NVTUVOVCBkb2N1bWVudCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX1ZJRVdFUlJFRl9HZXREdXBsZXgKLS8vICAgICAgICAgIFJldHVybnMgdGhlIHBhcGVyIGhhbmRsaW5nIG9wdGlvbiB0byBiZSB1c2VkIHdoZW4gcHJpbnRpbmcgZnJvbSBwcmludCBkaWFsb2cuCisvLyAgICAgICAgICBSZXR1cm5zIHRoZSBwYXBlciBoYW5kbGluZyBvcHRpb24gdG8gYmUgdXNlZCB3aGVuIHByaW50aW5nIGZyb20KKy8vICAgICAgICAgIHRoZSBwcmludCBkaWFsb2cuCiAvLyBQYXJhbWV0ZXJzOgogLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byB0aGUgbG9hZGVkIGRvY3VtZW50LgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVGhlIHBhcGVyIGhhbmRsaW5nIG9wdGlvbiB0byBiZSB1c2VkIHdoZW4gcHJpbnRpbmcuCi0vLwotRExMRVhQT1JUIEZQREZfRFVQTEVYVFlQRSBTVERDQUxMIEZQREZfVklFV0VSUkVGX0dldER1cGxleChGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKK0RMTEVYUE9SVCBGUERGX0RVUExFWFRZUEUgU1REQ0FMTAorRlBERl9WSUVXRVJSRUZfR2V0RHVwbGV4KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpOwogCiAvLyBGdW5jdGlvbjogRlBERl9Db3VudE5hbWVkRGVzdHMKIC8vICAgICAgICAgIEdldCB0aGUgY291bnQgb2YgbmFtZWQgZGVzdGluYXRpb25zIGluIHRoZSBQREYgZG9jdW1lbnQuCkBAIC02MDMsMzEgKzg4Myw1NiBAQAogRExMRVhQT1JUIEZQREZfRFdPUkQgU1REQ0FMTCBGUERGX0NvdW50TmFtZWREZXN0cyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKIAogLy8gRnVuY3Rpb246IEZQREZfR2V0TmFtZWREZXN0QnlOYW1lCi0vLyAgICAgICAgICBnZXQgYSBzcGVjaWFsIGRlc3QgaGFuZGxlIGJ5IHRoZSBpbmRleC4KKy8vICAgICAgICAgIEdldCBhIHRoZSBkZXN0aW5hdGlvbiBoYW5kbGUgZm9yIHRoZSBnaXZlbiBuYW1lLgogLy8gUGFyYW1ldGVyczoKIC8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gdGhlIGxvYWRlZCBkb2N1bWVudC4KLS8vICAgICAgICAgIG5hbWUgICAgICAgIC0gICBUaGUgbmFtZSBvZiBhIHNwZWNpYWwgbmFtZWQgZGVzdC4KKy8vICAgICAgICAgIG5hbWUgICAgICAgIC0gICBUaGUgbmFtZSBvZiBhIGRlc3RpbmF0aW9uLgogLy8gUmV0dXJuIHZhbHVlOgotLy8gICAgICAgICAgVGhlIGhhbmRsZSBvZiB0aGUgZGVzdC4KLS8vCi1ETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERl9HZXROYW1lZERlc3RCeU5hbWUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9CWVRFU1RSSU5HIG5hbWUpOworLy8gICAgICAgICAgVGhlIGhhbmRsZSB0byB0aGUgZGVzdGluYXRpb24uCitETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERl9HZXROYW1lZERlc3RCeU5hbWUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgbmFtZSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX0dldE5hbWVkRGVzdAotLy8gICAgICAgICAgR2V0IHRoZSBzcGVjaWZpZWQgbmFtZWQgZGVzdGluYXRpb25zIG9mIHRoZSBQREYgZG9jdW1lbnQgYnkgaW5kZXguCisvLyAgICAgICAgICBHZXQgdGhlIG5hbWVkIGRlc3RpbmF0aW9uIGJ5IGluZGV4LgogLy8gUGFyYW1ldGVyczoKIC8vICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGEgZG9jdW1lbnQKLS8vICAgICAgICAgIGluZGV4ICAgICAgICAgICAtICAgVGhlIGluZGV4IG9mIG5hbWVkIGRlc3RpbmF0aW9uLgotLy8gICAgICAgICAgYnVmZmVyICAgICAgICAgIC0gICBUaGUgYnVmZmVyIHRvIG9idGFpbiBkZXN0aW5hdGlvbiBuYW1lLCB1c2VkIGFzIHdjaGFyX3QqLgotLy8gICAgICAgICAgYnVmbGVuIFtpbi9vdXRdIC0gICBTaXplIG9mIHRoZSBidWZmZXIgaW4gYnl0ZXMgb24gaW5wdXQsIGxlbmd0aCBvZiB0aGUgcmVzdWx0IGluIGJ5dGVzIG9uIG91dHB1dCBvciAtMSBpZiB0aGUgYnVmZmVyIGlzIHRvbyBzbWFsbC4KKy8vICAgICAgICAgIGluZGV4ICAgICAgICAgICAtICAgVGhlIGluZGV4IG9mIGEgbmFtZWQgZGVzdGluYXRpb24uCisvLyAgICAgICAgICBidWZmZXIgICAgICAgICAgLSAgIFRoZSBidWZmZXIgdG8gc3RvcmUgdGhlIGRlc3RpbmF0aW9uIG5hbWUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgYXMgd2NoYXJfdCouCisvLyAgICAgICAgICBidWZsZW4gW2luL291dF0gLSAgIFNpemUgb2YgdGhlIGJ1ZmZlciBpbiBieXRlcyBvbiBpbnB1dCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoIG9mIHRoZSByZXN1bHQgaW4gYnl0ZXMgb24gb3V0cHV0CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIC0xIGlmIHRoZSBidWZmZXIgaXMgdG9vIHNtYWxsLgogLy8gUmV0dXJuIHZhbHVlOgotLy8gICAgICAgICAgVGhlIGRlc3RpbmF0aW9uIGhhbmRsZSBvZiBhIG5hbWVkIGRlc3RpbmF0aW9uLCBvciBOVUxMIGlmIG5vIG5hbWVkIGRlc3RpbmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gfGluZGV4fC4KKy8vICAgICAgICAgIFRoZSBkZXN0aW5hdGlvbiBoYW5kbGUgZm9yIGEgZ2l2ZW4gaW5kZXgsIG9yIE5VTEwgaWYgdGhlcmUgaXMgbm8KKy8vICAgICAgICAgIG5hbWVkIGRlc3RpbmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gfGluZGV4fC4KIC8vIENvbW1lbnRzOgogLy8gICAgICAgICAgQ2FsbCB0aGlzIGZ1bmN0aW9uIHR3aWNlIHRvIGdldCB0aGUgbmFtZSBvZiB0aGUgbmFtZWQgZGVzdGluYXRpb246Ci0vLyAgICAgICAgICAxKSBGaXJzdCB0aW1lIHBhc3MgaW4gfGJ1ZmZlcnwgYXMgTlVMTCBhbmQgZ2V0IGJ1Zmxlbi4KLS8vICAgICAgICAgIDIpIFNlY29uZCB0aW1lIHBhc3MgaW4gYWxsb2NhdGVkIHxidWZmZXJ8IGFuZCBidWZsZW4gdG8gcmV0cmlldmUgfGJ1ZmZlcnwsIHdoaWNoIHNob3VsZCBiZSB1c2VkIGFzIHdjaGFyX3QqLgotLy8gICAgICAgICAgICAgSWYgYnVmbGVuIGlzIG5vdCBzdWZmaWNpZW50bHkgbGFyZ2UsIGl0IHdpbGwgYmUgc2V0IHRvIC0xIHVwb24gcmV0dXJuLgorLy8gICAgICAgICAgICAxKSBGaXJzdCB0aW1lIHBhc3MgaW4gfGJ1ZmZlcnwgYXMgTlVMTCBhbmQgZ2V0IGJ1Zmxlbi4KKy8vICAgICAgICAgICAgMikgU2Vjb25kIHRpbWUgcGFzcyBpbiBhbGxvY2F0ZWQgfGJ1ZmZlcnwgYW5kIGJ1ZmxlbiB0byByZXRyaWV2ZQorLy8gICAgICAgICAgICAgICB8YnVmZmVyfCwgd2hpY2ggc2hvdWxkIGJlIHVzZWQgYXMgd2NoYXJfdCouCiAvLwotRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZfR2V0TmFtZWREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIGludCBpbmRleCwgdm9pZCogYnVmZmVyLCBsb25nKiBidWZsZW4pOworLy8gICAgICAgICBJZiBidWZsZW4gaXMgbm90IHN1ZmZpY2llbnRseSBsYXJnZSwgaXQgd2lsbCBiZSBzZXQgdG8gLTEgdXBvbgorLy8gICAgICAgICByZXR1cm4uCitETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERl9HZXROYW1lZERlc3QoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcqIGJ1Zmxlbik7CisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorLy8gRnVuY3Rpb246IEZQREZfQlN0cl9Jbml0CisvLyAgICAgICAgICBIZWxwZXIgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBhIGJ5dGUgc3RyaW5nLgorRExMRVhQT1JUIEZQREZfUkVTVUxUIFNURENBTEwgRlBERl9CU3RyX0luaXQoRlBERl9CU1RSKiBzdHIpOworCisvLyBGdW5jdGlvbjogRlBERl9CU3RyX1NldAorLy8gICAgICAgICAgSGVscGVyIGZ1bmN0aW9uIHRvIHNldCBzdHJpbmcgZGF0YS4KK0RMTEVYUE9SVCBGUERGX1JFU1VMVCBTVERDQUxMIEZQREZfQlN0cl9TZXQoRlBERl9CU1RSKiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfTFBDU1RSIGJzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpOworCisvLyBGdW5jdGlvbjogRlBERl9CU3RyX0NsZWFyCisvLyAgICAgICAgICBIZWxwZXIgZnVuY3Rpb24gdG8gY2xlYXIgYSBieXRlIHN0cmluZy4KK0RMTEVYUE9SVCBGUERGX1JFU1VMVCBTVERDQUxMIEZQREZfQlN0cl9DbGVhcihGUERGX0JTVFIqIHN0cik7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9CVUlMRC5nbiBiL3NhbXBsZXMvQlVJTEQuZ24KaW5kZXggNzQ4YTJhZi4uZTM2NTIwOCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9CVUlMRC5nbgorKysgYi9zYW1wbGVzL0JVSUxELmduCkBAIC0yLDcgKzIsMTIgQEAKICMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCitpbXBvcnQoIi8vYnVpbGQvY29uZmlnL3Nhbml0aXplcnMvc2FuaXRpemVycy5nbmkiKQoraW1wb3J0KCIvL2J1aWxkX292ZXJyaWRlcy92OC5nbmkiKQoraW1wb3J0KCIuLi9wZGZpdW0uZ25pIikKKwogZ3JvdXAoInNhbXBsZXMiKSB7CisgIHRlc3Rvbmx5ID0gdHJ1ZQogICBkZXBzID0gWwogICAgICI6cGRmaXVtX3Rlc3QiLAogICAgICI6cGRmaXVtX2RpZmYiLApAQCAtMTUsNjMgKzIwLDYzIEBACiAgICAgIlBOR1BSRUZJWF9IIiwKICAgICAiUE5HX1VTRV9SRUFEX01BQ1JPUyIsCiAgIF0KKyAgaW5jbHVkZV9kaXJzID0gWyAiLi4iIF0KKyAgaWYgKHBkZl9lbmFibGVfdjgpIHsKKyAgICBkZWZpbmVzICs9IFsgIlBERl9FTkFCTEVfVjgiLCBdCisgIH0KKyAgaWYgKHBkZl9lbmFibGVfeGZhKSB7CisgICAgZGVmaW5lcyArPSBbICJQREZfRU5BQkxFX1hGQSIsIF0KKyAgfQogfQogCiBleGVjdXRhYmxlKCJwZGZpdW1fdGVzdCIpIHsKKyAgdGVzdG9ubHkgPSB0cnVlCiAgIHNvdXJjZXMgPSBbCi0gICAgImltYWdlX2RpZmZfcG5nLmNjIiwKICAgICAicGRmaXVtX3Rlc3QuY2MiLAorICAgICJpbWFnZV9kaWZmX3BuZy5jYyIsCisgICAgImltYWdlX2RpZmZfcG5nLmgiLAogICBdCiAgIGRlcHMgPSBbCi0gICAgIi8vdGhpcmRfcGFydHkvcGRmaXVtIiwKLSAgICAiLy92ODp2OF9saWJwbGF0Zm9ybSIsCi0gICAgIjpmeF9scG5nIiwKKyAgICAiLy9idWlsZC9jb25maWcvc2FuaXRpemVyczpkZXBzIiwKKyAgICAiLy90aGlyZF9wYXJ0eS9wZGZpdW06cGRmaXVtIiwKKyAgICAiLy90aGlyZF9wYXJ0eS9wZGZpdW06dGVzdF9zdXBwb3J0IiwKKworICAgICMgUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBsaWJyYXJ5IHNoaXBzIGFnYWluc3Qgc3lzdGVtIGZyZWV0eXBlLAorICAgICMgYWx3YXlzIGxpbmsgdGhpcyBiaW5hcnkgYWdhaW5zdCB0aGUgYnVuZGxlZCBvbmUgZm9yIGNvbnNpc3RlbmN5CisgICAgIyBvZiByZXN1bHRzIGFjcm9zcyBwbGF0Zm9ybXMuCisgICAgIi8vdGhpcmRfcGFydHkvcGRmaXVtL3RoaXJkX3BhcnR5OmZ4X2ZyZWV0eXBlIiwKICAgXQotICBpbmNsdWRlX2RpcnMgPSBbCi0gICAgIi8vdjgiLAotICAgICIvL3Y4L2luY2x1ZGUiLAotICBdCisgIGlmICghcGRmX2VuYWJsZV94ZmEpIHsKKyAgICBkZXBzICs9IFsgIi4uL3RoaXJkX3BhcnR5OmZ4X2xwbmciIF0KKyAgfQorICBpZiAocGRmX2VuYWJsZV92OCkgeworICAgIGRlcHMgKz0gWyAiLy92ODp2OF9saWJwbGF0Zm9ybSIgXQorICAgIGluY2x1ZGVfZGlycyA9IFsKKyAgICAgICIvL3Y4IiwKKyAgICAgICIvL3Y4L2luY2x1ZGUiLAorICAgIF0KKyAgICBjb25maWdzICs9IFsgIi8vdjg6ZXh0ZXJuYWxfc3RhcnR1cF9kYXRhIiBdCisgIH0KICAgY29uZmlncyArPSBbICI6cGRmaXVtX3NhbXBsZXNfY29uZmlnIiBdCiB9CiAKIGV4ZWN1dGFibGUoInBkZml1bV9kaWZmIikgeworICB0ZXN0b25seSA9IHRydWUKICAgc291cmNlcyA9IFsKICAgICAiaW1hZ2VfZGlmZi5jYyIsCiAgICAgImltYWdlX2RpZmZfcG5nLmNjIiwKICAgICAiaW1hZ2VfZGlmZl9wbmcuaCIsCiAgIF0KICAgZGVwcyA9IFsKKyAgICAiLy9idWlsZC9jb25maWcvc2FuaXRpemVyczpkZXBzIiwKICAgICAiLy90aGlyZF9wYXJ0eS9wZGZpdW0iLAotICAgICI6ZnhfbHBuZyIsCiAgIF0KKyAgaWYgKCFwZGZfZW5hYmxlX3hmYSkgeworICAgIGRlcHMgKz0gWyAiLi4vdGhpcmRfcGFydHk6ZnhfbHBuZyIgXQorICB9CiAgIGNvbmZpZ3MgLT0gWyAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6Y2hyb21pdW1fY29kZSIgXQogICBjb25maWdzICs9IFsKICAgICAiOnBkZml1bV9zYW1wbGVzX2NvbmZpZyIsCiAgICAgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOm5vX2Nocm9taXVtX2NvZGUiLAogICBdCiB9Ci0KLXN0YXRpY19saWJyYXJ5KCJmeF9scG5nIikgewotICBzb3VyY2VzID0gWwotICAgICJmeF9scG5nL2luY2x1ZGUvZnhfcG5nLmgiLAotICAgICJmeF9scG5nL3NyYy9meF9wbmcuYyIsCi0gICAgImZ4X2xwbmcvc3JjL2Z4X3BuZ2Vycm9yLmMiLAotICAgICJmeF9scG5nL3NyYy9meF9wbmdnZXQuYyIsCi0gICAgImZ4X2xwbmcvc3JjL2Z4X3BuZ21lbS5jIiwKLSAgICAiZnhfbHBuZy9zcmMvZnhfcG5ncHJlYWQuYyIsCi0gICAgImZ4X2xwbmcvc3JjL2Z4X3BuZ3JlYWQuYyIsCi0gICAgImZ4X2xwbmcvc3JjL2Z4X3BuZ3Jpby5jIiwKLSAgICAiZnhfbHBuZy9zcmMvZnhfcG5ncnRyYW4uYyIsCi0gICAgImZ4X2xwbmcvc3JjL2Z4X3BuZ3J1dGlsLmMiLAotICAgICJmeF9scG5nL3NyYy9meF9wbmdzZXQuYyIsCi0gICAgImZ4X2xwbmcvc3JjL2Z4X3BuZ3RyYW5zLmMiLAotICAgICJmeF9scG5nL3NyYy9meF9wbmd3aW8uYyIsCi0gICAgImZ4X2xwbmcvc3JjL2Z4X3BuZ3dyaXRlLmMiLAotICAgICJmeF9scG5nL3NyYy9meF9wbmd3dHJhbi5jIiwKLSAgICAiZnhfbHBuZy9zcmMvZnhfcG5nd3V0aWwuYyIsCi0gIF0KLSAgaW5jbHVkZV9kaXJzID0gWwotICAgICIuLi9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvaW5jbHVkZS8iLAotICBdCi0gIGNvbmZpZ3MgKz0gWyAiOnBkZml1bV9zYW1wbGVzX2NvbmZpZyIgXQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvREVQUyBiL3NhbXBsZXMvREVQUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmQ3OTRlCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9ERVBTCkBAIC0wLDAgKzEsNiBAQAoraW5jbHVkZV9ydWxlcyA9IFsKKyAgJytmeF9scG5nJywKKyAgJytwdWJsaWMnLAorICAnK3RoaXJkX3BhcnR5L3psaWJfdjEyOCcsCisgICcrdjgnLAorXQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9meF9scG5nL2luY2x1ZGUvZnhfcG5nLmggYi9zYW1wbGVzL2Z4X2xwbmcvaW5jbHVkZS9meF9wbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVmNTNkMC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Z4X2xwbmcvaW5jbHVkZS9meF9wbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQotDQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCi0NCi0jaW5jbHVkZSAiLi4vbHBuZ192MTYzL3BuZy5oIg0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZnhfbHBuZy9scG5nX3YxNjMvcG5ncHJpdi5oIGIvc2FtcGxlcy9meF9scG5nL2xwbmdfdjE2My9wbmdwcml2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4OTY1MzguLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9meF9scG5nL2xwbmdfdjE2My9wbmdwcml2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEyICswLDAgQEAKLQ0KLS8qIHBuZ3ByaXYuaCAtIHByaXZhdGUgZGVjbGFyYXRpb25zIGZvciB1c2UgaW5zaWRlIGxpYnBuZw0KLSAqDQotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oDQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTMgR2xlbm4gUmFuZGVycy1QZWhyc29uDQotICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpDQotICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQ0KLSAqDQotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMyBbSnVseSAxOCwgMjAxM10NCi0gKg0KLSAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuDQotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcg0KLSAqIGFuZCBsaWNlbnNlIGluIHBuZy5oDQotICovDQotDQotLyogVGhlIHN5bWJvbHMgZGVjbGFyZWQgaW4gdGhpcyBmaWxlIChpbmNsdWRpbmcgdGhlIGZ1bmN0aW9ucyBkZWNsYXJlZA0KLSAqIGFzIGV4dGVybikgYXJlIFBSSVZBVEUuICBUaGV5IGFyZSBub3QgcGFydCBvZiB0aGUgbGlicG5nIHB1YmxpYw0KLSAqIGludGVyZmFjZSwgYW5kIGFyZSBub3QgcmVjb21tZW5kZWQgZm9yIHVzZSBieSByZWd1bGFyIGFwcGxpY2F0aW9ucy4NCi0gKiBTb21lIG9mIHRoZW0gbWF5IGJlY29tZSBwdWJsaWMgaW4gdGhlIGZ1dHVyZTsgb3RoZXJzIG1heSBzdGF5IHByaXZhdGUsDQotICogY2hhbmdlIGluIGFuIGluY29tcGF0aWJsZSB3YXksIG9yIGV2ZW4gZGlzYXBwZWFyLg0KLSAqIEFsdGhvdWdoIHRoZSBsaWJwbmcgdXNlcnMgYXJlIG5vdCBmb3JiaWRkZW4gdG8gaW5jbHVkZSB0aGlzIGhlYWRlciwNCi0gKiB0aGV5IHNob3VsZCBiZSB3ZWxsIGF3YXJlIG9mIHRoZSBpc3N1ZXMgdGhhdCBtYXkgYXJpc2UgZnJvbSBkb2luZyBzby4NCi0gKi8NCi0NCi0jaWZuZGVmIFBOR1BSSVZfSA0KLSNkZWZpbmUgUE5HUFJJVl9IDQotDQotLyogRmVhdHVyZSBUZXN0IE1hY3Jvcy4gIFRoZSBmb2xsb3dpbmcgYXJlIGRlZmluZWQgaGVyZSB0byBlbnN1cmUgdGhhdCBjb3JyZWN0bHkNCi0gKiBpbXBsZW1lbnRlZCBsaWJyYXJpZXMgcmV2ZWFsIHRoZSBBUElzIGxpYnBuZyBuZWVkcyB0byBidWlsZCBhbmQgaGlkZSB0aG9zZQ0KLSAqIHRoYXQgYXJlIG5vdCBuZWVkZWQgYW5kIHBvdGVudGlhbGx5IGRhbWFnaW5nIHRvIHRoZSBjb21waWxhdGlvbi4NCi0gKg0KLSAqIEZlYXR1cmUgVGVzdCBNYWNyb3MgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSBhbnkgc3lzdGVtIGhlYWRlciBpcyBpbmNsdWRlZCAoc2VlDQotICogUE9TSVggMTAwMy4xIDIuOC4yICJQT1NJWCBTeW1ib2xzLiINCi0gKg0KLSAqIFRoZXNlIG1hY3JvcyBvbmx5IGhhdmUgYW4gZWZmZWN0IGlmIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHN1cHBvcnRzIGVpdGhlcg0KLSAqIFBPU0lYIDEwMDMuMSBvciBDOTksIG9yIGJvdGguICBPbiBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcyAocGFydGljdWxhcmx5DQotICogV2luZG93cy9WaXN1YWwgU3R1ZGlvKSB0aGVyZSBpcyBubyBlZmZlY3Q7IHRoZSBPUyBzcGVjaWZpYyB0ZXN0cyBiZWxvdyBhcmUNCi0gKiBzdGlsbCByZXF1aXJlZCAoYXMgb2YgMjAxMS0wNS0wMi4pDQotICovDQotI2RlZmluZSBfUE9TSVhfU09VUkNFIDEgLyogSnVzdCB0aGUgUE9TSVggMTAwMy4xIGFuZCBDODkgQVBJcyAqLw0KLQ0KLSNpZm5kZWYgUE5HX1ZFUlNJT05fSU5GT19PTkxZDQotLyogU3RhbmRhcmQgbGlicmFyeSBoZWFkZXJzIG5vdCByZXF1aXJlZCBieSBwbmcuaDogKi8NCi0jICBpbmNsdWRlIDxzdGRsaWIuaD4NCi0jICBpbmNsdWRlIDxzdHJpbmcuaD4NCi0jZW5kaWYNCi0NCi0jZGVmaW5lIFBOR0xJQl9CVUlMRCAvKmxpYnBuZyBpcyBiZWluZyBidWlsdCwgbm90IHVzZWQqLw0KLQ0KLS8qIElmIEhBVkVfQ09ORklHX0ggaXMgZGVmaW5lZCBkdXJpbmcgdGhlIGJ1aWxkIHRoZW4gdGhlIGJ1aWxkIHN5c3RlbSBtdXN0DQotICogcHJvdmlkZSBhbiBhcHByb3ByaWF0ZSAiY29uZmlnLmgiIGZpbGUgb24gdGhlIGluY2x1ZGUgcGF0aC4gIFRoZSBoZWFkZXIgZmlsZQ0KLSAqIG11c3QgcHJvdmlkZSBkZWZpbml0aW9ucyBhcyByZXF1aXJlZCBiZWxvdyAoc2VhcmNoIGZvciAiSEFWRV9DT05GSUdfSCIpOw0KLSAqIHNlZSBjb25maWd1cmUuYWMgZm9yIG1vcmUgZGV0YWlscyBvZiB0aGUgcmVxdWlyZW1lbnRzLiAgVGhlIG1hY3JvDQotICogIlBOR19OT19DT05GSUdfSCIgaXMgcHJvdmlkZWQgZm9yIG1haW50YWluZXJzIHRvIHRlc3QgZm9yIGRlcGVuZGVuY2llcyBvbg0KLSAqICdjb25maWd1cmUnOyBkZWZpbmUgdGhpcyBtYWNybyB0byBwcmV2ZW50IHRoZSBjb25maWd1cmUgYnVpbGQgaW5jbHVkaW5nIHRoZQ0KLSAqIGNvbmZpZ3VyZSBnZW5lcmF0ZWQgY29uZmlnLmguICBMaWJwbmcgaXMgZXhwZWN0ZWQgdG8gY29tcGlsZSB3aXRob3V0ICphbnkqDQotICogc3BlY2lhbCBidWlsZCBzeXN0ZW0gc3VwcG9ydCBvbiBhIHJlYXNvbmFibHkgQU5TSS1DIGNvbXBsaWFudCBzeXN0ZW0uDQotICovDQotI2lmIGRlZmluZWQoSEFWRV9DT05GSUdfSCkgJiYgIWRlZmluZWQoUE5HX05PX0NPTkZJR19IKQ0KLSMgIGluY2x1ZGUgPGNvbmZpZy5oPg0KLQ0KLSAgIC8qIFBpY2sgdXAgdGhlIGRlZmluaXRpb24gb2YgJ3Jlc3RyaWN0JyBmcm9tIGNvbmZpZy5oIGlmIGl0IHdhcyByZWFkOiAqLw0KLSMgIGRlZmluZSBQTkdfUkVTVFJJQ1QgcmVzdHJpY3QNCi0jZW5kaWYNCi0NCi0vKiBUbyBzdXBwb3J0IHN5bWJvbCBwcmVmaXhpbmcgaXQgaXMgbmVjZXNzYXJ5IHRvIGtub3cgKmJlZm9yZSogaW5jbHVkaW5nIHBuZy5oDQotICogd2hldGhlciB0aGUgZml4ZWQgcG9pbnQgKGFuZCBtYXliZSBvdGhlcikgQVBJcyBhcmUgZXhwb3J0ZWQsIGJlY2F1c2UgaWYgdGhleQ0KLSAqIGFyZSBub3QgaW50ZXJuYWwgZGVmaW5pdGlvbnMgbWF5IGJlIHJlcXVpcmVkLiAgVGhpcyBpcyBoYW5kbGVkIGJlbG93IGp1c3QNCi0gKiBiZWZvcmUgcG5nLmggaXMgaW5jbHVkZWQsIGJ1dCBsb2FkIHRoZSBjb25maWd1cmF0aW9uIG5vdyBpZiBpdCBpcyBhdmFpbGFibGUuDQotICovDQotI2lmbmRlZiBQTkdMQ09ORl9IDQotIyAgaW5jbHVkZSAicG5nbGliY29uZi5oIg0KLSNlbmRpZg0KLQ0KLS8qIExvY2FsIHJlbmFtZXMgbWF5IGNoYW5nZSBub24tZXhwb3J0ZWQgQVBJIGZ1bmN0aW9ucyBmcm9tIHBuZy5oICovDQotI2lmIGRlZmluZWQoUE5HX1BSRUZJWCkgJiYgIWRlZmluZWQoUE5HUFJFRklYX0gpDQotIyAgaW5jbHVkZSAicG5ncHJlZml4LmgiDQotI2VuZGlmDQotDQotI2lmZGVmIFBOR19VU0VSX0NPTkZJRw0KLSMgIGluY2x1ZGUgInBuZ3Vzci5oIg0KLSAgIC8qIFRoZXNlIHNob3VsZCBoYXZlIGJlZW4gZGVmaW5lZCBpbiBwbmd1c3IuaCAqLw0KLSMgIGlmbmRlZiBQTkdfVVNFUl9QUklWQVRFQlVJTEQNCi0jICAgIGRlZmluZSBQTkdfVVNFUl9QUklWQVRFQlVJTEQgIkN1c3RvbSBsaWJwbmcgYnVpbGQiDQotIyAgZW5kaWYNCi0jICBpZm5kZWYgUE5HX1VTRVJfRExMRk5BTUVfUE9TVEZJWA0KLSMgICAgZGVmaW5lIFBOR19VU0VSX0RMTEZOQU1FX1BPU1RGSVggIkNiIg0KLSMgIGVuZGlmDQotI2VuZGlmDQotDQotLyogQ29tcGlsZSB0aW1lIG9wdGlvbnMuDQotICogPT09PT09PT09PT09PT09PT09PT09DQotICogSW4gYSBtdWx0aS1hcmNoIGJ1aWxkIHRoZSBjb21waWxlciBtYXkgY29tcGlsZSB0aGUgY29kZSBzZXZlcmFsIHRpbWVzIGZvciB0aGUNCi0gKiBzYW1lIG9iamVjdCBtb2R1bGUsIHByb2R1Y2luZyBkaWZmZXJlbnQgYmluYXJpZXMgZm9yIGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzLg0KLSAqIFdoZW4gdGhpcyBoYXBwZW5zIGNvbmZpZ3VyZS10aW1lIHNldHRpbmcgb2YgdGhlIHRhcmdldCBob3N0IG9wdGlvbnMgY2Fubm90IGJlDQotICogZG9uZSBhbmQgdGhpcyBpbnRlcmZlcmVzIHdpdGggdGhlIGhhbmRsaW5nIG9mIHRoZSBBUk0gTkVPTiBvcHRpbWl6YXRpb25zLCBhbmQNCi0gKiBwb3NzaWJseSBvdGhlciBzaW1pbGFyIG9wdGltaXphdGlvbnMuICBQdXQgYWRkaXRpb25hbCB0ZXN0cyBoZXJlOyBpbiBnZW5lcmFsDQotICogdGhpcyBpcyBuZWVkZWQgd2hlbiB0aGUgc2FtZSBvcHRpb24gY2FuIGJlIGNoYW5nZWQgYXQgYm90aCBjb21waWxlIHRpbWUgYW5kDQotICogcnVuIHRpbWUgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgT1MgKGkuZS4gaU9TIHZzIEFuZHJvaWQuKQ0KLSAqDQotICogTk9URTogc3ltYm9sIHByZWZpeGluZyBkb2VzIG5vdCBwYXNzICQoQ0ZMQUdTKSB0byB0aGUgcHJlcHJvY2Vzc29yLCBiZWNhdXNlDQotICogdGhpcyBpcyBub3QgcG9zc2libGUgd2l0aCBjZXJ0YWluIGNvbXBpbGVycyAoT3JhY2xlIFNVTiBPUyBDQyksIGFzIGEgcmVzdWx0DQotICogaXQgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IGFsbCBleHRlcm4gZnVuY3Rpb25zIHRoYXQgKm1pZ2h0KiBiZSB1c2VkDQotICogcmVnYXJkbGVzcyBvZiAkKENGTEFHUykgZ2V0IGRlY2xhcmVkIGluIHRoaXMgZmlsZS4gIFRoZSB0ZXN0IG9uIF9fQVJNX05FT05fXw0KLSAqIGJlbG93IGlzIG9uZSBleGFtcGxlIG9mIHRoaXMgYmVoYXZpb3IgYmVjYXVzZSBpdCBpcyBjb250cm9sbGVkIGJ5IHRoZQ0KLSAqIHByZXNlbmNlIG9yIG5vdCBvZiAtbWZwdT1uZW9uIG9uIHRoZSBHQ0MgY29tbWFuZCBsaW5lLCBpdCBpcyBwb3NzaWJsZSB0byBkbw0KLSAqIHRoaXMgaW4gJChDQyksIGUuZy4gIkNDPWdjYyAtbWZwdT1uZW9uIiwgYnV0IHBlb3BsZSB3aG8gYnVpbGQgbGlicG5nIHJhcmVseQ0KLSAqIGRvIHRoaXMuDQotICovDQotLyoNCi0gKiBwZGZpdW06IFRoaXMgdmVyc2lvbiBvZiBsaWJwbmcgZG9lcyBub3QgY29udGFpbiB0aGUgYXJtIG5lb24gb3B0aW1pemVkIGNvZGUNCi0gKiBzbyB3ZSBzaG91bGQgbmV2ZXIgdHJ5IHRvIHJlZmVyZW5jZSBpdC4NCi0gKi8NCi0jaWYgMA0KLSNpZm5kZWYgUE5HX0FSTV9ORU9OX09QVA0KLSAgIC8qIEFSTSBORU9OIG9wdGltaXphdGlvbnMgYXJlIGJlaW5nIGNvbnRyb2xsZWQgYnkgdGhlIGNvbXBpbGVyIHNldHRpbmdzLA0KLSAgICAqIHR5cGljYWxseSB0aGUgdGFyZ2V0IEZQVS4gIElmIHRoZSBGUFUgaGFzIGJlZW4gc2V0IHRvIE5FT04gKC1tZnB1PW5lb24NCi0gICAgKiB3aXRoIEdDQykgdGhlbiB0aGUgY29tcGlsZXIgd2lsbCBkZWZpbmUgX19BUk1fTkVPTl9fIGFuZCB3ZSBjYW4gcmVseQ0KLSAgICAqIHVuY29uZGl0aW9uYWxseSBvbiBORU9OIGluc3RydWN0aW9ucyBub3QgY3Jhc2hpbmcsIG90aGVyd2lzZSB3ZSBtdXN0DQotICAgICogZGlzYWJsZSB1c2Ugb2YgTkVPTiBpbnN0cnVjdGlvbnM6DQotICAgICovDQotIyAgaWZkZWYgX19BUk1fTkVPTl9fDQotIyAgICAgZGVmaW5lIFBOR19BUk1fTkVPTl9PUFQgMg0KLSMgIGVsc2UNCi0jICAgICBkZWZpbmUgUE5HX0FSTV9ORU9OX09QVCAwDQotIyAgZW5kaWYNCi0jZW5kaWYNCi0NCi0jaWYgUE5HX0FSTV9ORU9OX09QVCA+IDANCi0gICAvKiBORU9OIG9wdGltaXphdGlvbnMgYXJlIHRvIGJlIGF0IGxlYXN0IGNvbnNpZGVyZWQgYnkgbGlicG5nLCBzbyBlbmFibGUgdGhlDQotICAgICogY2FsbGJhY2tzIHRvIGRvIHRoaXMuDQotICAgICovDQotIyAgZGVmaW5lIFBOR19GSUxURVJfT1BUSU1JWkFUSU9OUyBwbmdfaW5pdF9maWx0ZXJfZnVuY3Rpb25zX25lb24NCi0jZW5kaWYNCi0jZW5kaWYNCi0NCi0vKiBJcyB0aGlzIGEgYnVpbGQgb2YgYSBETEwgd2hlcmUgY29tcGlsYXRpb24gb2YgdGhlIG9iamVjdCBtb2R1bGVzIHJlcXVpcmVzDQotICogZGlmZmVyZW50IHByZXByb2Nlc3NvciBzZXR0aW5ncyB0byB0aG9zZSByZXF1aXJlZCBmb3IgYSBzaW1wbGUgbGlicmFyeT8gIElmDQotICogc28gUE5HX0JVSUxEX0RMTCBtdXN0IGJlIHNldC4NCi0gKg0KLSAqIElmIGxpYnBuZyBpcyB1c2VkIGluc2lkZSBhIERMTCBidXQgdGhhdCBETEwgZG9lcyBub3QgZXhwb3J0IHRoZSBsaWJwbmcgQVBJcw0KLSAqIFBOR19CVUlMRF9ETEwgbXVzdCBub3QgYmUgc2V0LiAgVG8gYXZvaWQgdGhlIGNvZGUgYmVsb3cga2lja2luZyBpbiBidWlsZCBhDQotICogc3RhdGljIGxpYnJhcnkgb2YgbGlicG5nIHRoZW4gbGluayB0aGUgRExMIGFnYWluc3QgdGhhdC4NCi0gKi8NCi0jaWZuZGVmIFBOR19CVUlMRF9ETEwNCi0jICBpZmRlZiBETExfRVhQT1JUDQotICAgICAgLyogVGhpcyBpcyBzZXQgYnkgbGlidG9vbCB3aGVuIGZpbGVzIGFyZSBjb21waWxlZCBmb3IgYSBETEw7IGxpYnRvb2wNCi0gICAgICAgKiBhbHdheXMgY29tcGlsZXMgdHdpY2UsIGV2ZW4gb24gc3lzdGVtcyB3aGVyZSBpdCBpc24ndCBuZWNlc3NhcnkuICBTZXQNCi0gICAgICAgKiBQTkdfQlVJTERfRExMIGluIGNhc2UgaXQgaXMgbmVjZXNzYXJ5Og0KLSAgICAgICAqLw0KLSMgICAgIGRlZmluZSBQTkdfQlVJTERfRExMDQotIyAgZWxzZQ0KLSMgICAgIGlmZGVmIF9XSU5ETEwNCi0gICAgICAgICAvKiBUaGlzIGlzIHNldCBieSB0aGUgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gSURFIGluIHByb2plY3RzIHRoYXQNCi0gICAgICAgICAgKiBidWlsZCBhIERMTC4gIEl0IGNhbid0IGVhc2lseSBiZSByZW1vdmVkIGZyb20gdGhvc2UgcHJvamVjdHMgKGl0DQotICAgICAgICAgICogaXNuJ3QgdmlzaWJsZSBpbiB0aGUgVmlzdWFsIFN0dWRpbyBVSSkgc28gaXQgaXMgYSBmYWlybHkgcmVsaWFibGUNCi0gICAgICAgICAgKiBpbmRpY2F0aW9uIHRoYXQgUE5HX0lNUEVYUCBuZWVkcyB0byBiZSBzZXQgdG8gdGhlIERMTCBleHBvcnQNCi0gICAgICAgICAgKiBhdHRyaWJ1dGVzLg0KLSAgICAgICAgICAqLw0KLSMgICAgICAgIGRlZmluZSBQTkdfQlVJTERfRExMDQotIyAgICAgZWxzZQ0KLSMgICAgICAgIGlmZGVmIF9fRExMX18NCi0gICAgICAgICAgICAvKiBUaGlzIGlzIHNldCBieSB0aGUgQm9ybGFuZCBDIHN5c3RlbSB3aGVuIGNvbXBpbGluZyBmb3IgYSBETEwNCi0gICAgICAgICAgICAgKiAoYXMgYWJvdmUuKQ0KLSAgICAgICAgICAgICAqLw0KLSMgICAgICAgICAgIGRlZmluZSBQTkdfQlVJTERfRExMDQotIyAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIC8qIEFkZCBhZGRpdGlvbmFsIGNvbXBpbGVyIGNhc2VzIGhlcmUuICovDQotIyAgICAgICAgZW5kaWYNCi0jICAgICBlbmRpZg0KLSMgIGVuZGlmDQotI2VuZGlmIC8qIFNldHRpbmcgUE5HX0JVSUxEX0RMTCBpZiByZXF1aXJlZCAqLw0KLQ0KLS8qIFNlZSBwbmdjb25mLmggZm9yIG1vcmUgZGV0YWlsczogdGhlIGJ1aWxkZXIgb2YgdGhlIGxpYnJhcnkgbWF5IHNldCB0aGlzIG9uDQotICogdGhlIGNvbW1hbmQgbGluZSB0byB0aGUgcmlnaHQgdGhpbmcgZm9yIHRoZSBzcGVjaWZpYyBjb21waWxhdGlvbiBzeXN0ZW0gb3IgaXQNCi0gKiBtYXkgYmUgYXV0b21hZ2ljYWxseSBzZXQgYWJvdmUgKGF0IHByZXNlbnQgd2Uga25vdyBvZiBubyBzeXN0ZW0gd2hlcmUgaXQgZG9lcw0KLSAqIG5lZWQgdG8gYmUgc2V0IG9uIHRoZSBjb21tYW5kIGxpbmUuKQ0KLSAqDQotICogUE5HX0lNUEVYUCBtdXN0IGJlIHNldCBoZXJlIHdoZW4gYnVpbGRpbmcgdGhlIGxpYnJhcnkgdG8gcHJldmVudCBwbmdjb25mLmgNCi0gKiBzZXR0aW5nIGl0IHRvIHRoZSAiaW1wb3J0IiBzZXR0aW5nIGZvciBhIERMTCBidWlsZC4NCi0gKi8NCi0jaWZuZGVmIFBOR19JTVBFWFANCi0jICBpZmRlZiBQTkdfQlVJTERfRExMDQotIyAgICAgZGVmaW5lIFBOR19JTVBFWFAgUE5HX0RMTF9FWFBPUlQNCi0jICBlbHNlDQotICAgICAgLyogTm90IGJ1aWxkaW5nIGEgRExMLCBvciB0aGUgRExMIGRvZXNuJ3QgcmVxdWlyZSBzcGVjaWZpYyBleHBvcnQNCi0gICAgICAgKiBkZWZpbml0aW9ucy4NCi0gICAgICAgKi8NCi0jICAgICBkZWZpbmUgUE5HX0lNUEVYUA0KLSMgIGVuZGlmDQotI2VuZGlmDQotDQotLyogTm8gd2FybmluZ3MgZm9yIHByaXZhdGUgb3IgZGVwcmVjYXRlZCBmdW5jdGlvbnMgaW4gdGhlIGJ1aWxkOiAqLw0KLSNpZm5kZWYgUE5HX0RFUFJFQ0FURUQNCi0jICBkZWZpbmUgUE5HX0RFUFJFQ0FURUQNCi0jZW5kaWYNCi0jaWZuZGVmIFBOR19QUklWQVRFDQotIyAgZGVmaW5lIFBOR19QUklWQVRFDQotI2VuZGlmDQotDQotLyogU3ltYm9sIHByZXByb2Nlc3Npbmcgc3VwcG9ydC4NCi0gKg0KLSAqIFRvIGVuYWJsZSBsaXN0aW5nIGdsb2JhbCwgYnV0IGludGVybmFsLCBzeW1ib2xzIHRoZSBmb2xsb3dpbmcgbWFjcm9zIHNob3VsZA0KLSAqIGFsd2F5cyBiZSB1c2VkIHRvIGRlY2xhcmUgYW4gZXh0ZXJuIGRhdGEgb3IgZnVuY3Rpb24gb2JqZWN0IGluIHRoaXMgZmlsZS4NCi0gKi8NCi0jaWZuZGVmIFBOR19JTlRFUk5BTF9EQVRBDQotIyAgZGVmaW5lIFBOR19JTlRFUk5BTF9EQVRBKHR5cGUsIG5hbWUsIGFycmF5KSBleHRlcm4gdHlwZSBuYW1lIGFycmF5DQotI2VuZGlmDQotDQotI2lmbmRlZiBQTkdfSU5URVJOQUxfRlVOQ1RJT04NCi0jICBkZWZpbmUgUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHR5cGUsIG5hbWUsIGFyZ3MsIGF0dHJpYnV0ZXMpXA0KLSAgICAgIGV4dGVybiBQTkdfRlVOQ1RJT04odHlwZSwgbmFtZSwgYXJncywgUE5HX0VNUFRZIGF0dHJpYnV0ZXMpDQotI2VuZGlmDQotDQotLyogSWYgZmxvYXRpbmcgb3IgZml4ZWQgcG9pbnQgQVBJcyBhcmUgZGlzYWJsZWQgdGhleSBtYXkgc3RpbGwgYmUgY29tcGlsZWQNCi0gKiBpbnRlcm5hbGx5LiAgVG8gaGFuZGxlIHRoaXMgbWFrZSBzdXJlIHRoZXkgYXJlIGRlY2xhcmVkIGFzIHRoZSBhcHByb3ByaWF0ZQ0KLSAqIGludGVybmFsIGV4dGVybiBmdW5jdGlvbiAob3RoZXJ3aXNlIHRoZSBzeW1ib2wgcHJlZml4aW5nIHN0dWZmIHdvbid0IHdvcmsgYW5kDQotICogdGhlIGZ1bmN0aW9ucyB3aWxsIGJlIHVzZWQgd2l0aG91dCBkZWZpbml0aW9ucy4pDQotICoNCi0gKiBOT1RFOiBhbHRob3VnaCBhbGwgdGhlIEFQSSBmdW5jdGlvbnMgYXJlIGRlY2xhcmVkIGhlcmUgdGhleSBhcmUgbm90IGFsbA0KLSAqIGFjdHVhbGx5IGJ1aWx0ISAgQmVjYXVzZSB0aGUgZGVjbGFyYXRpb25zIGFyZSBzdGlsbCBtYWRlIGl0IGlzIG5lY2Vzc2FyeSB0bw0KLSAqIGZha2Ugb3V0IHR5cGVzIHRoYXQgdGhleSBkZXBlbmQgb24uDQotICovDQotI2lmbmRlZiBQTkdfRlBfRVhQT1JUDQotIyAgaWZuZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQNCi0jICAgICBkZWZpbmUgUE5HX0ZQX0VYUE9SVChvcmRpbmFsLCB0eXBlLCBuYW1lLCBhcmdzKVwNCi0gICAgICAgICBQTkdfSU5URVJOQUxfRlVOQ1RJT04odHlwZSwgbmFtZSwgYXJncywgUE5HX0VNUFRZKTsNCi0jICAgICBpZm5kZWYgUE5HX1ZFUlNJT05fSU5GT19PTkxZDQotICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgcG5nX2luY29tcGxldGUgcG5nX2RvdWJsZTsNCi0gICAgICAgICB0eXBlZGVmIHBuZ19kb3VibGUqICAgICAgICAgICBwbmdfZG91YmxlcDsNCi0gICAgICAgICB0eXBlZGVmIGNvbnN0IHBuZ19kb3VibGUqICAgICBwbmdfY29uc3RfZG91YmxlcDsNCi0gICAgICAgICB0eXBlZGVmIHBuZ19kb3VibGUqKiAgICAgICAgICBwbmdfZG91YmxlcHA7DQotIyAgICAgZW5kaWYNCi0jICBlbmRpZg0KLSNlbmRpZg0KLSNpZm5kZWYgUE5HX0ZJWEVEX0VYUE9SVA0KLSMgIGlmbmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVEDQotIyAgICAgZGVmaW5lIFBOR19GSVhFRF9FWFBPUlQob3JkaW5hbCwgdHlwZSwgbmFtZSwgYXJncylcDQotICAgICAgICAgUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHR5cGUsIG5hbWUsIGFyZ3MsIFBOR19FTVBUWSk7DQotIyAgZW5kaWYNCi0jZW5kaWYNCi0NCi0jaW5jbHVkZSAicG5nLmgiDQotDQotLyogcG5nY29uZi5oIGRvZXMgbm90IHNldCBQTkdfRExMX0VYUE9SVCB1bmxlc3MgaXQgaXMgcmVxdWlyZWQsIHNvOiAqLw0KLSNpZm5kZWYgUE5HX0RMTF9FWFBPUlQNCi0jICBkZWZpbmUgUE5HX0RMTF9FWFBPUlQNCi0jZW5kaWYNCi0NCi0vKiBTRUNVUklUWSBhbmQgU0FGRVRZOg0KLSAqDQotICogQnkgZGVmYXVsdCBsaWJwbmcgaXMgYnVpbHQgd2l0aG91dCBhbnkgaW50ZXJuYWwgbGltaXRzIG9uIGltYWdlIHNpemUsDQotICogaW5kaXZpZHVhbCBoZWFwIChwbmdfbWFsbG9jKSBhbGxvY2F0aW9ucyBvciB0aGUgdG90YWwgYW1vdW50IG9mIG1lbW9yeSB1c2VkLg0KLSAqIElmIFBOR19TQUZFX0xJTUlUU19TVVBQT1JURUQgaXMgZGVmaW5lZCwgaG93ZXZlciwgdGhlIGxpbWl0cyBiZWxvdyBhcmUgdXNlZA0KLSAqICh1bmxlc3MgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4pLiAgVGhlc2UgbGltaXRzIGFyZSBiZWxpZXZlZCB0byBiZSBmYWlybHkNCi0gKiBzYWZlLCBidXQgYnVpbGRlcnMgb2Ygc2VjdXJlIHN5c3RlbXMgc2hvdWxkIHZlcmlmeSB0aGUgdmFsdWVzIGFnYWluc3QgdGhlDQotICogcmVhbCBzeXN0ZW0gY2FwYWJpbGl0aWVzLg0KLSAqLw0KLSNpZmRlZiBQTkdfU0FGRV9MSU1JVFNfU1VQUE9SVEVEDQotICAgLyogJ3NhZmUnIGxpbWl0cyAqLw0KLSMgIGlmbmRlZiBQTkdfVVNFUl9XSURUSF9NQVgNCi0jICAgICBkZWZpbmUgUE5HX1VTRVJfV0lEVEhfTUFYIDEwMDAwMDANCi0jICBlbmRpZg0KLSMgIGlmbmRlZiBQTkdfVVNFUl9IRUlHSFRfTUFYDQotIyAgICAgZGVmaW5lIFBOR19VU0VSX0hFSUdIVF9NQVggMTAwMDAwMA0KLSMgIGVuZGlmDQotIyAgaWZuZGVmIFBOR19VU0VSX0NIVU5LX0NBQ0hFX01BWA0KLSMgICAgIGRlZmluZSBQTkdfVVNFUl9DSFVOS19DQUNIRV9NQVggMTI4DQotIyAgZW5kaWYNCi0jICBpZm5kZWYgUE5HX1VTRVJfQ0hVTktfTUFMTE9DX01BWA0KLSMgICAgIGRlZmluZSBQTkdfVVNFUl9DSFVOS19NQUxMT0NfTUFYIDgwMDAwMDANCi0jICBlbmRpZg0KLSNlbHNlDQotICAgLyogdmFsdWVzIGZvciBubyBsaW1pdHMgKi8NCi0jICBpZm5kZWYgUE5HX1VTRVJfV0lEVEhfTUFYDQotIyAgICAgZGVmaW5lIFBOR19VU0VSX1dJRFRIX01BWCAweDdmZmZmZmZmDQotIyAgZW5kaWYNCi0jICBpZm5kZWYgUE5HX1VTRVJfSEVJR0hUX01BWA0KLSMgICAgIGRlZmluZSBQTkdfVVNFUl9IRUlHSFRfTUFYIDB4N2ZmZmZmZmYNCi0jICBlbmRpZg0KLSMgIGlmbmRlZiBQTkdfVVNFUl9DSFVOS19DQUNIRV9NQVgNCi0jICAgICBkZWZpbmUgUE5HX1VTRVJfQ0hVTktfQ0FDSEVfTUFYIDANCi0jICBlbmRpZg0KLSMgIGlmbmRlZiBQTkdfVVNFUl9DSFVOS19NQUxMT0NfTUFYDQotIyAgICAgZGVmaW5lIFBOR19VU0VSX0NIVU5LX01BTExPQ19NQVggMA0KLSMgIGVuZGlmDQotI2VuZGlmDQotDQotLyogTW92ZWQgdG8gcG5ncHJpdi5oIGF0IGxpYnBuZy0xLjUuMCAqLw0KLS8qIE5PVEU6IHNvbWUgb2YgdGhlc2UgbWF5IGhhdmUgYmVlbiB1c2VkIGluIGV4dGVybmFsIGFwcGxpY2F0aW9ucyBhcw0KLSAqIHRoZXNlIGRlZmluaXRpb25zIHdlcmUgZXhwb3NlZCBpbiBwbmdjb25mLmggcHJpb3IgdG8gMS41Lg0KLSAqLw0KLQ0KLS8qIElmIHlvdSBhcmUgcnVubmluZyBvbiBhIG1hY2hpbmUgd2hlcmUgeW91IGNhbm5vdCBhbGxvY2F0ZSBtb3JlDQotICogdGhhbiA2NEsgb2YgbWVtb3J5IGF0IG9uY2UsIHVuY29tbWVudCB0aGlzLiAgV2hpbGUgbGlicG5nIHdpbGwgbm90DQotICogbm9ybWFsbHkgbmVlZCB0aGF0IG11Y2ggbWVtb3J5IGluIGEgY2h1bmsgKHVubGVzcyB5b3UgbG9hZCB1cCBhIHZlcnkNCi0gKiBsYXJnZSBmaWxlKSwgemxpYiBuZWVkcyB0byBrbm93IGhvdyBiaWcgb2YgYSBjaHVuayBpdCBjYW4gdXNlLCBhbmQNCi0gKiBsaWJwbmcgdGh1cyBtYWtlcyBzdXJlIHRvIGNoZWNrIGFueSBtZW1vcnkgYWxsb2NhdGlvbiB0byB2ZXJpZnkgaXQNCi0gKiB3aWxsIGZpdCBpbnRvIG1lbW9yeS4NCi0gKg0KLSAqIHpsaWIgcHJvdmlkZXMgJ01BWFNFR182NEsnIHdoaWNoLCBpZiBkZWZpbmVkLCBpbmRpY2F0ZXMgdGhlDQotICogc2FtZSBsaW1pdCBhbmQgcG5nY29uZi5oIChhbHJlYWR5IGluY2x1ZGVkKSBzZXRzIHRoZSBsaW1pdA0KLSAqIGlmIGNlcnRhaW4gb3BlcmF0aW5nIHN5c3RlbXMgYXJlIGRldGVjdGVkLg0KLSAqLw0KLSNpZiBkZWZpbmVkKE1BWFNFR182NEspICYmICFkZWZpbmVkKFBOR19NQVhfTUFMTE9DXzY0SykNCi0jICBkZWZpbmUgUE5HX01BWF9NQUxMT0NfNjRLDQotI2VuZGlmDQotDQotI2lmbmRlZiBQTkdfVU5VU0VEDQotLyogVW51c2VkIGZvcm1hbCBwYXJhbWV0ZXIgd2FybmluZ3MgYXJlIHNpbGVuY2VkIHVzaW5nIHRoZSBmb2xsb3dpbmcgbWFjcm8NCi0gKiB3aGljaCBpcyBleHBlY3RlZCB0byBoYXZlIG5vIGJhZCBlZmZlY3RzIG9uIHBlcmZvcm1hbmNlIChvcHRpbWl6aW5nDQotICogY29tcGlsZXJzIHdpbGwgcHJvYmFibHkgcmVtb3ZlIGl0IGVudGlyZWx5KS4gIE5vdGUgdGhhdCBpZiB5b3UgcmVwbGFjZQ0KLSAqIGl0IHdpdGggc29tZXRoaW5nIG90aGVyIHRoYW4gd2hpdGVzcGFjZSwgeW91IG11c3QgaW5jbHVkZSB0aGUgdGVybWluYXRpbmcNCi0gKiBzZW1pY29sb24uDQotICovDQotIyAgZGVmaW5lIFBOR19VTlVTRUQocGFyYW0pICh2b2lkKXBhcmFtOw0KLSNlbmRpZg0KLQ0KLS8qIEp1c3QgYSBsaXR0bGUgY2hlY2sgdGhhdCBzb21lb25lIGhhc24ndCB0cmllZCB0byBkZWZpbmUgc29tZXRoaW5nDQotICogY29udHJhZGljdG9yeS4NCi0gKi8NCi0jaWYgKFBOR19aQlVGX1NJWkUgPiA2NTUzNkwpICYmIGRlZmluZWQoUE5HX01BWF9NQUxMT0NfNjRLKQ0KLSMgIHVuZGVmIFBOR19aQlVGX1NJWkUNCi0jICBkZWZpbmUgUE5HX1pCVUZfU0laRSA2NTUzNkwNCi0jZW5kaWYNCi0NCi0vKiBJZiB3YXJuaW5ncyBvciBlcnJvcnMgYXJlIHR1cm5lZCBvZmYgdGhlIGNvZGUgaXMgZGlzYWJsZWQgb3IgcmVkaXJlY3RlZCBoZXJlLg0KLSAqIEZyb20gMS41LjQgZnVuY3Rpb25zIGhhdmUgYmVlbiBhZGRlZCB0byBhbGxvdyB2ZXJ5IGxpbWl0ZWQgZm9ybWF0dGluZyBvZg0KLSAqIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzIC0gdGhpcyBjb2RlIHdpbGwgYWxzbyBiZSBkaXNhYmxlZCBoZXJlLg0KLSAqLw0KLSNpZmRlZiBQTkdfV0FSTklOR1NfU1VQUE9SVEVEDQotIyAgZGVmaW5lIFBOR19XQVJOSU5HX1BBUkFNRVRFUlMocCkgcG5nX3dhcm5pbmdfcGFyYW1ldGVycyBwOw0KLSNlbHNlDQotIyAgZGVmaW5lIHBuZ193YXJuaW5nKHMxLHMyKSAoKHZvaWQpKHMxKSkNCi0jICBkZWZpbmUgcG5nX2NodW5rX3dhcm5pbmcoczEsczIpICgodm9pZCkoczEpKQ0KLSMgIGRlZmluZSBwbmdfd2FybmluZ19wYXJhbWV0ZXIocCxudW1iZXIsc3RyaW5nKSAoKHZvaWQpMCkNCi0jICBkZWZpbmUgcG5nX3dhcm5pbmdfcGFyYW1ldGVyX3Vuc2lnbmVkKHAsbnVtYmVyLGZvcm1hdCx2YWx1ZSkgKCh2b2lkKTApDQotIyAgZGVmaW5lIHBuZ193YXJuaW5nX3BhcmFtZXRlcl9zaWduZWQocCxudW1iZXIsZm9ybWF0LHZhbHVlKSAoKHZvaWQpMCkNCi0jICBkZWZpbmUgcG5nX2Zvcm1hdHRlZF93YXJuaW5nKHBwLHAsbWVzc2FnZSkgKCh2b2lkKShwcCkpDQotIyAgZGVmaW5lIFBOR19XQVJOSU5HX1BBUkFNRVRFUlMocCkNCi0jZW5kaWYNCi0jaWZuZGVmIFBOR19FUlJPUl9URVhUX1NVUFBPUlRFRA0KLSMgIGRlZmluZSBwbmdfZXJyb3IoczEsczIpIHBuZ19lcnIoczEpDQotIyAgZGVmaW5lIHBuZ19jaHVua19lcnJvcihzMSxzMikgcG5nX2VycihzMSkNCi0jICBkZWZpbmUgcG5nX2ZpeGVkX2Vycm9yKHMxLHMyKSBwbmdfZXJyKHMxKQ0KLSNlbmRpZg0KLQ0KLS8qIEMgYWxsb3dzIHVwLWNhc3RzIGZyb20gKHZvaWQqKSB0byBhbnkgcG9pbnRlciBhbmQgKGNvbnN0IHZvaWQqKSB0byBhbnkNCi0gKiBwb2ludGVyIHRvIGEgY29uc3Qgb2JqZWN0LiAgQysrIHJlZ2FyZHMgdGhpcyBhcyBhIHR5cGUgZXJyb3IgYW5kIHJlcXVpcmVzIGFuDQotICogZXhwbGljaXQsIHN0YXRpYywgY2FzdCBhbmQgcHJvdmlkZXMgdGhlIHN0YXRpY19jYXN0PD4gcnVuZSB0byBlbnN1cmUgdGhhdA0KLSAqIGNvbnN0IGlzIG5vdCBjYXN0IGF3YXkuDQotICovDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotIyAgZGVmaW5lIHBuZ192b2lkY2FzdCh0eXBlLCB2YWx1ZSkgc3RhdGljX2Nhc3Q8dHlwZT4odmFsdWUpDQotIyAgZGVmaW5lIHBuZ19jb25zdGNhc3QodHlwZSwgdmFsdWUpIGNvbnN0X2Nhc3Q8dHlwZT4odmFsdWUpDQotIyAgZGVmaW5lIHBuZ19hbGlnbmNhc3QodHlwZSwgdmFsdWUpIFwNCi0gICBzdGF0aWNfY2FzdDx0eXBlPihzdGF0aWNfY2FzdDx2b2lkKj4odmFsdWUpKQ0KLSMgIGRlZmluZSBwbmdfYWxpZ25jYXN0Y29uc3QodHlwZSwgdmFsdWUpIFwNCi0gICBzdGF0aWNfY2FzdDx0eXBlPihzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4odmFsdWUpKQ0KLSNlbHNlDQotIyAgZGVmaW5lIHBuZ192b2lkY2FzdCh0eXBlLCB2YWx1ZSkgKHZhbHVlKQ0KLSMgIGRlZmluZSBwbmdfY29uc3RjYXN0KHR5cGUsIHZhbHVlKSAoKHR5cGUpKHZhbHVlKSkNCi0jICBkZWZpbmUgcG5nX2FsaWduY2FzdCh0eXBlLCB2YWx1ZSkgKCh2b2lkKikodmFsdWUpKQ0KLSMgIGRlZmluZSBwbmdfYWxpZ25jYXN0Y29uc3QodHlwZSwgdmFsdWUpICgoY29uc3Qgdm9pZCopKHZhbHVlKSkNCi0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8NCi0NCi0vKiBTb21lIGZpeGVkIHBvaW50IEFQSXMgYXJlIHN0aWxsIHJlcXVpcmVkIGV2ZW4gaWYgbm90IGV4cG9ydGVkIGJlY2F1c2UNCi0gKiB0aGV5IGdldCB1c2VkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGZsb2F0aW5nIHBvaW50IEFQSXMuICBUaGlzIG1hZ2ljDQotICogZGVhbHMgd2l0aCB0aGlzOg0KLSAqLw0KLSNpZmRlZiBQTkdfRklYRURfUE9JTlRfU1VQUE9SVEVEDQotIyAgZGVmaW5lIFBOR0ZBUEkgUE5HQVBJDQotI2Vsc2UNCi0jICBkZWZpbmUgUE5HRkFQSSAvKiBQUklWQVRFICovDQotI2VuZGlmDQotDQotI2lmbmRlZiBQTkdfVkVSU0lPTl9JTkZPX09OTFkNCi0vKiBPdGhlciBkZWZpbmVzIHNwZWNpZmljIHRvIGNvbXBpbGVycyBjYW4gZ28gaGVyZS4gIFRyeSB0byBrZWVwDQotICogdGhlbSBpbnNpZGUgYW4gYXBwcm9wcmlhdGUgaWZkZWYvZW5kaWYgcGFpciBmb3IgcG9ydGFiaWxpdHkuDQotICovDQotI2lmIGRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkgfHxcDQotICAgIGRlZmluZWQoUE5HX0ZMT0FUSU5HX0FSSVRITUVUSUNfU1VQUE9SVEVEKQ0KLSAgIC8qIHBuZy5jIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgQU5TSS1DIGNvbnN0YW50cyBpZiB0aGUgY29udmVyc2lvbiBvZg0KLSAgICAqIGZsb2F0aW5nIHBvaW50IHRvIEFTQ0lJIGlzIGltcGxlbWVudGVkIHRoZXJlaW46DQotICAgICoNCi0gICAgKiAgREJMX0RJRyAgTWF4aW11bSBudW1iZXIgb2YgZGVjaW1hbCBkaWdpdHMgKGNhbiBiZSBzZXQgdG8gYW55IGNvbnN0YW50KQ0KLSAgICAqICBEQkxfTUlOICBTbWFsbGVzdCBub3JtYWxpemVkIGZwIG51bWJlciAoY2FuIGJlIHNldCB0byBhbiBhcmJpdHJhcnkgdmFsdWUpDQotICAgICogIERCTF9NQVggIE1heGltdW0gZmxvYXRpbmcgcG9pbnQgbnVtYmVyIChjYW4gYmUgc2V0IHRvIGFuIGFyYml0cmFyeSB2YWx1ZSkNCi0gICAgKi8NCi0jICBpbmNsdWRlIDxmbG9hdC5oPg0KLQ0KLSMgIGlmIChkZWZpbmVkKF9fTVdFUktTX18pICYmIGRlZmluZWQobWFjaW50b3NoKSkgfHwgZGVmaW5lZChhcHBsZWMpIHx8IFwNCi0gICAgZGVmaW5lZChUSElOS19DKSB8fCBkZWZpbmVkKF9fU0NfXykgfHwgZGVmaW5lZChUQVJHRVRfT1NfTUFDKQ0KLSAgICAgLyogV2UgbmVlZCB0byBjaGVjayB0aGF0IDxtYXRoLmg+IGhhc24ndCBhbHJlYWR5IGJlZW4gaW5jbHVkZWQgZWFybGllcg0KLSAgICAgICogYXMgaXQgc2VlbXMgaXQgZG9lc24ndCBhZ3JlZSB3aXRoIDxmcC5oPiwgeWV0IHdlIHNob3VsZCByZWFsbHkgdXNlDQotICAgICAgKiA8ZnAuaD4gaWYgcG9zc2libGUuDQotICAgICAgKi8NCi0jICAgIGlmICFkZWZpbmVkKF9fTUFUSF9IX18pICYmICFkZWZpbmVkKF9fTUFUSF9IKSAmJiAhZGVmaW5lZChfX2NtYXRoX18pDQotIyAgICAgIGluY2x1ZGUgPGZwLmg+DQotIyAgICBlbmRpZg0KLSMgIGVsc2UNCi0jICAgIGluY2x1ZGUgPG1hdGguaD4NCi0jICBlbmRpZg0KLSMgIGlmIGRlZmluZWQoX0FNSUdBKSAmJiBkZWZpbmVkKF9fU0FTQykgJiYgZGVmaW5lZChfTTY4ODgxKQ0KLSAgICAgLyogQW1pZ2EgU0FTL0M6IFdlIG11c3QgaW5jbHVkZSBidWlsdGluIEZQVSBmdW5jdGlvbnMgd2hlbiBjb21waWxpbmcgdXNpbmcNCi0gICAgICAqIE1BVEg9Njg4ODENCi0gICAgICAqLw0KLSMgICAgaW5jbHVkZSA8bTY4ODgxLmg+DQotIyAgZW5kaWYNCi0jZW5kaWYNCi0NCi0vKiBUaGlzIHByb3ZpZGVzIHRoZSBub24tQU5TSSAoZmFyKSBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcy4gKi8NCi0jaWYgZGVmaW5lZChfX1RVUkJPQ19fKSAmJiBkZWZpbmVkKF9fTVNET1NfXykNCi0jICBpbmNsdWRlIDxtZW0uaD4NCi0jICBpbmNsdWRlIDxhbGxvYy5oPg0KLSNlbmRpZg0KLQ0KLSNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XaW5kb3dzKSB8fCBkZWZpbmVkKF9XSU5ET1dTKSB8fCBcDQotICAgIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykNCi0jICBpbmNsdWRlIDx3aW5kb3dzLmg+ICAvKiBkZWZpbmVzIF9XSU5ET1dTXyBtYWNybyAqLw0KLSNlbmRpZg0KLSNlbmRpZiAvKiBQTkdfVkVSU0lPTl9JTkZPX09OTFkgKi8NCi0NCi0vKiBNb3ZlZCBoZXJlIGFyb3VuZCAxLjUuMGJldGEzNiBmcm9tIHBuZ2NvbmYuaCAqLw0KLS8qIFVzZXJzIG1heSB3YW50IHRvIHVzZSB0aGVzZSBzbyB0aGV5IGFyZSBub3QgcHJpdmF0ZS4gIEFueSBsaWJyYXJ5DQotICogZnVuY3Rpb25zIHRoYXQgYXJlIHBhc3NlZCBmYXIgZGF0YSBtdXN0IGJlIG1vZGVsLWluZGVwZW5kZW50Lg0KLSAqLw0KLQ0KLS8qIE1lbW9yeSBtb2RlbC9wbGF0Zm9ybSBpbmRlcGVuZGVudCBmbnMgKi8NCi0jaWZuZGVmIFBOR19BQk9SVA0KLSMgIGlmZGVmIF9XSU5ET1dTXw0KLSMgICAgZGVmaW5lIFBOR19BQk9SVCgpIEV4aXRQcm9jZXNzKDApDQotIyAgZWxzZQ0KLSMgICAgZGVmaW5lIFBOR19BQk9SVCgpIGFib3J0KCkNCi0jICBlbmRpZg0KLSNlbmRpZg0KLQ0KLS8qIFRoZXNlIG1hY3JvcyBtYXkgbmVlZCB0byBiZSBhcmNoaXRlY3R1cmUgZGVwZW5kZW50LiAqLw0KLSNkZWZpbmUgUE5HX0FMSUdOX05PTkUgICAwIC8qIGRvIG5vdCB1c2UgZGF0YSBhbGlnbm1lbnQgKi8NCi0jZGVmaW5lIFBOR19BTElHTl9BTFdBWVMgMSAvKiBhc3N1bWUgdW5hbGlnbmVkIGFjY2Vzc2VzIGFyZSBPSyAqLw0KLSNpZmRlZiBvZmZzZXRvZg0KLSMgIGRlZmluZSBQTkdfQUxJR05fT0ZGU0VUIDIgLyogdXNlIG9mZnNldG9mIHRvIGRldGVybWluZSBhbGlnbm1lbnQgKi8NCi0jZWxzZQ0KLSMgIGRlZmluZSBQTkdfQUxJR05fT0ZGU0VUIC0xIC8qIHByZXZlbnQgdGhlIHVzZSBvZiB0aGlzICovDQotI2VuZGlmDQotI2RlZmluZSBQTkdfQUxJR05fU0laRSAgIDMgLyogdXNlIHNpemVvZiB0byBkZXRlcm1pbmUgYWxpZ25tZW50ICovDQotDQotI2lmbmRlZiBQTkdfQUxJR05fVFlQRQ0KLSAgIC8qIERlZmF1bHQgdG8gdXNpbmcgYWxpZ25lZCBhY2Nlc3Mgb3B0aW1pemF0aW9ucyBhbmQgcmVxdWlyaW5nIGFsaWdubWVudCB0byBhDQotICAgICogbXVsdGlwbGUgb2YgdGhlIGRhdGEgdHlwZSBzaXplLiAgT3ZlcnJpZGUgaW4gYSBjb21waWxlciBzcGVjaWZpYyBmYXNoaW9uDQotICAgICogaWYgbmVjZXNzYXJ5IGJ5IGluc2VydGluZyB0ZXN0cyBoZXJlOg0KLSAgICAqLw0KLSMgIGRlZmluZSBQTkdfQUxJR05fVFlQRSBQTkdfQUxJR05fU0laRQ0KLSNlbmRpZg0KLQ0KLSNpZiBQTkdfQUxJR05fVFlQRSA9PSBQTkdfQUxJR05fU0laRQ0KLSAgIC8qIFRoaXMgaXMgdXNlZCBiZWNhdXNlIGluIHNvbWUgY29tcGlsZXIgaW1wbGVtZW50YXRpb25zIG5vbi1hbGlnbmVkDQotICAgICogc3RydWN0dXJlIG1lbWJlcnMgYXJlIHN1cHBvcnRlZCwgc28gdGhlIG9mZnNldG9mIGFwcHJvYWNoIGJlbG93IGZhaWxzLg0KLSAgICAqIFNldCBQTkdfQUxJR05fU0laRT0wIGZvciBjb21waWxlciBjb21iaW5hdGlvbnMgd2hlcmUgdW5hbGlnbmVkIGFjY2Vzcw0KLSAgICAqIGlzIGdvb2QgZm9yIHBlcmZvcm1hbmNlLiAgRG8gbm90IGRvIHRoaXMgdW5sZXNzIHlvdSBoYXZlIHRlc3RlZCB0aGUgcmVzdWx0DQotICAgICogYW5kIHVuZGVyc3RhbmQgaXQuDQotICAgICovDQotIyAgZGVmaW5lIHBuZ19hbGlnbm9mKHR5cGUpIChzaXplb2YgKHR5cGUpKQ0KLSNlbHNlDQotIyAgaWYgUE5HX0FMSUdOX1RZUEUgPT0gUE5HX0FMSUdOX09GRlNFVA0KLSMgICAgIGRlZmluZSBwbmdfYWxpZ25vZih0eXBlKSBvZmZzZXRvZihzdHJ1Y3R7Y2hhciBjOyB0eXBlIHQ7fSwgdCkNCi0jICBlbHNlDQotIyAgICAgaWYgUE5HX0FMSUdOX1RZUEUgPT0gUE5HX0FMSUdOX0FMV0FZUw0KLSMgICAgICAgIGRlZmluZSBwbmdfYWxpZ25vZih0eXBlKSAoMSkNCi0jICAgICBlbmRpZg0KLSAgICAgIC8qIEVsc2UgbGVhdmUgcG5nX2FsaWdub2YgdW5kZWZpbmVkIHRvIHByZXZlbnQgdXNlIHRoZXJlb2YgKi8NCi0jICBlbmRpZg0KLSNlbmRpZg0KLQ0KLS8qIFRoaXMgaW1wbGljaXRseSBhc3N1bWVzIGFsaWdubWVudCBpcyBhbHdheXMgdG8gYSBwb3dlciBvZiAyLiAqLw0KLSNpZmRlZiBwbmdfYWxpZ25vZg0KLSMgIGRlZmluZSBwbmdfaXNhbGlnbmVkKHB0ciwgdHlwZSlcDQotICAgKCgoKGNvbnN0IGNoYXIqKXB0ci0oY29uc3QgY2hhciopMCkgJiAocG5nX2FsaWdub2YodHlwZSktMSkpID09IDApDQotI2Vsc2UNCi0jICBkZWZpbmUgcG5nX2lzYWxpZ25lZChwdHIsIHR5cGUpIDANCi0jZW5kaWYNCi0NCi0vKiBFbmQgb2YgbWVtb3J5IG1vZGVsL3BsYXRmb3JtIGluZGVwZW5kZW50IHN1cHBvcnQgKi8NCi0vKiBFbmQgb2YgMS41LjBiZXRhMzYgbW92ZSBmcm9tIHBuZ2NvbmYuaCAqLw0KLQ0KLS8qIENPTlNUQU5UUyBhbmQgVVRJTElUWSBNQUNST1MNCi0gKiBUaGVzZSBhcmUgdXNlZCBpbnRlcm5hbGx5IGJ5IGxpYnBuZyBhbmQgbm90IGV4cG9zZWQgaW4gdGhlIEFQSQ0KLSAqLw0KLQ0KLS8qIFZhcmlvdXMgbW9kZXMgb2Ygb3BlcmF0aW9uLiAgTm90ZSB0aGF0IGFmdGVyIGFuIGluaXQsIG1vZGUgaXMgc2V0IHRvDQotICogemVybyBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHN0cnVjdHVyZSBpcyBjcmVhdGVkLiAgVGhyZWUgb2YgdGhlc2UNCi0gKiBhcmUgZGVmaW5lZCBpbiBwbmcuaCBiZWNhdXNlIHRoZXkgbmVlZCB0byBiZSB2aXNpYmxlIHRvIGFwcGxpY2F0aW9ucw0KLSAqIHRoYXQgY2FsbCBwbmdfc2V0X3Vua25vd25fY2h1bmsoKS4NCi0gKi8NCi0vKiAjZGVmaW5lIFBOR19IQVZFX0lIRFIgICAgICAgICAgICAweDAxIChkZWZpbmVkIGluIHBuZy5oKSAqLw0KLS8qICNkZWZpbmUgUE5HX0hBVkVfUExURSAgICAgICAgICAgIDB4MDIgKGRlZmluZWQgaW4gcG5nLmgpICovDQotI2RlZmluZSBQTkdfSEFWRV9JREFUICAgICAgICAgICAgICAgMHgwNA0KLS8qICNkZWZpbmUgUE5HX0FGVEVSX0lEQVQgICAgICAgICAgIDB4MDggKGRlZmluZWQgaW4gcG5nLmgpICovDQotI2RlZmluZSBQTkdfSEFWRV9JRU5EICAgICAgICAgICAgICAgMHgxMA0KLSAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgIDB4MjAgKHVudXNlZCkgKi8NCi0gICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAweDQwICh1bnVzZWQpICovDQotICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgMHg4MCAodW51c2VkKSAqLw0KLSNkZWZpbmUgUE5HX0hBVkVfQ0hVTktfSEVBREVSICAgICAgMHgxMDANCi0jZGVmaW5lIFBOR19XUk9URV90SU1FICAgICAgICAgICAgIDB4MjAwDQotI2RlZmluZSBQTkdfV1JPVEVfSU5GT19CRUZPUkVfUExURSAweDQwMA0KLSNkZWZpbmUgUE5HX0JBQ0tHUk9VTkRfSVNfR1JBWSAgICAgMHg4MDANCi0jZGVmaW5lIFBOR19IQVZFX1BOR19TSUdOQVRVUkUgICAgMHgxMDAwDQotI2RlZmluZSBQTkdfSEFWRV9DSFVOS19BRlRFUl9JREFUIDB4MjAwMCAvKiBIYXZlIGFub3RoZXIgY2h1bmsgYWZ0ZXIgSURBVCAqLw0KLSAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAweDQwMDAgKHVudXNlZCkgKi8NCi0jZGVmaW5lIFBOR19JU19SRUFEX1NUUlVDVCAgICAgICAgMHg4MDAwIC8qIEVsc2UgaXMgYSB3cml0ZSBzdHJ1Y3QgKi8NCi0NCi0vKiBGbGFncyBmb3IgdGhlIHRyYW5zZm9ybWF0aW9ucyB0aGUgUE5HIGxpYnJhcnkgZG9lcyBvbiB0aGUgaW1hZ2UgZGF0YSAqLw0KLSNkZWZpbmUgUE5HX0JHUiAgICAgICAgICAgICAgICAgMHgwMDAxDQotI2RlZmluZSBQTkdfSU5URVJMQUNFICAgICAgICAgICAweDAwMDINCi0jZGVmaW5lIFBOR19QQUNLICAgICAgICAgICAgICAgIDB4MDAwNA0KLSNkZWZpbmUgUE5HX1NISUZUICAgICAgICAgICAgICAgMHgwMDA4DQotI2RlZmluZSBQTkdfU1dBUF9CWVRFUyAgICAgICAgICAweDAwMTANCi0jZGVmaW5lIFBOR19JTlZFUlRfTU9OTyAgICAgICAgIDB4MDAyMA0KLSNkZWZpbmUgUE5HX1FVQU5USVpFICAgICAgICAgICAgMHgwMDQwDQotI2RlZmluZSBQTkdfQ09NUE9TRSAgICAgICAgICAgICAweDAwODAgICAgIC8qIFdhcyBQTkdfQkFDS0dST1VORCAqLw0KLSNkZWZpbmUgUE5HX0JBQ0tHUk9VTkRfRVhQQU5EICAgMHgwMTAwDQotI2RlZmluZSBQTkdfRVhQQU5EXzE2ICAgICAgICAgICAweDAyMDAgICAgIC8qIEFkZGVkIHRvIGxpYnBuZyAxLjUuMiAqLw0KLSNkZWZpbmUgUE5HXzE2X1RPXzggICAgICAgICAgICAgMHgwNDAwICAgICAvKiBCZWNvbWVzICdjaG9wJyBpbiAxLjUuNCAqLw0KLSNkZWZpbmUgUE5HX1JHQkEgICAgICAgICAgICAgICAgMHgwODAwDQotI2RlZmluZSBQTkdfRVhQQU5EICAgICAgICAgICAgICAweDEwMDANCi0jZGVmaW5lIFBOR19HQU1NQSAgICAgICAgICAgICAgIDB4MjAwMA0KLSNkZWZpbmUgUE5HX0dSQVlfVE9fUkdCICAgICAgICAgMHg0MDAwDQotI2RlZmluZSBQTkdfRklMTEVSICAgICAgICAgICAgICAweDgwMDANCi0jZGVmaW5lIFBOR19QQUNLU1dBUCAgICAgICAgICAgMHgxMDAwMA0KLSNkZWZpbmUgUE5HX1NXQVBfQUxQSEEgICAgICAgICAweDIwMDAwDQotI2RlZmluZSBQTkdfU1RSSVBfQUxQSEEgICAgICAgIDB4NDAwMDANCi0jZGVmaW5lIFBOR19JTlZFUlRfQUxQSEEgICAgICAgMHg4MDAwMA0KLSNkZWZpbmUgUE5HX1VTRVJfVFJBTlNGT1JNICAgIDB4MTAwMDAwDQotI2RlZmluZSBQTkdfUkdCX1RPX0dSQVlfRVJSICAgMHgyMDAwMDANCi0jZGVmaW5lIFBOR19SR0JfVE9fR1JBWV9XQVJOICAweDQwMDAwMA0KLSNkZWZpbmUgUE5HX1JHQl9UT19HUkFZICAgICAgIDB4NjAwMDAwIC8qIHR3byBiaXRzLCBSR0JfVE9fR1JBWV9FUlJ8V0FSTiAqLw0KLSNkZWZpbmUgUE5HX0VOQ09ERV9BTFBIQSAgICAgIDB4ODAwMDAwIC8qIEFkZGVkIHRvIGxpYnBuZy0xLjUuNCAqLw0KLSNkZWZpbmUgUE5HX0FERF9BTFBIQSAgICAgICAgIDB4MTAwMDAwMCAvKiBBZGRlZCB0byBsaWJwbmctMS4yLjcgKi8NCi0jZGVmaW5lIFBOR19FWFBBTkRfdFJOUyAgICAgICAweDIwMDAwMDAgLyogQWRkZWQgdG8gbGlicG5nLTEuMi45ICovDQotI2RlZmluZSBQTkdfU0NBTEVfMTZfVE9fOCAgICAgMHg0MDAwMDAwIC8qIEFkZGVkIHRvIGxpYnBuZy0xLjUuNCAqLw0KLSAgICAgICAgICAgICAgICAgICAgICAgLyogICAweDgwMDAwMDAgdW51c2VkICovDQotICAgICAgICAgICAgICAgICAgICAgICAvKiAgMHgxMDAwMDAwMCB1bnVzZWQgKi8NCi0gICAgICAgICAgICAgICAgICAgICAgIC8qICAweDIwMDAwMDAwIHVudXNlZCAqLw0KLSAgICAgICAgICAgICAgICAgICAgICAgLyogIDB4NDAwMDAwMDAgdW51c2VkICovDQotLyogRmxhZ3MgZm9yIHBuZ19jcmVhdGVfc3RydWN0ICovDQotI2RlZmluZSBQTkdfU1RSVUNUX1BORyAgIDB4MDAwMQ0KLSNkZWZpbmUgUE5HX1NUUlVDVF9JTkZPICAweDAwMDINCi0NCi0vKiBTY2FsaW5nIGZhY3RvciBmb3IgZmlsdGVyIGhldXJpc3RpYyB3ZWlnaHRpbmcgY2FsY3VsYXRpb25zICovDQotI2RlZmluZSBQTkdfV0VJR0hUX0ZBQ1RPUiAoMTw8KFBOR19XRUlHSFRfU0hJRlQpKQ0KLSNkZWZpbmUgUE5HX0NPU1RfRkFDVE9SICgxPDwoUE5HX0NPU1RfU0hJRlQpKQ0KLQ0KLS8qIEZsYWdzIGZvciB0aGUgcG5nX3B0ci0+ZmxhZ3MgcmF0aGVyIHRoYW4gZGVjbGFyaW5nIGEgYnl0ZSBmb3IgZWFjaCBvbmUgKi8NCi0jZGVmaW5lIFBOR19GTEFHX1pMSUJfQ1VTVE9NX1NUUkFURUdZICAgICAweDAwMDENCi0jZGVmaW5lIFBOR19GTEFHX1pTVFJFQU1fSU5JVElBTElaRUQgICAgICAweDAwMDIgLyogQWRkZWQgdG8gbGlicG5nLTEuNi4wICovDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgMHgwMDA0ICAgIHVudXNlZCAqLw0KLSNkZWZpbmUgUE5HX0ZMQUdfWlNUUkVBTV9FTkRFRCAgICAgICAgICAgIDB4MDAwOCAvKiBBZGRlZCB0byBsaWJwbmctMS42LjAgKi8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAweDAwMTAgICAgdW51c2VkICovDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgMHgwMDIwICAgIHVudXNlZCAqLw0KLSNkZWZpbmUgUE5HX0ZMQUdfUk9XX0lOSVQgICAgICAgICAgICAgICAgIDB4MDA0MA0KLSNkZWZpbmUgUE5HX0ZMQUdfRklMTEVSX0FGVEVSICAgICAgICAgICAgIDB4MDA4MA0KLSNkZWZpbmUgUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9VU0UgICAgICAgIDB4MDEwMA0KLSNkZWZpbmUgUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9OT1dBUk4gICAgIDB4MDIwMA0KLSNkZWZpbmUgUE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX1VTRSAgICAgICAgIDB4MDQwMA0KLSNkZWZpbmUgUE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX0lHTk9SRSAgICAgIDB4MDgwMA0KLSNkZWZpbmUgUE5HX0ZMQUdfQVNTVU1FX3NSR0IgICAgICAgICAgICAgIDB4MTAwMCAvKiBBZGRlZCB0byBsaWJwbmctMS41LjQgKi8NCi0jZGVmaW5lIFBOR19GTEFHX09QVElNSVpFX0FMUEhBICAgICAgICAgICAweDIwMDAgLyogQWRkZWQgdG8gbGlicG5nLTEuNS40ICovDQotI2RlZmluZSBQTkdfRkxBR19ERVRFQ1RfVU5JTklUSUFMSVpFRCAgICAgMHg0MDAwIC8qIEFkZGVkIHRvIGxpYnBuZy0xLjUuNCAqLw0KLS8qICNkZWZpbmUgUE5HX0ZMQUdfS0VFUF9VTktOT1dOX0NIVU5LUyAgICAgIDB4ODAwMCAqLw0KLS8qICNkZWZpbmUgUE5HX0ZMQUdfS0VFUF9VTlNBRkVfQ0hVTktTICAgICAgMHgxMDAwMCAqLw0KLSNkZWZpbmUgUE5HX0ZMQUdfTElCUkFSWV9NSVNNQVRDSCAgICAgICAgMHgyMDAwMA0KLSNkZWZpbmUgUE5HX0ZMQUdfU1RSSVBfRVJST1JfTlVNQkVSUyAgICAgMHg0MDAwMA0KLSNkZWZpbmUgUE5HX0ZMQUdfU1RSSVBfRVJST1JfVEVYVCAgICAgICAgMHg4MDAwMA0KLSNkZWZpbmUgUE5HX0ZMQUdfQkVOSUdOX0VSUk9SU19XQVJOICAgICAweDEwMDAwMCAvKiBBZGRlZCB0byBsaWJwbmctMS40LjAgKi8NCi0jZGVmaW5lIFBOR19GTEFHX0FQUF9XQVJOSU5HU19XQVJOICAgICAgMHgyMDAwMDAgLyogQWRkZWQgdG8gbGlicG5nLTEuNi4wICovDQotI2RlZmluZSBQTkdfRkxBR19BUFBfRVJST1JTX1dBUk4gICAgICAgIDB4NDAwMDAwIC8qIEFkZGVkIHRvIGxpYnBuZy0xLjYuMCAqLw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAweDgwMDAwMCAgICB1bnVzZWQgKi8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAweDEwMDAwMDAgICAgdW51c2VkICovDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgMHgyMDAwMDAwICAgIHVudXNlZCAqLw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIDB4NDAwMDAwMCAgICB1bnVzZWQgKi8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAweDgwMDAwMDAgICAgdW51c2VkICovDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAweDEwMDAwMDAwICAgIHVudXNlZCAqLw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMHgyMDAwMDAwMCAgICB1bnVzZWQgKi8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDB4NDAwMDAwMDAgICAgdW51c2VkICovDQotDQotI2RlZmluZSBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX01BU0sgKFBOR19GTEFHX0NSQ19BTkNJTExBUllfVVNFIHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX05PV0FSTikNCi0NCi0jZGVmaW5lIFBOR19GTEFHX0NSQ19DUklUSUNBTF9NQVNLICAoUE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX1VTRSB8IFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX0lHTk9SRSkNCi0NCi0jZGVmaW5lIFBOR19GTEFHX0NSQ19NQVNLICAgICAgICAgICAoUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9NQVNLIHwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfRkxBR19DUkNfQ1JJVElDQUxfTUFTSykNCi0NCi0vKiBTYXZlIHR5cGluZyBhbmQgbWFrZSBjb2RlIGVhc2llciB0byB1bmRlcnN0YW5kICovDQotDQotI2RlZmluZSBQTkdfQ09MT1JfRElTVChjMSwgYzIpIChhYnMoKGludCkoKGMxKS5yZWQpIC0gKGludCkoKGMyKS5yZWQpKSArIFwNCi0gICBhYnMoKGludCkoKGMxKS5ncmVlbikgLSAoaW50KSgoYzIpLmdyZWVuKSkgKyBcDQotICAgYWJzKChpbnQpKChjMSkuYmx1ZSkgLSAoaW50KSgoYzIpLmJsdWUpKSkNCi0NCi0vKiBBZGRlZCB0byBsaWJwbmctMS42LjA6IHNjYWxlIGEgMTYtYml0IHZhbHVlIGluIHRoZSByYW5nZSAwLi42NTUzNSB0byAwLi4yNTUNCi0gKiBieSBkaXZpZGluZyBieSAyNTcgKndpdGggcm91bmRpbmcqLiAgVGhpcyBtYWNybyBpcyBleGFjdCBmb3IgdGhlIGdpdmVuIHJhbmdlLg0KLSAqIFNlZSB0aGUgZGlzY291cnNlIGluIHBuZ3J0cmFuLmMgcG5nX2RvX3NjYWxlXzE2X3RvXzguICBUaGUgdmFsdWVzIGluIHRoZQ0KLSAqIG1hY3JvIHdlcmUgZXN0YWJsaXNoZWQgYnkgZXhwZXJpbWVudCAobW9kaWZ5aW5nIHRoZSBhZGRlZCB2YWx1ZSkuICBUaGUgbWFjcm8NCi0gKiBoYXMgYSBzZWNvbmQgdmFyaWFudCB0aGF0IHRha2VzIGEgdmFsdWUgYWxyZWFkeSBzY2FsZWQgYnkgMjU1IGFuZCBkaXZpZGVzIGJ5DQotICogNjU1MzUgLSB0aGlzIGhhcyBhIG1heGltdW0gZXJyb3Igb2YgLjUwMi4gIE92ZXIgdGhlIHJhbmdlIDAuLjY1NTM1KjY1NTM1IGl0DQotICogb25seSBnaXZlcyBvZmYtYnktb25lIGVycm9ycyBhbmQgb25seSBmb3IgMC41JSAoMSBpbiAyMDApIG9mIHRoZSB2YWx1ZXMuDQotICovDQotI2RlZmluZSBQTkdfRElWNjU1MzUodjI0KSAoKCh2MjQpICsgMzI4OTUpID4+IDE2KQ0KLSNkZWZpbmUgUE5HX0RJVjI1Nyh2MTYpIFBOR19ESVY2NTUzNSgocG5nX3VpbnRfMzIpKHYxNikgKiAyNTUpDQotDQotLyogQWRkZWQgdG8gbGlicG5nLTEuMi42IEpCICovDQotI2RlZmluZSBQTkdfUk9XQllURVMocGl4ZWxfYml0cywgd2lkdGgpIFwNCi0gICAgKChwaXhlbF9iaXRzKSA+PSA4ID8gXA0KLSAgICAoKHBuZ19zaXplX3QpKHdpZHRoKSAqICgoKHBuZ19zaXplX3QpKHBpeGVsX2JpdHMpKSA+PiAzKSkgOiBcDQotICAgICgoICgocG5nX3NpemVfdCkod2lkdGgpICogKChwbmdfc2l6ZV90KShwaXhlbF9iaXRzKSkpICsgNykgPj4gMykgKQ0KLQ0KLS8qIFBOR19PVVRfT0ZfUkFOR0UgcmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIG91dHNpZGUgdGhlIHJhbmdlDQotICogaWRlYWwtZGVsdGEuLmlkZWFsK2RlbHRhLiAgRWFjaCBhcmd1bWVudCBpcyBldmFsdWF0ZWQgdHdpY2UuDQotICogImlkZWFsIiBhbmQgImRlbHRhIiBzaG91bGQgYmUgY29uc3RhbnRzLCBub3JtYWxseSBzaW1wbGUNCi0gKiBpbnRlZ2VycywgInZhbHVlIiBhIHZhcmlhYmxlLiBBZGRlZCB0byBsaWJwbmctMS4yLjYgSkINCi0gKi8NCi0jZGVmaW5lIFBOR19PVVRfT0ZfUkFOR0UodmFsdWUsIGlkZWFsLCBkZWx0YSkgXA0KLSAgICggKHZhbHVlKSA8IChpZGVhbCktKGRlbHRhKSB8fCAodmFsdWUpID4gKGlkZWFsKSsoZGVsdGEpICkNCi0NCi0vKiBDb252ZXJzaW9ucyBiZXR3ZWVuIGZpeGVkIGFuZCBmbG9hdGluZyBwb2ludCwgb25seSBkZWZpbmVkIGlmDQotICogcmVxdWlyZWQgKHRvIG1ha2Ugc3VyZSB0aGUgY29kZSBkb2Vzbid0IGFjY2lkZW50YWxseSB1c2UgZmxvYXQNCi0gKiB3aGVuIGl0IGlzIHN1cHBvc2VkbHkgZGlzYWJsZWQuKQ0KLSAqLw0KLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEDQotLyogVGhlIGZsb2F0aW5nIHBvaW50IGNvbnZlcnNpb24gY2FuJ3Qgb3ZlcmZsb3csIHRob3VnaCBpdCBjYW4gYW5kDQotICogZG9lcyBsb3NlIGFjY3VyYWN5IHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbCBmaXhlZCBwb2ludCB2YWx1ZS4NCi0gKiBJbiBwcmFjdGljZSB0aGlzIGRvZXNuJ3QgbWF0dGVyIGJlY2F1c2UgcG5nX2ZpeGVkX3BvaW50IG9ubHkNCi0gKiBzdG9yZXMgbnVtYmVycyB3aXRoIHZlcnkgbG93IHByZWNpc2lvbi4gIFRoZSBwbmdfcHRyIGFuZCBzDQotICogYXJndW1lbnRzIGFyZSB1bnVzZWQgYnkgZGVmYXVsdCBidXQgYXJlIHRoZXJlIGluIGNhc2UgZXJyb3INCi0gKiBjaGVja2luZyBiZWNvbWVzIGEgcmVxdWlyZW1lbnQuDQotICovDQotI2RlZmluZSBwbmdfZmxvYXQocG5nX3B0ciwgZml4ZWQsIHMpICguMDAwMDEgKiAoZml4ZWQpKQ0KLQ0KLS8qIFRoZSBmaXhlZCBwb2ludCBjb252ZXJzaW9uIHBlcmZvcm1zIHJhbmdlIGNoZWNraW5nIGFuZCBldmFsdWF0ZXMNCi0gKiBpdHMgYXJndW1lbnQgbXVsdGlwbGUgdGltZXMsIHNvIG11c3QgYmUgdXNlZCB3aXRoIGNhcmUuICBUaGUNCi0gKiByYW5nZSBjaGVja2luZyB1c2VzIHRoZSBQTkcgc3BlY2lmaWNhdGlvbiB2YWx1ZXMgZm9yIGEgc2lnbmVkDQotICogMzIgYml0IGZpeGVkIHBvaW50IHZhbHVlIGV4Y2VwdCB0aGF0IHRoZSB2YWx1ZXMgYXJlIGRlbGliZXJhdGVseQ0KLSAqIHJvdW5kZWQtdG8temVybyB0byBhbiBpbnRlZ3JhbCB2YWx1ZSAtIDIxNDc0ICgyMTQ3NC44MyBpcyByb3VnaGx5DQotICogKDJeMzEtMSkgKiAxMDAwMDApLiAncycgaXMgYSBzdHJpbmcgdGhhdCBkZXNjcmliZXMgdGhlIHZhbHVlIGJlaW5nDQotICogY29udmVydGVkLg0KLSAqDQotICogTk9URTogdGhpcyBtYWNybyB3aWxsIHJhaXNlIGEgcG5nX2Vycm9yIGlmIHRoZSByYW5nZSBjaGVjayBmYWlscywNCi0gKiB0aGVyZWZvcmUgaXQgaXMgbm9ybWFsbHkgb25seSBhcHByb3ByaWF0ZSB0byB1c2UgdGhpcyBvbiB2YWx1ZXMNCi0gKiB0aGF0IGNvbWUgZnJvbSBBUEkgY2FsbHMgb3Igb3RoZXIgc291cmNlcyB3aGVyZSBhbiBvdXQgb2YgcmFuZ2UNCi0gKiBlcnJvciBpbmRpY2F0ZXMgYSBwcm9ncmFtbWluZyBlcnJvciwgbm90IGEgZGF0YSBlcnJvciENCi0gKg0KLSAqIE5PVEU6IGJ5IGRlZmF1bHQgdGhpcyBpcyBvZmYgLSB0aGUgbWFjcm8gaXMgbm90IHVzZWQgLSBiZWNhdXNlIHRoZQ0KLSAqIGZ1bmN0aW9uIGNhbGwgc2F2ZXMgYSBsb3Qgb2YgY29kZS4NCi0gKi8NCi0jaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX01BQ1JPX1NVUFBPUlRFRA0KLSNkZWZpbmUgcG5nX2ZpeGVkKHBuZ19wdHIsIGZwLCBzKSAoKGZwKSA8PSAyMTQ3NCAmJiAoZnApID49IC0yMTQ3NCA/XA0KLSAgICAoKHBuZ19maXhlZF9wb2ludCkoMTAwMDAwICogKGZwKSkpIDogKHBuZ19maXhlZF9lcnJvcihwbmdfcHRyLCBzKSwwKSkNCi0jZW5kaWYNCi0vKiBlbHNlIHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uIGlzIGRlZmluZWQgYmVsb3csIGluc2lkZSB0aGUgc2NvcGUgb2YgdGhlDQotICogY3BsdXNwbHVzIHRlc3QuDQotICovDQotI2VuZGlmDQotDQotLyogQ29uc3RhbnRzIGZvciBrbm93biBjaHVuayB0eXBlcy4gIElmIHlvdSBuZWVkIHRvIGFkZCBhIGNodW5rLCBkZWZpbmUgdGhlIG5hbWUNCi0gKiBoZXJlLiAgRm9yIGhpc3RvcmljYWwgcmVhc29ucyB0aGVzZSBjb25zdGFudHMgaGF2ZSB0aGUgZm9ybSBwbmdfPG5hbWU+OyBpLmUuDQotICogdGhlIHByZWZpeCBpcyBsb3dlciBjYXNlLiAgUGxlYXNlIHVzZSBkZWNpbWFsIHZhbHVlcyBhcyB0aGUgcGFyYW1ldGVycyB0bw0KLSAqIG1hdGNoIHRoZSBJU08gUE5HIHNwZWNpZmljYXRpb24gYW5kIHRvIGF2b2lkIHJlbHlpbmcgb24gdGhlIEMgbG9jYWxlDQotICogaW50ZXJwcmV0YXRpb24gb2YgY2hhcmFjdGVyIHZhbHVlcy4NCi0gKg0KLSAqIFByaW9yIHRvIDEuNS42IHRoZXNlIGNvbnN0YW50cyB3ZXJlIHN0cmluZ3MsIGFzIG9mIDEuNS42IHBuZ191aW50XzMyIHZhbHVlcw0KLSAqIGFyZSBjb21wdXRlZCBhbmQgYSBuZXcgbWFjcm8gKFBOR19TVFJJTkdfRlJPTV9DSFVOSykgYWRkZWQgdG8gYWxsb3cgYSBzdHJpbmcNCi0gKiB0byBiZSBnZW5lcmF0ZWQgaWYgcmVxdWlyZWQuDQotICoNCi0gKiBQTkdfMzJiIGNvcnJlY3RseSBwcm9kdWNlcyBhIHZhbHVlIHNoaWZ0ZWQgYnkgdXAgdG8gMjQgYml0cywgZXZlbiBvbg0KLSAqIGFyY2hpdGVjdHVyZXMgd2hlcmUgKGludCkgaXMgb25seSAxNiBiaXRzLg0KLSAqLw0KLSNkZWZpbmUgUE5HXzMyYihiLHMpICgocG5nX3VpbnRfMzIpKGIpIDw8IChzKSkNCi0jZGVmaW5lIFBOR19VMzIoYjEsYjIsYjMsYjQpIFwNCi0gICAoUE5HXzMyYihiMSwyNCkgfCBQTkdfMzJiKGIyLDE2KSB8IFBOR18zMmIoYjMsOCkgfCBQTkdfMzJiKGI0LDApKQ0KLQ0KLS8qIENvbnN0YW50cyBmb3Iga25vd24gY2h1bmsgdHlwZXMuDQotICoNCi0gKiBNQUlOVEFJTkVSUzogSWYgeW91IG5lZWQgdG8gYWRkIGEgY2h1bmssIGRlZmluZSB0aGUgbmFtZSBoZXJlLg0KLSAqIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMgdGhlc2UgY29uc3RhbnRzIGhhdmUgdGhlIGZvcm0gcG5nXzxuYW1lPjsgaS5lLg0KLSAqIHRoZSBwcmVmaXggaXMgbG93ZXIgY2FzZS4gIFBsZWFzZSB1c2UgZGVjaW1hbCB2YWx1ZXMgYXMgdGhlIHBhcmFtZXRlcnMgdG8NCi0gKiBtYXRjaCB0aGUgSVNPIFBORyBzcGVjaWZpY2F0aW9uIGFuZCB0byBhdm9pZCByZWx5aW5nIG9uIHRoZSBDIGxvY2FsZQ0KLSAqIGludGVycHJldGF0aW9uIG9mIGNoYXJhY3RlciB2YWx1ZXMuICBQbGVhc2Uga2VlcCB0aGUgbGlzdCBzb3J0ZWQuDQotICoNCi0gKiBOb3RpY2UgdGhhdCBQTkdfVTMyIGlzIHVzZWQgdG8gZGVmaW5lIGEgMzItYml0IHZhbHVlIGZvciB0aGUgNCBieXRlIGNodW5rDQotICogdHlwZS4gIEluIGZhY3QgdGhlIHNwZWNpZmljYXRpb24gZG9lcyBub3QgZXhwcmVzcyBjaHVuayB0eXBlcyB0aGlzIHdheSwNCi0gKiBob3dldmVyIHVzaW5nIGEgMzItYml0IHZhbHVlIG1lYW5zIHRoYXQgdGhlIGNodW5rIHR5cGUgY2FuIGJlIHJlYWQgZnJvbSB0aGUNCi0gKiBzdHJlYW0gdXNpbmcgZXhhY3RseSB0aGUgc2FtZSBjb2RlIGFzIHVzZWQgZm9yIGEgMzItYml0IHVuc2lnbmVkIHZhbHVlIGFuZA0KLSAqIGNhbiBiZSBleGFtaW5lZCBmYXIgbW9yZSBlZmZpY2llbnRseSAodXNpbmcgb25lIGFyaXRobWV0aWMgY29tcGFyZSkuDQotICoNCi0gKiBQcmlvciB0byAxLjUuNiB0aGUgY2h1bmsgdHlwZSBjb25zdGFudHMgd2VyZSBleHByZXNzZWQgYXMgQyBzdHJpbmdzLiAgVGhlDQotICogbGlicG5nIEFQSSBzdGlsbCB1c2VzIHN0cmluZ3MgZm9yICd1bmtub3duJyBjaHVua3MgYW5kIGEgbWFjcm8sDQotICogUE5HX1NUUklOR19GUk9NX0NIVU5LLCBhbGxvd3MgYSBzdHJpbmcgdG8gYmUgZ2VuZXJhdGVkIGlmIHJlcXVpcmVkLiAgTm90aWNlDQotICogdGhhdCBmb3IgcG9ydGFibGUgY29kZSBudW1lcmljIHZhbHVlcyBtdXN0IHN0aWxsIGJlIHVzZWQ7IHRoZSBzdHJpbmcgIklIRFIiDQotICogaXMgbm90IHBvcnRhYmxlIGFuZCBuZWl0aGVyIGlzIFBOR19VMzIoJ0knLCAnSCcsICdEJywgJ1InKS4NCi0gKg0KLSAqIEluIDEuNy4wIHRoZSBkZWZpbml0aW9ucyB3aWxsIGJlIG1hZGUgcHVibGljIGluIHBuZy5oIHRvIGF2b2lkIGhhdmluZyB0bw0KLSAqIGR1cGxpY2F0ZSB0aGUgc2FtZSBkZWZpbml0aW9ucyBpbiBhcHBsaWNhdGlvbiBjb2RlLg0KLSAqLw0KLSNkZWZpbmUgcG5nX0lEQVQgUE5HX1UzMiggNzMsICA2OCwgIDY1LCAgODQpDQotI2RlZmluZSBwbmdfSUVORCBQTkdfVTMyKCA3MywgIDY5LCAgNzgsICA2OCkNCi0jZGVmaW5lIHBuZ19JSERSIFBOR19VMzIoIDczLCAgNzIsICA2OCwgIDgyKQ0KLSNkZWZpbmUgcG5nX1BMVEUgUE5HX1UzMiggODAsICA3NiwgIDg0LCAgNjkpDQotI2RlZmluZSBwbmdfYktHRCBQTkdfVTMyKCA5OCwgIDc1LCAgNzEsICA2OCkNCi0jZGVmaW5lIHBuZ19jSFJNIFBOR19VMzIoIDk5LCAgNzIsICA4MiwgIDc3KQ0KLSNkZWZpbmUgcG5nX2ZSQWMgUE5HX1UzMigxMDIsICA4MiwgIDY1LCAgOTkpIC8qIHJlZ2lzdGVyZWQsIG5vdCBkZWZpbmVkICovDQotI2RlZmluZSBwbmdfZ0FNQSBQTkdfVTMyKDEwMywgIDY1LCAgNzcsICA2NSkNCi0jZGVmaW5lIHBuZ19nSUZnIFBOR19VMzIoMTAzLCAgNzMsICA3MCwgMTAzKQ0KLSNkZWZpbmUgcG5nX2dJRnQgUE5HX1UzMigxMDMsICA3MywgIDcwLCAxMTYpIC8qIGRlcHJlY2F0ZWQgKi8NCi0jZGVmaW5lIHBuZ19nSUZ4IFBOR19VMzIoMTAzLCAgNzMsICA3MCwgMTIwKQ0KLSNkZWZpbmUgcG5nX2hJU1QgUE5HX1UzMigxMDQsICA3MywgIDgzLCAgODQpDQotI2RlZmluZSBwbmdfaUNDUCBQTkdfVTMyKDEwNSwgIDY3LCAgNjcsICA4MCkNCi0jZGVmaW5lIHBuZ19pVFh0IFBOR19VMzIoMTA1LCAgODQsICA4OCwgMTE2KQ0KLSNkZWZpbmUgcG5nX29GRnMgUE5HX1UzMigxMTEsICA3MCwgIDcwLCAxMTUpDQotI2RlZmluZSBwbmdfcENBTCBQTkdfVTMyKDExMiwgIDY3LCAgNjUsICA3NikNCi0jZGVmaW5lIHBuZ19wSFlzIFBOR19VMzIoMTEyLCAgNzIsICA4OSwgMTE1KQ0KLSNkZWZpbmUgcG5nX3NCSVQgUE5HX1UzMigxMTUsICA2NiwgIDczLCAgODQpDQotI2RlZmluZSBwbmdfc0NBTCBQTkdfVTMyKDExNSwgIDY3LCAgNjUsICA3NikNCi0jZGVmaW5lIHBuZ19zUExUIFBOR19VMzIoMTE1LCAgODAsICA3NiwgIDg0KQ0KLSNkZWZpbmUgcG5nX3NSR0IgUE5HX1UzMigxMTUsICA4MiwgIDcxLCAgNjYpDQotI2RlZmluZSBwbmdfc1RFUiBQTkdfVTMyKDExNSwgIDg0LCAgNjksICA4MikNCi0jZGVmaW5lIHBuZ190RVh0IFBOR19VMzIoMTE2LCAgNjksICA4OCwgMTE2KQ0KLSNkZWZpbmUgcG5nX3RJTUUgUE5HX1UzMigxMTYsICA3MywgIDc3LCAgNjkpDQotI2RlZmluZSBwbmdfdFJOUyBQTkdfVTMyKDExNiwgIDgyLCAgNzgsICA4MykNCi0jZGVmaW5lIHBuZ196VFh0IFBOR19VMzIoMTIyLCAgODQsICA4OCwgMTE2KQ0KLQ0KLS8qIFRoZSBmb2xsb3dpbmcgd2lsbCB3b3JrIG9uIChzaWduZWQgY2hhciopIHN0cmluZ3MsIHdoZXJlYXMgdGhlIGdldF91aW50XzMyDQotICogbWFjcm8gd2lsbCBmYWlsIG9uIHRvcC1iaXQtc2V0IHZhbHVlcyBiZWNhdXNlIG9mIHRoZSBzaWduIGV4dGVuc2lvbi4NCi0gKi8NCi0jZGVmaW5lIFBOR19DSFVOS19GUk9NX1NUUklORyhzKVwNCi0gICBQTkdfVTMyKDB4ZmYmKHMpWzBdLCAweGZmJihzKVsxXSwgMHhmZiYocylbMl0sIDB4ZmYmKHMpWzNdKQ0KLQ0KLS8qIFRoaXMgdXNlcyAoY2hhciksIG5vdCAocG5nX2J5dGUpIHRvIGF2b2lkIHdhcm5pbmdzIG9uIHN5c3RlbXMgd2hlcmUgKGNoYXIpIGlzDQotICogc2lnbmVkIGFuZCB0aGUgYXJndW1lbnQgaXMgYSAoY2hhcltdKSAgVGhpcyBtYWNybyB3aWxsIGZhaWwgbWlzZXJhYmx5IG9uDQotICogc3lzdGVtcyB3aGVyZSAoY2hhcikgaXMgbW9yZSB0aGFuIDggYml0cy4NCi0gKi8NCi0jZGVmaW5lIFBOR19TVFJJTkdfRlJPTV9DSFVOSyhzLGMpXA0KLSAgICh2b2lkKSgoKGNoYXIqKShzKSlbMF09KGNoYXIpKChjKT4+MjQpLCAoKGNoYXIqKShzKSlbMV09KGNoYXIpKChjKT4+MTYpLFwNCi0gICAoKGNoYXIqKShzKSlbMl09KGNoYXIpKChjKT4+OCksICgoY2hhciopKHMpKVszXT0oY2hhcikoKGMpKSkNCi0NCi0vKiBEbyB0aGUgc2FtZSBidXQgdGVybWluYXRlIHdpdGggYSBudWxsIGNoYXJhY3Rlci4gKi8NCi0jZGVmaW5lIFBOR19DU1RSSU5HX0ZST01fQ0hVTksocyxjKVwNCi0gICAodm9pZCkoUE5HX1NUUklOR19GUk9NX0NIVU5LKHMsYyksICgoY2hhciopKHMpKVs0XSA9IDApDQotDQotLyogVGVzdCBvbiBmbGFnIHZhbHVlcyBhcyBkZWZpbmVkIGluIHRoZSBzcGVjIChzZWN0aW9uIDUuNCk6ICovDQotI2RlZmluZSBQTkdfQ0hVTktfQU5DSUxMQVJZKGMpICAgKDEgJiAoKGMpID4+IDI5KSkNCi0jZGVmaW5lIFBOR19DSFVOS19DUklUSUNBTChjKSAgICAgKCFQTkdfQ0hVTktfQU5DSUxMQVJZKGMpKQ0KLSNkZWZpbmUgUE5HX0NIVU5LX1BSSVZBVEUoYykgICAgICAoMSAmICgoYykgPj4gMjEpKQ0KLSNkZWZpbmUgUE5HX0NIVU5LX1JFU0VSVkVEKGMpICAgICAoMSAmICgoYykgPj4gMTMpKQ0KLSNkZWZpbmUgUE5HX0NIVU5LX1NBRkVfVE9fQ09QWShjKSAoMSAmICgoYykgPj4gIDUpKQ0KLQ0KLS8qIEdhbW1hIHZhbHVlcyAobmV3IGF0IGxpYnBuZy0xLjUuNCk6ICovDQotI2RlZmluZSBQTkdfR0FNTUFfTUFDX09MRCAxNTE3MjQgIC8qIEFzc3VtZSAnMS44JyBpcyByZWFsbHkgMi4yLzEuNDUhICovDQotI2RlZmluZSBQTkdfR0FNTUFfTUFDX0lOVkVSU0UgNjU5MDkNCi0jZGVmaW5lIFBOR19HQU1NQV9zUkdCX0lOVkVSU0UgNDU0NTUNCi0NCi0vKiBBbG1vc3QgZXZlcnl0aGluZyBiZWxvdyBpcyBDIHNwZWNpZmljOyB0aGUgI2RlZmluZXMgYWJvdmUgY2FuIGJlIHVzZWQgaW4NCi0gKiBub24tQyBjb2RlIChzbyBsb25nIGFzIGl0IGlzIEMtcHJlcHJvY2Vzc2VkKSB0aGUgcmVzdCBvZiB0aGlzIHN0dWZmIGNhbm5vdC4NCi0gKi8NCi0jaWZuZGVmIFBOR19WRVJTSU9OX0lORk9fT05MWQ0KLQ0KLSNpbmNsdWRlICJwbmdzdHJ1Y3QuaCINCi0jaW5jbHVkZSAicG5naW5mby5oIg0KLQ0KLS8qIFZhbGlkYXRlIHRoZSBpbmNsdWRlIHBhdGhzIC0gdGhlIGluY2x1ZGUgcGF0aCB1c2VkIHRvIGdlbmVyYXRlIHBuZ2xpYmNvbmYuaA0KLSAqIG11c3QgbWF0Y2ggdGhhdCB1c2VkIGluIHRoZSBidWlsZCwgb3Igd2UgbXVzdCBiZSB1c2luZyBwbmdsaWJjb25mLmgucHJlYnVpbHQ6DQotICovDQotI2lmIFBOR19aTElCX1ZFUk5VTSAhPSAwICYmIFBOR19aTElCX1ZFUk5VTSAhPSBaTElCX1ZFUk5VTQ0KLSMgIGVycm9yIFpMSUJfVkVSTlVNICE9IFBOR19aTElCX1ZFUk5VTSBcDQotICAgICAgIi1JIChpbmNsdWRlIHBhdGgpIGVycm9yOiBzZWUgdGhlIG5vdGVzIGluIHBuZ3ByaXYuaCINCi0gICAvKiBUaGlzIG1lYW5zIHRoYXQgd2hlbiBwbmdsaWJjb25mLmggd2FzIGJ1aWx0IHRoZSBjb3B5IG9mIHpsaWIuaCB0aGF0IGl0DQotICAgICogdXNlZCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIG9uZSBiZWluZyB1c2VkIGhlcmUuICBCZWNhdXNlIHRoZSBidWlsZCBvZg0KLSAgICAqIGxpYnBuZyBtYWtlcyBkZWNpc2lvbnMgdG8gdXNlIGluZmxhdGVJbml0MiBhbmQgaW5mbGF0ZVJlc2V0MiBiYXNlZCBvbiB0aGUNCi0gICAgKiB6bGliIHZlcnNpb24gbnVtYmVyIGFuZCBiZWNhdXNlIHRoaXMgYWZmZWN0cyBoYW5kbGluZyBvZiBjZXJ0YWluIGJyb2tlbg0KLSAgICAqIFBORyBmaWxlcyB0aGUgLUkgZGlyZWN0aXZlcyBtdXN0IG1hdGNoLg0KLSAgICAqDQotICAgICogVGhlIG1vc3QgbGlrZWx5IGV4cGxhbmF0aW9uIGlzIHRoYXQgeW91IHBhc3NlZCBhIC1JIGluIENGTEFHUywgdGhpcyB3aWxsDQotICAgICogbm90IHdvcms7IGFsbCB0aGUgcHJlcHJvY2Vzc29yIGRpcmVjdG9yaWVzIGFuZCBpbiBwYXJ0aWN1bGFyIGFsbCB0aGUgLUkNCi0gICAgKiBkaXJlY3RpdmVzIG11c3QgYmUgaW4gQ1BQRkxBR1MuDQotICAgICovDQotI2VuZGlmDQotDQotLyogVGhpcyBpcyB1c2VkIGZvciAxNiBiaXQgZ2FtbWEgdGFibGVzIC0tIG9ubHkgdGhlIHRvcCBsZXZlbCBwb2ludGVycyBhcmUNCi0gKiBjb25zdDsgdGhpcyBjb3VsZCBiZSBjaGFuZ2VkOg0KLSAqLw0KLXR5cGVkZWYgY29uc3QgcG5nX3VpbnRfMTZwICogcG5nX2NvbnN0X3VpbnRfMTZwcDsNCi0NCi0vKiBBZGRlZCB0byBsaWJwbmctMS41Ljc6IHNSR0IgY29udmVyc2lvbiB0YWJsZXMgKi8NCi0jaWYgZGVmaW5lZChQTkdfU0lNUExJRklFRF9SRUFEX1NVUFBPUlRFRCkgfHxcDQotICAgZGVmaW5lZChQTkdfU0lNUExJRklFRF9XUklURV9TVVBQT1JURUQpDQotI2lmZGVmIFBOR19TSU1QTElGSUVEX1JFQURfU1VQUE9SVEVEDQotUE5HX0lOVEVSTkFMX0RBVEEoY29uc3QgcG5nX3VpbnRfMTYsIHBuZ19zUkdCX3RhYmxlLCBbMjU2XSk7DQotICAgLyogQ29udmVydCBmcm9tIGFuIHNSR0IgZW5jb2RlZCB2YWx1ZSAwLi4yNTUgdG8gYSAxNi1iaXQgbGluZWFyIHZhbHVlLA0KLSAgICAqIDAuLjY1NTM1LiAgVGhpcyB0YWJsZSBnaXZlcyB0aGUgY2xvc2VzdCAxNi1iaXQgYW5zd2VycyAobm8gZXJyb3JzKS4NCi0gICAgKi8NCi0jZW5kaWYNCi0NCi1QTkdfSU5URVJOQUxfREFUQShjb25zdCBwbmdfdWludF8xNiwgcG5nX3NSR0JfYmFzZSwgWzUxMl0pOw0KLVBOR19JTlRFUk5BTF9EQVRBKGNvbnN0IHBuZ19ieXRlLCBwbmdfc1JHQl9kZWx0YSwgWzUxMl0pOw0KLQ0KLSNkZWZpbmUgUE5HX3NSR0JfRlJPTV9MSU5FQVIobGluZWFyKSAoKHBuZ19ieXRlKSgocG5nX3NSR0JfYmFzZVsobGluZWFyKT4+MTVdICtcDQotICAgKCgoKGxpbmVhcikmMHg3ZmZmKSpwbmdfc1JHQl9kZWx0YVsobGluZWFyKT4+MTVdKT4+MTIpKSA+PiA4KSkNCi0gICAvKiBHaXZlbiBhIHZhbHVlICdsaW5lYXInIGluIHRoZSByYW5nZSAwLi4yNTUqNjU1MzUgY2FsY3VsYXRlIHRoZSA4LWJpdCBzUkdCDQotICAgICogZW5jb2RlZCB2YWx1ZSB3aXRoIG1heGltdW0gZXJyb3IgMC42NDYzNjUuICBOb3RlIHRoYXQgdGhlIGlucHV0IGlzIG5vdCBhDQotICAgICogMTYtYml0IHZhbHVlOyBpdCBoYXMgYmVlbiBtdWx0aXBsaWVkIGJ5IDI1NSEgKi8NCi0jZW5kaWYgLyogUE5HX1NJTVBMSUZJRURfUkVBRC9XUklURSAqLw0KLQ0KLQ0KLS8qIEluaGliaXQgQysrIG5hbWUtbWFuZ2xpbmcgZm9yIGxpYnBuZyBmdW5jdGlvbnMgYnV0IG5vdCBmb3Igc3lzdGVtIGNhbGxzLiAqLw0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLWV4dGVybiAiQyIgew0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLw0KLQ0KLS8qIEludGVybmFsIGZ1bmN0aW9uczsgdGhlc2UgYXJlIG5vdCBleHBvcnRlZCBmcm9tIGEgRExMIGhvd2V2ZXIgYmVjYXVzZSB0aGV5DQotICogYXJlIHVzZWQgd2l0aGluIHNldmVyYWwgb2YgdGhlIEMgc291cmNlIGZpbGVzIHRoZXkgaGF2ZSB0byBiZSBDIGV4dGVybi4NCi0gKg0KLSAqIEFsbCBvZiB0aGVzZSBmdW5jdGlvbnMgbXVzdCBiZSBkZWNsYXJlZCB3aXRoIFBOR19JTlRFUk5BTF9GVU5DVElPTi4NCi0gKi8NCi0NCi0vKiBabGliIHN1cHBvcnQgKi8NCi0jZGVmaW5lIFBOR19VTkVYUEVDVEVEX1pMSUJfUkVUVVJOICgtNykNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCwgcG5nX3pzdHJlYW1fZXJyb3IsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBpbnQgcmV0KSwNCi0gICBQTkdfRU1QVFkpOw0KLSAgIC8qIFVzZWQgYnkgdGhlIHpsaWIgaGFuZGxpbmcgZnVuY3Rpb25zIHRvIGVuc3VyZSB0aGF0IHpfc3RyZWFtOjptc2cgaXMgYWx3YXlzDQotICAgICogc2V0IGJlZm9yZSB0aGV5IHJldHVybi4NCi0gICAgKi8NCi0NCi0jaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19mcmVlX2J1ZmZlcl9saXN0LChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCi0gICBwbmdfY29tcHJlc3Npb25fYnVmZmVycCAqbGlzdCksUE5HX0VNUFRZKTsNCi0gICAvKiBGcmVlIHRoZSBidWZmZXIgbGlzdCB1c2VkIGJ5IHRoZSBjb21wcmVzc2VkIHdyaXRlIGNvZGUuICovDQotI2VuZGlmDQotDQotI2lmIGRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkgJiYgXA0KLSAgICFkZWZpbmVkKFBOR19GSVhFRF9QT0lOVF9NQUNST19TVVBQT1JURUQpICYmIFwNCi0gICAoZGVmaW5lZChQTkdfZ0FNQV9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX2NIUk1fU1VQUE9SVEVEKSB8fCBcDQotICAgZGVmaW5lZChQTkdfc0NBTF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpIHx8IFwNCi0gICBkZWZpbmVkKFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRCkpIHx8IFwNCi0gICAoZGVmaW5lZChQTkdfc0NBTF9TVVBQT1JURUQpICYmIFwNCi0gICBkZWZpbmVkKFBOR19GTE9BVElOR19BUklUSE1FVElDX1NVUFBPUlRFRCkpDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHBuZ19maXhlZF9wb2ludCxwbmdfZml4ZWQsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgIGRvdWJsZSBmcCwgcG5nX2NvbnN0X2NoYXJwIHRleHQpLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotLyogQ2hlY2sgdGhlIHVzZXIgdmVyc2lvbiBzdHJpbmcgZm9yIGNvbXBhdGliaWxpdHksIHJldHVybnMgZmFsc2UgaWYgdGhlIHZlcnNpb24NCi0gKiBudW1iZXJzIGFyZW4ndCBjb21wYXRpYmxlLg0KLSAqLw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTihpbnQscG5nX3VzZXJfdmVyc2lvbl9jaGVjaywocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgcG5nX2NvbnN0X2NoYXJwIHVzZXJfcG5nX3ZlciksUE5HX0VNUFRZKTsNCi0NCi0vKiBJbnRlcm5hbCBiYXNlIGFsbG9jYXRvciAtIG5vIG1lc3NhZ2VzLCBOVUxMIG9uIGZhaWx1cmUgdG8gYWxsb2NhdGUuICBUaGlzDQotICogZG9lcywgaG93ZXZlciwgY2FsbCB0aGUgYXBwbGljYXRpb24gcHJvdmlkZWQgYWxsb2NhdG9yIGFuZCB0aGF0IGNvdWxkIGNhbGwNCi0gKiBwbmdfZXJyb3IgKGFsdGhvdWdoIHRoYXQgd291bGQgYmUgYSBidWcgaW4gdGhlIGFwcGxpY2F0aW9uIGltcGxlbWVudGF0aW9uLikNCi0gKi8NCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04ocG5nX3ZvaWRwLHBuZ19tYWxsb2NfYmFzZSwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQotICAgcG5nX2FsbG9jX3NpemVfdCBzaXplKSxQTkdfQUxMT0NBVEVEKTsNCi0NCi0jaWYgZGVmaW5lZChQTkdfVEVYVF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX3NQTFRfU1VQUE9SVEVEKSB8fFwNCi0gICBkZWZpbmVkKFBOR19TVE9SRV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQpDQotLyogSW50ZXJuYWwgYXJyYXkgYWxsb2NhdG9yLCBvdXRwdXRzIG5vIGVycm9yIG9yIHdhcm5pbmcgbWVzc2FnZXMgb24gZmFpbHVyZSwNCi0gKiBqdXN0IHJldHVybnMgTlVMTC4gIA0KLSAqLw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTihwbmdfdm9pZHAscG5nX21hbGxvY19hcnJheSwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQotICAgaW50IG5lbGVtZW50cywgc2l6ZV90IGVsZW1lbnRfc2l6ZSksUE5HX0FMTE9DQVRFRCk7DQotDQotLyogVGhlIHNhbWUgYnV0IGFuIGV4aXN0aW5nIGFycmF5IGlzIGV4dGVuZGVkIGJ5IGFkZF9lbGVtZW50cy4gIFRoaXMgZnVuY3Rpb24NCi0gKiBhbHNvIG1lbXNldHMgdGhlIG5ldyBlbGVtZW50cyB0byAwIGFuZCBjb3BpZXMgdGhlIG9sZCBlbGVtZW50cy4gIFRoZSBvbGQNCi0gKiBhcnJheSBpcyBub3QgZnJlZWQgb3IgYWx0ZXJlZC4NCi0gKi8NCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04ocG5nX3ZvaWRwLHBuZ19yZWFsbG9jX2FycmF5LChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCi0gICBwbmdfY29uc3Rfdm9pZHAgYXJyYXksIGludCBvbGRfZWxlbWVudHMsIGludCBhZGRfZWxlbWVudHMsDQotICAgc2l6ZV90IGVsZW1lbnRfc2l6ZSksUE5HX0FMTE9DQVRFRCk7DQotI2VuZGlmIC8qIHRleHQsIHNQTFQgb3IgdW5rbm93biBjaHVua3MgKi8NCi0NCi0vKiBNYWdpYyB0byBjcmVhdGUgYSBzdHJ1Y3Qgd2hlbiB0aGVyZSBpcyBubyBzdHJ1Y3QgdG8gY2FsbCB0aGUgdXNlciBzdXBwbGllZA0KLSAqIG1lbW9yeSBhbGxvY2F0b3JzLiAgQmVjYXVzZSBlcnJvciBoYW5kbGluZyBoYXMgbm90IGJlZW4gc2V0IHVwIHRoZSBtZW1vcnkNCi0gKiBoYW5kbGVycyBjYW4ndCBzYWZlbHkgY2FsbCBwbmdfZXJyb3IsIGJ1dCB0aGlzIGlzIGFuIG9ic2N1cmUgYW5kIHVuZG9jdW1lbnRlZA0KLSAqIHJlc3RyaWN0aW9uIHNvIGxpYnBuZyBoYXMgdG8gYXNzdW1lIHRoYXQgdGhlICdmcmVlJyBoYW5kbGVyLCBhdCBsZWFzdCwgbWlnaHQNCi0gKiBjYWxsIHBuZ19lcnJvci4NCi0gKi8NCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04ocG5nX3N0cnVjdHAscG5nX2NyZWF0ZV9wbmdfc3RydWN0LA0KLSAgIChwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyLCBwbmdfdm9pZHAgZXJyb3JfcHRyLCBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuLA0KLSAgICBwbmdfZXJyb3JfcHRyIHdhcm5fZm4sIHBuZ192b2lkcCBtZW1fcHRyLCBwbmdfbWFsbG9jX3B0ciBtYWxsb2NfZm4sDQotICAgIHBuZ19mcmVlX3B0ciBmcmVlX2ZuKSxQTkdfQUxMT0NBVEVEKTsNCi0NCi0vKiBGcmVlIG1lbW9yeSBmcm9tIGludGVybmFsIGxpYnBuZyBzdHJ1Y3QgKi8NCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZGVzdHJveV9wbmdfc3RydWN0LChwbmdfc3RydWN0cnAgcG5nX3B0ciksDQotICAgUE5HX0VNUFRZKTsNCi0NCi0vKiBGcmVlIGFuIGFsbG9jYXRlZCBqbXBfYnVmIChhbHdheXMgc3VjY2VlZHMpICovDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2ZyZWVfam1wYnVmLChwbmdfc3RydWN0cnAgcG5nX3B0ciksUE5HX0VNUFRZKTsNCi0NCi0vKiBGdW5jdGlvbiB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHpsaWIuICBQTkdBUEkgaXMgZGlzYWxsb3dlZC4gKi8NCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZHBmLHBuZ196YWxsb2MsKHZvaWRwZiBwbmdfcHRyLCB1SW50IGl0ZW1zLCB1SW50IHNpemUpLA0KLSAgIFBOR19BTExPQ0FURUQpOw0KLQ0KLS8qIEZ1bmN0aW9uIHRvIGZyZWUgbWVtb3J5IGZvciB6bGliLiAgUE5HQVBJIGlzIGRpc2FsbG93ZWQuICovDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3pmcmVlLCh2b2lkcGYgcG5nX3B0ciwgdm9pZHBmIHB0ciksUE5HX0VNUFRZKTsNCi0NCi0vKiBOZXh0IGZvdXIgZnVuY3Rpb25zIGFyZSB1c2VkIGludGVybmFsbHkgYXMgY2FsbGJhY2tzLiAgUE5HQ0JBUEkgaXMgcmVxdWlyZWQNCi0gKiBidXQgbm90IFBOR19FWFBPUlQuICBQTkdBUEkgYWRkZWQgYXQgbGlicG5nIHZlcnNpb24gMS4yLjMsIGNoYW5nZWQgdG8NCi0gKiBQTkdDQkFQSSBhdCAxLjUuMA0KLSAqLw0KLQ0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkIFBOR0NCQVBJLHBuZ19kZWZhdWx0X3JlYWRfZGF0YSwocG5nX3N0cnVjdHAgcG5nX3B0ciwNCi0gICAgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KLQ0KLSNpZmRlZiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCBQTkdDQkFQSSxwbmdfcHVzaF9maWxsX2J1ZmZlciwocG5nX3N0cnVjdHAgcG5nX3B0ciwNCi0gICAgcG5nX2J5dGVwIGJ1ZmZlciwgcG5nX3NpemVfdCBsZW5ndGgpLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQgUE5HQ0JBUEkscG5nX2RlZmF1bHRfd3JpdGVfZGF0YSwocG5nX3N0cnVjdHAgcG5nX3B0ciwNCi0gICAgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3QgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KLQ0KLSNpZmRlZiBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVEDQotIyAgaWZkZWYgUE5HX1NURElPX1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkIFBOR0NCQVBJLHBuZ19kZWZhdWx0X2ZsdXNoLChwbmdfc3RydWN0cCBwbmdfcHRyKSwNCi0gICBQTkdfRU1QVFkpOw0KLSMgIGVuZGlmDQotI2VuZGlmDQotDQotLyogUmVzZXQgdGhlIENSQyB2YXJpYWJsZSAqLw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19yZXNldF9jcmMsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSxQTkdfRU1QVFkpOw0KLQ0KLS8qIFdyaXRlIHRoZSAiZGF0YSIgYnVmZmVyIHRvIHdoYXRldmVyIG91dHB1dCB5b3UgYXJlIHVzaW5nICovDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX2RhdGEsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgICBwbmdfY29uc3RfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpLFBOR19FTVBUWSk7DQotDQotLyogUmVhZCBhbmQgY2hlY2sgdGhlIFBORyBmaWxlIHNpZ25hdHVyZSAqLw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19yZWFkX3NpZywocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgcG5nX2luZm9ycCBpbmZvX3B0ciksUE5HX0VNUFRZKTsNCi0NCi0vKiBSZWFkIHRoZSBjaHVuayBoZWFkZXIgKGxlbmd0aCArIHR5cGUgbmFtZSkgKi8NCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04ocG5nX3VpbnRfMzIscG5nX3JlYWRfY2h1bmtfaGVhZGVyLChwbmdfc3RydWN0cnAgcG5nX3B0ciksDQotICAgUE5HX0VNUFRZKTsNCi0NCi0vKiBSZWFkIGRhdGEgZnJvbSB3aGF0ZXZlciBpbnB1dCB5b3UgYXJlIHVzaW5nIGludG8gdGhlICJkYXRhIiBidWZmZXIgKi8NCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcmVhZF9kYXRhLChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2J5dGVwIGRhdGEsDQotICAgIHBuZ19zaXplX3QgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KLQ0KLS8qIFJlYWQgYnl0ZXMgaW50byBidWYsIGFuZCB1cGRhdGUgcG5nX3B0ci0+Y3JjICovDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2NyY19yZWFkLChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2J5dGVwIGJ1ZiwNCi0gICAgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KLQ0KLS8qIFJlYWQgInNraXAiIGJ5dGVzLCByZWFkIHRoZSBmaWxlIGNyYywgYW5kIChvcHRpb25hbGx5KSB2ZXJpZnkgcG5nX3B0ci0+Y3JjICovDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfY3JjX2ZpbmlzaCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgcG5nX3VpbnRfMzIgc2tpcCksUE5HX0VNUFRZKTsNCi0NCi0vKiBSZWFkIHRoZSBDUkMgZnJvbSB0aGUgZmlsZSBhbmQgY29tcGFyZSBpdCB0byB0aGUgbGlicG5nIGNhbGN1bGF0ZWQgQ1JDICovDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfY3JjX2Vycm9yLChwbmdfc3RydWN0cnAgcG5nX3B0ciksUE5HX0VNUFRZKTsNCi0NCi0vKiBDYWxjdWxhdGUgdGhlIENSQyBvdmVyIGEgc2VjdGlvbiBvZiBkYXRhLiAgTm90ZSB0aGF0IHdlIGFyZSBvbmx5DQotICogcGFzc2luZyBhIG1heGltdW0gb2YgNjRLIG9uIHN5c3RlbXMgdGhhdCBoYXZlIHRoaXMgYXMgYSBtZW1vcnkgbGltaXQsDQotICogc2luY2UgdGhpcyBpcyB0aGUgbWF4aW11bSBidWZmZXIgc2l6ZSB3ZSBjYW4gc3BlY2lmeS4NCi0gKi8NCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfY2FsY3VsYXRlX2NyYywocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgcG5nX2NvbnN0X2J5dGVwIHB0ciwgcG5nX3NpemVfdCBsZW5ndGgpLFBOR19FTVBUWSk7DQotDQotI2lmZGVmIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZmx1c2gsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSxQTkdfRU1QVFkpOw0KLSNlbmRpZg0KLQ0KLS8qIFdyaXRlIHZhcmlvdXMgY2h1bmtzICovDQotDQotLyogV3JpdGUgdGhlIElIRFIgY2h1bmssIGFuZCB1cGRhdGUgdGhlIHBuZ19zdHJ1Y3Qgd2l0aCB0aGUgbmVjZXNzYXJ5DQotICogaW5mb3JtYXRpb24uDQotICovDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX0lIRFIsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgIHBuZ191aW50XzMyIHdpZHRoLCBwbmdfdWludF8zMiBoZWlnaHQsIGludCBiaXRfZGVwdGgsIGludCBjb2xvcl90eXBlLA0KLSAgIGludCBjb21wcmVzc2lvbl9tZXRob2QsIGludCBmaWx0ZXJfbWV0aG9kLCBpbnQgaW50ZXJsYWNlX21ldGhvZCksUE5HX0VNUFRZKTsNCi0NCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfUExURSwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgcG5nX2NvbnN0X2NvbG9ycCBwYWxldHRlLCBwbmdfdWludF8zMiBudW1fcGFsKSxQTkdfRU1QVFkpOw0KLQ0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19jb21wcmVzc19JREFULChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCi0gICBwbmdfY29uc3RfYnl0ZXAgcm93X2RhdGEsIHBuZ19hbGxvY19zaXplX3Qgcm93X2RhdGFfbGVuZ3RoLCBpbnQgZmx1c2gpLA0KLSAgIFBOR19FTVBUWSk7DQotDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX0lFTkQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSxQTkdfRU1QVFkpOw0KLQ0KLSNpZmRlZiBQTkdfV1JJVEVfZ0FNQV9TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfZ0FNQV9maXhlZCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgIHBuZ19maXhlZF9wb2ludCBmaWxlX2dhbW1hKSxQTkdfRU1QVFkpOw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBQTkdfV1JJVEVfc0JJVF9TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfc0JJVCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgIHBuZ19jb25zdF9jb2xvcl84cCBzYml0LCBpbnQgY29sb3JfdHlwZSksUE5HX0VNUFRZKTsNCi0jZW5kaWYNCi0NCi0jaWZkZWYgUE5HX1dSSVRFX2NIUk1fU1VQUE9SVEVEDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX2NIUk1fZml4ZWQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgICBjb25zdCBwbmdfeHkgKnh5KSwgUE5HX0VNUFRZKTsNCi0gICAgLyogVGhlIHh5IHZhbHVlIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgdmFsaWRhdGVkICovDQotI2VuZGlmDQotDQotI2lmZGVmIFBOR19XUklURV9zUkdCX1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV9zUkdCLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCi0gICAgaW50IGludGVudCksUE5HX0VNUFRZKTsNCi0jZW5kaWYNCi0NCi0jaWZkZWYgUE5HX1dSSVRFX2lDQ1BfU1VQUE9SVEVEDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX2lDQ1AsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgIHBuZ19jb25zdF9jaGFycCBuYW1lLCBwbmdfY29uc3RfYnl0ZXAgcHJvZmlsZSksIFBOR19FTVBUWSk7DQotICAgLyogVGhlIHByb2ZpbGUgbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSB2YWxpZGF0ZWQgZm9yIGNvcnJlY3RuZXNzLCB0aGUNCi0gICAgKiBsZW5ndGggY29tZXMgZnJvbSB0aGUgZmlyc3QgZm91ciBieXRlcy4gIE9ubHkgdGhlIGJhc2UsIGRlZmxhdGUsDQotICAgICogY29tcHJlc3Npb24gaXMgc3VwcG9ydGVkLg0KLSAgICAqLw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBQTkdfV1JJVEVfc1BMVF9TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfc1BMVCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgIHBuZ19jb25zdF9zUExUX3RwIHBhbGV0dGUpLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotI2lmZGVmIFBOR19XUklURV90Uk5TX1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV90Uk5TLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCi0gICAgcG5nX2NvbnN0X2J5dGVwIHRyYW5zLCBwbmdfY29uc3RfY29sb3JfMTZwIHZhbHVlcywgaW50IG51bWJlciwNCi0gICAgaW50IGNvbG9yX3R5cGUpLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotI2lmZGVmIFBOR19XUklURV9iS0dEX1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV9iS0dELChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCi0gICAgcG5nX2NvbnN0X2NvbG9yXzE2cCB2YWx1ZXMsIGludCBjb2xvcl90eXBlKSxQTkdfRU1QVFkpOw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBQTkdfV1JJVEVfaElTVF9TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfaElTVCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgIHBuZ19jb25zdF91aW50XzE2cCBoaXN0LCBpbnQgbnVtX2hpc3QpLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotLyogQ2h1bmtzIHRoYXQgaGF2ZSBrZXl3b3JkcyAqLw0KLSNpZmRlZiBQTkdfV1JJVEVfdEVYdF9TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfdEVYdCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgcG5nX2NvbnN0X2NoYXJwIGtleSwgcG5nX2NvbnN0X2NoYXJwIHRleHQsIHBuZ19zaXplX3QgdGV4dF9sZW4pLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotI2lmZGVmIFBOR19XUklURV96VFh0X1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV96VFh0LChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwDQotICAgIGtleSwgcG5nX2NvbnN0X2NoYXJwIHRleHQsIHBuZ19zaXplX3QgdGV4dF9sZW4sIGludCBjb21wcmVzc2lvbiksUE5HX0VNUFRZKTsNCi0jZW5kaWYNCi0NCi0jaWZkZWYgUE5HX1dSSVRFX2lUWHRfU1VQUE9SVEVEDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX2lUWHQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgICBpbnQgY29tcHJlc3Npb24sIHBuZ19jb25zdF9jaGFycCBrZXksIHBuZ19jb25zdF9jaGFycCBsYW5nLA0KLSAgICBwbmdfY29uc3RfY2hhcnAgbGFuZ19rZXksIHBuZ19jb25zdF9jaGFycCB0ZXh0KSxQTkdfRU1QVFkpOw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBQTkdfVEVYVF9TVVBQT1JURUQgIC8qIEFkZGVkIGF0IHZlcnNpb24gMS4wLjE0IGFuZCAxLjIuNCAqLw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTihpbnQscG5nX3NldF90ZXh0XzIsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfY29uc3RfdGV4dHAgdGV4dF9wdHIsIGludCBudW1fdGV4dCksUE5HX0VNUFRZKTsNCi0jZW5kaWYNCi0NCi0jaWZkZWYgUE5HX1dSSVRFX29GRnNfU1VQUE9SVEVEDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX29GRnMsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgICBwbmdfaW50XzMyIHhfb2Zmc2V0LCBwbmdfaW50XzMyIHlfb2Zmc2V0LCBpbnQgdW5pdF90eXBlKSxQTkdfRU1QVFkpOw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBQTkdfV1JJVEVfcENBTF9TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfcENBTCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgIHBuZ19jaGFycCBwdXJwb3NlLCBwbmdfaW50XzMyIFgwLCBwbmdfaW50XzMyIFgxLCBpbnQgdHlwZSwgaW50IG5wYXJhbXMsDQotICAgIHBuZ19jb25zdF9jaGFycCB1bml0cywgcG5nX2NoYXJwcCBwYXJhbXMpLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotI2lmZGVmIFBOR19XUklURV9wSFlzX1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV9wSFlzLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCi0gICAgcG5nX3VpbnRfMzIgeF9waXhlbHNfcGVyX3VuaXQsIHBuZ191aW50XzMyIHlfcGl4ZWxzX3Blcl91bml0LA0KLSAgICBpbnQgdW5pdF90eXBlKSxQTkdfRU1QVFkpOw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBQTkdfV1JJVEVfdElNRV9TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfdElNRSwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgIHBuZ19jb25zdF90aW1lcCBtb2RfdGltZSksUE5HX0VNUFRZKTsNCi0jZW5kaWYNCi0NCi0jaWZkZWYgUE5HX1dSSVRFX3NDQUxfU1VQUE9SVEVEDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX3NDQUxfcywocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgIGludCB1bml0LCBwbmdfY29uc3RfY2hhcnAgd2lkdGgsIHBuZ19jb25zdF9jaGFycCBoZWlnaHQpLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotLyogQ2FsbGVkIHdoZW4gZmluaXNoZWQgcHJvY2Vzc2luZyBhIHJvdyBvZiBkYXRhICovDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX2ZpbmlzaF9yb3csKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSwNCi0gICAgUE5HX0VNUFRZKTsNCi0NCi0vKiBJbnRlcm5hbCB1c2Ugb25seS4gICBDYWxsZWQgYmVmb3JlIGZpcnN0IHJvdyBvZiBkYXRhICovDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX3N0YXJ0X3JvdywocG5nX3N0cnVjdHJwIHBuZ19wdHIpLA0KLSAgICBQTkdfRU1QVFkpOw0KLQ0KLS8qIENvbWJpbmUgYSByb3cgb2YgZGF0YSwgZGVhbGluZyB3aXRoIGFscGhhLCBldGMuIGlmIHJlcXVlc3RlZC4gICdyb3cnIGlzIGFuDQotICogYXJyYXkgb2YgcG5nX3B0ci0+d2lkdGggcGl4ZWxzLiAgSWYgdGhlIGltYWdlIGlzIG5vdCBpbnRlcmxhY2VkIG9yIHRoaXMNCi0gKiBpcyB0aGUgZmluYWwgcGFzcyB0aGlzIGp1c3QgZG9lcyBhIG1lbWNweSwgb3RoZXJ3aXNlIHRoZSAiZGlzcGxheSIgZmxhZw0KLSAqIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gY29weSBwaXhlbHMgdGhhdCBhcmUgbm90IGluIHRoZSBjdXJyZW50IHBhc3MuDQotICoNCi0gKiBCZWNhdXNlICdwbmdfZG9fcmVhZF9pbnRlcmxhY2UnIChiZWxvdykgcmVwbGljYXRlcyBwaXhlbHMgdGhpcyBhbGxvd3MgdGhpcw0KLSAqIGZ1bmN0aW9uIHRvIGFjaGlldmUgdGhlIGRvY3VtZW50ZWQgJ2Jsb2NreScgYXBwZWFyYW5jZSBkdXJpbmcgaW50ZXJsYWNlZCByZWFkDQotICogaWYgZGlzcGxheSBpcyAxIGFuZCB0aGUgJ3NwYXJrbGUnIGFwcGVhcmFuY2UsIHdoZXJlIGV4aXN0aW5nIHBpeGVscyBpbiAncm93Jw0KLSAqIGFyZSBub3QgY2hhbmdlZCBpZiB0aGV5IGFyZSBub3QgaW4gdGhlIGN1cnJlbnQgcGFzcywgd2hlbiBkaXNwbGF5IGlzIDAuDQotICoNCi0gKiAnZGlzcGxheScgbXVzdCBiZSAwIG9yIDEsIG90aGVyd2lzZSB0aGUgbWVtY3B5IHdpbGwgYmUgZG9uZSByZWdhcmRsZXNzLg0KLSAqDQotICogVGhlIEFQSSBhbHdheXMgcmVhZHMgZnJvbSB0aGUgcG5nX3N0cnVjdCByb3cgYnVmZmVyIGFuZCBhbHdheXMgYXNzdW1lcyB0aGF0DQotICogaXQgaXMgZnVsbCB3aWR0aCAocG5nX2RvX3JlYWRfaW50ZXJsYWNlIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkLikNCi0gKg0KLSAqIFRoaXMgZnVuY3Rpb24gaXMgb25seSBldmVyIHVzZWQgdG8gd3JpdGUgdG8gcm93IGJ1ZmZlcnMgcHJvdmlkZWQgYnkgdGhlDQotICogY2FsbGVyIG9mIHRoZSByZWxldmFudCBsaWJwbmcgQVBJIGFuZCB0aGUgcm93IG11c3QgaGF2ZSBhbHJlYWR5IGJlZW4NCi0gKiB0cmFuc2Zvcm1lZCBieSB0aGUgcmVhZCB0cmFuc2Zvcm1hdGlvbnMuDQotICoNCi0gKiBUaGUgUE5HX1VTRV9DT01QSUxFX1RJTUVfTUFTS1Mgb3B0aW9uIGNhdXNlcyBnZW5lcmF0aW9uIG9mIHByZS1jb21wdXRlZA0KLSAqIGJpdG1hc2tzIGZvciB1c2Ugd2l0aGluIHRoZSBjb2RlLCBvdGhlcndpc2UgcnVudGltZSBnZW5lcmF0ZWQgbWFza3MgYXJlIHVzZWQuDQotICogVGhlIGRlZmF1bHQgaXMgY29tcGlsZSB0aW1lIG1hc2tzLg0KLSAqLw0KLSNpZm5kZWYgUE5HX1VTRV9DT01QSUxFX1RJTUVfTUFTS1MNCi0jICBkZWZpbmUgUE5HX1VTRV9DT01QSUxFX1RJTUVfTUFTS1MgMQ0KLSNlbmRpZg0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19jb21iaW5lX3JvdywocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQotICAgIHBuZ19ieXRlcCByb3csIGludCBkaXNwbGF5KSxQTkdfRU1QVFkpOw0KLQ0KLSNpZmRlZiBQTkdfUkVBRF9JTlRFUkxBQ0lOR19TVVBQT1JURUQNCi0vKiBFeHBhbmQgYW4gaW50ZXJsYWNlZCByb3c6IHRoZSAncm93X2luZm8nIGRlc2NyaWJlcyB0aGUgcGFzcyBkYXRhIHRoYXQgaGFzDQotICogYmVlbiByZWFkIGluIGFuZCBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIHBpeGVscyBpbiAncm93JywgdGhlIHBpeGVscyBhcmUNCi0gKiBleHBhbmRlZCAobW92ZWQgYXBhcnQpIGluICdyb3cnIHRvIG1hdGNoIHRoZSBmaW5hbCBsYXlvdXQsIHdoZW4gZG9pbmcgdGhpcw0KLSAqIHRoZSBwaXhlbHMgYXJlICpyZXBsaWNhdGVkKiB0byB0aGUgaW50ZXJ2ZW5pbmcgc3BhY2UuICBUaGlzIGlzIGVzc2VudGlhbCBmb3INCi0gKiB0aGUgY29ycmVjdCBvcGVyYXRpb24gb2YgcG5nX2NvbWJpbmVfcm93LCBhYm92ZS4NCi0gKi8NCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fcmVhZF9pbnRlcmxhY2UsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQotICAgIHBuZ19ieXRlcCByb3csIGludCBwYXNzLCBwbmdfdWludF8zMiB0cmFuc2Zvcm1hdGlvbnMpLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotLyogR1JSIFRPIERPICgyLjAgb3Igd2hlbmV2ZXIpOiAgc2ltcGxpZnkgb3RoZXIgaW50ZXJuYWwgY2FsbGluZyBpbnRlcmZhY2VzICovDQotDQotI2lmZGVmIFBOR19XUklURV9JTlRFUkxBQ0lOR19TVVBQT1JURUQNCi0vKiBHcmFiIHBpeGVscyBvdXQgb2YgYSByb3cgZm9yIGFuIGludGVybGFjZWQgcGFzcyAqLw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb193cml0ZV9pbnRlcmxhY2UsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQotICAgIHBuZ19ieXRlcCByb3csIGludCBwYXNzKSxQTkdfRU1QVFkpOw0KLSNlbmRpZg0KLQ0KLS8qIFVuZmlsdGVyIGEgcm93OiBjaGVjayB0aGUgZmlsdGVyIHZhbHVlIGJlZm9yZSBjYWxsaW5nIHRoaXMsIHRoZXJlIGlzIG5vIHBvaW50DQotICogY2FsbGluZyBpdCBmb3IgUE5HX0ZJTFRFUl9WQUxVRV9OT05FLg0KLSAqLw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19yZWFkX2ZpbHRlcl9yb3csKHBuZ19zdHJ1Y3RycCBwcCwgcG5nX3Jvd19pbmZvcA0KLSAgICByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywgcG5nX2NvbnN0X2J5dGVwIHByZXZfcm93LCBpbnQgZmlsdGVyKSxQTkdfRU1QVFkpOw0KLQ0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19yZWFkX2ZpbHRlcl9yb3dfdXBfbmVvbiwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCi0gICAgcG5nX2J5dGVwIHJvdywgcG5nX2NvbnN0X2J5dGVwIHByZXZfcm93KSxQTkdfRU1QVFkpOw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19yZWFkX2ZpbHRlcl9yb3dfc3ViM19uZW9uLChwbmdfcm93X2luZm9wDQotICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfYnl0ZXAgcHJldl9yb3cpLFBOR19FTVBUWSk7DQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3JlYWRfZmlsdGVyX3Jvd19zdWI0X25lb24sKHBuZ19yb3dfaW5mb3ANCi0gICAgcm93X2luZm8sIHBuZ19ieXRlcCByb3csIHBuZ19jb25zdF9ieXRlcCBwcmV2X3JvdyksUE5HX0VNUFRZKTsNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcmVhZF9maWx0ZXJfcm93X2F2ZzNfbmVvbiwocG5nX3Jvd19pbmZvcA0KLSAgICByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywgcG5nX2NvbnN0X2J5dGVwIHByZXZfcm93KSxQTkdfRU1QVFkpOw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19yZWFkX2ZpbHRlcl9yb3dfYXZnNF9uZW9uLChwbmdfcm93X2luZm9wDQotICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfYnl0ZXAgcHJldl9yb3cpLFBOR19FTVBUWSk7DQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3JlYWRfZmlsdGVyX3Jvd19wYWV0aDNfbmVvbiwocG5nX3Jvd19pbmZvcA0KLSAgICByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywgcG5nX2NvbnN0X2J5dGVwIHByZXZfcm93KSxQTkdfRU1QVFkpOw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19yZWFkX2ZpbHRlcl9yb3dfcGFldGg0X25lb24sKHBuZ19yb3dfaW5mb3ANCi0gICAgcm93X2luZm8sIHBuZ19ieXRlcCByb3csIHBuZ19jb25zdF9ieXRlcCBwcmV2X3JvdyksUE5HX0VNUFRZKTsNCi0NCi0vKiBDaG9vc2UgdGhlIGJlc3QgZmlsdGVyIHRvIHVzZSBhbmQgZmlsdGVyIHRoZSByb3cgZGF0YSAqLw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV9maW5kX2ZpbHRlciwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgIHBuZ19yb3dfaW5mb3Agcm93X2luZm8pLFBOR19FTVBUWSk7DQotDQotI2lmZGVmIFBOR19TRVFVRU5USUFMX1JFQURfU1VQUE9SVEVEDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3JlYWRfSURBVF9kYXRhLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCi0gICBwbmdfYnl0ZXAgb3V0cHV0LCBwbmdfYWxsb2Nfc2l6ZV90IGF2YWlsX291dCksUE5HX0VNUFRZKTsNCi0gICAvKiBSZWFkICdhdmFpbF9vdXQnIGJ5dGVzIG9mIGRhdGEgZnJvbSB0aGUgSURBVCBzdHJlYW0uICBJZiB0aGUgb3V0cHV0IGJ1ZmZlcg0KLSAgICAqIGlzIE5VTEwgdGhlIGZ1bmN0aW9uIGNoZWNrcywgaW5zdGVhZCwgZm9yIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gIEluIHRoaXMNCi0gICAgKiBjYXNlIGEgYmVuaWduIGVycm9yIHdpbGwgYmUgaXNzdWVkIGlmIHRoZSBzdHJlYW0gZW5kIGlzIG5vdCBmb3VuZCBvciBpZg0KLSAgICAqIGV4dHJhIGRhdGEgaGFzIHRvIGJlIGNvbnN1bWVkLg0KLSAgICAqLw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19yZWFkX2ZpbmlzaF9JREFULChwbmdfc3RydWN0cnAgcG5nX3B0ciksDQotICAgUE5HX0VNUFRZKTsNCi0gICAvKiBUaGlzIGNsZWFucyB1cCB3aGVuIHRoZSBJREFUIExaIHN0cmVhbSBkb2VzIG5vdCBlbmQgd2hlbiB0aGUgbGFzdCBpbWFnZQ0KLSAgICAqIGJ5dGUgaXMgcmVhZDsgdGhlcmUgaXMgc3RpbGwgc29tZSBwZW5kaW5nIGlucHV0Lg0KLSAgICAqLw0KLQ0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19yZWFkX2ZpbmlzaF9yb3csKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSwNCi0gICBQTkdfRU1QVFkpOw0KLSAgIC8qIEZpbmlzaCBhIHJvdyB3aGlsZSByZWFkaW5nLCBkZWFsaW5nIHdpdGggaW50ZXJsYWNpbmcgcGFzc2VzLCBldGMuICovDQotI2VuZGlmDQotDQotLyogSW5pdGlhbGl6ZSB0aGUgcm93IGJ1ZmZlcnMsIGV0Yy4gKi8NCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcmVhZF9zdGFydF9yb3csKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSxQTkdfRU1QVFkpOw0KLQ0KLSNpZmRlZiBQTkdfUkVBRF9UUkFOU0ZPUk1TX1NVUFBPUlRFRA0KLS8qIE9wdGlvbmFsIGNhbGwgdG8gdXBkYXRlIHRoZSB1c2VycyBpbmZvIHN0cnVjdHVyZSAqLw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19yZWFkX3RyYW5zZm9ybV9pbmZvLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCi0gICAgcG5nX2luZm9ycCBpbmZvX3B0ciksUE5HX0VNUFRZKTsNCi0jZW5kaWYNCi0NCi0vKiBUaGVzZSBhcmUgdGhlIGZ1bmN0aW9ucyB0aGF0IGRvIHRoZSB0cmFuc2Zvcm1hdGlvbnMgKi8NCi0jaWZkZWYgUE5HX1JFQURfRklMTEVSX1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb19yZWFkX2ZpbGxlciwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCi0gICAgcG5nX2J5dGVwIHJvdywgcG5nX3VpbnRfMzIgZmlsbGVyLCBwbmdfdWludF8zMiBmbGFncyksUE5HX0VNUFRZKTsNCi0jZW5kaWYNCi0NCi0jaWZkZWYgUE5HX1JFQURfU1dBUF9BTFBIQV9TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fcmVhZF9zd2FwX2FscGhhLChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KLSAgICBwbmdfYnl0ZXAgcm93KSxQTkdfRU1QVFkpOw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBQTkdfV1JJVEVfU1dBUF9BTFBIQV9TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fd3JpdGVfc3dhcF9hbHBoYSwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCi0gICAgcG5nX2J5dGVwIHJvdyksUE5HX0VNUFRZKTsNCi0jZW5kaWYNCi0NCi0jaWZkZWYgUE5HX1JFQURfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb19yZWFkX2ludmVydF9hbHBoYSwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCi0gICAgcG5nX2J5dGVwIHJvdyksUE5HX0VNUFRZKTsNCi0jZW5kaWYNCi0NCi0jaWZkZWYgUE5HX1dSSVRFX0lOVkVSVF9BTFBIQV9TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fd3JpdGVfaW52ZXJ0X2FscGhhLChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KLSAgICBwbmdfYnl0ZXAgcm93KSxQTkdfRU1QVFkpOw0KLSNlbmRpZg0KLQ0KLSNpZiBkZWZpbmVkKFBOR19XUklURV9GSUxMRVJfU1VQUE9SVEVEKSB8fCBcDQotICAgIGRlZmluZWQoUE5HX1JFQURfU1RSSVBfQUxQSEFfU1VQUE9SVEVEKQ0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb19zdHJpcF9jaGFubmVsLChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KLSAgICBwbmdfYnl0ZXAgcm93LCBpbnQgYXRfc3RhcnQpLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotI2lmZGVmIFBOR18xNkJJVF9TVVBQT1JURUQNCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9TV0FQX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU1dBUF9TVVBQT1JURUQpDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX3N3YXAsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQotICAgIHBuZ19ieXRlcCByb3cpLFBOR19FTVBUWSk7DQotI2VuZGlmDQotI2VuZGlmDQotDQotI2lmIGRlZmluZWQoUE5HX1JFQURfUEFDS1NXQVBfU1VQUE9SVEVEKSB8fCBcDQotICAgIGRlZmluZWQoUE5HX1dSSVRFX1BBQ0tTV0FQX1NVUFBPUlRFRCkNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fcGFja3N3YXAsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQotICAgIHBuZ19ieXRlcCByb3cpLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotI2lmZGVmIFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTihpbnQscG5nX2RvX3JnYl90b19ncmF5LChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCi0gICAgcG5nX3Jvd19pbmZvcCByb3dfaW5mbywgcG5nX2J5dGVwIHJvdyksUE5HX0VNUFRZKTsNCi0jZW5kaWYNCi0NCi0jaWZkZWYgUE5HX1JFQURfR1JBWV9UT19SR0JfU1VQUE9SVEVEDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX2dyYXlfdG9fcmdiLChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KLSAgICBwbmdfYnl0ZXAgcm93KSxQTkdfRU1QVFkpOw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBQTkdfUkVBRF9QQUNLX1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb191bnBhY2ssKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQotICAgIHBuZ19ieXRlcCByb3cpLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotI2lmZGVmIFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb191bnNoaWZ0LChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KLSAgICBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfY29sb3JfOHAgc2lnX2JpdHMpLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotI2lmIGRlZmluZWQoUE5HX1JFQURfSU5WRVJUX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfSU5WRVJUX1NVUFBPUlRFRCkNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9faW52ZXJ0LChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KLSAgICBwbmdfYnl0ZXAgcm93KSxQTkdfRU1QVFkpOw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBQTkdfUkVBRF9TQ0FMRV8xNl9UT184X1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb19zY2FsZV8xNl90b184LChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KLSAgICBwbmdfYnl0ZXAgcm93KSxQTkdfRU1QVFkpOw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBQTkdfUkVBRF9TVFJJUF8xNl9UT184X1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb19jaG9wLChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KLSAgICBwbmdfYnl0ZXAgcm93KSxQTkdfRU1QVFkpOw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBQTkdfUkVBRF9RVUFOVElaRV9TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fcXVhbnRpemUsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQotICAgIHBuZ19ieXRlcCByb3csIHBuZ19jb25zdF9ieXRlcCBwYWxldHRlX2xvb2t1cCwNCi0gICAgcG5nX2NvbnN0X2J5dGVwIHF1YW50aXplX2xvb2t1cCksUE5HX0VNUFRZKTsNCi0NCi0jICBpZmRlZiBQTkdfQ09SUkVDVF9QQUxFVFRFX1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19jb3JyZWN0X3BhbGV0dGUsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgICBwbmdfY29sb3JwIHBhbGV0dGUsIGludCBudW1fcGFsZXR0ZSksUE5HX0VNUFRZKTsNCi0jICBlbmRpZg0KLSNlbmRpZg0KLQ0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0JHUl9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX0JHUl9TVVBQT1JURUQpDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX2JnciwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCi0gICAgcG5nX2J5dGVwIHJvdyksUE5HX0VNUFRZKTsNCi0jZW5kaWYNCi0NCi0jaWZkZWYgUE5HX1dSSVRFX1BBQ0tfU1VQUE9SVEVEDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX3BhY2ssKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQotICAgcG5nX2J5dGVwIHJvdywgcG5nX3VpbnRfMzIgYml0X2RlcHRoKSxQTkdfRU1QVFkpOw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBQTkdfV1JJVEVfU0hJRlRfU1VQUE9SVEVEDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX3NoaWZ0LChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KLSAgICBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfY29sb3JfOHAgYml0X2RlcHRoKSxQTkdfRU1QVFkpOw0KLSNlbmRpZg0KLQ0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKSB8fFwNCi0gICAgZGVmaW5lZChQTkdfUkVBRF9BTFBIQV9NT0RFX1NVUFBPUlRFRCkNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fY29tcG9zZSwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCi0gICAgcG5nX2J5dGVwIHJvdywgcG5nX3N0cnVjdHJwIHBuZ19wdHIpLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb19nYW1tYSwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCi0gICAgcG5nX2J5dGVwIHJvdywgcG5nX3N0cnVjdHJwIHBuZ19wdHIpLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotI2lmZGVmIFBOR19SRUFEX0FMUEhBX01PREVfU1VQUE9SVEVEDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX2VuY29kZV9hbHBoYSwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCi0gICBwbmdfYnl0ZXAgcm93LCBwbmdfc3RydWN0cnAgcG5nX3B0ciksUE5HX0VNUFRZKTsNCi0jZW5kaWYNCi0NCi0jaWZkZWYgUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb19leHBhbmRfcGFsZXR0ZSwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCi0gICAgcG5nX2J5dGVwIHJvdywgcG5nX2NvbnN0X2NvbG9ycCBwYWxldHRlLCBwbmdfY29uc3RfYnl0ZXAgdHJhbnMsDQotICAgIGludCBudW1fdHJhbnMpLFBOR19FTVBUWSk7DQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX2V4cGFuZCwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCi0gICAgcG5nX2J5dGVwIHJvdywgcG5nX2NvbnN0X2NvbG9yXzE2cCB0cmFuc19jb2xvciksUE5HX0VNUFRZKTsNCi0jZW5kaWYNCi0NCi0jaWZkZWYgUE5HX1JFQURfRVhQQU5EXzE2X1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb19leHBhbmRfMTYsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQotICAgIHBuZ19ieXRlcCByb3cpLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotLyogVGhlIGZvbGxvd2luZyBkZWNvZGVzIHRoZSBhcHByb3ByaWF0ZSBjaHVua3MsIGFuZCBkb2VzIGVycm9yIGNvcnJlY3Rpb24sDQotICogdGhlbiBjYWxscyB0aGUgYXBwcm9wcmlhdGUgY2FsbGJhY2sgZm9yIHRoZSBjaHVuayBpZiBpdCBpcyB2YWxpZC4NCi0gKi8NCi0NCi0vKiBEZWNvZGUgdGhlIElIRFIgY2h1bmsgKi8NCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX0lIRFIsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7DQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV9QTFRFLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCi0gICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfSUVORCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCi0NCi0jaWZkZWYgUE5HX1JFQURfYktHRF9TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX2JLR0QsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotI2lmZGVmIFBOR19SRUFEX2NIUk1fU1VQUE9SVEVEDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV9jSFJNLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCi0gICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBQTkdfUkVBRF9nQU1BX1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfZ0FNQSwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCi0jZW5kaWYNCi0NCi0jaWZkZWYgUE5HX1JFQURfaElTVF9TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX2hJU1QsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotI2lmZGVmIFBOR19SRUFEX2lDQ1BfU1VQUE9SVEVEDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV9pQ0NQLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCi0gICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KLSNlbmRpZiAvKiBQTkdfUkVBRF9pQ0NQX1NVUFBPUlRFRCAqLw0KLQ0KLSNpZmRlZiBQTkdfUkVBRF9pVFh0X1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfaVRYdCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCi0jZW5kaWYNCi0NCi0jaWZkZWYgUE5HX1JFQURfb0ZGc19TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX29GRnMsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotI2lmZGVmIFBOR19SRUFEX3BDQUxfU1VQUE9SVEVEDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV9wQ0FMLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCi0gICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBQTkdfUkVBRF9wSFlzX1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfcEhZcywocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCi0jZW5kaWYNCi0NCi0jaWZkZWYgUE5HX1JFQURfc0JJVF9TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX3NCSVQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotI2lmZGVmIFBOR19SRUFEX3NDQUxfU1VQUE9SVEVEDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV9zQ0FMLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCi0gICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBQTkdfUkVBRF9zUExUX1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfc1BMVCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCi0jZW5kaWYgLyogUE5HX1JFQURfc1BMVF9TVVBQT1JURUQgKi8NCi0NCi0jaWZkZWYgUE5HX1JFQURfc1JHQl9TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX3NSR0IsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotI2lmZGVmIFBOR19SRUFEX3RFWHRfU1VQUE9SVEVEDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV90RVh0LChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCi0gICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBQTkdfUkVBRF90SU1FX1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfdElNRSwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCi0jZW5kaWYNCi0NCi0jaWZkZWYgUE5HX1JFQURfdFJOU19TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX3RSTlMsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotI2lmZGVmIFBOR19SRUFEX3pUWHRfU1VQUE9SVEVEDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV96VFh0LChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCi0gICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KLSNlbmRpZg0KLQ0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19jaGVja19jaHVua19uYW1lLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCi0gICAgcG5nX3VpbnRfMzIgY2h1bmtfbmFtZSksUE5HX0VNUFRZKTsNCi0NCi0jaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVEDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV91bmtub3duLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCi0gICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoLCBpbnQga2VlcCksUE5HX0VNUFRZKTsNCi0gICAvKiBUaGlzIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIGZvciB1bmtub3duIGNodW5rcy4gIFRoZSAna2VlcCcNCi0gICAgKiBhcmd1bWVudCBpcyBlaXRoZXIgbm9uLXplcm8gZm9yIGEga25vd24gY2h1bmsgdGhhdCBoYXMgYmVlbiBzZXQgdG8gYmUNCi0gICAgKiBoYW5kbGVkIGFzIHVua25vd24gb3IgemVybyBmb3IgYW4gdW5rbm93biBjaHVuay4gIEJ5IGRlZmF1bHQgdGhlIGZ1bmN0aW9uDQotICAgICoganVzdCBza2lwcyB0aGUgY2h1bmsgb3IgZXJyb3JzIG91dCBpZiBpdCBpcyBjcml0aWNhbC4NCi0gICAgKi8NCi0NCi0jaWZkZWYgUE5HX1JFQURfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEDQotI2lmZGVmIFBOR19TRVRfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfY2h1bmtfdW5rbm93bl9oYW5kbGluZywNCi0gICAgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfdWludF8zMiBjaHVua19uYW1lKSxQTkdfRU1QVFkpOw0KLSAgIC8qIEV4YWN0bHkgYXMgdGhlIEFQSSBwbmdfaGFuZGxlX2FzX3Vua25vd24oKSBleGNlcHQgdGhhdCB0aGUgYXJndW1lbnQgaXMgYQ0KLSAgICAqIDMyLWJpdCBjaHVuayBuYW1lLCBub3QgYSBzdHJpbmcuDQotICAgICovDQotI2VuZGlmDQotI2VuZGlmIC8qIFBOR19SRUFEX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCAqLw0KLSNlbmRpZiAvKiBQTkdfUkVBRF9TVVBQT1JURUQgKi8NCi0NCi0vKiBIYW5kbGUgdGhlIHRyYW5zZm9ybWF0aW9ucyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyAqLw0KLSNpZmRlZiBQTkdfUkVBRF9UUkFOU0ZPUk1TX1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb19yZWFkX3RyYW5zZm9ybWF0aW9ucywocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgcG5nX3Jvd19pbmZvcCByb3dfaW5mbyksUE5HX0VNUFRZKTsNCi0jZW5kaWYNCi0jaWZkZWYgUE5HX1dSSVRFX1RSQU5TRk9STVNfU1VQUE9SVEVEDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX3dyaXRlX3RyYW5zZm9ybWF0aW9ucywocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgcG5nX3Jvd19pbmZvcCByb3dfaW5mbyksUE5HX0VNUFRZKTsNCi0jZW5kaWYNCi0NCi0jaWZkZWYgUE5HX1JFQURfVFJBTlNGT1JNU19TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaW5pdF9yZWFkX3RyYW5zZm9ybWF0aW9ucywocG5nX3N0cnVjdHJwIHBuZ19wdHIpLA0KLSAgICBQTkdfRU1QVFkpOw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9yZWFkX2NodW5rLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCi0gICAgcG5nX2luZm9ycCBpbmZvX3B0ciksUE5HX0VNUFRZKTsNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9yZWFkX3NpZywocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgIHBuZ19pbmZvcnAgaW5mb19wdHIpLFBOR19FTVBUWSk7DQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3B1c2hfY2hlY2tfY3JjLChwbmdfc3RydWN0cnAgcG5nX3B0ciksUE5HX0VNUFRZKTsNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9jcmNfc2tpcCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9jcmNfZmluaXNoLChwbmdfc3RydWN0cnAgcG5nX3B0ciksDQotICAgIFBOR19FTVBUWSk7DQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3B1c2hfc2F2ZV9idWZmZXIsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSwNCi0gICAgUE5HX0VNUFRZKTsNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9yZXN0b3JlX2J1ZmZlciwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgIHBuZ19ieXRlcCBidWZmZXIsIHBuZ19zaXplX3QgYnVmZmVyX2xlbmd0aCksUE5HX0VNUFRZKTsNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9yZWFkX0lEQVQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSxQTkdfRU1QVFkpOw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wcm9jZXNzX0lEQVRfZGF0YSwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgIHBuZ19ieXRlcCBidWZmZXIsIHBuZ19zaXplX3QgYnVmZmVyX2xlbmd0aCksUE5HX0VNUFRZKTsNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9wcm9jZXNzX3JvdywocG5nX3N0cnVjdHJwIHBuZ19wdHIpLA0KLSAgICBQTkdfRU1QVFkpOw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX2hhbmRsZV91bmtub3duLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCi0gICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7DQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3B1c2hfaGF2ZV9pbmZvLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCi0gICBwbmdfaW5mb3JwIGluZm9fcHRyKSxQTkdfRU1QVFkpOw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX2hhdmVfZW5kLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCi0gICBwbmdfaW5mb3JwIGluZm9fcHRyKSxQTkdfRU1QVFkpOw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX2hhdmVfcm93LChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCi0gICAgIHBuZ19ieXRlcCByb3cpLFBOR19FTVBUWSk7DQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3B1c2hfcmVhZF9lbmQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgICBwbmdfaW5mb3JwIGluZm9fcHRyKSxQTkdfRU1QVFkpOw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wcm9jZXNzX3NvbWVfZGF0YSwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgIHBuZ19pbmZvcnAgaW5mb19wdHIpLFBOR19FTVBUWSk7DQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3JlYWRfcHVzaF9maW5pc2hfcm93LChwbmdfc3RydWN0cnAgcG5nX3B0ciksDQotICAgIFBOR19FTVBUWSk7DQotIyAgaWZkZWYgUE5HX1JFQURfdEVYdF9TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9oYW5kbGVfdEVYdCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9yZWFkX3RFWHQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgICBwbmdfaW5mb3JwIGluZm9fcHRyKSxQTkdfRU1QVFkpOw0KLSMgIGVuZGlmDQotIyAgaWZkZWYgUE5HX1JFQURfelRYdF9TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9oYW5kbGVfelRYdCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9yZWFkX3pUWHQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgICBwbmdfaW5mb3JwIGluZm9fcHRyKSxQTkdfRU1QVFkpOw0KLSMgIGVuZGlmDQotIyAgaWZkZWYgUE5HX1JFQURfaVRYdF9TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9oYW5kbGVfaVRYdCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9yZWFkX2lUWHQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgICBwbmdfaW5mb3JwIGluZm9fcHRyKSxQTkdfRU1QVFkpOw0KLSMgIGVuZGlmDQotDQotI2VuZGlmIC8qIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRCAqLw0KLQ0KLSNpZmRlZiBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb19yZWFkX2ludHJhcGl4ZWwsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQotICAgIHBuZ19ieXRlcCByb3cpLFBOR19FTVBUWSk7DQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX3dyaXRlX2ludHJhcGl4ZWwsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQotICAgIHBuZ19ieXRlcCByb3cpLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotLyogQWRkZWQgYXQgbGlicG5nIHZlcnNpb24gMS42LjAgKi8NCi0jaWZkZWYgUE5HX0dBTU1BX1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19jb2xvcnNwYWNlX3NldF9nYW1tYSwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQotICAgIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwgcG5nX2ZpeGVkX3BvaW50IGdBTUEpLCBQTkdfRU1QVFkpOw0KLSAgIC8qIFNldCB0aGUgY29sb3JzcGFjZSBnYW1tYSB3aXRoIGEgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uIG9yIGJ5DQotICAgICogdGhlIGdBTUEgY2h1bmsgb24gcmVhZC4gIFRoZSB2YWx1ZSB3aWxsIG92ZXJyaWRlIGFueXRoaW5nIHNldCBieSBhbiBJQ0MNCi0gICAgKiBwcm9maWxlLg0KLSAgICAqLw0KLQ0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19jb2xvcnNwYWNlX3N5bmNfaW5mbywocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQotICAgIHBuZ19pbmZvcnAgaW5mb19wdHIpLCBQTkdfRU1QVFkpOw0KLSAgICAvKiBTeW5jaHJvbml6ZSB0aGUgaW5mbyAndmFsaWQnIGZsYWdzIHdpdGggdGhlIGNvbG9yc3BhY2UgKi8NCi0NCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfY29sb3JzcGFjZV9zeW5jLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCi0gICAgcG5nX2luZm9ycCBpbmZvX3B0ciksIFBOR19FTVBUWSk7DQotICAgIC8qIENvcHkgdGhlIHBuZ19zdHJ1Y3QgY29sb3JzcGFjZSB0byB0aGUgaW5mb19zdHJ1Y3QgYW5kIGNhbGwgdGhlIGFib3ZlIHRvDQotICAgICAqIHN5bmNocm9uaXplIHRoZSBmbGFncy4gIENoZWNrcyBmb3IgTlVMTCBpbmZvX3B0ciBhbmQgZG9lcyBub3RoaW5nLg0KLSAgICAgKi8NCi0jZW5kaWYNCi0NCi0vKiBBZGRlZCBhdCBsaWJwbmcgdmVyc2lvbiAxLjQuMCAqLw0KLSNpZmRlZiBQTkdfQ09MT1JTUEFDRV9TVVBQT1JURUQNCi0vKiBUaGVzZSBpbnRlcm5hbCBmdW5jdGlvbnMgYXJlIGZvciBtYWludGFpbmluZyB0aGUgY29sb3JzcGFjZSBzdHJ1Y3R1cmUgd2l0aGluDQotICogYSBwbmdfaW5mbyBvciBwbmdfc3RydWN0IChvciwgaW5kZWVkLCBib3RoKS4NCi0gKi8NCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19jb2xvcnNwYWNlX3NldF9jaHJvbWF0aWNpdGllcywNCi0gICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwgY29uc3QgcG5nX3h5ICp4eSwNCi0gICAgaW50IHByZWZlcnJlZCksIFBOR19FTVBUWSk7DQotDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfY29sb3JzcGFjZV9zZXRfZW5kcG9pbnRzLA0KLSAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLCBjb25zdCBwbmdfWFlaICpYWVosDQotICAgIGludCBwcmVmZXJyZWQpLCBQTkdfRU1QVFkpOw0KLQ0KLSNpZmRlZiBQTkdfc1JHQl9TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19jb2xvcnNwYWNlX3NldF9zUkdCLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCi0gICBwbmdfY29sb3JzcGFjZXJwIGNvbG9yc3BhY2UsIGludCBpbnRlbnQpLCBQTkdfRU1QVFkpOw0KLSAgIC8qIFRoaXMgZG9lcyBzZXQgdGhlIGNvbG9yc3BhY2UgZ0FNQSBhbmQgY0hSTSB2YWx1ZXMgdG9vLCBidXQgZG9lc24ndCBzZXQgdGhlDQotICAgICogZmxhZ3MgdG8gd3JpdGUgdGhlbSwgaWYgaXQgcmV0dXJucyBmYWxzZSB0aGVyZSB3YXMgYSBwcm9ibGVtIGFuZCBhbiBlcnJvcg0KLSAgICAqIG1lc3NhZ2UgaGFzIGFscmVhZHkgYmVlbiBvdXRwdXQgKGJ1dCB0aGUgY29sb3JzcGFjZSBtYXkgc3RpbGwgbmVlZCB0byBiZQ0KLSAgICAqIHN5bmNlZCB0byByZWNvcmQgdGhlIGludmFsaWQgZmxhZykuDQotICAgICovDQotI2VuZGlmIC8qIHNSR0IgKi8NCi0NCi0jaWZkZWYgUE5HX2lDQ1BfU1VQUE9SVEVEDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfY29sb3JzcGFjZV9zZXRfSUNDLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCi0gICBwbmdfY29sb3JzcGFjZXJwIGNvbG9yc3BhY2UsIHBuZ19jb25zdF9jaGFycCBuYW1lLA0KLSAgIHBuZ191aW50XzMyIHByb2ZpbGVfbGVuZ3RoLCBwbmdfY29uc3RfYnl0ZXAgcHJvZmlsZSwgaW50IGNvbG9yX3R5cGUpLA0KLSAgIFBOR19FTVBUWSk7DQotICAgLyogVGhlICduYW1lJyBpcyB1c2VkIGZvciBpbmZvcm1hdGlvbiBvbmx5ICovDQotDQotLyogUm91dGluZXMgZm9yIGNoZWNraW5nIHBhcnRzIG9mIGFuIElDQyBwcm9maWxlLiAqLw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTihpbnQscG5nX2ljY19jaGVja19sZW5ndGgsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwgcG5nX2NvbnN0X2NoYXJwIG5hbWUsDQotICAgcG5nX3VpbnRfMzIgcHJvZmlsZV9sZW5ndGgpLCBQTkdfRU1QVFkpOw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTihpbnQscG5nX2ljY19jaGVja19oZWFkZXIsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwgcG5nX2NvbnN0X2NoYXJwIG5hbWUsDQotICAgcG5nX3VpbnRfMzIgcHJvZmlsZV9sZW5ndGgsDQotICAgcG5nX2NvbnN0X2J5dGVwIHByb2ZpbGUgLyogZmlyc3QgMTMyIGJ5dGVzIG9ubHkgKi8sIGludCBjb2xvcl90eXBlKSwNCi0gICBQTkdfRU1QVFkpOw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTihpbnQscG5nX2ljY19jaGVja190YWdfdGFibGUsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwgcG5nX2NvbnN0X2NoYXJwIG5hbWUsDQotICAgcG5nX3VpbnRfMzIgcHJvZmlsZV9sZW5ndGgsDQotICAgcG5nX2NvbnN0X2J5dGVwIHByb2ZpbGUgLyogaGVhZGVyIHBsdXMgd2hvbGUgdGFnIHRhYmxlICovKSwgUE5HX0VNUFRZKTsNCi0jaWZkZWYgUE5HX3NSR0JfU1VQUE9SVEVEDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2ljY19zZXRfc1JHQiwoDQotICAgcG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwNCi0gICBwbmdfY29uc3RfYnl0ZXAgcHJvZmlsZSwgdUxvbmcgYWRsZXIpLCBQTkdfRU1QVFkpOw0KLSAgIC8qICdhZGxlcicgaXMgdGhlIEFkbGVyMzIgY2hlY2tzdW0gb2YgdGhlIHVuY29tcHJlc3NlZCBwcm9maWxlIGRhdGEuIEl0IG1heQ0KLSAgICAqIGJlIHplcm8gdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBub3QgYXZhaWxhYmxlLiAgSXQgaXMgdXNlZCwgaWYgcHJvdmlkZWQsDQotICAgICogYXMgYSBmYXN0IGNoZWNrIG9uIHRoZSBwcm9maWxlIHdoZW4gY2hlY2tpbmcgdG8gc2VlIGlmIGl0IGlzIHNSR0IuDQotICAgICovDQotI2VuZGlmDQotI2VuZGlmIC8qIGlDQ1AgKi8NCi0NCi0jaWZkZWYgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2NvbG9yc3BhY2Vfc2V0X3JnYl9jb2VmZmljaWVudHMsDQotICAgKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSwgUE5HX0VNUFRZKTsNCi0gICAvKiBTZXQgdGhlIHJnYl90b19ncmF5IGNvZWZmaWNpZW50cyBmcm9tIHRoZSBjb2xvcnNwYWNlIFkgdmFsdWVzICovDQotI2VuZGlmIC8qIFJFQURfUkdCX1RPX0dSQVkgKi8NCi0jZW5kaWYgLyogQ09MT1JTUEFDRSAqLw0KLQ0KLS8qIEFkZGVkIGF0IGxpYnBuZyB2ZXJzaW9uIDEuNC4wICovDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2NoZWNrX0lIRFIsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgICBwbmdfdWludF8zMiB3aWR0aCwgcG5nX3VpbnRfMzIgaGVpZ2h0LCBpbnQgYml0X2RlcHRoLA0KLSAgICBpbnQgY29sb3JfdHlwZSwgaW50IGludGVybGFjZV90eXBlLCBpbnQgY29tcHJlc3Npb25fdHlwZSwNCi0gICAgaW50IGZpbHRlcl90eXBlKSxQTkdfRU1QVFkpOw0KLQ0KLS8qIEFkZGVkIGF0IGxpYnBuZyB2ZXJzaW9uIDEuNS4xMCAqLw0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0NIRUNLX0ZPUl9JTlZBTElEX0lOREVYX1NVUFBPUlRFRCkgfHwgXA0KLSAgICBkZWZpbmVkKFBOR19XUklURV9DSEVDS19GT1JfSU5WQUxJRF9JTkRFWF9TVVBQT1JURUQpDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX2NoZWNrX3BhbGV0dGVfaW5kZXhlcywNCi0gICAocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19yb3dfaW5mb3Agcm93X2luZm8pLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotI2lmIGRlZmluZWQoUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRCkgJiYgZGVmaW5lZChQTkdfRVJST1JfVEVYVF9TVVBQT1JURUQpDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2ZpeGVkX2Vycm9yLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCi0gICBwbmdfY29uc3RfY2hhcnAgbmFtZSksUE5HX05PUkVUVVJOKTsNCi0jZW5kaWYNCi0NCi0vKiBQdXRzICdzdHJpbmcnIGludG8gJ2J1ZmZlcicgYXQgYnVmZmVyW3Bvc10sIHRha2luZyBjYXJlIG5ldmVyIHRvIG92ZXJ3cml0ZQ0KLSAqIHRoZSBlbmQuICBBbHdheXMgbGVhdmVzIHRoZSBidWZmZXIgbnVsIHRlcm1pbmF0ZWQuICBOZXZlciBlcnJvcnMgb3V0IChhbmQNCi0gKiB0aGVyZSBpcyBubyBlcnJvciBjb2RlLikNCi0gKi8NCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04oc2l6ZV90LHBuZ19zYWZlY2F0LChwbmdfY2hhcnAgYnVmZmVyLCBzaXplX3QgYnVmc2l6ZSwNCi0gICBzaXplX3QgcG9zLCBwbmdfY29uc3RfY2hhcnAgc3RyaW5nKSxQTkdfRU1QVFkpOw0KLQ0KLS8qIFZhcmlvdXMgaW50ZXJuYWwgZnVuY3Rpb25zIHRvIGhhbmRsZSBmb3JtYXR0ZWQgd2FybmluZyBtZXNzYWdlcywgY3VycmVudGx5DQotICogb25seSBpbXBsZW1lbnRlZCBmb3Igd2FybmluZ3MuDQotICovDQotI2lmIGRlZmluZWQoUE5HX1dBUk5JTkdTX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRCkNCi0vKiBVdGlsaXR5IHRvIGR1bXAgYW4gdW5zaWduZWQgdmFsdWUgaW50byBhIGJ1ZmZlciwgZ2l2ZW4gYSBzdGFydCBwb2ludGVyIGFuZA0KLSAqIGFuZCBlbmQgcG9pbnRlciAod2hpY2ggc2hvdWxkIHBvaW50IGp1c3QgKmJleW9uZCogdGhlIGVuZCBvZiB0aGUgYnVmZmVyISkNCi0gKiBSZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgZm9ybWF0dGVkIHN0cmluZy4gIFRoaXMgdXRpbGl0eSBvbmx5DQotICogZG9lcyB1bnNpZ25lZCB2YWx1ZXMuDQotICovDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHBuZ19jaGFycCxwbmdfZm9ybWF0X251bWJlciwocG5nX2NvbnN0X2NoYXJwIHN0YXJ0LA0KLSAgIHBuZ19jaGFycCBlbmQsIGludCBmb3JtYXQsIHBuZ19hbGxvY19zaXplX3QgbnVtYmVyKSxQTkdfRU1QVFkpOw0KLQ0KLS8qIENvbnZlbmllbmNlIG1hY3JvIHRoYXQgdGFrZXMgYW4gYXJyYXk6ICovDQotI2RlZmluZSBQTkdfRk9STUFUX05VTUJFUihidWZmZXIsZm9ybWF0LG51bWJlcikgXA0KLSAgIHBuZ19mb3JtYXRfbnVtYmVyKGJ1ZmZlciwgYnVmZmVyICsgKHNpemVvZiBidWZmZXIpLCBmb3JtYXQsIG51bWJlcikNCi0NCi0vKiBTdWdnZXN0ZWQgc2l6ZSBmb3IgYSBudW1iZXIgYnVmZmVyIChlbm91Z2ggZm9yIDY0IGJpdHMgYW5kIGEgc2lnbiEpICovDQotI2RlZmluZSBQTkdfTlVNQkVSX0JVRkZFUl9TSVpFIDI0DQotDQotLyogVGhlc2UgYXJlIHRoZSBpbnRlZ2VyIGZvcm1hdHMgY3VycmVudGx5IHN1cHBvcnRlZCwgdGhlIG5hbWUgaXMgZm9ybWVkIGZyb20NCi0gKiB0aGUgc3RhbmRhcmQgcHJpbnRmKDMpIGZvcm1hdCBzdHJpbmcuDQotICovDQotI2RlZmluZSBQTkdfTlVNQkVSX0ZPUk1BVF91ICAgICAxIC8qIGNob3NlIHVuc2lnbmVkIEFQSSEgKi8NCi0jZGVmaW5lIFBOR19OVU1CRVJfRk9STUFUXzAydSAgIDINCi0jZGVmaW5lIFBOR19OVU1CRVJfRk9STUFUX2QgICAgIDEgLyogY2hvc2Ugc2lnbmVkIEFQSSEgKi8NCi0jZGVmaW5lIFBOR19OVU1CRVJfRk9STUFUXzAyZCAgIDINCi0jZGVmaW5lIFBOR19OVU1CRVJfRk9STUFUX3ggICAgIDMNCi0jZGVmaW5lIFBOR19OVU1CRVJfRk9STUFUXzAyeCAgIDQNCi0jZGVmaW5lIFBOR19OVU1CRVJfRk9STUFUX2ZpeGVkIDUgLyogY2hvb3NlIHRoZSBzaWduZWQgQVBJICovDQotI2VuZGlmDQotDQotI2lmZGVmIFBOR19XQVJOSU5HU19TVVBQT1JURUQNCi0vKiBOZXcgZGVmaW5lcyBhbmQgbWVtYmVycyBhZGRpbmcgaW4gbGlicG5nLTEuNS40ICovDQotIyAgZGVmaW5lIFBOR19XQVJOSU5HX1BBUkFNRVRFUl9TSVpFIDMyDQotIyAgZGVmaW5lIFBOR19XQVJOSU5HX1BBUkFNRVRFUl9DT1VOVCA4IC8qIE1heGltdW0gOTsgc2VlIHBuZ2Vycm9yLmMgKi8NCi0NCi0vKiBBbiBsLXZhbHVlIG9mIHRoaXMgdHlwZSBoYXMgdG8gYmUgcGFzc2VkIHRvIHRoZSBBUElzIGJlbG93IHRvIGNhY2hlIHRoZQ0KLSAqIHZhbHVlcyBvZiB0aGUgcGFyYW1ldGVycyB0byBhIGZvcm1hdHRlZCB3YXJuaW5nIG1lc3NhZ2UuDQotICovDQotdHlwZWRlZiBjaGFyIHBuZ193YXJuaW5nX3BhcmFtZXRlcnNbUE5HX1dBUk5JTkdfUEFSQU1FVEVSX0NPVU5UXVsNCi0gICBQTkdfV0FSTklOR19QQVJBTUVURVJfU0laRV07DQotDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dhcm5pbmdfcGFyYW1ldGVyLChwbmdfd2FybmluZ19wYXJhbWV0ZXJzIHAsDQotICAgaW50IG51bWJlciwgcG5nX2NvbnN0X2NoYXJwIHN0cmluZyksUE5HX0VNUFRZKTsNCi0gICAvKiBQYXJhbWV0ZXJzIGFyZSBsaW1pdGVkIGluIHNpemUgdG8gUE5HX1dBUk5JTkdfUEFSQU1FVEVSX1NJWkUgY2hhcmFjdGVycywNCi0gICAgKiBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nICdcMCcuDQotICAgICovDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dhcm5pbmdfcGFyYW1ldGVyX3Vuc2lnbmVkLA0KLSAgIChwbmdfd2FybmluZ19wYXJhbWV0ZXJzIHAsIGludCBudW1iZXIsIGludCBmb3JtYXQsIHBuZ19hbGxvY19zaXplX3QgdmFsdWUpLA0KLSAgIFBOR19FTVBUWSk7DQotICAgLyogVXNlIHBuZ19hbGxvY19zaXplX3QgYmVjYXVzZSBpdCBpcyBhbiB1bnNpZ25lZCB0eXBlIGFzIGJpZyBhcyBhbnkgd2UNCi0gICAgKiBuZWVkIHRvIG91dHB1dC4gIFVzZSB0aGUgZm9sbG93aW5nIGZvciBhIHNpZ25lZCB2YWx1ZS4NCi0gICAgKi8NCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd2FybmluZ19wYXJhbWV0ZXJfc2lnbmVkLA0KLSAgIChwbmdfd2FybmluZ19wYXJhbWV0ZXJzIHAsIGludCBudW1iZXIsIGludCBmb3JtYXQsIHBuZ19pbnRfMzIgdmFsdWUpLA0KLSAgIFBOR19FTVBUWSk7DQotDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2Zvcm1hdHRlZF93YXJuaW5nLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCi0gICBwbmdfd2FybmluZ19wYXJhbWV0ZXJzIHAsIHBuZ19jb25zdF9jaGFycCBtZXNzYWdlKSxQTkdfRU1QVFkpOw0KLSAgIC8qICdtZXNzYWdlJyBmb2xsb3dzIHRoZSBYL09wZW4gYXBwcm9hY2ggb2YgdXNpbmcgQDEsIEAyIHRvIGluc2VydA0KLSAgICAqIHBhcmFtZXRlcnMgcHJldmlvdXNseSBzdXBwbGllZCB1c2luZyB0aGUgYWJvdmUgZnVuY3Rpb25zLiAgRXJyb3JzIGluDQotICAgICogc3BlY2lmeWluZyB0aGUgcGFyYW1ldGVycyB3aWxsIHNpbXBseSByZXN1bHQgaW4gZ2FyYmFnZSBzdWJzdGl0dXRpb25zLg0KLSAgICAqLw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBQTkdfQkVOSUdOX0VSUk9SU19TVVBQT1JURUQNCi0vKiBBcHBsaWNhdGlvbiBlcnJvcnMgKG5ldyBpbiAxLjYpOyB1c2UgdGhlc2UgZnVuY3Rpb25zIChkZWNsYXJlZCBiZWxvdykgZm9yDQotICogZXJyb3JzIGluIHRoZSBwYXJhbWV0ZXJzIG9yIG9yZGVyIG9mIEFQSSBmdW5jdGlvbiBjYWxscyBvbiByZWFkLiAgVGhlDQotICogJ3dhcm5pbmcnIHNob3VsZCBiZSB1c2VkIGZvciBhbiBlcnJvciB0aGF0IGNhbiBiZSBoYW5kbGVkIGNvbXBsZXRlbHk7IHRoZQ0KLSAqICdlcnJvcicgZm9yIG9uZSB3aGljaCBjYW4gYmUgaGFuZGxlZCBzYWZlbHkgYnV0IHdoaWNoIG1heSBsb3NlIGFwcGxpY2F0aW9uDQotICogaW5mb3JtYXRpb24gb3Igc2V0dGluZ3MuDQotICoNCi0gKiBCeSBkZWZhdWx0IHRoZXNlIGJvdGggcmVzdWx0IGluIGEgcG5nX2Vycm9yIGNhbGwgcHJpb3IgdG8gcmVsZWFzZSwgd2hpbGUgaW4gYQ0KLSAqIHJlbGVhc2VkIHZlcnNpb24gdGhlICd3YXJuaW5nJyBpcyBqdXN0IGEgd2FybmluZy4gIEhvd2V2ZXIgaWYgdGhlIGFwcGxpY2F0aW9uDQotICogZXhwbGljaXRseSBkaXNhYmxlcyBiZW5pZ24gZXJyb3JzIChleHBsaWNpdGx5IHBlcm1pdHRpbmcgdGhlIGNvZGUgdG8gbG9zZQ0KLSAqIGluZm9ybWF0aW9uKSB0aGV5IGJvdGggdHVybiBpbnRvIHdhcm5pbmdzLg0KLSAqDQotICogSWYgYmVuaWduIGVycm9ycyBhcmVuJ3Qgc3VwcG9ydGVkIHRoZXkgZW5kIHVwIGFzIHRoZSBjb3JyZXNwb25kaW5nIGJhc2UgY2FsbA0KLSAqIChwbmdfd2FybmluZyBvciBwbmdfZXJyb3IuKQ0KLSAqLw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19hcHBfd2FybmluZywocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQotICAgcG5nX2NvbnN0X2NoYXJwIG1lc3NhZ2UpLFBOR19FTVBUWSk7DQotICAgLyogVGhlIGFwcGxpY2F0aW9uIHByb3ZpZGVkIGludmFsaWQgcGFyYW1ldGVycyB0byBhbiBBUEkgZnVuY3Rpb24gb3IgY2FsbGVkDQotICAgICogYW4gQVBJIGZ1bmN0aW9uIGF0IHRoZSB3cm9uZyB0aW1lLCBsaWJwbmcgY2FuIGNvbXBsZXRlbHkgcmVjb3Zlci4NCi0gICAgKi8NCi0NCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfYXBwX2Vycm9yLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCi0gICBwbmdfY29uc3RfY2hhcnAgbWVzc2FnZSksUE5HX0VNUFRZKTsNCi0gICAvKiBBcyBhYm92ZSBidXQgbGlicG5nIHdpbGwgaWdub3JlIHRoZSBjYWxsLCBvciBhdHRlbXB0IHNvbWUgb3RoZXIgcGFydGlhbA0KLSAgICAqIHJlY292ZXJ5IGZyb20gdGhlIGVycm9yLg0KLSAgICAqLw0KLSNlbHNlDQotIyAgZGVmaW5lIHBuZ19hcHBfd2FybmluZyhwcCxzKSBwbmdfd2FybmluZyhwcCxzKQ0KLSMgIGRlZmluZSBwbmdfYXBwX2Vycm9yKHBwLHMpIHBuZ19lcnJvcihwcCxzKQ0KLSNlbmRpZg0KLQ0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19jaHVua19yZXBvcnQsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgIHBuZ19jb25zdF9jaGFycCBtZXNzYWdlLCBpbnQgZXJyb3IpLFBOR19FTVBUWSk7DQotICAgLyogUmVwb3J0IGEgcmVjb3ZlcmFibGUgaXNzdWUgaW4gY2h1bmsgZGF0YS4gIE9uIHJlYWQgdGhpcyBpcyB1c2VkIHRvIHJlcG9ydA0KLSAgICAqIGEgcHJvYmxlbSBmb3VuZCB3aGlsZSByZWFkaW5nIGEgcGFydGljdWxhciBjaHVuayBhbmQgdGhlDQotICAgICogcG5nX2NodW5rX2Jlbmlnbl9lcnJvciBvciBwbmdfY2h1bmtfd2FybmluZyBmdW5jdGlvbiBpcyB1c2VkIGFzDQotICAgICogYXBwcm9wcmlhdGUuICBPbiB3cml0ZSB0aGlzIGlzIHVzZWQgdG8gcmVwb3J0IGFuIGVycm9yIHRoYXQgY29tZXMgZnJvbQ0KLSAgICAqIGRhdGEgc2V0IHZpYSBhbiBhcHBsaWNhdGlvbiBjYWxsIHRvIGEgcG5nX3NldF8gQVBJIGFuZCBwbmdfYXBwX2Vycm9yIG9yDQotICAgICogcG5nX2FwcF93YXJuaW5nIGlzIHVzZWQgYXMgYXBwcm9wcmlhdGUuDQotICAgICoNCi0gICAgKiBUaGUgJ2Vycm9yJyBwYXJhbWV0ZXIgbXVzdCBoYXZlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCi0gICAgKi8NCi0jZGVmaW5lIFBOR19DSFVOS19XQVJOSU5HICAgICAwIC8qIG5ldmVyIGFuIGVycm9yICovDQotI2RlZmluZSBQTkdfQ0hVTktfV1JJVEVfRVJST1IgMSAvKiBhbiBlcnJvciBvbmx5IG9uIHdyaXRlICovDQotI2RlZmluZSBQTkdfQ0hVTktfRVJST1IgICAgICAgMiAvKiBhbHdheXMgYW4gZXJyb3IgKi8NCi0NCi0vKiBBU0NJSSB0byBGUCBpbnRlcmZhY2VzLCBjdXJyZW50bHkgb25seSBpbXBsZW1lbnRlZCBpZiBzQ0FMDQotICogc3VwcG9ydCBpcyByZXF1aXJlZC4NCi0gKi8NCi0jaWYgZGVmaW5lZChQTkdfc0NBTF9TVVBQT1JURUQpDQotLyogTUFYX0RJR0lUUyBpcyBhY3R1YWxseSB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhbiBzQ0FMDQotICogd2lkdGggb3IgaGVpZ2h0LCBkZXJpdmVkIGZyb20gdGhlIHByZWNpc2lvbiAobnVtYmVyIG9mIHNpZ25pZmljYW50DQotICogZGlnaXRzIC0gYSBidWlsZCB0aW1lIHNldHRhYmxlIG9wdGlvbikgYW5kIGFzc3VtcHRpb25zIGFib3V0IHRoZQ0KLSAqIG1heGltdW0gcmlkaWN1bG91cyBleHBvbmVudC4NCi0gKi8NCi0jZGVmaW5lIFBOR19zQ0FMX01BWF9ESUdJVFMgKFBOR19zQ0FMX1BSRUNJU0lPTisxLyouKi8rMS8qRSovKzEwLypleHBvbmVudCovKQ0KLQ0KLSNpZmRlZiBQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2FzY2lpX2Zyb21fZnAsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgIHBuZ19jaGFycCBhc2NpaSwgcG5nX3NpemVfdCBzaXplLCBkb3VibGUgZnAsIHVuc2lnbmVkIGludCBwcmVjaXNpb24pLA0KLSAgIFBOR19FTVBUWSk7DQotI2VuZGlmIC8qIEZMT0FUSU5HX1BPSU5UICovDQotDQotI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfYXNjaWlfZnJvbV9maXhlZCwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQotICAgcG5nX2NoYXJwIGFzY2lpLCBwbmdfc2l6ZV90IHNpemUsIHBuZ19maXhlZF9wb2ludCBmcCksUE5HX0VNUFRZKTsNCi0jZW5kaWYgLyogRklYRURfUE9JTlQgKi8NCi0jZW5kaWYgLyogc0NBTCAqLw0KLQ0KLSNpZiBkZWZpbmVkKFBOR19zQ0FMX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfcENBTF9TVVBQT1JURUQpDQotLyogQW4gaW50ZXJuYWwgQVBJIHRvIHZhbGlkYXRlIHRoZSBmb3JtYXQgb2YgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuDQotICogVGhlIHJlc3VsdCBpcyB0aGUgaW5kZXggb2YgdGhlIG5leHQgY2hhcmFjdGVyLiAgSWYgdGhlIG51bWJlciBpcw0KLSAqIG5vdCB2YWxpZCBpdCB3aWxsIGJlIHRoZSBpbmRleCBvZiBhIGNoYXJhY3RlciBpbiB0aGUgc3VwcG9zZWQgbnVtYmVyLg0KLSAqDQotICogVGhlIGZvcm1hdCBvZiBhIG51bWJlciBpcyBkZWZpbmVkIGluIHRoZSBQTkcgZXh0ZW5zaW9ucyBzcGVjaWZpY2F0aW9uDQotICogYW5kIHRoaXMgQVBJIGlzIHN0cmljdGx5IGNvbmZvcm1hbnQgdG8gdGhhdCBzcGVjLCBub3QgYW55b25lIGVsc2VzIQ0KLSAqDQotICogVGhlIGZvcm1hdCBhcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBpczoNCi0gKg0KLSAqIFsrLV0/WzAtOV0rLj8oW0VlXVsrLV0/WzAtOV0rKT8NCi0gKg0KLSAqIG9yOg0KLSAqDQotICogWystXT8uWzAtOV0rKC5bMC05XSspPyhbRWVdWystXT9bMC05XSspPw0KLSAqDQotICogVGhlIGNvbXBsZXhpdHkgaXMgdGhhdCBlaXRoZXIgaW50ZWdlciBvciBmcmFjdGlvbiBtdXN0IGJlIHByZXNlbnQgYW5kIHRoZQ0KLSAqIGZyYWN0aW9uIGlzIHBlcm1pdHRlZCB0byBoYXZlIG5vIGRpZ2l0cyBvbmx5IGlmIHRoZSBpbnRlZ2VyIGlzIHByZXNlbnQuDQotICoNCi0gKiBOT1RFOiBUaGUgZGFuZ2xpbmcgRSBwcm9ibGVtLg0KLSAqICAgVGhlcmUgaXMgYSBQTkcgdmFsaWQgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGluIHRoZSBmb2xsb3dpbmc6DQotICoNCi0gKiAgICAgICBQTkcgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBhcmUgbm90IGdyZWVkeS4NCi0gKg0KLSAqICAgV29ya2luZyB0aGlzIG91dCByZXF1aXJlcyAqVFdPKiBjaGFyYWN0ZXIgbG9va2FoZWFkIChiZWNhdXNlIG9mIHRoZQ0KLSAqICAgc2lnbiksIHRoZSBwYXJzZXIgZG9lcyBub3QgZG8gdGhpcyAtIGl0IHdpbGwgZmFpbCBhdCB0aGUgJ3InIC0gdGhpcw0KLSAqICAgZG9lc24ndCBtYXR0ZXIgZm9yIFBORyBzQ0FMIGNodW5rIHZhbHVlcywgYnV0IGl0IHJlcXVpcmVzIG1vcmUgY2FyZQ0KLSAqICAgaWYgdGhlIHZhbHVlIHdlcmUgZXZlciB0byBiZSBlbWJlZGRlZCBpbiBzb21ldGhpbmcgbW9yZSBjb21wbGV4LiAgVXNlDQotICogICBBTlNJLUMgc3RydG9kIGlmIHlvdSBuZWVkIHRoZSBsb29rYWhlYWQuDQotICovDQotLyogU3RhdGUgdGFibGUgZm9yIHRoZSBwYXJzZXIuICovDQotI2RlZmluZSBQTkdfRlBfSU5URUdFUiAgICAwICAvKiBiZWZvcmUgb3IgaW4gaW50ZWdlciAqLw0KLSNkZWZpbmUgUE5HX0ZQX0ZSQUNUSU9OICAgMSAgLyogYmVmb3JlIG9yIGluIGZyYWN0aW9uICovDQotI2RlZmluZSBQTkdfRlBfRVhQT05FTlQgICAyICAvKiBiZWZvcmUgb3IgaW4gZXhwb25lbnQgKi8NCi0jZGVmaW5lIFBOR19GUF9TVEFURSAgICAgIDMgIC8qIG1hc2sgZm9yIHRoZSBhYm92ZSAqLw0KLSNkZWZpbmUgUE5HX0ZQX1NBV19TSUdOICAgNCAgLyogU2F3ICsvLSBpbiBjdXJyZW50IHN0YXRlICovDQotI2RlZmluZSBQTkdfRlBfU0FXX0RJR0lUICA4ICAvKiBTYXcgYSBkaWdpdCBpbiBjdXJyZW50IHN0YXRlICovDQotI2RlZmluZSBQTkdfRlBfU0FXX0RPVCAgIDE2ICAvKiBTYXcgYSBkb3QgaW4gY3VycmVudCBzdGF0ZSAqLw0KLSNkZWZpbmUgUE5HX0ZQX1NBV19FICAgICAzMiAgLyogU2F3IGFuIEUgKG9yIGUpIGluIGN1cnJlbnQgc3RhdGUgKi8NCi0jZGVmaW5lIFBOR19GUF9TQVdfQU5ZICAgNjAgIC8qIFNhdyBhbnkgb2YgdGhlIGFib3ZlIDQgKi8NCi0NCi0vKiBUaGVzZSB0aHJlZSB2YWx1ZXMgZG9uJ3QgYWZmZWN0IHRoZSBwYXJzZXIuICBUaGV5IGFyZSBzZXQgYnV0IG5vdCB1c2VkLg0KLSAqLw0KLSNkZWZpbmUgUE5HX0ZQX1dBU19WQUxJRCA2NCAgLyogUHJlY2VkaW5nIHN1YnN0cmluZyBpcyBhIHZhbGlkIGZwIG51bWJlciAqLw0KLSNkZWZpbmUgUE5HX0ZQX05FR0FUSVZFIDEyOCAgLyogQSBuZWdhdGl2ZSBudW1iZXIsIGluY2x1ZGluZyAiLTAiICovDQotI2RlZmluZSBQTkdfRlBfTk9OWkVSTyAgMjU2ICAvKiBBIG5vbi16ZXJvIHZhbHVlICovDQotI2RlZmluZSBQTkdfRlBfU1RJQ0tZICAgNDQ4ICAvKiBUaGUgYWJvdmUgdGhyZWUgZmxhZ3MgKi8NCi0NCi0vKiBUaGlzIGlzIGF2YWlsYWJsZSBmb3IgdGhlIGNhbGxlciB0byBzdG9yZSBpbiAnc3RhdGUnIGlmIHJlcXVpcmVkLiAgRG8gbm90DQotICogY2FsbCB0aGUgcGFyc2VyIGFmdGVyIHNldHRpbmcgaXQgKHRoZSBwYXJzZXIgc29tZXRpbWVzIGNsZWFycyBpdC4pDQotICovDQotI2RlZmluZSBQTkdfRlBfSU5WQUxJRCAgNTEyICAvKiBBdmFpbGFibGUgZm9yIGNhbGxlcnMgYXMgYSBkaXN0aW5jdCB2YWx1ZSAqLw0KLQ0KLS8qIFJlc3VsdCBjb2RlcyBmb3IgdGhlIHBhcnNlciAoYm9vbGVhbiAtIHRydWUgbWVhbnRzIG9rLCBmYWxzZSBtZWFucw0KLSAqIG5vdCBvayB5ZXQuKQ0KLSAqLw0KLSNkZWZpbmUgUE5HX0ZQX01BWUJFICAgICAgMCAgLyogVGhlIG51bWJlciBtYXkgYmUgdmFsaWQgaW4gdGhlIGZ1dHVyZSAqLw0KLSNkZWZpbmUgUE5HX0ZQX09LICAgICAgICAgMSAgLyogVGhlIG51bWJlciBpcyB2YWxpZCAqLw0KLQ0KLS8qIFRlc3RzIG9uIHRoZSBzdGlja3kgbm9uLXplcm8gYW5kIG5lZ2F0aXZlIGZsYWdzLiAgVG8gcGFzcyB0aGVzZSBjaGVja3MNCi0gKiB0aGUgc3RhdGUgbXVzdCBhbHNvIGluZGljYXRlIHRoYXQgdGhlIHdob2xlIG51bWJlciBpcyB2YWxpZCAtIHRoaXMgaXMNCi0gKiBhY2hpZXZlZCBieSB0ZXN0aW5nIFBOR19GUF9TQVdfRElHSVQgKHNlZSB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHdoeSB0aGlzDQotICogaXMgZXF1aXZhbGVudCB0byBQTkdfRlBfT0sgYWJvdmUuKQ0KLSAqLw0KLSNkZWZpbmUgUE5HX0ZQX05aX01BU0sgKFBOR19GUF9TQVdfRElHSVQgfCBQTkdfRlBfTkVHQVRJVkUgfCBQTkdfRlBfTk9OWkVSTykNCi0gICAvKiBOWl9NQVNLOiB0aGUgc3RyaW5nIGlzIHZhbGlkIGFuZCBhIG5vbi16ZXJvIG5lZ2F0aXZlIHZhbHVlICovDQotI2RlZmluZSBQTkdfRlBfWl9NQVNLIChQTkdfRlBfU0FXX0RJR0lUIHwgUE5HX0ZQX05PTlpFUk8pDQotICAgLyogWiBNQVNLOiB0aGUgc3RyaW5nIGlzIHZhbGlkIGFuZCBhIG5vbi16ZXJvIHZhbHVlLiAqLw0KLSAgIC8qIFBOR19GUF9TQVdfRElHSVQ6IHRoZSBzdHJpbmcgaXMgdmFsaWQuICovDQotI2RlZmluZSBQTkdfRlBfSVNfWkVSTyhzdGF0ZSkgKCgoc3RhdGUpICYgUE5HX0ZQX1pfTUFTSykgPT0gUE5HX0ZQX1NBV19ESUdJVCkNCi0jZGVmaW5lIFBOR19GUF9JU19QT1NJVElWRShzdGF0ZSkgKCgoc3RhdGUpICYgUE5HX0ZQX05aX01BU0spID09IFBOR19GUF9aX01BU0spDQotI2RlZmluZSBQTkdfRlBfSVNfTkVHQVRJVkUoc3RhdGUpICgoKHN0YXRlKSAmIFBOR19GUF9OWl9NQVNLKSA9PSBQTkdfRlBfTlpfTUFTSykNCi0NCi0vKiBUaGUgYWN0dWFsIHBhcnNlci4gIFRoaXMgY2FuIGJlIGNhbGxlZCByZXBlYXRlZGx5LiBJdCB1cGRhdGVzDQotICogdGhlIGluZGV4IGludG8gdGhlIHN0cmluZyBhbmQgdGhlIHN0YXRlIHZhcmlhYmxlICh3aGljaCBtdXN0DQotICogYmUgaW5pdGlhbGl6ZWQgdG8gMCkuICBJdCByZXR1cm5zIGEgcmVzdWx0IGNvZGUsIGFzIGFib3ZlLiAgVGhlcmUNCi0gKiBpcyBubyBwb2ludCBjYWxsaW5nIHRoZSBwYXJzZXIgYW55IG1vcmUgaWYgaXQgZmFpbHMgdG8gYWR2YW5jZSB0bw0KLSAqIHRoZSBlbmQgb2YgdGhlIHN0cmluZyAtIGl0IGlzIHN0dWNrIG9uIGFuIGludmFsaWQgY2hhcmFjdGVyIChvcg0KLSAqIHRlcm1pbmF0ZWQgYnkgJ1wwJykuDQotICoNCi0gKiBOb3RlIHRoYXQgdGhlIHBvaW50ZXIgd2lsbCBjb25zdW1lIGFuIEUgb3IgZXZlbiBhbiBFKyBhbmQgdGhlbiBsZWF2ZQ0KLSAqIGEgJ21heWJlJyBzdGF0ZSBldmVuIHRob3VnaCBhIHByZWNlZGluZyBpbnRlZ2VyLmZyYWN0aW9uIGlzIHZhbGlkLg0KLSAqIFRoZSBQTkdfRlBfV0FTX1ZBTElEIGZsYWcgaW5kaWNhdGVzIHRoYXQgYSBwcmVjZWRpbmcgc3Vic3RyaW5nIHdhcw0KLSAqIGEgdmFsaWQgbnVtYmVyLiAgSXQncyBwb3NzaWJsZSB0byByZWNvdmVyIGZyb20gdGhpcyBieSBjYWxsaW5nDQotICogdGhlIHBhcnNlciBhZ2FpbiAoZnJvbSB0aGUgc3RhcnQsIHdpdGggc3RhdGUgMCkgYnV0IHdpdGggYSBzdHJpbmcNCi0gKiB0aGF0IG9taXRzIHRoZSBsYXN0IGNoYXJhY3RlciAoaS5lLiBzZXQgdGhlIHNpemUgdG8gdGhlIGluZGV4IG9mDQotICogdGhlIHByb2JsZW0gY2hhcmFjdGVyLikgIFRoaXMgaGFzIG5vdCBiZWVuIHRlc3RlZCB3aXRoaW4gbGlicG5nLg0KLSAqLw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTihpbnQscG5nX2NoZWNrX2ZwX251bWJlciwocG5nX2NvbnN0X2NoYXJwIHN0cmluZywNCi0gICBwbmdfc2l6ZV90IHNpemUsIGludCAqc3RhdGVwLCBwbmdfc2l6ZV90cCB3aGVyZWFtaSksUE5HX0VNUFRZKTsNCi0NCi0vKiBUaGlzIGlzIHRoZSBzYW1lIGJ1dCBpdCBjaGVja3MgYSBjb21wbGV0ZSBzdHJpbmcgYW5kIHJldHVybnMgdHJ1ZQ0KLSAqIG9ubHkgaWYgaXQganVzdCBjb250YWlucyBhIGZsb2F0aW5nIHBvaW50IG51bWJlci4gIEFzIG9mIDEuNS40IHRoaXMNCi0gKiBmdW5jdGlvbiBhbHNvIHJldHVybnMgdGhlIHN0YXRlIGF0IHRoZSBlbmQgb2YgcGFyc2luZyB0aGUgbnVtYmVyIGlmDQotICogaXQgd2FzIHZhbGlkIChvdGhlcndpc2UgaXQgcmV0dXJucyAwLikgIFRoaXMgY2FuIGJlIHVzZWQgZm9yIHRlc3RpbmcNCi0gKiBmb3IgbmVnYXRpdmUgb3IgemVybyB2YWx1ZXMgdXNpbmcgdGhlIHN0aWNreSBmbGFnLg0KLSAqLw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTihpbnQscG5nX2NoZWNrX2ZwX3N0cmluZywocG5nX2NvbnN0X2NoYXJwIHN0cmluZywNCi0gICBwbmdfc2l6ZV90IHNpemUpLFBOR19FTVBUWSk7DQotI2VuZGlmIC8qIHBDQUwgfHwgc0NBTCAqLw0KLQ0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkgfHxcDQotICAgIGRlZmluZWQoUE5HX0lOQ0hfQ09OVkVSU0lPTlNfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19SRUFEX3BIWXNfU1VQUE9SVEVEKQ0KLS8qIEFkZGVkIGF0IGxpYnBuZyB2ZXJzaW9uIDEuNS4wICovDQotLyogVGhpcyBpcyBhIHV0aWxpdHkgdG8gcHJvdmlkZSBhKnRpbWVzL2RpdiAocm91bmRlZCkgYW5kIGluZGljYXRlDQotICogaWYgdGhlcmUgaXMgYW4gb3ZlcmZsb3cuICBUaGUgcmVzdWx0IGlzIGEgYm9vbGVhbiAtIGZhbHNlICgwKQ0KLSAqIGZvciBvdmVyZmxvdywgdHJ1ZSAoMSkgaWYgbm8gb3ZlcmZsb3csIGluIHdoaWNoIGNhc2UgKnJlcw0KLSAqIGhvbGRzIHRoZSByZXN1bHQuDQotICovDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfbXVsZGl2LChwbmdfZml4ZWRfcG9pbnRfcCByZXMsIHBuZ19maXhlZF9wb2ludCBhLA0KLSAgIHBuZ19pbnRfMzIgbXVsdGlwbGllZF9ieSwgcG5nX2ludF8zMiBkaXZpZGVkX2J5KSxQTkdfRU1QVFkpOw0KLSNlbmRpZg0KLQ0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfSU5DSF9DT05WRVJTSU9OU19TVVBQT1JURUQpDQotLyogU2FtZSBkZWFsLCBidXQgaXNzdWUgYSB3YXJuaW5nIG9uIG92ZXJmbG93IGFuZCByZXR1cm4gMC4gKi8NCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04ocG5nX2ZpeGVkX3BvaW50LHBuZ19tdWxkaXZfd2FybiwNCi0gICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19maXhlZF9wb2ludCBhLCBwbmdfaW50XzMyIG11bHRpcGxpZWRfYnksDQotICAgcG5nX2ludF8zMiBkaXZpZGVkX2J5KSxQTkdfRU1QVFkpOw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBQTkdfR0FNTUFfU1VQUE9SVEVEDQotLyogQ2FsY3VsYXRlIGEgcmVjaXByb2NhbCAtIHVzZWQgZm9yIGdhbW1hIHZhbHVlcy4gIFRoaXMgcmV0dXJucw0KLSAqIDAgaWYgdGhlIGFyZ3VtZW50IGlzIDAgaW4gb3JkZXIgdG8gbWFpbnRhaW4gYW4gdW5kZWZpbmVkIHZhbHVlOw0KLSAqIHRoZXJlIGFyZSBubyB3YXJuaW5ncy4NCi0gKi8NCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04ocG5nX2ZpeGVkX3BvaW50LHBuZ19yZWNpcHJvY2FsLChwbmdfZml4ZWRfcG9pbnQgYSksDQotICAgUE5HX0VNUFRZKTsNCi0NCi0jaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEDQotLyogVGhlIHNhbWUgYnV0IGdpdmVzIGEgcmVjaXByb2NhbCBvZiB0aGUgcHJvZHVjdCBvZiB0d28gZml4ZWQgcG9pbnQNCi0gKiB2YWx1ZXMuICBBY2N1cmFjeSBpcyBzdWl0YWJsZSBmb3IgZ2FtbWEgY2FsY3VsYXRpb25zIGJ1dCB0aGlzIGlzDQotICogbm90IGV4YWN0IC0gdXNlIHBuZ19tdWxkaXYgZm9yIHRoYXQuICBPbmx5IHJlcXVpcmVkIGF0IHByZXNlbnQgb24gcmVhZC4NCi0gKi8NCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04ocG5nX2ZpeGVkX3BvaW50LHBuZ19yZWNpcHJvY2FsMiwocG5nX2ZpeGVkX3BvaW50IGEsDQotICAgcG5nX2ZpeGVkX3BvaW50IGIpLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotLyogUmV0dXJuIHRydWUgaWYgdGhlIGdhbW1hIHZhbHVlIGlzIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IGZyb20gMS4wICovDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfZ2FtbWFfc2lnbmlmaWNhbnQsKHBuZ19maXhlZF9wb2ludCBnYW1tYV92YWx1ZSksDQotICAgUE5HX0VNUFRZKTsNCi0jZW5kaWYNCi0NCi0jaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEDQotLyogSW50ZXJuYWwgZml4ZWQgcG9pbnQgZ2FtbWEgY29ycmVjdGlvbi4gIFRoZXNlIEFQSXMgYXJlIGNhbGxlZCBhcw0KLSAqIHJlcXVpcmVkIHRvIGNvbnZlcnQgc2luZ2xlIHZhbHVlcyAtIHRoZXkgZG9uJ3QgbmVlZCB0byBiZSBmYXN0LA0KLSAqIHRoZXkgYXJlIG5vdCB1c2VkIHdoZW4gcHJvY2Vzc2luZyBpbWFnZSBwaXhlbCB2YWx1ZXMuDQotICoNCi0gKiBXaGlsZSB0aGUgaW5wdXQgaXMgYW4gJ3Vuc2lnbmVkJyB2YWx1ZSBpdCBtdXN0IGFjdHVhbGx5IGJlIHRoZQ0KLSAqIGNvcnJlY3QgYml0IHZhbHVlIC0gMC4uMjU1IG9yIDAuLjY1NTM1IGFzIHJlcXVpcmVkLg0KLSAqLw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTihwbmdfdWludF8xNixwbmdfZ2FtbWFfY29ycmVjdCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQotICAgdW5zaWduZWQgaW50IHZhbHVlLCBwbmdfZml4ZWRfcG9pbnQgZ2FtbWFfdmFsdWUpLFBOR19FTVBUWSk7DQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHBuZ191aW50XzE2LHBuZ19nYW1tYV8xNmJpdF9jb3JyZWN0LCh1bnNpZ25lZCBpbnQgdmFsdWUsDQotICAgcG5nX2ZpeGVkX3BvaW50IGdhbW1hX3ZhbHVlKSxQTkdfRU1QVFkpOw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTihwbmdfYnl0ZSxwbmdfZ2FtbWFfOGJpdF9jb3JyZWN0LCh1bnNpZ25lZCBpbnQgdmFsdWUsDQotICAgcG5nX2ZpeGVkX3BvaW50IGdhbW1hX3ZhbHVlKSxQTkdfRU1QVFkpOw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kZXN0cm95X2dhbW1hX3RhYmxlLChwbmdfc3RydWN0cnAgcG5nX3B0ciksDQotICAgUE5HX0VNUFRZKTsNCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfYnVpbGRfZ2FtbWFfdGFibGUsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KLSAgIGludCBiaXRfZGVwdGgpLFBOR19FTVBUWSk7DQotI2VuZGlmDQotDQotLyogU0lNUExJRklFRCBSRUFEL1dSSVRFIFNVUFBPUlQgKi8NCi0jaWYgZGVmaW5lZChQTkdfU0lNUExJRklFRF9SRUFEX1NVUFBPUlRFRCkgfHxcDQotICAgZGVmaW5lZChQTkdfU0lNUExJRklFRF9XUklURV9TVVBQT1JURUQpDQotLyogVGhlIGludGVybmFsIHN0cnVjdHVyZSB0aGF0IHBuZ19pbWFnZTo6b3BhcXVlIHBvaW50cyB0by4gKi8NCi10eXBlZGVmIHN0cnVjdCBwbmdfY29udHJvbA0KLXsNCi0gICBwbmdfc3RydWN0cCBwbmdfcHRyOw0KLSAgIHBuZ19pbmZvcCAgIGluZm9fcHRyOw0KLSAgIHBuZ192b2lkcCAgIGVycm9yX2J1ZjsgICAgICAgICAgIC8qIEFsd2F5cyBhIGptcF9idWYgYXQgcHJlc2VudC4gKi8NCi0NCi0gICBwbmdfY29uc3RfYnl0ZXAgbWVtb3J5OyAgICAgICAgICAvKiBNZW1vcnkgYnVmZmVyLiAqLw0KLSAgIHBuZ19zaXplX3QgICAgICBzaXplOyAgICAgICAgICAgIC8qIFNpemUgb2YgdGhlIG1lbW9yeSBidWZmZXIuICovDQotDQotICAgdW5zaWduZWQgaW50IGZvcl93cml0ZSAgICAgICA6MTsgLyogT3RoZXJ3aXNlIGl0IGlzIGEgcmVhZCBzdHJ1Y3R1cmUgKi8NCi0gICB1bnNpZ25lZCBpbnQgb3duZWRfZmlsZSAgICAgIDoxOyAvKiBXZSBvd24gdGhlIGZpbGUgaW4gaW9fcHRyICovDQotfSBwbmdfY29udHJvbDsNCi0NCi0vKiBSZXR1cm4gdGhlIHBvaW50ZXIgdG8gdGhlIGptcF9idWYgZnJvbSBhIHBuZ19jb250cm9sOiBuZWNlc3NhcnkgYmVjYXVzZSBDDQotICogZG9lcyBub3QgcmV2ZWFsIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50cyBvZiBqbXBfYnVmLg0KLSAqLw0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLSMgIGRlZmluZSBwbmdfY29udHJvbF9qbXBfYnVmKHBjKSAoKChqbXBfYnVmKikoKHBjKS0+ZXJyb3JfYnVmKSlbMF0pDQotI2Vsc2UNCi0jICBkZWZpbmUgcG5nX2NvbnRyb2xfam1wX2J1ZihwYykgKChwYyktPmVycm9yX2J1ZikNCi0jZW5kaWYNCi0NCi0vKiBVdGlsaXR5IHRvIHNhZmVseSBleGVjdXRlIGEgcGllY2Ugb2YgbGlicG5nIGNvZGUgY2F0Y2hpbmcgYW5kIGxvZ2dpbmcgYW55DQotICogZXJyb3JzIHRoYXQgbWlnaHQgb2NjdXIuICBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZSAoZWl0aGVyDQotICogb2YgdGhlIGZ1bmN0aW9uIG9yIGFzIGEgcmVzdWx0IG9mIGEgcG5nX2Vycm9yLikNCi0gKi8NCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfc2FmZV9lcnJvciwocG5nX3N0cnVjdHAgcG5nX3B0ciwNCi0gICBwbmdfY29uc3RfY2hhcnAgZXJyb3JfbWVzc2FnZSksUE5HX05PUkVUVVJOKTsNCi0NCi0jaWZkZWYgUE5HX1dBUk5JTkdTX1NVUFBPUlRFRA0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19zYWZlX3dhcm5pbmcsKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsDQotICAgcG5nX2NvbnN0X2NoYXJwIHdhcm5pbmdfbWVzc2FnZSksUE5HX0VNUFRZKTsNCi0jZWxzZQ0KLSMgIGRlZmluZSBwbmdfc2FmZV93YXJuaW5nIDAvKmR1bW15IGFyZ3VtZW50Ki8NCi0jZW5kaWYNCi0NCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19zYWZlX2V4ZWN1dGUsKHBuZ19pbWFnZXAgaW1hZ2UsDQotICAgaW50ICgqZnVuY3Rpb24pKHBuZ192b2lkcCksIHBuZ192b2lkcCBhcmcpLFBOR19FTVBUWSk7DQotDQotLyogVXRpbGl0eSB0byBsb2cgYW4gZXJyb3I7IHRoaXMgYWxzbyBjbGVhbnMgdXAgdGhlIHBuZ19pbWFnZTsgdGhlIGZ1bmN0aW9uDQotICogYWx3YXlzIHJldHVybnMgMCAoZmFsc2UpLg0KLSAqLw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTihpbnQscG5nX2ltYWdlX2Vycm9yLChwbmdfaW1hZ2VwIGltYWdlLA0KLSAgIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tZXNzYWdlKSxQTkdfRU1QVFkpOw0KLQ0KLSNpZm5kZWYgUE5HX1NJTVBMSUZJRURfUkVBRF9TVVBQT1JURUQNCi0vKiBwbmdfaW1hZ2VfZnJlZSBpcyB1c2VkIGJ5IHRoZSB3cml0ZSBjb2RlIGJ1dCBub3QgZXhwb3J0ZWQgKi8NCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCwgcG5nX2ltYWdlX2ZyZWUsIChwbmdfaW1hZ2VwIGltYWdlKSwgUE5HX0VNUFRZKTsNCi0jZW5kaWYgLyogIVNJTVBMSUZJRURfUkVBRCAqLw0KLQ0KLSNlbmRpZiAvKiBTSU1QTElGSUVEIFJFQUQvV1JJVEUgKi8NCi0NCi0vKiBUaGVzZSBhcmUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIGZvciBoYXJkd2FyZSBzcGVjaWZpYyBQTkcgZmlsdGVyDQotICogb3B0aW1pemF0aW9uczsgbGlzdCB0aGVzZSBoZXJlIHRoZW4gc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBvbmUgYXQgY29tcGlsZQ0KLSAqIHRpbWUgdXNpbmcgdGhlIG1hY3JvIFBOR19GSUxURVJfT1BUSU1JWkFUSU9OUy4gIElmIHRoZSBtYWNybyBpcyBub3QgZGVmaW5lZA0KLSAqIHRoZSBnZW5lcmljIGNvZGUgaXMgdXNlZC4NCi0gKi8NCi0jaWZkZWYgUE5HX0ZJTFRFUl9PUFRJTUlaQVRJT05TDQotUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQsIFBOR19GSUxURVJfT1BUSU1JWkFUSU9OUywgKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsDQotICAgdW5zaWduZWQgaW50IGJwcCksIFBOR19FTVBUWSk7DQotICAgLyogSnVzdCBkZWNsYXJlIHRoZSBvcHRpbWl6YXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgKi8NCi0jZWxzZQ0KLSAgIC8qIExpc3QgKmFsbCogdGhlIHBvc3NpYmxlIG9wdGltaXphdGlvbnMgaGVyZSAtIHRoaXMgYnJhbmNoIGlzIHJlcXVpcmVkIGlmDQotICAgICogdGhlIGJ1aWxkZXIgb2YgbGlicG5nIHBhc3NlcyB0aGUgZGVmaW5pdGlvbiBvZiBQTkdfRklMVEVSX09QVElNSVpBVElPTlMgaW4NCi0gICAgKiBDRkxBR1MgaW4gcGxhY2Ugb2YgQ1BQRkxBR1MgKmFuZCogdXNlcyBzeW1ib2wgcHJlZml4aW5nLg0KLSAgICAqLw0KLVBOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLCBwbmdfaW5pdF9maWx0ZXJfZnVuY3Rpb25zX25lb24sDQotICAgKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHVuc2lnbmVkIGludCBicHApLCBQTkdfRU1QVFkpOw0KLSNlbmRpZg0KLQ0KLS8qIE1haW50YWluZXI6IFB1dCBuZXcgcHJpdmF0ZSBwcm90b3R5cGVzIGhlcmUgXiAqLw0KLQ0KLSNpbmNsdWRlICJwbmdkZWJ1Zy5oIg0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLX0NCi0jZW5kaWYNCi0NCi0jZW5kaWYgLyogUE5HX1ZFUlNJT05fSU5GT19PTkxZICovDQotI2VuZGlmIC8qIFBOR1BSSVZfSCAqLw0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZnhfbHBuZy9scG5nX3YxNjMvcG5nc3RydWN0LmggYi9zYW1wbGVzL2Z4X2xwbmcvbHBuZ192MTYzL3BuZ3N0cnVjdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjk0NzA1Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvZnhfbHBuZy9scG5nX3YxNjMvcG5nc3RydWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0ODkgKzAsMCBAQAotDQotLyogcG5nc3RydWN0LmggLSBoZWFkZXIgZmlsZSBmb3IgUE5HIHJlZmVyZW5jZSBsaWJyYXJ5DQotICoNCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMyBHbGVubiBSYW5kZXJzLVBlaHJzb24NCi0gKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikNCi0gKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pDQotICoNCi0gKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4xIFtNYXJjaCAyOCwgMjAxM10NCi0gKg0KLSAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuDQotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcg0KLSAqIGFuZCBsaWNlbnNlIGluIHBuZy5oDQotICovDQotDQotLyogVGhlIHN0cnVjdHVyZSB0aGF0IGhvbGRzIHRoZSBpbmZvcm1hdGlvbiB0byByZWFkIGFuZCB3cml0ZSBQTkcgZmlsZXMuDQotICogVGhlIG9ubHkgcGVvcGxlIHdobyBuZWVkIHRvIGNhcmUgYWJvdXQgd2hhdCBpcyBpbnNpZGUgb2YgdGhpcyBhcmUgdGhlDQotICogcGVvcGxlIHdobyB3aWxsIGJlIG1vZGlmeWluZyB0aGUgbGlicmFyeSBmb3IgdGhlaXIgb3duIHNwZWNpYWwgbmVlZHMuDQotICogSXQgc2hvdWxkIE5PVCBiZSBhY2Nlc3NlZCBkaXJlY3RseSBieSBhbiBhcHBsaWNhdGlvbi4NCi0gKi8NCi0NCi0jaWZuZGVmIFBOR1NUUlVDVF9IDQotI2RlZmluZSBQTkdTVFJVQ1RfSA0KLS8qIHpsaWIuaCBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgel9zdHJlYW0sIGFuIGluc3RhbmNlIG9mIHdoaWNoIGlzIGluY2x1ZGVkDQotICogaW4gdGhpcyBzdHJ1Y3R1cmUgYW5kIGlzIHJlcXVpcmVkIGZvciBkZWNvbXByZXNzaW5nIHRoZSBMWiBjb21wcmVzc2VkDQotICogZGF0YSBpbiBQTkcgZmlsZXMuDQotICovDQotI2lmbmRlZiBaTElCX0NPTlNUDQotICAgLyogV2UgbXVzdCBlbnN1cmUgdGhhdCB6bGliIHVzZXMgJ2NvbnN0JyBpbiBkZWNsYXJhdGlvbnMuICovDQotIyAgZGVmaW5lIFpMSUJfQ09OU1QNCi0jZW5kaWYNCi0jaW5jbHVkZSAiLi4vLi4vZnhfemxpYi9pbmNsdWRlL2Z4X3psaWIuaCINCi0jaWZkZWYgY29uc3QNCi0gICAvKiB6bGliLmggc29tZXRpbWVzICNkZWZpbmVzIGNvbnN0IHRvIG5vdGhpbmcsIHVuZG8gdGhpcy4gKi8NCi0jICB1bmRlZiBjb25zdA0KLSNlbmRpZg0KLQ0KLS8qIHpsaWIuaCBoYXMgbWVkaW9jcmUgel9jb25zdCB1c2UgYmVmb3JlIDEuMi42LCB0aGlzIHN0dWZmIGlzIGZvciBjb21wYXRpYmlsaXR5DQotICogd2l0aCBvbGRlciBidWlsZHMuDQotICovDQotI2lmIFpMSUJfVkVSTlVNIDwgMHgxMjYwDQotIyAgZGVmaW5lIFBOR1pfTVNHX0NBU1QocykgcG5nX2NvbnN0Y2FzdChjaGFyKixzKQ0KLSMgIGRlZmluZSBQTkdaX0lOUFVUX0NBU1QoYikgcG5nX2NvbnN0Y2FzdChwbmdfYnl0ZXAsYikNCi0jZWxzZQ0KLSMgIGRlZmluZSBQTkdaX01TR19DQVNUKHMpIChzKQ0KLSMgIGRlZmluZSBQTkdaX0lOUFVUX0NBU1QoYikgKGIpDQotI2VuZGlmDQotDQotLyogemxpYi5oIGRlY2xhcmVzIGEgbWFnaWMgdHlwZSAndUludCcgdGhhdCBsaW1pdHMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgemxpYg0KLSAqIGNhbiBoYW5kbGUgYXQgb25jZS4gIFRoaXMgdHlwZSBuZWVkIGJlIG5vIGxhcmdlciB0aGFuIDE2IGJpdHMgKHNvIG1heGltdW0gb2YNCi0gKiA2NTUzNSksIHRoaXMgZGVmaW5lIGFsbG93cyB1cyB0byBkaXNjb3ZlciBob3cgYmlnIGl0IGlzLCBidXQgbGltaXRlZCBieSB0aGUNCi0gKiBtYXhpbXV1bSBmb3IgcG5nX3NpemVfdC4gIFRoZSB2YWx1ZSBjYW4gYmUgb3ZlcnJpZGVuIGluIGEgbGlicmFyeSBidWlsZA0KLSAqIChwbmd1c3IuaCwgb3Igc2V0IGl0IGluIENQUEZMQUdTKSBhbmQgaXQgd29ya3MgdG8gc2V0IGl0IHRvIGEgY29uc2lkZXJhYmx5DQotICogbG93ZXIgdmFsdWUgKGUuZy4gMjU1IHdvcmtzKS4gIEEgbG93ZXIgdmFsdWUgbWF5IGhlbHAgbWVtb3J5IHVzYWdlIChzbGlnaHRseSkNCi0gKiBhbmQgbWF5IGV2ZW4gaW1wcm92ZSBwZXJmb3JtYW5jZSBvbiBzb21lIHN5c3RlbXMgKGFuZCBkZWdyYWRlIGl0IG9uIG90aGVycy4pDQotICovDQotI2lmbmRlZiBaTElCX0lPX01BWA0KLSMgIGRlZmluZSBaTElCX0lPX01BWCAoKHVJbnQpLTEpDQotI2VuZGlmDQotDQotI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQNCi0vKiBUaGUgdHlwZSBvZiBhIGNvbXByZXNzaW9uIGJ1ZmZlciBsaXN0IHVzZWQgYnkgdGhlIHdyaXRlIGNvZGUuICovDQotdHlwZWRlZiBzdHJ1Y3QgcG5nX2NvbXByZXNzaW9uX2J1ZmZlcg0KLXsNCi0gICBzdHJ1Y3QgcG5nX2NvbXByZXNzaW9uX2J1ZmZlciAqbmV4dDsNCi0gICBwbmdfYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0WzFdOyAvKiBhY3R1YWxseSB6YnVmX3NpemUgKi8NCi19IHBuZ19jb21wcmVzc2lvbl9idWZmZXIsICpwbmdfY29tcHJlc3Npb25fYnVmZmVycDsNCi0NCi0jZGVmaW5lIFBOR19DT01QUkVTU0lPTl9CVUZGRVJfU0laRShwcClcDQotICAgKG9mZnNldG9mKHBuZ19jb21wcmVzc2lvbl9idWZmZXIsIG91dHB1dCkgKyAocHApLT56YnVmZmVyX3NpemUpDQotI2VuZGlmDQotDQotLyogQ29sb3JzcGFjZSBzdXBwb3J0OyBzdHJ1Y3R1cmVzIHVzZWQgaW4gcG5nX3N0cnVjdCwgcG5nX2luZm8gYW5kIGluIGludGVybmFsDQotICogZnVuY3Rpb25zIHRvIGhvbGQgYW5kIGNvbW11bmljYXRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2xvciBzcGFjZS4NCi0gKg0KLSAqIFBOR19DT0xPUlNQQUNFX1NVUFBPUlRFRCBpcyBvbmx5IHJlcXVpcmVkIGlmIHRoZSBhcHBsaWNhdGlvbiB3aWxsIHBlcmZvcm0NCi0gKiBjb2xvcnNwYWNlIGNvcnJlY3Rpb25zLCBvdGhlcndpc2UgYWxsIHRoZSBjb2xvcnNwYWNlIGluZm9ybWF0aW9uIGNhbiBiZQ0KLSAqIHNraXBwZWQgYW5kIHRoZSBzaXplIG9mIGxpYnBuZyBjYW4gYmUgcmVkdWNlZCAoc2lnbmlmaWNhbnRseSkgYnkgY29tcGlsaW5nDQotICogb3V0IHRoZSBjb2xvcnNwYWNlIHN1cHBvcnQuDQotICovDQotI2lmZGVmIFBOR19DT0xPUlNQQUNFX1NVUFBPUlRFRA0KLS8qIFRoZSBjaHJvbWF0aWNpdGllcyBvZiB0aGUgcmVkLCBncmVlbiBhbmQgYmx1ZSBjb2xvcmFudHMgYW5kIHRoZSBjaHJvbWF0aWNpdHkNCi0gKiBvZiB0aGUgY29ycmVzcG9uZGluZyB3aGl0ZSBwb2ludCAoaS5lLiBvZiByZ2IoMS4wLDEuMCwxLjApKS4NCi0gKi8NCi10eXBlZGVmIHN0cnVjdCBwbmdfeHkNCi17DQotICAgcG5nX2ZpeGVkX3BvaW50IHJlZHgsIHJlZHk7DQotICAgcG5nX2ZpeGVkX3BvaW50IGdyZWVueCwgZ3JlZW55Ow0KLSAgIHBuZ19maXhlZF9wb2ludCBibHVleCwgYmx1ZXk7DQotICAgcG5nX2ZpeGVkX3BvaW50IHdoaXRleCwgd2hpdGV5Ow0KLX0gcG5nX3h5Ow0KLQ0KLS8qIFRoZSBzYW1lIGRhdGEgYXMgYWJvdmUgYnV0IGVuY29kZWQgYXMgQ0lFIFhZWiB2YWx1ZXMuICBXaGVuIHRoaXMgZGF0YSBjb21lcw0KLSAqIGZyb20gY2hyb21hdGljaXRpZXMgdGhlIHN1bSBvZiB0aGUgWSB2YWx1ZXMgaXMgYXNzdW1lZCB0byBiZSAxLjANCi0gKi8NCi10eXBlZGVmIHN0cnVjdCBwbmdfWFlaDQotew0KLSAgIHBuZ19maXhlZF9wb2ludCByZWRfWCwgcmVkX1ksIHJlZF9aOw0KLSAgIHBuZ19maXhlZF9wb2ludCBncmVlbl9YLCBncmVlbl9ZLCBncmVlbl9aOw0KLSAgIHBuZ19maXhlZF9wb2ludCBibHVlX1gsIGJsdWVfWSwgYmx1ZV9aOw0KLX0gcG5nX1hZWjsNCi0jZW5kaWYgLyogQ09MT1JTUEFDRSAqLw0KLQ0KLSNpZiBkZWZpbmVkKFBOR19DT0xPUlNQQUNFX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfR0FNTUFfU1VQUE9SVEVEKQ0KLS8qIEEgY29sb3JzcGFjZSBpcyBhbGwgdGhlIGFib3ZlIHBsdXMsIHBvdGVudGlhbGx5LCBwcm9maWxlIGluZm9ybWF0aW9uLA0KLSAqIGhvd2V2ZXIgYXQgcHJlc2VudCBsaWJwbmcgZG9lcyBub3QgdXNlIHRoZSBwcm9maWxlIGludGVybmFsbHkgc28gaXQgaXMgb25seQ0KLSAqIHN0b3JlZCBpbiB0aGUgcG5nX2luZm8gc3RydWN0IChpZiBpQ0NQIGlzIHN1cHBvcnRlZC4pICBUaGUgcmVuZGVyaW5nIGludGVudA0KLSAqIGlzIHJldGFpbmVkIGhlcmUgYW5kIGlzIGNoZWNrZWQuDQotICoNCi0gKiBUaGUgZmlsZSBnYW1tYSBlbmNvZGluZyBpbmZvcm1hdGlvbiBpcyBhbHNvIHN0b3JlZCBoZXJlIGFuZCBnYW1tYSBjb3JyZWN0aW9uDQotICogaXMgZG9uZSBieSBsaWJwbmcsIHdoZXJlYXMgY29sb3IgY29ycmVjdGlvbiBtdXN0IGN1cnJlbnRseSBiZSBkb25lIGJ5IHRoZQ0KLSAqIGFwcGxpY2F0aW9uLg0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHBuZ19jb2xvcnNwYWNlDQotew0KLSNpZmRlZiBQTkdfR0FNTUFfU1VQUE9SVEVEDQotICAgcG5nX2ZpeGVkX3BvaW50IGdhbW1hOyAgICAgICAgLyogRmlsZSBnYW1tYSAqLw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBQTkdfQ09MT1JTUEFDRV9TVVBQT1JURUQNCi0gICBwbmdfeHkgICAgICBlbmRfcG9pbnRzX3h5OyAgICAvKiBFbmQgcG9pbnRzIGFzIGNocm9tYXRpY2l0aWVzICovDQotICAgcG5nX1hZWiAgICAgZW5kX3BvaW50c19YWVo7ICAgLyogRW5kIHBvaW50cyBhcyBDSUUgWFlaIGNvbG9yYW50IHZhbHVlcyAqLw0KLSAgIHBuZ191aW50XzE2IHJlbmRlcmluZ19pbnRlbnQ7IC8qIFJlbmRlcmluZyBpbnRlbnQgb2YgYSBwcm9maWxlICovDQotI2VuZGlmDQotDQotICAgLyogRmxhZ3MgYXJlIGFsd2F5cyBkZWZpbmVkIHRvIHNpbXBsaWZ5IHRoZSBjb2RlLiAqLw0KLSAgIHBuZ191aW50XzE2IGZsYWdzOyAgICAgICAgICAgIC8qIEFzIGRlZmluZWQgYmVsb3cgKi8NCi19IHBuZ19jb2xvcnNwYWNlLCAqIFBOR19SRVNUUklDVCBwbmdfY29sb3JzcGFjZXJwOw0KLQ0KLXR5cGVkZWYgY29uc3QgcG5nX2NvbG9yc3BhY2UgKiBQTkdfUkVTVFJJQ1QgcG5nX2NvbnN0X2NvbG9yc3BhY2VycDsNCi0NCi0vKiBHZW5lcmFsIGZsYWdzIGZvciB0aGUgJ2ZsYWdzJyBmaWVsZCAqLw0KLSNkZWZpbmUgUE5HX0NPTE9SU1BBQ0VfSEFWRV9HQU1NQSAgICAgICAgICAgMHgwMDAxDQotI2RlZmluZSBQTkdfQ09MT1JTUEFDRV9IQVZFX0VORFBPSU5UUyAgICAgICAweDAwMDINCi0jZGVmaW5lIFBOR19DT0xPUlNQQUNFX0hBVkVfSU5URU5UICAgICAgICAgIDB4MDAwNA0KLSNkZWZpbmUgUE5HX0NPTE9SU1BBQ0VfRlJPTV9nQU1BICAgICAgICAgICAgMHgwMDA4DQotI2RlZmluZSBQTkdfQ09MT1JTUEFDRV9GUk9NX2NIUk0gICAgICAgICAgICAweDAwMTANCi0jZGVmaW5lIFBOR19DT0xPUlNQQUNFX0ZST01fc1JHQiAgICAgICAgICAgIDB4MDAyMA0KLSNkZWZpbmUgUE5HX0NPTE9SU1BBQ0VfRU5EUE9JTlRTX01BVENIX3NSR0IgMHgwMDQwDQotI2RlZmluZSBQTkdfQ09MT1JTUEFDRV9NQVRDSEVTX3NSR0IgICAgICAgICAweDAwODAgLyogZXhhY3QgbWF0Y2ggb24gcHJvZmlsZSAqLw0KLSNkZWZpbmUgUE5HX0NPTE9SU1BBQ0VfSU5WQUxJRCAgICAgICAgICAgICAgMHg4MDAwDQotI2RlZmluZSBQTkdfQ09MT1JTUEFDRV9DQU5DRUwoZmxhZ3MpICAgICAgICAoMHhmZmZmIF4gKGZsYWdzKSkNCi0jZW5kaWYgLyogQ09MT1JTUEFDRSB8fCBHQU1NQSAqLw0KLQ0KLXN0cnVjdCBwbmdfc3RydWN0X2RlZg0KLXsNCi0jaWZkZWYgUE5HX1NFVEpNUF9TVVBQT1JURUQNCi0gICBqbXBfYnVmIGptcF9idWZfbG9jYWw7ICAgICAvKiBOZXcgbmFtZSBpbiAxLjYuMCBmb3Igam1wX2J1ZiBpbiBwbmdfc3RydWN0ICovDQotICAgcG5nX2xvbmdqbXBfcHRyIGxvbmdqbXBfZm47Lyogc2V0am1wIG5vbi1sb2NhbCBnb3RvIGZ1bmN0aW9uLiAqLw0KLSAgIGptcF9idWYgKmptcF9idWZfcHRyOyAgICAgIC8qIHBhc3NlZCB0byBsb25nam1wX2ZuICovDQotICAgc2l6ZV90IGptcF9idWZfc2l6ZTsgICAgICAgLyogc2l6ZSBvZiB0aGUgYWJvdmUsIGlmIGFsbG9jYXRlZCAqLw0KLSNlbmRpZg0KLSAgIHBuZ19lcnJvcl9wdHIgZXJyb3JfZm47ICAgIC8qIGZ1bmN0aW9uIGZvciBwcmludGluZyBlcnJvcnMgYW5kIGFib3J0aW5nICovDQotI2lmZGVmIFBOR19XQVJOSU5HU19TVVBQT1JURUQNCi0gICBwbmdfZXJyb3JfcHRyIHdhcm5pbmdfZm47ICAvKiBmdW5jdGlvbiBmb3IgcHJpbnRpbmcgd2FybmluZ3MgKi8NCi0jZW5kaWYNCi0gICBwbmdfdm9pZHAgZXJyb3JfcHRyOyAgICAgICAvKiB1c2VyIHN1cHBsaWVkIHN0cnVjdCBmb3IgZXJyb3IgZnVuY3Rpb25zICovDQotICAgcG5nX3J3X3B0ciB3cml0ZV9kYXRhX2ZuOyAgLyogZnVuY3Rpb24gZm9yIHdyaXRpbmcgb3V0cHV0IGRhdGEgKi8NCi0gICBwbmdfcndfcHRyIHJlYWRfZGF0YV9mbjsgICAvKiBmdW5jdGlvbiBmb3IgcmVhZGluZyBpbnB1dCBkYXRhICovDQotICAgcG5nX3ZvaWRwIGlvX3B0cjsgICAgICAgICAgLyogcHRyIHRvIGFwcGxpY2F0aW9uIHN0cnVjdCBmb3IgSS9PIGZ1bmN0aW9ucyAqLw0KLQ0KLSNpZmRlZiBQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQNCi0gICBwbmdfdXNlcl90cmFuc2Zvcm1fcHRyIHJlYWRfdXNlcl90cmFuc2Zvcm1fZm47IC8qIHVzZXIgcmVhZCB0cmFuc2Zvcm0gKi8NCi0jZW5kaWYNCi0NCi0jaWZkZWYgUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRA0KLSAgIHBuZ191c2VyX3RyYW5zZm9ybV9wdHIgd3JpdGVfdXNlcl90cmFuc2Zvcm1fZm47IC8qIHVzZXIgd3JpdGUgdHJhbnNmb3JtICovDQotI2VuZGlmDQotDQotLyogVGhlc2Ugd2VyZSBhZGRlZCBpbiBsaWJwbmctMS4wLjIgKi8NCi0jaWZkZWYgUE5HX1VTRVJfVFJBTlNGT1JNX1BUUl9TVVBQT1JURUQNCi0jaWYgZGVmaW5lZChQTkdfUkVBRF9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQpIHx8IFwNCi0gICAgZGVmaW5lZChQTkdfV1JJVEVfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEKQ0KLSAgIHBuZ192b2lkcCB1c2VyX3RyYW5zZm9ybV9wdHI7IC8qIHVzZXIgc3VwcGxpZWQgc3RydWN0IGZvciB1c2VyIHRyYW5zZm9ybSAqLw0KLSAgIHBuZ19ieXRlIHVzZXJfdHJhbnNmb3JtX2RlcHRoOyAgICAvKiBiaXQgZGVwdGggb2YgdXNlciB0cmFuc2Zvcm1lZCBwaXhlbHMgKi8NCi0gICBwbmdfYnl0ZSB1c2VyX3RyYW5zZm9ybV9jaGFubmVsczsgLyogY2hhbm5lbHMgaW4gdXNlciB0cmFuc2Zvcm1lZCBwaXhlbHMgKi8NCi0jZW5kaWYNCi0jZW5kaWYNCi0NCi0gICBwbmdfdWludF8zMiBtb2RlOyAgICAgICAgICAvKiB0ZWxscyB1cyB3aGVyZSB3ZSBhcmUgaW4gdGhlIFBORyBmaWxlICovDQotICAgcG5nX3VpbnRfMzIgZmxhZ3M7ICAgICAgICAgLyogZmxhZ3MgaW5kaWNhdGluZyB2YXJpb3VzIHRoaW5ncyB0byBsaWJwbmcgKi8NCi0gICBwbmdfdWludF8zMiB0cmFuc2Zvcm1hdGlvbnM7IC8qIHdoaWNoIHRyYW5zZm9ybWF0aW9ucyB0byBwZXJmb3JtICovDQotDQotICAgcG5nX3VpbnRfMzIgem93bmVyOyAgICAgICAgLyogSUQgKGNodW5rIHR5cGUpIG9mIHpzdHJlYW0gb3duZXIsIDAgaWYgbm9uZSAqLw0KLSAgIHpfc3RyZWFtICAgIHpzdHJlYW07ICAgICAgIC8qIGRlY29tcHJlc3Npb24gc3RydWN0dXJlICovDQotDQotI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQNCi0gICBwbmdfY29tcHJlc3Npb25fYnVmZmVycCB6YnVmZmVyX2xpc3Q7IC8qIENyZWF0ZWQgb24gZGVtYW5kIGR1cmluZyB3cml0ZSAqLw0KLSAgIHVJbnQgICAgICAgICAgICAgICAgICAgIHpidWZmZXJfc2l6ZTsgLyogc2l6ZSBvZiB0aGUgYWN0dWFsIGJ1ZmZlciAqLw0KLQ0KLSAgIGludCB6bGliX2xldmVsOyAgICAgICAgICAgIC8qIGhvbGRzIHpsaWIgY29tcHJlc3Npb24gbGV2ZWwgKi8NCi0gICBpbnQgemxpYl9tZXRob2Q7ICAgICAgICAgICAvKiBob2xkcyB6bGliIGNvbXByZXNzaW9uIG1ldGhvZCAqLw0KLSAgIGludCB6bGliX3dpbmRvd19iaXRzOyAgICAgIC8qIGhvbGRzIHpsaWIgY29tcHJlc3Npb24gd2luZG93IGJpdHMgKi8NCi0gICBpbnQgemxpYl9tZW1fbGV2ZWw7ICAgICAgICAvKiBob2xkcyB6bGliIGNvbXByZXNzaW9uIG1lbW9yeSBsZXZlbCAqLw0KLSAgIGludCB6bGliX3N0cmF0ZWd5OyAgICAgICAgIC8qIGhvbGRzIHpsaWIgY29tcHJlc3Npb24gc3RyYXRlZ3kgKi8NCi0jZW5kaWYNCi0vKiBBZGRlZCBhdCBsaWJwbmcgMS41LjQgKi8NCi0jaWZkZWYgUE5HX1dSSVRFX0NVU1RPTUlaRV9aVFhUX0NPTVBSRVNTSU9OX1NVUFBPUlRFRA0KLSAgIGludCB6bGliX3RleHRfbGV2ZWw7ICAgICAgICAgICAgLyogaG9sZHMgemxpYiBjb21wcmVzc2lvbiBsZXZlbCAqLw0KLSAgIGludCB6bGliX3RleHRfbWV0aG9kOyAgICAgICAgICAgLyogaG9sZHMgemxpYiBjb21wcmVzc2lvbiBtZXRob2QgKi8NCi0gICBpbnQgemxpYl90ZXh0X3dpbmRvd19iaXRzOyAgICAgIC8qIGhvbGRzIHpsaWIgY29tcHJlc3Npb24gd2luZG93IGJpdHMgKi8NCi0gICBpbnQgemxpYl90ZXh0X21lbV9sZXZlbDsgICAgICAgIC8qIGhvbGRzIHpsaWIgY29tcHJlc3Npb24gbWVtb3J5IGxldmVsICovDQotICAgaW50IHpsaWJfdGV4dF9zdHJhdGVneTsgICAgICAgICAvKiBob2xkcyB6bGliIGNvbXByZXNzaW9uIHN0cmF0ZWd5ICovDQotI2VuZGlmDQotLyogRW5kIG9mIG1hdGVyaWFsIGFkZGVkIGF0IGxpYnBuZyAxLjUuNCAqLw0KLS8qIEFkZGVkIGF0IGxpYnBuZyAxLjYuMCAqLw0KLSNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVEDQotICAgaW50IHpsaWJfc2V0X2xldmVsOyAgICAgICAgLyogQWN0dWFsIHZhbHVlcyBzZXQgaW50byB0aGUgenN0cmVhbSBvbiB3cml0ZSAqLw0KLSAgIGludCB6bGliX3NldF9tZXRob2Q7DQotICAgaW50IHpsaWJfc2V0X3dpbmRvd19iaXRzOw0KLSAgIGludCB6bGliX3NldF9tZW1fbGV2ZWw7DQotICAgaW50IHpsaWJfc2V0X3N0cmF0ZWd5Ow0KLSNlbmRpZg0KLQ0KLSAgIHBuZ191aW50XzMyIHdpZHRoOyAgICAgICAgIC8qIHdpZHRoIG9mIGltYWdlIGluIHBpeGVscyAqLw0KLSAgIHBuZ191aW50XzMyIGhlaWdodDsgICAgICAgIC8qIGhlaWdodCBvZiBpbWFnZSBpbiBwaXhlbHMgKi8NCi0gICBwbmdfdWludF8zMiBudW1fcm93czsgICAgICAvKiBudW1iZXIgb2Ygcm93cyBpbiBjdXJyZW50IHBhc3MgKi8NCi0gICBwbmdfdWludF8zMiB1c3Jfd2lkdGg7ICAgICAvKiB3aWR0aCBvZiByb3cgYXQgc3RhcnQgb2Ygd3JpdGUgKi8NCi0gICBwbmdfc2l6ZV90IHJvd2J5dGVzOyAgICAgICAvKiBzaXplIG9mIHJvdyBpbiBieXRlcyAqLw0KLSAgIHBuZ191aW50XzMyIGl3aWR0aDsgICAgICAgIC8qIHdpZHRoIG9mIGN1cnJlbnQgaW50ZXJsYWNlZCByb3cgaW4gcGl4ZWxzICovDQotICAgcG5nX3VpbnRfMzIgcm93X251bWJlcjsgICAgLyogY3VycmVudCByb3cgaW4gaW50ZXJsYWNlIHBhc3MgKi8NCi0gICBwbmdfdWludF8zMiBjaHVua19uYW1lOyAgICAvKiBQTkdfQ0hVTksoKSBpZCBvZiBjdXJyZW50IGNodW5rICovDQotICAgcG5nX2J5dGVwIHByZXZfcm93OyAgICAgICAgLyogYnVmZmVyIHRvIHNhdmUgcHJldmlvdXMgKHVuZmlsdGVyZWQpIHJvdy4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIGEgcG9pbnRlciBpbnRvIGJpZ19wcmV2X3Jvdw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgIHBuZ19ieXRlcCByb3dfYnVmOyAgICAgICAgIC8qIGJ1ZmZlciB0byBzYXZlIGN1cnJlbnQgKHVuZmlsdGVyZWQpIHJvdy4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIGEgcG9pbnRlciBpbnRvIGJpZ19yb3dfYnVmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQNCi0gICBwbmdfYnl0ZXAgc3ViX3JvdzsgICAgICAgICAvKiBidWZmZXIgdG8gc2F2ZSAic3ViIiByb3cgd2hlbiBmaWx0ZXJpbmcgKi8NCi0gICBwbmdfYnl0ZXAgdXBfcm93OyAgICAgICAgICAvKiBidWZmZXIgdG8gc2F2ZSAidXAiIHJvdyB3aGVuIGZpbHRlcmluZyAqLw0KLSAgIHBuZ19ieXRlcCBhdmdfcm93OyAgICAgICAgIC8qIGJ1ZmZlciB0byBzYXZlICJhdmciIHJvdyB3aGVuIGZpbHRlcmluZyAqLw0KLSAgIHBuZ19ieXRlcCBwYWV0aF9yb3c7ICAgICAgIC8qIGJ1ZmZlciB0byBzYXZlICJQYWV0aCIgcm93IHdoZW4gZmlsdGVyaW5nICovDQotI2VuZGlmDQotICAgcG5nX3NpemVfdCBpbmZvX3Jvd2J5dGVzOyAgLyogQWRkZWQgaW4gMS41LjQ6IGNhY2hlIG9mIHVwZGF0ZWQgcm93IGJ5dGVzICovDQotDQotICAgcG5nX3VpbnRfMzIgaWRhdF9zaXplOyAgICAgLyogY3VycmVudCBJREFUIHNpemUgZm9yIHJlYWQgKi8NCi0gICBwbmdfdWludF8zMiBjcmM7ICAgICAgICAgICAvKiBjdXJyZW50IGNodW5rIENSQyB2YWx1ZSAqLw0KLSAgIHBuZ19jb2xvcnAgcGFsZXR0ZTsgICAgICAgIC8qIHBhbGV0dGUgZnJvbSB0aGUgaW5wdXQgZmlsZSAqLw0KLSAgIHBuZ191aW50XzE2IG51bV9wYWxldHRlOyAgIC8qIG51bWJlciBvZiBjb2xvciBlbnRyaWVzIGluIHBhbGV0dGUgKi8NCi0NCi0vKiBBZGRlZCBhdCBsaWJwbmctMS41LjEwICovDQotI2lmZGVmIFBOR19DSEVDS19GT1JfSU5WQUxJRF9JTkRFWF9TVVBQT1JURUQNCi0gICBpbnQgbnVtX3BhbGV0dGVfbWF4OyAgICAgICAvKiBtYXhpbXVtIHBhbGV0dGUgaW5kZXggZm91bmQgaW4gSURBVCAqLw0KLSNlbmRpZg0KLQ0KLSAgIHBuZ191aW50XzE2IG51bV90cmFuczsgICAgIC8qIG51bWJlciBvZiB0cmFuc3BhcmVuY3kgdmFsdWVzICovDQotICAgcG5nX2J5dGUgY29tcHJlc3Npb247ICAgICAgLyogZmlsZSBjb21wcmVzc2lvbiB0eXBlIChhbHdheXMgMCkgKi8NCi0gICBwbmdfYnl0ZSBmaWx0ZXI7ICAgICAgICAgICAvKiBmaWxlIGZpbHRlciB0eXBlIChhbHdheXMgMCkgKi8NCi0gICBwbmdfYnl0ZSBpbnRlcmxhY2VkOyAgICAgICAvKiBQTkdfSU5URVJMQUNFX05PTkUsIFBOR19JTlRFUkxBQ0VfQURBTTcgKi8NCi0gICBwbmdfYnl0ZSBwYXNzOyAgICAgICAgICAgICAvKiBjdXJyZW50IGludGVybGFjZSBwYXNzICgwIC0gNikgKi8NCi0gICBwbmdfYnl0ZSBkb19maWx0ZXI7ICAgICAgICAvKiByb3cgZmlsdGVyIGZsYWdzIChzZWUgUE5HX0ZJTFRFUl8gYmVsb3cgKSAqLw0KLSAgIHBuZ19ieXRlIGNvbG9yX3R5cGU7ICAgICAgIC8qIGNvbG9yIHR5cGUgb2YgZmlsZSAqLw0KLSAgIHBuZ19ieXRlIGJpdF9kZXB0aDsgICAgICAgIC8qIGJpdCBkZXB0aCBvZiBmaWxlICovDQotICAgcG5nX2J5dGUgdXNyX2JpdF9kZXB0aDsgICAgLyogYml0IGRlcHRoIG9mIHVzZXJzIHJvdzogd3JpdGUgb25seSAqLw0KLSAgIHBuZ19ieXRlIHBpeGVsX2RlcHRoOyAgICAgIC8qIG51bWJlciBvZiBiaXRzIHBlciBwaXhlbCAqLw0KLSAgIHBuZ19ieXRlIGNoYW5uZWxzOyAgICAgICAgIC8qIG51bWJlciBvZiBjaGFubmVscyBpbiBmaWxlICovDQotI2lmZGVmIFBOR19XUklURV9TVVBQT1JURUQNCi0gICBwbmdfYnl0ZSB1c3JfY2hhbm5lbHM7ICAgICAvKiBjaGFubmVscyBhdCBzdGFydCBvZiB3cml0ZTogd3JpdGUgb25seSAqLw0KLSNlbmRpZg0KLSAgIHBuZ19ieXRlIHNpZ19ieXRlczsgICAgICAgIC8qIG1hZ2ljIGJ5dGVzIHJlYWQvd3JpdHRlbiBmcm9tIHN0YXJ0IG9mIGZpbGUgKi8NCi0gICBwbmdfYnl0ZSBtYXhpbXVtX3BpeGVsX2RlcHRoOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBpeGVsIGRlcHRoIHVzZWQgZm9yIHRoZSByb3cgYnVmZmVycyAqLw0KLSAgIHBuZ19ieXRlIHRyYW5zZm9ybWVkX3BpeGVsX2RlcHRoOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBpeGVsIGRlcHRoIGFmdGVyIHJlYWQvd3JpdGUgdHJhbnNmb3JtcyAqLw0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0ZJTExFUl9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX0ZJTExFUl9TVVBQT1JURUQpDQotICAgcG5nX3VpbnRfMTYgZmlsbGVyOyAgICAgICAgICAgLyogZmlsbGVyIGJ5dGVzIGZvciBwaXhlbCBleHBhbnNpb24gKi8NCi0jZW5kaWYNCi0NCi0jaWYgZGVmaW5lZChQTkdfYktHRF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpIHx8XA0KLSAgIGRlZmluZWQoUE5HX1JFQURfQUxQSEFfTU9ERV9TVVBQT1JURUQpDQotICAgcG5nX2J5dGUgYmFja2dyb3VuZF9nYW1tYV90eXBlOw0KLSAgIHBuZ19maXhlZF9wb2ludCBiYWNrZ3JvdW5kX2dhbW1hOw0KLSAgIHBuZ19jb2xvcl8xNiBiYWNrZ3JvdW5kOyAgIC8qIGJhY2tncm91bmQgY29sb3IgaW4gc2NyZWVuIGdhbW1hIHNwYWNlICovDQotI2lmZGVmIFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRA0KLSAgIHBuZ19jb2xvcl8xNiBiYWNrZ3JvdW5kXzE7IC8qIGJhY2tncm91bmQgbm9ybWFsaXplZCB0byBnYW1tYSAxLjAgKi8NCi0jZW5kaWYNCi0jZW5kaWYgLyogUE5HX2JLR0RfU1VQUE9SVEVEICovDQotDQotI2lmZGVmIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQNCi0gICBwbmdfZmx1c2hfcHRyIG91dHB1dF9mbHVzaF9mbjsgLyogRnVuY3Rpb24gZm9yIGZsdXNoaW5nIG91dHB1dCAqLw0KLSAgIHBuZ191aW50XzMyIGZsdXNoX2Rpc3Q7ICAgIC8qIGhvdyBtYW55IHJvd3MgYXBhcnQgdG8gZmx1c2gsIDAgLSBubyBmbHVzaCAqLw0KLSAgIHBuZ191aW50XzMyIGZsdXNoX3Jvd3M7ICAgIC8qIG51bWJlciBvZiByb3dzIHdyaXR0ZW4gc2luY2UgbGFzdCBmbHVzaCAqLw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQNCi0gICBpbnQgZ2FtbWFfc2hpZnQ7ICAgICAgLyogbnVtYmVyIG9mICJpbnNpZ25pZmljYW50IiBiaXRzIGluIDE2LWJpdCBnYW1tYSAqLw0KLSAgIHBuZ19maXhlZF9wb2ludCBzY3JlZW5fZ2FtbWE7IC8qIHNjcmVlbiBnYW1tYSB2YWx1ZSAoZGlzcGxheV9leHBvbmVudCkgKi8NCi0NCi0gICBwbmdfYnl0ZXAgZ2FtbWFfdGFibGU7ICAgICAvKiBnYW1tYSB0YWJsZSBmb3IgOC1iaXQgZGVwdGggZmlsZXMgKi8NCi0gICBwbmdfdWludF8xNnBwIGdhbW1hXzE2X3RhYmxlOyAvKiBnYW1tYSB0YWJsZSBmb3IgMTYtYml0IGRlcHRoIGZpbGVzICovDQotI2lmIGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpIHx8IFwNCi0gICBkZWZpbmVkKFBOR19SRUFEX0FMUEhBX01PREVfU1VQUE9SVEVEKSB8fCBcDQotICAgZGVmaW5lZChQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQpDQotICAgcG5nX2J5dGVwIGdhbW1hX2Zyb21fMTsgICAgLyogY29udmVydHMgZnJvbSAxLjAgdG8gc2NyZWVuICovDQotICAgcG5nX2J5dGVwIGdhbW1hX3RvXzE7ICAgICAgLyogY29udmVydHMgZnJvbSBmaWxlIHRvIDEuMCAqLw0KLSAgIHBuZ191aW50XzE2cHAgZ2FtbWFfMTZfZnJvbV8xOyAvKiBjb252ZXJ0cyBmcm9tIDEuMCB0byBzY3JlZW4gKi8NCi0gICBwbmdfdWludF8xNnBwIGdhbW1hXzE2X3RvXzE7IC8qIGNvbnZlcnRzIGZyb20gZmlsZSB0byAxLjAgKi8NCi0jZW5kaWYgLyogUkVBRF9CQUNLR1JPVU5EIHx8IFJFQURfQUxQSEFfTU9ERSB8fCBSR0JfVE9fR1JBWSAqLw0KLSNlbmRpZg0KLQ0KLSNpZiBkZWZpbmVkKFBOR19SRUFEX0dBTU1BX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfc0JJVF9TVVBQT1JURUQpDQotICAgcG5nX2NvbG9yXzggc2lnX2JpdDsgICAgICAgLyogc2lnbmlmaWNhbnQgYml0cyBpbiBlYWNoIGF2YWlsYWJsZSBjaGFubmVsICovDQotI2VuZGlmDQotDQotI2lmIGRlZmluZWQoUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TSElGVF9TVVBQT1JURUQpDQotICAgcG5nX2NvbG9yXzggc2hpZnQ7ICAgICAgICAgLyogc2hpZnQgZm9yIHNpZ25pZmljYW50IGJpdCB0cmFuZm9ybWF0aW9uICovDQotI2VuZGlmDQotDQotI2lmIGRlZmluZWQoUE5HX3RSTlNfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKSBcDQotIHx8IGRlZmluZWQoUE5HX1JFQURfRVhQQU5EX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkNCi0gICBwbmdfYnl0ZXAgdHJhbnNfYWxwaGE7ICAgICAgICAgICAvKiBhbHBoYSB2YWx1ZXMgZm9yIHBhbGV0dGVkIGZpbGVzICovDQotICAgcG5nX2NvbG9yXzE2IHRyYW5zX2NvbG9yOyAgLyogdHJhbnNwYXJlbnQgY29sb3IgZm9yIG5vbi1wYWxldHRlZCBmaWxlcyAqLw0KLSNlbmRpZg0KLQ0KLSAgIHBuZ19yZWFkX3N0YXR1c19wdHIgcmVhZF9yb3dfZm47ICAgLyogY2FsbGVkIGFmdGVyIGVhY2ggcm93IGlzIGRlY29kZWQgKi8NCi0gICBwbmdfd3JpdGVfc3RhdHVzX3B0ciB3cml0ZV9yb3dfZm47IC8qIGNhbGxlZCBhZnRlciBlYWNoIHJvdyBpcyBlbmNvZGVkICovDQotI2lmZGVmIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRA0KLSAgIHBuZ19wcm9ncmVzc2l2ZV9pbmZvX3B0ciBpbmZvX2ZuOyAvKiBjYWxsZWQgYWZ0ZXIgaGVhZGVyIGRhdGEgZnVsbHkgcmVhZCAqLw0KLSAgIHBuZ19wcm9ncmVzc2l2ZV9yb3dfcHRyIHJvd19mbjsgICAvKiBjYWxsZWQgYWZ0ZXIgYSBwcm9nLiByb3cgaXMgZGVjb2RlZCAqLw0KLSAgIHBuZ19wcm9ncmVzc2l2ZV9lbmRfcHRyIGVuZF9mbjsgICAvKiBjYWxsZWQgYWZ0ZXIgaW1hZ2UgaXMgY29tcGxldGUgKi8NCi0gICBwbmdfYnl0ZXAgc2F2ZV9idWZmZXJfcHRyOyAgICAgICAgLyogY3VycmVudCBsb2NhdGlvbiBpbiBzYXZlX2J1ZmZlciAqLw0KLSAgIHBuZ19ieXRlcCBzYXZlX2J1ZmZlcjsgICAgICAgICAgICAvKiBidWZmZXIgZm9yIHByZXZpb3VzbHkgcmVhZCBkYXRhICovDQotICAgcG5nX2J5dGVwIGN1cnJlbnRfYnVmZmVyX3B0cjsgICAgIC8qIGN1cnJlbnQgbG9jYXRpb24gaW4gY3VycmVudF9idWZmZXIgKi8NCi0gICBwbmdfYnl0ZXAgY3VycmVudF9idWZmZXI7ICAgICAgICAgLyogYnVmZmVyIGZvciByZWNlbnRseSB1c2VkIGRhdGEgKi8NCi0gICBwbmdfdWludF8zMiBwdXNoX2xlbmd0aDsgICAgICAgICAgLyogc2l6ZSBvZiBjdXJyZW50IGlucHV0IGNodW5rICovDQotICAgcG5nX3VpbnRfMzIgc2tpcF9sZW5ndGg7ICAgICAgICAgIC8qIGJ5dGVzIHRvIHNraXAgaW4gaW5wdXQgZGF0YSAqLw0KLSAgIHBuZ19zaXplX3Qgc2F2ZV9idWZmZXJfc2l6ZTsgICAgICAvKiBhbW91bnQgb2YgZGF0YSBub3cgaW4gc2F2ZV9idWZmZXIgKi8NCi0gICBwbmdfc2l6ZV90IHNhdmVfYnVmZmVyX21heDsgICAgICAgLyogdG90YWwgc2l6ZSBvZiBzYXZlX2J1ZmZlciAqLw0KLSAgIHBuZ19zaXplX3QgYnVmZmVyX3NpemU7ICAgICAgICAgICAvKiB0b3RhbCBhbW91bnQgb2YgYXZhaWxhYmxlIGlucHV0IGRhdGEgKi8NCi0gICBwbmdfc2l6ZV90IGN1cnJlbnRfYnVmZmVyX3NpemU7ICAgLyogYW1vdW50IG9mIGRhdGEgbm93IGluIGN1cnJlbnRfYnVmZmVyICovDQotICAgaW50IHByb2Nlc3NfbW9kZTsgICAgICAgICAgICAgICAgIC8qIHdoYXQgcHVzaCBsaWJyYXJ5IGlzIGN1cnJlbnRseSBkb2luZyAqLw0KLSAgIGludCBjdXJfcGFsZXR0ZTsgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IHB1c2ggbGlicmFyeSBwYWxldHRlIGluZGV4ICovDQotDQotI2VuZGlmIC8qIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRCAqLw0KLQ0KLSNpZiBkZWZpbmVkKF9fVFVSQk9DX18pICYmICFkZWZpbmVkKF9XaW5kb3dzKSAmJiAhZGVmaW5lZChfX0ZMQVRfXykNCi0vKiBGb3IgdGhlIEJvcmxhbmQgc3BlY2lhbCA2NEsgc2VnbWVudCBoYW5kbGVyICovDQotICAgcG5nX2J5dGVwcCBvZmZzZXRfdGFibGVfcHRyOw0KLSAgIHBuZ19ieXRlcCBvZmZzZXRfdGFibGU7DQotICAgcG5nX3VpbnRfMTYgb2Zmc2V0X3RhYmxlX251bWJlcjsNCi0gICBwbmdfdWludF8xNiBvZmZzZXRfdGFibGVfY291bnQ7DQotICAgcG5nX3VpbnRfMTYgb2Zmc2V0X3RhYmxlX2NvdW50X2ZyZWU7DQotI2VuZGlmDQotDQotI2lmZGVmIFBOR19SRUFEX1FVQU5USVpFX1NVUFBPUlRFRA0KLSAgIHBuZ19ieXRlcCBwYWxldHRlX2xvb2t1cDsgLyogbG9va3VwIHRhYmxlIGZvciBxdWFudGl6aW5nICovDQotICAgcG5nX2J5dGVwIHF1YW50aXplX2luZGV4OyAvKiBpbmRleCB0cmFuc2xhdGlvbiBmb3IgcGFsZXR0ZSBmaWxlcyAqLw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBQTkdfV1JJVEVfV0VJR0hURURfRklMVEVSX1NVUFBPUlRFRA0KLSAgIHBuZ19ieXRlIGhldXJpc3RpY19tZXRob2Q7ICAgICAgICAvKiBoZXVyaXN0aWMgZm9yIHJvdyBmaWx0ZXIgc2VsZWN0aW9uICovDQotICAgcG5nX2J5dGUgbnVtX3ByZXZfZmlsdGVyczsgICAgICAgIC8qIG51bWJlciBvZiB3ZWlnaHRzIGZvciBwcmV2aW91cyByb3dzICovDQotICAgcG5nX2J5dGVwIHByZXZfZmlsdGVyczsgICAgICAgICAgIC8qIGZpbHRlciB0eXBlKHMpIG9mIHByZXZpb3VzIHJvdyhzKSAqLw0KLSAgIHBuZ191aW50XzE2cCBmaWx0ZXJfd2VpZ2h0czsgICAgICAvKiB3ZWlnaHQocykgZm9yIHByZXZpb3VzIGxpbmUocykgKi8NCi0gICBwbmdfdWludF8xNnAgaW52X2ZpbHRlcl93ZWlnaHRzOyAgLyogMS93ZWlnaHQocykgZm9yIHByZXZpb3VzIGxpbmUocykgKi8NCi0gICBwbmdfdWludF8xNnAgZmlsdGVyX2Nvc3RzOyAgICAgICAgLyogcmVsYXRpdmUgZmlsdGVyIGNhbGN1bGF0aW9uIGNvc3QgKi8NCi0gICBwbmdfdWludF8xNnAgaW52X2ZpbHRlcl9jb3N0czsgICAgLyogMS9yZWxhdGl2ZSBmaWx0ZXIgY2FsY3VsYXRpb24gY29zdCAqLw0KLSNlbmRpZg0KLQ0KLSAgIC8qIE9wdGlvbnMgKi8NCi0jaWZkZWYgUE5HX1NFVF9PUFRJT05fU1VQUE9SVEVEDQotICAgcG5nX2J5dGUgb3B0aW9uczsgICAgICAgICAgIC8qIE9uL29mZiBzdGF0ZSAodXAgdG8gNCBvcHRpb25zKSAqLw0KLSNlbmRpZg0KLQ0KLSNpZiBQTkdfTElCUE5HX1ZFUiA8IDEwNzAwDQotLyogVG8gZG86IHJlbW92ZSB0aGlzIGZyb20gbGlicG5nLTEuNyAqLw0KLSNpZmRlZiBQTkdfVElNRV9SRkMxMTIzX1NVUFBPUlRFRA0KLSAgIGNoYXIgdGltZV9idWZmZXJbMjldOyAvKiBTdHJpbmcgdG8gaG9sZCBSRkMgMTEyMyB0aW1lIHRleHQgKi8NCi0jZW5kaWYNCi0jZW5kaWYNCi0NCi0vKiBOZXcgbWVtYmVycyBhZGRlZCBpbiBsaWJwbmctMS4wLjYgKi8NCi0NCi0gICBwbmdfdWludF8zMiBmcmVlX21lOyAgICAvKiBmbGFncyBpdGVtcyBsaWJwbmcgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgKi8NCi0NCi0jaWZkZWYgUE5HX1VTRVJfQ0hVTktTX1NVUFBPUlRFRA0KLSAgIHBuZ192b2lkcCB1c2VyX2NodW5rX3B0cjsNCi0jaWZkZWYgUE5HX1JFQURfVVNFUl9DSFVOS1NfU1VQUE9SVEVEDQotICAgcG5nX3VzZXJfY2h1bmtfcHRyIHJlYWRfdXNlcl9jaHVua19mbjsgLyogdXNlciByZWFkIGNodW5rIGhhbmRsZXIgKi8NCi0jZW5kaWYNCi0jZW5kaWYNCi0NCi0jaWZkZWYgUE5HX1NFVF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQNCi0gICBpbnQgICAgICAgICAgdW5rbm93bl9kZWZhdWx0OyAvKiBBcyBQTkdfSEFORExFXyogKi8NCi0gICB1bnNpZ25lZCBpbnQgbnVtX2NodW5rX2xpc3Q7ICAvKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgbGlzdCAqLw0KLSAgIHBuZ19ieXRlcCAgICBjaHVua19saXN0OyAgICAgIC8qIExpc3Qgb2YgcG5nX2J5dGVbNV07IHRoZSB0ZXh0dWFsIGNodW5rIG5hbWUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmb2xsb3dlZCBieSBhIFBOR19IQU5ETEVfKiBieXRlICovDQotI2VuZGlmDQotDQotLyogTmV3IG1lbWJlcnMgYWRkZWQgaW4gbGlicG5nLTEuMC4zICovDQotI2lmZGVmIFBOR19SRUFEX1JHQl9UT19HUkFZX1NVUFBPUlRFRA0KLSAgIHBuZ19ieXRlIHJnYl90b19ncmF5X3N0YXR1czsNCi0gICAvKiBBZGRlZCBpbiBsaWJwbmcgMS41LjUgdG8gcmVjb3JkIHNldHRpbmcgb2YgY29lZmZpY2llbnRzOiAqLw0KLSAgIHBuZ19ieXRlIHJnYl90b19ncmF5X2NvZWZmaWNpZW50c19zZXQ7DQotICAgLyogVGhlc2Ugd2VyZSBjaGFuZ2VkIGZyb20gcG5nX2J5dGUgaW4gbGlicG5nLTEuMC42ICovDQotICAgcG5nX3VpbnRfMTYgcmdiX3RvX2dyYXlfcmVkX2NvZWZmOw0KLSAgIHBuZ191aW50XzE2IHJnYl90b19ncmF5X2dyZWVuX2NvZWZmOw0KLSAgIC8qIGRlbGV0ZWQgaW4gMS41LjU6IHJnYl90b19ncmF5X2JsdWVfY29lZmY7ICovDQotI2VuZGlmDQotDQotLyogTmV3IG1lbWJlciBhZGRlZCBpbiBsaWJwbmctMS4wLjQgKHJlbmFtZWQgaW4gMS4wLjkpICovDQotI2lmIGRlZmluZWQoUE5HX01OR19GRUFUVVJFU19TVVBQT1JURUQpDQotLyogQ2hhbmdlZCBmcm9tIHBuZ19ieXRlIHRvIHBuZ191aW50XzMyIGF0IHZlcnNpb24gMS4yLjAgKi8NCi0gICBwbmdfdWludF8zMiBtbmdfZmVhdHVyZXNfcGVybWl0dGVkOw0KLSNlbmRpZg0KLQ0KLS8qIE5ldyBtZW1iZXIgYWRkZWQgaW4gbGlicG5nLTEuMC45LCBpZmRlZidlZCBvdXQgaW4gMS4wLjEyLCBlbmFibGVkIGluIDEuMi4wICovDQotI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEDQotICAgcG5nX2J5dGUgZmlsdGVyX3R5cGU7DQotI2VuZGlmDQotDQotLyogTmV3IG1lbWJlcnMgYWRkZWQgaW4gbGlicG5nLTEuMi4wICovDQotDQotLyogTmV3IG1lbWJlcnMgYWRkZWQgaW4gbGlicG5nLTEuMC4yIGJ1dCBmaXJzdCBlbmFibGVkIGJ5IGRlZmF1bHQgaW4gMS4yLjAgKi8NCi0jaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRA0KLSAgIHBuZ192b2lkcCBtZW1fcHRyOyAgICAgICAgICAgICAvKiB1c2VyIHN1cHBsaWVkIHN0cnVjdCBmb3IgbWVtIGZ1bmN0aW9ucyAqLw0KLSAgIHBuZ19tYWxsb2NfcHRyIG1hbGxvY19mbjsgICAgICAvKiBmdW5jdGlvbiBmb3IgYWxsb2NhdGluZyBtZW1vcnkgKi8NCi0gICBwbmdfZnJlZV9wdHIgZnJlZV9mbjsgICAgICAgICAgLyogZnVuY3Rpb24gZm9yIGZyZWVpbmcgbWVtb3J5ICovDQotI2VuZGlmDQotDQotLyogTmV3IG1lbWJlciBhZGRlZCBpbiBsaWJwbmctMS4wLjEzIGFuZCAxLjIuMCAqLw0KLSAgIHBuZ19ieXRlcCBiaWdfcm93X2J1ZjsgICAgICAgICAvKiBidWZmZXIgdG8gc2F2ZSBjdXJyZW50ICh1bmZpbHRlcmVkKSByb3cgKi8NCi0NCi0jaWZkZWYgUE5HX1JFQURfUVVBTlRJWkVfU1VQUE9SVEVEDQotLyogVGhlIGZvbGxvd2luZyB0aHJlZSBtZW1iZXJzIHdlcmUgYWRkZWQgYXQgdmVyc2lvbiAxLjAuMTQgYW5kIDEuMi40ICovDQotICAgcG5nX2J5dGVwIHF1YW50aXplX3NvcnQ7ICAgICAgICAgIC8qIHdvcmtpbmcgc29ydCBhcnJheSAqLw0KLSAgIHBuZ19ieXRlcCBpbmRleF90b19wYWxldHRlOyAgICAgICAvKiB3aGVyZSB0aGUgb3JpZ2luYWwgaW5kZXggY3VycmVudGx5IGlzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBwYWxldHRlICovDQotICAgcG5nX2J5dGVwIHBhbGV0dGVfdG9faW5kZXg7ICAgICAgIC8qIHdoaWNoIG9yaWdpbmFsIGluZGV4IHBvaW50cyB0byB0aGlzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlIGNvbG9yICovDQotI2VuZGlmDQotDQotLyogTmV3IG1lbWJlcnMgYWRkZWQgaW4gbGlicG5nLTEuMC4xNiBhbmQgMS4yLjYgKi8NCi0gICBwbmdfYnl0ZSBjb21wcmVzc2lvbl90eXBlOw0KLQ0KLSNpZmRlZiBQTkdfVVNFUl9MSU1JVFNfU1VQUE9SVEVEDQotICAgcG5nX3VpbnRfMzIgdXNlcl93aWR0aF9tYXg7DQotICAgcG5nX3VpbnRfMzIgdXNlcl9oZWlnaHRfbWF4Ow0KLQ0KLSAgIC8qIEFkZGVkIGluIGxpYnBuZy0xLjQuMDogVG90YWwgbnVtYmVyIG9mIHNQTFQsIHRleHQsIGFuZCB1bmtub3duDQotICAgICogY2h1bmtzIHRoYXQgY2FuIGJlIHN0b3JlZCAoMCBtZWFucyB1bmxpbWl0ZWQpLg0KLSAgICAqLw0KLSAgIHBuZ191aW50XzMyIHVzZXJfY2h1bmtfY2FjaGVfbWF4Ow0KLQ0KLSAgIC8qIFRvdGFsIG1lbW9yeSB0aGF0IGEgelRYdCwgc1BMVCwgaVRYdCwgaUNDUCwgb3IgdW5rbm93biBjaHVuaw0KLSAgICAqIGNhbiBvY2N1cHkgd2hlbiBkZWNvbXByZXNzZWQuICAwIG1lYW5zIHVubGltaXRlZC4NCi0gICAgKi8NCi0gICBwbmdfYWxsb2Nfc2l6ZV90IHVzZXJfY2h1bmtfbWFsbG9jX21heDsNCi0jZW5kaWYNCi0NCi0vKiBOZXcgbWVtYmVyIGFkZGVkIGluIGxpYnBuZy0xLjAuMjUgYW5kIDEuMi4xNyAqLw0KLSNpZmRlZiBQTkdfUkVBRF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQNCi0gICAvKiBUZW1wb3Jhcnkgc3RvcmFnZSBmb3IgdW5rbm93biBjaHVuayB0aGF0IHRoZSBsaWJyYXJ5IGRvZXNuJ3QgcmVjb2duaXplLA0KLSAgICAqIHVzZWQgd2hpbGUgcmVhZGluZyB0aGUgY2h1bmsuDQotICAgICovDQotICAgcG5nX3Vua25vd25fY2h1bmsgdW5rbm93bl9jaHVuazsNCi0jZW5kaWYNCi0NCi0vKiBOZXcgbWVtYmVyIGFkZGVkIGluIGxpYnBuZy0xLjIuMjYgKi8NCi0gIHBuZ19zaXplX3Qgb2xkX2JpZ19yb3dfYnVmX3NpemU7DQotDQotI2lmZGVmIFBOR19SRUFEX1NVUFBPUlRFRA0KLS8qIE5ldyBtZW1iZXIgYWRkZWQgaW4gbGlicG5nLTEuMi4zMCAqLw0KLSAgcG5nX2J5dGVwICAgICAgICByZWFkX2J1ZmZlcjsgICAgICAvKiBidWZmZXIgZm9yIHJlYWRpbmcgY2h1bmsgZGF0YSAqLw0KLSAgcG5nX2FsbG9jX3NpemVfdCByZWFkX2J1ZmZlcl9zaXplOyAvKiBjdXJyZW50IHNpemUgb2YgdGhlIGJ1ZmZlciAqLw0KLSNlbmRpZg0KLSNpZmRlZiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRA0KLSAgdUludCAgICAgICAgICAgICBJREFUX3JlYWRfc2l6ZTsgICAvKiBsaW1pdCBvbiByZWFkIGJ1ZmZlciBzaXplIGZvciBJREFUICovDQotI2VuZGlmDQotDQotI2lmZGVmIFBOR19JT19TVEFURV9TVVBQT1JURUQNCi0vKiBOZXcgbWVtYmVyIGFkZGVkIGluIGxpYnBuZy0xLjQuMCAqLw0KLSAgIHBuZ191aW50XzMyIGlvX3N0YXRlOw0KLSNlbmRpZg0KLQ0KLS8qIE5ldyBtZW1iZXIgYWRkZWQgaW4gbGlicG5nLTEuNS42ICovDQotICAgcG5nX2J5dGVwIGJpZ19wcmV2X3JvdzsNCi0NCi0vKiBOZXcgbWVtYmVyIGFkZGVkIGluIGxpYnBuZy0xLjUuNyAqLw0KLSAgIHZvaWQgKCpyZWFkX2ZpbHRlcltQTkdfRklMVEVSX1ZBTFVFX0xBU1QtMV0pKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQotICAgICAgcG5nX2J5dGVwIHJvdywgcG5nX2NvbnN0X2J5dGVwIHByZXZfcm93KTsNCi0NCi0jaWZkZWYgUE5HX1JFQURfU1VQUE9SVEVEDQotI2lmIGRlZmluZWQoUE5HX0NPTE9SU1BBQ0VfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19HQU1NQV9TVVBQT1JURUQpDQotICAgcG5nX2NvbG9yc3BhY2UgICBjb2xvcnNwYWNlOw0KLSNlbmRpZg0KLSNlbmRpZg0KLX07DQotI2VuZGlmIC8qIFBOR1NUUlVDVF9IICovDQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9meF9scG5nL3NyYy9meF9wbmcuYyBiL3NhbXBsZXMvZnhfbHBuZy9zcmMvZnhfcG5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNjU4MjYuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9meF9scG5nL3NyYy9meF9wbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQotDQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCi0NCi0jaW5jbHVkZSAiLi4vbHBuZ192MTYzL2Z4X3BuZy5jIg0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZnhfbHBuZy9zcmMvZnhfcG5nZXJyb3IuYyBiL3NhbXBsZXMvZnhfbHBuZy9zcmMvZnhfcG5nZXJyb3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU4MWI5OS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Z4X2xwbmcvc3JjL2Z4X3BuZ2Vycm9yLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KLQ0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQotDQotI2luY2x1ZGUgIi4uL2xwbmdfdjE2My9meF9wbmdlcnJvci5jIg0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZnhfbHBuZy9zcmMvZnhfcG5nZ2V0LmMgYi9zYW1wbGVzL2Z4X2xwbmcvc3JjL2Z4X3BuZ2dldC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzhkYzRlLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvZnhfbHBuZy9zcmMvZnhfcG5nZ2V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KLQ0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQotDQotI2luY2x1ZGUgIi4uL2xwbmdfdjE2My9meF9wbmdnZXQuYyINCmRpZmYgLS1naXQgYS9zYW1wbGVzL2Z4X2xwbmcvc3JjL2Z4X3BuZ21lbS5jIGIvc2FtcGxlcy9meF9scG5nL3NyYy9meF9wbmdtZW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg5MjQwOC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Z4X2xwbmcvc3JjL2Z4X3BuZ21lbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCi0NCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KLQ0KLSNpbmNsdWRlICIuLi9scG5nX3YxNjMvZnhfcG5nbWVtLmMiDQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9meF9scG5nL3NyYy9meF9wbmdwcmVhZC5jIGIvc2FtcGxlcy9meF9scG5nL3NyYy9meF9wbmdwcmVhZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDUzYmUyLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvZnhfbHBuZy9zcmMvZnhfcG5ncHJlYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQotDQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCi0NCi0jaW5jbHVkZSAiLi4vbHBuZ192MTYzL2Z4X3BuZ3ByZWFkLmMiDQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9meF9scG5nL3NyYy9meF9wbmdyZWFkLmMgYi9zYW1wbGVzL2Z4X2xwbmcvc3JjL2Z4X3BuZ3JlYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYxMmJkNS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Z4X2xwbmcvc3JjL2Z4X3BuZ3JlYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQotDQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCi0NCi0jaW5jbHVkZSAiLi4vbHBuZ192MTYzL2Z4X3BuZ3JlYWQuYyINCmRpZmYgLS1naXQgYS9zYW1wbGVzL2Z4X2xwbmcvc3JjL2Z4X3BuZ3Jpby5jIGIvc2FtcGxlcy9meF9scG5nL3NyYy9meF9wbmdyaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMyNGE4ZS4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Z4X2xwbmcvc3JjL2Z4X3BuZ3Jpby5jCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCi0NCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KLQ0KLSNpbmNsdWRlICIuLi9scG5nX3YxNjMvZnhfcG5ncmlvLmMiDQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9meF9scG5nL3NyYy9meF9wbmdydHJhbi5jIGIvc2FtcGxlcy9meF9scG5nL3NyYy9meF9wbmdydHJhbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWMzODBkLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvZnhfbHBuZy9zcmMvZnhfcG5ncnRyYW4uYworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQotDQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCi0NCi0jaW5jbHVkZSAiLi4vbHBuZ192MTYzL2Z4X3BuZ3J0cmFuLmMiDQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9meF9scG5nL3NyYy9meF9wbmdydXRpbC5jIGIvc2FtcGxlcy9meF9scG5nL3NyYy9meF9wbmdydXRpbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2RhMzU1Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvZnhfbHBuZy9zcmMvZnhfcG5ncnV0aWwuYworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQotDQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCi0NCi0jaW5jbHVkZSAiLi4vbHBuZ192MTYzL2Z4X3BuZ3J1dGlsLmMiDQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9meF9scG5nL3NyYy9meF9wbmdzZXQuYyBiL3NhbXBsZXMvZnhfbHBuZy9zcmMvZnhfcG5nc2V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YTcyMjIuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9meF9scG5nL3NyYy9meF9wbmdzZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQotDQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCi0NCi0jaW5jbHVkZSAiLi4vbHBuZ192MTYzL2Z4X3BuZ3NldC5jIg0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZnhfbHBuZy9zcmMvZnhfcG5ndHJhbnMuYyBiL3NhbXBsZXMvZnhfbHBuZy9zcmMvZnhfcG5ndHJhbnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFjNDliZi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Z4X2xwbmcvc3JjL2Z4X3BuZ3RyYW5zLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KLQ0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQotDQotI2luY2x1ZGUgIi4uL2xwbmdfdjE2My9meF9wbmd0cmFucy5jIg0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZnhfbHBuZy9zcmMvZnhfcG5nd2lvLmMgYi9zYW1wbGVzL2Z4X2xwbmcvc3JjL2Z4X3BuZ3dpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmIyMWU1Li4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvZnhfbHBuZy9zcmMvZnhfcG5nd2lvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KLQ0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQotDQotI2luY2x1ZGUgIi4uL2xwbmdfdjE2My9meF9wbmd3aW8uYyINCmRpZmYgLS1naXQgYS9zYW1wbGVzL2Z4X2xwbmcvc3JjL2Z4X3BuZ3dyaXRlLmMgYi9zYW1wbGVzL2Z4X2xwbmcvc3JjL2Z4X3BuZ3dyaXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MzRmZDAuLjAwMDAwMDAKLS0tIGEvc2FtcGxlcy9meF9scG5nL3NyYy9meF9wbmd3cml0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQotDQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCi0NCi0jaWZkZWYgX01TQ19WRVINCi0jZGVmaW5lIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTDQotI2VuZGlmDQotI2luY2x1ZGUgIi4uL2xwbmdfdjE2My9meF9wbmd3cml0ZS5jIg0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZnhfbHBuZy9zcmMvZnhfcG5nd3RyYW4uYyBiL3NhbXBsZXMvZnhfbHBuZy9zcmMvZnhfcG5nd3RyYW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEwOTVkMy4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Z4X2xwbmcvc3JjL2Z4X3BuZ3d0cmFuLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KLQ0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQotDQotI2luY2x1ZGUgIi4uL2xwbmdfdjE2My9meF9wbmd3dHJhbi5jIg0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZnhfbHBuZy9zcmMvZnhfcG5nd3V0aWwuYyBiL3NhbXBsZXMvZnhfbHBuZy9zcmMvZnhfcG5nd3V0aWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA3ZmI0MC4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2Z4X2xwbmcvc3JjL2Z4X3BuZ3d1dGlsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KLQ0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQotDQotI2luY2x1ZGUgIi4uL2xwbmdfdjE2My9meF9wbmd3dXRpbC5jIg0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvaW1hZ2VfZGlmZi5jYyBiL3NhbXBsZXMvaW1hZ2VfZGlmZi5jYwppbmRleCBjNzU2MGUxLi5kMjQ2NTI5IDEwMDY0NAotLS0gYS9zYW1wbGVzL2ltYWdlX2RpZmYuY2MKKysrIGIvc2FtcGxlcy9pbWFnZV9kaWZmLmNjCkBAIC0xOSwxMiArMTksMTIgQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSAiLi4vdGhpcmRfcGFydHkvYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAiLi4vdGhpcmRfcGFydHkvYmFzZS9udW1lcmljcy9zYWZlX2NvbnZlcnNpb25zLmgiCiAjaW5jbHVkZSAiaW1hZ2VfZGlmZl9wbmcuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfY29udmVyc2lvbnMuaCIKIAogI2lmIGRlZmluZWQoT1NfV0lOKQotI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CiAjZW5kaWYKIAogLy8gUmV0dXJuIGNvZGVzIHVzZWQgYnkgdGhpcyB1dGlsaXR5LgpAQCAtNzEsMTcgKzcxLDE3IEBACiAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiBjb21wcmVzc2VkOwotICAgIGNvbnN0IGludCBidWZfc2l6ZSA9IDEwMjQ7Ci0gICAgdW5zaWduZWQgY2hhciBidWZbYnVmX3NpemVdOworICAgIGNvbnN0IHNpemVfdCBrQnVmU2l6ZSA9IDEwMjQ7CisgICAgdW5zaWduZWQgY2hhciBidWZba0J1ZlNpemVdOwogICAgIHNpemVfdCBudW1fcmVhZCA9IDA7Ci0gICAgd2hpbGUgKChudW1fcmVhZCA9IGZyZWFkKGJ1ZiwgMSwgYnVmX3NpemUsIGYpKSA+IDApIHsKKyAgICB3aGlsZSAoKG51bV9yZWFkID0gZnJlYWQoYnVmLCAxLCBrQnVmU2l6ZSwgZikpID4gMCkgewogICAgICAgY29tcHJlc3NlZC5pbnNlcnQoY29tcHJlc3NlZC5lbmQoKSwgYnVmLCBidWYgKyBudW1fcmVhZCk7CiAgICAgfQogCiAgICAgZmNsb3NlKGYpOwogCi0gICAgaWYgKCFpbWFnZV9kaWZmX3BuZzo6RGVjb2RlUE5HKCZjb21wcmVzc2VkWzBdLCBjb21wcmVzc2VkLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFfLCAmd18sICZoXykpIHsKKyAgICBpZiAoIWltYWdlX2RpZmZfcG5nOjpEZWNvZGVQTkcoY29tcHJlc3NlZC5kYXRhKCksIGNvbXByZXNzZWQuc2l6ZSgpLCAmZGF0YV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3XywgJmhfKSkgewogICAgICAgQ2xlYXIoKTsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC05NSw1NSArOTUsNzUgQEAKIAogICAvLyBSZXR1cm5zIHRoZSBSR0JBIHZhbHVlIG9mIHRoZSBwaXhlbCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24KICAgdWludDMyX3QgcGl4ZWxfYXQoaW50IHgsIGludCB5KSBjb25zdCB7Ci0gICAgaWYgKHggPj0gMCAmJiB4IDwgd18gJiYgeSA+PSAwICYmIHkgPCBoXykKLSAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCo+KCYoZGF0YV9bKHkgKiB3XyArIHgpICogNF0pKTsKLSAgICByZXR1cm4gMDsKKyAgICBpZiAoIXBpeGVsX2luX2JvdW5kcyh4LCB5KSkKKyAgICAgIHJldHVybiAwOworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCo+KCYoZGF0YV9bcGl4ZWxfYWRkcmVzcyh4LCB5KV0pKTsKICAgfQogCi0gIHZvaWQgc2V0X3BpeGVsX2F0KGludCB4LCBpbnQgeSwgdWludDMyX3QgY29sb3IpIGNvbnN0IHsKLSAgICBpZiAoeCA+PSAwICYmIHggPCB3XyAmJiB5ID49IDAgJiYgeSA8IGhfKSB7Ci0gICAgICB2b2lkKiBhZGRyID0gJmNvbnN0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KCZkYXRhXy5mcm9udCgpKVsoeSAqIHdfICsgeCkgKiA0XTsKLSAgICAgICpyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oYWRkcikgPSBjb2xvcjsKLSAgICB9CisgIHZvaWQgc2V0X3BpeGVsX2F0KGludCB4LCBpbnQgeSwgdWludDMyX3QgY29sb3IpIHsKKyAgICBpZiAoIXBpeGVsX2luX2JvdW5kcyh4LCB5KSkKKyAgICAgIHJldHVybjsKKworICAgIHZvaWQqIGFkZHIgPSAmZGF0YV9bcGl4ZWxfYWRkcmVzcyh4LCB5KV07CisgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPihhZGRyKSA9IGNvbG9yOwogICB9CiAKICBwcml2YXRlOgotICAvLyBwaXhlbCBkaW1lbnNpb25zIG9mIHRoZSBpbWFnZQotICBpbnQgd18sIGhfOworICBib29sIHBpeGVsX2luX2JvdW5kcyhpbnQgeCwgaW50IHkpIGNvbnN0IHsKKyAgICByZXR1cm4geCA+PSAwICYmIHggPCB3XyAmJiB5ID49IDAgJiYgeSA8IGhfOworICB9CisKKyAgc2l6ZV90IHBpeGVsX2FkZHJlc3MoaW50IHgsIGludCB5KSBjb25zdCB7IHJldHVybiAoeSAqIHdfICsgeCkgKiA0OyB9CisKKyAgLy8gUGl4ZWwgZGltZW5zaW9ucyBvZiB0aGUgaW1hZ2UuCisgIGludCB3XzsKKyAgaW50IGhfOwogCiAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+IGRhdGFfOwogfTsKIAorZmxvYXQgQ2FsY3VsYXRlRGlmZmVyZW5jZVBlcmNlbnRhZ2UoY29uc3QgSW1hZ2UmIGFjdHVhbCwgaW50IHBpeGVsc19kaWZmZXJlbnQpIHsKKyAgLy8gTGlrZSB0aGUgV2ViS2l0IEltYWdlRGlmZiB0b29sLCB3ZSBkZWZpbmUgcGVyY2VudGFnZSBkaWZmZXJlbnQgaW4gdGVybXMKKyAgLy8gb2YgdGhlIHNpemUgb2YgdGhlICdhY3R1YWwnIGJpdG1hcC4KKyAgZmxvYXQgdG90YWxfcGl4ZWxzID0KKyAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihhY3R1YWwudygpKSAqIHN0YXRpY19jYXN0PGZsb2F0PihhY3R1YWwuaCgpKTsKKyAgaWYgKHRvdGFsX3BpeGVscyA9PSAwKSB7CisgICAgLy8gV2hlbiB0aGUgYml0bWFwIGlzIGVtcHR5LCB0aGV5IGFyZSAxMDAlIGRpZmZlcmVudC4KKyAgICByZXR1cm4gMTAwLjBmOworICB9CisgIHJldHVybiAxMDAuMGYgKiBwaXhlbHNfZGlmZmVyZW50IC8gdG90YWxfcGl4ZWxzOworfQorCit2b2lkIENvdW50SW1hZ2VTaXplTWlzbWF0Y2hBc1BpeGVsRGlmZmVyZW5jZShjb25zdCBJbWFnZSYgYmFzZWxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbWFnZSYgYWN0dWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBwaXhlbHNfZGlmZmVyZW50KSB7CisgIGludCB3ID0gc3RkOjptaW4oYmFzZWxpbmUudygpLCBhY3R1YWwudygpKTsKKyAgaW50IGggPSBzdGQ6Om1pbihiYXNlbGluZS5oKCksIGFjdHVhbC5oKCkpOworCisgIC8vIENvdW50IHBpeGVscyB0aGF0IGFyZSBhIGRpZmZlcmVuY2UgaW4gc2l6ZSBhcyBhbHNvIGJlaW5nIGRpZmZlcmVudC4KKyAgaW50IG1heF93ID0gc3RkOjptYXgoYmFzZWxpbmUudygpLCBhY3R1YWwudygpKTsKKyAgaW50IG1heF9oID0gc3RkOjptYXgoYmFzZWxpbmUuaCgpLCBhY3R1YWwuaCgpKTsKKyAgLy8gVGhlc2UgcGl4ZWxzIGFyZSBvZmYgdGhlIHJpZ2h0IHNpZGUsIG5vdCBpbmNsdWRpbmcgdGhlIGxvd2VyIHJpZ2h0IGNvcm5lci4KKyAgKnBpeGVsc19kaWZmZXJlbnQgKz0gKG1heF93IC0gdykgKiBoOworICAvLyBUaGVzZSBwaXhlbHMgYXJlIGFsb25nIHRoZSBib3R0b20sIGluY2x1ZGluZyB0aGUgbG93ZXIgcmlnaHQgY29ybmVyLgorICAqcGl4ZWxzX2RpZmZlcmVudCArPSAobWF4X2ggLSBoKSAqIG1heF93OworfQorCiBmbG9hdCBQZXJjZW50YWdlRGlmZmVyZW50KGNvbnN0IEltYWdlJiBiYXNlbGluZSwgY29uc3QgSW1hZ2UmIGFjdHVhbCkgewogICBpbnQgdyA9IHN0ZDo6bWluKGJhc2VsaW5lLncoKSwgYWN0dWFsLncoKSk7CiAgIGludCBoID0gc3RkOjptaW4oYmFzZWxpbmUuaCgpLCBhY3R1YWwuaCgpKTsKIAogICAvLyBDb21wdXRlIHBpeGVscyBkaWZmZXJlbnQgaW4gdGhlIG92ZXJsYXAuCiAgIGludCBwaXhlbHNfZGlmZmVyZW50ID0gMDsKLSAgZm9yIChpbnQgeSA9IDA7IHkgPCBoOyB5KyspIHsKLSAgICBmb3IgKGludCB4ID0gMDsgeCA8IHc7IHgrKykgeworICBmb3IgKGludCB5ID0gMDsgeSA8IGg7ICsreSkgeworICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgKyt4KSB7CiAgICAgICBpZiAoYmFzZWxpbmUucGl4ZWxfYXQoeCwgeSkgIT0gYWN0dWFsLnBpeGVsX2F0KHgsIHkpKQotICAgICAgICBwaXhlbHNfZGlmZmVyZW50Kys7CisgICAgICAgICsrcGl4ZWxzX2RpZmZlcmVudDsKICAgICB9CiAgIH0KIAotICAvLyBDb3VudCBwaXhlbHMgdGhhdCBhcmUgYSBkaWZmZXJlbmNlIGluIHNpemUgYXMgYWxzbyBiZWluZyBkaWZmZXJlbnQuCi0gIGludCBtYXhfdyA9IHN0ZDo6bWF4KGJhc2VsaW5lLncoKSwgYWN0dWFsLncoKSk7Ci0gIGludCBtYXhfaCA9IHN0ZDo6bWF4KGJhc2VsaW5lLmgoKSwgYWN0dWFsLmgoKSk7Ci0gIC8vIFRoZXNlIHBpeGVscyBhcmUgb2ZmIHRoZSByaWdodCBzaWRlLCBub3QgaW5jbHVkaW5nIHRoZSBsb3dlciByaWdodCBjb3JuZXIuCi0gIHBpeGVsc19kaWZmZXJlbnQgKz0gKG1heF93IC0gdykgKiBoOwotICAvLyBUaGVzZSBwaXhlbHMgYXJlIGFsb25nIHRoZSBib3R0b20sIGluY2x1ZGluZyB0aGUgbG93ZXIgcmlnaHQgY29ybmVyLgotICBwaXhlbHNfZGlmZmVyZW50ICs9IChtYXhfaCAtIGgpICogbWF4X3c7Ci0KLSAgLy8gTGlrZSB0aGUgV2ViS2l0IEltYWdlRGlmZiB0b29sLCB3ZSBkZWZpbmUgcGVyY2VudGFnZSBkaWZmZXJlbnQgaW4gdGVybXMKLSAgLy8gb2YgdGhlIHNpemUgb2YgdGhlICdhY3R1YWwnIGJpdG1hcC4KLSAgZmxvYXQgdG90YWxfcGl4ZWxzID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGFjdHVhbC53KCkpICoKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGFjdHVhbC5oKCkpOwotICBpZiAodG90YWxfcGl4ZWxzID09IDApIHsKLSAgICAvLyBXaGVuIHRoZSBiaXRtYXAgaXMgZW1wdHksIHRoZXkgYXJlIDEwMCUgZGlmZmVyZW50LgotICAgIHJldHVybiAxMDAuMGY7Ci0gIH0KLSAgcmV0dXJuIDEwMC4wZiAqIHBpeGVsc19kaWZmZXJlbnQgLyB0b3RhbF9waXhlbHM7CisgIENvdW50SW1hZ2VTaXplTWlzbWF0Y2hBc1BpeGVsRGlmZmVyZW5jZShiYXNlbGluZSwgYWN0dWFsLCAmcGl4ZWxzX2RpZmZlcmVudCk7CisgIHJldHVybiBDYWxjdWxhdGVEaWZmZXJlbmNlUGVyY2VudGFnZShhY3R1YWwsIHBpeGVsc19kaWZmZXJlbnQpOwogfQogCiAvLyBGSVhNRTogUmVwbGFjZSB3aXRoIHVub3JkZXJlZF9tYXAgd2hlbiBhdmFpbGFibGUuCkBAIC0xNTksNDMgKzE3OSwyOCBAQAogCiAgIC8vIENvdW50IG9jY3VyZW5jZXMgb2YgZWFjaCBSR0JBIHBpeGVsIHZhbHVlIG9mIGJhc2VsaW5lIGluIHRoZSBvdmVybGFwLgogICBSZ2JhVG9Db3VudE1hcCBiYXNlbGluZV9oaXN0b2dyYW07Ci0gIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKSB7Ci0gICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgZm9yIChpbnQgeSA9IDA7IHkgPCBoOyArK3kpIHsKKyAgICBmb3IgKGludCB4ID0gMDsgeCA8IHc7ICsreCkgewogICAgICAgLy8gaGFzaF9tYXAgb3BlcmF0b3JbXSBpbnNlcnRzIGEgMCAoZGVmYXVsdCBjb25zdHJ1Y3RvcikgaWYga2V5IG5vdCBmb3VuZC4KLSAgICAgIGJhc2VsaW5lX2hpc3RvZ3JhbVtiYXNlbGluZS5waXhlbF9hdCh4LCB5KV0rKzsKKyAgICAgICsrYmFzZWxpbmVfaGlzdG9ncmFtW2Jhc2VsaW5lLnBpeGVsX2F0KHgsIHkpXTsKICAgICB9CiAgIH0KIAogICAvLyBDb21wdXRlIHBpeGVscyBkaWZmZXJlbnQgaW4gdGhlIGhpc3RvZ3JhbSBvZiB0aGUgb3ZlcmxhcC4KICAgaW50IHBpeGVsc19kaWZmZXJlbnQgPSAwOwotICBmb3IgKGludCB5ID0gMDsgeSA8IGg7IHkrKykgewotICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7CisgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgKyt5KSB7CisgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyArK3gpIHsKICAgICAgIHVpbnQzMl90IGFjdHVhbF9yZ2JhID0gYWN0dWFsLnBpeGVsX2F0KHgsIHkpOwogICAgICAgUmdiYVRvQ291bnRNYXA6Oml0ZXJhdG9yIGl0ID0gYmFzZWxpbmVfaGlzdG9ncmFtLmZpbmQoYWN0dWFsX3JnYmEpOwogICAgICAgaWYgKGl0ICE9IGJhc2VsaW5lX2hpc3RvZ3JhbS5lbmQoKSAmJiBpdC0+c2Vjb25kID4gMCkKLSAgICAgICAgaXQtPnNlY29uZC0tOworICAgICAgICAtLWl0LT5zZWNvbmQ7CiAgICAgICBlbHNlCi0gICAgICAgIHBpeGVsc19kaWZmZXJlbnQrKzsKKyAgICAgICAgKytwaXhlbHNfZGlmZmVyZW50OwogICAgIH0KICAgfQogCi0gIC8vIENvdW50IHBpeGVscyB0aGF0IGFyZSBhIGRpZmZlcmVuY2UgaW4gc2l6ZSBhcyBhbHNvIGJlaW5nIGRpZmZlcmVudC4KLSAgaW50IG1heF93ID0gc3RkOjptYXgoYmFzZWxpbmUudygpLCBhY3R1YWwudygpKTsKLSAgaW50IG1heF9oID0gc3RkOjptYXgoYmFzZWxpbmUuaCgpLCBhY3R1YWwuaCgpKTsKLSAgLy8gVGhlc2UgcGl4ZWxzIGFyZSBvZmYgdGhlIHJpZ2h0IHNpZGUsIG5vdCBpbmNsdWRpbmcgdGhlIGxvd2VyIHJpZ2h0IGNvcm5lci4KLSAgcGl4ZWxzX2RpZmZlcmVudCArPSAobWF4X3cgLSB3KSAqIGg7Ci0gIC8vIFRoZXNlIHBpeGVscyBhcmUgYWxvbmcgdGhlIGJvdHRvbSwgaW5jbHVkaW5nIHRoZSBsb3dlciByaWdodCBjb3JuZXIuCi0gIHBpeGVsc19kaWZmZXJlbnQgKz0gKG1heF9oIC0gaCkgKiBtYXhfdzsKLQotICAvLyBMaWtlIHRoZSBXZWJLaXQgSW1hZ2VEaWZmIHRvb2wsIHdlIGRlZmluZSBwZXJjZW50YWdlIGRpZmZlcmVudCBpbiB0ZXJtcwotICAvLyBvZiB0aGUgc2l6ZSBvZiB0aGUgJ2FjdHVhbCcgYml0bWFwLgotICBmbG9hdCB0b3RhbF9waXhlbHMgPSBzdGF0aWNfY2FzdDxmbG9hdD4oYWN0dWFsLncoKSkgKgotICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oYWN0dWFsLmgoKSk7Ci0gIGlmICh0b3RhbF9waXhlbHMgPT0gMCkgewotICAgIC8vIFdoZW4gdGhlIGJpdG1hcCBpcyBlbXB0eSwgdGhleSBhcmUgMTAwJSBkaWZmZXJlbnQuCi0gICAgcmV0dXJuIDEwMC4wZjsKLSAgfQotICByZXR1cm4gMTAwLjBmICogcGl4ZWxzX2RpZmZlcmVudCAvIHRvdGFsX3BpeGVsczsKKyAgQ291bnRJbWFnZVNpemVNaXNtYXRjaEFzUGl4ZWxEaWZmZXJlbmNlKGJhc2VsaW5lLCBhY3R1YWwsICZwaXhlbHNfZGlmZmVyZW50KTsKKyAgcmV0dXJuIENhbGN1bGF0ZURpZmZlcmVuY2VQZXJjZW50YWdlKGFjdHVhbCwgcGl4ZWxzX2RpZmZlcmVudCk7CiB9CiAKIHZvaWQgUHJpbnRIZWxwKCkgewpAQCAtMjMxLDEwICsyMzYsMTEgQEAKICAgICBwcmludGYoImhpc3RvZ3JhbSBkaWZmOiAlMDEuMmYlJSAlc1xuIiwgcGVyY2VudCwgcGFzc2VkKTsKICAgfQogCi0gIGNvbnN0IGNoYXIqIGRpZmZfbmFtZSA9IGNvbXBhcmVfaGlzdG9ncmFtcyA/ICJleGFjdCBkaWZmIiA6ICJkaWZmIjsKKyAgY29uc3QgY2hhciogY29uc3QgZGlmZl9uYW1lID0gY29tcGFyZV9oaXN0b2dyYW1zID8gImV4YWN0IGRpZmYiIDogImRpZmYiOwogICBmbG9hdCBwZXJjZW50ID0gUGVyY2VudGFnZURpZmZlcmVudChhY3R1YWxfaW1hZ2UsIGJhc2VsaW5lX2ltYWdlKTsKLSAgY29uc3QgY2hhciogcGFzc2VkID0gcGVyY2VudCA+IDAuMCA/ICJmYWlsZWQiIDogInBhc3NlZCI7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHBhc3NlZCA9IHBlcmNlbnQgPiAwLjAgPyAiZmFpbGVkIiA6ICJwYXNzZWQiOwogICBwcmludGYoIiVzOiAlMDEuMmYlJSAlc1xuIiwgZGlmZl9uYW1lLCBwZXJjZW50LCBwYXNzZWQpOworCiAgIGlmIChwZXJjZW50ID4gMC4wKSB7CiAgICAgLy8gZmFpbHVyZTogVGhlIFdlYktpdCB2ZXJzaW9uIGFsc28gd3JpdGVzIHRoZSBkaWZmZXJlbmNlIGltYWdlIHRvCiAgICAgLy8gc3Rkb3V0LCB3aGljaCBzZWVtcyBleGNlc3NpdmUgZm9yIG91ciBuZWVkcy4KQEAgLTI0Miw1MiArMjQ4LDYgQEAKICAgfQogICAvLyBzdWNjZXNzCiAgIHJldHVybiBrU3RhdHVzU2FtZTsKLQotLyogVW50ZXN0ZWQgbW9kZSB0aGF0IGFjdHMgbGlrZSBXZWJLaXQncyBpbWFnZSBjb21wYXJhdG9yLiBJIHdyb3RlIHRoaXMgYnV0Ci0gICBkZWNpZGVkIGl0J3MgdG9vIGNvbXBsaWNhdGVkLiBXZSBtYXkgdXNlIGl0IGluIHRoZSBmdXR1cmUgaWYgaXQgbG9va3MgdXNlZnVsCi0KLSAgY2hhciBidWZmZXJbMjA0OF07Ci0gIHdoaWxlIChmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBzdGRpbikpIHsKLQotICAgIGlmIChzdHJuY21wKCJDb250ZW50LWxlbmd0aDogIiwgYnVmZmVyLCAxNikgPT0gMCkgewotICAgICAgY2hhciogY29udGV4dDsKLSAgICAgIHN0cnRva19zKGJ1ZmZlciwgIiAiLCAmY29udGV4dCk7Ci0gICAgICBpbnQgaW1hZ2Vfc2l6ZSA9IHN0cnRvbChzdHJ0b2tfcyhOVUxMLCAiICIsICZjb250ZXh0KSwgTlVMTCwgMTApOwotCi0gICAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgIGlmIChpbWFnZV9zaXplID4gMCAmJiBhY3R1YWxfaW1hZ2UuaGFzX2ltYWdlKCkgPT0gMCkgewotICAgICAgICBpZiAoIWFjdHVhbF9pbWFnZS5DcmVhdGVGcm9tU3RkaW4oaW1hZ2Vfc2l6ZSkpIHsKLSAgICAgICAgICBmcHV0cygiRXJyb3IsIGlucHV0IGltYWdlIGNhbid0IGJlIGRlY29kZWQuXG4iLCBzdGRlcnIpOwotICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGltYWdlX3NpemUgPiAwICYmIGJhc2VsaW5lX2ltYWdlLmhhc19pbWFnZSgpID09IDApIHsKLSAgICAgICAgaWYgKCFiYXNlbGluZV9pbWFnZS5DcmVhdGVGcm9tU3RkaW4oaW1hZ2Vfc2l6ZSkpIHsKLSAgICAgICAgICBmcHV0cygiRXJyb3IsIGJhc2VsaW5lIGltYWdlIGNhbid0IGJlIGRlY29kZWQuXG4iLCBzdGRlcnIpOwotICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmcHV0cygiRXJyb3IsIGltYWdlIHNpemUgbXVzdCBiZSBzcGVjaWZpZWQuXG4iLCBzdGRlcnIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoYWN0dWFsX2ltYWdlLmhhc19pbWFnZSgpICYmIGJhc2VsaW5lX2ltYWdlLmhhc19pbWFnZSgpKSB7Ci0gICAgICBmbG9hdCBwZXJjZW50ID0gUGVyY2VudGFnZURpZmZlcmVudChhY3R1YWxfaW1hZ2UsIGJhc2VsaW5lX2ltYWdlKTsKLSAgICAgIGlmIChwZXJjZW50ID4gMC4wKSB7Ci0gICAgICAgIC8vIGZhaWx1cmU6IFRoZSBXZWJLaXQgdmVyc2lvbiBhbHNvIHdyaXRlcyB0aGUgZGlmZmVyZW5jZSBpbWFnZSB0bwotICAgICAgICAvLyBzdGRvdXQsIHdoaWNoIHNlZW1zIGV4Y2Vzc2l2ZSBmb3Igb3VyIG5lZWRzLgotICAgICAgICBwcmludGYoImRpZmY6ICUwMS4yZiUlIGZhaWxlZFxuIiwgcGVyY2VudCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBzdWNjZXNzCi0gICAgICAgIHByaW50ZigiZGlmZjogJTAxLjJmJSUgcGFzc2VkXG4iLCBwZXJjZW50KTsKLSAgICAgIH0KLSAgICAgIGFjdHVhbF9pbWFnZS5DbGVhcigpOwotICAgICAgYmFzZWxpbmVfaW1hZ2UuQ2xlYXIoKTsKLSAgICB9Ci0KLSAgICBmZmx1c2goc3Rkb3V0KTsKLSAgfQotKi8KIH0KIAogYm9vbCBDcmVhdGVJbWFnZURpZmYoY29uc3QgSW1hZ2UmIGltYWdlMSwgY29uc3QgSW1hZ2UmIGltYWdlMiwgSW1hZ2UqIG91dCkgewpAQCAtMjk4LDggKzI1OCw4IEBACiAKICAgLy8gVE9ETyhlc3RhZGUpOiBkbyBzb21ldGhpbmcgd2l0aCB0aGUgZXh0cmEgcGl4ZWxzIGlmIHRoZSBpbWFnZSBzaXplcwogICAvLyBhcmUgZGlmZmVyZW50LgotICBmb3IgKGludCB5ID0gMDsgeSA8IGg7IHkrKykgewotICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7CisgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgKyt5KSB7CisgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyArK3gpIHsKICAgICAgIHVpbnQzMl90IGJhc2VfcGl4ZWwgPSBpbWFnZTEucGl4ZWxfYXQoeCwgeSk7CiAgICAgICBpZiAoYmFzZV9waXhlbCAhPSBpbWFnZTIucGl4ZWxfYXQoeCwgeSkpIHsKICAgICAgICAgLy8gU2V0IGRpZmZlcmluZyBwaXhlbHMgcmVkLgpAQCAtMzQyLDEyICszMDIsMTIgQEAKICAgICAgIGRpZmZfaW1hZ2UuZGF0YSgpLCBkaWZmX2ltYWdlLncoKSwgZGlmZl9pbWFnZS5oKCksCiAgICAgICBkaWZmX2ltYWdlLncoKSAqIDQsICZwbmdfZW5jb2RpbmcpOwogCi0gIEZJTEUgKmYgPSBmb3BlbihvdXRfZmlsZS5jX3N0cigpLCAid2IiKTsKKyAgRklMRSogZiA9IGZvcGVuKG91dF9maWxlLmNfc3RyKCksICJ3YiIpOwogICBpZiAoIWYpCiAgICAgcmV0dXJuIGtTdGF0dXNFcnJvcjsKIAogICBzaXplX3Qgc2l6ZSA9IHBuZ19lbmNvZGluZy5zaXplKCk7Ci0gIGNoYXIgKnB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZwbmdfZW5jb2RpbmcuZnJvbnQoKSk7CisgIGNoYXIqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZwbmdfZW5jb2RpbmcuZnJvbnQoKSk7CiAgIGlmIChmd3JpdGUocHRyLCAxLCBzaXplLCBmKSAhPSBzaXplKQogICAgIHJldHVybiBrU3RhdHVzRXJyb3I7CiAKQEAgLTM3MiwxOCArMzMyLDEyIEBACiAgICAgICBwcm9kdWNlX2RpZmZfaW1hZ2UgPSB0cnVlOwogICAgIH0KICAgfQotICBpZiAoaSA8IGFyZ2MpIHsKLSAgICBmaWxlbmFtZTEgPSBhcmd2W2ldOwotICAgICsraTsKLSAgfQotICBpZiAoaSA8IGFyZ2MpIHsKLSAgICBmaWxlbmFtZTIgPSBhcmd2W2ldOwotICAgICsraTsKLSAgfQotICBpZiAoaSA8IGFyZ2MpIHsKLSAgICBkaWZmX2ZpbGVuYW1lID0gYXJndltpXTsKLSAgICArK2k7Ci0gIH0KKyAgaWYgKGkgPCBhcmdjKQorICAgIGZpbGVuYW1lMSA9IGFyZ3ZbaSsrXTsKKyAgaWYgKGkgPCBhcmdjKQorICAgIGZpbGVuYW1lMiA9IGFyZ3ZbaSsrXTsKKyAgaWYgKGkgPCBhcmdjKQorICAgIGRpZmZfZmlsZW5hbWUgPSBhcmd2W2krK107CiAKICAgaWYgKHByb2R1Y2VfZGlmZl9pbWFnZSkgewogICAgIGlmICghZGlmZl9maWxlbmFtZS5lbXB0eSgpKSB7CmRpZmYgLS1naXQgYS9zYW1wbGVzL2ltYWdlX2RpZmZfcG5nLmNjIGIvc2FtcGxlcy9pbWFnZV9kaWZmX3BuZy5jYwppbmRleCAwNGMyNTkxLi42YWQ3Zjg4IDEwMDY0NAotLS0gYS9zYW1wbGVzL2ltYWdlX2RpZmZfcG5nLmNjCisrKyBiL3NhbXBsZXMvaW1hZ2VfZGlmZl9wbmcuY2MKQEAgLTE2LDkgKzE2LDkgQEAKIAogI2luY2x1ZGUgPHN0cmluZz4KIAotI2luY2x1ZGUgIi4uL3RoaXJkX3BhcnR5L2Jhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgIi4uL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9pbmNsdWRlL2Z4X3psaWIuaCIKLSNpbmNsdWRlICJmeF9scG5nL2luY2x1ZGUvZnhfcG5nLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9sb2dnaW5nLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbHBuZ192MTYzL3BuZy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L3psaWJfdjEyOC96bGliLmgiCiAKIG5hbWVzcGFjZSBpbWFnZV9kaWZmX3BuZyB7CiAKZGlmZiAtLWdpdCBhL3NhbXBsZXMvaW1hZ2VfZGlmZl9wbmcuaCBiL3NhbXBsZXMvaW1hZ2VfZGlmZl9wbmcuaAppbmRleCA5ZmViYjM3Li43ZTBhZmVjIDEwMDY0NAotLS0gYS9zYW1wbGVzL2ltYWdlX2RpZmZfcG5nLmgKKysrIGIvc2FtcGxlcy9pbWFnZV9kaWZmX3BuZy5oCkBAIC0xMiw5ICsxMiwxMSBAQAogbmFtZXNwYWNlIGltYWdlX2RpZmZfcG5nIHsKIAogLy8gRGVjb2RlIGEgUE5HIGludG8gYW4gUkdCQSBwaXhlbCBhcnJheS4KLWJvb2wgRGVjb2RlUE5HKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGlucHV0LCBzaXplX3QgaW5wdXRfc2l6ZSwKK2Jvb2wgRGVjb2RlUE5HKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGlucHV0LAorICAgICAgICAgICAgICAgc2l6ZV90IGlucHV0X3NpemUsCiAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiogb3V0cHV0LAotICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOworICAgICAgICAgICAgICAgaW50KiB3aWR0aCwKKyAgICAgICAgICAgICAgIGludCogaGVpZ2h0KTsKIAogLy8gRW5jb2RlIGFuIFJHQkEgcGl4ZWwgYXJyYXkgaW50byBhIFBORy4KIGJvb2wgRW5jb2RlUkdCQVBORyhjb25zdCB1bnNpZ25lZCBjaGFyKiBpbnB1dCwKZGlmZiAtLWdpdCBhL3NhbXBsZXMvcGRmaXVtX3Rlc3QuY2MgYi9zYW1wbGVzL3BkZml1bV90ZXN0LmNjCmluZGV4IGRhMzNmODAuLmRiZDkxYzMgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvcGRmaXVtX3Rlc3QuY2MKKysrIGIvc2FtcGxlcy9wZGZpdW1fdGVzdC5jYwpAQCAtMTMsMjAgKzEzLDIyIEBACiAjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKLSNpbmNsdWRlICIuLi9wdWJsaWMvZnBkZl9kYXRhYXZhaWwuaCIKLSNpbmNsdWRlICIuLi9wdWJsaWMvZnBkZl9leHQuaCIKLSNpbmNsdWRlICIuLi9wdWJsaWMvZnBkZl9mb3JtZmlsbC5oIgotI2luY2x1ZGUgIi4uL3B1YmxpYy9mcGRmX3RleHQuaCIKLSNpbmNsdWRlICIuLi9wdWJsaWMvZnBkZnZpZXcuaCIKICNpbmNsdWRlICJpbWFnZV9kaWZmX3BuZy5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2RhdGFhdmFpbC5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2VkaXQuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9leHQuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9mb3JtZmlsbC5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX3RleHQuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZnZpZXcuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL3Rlc3Rfc3VwcG9ydC5oIgorCisjaWZkZWYgUERGX0VOQUJMRV9WOAogI2luY2x1ZGUgInY4L2luY2x1ZGUvbGlicGxhdGZvcm0vbGlicGxhdGZvcm0uaCIKICNpbmNsdWRlICJ2OC9pbmNsdWRlL3Y4LmgiCisjZW5kaWYgIC8vIFBERl9FTkFCTEVfVjgKIAogI2lmZGVmIF9XSU4zMgogI2RlZmluZSBzbnByaW50ZiBfc25wcmludGYKLSNkZWZpbmUgUEFUSF9TRVBBUkFUT1IgJ1xcJwotI2Vsc2UKLSNkZWZpbmUgUEFUSF9TRVBBUkFUT1IgJy8nCiAjZW5kaWYKIAogZW51bSBPdXRwdXRGb3JtYXQgewpAQCAtNDYsNzQgKzQ4LDkgQEAKICAgc3RkOjpzdHJpbmcgc2NhbGVfZmFjdG9yX2FzX3N0cmluZzsKICAgc3RkOjpzdHJpbmcgZXhlX3BhdGg7CiAgIHN0ZDo6c3RyaW5nIGJpbl9kaXJlY3Rvcnk7CisgIHN0ZDo6c3RyaW5nIGZvbnRfZGlyZWN0b3J5OwogfTsKIAotLy8gUmVhZHMgdGhlIGVudGlyZSBjb250ZW50cyBvZiBhIGZpbGUgaW50byBhIG5ld2x5IG1hbGxvYydkIGJ1ZmZlci4KLXN0YXRpYyBjaGFyKiBHZXRGaWxlQ29udGVudHMoY29uc3QgY2hhciogZmlsZW5hbWUsIHNpemVfdCogcmV0bGVuKSB7Ci0gIEZJTEUqIGZpbGUgPSBmb3BlbihmaWxlbmFtZSwgInJiIik7Ci0gIGlmICghZmlsZSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW46ICVzXG4iLCBmaWxlbmFtZSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgKHZvaWQpIGZzZWVrKGZpbGUsIDAsIFNFRUtfRU5EKTsKLSAgc2l6ZV90IGZpbGVfbGVuZ3RoID0gZnRlbGwoZmlsZSk7Ci0gIGlmICghZmlsZV9sZW5ndGgpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICAodm9pZCkgZnNlZWsoZmlsZSwgMCwgU0VFS19TRVQpOwotICBjaGFyKiBidWZmZXIgPSAoY2hhciopIG1hbGxvYyhmaWxlX2xlbmd0aCk7Ci0gIGlmICghYnVmZmVyKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgc2l6ZV90IGJ5dGVzX3JlYWQgPSBmcmVhZChidWZmZXIsIDEsIGZpbGVfbGVuZ3RoLCBmaWxlKTsKLSAgKHZvaWQpIGZjbG9zZShmaWxlKTsKLSAgaWYgKGJ5dGVzX3JlYWQgIT0gZmlsZV9sZW5ndGgpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byByZWFkOiAlc1xuIiwgZmlsZW5hbWUpOwotICAgIGZyZWUoYnVmZmVyKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICAqcmV0bGVuID0gYnl0ZXNfcmVhZDsKLSAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotI2lmZGVmIFY4X1VTRV9FWFRFUk5BTF9TVEFSVFVQX0RBVEEKLS8vIFJldHVybnMgdGhlIGZ1bGwgcGF0aCBmb3IgYW4gZXh0ZXJuYWwgVjggZGF0YSBmaWxlIGJhc2VkIG9uIGVpdGhlcgotLy8gdGhlIGN1cnJlY3QgZXhlY3R1YWJsZSBwYXRoIG9yIGFuIGV4cGxpY2l0IG92ZXJyaWRlLgotc3RhdGljIHN0ZDo6c3RyaW5nIEdldEZ1bGxQYXRoRm9yU25hcHNob3RGaWxlKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKSB7Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgaWYgKCFvcHRpb25zLmJpbl9kaXJlY3RvcnkuZW1wdHkoKSkgewotICAgIHJlc3VsdCA9IG9wdGlvbnMuYmluX2RpcmVjdG9yeTsKLSAgICBpZiAoKm9wdGlvbnMuYmluX2RpcmVjdG9yeS5yYmVnaW4oKSAhPSBQQVRIX1NFUEFSQVRPUikgewotICAgICAgcmVzdWx0ICs9IFBBVEhfU0VQQVJBVE9SOwotICAgIH0KLSAgfSBlbHNlIGlmICghb3B0aW9ucy5leGVfcGF0aC5lbXB0eSgpKSB7Ci0gICAgc2l6ZV90IGxhc3Rfc2VwYXJhdG9yID0gb3B0aW9ucy5leGVfcGF0aC5yZmluZChQQVRIX1NFUEFSQVRPUik7Ci0gICAgaWYgKGxhc3Rfc2VwYXJhdG9yICE9IHN0ZDo6c3RyaW5nOjpucG9zKSAgewotICAgICAgcmVzdWx0ID0gb3B0aW9ucy5leGVfcGF0aC5zdWJzdHIoMCwgbGFzdF9zZXBhcmF0b3IgKyAxKTsKLSAgICB9Ci0gIH0KLSAgcmVzdWx0ICs9IGZpbGVuYW1lOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBSZWFkcyBhbiBleHRlbmFsIFY4IGRhdGEgZmlsZSBmcm9tIHRoZSB8b3B0aW9uc3wtaW5kaWNhdGVkIGxvY2F0aW9uLAotLy8gcmV0dXJpbmcgdHJ1ZSBvbiBzdWNjZXNzIGFuZCBmYWxzZSBvbiBlcnJvci4KLXN0YXRpYyBib29sIEdldEV4dGVybmFsRGF0YShjb25zdCBPcHRpb25zJiBvcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiaW5fZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OlN0YXJ0dXBEYXRhKiByZXN1bHRfZGF0YSkgewotICBzdGQ6OnN0cmluZyBmdWxsX3BhdGggPSBHZXRGdWxsUGF0aEZvclNuYXBzaG90RmlsZShvcHRpb25zLCBiaW5fZmlsZW5hbWUpOwotICBzaXplX3QgZGF0YV9sZW5ndGggPSAwOwotICBjaGFyKiBkYXRhX2J1ZmZlciA9IEdldEZpbGVDb250ZW50cyhmdWxsX3BhdGguY19zdHIoKSwgJmRhdGFfbGVuZ3RoKTsKLSAgaWYgKCFkYXRhX2J1ZmZlcikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXN1bHRfZGF0YS0+ZGF0YSA9IGNvbnN0X2Nhc3Q8Y29uc3QgY2hhcio+KGRhdGFfYnVmZmVyKTsKLSAgcmVzdWx0X2RhdGEtPnJhd19zaXplID0gc3RhdGljX2Nhc3Q8aW50PihkYXRhX2xlbmd0aCk7Ci0gIHJldHVybiB0cnVlOwotfQotI2VuZGlmICAvLyBWOF9VU0VfRVhURVJOQUxfU1RBUlRVUF9EQVRBCi0KIHN0YXRpYyBib29sIENoZWNrRGltZW5zaW9ucyhpbnQgc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKICAgaWYgKHN0cmlkZSA8IDAgfHwgd2lkdGggPCAwIHx8IGhlaWdodCA8IDApCiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTQzLDIyICs4MCwyMCBAQAogICAvLyBTb3VyY2UgZGF0YSBpcyBCLCBHLCBSLCB1bnVzZWQuCiAgIC8vIERlc3QgZGF0YSBpcyBSLCBHLCBCLgogICBjaGFyKiByZXN1bHQgPSBuZXcgY2hhcltvdXRfbGVuXTsKLSAgaWYgKHJlc3VsdCkgewotICAgIGZvciAoaW50IGggPSAwOyBoIDwgaGVpZ2h0OyArK2gpIHsKLSAgICAgIGNvbnN0IGNoYXIqIHNyY19saW5lID0gYnVmZmVyICsgKHN0cmlkZSAqIGgpOwotICAgICAgY2hhciogZGVzdF9saW5lID0gcmVzdWx0ICsgKHdpZHRoICogaCAqIDMpOwotICAgICAgZm9yIChpbnQgdyA9IDA7IHcgPCB3aWR0aDsgKyt3KSB7Ci0gICAgICAgIC8vIFIKLSAgICAgICAgZGVzdF9saW5lW3cgKiAzXSA9IHNyY19saW5lWyh3ICogNCkgKyAyXTsKLSAgICAgICAgLy8gRwotICAgICAgICBkZXN0X2xpbmVbKHcgKiAzKSArIDFdID0gc3JjX2xpbmVbKHcgKiA0KSArIDFdOwotICAgICAgICAvLyBCCi0gICAgICAgIGRlc3RfbGluZVsodyAqIDMpICsgMl0gPSBzcmNfbGluZVt3ICogNF07Ci0gICAgICB9CisgIGZvciAoaW50IGggPSAwOyBoIDwgaGVpZ2h0OyArK2gpIHsKKyAgICBjb25zdCBjaGFyKiBzcmNfbGluZSA9IGJ1ZmZlciArIChzdHJpZGUgKiBoKTsKKyAgICBjaGFyKiBkZXN0X2xpbmUgPSByZXN1bHQgKyAod2lkdGggKiBoICogMyk7CisgICAgZm9yIChpbnQgdyA9IDA7IHcgPCB3aWR0aDsgKyt3KSB7CisgICAgICAvLyBSCisgICAgICBkZXN0X2xpbmVbdyAqIDNdID0gc3JjX2xpbmVbKHcgKiA0KSArIDJdOworICAgICAgLy8gRworICAgICAgZGVzdF9saW5lWyh3ICogMykgKyAxXSA9IHNyY19saW5lWyh3ICogNCkgKyAxXTsKKyAgICAgIC8vIEIKKyAgICAgIGRlc3RfbGluZVsodyAqIDMpICsgMl0gPSBzcmNfbGluZVt3ICogNF07CiAgICAgfQotICAgIGZ3cml0ZShyZXN1bHQsIG91dF9sZW4sIDEsIGZwKTsKLSAgICBkZWxldGUgW10gcmVzdWx0OwogICB9CisgIGZ3cml0ZShyZXN1bHQsIG91dF9sZW4sIDEsIGZwKTsKKyAgZGVsZXRlW10gcmVzdWx0OwogICBmY2xvc2UoZnApOwogfQogCkBAIC0xOTUsMTYgKzEzMCwxNSBAQAogICBpZiAoYnl0ZXNfd3JpdHRlbiAhPSBwbmdfZW5jb2Rpbmcuc2l6ZSgpKQogICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHdyaXRlIHRvICAlc1xuIiwgZmlsZW5hbWUpOwogCi0gICh2b2lkKSBmY2xvc2UoZnApOworICAodm9pZClmY2xvc2UoZnApOwogfQogCiAjaWZkZWYgX1dJTjMyCiBzdGF0aWMgdm9pZCBXcml0ZUJtcChjb25zdCBjaGFyKiBwZGZfbmFtZSwgaW50IG51bSwgY29uc3Qgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gIGlmIChzdHJpZGUgPCAwIHx8IHdpZHRoIDwgMCB8fCBoZWlnaHQgPCAwKQorICBpZiAoIUNoZWNrRGltZW5zaW9ucyhzdHJpZGUsIHdpZHRoLCBoZWlnaHQpKQogICAgIHJldHVybjsKLSAgaWYgKGhlaWdodCA+IDAgJiYgd2lkdGggPiBJTlRfTUFYIC8gaGVpZ2h0KQotICAgIHJldHVybjsKKwogICBpbnQgb3V0X2xlbiA9IHN0cmlkZSAqIGhlaWdodDsKICAgaWYgKG91dF9sZW4gPiBJTlRfTUFYIC8gMykKICAgICByZXR1cm47CkBAIC0yMTUsNyArMTQ5LDcgQEAKICAgaWYgKCFmcCkKICAgICByZXR1cm47CiAKLSAgQklUTUFQSU5GTyBibWkgPSB7MH07CisgIEJJVE1BUElORk8gYm1pID0ge307CiAgIGJtaS5ibWlIZWFkZXIuYmlTaXplID0gc2l6ZW9mKGJtaSkgLSBzaXplb2YoUkdCUVVBRCk7CiAgIGJtaS5ibWlIZWFkZXIuYmlXaWR0aCA9IHdpZHRoOwogICBibWkuYm1pSGVhZGVyLmJpSGVpZ2h0ID0gLWhlaWdodDsgIC8vIHRvcC1kb3duIGltYWdlCkBAIC0yMjQsNyArMTU4LDcgQEAKICAgYm1pLmJtaUhlYWRlci5iaUNvbXByZXNzaW9uID0gQklfUkdCOwogICBibWkuYm1pSGVhZGVyLmJpU2l6ZUltYWdlID0gMDsKIAotICBCSVRNQVBGSUxFSEVBREVSIGZpbGVfaGVhZGVyID0gezB9OworICBCSVRNQVBGSUxFSEVBREVSIGZpbGVfaGVhZGVyID0ge307CiAgIGZpbGVfaGVhZGVyLmJmVHlwZSA9IDB4NGQ0MjsKICAgZmlsZV9oZWFkZXIuYmZTaXplID0gc2l6ZW9mKGZpbGVfaGVhZGVyKSArIGJtaS5ibWlIZWFkZXIuYmlTaXplICsgb3V0X2xlbjsKICAgZmlsZV9oZWFkZXIuYmZPZmZCaXRzID0gZmlsZV9oZWFkZXIuYmZTaXplIC0gb3V0X2xlbjsKQEAgLTI0Miw3ICsxNzYsNyBAQAogICBjaGFyIGZpbGVuYW1lWzI1Nl07CiAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXMuJWQuZW1mIiwgcGRmX25hbWUsIG51bSk7CiAKLSAgSERDIGRjID0gQ3JlYXRlRW5oTWV0YUZpbGVBKE5VTEwsIGZpbGVuYW1lLCBOVUxMLCBOVUxMKTsKKyAgSERDIGRjID0gQ3JlYXRlRW5oTWV0YUZpbGVBKG51bGxwdHIsIGZpbGVuYW1lLCBudWxscHRyLCBudWxscHRyKTsKIAogICBIUkdOIHJnbiA9IENyZWF0ZVJlY3RSZ24oMCwgMCwgd2lkdGgsIGhlaWdodCk7CiAgIFNlbGVjdENsaXBSZ24oZGMsIHJnbik7CkBAIC0yNjIsMTkgKzE5Niw4IEBACiAKIGludCBFeGFtcGxlQXBwQWxlcnQoSVBERl9KU1BMQVRGT1JNKiwgRlBERl9XSURFU1RSSU5HIG1zZywgRlBERl9XSURFU1RSSU5HLAogICAgICAgICAgICAgICAgICAgICBpbnQsIGludCkgewotICAvLyBEZWFsIHdpdGggZGlmZmVyZW5jZXMgYmV0d2VlbiBVVEYxNkxFIGFuZCB3Y2hhcl90IG9uIHRoaXMgcGxhdGZvcm0uCi0gIHNpemVfdCBjaGFyYWN0ZXJzID0gMDsKLSAgd2hpbGUgKG1zZ1tjaGFyYWN0ZXJzXSkgewotICAgICsrY2hhcmFjdGVyczsKLSAgfQotICB3Y2hhcl90KiBwbGF0Zm9ybV9zdHJpbmcgPQotICAgICAgKHdjaGFyX3QqKW1hbGxvYygoY2hhcmFjdGVycyArIDEpICogc2l6ZW9mKHdjaGFyX3QpKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjaGFyYWN0ZXJzICsgMTsgKytpKSB7Ci0gICAgdW5zaWduZWQgY2hhciogcHRyID0gKHVuc2lnbmVkIGNoYXIqKSZtc2dbaV07Ci0gICAgcGxhdGZvcm1fc3RyaW5nW2ldID0gcHRyWzBdICsgMjU2ICogcHRyWzFdOwotICB9Ci0gIHByaW50ZigiQWxlcnQ6ICVsc1xuIiwgcGxhdGZvcm1fc3RyaW5nKTsKLSAgZnJlZShwbGF0Zm9ybV9zdHJpbmcpOworICBzdGQ6OndzdHJpbmcgcGxhdGZvcm1fc3RyaW5nID0gR2V0UGxhdGZvcm1XU3RyaW5nKG1zZyk7CisgIHByaW50ZigiQWxlcnQ6ICVsc1xuIiwgcGxhdGZvcm1fc3RyaW5nLmNfc3RyKCkpOwogICByZXR1cm4gMDsKIH0KIApAQCAtMzQ3LDYgKzI3MCwxMyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICB9CiAgICAgICBvcHRpb25zLT5vdXRwdXRfZm9ybWF0ID0gT1VUUFVUX1BORzsKKyAgICB9IGVsc2UgaWYgKGN1cl9hcmcuc2l6ZSgpID4gMTEgJiYKKyAgICAgICAgICAgICAgIGN1cl9hcmcuY29tcGFyZSgwLCAxMSwgIi0tZm9udC1kaXI9IikgPT0gMCkgeworICAgICAgaWYgKCFvcHRpb25zLT5mb250X2RpcmVjdG9yeS5lbXB0eSgpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRHVwbGljYXRlIC0tZm9udC1kaXIgYXJndW1lbnRcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBvcHRpb25zLT5mb250X2RpcmVjdG9yeSA9IGN1cl9hcmcuc3Vic3RyKDExKTsKICAgICB9CiAjaWZkZWYgX1dJTjMyCiAgICAgZWxzZSBpZiAoY3VyX2FyZyA9PSAiLS1lbWYiKSB7CkBAIC0zNjQsNiArMjk0LDcgQEAKICAgICAgIG9wdGlvbnMtPm91dHB1dF9mb3JtYXQgPSBPVVRQVVRfQk1QOwogICAgIH0KICNlbmRpZiAgLy8gX1dJTjMyCisjaWZkZWYgUERGX0VOQUJMRV9WOAogI2lmZGVmIFY4X1VTRV9FWFRFUk5BTF9TVEFSVFVQX0RBVEEKICAgICBlbHNlIGlmIChjdXJfYXJnLnNpemUoKSA+IDEwICYmIGN1cl9hcmcuY29tcGFyZSgwLCAxMCwgIi0tYmluLWRpcj0iKSA9PSAwKSB7CiAgICAgICBpZiAoIW9wdGlvbnMtPmJpbl9kaXJlY3RvcnkuZW1wdHkoKSkgewpAQCAtMzczLDYgKzMwNCw3IEBACiAgICAgICBvcHRpb25zLT5iaW5fZGlyZWN0b3J5ID0gY3VyX2FyZy5zdWJzdHIoMTApOwogICAgIH0KICNlbmRpZiAgLy8gVjhfVVNFX0VYVEVSTkFMX1NUQVJUVVBfREFUQQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1Y4CiAgICAgZWxzZSBpZiAoY3VyX2FyZy5zaXplKCkgPiA4ICYmIGN1cl9hcmcuY29tcGFyZSgwLCA4LCAiLS1zY2FsZT0iKSA9PSAwKSB7CiAgICAgICBpZiAoIW9wdGlvbnMtPnNjYWxlX2ZhY3Rvcl9hc19zdHJpbmcuZW1wdHkoKSkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkR1cGxpY2F0ZSAtLXNjYWxlIGFyZ3VtZW50XG4iKTsKQEAgLTM5MywyNiArMzI1LDYgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLWNsYXNzIFRlc3RMb2FkZXIgewotIHB1YmxpYzoKLSAgVGVzdExvYWRlcihjb25zdCBjaGFyKiBwQnVmLCBzaXplX3QgbGVuKTsKLQotICBjb25zdCBjaGFyKiBtX3BCdWY7Ci0gIHNpemVfdCBtX0xlbjsKLX07Ci0KLVRlc3RMb2FkZXI6OlRlc3RMb2FkZXIoY29uc3QgY2hhciogcEJ1Ziwgc2l6ZV90IGxlbikKLSAgICA6IG1fcEJ1ZihwQnVmKSwgbV9MZW4obGVuKSB7Ci19Ci0KLWludCBHZXRfQmxvY2sodm9pZCogcGFyYW0sIHVuc2lnbmVkIGxvbmcgcG9zLCB1bnNpZ25lZCBjaGFyKiBwQnVmLAotICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpIHsKLSAgVGVzdExvYWRlciogcExvYWRlciA9IChUZXN0TG9hZGVyKikgcGFyYW07Ci0gIGlmIChwb3MgKyBzaXplIDwgcG9zIHx8IHBvcyArIHNpemUgPiBwTG9hZGVyLT5tX0xlbikgcmV0dXJuIDA7Ci0gIG1lbWNweShwQnVmLCBwTG9hZGVyLT5tX3BCdWYgKyBwb3MsIHNpemUpOwotICByZXR1cm4gMTsKLX0KLQogRlBERl9CT09MIElzX0RhdGFfQXZhaWwoRlhfRklMRUFWQUlMKiBwVGhpcywgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKICAgcmV0dXJuIHRydWU7CiB9CkBAIC00MjAsMjcgKzMzMiw5NCBAQAogdm9pZCBBZGRfU2VnbWVudChGWF9ET1dOTE9BREhJTlRTKiBwVGhpcywgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKIH0KIAorYm9vbCBSZW5kZXJQYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgIGNvbnN0IEZQREZfRE9DVU1FTlQmIGRvYywKKyAgICAgICAgICAgICAgICBjb25zdCBGUERGX0ZPUk1IQU5ETEUmIGZvcm0sCisgICAgICAgICAgICAgICAgY29uc3QgaW50IHBhZ2VfaW5kZXgsCisgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBGUERGX1BBR0UgcGFnZSA9IEZQREZfTG9hZFBhZ2UoZG9jLCBwYWdlX2luZGV4KTsKKyAgaWYgKCFwYWdlKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlID0gRlBERlRleHRfTG9hZFBhZ2UocGFnZSk7CisgIEZPUk1fT25BZnRlckxvYWRQYWdlKHBhZ2UsIGZvcm0pOworICBGT1JNX0RvUGFnZUFBY3Rpb24ocGFnZSwgZm9ybSwgRlBERlBBR0VfQUFDVElPTl9PUEVOKTsKKworICBkb3VibGUgc2NhbGUgPSAxLjA7CisgIGlmICghb3B0aW9ucy5zY2FsZV9mYWN0b3JfYXNfc3RyaW5nLmVtcHR5KCkpIHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbShvcHRpb25zLnNjYWxlX2ZhY3Rvcl9hc19zdHJpbmcpID4+IHNjYWxlOworICB9CisgIGludCB3aWR0aCA9IHN0YXRpY19jYXN0PGludD4oRlBERl9HZXRQYWdlV2lkdGgocGFnZSkgKiBzY2FsZSk7CisgIGludCBoZWlnaHQgPSBzdGF0aWNfY2FzdDxpbnQ+KEZQREZfR2V0UGFnZUhlaWdodChwYWdlKSAqIHNjYWxlKTsKKyAgaW50IGFscGhhID0gRlBERlBhZ2VfSGFzVHJhbnNwYXJlbmN5KHBhZ2UpID8gMSA6IDA7CisgIEZQREZfQklUTUFQIGJpdG1hcCA9IEZQREZCaXRtYXBfQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIGFscGhhKTsKKyAgaWYgKCFiaXRtYXApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlBhZ2Ugd2FzIHRvbyBsYXJnZSB0byBiZSByZW5kZXJlZC5cbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBGUERGX0RXT1JEIGZpbGxfY29sb3IgPSBhbHBoYSA/IDB4MDAwMDAwMDAgOiAweEZGRkZGRkZGOworICBGUERGQml0bWFwX0ZpbGxSZWN0KGJpdG1hcCwgMCwgMCwgd2lkdGgsIGhlaWdodCwgZmlsbF9jb2xvcik7CisgIEZQREZfUmVuZGVyUGFnZUJpdG1hcChiaXRtYXAsIHBhZ2UsIDAsIDAsIHdpZHRoLCBoZWlnaHQsIDAsIDApOworCisgIEZQREZfRkZMRHJhdyhmb3JtLCBiaXRtYXAsIHBhZ2UsIDAsIDAsIHdpZHRoLCBoZWlnaHQsIDAsIDApOworICBpbnQgc3RyaWRlID0gRlBERkJpdG1hcF9HZXRTdHJpZGUoYml0bWFwKTsKKyAgY29uc3QgY2hhciogYnVmZmVyID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KEZQREZCaXRtYXBfR2V0QnVmZmVyKGJpdG1hcCkpOworCisgIHN3aXRjaCAob3B0aW9ucy5vdXRwdXRfZm9ybWF0KSB7CisjaWZkZWYgX1dJTjMyCisgICAgY2FzZSBPVVRQVVRfQk1QOgorICAgICAgV3JpdGVCbXAobmFtZS5jX3N0cigpLCBwYWdlX2luZGV4LCBidWZmZXIsIHN0cmlkZSwgd2lkdGgsIGhlaWdodCk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgT1VUUFVUX0VNRjoKKyAgICAgIFdyaXRlRW1mKHBhZ2UsIG5hbWUuY19zdHIoKSwgcGFnZV9pbmRleCk7CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgT1VUUFVUX1BORzoKKyAgICAgIFdyaXRlUG5nKG5hbWUuY19zdHIoKSwgcGFnZV9pbmRleCwgYnVmZmVyLCBzdHJpZGUsIHdpZHRoLCBoZWlnaHQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9VVFBVVF9QUE06CisgICAgICBXcml0ZVBwbShuYW1lLmNfc3RyKCksIHBhZ2VfaW5kZXgsIGJ1ZmZlciwgc3RyaWRlLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgRlBERkJpdG1hcF9EZXN0cm95KGJpdG1hcCk7CisgIEZPUk1fRG9QYWdlQUFjdGlvbihwYWdlLCBmb3JtLCBGUERGUEFHRV9BQUNUSU9OX0NMT1NFKTsKKyAgRk9STV9PbkJlZm9yZUNsb3NlUGFnZShwYWdlLCBmb3JtKTsKKyAgRlBERlRleHRfQ2xvc2VQYWdlKHRleHRfcGFnZSk7CisgIEZQREZfQ2xvc2VQYWdlKHBhZ2UpOworICByZXR1cm4gdHJ1ZTsKK30KKwogdm9pZCBSZW5kZXJQZGYoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IGNoYXIqIHBCdWYsIHNpemVfdCBsZW4sCiAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CiAgIGZwcmludGYoc3RkZXJyLCAiUmVuZGVyaW5nIFBERiBmaWxlICVzLlxuIiwgbmFtZS5jX3N0cigpKTsKIAogICBJUERGX0pTUExBVEZPUk0gcGxhdGZvcm1fY2FsbGJhY2tzOwogICBtZW1zZXQoJnBsYXRmb3JtX2NhbGxiYWNrcywgJ1wwJywgc2l6ZW9mKHBsYXRmb3JtX2NhbGxiYWNrcykpOwotICBwbGF0Zm9ybV9jYWxsYmFja3MudmVyc2lvbiA9IDE7CisgIHBsYXRmb3JtX2NhbGxiYWNrcy52ZXJzaW9uID0gMzsKICAgcGxhdGZvcm1fY2FsbGJhY2tzLmFwcF9hbGVydCA9IEV4YW1wbGVBcHBBbGVydDsKICAgcGxhdGZvcm1fY2FsbGJhY2tzLkRvY19nb3RvUGFnZSA9IEV4YW1wbGVEb2NHb3RvUGFnZTsKIAogICBGUERGX0ZPUk1GSUxMSU5GTyBmb3JtX2NhbGxiYWNrczsKICAgbWVtc2V0KCZmb3JtX2NhbGxiYWNrcywgJ1wwJywgc2l6ZW9mKGZvcm1fY2FsbGJhY2tzKSk7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgZm9ybV9jYWxsYmFja3MudmVyc2lvbiA9IDI7CisjZWxzZSAgIC8vIFBERl9FTkFCTEVfWEZBCiAgIGZvcm1fY2FsbGJhY2tzLnZlcnNpb24gPSAxOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogICBmb3JtX2NhbGxiYWNrcy5tX3BKc1BsYXRmb3JtID0gJnBsYXRmb3JtX2NhbGxiYWNrczsKIAogICBUZXN0TG9hZGVyIGxvYWRlcihwQnVmLCBsZW4pOwotCiAgIEZQREZfRklMRUFDQ0VTUyBmaWxlX2FjY2VzczsKICAgbWVtc2V0KCZmaWxlX2FjY2VzcywgJ1wwJywgc2l6ZW9mKGZpbGVfYWNjZXNzKSk7CiAgIGZpbGVfYWNjZXNzLm1fRmlsZUxlbiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KGxlbik7Ci0gIGZpbGVfYWNjZXNzLm1fR2V0QmxvY2sgPSBHZXRfQmxvY2s7CisgIGZpbGVfYWNjZXNzLm1fR2V0QmxvY2sgPSBUZXN0TG9hZGVyOjpHZXRCbG9jazsKICAgZmlsZV9hY2Nlc3MubV9QYXJhbSA9ICZsb2FkZXI7CiAKICAgRlhfRklMRUFWQUlMIGZpbGVfYXZhaWw7CkBAIC00NTQsMTA0ICs0MzMsMTIwIEBACiAgIGhpbnRzLkFkZFNlZ21lbnQgPSBBZGRfU2VnbWVudDsKIAogICBGUERGX0RPQ1VNRU5UIGRvYzsKKyAgaW50IG5SZXQgPSBQREZfREFUQV9OT1RBVkFJTDsKKyAgYm9vbCBiSXNMaW5lYXJpemVkID0gZmFsc2U7CiAgIEZQREZfQVZBSUwgcGRmX2F2YWlsID0gRlBERkF2YWlsX0NyZWF0ZSgmZmlsZV9hdmFpbCwgJmZpbGVfYWNjZXNzKTsKIAotICAodm9pZCkgRlBERkF2YWlsX0lzRG9jQXZhaWwocGRmX2F2YWlsLCAmaGludHMpOwotCi0gIGlmICghRlBERkF2YWlsX0lzTGluZWFyaXplZChwZGZfYXZhaWwpKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJOb24tbGluZWFyaXplZCBwYXRoLi4uXG4iKTsKLSAgICBkb2MgPSBGUERGX0xvYWRDdXN0b21Eb2N1bWVudCgmZmlsZV9hY2Nlc3MsIE5VTEwpOwotICB9IGVsc2UgeworICBpZiAoRlBERkF2YWlsX0lzTGluZWFyaXplZChwZGZfYXZhaWwpID09IFBERl9MSU5FQVJJWkVEKSB7CiAgICAgZnByaW50ZihzdGRlcnIsICJMaW5lYXJpemVkIHBhdGguLi5cbiIpOwotICAgIGRvYyA9IEZQREZBdmFpbF9HZXREb2N1bWVudChwZGZfYXZhaWwsIE5VTEwpOworICAgIGRvYyA9IEZQREZBdmFpbF9HZXREb2N1bWVudChwZGZfYXZhaWwsIG51bGxwdHIpOworICAgIGlmIChkb2MpIHsKKyAgICAgIHdoaWxlIChuUmV0ID09IFBERl9EQVRBX05PVEFWQUlMKSB7CisgICAgICAgIG5SZXQgPSBGUERGQXZhaWxfSXNEb2NBdmFpbChwZGZfYXZhaWwsICZoaW50cyk7CisgICAgICB9CisgICAgICBpZiAoblJldCA9PSBQREZfREFUQV9FUlJPUikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gZXJyb3IgaW4gY2hlY2tpbmcgaWYgZG9jIHdhcyBhdmFpbGFibGUuXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgblJldCA9IEZQREZBdmFpbF9Jc0Zvcm1BdmFpbChwZGZfYXZhaWwsICZoaW50cyk7CisgICAgICBpZiAoblJldCA9PSBQREZfRk9STV9FUlJPUiB8fCBuUmV0ID09IFBERl9GT1JNX05PVEFWQUlMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJFcnJvciAlZCB3YXMgcmV0dXJuZWQgaW4gY2hlY2tpbmcgaWYgZm9ybSB3YXMgYXZhaWxhYmxlLlxuIiwKKyAgICAgICAgICAgICAgICBuUmV0KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgYklzTGluZWFyaXplZCA9IHRydWU7CisgICAgfQorICB9IGVsc2UgeworICAgIGZwcmludGYoc3RkZXJyLCAiTm9uLWxpbmVhcml6ZWQgcGF0aC4uLlxuIik7CisgICAgZG9jID0gRlBERl9Mb2FkQ3VzdG9tRG9jdW1lbnQoJmZpbGVfYWNjZXNzLCBudWxscHRyKTsKICAgfQogCi0gICh2b2lkKSBGUERGX0dldERvY1Blcm1pc3Npb25zKGRvYyk7Ci0gICh2b2lkKSBGUERGQXZhaWxfSXNGb3JtQXZhaWwocGRmX2F2YWlsLCAmaGludHMpOworICBpZiAoIWRvYykgeworICAgIHVuc2lnbmVkIGxvbmcgZXJyID0gRlBERl9HZXRMYXN0RXJyb3IoKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkxvYWQgcGRmIGRvY3MgdW5zdWNjZXNzZnVsOiAiKTsKKyAgICBzd2l0Y2ggKGVycikgeworICAgICAgY2FzZSBGUERGX0VSUl9TVUNDRVNTOgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlN1Y2Nlc3MiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZQREZfRVJSX1VOS05PV046CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biBlcnJvciIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRlBERl9FUlJfRklMRToKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGaWxlIG5vdCBmb3VuZCBvciBjb3VsZCBub3QgYmUgb3BlbmVkIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGUERGX0VSUl9GT1JNQVQ6CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmlsZSBub3QgaW4gUERGIGZvcm1hdCBvciBjb3JydXB0ZWQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZQREZfRVJSX1BBU1NXT1JEOgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBhc3N3b3JkIHJlcXVpcmVkIG9yIGluY29ycmVjdCBwYXNzd29yZCIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRlBERl9FUlJfU0VDVVJJVFk6CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5zdXBwb3J0ZWQgc2VjdXJpdHkgc2NoZW1lIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGUERGX0VSUl9QQUdFOgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBhZ2Ugbm90IGZvdW5kIG9yIGNvbnRlbnQgZXJyb3IiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gZXJyb3IgJWxkIiwgZXJyKTsKKyAgICB9CisgICAgZnByaW50ZihzdGRlcnIsICIuXG4iKTsKKworICAgIEZQREZBdmFpbF9EZXN0cm95KHBkZl9hdmFpbCk7CisgICAgcmV0dXJuOworICB9CisKKyAgKHZvaWQpRlBERl9HZXREb2NQZXJtaXNzaW9ucyhkb2MpOwogCiAgIEZQREZfRk9STUhBTkRMRSBmb3JtID0gRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudChkb2MsICZmb3JtX2NhbGxiYWNrcyk7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgaW50IGRvY1R5cGUgPSBET0NUWVBFX1BERjsKKyAgaWYgKEZQREZfSGFzWEZBRmllbGQoZG9jLCAmZG9jVHlwZSkgJiYgZG9jVHlwZSAhPSBET0NUWVBFX1BERiAmJgorICAgICAgIUZQREZfTG9hZFhGQShkb2MpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJMb2FkWEZBIHVuc3VjY2Vzc2Z1bCwgY29udGludWluZyBhbnl3YXkuXG4iKTsKKyAgfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogICBGUERGX1NldEZvcm1GaWVsZEhpZ2hsaWdodENvbG9yKGZvcm0sIDAsIDB4RkZFNEREKTsKICAgRlBERl9TZXRGb3JtRmllbGRIaWdobGlnaHRBbHBoYShmb3JtLCAxMDApOwogCi0gIGludCBmaXJzdF9wYWdlID0gRlBERkF2YWlsX0dldEZpcnN0UGFnZU51bShkb2MpOwotICAodm9pZCkgRlBERkF2YWlsX0lzUGFnZUF2YWlsKHBkZl9hdmFpbCwgZmlyc3RfcGFnZSwgJmhpbnRzKTsKLQotICBpbnQgcGFnZV9jb3VudCA9IEZQREZfR2V0UGFnZUNvdW50KGRvYyk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgcGFnZV9jb3VudDsgKytpKSB7Ci0gICAgKHZvaWQpIEZQREZBdmFpbF9Jc1BhZ2VBdmFpbChwZGZfYXZhaWwsIGksICZoaW50cyk7Ci0gIH0KLQogICBGT1JNX0RvRG9jdW1lbnRKU0FjdGlvbihmb3JtKTsKICAgRk9STV9Eb0RvY3VtZW50T3BlbkFjdGlvbihmb3JtKTsKIAorICBpbnQgcGFnZV9jb3VudCA9IEZQREZfR2V0UGFnZUNvdW50KGRvYyk7CiAgIGludCByZW5kZXJlZF9wYWdlcyA9IDA7CiAgIGludCBiYWRfcGFnZXMgPSAwOwogICBmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VfY291bnQ7ICsraSkgewotICAgIEZQREZfUEFHRSBwYWdlID0gRlBERl9Mb2FkUGFnZShkb2MsIGkpOwotICAgIGlmICghcGFnZSkgewotICAgICAgICBiYWRfcGFnZXMgKys7Ci0gICAgICAgIGNvbnRpbnVlOworICAgIGlmIChiSXNMaW5lYXJpemVkKSB7CisgICAgICBuUmV0ID0gUERGX0RBVEFfTk9UQVZBSUw7CisgICAgICB3aGlsZSAoblJldCA9PSBQREZfREFUQV9OT1RBVkFJTCkgeworICAgICAgICBuUmV0ID0gRlBERkF2YWlsX0lzUGFnZUF2YWlsKHBkZl9hdmFpbCwgaSwgJmhpbnRzKTsKKyAgICAgIH0KKyAgICAgIGlmIChuUmV0ID09IFBERl9EQVRBX0VSUk9SKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biBlcnJvciBpbiBjaGVja2luZyBpZiBwYWdlICVkIGlzIGF2YWlsYWJsZS5cbiIsCisgICAgICAgICAgICAgICAgaSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KICAgICB9Ci0gICAgRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UgPSBGUERGVGV4dF9Mb2FkUGFnZShwYWdlKTsKLSAgICBGT1JNX09uQWZ0ZXJMb2FkUGFnZShwYWdlLCBmb3JtKTsKLSAgICBGT1JNX0RvUGFnZUFBY3Rpb24ocGFnZSwgZm9ybSwgRlBERlBBR0VfQUFDVElPTl9PUEVOKTsKLQotICAgIGRvdWJsZSBzY2FsZSA9IDEuMDsKLSAgICBpZiAoIW9wdGlvbnMuc2NhbGVfZmFjdG9yX2FzX3N0cmluZy5lbXB0eSgpKSB7Ci0gICAgICBzdGQ6OnN0cmluZ3N0cmVhbShvcHRpb25zLnNjYWxlX2ZhY3Rvcl9hc19zdHJpbmcpID4+IHNjYWxlOworICAgIGlmIChSZW5kZXJQYWdlKG5hbWUsIGRvYywgZm9ybSwgaSwgb3B0aW9ucykpIHsKKyAgICAgICsrcmVuZGVyZWRfcGFnZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICsrYmFkX3BhZ2VzOwogICAgIH0KLSAgICBpbnQgd2lkdGggPSBzdGF0aWNfY2FzdDxpbnQ+KEZQREZfR2V0UGFnZVdpZHRoKHBhZ2UpICogc2NhbGUpOwotICAgIGludCBoZWlnaHQgPSBzdGF0aWNfY2FzdDxpbnQ+KEZQREZfR2V0UGFnZUhlaWdodChwYWdlKSAqIHNjYWxlKTsKLQotICAgIEZQREZfQklUTUFQIGJpdG1hcCA9IEZQREZCaXRtYXBfQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIDApOwotICAgIGlmICghYml0bWFwKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlBhZ2Ugd2FzIHRvbyBsYXJnZSB0byBiZSByZW5kZXJlZC5cbiIpOwotICAgICAgYmFkX3BhZ2VzKys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBGUERGQml0bWFwX0ZpbGxSZWN0KGJpdG1hcCwgMCwgMCwgd2lkdGgsIGhlaWdodCwgMHhGRkZGRkZGRik7Ci0gICAgRlBERl9SZW5kZXJQYWdlQml0bWFwKGJpdG1hcCwgcGFnZSwgMCwgMCwgd2lkdGgsIGhlaWdodCwgMCwgMCk7Ci0gICAgcmVuZGVyZWRfcGFnZXMgKys7Ci0KLSAgICBGUERGX0ZGTERyYXcoZm9ybSwgYml0bWFwLCBwYWdlLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAwLCAwKTsKLSAgICBpbnQgc3RyaWRlID0gRlBERkJpdG1hcF9HZXRTdHJpZGUoYml0bWFwKTsKLSAgICBjb25zdCBjaGFyKiBidWZmZXIgPQotICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihGUERGQml0bWFwX0dldEJ1ZmZlcihiaXRtYXApKTsKLQotICAgIHN3aXRjaCAob3B0aW9ucy5vdXRwdXRfZm9ybWF0KSB7Ci0jaWZkZWYgX1dJTjMyCi0gICAgICBjYXNlIE9VVFBVVF9CTVA6Ci0gICAgICAgIFdyaXRlQm1wKG5hbWUuY19zdHIoKSwgaSwgYnVmZmVyLCBzdHJpZGUsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBPVVRQVVRfRU1GOgotICAgICAgICBXcml0ZUVtZihwYWdlLCBuYW1lLmNfc3RyKCksIGkpOwotICAgICAgICBicmVhazsKLSNlbmRpZgotICAgICAgY2FzZSBPVVRQVVRfUE5HOgotICAgICAgICBXcml0ZVBuZyhuYW1lLmNfc3RyKCksIGksIGJ1ZmZlciwgc3RyaWRlLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgT1VUUFVUX1BQTToKLSAgICAgICAgV3JpdGVQcG0obmFtZS5jX3N0cigpLCBpLCBidWZmZXIsIHN0cmlkZSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBGUERGQml0bWFwX0Rlc3Ryb3koYml0bWFwKTsKLQotICAgIEZPUk1fRG9QYWdlQUFjdGlvbihwYWdlLCBmb3JtLCBGUERGUEFHRV9BQUNUSU9OX0NMT1NFKTsKLSAgICBGT1JNX09uQmVmb3JlQ2xvc2VQYWdlKHBhZ2UsIGZvcm0pOwotICAgIEZQREZUZXh0X0Nsb3NlUGFnZSh0ZXh0X3BhZ2UpOwotICAgIEZQREZfQ2xvc2VQYWdlKHBhZ2UpOwogICB9CiAKICAgRk9STV9Eb0RvY3VtZW50QUFjdGlvbihmb3JtLCBGUERGRE9DX0FBQ1RJT05fV0MpOworCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgLy8gTm90ZTogVGhlIHNodXQgZG93biBvcmRlciBoZXJlIGlzIHRoZSByZXZlcnNlIG9mIHRoZSBub24tWEZBIGJyYW5jaCBvcmRlci4KKyAgLy8gTmVlZCB0byB3b3JrIG91dCBpZiB0aGlzIGlzIHJlcXVpcmVkLCBhbmQgaWYgaXQgaXMsIHRoZSBsaWZldGltZXMgb2YKKyAgLy8gb2JqZWN0cyBvd25lZCBieSB8ZG9jfCB0aGF0IHxmb3JtfCByZWZlcmVuY2UuCiAgIEZQREZfQ2xvc2VEb2N1bWVudChkb2MpOwogICBGUERGRE9DX0V4aXRGb3JtRmlsbEVudmlyb25tZW50KGZvcm0pOworI2Vsc2UgIC8vIFBERl9FTkFCTEVfWEZBCisgIEZQREZET0NfRXhpdEZvcm1GaWxsRW52aXJvbm1lbnQoZm9ybSk7CisgIEZQREZfQ2xvc2VEb2N1bWVudChkb2MpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCiAgIEZQREZBdmFpbF9EZXN0cm95KHBkZl9hdmFpbCk7CiAKICAgZnByaW50ZihzdGRlcnIsICJSZW5kZXJlZCAlZCBwYWdlcy5cbiIsIHJlbmRlcmVkX3BhZ2VzKTsKQEAgLTU2MCwxMiArNTU1LDEzIEBACiAKIHN0YXRpYyBjb25zdCBjaGFyIHVzYWdlX3N0cmluZ1tdID0KICAgICAiVXNhZ2U6IHBkZml1bV90ZXN0IFtPUFRJT05dIFtGSUxFXS4uLlxuIgotICAgICIgIC0tYmluLWRpcj08cGF0aD4gLSBvdmVycmlkZSBwYXRoIHRvIHY4IGV4dGVybmFsIGRhdGFcbiIKLSAgICAiICAtLXNjYWxlPTxudW1iZXI+IC0gc2NhbGUgb3V0cHV0IHNpemUgYnkgbnVtYmVyIChlLmcuIDAuNSlcbiIKKyAgICAiICAtLWJpbi1kaXI9PHBhdGg+ICAtIG92ZXJyaWRlIHBhdGggdG8gdjggZXh0ZXJuYWwgZGF0YVxuIgorICAgICIgIC0tZm9udC1kaXI9PHBhdGg+IC0gb3ZlcnJpZGUgcGF0aCB0byBleHRlcm5hbCBmb250c1xuIgorICAgICIgIC0tc2NhbGU9PG51bWJlcj4gIC0gc2NhbGUgb3V0cHV0IHNpemUgYnkgbnVtYmVyIChlLmcuIDAuNSlcbiIKICNpZmRlZiBfV0lOMzIKICAgICAiICAtLWJtcCAtIHdyaXRlIHBhZ2UgaW1hZ2VzIDxwZGYtbmFtZT4uPHBhZ2UtbnVtYmVyPi5ibXBcbiIKICAgICAiICAtLWVtZiAtIHdyaXRlIHBhZ2UgbWV0YSBmaWxlcyA8cGRmLW5hbWU+LjxwYWdlLW51bWJlcj4uZW1mXG4iCi0jZW5kaWYKKyNlbmRpZiAgLy8gX1dJTjMyCiAgICAgIiAgLS1wbmcgLSB3cml0ZSBwYWdlIGltYWdlcyA8cGRmLW5hbWU+LjxwYWdlLW51bWJlcj4ucG5nXG4iCiAgICAgIiAgLS1wcG0gLSB3cml0ZSBwYWdlIGltYWdlcyA8cGRmLW5hbWU+LjxwYWdlLW51bWJlcj4ucHBtXG4iOwogCkBAIC01NzgsMjggKzU3NCwzMSBAQAogICAgIHJldHVybiAxOwogICB9CiAKLSAgdjg6OlY4OjpJbml0aWFsaXplSUNVKCk7Ci0gIHY4OjpQbGF0Zm9ybSogcGxhdGZvcm0gPSB2ODo6cGxhdGZvcm06OkNyZWF0ZURlZmF1bHRQbGF0Zm9ybSgpOwotICB2ODo6Vjg6OkluaXRpYWxpemVQbGF0Zm9ybShwbGF0Zm9ybSk7Ci0gIHY4OjpWODo6SW5pdGlhbGl6ZSgpOwotCi0gIC8vIEJ5IGVuYWJsaW5nIHByZWRpY3RhYmxlIG1vZGUsIFY4IHdvbid0IHBvc3QgYW55IGJhY2tncm91bmQgdGFza3MuCi0gIHN0YXRpYyBjb25zdCBjaGFyIHByZWRpY3RhYmxlX2ZsYWdbXSA9ICItLXByZWRpY3RhYmxlIjsKLSAgdjg6OlY4OjpTZXRGbGFnc0Zyb21TdHJpbmcocHJlZGljdGFibGVfZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzdHJsZW4ocHJlZGljdGFibGVfZmxhZykpKTsKLQorI2lmZGVmIFBERl9FTkFCTEVfVjgKKyAgdjg6OlBsYXRmb3JtKiBwbGF0Zm9ybTsKICNpZmRlZiBWOF9VU0VfRVhURVJOQUxfU1RBUlRVUF9EQVRBCiAgIHY4OjpTdGFydHVwRGF0YSBuYXRpdmVzOwogICB2ODo6U3RhcnR1cERhdGEgc25hcHNob3Q7Ci0gIGlmICghR2V0RXh0ZXJuYWxEYXRhKG9wdGlvbnMsICJuYXRpdmVzX2Jsb2IuYmluIiwgJm5hdGl2ZXMpIHx8Ci0gICAgICAhR2V0RXh0ZXJuYWxEYXRhKG9wdGlvbnMsICJzbmFwc2hvdF9ibG9iLmJpbiIsICZzbmFwc2hvdCkpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotICB2ODo6Vjg6OlNldE5hdGl2ZXNEYXRhQmxvYigmbmF0aXZlcyk7Ci0gIHY4OjpWODo6U2V0U25hcHNob3REYXRhQmxvYigmc25hcHNob3QpOworICBJbml0aWFsaXplVjhGb3JQREZpdW0ob3B0aW9ucy5leGVfcGF0aCwgb3B0aW9ucy5iaW5fZGlyZWN0b3J5LCAmbmF0aXZlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICZzbmFwc2hvdCwgJnBsYXRmb3JtKTsKKyNlbHNlICAgLy8gVjhfVVNFX0VYVEVSTkFMX1NUQVJUVVBfREFUQQorICBJbml0aWFsaXplVjhGb3JQREZpdW0oJnBsYXRmb3JtKTsKICNlbmRpZiAgLy8gVjhfVVNFX0VYVEVSTkFMX1NUQVJUVVBfREFUQQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1Y4CiAKLSAgRlBERl9Jbml0TGlicmFyeSgpOworICBGUERGX0xJQlJBUllfQ09ORklHIGNvbmZpZzsKKyAgY29uZmlnLnZlcnNpb24gPSAyOworICBjb25maWcubV9wVXNlckZvbnRQYXRocyA9IG51bGxwdHI7CisgIGNvbmZpZy5tX3BJc29sYXRlID0gbnVsbHB0cjsKKyAgY29uZmlnLm1fdjhFbWJlZGRlclNsb3QgPSAwOworCisgIGNvbnN0IGNoYXIqIHBhdGhfYXJyYXlbMl07CisgIGlmICghb3B0aW9ucy5mb250X2RpcmVjdG9yeS5lbXB0eSgpKSB7CisgICAgcGF0aF9hcnJheVswXSA9IG9wdGlvbnMuZm9udF9kaXJlY3RvcnkuY19zdHIoKTsKKyAgICBwYXRoX2FycmF5WzFdID0gbnVsbHB0cjsKKyAgICBjb25maWcubV9wVXNlckZvbnRQYXRocyA9IHBhdGhfYXJyYXk7CisgIH0KKyAgRlBERl9Jbml0TGlicmFyeVdpdGhDb25maWcoJmNvbmZpZyk7CiAKICAgVU5TVVBQT1JUX0lORk8gdW5zdXBwb3JlZF9pbmZvOwogICBtZW1zZXQoJnVuc3VwcG9yZWRfaW5mbywgJ1wwJywgc2l6ZW9mKHVuc3VwcG9yZWRfaW5mbykpOwpAQCAtNjEyLDE2ICs2MTEsMTcgQEAKICAgICBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9IGZpbGVzLmZyb250KCk7CiAgICAgZmlsZXMucG9wX2Zyb250KCk7CiAgICAgc2l6ZV90IGZpbGVfbGVuZ3RoID0gMDsKLSAgICBjaGFyKiBmaWxlX2NvbnRlbnRzID0gR2V0RmlsZUNvbnRlbnRzKGZpbGVuYW1lLmNfc3RyKCksICZmaWxlX2xlbmd0aCk7Ci0gICAgaWYgKCFmaWxlX2NvbnRlbnRzKQotICAgICAgY29udGludWU7Ci0gICAgUmVuZGVyUGRmKGZpbGVuYW1lLCBmaWxlX2NvbnRlbnRzLCBmaWxlX2xlbmd0aCwgb3B0aW9ucyk7Ci0gICAgZnJlZShmaWxlX2NvbnRlbnRzKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y2hhciwgcGRmaXVtOjpGcmVlRGVsZXRlcj4gZmlsZV9jb250ZW50cyA9CisgICAgICAgIEdldEZpbGVDb250ZW50cyhmaWxlbmFtZS5jX3N0cigpLCAmZmlsZV9sZW5ndGgpOworICAgIGlmIChmaWxlX2NvbnRlbnRzKQorICAgICAgUmVuZGVyUGRmKGZpbGVuYW1lLCBmaWxlX2NvbnRlbnRzLmdldCgpLCBmaWxlX2xlbmd0aCwgb3B0aW9ucyk7CiAgIH0KIAogICBGUERGX0Rlc3Ryb3lMaWJyYXJ5KCk7CisjaWZkZWYgUERGX0VOQUJMRV9WOAogICB2ODo6Vjg6OlNodXRkb3duUGxhdGZvcm0oKTsKICAgZGVsZXRlIHBsYXRmb3JtOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1Y4CiAKICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL3NhbXBsZXMuZ3lwIGIvc2FtcGxlcy9zYW1wbGVzLmd5cAppbmRleCA0OTM4ZWNiLi5kYTljZTc0IDEwMDY0NAotLS0gYS9zYW1wbGVzL3NhbXBsZXMuZ3lwCisrKyBiL3NhbXBsZXMvc2FtcGxlcy5neXAKQEAgLTMsNiArMywxMCBAQAogIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCiB7CisgICd2YXJpYWJsZXMnOiB7CisgICAgJ3BkZl9lbmFibGVfdjglJzogMSwKKyAgICAncGRmX2VuYWJsZV94ZmElJzogMCwgICMgU2V0IHRvIDEgaW4gc3RhbmRhbG9uZSBidWlsZHMgYnkgc3RhbmRhbG9uZS5neXBpLgorICB9LAogICAndGFyZ2V0X2RlZmF1bHRzJzogewogICAgICdkZWZpbmVzJyA6IFsKICAgICAgICdQTkdfUFJFRklYJywKQEAgLTEwLDkgKzE0LDI1IEBACiAgICAgICAnUE5HX1VTRV9SRUFEX01BQ1JPUycsCiAgICAgXSwKICAgICAnaW5jbHVkZV9kaXJzJzogWworICAgICAgIyBUaGlzIGlzIGltcGxpY2l0IGluIEdOLgogICAgICAgJzwoREVQVEgpJywKLSAgICAgICc8KERFUFRIKS92OCcsCi0gICAgICAnPChERVBUSCkvdjgvaW5jbHVkZScsCisgICAgICAnLi4nLAorICAgIF0sCisgICAgJ2NvbmRpdGlvbnMnOiBbCisgICAgICBbJ3BkZl9lbmFibGVfdjg9PTEnLCB7CisgICAgICAgICdkZWZpbmVzJzogWworICAgICAgICAgICdQREZfRU5BQkxFX1Y4JywKKyAgICAgICAgXSwKKyAgICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKKyAgICAgICAgICAnPChERVBUSCkvdjgnLAorICAgICAgICAgICc8KERFUFRIKS92OC9pbmNsdWRlJywKKyAgICAgICAgXSwKKyAgICAgIH1dLAorICAgICAgWydwZGZfZW5hYmxlX3hmYT09MScsIHsKKyAgICAgICAgJ2RlZmluZXMnOiBbCisgICAgICAgICAgJ1BERl9FTkFCTEVfWEZBJywKKyAgICAgICAgXSwKKyAgICAgIH1dLAogICAgIF0sCiAgIH0sCiAgICd0YXJnZXRzJzogWwpAQCAtMjAsNTkgKzQwLDU0IEBACiAgICAgICAndGFyZ2V0X25hbWUnOiAncGRmaXVtX3Rlc3QnLAogICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAnZnhfbHBuZycsCiAgICAgICAgICcuLi9wZGZpdW0uZ3lwOnBkZml1bScsCi0gICAgICAgICc8KERFUFRIKS92OC90b29scy9neXAvdjguZ3lwOnY4X2xpYnBsYXRmb3JtJywKKyAgICAgICAgJy4uL3BkZml1bS5neXA6dGVzdF9zdXBwb3J0JywKKyAgICAgICAgIyBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGxpYnJhcnkgc2hpcHMgYWdhaW5zdCBzeXN0ZW0gZnJlZXR5cGUsCisgICAgICAgICMgYWx3YXlzIGxpbmsgdGhpcyBiaW5hcnkgYWdhaW5zdCB0aGUgYnVuZGxlZCBvbmUgZm9yIGNvbnNpc3RlbmN5CisgICAgICAgICMgb2YgcmVzdWx0cyBhY3Jvc3MgcGxhdGZvcm1zLgorICAgICAgICAnLi4vdGhpcmRfcGFydHkvdGhpcmRfcGFydHkuZ3lwOmZ4X2ZyZWV0eXBlJywKICAgICAgIF0sCiAgICAgICAnc291cmNlcyc6IFsKICAgICAgICAgJ3BkZml1bV90ZXN0LmNjJywKICAgICAgICAgJ2ltYWdlX2RpZmZfcG5nLmNjJywKICAgICAgIF0sCisgICAgICAnbGlua19zZXR0aW5ncyc6IHsKKyAgICAgICAgJ2xpYnJhcmllcyEnOiBbCisgICAgICAgICAgJy1sZnJlZXR5cGUnLAorICAgICAgICBdLAorICAgICAgfSwKKyAgICAgICdjb25kaXRpb25zJzogWworICAgICAgICBbJ3BkZl9lbmFibGVfeGZhPT0wJywgeworICAgICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICAgICAnLi4vdGhpcmRfcGFydHkvdGhpcmRfcGFydHkuZ3lwOmZ4X2xwbmcnLAorICAgICAgICAgIF0sCisgICAgICAgIH1dLAorICAgICAgICBbJ3BkZl9lbmFibGVfdjg9PTEnLCB7CisgICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgICAgICc8KERFUFRIKS92OC90b29scy9neXAvdjguZ3lwOnY4X2xpYnBsYXRmb3JtJywKKyAgICAgICAgICBdLAorICAgICAgICB9XSwKKyAgICAgIF0sCiAgICAgfSwKICAgICB7CiAgICAgICAndGFyZ2V0X25hbWUnOiAncGRmaXVtX2RpZmYnLAogICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCiAgICAgICAndmFyaWFibGVzJzogeyAnZW5hYmxlX3dleGl0X3RpbWVfZGVzdHJ1Y3RvcnMnOiAxLCB9LAogICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgJ2Z4X2xwbmcnLAogICAgICAgICAnLi4vcGRmaXVtLmd5cDpwZGZpdW0nLAogICAgICAgICAnLi4vdGhpcmRfcGFydHkvdGhpcmRfcGFydHkuZ3lwOnBkZml1bV9iYXNlJywKICAgICAgIF0sCi0gICAgICAnaW5jbHVkZV9kaXJzJzogWwotICAgICAgICAnLi4vLi4vJywKLSAgICAgIF0sCiAgICAgICAnc291cmNlcyc6IFsKICAgICAgICAgJ2ltYWdlX2RpZmYuY2MnLAogICAgICAgICAnaW1hZ2VfZGlmZl9wbmcuaCcsCiAgICAgICAgICdpbWFnZV9kaWZmX3BuZy5jYycsCiAgICAgICBdLAotICAgIH0sCi0gICAgewotICAgICAgJ3RhcmdldF9uYW1lJzogJ2Z4X2xwbmcnLAotICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAotICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgJy4uL3BkZml1bS5neXA6Znhjb2RlYycsCi0gICAgICBdLAotICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKLSAgICAgICAgJy4uL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi9pbmNsdWRlLycsCi0gICAgICBdLAotICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICdmeF9scG5nL2luY2x1ZGUvZnhfcG5nLmgnLAotICAgICAgICAnZnhfbHBuZy9zcmMvZnhfcG5nLmMnLAotICAgICAgICAnZnhfbHBuZy9zcmMvZnhfcG5nZXJyb3IuYycsCi0gICAgICAgICdmeF9scG5nL3NyYy9meF9wbmdnZXQuYycsCi0gICAgICAgICdmeF9scG5nL3NyYy9meF9wbmdtZW0uYycsCi0gICAgICAgICdmeF9scG5nL3NyYy9meF9wbmdwcmVhZC5jJywKLSAgICAgICAgJ2Z4X2xwbmcvc3JjL2Z4X3BuZ3JlYWQuYycsCi0gICAgICAgICdmeF9scG5nL3NyYy9meF9wbmdyaW8uYycsCi0gICAgICAgICdmeF9scG5nL3NyYy9meF9wbmdydHJhbi5jJywKLSAgICAgICAgJ2Z4X2xwbmcvc3JjL2Z4X3BuZ3J1dGlsLmMnLAotICAgICAgICAnZnhfbHBuZy9zcmMvZnhfcG5nc2V0LmMnLAotICAgICAgICAnZnhfbHBuZy9zcmMvZnhfcG5ndHJhbnMuYycsCi0gICAgICAgICdmeF9scG5nL3NyYy9meF9wbmd3aW8uYycsCi0gICAgICAgICdmeF9scG5nL3NyYy9meF9wbmd3cml0ZS5jJywKLSAgICAgICAgJ2Z4X2xwbmcvc3JjL2Z4X3BuZ3d0cmFuLmMnLAotICAgICAgICAnZnhfbHBuZy9zcmMvZnhfcG5nd3V0aWwuYycsCisgICAgICAnY29uZGl0aW9ucyc6IFsKKyAgICAgICAgWydwZGZfZW5hYmxlX3hmYT09MCcsIHsKKyAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAgICAgJy4uL3RoaXJkX3BhcnR5L3RoaXJkX3BhcnR5Lmd5cDpmeF9scG5nJywKKyAgICAgICAgICBdLAorICAgICAgICB9XSwKICAgICAgIF0sCiAgICAgfSwKICAgXSwKZGlmZiAtLWdpdCBhL3Rlc3QvYmFyY29kZV90ZXN0LnBkZiBiL3Rlc3QvYmFyY29kZV90ZXN0LnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDU0Y2QwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9iYXJjb2RlX3Rlc3QucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZHluYW1pY19saXN0X2JveF9hbGxvd19tdWx0aXBsZV9zZWxlY3Rpb24ucGRmIGIvdGVzdC9keW5hbWljX2xpc3RfYm94X2FsbG93X211bHRpcGxlX3NlbGVjdGlvbi5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzYWE3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZHluYW1pY19saXN0X2JveF9hbGxvd19tdWx0aXBsZV9zZWxlY3Rpb24ucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZHluYW1pY19wYXNzd29yZF9maWVsZF9iYWNrZ3JvdW5kX2ZpbGwucGRmIGIvdGVzdC9keW5hbWljX3Bhc3N3b3JkX2ZpZWxkX2JhY2tncm91bmRfZmlsbC5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlkNzRjZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZHluYW1pY19wYXNzd29yZF9maWVsZF9iYWNrZ3JvdW5kX2ZpbGwucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZHluYW1pY190YWJsZV8gY29sb3JfYW5kX3dpZHRoLnBkZiBiL3Rlc3QvZHluYW1pY190YWJsZV8gY29sb3JfYW5kX3dpZHRoLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjU5YzE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9keW5hbWljX3RhYmxlXyBjb2xvcl9hbmRfd2lkdGgucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZW1haWxfcmVjb21tZW5kZWQucGRmIGIvdGVzdC9lbWFpbF9yZWNvbW1lbmRlZC5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY1OTdhZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZW1haWxfcmVjb21tZW5kZWQucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvcmVzb2x2ZV9ub2Rlcy5wZGYgYi90ZXN0L3Jlc29sdmVfbm9kZXMucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2OTRmN2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Jlc29sdmVfbm9kZXMucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3Qvc3RhbmRhcmRfc3ltYm9scy5wZGYgYi90ZXN0L3N0YW5kYXJkX3N5bWJvbHMucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMDY1MjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3N0YW5kYXJkX3N5bWJvbHMucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3Qvc3RhdGljX2xpc3QgX2JveF9jYXB0aW9uLnBkZiBiL3Rlc3Qvc3RhdGljX2xpc3QgX2JveF9jYXB0aW9uLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjE2NmNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zdGF0aWNfbGlzdCBfYm94X2NhcHRpb24ucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3Qvc3RhdGljX3Bhc3N3b3JkX2ZpZWxkX3JvdGF0ZS5wZGYgYi90ZXN0L3N0YXRpY19wYXNzd29yZF9maWVsZF9yb3RhdGUucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYTQ1YjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3N0YXRpY19wYXNzd29yZF9maWVsZF9yb3RhdGUucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QveGZhX25vZGVfY2FwdGlvbi5wZGYgYi90ZXN0L3hmYV9ub2RlX2NhcHRpb24ucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmOGViN2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3hmYV9ub2RlX2NhcHRpb24ucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvREVQUyBiL3Rlc3RpbmcvREVQUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDllOTI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9ERVBTCkBAIC0wLDAgKzEsNiBAQAoraW5jbHVkZV9ydWxlcyA9IFsKKyAgJytjb3JlL2luY2x1ZGUnLAorICAnK2ZwZGZzZGsvaW5jbHVkZScsCisgICcrcHVibGljJywKKyAgJyt2OCcsCitdCmRpZmYgLS1naXQgYS90ZXN0aW5nL1NVUFBSRVNTSU9OUyBiL3Rlc3RpbmcvU1VQUFJFU1NJT05TCmluZGV4IDZlNzM3MGUuLmYyMmEyY2UgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvU1VQUFJFU1NJT05TCisrKyBiL3Rlc3RpbmcvU1VQUFJFU1NJT05TCkBAIC0xNiwxMSArMTYsNiBAQAogRlJDXzE2XzguMi4yX19UOC4zX0NvdW50X2VkaXRfMS5wZGYKIEZSQ18xXzguMi4yX19UOC4zX0ZpcnN0X2VtcHR5LnBkZgogRlJDXzJfOC4yLjJfX1Q4LjNfTGFzdF9lbXB0eS5wZGYKLUZSQ18zLjVfQ0ZfU3RyZl9zdG1mX0RlZmF1bHRDcnlwdEZpbHRlci5wZGYKLUZSQ18zLjVfRW5jcnlwdE1ldGFkYXRhX1QucGRmCi1GUkNfMy41X0VuY3J5cHRfaXNfZGFtYWdlLnBkZgotRlJDXzMuNV9GaWx0ZXJfUHViU2VjX1N1YkZpbHRlcl9zNS5wZGYKLUZSQ18zLjVfRmlsdGVyX1B1YlNlY19TdWJfU3ViRmlsdGVyX3M0LnBkZgogRlJDXzNfOC4yLjJfVHlwZV9lbXB0eS5wZGYKIEZSQ180XzguMi4yX19UOC4zX0NvdW50X2VtcHR5LnBkZgogRlJDXzVfOC4yLjJfX1Q4LjNfRmlyc3RfcmVtb3ZlLnBkZgpAQCAtNjIsNyArNTcsNiBAQAoganNfY2FsY3VsYXRlLnBkZgogbGlzdF9ib3gucGRmCiBudW1iZXIucGRmCi1vdXRsaW5lLnBkZgogcHVzaF9idXR0b24ucGRmCiByYWRpb19idXR0b24ucGRmCiBydW5fY3VzdG9tX3ZhbGlkYXRlX3NjcmlwdC5wZGYKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvU1VQUFJFU1NJT05TX2xpbnV4IGIvdGVzdGluZy9TVVBQUkVTU0lPTlNfbGludXgKaW5kZXggODZlM2EwNi4uOTBmYzBhMiAxMDA2NDQKLS0tIGEvdGVzdGluZy9TVVBQUkVTU0lPTlNfbGludXgKKysrIGIvdGVzdGluZy9TVVBQUkVTU0lPTlNfbGludXgKQEAgLTEsMyArMSw4IEBACiAjIExpc3Qgb2YgdGVzdHMgdG8gYmUgc2tpcHBlZCBvbiBsaW51eCBwbGF0Zm9ybXMsIG9uZSBwZXIgbGluZS4KICMgVHJ5IHRvIGtlZXAgdGhlIGZpbGUgYWxwaGFiZXRpemVkLgogZm9ybWF0X2N1c3RvbV9mb3JtYXQucGRmCisjIFRoZXNlIFhGQS1vbmx5IGZhaWx1cmVzIGFyZSBpbiBhIHNlcGFyYXRlIHNlY3Rpb24uCiswNTBfZXh0cmFfbS5wZGYKKzNiaWdwcmV2aWV3LnBkZgorZXhhbXBsZV8wMzMucGRmCit0ZXN0X20ucGRmCmRpZmYgLS1naXQgYS90ZXN0aW5nL1NVUFBSRVNTSU9OU19tYWMgYi90ZXN0aW5nL1NVUFBSRVNTSU9OU19tYWMKaW5kZXggMmExMDRhNC4uNzVhNTUxNSAxMDA2NDQKLS0tIGEvdGVzdGluZy9TVVBQUkVTU0lPTlNfbWFjCisrKyBiL3Rlc3RpbmcvU1VQUFJFU1NJT05TX21hYwpAQCAtMTMsNyArMTMsNiBAQAogMl8xMV9zdGFtcDMucGRmCiAyX2NvbG9yX2NhbHJnYi5wZGYKIDJfY29sb3JfaW5kZXhlZC5wZGYKLTJfdW5jb2xvcl90aWxpbmcucGRmCiAzX2ludGVycG9sYXRlX2ltYWdlLnBkZgogM2JpZ3ByZXZpZXcucGRmCiA0XzM1LnBkZgpAQCAtMzE5LDggKzMxOCw2IEBACiBleGFtcGxlXzA2My5wZGYKIGV4YW1wbGVfMDY0LnBkZgogZXhhbXBsZV8wNjUucGRmCi1mb250XzFfZW1iZWRkZWRfZm9udF9lbl9mZWF0dXJlLnBkZgotZm9udF8yX2VtYmVkZGVkX2ZvbnRfZW5fc2l6ZTE0LnBkZgogZm9ybV9jb21ib2JveF9kYXRlLnBkZgogZm9ybV9jb21ib2JveF9kYXRlMi5wZGYKIGZvcm1fY29tYm9ib3hfbnVtLnBkZgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9TVVBQUkVTU0lPTlNfd2luIGIvdGVzdGluZy9TVVBQUkVTU0lPTlNfd2luCmluZGV4IGY4ZDA2MDUuLjYyYzgxZDIgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvU1VQUFJFU1NJT05TX3dpbgorKysgYi90ZXN0aW5nL1NVUFBSRVNTSU9OU193aW4KQEAgLTEsNzMgKzEsMjQgQEAKICMgTGlzdCBvZiB0ZXN0cyB0byBiZSBza2lwcGVkIG9uIHdpbmRvd3MgcGxhdGZvcm1zLCBvbmUgcGVyIGxpbmUuCiAjIFRyeSB0byBrZWVwIHRoZSBmaWxlIGFscGhhYmV0aXplZC4KIDA1MF9leHRyYV9tLnBkZgotMTIucGRmCi0yX3VuY29sb3JfdGlsaW5nLnBkZgogM2JpZ3ByZXZpZXcucGRmCiA1LjVfc2ltcGxlX2ZvbnQucGRmCi1GUkNfMTBfOC4yLjRfVmlld19DLnBkZgotRlJDXzEwXzguMi40X19yZW1vdmVfTW9kRGF0ZV92YWx1ZS5wZGYKLUZSQ18xMV84LjIuMl9QcmV2X3JlbW92ZV9vYmoucGRmCi1GUkNfMTFfOC4yLjRfX3JlbW92ZV9Nb2REYXRlX2FsbC5wZGYKLUZSQ18xMl84LjIuNF9fcmVtb3ZlX01vZERhdGVfb2JqXy5wZGYKLUZSQ18xM184LjIuNF9yZW1vdmVfU2l6ZV92YWx1ZS5wZGYKLUZSQ18xNF84LjIuNF9yZW1vdmVfU2l6ZV9hbGwucGRmCi1GUkNfMTVfOC4yLjRfcmVtb3ZlX1NpemVfb2JqLnBkZgotRlJDXzE2XzguMi40X19yZW1vdmVfQ29tcHJlc3NlZFNpemVfX3ZhbHVlLnBkZgotRlJDXzE3XzguMi4yX19UOC40X0ZpcnN0X3JlbW92ZV92YWx1ZS5wZGYKLUZSQ18xN184LjIuNF9fcmVtb3ZlX0NvbXByZXNzZWRTaXplX19hbGwucGRmCi1GUkNfMThfOC4yLjRfX3JlbW92ZV9Db21wcmVzc2VkU2l6ZV9fb2JqLnBkZgotRlJDXzE5XzguMi40X19yZW1vdmVfQ3JlYXRpb25EYXRlX3ZhbHVlLnBkZgotRlJDXzFfOC4yLjRfX29yaWdpbmFsLnBkZgotRlJDXzIwXzguMi40X19yZW1vdmVfQ3JlYXRpb25EYXRlX2FsbC5wZGYKLUZSQ18yMV84LjIuMl9fVDguNF9GaXJzdF9yZW1vdmVfYWxsMi5wZGYKLUZSQ18yMV84LjIuNF9fcmVtb3ZlX0NyZWF0aW9uRGF0ZV9vYmoucGRmCi1GUkNfMjJfOC4yLjRfX3JlbW92ZV9PcmRlcl92YWx1ZS5wZGYKLUZSQ18yM184LjIuMl9fVDguNF9MYXN0X3JlbW92ZV92YWx1ZS5wZGYKLUZSQ18yM184LjIuNF9fcmVtb3ZlX09yZGVyX2FsbC5wZGYKLUZSQ18yNF84LjIuNF9fcmVtb3ZlX09yZGVyX29iai5wZGYKLUZSQ18yXzguMi40X19hZGRfdHlwZV8ucGRmCi1GUkNfMy41X0F1dGhFdmVudF9FRk9wZW4ucGRmCi1GUkNfMy41X0NGTV9BRVNWMl9fRW5jcnlwdE1ldGFkYXRhX0YucGRmCi1GUkNfMy41X0NGX0VGRl9TdGRDRl9TdHJmX1N0bWZfSWRlbnRpdHkucGRmCi1GUkNfMy41X0NGX1N0cmZfc3RtZl9TdGRDRi5wZGYKLUZSQ18zLjVfRW5jcnlwdE1ldGFkYXRhX05vbmUucGRmCiBGUkNfMy41X1BfXzM2MTZfUGFzc3dvcmRfMS5wZGYKLUZSQ18zLjVfVl80X0NGTV9WMl8ucGRmCi1GUkNfMy41X1ZfNV9DRk1fQUVTVjMucGRmCi1GUkNfMy41X3ZfMV9sZW5ndGhfNDBfRmlsdGVyX3N0YW5kYXJkLnBkZgotRlJDXzMuNV92XzJfbGVuZ3RoXzEyOF9BdXRoRXZlbnRfRG9jT3Blbl8ucGRmCi1GUkNfMzlfOC4yLjJfQ19lZGl0LnBkZgotRlJDXzNfOC4yLjRfX2FkZF90eXBlX3ZhbHVlLnBkZgotRlJDXzQ3XzguMi4yX0ZfZWRpdF9GXzMyX18zMi5wZGYKLUZSQ180OF84LjIuMl9GX2VkaXRfRl8xMDBfXzEwMC5wZGYKLUZSQ180XzguMi40X19yZW1vdmVfRmlsZU5hbWVfdmFsdWUucGRmCi1GUkNfNTZfOC4yLjJfQ19lZGl0X0NfXzEucGRmCi1GUkNfNThfOC4yLjJfQ291bnRfZWRpdF9jb3VudF9fMi5wZGYKLUZSQ181XzguMi40X19yZW1vdmVfRmlsZU5hbWVfYWxsLnBkZgotRlJDXzZfOC4yLjRfX3JlbW92ZV9GaWxlTmFtZV9vYmoucGRmCi1GUkNfN184LjIuNF9fcmVtb3ZlX0Rlc2NyaXB0aW9uX3ZhbHVlLnBkZgotRlJDXzguNV9CbF9IaWRlLnBkZgotRlJDXzguNV9Gb19VUklfQmFzZS5wZGYKLUZSQ184XzguMi40X19yZW1vdmVfX0Rlc2NyaXB0aW9uX2FsbC5wZGYKLUZSQ185XzguMi40X19yZW1vdmVfX0Rlc2NyaXB0aW9uX29iai5wZGYKLWJvb2ttYXJrZ2V0Y29sb3IucGRmCi1lbl9jb250YWN0LnBkZgotZW5fZGl5LnBkZgorZXhhbXBsZV8wMDIucGRmCitleGFtcGxlXzAwMy5wZGYKK2V4YW1wbGVfMDA2LnBkZgogZXhhbXBsZV8wMTAucGRmCi1leGFtcGxlXzAxNC5wZGYKIGV4YW1wbGVfMDE1LnBkZgorZXhhbXBsZV8wMjMucGRmCiBleGFtcGxlXzAzMy5wZGYKK2V4YW1wbGVfMDM1LnBkZgogZXhhbXBsZV8wMzYucGRmCiBleGFtcGxlXzAzOC5wZGYKIGV4YW1wbGVfMDQxLnBkZgotZXhhbXBsZV8wNDQucGRmCiBleGFtcGxlXzA0NS5wZGYKIGV4YW1wbGVfMDQ2LnBkZgogZXhhbXBsZV8wNTMucGRmCiBleGFtcGxlXzA1NS5wZGYKLWV4YW1wbGVfMDY1LnBkZgotZm9udF8xX2VtYmVkZGVkX2ZvbnRfZW5fZmVhdHVyZS5wZGYKLWZvbnRfMl9lbWJlZGRlZF9mb250X2VuX3NpemUxNC5wZGYKLXBhdGhfNV9wYXR0ZXJuLnBkZgorZXhhbXBsZV8wNTkucGRmCitleGFtcGxlXzA2MS5wZGYKIHRlc3RfbS5wZGYKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdC5jcHAgYi90ZXN0aW5nL2VtYmVkZGVyX3Rlc3QuY3BwCmluZGV4IDg0NTdhNzkuLmNlY2EyMDUgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdC5jcHAKKysrIGIvdGVzdGluZy9lbWJlZGRlcl90ZXN0LmNwcApAQCAtMSwxOTYgKzEsMTI3IEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTUgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLSNpbmNsdWRlICJlbWJlZGRlcl90ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCiAKICNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgogCiAjaW5jbHVkZSA8bGlzdD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKLSNpbmNsdWRlICIuLi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAiLi4vcHVibGljL2ZwZGZfdGV4dC5oIgotI2luY2x1ZGUgIi4uL3B1YmxpYy9mcGRmdmlldy5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2RhdGFhdmFpbC5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2VkaXQuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl90ZXh0LmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiCiAjaW5jbHVkZSAidGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgiCi0jaW5jbHVkZSAidjgvaW5jbHVkZS9saWJwbGF0Zm9ybS9saWJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInY4L2luY2x1ZGUvdjguaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL3Rlc3Rfc3VwcG9ydC5oIgorI2luY2x1ZGUgInRlc3RpbmcvdXRpbHMvcGF0aF9zZXJ2aWNlLmgiCiAKLSNpZmRlZiBfV0lOMzIKLSNkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCi0jZGVmaW5lIFBBVEhfU0VQQVJBVE9SICdcXCcKLSNlbHNlCi0jZGVmaW5lIFBBVEhfU0VQQVJBVE9SICcvJwotI2VuZGlmCisjaWZkZWYgUERGX0VOQUJMRV9WOAorI2luY2x1ZGUgInY4L2luY2x1ZGUvdjguaCIKKyNpbmNsdWRlICJ2OC9pbmNsdWRlL3Y4LXBsYXRmb3JtLmgiCisjZW5kaWYgIC8vIFBERl9FTkFCTEVfVjgKIAogbmFtZXNwYWNlIHsKLQogY29uc3QgY2hhciogZ19leGVfcGF0aF8gPSBudWxscHRyOwotCi0vLyBSZWFkcyB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIGEgZmlsZSBpbnRvIGEgbmV3bHkgbWFsbG9jJ2QgYnVmZmVyLgotc3RhdGljIGNoYXIqIEdldEZpbGVDb250ZW50cyhjb25zdCBjaGFyKiBmaWxlbmFtZSwgc2l6ZV90KiByZXRsZW4pIHsKLSAgRklMRSogZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKTsKLSAgaWYgKCFmaWxlKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gb3BlbjogJXNcbiIsIGZpbGVuYW1lKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICAodm9pZCkgZnNlZWsoZmlsZSwgMCwgU0VFS19FTkQpOwotICBzaXplX3QgZmlsZV9sZW5ndGggPSBmdGVsbChmaWxlKTsKLSAgaWYgKCFmaWxlX2xlbmd0aCkgewotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gICh2b2lkKSBmc2VlayhmaWxlLCAwLCBTRUVLX1NFVCk7Ci0gIGNoYXIqIGJ1ZmZlciA9IChjaGFyKikgbWFsbG9jKGZpbGVfbGVuZ3RoKTsKLSAgaWYgKCFidWZmZXIpIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBzaXplX3QgYnl0ZXNfcmVhZCA9IGZyZWFkKGJ1ZmZlciwgMSwgZmlsZV9sZW5ndGgsIGZpbGUpOwotICAodm9pZCkgZmNsb3NlKGZpbGUpOwotICBpZiAoYnl0ZXNfcmVhZCAhPSBmaWxlX2xlbmd0aCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHJlYWQ6ICVzXG4iLCBmaWxlbmFtZSk7Ci0gICAgZnJlZShidWZmZXIpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gICpyZXRsZW4gPSBieXRlc19yZWFkOwotICByZXR1cm4gYnVmZmVyOwotfQotCi0jaWZkZWYgVjhfVVNFX0VYVEVSTkFMX1NUQVJUVVBfREFUQQotLy8gUmV0dXJucyB0aGUgZnVsbCBwYXRoIGZvciBhbiBleHRlcm5hbCBWOCBkYXRhIGZpbGUgYmFzZWQgb24gZWl0aGVyCi0vLyB0aGUgY3VycmVjdCBleGVjdHVhYmxlIHBhdGggb3IgYW4gZXhwbGljaXQgb3ZlcnJpZGUuCi1zdGF0aWMgc3RkOjpzdHJpbmcgR2V0RnVsbFBhdGhGb3JTbmFwc2hvdEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGV4ZV9wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkgewotICBzdGQ6OnN0cmluZyByZXN1bHQ7Ci0gIGlmICghZXhlX3BhdGguZW1wdHkoKSkgewotICAgIHNpemVfdCBsYXN0X3NlcGFyYXRvciA9IGV4ZV9wYXRoLnJmaW5kKFBBVEhfU0VQQVJBVE9SKTsKLSAgICBpZiAobGFzdF9zZXBhcmF0b3IgIT0gc3RkOjpzdHJpbmc6Om5wb3MpICB7Ci0gICAgICByZXN1bHQgPSBleGVfcGF0aC5zdWJzdHIoMCwgbGFzdF9zZXBhcmF0b3IgKyAxKTsKLSAgICB9Ci0gIH0KLSAgcmVzdWx0ICs9IGZpbGVuYW1lOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBSZWFkcyBhbiBleHRlbmFsIFY4IGRhdGEgZmlsZSBmcm9tIHRoZSB8b3B0aW9uc3wtaW5kaWNhdGVkIGxvY2F0aW9uLAotLy8gcmV0dXJpbmcgdHJ1ZSBvbiBzdWNjZXNzIGFuZCBmYWxzZSBvbiBlcnJvci4KLXN0YXRpYyBib29sIEdldEV4dGVybmFsRGF0YShjb25zdCBzdGQ6OnN0cmluZyYgZXhlX3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpTdGFydHVwRGF0YSogcmVzdWx0X2RhdGEpIHsKLSAgc3RkOjpzdHJpbmcgZnVsbF9wYXRoID0gR2V0RnVsbFBhdGhGb3JTbmFwc2hvdEZpbGUoZXhlX3BhdGgsIGZpbGVuYW1lKTsKLSAgc2l6ZV90IGRhdGFfbGVuZ3RoID0gMDsKLSAgY2hhciogZGF0YV9idWZmZXIgPSBHZXRGaWxlQ29udGVudHMoZnVsbF9wYXRoLmNfc3RyKCksICZkYXRhX2xlbmd0aCk7Ci0gIGlmICghZGF0YV9idWZmZXIpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmVzdWx0X2RhdGEtPmRhdGEgPSBjb25zdF9jYXN0PGNvbnN0IGNoYXIqPihkYXRhX2J1ZmZlcik7Ci0gIHJlc3VsdF9kYXRhLT5yYXdfc2l6ZSA9IGRhdGFfbGVuZ3RoOwotICByZXR1cm4gdHJ1ZTsKLX0KLSNlbmRpZiAgLy8gVjhfVVNFX0VYVEVSTkFMX1NUQVJUVVBfREFUQQotCiB9ICAvLyBuYW1lc3BhY2UKIAotY2xhc3MgVGVzdExvYWRlciB7Ci0gcHVibGljOgotICBUZXN0TG9hZGVyKGNvbnN0IGNoYXIqIHBCdWYsIHNpemVfdCBsZW4pOwotCi0gIGNvbnN0IGNoYXIqIG1fcEJ1ZjsKLSAgc2l6ZV90IG1fTGVuOwotfTsKLQotVGVzdExvYWRlcjo6VGVzdExvYWRlcihjb25zdCBjaGFyKiBwQnVmLCBzaXplX3QgbGVuKQotICAgIDogbV9wQnVmKHBCdWYpLCBtX0xlbihsZW4pIHsKLX0KLQotaW50IEdldF9CbG9jayh2b2lkKiBwYXJhbSwgdW5zaWduZWQgbG9uZyBwb3MsIHVuc2lnbmVkIGNoYXIqIHBCdWYsCi0gICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkgewotICBUZXN0TG9hZGVyKiBwTG9hZGVyID0gKFRlc3RMb2FkZXIqKSBwYXJhbTsKLSAgaWYgKHBvcyArIHNpemUgPCBwb3MgfHwgcG9zICsgc2l6ZSA+IHBMb2FkZXItPm1fTGVuKSByZXR1cm4gMDsKLSAgbWVtY3B5KHBCdWYsIHBMb2FkZXItPm1fcEJ1ZiArIHBvcywgc2l6ZSk7Ci0gIHJldHVybiAxOwotfQotCiBGUERGX0JPT0wgSXNfRGF0YV9BdmFpbChGWF9GSUxFQVZBSUwqIHBUaGlzLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewogICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBBZGRfU2VnbWVudChGWF9ET1dOTE9BREhJTlRTKiBwVGhpcywgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKLX0KK3ZvaWQgQWRkX1NlZ21lbnQoRlhfRE9XTkxPQURISU5UUyogcFRoaXMsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7fQogCi1FbWJlZGRlclRlc3Q6OkVtYmVkZGVyVGVzdCgpIDoKK0VtYmVkZGVyVGVzdDo6RW1iZWRkZXJUZXN0KCkKKyAgICA6IGRlZmF1bHRfZGVsZWdhdGVfKG5ldyBFbWJlZGRlclRlc3Q6OkRlbGVnYXRlKCkpLAogICAgICAgZG9jdW1lbnRfKG51bGxwdHIpLAogICAgICAgZm9ybV9oYW5kbGVfKG51bGxwdHIpLAogICAgICAgYXZhaWxfKG51bGxwdHIpLAorICAgICAgZXh0ZXJuYWxfaXNvbGF0ZV8obnVsbHB0ciksCiAgICAgICBsb2FkZXJfKG51bGxwdHIpLAogICAgICAgZmlsZV9sZW5ndGhfKDApLAogICAgICAgZmlsZV9jb250ZW50c18obnVsbHB0cikgewogICBtZW1zZXQoJmhpbnRzXywgMCwgc2l6ZW9mKGhpbnRzXykpOwogICBtZW1zZXQoJmZpbGVfYWNjZXNzXywgMCwgc2l6ZW9mKGZpbGVfYWNjZXNzXykpOwogICBtZW1zZXQoJmZpbGVfYXZhaWxfLCAwLCBzaXplb2YoZmlsZV9hdmFpbF8pKTsKLSAgZGVmYXVsdF9kZWxlZ2F0ZV8gPSBuZXcgRW1iZWRkZXJUZXN0OjpEZWxlZ2F0ZSgpOwotICBkZWxlZ2F0ZV8gPSBkZWZhdWx0X2RlbGVnYXRlXzsKKyAgZGVsZWdhdGVfID0gZGVmYXVsdF9kZWxlZ2F0ZV8uZ2V0KCk7CisKKyNpZmRlZiBQREZfRU5BQkxFX1Y4CisjaWZkZWYgVjhfVVNFX0VYVEVSTkFMX1NUQVJUVVBfREFUQQorICBJbml0aWFsaXplVjhGb3JQREZpdW0oZ19leGVfcGF0aF8sIHN0ZDo6c3RyaW5nKCksICZuYXRpdmVzXywgJnNuYXBzaG90XywKKyAgICAgICAgICAgICAgICAgICAgICAgICZwbGF0Zm9ybV8pOworI2Vsc2UKKyAgSW5pdGlhbGl6ZVY4Rm9yUERGaXVtKCZwbGF0Zm9ybV8pOworI2VuZGlmICAvLyBWOF9VU0VfRVhURVJOQUxfU1RBUlRVUF9EQVRBCisjZW5kaWYgIC8vIEZQREZfRU5BQkxFX1Y4CiB9CiAKLUVtYmVkZGVyVGVzdDo6fkVtYmVkZGVyVGVzdCgpIHsKLSAgZGVsZXRlIGRlZmF1bHRfZGVsZWdhdGVfOwotfQorRW1iZWRkZXJUZXN0Ojp+RW1iZWRkZXJUZXN0KCkge30KIAogdm9pZCBFbWJlZGRlclRlc3Q6OlNldFVwKCkgewotICAgIHY4OjpWODo6SW5pdGlhbGl6ZUlDVSgpOworICBGUERGX0xJQlJBUllfQ09ORklHIGNvbmZpZzsKKyAgY29uZmlnLnZlcnNpb24gPSAyOworICBjb25maWcubV9wVXNlckZvbnRQYXRocyA9IG51bGxwdHI7CisgIGNvbmZpZy5tX3Y4RW1iZWRkZXJTbG90ID0gMDsKKyAgY29uZmlnLm1fcElzb2xhdGUgPSBleHRlcm5hbF9pc29sYXRlXzsKKyAgRlBERl9Jbml0TGlicmFyeVdpdGhDb25maWcoJmNvbmZpZyk7CiAKLSAgICBwbGF0Zm9ybV8gPSB2ODo6cGxhdGZvcm06OkNyZWF0ZURlZmF1bHRQbGF0Zm9ybSgpOwotICAgIHY4OjpWODo6SW5pdGlhbGl6ZVBsYXRmb3JtKHBsYXRmb3JtXyk7Ci0gICAgdjg6OlY4OjpJbml0aWFsaXplKCk7Ci0KLSAgICAvLyBCeSBlbmFibGluZyBwcmVkaWN0YWJsZSBtb2RlLCBWOCB3b24ndCBwb3N0IGFueSBiYWNrZ3JvdW5kIHRhc2tzLgotICAgIGNvbnN0IGNoYXIgcHJlZGljdGFibGVfZmxhZ1tdID0gIi0tcHJlZGljdGFibGUiOwotICAgIHY4OjpWODo6U2V0RmxhZ3NGcm9tU3RyaW5nKHByZWRpY3RhYmxlX2ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzdHJsZW4ocHJlZGljdGFibGVfZmxhZykpKTsKLQotI2lmZGVmIFY4X1VTRV9FWFRFUk5BTF9TVEFSVFVQX0RBVEEKLSAgICBBU1NFUlRfVFJVRShHZXRFeHRlcm5hbERhdGEoZ19leGVfcGF0aF8sICJuYXRpdmVzX2Jsb2IuYmluIiwgJm5hdGl2ZXNfKSk7Ci0gICAgQVNTRVJUX1RSVUUoR2V0RXh0ZXJuYWxEYXRhKGdfZXhlX3BhdGhfLCAic25hcHNob3RfYmxvYi5iaW4iLCAmc25hcHNob3RfKSk7Ci0gICAgdjg6OlY4OjpTZXROYXRpdmVzRGF0YUJsb2IoJm5hdGl2ZXNfKTsKLSAgICB2ODo6Vjg6OlNldFNuYXBzaG90RGF0YUJsb2IoJnNuYXBzaG90Xyk7Ci0jZW5kaWYgIC8vIFY4X1VTRV9FWFRFUk5BTF9TVEFSVFVQX0RBVEEKLQotICAgIEZQREZfSW5pdExpYnJhcnkoKTsKLQotICAgIFVOU1VQUE9SVF9JTkZPKiBpbmZvID0gc3RhdGljX2Nhc3Q8VU5TVVBQT1JUX0lORk8qPih0aGlzKTsKLSAgICBtZW1zZXQoaW5mbywgMCwgc2l6ZW9mKFVOU1VQUE9SVF9JTkZPKSk7Ci0gICAgaW5mby0+dmVyc2lvbiA9IDE7Ci0gICAgaW5mby0+RlNES19VblN1cHBvcnRfSGFuZGxlciA9IFVuc3VwcG9ydGVkSGFuZGxlclRyYW1wb2xpbmU7Ci0gICAgRlNES19TZXRVblNwT2JqUHJvY2Vzc0hhbmRsZXIoaW5mbyk7Ci0gIH0KKyAgVU5TVVBQT1JUX0lORk8qIGluZm8gPSBzdGF0aWNfY2FzdDxVTlNVUFBPUlRfSU5GTyo+KHRoaXMpOworICBtZW1zZXQoaW5mbywgMCwgc2l6ZW9mKFVOU1VQUE9SVF9JTkZPKSk7CisgIGluZm8tPnZlcnNpb24gPSAxOworICBpbmZvLT5GU0RLX1VuU3VwcG9ydF9IYW5kbGVyID0gVW5zdXBwb3J0ZWRIYW5kbGVyVHJhbXBvbGluZTsKKyAgRlNES19TZXRVblNwT2JqUHJvY2Vzc0hhbmRsZXIoaW5mbyk7Cit9CiAKIHZvaWQgRW1iZWRkZXJUZXN0OjpUZWFyRG93bigpIHsKICAgaWYgKGRvY3VtZW50XykgewogICAgIEZPUk1fRG9Eb2N1bWVudEFBY3Rpb24oZm9ybV9oYW5kbGVfLCBGUERGRE9DX0FBQ1RJT05fV0MpOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgICAgLy8gTm90ZTogVGhlIHNodXQgZG93biBvcmRlciBoZXJlIGlzIHRoZSByZXZlcnNlIG9mIHRoZSBub24tWEZBIGJyYW5jaAorICAgIC8vIG9yZGVyLiBOZWVkIHRvIHdvcmsgb3V0IGlmIHRoaXMgaXMgcmVxdWlyZWQsIGFuZCBpZiBpdCBpcywgdGhlIGxpZmV0aW1lcworICAgIC8vIG9mIG9iamVjdHMgb3duZWQgYnkgfGRvY3wgdGhhdCB8Zm9ybXwgcmVmZXJlbmNlLgogICAgIEZQREZfQ2xvc2VEb2N1bWVudChkb2N1bWVudF8pOwogICAgIEZQREZET0NfRXhpdEZvcm1GaWxsRW52aXJvbm1lbnQoZm9ybV9oYW5kbGVfKTsKKyNlbHNlICAgLy8gUERGX0VOQUJMRV9YRkEKKyAgICBGUERGRE9DX0V4aXRGb3JtRmlsbEVudmlyb25tZW50KGZvcm1faGFuZGxlXyk7CisgICAgRlBERl9DbG9zZURvY3VtZW50KGRvY3VtZW50Xyk7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAgIH0KKwogICBGUERGQXZhaWxfRGVzdHJveShhdmFpbF8pOwogICBGUERGX0Rlc3Ryb3lMaWJyYXJ5KCk7CisKKyNpZmRlZiBQREZfRU5BQkxFX1Y4CiAgIHY4OjpWODo6U2h1dGRvd25QbGF0Zm9ybSgpOwogICBkZWxldGUgcGxhdGZvcm1fOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1Y4CisKICAgZGVsZXRlIGxvYWRlcl87Ci0gIGZyZWUoZmlsZV9jb250ZW50c18pOwogfQogCi1ib29sIEVtYmVkZGVyVGVzdDo6T3BlbkRvY3VtZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkgewotICBmaWxlX2NvbnRlbnRzXyA9IEdldEZpbGVDb250ZW50cyhmaWxlbmFtZS5jX3N0cigpLCAmZmlsZV9sZW5ndGhfKTsKLSAgaWYgKCFmaWxlX2NvbnRlbnRzXykgeworYm9vbCBFbWJlZGRlclRlc3Q6OkNyZWF0ZUVtcHR5RG9jdW1lbnQoKSB7CisgIGRvY3VtZW50XyA9IEZQREZfQ3JlYXRlTmV3RG9jdW1lbnQoKTsKKyAgaWYgKCFkb2N1bWVudF8pCiAgICAgcmV0dXJuIGZhbHNlOwotICB9CiAKLSAgbG9hZGVyXyA9IG5ldyBUZXN0TG9hZGVyKGZpbGVfY29udGVudHNfLCBmaWxlX2xlbmd0aF8pOworICBTZXR1cEZvcm1GaWxsRW52aXJvbm1lbnQoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRW1iZWRkZXJUZXN0OjpPcGVuRG9jdW1lbnQoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG11c3RfbGluZWFyaXplKSB7CisgIHN0ZDo6c3RyaW5nIGZpbGVfcGF0aDsKKyAgaWYgKCFQYXRoU2VydmljZTo6R2V0VGVzdEZpbGVQYXRoKGZpbGVuYW1lLCAmZmlsZV9wYXRoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGZpbGVfY29udGVudHNfID0gR2V0RmlsZUNvbnRlbnRzKGZpbGVfcGF0aC5jX3N0cigpLCAmZmlsZV9sZW5ndGhfKTsKKyAgaWYgKCFmaWxlX2NvbnRlbnRzXykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbG9hZGVyXyA9IG5ldyBUZXN0TG9hZGVyKGZpbGVfY29udGVudHNfLmdldCgpLCBmaWxlX2xlbmd0aF8pOwogICBmaWxlX2FjY2Vzc18ubV9GaWxlTGVuID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oZmlsZV9sZW5ndGhfKTsKLSAgZmlsZV9hY2Nlc3NfLm1fR2V0QmxvY2sgPSBHZXRfQmxvY2s7CisgIGZpbGVfYWNjZXNzXy5tX0dldEJsb2NrID0gVGVzdExvYWRlcjo6R2V0QmxvY2s7CiAgIGZpbGVfYWNjZXNzXy5tX1BhcmFtID0gbG9hZGVyXzsKIAogICBmaWxlX2F2YWlsXy52ZXJzaW9uID0gMTsKQEAgLTIwMCwzNCArMTMxLDc3IEBACiAgIGhpbnRzXy5BZGRTZWdtZW50ID0gQWRkX1NlZ21lbnQ7CiAKICAgYXZhaWxfID0gRlBERkF2YWlsX0NyZWF0ZSgmZmlsZV9hdmFpbF8sICZmaWxlX2FjY2Vzc18pOwotICAodm9pZCkgRlBERkF2YWlsX0lzRG9jQXZhaWwoYXZhaWxfLCAmaGludHNfKTsKIAotICBpZiAoIUZQREZBdmFpbF9Jc0xpbmVhcml6ZWQoYXZhaWxfKSkgewotICAgIGRvY3VtZW50XyA9IEZQREZfTG9hZEN1c3RvbURvY3VtZW50KCZmaWxlX2FjY2Vzc18sIG51bGxwdHIpOwotICB9IGVsc2UgeworICBpZiAoRlBERkF2YWlsX0lzTGluZWFyaXplZChhdmFpbF8pID09IFBERl9MSU5FQVJJWkVEKSB7CiAgICAgZG9jdW1lbnRfID0gRlBERkF2YWlsX0dldERvY3VtZW50KGF2YWlsXywgbnVsbHB0cik7CisgICAgaWYgKCFkb2N1bWVudF8pIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaW50MzJfdCBuUmV0ID0gUERGX0RBVEFfTk9UQVZBSUw7CisgICAgd2hpbGUgKG5SZXQgPT0gUERGX0RBVEFfTk9UQVZBSUwpIHsKKyAgICAgIG5SZXQgPSBGUERGQXZhaWxfSXNEb2NBdmFpbChhdmFpbF8sICZoaW50c18pOworICAgIH0KKyAgICBpZiAoblJldCA9PSBQREZfREFUQV9FUlJPUikgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBuUmV0ID0gRlBERkF2YWlsX0lzRm9ybUF2YWlsKGF2YWlsXywgJmhpbnRzXyk7CisgICAgaWYgKG5SZXQgPT0gUERGX0ZPUk1fRVJST1IgfHwgblJldCA9PSBQREZfRk9STV9OT1RBVkFJTCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpbnQgcGFnZV9jb3VudCA9IEZQREZfR2V0UGFnZUNvdW50KGRvY3VtZW50Xyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlX2NvdW50OyArK2kpIHsKKyAgICAgIG5SZXQgPSBQREZfREFUQV9OT1RBVkFJTDsKKyAgICAgIHdoaWxlIChuUmV0ID09IFBERl9EQVRBX05PVEFWQUlMKSB7CisgICAgICAgIG5SZXQgPSBGUERGQXZhaWxfSXNQYWdlQXZhaWwoYXZhaWxfLCBpLCAmaGludHNfKTsKKyAgICAgIH0KKyAgICAgIGlmIChuUmV0ID09IFBERl9EQVRBX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKG11c3RfbGluZWFyaXplKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGRvY3VtZW50XyA9IEZQREZfTG9hZEN1c3RvbURvY3VtZW50KCZmaWxlX2FjY2Vzc18sIG51bGxwdHIpOworICAgIGlmICghZG9jdW1lbnRfKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogICB9CiAKLSAgKHZvaWQpIEZQREZfR2V0RG9jUGVybWlzc2lvbnMoZG9jdW1lbnRfKTsKLSAgKHZvaWQpIEZQREZBdmFpbF9Jc0Zvcm1BdmFpbChhdmFpbF8sICZoaW50c18pOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIGludCBkb2NUeXBlID0gRE9DVFlQRV9QREY7CisgIGlmIChGUERGX0hhc1hGQUZpZWxkKGRvY3VtZW50XywgJmRvY1R5cGUpKSB7CisgICAgaWYgKGRvY1R5cGUgIT0gRE9DVFlQRV9QREYpCisgICAgICAodm9pZClGUERGX0xvYWRYRkEoZG9jdW1lbnRfKTsKKyAgfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCisgICh2b2lkKUZQREZfR2V0RG9jUGVybWlzc2lvbnMoZG9jdW1lbnRfKTsKKyAgU2V0dXBGb3JtRmlsbEVudmlyb25tZW50KCk7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIEVtYmVkZGVyVGVzdDo6U2V0dXBGb3JtRmlsbEVudmlyb25tZW50KCkgewogICBJUERGX0pTUExBVEZPUk0qIHBsYXRmb3JtID0gc3RhdGljX2Nhc3Q8SVBERl9KU1BMQVRGT1JNKj4odGhpcyk7CiAgIG1lbXNldChwbGF0Zm9ybSwgMCwgc2l6ZW9mKElQREZfSlNQTEFURk9STSkpOwotICBwbGF0Zm9ybS0+dmVyc2lvbiA9IDE7CisgIHBsYXRmb3JtLT52ZXJzaW9uID0gMjsKICAgcGxhdGZvcm0tPmFwcF9hbGVydCA9IEFsZXJ0VHJhbXBvbGluZTsKIAogICBGUERGX0ZPUk1GSUxMSU5GTyogZm9ybWZpbGxpbmZvID0gc3RhdGljX2Nhc3Q8RlBERl9GT1JNRklMTElORk8qPih0aGlzKTsKICAgbWVtc2V0KGZvcm1maWxsaW5mbywgMCwgc2l6ZW9mKEZQREZfRk9STUZJTExJTkZPKSk7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgZm9ybWZpbGxpbmZvLT52ZXJzaW9uID0gMjsKKyNlbHNlICAgLy8gUERGX0VOQUJMRV9YRkEKICAgZm9ybWZpbGxpbmZvLT52ZXJzaW9uID0gMTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKICAgZm9ybWZpbGxpbmZvLT5GRklfU2V0VGltZXIgPSBTZXRUaW1lclRyYW1wb2xpbmU7CiAgIGZvcm1maWxsaW5mby0+RkZJX0tpbGxUaW1lciA9IEtpbGxUaW1lclRyYW1wb2xpbmU7CisgIGZvcm1maWxsaW5mby0+RkZJX0dldFBhZ2UgPSBHZXRQYWdlVHJhbXBvbGluZTsKICAgZm9ybWZpbGxpbmZvLT5tX3BKc1BsYXRmb3JtID0gcGxhdGZvcm07CiAKICAgZm9ybV9oYW5kbGVfID0gRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudChkb2N1bWVudF8sIGZvcm1maWxsaW5mbyk7CiAgIEZQREZfU2V0Rm9ybUZpZWxkSGlnaGxpZ2h0Q29sb3IoZm9ybV9oYW5kbGVfLCAwLCAweEZGRTRERCk7CiAgIEZQREZfU2V0Rm9ybUZpZWxkSGlnaGxpZ2h0QWxwaGEoZm9ybV9oYW5kbGVfLCAxMDApOwotCi0gIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEVtYmVkZGVyVGVzdDo6RG9PcGVuQWN0aW9ucygpIHsKQEAgLTIzNywxNCArMjExLDE0IEBACiAKIGludCBFbWJlZGRlclRlc3Q6OkdldEZpcnN0UGFnZU51bSgpIHsKICAgaW50IGZpcnN0X3BhZ2UgPSBGUERGQXZhaWxfR2V0Rmlyc3RQYWdlTnVtKGRvY3VtZW50Xyk7Ci0gICh2b2lkKSBGUERGQXZhaWxfSXNQYWdlQXZhaWwoYXZhaWxfLCBmaXJzdF9wYWdlLCAmaGludHNfKTsKKyAgKHZvaWQpRlBERkF2YWlsX0lzUGFnZUF2YWlsKGF2YWlsXywgZmlyc3RfcGFnZSwgJmhpbnRzXyk7CiAgIHJldHVybiBmaXJzdF9wYWdlOwogfQogCiBpbnQgRW1iZWRkZXJUZXN0OjpHZXRQYWdlQ291bnQoKSB7CiAgIGludCBwYWdlX2NvdW50ID0gRlBERl9HZXRQYWdlQ291bnQoZG9jdW1lbnRfKTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlX2NvdW50OyArK2kpIHsKLSAgICAodm9pZCkgRlBERkF2YWlsX0lzUGFnZUF2YWlsKGF2YWlsXywgaSwgJmhpbnRzXyk7CisgICAgKHZvaWQpRlBERkF2YWlsX0lzUGFnZUF2YWlsKGF2YWlsXywgaSwgJmhpbnRzXyk7CiAgIH0KICAgcmV0dXJuIHBhZ2VfY291bnQ7CiB9CkBAIC0yNTksMTEgKzIzMywyMiBAQAogICByZXR1cm4gcGFnZTsKIH0KIAorRlBERl9QQUdFIEVtYmVkZGVyVGVzdDo6TG9hZEFuZENhY2hlUGFnZShpbnQgcGFnZV9udW1iZXIpIHsKKyAgRlBERl9QQUdFIHBhZ2UgPSBkZWxlZ2F0ZV8tPkdldFBhZ2UoZm9ybV9oYW5kbGVfLCBkb2N1bWVudF8sIHBhZ2VfbnVtYmVyKTsKKyAgaWYgKCFwYWdlKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgRk9STV9Eb1BhZ2VBQWN0aW9uKHBhZ2UsIGZvcm1faGFuZGxlXywgRlBERlBBR0VfQUFDVElPTl9PUEVOKTsKKyAgcmV0dXJuIHBhZ2U7Cit9CisKIEZQREZfQklUTUFQIEVtYmVkZGVyVGVzdDo6UmVuZGVyUGFnZShGUERGX1BBR0UgcGFnZSkgewogICBpbnQgd2lkdGggPSBzdGF0aWNfY2FzdDxpbnQ+KEZQREZfR2V0UGFnZVdpZHRoKHBhZ2UpKTsKICAgaW50IGhlaWdodCA9IHN0YXRpY19jYXN0PGludD4oRlBERl9HZXRQYWdlSGVpZ2h0KHBhZ2UpKTsKLSAgRlBERl9CSVRNQVAgYml0bWFwID0gRlBERkJpdG1hcF9DcmVhdGUod2lkdGgsIGhlaWdodCwgMCk7Ci0gIEZQREZCaXRtYXBfRmlsbFJlY3QoYml0bWFwLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAweEZGRkZGRkZGKTsKKyAgaW50IGFscGhhID0gRlBERlBhZ2VfSGFzVHJhbnNwYXJlbmN5KHBhZ2UpID8gMSA6IDA7CisgIEZQREZfQklUTUFQIGJpdG1hcCA9IEZQREZCaXRtYXBfQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIGFscGhhKTsKKyAgRlBERl9EV09SRCBmaWxsX2NvbG9yID0gYWxwaGEgPyAweDAwMDAwMDAwIDogMHhGRkZGRkZGRjsKKyAgRlBERkJpdG1hcF9GaWxsUmVjdChiaXRtYXAsIDAsIDAsIHdpZHRoLCBoZWlnaHQsIGZpbGxfY29sb3IpOwogICBGUERGX1JlbmRlclBhZ2VCaXRtYXAoYml0bWFwLCBwYWdlLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAwLCAwKTsKICAgRlBERl9GRkxEcmF3KGZvcm1faGFuZGxlXywgYml0bWFwLCBwYWdlLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAwLCAwKTsKICAgcmV0dXJuIGJpdG1hcDsKQEAgLTI3NSw2ICsyNjAsMjIgQEAKICAgRlBERl9DbG9zZVBhZ2UocGFnZSk7CiB9CiAKK0ZQREZfUEFHRSBFbWJlZGRlclRlc3Q6OkRlbGVnYXRlOjpHZXRQYWdlKEZQREZfRk9STUhBTkRMRSBmb3JtX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFnZV9pbmRleCkgeworICBhdXRvIGl0ID0gbV9wYWdlTWFwLmZpbmQocGFnZV9pbmRleCk7CisgIGlmIChpdCAhPSBtX3BhZ2VNYXAuZW5kKCkpIHsKKyAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgfQorICBGUERGX1BBR0UgcGFnZSA9IEZQREZfTG9hZFBhZ2UoZG9jdW1lbnQsIHBhZ2VfaW5kZXgpOworICBpZiAoIXBhZ2UpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBtX3BhZ2VNYXBbcGFnZV9pbmRleF0gPSBwYWdlOworICBGT1JNX09uQWZ0ZXJMb2FkUGFnZShwYWdlLCBmb3JtX2hhbmRsZSk7CisgIHJldHVybiBwYWdlOworfQorCiAvLyBzdGF0aWMKIHZvaWQgRW1iZWRkZXJUZXN0OjpVbnN1cHBvcnRlZEhhbmRsZXJUcmFtcG9saW5lKFVOU1VQUE9SVF9JTkZPKiBpbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUpIHsKQEAgLTI5NCw3ICsyOTUsOCBAQAogCiAvLyBzdGF0aWMKIGludCBFbWJlZGRlclRlc3Q6OlNldFRpbWVyVHJhbXBvbGluZShGUERGX0ZPUk1GSUxMSU5GTyogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXNlY3MsIFRpbWVyQ2FsbGJhY2sgZm4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXNlY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZXJDYWxsYmFjayBmbikgewogICBFbWJlZGRlclRlc3QqIHRlc3QgPSBzdGF0aWNfY2FzdDxFbWJlZGRlclRlc3QqPihpbmZvKTsKICAgcmV0dXJuIHRlc3QtPmRlbGVnYXRlXy0+U2V0VGltZXIobXNlY3MsIGZuKTsKIH0KQEAgLTMwNSw2ICszMDcsMTQgQEAKICAgcmV0dXJuIHRlc3QtPmRlbGVnYXRlXy0+S2lsbFRpbWVyKGlkKTsKIH0KIAorLy8gc3RhdGljCitGUERGX1BBR0UgRW1iZWRkZXJUZXN0OjpHZXRQYWdlVHJhbXBvbGluZShGUERGX0ZPUk1GSUxMSU5GTyogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFnZV9pbmRleCkgeworICBFbWJlZGRlclRlc3QqIHRlc3QgPSBzdGF0aWNfY2FzdDxFbWJlZGRlclRlc3QqPihpbmZvKTsKKyAgcmV0dXJuIHRlc3QtPmRlbGVnYXRlXy0+R2V0UGFnZSh0ZXN0LT5mb3JtX2hhbmRsZSgpLCBkb2N1bWVudCwgcGFnZV9pbmRleCk7Cit9CisKIC8vIENhbid0IHVzZSBndGVzdC1wcm92aWRlZCBtYWluIHNpbmNlIHdlIG5lZWQgdG8gc3Rhc2ggdGhlIHBhdGggdG8gdGhlCiAvLyBleGVjdXRhYmxlIGluIG9yZGVyIHRvIGZpbmQgdGhlIGV4dGVybmFsIFY4IGJpbmFyeSBkYXRhIGZpbGVzLgogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CmRpZmYgLS1naXQgYS90ZXN0aW5nL2VtYmVkZGVyX3Rlc3QuaCBiL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdC5oCmluZGV4IGIwODM0ZGQuLmEyMWE1NWQgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdC5oCisrKyBiL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdC5oCkBAIC0xLDE5ICsxLDI0IEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTUgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKICNpZm5kZWYgVEVTVElOR19FTUJFRERFUl9URVNUX0hfCiAjZGVmaW5lIFRFU1RJTkdfRU1CRURERVJfVEVTVF9IXwogCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzdHJpbmc+CiAKLSNpbmNsdWRlICIuLi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAiLi4vcHVibGljL2ZwZGZfZGF0YWF2YWlsLmgiCi0jaW5jbHVkZSAiLi4vcHVibGljL2ZwZGZfZXh0LmgiCi0jaW5jbHVkZSAiLi4vcHVibGljL2ZwZGZfZm9ybWZpbGwuaCIKLSNpbmNsdWRlICIuLi9wdWJsaWMvZnBkZnZpZXcuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9kYXRhYXZhaWwuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9leHQuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9mb3JtZmlsbC5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmdmlldy5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgInRlc3RpbmcvdGVzdF9zdXBwb3J0LmgiCisKKyNpZmRlZiBQREZfRU5BQkxFX1Y4CiAjaW5jbHVkZSAidjgvaW5jbHVkZS92OC5oIgorI2VuZGlmICAvLyBQREZfRU5BQkxFX3Y4CiAKIGNsYXNzIFRlc3RMb2FkZXI7CiAKQEAgLTI2LDE0ICszMSwxNiBAQAogIHB1YmxpYzoKICAgY2xhc3MgRGVsZWdhdGUgewogICAgcHVibGljOgotICAgIHZpcnR1YWwgfkRlbGVnYXRlKCkgeyB9CisgICAgdmlydHVhbCB+RGVsZWdhdGUoKSB7fQogCiAgICAgLy8gRXF1aXZhbGVudCB0byBVTlNVUFBPUlRfSU5GTzo6RlNES19VblN1cHBvcnRfSGFuZGxlcigpLgotICAgIHZpcnR1YWwgdm9pZCBVbnN1cHBvcnRlZEhhbmRsZXIoaW50IHR5cGUpIHsgfQorICAgIHZpcnR1YWwgdm9pZCBVbnN1cHBvcnRlZEhhbmRsZXIoaW50IHR5cGUpIHt9CiAKICAgICAvLyBFcXVpdmFsZW50IHRvIElQREZfSlNQTEFURk9STTo6YXBwX2FsZXJ0KCkuCi0gICAgdmlydHVhbCBpbnQgQWxlcnQoRlBERl9XSURFU1RSSU5HIG1lc3NhZ2UsIEZQREZfV0lERVNUUklORyB0aXRsZSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwgaW50IGljb24pIHsKKyAgICB2aXJ0dWFsIGludCBBbGVydChGUERGX1dJREVTVFJJTkcgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGljb24pIHsKICAgICAgIHJldHVybiAwOwogICAgIH0KIApAQCAtNDEsNyArNDgsMTUgQEAKICAgICB2aXJ0dWFsIGludCBTZXRUaW1lcihpbnQgbXNlY3MsIFRpbWVyQ2FsbGJhY2sgZm4pIHsgcmV0dXJuIDA7IH0KIAogICAgIC8vIEVxdWl2YWxlbnQgdG8gRlBERl9GT1JNRklMTElORk86OkZGSV9LaWxsVGltZXIoKS4KLSAgICB2aXJ0dWFsIHZvaWQgS2lsbFRpbWVyKGludCBpZCkgeyB9CisgICAgdmlydHVhbCB2b2lkIEtpbGxUaW1lcihpbnQgaWQpIHt9CisKKyAgICAvLyBFcXVpdmFsZW50IHRvIEZQREZfRk9STUZJTExJTkZPOjpGRklfR2V0UGFnZSgpLgorICAgIHZpcnR1YWwgRlBERl9QQUdFIEdldFBhZ2UoRlBERl9GT1JNSEFORExFIGZvcm1faGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWdlX2luZGV4KTsKKworICAgcHJpdmF0ZToKKyAgICBzdGQ6Om1hcDxpbnQsIEZQREZfUEFHRT4gbV9wYWdlTWFwOwogICB9OwogCiAgIEVtYmVkZGVyVGVzdCgpOwpAQCAtNTAsMTYgKzY1LDMwIEBACiAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZTsKICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlOwogCisjaWZkZWYgUERGX0VOQUJMRV9WOAorICAvLyBDYWxsIGJlZm9yZSBTZXRVcCB0byBwYXNzIHNoYXJlZCBpc29sYXRlLCBvdGhlcndpc2UgUERGaXVtIGNyZWF0ZXMgb25lLgorICB2b2lkIFNldEV4dGVybmFsSXNvbGF0ZSh2b2lkKiBpc29sYXRlKSB7CisgICAgZXh0ZXJuYWxfaXNvbGF0ZV8gPSBzdGF0aWNfY2FzdDx2ODo6SXNvbGF0ZSo+KGlzb2xhdGUpOworICB9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfVjgKKwogICB2b2lkIFNldERlbGVnYXRlKERlbGVnYXRlKiBkZWxlZ2F0ZSkgewotICAgIGRlbGVnYXRlXyA9IGRlbGVnYXRlID8gZGVsZWdhdGUgOiBkZWZhdWx0X2RlbGVnYXRlXzsKKyAgICBkZWxlZ2F0ZV8gPSBkZWxlZ2F0ZSA/IGRlbGVnYXRlIDogZGVmYXVsdF9kZWxlZ2F0ZV8uZ2V0KCk7CiAgIH0KIAogICBGUERGX0RPQ1VNRU5UIGRvY3VtZW50KCkgeyByZXR1cm4gZG9jdW1lbnRfOyB9CiAgIEZQREZfRk9STUhBTkRMRSBmb3JtX2hhbmRsZSgpIHsgcmV0dXJuIGZvcm1faGFuZGxlXzsgfQogCisgIC8vIENyZWF0ZSBhbiBlbXB0eSBkb2N1bWVudCwgYW5kIGl0cyBmb3JtIGZpbGwgZW52aXJvbm1lbnQuIFJldHVybnMgdHJ1ZQorICAvLyBvbiBzdWNjZXNzIG9yIGZhbHNlIG9uIGZhaWx1cmUuCisgIHZpcnR1YWwgYm9vbCBDcmVhdGVFbXB0eURvY3VtZW50KCk7CisKICAgLy8gT3BlbiB0aGUgZG9jdW1lbnQgc3BlY2lmaWVkIGJ5IHxmaWxlbmFtZXwsIGFuZCBjcmVhdGUgaXRzIGZvcm0gZmlsbAogICAvLyBlbnZpcm9ubWVudCwgb3IgcmV0dXJuIGZhbHNlIG9uIGZhaWx1cmUuCi0gIHZpcnR1YWwgYm9vbCBPcGVuRG9jdW1lbnQoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKTsKKyAgLy8gVGhlIGZpbGVuYW1lIGlzIHJlbGF0aXZlIHRvIHRoZSB0ZXN0IGRhdGEgZGlyZWN0b3J5IHdoZXJlIHdlIHN0b3JlIGFsbCB0aGUKKyAgLy8gdGVzdCBmaWxlcy4KKyAgdmlydHVhbCBib29sIE9wZW5Eb2N1bWVudChjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtdXN0X2xpbmVhcml6ZSA9IGZhbHNlKTsKIAogICAvLyBQZXJmb3JtIEphdmFTY3JpcHQgYWN0aW9ucyB0aGF0IGFyZSB0byBydW4gYXQgZG9jdW1lbnQgb3BlbiB0aW1lLgogICB2aXJ0dWFsIHZvaWQgRG9PcGVuQWN0aW9ucygpOwpAQCAtNzEsNiArMTAwLDEwIEBACiAgIC8vIExvYWQgYSBzcGVjaWZpYyBwYWdlIG9mIHRoZSBvcGVuIGRvY3VtZW50LgogICB2aXJ0dWFsIEZQREZfUEFHRSBMb2FkUGFnZShpbnQgcGFnZV9udW1iZXIpOwogCisgIC8vIExvYWQgYSBzcGVjaWZpYyBwYWdlIG9mIHRoZSBvcGVuIGRvY3VtZW50IHVzaW5nIGRlbGVnYXRlXy0+R2V0UGFnZS4KKyAgLy8gZGVsZWdhdGVfLT5HZXRQYWdlIGFsc28gY2FjaGVzIGxvYWRlZCBwYWdlLgorICB2aXJ0dWFsIEZQREZfUEFHRSBMb2FkQW5kQ2FjaGVQYWdlKGludCBwYWdlX251bWJlcik7CisKICAgLy8gQ29udmVydCBhIGxvYWRlZCBwYWdlIGludG8gYSBiaXRtYXAuCiAgIHZpcnR1YWwgRlBERl9CSVRNQVAgUmVuZGVyUGFnZShGUERGX1BBR0UgcGFnZSk7CiAKQEAgLTc5LDI4ICsxMTIsNDAgQEAKICAgdmlydHVhbCB2b2lkIFVubG9hZFBhZ2UoRlBERl9QQUdFIHBhZ2UpOwogCiAgcHJvdGVjdGVkOgorICB2b2lkIFNldHVwRm9ybUZpbGxFbnZpcm9ubWVudCgpOworCiAgIERlbGVnYXRlKiBkZWxlZ2F0ZV87Ci0gIERlbGVnYXRlKiBkZWZhdWx0X2RlbGVnYXRlXzsKKyAgc3RkOjp1bmlxdWVfcHRyPERlbGVnYXRlPiBkZWZhdWx0X2RlbGVnYXRlXzsKICAgRlBERl9ET0NVTUVOVCBkb2N1bWVudF87CiAgIEZQREZfRk9STUhBTkRMRSBmb3JtX2hhbmRsZV87CiAgIEZQREZfQVZBSUwgYXZhaWxfOwogICBGWF9ET1dOTE9BREhJTlRTIGhpbnRzXzsKICAgRlBERl9GSUxFQUNDRVNTIGZpbGVfYWNjZXNzXzsKICAgRlhfRklMRUFWQUlMIGZpbGVfYXZhaWxfOworI2lmZGVmIFBERl9FTkFCTEVfVjgKICAgdjg6OlBsYXRmb3JtKiBwbGF0Zm9ybV87CiAgIHY4OjpTdGFydHVwRGF0YSBuYXRpdmVzXzsKICAgdjg6OlN0YXJ0dXBEYXRhIHNuYXBzaG90XzsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9WOAorICB2b2lkKiBleHRlcm5hbF9pc29sYXRlXzsKICAgVGVzdExvYWRlciogbG9hZGVyXzsKICAgc2l6ZV90IGZpbGVfbGVuZ3RoXzsKLSAgY2hhciogZmlsZV9jb250ZW50c187CisgIHN0ZDo6dW5pcXVlX3B0cjxjaGFyLCBwZGZpdW06OkZyZWVEZWxldGVyPiBmaWxlX2NvbnRlbnRzXzsKIAogIHByaXZhdGU6CiAgIHN0YXRpYyB2b2lkIFVuc3VwcG9ydGVkSGFuZGxlclRyYW1wb2xpbmUoVU5TVVBQT1JUX0lORk8qLCBpbnQgdHlwZSk7Ci0gIHN0YXRpYyBpbnQgQWxlcnRUcmFtcG9saW5lKElQREZfSlNQTEFURk9STSogcGxhZm9ybSwgRlBERl9XSURFU1RSSU5HIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyB0aXRsZSwgaW50IHR5cGUsIGludCBpY29uKTsKLSAgc3RhdGljIGludCBTZXRUaW1lclRyYW1wb2xpbmUoRlBERl9GT1JNRklMTElORk8qIGluZm8sIGludCBtc2VjcywKKyAgc3RhdGljIGludCBBbGVydFRyYW1wb2xpbmUoSVBERl9KU1BMQVRGT1JNKiBwbGFmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGljb24pOworICBzdGF0aWMgaW50IFNldFRpbWVyVHJhbXBvbGluZShGUERGX0ZPUk1GSUxMSU5GTyogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1zZWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lckNhbGxiYWNrIGZuKTsKICAgc3RhdGljIHZvaWQgS2lsbFRpbWVyVHJhbXBvbGluZShGUERGX0ZPUk1GSUxMSU5GTyogaW5mbywgaW50IGlkKTsKKyAgc3RhdGljIEZQREZfUEFHRSBHZXRQYWdlVHJhbXBvbGluZShGUERGX0ZPUk1GSUxMSU5GTyogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWdlX2luZGV4KTsKIH07CiAKICNlbmRpZiAgLy8gVEVTVElOR19FTUJFRERFUl9URVNUX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL2VtYmVkZGVyX3Rlc3RfbW9ja19kZWxlZ2F0ZS5oIGIvdGVzdGluZy9lbWJlZGRlcl90ZXN0X21vY2tfZGVsZWdhdGUuaAppbmRleCAxZTRlOTk1Li40N2U3OTVhIDEwMDY0NAotLS0gYS90ZXN0aW5nL2VtYmVkZGVyX3Rlc3RfbW9ja19kZWxlZ2F0ZS5oCisrKyBiL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdF9tb2NrX2RlbGVnYXRlLmgKQEAgLTExLDExICsxMSwxMSBAQAogY2xhc3MgRW1iZWRkZXJUZXN0TW9ja0RlbGVnYXRlIDogcHVibGljIEVtYmVkZGVyVGVzdDo6RGVsZWdhdGUgewogIHB1YmxpYzoKICAgTU9DS19NRVRIT0QxKFVuc3VwcG9ydGVkSGFuZGxlciwgdm9pZChpbnQgdHlwZSkpOwotICBNT0NLX01FVEhPRDQoQWxlcnQsIGludChGUERGX1dJREVTVFJJTkcgbWVzc2FnZSwgRlBERl9XSURFU1RSSU5HIHRpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwgaW50IGljb24pKTsKKyAgTU9DS19NRVRIT0Q0KAorICAgICAgQWxlcnQsCisgICAgICBpbnQoRlBERl9XSURFU1RSSU5HIG1lc3NhZ2UsIEZQREZfV0lERVNUUklORyB0aXRsZSwgaW50IHR5cGUsIGludCBpY29uKSk7CiAgIE1PQ0tfTUVUSE9EMihTZXRUaW1lciwgaW50KGludCBtc2VjcywgVGltZXJDYWxsYmFjayBmbikpOwogICBNT0NLX01FVEhPRDEoS2lsbFRpbWVyLCB2b2lkKGludCBtc2VjcykpOwogfTsKIAogI2VuZGlmICAvLyBURVNUSU5HX0VNQkVEREVSX1RFU1RfTU9DS19ERUxFR0FURV9IXwotCmRpZmYgLS1naXQgYS90ZXN0aW5nL2VtYmVkZGVyX3Rlc3RfdGltZXJfaGFuZGxpbmdfZGVsZWdhdGUuaCBiL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdF90aW1lcl9oYW5kbGluZ19kZWxlZ2F0ZS5oCmluZGV4IGQwNWExMzQuLmE3MDRiZDQgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdF90aW1lcl9oYW5kbGluZ19kZWxlZ2F0ZS5oCisrKyBiL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdF90aW1lcl9oYW5kbGluZ19kZWxlZ2F0ZS5oCkBAIC02LDEyICs2LDM5IEBACiAjZGVmaW5lIFRFU1RJTkdfRU1CRURERVJfVEVTVF9USU1FUl9IQU5ETElOR19ERUxFR0FURV9IXwogCiAjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgImVtYmVkZGVyX3Rlc3QuaCIKKyNpbmNsdWRlICJ0ZXN0X3N1cHBvcnQuaCIKIAogY2xhc3MgRW1iZWRkZXJUZXN0VGltZXJIYW5kbGluZ0RlbGVnYXRlIDogcHVibGljIEVtYmVkZGVyVGVzdDo6RGVsZWdhdGUgewotcHVibGljOgorIHB1YmxpYzoKKyAgc3RydWN0IFJlY2VpdmVkQWxlcnQgeworICAgIFJlY2VpdmVkQWxlcnQoRlBERl9XSURFU1RSSU5HIG1lc3NhZ2VfaW4sCisgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgdGl0bGVfaW4sCisgICAgICAgICAgICAgICAgICBpbnQgdHlwZV9pbiwKKyAgICAgICAgICAgICAgICAgIGludCBpY29uX2luKQorICAgICAgICA6IHR5cGUodHlwZV9pbiksIGljb24oaWNvbl9pbikgeworICAgICAgbWVzc2FnZSA9IEdldFBsYXRmb3JtV1N0cmluZyhtZXNzYWdlX2luKTsKKyAgICAgIHRpdGxlID0gR2V0UGxhdGZvcm1XU3RyaW5nKHRpdGxlX2luKTsKKyAgICB9CisKKyAgICBzdGQ6OndzdHJpbmcgbWVzc2FnZTsKKyAgICBzdGQ6OndzdHJpbmcgdGl0bGU7CisgICAgaW50IHR5cGU7CisgICAgaW50IGljb247CisgIH07CisKKyAgaW50IEFsZXJ0KEZQREZfV0lERVNUUklORyBtZXNzYWdlLAorICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHRpdGxlLAorICAgICAgICAgICAgaW50IHR5cGUsCisgICAgICAgICAgICBpbnQgaWNvbikgb3ZlcnJpZGUgeworICAgIGFsZXJ0c18ucHVzaF9iYWNrKFJlY2VpdmVkQWxlcnQobWVzc2FnZSwgdGl0bGUsIHR5cGUsIGljb24pKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCiAgIGludCBTZXRUaW1lcihpbnQgbXNlY3MsIFRpbWVyQ2FsbGJhY2sgZm4pIG92ZXJyaWRlIHsKICAgICBleHBpcnlfdG9fdGltZXJfbWFwXy5pbnNlcnQoc3RkOjpwYWlyPGludCwgVGltZXI+KAogICAgICAgICBtc2VjcyArIGltYWdpbmFyeV9lbGFwc2VkX21zZWNzXywgVGltZXIoKytuZXh0X3RpbWVyX2lkXywgZm4pKSk7CkBAIC00NCwxMSArNzEsMTQgQEAKICAgICB9CiAgIH0KIAotcHJvdGVjdGVkOgotICB1c2luZyBUaW1lciA9IHN0ZDo6cGFpcjxpbnQsIFRpbWVyQ2FsbGJhY2s+OyAgLy8gSUQsIGNhbGxiYWNrIHBhaXIuCisgIGNvbnN0IHN0ZDo6dmVjdG9yPFJlY2VpdmVkQWxlcnQ+JiBHZXRBbGVydHMoKSBjb25zdCB7IHJldHVybiBhbGVydHNfOyB9CisKKyBwcm90ZWN0ZWQ6CisgIHVzaW5nIFRpbWVyID0gc3RkOjpwYWlyPGludCwgVGltZXJDYWxsYmFjaz47ICAgICAvLyBJRCwgY2FsbGJhY2sgcGFpci4KICAgc3RkOjptdWx0aW1hcDxpbnQsIFRpbWVyPiBleHBpcnlfdG9fdGltZXJfbWFwXzsgIC8vIEtleWVkIGJ5IHRpbWVvdXQuCiAgIGludCBuZXh0X3RpbWVyX2lkXyA9IDA7CiAgIGludCBpbWFnaW5hcnlfZWxhcHNlZF9tc2Vjc18gPSAwOworICBzdGQ6OnZlY3RvcjxSZWNlaXZlZEFsZXJ0PiBhbGVydHNfOwogfTsKIAotI2VuZGlmIC8vIFRFU1RJTkdfRU1CRURERVJfVEVTVF9USU1FUl9IQU5ETElOR19ERUxFR0FURV9IXworI2VuZGlmICAvLyBURVNUSU5HX0VNQkVEREVSX1RFU1RfVElNRVJfSEFORExJTkdfREVMRUdBVEVfSF8KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmggYi90ZXN0aW5nL2Z4X3N0cmluZ190ZXN0aGVscGVycy5oCmluZGV4IDdkMDY2ODguLjRkZDM3YzYgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmgKKysrIGIvdGVzdGluZy9meF9zdHJpbmdfdGVzdGhlbHBlcnMuaApAQCAtNyw3ICs3LDcgQEAKIAogI2luY2x1ZGUgPG9zdHJlYW0+CiAKLSNpbmNsdWRlICIuLi9jb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3RyaW5nLmgiCiAKIC8vIE91dHB1dCBzdHJlYW0gb3BlcmF0b3Igc28gR1RFU1QgbWFjcm9zIHdvcmsgd2l0aCBGWCBzdHJpbmdzLgogc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7CkBAIC0xNiw0ICsxNiwzIEBACiBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpOwogCiAjZW5kaWYgIC8vIFRFU1RJTkdfRlhfU1RSX1RFU1RIRUxQRVJTX0hfCi0KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ21vY2suZ3lwIGIvdGVzdGluZy9nbW9jay5neXAKaW5kZXggNTVlMTYwOS4uMzU3NGJlYyAxMDA2NDQKLS0tIGEvdGVzdGluZy9nbW9jay5neXAKKysrIGIvdGVzdGluZy9nbW9jay5neXAKQEAgLTI5LDcgKzI5LDYgQEAKICAgICAgICAgJ2dtb2NrL3NyYy9nbW9jay1tYXRjaGVycy5jYycsCiAgICAgICAgICdnbW9jay9zcmMvZ21vY2stc3BlYy1idWlsZGVycy5jYycsCiAgICAgICAgICdnbW9jay9zcmMvZ21vY2suY2MnLAotICAgICAgICAnZ21vY2tfbXV0YW50LmgnLCAgIyBnTW9jayBoZWxwZXJzCiAgICAgICBdLAogICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKICAgICAgICAgJ2dtb2NrJywKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZ3Rlc3QuZ3lwIGIvdGVzdGluZy9ndGVzdC5neXAKaW5kZXggMGVkNGM2MC4uM2MwMTU1MiAxMDA2NDQKLS0tIGEvdGVzdGluZy9ndGVzdC5neXAKKysrIGIvdGVzdGluZy9ndGVzdC5neXAKQEAgLTQ0LDcgKzQ0LDYgQEAKICAgICAgICAgJ2d0ZXN0L3NyYy9ndGVzdC10ZXN0LXBhcnQuY2MnLAogICAgICAgICAnZ3Rlc3Qvc3JjL2d0ZXN0LXR5cGVkLXRlc3QuY2MnLAogICAgICAgICAnZ3Rlc3Qvc3JjL2d0ZXN0LmNjJywKLSAgICAgICAgJ2d0ZXN0LXN1cHBvcnQuaCcsCiAgICAgICBdLAogICAgICAgJ3NvdXJjZXMhJzogWwogICAgICAgICAnZ3Rlc3Qvc3JjL2d0ZXN0LWFsbC5jYycsICAjIE5vdCBuZWVkZWQgYnkgb3VyIGJ1aWxkLgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9qc19lbWJlZGRlcl90ZXN0LmNwcCBiL3Rlc3RpbmcvanNfZW1iZWRkZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZhNjQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvanNfZW1iZWRkZXJfdGVzdC5jcHAKQEAgLTAsMCArMSw0NSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAidGVzdGluZy9qc19lbWJlZGRlcl90ZXN0LmgiCisKK0pTRW1iZWRkZXJUZXN0OjpKU0VtYmVkZGVyVGVzdCgpCisgICAgOiBtX3BBcnJheUJ1ZmZlckFsbG9jYXRvcihuZXcgRlhKU19BcnJheUJ1ZmZlckFsbG9jYXRvcikgeworICB2ODo6SXNvbGF0ZTo6Q3JlYXRlUGFyYW1zIHBhcmFtczsKKyAgcGFyYW1zLmFycmF5X2J1ZmZlcl9hbGxvY2F0b3IgPSBtX3BBcnJheUJ1ZmZlckFsbG9jYXRvci5nZXQoKTsKKyAgbV9wSXNvbGF0ZSA9IHY4OjpJc29sYXRlOjpOZXcocGFyYW1zKTsKK30KKworSlNFbWJlZGRlclRlc3Q6On5KU0VtYmVkZGVyVGVzdCgpIHsKKyAgbV9wSXNvbGF0ZS0+RGlzcG9zZSgpOworfQorCit2b2lkIEpTRW1iZWRkZXJUZXN0OjpTZXRVcCgpIHsKKyAgRW1iZWRkZXJUZXN0OjpTZXRFeHRlcm5hbElzb2xhdGUobV9wSXNvbGF0ZSk7CisgIEVtYmVkZGVyVGVzdDo6U2V0VXAoKTsKKworICB2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShtX3BJc29sYXRlKTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICB2ODo6TG9ja2VyIGxvY2tlcihtX3BJc29sYXRlKTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShtX3BJc29sYXRlKTsKKyAgRlhKU19QZXJJc29sYXRlRGF0YTo6U2V0VXAobV9wSXNvbGF0ZSk7CisgIEZYSlNfSW5pdGlhbGl6ZVJ1bnRpbWUobV9wSXNvbGF0ZSwgbnVsbHB0ciwgJm1fcFBlcnNpc3RlbnRDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICZtX1N0YXRpY09iamVjdHMpOworfQorCit2b2lkIEpTRW1iZWRkZXJUZXN0OjpUZWFyRG93bigpIHsKKyAgRlhKU19SZWxlYXNlUnVudGltZShtX3BJc29sYXRlLCAmbV9wUGVyc2lzdGVudENvbnRleHQsICZtX1N0YXRpY09iamVjdHMpOworICBtX3BQZXJzaXN0ZW50Q29udGV4dC5SZXNldCgpOworICBGWEpTX1JlbGVhc2UoKTsKKyAgRW1iZWRkZXJUZXN0OjpUZWFyRG93bigpOworfQorCit2ODo6SXNvbGF0ZSogSlNFbWJlZGRlclRlc3Q6Omlzb2xhdGUoKSB7CisgIHJldHVybiBtX3BJc29sYXRlOworfQorCit2ODo6TG9jYWw8djg6OkNvbnRleHQ+IEpTRW1iZWRkZXJUZXN0OjpHZXRWOENvbnRleHQoKSB7CisgIHJldHVybiBtX3BQZXJzaXN0ZW50Q29udGV4dC5HZXQobV9wSXNvbGF0ZSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0aW5nL2pzX2VtYmVkZGVyX3Rlc3QuaCBiL3Rlc3RpbmcvanNfZW1iZWRkZXJfdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxOWJkNDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL2pzX2VtYmVkZGVyX3Rlc3QuaApAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgMjAxNSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgVEVTVElOR19KU19FTUJFRERFUl9URVNUX0hfCisjZGVmaW5lIFRFU1RJTkdfSlNfRU1CRURERVJfVEVTVF9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9qc2FwaS9meGpzX3Y4LmgiCisjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCisKK2NsYXNzIEpTRW1iZWRkZXJUZXN0IDogcHVibGljIEVtYmVkZGVyVGVzdCB7CisgcHVibGljOgorICBKU0VtYmVkZGVyVGVzdCgpOworICB+SlNFbWJlZGRlclRlc3QoKSBvdmVycmlkZTsKKworICB2b2lkIFNldFVwKCkgb3ZlcnJpZGU7CisgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZTsKKworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSgpOworICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IEdldFY4Q29udGV4dCgpOworCisgcHJpdmF0ZToKKyAgc3RkOjp1bmlxdWVfcHRyPEZYSlNfQXJyYXlCdWZmZXJBbGxvY2F0b3I+IG1fcEFycmF5QnVmZmVyQWxsb2NhdG9yOworICB2ODo6SXNvbGF0ZSogbV9wSXNvbGF0ZTsKKyAgdjg6Okdsb2JhbDx2ODo6Q29udGV4dD4gbV9wUGVyc2lzdGVudENvbnRleHQ7CisgIHN0ZDo6dmVjdG9yPHY4OjpHbG9iYWw8djg6Ok9iamVjdD4qPiBtX1N0YXRpY09iamVjdHM7Cit9OworCisjZW5kaWYgIC8vIFRFU1RJTkdfSlNfRU1CRURERVJfVEVTVF9IXwpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvYm9va21hcmtzLmluIGIvdGVzdGluZy9yZXNvdXJjZXMvYm9va21hcmtzLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYTZlMTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9ib29rbWFya3MuaW4KQEAgLTAsMCArMSw5OCBAQAore3toZWFkZXJ9fQore3tvYmplY3QgMSAwfX0gPDwKKyAgL1R5cGUgL0NhdGFsb2cKKyAgL1BhZ2VzIDIgMCBSCisgIC9PdXRsaW5lcyAxNCAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDIgMH19IDw8CisgIC9UeXBlIC9QYWdlcworICAvQ291bnQgMgorICAvS2lkcyBbCisgICAgMyAwIFIKKyAgICA0IDAgUgorICBdCis+PgorZW5kb2JqCislIFBhZ2UgbnVtYmVyIDAuCit7e29iamVjdCAzIDB9fSA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgPDwKKyAgICAvRm9udCA8PC9GMSAxNSAwIFI+PgorICA+PgorICAvQ29udGVudHMgWzIxIDAgUl0KKyAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KKz4+CitlbmRvYmoKKyUgUGFnZSBudW1iZXIgMS4KK3t7b2JqZWN0IDQgMH19IDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL1Jlc291cmNlcyAgPDwKKyAgICAvRm9udCA8PC9GMSAxNSAwIFI+PgorICA+PgorICAvQ29udGVudHMgWzIyIDAgUl0KKyAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KKz4+CitlbmRvYmoKKyUgRmlyc3QgYm9va21hcmsKK3t7b2JqZWN0IDEwIDB9fSA8PAorICAvVGl0bGUgKEEgR29vZCBCZWdpbm5pbmcpCisgIC9QYXJlbnQgMTQgMCBSCisgIC9OZXh0IDExIDAgUgorICAvRGVzdCAoZm9vKQorPj4KK2VuZG9iagorJSBMYXN0IGJvb2ttYXJrCit7e29iamVjdCAxMSAwfX0gPDwKKyAgL1RpdGxlIChBIEdvb2QgRW5kaW5nKQorICAvUGFyZW50IDE0IDAgUgorICAvUHJldiAxMCAwIFIKKyAgL0Rlc3QgKGJhcikKKz4+CitlbmRvYmoKKyUgUm9vdCBib29rbWFyawore3tvYmplY3QgMTQgMH19IDw8CisgIC9UeXBlIC9PdXRsaW5lcworICAvRmlyc3QgMTAgMCBSCisgIC9MYXN0ICAxMSAwIFIKKyAgL0NvdW50IDIKKz4+CitlbmRvYmoKKyUgRm9udCByZXNvdXJjZS4KK3t7b2JqZWN0IDE1IDB9fSA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHlwZTEKKyAgL0Jhc2VGb250IC9BcmlhbAorPj4KK2VuZG9iagorJSBDb250ZW50IGZvciBwYWdlIDAuCit7e29iamVjdCAyMSAwfX0gPDwKKyAgL0xlbmd0aCAwCis+Pgorc3RyZWFtCitCVAorL0YxIDIwIFRmCisxMDAgNjAwIFREIChQYWdlMSlUagorRVQKK2VuZHN0cmVhbQorZW5kb2JqCislIENvbnRlbnQgZm9yIHBhZ2UgMS4KK3t7b2JqZWN0IDIyIDB9fSA8PAorICAvTGVuZ3RoIDAKKz4+CitzdHJlYW0KK0JUCisvRjEgMjAgVGYKKzEwMCA2MDAgVEQgKFBhZ2UyKVRqCitFVAorZW5kc3RyZWFtCitlbmRvYmoKK3t7eHJlZn19Cit0cmFpbGVyIDw8CisgIC9TaXplIDYKKyAgL1Jvb3QgMSAwIFIKKz4+Cit7e3N0YXJ0eHJlZn19CislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvYm9va21hcmtzLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2Jvb2ttYXJrcy5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI0Y2U3OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2Jvb2ttYXJrcy5wZGYKQEAgLTAsMCArMSwxMjQgQEAKKyVQREYtMS43CisloPKk9AorMSAwIG9iaiA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKyAgL091dGxpbmVzIDE0IDAgUgorPj4KK2VuZG9iagorMiAwIG9iaiA8PAorICAvVHlwZSAvUGFnZXMKKyAgL0NvdW50IDIKKyAgL0tpZHMgWworICAgIDMgMCBSCisgICAgNCAwIFIKKyAgXQorPj4KK2VuZG9iagorJSBQYWdlIG51bWJlciAwLgorMyAwIG9iaiA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgPDwKKyAgICAvRm9udCA8PC9GMSAxNSAwIFI+PgorICA+PgorICAvQ29udGVudHMgWzIxIDAgUl0KKyAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KKz4+CitlbmRvYmoKKyUgUGFnZSBudW1iZXIgMS4KKzQgMCBvYmogPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvUmVzb3VyY2VzICA8PAorICAgIC9Gb250IDw8L0YxIDE1IDAgUj4+CisgID4+CisgIC9Db250ZW50cyBbMjIgMCBSXQorICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQorPj4KK2VuZG9iagorJSBGaXJzdCBib29rbWFyaworMTAgMCBvYmogPDwKKyAgL1RpdGxlIChBIEdvb2QgQmVnaW5uaW5nKQorICAvUGFyZW50IDE0IDAgUgorICAvTmV4dCAxMSAwIFIKKyAgL0Rlc3QgKGZvbykKKz4+CitlbmRvYmoKKyUgTGFzdCBib29rbWFyaworMTEgMCBvYmogPDwKKyAgL1RpdGxlIChBIEdvb2QgRW5kaW5nKQorICAvUGFyZW50IDE0IDAgUgorICAvUHJldiAxMCAwIFIKKyAgL0Rlc3QgKGJhcikKKz4+CitlbmRvYmoKKyUgUm9vdCBib29rbWFyaworMTQgMCBvYmogPDwKKyAgL1R5cGUgL091dGxpbmVzCisgIC9GaXJzdCAxMCAwIFIKKyAgL0xhc3QgIDExIDAgUgorICAvQ291bnQgMgorPj4KK2VuZG9iagorJSBGb250IHJlc291cmNlLgorMTUgMCBvYmogPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUxCisgIC9CYXNlRm9udCAvQXJpYWwKKz4+CitlbmRvYmoKKyUgQ29udGVudCBmb3IgcGFnZSAwLgorMjEgMCBvYmogPDwKKyAgL0xlbmd0aCAwCis+Pgorc3RyZWFtCitCVAorL0YxIDIwIFRmCisxMDAgNjAwIFREIChQYWdlMSlUagorRVQKK2VuZHN0cmVhbQorZW5kb2JqCislIENvbnRlbnQgZm9yIHBhZ2UgMS4KKzIyIDAgb2JqIDw8CisgIC9MZW5ndGggMAorPj4KK3N0cmVhbQorQlQKKy9GMSAyMCBUZgorMTAwIDYwMCBURCAoUGFnZTIpVGoKK0VUCitlbmRzdHJlYW0KK2VuZG9iagoreHJlZgorMCAyMworMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDAxNSAwMDAwMCBuIAorMDAwMDAwMDA4NyAwMDAwMCBuIAorMDAwMDAwMDE4NSAwMDAwMCBuIAorMDAwMDAwMDM0NiAwMDAwMCBuIAorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDUwOCAwMDAwMCBuIAorMDAwMDAwMDYyMCAwMDAwMCBuIAorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDcyOSAwMDAwMCBuIAorMDAwMDAwMDgyOSAwMDAwMCBuIAorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDkyNCAwMDAwMCBuIAorMDAwMDAwMTAzNCAwMDAwMCBuIAordHJhaWxlciA8PAorICAvU2l6ZSA2CisgIC9Sb290IDEgMCBSCis+Pgorc3RhcnR4cmVmCisxMTIyCislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzIxNi5pbiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z18yMTYuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVjZDg2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z18yMTYuaW4KQEAgLTAsMCArMSwzOSBAQAore3toZWFkZXJ9fQore3tvYmplY3QgMSAwfX0gPDwKKyAgL1R5cGUgL0NhdGFsb2cKKyAgL1BhZ2VzIDIgMCBSCisgIC9BY3JvRm9ybSA0IDAgUgorPj4KK2VuZG9iagore3tvYmplY3QgMiAwfX0gPDwKKyAgL1R5cGUgL1BhZ2VzCisgIC9Db3VudCAxCis+PgorZW5kb2JqCit7e29iamVjdCA0IDB9fSA8PAorICAvWEZBIFsKKyAgICAoeGRwOnhkcCkgMjMgMCBSCisgICAgKGZvcm0pIDI5IDAgUgorICAgICg8L3hkcDp4ZHA+KSAzMCAwIFJdCis+PgorZW5kb2JqCit7e29iamVjdCAyMyAwfX0gPDwKKz4+c3RyZWFtCis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHhkcDp4ZHAgeG1sbnM6eGRwPSJodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tLyI+CitlbmRzdHJlYW0KK2VuZG9iagore3tvYmplY3QgMjkgMH19IDw8Cis+PnN0cmVhbQorPGZvcm0geG1sbnM9Imh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWZvcm0vMi42LyI+Cis8L2Zvcm0+CitlbmRzdHJlYW0KK2VuZG9iagore3tvYmplY3QgMzAgMH19IDw8Cis+PnN0cmVhbQorPC94ZHA6eGRwPgorZW5kc3RyZWFtCitlbmRvYmoKK3RyYWlsZXIKKzw8L1Jvb3QgMSAwIFI+PgorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z18yMTYucGRmIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzIxNi5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ1OTg3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z18yMTYucGRmCkBAIC0wLDAgKzEsNDAgQEAKKyVQREYtMS43CisloPKk9AorMSAwIG9iaiA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKyAgL0Fjcm9Gb3JtIDQgMCBSCis+PgorZW5kb2JqCisyIDAgb2JqIDw8CisgIC9UeXBlIC9QYWdlcworICAvQ291bnQgMQorPj4KK2VuZG9iagorNCAwIG9iaiA8PAorICAvWEZBIFsKKyAgICAoeGRwOnhkcCkgMjMgMCBSCisgICAgKGZvcm0pIDI5IDAgUgorICAgICg8L3hkcDp4ZHA+KSAzMCAwIFJdCis+PgorZW5kb2JqCisyMyAwIG9iaiA8PAorPj5zdHJlYW0KKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8eGRwOnhkcCB4bWxuczp4ZHA9Imh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20vIj4KK2VuZHN0cmVhbQorZW5kb2JqCisyOSAwIG9iaiA8PAorPj5zdHJlYW0KKzxmb3JtIHhtbG5zPSJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1mb3JtLzIuNi8iPgorPC9mb3JtPgorZW5kc3RyZWFtCitlbmRvYmoKKzMwIDAgb2JqIDw8Cis+PnN0cmVhbQorPC94ZHA6eGRwPgorZW5kc3RyZWFtCitlbmRvYmoKK3RyYWlsZXIKKzw8L1Jvb3QgMSAwIFI+PgorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z18yOTguaW4gYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfMjk4LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNjY3NzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfMjk4LmluCkBAIC0wLDAgKzEsMjEgQEAKK3t7aGVhZGVyfX0KK3t7b2JqZWN0IDEgMH19IDw8Cis+PgorZW5kb2JqCit7e29iamVjdCAyIDB9fSA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvTGVuZ3RoIDAKKyAgL0ZpbHRlciBBU0NJSUhleERlY29kZQorICAvUHJldiAzNQorICAvVyBbMSAyIDNdCis+Pgorc3RyZWFtCitlbmRzdHJlYW0KK2VuZG9iagordHJhaWxlciA8PAorICAvU2l6ZSA2CisgIC9Sb290IDEgMCBSCis+Pgorc3RhcnR4cmVmCiszNQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z18yOTgucGRmIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzI5OC5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIxOTU1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z18yOTgucGRmCkBAIC0wLDAgKzEsMjIgQEAKKyVQREYtMS43CisloPKk9AorMSAwIG9iaiA8PAorPj4KK2VuZG9iagorMiAwIG9iaiA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvTGVuZ3RoIDAKKyAgL0ZpbHRlciBBU0NJSUhleERlY29kZQorICAvUHJldiAzNQorICAvVyBbMSAyIDNdCis+Pgorc3RyZWFtCitlbmRzdHJlYW0KK2VuZG9iagordHJhaWxlciA8PAorICAvU2l6ZSA2CisgIC9Sb290IDEgMCBSCis+Pgorc3RhcnR4cmVmCiszNQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z18zMjVfYS5wZGYgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfMzI1X2EucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMGZhZTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfMzI1X2EucGRmCkBAIC0wLDAgKzEsOCBAQAorJVBERi0uMgoreHJlZgorMCAzCiswMDAwMDAwMDAwIDY1NSX7UERGLTEuNQorJeLjz9MKKzEgNWYNCisgMzAwODAwMDAwMDkgMDAwMCBvYmoKKy88MDwqYXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9idWdfMzI1X2IucGRmIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzMyNV9iLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDNhMzY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzMyNV9iLnBkZgpAQCAtMCwwICsxLDggQEAKKyVQREYtUCVQREYtMS4yCitEeHJlZgorMCAzCiswMDAwMDAwMDAwIDY1NSVQREYtMS41Cisl4uPP0worMSBmNQ0KKyAzMDA4MDAwMDAwOSAwMDAwIG9iagorLzwwPCphcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z18zNDMucGRmIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzM0My5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFkODM4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z18zNDMucGRmCkBAIC0wLDAgKzEsMTkgQEAKKyclUERGLTEuNgorJeLjz9MKKzw8MSAwIG9ialBhcmFtcyVQREYtMS40Cit0ciVQREYtMS4yCisl4uPP0worNyAwIG9iaiA8PAorISAvVHlwZSAvRm9udAordHJhaWxlcgorPDwvLycvT0MzCitlbmRvYioKKzQgMCBvYmogPDwKKyAgL1Jlc291cmNlcyA8PAorICAvRlQgNyAwIFIKKz4+CitlbmRzdHJlYW0KK2VuZG9iYWlsZXIvJQorPDxTdWJ0agorJSVFT0YKKy9wYXJlbnJpeVsxLjAgKy0xLjBdcGU6WE0vTGVuZyN0aCAzMDgvVHlwZS9TaWdbZ2gvTWV0YWRhdGE+PiVzdFAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9idWdfMzQ0LnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z18zNDQucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMTVjNjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfMzQ0LnBkZgpAQCAtMCwwICsxLDkgQEAKKyclUERGLTEuNgorJeLjz9MKKzw8MCAwIG9ialBhcmFtcyVQREYtMi40Cit0cmFpbGVyJQorPDxTdWJ0eXBlOlhNL0xlbmd0aCAzMDgvVHlwZS9TaWdbL01lkmFkYSclUERGLTEuNgorJeLjz9MKKzw8MCAwIG9ialBhcmFtcyVQREYtMS40Cit0cmFpbGVyJQorPDxTdWJ0eXBlOlhNL0xlbmd0aCAzMDgvVHlwZS9TaWdbL01lkmFkYXRhPj50YT4+JSVzUHNQClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzUwNzMxNi5pbiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z181MDczMTYuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdkZDVjMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z181MDczMTYuaW4KQEAgLTAsMCArMSwxMjYgQEAKK3t7aGVhZGVyfX0KK3t7b2JqZWN0IDEgMH19IDw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAyIDAgUgorICAvT3BlbkFjdGlvbiA0IDAgUgorICAvQWNyb0Zvcm0gMyAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDIgMH19IDw8CisgIC9UeXBlIC9QYWdlcworICAvQ291bnQgMworICAvS2lkcyBbNiAwIFIgNyAwIFIgOCAwIFIgXQorPj4KK2VuZG9iagore3tvYmplY3QgMyAwfX0gPDwKKyAgL0NPIFsxMSAwIFJdCisgIC9GaWVsZHMgWzExIDAgUiA5IDAgUl0KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDQgMH19IDw8CisgIC9UeXBlIC9BY3Rpb24KKyAgL1MgL0phdmFTY3JpcHQKKyAgL0pTIDUgMCBSCis+PgorZW5kb2JqCit7e29iamVjdCA1IDB9fSA8PD4+CitzdHJlYW0KK3ZhciBpID0gMDsKK2Z1bmN0aW9uIHJ1bigpCit7CisgIHQgPSB0aGlzLmdldEZpZWxkKCd0eHROYW1lMScpOworICB0MiA9IHRoaXMuZ2V0RmllbGQoJ3R4dE5hbWUyJyk7CisgIHQyLnNldEZvY3VzKCk7CisgIHQuc2V0Rm9jdXMoKTsKKyAgdC52YWx1ZT0nRyc7Cit9CisKK2Z1bmN0aW9uIHJlbW92ZSgpeworICBpZiAoaT09MSl7CisgICAgdGhpcy5yZW1vdmVGaWVsZCgndHh0TmFtZTInKTsKKyAgfQorICBpKys7Cit9CisKK2FwcC5zZXRUaW1lT3V0KCdydW4oKScsMjAwMCk7CitlbmRzdHJlYW0KK2VuZG9iagore3tvYmplY3QgNiAwfX0gPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQorICAvUmVzb3VyY2VzIDw8Pj4KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDcgMH19IDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KKyAgL1Jlc291cmNlcyA8PD4+Cis+PgorZW5kb2JqCit7e29iamVjdCA4IDB9fSA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCisgIC9SZXNvdXJjZXMgPDw+PgorICAvQW5ub3RzIFs5IDAgUiAxMSAwIFJdCis+PgorZW5kb2JqCit7e29iamVjdCA5IDB9fSA8PAorICAvRlQgL1R4CisgIC9UeXBlIC9Bbm5vdAorICAvU3VidHlwZSAvV2lkZ2V0CisgIC9UICh0eHROYW1lMikKKyAgL0YgNAorICAvQVAgPDwvTiAxMCAwIFI+PgorICAvUmVjdCBbMjAgMjAgNDAwIDYwXQorPj4KK2VuZG9iagore3tvYmplY3QgMTAgMH19IDw8CisgIC9UeXBlIC9YT2JqZWN0CisgIC9TdWJ0eXBlIC9Gb3JtCisgIC9Gb3JtVHlwZSAxCis+PgorZW5kb2JqCit7e29iamVjdCAxMSAwfX0gPDwKKyAgL0ZUIC9UeAorICAvVHlwZSAvQW5ub3QKKyAgL1N1YnR5cGUgL1dpZGdldAorICAvVCAodHh0TmFtZTEpCisgIC9GIDQKKyAgL0FQIDw8L04gMTIgMCBSPj4KKyAgL1JlY3QgWzIwMCAyMDAgNDAwIDI2MF0KKyAgL0FBIDEzIDAgUgorPj4KK2VuZG9iagore3tvYmplY3QgMTIgMH19IDw8CisgIC9UeXBlIC9YT2JqZWN0CisgIC9TdWJ0eXBlIC9Gb3JtCisgIC9Gb3JtVHlwZSAxCis+PgorZW5kb2JqCit7e29iamVjdCAxMyAwfX0gPDwKKyAgL0MgMTQgMCBSCis+PgorZW5kb2JqCit7e29iamVjdCAxNCAwfX0gPDwKKyAgL1R5cGUgL0FjdGlvbgorICAvUyAvSmF2YVNjcmlwdAorICAvSlMgMTUgMCBSCis+PgorZW5kb2JqCit7e29iamVjdCAxNSAwfX0gPDw+Pgorc3RyZWFtCit0aGlzLmdldEZpZWxkKCd0eHROYW1lMicpLnZhbHVlPSdCJzsKK3RoaXMucGFnZU51bT0xOworcmVtb3ZlKCk7CitlbmRzdHJlYW0KK2VuZG9iagore3t4cmVmfX0KK3RyYWlsZXIgPDwKKyAgL1NpemUgMTYKKyAgL1Jvb3QgMSAwIFIKKz4+Cit7e3N0YXJ0eHJlZn19CislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzUwNzMxNi5wZGYgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfNTA3MzE2LnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2MyMDVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzUwNzMxNi5wZGYKQEAgLTAsMCArMSwxNDUgQEAKKyVQREYtMS43CisloPKk9AorMSAwIG9iaiA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKyAgL09wZW5BY3Rpb24gNCAwIFIKKyAgL0Fjcm9Gb3JtIDMgMCBSCis+PgorZW5kb2JqCisyIDAgb2JqIDw8CisgIC9UeXBlIC9QYWdlcworICAvQ291bnQgMworICAvS2lkcyBbNiAwIFIgNyAwIFIgOCAwIFIgXQorPj4KK2VuZG9iagorMyAwIG9iaiA8PAorICAvQ08gWzExIDAgUl0KKyAgL0ZpZWxkcyBbMTEgMCBSIDkgMCBSXQorPj4KK2VuZG9iagorNCAwIG9iaiA8PAorICAvVHlwZSAvQWN0aW9uCisgIC9TIC9KYXZhU2NyaXB0CisgIC9KUyA1IDAgUgorPj4KK2VuZG9iagorNSAwIG9iaiA8PD4+CitzdHJlYW0KK3ZhciBpID0gMDsKK2Z1bmN0aW9uIHJ1bigpCit7CisgIHQgPSB0aGlzLmdldEZpZWxkKCd0eHROYW1lMScpOworICB0MiA9IHRoaXMuZ2V0RmllbGQoJ3R4dE5hbWUyJyk7CisgIHQyLnNldEZvY3VzKCk7CisgIHQuc2V0Rm9jdXMoKTsKKyAgdC52YWx1ZT0nRyc7Cit9CisKK2Z1bmN0aW9uIHJlbW92ZSgpeworICBpZiAoaT09MSl7CisgICAgdGhpcy5yZW1vdmVGaWVsZCgndHh0TmFtZTInKTsKKyAgfQorICBpKys7Cit9CisKK2FwcC5zZXRUaW1lT3V0KCdydW4oKScsMjAwMCk7CitlbmRzdHJlYW0KK2VuZG9iagorNiAwIG9iaiA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCisgIC9SZXNvdXJjZXMgPDw+PgorPj4KK2VuZG9iagorNyAwIG9iaiA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCisgIC9SZXNvdXJjZXMgPDw+PgorPj4KK2VuZG9iagorOCAwIG9iaiA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCisgIC9SZXNvdXJjZXMgPDw+PgorICAvQW5ub3RzIFs5IDAgUiAxMSAwIFJdCis+PgorZW5kb2JqCis5IDAgb2JqIDw8CisgIC9GVCAvVHgKKyAgL1R5cGUgL0Fubm90CisgIC9TdWJ0eXBlIC9XaWRnZXQKKyAgL1QgKHR4dE5hbWUyKQorICAvRiA0CisgIC9BUCA8PC9OIDEwIDAgUj4+CisgIC9SZWN0IFsyMCAyMCA0MDAgNjBdCis+PgorZW5kb2JqCisxMCAwIG9iaiA8PAorICAvVHlwZSAvWE9iamVjdAorICAvU3VidHlwZSAvRm9ybQorICAvRm9ybVR5cGUgMQorPj4KK2VuZG9iagorMTEgMCBvYmogPDwKKyAgL0ZUIC9UeAorICAvVHlwZSAvQW5ub3QKKyAgL1N1YnR5cGUgL1dpZGdldAorICAvVCAodHh0TmFtZTEpCisgIC9GIDQKKyAgL0FQIDw8L04gMTIgMCBSPj4KKyAgL1JlY3QgWzIwMCAyMDAgNDAwIDI2MF0KKyAgL0FBIDEzIDAgUgorPj4KK2VuZG9iagorMTIgMCBvYmogPDwKKyAgL1R5cGUgL1hPYmplY3QKKyAgL1N1YnR5cGUgL0Zvcm0KKyAgL0Zvcm1UeXBlIDEKKz4+CitlbmRvYmoKKzEzIDAgb2JqIDw8CisgIC9DIDE0IDAgUgorPj4KK2VuZG9iagorMTQgMCBvYmogPDwKKyAgL1R5cGUgL0FjdGlvbgorICAvUyAvSmF2YVNjcmlwdAorICAvSlMgMTUgMCBSCis+PgorZW5kb2JqCisxNSAwIG9iaiA8PD4+CitzdHJlYW0KK3RoaXMuZ2V0RmllbGQoJ3R4dE5hbWUyJykudmFsdWU9J0InOwordGhpcy5wYWdlTnVtPTE7CityZW1vdmUoKTsKK2VuZHN0cmVhbQorZW5kb2JqCit4cmVmCiswIDE2CiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDE1IDAwMDAwIG4gCiswMDAwMDAwMTA2IDAwMDAwIG4gCiswMDAwMDAwMTgyIDAwMDAwIG4gCiswMDAwMDAwMjQzIDAwMDAwIG4gCiswMDAwMDAwMzA5IDAwMDAwIG4gCiswMDAwMDAwNjAyIDAwMDAwIG4gCiswMDAwMDAwNjk3IDAwMDAwIG4gCiswMDAwMDAwNzkyIDAwMDAwIG4gCiswMDAwMDAwOTEyIDAwMDAwIG4gCiswMDAwMDAxMDQzIDAwMDAwIG4gCiswMDAwMDAxMTEzIDAwMDAwIG4gCiswMDAwMDAxMjYxIDAwMDAwIG4gCiswMDAwMDAxMzMxIDAwMDAwIG4gCiswMDAwMDAxMzY1IDAwMDAwIG4gCiswMDAwMDAxNDMzIDAwMDAwIG4gCit0cmFpbGVyIDw8CisgIC9TaXplIDE2CisgIC9Sb290IDEgMCBSCis+Pgorc3RhcnR4cmVmCisxNTM0CislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzU0NDg4MC5pbiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z181NDQ4ODAuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI2YTQ5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z181NDQ4ODAuaW4KQEAgLTAsMCArMSwxOSBAQAore3toZWFkZXJ9fQore3tvYmplY3QgMSAwfX0gPDwKKyAgL1R5cGUgL0NhdGFsb2cKKyAgL1BhZ2VzIDIgMCBSCis+PgorZW5kb2JqCit7e29iamVjdCAyIDB9fSA8PAorICAvVHlwZSAvUGFnZXMKKyAgL0NvdW50IDEKKyAgL0tpZHMgWzIgMCBSXQorPj4KK2VuZG9iagore3t4cmVmfX0KK3RyYWlsZXIgPDwKKyAgL1NpemUgMworICAvUm9vdCAxIDAgUgorPj4KK3t7c3RhcnR4cmVmfX0KKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9idWdfNTQ0ODgwLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z181NDQ4ODAucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOGU1YjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfNTQ0ODgwLnBkZgpAQCAtMCwwICsxLDI1IEBACislUERGLTEuNworJaDypPQKKzEgMCBvYmogPDwKKyAgL1R5cGUgL0NhdGFsb2cKKyAgL1BhZ2VzIDIgMCBSCis+PgorZW5kb2JqCisyIDAgb2JqIDw8CisgIC9UeXBlIC9QYWdlcworICAvQ291bnQgMQorICAvS2lkcyBbMiAwIFJdCis+PgorZW5kb2JqCit4cmVmCiswIDMKKzAwMDAwMDAwMDAgNjU1MzUgZiAKKzAwMDAwMDAwMTUgMDAwMDAgbiAKKzAwMDAwMDAwNjggMDAwMDAgbiAKK3RyYWlsZXIgPDwKKyAgL1NpemUgMworICAvUm9vdCAxIDAgUgorPj4KK3N0YXJ0eHJlZgorMTMxCislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzU0NzcwNi5pbiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z181NDc3MDYuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzMWYxOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z181NDc3MDYuaW4KQEAgLTAsMCArMSw0MyBAQAore3toZWFkZXJ9fQorCit7e29iamVjdCAxIDB9fQorPDwgL1BhZ2VzIDIgMCBSID4+CitlbmRvYmoKKwore3tvYmplY3QgMiAwfX0KKzw8IC9LaWRzIFsgMyAwIFIgXSA+PgorZW5kb2JqCisKK3t7b2JqZWN0IDMgMH19Cis8PCAvQ29udGVudHMgNCAwIFIgL1Jlc291cmNlcyA8PCAvUGF0dGVybiA2IDAgUiA+Pj4+CitlbmRvYmoKKwore3tvYmplY3QgNCAwfX0KKzw8IC9MZW5ndGggNSAwIFIgPj4KK3N0cmVhbQorL1I5IHNjbgorMCAwIDI0NzkgMzUwOCByZQorL1IxMSAzNiBUZgorWygxKS0xMjI4OC45KDIpXVRKCitlbmRzdHJlYW0KK2VuZG9iagorCit7e29iamVjdCA2IDB9fQorPDwgL1I5IDcgMCBSID4+CitlbmRvYmoKKwore3tvYmplY3QgNyAwfX0KKzw8IC9QYXR0ZXJuVHlwZSAyIC9TaGFkaW5nIDggMCBSID4+CitlbmRvYmoKKwore3tvYmplY3QgOCAwfX0KKzw8IC9CaXRzUGVyQ29tcG9uZW50IDE2IC9Db2xvclNwYWNlIC9EZXZpY2VSR0IgL1NoYWRpbmdUeXBlIDUgPj4KK2VuZG9iagorCit7e3hyZWZ9fQordHJhaWxlciA8PAorICAvUm9vdCAxIDAgUgorICAvU2l6ZSA5Cis+Pgore3tzdGFydHhyZWZ9fQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z181NDc3MDYucGRmIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzU0NzcwNi5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAwM2IzYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z181NDc3MDYucGRmCkBAIC0wLDAgKzEsNTUgQEAKKyVQREYtMS43CisloPKk9AorCisxIDAgb2JqCis8PCAvUGFnZXMgMiAwIFIgPj4KK2VuZG9iagorCisyIDAgb2JqCis8PCAvS2lkcyBbIDMgMCBSIF0gPj4KK2VuZG9iagorCiszIDAgb2JqCis8PCAvQ29udGVudHMgNCAwIFIgL1Jlc291cmNlcyA8PCAvUGF0dGVybiA2IDAgUiA+Pj4+CitlbmRvYmoKKworNCAwIG9iagorPDwgL0xlbmd0aCA1IDAgUiA+Pgorc3RyZWFtCisvUjkgc2NuCiswIDAgMjQ3OSAzNTA4IHJlCisvUjExIDM2IFRmCitbKDEpLTEyMjg4LjkoMildVEoKK2VuZHN0cmVhbQorZW5kb2JqCisKKzYgMCBvYmoKKzw8IC9SOSA3IDAgUiA+PgorZW5kb2JqCisKKzcgMCBvYmoKKzw8IC9QYXR0ZXJuVHlwZSAyIC9TaGFkaW5nIDggMCBSID4+CitlbmRvYmoKKworOCAwIG9iagorPDwgL0JpdHNQZXJDb21wb25lbnQgMTYgL0NvbG9yU3BhY2UgL0RldmljZVJHQiAvU2hhZGluZ1R5cGUgNSA+PgorZW5kb2JqCisKK3hyZWYKKzAgOQorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDAxNiAwMDAwMCBuIAorMDAwMDAwMDA1MSAwMDAwMCBuIAorMDAwMDAwMDA4OSAwMDAwMCBuIAorMDAwMDAwMDE1OCAwMDAwMCBuIAorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDI2NiAwMDAwMCBuIAorMDAwMDAwMDI5OCAwMDAwMCBuIAorMDAwMDAwMDM1MCAwMDAwMCBuIAordHJhaWxlciA8PAorICAvUm9vdCAxIDAgUgorICAvU2l6ZSA5Cis+Pgorc3RhcnR4cmVmCis0MzEKKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9idWdfNTUxMjQ4LmluIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzU1MTI0OC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDEwZTkzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzU1MTI0OC5pbgpAQCAtMCwwICsxLDgwIEBACit7e2hlYWRlcn19Cit7e29iamVjdCAxIDB9fSA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKyAgL0Fjcm9Gb3JtIDYgMCBSCisgIC9OYW1lcyA8PC9KYXZhU2NyaXB0IDEzIDAgUj4+Cis+PgorZW5kb2JqCit7e29iamVjdCAyIDB9fSA8PAorICAvVHlwZSAvUGFnZXMKKyAgL0NvdW50IDEKKyAgL0tpZHMgWzQgMCBSXQorPj4KK2VuZG9iagore3tvYmplY3QgNCAwfX0gPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQorICAvQ3JvcEJveCBbMCAwIDYxMiA3OTJdCisgIC9SZXNvdXJjZXMgIDw8Pj4KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDYgMH19IDw8CisgIC9EUiA8PAorICAgIC9Gb250IDw8L0hlbHYgNyAwIFI+PgorICA+PgorICAvREEgKC9IZWx2IDAgVGYgMCBnKQorICAvRmllbGRzIFs1IDAgUl0KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDcgMH19IDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL0hlbHZldGljYQorICAvRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZworPj4KK2VuZG9iagore3tvYmplY3QgOCAwfX0gPDwKKyAgL1R5cGUgL1hPYmplY3QKKyAgL1N1YnR5cGUgL0Zvcm0KKyAgL0Zvcm1UeXBlIDEKKyAgL01hdHJpeCBbMSAwIDAgMSAwIDBdCisgIC9CQm94IFswIDAgNzUuOTA3IDI4LjQ3Ml0KKyAgL1Jlc291cmNlcyAgPDwKKyAgICAvRm9udCA8PC9GWEYwIDcgMCBSPj4KKyAgPj4KKz4+CitzdHJlYW0KK3EKK1EKKworCitlbmRzdHJlYW0KK2VuZG9iagore3tvYmplY3QgMTEgMH19IDw8CisgIC9UeXBlIC9BY3Rpb24KKyAgL1MgL0phdmFTY3JpcHQKKyAgL0pTIDUwIDAgUgorPj4KK2VuZG9iagore3tvYmplY3QgMTMgMH19IDw8CisgIC9OYW1lcyBbKHN0YXJ0RGVsYXkpIDExIDAgUl0KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDUwIDB9fSA8PAorPj4KK3N0cmVhbQorZnVuY3Rpb24gc3RhcnREZWxheSgpCit7CisgIGFwcC5hbGVydCgiaGVsbG8gd29ybGQiKTsKK30KK2FwcC5zZXRUaW1lT3V0KCJzdGFydERlbGF5KCkiLCAzMDAwKTsKK2VuZHN0cmVhbQorZW5kb2JqCit7e3hyZWZ9fQordHJhaWxlciA8PAorICAvUm9vdCAxIDAgUgorPj4KK3t7c3RhcnR4cmVmfX0KKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9idWdfNTUxMjQ4LnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z181NTEyNDgucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYTE4NzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfNTUxMjQ4LnBkZgpAQCAtMCwwICsxLDEzNCBAQAorJVBERi0xLjcKKyWg8qT0CisxIDAgb2JqIDw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAyIDAgUgorICAvQWNyb0Zvcm0gNiAwIFIKKyAgL05hbWVzIDw8L0phdmFTY3JpcHQgMTMgMCBSPj4KKz4+CitlbmRvYmoKKzIgMCBvYmogPDwKKyAgL1R5cGUgL1BhZ2VzCisgIC9Db3VudCAxCisgIC9LaWRzIFs0IDAgUl0KKz4+CitlbmRvYmoKKzQgMCBvYmogPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQorICAvQ3JvcEJveCBbMCAwIDYxMiA3OTJdCisgIC9SZXNvdXJjZXMgIDw8Pj4KKz4+CitlbmRvYmoKKzYgMCBvYmogPDwKKyAgL0RSIDw8CisgICAgL0ZvbnQgPDwvSGVsdiA3IDAgUj4+CisgID4+CisgIC9EQSAoL0hlbHYgMCBUZiAwIGcpCisgIC9GaWVsZHMgWzUgMCBSXQorPj4KK2VuZG9iagorNyAwIG9iaiA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHlwZTEKKyAgL0Jhc2VGb250IC9IZWx2ZXRpY2EKKyAgL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcKKz4+CitlbmRvYmoKKzggMCBvYmogPDwKKyAgL1R5cGUgL1hPYmplY3QKKyAgL1N1YnR5cGUgL0Zvcm0KKyAgL0Zvcm1UeXBlIDEKKyAgL01hdHJpeCBbMSAwIDAgMSAwIDBdCisgIC9CQm94IFswIDAgNzUuOTA3IDI4LjQ3Ml0KKyAgL1Jlc291cmNlcyAgPDwKKyAgICAvRm9udCA8PC9GWEYwIDcgMCBSPj4KKyAgPj4KKz4+CitzdHJlYW0KK3EKK1EKKworCitlbmRzdHJlYW0KK2VuZG9iagorMTEgMCBvYmogPDwKKyAgL1R5cGUgL0FjdGlvbgorICAvUyAvSmF2YVNjcmlwdAorICAvSlMgNTAgMCBSCis+PgorZW5kb2JqCisxMyAwIG9iaiA8PAorICAvTmFtZXMgWyhzdGFydERlbGF5KSAxMSAwIFJdCis+PgorZW5kb2JqCis1MCAwIG9iaiA8PAorPj4KK3N0cmVhbQorZnVuY3Rpb24gc3RhcnREZWxheSgpCit7CisgIGFwcC5hbGVydCgiaGVsbG8gd29ybGQiKTsKK30KK2FwcC5zZXRUaW1lT3V0KCJzdGFydERlbGF5KCkiLCAzMDAwKTsKK2VuZHN0cmVhbQorZW5kb2JqCit4cmVmCiswIDUxCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDE1IDAwMDAwIG4gCiswMDAwMDAwMTE4IDAwMDAwIG4gCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMTgxIDAwMDAwIG4gCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMzAyIDAwMDAwIG4gCiswMDAwMDAwNDA0IDAwMDAwIG4gCiswMDAwMDAwNTA5IDAwMDAwIG4gCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwNzAxIDAwMDAwIG4gCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwNzY5IDAwMDAwIG4gCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwODIyIDAwMDAwIG4gCit0cmFpbGVyIDw8CisgIC9Sb290IDEgMCBSCis+Pgorc3RhcnR4cmVmCis5NTQKKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9idWdfNTUxNDYwLmluIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzU1MTQ2MC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWQyZjNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzU1MTQ2MC5pbgpAQCAtMCwwICsxLDc1IEBACit7e2hlYWRlcn19CisKK3t7b2JqZWN0IDEgMH19Cis8PAorICAvUGFnZXMgMiAwIFIKKz4+CitlbmRvYmoKKwore3tvYmplY3QgMiAwfX0KKzw8CisgIC9LaWRzIFsgMyAwIFIgXQorPj4KK2VuZG9iagorCit7e29iamVjdCAzIDB9fQorPDwKKyAgL0NvbnRlbnRzIDYgMCBSCisgIC9SZXNvdXJjZXMgNSAwIFIKKz4+CitlbmRvYmoKKwore3tvYmplY3QgNiAwfX0KKzw8Pj4KK3N0cmVhbQorMC4wIEcKKzAuMCAxLjAgMC4wIHJnCisyNSAxNzUgMTc1IC0xNTAgcmUKKy9TaCBzaAorZW5kc3RyZWFtCitlbmRvYmoKKwore3tvYmplY3QgNSAwfX0KKzw8CisgIC9TaGFkaW5nIDw8CisgICAgL1NoIDcgMCBSCisgID4+Cis+PgorZW5kb2JqCisKK3t7b2JqZWN0IDcgMH19Cis8PAorICAvU2hhZGluZ1R5cGUgMQorICAvQ29sb3JTcGFjZSAvRGV2aWNlQ01ZSworICAvQ29vcmRzIFswLjAgMC4wIDEuMCAxLjBdCisgIC9GdW5jdGlvbiA5IDAgUgorICAvRXh0ZW5kIFt0cnVlIHRydWVdCis+PgorCit7e29iamVjdCA5IDB9fQorPDwKKyAgL0Z1bmN0aW9uVHlwZSAzCisgIC9Eb21haW4gWzAuMCAxLjAgMC4wIDEuMF0KKyAgL0Z1bmN0aW9ucyBbMTAgMCBSXQorICAvQm91bmRzIFsyLjBdCisgIC9FbmNvZGUgWzAuMCAxLjBdCis+PgorZW5kb2JqCisKK3t7b2JqZWN0IDEwIDB9fQorPDwKKyAgL0Z1bmN0aW9uVHlwZSAyCisgIC9Eb21haW4gWzAuMCAxLjAgMC4wIDEuMF0KKyAgL0MwIFswLjAgMC4wXQorICAvQzEgWzEuMCAxLjBdCisgIC9OIDEKKz4+CitlbmRvYmoKKwore3t4cmVmfX0KK3RyYWlsZXIgPDwKKyAgL1Jvb3QgMSAwIFIKKyAgL1NpemUgMTEKKz4+Cit7e3N0YXJ0eHJlZn19CislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzU1MTQ2MC5wZGYgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfNTUxNDYwLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjZlM2ZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzU1MTQ2MC5wZGYKQEAgLTAsMCArMSw4OSBAQAorJVBERi0xLjcKKyWg8qT0CisKKzEgMCBvYmoKKzw8CisgIC9QYWdlcyAyIDAgUgorPj4KK2VuZG9iagorCisyIDAgb2JqCis8PAorICAvS2lkcyBbIDMgMCBSIF0KKz4+CitlbmRvYmoKKworMyAwIG9iagorPDwKKyAgL0NvbnRlbnRzIDYgMCBSCisgIC9SZXNvdXJjZXMgNSAwIFIKKz4+CitlbmRvYmoKKworNiAwIG9iagorPDw+Pgorc3RyZWFtCiswLjAgRworMC4wIDEuMCAwLjAgcmcKKzI1IDE3NSAxNzUgLTE1MCByZQorL1NoIHNoCitlbmRzdHJlYW0KK2VuZG9iagorCis1IDAgb2JqCis8PAorICAvU2hhZGluZyA8PAorICAgIC9TaCA3IDAgUgorICA+PgorPj4KK2VuZG9iagorCis3IDAgb2JqCis8PAorICAvU2hhZGluZ1R5cGUgMQorICAvQ29sb3JTcGFjZSAvRGV2aWNlQ01ZSworICAvQ29vcmRzIFswLjAgMC4wIDEuMCAxLjBdCisgIC9GdW5jdGlvbiA5IDAgUgorICAvRXh0ZW5kIFt0cnVlIHRydWVdCis+PgorCis5IDAgb2JqCis8PAorICAvRnVuY3Rpb25UeXBlIDMKKyAgL0RvbWFpbiBbMC4wIDEuMCAwLjAgMS4wXQorICAvRnVuY3Rpb25zIFsxMCAwIFJdCisgIC9Cb3VuZHMgWzIuMF0KKyAgL0VuY29kZSBbMC4wIDEuMF0KKz4+CitlbmRvYmoKKworMTAgMCBvYmoKKzw8CisgIC9GdW5jdGlvblR5cGUgMgorICAvRG9tYWluIFswLjAgMS4wIDAuMCAxLjBdCisgIC9DMCBbMC4wIDAuMF0KKyAgL0MxIFsxLjAgMS4wXQorICAvTiAxCis+PgorZW5kb2JqCisKK3hyZWYKKzAgMTEKKzAwMDAwMDAwMDAgNjU1MzUgZiAKKzAwMDAwMDAwMTYgMDAwMDAgbiAKKzAwMDAwMDAwNTMgMDAwMDAgbiAKKzAwMDAwMDAwOTMgMDAwMDAgbiAKKzAwMDAwMDAwMDAgNjU1MzUgZiAKKzAwMDAwMDAyMzcgMDAwMDAgbiAKKzAwMDAwMDAxNTIgMDAwMDAgbiAKKzAwMDAwMDAyOTIgMDAwMDAgbiAKKzAwMDAwMDAwMDAgNjU1MzUgZiAKKzAwMDAwMDA0MTggMDAwMDAgbiAKKzAwMDAwMDA1NDQgMDAwMDAgbiAKK3RyYWlsZXIgPDwKKyAgL1Jvb3QgMSAwIFIKKyAgL1NpemUgMTEKKz4+CitzdGFydHhyZWYKKzY1MgorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z181NTIwNDYuaW4gYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfNTUyMDQ2LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZmMyNTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfNTUyMDQ2LmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z181NTIwNDYucGRmIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzU1MjA0Ni5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYwNDMyZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z181NTIwNDYucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z181NTQxNTEuaW4gYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfNTU0MTUxLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwODcxNTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfNTU0MTUxLmluCkBAIC0wLDAgKzEsNTkgQEAKK3t7aGVhZGVyfX0KKwore3tvYmplY3QgMSAwfX0KKzw8CisgIC9QYWdlcyAyIDAgUgorPj4KK2VuZG9iagorCit7e29iamVjdCAyIDB9fQorPDwKKyAgL0tpZHMgWyAzIDAgUiBdCis+PgorZW5kb2JqCisKK3t7b2JqZWN0IDMgMH19Cis8PAorICAvQ29udGVudHMgNiAwIFIKKyAgL1Jlc291cmNlcyA1IDAgUgorPj4KK2VuZG9iagorCit7e29iamVjdCA2IDB9fQorPDw+Pgorc3RyZWFtCis2MTIgMC4wIDAuMCAxMDQwMDAgMCAwIGNtCisvWEJhZCBEbworZW5kc3RyZWFtCitlbmRvYmoKKwore3tvYmplY3QgNSAwfX0KKzw8CisgIC9YT2JqZWN0IDw8CisgICAgL1hCYWQgNyAwIFIKKyAgPj4KKz4+CitlbmRvYmoKKwore3tvYmplY3QgNyAwfX0KKzw8CisgIC9UeXBlIC9YT2JqZWN0CisgIC9TdWJ0eXBlIC9JbWFnZQorICAvV2lkdGggNjEyCisgIC9IZWlnaHQgMTA0MDAwCisgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKKyAgL0JpdHNQZXJDb21wb25lbnQgNAorICAvTGVuZ3RoIDAKKyAgL0RlY29kZSBbMS4wXQorPj4KK3N0cmVhbQorRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGCitlbmRvYmoKKwore3t4cmVmfX0KK3RyYWlsZXIgPDwKKyAgL1Jvb3QgMSAwIFIKKyAgL1NpemUgOAorPj4KK3t7c3RhcnR4cmVmfX0KKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9idWdfNTU0MTUxLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z181NTQxNTEucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNzcwYTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfNTU0MTUxLnBkZgpAQCAtMCwwICsxLDcwIEBACislUERGLTEuNworJaDypPQKKworMSAwIG9iagorPDwKKyAgL1BhZ2VzIDIgMCBSCis+PgorZW5kb2JqCisKKzIgMCBvYmoKKzw8CisgIC9LaWRzIFsgMyAwIFIgXQorPj4KK2VuZG9iagorCiszIDAgb2JqCis8PAorICAvQ29udGVudHMgNiAwIFIKKyAgL1Jlc291cmNlcyA1IDAgUgorPj4KK2VuZG9iagorCis2IDAgb2JqCis8PD4+CitzdHJlYW0KKzYxMiAwLjAgMC4wIDEwNDAwMCAwIDAgY20KKy9YQmFkIERvCitlbmRzdHJlYW0KK2VuZG9iagorCis1IDAgb2JqCis8PAorICAvWE9iamVjdCA8PAorICAgIC9YQmFkIDcgMCBSCisgID4+Cis+PgorZW5kb2JqCisKKzcgMCBvYmoKKzw8CisgIC9UeXBlIC9YT2JqZWN0CisgIC9TdWJ0eXBlIC9JbWFnZQorICAvV2lkdGggNjEyCisgIC9IZWlnaHQgMTA0MDAwCisgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKKyAgL0JpdHNQZXJDb21wb25lbnQgNAorICAvTGVuZ3RoIDAKKyAgL0RlY29kZSBbMS4wXQorPj4KK3N0cmVhbQorRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGCitlbmRvYmoKKworeHJlZgorMCA4CiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDE2IDAwMDAwIG4gCiswMDAwMDAwMDUzIDAwMDAwIG4gCiswMDAwMDAwMDkzIDAwMDAwIG4gCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMjI1IDAwMDAwIG4gCiswMDAwMDAwMTUyIDAwMDAwIG4gCiswMDAwMDAwMjgyIDAwMDAwIG4gCit0cmFpbGVyIDw8CisgIC9Sb290IDEgMCBSCisgIC9TaXplIDgKKz4+CitzdGFydHhyZWYKKzEzNzAKKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9idWdfNTU1Nzg0LmluIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzU1NTc4NC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmExZjQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzU1NTc4NC5pbgpAQCAtMCwwICsxLDc0IEBACit7e2hlYWRlcn19CisKK3t7b2JqZWN0IDEgMH19Cis8PAorICAvUGFnZXMgMiAwIFIKKz4+CitlbmRvYmoKKwore3tvYmplY3QgMiAwfX0KKzw8CisgIC9LaWRzIFsgMyAwIFIgXQorPj4KK2VuZG9iagorCit7e29iamVjdCAzIDB9fQorPDwKKyAgL0NvbnRlbnRzIDYgMCBSCisgIC9SZXNvdXJjZXMgNSAwIFIKKz4+CitlbmRvYmoKKwore3tvYmplY3QgNiAwfX0KKzw8Pj4KK3N0cmVhbQorNDE3OCAwLjAgMC4wIDEgMCAwIGNtCisvWEJhZCBEbworZW5kc3RyZWFtCitlbmRvYmoKKwore3tvYmplY3QgNSAwfX0KKzw8CisgIC9YT2JqZWN0IDw8CisgICAgL1hCYWQgNyAwIFIKKyAgPj4KKz4+CitlbmRvYmoKKwore3tvYmplY3QgNyAwfX0KKzw8CisgIC9UeXBlIC9YT2JqZWN0CisgIC9TdWJ0eXBlIC9JbWFnZQorICAvV2lkdGggODE5MTUKKyAgL0hlaWdodCAxCisgIC9Db2xvclNwYWNlIFsvRGV2aWNlTiBbCisvYTAgL2ExIC9hMiAvYTMgL2E0IC9hNSAvYTYgL2E3IC9hOCAvYTkgL2FhIC9hYiAvYWMgL2FkIC9hZSAvYWYgL2ExMCAvYTExIC9hMTIgL2ExMyAvYTE0IC9hMTUgL2ExNiAvYTE3IC9hMTggL2ExOSAvYTFhIC9hMWIgL2ExYyAvYTFkIC9hMWUgL2ExZiAvYTIwIC9hMjEgL2EyMiAvYTIzIC9hMjQgL2EyNSAvYTI2IC9hMjcgL2EyOCAvYTI5IC9hMmEgL2EyYiAvYTJjIC9hMmQgL2EyZSAvYTJmIC9hMzAgL2EzMSAvYTMyIC9hMzMgL2EzNCAvYTM1IC9hMzYgL2EzNyAvYTM4IC9hMzkgL2EzYSAvYTNiIC9hM2MgL2EzZCAvYTNlIC9hM2YgL2E0MCAvYTQxIC9hNDIgL2E0MyAvYTQ0IC9hNDUgL2E0NiAvYTQ3IC9hNDggL2E0OSAvYTRhIC9hNGIgL2E0YyAvYTRkIC9hNGUgL2E0ZiAvYTUwIC9hNTEgL2E1MiAvYTUzIC9hNTQgL2E1NSAvYTU2IC9hNTcgL2E1OCAvYTU5IC9hNWEgL2E1YiAvYTVjIC9hNWQgL2E1ZSAvYTVmIC9hNjAgL2E2MSAvYTYyIC9hNjMgL2E2NCAvYTY1IC9hNjYgL2E2NyAvYTY4IC9hNjkgL2E2YSAvYTZiIC9hNmMgL2E2ZCAvYTZlIC9hNmYgL2E3MCAvYTcxIC9hNzIgL2E3MyAvYTc0IC9hNzUgL2E3NiAvYTc3IC9hNzggL2E3OSAvYTdhIC9hN2IgL2E3YyAvYTdkIC9hN2UgL2E3ZiAvYTgwIC9hODEgL2E4MiAvYTgzIC9hODQgL2E4NSAvYTg2IC9hODcgL2E4OCAvYTg5IC9hOGEgL2E4YiAvYThjIC9hOGQgL2E4ZSAvYThmIC9hOTAgL2E5MSAvYTkyIC9hOTMgL2E5NCAvYTk1IC9hOTYgL2E5NyAvYTk4IC9hOTkgL2E5YSAvYTliIC9hOWMgL2E5ZCAvYTllIC9hOWYgL2FhMCAvYWExIC9hYTIgL2FhMyAvYWE0IC9hYTUgL2FhNiAvYWE3IC9hYTggL2FhOSAvYWFhIC9hYWIgL2FhYyAvYWFkIC9hYWUgL2FhZiAvYWIwIC9hYjEgL2FiMiAvYWIzIC9hYjQgL2FiNSAvYWI2IC9hYjcgL2FiOCAvYWI5IC9hYmEgL2FiYiAvYWJjIC9hYmQgL2FiZSAvYWJmIC9hYzAgL2FjMSAvYWMyIC9hYzMgL2FjNCAvYWM1IC9hYzYgL2FjNyAvYWM4IC9hYzkgL2FjYSAvYWNiIC9hY2MgL2FjZCAvYWNlIC9hY2YgL2FkMCAvYWQxIC9hZDIgL2FkMyAvYWQ0IC9hZDUgL2FkNiAvYWQ3IC9hZDggL2FkOSAvYWRhIC9hZGIgL2FkYyAvYWRkIC9hZGUgL2FkZiAvYWUwIC9hZTEgL2FlMiAvYWUzIC9hZTQgL2FlNSAvYWU2IC9hZTcgL2FlOCAvYWU5IC9hZWEgL2FlYiAvYWVjIC9hZWQgL2FlZSAvYWVmIC9hZjAgL2FmMSAvYWYyIC9hZjMgL2FmNCAvYWY1IC9hZjYgL2FmNyAvYWY4IC9hZjkgL2FmYSAvYWZiIC9hZmMgL2FmZCAvYWZlIC9hZmYgL2ExMDAgL2ExMDEgL2ExMDIgL2ExMDMgL2ExMDQgL2ExMDUgL2ExMDYgL2ExMDcgL2ExMDggL2ExMDkgL2ExMGEgL2ExMGIgL2ExMGMgL2ExMGQgL2ExMGUgL2ExMGYgL2ExMTAgL2ExMTEgL2ExMTIgL2ExMTMgL2ExMTQgL2ExMTUgL2ExMTYgL2ExMTcgL2ExMTggL2ExMTkgL2ExMWEgL2ExMWIgL2ExMWMgL2ExMWQgL2ExMWUgL2ExMWYgL2ExMjAgL2ExMjEgL2ExMjIgL2ExMjMgL2ExMjQgL2ExMjUgL2ExMjYgL2ExMjcgL2ExMjggL2ExMjkgL2ExMmEgL2ExMmIgL2ExMmMgL2ExMmQgL2ExMmUgL2ExMmYgL2ExMzAgL2ExMzEgL2ExMzIgL2ExMzMgL2ExMzQgL2ExMzUgL2ExMzYgL2ExMzcgL2ExMzggL2ExMzkgL2ExM2EgL2ExM2IgL2ExM2MgL2ExM2QgL2ExM2UgL2ExM2YgL2ExNDAgL2ExNDEgL2ExNDIgL2ExNDMgL2ExNDQgL2ExNDUgL2ExNDYgL2ExNDcgL2ExNDggL2ExNDkgL2ExNGEgL2ExNGIgL2ExNGMgL2ExNGQgL2ExNGUgL2ExNGYgL2ExNTAgL2ExNTEgL2ExNTIgL2ExNTMgL2ExNTQgL2ExNTUgL2ExNTYgL2ExNTcgL2ExNTggL2ExNTkgL2ExNWEgL2ExNWIgL2ExNWMgL2ExNWQgL2ExNWUgL2ExNWYgL2ExNjAgL2ExNjEgL2ExNjIgL2ExNjMgL2ExNjQgL2ExNjUgL2ExNjYgL2ExNjcgL2ExNjggL2ExNjkgL2ExNmEgL2ExNmIgL2ExNmMgL2ExNmQgL2ExNmUgL2ExNmYgL2ExNzAgL2ExNzEgL2ExNzIgL2ExNzMgL2ExNzQgL2ExNzUgL2ExNzYgL2ExNzcgL2ExNzggL2ExNzkgL2ExN2EgL2ExN2IgL2ExN2MgL2ExN2QgL2ExN2UgL2ExN2YgL2ExODAgL2ExODEgL2ExODIgL2ExODMgL2ExODQgL2ExODUgL2ExODYgL2ExODcgL2ExODggL2ExODkgL2ExOGEgL2ExOGIgL2ExOGMgL2ExOGQgL2ExOGUgL2ExOGYgL2ExOTAgL2ExOTEgL2ExOTIgL2ExOTMgL2ExOTQgL2ExOTUgL2ExOTYgL2ExOTcgL2ExOTggL2ExOTkgL2ExOWEgL2ExOWIgL2ExOWMgL2ExOWQgL2ExOWUgL2ExOWYgL2ExYTAgL2ExYTEgL2ExYTIgL2ExYTMgL2ExYTQgL2ExYTUgL2ExYTYgL2ExYTcgL2ExYTggL2ExYTkgL2ExYWEgL2ExYWIgL2ExYWMgL2ExYWQgL2ExYWUgL2ExYWYgL2ExYjAgL2ExYjEgL2ExYjIgL2ExYjMgL2ExYjQgL2ExYjUgL2ExYjYgL2ExYjcgL2ExYjggL2ExYjkgL2ExYmEgL2ExYmIgL2ExYmMgL2ExYmQgL2ExYmUgL2ExYmYgL2ExYzAgL2ExYzEgL2ExYzIgL2ExYzMgL2ExYzQgL2ExYzUgL2ExYzYgL2ExYzcgL2ExYzggL2ExYzkgL2ExY2EgL2ExY2IgL2ExY2MgL2ExY2QgL2ExY2UgL2ExY2YgL2ExZDAgL2ExZDEgL2ExZDIgL2ExZDMgL2ExZDQgL2ExZDUgL2ExZDYgL2ExZDcgL2ExZDggL2ExZDkgL2ExZGEgL2ExZGIgL2ExZGMgL2ExZGQgL2ExZGUgL2ExZGYgL2ExZTAgL2ExZTEgL2ExZTIgL2ExZTMgL2ExZTQgL2ExZTUgL2ExZTYgL2ExZTcgL2ExZTggL2ExZTkgL2ExZWEgL2ExZWIgL2ExZWMgL2ExZWQgL2ExZWUgL2ExZWYgL2ExZjAgL2ExZjEgL2ExZjIgL2ExZjMgL2ExZjQgL2ExZjUgL2ExZjYgL2ExZjcgL2ExZjggL2ExZjkgL2ExZmEgL2ExZmIgL2ExZmMgL2ExZmQgL2ExZmUgL2ExZmYgL2EyMDAgL2EyMDEgL2EyMDIgL2EyMDMgL2EyMDQgL2EyMDUgL2EyMDYgL2EyMDcgL2EyMDggL2EyMDkgL2EyMGEgL2EyMGIgL2EyMGMgL2EyMGQgL2EyMGUgL2EyMGYgL2EyMTAgL2EyMTEgL2EyMTIgL2EyMTMgL2EyMTQgL2EyMTUgL2EyMTYgL2EyMTcgL2EyMTggL2EyMTkgL2EyMWEgL2EyMWIgL2EyMWMgL2EyMWQgL2EyMWUgL2EyMWYgL2EyMjAgL2EyMjEgL2EyMjIgL2EyMjMgL2EyMjQgL2EyMjUgL2EyMjYgL2EyMjcgL2EyMjggL2EyMjkgL2EyMmEgL2EyMmIgL2EyMmMgL2EyMmQgL2EyMmUgL2EyMmYgL2EyMzAgL2EyMzEgL2EyMzIgL2EyMzMgL2EyMzQgL2EyMzUgL2EyMzYgL2EyMzcgL2EyMzggL2EyMzkgL2EyM2EgL2EyM2IgL2EyM2MgL2EyM2QgL2EyM2UgL2EyM2YgL2EyNDAgL2EyNDEgL2EyNDIgL2EyNDMgL2EyNDQgL2EyNDUgL2EyNDYgL2EyNDcgL2EyNDggL2EyNDkgL2EyNGEgL2EyNGIgL2EyNGMgL2EyNGQgL2EyNGUgL2EyNGYgL2EyNTAgL2EyNTEgL2EyNTIgL2EyNTMgL2EyNTQgL2EyNTUgL2EyNTYgL2EyNTcgL2EyNTggL2EyNTkgL2EyNWEgL2EyNWIgL2EyNWMgL2EyNWQgL2EyNWUgL2EyNWYgL2EyNjAgL2EyNjEgL2EyNjIgL2EyNjMgL2EyNjQgL2EyNjUgL2EyNjYgL2EyNjcgL2EyNjggL2EyNjkgL2EyNmEgL2EyNmIgL2EyNmMgL2EyNmQgL2EyNmUgL2EyNmYgL2EyNzAgL2EyNzEgL2EyNzIgL2EyNzMgL2EyNzQgL2EyNzUgL2EyNzYgL2EyNzcgL2EyNzggL2EyNzkgL2EyN2EgL2EyN2IgL2EyN2MgL2EyN2QgL2EyN2UgL2EyN2YgL2EyODAgL2EyODEgL2EyODIgL2EyODMgL2EyODQgL2EyODUgL2EyODYgL2EyODcgL2EyODggL2EyODkgL2EyOGEgL2EyOGIgL2EyOGMgL2EyOGQgL2EyOGUgL2EyOGYgL2EyOTAgL2EyOTEgL2EyOTIgL2EyOTMgL2EyOTQgL2EyOTUgL2EyOTYgL2EyOTcgL2EyOTggL2EyOTkgL2EyOWEgL2EyOWIgL2EyOWMgL2EyOWQgL2EyOWUgL2EyOWYgL2EyYTAgL2EyYTEgL2EyYTIgL2EyYTMgL2EyYTQgL2EyYTUgL2EyYTYgL2EyYTcgL2EyYTggL2EyYTkgL2EyYWEgL2EyYWIgL2EyYWMgL2EyYWQgL2EyYWUgL2EyYWYgL2EyYjAgL2EyYjEgL2EyYjIgL2EyYjMgL2EyYjQgL2EyYjUgL2EyYjYgL2EyYjcgL2EyYjggL2EyYjkgL2EyYmEgL2EyYmIgL2EyYmMgL2EyYmQgL2EyYmUgL2EyYmYgL2EyYzAgL2EyYzEgL2EyYzIgL2EyYzMgL2EyYzQgL2EyYzUgL2EyYzYgL2EyYzcgL2EyYzggL2EyYzkgL2EyY2EgL2EyY2IgL2EyY2MgL2EyY2QgL2EyY2UgL2EyY2YgL2EyZDAgL2EyZDEgL2EyZDIgL2EyZDMgL2EyZDQgL2EyZDUgL2EyZDYgL2EyZDcgL2EyZDggL2EyZDkgL2EyZGEgL2EyZGIgL2EyZGMgL2EyZGQgL2EyZGUgL2EyZGYgL2EyZTAgL2EyZTEgL2EyZTIgL2EyZTMgL2EyZTQgL2EyZTUgL2EyZTYgL2EyZTcgL2EyZTggL2EyZTkgL2EyZWEgL2EyZWIgL2EyZWMgL2EyZWQgL2EyZWUgL2EyZWYgL2EyZjAgL2EyZjEgL2EyZjIgL2EyZjMgL2EyZjQgL2EyZjUgL2EyZjYgL2EyZjcgL2EyZjggL2EyZjkgL2EyZmEgL2EyZmIgL2EyZmMgL2EyZmQgL2EyZmUgL2EyZmYgL2EzMDAgL2EzMDEgL2EzMDIgL2EzMDMgL2EzMDQgL2EzMDUgL2EzMDYgL2EzMDcgL2EzMDggL2EzMDkgL2EzMGEgL2EzMGIgL2EzMGMgL2EzMGQgL2EzMGUgL2EzMGYgL2EzMTAgL2EzMTEgL2EzMTIgL2EzMTMgL2EzMTQgL2EzMTUgL2EzMTYgL2EzMTcgL2EzMTggL2EzMTkgL2EzMWEgL2EzMWIgL2EzMWMgL2EzMWQgL2EzMWUgL2EzMWYgL2EzMjAgL2EzMjEgL2EzMjIgL2EzMjMgL2EzMjQgL2EzMjUgL2EzMjYgL2EzMjcgL2EzMjggL2EzMjkgL2EzMmEgL2EzMmIgL2EzMmMgL2EzMmQgL2EzMmUgL2EzMmYgL2EzMzAgL2EzMzEgL2EzMzIgL2EzMzMgL2EzMzQgL2EzMzUgL2EzMzYgL2EzMzcgL2EzMzggL2EzMzkgL2EzM2EgL2EzM2IgL2EzM2MgL2EzM2QgL2EzM2UgL2EzM2YgL2EzNDAgL2EzNDEgL2EzNDIgL2EzNDMgL2EzNDQgL2EzNDUgL2EzNDYgL2EzNDcgL2EzNDggL2EzNDkgL2EzNGEgL2EzNGIgL2EzNGMgL2EzNGQgL2EzNGUgL2EzNGYgL2EzNTAgL2EzNTEgL2EzNTIgL2EzNTMgL2EzNTQgL2EzNTUgL2EzNTYgL2EzNTcgL2EzNTggL2EzNTkgL2EzNWEgL2EzNWIgL2EzNWMgL2EzNWQgL2EzNWUgL2EzNWYgL2EzNjAgL2EzNjEgL2EzNjIgL2EzNjMgL2EzNjQgL2EzNjUgL2EzNjYgL2EzNjcgL2EzNjggL2EzNjkgL2EzNmEgL2EzNmIgL2EzNmMgL2EzNmQgL2EzNmUgL2EzNmYgL2EzNzAgL2EzNzEgL2EzNzIgL2EzNzMgL2EzNzQgL2EzNzUgL2EzNzYgL2EzNzcgL2EzNzggL2EzNzkgL2EzN2EgL2EzN2IgL2EzN2MgL2EzN2QgL2EzN2UgL2EzN2YgL2EzODAgL2EzODEgL2EzODIgL2EzODMgL2EzODQgL2EzODUgL2EzODYgL2EzODcgL2EzODggL2EzODkgL2EzOGEgL2EzOGIgL2EzOGMgL2EzOGQgL2EzOGUgL2EzOGYgL2EzOTAgL2EzOTEgL2EzOTIgL2EzOTMgL2EzOTQgL2EzOTUgL2EzOTYgL2EzOTcgL2EzOTggL2EzOTkgL2EzOWEgL2EzOWIgL2EzOWMgL2EzOWQgL2EzOWUgL2EzOWYgL2EzYTAgL2EzYTEgL2EzYTIgL2EzYTMgL2EzYTQgL2EzYTUgL2EzYTYgL2EzYTcgL2EzYTggL2EzYTkgL2EzYWEgL2EzYWIgL2EzYWMgL2EzYWQgL2EzYWUgL2EzYWYgL2EzYjAgL2EzYjEgL2EzYjIgL2EzYjMgL2EzYjQgL2EzYjUgL2EzYjYgL2EzYjcgL2EzYjggL2EzYjkgL2EzYmEgL2EzYmIgL2EzYmMgL2EzYmQgL2EzYmUgL2EzYmYgL2EzYzAgL2EzYzEgL2EzYzIgL2EzYzMgL2EzYzQgL2EzYzUgL2EzYzYgL2EzYzcgL2EzYzggL2EzYzkgL2EzY2EgL2EzY2IgL2EzY2MgL2EzY2QgL2EzY2UgL2EzY2YgL2EzZDAgL2EzZDEgL2EzZDIgL2EzZDMgL2EzZDQgL2EzZDUgL2EzZDYgL2EzZDcgL2EzZDggL2EzZDkgL2EzZGEgL2EzZGIgL2EzZGMgL2EzZGQgL2EzZGUgL2EzZGYgL2EzZTAgL2EzZTEgL2EzZTIgL2EzZTMgL2EzZTQgL2EzZTUgL2EzZTYgL2EzZTcKKy9hM2U4IC9hM2U5IC9hM2VhIC9hM2ViIC9hM2VjIC9hM2VkIC9hM2VlIC9hM2VmIC9hM2YwIC9hM2YxIC9hM2YyIC9hM2YzIC9hM2Y0IC9hM2Y1IC9hM2Y2IC9hM2Y3IC9hM2Y4IC9hM2Y5IC9hM2ZhIC9hM2ZiIC9hM2ZjIC9hM2ZkIC9hM2ZlIC9hM2ZmIC9hNDAwIC9hNDAxIC9hNDAyIC9hNDAzIC9hNDA0IC9hNDA1IC9hNDA2IC9hNDA3IC9hNDA4IC9hNDA5IC9hNDBhIC9hNDBiIC9hNDBjIC9hNDBkIC9hNDBlIC9hNDBmIC9hNDEwIC9hNDExIC9hNDEyIC9hNDEzIC9hNDE0IC9hNDE1IC9hNDE2IC9hNDE3IC9hNDE4IC9hNDE5IC9hNDFhIC9hNDFiIC9hNDFjIC9hNDFkIC9hNDFlIC9hNDFmIC9hNDIwIC9hNDIxIC9hNDIyIC9hNDIzIC9hNDI0IC9hNDI1IC9hNDI2IC9hNDI3IC9hNDI4IC9hNDI5IC9hNDJhIC9hNDJiIC9hNDJjIC9hNDJkIC9hNDJlIC9hNDJmIC9hNDMwIC9hNDMxIC9hNDMyIC9hNDMzIC9hNDM0IC9hNDM1IC9hNDM2IC9hNDM3IC9hNDM4IC9hNDM5IC9hNDNhIC9hNDNiIC9hNDNjIC9hNDNkIC9hNDNlIC9hNDNmIC9hNDQwIC9hNDQxIC9hNDQyIC9hNDQzIC9hNDQ0IC9hNDQ1IC9hNDQ2IC9hNDQ3IC9hNDQ4IC9hNDQ5IC9hNDRhIC9hNDRiIC9hNDRjIC9hNDRkIC9hNDRlIC9hNDRmIC9hNDUwIC9hNDUxIC9hNDUyIC9hNDUzIC9hNDU0IC9hNDU1IC9hNDU2IC9hNDU3IC9hNDU4IC9hNDU5IC9hNDVhIC9hNDViIC9hNDVjIC9hNDVkIC9hNDVlIC9hNDVmIC9hNDYwIC9hNDYxIC9hNDYyIC9hNDYzIC9hNDY0IC9hNDY1IC9hNDY2IC9hNDY3IC9hNDY4IC9hNDY5IC9hNDZhIC9hNDZiIC9hNDZjIC9hNDZkIC9hNDZlIC9hNDZmIC9hNDcwIC9hNDcxIC9hNDcyIC9hNDczIC9hNDc0IC9hNDc1IC9hNDc2IC9hNDc3IC9hNDc4IC9hNDc5IC9hNDdhIC9hNDdiIC9hNDdjIC9hNDdkIC9hNDdlIC9hNDdmIC9hNDgwIC9hNDgxIC9hNDgyIC9hNDgzIC9hNDg0IC9hNDg1IC9hNDg2IC9hNDg3IC9hNDg4IC9hNDg5IC9hNDhhIC9hNDhiIC9hNDhjIC9hNDhkIC9hNDhlIC9hNDhmIC9hNDkwIC9hNDkxIC9hNDkyIC9hNDkzIC9hNDk0IC9hNDk1IC9hNDk2IC9hNDk3IC9hNDk4IC9hNDk5IC9hNDlhIC9hNDliIC9hNDljIC9hNDlkIC9hNDllIC9hNDlmIC9hNGEwIC9hNGExIC9hNGEyIC9hNGEzIC9hNGE0IC9hNGE1IC9hNGE2IC9hNGE3IC9hNGE4IC9hNGE5IC9hNGFhIC9hNGFiIC9hNGFjIC9hNGFkIC9hNGFlIC9hNGFmIC9hNGIwIC9hNGIxIC9hNGIyIC9hNGIzIC9hNGI0IC9hNGI1IC9hNGI2IC9hNGI3IC9hNGI4IC9hNGI5IC9hNGJhIC9hNGJiIC9hNGJjIC9hNGJkIC9hNGJlIC9hNGJmIC9hNGMwIC9hNGMxIC9hNGMyIC9hNGMzIC9hNGM0IC9hNGM1IC9hNGM2IC9hNGM3IC9hNGM4IC9hNGM5IC9hNGNhIC9hNGNiIC9hNGNjIC9hNGNkIC9hNGNlIC9hNGNmIC9hNGQwIC9hNGQxIC9hNGQyIC9hNGQzIC9hNGQ0IC9hNGQ1IC9hNGQ2IC9hNGQ3IC9hNGQ4IC9hNGQ5IC9hNGRhIC9hNGRiIC9hNGRjIC9hNGRkIC9hNGRlIC9hNGRmIC9hNGUwIC9hNGUxIC9hNGUyIC9hNGUzIC9hNGU0IC9hNGU1IC9hNGU2IC9hNGU3IC9hNGU4IC9hNGU5IC9hNGVhIC9hNGViIC9hNGVjIC9hNGVkIC9hNGVlIC9hNGVmIC9hNGYwIC9hNGYxIC9hNGYyIC9hNGYzIC9hNGY0IC9hNGY1IC9hNGY2IC9hNGY3IC9hNGY4IC9hNGY5IC9hNGZhIC9hNGZiIC9hNGZjIC9hNGZkIC9hNGZlIC9hNGZmIC9hNTAwIC9hNTAxIC9hNTAyIC9hNTAzIC9hNTA0IC9hNTA1IC9hNTA2IC9hNTA3IC9hNTA4IC9hNTA5IC9hNTBhIC9hNTBiIC9hNTBjIC9hNTBkIC9hNTBlIC9hNTBmIC9hNTEwIC9hNTExIC9hNTEyIC9hNTEzIC9hNTE0IC9hNTE1IC9hNTE2IC9hNTE3IC9hNTE4IC9hNTE5IC9hNTFhIC9hNTFiIC9hNTFjIC9hNTFkIC9hNTFlIC9hNTFmIC9hNTIwIC9hNTIxIC9hNTIyIC9hNTIzIC9hNTI0IC9hNTI1IC9hNTI2IC9hNTI3IC9hNTI4IC9hNTI5IC9hNTJhIC9hNTJiIC9hNTJjIC9hNTJkIC9hNTJlIC9hNTJmIC9hNTMwIC9hNTMxIC9hNTMyIC9hNTMzIC9hNTM0IC9hNTM1IC9hNTM2IC9hNTM3IC9hNTM4IC9hNTM5IC9hNTNhIC9hNTNiIC9hNTNjIC9hNTNkIC9hNTNlIC9hNTNmIC9hNTQwIC9hNTQxIC9hNTQyIC9hNTQzIC9hNTQ0IC9hNTQ1IC9hNTQ2IC9hNTQ3IC9hNTQ4IC9hNTQ5IC9hNTRhIC9hNTRiIC9hNTRjIC9hNTRkIC9hNTRlIC9hNTRmIC9hNTUwIC9hNTUxIC9hNTUyIC9hNTUzIC9hNTU0IC9hNTU1IC9hNTU2IC9hNTU3IC9hNTU4IC9hNTU5IC9hNTVhIC9hNTViIC9hNTVjIC9hNTVkIC9hNTVlIC9hNTVmIC9hNTYwIC9hNTYxIC9hNTYyIC9hNTYzIC9hNTY0IC9hNTY1IC9hNTY2IC9hNTY3IC9hNTY4IC9hNTY5IC9hNTZhIC9hNTZiIC9hNTZjIC9hNTZkIC9hNTZlIC9hNTZmIC9hNTcwIC9hNTcxIC9hNTcyIC9hNTczIC9hNTc0IC9hNTc1IC9hNTc2IC9hNTc3IC9hNTc4IC9hNTc5IC9hNTdhIC9hNTdiIC9hNTdjIC9hNTdkIC9hNTdlIC9hNTdmIC9hNTgwIC9hNTgxIC9hNTgyIC9hNTgzIC9hNTg0IC9hNTg1IC9hNTg2IC9hNTg3IC9hNTg4IC9hNTg5IC9hNThhIC9hNThiIC9hNThjIC9hNThkIC9hNThlIC9hNThmIC9hNTkwIC9hNTkxIC9hNTkyIC9hNTkzIC9hNTk0IC9hNTk1IC9hNTk2IC9hNTk3IC9hNTk4IC9hNTk5IC9hNTlhIC9hNTliIC9hNTljIC9hNTlkIC9hNTllIC9hNTlmIC9hNWEwIC9hNWExIC9hNWEyIC9hNWEzIC9hNWE0IC9hNWE1IC9hNWE2IC9hNWE3IC9hNWE4IC9hNWE5IC9hNWFhIC9hNWFiIC9hNWFjIC9hNWFkIC9hNWFlIC9hNWFmIC9hNWIwIC9hNWIxIC9hNWIyIC9hNWIzIC9hNWI0IC9hNWI1IC9hNWI2IC9hNWI3IC9hNWI4IC9hNWI5IC9hNWJhIC9hNWJiIC9hNWJjIC9hNWJkIC9hNWJlIC9hNWJmIC9hNWMwIC9hNWMxIC9hNWMyIC9hNWMzIC9hNWM0IC9hNWM1IC9hNWM2IC9hNWM3IC9hNWM4IC9hNWM5IC9hNWNhIC9hNWNiIC9hNWNjIC9hNWNkIC9hNWNlIC9hNWNmIC9hNWQwIC9hNWQxIC9hNWQyIC9hNWQzIC9hNWQ0IC9hNWQ1IC9hNWQ2IC9hNWQ3IC9hNWQ4IC9hNWQ5IC9hNWRhIC9hNWRiIC9hNWRjIC9hNWRkIC9hNWRlIC9hNWRmIC9hNWUwIC9hNWUxIC9hNWUyIC9hNWUzIC9hNWU0IC9hNWU1IC9hNWU2IC9hNWU3IC9hNWU4IC9hNWU5IC9hNWVhIC9hNWViIC9hNWVjIC9hNWVkIC9hNWVlIC9hNWVmIC9hNWYwIC9hNWYxIC9hNWYyIC9hNWYzIC9hNWY0IC9hNWY1IC9hNWY2IC9hNWY3IC9hNWY4IC9hNWY5IC9hNWZhIC9hNWZiIC9hNWZjIC9hNWZkIC9hNWZlIC9hNWZmIC9hNjAwIC9hNjAxIC9hNjAyIC9hNjAzIC9hNjA0IC9hNjA1IC9hNjA2IC9hNjA3IC9hNjA4IC9hNjA5IC9hNjBhIC9hNjBiIC9hNjBjIC9hNjBkIC9hNjBlIC9hNjBmIC9hNjEwIC9hNjExIC9hNjEyIC9hNjEzIC9hNjE0IC9hNjE1IC9hNjE2IC9hNjE3IC9hNjE4IC9hNjE5IC9hNjFhIC9hNjFiIC9hNjFjIC9hNjFkIC9hNjFlIC9hNjFmIC9hNjIwIC9hNjIxIC9hNjIyIC9hNjIzIC9hNjI0IC9hNjI1IC9hNjI2IC9hNjI3IC9hNjI4IC9hNjI5IC9hNjJhIC9hNjJiIC9hNjJjIC9hNjJkIC9hNjJlIC9hNjJmIC9hNjMwIC9hNjMxIC9hNjMyIC9hNjMzIC9hNjM0IC9hNjM1IC9hNjM2IC9hNjM3IC9hNjM4IC9hNjM5IC9hNjNhIC9hNjNiIC9hNjNjIC9hNjNkIC9hNjNlIC9hNjNmIC9hNjQwIC9hNjQxIC9hNjQyIC9hNjQzIC9hNjQ0IC9hNjQ1IC9hNjQ2IC9hNjQ3IC9hNjQ4IC9hNjQ5IC9hNjRhIC9hNjRiIC9hNjRjIC9hNjRkIC9hNjRlIC9hNjRmIC9hNjUwIC9hNjUxIC9hNjUyIC9hNjUzIC9hNjU0IC9hNjU1IC9hNjU2IC9hNjU3IC9hNjU4IC9hNjU5IC9hNjVhIC9hNjViIC9hNjVjIC9hNjVkIC9hNjVlIC9hNjVmIC9hNjYwIC9hNjYxIC9hNjYyIC9hNjYzIC9hNjY0IC9hNjY1IC9hNjY2IC9hNjY3IC9hNjY4IC9hNjY5IC9hNjZhIC9hNjZiIC9hNjZjIC9hNjZkIC9hNjZlIC9hNjZmIC9hNjcwIC9hNjcxIC9hNjcyIC9hNjczIC9hNjc0IC9hNjc1IC9hNjc2IC9hNjc3IC9hNjc4IC9hNjc5IC9hNjdhIC9hNjdiIC9hNjdjIC9hNjdkIC9hNjdlIC9hNjdmIC9hNjgwIC9hNjgxIC9hNjgyIC9hNjgzIC9hNjg0IC9hNjg1IC9hNjg2IC9hNjg3IC9hNjg4IC9hNjg5IC9hNjhhIC9hNjhiIC9hNjhjIC9hNjhkIC9hNjhlIC9hNjhmIC9hNjkwIC9hNjkxIC9hNjkyIC9hNjkzIC9hNjk0IC9hNjk1IC9hNjk2IC9hNjk3IC9hNjk4IC9hNjk5IC9hNjlhIC9hNjliIC9hNjljIC9hNjlkIC9hNjllIC9hNjlmIC9hNmEwIC9hNmExIC9hNmEyIC9hNmEzIC9hNmE0IC9hNmE1IC9hNmE2IC9hNmE3IC9hNmE4IC9hNmE5IC9hNmFhIC9hNmFiIC9hNmFjIC9hNmFkIC9hNmFlIC9hNmFmIC9hNmIwIC9hNmIxIC9hNmIyIC9hNmIzIC9hNmI0IC9hNmI1IC9hNmI2IC9hNmI3IC9hNmI4IC9hNmI5IC9hNmJhIC9hNmJiIC9hNmJjIC9hNmJkIC9hNmJlIC9hNmJmIC9hNmMwIC9hNmMxIC9hNmMyIC9hNmMzIC9hNmM0IC9hNmM1IC9hNmM2IC9hNmM3IC9hNmM4IC9hNmM5IC9hNmNhIC9hNmNiIC9hNmNjIC9hNmNkIC9hNmNlIC9hNmNmIC9hNmQwIC9hNmQxIC9hNmQyIC9hNmQzIC9hNmQ0IC9hNmQ1IC9hNmQ2IC9hNmQ3IC9hNmQ4IC9hNmQ5IC9hNmRhIC9hNmRiIC9hNmRjIC9hNmRkIC9hNmRlIC9hNmRmIC9hNmUwIC9hNmUxIC9hNmUyIC9hNmUzIC9hNmU0IC9hNmU1IC9hNmU2IC9hNmU3IC9hNmU4IC9hNmU5IC9hNmVhIC9hNmViIC9hNmVjIC9hNmVkIC9hNmVlIC9hNmVmIC9hNmYwIC9hNmYxIC9hNmYyIC9hNmYzIC9hNmY0IC9hNmY1IC9hNmY2IC9hNmY3IC9hNmY4IC9hNmY5IC9hNmZhIC9hNmZiIC9hNmZjIC9hNmZkIC9hNmZlIC9hNmZmIC9hNzAwIC9hNzAxIC9hNzAyIC9hNzAzIC9hNzA0IC9hNzA1IC9hNzA2IC9hNzA3IC9hNzA4IC9hNzA5IC9hNzBhIC9hNzBiIC9hNzBjIC9hNzBkIC9hNzBlIC9hNzBmIC9hNzEwIC9hNzExIC9hNzEyIC9hNzEzIC9hNzE0IC9hNzE1IC9hNzE2IC9hNzE3IC9hNzE4IC9hNzE5IC9hNzFhIC9hNzFiIC9hNzFjIC9hNzFkIC9hNzFlIC9hNzFmIC9hNzIwIC9hNzIxIC9hNzIyIC9hNzIzIC9hNzI0IC9hNzI1IC9hNzI2IC9hNzI3IC9hNzI4IC9hNzI5IC9hNzJhIC9hNzJiIC9hNzJjIC9hNzJkIC9hNzJlIC9hNzJmIC9hNzMwIC9hNzMxIC9hNzMyIC9hNzMzIC9hNzM0IC9hNzM1IC9hNzM2IC9hNzM3IC9hNzM4IC9hNzM5IC9hNzNhIC9hNzNiIC9hNzNjIC9hNzNkIC9hNzNlIC9hNzNmIC9hNzQwIC9hNzQxIC9hNzQyIC9hNzQzIC9hNzQ0IC9hNzQ1IC9hNzQ2IC9hNzQ3IC9hNzQ4IC9hNzQ5IC9hNzRhIC9hNzRiIC9hNzRjIC9hNzRkIC9hNzRlIC9hNzRmIC9hNzUwIC9hNzUxIC9hNzUyIC9hNzUzIC9hNzU0IC9hNzU1IC9hNzU2IC9hNzU3IC9hNzU4IC9hNzU5IC9hNzVhIC9hNzViIC9hNzVjIC9hNzVkIC9hNzVlIC9hNzVmIC9hNzYwIC9hNzYxIC9hNzYyIC9hNzYzIC9hNzY0IC9hNzY1IC9hNzY2IC9hNzY3IC9hNzY4IC9hNzY5IC9hNzZhIC9hNzZiIC9hNzZjIC9hNzZkIC9hNzZlIC9hNzZmIC9hNzcwIC9hNzcxIC9hNzcyIC9hNzczIC9hNzc0IC9hNzc1IC9hNzc2IC9hNzc3IC9hNzc4IC9hNzc5IC9hNzdhIC9hNzdiIC9hNzdjIC9hNzdkIC9hNzdlIC9hNzdmIC9hNzgwIC9hNzgxIC9hNzgyIC9hNzgzIC9hNzg0IC9hNzg1IC9hNzg2IC9hNzg3IC9hNzg4IC9hNzg5IC9hNzhhIC9hNzhiIC9hNzhjIC9hNzhkIC9hNzhlIC9hNzhmIC9hNzkwIC9hNzkxIC9hNzkyIC9hNzkzIC9hNzk0IC9hNzk1IC9hNzk2IC9hNzk3IC9hNzk4IC9hNzk5IC9hNzlhIC9hNzliIC9hNzljIC9hNzlkIC9hNzllIC9hNzlmIC9hN2EwIC9hN2ExIC9hN2EyIC9hN2EzIC9hN2E0IC9hN2E1IC9hN2E2IC9hN2E3IC9hN2E4IC9hN2E5IC9hN2FhIC9hN2FiIC9hN2FjIC9hN2FkIC9hN2FlIC9hN2FmIC9hN2IwIC9hN2IxIC9hN2IyIC9hN2IzIC9hN2I0IC9hN2I1IC9hN2I2IC9hN2I3IC9hN2I4IC9hN2I5IC9hN2JhIC9hN2JiIC9hN2JjIC9hN2JkIC9hN2JlIC9hN2JmIC9hN2MwIC9hN2MxIC9hN2MyIC9hN2MzIC9hN2M0IC9hN2M1IC9hN2M2IC9hN2M3IC9hN2M4IC9hN2M5IC9hN2NhIC9hN2NiIC9hN2NjIC9hN2NkIC9hN2NlIC9hN2NmCisvYTdkMCAvYTdkMSAvYTdkMiAvYTdkMyAvYTdkNCAvYTdkNSAvYTdkNiAvYTdkNyAvYTdkOCAvYTdkOSAvYTdkYSAvYTdkYiAvYTdkYyAvYTdkZCAvYTdkZSAvYTdkZiAvYTdlMCAvYTdlMSAvYTdlMiAvYTdlMyAvYTdlNCAvYTdlNSAvYTdlNiAvYTdlNyAvYTdlOCAvYTdlOSAvYTdlYSAvYTdlYiAvYTdlYyAvYTdlZCAvYTdlZSAvYTdlZiAvYTdmMCAvYTdmMSAvYTdmMiAvYTdmMyAvYTdmNCAvYTdmNSAvYTdmNiAvYTdmNyAvYTdmOCAvYTdmOSAvYTdmYSAvYTdmYiAvYTdmYyAvYTdmZCAvYTdmZSAvYTdmZiAvYTgwMCAvYTgwMSAvYTgwMiAvYTgwMyAvYTgwNCAvYTgwNSAvYTgwNiAvYTgwNyAvYTgwOCAvYTgwOSAvYTgwYSAvYTgwYiAvYTgwYyAvYTgwZCAvYTgwZSAvYTgwZiAvYTgxMCAvYTgxMSAvYTgxMiAvYTgxMyAvYTgxNCAvYTgxNSAvYTgxNiAvYTgxNyAvYTgxOCAvYTgxOSAvYTgxYSAvYTgxYiAvYTgxYyAvYTgxZCAvYTgxZSAvYTgxZiAvYTgyMCAvYTgyMSAvYTgyMiAvYTgyMyAvYTgyNCAvYTgyNSAvYTgyNiAvYTgyNyAvYTgyOCAvYTgyOSAvYTgyYSAvYTgyYiAvYTgyYyAvYTgyZCAvYTgyZSAvYTgyZiAvYTgzMCAvYTgzMSAvYTgzMiAvYTgzMyAvYTgzNCAvYTgzNSAvYTgzNiAvYTgzNyAvYTgzOCAvYTgzOSAvYTgzYSAvYTgzYiAvYTgzYyAvYTgzZCAvYTgzZSAvYTgzZiAvYTg0MCAvYTg0MSAvYTg0MiAvYTg0MyAvYTg0NCAvYTg0NSAvYTg0NiAvYTg0NyAvYTg0OCAvYTg0OSAvYTg0YSAvYTg0YiAvYTg0YyAvYTg0ZCAvYTg0ZSAvYTg0ZiAvYTg1MCAvYTg1MSAvYTg1MiAvYTg1MyAvYTg1NCAvYTg1NSAvYTg1NiAvYTg1NyAvYTg1OCAvYTg1OSAvYTg1YSAvYTg1YiAvYTg1YyAvYTg1ZCAvYTg1ZSAvYTg1ZiAvYTg2MCAvYTg2MSAvYTg2MiAvYTg2MyAvYTg2NCAvYTg2NSAvYTg2NiAvYTg2NyAvYTg2OCAvYTg2OSAvYTg2YSAvYTg2YiAvYTg2YyAvYTg2ZCAvYTg2ZSAvYTg2ZiAvYTg3MCAvYTg3MSAvYTg3MiAvYTg3MyAvYTg3NCAvYTg3NSAvYTg3NiAvYTg3NyAvYTg3OCAvYTg3OSAvYTg3YSAvYTg3YiAvYTg3YyAvYTg3ZCAvYTg3ZSAvYTg3ZiAvYTg4MCAvYTg4MSAvYTg4MiAvYTg4MyAvYTg4NCAvYTg4NSAvYTg4NiAvYTg4NyAvYTg4OCAvYTg4OSAvYTg4YSAvYTg4YiAvYTg4YyAvYTg4ZCAvYTg4ZSAvYTg4ZiAvYTg5MCAvYTg5MSAvYTg5MiAvYTg5MyAvYTg5NCAvYTg5NSAvYTg5NiAvYTg5NyAvYTg5OCAvYTg5OSAvYTg5YSAvYTg5YiAvYTg5YyAvYTg5ZCAvYTg5ZSAvYTg5ZiAvYThhMCAvYThhMSAvYThhMiAvYThhMyAvYThhNCAvYThhNSAvYThhNiAvYThhNyAvYThhOCAvYThhOSAvYThhYSAvYThhYiAvYThhYyAvYThhZCAvYThhZSAvYThhZiAvYThiMCAvYThiMSAvYThiMiAvYThiMyAvYThiNCAvYThiNSAvYThiNiAvYThiNyAvYThiOCAvYThiOSAvYThiYSAvYThiYiAvYThiYyAvYThiZCAvYThiZSAvYThiZiAvYThjMCAvYThjMSAvYThjMiAvYThjMyAvYThjNCAvYThjNSAvYThjNiAvYThjNyAvYThjOCAvYThjOSAvYThjYSAvYThjYiAvYThjYyAvYThjZCAvYThjZSAvYThjZiAvYThkMCAvYThkMSAvYThkMiAvYThkMyAvYThkNCAvYThkNSAvYThkNiAvYThkNyAvYThkOCAvYThkOSAvYThkYSAvYThkYiAvYThkYyAvYThkZCAvYThkZSAvYThkZiAvYThlMCAvYThlMSAvYThlMiAvYThlMyAvYThlNCAvYThlNSAvYThlNiAvYThlNyAvYThlOCAvYThlOSAvYThlYSAvYThlYiAvYThlYyAvYThlZCAvYThlZSAvYThlZiAvYThmMCAvYThmMSAvYThmMiAvYThmMyAvYThmNCAvYThmNSAvYThmNiAvYThmNyAvYThmOCAvYThmOSAvYThmYSAvYThmYiAvYThmYyAvYThmZCAvYThmZSAvYThmZiAvYTkwMCAvYTkwMSAvYTkwMiAvYTkwMyAvYTkwNCAvYTkwNSAvYTkwNiAvYTkwNyAvYTkwOCAvYTkwOSAvYTkwYSAvYTkwYiAvYTkwYyAvYTkwZCAvYTkwZSAvYTkwZiAvYTkxMCAvYTkxMSAvYTkxMiAvYTkxMyAvYTkxNCAvYTkxNSAvYTkxNiAvYTkxNyAvYTkxOCAvYTkxOSAvYTkxYSAvYTkxYiAvYTkxYyAvYTkxZCAvYTkxZSAvYTkxZiAvYTkyMCAvYTkyMSAvYTkyMiAvYTkyMyAvYTkyNCAvYTkyNSAvYTkyNiAvYTkyNyAvYTkyOCAvYTkyOSAvYTkyYSAvYTkyYiAvYTkyYyAvYTkyZCAvYTkyZSAvYTkyZiAvYTkzMCAvYTkzMSAvYTkzMiAvYTkzMyAvYTkzNCAvYTkzNSAvYTkzNiAvYTkzNyAvYTkzOCAvYTkzOSAvYTkzYSAvYTkzYiAvYTkzYyAvYTkzZCAvYTkzZSAvYTkzZiAvYTk0MCAvYTk0MSAvYTk0MiAvYTk0MyAvYTk0NCAvYTk0NSAvYTk0NiAvYTk0NyAvYTk0OCAvYTk0OSAvYTk0YSAvYTk0YiAvYTk0YyAvYTk0ZCAvYTk0ZSAvYTk0ZiAvYTk1MCAvYTk1MSAvYTk1MiAvYTk1MyAvYTk1NCAvYTk1NSAvYTk1NiAvYTk1NyAvYTk1OCAvYTk1OSAvYTk1YSAvYTk1YiAvYTk1YyAvYTk1ZCAvYTk1ZSAvYTk1ZiAvYTk2MCAvYTk2MSAvYTk2MiAvYTk2MyAvYTk2NCAvYTk2NSAvYTk2NiAvYTk2NyAvYTk2OCAvYTk2OSAvYTk2YSAvYTk2YiAvYTk2YyAvYTk2ZCAvYTk2ZSAvYTk2ZiAvYTk3MCAvYTk3MSAvYTk3MiAvYTk3MyAvYTk3NCAvYTk3NSAvYTk3NiAvYTk3NyAvYTk3OCAvYTk3OSAvYTk3YSAvYTk3YiAvYTk3YyAvYTk3ZCAvYTk3ZSAvYTk3ZiAvYTk4MCAvYTk4MSAvYTk4MiAvYTk4MyAvYTk4NCAvYTk4NSAvYTk4NiAvYTk4NyAvYTk4OCAvYTk4OSAvYTk4YSAvYTk4YiAvYTk4YyAvYTk4ZCAvYTk4ZSAvYTk4ZiAvYTk5MCAvYTk5MSAvYTk5MiAvYTk5MyAvYTk5NCAvYTk5NSAvYTk5NiAvYTk5NyAvYTk5OCAvYTk5OSAvYTk5YSAvYTk5YiAvYTk5YyAvYTk5ZCAvYTk5ZSAvYTk5ZiAvYTlhMCAvYTlhMSAvYTlhMiAvYTlhMyAvYTlhNCAvYTlhNSAvYTlhNiAvYTlhNyAvYTlhOCAvYTlhOSAvYTlhYSAvYTlhYiAvYTlhYyAvYTlhZCAvYTlhZSAvYTlhZiAvYTliMCAvYTliMSAvYTliMiAvYTliMyAvYTliNCAvYTliNSAvYTliNiAvYTliNyAvYTliOCAvYTliOSAvYTliYSAvYTliYiAvYTliYyAvYTliZCAvYTliZSAvYTliZiAvYTljMCAvYTljMSAvYTljMiAvYTljMyAvYTljNCAvYTljNSAvYTljNiAvYTljNyAvYTljOCAvYTljOSAvYTljYSAvYTljYiAvYTljYyAvYTljZCAvYTljZSAvYTljZiAvYTlkMCAvYTlkMSAvYTlkMiAvYTlkMyAvYTlkNCAvYTlkNSAvYTlkNiAvYTlkNyAvYTlkOCAvYTlkOSAvYTlkYSAvYTlkYiAvYTlkYyAvYTlkZCAvYTlkZSAvYTlkZiAvYTllMCAvYTllMSAvYTllMiAvYTllMyAvYTllNCAvYTllNSAvYTllNiAvYTllNyAvYTllOCAvYTllOSAvYTllYSAvYTllYiAvYTllYyAvYTllZCAvYTllZSAvYTllZiAvYTlmMCAvYTlmMSAvYTlmMiAvYTlmMyAvYTlmNCAvYTlmNSAvYTlmNiAvYTlmNyAvYTlmOCAvYTlmOSAvYTlmYSAvYTlmYiAvYTlmYyAvYTlmZCAvYTlmZSAvYTlmZiAvYWEwMCAvYWEwMSAvYWEwMiAvYWEwMyAvYWEwNCAvYWEwNSAvYWEwNiAvYWEwNyAvYWEwOCAvYWEwOSAvYWEwYSAvYWEwYiAvYWEwYyAvYWEwZCAvYWEwZSAvYWEwZiAvYWExMCAvYWExMSAvYWExMiAvYWExMyAvYWExNCAvYWExNSAvYWExNiAvYWExNyAvYWExOCAvYWExOSAvYWExYSAvYWExYiAvYWExYyAvYWExZCAvYWExZSAvYWExZiAvYWEyMCAvYWEyMSAvYWEyMiAvYWEyMyAvYWEyNCAvYWEyNSAvYWEyNiAvYWEyNyAvYWEyOCAvYWEyOSAvYWEyYSAvYWEyYiAvYWEyYyAvYWEyZCAvYWEyZSAvYWEyZiAvYWEzMCAvYWEzMSAvYWEzMiAvYWEzMyAvYWEzNCAvYWEzNSAvYWEzNiAvYWEzNyAvYWEzOCAvYWEzOSAvYWEzYSAvYWEzYiAvYWEzYyAvYWEzZCAvYWEzZSAvYWEzZiAvYWE0MCAvYWE0MSAvYWE0MiAvYWE0MyAvYWE0NCAvYWE0NSAvYWE0NiAvYWE0NyAvYWE0OCAvYWE0OSAvYWE0YSAvYWE0YiAvYWE0YyAvYWE0ZCAvYWE0ZSAvYWE0ZiAvYWE1MCAvYWE1MSAvYWE1MiAvYWE1MyAvYWE1NCAvYWE1NSAvYWE1NiAvYWE1NyAvYWE1OCAvYWE1OSAvYWE1YSAvYWE1YiAvYWE1YyAvYWE1ZCAvYWE1ZSAvYWE1ZiAvYWE2MCAvYWE2MSAvYWE2MiAvYWE2MyAvYWE2NCAvYWE2NSAvYWE2NiAvYWE2NyAvYWE2OCAvYWE2OSAvYWE2YSAvYWE2YiAvYWE2YyAvYWE2ZCAvYWE2ZSAvYWE2ZiAvYWE3MCAvYWE3MSAvYWE3MiAvYWE3MyAvYWE3NCAvYWE3NSAvYWE3NiAvYWE3NyAvYWE3OCAvYWE3OSAvYWE3YSAvYWE3YiAvYWE3YyAvYWE3ZCAvYWE3ZSAvYWE3ZiAvYWE4MCAvYWE4MSAvYWE4MiAvYWE4MyAvYWE4NCAvYWE4NSAvYWE4NiAvYWE4NyAvYWE4OCAvYWE4OSAvYWE4YSAvYWE4YiAvYWE4YyAvYWE4ZCAvYWE4ZSAvYWE4ZiAvYWE5MCAvYWE5MSAvYWE5MiAvYWE5MyAvYWE5NCAvYWE5NSAvYWE5NiAvYWE5NyAvYWE5OCAvYWE5OSAvYWE5YSAvYWE5YiAvYWE5YyAvYWE5ZCAvYWE5ZSAvYWE5ZiAvYWFhMCAvYWFhMSAvYWFhMiAvYWFhMyAvYWFhNCAvYWFhNSAvYWFhNiAvYWFhNyAvYWFhOCAvYWFhOSAvYWFhYSAvYWFhYiAvYWFhYyAvYWFhZCAvYWFhZSAvYWFhZiAvYWFiMCAvYWFiMSAvYWFiMiAvYWFiMyAvYWFiNCAvYWFiNSAvYWFiNiAvYWFiNyAvYWFiOCAvYWFiOSAvYWFiYSAvYWFiYiAvYWFiYyAvYWFiZCAvYWFiZSAvYWFiZiAvYWFjMCAvYWFjMSAvYWFjMiAvYWFjMyAvYWFjNCAvYWFjNSAvYWFjNiAvYWFjNyAvYWFjOCAvYWFjOSAvYWFjYSAvYWFjYiAvYWFjYyAvYWFjZCAvYWFjZSAvYWFjZiAvYWFkMCAvYWFkMSAvYWFkMiAvYWFkMyAvYWFkNCAvYWFkNSAvYWFkNiAvYWFkNyAvYWFkOCAvYWFkOSAvYWFkYSAvYWFkYiAvYWFkYyAvYWFkZCAvYWFkZSAvYWFkZiAvYWFlMCAvYWFlMSAvYWFlMiAvYWFlMyAvYWFlNCAvYWFlNSAvYWFlNiAvYWFlNyAvYWFlOCAvYWFlOSAvYWFlYSAvYWFlYiAvYWFlYyAvYWFlZCAvYWFlZSAvYWFlZiAvYWFmMCAvYWFmMSAvYWFmMiAvYWFmMyAvYWFmNCAvYWFmNSAvYWFmNiAvYWFmNyAvYWFmOCAvYWFmOSAvYWFmYSAvYWFmYiAvYWFmYyAvYWFmZCAvYWFmZSAvYWFmZiAvYWIwMCAvYWIwMSAvYWIwMiAvYWIwMyAvYWIwNCAvYWIwNSAvYWIwNiAvYWIwNyAvYWIwOCAvYWIwOSAvYWIwYSAvYWIwYiAvYWIwYyAvYWIwZCAvYWIwZSAvYWIwZiAvYWIxMCAvYWIxMSAvYWIxMiAvYWIxMyAvYWIxNCAvYWIxNSAvYWIxNiAvYWIxNyAvYWIxOCAvYWIxOSAvYWIxYSAvYWIxYiAvYWIxYyAvYWIxZCAvYWIxZSAvYWIxZiAvYWIyMCAvYWIyMSAvYWIyMiAvYWIyMyAvYWIyNCAvYWIyNSAvYWIyNiAvYWIyNyAvYWIyOCAvYWIyOSAvYWIyYSAvYWIyYiAvYWIyYyAvYWIyZCAvYWIyZSAvYWIyZiAvYWIzMCAvYWIzMSAvYWIzMiAvYWIzMyAvYWIzNCAvYWIzNSAvYWIzNiAvYWIzNyAvYWIzOCAvYWIzOSAvYWIzYSAvYWIzYiAvYWIzYyAvYWIzZCAvYWIzZSAvYWIzZiAvYWI0MCAvYWI0MSAvYWI0MiAvYWI0MyAvYWI0NCAvYWI0NSAvYWI0NiAvYWI0NyAvYWI0OCAvYWI0OSAvYWI0YSAvYWI0YiAvYWI0YyAvYWI0ZCAvYWI0ZSAvYWI0ZiAvYWI1MCAvYWI1MSAvYWI1MiAvYWI1MyAvYWI1NCAvYWI1NSAvYWI1NiAvYWI1NyAvYWI1OCAvYWI1OSAvYWI1YSAvYWI1YiAvYWI1YyAvYWI1ZCAvYWI1ZSAvYWI1ZiAvYWI2MCAvYWI2MSAvYWI2MiAvYWI2MyAvYWI2NCAvYWI2NSAvYWI2NiAvYWI2NyAvYWI2OCAvYWI2OSAvYWI2YSAvYWI2YiAvYWI2YyAvYWI2ZCAvYWI2ZSAvYWI2ZiAvYWI3MCAvYWI3MSAvYWI3MiAvYWI3MyAvYWI3NCAvYWI3NSAvYWI3NiAvYWI3NyAvYWI3OCAvYWI3OSAvYWI3YSAvYWI3YiAvYWI3YyAvYWI3ZCAvYWI3ZSAvYWI3ZiAvYWI4MCAvYWI4MSAvYWI4MiAvYWI4MyAvYWI4NCAvYWI4NSAvYWI4NiAvYWI4NyAvYWI4OCAvYWI4OSAvYWI4YSAvYWI4YiAvYWI4YyAvYWI4ZCAvYWI4ZSAvYWI4ZiAvYWI5MCAvYWI5MSAvYWI5MiAvYWI5MyAvYWI5NCAvYWI5NSAvYWI5NiAvYWI5NyAvYWI5OCAvYWI5OSAvYWI5YSAvYWI5YiAvYWI5YyAvYWI5ZCAvYWI5ZSAvYWI5ZiAvYWJhMCAvYWJhMSAvYWJhMiAvYWJhMyAvYWJhNCAvYWJhNSAvYWJhNiAvYWJhNyAvYWJhOCAvYWJhOSAvYWJhYSAvYWJhYiAvYWJhYyAvYWJhZCAvYWJhZSAvYWJhZiAvYWJiMCAvYWJiMSAvYWJiMiAvYWJiMyAvYWJiNCAvYWJiNSAvYWJiNiAvYWJiNworL2FiYjggL2FiYjkgL2FiYmEgL2FiYmIgL2FiYmMgL2FiYmQgL2FiYmUgL2FiYmYgL2FiYzAgL2FiYzEgL2FiYzIgL2FiYzMgL2FiYzQgL2FiYzUgL2FiYzYgL2FiYzcgL2FiYzggL2FiYzkgL2FiY2EgL2FiY2IgL2FiY2MgL2FiY2QgL2FiY2UgL2FiY2YgL2FiZDAgL2FiZDEgL2FiZDIgL2FiZDMgL2FiZDQgL2FiZDUgL2FiZDYgL2FiZDcgL2FiZDggL2FiZDkgL2FiZGEgL2FiZGIgL2FiZGMgL2FiZGQgL2FiZGUgL2FiZGYgL2FiZTAgL2FiZTEgL2FiZTIgL2FiZTMgL2FiZTQgL2FiZTUgL2FiZTYgL2FiZTcgL2FiZTggL2FiZTkgL2FiZWEgL2FiZWIgL2FiZWMgL2FiZWQgL2FiZWUgL2FiZWYgL2FiZjAgL2FiZjEgL2FiZjIgL2FiZjMgL2FiZjQgL2FiZjUgL2FiZjYgL2FiZjcgL2FiZjggL2FiZjkgL2FiZmEgL2FiZmIgL2FiZmMgL2FiZmQgL2FiZmUgL2FiZmYgL2FjMDAgL2FjMDEgL2FjMDIgL2FjMDMgL2FjMDQgL2FjMDUgL2FjMDYgL2FjMDcgL2FjMDggL2FjMDkgL2FjMGEgL2FjMGIgL2FjMGMgL2FjMGQgL2FjMGUgL2FjMGYgL2FjMTAgL2FjMTEgL2FjMTIgL2FjMTMgL2FjMTQgL2FjMTUgL2FjMTYgL2FjMTcgL2FjMTggL2FjMTkgL2FjMWEgL2FjMWIgL2FjMWMgL2FjMWQgL2FjMWUgL2FjMWYgL2FjMjAgL2FjMjEgL2FjMjIgL2FjMjMgL2FjMjQgL2FjMjUgL2FjMjYgL2FjMjcgL2FjMjggL2FjMjkgL2FjMmEgL2FjMmIgL2FjMmMgL2FjMmQgL2FjMmUgL2FjMmYgL2FjMzAgL2FjMzEgL2FjMzIgL2FjMzMgL2FjMzQgL2FjMzUgL2FjMzYgL2FjMzcgL2FjMzggL2FjMzkgL2FjM2EgL2FjM2IgL2FjM2MgL2FjM2QgL2FjM2UgL2FjM2YgL2FjNDAgL2FjNDEgL2FjNDIgL2FjNDMgL2FjNDQgL2FjNDUgL2FjNDYgL2FjNDcgL2FjNDggL2FjNDkgL2FjNGEgL2FjNGIgL2FjNGMgL2FjNGQgL2FjNGUgL2FjNGYgL2FjNTAgL2FjNTEgL2FjNTIgL2FjNTMgL2FjNTQgL2FjNTUgL2FjNTYgL2FjNTcgL2FjNTggL2FjNTkgL2FjNWEgL2FjNWIgL2FjNWMgL2FjNWQgL2FjNWUgL2FjNWYgL2FjNjAgL2FjNjEgL2FjNjIgL2FjNjMgL2FjNjQgL2FjNjUgL2FjNjYgL2FjNjcgL2FjNjggL2FjNjkgL2FjNmEgL2FjNmIgL2FjNmMgL2FjNmQgL2FjNmUgL2FjNmYgL2FjNzAgL2FjNzEgL2FjNzIgL2FjNzMgL2FjNzQgL2FjNzUgL2FjNzYgL2FjNzcgL2FjNzggL2FjNzkgL2FjN2EgL2FjN2IgL2FjN2MgL2FjN2QgL2FjN2UgL2FjN2YgL2FjODAgL2FjODEgL2FjODIgL2FjODMgL2FjODQgL2FjODUgL2FjODYgL2FjODcgL2FjODggL2FjODkgL2FjOGEgL2FjOGIgL2FjOGMgL2FjOGQgL2FjOGUgL2FjOGYgL2FjOTAgL2FjOTEgL2FjOTIgL2FjOTMgL2FjOTQgL2FjOTUgL2FjOTYgL2FjOTcgL2FjOTggL2FjOTkgL2FjOWEgL2FjOWIgL2FjOWMgL2FjOWQgL2FjOWUgL2FjOWYgL2FjYTAgL2FjYTEgL2FjYTIgL2FjYTMgL2FjYTQgL2FjYTUgL2FjYTYgL2FjYTcgL2FjYTggL2FjYTkgL2FjYWEgL2FjYWIgL2FjYWMgL2FjYWQgL2FjYWUgL2FjYWYgL2FjYjAgL2FjYjEgL2FjYjIgL2FjYjMgL2FjYjQgL2FjYjUgL2FjYjYgL2FjYjcgL2FjYjggL2FjYjkgL2FjYmEgL2FjYmIgL2FjYmMgL2FjYmQgL2FjYmUgL2FjYmYgL2FjYzAgL2FjYzEgL2FjYzIgL2FjYzMgL2FjYzQgL2FjYzUgL2FjYzYgL2FjYzcgL2FjYzggL2FjYzkgL2FjY2EgL2FjY2IgL2FjY2MKK10gICAgL0RldmljZVJHQiAxMCAwIFJdCisgIC9CaXRzUGVyQ29tcG9uZW50IDE2CisgIC9GaWx0ZXIgWy9BU0NJSUhleERlY29kZSAvRmxhdGVEZWNvZGUgL1J1bkxlbmd0aERlY29kZV0KKz4+CitzdHJlYW0KKzc4OWNlY2MxMDEwMTAwMDAwMDgwOTBlZDNkZWYwODBhMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgwZGI4MzAzMDIwMDAwMDAwMDIxZmY1ZjM3MjQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDljMDVkZmYyYzdhZQorZW5kc3RyZWFtCitlbmRvYmoKKwore3tvYmplY3QgMTAgMH19Cis8PAorICAvRnVuY3Rpb25UeXBlIDIKKyAgL0RvbWFpbiBbMC4wIDEuMCAwLjAgMS4wXQorICAvQzAgWzAuMCAwLjBdCisgIC9DMSBbMS4wIDEuMF0KKyAgL04gMQorPj4KK2VuZG9iagorCit7e3hyZWZ9fQordHJhaWxlciA8PAorICAvUm9vdCAxIDAgUgorICAvU2l6ZSAxMQorPj4KK3t7c3RhcnR4cmVmfX0KKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9idWdfNTU1Nzg0LnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z181NTU3ODQucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNTZhOTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfNTU1Nzg0LnBkZgpAQCAtMCwwICsxLDg4IEBACislUERGLTEuNworJaDypPQKKworMSAwIG9iagorPDwKKyAgL1BhZ2VzIDIgMCBSCis+PgorZW5kb2JqCisKKzIgMCBvYmoKKzw8CisgIC9LaWRzIFsgMyAwIFIgXQorPj4KK2VuZG9iagorCiszIDAgb2JqCis8PAorICAvQ29udGVudHMgNiAwIFIKKyAgL1Jlc291cmNlcyA1IDAgUgorPj4KK2VuZG9iagorCis2IDAgb2JqCis8PD4+CitzdHJlYW0KKzQxNzggMC4wIDAuMCAxIDAgMCBjbQorL1hCYWQgRG8KK2VuZHN0cmVhbQorZW5kb2JqCisKKzUgMCBvYmoKKzw8CisgIC9YT2JqZWN0IDw8CisgICAgL1hCYWQgNyAwIFIKKyAgPj4KKz4+CitlbmRvYmoKKworNyAwIG9iagorPDwKKyAgL1R5cGUgL1hPYmplY3QKKyAgL1N1YnR5cGUgL0ltYWdlCisgIC9XaWR0aCA4MTkxNQorICAvSGVpZ2h0IDEKKyAgL0NvbG9yU3BhY2UgWy9EZXZpY2VOIFsKKy9hMCAvYTEgL2EyIC9hMyAvYTQgL2E1IC9hNiAvYTcgL2E4IC9hOSAvYWEgL2FiIC9hYyAvYWQgL2FlIC9hZiAvYTEwIC9hMTEgL2ExMiAvYTEzIC9hMTQgL2ExNSAvYTE2IC9hMTcgL2ExOCAvYTE5IC9hMWEgL2ExYiAvYTFjIC9hMWQgL2ExZSAvYTFmIC9hMjAgL2EyMSAvYTIyIC9hMjMgL2EyNCAvYTI1IC9hMjYgL2EyNyAvYTI4IC9hMjkgL2EyYSAvYTJiIC9hMmMgL2EyZCAvYTJlIC9hMmYgL2EzMCAvYTMxIC9hMzIgL2EzMyAvYTM0IC9hMzUgL2EzNiAvYTM3IC9hMzggL2EzOSAvYTNhIC9hM2IgL2EzYyAvYTNkIC9hM2UgL2EzZiAvYTQwIC9hNDEgL2E0MiAvYTQzIC9hNDQgL2E0NSAvYTQ2IC9hNDcgL2E0OCAvYTQ5IC9hNGEgL2E0YiAvYTRjIC9hNGQgL2E0ZSAvYTRmIC9hNTAgL2E1MSAvYTUyIC9hNTMgL2E1NCAvYTU1IC9hNTYgL2E1NyAvYTU4IC9hNTkgL2E1YSAvYTViIC9hNWMgL2E1ZCAvYTVlIC9hNWYgL2E2MCAvYTYxIC9hNjIgL2E2MyAvYTY0IC9hNjUgL2E2NiAvYTY3IC9hNjggL2E2OSAvYTZhIC9hNmIgL2E2YyAvYTZkIC9hNmUgL2E2ZiAvYTcwIC9hNzEgL2E3MiAvYTczIC9hNzQgL2E3NSAvYTc2IC9hNzcgL2E3OCAvYTc5IC9hN2EgL2E3YiAvYTdjIC9hN2QgL2E3ZSAvYTdmIC9hODAgL2E4MSAvYTgyIC9hODMgL2E4NCAvYTg1IC9hODYgL2E4NyAvYTg4IC9hODkgL2E4YSAvYThiIC9hOGMgL2E4ZCAvYThlIC9hOGYgL2E5MCAvYTkxIC9hOTIgL2E5MyAvYTk0IC9hOTUgL2E5NiAvYTk3IC9hOTggL2E5OSAvYTlhIC9hOWIgL2E5YyAvYTlkIC9hOWUgL2E5ZiAvYWEwIC9hYTEgL2FhMiAvYWEzIC9hYTQgL2FhNSAvYWE2IC9hYTcgL2FhOCAvYWE5IC9hYWEgL2FhYiAvYWFjIC9hYWQgL2FhZSAvYWFmIC9hYjAgL2FiMSAvYWIyIC9hYjMgL2FiNCAvYWI1IC9hYjYgL2FiNyAvYWI4IC9hYjkgL2FiYSAvYWJiIC9hYmMgL2FiZCAvYWJlIC9hYmYgL2FjMCAvYWMxIC9hYzIgL2FjMyAvYWM0IC9hYzUgL2FjNiAvYWM3IC9hYzggL2FjOSAvYWNhIC9hY2IgL2FjYyAvYWNkIC9hY2UgL2FjZiAvYWQwIC9hZDEgL2FkMiAvYWQzIC9hZDQgL2FkNSAvYWQ2IC9hZDcgL2FkOCAvYWQ5IC9hZGEgL2FkYiAvYWRjIC9hZGQgL2FkZSAvYWRmIC9hZTAgL2FlMSAvYWUyIC9hZTMgL2FlNCAvYWU1IC9hZTYgL2FlNyAvYWU4IC9hZTkgL2FlYSAvYWViIC9hZWMgL2FlZCAvYWVlIC9hZWYgL2FmMCAvYWYxIC9hZjIgL2FmMyAvYWY0IC9hZjUgL2FmNiAvYWY3IC9hZjggL2FmOSAvYWZhIC9hZmIgL2FmYyAvYWZkIC9hZmUgL2FmZiAvYTEwMCAvYTEwMSAvYTEwMiAvYTEwMyAvYTEwNCAvYTEwNSAvYTEwNiAvYTEwNyAvYTEwOCAvYTEwOSAvYTEwYSAvYTEwYiAvYTEwYyAvYTEwZCAvYTEwZSAvYTEwZiAvYTExMCAvYTExMSAvYTExMiAvYTExMyAvYTExNCAvYTExNSAvYTExNiAvYTExNyAvYTExOCAvYTExOSAvYTExYSAvYTExYiAvYTExYyAvYTExZCAvYTExZSAvYTExZiAvYTEyMCAvYTEyMSAvYTEyMiAvYTEyMyAvYTEyNCAvYTEyNSAvYTEyNiAvYTEyNyAvYTEyOCAvYTEyOSAvYTEyYSAvYTEyYiAvYTEyYyAvYTEyZCAvYTEyZSAvYTEyZiAvYTEzMCAvYTEzMSAvYTEzMiAvYTEzMyAvYTEzNCAvYTEzNSAvYTEzNiAvYTEzNyAvYTEzOCAvYTEzOSAvYTEzYSAvYTEzYiAvYTEzYyAvYTEzZCAvYTEzZSAvYTEzZiAvYTE0MCAvYTE0MSAvYTE0MiAvYTE0MyAvYTE0NCAvYTE0NSAvYTE0NiAvYTE0NyAvYTE0OCAvYTE0OSAvYTE0YSAvYTE0YiAvYTE0YyAvYTE0ZCAvYTE0ZSAvYTE0ZiAvYTE1MCAvYTE1MSAvYTE1MiAvYTE1MyAvYTE1NCAvYTE1NSAvYTE1NiAvYTE1NyAvYTE1OCAvYTE1OSAvYTE1YSAvYTE1YiAvYTE1YyAvYTE1ZCAvYTE1ZSAvYTE1ZiAvYTE2MCAvYTE2MSAvYTE2MiAvYTE2MyAvYTE2NCAvYTE2NSAvYTE2NiAvYTE2NyAvYTE2OCAvYTE2OSAvYTE2YSAvYTE2YiAvYTE2YyAvYTE2ZCAvYTE2ZSAvYTE2ZiAvYTE3MCAvYTE3MSAvYTE3MiAvYTE3MyAvYTE3NCAvYTE3NSAvYTE3NiAvYTE3NyAvYTE3OCAvYTE3OSAvYTE3YSAvYTE3YiAvYTE3YyAvYTE3ZCAvYTE3ZSAvYTE3ZiAvYTE4MCAvYTE4MSAvYTE4MiAvYTE4MyAvYTE4NCAvYTE4NSAvYTE4NiAvYTE4NyAvYTE4OCAvYTE4OSAvYTE4YSAvYTE4YiAvYTE4YyAvYTE4ZCAvYTE4ZSAvYTE4ZiAvYTE5MCAvYTE5MSAvYTE5MiAvYTE5MyAvYTE5NCAvYTE5NSAvYTE5NiAvYTE5NyAvYTE5OCAvYTE5OSAvYTE5YSAvYTE5YiAvYTE5YyAvYTE5ZCAvYTE5ZSAvYTE5ZiAvYTFhMCAvYTFhMSAvYTFhMiAvYTFhMyAvYTFhNCAvYTFhNSAvYTFhNiAvYTFhNyAvYTFhOCAvYTFhOSAvYTFhYSAvYTFhYiAvYTFhYyAvYTFhZCAvYTFhZSAvYTFhZiAvYTFiMCAvYTFiMSAvYTFiMiAvYTFiMyAvYTFiNCAvYTFiNSAvYTFiNiAvYTFiNyAvYTFiOCAvYTFiOSAvYTFiYSAvYTFiYiAvYTFiYyAvYTFiZCAvYTFiZSAvYTFiZiAvYTFjMCAvYTFjMSAvYTFjMiAvYTFjMyAvYTFjNCAvYTFjNSAvYTFjNiAvYTFjNyAvYTFjOCAvYTFjOSAvYTFjYSAvYTFjYiAvYTFjYyAvYTFjZCAvYTFjZSAvYTFjZiAvYTFkMCAvYTFkMSAvYTFkMiAvYTFkMyAvYTFkNCAvYTFkNSAvYTFkNiAvYTFkNyAvYTFkOCAvYTFkOSAvYTFkYSAvYTFkYiAvYTFkYyAvYTFkZCAvYTFkZSAvYTFkZiAvYTFlMCAvYTFlMSAvYTFlMiAvYTFlMyAvYTFlNCAvYTFlNSAvYTFlNiAvYTFlNyAvYTFlOCAvYTFlOSAvYTFlYSAvYTFlYiAvYTFlYyAvYTFlZCAvYTFlZSAvYTFlZiAvYTFmMCAvYTFmMSAvYTFmMiAvYTFmMyAvYTFmNCAvYTFmNSAvYTFmNiAvYTFmNyAvYTFmOCAvYTFmOSAvYTFmYSAvYTFmYiAvYTFmYyAvYTFmZCAvYTFmZSAvYTFmZiAvYTIwMCAvYTIwMSAvYTIwMiAvYTIwMyAvYTIwNCAvYTIwNSAvYTIwNiAvYTIwNyAvYTIwOCAvYTIwOSAvYTIwYSAvYTIwYiAvYTIwYyAvYTIwZCAvYTIwZSAvYTIwZiAvYTIxMCAvYTIxMSAvYTIxMiAvYTIxMyAvYTIxNCAvYTIxNSAvYTIxNiAvYTIxNyAvYTIxOCAvYTIxOSAvYTIxYSAvYTIxYiAvYTIxYyAvYTIxZCAvYTIxZSAvYTIxZiAvYTIyMCAvYTIyMSAvYTIyMiAvYTIyMyAvYTIyNCAvYTIyNSAvYTIyNiAvYTIyNyAvYTIyOCAvYTIyOSAvYTIyYSAvYTIyYiAvYTIyYyAvYTIyZCAvYTIyZSAvYTIyZiAvYTIzMCAvYTIzMSAvYTIzMiAvYTIzMyAvYTIzNCAvYTIzNSAvYTIzNiAvYTIzNyAvYTIzOCAvYTIzOSAvYTIzYSAvYTIzYiAvYTIzYyAvYTIzZCAvYTIzZSAvYTIzZiAvYTI0MCAvYTI0MSAvYTI0MiAvYTI0MyAvYTI0NCAvYTI0NSAvYTI0NiAvYTI0NyAvYTI0OCAvYTI0OSAvYTI0YSAvYTI0YiAvYTI0YyAvYTI0ZCAvYTI0ZSAvYTI0ZiAvYTI1MCAvYTI1MSAvYTI1MiAvYTI1MyAvYTI1NCAvYTI1NSAvYTI1NiAvYTI1NyAvYTI1OCAvYTI1OSAvYTI1YSAvYTI1YiAvYTI1YyAvYTI1ZCAvYTI1ZSAvYTI1ZiAvYTI2MCAvYTI2MSAvYTI2MiAvYTI2MyAvYTI2NCAvYTI2NSAvYTI2NiAvYTI2NyAvYTI2OCAvYTI2OSAvYTI2YSAvYTI2YiAvYTI2YyAvYTI2ZCAvYTI2ZSAvYTI2ZiAvYTI3MCAvYTI3MSAvYTI3MiAvYTI3MyAvYTI3NCAvYTI3NSAvYTI3NiAvYTI3NyAvYTI3OCAvYTI3OSAvYTI3YSAvYTI3YiAvYTI3YyAvYTI3ZCAvYTI3ZSAvYTI3ZiAvYTI4MCAvYTI4MSAvYTI4MiAvYTI4MyAvYTI4NCAvYTI4NSAvYTI4NiAvYTI4NyAvYTI4OCAvYTI4OSAvYTI4YSAvYTI4YiAvYTI4YyAvYTI4ZCAvYTI4ZSAvYTI4ZiAvYTI5MCAvYTI5MSAvYTI5MiAvYTI5MyAvYTI5NCAvYTI5NSAvYTI5NiAvYTI5NyAvYTI5OCAvYTI5OSAvYTI5YSAvYTI5YiAvYTI5YyAvYTI5ZCAvYTI5ZSAvYTI5ZiAvYTJhMCAvYTJhMSAvYTJhMiAvYTJhMyAvYTJhNCAvYTJhNSAvYTJhNiAvYTJhNyAvYTJhOCAvYTJhOSAvYTJhYSAvYTJhYiAvYTJhYyAvYTJhZCAvYTJhZSAvYTJhZiAvYTJiMCAvYTJiMSAvYTJiMiAvYTJiMyAvYTJiNCAvYTJiNSAvYTJiNiAvYTJiNyAvYTJiOCAvYTJiOSAvYTJiYSAvYTJiYiAvYTJiYyAvYTJiZCAvYTJiZSAvYTJiZiAvYTJjMCAvYTJjMSAvYTJjMiAvYTJjMyAvYTJjNCAvYTJjNSAvYTJjNiAvYTJjNyAvYTJjOCAvYTJjOSAvYTJjYSAvYTJjYiAvYTJjYyAvYTJjZCAvYTJjZSAvYTJjZiAvYTJkMCAvYTJkMSAvYTJkMiAvYTJkMyAvYTJkNCAvYTJkNSAvYTJkNiAvYTJkNyAvYTJkOCAvYTJkOSAvYTJkYSAvYTJkYiAvYTJkYyAvYTJkZCAvYTJkZSAvYTJkZiAvYTJlMCAvYTJlMSAvYTJlMiAvYTJlMyAvYTJlNCAvYTJlNSAvYTJlNiAvYTJlNyAvYTJlOCAvYTJlOSAvYTJlYSAvYTJlYiAvYTJlYyAvYTJlZCAvYTJlZSAvYTJlZiAvYTJmMCAvYTJmMSAvYTJmMiAvYTJmMyAvYTJmNCAvYTJmNSAvYTJmNiAvYTJmNyAvYTJmOCAvYTJmOSAvYTJmYSAvYTJmYiAvYTJmYyAvYTJmZCAvYTJmZSAvYTJmZiAvYTMwMCAvYTMwMSAvYTMwMiAvYTMwMyAvYTMwNCAvYTMwNSAvYTMwNiAvYTMwNyAvYTMwOCAvYTMwOSAvYTMwYSAvYTMwYiAvYTMwYyAvYTMwZCAvYTMwZSAvYTMwZiAvYTMxMCAvYTMxMSAvYTMxMiAvYTMxMyAvYTMxNCAvYTMxNSAvYTMxNiAvYTMxNyAvYTMxOCAvYTMxOSAvYTMxYSAvYTMxYiAvYTMxYyAvYTMxZCAvYTMxZSAvYTMxZiAvYTMyMCAvYTMyMSAvYTMyMiAvYTMyMyAvYTMyNCAvYTMyNSAvYTMyNiAvYTMyNyAvYTMyOCAvYTMyOSAvYTMyYSAvYTMyYiAvYTMyYyAvYTMyZCAvYTMyZSAvYTMyZiAvYTMzMCAvYTMzMSAvYTMzMiAvYTMzMyAvYTMzNCAvYTMzNSAvYTMzNiAvYTMzNyAvYTMzOCAvYTMzOSAvYTMzYSAvYTMzYiAvYTMzYyAvYTMzZCAvYTMzZSAvYTMzZiAvYTM0MCAvYTM0MSAvYTM0MiAvYTM0MyAvYTM0NCAvYTM0NSAvYTM0NiAvYTM0NyAvYTM0OCAvYTM0OSAvYTM0YSAvYTM0YiAvYTM0YyAvYTM0ZCAvYTM0ZSAvYTM0ZiAvYTM1MCAvYTM1MSAvYTM1MiAvYTM1MyAvYTM1NCAvYTM1NSAvYTM1NiAvYTM1NyAvYTM1OCAvYTM1OSAvYTM1YSAvYTM1YiAvYTM1YyAvYTM1ZCAvYTM1ZSAvYTM1ZiAvYTM2MCAvYTM2MSAvYTM2MiAvYTM2MyAvYTM2NCAvYTM2NSAvYTM2NiAvYTM2NyAvYTM2OCAvYTM2OSAvYTM2YSAvYTM2YiAvYTM2YyAvYTM2ZCAvYTM2ZSAvYTM2ZiAvYTM3MCAvYTM3MSAvYTM3MiAvYTM3MyAvYTM3NCAvYTM3NSAvYTM3NiAvYTM3NyAvYTM3OCAvYTM3OSAvYTM3YSAvYTM3YiAvYTM3YyAvYTM3ZCAvYTM3ZSAvYTM3ZiAvYTM4MCAvYTM4MSAvYTM4MiAvYTM4MyAvYTM4NCAvYTM4NSAvYTM4NiAvYTM4NyAvYTM4OCAvYTM4OSAvYTM4YSAvYTM4YiAvYTM4YyAvYTM4ZCAvYTM4ZSAvYTM4ZiAvYTM5MCAvYTM5MSAvYTM5MiAvYTM5MyAvYTM5NCAvYTM5NSAvYTM5NiAvYTM5NyAvYTM5OCAvYTM5OSAvYTM5YSAvYTM5YiAvYTM5YyAvYTM5ZCAvYTM5ZSAvYTM5ZiAvYTNhMCAvYTNhMSAvYTNhMiAvYTNhMyAvYTNhNCAvYTNhNSAvYTNhNiAvYTNhNyAvYTNhOCAvYTNhOSAvYTNhYSAvYTNhYiAvYTNhYyAvYTNhZCAvYTNhZSAvYTNhZiAvYTNiMCAvYTNiMSAvYTNiMiAvYTNiMyAvYTNiNCAvYTNiNSAvYTNiNiAvYTNiNyAvYTNiOCAvYTNiOSAvYTNiYSAvYTNiYiAvYTNiYyAvYTNiZCAvYTNiZSAvYTNiZiAvYTNjMCAvYTNjMSAvYTNjMiAvYTNjMyAvYTNjNCAvYTNjNSAvYTNjNiAvYTNjNyAvYTNjOCAvYTNjOSAvYTNjYSAvYTNjYiAvYTNjYyAvYTNjZCAvYTNjZSAvYTNjZiAvYTNkMCAvYTNkMSAvYTNkMiAvYTNkMyAvYTNkNCAvYTNkNSAvYTNkNiAvYTNkNyAvYTNkOCAvYTNkOSAvYTNkYSAvYTNkYiAvYTNkYyAvYTNkZCAvYTNkZSAvYTNkZiAvYTNlMCAvYTNlMSAvYTNlMiAvYTNlMyAvYTNlNCAvYTNlNSAvYTNlNiAvYTNlNworL2EzZTggL2EzZTkgL2EzZWEgL2EzZWIgL2EzZWMgL2EzZWQgL2EzZWUgL2EzZWYgL2EzZjAgL2EzZjEgL2EzZjIgL2EzZjMgL2EzZjQgL2EzZjUgL2EzZjYgL2EzZjcgL2EzZjggL2EzZjkgL2EzZmEgL2EzZmIgL2EzZmMgL2EzZmQgL2EzZmUgL2EzZmYgL2E0MDAgL2E0MDEgL2E0MDIgL2E0MDMgL2E0MDQgL2E0MDUgL2E0MDYgL2E0MDcgL2E0MDggL2E0MDkgL2E0MGEgL2E0MGIgL2E0MGMgL2E0MGQgL2E0MGUgL2E0MGYgL2E0MTAgL2E0MTEgL2E0MTIgL2E0MTMgL2E0MTQgL2E0MTUgL2E0MTYgL2E0MTcgL2E0MTggL2E0MTkgL2E0MWEgL2E0MWIgL2E0MWMgL2E0MWQgL2E0MWUgL2E0MWYgL2E0MjAgL2E0MjEgL2E0MjIgL2E0MjMgL2E0MjQgL2E0MjUgL2E0MjYgL2E0MjcgL2E0MjggL2E0MjkgL2E0MmEgL2E0MmIgL2E0MmMgL2E0MmQgL2E0MmUgL2E0MmYgL2E0MzAgL2E0MzEgL2E0MzIgL2E0MzMgL2E0MzQgL2E0MzUgL2E0MzYgL2E0MzcgL2E0MzggL2E0MzkgL2E0M2EgL2E0M2IgL2E0M2MgL2E0M2QgL2E0M2UgL2E0M2YgL2E0NDAgL2E0NDEgL2E0NDIgL2E0NDMgL2E0NDQgL2E0NDUgL2E0NDYgL2E0NDcgL2E0NDggL2E0NDkgL2E0NGEgL2E0NGIgL2E0NGMgL2E0NGQgL2E0NGUgL2E0NGYgL2E0NTAgL2E0NTEgL2E0NTIgL2E0NTMgL2E0NTQgL2E0NTUgL2E0NTYgL2E0NTcgL2E0NTggL2E0NTkgL2E0NWEgL2E0NWIgL2E0NWMgL2E0NWQgL2E0NWUgL2E0NWYgL2E0NjAgL2E0NjEgL2E0NjIgL2E0NjMgL2E0NjQgL2E0NjUgL2E0NjYgL2E0NjcgL2E0NjggL2E0NjkgL2E0NmEgL2E0NmIgL2E0NmMgL2E0NmQgL2E0NmUgL2E0NmYgL2E0NzAgL2E0NzEgL2E0NzIgL2E0NzMgL2E0NzQgL2E0NzUgL2E0NzYgL2E0NzcgL2E0NzggL2E0NzkgL2E0N2EgL2E0N2IgL2E0N2MgL2E0N2QgL2E0N2UgL2E0N2YgL2E0ODAgL2E0ODEgL2E0ODIgL2E0ODMgL2E0ODQgL2E0ODUgL2E0ODYgL2E0ODcgL2E0ODggL2E0ODkgL2E0OGEgL2E0OGIgL2E0OGMgL2E0OGQgL2E0OGUgL2E0OGYgL2E0OTAgL2E0OTEgL2E0OTIgL2E0OTMgL2E0OTQgL2E0OTUgL2E0OTYgL2E0OTcgL2E0OTggL2E0OTkgL2E0OWEgL2E0OWIgL2E0OWMgL2E0OWQgL2E0OWUgL2E0OWYgL2E0YTAgL2E0YTEgL2E0YTIgL2E0YTMgL2E0YTQgL2E0YTUgL2E0YTYgL2E0YTcgL2E0YTggL2E0YTkgL2E0YWEgL2E0YWIgL2E0YWMgL2E0YWQgL2E0YWUgL2E0YWYgL2E0YjAgL2E0YjEgL2E0YjIgL2E0YjMgL2E0YjQgL2E0YjUgL2E0YjYgL2E0YjcgL2E0YjggL2E0YjkgL2E0YmEgL2E0YmIgL2E0YmMgL2E0YmQgL2E0YmUgL2E0YmYgL2E0YzAgL2E0YzEgL2E0YzIgL2E0YzMgL2E0YzQgL2E0YzUgL2E0YzYgL2E0YzcgL2E0YzggL2E0YzkgL2E0Y2EgL2E0Y2IgL2E0Y2MgL2E0Y2QgL2E0Y2UgL2E0Y2YgL2E0ZDAgL2E0ZDEgL2E0ZDIgL2E0ZDMgL2E0ZDQgL2E0ZDUgL2E0ZDYgL2E0ZDcgL2E0ZDggL2E0ZDkgL2E0ZGEgL2E0ZGIgL2E0ZGMgL2E0ZGQgL2E0ZGUgL2E0ZGYgL2E0ZTAgL2E0ZTEgL2E0ZTIgL2E0ZTMgL2E0ZTQgL2E0ZTUgL2E0ZTYgL2E0ZTcgL2E0ZTggL2E0ZTkgL2E0ZWEgL2E0ZWIgL2E0ZWMgL2E0ZWQgL2E0ZWUgL2E0ZWYgL2E0ZjAgL2E0ZjEgL2E0ZjIgL2E0ZjMgL2E0ZjQgL2E0ZjUgL2E0ZjYgL2E0ZjcgL2E0ZjggL2E0ZjkgL2E0ZmEgL2E0ZmIgL2E0ZmMgL2E0ZmQgL2E0ZmUgL2E0ZmYgL2E1MDAgL2E1MDEgL2E1MDIgL2E1MDMgL2E1MDQgL2E1MDUgL2E1MDYgL2E1MDcgL2E1MDggL2E1MDkgL2E1MGEgL2E1MGIgL2E1MGMgL2E1MGQgL2E1MGUgL2E1MGYgL2E1MTAgL2E1MTEgL2E1MTIgL2E1MTMgL2E1MTQgL2E1MTUgL2E1MTYgL2E1MTcgL2E1MTggL2E1MTkgL2E1MWEgL2E1MWIgL2E1MWMgL2E1MWQgL2E1MWUgL2E1MWYgL2E1MjAgL2E1MjEgL2E1MjIgL2E1MjMgL2E1MjQgL2E1MjUgL2E1MjYgL2E1MjcgL2E1MjggL2E1MjkgL2E1MmEgL2E1MmIgL2E1MmMgL2E1MmQgL2E1MmUgL2E1MmYgL2E1MzAgL2E1MzEgL2E1MzIgL2E1MzMgL2E1MzQgL2E1MzUgL2E1MzYgL2E1MzcgL2E1MzggL2E1MzkgL2E1M2EgL2E1M2IgL2E1M2MgL2E1M2QgL2E1M2UgL2E1M2YgL2E1NDAgL2E1NDEgL2E1NDIgL2E1NDMgL2E1NDQgL2E1NDUgL2E1NDYgL2E1NDcgL2E1NDggL2E1NDkgL2E1NGEgL2E1NGIgL2E1NGMgL2E1NGQgL2E1NGUgL2E1NGYgL2E1NTAgL2E1NTEgL2E1NTIgL2E1NTMgL2E1NTQgL2E1NTUgL2E1NTYgL2E1NTcgL2E1NTggL2E1NTkgL2E1NWEgL2E1NWIgL2E1NWMgL2E1NWQgL2E1NWUgL2E1NWYgL2E1NjAgL2E1NjEgL2E1NjIgL2E1NjMgL2E1NjQgL2E1NjUgL2E1NjYgL2E1NjcgL2E1NjggL2E1NjkgL2E1NmEgL2E1NmIgL2E1NmMgL2E1NmQgL2E1NmUgL2E1NmYgL2E1NzAgL2E1NzEgL2E1NzIgL2E1NzMgL2E1NzQgL2E1NzUgL2E1NzYgL2E1NzcgL2E1NzggL2E1NzkgL2E1N2EgL2E1N2IgL2E1N2MgL2E1N2QgL2E1N2UgL2E1N2YgL2E1ODAgL2E1ODEgL2E1ODIgL2E1ODMgL2E1ODQgL2E1ODUgL2E1ODYgL2E1ODcgL2E1ODggL2E1ODkgL2E1OGEgL2E1OGIgL2E1OGMgL2E1OGQgL2E1OGUgL2E1OGYgL2E1OTAgL2E1OTEgL2E1OTIgL2E1OTMgL2E1OTQgL2E1OTUgL2E1OTYgL2E1OTcgL2E1OTggL2E1OTkgL2E1OWEgL2E1OWIgL2E1OWMgL2E1OWQgL2E1OWUgL2E1OWYgL2E1YTAgL2E1YTEgL2E1YTIgL2E1YTMgL2E1YTQgL2E1YTUgL2E1YTYgL2E1YTcgL2E1YTggL2E1YTkgL2E1YWEgL2E1YWIgL2E1YWMgL2E1YWQgL2E1YWUgL2E1YWYgL2E1YjAgL2E1YjEgL2E1YjIgL2E1YjMgL2E1YjQgL2E1YjUgL2E1YjYgL2E1YjcgL2E1YjggL2E1YjkgL2E1YmEgL2E1YmIgL2E1YmMgL2E1YmQgL2E1YmUgL2E1YmYgL2E1YzAgL2E1YzEgL2E1YzIgL2E1YzMgL2E1YzQgL2E1YzUgL2E1YzYgL2E1YzcgL2E1YzggL2E1YzkgL2E1Y2EgL2E1Y2IgL2E1Y2MgL2E1Y2QgL2E1Y2UgL2E1Y2YgL2E1ZDAgL2E1ZDEgL2E1ZDIgL2E1ZDMgL2E1ZDQgL2E1ZDUgL2E1ZDYgL2E1ZDcgL2E1ZDggL2E1ZDkgL2E1ZGEgL2E1ZGIgL2E1ZGMgL2E1ZGQgL2E1ZGUgL2E1ZGYgL2E1ZTAgL2E1ZTEgL2E1ZTIgL2E1ZTMgL2E1ZTQgL2E1ZTUgL2E1ZTYgL2E1ZTcgL2E1ZTggL2E1ZTkgL2E1ZWEgL2E1ZWIgL2E1ZWMgL2E1ZWQgL2E1ZWUgL2E1ZWYgL2E1ZjAgL2E1ZjEgL2E1ZjIgL2E1ZjMgL2E1ZjQgL2E1ZjUgL2E1ZjYgL2E1ZjcgL2E1ZjggL2E1ZjkgL2E1ZmEgL2E1ZmIgL2E1ZmMgL2E1ZmQgL2E1ZmUgL2E1ZmYgL2E2MDAgL2E2MDEgL2E2MDIgL2E2MDMgL2E2MDQgL2E2MDUgL2E2MDYgL2E2MDcgL2E2MDggL2E2MDkgL2E2MGEgL2E2MGIgL2E2MGMgL2E2MGQgL2E2MGUgL2E2MGYgL2E2MTAgL2E2MTEgL2E2MTIgL2E2MTMgL2E2MTQgL2E2MTUgL2E2MTYgL2E2MTcgL2E2MTggL2E2MTkgL2E2MWEgL2E2MWIgL2E2MWMgL2E2MWQgL2E2MWUgL2E2MWYgL2E2MjAgL2E2MjEgL2E2MjIgL2E2MjMgL2E2MjQgL2E2MjUgL2E2MjYgL2E2MjcgL2E2MjggL2E2MjkgL2E2MmEgL2E2MmIgL2E2MmMgL2E2MmQgL2E2MmUgL2E2MmYgL2E2MzAgL2E2MzEgL2E2MzIgL2E2MzMgL2E2MzQgL2E2MzUgL2E2MzYgL2E2MzcgL2E2MzggL2E2MzkgL2E2M2EgL2E2M2IgL2E2M2MgL2E2M2QgL2E2M2UgL2E2M2YgL2E2NDAgL2E2NDEgL2E2NDIgL2E2NDMgL2E2NDQgL2E2NDUgL2E2NDYgL2E2NDcgL2E2NDggL2E2NDkgL2E2NGEgL2E2NGIgL2E2NGMgL2E2NGQgL2E2NGUgL2E2NGYgL2E2NTAgL2E2NTEgL2E2NTIgL2E2NTMgL2E2NTQgL2E2NTUgL2E2NTYgL2E2NTcgL2E2NTggL2E2NTkgL2E2NWEgL2E2NWIgL2E2NWMgL2E2NWQgL2E2NWUgL2E2NWYgL2E2NjAgL2E2NjEgL2E2NjIgL2E2NjMgL2E2NjQgL2E2NjUgL2E2NjYgL2E2NjcgL2E2NjggL2E2NjkgL2E2NmEgL2E2NmIgL2E2NmMgL2E2NmQgL2E2NmUgL2E2NmYgL2E2NzAgL2E2NzEgL2E2NzIgL2E2NzMgL2E2NzQgL2E2NzUgL2E2NzYgL2E2NzcgL2E2NzggL2E2NzkgL2E2N2EgL2E2N2IgL2E2N2MgL2E2N2QgL2E2N2UgL2E2N2YgL2E2ODAgL2E2ODEgL2E2ODIgL2E2ODMgL2E2ODQgL2E2ODUgL2E2ODYgL2E2ODcgL2E2ODggL2E2ODkgL2E2OGEgL2E2OGIgL2E2OGMgL2E2OGQgL2E2OGUgL2E2OGYgL2E2OTAgL2E2OTEgL2E2OTIgL2E2OTMgL2E2OTQgL2E2OTUgL2E2OTYgL2E2OTcgL2E2OTggL2E2OTkgL2E2OWEgL2E2OWIgL2E2OWMgL2E2OWQgL2E2OWUgL2E2OWYgL2E2YTAgL2E2YTEgL2E2YTIgL2E2YTMgL2E2YTQgL2E2YTUgL2E2YTYgL2E2YTcgL2E2YTggL2E2YTkgL2E2YWEgL2E2YWIgL2E2YWMgL2E2YWQgL2E2YWUgL2E2YWYgL2E2YjAgL2E2YjEgL2E2YjIgL2E2YjMgL2E2YjQgL2E2YjUgL2E2YjYgL2E2YjcgL2E2YjggL2E2YjkgL2E2YmEgL2E2YmIgL2E2YmMgL2E2YmQgL2E2YmUgL2E2YmYgL2E2YzAgL2E2YzEgL2E2YzIgL2E2YzMgL2E2YzQgL2E2YzUgL2E2YzYgL2E2YzcgL2E2YzggL2E2YzkgL2E2Y2EgL2E2Y2IgL2E2Y2MgL2E2Y2QgL2E2Y2UgL2E2Y2YgL2E2ZDAgL2E2ZDEgL2E2ZDIgL2E2ZDMgL2E2ZDQgL2E2ZDUgL2E2ZDYgL2E2ZDcgL2E2ZDggL2E2ZDkgL2E2ZGEgL2E2ZGIgL2E2ZGMgL2E2ZGQgL2E2ZGUgL2E2ZGYgL2E2ZTAgL2E2ZTEgL2E2ZTIgL2E2ZTMgL2E2ZTQgL2E2ZTUgL2E2ZTYgL2E2ZTcgL2E2ZTggL2E2ZTkgL2E2ZWEgL2E2ZWIgL2E2ZWMgL2E2ZWQgL2E2ZWUgL2E2ZWYgL2E2ZjAgL2E2ZjEgL2E2ZjIgL2E2ZjMgL2E2ZjQgL2E2ZjUgL2E2ZjYgL2E2ZjcgL2E2ZjggL2E2ZjkgL2E2ZmEgL2E2ZmIgL2E2ZmMgL2E2ZmQgL2E2ZmUgL2E2ZmYgL2E3MDAgL2E3MDEgL2E3MDIgL2E3MDMgL2E3MDQgL2E3MDUgL2E3MDYgL2E3MDcgL2E3MDggL2E3MDkgL2E3MGEgL2E3MGIgL2E3MGMgL2E3MGQgL2E3MGUgL2E3MGYgL2E3MTAgL2E3MTEgL2E3MTIgL2E3MTMgL2E3MTQgL2E3MTUgL2E3MTYgL2E3MTcgL2E3MTggL2E3MTkgL2E3MWEgL2E3MWIgL2E3MWMgL2E3MWQgL2E3MWUgL2E3MWYgL2E3MjAgL2E3MjEgL2E3MjIgL2E3MjMgL2E3MjQgL2E3MjUgL2E3MjYgL2E3MjcgL2E3MjggL2E3MjkgL2E3MmEgL2E3MmIgL2E3MmMgL2E3MmQgL2E3MmUgL2E3MmYgL2E3MzAgL2E3MzEgL2E3MzIgL2E3MzMgL2E3MzQgL2E3MzUgL2E3MzYgL2E3MzcgL2E3MzggL2E3MzkgL2E3M2EgL2E3M2IgL2E3M2MgL2E3M2QgL2E3M2UgL2E3M2YgL2E3NDAgL2E3NDEgL2E3NDIgL2E3NDMgL2E3NDQgL2E3NDUgL2E3NDYgL2E3NDcgL2E3NDggL2E3NDkgL2E3NGEgL2E3NGIgL2E3NGMgL2E3NGQgL2E3NGUgL2E3NGYgL2E3NTAgL2E3NTEgL2E3NTIgL2E3NTMgL2E3NTQgL2E3NTUgL2E3NTYgL2E3NTcgL2E3NTggL2E3NTkgL2E3NWEgL2E3NWIgL2E3NWMgL2E3NWQgL2E3NWUgL2E3NWYgL2E3NjAgL2E3NjEgL2E3NjIgL2E3NjMgL2E3NjQgL2E3NjUgL2E3NjYgL2E3NjcgL2E3NjggL2E3NjkgL2E3NmEgL2E3NmIgL2E3NmMgL2E3NmQgL2E3NmUgL2E3NmYgL2E3NzAgL2E3NzEgL2E3NzIgL2E3NzMgL2E3NzQgL2E3NzUgL2E3NzYgL2E3NzcgL2E3NzggL2E3NzkgL2E3N2EgL2E3N2IgL2E3N2MgL2E3N2QgL2E3N2UgL2E3N2YgL2E3ODAgL2E3ODEgL2E3ODIgL2E3ODMgL2E3ODQgL2E3ODUgL2E3ODYgL2E3ODcgL2E3ODggL2E3ODkgL2E3OGEgL2E3OGIgL2E3OGMgL2E3OGQgL2E3OGUgL2E3OGYgL2E3OTAgL2E3OTEgL2E3OTIgL2E3OTMgL2E3OTQgL2E3OTUgL2E3OTYgL2E3OTcgL2E3OTggL2E3OTkgL2E3OWEgL2E3OWIgL2E3OWMgL2E3OWQgL2E3OWUgL2E3OWYgL2E3YTAgL2E3YTEgL2E3YTIgL2E3YTMgL2E3YTQgL2E3YTUgL2E3YTYgL2E3YTcgL2E3YTggL2E3YTkgL2E3YWEgL2E3YWIgL2E3YWMgL2E3YWQgL2E3YWUgL2E3YWYgL2E3YjAgL2E3YjEgL2E3YjIgL2E3YjMgL2E3YjQgL2E3YjUgL2E3YjYgL2E3YjcgL2E3YjggL2E3YjkgL2E3YmEgL2E3YmIgL2E3YmMgL2E3YmQgL2E3YmUgL2E3YmYgL2E3YzAgL2E3YzEgL2E3YzIgL2E3YzMgL2E3YzQgL2E3YzUgL2E3YzYgL2E3YzcgL2E3YzggL2E3YzkgL2E3Y2EgL2E3Y2IgL2E3Y2MgL2E3Y2QgL2E3Y2UgL2E3Y2YKKy9hN2QwIC9hN2QxIC9hN2QyIC9hN2QzIC9hN2Q0IC9hN2Q1IC9hN2Q2IC9hN2Q3IC9hN2Q4IC9hN2Q5IC9hN2RhIC9hN2RiIC9hN2RjIC9hN2RkIC9hN2RlIC9hN2RmIC9hN2UwIC9hN2UxIC9hN2UyIC9hN2UzIC9hN2U0IC9hN2U1IC9hN2U2IC9hN2U3IC9hN2U4IC9hN2U5IC9hN2VhIC9hN2ViIC9hN2VjIC9hN2VkIC9hN2VlIC9hN2VmIC9hN2YwIC9hN2YxIC9hN2YyIC9hN2YzIC9hN2Y0IC9hN2Y1IC9hN2Y2IC9hN2Y3IC9hN2Y4IC9hN2Y5IC9hN2ZhIC9hN2ZiIC9hN2ZjIC9hN2ZkIC9hN2ZlIC9hN2ZmIC9hODAwIC9hODAxIC9hODAyIC9hODAzIC9hODA0IC9hODA1IC9hODA2IC9hODA3IC9hODA4IC9hODA5IC9hODBhIC9hODBiIC9hODBjIC9hODBkIC9hODBlIC9hODBmIC9hODEwIC9hODExIC9hODEyIC9hODEzIC9hODE0IC9hODE1IC9hODE2IC9hODE3IC9hODE4IC9hODE5IC9hODFhIC9hODFiIC9hODFjIC9hODFkIC9hODFlIC9hODFmIC9hODIwIC9hODIxIC9hODIyIC9hODIzIC9hODI0IC9hODI1IC9hODI2IC9hODI3IC9hODI4IC9hODI5IC9hODJhIC9hODJiIC9hODJjIC9hODJkIC9hODJlIC9hODJmIC9hODMwIC9hODMxIC9hODMyIC9hODMzIC9hODM0IC9hODM1IC9hODM2IC9hODM3IC9hODM4IC9hODM5IC9hODNhIC9hODNiIC9hODNjIC9hODNkIC9hODNlIC9hODNmIC9hODQwIC9hODQxIC9hODQyIC9hODQzIC9hODQ0IC9hODQ1IC9hODQ2IC9hODQ3IC9hODQ4IC9hODQ5IC9hODRhIC9hODRiIC9hODRjIC9hODRkIC9hODRlIC9hODRmIC9hODUwIC9hODUxIC9hODUyIC9hODUzIC9hODU0IC9hODU1IC9hODU2IC9hODU3IC9hODU4IC9hODU5IC9hODVhIC9hODViIC9hODVjIC9hODVkIC9hODVlIC9hODVmIC9hODYwIC9hODYxIC9hODYyIC9hODYzIC9hODY0IC9hODY1IC9hODY2IC9hODY3IC9hODY4IC9hODY5IC9hODZhIC9hODZiIC9hODZjIC9hODZkIC9hODZlIC9hODZmIC9hODcwIC9hODcxIC9hODcyIC9hODczIC9hODc0IC9hODc1IC9hODc2IC9hODc3IC9hODc4IC9hODc5IC9hODdhIC9hODdiIC9hODdjIC9hODdkIC9hODdlIC9hODdmIC9hODgwIC9hODgxIC9hODgyIC9hODgzIC9hODg0IC9hODg1IC9hODg2IC9hODg3IC9hODg4IC9hODg5IC9hODhhIC9hODhiIC9hODhjIC9hODhkIC9hODhlIC9hODhmIC9hODkwIC9hODkxIC9hODkyIC9hODkzIC9hODk0IC9hODk1IC9hODk2IC9hODk3IC9hODk4IC9hODk5IC9hODlhIC9hODliIC9hODljIC9hODlkIC9hODllIC9hODlmIC9hOGEwIC9hOGExIC9hOGEyIC9hOGEzIC9hOGE0IC9hOGE1IC9hOGE2IC9hOGE3IC9hOGE4IC9hOGE5IC9hOGFhIC9hOGFiIC9hOGFjIC9hOGFkIC9hOGFlIC9hOGFmIC9hOGIwIC9hOGIxIC9hOGIyIC9hOGIzIC9hOGI0IC9hOGI1IC9hOGI2IC9hOGI3IC9hOGI4IC9hOGI5IC9hOGJhIC9hOGJiIC9hOGJjIC9hOGJkIC9hOGJlIC9hOGJmIC9hOGMwIC9hOGMxIC9hOGMyIC9hOGMzIC9hOGM0IC9hOGM1IC9hOGM2IC9hOGM3IC9hOGM4IC9hOGM5IC9hOGNhIC9hOGNiIC9hOGNjIC9hOGNkIC9hOGNlIC9hOGNmIC9hOGQwIC9hOGQxIC9hOGQyIC9hOGQzIC9hOGQ0IC9hOGQ1IC9hOGQ2IC9hOGQ3IC9hOGQ4IC9hOGQ5IC9hOGRhIC9hOGRiIC9hOGRjIC9hOGRkIC9hOGRlIC9hOGRmIC9hOGUwIC9hOGUxIC9hOGUyIC9hOGUzIC9hOGU0IC9hOGU1IC9hOGU2IC9hOGU3IC9hOGU4IC9hOGU5IC9hOGVhIC9hOGViIC9hOGVjIC9hOGVkIC9hOGVlIC9hOGVmIC9hOGYwIC9hOGYxIC9hOGYyIC9hOGYzIC9hOGY0IC9hOGY1IC9hOGY2IC9hOGY3IC9hOGY4IC9hOGY5IC9hOGZhIC9hOGZiIC9hOGZjIC9hOGZkIC9hOGZlIC9hOGZmIC9hOTAwIC9hOTAxIC9hOTAyIC9hOTAzIC9hOTA0IC9hOTA1IC9hOTA2IC9hOTA3IC9hOTA4IC9hOTA5IC9hOTBhIC9hOTBiIC9hOTBjIC9hOTBkIC9hOTBlIC9hOTBmIC9hOTEwIC9hOTExIC9hOTEyIC9hOTEzIC9hOTE0IC9hOTE1IC9hOTE2IC9hOTE3IC9hOTE4IC9hOTE5IC9hOTFhIC9hOTFiIC9hOTFjIC9hOTFkIC9hOTFlIC9hOTFmIC9hOTIwIC9hOTIxIC9hOTIyIC9hOTIzIC9hOTI0IC9hOTI1IC9hOTI2IC9hOTI3IC9hOTI4IC9hOTI5IC9hOTJhIC9hOTJiIC9hOTJjIC9hOTJkIC9hOTJlIC9hOTJmIC9hOTMwIC9hOTMxIC9hOTMyIC9hOTMzIC9hOTM0IC9hOTM1IC9hOTM2IC9hOTM3IC9hOTM4IC9hOTM5IC9hOTNhIC9hOTNiIC9hOTNjIC9hOTNkIC9hOTNlIC9hOTNmIC9hOTQwIC9hOTQxIC9hOTQyIC9hOTQzIC9hOTQ0IC9hOTQ1IC9hOTQ2IC9hOTQ3IC9hOTQ4IC9hOTQ5IC9hOTRhIC9hOTRiIC9hOTRjIC9hOTRkIC9hOTRlIC9hOTRmIC9hOTUwIC9hOTUxIC9hOTUyIC9hOTUzIC9hOTU0IC9hOTU1IC9hOTU2IC9hOTU3IC9hOTU4IC9hOTU5IC9hOTVhIC9hOTViIC9hOTVjIC9hOTVkIC9hOTVlIC9hOTVmIC9hOTYwIC9hOTYxIC9hOTYyIC9hOTYzIC9hOTY0IC9hOTY1IC9hOTY2IC9hOTY3IC9hOTY4IC9hOTY5IC9hOTZhIC9hOTZiIC9hOTZjIC9hOTZkIC9hOTZlIC9hOTZmIC9hOTcwIC9hOTcxIC9hOTcyIC9hOTczIC9hOTc0IC9hOTc1IC9hOTc2IC9hOTc3IC9hOTc4IC9hOTc5IC9hOTdhIC9hOTdiIC9hOTdjIC9hOTdkIC9hOTdlIC9hOTdmIC9hOTgwIC9hOTgxIC9hOTgyIC9hOTgzIC9hOTg0IC9hOTg1IC9hOTg2IC9hOTg3IC9hOTg4IC9hOTg5IC9hOThhIC9hOThiIC9hOThjIC9hOThkIC9hOThlIC9hOThmIC9hOTkwIC9hOTkxIC9hOTkyIC9hOTkzIC9hOTk0IC9hOTk1IC9hOTk2IC9hOTk3IC9hOTk4IC9hOTk5IC9hOTlhIC9hOTliIC9hOTljIC9hOTlkIC9hOTllIC9hOTlmIC9hOWEwIC9hOWExIC9hOWEyIC9hOWEzIC9hOWE0IC9hOWE1IC9hOWE2IC9hOWE3IC9hOWE4IC9hOWE5IC9hOWFhIC9hOWFiIC9hOWFjIC9hOWFkIC9hOWFlIC9hOWFmIC9hOWIwIC9hOWIxIC9hOWIyIC9hOWIzIC9hOWI0IC9hOWI1IC9hOWI2IC9hOWI3IC9hOWI4IC9hOWI5IC9hOWJhIC9hOWJiIC9hOWJjIC9hOWJkIC9hOWJlIC9hOWJmIC9hOWMwIC9hOWMxIC9hOWMyIC9hOWMzIC9hOWM0IC9hOWM1IC9hOWM2IC9hOWM3IC9hOWM4IC9hOWM5IC9hOWNhIC9hOWNiIC9hOWNjIC9hOWNkIC9hOWNlIC9hOWNmIC9hOWQwIC9hOWQxIC9hOWQyIC9hOWQzIC9hOWQ0IC9hOWQ1IC9hOWQ2IC9hOWQ3IC9hOWQ4IC9hOWQ5IC9hOWRhIC9hOWRiIC9hOWRjIC9hOWRkIC9hOWRlIC9hOWRmIC9hOWUwIC9hOWUxIC9hOWUyIC9hOWUzIC9hOWU0IC9hOWU1IC9hOWU2IC9hOWU3IC9hOWU4IC9hOWU5IC9hOWVhIC9hOWViIC9hOWVjIC9hOWVkIC9hOWVlIC9hOWVmIC9hOWYwIC9hOWYxIC9hOWYyIC9hOWYzIC9hOWY0IC9hOWY1IC9hOWY2IC9hOWY3IC9hOWY4IC9hOWY5IC9hOWZhIC9hOWZiIC9hOWZjIC9hOWZkIC9hOWZlIC9hOWZmIC9hYTAwIC9hYTAxIC9hYTAyIC9hYTAzIC9hYTA0IC9hYTA1IC9hYTA2IC9hYTA3IC9hYTA4IC9hYTA5IC9hYTBhIC9hYTBiIC9hYTBjIC9hYTBkIC9hYTBlIC9hYTBmIC9hYTEwIC9hYTExIC9hYTEyIC9hYTEzIC9hYTE0IC9hYTE1IC9hYTE2IC9hYTE3IC9hYTE4IC9hYTE5IC9hYTFhIC9hYTFiIC9hYTFjIC9hYTFkIC9hYTFlIC9hYTFmIC9hYTIwIC9hYTIxIC9hYTIyIC9hYTIzIC9hYTI0IC9hYTI1IC9hYTI2IC9hYTI3IC9hYTI4IC9hYTI5IC9hYTJhIC9hYTJiIC9hYTJjIC9hYTJkIC9hYTJlIC9hYTJmIC9hYTMwIC9hYTMxIC9hYTMyIC9hYTMzIC9hYTM0IC9hYTM1IC9hYTM2IC9hYTM3IC9hYTM4IC9hYTM5IC9hYTNhIC9hYTNiIC9hYTNjIC9hYTNkIC9hYTNlIC9hYTNmIC9hYTQwIC9hYTQxIC9hYTQyIC9hYTQzIC9hYTQ0IC9hYTQ1IC9hYTQ2IC9hYTQ3IC9hYTQ4IC9hYTQ5IC9hYTRhIC9hYTRiIC9hYTRjIC9hYTRkIC9hYTRlIC9hYTRmIC9hYTUwIC9hYTUxIC9hYTUyIC9hYTUzIC9hYTU0IC9hYTU1IC9hYTU2IC9hYTU3IC9hYTU4IC9hYTU5IC9hYTVhIC9hYTViIC9hYTVjIC9hYTVkIC9hYTVlIC9hYTVmIC9hYTYwIC9hYTYxIC9hYTYyIC9hYTYzIC9hYTY0IC9hYTY1IC9hYTY2IC9hYTY3IC9hYTY4IC9hYTY5IC9hYTZhIC9hYTZiIC9hYTZjIC9hYTZkIC9hYTZlIC9hYTZmIC9hYTcwIC9hYTcxIC9hYTcyIC9hYTczIC9hYTc0IC9hYTc1IC9hYTc2IC9hYTc3IC9hYTc4IC9hYTc5IC9hYTdhIC9hYTdiIC9hYTdjIC9hYTdkIC9hYTdlIC9hYTdmIC9hYTgwIC9hYTgxIC9hYTgyIC9hYTgzIC9hYTg0IC9hYTg1IC9hYTg2IC9hYTg3IC9hYTg4IC9hYTg5IC9hYThhIC9hYThiIC9hYThjIC9hYThkIC9hYThlIC9hYThmIC9hYTkwIC9hYTkxIC9hYTkyIC9hYTkzIC9hYTk0IC9hYTk1IC9hYTk2IC9hYTk3IC9hYTk4IC9hYTk5IC9hYTlhIC9hYTliIC9hYTljIC9hYTlkIC9hYTllIC9hYTlmIC9hYWEwIC9hYWExIC9hYWEyIC9hYWEzIC9hYWE0IC9hYWE1IC9hYWE2IC9hYWE3IC9hYWE4IC9hYWE5IC9hYWFhIC9hYWFiIC9hYWFjIC9hYWFkIC9hYWFlIC9hYWFmIC9hYWIwIC9hYWIxIC9hYWIyIC9hYWIzIC9hYWI0IC9hYWI1IC9hYWI2IC9hYWI3IC9hYWI4IC9hYWI5IC9hYWJhIC9hYWJiIC9hYWJjIC9hYWJkIC9hYWJlIC9hYWJmIC9hYWMwIC9hYWMxIC9hYWMyIC9hYWMzIC9hYWM0IC9hYWM1IC9hYWM2IC9hYWM3IC9hYWM4IC9hYWM5IC9hYWNhIC9hYWNiIC9hYWNjIC9hYWNkIC9hYWNlIC9hYWNmIC9hYWQwIC9hYWQxIC9hYWQyIC9hYWQzIC9hYWQ0IC9hYWQ1IC9hYWQ2IC9hYWQ3IC9hYWQ4IC9hYWQ5IC9hYWRhIC9hYWRiIC9hYWRjIC9hYWRkIC9hYWRlIC9hYWRmIC9hYWUwIC9hYWUxIC9hYWUyIC9hYWUzIC9hYWU0IC9hYWU1IC9hYWU2IC9hYWU3IC9hYWU4IC9hYWU5IC9hYWVhIC9hYWViIC9hYWVjIC9hYWVkIC9hYWVlIC9hYWVmIC9hYWYwIC9hYWYxIC9hYWYyIC9hYWYzIC9hYWY0IC9hYWY1IC9hYWY2IC9hYWY3IC9hYWY4IC9hYWY5IC9hYWZhIC9hYWZiIC9hYWZjIC9hYWZkIC9hYWZlIC9hYWZmIC9hYjAwIC9hYjAxIC9hYjAyIC9hYjAzIC9hYjA0IC9hYjA1IC9hYjA2IC9hYjA3IC9hYjA4IC9hYjA5IC9hYjBhIC9hYjBiIC9hYjBjIC9hYjBkIC9hYjBlIC9hYjBmIC9hYjEwIC9hYjExIC9hYjEyIC9hYjEzIC9hYjE0IC9hYjE1IC9hYjE2IC9hYjE3IC9hYjE4IC9hYjE5IC9hYjFhIC9hYjFiIC9hYjFjIC9hYjFkIC9hYjFlIC9hYjFmIC9hYjIwIC9hYjIxIC9hYjIyIC9hYjIzIC9hYjI0IC9hYjI1IC9hYjI2IC9hYjI3IC9hYjI4IC9hYjI5IC9hYjJhIC9hYjJiIC9hYjJjIC9hYjJkIC9hYjJlIC9hYjJmIC9hYjMwIC9hYjMxIC9hYjMyIC9hYjMzIC9hYjM0IC9hYjM1IC9hYjM2IC9hYjM3IC9hYjM4IC9hYjM5IC9hYjNhIC9hYjNiIC9hYjNjIC9hYjNkIC9hYjNlIC9hYjNmIC9hYjQwIC9hYjQxIC9hYjQyIC9hYjQzIC9hYjQ0IC9hYjQ1IC9hYjQ2IC9hYjQ3IC9hYjQ4IC9hYjQ5IC9hYjRhIC9hYjRiIC9hYjRjIC9hYjRkIC9hYjRlIC9hYjRmIC9hYjUwIC9hYjUxIC9hYjUyIC9hYjUzIC9hYjU0IC9hYjU1IC9hYjU2IC9hYjU3IC9hYjU4IC9hYjU5IC9hYjVhIC9hYjViIC9hYjVjIC9hYjVkIC9hYjVlIC9hYjVmIC9hYjYwIC9hYjYxIC9hYjYyIC9hYjYzIC9hYjY0IC9hYjY1IC9hYjY2IC9hYjY3IC9hYjY4IC9hYjY5IC9hYjZhIC9hYjZiIC9hYjZjIC9hYjZkIC9hYjZlIC9hYjZmIC9hYjcwIC9hYjcxIC9hYjcyIC9hYjczIC9hYjc0IC9hYjc1IC9hYjc2IC9hYjc3IC9hYjc4IC9hYjc5IC9hYjdhIC9hYjdiIC9hYjdjIC9hYjdkIC9hYjdlIC9hYjdmIC9hYjgwIC9hYjgxIC9hYjgyIC9hYjgzIC9hYjg0IC9hYjg1IC9hYjg2IC9hYjg3IC9hYjg4IC9hYjg5IC9hYjhhIC9hYjhiIC9hYjhjIC9hYjhkIC9hYjhlIC9hYjhmIC9hYjkwIC9hYjkxIC9hYjkyIC9hYjkzIC9hYjk0IC9hYjk1IC9hYjk2IC9hYjk3IC9hYjk4IC9hYjk5IC9hYjlhIC9hYjliIC9hYjljIC9hYjlkIC9hYjllIC9hYjlmIC9hYmEwIC9hYmExIC9hYmEyIC9hYmEzIC9hYmE0IC9hYmE1IC9hYmE2IC9hYmE3IC9hYmE4IC9hYmE5IC9hYmFhIC9hYmFiIC9hYmFjIC9hYmFkIC9hYmFlIC9hYmFmIC9hYmIwIC9hYmIxIC9hYmIyIC9hYmIzIC9hYmI0IC9hYmI1IC9hYmI2IC9hYmI3CisvYWJiOCAvYWJiOSAvYWJiYSAvYWJiYiAvYWJiYyAvYWJiZCAvYWJiZSAvYWJiZiAvYWJjMCAvYWJjMSAvYWJjMiAvYWJjMyAvYWJjNCAvYWJjNSAvYWJjNiAvYWJjNyAvYWJjOCAvYWJjOSAvYWJjYSAvYWJjYiAvYWJjYyAvYWJjZCAvYWJjZSAvYWJjZiAvYWJkMCAvYWJkMSAvYWJkMiAvYWJkMyAvYWJkNCAvYWJkNSAvYWJkNiAvYWJkNyAvYWJkOCAvYWJkOSAvYWJkYSAvYWJkYiAvYWJkYyAvYWJkZCAvYWJkZSAvYWJkZiAvYWJlMCAvYWJlMSAvYWJlMiAvYWJlMyAvYWJlNCAvYWJlNSAvYWJlNiAvYWJlNyAvYWJlOCAvYWJlOSAvYWJlYSAvYWJlYiAvYWJlYyAvYWJlZCAvYWJlZSAvYWJlZiAvYWJmMCAvYWJmMSAvYWJmMiAvYWJmMyAvYWJmNCAvYWJmNSAvYWJmNiAvYWJmNyAvYWJmOCAvYWJmOSAvYWJmYSAvYWJmYiAvYWJmYyAvYWJmZCAvYWJmZSAvYWJmZiAvYWMwMCAvYWMwMSAvYWMwMiAvYWMwMyAvYWMwNCAvYWMwNSAvYWMwNiAvYWMwNyAvYWMwOCAvYWMwOSAvYWMwYSAvYWMwYiAvYWMwYyAvYWMwZCAvYWMwZSAvYWMwZiAvYWMxMCAvYWMxMSAvYWMxMiAvYWMxMyAvYWMxNCAvYWMxNSAvYWMxNiAvYWMxNyAvYWMxOCAvYWMxOSAvYWMxYSAvYWMxYiAvYWMxYyAvYWMxZCAvYWMxZSAvYWMxZiAvYWMyMCAvYWMyMSAvYWMyMiAvYWMyMyAvYWMyNCAvYWMyNSAvYWMyNiAvYWMyNyAvYWMyOCAvYWMyOSAvYWMyYSAvYWMyYiAvYWMyYyAvYWMyZCAvYWMyZSAvYWMyZiAvYWMzMCAvYWMzMSAvYWMzMiAvYWMzMyAvYWMzNCAvYWMzNSAvYWMzNiAvYWMzNyAvYWMzOCAvYWMzOSAvYWMzYSAvYWMzYiAvYWMzYyAvYWMzZCAvYWMzZSAvYWMzZiAvYWM0MCAvYWM0MSAvYWM0MiAvYWM0MyAvYWM0NCAvYWM0NSAvYWM0NiAvYWM0NyAvYWM0OCAvYWM0OSAvYWM0YSAvYWM0YiAvYWM0YyAvYWM0ZCAvYWM0ZSAvYWM0ZiAvYWM1MCAvYWM1MSAvYWM1MiAvYWM1MyAvYWM1NCAvYWM1NSAvYWM1NiAvYWM1NyAvYWM1OCAvYWM1OSAvYWM1YSAvYWM1YiAvYWM1YyAvYWM1ZCAvYWM1ZSAvYWM1ZiAvYWM2MCAvYWM2MSAvYWM2MiAvYWM2MyAvYWM2NCAvYWM2NSAvYWM2NiAvYWM2NyAvYWM2OCAvYWM2OSAvYWM2YSAvYWM2YiAvYWM2YyAvYWM2ZCAvYWM2ZSAvYWM2ZiAvYWM3MCAvYWM3MSAvYWM3MiAvYWM3MyAvYWM3NCAvYWM3NSAvYWM3NiAvYWM3NyAvYWM3OCAvYWM3OSAvYWM3YSAvYWM3YiAvYWM3YyAvYWM3ZCAvYWM3ZSAvYWM3ZiAvYWM4MCAvYWM4MSAvYWM4MiAvYWM4MyAvYWM4NCAvYWM4NSAvYWM4NiAvYWM4NyAvYWM4OCAvYWM4OSAvYWM4YSAvYWM4YiAvYWM4YyAvYWM4ZCAvYWM4ZSAvYWM4ZiAvYWM5MCAvYWM5MSAvYWM5MiAvYWM5MyAvYWM5NCAvYWM5NSAvYWM5NiAvYWM5NyAvYWM5OCAvYWM5OSAvYWM5YSAvYWM5YiAvYWM5YyAvYWM5ZCAvYWM5ZSAvYWM5ZiAvYWNhMCAvYWNhMSAvYWNhMiAvYWNhMyAvYWNhNCAvYWNhNSAvYWNhNiAvYWNhNyAvYWNhOCAvYWNhOSAvYWNhYSAvYWNhYiAvYWNhYyAvYWNhZCAvYWNhZSAvYWNhZiAvYWNiMCAvYWNiMSAvYWNiMiAvYWNiMyAvYWNiNCAvYWNiNSAvYWNiNiAvYWNiNyAvYWNiOCAvYWNiOSAvYWNiYSAvYWNiYiAvYWNiYyAvYWNiZCAvYWNiZSAvYWNiZiAvYWNjMCAvYWNjMSAvYWNjMiAvYWNjMyAvYWNjNCAvYWNjNSAvYWNjNiAvYWNjNyAvYWNjOCAvYWNjOSAvYWNjYSAvYWNjYiAvYWNjYworXSAgICAvRGV2aWNlUkdCIDEwIDAgUl0KKyAgL0JpdHNQZXJDb21wb25lbnQgMTYKKyAgL0ZpbHRlciBbL0FTQ0lJSGV4RGVjb2RlIC9GbGF0ZURlY29kZSAvUnVuTGVuZ3RoRGVjb2RlXQorPj4KK3N0cmVhbQorNzg5Y2VjYzEwMTAxMDAwMDAwODA5MGVkM2RlZjA4MGEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODBkYjgzMDMwMjAwMDAwMDAwMjFmZjVmMzcyNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOWMwNWRmZjJjN2FlCitlbmRzdHJlYW0KK2VuZG9iagorCisxMCAwIG9iagorPDwKKyAgL0Z1bmN0aW9uVHlwZSAyCisgIC9Eb21haW4gWzAuMCAxLjAgMC4wIDEuMF0KKyAgL0MwIFswLjAgMC4wXQorICAvQzEgWzEuMCAxLjBdCisgIC9OIDEKKz4+CitlbmRvYmoKKworeHJlZgorMCAxMQorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDAxNiAwMDAwMCBuIAorMDAwMDAwMDA1MyAwMDAwMCBuIAorMDAwMDAwMDA5MyAwMDAwMCBuIAorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDIyMSAwMDAwMCBuIAorMDAwMDAwMDE1MiAwMDAwMCBuIAorMDAwMDAwMDI3OCAwMDAwMCBuIAorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAzNjIyNyAwMDAwMCBuIAordHJhaWxlciA8PAorICAvUm9vdCAxIDAgUgorICAvU2l6ZSAxMQorPj4KK3N0YXJ0eHJlZgorMzYzMzUKKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9idWdfNTU3MjIzLmluIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzU1NzIyMy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGY1OTBkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzU1NzIyMy5pbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9idWdfNTU3MjIzLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z181NTcyMjMucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MDgwNWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfNTU3MjIzLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9idWdfNTcyODcxLmluIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzU3Mjg3MS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGNiOTQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzU3Mjg3MS5pbgpAQCAtMCwwICsxLDk2IEBACit7e2hlYWRlcn19Cit7e29iamVjdCAxIDB9fSA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKyAgL0Fjcm9Gb3JtIDMgMCBSCisgIC9BQSAxMSAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDIgMH19IDw8CisgIC9UeXBlIC9QYWdlcworICAvQ291bnQgMworICAvS2lkcyBbNCAwIFIgNSAwIFIgNiAwIFIgXQorPj4KK2VuZG9iagore3tvYmplY3QgMyAwfX0gPDwKKyAgL0NPIFs5IDAgUl0KKyAgL0ZpZWxkcyBbOSAwIFIgNyAwIFJdCis+PgorZW5kb2JqCit7e29iamVjdCA0IDB9fSA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCisgIC9SZXNvdXJjZXMgPDw+PgorPj4KK2VuZG9iagore3tvYmplY3QgNSAwfX0gPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQorICAvUmVzb3VyY2VzIDw8Pj4KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDYgMH19IDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KKyAgL1Jlc291cmNlcyA8PD4+CisgIC9Bbm5vdHMgWzcgMCBSIDkgMCBSXQorPj4KK2VuZG9iagore3tvYmplY3QgNyAwfX0gPDwKKyAgL0ZUIC9UeAorICAvVHlwZSAvQW5ub3QKKyAgL1N1YnR5cGUgL1dpZGdldAorICAvVCAodHh0TmFtZTIpCisgIC9GIDQKKyAgL0FQIDw8L04gOCAwIFI+PgorICAvUmVjdCBbMjAgMjAgNDAwIDYwXQorPj4KK2VuZG9iagore3tvYmplY3QgOCAwfX0gPDwKKyAgL1R5cGUgL1hPYmplY3QKKyAgL1N1YnR5cGUgL0Zvcm0KKyAgL0Zvcm1UeXBlIDEKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDkgMH19IDw8CisgIC9GVCAvVHgKKyAgL1R5cGUgL0Fubm90CisgIC9TdWJ0eXBlIC9XaWRnZXQKKyAgL1QgKHR4dE5hbWUxKQorICAvRiA0CisgIC9BUCA8PC9OIDEwIDAgUj4+CisgIC9SZWN0IFsyMDAgMjAwIDQwMCAyNjBdCis+PgorZW5kb2JqCit7e29iamVjdCAxMCAwfX0gPDwKKyAgL1R5cGUgL1hPYmplY3QKKyAgL1N1YnR5cGUgL0Zvcm0KKyAgL0Zvcm1UeXBlIDEKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDExIDB9fSA8PAorICAvV0MgMTIgMCBSCis+PgorZW5kb2JqCit7e29iamVjdCAxMiAwfX0gPDwKKyAgL1R5cGUgL0FjdGlvbgorICAvUyAvSmF2YVNjcmlwdAorICAvSlMgMTMgMCBSCis+PgorZW5kb2JqCit7e29iamVjdCAxMyAwfX0gPDw+Pgorc3RyZWFtCit0ID0gdGhpcy5nZXRGaWVsZCgndHh0TmFtZTInKTsKK3Quc2V0Rm9jdXMoKTsKK2VuZHN0cmVhbQorZW5kb2JqCit7e3hyZWZ9fQordHJhaWxlciA8PAorICAvU2l6ZSAxNAorICAvUm9vdCAxIDAgUgorPj4KK3t7c3RhcnR4cmVmfX0KKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9idWdfNTcyODcxLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z181NzI4NzEucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMjZiYzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfNTcyODcxLnBkZgpAQCAtMCwwICsxLDExMyBAQAorJVBERi0xLjcKKyWg8qT0CisxIDAgb2JqIDw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAyIDAgUgorICAvQWNyb0Zvcm0gMyAwIFIKKyAgL0FBIDExIDAgUgorPj4KK2VuZG9iagorMiAwIG9iaiA8PAorICAvVHlwZSAvUGFnZXMKKyAgL0NvdW50IDMKKyAgL0tpZHMgWzQgMCBSIDUgMCBSIDYgMCBSIF0KKz4+CitlbmRvYmoKKzMgMCBvYmogPDwKKyAgL0NPIFs5IDAgUl0KKyAgL0ZpZWxkcyBbOSAwIFIgNyAwIFJdCis+PgorZW5kb2JqCis0IDAgb2JqIDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KKyAgL1Jlc291cmNlcyA8PD4+Cis+PgorZW5kb2JqCis1IDAgb2JqIDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KKyAgL1Jlc291cmNlcyA8PD4+Cis+PgorZW5kb2JqCis2IDAgb2JqIDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KKyAgL1Jlc291cmNlcyA8PD4+CisgIC9Bbm5vdHMgWzcgMCBSIDkgMCBSXQorPj4KK2VuZG9iagorNyAwIG9iaiA8PAorICAvRlQgL1R4CisgIC9UeXBlIC9Bbm5vdAorICAvU3VidHlwZSAvV2lkZ2V0CisgIC9UICh0eHROYW1lMikKKyAgL0YgNAorICAvQVAgPDwvTiA4IDAgUj4+CisgIC9SZWN0IFsyMCAyMCA0MDAgNjBdCis+PgorZW5kb2JqCis4IDAgb2JqIDw8CisgIC9UeXBlIC9YT2JqZWN0CisgIC9TdWJ0eXBlIC9Gb3JtCisgIC9Gb3JtVHlwZSAxCis+PgorZW5kb2JqCis5IDAgb2JqIDw8CisgIC9GVCAvVHgKKyAgL1R5cGUgL0Fubm90CisgIC9TdWJ0eXBlIC9XaWRnZXQKKyAgL1QgKHR4dE5hbWUxKQorICAvRiA0CisgIC9BUCA8PC9OIDEwIDAgUj4+CisgIC9SZWN0IFsyMDAgMjAwIDQwMCAyNjBdCis+PgorZW5kb2JqCisxMCAwIG9iaiA8PAorICAvVHlwZSAvWE9iamVjdAorICAvU3VidHlwZSAvRm9ybQorICAvRm9ybVR5cGUgMQorPj4KK2VuZG9iagorMTEgMCBvYmogPDwKKyAgL1dDIDEyIDAgUgorPj4KK2VuZG9iagorMTIgMCBvYmogPDwKKyAgL1R5cGUgL0FjdGlvbgorICAvUyAvSmF2YVNjcmlwdAorICAvSlMgMTMgMCBSCis+PgorZW5kb2JqCisxMyAwIG9iaiA8PD4+CitzdHJlYW0KK3QgPSB0aGlzLmdldEZpZWxkKCd0eHROYW1lMicpOwordC5zZXRGb2N1cygpOworZW5kc3RyZWFtCitlbmRvYmoKK3hyZWYKKzAgMTQKKzAwMDAwMDAwMDAgNjU1MzUgZiAKKzAwMDAwMDAwMTUgMDAwMDAgbiAKKzAwMDAwMDAwOTkgMDAwMDAgbiAKKzAwMDAwMDAxNzUgMDAwMDAgbiAKKzAwMDAwMDAyMzQgMDAwMDAgbiAKKzAwMDAwMDAzMjkgMDAwMDAgbiAKKzAwMDAwMDA0MjQgMDAwMDAgbiAKKzAwMDAwMDA1NDMgMDAwMDAgbiAKKzAwMDAwMDA2NzMgMDAwMDAgbiAKKzAwMDAwMDA3NDIgMDAwMDAgbiAKKzAwMDAwMDA4NzYgMDAwMDAgbiAKKzAwMDAwMDA5NDYgMDAwMDAgbiAKKzAwMDAwMDA5ODEgMDAwMDAgbiAKKzAwMDAwMDEwNDkgMDAwMDAgbiAKK3RyYWlsZXIgPDwKKyAgL1NpemUgMTQKKyAgL1Jvb3QgMSAwIFIKKz4+CitzdGFydHhyZWYKKzExMzIKKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9idWdfeHJlZnY0X2xvb3AucGRmIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnX3hyZWZ2NF9sb29wLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTE2OTc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnX3hyZWZ2NF9sb29wLnBkZgpAQCAtMCwwICsxLDQ1IEBACislUERGLTEuNworJaDypPQKKzEgMCBvYmogPDwKKyAgL1R5cGUgL0NhdGFsb2cKKyAgL1BhZ2VzIDIgMCBSCis+PgorZW5kb2JqCisyIDAgb2JqIDw8CisgIC9UeXBlIC9QYWdlcworICAvQ291bnQgMQorICAvS2lkcyBbCisgICAgMyAwIFIKKyAgXQorPj4KK2VuZG9iagorMyAwIG9iaiA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCis+PgorZW5kb2JqCit4cmVmCiswIDIKKzAwMDAwMDAwMDAgNjU1MzUgZiAKKzAwMDAwMDAwMTUgMDAwMDAgbiAKK3RyYWlsZXIgPDwKKyAgL1ByZXYgMzQ2Cis+PgoreHJlZgorMiAxCiswMDAwMDAwMDY4IDAwMDAwIG4gCit0cmFpbGVyIDw8CisgIC9QcmV2IDIxNgorPj4KK3hyZWYKKzMgMQorMDAwMDAwMDEzOSAwMDAwMCBuIAordHJhaWxlciA8PAorICAvU2l6ZSA0CisgIC9QcmV2IDI5MQorICAvUm9vdCAxIDAgUgorPj4KK3N0YXJ0eHJlZgorMzQ2CislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvZmVhdHVyZV9saW5lYXJpemVkX2xvYWRpbmcucGRmIGIvdGVzdGluZy9yZXNvdXJjZXMvZmVhdHVyZV9saW5lYXJpemVkX2xvYWRpbmcucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OTk1YzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9mZWF0dXJlX2xpbmVhcml6ZWRfbG9hZGluZy5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9hcHBfYWxlcnQuaW4gYi90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2FwcF9hbGVydC5pbgppbmRleCA0MmY5NzBhLi5kZTZjOGE4IDEwMDY0NAotLS0gYS90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2FwcF9hbGVydC5pbgorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2FwcF9hbGVydC5pbgpAQCAtMzQsNyArMzQsNyBAQAoge3tvYmplY3QgMTEgMH19IDw8CiA+Pgogc3RyZWFtCi1hcHAuYWxlcnQoIlRoaXMgdGVzdCBwYXNzZXMgaWYgYWxlcnQoKSBsb2dzIG91dHB1dCB1bmRlciB0aGUgdGVzdCB1dGlsdGl5LiIpOworYXBwLmFsZXJ0KCJUaGlzIHRlc3QgcGFzc2VzIGlmIGFsZXJ0KCkgbG9ncyBvdXRwdXQgdW5kZXIgdGhlIHRlc3QgdXRpbGl0eS4iKTsKIGVuZHN0cmVhbQogZW5kb2JqCiB7e3hyZWZ9fQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9hcHBfYWxlcnRfZXhwZWN0ZWQudHh0IGIvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9hcHBfYWxlcnRfZXhwZWN0ZWQudHh0CmluZGV4IGFjNDZiNjIuLjkxMjA1YmMgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvYXBwX2FsZXJ0X2V4cGVjdGVkLnR4dAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2FwcF9hbGVydF9leHBlY3RlZC50eHQKQEAgLTEgKzEgQEAKLUFsZXJ0OiBUaGlzIHRlc3QgcGFzc2VzIGlmIGFsZXJ0KCkgbG9ncyBvdXRwdXQgdW5kZXIgdGhlIHRlc3QgdXRpbHRpeS4KK0FsZXJ0OiBUaGlzIHRlc3QgcGFzc2VzIGlmIGFsZXJ0KCkgbG9ncyBvdXRwdXQgdW5kZXIgdGhlIHRlc3QgdXRpbGl0eS4KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvYXBwX3Byb3BzLmluIGIvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9hcHBfcHJvcHMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk1MTFiMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvYXBwX3Byb3BzLmluCkBAIC0wLDAgKzEsMTI0IEBACit7e2hlYWRlcn19Cit7e29iamVjdCAxIDB9fSA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKyAgL09wZW5BY3Rpb24gMTAgMCBSCis+PgorZW5kb2JqCit7e29iamVjdCAyIDB9fSA8PAorICAvVHlwZSAvUGFnZXMKKyAgL0NvdW50IDQKKyAgL0tpZHMgWworICAgIDMgMCBSCisgICAgNCAwIFIKKyAgICA1IDAgUgorICAgIDYgMCBSCisgIF0KKz4+CitlbmRvYmoKKyUgUGFnZSBudW1iZXIgMC4KK3t7b2JqZWN0IDMgMH19IDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL1Jlc291cmNlcyA8PAorICAgIC9Gb250IDw8L0YxIDE1IDAgUj4+CisgID4+CisgIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCis+PgorJSBQYWdlIG51bWJlciAxLgore3tvYmplY3QgNCAwfX0gPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvUmVzb3VyY2VzIDw8CisgICAgL0ZvbnQgPDwvRjEgMTUgMCBSPj4KKyAgPj4KKyAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KKz4+CislIFBhZ2UgbnVtYmVyIDIuCit7e29iamVjdCA1IDB9fSA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgPDwKKyAgICAvRm9udCA8PC9GMSAxNSAwIFI+PgorICA+PgorICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQorPj4KKyUgUGFnZSBudW1iZXIgMy4KK3t7b2JqZWN0IDYgMH19IDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL1Jlc291cmNlcyA8PAorICAgIC9Gb250IDw8L0YxIDE1IDAgUj4+CisgID4+CisgIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCis+PgorCislIEluZm8KK3t7b2JqZWN0IDkgMH19IDw8CisgIC9BdXRob3IgKEpvZSBSYW5kb20gQXV0aG9yKQorICAvQ3JlYXRvciAoSm9lIFJhbmRvbSBDcmVhdG9yKQorPj4KK2VuZG9iagorJSBPcGVuQWN0aW9uIGFjdGlvbgore3tvYmplY3QgMTAgMH19IDw8CisgIC9UeXBlIC9BY3Rpb24KKyAgL1MgL0phdmFTY3JpcHQKKyAgL0pTIDExIDAgUgorPj4KK2VuZG9iagorJSBKUyBwcm9ncmFtIHRvIGV4ZXh1dGUKK3t7b2JqZWN0IDExIDB9fSA8PAorPj4KK3N0cmVhbQordmFyIGFwcF9wcm9wcyA9IFsKKyAgJ2FjdGl2ZURvY3MnLAorICAnY2FsY3VsYXRlJywKKyAgJ2Zvcm1zVmVyc2lvbicsCisgICdmcycsCisgICdmdWxsc2NyZWVuJywKKyAgJ2xhbmd1YWdlJywKKyAgJ21lZGlhJywKKyAgJ3BsYXRmb3JtJywKKyAgJ3J1bnRpbWVIaWdobGlnaHQnLAorICAndmlld2VyVHlwZScsCisgICd2aWV3ZXJWYXJpYXRpb24nLAorICAndmlld2VyVmVyc2lvbicKK107CisKK2Z1bmN0aW9uIHRlc3RHZXRQcm9wcyhwcm9wcykgeworICBhcHAuYWxlcnQoJyoqKiBHZXR0aW5nIHByb3BlcnRpZXMgKioqJyk7CisgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyArK2kpIHsKKyAgICB0cnkgeworICAgICAgdmFyIGV4cHIxID0gImFwcC4iICsgcHJvcHNbaV07CisgICAgICB2YXIgZXhwcjIgPSAidHlwZW9mICIgKyBleHByMTsKKyAgICAgIGFwcC5hbGVydChleHByMSArICIgaXMgIiArIGV2YWwoZXhwcjIpICsgJyAnICsgZXZhbChleHByMSkpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIGFwcC5hbGVydCgiRVJST1I6ICIgKyBlLnRvU3RyaW5nKCkpOworICAgIH0KKyAgfQorfQorCitmdW5jdGlvbiB0ZXN0U2V0UHJvcHMocHJvcHMpIHsKKyAgYXBwLmFsZXJ0KCcqKiogU2V0dGluZyBwcm9wZXJ0aWVzICoqKicpOworICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgKytpKSB7CisgICAgdHJ5IHsKKyAgICAgIHZhciBleHByMSA9ICJhcHAuIiArIHByb3BzW2ldICsgJyA9IDM7JworICAgICAgYXBwLmFsZXJ0KGV4cHIxICsgIiB5aWVsZHMgIiArIGV2YWwoZXhwcjEpKTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgICBhcHAuYWxlcnQoIkVSUk9SOiAiICsgZS50b1N0cmluZygpKTsKKyAgICB9CisgIH0KK30KKwordGVzdEdldFByb3BzKGFwcF9wcm9wcyk7Cit0ZXN0U2V0UHJvcHMoYXBwX3Byb3BzKTsKK3Rlc3RHZXRQcm9wcyhhcHBfcHJvcHMpOworZW5kc3RyZWFtCitlbmRvYmoKK3t7eHJlZn19Cit0cmFpbGVyIDw8CisgIC9Sb290IDEgMCBSCisgIC9JbmZvIDkgMCBSCis+Pgore3tzdGFydHhyZWZ9fQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvYXBwX3Byb3BzX2V4cGVjdGVkLnR4dCBiL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvYXBwX3Byb3BzX2V4cGVjdGVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTdlMGY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9hcHBfcHJvcHNfZXhwZWN0ZWQudHh0CkBAIC0wLDAgKzEsMzkgQEAKK0FsZXJ0OiAqKiogR2V0dGluZyBwcm9wZXJ0aWVzICoqKgorQWxlcnQ6IGFwcC5hY3RpdmVEb2NzIGlzIG9iamVjdCBbb2JqZWN0IGdsb2JhbF0KK0FsZXJ0OiBhcHAuY2FsY3VsYXRlIGlzIGJvb2xlYW4gdHJ1ZQorQWxlcnQ6IGFwcC5mb3Jtc1ZlcnNpb24gaXMgbnVtYmVyIDcKK0FsZXJ0OiBFUlJPUjogYXBwLmZzOiAKK0FsZXJ0OiBFUlJPUjogYXBwLmZ1bGxzY3JlZW46IAorQWxlcnQ6IGFwcC5sYW5ndWFnZSBpcyBzdHJpbmcgRU5VCitBbGVydDogRVJST1I6IGFwcC5tZWRpYTogCitBbGVydDogYXBwLnBsYXRmb3JtIGlzIHN0cmluZyBXSU4KK0FsZXJ0OiBhcHAucnVudGltZUhpZ2hsaWdodCBpcyBib29sZWFuIGZhbHNlCitBbGVydDogYXBwLnZpZXdlclR5cGUgaXMgc3RyaW5nIHBkZml1bQorQWxlcnQ6IGFwcC52aWV3ZXJWYXJpYXRpb24gaXMgc3RyaW5nIEZ1bGwKK0FsZXJ0OiBhcHAudmlld2VyVmVyc2lvbiBpcyBudW1iZXIgOAorQWxlcnQ6ICoqKiBTZXR0aW5nIHByb3BlcnRpZXMgKioqCitBbGVydDogRVJST1I6IGFwcC5hY3RpdmVEb2NzOiAKK0FsZXJ0OiBhcHAuY2FsY3VsYXRlID0gMzsgeWllbGRzIDMKK0FsZXJ0OiBFUlJPUjogYXBwLmZvcm1zVmVyc2lvbjogCitBbGVydDogRVJST1I6IGFwcC5mczogCitBbGVydDogRVJST1I6IGFwcC5mdWxsc2NyZWVuOiAKK0FsZXJ0OiBFUlJPUjogYXBwLmxhbmd1YWdlOiAKK0FsZXJ0OiBFUlJPUjogYXBwLm1lZGlhOiAKK0FsZXJ0OiBFUlJPUjogYXBwLnBsYXRmb3JtOiAKK0FsZXJ0OiBhcHAucnVudGltZUhpZ2hsaWdodCA9IDM7IHlpZWxkcyAzCitBbGVydDogRVJST1I6IGFwcC52aWV3ZXJUeXBlOiAKK0FsZXJ0OiBFUlJPUjogYXBwLnZpZXdlclZhcmlhdGlvbjogCitBbGVydDogRVJST1I6IGFwcC52aWV3ZXJWZXJzaW9uOiAKK0FsZXJ0OiAqKiogR2V0dGluZyBwcm9wZXJ0aWVzICoqKgorQWxlcnQ6IGFwcC5hY3RpdmVEb2NzIGlzIG9iamVjdCBbb2JqZWN0IGdsb2JhbF0KK0FsZXJ0OiBhcHAuY2FsY3VsYXRlIGlzIGJvb2xlYW4gdHJ1ZQorQWxlcnQ6IGFwcC5mb3Jtc1ZlcnNpb24gaXMgbnVtYmVyIDcKK0FsZXJ0OiBFUlJPUjogYXBwLmZzOiAKK0FsZXJ0OiBFUlJPUjogYXBwLmZ1bGxzY3JlZW46IAorQWxlcnQ6IGFwcC5sYW5ndWFnZSBpcyBzdHJpbmcgRU5VCitBbGVydDogRVJST1I6IGFwcC5tZWRpYTogCitBbGVydDogYXBwLnBsYXRmb3JtIGlzIHN0cmluZyBXSU4KK0FsZXJ0OiBhcHAucnVudGltZUhpZ2hsaWdodCBpcyBib29sZWFuIHRydWUKK0FsZXJ0OiBhcHAudmlld2VyVHlwZSBpcyBzdHJpbmcgcGRmaXVtCitBbGVydDogYXBwLnZpZXdlclZhcmlhdGlvbiBpcyBzdHJpbmcgRnVsbAorQWxlcnQ6IGFwcC52aWV3ZXJWZXJzaW9uIGlzIG51bWJlciA4CmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2FwcGx5LmluIGIvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9hcHBseS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzQyYzFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9hcHBseS5pbgpAQCAtMCwwICsxLDc1IEBACit7e2hlYWRlcn19Cit7e29iamVjdCAxIDB9fSA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKyAgL09wZW5BY3Rpb24gMTAgMCBSCis+PgorZW5kb2JqCit7e29iamVjdCAyIDB9fSA8PAorICAvVHlwZSAvUGFnZXMKKyAgL0NvdW50IDEKKyAgL0tpZHMgWworICAgIDMgMCBSCisgIF0KKz4+CitlbmRvYmoKKyUgUGFnZSBudW1iZXIgMC4KK3t7b2JqZWN0IDMgMH19IDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL1Jlc291cmNlcyA8PAorICAgIC9Gb250IDw8L0YxIDE1IDAgUj4+CisgID4+CisgIC9Db250ZW50cyBbMjEgMCBSXQorICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQorPj4KKyUgT3BlbkFjdGlvbiBhY3Rpb24KK3t7b2JqZWN0IDEwIDB9fSA8PAorICAvVHlwZSAvQWN0aW9uCisgIC9TIC9KYXZhU2NyaXB0CisgIC9KUyAxMSAwIFIKKz4+CitlbmRvYmoKKyUgSlMgcHJvZ3JhbSB0byBleGV4dXRlCit7e29iamVjdCAxMSAwfX0gPDwKKz4+CitzdHJlYW0KK2FwcC5hbGVydCgnQXBwbHlpbmcgdG8gdXRpbCBpdHNlbGYgLSBzaG91bGQgc3VjY2VlZCcpOwordHJ5IHsKKyAgYXBwLmFsZXJ0KHV0aWwuYnl0ZVRvQ2hhci5hcHBseSh1dGlsLCBbNjVdKSk7Cit9CitjYXRjaCAoZSkgeworICBhcHAuYWxlcnQoJ0NhdWdodDogJyArIGUpOworfQorCithcHAuYWxlcnQoJ0FwcGx5aW5nIHRvIGFycmF5IC0gc2hvdWxkIHRocm93Jyk7Cit0cnkgeworICBhcHAuYWxlcnQodXRpbC5ieXRlVG9DaGFyLmFwcGx5KFtdLCBbNjVdKSk7Cit9CitjYXRjaCAoZSkgeworICBhcHAuYWxlcnQoJ0NhdWdodDogJyArIGUpOworfQorCithcHAuYWxlcnQoJ0FwcGx5aW5nIHRvIG51bWJlciAtIHNob3VsZCB0aHJvdycpOwordHJ5IHsKKyAgYXBwLmFsZXJ0KHV0aWwuYnl0ZVRvQ2hhci5hcHBseSg3LCBbNjVdKSk7Cit9CitjYXRjaCAoZSkgeworICBhcHAuYWxlcnQoJ0NhdWdodDogJyArIGUpOworfQorCithcHAuYWxlcnQoJ0FwcGx5aW5nIHRvIHdyb25nIG5hdGl2ZSBvYmogLSBzaG91bGQgdGhyb3cnKTsKK3RyeSB7CisgIGFwcC5hbGVydCh1dGlsLmJ5dGVUb0NoYXIuYXBwbHkoYXBwLCBbNjVdKSk7Cit9CitjYXRjaCAoZSkgeworICBhcHAuYWxlcnQoJ0NhdWdodDogJyArIGUpOworfQorZW5kc3RyZWFtCitlbmRvYmoKK3t7eHJlZn19Cit0cmFpbGVyIDw8CisgIC9Sb290IDEgMCBSCis+Pgore3tzdGFydHhyZWZ9fQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvYXBwbHlfZXhwZWN0ZWQudHh0IGIvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9hcHBseV9leHBlY3RlZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUwNjc2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvYXBwbHlfZXhwZWN0ZWQudHh0CkBAIC0wLDAgKzEsOCBAQAorQWxlcnQ6IEFwcGx5aW5nIHRvIHV0aWwgaXRzZWxmIC0gc2hvdWxkIHN1Y2NlZWQKK0FsZXJ0OiBBCitBbGVydDogQXBwbHlpbmcgdG8gYXJyYXkgLSBzaG91bGQgdGhyb3cKK0FsZXJ0OiBDYXVnaHQ6IFR5cGVFcnJvcjogSWxsZWdhbCBpbnZvY2F0aW9uCitBbGVydDogQXBwbHlpbmcgdG8gbnVtYmVyIC0gc2hvdWxkIHRocm93CitBbGVydDogQ2F1Z2h0OiBUeXBlRXJyb3I6IElsbGVnYWwgaW52b2NhdGlvbgorQWxlcnQ6IEFwcGx5aW5nIHRvIHdyb25nIG5hdGl2ZSBvYmogLSBzaG91bGQgdGhyb3cKK0FsZXJ0OiBDYXVnaHQ6IFR5cGVFcnJvcjogSWxsZWdhbCBpbnZvY2F0aW9uCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2J1Z18zNjEuaW4gYi90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2J1Z18zNjEuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmZGU3MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvYnVnXzM2MS5pbgpAQCAtMCwwICsxLDkxIEBACit7e2hlYWRlcn19Cit7e29iamVjdCAxIDB9fSA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKyAgL0Fjcm9Gb3JtIDQgMCBSCisgIC9PcGVuQWN0aW9uIDEwIDAgUgorPj4KK2VuZG9iagore3tvYmplY3QgMiAwfX0gPDwKKyAgL1R5cGUgL1BhZ2VzCisgIC9Db3VudCAxCisgIC9LaWRzIFsKKyAgICAzIDAgUgorICBdCis+PgorZW5kb2JqCislIFBhZ2UgbnVtYmVyIDAuCit7e29iamVjdCAzIDB9fSA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgPDwKKyAgICAvRm9udCA8PC9GMSAxNSAwIFI+PgorICA+PgorICAvQ29udGVudHMgWzIxIDAgUl0KKyAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KKz4+CislIEZvcm1zCit7e29iamVjdCA0IDB9fSA8PAorICAvRmllbGRzIFs1IDAgUl0KKz4+CislIEZpZWxkCit7e29iamVjdCA1IDB9fSA8PAorIC9GVCAvVHgKKyAvVCAoTXlGaWVsZCkKKz4+CislIE9wZW5BY3Rpb24gYWN0aW9uCit7e29iamVjdCAxMCAwfX0gPDwKKyAgL1R5cGUgL0FjdGlvbgorICAvUyAvSmF2YVNjcmlwdAorICAvSlMgMTEgMCBSCis+PgorZW5kb2JqCislIEpTIHByb2dyYW0gdG8gZXhleHV0ZQore3tvYmplY3QgMTEgMH19IDw8Cis+Pgorc3RyZWFtCitmdW5jdGlvbiB0ZXN0RmllbGQoeCkgeworICB2YXIgZmllbGQgPSB0aGlzLmdldEZpZWxkKCJNeUZpZWxkIik7CisgIGZpZWxkLnZhbHVlID0geDsKKyAgdmFyIHkgPSBmaWVsZC52YWx1ZTsKKyAgYXBwLmFsZXJ0KCJBbnN3ZXIgZm9yIFwiIiArIHggKyAiXCIgaXM6ICIgKyB0eXBlb2YoeSkgKyAiICIgKyB5KTsKK30KK3Rlc3RGaWVsZCgiZ29hdHMiKTsKK3Rlc3RGaWVsZCgiYjQiKTsKK3Rlc3RGaWVsZCgiYjQuNSIpOwordGVzdEZpZWxkKCI0eCIpOwordGVzdEZpZWxkKCI0LjV4Iik7Cit0ZXN0RmllbGQoIjQiKTsKK3Rlc3RGaWVsZCgiIDQiKTsKK3Rlc3RGaWVsZCgiNCAiKTsKK3Rlc3RGaWVsZCgiICAgICAgICAgICAgICAgICAgICAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKK3Rlc3RGaWVsZCgiNCAzIDIgMSIpOwordGVzdEZpZWxkKCItNCIpOwordGVzdEZpZWxkKCIyMy4wMDAwMDAwMSIpOwordGVzdEZpZWxkKCIyMy4wMDAwMDAwMDAwMDAwMDAwMSIpOwordGVzdEZpZWxkKCIyNSw1Iik7Cit0ZXN0RmllbGQoIjFlKzUiKTsKK3Rlc3RGaWVsZCgiMWU1Iik7Cit0ZXN0RmllbGQoIjFlLTUiKTsKK3Rlc3RGaWVsZCgiLTFlLTUiKTsKK3Rlc3RGaWVsZCgiMS4yZTUiKTsKK3Rlc3RGaWVsZCgiTkFOIik7Cit0ZXN0RmllbGQoIklORiIpOwordGVzdEZpZWxkKCIweDEwMCIpOwordGVzdEZpZWxkKCIxMjN4NiIpOwordGVzdEZpZWxkKCIxMjN4eTYiKTsKK3Rlc3RGaWVsZCgiMTIzLnk2Iik7Cit0ZXN0RmllbGQoIjEsMDAwLDAwMCIpOwordGVzdEZpZWxkKCIxLjIuMyIpOwordGVzdEZpZWxkKCIxLTMiKTsKK3Rlc3RGaWVsZCgiMSszIik7Cit0ZXN0RmllbGQoIjEuLTMiKTsKK3Rlc3RGaWVsZCgiMS4rMyIpOworZW5kc3RyZWFtCitlbmRvYmoKK3t7eHJlZn19Cit0cmFpbGVyIDw8CisgIC9Sb290IDEgMCBSCis+Pgore3tzdGFydHhyZWZ9fQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvYnVnXzM2MV9leHBlY3RlZC50eHQgYi90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2J1Z18zNjFfZXhwZWN0ZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZmQ3OTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2J1Z18zNjFfZXhwZWN0ZWQudHh0CkBAIC0wLDAgKzEsMzEgQEAKK0FsZXJ0OiBBbnN3ZXIgZm9yICJnb2F0cyIgaXM6IHN0cmluZyBnb2F0cworQWxlcnQ6IEFuc3dlciBmb3IgImI0IiBpczogc3RyaW5nIGI0CitBbGVydDogQW5zd2VyIGZvciAiYjQuNSIgaXM6IHN0cmluZyBiNC41CitBbGVydDogQW5zd2VyIGZvciAiNHgiIGlzOiBzdHJpbmcgNHgKK0FsZXJ0OiBBbnN3ZXIgZm9yICI0LjV4IiBpczogc3RyaW5nIDQuNXgKK0FsZXJ0OiBBbnN3ZXIgZm9yICI0IiBpczogbnVtYmVyIDQKK0FsZXJ0OiBBbnN3ZXIgZm9yICIgNCIgaXM6IG51bWJlciA0CitBbGVydDogQW5zd2VyIGZvciAiNCAiIGlzOiBudW1iZXIgNAorQWxlcnQ6IEFuc3dlciBmb3IgIiAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpczogbnVtYmVyIDQKK0FsZXJ0OiBBbnN3ZXIgZm9yICI0IDMgMiAxIiBpczogc3RyaW5nIDQgMyAyIDEKK0FsZXJ0OiBBbnN3ZXIgZm9yICItNCIgaXM6IG51bWJlciAtNAorQWxlcnQ6IEFuc3dlciBmb3IgIjIzLjAwMDAwMDAxIiBpczogbnVtYmVyIDIzLjAwMDAwMDAxCitBbGVydDogQW5zd2VyIGZvciAiMjMuMDAwMDAwMDAwMDAwMDAwMDEiIGlzOiBudW1iZXIgMAorQWxlcnQ6IEFuc3dlciBmb3IgIjI1LDUiIGlzOiBudW1iZXIgMjUuNQorQWxlcnQ6IEFuc3dlciBmb3IgIjFlKzUiIGlzOiBudW1iZXIgMTAwMDAwCitBbGVydDogQW5zd2VyIGZvciAiMWU1IiBpczogbnVtYmVyIDEKK0FsZXJ0OiBBbnN3ZXIgZm9yICIxZS01IiBpczogbnVtYmVyIDAuMDAwMDEKK0FsZXJ0OiBBbnN3ZXIgZm9yICItMWUtNSIgaXM6IG51bWJlciAtMC4wMDAwMQorQWxlcnQ6IEFuc3dlciBmb3IgIjEuMmU1IiBpczogbnVtYmVyIDEuMgorQWxlcnQ6IEFuc3dlciBmb3IgIk5BTiIgaXM6IHN0cmluZyBOQU4KK0FsZXJ0OiBBbnN3ZXIgZm9yICJJTkYiIGlzOiBzdHJpbmcgSU5GCitBbGVydDogQW5zd2VyIGZvciAiMHgxMDAiIGlzOiBzdHJpbmcgMHgxMDAKK0FsZXJ0OiBBbnN3ZXIgZm9yICIxMjN4NiIgaXM6IHN0cmluZyAxMjN4NgorQWxlcnQ6IEFuc3dlciBmb3IgIjEyM3h5NiIgaXM6IHN0cmluZyAxMjN4eTYKK0FsZXJ0OiBBbnN3ZXIgZm9yICIxMjMueTYiIGlzOiBzdHJpbmcgMTIzLnk2CitBbGVydDogQW5zd2VyIGZvciAiMSwwMDAsMDAwIiBpczogbnVtYmVyIDEKK0FsZXJ0OiBBbnN3ZXIgZm9yICIxLjIuMyIgaXM6IG51bWJlciAxLjIKK0FsZXJ0OiBBbnN3ZXIgZm9yICIxLTMiIGlzOiBzdHJpbmcgMS0zCitBbGVydDogQW5zd2VyIGZvciAiMSszIiBpczogc3RyaW5nIDErMworQWxlcnQ6IEFuc3dlciBmb3IgIjEuLTMiIGlzOiBzdHJpbmcgMS4tMworQWxlcnQ6IEFuc3dlciBmb3IgIjEuKzMiIGlzOiBzdHJpbmcgMS4rMwpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9jb25zdHMuaW4gYi90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2NvbnN0cy5pbgppbmRleCAyZWQyMzlhLi5hNzE3ZWM4IDEwMDY0NAotLS0gYS90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2NvbnN0cy5pbgorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2NvbnN0cy5pbgpAQCAtMzYsMTIgKzM2LDM3IEBACiBzdHJlYW0KIAogZnVuY3Rpb24gZG9UZXN0KG5hbWUsIHByb3BzKSB7Ci0gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyArK2kpIHsKLSAgICB2YXIgZXhwciA9IG5hbWUgKyAiLiIgKyBwcm9wc1tpXTsKLSAgICBhcHAuYWxlcnQoZXhwciArICIgaXMgIiArIGV2YWwoZXhwcikpOworICB0cnkgeworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyArK2kpIHsKKyAgICAgIHZhciBleHByID0gbmFtZSArICIuIiArIHByb3BzW2ldOworICAgICAgYXBwLmFsZXJ0KGV4cHIgKyAiIGlzICIgKyBldmFsKGV4cHIpKTsKKyAgICB9CisgIH0gY2F0Y2ggKGUpIHsKKyAgICBhcHAuYWxlcnQoIkVSUk9SOiAiICsgZS50b1N0cmluZygpKTsKICAgfQogfQogCitmdW5jdGlvbiBkb0dsb2JhbFRlc3QocHJvcHMpIHsKKyAgdHJ5IHsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgKytpKSB7CisgICAgICBhcHAuYWxlcnQocHJvcHNbaV0gKyAiIGlzICIgKyBldmFsKHByb3BzW2ldKSk7CisgICAgfQorICB9IGNhdGNoIChlKSB7CisgICAgYXBwLmFsZXJ0KCJFUlJPUjogIiArIGUudG9TdHJpbmcoKSk7CisgIH0KK30KKworZnVuY3Rpb24gZG9HbG9iYWxBcnJheVRlc3QocHJvcHMpIHsKKyAgdHJ5IHsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgKytpKSB7CisgICAgICBhcHAuYWxlcnQocHJvcHNbaV0gKyAiIGlzXG4gICIgKyBldmFsKHByb3BzW2ldKS5qb2luKCIsXG4gICIpKTsKKyAgICB9CisgIH0gY2F0Y2ggKGUpIHsKKyAgICBhcHAuYWxlcnQoIkVSUk9SOiAiICsgZS50b1N0cmluZygpKTsKKyAgfQorfQorCisKIHRyeSB7CiAgIGRvVGVzdCgiYm9yZGVyIiwgWyJzIiwgImIiLCAiZCIsICJpIiwgInUiLCAibm9uZXN1Y2giXSk7CiAgIGRvVGVzdCgiZGlzcGxheSIsIFsidmlzaWJsZSIsICJoaWRkZW4iLCAibm9QcmludCIsICJub1ZpZXciLCAibm9uZXN1Y2giXSk7CkBAIC01OCw2ICs4MywzNSBAQAogICBkb1Rlc3QoInN0eWxlIiwgWyJjaCIsICJjciIsICJkaSIsICJjaSIsICJzdCIsICJzcSIsICJub25lc3VjaCJdKTsKICAgZG9UZXN0KCJ6b29tdHlwZSIsIFsibm9uZSIsICJmaXRQIiwgImZpdFciLCAiZml0SCIsICJmaXRWIiwgInByZWYiLCAicmVmVyIsCiAgICAgICAgICAgICAgICAgICAgICAgIm5vbmVzdWNoIl0pOworCisgIGRvR2xvYmFsVGVzdChbCisgICAgIklEU19HUkVBVEVSX1RIQU4iLAorICAgICJJRFNfR1RfQU5EX0xUIiwKKyAgICAiSURTX0xFU1NfVEhBTiIsCisgICAgIklEU19JTlZBTElEX01PTlRIIiwKKyAgICAiSURTX0lOVkFMSURfREFURSIsCisgICAgIklEU19JTlZBTElEX1ZBTFVFIiwKKyAgICAiSURTX0FNIiwKKyAgICAiSURTX1BNIiwKKyAgICAiSURTX01PTlRIX0lORk8iLAorICAgICJJRFNfU1RBUlRVUF9DT05TT0xFX01TRyIKKyAgXSk7CisKKyAgZG9HbG9iYWxBcnJheVRlc3QoWworICAgICJSRV9OVU1CRVJfRU5UUllfRE9UX1NFUCIsCisgICAgIlJFX05VTUJFUl9DT01NSVRfRE9UX1NFUCIsCisgICAgIlJFX05VTUJFUl9FTlRSWV9DT01NQV9TRVAiLAorICAgICJSRV9OVU1CRVJfQ09NTUlUX0NPTU1BX1NFUCIsCisgICAgIlJFX1pJUF9FTlRSWSIsCisgICAgIlJFX1pJUF9DT01NSVQiLAorICAgICJSRV9aSVA0X0VOVFJZIiwKKyAgICAiUkVfWklQNF9DT01NSVQiLAorICAgICJSRV9QSE9ORV9FTlRSWSIsCisgICAgIlJFX1BIT05FX0NPTU1JVCIsCisgICAgIlJFX1NTTl9FTlRSWSIsCisgICAgIlJFX1NTTl9DT01NSVQiCisgIF0pOworCiB9IGNhdGNoIChlKSB7CiAgIGFwcC5hbGVydCgiRVJST1I6ICIgKyBlLnRvU3RyaW5nKCkpOwogfQpAQCAtNjksMyArMTIzLDQgQEAKID4+CiB7e3N0YXJ0eHJlZn19CiAlJUVPRgorCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2NvbnN0c19leHBlY3RlZC50eHQgYi90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2NvbnN0c19leHBlY3RlZC50eHQKaW5kZXggYzMyZDQ4MC4uNDQ3NmM2MiAxMDA2NDQKLS0tIGEvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9jb25zdHNfZXhwZWN0ZWQudHh0CisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvY29uc3RzX2V4cGVjdGVkLnR4dApAQCAtNjAsMyArNjAsNDkgQEAKIEFsZXJ0OiB6b29tdHlwZS5wcmVmIGlzIFByZWZlcnJlZAogQWxlcnQ6IHpvb210eXBlLnJlZlcgaXMgUmVmbG93V2lkdGgKIEFsZXJ0OiB6b29tdHlwZS5ub25lc3VjaCBpcyB1bmRlZmluZWQKK0FsZXJ0OiBJRFNfR1JFQVRFUl9USEFOIGlzIEludmFsaWQgdmFsdWU6IG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICUgcy4KK0FsZXJ0OiBJRFNfR1RfQU5EX0xUIGlzIEludmFsaWQgdmFsdWU6IG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICUgcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICUgcy4KK0FsZXJ0OiBJRFNfTEVTU19USEFOIGlzIEludmFsaWQgdmFsdWU6IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICUgcy4KK0FsZXJ0OiBJRFNfSU5WQUxJRF9NT05USCBpcyAqKkludmFsaWQqKgorQWxlcnQ6IElEU19JTlZBTElEX0RBVEUgaXMgSW52YWxpZCBkYXRlIC8gdGltZTogcGxlYXNlIGVuc3VyZSB0aGF0IHRoZSBkYXRlIC8gdGltZSBleGlzdHMuRmllbGQKK0FsZXJ0OiBJRFNfSU5WQUxJRF9WQUxVRSBpcyBUaGUgdmFsdWUgZW50ZXJlZCBkb2VzIG5vdCBtYXRjaCB0aGUgZm9ybWF0IG9mIHRoZSBmaWVsZAorQWxlcnQ6IElEU19BTSBpcyBhbQorQWxlcnQ6IElEU19QTSBpcyBwbQorQWxlcnQ6IElEU19NT05USF9JTkZPIGlzIEphbnVhcnlbMV0gRmVicnVhcnlbMl0gTWFyY2hbM10gQXByaWxbNF0gTWF5WzVdIEp1bmVbNl0gSnVseVs3XSBBdWd1c3RbOF0gU2VwdGVtYmVyWzldIE9jdG9iZXJbMTBdIE5vdmVtYmVyWzExXSBEZWNlbWJlclsxMl0gU2VwdFs5XSBKYW5bMV0gRmViWzJdIE1hclszXSBBcHJbNF0gSnVuWzZdIEp1bFs3XSBBdWdbOF0gU2VwWzldIE9jdFsxMF0gTm92WzExXSBEZWNbMTJdCitBbGVydDogSURTX1NUQVJUVVBfQ09OU09MRV9NU0cgaXMgKiogXiBfIF4gKioKK0FsZXJ0OiBSRV9OVU1CRVJfRU5UUllfRE9UX1NFUCBpcworICBbKy1dP1xkKlwuP1xkKgorQWxlcnQ6IFJFX05VTUJFUl9DT01NSVRfRE9UX1NFUCBpcworICBbKy1dP1xkKyhcLlxkKyk/LAorICBbKy1dP1wuXGQrLAorICBbKy1dP1xkK1wuCitBbGVydDogUkVfTlVNQkVSX0VOVFJZX0NPTU1BX1NFUCBpcworICBbKy1dP1xkKiw/XGQqCitBbGVydDogUkVfTlVNQkVSX0NPTU1JVF9DT01NQV9TRVAgaXMKKyAgWystXT9cZCsoWy4sXVxkKyk/LAorICBbKy1dP1suLF1cZCssCisgIFsrLV0/XGQrWy4sXQorQWxlcnQ6IFJFX1pJUF9FTlRSWSBpcworICBcZHswLDV9CitBbGVydDogUkVfWklQX0NPTU1JVCBpcworICBcZHs1fQorQWxlcnQ6IFJFX1pJUDRfRU5UUlkgaXMKKyAgXGR7MCw1fShcLnxbLSBdKT9cZHswLDR9CitBbGVydDogUkVfWklQNF9DT01NSVQgaXMKKyAgXGR7NX0oXC58Wy0gXSk/XGR7NH0KK0FsZXJ0OiBSRV9QSE9ORV9FTlRSWSBpcworICBcZHswLDN9KFwufFstIF0pP1xkezAsM30oXC58Wy0gXSk/XGR7MCw0fSwKKyAgXChcZHswLDN9LAorICBcKFxkezAsM31cKShcLnxbLSBdKT9cZHswLDN9KFwufFstIF0pP1xkezAsNH0sCisgIFwoXGR7MCwzfShcLnxbLSBdKT9cZHswLDN9KFwufFstIF0pP1xkezAsNH0sCisgIFxkezAsM31cKShcLnxbLSBdKT9cZHswLDN9KFwufFstIF0pP1xkezAsNH0sCisgIDAxMShcLnxbLSBcZF0pKgorQWxlcnQ6IFJFX1BIT05FX0NPTU1JVCBpcworICBcZHszfShcLnxbLSBdKT9cZHs0fSwKKyAgXGR7M30oXC58Wy0gXSk/XGR7M30oXC58Wy0gXSk/XGR7NH0sCisgIFwoXGR7M31cKShcLnxbLSBdKT9cZHszfShcLnxbLSBdKT9cZHs0fSwKKyAgMDExKFwufFstIFxkXSkqCitBbGVydDogUkVfU1NOX0VOVFJZIGlzCisgIFxkezAsM30oXC58Wy0gXSk/XGR7MCwyfShcLnxbLSBdKT9cZHswLDR9CitBbGVydDogUkVfU1NOX0NPTU1JVCBpcworICBcZHszfShcLnxbLSBdKT9cZHsyfShcLnxbLSBdKT9cZHs0fQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9kb2N1bWVudF9tZXRob2RzLmluIGIvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9kb2N1bWVudF9tZXRob2RzLmluCmluZGV4IDY2MmMwNWMuLjNjZDMzMzAgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvZG9jdW1lbnRfbWV0aG9kcy5pbgorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2RvY3VtZW50X21ldGhvZHMuaW4KQEAgLTEyMiw2ICsxMjIsNyBAQAogCiAgICAvLyBTZWNvbmQgYXJndW1lbnQgbXVzdCBhY3R1YWxseSBiZSBhbiBpY29uLgogICAgZXhwZWN0RXJyb3IoJ3RoaXMuYWRkSWNvbigibXlpY29uIiwgMyknKTsKKyAgIGV4cGVjdEVycm9yKCd0aGlzLmFkZEljb24oIm15aWNvbiIsIHVuZGVmaW5lZCknKTsKIAogICAgLy8gVE9ETyh0c2VwZXopOiB0ZXN0IHN1Y2Nlc3MgY2FzZXMuCiB9CkBAIC0xMzQsMTQgKzEzNSw2IEBACiAgICAvLyBUT0RPKHRzZXBleik6IHRlc3Qgc3VjY2VzcyBjYXNlcy4KIH0KIAotZnVuY3Rpb24gdGVzdERlbGV0ZVBhZ2VzKCkgewotICAgLy8gTWV0aG9kIGlzIHByZXNlbnQuCi0gICBleHBlY3QoJ3R5cGVvZiB0aGlzLmRlbGV0ZVBhZ2VzJywgJ2Z1bmN0aW9uJyk7Ci0KLSAgIC8vIFRPRE8odHNlcGV6KTogdGVzdCB3aXRoIG5vIHBlcm1pc3Npb25zLgotICAgLy8gVE9ETyh0c2VwZXopOiB0ZXN0IHN1Y2Nlc3MgY2FzZXMuCi19Ci0KIGZ1bmN0aW9uIHRlc3RHZXRGaWVsZCgpIHsKICAgIC8vIE1ldGhvZCBpcyBwcmVzZW50LgogICAgZXhwZWN0KCd0eXBlb2YgdGhpcy5nZXRGaWVsZCcsICdmdW5jdGlvbicpOwpAQCAtMjU1LDE2ICsyNDgsNiBAQAogICAvLyBUT0RPKHRzZXBleik6IHRlc3Qgc3VjY2VzcyBjYXNlcy4KIH0KIAotZnVuY3Rpb24gdGVzdFJlbW92ZUljb24oKSB7Ci0gICAvLyBNZXRob2QgaXMgcHJlc2VudC4KLSAgIGV4cGVjdCgndHlwZW9mIHRoaXMucmVtb3ZlSWNvbicsICdmdW5jdGlvbicpOwotCi0gIC8vIE1ldGhvZCByZXF1aXJlcyBhdCBsZWFzdCBvbmUgYXJndW1lbnQuCi0gIGV4cGVjdEVycm9yKCd0aGlzLnJlbW92ZUljb24oKScpOwotCi0gIC8vIFRPRE8odHNlcGV6KTogdGVzdCBzdWNjZXNzIGNhc2VzLgotfQotCiBmdW5jdGlvbiB0ZXN0UmVzZXRGb3JtKCkgewogICAgLy8gTWV0aG9kIGlzIHByZXNlbnQuCiAgICBleHBlY3QoJ3R5cGVvZiB0aGlzLnJlc2V0Rm9ybScsICdmdW5jdGlvbicpOwpAQCAtMjkwLDYgKzI3Myw3IEBACiAgIHRlc3RVbnN1cHBvcnRlZCgndGhpcy5hZGRMaW5rJyk7CiAgIHRlc3RVbnN1cHBvcnRlZCgndGhpcy5jbG9zZURvYycpOwogICB0ZXN0VW5zdXBwb3J0ZWQoJ3RoaXMuY3JlYXRlRGF0YU9iamVjdCcpOworICB0ZXN0VW5zdXBwb3J0ZWQoJ3RoaXMuZGVsZXRlUGFnZXMnKTsKICAgdGVzdFVuc3VwcG9ydGVkKCd0aGlzLmV4cG9ydEFzRkRGJyk7CiAgIHRlc3RVbnN1cHBvcnRlZCgndGhpcy5leHBvcnRBc1RleHQnKTsKICAgdGVzdFVuc3VwcG9ydGVkKCd0aGlzLmV4cG9ydEFzWEZERicpOwpAQCAtMzA1LDEzICsyODksMTMgQEAKICAgdGVzdFVuc3VwcG9ydGVkKCd0aGlzLmltcG9ydEFuWEZERicpOwogICB0ZXN0VW5zdXBwb3J0ZWQoJ3RoaXMuaW1wb3J0VGV4dERhdGEnKTsKICAgdGVzdFVuc3VwcG9ydGVkKCd0aGlzLmluc2VydFBhZ2VzJyk7CisgIHRlc3RVbnN1cHBvcnRlZCgndGhpcy5yZW1vdmVJY29uJyk7CiAgIHRlc3RVbnN1cHBvcnRlZCgndGhpcy5yZXBsYWNlUGFnZXMnKTsKICAgdGVzdFVuc3VwcG9ydGVkKCd0aGlzLnNhdmVBcycpOwogCiAgIGFwcC5hbGVydCgnKioqIFRlc3RpbmcgU3VwcG9ydGVkIE1ldGhvZHMgKioqJyk7CiAgIHRlc3RBZGRJY29uKCk7CiAgIHRlc3RDYWxjdWxhdGVOb3coKTsKLSAgdGVzdERlbGV0ZVBhZ2VzKCk7CiAgIHRlc3RHZXRGaWVsZCgpOwogICB0ZXN0R2V0SWNvbigpOwogICB0ZXN0R2V0TnRoRmllbGROYW1lKCk7CkBAIC0zMjMsNyArMzA3LDYgQEAKICAgdGVzdE1haWxGb3JtKCk7CiAgIHRlc3RQcmludCgpOwogICB0ZXN0UmVtb3ZlRmllbGQoKTsKLSAgdGVzdFJlbW92ZUljb24oKTsKICAgdGVzdFJlc2V0Rm9ybSgpOwogICB0ZXN0U3VibWl0Rm9ybSgpOwogfSBjYXRjaCAoZSkgewpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9kb2N1bWVudF9tZXRob2RzX2V4cGVjdGVkLnR4dCBiL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvZG9jdW1lbnRfbWV0aG9kc19leHBlY3RlZC50eHQKaW5kZXggNDQ1YjQ4ZC4uMjZmN2I1NCAxMDA2NDQKLS0tIGEvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9kb2N1bWVudF9tZXRob2RzX2V4cGVjdGVkLnR4dAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2RvY3VtZW50X21ldGhvZHNfZXhwZWN0ZWQudHh0CkBAIC0xNCw2ICsxNCw5IEBACiBBbGVydDogUEFTUzogdHlwZW9mIHRoaXMuY3JlYXRlRGF0YU9iamVjdCA9IGZ1bmN0aW9uCiBBbGVydDogUEFTUzogdGhpcy5jcmVhdGVEYXRhT2JqZWN0KCkgPSB1bmRlZmluZWQKIEFsZXJ0OiBQQVNTOiB0aGlzLmNyZWF0ZURhdGFPYmplY3QoMSwgMiwgImNsYW1zIiwgWzEsIDIsIDNdKSA9IHVuZGVmaW5lZAorQWxlcnQ6IFBBU1M6IHR5cGVvZiB0aGlzLmRlbGV0ZVBhZ2VzID0gZnVuY3Rpb24KK0FsZXJ0OiBQQVNTOiB0aGlzLmRlbGV0ZVBhZ2VzKCkgPSB1bmRlZmluZWQKK0FsZXJ0OiBQQVNTOiB0aGlzLmRlbGV0ZVBhZ2VzKDEsIDIsICJjbGFtcyIsIFsxLCAyLCAzXSkgPSB1bmRlZmluZWQKIEFsZXJ0OiBQQVNTOiB0eXBlb2YgdGhpcy5leHBvcnRBc0ZERiA9IGZ1bmN0aW9uCiBBbGVydDogUEFTUzogdGhpcy5leHBvcnRBc0ZERigpID0gdW5kZWZpbmVkCiBBbGVydDogUEFTUzogdGhpcy5leHBvcnRBc0ZERigxLCAyLCAiY2xhbXMiLCBbMSwgMiwgM10pID0gdW5kZWZpbmVkCkBAIC01OSw2ICs2Miw5IEBACiBBbGVydDogUEFTUzogdHlwZW9mIHRoaXMuaW5zZXJ0UGFnZXMgPSBmdW5jdGlvbgogQWxlcnQ6IFBBU1M6IHRoaXMuaW5zZXJ0UGFnZXMoKSA9IHVuZGVmaW5lZAogQWxlcnQ6IFBBU1M6IHRoaXMuaW5zZXJ0UGFnZXMoMSwgMiwgImNsYW1zIiwgWzEsIDIsIDNdKSA9IHVuZGVmaW5lZAorQWxlcnQ6IFBBU1M6IHR5cGVvZiB0aGlzLnJlbW92ZUljb24gPSBmdW5jdGlvbgorQWxlcnQ6IFBBU1M6IHRoaXMucmVtb3ZlSWNvbigpID0gdW5kZWZpbmVkCitBbGVydDogUEFTUzogdGhpcy5yZW1vdmVJY29uKDEsIDIsICJjbGFtcyIsIFsxLCAyLCAzXSkgPSB1bmRlZmluZWQKIEFsZXJ0OiBQQVNTOiB0eXBlb2YgdGhpcy5yZXBsYWNlUGFnZXMgPSBmdW5jdGlvbgogQWxlcnQ6IFBBU1M6IHRoaXMucmVwbGFjZVBhZ2VzKCkgPSB1bmRlZmluZWQKIEFsZXJ0OiBQQVNTOiB0aGlzLnJlcGxhY2VQYWdlcygxLCAyLCAiY2xhbXMiLCBbMSwgMiwgM10pID0gdW5kZWZpbmVkCkBAIC03MSw4ICs3Nyw4IEBACiBBbGVydDogUEFTUzogdGhpcy5hZGRJY29uKDEpIHRocmV3IGVycm9yIERvY3VtZW50LmFkZEljb246IEluY29ycmVjdCBudW1iZXIgb2YgcGFyYW1ldGVycyBwYXNzZWQgdG8gZnVuY3Rpb24uCiBBbGVydDogUEFTUzogdGhpcy5hZGRJY29uKDEsIDIsIDMpIHRocmV3IGVycm9yIERvY3VtZW50LmFkZEljb246IEluY29ycmVjdCBudW1iZXIgb2YgcGFyYW1ldGVycyBwYXNzZWQgdG8gZnVuY3Rpb24uCiBBbGVydDogUEFTUzogdGhpcy5hZGRJY29uKCJteWljb24iLCAzKSB0aHJldyBlcnJvciBEb2N1bWVudC5hZGRJY29uOiBJbmNvcnJlY3QgcGFyYW1ldGVyIHR5cGUuCitBbGVydDogUEFTUzogdGhpcy5hZGRJY29uKCJteWljb24iLCB1bmRlZmluZWQpIHRocmV3IGVycm9yIERvY3VtZW50LmFkZEljb246IEluY29ycmVjdCBwYXJhbWV0ZXIgdHlwZS4KIEFsZXJ0OiBQQVNTOiB0eXBlb2YgdGhpcy5jYWxjdWxhdGVOb3cgPSBmdW5jdGlvbgotQWxlcnQ6IFBBU1M6IHR5cGVvZiB0aGlzLmRlbGV0ZVBhZ2VzID0gZnVuY3Rpb24KIEFsZXJ0OiBQQVNTOiB0eXBlb2YgdGhpcy5nZXRGaWVsZCA9IGZ1bmN0aW9uCiBBbGVydDogUEFTUzogdGhpcy5nZXRGaWVsZCgpIHRocmV3IGVycm9yIERvY3VtZW50LmdldEZpZWxkOiBJbmNvcnJlY3QgbnVtYmVyIG9mIHBhcmFtZXRlcnMgcGFzc2VkIHRvIGZ1bmN0aW9uLgogQWxlcnQ6IFBBU1M6IHR5cGVvZiB0aGlzLmdldEljb24gPSBmdW5jdGlvbgpAQCAtOTYsOCArMTAyLDYgQEAKIEFsZXJ0OiBQQVNTOiB0eXBlb2YgdGhpcy5wcmludCA9IGZ1bmN0aW9uCiBBbGVydDogUEFTUzogdHlwZW9mIHRoaXMucmVtb3ZlRmllbGQgPSBmdW5jdGlvbgogQWxlcnQ6IFBBU1M6IHRoaXMucmVtb3ZlRmllbGQoKSB0aHJldyBlcnJvciBEb2N1bWVudC5yZW1vdmVGaWVsZDogSW5jb3JyZWN0IG51bWJlciBvZiBwYXJhbWV0ZXJzIHBhc3NlZCB0byBmdW5jdGlvbi4KLUFsZXJ0OiBQQVNTOiB0eXBlb2YgdGhpcy5yZW1vdmVJY29uID0gZnVuY3Rpb24KLUFsZXJ0OiBQQVNTOiB0aGlzLnJlbW92ZUljb24oKSB0aHJldyBlcnJvciBEb2N1bWVudC5yZW1vdmVJY29uOiBJbmNvcnJlY3QgbnVtYmVyIG9mIHBhcmFtZXRlcnMgcGFzc2VkIHRvIGZ1bmN0aW9uLgogQWxlcnQ6IFBBU1M6IHR5cGVvZiB0aGlzLnJlc2V0Rm9ybSA9IGZ1bmN0aW9uCiBBbGVydDogUEFTUzogdHlwZW9mIHRoaXMuc3VibWl0Rm9ybSA9IGZ1bmN0aW9uCiBBbGVydDogUEFTUzogdGhpcy5zdWJtaXRGb3JtKCkgdGhyZXcgZXJyb3IgRG9jdW1lbnQuc3VibWl0Rm9ybTogSW5jb3JyZWN0IG51bWJlciBvZiBwYXJhbWV0ZXJzIHBhc3NlZCB0byBmdW5jdGlvbi4KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvZG9jdW1lbnRfcHJvcHNfZXhwZWN0ZWQudHh0IGIvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9kb2N1bWVudF9wcm9wc19leHBlY3RlZC50eHQKaW5kZXggNzI4ZDI0NS4uNGI2MGE2MiAxMDA2NDQKLS0tIGEvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9kb2N1bWVudF9wcm9wc19leHBlY3RlZC50eHQKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9kb2N1bWVudF9wcm9wc19leHBlY3RlZC50eHQKQEAgLTcsMTAgKzcsMTAgQEAKIEFsZXJ0OiB0aGlzLkNvbGxhYiBpcyB1bmRlZmluZWQgdW5kZWZpbmVkCiBBbGVydDogdGhpcy5jcmVhdGlvbkRhdGUgaXMgc3RyaW5nIAogQWxlcnQ6IHRoaXMuY3JlYXRvciBpcyBzdHJpbmcgSm9lIFJhbmRvbSBDcmVhdG9yCi1BbGVydDogdGhpcy5kZWxheSBpcyBudW1iZXIgMAorQWxlcnQ6IHRoaXMuZGVsYXkgaXMgYm9vbGVhbiBmYWxzZQogQWxlcnQ6IHRoaXMuZGlydHkgaXMgYm9vbGVhbiBmYWxzZQogQWxlcnQ6IHRoaXMuZG9jdW1lbnRGaWxlTmFtZSBpcyBzdHJpbmcgCi1BbGVydDogdGhpcy5leHRlcm5hbCBpcyBudW1iZXIgMQorQWxlcnQ6IHRoaXMuZXh0ZXJuYWwgaXMgYm9vbGVhbiB0cnVlCiBBbGVydDogdGhpcy5maWxlc2l6ZSBpcyBudW1iZXIgMAogQWxlcnQ6IHRoaXMuaWNvbnMgaXMgdW5kZWZpbmVkIHVuZGVmaW5lZAogQWxlcnQ6IHRoaXMuaW5mbyBpcyBvYmplY3QgW29iamVjdCBPYmplY3RdCkBAIC03MiwxMCArNzIsMTAgQEAKIEFsZXJ0OiB0aGlzLkNvbGxhYiBpcyB1bmRlZmluZWQgdW5kZWZpbmVkCiBBbGVydDogdGhpcy5jcmVhdGlvbkRhdGUgaXMgc3RyaW5nIDMKIEFsZXJ0OiB0aGlzLmNyZWF0b3IgaXMgc3RyaW5nIDMKLUFsZXJ0OiB0aGlzLmRlbGF5IGlzIG51bWJlciAxCitBbGVydDogdGhpcy5kZWxheSBpcyBib29sZWFuIHRydWUKIEFsZXJ0OiB0aGlzLmRpcnR5IGlzIGJvb2xlYW4gdHJ1ZQogQWxlcnQ6IHRoaXMuZG9jdW1lbnRGaWxlTmFtZSBpcyBzdHJpbmcgCi1BbGVydDogdGhpcy5leHRlcm5hbCBpcyBudW1iZXIgMQorQWxlcnQ6IHRoaXMuZXh0ZXJuYWwgaXMgYm9vbGVhbiB0cnVlCiBBbGVydDogdGhpcy5maWxlc2l6ZSBpcyBudW1iZXIgMAogQWxlcnQ6IHRoaXMuaWNvbnMgaXMgdW5kZWZpbmVkIHVuZGVmaW5lZAogQWxlcnQ6IHRoaXMuaW5mbyBpcyBvYmplY3QgW29iamVjdCBPYmplY3RdCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9sYXVuY2hfYWN0aW9uLmluIGIvdGVzdGluZy9yZXNvdXJjZXMvbGF1bmNoX2FjdGlvbi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTg1MzlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvbGF1bmNoX2FjdGlvbi5pbgpAQCAtMCwwICsxLDU0IEBACit7e2hlYWRlcn19Cit7e29iamVjdCAxIDB9fSA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKz4+Cit7e29iamVjdCAyIDB9fSA8PAorICAvVHlwZSAvUGFnZXMKKyAgL01lZGlhQm94IFsgMCAwIDIwMCAyMDAgXQorICAvQ291bnQgMQorICAvS2lkcyBbIDMgMCBSIF0KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDMgMH19IDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL0Fubm90cyBbNCAwIFJdCis+PgorZW5kb2JqCit7e29iamVjdCA0IDB9fSA8PAorICAvQSA1IDAgUgorICAvRlQgL1R4CisgIC9GZiAyOTM2MDEyOAorICAvVCAodHh0TmFtZSkKKyAgL1R5cGUgL0Fubm90CisgIC9TdWJ0eXBlIC9MaW5rCisgIC9GIDQKKyAgL00gKEQ6MjAxNTA1MTQwNzA0MjYrMDUnMzAnKQorICAvUmVjdCBbMSAxIDE5OSAxOTldCisgIC9CUyAgPDwKKyAgICAvVyAxCisgICAgL1MgL1MKKyAgPj4KKyAgL0RBICgvSGVsdiAwIFRmIDAgMCAwIHJnKQorICAvQVAgPDwvTiA4IDAgUj4+CisgIC9WICgpCisgIC9BQSAxOSAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDUgMH19IDw8CisgIC9GIDYgMCBSCisgIC9TIC9MYXVuY2gKKz4+Cit7e29iamVjdCA2IDB9fSA8PAorICAvRiAodGVzdC5wZGYpCisgIC9UeXBlIC8gRmlsZXNwZWMKKz4+CitlbmRvYmoKK3t7eHJlZn19Cit0cmFpbGVyIDw8CisgIC9TaXplIDYKKyAgL1Jvb3QgMSAwIFIKKz4+Cit7e3N0YXJ0eHJlZn19CislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvbGF1bmNoX2FjdGlvbi5wZGYgYi90ZXN0aW5nL3Jlc291cmNlcy9sYXVuY2hfYWN0aW9uLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWE0MjkyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvbGF1bmNoX2FjdGlvbi5wZGYKQEAgLTAsMCArMSw2NCBAQAorJVBERi0xLjcKKyWg8qT0CisxIDAgb2JqIDw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAyIDAgUgorPj4KKzIgMCBvYmogPDwKKyAgL1R5cGUgL1BhZ2VzCisgIC9NZWRpYUJveCBbIDAgMCAyMDAgMjAwIF0KKyAgL0NvdW50IDEKKyAgL0tpZHMgWyAzIDAgUiBdCis+PgorZW5kb2JqCiszIDAgb2JqIDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL0Fubm90cyBbNCAwIFJdCis+PgorZW5kb2JqCis0IDAgb2JqIDw8CisgIC9BIDUgMCBSCisgIC9GVCAvVHgKKyAgL0ZmIDI5MzYwMTI4CisgIC9UICh0eHROYW1lKQorICAvVHlwZSAvQW5ub3QKKyAgL1N1YnR5cGUgL0xpbmsKKyAgL0YgNAorICAvTSAoRDoyMDE1MDUxNDA3MDQyNiswNSczMCcpCisgIC9SZWN0IFsxIDEgMTk5IDE5OV0KKyAgL0JTICA8PAorICAgIC9XIDEKKyAgICAvUyAvUworICA+PgorICAvREEgKC9IZWx2IDAgVGYgMCAwIDAgcmcpCisgIC9BUCA8PC9OIDggMCBSPj4KKyAgL1YgKCkKKyAgL0FBIDE5IDAgUgorPj4KK2VuZG9iagorNSAwIG9iaiA8PAorICAvRiA2IDAgUgorICAvUyAvTGF1bmNoCis+PgorNiAwIG9iaiA8PAorICAvRiAodGVzdC5wZGYpCisgIC9UeXBlIC8gRmlsZXNwZWMKKz4+CitlbmRvYmoKK3hyZWYKKzAgNworMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDAxNSAwMDAwMCBuIAorMDAwMDAwMDA2MSAwMDAwMCBuIAorMDAwMDAwMDE1NCAwMDAwMCBuIAorMDAwMDAwMDIyMyAwMDAwMCBuIAorMDAwMDAwMDQ4OSAwMDAwMCBuIAorMDAwMDAwMDUyNyAwMDAwMCBuIAordHJhaWxlciA8PAorICAvU2l6ZSA2CisgIC9Sb290IDEgMCBSCis+Pgorc3RhcnR4cmVmCis1ODMKKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9wYXJzZXJfcmVidWlsZHhyZWZfY29ycmVjdC5wZGYgYi90ZXN0aW5nL3Jlc291cmNlcy9wYXJzZXJfcmVidWlsZHhyZWZfY29ycmVjdC5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU0ZjYwYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BhcnNlcl9yZWJ1aWxkeHJlZl9jb3JyZWN0LnBkZgpAQCAtMCwwICsxLDU1IEBACislUERGLTEuNworJaDypPQKKzEgMCBvYmogPDwKKyAgL1R5cGUgL0NhdGFsb2cKKyAgL1BhZ2VzIDIgMiBSCis+PgorMiAyIG9iaiA8PAorICAvVHlwZSAvUGFnZXMKKyAgL01lZGlhQm94IFsgMCAwIDIwMCAyMDAgXQorICAvQ291bnQgMQorICAvS2lkcyBbIDMgNCBSIF0KKz4+CitlbmRvYmoKKzMgNCBvYmogPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDIgUgorICAvUmVzb3VyY2VzIDw8CisgICAgL0ZvbnQgPDwKKyAgICAgIC9GMSA0IDYgUgorICAgICAgL0YyIDUgOCBSCisgICAgPj4KKyAgPj4KKyAgL0NvbnRlbnRzIDYgMCBSCis+PgorZW5kb2JqCis0IDYgb2JqIDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL1RpbWVzLVJvbWFuCis+PgorZW5kb2JqCis1IDggb2JqIDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL0hlbHZldGljYQorPj4KK2VuZG9iagorNiAwIG9iaiA8PAorPj4KK3N0cmVhbQorQlQKKzIwIDUwIFRkCisvRjEgMTIgVGYKKyhIZWxsbywgd29ybGQhKSBUagorMCA1MCBUZAorL0YyIDE2IFRmCisoR29vZGJ5ZSwgd29ybGQhKSBUagorRVQKK2VuZHN0cmVhbQorZW5kb2JqCit0cmFpbGVyIDw8CisgIC9TaXplIDYKKyAgL1Jvb3QgMSAwIFIKKz4+CislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvcGFyc2VyX3JlYnVpbGR4cmVmX2Vycm9yX25vdHJhaWxlci5wZGYgYi90ZXN0aW5nL3Jlc291cmNlcy9wYXJzZXJfcmVidWlsZHhyZWZfZXJyb3Jfbm90cmFpbGVyLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2Y1NmZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGFyc2VyX3JlYnVpbGR4cmVmX2Vycm9yX25vdHJhaWxlci5wZGYKQEAgLTAsMCArMSw1MSBAQAorJVBERi0xLjcKKyWg8qT0CisxIDAgb2JqIDw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAyIDIgUgorPj4KKzIgMiBvYmogPDwKKyAgL1R5cGUgL1BhZ2VzCisgIC9NZWRpYUJveCBbIDAgMCAyMDAgMjAwIF0KKyAgL0NvdW50IDEKKyAgL0tpZHMgWyAzIDQgUiBdCis+PgorZW5kb2JqCiszIDQgb2JqIDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAyIFIKKyAgL1Jlc291cmNlcyA8PAorICAgIC9Gb250IDw8CisgICAgICAvRjEgNCA2IFIKKyAgICAgIC9GMiA1IDggUgorICAgID4+CisgID4+CisgIC9Db250ZW50cyA2IDAgUgorPj4KK2VuZG9iagorNCA2IG9iaiA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHlwZTEKKyAgL0Jhc2VGb250IC9UaW1lcy1Sb21hbgorPj4KK2VuZG9iagorNSA4IG9iaiA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHlwZTEKKyAgL0Jhc2VGb250IC9IZWx2ZXRpY2EKKz4+CitlbmRvYmoKKzYgMCBvYmogPDwKKz4+CitzdHJlYW0KK0JUCisyMCA1MCBUZAorL0YxIDEyIFRmCisoSGVsbG8sIHdvcmxkISkgVGoKKzAgNTAgVGQKKy9GMiAxNiBUZgorKEdvb2RieWUsIHdvcmxkISkgVGoKK0VUCitlbmRzdHJlYW0KK2VuZG9iagorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MTI1NTcuaW4gYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTEyNTU3LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMzUzMzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTEyNTU3LmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MTI1NTdfZXhwZWN0ZWQucGRmLjAucG5nIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUxMjU1N19leHBlY3RlZC5wZGYuMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZjNzNhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MTI1NTdfZXhwZWN0ZWQucGRmLjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfMS5pbiBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfMS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWFjNmY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M18xLmluCkBAIC0wLDAgKzEsNjEgQEAKK3t7aGVhZGVyfX0KK3t7b2JqZWN0IDEgMH19IDw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAyIDAgUgorPj4KK3t7b2JqZWN0IDIgMH19IDw8CisgIC9UeXBlIC9QYWdlcworICAvTWVkaWFCb3ggWyAwIDAgMjAwIDIwMCBdCisgIC9Db3VudCAxCisgIC9LaWRzIFsgMyAwIFIgXQorPj4KK2VuZG9iagore3tvYmplY3QgMyAwfX0gPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvUmVzb3VyY2VzIDw8CisgICAgL0ZvbnQgPDwKKyAgICAgIC9GMSA0IDAgUgorICAgICAgL0YyIDUgMCBSCisgICAgPj4KKyAgPj4KKyAgL0NvbnRlbnRzIDYgMCBSCis+PgorZW5kb2JqCit7e29iamVjdCA0IDB9fSA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHlwZTEKKyAgL0Jhc2VGb250IC9UaW1lcy1Sb21hbgorPj4KK2VuZG9iagore3tvYmplY3QgNSAwfX0gPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUxCisgIC9CYXNlRm9udCAvSGVsdmV0aWNhCis+PgorZW5kb2JqCislIENhc2UgMToKKyUgICAvTGVuZ3RoIGlkZW50aWZpZXMgaW50ZW5kZWQgZW5kIG9mIHN0cmVhbSwgZGVzcGl0ZSBlbWJlZGRlZCBrZXl3b3Jkcy4KKyUgICBCb3RoIHNob3VsZCByZW5kZXIgYXMgdGV4dC4KK3t7b2JqZWN0IDYgMH19IDw8CisgIC9MZW5ndGggMTA3Cis+Pgorc3RyZWFtCitCVAorMjAgNTAgVGQKKy9GMSAxMiBUZgorKGVuZG9iaiBpcyB0ZXh0KSBUagorZW5kc3RyZWFtCiswIDUwIFRkCisvRjIgMTMgVGYKKyhlbmRzdHJlYW0gaXMgdGV4dCBwZXIgL0xlbmd0aCkgVGoKK0VUCitlbmRzdHJlYW0KK2VuZG9iagore3t4cmVmfX0KK3RyYWlsZXIgPDwKKyAgL1NpemUgNgorICAvUm9vdCAxIDAgUgorPj4KK3t7c3RhcnR4cmVmfX0KKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzFfZXhwZWN0ZWQucGRmLjAucG5nIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M18xX2V4cGVjdGVkLnBkZi4wLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDQ0YmIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M18xX2V4cGVjdGVkLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzFfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfMV9leHBlY3RlZF9tYWMucGRmLjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZDU3MTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzFfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzIuaW4gYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzIuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlNDNkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfMi5pbgpAQCAtMCwwICsxLDYyIEBACit7e2hlYWRlcn19Cit7e29iamVjdCAxIDB9fSA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKz4+Cit7e29iamVjdCAyIDB9fSA8PAorICAvVHlwZSAvUGFnZXMKKyAgL01lZGlhQm94IFsgMCAwIDIwMCAyMDAgXQorICAvQ291bnQgMQorICAvS2lkcyBbIDMgMCBSIF0KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDMgMH19IDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL1Jlc291cmNlcyA8PAorICAgIC9Gb250IDw8CisgICAgICAvRjEgNCAwIFIKKyAgICAgIC9GMiA1IDAgUgorICAgID4+CisgID4+CisgIC9Db250ZW50cyA2IDAgUgorPj4KK2VuZG9iagore3tvYmplY3QgNCAwfX0gPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUxCisgIC9CYXNlRm9udCAvVGltZXMtUm9tYW4KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDUgMH19IDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL0hlbHZldGljYQorPj4KK2VuZG9iagorJSBDYXNlIDI6CislICAgL0xlbmd0aCBpbmNvcnJlY3RseSBpZGVudGlmaWVzIG1pZGRsZSBvZiBzdHJlYW0uCislICAgVGhlIHN0cmVhbSBpcyBibG9ja2VkIGJ5IHRoZSBrZXl3b3JkICJlbmRzdHJlYW0iCislICAgT25seSB0aGUgdGV4dCBiZWZvcmUgdGhlIGtleXdvcmQgY2FuIGJlIHJlbmRlcmVkLgore3tvYmplY3QgNiAwfX0gPDwKKyAgL0xlbmd0aCA4NworPj4KK3N0cmVhbQorQlQKKzIwIDUwIFRkCisvRjEgMTIgVGYKKyhlbmRvYmogaXMgdGV4dCkgVGoKK2VuZHN0cmVhbQorMCA1MCBUZAorL0YyIDEzIFRmCisoSXQncyB3cm9uZyB3aGVuIHlvdSBzZWUgdGhlIHRleHQhKSBUagorRVQKK2VuZHN0cmVhbQorZW5kb2JqCit7e3hyZWZ9fQordHJhaWxlciA8PAorICAvU2l6ZSA2CisgIC9Sb290IDEgMCBSCis+Pgore3tzdGFydHhyZWZ9fQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfMl9leHBlY3RlZC5wZGYuMC5wbmcgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzJfZXhwZWN0ZWQucGRmLjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZGU1MmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzJfZXhwZWN0ZWQucGRmLjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfMl9leHBlY3RlZF9tYWMucGRmLjAucG5nIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M18yX2V4cGVjdGVkX21hYy5wZGYuMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEzNjAxMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfMl9leHBlY3RlZF9tYWMucGRmLjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfMy5pbiBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfMy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTYzNDVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M18zLmluCkBAIC0wLDAgKzEsNjIgQEAKK3t7aGVhZGVyfX0KK3t7b2JqZWN0IDEgMH19IDw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAyIDAgUgorPj4KK3t7b2JqZWN0IDIgMH19IDw8CisgIC9UeXBlIC9QYWdlcworICAvTWVkaWFCb3ggWyAwIDAgMjAwIDIwMCBdCisgIC9Db3VudCAxCisgIC9LaWRzIFsgMyAwIFIgXQorPj4KK2VuZG9iagore3tvYmplY3QgMyAwfX0gPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvUmVzb3VyY2VzIDw8CisgICAgL0ZvbnQgPDwKKyAgICAgIC9GMSA0IDAgUgorICAgICAgL0YyIDUgMCBSCisgICAgPj4KKyAgPj4KKyAgL0NvbnRlbnRzIDYgMCBSCis+PgorZW5kb2JqCit7e29iamVjdCA0IDB9fSA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHlwZTEKKyAgL0Jhc2VGb250IC9UaW1lcy1Sb21hbgorPj4KK2VuZG9iagore3tvYmplY3QgNSAwfX0gPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUxCisgIC9CYXNlRm9udCAvSGVsdmV0aWNhCis+PgorZW5kb2JqCislIENhc2UgMzoKKyUgICAvTGVuZ3RoIGluY29ycmVjdGx5IGlkZW50aWZpZXMgbWlkZGxlIG9mIHN0cmVhbS4KKyUgICAiZWVuZHN0cmVhbSIgc2hvdWxkbid0IGJsb2NrIHRoZSBzdHJlYW0uCislICAgQm90aCBzaG91bGQgcmVuZGVyIGFzIHRleHQuCit7e29iamVjdCA2IDB9fSA8PAorICAvTGVuZ3RoIDg3Cis+Pgorc3RyZWFtCitCVAorMjAgNTAgVGQKKy9GMSAxMiBUZgorKGVuZG9iaiBpcyB0ZXh0KSBUagorZWVuZHN0cmVhbQorMCA1MCBUZAorL0YyIDEzIFRmCisoZW5kc3RyZWFtIGlzIHRleHQgcGVyIC9MZW5ndGgpIFRqCitFVAorZW5kc3RyZWFtCitlbmRvYmoKK3t7eHJlZn19Cit0cmFpbGVyIDw8CisgIC9TaXplIDYKKyAgL1Jvb3QgMSAwIFIKKz4+Cit7e3N0YXJ0eHJlZn19CislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M18zX2V4cGVjdGVkLnBkZi4wLnBuZyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfM19leHBlY3RlZC5wZGYuMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0NGJiMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfM19leHBlY3RlZC5wZGYuMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M18zX2V4cGVjdGVkX21hYy5wZGYuMC5wbmcgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzNfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGQ1NzEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M18zX2V4cGVjdGVkX21hYy5wZGYuMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M180LmluIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M180LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZGIzZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzQuaW4KQEAgLTAsMCArMSw2MSBAQAore3toZWFkZXJ9fQore3tvYmplY3QgMSAwfX0gPDwKKyAgL1R5cGUgL0NhdGFsb2cKKyAgL1BhZ2VzIDIgMCBSCis+Pgore3tvYmplY3QgMiAwfX0gPDwKKyAgL1R5cGUgL1BhZ2VzCisgIC9NZWRpYUJveCBbIDAgMCAyMDAgMjAwIF0KKyAgL0NvdW50IDEKKyAgL0tpZHMgWyAzIDAgUiBdCis+PgorZW5kb2JqCit7e29iamVjdCAzIDB9fSA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgPDwKKyAgICAvRm9udCA8PAorICAgICAgL0YxIDQgMCBSCisgICAgICAvRjIgNSAwIFIKKyAgICA+PgorICA+PgorICAvQ29udGVudHMgNiAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDQgMH19IDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL1RpbWVzLVJvbWFuCis+PgorZW5kb2JqCit7e29iamVjdCA1IDB9fSA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHlwZTEKKyAgL0Jhc2VGb250IC9IZWx2ZXRpY2EKKz4+CitlbmRvYmoKKyUgQ2FzZSA0OgorJSAgIC9MZW5ndGggaW5jb3JyZWN0bHkgaWRlbnRpZmllcyBtaWRkbGUgb2Ygc3RyZWFtLgorJSAgICJlbmRzdHJlYW0uIiBzaG91bGRuJ3QgYmxvY2sgdGhlIHN0cmVhbS4gCislICAgQm90aCBzaG91bGQgcmVuZGVyIGFzIHRleHQgZXZlbiAiZW5kc3RyZWFtIiBpcyBtaXNzaW5nLgore3tvYmplY3QgNiAwfX0gPDwKKyAgL0xlbmd0aCA4NworPj4KK3N0cmVhbQorQlQKKzIwIDUwIFRkCisvRjEgMTIgVGYKKyhlbmRvYmogaXMgdGV4dCkgVGoKK2VuZHN0cmVhbS4KKzAgNTAgVGQKKy9GMiAxMyBUZgorKGVuZHN0cmVhbSBpcyB0ZXh0IHBlciAvTGVuZ3RoKSBUagorRVQKK2VuZG9iagore3t4cmVmfX0KK3RyYWlsZXIgPDwKKyAgL1NpemUgNgorICAvUm9vdCAxIDAgUgorPj4KK3t7c3RhcnR4cmVmfX0KKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzRfZXhwZWN0ZWQucGRmLjAucG5nIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M180X2V4cGVjdGVkLnBkZi4wLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDQ0YmIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M180X2V4cGVjdGVkLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzRfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfNF9leHBlY3RlZF9tYWMucGRmLjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZDU3MTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzRfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzUuaW4gYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5Njc0NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfNS5pbgpAQCAtMCwwICsxLDYxIEBACit7e2hlYWRlcn19Cit7e29iamVjdCAxIDB9fSA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKz4+Cit7e29iamVjdCAyIDB9fSA8PAorICAvVHlwZSAvUGFnZXMKKyAgL01lZGlhQm94IFsgMCAwIDIwMCAyMDAgXQorICAvQ291bnQgMQorICAvS2lkcyBbIDMgMCBSIF0KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDMgMH19IDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL1Jlc291cmNlcyA8PAorICAgIC9Gb250IDw8CisgICAgICAvRjEgNCAwIFIKKyAgICAgIC9GMiA1IDAgUgorICAgID4+CisgID4+CisgIC9Db250ZW50cyA2IDAgUgorPj4KK2VuZG9iagore3tvYmplY3QgNCAwfX0gPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUxCisgIC9CYXNlRm9udCAvVGltZXMtUm9tYW4KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDUgMH19IDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL0hlbHZldGljYQorPj4KK2VuZG9iagorJSBDYXNlIDU6CislICAgL0xlbmd0aCBpbmNvcnJlY3RseSBpZGVudGlmaWVzIG1pZGRsZSBvZiBzdHJlYW0uCislICAgImVuZHN0cmVhbSUiIHNob3VsZG4ndCBibG9jayB0aGUgc3RyZWFtLiAKKyUgICBCb3RoIHNob3VsZCByZW5kZXIgYXMgdGV4dCBldmVuICJlbmRvYmoiIGlzIG1pc3NpbmcuCit7e29iamVjdCA2IDB9fSA8PAorICAvTGVuZ3RoIDg3Cis+Pgorc3RyZWFtCitCVAorMjAgNTAgVGQKKy9GMSAxMiBUZgorKGVuZG9iaiBpcyB0ZXh0KSBUagorZW5kc3RyZWFtJQorMCA1MCBUZAorL0YyIDEzIFRmCisoZW5kc3RyZWFtIGlzIHRleHQgcGVyIC9MZW5ndGgpIFRqCitFVAorZW5kc3RyZWFtCit7e3hyZWZ9fQordHJhaWxlciA8PAorICAvU2l6ZSA2CisgIC9Sb290IDEgMCBSCis+Pgore3tzdGFydHhyZWZ9fQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfNV9leHBlY3RlZC5wZGYuMC5wbmcgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzVfZXhwZWN0ZWQucGRmLjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNDRiYjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzVfZXhwZWN0ZWQucGRmLjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfNV9leHBlY3RlZF9tYWMucGRmLjAucG5nIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M181X2V4cGVjdGVkX21hYy5wZGYuMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRkNTcxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfNV9leHBlY3RlZF9tYWMucGRmLjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfNi5pbiBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfNi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMThiMjA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M182LmluCkBAIC0wLDAgKzEsNjAgQEAKK3t7aGVhZGVyfX0KK3t7b2JqZWN0IDEgMH19IDw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAyIDAgUgorPj4KK3t7b2JqZWN0IDIgMH19IDw8CisgIC9UeXBlIC9QYWdlcworICAvTWVkaWFCb3ggWyAwIDAgMjAwIDIwMCBdCisgIC9Db3VudCAxCisgIC9LaWRzIFsgMyAwIFIgXQorPj4KK2VuZG9iagore3tvYmplY3QgMyAwfX0gPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvUmVzb3VyY2VzIDw8CisgICAgL0ZvbnQgPDwKKyAgICAgIC9GMSA0IDAgUgorICAgICAgL0YyIDUgMCBSCisgICAgPj4KKyAgPj4KKyAgL0NvbnRlbnRzIDYgMCBSCis+PgorZW5kb2JqCit7e29iamVjdCA0IDB9fSA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHlwZTEKKyAgL0Jhc2VGb250IC9UaW1lcy1Sb21hbgorPj4KK2VuZG9iagore3tvYmplY3QgNSAwfX0gPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUxCisgIC9CYXNlRm9udCAvSGVsdmV0aWNhCis+PgorZW5kb2JqCislIENhc2UgNjoKKyUgICAvTGVuZ3RoIGluY29ycmVjdGx5IGlkZW50aWZpZXMgbWlkZGxlIG9mIHN0cmVhbS4KKyUgICAiZW5kc3RyZWFtKyIgc2hvdWxkbid0IGJsb2NrIHRoZSBzdHJlYW0uIAorJSAgIE5vdGhpbmcgd2lsbCBiZSByZW5kZXJlZCB3aGVuIGJvdGggImVuZHN0cmVhbSIgYW5kICJlbmRvYmoiIGFyZSBtaXNzaW5nLgore3tvYmplY3QgNiAwfX0gPDwKKyAgL0xlbmd0aCA4NworPj4KK3N0cmVhbQorQlQKKzIwIDUwIFRkCisvRjEgMTIgVGYKKyhlbmRvYmogaXMgdGV4dCkgVGoKK2VuZHN0cmVhbSsKKzAgNTAgVGQKKy9GMiAxMyBUZgorKGVuZHN0cmVhbSBpcyB0ZXh0IHBlciAvTGVuZ3RoKSBUagorRVQKK3t7eHJlZn19Cit0cmFpbGVyIDw8CisgIC9TaXplIDYKKyAgL1Jvb3QgMSAwIFIKKz4+Cit7e3N0YXJ0eHJlZn19CislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M182X2V4cGVjdGVkLnBkZi4wLnBuZyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfNl9leHBlY3RlZC5wZGYuMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkY2MyZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfNl9leHBlY3RlZC5wZGYuMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M182X2V4cGVjdGVkX21hYy5wZGYuMC5wbmcgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzZfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWRjYzJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M182X2V4cGVjdGVkX21hYy5wZGYuMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M183LmluIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M183LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NWYyZDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzcuaW4KQEAgLTAsMCArMSw2MSBAQAore3toZWFkZXJ9fQore3tvYmplY3QgMSAwfX0gPDwKKyAgL1R5cGUgL0NhdGFsb2cKKyAgL1BhZ2VzIDIgMCBSCis+Pgore3tvYmplY3QgMiAwfX0gPDwKKyAgL1R5cGUgL1BhZ2VzCisgIC9NZWRpYUJveCBbIDAgMCAyMDAgMjAwIF0KKyAgL0NvdW50IDEKKyAgL0tpZHMgWyAzIDAgUiBdCis+PgorZW5kb2JqCit7e29iamVjdCAzIDB9fSA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgPDwKKyAgICAvRm9udCA8PAorICAgICAgL0YxIDQgMCBSCisgICAgICAvRjIgNSAwIFIKKyAgICA+PgorICA+PgorICAvQ29udGVudHMgNiAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDQgMH19IDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL1RpbWVzLVJvbWFuCis+PgorZW5kb2JqCit7e29iamVjdCA1IDB9fSA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHlwZTEKKyAgL0Jhc2VGb250IC9IZWx2ZXRpY2EKKz4+CitlbmRvYmoKKyUgQ2FzZSA3OgorJSAgIC9MZW5ndGggaW5jb3JyZWN0bHkgaWRlbnRpZmllcyBtaWRkbGUgb2Ygc3RyZWFtLgorJSAgICJlbmRzdHJlYW0iIHdpbGwgYmxvY2sgdGhlIHN0cmVhbS4gCislICAgVGhlIHRleHQgYmVmb3JlIHRoZSBrZXl3b3JkICJlbmRzdHJlYW0iIGNhbiBiZSByZW5kZXJlZCBhbHRob3VnaAorJSAgIGJvdGggImVuZHN0cmVhbSIgYW5kICJlbmRvYmoiIGFyZSBtaXNzaW5nIGF0IHRoZSBlbmQgb2Ygc3RyZWFtLgore3tvYmplY3QgNiAwfX0gPDwKKyAgL0xlbmd0aCA4NworPj4KK3N0cmVhbQorQlQKKzIwIDUwIFRkCisvRjEgMTIgVGYKKyhlbmRvYmogaXMgdGV4dCkgVGoKK2VuZHN0cmVhbQorMCA1MCBUZAorL0YyIDEzIFRmCisoZW5kc3RyZWFtIGlzIHRleHQgcGVyIC9MZW5ndGgpIFRqCitFVAore3t4cmVmfX0KK3RyYWlsZXIgPDwKKyAgL1NpemUgNgorICAvUm9vdCAxIDAgUgorPj4KK3t7c3RhcnR4cmVmfX0KKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzdfZXhwZWN0ZWQucGRmLjAucG5nIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M183X2V4cGVjdGVkLnBkZi4wLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWRlNTJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M183X2V4cGVjdGVkLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzdfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfN19leHBlY3RlZF9tYWMucGRmLjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMzYwMTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzdfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI3MTc0LmluIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNzE3NC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjMzZTMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNzE3NC5pbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI3MTc0X2V4cGVjdGVkLnBkZi4wLnBuZyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjcxNzRfZXhwZWN0ZWQucGRmLjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMzViNzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI3MTc0X2V4cGVjdGVkLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTQzMDE4XzEuaW4gYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTQzMDE4XzEuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhmNjUxNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NDMwMThfMS5pbgpAQCAtMCwwICsxLDYxIEBACit7e2hlYWRlcn19Cit7e29iamVjdCAxIDB9fSA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKz4+Cit7e29iamVjdCAyIDB9fSA8PAorICAvVHlwZSAvUGFnZXMKKyAgL01lZGlhQm94IFsgMCAwIDIwMCAyMDAgXQorICAvQ291bnQgMQorICAvS2lkcyBbIDMgMCBSIF0KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDMgMH19IDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL1Jlc291cmNlcyA8PAorICAgIC9Gb250IDw8CisgICAgICAvRjEgNCAwIFIKKyAgICAgIC9GMiA1IDAgUgorICAgID4+CisgID4+CisgIC9Db250ZW50cyA2IDAgUgorPj4KK2VuZG9iagore3tvYmplY3QgNCAwfX0gPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUxCisgIC9CYXNlRm9udCAvVGltZXMtUm9tYW4KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDUgMH19IDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL0hlbHZldGljYQorPj4KK2VuZG9iagorJSBDYXNlIDE6CislICAgQSB3aGl0ZSBzcGFjZSByYXRoZXIgdGhhbiBlbmQgb2YgbGluZSBtYXJrZXJzIGZvbGxvd3MgdGhlIGtleXdvcmQgInN0cmVhbSIuCislICAgQm90aCBzaG91bGQgcmVuZGVyIGFzIHRleHQuCit7e29iamVjdCA2IDB9fSA8PAorICAvTGVuZ3RoIDEwNworPj4KK3N0cmVhbSAKK0JUCisyMCA1MCBUZAorL0YxIDEyIFRmCisoZW5kb2JqIGlzIHRleHQpIFRqCitlbmRzdHJlYW0KKzAgNTAgVGQKKy9GMiAxMyBUZgorKGVuZHN0cmVhbSBpcyB0ZXh0IHBlciAvTGVuZ3RoKSBUagorRVQKK2VuZHN0cmVhbQorZW5kb2JqCit7e3hyZWZ9fQordHJhaWxlciA8PAorICAvU2l6ZSA2CisgIC9Sb290IDEgMCBSCis+Pgore3tzdGFydHhyZWZ9fQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NDMwMThfMV9leHBlY3RlZC5wZGYuMC5wbmcgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTQzMDE4XzFfZXhwZWN0ZWQucGRmLjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNDRiYjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTQzMDE4XzFfZXhwZWN0ZWQucGRmLjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NDMwMThfMV9leHBlY3RlZF9tYWMucGRmLjAucG5nIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzU0MzAxOF8xX2V4cGVjdGVkX21hYy5wZGYuMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRkNTcxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NDMwMThfMV9leHBlY3RlZF9tYWMucGRmLjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NDMwMThfMi5pbiBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NDMwMThfMi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTYyZTU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzU0MzAxOF8yLmluCkBAIC0wLDAgKzEsNjIgQEAKK3t7aGVhZGVyfX0KK3t7b2JqZWN0IDEgMH19IDw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAyIDAgUgorPj4KK3t7b2JqZWN0IDIgMH19IDw8CisgIC9UeXBlIC9QYWdlcworICAvTWVkaWFCb3ggWyAwIDAgMjAwIDIwMCBdCisgIC9Db3VudCAxCisgIC9LaWRzIFsgMyAwIFIgXQorPj4KK2VuZG9iagore3tvYmplY3QgMyAwfX0gPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvUmVzb3VyY2VzIDw8CisgICAgL0ZvbnQgPDwKKyAgICAgIC9GMSA0IDAgUgorICAgICAgL0YyIDUgMCBSCisgICAgPj4KKyAgPj4KKyAgL0NvbnRlbnRzIDYgMCBSCis+PgorZW5kb2JqCit7e29iamVjdCA0IDB9fSA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHlwZTEKKyAgL0Jhc2VGb250IC9UaW1lcy1Sb21hbgorPj4KK2VuZG9iagore3tvYmplY3QgNSAwfX0gPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUxCisgIC9CYXNlRm9udCAvSGVsdmV0aWNhCis+PgorZW5kb2JqCislIENhc2UgMjoKKyUgICBUaHJlZSB3aGl0ZSBzcGFjZXMgYW5kIG90aGVyIGNoYXJzIGZvbGxvdyB0aGUga2V5d29yZCAic3RyZWFtIiAKKyUgICBiZWZvcmUgZW5kIG9mIGxpbmUgbWFya2Vycy4gVGhleSBzaG91bGQgYmUgaWdub3JlZC4gVGhlIGNvbnRlbnQKKyUgICBpbiBzdHJlYW0gc2hvdWxkIGJlIHJlbmRlcmVkIGFzIHRleHQuCit7e29iamVjdCA2IDB9fSA8PAorICAvTGVuZ3RoIDEwNworPj4KK3N0cmVhbSAgICJ0aGlzIHBhcnQgd2lsbCBiZSBpZ25vcmVkIgorQlQKKzIwIDUwIFRkCisvRjEgMTIgVGYKKyhlbmRvYmogaXMgdGV4dCkgVGoKK2VuZHN0cmVhbQorMCA1MCBUZAorL0YyIDEzIFRmCisoZW5kc3RyZWFtIGlzIHRleHQgcGVyIC9MZW5ndGgpIFRqCitFVAorZW5kc3RyZWFtCitlbmRvYmoKK3t7eHJlZn19Cit0cmFpbGVyIDw8CisgIC9TaXplIDYKKyAgL1Jvb3QgMSAwIFIKKz4+Cit7e3N0YXJ0eHJlZn19CislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzU0MzAxOF8yX2V4cGVjdGVkLnBkZi4wLnBuZyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NDMwMThfMl9leHBlY3RlZC5wZGYuMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0NGJiMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NDMwMThfMl9leHBlY3RlZC5wZGYuMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzU0MzAxOF8yX2V4cGVjdGVkX21hYy5wZGYuMC5wbmcgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTQzMDE4XzJfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGQ1NzEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzU0MzAxOF8yX2V4cGVjdGVkX21hYy5wZGYuMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzU1MTI1OF8xLmluIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzU1MTI1OF8xLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNTRmMmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTUxMjU4XzEuaW4KQEAgLTAsMCArMSw2MCBAQAore3toZWFkZXJ9fQore3tvYmplY3QgMSAwfX0gPDwKKyAgL1R5cGUgL0NhdGFsb2cKKyAgL1BhZ2VzIDIgMCBSCis+Pgore3tvYmplY3QgMiAwfX0gPDwKKyAgL1R5cGUgL1BhZ2VzCisgIC9NZWRpYUJveCBbIDAgMCAyMDAgMjAwIF0KKyAgL0NvdW50IDEKKyAgL0tpZHMgWyAzIDAgUiBdCis+PgorZW5kb2JqCit7e29iamVjdCAzIDB9fSA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgPDwKKyAgICAvRm9udCA8PAorICAgICAgL0YxIDQgMCBSCisgICAgICAvRjIgNSAwIFIKKyAgICA+PgorICA+PgorICAvQ29udGVudHMgNiAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDQgMH19IDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL1RpbWVzLVJvbWFuCis+PgorZW5kb2JqCit7e29iamVjdCA1IDB9fSA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHlwZTEKKyAgL0Jhc2VGb250IC9IZWx2ZXRpY2EKKz4+CitlbmRvYmoKKyUgQ2FzZSAxOgorJSAgIEVhcmxpZXIgdmVyc2lvbiBvZiBQREYgZG9lc24ndCByZXF1aXJlIEVPTCBiZWZvcmUgJ2VuZHN0cmVhbScuIElmIHRoZSBsZW5ndGgKKyUgICBvZiBieXRlcyBlbmQgYmVmb3JlICdlbmRzdHJlYW0nLCB3ZSBzaG91bGQgdGFrZSBpdC4KK3t7b2JqZWN0IDYgMH19IDw8CisgIC9MZW5ndGggMTA3Cis+Pgorc3RyZWFtIAorQlQKKzIwIDUwIFRkCisvRjEgMTIgVGYKKyhlbmRvYmogaXMgdGV4dCkgVGoKK2VuZHN0cmVhbQorMCA1MCBUZAorL0YyIDEzIFRmCisoZW5kc3RyZWFtIGlzIHRleHQgcGVyIC9MZW5ndGgpIFRqCitFVGVuZHN0cmVhbQorZW5kb2JqCit7e3hyZWZ9fQordHJhaWxlciA8PAorICAvU2l6ZSA2CisgIC9Sb290IDEgMCBSCis+Pgore3tzdGFydHhyZWZ9fQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NTEyNThfMV9leHBlY3RlZC5wZGYuMC5wbmcgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTUxMjU4XzFfZXhwZWN0ZWQucGRmLjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNDRiYjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTUxMjU4XzFfZXhwZWN0ZWQucGRmLjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NTEyNThfMV9leHBlY3RlZF9tYWMucGRmLjAucG5nIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzU1MTI1OF8xX2V4cGVjdGVkX21hYy5wZGYuMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRkNTcxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NTEyNThfMV9leHBlY3RlZF9tYWMucGRmLjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z183MS5pbiBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z183MS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmI2ZjE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzcxLmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z183MV9leHBlY3RlZC5wZGYuMC5wbmcgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNzFfZXhwZWN0ZWQucGRmLjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZDIzYzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNzFfZXhwZWN0ZWQucGRmLjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2ZvbnRfc2l6ZS5wZGYgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9mb250X3NpemUucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYjg4MmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9mb250X3NpemUucGRmCkBAIC0wLDAgKzEsNzIgQEAKKyVQREYtMS43CisloPKk9AorMSAwIG9iaiA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKz4+CisyIDAgb2JqIDw8CisgIC9UeXBlIC9QYWdlcworICAvTWVkaWFCb3ggWyAwIDAgMTAwIDQwMCBdCisgIC9Db3VudCAxCisgIC9LaWRzIFsgMyAwIFIgXQorPj4KK2VuZG9iagorMyAwIG9iaiA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgPDwKKyAgICAvRm9udCA8PAorICAgICAgL0YxIDQgMCBSCisgICAgPj4KKyAgPj4KKyAgL0NvbnRlbnRzIDYgMCBSCis+PgorZW5kb2JqCis0IDAgb2JqIDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL1RpbWVzLVJvbWFuCis+PgorZW5kb2JqCis2IDAgb2JqIDw8Cis+Pgorc3RyZWFtCitCVAorMjAgMCBUZAorMCAyMCBUZCAvRjEgMCBUZiAoU2l6ZSAwKSBUagorMCAyMCBUZCAvRjEgMSBUZiAoU2l6ZSAxKSBUagorMCAyMCBUZCAvRjEgMiBUZiAoU2l6ZSAyKSBUagorMCAyMCBUZCAvRjEgMyBUZiAoU2l6ZSAzKSBUagorMCAyMCBUZCAvRjEgNCBUZiAoU2l6ZSA0KSBUagorMCAyMCBUZCAvRjEgNSBUZiAoU2l6ZSA1KSBUagorMCAyMCBUZCAvRjEgNiBUZiAoU2l6ZSA2KSBUagorMCAyMCBUZCAvRjEgNyBUZiAoU2l6ZSA3KSBUagorMCAyMCBUZCAvRjEgOCBUZiAoU2l6ZSA4KSBUagorMCAyMCBUZCAvRjEgOSBUZiAoU2l6ZSA5KSBUagorMCAyMCBUZCAvRjEgMTAgVGYgKFNpemUgMTApIFRqCiswIDIwIFRkIC9GMSAxMSBUZiAoU2l6ZSAxMSkgVGoKKzAgMjAgVGQgL0YxIDEyIFRmIChTaXplIDEyKSBUagorMCAyMCBUZCAvRjEgMTMgVGYgKFNpemUgMTMpIFRqCiswIDIwIFRkIC9GMSAxNCBUZiAoU2l6ZSAxNCkgVGoKKzAgMjAgVGQgL0YxIDE1IFRmIChTaXplIDE1KSBUagorMCAyMCBUZCAvRjEgMTYgVGYgKFNpemUgMTYpIFRqCiswIDIwIFRkIC9GMSAxNyBUZiAoU2l6ZSAxNykgVGoKKzAgMjAgVGQgL0YxIDE4IFRmIChTaXplIDE4KSBUagorRVQKK2VuZHN0cmVhbQorZW5kb2JqCit4cmVmCiswIDcKKzAwMDAwMDAwMDAgNjU1MzUgZiAKKzAwMDAwMDAwMTUgMDAwMDAgbiAKKzAwMDAwMDAwNjEgMDAwMDAgbiAKKzAwMDAwMDAxNTQgMDAwMDAgbiAKKzAwMDAwMDAyODAgMDAwMDAgbiAKKzAwMDAwMDAwMDAgNjU1MzUgZiAKKzAwMDAwMDAzNTggMDAwMDAgbiAKK3RyYWlsZXIgPDwKKyAgL1Jvb3QgMSAwIFIKKz4+CitzdGFydHhyZWYKKzk3OQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3VzZV9vdXRsaW5lcy5pbiBiL3Rlc3RpbmcvcmVzb3VyY2VzL3VzZV9vdXRsaW5lcy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzQ0MTQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvdXNlX291dGxpbmVzLmluCkBAIC0wLDAgKzEsNTcgQEAKK3t7aGVhZGVyfX0KK3t7b2JqZWN0IDEgMH19IDw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAyIDAgUgorICAvUGFnZU1vZGUgL1VzZU91dGxpbmVzCis+Pgore3tvYmplY3QgMiAwfX0gPDwKKyAgL1R5cGUgL1BhZ2VzCisgIC9NZWRpYUJveCBbIDAgMCAyMDAgMjAwIF0KKyAgL0NvdW50IDEKKyAgL0tpZHMgWyAzIDAgUiBdCis+PgorZW5kb2JqCit7e29iamVjdCAzIDB9fSA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgPDwKKyAgICAvRm9udCA8PAorICAgICAgL0YxIDQgMCBSCisgICAgICAvRjIgNSAwIFIKKyAgICA+PgorICA+PgorICAvQ29udGVudHMgNiAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDQgMH19IDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL1RpbWVzLVJvbWFuCis+PgorZW5kb2JqCit7e29iamVjdCA1IDB9fSA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHlwZTEKKyAgL0Jhc2VGb250IC9IZWx2ZXRpY2EKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDYgMH19IDw8Cis+Pgorc3RyZWFtCitCVAorMjAgNTAgVGQKKy9GMSAxMiBUZgorKEhlbGxvLCB3b3JsZCEpIFRqCiswIDUwIFRkCisvRjIgMTYgVGYKKyhHb29kYnllLCB3b3JsZCEpIFRqCitFVAorZW5kc3RyZWFtCitlbmRvYmoKK3t7eHJlZn19Cit0cmFpbGVyIDw8CisgIC9TaXplIDYKKyAgL1Jvb3QgMSAwIFIKKz4+Cit7e3N0YXJ0eHJlZn19CislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvdXNlX291dGxpbmVzLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL3VzZV9vdXRsaW5lcy5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcxZmY0MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3VzZV9vdXRsaW5lcy5wZGYKQEAgLTAsMCArMSw2NyBAQAorJVBERi0xLjcKKyWg8qT0CisxIDAgb2JqIDw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAyIDAgUgorICAvUGFnZU1vZGUgL1VzZU91dGxpbmVzCis+PgorMiAwIG9iaiA8PAorICAvVHlwZSAvUGFnZXMKKyAgL01lZGlhQm94IFsgMCAwIDIwMCAyMDAgXQorICAvQ291bnQgMQorICAvS2lkcyBbIDMgMCBSIF0KKz4+CitlbmRvYmoKKzMgMCBvYmogPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvUmVzb3VyY2VzIDw8CisgICAgL0ZvbnQgPDwKKyAgICAgIC9GMSA0IDAgUgorICAgICAgL0YyIDUgMCBSCisgICAgPj4KKyAgPj4KKyAgL0NvbnRlbnRzIDYgMCBSCis+PgorZW5kb2JqCis0IDAgb2JqIDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL1RpbWVzLVJvbWFuCis+PgorZW5kb2JqCis1IDAgb2JqIDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL0hlbHZldGljYQorPj4KK2VuZG9iagorNiAwIG9iaiA8PAorPj4KK3N0cmVhbQorQlQKKzIwIDUwIFRkCisvRjEgMTIgVGYKKyhIZWxsbywgd29ybGQhKSBUagorMCA1MCBUZAorL0YyIDE2IFRmCisoR29vZGJ5ZSwgd29ybGQhKSBUagorRVQKK2VuZHN0cmVhbQorZW5kb2JqCit4cmVmCiswIDcKKzAwMDAwMDAwMDAgNjU1MzUgZiAKKzAwMDAwMDAwMTUgMDAwMDAgbiAKKzAwMDAwMDAwODYgMDAwMDAgbiAKKzAwMDAwMDAxNzkgMDAwMDAgbiAKKzAwMDAwMDAzMjEgMDAwMDAgbiAKKzAwMDAwMDAzOTkgMDAwMDAgbiAKKzAwMDAwMDA0NzUgMDAwMDAgbiAKK3RyYWlsZXIgPDwKKyAgL1NpemUgNgorICAvUm9vdCAxIDAgUgorPj4KK3N0YXJ0eHJlZgorNTk2CislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy90ZXN0X3N1cHBvcnQuY3BwIGIvdGVzdGluZy90ZXN0X3N1cHBvcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNWVhN2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Rlc3Rfc3VwcG9ydC5jcHAKQEAgLTAsMCArMSwxOTIgQEAKKy8vIENvcHlyaWdodCAyMDE1IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgInRlc3RpbmcvdGVzdF9zdXBwb3J0LmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAidGVzdGluZy91dGlscy9wYXRoX3NlcnZpY2UuaCIKKworI2lmZGVmIFBERl9FTkFCTEVfVjgKKyNpbmNsdWRlICJ2OC9pbmNsdWRlL2xpYnBsYXRmb3JtL2xpYnBsYXRmb3JtLmgiCisjZW5kaWYKKworbmFtZXNwYWNlIHsKKworI2lmZGVmIFBERl9FTkFCTEVfVjgKKyNpZmRlZiBWOF9VU0VfRVhURVJOQUxfU1RBUlRVUF9EQVRBCisvLyBSZXR1cm5zIHRoZSBmdWxsIHBhdGggZm9yIGFuIGV4dGVybmFsIFY4IGRhdGEgZmlsZSBiYXNlZCBvbiBlaXRoZXIKKy8vIHRoZSBjdXJyZWN0IGV4ZWN0dWFibGUgcGF0aCBvciBhbiBleHBsaWNpdCBvdmVycmlkZS4KK3N0ZDo6c3RyaW5nIEdldEZ1bGxQYXRoRm9yU25hcHNob3RGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBleGVfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiaW5fZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKSB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgaWYgKCFiaW5fZGlyLmVtcHR5KCkpIHsKKyAgICByZXN1bHQgPSBiaW5fZGlyOworICAgIGlmICgqYmluX2Rpci5yYmVnaW4oKSAhPSBQQVRIX1NFUEFSQVRPUikgeworICAgICAgcmVzdWx0ICs9IFBBVEhfU0VQQVJBVE9SOworICAgIH0KKyAgfSBlbHNlIGlmICghZXhlX3BhdGguZW1wdHkoKSkgeworICAgIHNpemVfdCBsYXN0X3NlcGFyYXRvciA9IGV4ZV9wYXRoLnJmaW5kKFBBVEhfU0VQQVJBVE9SKTsKKyAgICBpZiAobGFzdF9zZXBhcmF0b3IgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHJlc3VsdCA9IGV4ZV9wYXRoLnN1YnN0cigwLCBsYXN0X3NlcGFyYXRvciArIDEpOworICAgIH0KKyAgfQorICByZXN1bHQgKz0gZmlsZW5hbWU7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2Jvb2wgR2V0RXh0ZXJuYWxEYXRhKGNvbnN0IHN0ZDo6c3RyaW5nJiBleGVfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiaW5fZGlyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgdjg6OlN0YXJ0dXBEYXRhKiByZXN1bHRfZGF0YSkgeworICBzdGQ6OnN0cmluZyBmdWxsX3BhdGggPQorICAgICAgR2V0RnVsbFBhdGhGb3JTbmFwc2hvdEZpbGUoZXhlX3BhdGgsIGJpbl9kaXIsIGZpbGVuYW1lKTsKKyAgc2l6ZV90IGRhdGFfbGVuZ3RoID0gMDsKKyAgc3RkOjp1bmlxdWVfcHRyPGNoYXIsIHBkZml1bTo6RnJlZURlbGV0ZXI+IGRhdGFfYnVmZmVyID0KKyAgICAgIEdldEZpbGVDb250ZW50cyhmdWxsX3BhdGguY19zdHIoKSwgJmRhdGFfbGVuZ3RoKTsKKyAgaWYgKCFkYXRhX2J1ZmZlcikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmVzdWx0X2RhdGEtPmRhdGEgPSBkYXRhX2J1ZmZlci5yZWxlYXNlKCk7CisgIHJlc3VsdF9kYXRhLT5yYXdfc2l6ZSA9IGRhdGFfbGVuZ3RoOworICByZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZiAgLy8gVjhfVVNFX0VYVEVSTkFMX1NUQVJUVVBfREFUQQorCit2b2lkIEluaXRpYWxpemVWOENvbW1vbih2ODo6UGxhdGZvcm0qKiBwbGF0Zm9ybSkgeworICB2ODo6Vjg6OkluaXRpYWxpemVJQ1UoKTsKKworICAqcGxhdGZvcm0gPSB2ODo6cGxhdGZvcm06OkNyZWF0ZURlZmF1bHRQbGF0Zm9ybSgpOworICB2ODo6Vjg6OkluaXRpYWxpemVQbGF0Zm9ybSgqcGxhdGZvcm0pOworICB2ODo6Vjg6OkluaXRpYWxpemUoKTsKKworICAvLyBCeSBlbmFibGluZyBwcmVkaWN0YWJsZSBtb2RlLCBWOCB3b24ndCBwb3N0IGFueSBiYWNrZ3JvdW5kIHRhc2tzLgorICBjb25zdCBjaGFyIHByZWRpY3RhYmxlX2ZsYWdbXSA9ICItLXByZWRpY3RhYmxlIjsKKyAgdjg6OlY4OjpTZXRGbGFnc0Zyb21TdHJpbmcocHJlZGljdGFibGVfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzdHJsZW4ocHJlZGljdGFibGVfZmxhZykpKTsKK30KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9WOAorCit9ICAvLyBuYW1lc3BhY2UKKworc3RkOjp1bmlxdWVfcHRyPGNoYXIsIHBkZml1bTo6RnJlZURlbGV0ZXI+IEdldEZpbGVDb250ZW50cyhjb25zdCBjaGFyKiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiByZXRsZW4pIHsKKyAgRklMRSogZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKTsKKyAgaWYgKCFmaWxlKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gb3BlbjogJXNcbiIsIGZpbGVuYW1lKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICAodm9pZClmc2VlayhmaWxlLCAwLCBTRUVLX0VORCk7CisgIHNpemVfdCBmaWxlX2xlbmd0aCA9IGZ0ZWxsKGZpbGUpOworICBpZiAoIWZpbGVfbGVuZ3RoKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgKHZvaWQpZnNlZWsoZmlsZSwgMCwgU0VFS19TRVQpOworICBzdGQ6OnVuaXF1ZV9wdHI8Y2hhciwgcGRmaXVtOjpGcmVlRGVsZXRlcj4gYnVmZmVyKAorICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1hbGxvYyhmaWxlX2xlbmd0aCkpKTsKKyAgaWYgKCFidWZmZXIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBzaXplX3QgYnl0ZXNfcmVhZCA9IGZyZWFkKGJ1ZmZlci5nZXQoKSwgMSwgZmlsZV9sZW5ndGgsIGZpbGUpOworICAodm9pZClmY2xvc2UoZmlsZSk7CisgIGlmIChieXRlc19yZWFkICE9IGZpbGVfbGVuZ3RoKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcmVhZDogJXNcbiIsIGZpbGVuYW1lKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICAqcmV0bGVuID0gYnl0ZXNfcmVhZDsKKyAgcmV0dXJuIGJ1ZmZlcjsKK30KKworc3RkOjp3c3RyaW5nIEdldFBsYXRmb3JtV1N0cmluZyhGUERGX1dJREVTVFJJTkcgd3N0cikgeworICBpZiAoIXdzdHIpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgc2l6ZV90IGNoYXJhY3RlcnMgPSAwOworICB3aGlsZSAod3N0cltjaGFyYWN0ZXJzXSkKKyAgICArK2NoYXJhY3RlcnM7CisKKyAgc3RkOjp3c3RyaW5nIHBsYXRmb3JtX3N0cmluZyhjaGFyYWN0ZXJzLCBMJ1wwJyk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2hhcmFjdGVycyArIDE7ICsraSkgeworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KCZ3c3RyW2ldKTsKKyAgICBwbGF0Zm9ybV9zdHJpbmdbaV0gPSBwdHJbMF0gKyAyNTYgKiBwdHJbMV07CisgIH0KKyAgcmV0dXJuIHBsYXRmb3JtX3N0cmluZzsKK30KKworc3RkOjp1bmlxdWVfcHRyPHVuc2lnbmVkIHNob3J0LCBwZGZpdW06OkZyZWVEZWxldGVyPiBHZXRGUERGV2lkZVN0cmluZygKKyAgICBjb25zdCBzdGQ6OndzdHJpbmcmIHdzdHIpIHsKKyAgc2l6ZV90IGxlbmd0aCA9IHNpemVvZih1aW50MTZfdCkgKiAod3N0ci5sZW5ndGgoKSArIDEpOworICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWQgc2hvcnQsIHBkZml1bTo6RnJlZURlbGV0ZXI+IHJlc3VsdCgKKyAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0Kj4obWFsbG9jKGxlbmd0aCkpKTsKKyAgY2hhciogcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4ocmVzdWx0LmdldCgpKTsKKyAgc2l6ZV90IGkgPSAwOworICBmb3IgKHdjaGFyX3QgdyA6IHdzdHIpIHsKKyAgICBwdHJbaSsrXSA9IHcgJiAweGZmOworICAgIHB0cltpKytdID0gKHcgPj4gOCkgJiAweGZmOworICB9CisgIHB0cltpKytdID0gMDsKKyAgcHRyW2ldID0gMDsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworI2lmZGVmIFBERl9FTkFCTEVfVjgKKyNpZmRlZiBWOF9VU0VfRVhURVJOQUxfU1RBUlRVUF9EQVRBCitib29sIEluaXRpYWxpemVWOEZvclBERml1bShjb25zdCBzdGQ6OnN0cmluZyYgZXhlX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYmluX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpTdGFydHVwRGF0YSogbmF0aXZlc19ibG9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OlN0YXJ0dXBEYXRhKiBzbmFwc2hvdF9ibG9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OlBsYXRmb3JtKiogcGxhdGZvcm0pIHsKKyAgSW5pdGlhbGl6ZVY4Q29tbW9uKHBsYXRmb3JtKTsKKyAgaWYgKCFHZXRFeHRlcm5hbERhdGEoZXhlX3BhdGgsIGJpbl9kaXIsICJuYXRpdmVzX2Jsb2IuYmluIiwgbmF0aXZlc19ibG9iKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghR2V0RXh0ZXJuYWxEYXRhKGV4ZV9wYXRoLCBiaW5fZGlyLCAic25hcHNob3RfYmxvYi5iaW4iLCBzbmFwc2hvdF9ibG9iKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHY4OjpWODo6U2V0TmF0aXZlc0RhdGFCbG9iKG5hdGl2ZXNfYmxvYik7CisgIHY4OjpWODo6U2V0U25hcHNob3REYXRhQmxvYihzbmFwc2hvdF9ibG9iKTsKKyAgcmV0dXJuIHRydWU7Cit9CisjZWxzZSAgIC8vIFY4X1VTRV9FWFRFUk5BTF9TVEFSVFVQX0RBVEEKK2Jvb2wgSW5pdGlhbGl6ZVY4Rm9yUERGaXVtKHY4OjpQbGF0Zm9ybSoqIHBsYXRmb3JtKSB7CisgIEluaXRpYWxpemVWOENvbW1vbihwbGF0Zm9ybSk7CisgIHJldHVybiB0cnVlOworfQorI2VuZGlmICAvLyBWOF9VU0VfRVhURVJOQUxfU1RBUlRVUF9EQVRBCisjZW5kaWYgIC8vIFBERl9FTkFCTEVfVjgKKworVGVzdExvYWRlcjo6VGVzdExvYWRlcihjb25zdCBjaGFyKiBwQnVmLCBzaXplX3QgbGVuKQorICAgIDogbV9wQnVmKHBCdWYpLCBtX0xlbihsZW4pIHsKK30KKworLy8gc3RhdGljCitpbnQgVGVzdExvYWRlcjo6R2V0QmxvY2sodm9pZCogcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpIHsKKyAgVGVzdExvYWRlciogcExvYWRlciA9IHN0YXRpY19jYXN0PFRlc3RMb2FkZXIqPihwYXJhbSk7CisgIGlmIChwb3MgKyBzaXplIDwgcG9zIHx8IHBvcyArIHNpemUgPiBwTG9hZGVyLT5tX0xlbikKKyAgICByZXR1cm4gMDsKKworICBtZW1jcHkocEJ1ZiwgcExvYWRlci0+bV9wQnVmICsgcG9zLCBzaXplKTsKKyAgcmV0dXJuIDE7Cit9CisKK1Rlc3RTYXZlcjo6VGVzdFNhdmVyKCkgeworICBGUERGX0ZJTEVXUklURTo6dmVyc2lvbiA9IDE7CisgIEZQREZfRklMRVdSSVRFOjpXcml0ZUJsb2NrID0gV3JpdGVCbG9ja0NhbGxiYWNrOworfQorCit2b2lkIFRlc3RTYXZlcjo6Q2xlYXJTdHJpbmcoKSB7CisgIG1fU3RyaW5nLmNsZWFyKCk7Cit9CisKKy8vIHN0YXRpYworaW50IFRlc3RTYXZlcjo6V3JpdGVCbG9ja0NhbGxiYWNrKEZQREZfRklMRVdSSVRFKiBwRmlsZVdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzaXplKSB7CisgIFRlc3RTYXZlciogcFRoaXMgPSBzdGF0aWNfY2FzdDxUZXN0U2F2ZXIqPihwRmlsZVdyaXRlKTsKKyAgcFRoaXMtPm1fU3RyaW5nLmFwcGVuZChzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oZGF0YSksIHNpemUpOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvdGVzdF9zdXBwb3J0LmggYi90ZXN0aW5nL3Rlc3Rfc3VwcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1OWQ1NDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Rlc3Rfc3VwcG9ydC5oCkBAIC0wLDAgKzEsODEgQEAKKy8vIENvcHlyaWdodCAyMDE1IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBURVNUSU5HX0VNQkVEREVSX1RFU1RfU1VQUE9SVF9IXworI2RlZmluZSBURVNUSU5HX0VNQkVEREVSX1RFU1RfU1VQUE9SVF9IXworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgInB1YmxpYy9mcGRmdmlldy5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX3NhdmUuaCIKKworI2lmZGVmIFBERl9FTkFCTEVfVjgKKyNpbmNsdWRlICJ2OC9pbmNsdWRlL3Y4LmgiCisjZW5kaWYgIC8vIFBERl9FTkFCTEVfVjgKKworbmFtZXNwYWNlIHBkZml1bSB7CisKKy8vIFVzZWQgd2l0aCBzdGQ6OnVuaXF1ZV9wdHIgdG8gZnJlZSgpIG9iamVjdHMgdGhhdCBjYW4ndCBiZSBkZWxldGVkLgorc3RydWN0IEZyZWVEZWxldGVyIHsKKyAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKSh2b2lkKiBwdHIpIGNvbnN0IHsgZnJlZShwdHIpOyB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcGRmaXVtCisKKy8vIFJlYWRzIHRoZSBlbnRpcmUgY29udGVudHMgb2YgYSBmaWxlIGludG8gYSBuZXdseSBhbGxvYydkIGJ1ZmZlci4KK3N0ZDo6dW5pcXVlX3B0cjxjaGFyLCBwZGZpdW06OkZyZWVEZWxldGVyPiBHZXRGaWxlQ29udGVudHMoY29uc3QgY2hhciogZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogcmV0bGVuKTsKKworLy8gQ29udmVydHMgYSBGUERGX1dJREVTVFJJTkcgdG8gYSBzdGQ6OndzdHJpbmcuCisvLyBEZWFscyB3aXRoIGRpZmZlcmVuY2VzIGJldHdlZW4gVVRGMTZMRSBhbmQgd2NoYXJfdC4KK3N0ZDo6d3N0cmluZyBHZXRQbGF0Zm9ybVdTdHJpbmcoY29uc3QgRlBERl9XSURFU1RSSU5HIHdzdHIpOworCisvLyBSZXR1cm5zIGEgbmV3bHkgYWxsb2NhdGVkIEZQREZfV0lERVNUUklORy4KKy8vIERlYWxzIHdpdGggZGlmZmVyZW5jZXMgYmV0d2VlbiBVVEYxNkxFIGFuZCB3Y2hhcl90Lgorc3RkOjp1bmlxdWVfcHRyPHVuc2lnbmVkIHNob3J0LCBwZGZpdW06OkZyZWVEZWxldGVyPiBHZXRGUERGV2lkZVN0cmluZygKKyAgICBjb25zdCBzdGQ6OndzdHJpbmcmIHdzdHIpOworCisjaWZkZWYgUERGX0VOQUJMRV9WOAorI2lmZGVmIFY4X1VTRV9FWFRFUk5BTF9TVEFSVFVQX0RBVEEKK2Jvb2wgSW5pdGlhbGl6ZVY4Rm9yUERGaXVtKGNvbnN0IHN0ZDo6c3RyaW5nJiBleGVfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiaW5fZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OlN0YXJ0dXBEYXRhKiBuYXRpdmVzX2Jsb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6U3RhcnR1cERhdGEqIHNuYXBzaG90X2Jsb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6UGxhdGZvcm0qKiBwbGF0Zm9ybSk7CisjZWxzZSAgIC8vIFY4X1VTRV9FWFRFUk5BTF9TVEFSVFVQX0RBVEEKK2Jvb2wgSW5pdGlhbGl6ZVY4Rm9yUERGaXVtKHY4OjpQbGF0Zm9ybSoqIHBsYXRmb3JtKTsKKyNlbmRpZiAgLy8gVjhfVVNFX0VYVEVSTkFMX1NUQVJUVVBfREFUQQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1Y4CisKK2NsYXNzIFRlc3RMb2FkZXIgeworIHB1YmxpYzoKKyAgVGVzdExvYWRlcihjb25zdCBjaGFyKiBwQnVmLCBzaXplX3QgbGVuKTsKKyAgc3RhdGljIGludCBHZXRCbG9jayh2b2lkKiBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CisKKyBwcml2YXRlOgorICBjb25zdCBjaGFyKiBjb25zdCBtX3BCdWY7CisgIGNvbnN0IHNpemVfdCBtX0xlbjsKK307CisKK2NsYXNzIFRlc3RTYXZlciA6IHB1YmxpYyBGUERGX0ZJTEVXUklURSB7CisgcHVibGljOgorICBUZXN0U2F2ZXIoKTsKKworICB2b2lkIENsZWFyU3RyaW5nKCk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRTdHJpbmcoKSBjb25zdCB7IHJldHVybiBtX1N0cmluZzsgfQorCisgcHJpdmF0ZToKKyAgc3RhdGljIGludCBXcml0ZUJsb2NrQ2FsbGJhY2soRlBERl9GSUxFV1JJVEUqIHBGaWxlV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CisKKyAgc3RkOjpzdHJpbmcgbV9TdHJpbmc7Cit9OworCisjZW5kaWYgIC8vIFRFU1RJTkdfRU1CRURERVJfVEVTVF9TVVBQT1JUX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Rvb2xzL2NvbW1vbi5weSBiL3Rlc3RpbmcvdG9vbHMvY29tbW9uLnB5CmluZGV4IDE0NzQ1YTguLjZlOWRlN2MgMTAwNzU1Ci0tLSBhL3Rlc3RpbmcvdG9vbHMvY29tbW9uLnB5CisrKyBiL3Rlc3RpbmcvdG9vbHMvY29tbW9uLnB5CkBAIC0zLDcgKzMsOSBAQAogIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAjIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKK2ltcG9ydCBnbG9iCiBpbXBvcnQgb3MKK2ltcG9ydCBzdWJwcm9jZXNzCiBpbXBvcnQgc3lzCiAKIGRlZiBvc19uYW1lKCk6CkBAIC0xNiw2ICsxOCw0OSBAQAogICByYWlzZSBFeGNlcHRpb24oJ0NvbmZ1c2VkLCBjYW4gbm90IGRldGVybWluZSBPUywgYWJvcnRpbmcuJykKIAogCitkZWYgUnVuQ29tbWFuZChjbWQsIHJlZGlyZWN0X291dHB1dD1GYWxzZSk6CisgIHRyeToKKyAgICBpZiByZWRpcmVjdF9vdXRwdXQ6CisgICAgICBzeXMuc3Rkb3V0LndyaXRlKHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KGNtZCwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKSkKKyAgICBlbHNlOgorICAgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKGNtZCkKKyAgICByZXR1cm4gTm9uZQorICBleGNlcHQgc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IgYXMgZToKKyAgICByZXR1cm4gZQorCisjIEFkanVzdCBEci4gTWVtb3J5IHdyYXBwZXIgdG8gaGF2ZSBzZXBhcmF0ZSBsb2cgZGlyZWN0b3J5IGZvciBlYWNoIHRlc3QKKyMgZm9yIGJldHRlciBlcnJvciByZXBvcnRpbmcuCitkZWYgRHJNZW1vcnlXcmFwcGVyKHdyYXBwZXIsIHBkZl9uYW1lKToKKyAgaWYgbm90IHdyYXBwZXI6CisgICAgcmV0dXJuIFtdCisgICMgY29udmVydCBzdHJpbmcgdG8gbGlzdAorICBjbWRfdG9fcnVuID0gd3JhcHBlci5zcGxpdCgpCisKKyAgIyBEbyBub3RoaW5nIGlmIHVzaW5nIGRlZmF1bHQgbG9nIGRpcmVjdG9yeS4KKyAgaWYgY21kX3RvX3J1bi5jb3VudCgiLWxvZ2RpciIpID09IDA6CisgICAgcmV0dXJuIGNtZF90b19ydW4KKyAgIyBVc3VhbGx5LCB3ZSBwYXNzICItbG9nZGlyIiAiZm9vXGJhclxzcGFtIHBhdGgiIGFyZ3MgdG8gRHIuIE1lbW9yeS4KKyAgIyBUbyBncm91cCByZXBvcnRzIHBlciB0ZXN0LCB3ZSB3YW50IHRvIHB1dCB0aGUgcmVwb3J0cyBmb3IgZWFjaCB0ZXN0IGludG8gYQorICAjIHNlcGFyYXRlIGRpcmVjdG9yeS4gVGhpcyBjb2RlIGNhbiBiZSBzaW1wbGlmaWVkIHdoZW4gd2UgaGF2ZQorICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9EeW5hbW9SSU8vZHJtZW1vcnkvaXNzdWVzLzY4NCBmaXhlZC4KKyAgbG9nZGlyX2lkeCA9IGNtZF90b19ydW4uaW5kZXgoIi1sb2dkaXIiKQorICBvbGRfbG9nZGlyID0gY21kX3RvX3J1bltsb2dkaXJfaWR4ICsgMV0KKyAgd3JhcHBlcl9waWQgPSBzdHIob3MuZ2V0cGlkKCkpCisKKyAgIyBXZSBhcmUgdXNpbmcgdGhlIHNhbWUgcGlkIG9mIHRoZSBzYW1lIHB5dGhvbiBwcm9jZXNzLCBzbyBhcHBlbmQgdGhlIG51bWJlcgorICAjIG9mIGVudHJpZXMgaW4gdGhlIGxvZ2RpciBhdCB0aGUgZW5kIG9mIHdyYXBwZXJfcGlkIHRvIGF2b2lkIGNvbmZsaWN0LgorICB3cmFwcGVyX3BpZCArPSAiXyVkIiAlIGxlbihnbG9iLmdsb2Iob2xkX2xvZ2RpciArICJcXCoiKSkKKworICBjbWRfdG9fcnVuW2xvZ2Rpcl9pZHggKyAxXSArPSAiXFx0ZXN0Y2FzZS4lcy5sb2dzIiAlIHdyYXBwZXJfcGlkCisgIG9zLm1ha2VkaXJzKGNtZF90b19ydW5bbG9nZGlyX2lkeCArIDFdKQorCisgIGYgPSBvcGVuKG9sZF9sb2dkaXIgKyAiXFx0ZXN0Y2FzZS4lcy5uYW1lIiAlIHdyYXBwZXJfcGlkLCAidyIpCisgIHByaW50ID4+ZiwgcGRmX25hbWUgKyAiLnBkZiIKKyAgZi5jbG9zZSgpCisKKyAgcmV0dXJuIGNtZF90b19ydW4KKworCiBjbGFzcyBEaXJlY3RvcnlGaW5kZXI6CiAgICcnJ0EgY2xhc3MgZm9yIGZpbmRpbmcgZGlyZWN0b3JpZXMgYW5kIHBhdGhzIHVuZGVyIGVpdGhlciBhIHN0YW5kYWxvbmUKICAgY2hlY2tvdXQgb3IgYSBjaHJvbWl1bSBjaGVja291dCBvZiBQREZpdW0uJycnCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Rvb2xzL2ZpeHVwX3BkZl90ZW1wbGF0ZS5weSBiL3Rlc3RpbmcvdG9vbHMvZml4dXBfcGRmX3RlbXBsYXRlLnB5CmluZGV4IGE0M2RiNTUuLjgwYTcxMmYgMTAwNzU1Ci0tLSBhL3Rlc3RpbmcvdG9vbHMvZml4dXBfcGRmX3RlbXBsYXRlLnB5CisrKyBiL3Rlc3RpbmcvdG9vbHMvZml4dXBfcGRmX3RlbXBsYXRlLnB5CkBAIC03NCw4ICs3NCw4IEBACiBkZWYgZXhwYW5kX2ZpbGUoaW5wdXRfcGF0aCwgb3V0cHV0X3BhdGgpOgogICBwcm9jZXNzb3IgPSBUZW1wbGF0ZVByb2Nlc3NvcigpCiAgIHRyeToKLSAgICB3aXRoIG9wZW4oaW5wdXRfcGF0aCwgJ3InKSBhcyBpbmZpbGU6Ci0gICAgICB3aXRoIG9wZW4ob3V0cHV0X3BhdGgsICd3JykgYXMgb3V0ZmlsZToKKyAgICB3aXRoIG9wZW4oaW5wdXRfcGF0aCwgJ3JiJykgYXMgaW5maWxlOgorICAgICAgd2l0aCBvcGVuKG91dHB1dF9wYXRoLCAnd2InKSBhcyBvdXRmaWxlOgogICAgICAgICBmb3IgbGluZSBpbiBpbmZpbGU6CiAgICAgICAgICAgIG91dGZpbGUud3JpdGUocHJvY2Vzc29yLnByb2Nlc3NfbGluZShsaW5lKSkKICAgZXhjZXB0IElPRXJyb3I6CmRpZmYgLS1naXQgYS90ZXN0aW5nL3Rvb2xzL21ha2VfZXhwZWN0ZWQuc2ggYi90ZXN0aW5nL3Rvb2xzL21ha2VfZXhwZWN0ZWQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2Q0MjUyZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvdG9vbHMvbWFrZV9leHBlY3RlZC5zaApAQCAtMCwwICsxLDIwIEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgMjAxNSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorIworIyBTY3JpcHQgdG8gZ2VuZXJhdGUgZXhwZWN0ZWQgcmVzdWx0IGZpbGVzLgorIworc2V0IC1lCit3aGlsZSAoKCAiJCMiICkpOyBkbworICBJTkZJTEU9IiQxIgorICBlY2hvICRJTkZJTEUgfCBncmVwIC1xcyAnICcgJiYgZWNobyBzcGFjZSBpbiBmaWxlbmFtZSBkZXRlY3RlZCAmJiBleGl0IDEKKyAgb3V0L0RlYnVnL3BkZml1bV90ZXN0IC0tcG5nICRJTkZJTEUKKyAgUkVTVUxUUz0iJElORklMRS4qLnBuZyIKKyAgZm9yIFJFU1VMVCBpbiAkUkVTVUxUUyA7IGRvCisgICAgICBFWFBFQ1RFRD1gZWNobyAtbiAkUkVTVUxUIHwgc2VkICdzL1suXXBkZlsuXS9fZXhwZWN0ZWQucGRmLi8nYAorICAgICAgbXYgJFJFU1VMVCAkRVhQRUNURUQKKyAgZG9uZQorICBzaGlmdAorZG9uZQpkaWZmIC0tZ2l0IGEvdGVzdGluZy90b29scy9wbmdkaWZmZXIucHkgYi90ZXN0aW5nL3Rvb2xzL3BuZ2RpZmZlci5weQppbmRleCA3YTdlOGRkLi5iZWYyNTI2IDEwMDc1NQotLS0gYS90ZXN0aW5nL3Rvb2xzL3BuZ2RpZmZlci5weQorKysgYi90ZXN0aW5nL3Rvb2xzL3BuZ2RpZmZlci5weQpAQCAtNCw5ICs0LDEwIEBACiAjIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKIGltcG9ydCBvcwotaW1wb3J0IHN1YnByb2Nlc3MKIGltcG9ydCBzeXMKIAoraW1wb3J0IGNvbW1vbgorCiBjbGFzcyBQTkdEaWZmZXIoKToKICAgQUNUVUFMX1RFTVBMQVRFID0gJy5wZGYuJWQucG5nJwogICBFWFBFQ1RFRF9URU1QTEFURSA9ICdfZXhwZWN0ZWQnICsgQUNUVUFMX1RFTVBMQVRFCkBAIC0xNiwzMyArMTcsNjEgQEAKICAgICBzZWxmLnBkZml1bV9kaWZmX3BhdGggPSBmaW5kZXIuRXhlY3V0YWJsZVBhdGgoJ3BkZml1bV9kaWZmJykKICAgICBzZWxmLm9zX25hbWUgPSBmaW5kZXIub3NfbmFtZQogCi0gIGRlZiBIYXNEaWZmZXJlbmNlcyhzZWxmLCBpbnB1dF9maWxlbmFtZSwgc291cmNlX2Rpciwgd29ya2luZ19kaXIpOgotICAgIGlucHV0X3Jvb3QsIF8gPSBvcy5wYXRoLnNwbGl0ZXh0KGlucHV0X2ZpbGVuYW1lKQotICAgIGFjdHVhbF9wYXRoX3RlbXBsYXRlID0gb3MucGF0aC5qb2luKAotICAgICAgICB3b3JraW5nX2RpciwgaW5wdXRfcm9vdCArIHNlbGYuQUNUVUFMX1RFTVBMQVRFKQotICAgIGV4cGVjdGVkX3BhdGhfdGVtcGxhdGUgPSBvcy5wYXRoLmpvaW4oCi0gICAgICAgIHNvdXJjZV9kaXIsIGlucHV0X3Jvb3QgKyBzZWxmLkVYUEVDVEVEX1RFTVBMQVRFKQotICAgIHBsYXRmb3JtX2V4cGVjdGVkX3BhdGhfdGVtcGxhdGUgPSBvcy5wYXRoLmpvaW4oCi0gICAgICAgIHNvdXJjZV9kaXIsIGlucHV0X3Jvb3QgKyBzZWxmLlBMQVRGT1JNX0VYUEVDVEVEX1RFTVBMQVRFKQorICBkZWYgR2V0QWN0dWFsRmlsZXMoc2VsZiwgaW5wdXRfZmlsZW5hbWUsIHNvdXJjZV9kaXIsIHdvcmtpbmdfZGlyKToKKyAgICBhY3R1YWxfcGF0aHMgPSBbXQorICAgIHRlbXBsYXRlX3BhdGhzID0gc2VsZi5fR2V0VGVtcGxhdGVQYXRocygKKyAgICAgICAgaW5wdXRfZmlsZW5hbWUsIHNvdXJjZV9kaXIsIHdvcmtpbmdfZGlyKQorICAgIGFjdHVhbF9wYXRoX3RlbXBsYXRlID0gdGVtcGxhdGVfcGF0aHNbMF07CisgICAgZXhwZWN0ZWRfcGF0aF90ZW1wbGF0ZSA9IHRlbXBsYXRlX3BhdGhzWzFdCisgICAgcGxhdGZvcm1fZXhwZWN0ZWRfcGF0aF90ZW1wbGF0ZSA9IHRlbXBsYXRlX3BhdGhzWzJdCiAgICAgaSA9IDAKLSAgICB0cnk6Ci0gICAgICB3aGlsZSBUcnVlOgotICAgICAgICBhY3R1YWxfcGF0aCA9IGFjdHVhbF9wYXRoX3RlbXBsYXRlICUgaQotICAgICAgICBleHBlY3RlZF9wYXRoID0gZXhwZWN0ZWRfcGF0aF90ZW1wbGF0ZSAlIGkKLSAgICAgICAgcGxhdGZvcm1fZXhwZWN0ZWRfcGF0aCA9ICgKLSAgICAgICAgICAgIHBsYXRmb3JtX2V4cGVjdGVkX3BhdGhfdGVtcGxhdGUgJSAoc2VsZi5vc19uYW1lLCBpKSkKLSAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGxhdGZvcm1fZXhwZWN0ZWRfcGF0aCk6Ci0gICAgICAgICAgZXhwZWN0ZWRfcGF0aCA9IHBsYXRmb3JtX2V4cGVjdGVkX3BhdGgKLSAgICAgICAgZWxpZiBub3Qgb3MucGF0aC5leGlzdHMoZXhwZWN0ZWRfcGF0aCk6Ci0gICAgICAgICAgaWYgaSA9PSAwOgotICAgICAgICAgICAgcHJpbnQgIldBUk5JTkc6IG5vIGV4cGVjdGVkIHJlc3VsdHMgZmlsZXMgZm9yICIgKyBpbnB1dF9maWxlbmFtZQotICAgICAgICAgIGJyZWFrCi0gICAgICAgIHByaW50ICJDaGVja2luZyAiICsgYWN0dWFsX3BhdGgKLSAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCi0gICAgICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbCgKLSAgICAgICAgICAgIFtzZWxmLnBkZml1bV9kaWZmX3BhdGgsIGV4cGVjdGVkX3BhdGgsIGFjdHVhbF9wYXRoXSkKLSAgICAgICAgaSArPSAxCi0gICAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yIGFzIGU6Ci0gICAgICBwcmludCAiRkFJTFVSRTogIiArIGlucHV0X2ZpbGVuYW1lICsgIjsgIiArIHN0cihlKQotICAgICAgcmV0dXJuIFRydWUKKyAgICB3aGlsZSBUcnVlOgorICAgICAgYWN0dWFsX3BhdGggPSBhY3R1YWxfcGF0aF90ZW1wbGF0ZSAlIGkKKyAgICAgIGV4cGVjdGVkX3BhdGggPSBleHBlY3RlZF9wYXRoX3RlbXBsYXRlICUgaQorICAgICAgcGxhdGZvcm1fZXhwZWN0ZWRfcGF0aCA9ICgKKyAgICAgICAgICBwbGF0Zm9ybV9leHBlY3RlZF9wYXRoX3RlbXBsYXRlICUgKHNlbGYub3NfbmFtZSwgaSkpCisgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwbGF0Zm9ybV9leHBlY3RlZF9wYXRoKToKKyAgICAgICAgZXhwZWN0ZWRfcGF0aCA9IHBsYXRmb3JtX2V4cGVjdGVkX3BhdGgKKyAgICAgIGVsaWYgbm90IG9zLnBhdGguZXhpc3RzKGV4cGVjdGVkX3BhdGgpOgorICAgICAgICBicmVhaworICAgICAgYWN0dWFsX3BhdGhzLmFwcGVuZChhY3R1YWxfcGF0aCkKKyAgICAgIGkgKz0gMQorICAgIHJldHVybiBhY3R1YWxfcGF0aHMKKworICBkZWYgSGFzRGlmZmVyZW5jZXMoc2VsZiwgaW5wdXRfZmlsZW5hbWUsIHNvdXJjZV9kaXIsIHdvcmtpbmdfZGlyLAorICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3Rfb3V0cHV0PUZhbHNlKToKKyAgICB0ZW1wbGF0ZV9wYXRocyA9IHNlbGYuX0dldFRlbXBsYXRlUGF0aHMoCisgICAgICAgIGlucHV0X2ZpbGVuYW1lLCBzb3VyY2VfZGlyLCB3b3JraW5nX2RpcikKKyAgICBhY3R1YWxfcGF0aF90ZW1wbGF0ZSA9IHRlbXBsYXRlX3BhdGhzWzBdOworICAgIGV4cGVjdGVkX3BhdGhfdGVtcGxhdGUgPSB0ZW1wbGF0ZV9wYXRoc1sxXQorICAgIHBsYXRmb3JtX2V4cGVjdGVkX3BhdGhfdGVtcGxhdGUgPSB0ZW1wbGF0ZV9wYXRoc1syXQorICAgIGkgPSAwCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgIGFjdHVhbF9wYXRoID0gYWN0dWFsX3BhdGhfdGVtcGxhdGUgJSBpCisgICAgICBleHBlY3RlZF9wYXRoID0gZXhwZWN0ZWRfcGF0aF90ZW1wbGF0ZSAlIGkKKyAgICAgIHBsYXRmb3JtX2V4cGVjdGVkX3BhdGggPSAoCisgICAgICAgICAgcGxhdGZvcm1fZXhwZWN0ZWRfcGF0aF90ZW1wbGF0ZSAlIChzZWxmLm9zX25hbWUsIGkpKQorICAgICAgaWYgb3MucGF0aC5leGlzdHMocGxhdGZvcm1fZXhwZWN0ZWRfcGF0aCk6CisgICAgICAgIGV4cGVjdGVkX3BhdGggPSBwbGF0Zm9ybV9leHBlY3RlZF9wYXRoCisgICAgICBlbGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhleHBlY3RlZF9wYXRoKToKKyAgICAgICAgaWYgaSA9PSAwOgorICAgICAgICAgIHByaW50ICJXQVJOSU5HOiBubyBleHBlY3RlZCByZXN1bHRzIGZpbGVzIGZvciAiICsgaW5wdXRfZmlsZW5hbWUKKyAgICAgICAgYnJlYWsKKyAgICAgIHByaW50ICJDaGVja2luZyAiICsgYWN0dWFsX3BhdGgKKyAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgICAgZXJyb3IgPSBjb21tb24uUnVuQ29tbWFuZCgKKyAgICAgICAgICBbc2VsZi5wZGZpdW1fZGlmZl9wYXRoLCBleHBlY3RlZF9wYXRoLCBhY3R1YWxfcGF0aF0sIHJlZGlyZWN0X291dHB1dCkKKyAgICAgIGlmIGVycm9yOgorICAgICAgICBwcmludCAiRkFJTFVSRTogIiArIGlucHV0X2ZpbGVuYW1lICsgIjsgIiArIHN0cihlcnJvcikKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgIGkgKz0gMQogICAgIHJldHVybiBGYWxzZQorCisgIGRlZiBfR2V0VGVtcGxhdGVQYXRocyhzZWxmLCBpbnB1dF9maWxlbmFtZSwgc291cmNlX2Rpciwgd29ya2luZ19kaXIpOgorICAgIGlucHV0X3Jvb3QsIF8gPSBvcy5wYXRoLnNwbGl0ZXh0KGlucHV0X2ZpbGVuYW1lKQorICAgIGFjdHVhbF9wYXRoID0gb3MucGF0aC5qb2luKHdvcmtpbmdfZGlyLCBpbnB1dF9yb290ICsgc2VsZi5BQ1RVQUxfVEVNUExBVEUpCisgICAgZXhwZWN0ZWRfcGF0aCA9IG9zLnBhdGguam9pbigKKyAgICAgICAgc291cmNlX2RpciwgaW5wdXRfcm9vdCArIHNlbGYuRVhQRUNURURfVEVNUExBVEUpCisgICAgcGxhdGZvcm1fZXhwZWN0ZWRfcGF0aCA9IG9zLnBhdGguam9pbigKKyAgICAgICAgc291cmNlX2RpciwgaW5wdXRfcm9vdCArIHNlbGYuUExBVEZPUk1fRVhQRUNURURfVEVNUExBVEUpCisgICAgcmV0dXJuIChhY3R1YWxfcGF0aCwgZXhwZWN0ZWRfcGF0aCwgcGxhdGZvcm1fZXhwZWN0ZWRfcGF0aCkKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvdG9vbHMvcnVuX2NvcnB1c190ZXN0cy5weSBiL3Rlc3RpbmcvdG9vbHMvcnVuX2NvcnB1c190ZXN0cy5weQppbmRleCAxODc2NTgxLi5lMmI5NTBjIDEwMDc1NQotLS0gYS90ZXN0aW5nL3Rvb2xzL3J1bl9jb3JwdXNfdGVzdHMucHkKKysrIGIvdGVzdGluZy90b29scy9ydW5fY29ycHVzX3Rlc3RzLnB5CkBAIC0zLDYgKzMsOSBAQAogIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAjIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKK2ltcG9ydCBjU3RyaW5nSU8KK2ltcG9ydCBmdW5jdG9vbHMKK2ltcG9ydCBtdWx0aXByb2Nlc3NpbmcKIGltcG9ydCBvcHRwYXJzZQogaW1wb3J0IG9zCiBpbXBvcnQgcmUKQEAgLTE0LDYgKzE3LDggQEAKIGltcG9ydCBwbmdkaWZmZXIKIGltcG9ydCBzdXBwcmVzc29yCiAKK2NsYXNzIEtleWJvYXJkSW50ZXJydXB0RXJyb3IoRXhjZXB0aW9uKTogcGFzcworCiAjIE5vbWVuY2xhdHVyZToKICMgICB4X3Jvb3QgLSAieCIKICMgICB4X2ZpbGVuYW1lIC0gInguZXh0IgpAQCAtMjEsMjQgKzI2LDcxIEBACiAjICAgY19kaXIgLSAicGF0aC90by9hL2IvYyIKIAogZGVmIHRlc3Rfb25lX2ZpbGUoaW5wdXRfZmlsZW5hbWUsIHNvdXJjZV9kaXIsIHdvcmtpbmdfZGlyLAotICAgICAgICAgICAgICAgICAgcGRmaXVtX3Rlc3RfcGF0aCwgaW1hZ2VfZGlmZmVyKToKKyAgICAgICAgICAgICAgICAgIHBkZml1bV90ZXN0X3BhdGgsIGltYWdlX2RpZmZlciwgZHJtZW1fd3JhcHBlciwKKyAgICAgICAgICAgICAgICAgIHJlZGlyZWN0X291dHB1dD1GYWxzZSk6CiAgIGlucHV0X3BhdGggPSBvcy5wYXRoLmpvaW4oc291cmNlX2RpciwgaW5wdXRfZmlsZW5hbWUpCiAgIHBkZl9wYXRoID0gb3MucGF0aC5qb2luKHdvcmtpbmdfZGlyLCBpbnB1dF9maWxlbmFtZSkKKyAgIyBSZW1vdmUgYW55IGV4aXN0aW5nIGdlbmVyYXRlZCBpbWFnZXMgZnJvbSBwcmV2aW91cyBydW5zLgorICBhY3R1YWxfaW1hZ2VzID0gaW1hZ2VfZGlmZmVyLkdldEFjdHVhbEZpbGVzKAorICAgICAgaW5wdXRfZmlsZW5hbWUsIHNvdXJjZV9kaXIsIHdvcmtpbmdfZGlyKQorICBmb3IgaW1hZ2UgaW4gYWN0dWFsX2ltYWdlczoKKyAgICBpZiBvcy5wYXRoLmV4aXN0cyhpbWFnZSk6CisgICAgICBvcy5yZW1vdmUoaW1hZ2UpCisKKyAgc2h1dGlsLmNvcHlmaWxlKGlucHV0X3BhdGgsIHBkZl9wYXRoKQorICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgIyBhZGQgRHIuIE1lbW9yeSB3cmFwcGVyIGlmIGV4aXN0CisgICMgcmVtb3ZlIC5wZGYgc3VmZml4CisgIGNtZF90b19ydW4gPSBjb21tb24uRHJNZW1vcnlXcmFwcGVyKGRybWVtX3dyYXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguc3BsaXRleHQoaW5wdXRfZmlsZW5hbWUpWzBdKQorICBjbWRfdG9fcnVuLmV4dGVuZChbcGRmaXVtX3Rlc3RfcGF0aCwgJy0tcG5nJywgcGRmX3BhdGhdKQorICAjIHJ1biB0ZXN0CisgIGVycm9yID0gY29tbW9uLlJ1bkNvbW1hbmQoY21kX3RvX3J1biwgcmVkaXJlY3Rfb3V0cHV0KQorICBpZiBlcnJvcjoKKyAgICBwcmludCAiRkFJTFVSRTogIiArIGlucHV0X2ZpbGVuYW1lICsgIjsgIiArIHN0cihlcnJvcikKKyAgICByZXR1cm4gRmFsc2UKKyAgcmV0dXJuIG5vdCBpbWFnZV9kaWZmZXIuSGFzRGlmZmVyZW5jZXMoaW5wdXRfZmlsZW5hbWUsIHNvdXJjZV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmdfZGlyLCByZWRpcmVjdF9vdXRwdXQpCisKKworZGVmIHRlc3Rfb25lX2ZpbGVfcGFyYWxsZWwod29ya2luZ19kaXIsIHBkZml1bV90ZXN0X3BhdGgsIGltYWdlX2RpZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfY2FzZSk6CisgICIiIldyYXBwZXIgZnVuY3Rpb24gdG8gY2FsbCB0ZXN0X29uZV9maWxlKCkgYW5kIHJlZGlyZWN0IG91dHB1dCB0byBzdGRvdXQuIiIiCiAgIHRyeToKLSAgICBzaHV0aWwuY29weWZpbGUoaW5wdXRfcGF0aCwgcGRmX3BhdGgpCi0gICAgc3lzLnN0ZG91dC5mbHVzaCgpCi0gICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKFtwZGZpdW1fdGVzdF9wYXRoLCAnLS1wbmcnLCBwZGZfcGF0aF0pCi0gIGV4Y2VwdCBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvciBhcyBlOgotICAgIHByaW50ICJGQUlMVVJFOiAiICsgaW5wdXRfZmlsZW5hbWUgKyAiOyAiICsgc3RyKGUpCi0gICAgcmV0dXJuIEZhbHNlCi0gIGlmIGltYWdlX2RpZmZlci5IYXNEaWZmZXJlbmNlcyhpbnB1dF9maWxlbmFtZSwgc291cmNlX2Rpciwgd29ya2luZ19kaXIpOgotICAgIHJldHVybiBGYWxzZQotICByZXR1cm4gVHJ1ZQorICAgIG9sZF9zdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgb2xkX3N0ZGVyciA9IHN5cy5zdGRlcnIKKyAgICBzeXMuc3Rkb3V0ID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICBzeXMuc3RkZXJyID0gc3lzLnN0ZG91dAorICAgIGlucHV0X2ZpbGVuYW1lLCBzb3VyY2VfZGlyID0gdGVzdF9jYXNlCisgICAgcmVzdWx0ID0gdGVzdF9vbmVfZmlsZShpbnB1dF9maWxlbmFtZSwgc291cmNlX2Rpciwgd29ya2luZ19kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZpdW1fdGVzdF9wYXRoLCBpbWFnZV9kaWZmZXIsICIiLCBUcnVlKTsKKyAgICBvdXRwdXQgPSBzeXMuc3Rkb3V0CisgICAgc3lzLnN0ZG91dCA9IG9sZF9zdGRvdXQKKyAgICBzeXMuc3RkZXJyID0gb2xkX3N0ZGVycgorICAgIHJldHVybiAocmVzdWx0LCBvdXRwdXQuZ2V0dmFsdWUoKSwgaW5wdXRfZmlsZW5hbWUsIHNvdXJjZV9kaXIpCisgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICByYWlzZSBLZXlib2FyZEludGVycnVwdEVycm9yKCkKKworCitkZWYgaGFuZGxlX3Jlc3VsdCh0ZXN0X3N1cHByZXNzb3IsIGlucHV0X2ZpbGVuYW1lLCBpbnB1dF9wYXRoLCByZXN1bHQsCisgICAgICAgICAgICAgICAgICBzdXJwcmlzZXMsIGZhaWx1cmVzKToKKyAgaWYgdGVzdF9zdXBwcmVzc29yLklzU3VwcHJlc3NlZChpbnB1dF9maWxlbmFtZSk6CisgICAgaWYgcmVzdWx0OgorICAgICAgc3VycHJpc2VzLmFwcGVuZChpbnB1dF9wYXRoKQorICBlbHNlOgorICAgIGlmIG5vdCByZXN1bHQ6CisgICAgICBmYWlsdXJlcy5hcHBlbmQoaW5wdXRfcGF0aCkKKwogCiBkZWYgbWFpbigpOgogICBwYXJzZXIgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIoKQogICBwYXJzZXIuYWRkX29wdGlvbignLS1idWlsZC1kaXInLCBkZWZhdWx0PW9zLnBhdGguam9pbignb3V0JywgJ0RlYnVnJyksCiAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3JlbGF0aXZlIHBhdGggZnJvbSB0aGUgYmFzZSBzb3VyY2UgZGlyZWN0b3J5JykKKyAgcGFyc2VyLmFkZF9vcHRpb24oJy1qJywgZGVmYXVsdD1tdWx0aXByb2Nlc3NpbmcuY3B1X2NvdW50KCksCisgICAgICAgICAgICAgICAgICAgIGRlc3Q9J251bV93b3JrZXJzJywgdHlwZT0naW50JywKKyAgICAgICAgICAgICAgICAgICAgaGVscD0ncnVuIE5VTV9XT1JLRVJTIGpvYnMgaW4gcGFyYWxsZWwnKQorICBwYXJzZXIuYWRkX29wdGlvbignLS13cmFwcGVyJywgZGVmYXVsdD0nJywgZGVzdD0id3JhcHBlciIsCisgICAgICAgICAgICAgICAgICAgIGhlbHA9J0RyLiBNZW1vcnkgd3JhcHBlciBmb3IgcnVubmluZyB0ZXN0IHVuZGVyIERyLiBNZW1vcnknKQogICBvcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQogICBmaW5kZXIgPSBjb21tb24uRGlyZWN0b3J5RmluZGVyKG9wdGlvbnMuYnVpbGRfZGlyKQogICBwZGZpdW1fdGVzdF9wYXRoID0gZmluZGVyLkV4ZWN1dGFibGVQYXRoKCdwZGZpdW1fdGVzdCcpCkBAIC01NSwyMCArMTA3LDYyIEBACiAKICAgIyB0ZXN0IGZpbGVzIGFyZSB1bmRlciAuLi4vcGRmaXVtL3Rlc3RpbmcvY29ycHVzLgogICBmYWlsdXJlcyA9IFtdCisgIHN1cnByaXNlcyA9IFtdCiAgIHdhbGtfZnJvbV9kaXIgPSBmaW5kZXIuVGVzdGluZ0RpcignY29ycHVzJyk7CiAgIGlucHV0X2ZpbGVfcmUgPSByZS5jb21waWxlKCdeW2EtekEtWjAtOV8uXStbLl1wZGYkJykKLSAgZm9yIHNvdXJjZV9kaXIsIF8sIGZpbGVuYW1lX2xpc3QgaW4gb3Mud2Fsayh3YWxrX2Zyb21fZGlyKToKLSAgICBmb3IgaW5wdXRfZmlsZW5hbWUgaW4gZmlsZW5hbWVfbGlzdDoKLSAgICAgIGlmIGlucHV0X2ZpbGVfcmUubWF0Y2goaW5wdXRfZmlsZW5hbWUpOgotICAgICAgICAgaW5wdXRfcGF0aCA9IG9zLnBhdGguam9pbihzb3VyY2VfZGlyLCBpbnB1dF9maWxlbmFtZSkKLSAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGlucHV0X3BhdGgpOgotICAgICAgICAgICBpZiB0ZXN0X3N1cHByZXNzb3IuSXNTdXBwcmVzc2VkKGlucHV0X2ZpbGVuYW1lKToKLSAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgaWYgbm90IHRlc3Rfb25lX2ZpbGUoaW5wdXRfZmlsZW5hbWUsIHNvdXJjZV9kaXIsIHdvcmtpbmdfZGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmaXVtX3Rlc3RfcGF0aCwgaW1hZ2VfZGlmZmVyKToKLSAgICAgICAgICAgICBmYWlsdXJlcy5hcHBlbmQoaW5wdXRfcGF0aCkKKyAgdGVzdF9jYXNlcyA9IFtdCisKKyAgaWYgbGVuKGFyZ3MpOgorICAgIGZvciBmaWxlX25hbWUgaW4gYXJnczoKKyAgICAgIGlucHV0X3BhdGggPSBvcy5wYXRoLmpvaW4od2Fsa19mcm9tX2RpciwgZmlsZV9uYW1lKQorICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKGlucHV0X3BhdGgpOgorICAgICAgICBwcmludCAiQ2FuJ3QgZmluZCB0ZXN0IGZpbGUgJyVzJyIgJSBmaWxlX25hbWUKKyAgICAgICAgcmV0dXJuIDEKKworICAgICAgdGVzdF9jYXNlcy5hcHBlbmQoKG9zLnBhdGguYmFzZW5hbWUoaW5wdXRfcGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKGlucHV0X3BhdGgpKSkKKyAgZWxzZToKKyAgICBmb3Igc291cmNlX2RpciwgXywgZmlsZW5hbWVfbGlzdCBpbiBvcy53YWxrKHdhbGtfZnJvbV9kaXIpOgorICAgICAgZm9yIGlucHV0X2ZpbGVuYW1lIGluIGZpbGVuYW1lX2xpc3Q6CisgICAgICAgIGlmIGlucHV0X2ZpbGVfcmUubWF0Y2goaW5wdXRfZmlsZW5hbWUpOgorICAgICAgICAgIGlucHV0X3BhdGggPSBvcy5wYXRoLmpvaW4oc291cmNlX2RpciwgaW5wdXRfZmlsZW5hbWUpCisgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoaW5wdXRfcGF0aCk6CisgICAgICAgICAgICB0ZXN0X2Nhc2VzLmFwcGVuZCgoaW5wdXRfZmlsZW5hbWUsIHNvdXJjZV9kaXIpKQorCisgIGlmIG9wdGlvbnMubnVtX3dvcmtlcnMgPiAxIGFuZCBsZW4odGVzdF9jYXNlcykgPiAxOgorICAgIHRyeToKKyAgICAgIHBvb2wgPSBtdWx0aXByb2Nlc3NpbmcuUG9vbChvcHRpb25zLm51bV93b3JrZXJzKQorICAgICAgd29ya2VyX2Z1bmMgPSBmdW5jdG9vbHMucGFydGlhbCh0ZXN0X29uZV9maWxlX3BhcmFsbGVsLCB3b3JraW5nX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmaXVtX3Rlc3RfcGF0aCwgaW1hZ2VfZGlmZmVyKQorICAgICAgd29ya2VyX3Jlc3VsdHMgPSBwb29sLmltYXAod29ya2VyX2Z1bmMsIHRlc3RfY2FzZXMpCisgICAgICBmb3Igd29ya2VyX3Jlc3VsdCBpbiB3b3JrZXJfcmVzdWx0czoKKyAgICAgICAgcmVzdWx0LCBvdXRwdXQsIGlucHV0X2ZpbGVuYW1lLCBzb3VyY2VfZGlyID0gd29ya2VyX3Jlc3VsdAorICAgICAgICBpbnB1dF9wYXRoID0gb3MucGF0aC5qb2luKHNvdXJjZV9kaXIsIGlucHV0X2ZpbGVuYW1lKQorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKG91dHB1dCkKKyAgICAgICAgaGFuZGxlX3Jlc3VsdCh0ZXN0X3N1cHByZXNzb3IsIGlucHV0X2ZpbGVuYW1lLCBpbnB1dF9wYXRoLCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgc3VycHJpc2VzLCBmYWlsdXJlcykKKyAgICAgIHBvb2wuY2xvc2UoKQorICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgIHBvb2wudGVybWluYXRlKCkKKyAgICBmaW5hbGx5OgorICAgICAgcG9vbC5qb2luKCkKKyAgZWxzZToKKyAgICBmb3IgdGVzdF9jYXNlIGluIHRlc3RfY2FzZXM6CisgICAgICBpbnB1dF9maWxlbmFtZSwgc291cmNlX2RpciA9IHRlc3RfY2FzZQorICAgICAgcmVzdWx0ID0gdGVzdF9vbmVfZmlsZShpbnB1dF9maWxlbmFtZSwgc291cmNlX2Rpciwgd29ya2luZ19kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZml1bV90ZXN0X3BhdGgsIGltYWdlX2RpZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy53cmFwcGVyKQorICAgICAgaGFuZGxlX3Jlc3VsdCh0ZXN0X3N1cHByZXNzb3IsIGlucHV0X2ZpbGVuYW1lLCBpbnB1dF9wYXRoLCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgIHN1cnByaXNlcywgZmFpbHVyZXMpCisKKyAgaWYgc3VycHJpc2VzOgorICAgIHN1cnByaXNlcy5zb3J0KCkKKyAgICBwcmludCAnXG5cblVuZXhwZWN0ZWQgU3VjY2Vzc2VzOicKKyAgICBmb3Igc3VycHJpc2UgaW4gc3VycHJpc2VzOgorICAgICAgcHJpbnQgc3VycHJpc2U7CiAKICAgaWYgZmFpbHVyZXM6CisgICAgZmFpbHVyZXMuc29ydCgpCiAgICAgcHJpbnQgJ1xuXG5TdW1tYXJ5IG9mIEZhaWx1cmVzOicKICAgICBmb3IgZmFpbHVyZSBpbiBmYWlsdXJlczoKICAgICAgIHByaW50IGZhaWx1cmUKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvdG9vbHMvcnVuX2phdmFzY3JpcHRfdGVzdHMucHkgYi90ZXN0aW5nL3Rvb2xzL3J1bl9qYXZhc2NyaXB0X3Rlc3RzLnB5CmluZGV4IGZmNjZkOWMuLjBjMjQwMTcgMTAwNzU1Ci0tLSBhL3Rlc3RpbmcvdG9vbHMvcnVuX2phdmFzY3JpcHRfdGVzdHMucHkKKysrIGIvdGVzdGluZy90b29scy9ydW5famF2YXNjcmlwdF90ZXN0cy5weQpAQCAtMTgsNyArMTgsOCBAQAogIyAgIGNfZGlyIC0gInBhdGgvdG8vYS9iL2MiCiAKIGRlZiBnZW5lcmF0ZV9hbmRfdGVzdChpbnB1dF9maWxlbmFtZSwgc291cmNlX2Rpciwgd29ya2luZ19kaXIsCi0gICAgICAgICAgICAgICAgICAgICAgZml4dXBfcGF0aCwgcGRmaXVtX3Rlc3RfcGF0aCwgdGV4dF9kaWZmX3BhdGgpOgorICAgICAgICAgICAgICAgICAgICAgIGZpeHVwX3BhdGgsIHBkZml1bV90ZXN0X3BhdGgsIHRleHRfZGlmZl9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgIGRybWVtX3dyYXBwZXIpOgogICBpbnB1dF9yb290LCBfID0gb3MucGF0aC5zcGxpdGV4dChpbnB1dF9maWxlbmFtZSkKICAgaW5wdXRfcGF0aCA9IG9zLnBhdGguam9pbihzb3VyY2VfZGlyLCBpbnB1dF9yb290ICsgJy5pbicpCiAgIHBkZl9wYXRoID0gb3MucGF0aC5qb2luKHdvcmtpbmdfZGlyLCBpbnB1dF9yb290ICsgJy5wZGYnKQpAQCAtMjksNyArMzAsMTEgQEAKICAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCiAgICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgZml4dXBfcGF0aCwgJy0tb3V0cHV0LWRpcj0nICsgd29ya2luZ19kaXIsIGlucHV0X3BhdGhdKQogICAgIHdpdGggb3Blbih0eHRfcGF0aCwgJ3cnKSBhcyBvdXRmaWxlOgotICAgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKFtwZGZpdW1fdGVzdF9wYXRoLCBwZGZfcGF0aF0sIHN0ZG91dD1vdXRmaWxlKQorICAgICAgIyBhZGQgRHIuIE1lbW9yeSB3cmFwcGVyIGlmIGV4aXN0CisgICAgICBjbWRfdG9fcnVuID0gY29tbW9uLkRyTWVtb3J5V3JhcHBlcihkcm1lbV93cmFwcGVyLCBpbnB1dF9yb290KQorICAgICAgY21kX3RvX3J1bi5leHRlbmQoW3BkZml1bV90ZXN0X3BhdGgsIHBkZl9wYXRoXSkKKyAgICAgICMgcnVuIHRlc3QKKyAgICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChjbWRfdG9fcnVuLCBzdGRvdXQ9b3V0ZmlsZSkKICAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCiAgICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgdGV4dF9kaWZmX3BhdGgsIGV4cGVjdGVkX3BhdGgsIHR4dF9wYXRoXSkKICAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yIGFzIGU6CkBAIC00MSw3ICs0NiwxMCBAQAogICBwYXJzZXIgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIoKQogICBwYXJzZXIuYWRkX29wdGlvbignLS1idWlsZC1kaXInLCBkZWZhdWx0PW9zLnBhdGguam9pbignb3V0JywgJ0RlYnVnJyksCiAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3JlbGF0aXZlIHBhdGggZnJvbSB0aGUgYmFzZSBzb3VyY2UgZGlyZWN0b3J5JykKKyAgcGFyc2VyLmFkZF9vcHRpb24oJy0td3JhcHBlcicsIGRlZmF1bHQ9JycsIGRlc3Q9IndyYXBwZXIiLAorICAgICAgICAgICAgICAgICAgICBoZWxwPSdEci4gTWVtb3J5IHdyYXBwZXIgZm9yIHJ1bm5pbmcgdGVzdCB1bmRlciBEci4gTWVtb3J5JykKICAgb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKwogICBmaW5kZXIgPSBjb21tb24uRGlyZWN0b3J5RmluZGVyKG9wdGlvbnMuYnVpbGRfZGlyKQogICBmaXh1cF9wYXRoID0gZmluZGVyLlNjcmlwdFBhdGgoJ2ZpeHVwX3BkZl90ZW1wbGF0ZS5weScpCiAgIHRleHRfZGlmZl9wYXRoID0gZmluZGVyLlNjcmlwdFBhdGgoJ3RleHRfZGlmZi5weScpCkBAIC01NSwxNyArNjMsMjYgQEAKICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHdvcmtpbmdfZGlyKToKICAgICBvcy5tYWtlZGlycyh3b3JraW5nX2RpcikKIAorICBpbnB1dF9maWxlcyA9IFtdCisgIGlmIGxlbihhcmdzKToKKyAgICBmb3IgZmlsZV9uYW1lIGluIGFyZ3M6CisgICAgICBpbnB1dF9maWxlcy5hcHBlbmQoZmlsZV9uYW1lLnJlcGxhY2UoIi5wZGYiLCAiLmluIikpCisgIGVsc2U6CisgICAgaW5wdXRfZmlsZXMgPSBvcy5saXN0ZGlyKHNvdXJjZV9kaXIpCisKICAgZmFpbHVyZXMgPSBbXQogICBpbnB1dF9maWxlX3JlID0gcmUuY29tcGlsZSgnXlthLXpBLVowLTlfLl0rWy5daW4kJykKLSAgZm9yIGlucHV0X2ZpbGVuYW1lIGluIG9zLmxpc3RkaXIoc291cmNlX2Rpcik6CisgIGZvciBpbnB1dF9maWxlbmFtZSBpbiBpbnB1dF9maWxlczoKICAgICBpZiBpbnB1dF9maWxlX3JlLm1hdGNoKGlucHV0X2ZpbGVuYW1lKToKICAgICAgIGlucHV0X3BhdGggPSBvcy5wYXRoLmpvaW4oc291cmNlX2RpciwgaW5wdXRfZmlsZW5hbWUpCiAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShpbnB1dF9wYXRoKToKICAgICAgICAgaWYgbm90IGdlbmVyYXRlX2FuZF90ZXN0KGlucHV0X2ZpbGVuYW1lLCBzb3VyY2VfZGlyLCB3b3JraW5nX2RpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeHVwX3BhdGgsIHBkZml1bV90ZXN0X3BhdGgsIHRleHRfZGlmZl9wYXRoKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeHVwX3BhdGgsIHBkZml1bV90ZXN0X3BhdGgsIHRleHRfZGlmZl9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy53cmFwcGVyKToKICAgICAgICAgICBmYWlsdXJlcy5hcHBlbmQoaW5wdXRfcGF0aCkKIAogICBpZiBmYWlsdXJlczoKKyAgICBmYWlsdXJlcy5zb3J0KCkKICAgICBwcmludCAnXG5cblN1bW1hcnkgb2YgRmFpbHVyZXM6JwogICAgIGZvciBmYWlsdXJlIGluIGZhaWx1cmVzOgogICAgICAgcHJpbnQgZmFpbHVyZQpkaWZmIC0tZ2l0IGEvdGVzdGluZy90b29scy9ydW5fcGl4ZWxfdGVzdHMucHkgYi90ZXN0aW5nL3Rvb2xzL3J1bl9waXhlbF90ZXN0cy5weQppbmRleCAxNjg4NDYyLi44ZDgzODQwIDEwMDc1NQotLS0gYS90ZXN0aW5nL3Rvb2xzL3J1bl9waXhlbF90ZXN0cy5weQorKysgYi90ZXN0aW5nL3Rvb2xzL3J1bl9waXhlbF90ZXN0cy5weQpAQCAtMjAsMTUgKzIwLDI4IEBACiAjICAgY19kaXIgLSAicGF0aC90by9hL2IvYyIKIAogZGVmIGdlbmVyYXRlX2FuZF90ZXN0KGlucHV0X2ZpbGVuYW1lLCBzb3VyY2VfZGlyLCB3b3JraW5nX2RpciwKLSAgICAgICAgICAgICAgICAgICAgICBmaXh1cF9wYXRoLCBwZGZpdW1fdGVzdF9wYXRoLCBpbWFnZV9kaWZmZXIpOgorICAgICAgICAgICAgICAgICAgICAgIGZpeHVwX3BhdGgsIHBkZml1bV90ZXN0X3BhdGgsIGltYWdlX2RpZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICBkcm1lbV93cmFwcGVyKToKICAgaW5wdXRfcm9vdCwgXyA9IG9zLnBhdGguc3BsaXRleHQoaW5wdXRfZmlsZW5hbWUpCiAgIGlucHV0X3BhdGggPSBvcy5wYXRoLmpvaW4oc291cmNlX2RpciwgaW5wdXRfcm9vdCArICcuaW4nKQogICBwZGZfcGF0aCA9IG9zLnBhdGguam9pbih3b3JraW5nX2RpciwgaW5wdXRfcm9vdCArICcucGRmJykKKworICAjIFJlbW92ZSBhbnkgZXhpc3RpbmcgZ2VuZXJhdGVkIGltYWdlcyBmcm9tIHByZXZpb3VzIHJ1bnMuCisgIGFjdHVhbF9pbWFnZXMgPSBpbWFnZV9kaWZmZXIuR2V0QWN0dWFsRmlsZXMoCisgICAgICBpbnB1dF9maWxlbmFtZSwgc291cmNlX2Rpciwgd29ya2luZ19kaXIpCisgIGZvciBpbWFnZSBpbiBhY3R1YWxfaW1hZ2VzOgorICAgIGlmIG9zLnBhdGguZXhpc3RzKGltYWdlKToKKyAgICAgIG9zLnJlbW92ZShpbWFnZSkKKwogICB0cnk6CiAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCiAgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAogICAgICAgICBbc3lzLmV4ZWN1dGFibGUsIGZpeHVwX3BhdGgsICctLW91dHB1dC1kaXI9JyArIHdvcmtpbmdfZGlyLCBpbnB1dF9wYXRoXSkKLSAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoW3BkZml1bV90ZXN0X3BhdGgsICctLXBuZycsIHBkZl9wYXRoXSkKKyAgICAjIGFkZCBEci4gTWVtb3J5IHdyYXBwZXIgaWYgZXhpc3QKKyAgICBjbWRfdG9fcnVuID0gY29tbW9uLkRyTWVtb3J5V3JhcHBlcihkcm1lbV93cmFwcGVyLCBpbnB1dF9yb290KQorICAgIGNtZF90b19ydW4uZXh0ZW5kKFtwZGZpdW1fdGVzdF9wYXRoLCAnLS1wbmcnLCBwZGZfcGF0aF0pCisgICAgIyBydW4gdGVzdAorICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChjbWRfdG9fcnVuKQogICBleGNlcHQgc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IgYXMgZToKICAgICBwcmludCAiRkFJTFVSRTogIiArIGlucHV0X2ZpbGVuYW1lICsgIjsgIiArIHN0cihlKQogICAgIHJldHVybiBGYWxzZQpAQCAtMzcsMTAgKzUwLDEzIEBACiAgICAgcmV0dXJuIEZhbHNlCiAgIHJldHVybiBUcnVlCiAKKwogZGVmIG1haW4oKToKICAgcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKCkKICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tYnVpbGQtZGlyJywgZGVmYXVsdD1vcy5wYXRoLmpvaW4oJ291dCcsICdEZWJ1ZycpLAogICAgICAgICAgICAgICAgICAgICBoZWxwPSdyZWxhdGl2ZSBwYXRoIGZyb20gdGhlIGJhc2Ugc291cmNlIGRpcmVjdG9yeScpCisgIHBhcnNlci5hZGRfb3B0aW9uKCctLXdyYXBwZXInLCBkZWZhdWx0PScnLCBkZXN0PSJ3cmFwcGVyIiwKKyAgICAgICAgICAgICAgICAgICAgaGVscD0nRHIuIE1lbW9yeSB3cmFwcGVyIGZvciBydW5uaW5nIHRlc3QgdW5kZXIgRHIuIE1lbW9yeScpCiAgIG9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCiAgIGZpbmRlciA9IGNvbW1vbi5EaXJlY3RvcnlGaW5kZXIob3B0aW9ucy5idWlsZF9kaXIpCiAgIGZpeHVwX3BhdGggPSBmaW5kZXIuU2NyaXB0UGF0aCgnZml4dXBfcGRmX3RlbXBsYXRlLnB5JykKQEAgLTU3LDI0ICs3MywzNCBAQAogICB0ZXN0X3N1cHByZXNzb3IgPSBzdXBwcmVzc29yLlN1cHByZXNzb3IoZmluZGVyKQogICBpbWFnZV9kaWZmZXIgPSBwbmdkaWZmZXIuUE5HRGlmZmVyKGZpbmRlcikKIAorICBpbnB1dF9maWxlcyA9IFtdCisgIGlmIGxlbihhcmdzKToKKyAgICBmb3IgZmlsZV9uYW1lIGluIGFyZ3M6CisgICAgICBpbnB1dF9maWxlcy5hcHBlbmQoZmlsZV9uYW1lLnJlcGxhY2UoIi5wZGYiLCAiLmluIikpCisgIGVsc2U6CisgICAgaW5wdXRfZmlsZXMgPSBvcy5saXN0ZGlyKHNvdXJjZV9kaXIpCisKICAgZmFpbHVyZXMgPSBbXQogICBpbnB1dF9maWxlX3JlID0gcmUuY29tcGlsZSgnXlthLXpBLVowLTlfLl0rWy5daW4kJykKLSAgZm9yIGlucHV0X2ZpbGVuYW1lIGluIG9zLmxpc3RkaXIoc291cmNlX2Rpcik6CisgIGZvciBpbnB1dF9maWxlbmFtZSBpbiBpbnB1dF9maWxlczoKICAgICBpZiBpbnB1dF9maWxlX3JlLm1hdGNoKGlucHV0X2ZpbGVuYW1lKToKICAgICAgIGlucHV0X3BhdGggPSBvcy5wYXRoLmpvaW4oc291cmNlX2RpciwgaW5wdXRfZmlsZW5hbWUpCiAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShpbnB1dF9wYXRoKToKICAgICAgICAgaWYgdGVzdF9zdXBwcmVzc29yLklzU3VwcHJlc3NlZChpbnB1dF9maWxlbmFtZSk6CiAgICAgICAgICAgY29udGludWUKICAgICAgICAgaWYgbm90IGdlbmVyYXRlX2FuZF90ZXN0KGlucHV0X2ZpbGVuYW1lLCBzb3VyY2VfZGlyLCB3b3JraW5nX2RpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeHVwX3BhdGgsIHBkZml1bV90ZXN0X3BhdGgsIGltYWdlX2RpZmZlcik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXh1cF9wYXRoLCBwZGZpdW1fdGVzdF9wYXRoLCBpbWFnZV9kaWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLndyYXBwZXIpOgogICAgICAgICAgIGZhaWx1cmVzLmFwcGVuZChpbnB1dF9wYXRoKQogCiAgIGlmIGZhaWx1cmVzOgorICAgIGZhaWx1cmVzLnNvcnQoKQogICAgIHByaW50ICdcblxuU3VtbWFyeSBvZiBGYWlsdXJlczonCiAgICAgZm9yIGZhaWx1cmUgaW4gZmFpbHVyZXM6CiAgICAgICBwcmludCBmYWlsdXJlCiAgICAgcmV0dXJuIDEKICAgcmV0dXJuIDAKIAorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICBzeXMuZXhpdChtYWluKCkpCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Rvb2xzL3N1cHByZXNzb3IucHkgYi90ZXN0aW5nL3Rvb2xzL3N1cHByZXNzb3IucHkKaW5kZXggZmZmOWJjOC4uMmJiMzExNyAxMDA3NTUKLS0tIGEvdGVzdGluZy90b29scy9zdXBwcmVzc29yLnB5CisrKyBiL3Rlc3RpbmcvdG9vbHMvc3VwcHJlc3Nvci5weQpAQCAtMjQsMTEgKzI0LDExIEBACiAKICAgZGVmIElzU3VwcHJlc3NlZChzZWxmLCBpbnB1dF9maWxlbmFtZSk6CiAgICAgaWYgaW5wdXRfZmlsZW5hbWUgaW4gc2VsZi5zdXBwcmVzc2lvbl9saXN0OgotICAgICAgcHJpbnQgKCJOb3QgcnVubmluZyAlcywgZm91bmQgaW4gJXMgZmlsZSIgJQorICAgICAgcHJpbnQgKCIlcyBpcyBzdXBwcmVzc2VkLCBmb3VuZCBpbiAlcyBmaWxlIiAlCiAgICAgICAgICAgICAgKGlucHV0X2ZpbGVuYW1lLCBzZWxmLlNVUFBSRVNTSU9OU19GSUxFTkFNRSkpCiAgICAgICByZXR1cm4gVHJ1ZQogICAgIGlmIGlucHV0X2ZpbGVuYW1lIGluIHNlbGYucGxhdGZvcm1fc3VwcHJlc3Npb25fbGlzdDoKLSAgICAgIHByaW50ICgiTm90IHJ1bm5pbmcgJXMsIGZvdW5kIGluICVzIGZpbGUiICUKKyAgICAgIHByaW50ICgiJXMgaXMgc3VwcHJlc3NlZCwgZm91bmQgaW4gJXMgZmlsZSIgJQogICAgICAgICAgICAgIChpbnB1dF9maWxlbmFtZSwgc2VsZi5QTEFURk9STV9TVVBQUkVTU0lPTlNfRklMRU5BTUUpKQogICAgICAgcmV0dXJuIFRydWUKICAgICByZXR1cm4gRmFsc2UKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvdXRpbHMvcGF0aF9zZXJ2aWNlLmNwcCBiL3Rlc3RpbmcvdXRpbHMvcGF0aF9zZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTAxYTJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy91dGlscy9wYXRoX3NlcnZpY2UuY3BwCkBAIC0wLDAgKzEsMTAxIEBACisvLyBDb3B5cmlnaHQgMjAxNSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJ0ZXN0aW5nL3V0aWxzL3BhdGhfc2VydmljZS5oIgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8V2luZG93cy5oPgorI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisjaW5jbHVkZSA8bWFjaC1vL2R5bGQuaD4KKyNlbHNlICAvLyBMaW51eAorI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmICAvLyBfV0lOMzIKKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaCIKKworLy8gc3RhdGljCitib29sIFBhdGhTZXJ2aWNlOjpFbmRzV2l0aFNlcGFyYXRvcihjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgeworICByZXR1cm4gcGF0aC5zaXplKCkgPiAxICYmIHBhdGhbcGF0aC5zaXplKCkgLSAxXSA9PSBQQVRIX1NFUEFSQVRPUjsKK30KKworLy8gc3RhdGljCitib29sIFBhdGhTZXJ2aWNlOjpHZXRFeGVjdXRhYmxlRGlyKHN0ZDo6c3RyaW5nKiBwYXRoKSB7CisvLyBHZXQgdGhlIGN1cnJlbnQgZXhlY3V0YWJsZSBmaWxlIHBhdGguCisjaWZkZWYgX1dJTjMyCisgIGNoYXIgcGF0aF9idWZmZXJbTUFYX1BBVEhdOworICBwYXRoX2J1ZmZlclswXSA9IDA7CisKKyAgaWYgKEdldE1vZHVsZUZpbGVOYW1lQShOVUxMLCBwYXRoX2J1ZmZlciwgTUFYX1BBVEgpID09IDApCisgICAgcmV0dXJuIGZhbHNlOworICAqcGF0aCA9IHN0ZDo6c3RyaW5nKHBhdGhfYnVmZmVyKTsKKyNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQorICBGWFNZU19hc3NlcnQocGF0aCk7CisgIHVuc2lnbmVkIGludCBwYXRoX2xlbmd0aCA9IDA7CisgIF9OU0dldEV4ZWN1dGFibGVQYXRoKE5VTEwsICZwYXRoX2xlbmd0aCk7CisgIGlmIChwYXRoX2xlbmd0aCA9PSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBwYXRoLT5yZXNlcnZlKHBhdGhfbGVuZ3RoKTsKKyAgcGF0aC0+cmVzaXplKHBhdGhfbGVuZ3RoIC0gMSk7CisgIGlmIChfTlNHZXRFeGVjdXRhYmxlUGF0aCgmKCgqcGF0aClbMF0pLCAmcGF0aF9sZW5ndGgpKQorICAgIHJldHVybiBmYWxzZTsKKyNlbHNlICAgLy8gTGludXgKKyAgc3RhdGljIGNvbnN0IGNoYXIga1Byb2NTZWxmRXhlW10gPSAiL3Byb2Mvc2VsZi9leGUiOworICBjaGFyIGJ1ZltQQVRIX01BWF07CisgIHNzaXplX3QgY291bnQgPSA6OnJlYWRsaW5rKGtQcm9jU2VsZkV4ZSwgYnVmLCBQQVRIX01BWCk7CisgIGlmIChjb3VudCA8PSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICAqcGF0aCA9IHN0ZDo6c3RyaW5nKGJ1ZiwgY291bnQpOworI2VuZGlmICAvLyBfV0lOMzIKKworICAvLyBHZXQgdGhlIGRpcmVjdG9yeSBwYXRoLgorICBzdGQ6OnNpemVfdCBwb3MgPSBwYXRoLT5zaXplKCkgLSAxOworICBpZiAoRW5kc1dpdGhTZXBhcmF0b3IoKnBhdGgpKQorICAgIHBvcy0tOworICBzdGQ6OnNpemVfdCBmb3VuZCA9IHBhdGgtPmZpbmRfbGFzdF9vZihQQVRIX1NFUEFSQVRPUiwgcG9zKTsKKyAgaWYgKGZvdW5kID09IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgIHJldHVybiBmYWxzZTsKKyAgcGF0aC0+cmVzaXplKGZvdW5kKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHN0YXRpYworYm9vbCBQYXRoU2VydmljZTo6R2V0U291cmNlRGlyKHN0ZDo6c3RyaW5nKiBwYXRoKSB7CisgIGlmICghR2V0RXhlY3V0YWJsZURpcihwYXRoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFFbmRzV2l0aFNlcGFyYXRvcigqcGF0aCkpCisgICAgcGF0aC0+cHVzaF9iYWNrKFBBVEhfU0VQQVJBVE9SKTsKKyAgcGF0aC0+YXBwZW5kKCIuLiIpOworICBwYXRoLT5wdXNoX2JhY2soUEFUSF9TRVBBUkFUT1IpOworICBwYXRoLT5hcHBlbmQoIi4uIik7CisgIHJldHVybiB0cnVlOworfQorCisvLyBzdGF0aWMKK2Jvb2wgUGF0aFNlcnZpY2U6OkdldFRlc3REYXRhRGlyKHN0ZDo6c3RyaW5nKiBwYXRoKSB7CisgIGlmICghR2V0U291cmNlRGlyKHBhdGgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoIUVuZHNXaXRoU2VwYXJhdG9yKCpwYXRoKSkKKyAgICBwYXRoLT5wdXNoX2JhY2soUEFUSF9TRVBBUkFUT1IpOworICBwYXRoLT5hcHBlbmQoInRlc3RpbmciKTsKKyAgcGF0aC0+cHVzaF9iYWNrKFBBVEhfU0VQQVJBVE9SKTsKKyAgcGF0aC0+YXBwZW5kKCJyZXNvdXJjZXMiKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHN0YXRpYworYm9vbCBQYXRoU2VydmljZTo6R2V0VGVzdEZpbGVQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHBhdGgpIHsKKyAgaWYgKCFHZXRUZXN0RGF0YURpcihwYXRoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFFbmRzV2l0aFNlcGFyYXRvcigqcGF0aCkpCisgICAgcGF0aC0+cHVzaF9iYWNrKFBBVEhfU0VQQVJBVE9SKTsKKyAgcGF0aC0+YXBwZW5kKGZpbGVfbmFtZSk7CisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvdGVzdGluZy91dGlscy9wYXRoX3NlcnZpY2UuaCBiL3Rlc3RpbmcvdXRpbHMvcGF0aF9zZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZmZDY5ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvdXRpbHMvcGF0aF9zZXJ2aWNlLmgKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIFRFU1RJTkdfVVRJTFNfUEFUSF9TRVJWSUNFX0hfCisjZGVmaW5lIFRFU1RJTkdfVVRJTFNfUEFUSF9TRVJWSUNFX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgUEFUSF9TRVBBUkFUT1IgJ1xcJworI2Vsc2UKKyNkZWZpbmUgUEFUSF9TRVBBUkFUT1IgJy8nCisjZW5kaWYKKworLy8gR2V0IHRoZSB2YXJpb3VzIGZpbGUgZGlyZWN0b3J5IGFuZCBwYXRoIGluZm9ybWF0aW9uLgorY2xhc3MgUGF0aFNlcnZpY2UgeworIHB1YmxpYzoKKyAgLy8gUmV0dXJuIHRydWUgd2hlbiB0aGUgcGF0aCBlbmRzIHdpdGggYSBwYXRoIHNlcGFyYXRvci4KKyAgc3RhdGljIGJvb2wgRW5kc1dpdGhTZXBhcmF0b3IoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpOworCisgIC8vIFJldHJpZXZlIHRoZSBkaXJlY3Rvcnkgd2hlcmUgZXhlY3V0YWJsZXMgcnVuIGZyb20uCisgIHN0YXRpYyBib29sIEdldEV4ZWN1dGFibGVEaXIoc3RkOjpzdHJpbmcqIHBhdGgpOworCisgIC8vIFJldHJpZXZlIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgc291cmNlIHRyZWUuCisgIC8vIEFzc3VtZSBleGVjdXRhYmxlcyBhbHdheXMgcnVuIGZyb20gb3V0LzxEZWJ1Z3xSZWxlYXNlPi8sIHRoZSBzb3VyY2UKKyAgLy8gZGlyZWN0b3J5IGlzIHR3byBsZXZlbHMgYWJvdmUgdGhlIGV4ZWN1dGFibGUgZGlyZWN0b3J5LgorICBzdGF0aWMgYm9vbCBHZXRTb3VyY2VEaXIoc3RkOjpzdHJpbmcqIHBhdGgpOworCisgIC8vIFJldHJpZXZlIHRoZSB0ZXN0IGRhdGEgZGlyZWN0b3J5IHdoZXJlIHRlc3QgZmlsZXMgYXJlIHN0b3JlZC4KKyAgLy8gQ3VycmVudGx5LCB0aGUgdGVzdCBkaXIgaXMgdW5kZXIgPHNvdXJjZV9kaXI+L3Rlc3RpbmcvcmVzb3VyY2VzLy4KKyAgc3RhdGljIGJvb2wgR2V0VGVzdERhdGFEaXIoc3RkOjpzdHJpbmcqIHBhdGgpOworCisgIC8vIEdldCB0aGUgZnVsbCBwYXRoIGZvciBhIHRlc3QgZmlsZSB1bmRlciB0aGUgdGVzdCBkYXRhIGRpcmVjdG9yeS4KKyAgc3RhdGljIGJvb2wgR2V0VGVzdEZpbGVQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX25hbWUsIHN0ZDo6c3RyaW5nKiBwYXRoKTsKK307CisjZW5kaWYgIC8vIFRFU1RJTkdfVVRJTFNfUEFUSF9TRVJWSUNFX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9BbmRyb2lkLm1rIGIvdGhpcmRfcGFydHkvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDNiY2E4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvQW5kcm9pZC5tawpAQCAtMCwwICsxLDggQEAKK0JBU0VfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQkFTRV9QQVRIKS9wZGZpdW1hZ2cyMy5taworaW5jbHVkZSAkKEJBU0VfUEFUSCkvcGRmaXVtYmlnaW50Lm1rCitpbmNsdWRlICQoQkFTRV9QQVRIKS9wZGZpdW1sY21zLm1rCitpbmNsdWRlICQoQkFTRV9QQVRIKS9wZGZpdW1qcGVnLm1rCitpbmNsdWRlICQoQkFTRV9QQVRIKS9wZGZpdW1vcGVuanBlZy5taworaW5jbHVkZSAkKEJBU0VfUEFUSCkvcGRmaXVtemxpYi5tawpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvQlVJTEQuZ24gYi90aGlyZF9wYXJ0eS9CVUlMRC5nbgppbmRleCAxOGJhZWIyLi41ZjM1NDMyIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9CVUlMRC5nbgorKysgYi90aGlyZF9wYXJ0eS9CVUlMRC5nbgpAQCAtMiwxMCArMiwxMiBAQAogIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAjIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKK2ltcG9ydCgiLi4vcGRmaXVtLmduaSIpCisKIGdyb3VwKCJ0aGlyZF9wYXJ0eSIpIHsKICAgZGVwcyA9IFsKICAgICAiOmJpZ2ludCIsCi0gICAgIjpmcmVldHlwZSIsCisgICAgIjpmeF9mcmVldHlwZSIsCiAgICAgIjpwZGZpdW1fYmFzZSIsCiAgIF0KIH0KQEAgLTEzLDggKzE1LDggQEAKIHNvdXJjZV9zZXQoImJpZ2ludCIpIHsKICAgY29uZmlncyAtPSBbICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpjaHJvbWl1bV9jb2RlIiBdCiAgIGNvbmZpZ3MgKz0gWwotICAgICIvL3RoaXJkX3BhcnR5L3BkZml1bTpwZGZpdW1fY29uZmlnIiwKICAgICAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6bm9fY2hyb21pdW1fY29kZSIsCisgICAgIi8vdGhpcmRfcGFydHkvcGRmaXVtOnBkZml1bV9jb25maWciLAogICBdCiAgIHNvdXJjZXMgPSBbCiAgICAgImJpZ2ludC9CaWdJbnRlZ2VyLmNjIiwKQEAgLTMwLDI0ICszMiwzOSBAQAogICBdCiB9CiAKLXNvdXJjZV9zZXQoImZyZWV0eXBlIikgeworY29uZmlnKCJmeF9mcmVldHlwZV93YXJuaW5ncyIpIHsKKyAgdmlzaWJpbGl0eSA9IFsgIjoqIiBdCisgIGlmIChpc19jbGFuZykgeworICAgICMgb3Blbl9mYWNlX1BTX2Zyb21fc2ZudF9zdHJlYW0oKSBhbmQgb3Blbl9mYWNlX2Zyb21fYnVmZmVyKCkgaW4KKyAgICAjIGZ0YmFzZS5oIGFyZSB1bnVzZWQuCisgICAgY2ZsYWdzID0gWyAiLVduby11bnVzZWQtZnVuY3Rpb24iIF0KKyAgfQorfQorCisjIFRlc3RzIG1heSBsaW5rIGFnYWluc3QgdGhpcyBldmVuIGlmIHRoZSBwcm9kdWN0aW9uIGxpYnJhcnkgZG9lc24ndCwKKyMgc28gaXQgbmVlZHMgdG8gYmUgc2VwYXJhdGUgZnJvbSBpdC4KK3N0YXRpY19saWJyYXJ5KCJmeF9mcmVldHlwZSIpIHsKICAgY29uZmlncyAtPSBbICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpjaHJvbWl1bV9jb2RlIiBdCiAgIGNvbmZpZ3MgKz0gWwotICAgICIvL3RoaXJkX3BhcnR5L3BkZml1bTpwZGZpdW1fY29uZmlnIiwKICAgICAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6bm9fY2hyb21pdW1fY29kZSIsCisgICAgIi8vdGhpcmRfcGFydHkvcGRmaXVtOnBkZml1bV9jb25maWciLAorCisgICAgIyBNdXN0IGJlIGFmdGVyIG5vX2Nocm9taXVtX2NvZGUgZm9yIHdhcm5pbmcgZmxhZ3MgdG8gYmUgb3JkZXJlZCBjb3JyZWN0bHkuCisgICAgIjpmeF9mcmVldHlwZV93YXJuaW5ncyIsCiAgIF0KICAgZGVmaW5lcyA9IFsgIkZUMl9CVUlMRF9MSUJSQVJZIiBdCiAgIHNvdXJjZXMgPSBbCi0gICAgImZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUuaCIsCisgICAgImZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCIsCisgICAgImZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRtbS5oIiwKKyAgICAiZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdG90dmFsLmgiLAorICAgICJmcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0b3V0bG4uaCIsCisgICAgImZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmgiLAorICAgICJmcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmgiLAorICAgICJmcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaCIsCisgICAgImZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvdHR0YWJsZXMuaCIsCiAgICAgImZyZWV0eXBlL2luY2x1ZGUvZnQyYnVpbGQuaCIsCi0gICAgImZyZWV0eXBlL2luY2x1ZGUvZnRtbS5oIiwKLSAgICAiZnJlZXR5cGUvaW5jbHVkZS9mdG90dmFsLmgiLAotICAgICJmcmVldHlwZS9pbmNsdWRlL2Z0b3V0bG4uaCIsCi0gICAgImZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvZnRvYmpzLmgiLAotICAgICJmcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL2Z0c3RyZWFtLmgiLAotICAgICJmcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3R0dHlwZXMuaCIsCi0gICAgImZyZWV0eXBlL2luY2x1ZGUvdHR0YWJsZXMuaCIsCiAgICAgImZyZWV0eXBlL3NyYy9iYXNlL2Z0YmFzZS5jIiwKKyAgICAiZnJlZXR5cGUvc3JjL2Jhc2UvZnRiYXNlLmgiLAogICAgICJmcmVldHlwZS9zcmMvYmFzZS9mdGJpdG1hcC5jIiwKICAgICAiZnJlZXR5cGUvc3JjL2Jhc2UvZnRnbHlwaC5jIiwKICAgICAiZnJlZXR5cGUvc3JjL2Jhc2UvZnRpbml0LmMiLApAQCAtNjksMjAgKzg2LDMwNSBAQAogICBdCiB9CiAKK2NvbmZpZygiZnhfYWdnX3dhcm5pbmdzIikgeworICB2aXNpYmlsaXR5ID0gWyAiOioiIF0KKyAgaWYgKGlzX2NsYW5nKSB7CisgICAgIyBjYWxjX2J1dHRfY2FwKCkgaW4gYWdnX3ZjZ2VuX3N0cm9rZS5jcHAgaXMgdW51c2VkLgorICAgIGNmbGFncyA9IFsgIi1Xbm8tdW51c2VkLWZ1bmN0aW9uIiBdCisgIH0KK30KKworc291cmNlX3NldCgiZnhfYWdnIikgeworICBjb25maWdzIC09IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOmNocm9taXVtX2NvZGUiIF0KKyAgY29uZmlncyArPSBbCisgICAgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOm5vX2Nocm9taXVtX2NvZGUiLAorICAgICIvL3RoaXJkX3BhcnR5L3BkZml1bTpwZGZpdW1fY29uZmlnIiwKKworICAgICMgTXVzdCBiZSBhZnRlciBub19jaHJvbWl1bV9jb2RlIGZvciB3YXJuaW5nIGZsYWdzIHRvIGJlIG9yZGVyZWQgY29ycmVjdGx5LgorICAgICI6ZnhfYWdnX3dhcm5pbmdzIiwKKyAgXQorICBzb3VyY2VzID0gWworICAgICJhZ2cyMy9hZ2dfYmFzaWNzLmgiLAorICAgICJhZ2cyMy9hZ2dfY2xpcF9saWFuZ19iYXJza3kuaCIsCisgICAgImFnZzIzL2FnZ19jb252X2Rhc2guaCIsCisgICAgImFnZzIzL2FnZ19jb252X3N0cm9rZS5oIiwKKyAgICAiYWdnMjMvYWdnX2N1cnZlcy5jcHAiLAorICAgICJhZ2cyMy9hZ2dfY3VydmVzLmgiLAorICAgICJhZ2cyMy9hZ2dfcGF0aF9zdG9yYWdlLmNwcCIsCisgICAgImFnZzIzL2FnZ19wYXRoX3N0b3JhZ2UuaCIsCisgICAgImFnZzIzL2FnZ19yYXN0ZXJpemVyX3NjYW5saW5lX2FhLmNwcCIsCisgICAgImFnZzIzL2FnZ19yYXN0ZXJpemVyX3NjYW5saW5lX2FhLmgiLAorICAgICJhZ2cyMy9hZ2dfcmVuZGVyZXJfc2NhbmxpbmUuaCIsCisgICAgImFnZzIzL2FnZ19yZW5kZXJpbmdfYnVmZmVyLmgiLAorICAgICJhZ2cyMy9hZ2dfc2NhbmxpbmVfdS5oIiwKKyAgICAiYWdnMjMvYWdnX3ZjZ2VuX2Rhc2guY3BwIiwKKyAgICAiYWdnMjMvYWdnX3ZjZ2VuX3N0cm9rZS5jcHAiLAorICBdCit9CisKK2NvbmZpZygiZnhfbGNtczJfd2FybmluZ3MiKSB7CisgIHZpc2liaWxpdHkgPSBbICI6KiIgXQorICBpZiAoaXNfY2xhbmcpIHsKKyAgICBjZmxhZ3MgPSBbCisgICAgICAjIGNtc2x1dC5jYyBpcyBzbG9wcHkgd2l0aCBhZ2dyZWdhdGUgaW5pdGlhbGl6YXRpb24uIFZlcnNpb24gMi43IG9mIHRoaXMKKyAgICAgICMgbGlicmFyeSBkb2Vzbid0IGFwcGVhciB0byBoYXZlIHRoaXMgcHJvYmxlbS4KKyAgICAgICItV25vLW1pc3NpbmctYnJhY2VzIiwKKworICAgICAgIyBGaW5kUHJldigpIGluIGNtc3BsdWdpbi5jIGlzIHVudXNlZC4KKyAgICAgICItV25vLXVudXNlZC1mdW5jdGlvbiIsCisgICAgXQorICB9Cit9CisKK3NvdXJjZV9zZXQoImZ4X2xjbXMyIikgeworICBjb25maWdzIC09IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOmNocm9taXVtX2NvZGUiIF0KKyAgY29uZmlncyArPSBbCisgICAgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOm5vX2Nocm9taXVtX2NvZGUiLAorICAgICIvL3RoaXJkX3BhcnR5L3BkZml1bTpwZGZpdW1fY29uZmlnIiwKKworICAgICMgTXVzdCBiZSBhZnRlciBub19jaHJvbWl1bV9jb2RlIGZvciB3YXJuaW5nIGZsYWdzIHRvIGJlIG9yZGVyZWQgY29ycmVjdGx5LgorICAgICI6ZnhfbGNtczJfd2FybmluZ3MiLAorICBdCisgIHNvdXJjZXMgPSBbCisgICAgImxjbXMyLTIuNi9pbmNsdWRlL2xjbXMyLmgiLAorICAgICJsY21zMi0yLjYvaW5jbHVkZS9sY21zMl9wbHVnaW4uaCIsCisgICAgImxjbXMyLTIuNi9zcmMvY21zY2FtMDIuYyIsCisgICAgImxjbXMyLTIuNi9zcmMvY21zY2dhdHMuYyIsCisgICAgImxjbXMyLTIuNi9zcmMvY21zY252cnQuYyIsCisgICAgImxjbXMyLTIuNi9zcmMvY21zZXJyLmMiLAorICAgICJsY21zMi0yLjYvc3JjL2Ntc2dhbW1hLmMiLAorICAgICJsY21zMi0yLjYvc3JjL2Ntc2dtdC5jIiwKKyAgICAibGNtczItMi42L3NyYy9jbXNoYWxmLmMiLAorICAgICJsY21zMi0yLjYvc3JjL2Ntc2ludHJwLmMiLAorICAgICJsY21zMi0yLjYvc3JjL2Ntc2lvMC5jIiwKKyAgICAibGNtczItMi42L3NyYy9jbXNpbzEuYyIsCisgICAgImxjbXMyLTIuNi9zcmMvY21zbHV0LmMiLAorICAgICJsY21zMi0yLjYvc3JjL2Ntc21kNS5jIiwKKyAgICAibGNtczItMi42L3NyYy9jbXNtdHJ4LmMiLAorICAgICJsY21zMi0yLjYvc3JjL2Ntc25hbWVkLmMiLAorICAgICJsY21zMi0yLjYvc3JjL2Ntc29wdC5jIiwKKyAgICAibGNtczItMi42L3NyYy9jbXNwYWNrLmMiLAorICAgICJsY21zMi0yLjYvc3JjL2Ntc3Bjcy5jIiwKKyAgICAibGNtczItMi42L3NyYy9jbXNwbHVnaW4uYyIsCisgICAgImxjbXMyLTIuNi9zcmMvY21zcHMyLmMiLAorICAgICJsY21zMi0yLjYvc3JjL2Ntc3NhbXAuYyIsCisgICAgImxjbXMyLTIuNi9zcmMvY21zc20uYyIsCisgICAgImxjbXMyLTIuNi9zcmMvY21zdHlwZXMuYyIsCisgICAgImxjbXMyLTIuNi9zcmMvY21zdmlydC5jIiwKKyAgICAibGNtczItMi42L3NyYy9jbXN3dHBudC5jIiwKKyAgICAibGNtczItMi42L3NyYy9jbXN4Zm9ybS5jIiwKKyAgXQorfQorCisjIFRoaXMgaXMgb25seSB1c2VkIGZvciBzdGFuZGFsb25lIGJ1aWxkcy4KK3NvdXJjZV9zZXQoImpwZWciKSB7CisgIGNvbmZpZ3MgLT0gWyAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6Y2hyb21pdW1fY29kZSIgXQorICBjb25maWdzICs9IFsKKyAgICAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6bm9fY2hyb21pdW1fY29kZSIsCisgICAgIi8vdGhpcmRfcGFydHkvcGRmaXVtOnBkZml1bV9jb25maWciLAorICBdCisgIHNvdXJjZXMgPSBbCisgICAgImxpYmpwZWcvY2RlcnJvci5oIiwKKyAgICAibGlianBlZy9jZGpwZWcuaCIsCisgICAgImxpYmpwZWcvZnBkZmFwaV9qY2FwaW1pbi5jIiwKKyAgICAibGlianBlZy9mcGRmYXBpX2pjYXBpc3RkLmMiLAorICAgICJsaWJqcGVnL2ZwZGZhcGlfamNjb2VmY3QuYyIsCisgICAgImxpYmpwZWcvZnBkZmFwaV9qY2NvbG9yLmMiLAorICAgICJsaWJqcGVnL2ZwZGZhcGlfamNkY3RtZ3IuYyIsCisgICAgImxpYmpwZWcvZnBkZmFwaV9qY2h1ZmYuYyIsCisgICAgImxpYmpwZWcvZnBkZmFwaV9qY2luaXQuYyIsCisgICAgImxpYmpwZWcvZnBkZmFwaV9qY21haW5jdC5jIiwKKyAgICAibGlianBlZy9mcGRmYXBpX2pjbWFya2VyLmMiLAorICAgICJsaWJqcGVnL2ZwZGZhcGlfamNtYXN0ZXIuYyIsCisgICAgImxpYmpwZWcvZnBkZmFwaV9qY29tYXBpLmMiLAorICAgICJsaWJqcGVnL2ZwZGZhcGlfamNwYXJhbS5jIiwKKyAgICAibGlianBlZy9mcGRmYXBpX2pjcGh1ZmYuYyIsCisgICAgImxpYmpwZWcvZnBkZmFwaV9qY3ByZXBjdC5jIiwKKyAgICAibGlianBlZy9mcGRmYXBpX2pjc2FtcGxlLmMiLAorICAgICJsaWJqcGVnL2ZwZGZhcGlfamN0cmFucy5jIiwKKyAgICAibGlianBlZy9mcGRmYXBpX2pkYXBpbWluLmMiLAorICAgICJsaWJqcGVnL2ZwZGZhcGlfamRhcGlzdGQuYyIsCisgICAgImxpYmpwZWcvZnBkZmFwaV9qZGNvZWZjdC5jIiwKKyAgICAibGlianBlZy9mcGRmYXBpX2pkY29sb3IuYyIsCisgICAgImxpYmpwZWcvZnBkZmFwaV9qZGRjdG1nci5jIiwKKyAgICAibGlianBlZy9mcGRmYXBpX2pkaHVmZi5jIiwKKyAgICAibGlianBlZy9mcGRmYXBpX2pkaW5wdXQuYyIsCisgICAgImxpYmpwZWcvZnBkZmFwaV9qZG1haW5jdC5jIiwKKyAgICAibGlianBlZy9mcGRmYXBpX2pkbWFya2VyLmMiLAorICAgICJsaWJqcGVnL2ZwZGZhcGlfamRtYXN0ZXIuYyIsCisgICAgImxpYmpwZWcvZnBkZmFwaV9qZG1lcmdlLmMiLAorICAgICJsaWJqcGVnL2ZwZGZhcGlfamRwaHVmZi5jIiwKKyAgICAibGlianBlZy9mcGRmYXBpX2pkcG9zdGN0LmMiLAorICAgICJsaWJqcGVnL2ZwZGZhcGlfamRzYW1wbGUuYyIsCisgICAgImxpYmpwZWcvZnBkZmFwaV9qZHRyYW5zLmMiLAorICAgICJsaWJqcGVnL2ZwZGZhcGlfamVycm9yLmMiLAorICAgICJsaWJqcGVnL2ZwZGZhcGlfamZkY3Rmc3QuYyIsCisgICAgImxpYmpwZWcvZnBkZmFwaV9qZmRjdGludC5jIiwKKyAgICAibGlianBlZy9mcGRmYXBpX2ppZGN0ZnN0LmMiLAorICAgICJsaWJqcGVnL2ZwZGZhcGlfamlkY3RpbnQuYyIsCisgICAgImxpYmpwZWcvZnBkZmFwaV9qaWRjdHJlZC5jIiwKKyAgICAibGlianBlZy9mcGRmYXBpX2ptZW1tZ3IuYyIsCisgICAgImxpYmpwZWcvZnBkZmFwaV9qbWVtbm9icy5jIiwKKyAgICAibGlianBlZy9mcGRmYXBpX2p1dGlscy5jIiwKKyAgICAibGlianBlZy9qY2h1ZmYuaCIsCisgICAgImxpYmpwZWcvamNvbmZpZy5oIiwKKyAgICAibGlianBlZy9qZGN0LmgiLAorICAgICJsaWJqcGVnL2pkaHVmZi5oIiwKKyAgICAibGlianBlZy9qZXJyb3IuaCIsCisgICAgImxpYmpwZWcvamluY2x1ZGUuaCIsCisgICAgImxpYmpwZWcvam1lbXN5cy5oIiwKKyAgICAibGlianBlZy9qbW9yZWNmZy5oIiwKKyAgICAibGlianBlZy9qcGVnaW50LmgiLAorICAgICJsaWJqcGVnL2pwZWdsaWIuaCIsCisgICAgImxpYmpwZWcvanZlcnNpb24uaCIsCisgICAgImxpYmpwZWcvbWFrZWZpbGUiLAorICAgICJsaWJqcGVnL3RyYW5zdXBwLmgiLAorICBdCit9CisKK3NvdXJjZV9zZXQoImZ4X2xpYm9wZW5qcGVnIikgeworICBjb25maWdzIC09IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOmNocm9taXVtX2NvZGUiIF0KKyAgY29uZmlncyArPSBbCisgICAgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOm5vX2Nocm9taXVtX2NvZGUiLAorICAgICIvL3RoaXJkX3BhcnR5L3BkZml1bTpwZGZpdW1fY29uZmlnIiwKKyAgXQorICBzb3VyY2VzID0gWworICAgICJsaWJvcGVuanBlZzIwL2Jpby5jIiwKKyAgICAibGlib3BlbmpwZWcyMC9jaW8uYyIsCisgICAgImxpYm9wZW5qcGVnMjAvZHd0LmMiLAorICAgICJsaWJvcGVuanBlZzIwL2V2ZW50LmMiLAorICAgICJsaWJvcGVuanBlZzIwL2Z1bmN0aW9uX2xpc3QuYyIsCisgICAgImxpYm9wZW5qcGVnMjAvaW1hZ2UuYyIsCisgICAgImxpYm9wZW5qcGVnMjAvaW52ZXJ0LmMiLAorICAgICJsaWJvcGVuanBlZzIwL2oyay5jIiwKKyAgICAibGlib3BlbmpwZWcyMC9qcDIuYyIsCisgICAgImxpYm9wZW5qcGVnMjAvbWN0LmMiLAorICAgICJsaWJvcGVuanBlZzIwL21xYy5jIiwKKyAgICAibGlib3BlbmpwZWcyMC9vcGVuanBlZy5jIiwKKyAgICAibGlib3BlbmpwZWcyMC9vcGpfY2xvY2suYyIsCisgICAgImxpYm9wZW5qcGVnMjAvcGkuYyIsCisgICAgImxpYm9wZW5qcGVnMjAvcmF3LmMiLAorICAgICJsaWJvcGVuanBlZzIwL3QxLmMiLAorICAgICJsaWJvcGVuanBlZzIwL3QyLmMiLAorICAgICJsaWJvcGVuanBlZzIwL3RjZC5jIiwKKyAgICAibGlib3BlbmpwZWcyMC90Z3QuYyIsCisgIF0KK30KKworc291cmNlX3NldCgiZnhfbHBuZyIpIHsKKyAgY29uZmlncyAtPSBbICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpjaHJvbWl1bV9jb2RlIiBdCisgIGNvbmZpZ3MgKz0gWworICAgICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpub19jaHJvbWl1bV9jb2RlIiwKKyAgICAiLy90aGlyZF9wYXJ0eS9wZGZpdW06cGRmaXVtX2NvbmZpZyIsCisgIF0KKyAgc291cmNlcyA9IFsKKyAgICAibHBuZ192MTYzL3BuZy5oIiwKKyAgICAibHBuZ192MTYzL3BuZy5jIiwKKyAgICAibHBuZ192MTYzL3BuZ2Vycm9yLmMiLAorICAgICJscG5nX3YxNjMvcG5nZ2V0LmMiLAorICAgICJscG5nX3YxNjMvcG5nbWVtLmMiLAorICAgICJscG5nX3YxNjMvcG5ncHJlYWQuYyIsCisgICAgImxwbmdfdjE2My9wbmdyZWFkLmMiLAorICAgICJscG5nX3YxNjMvcG5ncmlvLmMiLAorICAgICJscG5nX3YxNjMvcG5ncnRyYW4uYyIsCisgICAgImxwbmdfdjE2My9wbmdydXRpbC5jIiwKKyAgICAibHBuZ192MTYzL3BuZ3NldC5jIiwKKyAgICAibHBuZ192MTYzL3BuZ3RyYW5zLmMiLAorICAgICJscG5nX3YxNjMvcG5nd2lvLmMiLAorICAgICJscG5nX3YxNjMvcG5nd3JpdGUuYyIsCisgICAgImxwbmdfdjE2My9wbmd3dHJhbi5jIiwKKyAgICAibHBuZ192MTYzL3BuZ3d1dGlsLmMiLAorICBdCit9CisKK2lmIChwZGZfZW5hYmxlX3hmYSkgeworICBzb3VyY2Vfc2V0KCJmeF90aWZmIikgeworICAgIGNvbmZpZ3MgLT0gWyAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6Y2hyb21pdW1fY29kZSIgXQorICAgIGNvbmZpZ3MgKz0gWworICAgICAgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOm5vX2Nocm9taXVtX2NvZGUiLAorICAgICAgIi8vdGhpcmRfcGFydHkvcGRmaXVtOnBkZml1bV9jb25maWciLAorICAgIF0KKyAgICBkZXBzID0gWyAiLy90aGlyZF9wYXJ0eTpqcGVnIiBdCisgICAgc291cmNlcyA9IFsKKyAgICAgICJsaWJ0aWZmL3RpZmZpb3AuaCIsCisgICAgICAibGlidGlmZi90aWZmdmVycy5oIiwKKyAgICAgICJsaWJ0aWZmL3RpZl9hdXguYyIsCisgICAgICAibGlidGlmZi90aWZfY2xvc2UuYyIsCisgICAgICAibGlidGlmZi90aWZfY29kZWMuYyIsCisgICAgICAibGlidGlmZi90aWZfY29sb3IuYyIsCisgICAgICAibGlidGlmZi90aWZfY29tcHJlc3MuYyIsCisgICAgICAibGlidGlmZi90aWZfZGlyLmMiLAorICAgICAgImxpYnRpZmYvdGlmX2RpcmluZm8uYyIsCisgICAgICAibGlidGlmZi90aWZfZGlycmVhZC5jIiwKKyAgICAgICJsaWJ0aWZmL3RpZl9kaXJ3cml0ZS5jIiwKKyAgICAgICJsaWJ0aWZmL3RpZl9kdW1wbW9kZS5jIiwKKyAgICAgICJsaWJ0aWZmL3RpZl9lcnJvci5jIiwKKyAgICAgICJsaWJ0aWZmL3RpZl9leHRlbnNpb24uYyIsCisgICAgICAibGlidGlmZi90aWZfZmF4My5jIiwKKyAgICAgICJsaWJ0aWZmL3RpZl9mYXgzc20uYyIsCisgICAgICAibGlidGlmZi90aWZfZmx1c2guYyIsCisgICAgICAibGlidGlmZi90aWZfZ2V0aW1hZ2UuYyIsCisgICAgICAibGlidGlmZi90aWZfanBlZy5jIiwKKyAgICAgICJsaWJ0aWZmL3RpZl9sdXYuYyIsCisgICAgICAibGlidGlmZi90aWZfbHp3LmMiLAorICAgICAgImxpYnRpZmYvdGlmX25leHQuYyIsCisgICAgICAibGlidGlmZi90aWZfb2pwZWcuYyIsCisgICAgICAibGlidGlmZi90aWZfb3Blbi5jIiwKKyAgICAgICJsaWJ0aWZmL3RpZl9wYWNrYml0cy5jIiwKKyAgICAgICJsaWJ0aWZmL3RpZl9waXhhcmxvZy5jIiwKKyAgICAgICJsaWJ0aWZmL3RpZl9wcmVkaWN0LmMiLAorICAgICAgImxpYnRpZmYvdGlmX3ByaW50LmMiLAorICAgICAgImxpYnRpZmYvdGlmX3JlYWQuYyIsCisgICAgICAibGlidGlmZi90aWZfc3RyaXAuYyIsCisgICAgICAibGlidGlmZi90aWZfc3dhYi5jIiwKKyAgICAgICJsaWJ0aWZmL3RpZl90aHVuZGVyLmMiLAorICAgICAgImxpYnRpZmYvdGlmX3RpbGUuYyIsCisgICAgICAibGlidGlmZi90aWZfdmVyc2lvbi5jIiwKKyAgICAgICJsaWJ0aWZmL3RpZl93YXJuaW5nLmMiLAorICAgICAgImxpYnRpZmYvdGlmX3dyaXRlLmMiLAorICAgICAgImxpYnRpZmYvdGlmX3ppcC5jIiwKKyAgICBdCisgIH0KK30KKworc291cmNlX3NldCgiZnhfemxpYiIpIHsKKyAgY29uZmlncyAtPSBbICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpjaHJvbWl1bV9jb2RlIiBdCisgIGNvbmZpZ3MgKz0gWworICAgICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpub19jaHJvbWl1bV9jb2RlIiwKKyAgICAiLy90aGlyZF9wYXJ0eS9wZGZpdW06cGRmaXVtX2NvbmZpZyIsCisgIF0KKyAgc291cmNlcyA9IFsKKyAgICAiemxpYl92MTI4L2FkbGVyMzIuYyIsCisgICAgInpsaWJfdjEyOC9jb21wcmVzcy5jIiwKKyAgICAiemxpYl92MTI4L2NyYzMyLmMiLAorICAgICJ6bGliX3YxMjgvZGVmbGF0ZS5jIiwKKyAgICAiemxpYl92MTI4L2d6Y2xvc2UuYyIsCisgICAgInpsaWJfdjEyOC9nemxpYi5jIiwKKyAgICAiemxpYl92MTI4L2d6cmVhZC5jIiwKKyAgICAiemxpYl92MTI4L2d6d3JpdGUuYyIsCisgICAgInpsaWJfdjEyOC9pbmZiYWNrLmMiLAorICAgICJ6bGliX3YxMjgvaW5mZmFzdC5jIiwKKyAgICAiemxpYl92MTI4L2luZmxhdGUuYyIsCisgICAgInpsaWJfdjEyOC9pbmZ0cmVlcy5jIiwKKyAgICAiemxpYl92MTI4L3RyZWVzLmMiLAorICAgICJ6bGliX3YxMjgvdW5jb21wci5jIiwKKyAgICAiemxpYl92MTI4L3p1dGlsLmMiLAorICBdCit9CisKIHNvdXJjZV9zZXQoInBkZml1bV9iYXNlIikgewogICBjb25maWdzIC09IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOmNocm9taXVtX2NvZGUiIF0KICAgY29uZmlncyArPSBbCi0gICAgIi8vdGhpcmRfcGFydHkvcGRmaXVtOnBkZml1bV9jb25maWciLAogICAgICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpub19jaHJvbWl1bV9jb2RlIiwKKyAgICAiLy90aGlyZF9wYXJ0eS9wZGZpdW06cGRmaXVtX2NvbmZpZyIsCiAgIF0KICAgc291cmNlcyA9IFsKICAgICAiYmFzZS9sb2dnaW5nLmgiLAogICAgICJiYXNlL21hY3Jvcy5oIiwKLSAgICAiYmFzZS9ub25zdGRfdW5pcXVlX3B0ci5oIiwKICAgICAiYmFzZS9udW1lcmljcy9zYWZlX2NvbnZlcnNpb25zLmgiLAogICAgICJiYXNlL251bWVyaWNzL3NhZmVfY29udmVyc2lvbnNfaW1wbC5oIiwKICAgICAiYmFzZS9udW1lcmljcy9zYWZlX21hdGguaCIsCiAgICAgImJhc2UvbnVtZXJpY3Mvc2FmZV9tYXRoX2ltcGwuaCIsCi0gICAgImJhc2UvdGVtcGxhdGVfdXRpbC5oIiwKKyAgICAiYmFzZS9zdGxfdXRpbC5oIiwKICAgXQogfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvREVQUyBiL3RoaXJkX3BhcnR5L0RFUFMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIxYTI4ZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L0RFUFMKQEAgLTAsMCArMSw3IEBACitpbmNsdWRlX3J1bGVzID0gWworICAjIEEgbG90IG9mIHRoaXJkX3BhcnR5IGNvZGUgaGFzIGJlZW4gbW9kaWZpZWQgdG8gdXNlIGZ4Y3J0LgorICAnK2NvcmUvaW5jbHVkZS9meGNydC9meF9iYXNpYy5oJywKKyAgJytjb3JlL2luY2x1ZGUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCcsCisgICcrY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X21lbW9yeS5oJywKKyAgJytjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmgnLAorXQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWdnMjMvYWdnX2FycmF5LmggYi90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfYXJyYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjJhNWMyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYWdnMjMvYWdnX2FycmF5LmgKQEAgLTAsMCArMSw1MDkgQEAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBbnRpLUdyYWluIEdlb21ldHJ5IC0gVmVyc2lvbiAyLjMKKy8vIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IE1heGltIFNoZW1hbmFyZXYgKGh0dHA6Ly93d3cuYW50aWdyYWluLmNvbSkKKy8vCisvLyBQZXJtaXNzaW9uIHRvIGNvcHksIHVzZSwgbW9kaWZ5LCBzZWxsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGdyYW50ZWQgcHJvdmlkZWQgdGhpcyBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcy4KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHksIGFuZCB3aXRoIG5vIGNsYWltIGFzIHRvIGl0cyBzdWl0YWJpbGl0eSBmb3IgYW55IHB1cnBvc2UuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb250YWN0OiBtY3NlZW1AYW50aWdyYWluLmNvbQorLy8gICAgICAgICAgbWNzZWVtYWdnQHlhaG9vLmNvbQorLy8gICAgICAgICAgaHR0cDovL3d3dy5hbnRpZ3JhaW4uY29tCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZm5kZWYgQUdHX0FSUkFZX0lOQ0xVREVECisjZGVmaW5lIEFHR19BUlJBWV9JTkNMVURFRAorCisjaW5jbHVkZSAiYWdnX2Jhc2ljcy5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9tZW1vcnkuaCIgIC8vIEZvciBGWFNZU18qIG1hY3Jvcy4KKworbmFtZXNwYWNlIGFnZworewordGVtcGxhdGUgPGNsYXNzIFQ+CitjbGFzcyBwb2RfYXJyYXkgeworcHVibGljOgorICAgIHR5cGVkZWYgVCB2YWx1ZV90eXBlOworICAgIH5wb2RfYXJyYXkoKQorICAgIHsKKyAgICAgICAgRlhfRnJlZShtX2FycmF5KTsKKyAgICB9CisgICAgcG9kX2FycmF5KCkgOiBtX3NpemUoMCksIG1fY2FwYWNpdHkoMCksIG1fYXJyYXkoMCkge30KKyAgICBwb2RfYXJyYXkodW5zaWduZWQgY2FwLCB1bnNpZ25lZCBleHRyYV90YWlsID0gMCk7CisgICAgcG9kX2FycmF5KGNvbnN0IHBvZF9hcnJheTxUPiYpOworICAgIGNvbnN0IHBvZF9hcnJheTxUPiYgb3BlcmF0b3IgPSAoY29uc3QgcG9kX2FycmF5PFQ+Jik7CisgICAgdm9pZCBjYXBhY2l0eSh1bnNpZ25lZCBjYXAsIHVuc2lnbmVkIGV4dHJhX3RhaWwgPSAwKTsKKyAgICB1bnNpZ25lZCBjYXBhY2l0eSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9jYXBhY2l0eTsKKyAgICB9CisgICAgdm9pZCBhbGxvY2F0ZSh1bnNpZ25lZCBzaXplLCB1bnNpZ25lZCBleHRyYV90YWlsID0gMCk7CisgICAgdm9pZCByZXNpemUodW5zaWduZWQgbmV3X3NpemUpOworICAgIHZvaWQgemVybygpCisgICAgeworICAgICAgICBGWFNZU19tZW1zZXQobV9hcnJheSwgMCwgc2l6ZW9mKFQpICogbV9zaXplKTsKKyAgICB9CisgICAgdm9pZCBhZGQoY29uc3QgVCYgdikKKyAgICB7CisgICAgICAgIG1fYXJyYXlbbV9zaXplKytdID0gdjsKKyAgICB9CisgICAgdm9pZCBpbmNfc2l6ZSh1bnNpZ25lZCBzaXplKQorICAgIHsKKyAgICAgICAgbV9zaXplICs9IHNpemU7CisgICAgfQorICAgIHVuc2lnbmVkIHNpemUoKSAgICAgIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9zaXplOworICAgIH0KKyAgICB1bnNpZ25lZCBieXRlX3NpemUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fc2l6ZSAqIHNpemVvZihUKTsKKyAgICB9CisgICAgY29uc3QgVCYgb3BlcmF0b3IgW10gKHVuc2lnbmVkIGkpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9hcnJheVtpXTsKKyAgICB9CisgICAgVCYgb3BlcmF0b3IgW10gKHVuc2lnbmVkIGkpCisgICAgeworICAgICAgICByZXR1cm4gbV9hcnJheVtpXTsKKyAgICB9CisgICAgY29uc3QgVCYgYXQodW5zaWduZWQgaSkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX2FycmF5W2ldOworICAgIH0KKyAgICBUJiBhdCh1bnNpZ25lZCBpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fYXJyYXlbaV07CisgICAgfQorICAgIFQgIHZhbHVlX2F0KHVuc2lnbmVkIGkpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9hcnJheVtpXTsKKyAgICB9CisgICAgY29uc3QgVCogZGF0YSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9hcnJheTsKKyAgICB9CisgICAgVCogZGF0YSgpCisgICAgeworICAgICAgICByZXR1cm4gbV9hcnJheTsKKyAgICB9CisgICAgdm9pZCByZW1vdmVfYWxsKCkKKyAgICB7CisgICAgICAgIG1fc2l6ZSA9IDA7CisgICAgfQorICAgIHZvaWQgY3V0X2F0KHVuc2lnbmVkIG51bSkKKyAgICB7CisgICAgICAgIGlmKG51bSA8IG1fc2l6ZSkgeworICAgICAgICAgICAgbV9zaXplID0gbnVtOworICAgICAgICB9CisgICAgfQorcHJpdmF0ZToKKyAgICB1bnNpZ25lZCBtX3NpemU7CisgICAgdW5zaWduZWQgbV9jYXBhY2l0eTsKKyAgICBUKiAgICAgICBtX2FycmF5OworfTsKK3RlbXBsYXRlPGNsYXNzIFQ+Cit2b2lkIHBvZF9hcnJheTxUPjo6Y2FwYWNpdHkodW5zaWduZWQgY2FwLCB1bnNpZ25lZCBleHRyYV90YWlsKQoreworICAgIG1fc2l6ZSA9IDA7CisgICAgdW5zaWduZWQgZnVsbF9jYXAgPSBjYXAgKyBleHRyYV90YWlsOworICAgIGlmKGZ1bGxfY2FwIDwgY2FwKSB7CisgICAgICAgIEZYX0ZyZWUobV9hcnJheSk7CisgICAgICAgIG1fYXJyYXkgPSAwOworICAgICAgICBtX2NhcGFjaXR5ID0gMDsKKyAgICB9IGVsc2UgaWYoZnVsbF9jYXAgPiBtX2NhcGFjaXR5KSB7CisgICAgICAgIEZYX0ZyZWUobV9hcnJheSk7CisgICAgICAgIG1fYXJyYXkgPSBGWF9BbGxvYyhULCBmdWxsX2NhcCk7CisgICAgICAgIG1fY2FwYWNpdHkgPSBmdWxsX2NhcDsKKyAgICB9Cit9Cit0ZW1wbGF0ZTxjbGFzcyBUPgordm9pZCBwb2RfYXJyYXk8VD46OmFsbG9jYXRlKHVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIGV4dHJhX3RhaWwpCit7CisgICAgY2FwYWNpdHkoc2l6ZSwgZXh0cmFfdGFpbCk7CisgICAgbV9zaXplID0gc2l6ZTsKK30KK3RlbXBsYXRlPGNsYXNzIFQ+Cit2b2lkIHBvZF9hcnJheTxUPjo6cmVzaXplKHVuc2lnbmVkIG5ld19zaXplKQoreworICAgIGlmKG5ld19zaXplID4gbV9zaXplKSB7CisgICAgICAgIGlmKG5ld19zaXplID4gbV9jYXBhY2l0eSkgeworICAgICAgICAgICAgVCogZGF0YSA9IEZYX0FsbG9jKFQsIG5ld19zaXplKTsKKyAgICAgICAgICAgIEZYU1lTX21lbWNweShkYXRhLCBtX2FycmF5LCBtX3NpemUgKiBzaXplb2YoVCkpOworICAgICAgICAgICAgRlhfRnJlZShtX2FycmF5KTsKKyAgICAgICAgICAgIG1fYXJyYXkgPSBkYXRhOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV9zaXplID0gbmV3X3NpemU7CisgICAgfQorfQordGVtcGxhdGU8Y2xhc3MgVD4gcG9kX2FycmF5PFQ+Ojpwb2RfYXJyYXkodW5zaWduZWQgY2FwLCB1bnNpZ25lZCBleHRyYV90YWlsKSA6CisgICAgbV9zaXplKDApLCBtX2NhcGFjaXR5KGNhcCArIGV4dHJhX3RhaWwpLCBtX2FycmF5KEZYX0FsbG9jKFQsIG1fY2FwYWNpdHkpKSB7fQordGVtcGxhdGU8Y2xhc3MgVD4gcG9kX2FycmF5PFQ+Ojpwb2RfYXJyYXkoY29uc3QgcG9kX2FycmF5PFQ+JiB2KSA6CisgICAgbV9zaXplKHYubV9zaXplKSwKKyAgICBtX2NhcGFjaXR5KHYubV9jYXBhY2l0eSksCisgICAgbV9hcnJheSh2Lm1fY2FwYWNpdHkgPyBGWF9BbGxvYyhULCB2Lm1fY2FwYWNpdHkpIDogMCkKK3sKKyAgICBGWFNZU19tZW1jcHkobV9hcnJheSwgdi5tX2FycmF5LCBzaXplb2YoVCkgKiB2Lm1fc2l6ZSk7Cit9Cit0ZW1wbGF0ZTxjbGFzcyBUPiBjb25zdCBwb2RfYXJyYXk8VD4mCitwb2RfYXJyYXk8VD46Om9wZXJhdG9yID0gKGNvbnN0IHBvZF9hcnJheTxUPiZ2KQoreworICAgIGFsbG9jYXRlKHYubV9zaXplKTsKKyAgICBpZih2Lm1fc2l6ZSkgeworICAgICAgICBGWFNZU19tZW1jcHkobV9hcnJheSwgdi5tX2FycmF5LCBzaXplb2YoVCkgKiB2Lm1fc2l6ZSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKK30KK3RlbXBsYXRlPGNsYXNzIFQsIHVuc2lnbmVkIFMgPSA2PiBjbGFzcyBwb2RfZGVxdWUgCit7CitwdWJsaWM6CisgICAgZW51bSBibG9ja19zY2FsZV9lIHsKKyAgICAgICAgYmxvY2tfc2hpZnQgPSBTLAorICAgICAgICBibG9ja19zaXplICA9IDEgPDwgYmxvY2tfc2hpZnQsCisgICAgICAgIGJsb2NrX21hc2sgID0gYmxvY2tfc2l6ZSAtIDEKKyAgICB9OworICAgIHR5cGVkZWYgVCB2YWx1ZV90eXBlOworICAgIH5wb2RfZGVxdWUoKTsKKyAgICBwb2RfZGVxdWUoKTsKKyAgICBwb2RfZGVxdWUodW5zaWduZWQgYmxvY2tfcHRyX2luYyk7CisgICAgcG9kX2RlcXVlKGNvbnN0IHBvZF9kZXF1ZTxULCBTPiYgdik7CisgICAgY29uc3QgcG9kX2RlcXVlPFQsIFM+JiBvcGVyYXRvciA9IChjb25zdCBwb2RfZGVxdWU8VCwgUz4mIHYpOworICAgIHZvaWQgcmVtb3ZlX2FsbCgpCisgICAgeworICAgICAgICBtX3NpemUgPSAwOworICAgIH0KKyAgICB2b2lkIGZyZWVfYWxsKCkKKyAgICB7CisgICAgICAgIGZyZWVfdGFpbCgwKTsKKyAgICB9CisgICAgdm9pZCBmcmVlX3RhaWwodW5zaWduZWQgc2l6ZSk7CisgICAgdm9pZCBhZGQoY29uc3QgVCYgdmFsKTsKKyAgICB2b2lkIG1vZGlmeV9sYXN0KGNvbnN0IFQmIHZhbCk7CisgICAgdm9pZCByZW1vdmVfbGFzdCgpOworICAgIGludCBhbGxvY2F0ZV9jb250aW51b3VzX2Jsb2NrKHVuc2lnbmVkIG51bV9lbGVtZW50cyk7CisgICAgdm9pZCBhZGRfYXJyYXkoY29uc3QgVCogcHRyLCB1bnNpZ25lZCBudW1fZWxlbSkKKyAgICB7CisgICAgICAgIHdoaWxlKG51bV9lbGVtLS0pIHsKKyAgICAgICAgICAgIGFkZCgqcHRyKyspOworICAgICAgICB9CisgICAgfQorICAgIHRlbXBsYXRlPGNsYXNzIERhdGFBY2Nlc3Nvcj4gdm9pZCBhZGRfZGF0YShEYXRhQWNjZXNzb3ImIGRhdGEpCisgICAgeworICAgICAgICB3aGlsZShkYXRhLnNpemUoKSkgeworICAgICAgICAgICAgYWRkKCpkYXRhKTsKKyAgICAgICAgICAgICsrZGF0YTsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIGN1dF9hdCh1bnNpZ25lZCBzaXplKQorICAgIHsKKyAgICAgICAgaWYoc2l6ZSA8IG1fc2l6ZSkgeworICAgICAgICAgICAgbV9zaXplID0gc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICB1bnNpZ25lZCBzaXplKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX3NpemU7CisgICAgfQorICAgIGNvbnN0IFQmIG9wZXJhdG9yIFtdICh1bnNpZ25lZCBpKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fYmxvY2tzW2kgPj4gYmxvY2tfc2hpZnRdW2kgJiBibG9ja19tYXNrXTsKKyAgICB9CisgICAgVCYgb3BlcmF0b3IgW10gKHVuc2lnbmVkIGkpCisgICAgeworICAgICAgICByZXR1cm4gbV9ibG9ja3NbaSA+PiBibG9ja19zaGlmdF1baSAmIGJsb2NrX21hc2tdOworICAgIH0KKyAgICBjb25zdCBUJiBhdCh1bnNpZ25lZCBpKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fYmxvY2tzW2kgPj4gYmxvY2tfc2hpZnRdW2kgJiBibG9ja19tYXNrXTsKKyAgICB9CisgICAgVCYgYXQodW5zaWduZWQgaSkKKyAgICB7CisgICAgICAgIHJldHVybiBtX2Jsb2Nrc1tpID4+IGJsb2NrX3NoaWZ0XVtpICYgYmxvY2tfbWFza107CisgICAgfQorICAgIFQgdmFsdWVfYXQodW5zaWduZWQgaSkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX2Jsb2Nrc1tpID4+IGJsb2NrX3NoaWZ0XVtpICYgYmxvY2tfbWFza107CisgICAgfQorICAgIGNvbnN0IFQmIGN1cnIodW5zaWduZWQgaWR4KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuICgqdGhpcylbaWR4XTsKKyAgICB9CisgICAgVCYgY3Vycih1bnNpZ25lZCBpZHgpCisgICAgeworICAgICAgICByZXR1cm4gKCp0aGlzKVtpZHhdOworICAgIH0KKyAgICBjb25zdCBUJiBwcmV2KHVuc2lnbmVkIGlkeCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAoKnRoaXMpWyhpZHggKyBtX3NpemUgLSAxKSAlIG1fc2l6ZV07CisgICAgfQorICAgIFQmIHByZXYodW5zaWduZWQgaWR4KQorICAgIHsKKyAgICAgICAgcmV0dXJuICgqdGhpcylbKGlkeCArIG1fc2l6ZSAtIDEpICUgbV9zaXplXTsKKyAgICB9CisgICAgY29uc3QgVCYgbmV4dCh1bnNpZ25lZCBpZHgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gKCp0aGlzKVsoaWR4ICsgMSkgJSBtX3NpemVdOworICAgIH0KKyAgICBUJiBuZXh0KHVuc2lnbmVkIGlkeCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKnRoaXMpWyhpZHggKyAxKSAlIG1fc2l6ZV07CisgICAgfQorICAgIGNvbnN0IFQmIGxhc3QoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuICgqdGhpcylbbV9zaXplIC0gMV07CisgICAgfQorICAgIFQmIGxhc3QoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgqdGhpcylbbV9zaXplIC0gMV07CisgICAgfQorICAgIHVuc2lnbmVkIGJ5dGVfc2l6ZSgpIGNvbnN0OworICAgIGNvbnN0IFQqIGJsb2NrKHVuc2lnbmVkIG5iKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fYmxvY2tzW25iXTsKKyAgICB9CitwdWJsaWM6CisgICAgdm9pZCBhbGxvY2F0ZV9ibG9jayh1bnNpZ25lZCBuYik7CisgICAgVCogICBkYXRhX3B0cigpOworICAgIHVuc2lnbmVkICAgICAgICBtX3NpemU7CisgICAgdW5zaWduZWQgICAgICAgIG1fbnVtX2Jsb2NrczsKKyAgICB1bnNpZ25lZCAgICAgICAgbV9tYXhfYmxvY2tzOworICAgIFQqKiAgICAgICAgICAgICBtX2Jsb2NrczsKKyAgICB1bnNpZ25lZCAgICAgICAgbV9ibG9ja19wdHJfaW5jOworfTsKK3RlbXBsYXRlPGNsYXNzIFQsIHVuc2lnbmVkIFM+IHBvZF9kZXF1ZTxULCBTPjo6fnBvZF9kZXF1ZSgpCit7CisgICAgaWYobV9udW1fYmxvY2tzKSB7CisgICAgICAgIFQqKiBibGsgPSBtX2Jsb2NrcyArIG1fbnVtX2Jsb2NrcyAtIDE7CisgICAgICAgIHdoaWxlKG1fbnVtX2Jsb2Nrcy0tKSB7CisgICAgICAgICAgICBGWF9GcmVlKCpibGspOworICAgICAgICAgICAgLS1ibGs7CisgICAgICAgIH0KKyAgICAgICAgRlhfRnJlZShtX2Jsb2Nrcyk7CisgICAgfQorfQordGVtcGxhdGU8Y2xhc3MgVCwgdW5zaWduZWQgUz4KK3ZvaWQgcG9kX2RlcXVlPFQsIFM+OjpmcmVlX3RhaWwodW5zaWduZWQgc2l6ZSkKK3sKKyAgICBpZihzaXplIDwgbV9zaXplKSB7CisgICAgICAgIHVuc2lnbmVkIG5iID0gKHNpemUgKyBibG9ja19tYXNrKSA+PiBibG9ja19zaGlmdDsKKyAgICAgICAgd2hpbGUobV9udW1fYmxvY2tzID4gbmIpIHsKKyAgICAgICAgICAgIEZYX0ZyZWUobV9ibG9ja3NbLS1tX251bV9ibG9ja3NdKTsKKyAgICAgICAgfQorICAgICAgICBtX3NpemUgPSBzaXplOworICAgIH0KK30KK3RlbXBsYXRlPGNsYXNzIFQsIHVuc2lnbmVkIFM+IHBvZF9kZXF1ZTxULCBTPjo6cG9kX2RlcXVlKCkgOgorICAgIG1fc2l6ZSgwKSwKKyAgICBtX251bV9ibG9ja3MoMCksCisgICAgbV9tYXhfYmxvY2tzKDApLAorICAgIG1fYmxvY2tzKDApLAorICAgIG1fYmxvY2tfcHRyX2luYyhibG9ja19zaXplKQoreworfQordGVtcGxhdGU8Y2xhc3MgVCwgdW5zaWduZWQgUz4KK3BvZF9kZXF1ZTxULCBTPjo6cG9kX2RlcXVlKHVuc2lnbmVkIGJsb2NrX3B0cl9pbmMpIDoKKyAgICBtX3NpemUoMCksCisgICAgbV9udW1fYmxvY2tzKDApLAorICAgIG1fbWF4X2Jsb2NrcygwKSwKKyAgICBtX2Jsb2NrcygwKSwKKyAgICBtX2Jsb2NrX3B0cl9pbmMoYmxvY2tfcHRyX2luYykKK3sKK30KK3RlbXBsYXRlPGNsYXNzIFQsIHVuc2lnbmVkIFM+Citwb2RfZGVxdWU8VCwgUz46OnBvZF9kZXF1ZShjb25zdCBwb2RfZGVxdWU8VCwgUz4mIHYpIDoKKyAgICBtX3NpemUodi5tX3NpemUpLAorICAgIG1fbnVtX2Jsb2Nrcyh2Lm1fbnVtX2Jsb2NrcyksCisgICAgbV9tYXhfYmxvY2tzKHYubV9tYXhfYmxvY2tzKSwKKyAgICBtX2Jsb2Nrcyh2Lm1fbWF4X2Jsb2NrcyA/IEZYX0FsbG9jKFQqLCB2Lm1fbWF4X2Jsb2NrcykgOiAwKSwKKyAgICBtX2Jsb2NrX3B0cl9pbmModi5tX2Jsb2NrX3B0cl9pbmMpCit7CisgICAgdW5zaWduZWQgaTsKKyAgICBmb3IoaSA9IDA7IGkgPCB2Lm1fbnVtX2Jsb2NrczsgKytpKSB7CisgICAgICAgIG1fYmxvY2tzW2ldID0gRlhfQWxsb2MoVCwgYmxvY2tfc2l6ZSk7CisgICAgICAgIEZYU1lTX21lbWNweShtX2Jsb2Nrc1tpXSwgdi5tX2Jsb2Nrc1tpXSwgYmxvY2tfc2l6ZSAqIHNpemVvZihUKSk7CisgICAgfQorfQordGVtcGxhdGU8Y2xhc3MgVCwgdW5zaWduZWQgUz4KK2NvbnN0IHBvZF9kZXF1ZTxULCBTPiYgcG9kX2RlcXVlPFQsIFM+OjpvcGVyYXRvciA9IChjb25zdCBwb2RfZGVxdWU8VCwgUz4mIHYpCit7CisgICAgdW5zaWduZWQgaTsKKyAgICBmb3IoaSA9IG1fbnVtX2Jsb2NrczsgaSA8IHYubV9udW1fYmxvY2tzOyArK2kpIHsKKyAgICAgICAgYWxsb2NhdGVfYmxvY2soaSk7CisgICAgfQorICAgIGZvcihpID0gMDsgaSA8IHYubV9udW1fYmxvY2tzOyArK2kpIHsKKyAgICAgICAgRlhTWVNfbWVtY3B5KG1fYmxvY2tzW2ldLCB2Lm1fYmxvY2tzW2ldLCBibG9ja19zaXplICogc2l6ZW9mKFQpKTsKKyAgICB9CisgICAgbV9zaXplID0gdi5tX3NpemU7CisgICAgcmV0dXJuICp0aGlzOworfQordGVtcGxhdGU8Y2xhc3MgVCwgdW5zaWduZWQgUz4KK3ZvaWQgcG9kX2RlcXVlPFQsIFM+OjphbGxvY2F0ZV9ibG9jayh1bnNpZ25lZCBuYikKK3sKKyAgICBpZihuYiA+PSBtX21heF9ibG9ja3MpIHsKKyAgICAgICAgVCoqIG5ld19ibG9ja3MgPSBGWF9BbGxvYyhUKiwgbV9tYXhfYmxvY2tzICsgbV9ibG9ja19wdHJfaW5jKTsKKyAgICAgICAgaWYobV9ibG9ja3MpIHsKKyAgICAgICAgICAgIEZYU1lTX21lbWNweShuZXdfYmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1fYmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1fbnVtX2Jsb2NrcyAqIHNpemVvZihUKikpOworICAgICAgICAgICAgRlhfRnJlZShtX2Jsb2Nrcyk7CisgICAgICAgIH0KKyAgICAgICAgbV9ibG9ja3MgPSBuZXdfYmxvY2tzOworICAgICAgICBtX21heF9ibG9ja3MgKz0gbV9ibG9ja19wdHJfaW5jOworICAgIH0KKyAgICBtX2Jsb2Nrc1tuYl0gPSBGWF9BbGxvYyhULCBibG9ja19zaXplKTsKKyAgICBtX251bV9ibG9ja3MrKzsKK30KK3RlbXBsYXRlPGNsYXNzIFQsIHVuc2lnbmVkIFM+CitpbmxpbmUgVCogcG9kX2RlcXVlPFQsIFM+OjpkYXRhX3B0cigpCit7CisgICAgdW5zaWduZWQgbmIgPSBtX3NpemUgPj4gYmxvY2tfc2hpZnQ7CisgICAgaWYobmIgPj0gbV9udW1fYmxvY2tzKSB7CisgICAgICAgIGFsbG9jYXRlX2Jsb2NrKG5iKTsKKyAgICB9CisgICAgcmV0dXJuIG1fYmxvY2tzW25iXSArIChtX3NpemUgJiBibG9ja19tYXNrKTsKK30KK3RlbXBsYXRlPGNsYXNzIFQsIHVuc2lnbmVkIFM+CitpbmxpbmUgdm9pZCBwb2RfZGVxdWU8VCwgUz46OmFkZChjb25zdCBUJiB2YWwpCit7CisgICAgKmRhdGFfcHRyKCkgPSB2YWw7CisgICAgKyttX3NpemU7Cit9Cit0ZW1wbGF0ZTxjbGFzcyBULCB1bnNpZ25lZCBTPgoraW5saW5lIHZvaWQgcG9kX2RlcXVlPFQsIFM+OjpyZW1vdmVfbGFzdCgpCit7CisgICAgaWYobV9zaXplKSB7CisgICAgICAgIC0tbV9zaXplOworICAgIH0KK30KK3RlbXBsYXRlPGNsYXNzIFQsIHVuc2lnbmVkIFM+Cit2b2lkIHBvZF9kZXF1ZTxULCBTPjo6bW9kaWZ5X2xhc3QoY29uc3QgVCYgdmFsKQoreworICAgIHJlbW92ZV9sYXN0KCk7CisgICAgYWRkKHZhbCk7Cit9Cit0ZW1wbGF0ZTxjbGFzcyBULCB1bnNpZ25lZCBTPgoraW50IHBvZF9kZXF1ZTxULCBTPjo6YWxsb2NhdGVfY29udGludW91c19ibG9jayh1bnNpZ25lZCBudW1fZWxlbWVudHMpCit7CisgICAgaWYobnVtX2VsZW1lbnRzIDwgYmxvY2tfc2l6ZSkgeworICAgICAgICBkYXRhX3B0cigpOworICAgICAgICB1bnNpZ25lZCByZXN0ID0gYmxvY2tfc2l6ZSAtIChtX3NpemUgJiBibG9ja19tYXNrKTsKKyAgICAgICAgdW5zaWduZWQgaW5kZXg7CisgICAgICAgIGlmKG51bV9lbGVtZW50cyA8PSByZXN0KSB7CisgICAgICAgICAgICBpbmRleCA9IG1fc2l6ZTsKKyAgICAgICAgICAgIG1fc2l6ZSArPSBudW1fZWxlbWVudHM7CisgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgIH0KKyAgICAgICAgbV9zaXplICs9IHJlc3Q7CisgICAgICAgIGRhdGFfcHRyKCk7CisgICAgICAgIGluZGV4ID0gbV9zaXplOworICAgICAgICBtX3NpemUgKz0gbnVtX2VsZW1lbnRzOworICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KK3RlbXBsYXRlPGNsYXNzIFQsIHVuc2lnbmVkIFM+Cit1bnNpZ25lZCBwb2RfZGVxdWU8VCwgUz46OmJ5dGVfc2l6ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fc2l6ZSAqIHNpemVvZihUKTsKK30KK2NsYXNzIHBvZF9hbGxvY2F0b3IgCit7CitwdWJsaWM6CisgICAgdm9pZCByZW1vdmVfYWxsKCkKKyAgICB7CisgICAgICAgIGlmKG1fbnVtX2Jsb2NrcykgeworICAgICAgICAgICAgaW50OHUqKiBibGsgPSBtX2Jsb2NrcyArIG1fbnVtX2Jsb2NrcyAtIDE7CisgICAgICAgICAgICB3aGlsZShtX251bV9ibG9ja3MtLSkgeworICAgICAgICAgICAgICAgIEZYX0ZyZWUoKmJsayk7CisgICAgICAgICAgICAgICAgLS1ibGs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGWF9GcmVlKG1fYmxvY2tzKTsKKyAgICAgICAgfQorICAgICAgICBtX251bV9ibG9ja3MgPSAwOworICAgICAgICBtX21heF9ibG9ja3MgPSAwOworICAgICAgICBtX2Jsb2NrcyA9IDA7CisgICAgICAgIG1fYnVmX3B0ciA9IDA7CisgICAgICAgIG1fcmVzdCA9IDA7CisgICAgfQorICAgIH5wb2RfYWxsb2NhdG9yKCkKKyAgICB7CisgICAgICAgIHJlbW92ZV9hbGwoKTsKKyAgICB9CisgICAgcG9kX2FsbG9jYXRvcih1bnNpZ25lZCBibG9ja19zaXplLCB1bnNpZ25lZCBibG9ja19wdHJfaW5jID0gMjU2IC0gOCkgOgorICAgICAgICBtX2Jsb2NrX3NpemUoYmxvY2tfc2l6ZSksCisgICAgICAgIG1fYmxvY2tfcHRyX2luYyhibG9ja19wdHJfaW5jKSwKKyAgICAgICAgbV9udW1fYmxvY2tzKDApLAorICAgICAgICBtX21heF9ibG9ja3MoMCksCisgICAgICAgIG1fYmxvY2tzKDApLAorICAgICAgICBtX2J1Zl9wdHIoMCksCisgICAgICAgIG1fcmVzdCgwKQorICAgIHsKKyAgICB9CisgICAgaW50OHUqIGFsbG9jYXRlKHVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIGFsaWdubWVudCA9IDEpCisgICAgeworICAgICAgICBpZihzaXplID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmKHNpemUgPD0gbV9yZXN0KSB7CisgICAgICAgICAgICBpbnQ4dSogcHRyID0gbV9idWZfcHRyOworICAgICAgICAgICAgaWYoYWxpZ25tZW50ID4gMSkgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFsaWduID0gKGFsaWdubWVudCAtIHVuc2lnbmVkKChzaXplX3QpcHRyKSAlIGFsaWdubWVudCkgJSBhbGlnbm1lbnQ7CisgICAgICAgICAgICAgICAgc2l6ZSArPSBhbGlnbjsKKyAgICAgICAgICAgICAgICBwdHIgKz0gYWxpZ247CisgICAgICAgICAgICAgICAgaWYoc2l6ZSA8PSBtX3Jlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9yZXN0IC09IHNpemU7CisgICAgICAgICAgICAgICAgICAgIG1fYnVmX3B0ciArPSBzaXplOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhbGxvY2F0ZV9ibG9jayhzaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWxsb2NhdGUoc2l6ZSAtIGFsaWduLCBhbGlnbm1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9yZXN0IC09IHNpemU7CisgICAgICAgICAgICBtX2J1Zl9wdHIgKz0gc2l6ZTsKKyAgICAgICAgICAgIHJldHVybiBwdHI7CisgICAgICAgIH0KKyAgICAgICAgYWxsb2NhdGVfYmxvY2soc2l6ZSArIGFsaWdubWVudCAtIDEpOworICAgICAgICByZXR1cm4gYWxsb2NhdGUoc2l6ZSwgYWxpZ25tZW50KTsKKyAgICB9Citwcml2YXRlOgorICAgIHZvaWQgYWxsb2NhdGVfYmxvY2sodW5zaWduZWQgc2l6ZSkKKyAgICB7CisgICAgICAgIGlmKHNpemUgPCBtX2Jsb2NrX3NpemUpIHsKKyAgICAgICAgICAgIHNpemUgPSBtX2Jsb2NrX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgaWYobV9udW1fYmxvY2tzID49IG1fbWF4X2Jsb2NrcykgeworICAgICAgICAgICAgaW50OHUqKiBuZXdfYmxvY2tzID0gRlhfQWxsb2MoaW50OHUqLCBtX21heF9ibG9ja3MgKyBtX2Jsb2NrX3B0cl9pbmMpOworICAgICAgICAgICAgaWYobV9ibG9ja3MpIHsKKyAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkobmV3X2Jsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9ibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbnVtX2Jsb2NrcyAqIHNpemVvZihpbnQ4dSopKTsKKyAgICAgICAgICAgICAgICBGWF9GcmVlKG1fYmxvY2tzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fYmxvY2tzID0gbmV3X2Jsb2NrczsKKyAgICAgICAgICAgIG1fbWF4X2Jsb2NrcyArPSBtX2Jsb2NrX3B0cl9pbmM7CisgICAgICAgIH0KKyAgICAgICAgbV9ibG9ja3NbbV9udW1fYmxvY2tzXSA9IG1fYnVmX3B0ciA9IEZYX0FsbG9jKGludDh1LCBzaXplKTsKKyAgICAgICAgbV9udW1fYmxvY2tzKys7CisgICAgICAgIG1fcmVzdCA9IHNpemU7CisgICAgfQorICAgIHVuc2lnbmVkIG1fYmxvY2tfc2l6ZTsKKyAgICB1bnNpZ25lZCBtX2Jsb2NrX3B0cl9pbmM7CisgICAgdW5zaWduZWQgbV9udW1fYmxvY2tzOworICAgIHVuc2lnbmVkIG1fbWF4X2Jsb2NrczsKKyAgICBpbnQ4dSoqICBtX2Jsb2NrczsKKyAgICBpbnQ4dSogICBtX2J1Zl9wdHI7CisgICAgdW5zaWduZWQgbV9yZXN0OworfTsKK2VudW0gcXVpY2tfc29ydF90aHJlc2hvbGRfZSB7CisgICAgcXVpY2tfc29ydF90aHJlc2hvbGQgPSA5Cit9OwordGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgc3dhcF9lbGVtZW50cyhUJiBhLCBUJiBiKQoreworICAgIFQgdGVtcCA9IGE7CisgICAgYSA9IGI7CisgICAgYiA9IHRlbXA7Cit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19iYXNpY3MuaCBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19iYXNpY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTI1NjBiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYWdnMjMvYWdnX2Jhc2ljcy5oCkBAIC0wLDAgKzEsMjg1IEBACisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQW50aS1HcmFpbiBHZW9tZXRyeSAtIFZlcnNpb24gMi4zCisvLyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBNYXhpbSBTaGVtYW5hcmV2IChodHRwOi8vd3d3LmFudGlncmFpbi5jb20pCisvLworLy8gUGVybWlzc2lvbiB0byBjb3B5LCB1c2UsIG1vZGlmeSwgc2VsbCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBncmFudGVkIHByb3ZpZGVkIHRoaXMgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMuCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LCBhbmQgd2l0aCBubyBjbGFpbSBhcyB0byBpdHMgc3VpdGFiaWxpdHkgZm9yIGFueSBwdXJwb3NlLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29udGFjdDogbWNzZWVtQGFudGlncmFpbi5jb20KKy8vICAgICAgICAgIG1jc2VlbWFnZ0B5YWhvby5jb20KKy8vICAgICAgICAgIGh0dHA6Ly93d3cuYW50aWdyYWluLmNvbQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZuZGVmIEFHR19CQVNJQ1NfSU5DTFVERUQKKyNkZWZpbmUgQUdHX0JBU0lDU19JTkNMVURFRAorI2lmbmRlZiBBR0dfSU5UOAorI2RlZmluZSBBR0dfSU5UOCBzaWduZWQgY2hhcgorI2VuZGlmCisjaWZuZGVmIEFHR19JTlQ4VQorI2RlZmluZSBBR0dfSU5UOFUgdW5zaWduZWQgY2hhcgorI2VuZGlmCisjaWZuZGVmIEFHR19JTlQxNgorI2RlZmluZSBBR0dfSU5UMTYgc2hvcnQKKyNlbmRpZgorI2lmbmRlZiBBR0dfSU5UMTZVCisjZGVmaW5lIEFHR19JTlQxNlUgdW5zaWduZWQgc2hvcnQKKyNlbmRpZgorI2lmbmRlZiBBR0dfSU5UMzIKKyNkZWZpbmUgQUdHX0lOVDMyIGludAorI2VuZGlmCisjaWZuZGVmIEFHR19JTlQzMlUKKyNkZWZpbmUgQUdHX0lOVDMyVSB1bnNpZ25lZAorI2VuZGlmCisjaWZuZGVmIEFHR19JTlQ2NAorI2RlZmluZSBBR0dfSU5UNjQgc2lnbmVkIGxvbmcgbG9uZworI2VuZGlmCisjaWZuZGVmIEFHR19JTlQ2NFUKKyNkZWZpbmUgQUdHX0lOVDY0VSB1bnNpZ25lZCBsb25nIGxvbmcKKyNlbmRpZgorI2RlZmluZSBBR0dfSU5MSU5FIGlubGluZQorCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oIiAgLy8gRm9yIEZYX0ZMT0FUCisKK25hbWVzcGFjZSBhZ2cKK3sKK3R5cGVkZWYgQUdHX0lOVDggICBpbnQ4OwordHlwZWRlZiBBR0dfSU5UOFUgIGludDh1OwordHlwZWRlZiBBR0dfSU5UMTYgIGludDE2OwordHlwZWRlZiBBR0dfSU5UMTZVIGludDE2dTsKK3R5cGVkZWYgQUdHX0lOVDMyICBpbnQzMjsKK3R5cGVkZWYgQUdHX0lOVDMyVSBpbnQzMnU7Cit0eXBlZGVmIEFHR19JTlQ2NCAgaW50NjQ7Cit0eXBlZGVmIEFHR19JTlQ2NFUgaW50NjR1OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIGNvdmVyX3R5cGU7CitlbnVtIGNvdmVyX3NjYWxlX2UgeworICAgIGNvdmVyX3NoaWZ0ID0gOCwKKyAgICBjb3Zlcl9zaXplICA9IDEgPDwgY292ZXJfc2hpZnQsCisgICAgY292ZXJfbWFzayAgPSBjb3Zlcl9zaXplIC0gMSwKKyAgICBjb3Zlcl9ub25lICA9IDAsCisgICAgY292ZXJfZnVsbCAgPSBjb3Zlcl9tYXNrCit9OwordGVtcGxhdGU8Y2xhc3MgVD4gc3RydWN0IHJlY3RfYmFzZSAgeworICAgIHR5cGVkZWYgcmVjdF9iYXNlPFQ+IHNlbGZfdHlwZTsKKyAgICBUIHgxOworICAgIFQgeTE7CisgICAgVCB4MjsKKyAgICBUIHkyOworICAgIHJlY3RfYmFzZSgpIHt9CisgICAgcmVjdF9iYXNlKFQgeDFfLCBUIHkxXywgVCB4Ml8sIFQgeTJfKSA6CisgICAgICAgIHgxKHgxXyksIHkxKHkxXyksIHgyKHgyXyksIHkyKHkyXykge30KKyAgICBjb25zdCBzZWxmX3R5cGUmIG5vcm1hbGl6ZSgpCisgICAgeworICAgICAgICBUIHQ7CisgICAgICAgIGlmKHgxID4geDIpIHsKKyAgICAgICAgICAgIHQgPSB4MTsKKyAgICAgICAgICAgIHgxID0geDI7CisgICAgICAgICAgICB4MiA9IHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYoeTEgPiB5MikgeworICAgICAgICAgICAgdCA9IHkxOworICAgICAgICAgICAgeTEgPSB5MjsKKyAgICAgICAgICAgIHkyID0gdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIGJvb2wgY2xpcChjb25zdCBzZWxmX3R5cGUmIHIpCisgICAgeworICAgICAgICBpZih4MiA+IHIueDIpIHsKKyAgICAgICAgICAgIHgyID0gci54MjsKKyAgICAgICAgfQorICAgICAgICBpZih5MiA+IHIueTIpIHsKKyAgICAgICAgICAgIHkyID0gci55MjsKKyAgICAgICAgfQorICAgICAgICBpZih4MSA8IHIueDEpIHsKKyAgICAgICAgICAgIHgxID0gci54MTsKKyAgICAgICAgfQorICAgICAgICBpZih5MSA8IHIueTEpIHsKKyAgICAgICAgICAgIHkxID0gci55MTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4geDEgPD0geDIgJiYgeTEgPD0geTI7CisgICAgfQorICAgIGJvb2wgaXNfdmFsaWQoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHgxIDw9IHgyICYmIHkxIDw9IHkyOworICAgIH0KK307Cit0ZW1wbGF0ZTxjbGFzcyBSZWN0PgoraW5saW5lIFJlY3QgaW50ZXJzZWN0X3JlY3RhbmdsZXMoY29uc3QgUmVjdCYgcjEsIGNvbnN0IFJlY3QmIHIyKQoreworICAgIFJlY3QgciA9IHIxOworICAgIGlmKHIueDIgPiByMi54MikgeworICAgICAgICByLngyID0gcjIueDI7CisgICAgfQorICAgIGlmKHIueTIgPiByMi55MikgeworICAgICAgICByLnkyID0gcjIueTI7CisgICAgfQorICAgIGlmKHIueDEgPCByMi54MSkgeworICAgICAgICByLngxID0gcjIueDE7CisgICAgfQorICAgIGlmKHIueTEgPCByMi55MSkgeworICAgICAgICByLnkxID0gcjIueTE7CisgICAgfQorICAgIHJldHVybiByOworfQordGVtcGxhdGU8Y2xhc3MgUmVjdD4KK2lubGluZSBSZWN0IHVuaXRlX3JlY3RhbmdsZXMoY29uc3QgUmVjdCYgcjEsIGNvbnN0IFJlY3QmIHIyKQoreworICAgIFJlY3QgciA9IHIxOworICAgIGlmKHIueDIgPCByMi54MikgeworICAgICAgICByLngyID0gcjIueDI7CisgICAgfQorICAgIGlmKHIueTIgPCByMi55MikgeworICAgICAgICByLnkyID0gcjIueTI7CisgICAgfQorICAgIGlmKHIueDEgPiByMi54MSkgeworICAgICAgICByLngxID0gcjIueDE7CisgICAgfQorICAgIGlmKHIueTEgPiByMi55MSkgeworICAgICAgICByLnkxID0gcjIueTE7CisgICAgfQorICAgIHJldHVybiByOworfQordHlwZWRlZiByZWN0X2Jhc2U8aW50PiAgICByZWN0OwordHlwZWRlZiByZWN0X2Jhc2U8RlhfRkxPQVQ+IHJlY3RfZDsKK2VudW0gcGF0aF9jb21tYW5kc19lIHsKKyAgICBwYXRoX2NtZF9zdG9wICAgICA9IDAsCisgICAgcGF0aF9jbWRfbW92ZV90byAgPSAxLAorICAgIHBhdGhfY21kX2xpbmVfdG8gID0gMiwKKyAgICBwYXRoX2NtZF9jdXJ2ZTMgICA9IDMsCisgICAgcGF0aF9jbWRfY3VydmU0ICAgPSA0LAorICAgIHBhdGhfY21kX2N1cnZlTiAgID0gNSwKKyAgICBwYXRoX2NtZF9jYXRyb20gICA9IDYsCisgICAgcGF0aF9jbWRfdWJzcGxpbmUgPSA3LAorICAgIHBhdGhfY21kX2VuZF9wb2x5ID0gMHgwRiwKKyAgICBwYXRoX2NtZF9tYXNrICAgICA9IDB4MEYKK307CitlbnVtIHBhdGhfZmxhZ3NfZSB7CisgICAgcGF0aF9mbGFnc19ub25lICA9IDAsCisgICAgcGF0aF9mbGFnc19jY3cgICA9IDB4MTAsCisgICAgcGF0aF9mbGFnc19jdyAgICA9IDB4MjAsCisgICAgcGF0aF9mbGFnc19jbG9zZSA9IDB4NDAsCisgICAgcGF0aF9mbGFnc19qcgkgPSAweDgwLAorICAgIHBhdGhfZmxhZ3NfbWFzayAgPSAweEYwCit9OworaW5saW5lIGJvb2wgaXNfdmVydGV4KHVuc2lnbmVkIGMpCit7CisgICAgYyAmPSB+cGF0aF9mbGFnc19qcjsKKyAgICByZXR1cm4gYyA+PSBwYXRoX2NtZF9tb3ZlX3RvICYmIGMgPCBwYXRoX2NtZF9lbmRfcG9seTsKK30KK2lubGluZSBib29sIGlzX2RyYXdpbmcodW5zaWduZWQgYykKK3sKKyAgICBjICY9IH5wYXRoX2ZsYWdzX2pyOworICAgIHJldHVybiBjID49IHBhdGhfY21kX2xpbmVfdG8gJiYgYyA8IHBhdGhfY21kX2VuZF9wb2x5OworfQoraW5saW5lIGJvb2wgaXNfc3RvcCh1bnNpZ25lZCBjKQoreworICAgIGMgJj0gfnBhdGhfZmxhZ3NfanI7CisgICAgcmV0dXJuIGMgPT0gcGF0aF9jbWRfc3RvcDsKK30KK2lubGluZSBib29sIGlzX21vdmVfdG8odW5zaWduZWQgYykKK3sKKyAgICBjICY9IH5wYXRoX2ZsYWdzX2pyOworICAgIHJldHVybiBjID09IHBhdGhfY21kX21vdmVfdG87Cit9CitpbmxpbmUgYm9vbCBpc19saW5lX3RvKHVuc2lnbmVkIGMpCit7CisgICAgYyAmPSB+cGF0aF9mbGFnc19qcjsKKyAgICByZXR1cm4gYyA9PSBwYXRoX2NtZF9saW5lX3RvOworfQoraW5saW5lIGJvb2wgaXNfY3VydmUodW5zaWduZWQgYykKK3sKKyAgICBjICY9IH5wYXRoX2ZsYWdzX2pyOworICAgIHJldHVybiBjID09IHBhdGhfY21kX2N1cnZlMyB8fCBjID09IHBhdGhfY21kX2N1cnZlNDsKK30KK2lubGluZSBib29sIGlzX2N1cnZlMyh1bnNpZ25lZCBjKQoreworICAgIGMgJj0gfnBhdGhfZmxhZ3NfanI7CisgICAgcmV0dXJuIGMgPT0gcGF0aF9jbWRfY3VydmUzOworfQoraW5saW5lIGJvb2wgaXNfY3VydmU0KHVuc2lnbmVkIGMpCit7CisgICAgYyAmPSB+cGF0aF9mbGFnc19qcjsKKyAgICByZXR1cm4gYyA9PSBwYXRoX2NtZF9jdXJ2ZTQ7Cit9CitpbmxpbmUgYm9vbCBpc19lbmRfcG9seSh1bnNpZ25lZCBjKQoreworICAgIGMgJj0gfnBhdGhfZmxhZ3NfanI7CisgICAgcmV0dXJuIChjICYgcGF0aF9jbWRfbWFzaykgPT0gcGF0aF9jbWRfZW5kX3BvbHk7Cit9CitpbmxpbmUgYm9vbCBpc19jbG9zZSh1bnNpZ25lZCBjKQoreworICAgIGMgJj0gfnBhdGhfZmxhZ3NfanI7CisgICAgcmV0dXJuIChjICYgfihwYXRoX2ZsYWdzX2N3IHwgcGF0aF9mbGFnc19jY3cpKSA9PQorICAgICAgICAgICAocGF0aF9jbWRfZW5kX3BvbHkgfCBwYXRoX2ZsYWdzX2Nsb3NlKTsKK30KK2lubGluZSBib29sIGlzX25leHRfcG9seSh1bnNpZ25lZCBjKQoreworICAgIGMgJj0gfnBhdGhfZmxhZ3NfanI7CisgICAgcmV0dXJuIGlzX3N0b3AoYykgfHwgaXNfbW92ZV90byhjKSB8fCBpc19lbmRfcG9seShjKTsKK30KK2lubGluZSBib29sIGlzX2N3KHVuc2lnbmVkIGMpCit7CisgICAgYyAmPSB+cGF0aF9mbGFnc19qcjsKKyAgICByZXR1cm4gKGMgJiBwYXRoX2ZsYWdzX2N3KSAhPSAwOworfQoraW5saW5lIGJvb2wgaXNfY2N3KHVuc2lnbmVkIGMpCit7CisgICAgYyAmPSB+cGF0aF9mbGFnc19qcjsKKyAgICByZXR1cm4gKGMgJiBwYXRoX2ZsYWdzX2NjdykgIT0gMDsKK30KK2lubGluZSBib29sIGlzX29yaWVudGVkKHVuc2lnbmVkIGMpCit7CisgICAgYyAmPSB+cGF0aF9mbGFnc19qcjsKKyAgICByZXR1cm4gKGMgJiAocGF0aF9mbGFnc19jdyB8IHBhdGhfZmxhZ3NfY2N3KSkgIT0gMDsKK30KK2lubGluZSBib29sIGlzX2Nsb3NlZCh1bnNpZ25lZCBjKQoreworICAgIGMgJj0gfnBhdGhfZmxhZ3NfanI7CisgICAgcmV0dXJuIChjICYgcGF0aF9mbGFnc19jbG9zZSkgIT0gMDsKK30KK2lubGluZSB1bnNpZ25lZCBnZXRfY2xvc2VfZmxhZyh1bnNpZ25lZCBjKQoreworICAgIGMgJj0gfnBhdGhfZmxhZ3NfanI7CisgICAgcmV0dXJuIGMgJiBwYXRoX2ZsYWdzX2Nsb3NlOworfQoraW5saW5lIHVuc2lnbmVkIGNsZWFyX29yaWVudGF0aW9uKHVuc2lnbmVkIGMpCit7CisgICAgYyAmPSB+cGF0aF9mbGFnc19qcjsKKyAgICByZXR1cm4gYyAmIH4ocGF0aF9mbGFnc19jdyB8IHBhdGhfZmxhZ3NfY2N3KTsKK30KK2lubGluZSB1bnNpZ25lZCBnZXRfb3JpZW50YXRpb24odW5zaWduZWQgYykKK3sKKyAgICBjICY9IH5wYXRoX2ZsYWdzX2pyOworICAgIHJldHVybiBjICYgKHBhdGhfZmxhZ3NfY3cgfCBwYXRoX2ZsYWdzX2Njdyk7Cit9CitpbmxpbmUgdW5zaWduZWQgc2V0X29yaWVudGF0aW9uKHVuc2lnbmVkIGMsIHVuc2lnbmVkIG8pCit7CisgICAgYyAmPSB+cGF0aF9mbGFnc19qcjsKKyAgICByZXR1cm4gY2xlYXJfb3JpZW50YXRpb24oYykgfCBvOworfQorc3RydWN0IHBvaW50X3R5cGUgIHsKKyAgICBGWF9GTE9BVCB4LCB5OworICAgIHVuc2lnbmVkIGZsYWc7CisgICAgcG9pbnRfdHlwZSgpIHt9CisgICAgcG9pbnRfdHlwZShGWF9GTE9BVCB4XywgRlhfRkxPQVQgeV8sIHVuc2lnbmVkIGZsYWdfID0gMCkgOiB4KHhfKSwgeSh5XyksIGZsYWcoZmxhZ18pIHt9Cit9Oworc3RydWN0IHBvaW50X3R5cGVfZmxhZyA6IHB1YmxpYyBwb2ludF90eXBlIHsKKyAgICB1bnNpZ25lZCBmbGFnOworICAgIHBvaW50X3R5cGVfZmxhZygpCisgICAgeworICAgICAgICBmbGFnID0gMDsKKyAgICB9CisgICAgcG9pbnRfdHlwZV9mbGFnKEZYX0ZMT0FUIHhfLCBGWF9GTE9BVCB5XywgdW5zaWduZWQgZmxhZ18gPSAwKSA6IHBvaW50X3R5cGUoeF8sIHlfKSwgZmxhZyhmbGFnXykge30KK307CitzdHJ1Y3QgdmVydGV4X3R5cGUgIHsKKyAgICBGWF9GTE9BVCAgIHgsIHk7CisgICAgdW5zaWduZWQgY21kOworICAgIHZlcnRleF90eXBlKCkge30KKyAgICB2ZXJ0ZXhfdHlwZShGWF9GTE9BVCB4XywgRlhfRkxPQVQgeV8sIHVuc2lnbmVkIGNtZF8pIDoKKyAgICAgICAgeCh4XyksIHkoeV8pLCBjbWQoY21kXykge30KK307Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYWdnL2FnZzIzL2FnZ19jbGlwX2xpYW5nX2JhcnNreS5oIGIvdGhpcmRfcGFydHkvYWdnMjMvYWdnX2NsaXBfbGlhbmdfYmFyc2t5LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Z2UvYWdnL2FnZzIzL2FnZ19jbGlwX2xpYW5nX2JhcnNreS5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfY2xpcF9saWFuZ19iYXJza3kuaApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvYWdnX2NvbG9yX2dyYXkuaCBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19jb2xvcl9ncmF5LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Z2UvYWdnL2FnZzIzL2FnZ19jb2xvcl9ncmF5LmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2FnZzIzL2FnZ19jb2xvcl9ncmF5LmgKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYWdnL2FnZzIzL2FnZ19jb252X2FkYXB0b3JfdmNnZW4uaCBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19jb252X2FkYXB0b3JfdmNnZW4uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvYWdnX2NvbnZfYWRhcHRvcl92Y2dlbi5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfY29udl9hZGFwdG9yX3ZjZ2VuLmgKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYWdnL2FnZzIzL2FnZ19jb252X2Rhc2guaCBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19jb252X2Rhc2guaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvYWdnX2NvbnZfZGFzaC5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfY29udl9kYXNoLmgKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYWdnL2FnZzIzL2FnZ19jb252X3N0cm9rZS5oIGIvdGhpcmRfcGFydHkvYWdnMjMvYWdnX2NvbnZfc3Ryb2tlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Z2UvYWdnL2FnZzIzL2FnZ19jb252X3N0cm9rZS5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfY29udl9zdHJva2UuaApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWdnMjMvYWdnX2N1cnZlcy5jcHAgYi90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfY3VydmVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTkyMjFkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYWdnMjMvYWdnX2N1cnZlcy5jcHAKQEAgLTAsMCArMSwxMTEgQEAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBYWVE6IDIwMDYtMDEtMjIgQ29waWVkIGZyb20gQUdHIHByb2plY3QuCisvLyBUT0RPOiBUaGlzIGZpbGUgdXNlcyBpbnRlbnNpdmUgZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9ucywgc28gaXQncyBOT1Qgc3VpdGFibGUKKy8vIGZvciBwbGF0Zm9ybXMgbGlrZSBTeW1iaWFuIE9TLiBXZSBuZWVkIHRvIGNoYW5nZSB0byBGSVggZm9ybWF0LgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFudGktR3JhaW4gR2VvbWV0cnkgLSBWZXJzaW9uIDIuMworLy8gQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgTWF4aW0gU2hlbWFuYXJldiAoaHR0cDovL3d3dy5hbnRpZ3JhaW4uY29tKQorLy8KKy8vIFBlcm1pc3Npb24gdG8gY29weSwgdXNlLCBtb2RpZnksIHNlbGwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgZ3JhbnRlZCBwcm92aWRlZCB0aGlzIGNvcHlyaWdodCBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLgorLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eSwgYW5kIHdpdGggbm8gY2xhaW0gYXMgdG8gaXRzIHN1aXRhYmlsaXR5IGZvciBhbnkgcHVycG9zZS4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbnRhY3Q6IG1jc2VlbUBhbnRpZ3JhaW4uY29tCisvLyAgICAgICAgICBtY3NlZW1hZ2dAeWFob28uY29tCisvLyAgICAgICAgICBodHRwOi8vd3d3LmFudGlncmFpbi5jb20KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaW5jbHVkZSAiYWdnX2N1cnZlcy5oIgorI2luY2x1ZGUgImFnZ19tYXRoLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCisKK25hbWVzcGFjZSBhZ2cKK3sKK2NvbnN0IEZYX0ZMT0FUIGN1cnZlX2NvbGxpbmVhcml0eV9lcHNpbG9uICAgICAgICAgICAgICA9IDFlLTMwZjsKK2VudW0gY3VydmVfcmVjdXJzaW9uX2xpbWl0X2UgeyBjdXJ2ZV9yZWN1cnNpb25fbGltaXQgPSAxNiB9Owordm9pZCBjdXJ2ZTRfZGl2Ojppbml0KEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwKKyAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsCisgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDMsIEZYX0ZMT0FUIHkzLAorICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHg0LCBGWF9GTE9BVCB5NCkKK3sKKyAgICBtX3BvaW50cy5yZW1vdmVfYWxsKCk7CisgICAgbV9kaXN0YW5jZV90b2xlcmFuY2Vfc3F1YXJlID0gMS4wZiAvIDQ7CisgICAgbV9kaXN0YW5jZV90b2xlcmFuY2VfbWFuaGF0dGFuID0gMS4wZiAqIDQ7CisgICAgYmV6aWVyKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHg0LCB5NCk7CisgICAgbV9jb3VudCA9IDA7Cit9Cit2b2lkIGN1cnZlNF9kaXY6OnJlY3Vyc2l2ZV9iZXppZXIoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MywgRlhfRkxPQVQgeTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDQsIEZYX0ZMT0FUIHk0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxldmVsKQoreworICAgIGlmKGxldmVsID4gY3VydmVfcmVjdXJzaW9uX2xpbWl0KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgRlhfRkxPQVQgeDEyICAgPSAoeDEgKyB4MikgLyAyOworICAgIEZYX0ZMT0FUIHkxMiAgID0gKHkxICsgeTIpIC8gMjsKKyAgICBGWF9GTE9BVCB4MjMgICA9ICh4MiArIHgzKSAvIDI7CisgICAgRlhfRkxPQVQgeTIzICAgPSAoeTIgKyB5MykgLyAyOworICAgIEZYX0ZMT0FUIHgzNCAgID0gKHgzICsgeDQpIC8gMjsKKyAgICBGWF9GTE9BVCB5MzQgICA9ICh5MyArIHk0KSAvIDI7CisgICAgRlhfRkxPQVQgeDEyMyAgPSAoeDEyICsgeDIzKSAvIDI7CisgICAgRlhfRkxPQVQgeTEyMyAgPSAoeTEyICsgeTIzKSAvIDI7CisgICAgRlhfRkxPQVQgeDIzNCAgPSAoeDIzICsgeDM0KSAvIDI7CisgICAgRlhfRkxPQVQgeTIzNCAgPSAoeTIzICsgeTM0KSAvIDI7CisgICAgRlhfRkxPQVQgeDEyMzQgPSAoeDEyMyArIHgyMzQpIC8gMjsKKyAgICBGWF9GTE9BVCB5MTIzNCA9ICh5MTIzICsgeTIzNCkgLyAyOworICAgIEZYX0ZMT0FUIGR4ID0geDQgLSB4MTsKKyAgICBGWF9GTE9BVCBkeSA9IHk0IC0geTE7CisgICAgRlhfRkxPQVQgZDIgPSBGWFNZU19mYWJzKEZYU1lTX011bCh4MiAtIHg0LCBkeSkgLSBGWFNZU19NdWwoeTIgLSB5NCwgZHgpKTsKKyAgICBGWF9GTE9BVCBkMyA9IEZYU1lTX2ZhYnMoRlhTWVNfTXVsKHgzIC0geDQsIGR5KSAtIEZYU1lTX011bCh5MyAtIHk0LCBkeCkpOworICAgIHN3aXRjaCgoaW50KGQyID4gY3VydmVfY29sbGluZWFyaXR5X2Vwc2lsb24pIDw8IDEpICsKKyAgICAgICAgICAgIGludChkMyA+IGN1cnZlX2NvbGxpbmVhcml0eV9lcHNpbG9uKSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBpZihGWFNZU19mYWJzKHgxICsgeDMgLSB4MiAtIHgyKSArCisgICAgICAgICAgICAgICAgICAgIEZYU1lTX2ZhYnMoeTEgKyB5MyAtIHkyIC0geTIpICsKKyAgICAgICAgICAgICAgICAgICAgRlhTWVNfZmFicyh4MiArIHg0IC0geDMgLSB4MykgKworICAgICAgICAgICAgICAgICAgICBGWFNZU19mYWJzKHkyICsgeTQgLSB5MyAtIHkzKSA8PSBtX2Rpc3RhbmNlX3RvbGVyYW5jZV9tYW5oYXR0YW4pIHsKKyAgICAgICAgICAgICAgICBtX3BvaW50cy5hZGQocG9pbnRfdHlwZSh4MTIzNCwgeTEyMzQsIHBhdGhfZmxhZ3NfanIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgaWYoRlhTWVNfTXVsKGQzLCBkMykgPD0gRlhTWVNfTXVsKG1fZGlzdGFuY2VfdG9sZXJhbmNlX3NxdWFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19NdWwoZHgsIGR4KSArIEZYU1lTX011bChkeSwgZHkpKSkgeworICAgICAgICAgICAgICAgIG1fcG9pbnRzLmFkZChwb2ludF90eXBlKHgyMywgeTIzLCBwYXRoX2ZsYWdzX2pyKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGlmKEZYU1lTX011bChkMiwgZDIpIDw9IEZYU1lTX011bChtX2Rpc3RhbmNlX3RvbGVyYW5jZV9zcXVhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfTXVsKGR4LCBkeCkgKyBGWFNZU19NdWwoZHksIGR5KSkpIHsKKyAgICAgICAgICAgICAgICBtX3BvaW50cy5hZGQocG9pbnRfdHlwZSh4MjMsIHkyMywgcGF0aF9mbGFnc19qcikpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBpZihGWFNZU19NdWwoZDIgKyBkMywgZDIgKyBkMykgPD0gRlhTWVNfTXVsKG1fZGlzdGFuY2VfdG9sZXJhbmNlX3NxdWFyZSwKKyAgICAgICAgICAgICAgICAgICAgRlhTWVNfTXVsKGR4LCBkeCkgKyBGWFNZU19NdWwoZHksIGR5KSkpIHsKKyAgICAgICAgICAgICAgICBtX3BvaW50cy5hZGQocG9pbnRfdHlwZSh4MjMsIHkyMywgcGF0aF9mbGFnc19qcikpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZWN1cnNpdmVfYmV6aWVyKHgxLCB5MSwgeDEyLCB5MTIsIHgxMjMsIHkxMjMsIHgxMjM0LCB5MTIzNCwgbGV2ZWwgKyAxKTsKKyAgICByZWN1cnNpdmVfYmV6aWVyKHgxMjM0LCB5MTIzNCwgeDIzNCwgeTIzNCwgeDM0LCB5MzQsIHg0LCB5NCwgbGV2ZWwgKyAxKTsKK30KK3ZvaWQgY3VydmU0X2Rpdjo6YmV6aWVyKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgzLCBGWF9GTE9BVCB5MywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHg0LCBGWF9GTE9BVCB5NCkKK3sKKyAgICBtX3BvaW50cy5hZGQocG9pbnRfdHlwZSh4MSwgeTEpKTsKKyAgICByZWN1cnNpdmVfYmV6aWVyKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHg0LCB5NCwgMCk7CisgICAgbV9wb2ludHMuYWRkKHBvaW50X3R5cGUoeDQsIHk0KSk7Cit9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FnZy9hZ2cyMy9hZ2dfY3VydmVzLmggYi90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfY3VydmVzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Z2UvYWdnL2FnZzIzL2FnZ19jdXJ2ZXMuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvYWdnMjMvYWdnX2N1cnZlcy5oCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FnZy9hZ2cyMy9hZ2dfbWF0aC5oIGIvdGhpcmRfcGFydHkvYWdnMjMvYWdnX21hdGguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvYWdnX21hdGguaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvYWdnMjMvYWdnX21hdGguaApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvYWdnX21hdGhfc3Ryb2tlLmggYi90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfbWF0aF9zdHJva2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvYWdnX21hdGhfc3Ryb2tlLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2FnZzIzL2FnZ19tYXRoX3N0cm9rZS5oCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfcGF0aF9zdG9yYWdlLmNwcCBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19wYXRoX3N0b3JhZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MDNhMWMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfcGF0aF9zdG9yYWdlLmNwcApAQCAtMCwwICsxLDEwMCBAQAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFhZUTogMjAwNi0wMS0yMiBDb3BpZWQgZnJvbSBBR0cgcHJvamVjdC4KKy8vIFRPRE86IFRoaXMgZmlsZSB1c2VzIGludGVuc2l2ZSBmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zLCBzbyBpdCdzIE5PVCBzdWl0YWJsZQorLy8gZm9yIHBsYXRmb3JtcyBsaWtlIFN5bWJpYW4gT1MuIFdlIG5lZWQgdG8gY2hhbmdlIHRvIEZJWCBmb3JtYXQuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQW50aS1HcmFpbiBHZW9tZXRyeSAtIFZlcnNpb24gMi4zCisvLyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBNYXhpbSBTaGVtYW5hcmV2IChodHRwOi8vd3d3LmFudGlncmFpbi5jb20pCisvLworLy8gUGVybWlzc2lvbiB0byBjb3B5LCB1c2UsIG1vZGlmeSwgc2VsbCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBncmFudGVkIHByb3ZpZGVkIHRoaXMgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMuCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LCBhbmQgd2l0aCBubyBjbGFpbSBhcyB0byBpdHMgc3VpdGFiaWxpdHkgZm9yIGFueSBwdXJwb3NlLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29udGFjdDogbWNzZWVtQGFudGlncmFpbi5jb20KKy8vICAgICAgICAgIG1jc2VlbWFnZ0B5YWhvby5jb20KKy8vICAgICAgICAgIGh0dHA6Ly93d3cuYW50aWdyYWluLmNvbQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ2xhc3MgcGF0aF9zdG9yYWdlCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpbmNsdWRlICJhZ2dfbWF0aC5oIgorI2luY2x1ZGUgImFnZ19wYXRoX3N0b3JhZ2UuaCIKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCIKKworbmFtZXNwYWNlIGFnZworeworcGF0aF9zdG9yYWdlOjp+cGF0aF9zdG9yYWdlKCkKK3sKKyAgICBpZihtX3RvdGFsX2Jsb2NrcykgeworICAgICAgICBGWF9GTE9BVCoqIGNvb3JkX2JsayA9IG1fY29vcmRfYmxvY2tzICsgbV90b3RhbF9ibG9ja3MgLSAxOworICAgICAgICB3aGlsZShtX3RvdGFsX2Jsb2Nrcy0tKSB7CisgICAgICAgICAgICBGWF9GcmVlKCpjb29yZF9ibGspOworICAgICAgICAgICAgLS1jb29yZF9ibGs7CisgICAgICAgIH0KKyAgICAgICAgRlhfRnJlZShtX2Nvb3JkX2Jsb2Nrcyk7CisgICAgfQorfQorcGF0aF9zdG9yYWdlOjpwYXRoX3N0b3JhZ2UoKSA6CisgICAgbV90b3RhbF92ZXJ0aWNlcygwKSwKKyAgICBtX3RvdGFsX2Jsb2NrcygwKSwKKyAgICBtX21heF9ibG9ja3MoMCksCisgICAgbV9jb29yZF9ibG9ja3MoMCksCisgICAgbV9jbWRfYmxvY2tzKDApLAorICAgIG1faXRlcmF0b3IoMCkKK3sKK30KK3ZvaWQgcGF0aF9zdG9yYWdlOjphbGxvY2F0ZV9ibG9jayh1bnNpZ25lZCBuYikKK3sKKyAgICBpZihuYiA+PSBtX21heF9ibG9ja3MpIHsKKyAgICAgICAgRlhfRkxPQVQqKiBuZXdfY29vcmRzID0KKyAgICAgICAgICAgIEZYX0FsbG9jMkQoRlhfRkxPQVQqLCBtX21heF9ibG9ja3MgKyBibG9ja19wb29sLCAyKTsKKyAgICAgICAgdW5zaWduZWQgY2hhcioqIG5ld19jbWRzID0KKyAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKiopKG5ld19jb29yZHMgKyBtX21heF9ibG9ja3MgKyBibG9ja19wb29sKTsKKyAgICAgICAgaWYobV9jb29yZF9ibG9ja3MpIHsKKyAgICAgICAgICAgIEZYU1lTX21lbWNweShuZXdfY29vcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb29yZF9ibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtX21heF9ibG9ja3MgKiBzaXplb2YoRlhfRkxPQVQqKSk7CisgICAgICAgICAgICBGWFNZU19tZW1jcHkobmV3X2NtZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NtZF9ibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtX21heF9ibG9ja3MgKiBzaXplb2YodW5zaWduZWQgY2hhciopKTsKKyAgICAgICAgICAgIEZYX0ZyZWUobV9jb29yZF9ibG9ja3MpOworICAgICAgICB9CisgICAgICAgIG1fY29vcmRfYmxvY2tzID0gbmV3X2Nvb3JkczsKKyAgICAgICAgbV9jbWRfYmxvY2tzID0gbmV3X2NtZHM7CisgICAgICAgIG1fbWF4X2Jsb2NrcyArPSBibG9ja19wb29sOworICAgIH0KKyAgICBtX2Nvb3JkX2Jsb2Nrc1tuYl0gPQorICAgICAgICBGWF9BbGxvYyggRlhfRkxPQVQsIGJsb2NrX3NpemUgKiAyICsKKyAgICAgICAgICAgICAgICAgIGJsb2NrX3NpemUgLworICAgICAgICAgICAgICAgICAgKHNpemVvZihGWF9GTE9BVCkgLyBzaXplb2YodW5zaWduZWQgY2hhcikpKTsKKyAgICBtX2NtZF9ibG9ja3NbbmJdICA9CisgICAgICAgICh1bnNpZ25lZCBjaGFyKikobV9jb29yZF9ibG9ja3NbbmJdICsgYmxvY2tfc2l6ZSAqIDIpOworICAgIG1fdG90YWxfYmxvY2tzKys7Cit9Cit2b2lkIHBhdGhfc3RvcmFnZTo6cmV3aW5kKHVuc2lnbmVkIHBhdGhfaWQpCit7CisgICAgbV9pdGVyYXRvciA9IHBhdGhfaWQ7Cit9Cit2b2lkIHBhdGhfc3RvcmFnZTo6Y3VydmU0KEZYX0ZMT0FUIHhfY3RybDEsIEZYX0ZMT0FUIHlfY3RybDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHhfY3RybDIsIEZYX0ZMT0FUIHlfY3RybDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHhfdG8sICAgIEZYX0ZMT0FUIHlfdG8pCit7CisgICAgYWRkX3ZlcnRleCh4X2N0cmwxLCB5X2N0cmwxLCBwYXRoX2NtZF9jdXJ2ZTQpOworICAgIGFkZF92ZXJ0ZXgoeF9jdHJsMiwgeV9jdHJsMiwgcGF0aF9jbWRfY3VydmU0KTsKKyAgICBhZGRfdmVydGV4KHhfdG8sICAgIHlfdG8sICAgIHBhdGhfY21kX2N1cnZlNCk7Cit9Cit2b2lkIHBhdGhfc3RvcmFnZTo6ZW5kX3BvbHkoKQoreworICAgIGlmKG1fdG90YWxfdmVydGljZXMpIHsKKyAgICAgICAgaWYoaXNfdmVydGV4KGNvbW1hbmQobV90b3RhbF92ZXJ0aWNlcyAtIDEpKSkgeworICAgICAgICAgICAgYWRkX3ZlcnRleCgwLCAwLCBwYXRoX2NtZF9lbmRfcG9seSB8IHBhdGhfZmxhZ3NfY2xvc2UpOworICAgICAgICB9CisgICAgfQorfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvYWdnX3BhdGhfc3RvcmFnZS5oIGIvdGhpcmRfcGFydHkvYWdnMjMvYWdnX3BhdGhfc3RvcmFnZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGdlL2FnZy9hZ2cyMy9hZ2dfcGF0aF9zdG9yYWdlLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2FnZzIzL2FnZ19wYXRoX3N0b3JhZ2UuaApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvYWdnX3BpeGZtdF9ncmF5LmggYi90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfcGl4Zm10X2dyYXkuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvYWdnX3BpeGZtdF9ncmF5LmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2FnZzIzL2FnZ19waXhmbXRfZ3JheS5oCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfcmFzdGVyaXplcl9zY2FubGluZV9hYS5jcHAgYi90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfcmFzdGVyaXplcl9zY2FubGluZV9hYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYzNzlmNgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19yYXN0ZXJpemVyX3NjYW5saW5lX2FhLmNwcApAQCAtMCwwICsxLDQ4OCBAQAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFhZUTogMjAwNi0wMS0yMiBDb3BpZWQgZnJvbSBBR0cgcHJvamVjdC4KKy8vIFRoaXMgZmlsZSB1c2VzIG9ubHkgaW50ZWdlciBkYXRhLCBzbyBpdCdzIHN1aXRhYmxlIGZvciBhbGwgcGxhdGZvcm1zLgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFudGktR3JhaW4gR2VvbWV0cnkgLSBWZXJzaW9uIDIuMworLy8gQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgTWF4aW0gU2hlbWFuYXJldiAoaHR0cDovL3d3dy5hbnRpZ3JhaW4uY29tKQorLy8KKy8vIFBlcm1pc3Npb24gdG8gY29weSwgdXNlLCBtb2RpZnksIHNlbGwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgZ3JhbnRlZCBwcm92aWRlZCB0aGlzIGNvcHlyaWdodCBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLgorLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eSwgYW5kIHdpdGggbm8gY2xhaW0gYXMgdG8gaXRzIHN1aXRhYmlsaXR5IGZvciBhbnkgcHVycG9zZS4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGUgYXV0aG9yIGdyYXRlZnVsbHkgYWNrbm93bGVnZXMgdGhlIHN1cHBvcnQgb2YgRGF2aWQgVHVybmVyLAorLy8gUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZyAtIHRoZSBhdXRob3JzIG9mIHRoZSBGcmVlVHlwZQorLy8gbGlicmF5IC0gaW4gcHJvZHVjaW5nIHRoaXMgd29yay4gU2VlIGh0dHA6Ly93d3cuZnJlZXR5cGUub3JnIGZvciBkZXRhaWxzLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29udGFjdDogbWNzZWVtQGFudGlncmFpbi5jb20KKy8vICAgICAgICAgIG1jc2VlbWFnZ0B5YWhvby5jb20KKy8vICAgICAgICAgIGh0dHA6Ly93d3cuYW50aWdyYWluLmNvbQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQWRhcHRhdGlvbiBmb3IgMzItYml0IHNjcmVlbiBjb29yZGluYXRlcyBoYXMgYmVlbiBzcG9uc29yZWQgYnkKKy8vIExpYmVydHkgVGVjaG5vbG9neSBTeXN0ZW1zLCBJbmMuLCB2aXNpdCBodHRwOi8vbGliLXN5cy5jb20KKy8vCisvLyBMaWJlcnR5IFRlY2hub2xvZ3kgU3lzdGVtcywgSW5jLiBpcyB0aGUgcHJvdmlkZXIgb2YKKy8vIFBvc3RTY3JpcHQgYW5kIFBERiB0ZWNobm9sb2d5IGZvciBzb2Z0d2FyZSBkZXZlbG9wZXJzLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENsYXNzIG91dGxpbmVfYWEgLSBpbXBsZW1lbnRhdGlvbi4KKy8vCisvLyBJbml0aWFsbHkgdGhlIHJlbmRlcmluZyBhbGdvcml0aG0gd2FzIGRlc2lnbmVkIGJ5IERhdmlkIFR1cm5lciBhbmQgdGhlCisvLyBvdGhlciBhdXRob3JzIG9mIHRoZSBGcmVlVHlwZSBsaWJyYXJ5IC0gc2VlIHRoZSBhYm92ZSBub3RpY2UuIEkgbmVhcmx5CisvLyBjcmVhdGVkIGEgc2ltaWxhciByZW5kZXJlciwgYnV0IHN0aWxsIEkgd2FzIGZhciBmcm9tIERhdmlkJ3Mgd29yay4KKy8vIEkgY29tcGxldGVseSByZWRlc2lnbmVkIHRoZSBvcmlnaW5hbCBjb2RlIGFuZCBhZGFwdGVkIGl0IGZvciBBbnRpLUdyYWluCisvLyBpZGVhcy4gVHdvIGZ1bmN0aW9ucyAtIHJlbmRlcl9saW5lIGFuZCByZW5kZXJfaGxpbmUgYXJlIHRoZSBjb3JlIG9mCisvLyB0aGUgYWxnb3JpdGhtIC0gdGhleSBjYWxjdWxhdGUgdGhlIGV4YWN0IGNvdmVyYWdlIG9mIGVhY2ggcGl4ZWwgY2VsbAorLy8gb2YgdGhlIHBvbHlnb24uIEkgbGVmdCB0aGVzZSBmdW5jdGlvbnMgYWxtb3N0IGFzIGlzLCBiZWNhdXNlIHRoZXJlJ3MKKy8vIG5vIHdheSB0byBpbXByb3ZlIHRoZSBwZXJmZWN0aW9uIC0gaGF0cyBvZmYgdG8gRGF2aWQgYW5kIGhpcyBncm91cCEKKy8vCisvLyBBbGwgb3RoZXIgY29kZSBpcyB2ZXJ5IGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbC4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJhZ2dfcmFzdGVyaXplcl9zY2FubGluZV9hYS5oIgorbmFtZXNwYWNlIGFnZworeworQUdHX0lOTElORSB2b2lkIGNlbGxfYWE6OnNldF9jb3ZlcihpbnQgYywgaW50IGEpCit7CisgICAgY292ZXIgPSBjOworICAgIGFyZWEgPSBhOworfQorQUdHX0lOTElORSB2b2lkIGNlbGxfYWE6OmFkZF9jb3ZlcihpbnQgYywgaW50IGEpCit7CisgICAgY292ZXIgKz0gYzsKKyAgICBhcmVhICs9IGE7Cit9CitBR0dfSU5MSU5FIHZvaWQgY2VsbF9hYTo6c2V0X2Nvb3JkKGludCBjeCwgaW50IGN5KQoreworICAgIHggPSBjeDsKKyAgICB5ID0gY3k7Cit9CitBR0dfSU5MSU5FIHZvaWQgY2VsbF9hYTo6c2V0KGludCBjeCwgaW50IGN5LCBpbnQgYywgaW50IGEpCit7CisgICAgeCA9IGN4OworICAgIHkgPSBjeTsKKyAgICBjb3ZlciA9IGM7CisgICAgYXJlYSA9IGE7Cit9CitvdXRsaW5lX2FhOjp+b3V0bGluZV9hYSgpCit7CisgICAgaWYobV9udW1fYmxvY2tzKSB7CisgICAgICAgIGNlbGxfYWEqKiBwdHIgPSBtX2NlbGxzICsgbV9udW1fYmxvY2tzIC0gMTsKKyAgICAgICAgd2hpbGUobV9udW1fYmxvY2tzLS0pIHsKKyAgICAgICAgICAgIEZYX0ZyZWUoKnB0cik7CisgICAgICAgICAgICBwdHItLTsKKyAgICAgICAgfQorICAgICAgICBGWF9GcmVlKG1fY2VsbHMpOworICAgIH0KK30KK291dGxpbmVfYWE6Om91dGxpbmVfYWEoKSA6CisgICAgbV9udW1fYmxvY2tzKDApLAorICAgIG1fbWF4X2Jsb2NrcygwKSwKKyAgICBtX2N1cl9ibG9jaygwKSwKKyAgICBtX251bV9jZWxscygwKSwKKyAgICBtX2NlbGxzKDApLAorICAgIG1fY3VyX2NlbGxfcHRyKDApLAorICAgIG1fY3VyX3goMCksCisgICAgbV9jdXJfeSgwKSwKKyAgICBtX21pbl94KDB4N0ZGRkZGRkYpLAorICAgIG1fbWluX3koMHg3RkZGRkZGRiksCisgICAgbV9tYXhfeCgtMHg3RkZGRkZGRiksCisgICAgbV9tYXhfeSgtMHg3RkZGRkZGRiksCisgICAgbV9zb3J0ZWQoZmFsc2UpCit7CisgICAgbV9jdXJfY2VsbC5zZXQoMHg3RkZGLCAweDdGRkYsIDAsIDApOworfQordm9pZCBvdXRsaW5lX2FhOjpyZXNldCgpCit7CisgICAgbV9udW1fY2VsbHMgPSAwOworICAgIG1fY3VyX2Jsb2NrID0gMDsKKyAgICBtX2N1cl9jZWxsLnNldCgweDdGRkYsIDB4N0ZGRiwgMCwgMCk7CisgICAgbV9zb3J0ZWQgPSBmYWxzZTsKKyAgICBtX21pbl94ID0gIDB4N0ZGRkZGRkY7CisgICAgbV9taW5feSA9ICAweDdGRkZGRkZGOworICAgIG1fbWF4X3ggPSAtMHg3RkZGRkZGRjsKKyAgICBtX21heF95ID0gLTB4N0ZGRkZGRkY7Cit9Cit2b2lkIG91dGxpbmVfYWE6OmFsbG9jYXRlX2Jsb2NrKCkKK3sKKyAgICBpZihtX2N1cl9ibG9jayA+PSBtX251bV9ibG9ja3MpIHsKKyAgICAgICAgaWYobV9udW1fYmxvY2tzID49IG1fbWF4X2Jsb2NrcykgeworICAgICAgICAgICAgY2VsbF9hYSoqIG5ld19jZWxscyA9IEZYX0FsbG9jKCBjZWxsX2FhKiwgbV9tYXhfYmxvY2tzICsgY2VsbF9ibG9ja19wb29sKTsKKyAgICAgICAgICAgIGlmKG1fY2VsbHMpIHsKKyAgICAgICAgICAgICAgICBGWFNZU19tZW1jcHkobmV3X2NlbGxzLCBtX2NlbGxzLCBtX21heF9ibG9ja3MgKiBzaXplb2YoY2VsbF9hYSopKTsKKyAgICAgICAgICAgICAgICBGWF9GcmVlKG1fY2VsbHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9jZWxscyA9IG5ld19jZWxsczsKKyAgICAgICAgICAgIG1fbWF4X2Jsb2NrcyArPSBjZWxsX2Jsb2NrX3Bvb2w7CisgICAgICAgIH0KKyAgICAgICAgbV9jZWxsc1ttX251bV9ibG9ja3MrK10gPSBGWF9BbGxvYyhjZWxsX2FhLCBjZWxsX2Jsb2NrX3NpemUpOworICAgIH0KKyAgICBtX2N1cl9jZWxsX3B0ciA9IG1fY2VsbHNbbV9jdXJfYmxvY2srK107Cit9CitBR0dfSU5MSU5FIHZvaWQgb3V0bGluZV9hYTo6YWRkX2N1cl9jZWxsKCkKK3sKKyAgICBpZihtX2N1cl9jZWxsLmFyZWEgfCBtX2N1cl9jZWxsLmNvdmVyKSB7CisgICAgICAgIGlmKChtX251bV9jZWxscyAmIGNlbGxfYmxvY2tfbWFzaykgPT0gMCkgeworICAgICAgICAgICAgaWYobV9udW1fYmxvY2tzID49IGNlbGxfYmxvY2tfbGltaXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhbGxvY2F0ZV9ibG9jaygpOworICAgICAgICB9CisgICAgICAgICptX2N1cl9jZWxsX3B0cisrID0gbV9jdXJfY2VsbDsKKyAgICAgICAgKyttX251bV9jZWxsczsKKyAgICB9Cit9CitBR0dfSU5MSU5FIHZvaWQgb3V0bGluZV9hYTo6c2V0X2N1cl9jZWxsKGludCB4LCBpbnQgeSkKK3sKKyAgICBpZihtX2N1cl9jZWxsLnggIT0geCB8fCBtX2N1cl9jZWxsLnkgIT0geSkgeworICAgICAgICBhZGRfY3VyX2NlbGwoKTsKKyAgICAgICAgbV9jdXJfY2VsbC5zZXQoeCwgeSwgMCwgMCk7CisgICAgICAgIGlmKHggPCBtX21pbl94KSB7CisgICAgICAgICAgICBtX21pbl94ID0geDsKKyAgICAgICAgfQorICAgICAgICBpZih4ID4gbV9tYXhfeCkgeworICAgICAgICAgICAgbV9tYXhfeCA9IHg7CisgICAgICAgIH0KKyAgICAgICAgaWYoeSA8IG1fbWluX3kpIHsKKyAgICAgICAgICAgIG1fbWluX3kgPSB5OworICAgICAgICB9CisgICAgICAgIGlmKHkgPiBtX21heF95KSB7CisgICAgICAgICAgICBtX21heF95ID0geTsKKyAgICAgICAgfQorICAgIH0KK30KK0FHR19JTkxJTkUgdm9pZCBvdXRsaW5lX2FhOjpyZW5kZXJfaGxpbmUoaW50IGV5LCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpCit7CisgICAgaW50IGV4MSA9IHgxID4+IHBvbHlfYmFzZV9zaGlmdDsKKyAgICBpbnQgZXgyID0geDIgPj4gcG9seV9iYXNlX3NoaWZ0OworICAgIGludCBmeDEgPSB4MSAmIHBvbHlfYmFzZV9tYXNrOworICAgIGludCBmeDIgPSB4MiAmIHBvbHlfYmFzZV9tYXNrOworICAgIGludCBkZWx0YSwgcCwgZmlyc3QsIGR4OworICAgIGludCBpbmNyLCBsaWZ0LCBtb2QsIHJlbTsKKyAgICBpZih5MSA9PSB5MikgeworICAgICAgICBzZXRfY3VyX2NlbGwoZXgyLCBleSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoZXgxID09IGV4MikgeworICAgICAgICBkZWx0YSA9IHkyIC0geTE7CisgICAgICAgIG1fY3VyX2NlbGwuYWRkX2NvdmVyKGRlbHRhLCAoZngxICsgZngyKSAqIGRlbHRhKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwICAgICA9IChwb2x5X2Jhc2Vfc2l6ZSAtIGZ4MSkgKiAoeTIgLSB5MSk7CisgICAgZmlyc3QgPSBwb2x5X2Jhc2Vfc2l6ZTsKKyAgICBpbmNyICA9IDE7CisgICAgZHggPSB4MiAtIHgxOworICAgIGlmKGR4IDwgMCkgeworICAgICAgICBwICAgICA9IGZ4MSAqICh5MiAtIHkxKTsKKyAgICAgICAgZmlyc3QgPSAwOworICAgICAgICBpbmNyICA9IC0xOworICAgICAgICBkeCAgICA9IC1keDsKKyAgICB9CisgICAgZGVsdGEgPSBwIC8gZHg7CisgICAgbW9kICAgPSBwICUgZHg7CisgICAgaWYobW9kIDwgMCkgeworICAgICAgICBkZWx0YS0tOworICAgICAgICBtb2QgKz0gZHg7CisgICAgfQorICAgIG1fY3VyX2NlbGwuYWRkX2NvdmVyKGRlbHRhLCAoZngxICsgZmlyc3QpICogZGVsdGEpOworICAgIGV4MSArPSBpbmNyOworICAgIHNldF9jdXJfY2VsbChleDEsIGV5KTsKKyAgICB5MSAgKz0gZGVsdGE7CisgICAgaWYoZXgxICE9IGV4MikgeworICAgICAgICBwICAgICA9IHBvbHlfYmFzZV9zaXplICogKHkyIC0geTEgKyBkZWx0YSk7CisgICAgICAgIGxpZnQgID0gcCAvIGR4OworICAgICAgICByZW0gICA9IHAgJSBkeDsKKyAgICAgICAgaWYgKHJlbSA8IDApIHsKKyAgICAgICAgICAgIGxpZnQtLTsKKyAgICAgICAgICAgIHJlbSArPSBkeDsKKyAgICAgICAgfQorICAgICAgICBtb2QgLT0gZHg7CisgICAgICAgIHdoaWxlIChleDEgIT0gZXgyKSB7CisgICAgICAgICAgICBkZWx0YSA9IGxpZnQ7CisgICAgICAgICAgICBtb2QgICs9IHJlbTsKKyAgICAgICAgICAgIGlmKG1vZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgbW9kIC09IGR4OworICAgICAgICAgICAgICAgIGRlbHRhKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX2N1cl9jZWxsLmFkZF9jb3ZlcihkZWx0YSwgKHBvbHlfYmFzZV9zaXplKSAqIGRlbHRhKTsKKyAgICAgICAgICAgIHkxICArPSBkZWx0YTsKKyAgICAgICAgICAgIGV4MSArPSBpbmNyOworICAgICAgICAgICAgc2V0X2N1cl9jZWxsKGV4MSwgZXkpOworICAgICAgICB9CisgICAgfQorICAgIGRlbHRhID0geTIgLSB5MTsKKyAgICBtX2N1cl9jZWxsLmFkZF9jb3ZlcihkZWx0YSwgKGZ4MiArIHBvbHlfYmFzZV9zaXplIC0gZmlyc3QpICogZGVsdGEpOworfQordm9pZCBvdXRsaW5lX2FhOjpyZW5kZXJfbGluZShpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpCit7CisgICAgZW51bSBkeF9saW1pdF9lIHsgZHhfbGltaXQgPSAxNjM4NCA8PCBwb2x5X2Jhc2Vfc2hpZnQgfTsKKyAgICBpbnQgZHggPSB4MiAtIHgxOworICAgIGlmKGR4ID49IGR4X2xpbWl0IHx8IGR4IDw9IC1keF9saW1pdCkgeworICAgICAgICBpbnQgY3ggPSAoeDEgKyB4MikgPj4gMTsKKyAgICAgICAgaW50IGN5ID0gKHkxICsgeTIpID4+IDE7CisgICAgICAgIHJlbmRlcl9saW5lKHgxLCB5MSwgY3gsIGN5KTsKKyAgICAgICAgcmVuZGVyX2xpbmUoY3gsIGN5LCB4MiwgeTIpOworICAgIH0KKyAgICBpbnQgZHkgPSB5MiAtIHkxOworICAgIGludCBleTEgPSB5MSA+PiBwb2x5X2Jhc2Vfc2hpZnQ7CisgICAgaW50IGV5MiA9IHkyID4+IHBvbHlfYmFzZV9zaGlmdDsKKyAgICBpbnQgZnkxID0geTEgJiBwb2x5X2Jhc2VfbWFzazsKKyAgICBpbnQgZnkyID0geTIgJiBwb2x5X2Jhc2VfbWFzazsKKyAgICBpbnQgeF9mcm9tLCB4X3RvOworICAgIGludCBwLCByZW0sIG1vZCwgbGlmdCwgZGVsdGEsIGZpcnN0LCBpbmNyOworICAgIGlmKGV5MSA9PSBleTIpIHsKKyAgICAgICAgcmVuZGVyX2hsaW5lKGV5MSwgeDEsIGZ5MSwgeDIsIGZ5Mik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW5jciAgPSAxOworICAgIGlmKGR4ID09IDApIHsKKyAgICAgICAgaW50IGV4ID0geDEgPj4gcG9seV9iYXNlX3NoaWZ0OworICAgICAgICBpbnQgdHdvX2Z4ID0gKHgxIC0gKGV4IDw8IHBvbHlfYmFzZV9zaGlmdCkpIDw8IDE7CisgICAgICAgIGludCBhcmVhOworICAgICAgICBmaXJzdCA9IHBvbHlfYmFzZV9zaXplOworICAgICAgICBpZihkeSA8IDApIHsKKyAgICAgICAgICAgIGZpcnN0ID0gMDsKKyAgICAgICAgICAgIGluY3IgID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgeF9mcm9tID0geDE7CisgICAgICAgIGRlbHRhID0gZmlyc3QgLSBmeTE7CisgICAgICAgIG1fY3VyX2NlbGwuYWRkX2NvdmVyKGRlbHRhLCB0d29fZnggKiBkZWx0YSk7CisgICAgICAgIGV5MSArPSBpbmNyOworICAgICAgICBzZXRfY3VyX2NlbGwoZXgsIGV5MSk7CisgICAgICAgIGRlbHRhID0gZmlyc3QgKyBmaXJzdCAtIHBvbHlfYmFzZV9zaXplOworICAgICAgICBhcmVhID0gdHdvX2Z4ICogZGVsdGE7CisgICAgICAgIHdoaWxlKGV5MSAhPSBleTIpIHsKKyAgICAgICAgICAgIG1fY3VyX2NlbGwuc2V0X2NvdmVyKGRlbHRhLCBhcmVhKTsKKyAgICAgICAgICAgIGV5MSArPSBpbmNyOworICAgICAgICAgICAgc2V0X2N1cl9jZWxsKGV4LCBleTEpOworICAgICAgICB9CisgICAgICAgIGRlbHRhID0gZnkyIC0gcG9seV9iYXNlX3NpemUgKyBmaXJzdDsKKyAgICAgICAgbV9jdXJfY2VsbC5hZGRfY292ZXIoZGVsdGEsIHR3b19meCAqIGRlbHRhKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwICAgICA9IChwb2x5X2Jhc2Vfc2l6ZSAtIGZ5MSkgKiBkeDsKKyAgICBmaXJzdCA9IHBvbHlfYmFzZV9zaXplOworICAgIGlmKGR5IDwgMCkgeworICAgICAgICBwICAgICA9IGZ5MSAqIGR4OworICAgICAgICBmaXJzdCA9IDA7CisgICAgICAgIGluY3IgID0gLTE7CisgICAgICAgIGR5ICAgID0gLWR5OworICAgIH0KKyAgICBkZWx0YSA9IHAgLyBkeTsKKyAgICBtb2QgICA9IHAgJSBkeTsKKyAgICBpZihtb2QgPCAwKSB7CisgICAgICAgIGRlbHRhLS07CisgICAgICAgIG1vZCArPSBkeTsKKyAgICB9CisgICAgeF9mcm9tID0geDEgKyBkZWx0YTsKKyAgICByZW5kZXJfaGxpbmUoZXkxLCB4MSwgZnkxLCB4X2Zyb20sIGZpcnN0KTsKKyAgICBleTEgKz0gaW5jcjsKKyAgICBzZXRfY3VyX2NlbGwoeF9mcm9tID4+IHBvbHlfYmFzZV9zaGlmdCwgZXkxKTsKKyAgICBpZihleTEgIT0gZXkyKSB7CisgICAgICAgIHAgICAgID0gcG9seV9iYXNlX3NpemUgKiBkeDsKKyAgICAgICAgbGlmdCAgPSBwIC8gZHk7CisgICAgICAgIHJlbSAgID0gcCAlIGR5OworICAgICAgICBpZihyZW0gPCAwKSB7CisgICAgICAgICAgICBsaWZ0LS07CisgICAgICAgICAgICByZW0gKz0gZHk7CisgICAgICAgIH0KKyAgICAgICAgbW9kIC09IGR5OworICAgICAgICB3aGlsZShleTEgIT0gZXkyKSB7CisgICAgICAgICAgICBkZWx0YSA9IGxpZnQ7CisgICAgICAgICAgICBtb2QgICs9IHJlbTsKKyAgICAgICAgICAgIGlmIChtb2QgPj0gMCkgeworICAgICAgICAgICAgICAgIG1vZCAtPSBkeTsKKyAgICAgICAgICAgICAgICBkZWx0YSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeF90byA9IHhfZnJvbSArIGRlbHRhOworICAgICAgICAgICAgcmVuZGVyX2hsaW5lKGV5MSwgeF9mcm9tLCBwb2x5X2Jhc2Vfc2l6ZSAtIGZpcnN0LCB4X3RvLCBmaXJzdCk7CisgICAgICAgICAgICB4X2Zyb20gPSB4X3RvOworICAgICAgICAgICAgZXkxICs9IGluY3I7CisgICAgICAgICAgICBzZXRfY3VyX2NlbGwoeF9mcm9tID4+IHBvbHlfYmFzZV9zaGlmdCwgZXkxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZW5kZXJfaGxpbmUoZXkxLCB4X2Zyb20sIHBvbHlfYmFzZV9zaXplIC0gZmlyc3QsIHgyLCBmeTIpOworfQordm9pZCBvdXRsaW5lX2FhOjptb3ZlX3RvKGludCB4LCBpbnQgeSkKK3sKKyAgICBpZihtX3NvcnRlZCkgeworICAgICAgICByZXNldCgpOworICAgIH0KKyAgICBzZXRfY3VyX2NlbGwoeCA+PiBwb2x5X2Jhc2Vfc2hpZnQsIHkgPj4gcG9seV9iYXNlX3NoaWZ0KTsKKyAgICBtX2N1cl94ID0geDsKKyAgICBtX2N1cl95ID0geTsKK30KK3ZvaWQgb3V0bGluZV9hYTo6bGluZV90byhpbnQgeCwgaW50IHkpCit7CisgICAgcmVuZGVyX2xpbmUobV9jdXJfeCwgbV9jdXJfeSwgeCwgeSk7CisgICAgbV9jdXJfeCA9IHg7CisgICAgbV9jdXJfeSA9IHk7CisgICAgbV9zb3J0ZWQgPSBmYWxzZTsKK30KK3RlbXBsYXRlIDxjbGFzcyBUPiBzdGF0aWMgQUdHX0lOTElORSB2b2lkIHN3YXBfY2VsbHMoVCogYSwgVCogYikKK3sKKyAgICBUIHRlbXAgPSAqYTsKKyAgICAqYSA9ICpiOworICAgICpiID0gdGVtcDsKK30KK2VudW0geworICAgIHFzb3J0X3RocmVzaG9sZCA9IDkKK307CitzdGF0aWMgdm9pZCBxc29ydF9jZWxscyhjZWxsX2FhKiogc3RhcnQsIHVuc2lnbmVkIG51bSkKK3sKKyAgICBjZWxsX2FhKiogIHN0YWNrWzgwXTsKKyAgICBjZWxsX2FhKioqIHRvcDsKKyAgICBjZWxsX2FhKiogIGxpbWl0OworICAgIGNlbGxfYWEqKiAgYmFzZTsKKyAgICBsaW1pdCA9IHN0YXJ0ICsgbnVtOworICAgIGJhc2UgID0gc3RhcnQ7CisgICAgdG9wICAgPSBzdGFjazsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBsZW4gPSBpbnQobGltaXQgLSBiYXNlKTsKKyAgICAgICAgY2VsbF9hYSoqIGk7CisgICAgICAgIGNlbGxfYWEqKiBqOworICAgICAgICBjZWxsX2FhKiogcGl2b3Q7CisgICAgICAgIGlmKGxlbiA+IHFzb3J0X3RocmVzaG9sZCkgeworICAgICAgICAgICAgcGl2b3QgPSBiYXNlICsgbGVuIC8gMjsKKyAgICAgICAgICAgIHN3YXBfY2VsbHMoYmFzZSwgcGl2b3QpOworICAgICAgICAgICAgaSA9IGJhc2UgKyAxOworICAgICAgICAgICAgaiA9IGxpbWl0IC0gMTsKKyAgICAgICAgICAgIGlmKCgqaiktPnggPCAoKmkpLT54KSB7CisgICAgICAgICAgICAgICAgc3dhcF9jZWxscyhpLCBqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCgqYmFzZSktPnggPCAoKmkpLT54KSB7CisgICAgICAgICAgICAgICAgc3dhcF9jZWxscyhiYXNlLCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCgqaiktPnggPCAoKmJhc2UpLT54KSB7CisgICAgICAgICAgICAgICAgc3dhcF9jZWxscyhiYXNlLCBqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcig7OykgeworICAgICAgICAgICAgICAgIGludCB4ID0gKCpiYXNlKS0+eDsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICB9IHdoaWxlKCAoKmkpLT54IDwgeCApOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgai0tOworICAgICAgICAgICAgICAgIH0gd2hpbGUoIHggPCAoKmopLT54ICk7CisgICAgICAgICAgICAgICAgaWYoaSA+IGopIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN3YXBfY2VsbHMoaSwgaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2FwX2NlbGxzKGJhc2UsIGopOworICAgICAgICAgICAgaWYoaiAtIGJhc2UgPiBsaW1pdCAtIGkpIHsKKyAgICAgICAgICAgICAgICB0b3BbMF0gPSBiYXNlOworICAgICAgICAgICAgICAgIHRvcFsxXSA9IGo7CisgICAgICAgICAgICAgICAgYmFzZSAgID0gaTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdG9wWzBdID0gaTsKKyAgICAgICAgICAgICAgICB0b3BbMV0gPSBsaW1pdDsKKyAgICAgICAgICAgICAgICBsaW1pdCAgPSBqOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG9wICs9IDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBqID0gYmFzZTsKKyAgICAgICAgICAgIGkgPSBqICsgMTsKKyAgICAgICAgICAgIGZvcig7IGkgPCBsaW1pdDsgaiA9IGksIGkrKykgeworICAgICAgICAgICAgICAgIGZvcig7IGpbMV0tPnggPCAoKmopLT54OyBqLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgc3dhcF9jZWxscyhqICsgMSwgaik7CisgICAgICAgICAgICAgICAgICAgIGlmIChqID09IGJhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYodG9wID4gc3RhY2spIHsKKyAgICAgICAgICAgICAgICB0b3AgIC09IDI7CisgICAgICAgICAgICAgICAgYmFzZSAgPSB0b3BbMF07CisgICAgICAgICAgICAgICAgbGltaXQgPSB0b3BbMV07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQordm9pZCBvdXRsaW5lX2FhOjpzb3J0X2NlbGxzKCkKK3sKKyAgICBpZihtX3NvcnRlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGFkZF9jdXJfY2VsbCgpOworICAgIGlmKG1fbnVtX2NlbGxzID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtX3NvcnRlZF9jZWxscy5hbGxvY2F0ZShtX251bV9jZWxscywgMTYpOworICAgIGlmIChtX21heF95ID4gMCAmJiBtX21pbl95IDwgMCAmJiAtbV9taW5feSA+IElOVF9NQVggLSBtX21heF95KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdW5zaWduZWQgc2l6ZSA9IG1fbWF4X3kgLSBtX21pbl95OworICAgIGlmIChzaXplICsgMSA8IHNpemUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzaXplKys7CisgICAgbV9zb3J0ZWRfeS5hbGxvY2F0ZShzaXplLCAxNik7CisgICAgbV9zb3J0ZWRfeS56ZXJvKCk7CisgICAgY2VsbF9hYSoqIGJsb2NrX3B0ciA9IG1fY2VsbHM7CisgICAgY2VsbF9hYSogIGNlbGxfcHRyID0gTlVMTDsKKyAgICB1bnNpZ25lZCBuYiA9IG1fbnVtX2NlbGxzID4+IGNlbGxfYmxvY2tfc2hpZnQ7CisgICAgdW5zaWduZWQgaTsKKyAgICB3aGlsZShuYi0tKSB7CisgICAgICAgIGNlbGxfcHRyID0gKmJsb2NrX3B0cisrOworICAgICAgICBpID0gY2VsbF9ibG9ja19zaXplOworICAgICAgICB3aGlsZShpLS0pIHsKKyAgICAgICAgICAgIG1fc29ydGVkX3lbY2VsbF9wdHItPnkgLSBtX21pbl95XS5zdGFydCsrOworICAgICAgICAgICAgKytjZWxsX3B0cjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpID0gbV9udW1fY2VsbHMgJiBjZWxsX2Jsb2NrX21hc2s7CisgICAgaWYgKGkpIHsKKyAgICAgICAgY2VsbF9wdHIgPSAqYmxvY2tfcHRyKys7CisgICAgfQorICAgIHdoaWxlKGktLSkgeworICAgICAgICBtX3NvcnRlZF95W2NlbGxfcHRyLT55IC0gbV9taW5feV0uc3RhcnQrKzsKKyAgICAgICAgKytjZWxsX3B0cjsKKyAgICB9CisgICAgdW5zaWduZWQgc3RhcnQgPSAwOworICAgIGZvcihpID0gMDsgaSA8IG1fc29ydGVkX3kuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgdW5zaWduZWQgdiA9IG1fc29ydGVkX3lbaV0uc3RhcnQ7CisgICAgICAgIG1fc29ydGVkX3lbaV0uc3RhcnQgPSBzdGFydDsKKyAgICAgICAgc3RhcnQgKz0gdjsKKyAgICB9CisgICAgYmxvY2tfcHRyID0gbV9jZWxsczsKKyAgICBuYiA9IG1fbnVtX2NlbGxzID4+IGNlbGxfYmxvY2tfc2hpZnQ7CisgICAgd2hpbGUobmItLSkgeworICAgICAgICBjZWxsX3B0ciA9ICpibG9ja19wdHIrKzsKKyAgICAgICAgaSA9IGNlbGxfYmxvY2tfc2l6ZTsKKyAgICAgICAgd2hpbGUoaS0tKSB7CisgICAgICAgICAgICBzb3J0ZWRfeSYgY3VyX3kgPSBtX3NvcnRlZF95W2NlbGxfcHRyLT55IC0gbV9taW5feV07CisgICAgICAgICAgICBtX3NvcnRlZF9jZWxsc1tjdXJfeS5zdGFydCArIGN1cl95Lm51bV0gPSBjZWxsX3B0cjsKKyAgICAgICAgICAgICsrY3VyX3kubnVtOworICAgICAgICAgICAgKytjZWxsX3B0cjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpID0gbV9udW1fY2VsbHMgJiBjZWxsX2Jsb2NrX21hc2s7CisgICAgaWYgKGkpIHsKKyAgICAgICAgY2VsbF9wdHIgPSAqYmxvY2tfcHRyKys7CisgICAgfQorICAgIHdoaWxlKGktLSkgeworICAgICAgICBzb3J0ZWRfeSYgY3VyX3kgPSBtX3NvcnRlZF95W2NlbGxfcHRyLT55IC0gbV9taW5feV07CisgICAgICAgIG1fc29ydGVkX2NlbGxzW2N1cl95LnN0YXJ0ICsgY3VyX3kubnVtXSA9IGNlbGxfcHRyOworICAgICAgICArK2N1cl95Lm51bTsKKyAgICAgICAgKytjZWxsX3B0cjsKKyAgICB9CisgICAgZm9yKGkgPSAwOyBpIDwgbV9zb3J0ZWRfeS5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBzb3J0ZWRfeSYgY3VyX3kgPSBtX3NvcnRlZF95W2ldOworICAgICAgICBpZihjdXJfeS5udW0pIHsKKyAgICAgICAgICAgIHFzb3J0X2NlbGxzKG1fc29ydGVkX2NlbGxzLmRhdGEoKSArIGN1cl95LnN0YXJ0LCBjdXJfeS5udW0pOworICAgICAgICB9CisgICAgfQorICAgIG1fc29ydGVkID0gdHJ1ZTsKK30KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19yYXN0ZXJpemVyX3NjYW5saW5lX2FhLmggYi90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfcmFzdGVyaXplcl9zY2FubGluZV9hYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMjI4MWMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfcmFzdGVyaXplcl9zY2FubGluZV9hYS5oCkBAIC0wLDAgKzEsNDc1IEBACisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQW50aS1HcmFpbiBHZW9tZXRyeSAtIFZlcnNpb24gMi4zCisvLyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBNYXhpbSBTaGVtYW5hcmV2IChodHRwOi8vd3d3LmFudGlncmFpbi5jb20pCisvLworLy8gUGVybWlzc2lvbiB0byBjb3B5LCB1c2UsIG1vZGlmeSwgc2VsbCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBncmFudGVkIHByb3ZpZGVkIHRoaXMgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMuCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LCBhbmQgd2l0aCBubyBjbGFpbSBhcyB0byBpdHMgc3VpdGFiaWxpdHkgZm9yIGFueSBwdXJwb3NlLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRoZSBhdXRob3IgZ3JhdGVmdWxseSBhY2tub3dsZWdlcyB0aGUgc3VwcG9ydCBvZiBEYXZpZCBUdXJuZXIsCisvLyBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnIC0gdGhlIGF1dGhvcnMgb2YgdGhlIEZyZWVUeXBlCisvLyBsaWJyYXkgLSBpbiBwcm9kdWNpbmcgdGhpcyB3b3JrLiBTZWUgaHR0cDovL3d3dy5mcmVldHlwZS5vcmcgZm9yIGRldGFpbHMuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb250YWN0OiBtY3NlZW1AYW50aWdyYWluLmNvbQorLy8gICAgICAgICAgbWNzZWVtYWdnQHlhaG9vLmNvbQorLy8gICAgICAgICAgaHR0cDovL3d3dy5hbnRpZ3JhaW4uY29tCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBZGFwdGF0aW9uIGZvciAzMi1iaXQgc2NyZWVuIGNvb3JkaW5hdGVzIGhhcyBiZWVuIHNwb25zb3JlZCBieQorLy8gTGliZXJ0eSBUZWNobm9sb2d5IFN5c3RlbXMsIEluYy4sIHZpc2l0IGh0dHA6Ly9saWItc3lzLmNvbQorLy8KKy8vIExpYmVydHkgVGVjaG5vbG9neSBTeXN0ZW1zLCBJbmMuIGlzIHRoZSBwcm92aWRlciBvZgorLy8gUG9zdFNjcmlwdCBhbmQgUERGIHRlY2hub2xvZ3kgZm9yIHNvZnR3YXJlIGRldmVsb3BlcnMuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZuZGVmIEFHR19SQVNURVJJWkVSX1NDQU5MSU5FX0FBX0lOQ0xVREVECisjZGVmaW5lIEFHR19SQVNURVJJWkVSX1NDQU5MSU5FX0FBX0lOQ0xVREVECisKKyNpbmNsdWRlICJhZ2dfYXJyYXkuaCIKKyNpbmNsdWRlICJhZ2dfYmFzaWNzLmgiCisjaW5jbHVkZSAiYWdnX2NsaXBfbGlhbmdfYmFyc2t5LmgiCisjaW5jbHVkZSAiYWdnX21hdGguaCIKKyNpbmNsdWRlICJhZ2dfcmVuZGVyX3NjYW5saW5lcy5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9tZW1vcnkuaCIKKworbmFtZXNwYWNlIGFnZworeworZW51bSBwb2x5X2Jhc2Vfc2NhbGVfZSB7CisgICAgcG9seV9iYXNlX3NoaWZ0ID0gOCwKKyAgICBwb2x5X2Jhc2Vfc2l6ZSAgPSAxIDw8IHBvbHlfYmFzZV9zaGlmdCwKKyAgICBwb2x5X2Jhc2VfbWFzayAgPSBwb2x5X2Jhc2Vfc2l6ZSAtIDEKK307CitpbmxpbmUgaW50IHBvbHlfY29vcmQoRlhfRkxPQVQgYykKK3sKKyAgICByZXR1cm4gaW50KGMgKiBwb2x5X2Jhc2Vfc2l6ZSk7Cit9CitzdHJ1Y3QgY2VsbF9hYSAgeworICAgIGludCB4OworICAgIGludCB5OworICAgIGludCBjb3ZlcjsKKyAgICBpbnQgYXJlYTsKKyAgICB2b2lkIHNldChpbnQgeCwgaW50IHksIGludCBjLCBpbnQgYSk7CisgICAgdm9pZCBzZXRfY29vcmQoaW50IHgsIGludCB5KTsKKyAgICB2b2lkIHNldF9jb3ZlcihpbnQgYywgaW50IGEpOworICAgIHZvaWQgYWRkX2NvdmVyKGludCBjLCBpbnQgYSk7Cit9OworY2xhc3Mgb3V0bGluZV9hYSAKK3sKKyAgICBlbnVtIGNlbGxfYmxvY2tfc2NhbGVfZSB7CisgICAgICAgIGNlbGxfYmxvY2tfc2hpZnQgPSAxMiwKKyAgICAgICAgY2VsbF9ibG9ja19zaXplICA9IDEgPDwgY2VsbF9ibG9ja19zaGlmdCwKKyAgICAgICAgY2VsbF9ibG9ja19tYXNrICA9IGNlbGxfYmxvY2tfc2l6ZSAtIDEsCisgICAgICAgIGNlbGxfYmxvY2tfcG9vbCAgPSAyNTYsCisgICAgICAgIGNlbGxfYmxvY2tfbGltaXQgPSAxMDI0CisgICAgfTsKKyAgICBzdHJ1Y3Qgc29ydGVkX3kgIHsKKyAgICAgICAgdW5zaWduZWQgc3RhcnQ7CisgICAgICAgIHVuc2lnbmVkIG51bTsKKyAgICB9OworcHVibGljOgorICAgIH5vdXRsaW5lX2FhKCk7CisgICAgb3V0bGluZV9hYSgpOworICAgIHZvaWQgcmVzZXQoKTsKKyAgICB2b2lkIG1vdmVfdG8oaW50IHgsIGludCB5KTsKKyAgICB2b2lkIGxpbmVfdG8oaW50IHgsIGludCB5KTsKKyAgICBpbnQgbWluX3goKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fbWluX3g7CisgICAgfQorICAgIGludCBtaW5feSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9taW5feTsKKyAgICB9CisgICAgaW50IG1heF94KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX21heF94OworICAgIH0KKyAgICBpbnQgbWF4X3koKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fbWF4X3k7CisgICAgfQorICAgIHZvaWQgc29ydF9jZWxscygpOworICAgIHVuc2lnbmVkIHRvdGFsX2NlbGxzKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX251bV9jZWxsczsKKyAgICB9CisgICAgdW5zaWduZWQgc2NhbmxpbmVfbnVtX2NlbGxzKHVuc2lnbmVkIHkpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9zb3J0ZWRfeVt5IC0gbV9taW5feV0ubnVtOworICAgIH0KKyAgICBjb25zdCBjZWxsX2FhKiBjb25zdCogc2NhbmxpbmVfY2VsbHModW5zaWduZWQgeSkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX3NvcnRlZF9jZWxscy5kYXRhKCkgKyBtX3NvcnRlZF95W3kgLSBtX21pbl95XS5zdGFydDsKKyAgICB9CisgICAgYm9vbCBzb3J0ZWQoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fc29ydGVkOworICAgIH0KK3ByaXZhdGU6CisgICAgb3V0bGluZV9hYShjb25zdCBvdXRsaW5lX2FhJik7CisgICAgY29uc3Qgb3V0bGluZV9hYSYgb3BlcmF0b3IgPSAoY29uc3Qgb3V0bGluZV9hYSYpOworICAgIHZvaWQgc2V0X2N1cl9jZWxsKGludCB4LCBpbnQgeSk7CisgICAgdm9pZCBhZGRfY3VyX2NlbGwoKTsKKyAgICB2b2lkIHJlbmRlcl9obGluZShpbnQgZXksIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5Mik7CisgICAgdm9pZCByZW5kZXJfbGluZShpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpOworICAgIHZvaWQgYWxsb2NhdGVfYmxvY2soKTsKK3ByaXZhdGU6CisgICAgdW5zaWduZWQgIG1fbnVtX2Jsb2NrczsKKyAgICB1bnNpZ25lZCAgbV9tYXhfYmxvY2tzOworICAgIHVuc2lnbmVkICBtX2N1cl9ibG9jazsKKyAgICB1bnNpZ25lZCAgbV9udW1fY2VsbHM7CisgICAgY2VsbF9hYSoqIG1fY2VsbHM7CisgICAgY2VsbF9hYSogIG1fY3VyX2NlbGxfcHRyOworICAgIHBvZF9hcnJheTxjZWxsX2FhKj4gbV9zb3J0ZWRfY2VsbHM7CisgICAgcG9kX2FycmF5PHNvcnRlZF95PiBtX3NvcnRlZF95OworICAgIGNlbGxfYWEgICBtX2N1cl9jZWxsOworICAgIGludCAgICAgICBtX2N1cl94OworICAgIGludCAgICAgICBtX2N1cl95OworICAgIGludCAgICAgICBtX21pbl94OworICAgIGludCAgICAgICBtX21pbl95OworICAgIGludCAgICAgICBtX21heF94OworICAgIGludCAgICAgICBtX21heF95OworICAgIGJvb2wgICAgICBtX3NvcnRlZDsKK307CitjbGFzcyBzY2FubGluZV9oaXRfdGVzdCAKK3sKK3B1YmxpYzoKKyAgICBzY2FubGluZV9oaXRfdGVzdChpbnQgeCkgOiBtX3goeCksIG1faGl0KGZhbHNlKSB7fQorICAgIHZvaWQgcmVzZXRfc3BhbnMoKSB7fQorICAgIHZvaWQgZmluYWxpemUoaW50KSB7fQorICAgIHZvaWQgYWRkX2NlbGwoaW50IHgsIGludCkKKyAgICB7CisgICAgICAgIGlmKG1feCA9PSB4KSB7CisgICAgICAgICAgICBtX2hpdCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBhZGRfc3BhbihpbnQgeCwgaW50IGxlbiwgaW50KQorICAgIHsKKyAgICAgICAgaWYobV94ID49IHggJiYgbV94IDwgeCArIGxlbikgeworICAgICAgICAgICAgbV9oaXQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHVuc2lnbmVkIG51bV9zcGFucygpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgYm9vbCBoaXQoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1faGl0OworICAgIH0KK3ByaXZhdGU6CisgICAgaW50ICBtX3g7CisgICAgYm9vbCBtX2hpdDsKK307CitlbnVtIGZpbGxpbmdfcnVsZV9lIHsKKyAgICBmaWxsX25vbl96ZXJvLAorICAgIGZpbGxfZXZlbl9vZGQKK307CitjbGFzcyByYXN0ZXJpemVyX3NjYW5saW5lX2FhIAoreworICAgIGVudW0gc3RhdHVzIHsKKyAgICAgICAgc3RhdHVzX2luaXRpYWwsCisgICAgICAgIHN0YXR1c19saW5lX3RvLAorICAgICAgICBzdGF0dXNfY2xvc2VkCisgICAgfTsKK3B1YmxpYzoKKyAgICBlbnVtIGFhX3NjYWxlX2UgeworICAgICAgICBhYV9udW0gICA9IDEgPDwgOCwKKyAgICAgICAgYWFfbWFzayAgPSBhYV9udW0gLSAxLAorICAgICAgICBhYV8ybnVtICA9IGFhX251bSAqIDIsCisgICAgICAgIGFhXzJtYXNrID0gYWFfMm51bSAtIDEKKyAgICB9OworICAgIHJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEoKSA6CisgICAgICAgIG1fZmlsbGluZ19ydWxlKGZpbGxfbm9uX3plcm8pLAorICAgICAgICBtX2NsaXBwZWRfc3RhcnRfeCgwKSwKKyAgICAgICAgbV9jbGlwcGVkX3N0YXJ0X3koMCksCisgICAgICAgIG1fc3RhdHVzKHN0YXR1c19pbml0aWFsKSwKKyAgICAgICAgbV9jbGlwcGluZyhmYWxzZSkKKyAgICB7CisgICAgfQorICAgIH5yYXN0ZXJpemVyX3NjYW5saW5lX2FhKCkge30KKyAgICB2b2lkIGZpbGxpbmdfcnVsZShmaWxsaW5nX3J1bGVfZSBmaWxsaW5nX3J1bGUpCisgICAgeworICAgICAgICBtX2ZpbGxpbmdfcnVsZSA9IGZpbGxpbmdfcnVsZTsKKyAgICB9CisgICAgaW50IG1pbl94KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX291dGxpbmUubWluX3goKTsKKyAgICB9CisgICAgaW50IG1pbl95KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX291dGxpbmUubWluX3koKTsKKyAgICB9CisgICAgaW50IG1heF94KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX291dGxpbmUubWF4X3goKTsKKyAgICB9CisgICAgaW50IG1heF95KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX291dGxpbmUubWF4X3koKTsKKyAgICB9CisgICAgdm9pZCByZXNldCgpCisgICAgeworICAgICAgICBtX291dGxpbmUucmVzZXQoKTsKKyAgICAgICAgbV9zdGF0dXMgPSBzdGF0dXNfaW5pdGlhbDsKKyAgICB9CisgICAgdm9pZCBjbGlwX2JveChGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MikKKyAgICB7CisgICAgICAgIG1fY2xpcF9ib3ggPSByZWN0KHBvbHlfY29vcmQoeDEpLCBwb2x5X2Nvb3JkKHkxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcG9seV9jb29yZCh4MiksIHBvbHlfY29vcmQoeTIpKTsKKyAgICAgICAgbV9jbGlwX2JveC5ub3JtYWxpemUoKTsKKyAgICAgICAgbV9jbGlwcGluZyA9IHRydWU7CisgICAgfQorICAgIHZvaWQgYWRkX3ZlcnRleChGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCB1bnNpZ25lZCBjbWQpCisgICAgeworICAgICAgICBpZihpc19jbG9zZShjbWQpKSB7CisgICAgICAgICAgICBjbG9zZV9wb2x5Z29uKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZihpc19tb3ZlX3RvKGNtZCkpIHsKKyAgICAgICAgICAgICAgICBtb3ZlX3RvKHBvbHlfY29vcmQoeCksIHBvbHlfY29vcmQoeSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZihpc192ZXJ0ZXgoY21kKSkgeworICAgICAgICAgICAgICAgICAgICBsaW5lX3RvKHBvbHlfY29vcmQoeCksIHBvbHlfY29vcmQoeSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIG1vdmVfdG8oaW50IHgsIGludCB5KQorICAgIHsKKyAgICAgICAgaWYobV9jbGlwcGluZykgeworICAgICAgICAgICAgaWYobV9vdXRsaW5lLnNvcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKG1fc3RhdHVzID09IHN0YXR1c19saW5lX3RvKSB7CisgICAgICAgICAgICAgICAgY2xvc2VfcG9seWdvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9wcmV2X3ggPSBtX3N0YXJ0X3ggPSB4OworICAgICAgICAgICAgbV9wcmV2X3kgPSBtX3N0YXJ0X3kgPSB5OworICAgICAgICAgICAgbV9zdGF0dXMgPSBzdGF0dXNfaW5pdGlhbDsKKyAgICAgICAgICAgIG1fcHJldl9mbGFncyA9IGNsaXBwaW5nX2ZsYWdzKHgsIHksIG1fY2xpcF9ib3gpOworICAgICAgICAgICAgaWYobV9wcmV2X2ZsYWdzID09IDApIHsKKyAgICAgICAgICAgICAgICBtb3ZlX3RvX25vX2NsaXAoeCwgeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtb3ZlX3RvX25vX2NsaXAoeCwgeSk7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBsaW5lX3RvKGludCB4LCBpbnQgeSkKKyAgICB7CisgICAgICAgIGlmKG1fY2xpcHBpbmcpIHsKKyAgICAgICAgICAgIGNsaXBfc2VnbWVudCh4LCB5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxpbmVfdG9fbm9fY2xpcCh4LCB5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIGNsb3NlX3BvbHlnb24oKQorICAgIHsKKyAgICAgICAgaWYgKG1fc3RhdHVzICE9IHN0YXR1c19saW5lX3RvKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYobV9jbGlwcGluZykgeworICAgICAgICAgICAgY2xpcF9zZWdtZW50KG1fc3RhcnRfeCwgbV9zdGFydF95KTsKKyAgICAgICAgfQorICAgICAgICBjbG9zZV9wb2x5Z29uX25vX2NsaXAoKTsKKyAgICB9CisgICAgQUdHX0lOTElORSB1bnNpZ25lZCBjYWxjdWxhdGVfYWxwaGEoaW50IGFyZWEsIGJvb2wgbm9fc21vb3RoKSBjb25zdAorICAgIHsKKyAgICAgICAgaW50IGNvdmVyID0gYXJlYSA+PiAocG9seV9iYXNlX3NoaWZ0ICogMiArIDEgLSA4KTsKKyAgICAgICAgaWYoY292ZXIgPCAwKSB7CisgICAgICAgICAgICBjb3ZlciA9IC1jb3ZlcjsKKyAgICAgICAgfQorICAgICAgICBpZihtX2ZpbGxpbmdfcnVsZSA9PSBmaWxsX2V2ZW5fb2RkKSB7CisgICAgICAgICAgICBjb3ZlciAmPSBhYV8ybWFzazsKKyAgICAgICAgICAgIGlmKGNvdmVyID4gYWFfbnVtKSB7CisgICAgICAgICAgICAgICAgY292ZXIgPSBhYV8ybnVtIC0gY292ZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vX3Ntb290aCkgeworICAgICAgICAgICAgY292ZXIgPSBjb3ZlciA+IGFhX21hc2sgLyAyID8gYWFfbWFzayA6IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYoY292ZXIgPiBhYV9tYXNrKSB7CisgICAgICAgICAgICBjb3ZlciA9IGFhX21hc2s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdmVyOworICAgIH0KKyAgICBBR0dfSU5MSU5FIHZvaWQgc29ydCgpCisgICAgeworICAgICAgICBtX291dGxpbmUuc29ydF9jZWxscygpOworICAgIH0KKyAgICBBR0dfSU5MSU5FIGJvb2wgcmV3aW5kX3NjYW5saW5lcygpCisgICAgeworICAgICAgICBjbG9zZV9wb2x5Z29uKCk7CisgICAgICAgIG1fb3V0bGluZS5zb3J0X2NlbGxzKCk7CisgICAgICAgIGlmKG1fb3V0bGluZS50b3RhbF9jZWxscygpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBtX2N1cl95ID0gbV9vdXRsaW5lLm1pbl95KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBBR0dfSU5MSU5FIGJvb2wgbmF2aWdhdGVfc2NhbmxpbmUoaW50IHkpCisgICAgeworICAgICAgICBjbG9zZV9wb2x5Z29uKCk7CisgICAgICAgIG1fb3V0bGluZS5zb3J0X2NlbGxzKCk7CisgICAgICAgIGlmKG1fb3V0bGluZS50b3RhbF9jZWxscygpID09IDAgfHwKKyAgICAgICAgICAgICAgICB5IDwgbV9vdXRsaW5lLm1pbl95KCkgfHwKKyAgICAgICAgICAgICAgICB5ID4gbV9vdXRsaW5lLm1heF95KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBtX2N1cl95ID0geTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHRlbXBsYXRlPGNsYXNzIFNjYW5saW5lPiBib29sIHN3ZWVwX3NjYW5saW5lKFNjYW5saW5lJiBzbCwgYm9vbCBub19zbW9vdGgpCisgICAgeworICAgICAgICBmb3IoOzspIHsKKyAgICAgICAgICAgIGlmKG1fY3VyX3kgPiBtX291dGxpbmUubWF4X3koKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNsLnJlc2V0X3NwYW5zKCk7CisgICAgICAgICAgICB1bnNpZ25lZCBudW1fY2VsbHMgPSBtX291dGxpbmUuc2NhbmxpbmVfbnVtX2NlbGxzKG1fY3VyX3kpOworICAgICAgICAgICAgY29uc3QgY2VsbF9hYSogY29uc3QqIGNlbGxzID0gbV9vdXRsaW5lLnNjYW5saW5lX2NlbGxzKG1fY3VyX3kpOworICAgICAgICAgICAgaW50IGNvdmVyID0gMDsKKyAgICAgICAgICAgIHdoaWxlKG51bV9jZWxscykgeworICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxfYWEqIGN1cl9jZWxsID0gKmNlbGxzOworICAgICAgICAgICAgICAgIGludCB4ICAgID0gY3VyX2NlbGwtPng7CisgICAgICAgICAgICAgICAgaW50IGFyZWEgPSBjdXJfY2VsbC0+YXJlYTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBhbHBoYTsKKyAgICAgICAgICAgICAgICBjb3ZlciArPSBjdXJfY2VsbC0+Y292ZXI7CisgICAgICAgICAgICAgICAgd2hpbGUoLS1udW1fY2VsbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgY3VyX2NlbGwgPSAqKytjZWxsczsKKyAgICAgICAgICAgICAgICAgICAgaWYoY3VyX2NlbGwtPnggIT0geCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXJlYSAgKz0gY3VyX2NlbGwtPmFyZWE7CisgICAgICAgICAgICAgICAgICAgIGNvdmVyICs9IGN1cl9jZWxsLT5jb3ZlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoYXJlYSkgeworICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IGNhbGN1bGF0ZV9hbHBoYSgoY292ZXIgPDwgKHBvbHlfYmFzZV9zaGlmdCArIDEpKSAtIGFyZWEsIG5vX3Ntb290aCk7CisgICAgICAgICAgICAgICAgICAgIGlmKGFscGhhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzbC5hZGRfY2VsbCh4LCBhbHBoYSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgeCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihudW1fY2VsbHMgJiYgY3VyX2NlbGwtPnggPiB4KSB7CisgICAgICAgICAgICAgICAgICAgIGFscGhhID0gY2FsY3VsYXRlX2FscGhhKGNvdmVyIDw8IChwb2x5X2Jhc2Vfc2hpZnQgKyAxKSwgbm9fc21vb3RoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoYWxwaGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsLmFkZF9zcGFuKHgsIGN1cl9jZWxsLT54IC0geCwgYWxwaGEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoc2wubnVtX3NwYW5zKCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrbV9jdXJfeTsKKyAgICAgICAgfQorICAgICAgICBzbC5maW5hbGl6ZShtX2N1cl95KTsKKyAgICAgICAgKyttX2N1cl95OworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdGVtcGxhdGU8Y2xhc3MgVmVydGV4U291cmNlPgorICAgIHZvaWQgYWRkX3BhdGgoVmVydGV4U291cmNlJiB2cywgdW5zaWduZWQgcGF0aF9pZCA9IDApCisgICAgeworICAgICAgICBGWF9GTE9BVCB4OworICAgICAgICBGWF9GTE9BVCB5OworICAgICAgICB1bnNpZ25lZCBjbWQ7CisgICAgICAgIHZzLnJld2luZChwYXRoX2lkKTsKKyAgICAgICAgd2hpbGUoIWlzX3N0b3AoY21kID0gdnMudmVydGV4KCZ4LCAmeSkpKSB7CisgICAgICAgICAgICBhZGRfdmVydGV4KHgsIHksIGNtZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgdGVtcGxhdGU8Y2xhc3MgVmVydGV4U291cmNlPgorICAgIHZvaWQgYWRkX3BhdGhfdHJhbnNmb3JtZWQoVmVydGV4U291cmNlJiB2cywgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwgdW5zaWduZWQgcGF0aF9pZCA9IDApCisgICAgeworICAgICAgICBGWF9GTE9BVCB4OworICAgICAgICBGWF9GTE9BVCB5OworICAgICAgICB1bnNpZ25lZCBjbWQ7CisgICAgICAgIHZzLnJld2luZChwYXRoX2lkKTsKKyAgICAgICAgd2hpbGUoIWlzX3N0b3AoY21kID0gdnMudmVydGV4KCZ4LCAmeSkpKSB7CisgICAgICAgICAgICBpZiAocE1hdHJpeCkgeworICAgICAgICAgICAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybSh4LCB5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZF92ZXJ0ZXgoeCwgeSwgY21kKTsKKyAgICAgICAgfQorICAgIH0KK3ByaXZhdGU6CisgICAgcmFzdGVyaXplcl9zY2FubGluZV9hYShjb25zdCByYXN0ZXJpemVyX3NjYW5saW5lX2FhJik7CisgICAgY29uc3QgcmFzdGVyaXplcl9zY2FubGluZV9hYSYKKyAgICBvcGVyYXRvciA9IChjb25zdCByYXN0ZXJpemVyX3NjYW5saW5lX2FhJik7CisgICAgdm9pZCBtb3ZlX3RvX25vX2NsaXAoaW50IHgsIGludCB5KQorICAgIHsKKyAgICAgICAgaWYobV9zdGF0dXMgPT0gc3RhdHVzX2xpbmVfdG8pIHsKKyAgICAgICAgICAgIGNsb3NlX3BvbHlnb25fbm9fY2xpcCgpOworICAgICAgICB9CisgICAgICAgIG1fb3V0bGluZS5tb3ZlX3RvKHggKiAxLCB5KTsKKyAgICAgICAgbV9jbGlwcGVkX3N0YXJ0X3ggPSB4OworICAgICAgICBtX2NsaXBwZWRfc3RhcnRfeSA9IHk7CisgICAgICAgIG1fc3RhdHVzID0gc3RhdHVzX2xpbmVfdG87CisgICAgfQorICAgIHZvaWQgbGluZV90b19ub19jbGlwKGludCB4LCBpbnQgeSkKKyAgICB7CisgICAgICAgIGlmKG1fc3RhdHVzICE9IHN0YXR1c19pbml0aWFsKSB7CisgICAgICAgICAgICBtX291dGxpbmUubGluZV90byh4ICogMSwgeSk7CisgICAgICAgICAgICBtX3N0YXR1cyA9IHN0YXR1c19saW5lX3RvOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgY2xvc2VfcG9seWdvbl9ub19jbGlwKCkKKyAgICB7CisgICAgICAgIGlmKG1fc3RhdHVzID09IHN0YXR1c19saW5lX3RvKSB7CisgICAgICAgICAgICBtX291dGxpbmUubGluZV90byhtX2NsaXBwZWRfc3RhcnRfeCAqIDEsIG1fY2xpcHBlZF9zdGFydF95KTsKKyAgICAgICAgICAgIG1fc3RhdHVzID0gc3RhdHVzX2Nsb3NlZDsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIGNsaXBfc2VnbWVudChpbnQgeCwgaW50IHkpCisgICAgeworICAgICAgICB1bnNpZ25lZCBmbGFncyA9IGNsaXBwaW5nX2ZsYWdzKHgsIHksIG1fY2xpcF9ib3gpOworICAgICAgICBpZihtX3ByZXZfZmxhZ3MgPT0gZmxhZ3MpIHsKKyAgICAgICAgICAgIGlmKGZsYWdzID09IDApIHsKKyAgICAgICAgICAgICAgICBpZihtX3N0YXR1cyA9PSBzdGF0dXNfaW5pdGlhbCkgeworICAgICAgICAgICAgICAgICAgICBtb3ZlX3RvX25vX2NsaXAoeCwgeSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbGluZV90b19ub19jbGlwKHgsIHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBjeFs0XTsKKyAgICAgICAgICAgIGludCBjeVs0XTsKKyAgICAgICAgICAgIHVuc2lnbmVkIG4gPSBjbGlwX2xpYW5nX2JhcnNreShtX3ByZXZfeCwgbV9wcmV2X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NsaXBfYm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN4LCBjeSk7CisgICAgICAgICAgICBjb25zdCBpbnQqIHB4ID0gY3g7CisgICAgICAgICAgICBjb25zdCBpbnQqIHB5ID0gY3k7CisgICAgICAgICAgICB3aGlsZShuLS0pIHsKKyAgICAgICAgICAgICAgICBpZihtX3N0YXR1cyA9PSBzdGF0dXNfaW5pdGlhbCkgeworICAgICAgICAgICAgICAgICAgICBtb3ZlX3RvX25vX2NsaXAoKnB4KyssICpweSsrKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsaW5lX3RvX25vX2NsaXAoKnB4KyssICpweSsrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbV9wcmV2X2ZsYWdzID0gZmxhZ3M7CisgICAgICAgIG1fcHJldl94ID0geDsKKyAgICAgICAgbV9wcmV2X3kgPSB5OworICAgIH0KK3ByaXZhdGU6CisgICAgb3V0bGluZV9hYSAgICAgbV9vdXRsaW5lOworICAgIGZpbGxpbmdfcnVsZV9lIG1fZmlsbGluZ19ydWxlOworICAgIGludCAgICAgICAgICAgIG1fY2xpcHBlZF9zdGFydF94OworICAgIGludCAgICAgICAgICAgIG1fY2xpcHBlZF9zdGFydF95OworICAgIGludCAgICAgICAgICAgIG1fc3RhcnRfeDsKKyAgICBpbnQgICAgICAgICAgICBtX3N0YXJ0X3k7CisgICAgaW50ICAgICAgICAgICAgbV9wcmV2X3g7CisgICAgaW50ICAgICAgICAgICAgbV9wcmV2X3k7CisgICAgdW5zaWduZWQgICAgICAgbV9wcmV2X2ZsYWdzOworICAgIHVuc2lnbmVkICAgICAgIG1fc3RhdHVzOworICAgIHJlY3QgICAgICAgICAgIG1fY2xpcF9ib3g7CisgICAgYm9vbCAgICAgICAgICAgbV9jbGlwcGluZzsKKyAgICBpbnQgICAgICAgICAgICBtX2N1cl95OworfTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvYWdnX3JlbmRlcl9zY2FubGluZXMuaCBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19yZW5kZXJfc2NhbmxpbmVzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Z2UvYWdnL2FnZzIzL2FnZ19yZW5kZXJfc2NhbmxpbmVzLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2FnZzIzL2FnZ19yZW5kZXJfc2NhbmxpbmVzLmgKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYWdnL2FnZzIzL2FnZ19yZW5kZXJlcl9iYXNlLmggYi90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfcmVuZGVyZXJfYmFzZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGdlL2FnZy9hZ2cyMy9hZ2dfcmVuZGVyZXJfYmFzZS5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfcmVuZGVyZXJfYmFzZS5oCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FnZy9hZ2cyMy9hZ2dfcmVuZGVyZXJfc2NhbmxpbmUuaCBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19yZW5kZXJlcl9zY2FubGluZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGdlL2FnZy9hZ2cyMy9hZ2dfcmVuZGVyZXJfc2NhbmxpbmUuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvYWdnMjMvYWdnX3JlbmRlcmVyX3NjYW5saW5lLmgKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYWdnL2FnZzIzL2FnZ19yZW5kZXJpbmdfYnVmZmVyLmggYi90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfcmVuZGVyaW5nX2J1ZmZlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGdlL2FnZy9hZ2cyMy9hZ2dfcmVuZGVyaW5nX2J1ZmZlci5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfcmVuZGVyaW5nX2J1ZmZlci5oCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfc2NhbmxpbmVfdS5oIGIvdGhpcmRfcGFydHkvYWdnMjMvYWdnX3NjYW5saW5lX3UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTAwMTE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYWdnMjMvYWdnX3NjYW5saW5lX3UuaApAQCAtMCwwICsxLDE1MCBAQAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFudGktR3JhaW4gR2VvbWV0cnkgLSBWZXJzaW9uIDIuMworLy8gQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgTWF4aW0gU2hlbWFuYXJldiAoaHR0cDovL3d3dy5hbnRpZ3JhaW4uY29tKQorLy8KKy8vIFBlcm1pc3Npb24gdG8gY29weSwgdXNlLCBtb2RpZnksIHNlbGwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorLy8gaXMgZ3JhbnRlZCBwcm92aWRlZCB0aGlzIGNvcHlyaWdodCBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLgorLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCisvLyB3YXJyYW50eSwgYW5kIHdpdGggbm8gY2xhaW0gYXMgdG8gaXRzIHN1aXRhYmlsaXR5IGZvciBhbnkgcHVycG9zZS4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbnRhY3Q6IG1jc2VlbUBhbnRpZ3JhaW4uY29tCisvLyAgICAgICAgICBtY3NlZW1hZ2dAeWFob28uY29tCisvLyAgICAgICAgICBodHRwOi8vd3d3LmFudGlncmFpbi5jb20KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEFkYXB0YXRpb24gZm9yIDMyLWJpdCBzY3JlZW4gY29vcmRpbmF0ZXMgKHNjYW5saW5lMzJfdSkgaGFzIGJlZW4gc3BvbnNvcmVkIGJ5CisvLyBMaWJlcnR5IFRlY2hub2xvZ3kgU3lzdGVtcywgSW5jLiwgdmlzaXQgaHR0cDovL2xpYi1zeXMuY29tCisvLworLy8gTGliZXJ0eSBUZWNobm9sb2d5IFN5c3RlbXMsIEluYy4gaXMgdGhlIHByb3ZpZGVyIG9mCisvLyBQb3N0U2NyaXB0IGFuZCBQREYgdGVjaG5vbG9neSBmb3Igc29mdHdhcmUgZGV2ZWxvcGVycy4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZm5kZWYgQUdHX1NDQU5MSU5FX1VfSU5DTFVERUQKKyNkZWZpbmUgQUdHX1NDQU5MSU5FX1VfSU5DTFVERUQKKyNpbmNsdWRlICJhZ2dfYXJyYXkuaCIKK25hbWVzcGFjZSBhZ2cKK3sKK3RlbXBsYXRlPGNsYXNzIENvdmVyVD4gY2xhc3Mgc2NhbmxpbmVfdSAKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHNjYW5saW5lX3U8Q292ZXJUPiBzZWxmX3R5cGU7CisgICAgdHlwZWRlZiBDb3ZlclQgY292ZXJfdHlwZTsKKyAgICB0eXBlZGVmIGludDE2ICBjb29yZF90eXBlOworICAgIHN0cnVjdCBzcGFuICB7CisgICAgICAgIGNvb3JkX3R5cGUgIHg7CisgICAgICAgIGNvb3JkX3R5cGUgIGxlbjsKKyAgICAgICAgY292ZXJfdHlwZSogY292ZXJzOworICAgIH07CisgICAgdHlwZWRlZiBzcGFuKiBpdGVyYXRvcjsKKyAgICB0eXBlZGVmIGNvbnN0IHNwYW4qIGNvbnN0X2l0ZXJhdG9yOworICAgIH5zY2FubGluZV91KCkKKyAgICB7CisgICAgICAgIEZYX0ZyZWUobV9zcGFucyk7CisgICAgICAgIEZYX0ZyZWUobV9jb3ZlcnMpOworICAgIH0KKyAgICBzY2FubGluZV91KCkgOgorICAgICAgICBtX21pbl94KDApLAorICAgICAgICBtX21heF9sZW4oMCksCisgICAgICAgIG1fbGFzdF94KDB4N0ZGRkZGRjApLAorICAgICAgICBtX2NvdmVycygwKSwKKyAgICAgICAgbV9zcGFucygwKSwKKyAgICAgICAgbV9jdXJfc3BhbigwKQorICAgIHt9CisgICAgdm9pZCByZXNldChpbnQgbWluX3gsIGludCBtYXhfeCkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIG1heF9sZW4gPSBtYXhfeCAtIG1pbl94ICsgMjsKKyAgICAgICAgaWYobWF4X2xlbiA+IG1fbWF4X2xlbikgeworICAgICAgICAgICAgRlhfRnJlZShtX3NwYW5zKTsKKyAgICAgICAgICAgIEZYX0ZyZWUobV9jb3ZlcnMpOworICAgICAgICAgICAgbV9jb3ZlcnMgID0gRlhfQWxsb2MoIGNvdmVyX3R5cGUgLCBtYXhfbGVuKTsKKyAgICAgICAgICAgIG1fc3BhbnMgICA9IEZYX0FsbG9jKCBzcGFuICAgICAgICwgbWF4X2xlbik7CisgICAgICAgICAgICBtX21heF9sZW4gPSBtYXhfbGVuOworICAgICAgICB9CisgICAgICAgIG1fbGFzdF94ICAgICAgICA9IDB4N0ZGRkZGRjA7CisgICAgICAgIG1fbWluX3ggICAgICAgICA9IG1pbl94OworICAgICAgICBtX2N1cl9zcGFuICAgICAgPSBtX3NwYW5zOworICAgIH0KKyAgICB2b2lkIGFkZF9jZWxsKGludCB4LCB1bnNpZ25lZCBjb3ZlcikKKyAgICB7CisgICAgICAgIHggLT0gbV9taW5feDsKKyAgICAgICAgbV9jb3ZlcnNbeF0gPSAoY292ZXJfdHlwZSljb3ZlcjsKKyAgICAgICAgaWYoeCA9PSBtX2xhc3RfeCArIDEpIHsKKyAgICAgICAgICAgIG1fY3VyX3NwYW4tPmxlbisrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbV9jdXJfc3BhbisrOworICAgICAgICAgICAgbV9jdXJfc3Bhbi0+eCAgICAgID0gKGNvb3JkX3R5cGUpKHggKyBtX21pbl94KTsKKyAgICAgICAgICAgIG1fY3VyX3NwYW4tPmxlbiAgICA9IDE7CisgICAgICAgICAgICBtX2N1cl9zcGFuLT5jb3ZlcnMgPSBtX2NvdmVycyArIHg7CisgICAgICAgIH0KKyAgICAgICAgbV9sYXN0X3ggPSB4OworICAgIH0KKyAgICB2b2lkIGFkZF9jZWxscyhpbnQgeCwgdW5zaWduZWQgbGVuLCBjb25zdCBDb3ZlclQqIGNvdmVycykKKyAgICB7CisgICAgICAgIHggLT0gbV9taW5feDsKKyAgICAgICAgRlhTWVNfbWVtY3B5KG1fY292ZXJzICsgeCwgY292ZXJzLCBsZW4gKiBzaXplb2YoQ292ZXJUKSk7CisgICAgICAgIGlmKHggPT0gbV9sYXN0X3ggKyAxKSB7CisgICAgICAgICAgICBtX2N1cl9zcGFuLT5sZW4gKz0gKGNvb3JkX3R5cGUpbGVuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbV9jdXJfc3BhbisrOworICAgICAgICAgICAgbV9jdXJfc3Bhbi0+eCAgICAgID0gKGNvb3JkX3R5cGUpKHggKyBtX21pbl94KTsKKyAgICAgICAgICAgIG1fY3VyX3NwYW4tPmxlbiAgICA9IChjb29yZF90eXBlKWxlbjsKKyAgICAgICAgICAgIG1fY3VyX3NwYW4tPmNvdmVycyA9IG1fY292ZXJzICsgeDsKKyAgICAgICAgfQorICAgICAgICBtX2xhc3RfeCA9IHggKyBsZW4gLSAxOworICAgIH0KKyAgICB2b2lkIGFkZF9zcGFuKGludCB4LCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGNvdmVyKQorICAgIHsKKyAgICAgICAgeCAtPSBtX21pbl94OworICAgICAgICBGWFNZU19tZW1zZXQobV9jb3ZlcnMgKyB4LCBjb3ZlciwgbGVuKTsKKyAgICAgICAgaWYoeCA9PSBtX2xhc3RfeCArIDEpIHsKKyAgICAgICAgICAgIG1fY3VyX3NwYW4tPmxlbiArPSAoY29vcmRfdHlwZSlsZW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX2N1cl9zcGFuKys7CisgICAgICAgICAgICBtX2N1cl9zcGFuLT54ICAgICAgPSAoY29vcmRfdHlwZSkoeCArIG1fbWluX3gpOworICAgICAgICAgICAgbV9jdXJfc3Bhbi0+bGVuICAgID0gKGNvb3JkX3R5cGUpbGVuOworICAgICAgICAgICAgbV9jdXJfc3Bhbi0+Y292ZXJzID0gbV9jb3ZlcnMgKyB4OworICAgICAgICB9CisgICAgICAgIG1fbGFzdF94ID0geCArIGxlbiAtIDE7CisgICAgfQorICAgIHZvaWQgZmluYWxpemUoaW50IHkpCisgICAgeworICAgICAgICBtX3kgPSB5OworICAgIH0KKyAgICB2b2lkIHJlc2V0X3NwYW5zKCkKKyAgICB7CisgICAgICAgIG1fbGFzdF94ICAgID0gMHg3RkZGRkZGMDsKKyAgICAgICAgbV9jdXJfc3BhbiAgPSBtX3NwYW5zOworICAgIH0KKyAgICBpbnQgICAgICB5KCkgICAgICAgICAgIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV95OworICAgIH0KKyAgICB1bnNpZ25lZCBudW1fc3BhbnMoKSAgIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gdW5zaWduZWQobV9jdXJfc3BhbiAtIG1fc3BhbnMpOworICAgIH0KKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9zcGFucyArIDE7CisgICAgfQorICAgIGl0ZXJhdG9yICAgICAgIGJlZ2luKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtX3NwYW5zICsgMTsKKyAgICB9Citwcml2YXRlOgorICAgIHNjYW5saW5lX3UoY29uc3Qgc2VsZl90eXBlJik7CisgICAgY29uc3Qgc2VsZl90eXBlJiBvcGVyYXRvciA9IChjb25zdCBzZWxmX3R5cGUmKTsKK3ByaXZhdGU6CisgICAgaW50ICAgICAgICAgICBtX21pbl94OworICAgIHVuc2lnbmVkICAgICAgbV9tYXhfbGVuOworICAgIGludCAgICAgICAgICAgbV9sYXN0X3g7CisgICAgaW50ICAgICAgICAgICBtX3k7CisgICAgY292ZXJfdHlwZSogICBtX2NvdmVyczsKKyAgICBzcGFuKiAgICAgICAgIG1fc3BhbnM7CisgICAgc3BhbiogICAgICAgICBtX2N1cl9zcGFuOworfTsKK3R5cGVkZWYgc2NhbmxpbmVfdTxpbnQ4dT4gc2NhbmxpbmVfdTg7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Z2UvYWdnL2FnZzIzL2FnZ19zaG9ydGVuX3BhdGguaCBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19zaG9ydGVuX3BhdGguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvYWdnX3Nob3J0ZW5fcGF0aC5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfc2hvcnRlbl9wYXRoLmgKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ192Y2dlbl9kYXNoLmNwcCBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ192Y2dlbl9kYXNoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzViZDc4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYWdnMjMvYWdnX3ZjZ2VuX2Rhc2guY3BwCkBAIC0wLDAgKzEsMTc4IEBACisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQW50aS1HcmFpbiBHZW9tZXRyeSAtIFZlcnNpb24gMi4zCisvLyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBNYXhpbSBTaGVtYW5hcmV2IChodHRwOi8vd3d3LmFudGlncmFpbi5jb20pCisvLworLy8gUGVybWlzc2lvbiB0byBjb3B5LCB1c2UsIG1vZGlmeSwgc2VsbCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisvLyBpcyBncmFudGVkIHByb3ZpZGVkIHRoaXMgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluIGFsbCBjb3BpZXMuCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQKKy8vIHdhcnJhbnR5LCBhbmQgd2l0aCBubyBjbGFpbSBhcyB0byBpdHMgc3VpdGFiaWxpdHkgZm9yIGFueSBwdXJwb3NlLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29udGFjdDogbWNzZWVtQGFudGlncmFpbi5jb20KKy8vICAgICAgICAgIG1jc2VlbWFnZ0B5YWhvby5jb20KKy8vICAgICAgICAgIGh0dHA6Ly93d3cuYW50aWdyYWluLmNvbQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTGluZSBkYXNoIGdlbmVyYXRvcgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaW5jbHVkZSAiYWdnX3Nob3J0ZW5fcGF0aC5oIgorI2luY2x1ZGUgImFnZ192Y2dlbl9kYXNoLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCisKK25hbWVzcGFjZSBhZ2cKK3sKK3ZjZ2VuX2Rhc2g6OnZjZ2VuX2Rhc2goKSA6CisgICAgbV90b3RhbF9kYXNoX2xlbigwKSwKKyAgICBtX251bV9kYXNoZXMoMCksCisgICAgbV9kYXNoX3N0YXJ0KDApLAorICAgIG1fc2hvcnRlbigwKSwKKyAgICBtX2N1cnJfZGFzaF9zdGFydCgwKSwKKyAgICBtX2N1cnJfZGFzaCgwKSwKKyAgICBtX3NyY192ZXJ0aWNlcygpLAorICAgIG1fY2xvc2VkKDApLAorICAgIG1fc3RhdHVzKGluaXRpYWwpLAorICAgIG1fc3JjX3ZlcnRleCgwKQoreworfQordm9pZCB2Y2dlbl9kYXNoOjpyZW1vdmVfYWxsX2Rhc2hlcygpCit7CisgICAgbV90b3RhbF9kYXNoX2xlbiA9IDA7CisgICAgbV9udW1fZGFzaGVzID0gMDsKKyAgICBtX2N1cnJfZGFzaF9zdGFydCA9IDA7CisgICAgbV9jdXJyX2Rhc2ggPSAwOworfQordm9pZCB2Y2dlbl9kYXNoOjphZGRfZGFzaChGWF9GTE9BVCBkYXNoX2xlbiwgRlhfRkxPQVQgZ2FwX2xlbikKK3sKKyAgICBpZihtX251bV9kYXNoZXMgPCBtYXhfZGFzaGVzKSB7CisgICAgICAgIG1fdG90YWxfZGFzaF9sZW4gKz0gZGFzaF9sZW4gKyBnYXBfbGVuOworICAgICAgICBtX2Rhc2hlc1ttX251bV9kYXNoZXMrK10gPSBkYXNoX2xlbjsKKyAgICAgICAgbV9kYXNoZXNbbV9udW1fZGFzaGVzKytdID0gZ2FwX2xlbjsKKyAgICB9Cit9Cit2b2lkIHZjZ2VuX2Rhc2g6OmRhc2hfc3RhcnQoRlhfRkxPQVQgZHMpCit7CisgICAgbV9kYXNoX3N0YXJ0ID0gZHM7CisgICAgY2FsY19kYXNoX3N0YXJ0KEZYU1lTX2ZhYnMoZHMpKTsKK30KK3ZvaWQgdmNnZW5fZGFzaDo6Y2FsY19kYXNoX3N0YXJ0KEZYX0ZMT0FUIGRzKQoreworICAgIG1fY3Vycl9kYXNoID0gMDsKKyAgICBtX2N1cnJfZGFzaF9zdGFydCA9IDA7CisgICAgd2hpbGUoZHMgPiAwKSB7CisgICAgICAgIGlmKGRzID4gbV9kYXNoZXNbbV9jdXJyX2Rhc2hdKSB7CisgICAgICAgICAgICBkcyAtPSBtX2Rhc2hlc1ttX2N1cnJfZGFzaF07CisgICAgICAgICAgICArK21fY3Vycl9kYXNoOworICAgICAgICAgICAgbV9jdXJyX2Rhc2hfc3RhcnQgPSAwOworICAgICAgICAgICAgaWYobV9jdXJyX2Rhc2ggPj0gbV9udW1fZGFzaGVzKSB7CisgICAgICAgICAgICAgICAgbV9jdXJyX2Rhc2ggPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbV9jdXJyX2Rhc2hfc3RhcnQgPSBkczsKKyAgICAgICAgICAgIGRzID0gMDsKKyAgICAgICAgfQorICAgIH0KK30KK3ZvaWQgdmNnZW5fZGFzaDo6cmVtb3ZlX2FsbCgpCit7CisgICAgbV9zdGF0dXMgPSBpbml0aWFsOworICAgIG1fc3JjX3ZlcnRpY2VzLnJlbW92ZV9hbGwoKTsKKyAgICBtX2Nsb3NlZCA9IDA7Cit9Cit2b2lkIHZjZ2VuX2Rhc2g6OmFkZF92ZXJ0ZXgoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgdW5zaWduZWQgY21kKQoreworICAgIG1fc3RhdHVzID0gaW5pdGlhbDsKKyAgICBpZihpc19tb3ZlX3RvKGNtZCkpIHsKKyAgICAgICAgbV9zcmNfdmVydGljZXMubW9kaWZ5X2xhc3QodmVydGV4X2Rpc3QoeCwgeSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmKGlzX3ZlcnRleChjbWQpKSB7CisgICAgICAgICAgICBtX3NyY192ZXJ0aWNlcy5hZGQodmVydGV4X2Rpc3QoeCwgeSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbV9jbG9zZWQgPSBnZXRfY2xvc2VfZmxhZyhjbWQpOworICAgICAgICB9CisgICAgfQorfQordm9pZCB2Y2dlbl9kYXNoOjpyZXdpbmQodW5zaWduZWQpCit7CisgICAgaWYobV9zdGF0dXMgPT0gaW5pdGlhbCkgeworICAgICAgICBtX3NyY192ZXJ0aWNlcy5jbG9zZShtX2Nsb3NlZCAhPSAwKTsKKyAgICAgICAgc2hvcnRlbl9wYXRoKG1fc3JjX3ZlcnRpY2VzLCBtX3Nob3J0ZW4sIG1fY2xvc2VkKTsKKyAgICB9CisgICAgbV9zdGF0dXMgPSByZWFkeTsKKyAgICBtX3NyY192ZXJ0ZXggPSAwOworfQordW5zaWduZWQgdmNnZW5fZGFzaDo6dmVydGV4KEZYX0ZMT0FUKiB4LCBGWF9GTE9BVCogeSkKK3sKKyAgICB1bnNpZ25lZCBjbWQgPSBwYXRoX2NtZF9tb3ZlX3RvOworICAgIHdoaWxlKCFpc19zdG9wKGNtZCkpIHsKKyAgICAgICAgc3dpdGNoKG1fc3RhdHVzKSB7CisgICAgICAgICAgICBjYXNlIGluaXRpYWw6CisgICAgICAgICAgICAgICAgcmV3aW5kKDApOworICAgICAgICAgICAgY2FzZSByZWFkeToKKyAgICAgICAgICAgICAgICBpZihtX251bV9kYXNoZXMgPCAyIHx8IG1fc3JjX3ZlcnRpY2VzLnNpemUoKSA8IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgY21kID0gcGF0aF9jbWRfc3RvcDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gcG9seWxpbmU7CisgICAgICAgICAgICAgICAgbV9zcmNfdmVydGV4ID0gMTsKKyAgICAgICAgICAgICAgICBtX3YxID0gJm1fc3JjX3ZlcnRpY2VzWzBdOworICAgICAgICAgICAgICAgIG1fdjIgPSAmbV9zcmNfdmVydGljZXNbMV07CisgICAgICAgICAgICAgICAgbV9jdXJyX3Jlc3QgPSBtX3YxLT5kaXN0OworICAgICAgICAgICAgICAgICp4ID0gbV92MS0+eDsKKyAgICAgICAgICAgICAgICAqeSA9IG1fdjEtPnk7CisgICAgICAgICAgICAgICAgaWYobV9kYXNoX3N0YXJ0ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FsY19kYXNoX3N0YXJ0KG1fZGFzaF9zdGFydCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBwYXRoX2NtZF9tb3ZlX3RvOworICAgICAgICAgICAgY2FzZSBwb2x5bGluZTogeworICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkYXNoX3Jlc3QgPSBtX2Rhc2hlc1ttX2N1cnJfZGFzaF0gLSBtX2N1cnJfZGFzaF9zdGFydDsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY21kID0gKG1fY3Vycl9kYXNoICYgMSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoX2NtZF9tb3ZlX3RvIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aF9jbWRfbGluZV90bzsKKyAgICAgICAgICAgICAgICAgICAgaWYobV9jdXJyX3Jlc3QgPiBkYXNoX3Jlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fY3Vycl9yZXN0IC09IGRhc2hfcmVzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrbV9jdXJyX2Rhc2g7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihtX2N1cnJfZGFzaCA+PSBtX251bV9kYXNoZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJfZGFzaCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtX2N1cnJfZGFzaF9zdGFydCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAqeCA9IG1fdjItPnggLSAobV92Mi0+eCAtIG1fdjEtPngpICogbV9jdXJyX3Jlc3QgLyBtX3YxLT5kaXN0OworICAgICAgICAgICAgICAgICAgICAgICAgKnkgPSBtX3YyLT55IC0gKG1fdjItPnkgLSBtX3YxLT55KSAqIG1fY3Vycl9yZXN0IC8gbV92MS0+ZGlzdDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fY3Vycl9kYXNoX3N0YXJ0ICs9IG1fY3Vycl9yZXN0OworICAgICAgICAgICAgICAgICAgICAgICAgKnggPSBtX3YyLT54OworICAgICAgICAgICAgICAgICAgICAgICAgKnkgPSBtX3YyLT55OworICAgICAgICAgICAgICAgICAgICAgICAgKyttX3NyY192ZXJ0ZXg7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3YxID0gbV92MjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fY3Vycl9yZXN0ID0gbV92MS0+ZGlzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1fY2xvc2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobV9zcmNfdmVydGV4ID4gbV9zcmNfdmVydGljZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gc3RvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3YyID0gJm1fc3JjX3ZlcnRpY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fc3JjX3ZlcnRleCA+PSBtX3NyY192ZXJ0aWNlcy5zaXplKCkpID8gMCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zcmNfdmVydGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobV9zcmNfdmVydGV4ID49IG1fc3JjX3ZlcnRpY2VzLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cyA9IHN0b3A7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92MiA9ICZtX3NyY192ZXJ0aWNlc1ttX3NyY192ZXJ0ZXhdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY21kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Ugc3RvcDoKKyAgICAgICAgICAgICAgICBjbWQgPSBwYXRoX2NtZF9zdG9wOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwYXRoX2NtZF9zdG9wOworfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhnZS9hZ2cvYWdnMjMvYWdnX3ZjZ2VuX2Rhc2guaCBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ192Y2dlbl9kYXNoLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Z2UvYWdnL2FnZzIzL2FnZ192Y2dlbl9kYXNoLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2FnZzIzL2FnZ192Y2dlbl9kYXNoLmgKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ192Y2dlbl9zdHJva2UuY3BwIGIvdGhpcmRfcGFydHkvYWdnMjMvYWdnX3ZjZ2VuX3N0cm9rZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY4YmMyNwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ192Y2dlbl9zdHJva2UuY3BwCkBAIC0wLDAgKzEsMjE2IEBACisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gWFlROiAyMDA2LTAxLTIyIENvcGllZCBmcm9tIEFHRyBwcm9qZWN0LgorLy8gVE9ETzogVGhpcyBmaWxlIHVzZXMgaW50ZW5zaXZlIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnMsIHNvIGl0J3MgTk9UIHN1aXRhYmxlCisvLyBmb3IgcGxhdGZvcm1zIGxpa2UgU3ltYmlhbiBPUy4gV2UgbmVlZCB0byBjaGFuZ2UgdG8gRklYIGZvcm1hdC4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBbnRpLUdyYWluIEdlb21ldHJ5IC0gVmVyc2lvbiAyLjMKKy8vIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IE1heGltIFNoZW1hbmFyZXYgKGh0dHA6Ly93d3cuYW50aWdyYWluLmNvbSkKKy8vCisvLyBQZXJtaXNzaW9uIHRvIGNvcHksIHVzZSwgbW9kaWZ5LCBzZWxsIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUKKy8vIGlzIGdyYW50ZWQgcHJvdmlkZWQgdGhpcyBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcy4KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZAorLy8gd2FycmFudHksIGFuZCB3aXRoIG5vIGNsYWltIGFzIHRvIGl0cyBzdWl0YWJpbGl0eSBmb3IgYW55IHB1cnBvc2UuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb250YWN0OiBtY3NlZW1AYW50aWdyYWluLmNvbQorLy8gICAgICAgICAgbWNzZWVtYWdnQHlhaG9vLmNvbQorLy8gICAgICAgICAgaHR0cDovL3d3dy5hbnRpZ3JhaW4uY29tCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTdHJva2UgZ2VuZXJhdG9yCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpbmNsdWRlICJhZ2dfdmNnZW5fc3Ryb2tlLmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCisKK25hbWVzcGFjZSBhZ2cKK3sKKwordmNnZW5fc3Ryb2tlOjp2Y2dlbl9zdHJva2UoKSA6CisgICAgbV9zcmNfdmVydGljZXMoKSwKKyAgICBtX291dF92ZXJ0aWNlcygpLAorICAgIG1fd2lkdGgoMC41ZiksCisgICAgbV9taXRlcl9saW1pdCg0ICogMS4wZiksCisgICAgbV9pbm5lcl9taXRlcl9saW1pdCgxLjBmICsgMS4wZiAvIDEwMCksCisgICAgbV9hcHByb3hfc2NhbGUoMS4wZiksCisgICAgbV9saW5lX2NhcChidXR0X2NhcCksCisgICAgbV9saW5lX2pvaW4obWl0ZXJfam9pbiksCisgICAgbV9pbm5lcl9qb2luKGlubmVyX21pdGVyKSwKKyAgICBtX2Nsb3NlZCgwKSwKKyAgICBtX3N0YXR1cyhpbml0aWFsKSwKKyAgICBtX3NyY192ZXJ0ZXgoMCksCisgICAgbV9vdXRfdmVydGV4KDApCit7Cit9Cit2b2lkIHZjZ2VuX3N0cm9rZTo6cmVtb3ZlX2FsbCgpCit7CisgICAgbV9zcmNfdmVydGljZXMucmVtb3ZlX2FsbCgpOworICAgIG1fY2xvc2VkID0gMDsKKyAgICBtX3N0YXR1cyA9IGluaXRpYWw7Cit9Cit2b2lkIHZjZ2VuX3N0cm9rZTo6YWRkX3ZlcnRleChGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCB1bnNpZ25lZCBjbWQpCit7CisgICAgbV9zdGF0dXMgPSBpbml0aWFsOworICAgIGlmKGlzX21vdmVfdG8oY21kKSkgeworICAgICAgICBtX3NyY192ZXJ0aWNlcy5tb2RpZnlfbGFzdCh2ZXJ0ZXhfZGlzdF9jbWQoeCwgeSwgY21kKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYoaXNfdmVydGV4KGNtZCkpIHsKKyAgICAgICAgICAgIG1fc3JjX3ZlcnRpY2VzLmFkZCh2ZXJ0ZXhfZGlzdF9jbWQoeCwgeSwgY21kKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX2Nsb3NlZCA9IGdldF9jbG9zZV9mbGFnKGNtZCk7CisgICAgICAgIH0KKyAgICB9Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgY2FsY19idXR0X2NhcChGWF9GTE9BVCogY2FwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVydGV4X2Rpc3QmIHYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVydGV4X2Rpc3QmIHYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgd2lkdGgpCit7CisgICAgRlhfRkxPQVQgZHggPSBGWFNZU19NdWxEaXYodjEueSAtIHYwLnksIHdpZHRoLCBsZW4pOworICAgIEZYX0ZMT0FUIGR5ID0gRlhTWVNfTXVsRGl2KHYxLnggLSB2MC54LCB3aWR0aCwgbGVuKTsKKyAgICBjYXBbMF0gPSB2MC54IC0gZHg7CisgICAgY2FwWzFdID0gdjAueSArIGR5OworICAgIGNhcFsyXSA9IHYwLnggKyBkeDsKKyAgICBjYXBbM10gPSB2MC55IC0gZHk7Cit9Cit2b2lkIHZjZ2VuX3N0cm9rZTo6cmV3aW5kKHVuc2lnbmVkKQoreworICAgIGlmKG1fc3RhdHVzID09IGluaXRpYWwpIHsKKyAgICAgICAgbV9zcmNfdmVydGljZXMuY2xvc2UobV9jbG9zZWQgIT0gMCk7CisgICAgICAgIGlmKG1fc3JjX3ZlcnRpY2VzLnNpemUoKSA8IDMpIHsKKyAgICAgICAgICAgIG1fY2xvc2VkID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBtX3N0YXR1cyA9IHJlYWR5OworICAgIG1fc3JjX3ZlcnRleCA9IDA7CisgICAgbV9vdXRfdmVydGV4ID0gMDsKK30KK3Vuc2lnbmVkIHZjZ2VuX3N0cm9rZTo6dmVydGV4KEZYX0ZMT0FUKiB4LCBGWF9GTE9BVCogeSkKK3sKKyAgICB1bnNpZ25lZCBjbWQgPSBwYXRoX2NtZF9saW5lX3RvOworICAgIGxpbmVfam9pbl9lIGN1cmo7CisgICAgd2hpbGUoIWlzX3N0b3AoY21kKSkgeworICAgICAgICBzd2l0Y2gobV9zdGF0dXMpIHsKKyAgICAgICAgICAgIGNhc2UgaW5pdGlhbDoKKyAgICAgICAgICAgICAgICByZXdpbmQoMCk7CisgICAgICAgICAgICBjYXNlIHJlYWR5OgorICAgICAgICAgICAgICAgIGlmKG1fc3JjX3ZlcnRpY2VzLnNpemUoKSA8IDIgKyB1bnNpZ25lZChtX2Nsb3NlZCAhPSAwKSkgeworICAgICAgICAgICAgICAgICAgICBjbWQgPSBwYXRoX2NtZF9zdG9wOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBtX2Nsb3NlZCA/IG91dGxpbmUxIDogY2FwMTsKKyAgICAgICAgICAgICAgICBjbWQgPSBwYXRoX2NtZF9tb3ZlX3RvOworICAgICAgICAgICAgICAgIG1fc3JjX3ZlcnRleCA9IDA7CisgICAgICAgICAgICAgICAgbV9vdXRfdmVydGV4ID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgY2FwMToKKyAgICAgICAgICAgICAgICBzdHJva2VfY2FsY19jYXAobV9vdXRfdmVydGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3JjX3ZlcnRpY2VzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NyY192ZXJ0aWNlc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zcmNfdmVydGljZXNbMF0uZGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9saW5lX2NhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hcHByb3hfc2NhbGUpOworICAgICAgICAgICAgICAgIG1fc3JjX3ZlcnRleCA9IDE7CisgICAgICAgICAgICAgICAgbV9wcmV2X3N0YXR1cyA9IG91dGxpbmUxOworICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gb3V0X3ZlcnRpY2VzOworICAgICAgICAgICAgICAgIG1fb3V0X3ZlcnRleCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGNhcDI6CisgICAgICAgICAgICAgICAgc3Ryb2tlX2NhbGNfY2FwKG1fb3V0X3ZlcnRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NyY192ZXJ0aWNlc1ttX3NyY192ZXJ0aWNlcy5zaXplKCkgLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zcmNfdmVydGljZXNbbV9zcmNfdmVydGljZXMuc2l6ZSgpIC0gMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3JjX3ZlcnRpY2VzW21fc3JjX3ZlcnRpY2VzLnNpemUoKSAtIDJdLmRpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbGluZV9jYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYXBwcm94X3NjYWxlKTsKKyAgICAgICAgICAgICAgICBtX3ByZXZfc3RhdHVzID0gb3V0bGluZTI7CisgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBvdXRfdmVydGljZXM7CisgICAgICAgICAgICAgICAgbV9vdXRfdmVydGV4ID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Ugb3V0bGluZTE6CisgICAgICAgICAgICAgICAgaWYobV9jbG9zZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYobV9zcmNfdmVydGV4ID49IG1fc3JjX3ZlcnRpY2VzLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9wcmV2X3N0YXR1cyA9IGNsb3NlX2ZpcnN0OworICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBlbmRfcG9seTE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmKG1fc3JjX3ZlcnRleCA+PSBtX3NyY192ZXJ0aWNlcy5zaXplKCkgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cyA9IGNhcDI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjdXJqID0gbV9zcmNfdmVydGljZXNbbV9zcmNfdmVydGV4XS5jbWQgJiBwYXRoX2ZsYWdzX2pyID8gbWl0ZXJfam9pbl9yb3VuZCA6IG1fbGluZV9qb2luOworICAgICAgICAgICAgICAgIHN0cm9rZV9jYWxjX2pvaW4obV9vdXRfdmVydGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NyY192ZXJ0aWNlcy5wcmV2KG1fc3JjX3ZlcnRleCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NyY192ZXJ0aWNlcy5jdXJyKG1fc3JjX3ZlcnRleCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NyY192ZXJ0aWNlcy5uZXh0KG1fc3JjX3ZlcnRleCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NyY192ZXJ0aWNlcy5wcmV2KG1fc3JjX3ZlcnRleCkuZGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3JjX3ZlcnRpY2VzLmN1cnIobV9zcmNfdmVydGV4KS5kaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lubmVyX2pvaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX21pdGVyX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbm5lcl9taXRlcl9saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYXBwcm94X3NjYWxlKTsKKyAgICAgICAgICAgICAgICArK21fc3JjX3ZlcnRleDsKKyAgICAgICAgICAgICAgICBtX3ByZXZfc3RhdHVzID0gbV9zdGF0dXM7CisgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBvdXRfdmVydGljZXM7CisgICAgICAgICAgICAgICAgbV9vdXRfdmVydGV4ID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgY2xvc2VfZmlyc3Q6CisgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBvdXRsaW5lMjsKKyAgICAgICAgICAgICAgICBjbWQgPSBwYXRoX2NtZF9tb3ZlX3RvOworICAgICAgICAgICAgY2FzZSBvdXRsaW5lMjoKKyAgICAgICAgICAgICAgICBpZihtX3NyY192ZXJ0ZXggPD0gdW5zaWduZWQobV9jbG9zZWQgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBlbmRfcG9seTI7CisgICAgICAgICAgICAgICAgICAgIG1fcHJldl9zdGF0dXMgPSBzdG9wOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLS1tX3NyY192ZXJ0ZXg7CisgICAgICAgICAgICAgICAgY3VyaiA9IG1fc3JjX3ZlcnRpY2VzW21fc3JjX3ZlcnRleF0uY21kICYgcGF0aF9mbGFnc19qciA/IG1pdGVyX2pvaW5fcm91bmQgOiBtX2xpbmVfam9pbjsKKyAgICAgICAgICAgICAgICBzdHJva2VfY2FsY19qb2luKG1fb3V0X3ZlcnRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zcmNfdmVydGljZXMubmV4dChtX3NyY192ZXJ0ZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zcmNfdmVydGljZXMuY3VycihtX3NyY192ZXJ0ZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zcmNfdmVydGljZXMucHJldihtX3NyY192ZXJ0ZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zcmNfdmVydGljZXMuY3VycihtX3NyY192ZXJ0ZXgpLmRpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NyY192ZXJ0aWNlcy5wcmV2KG1fc3JjX3ZlcnRleCkuZGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbm5lcl9qb2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9taXRlcl9saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5uZXJfbWl0ZXJfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2FwcHJveF9zY2FsZSk7CisgICAgICAgICAgICAgICAgbV9wcmV2X3N0YXR1cyA9IG1fc3RhdHVzOworICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gb3V0X3ZlcnRpY2VzOworICAgICAgICAgICAgICAgIG1fb3V0X3ZlcnRleCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIG91dF92ZXJ0aWNlczoKKyAgICAgICAgICAgICAgICBpZihtX291dF92ZXJ0ZXggPj0gbV9vdXRfdmVydGljZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gbV9wcmV2X3N0YXR1czsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBwb2ludF90eXBlJiBjID0gbV9vdXRfdmVydGljZXNbbV9vdXRfdmVydGV4KytdOworICAgICAgICAgICAgICAgICAgICAqeCA9IGMueDsKKyAgICAgICAgICAgICAgICAgICAgKnkgPSBjLnk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBlbmRfcG9seTE6CisgICAgICAgICAgICAgICAgbV9zdGF0dXMgPSBtX3ByZXZfc3RhdHVzOworICAgICAgICAgICAgICAgIHJldHVybiBwYXRoX2NtZF9lbmRfcG9seSB8IHBhdGhfZmxhZ3NfY2xvc2UgfCBwYXRoX2ZsYWdzX2NjdzsKKyAgICAgICAgICAgIGNhc2UgZW5kX3BvbHkyOgorICAgICAgICAgICAgICAgIG1fc3RhdHVzID0gbV9wcmV2X3N0YXR1czsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGF0aF9jbWRfZW5kX3BvbHkgfCBwYXRoX2ZsYWdzX2Nsb3NlIHwgcGF0aF9mbGFnc19jdzsKKyAgICAgICAgICAgIGNhc2Ugc3RvcDoKKyAgICAgICAgICAgICAgICBjbWQgPSBwYXRoX2NtZF9zdG9wOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjbWQ7Cit9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FnZy9hZ2cyMy9hZ2dfdmNnZW5fc3Ryb2tlLmggYi90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfdmNnZW5fc3Ryb2tlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Z2UvYWdnL2FnZzIzL2FnZ192Y2dlbl9zdHJva2UuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvYWdnMjMvYWdnX3ZjZ2VuX3N0cm9rZS5oCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGdlL2FnZy9hZ2cyMy9hZ2dfdmVydGV4X3NlcXVlbmNlLmggYi90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfdmVydGV4X3NlcXVlbmNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Z2UvYWdnL2FnZzIzL2FnZ192ZXJ0ZXhfc2VxdWVuY2UuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvYWdnMjMvYWdnX3ZlcnRleF9zZXF1ZW5jZS5oCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9iYXNlL25vbnN0ZF91bmlxdWVfcHRyLmggYi90aGlyZF9wYXJ0eS9iYXNlL25vbnN0ZF91bmlxdWVfcHRyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNGJmZmYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYmFzZS9ub25zdGRfdW5pcXVlX3B0ci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIFRoaXMgaXMgYSBjb3B5IG9mIGJyZWFrcGFkJ3Mgc3RhbmRhbG9uZSBzY29wZWRfcHRyLCB3aGljaCBoYXMgYmVlbgotLy8gcmVuYW1lZCB0byBub25zdGQ6OnVuaXF1ZV9wdHIsIGFuZCBmcm9tIHdoaWNoIG1vcmUgY29tcGxpY2F0ZWQgY2xhc3NlcwotLy8gaGF2ZSBiZWVuIHJlbW92ZWQuIFRoZSByZXNldCgpIG1ldGhvZCBoYXMgYWxzbyBiZWVuIHR3ZWFrZWQgdG8gbW9yZQotLy8gY2xvc2VseSBtYXRjaCBjKysxMSwgYW5kIGFuIGltcGxpY2l0IGNvbnZlcnNpb24gdG8gYm9vbCBoYXMgYmVlbiBhZGRlZC4KLQotLy8gU2NvcGVycyBoZWxwIHlvdSBtYW5hZ2Ugb3duZXJzaGlwIG9mIGEgcG9pbnRlciwgaGVscGluZyB5b3UgZWFzaWx5IG1hbmFnZSB0aGUKLS8vIGEgcG9pbnRlciB3aXRoaW4gYSBzY29wZSwgYW5kIGF1dG9tYXRpY2FsbHkgZGVzdHJveWluZyB0aGUgcG9pbnRlciBhdCB0aGUKLS8vIGVuZCBvZiBhIHNjb3BlLgotLy8KLS8vIEEgdW5pcXVlX3B0cjxUPiBpcyBsaWtlIGEgVCosIGV4Y2VwdCB0aGF0IHRoZSBkZXN0cnVjdG9yIG9mIHVuaXF1ZV9wdHI8VD4KLS8vIGF1dG9tYXRpY2FsbHkgZGVsZXRlcyB0aGUgcG9pbnRlciBpdCBob2xkcyAoaWYgYW55KS4KLS8vIFRoYXQgaXMsIHVuaXF1ZV9wdHI8VD4gb3ducyB0aGUgVCBvYmplY3QgdGhhdCBpdCBwb2ludHMgdG8uCi0vLyBMaWtlIGEgVCosIGEgdW5pcXVlX3B0cjxUPiBtYXkgaG9sZCBlaXRoZXIgTlVMTCBvciBhIHBvaW50ZXIgdG8gYSBUIG9iamVjdC4KLS8vIEFsc28gbGlrZSBUKiwgdW5pcXVlX3B0cjxUPiBpcyB0aHJlYWQtY29tcGF0aWJsZSwgYW5kIG9uY2UgeW91Ci0vLyBkZXJlZmVyZW5jZSBpdCwgeW91IGdldCB0aGUgdGhyZWFkIHNhZmV0eSBndWFyYW50ZWVzIG9mIFQuCi0vLwotLy8gRXhhbXBsZSB1c2FnZSAodW5pcXVlX3B0cik6Ci0vLyAgIHsKLS8vICAgICB1bmlxdWVfcHRyPEZvbz4gZm9vKG5ldyBGb28oIndlZSIpKTsKLS8vICAgfSAgLy8gZm9vIGdvZXMgb3V0IG9mIHNjb3BlLCByZWxlYXNpbmcgdGhlIHBvaW50ZXIgd2l0aCBpdC4KLS8vCi0vLyAgIHsKLS8vICAgICB1bmlxdWVfcHRyPEZvbz4gZm9vOyAgICAgICAgICAvLyBObyBwb2ludGVyIG1hbmFnZWQuCi0vLyAgICAgZm9vLnJlc2V0KG5ldyBGb28oIndlZSIpKTsgICAgLy8gTm93IGEgcG9pbnRlciBpcyBtYW5hZ2VkLgotLy8gICAgIGZvby5yZXNldChuZXcgRm9vKCJ3ZWUyIikpOyAgIC8vIEZvbygid2VlIikgd2FzIGRlc3Ryb3llZC4KLS8vICAgICBmb28ucmVzZXQobmV3IEZvbygid2VlMyIpKTsgICAvLyBGb28oIndlZTIiKSB3YXMgZGVzdHJveWVkLgotLy8gICAgIGZvby0+TWV0aG9kKCk7ICAgICAgICAgICAgICAgIC8vIEZvbzo6TWV0aG9kKCkgY2FsbGVkLgotLy8gICAgIGZvby5nZXQoKS0+TWV0aG9kKCk7ICAgICAgICAgIC8vIEZvbzo6TWV0aG9kKCkgY2FsbGVkLgotLy8gICAgIFNvbWVGdW5jKGZvby5yZWxlYXNlKCkpOyAgICAgIC8vIFNvbWVGdW5jIHRha2VzIG93bmVyc2hpcCwgZm9vIG5vIGxvbmdlcgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hbmFnZXMgYSBwb2ludGVyLgotLy8gICAgIGZvby5yZXNldChuZXcgRm9vKCJ3ZWU0IikpOyAgIC8vIGZvbyBtYW5hZ2VzIGEgcG9pbnRlciBhZ2Fpbi4KLS8vICAgICBmb28ucmVzZXQoKTsgICAgICAgICAgICAgICAgICAvLyBGb28oIndlZTQiKSBkZXN0cm95ZWQsIGZvbyBubyBsb25nZXIKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYW5hZ2VzIGEgcG9pbnRlci4KLS8vICAgfSAgLy8gZm9vIHdhc24ndCBtYW5hZ2luZyBhIHBvaW50ZXIsIHNvIG5vdGhpbmcgd2FzIGRlc3Ryb3llZC4KLS8vCi0vLyBUaGUgc2l6ZSBvZiBhIHVuaXF1ZV9wdHIgaXMgc21hbGw6IHNpemVvZih1bmlxdWVfcHRyPEM+KSA9PSBzaXplb2YoQyopCi0KLSNpZm5kZWYgTk9OU1REX1VOSVFVRV9QVFJfSF8KLSNkZWZpbmUgTk9OU1REX1VOSVFVRV9QVFJfSF8KLQotLy8gVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXNpZ25lZCB0byBtYXRjaCB0aGUgYW50aWNpcGF0ZWQgZnV0dXJlIFRSMgotLy8gaW1wbGVtZW50YXRpb24gb2YgdGhlIHVuaXF1ZV9wdHIgY2xhc3MuCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotbmFtZXNwYWNlIG5vbnN0ZCB7Ci0KLS8vIENvbW1vbiBpbXBsZW1lbnRhdGlvbiBmb3IgYm90aCBwb2ludGVycyB0byBlbGVtZW50cyBhbmQgcG9pbnRlcnMgdG8KLS8vIGFycmF5cy4gVGhlc2UgYXJlIGRpZmZlcmVudGlhdGVkIGJlbG93IGJhc2VkIG9uIHRoZSBuZWVkIHRvIGludm9rZQotLy8gZGVsZXRlIHZzLiBkZWxldGVbXSBhcyBhcHByb3ByaWF0ZS4KLXRlbXBsYXRlIDxjbGFzcyBDPgotY2xhc3MgdW5pcXVlX3B0cl9iYXNlIHsKLSBwdWJsaWM6Ci0KLSAgLy8gVGhlIGVsZW1lbnQgdHlwZQotICB0eXBlZGVmIEMgZWxlbWVudF90eXBlOwotCi0gIGV4cGxpY2l0IHVuaXF1ZV9wdHJfYmFzZShDKiBwKSA6IHB0cl8ocCkgeyB9Ci0KLSAgLy8gQWNjZXNzb3JzIHRvIGdldCB0aGUgb3duZWQgb2JqZWN0LgotICAvLyBvcGVyYXRvciogYW5kIG9wZXJhdG9yLT4gd2lsbCBhc3NlcnQoKSBpZiB0aGVyZSBpcyBubyBjdXJyZW50IG9iamVjdC4KLSAgQyYgb3BlcmF0b3IqKCkgY29uc3QgewotICAgIGFzc2VydChwdHJfICE9IE5VTEwpOwotICAgIHJldHVybiAqcHRyXzsKLSAgfQotICBDKiBvcGVyYXRvci0+KCkgY29uc3QgIHsKLSAgICBhc3NlcnQocHRyXyAhPSBOVUxMKTsKLSAgICByZXR1cm4gcHRyXzsKLSAgfQotICBDKiBnZXQoKSBjb25zdCB7IHJldHVybiBwdHJfOyB9Ci0KLSAgLy8gQ29tcGFyaXNvbiBvcGVyYXRvcnMuCi0gIC8vIFRoZXNlIHJldHVybiB3aGV0aGVyIHR3byB1bmlxdWVfcHRyIHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdCwgbm90IGp1c3QgdG8KLSAgLy8gdHdvIGRpZmZlcmVudCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgYm9vbCBvcGVyYXRvcj09KEMqIHApIGNvbnN0IHsgcmV0dXJuIHB0cl8gPT0gcDsgfQotICBib29sIG9wZXJhdG9yIT0oQyogcCkgY29uc3QgeyByZXR1cm4gcHRyXyAhPSBwOyB9Ci0KLSAgLy8gU3dhcCB0d28gc2NvcGVkIHBvaW50ZXJzLgotICB2b2lkIHN3YXAodW5pcXVlX3B0cl9iYXNlJiBwMikgewotICAgIEMqIHRtcCA9IHB0cl87Ci0gICAgcHRyXyA9IHAyLnB0cl87Ci0gICAgcDIucHRyXyA9IHRtcDsKLSAgfQotCi0gIC8vIFJlbGVhc2UgYSBwb2ludGVyLgotICAvLyBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBjdXJyZW50IHBvaW50ZXIgaGVsZCBieSB0aGlzIG9iamVjdC4KLSAgLy8gSWYgdGhpcyBvYmplY3QgaG9sZHMgYSBOVUxMIHBvaW50ZXIsIHRoZSByZXR1cm4gdmFsdWUgaXMgTlVMTC4KLSAgLy8gQWZ0ZXIgdGhpcyBvcGVyYXRpb24sIHRoaXMgb2JqZWN0IHdpbGwgaG9sZCBhIE5VTEwgcG9pbnRlciwKLSAgLy8gYW5kIHdpbGwgbm90IG93biB0aGUgb2JqZWN0IGFueSBtb3JlLgotICBDKiByZWxlYXNlKCkgewotICAgIEMqIHJldFZhbCA9IHB0cl87Ci0gICAgcHRyXyA9IE5VTEw7Ci0gICAgcmV0dXJuIHJldFZhbDsKLSAgfQotCi0gIC8vIEFsbG93IHByb21vdGlvbiB0byBib29sIGZvciBjb25kaXRpb25hbCBzdGF0ZW1lbnRzLgotICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gcHRyXyAhPSBOVUxMOyB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIEMqIHB0cl87Ci19OwotCi0vLyBJbXBsZW1lbnRhdGlvbiBmb3Igb3JkaW5hcnkgcG9pbnRlcnMgdXNpbmcgZGVsZXRlLgotdGVtcGxhdGUgPGNsYXNzIEM+Ci1jbGFzcyB1bmlxdWVfcHRyIDogcHVibGljIHVuaXF1ZV9wdHJfYmFzZTxDPiB7Ci0gcHVibGljOgotICB1c2luZyB1bmlxdWVfcHRyX2Jhc2U8Qz46OnB0cl87Ci0KLSAgLy8gQ29uc3RydWN0b3IuIERlZmF1bHRzIHRvIGluaXRpYWxpemluZyB3aXRoIE5VTEwuIFRoZXJlIGlzIG5vIHdheQotICAvLyB0byBjcmVhdGUgYW4gdW5pbml0aWFsaXplZCB1bmlxdWVfcHRyLiBUaGUgaW5wdXQgcGFyYW1ldGVyIG11c3QgYmUKLSAgLy8gYWxsb2NhdGVkIHdpdGggbmV3IChub3QgbmV3W10gLSBzZWUgYmVsb3cpLgotICBleHBsaWNpdCB1bmlxdWVfcHRyKEMqIHAgPSBOVUxMKSA6IHVuaXF1ZV9wdHJfYmFzZTxDPihwKSB7IH0KLQotICAvLyBEZXN0cnVjdG9yLiAgSWYgdGhlcmUgaXMgYSBDIG9iamVjdCwgZGVsZXRlIGl0LgotICAvLyBXZSBkb24ndCBuZWVkIHRvIHRlc3QgcHRyXyA9PSBOVUxMIGJlY2F1c2UgQysrIGRvZXMgdGhhdCBmb3IgdXMuCi0gIH51bmlxdWVfcHRyKCkgewotICAgIGVudW0geyB0eXBlX211c3RfYmVfY29tcGxldGUgPSBzaXplb2YoQykgfTsKLSAgICBkZWxldGUgcHRyXzsKLSAgfQotCi0gIC8vIFJlc2V0LiAgRGVsZXRlcyB0aGUgY3VycmVudCBvd25lZCBvYmplY3QsIGlmIGFueS4KLSAgLy8gVGhlbiB0YWtlcyBvd25lcnNoaXAgb2YgYSBuZXcgb2JqZWN0LCBpZiBnaXZlbi4KLSAgLy8gdGhpcy0+cmVzZXQodGhpcy0+Z2V0KCkpIHdvcmtzLgotICB2b2lkIHJlc2V0KEMqIHAgPSBOVUxMKSB7Ci0gICAgaWYgKHAgIT0gcHRyXykgewotICAgICAgZW51bSB7IHR5cGVfbXVzdF9iZV9jb21wbGV0ZSA9IHNpemVvZihDKSB9OwotICAgICAgQyogb2xkX3B0ciA9IHB0cl87Ci0gICAgICBwdHJfID0gcDsKLSAgICAgIGRlbGV0ZSBvbGRfcHRyOwotICAgIH0KLSAgfQotCi1wcml2YXRlOgotICAvLyBGb3JiaWQgY29tcGFyaXNvbiBvZiB1bmlxdWVfcHRyIHR5cGVzLiAgSWYgQzIgIT0gQywgaXQgdG90YWxseSBkb2Vzbid0Ci0gIC8vIG1ha2Ugc2Vuc2UsIGFuZCBpZiBDMiA9PSBDLCBpdCBzdGlsbCBkb2Vzbid0IG1ha2Ugc2Vuc2UgYmVjYXVzZSB5b3Ugc2hvdWxkCi0gIC8vIG5ldmVyIGhhdmUgdGhlIHNhbWUgb2JqZWN0IG93bmVkIGJ5IHR3byBkaWZmZXJlbnQgdW5pcXVlX3B0cnMuCi0gIHRlbXBsYXRlIDxjbGFzcyBDMj4gYm9vbCBvcGVyYXRvcj09KHVuaXF1ZV9wdHI8QzI+IGNvbnN0JiBwMikgY29uc3Q7Ci0gIHRlbXBsYXRlIDxjbGFzcyBDMj4gYm9vbCBvcGVyYXRvciE9KHVuaXF1ZV9wdHI8QzI+IGNvbnN0JiBwMikgY29uc3Q7Ci0KLSAgLy8gRGlzYWxsb3cgZXZpbCBjb25zdHJ1Y3RvcnMKLSAgdW5pcXVlX3B0cihjb25zdCB1bmlxdWVfcHRyJik7Ci0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHVuaXF1ZV9wdHImKTsKLX07Ci0KLS8vIFNwZWNpYWxpemF0aW9uIGZvciBhcnJheXMgdXNpbmcgZGVsZXRlW10uCi10ZW1wbGF0ZSA8Y2xhc3MgQz4KLWNsYXNzIHVuaXF1ZV9wdHI8Q1tdPiA6IHB1YmxpYyB1bmlxdWVfcHRyX2Jhc2U8Qz4gewotIHB1YmxpYzoKLSAgdXNpbmcgdW5pcXVlX3B0cl9iYXNlPEM+OjpwdHJfOwotCi0gIC8vIENvbnN0cnVjdG9yLiBEZWZhdWx0cyB0byBpbml0aWFsaXppbmcgd2l0aCBOVUxMLiBUaGVyZSBpcyBubyB3YXkKLSAgLy8gdG8gY3JlYXRlIGFuIHVuaW5pdGlhbGl6ZWQgdW5pcXVlX3B0ci4gVGhlIGlucHV0IHBhcmFtZXRlciBtdXN0IGJlCi0gIC8vIGFsbG9jYXRlZCB3aXRoIG5ld1tdIChub3QgbmV3IC0gc2VlIGFib3ZlKS4KLSAgZXhwbGljaXQgdW5pcXVlX3B0cihDKiBwID0gTlVMTCkgOiB1bmlxdWVfcHRyX2Jhc2U8Qz4ocCkgeyB9Ci0KLSAgLy8gRGVzdHJ1Y3Rvci4gIElmIHRoZXJlIGlzIGEgQyBvYmplY3QsIGRlbGV0ZSBpdC4KLSAgLy8gV2UgZG9uJ3QgbmVlZCB0byB0ZXN0IHB0cl8gPT0gTlVMTCBiZWNhdXNlIEMrKyBkb2VzIHRoYXQgZm9yIHVzLgotICB+dW5pcXVlX3B0cigpIHsKLSAgICBlbnVtIHsgdHlwZV9tdXN0X2JlX2NvbXBsZXRlID0gc2l6ZW9mKEMpIH07Ci0gICAgZGVsZXRlW10gcHRyXzsKLSAgfQotCi0gIC8vIFJlc2V0LiAgRGVsZXRlcyB0aGUgY3VycmVudCBvd25lZCBvYmplY3QsIGlmIGFueS4KLSAgLy8gVGhlbiB0YWtlcyBvd25lcnNoaXAgb2YgYSBuZXcgb2JqZWN0LCBpZiBnaXZlbi4KLSAgLy8gdGhpcy0+cmVzZXQodGhpcy0+Z2V0KCkpIHdvcmtzLgotICB2b2lkIHJlc2V0KEMqIHAgPSBOVUxMKSB7Ci0gICAgaWYgKHAgIT0gcHRyXykgewotICAgICAgZW51bSB7IHR5cGVfbXVzdF9iZV9jb21wbGV0ZSA9IHNpemVvZihDKSB9OwotICAgICAgQyogb2xkX3B0ciA9IHB0cl87Ci0gICAgICBwdHJfID0gcDsKLSAgICAgIGRlbGV0ZVtdIG9sZF9wdHI7Ci0gICAgfQotICB9Ci0KLSAgLy8gU3VwcG9ydCBpbmRleGluZyBzaW5jZSBpdCBpcyBob2xkaW5nIGFycmF5LgotICBDJiBvcGVyYXRvcltdIChzaXplX3QgaSkgeyByZXR1cm4gcHRyX1tpXTsgfQotCi1wcml2YXRlOgotICAvLyBGb3JiaWQgY29tcGFyaXNvbiBvZiB1bmlxdWVfcHRyIHR5cGVzLiAgSWYgQzIgIT0gQywgaXQgdG90YWxseSBkb2Vzbid0Ci0gIC8vIG1ha2Ugc2Vuc2UsIGFuZCBpZiBDMiA9PSBDLCBpdCBzdGlsbCBkb2Vzbid0IG1ha2Ugc2Vuc2UgYmVjYXVzZSB5b3Ugc2hvdWxkCi0gIC8vIG5ldmVyIGhhdmUgdGhlIHNhbWUgb2JqZWN0IG93bmVkIGJ5IHR3byBkaWZmZXJlbnQgdW5pcXVlX3B0cnMuCi0gIHRlbXBsYXRlIDxjbGFzcyBDMj4gYm9vbCBvcGVyYXRvcj09KHVuaXF1ZV9wdHI8QzI+IGNvbnN0JiBwMikgY29uc3Q7Ci0gIHRlbXBsYXRlIDxjbGFzcyBDMj4gYm9vbCBvcGVyYXRvciE9KHVuaXF1ZV9wdHI8QzI+IGNvbnN0JiBwMikgY29uc3Q7Ci0KLSAgLy8gRGlzYWxsb3cgZXZpbCBjb25zdHJ1Y3RvcnMKLSAgdW5pcXVlX3B0cihjb25zdCB1bmlxdWVfcHRyJik7Ci0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHVuaXF1ZV9wdHImKTsKLX07Ci0KLS8vIEZyZWUgZnVuY3Rpb25zCi10ZW1wbGF0ZSA8Y2xhc3MgQz4KLXZvaWQgc3dhcCh1bmlxdWVfcHRyPEM+JiBwMSwgdW5pcXVlX3B0cjxDPiYgcDIpIHsKLSAgcDEuc3dhcChwMik7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBDPgotYm9vbCBvcGVyYXRvcj09KEMqIHAxLCBjb25zdCB1bmlxdWVfcHRyPEM+JiBwMikgewotICByZXR1cm4gcDEgPT0gcDIuZ2V0KCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBDPgotYm9vbCBvcGVyYXRvciE9KEMqIHAxLCBjb25zdCB1bmlxdWVfcHRyPEM+JiBwMikgewotICByZXR1cm4gcDEgIT0gcDIuZ2V0KCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBub25zdGQKLQotI2VuZGlmICAvLyBOT05TVERfVU5JUVVFX1BUUl9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmFzZS9udW1lcmljcy9zYWZlX2NvbnZlcnNpb25zLmggYi90aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfY29udmVyc2lvbnMuaAppbmRleCBlOTU2MDhlLi5kZDBkMWU0IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfY29udmVyc2lvbnMuaAorKysgYi90aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfY29udmVyc2lvbnMuaApAQCAtNyw4ICs3LDggQEAKIAogI2luY2x1ZGUgPGxpbWl0cz4KIAotI2luY2x1ZGUgIi4uL2xvZ2dpbmcuaCIKICNpbmNsdWRlICJzYWZlX2NvbnZlcnNpb25zX2ltcGwuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2xvZ2dpbmcuaCIKIAogbmFtZXNwYWNlIHBkZml1bSB7CiBuYW1lc3BhY2UgYmFzZSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfY29udmVyc2lvbnNfaW1wbC5oIGIvdGhpcmRfcGFydHkvYmFzZS9udW1lcmljcy9zYWZlX2NvbnZlcnNpb25zX2ltcGwuaAppbmRleCA3Yzg4ZGRhLi5lMWM0YzNiIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfY29udmVyc2lvbnNfaW1wbC5oCisrKyBiL3RoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9jb252ZXJzaW9uc19pbXBsLmgKQEAgLTUsMTAgKzUsMTAgQEAKICNpZm5kZWYgUERGSVVNX1RISVJEX1BBUlRZX0JBU0VfU0FGRV9DT05WRVJTSU9OU19JTVBMX0hfCiAjZGVmaW5lIFBERklVTV9USElSRF9QQVJUWV9CQVNFX1NBRkVfQ09OVkVSU0lPTlNfSU1QTF9IXwogCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bGltaXRzPgogCi0jaW5jbHVkZSAiLi4vbWFjcm9zLmgiCi0jaW5jbHVkZSAiLi4vdGVtcGxhdGVfdXRpbC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbWFjcm9zLmgiCiAKIG5hbWVzcGFjZSBwZGZpdW0gewogbmFtZXNwYWNlIGJhc2UgewpAQCAtMjE2LDQgKzIxNiwzIEBACiB9ICAvLyBuYW1lc3BhY2UgcGRmaXVtCiAKICNlbmRpZiAgLy8gUERGSVVNX1RISVJEX1BBUlRZX0JBU0VfU0FGRV9DT05WRVJTSU9OU19JTVBMX0hfCi0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9tYXRoLmggYi90aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfbWF0aC5oCmluZGV4IDk1NDBlODMuLjAxM2FmMWUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9tYXRoLmgKKysrIGIvdGhpcmRfcGFydHkvYmFzZS9udW1lcmljcy9zYWZlX21hdGguaApAQCAtMTY2LDE1ICsxNjYsMTUgQEAKICAgdGVtcGxhdGUgPHR5cGVuYW1lIFNyYz4KICAgc3RhdGljIENoZWNrZWROdW1lcmljPFQ+IGNhc3QoCiAgICAgICBTcmMgdSwKLSAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxzdGQ6Om51bWVyaWNfbGltaXRzPFNyYz46OmlzX3NwZWNpYWxpemVkLCBpbnQ+Ojp0eXBlID0KLSAgICAgICAgICAwKSB7CisgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6Om51bWVyaWNfbGltaXRzPFNyYz46OmlzX3NwZWNpYWxpemVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50Pjo6dHlwZSA9IDApIHsKICAgICByZXR1cm4gdTsKICAgfQogCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTcmM+CiAgIHN0YXRpYyBDaGVja2VkTnVtZXJpYzxUPiBjYXN0KAogICAgICAgY29uc3QgQ2hlY2tlZE51bWVyaWM8U3JjPiYgdSwKLSAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjwhaXNfc2FtZTxTcmMsIFQ+Ojp2YWx1ZSwgaW50Pjo6dHlwZSA9IDApIHsKKyAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX3NhbWU8U3JjLCBUPjo6dmFsdWUsIGludD46OnR5cGUgPSAwKSB7CiAgICAgcmV0dXJuIHU7CiAgIH0KIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmFzZS9udW1lcmljcy9zYWZlX21hdGhfaW1wbC5oIGIvdGhpcmRfcGFydHkvYmFzZS9udW1lcmljcy9zYWZlX21hdGhfaW1wbC5oCmluZGV4IDE0ODk3MjAuLmYyMTljZjUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9tYXRoX2ltcGwuaAorKysgYi90aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfbWF0aF9pbXBsLmgKQEAgLTEwLDEwICsxMCwxMCBAQAogI2luY2x1ZGUgPGNtYXRoPgogI2luY2x1ZGUgPGNzdGRsaWI+CiAjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgogCi0jaW5jbHVkZSAiLi4vbWFjcm9zLmgiCi0jaW5jbHVkZSAiLi4vdGVtcGxhdGVfdXRpbC5oIgogI2luY2x1ZGUgInNhZmVfY29udmVyc2lvbnMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL21hY3Jvcy5oIgogCiBuYW1lc3BhY2UgcGRmaXVtIHsKIG5hbWVzcGFjZSBiYXNlIHsKQEAgLTY1LDIxICs2NSwyMSBAQAogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW50ZWdlcj4KIHN0cnVjdCBVbnNpZ25lZEludGVnZXJGb3JTaXplIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBlbmFibGVfaWY8CisgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CiAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPEludGVnZXI+Ojppc19pbnRlZ2VyLAogICAgICAgdHlwZW5hbWUgSW50ZWdlckZvclNpemVBbmRTaWduPHNpemVvZihJbnRlZ2VyKSwgZmFsc2U+Ojp0eXBlPjo6dHlwZSB0eXBlOwogfTsKIAogdGVtcGxhdGUgPHR5cGVuYW1lIEludGVnZXI+CiBzdHJ1Y3QgU2lnbmVkSW50ZWdlckZvclNpemUgewotICB0eXBlZGVmIHR5cGVuYW1lIGVuYWJsZV9pZjwKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8SW50ZWdlcj46OmlzX2ludGVnZXIsCiAgICAgICB0eXBlbmFtZSBJbnRlZ2VyRm9yU2l6ZUFuZFNpZ248c2l6ZW9mKEludGVnZXIpLCB0cnVlPjo6dHlwZT46OnR5cGUgdHlwZTsKIH07CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBJbnRlZ2VyPgogc3RydWN0IFR3aWNlV2lkZXJJbnRlZ2VyIHsKLSAgdHlwZWRlZiB0eXBlbmFtZSBlbmFibGVfaWY8CisgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CiAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPEludGVnZXI+Ojppc19pbnRlZ2VyLAogICAgICAgdHlwZW5hbWUgSW50ZWdlckZvclNpemVBbmRTaWduPAogICAgICAgICAgIHNpemVvZihJbnRlZ2VyKSAqIDIsCkBAIC04OCw4ICs4OCw5IEBACiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBJbnRlZ2VyPgogc3RydWN0IFBvc2l0aW9uT2ZTaWduQml0IHsKLSAgc3RhdGljIGNvbnN0IHR5cGVuYW1lIGVuYWJsZV9pZjxzdGQ6Om51bWVyaWNfbGltaXRzPEludGVnZXI+Ojppc19pbnRlZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdD46OnR5cGUgdmFsdWUgPSA4ICogc2l6ZW9mKEludGVnZXIpIC0gMTsKKyAgc3RhdGljIGNvbnN0IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6bnVtZXJpY19saW1pdHM8SW50ZWdlcj46OmlzX2ludGVnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Q+Ojp0eXBlIHZhbHVlID0KKyAgICAgIDggKiBzaXplb2YoSW50ZWdlcikgLSAxOwogfTsKIAogLy8gSGVscGVyIHRlbXBsYXRlcyBmb3IgaW50ZWdlciBtYW5pcHVsYXRpb25zLgpAQCAtMTEyLDcgKzExMyw3IEBACiAvLyB3YXkgdG8gY29hbGVzY2UgdGhpbmdzIGludG8gdGhlIENoZWNrZWROdW1lcmljU3RhdGUgc3BlY2lhbGl6YXRpb25zIGJlbG93LgogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXR5cGVuYW1lIGVuYWJsZV9pZjxzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19pbnRlZ2VyLCBUPjo6dHlwZQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfaW50ZWdlciwgVD46OnR5cGUKIENoZWNrZWRBZGQoVCB4LCBUIHksIFJhbmdlQ29uc3RyYWludCogdmFsaWRpdHkpIHsKICAgLy8gU2luY2UgdGhlIHZhbHVlIG9mIHgreSBpcyB1bmRlZmluZWQgaWYgd2UgaGF2ZSBhIHNpZ25lZCB0eXBlLCB3ZSBjb21wdXRlCiAgIC8vIGl0IHVzaW5nIHRoZSB1bnNpZ25lZCB0eXBlIG9mIHRoZSBzYW1lIHNpemUuCkBAIC0xMzUsNyArMTM2LDcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci10eXBlbmFtZSBlbmFibGVfaWY8c3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfaW50ZWdlciwgVD46OnR5cGUKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX2ludGVnZXIsIFQ+Ojp0eXBlCiBDaGVja2VkU3ViKFQgeCwgVCB5LCBSYW5nZUNvbnN0cmFpbnQqIHZhbGlkaXR5KSB7CiAgIC8vIFNpbmNlIHRoZSB2YWx1ZSBvZiB4K3kgaXMgdW5kZWZpbmVkIGlmIHdlIGhhdmUgYSBzaWduZWQgdHlwZSwgd2UgY29tcHV0ZQogICAvLyBpdCB1c2luZyB0aGUgdW5zaWduZWQgdHlwZSBvZiB0aGUgc2FtZSBzaXplLgpAQCAtMTYyLDkgKzE2Myw5IEBACiAvLyBzbG93IGNhc2Ugd2UgbmVlZCB0byBtYW51YWxseSBjaGVjayB0aGF0IHRoZSByZXN1bHQgd29uJ3QgYmUgdHJ1bmNhdGVkIGJ5CiAvLyBjaGVja2luZyB3aXRoIGRpdmlzaW9uIGFnYWluc3QgdGhlIGFwcHJvcHJpYXRlIGJvdW5kLgogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci10eXBlbmFtZSBlbmFibGVfaWY8Ci0gICAgc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfaW50ZWdlciAmJiBzaXplb2YoVCkgKiAyIDw9IHNpemVvZih1aW50bWF4X3QpLAotICAgIFQ+Ojp0eXBlCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19pbnRlZ2VyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFQpICogMiA8PSBzaXplb2YodWludG1heF90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFQ+Ojp0eXBlCiBDaGVja2VkTXVsKFQgeCwgVCB5LCBSYW5nZUNvbnN0cmFpbnQqIHZhbGlkaXR5KSB7CiAgIHR5cGVkZWYgdHlwZW5hbWUgVHdpY2VXaWRlckludGVnZXI8VD46OnR5cGUgSW50ZXJtZWRpYXRlVHlwZTsKICAgSW50ZXJtZWRpYXRlVHlwZSB0bXAgPQpAQCAtMTc0LDkgKzE3NSwxMCBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXR5cGVuYW1lIGVuYWJsZV9pZjxzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19pbnRlZ2VyJiYgc3RkOjpudW1lcmljX2xpbWl0czwKLSAgICAgICAgICAgICAgICAgICAgICAgVD46OmlzX3NpZ25lZCYmKHNpemVvZihUKSAqIDIgPiBzaXplb2YodWludG1heF90KSksCi0gICAgICAgICAgICAgICAgICAgVD46OnR5cGUKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX2ludGVnZXIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19zaWduZWQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKFQpICogMiA+IHNpemVvZih1aW50bWF4X3QpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFQ+Ojp0eXBlCiBDaGVja2VkTXVsKFQgeCwgVCB5LCBSYW5nZUNvbnN0cmFpbnQqIHZhbGlkaXR5KSB7CiAgIC8vIElmIGVpdGhlciBzaWRlIGlzIHplcm8gdGhlbiB0aGUgcmVzdWx0IHdpbGwgYmUgemVyby4KICAgaWYgKCF4IHx8ICF5KSB7CkBAIC0yMDMsMTAgKzIwNSwxMCBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXR5cGVuYW1lIGVuYWJsZV9pZjxzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19pbnRlZ2VyICYmCi0gICAgICAgICAgICAgICAgICAgICAgICFzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19zaWduZWQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZihUKSAqIDIgPiBzaXplb2YodWludG1heF90KSksCi0gICAgICAgICAgICAgICAgICAgVD46OnR5cGUKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX2ludGVnZXIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfc2lnbmVkICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZihUKSAqIDIgPiBzaXplb2YodWludG1heF90KSksCisgICAgICAgICAgICAgICAgICAgICAgICBUPjo6dHlwZQogQ2hlY2tlZE11bChUIHgsIFQgeSwgUmFuZ2VDb25zdHJhaW50KiB2YWxpZGl0eSkgewogICAqdmFsaWRpdHkgPSAoeSA9PSAwIHx8IHggPD0gc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCkgLyB5KQogICAgICAgICAgICAgICAgICAgPyBSQU5HRV9WQUxJRApAQCAtMjE2LDExICsyMTgsMTEgQEAKIAogLy8gRGl2aXNpb24ganVzdCByZXF1aXJlcyBhIGNoZWNrIGZvciBhbiBpbnZhbGlkIG5lZ2F0aW9uIG9uIHNpZ25lZCBtaW4vLTEuCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLVQgQ2hlY2tlZERpdigKLSAgICBUIHgsCi0gICAgVCB5LAotICAgIFJhbmdlQ29uc3RyYWludCogdmFsaWRpdHksCi0gICAgdHlwZW5hbWUgZW5hYmxlX2lmPHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX2ludGVnZXIsIGludD46OnR5cGUgPSAwKSB7CitUIENoZWNrZWREaXYoVCB4LAorICAgICAgICAgICAgIFQgeSwKKyAgICAgICAgICAgICBSYW5nZUNvbnN0cmFpbnQqIHZhbGlkaXR5LAorICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX2ludGVnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50Pjo6dHlwZSA9IDApIHsKICAgaWYgKHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NpZ25lZCAmJiB4ID09IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1pbigpICYmCiAgICAgICB5ID09IHN0YXRpY19jYXN0PFQ+KC0xKSkgewogICAgICp2YWxpZGl0eSA9IFJBTkdFX09WRVJGTE9XOwpAQCAtMjMyLDI3ICsyMzQsMjcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci10eXBlbmFtZSBlbmFibGVfaWY8Ci0gICAgc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfaW50ZWdlciYmIHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NpZ25lZCwKLSAgICBUPjo6dHlwZQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfaW50ZWdlciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFQ+Ojp0eXBlCiBDaGVja2VkTW9kKFQgeCwgVCB5LCBSYW5nZUNvbnN0cmFpbnQqIHZhbGlkaXR5KSB7CiAgICp2YWxpZGl0eSA9IHkgPiAwID8gUkFOR0VfVkFMSUQgOiBSQU5HRV9JTlZBTElEOwogICByZXR1cm4geCAlIHk7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdHlwZW5hbWUgZW5hYmxlX2lmPAotICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX2ludGVnZXIgJiYgIXN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NpZ25lZCwKLSAgICBUPjo6dHlwZQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfaW50ZWdlciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19zaWduZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBUPjo6dHlwZQogQ2hlY2tlZE1vZChUIHgsIFQgeSwgUmFuZ2VDb25zdHJhaW50KiB2YWxpZGl0eSkgewogICAqdmFsaWRpdHkgPSBSQU5HRV9WQUxJRDsKICAgcmV0dXJuIHggJSB5OwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXR5cGVuYW1lIGVuYWJsZV9pZjwKLSAgICBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19pbnRlZ2VyJiYgc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfc2lnbmVkLAotICAgIFQ+Ojp0eXBlCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19pbnRlZ2VyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfc2lnbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgVD46OnR5cGUKIENoZWNrZWROZWcoVCB2YWx1ZSwgUmFuZ2VDb25zdHJhaW50KiB2YWxpZGl0eSkgewogICAqdmFsaWRpdHkgPQogICAgICAgdmFsdWUgIT0gc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWluKCkgPyBSQU5HRV9WQUxJRCA6IFJBTkdFX09WRVJGTE9XOwpAQCAtMjYxLDkgKzI2Myw5IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdHlwZW5hbWUgZW5hYmxlX2lmPAotICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX2ludGVnZXIgJiYgIXN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NpZ25lZCwKLSAgICBUPjo6dHlwZQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfaW50ZWdlciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19zaWduZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBUPjo6dHlwZQogQ2hlY2tlZE5lZyhUIHZhbHVlLCBSYW5nZUNvbnN0cmFpbnQqIHZhbGlkaXR5KSB7CiAgIC8vIFRoZSBvbmx5IGxlZ2FsIHVuc2lnbmVkIG5lZ2F0aW9uIGlzIHplcm8uCiAgICp2YWxpZGl0eSA9IHZhbHVlID8gUkFOR0VfVU5ERVJGTE9XIDogUkFOR0VfVkFMSUQ7CkBAIC0yNzIsOSArMjc0LDkgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci10eXBlbmFtZSBlbmFibGVfaWY8Ci0gICAgc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfaW50ZWdlciYmIHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NpZ25lZCwKLSAgICBUPjo6dHlwZQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfaW50ZWdlciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFQ+Ojp0eXBlCiBDaGVja2VkQWJzKFQgdmFsdWUsIFJhbmdlQ29uc3RyYWludCogdmFsaWRpdHkpIHsKICAgKnZhbGlkaXR5ID0KICAgICAgIHZhbHVlICE9IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1pbigpID8gUkFOR0VfVkFMSUQgOiBSQU5HRV9PVkVSRkxPVzsKQEAgLTI4Miw5ICsyODQsOSBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXR5cGVuYW1lIGVuYWJsZV9pZjwKLSAgICBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19pbnRlZ2VyICYmICFzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19zaWduZWQsCi0gICAgVD46OnR5cGUKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX2ludGVnZXIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfc2lnbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgVD46OnR5cGUKIENoZWNrZWRBYnMoVCB2YWx1ZSwgUmFuZ2VDb25zdHJhaW50KiB2YWxpZGl0eSkgewogICAvLyBBYnNvbHV0ZSB2YWx1ZSBvZiBhIHBvc2l0aXZlIGlzIGp1c3QgaXRzIGlkZW50aXkuCiAgICp2YWxpZGl0eSA9IFJBTkdFX1ZBTElEOwpAQCAtMjkzLDEyICsyOTUsMTIgQEAKIAogLy8gVGhlc2UgYXJlIHRoZSBmbG9hdGluZyBwb2ludCBzdHVicyB0aGF0IHRoZSBjb21waWxlciBuZWVkcyB0byBzZWUuIE9ubHkgdGhlCiAvLyBuZWdhdGlvbiBvcGVyYXRpb24gaXMgZXZlciBjYWxsZWQuCi0jZGVmaW5lIEJBU0VfRkxPQVRfQVJJVEhNRVRJQ19TVFVCUyhOQU1FKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB0eXBlbmFtZSBlbmFibGVfaWY8c3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfaWVjNTU5LCBUPjo6dHlwZSBcCi0gIENoZWNrZWQjI05BTUUoVCwgVCwgUmFuZ2VDb25zdHJhaW50KikgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBOT1RSRUFDSEVEKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIEJBU0VfRkxPQVRfQVJJVEhNRVRJQ19TVFVCUyhOQU1FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfaWVjNTU5LCBUPjo6dHlwZSBcCisgICAgICBDaGVja2VkIyNOQU1FKFQsIFQsIFJhbmdlQ29uc3RyYWludCopIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE5PVFJFQUNIRUQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH0KIAogQkFTRV9GTE9BVF9BUklUSE1FVElDX1NUVUJTKEFkZCkKQEAgLTMxMCwxNCArMzEyLDE0IEBACiAjdW5kZWYgQkFTRV9GTE9BVF9BUklUSE1FVElDX1NUVUJTCiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdHlwZW5hbWUgZW5hYmxlX2lmPHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX2llYzU1OSwgVD46OnR5cGUgQ2hlY2tlZE5lZygKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX2llYzU1OSwgVD46OnR5cGUgQ2hlY2tlZE5lZygKICAgICBUIHZhbHVlLAogICAgIFJhbmdlQ29uc3RyYWludCopIHsKICAgcmV0dXJuIC12YWx1ZTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci10eXBlbmFtZSBlbmFibGVfaWY8c3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfaWVjNTU5LCBUPjo6dHlwZSBDaGVja2VkQWJzKAordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfaWVjNTU5LCBUPjo6dHlwZSBDaGVja2VkQWJzKAogICAgIFQgdmFsdWUsCiAgICAgUmFuZ2VDb25zdHJhaW50KikgewogICByZXR1cm4gc3RkOjphYnModmFsdWUpOwpAQCAtMzc3LDggKzM3OSw4IEBACiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTcmM+CiAgIGV4cGxpY2l0IENoZWNrZWROdW1lcmljU3RhdGUoCiAgICAgICBTcmMgdmFsdWUsCi0gICAgICB0eXBlbmFtZSBlbmFibGVfaWY8c3RkOjpudW1lcmljX2xpbWl0czxTcmM+Ojppc19zcGVjaWFsaXplZCwgaW50Pjo6dHlwZSA9Ci0gICAgICAgICAgMCkKKyAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6bnVtZXJpY19saW1pdHM8U3JjPjo6aXNfc3BlY2lhbGl6ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ+Ojp0eXBlID0gMCkKICAgICAgIDogdmFsdWVfKHN0YXRpY19jYXN0PFQ+KHZhbHVlKSksCiAgICAgICAgIHZhbGlkaXR5XyhEc3RSYW5nZVJlbGF0aW9uVG9TcmNSYW5nZTxUPih2YWx1ZSkpIHt9CiAKQEAgLTQwMiw3ICs0MDQsOCBAQAogICBDaGVja2VkTnVtZXJpY1N0YXRlKAogICAgICAgU3JjIHZhbHVlLAogICAgICAgUmFuZ2VDb25zdHJhaW50IHZhbGlkaXR5LAotICAgICAgdHlwZW5hbWUgZW5hYmxlX2lmPHN0ZDo6bnVtZXJpY19saW1pdHM8U3JjPjo6aXNfaW50ZWdlciwgaW50Pjo6dHlwZSA9IDApIHsKKyAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6bnVtZXJpY19saW1pdHM8U3JjPjo6aXNfaW50ZWdlciwgaW50Pjo6dHlwZSA9CisgICAgICAgICAgMCkgewogICAgIHN3aXRjaCAoRHN0UmFuZ2VSZWxhdGlvblRvU3JjUmFuZ2U8VD4odmFsdWUpKSB7CiAgICAgICBjYXNlIFJBTkdFX1ZBTElEOgogICAgICAgICB2YWx1ZV8gPSBzdGF0aWNfY2FzdDxUPih2YWx1ZSk7CkBAIC00MjgsOCArNDMxLDggQEAKICAgdGVtcGxhdGUgPHR5cGVuYW1lIFNyYz4KICAgZXhwbGljaXQgQ2hlY2tlZE51bWVyaWNTdGF0ZSgKICAgICAgIFNyYyB2YWx1ZSwKLSAgICAgIHR5cGVuYW1lIGVuYWJsZV9pZjxzdGQ6Om51bWVyaWNfbGltaXRzPFNyYz46OmlzX3NwZWNpYWxpemVkLCBpbnQ+Ojp0eXBlID0KLSAgICAgICAgICAwKQorICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjpudW1lcmljX2xpbWl0czxTcmM+Ojppc19zcGVjaWFsaXplZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludD46OnR5cGUgPSAwKQogICAgICAgOiB2YWx1ZV8oc3RhdGljX2Nhc3Q8VD4odmFsdWUpKSB7fQogCiAgIC8vIENvcHkgY29uc3RydWN0b3IuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmggYi90aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI2NTYwMwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaApAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgUERGSVVNX1RISVJEX1BBUlRZX0JBU0VfU1RMX1VUSUxfSF8KKyNkZWZpbmUgUERGSVVNX1RISVJEX1BBUlRZX0JBU0VfU1RMX1VUSUxfSF8KKworbmFtZXNwYWNlIHBkZml1bSB7CisKKy8vIFRlc3QgdG8gc2VlIGlmIGEgc2V0LCBtYXAsIGhhc2hfc2V0IG9yIGhhc2hfbWFwIGNvbnRhaW5zIGEgcGFydGljdWxhciBrZXkuCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGtleSBpcyBpbiB0aGUgY29sbGVjdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDb2xsZWN0aW9uLCB0eXBlbmFtZSBLZXk+Citib29sIENvbnRhaW5zS2V5KGNvbnN0IENvbGxlY3Rpb24mIGNvbGxlY3Rpb24sIGNvbnN0IEtleSYga2V5KSB7CisgIHJldHVybiBjb2xsZWN0aW9uLmZpbmQoa2V5KSAhPSBjb2xsZWN0aW9uLmVuZCgpOworfQorCisvLyBUZXN0IHRvIHNlZSBpZiBhIGNvbGxlY3Rpb24gbGlrZSBhIHZlY3RvciBjb250YWlucyBhIHBhcnRpY3VsYXIgdmFsdWUuCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIGlzIGluIHRoZSBjb2xsZWN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIENvbGxlY3Rpb24sIHR5cGVuYW1lIFZhbHVlPgorYm9vbCBDb250YWluc1ZhbHVlKGNvbnN0IENvbGxlY3Rpb24mIGNvbGxlY3Rpb24sIGNvbnN0IFZhbHVlJiB2YWx1ZSkgeworICByZXR1cm4gc3RkOjpmaW5kKGNvbGxlY3Rpb24uYmVnaW4oKSwgY29sbGVjdGlvbi5lbmQoKSwgdmFsdWUpICE9CisgICAgICAgICBjb2xsZWN0aW9uLmVuZCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgcGRmaXVtCisKKyNlbmRpZiAgLy8gUERGSVVNX1RISVJEX1BBUlRZX0JBU0VfU1RMX1VUSUxfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jhc2UvdGVtcGxhdGVfdXRpbC5oIGIvdGhpcmRfcGFydHkvYmFzZS90ZW1wbGF0ZV91dGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNjYwOTQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvYmFzZS90ZW1wbGF0ZV91dGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIFBERklVTV9USElSRF9QQVJUWV9CQVNFX1RFTVBMQVRFX1VUSUxfSF8KLSNkZWZpbmUgUERGSVVNX1RISVJEX1BBUlRZX0JBU0VfVEVNUExBVEVfVVRJTF9IXwotCi0jaW5jbHVkZSA8Y3N0ZGRlZj4gIC8vIEZvciBzaXplX3QuCi0KLW5hbWVzcGFjZSBwZGZpdW0gewotbmFtZXNwYWNlIGJhc2UgewotCi10ZW1wbGF0ZTxjbGFzcyBULCBUIHY+Ci1zdHJ1Y3QgaW50ZWdyYWxfY29uc3RhbnQgewotICBzdGF0aWMgY29uc3QgVCB2YWx1ZSA9IHY7Ci0gIHR5cGVkZWYgVCB2YWx1ZV90eXBlOwotICB0eXBlZGVmIGludGVncmFsX2NvbnN0YW50PFQsIHY+IHR5cGU7Ci19OwotCi10eXBlZGVmIGludGVncmFsX2NvbnN0YW50PGJvb2wsIHRydWU+IHRydWVfdHlwZTsKLXR5cGVkZWYgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgZmFsc2U+IGZhbHNlX3R5cGU7Ci0KLXRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPiBzdHJ1Y3QgaXNfc2FtZSA6IHB1YmxpYyBmYWxzZV90eXBlIHt9OwotdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBpc19zYW1lPFQsVD4gOiB0cnVlX3R5cGUge307Ci0KLXRlbXBsYXRlPGJvb2wgQiwgY2xhc3MgVCA9IHZvaWQ+Ci1zdHJ1Y3QgZW5hYmxlX2lmIHt9OwotCi10ZW1wbGF0ZTxjbGFzcyBUPgotc3RydWN0IGVuYWJsZV9pZjx0cnVlLCBUPiB7IHR5cGVkZWYgVCB0eXBlOyB9OwotCi19ICAvLyBuYW1lc3BhY2UgYmFzZQotfSAgLy8gbmFtZXNwYWNlIHBkZml1bQotCi0jZW5kaWYgIC8vIFBERklVTV9USElSRF9QQVJUWV9CQVNFX1RFTVBMQVRFX1VUSUxfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2JpZ2ludC9CaWdJbnRlZ2VyVXRpbHMuaGggYi90aGlyZF9wYXJ0eS9iaWdpbnQvQmlnSW50ZWdlclV0aWxzLmhoCmluZGV4IGQyZjgxZjQuLjk5OWNkZDIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2JpZ2ludC9CaWdJbnRlZ2VyVXRpbHMuaGgKKysrIGIvdGhpcmRfcGFydHkvYmlnaW50L0JpZ0ludGVnZXJVdGlscy5oaApAQCAtOSw3ICs5LDcgQEAKIAogI2luY2x1ZGUgIkJpZ0ludGVnZXIuaGgiCiAjaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG9zdHJlYW0+CiAKIC8qIFRoaXMgZmlsZSBwcm92aWRlczoKICAqIC0gQ29udmVuaWVudCBzdGQ6OnN0cmluZyA8LT4gQmlnVW5zaWduZWQvQmlnSW50ZWdlciBjb252ZXJzaW9uIHJvdXRpbmVzCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS8wMDAwLWluY2x1ZGUucGF0Y2ggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS8wMDAwLWluY2x1ZGUucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc0NzhlNwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlLzAwMDAtaW5jbHVkZS5wYXRjaApAQCAtMCwwICsxLDEyMCBAQAorZGlmZiAtcnUgZnJlZXR5cGUtMi42LjEvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaCBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oCistLS0gZnJlZXR5cGUtMi42LjEvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaAkyMDE1LTExLTA1IDEzOjUyOjM2LjczNDczMzE4NiAtMDgwMAorKysrIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0bW9kdWxlLmgJMjAxNS0xMS0wNSAxMzo0NDo1NC40NDU0Nzk4MjIgLTA4MDAKK0BAIC0xLDMgKzEsMjAgQEAKKysvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisrLyogIGZ0bW9kdWxlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKysvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworKy8qICAgIEZyZWVUeXBlIG1vZHVsZXMgcHVibGljIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICovCisrLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKysvKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisrLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKysvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisrLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKysvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisrLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKysvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKworIC8qCisgICogIFRoaXMgZmlsZSByZWdpc3RlcnMgdGhlIEZyZWVUeXBlIG1vZHVsZXMgY29tcGlsZWQgaW50byB0aGUgbGlicmFyeS4KKyAgKgorQEAgLTEwLDE1ICsyNywxNSBAQAorICAqCisgICovCisgCistRlRfVVNFX01PRFVMRSggRlRfTW9kdWxlX0NsYXNzLCBhdXRvZml0X21vZHVsZV9jbGFzcyApCisrLy9GVF9VU0VfTU9EVUxFKCBGVF9Nb2R1bGVfQ2xhc3MsIGF1dG9maXRfbW9kdWxlX2NsYXNzICkKKyBGVF9VU0VfTU9EVUxFKCBGVF9Ecml2ZXJfQ2xhc3NSZWMsIHR0X2RyaXZlcl9jbGFzcyApCisgRlRfVVNFX01PRFVMRSggRlRfRHJpdmVyX0NsYXNzUmVjLCB0MV9kcml2ZXJfY2xhc3MgKQorIEZUX1VTRV9NT0RVTEUoIEZUX0RyaXZlcl9DbGFzc1JlYywgY2ZmX2RyaXZlcl9jbGFzcyApCisgRlRfVVNFX01PRFVMRSggRlRfRHJpdmVyX0NsYXNzUmVjLCB0MWNpZF9kcml2ZXJfY2xhc3MgKQorLUZUX1VTRV9NT0RVTEUoIEZUX0RyaXZlcl9DbGFzc1JlYywgcGZyX2RyaXZlcl9jbGFzcyApCistRlRfVVNFX01PRFVMRSggRlRfRHJpdmVyX0NsYXNzUmVjLCB0NDJfZHJpdmVyX2NsYXNzICkKKy1GVF9VU0VfTU9EVUxFKCBGVF9Ecml2ZXJfQ2xhc3NSZWMsIHdpbmZudF9kcml2ZXJfY2xhc3MgKQorLUZUX1VTRV9NT0RVTEUoIEZUX0RyaXZlcl9DbGFzc1JlYywgcGNmX2RyaXZlcl9jbGFzcyApCisrLy9GVF9VU0VfTU9EVUxFKCBGVF9Ecml2ZXJfQ2xhc3NSZWMsIHBmcl9kcml2ZXJfY2xhc3MgKQorKy8vRlRfVVNFX01PRFVMRSggRlRfRHJpdmVyX0NsYXNzUmVjLCB0NDJfZHJpdmVyX2NsYXNzICkKKysvL0ZUX1VTRV9NT0RVTEUoIEZUX0RyaXZlcl9DbGFzc1JlYywgd2luZm50X2RyaXZlcl9jbGFzcyApCisrLy9GVF9VU0VfTU9EVUxFKCBGVF9Ecml2ZXJfQ2xhc3NSZWMsIHBjZl9kcml2ZXJfY2xhc3MgKQorIEZUX1VTRV9NT0RVTEUoIEZUX01vZHVsZV9DbGFzcywgcHNhdXhfbW9kdWxlX2NsYXNzICkKKyBGVF9VU0VfTU9EVUxFKCBGVF9Nb2R1bGVfQ2xhc3MsIHBzbmFtZXNfbW9kdWxlX2NsYXNzICkKKyBGVF9VU0VfTU9EVUxFKCBGVF9Nb2R1bGVfQ2xhc3MsIHBzaGludGVyX21vZHVsZV9jbGFzcyApCitAQCAtMjcsNiArNDQsNiBAQAorIEZUX1VTRV9NT0RVTEUoIEZUX1JlbmRlcmVyX0NsYXNzLCBmdF9zbW9vdGhfcmVuZGVyZXJfY2xhc3MgKQorIEZUX1VTRV9NT0RVTEUoIEZUX1JlbmRlcmVyX0NsYXNzLCBmdF9zbW9vdGhfbGNkX3JlbmRlcmVyX2NsYXNzICkKKyBGVF9VU0VfTU9EVUxFKCBGVF9SZW5kZXJlcl9DbGFzcywgZnRfc21vb3RoX2xjZHZfcmVuZGVyZXJfY2xhc3MgKQorLUZUX1VTRV9NT0RVTEUoIEZUX0RyaXZlcl9DbGFzc1JlYywgYmRmX2RyaXZlcl9jbGFzcyApCisrLy9GVF9VU0VfTU9EVUxFKCBGVF9Ecml2ZXJfQ2xhc3NSZWMsIGJkZl9kcml2ZXJfY2xhc3MgKQorIAorIC8qIEVPRiAqLworZGlmZiAtcnUgZnJlZXR5cGUtMi42LjEvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaCBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oCistLS0gZnJlZXR5cGUtMi42LjEvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaAkyMDE1LTExLTA1IDEzOjUyOjM2LjczNDczMzE4NiAtMDgwMAorKysrIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgJMjAxNS0xMS0wNSAxMzo0NDo1NC40NDU0Nzk4MjIgLTA4MDAKK0BAIC05Miw3ICs5Miw3IEBACisgICAvKiBUaGlzIGlzIGRvbmUgdG8gYWxsb3cgRnJlZVR5cGUgY2xpZW50cyB0byBydW4gdW5tb2RpZmllZCwgZm9yY2luZyAgICAgKi8KKyAgIC8qIHRoZW0gdG8gZGlzcGxheSBub3JtYWwgZ3JheS1sZXZlbCBhbnRpLWFsaWFzZWQgZ2x5cGhzLiAgICAgICAgICAgICAgICAqLworICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCistLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORyAqLworKyNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcKKyAKKyAKKyAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQEAgLTE2Myw3ICsxNjMsNyBAQAorICAgLyogICBEZWZpbmUgdGhpcyBtYWNybyBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhpcyBgZmVhdHVyZScuICBTZWUgYWxzbyAgICovCisgICAvKiAgIHRoZSBtYWNybyBGVF9DT05GSUdfT1BUSU9OX1NZU1RFTV9aTElCIGJlbG93LiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLSNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9VU0VfWkxJQgorKy8vI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1VTRV9aTElCCisgCisgCisgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0BAIC0zMzYsNyArMzM2LDcgQEAKKyAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgLyogICBOb3RlIHRoYXQgdGhlIGBGT05EJyByZXNvdXJjZSBpc24ndCBjaGVja2VkLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy0jZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fTUFDX0ZPTlRTCisrI3VuZGVmIEZUX0NPTkZJR19PUFRJT05fTUFDX0ZPTlRTCisgCisgCisgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0BAIC01MTIsNyArNTEyLDcgQEAKKyAgIC8qIGVtYmVkZGVkIGJpdG1hcHMgaW4gYWxsIGZvcm1hdHMgdXNpbmcgdGhlIFNGTlQgbW9kdWxlIChuYW1lbHkgICAgICAgICAqLworICAgLyogVHJ1ZVR5cGUgJiBPcGVuVHlwZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy0jZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUworKyN1bmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKKyAKKyAKKyAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQEAgLTY4MSw3ICs2ODEsNyBAQAorICAgLyogYW5kIGF2YXIgdGFibGVzKS4gIFRoaXMgaGFzIG1hbnkgc2ltaWxhcml0aWVzIHRvIFR5cGUgMSBNdWx0aXBsZSAgICAgICovCisgICAvKiBNYXN0ZXJzIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLSNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAorKyN1bmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCisgCisgCisgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0BAIC02ODksNyArNjg5LDcgQEAKKyAgIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX0JERiBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHN1cHBvcnQgZm9yICAgICAgICAqLworICAgLyogYW4gZW1iZWRkZWQgYEJERiAnIHRhYmxlIHdpdGhpbiBTRk5ULWJhc2VkIGJpdG1hcCBmb3JtYXRzLiAgICAgICAgICAgICovCisgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy0jZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fQkRGCisrI3VuZGVmIFRUX0NPTkZJR19PUFRJT05fQkRGCisgCisgCisgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0BAIC03MjUsNyArNzI1LDcgQEAKKyAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgLyogVGhlIENoaW5lc2UgZm9udCBNaW5nVGlFRy1NZWRpdW0gKENOUyAxMTY0MyBjaGFyYWN0ZXIgc2V0KSBuZWVkcyAyNTYuICovCisgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy0jZGVmaW5lIFQxX01BWF9DSEFSU1RSSU5HU19PUEVSQU5EUyAgMjU2CisrI2RlZmluZSBUMV9NQVhfQ0hBUlNUUklOR1NfT1BFUkFORFMgIDUxMgorIAorIAorICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitPbmx5IGluIGZyZWV0eXBlLTIuNi4xL2luY2x1ZGUvZnJlZXR5cGU6IGZ0Y2hhcHRlcnMuaApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvRlRMLlRYVCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL0ZUTC5UWFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJhYmEzMwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL0ZUTC5UWFQKQEAgLTAsMCArMSwxNjkgQEAKKyAgICAgICAgICAgICAgICAgICAgVGhlIEZyZWVUeXBlIFByb2plY3QgTElDRU5TRQorICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDA2LUphbi0yNworCisgICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAxOTk2LTIwMDIsIDIwMDYgYnkKKyAgICAgICAgICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcKKworCisKK0ludHJvZHVjdGlvbgorPT09PT09PT09PT09CisKKyAgVGhlIEZyZWVUeXBlICBQcm9qZWN0IGlzIGRpc3RyaWJ1dGVkIGluICBzZXZlcmFsIGFyY2hpdmUgcGFja2FnZXM7CisgIHNvbWUgb2YgdGhlbSBtYXkgY29udGFpbiwgaW4gYWRkaXRpb24gdG8gdGhlIEZyZWVUeXBlIGZvbnQgZW5naW5lLAorICB2YXJpb3VzIHRvb2xzIGFuZCAgY29udHJpYnV0aW9ucyB3aGljaCByZWx5IG9uLCBvciAgcmVsYXRlIHRvLCB0aGUKKyAgRnJlZVR5cGUgUHJvamVjdC4KKworICBUaGlzICBsaWNlbnNlIGFwcGxpZXMgIHRvIGFsbCAgZmlsZXMgZm91bmQgIGluIHN1Y2ggIHBhY2thZ2VzLCBhbmQKKyAgd2hpY2ggZG8gbm90ICBmYWxsIHVuZGVyIHRoZWlyIG93biBleHBsaWNpdCAgbGljZW5zZS4gIFRoZSBsaWNlbnNlCisgIGFmZmVjdHMgIHRodXMgIHRoZSAgRnJlZVR5cGUgICBmb250ICBlbmdpbmUsICB0aGUgIHRlc3QgIHByb2dyYW1zLAorICBkb2N1bWVudGF0aW9uIGFuZCBtYWtlZmlsZXMsIGF0IHRoZSB2ZXJ5IGxlYXN0LgorCisgIFRoaXMgIGxpY2Vuc2UgICB3YXMgIGluc3BpcmVkICBieSAgdGhlICBCU0QsICAgQXJ0aXN0aWMsICBhbmQgIElKRworICAoSW5kZXBlbmRlbnQgSlBFRyAgR3JvdXApIGxpY2Vuc2VzLCB3aGljaCAgYWxsIGVuY291cmFnZSBpbmNsdXNpb24KKyAgYW5kICB1c2Ugb2YgIGZyZWUgIHNvZnR3YXJlIGluICBjb21tZXJjaWFsICBhbmQgZnJlZXdhcmUgIHByb2R1Y3RzCisgIGFsaWtlLiAgQXMgYSBjb25zZXF1ZW5jZSwgaXRzIG1haW4gcG9pbnRzIGFyZSB0aGF0OgorCisgICAgbyBXZSBkb24ndCBwcm9taXNlIHRoYXQgdGhpcyBzb2Z0d2FyZSB3b3Jrcy4gSG93ZXZlciwgd2Ugd2lsbCBiZQorICAgICAgaW50ZXJlc3RlZCBpbiBhbnkga2luZCBvZiBidWcgcmVwb3J0cy4gKGBhcyBpcycgZGlzdHJpYnV0aW9uKQorCisgICAgbyBZb3UgY2FuICB1c2UgdGhpcyBzb2Z0d2FyZSBmb3Igd2hhdGV2ZXIgeW91ICB3YW50LCBpbiBwYXJ0cyBvcgorICAgICAgZnVsbCBmb3JtLCB3aXRob3V0IGhhdmluZyB0byBwYXkgdXMuIChgcm95YWx0eS1mcmVlJyB1c2FnZSkKKworICAgIG8gWW91IG1heSBub3QgcHJldGVuZCB0aGF0ICB5b3Ugd3JvdGUgdGhpcyBzb2Z0d2FyZS4gIElmIHlvdSB1c2UKKyAgICAgIGl0LCBvciAgb25seSBwYXJ0cyBvZiBpdCwgIGluIGEgcHJvZ3JhbSwgIHlvdSBtdXN0IGFja25vd2xlZGdlCisgICAgICBzb21ld2hlcmUgIGluICB5b3VyICBkb2N1bWVudGF0aW9uICB0aGF0ICB5b3UgIGhhdmUgIHVzZWQgIHRoZQorICAgICAgRnJlZVR5cGUgY29kZS4gKGBjcmVkaXRzJykKKworICBXZSAgc3BlY2lmaWNhbGx5ICBwZXJtaXQgIGFuZCAgZW5jb3VyYWdlICB0aGUgIGluY2x1c2lvbiAgb2YgIHRoaXMKKyAgc29mdHdhcmUsIHdpdGggIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgIGluIGNvbW1lcmNpYWwgcHJvZHVjdHMuCisgIFdlICBkaXNjbGFpbSAgYWxsIHdhcnJhbnRpZXMgIGNvdmVyaW5nICBUaGUgIEZyZWVUeXBlIFByb2plY3QgIGFuZAorICBhc3N1bWUgbm8gbGlhYmlsaXR5IHJlbGF0ZWQgdG8gVGhlIEZyZWVUeXBlIFByb2plY3QuCisKKworICBGaW5hbGx5LCAgbWFueSAgcGVvcGxlICBhc2tlZCAgdXMgIGZvciAgYSAgcHJlZmVycmVkICBmb3JtICBmb3IgIGEKKyAgY3JlZGl0L2Rpc2NsYWltZXIgdG8gdXNlIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGlzIGxpY2Vuc2UuICBXZSB0aHVzCisgIGVuY291cmFnZSB5b3UgdG8gdXNlIHRoZSBmb2xsb3dpbmcgdGV4dDoKKworICAgIiIiCisgICAgUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgY29weXJpZ2h0IKkgPHllYXI+IFRoZSBGcmVlVHlwZQorICAgIFByb2plY3QgKHd3dy5mcmVldHlwZS5vcmcpLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgICIiIgorCisgIFBsZWFzZSByZXBsYWNlIDx5ZWFyPiB3aXRoIHRoZSB2YWx1ZSBmcm9tIHRoZSBGcmVlVHlwZSB2ZXJzaW9uIHlvdQorICBhY3R1YWxseSB1c2UuCisKKworTGVnYWwgVGVybXMKKz09PT09PT09PT09CisKKzAuIERlZmluaXRpb25zCistLS0tLS0tLS0tLS0tLQorCisgIFRocm91Z2hvdXQgdGhpcyBsaWNlbnNlLCAgdGhlIHRlcm1zIGBwYWNrYWdlJywgYEZyZWVUeXBlIFByb2plY3QnLAorICBhbmQgIGBGcmVlVHlwZSAgYXJjaGl2ZScgcmVmZXIgIHRvICB0aGUgIHNldCAgb2YgZmlsZXMgIG9yaWdpbmFsbHkKKyAgZGlzdHJpYnV0ZWQgIGJ5IHRoZSAgYXV0aG9ycyAgKERhdmlkIFR1cm5lciwgIFJvYmVydCBXaWxoZWxtLCAgYW5kCisgIFdlcm5lciBMZW1iZXJnKSBhcyB0aGUgYEZyZWVUeXBlIFByb2plY3QnLCBiZSB0aGV5IG5hbWVkIGFzIGFscGhhLAorICBiZXRhIG9yIGZpbmFsIHJlbGVhc2UuCisKKyAgYFlvdScgcmVmZXJzIHRvICB0aGUgbGljZW5zZWUsIG9yIHBlcnNvbiB1c2luZyAgdGhlIHByb2plY3QsIHdoZXJlCisgIGB1c2luZycgaXMgYSBnZW5lcmljIHRlcm0gaW5jbHVkaW5nIGNvbXBpbGluZyB0aGUgcHJvamVjdCdzIHNvdXJjZQorICBjb2RlIGFzICB3ZWxsIGFzIGxpbmtpbmcgaXQgIHRvIGZvcm0gYSAgYHByb2dyYW0nIG9yIGBleGVjdXRhYmxlJy4KKyAgVGhpcyAgcHJvZ3JhbSBpcyAgcmVmZXJyZWQgdG8gIGFzICBgYSBwcm9ncmFtICB1c2luZyB0aGUgIEZyZWVUeXBlCisgIGVuZ2luZScuCisKKyAgVGhpcyAgbGljZW5zZSBhcHBsaWVzICB0byBhbGwgIGZpbGVzIGRpc3RyaWJ1dGVkICBpbiAgdGhlIG9yaWdpbmFsCisgIEZyZWVUeXBlICBQcm9qZWN0LCAgIGluY2x1ZGluZyAgYWxsICBzb3VyY2UgICBjb2RlLCAgYmluYXJpZXMgIGFuZAorICBkb2N1bWVudGF0aW9uLCAgdW5sZXNzICBvdGhlcndpc2UgIHN0YXRlZCAgIGluICB0aGUgIGZpbGUgIGluICBpdHMKKyAgb3JpZ2luYWwsIHVubW9kaWZpZWQgZm9ybSBhcyAgZGlzdHJpYnV0ZWQgaW4gdGhlIG9yaWdpbmFsIGFyY2hpdmUuCisgIElmIHlvdSBhcmUgIHVuc3VyZSB3aGV0aGVyIG9yIG5vdCBhIHBhcnRpY3VsYXIgIGZpbGUgaXMgY292ZXJlZCBieQorICB0aGlzIGxpY2Vuc2UsIHlvdSBtdXN0IGNvbnRhY3QgdXMgdG8gdmVyaWZ5IHRoaXMuCisKKyAgVGhlIEZyZWVUeXBlICBQcm9qZWN0IGlzIGNvcHlyaWdodCAoQykgMTk5Ni0yMDAwICBieSBEYXZpZCBUdXJuZXIsCisgIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICBBbGwgcmlnaHRzIHJlc2VydmVkIGV4Y2VwdCBhcworICBzcGVjaWZpZWQgYmVsb3cuCisKKzEuIE5vIFdhcnJhbnR5CistLS0tLS0tLS0tLS0tLQorCisgIFRIRSBGUkVFVFlQRSBQUk9KRUNUICBJUyBQUk9WSURFRCBgQVMgSVMnIFdJVEhPVVQgIFdBUlJBTlRZIE9GIEFOWQorICBLSU5ELCBFSVRIRVIgIEVYUFJFU1MgT1IgSU1QTElFRCwgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCBUTywKKyAgV0FSUkFOVElFUyAgT0YgIE1FUkNIQU5UQUJJTElUWSAgIEFORCAgRklUTkVTUyAgRk9SICBBICBQQVJUSUNVTEFSCisgIFBVUlBPU0UuICBJTiBOTyBFVkVOVCBXSUxMIEFOWSBPRiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICBCRSBMSUFCTEUgIEZPUiBBTlkgREFNQUdFUyBDQVVTRUQgIEJZIFRIRSBVU0UgT1IgIFRIRSBJTkFCSUxJVFkgVE8KKyAgVVNFLCBPRiBUSEUgRlJFRVRZUEUgUFJPSkVDVC4KKworMi4gUmVkaXN0cmlidXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tCisKKyAgVGhpcyAgbGljZW5zZSAgZ3JhbnRzICBhICB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSwgIHBlcnBldHVhbCAgYW5kCisgIGlycmV2b2NhYmxlIHJpZ2h0ICBhbmQgbGljZW5zZSB0byB1c2UsICBleGVjdXRlLCBwZXJmb3JtLCBjb21waWxlLAorICBkaXNwbGF5LCAgY29weSwgICBjcmVhdGUgIGRlcml2YXRpdmUgIHdvcmtzICAgb2YsICBkaXN0cmlidXRlICBhbmQKKyAgc3VibGljZW5zZSB0aGUgIEZyZWVUeXBlIFByb2plY3QgKGluICBib3RoIHNvdXJjZSBhbmQgIG9iamVjdCBjb2RlCisgIGZvcm1zKSAgYW5kICBkZXJpdmF0aXZlIHdvcmtzICB0aGVyZW9mICBmb3IgIGFueSAgcHVycG9zZTsgYW5kICB0bworICBhdXRob3JpemUgb3RoZXJzICB0byBleGVyY2lzZSAgc29tZSBvciBhbGwgIG9mIHRoZSAgcmlnaHRzIGdyYW50ZWQKKyAgaGVyZWluLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgIG8gUmVkaXN0cmlidXRpb24gb2YgIHNvdXJjZSBjb2RlICBtdXN0IHJldGFpbiB0aGlzICBsaWNlbnNlIGZpbGUKKyAgICAgIChgRlRMLlRYVCcpIHVuYWx0ZXJlZDsgYW55ICBhZGRpdGlvbnMsIGRlbGV0aW9ucyBvciBjaGFuZ2VzIHRvCisgICAgICB0aGUgb3JpZ2luYWwgIGZpbGVzIG11c3QgYmUgY2xlYXJseSAgaW5kaWNhdGVkIGluIGFjY29tcGFueWluZworICAgICAgZG9jdW1lbnRhdGlvbi4gICBUaGUgIGNvcHlyaWdodCAgIG5vdGljZXMgIG9mICB0aGUgIHVuYWx0ZXJlZCwKKyAgICAgIG9yaWdpbmFsICBmaWxlcyBtdXN0ICBiZSAgcHJlc2VydmVkIGluICBhbGwgIGNvcGllcyBvZiAgc291cmNlCisgICAgICBmaWxlcy4KKworICAgIG8gUmVkaXN0cmlidXRpb24gaW4gYmluYXJ5IGZvcm0gbXVzdCBwcm92aWRlIGEgIGRpc2NsYWltZXIgIHRoYXQKKyAgICAgIHN0YXRlcyAgdGhhdCAgdGhlIHNvZnR3YXJlIGlzIGJhc2VkIGluIHBhcnQgb2YgdGhlIHdvcmsgb2YgdGhlCisgICAgICBGcmVlVHlwZSBUZWFtLCAgaW4gIHRoZSAgZGlzdHJpYnV0aW9uICBkb2N1bWVudGF0aW9uLiAgV2UgYWxzbworICAgICAgZW5jb3VyYWdlIHlvdSB0byBwdXQgYW4gVVJMIHRvIHRoZSBGcmVlVHlwZSB3ZWIgcGFnZSAgaW4gIHlvdXIKKyAgICAgIGRvY3VtZW50YXRpb24sIHRob3VnaCB0aGlzIGlzbid0IG1hbmRhdG9yeS4KKworICBUaGVzZSBjb25kaXRpb25zICBhcHBseSB0byBhbnkgIHNvZnR3YXJlIGRlcml2ZWQgZnJvbSBvciAgYmFzZWQgb24KKyAgdGhlIEZyZWVUeXBlIFByb2plY3QsICBub3QganVzdCB0aGUgdW5tb2RpZmllZCBmaWxlcy4gICBJZiB5b3UgdXNlCisgIG91ciB3b3JrLCB5b3UgIG11c3QgYWNrbm93bGVkZ2UgdXMuICBIb3dldmVyLCBubyAgZmVlIG5lZWQgYmUgcGFpZAorICB0byB1cy4KKworMy4gQWR2ZXJ0aXNpbmcKKy0tLS0tLS0tLS0tLS0tCisKKyAgTmVpdGhlciB0aGUgIEZyZWVUeXBlIGF1dGhvcnMgYW5kICBjb250cmlidXRvcnMgbm9yIHlvdSAgc2hhbGwgdXNlCisgIHRoZSBuYW1lIG9mIHRoZSAgb3RoZXIgZm9yIGNvbW1lcmNpYWwsIGFkdmVydGlzaW5nLCBvciBwcm9tb3Rpb25hbAorICBwdXJwb3NlcyB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworICBXZSBzdWdnZXN0LCAgYnV0IGRvIG5vdCByZXF1aXJlLCB0aGF0ICB5b3UgdXNlIG9uZSBvciAgbW9yZSBvZiB0aGUKKyAgZm9sbG93aW5nIHBocmFzZXMgdG8gcmVmZXIgIHRvIHRoaXMgc29mdHdhcmUgaW4geW91ciBkb2N1bWVudGF0aW9uCisgIG9yIGFkdmVydGlzaW5nICBtYXRlcmlhbHM6IGBGcmVlVHlwZSBQcm9qZWN0JywgIGBGcmVlVHlwZSBFbmdpbmUnLAorICBgRnJlZVR5cGUgbGlicmFyeScsIG9yIGBGcmVlVHlwZSBEaXN0cmlidXRpb24nLgorCisgIEFzICB5b3UgaGF2ZSAgbm90IHNpZ25lZCAgdGhpcyBsaWNlbnNlLCAgeW91IGFyZSAgbm90ICByZXF1aXJlZCB0bworICBhY2NlcHQgIGl0LiAgIEhvd2V2ZXIsICBhcyAgdGhlIEZyZWVUeXBlICBQcm9qZWN0ICBpcyAgY29weXJpZ2h0ZWQKKyAgbWF0ZXJpYWwsIG9ubHkgIHRoaXMgbGljZW5zZSwgb3IgIGFub3RoZXIgb25lIGNvbnRyYWN0ZWQgIHdpdGggdGhlCisgIGF1dGhvcnMsIGdyYW50cyB5b3UgIHRoZSByaWdodCB0byB1c2UsIGRpc3RyaWJ1dGUsICBhbmQgbW9kaWZ5IGl0LgorICBUaGVyZWZvcmUsICBieSAgdXNpbmcsICBkaXN0cmlidXRpbmcsICBvciBtb2RpZnlpbmcgIHRoZSAgRnJlZVR5cGUKKyAgUHJvamVjdCwgeW91IGluZGljYXRlIHRoYXQgeW91IHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBhbGwgdGhlIHRlcm1zCisgIG9mIHRoaXMgbGljZW5zZS4KKworNC4gQ29udGFjdHMKKy0tLS0tLS0tLS0tCisKKyAgVGhlcmUgYXJlIHR3byBtYWlsaW5nIGxpc3RzIHJlbGF0ZWQgdG8gRnJlZVR5cGU6CisKKyAgICBvIGZyZWV0eXBlQG5vbmdudS5vcmcKKworICAgICAgRGlzY3Vzc2VzIGdlbmVyYWwgdXNlIGFuZCBhcHBsaWNhdGlvbnMgb2YgRnJlZVR5cGUsIGFzIHdlbGwgYXMKKyAgICAgIGZ1dHVyZSBhbmQgIHdhbnRlZCBhZGRpdGlvbnMgdG8gdGhlICBsaWJyYXJ5IGFuZCBkaXN0cmlidXRpb24uCisgICAgICBJZiAgeW91IGFyZSBsb29raW5nICBmb3Igc3VwcG9ydCwgIHN0YXJ0IGluICB0aGlzIGxpc3QgIGlmIHlvdQorICAgICAgaGF2ZW4ndCBmb3VuZCBhbnl0aGluZyB0byBoZWxwIHlvdSBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworICAgIG8gZnJlZXR5cGUtZGV2ZWxAbm9uZ251Lm9yZworCisgICAgICBEaXNjdXNzZXMgYnVncywgIGFzIHdlbGwgIGFzIGVuZ2luZSBpbnRlcm5hbHMsICBkZXNpZ24gaXNzdWVzLAorICAgICAgc3BlY2lmaWMgbGljZW5zZXMsIHBvcnRpbmcsIGV0Yy4KKworICBPdXIgaG9tZSBwYWdlIGNhbiBiZSBmb3VuZCBhdAorCisgICAgaHR0cDovL3d3dy5mcmVldHlwZS5vcmcKKworCistLS0gZW5kIG9mIEZUTC5UWFQgLS0tCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9SRUFETUUucGRmaXVtIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvUkVBRE1FLnBkZml1bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGZhZDZmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvUkVBRE1FLnBkZml1bQpAQCAtMCwwICsxLDM0IEBACitOYW1lOiBGcmVlVHlwZQorVVJMOiBodHRwOi8vd3d3LmZyZWV0eXBlLm9yZy8KK1ZlcnNpb246IDIuNi4xCitTZWN1cml0eSBDcml0aWNhbDogeWVzCitMaWNlbnNlOiBGcmVlVHlwZSBMaWNlbnNlIChGVEwpCitMaWNlbnNlIEZpbGU6IEZUTC5UWFQKKworRGVzY3JpcHRpb246CitGcmVlVHlwZSBsaWJyYXJ5LgorCitMb2NhbCBNb2RpZmljYXRpb25zOgorCiswMDAwLWluY2x1ZGUucGF0Y2g6IE1vZGlmaWNhdGlvbnMgdG8gY29uZmlndXJhdGlvbiBoZWFkZXIgZmlsZXMuCisKK2luY2x1ZGUvZnJlZXR5cGUvZnRjaGFwZXJzLmggaXMgbm90IGluY2x1ZGVkLgorCitUaGUgZm9sbG93aW5nIGRpcmVjdG9yaWVzIGluIHNyYy8gYXJlIG5vdCBpbmNsdWRlZCBmcm9tCit1cHN0cmVhbSBGcmVlVHlwZSBhcyB0aGV5IGFyZSBuZXZlciB1c2VkOgorCithdXRvZml0CitiZGYKK2J6aXAyCitjYWNoZQorZ3h2YWxpZAorZ3ppcAorSmFtZmlsZQorbHp3CitvdHZhbGlkCitwY2YKK3BmcgordG9vbHMKK3R5cGU0Mgord2luZm9udHMKKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9jb25maWcvZnRjb25maWcuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvY29uZmlnL2Z0Y29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZDcwZmQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9jb25maWcvZnRjb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGNvbmZpZy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQU5TSS1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGZpbGUgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwNCwgMjAwNi0yMDA4LCAyMDEwLTIwMTEsIDIwMTMsIDIwMTQgYnkgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGhlYWRlciBmaWxlIGNvbnRhaW5zIGEgbnVtYmVyIG9mIG1hY3JvIGRlZmluaXRpb25zIHRoYXQgYXJlIHVzZWQgKi8KLSAgLyogYnkgdGhlIHJlc3Qgb2YgdGhlIGVuZ2luZS4gIE1vc3Qgb2YgdGhlIG1hY3JvcyBoZXJlIGFyZSBhdXRvbWF0aWNhbGx5ICovCi0gIC8qIGRldGVybWluZWQgYXQgY29tcGlsZSB0aW1lLCBhbmQgeW91IHNob3VsZCBub3QgbmVlZCB0byBjaGFuZ2UgaXQgdG8gICAqLwotICAvKiBwb3J0IEZyZWVUeXBlLCBleGNlcHQgdG8gY29tcGlsZSB0aGUgbGlicmFyeSB3aXRoIGEgbm9uLUFOU0kgICAgICAgICAgKi8KLSAgLyogY29tcGlsZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOb3RlIGhvd2V2ZXIgdGhhdCBpZiBzb21lIHNwZWNpZmljIG1vZGlmaWNhdGlvbnMgYXJlIG5lZWRlZCwgd2UgICAgICAgKi8KLSAgLyogYWR2aXNlIHlvdSB0byBwbGFjZSBhIG1vZGlmaWVkIGNvcHkgaW4geW91ciBidWlsZCBkaXJlY3RvcnkuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgYnVpbGQgZGlyZWN0b3J5IGlzIHVzdWFsbHkgYGJ1aWxkcy88c3lzdGVtPicsIGFuZCBjb250YWlucyAgICAgICAgKi8KLSAgLyogc3lzdGVtLXNwZWNpZmljIGZpbGVzIHRoYXQgYXJlIGFsd2F5cyBpbmNsdWRlZCBmaXJzdCB3aGVuIGJ1aWxkaW5nICAgICovCi0gIC8qIHRoZSBsaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBBTlNJIHZlcnNpb24gc2hvdWxkIHN0YXkgaW4gYGluY2x1ZGUvY29uZmlnLycuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0ZUQ09ORklHX0hfXwotI2RlZmluZSBfX0ZUQ09ORklHX0hfXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0NPTkZJR19PUFRJT05TX0gKLSNpbmNsdWRlIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBQTEFURk9STS1TUEVDSUZJQyBDT05GSUdVUkFUSU9OIE1BQ1JPUyAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVzZSBtYWNyb3MgY2FuIGJlIHRvZ2dsZWQgdG8gc3VpdCBhIHNwZWNpZmljIHN5c3RlbS4gIFRoZSBjdXJyZW50ICAgKi8KLSAgLyogb25lcyBhcmUgZGVmYXVsdHMgdXNlZCB0byBjb21waWxlIEZyZWVUeXBlIGluIGFuIEFOU0kgQyBlbnZpcm9ubWVudCAgICovCi0gIC8qICgxNmJpdCBjb21waWxlcnMgYXJlIGFsc28gc3VwcG9ydGVkKS4gIENvcHkgdGhpcyBmaWxlIHRvIHlvdXIgb3duICAgICAqLwotICAvKiBgYnVpbGRzLzxzeXN0ZW0+JyBkaXJlY3RvcnksIGFuZCBlZGl0IGl0IHRvIHBvcnQgdGhlIGVuZ2luZS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogVGhlcmUgYXJlIHN5c3RlbXMgKGxpa2UgdGhlIFRleGFzIEluc3RydW1lbnRzICdDNTR4KSB3aGVyZSBhIGBjaGFyJyAqLwotICAvKiBoYXMgMTYgYml0cy4gIEFOU0kgQyBzYXlzIHRoYXQgc2l6ZW9mKGNoYXIpIGlzIGFsd2F5cyAxLiAgU2luY2UgYW4gICovCi0gIC8qIGBpbnQnIGhhcyAxNiBiaXRzIGFsc28gZm9yIHRoaXMgc3lzdGVtLCBzaXplb2YoaW50KSBnaXZlcyAxIHdoaWNoICAgKi8KLSAgLyogaXMgcHJvYmFibHkgdW5leHBlY3RlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIGBDSEFSX0JJVCcgKGRlZmluZWQgaW4gbGltaXRzLmgpIGdpdmVzIHRoZSBudW1iZXIgb2YgYml0cyBpbiBhICAgICAgKi8KLSAgLyogYGNoYXInIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWZuZGVmIEZUX0NIQVJfQklUCi0jZGVmaW5lIEZUX0NIQVJfQklUICBDSEFSX0JJVAotI2VuZGlmCi0KLQotICAvKiBUaGUgc2l6ZSBvZiBhbiBgaW50JyB0eXBlLiAgKi8KLSNpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJTlRfTUFYID09IDB4RkZGRlVMCi0jZGVmaW5lIEZUX1NJWkVPRl9JTlQgICgxNiAvIEZUX0NIQVJfQklUKQotI2VsaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUlOVF9NQVggPT0gMHhGRkZGRkZGRlVMCi0jZGVmaW5lIEZUX1NJWkVPRl9JTlQgICgzMiAvIEZUX0NIQVJfQklUKQotI2VsaWYgRlRfVUlOVF9NQVggPiAweEZGRkZGRkZGVUwgJiYgRlRfVUlOVF9NQVggPT0gMHhGRkZGRkZGRkZGRkZGRkZGVUwKLSNkZWZpbmUgRlRfU0laRU9GX0lOVCAgKDY0IC8gRlRfQ0hBUl9CSVQpCi0jZWxzZQotI2Vycm9yICJVbnN1cHBvcnRlZCBzaXplIG9mIGBpbnQnIHR5cGUhIgotI2VuZGlmCi0KLSAgLyogVGhlIHNpemUgb2YgYSBgbG9uZycgdHlwZS4gIEEgZml2ZS1ieXRlIGBsb25nJyAoYXMgdXNlZCBlLmcuIG9uIHRoZSAqLwotICAvKiBETTY0MikgaXMgcmVjb2duaXplZCBidXQgYXZvaWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxPTkdfTUFYID09IDB4RkZGRkZGRkZVTAotI2RlZmluZSBGVF9TSVpFT0ZfTE9ORyAgKDMyIC8gRlRfQ0hBUl9CSVQpCi0jZWxpZiBGVF9VTE9OR19NQVggPiAweEZGRkZGRkZGVUwgJiYgRlRfVUxPTkdfTUFYID09IDB4RkZGRkZGRkZGRlVMCi0jZGVmaW5lIEZUX1NJWkVPRl9MT05HICAoMzIgLyBGVF9DSEFSX0JJVCkKLSNlbGlmIEZUX1VMT05HX01BWCA+IDB4RkZGRkZGRkZVTCAmJiBGVF9VTE9OR19NQVggPT0gMHhGRkZGRkZGRkZGRkZGRkZGVUwKLSNkZWZpbmUgRlRfU0laRU9GX0xPTkcgICg2NCAvIEZUX0NIQVJfQklUKQotI2Vsc2UKLSNlcnJvciAiVW5zdXBwb3J0ZWQgc2l6ZSBvZiBgbG9uZycgdHlwZSEiCi0jZW5kaWYKLQotCi0gIC8qIEZUX1VOVVNFRCBpcyBhIG1hY3JvIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIGdpdmVuIHBhcmFtZXRlciBpcyBub3QgICovCi0gIC8qIHVzZWQgLS0gdGhpcyBpcyBvbmx5IHVzZWQgdG8gZ2V0IHJpZCBvZiB1bnBsZWFzYW50IGNvbXBpbGVyIHdhcm5pbmdzICovCi0jaWZuZGVmIEZUX1VOVVNFRAotI2RlZmluZSBGVF9VTlVTRUQoIGFyZyApICAoIChhcmcpID0gKGFyZykgKQotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgQVVUT01BVElDIENPTkZJR1VSQVRJT04gTUFDUk9TICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlc2UgbWFjcm9zIGFyZSBjb21wdXRlZCBmcm9tIHRoZSBvbmVzIGRlZmluZWQgYWJvdmUuICBEb24ndCB0b3VjaCAgICovCi0gIC8qIHRoZWlyIGRlZmluaXRpb24sIHVubGVzcyB5b3Uga25vdyBwcmVjaXNlbHkgd2hhdCB5b3UgYXJlIGRvaW5nLiAgTm8gICAqLwotICAvKiBwb3J0ZXIgc2hvdWxkIG5lZWQgdG8gbWVzcyB3aXRoIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNYWMgc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhpcyBpcyB0aGUgb25seSBuZWNlc3NhcnkgY2hhbmdlLCBzbyBpdCBpcyBkZWZpbmVkIGhlcmUgaW5zdGVhZCAgICAqLwotICAvKiAgIHByb3ZpZGluZyBhIG5ldyBjb25maWd1cmF0aW9uIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWYgZGVmaW5lZCggX19BUFBMRV9fICkgfHwgKCBkZWZpbmVkKCBfX01XRVJLU19fICkgJiYgZGVmaW5lZCggbWFjaW50b3NoICkgKQotICAvKiBubyBDYXJib24gZnJhbWV3b3JrcyBmb3IgNjRiaXQgMTAuNC54ICovCi0gIC8qIEF2YWlsYWJpbGl0eU1hY3Jvcy5oIGlzIGF2YWlsYWJsZSBzaW5jZSBNYWMgT1MgWCAxMC4yLCAgICAgICAgKi8KLSAgLyogc28gZ3Vlc3MgdGhlIHN5c3RlbSB2ZXJzaW9uIGJ5IG1heGltdW0gZXJybm8gYmVmb3JlIGluY2x1c2lvbiAqLwotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWZkZWYgRUNBTkNFTEVEIC8qIGRlZmluZWQgc2luY2UgMTAuMiAqLwotI2luY2x1ZGUgIkF2YWlsYWJpbGl0eU1hY3Jvcy5oIgotI2VuZGlmCi0jaWYgZGVmaW5lZCggX19MUDY0X18gKSAmJiBcCi0gICAgKCBNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8PSBNQUNfT1NfWF9WRVJTSU9OXzEwXzQgKQotI3VuZGVmIEZUX01BQ0lOVE9TSAotI2VuZGlmCi0KLSNlbGlmIGRlZmluZWQoIF9fU0NfXyApIHx8IGRlZmluZWQoIF9fTVJDX18gKQotICAvKiBDbGFzc2ljIE1hY09TIGNvbXBpbGVycyAqLwotI2luY2x1ZGUgIkNvbmRpdGlvbmFsTWFjcm9zLmgiCi0jaWYgVEFSR0VUX09TX01BQwotI2RlZmluZSBGVF9NQUNJTlRPU0ggMQotI2VuZGlmCi0KLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmFzaWNfdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ludDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3IgYSAxNmJpdCBzaWduZWQgaW50ZWdlciB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzaWduZWQgc2hvcnQgIEZUX0ludDE2OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVUludDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciBhIDE2Yml0IHVuc2lnbmVkIGludGVnZXIgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBGVF9VSW50MTY7Ci0KLSAgLyogKi8KLQotCi0gIC8qIHRoaXMgI2lmIDAgLi4uICNlbmRpZiBjbGF1c2UgaXMgZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMgKi8KLSNpZiAwCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciBhIDMyYml0IHNpZ25lZCBpbnRlZ2VyIHR5cGUuICBUaGUgc2l6ZSBkZXBlbmRzIG9uICAgICovCi0gIC8qICAgIHRoZSBjb25maWd1cmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzaWduZWQgWFhYICBGVF9JbnQzMjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciBhIDMyYml0IHVuc2lnbmVkIGludGVnZXIgdHlwZS4gIFRoZSBzaXplIGRlcGVuZHMgb24gICovCi0gIC8qICAgIHRoZSBjb25maWd1cmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB1bnNpZ25lZCBYWFggIEZUX1VJbnQzMjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ludDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciBhIDY0Yml0IHNpZ25lZCBpbnRlZ2VyIHR5cGUuICBUaGUgc2l6ZSBkZXBlbmRzIG9uICAgICovCi0gIC8qICAgIHRoZSBjb25maWd1cmF0aW9uLiAgT25seSBkZWZpbmVkIGlmIHRoZXJlIGlzIHJlYWwgNjRiaXQgc3VwcG9ydDsgICAqLwotICAvKiAgICBvdGhlcndpc2UsIGl0IGdldHMgZW11bGF0ZWQgd2l0aCBhIHN0cnVjdHVyZSAoaWYgbmVjZXNzYXJ5KS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc2lnbmVkIFhYWCAgRlRfSW50NjQ7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VSW50NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3IgYSA2NGJpdCB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUuICBUaGUgc2l6ZSBkZXBlbmRzIG9uICAqLwotICAvKiAgICB0aGUgY29uZmlndXJhdGlvbi4gIE9ubHkgZGVmaW5lZCBpZiB0aGVyZSBpcyByZWFsIDY0Yml0IHN1cHBvcnQ7ICAgKi8KLSAgLyogICAgb3RoZXJ3aXNlLCBpdCBnZXRzIGVtdWxhdGVkIHdpdGggYSBzdHJ1Y3R1cmUgKGlmIG5lY2Vzc2FyeSkuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHVuc2lnbmVkIFhYWCAgRlRfVUludDY0OwotCi0gIC8qICovCi0KLSNlbmRpZgotCi0jaWYgRlRfU0laRU9GX0lOVCA9PSAoMzIgLyBGVF9DSEFSX0JJVCkKLQotICB0eXBlZGVmIHNpZ25lZCBpbnQgICAgICBGVF9JbnQzMjsKLSAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgRlRfVUludDMyOwotCi0jZWxpZiBGVF9TSVpFT0ZfTE9ORyA9PSAoMzIgLyBGVF9DSEFSX0JJVCkKLQotICB0eXBlZGVmIHNpZ25lZCBsb25nICAgICBGVF9JbnQzMjsKLSAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgRlRfVUludDMyOwotCi0jZWxzZQotI2Vycm9yICJubyAzMmJpdCB0eXBlIGZvdW5kIC0tIHBsZWFzZSBjaGVjayB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZXMiCi0jZW5kaWYKLQotCi0gIC8qIGxvb2sgdXAgYW4gaW50ZWdlciB0eXBlIHRoYXQgaXMgYXQgbGVhc3QgMzIgYml0cyAqLwotI2lmIEZUX1NJWkVPRl9JTlQgPj0gKDMyIC8gRlRfQ0hBUl9CSVQpCi0KLSAgdHlwZWRlZiBpbnQgICAgICAgICAgICBGVF9GYXN0OwotICB0eXBlZGVmIHVuc2lnbmVkIGludCAgIEZUX1VGYXN0OwotCi0jZWxpZiBGVF9TSVpFT0ZfTE9ORyA+PSAoMzIgLyBGVF9DSEFSX0JJVCkKLQotICB0eXBlZGVmIGxvbmcgICAgICAgICAgIEZUX0Zhc3Q7Ci0gIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgRlRfVUZhc3Q7Ci0KLSNlbmRpZgotCi0KLSAgLyogZGV0ZXJtaW5lIHdoZXRoZXIgd2UgaGF2ZSBhIDY0LWJpdCBpbnQgdHlwZSBmb3IgcGxhdGZvcm1zIHdpdGhvdXQgKi8KLSAgLyogQXV0b2NvbmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZiBGVF9TSVpFT0ZfTE9ORyA9PSAoNjQgLyBGVF9DSEFSX0JJVCkKLQotICAvKiBGVF9MT05HNjQgbXVzdCBiZSBkZWZpbmVkIGlmIGEgNjQtYml0IHR5cGUgaXMgYXZhaWxhYmxlICovCi0jZGVmaW5lIEZUX0xPTkc2NAotI2RlZmluZSBGVF9JTlQ2NCAgIGxvbmcKLSNkZWZpbmUgRlRfVUlOVDY0ICB1bnNpZ25lZCBsb25nCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIDY0LWJpdCBkYXRhIHR5cGUgbWF5IGNyZWF0ZSBjb21waWxhdGlvbiBwcm9ibGVtcyBpZiB5b3UgY29tcGlsZSAgICAgKi8KLSAgLyogaW4gc3RyaWN0IEFOU0kgbW9kZS4gIFRvIGF2b2lkIHRoZW0sIHdlIGRpc2FibGUgb3RoZXIgNjQtYml0IGRhdGEgICAgICovCi0gIC8qIHR5cGVzIGlmIF9fU1REQ19fIGlzIGRlZmluZWQuICBZb3UgY2FuIGhvd2V2ZXIgaWdub3JlIHRoaXMgcnVsZSAgICAgICAqLwotICAvKiBieSBkZWZpbmluZyB0aGUgRlRfQ09ORklHX09QVElPTl9GT1JDRV9JTlQ2NCBjb25maWd1cmF0aW9uIG1hY3JvLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZWxpZiAhZGVmaW5lZCggX19TVERDX18gKSB8fCBkZWZpbmVkKCBGVF9DT05GSUdfT1BUSU9OX0ZPUkNFX0lOVDY0ICkKLQotI2lmIGRlZmluZWQoIF9NU0NfVkVSICkgJiYgX01TQ19WRVIgPj0gOTAwICAvKiBWaXN1YWwgQysrIChhbmQgSW50ZWwgQysrKSAqLwotCi0gIC8qIHRoaXMgY29tcGlsZXIgcHJvdmlkZXMgdGhlIF9faW50NjQgdHlwZSAqLwotI2RlZmluZSBGVF9MT05HNjQKLSNkZWZpbmUgRlRfSU5UNjQgICBfX2ludDY0Ci0jZGVmaW5lIEZUX1VJTlQ2NCAgdW5zaWduZWQgX19pbnQ2NAotCi0jZWxpZiBkZWZpbmVkKCBfX0JPUkxBTkRDX18gKSAgLyogQm9ybGFuZCBDKysgKi8KLQotICAvKiBYWFhYOiBXZSBzaG91bGQgcHJvYmFibHkgY2hlY2sgdGhlIHZhbHVlIG9mIF9fQk9STEFORENfXyBpbiBvcmRlciAqLwotICAvKiAgICAgICB0byB0ZXN0IHRoZSBjb21waWxlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIHRoaXMgY29tcGlsZXIgcHJvdmlkZXMgdGhlIF9faW50NjQgdHlwZSAqLwotI2RlZmluZSBGVF9MT05HNjQKLSNkZWZpbmUgRlRfSU5UNjQgICBfX2ludDY0Ci0jZGVmaW5lIEZUX1VJTlQ2NCAgdW5zaWduZWQgX19pbnQ2NAotCi0jZWxpZiBkZWZpbmVkKCBfX1dBVENPTUNfXyApICAgLyogV2F0Y29tIEMrKyAqLwotCi0gIC8qIFdhdGNvbSBkb2Vzbid0IHByb3ZpZGUgNjQtYml0IGRhdGEgdHlwZXMgKi8KLQotI2VsaWYgZGVmaW5lZCggX19NV0VSS1NfXyApICAgIC8qIE1ldHJvd2Vya3MgQ29kZVdhcnJpb3IgKi8KLQotI2RlZmluZSBGVF9MT05HNjQKLSNkZWZpbmUgRlRfSU5UNjQgICBsb25nIGxvbmcgaW50Ci0jZGVmaW5lIEZUX1VJTlQ2NCAgdW5zaWduZWQgbG9uZyBsb25nIGludAotCi0jZWxpZiBkZWZpbmVkKCBfX0dOVUNfXyApCi0KLSAgLyogR0NDIHByb3ZpZGVzIHRoZSBgbG9uZyBsb25nJyB0eXBlICovCi0jZGVmaW5lIEZUX0xPTkc2NAotI2RlZmluZSBGVF9JTlQ2NCAgIGxvbmcgbG9uZyBpbnQKLSNkZWZpbmUgRlRfVUlOVDY0ICB1bnNpZ25lZCBsb25nIGxvbmcgaW50Ci0KLSNlbmRpZiAvKiBfTVNDX1ZFUiAqLwotCi0jZW5kaWYgLyogRlRfU0laRU9GX0xPTkcgPT0gKDY0IC8gRlRfQ0hBUl9CSVQpICovCi0KLSNpZmRlZiBGVF9MT05HNjQKLSAgdHlwZWRlZiBGVF9JTlQ2NCAgIEZUX0ludDY0OwotICB0eXBlZGVmIEZUX1VJTlQ2NCAgRlRfVUludDY0OwotI2VuZGlmCi0KLQotI2RlZmluZSBGVF9CRUdJTl9TVE1OVCAgZG8gewotI2RlZmluZSBGVF9FTkRfU1RNTlQgICAgfSB3aGlsZSAoIDAgKQotI2RlZmluZSBGVF9EVU1NWV9TVE1OVCAgRlRfQkVHSU5fU1RNTlQgRlRfRU5EX1NUTU5UCi0KLQotI2lmZGVmIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKLQotI2RlZmluZSBGVF9MT0NBTCggeCApICAgICAgc3RhdGljICB4Ci0jZGVmaW5lIEZUX0xPQ0FMX0RFRiggeCApICBzdGF0aWMgIHgKLQotI2Vsc2UKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX0xPQ0FMKCB4ICkgICAgICBleHRlcm4gIkMiICB4Ci0jZGVmaW5lIEZUX0xPQ0FMX0RFRiggeCApICBleHRlcm4gIkMiICB4Ci0jZWxzZQotI2RlZmluZSBGVF9MT0NBTCggeCApICAgICAgZXh0ZXJuICB4Ci0jZGVmaW5lIEZUX0xPQ0FMX0RFRiggeCApICB4Ci0jZW5kaWYKLQotI2VuZGlmIC8qIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QgKi8KLQotI2RlZmluZSBGVF9MT0NBTF9BUlJBWSggeCApICAgICAgZXh0ZXJuIGNvbnN0ICB4Ci0jZGVmaW5lIEZUX0xPQ0FMX0FSUkFZX0RFRiggeCApICBjb25zdCAgeAotCi0KLSNpZm5kZWYgRlRfQkFTRQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfQkFTRSggeCApICBleHRlcm4gIkMiICB4Ci0jZWxzZQotI2RlZmluZSBGVF9CQVNFKCB4ICkgIGV4dGVybiAgeAotI2VuZGlmCi0KLSNlbmRpZiAvKiAhRlRfQkFTRSAqLwotCi0KLSNpZm5kZWYgRlRfQkFTRV9ERUYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX0JBU0VfREVGKCB4ICkgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0JBU0VfREVGKCB4ICkgIHgKLSNlbmRpZgotCi0jZW5kaWYgLyogIUZUX0JBU0VfREVGICovCi0KLQotI2lmbmRlZiBGVF9FWFBPUlQKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX0VYUE9SVCggeCApICBleHRlcm4gIkMiICB4Ci0jZWxzZQotI2RlZmluZSBGVF9FWFBPUlQoIHggKSAgZXh0ZXJuICB4Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9FWFBPUlQgKi8KLQotCi0jaWZuZGVmIEZUX0VYUE9SVF9ERUYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX0VYUE9SVF9ERUYoIHggKSAgZXh0ZXJuICJDIiAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfRVhQT1JUX0RFRiggeCApICBleHRlcm4gIHgKLSNlbmRpZgotCi0jZW5kaWYgLyogIUZUX0VYUE9SVF9ERUYgKi8KLQotCi0jaWZuZGVmIEZUX0VYUE9SVF9WQVIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX0VYUE9SVF9WQVIoIHggKSAgZXh0ZXJuICJDIiAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfRVhQT1JUX1ZBUiggeCApICBleHRlcm4gIHgKLSNlbmRpZgotCi0jZW5kaWYgLyogIUZUX0VYUE9SVF9WQVIgKi8KLQotICAvKiBUaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgbmVlZGVkIHRvIGNvbXBpbGUgdGhlIGxpYnJhcnkgd2l0aCBhICAgKi8KLSAgLyogQysrIGNvbXBpbGVyIGFuZCB3aXRoIDE2Yml0IGNvbXBpbGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIFRoaXMgaXMgc3BlY2lhbC4gIFdpdGhpbiBDKyssIHlvdSBtdXN0IHNwZWNpZnkgYGV4dGVybiAiQyInIGZvciAqLwotICAvKiBmdW5jdGlvbnMgd2hpY2ggYXJlIHVzZWQgdmlhIGZ1bmN0aW9uIHBvaW50ZXJzLCBhbmQgeW91IGFsc28gICAgKi8KLSAgLyogbXVzdCBkbyB0aGF0IGZvciBzdHJ1Y3R1cmVzIHdoaWNoIGNvbnRhaW4gZnVuY3Rpb24gcG9pbnRlcnMgdG8gICovCi0gIC8qIGFzc3VyZSBDIGxpbmthZ2UgLS0gaXQncyBub3QgcG9zc2libGUgdG8gaGF2ZSAobG9jYWwpIGFub255bW91cyAqLwotICAvKiBmdW5jdGlvbnMgd2hpY2ggYXJlIGFjY2Vzc2VkIGJ5IChnbG9iYWwpIGZ1bmN0aW9uIHBvaW50ZXJzLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGVF9DQUxMQkFDS19ERUYgaXMgdXNlZCB0byBfZGVmaW5lXyBhIGNhbGxiYWNrIGZ1bmN0aW9uLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZUX0NBTExCQUNLX1RBQkxFIGlzIHVzZWQgdG8gX2RlY2xhcmVfIGEgY29uc3RhbnQgdmFyaWFibGUgdGhhdCAqLwotICAvKiBjb250YWlucyBwb2ludGVycyB0byBjYWxsYmFjayBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZUX0NBTExCQUNLX1RBQkxFX0RFRiBpcyB1c2VkIHRvIF9kZWZpbmVfIGEgY29uc3RhbnQgdmFyaWFibGUgICAqLwotICAvKiB0aGF0IGNvbnRhaW5zIHBvaW50ZXJzIHRvIGNhbGxiYWNrIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTb21lIDE2Yml0IGNvbXBpbGVycyBoYXZlIHRvIHJlZGVmaW5lIHRoZXNlIG1hY3JvcyB0byBpbnNlcnQgICAgKi8KLSAgLyogdGhlIGluZmFtb3VzIGBfY2RlY2wnIG9yIGBfX2Zhc3RjYWxsJyBkZWNsYXJhdGlvbnMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9DQUxMQkFDS19ERUYKLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9DQUxMQkFDS19ERUYoIHggKSAgZXh0ZXJuICJDIiAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfREVGKCB4ICkgIHN0YXRpYyAgeAotI2VuZGlmCi0jZW5kaWYgLyogRlRfQ0FMTEJBQ0tfREVGICovCi0KLSNpZm5kZWYgRlRfQ0FMTEJBQ0tfVEFCTEUKLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9DQUxMQkFDS19UQUJMRSAgICAgIGV4dGVybiAiQyIKLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGICBleHRlcm4gIkMiCi0jZWxzZQotI2RlZmluZSBGVF9DQUxMQkFDS19UQUJMRSAgICAgIGV4dGVybgotI2RlZmluZSBGVF9DQUxMQkFDS19UQUJMRV9ERUYgIC8qIG5vdGhpbmcgKi8KLSNlbmRpZgotI2VuZGlmIC8qIEZUX0NBTExCQUNLX1RBQkxFICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX0ZUQ09ORklHX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9jb25maWcvZnRoZWFkZXIuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvY29uZmlnL2Z0aGVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MjM2MjkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9jb25maWcvZnRoZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDgzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGhlYWRlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQnVpbGQgbWFjcm9zIG9mIHRoZSBGcmVlVHlwZSAyIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwOCwgMjAxMCwgMjAxMiwgMjAxMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fRlRfSEVBREVSX0hfXwotI2RlZmluZSBfX0ZUX0hFQURFUl9IX18KLQotCi0gIC8qQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0JFR0lOX0hFQURFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgbWFjcm8gaXMgdXNlZCBpbiBhc3NvY2lhdGlvbiB3aXRoIEBGVF9FTkRfSEVBREVSIGluIGhlYWRlciAgICAqLwotICAvKiAgICBmaWxlcyB0byBlbnN1cmUgdGhhdCB0aGUgZGVjbGFyYXRpb25zIHdpdGhpbiBhcmUgcHJvcGVybHkgICAgICAgICAgKi8KLSAgLyogICAgZW5jYXBzdWxhdGVkIGluIGFuIGBleHRlcm4gIkMiIHsgLi4gfScgYmxvY2sgd2hlbiBpbmNsdWRlZCBmcm9tIGEgICovCi0gIC8qICAgIEMrKyBjb21waWxlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9CRUdJTl9IRUFERVIgIGV4dGVybiAiQyIgewotI2Vsc2UKLSNkZWZpbmUgRlRfQkVHSU5fSEVBREVSICAvKiBub3RoaW5nICovCi0jZW5kaWYKLQotCi0gIC8qQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VORF9IRUFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgbWFjcm8gaXMgdXNlZCBpbiBhc3NvY2lhdGlvbiB3aXRoIEBGVF9CRUdJTl9IRUFERVIgaW4gaGVhZGVyICAqLwotICAvKiAgICBmaWxlcyB0byBlbnN1cmUgdGhhdCB0aGUgZGVjbGFyYXRpb25zIHdpdGhpbiBhcmUgcHJvcGVybHkgICAgICAgICAgKi8KLSAgLyogICAgZW5jYXBzdWxhdGVkIGluIGFuIGBleHRlcm4gIkMiIHsgLi4gfScgYmxvY2sgd2hlbiBpbmNsdWRlZCBmcm9tIGEgICovCi0gIC8qICAgIEMrKyBjb21waWxlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9FTkRfSEVBREVSICB9Ci0jZWxzZQotI2RlZmluZSBGVF9FTkRfSEVBREVSICAvKiBub3RoaW5nICovCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQWxpYXNlcyBmb3IgdGhlIEZyZWVUeXBlIDIgcHVibGljIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZWFkZXJfZmlsZV9tYWNyb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBIZWFkZXIgRmlsZSBNYWNyb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBNYWNybyBkZWZpbml0aW9ucyB1c2VkIHRvICNpbmNsdWRlIHNwZWNpZmljIGhlYWRlciBmaWxlcy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgZGVmaW5lZCB0byB0aGUgbmFtZSBvZiBzcGVjaWZpYyAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGV+MiBoZWFkZXIgZmlsZXMuICBUaGV5IGNhbiBiZSB1c2VkIGRpcmVjdGx5IGluICNpbmNsdWRlICAgICovCi0gIC8qICAgIHN0YXRlbWVudHMgYXMgaW46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgI2luY2x1ZGUgRlRfRlJFRVRZUEVfSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICNpbmNsdWRlIEZUX01VTFRJUExFX01BU1RFUlNfSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAjaW5jbHVkZSBGVF9HTFlQSF9IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlcmUgYXJlIHNldmVyYWwgcmVhc29ucyB3aHkgd2UgYXJlIG5vdyB1c2luZyBtYWNyb3MgdG8gbmFtZSAgICAgICovCi0gIC8qICAgIHB1YmxpYyBoZWFkZXIgZmlsZXMuICBUaGUgZmlyc3Qgb25lIGlzIHRoYXQgc3VjaCBtYWNyb3MgYXJlIG5vdCAgICAqLwotICAvKiAgICBsaW1pdGVkIHRvIHRoZSBpbmZhbW91cyA4LjN+bmFtaW5nIHJ1bGUgcmVxdWlyZWQgYnkgRE9TIChhbmQgICAgICAgKi8KLSAgLyogICAgYEZUX01VTFRJUExFX01BU1RFUlNfSCcgaXMgYSBsb3QgbW9yZSBtZWFuaW5nZnVsIHRoYW4gYGZ0bW0uaCcpLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgc2Vjb25kIHJlYXNvbiBpcyB0aGF0IGl0IGFsbG93cyBmb3IgbW9yZSBmbGV4aWJpbGl0eSBpbiB0aGUgICAgKi8KLSAgLyogICAgd2F5IEZyZWVUeXBlfjIgaXMgaW5zdGFsbGVkIG9uIGEgZ2l2ZW4gc3lzdGVtLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIGNvbmZpZ3VyYXRpb24gZmlsZXMgKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQ09ORklHX0NPTkZJR19ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcKLSAgICogICBGcmVlVHlwZX4yIGNvbmZpZ3VyYXRpb24gZGF0YS4KLSAgICoKLSAgICovCi0jaWZuZGVmIEZUX0NPTkZJR19DT05GSUdfSAotI2RlZmluZSBGVF9DT05GSUdfQ09ORklHX0ggIDxjb25maWcvZnRjb25maWcuaD4KLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZwotICAgKiAgIEZyZWVUeXBlfjIgaW50ZXJmYWNlIHRvIHRoZSBzdGFuZGFyZCBDIGxpYnJhcnkgZnVuY3Rpb25zLgotICAgKgotICAgKi8KLSNpZm5kZWYgRlRfQ09ORklHX1NUQU5EQVJEX0xJQlJBUllfSAotI2RlZmluZSBGVF9DT05GSUdfU1RBTkRBUkRfTElCUkFSWV9IICA8Y29uZmlnL2Z0c3RkbGliLmg+Ci0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9DT05GSUdfT1BUSU9OU19ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcKLSAgICogICBGcmVlVHlwZX4yIHByb2plY3Qtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBvcHRpb25zLgotICAgKgotICAgKi8KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTlNfSAotI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OU19IICA8Y29uZmlnL2Z0b3B0aW9uLmg+Ci0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9DT05GSUdfTU9EVUxFU19ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgbGlzdCBvZiBGcmVlVHlwZX4yIG1vZHVsZXMgdGhhdCBhcmUgc3RhdGljYWxseSBsaW5rZWQgdG8gbmV3IGxpYnJhcnkKLSAgICogICBpbnN0YW5jZXMgaW4gQEZUX0luaXRfRnJlZVR5cGUuCi0gICAqCi0gICAqLwotI2lmbmRlZiBGVF9DT05GSUdfTU9EVUxFU19ICi0jZGVmaW5lIEZUX0NPTkZJR19NT0RVTEVTX0ggIDxjb25maWcvZnRtb2R1bGUuaD4KLSNlbmRpZgotCi0gIC8qICovCi0KLSAgLyogcHVibGljIGhlYWRlcnMgKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfRlJFRVRZUEVfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIGJhc2UgRnJlZVR5cGV+MiBBUEkuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9GUkVFVFlQRV9IICA8ZnJlZXR5cGUuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9FUlJPUlNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIGxpc3Qgb2YgRnJlZVR5cGV+MiBlcnJvciBjb2RlcyAoYW5kIG1lc3NhZ2VzKS4KLSAgICoKLSAgICogICBJdCBpcyBpbmNsdWRlZCBieSBARlRfRlJFRVRZUEVfSC4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0VSUk9SU19IICA8ZnRlcnJvcnMuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9NT0RVTEVfRVJST1JTX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBsaXN0IG9mIEZyZWVUeXBlfjIgbW9kdWxlIGVycm9yIG9mZnNldHMgKGFuZCBtZXNzYWdlcykuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9NT0RVTEVfRVJST1JTX0ggIDxmdG1vZGVyci5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX1NZU1RFTV9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgRnJlZVR5cGV+MiBpbnRlcmZhY2UgdG8gbG93LWxldmVsIG9wZXJhdGlvbnMgKGkuZS4sIG1lbW9yeSBtYW5hZ2VtZW50Ci0gICAqICAgYW5kIHN0cmVhbSBpL28pLgotICAgKgotICAgKiAgIEl0IGlzIGluY2x1ZGVkIGJ5IEBGVF9GUkVFVFlQRV9ILgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfU1lTVEVNX0ggIDxmdHN5c3RlbS5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0lNQUdFX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0eXBlCi0gICAqICAgZGVmaW5pdGlvbnMgcmVsYXRlZCB0byBnbHlwaCBpbWFnZXMgKGkuZS4sIGJpdG1hcHMsIG91dGxpbmVzLAotICAgKiAgIHNjYW4tY29udmVydGVyIHBhcmFtZXRlcnMpLgotICAgKgotICAgKiAgIEl0IGlzIGluY2x1ZGVkIGJ5IEBGVF9GUkVFVFlQRV9ILgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfSU1BR0VfSCAgPGZ0aW1hZ2UuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9UWVBFU19ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgYmFzaWMgZGF0YSB0eXBlcyBkZWZpbmVkIGJ5IEZyZWVUeXBlfjIuCi0gICAqCi0gICAqICAgSXQgaXMgaW5jbHVkZWQgYnkgQEZUX0ZSRUVUWVBFX0guCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9UWVBFU19IICA8ZnR0eXBlcy5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0xJU1RfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIGxpc3QgbWFuYWdlbWVudCBBUEkgb2YgRnJlZVR5cGV+Mi4KLSAgICoKLSAgICogICAoTW9zdCBhcHBsaWNhdGlvbnMgd2lsbCBuZXZlciBuZWVkIHRvIGluY2x1ZGUgdGhpcyBmaWxlLikKLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0xJU1RfSCAgPGZ0bGlzdC5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX09VVExJTkVfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIHNjYWxhYmxlIG91dGxpbmUgbWFuYWdlbWVudCBBUEkgb2YgRnJlZVR5cGV+Mi4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX09VVExJTkVfSCAgPGZ0b3V0bG4uaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9TSVpFU19ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgQVBJIHdoaWNoIG1hbmFnZXMgbXVsdGlwbGUgQEZUX1NpemUgb2JqZWN0cyBwZXIgZmFjZS4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX1NJWkVTX0ggIDxmdHNpemVzLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfTU9EVUxFX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBtb2R1bGUgbWFuYWdlbWVudCBBUEkgb2YgRnJlZVR5cGV+Mi4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX01PRFVMRV9IICA8ZnRtb2RhcGkuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9SRU5ERVJfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIHJlbmRlcmVyIG1vZHVsZSBtYW5hZ2VtZW50IEFQSSBvZiBGcmVlVHlwZX4yLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfUkVOREVSX0ggIDxmdHJlbmRlci5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0FVVE9ISU5URVJfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nCi0gICAqICAgc3RydWN0dXJlcyBhbmQgbWFjcm9zIHJlbGF0ZWQgdG8gdGhlIGF1dG8taGludGluZyBtb2R1bGUuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9BVVRPSElOVEVSX0ggIDxmdGF1dG9oLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQ0ZGX0RSSVZFUl9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcKLSAgICogICBzdHJ1Y3R1cmVzIGFuZCBtYWNyb3MgcmVsYXRlZCB0byB0aGUgQ0ZGIGRyaXZlciBtb2R1bGUuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9DRkZfRFJJVkVSX0ggIDxmdGNmZmRydi5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX1RSVUVUWVBFX0RSSVZFUl9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcKLSAgICogICBzdHJ1Y3R1cmVzIGFuZCBtYWNyb3MgcmVsYXRlZCB0byB0aGUgVHJ1ZVR5cGUgZHJpdmVyIG1vZHVsZS4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX1RSVUVUWVBFX0RSSVZFUl9IICA8ZnR0dGRydi5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX1RZUEUxX1RBQkxFU19ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgdHlwZXMgYW5kIEFQSSBzcGVjaWZpYyB0byB0aGUgVHlwZX4xIGZvcm1hdC4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX1RZUEUxX1RBQkxFU19IICA8dDF0YWJsZXMuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9UUlVFVFlQRV9JRFNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIGVudW1lcmF0aW9uIHZhbHVlcyB3aGljaCBpZGVudGlmeSBuYW1lIHN0cmluZ3MsIGxhbmd1YWdlcywgZW5jb2RpbmdzLAotICAgKiAgIGV0Yy4gIFRoaXMgZmlsZSByZWFsbHkgY29udGFpbnMgYSBfbGFyZ2VfIHNldCBvZiBjb25zdGFudCBtYWNybwotICAgKiAgIGRlZmluaXRpb25zLCB0YWtlbiBmcm9tIHRoZSBUcnVlVHlwZSBhbmQgT3BlblR5cGUgc3BlY2lmaWNhdGlvbnMuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9UUlVFVFlQRV9JRFNfSCAgPHR0bmFtZWlkLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfVFJVRVRZUEVfVEFCTEVTX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICB0eXBlcyBhbmQgQVBJIHNwZWNpZmljIHRvIHRoZSBUcnVlVHlwZSAoYXMgd2VsbCBhcyBPcGVuVHlwZSkgZm9ybWF0LgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfVFJVRVRZUEVfVEFCTEVTX0ggIDx0dHRhYmxlcy5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX1RSVUVUWVBFX1RBR1NfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIGRlZmluaXRpb25zIG9mIFRydWVUeXBlIGZvdXItYnl0ZSBgdGFncycgd2hpY2ggaWRlbnRpZnkgYmxvY2tzIGluCi0gICAqICAgU0ZOVC1iYXNlZCBmb250IGZvcm1hdHMgKGkuZS4sIFRydWVUeXBlIGFuZCBPcGVuVHlwZSkuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9UUlVFVFlQRV9UQUdTX0ggIDx0dHRhZ3MuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9CREZfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIGRlZmluaXRpb25zIG9mIGFuIEFQSSB3aGljaCBhY2Nlc3NlcyBCREYtc3BlY2lmaWMgc3RyaW5ncyBmcm9tIGEKLSAgICogICBmYWNlLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQkRGX0ggIDxmdGJkZi5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0NJRF9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgZGVmaW5pdGlvbnMgb2YgYW4gQVBJIHdoaWNoIGFjY2VzcyBDSUQgZm9udCBpbmZvcm1hdGlvbiBmcm9tIGEKLSAgICogICBmYWNlLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQ0lEX0ggIDxmdGNpZC5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0daSVBfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIGRlZmluaXRpb25zIG9mIGFuIEFQSSB3aGljaCBzdXBwb3J0cyBnemlwLWNvbXByZXNzZWQgZmlsZXMuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9HWklQX0ggIDxmdGd6aXAuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9MWldfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIGRlZmluaXRpb25zIG9mIGFuIEFQSSB3aGljaCBzdXBwb3J0cyBMWlctY29tcHJlc3NlZCBmaWxlcy4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0xaV19IICA8ZnRsencuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9CWklQMl9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgZGVmaW5pdGlvbnMgb2YgYW4gQVBJIHdoaWNoIHN1cHBvcnRzIGJ6aXAyLWNvbXByZXNzZWQgZmlsZXMuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9CWklQMl9IICA8ZnRiemlwMi5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX1dJTkZPTlRTX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBkZWZpbml0aW9ucyBvZiBhbiBBUEkgd2hpY2ggc3VwcG9ydHMgV2luZG93cyBGTlQgZmlsZXMuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9XSU5GT05UU19IICAgPGZ0d2luZm50Lmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfR0xZUEhfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEFQSSBvZiB0aGUgb3B0aW9uYWwgZ2x5cGggbWFuYWdlbWVudCBjb21wb25lbnQuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9HTFlQSF9IICA8ZnRnbHlwaC5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0JJVE1BUF9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgQVBJIG9mIHRoZSBvcHRpb25hbCBiaXRtYXAgY29udmVyc2lvbiBjb21wb25lbnQuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9CSVRNQVBfSCAgPGZ0Yml0bWFwLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQkJPWF9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgQVBJIG9mIHRoZSBvcHRpb25hbCBleGFjdCBib3VuZGluZyBib3ggY29tcHV0YXRpb24gcm91dGluZXMuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9CQk9YX0ggIDxmdGJib3guaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9DQUNIRV9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgQVBJIG9mIHRoZSBvcHRpb25hbCBGcmVlVHlwZX4yIGNhY2hlIHN1Yi1zeXN0ZW0uCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9DQUNIRV9IICA8ZnRjYWNoZS5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0NBQ0hFX0lNQUdFX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBgZ2x5cGggaW1hZ2UnIEFQSSBvZiB0aGUgRnJlZVR5cGV+MiBjYWNoZSBzdWItc3lzdGVtLgotICAgKgotICAgKiAgIEl0IGlzIHVzZWQgdG8gZGVmaW5lIGEgY2FjaGUgZm9yIEBGVF9HbHlwaCBlbGVtZW50cy4gIFlvdSBjYW4gYWxzbwotICAgKiAgIHVzZSB0aGUgQVBJIGRlZmluZWQgaW4gQEZUX0NBQ0hFX1NNQUxMX0JJVE1BUFNfSCBpZiB5b3Ugb25seSBuZWVkIHRvCi0gICAqICAgc3RvcmUgc21hbGwgZ2x5cGggYml0bWFwcywgYXMgaXQgd2lsbCB1c2UgbGVzcyBtZW1vcnkuCi0gICAqCi0gICAqICAgVGhpcyBtYWNybyBpcyBkZXByZWNhdGVkLiAgU2ltcGx5IGluY2x1ZGUgQEZUX0NBQ0hFX0ggdG8gaGF2ZSBhbGwKLSAgICogICBnbHlwaCBpbWFnZS1yZWxhdGVkIGNhY2hlIGRlY2xhcmF0aW9ucy4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0NBQ0hFX0lNQUdFX0ggIEZUX0NBQ0hFX0gKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9DQUNIRV9TTUFMTF9CSVRNQVBTX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBgc21hbGwgYml0bWFwcycgQVBJIG9mIHRoZSBGcmVlVHlwZX4yIGNhY2hlIHN1Yi1zeXN0ZW0uCi0gICAqCi0gICAqICAgSXQgaXMgdXNlZCB0byBkZWZpbmUgYSBjYWNoZSBmb3Igc21hbGwgZ2x5cGggYml0bWFwcyBpbiBhIHJlbGF0aXZlbHkKLSAgICogICBtZW1vcnktZWZmaWNpZW50IHdheS4gIFlvdSBjYW4gYWxzbyB1c2UgdGhlIEFQSSBkZWZpbmVkIGluCi0gICAqICAgQEZUX0NBQ0hFX0lNQUdFX0ggaWYgeW91IHdhbnQgdG8gY2FjaGUgYXJiaXRyYXJ5IGdseXBoIGltYWdlcywKLSAgICogICBpbmNsdWRpbmcgc2NhbGFibGUgb3V0bGluZXMuCi0gICAqCi0gICAqICAgVGhpcyBtYWNybyBpcyBkZXByZWNhdGVkLiAgU2ltcGx5IGluY2x1ZGUgQEZUX0NBQ0hFX0ggdG8gaGF2ZSBhbGwKLSAgICogICBzbWFsbCBiaXRtYXBzLXJlbGF0ZWQgY2FjaGUgZGVjbGFyYXRpb25zLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQ0FDSEVfU01BTExfQklUTUFQU19IICBGVF9DQUNIRV9ICi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQ0FDSEVfQ0hBUk1BUF9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgYGNoYXJtYXAnIEFQSSBvZiB0aGUgRnJlZVR5cGV+MiBjYWNoZSBzdWItc3lzdGVtLgotICAgKgotICAgKiAgIFRoaXMgbWFjcm8gaXMgZGVwcmVjYXRlZC4gIFNpbXBseSBpbmNsdWRlIEBGVF9DQUNIRV9IIHRvIGhhdmUgYWxsCi0gICAqICAgY2hhcm1hcC1iYXNlZCBjYWNoZSBkZWNsYXJhdGlvbnMuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9DQUNIRV9DSEFSTUFQX0ggIEZUX0NBQ0hFX0gKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9NQUNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIE1hY2ludG9zaC1zcGVjaWZpYyBGcmVlVHlwZX4yIEFQSS4gIFRoZSBsYXR0ZXIgaXMgdXNlZCB0byBhY2Nlc3MKLSAgICogICBmb250cyBlbWJlZGRlZCBpbiByZXNvdXJjZSBmb3Jrcy4KLSAgICoKLSAgICogICBUaGlzIGhlYWRlciBmaWxlIG11c3QgYmUgZXhwbGljaXRseSBpbmNsdWRlZCBieSBjbGllbnQgYXBwbGljYXRpb25zCi0gICAqICAgY29tcGlsZWQgb24gdGhlIE1hYyAobm90ZSB0aGF0IHRoZSBiYXNlIEFQSSBzdGlsbCB3b3JrcyB0aG91Z2gpLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfTUFDX0ggIDxmdG1hYy5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX01VTFRJUExFX01BU1RFUlNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIG9wdGlvbmFsIG11bHRpcGxlLW1hc3RlcnMgbWFuYWdlbWVudCBBUEkgb2YgRnJlZVR5cGV+Mi4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX01VTFRJUExFX01BU1RFUlNfSCAgPGZ0bW0uaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9TRk5UX05BTUVTX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBvcHRpb25hbCBGcmVlVHlwZX4yIEFQSSB3aGljaCBhY2Nlc3NlcyBlbWJlZGRlZCBgbmFtZScgc3RyaW5ncyBpbgotICAgKiAgIFNGTlQtYmFzZWQgZm9udCBmb3JtYXRzIChpLmUuLCBUcnVlVHlwZSBhbmQgT3BlblR5cGUpLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfU0ZOVF9OQU1FU19IICA8ZnRzbmFtZXMuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9PUEVOVFlQRV9WQUxJREFURV9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgb3B0aW9uYWwgRnJlZVR5cGV+MiBBUEkgd2hpY2ggdmFsaWRhdGVzIE9wZW5UeXBlIHRhYmxlcyAoQkFTRSwgR0RFRiwKLSAgICogICBHUE9TLCBHU1VCLCBKU1RGKS4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX09QRU5UWVBFX1ZBTElEQVRFX0ggIDxmdG90dmFsLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfR1hfVkFMSURBVEVfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIG9wdGlvbmFsIEZyZWVUeXBlfjIgQVBJIHdoaWNoIHZhbGlkYXRlcyBUcnVlVHlwZUdYL0FBVCB0YWJsZXMgKGZlYXQsCi0gICAqICAgbW9ydCwgbW9yeCwgYnNsbiwganVzdCwga2Vybiwgb3BiZCwgdHJhaywgcHJvcCkuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9HWF9WQUxJREFURV9IICA8ZnRneHZhbC5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX1BGUl9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgRnJlZVR5cGV+MiBBUEkgd2hpY2ggYWNjZXNzZXMgUEZSLXNwZWNpZmljIGRhdGEuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9QRlJfSCAgPGZ0cGZyLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfU1RST0tFUl9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgRnJlZVR5cGV+MiBBUEkgd2hpY2ggcHJvdmlkZXMgZnVuY3Rpb25zIHRvIHN0cm9rZSBvdXRsaW5lIHBhdGhzLgotICAgKi8KLSNkZWZpbmUgRlRfU1RST0tFUl9IICA8ZnRzdHJva2UuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9TWU5USEVTSVNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEZyZWVUeXBlfjIgQVBJIHdoaWNoIHBlcmZvcm1zIGFydGlmaWNpYWwgb2JsaXF1aW5nIGFuZCBlbWJvbGRlbmluZy4KLSAgICovCi0jZGVmaW5lIEZUX1NZTlRIRVNJU19IICA8ZnRzeW50aC5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX1hGUkVFODZfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEZyZWVUeXBlfjIgQVBJIHdoaWNoIHByb3ZpZGVzIGZ1bmN0aW9ucyBzcGVjaWZpYyB0byB0aGUgWEZyZWU4NiBhbmQKLSAgICogICBYLk9yZyBYMTEgc2VydmVycy4KLSAgICovCi0jZGVmaW5lIEZUX1hGUkVFODZfSCAgPGZ0eGY4Ni5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX1RSSUdPTk9NRVRSWV9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgRnJlZVR5cGV+MiBBUEkgd2hpY2ggcGVyZm9ybXMgdHJpZ29ub21ldHJpYyBjb21wdXRhdGlvbnMgKGUuZy4sCi0gICAqICAgY29zaW5lcyBhbmQgYXJjIHRhbmdlbnRzKS4KLSAgICovCi0jZGVmaW5lIEZUX1RSSUdPTk9NRVRSWV9IICA8ZnR0cmlnb24uaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9MQ0RfRklMVEVSX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBGcmVlVHlwZX4yIEFQSSB3aGljaCBwZXJmb3JtcyBjb2xvciBmaWx0ZXJpbmcgZm9yIHN1YnBpeGVsIHJlbmRlcmluZy4KLSAgICovCi0jZGVmaW5lIEZUX0xDRF9GSUxURVJfSCAgPGZ0bGNkZmlsLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfVU5QQVRFTlRFRF9ISU5USU5HX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBGcmVlVHlwZX4yIEFQSSB3aGljaCBwZXJmb3JtcyBjb2xvciBmaWx0ZXJpbmcgZm9yIHN1YnBpeGVsIHJlbmRlcmluZy4KLSAgICovCi0jZGVmaW5lIEZUX1VOUEFURU5URURfSElOVElOR19IICA8dHR1bnBhdC5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0lOQ1JFTUVOVEFMX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBGcmVlVHlwZX4yIEFQSSB3aGljaCBwZXJmb3JtcyBjb2xvciBmaWx0ZXJpbmcgZm9yIHN1YnBpeGVsIHJlbmRlcmluZy4KLSAgICovCi0jZGVmaW5lIEZUX0lOQ1JFTUVOVEFMX0ggIDxmdGluY3JlbS5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0dBU1BfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEZyZWVUeXBlfjIgQVBJIHdoaWNoIHJldHVybnMgZW50cmllcyBmcm9tIHRoZSBUcnVlVHlwZSBHQVNQIHRhYmxlLgotICAgKi8KLSNkZWZpbmUgRlRfR0FTUF9IICA8ZnRnYXNwLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQURWQU5DRVNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEZyZWVUeXBlfjIgQVBJIHdoaWNoIHJldHVybnMgaW5kaXZpZHVhbCBhbmQgcmFuZ2VkIGdseXBoIGFkdmFuY2VzLgotICAgKi8KLSNkZWZpbmUgRlRfQURWQU5DRVNfSCAgPGZ0YWR2YW5jLmg+Ci0KLQotICAvKiAqLwotCi0jZGVmaW5lIEZUX0VSUk9SX0RFRklOSVRJT05TX0ggIDxmdGVycmRlZi5oPgotCi0KLSAgLyogVGhlIGludGVybmFscyBvZiB0aGUgY2FjaGUgc3ViLXN5c3RlbSBhcmUgbm8gbG9uZ2VyIGV4cG9zZWQuICBXZSAqLwotICAvKiBkZWZhdWx0IHRvIEZUX0NBQ0hFX0ggYXQgdGhlIG1vbWVudCBqdXN0IGluIGNhc2UsIGJ1dCB3ZSBrbm93IG9mICovCi0gIC8qIG5vIHJvZ3VlIGNsaWVudCB0aGF0IHVzZXMgdGhlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9DQUNIRV9NQU5BR0VSX0ggICAgICAgICAgIDxmdGNhY2hlLmg+Ci0jZGVmaW5lIEZUX0NBQ0hFX0lOVEVSTkFMX01SVV9IICAgICAgPGZ0Y2FjaGUuaD4KLSNkZWZpbmUgRlRfQ0FDSEVfSU5URVJOQUxfTUFOQUdFUl9IICA8ZnRjYWNoZS5oPgotI2RlZmluZSBGVF9DQUNIRV9JTlRFUk5BTF9DQUNIRV9IICAgIDxmdGNhY2hlLmg+Ci0jZGVmaW5lIEZUX0NBQ0hFX0lOVEVSTkFMX0dMWVBIX0ggICAgPGZ0Y2FjaGUuaD4KLSNkZWZpbmUgRlRfQ0FDSEVfSU5URVJOQUxfSU1BR0VfSCAgICA8ZnRjYWNoZS5oPgotI2RlZmluZSBGVF9DQUNIRV9JTlRFUk5BTF9TQklUU19IICAgIDxmdGNhY2hlLmg+Ci0KLQotI2RlZmluZSBGVF9JTkNSRU1FTlRBTF9IICAgICAgICAgIDxmdGluY3JlbS5oPgotCi0jZGVmaW5lIEZUX1RSVUVUWVBFX1VOUEFURU5URURfSCAgPHR0dW5wYXQuaD4KLQotCi0gIC8qCi0gICAqIEluY2x1ZGUgaW50ZXJuYWwgaGVhZGVycyBkZWZpbml0aW9ucyBmcm9tIDxpbnRlcm5hbC8uLi4+Ci0gICAqIG9ubHkgd2hlbiBidWlsZGluZyB0aGUgbGlicmFyeS4KLSAgICovCi0jaWZkZWYgRlQyX0JVSUxEX0xJQlJBUlkKLSNkZWZpbmUgIEZUX0lOVEVSTkFMX0lOVEVSTkFMX0ggIDxpbnRlcm5hbC9pbnRlcm5hbC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfSU5URVJOQUxfSAotI2VuZGlmIC8qIEZUMl9CVUlMRF9MSUJSQVJZICovCi0KLQotI2VuZGlmIC8qIF9fRlQyX0JVSUxEX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9jb25maWcvZnRvcHRpb24uaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvY29uZmlnL2Z0b3B0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZjE0ZDcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9jb25maWcvZnRvcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDg5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG9wdGlvbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVXNlci1zZWxlY3RhYmxlIGNvbmZpZ3VyYXRpb24gbWFjcm9zIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVE9QVElPTl9IX18KLSNkZWZpbmUgX19GVE9QVElPTl9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBVU0VSLVNFTEVDVEFCTEUgQ09ORklHVVJBVElPTiBNQUNST1MgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gbWFjcm8gZGVmaW5pdGlvbnMgZm9yICAgICovCi0gIC8qIGEgc3RhbmRhcmQgYnVpbGQgb2YgdGhlIEZyZWVUeXBlIGxpYnJhcnkuICBUaGVyZSBhcmUgdGhyZWUgd2F5cyB0byAgICAqLwotICAvKiB1c2UgdGhpcyBmaWxlIHRvIGJ1aWxkIHByb2plY3Qtc3BlY2lmaWMgdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnk6ICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAtIFlvdSBjYW4gbW9kaWZ5IHRoaXMgZmlsZSBieSBoYW5kLCBidXQgdGhpcyBpcyBub3QgcmVjb21tZW5kZWQgaW4gICAqLwotICAvKiAgICBjYXNlcyB3aGVyZSB5b3Ugd291bGQgbGlrZSB0byBidWlsZCBzZXZlcmFsIHZlcnNpb25zIG9mIHRoZSAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSBmcm9tIGEgc2luZ2xlIHNvdXJjZSBkaXJlY3RvcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgLSBZb3UgY2FuIHB1dCBhIGNvcHkgb2YgdGhpcyBmaWxlIGluIHlvdXIgYnVpbGQgZGlyZWN0b3J5LCBtb3JlICAgICAgKi8KLSAgLyogICAgcHJlY2lzZWx5IGluIGAkQlVJTEQvY29uZmlnL2Z0b3B0aW9uLmgnLCB3aGVyZSBgJEJVSUxEJyBpcyB0aGUgICAgICovCi0gIC8qICAgIG5hbWUgb2YgYSBkaXJlY3RvcnkgdGhhdCBpcyBpbmNsdWRlZCBfYmVmb3JlXyB0aGUgRnJlZVR5cGUgaW5jbHVkZSAqLwotICAvKiAgICBwYXRoIGR1cmluZyBjb21waWxhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBkZWZhdWx0IEZyZWVUeXBlIE1ha2VmaWxlcyBhbmQgSmFtZmlsZXMgdXNlIHRoZSBidWlsZCAgICAgICAgICAqLwotICAvKiAgICBkaXJlY3RvcnkgYGJ1aWxkcy88c3lzdGVtPicgYnkgZGVmYXVsdCwgYnV0IHlvdSBjYW4gZWFzaWx5IGNoYW5nZSAgKi8KLSAgLyogICAgdGhhdCBmb3IgeW91ciBvd24gcHJvamVjdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgLSBDb3B5IHRoZSBmaWxlIDxmdDJidWlsZC5oPiB0byBgJEJVSUxEL2Z0MmJ1aWxkLmgnIGFuZCBtb2RpZnkgaXQgICAgKi8KLSAgLyogICAgc2xpZ2h0bHkgdG8gcHJlLWRlZmluZSB0aGUgbWFjcm8gRlRfQ09ORklHX09QVElPTlNfSCB1c2VkIHRvICAgICAgICovCi0gIC8qICAgIGxvY2F0ZSB0aGlzIGZpbGUgZHVyaW5nIHRoZSBidWlsZC4gIEZvciBleGFtcGxlLCAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05TX0ggIDxteWZ0b3B0aW9ucy5oPiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgI2luY2x1ZGUgPGNvbmZpZy9mdGhlYWRlci5oPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2lsbCB1c2UgYCRCVUlMRC9teWZ0b3B0aW9ucy5oJyBpbnN0ZWFkIG9mIHRoaXMgZmlsZSBmb3IgbWFjcm8gICAgICovCi0gIC8qICAgIGRlZmluaXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSBhbHNvIHRoYXQgeW91IGNhbiBzaW1pbGFybHkgcHJlLWRlZmluZSB0aGUgbWFjcm8gICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0NPTkZJR19NT0RVTEVTX0ggdXNlZCB0byBsb2NhdGUgdGhlIGZpbGUgbGlzdGluZyBvZiB0aGUgbW9kdWxlcyAqLwotICAvKiAgICB0aGF0IGFyZSBzdGF0aWNhbGx5IGxpbmtlZCB0byB0aGUgbGlicmFyeSBhdCBjb21waWxlIHRpbWUuICBCeSAgICAgKi8KLSAgLyogICAgZGVmYXVsdCwgdGhpcyBmaWxlIGlzIDxjb25maWcvZnRtb2R1bGUuaD4uICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBXZSBoaWdobHkgcmVjb21tZW5kIHVzaW5nIHRoZSB0aGlyZCBtZXRob2Qgd2hlbmV2ZXIgcG9zc2libGUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogRyBFIE4gRSBSIEEgTCAgIEYgUiBFIEUgVCBZIFAgRSAgIDIgICBDIE8gTiBGIEkgRyBVIFIgQSBUIEkgTyBOICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyBpZiB5b3Ugd2FudCB0byBhY3RpdmF0ZSBzdWItcGl4ZWwgcmVuZGVyaW5nICAqLwotICAvKiAoYS5rLmEuIExDRCByZW5kZXJpbmcsIG9yIENsZWFyVHlwZSkgaW4gdGhpcyBidWlsZCBvZiB0aGUgbGlicmFyeS4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgY292ZXJlZCBieSBzZXZlcmFsIE1pY3Jvc29mdCBwYXRlbnRzICAgICAgICAqLwotICAvKiBhbmQgc2hvdWxkIG5vdCBiZSBhY3RpdmF0ZWQgaW4gYW55IGRlZmF1bHQgYnVpbGQgb2YgdGhlIGxpYnJhcnkuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgbWFjcm8gaGFzIG5vIGltcGFjdCBvbiB0aGUgRnJlZVR5cGUgQVBJLCBvbmx5IG9uIGl0cyAgICAgICAgICAgICAqLwotICAvKiBfaW1wbGVtZW50YXRpb25fLiAgRm9yIGV4YW1wbGUsIHVzaW5nIEZUX1JFTkRFUl9NT0RFX0xDRCB3aGVuIGNhbGxpbmcgKi8KLSAgLyogRlRfUmVuZGVyX0dseXBoIHN0aWxsIGdlbmVyYXRlcyBhIGJpdG1hcCB0aGF0IGlzIDMgdGltZXMgd2lkZXIgdGhhbiAgICovCi0gIC8qIHRoZSBvcmlnaW5hbCBzaXplIGluIGNhc2UgdGhpcyBtYWNybyBpc24ndCBkZWZpbmVkOyBob3dldmVyLCBlYWNoICAgICAqLwotICAvKiB0cmlwbGV0IG9mIHN1YnBpeGVscyBoYXMgUj1HPUIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgaXMgZG9uZSB0byBhbGxvdyBGcmVlVHlwZSBjbGllbnRzIHRvIHJ1biB1bm1vZGlmaWVkLCBmb3JjaW5nICAgICAqLwotICAvKiB0aGVtIHRvIGRpc3BsYXkgbm9ybWFsIGdyYXktbGV2ZWwgYW50aS1hbGlhc2VkIGdseXBocy4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNYW55IGNvbXBpbGVycyBwcm92aWRlIGEgbm9uLUFOU0kgNjQtYml0IGRhdGEgdHlwZSB0aGF0IGNhbiBiZSB1c2VkICAgKi8KLSAgLyogYnkgRnJlZVR5cGUgdG8gc3BlZWQgdXAgc29tZSBjb21wdXRhdGlvbnMuICBIb3dldmVyLCB0aGlzIHdpbGwgY3JlYXRlICovCi0gIC8qIHNvbWUgcHJvYmxlbXMgd2hlbiBjb21waWxpbmcgdGhlIGxpYnJhcnkgaW4gc3RyaWN0IEFOU0kgbW9kZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRm9yIHRoaXMgcmVhc29uLCB0aGUgdXNlIG9mIDY0LWJpdCBpbnRlZ2VycyBpcyBub3JtYWxseSBkaXNhYmxlZCB3aGVuICovCi0gIC8qIHRoZSBfX1NURENfXyBtYWNybyBpcyBkZWZpbmVkLiAgWW91IGNhbiBob3dldmVyIGRpc2FibGUgdGhpcyBieSAgICAgICAqLwotICAvKiBkZWZpbmluZyB0aGUgbWFjcm8gRlRfQ09ORklHX09QVElPTl9GT1JDRV9JTlQ2NCBoZXJlLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZvciBtb3N0IGNvbXBpbGVycywgdGhpcyB3aWxsIG9ubHkgY3JlYXRlIGNvbXBpbGF0aW9uIHdhcm5pbmdzIHdoZW4gICAqLwotICAvKiBidWlsZGluZyB0aGUgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9iTm90ZTogVGhlIGNvbXBpbGVyLXNwZWNpZmljIDY0LWJpdCBpbnRlZ2VycyBhcmUgZGV0ZWN0ZWQgaW4gdGhlICAgICAqLwotICAvKiAgICAgICAgIGZpbGUgYGZ0Y29uZmlnLmgnIGVpdGhlciBzdGF0aWNhbGx5IG9yIHRocm91Z2ggdGhlICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICBgY29uZmlndXJlJyBzY3JpcHQgb24gc3VwcG9ydGVkIHBsYXRmb3Jtcy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmIEZUX0NPTkZJR19PUFRJT05fRk9SQ0VfSU5UNjQKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSWYgdGhpcyBtYWNybyBpcyBkZWZpbmVkLCBkbyBub3QgdHJ5IHRvIHVzZSBhbiBhc3NlbWJsZXIgdmVyc2lvbiBvZiAgICovCi0gIC8qIHBlcmZvcm1hbmNlLWNyaXRpY2FsIGZ1bmN0aW9ucyAoZS5nLiBGVF9NdWxGaXgpLiAgWW91IHNob3VsZCBvbmx5IGRvICAqLwotICAvKiB0aGF0IHRvIHZlcmlmeSB0aGF0IHRoZSBhc3NlbWJsZXIgZnVuY3Rpb24gd29ya3MgcHJvcGVybHksIG9yIHRvICAgICAgKi8KLSAgLyogZXhlY3V0ZSBiZW5jaG1hcmsgdGVzdHMgb2YgdGhlIHZhcmlvdXMgaW1wbGVtZW50YXRpb25zLiAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fTk9fQVNTRU1CTEVSICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElmIHRoaXMgbWFjcm8gaXMgZGVmaW5lZCwgdHJ5IHRvIHVzZSBhbiBpbmxpbmVkIGFzc2VtYmxlciB2ZXJzaW9uIG9mICAqLwotICAvKiB0aGUgYEZUX011bEZpeCcgZnVuY3Rpb24sIHdoaWNoIGlzIGEgYGhvdHNwb3QnIHdoZW4gbG9hZGluZyBhbmQgICAgICAgKi8KLSAgLyogaGludGluZyBnbHlwaHMsIGFuZCB3aGljaCBzaG91bGQgYmUgZXhlY3V0ZWQgYXMgZmFzdCBhcyBwb3NzaWJsZS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOb3RlIHRoYXQgaWYgeW91ciBjb21waWxlciBvciBDUFUgaXMgbm90IHN1cHBvcnRlZCwgdGhpcyB3aWxsIGRlZmF1bHQgKi8KLSAgLyogdG8gdGhlIHN0YW5kYXJkIGFuZCBwb3J0YWJsZSBpbXBsZW1lbnRhdGlvbiBmb3VuZCBpbiBgZnRjYWxjLmMnLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX0lOTElORV9NVUxGSVgKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTFpXLWNvbXByZXNzZWQgZmlsZSBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZyZWVUeXBlIG5vdyBoYW5kbGVzIGZvbnQgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY29tcHJlc3NlZCB3aXRoIHRoZSAgKi8KLSAgLyogICBgY29tcHJlc3MnIHByb2dyYW0uICBUaGlzIGlzIG1vc3RseSB1c2VkIHRvIHBhcnNlIG1hbnkgb2YgdGhlIFBDRiAgICovCi0gIC8qICAgZmlsZXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBYMTEgZGlzdHJpYnV0aW9ucy4gIFRoZSBpbXBsZW1lbnRhdGlvbiAqLwotICAvKiAgIHVzZXMgTmV0QlNEJ3MgYHpvcGVuJyB0byBwYXJ0aWFsbHkgdW5jb21wcmVzcyB0aGUgZmlsZSBvbiB0aGUgZmx5ICAgKi8KLSAgLyogICAoc2VlIHNyYy9sencvZnRnemlwLmMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIERlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGlzIGBmZWF0dXJlJy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fVVNFX0xaVwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBHemlwLWNvbXByZXNzZWQgZmlsZSBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRnJlZVR5cGUgbm93IGhhbmRsZXMgZm9udCBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjb21wcmVzc2VkIHdpdGggdGhlICAqLwotICAvKiAgIGBnemlwJyBwcm9ncmFtLiAgVGhpcyBpcyBtb3N0bHkgdXNlZCB0byBwYXJzZSBtYW55IG9mIHRoZSBQQ0YgZmlsZXMgKi8KLSAgLyogICB0aGF0IGNvbWUgd2l0aCBYRnJlZTg2LiAgVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgYHpsaWInIHRvICAgICAgICAgICovCi0gIC8qICAgcGFydGlhbGx5IHVuY29tcHJlc3MgdGhlIGZpbGUgb24gdGhlIGZseSAoc2VlIHNyYy9nemlwL2Z0Z3ppcC5jKS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEZWZpbmUgdGhpcyBtYWNybyBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhpcyBgZmVhdHVyZScuICBTZWUgYWxzbyAgICovCi0gIC8qICAgdGhlIG1hY3JvIEZUX0NPTkZJR19PUFRJT05fU1lTVEVNX1pMSUIgYmVsb3cuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8vI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1VTRV9aTElCCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFpMaWIgbGlicmFyeSBzZWxlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGlzIG1hY3JvIGlzIG9ubHkgdXNlZCB3aGVuIEZUX0NPTkZJR19PUFRJT05fVVNFX1pMSUIgaXMgZGVmaW5lZC4gICovCi0gIC8qICAgSXQgYWxsb3dzIEZyZWVUeXBlJ3MgYGZ0Z3ppcCcgY29tcG9uZW50IHRvIGxpbmsgdG8gdGhlIHN5c3RlbSdzICAgICAqLwotICAvKiAgIGluc3RhbGxhdGlvbiBvZiB0aGUgWkxpYiBsaWJyYXJ5LiAgVGhpcyBpcyB1c2VmdWwgb24gc3lzdGVtcyBsaWtlICAgKi8KLSAgLyogICBVbml4IG9yIFZNUyB3aGVyZSBpdCBnZW5lcmFsbHkgaXMgYWxyZWFkeSBhdmFpbGFibGUuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIElmIHlvdSBsZXQgaXQgdW5kZWZpbmVkLCB0aGUgY29tcG9uZW50IHdpbGwgdXNlIGl0cyBvd24gY29weSAgICAgICAgKi8KLSAgLyogICBvZiB0aGUgemxpYiBzb3VyY2VzIGluc3RlYWQuICBUaGVzZSBoYXZlIGJlZW4gbW9kaWZpZWQgdG8gYmUgICAgICAgICovCi0gIC8qICAgaW5jbHVkZWQgZGlyZWN0bHkgd2l0aGluIHRoZSBjb21wb25lbnQgYW5kICpub3QqIGV4cG9ydCBleHRlcm5hbCAgICAqLwotICAvKiAgIGZ1bmN0aW9uIG5hbWVzLiAgVGhpcyBhbGxvd3MgeW91IHRvIGxpbmsgYW55IHByb2dyYW0gd2l0aCBGcmVlVHlwZSAgKi8KLSAgLyogICBfYW5kXyBaTGliIHdpdGhvdXQgbGlua2luZyBjb25mbGljdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIERvIG5vdCAjdW5kZWYgdGhpcyBtYWNybyBoZXJlIHNpbmNlIHRoZSBidWlsZCBzeXN0ZW0gbWlnaHQgZGVmaW5lICAgKi8KLSAgLyogICBpdCBmb3IgY2VydGFpbiBjb25maWd1cmF0aW9ucyBvbmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1NZU1RFTV9aTElCICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEJ6aXAyLWNvbXByZXNzZWQgZmlsZSBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGcmVlVHlwZSBub3cgaGFuZGxlcyBmb250IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNvbXByZXNzZWQgd2l0aCB0aGUgICovCi0gIC8qICAgYGJ6aXAyJyBwcm9ncmFtLiAgVGhpcyBpcyBtb3N0bHkgdXNlZCB0byBwYXJzZSBtYW55IG9mIHRoZSBQQ0YgICAgICAqLwotICAvKiAgIGZpbGVzIHRoYXQgY29tZSB3aXRoIFhGcmVlODYuICBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyBgbGliYnoyJyB0byAgKi8KLSAgLyogICBwYXJ0aWFsbHkgdW5jb21wcmVzcyB0aGUgZmlsZSBvbiB0aGUgZmx5IChzZWUgc3JjL2J6aXAyL2Z0YnppcDIuYykuICovCi0gIC8qICAgQ29udHJhcnkgdG8gZ3ppcCwgYnppcDIgY3VycmVudGx5IGlzIG5vdCBpbmNsdWRlZCBhbmQgbmVlZCB0byB1c2UgICAqLwotICAvKiAgIHRoZSBzeXN0ZW0gYXZhaWxhYmxlIGJ6aXAyIGltcGxlbWVudGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoaXMgYGZlYXR1cmUnLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9VU0VfQlpJUDIgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIHRvIGRpc2FibGUgdGhlIHVzZSBvZiBmaWxlIHN0cmVhbSBmdW5jdGlvbnMgYW5kIHR5cGVzLCBGSUxFLCAgICovCi0gIC8qIGZvcGVuKCkgZXRjLiAgRW5hYmxlcyB0aGUgdXNlIG9mIHNtYWxsZXIgc3lzdGVtIGxpYnJhcmllcyBvbiBlbWJlZGRlZCAqLwotICAvKiBzeXN0ZW1zIHRoYXQgaGF2ZSBtdWx0aXBsZSBzeXN0ZW0gbGlicmFyaWVzLCBzb21lIHdpdGggb3Igd2l0aG91dCAgICAgKi8KLSAgLyogZmlsZSBzdHJlYW0gc3VwcG9ydCwgaW4gdGhlIGNhc2VzIHdoZXJlIGZpbGUgc3RyZWFtIHN1cHBvcnQgaXMgbm90ICAgICovCi0gIC8qIG5lY2Vzc2FyeSBzdWNoIGFzIG1lbW9yeSBsb2FkaW5nIG9mIGZvbnQgZmlsZXMuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9ESVNBQkxFX1NUUkVBTV9TVVBQT1JUICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFBORyBiaXRtYXAgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGcmVlVHlwZSBub3cgaGFuZGxlcyBsb2FkaW5nIGNvbG9yIGJpdG1hcCBnbHlwaHMgaW4gdGhlIFBORyBmb3JtYXQuICovCi0gIC8qICAgVGhpcyByZXF1aXJlcyBoZWxwIGZyb20gdGhlIGV4dGVybmFsIGxpYnBuZyBsaWJyYXJ5LiAgVW5jb21wcmVzc2VkICAqLwotICAvKiAgIGNvbG9yIGJpdG1hcHMgZG8gbm90IG5lZWQgYW55IGV4dGVybmFsIGxpYnJhcmllcyBhbmQgd2lsbCBiZSAgICAgICAgKi8KLSAgLyogICBzdXBwb3J0ZWQgcmVnYXJkbGVzcyBvZiB0aGlzIGNvbmZpZ3VyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIERlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGlzIGBmZWF0dXJlJy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fVVNFX1BORyAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBIYXJmQnV6eiBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRnJlZVR5cGUgdXNlcyB0aGUgSGFyZkJ1enogbGlicmFyeSB0byBpbXByb3ZlIGF1dG8taGludGluZyBvZiAgICAgICAqLwotICAvKiAgIE9wZW5UeXBlIGZvbnRzLiAgSWYgYXZhaWxhYmxlLCBtYW55IGdseXBocyBub3QgZGlyZWN0bHkgYWRkcmVzc2FibGUgKi8KLSAgLyogICBieSBhIGZvbnQncyBjaGFyYWN0ZXIgbWFwIHdpbGwgYmUgaGludGVkIGFsc28uICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIERlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGlzIGBmZWF0dXJlJy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fVVNFX0hBUkZCVVpaICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERMTCBleHBvcnQgY29tcGlsYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBXaGVuIGNvbXBpbGluZyBGcmVlVHlwZSBhcyBhIERMTCwgc29tZSBzeXN0ZW1zL2NvbXBpbGVycyBuZWVkIGEgICAgICovCi0gIC8qICAgc3BlY2lhbCBrZXl3b3JkIGluIGZyb250IE9SIGFmdGVyIHRoZSByZXR1cm4gdHlwZSBvZiBmdW5jdGlvbiAgICAgICAqLwotICAvKiAgIGRlY2xhcmF0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVHdvIG1hY3JvcyBhcmUgdXNlZCB3aXRoaW4gdGhlIEZyZWVUeXBlIHNvdXJjZSBjb2RlIHRvIGRlZmluZSAgICAgICAqLwotICAvKiAgIGV4cG9ydGVkIGxpYnJhcnkgZnVuY3Rpb25zOiBGVF9FWFBPUlQgYW5kIEZUX0VYUE9SVF9ERUYuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBGVF9FWFBPUlQoIHJldHVybl90eXBlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgaXMgdXNlZCBpbiBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLCBhcyBpbiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICBGVF9Jbml0X0ZyZWVUeXBlKCBGVF9MaWJyYXJ5KiAgYWxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIEZUX0VYUE9SVF9ERUYoIHJldHVybl90eXBlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICBpcyB1c2VkIGluIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiwgYXMgaW4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgIEZUX0luaXRfRnJlZVR5cGUoIEZUX0xpYnJhcnkqICBhbGlicmFyeSApICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgcmV0dXJuIEZUX0Vycl9PazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFlvdSBjYW4gcHJvdmlkZSB5b3VyIG93biBpbXBsZW1lbnRhdGlvbiBvZiBGVF9FWFBPUlQgYW5kICAgICAgICAgICAgKi8KLSAgLyogICBGVF9FWFBPUlRfREVGIGhlcmUgaWYgeW91IHdhbnQuICBJZiB5b3UgbGVhdmUgdGhlbSB1bmRlZmluZWQsIHRoZXkgICovCi0gIC8qICAgd2lsbCBiZSBsYXRlciBhdXRvbWF0aWNhbGx5IGRlZmluZWQgYXMgYGV4dGVybiByZXR1cm5fdHlwZScgdG8gICAgICAqLwotICAvKiAgIGFsbG93IG5vcm1hbCBjb21waWxhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRG8gbm90ICN1bmRlZiB0aGVzZSBtYWNyb3MgaGVyZSBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0IGRlZmluZSAqLwotICAvKiAgIHRoZW0gZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIEZUX0VYUE9SVCh4KSAgICAgIGV4dGVybiB4ICovCi0vKiAjZGVmaW5lIEZUX0VYUE9SVF9ERUYoeCkgIHggKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogR2x5cGggUG9zdHNjcmlwdCBOYW1lcyBoYW5kbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEJ5IGRlZmF1bHQsIEZyZWVUeXBlIDIgaXMgY29tcGlsZWQgd2l0aCB0aGUgYHBzbmFtZXMnIG1vZHVsZS4gIFRoaXMgKi8KLSAgLyogICBtb2R1bGUgaXMgaW4gY2hhcmdlIG9mIGNvbnZlcnRpbmcgYSBnbHlwaCBuYW1lIHN0cmluZyBpbnRvIGEgICAgICAgICovCi0gIC8qICAgVW5pY29kZSB2YWx1ZSwgb3IgcmV0dXJuIGEgTWFjaW50b3NoIHN0YW5kYXJkIGdseXBoIG5hbWUgZm9yIHRoZSAgICAqLwotICAvKiAgIHVzZSB3aXRoIHRoZSBUcnVlVHlwZSBgcG9zdCcgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVW5kZWZpbmUgdGhpcyBtYWNybyBpZiB5b3UgZG8gbm90IHdhbnQgYHBzbmFtZXMnIGNvbXBpbGVkIGluIHlvdXIgICAqLwotICAvKiAgIGJ1aWxkIG9mIEZyZWVUeXBlLiAgVGhpcyBoYXMgdGhlIGZvbGxvd2luZyBlZmZlY3RzOiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgLSBUaGUgVHJ1ZVR5cGUgZHJpdmVyIHdpbGwgcHJvdmlkZSBpdHMgb3duIHNldCBvZiBnbHlwaCBuYW1lcywgICAgICAqLwotICAvKiAgICAgaWYgeW91IGJ1aWxkIGl0IHRvIHN1cHBvcnQgcG9zdHNjcmlwdCBuYW1lcyBpbiB0aGUgVHJ1ZVR5cGUgICAgICAgKi8KLSAgLyogICAgIGBwb3N0JyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIC0gVGhlIFR5cGUgMSBkcml2ZXIgd2lsbCBub3QgYmUgYWJsZSB0byBzeW50aGVzaXplIGEgVW5pY29kZSAgICAgICAgKi8KLSAgLyogICAgIGNoYXJtYXAgb3V0IG9mIHRoZSBnbHlwaHMgZm91bmQgaW4gdGhlIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFlvdSB3b3VsZCBub3JtYWxseSB1bmRlZmluZSB0aGlzIGNvbmZpZ3VyYXRpb24gbWFjcm8gd2hlbiBidWlsZGluZyAgKi8KLSAgLyogICBhIHZlcnNpb24gb2YgRnJlZVR5cGUgdGhhdCBkb2Vzbid0IGNvbnRhaW4gYSBUeXBlIDEgb3IgQ0ZGIGRyaXZlci4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUG9zdHNjcmlwdCBOYW1lcyB0byBVbmljb2RlIFZhbHVlcyBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEJ5IGRlZmF1bHQsIEZyZWVUeXBlIDIgaXMgYnVpbHQgd2l0aCB0aGUgYFBTTmFtZXMnIG1vZHVsZSBjb21waWxlZCAgKi8KLSAgLyogICBpbi4gIEFtb25nIG90aGVyIHRoaW5ncywgdGhlIG1vZHVsZSBpcyB1c2VkIHRvIGNvbnZlcnQgYSBnbHlwaCBuYW1lICovCi0gIC8qICAgaW50byBhIFVuaWNvZGUgdmFsdWUuICBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGluIG9yZGVyIHRvICAgICAgICAqLwotICAvKiAgIHN5bnRoZXNpemUgb24gdGhlIGZseSBhIFVuaWNvZGUgY2hhcm1hcCBmcm9tIHRoZSBDRkYvVHlwZSAxIGRyaXZlciAgKi8KLSAgLyogICB0aHJvdWdoIGEgYmlnIHRhYmxlIG5hbWVkIHRoZSBgQWRvYmUgR2x5cGggTGlzdCcgKEFHTCkuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFVuZGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IGRvIG5vdCB3YW50IHRoZSBBZG9iZSBHbHlwaCBMaXN0ICAgICAgICAgKi8KLSAgLyogICBjb21waWxlZCBpbiB5b3VyIGBQU05hbWVzJyBtb2R1bGUuICBUaGUgVHlwZSAxIGRyaXZlciB3aWxsIG5vdCBiZSAgICovCi0gIC8qICAgYWJsZSB0byBzeW50aGVzaXplIGEgVW5pY29kZSBjaGFybWFwIG91dCBvZiB0aGUgZ2x5cGhzIGZvdW5kIGluIHRoZSAqLwotICAvKiAgIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fQURPQkVfR0xZUEhfTElTVAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdXBwb3J0IGZvciBNYWMgZm9udHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgc3VwcG9ydCBmb3Igb3V0bGluZSBmb250cyBpbiBNYWMgICAgICAqLwotICAvKiAgIGZvcm1hdCAobWFjIGRmb250LCBtYWMgcmVzb3VyY2UsIG1hY2JpbmFyeSBjb250YWluaW5nIGEgbWFjICAgICAgICAgKi8KLSAgLyogICByZXNvdXJjZSkgb24gbm9uLU1hYyBwbGF0Zm9ybXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE5vdGUgdGhhdCB0aGUgYEZPTkQnIHJlc291cmNlIGlzbid0IGNoZWNrZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgRlRfQ09ORklHX09QVElPTl9NQUNfRk9OVFMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogR3Vlc3NpbmcgbWV0aG9kcyB0byBhY2Nlc3MgZW1iZWRkZWQgcmVzb3VyY2UgZm9ya3MgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEVuYWJsZSBleHRyYSBNYWMgZm9udHMgc3VwcG9ydCBvbiBub24tTWFjIHBsYXRmb3JtcyAoZS5nLiAgICAgICAgICAgKi8KLSAgLyogICBHTlUvTGludXgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFJlc291cmNlIGZvcmtzIHdoaWNoIGluY2x1ZGUgZm9udHMgZGF0YSBhcmUgc3RvcmVkIHNvbWV0aW1lcyBpbiAgICAgKi8KLSAgLyogICBsb2NhdGlvbnMgd2hpY2ggdXNlcnMgb3IgZGV2ZWxvcGVycyBkb24ndCBleHBlY3RlZC4gIEluIHNvbWUgY2FzZXMsICovCi0gIC8qICAgcmVzb3VyY2UgZm9ya3Mgc3RhcnQgd2l0aCBzb21lIG9mZnNldCBmcm9tIHRoZSBoZWFkIG9mIGEgZmlsZS4gIEluICAqLwotICAvKiAgIG90aGVyIGNhc2VzLCB0aGUgYWN0dWFsIHJlc291cmNlIGZvcmsgaXMgc3RvcmVkIGluIGZpbGUgZGlmZmVyZW50ICAgKi8KLSAgLyogICBmcm9tIHdoYXQgdGhlIHVzZXIgc3BlY2lmaWVzLiAgSWYgdGhpcyBvcHRpb24gaXMgYWN0aXZhdGVkLCAgICAgICAgICovCi0gIC8qICAgRnJlZVR5cGUgdHJpZXMgdG8gZ3Vlc3Mgd2hldGhlciBzdWNoIG9mZnNldHMgb3IgZGlmZmVyZW50IGZpbGUgICAgICAqLwotICAvKiAgIG5hbWVzIG11c3QgYmUgdXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTm90ZSB0aGF0IG5vcm1hbCwgZGlyZWN0IGFjY2VzcyBvZiByZXNvdXJjZSBmb3JrcyBpcyBjb250cm9sbGVkIHZpYSAqLwotICAvKiAgIHRoZSBGVF9DT05GSUdfT1BUSU9OX01BQ19GT05UUyBvcHRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9NQUNfRk9OVFMKLSNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9HVUVTU0lOR19FTUJFRERFRF9SRk9SSwotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFsbG93IHRoZSB1c2Ugb2YgRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlIHRvIGxvYWQgdHlwZWZhY2VzIHRoYXQgICAgICAqLwotICAvKiBjb250YWluIG5vIGdseXBoIGRhdGEsIGJ1dCBzdXBwbHkgaXQgdmlhIGEgY2FsbGJhY2sgZnVuY3Rpb24uICAgICAgICAgKi8KLSAgLyogVGhpcyBpcyByZXF1aXJlZCBieSBjbGllbnRzIHN1cHBvcnRpbmcgZG9jdW1lbnQgZm9ybWF0cyB3aGljaCAgICAgICAgICovCi0gIC8qIHN1cHBseSBmb250IGRhdGEgaW5jcmVtZW50YWxseSBhcyB0aGUgZG9jdW1lbnQgaXMgcGFyc2VkLCBzdWNoICAgICAgICAqLwotICAvKiBhcyB0aGUgR2hvc3RzY3JpcHQgaW50ZXJwcmV0ZXIgZm9yIHRoZSBQb3N0U2NyaXB0IGxhbmd1YWdlLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlbmRlciBwb29sIHVzZWQgYnkgdGhlIHNjYW4tbGluZSBjb252ZXJ0ZXIgICovCi0gIC8qIHRvIGRvIGFsbCBvZiBpdHMgd29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiA0S0J5dGUgaWYgeW91IHVzZSBGcmVlVHlwZSB0byByYXN0ZXJpemUgICAgICovCi0gIC8qIGdseXBoczsgb3RoZXJ3aXNlLCB5b3UgbWF5IHNldCBpdCB0byB6ZXJvIHRvIGF2b2lkIHVubmVjZXNzYXJ5ICAgICAgICAqLwotICAvKiBhbGxvY2F0aW9uIG9mIHRoZSByZW5kZXIgcG9vbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX1JFTkRFUl9QT09MX1NJWkUgIDE2Mzg0TAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGVF9NQVhfTU9EVUxFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIG1vZHVsZXMgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCBpbiBhIHNpbmdsZSAgICAqLwotICAvKiAgIEZyZWVUeXBlIGxpYnJhcnkgb2JqZWN0LiAgMzIgaXMgdGhlIGRlZmF1bHQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX01BWF9NT0RVTEVTICAzMgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWJ1ZyBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRnJlZVR5cGUgY2FuIGJlIGNvbXBpbGVkIGluIGRlYnVnIG9yIHRyYWNlIG1vZGUuICBJbiBkZWJ1ZyBtb2RlLCAgICAqLwotICAvKiAgIGVycm9ycyBhcmUgcmVwb3J0ZWQgdGhyb3VnaCB0aGUgYGZ0ZGVidWcnIGNvbXBvbmVudC4gIEluIHRyYWNlICAgICAgKi8KLSAgLyogICBtb2RlLCBhZGRpdGlvbmFsIG1lc3NhZ2VzIGFyZSBzZW50IHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgZHVyaW5nICAgICovCi0gIC8qICAgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEZWZpbmUgRlRfREVCVUdfTEVWRUxfRVJST1IgdG8gYnVpbGQgdGhlIGxpYnJhcnkgaW4gZGVidWcgbW9kZS4gICAgICovCi0gIC8qICAgRGVmaW5lIEZUX0RFQlVHX0xFVkVMX1RSQUNFIHRvIGJ1aWxkIGl0IGluIHRyYWNlIG1vZGUuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEb24ndCBkZWZpbmUgYW55IG9mIHRoZXNlIG1hY3JvcyB0byBjb21waWxlIGluIGByZWxlYXNlJyBtb2RlISAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIERvIG5vdCAjdW5kZWYgdGhlc2UgbWFjcm9zIGhlcmUgc2luY2UgdGhlIGJ1aWxkIHN5c3RlbSBtaWdodCBkZWZpbmUgKi8KLSAgLyogICB0aGVtIGZvciBjZXJ0YWluIGNvbmZpZ3VyYXRpb25zIG9ubHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogI2RlZmluZSBGVF9ERUJVR19MRVZFTF9FUlJPUiAqLwotLyogI2RlZmluZSBGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBdXRvZml0dGVyIGRlYnVnZ2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSWYgRlRfREVCVUdfQVVUT0ZJVCBpcyBkZWZpbmVkLCBGcmVlVHlwZSBwcm92aWRlcyBzb21lIG1lYW5zIHRvICAgICAqLwotICAvKiAgIGNvbnRyb2wgdGhlIGF1dG9maXR0ZXIgYmVoYXZpb3VyIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgd2l0aCBnbG9iYWwgKi8KLSAgLyogICBib29sZWFuIHZhcmlhYmxlcyAoY29uc2VxdWVudGx5LCB5b3Ugc2hvdWxkICpuZXZlciogZW5hYmxlIHRoaXMgICAgICovCi0gIC8qICAgd2hpbGUgY29tcGlsaW5nIGluIGByZWxlYXNlJyBtb2RlKTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIF9hZl9kZWJ1Z19kaXNhYmxlX2hvcnpfaGludHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBfYWZfZGVidWdfZGlzYWJsZV92ZXJ0X2hpbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgX2FmX2RlYnVnX2Rpc2FibGVfYmx1ZV9oaW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQWRkaXRpb25hbGx5LCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBwcm92aWRlIGR1bXBzIG9mIHZhcmlvdXMgICAgICAqLwotICAvKiAgIGludGVybmFsIGF1dG9maXQgc3RydWN0dXJlcyB0byBzdGRvdXQgKHVzaW5nIGBwcmludGYnKTogICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBhZl9nbHlwaF9oaW50c19kdW1wX3BvaW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgYWZfZ2x5cGhfaGludHNfZHVtcF9zZWdtZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGFmX2dseXBoX2hpbnRzX2R1bXBfZWRnZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEFzIGFuIGFyZ3VtZW50LCB0aGV5IHVzZSBhbm90aGVyIGdsb2JhbCB2YXJpYWJsZTogICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBfYWZfZGVidWdfaGludHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBQbGVhc2UgaGF2ZSBhIGxvb2sgYXQgdGhlIGBmdGdyaWQnIGRlbW8gcHJvZ3JhbSB0byBzZWUgaG93IHRob3NlICAgICovCi0gIC8qICAgdmFyaWFibGVzIGFuZCBtYWNyb3Mgc2hvdWxkIGJlIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEbyBub3QgI3VuZGVmIHRoZXNlIG1hY3JvcyBoZXJlIHNpbmNlIHRoZSBidWlsZCBzeXN0ZW0gbWlnaHQgZGVmaW5lICovCi0gIC8qICAgdGhlbSBmb3IgY2VydGFpbiBjb25maWd1cmF0aW9ucyBvbmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgRlRfREVCVUdfQVVUT0ZJVCAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNZW1vcnkgRGVidWdnaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRnJlZVR5cGUgbm93IGNvbWVzIHdpdGggYW4gaW50ZWdyYXRlZCBtZW1vcnkgZGVidWdnZXIgdGhhdCBpcyAgICAgICAqLwotICAvKiAgIGNhcGFibGUgb2YgZGV0ZWN0aW5nIHNpbXBsZSBlcnJvcnMgbGlrZSBtZW1vcnkgbGVha3Mgb3IgZG91YmxlICAgICAgKi8KLSAgLyogICBkZWxldGVzLiAgVG8gY29tcGlsZSBpdCB3aXRoaW4geW91ciBidWlsZCBvZiB0aGUgbGlicmFyeSwgeW91ICAgICAgICovCi0gIC8qICAgc2hvdWxkIGRlZmluZSBGVF9ERUJVR19NRU1PUlkgaGVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOb3RlIHRoYXQgdGhlIG1lbW9yeSBkZWJ1Z2dlciBpcyBvbmx5IGFjdGl2YXRlZCBhdCBydW50aW1lIHdoZW4gICAgICovCi0gIC8qICAgd2hlbiB0aGUgX2Vudmlyb25tZW50XyB2YXJpYWJsZSBgRlQyX0RFQlVHX01FTU9SWScgaXMgZGVmaW5lZCBhbHNvISAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEbyBub3QgI3VuZGVmIHRoaXMgbWFjcm8gaGVyZSBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0IGRlZmluZSAgICovCi0gIC8qICAgaXQgZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgRlRfREVCVUdfTUVNT1JZICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1vZHVsZSBlcnJvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBJZiB0aGlzIG1hY3JvIGlzIHNldCAod2hpY2ggaXMgX25vdF8gdGhlIGRlZmF1bHQpLCB0aGUgaGlnaGVyIGJ5dGUgICovCi0gIC8qICAgb2YgYW4gZXJyb3IgY29kZSBnaXZlcyB0aGUgbW9kdWxlIGluIHdoaWNoIHRoZSBlcnJvciBoYXMgb2NjdXJyZWQsICAqLwotICAvKiAgIHdoaWxlIHRoZSBsb3dlciBieXRlIGlzIHRoZSByZWFsIGVycm9yIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgU2V0dGluZyB0aGlzIG1hY3JvIG1ha2VzIHNlbnNlIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seSwgc2luY2UgICAqLwotICAvKiAgIGl0IHdvdWxkIGJyZWFrIHNvdXJjZSBjb21wYXRpYmlsaXR5IG9mIGNlcnRhaW4gcHJvZ3JhbXMgdGhhdCB1c2UgICAgKi8KLSAgLyogICBGcmVlVHlwZSAyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE1vcmUgZGV0YWlscyBjYW4gYmUgZm91bmQgaW4gdGhlIGZpbGVzIGZ0bW9kZXJyLmggYW5kIGZ0ZXJyb3JzLmguICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgRlRfQ09ORklHX09QVElPTl9VU0VfTU9EVUxFX0VSUk9SUwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBQb3NpdGlvbiBJbmRlcGVuZGVudCBDb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSWYgdGhpcyBtYWNybyBpcyBzZXQgKHdoaWNoIGlzIF9ub3RfIHRoZSBkZWZhdWx0KSwgRnJlZVR5cGUyIHdpbGwgICAqLwotICAvKiAgIGF2b2lkIGNyZWF0aW5nIGNvbnN0YW50cyB0aGF0IHJlcXVpcmUgYWRkcmVzcyBmaXh1cHMuICBJbnN0ZWFkIHRoZSAgKi8KLSAgLyogICBjb25zdGFudHMgd2lsbCBiZSBtb3ZlZCBpbnRvIGEgc3RydWN0IGFuZCBhZGRpdGlvbmFsIGludGlhbGl6YXRpb24gICovCi0gIC8qICAgY29kZSB3aWxsIGJlIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBTZXR0aW5nIHRoaXMgbWFjcm8gaXMgbmVlZGVkIGZvciBzeXN0ZW1zIHRoYXQgcHJvaGliaXQgYWRkcmVzcyAgICAgICovCi0gIC8qICAgZml4dXBzLCBzdWNoIGFzIEJSRVcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICBTIEYgTiBUICAgRCBSIEkgViBFIFIgICAgQyBPIE4gRiBJIEcgVSBSIEEgVCBJIE8gTiAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTIGlmIHlvdSB3YW50IHRvIHN1cHBvcnQgICAgICAgKi8KLSAgLyogZW1iZWRkZWQgYml0bWFwcyBpbiBhbGwgZm9ybWF0cyB1c2luZyB0aGUgU0ZOVCBtb2R1bGUgKG5hbWVseSAgICAgICAgICovCi0gIC8qIFRydWVUeXBlICYgT3BlblR5cGUpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIFRUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUyBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvICAgICovCi0gIC8qIGxvYWQgYW5kIGVudW1lcmF0ZSB0aGUgZ2x5cGggUG9zdHNjcmlwdCBuYW1lcyBpbiBhIFRydWVUeXBlIG9yICAgICAgICAqLwotICAvKiBPcGVuVHlwZSBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUgdGhhdCB3aGVuIHlvdSBkbyBub3QgY29tcGlsZSB0aGUgYFBTTmFtZXMnIG1vZHVsZSBieSB1bmRlZmluaW5nICAqLwotICAvKiB0aGUgYWJvdmUgRlRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTLCB0aGUgYHNmbnQnIG1vZHVsZSB3aWxsICAgKi8KLSAgLyogY29udGFpbiBhZGRpdGlvbmFsIGNvZGUgdXNlZCB0byByZWFkIHRoZSBQUyBOYW1lcyB0YWJsZSBmcm9tIGEgZm9udC4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAoQnkgZGVmYXVsdCwgdGhlIG1vZHVsZSB1c2VzIGBQU05hbWVzJyB0byBleHRyYWN0IGdseXBoIG5hbWVzLikgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9TRk5UX05BTUVTIGlmIHlvdXIgYXBwbGljYXRpb25zIG5lZWQgdG8gICAgICAgKi8KLSAgLyogYWNjZXNzIHRoZSBpbnRlcm5hbCBuYW1lIHRhYmxlIGluIGEgU0ZOVC1iYXNlZCBmb3JtYXQgbGlrZSBUcnVlVHlwZSAgICovCi0gIC8qIG9yIE9wZW5UeXBlLiAgVGhlIG5hbWUgdGFibGUgY29udGFpbnMgdmFyaW91cyBzdHJpbmdzIHVzZWQgdG8gICAgICAgICAqLwotICAvKiBkZXNjcmliZSB0aGUgZm9udCwgbGlrZSBmYW1pbHkgbmFtZSwgY29weXJpZ2h0LCB2ZXJzaW9uLCBldGMuICBJdCAgICAgKi8KLSAgLyogZG9lcyBub3QgY29udGFpbiBhbnkgZ2x5cGggbmFtZSB0aG91Z2guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBY2Nlc3NpbmcgU0ZOVCBuYW1lcyBpcyBkb25lIHRocm91Z2ggdGhlIGZ1bmN0aW9ucyBkZWNsYXJlZCBpbiAgICAgICAgKi8KLSAgLyogYGZ0c25hbWVzLmgnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUVF9DT05GSUdfT1BUSU9OX1NGTlRfTkFNRVMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVHJ1ZVR5cGUgQ01hcCBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEhlcmUgeW91IGNhbiBmaW5lLXR1bmUgd2hpY2ggVHJ1ZVR5cGUgQ01hcCB0YWJsZSBmb3JtYXQgc2hhbGwgYmUgICAgKi8KLSAgLyogICBzdXBwb3J0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8wCi0jZGVmaW5lIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8yCi0jZGVmaW5lIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF80Ci0jZGVmaW5lIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF82Ci0jZGVmaW5lIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF84Ci0jZGVmaW5lIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8xMAotI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMTIKLSNkZWZpbmUgVFRfQ09ORklHX0NNQVBfRk9STUFUXzEzCi0jZGVmaW5lIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8xNAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgVCBSIFUgRSBUIFkgUCBFICAgRCBSIEkgViBFIFIgICAgQyBPIE4gRiBJIEcgVSBSIEEgVCBJIE8gTiAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUlBSRVRFUiBpZiB5b3Ugd2FudCB0byBjb21waWxlICAgKi8KLSAgLyogYSBieXRlY29kZSBpbnRlcnByZXRlciBpbiB0aGUgVHJ1ZVR5cGUgZHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBCeSB1bmRlZmluaW5nIHRoaXMsIHlvdSB3aWxsIG9ubHkgY29tcGlsZSB0aGUgY29kZSBuZWNlc3NhcnkgdG8gbG9hZCAgKi8KLSAgLyogVHJ1ZVR5cGUgZ2x5cGhzIHdpdGhvdXQgaGludGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIERvIG5vdCAjdW5kZWYgdGhpcyBtYWNybyBoZXJlLCBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0ICAgICAgICAgKi8KLSAgLyogICBkZWZpbmUgaXQgZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgaWYgeW91IHdhbnQgdG8gY29tcGlsZSAgICAgICAqLwotICAvKiBFWFBFUklNRU5UQUwgc3VicGl4ZWwgaGludGluZyBzdXBwb3J0IGludG8gdGhlIFRydWVUeXBlIGRyaXZlci4gIFRoaXMgKi8KLSAgLyogcmVwbGFjZXMgdGhlIG5hdGl2ZSBUcnVlVHlwZSBoaW50aW5nIG1lY2hhbmlzbSB3aGVuIGFueXRoaW5nIGJ1dCAgICAgICovCi0gIC8qIEZUX1JFTkRFUl9NT0RFX01PTk8gaXMgcmVxdWVzdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRW5hYmxpbmcgdGhpcyBjYXVzZXMgdGhlIFRydWVUeXBlIGRyaXZlciB0byBpZ25vcmUgaW5zdHJ1Y3Rpb25zIHVuZGVyICovCi0gIC8qIGNlcnRhaW4gY29uZGl0aW9ucy4gIFRoaXMgaXMgZG9uZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIGd1aWRlIGhlcmUsICAqLwotICAvKiB3aXRoIHNvbWUgbWlub3IgZGlmZmVyZW5jZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS9jbGVhcnR5cGUvdHJ1ZXR5cGVjbGVhcnR5cGUuYXNweCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQnkgdW5kZWZpbmluZyB0aGlzLCB5b3Ugb25seSBjb21waWxlIHRoZSBjb2RlIG5lY2Vzc2FyeSB0byBoaW50ICAgICAgICovCi0gIC8qIFRydWVUeXBlIGdseXBocyB3aXRoIG5hdGl2ZSBUVCBoaW50aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGlzIG9wdGlvbiByZXF1aXJlcyBUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSIHRvIGJlICAgICovCi0gIC8qICAgZGVmaW5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElmIHlvdSBkZWZpbmUgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcsIGEgc3BlY2lhbCB2ZXJzaW9uICAqLwotICAvKiBvZiB0aGUgVHJ1ZVR5cGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgaXMgdXNlZCB0aGF0IGRvZXNuJ3QgaW1wbGVtZW50ICAgKi8KLSAgLyogYW55IG9mIHRoZSBwYXRlbnRlZCBvcGNvZGVzIGFuZCBhbGdvcml0aG1zLiAgVGhlIHBhdGVudHMgcmVsYXRlZCB0byAgICovCi0gIC8qIFRydWVUeXBlIGhpbnRpbmcgaGF2ZSBleHBpcmVkIHdvcmxkd2lkZSBzaW5jZSBNYXkgMjAxMDsgdGhpcyBvcHRpb24gICAqLwotICAvKiBpcyBub3cgZGVwcmVjYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUgdGhhdCB0aGUgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcgbWFjcm8gaXMgKmlnbm9yZWQqICAqLwotICAvKiBpZiB5b3UgZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVI7IGluIG90aGVyIHdvcmRzLCAgKi8KLSAgLyogZWl0aGVyIGRlZmluZSBUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSIG9yICAgICAgICAgICAgICAgICovCi0gIC8qIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HIGJ1dCBub3QgYm90aCBhdCB0aGUgc2FtZSB0aW1lLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBtYWNybyBpcyBvbmx5IHVzZWZ1bCBmb3IgYSBzbWFsbCBudW1iZXIgb2YgZm9udCBmaWxlcyAobW9zdGx5ICAgICovCi0gIC8qIGZvciBBc2lhbiBzY3JpcHRzKSB0aGF0IHJlcXVpcmUgYnl0ZWNvZGUgaW50ZXJwcmV0YXRpb24gdG8gcHJvcGVybHkgICAqLwotICAvKiBsb2FkIGdseXBocy4gIEZvciBhbGwgb3RoZXIgZm9udHMsIHRoaXMgcHJvZHVjZXMgdW5wbGVhc2FudCByZXN1bHRzLCAgKi8KLSAgLyogdGh1cyB0aGUgdW5wYXRlbnRlZCBpbnRlcnByZXRlciBpcyBuZXZlciB1c2VkIHRvIGxvYWQgZ2x5cGhzIGZyb20gICAgICovCi0gIC8qIFRydWVUeXBlIGZvbnRzIHVubGVzcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gb3B0aW9ucyBpcyB1c2VkLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAtIFRoZSB1bnBhdGVudGVkIGludGVycHJldGVyIGlzIGV4cGxpY2l0bHkgYWN0aXZhdGVkIGJ5IHRoZSB1c2VyICAgICovCi0gIC8qICAgICB0aHJvdWdoIHRoZSBGVF9QQVJBTV9UQUdfVU5QQVRFTlRFRF9ISU5USU5HIHBhcmFtZXRlciB0YWcgICAgICAgICAqLwotICAvKiAgICAgd2hlbiBvcGVuaW5nIHRoZSBGVF9GYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgLSBGcmVlVHlwZSBkZXRlY3RzIHRoYXQgdGhlIEZUX0ZhY2UgY29ycmVzcG9uZHMgdG8gb25lIG9mIHRoZSAgICAgICAqLwotICAvKiAgICAgYHRyaWNrJyBmb250cyAoZS5nLiwgYE1pbmdsaXUnKSBpdCBrbm93cyBhYm91dC4gIFRoZSBmb250IGVuZ2luZSAgKi8KLSAgLyogICAgIGNvbnRhaW5zIGEgaGFyZC1jb2RlZCBsaXN0IG9mIGZvbnQgbmFtZXMgYW5kIG90aGVyIG1hdGNoaW5nICAgICAgICovCi0gIC8qICAgICBwYXJhbWV0ZXJzIChzZWUgZnVuY3Rpb24gYHR0X2ZhY2VfaW5pdCcgaW4gZmlsZSAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgYHNyYy90cnVldHlwZS90dG9ianMuYycpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEhlcmUgYSBzYW1wbGUgY29kZSBzbmlwcGV0IGZvciB1c2luZyBGVF9QQVJBTV9UQUdfVU5QQVRFTlRFRF9ISU5USU5HLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBGVF9QYXJhbWV0ZXIgIHBhcmFtZXRlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgRlRfT3Blbl9BcmdzICBvcGVuX2FyZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgcGFyYW1ldGVyLnRhZyA9IEZUX1BBUkFNX1RBR19VTlBBVEVOVEVEX0hJTlRJTkc7ICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBvcGVuX2FyZ3MuZmxhZ3MgICAgICA9IEZUX09QRU5fUEFUSE5BTUUgfCBGVF9PUEVOX1BBUkFNUzsgICAgICAgICAqLwotICAvKiAgICAgb3Blbl9hcmdzLnBhdGhuYW1lICAgPSBteV9mb250X3BhdGhuYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIG9wZW5fYXJncy5udW1fcGFyYW1zID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBvcGVuX2FyZ3MucGFyYW1zICAgICA9ICZwYXJhbWV0ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGVycm9yID0gRlRfT3Blbl9GYWNlKCBsaWJyYXJ5LCAmb3Blbl9hcmdzLCBpbmRleCwgJmZhY2UgKTsgICAgICAgICovCi0gIC8qICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX0lOVEVSUFJFVEVSX1NXSVRDSCB0byBjb21waWxlIHRoZSBUcnVlVHlwZSAgICAqLwotICAvKiBieXRlY29kZSBpbnRlcnByZXRlciB3aXRoIGEgaHVnZSBzd2l0Y2ggc3RhdGVtZW50LCByYXRoZXIgdGhhbiBhIGNhbGwgKi8KLSAgLyogdGFibGUuICBUaGlzIHJlc3VsdHMgaW4gc21hbGxlciBhbmQgZmFzdGVyIGNvZGUgZm9yIGEgbnVtYmVyIG9mICAgICAgICovCi0gIC8qIGFyY2hpdGVjdHVyZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZSBob3dldmVyIHRoYXQgb24gc29tZSBjb21waWxlci9wcm9jZXNzb3IgY29tYmluYXRpb25zLCB1bmRlZmluaW5nICovCi0gIC8qIHRoaXMgbWFjcm8gd2lsbCBnZW5lcmF0ZSBmYXN0ZXIsIHRob3VnaCBsYXJnZXIsIGNvZGUuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9JTlRFUlBSRVRFUl9TV0lUQ0gKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIFRUX0NPTkZJR19PUFRJT05fQ09NUE9ORU5UX09GRlNFVF9TQ0FMRUQgdG8gY29tcGlsZSB0aGUgICAgICAgICovCi0gIC8qIFRydWVUeXBlIGdseXBoIGxvYWRlciB0byB1c2UgQXBwbGUncyBkZWZpbml0aW9uIG9mIGhvdyB0byBoYW5kbGUgICAgICAqLwotICAvKiBjb21wb25lbnQgb2Zmc2V0cyBpbiBjb21wb3NpdGUgZ2x5cGhzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFwcGxlIGFuZCBNUyBkaXNhZ3JlZSBvbiB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBjb21wb25lbnQgb2Zmc2V0cyAgICAqLwotICAvKiBpbiBjb21wb3NpdGVzLiAgQXBwbGUgc2F5cyB0aGF0IHRoZXkgc2hvdWxkIGJlIHNjYWxlZCBieSB0aGUgc2NhbGluZyAgKi8KLSAgLyogZmFjdG9ycyBpbiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IChyb3VnaGx5LCBpdCdzIG1vcmUgY29tcGxleCkgICAgICovCi0gIC8qIHdoaWxlIE1TIHNheXMgdGhleSBzaG91bGQgbm90LiAgT3BlblR5cGUgZGVmaW5lcyB0d28gYml0cyBpbiB0aGUgICAgICAqLwotICAvKiBjb21wb3NpdGUgZmxhZ3MgYXJyYXkgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZGlzYW1iaWd1YXRlLCBidXQgb2xkICAgICAgKi8KLSAgLyogZm9udHMgd2lsbCBub3QgaGF2ZSB0aGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L290c3BlYy9nbHlmLmh0bSAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBodHRwOi8vZm9udHMuYXBwbGUuY29tL1RUUmVmTWFuL1JNMDYvQ2hhcDZnbHlmLmh0bWwgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmIFRUX0NPTkZJR19PUFRJT05fQ09NUE9ORU5UX09GRlNFVF9TQ0FMRUQKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQgaWYgeW91IHdhbnQgdG8gaW5jbHVkZSAgICAgICAgICovCi0gIC8qIHN1cHBvcnQgZm9yIEFwcGxlJ3MgZGlzdG9ydGFibGUgZm9udCB0ZWNobm9sb2d5IChmdmFyLCBndmFyLCBjdmFyLCAgICAqLwotICAvKiBhbmQgYXZhciB0YWJsZXMpLiAgVGhpcyBoYXMgbWFueSBzaW1pbGFyaXRpZXMgdG8gVHlwZSAxIE11bHRpcGxlICAgICAgKi8KLSAgLyogTWFzdGVycyBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIFRUX0NPTkZJR19PUFRJT05fQkRGIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgICAgICAgICovCi0gIC8qIGFuIGVtYmVkZGVkIGBCREYgJyB0YWJsZSB3aXRoaW4gU0ZOVC1iYXNlZCBiaXRtYXAgZm9ybWF0cy4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiBUVF9DT05GSUdfT1BUSU9OX0JERgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICBUIFkgUCBFIDEgICBEIFIgSSBWIEUgUiAgICBDIE8gTiBGIEkgRyBVIFIgQSBUIEkgTyBOICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFQxX01BWF9ESUNUX0RFUFRIIGlzIHRoZSBtYXhpbXVtIGRlcHRoIG9mIG5lc3QgZGljdGlvbmFyaWVzIGFuZCAgICAgICAqLwotICAvKiBhcnJheXMgaW4gdGhlIFR5cGUgMSBzdHJlYW0gKHNlZSB0MWxvYWQuYykuICBBIG1pbmltdW0gb2YgNCBpcyAgICAgICAgKi8KLSAgLyogcmVxdWlyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUMV9NQVhfRElDVF9ERVBUSCAgNQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUMV9NQVhfU1VCUlNfQ0FMTFMgZGV0YWlscyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbmVzdGVkIHN1Yi1yb3V0aW5lICAgKi8KLSAgLyogY2FsbHMgZHVyaW5nIGdseXBoIGxvYWRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUMV9NQVhfU1VCUlNfQ0FMTFMgIDE2Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFQxX01BWF9DSEFSU1RSSU5HX09QRVJBTkRTIGlzIHRoZSBjaGFyc3RyaW5nIHN0YWNrJ3MgY2FwYWNpdHkuICBBICAgICAqLwotICAvKiBtaW5pbXVtIG9mIDE2IGlzIHJlcXVpcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBDaGluZXNlIGZvbnQgTWluZ1RpRUctTWVkaXVtIChDTlMgMTE2NDMgY2hhcmFjdGVyIHNldCkgbmVlZHMgMjU2LiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVDFfTUFYX0NIQVJTVFJJTkdTX09QRVJBTkRTICA1MTIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIHRoaXMgY29uZmlndXJhdGlvbiBtYWNybyBpZiB5b3Ugd2FudCB0byBwcmV2ZW50IHRoZSAgICAgICAgICAgICovCi0gIC8qIGNvbXBpbGF0aW9uIG9mIGB0MWFmbScsIHdoaWNoIGlzIGluIGNoYXJnZSBvZiByZWFkaW5nIFR5cGUgMSBBRk0gICAgICAqLwotICAvKiBmaWxlcyBpbnRvIGFuIGV4aXN0aW5nIGZhY2UuICBOb3RlIHRoYXQgaWYgc2V0LCB0aGUgVDEgZHJpdmVyIHdpbGwgYmUgKi8KLSAgLyogdW5hYmxlIHRvIHByb2R1Y2Uga2VybmluZyBkaXN0YW5jZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmIFQxX0NPTkZJR19PUFRJT05fTk9fQUZNCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSB0aGlzIGNvbmZpZ3VyYXRpb24gbWFjcm8gaWYgeW91IHdhbnQgdG8gcHJldmVudCB0aGUgICAgICAgICAgICAqLwotICAvKiBjb21waWxhdGlvbiBvZiB0aGUgTXVsdGlwbGUgTWFzdGVycyBmb250IHN1cHBvcnQgaW4gdGhlIFR5cGUgMSAgICAgICAgKi8KLSAgLyogZHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmIFQxX0NPTkZJR19PUFRJT05fTk9fTU1fU1VQUE9SVAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICBDIEYgRiAgIEQgUiBJIFYgRSBSICAgIEMgTyBOIEYgSSBHIFUgUiBBIFQgSSBPIE4gICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFVzaW5nIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfe1gsWX17MSwyLDMsNH0gaXQgaXMgICAgICAqLwotICAvKiBwb3NzaWJsZSB0byBzZXQgdXAgdGhlIGRlZmF1bHQgdmFsdWVzIG9mIHRoZSBmb3VyIGNvbnRyb2wgcG9pbnRzIHRoYXQgKi8KLSAgLyogZGVmaW5lIHRoZSBzdGVtIGRhcmtlbmluZyBiZWhhdmlvdXIgb2YgdGhlIChuZXcpIENGRiBlbmdpbmUuICBGb3IgICAgICovCi0gIC8qIG1vcmUgZGV0YWlscyBwbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBgZGFya2VuaW5nLXBhcmFtZXRlcnMnIHByb3BlcnR5IG9mIHRoZSBjZmYgZHJpdmVyIG1vZHVsZSAoZmlsZSAgICAgICAgKi8KLSAgLyogYGZ0Y2ZmZHJ2LmgnKSwgd2hpY2ggYWxsb3dzIHRoZSBjb250cm9sIGF0IHJ1bi10aW1lLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEbyAqbm90KiB1bmRlZmluZSB0aGVzZSBtYWNyb3MhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDEgICA1MDAKLSNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9ZMSAgIDQwMAotCi0jZGVmaW5lIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDIgIDEwMDAKLSNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9ZMiAgIDI3NQotCi0jZGVmaW5lIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDMgIDE2NjcKLSNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9ZMyAgIDI3NQotCi0jZGVmaW5lIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDQgIDIzMzMKLSNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9ZNCAgICAgMAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FIGNvbnRyb2xzIHdoZXRoZXIgdGhlIHByZS1BZG9iZSBDRkYgICAgICAgKi8KLSAgLyogZW5naW5lIGdldHMgY29tcGlsZWQgaW50byBGcmVlVHlwZS4gIElmIGRlZmluZWQsIGl0IGlzIHBvc3NpYmxlIHRvICAgICovCi0gIC8qIHN3aXRjaCBiZXR3ZWVuIHRoZSB0d28gZW5naW5lcyB1c2luZyB0aGUgYGhpbnRpbmctZW5naW5lJyBwcm9wZXJ0eSBvZiAqLwotICAvKiB0aGUgY2ZmIGRyaXZlciBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIENGRl9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgIEEgVSBUIE8gRiBJIFQgICBNIE8gRCBVIEwgRSAgICBDIE8gTiBGIEkgRyBVIFIgQSBUIEkgTyBOICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBDb21waWxlIGF1dG9maXQgbW9kdWxlIHdpdGggQ0pLIChDaGluZXNlLCBKYXBhbmVzZSwgS29yZWFuKSBzY3JpcHQgICAgKi8KLSAgLyogc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBBRl9DT05GSUdfT1BUSU9OX0NKSwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ29tcGlsZSBhdXRvZml0IG1vZHVsZSB3aXRoIEluZGljIHNjcmlwdCBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBBRl9DT05GSUdfT1BUSU9OX0lORElDCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBDb21waWxlIGF1dG9maXQgbW9kdWxlIHdpdGggd2FycCBoaW50aW5nLiAgVGhlIGlkZWEgb2YgdGhlIHdhcnBpbmcgICAgKi8KLSAgLyogY29kZSBpcyB0byBzbGlnaHRseSBzY2FsZSBhbmQgc2hpZnQgYSBnbHlwaCB3aXRoaW4gYSBzaW5nbGUgZGltZW5zaW9uICovCi0gIC8qIHNvIHRoYXQgYXMgbXVjaCBvZiBpdHMgc2VnbWVudHMgYXJlIGFsaWduZWQgKG1vcmUgb3IgbGVzcykgb24gdGhlICAgICAqLwotICAvKiBncmlkLiAgVG8gZmluZCBvdXQgdGhlIG9wdGltYWwgc2NhbGluZyBhbmQgc2hpZnRpbmcgdmFsdWUsIHZhcmlvdXMgICAgKi8KLSAgLyogcGFyYW1ldGVyIGNvbWJpbmF0aW9ucyBhcmUgdHJpZWQgYW5kIHNjb3JlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGV4cGVyaW1lbnRhbCBvcHRpb24gaXMgb25seSBhY3RpdmUgaWYgdGhlIHJlbmRlciBtb2RlIGlzICAgICAgICAgKi8KLSAgLyogRlRfUkVOREVSX01PREVfTElHSFQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogI2RlZmluZSBBRl9DT05GSUdfT1BUSU9OX1VTRV9XQVJQRVIgKi8KLQotICAvKiAqLwotCi0KLSAgLyoKLSAgICogVGhpcyBtYWNybyBpcyBvYnNvbGV0ZS4gIFN1cHBvcnQgaGFzIGJlZW4gcmVtb3ZlZCBpbiBGcmVlVHlwZQotICAgKiB2ZXJzaW9uIDIuNS4KLSAgICovCi0vKiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fT0xEX0lOVEVSTkFMUyAqLwotCi0KLSAgLyoKLSAgICogVGhpcyBtYWNybyBpcyBkZWZpbmVkIGlmIGVpdGhlciB1bnBhdGVudGVkIG9yIG5hdGl2ZSBUcnVlVHlwZQotICAgKiBoaW50aW5nIGlzIHJlcXVlc3RlZCBieSB0aGUgZGVmaW5pdGlvbnMgYWJvdmUuCi0gICAqLwotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVIKLSNkZWZpbmUgIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotI3VuZGVmICAgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcKLSNlbGlmIGRlZmluZWQgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcKLSNkZWZpbmUgIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotI2VuZGlmCi0KLQotICAvKgotICAgKiBDaGVjayBDRkYgZGFya2VuaW5nIHBhcmFtZXRlcnMuICBUaGUgY2hlY2tzIGFyZSB0aGUgc2FtZSBhcyBpbiBmdW5jdGlvbgotICAgKiBgY2ZmX3Byb3BlcnR5X3NldCcgaW4gZmlsZSBgY2ZmZHJpdnIuYycuCi0gICAqLwotI2lmIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDEgPCAwICAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDIgPCAwICAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDMgPCAwICAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDQgPCAwICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTEgPCAwICAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTIgPCAwICAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTMgPCAwICAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTQgPCAwICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDEgPiAgICAgICAgXAotICAgICAgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMiAgICAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDIgPiAgICAgICAgXAotICAgICAgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMyAgICAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDMgPiAgICAgICAgXAotICAgICAgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YNCAgICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTEgPiA1MDAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTIgPiA1MDAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTMgPiA1MDAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTQgPiA1MDAKLSNlcnJvciAiSW52YWxpZCBDRkYgZGFya2VuaW5nIHBhcmFtZXRlcnMhIgotI2VuZGlmCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19GVE9QVElPTl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvY29uZmlnL2Z0c3RkbGliLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2NvbmZpZy9mdHN0ZGxpYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTQwZWZjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvY29uZmlnL2Z0c3RkbGliLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzdGRsaWIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFOU0ktc3BlY2lmaWMgbGlicmFyeSBhbmQgaGVhZGVyIGNvbmZpZ3VyYXRpb24gZmlsZSAoc3BlY2lmaWNhdGlvbiAgICovCi0vKiAgICBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDA3LCAyMDA5LCAyMDExLTIwMTIgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGdyb3VwIGFsbCAjaW5jbHVkZXMgdG8gdGhlIEFOU0kgQyBsaWJyYXJ5IHRoYXQgICAqLwotICAvKiBGcmVlVHlwZSBub3JtYWxseSByZXF1aXJlcy4gIEl0IGFsc28gZGVmaW5lcyBtYWNyb3MgdG8gcmVuYW1lIHRoZSAgICAgKi8KLSAgLyogc3RhbmRhcmQgZnVuY3Rpb25zIHdpdGhpbiB0aGUgRnJlZVR5cGUgc291cmNlIGNvZGUuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBMb2FkIGEgZmlsZSB3aGljaCBkZWZpbmVzIF9fRlRTVERMSUJfSF9fIGJlZm9yZSB0aGlzIG9uZSB0byBvdmVycmlkZSAgKi8KLSAgLyogaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRTVERMSUJfSF9fCi0jZGVmaW5lIF9fRlRTVERMSUJfSF9fCi0KLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jZGVmaW5lIGZ0X3B0cmRpZmZfdCAgcHRyZGlmZl90Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdlciBsaW1pdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVUlOVF9NQVggYW5kIFVMT05HX01BWCBhcmUgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGNvbXB1dGUgdGhlIHNpemUgICovCi0gIC8qIG9mIGBpbnQnIGFuZCBgbG9uZycgaW4gYnl0ZXMgYXQgY29tcGlsZS10aW1lLiAgU28gZmFyLCB0aGlzIHdvcmtzICAqLwotICAvKiBmb3IgYWxsIHBsYXRmb3JtcyB0aGUgbGlicmFyeSBoYXMgYmVlbiB0ZXN0ZWQgb24uICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUgdGhhdCBvbiB0aGUgZXh0cmVtZWx5IHJhcmUgcGxhdGZvcm1zIHRoYXQgZG8gbm90IHByb3ZpZGUgICAgICAqLwotICAvKiBpbnRlZ2VyIHR5cGVzIHRoYXQgYXJlIF9leGFjdGx5XyAxNiBhbmQgMzIgYml0cyB3aWRlIChlLmcuIHNvbWUgICAgKi8KLSAgLyogb2xkIENyYXlzIHdoZXJlIGBpbnQnIGlzIDM2IGJpdHMpLCB3ZSBkbyBub3QgbWFrZSBhbnkgZ3VhcmFudGVlICAgICovCi0gIC8qIGFib3V0IHRoZSBjb3JyZWN0IGJlaGF2aW91ciBvZiBGVDIgd2l0aCBhbGwgZm9udHMuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSW4gdGhlc2UgY2FzZSwgYGZ0Y29uZmlnLmgnIHdpbGwgcmVmdXNlIHRvIGNvbXBpbGUgYW55d2F5IHdpdGggYSAgICovCi0gIC8qIG1lc3NhZ2UgbGlrZSBgY291bGRuJ3QgZmluZCAzMi1iaXQgdHlwZScgb3Igc29tZXRoaW5nIHNpbWlsYXIuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGxpbWl0cy5oPgotCi0jZGVmaW5lIEZUX0NIQVJfQklUICAgIENIQVJfQklUCi0jZGVmaW5lIEZUX1VTSE9SVF9NQVggIFVTSFJUX01BWAotI2RlZmluZSBGVF9JTlRfTUFYICAgICBJTlRfTUFYCi0jZGVmaW5lIEZUX0lOVF9NSU4gICAgIElOVF9NSU4KLSNkZWZpbmUgRlRfVUlOVF9NQVggICAgVUlOVF9NQVgKLSNkZWZpbmUgRlRfVUxPTkdfTUFYICAgVUxPTkdfTUFYCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgYW5kIHN0cmluZyBwcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIGZ0X21lbWNociAgIG1lbWNocgotI2RlZmluZSBmdF9tZW1jbXAgICBtZW1jbXAKLSNkZWZpbmUgZnRfbWVtY3B5ICAgbWVtY3B5Ci0jZGVmaW5lIGZ0X21lbW1vdmUgIG1lbW1vdmUKLSNkZWZpbmUgZnRfbWVtc2V0ICAgbWVtc2V0Ci0jZGVmaW5lIGZ0X3N0cmNhdCAgIHN0cmNhdAotI2RlZmluZSBmdF9zdHJjbXAgICBzdHJjbXAKLSNkZWZpbmUgZnRfc3RyY3B5ICAgc3RyY3B5Ci0jZGVmaW5lIGZ0X3N0cmxlbiAgIHN0cmxlbgotI2RlZmluZSBmdF9zdHJuY21wICBzdHJuY21wCi0jZGVmaW5lIGZ0X3N0cm5jcHkgIHN0cm5jcHkKLSNkZWZpbmUgZnRfc3RycmNociAgc3RycmNocgotI2RlZmluZSBmdF9zdHJzdHIgICBzdHJzdHIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGhhbmRsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2RlZmluZSBGVF9GSUxFICAgICBGSUxFCi0jZGVmaW5lIGZ0X2ZjbG9zZSAgIGZjbG9zZQotI2RlZmluZSBmdF9mb3BlbiAgICBmb3BlbgotI2RlZmluZSBmdF9mcmVhZCAgICBmcmVhZAotI2RlZmluZSBmdF9mc2VlayAgICBmc2VlawotI2RlZmluZSBmdF9mdGVsbCAgICBmdGVsbAotI2RlZmluZSBmdF9zcHJpbnRmICBzcHJpbnRmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jZGVmaW5lIGZ0X3Fzb3J0ICBxc29ydAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSBhbGxvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgZnRfc2NhbGxvYyAgIGNhbGxvYwotI2RlZmluZSBmdF9zZnJlZSAgICAgZnJlZQotI2RlZmluZSBmdF9zbWFsbG9jICAgbWFsbG9jCi0jZGVmaW5lIGZ0X3NyZWFsbG9jICByZWFsbG9jCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNjZWxsYW5lb3VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBmdF9hdG9sICAgYXRvbAotI2RlZmluZSBmdF9sYWJzICAgbGFicwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb24gY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotI2RlZmluZSBmdF9qbXBfYnVmICAgICBqbXBfYnVmICAvKiBub3RlOiB0aGlzIGNhbm5vdCBiZSBhIHR5cGVkZWYgc2luY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgam1wX2J1ZiBpcyBkZWZpbmVkIGFzIGEgbWFjcm8gICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgIG9uIGNlcnRhaW4gcGxhdGZvcm1zICAgICAgICAgICAqLwotCi0jZGVmaW5lIGZ0X2xvbmdqbXAgICAgIGxvbmdqbXAKLSNkZWZpbmUgZnRfc2V0am1wKCBiICkgc2V0am1wKCAqKGZ0X2ptcF9idWYqKSAmKGIpICkgLyogc2FtZSB0aGluZyBoZXJlICovCi0KLQotICAvKiB0aGUgZm9sbG93aW5nIGlzIG9ubHkgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBpLmUuLCBpZiAqLwotICAvKiBGVF9ERUJVR19MRVZFTF9FUlJPUiBvciBGVF9ERUJVR19MRVZFTF9UUkFDRSBhcmUgZGVmaW5lZCAgICAqLwotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLQotI2VuZGlmIC8qIF9fRlRTVERMSUJfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYmQxM2EuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDA0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmcmVldHlwZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgaGlnaC1sZXZlbCBBUEkgYW5kIGNvbW1vbiB0eXBlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GUkVFVFlQRV9IX18KLSNkZWZpbmUgX19GUkVFVFlQRV9IX18KLQotCi0jaWZuZGVmIEZUX0ZSRUVUWVBFX0gKLSNlcnJvciAiYGZ0MmJ1aWxkLmgnIGhhc24ndCBiZWVuIGluY2x1ZGVkIHlldCEiCi0jZXJyb3IgIlBsZWFzZSBhbHdheXMgdXNlIG1hY3JvcyB0byBpbmNsdWRlIEZyZWVUeXBlIGhlYWRlciBmaWxlcy4iCi0jZXJyb3IgIkV4YW1wbGU6IgotI2Vycm9yICIgICNpbmNsdWRlIDxmdDJidWlsZC5oPiIKLSNlcnJvciAiICAjaW5jbHVkZSBGVF9GUkVFVFlQRV9IIgotI2VuZGlmCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9DT05GSUdfQ09ORklHX0gKLSNpbmNsdWRlIEZUX1RZUEVTX0gKLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhlYWRlcl9pbmNsdXNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlJ3MgaGVhZGVyIGluY2x1c2lvbiBzY2hlbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEhvdyBjbGllbnQgYXBwbGljYXRpb25zIHNob3VsZCBpbmNsdWRlIEZyZWVUeXBlIGhlYWRlciBmaWxlcy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRvIGJlIGFzIGZsZXhpYmxlIGFzIHBvc3NpYmxlIChhbmQgZm9yIGhpc3RvcmljYWwgcmVhc29ucyksICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSB1c2VzIGEgdmVyeSBzcGVjaWFsIGluY2x1c2lvbiBzY2hlbWUgdG8gbG9hZCBoZWFkZXIgICAgICAgKi8KLSAgLyogICAgZmlsZXMsIGZvciBleGFtcGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAjaW5jbHVkZSA8ZnQyYnVpbGQuaD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICNpbmNsdWRlIEZUX0ZSRUVUWVBFX0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAjaW5jbHVkZSBGVF9PVVRMSU5FX0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBjb21waWxlciBhbmQgaXRzIHByZXByb2Nlc3NvciBvbmx5IG5lZWRzIGFuIGluY2x1ZGUgcGF0aCB0byBmaW5kICovCi0gIC8qICAgIHRoZSBmaWxlIGBmdDJidWlsZC5oJzsgdGhlIGV4YWN0IGxvY2F0aW9ucyBhbmQgbmFtZXMgb2YgdGhlIG90aGVyICAqLwotICAvKiAgICBGcmVlVHlwZSBoZWFkZXIgZmlsZXMgYXJlIGhpZGRlbiBieSBwcmVwcm9jZXNzb3IgbWFjcm8gbmFtZXMsICAgICAgKi8KLSAgLyogICAgbG9hZGVkIGJ5IGBmdDJidWlsZC5oJy4gIFRoZSBBUEkgZG9jdW1lbnRhdGlvbiBhbHdheXMgZ2l2ZXMgdGhlICAgICovCi0gIC8qICAgIGhlYWRlciBtYWNybyBuYW1lIG5lZWRlZCBmb3IgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1c2VyX2FsbG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2VyIGFsbG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBIb3cgY2xpZW50IGFwcGxpY2F0aW9ucyBzaG91bGQgYWxsb2NhdGUgRnJlZVR5cGUgZGF0YSBzdHJ1Y3R1cmVzLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBhc3N1bWVzIHRoYXQgc3RydWN0dXJlcyBhbGxvY2F0ZWQgYnkgdGhlIHVzZXIgYW5kIHBhc3NlZCAgKi8KLSAgLyogICAgYXMgYXJndW1lbnRzIGFyZSB6ZXJvZWQgb3V0IGV4Y2VwdCBmb3IgdGhlIGFjdHVhbCBkYXRhLiAgSW4gb3RoZXIgICovCi0gIC8qICAgIHdvcmRzLCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgYGNhbGxvYycgKG9yIHZhcmlhbnRzIG9mIGl0KSAgICAgICAqLwotICAvKiAgICBpbnN0ZWFkIG9mIGBtYWxsb2MnIGZvciBhbGxvY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIEIgQSBTIEkgQyAgIFQgWSBQIEUgUyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJhc2VfaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJhc2UgSW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBGcmVlVHlwZX4yIGJhc2UgZm9udCBpbnRlcmZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1vc3QgaW1wb3J0YW50IHB1YmxpYyBoaWdoLWxldmVsIEFQSSAgICAqLwotICAvKiAgICBmdW5jdGlvbnMgb2YgRnJlZVR5cGV+Mi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPcmRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaFNsb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQ2hhck1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VuY29kaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNfVEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX1NDQUxBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19GSVhFRF9TSVpFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfRklYRURfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0hPUklaT05UQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19WRVJUSUNBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX1NGTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19DSURfS0VZRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfVFJJQ0tZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0tFUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19NVUxUSVBMRV9NQVNURVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfR0xZUEhfTkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19ISU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfVFJJQ0tZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0hBU19IT1JJWk9OVEFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9IQVNfVkVSVElDQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSEFTX0tFUk5JTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0hBU19GSVhFRF9TSVpFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9IQVNfR0xZUEhfTkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSEFTX01VTFRJUExFX01BU1RFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0hBU19DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSVNfU0ZOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0lTX1NDQUxBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JU19GSVhFRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSVNfQ0lEX0tFWUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0lTX1RSSUNLWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU1RZTEVfRkxBR19CT0xEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NUWUxFX0ZMQUdfSVRBTElDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NpemVfTWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhTbG90UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoX01ldHJpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TdWJHbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0JpdG1hcF9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSW5pdF9GcmVlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RvbmVfRnJlZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTmV3X0ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RvbmVfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SZWZlcmVuY2VfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTmV3X01lbW9yeV9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09wZW5fRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PcGVuX0FyZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUGFyYW1ldGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0F0dGFjaF9GaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BdHRhY2hfU3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9DaGFyX1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfUGl4ZWxfU2l6ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmVxdWVzdF9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NlbGVjdF9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaXplX1JlcXVlc3RfVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZV9SZXF1ZXN0UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NpemVfUmVxdWVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfVHJhbnNmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTG9hZF9HbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9DaGFyX0luZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfRmlyc3RfQ2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X05leHRfQ2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9OYW1lX0luZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Mb2FkX0NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09QRU5fTUVNT1JZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PUEVOX1NUUkVBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1BFTl9QQVRITkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09QRU5fRFJJVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PUEVOX1BBUkFNUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX1JFTkRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9NT05PQ0hST01FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfTElORUFSX0RFU0lHTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX05PX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9OT19ISU5USU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfTk9fQklUTUFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX05PX0FVVE9ISU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9JR05PUkVfVFJBTlNGT1JNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfRk9SQ0VfQVVUT0hJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX05PX1JFQ1VSU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9QRURBTlRJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX1RBUkdFVF9OT1JNQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9UQVJHRVRfTElHSFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfVEFSR0VUX01PTk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX1RBUkdFVF9MQ0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9UQVJHRVRfTENEX1YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX1RBUkdFVF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlbmRlcl9HbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SZW5kZXJfTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0tlcm5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0tlcm5pbmdfTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfVHJhY2tfS2VybmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0dseXBoX05hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9Qb3N0c2NyaXB0X05hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQ2hhck1hcFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NlbGVjdF9DaGFybWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfQ2hhcm1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0NoYXJtYXBfSW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfRlNUeXBlX0ZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X1N1YkdseXBoX0luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GYWNlX0ludGVybmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZV9JbnRlcm5hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Nsb3RfSW50ZXJuYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NUWUxFX0ZMQUdfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PUEVOX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfVEFSR0VUX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TVUJHTFlQSF9GTEFHX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRlNUWVBFX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9IQVNfRkFTVF9HTFlQSFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhfTWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCB0aGUgbWV0cmljcyBvZiBhIHNpbmdsZSBnbHlwaC4gIFRoZSAgICAgICovCi0gIC8qICAgIHZhbHVlcyBhcmUgZXhwcmVzc2VkIGluIDI2LjYgZnJhY3Rpb25hbCBwaXhlbCBmb3JtYXQ7IGlmIHRoZSBmbGFnICAqLwotICAvKiAgICBARlRfTE9BRF9OT19TQ0FMRSBoYXMgYmVlbiB1c2VkIHdoaWxlIGxvYWRpbmcgdGhlIGdseXBoLCB2YWx1ZXMgICAgKi8KLSAgLyogICAgYXJlIGV4cHJlc3NlZCBpbiBmb250IHVuaXRzIGluc3RlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2lkdGggOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGdseXBoJ3Mgd2lkdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGVpZ2h0IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGdseXBoJ3MgaGVpZ2h0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaG9yaUJlYXJpbmdYIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgTGVmdCBzaWRlIGJlYXJpbmcgZm9yIGhvcml6b250YWwgbGF5b3V0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaG9yaUJlYXJpbmdZIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVG9wIHNpZGUgYmVhcmluZyBmb3IgaG9yaXpvbnRhbCBsYXlvdXQuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaG9yaUFkdmFuY2UgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQWR2YW5jZSB3aWR0aCBmb3IgaG9yaXpvbnRhbCBsYXlvdXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydEJlYXJpbmdYIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgTGVmdCBzaWRlIGJlYXJpbmcgZm9yIHZlcnRpY2FsIGxheW91dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydEJlYXJpbmdZIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVG9wIHNpZGUgYmVhcmluZyBmb3IgdmVydGljYWwgbGF5b3V0LiAgTGFyZ2VyIHBvc2l0aXZlIHZhbHVlcyAgICAqLwotICAvKiAgICAgIG1lYW4gZnVydGhlciBiZWxvdyB0aGUgdmVydGljYWwgZ2x5cGggb3JpZ2luLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnRBZHZhbmNlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEFkdmFuY2UgaGVpZ2h0IGZvciB2ZXJ0aWNhbCBsYXlvdXQuICBQb3NpdGl2ZSB2YWx1ZXMgbWVhbiB0aGUgICAgKi8KLSAgLyogICAgICBnbHlwaCBoYXMgYSBwb3NpdGl2ZSBhZHZhbmNlIGRvd253YXJkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgbm90IGRpc2FibGVkIHdpdGggQEZUX0xPQURfTk9fSElOVElORywgdGhlIHZhbHVlcyByZXByZXNlbnQgICAgICovCi0gIC8qICAgIGRpbWVuc2lvbnMgb2YgdGhlIGhpbnRlZCBnbHlwaCAoaW4gY2FzZSBoaW50aW5nIGlzIGFwcGxpY2FibGUpLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU3Ryb2tpbmcgYSBnbHlwaCB3aXRoIGFuIG91dHNpZGUgYm9yZGVyIGRvZXMgbm90IGluY3JlYXNlICAgICAgICAgICovCi0gIC8qICAgIGBob3JpQWR2YW5jZScgb3IgYHZlcnRBZHZhbmNlJzsgeW91IGhhdmUgdG8gbWFudWFsbHkgYWRqdXN0IHRoZXNlICAqLwotICAvKiAgICB2YWx1ZXMgdG8gYWNjb3VudCBmb3IgdGhlIGFkZGVkIHdpZHRoIGFuZCBoZWlnaHQuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9HbHlwaF9NZXRyaWNzXwotICB7Ci0gICAgRlRfUG9zICB3aWR0aDsKLSAgICBGVF9Qb3MgIGhlaWdodDsKLQotICAgIEZUX1BvcyAgaG9yaUJlYXJpbmdYOwotICAgIEZUX1BvcyAgaG9yaUJlYXJpbmdZOwotICAgIEZUX1BvcyAgaG9yaUFkdmFuY2U7Ci0KLSAgICBGVF9Qb3MgIHZlcnRCZWFyaW5nWDsKLSAgICBGVF9Qb3MgIHZlcnRCZWFyaW5nWTsKLSAgICBGVF9Qb3MgIHZlcnRBZHZhbmNlOwotCi0gIH0gRlRfR2x5cGhfTWV0cmljczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0JpdG1hcF9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIG1vZGVscyB0aGUgbWV0cmljcyBvZiBhIGJpdG1hcCBzdHJpa2UgKGkuZS4sIGEgc2V0ICAqLwotICAvKiAgICBvZiBnbHlwaHMgZm9yIGEgZ2l2ZW4gcG9pbnQgc2l6ZSBhbmQgcmVzb2x1dGlvbikgaW4gYSBiaXRtYXAgZm9udC4gKi8KLSAgLyogICAgSXQgaXMgdXNlZCBmb3IgdGhlIGBhdmFpbGFibGVfc2l6ZXMnIGZpZWxkIG9mIEBGVF9GYWNlLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGVpZ2h0IDo6IFRoZSB2ZXJ0aWNhbCBkaXN0YW5jZSwgaW4gcGl4ZWxzLCBiZXR3ZWVuIHR3byAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICBjb25zZWN1dGl2ZSBiYXNlbGluZXMuICBJdCBpcyBhbHdheXMgcG9zaXRpdmUuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2lkdGggIDo6IFRoZSBhdmVyYWdlIHdpZHRoLCBpbiBwaXhlbHMsIG9mIGFsbCBnbHlwaHMgaW4gdGhlICAgICAgICovCi0gIC8qICAgICAgICAgICAgICBzdHJpa2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSAgIDo6IFRoZSBub21pbmFsIHNpemUgb2YgdGhlIHN0cmlrZSBpbiAyNi42IGZyYWN0aW9uYWwgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICBwb2ludHMuICBUaGlzIGZpZWxkIGlzIG5vdCB2ZXJ5IHVzZWZ1bC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeF9wcGVtIDo6IFRoZSBob3Jpem9udGFsIHBwZW0gKG5vbWluYWwgd2lkdGgpIGluIDI2LjYgZnJhY3Rpb25hbCAgICovCi0gIC8qICAgICAgICAgICAgICBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeV9wcGVtIDo6IFRoZSB2ZXJ0aWNhbCBwcGVtIChub21pbmFsIGhlaWdodCkgaW4gMjYuNiBmcmFjdGlvbmFsICAgICovCi0gIC8qICAgICAgICAgICAgICBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdpbmRvd3MgRk5UOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBub21pbmFsIHNpemUgZ2l2ZW4gaW4gYSBGTlQgZm9udCBpcyBub3QgcmVsaWFibGUuICBUaHVzIHdoZW4gKi8KLSAgLyogICAgICB0aGUgZHJpdmVyIGZpbmRzIGl0IGluY29ycmVjdCwgaXQgc2V0cyBgc2l6ZScgdG8gc29tZSBjYWxjdWxhdGVkICovCi0gIC8qICAgICAgdmFsdWVzIGFuZCBzZXRzIGB4X3BwZW0nIGFuZCBgeV9wcGVtJyB0byB0aGUgcGl4ZWwgd2lkdGggYW5kICAgICAqLwotICAvKiAgICAgIGhlaWdodCBnaXZlbiBpbiB0aGUgZm9udCwgcmVzcGVjdGl2ZWx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRydWVUeXBlIGVtYmVkZGVkIGJpdG1hcHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGBzaXplJywgYHdpZHRoJywgYW5kIGBoZWlnaHQnIHZhbHVlcyBhcmUgbm90IGNvbnRhaW5lZCBpbiB0aGUgICAgKi8KLSAgLyogICAgICBiaXRtYXAgc3RyaWtlIGl0c2VsZi4gIFRoZXkgYXJlIGNvbXB1dGVkIGZyb20gdGhlIGdsb2JhbCBmb250ICAgICovCi0gIC8qICAgICAgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0JpdG1hcF9TaXplXwotICB7Ci0gICAgRlRfU2hvcnQgIGhlaWdodDsKLSAgICBGVF9TaG9ydCAgd2lkdGg7Ci0KLSAgICBGVF9Qb3MgICAgc2l6ZTsKLQotICAgIEZUX1BvcyAgICB4X3BwZW07Ci0gICAgRlRfUG9zICAgIHlfcHBlbTsKLQotICB9IEZUX0JpdG1hcF9TaXplOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBPIEIgSiBFIEMgVCAgIEMgTCBBIFMgUyBFIFMgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBGcmVlVHlwZSBsaWJyYXJ5IGluc3RhbmNlLiAgRWFjaCBgbGlicmFyeScgaXMgICAgICAgICovCi0gIC8qICAgIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQgZnJvbSB0aGUgb3RoZXJzOyBpdCBpcyB0aGUgYHJvb3QnIG9mIGEgc2V0ICAqLwotICAvKiAgICBvZiBvYmplY3RzIGxpa2UgZm9udHMsIGZhY2VzLCBzaXplcywgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEl0IGFsc28gZW1iZWRzIGEgbWVtb3J5IG1hbmFnZXIgKHNlZSBARlRfTWVtb3J5KSwgYXMgd2VsbCBhcyBhICAgICAqLwotICAvKiAgICBzY2FuLWxpbmUgY29udmVydGVyIG9iamVjdCAoc2VlIEBGVF9SYXN0ZXIpLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9ucywgbWFrZSBzdXJlIHRoYXQgdGhlIHNhbWUgRlRfTGlicmFyeSAqLwotICAvKiAgICBvYmplY3Qgb3IgYW55IG9mIGl0cyBjaGlsZHJlbiBkb2Vzbid0IGdldCBhY2Nlc3NlZCBpbiBwYXJhbGxlbC4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMaWJyYXJ5IG9iamVjdHMgYXJlIG5vcm1hbGx5IGNyZWF0ZWQgYnkgQEZUX0luaXRfRnJlZVR5cGUsIGFuZCAgICAgKi8KLSAgLyogICAgZGVzdHJveWVkIHdpdGggQEZUX0RvbmVfRnJlZVR5cGUuICBJZiB5b3UgbmVlZCByZWZlcmVuY2UtY291bnRpbmcgICovCi0gIC8qICAgIChjZi4gQEZUX1JlZmVyZW5jZV9MaWJyYXJ5KSwgdXNlIEBGVF9OZXdfTGlicmFyeSBhbmQgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfRG9uZV9MaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX0xpYnJhcnlSZWNfICAqRlRfTGlicmFyeTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZV9tYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBnaXZlbiBGcmVlVHlwZSBtb2R1bGUgb2JqZWN0LiAgRWFjaCBtb2R1bGUgY2FuIGJlIGEgICovCi0gIC8qICAgIGZvbnQgZHJpdmVyLCBhIHJlbmRlcmVyLCBvciBhbnl0aGluZyBlbHNlIHRoYXQgcHJvdmlkZXMgc2VydmljZXMgICAqLwotICAvKiAgICB0byB0aGUgZm9ybWVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX01vZHVsZVJlY18qICBGVF9Nb2R1bGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Ecml2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIGdpdmVuIEZyZWVUeXBlIGZvbnQgZHJpdmVyIG9iamVjdC4gIEVhY2ggZm9udCBkcml2ZXIgKi8KLSAgLyogICAgaXMgYSBzcGVjaWFsIG1vZHVsZSBjYXBhYmxlIG9mIGNyZWF0aW5nIGZhY2VzIGZyb20gZm9udCBmaWxlcy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9Ecml2ZXJSZWNfKiAgRlRfRHJpdmVyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmVuZGVyZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBnaXZlbiBGcmVlVHlwZSByZW5kZXJlci4gIEEgcmVuZGVyZXIgaXMgYSBzcGVjaWFsICAgICovCi0gIC8qICAgIG1vZHVsZSBpbiBjaGFyZ2Ugb2YgY29udmVydGluZyBhIGdseXBoIGltYWdlIHRvIGEgYml0bWFwLCB3aGVuICAgICAqLwotICAvKiAgICBuZWNlc3NhcnkuICBFYWNoIHJlbmRlcmVyIHN1cHBvcnRzIGEgZ2l2ZW4gZ2x5cGggaW1hZ2UgZm9ybWF0LCBhbmQgKi8KLSAgLyogICAgb25lIG9yIG1vcmUgdGFyZ2V0IHN1cmZhY2UgZGVwdGhzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9SZW5kZXJlclJlY18qICBGVF9SZW5kZXJlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJhc2VfaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBnaXZlbiB0eXBvZ3JhcGhpYyBmYWNlIG9iamVjdC4gIEEgZmFjZSBvYmplY3QgbW9kZWxzICovCi0gIC8qICAgIGEgZ2l2ZW4gdHlwZWZhY2UsIGluIGEgZ2l2ZW4gc3R5bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEVhY2ggZmFjZSBvYmplY3QgYWxzbyBvd25zIGEgc2luZ2xlIEBGVF9HbHlwaFNsb3Qgb2JqZWN0LCBhcyB3ZWxsICAqLwotICAvKiAgICBhcyBvbmUgb3IgbW9yZSBARlRfU2l6ZSBvYmplY3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZSBARlRfTmV3X0ZhY2Ugb3IgQEZUX09wZW5fRmFjZSB0byBjcmVhdGUgYSBuZXcgZmFjZSBvYmplY3QgZnJvbSAqLwotICAvKiAgICBhIGdpdmVuIGZpbGVwYXRobmFtZSBvciBhIGN1c3RvbSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZSBARlRfRG9uZV9GYWNlIHRvIGRlc3Ryb3kgaXQgKGFsb25nIHdpdGggaXRzIHNsb3QgYW5kIHNpemVzKS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFsc28+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlZSBARlRfRmFjZVJlYyBmb3IgdGhlIHB1YmxpY2x5IGFjY2Vzc2libGUgZmllbGRzIG9mIGEgZ2l2ZW4gZmFjZSAqLwotICAvKiAgICBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX0ZhY2VSZWNfKiAgRlRfRmFjZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGFuIG9iamVjdCB1c2VkIHRvIG1vZGVsIGEgZmFjZSBzY2FsZWQgdG8gYSBnaXZlbiAgICAgICAqLwotICAvKiAgICBjaGFyYWN0ZXIgc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFYWNoIEBGVF9GYWNlIGhhcyBhbiBfYWN0aXZlXyBARlRfU2l6ZSBvYmplY3QgdGhhdCBpcyB1c2VkIGJ5ICAgICAgKi8KLSAgLyogICAgZnVuY3Rpb25zIGxpa2UgQEZUX0xvYWRfR2x5cGggdG8gZGV0ZXJtaW5lIHRoZSBzY2FsaW5nICAgICAgICAgICAgICovCi0gIC8qICAgIHRyYW5zZm9ybWF0aW9uIHRoYXQgaW4gdHVybiBpcyB1c2VkIHRvIGxvYWQgYW5kIGhpbnQgZ2x5cGhzIGFuZCAgICAqLwotICAvKiAgICBtZXRyaWNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFlvdSBjYW4gdXNlIEBGVF9TZXRfQ2hhcl9TaXplLCBARlRfU2V0X1BpeGVsX1NpemVzLCAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfUmVxdWVzdF9TaXplIG9yIGV2ZW4gQEZUX1NlbGVjdF9TaXplIHRvIGNoYW5nZSB0aGUgY29udGVudCAgICAgKi8KLSAgLyogICAgKGkuZS4sIHRoZSBzY2FsaW5nIHZhbHVlcykgb2YgdGhlIGFjdGl2ZSBARlRfU2l6ZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3UgY2FuIHVzZSBARlRfTmV3X1NpemUgdG8gY3JlYXRlIGFkZGl0aW9uYWwgc2l6ZSBvYmplY3RzIGZvciBhICAgKi8KLSAgLyogICAgZ2l2ZW4gQEZUX0ZhY2UsIGJ1dCB0aGV5IHdvbid0IGJlIHVzZWQgYnkgb3RoZXIgZnVuY3Rpb25zIHVudGlsICAgICovCi0gIC8qICAgIHlvdSBhY3RpdmF0ZSBpdCB0aHJvdWdoIEBGVF9BY3RpdmF0ZV9TaXplLiAgT25seSBvbmUgc2l6ZSBjYW4gYmUgICAqLwotICAvKiAgICBhY3RpdmF0ZWQgYXQgYW55IGdpdmVuIHRpbWUgcGVyIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBbHNvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWUgQEZUX1NpemVSZWMgZm9yIHRoZSBwdWJsaWNseSBhY2Nlc3NpYmxlIGZpZWxkcyBvZiBhIGdpdmVuIHNpemUgKi8KLSAgLyogICAgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9TaXplUmVjXyogIEZUX1NpemU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaFNsb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIGdpdmVuIGBnbHlwaCBzbG90Jy4gIEEgc2xvdCBpcyBhIGNvbnRhaW5lciB3aGVyZSBpdCAgKi8KLSAgLyogICAgaXMgcG9zc2libGUgdG8gbG9hZCBhbnkgb2YgdGhlIGdseXBocyBjb250YWluZWQgaW4gaXRzIHBhcmVudCAgICAgICovCi0gIC8qICAgIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW4gb3RoZXIgd29yZHMsIGVhY2ggdGltZSB5b3UgY2FsbCBARlRfTG9hZF9HbHlwaCBvciAgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9Mb2FkX0NoYXIsIHRoZSBzbG90J3MgY29udGVudCBpcyBlcmFzZWQgYnkgdGhlIG5ldyBnbHlwaCBkYXRhLCAqLwotICAvKiAgICBpLmUuLCB0aGUgZ2x5cGgncyBtZXRyaWNzLCBpdHMgaW1hZ2UgKGJpdG1hcCBvciBvdXRsaW5lKSwgYW5kICAgICAgKi8KLSAgLyogICAgb3RoZXIgY29udHJvbCBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWxzbz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VlIEBGVF9HbHlwaFNsb3RSZWMgZm9yIHRoZSBwdWJsaWNseSBhY2Nlc3NpYmxlIGdseXBoIGZpZWxkcy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9HbHlwaFNsb3RSZWNfKiAgRlRfR2x5cGhTbG90OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQ2hhck1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBnaXZlbiBjaGFyYWN0ZXIgbWFwLiAgQSBjaGFybWFwIGlzIHVzZWQgdG8gdHJhbnNsYXRlICovCi0gIC8qICAgIGNoYXJhY3RlciBjb2RlcyBpbiBhIGdpdmVuIGVuY29kaW5nIGludG8gZ2x5cGggaW5kZXhlcyBmb3IgaXRzICAgICAqLwotICAvKiAgICBwYXJlbnQncyBmYWNlLiAgU29tZSBmb250IGZvcm1hdHMgbWF5IHByb3ZpZGUgc2V2ZXJhbCBjaGFybWFwcyBwZXIgKi8KLSAgLyogICAgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFYWNoIGZhY2Ugb2JqZWN0IG93bnMgemVybyBvciBtb3JlIGNoYXJtYXBzLCBidXQgb25seSBvbmUgb2YgdGhlbSAgKi8KLSAgLyogICAgY2FuIGJlIGBhY3RpdmUnIGFuZCB1c2VkIGJ5IEBGVF9HZXRfQ2hhcl9JbmRleCBvciBARlRfTG9hZF9DaGFyLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbGlzdCBvZiBhdmFpbGFibGUgY2hhcm1hcHMgaW4gYSBmYWNlIGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSAgKi8KLSAgLyogICAgYGZhY2UtPm51bV9jaGFybWFwcycgYW5kIGBmYWNlLT5jaGFybWFwcycgZmllbGRzIG9mIEBGVF9GYWNlUmVjLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgY3VycmVudGx5IGFjdGl2ZSBjaGFybWFwIGlzIGF2YWlsYWJsZSBhcyBgZmFjZS0+Y2hhcm1hcCcuICAgICAgKi8KLSAgLyogICAgWW91IHNob3VsZCBjYWxsIEBGVF9TZXRfQ2hhcm1hcCB0byBjaGFuZ2UgaXQuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2hlbiBhIG5ldyBmYWNlIGlzIGNyZWF0ZWQgKGVpdGhlciB0aHJvdWdoIEBGVF9OZXdfRmFjZSBvciAgICAgICAgICovCi0gIC8qICAgIEBGVF9PcGVuX0ZhY2UpLCB0aGUgbGlicmFyeSBsb29rcyBmb3IgYSBVbmljb2RlIGNoYXJtYXAgd2l0aGluICAgICAqLwotICAvKiAgICB0aGUgbGlzdCBhbmQgYXV0b21hdGljYWxseSBhY3RpdmF0ZXMgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBbHNvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWUgQEZUX0NoYXJNYXBSZWMgZm9yIHRoZSBwdWJsaWNseSBhY2Nlc3NpYmxlIGZpZWxkcyBvZiBhIGdpdmVuICAgKi8KLSAgLyogICAgY2hhcmFjdGVyIG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9DaGFyTWFwUmVjXyogIEZUX0NoYXJNYXA7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNfVEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIG1hY3JvIGNvbnZlcnRzIGZvdXItbGV0dGVyIHRhZ3MgaW50byBhbiB1bnNpZ25lZCBsb25nLiAgSXQgaXMgKi8KLSAgLyogICAgdXNlZCB0byBkZWZpbmUgYGVuY29kaW5nJyBpZGVudGlmaWVycyAoc2VlIEBGVF9FbmNvZGluZykuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2luY2UgbWFueSAxNi1iaXQgY29tcGlsZXJzIGRvbid0IGxpa2UgMzItYml0IGVudW1lcmF0aW9ucywgeW91ICAgICovCi0gIC8qICAgIHNob3VsZCByZWRlZmluZSB0aGlzIG1hY3JvIGluIGNhc2Ugb2YgcHJvYmxlbXMgdG8gc29tZXRoaW5nIGxpa2UgICAqLwotICAvKiAgICB0aGlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICNkZWZpbmUgRlRfRU5DX1RBRyggdmFsdWUsIGEsIGIsIGMsIGQgKSAgdmFsdWUgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0byBnZXQgYSBzaW1wbGUgZW51bWVyYXRpb24gd2l0aG91dCBhc3NpZ25pbmcgc3BlY2lhbCBudW1iZXJzLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZm5kZWYgRlRfRU5DX1RBRwotI2RlZmluZSBGVF9FTkNfVEFHKCB2YWx1ZSwgYSwgYiwgYywgZCApICAgICAgICAgXAotICAgICAgICAgIHZhbHVlID0gKCAoIChGVF9VSW50MzIpKGEpIDw8IDI0ICkgfCAgXAotICAgICAgICAgICAgICAgICAgICAoIChGVF9VSW50MzIpKGIpIDw8IDE2ICkgfCAgXAotICAgICAgICAgICAgICAgICAgICAoIChGVF9VSW50MzIpKGMpIDw8ICA4ICkgfCAgXAotICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50MzIpKGQpICAgICAgICAgKQotCi0jZW5kaWYgLyogRlRfRU5DX1RBRyAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRW5jb2RpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gZW51bWVyYXRpb24gdXNlZCB0byBzcGVjaWZ5IGNoYXJhY3RlciBzZXRzIHN1cHBvcnRlZCBieSAgICAgICAgICovCi0gIC8qICAgIGNoYXJtYXBzLiAgVXNlZCBpbiB0aGUgQEZUX1NlbGVjdF9DaGFybWFwIEFQSSBmdW5jdGlvbi4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlc3BpdGUgdGhlIG5hbWUsIHRoaXMgZW51bWVyYXRpb24gbGlzdHMgc3BlY2lmaWMgY2hhcmFjdGVyICAgICAgICAqLwotICAvKiAgICByZXBlcnRvcmllcyAoaS5lLiwgY2hhcnNldHMpLCBhbmQgbm90IHRleHQgZW5jb2RpbmcgbWV0aG9kcyAoZS5nLiwgKi8KLSAgLyogICAgVVRGLTgsIFVURi0xNiwgZXRjLikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPdGhlciBlbmNvZGluZ3MgbWlnaHQgYmUgZGVmaW5lZCBpbiB0aGUgZnV0dXJlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19OT05FIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZW5jb2RpbmcgdmFsdWV+MCBpcyByZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19VTklDT0RFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBDb3JyZXNwb25kcyB0byB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgc2V0LiAgVGhpcyB2YWx1ZSBjb3ZlcnMgICAgICovCi0gIC8qICAgICAgYWxsIHZlcnNpb25zIG9mIHRoZSBVbmljb2RlIHJlcGVydG9pcmUsIGluY2x1ZGluZyBBU0NJSSBhbmQgICAgICAqLwotICAvKiAgICAgIExhdGluLTEuICBNb3N0IGZvbnRzIGluY2x1ZGUgYSBVbmljb2RlIGNoYXJtYXAsIGJ1dCBub3QgYWxsICAgICAgKi8KLSAgLyogICAgICBvZiB0aGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBhY2Nlc3MgVW5pY29kZSB2YWx1ZSBVKzFGMDI4IChhbmQgICAgKi8KLSAgLyogICAgICB0aGUgZm9udCBjb250YWlucyBpdCksIHVzZSB2YWx1ZSAweDFGMDI4IGFzIHRoZSBpbnB1dCB2YWx1ZSBmb3IgICovCi0gIC8qICAgICAgQEZUX0dldF9DaGFyX0luZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfTVNfU1lNQk9MIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQ29ycmVzcG9uZHMgdG8gdGhlIE1pY3Jvc29mdCBTeW1ib2wgZW5jb2RpbmcsIHVzZWQgdG8gZW5jb2RlICAgICAqLwotICAvKiAgICAgIG1hdGhlbWF0aWNhbCBzeW1ib2xzIGluIHRoZSAzMi4uMjU1IGNoYXJhY3RlciBjb2RlIHJhbmdlLiAgRm9yICAgKi8KLSAgLyogICAgICBtb3JlIGluZm9ybWF0aW9uLCBzZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgYGh0dHA6Ly93d3cua29zdGlzLm5ldC9jaGFyc2V0cy9zeW1ib2wuaHRtJy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfU0pJUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQ29ycmVzcG9uZHMgdG8gSmFwYW5lc2UgU0pJUyBlbmNvZGluZy4gIE1vcmUgaW5mbyBhdCAgICAgICAgICAgICAqLwotICAvKiAgICAgIGF0IGBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NoaWZ0X0pJUycuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBTZWUgbm90ZSBvbiBtdWx0aS1ieXRlIGVuY29kaW5ncyBiZWxvdy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19HQjIzMTIgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBDb3JyZXNwb25kcyB0byBhbiBlbmNvZGluZyBzeXN0ZW0gZm9yIFNpbXBsaWZpZWQgQ2hpbmVzZSBhcyB1c2VkICovCi0gIC8qICAgICAgdXNlZCBpbiBtYWlubGFuZCBDaGluYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfQklHNSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQ29ycmVzcG9uZHMgdG8gYW4gZW5jb2Rpbmcgc3lzdGVtIGZvciBUcmFkaXRpb25hbCBDaGluZXNlIGFzICAgICAqLwotICAvKiAgICAgIHVzZWQgaW4gVGFpd2FuIGFuZCBIb25nIEtvbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX1dBTlNVTkcgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIENvcnJlc3BvbmRzIHRvIHRoZSBLb3JlYW4gZW5jb2Rpbmcgc3lzdGVtIGtub3duIGFzIFdhbnN1bmcuICAgICAgKi8KLSAgLyogICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgYGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tVVMvZ29nbG9iYWwvY2MzMDUxNTQnLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfSk9IQUIgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIEtvcmVhbiBzdGFuZGFyZCBjaGFyYWN0ZXIgc2V0IChLU35DIDU2MDEtMTk5MiksIHdoaWNoICAgICAgICAqLwotICAvKiAgICAgIGNvcnJlc3BvbmRzIHRvIE1TIFdpbmRvd3MgY29kZSBwYWdlIDEzNjEuICBUaGlzIGNoYXJhY3RlciBzZXQgICAgKi8KLSAgLyogICAgICBpbmNsdWRlcyBhbGwgcG9zc2libGUgSGFuZ2V1bCBjaGFyYWN0ZXIgY29tYmluYXRpb25zLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19BRE9CRV9MQVRJTl8xIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBDb3JyZXNwb25kcyB0byBhIExhdGluLTEgZW5jb2RpbmcgYXMgZGVmaW5lZCBpbiBhIFR5cGV+MSAgICAgICAgICovCi0gIC8qICAgICAgUG9zdFNjcmlwdCBmb250LiAgSXQgaXMgbGltaXRlZCB0byAyNTYgY2hhcmFjdGVyIGNvZGVzLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfQURPQkVfU1RBTkRBUkQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQ29ycmVzcG9uZHMgdG8gdGhlIEFkb2JlIFN0YW5kYXJkIGVuY29kaW5nLCBhcyBmb3VuZCBpbiBUeXBlfjEsICAqLwotICAvKiAgICAgIENGRiwgYW5kIE9wZW5UeXBlL0NGRiBmb250cy4gIEl0IGlzIGxpbWl0ZWQgdG8gMjU2IGNoYXJhY3RlciAgICAgKi8KLSAgLyogICAgICBjb2Rlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19BRE9CRV9FWFBFUlQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBDb3JyZXNwb25kcyB0byB0aGUgQWRvYmUgRXhwZXJ0IGVuY29kaW5nLCBhcyBmb3VuZCBpbiBUeXBlfjEsICAgICovCi0gIC8qICAgICAgQ0ZGLCBhbmQgT3BlblR5cGUvQ0ZGIGZvbnRzLiAgSXQgaXMgbGltaXRlZCB0byAyNTYgY2hhcmFjdGVyICAgICAqLwotICAvKiAgICAgIGNvZGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX0FET0JFX0NVU1RPTSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIENvcnJlc3BvbmRzIHRvIGEgY3VzdG9tIGVuY29kaW5nLCBhcyBmb3VuZCBpbiBUeXBlfjEsIENGRiwgYW5kICAgKi8KLSAgLyogICAgICBPcGVuVHlwZS9DRkYgZm9udHMuICBJdCBpcyBsaW1pdGVkIHRvIDI1NiBjaGFyYWN0ZXIgY29kZXMuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19BUFBMRV9ST01BTiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBDb3JyZXNwb25kcyB0byB0aGUgOC1iaXQgQXBwbGUgcm9tYW4gZW5jb2RpbmcuICBNYW55IFRydWVUeXBlICAgICovCi0gIC8qICAgICAgYW5kIE9wZW5UeXBlIGZvbnRzIGNvbnRhaW4gYSBjaGFybWFwIGZvciB0aGlzIGVuY29kaW5nLCBzaW5jZSAgICAqLwotICAvKiAgICAgIG9sZGVyIHZlcnNpb25zIG9mIE1hYyBPUyBhcmUgYWJsZSB0byB1c2UgaXQuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX09MRF9MQVRJTl8yIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoaXMgdmFsdWUgaXMgZGVwcmVjYXRlZCBhbmQgd2FzIG5ldmVyIHVzZWQgbm9yIHJlcG9ydGVkIGJ5ICAgICAgKi8KLSAgLyogICAgICBGcmVlVHlwZS4gIERvbid0IHVzZSBvciB0ZXN0IGZvciBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19NU19TSklTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBTYW1lIGFzIEZUX0VOQ09ESU5HX1NKSVMuICBEZXByZWNhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19NU19HQjIzMTIgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBTYW1lIGFzIEZUX0VOQ09ESU5HX0dCMjMxMi4gIERlcHJlY2F0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19NU19CSUc1IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBTYW1lIGFzIEZUX0VOQ09ESU5HX0JJRzUuICBEZXByZWNhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19NU19XQU5TVU5HIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBTYW1lIGFzIEZUX0VOQ09ESU5HX1dBTlNVTkcuICBEZXByZWNhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19NU19KT0hBQiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBTYW1lIGFzIEZUX0VOQ09ESU5HX0pPSEFCLiAgRGVwcmVjYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQnkgZGVmYXVsdCwgRnJlZVR5cGUgYXV0b21hdGljYWxseSBzeW50aGVzaXplcyBhIFVuaWNvZGUgY2hhcm1hcCAgICovCi0gIC8qICAgIGZvciBQb3N0U2NyaXB0IGZvbnRzLCB1c2luZyB0aGVpciBnbHlwaCBuYW1lcyBkaWN0aW9uYXJpZXMuICAgICAgICAqLwotICAvKiAgICBIb3dldmVyLCBpdCBhbHNvIHJlcG9ydHMgdGhlIGVuY29kaW5ncyBkZWZpbmVkIGV4cGxpY2l0bHkgaW4gdGhlICAgKi8KLSAgLyogICAgZm9udCBmaWxlLCBmb3IgdGhlIGNhc2VzIHdoZW4gdGhleSBhcmUgbmVlZGVkLCB3aXRoIHRoZSBBZG9iZSAgICAgICovCi0gIC8qICAgIHZhbHVlcyBhcyB3ZWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfTk9ORSBpcyBzZXQgYnkgdGhlIEJERiBhbmQgUENGIGRyaXZlcnMgaWYgdGhlIGNoYXJtYXAgICovCi0gIC8qICAgIGlzIG5laXRoZXIgVW5pY29kZSBub3IgSVNPLTg4NTktMSAob3RoZXJ3aXNlIGl0IGlzIHNldCB0byAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19VTklDT0RFKS4gIFVzZSBARlRfR2V0X0JERl9DaGFyc2V0X0lEIHRvIGZpbmQgb3V0ICAgICAgKi8KLSAgLyogICAgd2hpY2ggZW5jb2RpbmcgaXMgcmVhbGx5IHByZXNlbnQuICBJZiwgZm9yIGV4YW1wbGUsIHRoZSAgICAgICAgICAgICovCi0gIC8qICAgIGBjc19yZWdpc3RyeScgZmllbGQgaXMgYEtPSTgnIGFuZCB0aGUgYGNzX2VuY29kaW5nJyBmaWVsZCBpcyBgUicsICAqLwotICAvKiAgICB0aGUgZm9udCBpcyBlbmNvZGVkIGluIEtPSTgtUi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX05PTkUgaXMgYWx3YXlzIHNldCAod2l0aCBhIHNpbmdsZSBleGNlcHRpb24pIGJ5IHRoZSAgICAqLwotICAvKiAgICB3aW5mb250cyBkcml2ZXIuICBVc2UgQEZUX0dldF9XaW5GTlRfSGVhZGVyIGFuZCBleGFtaW5lIHRoZSAgICAgICAgKi8KLSAgLyogICAgYGNoYXJzZXQnIGZpZWxkIG9mIHRoZSBARlRfV2luRk5UX0hlYWRlclJlYyBzdHJ1Y3R1cmUgdG8gZmluZCBvdXQgICovCi0gIC8qICAgIHdoaWNoIGVuY29kaW5nIGlzIHJlYWxseSBwcmVzZW50LiAgRm9yIGV4YW1wbGUsICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfV2luRk5UX0lEX0NQMTI1MSAoMjA0KSBtZWFucyBXaW5kb3dzIGNvZGUgcGFnZSAxMjUxIChmb3IgICAgICAgKi8KLSAgLyogICAgUnVzc2lhbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19OT05FIGlzIHNldCBpZiBgcGxhdGZvcm1faWQnIGlzIEBUVF9QTEFURk9STV9NQUNJTlRPU0ggKi8KLSAgLyogICAgYW5kIGBlbmNvZGluZ19pZCcgaXMgbm90IEBUVF9NQUNfSURfUk9NQU4gKG90aGVyd2lzZSBpdCBpcyBzZXQgdG8gICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX0FQUExFX1JPTUFOKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgYHBsYXRmb3JtX2lkJyBpcyBAVFRfUExBVEZPUk1fTUFDSU5UT1NILCB1c2UgdGhlIGZ1bmN0aW9uICAgICAgICovCi0gIC8qICAgIEBGVF9HZXRfQ01hcF9MYW5ndWFnZV9JRCB0byBxdWVyeSB0aGUgTWFjIGxhbmd1YWdlIElEIHRoYXQgbWF5ICAgICAqLwotICAvKiAgICBiZSBuZWVkZWQgdG8gYmUgYWJsZSB0byBkaXN0aW5ndWlzaCBBcHBsZSBlbmNvZGluZyB2YXJpYW50cy4gIFNlZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgaHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvVkVORE9SUy9BUFBMRS9SZWFkbWUudHh0ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdG8gZ2V0IGFuIGlkZWEgaG93IHRvIGRvIHRoYXQuICBCYXNpY2FsbHksIGlmIHRoZSBsYW5ndWFnZSBJRCAgICAgICovCi0gIC8qICAgIGlzfjAsIGRvbid0IHVzZSBpdCwgb3RoZXJ3aXNlIHN1YnRyYWN0IDEgZnJvbSB0aGUgbGFuZ3VhZ2UgSUQuICAgICAqLwotICAvKiAgICBUaGVuIGV4YW1pbmUgYGVuY29kaW5nX2lkJy4gIElmLCBmb3IgZXhhbXBsZSwgYGVuY29kaW5nX2lkJyBpcyAgICAgKi8KLSAgLyogICAgQFRUX01BQ19JRF9ST01BTiBhbmQgdGhlIGxhbmd1YWdlIElEIChtaW51c34xKSBpcyAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGBUVF9NQUNfTEFOR0lEX0dSRUVLJywgaXQgaXMgdGhlIEdyZWVrIGVuY29kaW5nLCBub3QgUm9tYW4uICAgICAgICAqLwotICAvKiAgICBAVFRfTUFDX0lEX0FSQUJJQyB3aXRoIGBUVF9NQUNfTEFOR0lEX0ZBUlNJJyBtZWFucyB0aGUgRmFyc2kgICAgICAgKi8KLSAgLyogICAgdmFyaWFudCB0aGUgQXJhYmljIGVuY29kaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGVudW0gIEZUX0VuY29kaW5nXwotICB7Ci0gICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfTk9ORSwgMCwgMCwgMCwgMCApLAotCi0gICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfTVNfU1lNQk9MLCAncycsICd5JywgJ20nLCAnYicgKSwKLSAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19VTklDT0RFLCAgICd1JywgJ24nLCAnaScsICdjJyApLAotCi0gICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfU0pJUywgICAgJ3MnLCAnaicsICdpJywgJ3MnICksCi0gICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfR0IyMzEyLCAgJ2cnLCAnYicsICcgJywgJyAnICksCi0gICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfQklHNSwgICAgJ2InLCAnaScsICdnJywgJzUnICksCi0gICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfV0FOU1VORywgJ3cnLCAnYScsICduJywgJ3MnICksCi0gICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfSk9IQUIsICAgJ2onLCAnbycsICdoJywgJ2EnICksCi0KLSAgICAvKiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KLSAgICBGVF9FTkNPRElOR19NU19TSklTICAgID0gRlRfRU5DT0RJTkdfU0pJUywKLSAgICBGVF9FTkNPRElOR19NU19HQjIzMTIgID0gRlRfRU5DT0RJTkdfR0IyMzEyLAotICAgIEZUX0VOQ09ESU5HX01TX0JJRzUgICAgPSBGVF9FTkNPRElOR19CSUc1LAotICAgIEZUX0VOQ09ESU5HX01TX1dBTlNVTkcgPSBGVF9FTkNPRElOR19XQU5TVU5HLAotICAgIEZUX0VOQ09ESU5HX01TX0pPSEFCICAgPSBGVF9FTkNPRElOR19KT0hBQiwKLQotICAgIEZUX0VOQ19UQUcoIEZUX0VOQ09ESU5HX0FET0JFX1NUQU5EQVJELCAnQScsICdEJywgJ08nLCAnQicgKSwKLSAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19BRE9CRV9FWFBFUlQsICAgJ0EnLCAnRCcsICdCJywgJ0UnICksCi0gICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfQURPQkVfQ1VTVE9NLCAgICdBJywgJ0QnLCAnQicsICdDJyApLAotICAgIEZUX0VOQ19UQUcoIEZUX0VOQ09ESU5HX0FET0JFX0xBVElOXzEsICAnbCcsICdhJywgJ3QnLCAnMScgKSwKLQotICAgIEZUX0VOQ19UQUcoIEZUX0VOQ09ESU5HX09MRF9MQVRJTl8yLCAnbCcsICdhJywgJ3QnLCAnMicgKSwKLQotICAgIEZUX0VOQ19UQUcoIEZUX0VOQ09ESU5HX0FQUExFX1JPTUFOLCAnYScsICdyJywgJ20nLCAnbicgKQotCi0gIH0gRlRfRW5jb2Rpbmc7Ci0KLQotICAvKiB0aGVzZSBjb25zdGFudHMgYXJlIGRlcHJlY2F0ZWQ7IHVzZSB0aGUgY29ycmVzcG9uZGluZyBgRlRfRW5jb2RpbmcnICovCi0gIC8qIHZhbHVlcyBpbnN0ZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgZnRfZW5jb2Rpbmdfbm9uZSAgICAgICAgICAgIEZUX0VOQ09ESU5HX05PTkUKLSNkZWZpbmUgZnRfZW5jb2RpbmdfdW5pY29kZSAgICAgICAgIEZUX0VOQ09ESU5HX1VOSUNPREUKLSNkZWZpbmUgZnRfZW5jb2Rpbmdfc3ltYm9sICAgICAgICAgIEZUX0VOQ09ESU5HX01TX1NZTUJPTAotI2RlZmluZSBmdF9lbmNvZGluZ19sYXRpbl8xICAgICAgICAgRlRfRU5DT0RJTkdfQURPQkVfTEFUSU5fMQotI2RlZmluZSBmdF9lbmNvZGluZ19sYXRpbl8yICAgICAgICAgRlRfRU5DT0RJTkdfT0xEX0xBVElOXzIKLSNkZWZpbmUgZnRfZW5jb2Rpbmdfc2ppcyAgICAgICAgICAgIEZUX0VOQ09ESU5HX1NKSVMKLSNkZWZpbmUgZnRfZW5jb2RpbmdfZ2IyMzEyICAgICAgICAgIEZUX0VOQ09ESU5HX0dCMjMxMgotI2RlZmluZSBmdF9lbmNvZGluZ19iaWc1ICAgICAgICAgICAgRlRfRU5DT0RJTkdfQklHNQotI2RlZmluZSBmdF9lbmNvZGluZ193YW5zdW5nICAgICAgICAgRlRfRU5DT0RJTkdfV0FOU1VORwotI2RlZmluZSBmdF9lbmNvZGluZ19qb2hhYiAgICAgICAgICAgRlRfRU5DT0RJTkdfSk9IQUIKLQotI2RlZmluZSBmdF9lbmNvZGluZ19hZG9iZV9zdGFuZGFyZCAgRlRfRU5DT0RJTkdfQURPQkVfU1RBTkRBUkQKLSNkZWZpbmUgZnRfZW5jb2RpbmdfYWRvYmVfZXhwZXJ0ICAgIEZUX0VOQ09ESU5HX0FET0JFX0VYUEVSVAotI2RlZmluZSBmdF9lbmNvZGluZ19hZG9iZV9jdXN0b20gICAgRlRfRU5DT0RJTkdfQURPQkVfQ1VTVE9NCi0jZGVmaW5lIGZ0X2VuY29kaW5nX2FwcGxlX3JvbWFuICAgICBGVF9FTkNPRElOR19BUFBMRV9ST01BTgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQ2hhck1hcFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGJhc2UgY2hhcm1hcCBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHBhcmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBlbmNvZGluZyAgICA6OiBBbiBARlRfRW5jb2RpbmcgdGFnIGlkZW50aWZ5aW5nIHRoZSBjaGFybWFwLiAgVXNlICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgdGhpcyB3aXRoIEBGVF9TZWxlY3RfQ2hhcm1hcC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwbGF0Zm9ybV9pZCA6OiBBbiBJRCBudW1iZXIgZGVzY3JpYmluZyB0aGUgcGxhdGZvcm0gZm9yIHRoZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIGVuY29kaW5nIElELiAgVGhpcyBjb21lcyBkaXJlY3RseSBmcm9tICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uIGFuZCBzaG91bGQgYmUgZW11bGF0ZWQgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBmb3Igb3RoZXIgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGVuY29kaW5nX2lkIDo6IEEgcGxhdGZvcm0gc3BlY2lmaWMgZW5jb2RpbmcgbnVtYmVyLiAgVGhpcyBhbHNvICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBjb21lcyBmcm9tIHRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uIGFuZCBzaG91bGQgYmUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZW11bGF0ZWQgc2ltaWxhcmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfQ2hhck1hcFJlY18KLSAgewotICAgIEZUX0ZhY2UgICAgICBmYWNlOwotICAgIEZUX0VuY29kaW5nICBlbmNvZGluZzsKLSAgICBGVF9VU2hvcnQgICAgcGxhdGZvcm1faWQ7Ci0gICAgRlRfVVNob3J0ICAgIGVuY29kaW5nX2lkOwotCi0gIH0gRlRfQ2hhck1hcFJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBCIEEgUyBFICAgTyBCIEogRSBDIFQgICBDIEwgQSBTIFMgRSBTICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZV9JbnRlcm5hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gb3BhcXVlIGhhbmRsZSB0byBhbiBgRlRfRmFjZV9JbnRlcm5hbFJlYycgc3RydWN0dXJlLCB1c2VkIHRvICAgICovCi0gIC8qICAgIG1vZGVsIHByaXZhdGUgZGF0YSBvZiBhIGdpdmVuIEBGVF9GYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgbWlnaHQgY2hhbmdlIGJldHdlZW4gcmVsZWFzZXMgb2YgRnJlZVR5cGV+MiBhbmQgaXMgICovCi0gIC8qICAgIG5vdCBnZW5lcmFsbHkgYXZhaWxhYmxlIHRvIGNsaWVudCBhcHBsaWNhdGlvbnMuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfRmFjZV9JbnRlcm5hbFJlY18qICBGVF9GYWNlX0ludGVybmFsOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgcm9vdCBmYWNlIGNsYXNzIHN0cnVjdHVyZS4gIEEgZmFjZSBvYmplY3QgbW9kZWxzIGEgICAgICAgICovCi0gIC8qICAgIHR5cGVmYWNlIGluIGEgZm9udCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9mYWNlcyAgICAgICAgICAgOjogVGhlIG51bWJlciBvZiBmYWNlcyBpbiB0aGUgZm9udCBmaWxlLiAgU29tZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgZm9ybWF0cyBjYW4gaGF2ZSBtdWx0aXBsZSBmYWNlcyBpbiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBhIGZvbnQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2luZGV4ICAgICAgICAgIDo6IFRoZSBpbmRleCBvZiB0aGUgZmFjZSBpbiB0aGUgZm9udCBmaWxlLiAgSXQgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBzZXQgdG9+MCBpZiB0aGVyZSBpcyBvbmx5IG9uZSBmYWNlIGluICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZvbnQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9mbGFncyAgICAgICAgICA6OiBBIHNldCBvZiBiaXQgZmxhZ3MgdGhhdCBnaXZlIGltcG9ydGFudCAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZhY2U7IHNlZSAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEBGVF9GQUNFX0ZMQUdfWFhYIGZvciB0aGUgZGV0YWlscy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0eWxlX2ZsYWdzICAgICAgICAgOjogQSBzZXQgb2YgYml0IGZsYWdzIGluZGljYXRpbmcgdGhlIHN0eWxlIG9mICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmYWNlOyBzZWUgQEZUX1NUWUxFX0ZMQUdfWFhYIGZvciB0aGUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fZ2x5cGhzICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgZ2x5cGhzIGluIHRoZSBmYWNlLiAgSWYgdGhlICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlIGlzIHNjYWxhYmxlIGFuZCBoYXMgc2JpdHMgKHNlZSAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYG51bV9maXhlZF9zaXplcycpLCBpdCBpcyBzZXQgdG8gdGhlIG51bWJlciAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIG91dGxpbmUgZ2x5cGhzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIENJRC1rZXllZCBmb250cywgdGhpcyB2YWx1ZSBnaXZlcyB0aGUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hlc3QgQ0lEIHVzZWQgaW4gdGhlIGZvbnQuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhbWlseV9uYW1lICAgICAgICAgOjogVGhlIGZhY2UncyBmYW1pbHkgbmFtZS4gIFRoaXMgaXMgYW4gQVNDSUkgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZywgdXN1YWxseSBpbiBFbmdsaXNoLCB0aGF0IGRlc2NyaWJlcyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdHlwZWZhY2UncyBmYW1pbHkgKGxpa2UgYFRpbWVzIE5ldyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9tYW4nLCBgQm9kb25pJywgYEdhcmFtb25kJywgZXRjKS4gIFRoaXMgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGEgbGVhc3QgY29tbW9uIGRlbm9taW5hdG9yIHVzZWQgdG8gbGlzdCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb250cy4gIFNvbWUgZm9ybWF0cyAoVHJ1ZVR5cGUgJiBPcGVuVHlwZSkgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZSBsb2NhbGl6ZWQgYW5kIFVuaWNvZGUgdmVyc2lvbnMgb2YgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgc3RyaW5nLiAgQXBwbGljYXRpb25zIHNob3VsZCB1c2UgdGhlICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgc3BlY2lmaWMgaW50ZXJmYWNlIHRvIGFjY2VzcyB0aGVtLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIE5VTEwgKGUuZy4sIGluIGZvbnRzIGVtYmVkZGVkIGluIGEgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFBERiBmaWxlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0eWxlX25hbWUgICAgICAgICAgOjogVGhlIGZhY2UncyBzdHlsZSBuYW1lLiAgVGhpcyBpcyBhbiBBU0NJSSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZywgdXN1YWxseSBpbiBFbmdsaXNoLCB0aGF0IGRlc2NyaWJlcyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdHlwZWZhY2UncyBzdHlsZSAobGlrZSBgSXRhbGljJywgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYEJvbGQnLCBgQ29uZGVuc2VkJywgZXRjKS4gIE5vdCBhbGwgZm9udCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMgcHJvdmlkZSBhIHN0eWxlIG5hbWUsIHNvIHRoaXMgZmllbGQgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBvcHRpb25hbCwgYW5kIGNhbiBiZSBzZXQgdG8gTlVMTC4gIEFzICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGBmYW1pbHlfbmFtZScsIHNvbWUgZm9ybWF0cyBwcm92aWRlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsaXplZCBhbmQgVW5pY29kZSB2ZXJzaW9ucyBvZiB0aGlzICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuICBBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSB0aGUgZm9ybWF0ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWMgaW50ZXJmYWNlIHRvIGFjY2VzcyB0aGVtLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2ZpeGVkX3NpemVzICAgICA6OiBUaGUgbnVtYmVyIG9mIGJpdG1hcCBzdHJpa2VzIGluIHRoZSBmYWNlLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbiBpZiB0aGUgZmFjZSBpcyBzY2FsYWJsZSwgdGhlcmUgbWlnaHQgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0aWxsIGJlIGJpdG1hcCBzdHJpa2VzLCB3aGljaCBhcmUgY2FsbGVkICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBgc2JpdHMnIGluIHRoYXQgY2FzZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhdmFpbGFibGVfc2l6ZXMgICAgIDo6IEFuIGFycmF5IG9mIEBGVF9CaXRtYXBfU2l6ZSBmb3IgYWxsIGJpdG1hcCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpa2VzIGluIHRoZSBmYWNlLiAgSXQgaXMgc2V0IHRvIE5VTEwgaWYgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gYml0bWFwIHN0cmlrZS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2NoYXJtYXBzICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGNoYXJtYXBzIGluIHRoZSBmYWNlLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFybWFwcyAgICAgICAgICAgIDo6IEFuIGFycmF5IG9mIHRoZSBjaGFybWFwcyBvZiB0aGUgZmFjZS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdlbmVyaWMgICAgICAgICAgICAgOjogQSBmaWVsZCByZXNlcnZlZCBmb3IgY2xpZW50IHVzZXMuICBTZWUgdGhlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEBGVF9HZW5lcmljIHR5cGUgZGVzY3JpcHRpb24uICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJib3ggICAgICAgICAgICAgICAgOjogVGhlIGZvbnQgYm91bmRpbmcgYm94LiAgQ29vcmRpbmF0ZXMgYXJlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3NlZCBpbiBmb250IHVuaXRzIChzZWUgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBgdW5pdHNfcGVyX0VNJykuICBUaGUgYm94IGlzIGxhcmdlIGVub3VnaCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gY29udGFpbiBhbnkgZ2x5cGggZnJvbSB0aGUgZm9udC4gIFRodXMsICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBiYm94LnlNYXgnIGNhbiBiZSBzZWVuIGFzIHRoZSBgbWF4aW11bSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBhc2NlbmRlcicsIGFuZCBgYmJveC55TWluJyBhcyB0aGUgYG1pbmltdW0gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY2VuZGVyJy4gIE9ubHkgcmVsZXZhbnQgZm9yIHNjYWxhYmxlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IHRoZSBib3VuZGluZyBib3ggbWlnaHQgYmUgb2ZmIGJ5ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdCBsZWFzdCkgb25lIHBpeGVsIGZvciBoaW50ZWQgZm9udHMuICBTZWUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBARlRfU2l6ZV9NZXRyaWNzIGZvciBmdXJ0aGVyIGRpc2N1c3Npb24uICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1bml0c19wZXJfRU0gICAgICAgIDo6IFRoZSBudW1iZXIgb2YgZm9udCB1bml0cyBwZXIgRU0gc3F1YXJlIGZvciAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZhY2UuICBUaGlzIGlzIHR5cGljYWxseSAyMDQ4IGZvciAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUgZm9udHMsIGFuZCAxMDAwIGZvciBUeXBlfjEgZm9udHMuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgcmVsZXZhbnQgZm9yIHNjYWxhYmxlIGZvcm1hdHMuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFzY2VuZGVyICAgICAgICAgICAgOjogVGhlIHR5cG9ncmFwaGljIGFzY2VuZGVyIG9mIHRoZSBmYWNlLCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3NlZCBpbiBmb250IHVuaXRzLiAgRm9yIGZvbnQgZm9ybWF0cyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgaGF2aW5nIHRoaXMgaW5mb3JtYXRpb24sIGl0IGlzIHNldCB0byAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYGJib3gueU1heCcuICBPbmx5IHJlbGV2YW50IGZvciBzY2FsYWJsZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlc2NlbmRlciAgICAgICAgICAgOjogVGhlIHR5cG9ncmFwaGljIGRlc2NlbmRlciBvZiB0aGUgZmFjZSwgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3NlZCBpbiBmb250IHVuaXRzLiAgRm9yIGZvbnQgZm9ybWF0cyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgaGF2aW5nIHRoaXMgaW5mb3JtYXRpb24sIGl0IGlzIHNldCB0byAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYGJib3gueU1pbicuICBOb3RlIHRoYXQgdGhpcyBmaWVsZCBpcyAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzdWFsbHkgbmVnYXRpdmUuICBPbmx5IHJlbGV2YW50IGZvciAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsYWJsZSBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZWlnaHQgICAgICAgICAgICAgIDo6IFRoaXMgdmFsdWUgaXMgdGhlIHZlcnRpY2FsIGRpc3RhbmNlICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBiYXNlbGluZXMsICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2VkIGluIGZvbnQgdW5pdHMuICBJdCBpcyBhbHdheXMgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlLiAgT25seSByZWxldmFudCBmb3Igc2NhbGFibGUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSB3YW50IHRoZSBnbG9iYWwgZ2x5cGggaGVpZ2h0LCB1c2UgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBgYXNjZW5kZXIgLSBkZXNjZW5kZXInLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhfYWR2YW5jZV93aWR0aCAgIDo6IFRoZSBtYXhpbXVtIGFkdmFuY2Ugd2lkdGgsIGluIGZvbnQgdW5pdHMsICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYWxsIGdseXBocyBpbiB0aGlzIGZhY2UuICBUaGlzIGNhbiBiZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBtYWtlIHdvcmQgd3JhcHBpbmcgY29tcHV0YXRpb25zICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhc3Rlci4gIE9ubHkgcmVsZXZhbnQgZm9yIHNjYWxhYmxlICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhfYWR2YW5jZV9oZWlnaHQgIDo6IFRoZSBtYXhpbXVtIGFkdmFuY2UgaGVpZ2h0LCBpbiBmb250IHVuaXRzLCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYWxsIGdseXBocyBpbiB0aGlzIGZhY2UuICBUaGlzIGlzIG9ubHkgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZXZhbnQgZm9yIHZlcnRpY2FsIGxheW91dHMsIGFuZCBpcyBzZXQgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGBoZWlnaHQnIGZvciBmb250cyB0aGF0IGRvIG5vdCBwcm92aWRlICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBtZXRyaWNzLiAgT25seSByZWxldmFudCBmb3IgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGFibGUgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdW5kZXJsaW5lX3Bvc2l0aW9uICA6OiBUaGUgcG9zaXRpb24sIGluIGZvbnQgdW5pdHMsIG9mIHRoZSAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJsaW5lIGxpbmUgZm9yIHRoaXMgZmFjZS4gIEl0IGlzIHRoZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciBvZiB0aGUgdW5kZXJsaW5pbmcgc3RlbS4gIE9ubHkgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICByZWxldmFudCBmb3Igc2NhbGFibGUgZm9ybWF0cy4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1bmRlcmxpbmVfdGhpY2tuZXNzIDo6IFRoZSB0aGlja25lc3MsIGluIGZvbnQgdW5pdHMsIG9mIHRoZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcmxpbmUgZm9yIHRoaXMgZmFjZS4gIE9ubHkgcmVsZXZhbnQgZm9yICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGFibGUgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGggICAgICAgICAgICAgICA6OiBUaGUgZmFjZSdzIGFzc29jaWF0ZWQgZ2x5cGggc2xvdChzKS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgICAgICAgICAgICAgIDo6IFRoZSBjdXJyZW50IGFjdGl2ZSBzaXplIGZvciB0aGlzIGZhY2UuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJtYXAgICAgICAgICAgICAgOjogVGhlIGN1cnJlbnQgYWN0aXZlIGNoYXJtYXAgZm9yIHRoaXMgZmFjZS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZpZWxkcyBtYXkgYmUgY2hhbmdlZCBhZnRlciBhIGNhbGwgdG8gQEZUX0F0dGFjaF9GaWxlIG9yICAgICAgICAgICAqLwotICAvKiAgICBARlRfQXR0YWNoX1N0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9GYWNlUmVjXwotICB7Ci0gICAgRlRfTG9uZyAgICAgICAgICAgbnVtX2ZhY2VzOwotICAgIEZUX0xvbmcgICAgICAgICAgIGZhY2VfaW5kZXg7Ci0KLSAgICBGVF9Mb25nICAgICAgICAgICBmYWNlX2ZsYWdzOwotICAgIEZUX0xvbmcgICAgICAgICAgIHN0eWxlX2ZsYWdzOwotCi0gICAgRlRfTG9uZyAgICAgICAgICAgbnVtX2dseXBoczsKLQotICAgIEZUX1N0cmluZyogICAgICAgIGZhbWlseV9uYW1lOwotICAgIEZUX1N0cmluZyogICAgICAgIHN0eWxlX25hbWU7Ci0KLSAgICBGVF9JbnQgICAgICAgICAgICBudW1fZml4ZWRfc2l6ZXM7Ci0gICAgRlRfQml0bWFwX1NpemUqICAgYXZhaWxhYmxlX3NpemVzOwotCi0gICAgRlRfSW50ICAgICAgICAgICAgbnVtX2NoYXJtYXBzOwotICAgIEZUX0NoYXJNYXAqICAgICAgIGNoYXJtYXBzOwotCi0gICAgRlRfR2VuZXJpYyAgICAgICAgZ2VuZXJpYzsKLQotICAgIC8qIyBUaGUgZm9sbG93aW5nIG1lbWJlciB2YXJpYWJsZXMgKGRvd24gdG8gYHVuZGVybGluZV90aGlja25lc3MnKSAqLwotICAgIC8qIyBhcmUgb25seSByZWxldmFudCB0byBzY2FsYWJsZSBvdXRsaW5lczsgY2YuIEBGVF9CaXRtYXBfU2l6ZSAgICAqLwotICAgIC8qIyBmb3IgYml0bWFwIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX0JCb3ggICAgICAgICAgIGJib3g7Ci0KLSAgICBGVF9VU2hvcnQgICAgICAgICB1bml0c19wZXJfRU07Ci0gICAgRlRfU2hvcnQgICAgICAgICAgYXNjZW5kZXI7Ci0gICAgRlRfU2hvcnQgICAgICAgICAgZGVzY2VuZGVyOwotICAgIEZUX1Nob3J0ICAgICAgICAgIGhlaWdodDsKLQotICAgIEZUX1Nob3J0ICAgICAgICAgIG1heF9hZHZhbmNlX3dpZHRoOwotICAgIEZUX1Nob3J0ICAgICAgICAgIG1heF9hZHZhbmNlX2hlaWdodDsKLQotICAgIEZUX1Nob3J0ICAgICAgICAgIHVuZGVybGluZV9wb3NpdGlvbjsKLSAgICBGVF9TaG9ydCAgICAgICAgICB1bmRlcmxpbmVfdGhpY2tuZXNzOwotCi0gICAgRlRfR2x5cGhTbG90ICAgICAgZ2x5cGg7Ci0gICAgRlRfU2l6ZSAgICAgICAgICAgc2l6ZTsKLSAgICBGVF9DaGFyTWFwICAgICAgICBjaGFybWFwOwotCi0gICAgLypAcHJpdmF0ZSBiZWdpbiAqLwotCi0gICAgRlRfRHJpdmVyICAgICAgICAgZHJpdmVyOwotICAgIEZUX01lbW9yeSAgICAgICAgIG1lbW9yeTsKLSAgICBGVF9TdHJlYW0gICAgICAgICBzdHJlYW07Ci0KLSAgICBGVF9MaXN0UmVjICAgICAgICBzaXplc19saXN0OwotCi0gICAgRlRfR2VuZXJpYyAgICAgICAgYXV0b2hpbnQ7ICAgLyogZmFjZS1zcGVjaWZpYyBhdXRvLWhpbnRlciBkYXRhICovCi0gICAgdm9pZCogICAgICAgICAgICAgZXh0ZW5zaW9uczsgLyogdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBGVF9GYWNlX0ludGVybmFsICBpbnRlcm5hbDsKLQotICAgIC8qQHByaXZhdGUgZW5kICovCi0KLSAgfSBGVF9GYWNlUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBsaXN0IG9mIGJpdCBmbGFncyB1c2VkIGluIHRoZSBgZmFjZV9mbGFncycgZmllbGQgb2YgdGhlICAgICAgICAgICovCi0gIC8qICAgIEBGVF9GYWNlUmVjIHN0cnVjdHVyZS4gIFRoZXkgaW5mb3JtIGNsaWVudCBhcHBsaWNhdGlvbnMgb2YgICAgICAgICAqLwotICAvKiAgICBwcm9wZXJ0aWVzIG9mIHRoZSBjb3JyZXNwb25kaW5nIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfU0NBTEFCTEUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBJbmRpY2F0ZXMgdGhhdCB0aGUgZmFjZSBjb250YWlucyBvdXRsaW5lIGdseXBocy4gIFRoaXMgZG9lc24ndCAgICovCi0gIC8qICAgICAgcHJldmVudCBiaXRtYXAgc3RyaWtlcywgaS5lLiwgYSBmYWNlIGNhbiBoYXZlIGJvdGggdGhpcyBhbmQgICAgICAqLwotICAvKiAgICAgIGFuZCBARlRfRkFDRV9GTEFHX0ZJWEVEX1NJWkVTIHNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19GSVhFRF9TSVpFUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEluZGljYXRlcyB0aGF0IHRoZSBmYWNlIGNvbnRhaW5zIGJpdG1hcCBzdHJpa2VzLiAgU2VlIGFsc28gdGhlICAgKi8KLSAgLyogICAgICBgbnVtX2ZpeGVkX3NpemVzJyBhbmQgYGF2YWlsYWJsZV9zaXplcycgZmllbGRzIG9mIEBGVF9GYWNlUmVjLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfRklYRURfV0lEVEggOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBJbmRpY2F0ZXMgdGhhdCB0aGUgZmFjZSBjb250YWlucyBmaXhlZC13aWR0aCBjaGFyYWN0ZXJzIChsaWtlICAgICovCi0gIC8qICAgICAgQ291cmllciwgTHVjaWRvLCBNb25vVHlwZSwgZXRjLikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX1NGTlQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgSW5kaWNhdGVzIHRoYXQgdGhlIGZhY2UgdXNlcyB0aGUgYHNmbnQnIHN0b3JhZ2Ugc2NoZW1lLiAgRm9yICAgICAqLwotICAvKiAgICAgIG5vdywgdGhpcyBtZWFucyBUcnVlVHlwZSBhbmQgT3BlblR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19IT1JJWk9OVEFMIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEluZGljYXRlcyB0aGF0IHRoZSBmYWNlIGNvbnRhaW5zIGhvcml6b250YWwgZ2x5cGggbWV0cmljcy4gIFRoaXMgKi8KLSAgLyogICAgICBzaG91bGQgYmUgc2V0IGZvciBhbGwgY29tbW9uIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfVkVSVElDQUwgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBJbmRpY2F0ZXMgdGhhdCB0aGUgZmFjZSBjb250YWlucyB2ZXJ0aWNhbCBnbHlwaCBtZXRyaWNzLiAgVGhpcyAgICovCi0gIC8qICAgICAgaXMgb25seSBhdmFpbGFibGUgaW4gc29tZSBmb3JtYXRzLCBub3QgYWxsIG9mIHRoZW0uICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0tFUk5JTkcgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgSW5kaWNhdGVzIHRoYXQgdGhlIGZhY2UgY29udGFpbnMga2VybmluZyBpbmZvcm1hdGlvbi4gIElmIHNldCwgICAqLwotICAvKiAgICAgIHRoZSBrZXJuaW5nIGRpc3RhbmNlIGNhbiBiZSByZXRyaWV2ZWQgdGhyb3VnaCB0aGUgZnVuY3Rpb24gICAgICAgKi8KLSAgLyogICAgICBARlRfR2V0X0tlcm5pbmcuICBPdGhlcndpc2UgdGhlIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm4gdGhlICAgICAgICovCi0gIC8qICAgICAgdmVjdG9yICgwLDApLiAgTm90ZSB0aGF0IEZyZWVUeXBlIGRvZXNuJ3QgaGFuZGxlIGtlcm5pbmcgZGF0YSAgICAqLwotICAvKiAgICAgIGZyb20gdGhlIGBHUE9TJyB0YWJsZSAoYXMgcHJlc2VudCBpbiBzb21lIE9wZW5UeXBlIGZvbnRzKS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19GQVNUX0dMWVBIUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRISVMgRkxBRyBJUyBERVBSRUNBVEVELiAgRE8gTk9UIFVTRSBPUiBURVNUIElULiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19NVUxUSVBMRV9NQVNURVJTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEluZGljYXRlcyB0aGF0IHRoZSBmb250IGNvbnRhaW5zIG11bHRpcGxlIG1hc3RlcnMgYW5kIGlzIGNhcGFibGUgKi8KLSAgLyogICAgICBvZiBpbnRlcnBvbGF0aW5nIGJldHdlZW4gdGhlbS4gIFNlZSB0aGUgbXVsdGlwbGUtbWFzdGVycyAgICAgICAgICovCi0gIC8qICAgICAgc3BlY2lmaWMgQVBJIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0dMWVBIX05BTUVTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgSW5kaWNhdGVzIHRoYXQgdGhlIGZvbnQgY29udGFpbnMgZ2x5cGggbmFtZXMgdGhhdCBjYW4gYmUgICAgICAgICAqLwotICAvKiAgICAgIHJldHJpZXZlZCB0aHJvdWdoIEBGVF9HZXRfR2x5cGhfTmFtZS4gIE5vdGUgdGhhdCBzb21lIFRydWVUeXBlICAgKi8KLSAgLyogICAgICBmb250cyBjb250YWluIGJyb2tlbiBnbHlwaCBuYW1lIHRhYmxlcy4gIFVzZSB0aGUgZnVuY3Rpb24gICAgICAgICovCi0gIC8qICAgICAgQEZUX0hhc19QU19HbHlwaF9OYW1lcyB3aGVuIG5lZWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVXNlZCBpbnRlcm5hbGx5IGJ5IEZyZWVUeXBlIHRvIGluZGljYXRlIHRoYXQgYSBmYWNlJ3Mgc3RyZWFtIHdhcyAqLwotICAvKiAgICAgIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgYXBwbGljYXRpb24gYW5kIHNob3VsZCBub3QgYmUgZGVzdHJveWVkICAgKi8KLSAgLyogICAgICB3aGVuIEBGVF9Eb25lX0ZhY2UgaXMgY2FsbGVkLiAgRG9uJ3QgcmVhZCBvciB0ZXN0IHRoaXMgZmxhZy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfSElOVEVSIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBTZXQgaWYgdGhlIGZvbnQgZHJpdmVyIGhhcyBhIGhpbnRpbmcgbWFjaGluZSBvZiBpdHMgb3duLiAgRm9yICAgICovCi0gIC8qICAgICAgZXhhbXBsZSwgd2l0aCBUcnVlVHlwZSBmb250cywgaXQgbWFrZXMgc2Vuc2UgdG8gdXNlIGRhdGEgZnJvbSAgICAqLwotICAvKiAgICAgIHRoZSBTRk5UIGBnYXNwJyB0YWJsZSBvbmx5IGlmIHRoZSBuYXRpdmUgVHJ1ZVR5cGUgaGludGluZyBlbmdpbmUgKi8KLSAgLyogICAgICAod2l0aCB0aGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIpIGlzIGF2YWlsYWJsZSBhbmQgYWN0aXZlLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfQ0lEX0tFWUVEIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBTZXQgaWYgdGhlIGZvbnQgaXMgQ0lELWtleWVkLiAgSW4gdGhhdCBjYXNlLCB0aGUgZm9udCBpcyBub3QgICAgICovCi0gIC8qICAgICAgYWNjZXNzZWQgYnkgZ2x5cGggaW5kaWNlcyBidXQgYnkgQ0lEIHZhbHVlcy4gIEZvciBzdWJzZXR0ZWQgICAgICAqLwotICAvKiAgICAgIENJRC1rZXllZCBmb250cyB0aGlzIGhhcyB0aGUgY29uc2VxdWVuY2UgdGhhdCBub3QgYWxsIGluZGV4ICAgICAgKi8KLSAgLyogICAgICB2YWx1ZXMgYXJlIGEgdmFsaWQgYXJndW1lbnQgdG8gRlRfTG9hZF9HbHlwaC4gIE9ubHkgdGhlIENJRCAgICAgICovCi0gIC8qICAgICAgdmFsdWVzIGZvciB3aGljaCBjb3JyZXNwb25kaW5nIGdseXBocyBpbiB0aGUgc3Vic2V0dGVkIGZvbnQgICAgICAqLwotICAvKiAgICAgIGV4aXN0IG1ha2UgRlRfTG9hZF9HbHlwaCByZXR1cm4gc3VjY2Vzc2Z1bGx5OyBpbiBhbGwgb3RoZXIgY2FzZXMgKi8KLSAgLyogICAgICB5b3UgZ2V0IGFuIGBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudCcgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIE5vdGUgdGhhdCBDSUQta2V5ZWQgZm9udHMgdGhhdCBhcmUgaW4gYW4gU0ZOVCB3cmFwcGVyIGRvbid0ICAgICAgKi8KLSAgLyogICAgICBoYXZlIHRoaXMgZmxhZyBzZXQgc2luY2UgdGhlIGdseXBocyBhcmUgYWNjZXNzZWQgaW4gdGhlIG5vcm1hbCAgICovCi0gIC8qICAgICAgd2F5ICh1c2luZyBjb250aWd1b3VzIGluZGljZXMpOyB0aGUgYENJRC1uZXNzJyBpc24ndCB2aXNpYmxlIHRvICAqLwotICAvKiAgICAgIHRoZSBhcHBsaWNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19UUklDS1kgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFNldCBpZiB0aGUgZm9udCBpcyBgdHJpY2t5JywgdGhpcyBpcywgaXQgYWx3YXlzIG5lZWRzIHRoZSAgICAgICAgKi8KLSAgLyogICAgICBmb250IGZvcm1hdCdzIG5hdGl2ZSBoaW50aW5nIGVuZ2luZSB0byBnZXQgYSByZWFzb25hYmxlIHJlc3VsdC4gICovCi0gIC8qICAgICAgQSB0eXBpY2FsIGV4YW1wbGUgaXMgdGhlIENoaW5lc2UgZm9udCBgbWluZ2xpLnR0ZicgdGhhdCB1c2VzICAgICAqLwotICAvKiAgICAgIFRydWVUeXBlIGJ5dGVjb2RlIGluc3RydWN0aW9ucyB0byBtb3ZlIGFuZCBzY2FsZSBhbGwgb2YgaXRzICAgICAgKi8KLSAgLyogICAgICBzdWJnbHlwaHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBhdXRvaGludCBzdWNoIGZvbnRzIHVzaW5nICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBARlRfTE9BRF9GT1JDRV9BVVRPSElOVDsgaXQgd2lsbCBhbHNvIGlnbm9yZSAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQEZUX0xPQURfTk9fSElOVElORy4gIFlvdSBoYXZlIHRvIHNldCBib3RoIEBGVF9MT0FEX05PX0hJTlRJTkcgICAqLwotICAvKiAgICAgIGFuZCBARlRfTE9BRF9OT19BVVRPSElOVCB0byByZWFsbHkgZGlzYWJsZSBoaW50aW5nOyBob3dldmVyLCB5b3UgKi8KLSAgLyogICAgICBwcm9iYWJseSBuZXZlciB3YW50IHRoaXMgZXhjZXB0IGZvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEN1cnJlbnRseSwgdGhlcmUgYXJlIGFib3V0IGEgZG96ZW4gVHJ1ZVR5cGUgZm9udHMgaW4gdGhlIGxpc3Qgb2YgKi8KLSAgLyogICAgICB0cmlja3kgZm9udHM7IHRoZXkgYXJlIGhhcmQtY29kZWQgaW4gZmlsZSBgdHRvYmpzLmMnLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfQ09MT1IgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBTZXQgaWYgdGhlIGZvbnQgaGFzIGNvbG9yIGdseXBoIHRhYmxlcy4gIFRvIGFjY2VzcyBjb2xvciBnbHlwaHMgICovCi0gIC8qICAgICAgdXNlIEBGVF9MT0FEX0NPTE9SLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfRkFDRV9GTEFHX1NDQUxBQkxFICAgICAgICAgICggMUwgPDwgIDAgKQotI2RlZmluZSBGVF9GQUNFX0ZMQUdfRklYRURfU0laRVMgICAgICAgKCAxTCA8PCAgMSApCi0jZGVmaW5lIEZUX0ZBQ0VfRkxBR19GSVhFRF9XSURUSCAgICAgICAoIDFMIDw8ICAyICkKLSNkZWZpbmUgRlRfRkFDRV9GTEFHX1NGTlQgICAgICAgICAgICAgICggMUwgPDwgIDMgKQotI2RlZmluZSBGVF9GQUNFX0ZMQUdfSE9SSVpPTlRBTCAgICAgICAgKCAxTCA8PCAgNCApCi0jZGVmaW5lIEZUX0ZBQ0VfRkxBR19WRVJUSUNBTCAgICAgICAgICAoIDFMIDw8ICA1ICkKLSNkZWZpbmUgRlRfRkFDRV9GTEFHX0tFUk5JTkcgICAgICAgICAgICggMUwgPDwgIDYgKQotI2RlZmluZSBGVF9GQUNFX0ZMQUdfRkFTVF9HTFlQSFMgICAgICAgKCAxTCA8PCAgNyApCi0jZGVmaW5lIEZUX0ZBQ0VfRkxBR19NVUxUSVBMRV9NQVNURVJTICAoIDFMIDw8ICA4ICkKLSNkZWZpbmUgRlRfRkFDRV9GTEFHX0dMWVBIX05BTUVTICAgICAgICggMUwgPDwgIDkgKQotI2RlZmluZSBGVF9GQUNFX0ZMQUdfRVhURVJOQUxfU1RSRUFNICAgKCAxTCA8PCAxMCApCi0jZGVmaW5lIEZUX0ZBQ0VfRkxBR19ISU5URVIgICAgICAgICAgICAoIDFMIDw8IDExICkKLSNkZWZpbmUgRlRfRkFDRV9GTEFHX0NJRF9LRVlFRCAgICAgICAgICggMUwgPDwgMTIgKQotI2RlZmluZSBGVF9GQUNFX0ZMQUdfVFJJQ0tZICAgICAgICAgICAgKCAxTCA8PCAxMyApCi0jZGVmaW5lIEZUX0ZBQ0VfRkxBR19DT0xPUiAgICAgICAgICAgICAoIDFMIDw8IDE0ICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9IQVNfSE9SSVpPTlRBTCggZmFjZSApCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIGEgZmFjZSBvYmplY3QgY29udGFpbnMKLSAgICogICBob3Jpem9udGFsIG1ldHJpY3MgKHRoaXMgaXMgdHJ1ZSBmb3IgYWxsIGZvbnQgZm9ybWF0cyB0aG91Z2gpLgotICAgKgotICAgKiBAYWxzbzoKLSAgICogICBARlRfSEFTX1ZFUlRJQ0FMIGNhbiBiZSB1c2VkIHRvIGNoZWNrIGZvciB2ZXJ0aWNhbCBtZXRyaWNzLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfSEFTX0hPUklaT05UQUwoIGZhY2UgKSBcCi0gICAgICAgICAgKCBmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0hPUklaT05UQUwgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0hBU19WRVJUSUNBTCggZmFjZSApCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIGEgZmFjZSBvYmplY3QgY29udGFpbnMgcmVhbAotICAgKiAgIHZlcnRpY2FsIG1ldHJpY3MgKGFuZCBub3Qgb25seSBzeW50aGVzaXplZCBvbmVzKS4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0hBU19WRVJUSUNBTCggZmFjZSApIFwKLSAgICAgICAgICAoIGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfVkVSVElDQUwgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0hBU19LRVJOSU5HKCBmYWNlICkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucyBrZXJuaW5nCi0gICAqICAgZGF0YSB0aGF0IGNhbiBiZSBhY2Nlc3NlZCB3aXRoIEBGVF9HZXRfS2VybmluZy4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0hBU19LRVJOSU5HKCBmYWNlICkgXAotICAgICAgICAgICggZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19LRVJOSU5HICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9JU19TQ0FMQUJMRSggZmFjZSApCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIGEgZmFjZSBvYmplY3QgY29udGFpbnMgYSBzY2FsYWJsZQotICAgKiAgIGZvbnQgZmFjZSAodHJ1ZSBmb3IgVHJ1ZVR5cGUsIFR5cGV+MSwgVHlwZX40MiwgQ0lELCBPcGVuVHlwZS9DRkYsCi0gICAqICAgYW5kIFBGUiBmb250IGZvcm1hdHMuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9JU19TQ0FMQUJMRSggZmFjZSApIFwKLSAgICAgICAgICAoIGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfU0NBTEFCTEUgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0lTX1NGTlQoIGZhY2UgKQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB0aGF0IHJldHVybnMgdHJ1ZSB3aGVuZXZlciBhIGZhY2Ugb2JqZWN0IGNvbnRhaW5zIGEgZm9udAotICAgKiAgIHdob3NlIGZvcm1hdCBpcyBiYXNlZCBvbiB0aGUgU0ZOVCBzdG9yYWdlIHNjaGVtZS4gIFRoaXMgdXN1YWxseQotICAgKiAgIG1lYW5zOiBUcnVlVHlwZSBmb250cywgT3BlblR5cGUgZm9udHMsIGFzIHdlbGwgYXMgU0ZOVC1iYXNlZCBlbWJlZGRlZAotICAgKiAgIGJpdG1hcCBmb250cy4KLSAgICoKLSAgICogICBJZiB0aGlzIG1hY3JvIGlzIHRydWUsIGFsbCBmdW5jdGlvbnMgZGVmaW5lZCBpbiBARlRfU0ZOVF9OQU1FU19IIGFuZAotICAgKiAgIEBGVF9UUlVFVFlQRV9UQUJMRVNfSCBhcmUgYXZhaWxhYmxlLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfSVNfU0ZOVCggZmFjZSApIFwKLSAgICAgICAgICAoIGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfU0ZOVCApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSVNfRklYRURfV0lEVEgoIGZhY2UgKQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB0aGF0IHJldHVybnMgdHJ1ZSB3aGVuZXZlciBhIGZhY2Ugb2JqZWN0IGNvbnRhaW5zIGEgZm9udCBmYWNlCi0gICAqICAgdGhhdCBjb250YWlucyBmaXhlZC13aWR0aCAob3IgYG1vbm9zcGFjZScsIGBmaXhlZC1waXRjaCcsIGV0Yy4pCi0gICAqICAgZ2x5cGhzLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfSVNfRklYRURfV0lEVEgoIGZhY2UgKSBcCi0gICAgICAgICAgKCBmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0ZJWEVEX1dJRFRIICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9IQVNfRklYRURfU0laRVMoIGZhY2UgKQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB0aGF0IHJldHVybnMgdHJ1ZSB3aGVuZXZlciBhIGZhY2Ugb2JqZWN0IGNvbnRhaW5zIHNvbWUKLSAgICogICBlbWJlZGRlZCBiaXRtYXBzLiAgU2VlIHRoZSBgYXZhaWxhYmxlX3NpemVzJyBmaWVsZCBvZiB0aGUKLSAgICogICBARlRfRmFjZVJlYyBzdHJ1Y3R1cmUuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9IQVNfRklYRURfU0laRVMoIGZhY2UgKSBcCi0gICAgICAgICAgKCBmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0ZJWEVEX1NJWkVTICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9IQVNfRkFTVF9HTFlQSFMoIGZhY2UgKQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgRGVwcmVjYXRlZC4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0hBU19GQVNUX0dMWVBIUyggZmFjZSApICAwCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSEFTX0dMWVBIX05BTUVTKCBmYWNlICkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucyBzb21lIGdseXBoCi0gICAqICAgbmFtZXMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaCBARlRfR2V0X0dseXBoX05hbWUuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9IQVNfR0xZUEhfTkFNRVMoIGZhY2UgKSBcCi0gICAgICAgICAgKCBmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0dMWVBIX05BTUVTICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9IQVNfTVVMVElQTEVfTUFTVEVSUyggZmFjZSApCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIGEgZmFjZSBvYmplY3QgY29udGFpbnMgc29tZQotICAgKiAgIG11bHRpcGxlIG1hc3RlcnMuICBUaGUgZnVuY3Rpb25zIHByb3ZpZGVkIGJ5IEBGVF9NVUxUSVBMRV9NQVNURVJTX0gKLSAgICogICBhcmUgdGhlbiBhdmFpbGFibGUgdG8gY2hvb3NlIHRoZSBleGFjdCBkZXNpZ24geW91IHdhbnQuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9IQVNfTVVMVElQTEVfTUFTVEVSUyggZmFjZSApIFwKLSAgICAgICAgICAoIGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfTVVMVElQTEVfTUFTVEVSUyApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSVNfQ0lEX0tFWUVEKCBmYWNlICkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucyBhIENJRC1rZXllZAotICAgKiAgIGZvbnQuICBTZWUgdGhlIGRpc2N1c3Npb24gb2YgQEZUX0ZBQ0VfRkxBR19DSURfS0VZRUQgZm9yIG1vcmUKLSAgICogICBkZXRhaWxzLgotICAgKgotICAgKiAgIElmIHRoaXMgbWFjcm8gaXMgdHJ1ZSwgYWxsIGZ1bmN0aW9ucyBkZWZpbmVkIGluIEBGVF9DSURfSCBhcmUKLSAgICogICBhdmFpbGFibGUuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9JU19DSURfS0VZRUQoIGZhY2UgKSBcCi0gICAgICAgICAgKCBmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0NJRF9LRVlFRCApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSVNfVFJJQ0tZKCBmYWNlICkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIHJlcHJlc2VudHMgYSBgdHJpY2t5JyBmb250LgotICAgKiAgIFNlZSB0aGUgZGlzY3Vzc2lvbiBvZiBARlRfRkFDRV9GTEFHX1RSSUNLWSBmb3IgbW9yZSBkZXRhaWxzLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfSVNfVFJJQ0tZKCBmYWNlICkgXAotICAgICAgICAgICggZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19UUklDS1kgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0hBU19DT0xPUiggZmFjZSApCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIGEgZmFjZSBvYmplY3QgY29udGFpbnMKLSAgICogICB0YWJsZXMgZm9yIGNvbG9yIGdseXBocy4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0hBU19DT0xPUiggZmFjZSApIFwKLSAgICAgICAgICAoIGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfQ09MT1IgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Q29uc3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU1RZTEVfRkxBR19YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBsaXN0IG9mIGJpdC1mbGFncyB1c2VkIHRvIGluZGljYXRlIHRoZSBzdHlsZSBvZiBhIGdpdmVuIGZhY2UuICAgICovCi0gIC8qICAgIFRoZXNlIGFyZSB1c2VkIGluIHRoZSBgc3R5bGVfZmxhZ3MnIGZpZWxkIG9mIEBGVF9GYWNlUmVjLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NUWUxFX0ZMQUdfSVRBTElDIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEluZGljYXRlcyB0aGF0IGEgZ2l2ZW4gZmFjZSBzdHlsZSBpcyBpdGFsaWMgb3Igb2JsaXF1ZS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NUWUxFX0ZMQUdfQk9MRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEluZGljYXRlcyB0aGF0IGEgZ2l2ZW4gZmFjZSBpcyBib2xkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgc3R5bGUgaW5mb3JtYXRpb24gYXMgcHJvdmlkZWQgYnkgRnJlZVR5cGUgaXMgdmVyeSBiYXNpYy4gIE1vcmUgKi8KLSAgLyogICAgZGV0YWlscyBhcmUgYmV5b25kIHRoZSBzY29wZSBhbmQgc2hvdWxkIGJlIGRvbmUgb24gYSBoaWdoZXIgbGV2ZWwgICovCi0gIC8qICAgIChmb3IgZXhhbXBsZSwgYnkgYW5hbHl6aW5nIHZhcmlvdXMgZmllbGRzIG9mIHRoZSBgT1MvMicgdGFibGUgaW4gICAqLwotICAvKiAgICBTRk5UIGJhc2VkIGZvbnRzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX1NUWUxFX0ZMQUdfSVRBTElDICAoIDEgPDwgMCApCi0jZGVmaW5lIEZUX1NUWUxFX0ZMQUdfQk9MRCAgICAoIDEgPDwgMSApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaXplX0ludGVybmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBvcGFxdWUgaGFuZGxlIHRvIGFuIGBGVF9TaXplX0ludGVybmFsUmVjJyBzdHJ1Y3R1cmUsIHVzZWQgdG8gICAgKi8KLSAgLyogICAgbW9kZWwgcHJpdmF0ZSBkYXRhIG9mIGEgZ2l2ZW4gQEZUX1NpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9TaXplX0ludGVybmFsUmVjXyogIEZUX1NpemVfSW50ZXJuYWw7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaXplX01ldHJpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgc2l6ZSBtZXRyaWNzIHN0cnVjdHVyZSBnaXZlcyB0aGUgbWV0cmljcyBvZiBhIHNpemUgb2JqZWN0LiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4X3BwZW0gICAgICAgOjogVGhlIHdpZHRoIG9mIHRoZSBzY2FsZWQgRU0gc3F1YXJlIGluIHBpeGVscywgaGVuY2UgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHRoZSB0ZXJtIGBwcGVtJyAocGl4ZWxzIHBlciBFTSkuICBJdCBpcyBhbHNvICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICByZWZlcnJlZCB0byBhcyBgbm9taW5hbCB3aWR0aCcuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeV9wcGVtICAgICAgIDo6IFRoZSBoZWlnaHQgb2YgdGhlIHNjYWxlZCBFTSBzcXVhcmUgaW4gcGl4ZWxzLCAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBoZW5jZSB0aGUgdGVybSBgcHBlbScgKHBpeGVscyBwZXIgRU0pLiAgSXQgaXMgYWxzbyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgcmVmZXJyZWQgdG8gYXMgYG5vbWluYWwgaGVpZ2h0Jy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHhfc2NhbGUgICAgICA6OiBBIDE2LjE2IGZyYWN0aW9uYWwgc2NhbGluZyB2YWx1ZSB1c2VkIHRvIGNvbnZlcnQgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbCBtZXRyaWNzIGZyb20gZm9udCB1bml0cyB0byAyNi42ICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uYWwgcGl4ZWxzLiAgT25seSByZWxldmFudCBmb3Igc2NhbGFibGUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBmb250IGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeV9zY2FsZSAgICAgIDo6IEEgMTYuMTYgZnJhY3Rpb25hbCBzY2FsaW5nIHZhbHVlIHVzZWQgdG8gY29udmVydCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBtZXRyaWNzIGZyb20gZm9udCB1bml0cyB0byAyNi42ICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb25hbCBwaXhlbHMuICBPbmx5IHJlbGV2YW50IGZvciBzY2FsYWJsZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGZvbnQgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhc2NlbmRlciAgICAgOjogVGhlIGFzY2VuZGVyIGluIDI2LjYgZnJhY3Rpb25hbCBwaXhlbHMuICBTZWUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIEBGVF9GYWNlUmVjIGZvciB0aGUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZXNjZW5kZXIgICAgOjogVGhlIGRlc2NlbmRlciBpbiAyNi42IGZyYWN0aW9uYWwgcGl4ZWxzLiAgU2VlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIEBGVF9GYWNlUmVjIGZvciB0aGUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZWlnaHQgICAgICAgOjogVGhlIGhlaWdodCBpbiAyNi42IGZyYWN0aW9uYWwgcGl4ZWxzLiAgU2VlICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIEBGVF9GYWNlUmVjIGZvciB0aGUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhfYWR2YW5jZSAgOjogVGhlIG1heGltdW0gYWR2YW5jZSB3aWR0aCBpbiAyNi42IGZyYWN0aW9uYWwgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHBpeGVscy4gIFNlZSBARlRfRmFjZVJlYyBmb3IgdGhlIGRldGFpbHMuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHNjYWxpbmcgdmFsdWVzLCBpZiByZWxldmFudCwgYXJlIGRldGVybWluZWQgZmlyc3QgZHVyaW5nIGEgICAgICovCi0gIC8qICAgIHNpemUgY2hhbmdpbmcgb3BlcmF0aW9uLiAgVGhlIHJlbWFpbmluZyBmaWVsZHMgYXJlIHRoZW4gc2V0IGJ5IHRoZSAqLwotICAvKiAgICBkcml2ZXIuICBGb3Igc2NhbGFibGUgZm9ybWF0cywgdGhleSBhcmUgdXN1YWxseSBzZXQgdG8gc2NhbGVkICAgICAgKi8KLSAgLyogICAgdmFsdWVzIG9mIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkcyBpbiBARlRfRmFjZVJlYy4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3RlIHRoYXQgZHVlIHRvIGdseXBoIGhpbnRpbmcsIHRoZXNlIHZhbHVlcyBtaWdodCBub3QgYmUgZXhhY3QgICAgKi8KLSAgLyogICAgZm9yIGNlcnRhaW4gZm9udHMuICBUaHVzIHRoZXkgbXVzdCBiZSB0cmVhdGVkIGFzIHVucmVsaWFibGUgICAgICAgICovCi0gIC8qICAgIHdpdGggYW4gZXJyb3IgbWFyZ2luIG9mIGF0IGxlYXN0IG9uZSBwaXhlbCEgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5kZWVkLCB0aGUgb25seSB3YXkgdG8gZ2V0IHRoZSBleGFjdCBtZXRyaWNzIGlzIHRvIHJlbmRlciBfYWxsXyAgICovCi0gIC8qICAgIGdseXBocy4gIEFzIHRoaXMgd291bGQgYmUgYSBkZWZpbml0ZSBwZXJmb3JtYW5jZSBoaXQsIGl0IGlzIHVwIHRvICAqLwotICAvKiAgICBjbGllbnQgYXBwbGljYXRpb25zIHRvIHBlcmZvcm0gc3VjaCBjb21wdXRhdGlvbnMuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBGVF9TaXplX01ldHJpY3Mgc3RydWN0dXJlIGlzIHZhbGlkIGZvciBiaXRtYXAgZm9udHMgYWxzby4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1NpemVfTWV0cmljc18KLSAgewotICAgIEZUX1VTaG9ydCAgeF9wcGVtOyAgICAgIC8qIGhvcml6b250YWwgcGl4ZWxzIHBlciBFTSAgICAgICAgICAgICAgICovCi0gICAgRlRfVVNob3J0ICB5X3BwZW07ICAgICAgLyogdmVydGljYWwgcGl4ZWxzIHBlciBFTSAgICAgICAgICAgICAgICAgKi8KLQotICAgIEZUX0ZpeGVkICAgeF9zY2FsZTsgICAgIC8qIHNjYWxpbmcgdmFsdWVzIHVzZWQgdG8gY29udmVydCBmb250ICAgICovCi0gICAgRlRfRml4ZWQgICB5X3NjYWxlOyAgICAgLyogdW5pdHMgdG8gMjYuNiBmcmFjdGlvbmFsIHBpeGVscyAgICAgICAgKi8KLQotICAgIEZUX1BvcyAgICAgYXNjZW5kZXI7ICAgIC8qIGFzY2VuZGVyIGluIDI2LjYgZnJhYy4gcGl4ZWxzICAgICAgICAgICovCi0gICAgRlRfUG9zICAgICBkZXNjZW5kZXI7ICAgLyogZGVzY2VuZGVyIGluIDI2LjYgZnJhYy4gcGl4ZWxzICAgICAgICAgKi8KLSAgICBGVF9Qb3MgICAgIGhlaWdodDsgICAgICAvKiB0ZXh0IGhlaWdodCBpbiAyNi42IGZyYWMuIHBpeGVscyAgICAgICAqLwotICAgIEZUX1BvcyAgICAgbWF4X2FkdmFuY2U7IC8qIG1heCBob3Jpem9udGFsIGFkdmFuY2UsIGluIDI2LjYgcGl4ZWxzICovCi0KLSAgfSBGVF9TaXplX01ldHJpY3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaXplUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSByb290IHNpemUgY2xhc3Mgc3RydWN0dXJlLiAgQSBzaXplIG9iamVjdCBtb2RlbHMgYSBmYWNlICAgKi8KLSAgLyogICAgb2JqZWN0IGF0IGEgZ2l2ZW4gc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICA6OiBIYW5kbGUgdG8gdGhlIHBhcmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnZW5lcmljIDo6IEEgdHlwZWxlc3MgcG9pbnRlciwgdW51c2VkIGJ5IHRoZSBGcmVlVHlwZSBsaWJyYXJ5IG9yICAgKi8KLSAgLyogICAgICAgICAgICAgICBhbnkgb2YgaXRzIGRyaXZlcnMuICBJdCBjYW4gYmUgdXNlZCBieSBjbGllbnQgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgYXBwbGljYXRpb25zIHRvIGxpbmsgdGhlaXIgb3duIGRhdGEgdG8gZWFjaCBzaXplICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1ldHJpY3MgOjogTWV0cmljcyBmb3IgdGhpcyBzaXplIG9iamVjdC4gIFRoaXMgZmllbGQgaXMgcmVhZC1vbmx5LiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1NpemVSZWNfCi0gIHsKLSAgICBGVF9GYWNlICAgICAgICAgICBmYWNlOyAgICAgIC8qIHBhcmVudCBmYWNlIG9iamVjdCAgICAgICAgICAgICAgKi8KLSAgICBGVF9HZW5lcmljICAgICAgICBnZW5lcmljOyAgIC8qIGdlbmVyaWMgcG9pbnRlciBmb3IgY2xpZW50IHVzZXMgKi8KLSAgICBGVF9TaXplX01ldHJpY3MgICBtZXRyaWNzOyAgIC8qIHNpemUgbWV0cmljcyAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9TaXplX0ludGVybmFsICBpbnRlcm5hbDsKLQotICB9IEZUX1NpemVSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TdWJHbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgc3ViZ2x5cGggc3RydWN0dXJlIGlzIGFuIGludGVybmFsIG9iamVjdCB1c2VkIHRvIGRlc2NyaWJlICAgICAgKi8KLSAgLyogICAgc3ViZ2x5cGhzIChmb3IgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgY29tcG9zaXRlcykuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHN1YmdseXBoIGltcGxlbWVudGF0aW9uIGlzIG5vdCBwYXJ0IG9mIHRoZSBoaWdoLWxldmVsIEFQSSwgICAgICovCi0gIC8qICAgIGhlbmNlIHRoZSBmb3J3YXJkIHN0cnVjdHVyZSBkZWNsYXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgWW91IGNhbiBob3dldmVyIHJldHJpZXZlIHN1YmdseXBoIGluZm9ybWF0aW9uIHdpdGggICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9HZXRfU3ViR2x5cGhfSW5mby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfU3ViR2x5cGhSZWNfKiAgRlRfU3ViR2x5cGg7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TbG90X0ludGVybmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBvcGFxdWUgaGFuZGxlIHRvIGFuIGBGVF9TbG90X0ludGVybmFsUmVjJyBzdHJ1Y3R1cmUsIHVzZWQgdG8gICAgKi8KLSAgLyogICAgbW9kZWwgcHJpdmF0ZSBkYXRhIG9mIGEgZ2l2ZW4gQEZUX0dseXBoU2xvdCBvYmplY3QuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9TbG90X0ludGVybmFsUmVjXyogIEZUX1Nsb3RfSW50ZXJuYWw7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaFNsb3RSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSByb290IGdseXBoIHNsb3QgY2xhc3Mgc3RydWN0dXJlLiAgQSBnbHlwaCBzbG90IGlzIGEgICAgICAgKi8KLSAgLyogICAgY29udGFpbmVyIHdoZXJlIGluZGl2aWR1YWwgZ2x5cGhzIGNhbiBiZSBsb2FkZWQsIGJlIHRoZXkgaW4gICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgb3IgYml0bWFwIGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICAgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBGcmVlVHlwZSBsaWJyYXJ5IGluc3RhbmNlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHNsb3QgYmVsb25ncyB0by4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBwYXJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmV4dCAgICAgICAgICAgICAgOjogSW4gc29tZSBjYXNlcyAobGlrZSBzb21lIGZvbnQgdG9vbHMpLCBzZXZlcmFsICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoIHNsb3RzIHBlciBmYWNlIG9iamVjdCBjYW4gYmUgYSBnb29kICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGluZy4gIEFzIHRoaXMgaXMgcmFyZSwgdGhlIGdseXBoIHNsb3RzIGFyZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVkIHRocm91Z2ggYSBkaXJlY3QsIHNpbmdsZS1saW5rZWQgbGlzdCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIGl0cyBgbmV4dCcgZmllbGQuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2VuZXJpYyAgICAgICAgICAgOjogQSB0eXBlbGVzcyBwb2ludGVyIHVudXNlZCBieSB0aGUgRnJlZVR5cGUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnkgb3IgYW55IG9mIGl0cyBkcml2ZXJzLiAgSXQgY2FuIGJlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGJ5IGNsaWVudCBhcHBsaWNhdGlvbnMgdG8gbGluayB0aGVpciBvd24gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSB0byBlYWNoIGdseXBoIHNsb3Qgb2JqZWN0LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZXRyaWNzICAgICAgICAgICA6OiBUaGUgbWV0cmljcyBvZiB0aGUgbGFzdCBsb2FkZWQgZ2x5cGggaW4gdGhlICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgc2xvdC4gIFRoZSByZXR1cm5lZCB2YWx1ZXMgZGVwZW5kIG9uIHRoZSBsYXN0ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWQgZmxhZ3MgKHNlZSB0aGUgQEZUX0xvYWRfR2x5cGggQVBJICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbikgYW5kIGNhbiBiZSBleHByZXNzZWQgZWl0aGVyIGluIDI2LjYgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb25hbCBwaXhlbHMgb3IgZm9udCB1bml0cy4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgZXZlbiB3aGVuIHRoZSBnbHlwaCBpbWFnZSBpcyAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWQsIHRoZSBtZXRyaWNzIGFyZSBub3QuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaW5lYXJIb3JpQWR2YW5jZSA6OiBUaGUgYWR2YW5jZSB3aWR0aCBvZiB0aGUgdW5oaW50ZWQgZ2x5cGguICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgSXRzIHZhbHVlIGlzIGV4cHJlc3NlZCBpbiAxNi4xNiBmcmFjdGlvbmFsICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVscywgdW5sZXNzIEBGVF9MT0FEX0xJTkVBUl9ERVNJR04gaXMgc2V0ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIGxvYWRpbmcgdGhlIGdseXBoLiAgVGhpcyBmaWVsZCBjYW4gYmUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0YW50IHRvIHBlcmZvcm0gY29ycmVjdCBXWVNJV1lHIGxheW91dC4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgcmVsZXZhbnQgZm9yIG91dGxpbmUgZ2x5cGhzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGluZWFyVmVydEFkdmFuY2UgOjogVGhlIGFkdmFuY2UgaGVpZ2h0IG9mIHRoZSB1bmhpbnRlZCBnbHlwaC4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEl0cyB2YWx1ZSBpcyBleHByZXNzZWQgaW4gMTYuMTYgZnJhY3Rpb25hbCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHMsIHVubGVzcyBARlRfTE9BRF9MSU5FQVJfREVTSUdOIGlzIHNldCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBsb2FkaW5nIHRoZSBnbHlwaC4gIFRoaXMgZmllbGQgY2FuIGJlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydGFudCB0byBwZXJmb3JtIGNvcnJlY3QgV1lTSVdZRyBsYXlvdXQuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IHJlbGV2YW50IGZvciBvdXRsaW5lIGdseXBocy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFkdmFuY2UgICAgICAgICAgIDo6IFRoaXMgc2hvcnRoYW5kIGlzLCBkZXBlbmRpbmcgb24gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBARlRfTE9BRF9JR05PUkVfVFJBTlNGT1JNLCB0aGUgdHJhbnNmb3JtZWQgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgKGhpbnRlZCkgYWR2YW5jZSB3aWR0aCBmb3IgdGhlIGdseXBoLCBpbiAyNi42ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uYWwgcGl4ZWwgZm9ybWF0LiAgQXMgc3BlY2lmaWVkIHdpdGggICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBARlRfTE9BRF9WRVJUSUNBTF9MQVlPVVQsIGl0IHVzZXMgZWl0aGVyIHRoZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgYGhvcmlBZHZhbmNlJyBvciB0aGUgYHZlcnRBZHZhbmNlJyB2YWx1ZSBvZiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGBtZXRyaWNzJyBmaWVsZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9ybWF0ICAgICAgICAgICAgOjogVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIGZvcm1hdCBvZiB0aGUgaW1hZ2UgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lZCBpbiB0aGUgZ2x5cGggc2xvdC4gIFR5cGljYWxseSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBARlRfR0xZUEhfRk9STUFUX0JJVE1BUCwgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgQEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FLCBvciAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEBGVF9HTFlQSF9GT1JNQVRfQ09NUE9TSVRFLCBidXQgb3RoZXJzIGFyZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJpdG1hcCAgICAgICAgICAgIDo6IFRoaXMgZmllbGQgaXMgdXNlZCBhcyBhIGJpdG1hcCBkZXNjcmlwdG9yICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSBzbG90IGZvcm1hdCBpcyAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgQEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAuICBOb3RlIHRoYXQgdGhlICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgYW5kIGNvbnRlbnQgb2YgdGhlIGJpdG1hcCBidWZmZXIgY2FuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2UgYmV0d2VlbiBjYWxscyBvZiBARlRfTG9hZF9HbHlwaCBhbmQgYSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZmV3IG90aGVyIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiaXRtYXBfbGVmdCAgICAgICA6OiBUaGUgYml0bWFwJ3MgbGVmdCBiZWFyaW5nIGV4cHJlc3NlZCBpbiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdlciBwaXhlbHMuICBPbmx5IHZhbGlkIGlmIHRoZSBmb3JtYXQgaXMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEBGVF9HTFlQSF9GT1JNQVRfQklUTUFQLCB0aGlzIGlzLCBpZiB0aGUgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaCBzbG90IGNvbnRhaW5zIGEgYml0bWFwLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJpdG1hcF90b3AgICAgICAgIDo6IFRoZSBiaXRtYXAncyB0b3AgYmVhcmluZyBleHByZXNzZWQgaW4gaW50ZWdlciAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHMuICBSZW1lbWJlciB0aGF0IHRoaXMgaXMgdGhlIGRpc3RhbmNlICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgYmFzZWxpbmUgdG8gdGhlIHRvcC1tb3N0IGdseXBoICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5saW5lLCB1cHdhcmRzIHl+Y29vcmRpbmF0ZXMgYmVpbmcgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAqcG9zaXRpdmUqLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgICAgICAgICAgIDo6IFRoZSBvdXRsaW5lIGRlc2NyaXB0b3IgZm9yIHRoZSBjdXJyZW50IGdseXBoICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBpZiBpdHMgZm9ybWF0IGlzICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgQEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FLiAgT25jZSBhIGdseXBoIGlzICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZCwgYG91dGxpbmUnIGNhbiBiZSB0cmFuc2Zvcm1lZCwgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0b3J0ZWQsIGVtYm9sZGVkLCBldGMuICBIb3dldmVyLCBpdCBtdXN0ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgbm90IGJlIGZyZWVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fc3ViZ2x5cGhzICAgICA6OiBUaGUgbnVtYmVyIG9mIHN1YmdseXBocyBpbiBhIGNvbXBvc2l0ZSBnbHlwaC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmaWVsZCBpcyBvbmx5IHZhbGlkIGZvciB0aGUgY29tcG9zaXRlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoIGZvcm1hdCB0aGF0IHNob3VsZCBub3JtYWxseSBvbmx5IGJlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQgd2l0aCB0aGUgQEZUX0xPQURfTk9fUkVDVVJTRSBmbGFnLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN1YmdseXBocyAgICAgICAgIDo6IEFuIGFycmF5IG9mIHN1YmdseXBoIGRlc2NyaXB0b3JzIGZvciAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUgZ2x5cGhzLiAgVGhlcmUgYXJlIGBudW1fc3ViZ2x5cGhzJyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgaW4gdGhlcmUuICBDdXJyZW50bHkgaW50ZXJuYWwgdG8gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29udHJvbF9kYXRhICAgICAgOjogQ2VydGFpbiBmb250IGRyaXZlcnMgY2FuIGFsc28gcmV0dXJuIHRoZSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgZGF0YSBmb3IgYSBnaXZlbiBnbHlwaCBpbWFnZSAoZS5nLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlVHlwZSBieXRlY29kZSwgVHlwZX4xIGNoYXJzdHJpbmdzLCBldGMuKS4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmaWVsZCBpcyBhIHBvaW50ZXIgdG8gc3VjaCBkYXRhLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb250cm9sX2xlbiAgICAgICA6OiBUaGlzIGlzIHRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGNvbnRyb2wgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdGhlciAgICAgICAgICAgICA6OiBSZWFsbHkgd2lja2VkIGZvcm1hdHMgY2FuIHVzZSB0aGlzIHBvaW50ZXIgdG8gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudCB0aGVpciBvd24gZ2x5cGggaW1hZ2UgdG8gY2xpZW50ICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9ucy4gIE5vdGUgdGhhdCB0aGUgYXBwbGljYXRpb24gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkcyB0byBrbm93IGFib3V0IHRoZSBpbWFnZSBmb3JtYXQuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxzYl9kZWx0YSAgICAgICAgIDo6IFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gaGludGVkIGFuZCB1bmhpbnRlZCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IHNpZGUgYmVhcmluZyB3aGlsZSBhdXRvaGludGluZyBpcyAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlLiAgWmVybyBvdGhlcndpc2UuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByc2JfZGVsdGEgICAgICAgICA6OiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGhpbnRlZCBhbmQgdW5oaW50ZWQgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgc2lkZSBiZWFyaW5nIHdoaWxlIGF1dG9oaW50aW5nIGlzICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZS4gIFplcm8gb3RoZXJ3aXNlLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIEBGVF9Mb2FkX0dseXBoIGlzIGNhbGxlZCB3aXRoIGRlZmF1bHQgZmxhZ3MgKHNlZSAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfTE9BRF9ERUZBVUxUKSB0aGUgZ2x5cGggaW1hZ2UgaXMgbG9hZGVkIGluIHRoZSBnbHlwaCBzbG90IGluICAgKi8KLSAgLyogICAgaXRzIG5hdGl2ZSBmb3JtYXQgKGUuZy4sIGFuIG91dGxpbmUgZ2x5cGggZm9yIFRydWVUeXBlIGFuZCBUeXBlfjEgICovCi0gIC8qICAgIGZvcm1hdHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBpbWFnZSBjYW4gbGF0ZXIgYmUgY29udmVydGVkIGludG8gYSBiaXRtYXAgYnkgY2FsbGluZyAgICAgICAgICovCi0gIC8qICAgIEBGVF9SZW5kZXJfR2x5cGguICBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBjdXJyZW50IHJlbmRlcmVyIGZvciAgICAqLwotICAvKiAgICB0aGUgbmF0aXZlIGltYWdlJ3MgZm9ybWF0LCB0aGVuIGludm9rZXMgaXQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZW5kZXJlciBpcyBpbiBjaGFyZ2Ugb2YgdHJhbnNmb3JtaW5nIHRoZSBuYXRpdmUgaW1hZ2UgdGhyb3VnaCAqLwotICAvKiAgICB0aGUgc2xvdCdzIGZhY2UgdHJhbnNmb3JtYXRpb24gZmllbGRzLCB0aGVuIGNvbnZlcnRpbmcgaXQgaW50byBhICAgKi8KLSAgLyogICAgYml0bWFwIHRoYXQgaXMgcmV0dXJuZWQgaW4gYHNsb3QtPmJpdG1hcCcuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3RlIHRoYXQgYHNsb3QtPmJpdG1hcF9sZWZ0JyBhbmQgYHNsb3QtPmJpdG1hcF90b3AnIGFyZSBhbHNvIHVzZWQgKi8KLSAgLyogICAgdG8gc3BlY2lmeSB0aGUgcG9zaXRpb24gb2YgdGhlIGJpdG1hcCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBwZW4gICovCi0gIC8qICAgIHBvc2l0aW9uIChlLmcuLCBjb29yZGluYXRlcyAoMCwwKSBvbiB0aGUgYmFzZWxpbmUpLiAgT2YgY291cnNlLCAgICAqLwotICAvKiAgICBgc2xvdC0+Zm9ybWF0JyBpcyBhbHNvIGNoYW5nZWQgdG8gQEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBIZXJlIGEgc21hbGwgcHNldWRvIGNvZGUgZnJhZ21lbnQgdGhhdCBzaG93cyBob3cgdG8gdXNlICAgICAgICAgICAgKi8KLSAgLyogICAgYGxzYl9kZWx0YScgYW5kIGByc2JfZGVsdGEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGVF9Qb3MgIG9yaWdpbl94ICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRlRfUG9zICBwcmV2X3JzYl9kZWx0YSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgZm9yIGFsbCBnbHlwaHMgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgPGNvbXB1dGUga2VybiBiZXR3ZWVuIGN1cnJlbnQgYW5kIHByZXZpb3VzIGdseXBoIGFuZCBhZGQgaXQgdG8gKi8KLSAgLyogICAgICAgICBgb3JpZ2luX3gnPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgPGxvYWQgZ2x5cGggd2l0aCBgRlRfTG9hZF9HbHlwaCc+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBpZiAoIHByZXZfcnNiX2RlbHRhIC0gZmFjZS0+Z2x5cGgtPmxzYl9kZWx0YSA+PSAzMiApICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBvcmlnaW5feCAtPSA2NDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIGVsc2UgaWYgKCBwcmV2X3JzYl9kZWx0YSAtIGZhY2UtPmdseXBoLT5sc2JfZGVsdGEgPCAtMzIgKSAgICAgICovCi0gIC8qICAgICAgICAgIG9yaWdpbl94ICs9IDY0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIHByZXZfcnNiX2RlbHRhID0gZmFjZS0+Z2x5cGgtPnJzYl9kZWx0YTsgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgPHNhdmUgZ2x5cGggaW1hZ2UsIG9yIHJlbmRlciBnbHlwaCwgb3IgLi4uPiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBvcmlnaW5feCArPSBmYWNlLT5nbHlwaC0+YWR2YW5jZS54OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGVuZGZvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfR2x5cGhTbG90UmVjXwotICB7Ci0gICAgRlRfTGlicmFyeSAgICAgICAgbGlicmFyeTsKLSAgICBGVF9GYWNlICAgICAgICAgICBmYWNlOwotICAgIEZUX0dseXBoU2xvdCAgICAgIG5leHQ7Ci0gICAgRlRfVUludCAgICAgICAgICAgcmVzZXJ2ZWQ7ICAgICAgIC8qIHJldGFpbmVkIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSAqLwotICAgIEZUX0dlbmVyaWMgICAgICAgIGdlbmVyaWM7Ci0KLSAgICBGVF9HbHlwaF9NZXRyaWNzICBtZXRyaWNzOwotICAgIEZUX0ZpeGVkICAgICAgICAgIGxpbmVhckhvcmlBZHZhbmNlOwotICAgIEZUX0ZpeGVkICAgICAgICAgIGxpbmVhclZlcnRBZHZhbmNlOwotICAgIEZUX1ZlY3RvciAgICAgICAgIGFkdmFuY2U7Ci0KLSAgICBGVF9HbHlwaF9Gb3JtYXQgICBmb3JtYXQ7Ci0KLSAgICBGVF9CaXRtYXAgICAgICAgICBiaXRtYXA7Ci0gICAgRlRfSW50ICAgICAgICAgICAgYml0bWFwX2xlZnQ7Ci0gICAgRlRfSW50ICAgICAgICAgICAgYml0bWFwX3RvcDsKLQotICAgIEZUX091dGxpbmUgICAgICAgIG91dGxpbmU7Ci0KLSAgICBGVF9VSW50ICAgICAgICAgICBudW1fc3ViZ2x5cGhzOwotICAgIEZUX1N1YkdseXBoICAgICAgIHN1YmdseXBoczsKLQotICAgIHZvaWQqICAgICAgICAgICAgIGNvbnRyb2xfZGF0YTsKLSAgICBsb25nICAgICAgICAgICAgICBjb250cm9sX2xlbjsKLQotICAgIEZUX1BvcyAgICAgICAgICAgIGxzYl9kZWx0YTsKLSAgICBGVF9Qb3MgICAgICAgICAgICByc2JfZGVsdGE7Ci0KLSAgICB2b2lkKiAgICAgICAgICAgICBvdGhlcjsKLQotICAgIEZUX1Nsb3RfSW50ZXJuYWwgIGludGVybmFsOwotCi0gIH0gRlRfR2x5cGhTbG90UmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Jbml0X0ZyZWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbml0aWFsaXplIGEgbmV3IEZyZWVUeXBlIGxpYnJhcnkgb2JqZWN0LiAgVGhlIHNldCBvZiBtb2R1bGVzICAgICAgKi8KLSAgLyogICAgdGhhdCBhcmUgcmVnaXN0ZXJlZCBieSB0aGlzIGZ1bmN0aW9uIGlzIGRldGVybWluZWQgYXQgYnVpbGQgdGltZS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWxpYnJhcnkgOjogQSBoYW5kbGUgdG8gYSBuZXcgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW4gY2FzZSB5b3Ugd2FudCB0byBwcm92aWRlIHlvdXIgb3duIG1lbW9yeSBhbGxvY2F0aW5nIHJvdXRpbmVzLCAgICovCi0gIC8qICAgIHVzZSBARlRfTmV3X0xpYnJhcnkgaW5zdGVhZCwgZm9sbG93ZWQgYnkgYSBjYWxsIHRvICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfQWRkX0RlZmF1bHRfTW9kdWxlcyAob3IgYSBzZXJpZXMgb2YgY2FsbHMgdG8gQEZUX0FkZF9Nb2R1bGUpLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZvciBtdWx0aS10aHJlYWRpbmcgYXBwbGljYXRpb25zIGVhY2ggdGhyZWFkIHNob3VsZCBoYXZlIGl0cyBvd24gICAqLwotICAvKiAgICBGVF9MaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHlvdSBuZWVkIHJlZmVyZW5jZS1jb3VudGluZyAoY2YuIEBGVF9SZWZlcmVuY2VfTGlicmFyeSksIHVzZSAgICAqLwotICAvKiAgICBARlRfTmV3X0xpYnJhcnkgYW5kIEBGVF9Eb25lX0xpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9Jbml0X0ZyZWVUeXBlKCBGVF9MaWJyYXJ5ICAqYWxpYnJhcnkgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RvbmVfRnJlZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlc3Ryb3kgYSBnaXZlbiBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdCBhbmQgYWxsIG9mIGl0cyBjaGlsZHJlbiwgICAqLwotICAvKiAgICBpbmNsdWRpbmcgcmVzb3VyY2VzLCBkcml2ZXJzLCBmYWNlcywgc2l6ZXMsIGV0Yy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9Eb25lX0ZyZWVUeXBlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PUEVOX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGxpc3Qgb2YgYml0LWZpZWxkIGNvbnN0YW50cyB1c2VkIHdpdGhpbiB0aGUgYGZsYWdzJyBmaWVsZCBvZiB0aGUgKi8KLSAgLyogICAgQEZUX09wZW5fQXJncyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1BFTl9NRU1PUlkgICA6OiBUaGlzIGlzIGEgbWVtb3J5LWJhc2VkIHN0cmVhbS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PUEVOX1NUUkVBTSAgIDo6IENvcHkgdGhlIHN0cmVhbSBmcm9tIHRoZSBgc3RyZWFtJyBmaWVsZC4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09QRU5fUEFUSE5BTUUgOjogQ3JlYXRlIGEgbmV3IGlucHV0IHN0cmVhbSBmcm9tIGEgQ35wYXRoICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09QRU5fRFJJVkVSICAgOjogVXNlIHRoZSBgZHJpdmVyJyBmaWVsZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1BFTl9QQVJBTVMgICA6OiBVc2UgdGhlIGBudW1fcGFyYW1zJyBhbmQgYHBhcmFtcycgZmllbGRzLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGBGVF9PUEVOX01FTU9SWScsIGBGVF9PUEVOX1NUUkVBTScsIGFuZCBgRlRfT1BFTl9QQVRITkFNRScgICAgICovCi0gIC8qICAgIGZsYWdzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfT1BFTl9NRU1PUlkgICAgMHgxCi0jZGVmaW5lIEZUX09QRU5fU1RSRUFNICAgIDB4MgotI2RlZmluZSBGVF9PUEVOX1BBVEhOQU1FICAweDQKLSNkZWZpbmUgRlRfT1BFTl9EUklWRVIgICAgMHg4Ci0jZGVmaW5lIEZUX09QRU5fUEFSQU1TICAgIDB4MTAKLQotCi0gIC8qIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVwcmVjYXRlZDsgdXNlIHRoZSBjb3JyZXNwb25kaW5nIGBGVF9PUEVOX1hYWCcgKi8KLSAgLyogdmFsdWVzIGluc3RlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBmdF9vcGVuX21lbW9yeSAgICBGVF9PUEVOX01FTU9SWQotI2RlZmluZSBmdF9vcGVuX3N0cmVhbSAgICBGVF9PUEVOX1NUUkVBTQotI2RlZmluZSBmdF9vcGVuX3BhdGhuYW1lICBGVF9PUEVOX1BBVEhOQU1FCi0jZGVmaW5lIGZ0X29wZW5fZHJpdmVyICAgIEZUX09QRU5fRFJJVkVSCi0jZGVmaW5lIGZ0X29wZW5fcGFyYW1zICAgIEZUX09QRU5fUEFSQU1TCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QYXJhbWV0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNpbXBsZSBzdHJ1Y3R1cmUgdXNlZCB0byBwYXNzIG1vcmUgb3IgbGVzcyBnZW5lcmljIHBhcmFtZXRlcnMgdG8gKi8KLSAgLyogICAgQEZUX09wZW5fRmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFnICA6OiBBIGZvdXItYnl0ZSBpZGVudGlmaWNhdGlvbiB0YWcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkYXRhIDo6IEEgcG9pbnRlciB0byB0aGUgcGFyYW1ldGVyIGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgSUQgYW5kIGZ1bmN0aW9uIG9mIHBhcmFtZXRlcnMgYXJlIGRyaXZlci1zcGVjaWZpYy4gIFNlZSB0aGUgICAgKi8KLSAgLyogICAgdmFyaW91cyBGVF9QQVJBTV9UQUdfWFhYIGZsYWdzIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfUGFyYW1ldGVyXwotICB7Ci0gICAgRlRfVUxvbmcgICAgdGFnOwotICAgIEZUX1BvaW50ZXIgIGRhdGE7Ci0KLSAgfSBGVF9QYXJhbWV0ZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PcGVuX0FyZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIGluZGljYXRlIGhvdyB0byBvcGVuIGEgbmV3IGZvbnQgZmlsZSBvciAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtLiAgQSBwb2ludGVyIHRvIHN1Y2ggYSBzdHJ1Y3R1cmUgY2FuIGJlIHVzZWQgYXMgYSBwYXJhbWV0ZXIgICovCi0gIC8qICAgIGZvciB0aGUgZnVuY3Rpb25zIEBGVF9PcGVuX0ZhY2UgYW5kIEBGVF9BdHRhY2hfU3RyZWFtLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZsYWdzICAgICAgIDo6IEEgc2V0IG9mIGJpdCBmbGFncyBpbmRpY2F0aW5nIGhvdyB0byB1c2UgdGhlICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeV9iYXNlIDo6IFRoZSBmaXJzdCBieXRlIG9mIHRoZSBmaWxlIGluIG1lbW9yeS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5X3NpemUgOjogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGZpbGUgaW4gbWVtb3J5LiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYXRobmFtZSAgICA6OiBBIHBvaW50ZXIgdG8gYW4gOC1iaXQgZmlsZSBwYXRobmFtZS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICAgIDo6IEEgaGFuZGxlIHRvIGEgc291cmNlIHN0cmVhbSBvYmplY3QuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZHJpdmVyICAgICAgOjogVGhpcyBmaWVsZCBpcyBleGNsdXNpdmVseSB1c2VkIGJ5IEBGVF9PcGVuX0ZhY2U7ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGl0IHNpbXBseSBzcGVjaWZpZXMgdGhlIGZvbnQgZHJpdmVyIHRvIHVzZSB0byBvcGVuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICB0aGUgZmFjZS4gIElmIHNldCB0b34wLCBGcmVlVHlwZSB0cmllcyB0byBsb2FkIHRoZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZmFjZSB3aXRoIGVhY2ggb25lIG9mIHRoZSBkcml2ZXJzIGluIGl0cyBsaXN0LiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fcGFyYW1zICA6OiBUaGUgbnVtYmVyIG9mIGV4dHJhIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhcmFtcyAgICAgIDo6IEV4dHJhIHBhcmFtZXRlcnMgcGFzc2VkIHRvIHRoZSBmb250IGRyaXZlciB3aGVuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBvcGVuaW5nIGEgbmV3IGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgc3RyZWFtIHR5cGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY29udGVudHMgb2YgYGZsYWdzJyB0aGF0ICAgICAgKi8KLSAgLyogICAgYXJlIHRlc3RlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIGJ5IEBGVF9PcGVuX0ZhY2U6ICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB0aGUgQEZUX09QRU5fTUVNT1JZIGJpdCBpcyBzZXQsIGFzc3VtZSB0aGF0IHRoaXMgaXMgYSAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5IGZpbGUgb2YgYG1lbW9yeV9zaXplJyBieXRlcywgbG9jYXRlZCBhdCBgbWVtb3J5X2FkZHJlc3MnLiAgICovCi0gIC8qICAgIFRoZSBkYXRhIGFyZSBhcmUgbm90IGNvcGllZCwgYW5kIHRoZSBjbGllbnQgaXMgcmVzcG9uc2libGUgZm9yICAgICAqLwotICAvKiAgICByZWxlYXNpbmcgYW5kIGRlc3Ryb3lpbmcgdGhlbSBfYWZ0ZXJfIHRoZSBjb3JyZXNwb25kaW5nIGNhbGwgdG8gICAgKi8KLSAgLyogICAgQEZUX0RvbmVfRmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPdGhlcndpc2UsIGlmIHRoZSBARlRfT1BFTl9TVFJFQU0gYml0IGlzIHNldCwgYXNzdW1lIHRoYXQgYSAgICAgICAgKi8KLSAgLyogICAgY3VzdG9tIGlucHV0IHN0cmVhbSBgc3RyZWFtJyBpcyB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPdGhlcndpc2UsIGlmIHRoZSBARlRfT1BFTl9QQVRITkFNRSBiaXQgaXMgc2V0LCBhc3N1bWUgdGhhdCB0aGlzICAgKi8KLSAgLyogICAgaXMgYSBub3JtYWwgZmlsZSBhbmQgdXNlIGBwYXRobmFtZScgdG8gb3BlbiBpdC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB0aGUgQEZUX09QRU5fRFJJVkVSIGJpdCBpcyBzZXQsIEBGVF9PcGVuX0ZhY2Ugb25seSB0cmllcyB0byAgICAgKi8KLSAgLyogICAgb3BlbiB0aGUgZmlsZSB3aXRoIHRoZSBkcml2ZXIgd2hvc2UgaGFuZGxlciBpcyBpbiBgZHJpdmVyJy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB0aGUgQEZUX09QRU5fUEFSQU1TIGJpdCBpcyBzZXQsIHRoZSBwYXJhbWV0ZXJzIGdpdmVuIGJ5ICAgICAgICAgKi8KLSAgLyogICAgYG51bV9wYXJhbXMnIGFuZCBgcGFyYW1zJyBpcyB1c2VkLiAgVGhleSBhcmUgaWdub3JlZCBvdGhlcndpc2UuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZGVhbGx5LCBib3RoIHRoZSBgcGF0aG5hbWUnIGFuZCBgcGFyYW1zJyBmaWVsZHMgc2hvdWxkIGJlIHRhZ2dlZCAgKi8KLSAgLyogICAgYXMgYGNvbnN0JzsgdGhpcyBpcyBtaXNzaW5nIGZvciBBUEkgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICBJbiAgICovCi0gIC8qICAgIG90aGVyIHdvcmRzLCBhcHBsaWNhdGlvbnMgc2hvdWxkIHRyZWF0IHRoZW0gYXMgcmVhZC1vbmx5LiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX09wZW5fQXJnc18KLSAgewotICAgIEZUX1VJbnQgICAgICAgICBmbGFnczsKLSAgICBjb25zdCBGVF9CeXRlKiAgbWVtb3J5X2Jhc2U7Ci0gICAgRlRfTG9uZyAgICAgICAgIG1lbW9yeV9zaXplOwotICAgIEZUX1N0cmluZyogICAgICBwYXRobmFtZTsKLSAgICBGVF9TdHJlYW0gICAgICAgc3RyZWFtOwotICAgIEZUX01vZHVsZSAgICAgICBkcml2ZXI7Ci0gICAgRlRfSW50ICAgICAgICAgIG51bV9wYXJhbXM7Ci0gICAgRlRfUGFyYW1ldGVyKiAgIHBhcmFtczsKLQotICB9IEZUX09wZW5fQXJnczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX05ld19GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gY2FsbHMgQEZUX09wZW5fRmFjZSB0byBvcGVuIGEgZm9udCBieSBpdHMgcGF0aG5hbWUuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhdGhuYW1lICAgOjogQSBwYXRoIHRvIHRoZSBmb250IGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGZhY2Ugd2l0aGluIHRoZSBmb250LiAgVGhlIGZpcnN0ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZmFjZSBoYXMgaW5kZXh+MC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFmYWNlICAgICAgOjogQSBoYW5kbGUgdG8gYSBuZXcgZmFjZSBvYmplY3QuICBJZiBgZmFjZV9pbmRleCcgaXMgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB6ZXJvLCBpdCBtdXN0IGJlIG5vbi1OVUxMLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBTZWUgQEZUX09wZW5fRmFjZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlIEBGVF9Eb25lX0ZhY2UgdG8gZGVzdHJveSB0aGUgY3JlYXRlZCBARlRfRmFjZSBvYmplY3QgKGFsb25nICAgICovCi0gIC8qICAgIHdpdGggaXRzIHNsb3QgYW5kIHNpemVzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX05ld19GYWNlKCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBmaWxlcGF0aG5hbWUsCi0gICAgICAgICAgICAgICBGVF9Mb25nICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICphZmFjZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTmV3X01lbW9yeV9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBjYWxscyBARlRfT3Blbl9GYWNlIHRvIG9wZW4gYSBmb250IHRoYXQgaGFzIGJlZW4gICAgICovCi0gIC8qICAgIGxvYWRlZCBpbnRvIG1lbW9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZpbGVfYmFzZSAgOjogQSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZvbnQgZGF0YS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmlsZV9zaXplICA6OiBUaGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGNodW5rIHVzZWQgYnkgdGhlIGZvbnQgZGF0YS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgZmFjZSB3aXRoaW4gdGhlIGZvbnQuICBUaGUgZmlyc3QgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBmYWNlIGhhcyBpbmRleH4wLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWZhY2UgICAgICA6OiBBIGhhbmRsZSB0byBhIG5ldyBmYWNlIG9iamVjdC4gIElmIGBmYWNlX2luZGV4JyBpcyAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHplcm8sIGl0IG11c3QgYmUgbm9uLU5VTEwuICAqLwotICAvKiAgICAgICAgICAgICAgICAgIFNlZSBARlRfT3Blbl9GYWNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3UgbXVzdCBub3QgZGVhbGxvY2F0ZSB0aGUgbWVtb3J5IGJlZm9yZSBjYWxsaW5nIEBGVF9Eb25lX0ZhY2UuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9OZXdfTWVtb3J5X0ZhY2UoIEZUX0xpYnJhcnkgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICBmaWxlX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgIGZpbGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICAqYWZhY2UgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09wZW5fRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENyZWF0ZSBhIGZhY2Ugb2JqZWN0IGZyb20gYSBnaXZlbiByZXNvdXJjZSBkZXNjcmliZWQgYnkgICAgICAgICAgICAqLwotICAvKiAgICBARlRfT3Blbl9BcmdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5ICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhcmdzICAgICAgIDo6IEEgcG9pbnRlciB0byBhbiBgRlRfT3Blbl9BcmdzJyBzdHJ1Y3R1cmUgdGhhdCBtdXN0ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBiZSBmaWxsZWQgYnkgdGhlIGNhbGxlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgZmFjZSB3aXRoaW4gdGhlIGZvbnQuICBUaGUgZmlyc3QgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBmYWNlIGhhcyBpbmRleH4wLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWZhY2UgICAgICA6OiBBIGhhbmRsZSB0byBhIG5ldyBmYWNlIG9iamVjdC4gIElmIGBmYWNlX2luZGV4JyBpcyAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHplcm8sIGl0IG11c3QgYmUgbm9uLU5VTEwuICAqLwotICAvKiAgICAgICAgICAgICAgICAgIFNlZSBub3RlIGJlbG93LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVbmxpa2UgRnJlZVR5cGUgMS54LCB0aGlzIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBhIGdseXBoICAgKi8KLSAgLyogICAgc2xvdCBmb3IgdGhlIGZhY2Ugb2JqZWN0IHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IHRocm91Z2ggICAgICovCi0gIC8qICAgIGBmYWNlLT5nbHlwaCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3Blbl9GYWNlIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgY2hlY2sgd2hldGhlciB0aGUgZm9udCAgICAgICAgICovCi0gIC8qICAgIGZvcm1hdCBvZiBhIGdpdmVuIGZvbnQgcmVzb3VyY2UgaXMgc3VwcG9ydGVkIGJ5IEZyZWVUeXBlLiAgSWYgdGhlICAqLwotICAvKiAgICBgZmFjZV9pbmRleCcgZmllbGQgaXMgbmVnYXRpdmUsIHRoZSBmdW5jdGlvbidzIHJldHVybiB2YWx1ZSBpc34wICAgKi8KLSAgLyogICAgaWYgdGhlIGZvbnQgZm9ybWF0IGlzIHJlY29nbml6ZWQsIG9yIG5vbi16ZXJvIG90aGVyd2lzZTsgICAgICAgICAgICovCi0gIC8qICAgIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgbW9yZSBvciBsZXNzIGVtcHR5IGZhY2UgaGFuZGxlIGluIGAqYWZhY2UnICAqLwotICAvKiAgICAoaWYgYGFmYWNlJyBpc24ndCBOVUxMKS4gIFRoZSBvbmx5IHVzZWZ1bCBmaWVsZCBpbiB0aGlzIHNwZWNpYWwgICAgKi8KLSAgLyogICAgY2FzZSBpcyBgZmFjZS0+bnVtX2ZhY2VzJyB0aGF0IGdpdmVzIHRoZSBudW1iZXIgb2YgZmFjZXMgd2l0aGluICAgICovCi0gIC8qICAgIHRoZSBmb250IGZpbGUuICBBZnRlciBleGFtaW5hdGlvbiwgdGhlIHJldHVybmVkIEBGVF9GYWNlIHN0cnVjdHVyZSAqLwotICAvKiAgICBzaG91bGQgYmUgZGVhbGxvY2F0ZWQgd2l0aCBhIGNhbGwgdG8gQEZUX0RvbmVfRmFjZS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEVhY2ggbmV3IGZhY2Ugb2JqZWN0IGNyZWF0ZWQgd2l0aCB0aGlzIGZ1bmN0aW9uIGFsc28gb3ducyBhICAgICAgICAqLwotICAvKiAgICBkZWZhdWx0IEBGVF9TaXplIG9iamVjdCwgYWNjZXNzaWJsZSBhcyBgZmFjZS0+c2l6ZScuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9uZSBARlRfTGlicmFyeSBpbnN0YW5jZSBjYW4gaGF2ZSBtdWx0aXBsZSBmYWNlIG9iamVjdHMsIHRoaXMgaXMsICAqLwotICAvKiAgICBARlRfT3Blbl9GYWNlIGFuZCBpdHMgc2libGluZ3MgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB1c2luZyAgKi8KLSAgLyogICAgdGhlIHNhbWUgYGxpYnJhcnknIGFyZ3VtZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWUgdGhlIGRpc2N1c3Npb24gb2YgcmVmZXJlbmNlIGNvdW50ZXJzIGluIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgKi8KLSAgLyogICAgQEZUX1JlZmVyZW5jZV9GYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfT3Blbl9GYWNlKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgIGNvbnN0IEZUX09wZW5fQXJncyogIGFyZ3MsCi0gICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICAgICAgICphZmFjZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQXR0YWNoX0ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBjYWxscyBARlRfQXR0YWNoX1N0cmVhbSB0byBhdHRhY2ggYSBmaWxlLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgIDo6IFRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmlsZXBhdGhuYW1lIDo6IFRoZSBwYXRobmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfQXR0YWNoX0ZpbGUoIEZUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIGZpbGVwYXRobmFtZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQXR0YWNoX1N0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYEF0dGFjaCcgZGF0YSB0byBhIGZhY2Ugb2JqZWN0LiAgTm9ybWFsbHksIHRoaXMgaXMgdXNlZCB0byByZWFkICAgICovCi0gIC8qICAgIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBmYWNlIG9iamVjdC4gIEZvciBleGFtcGxlLCB5b3UgY2FuICAqLwotICAvKiAgICBhdHRhY2ggYW4gQUZNIGZpbGUgdGhhdCBjb21lcyB3aXRoIGEgVHlwZX4xIGZvbnQgdG8gZ2V0IHRoZSAgICAgICAgKi8KLSAgLyogICAga2VybmluZyB2YWx1ZXMgYW5kIG90aGVyIG1ldHJpY3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICA6OiBUaGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGFyYW1ldGVycyA6OiBBIHBvaW50ZXIgdG8gQEZUX09wZW5fQXJncyB0aGF0IG11c3QgYmUgZmlsbGVkIGJ5ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgdGhlIGNhbGxlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBtZWFuaW5nIG9mIHRoZSBgYXR0YWNoJyAoaS5lLiwgd2hhdCByZWFsbHkgaGFwcGVucyB3aGVuIHRoZSAgICAqLwotICAvKiAgICBuZXcgZmlsZSBpcyByZWFkKSBpcyBub3QgZml4ZWQgYnkgRnJlZVR5cGUgaXRzZWxmLiAgSXQgcmVhbGx5ICAgICAgKi8KLSAgLyogICAgZGVwZW5kcyBvbiB0aGUgZm9udCBmb3JtYXQgKGFuZCB0aHVzIHRoZSBmb250IGRyaXZlcikuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDbGllbnQgYXBwbGljYXRpb25zIGFyZSBleHBlY3RlZCB0byBrbm93IHdoYXQgdGhleSBhcmUgZG9pbmcgICAgICAgKi8KLSAgLyogICAgd2hlbiBpbnZva2luZyB0aGlzIGZ1bmN0aW9uLiAgTW9zdCBkcml2ZXJzIHNpbXBseSBkbyBub3QgaW1wbGVtZW50ICovCi0gIC8qICAgIGZpbGUgYXR0YWNobWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0F0dGFjaF9TdHJlYW0oIEZUX0ZhY2UgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX09wZW5fQXJncyogIHBhcmFtZXRlcnMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlZmVyZW5jZV9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgY291bnRlciBnZXRzIGluaXRpYWxpemVkIHRvfjEgYXQgdGhlIHRpbWUgYW4gQEZUX0ZhY2Ugc3RydWN0dXJlICAqLwotICAvKiAgICBpcyBjcmVhdGVkLiAgVGhpcyBmdW5jdGlvbiBpbmNyZW1lbnRzIHRoZSBjb3VudGVyLiAgQEZUX0RvbmVfRmFjZSAgKi8KLSAgLyogICAgdGhlbiBvbmx5IGRlc3Ryb3lzIGEgZmFjZSBpZiB0aGUgY291bnRlciBpc34xLCBvdGhlcndpc2UgaXQgc2ltcGx5ICovCi0gIC8qICAgIGRlY3JlbWVudHMgdGhlIGNvdW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBoZWxwcyBpbiBtYW5hZ2luZyBsaWZlLWN5Y2xlcyBvZiBzdHJ1Y3R1cmVzIHRoYXQgICAgICovCi0gIC8qICAgIHJlZmVyZW5jZSBARlRfRmFjZSBvYmplY3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gYSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNpbmNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIDIuNC4yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1JlZmVyZW5jZV9GYWNlKCBGVF9GYWNlICBmYWNlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Eb25lX0ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEaXNjYXJkIGEgZ2l2ZW4gZmFjZSBvYmplY3QsIGFzIHdlbGwgYXMgYWxsIG9mIGl0cyBjaGlsZCBzbG90cyBhbmQgKi8KLSAgLyogICAgc2l6ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VlIHRoZSBkaXNjdXNzaW9uIG9mIHJlZmVyZW5jZSBjb3VudGVycyBpbiB0aGUgZGVzY3JpcHRpb24gb2YgICAgICovCi0gIC8qICAgIEBGVF9SZWZlcmVuY2VfRmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0RvbmVfRmFjZSggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2VsZWN0X1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VsZWN0IGEgYml0bWFwIHN0cmlrZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgIDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyaWtlX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgYml0bWFwIHN0cmlrZSBpbiB0aGUgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBgYXZhaWxhYmxlX3NpemVzJyBmaWVsZCBvZiBARlRfRmFjZVJlYyBzdHJ1Y3R1cmUuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1NlbGVjdF9TaXplKCBGVF9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfSW50ICAgc3RyaWtlX2luZGV4ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaXplX1JlcXVlc3RfVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBlbnVtZXJhdGlvbiB0eXBlIHRoYXQgbGlzdHMgdGhlIHN1cHBvcnRlZCBzaXplIHJlcXVlc3QgdHlwZXMuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TSVpFX1JFUVVFU1RfVFlQRV9OT01JTkFMIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgbm9taW5hbCBzaXplLiAgVGhlIGB1bml0c19wZXJfRU0nIGZpZWxkIG9mIEBGVF9GYWNlUmVjIGlzICAgICovCi0gIC8qICAgICAgdXNlZCB0byBkZXRlcm1pbmUgYm90aCBzY2FsaW5nIHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU0laRV9SRVFVRVNUX1RZUEVfUkVBTF9ESU0gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIHJlYWwgZGltZW5zaW9uLiAgVGhlIHN1bSBvZiB0aGUgdGhlIGBhc2NlbmRlcicgYW5kIChtaW51cyAgICAqLwotICAvKiAgICAgIG9mKSB0aGUgYGRlc2NlbmRlcicgZmllbGRzIG9mIEBGVF9GYWNlUmVjIGFyZSB1c2VkIHRvIGRldGVybWluZSAgKi8KLSAgLyogICAgICBib3RoIHNjYWxpbmcgdmFsdWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TSVpFX1JFUVVFU1RfVFlQRV9CQk9YIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZm9udCBib3VuZGluZyBib3guICBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgYGJib3gnIGZpZWxkICovCi0gIC8qICAgICAgb2YgQEZUX0ZhY2VSZWMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCAqLwotICAvKiAgICAgIHNjYWxpbmcgdmFsdWUsIHJlc3BlY3RpdmVseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NJWkVfUkVRVUVTVF9UWVBFX0NFTEwgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBgbWF4X2FkdmFuY2Vfd2lkdGgnIGZpZWxkIG9mIEBGVF9GYWNlUmVjIGlzIHVzZWQgdG8gICAgICAgICAgKi8KLSAgLyogICAgICBkZXRlcm1pbmUgdGhlIGhvcml6b250YWwgc2NhbGluZyB2YWx1ZTsgdGhlIHZlcnRpY2FsIHNjYWxpbmcgICAgICovCi0gIC8qICAgICAgdmFsdWUgaXMgZGV0ZXJtaW5lZCB0aGUgc2FtZSB3YXkgYXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEBGVF9TSVpFX1JFUVVFU1RfVFlQRV9SRUFMX0RJTSBkb2VzLiAgRmluYWxseSwgYm90aCBzY2FsaW5nICAgICAgKi8KLSAgLyogICAgICB2YWx1ZXMgYXJlIHNldCB0byB0aGUgc21hbGxlciBvbmUuICBUaGlzIHR5cGUgaXMgdXNlZnVsIGlmIHlvdSAgICovCi0gIC8qICAgICAgd2FudCB0byBzcGVjaWZ5IHRoZSBmb250IHNpemUgZm9yLCBzYXksIGEgd2luZG93IG9mIGEgZ2l2ZW4gICAgICAqLwotICAvKiAgICAgIGRpbWVuc2lvbiBhbmQgODB4MjQgY2VsbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NJWkVfUkVRVUVTVF9UWVBFX1NDQUxFUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFNwZWNpZnkgdGhlIHNjYWxpbmcgdmFsdWVzIGRpcmVjdGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYWJvdmUgZGVzY3JpcHRpb25zIG9ubHkgYXBwbHkgdG8gc2NhbGFibGUgZm9ybWF0cy4gIEZvciBiaXRtYXAgKi8KLSAgLyogICAgZm9ybWF0cywgdGhlIGJlaGF2aW91ciBpcyB1cCB0byB0aGUgZHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWUgdGhlIG5vdGUgc2VjdGlvbiBvZiBARlRfU2l6ZV9NZXRyaWNzIGlmIHlvdSB3b25kZXIgaG93IHNpemUgICAgKi8KLSAgLyogICAgcmVxdWVzdGluZyByZWxhdGVzIHRvIHNjYWxpbmcgdmFsdWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGVudW0gIEZUX1NpemVfUmVxdWVzdF9UeXBlXwotICB7Ci0gICAgRlRfU0laRV9SRVFVRVNUX1RZUEVfTk9NSU5BTCwKLSAgICBGVF9TSVpFX1JFUVVFU1RfVFlQRV9SRUFMX0RJTSwKLSAgICBGVF9TSVpFX1JFUVVFU1RfVFlQRV9CQk9YLAotICAgIEZUX1NJWkVfUkVRVUVTVF9UWVBFX0NFTEwsCi0gICAgRlRfU0laRV9SRVFVRVNUX1RZUEVfU0NBTEVTLAotCi0gICAgRlRfU0laRV9SRVFVRVNUX1RZUEVfTUFYCi0KLSAgfSBGVF9TaXplX1JlcXVlc3RfVHlwZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NpemVfUmVxdWVzdFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBzaXplIHJlcXVlc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR5cGUgICAgICAgICAgIDo6IFNlZSBARlRfU2l6ZV9SZXF1ZXN0X1R5cGUuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2lkdGggICAgICAgICAgOjogVGhlIGRlc2lyZWQgd2lkdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZWlnaHQgICAgICAgICA6OiBUaGUgZGVzaXJlZCBoZWlnaHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhvcmlSZXNvbHV0aW9uIDo6IFRoZSBob3Jpem9udGFsIHJlc29sdXRpb24uICBJZiBzZXQgdG8gemVybywgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICBgd2lkdGgnIGlzIHRyZWF0ZWQgYXMgYSAyNi42IGZyYWN0aW9uYWwgcGl4ZWwgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJ0UmVzb2x1dGlvbiA6OiBUaGUgdmVydGljYWwgcmVzb2x1dGlvbi4gIElmIHNldCB0byB6ZXJvLCAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgYGhlaWdodCcgaXMgdHJlYXRlZCBhcyBhIDI2LjYgZnJhY3Rpb25hbCBwaXhlbCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGB3aWR0aCcgaXMgemVybywgdGhlbiB0aGUgaG9yaXpvbnRhbCBzY2FsaW5nIHZhbHVlIGlzIHNldCBlcXVhbCAqLwotICAvKiAgICB0byB0aGUgdmVydGljYWwgc2NhbGluZyB2YWx1ZSwgYW5kIHZpY2UgdmVyc2EuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9TaXplX1JlcXVlc3RSZWNfCi0gIHsKLSAgICBGVF9TaXplX1JlcXVlc3RfVHlwZSAgdHlwZTsKLSAgICBGVF9Mb25nICAgICAgICAgICAgICAgd2lkdGg7Ci0gICAgRlRfTG9uZyAgICAgICAgICAgICAgIGhlaWdodDsKLSAgICBGVF9VSW50ICAgICAgICAgICAgICAgaG9yaVJlc29sdXRpb247Ci0gICAgRlRfVUludCAgICAgICAgICAgICAgIHZlcnRSZXNvbHV0aW9uOwotCi0gIH0gRlRfU2l6ZV9SZXF1ZXN0UmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZV9SZXF1ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBzaXplIHJlcXVlc3Qgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9TaXplX1JlcXVlc3RSZWNfICAqRlRfU2l6ZV9SZXF1ZXN0OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmVxdWVzdF9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVzaXplIHRoZSBzY2FsZSBvZiB0aGUgYWN0aXZlIEBGVF9TaXplIG9iamVjdCBpbiBhIGZhY2UuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVxICA6OiBBIHBvaW50ZXIgdG8gYSBARlRfU2l6ZV9SZXF1ZXN0UmVjLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQWx0aG91Z2ggZHJpdmVycyBtYXkgc2VsZWN0IHRoZSBiaXRtYXAgc3RyaWtlIG1hdGNoaW5nIHRoZSAgICAgICAgICovCi0gIC8qICAgIHJlcXVlc3QsIHlvdSBzaG91bGQgbm90IHJlbHkgb24gdGhpcyBpZiB5b3UgaW50ZW5kIHRvIHNlbGVjdCBhICAgICAqLwotICAvKiAgICBwYXJ0aWN1bGFyIGJpdG1hcCBzdHJpa2UuICBVc2UgQEZUX1NlbGVjdF9TaXplIGluc3RlYWQgaW4gdGhhdCAgICAgKi8KLSAgLyogICAgY2FzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmVsYXRpb24gYmV0d2VlbiB0aGUgcmVxdWVzdGVkIHNpemUgYW5kIHRoZSByZXN1bHRpbmcgZ2x5cGggICAgKi8KLSAgLyogICAgc2l6ZSBpcyBkZXBlbmRlbnQgZW50aXJlbHkgb24gaG93IHRoZSBzaXplIGlzIGRlZmluZWQgaW4gdGhlICAgICAgICovCi0gIC8qICAgIHNvdXJjZSBmYWNlLiAgVGhlIGZvbnQgZGVzaWduZXIgY2hvb3NlcyB0aGUgZmluYWwgc2l6ZSBvZiBlYWNoICAgICAqLwotICAvKiAgICBnbHlwaCByZWxhdGl2ZSB0byB0aGlzIHNpemUuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWZlciB0byAgICAgICAgKi8KLSAgLyogICAgYGh0dHA6Ly93d3cuZnJlZXR5cGUub3JnL2ZyZWV0eXBlMi9kb2NzL2dseXBocy9nbHlwaHMtMi5odG1sJyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEb24ndCB1c2UgdGhpcyBmdW5jdGlvbiBpZiB5b3UgYXJlIHVzaW5nIHRoZSBGcmVlVHlwZSBjYWNoZSBBUEkuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9SZXF1ZXN0X1NpemUoIEZUX0ZhY2UgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICBGVF9TaXplX1JlcXVlc3QgIHJlcSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X0NoYXJfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBjYWxscyBARlRfUmVxdWVzdF9TaXplIHRvIHJlcXVlc3QgdGhlIG5vbWluYWwgc2l6ZSAgICovCi0gIC8qICAgIChpbiBwb2ludHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgICAgICA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJfd2lkdGggICAgICA6OiBUaGUgbm9taW5hbCB3aWR0aCwgaW4gMjYuNiBmcmFjdGlvbmFsIHBvaW50cy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcl9oZWlnaHQgICAgIDo6IFRoZSBub21pbmFsIGhlaWdodCwgaW4gMjYuNiBmcmFjdGlvbmFsIHBvaW50cy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBob3J6X3Jlc29sdXRpb24gOjogVGhlIGhvcml6b250YWwgcmVzb2x1dGlvbiBpbiBkcGkuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnRfcmVzb2x1dGlvbiA6OiBUaGUgdmVydGljYWwgcmVzb2x1dGlvbiBpbiBkcGkuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGVpdGhlciB0aGUgY2hhcmFjdGVyIHdpZHRoIG9yIGhlaWdodCBpcyB6ZXJvLCBpdCBpcyBzZXQgZXF1YWwgICAqLwotICAvKiAgICB0byB0aGUgb3RoZXIgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGVpdGhlciB0aGUgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCByZXNvbHV0aW9uIGlzIHplcm8sIGl0IGlzIHNldCAqLwotICAvKiAgICBlcXVhbCB0byB0aGUgb3RoZXIgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgY2hhcmFjdGVyIHdpZHRoIG9yIGhlaWdodCBzbWFsbGVyIHRoYW4gMXB0IGlzIHNldCB0byAxcHQ7IGlmICAgICAqLwotICAvKiAgICBib3RoIHJlc29sdXRpb24gdmFsdWVzIGFyZSB6ZXJvLCB0aGV5IGFyZSBzZXQgdG8gNzJkcGkuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERvbid0IHVzZSB0aGlzIGZ1bmN0aW9uIGlmIHlvdSBhcmUgdXNpbmcgdGhlIEZyZWVUeXBlIGNhY2hlIEFQSS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1NldF9DaGFyX1NpemUoIEZUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIGNoYXJfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIGNoYXJfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBob3J6X3Jlc29sdXRpb24sCi0gICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHZlcnRfcmVzb2x1dGlvbiApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X1BpeGVsX1NpemVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBjYWxscyBARlRfUmVxdWVzdF9TaXplIHRvIHJlcXVlc3QgdGhlIG5vbWluYWwgc2l6ZSAgICovCi0gIC8qICAgIChpbiBwaXhlbHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBpeGVsX3dpZHRoICA6OiBUaGUgbm9taW5hbCB3aWR0aCwgaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGl4ZWxfaGVpZ2h0IDo6IFRoZSBub21pbmFsIGhlaWdodCwgaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgWW91IHNob3VsZCBub3QgcmVseSBvbiB0aGUgcmVzdWx0aW5nIGdseXBocyBtYXRjaGluZywgb3IgYmVpbmcgICAgICovCi0gIC8qICAgIGNvbnN0cmFpbmVkLCB0byB0aGlzIHBpeGVsIHNpemUuICBSZWZlciB0byBARlRfUmVxdWVzdF9TaXplIHRvICAgICAqLwotICAvKiAgICB1bmRlcnN0YW5kIGhvdyByZXF1ZXN0ZWQgc2l6ZXMgcmVsYXRlIHRvIGFjdHVhbCBzaXplcy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERvbid0IHVzZSB0aGlzIGZ1bmN0aW9uIGlmIHlvdSBhcmUgdXNpbmcgdGhlIEZyZWVUeXBlIGNhY2hlIEFQSS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1NldF9QaXhlbF9TaXplcyggRlRfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBwaXhlbF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBwaXhlbF9oZWlnaHQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xvYWRfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBsb2FkIGEgc2luZ2xlIGdseXBoIGludG8gdGhlIGdseXBoIHNsb3Qgb2YgYSAgICAqLwotICAvKiAgICBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0IHdoZXJlIHRoZSBnbHlwaCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgaXMgbG9hZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfaW5kZXggOjogVGhlIGluZGV4IG9mIHRoZSBnbHlwaCBpbiB0aGUgZm9udCBmaWxlLiAgRm9yICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIENJRC1rZXllZCBmb250cyAoZWl0aGVyIGluIFBTIG9yIGluIENGRiBmb3JtYXQpICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICB0aGlzIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgQ0lEIHZhbHVlLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfZmxhZ3MgIDo6IEEgZmxhZyBpbmRpY2F0aW5nIHdoYXQgdG8gbG9hZCBmb3IgdGhpcyBnbHlwaC4gIFRoZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICBARlRfTE9BRF9YWFggY29uc3RhbnRzIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZ2x5cGggbG9hZGluZyBwcm9jZXNzIChlLmcuLCB3aGV0aGVyIHRoZSBvdXRsaW5lICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBzY2FsZWQsIHdoZXRoZXIgdG8gbG9hZCBiaXRtYXBzIG9yIG5vdCwgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRvIGhpbnQgdGhlIG91dGxpbmUsIGV0YykuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbG9hZGVkIGdseXBoIG1heSBiZSB0cmFuc2Zvcm1lZC4gIFNlZSBARlRfU2V0X1RyYW5zZm9ybSBmb3IgICAgKi8KLSAgLyogICAgdGhlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGb3Igc3Vic2V0dGVkIENJRC1rZXllZCBmb250cywgYEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50JyBpcyAgICAgICAgKi8KLSAgLyogICAgcmV0dXJuZWQgZm9yIGludmFsaWQgQ0lEIHZhbHVlcyAodGhpcyBpcywgZm9yIENJRCB2YWx1ZXMgdGhhdCAgICAgICovCi0gIC8qICAgIGRvbid0IGhhdmUgYSBjb3JyZXNwb25kaW5nIGdseXBoIGluIHRoZSBmb250KS4gIFNlZSB0aGUgZGlzY3Vzc2lvbiAqLwotICAvKiAgICBvZiB0aGUgQEZUX0ZBQ0VfRkxBR19DSURfS0VZRUQgZmxhZyBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9Mb2FkX0dseXBoKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgRlRfVUludCAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgbG9hZF9mbGFncyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTG9hZF9DaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBmdW5jdGlvbiB1c2VkIHRvIGxvYWQgYSBzaW5nbGUgZ2x5cGggaW50byB0aGUgZ2x5cGggc2xvdCBvZiBhICAgICovCi0gIC8qICAgIGZhY2Ugb2JqZWN0LCBhY2NvcmRpbmcgdG8gaXRzIGNoYXJhY3RlciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgIDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IGZhY2Ugb2JqZWN0IHdoZXJlIHRoZSBnbHlwaCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBpcyBsb2FkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyX2NvZGUgICA6OiBUaGUgZ2x5cGgncyBjaGFyYWN0ZXIgY29kZSwgYWNjb3JkaW5nIHRvIHRoZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgY3VycmVudCBjaGFybWFwIHVzZWQgaW4gdGhlIGZhY2UuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkX2ZsYWdzICA6OiBBIGZsYWcgaW5kaWNhdGluZyB3aGF0IHRvIGxvYWQgZm9yIHRoaXMgZ2x5cGguICBUaGUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgQEZUX0xPQURfWFhYIGNvbnN0YW50cyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGdseXBoIGxvYWRpbmcgcHJvY2VzcyAoZS5nLiwgd2hldGhlciB0aGUgb3V0bGluZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgc2NhbGVkLCB3aGV0aGVyIHRvIGxvYWQgYml0bWFwcyBvciBub3QsICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgd2hldGhlciB0byBoaW50IHRoZSBvdXRsaW5lLCBldGMpLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBzaW1wbHkgY2FsbHMgQEZUX0dldF9DaGFyX0luZGV4IGFuZCBARlRfTG9hZF9HbHlwaC4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfTG9hZF9DaGFyKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICBGVF9VTG9uZyAgY2hhcl9jb2RlLAotICAgICAgICAgICAgICAgIEZUX0ludDMyICBsb2FkX2ZsYWdzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZW51bToKLSAgICogICBGVF9MT0FEX1hYWAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBsaXN0IG9mIGJpdC1maWVsZCBjb25zdGFudHMgdXNlZCB3aXRoIEBGVF9Mb2FkX0dseXBoIHRvIGluZGljYXRlCi0gICAqICAgd2hhdCBraW5kIG9mIG9wZXJhdGlvbnMgdG8gcGVyZm9ybSBkdXJpbmcgZ2x5cGggbG9hZGluZy4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBGVF9MT0FEX0RFRkFVTFQgOjoKLSAgICogICAgIENvcnJlc3BvbmRpbmcgdG9+MCwgdGhpcyB2YWx1ZSBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0IGdseXBoIGxvYWQKLSAgICogICAgIG9wZXJhdGlvbi4gIEluIHRoaXMgY2FzZSwgdGhlIGZvbGxvd2luZyBoYXBwZW5zOgotICAgKgotICAgKiAgICAgMS4gRnJlZVR5cGUgbG9va3MgZm9yIGEgYml0bWFwIGZvciB0aGUgZ2x5cGggY29ycmVzcG9uZGluZyB0byB0aGUKLSAgICogICAgICAgIGZhY2UncyBjdXJyZW50IHNpemUuICBJZiBvbmUgaXMgZm91bmQsIHRoZSBmdW5jdGlvbiByZXR1cm5zLgotICAgKiAgICAgICAgVGhlIGJpdG1hcCBkYXRhIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBnbHlwaCBzbG90IChzZWUgbm90ZQotICAgKiAgICAgICAgYmVsb3cpLgotICAgKgotICAgKiAgICAgMi4gSWYgbm8gZW1iZWRkZWQgYml0bWFwIGlzIHNlYXJjaGVkIG9yIGZvdW5kLCBGcmVlVHlwZSBsb29rcyBmb3IgYQotICAgKiAgICAgICAgc2NhbGFibGUgb3V0bGluZS4gIElmIG9uZSBpcyBmb3VuZCwgaXQgaXMgbG9hZGVkIGZyb20gdGhlIGZvbnQKLSAgICogICAgICAgIGZpbGUsIHNjYWxlZCB0byBkZXZpY2UgcGl4ZWxzLCB0aGVuIGBoaW50ZWQnIHRvIHRoZSBwaXhlbCBncmlkCi0gICAqICAgICAgICBpbiBvcmRlciB0byBvcHRpbWl6ZSBpdC4gIFRoZSBvdXRsaW5lIGRhdGEgY2FuIGJlIGFjY2Vzc2VkIGZyb20KLSAgICogICAgICAgIHRoZSBnbHlwaCBzbG90IChzZWUgbm90ZSBiZWxvdykuCi0gICAqCi0gICAqICAgICBOb3RlIHRoYXQgYnkgZGVmYXVsdCwgdGhlIGdseXBoIGxvYWRlciBkb2Vzbid0IHJlbmRlciBvdXRsaW5lcyBpbnRvCi0gICAqICAgICBiaXRtYXBzLiAgVGhlIGZvbGxvd2luZyBmbGFncyBhcmUgdXNlZCB0byBtb2RpZnkgdGhpcyBkZWZhdWx0Ci0gICAqICAgICBiZWhhdmlvdXIgdG8gbW9yZSBzcGVjaWZpYyBhbmQgdXNlZnVsIGNhc2VzLgotICAgKgotICAgKiAgIEZUX0xPQURfTk9fU0NBTEUgOjoKLSAgICogICAgIERvbid0IHNjYWxlIHRoZSBsb2FkZWQgb3V0bGluZSBnbHlwaCBidXQga2VlcCBpdCBpbiBmb250IHVuaXRzLgotICAgKgotICAgKiAgICAgVGhpcyBmbGFnIGltcGxpZXMgQEZUX0xPQURfTk9fSElOVElORyBhbmQgQEZUX0xPQURfTk9fQklUTUFQLCBhbmQKLSAgICogICAgIHVuc2V0cyBARlRfTE9BRF9SRU5ERVIuCi0gICAqCi0gICAqICAgICBJZiB0aGUgZm9udCBpcyBgdHJpY2t5JyAoc2VlIEBGVF9GQUNFX0ZMQUdfVFJJQ0tZIGZvciBtb3JlKSwgdXNpbmcKLSAgICogICAgIEZUX0xPQURfTk9fU0NBTEUgdXN1YWxseSB5aWVsZHMgbWVhbmluZ2xlc3Mgb3V0bGluZXMgYmVjYXVzZSB0aGUKLSAgICogICAgIHN1YmdseXBocyBtdXN0IGJlIHNjYWxlZCBhbmQgcG9zaXRpb25lZCB3aXRoIGhpbnRpbmcgaW5zdHJ1Y3Rpb25zLgotICAgKiAgICAgVGhpcyBjYW4gYmUgc29sdmVkIGJ5IGxvYWRpbmcgdGhlIGZvbnQgd2l0aG91dCBGVF9MT0FEX05PX1NDQUxFIGFuZAotICAgKiAgICAgc2V0dGluZyB0aGUgY2hhcmFjdGVyIHNpemUgdG8gYGZvbnQtPnVuaXRzX3Blcl9FTScuCi0gICAqCi0gICAqICAgRlRfTE9BRF9OT19ISU5USU5HIDo6Ci0gICAqICAgICBEaXNhYmxlIGhpbnRpbmcuICBUaGlzIGdlbmVyYWxseSBnZW5lcmF0ZXMgYGJsdXJyaWVyJyBiaXRtYXAgZ2x5cGhzCi0gICAqICAgICB3aGVuIHRoZSBnbHlwaCBhcmUgcmVuZGVyZWQgaW4gYW55IG9mIHRoZSBhbnRpLWFsaWFzZWQgbW9kZXMuICBTZWUKLSAgICogICAgIGFsc28gdGhlIG5vdGUgYmVsb3cuCi0gICAqCi0gICAqICAgICBUaGlzIGZsYWcgaXMgaW1wbGllZCBieSBARlRfTE9BRF9OT19TQ0FMRS4KLSAgICoKLSAgICogICBGVF9MT0FEX1JFTkRFUiA6OgotICAgKiAgICAgQ2FsbCBARlRfUmVuZGVyX0dseXBoIGFmdGVyIHRoZSBnbHlwaCBpcyBsb2FkZWQuICBCeSBkZWZhdWx0LCB0aGUKLSAgICogICAgIGdseXBoIGlzIHJlbmRlcmVkIGluIEBGVF9SRU5ERVJfTU9ERV9OT1JNQUwgbW9kZS4gIFRoaXMgY2FuIGJlCi0gICAqICAgICBvdmVycmlkZGVuIGJ5IEBGVF9MT0FEX1RBUkdFVF9YWFggb3IgQEZUX0xPQURfTU9OT0NIUk9NRS4KLSAgICoKLSAgICogICAgIFRoaXMgZmxhZyBpcyB1bnNldCBieSBARlRfTE9BRF9OT19TQ0FMRS4KLSAgICoKLSAgICogICBGVF9MT0FEX05PX0JJVE1BUCA6OgotICAgKiAgICAgSWdub3JlIGJpdG1hcCBzdHJpa2VzIHdoZW4gbG9hZGluZy4gIEJpdG1hcC1vbmx5IGZvbnRzIGlnbm9yZSB0aGlzCi0gICAqICAgICBmbGFnLgotICAgKgotICAgKiAgICAgQEZUX0xPQURfTk9fU0NBTEUgYWx3YXlzIHNldHMgdGhpcyBmbGFnLgotICAgKgotICAgKiAgIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUIDo6Ci0gICAqICAgICBMb2FkIHRoZSBnbHlwaCBmb3IgdmVydGljYWwgdGV4dCBsYXlvdXQuICBJbiBwYXJ0aWN1bGFyLCB0aGUKLSAgICogICAgIGBhZHZhbmNlJyB2YWx1ZSBpbiB0aGUgQEZUX0dseXBoU2xvdFJlYyBzdHJ1Y3R1cmUgaXMgc2V0IHRvIHRoZQotICAgKiAgICAgYHZlcnRBZHZhbmNlJyB2YWx1ZSBvZiB0aGUgYG1ldHJpY3MnIGZpZWxkLgotICAgKgotICAgKiAgICAgSW4gY2FzZSBARlRfSEFTX1ZFUlRJQ0FMIGRvZXNuJ3QgcmV0dXJuIHRydWUsIHlvdSBzaG91bGRuJ3QgdXNlCi0gICAqICAgICB0aGlzIGZsYWcgY3VycmVudGx5LiAgUmVhc29uIGlzIHRoYXQgaW4gdGhpcyBjYXNlIHZlcnRpY2FsIG1ldHJpY3MKLSAgICogICAgIGdldCBzeW50aGVzaXplZCwgYW5kIHRob3NlIHZhbHVlcyBhcmUgbm90IGFsd2F5cyBjb25zaXN0ZW50IGFjcm9zcwotICAgKiAgICAgdmFyaW91cyBmb250IGZvcm1hdHMuCi0gICAqCi0gICAqICAgRlRfTE9BRF9GT1JDRV9BVVRPSElOVCA6OgotICAgKiAgICAgSW5kaWNhdGVzIHRoYXQgdGhlIGF1dG8taGludGVyIGlzIHByZWZlcnJlZCBvdmVyIHRoZSBmb250J3MgbmF0aXZlCi0gICAqICAgICBoaW50ZXIuICBTZWUgYWxzbyB0aGUgbm90ZSBiZWxvdy4KLSAgICoKLSAgICogICBGVF9MT0FEX1BFREFOVElDIDo6Ci0gICAqICAgICBJbmRpY2F0ZXMgdGhhdCB0aGUgZm9udCBkcml2ZXIgc2hvdWxkIHBlcmZvcm0gcGVkYW50aWMgdmVyaWZpY2F0aW9ucwotICAgKiAgICAgZHVyaW5nIGdseXBoIGxvYWRpbmcuICBUaGlzIGlzIG1vc3RseSB1c2VkIHRvIGRldGVjdCBicm9rZW4gZ2x5cGhzCi0gICAqICAgICBpbiBmb250cy4gIEJ5IGRlZmF1bHQsIEZyZWVUeXBlIHRyaWVzIHRvIGhhbmRsZSBicm9rZW4gZm9udHMgYWxzby4KLSAgICoKLSAgICogICAgIEluIHBhcnRpY3VsYXIsIGVycm9ycyBmcm9tIHRoZSBUcnVlVHlwZSBieXRlY29kZSBlbmdpbmUgYXJlIG5vdAotICAgKiAgICAgcGFzc2VkIHRvIHRoZSBhcHBsaWNhdGlvbiBpZiB0aGlzIGZsYWcgaXMgbm90IHNldDsgdGhpcyBtaWdodAotICAgKiAgICAgcmVzdWx0IGluIHBhcnRpYWxseSBoaW50ZWQgb3IgZGlzdG9ydGVkIGdseXBocyBpbiBjYXNlIGEgZ2x5cGgncwotICAgKiAgICAgYnl0ZWNvZGUgaXMgYnVnZ3kuCi0gICAqCi0gICAqICAgRlRfTE9BRF9OT19SRUNVUlNFIDo6Ci0gICAqICAgICBJbmRpY2F0ZSB0aGF0IHRoZSBmb250IGRyaXZlciBzaG91bGQgbm90IGxvYWQgY29tcG9zaXRlIGdseXBocwotICAgKiAgICAgcmVjdXJzaXZlbHkuICBJbnN0ZWFkLCBpdCBzaG91bGQgc2V0IHRoZSBgbnVtX3N1YmdseXBoJyBhbmQKLSAgICogICAgIGBzdWJnbHlwaHMnIHZhbHVlcyBvZiB0aGUgZ2x5cGggc2xvdCBhY2NvcmRpbmdseSwgYW5kIHNldAotICAgKiAgICAgYGdseXBoLT5mb3JtYXQnIHRvIEBGVF9HTFlQSF9GT1JNQVRfQ09NUE9TSVRFLiAgVGhlIGRlc2NyaXB0aW9uIG9mCi0gICAqICAgICBzdWJnbHlwaHMgY2FuIHRoZW4gYmUgYWNjZXNzZWQgd2l0aCBARlRfR2V0X1N1YkdseXBoX0luZm8uCi0gICAqCi0gICAqICAgICBUaGlzIGZsYWcgaW1wbGllcyBARlRfTE9BRF9OT19TQ0FMRSBhbmQgQEZUX0xPQURfSUdOT1JFX1RSQU5TRk9STS4KLSAgICoKLSAgICogICBGVF9MT0FEX0lHTk9SRV9UUkFOU0ZPUk0gOjoKLSAgICogICAgIEluZGljYXRlcyB0aGF0IHRoZSB0cmFuc2Zvcm0gbWF0cml4IHNldCBieSBARlRfU2V0X1RyYW5zZm9ybSBzaG91bGQKLSAgICogICAgIGJlIGlnbm9yZWQuCi0gICAqCi0gICAqICAgRlRfTE9BRF9NT05PQ0hST01FIDo6Ci0gICAqICAgICBUaGlzIGZsYWcgaXMgdXNlZCB3aXRoIEBGVF9MT0FEX1JFTkRFUiB0byBpbmRpY2F0ZSB0aGF0IHlvdSB3YW50IHRvCi0gICAqICAgICByZW5kZXIgYW4gb3V0bGluZSBnbHlwaCB0byBhIDEtYml0IG1vbm9jaHJvbWUgYml0bWFwIGdseXBoLCB3aXRoCi0gICAqICAgICA4fnBpeGVscyBwYWNrZWQgaW50byBlYWNoIGJ5dGUgb2YgdGhlIGJpdG1hcCBkYXRhLgotICAgKgotICAgKiAgICAgTm90ZSB0aGF0IHRoaXMgaGFzIG5vIGVmZmVjdCBvbiB0aGUgaGludGluZyBhbGdvcml0aG0gdXNlZC4gIFlvdQotICAgKiAgICAgc2hvdWxkIHJhdGhlciB1c2UgQEZUX0xPQURfVEFSR0VUX01PTk8gc28gdGhhdCB0aGUKLSAgICogICAgIG1vbm9jaHJvbWUtb3B0aW1pemVkIGhpbnRpbmcgYWxnb3JpdGhtIGlzIHVzZWQuCi0gICAqCi0gICAqICAgRlRfTE9BRF9MSU5FQVJfREVTSUdOIDo6Ci0gICAqICAgICBJbmRpY2F0ZXMgdGhhdCB0aGUgYGxpbmVhckhvcmlBZHZhbmNlJyBhbmQgYGxpbmVhclZlcnRBZHZhbmNlJwotICAgKiAgICAgZmllbGRzIG9mIEBGVF9HbHlwaFNsb3RSZWMgc2hvdWxkIGJlIGtlcHQgaW4gZm9udCB1bml0cy4gIFNlZQotICAgKiAgICAgQEZUX0dseXBoU2xvdFJlYyBmb3IgZGV0YWlscy4KLSAgICoKLSAgICogICBGVF9MT0FEX05PX0FVVE9ISU5UIDo6Ci0gICAqICAgICBEaXNhYmxlIGF1dG8taGludGVyLiAgU2VlIGFsc28gdGhlIG5vdGUgYmVsb3cuCi0gICAqCi0gICAqICAgRlRfTE9BRF9DT0xPUiA6OgotICAgKiAgICAgVGhpcyBmbGFnIGlzIHVzZWQgdG8gcmVxdWVzdCBsb2FkaW5nIG9mIGNvbG9yIGVtYmVkZGVkLWJpdG1hcAotICAgKiAgICAgaW1hZ2VzLiAgVGhlIHJlc3VsdGluZyBjb2xvciBiaXRtYXBzLCBpZiBhdmFpbGFibGUsIHdpbGwgaGF2ZSB0aGUKLSAgICogICAgIEBGVF9QSVhFTF9NT0RFX0JHUkEgZm9ybWF0LiAgV2hlbiB0aGUgZmxhZyBpcyBub3QgdXNlZCBhbmQgY29sb3IKLSAgICogICAgIGJpdG1hcHMgYXJlIGZvdW5kLCB0aGV5IHdpbGwgYmUgY29udmVydGVkIHRvIDI1Ni1sZXZlbCBncmF5Ci0gICAqICAgICBiaXRtYXBzIHRyYW5zcGFyZW50bHkuICBUaG9zZSBiaXRtYXBzIHdpbGwgYmUgaW4gdGhlCi0gICAqICAgICBARlRfUElYRUxfTU9ERV9HUkFZIGZvcm1hdC4KLSAgICoKLSAgICogICBGVF9MT0FEX0NST1BfQklUTUFQIDo6Ci0gICAqICAgICBJZ25vcmVkLiAgRGVwcmVjYXRlZC4KLSAgICoKLSAgICogICBGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCA6OgotICAgKiAgICAgSWdub3JlZC4gIERlcHJlY2F0ZWQuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIEJ5IGRlZmF1bHQsIGhpbnRpbmcgaXMgZW5hYmxlZCBhbmQgdGhlIGZvbnQncyBuYXRpdmUgaGludGVyIChzZWUKLSAgICogICBARlRfRkFDRV9GTEFHX0hJTlRFUikgaXMgcHJlZmVycmVkIG92ZXIgdGhlIGF1dG8taGludGVyLiAgWW91IGNhbgotICAgKiAgIGRpc2FibGUgaGludGluZyBieSBzZXR0aW5nIEBGVF9MT0FEX05PX0hJTlRJTkcgb3IgY2hhbmdlIHRoZQotICAgKiAgIHByZWNlZGVuY2UgYnkgc2V0dGluZyBARlRfTE9BRF9GT1JDRV9BVVRPSElOVC4gIFlvdSBjYW4gYWxzbyBzZXQKLSAgICogICBARlRfTE9BRF9OT19BVVRPSElOVCBpbiBjYXNlIHlvdSBkb24ndCB3YW50IHRoZSBhdXRvLWhpbnRlciB0byBiZQotICAgKiAgIHVzZWQgYXQgYWxsLgotICAgKgotICAgKiAgIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgQEZUX0ZBQ0VfRkxBR19UUklDS1kgZm9yIGEgc3BlY2lhbCBleGNlcHRpb24KLSAgICogICAoYWZmZWN0aW5nIG9ubHkgYSBoYW5kZnVsIG9mIEFzaWFuIGZvbnRzKS4KLSAgICoKLSAgICogICBCZXNpZGVzIGRlY2lkaW5nIHdoaWNoIGhpbnRlciB0byB1c2UsIHlvdSBjYW4gYWxzbyBkZWNpZGUgd2hpY2gKLSAgICogICBoaW50aW5nIGFsZ29yaXRobSB0byB1c2UuICBTZWUgQEZUX0xPQURfVEFSR0VUX1hYWCBmb3IgZGV0YWlscy4KLSAgICoKLSAgICogICBOb3RlIHRoYXQgdGhlIGF1dG8taGludGVyIG5lZWRzIGEgdmFsaWQgVW5pY29kZSBjbWFwIChlaXRoZXIgYSBuYXRpdmUKLSAgICogICBvbmUgb3Igc3ludGhlc2l6ZWQgYnkgRnJlZVR5cGUpIGZvciBwcm9kdWNpbmcgY29ycmVjdCByZXN1bHRzLiAgSWYgYQotICAgKiAgIGZvbnQgcHJvdmlkZXMgYW4gaW5jb3JyZWN0IG1hcHBpbmcgKGZvciBleGFtcGxlLCBhc3NpZ25pbmcgdGhlCi0gICAqICAgY2hhcmFjdGVyIGNvZGUgVSswMDVBLCBMQVRJTiBDQVBJVEFMIExFVFRFUiBaLCB0byBhIGdseXBoIGRlcGljdGluZyBhCi0gICAqICAgbWF0aGVtYXRpY2FsIGludGVncmFsIHNpZ24pLCB0aGUgYXV0by1oaW50ZXIgbWlnaHQgcHJvZHVjZSB1c2VsZXNzCi0gICAqICAgcmVzdWx0cy4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0xPQURfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICAweDAKLSNkZWZpbmUgRlRfTE9BRF9OT19TQ0FMRSAgICAgICAgICAgICAgICAgICAgICggMUwgPDwgMCApCi0jZGVmaW5lIEZUX0xPQURfTk9fSElOVElORyAgICAgICAgICAgICAgICAgICAoIDFMIDw8IDEgKQotI2RlZmluZSBGVF9MT0FEX1JFTkRFUiAgICAgICAgICAgICAgICAgICAgICAgKCAxTCA8PCAyICkKLSNkZWZpbmUgRlRfTE9BRF9OT19CSVRNQVAgICAgICAgICAgICAgICAgICAgICggMUwgPDwgMyApCi0jZGVmaW5lIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUICAgICAgICAgICAgICAoIDFMIDw8IDQgKQotI2RlZmluZSBGVF9MT0FEX0ZPUkNFX0FVVE9ISU5UICAgICAgICAgICAgICAgKCAxTCA8PCA1ICkKLSNkZWZpbmUgRlRfTE9BRF9DUk9QX0JJVE1BUCAgICAgICAgICAgICAgICAgICggMUwgPDwgNiApCi0jZGVmaW5lIEZUX0xPQURfUEVEQU5USUMgICAgICAgICAgICAgICAgICAgICAoIDFMIDw8IDcgKQotI2RlZmluZSBGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCAgKCAxTCA8PCA5ICkKLSNkZWZpbmUgRlRfTE9BRF9OT19SRUNVUlNFICAgICAgICAgICAgICAgICAgICggMUwgPDwgMTAgKQotI2RlZmluZSBGVF9MT0FEX0lHTk9SRV9UUkFOU0ZPUk0gICAgICAgICAgICAgKCAxTCA8PCAxMSApCi0jZGVmaW5lIEZUX0xPQURfTU9OT0NIUk9NRSAgICAgICAgICAgICAgICAgICAoIDFMIDw8IDEyICkKLSNkZWZpbmUgRlRfTE9BRF9MSU5FQVJfREVTSUdOICAgICAgICAgICAgICAgICggMUwgPDwgMTMgKQotI2RlZmluZSBGVF9MT0FEX05PX0FVVE9ISU5UICAgICAgICAgICAgICAgICAgKCAxTCA8PCAxNSApCi0gIC8qIEJpdHMgMTYuLjE5IGFyZSB1c2VkIGJ5IGBGVF9MT0FEX1RBUkdFVF8nICovCi0jZGVmaW5lIEZUX0xPQURfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAoIDFMIDw8IDIwICkKLQotICAvKiAqLwotCi0gIC8qIHVzZWQgaW50ZXJuYWxseSBvbmx5IGJ5IGNlcnRhaW4gZm9udCBkcml2ZXJzISAqLwotI2RlZmluZSBGVF9MT0FEX0FEVkFOQ0VfT05MWSAgICAgICAgICAgICAgICAgKCAxTCA8PCA4ICkKLSNkZWZpbmUgRlRfTE9BRF9TQklUU19PTkxZICAgICAgICAgICAgICAgICAgICggMUwgPDwgMTQgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIEZUX0xPQURfVEFSR0VUX1hYWAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBsaXN0IG9mIHZhbHVlcyB0aGF0IGFyZSB1c2VkIHRvIHNlbGVjdCBhIHNwZWNpZmljIGhpbnRpbmcgYWxnb3JpdGhtCi0gICAqICAgdG8gdXNlIGJ5IHRoZSBoaW50ZXIuICBZb3Ugc2hvdWxkIE9SIG9uZSBvZiB0aGVzZSB2YWx1ZXMgdG8geW91cgotICAgKiAgIGBsb2FkX2ZsYWdzJyB3aGVuIGNhbGxpbmcgQEZUX0xvYWRfR2x5cGguCi0gICAqCi0gICAqICAgTm90ZSB0aGF0IGZvbnQncyBuYXRpdmUgaGludGVycyBtYXkgaWdub3JlIHRoZSBoaW50aW5nIGFsZ29yaXRobSB5b3UKLSAgICogICBoYXZlIHNwZWNpZmllZCAoZS5nLiwgdGhlIFRydWVUeXBlIGJ5dGVjb2RlIGludGVycHJldGVyKS4gIFlvdSBjYW4gc2V0Ci0gICAqICAgQEZUX0xPQURfRk9SQ0VfQVVUT0hJTlQgdG8gZW5zdXJlIHRoYXQgdGhlIGF1dG8taGludGVyIGlzIHVzZWQuCi0gICAqCi0gICAqICAgQWxzbyBub3RlIHRoYXQgQEZUX0xPQURfVEFSR0VUX0xJR0hUIGlzIGFuIGV4Y2VwdGlvbiwgaW4gdGhhdCBpdAotICAgKiAgIGFsd2F5cyBpbXBsaWVzIEBGVF9MT0FEX0ZPUkNFX0FVVE9ISU5ULgotICAgKgotICAgKiBAdmFsdWVzOgotICAgKiAgIEZUX0xPQURfVEFSR0VUX05PUk1BTCA6OgotICAgKiAgICAgVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgZGVmYXVsdCBoaW50aW5nIGFsZ29yaXRobSwgb3B0aW1pemVkIGZvcgotICAgKiAgICAgc3RhbmRhcmQgZ3JheS1sZXZlbCByZW5kZXJpbmcuICBGb3IgbW9ub2Nocm9tZSBvdXRwdXQsIHVzZQotICAgKiAgICAgQEZUX0xPQURfVEFSR0VUX01PTk8gaW5zdGVhZC4KLSAgICoKLSAgICogICBGVF9MT0FEX1RBUkdFVF9MSUdIVCA6OgotICAgKiAgICAgQSBsaWdodGVyIGhpbnRpbmcgYWxnb3JpdGhtIGZvciBub24tbW9ub2Nocm9tZSBtb2Rlcy4gIE1hbnkKLSAgICogICAgIGdlbmVyYXRlZCBnbHlwaHMgYXJlIG1vcmUgZnV6enkgYnV0IGJldHRlciByZXNlbWJsZSBpdHMgb3JpZ2luYWwKLSAgICogICAgIHNoYXBlLiAgQSBiaXQgbGlrZSByZW5kZXJpbmcgb24gTWFjIE9TflguCi0gICAqCi0gICAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGlzIHRhcmdldCBpbXBsaWVzIEBGVF9MT0FEX0ZPUkNFX0FVVE9ISU5ULgotICAgKgotICAgKiAgIEZUX0xPQURfVEFSR0VUX01PTk8gOjoKLSAgICogICAgIFN0cm9uZyBoaW50aW5nIGFsZ29yaXRobSB0aGF0IHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIG1vbm9jaHJvbWUKLSAgICogICAgIG91dHB1dC4gIFRoZSByZXN1bHQgaXMgcHJvYmFibHkgdW5wbGVhc2FudCBpZiB0aGUgZ2x5cGggaXMgcmVuZGVyZWQKLSAgICogICAgIGluIG5vbi1tb25vY2hyb21lIG1vZGVzLgotICAgKgotICAgKiAgIEZUX0xPQURfVEFSR0VUX0xDRCA6OgotICAgKiAgICAgQSB2YXJpYW50IG9mIEBGVF9MT0FEX1RBUkdFVF9OT1JNQUwgb3B0aW1pemVkIGZvciBob3Jpem9udGFsbHkKLSAgICogICAgIGRlY2ltYXRlZCBMQ0QgZGlzcGxheXMuCi0gICAqCi0gICAqICAgRlRfTE9BRF9UQVJHRVRfTENEX1YgOjoKLSAgICogICAgIEEgdmFyaWFudCBvZiBARlRfTE9BRF9UQVJHRVRfTk9STUFMIG9wdGltaXplZCBmb3IgdmVydGljYWxseQotICAgKiAgICAgZGVjaW1hdGVkIExDRCBkaXNwbGF5cy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgWW91IHNob3VsZCB1c2Ugb25seSBfb25lXyBvZiB0aGUgRlRfTE9BRF9UQVJHRVRfWFhYIHZhbHVlcyBpbiB5b3VyCi0gICAqICAgYGxvYWRfZmxhZ3MnLiAgVGhleSBjYW4ndCBiZSBPUmVkLgotICAgKgotICAgKiAgIElmIEBGVF9MT0FEX1JFTkRFUiBpcyBhbHNvIHNldCwgdGhlIGdseXBoIGlzIHJlbmRlcmVkIGluIHRoZQotICAgKiAgIGNvcnJlc3BvbmRpbmcgbW9kZSAoaS5lLiwgdGhlIG1vZGUgdGhhdCBtYXRjaGVzIHRoZSB1c2VkIGFsZ29yaXRobQotICAgKiAgIGJlc3QpLiAgQW4gZXhlcHRpb24gaXMgRlRfTE9BRF9UQVJHRVRfTU9OTyBzaW5jZSBpdCBpbXBsaWVzCi0gICAqICAgQEZUX0xPQURfTU9OT0NIUk9NRS4KLSAgICoKLSAgICogICBZb3UgY2FuIHVzZSBhIGhpbnRpbmcgYWxnb3JpdGhtIHRoYXQgZG9lc24ndCBjb3JyZXNwb25kIHRvIHRoZSBzYW1lCi0gICAqICAgcmVuZGVyaW5nIG1vZGUuICBBcyBhbiBleGFtcGxlLCBpdCBpcyBwb3NzaWJsZSB0byB1c2UgdGhlIGBsaWdodCcKLSAgICogICBoaW50aW5nIGFsZ29yaXRobSBhbmQgaGF2ZSB0aGUgcmVzdWx0cyByZW5kZXJlZCBpbiBob3Jpem9udGFsIExDRAotICAgKiAgIHBpeGVsIG1vZGUsIHdpdGggY29kZSBsaWtlCi0gICAqCi0gICAqICAgICB7Ci0gICAqICAgICAgIEZUX0xvYWRfR2x5cGgoIGZhY2UsIGdseXBoX2luZGV4LAotICAgKiAgICAgICAgICAgICAgICAgICAgICBsb2FkX2ZsYWdzIHwgRlRfTE9BRF9UQVJHRVRfTElHSFQgKTsKLSAgICoKLSAgICogICAgICAgRlRfUmVuZGVyX0dseXBoKCBmYWNlLT5nbHlwaCwgRlRfUkVOREVSX01PREVfTENEICk7Ci0gICAqICAgICB9Ci0gICAqCi0gICAqLwotI2RlZmluZSBGVF9MT0FEX1RBUkdFVF8oIHggKSAgICggKEZUX0ludDMyKSggKHgpICYgMTUgKSA8PCAxNiApCi0KLSNkZWZpbmUgRlRfTE9BRF9UQVJHRVRfTk9STUFMICBGVF9MT0FEX1RBUkdFVF8oIEZUX1JFTkRFUl9NT0RFX05PUk1BTCApCi0jZGVmaW5lIEZUX0xPQURfVEFSR0VUX0xJR0hUICAgRlRfTE9BRF9UQVJHRVRfKCBGVF9SRU5ERVJfTU9ERV9MSUdIVCAgKQotI2RlZmluZSBGVF9MT0FEX1RBUkdFVF9NT05PICAgIEZUX0xPQURfVEFSR0VUXyggRlRfUkVOREVSX01PREVfTU9OTyAgICkKLSNkZWZpbmUgRlRfTE9BRF9UQVJHRVRfTENEICAgICBGVF9MT0FEX1RBUkdFVF8oIEZUX1JFTkRFUl9NT0RFX0xDRCAgICApCi0jZGVmaW5lIEZUX0xPQURfVEFSR0VUX0xDRF9WICAgRlRfTE9BRF9UQVJHRVRfKCBGVF9SRU5ERVJfTU9ERV9MQ0RfViAgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9MT0FEX1RBUkdFVF9NT0RFCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXR1cm4gdGhlIEBGVF9SZW5kZXJfTW9kZSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4KLSAgICogICBARlRfTE9BRF9UQVJHRVRfWFhYIHZhbHVlLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfTE9BRF9UQVJHRVRfTU9ERSggeCApICAoIChGVF9SZW5kZXJfTW9kZSkoICggKHgpID4+IDE2ICkgJiAxNSApICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9UcmFuc2Zvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBzZXQgdGhlIHRyYW5zZm9ybWF0aW9uIHRoYXQgaXMgYXBwbGllZCB0byBnbHlwaCAqLwotICAvKiAgICBpbWFnZXMgd2hlbiB0aGV5IGFyZSBsb2FkZWQgaW50byBhIGdseXBoIHNsb3QgdGhyb3VnaCAgICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0xvYWRfR2x5cGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF0cml4IDo6IEEgcG9pbnRlciB0byB0aGUgdHJhbnNmb3JtYXRpb24ncyAyeDIgbWF0cml4LiAgVXNlfjAgZm9yICovCi0gIC8qICAgICAgICAgICAgICB0aGUgaWRlbnRpdHkgbWF0cml4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZWx0YSAgOjogQSBwb2ludGVyIHRvIHRoZSB0cmFuc2xhdGlvbiB2ZWN0b3IuICBVc2V+MCBmb3IgdGhlIG51bGwgKi8KLSAgLyogICAgICAgICAgICAgIHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHRyYW5zZm9ybWF0aW9uIGlzIG9ubHkgYXBwbGllZCB0byBzY2FsYWJsZSBpbWFnZSBmb3JtYXRzIGFmdGVyICovCi0gIC8qICAgIHRoZSBnbHlwaCBoYXMgYmVlbiBsb2FkZWQuICBJdCBtZWFucyB0aGF0IGhpbnRpbmcgaXMgdW5hbHRlcmVkIGJ5ICAqLwotICAvKiAgICB0aGUgdHJhbnNmb3JtYXRpb24gYW5kIGlzIHBlcmZvcm1lZCBvbiB0aGUgY2hhcmFjdGVyIHNpemUgZ2l2ZW4gaW4gKi8KLSAgLyogICAgdGhlIGxhc3QgY2FsbCB0byBARlRfU2V0X0NoYXJfU2l6ZSBvciBARlRfU2V0X1BpeGVsX1NpemVzLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3RlIHRoYXQgdGhpcyBhbHNvIHRyYW5zZm9ybXMgdGhlIGBmYWNlLmdseXBoLmFkdmFuY2UnIGZpZWxkLCBidXQgKi8KLSAgLyogICAgKm5vdCogdGhlIHZhbHVlcyBpbiBgZmFjZS5nbHlwaC5tZXRyaWNzJy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9TZXRfVHJhbnNmb3JtKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9NYXRyaXgqICBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIGRlbHRhICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SZW5kZXJfTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBlbnVtZXJhdGlvbiB0eXBlIHRoYXQgbGlzdHMgdGhlIHJlbmRlciBtb2RlcyBzdXBwb3J0ZWQgYnkgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGV+Mi4gIEVhY2ggbW9kZSBjb3JyZXNwb25kcyB0byBhIHNwZWNpZmljIHR5cGUgb2Ygc2NhbmxpbmUgICovCi0gIC8qICAgIGNvbnZlcnNpb24gcGVyZm9ybWVkIG9uIHRoZSBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRm9yIGJpdG1hcCBmb250cyBhbmQgZW1iZWRkZWQgYml0bWFwcyB0aGUgYGJpdG1hcC0+cGl4ZWxfbW9kZScgICAgICovCi0gIC8qICAgIGZpZWxkIGluIHRoZSBARlRfR2x5cGhTbG90UmVjIHN0cnVjdHVyZSBnaXZlcyB0aGUgZm9ybWF0IG9mIHRoZSAgICAqLwotICAvKiAgICByZXR1cm5lZCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFsbCBtb2RlcyBleGNlcHQgQEZUX1JFTkRFUl9NT0RFX01PTk8gdXNlIDI1NiBsZXZlbHMgb2Ygb3BhY2l0eS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JFTkRFUl9NT0RFX05PUk1BTCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoaXMgaXMgdGhlIGRlZmF1bHQgcmVuZGVyIG1vZGU7IGl0IGNvcnJlc3BvbmRzIHRvIDgtYml0ICAgICAgICAgKi8KLSAgLyogICAgICBhbnRpLWFsaWFzZWQgYml0bWFwcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SRU5ERVJfTU9ERV9MSUdIVCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gQEZUX1JFTkRFUl9NT0RFX05PUk1BTC4gIEl0IGlzIG9ubHkgICAgICAgICovCi0gIC8qICAgICAgZGVmaW5lZCBhcyBhIHNlcGFyYXRlIHZhbHVlIGJlY2F1c2UgcmVuZGVyIG1vZGVzIGFyZSBhbHNvIHVzZWQgICAqLwotICAvKiAgICAgIGluZGlyZWN0bHkgdG8gZGVmaW5lIGhpbnRpbmcgYWxnb3JpdGhtIHNlbGVjdG9ycy4gIFNlZSAgICAgICAgICAgKi8KLSAgLyogICAgICBARlRfTE9BRF9UQVJHRVRfWFhYIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SRU5ERVJfTU9ERV9NT05PIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGlzIG1vZGUgY29ycmVzcG9uZHMgdG8gMS1iaXQgYml0bWFwcyAod2l0aCAyfmxldmVscyBvZiAgICAgICAgICovCi0gIC8qICAgICAgb3BhY2l0eSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUkVOREVSX01PREVfTENEIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhpcyBtb2RlIGNvcnJlc3BvbmRzIHRvIGhvcml6b250YWwgUkdCIGFuZCBCR1Igc3ViLXBpeGVsICAgICAgICAqLwotICAvKiAgICAgIGRpc3BsYXlzIGxpa2UgTENEIHNjcmVlbnMuICBJdCBwcm9kdWNlcyA4LWJpdCBiaXRtYXBzIHRoYXQgYXJlICAgKi8KLSAgLyogICAgICAzfnRpbWVzIHRoZSB3aWR0aCBvZiB0aGUgb3JpZ2luYWwgZ2x5cGggb3V0bGluZSBpbiBwaXhlbHMsIGFuZCAgICovCi0gIC8qICAgICAgd2hpY2ggdXNlIHRoZSBARlRfUElYRUxfTU9ERV9MQ0QgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUkVOREVSX01PREVfTENEX1YgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhpcyBtb2RlIGNvcnJlc3BvbmRzIHRvIHZlcnRpY2FsIFJHQiBhbmQgQkdSIHN1Yi1waXhlbCBkaXNwbGF5cyAqLwotICAvKiAgICAgIChsaWtlIFBEQSBzY3JlZW5zLCByb3RhdGVkIExDRCBkaXNwbGF5cywgZXRjLikuICBJdCBwcm9kdWNlcyAgICAgKi8KLSAgLyogICAgICA4LWJpdCBiaXRtYXBzIHRoYXQgYXJlIDN+dGltZXMgdGhlIGhlaWdodCBvZiB0aGUgb3JpZ2luYWwgICAgICAgICovCi0gIC8qICAgICAgZ2x5cGggb3V0bGluZSBpbiBwaXhlbHMgYW5kIHVzZSB0aGUgQEZUX1BJWEVMX01PREVfTENEX1YgbW9kZS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBMQ0Qtb3B0aW1pemVkIGdseXBoIGJpdG1hcHMgcHJvZHVjZWQgYnkgRlRfUmVuZGVyX0dseXBoIGNhbiBiZSAqLwotICAvKiAgICBmaWx0ZXJlZCB0byByZWR1Y2UgY29sb3ItZnJpbmdlcyBieSB1c2luZyBARlRfTGlicmFyeV9TZXRMY2RGaWx0ZXIgKi8KLSAgLyogICAgKG5vdCBhY3RpdmUgaW4gdGhlIGRlZmF1bHQgYnVpbGRzKS4gIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gICAgICovCi0gIC8qICAgIGVpdGhlciBjYWxsIEBGVF9MaWJyYXJ5X1NldExjZEZpbHRlciAoaWYgYXZhaWxhYmxlKSBvciBkbyB0aGUgICAgICAqLwotICAvKiAgICBmaWx0ZXJpbmcgaXRzZWxmLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBzZWxlY3RlZCByZW5kZXIgbW9kZSBvbmx5IGFmZmVjdHMgdmVjdG9yIGdseXBocyBvZiBhIGZvbnQuICAgICAqLwotICAvKiAgICBFbWJlZGRlZCBiaXRtYXBzIG9mdGVuIGhhdmUgYSBkaWZmZXJlbnQgcGl4ZWwgbW9kZSBsaWtlICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX1BJWEVMX01PREVfTU9OTy4gIFlvdSBjYW4gdXNlIEBGVF9CaXRtYXBfQ29udmVydCB0byB0cmFuc2Zvcm0gICovCi0gIC8qICAgIHRoZW0gaW50byA4LWJpdCBwaXhtYXBzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBlbnVtICBGVF9SZW5kZXJfTW9kZV8KLSAgewotICAgIEZUX1JFTkRFUl9NT0RFX05PUk1BTCA9IDAsCi0gICAgRlRfUkVOREVSX01PREVfTElHSFQsCi0gICAgRlRfUkVOREVSX01PREVfTU9OTywKLSAgICBGVF9SRU5ERVJfTU9ERV9MQ0QsCi0gICAgRlRfUkVOREVSX01PREVfTENEX1YsCi0KLSAgICBGVF9SRU5ERVJfTU9ERV9NQVgKLQotICB9IEZUX1JlbmRlcl9Nb2RlOwotCi0KLSAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgKi8KLSAgLyogYEZUX1JlbmRlcl9Nb2RlJyB2YWx1ZXMgaW5zdGVhZCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgZnRfcmVuZGVyX21vZGVfbm9ybWFsICBGVF9SRU5ERVJfTU9ERV9OT1JNQUwKLSNkZWZpbmUgZnRfcmVuZGVyX21vZGVfbW9ubyAgICBGVF9SRU5ERVJfTU9ERV9NT05PCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SZW5kZXJfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb252ZXJ0IGEgZ2l2ZW4gZ2x5cGggaW1hZ2UgdG8gYSBiaXRtYXAuICBJdCBkb2VzIHNvIGJ5IGluc3BlY3RpbmcgKi8KLSAgLyogICAgdGhlIGdseXBoIGltYWdlIGZvcm1hdCwgZmluZGluZyB0aGUgcmVsZXZhbnQgcmVuZGVyZXIsIGFuZCAgICAgICAgICovCi0gIC8qICAgIGludm9raW5nIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNsb3QgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBnbHlwaCBzbG90IGNvbnRhaW5pbmcgdGhlIGltYWdlIHRvICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBjb252ZXJ0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZW5kZXJfbW9kZSA6OiBUaGlzIGlzIHRoZSByZW5kZXIgbW9kZSB1c2VkIHRvIHJlbmRlciB0aGUgZ2x5cGggICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgaW1hZ2UgaW50byBhIGJpdG1hcC4gIFNlZSBARlRfUmVuZGVyX01vZGUgZm9yIGEgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRvIGdldCBtZWFuaW5nZnVsIHJlc3VsdHMsIGZvbnQgc2NhbGluZyB2YWx1ZXMgbXVzdCBiZSBzZXQgd2l0aCAgICAqLwotICAvKiAgICBmdW5jdGlvbnMgbGlrZSBARlRfU2V0X0NoYXJfU2l6ZSBiZWZvcmUgY2FsbGluZyBGVF9SZW5kZXJfR2x5cGguICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9SZW5kZXJfR2x5cGgoIEZUX0dseXBoU2xvdCAgICBzbG90LAotICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICByZW5kZXJfbW9kZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfS2VybmluZ19Nb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gZW51bWVyYXRpb24gdXNlZCB0byBzcGVjaWZ5IHdoaWNoIGtlcm5pbmcgdmFsdWVzIHRvIHJldHVybiBpbiAgICovCi0gIC8qICAgIEBGVF9HZXRfS2VybmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0tFUk5JTkdfREVGQVVMVCAgOjogUmV0dXJuIHNjYWxlZCBhbmQgZ3JpZC1maXR0ZWQga2VybmluZyAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlcyAodmFsdWUgaXN+MCkuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0tFUk5JTkdfVU5GSVRURUQgOjogUmV0dXJuIHNjYWxlZCBidXQgdW4tZ3JpZC1maXR0ZWQga2VybmluZyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0tFUk5JTkdfVU5TQ0FMRUQgOjogUmV0dXJuIHRoZSBrZXJuaW5nIHZlY3RvciBpbiBvcmlnaW5hbCBmb250ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgZW51bSAgRlRfS2VybmluZ19Nb2RlXwotICB7Ci0gICAgRlRfS0VSTklOR19ERUZBVUxUICA9IDAsCi0gICAgRlRfS0VSTklOR19VTkZJVFRFRCwKLSAgICBGVF9LRVJOSU5HX1VOU0NBTEVECi0KLSAgfSBGVF9LZXJuaW5nX01vZGU7Ci0KLQotICAvKiB0aGVzZSBjb25zdGFudHMgYXJlIGRlcHJlY2F0ZWQ7IHVzZSB0aGUgY29ycmVzcG9uZGluZyAqLwotICAvKiBgRlRfS2VybmluZ19Nb2RlJyB2YWx1ZXMgaW5zdGVhZCAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBmdF9rZXJuaW5nX2RlZmF1bHQgICBGVF9LRVJOSU5HX0RFRkFVTFQKLSNkZWZpbmUgZnRfa2VybmluZ191bmZpdHRlZCAgRlRfS0VSTklOR19VTkZJVFRFRAotI2RlZmluZSBmdF9rZXJuaW5nX3Vuc2NhbGVkICBGVF9LRVJOSU5HX1VOU0NBTEVECi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfS2VybmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gdGhlIGtlcm5pbmcgdmVjdG9yIGJldHdlZW4gdHdvIGdseXBocyBvZiBhIHNhbWUgZmFjZS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICA6OiBBIGhhbmRsZSB0byBhIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlZnRfZ2x5cGggIDo6IFRoZSBpbmRleCBvZiB0aGUgbGVmdCBnbHlwaCBpbiB0aGUga2VybiBwYWlyLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmlnaHRfZ2x5cGggOjogVGhlIGluZGV4IG9mIHRoZSByaWdodCBnbHlwaCBpbiB0aGUga2VybiBwYWlyLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBrZXJuX21vZGUgICA6OiBTZWUgQEZUX0tlcm5pbmdfTW9kZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgRGV0ZXJtaW5lcyB0aGUgc2NhbGUgYW5kIGRpbWVuc2lvbiBvZiB0aGUgcmV0dXJuZWQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGtlcm5pbmcgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFrZXJuaW5nICAgIDo6IFRoZSBrZXJuaW5nIHZlY3Rvci4gIFRoaXMgaXMgZWl0aGVyIGluIGZvbnQgdW5pdHMgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBvciBpbiBwaXhlbHMgKDI2LjYgZm9ybWF0KSBmb3Igc2NhbGFibGUgZm9ybWF0cywgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgYW5kIGluIHBpeGVscyBmb3IgZml4ZWQtc2l6ZXMgZm9ybWF0cy4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT25seSBob3Jpem9udGFsIGxheW91dHMgKGxlZnQtdG8tcmlnaHQgJiByaWdodC10by1sZWZ0KSBhcmUgICAgICAgICovCi0gIC8qICAgIHN1cHBvcnRlZCBieSB0aGlzIG1ldGhvZC4gIE90aGVyIGxheW91dHMsIG9yIG1vcmUgc29waGlzdGljYXRlZCAgICAqLwotICAvKiAgICBrZXJuaW5ncywgYXJlIG91dCBvZiB0aGUgc2NvcGUgb2YgdGhpcyBBUEkgZnVuY3Rpb24gLS0gdGhleSBjYW4gYmUgKi8KLSAgLyogICAgaW1wbGVtZW50ZWQgdGhyb3VnaCBmb3JtYXQtc3BlY2lmaWMgaW50ZXJmYWNlcy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0tlcm5pbmcoIEZUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBsZWZ0X2dseXBoLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgcmlnaHRfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBrZXJuX21vZGUsCi0gICAgICAgICAgICAgICAgICBGVF9WZWN0b3IgICpha2VybmluZyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X1RyYWNrX0tlcm5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIHRoZSB0cmFjayBrZXJuaW5nIGZvciBhIGdpdmVuIGZhY2Ugb2JqZWN0IGF0IGEgZ2l2ZW4gc2l6ZS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICA6OiBBIGhhbmRsZSB0byBhIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb2ludF9zaXplIDo6IFRoZSBwb2ludCBzaXplIGluIDE2LjE2IGZyYWN0aW9uYWwgcG9pbnRzLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlZ3JlZSAgICAgOjogVGhlIGRlZ3JlZSBvZiB0aWdodG5lc3MuICBJbmNyZWFzaW5nbHkgbmVnYXRpdmUgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHZhbHVlcyByZXByZXNlbnQgdGlnaHRlciB0cmFjayBrZXJuaW5nLCB3aGlsZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBpbmNyZWFzaW5nbHkgcG9zaXRpdmUgdmFsdWVzIHJlcHJlc2VudCBsb29zZXIgdHJhY2sgICovCi0gIC8qICAgICAgICAgICAgICAgICAga2VybmluZy4gIFZhbHVlIHplcm8gbWVhbnMgbm8gdHJhY2sga2VybmluZy4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFrZXJuaW5nICAgOjogVGhlIGtlcm5pbmcgaW4gMTYuMTYgZnJhY3Rpb25hbCBwb2ludHMsIHRvIGJlICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHVuaWZvcm1seSBhcHBsaWVkIGJldHdlZW4gYWxsIGdseXBocy4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDdXJyZW50bHksIG9ubHkgdGhlIFR5cGV+MSBmb250IGRyaXZlciBzdXBwb3J0cyB0cmFjayBrZXJuaW5nLCAgICAgKi8KLSAgLyogICAgdXNpbmcgZGF0YSBmcm9tIEFGTSBmaWxlcyAoaWYgYXR0YWNoZWQgd2l0aCBARlRfQXR0YWNoX0ZpbGUgb3IgICAgICovCi0gIC8qICAgIEBGVF9BdHRhY2hfU3RyZWFtKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT25seSB2ZXJ5IGZldyBBRk0gZmlsZXMgY29tZSB3aXRoIHRyYWNrIGtlcm5pbmcgZGF0YTsgcGxlYXNlIHJlZmVyICovCi0gIC8qICAgIHRvIHRoZSBBZG9iZSdzIEFGTSBzcGVjaWZpY2F0aW9uIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9UcmFja19LZXJuaW5nKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgIHBvaW50X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGRlZ3JlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgYWtlcm5pbmcgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9HbHlwaF9OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHJpZXZlIHRoZSBBU0NJSSBuYW1lIG9mIGEgZ2l2ZW4gZ2x5cGggaW4gYSBmYWNlLiAgVGhpcyBvbmx5ICAgICAqLwotICAvKiAgICB3b3JrcyBmb3IgdGhvc2UgZmFjZXMgd2hlcmUgQEZUX0hBU19HTFlQSF9OQU1FUyhmYWNlKSByZXR1cm5zfjEuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICA6OiBBIGhhbmRsZSB0byBhIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2luZGV4IDo6IFRoZSBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYnVmZmVyX21heCAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJ1ZmZlciAgICAgIDo6IEEgcG9pbnRlciB0byBhIHRhcmdldCBidWZmZXIgd2hlcmUgdGhlIG5hbWUgaXMgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBjb3BpZWQgdG8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBlcnJvciBpcyByZXR1cm5lZCBpZiB0aGUgZmFjZSBkb2Vzbid0IHByb3ZpZGUgZ2x5cGggbmFtZXMgb3IgaWYgKi8KLSAgLyogICAgdGhlIGdseXBoIGluZGV4IGlzIGludmFsaWQuICBJbiBhbGwgY2FzZXMgb2YgZmFpbHVyZSwgdGhlIGZpcnN0ICAgICovCi0gIC8qICAgIGJ5dGUgb2YgYGJ1ZmZlcicgaXMgc2V0IHRvfjAgdG8gaW5kaWNhdGUgYW4gZW1wdHkgbmFtZS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGdseXBoIG5hbWUgaXMgdHJ1bmNhdGVkIHRvIGZpdCB3aXRoaW4gdGhlIGJ1ZmZlciBpZiBpdCBpcyB0b28gICovCi0gIC8qICAgIGxvbmcuICBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIGFsd2F5cyB6ZXJvLXRlcm1pbmF0ZWQuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQmUgYXdhcmUgdGhhdCBGcmVlVHlwZSByZW9yZGVycyBnbHlwaCBpbmRpY2VzIGludGVybmFsbHkgc28gdGhhdCAgICovCi0gIC8qICAgIGdseXBoIGluZGV4fjAgYWx3YXlzIGNvcnJlc3BvbmRzIHRvIHRoZSBgbWlzc2luZyBnbHlwaCcgKGNhbGxlZCAgICAqLwotICAvKiAgICBgLm5vdGRlZicpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIGNvbmZpZyBtYWNybyAgICAgICAgICAqLwotICAvKiAgICBgRlRfQ09ORklHX09QVElPTl9OT19HTFlQSF9OQU1FUycgaXMgbm90IGRlZmluZWQgaW4gYGZ0b3B0aW9ucy5oJy4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfR2x5cGhfTmFtZSggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgYnVmZmVyX21heCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X1Bvc3RzY3JpcHRfTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmUgdGhlIEFTQ0lJIFBvc3RTY3JpcHQgbmFtZSBvZiBhIGdpdmVuIGZhY2UsIGlmIGF2YWlsYWJsZS4gICovCi0gIC8qICAgIFRoaXMgb25seSB3b3JrcyB3aXRoIFBvc3RTY3JpcHQgYW5kIFRydWVUeXBlIGZvbnRzLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgcG9pbnRlciB0byB0aGUgZmFjZSdzIFBvc3RTY3JpcHQgbmFtZS4gIE5VTEwgaWYgdW5hdmFpbGFibGUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXR1cm5lZCBwb2ludGVyIGlzIG93bmVkIGJ5IHRoZSBmYWNlIGFuZCBpcyBkZXN0cm95ZWQgd2l0aCAgICAqLwotICAvKiAgICBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggY29uc3QgY2hhciogKQotICBGVF9HZXRfUG9zdHNjcmlwdF9OYW1lKCBGVF9GYWNlICBmYWNlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZWxlY3RfQ2hhcm1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWxlY3QgYSBnaXZlbiBjaGFybWFwIGJ5IGl0cyBlbmNvZGluZyB0YWcgKGFzIGxpc3RlZCBpbiAgICAgICAgICAgKi8KLSAgLyogICAgYGZyZWV0eXBlLmgnKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZW5jb2RpbmcgOjogQSBoYW5kbGUgdG8gdGhlIHNlbGVjdGVkIGVuY29kaW5nLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIG5vIGNoYXJtYXAgaW4gdGhlIGZhY2UgICAgICAgICAgICovCi0gIC8qICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBlbmNvZGluZyBxdWVyaWVkIGhlcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQmVjYXVzZSBtYW55IGZvbnRzIGNvbnRhaW4gbW9yZSB0aGFuIGEgc2luZ2xlIGNtYXAgZm9yIFVuaWNvZGUgICAgICovCi0gIC8qICAgIGVuY29kaW5nLCB0aGlzIGZ1bmN0aW9uIGhhcyBzb21lIHNwZWNpYWwgY29kZSB0byBzZWxlY3QgdGhlIG9uZSAgICAqLwotICAvKiAgICB0aGF0IGNvdmVycyBVbmljb2RlIGJlc3QgKGBiZXN0JyBpbiB0aGUgc2Vuc2UgdGhhdCBhIFVDUy00IGNtYXAgaXMgKi8KLSAgLyogICAgcHJlZmVycmVkIHRvIGEgVUNTLTIgY21hcCkuICBJdCBpcyB0aHVzIHByZWZlcmFibGUgdG8gICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9TZXRfQ2hhcm1hcCBpbiB0aGlzIGNhc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1NlbGVjdF9DaGFybWFwKCBGVF9GYWNlICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0VuY29kaW5nICBlbmNvZGluZyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X0NoYXJtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VsZWN0IGEgZ2l2ZW4gY2hhcm1hcCBmb3IgY2hhcmFjdGVyIGNvZGUgdG8gZ2x5cGggaW5kZXggbWFwcGluZy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcm1hcCA6OiBBIGhhbmRsZSB0byB0aGUgc2VsZWN0ZWQgY2hhcm1hcC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBjaGFybWFwIGlzIG5vdCBwYXJ0IG9mICAgICAgICovCi0gIC8qICAgIHRoZSBmYWNlIChpLmUuLCBpZiBpdCBpcyBub3QgbGlzdGVkIGluIHRoZSBgZmFjZS0+Y2hhcm1hcHMnICAgICAgICAqLwotICAvKiAgICB0YWJsZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEl0IGFsc28gZmFpbHMgaWYgYSB0eXBlfjE0IGNoYXJtYXAgaXMgc2VsZWN0ZWQuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1NldF9DaGFybWFwKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfQ2hhck1hcCAgY2hhcm1hcCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX0dldF9DaGFybWFwX0luZGV4Ci0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXRyaWV2ZSBpbmRleCBvZiBhIGdpdmVuIGNoYXJtYXAuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBjaGFybWFwIDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byBhIGNoYXJtYXAuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgVGhlIGluZGV4IGludG8gdGhlIGFycmF5IG9mIGNoYXJhY3RlciBtYXBzIHdpdGhpbiB0aGUgZmFjZSB0byB3aGljaAotICAgKiAgIGBjaGFybWFwJyBiZWxvbmdzLiAgSWYgYW4gZXJyb3Igb2NjdXJzLCAtMSBpcyByZXR1cm5lZC4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfSW50ICkKLSAgRlRfR2V0X0NoYXJtYXBfSW5kZXgoIEZUX0NoYXJNYXAgIGNoYXJtYXAgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9DaGFyX0luZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgZ2x5cGggaW5kZXggb2YgYSBnaXZlbiBjaGFyYWN0ZXIgY29kZS4gIFRoaXMgZnVuY3Rpb24gICAqLwotICAvKiAgICB1c2VzIGEgY2hhcm1hcCBvYmplY3QgdG8gZG8gdGhlIG1hcHBpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJjb2RlIDo6IFRoZSBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBnbHlwaCBpbmRleC4gIDB+bWVhbnMgYHVuZGVmaW5lZCBjaGFyYWN0ZXIgY29kZScuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHlvdSB1c2UgRnJlZVR5cGUgdG8gbWFuaXB1bGF0ZSB0aGUgY29udGVudHMgb2YgZm9udCBmaWxlcyAgICAgICAqLwotICAvKiAgICBkaXJlY3RseSwgYmUgYXdhcmUgdGhhdCB0aGUgZ2x5cGggaW5kZXggcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiAgKi8KLSAgLyogICAgZG9lc24ndCBhbHdheXMgY29ycmVzcG9uZCB0byB0aGUgaW50ZXJuYWwgaW5kaWNlcyB1c2VkIHdpdGhpbiB0aGUgICovCi0gIC8qICAgIGZpbGUuICBUaGlzIGlzIGRvbmUgdG8gZW5zdXJlIHRoYXQgdmFsdWV+MCBhbHdheXMgY29ycmVzcG9uZHMgdG8gICAqLwotICAvKiAgICB0aGUgYG1pc3NpbmcgZ2x5cGgnLiAgSWYgdGhlIGZpcnN0IGdseXBoIGlzIG5vdCBuYW1lZCBgLm5vdGRlZicsICAgKi8KLSAgLyogICAgdGhlbiBmb3IgVHlwZX4xIGFuZCBUeXBlfjQyIGZvbnRzLCBgLm5vdGRlZicgd2lsbCBiZSBtb3ZlZCBpbnRvICAgICovCi0gIC8qICAgIHRoZSBnbHlwaCBJRH4wIHBvc2l0aW9uLCBhbmQgd2hhdGV2ZXIgd2FzIHRoZXJlIHdpbGwgYmUgbW92ZWQgdG8gICAqLwotICAvKiAgICB0aGUgcG9zaXRpb24gYC5ub3RkZWYnIGhhZC4gIEZvciBUeXBlfjEgZm9udHMsIGlmIHRoZXJlIGlzIG5vICAgICAgKi8KLSAgLyogICAgYC5ub3RkZWYnIGdseXBoIGF0IGFsbCwgdGhlbiBvbmUgd2lsbCBiZSBjcmVhdGVkIGF0IGluZGV4fjAgYW5kICAgICovCi0gIC8qICAgIHdoYXRldmVyIHdhcyB0aGVyZSB3aWxsIGJlIG1vdmVkIHRvIHRoZSBsYXN0IGluZGV4IC0tIFR5cGV+NDIgICAgICAqLwotICAvKiAgICBmb250cyBhcmUgY29uc2lkZXJlZCBpbnZhbGlkIHVuZGVyIHRoaXMgY29uZGl0aW9uLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfVUludCApCi0gIEZUX0dldF9DaGFyX0luZGV4KCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBjaGFyY29kZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0ZpcnN0X0NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHVybiB0aGUgZmlyc3QgY2hhcmFjdGVyIGNvZGUgaW4gdGhlICAgICovCi0gIC8qICAgIGN1cnJlbnQgY2hhcm1hcCBvZiBhIGdpdmVuIGZhY2UuICBJdCBhbHNvIHJldHVybnMgdGhlICAgICAgICAgICAgICAqLwotICAvKiAgICBjb3JyZXNwb25kaW5nIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZ2luZGV4IDo6IEdseXBoIGluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciBjb2RlLiAgMH5pZiBjaGFybWFwIGlzICAgKi8KLSAgLyogICAgICAgICAgICAgICBlbXB0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGNoYXJtYXAncyBmaXJzdCBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgWW91IHNob3VsZCB1c2UgdGhpcyBmdW5jdGlvbiB3aXRoIEBGVF9HZXRfTmV4dF9DaGFyIHRvIGJlIGFibGUgdG8gICovCi0gIC8qICAgIHBhcnNlIGFsbCBjaGFyYWN0ZXIgY29kZXMgYXZhaWxhYmxlIGluIGEgZ2l2ZW4gY2hhcm1hcC4gIFRoZSBjb2RlICAqLwotICAvKiAgICBzaG91bGQgbG9vayBsaWtlIHRoaXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEZUX1VMb25nICBjaGFyY29kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGVF9VSW50ICAgZ2luZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBjaGFyY29kZSA9IEZUX0dldF9GaXJzdF9DaGFyKCBmYWNlLCAmZ2luZGV4ICk7ICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgd2hpbGUgKCBnaW5kZXggIT0gMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIC4uLiBkbyBzb21ldGhpbmcgd2l0aCAoY2hhcmNvZGUsZ2luZGV4KSBwYWlyIC4uLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgY2hhcmNvZGUgPSBGVF9HZXRfTmV4dF9DaGFyKCBmYWNlLCBjaGFyY29kZSwgJmdpbmRleCApOyAgICAgICAgKi8KLSAgLyogICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IGAqYWdpbmRleCcgaXMgc2V0IHRvfjAgaWYgdGhlIGNoYXJtYXAgaXMgZW1wdHkuICBUaGUgICAgICovCi0gIC8qICAgIHJlc3VsdCBpdHNlbGYgY2FuIGJlfjAgaW4gdHdvIGNhc2VzOiBpZiB0aGUgY2hhcm1hcCBpcyBlbXB0eSBvciAgICAqLwotICAvKiAgICBpZiB0aGUgdmFsdWV+MCBpcyB0aGUgZmlyc3QgdmFsaWQgY2hhcmFjdGVyIGNvZGUuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfVUxvbmcgKQotICBGVF9HZXRfRmlyc3RfQ2hhciggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAqYWdpbmRleCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X05leHRfQ2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHVybiB0aGUgbmV4dCBjaGFyYWN0ZXIgY29kZSBpbiB0aGUgICAgICovCi0gIC8qICAgIGN1cnJlbnQgY2hhcm1hcCBvZiBhIGdpdmVuIGZhY2UgZm9sbG93aW5nIHRoZSB2YWx1ZSBgY2hhcl9jb2RlJywgICAqLwotICAvKiAgICBhcyB3ZWxsIGFzIHRoZSBjb3JyZXNwb25kaW5nIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcl9jb2RlIDo6IFRoZSBzdGFydGluZyBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWdpbmRleCAgIDo6IEdseXBoIGluZGV4IG9mIG5leHQgY2hhcmFjdGVyIGNvZGUuICAwfmlmIGNoYXJtYXAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBpcyBlbXB0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBjaGFybWFwJ3MgbmV4dCBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFlvdSBzaG91bGQgdXNlIHRoaXMgZnVuY3Rpb24gd2l0aCBARlRfR2V0X0ZpcnN0X0NoYXIgdG8gd2FsayAgICAgICAqLwotICAvKiAgICBvdmVyIGFsbCBjaGFyYWN0ZXIgY29kZXMgYXZhaWxhYmxlIGluIGEgZ2l2ZW4gY2hhcm1hcC4gIFNlZSB0aGUgICAgKi8KLSAgLyogICAgbm90ZSBmb3IgdGhpcyBmdW5jdGlvbiBmb3IgYSBzaW1wbGUgY29kZSBleGFtcGxlLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3RlIHRoYXQgYCphZ2luZGV4JyBpcyBzZXQgdG9+MCB3aGVuIHRoZXJlIGFyZSBubyBtb3JlIGNvZGVzIGluICAgKi8KLSAgLyogICAgdGhlIGNoYXJtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX1VMb25nICkKLSAgRlRfR2V0X05leHRfQ2hhciggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGNoYXJfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICphZ2luZGV4ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfTmFtZV9JbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gdGhlIGdseXBoIGluZGV4IG9mIGEgZ2l2ZW4gZ2x5cGggbmFtZS4gIFRoaXMgZnVuY3Rpb24gdXNlcyAgKi8KLSAgLyogICAgZHJpdmVyIHNwZWNpZmljIG9iamVjdHMgdG8gZG8gdGhlIHRyYW5zbGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9uYW1lIDo6IFRoZSBnbHlwaCBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZ2x5cGggaW5kZXguICAwfm1lYW5zIGB1bmRlZmluZWQgY2hhcmFjdGVyIGNvZGUnLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfVUludCApCi0gIEZUX0dldF9OYW1lX0luZGV4KCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyaW5nKiAgZ2x5cGhfbmFtZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX1NVQkdMWVBIX0ZMQUdfWFhYCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGxpc3Qgb2YgY29uc3RhbnRzIHVzZWQgdG8gZGVzY3JpYmUgc3ViZ2x5cGhzLiAgUGxlYXNlIHJlZmVyIHRvIHRoZQotICAgKiAgIFRydWVUeXBlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBtZWFuaW5nIG9mIHRoZSB2YXJpb3VzIGZsYWdzLgotICAgKgotICAgKiBAdmFsdWVzOgotICAgKiAgIEZUX1NVQkdMWVBIX0ZMQUdfQVJHU19BUkVfV09SRFMgOjoKLSAgICogICBGVF9TVUJHTFlQSF9GTEFHX0FSR1NfQVJFX1hZX1ZBTFVFUyA6OgotICAgKiAgIEZUX1NVQkdMWVBIX0ZMQUdfUk9VTkRfWFlfVE9fR1JJRCA6OgotICAgKiAgIEZUX1NVQkdMWVBIX0ZMQUdfU0NBTEUgOjoKLSAgICogICBGVF9TVUJHTFlQSF9GTEFHX1hZX1NDQUxFIDo6Ci0gICAqICAgRlRfU1VCR0xZUEhfRkxBR18yWDIgOjoKLSAgICogICBGVF9TVUJHTFlQSF9GTEFHX1VTRV9NWV9NRVRSSUNTIDo6Ci0gICAqCi0gICAqLwotI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHX0FSR1NfQVJFX1dPUkRTICAgICAgICAgIDEKLSNkZWZpbmUgRlRfU1VCR0xZUEhfRkxBR19BUkdTX0FSRV9YWV9WQUxVRVMgICAgICAyCi0jZGVmaW5lIEZUX1NVQkdMWVBIX0ZMQUdfUk9VTkRfWFlfVE9fR1JJRCAgICAgICAgNAotI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHX1NDQUxFICAgICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgRlRfU1VCR0xZUEhfRkxBR19YWV9TQ0FMRSAgICAgICAgICAgICAweDQwCi0jZGVmaW5lIEZUX1NVQkdMWVBIX0ZMQUdfMlgyICAgICAgICAgICAgICAgICAgMHg4MAotI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHX1VTRV9NWV9NRVRSSUNTICAgICAgMHgyMDAKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jOgotICAgKiAgIEZUX0dldF9TdWJHbHlwaF9JbmZvCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXRyaWV2ZSBhIGRlc2NyaXB0aW9uIG9mIGEgZ2l2ZW4gc3ViZ2x5cGguICBPbmx5IHVzZSBpdCBpZgotICAgKiAgIGBnbHlwaC0+Zm9ybWF0JyBpcyBARlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURTsgYW4gZXJyb3IgaXMKLSAgICogICByZXR1cm5lZCBvdGhlcndpc2UuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBnbHlwaCA6OgotICAgKiAgICAgVGhlIHNvdXJjZSBnbHlwaCBzbG90LgotICAgKgotICAgKiAgIHN1Yl9pbmRleCA6OgotICAgKiAgICAgVGhlIGluZGV4IG9mIHRoZSBzdWJnbHlwaC4gIE11c3QgYmUgbGVzcyB0aGFuCi0gICAqICAgICBgZ2x5cGgtPm51bV9zdWJnbHlwaHMnLgotICAgKgotICAgKiBAb3V0cHV0OgotICAgKiAgIHBfaW5kZXggOjoKLSAgICogICAgIFRoZSBnbHlwaCBpbmRleCBvZiB0aGUgc3ViZ2x5cGguCi0gICAqCi0gICAqICAgcF9mbGFncyA6OgotICAgKiAgICAgVGhlIHN1YmdseXBoIGZsYWdzLCBzZWUgQEZUX1NVQkdMWVBIX0ZMQUdfWFhYLgotICAgKgotICAgKiAgIHBfYXJnMSA6OgotICAgKiAgICAgVGhlIHN1YmdseXBoJ3MgZmlyc3QgYXJndW1lbnQgKGlmIGFueSkuCi0gICAqCi0gICAqICAgcF9hcmcyIDo6Ci0gICAqICAgICBUaGUgc3ViZ2x5cGgncyBzZWNvbmQgYXJndW1lbnQgKGlmIGFueSkuCi0gICAqCi0gICAqICAgcF90cmFuc2Zvcm0gOjoKLSAgICogICAgIFRoZSBzdWJnbHlwaCB0cmFuc2Zvcm1hdGlvbiAoaWYgYW55KS4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGUgdmFsdWVzIG9mIGAqcF9hcmcxJywgYCpwX2FyZzInLCBhbmQgYCpwX3RyYW5zZm9ybScgbXVzdCBiZQotICAgKiAgIGludGVycHJldGVkIGRlcGVuZGluZyBvbiB0aGUgZmxhZ3MgcmV0dXJuZWQgaW4gYCpwX2ZsYWdzJy4gIFNlZSB0aGUKLSAgICogICBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9TdWJHbHlwaF9JbmZvKCBGVF9HbHlwaFNsb3QgIGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBzdWJfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgKnBfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgKnBfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgKnBfYXJnMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAqcF9hcmcyLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWF0cml4ICAgICpwX3RyYW5zZm9ybSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRlNUWVBFX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBsaXN0IG9mIGJpdCBmbGFncyB1c2VkIGluIHRoZSBgZnNUeXBlJyBmaWVsZCBvZiB0aGUgT1MvMiB0YWJsZSAgICovCi0gIC8qICAgIGluIGEgVHJ1ZVR5cGUgb3IgT3BlblR5cGUgZm9udCBhbmQgdGhlIGBGU1R5cGUnIGVudHJ5IGluIGEgICAgICAgICAqLwotICAvKiAgICBQb3N0U2NyaXB0IGZvbnQuICBUaGVzZSBiaXQgZmxhZ3MgYXJlIHJldHVybmVkIGJ5ICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0dldF9GU1R5cGVfRmxhZ3M7IHRoZXkgaW5mb3JtIGNsaWVudCBhcHBsaWNhdGlvbnMgb2YgZW1iZWRkaW5nICovCi0gIC8qICAgIGFuZCBzdWJzZXR0aW5nIHJlc3RyaWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBmb250LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VlIGh0dHA6Ly93d3cuYWRvYmUuY29tL2Rldm5ldC9hY3JvYmF0L3BkZnMvRm9udFBvbGljaWVzLnBkZiBmb3IgICovCi0gIC8qICAgIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZTVFlQRV9JTlNUQUxMQUJMRV9FTUJFRERJTkcgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEZvbnRzIHdpdGggbm8gZnNUeXBlIGJpdCBzZXQgbWF5IGJlIGVtYmVkZGVkIGFuZCBwZXJtYW5lbnRseSAgICAgKi8KLSAgLyogICAgICBpbnN0YWxsZWQgb24gdGhlIHJlbW90ZSBzeXN0ZW0gYnkgYW4gYXBwbGljYXRpb24uICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GU1RZUEVfUkVTVFJJQ1RFRF9MSUNFTlNFX0VNQkVERElORyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGb250cyB0aGF0IGhhdmUgb25seSB0aGlzIGJpdCBzZXQgbXVzdCBub3QgYmUgbW9kaWZpZWQsIGVtYmVkZGVkICovCi0gIC8qICAgICAgb3IgZXhjaGFuZ2VkIGluIGFueSBtYW5uZXIgd2l0aG91dCBmaXJzdCBvYnRhaW5pbmcgcGVybWlzc2lvbiBvZiAqLwotICAvKiAgICAgIHRoZSBmb250IHNvZnR3YXJlIGNvcHlyaWdodCBvd25lci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZTVFlQRV9QUkVWSUVXX0FORF9QUklOVF9FTUJFRERJTkcgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIElmIHRoaXMgYml0IGlzIHNldCwgdGhlIGZvbnQgbWF5IGJlIGVtYmVkZGVkIGFuZCB0ZW1wb3JhcmlseSAgICAgKi8KLSAgLyogICAgICBsb2FkZWQgb24gdGhlIHJlbW90ZSBzeXN0ZW0uICBEb2N1bWVudHMgY29udGFpbmluZyBQcmV2aWV3ICYgICAgICovCi0gIC8qICAgICAgUHJpbnQgZm9udHMgbXVzdCBiZSBvcGVuZWQgYHJlYWQtb25seSc7IG5vIGVkaXRzIGNhbiBiZSBhcHBsaWVkICAqLwotICAvKiAgICAgIHRvIHRoZSBkb2N1bWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZTVFlQRV9FRElUQUJMRV9FTUJFRERJTkcgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIElmIHRoaXMgYml0IGlzIHNldCwgdGhlIGZvbnQgbWF5IGJlIGVtYmVkZGVkIGJ1dCBtdXN0IG9ubHkgYmUgICAgKi8KLSAgLyogICAgICBpbnN0YWxsZWQgdGVtcG9yYXJpbHkgb24gb3RoZXIgc3lzdGVtcy4gIEluIGNvbnRyYXN0IHRvIFByZXZpZXcgICovCi0gIC8qICAgICAgJiBQcmludCBmb250cywgZG9jdW1lbnRzIGNvbnRhaW5pbmcgZWRpdGFibGUgZm9udHMgbWF5IGJlIG9wZW5lZCAqLwotICAvKiAgICAgIGZvciByZWFkaW5nLCBlZGl0aW5nIGlzIHBlcm1pdHRlZCwgYW5kIGNoYW5nZXMgbWF5IGJlIHNhdmVkLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZTVFlQRV9OT19TVUJTRVRUSU5HIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIElmIHRoaXMgYml0IGlzIHNldCwgdGhlIGZvbnQgbWF5IG5vdCBiZSBzdWJzZXR0ZWQgcHJpb3IgdG8gICAgICAgKi8KLSAgLyogICAgICBlbWJlZGRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GU1RZUEVfQklUTUFQX0VNQkVERElOR19PTkxZIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBJZiB0aGlzIGJpdCBpcyBzZXQsIG9ubHkgYml0bWFwcyBjb250YWluZWQgaW4gdGhlIGZvbnQgbWF5IGJlICAgICovCi0gIC8qICAgICAgZW1iZWRkZWQ7IG5vIG91dGxpbmUgZGF0YSBtYXkgYmUgZW1iZWRkZWQuICBJZiB0aGVyZSBhcmUgbm8gICAgICAqLwotICAvKiAgICAgIGJpdG1hcHMgYXZhaWxhYmxlIGluIHRoZSBmb250LCB0aGVuIHRoZSBmb250IGlzIHVuZW1iZWRkYWJsZS4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXaGlsZSB0aGUgZnNUeXBlIGZsYWdzIGNhbiBpbmRpY2F0ZSB0aGF0IGEgZm9udCBtYXkgYmUgZW1iZWRkZWQsIGEgKi8KLSAgLyogICAgbGljZW5zZSB3aXRoIHRoZSBmb250IHZlbmRvciBtYXkgYmUgc2VwYXJhdGVseSByZXF1aXJlZCB0byB1c2UgdGhlICovCi0gIC8qICAgIGZvbnQgaW4gdGhpcyB3YXkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfRlNUWVBFX0lOU1RBTExBQkxFX0VNQkVERElORyAgICAgICAgIDB4MDAwMAotI2RlZmluZSBGVF9GU1RZUEVfUkVTVFJJQ1RFRF9MSUNFTlNFX0VNQkVERElORyAgMHgwMDAyCi0jZGVmaW5lIEZUX0ZTVFlQRV9QUkVWSUVXX0FORF9QUklOVF9FTUJFRERJTkcgICAweDAwMDQKLSNkZWZpbmUgRlRfRlNUWVBFX0VESVRBQkxFX0VNQkVERElORyAgICAgICAgICAgIDB4MDAwOAotI2RlZmluZSBGVF9GU1RZUEVfTk9fU1VCU0VUVElORyAgICAgICAgICAgICAgICAgMHgwMTAwCi0jZGVmaW5lIEZUX0ZTVFlQRV9CSVRNQVBfRU1CRURESU5HX09OTFkgICAgICAgICAweDAyMDAKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9GU1R5cGVfRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgZnNUeXBlIGZsYWdzIGZvciBhIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmc1R5cGUgZmxhZ3MsIEBGVF9GU1RZUEVfWFhYLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZSB0aGlzIGZ1bmN0aW9uIHJhdGhlciB0aGFuIGRpcmVjdGx5IHJlYWRpbmcgdGhlIGBmc190eXBlJyBmaWVsZCAqLwotICAvKiAgICBpbiB0aGUgQFBTX0ZvbnRJbmZvUmVjIHN0cnVjdHVyZSwgd2hpY2ggaXMgb25seSBndWFyYW50ZWVkIHRvICAgICAgKi8KLSAgLyogICAgcmV0dXJuIHRoZSBjb3JyZWN0IHJlc3VsdHMgZm9yIFR5cGV+MSBmb250cy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2luY2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMi4zLjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX1VTaG9ydCApCi0gIEZUX0dldF9GU1R5cGVfRmxhZ3MoIEZUX0ZhY2UgIGZhY2UgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX3ZhcmlhbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdseXBoIFZhcmlhbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBGcmVlVHlwZX4yIGludGVyZmFjZSB0byBVbmljb2RlIElkZW9ncmFwaGljIFZhcmlhdGlvbiAgICAgICAgICAqLwotICAvKiAgICBTZXF1ZW5jZXMgKElWUyksIHVzaW5nIHRoZSBTRk5UIGNtYXAgZm9ybWF0fjE0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBNYW55IENKSyBjaGFyYWN0ZXJzIGhhdmUgdmFyaWFudCBmb3Jtcy4gIFRoZXkgYXJlIGEgc29ydCBvZiBncmV5ICAgKi8KLSAgLyogICAgYXJlYSBzb21ld2hlcmUgYmV0d2VlbiBiZWluZyB0b3RhbGx5IGlycmVsZXZhbnQgYW5kIHNlbWFudGljYWxseSAgICovCi0gIC8qICAgIGRpc3RpbmN0OyBmb3IgdGhpcyByZWFzb24sIHRoZSBVbmljb2RlIGNvbnNvcnRpdW0gZGVjaWRlZCB0byAgICAgICAqLwotICAvKiAgICBpbnRyb2R1Y2UgSWRlb2dyYXBoaWMgVmFyaWF0aW9uIFNlcXVlbmNlcyAoSVZTKSwgY29uc2lzdGluZyBvZiBhICAgKi8KLSAgLyogICAgVW5pY29kZSBiYXNlIGNoYXJhY3RlciBhbmQgb25lIG9mIDI0MCB2YXJpYW50IHNlbGVjdG9ycyAgICAgICAgICAgICovCi0gIC8qICAgIChVK0UwMTAwLVUrRTAxRUYpLCBpbnN0ZWFkIG9mIGZ1cnRoZXIgZXh0ZW5kaW5nIHRoZSBhbHJlYWR5IGh1Z2UgICAqLwotICAvKiAgICBjb2RlIHJhbmdlIGZvciBDSksgY2hhcmFjdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIElWUyBpcyByZWdpc3RlcmVkIGFuZCB1bmlxdWU7IGZvciBmdXJ0aGVyIGRldGFpbHMgcGxlYXNlIHJlZmVyICAqLwotICAvKiAgICB0byBVbmljb2RlIFRlY2huaWNhbCBTdGFuZGFyZCAjMzcsIHRoZSBJZGVvZ3JhcGhpYyBWYXJpYXRpb24gICAgICAgKi8KLSAgLyogICAgRGF0YWJhc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy90cjM3LyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRvIGRhdGUgKE5vdmVtYmVyIDIwMTQpLCB0aGUgY2hhcmFjdGVyIHdpdGggdGhlIG1vc3QgdmFyaWFudHMgaXMgICAqLwotICAvKiAgICBVKzkwODksIGhhdmluZyAzMiBzdWNoIElWUy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFkb2JlIGFuZCBNUyBkZWNpZGVkIHRvIHN1cHBvcnQgSVZTIHdpdGggYSBuZXcgY21hcCBzdWJ0YWJsZSAgICAgICAqLwotICAvKiAgICAoZm9ybWF0fjE0KS4gIEl0IGlzIGFuIG9kZCBzdWJ0YWJsZSBiZWNhdXNlIGl0IGlzIG5vdCBhIG1hcHBpbmcgb2YgKi8KLSAgLyogICAgaW5wdXQgY29kZSBwb2ludHMgdG8gZ2x5cGhzLCBidXQgY29udGFpbnMgbGlzdHMgb2YgYWxsIHZhcmlhbnRzICAgICovCi0gIC8qICAgIHN1cHBvcnRlZCBieSB0aGUgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB2YXJpYW50IG1heSBiZSBlaXRoZXIgYGRlZmF1bHQnIG9yIGBub24tZGVmYXVsdCcuICBBIGRlZmF1bHQgICAgICovCi0gIC8qICAgIHZhcmlhbnQgaXMgdGhlIG9uZSB5b3Ugd2lsbCBnZXQgZm9yIHRoYXQgY29kZSBwb2ludCBpZiB5b3UgbG9vayBpdCAqLwotICAvKiAgICB1cCBpbiB0aGUgc3RhbmRhcmQgVW5pY29kZSBjbWFwLiAgQSBub24tZGVmYXVsdCB2YXJpYW50IGlzIGEgICAgICAgKi8KLSAgLyogICAgZGlmZmVyZW50IGdseXBoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VfR2V0Q2hhclZhcmlhbnRJbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgZ2x5cGggaW5kZXggb2YgYSBnaXZlbiBjaGFyYWN0ZXIgY29kZSBhcyBtb2RpZmllZCBieSAgICAqLwotICAvKiAgICB0aGUgdmFyaWF0aW9uIHNlbGVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyY29kZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgY2hhcmFjdGVyIGNvZGUgcG9pbnQgaW4gVW5pY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2YXJpYW50U2VsZWN0b3IgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgVW5pY29kZSBjb2RlIHBvaW50IG9mIHRoZSB2YXJpYXRpb24gc2VsZWN0b3IuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGdseXBoIGluZGV4LiAgMH5tZWFucyBlaXRoZXIgYHVuZGVmaW5lZCBjaGFyYWN0ZXIgY29kZScsIG9yICAgICovCi0gIC8qICAgIGB1bmRlZmluZWQgc2VsZWN0b3IgY29kZScsIG9yIGBubyB2YXJpYXRpb24gc2VsZWN0b3IgY21hcCAgICAgICAgICAqLwotICAvKiAgICBzdWJ0YWJsZScsIG9yIGBjdXJyZW50IENoYXJNYXAgaXMgbm90IFVuaWNvZGUnLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB5b3UgdXNlIEZyZWVUeXBlIHRvIG1hbmlwdWxhdGUgdGhlIGNvbnRlbnRzIG9mIGZvbnQgZmlsZXMgICAgICAgKi8KLSAgLyogICAgZGlyZWN0bHksIGJlIGF3YXJlIHRoYXQgdGhlIGdseXBoIGluZGV4IHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gICovCi0gIC8qICAgIGRvZXNuJ3QgYWx3YXlzIGNvcnJlc3BvbmQgdG8gdGhlIGludGVybmFsIGluZGljZXMgdXNlZCB3aXRoaW4gICAgICAqLwotICAvKiAgICB0aGUgZmlsZS4gIFRoaXMgaXMgZG9uZSB0byBlbnN1cmUgdGhhdCB2YWx1ZX4wIGFsd2F5cyBjb3JyZXNwb25kcyAgKi8KLSAgLyogICAgdG8gdGhlIGBtaXNzaW5nIGdseXBoJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgbWVhbmluZ2Z1bCBpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBhKSB0aGUgZm9udCBoYXMgYSB2YXJpYXRpb24gc2VsZWN0b3IgY21hcCBzdWIgdGFibGUsICAgICAgICAgICAgICovCi0gIC8qICAgIGFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGIpIHRoZSBjdXJyZW50IGNoYXJtYXAgaGFzIGEgVW5pY29kZSBlbmNvZGluZy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTaW5jZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAyLjMuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfVUludCApCi0gIEZUX0ZhY2VfR2V0Q2hhclZhcmlhbnRJbmRleCggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIGNoYXJjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICB2YXJpYW50U2VsZWN0b3IgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VfR2V0Q2hhclZhcmlhbnRJc0RlZmF1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENoZWNrIHdoZXRoZXIgdGhpcyB2YXJpYW50IG9mIHRoaXMgVW5pY29kZSBjaGFyYWN0ZXIgaXMgdGhlIG9uZSB0byAqLwotICAvKiAgICBiZSBmb3VuZCBpbiB0aGUgYGNtYXAnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyY29kZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgY2hhcmFjdGVyIGNvZGVwb2ludCBpbiBVbmljb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2YXJpYW50U2VsZWN0b3IgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgVW5pY29kZSBjb2RlcG9pbnQgb2YgdGhlIHZhcmlhdGlvbiBzZWxlY3Rvci4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMX5pZiBmb3VuZCBpbiB0aGUgc3RhbmRhcmQgKFVuaWNvZGUpIGNtYXAsIDB+aWYgZm91bmQgaW4gdGhlICAgICAgICovCi0gIC8qICAgIHZhcmlhdGlvbiBzZWxlY3RvciBjbWFwLCBvciAtMSBpZiBpdCBpcyBub3QgYSB2YXJpYW50LiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgb25seSBtZWFuaW5nZnVsIGlmIHRoZSBmb250IGhhcyBhIHZhcmlhdGlvbiAgICAgICAqLwotICAvKiAgICBzZWxlY3RvciBjbWFwIHN1YnRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTaW5jZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAyLjMuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfSW50ICkKLSAgRlRfRmFjZV9HZXRDaGFyVmFyaWFudElzRGVmYXVsdCggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBjaGFyY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIHZhcmlhbnRTZWxlY3RvciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZV9HZXRWYXJpYW50U2VsZWN0b3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIGEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgVW5pY29kZSB2YXJpYW50IHNlbGVjdG9ycyBmb3VuZCAgICovCi0gIC8qICAgIGluIHRoZSBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2Ygc2VsZWN0b3IgY29kZSBwb2ludHMsIG9yIE5VTEwgaWYgdGhlcmUgaXMgKi8KLSAgLyogICAgbm8gdmFsaWQgdmFyaWFudCBzZWxlY3RvciBjbWFwIHN1YnRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGxhc3QgaXRlbSBpbiB0aGUgYXJyYXkgaXN+MDsgdGhlIGFycmF5IGlzIG93bmVkIGJ5IHRoZSAgICAgICAgICovCi0gIC8qICAgIEBGVF9GYWNlIG9iamVjdCBidXQgY2FuIGJlIG92ZXJ3cml0dGVuIG9yIHJlbGVhc2VkIG9uIHRoZSBuZXh0ICAgICAqLwotICAvKiAgICBjYWxsIHRvIGEgRnJlZVR5cGUgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTaW5jZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAyLjMuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfVUludDMyKiApCi0gIEZUX0ZhY2VfR2V0VmFyaWFudFNlbGVjdG9ycyggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZV9HZXRWYXJpYW50c09mQ2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIGEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgVW5pY29kZSB2YXJpYW50IHNlbGVjdG9ycyBmb3VuZCAgICovCi0gIC8qICAgIGZvciB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJjb2RlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBjaGFyYWN0ZXIgY29kZXBvaW50IGluIFVuaWNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdmFyaWFudCBzZWxlY3RvciBjb2RlIHBvaW50cyB0aGF0IGFyZSAgICAgKi8KLSAgLyogICAgYWN0aXZlIGZvciB0aGUgZ2l2ZW4gY2hhcmFjdGVyLCBvciBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIGxpc3QgICovCi0gIC8qICAgIGlzIGVtcHR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBsYXN0IGl0ZW0gaW4gdGhlIGFycmF5IGlzfjA7IHRoZSBhcnJheSBpcyBvd25lZCBieSB0aGUgICAgICAgICAqLwotICAvKiAgICBARlRfRmFjZSBvYmplY3QgYnV0IGNhbiBiZSBvdmVyd3JpdHRlbiBvciByZWxlYXNlZCBvbiB0aGUgbmV4dCAgICAgKi8KLSAgLyogICAgY2FsbCB0byBhIEZyZWVUeXBlIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2luY2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMi4zLjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX1VJbnQzMiogKQotICBGVF9GYWNlX0dldFZhcmlhbnRzT2ZDaGFyKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIGNoYXJjb2RlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GYWNlX0dldENoYXJzT2ZWYXJpYW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gYSB6ZXJvLXRlcm1pbmF0ZWQgbGlzdCBvZiBVbmljb2RlIGNoYXJhY3RlciBjb2RlcyBmb3VuZCBmb3IgKi8KLSAgLyogICAgdGhlIHNwZWNpZmllZCB2YXJpYW50IHNlbGVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmFyaWFudFNlbGVjdG9yIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIHZhcmlhbnQgc2VsZWN0b3IgY29kZSBwb2ludCBpbiBVbmljb2RlLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgbGlzdCBvZiBhbGwgdGhlIGNvZGUgcG9pbnRzIHRoYXQgYXJlIHNwZWNpZmllZCBieSB0aGlzIHNlbGVjdG9yICAqLwotICAvKiAgICAoYm90aCBkZWZhdWx0IGFuZCBub24tZGVmYXVsdCBjb2RlcyBhcmUgcmV0dXJuZWQpIG9yIE5VTEwgaWYgdGhlcmUgKi8KLSAgLyogICAgaXMgbm8gdmFsaWQgY21hcCBvciB0aGUgdmFyaWFudCBzZWxlY3RvciBpcyBpbnZhbGlkLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGxhc3QgaXRlbSBpbiB0aGUgYXJyYXkgaXN+MDsgdGhlIGFycmF5IGlzIG93bmVkIGJ5IHRoZSAgICAgICAgICovCi0gIC8qICAgIEBGVF9GYWNlIG9iamVjdCBidXQgY2FuIGJlIG92ZXJ3cml0dGVuIG9yIHJlbGVhc2VkIG9uIHRoZSBuZXh0ICAgICAqLwotICAvKiAgICBjYWxsIHRvIGEgRnJlZVR5cGUgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTaW5jZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAyLjMuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfVUludDMyKiApCi0gIEZUX0ZhY2VfR2V0Q2hhcnNPZlZhcmlhbnQoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgdmFyaWFudFNlbGVjdG9yICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb21wdXRhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDcnVuY2hpbmcgZml4ZWQgbnVtYmVycyBhbmQgdmVjdG9ycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdmFyaW91cyBmdW5jdGlvbnMgdXNlZCB0byBwZXJmb3JtICAgICAgICAgICAgKi8KLSAgLyogICAgY29tcHV0YXRpb25zIG9uIDE2LjE2IGZpeGVkLWZsb2F0IG51bWJlcnMgb3IgMmQgdmVjdG9ycy4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3JkZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTXVsRGl2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX011bEZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9EaXZGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUm91bmRGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0NlaWxGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GbG9vckZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVmVjdG9yX1RyYW5zZm9ybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01hdHJpeF9NdWx0aXBseSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NYXRyaXhfSW52ZXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTXVsRGl2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB2ZXJ5IHNpbXBsZSBmdW5jdGlvbiB1c2VkIHRvIHBlcmZvcm0gdGhlIGNvbXB1dGF0aW9uIGAoYSpiKS9jJyAgICovCi0gIC8qICAgIHdpdGggbWF4aW11bSBhY2N1cmFjeSAoaXQgdXNlcyBhIDY0LWJpdCBpbnRlcm1lZGlhdGUgaW50ZWdlciAgICAgICAqLwotICAvKiAgICB3aGVuZXZlciBuZWNlc3NhcnkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXNuJ3QgbmVjZXNzYXJpbHkgYXMgZmFzdCBhcyBzb21lIHByb2Nlc3NvciBzcGVjaWZpYyAqLwotICAvKiAgICBvcGVyYXRpb25zLCBidXQgaXMgYXQgbGVhc3QgY29tcGxldGVseSBwb3J0YWJsZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhIDo6IFRoZSBmaXJzdCBtdWx0aXBsaWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYiA6OiBUaGUgc2Vjb25kIG11bHRpcGxpZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGMgOjogVGhlIGRpdmlzb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXN1bHQgb2YgYChhKmIpL2MnLiAgVGhpcyBmdW5jdGlvbiBuZXZlciB0cmFwcyB3aGVuIHRyeWluZyB0byAqLwotICAvKiAgICBkaXZpZGUgYnkgemVybzsgaXQgc2ltcGx5IHJldHVybnMgYE1heEludCcgb3IgYE1pbkludCcgZGVwZW5kaW5nICAgKi8KLSAgLyogICAgb24gdGhlIHNpZ25zIG9mIGBhJyBhbmQgYGInLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0xvbmcgKQotICBGVF9NdWxEaXYoIEZUX0xvbmcgIGEsCi0gICAgICAgICAgICAgRlRfTG9uZyAgYiwKLSAgICAgICAgICAgICBGVF9Mb25nICBjICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NdWxGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHZlcnkgc2ltcGxlIGZ1bmN0aW9uIHVzZWQgdG8gcGVyZm9ybSB0aGUgY29tcHV0YXRpb24gICAgICAgICAgICAgKi8KLSAgLyogICAgYChhKmIpLzB4MTAwMDAnIHdpdGggbWF4aW11bSBhY2N1cmFjeS4gIE1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBpcyAgICovCi0gIC8qICAgIHVzZWQgdG8gbXVsdGlwbHkgYSBnaXZlbiB2YWx1ZSBieSBhIDE2LjE2IGZpeGVkLXBvaW50IGZhY3Rvci4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGEgOjogVGhlIGZpcnN0IG11bHRpcGxpZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiIDo6IFRoZSBzZWNvbmQgbXVsdGlwbGllci4gIFVzZSBhIDE2LjE2IGZhY3RvciBoZXJlIHdoZW5ldmVyICAgICAgKi8KLSAgLyogICAgICAgICBwb3NzaWJsZSAoc2VlIG5vdGUgYmVsb3cpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlc3VsdCBvZiBgKGEqYikvMHgxMDAwMCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBoYXMgYmVlbiBvcHRpbWl6ZWQgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSBhYnNvbHV0ZSAgICovCi0gIC8qICAgIHZhbHVlIG9mIGBhJyBpcyBsZXNzIHRoYW4gMjA0OCwgYW5kIGBiJyBpcyBhIDE2LjE2IHNjYWxpbmcgZmFjdG9yLiAqLwotICAvKiAgICBBcyB0aGlzIGhhcHBlbnMgbWFpbmx5IHdoZW4gc2NhbGluZyBmcm9tIG5vdGlvbmFsIHVuaXRzIHRvICAgICAgICAgKi8KLSAgLyogICAgZnJhY3Rpb25hbCBwaXhlbHMgaW4gRnJlZVR5cGUsIGl0IHJlc3VsdGVkIGluIG5vdGljZWFibGUgc3BlZWQgICAgICovCi0gIC8qICAgIGltcHJvdmVtZW50cyBiZXR3ZWVuIHZlcnNpb25zIDIueCBhbmQgMS54LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQXMgYSBjb25jbHVzaW9uLCBhbHdheXMgdHJ5IHRvIHBsYWNlIGEgMTYuMTYgZmFjdG9yIGFzIHRoZSAgICAgICAgICovCi0gIC8qICAgIF9zZWNvbmRfIGFyZ3VtZW50IG9mIHRoaXMgZnVuY3Rpb247IHRoaXMgY2FuIG1ha2UgYSBncmVhdCAgICAgICAgICAqLwotICAvKiAgICBkaWZmZXJlbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfTG9uZyApCi0gIEZUX011bEZpeCggRlRfTG9uZyAgYSwKLSAgICAgICAgICAgICBGVF9Mb25nICBiICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9EaXZGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHZlcnkgc2ltcGxlIGZ1bmN0aW9uIHVzZWQgdG8gcGVyZm9ybSB0aGUgY29tcHV0YXRpb24gICAgICAgICAgICAgKi8KLSAgLyogICAgYChhKjB4MTAwMDApL2InIHdpdGggbWF4aW11bSBhY2N1cmFjeS4gIE1vc3Qgb2YgdGhlIHRpbWUsIHRoaXMgaXMgICovCi0gIC8qICAgIHVzZWQgdG8gZGl2aWRlIGEgZ2l2ZW4gdmFsdWUgYnkgYSAxNi4xNiBmaXhlZC1wb2ludCBmYWN0b3IuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGEgOjogVGhlIG51bWVyYXRvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiIDo6IFRoZSBkZW5vbWluYXRvci4gIFVzZSBhIDE2LjE2IGZhY3RvciBoZXJlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmVzdWx0IG9mIGAoYSoweDEwMDAwKS9iJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfTG9uZyApCi0gIEZUX0RpdkZpeCggRlRfTG9uZyAgYSwKLSAgICAgICAgICAgICBGVF9Mb25nICBiICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Sb3VuZEZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHZlcnkgc2ltcGxlIGZ1bmN0aW9uIHVzZWQgdG8gcm91bmQgYSAxNi4xNiBmaXhlZCBudW1iZXIuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhIDo6IFRoZSBudW1iZXIgdG8gYmUgcm91bmRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmVzdWx0IG9mIGAoYSArIDB4ODAwMCkgJiAtMHgxMDAwMCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRml4ZWQgKQotICBGVF9Sb3VuZEZpeCggRlRfRml4ZWQgIGEgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0NlaWxGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdmVyeSBzaW1wbGUgZnVuY3Rpb24gdXNlZCB0byBjb21wdXRlIHRoZSBjZWlsaW5nIGZ1bmN0aW9uIG9mIGEgICAqLwotICAvKiAgICAxNi4xNiBmaXhlZCBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhIDo6IFRoZSBudW1iZXIgZm9yIHdoaWNoIHRoZSBjZWlsaW5nIGZ1bmN0aW9uIGlzIHRvIGJlIGNvbXB1dGVkLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmVzdWx0IG9mIGAoYSArIDB4MTAwMDAgLSAxKSAmIC0weDEwMDAwJy4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRml4ZWQgKQotICBGVF9DZWlsRml4KCBGVF9GaXhlZCAgYSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmxvb3JGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB2ZXJ5IHNpbXBsZSBmdW5jdGlvbiB1c2VkIHRvIGNvbXB1dGUgdGhlIGZsb29yIGZ1bmN0aW9uIG9mIGEgICAgICovCi0gIC8qICAgIDE2LjE2IGZpeGVkIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGEgOjogVGhlIG51bWJlciBmb3Igd2hpY2ggdGhlIGZsb29yIGZ1bmN0aW9uIGlzIHRvIGJlIGNvbXB1dGVkLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXN1bHQgb2YgYGEgJiAtMHgxMDAwMCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9GaXhlZCApCi0gIEZUX0Zsb29yRml4KCBGVF9GaXhlZCAgYSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVmVjdG9yX1RyYW5zZm9ybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVHJhbnNmb3JtIGEgc2luZ2xlIHZlY3RvciB0aHJvdWdoIGEgMngyIG1hdHJpeC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVjdG9yIDo6IFRoZSB0YXJnZXQgdmVjdG9yIHRvIHRyYW5zZm9ybS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF0cml4IDo6IEEgcG9pbnRlciB0byB0aGUgc291cmNlIDJ4MiBtYXRyaXguICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlc3VsdCBpcyB1bmRlZmluZWQgaWYgZWl0aGVyIGB2ZWN0b3InIG9yIGBtYXRyaXgnIGlzIGludmFsaWQuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9WZWN0b3JfVHJhbnNmb3JtKCBGVF9WZWN0b3IqICAgICAgICB2ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX01hdHJpeCogIG1hdHJpeCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnVuY3Rpb25zIGFuZCBtYWNyb3MgcmVsYXRlZCB0byBGcmVlVHlwZSB2ZXJzaW9ucy4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IHRob3NlIGZ1bmN0aW9ucyBhbmQgbWFjcm9zIGFyZSBvZiBsaW1pdGVkIHVzZSBiZWNhdXNlICAgICovCi0gIC8qICAgIGV2ZW4gYSBuZXcgcmVsZWFzZSBvZiBGcmVlVHlwZSB3aXRoIG9ubHkgZG9jdW1lbnRhdGlvbiBjaGFuZ2VzICAgICAqLwotICAvKiAgICBpbmNyZWFzZXMgdGhlIHZlcnNpb24gbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPcmRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaWJyYXJ5X1ZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZSRUVUWVBFX01BSk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGUkVFVFlQRV9NSU5PUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlJFRVRZUEVfUEFUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GYWNlX0NoZWNrVHJ1ZVR5cGVQYXRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZV9TZXRVbnBhdGVudGVkSGludGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGUkVFVFlQRV9YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGVudW06Ci0gICAqICAgRlJFRVRZUEVfWFhYCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGVzZSB0aHJlZSBtYWNyb3MgaWRlbnRpZnkgdGhlIEZyZWVUeXBlIHNvdXJjZSBjb2RlIHZlcnNpb24uCi0gICAqICAgVXNlIEBGVF9MaWJyYXJ5X1ZlcnNpb24gdG8gYWNjZXNzIHRoZW0gYXQgcnVudGltZS4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBGUkVFVFlQRV9NQUpPUiA6OiBUaGUgbWFqb3IgdmVyc2lvbiBudW1iZXIuCi0gICAqICAgRlJFRVRZUEVfTUlOT1IgOjogVGhlIG1pbm9yIHZlcnNpb24gbnVtYmVyLgotICAgKiAgIEZSRUVUWVBFX1BBVENIIDo6IFRoZSBwYXRjaCBsZXZlbC4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhlIHZlcnNpb24gbnVtYmVyIG9mIEZyZWVUeXBlIGlmIGJ1aWx0IGFzIGEgZHluYW1pYyBsaW5rIGxpYnJhcnkKLSAgICogICB3aXRoIHRoZSBgbGlidG9vbCcgcGFja2FnZSBpcyBfbm90XyBjb250cm9sbGVkIGJ5IHRoZXNlIHRocmVlCi0gICAqICAgbWFjcm9zLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlJFRVRZUEVfTUFKT1IgIDIKLSNkZWZpbmUgRlJFRVRZUEVfTUlOT1IgIDUKLSNkZWZpbmUgRlJFRVRZUEVfUEFUQ0ggIDQKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpYnJhcnlfVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgRnJlZVR5cGUgbGlicmFyeSBiZWluZyB1c2VkLiAgVGhpcyBpcyAgICAqLwotICAvKiAgICB1c2VmdWwgd2hlbiBkeW5hbWljYWxseSBsaW5raW5nIHRvIHRoZSBsaWJyYXJ5LCBzaW5jZSBvbmUgY2Fubm90ICAgKi8KLSAgLyogICAgdXNlIHRoZSBtYWNyb3MgQEZSRUVUWVBFX01BSk9SLCBARlJFRVRZUEVfTUlOT1IsIGFuZCAgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGUkVFVFlQRV9QQVRDSC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBzb3VyY2UgbGlicmFyeSBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFtYWpvciAgOjogVGhlIG1ham9yIHZlcnNpb24gbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYW1pbm9yICA6OiBUaGUgbWlub3IgdmVyc2lvbiBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhcGF0Y2ggIDo6IFRoZSBwYXRjaCB2ZXJzaW9uIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmVhc29uIHdoeSB0aGlzIGZ1bmN0aW9uIHRha2VzIGEgYGxpYnJhcnknIGFyZ3VtZW50IGlzIGJlY2F1c2UgKi8KLSAgLyogICAgY2VydGFpbiBwcm9ncmFtcyBpbXBsZW1lbnQgbGlicmFyeSBpbml0aWFsaXphdGlvbiBpbiBhIGN1c3RvbSB3YXkgICovCi0gIC8qICAgIHRoYXQgZG9lc24ndCB1c2UgQEZUX0luaXRfRnJlZVR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW4gc3VjaCBjYXNlcywgdGhlIGxpYnJhcnkgdmVyc2lvbiBtaWdodCBub3QgYmUgYXZhaWxhYmxlIGJlZm9yZSAgICovCi0gIC8qICAgIHRoZSBsaWJyYXJ5IG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfTGlicmFyeV9WZXJzaW9uKCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAqYW1ham9yLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICphbWlub3IsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgKmFwYXRjaCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZV9DaGVja1RydWVUeXBlUGF0ZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUGFyc2UgYWxsIGJ5dGVjb2RlIGluc3RydWN0aW9ucyBvZiBhIFRydWVUeXBlIGZvbnQgZmlsZSB0byBjaGVjayAgICovCi0gIC8qICAgIHdoZXRoZXIgYW55IG9mIHRoZSBwYXRlbnRlZCBvcGNvZGVzIGFyZSB1c2VkLiAgVGhpcyBpcyBvbmx5IHVzZWZ1bCAqLwotICAvKiAgICBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHVzZSB0aGUgdW5wYXRlbnRlZCBoaW50ZXIgd2l0aCAgICAgICAgICAgKi8KLSAgLyogICAgZm9udHMgdGhhdCBkbyAqbm90KiB1c2UgdGhlc2Ugb3Bjb2Rlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBwYXJzZXMgKmFsbCogZ2x5cGggaW5zdHJ1Y3Rpb25zIGluIHRoZSAgICAgKi8KLSAgLyogICAgZm9udCBmaWxlLCB3aGljaCBtYXkgYmUgc2xvdy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBBIGZhY2UgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMX5pZiB0aGlzIGlzIGEgVHJ1ZVR5cGUgZm9udCB0aGF0IHVzZXMgb25lIG9mIHRoZSBwYXRlbnRlZCAgICAgICAgICovCi0gIC8qICAgIG9wY29kZXMsIDB+b3RoZXJ3aXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNpbmNlIE1heSAyMDEwLCBUcnVlVHlwZSBoaW50aW5nIGlzIG5vIGxvbmdlciBwYXRlbnRlZC4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNpbmNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIDIuMy41ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9Cb29sICkKLSAgRlRfRmFjZV9DaGVja1RydWVUeXBlUGF0ZW50cyggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZV9TZXRVbnBhdGVudGVkSGludGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIHVucGF0ZW50ZWQgaGludGVyIGZvciBhIGdpdmVuIGZhY2UuICAgICAgICAgICovCi0gIC8qICAgIE9ubHkgZW5hYmxlIGl0IGlmIHlvdSBoYXZlIGRldGVybWluZWQgdGhhdCB0aGUgZmFjZSBkb2Vzbid0ICAgICAgICAqLwotICAvKiAgICB1c2UgYW55IHBhdGVudGVkIG9wY29kZXMgKHNlZSBARlRfRmFjZV9DaGVja1RydWVUeXBlUGF0ZW50cykuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICA6OiBBIGZhY2UgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZhbHVlIDo6IE5ldyBib29sZWFuIHNldHRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBvbGQgc2V0dGluZyB2YWx1ZS4gIFRoaXMgd2lsbCBhbHdheXMgYmUgZmFsc2UgaWYgdGhpcyBpcyBub3QgICAqLwotICAvKiAgICBhbiBTRk5UIGZvbnQsIG9yIGlmIHRoZSB1bnBhdGVudGVkIGhpbnRlciBpcyBub3QgY29tcGlsZWQgaW4gdGhpcyAgKi8KLSAgLyogICAgaW5zdGFuY2Ugb2YgdGhlIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2luY2UgTWF5IDIwMTAsIFRydWVUeXBlIGhpbnRpbmcgaXMgbm8gbG9uZ2VyIHBhdGVudGVkLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2luY2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMi4zLjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Jvb2wgKQotICBGVF9GYWNlX1NldFVucGF0ZW50ZWRIaW50aW5nKCBGVF9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICB2YWx1ZSApOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GUkVFVFlQRV9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZDc5OTMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oCkBAIC0wLDAgKzEsNDY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBmdGNvbmZpZy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQU5TSS1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGZpbGUgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGlzIGhlYWRlciBmaWxlIGNvbnRhaW5zIGEgbnVtYmVyIG9mIG1hY3JvIGRlZmluaXRpb25zIHRoYXQgYXJlIHVzZWQgKi8KKyAgLyogYnkgdGhlIHJlc3Qgb2YgdGhlIGVuZ2luZS4gIE1vc3Qgb2YgdGhlIG1hY3JvcyBoZXJlIGFyZSBhdXRvbWF0aWNhbGx5ICovCisgIC8qIGRldGVybWluZWQgYXQgY29tcGlsZSB0aW1lLCBhbmQgeW91IHNob3VsZCBub3QgbmVlZCB0byBjaGFuZ2UgaXQgdG8gICAqLworICAvKiBwb3J0IEZyZWVUeXBlLCBleGNlcHQgdG8gY29tcGlsZSB0aGUgbGlicmFyeSB3aXRoIGEgbm9uLUFOU0kgICAgICAgICAgKi8KKyAgLyogY29tcGlsZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBOb3RlIGhvd2V2ZXIgdGhhdCBpZiBzb21lIHNwZWNpZmljIG1vZGlmaWNhdGlvbnMgYXJlIG5lZWRlZCwgd2UgICAgICAgKi8KKyAgLyogYWR2aXNlIHlvdSB0byBwbGFjZSBhIG1vZGlmaWVkIGNvcHkgaW4geW91ciBidWlsZCBkaXJlY3RvcnkuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgYnVpbGQgZGlyZWN0b3J5IGlzIHVzdWFsbHkgYGJ1aWxkcy88c3lzdGVtPicsIGFuZCBjb250YWlucyAgICAgICAgKi8KKyAgLyogc3lzdGVtLXNwZWNpZmljIGZpbGVzIHRoYXQgYXJlIGFsd2F5cyBpbmNsdWRlZCBmaXJzdCB3aGVuIGJ1aWxkaW5nICAgICovCisgIC8qIHRoZSBsaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhpcyBBTlNJIHZlcnNpb24gc2hvdWxkIHN0YXkgaW4gYGluY2x1ZGUvY29uZmlnLycuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0ZUQ09ORklHX0hfXworI2RlZmluZSBfX0ZUQ09ORklHX0hfXworCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX0NPTkZJR19PUFRJT05TX0gKKyNpbmNsdWRlIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0gKKworCitGVF9CRUdJTl9IRUFERVIKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICBQTEFURk9STS1TUEVDSUZJQyBDT05GSUdVUkFUSU9OIE1BQ1JPUyAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGVzZSBtYWNyb3MgY2FuIGJlIHRvZ2dsZWQgdG8gc3VpdCBhIHNwZWNpZmljIHN5c3RlbS4gIFRoZSBjdXJyZW50ICAgKi8KKyAgLyogb25lcyBhcmUgZGVmYXVsdHMgdXNlZCB0byBjb21waWxlIEZyZWVUeXBlIGluIGFuIEFOU0kgQyBlbnZpcm9ubWVudCAgICovCisgIC8qICgxNmJpdCBjb21waWxlcnMgYXJlIGFsc28gc3VwcG9ydGVkKS4gIENvcHkgdGhpcyBmaWxlIHRvIHlvdXIgb3duICAgICAqLworICAvKiBgYnVpbGRzLzxzeXN0ZW0+JyBkaXJlY3RvcnksIGFuZCBlZGl0IGl0IHRvIHBvcnQgdGhlIGVuZ2luZS4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyogVGhlcmUgYXJlIHN5c3RlbXMgKGxpa2UgdGhlIFRleGFzIEluc3RydW1lbnRzICdDNTR4KSB3aGVyZSBhIGBjaGFyJyAqLworICAvKiBoYXMgMTYgYml0cy4gIEFOU0kgQyBzYXlzIHRoYXQgc2l6ZW9mKGNoYXIpIGlzIGFsd2F5cyAxLiAgU2luY2UgYW4gICovCisgIC8qIGBpbnQnIGhhcyAxNiBiaXRzIGFsc28gZm9yIHRoaXMgc3lzdGVtLCBzaXplb2YoaW50KSBnaXZlcyAxIHdoaWNoICAgKi8KKyAgLyogaXMgcHJvYmFibHkgdW5leHBlY3RlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIGBDSEFSX0JJVCcgKGRlZmluZWQgaW4gbGltaXRzLmgpIGdpdmVzIHRoZSBudW1iZXIgb2YgYml0cyBpbiBhICAgICAgKi8KKyAgLyogYGNoYXInIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjaWZuZGVmIEZUX0NIQVJfQklUCisjZGVmaW5lIEZUX0NIQVJfQklUICBDSEFSX0JJVAorI2VuZGlmCisKKworICAvKiBUaGUgc2l6ZSBvZiBhbiBgaW50JyB0eXBlLiAgKi8KKyNpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJTlRfTUFYID09IDB4RkZGRlVMCisjZGVmaW5lIEZUX1NJWkVPRl9JTlQgICgxNiAvIEZUX0NIQVJfQklUKQorI2VsaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUlOVF9NQVggPT0gMHhGRkZGRkZGRlVMCisjZGVmaW5lIEZUX1NJWkVPRl9JTlQgICgzMiAvIEZUX0NIQVJfQklUKQorI2VsaWYgRlRfVUlOVF9NQVggPiAweEZGRkZGRkZGVUwgJiYgRlRfVUlOVF9NQVggPT0gMHhGRkZGRkZGRkZGRkZGRkZGVUwKKyNkZWZpbmUgRlRfU0laRU9GX0lOVCAgKDY0IC8gRlRfQ0hBUl9CSVQpCisjZWxzZQorI2Vycm9yICJVbnN1cHBvcnRlZCBzaXplIG9mIGBpbnQnIHR5cGUhIgorI2VuZGlmCisKKyAgLyogVGhlIHNpemUgb2YgYSBgbG9uZycgdHlwZS4gIEEgZml2ZS1ieXRlIGBsb25nJyAoYXMgdXNlZCBlLmcuIG9uIHRoZSAqLworICAvKiBETTY0MikgaXMgcmVjb2duaXplZCBidXQgYXZvaWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxPTkdfTUFYID09IDB4RkZGRkZGRkZVTAorI2RlZmluZSBGVF9TSVpFT0ZfTE9ORyAgKDMyIC8gRlRfQ0hBUl9CSVQpCisjZWxpZiBGVF9VTE9OR19NQVggPiAweEZGRkZGRkZGVUwgJiYgRlRfVUxPTkdfTUFYID09IDB4RkZGRkZGRkZGRlVMCisjZGVmaW5lIEZUX1NJWkVPRl9MT05HICAoMzIgLyBGVF9DSEFSX0JJVCkKKyNlbGlmIEZUX1VMT05HX01BWCA+IDB4RkZGRkZGRkZVTCAmJiBGVF9VTE9OR19NQVggPT0gMHhGRkZGRkZGRkZGRkZGRkZGVUwKKyNkZWZpbmUgRlRfU0laRU9GX0xPTkcgICg2NCAvIEZUX0NIQVJfQklUKQorI2Vsc2UKKyNlcnJvciAiVW5zdXBwb3J0ZWQgc2l6ZSBvZiBgbG9uZycgdHlwZSEiCisjZW5kaWYKKworCisgIC8qIEZUX1VOVVNFRCBpcyBhIG1hY3JvIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIGdpdmVuIHBhcmFtZXRlciBpcyBub3QgICovCisgIC8qIHVzZWQgLS0gdGhpcyBpcyBvbmx5IHVzZWQgdG8gZ2V0IHJpZCBvZiB1bnBsZWFzYW50IGNvbXBpbGVyIHdhcm5pbmdzICovCisjaWZuZGVmIEZUX1VOVVNFRAorI2RlZmluZSBGVF9VTlVTRUQoIGFyZyApICAoIChhcmcpID0gKGFyZykgKQorI2VuZGlmCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgQVVUT01BVElDIENPTkZJR1VSQVRJT04gTUFDUk9TICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlc2UgbWFjcm9zIGFyZSBjb21wdXRlZCBmcm9tIHRoZSBvbmVzIGRlZmluZWQgYWJvdmUuICBEb24ndCB0b3VjaCAgICovCisgIC8qIHRoZWlyIGRlZmluaXRpb24sIHVubGVzcyB5b3Uga25vdyBwcmVjaXNlbHkgd2hhdCB5b3UgYXJlIGRvaW5nLiAgTm8gICAqLworICAvKiBwb3J0ZXIgc2hvdWxkIG5lZWQgdG8gbWVzcyB3aXRoIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBNYWMgc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgVGhpcyBpcyB0aGUgb25seSBuZWNlc3NhcnkgY2hhbmdlLCBzbyBpdCBpcyBkZWZpbmVkIGhlcmUgaW5zdGVhZCAgICAqLworICAvKiAgIHByb3ZpZGluZyBhIG5ldyBjb25maWd1cmF0aW9uIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWYgZGVmaW5lZCggX19BUFBMRV9fICkgfHwgKCBkZWZpbmVkKCBfX01XRVJLU19fICkgJiYgZGVmaW5lZCggbWFjaW50b3NoICkgKQorICAvKiBubyBDYXJib24gZnJhbWV3b3JrcyBmb3IgNjRiaXQgMTAuNC54ICovCisgIC8qIEF2YWlsYWJpbGl0eU1hY3Jvcy5oIGlzIGF2YWlsYWJsZSBzaW5jZSBNYWMgT1MgWCAxMC4yLCAgICAgICAgKi8KKyAgLyogc28gZ3Vlc3MgdGhlIHN5c3RlbSB2ZXJzaW9uIGJ5IG1heGltdW0gZXJybm8gYmVmb3JlIGluY2x1c2lvbiAqLworI2luY2x1ZGUgPGVycm5vLmg+CisjaWZkZWYgRUNBTkNFTEVEIC8qIGRlZmluZWQgc2luY2UgMTAuMiAqLworI2luY2x1ZGUgIkF2YWlsYWJpbGl0eU1hY3Jvcy5oIgorI2VuZGlmCisjaWYgZGVmaW5lZCggX19MUDY0X18gKSAmJiBcCisgICAgKCBNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8PSBNQUNfT1NfWF9WRVJTSU9OXzEwXzQgKQorI3VuZGVmIEZUX01BQ0lOVE9TSAorI2VuZGlmCisKKyNlbGlmIGRlZmluZWQoIF9fU0NfXyApIHx8IGRlZmluZWQoIF9fTVJDX18gKQorICAvKiBDbGFzc2ljIE1hY09TIGNvbXBpbGVycyAqLworI2luY2x1ZGUgIkNvbmRpdGlvbmFsTWFjcm9zLmgiCisjaWYgVEFSR0VUX09TX01BQworI2RlZmluZSBGVF9NQUNJTlRPU0ggMQorI2VuZGlmCisKKyNlbmRpZgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYmFzaWNfdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ludDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgdHlwZWRlZiBmb3IgYSAxNmJpdCBzaWduZWQgaW50ZWdlciB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzaWduZWQgc2hvcnQgIEZUX0ludDE2OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfVUludDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSB0eXBlZGVmIGZvciBhIDE2Yml0IHVuc2lnbmVkIGludGVnZXIgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBGVF9VSW50MTY7CisKKyAgLyogKi8KKworCisgIC8qIHRoaXMgI2lmIDAgLi4uICNlbmRpZiBjbGF1c2UgaXMgZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMgKi8KKyNpZiAwCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSB0eXBlZGVmIGZvciBhIDMyYml0IHNpZ25lZCBpbnRlZ2VyIHR5cGUuICBUaGUgc2l6ZSBkZXBlbmRzIG9uICAgICovCisgIC8qICAgIHRoZSBjb25maWd1cmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzaWduZWQgWFhYICBGVF9JbnQzMjsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSB0eXBlZGVmIGZvciBhIDMyYml0IHVuc2lnbmVkIGludGVnZXIgdHlwZS4gIFRoZSBzaXplIGRlcGVuZHMgb24gICovCisgIC8qICAgIHRoZSBjb25maWd1cmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiB1bnNpZ25lZCBYWFggIEZUX1VJbnQzMjsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ludDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSB0eXBlZGVmIGZvciBhIDY0Yml0IHNpZ25lZCBpbnRlZ2VyIHR5cGUuICBUaGUgc2l6ZSBkZXBlbmRzIG9uICAgICovCisgIC8qICAgIHRoZSBjb25maWd1cmF0aW9uLiAgT25seSBkZWZpbmVkIGlmIHRoZXJlIGlzIHJlYWwgNjRiaXQgc3VwcG9ydDsgICAqLworICAvKiAgICBvdGhlcndpc2UsIGl0IGdldHMgZW11bGF0ZWQgd2l0aCBhIHN0cnVjdHVyZSAoaWYgbmVjZXNzYXJ5KS4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc2lnbmVkIFhYWCAgRlRfSW50NjQ7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9VSW50NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgdHlwZWRlZiBmb3IgYSA2NGJpdCB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUuICBUaGUgc2l6ZSBkZXBlbmRzIG9uICAqLworICAvKiAgICB0aGUgY29uZmlndXJhdGlvbi4gIE9ubHkgZGVmaW5lZCBpZiB0aGVyZSBpcyByZWFsIDY0Yml0IHN1cHBvcnQ7ICAgKi8KKyAgLyogICAgb3RoZXJ3aXNlLCBpdCBnZXRzIGVtdWxhdGVkIHdpdGggYSBzdHJ1Y3R1cmUgKGlmIG5lY2Vzc2FyeSkuICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHVuc2lnbmVkIFhYWCAgRlRfVUludDY0OworCisgIC8qICovCisKKyNlbmRpZgorCisjaWYgRlRfU0laRU9GX0lOVCA9PSAoMzIgLyBGVF9DSEFSX0JJVCkKKworICB0eXBlZGVmIHNpZ25lZCBpbnQgICAgICBGVF9JbnQzMjsKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgRlRfVUludDMyOworCisjZWxpZiBGVF9TSVpFT0ZfTE9ORyA9PSAoMzIgLyBGVF9DSEFSX0JJVCkKKworICB0eXBlZGVmIHNpZ25lZCBsb25nICAgICBGVF9JbnQzMjsKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgRlRfVUludDMyOworCisjZWxzZQorI2Vycm9yICJubyAzMmJpdCB0eXBlIGZvdW5kIC0tIHBsZWFzZSBjaGVjayB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZXMiCisjZW5kaWYKKworCisgIC8qIGxvb2sgdXAgYW4gaW50ZWdlciB0eXBlIHRoYXQgaXMgYXQgbGVhc3QgMzIgYml0cyAqLworI2lmIEZUX1NJWkVPRl9JTlQgPj0gKDMyIC8gRlRfQ0hBUl9CSVQpCisKKyAgdHlwZWRlZiBpbnQgICAgICAgICAgICBGVF9GYXN0OworICB0eXBlZGVmIHVuc2lnbmVkIGludCAgIEZUX1VGYXN0OworCisjZWxpZiBGVF9TSVpFT0ZfTE9ORyA+PSAoMzIgLyBGVF9DSEFSX0JJVCkKKworICB0eXBlZGVmIGxvbmcgICAgICAgICAgIEZUX0Zhc3Q7CisgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgRlRfVUZhc3Q7CisKKyNlbmRpZgorCisKKyAgLyogZGV0ZXJtaW5lIHdoZXRoZXIgd2UgaGF2ZSBhIDY0LWJpdCBpbnQgdHlwZSBmb3IgcGxhdGZvcm1zIHdpdGhvdXQgKi8KKyAgLyogQXV0b2NvbmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZiBGVF9TSVpFT0ZfTE9ORyA9PSAoNjQgLyBGVF9DSEFSX0JJVCkKKworICAvKiBGVF9MT05HNjQgbXVzdCBiZSBkZWZpbmVkIGlmIGEgNjQtYml0IHR5cGUgaXMgYXZhaWxhYmxlICovCisjZGVmaW5lIEZUX0xPTkc2NAorI2RlZmluZSBGVF9JTlQ2NCAgIGxvbmcKKyNkZWZpbmUgRlRfVUlOVDY0ICB1bnNpZ25lZCBsb25nCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBBIDY0LWJpdCBkYXRhIHR5cGUgbWF5IGNyZWF0ZSBjb21waWxhdGlvbiBwcm9ibGVtcyBpZiB5b3UgY29tcGlsZSAgICAgKi8KKyAgLyogaW4gc3RyaWN0IEFOU0kgbW9kZS4gIFRvIGF2b2lkIHRoZW0sIHdlIGRpc2FibGUgb3RoZXIgNjQtYml0IGRhdGEgICAgICovCisgIC8qIHR5cGVzIGlmIF9fU1REQ19fIGlzIGRlZmluZWQuICBZb3UgY2FuIGhvd2V2ZXIgaWdub3JlIHRoaXMgcnVsZSAgICAgICAqLworICAvKiBieSBkZWZpbmluZyB0aGUgRlRfQ09ORklHX09QVElPTl9GT1JDRV9JTlQ2NCBjb25maWd1cmF0aW9uIG1hY3JvLiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZWxpZiAhZGVmaW5lZCggX19TVERDX18gKSB8fCBkZWZpbmVkKCBGVF9DT05GSUdfT1BUSU9OX0ZPUkNFX0lOVDY0ICkKKworI2lmIGRlZmluZWQoIF9NU0NfVkVSICkgJiYgX01TQ19WRVIgPj0gOTAwICAvKiBWaXN1YWwgQysrIChhbmQgSW50ZWwgQysrKSAqLworCisgIC8qIHRoaXMgY29tcGlsZXIgcHJvdmlkZXMgdGhlIF9faW50NjQgdHlwZSAqLworI2RlZmluZSBGVF9MT05HNjQKKyNkZWZpbmUgRlRfSU5UNjQgICBfX2ludDY0CisjZGVmaW5lIEZUX1VJTlQ2NCAgdW5zaWduZWQgX19pbnQ2NAorCisjZWxpZiBkZWZpbmVkKCBfX0JPUkxBTkRDX18gKSAgLyogQm9ybGFuZCBDKysgKi8KKworICAvKiBYWFhYOiBXZSBzaG91bGQgcHJvYmFibHkgY2hlY2sgdGhlIHZhbHVlIG9mIF9fQk9STEFORENfXyBpbiBvcmRlciAqLworICAvKiAgICAgICB0byB0ZXN0IHRoZSBjb21waWxlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIC8qIHRoaXMgY29tcGlsZXIgcHJvdmlkZXMgdGhlIF9faW50NjQgdHlwZSAqLworI2RlZmluZSBGVF9MT05HNjQKKyNkZWZpbmUgRlRfSU5UNjQgICBfX2ludDY0CisjZGVmaW5lIEZUX1VJTlQ2NCAgdW5zaWduZWQgX19pbnQ2NAorCisjZWxpZiBkZWZpbmVkKCBfX1dBVENPTUNfXyApICAgLyogV2F0Y29tIEMrKyAqLworCisgIC8qIFdhdGNvbSBkb2Vzbid0IHByb3ZpZGUgNjQtYml0IGRhdGEgdHlwZXMgKi8KKworI2VsaWYgZGVmaW5lZCggX19NV0VSS1NfXyApICAgIC8qIE1ldHJvd2Vya3MgQ29kZVdhcnJpb3IgKi8KKworI2RlZmluZSBGVF9MT05HNjQKKyNkZWZpbmUgRlRfSU5UNjQgICBsb25nIGxvbmcgaW50CisjZGVmaW5lIEZUX1VJTlQ2NCAgdW5zaWduZWQgbG9uZyBsb25nIGludAorCisjZWxpZiBkZWZpbmVkKCBfX0dOVUNfXyApCisKKyAgLyogR0NDIHByb3ZpZGVzIHRoZSBgbG9uZyBsb25nJyB0eXBlICovCisjZGVmaW5lIEZUX0xPTkc2NAorI2RlZmluZSBGVF9JTlQ2NCAgIGxvbmcgbG9uZyBpbnQKKyNkZWZpbmUgRlRfVUlOVDY0ICB1bnNpZ25lZCBsb25nIGxvbmcgaW50CisKKyNlbmRpZiAvKiBfTVNDX1ZFUiAqLworCisjZW5kaWYgLyogRlRfU0laRU9GX0xPTkcgPT0gKDY0IC8gRlRfQ0hBUl9CSVQpICovCisKKyNpZmRlZiBGVF9MT05HNjQKKyAgdHlwZWRlZiBGVF9JTlQ2NCAgIEZUX0ludDY0OworICB0eXBlZGVmIEZUX1VJTlQ2NCAgRlRfVUludDY0OworI2VuZGlmCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIG1pc2NlbGxhbmVvdXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2RlZmluZSBGVF9CRUdJTl9TVE1OVCAgZG8geworI2RlZmluZSBGVF9FTkRfU1RNTlQgICAgfSB3aGlsZSAoIDAgKQorI2RlZmluZSBGVF9EVU1NWV9TVE1OVCAgRlRfQkVHSU5fU1RNTlQgRlRfRU5EX1NUTU5UCisKKworICAvKiB0eXBlb2YgY29uZGl0aW9uIHRha2VuIGZyb20gZ251bGliJ3MgYGludHByb3BzLmgnIGhlYWRlciBmaWxlICovCisjaWYgKCBfX0dOVUNfXyA+PSAyICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgIGRlZmluZWQoIF9fSUJNX19UWVBFT0ZfXyApICAgICAgICAgICAgfHwgXAorICAgICAgKCBfX1NVTlBST19DID49IDB4NTExMCAmJiAhX19TVERDX18gKSApCisjZGVmaW5lIEZUX1RZUEVPRiggdHlwZSApICAoX190eXBlb2ZfXyAodHlwZSkpCisjZWxzZQorI2RlZmluZSBGVF9UWVBFT0YoIHR5cGUgKSAgLyogZW1wdHkgKi8KKyNlbmRpZgorCisKKyNpZmRlZiBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCisKKyNkZWZpbmUgRlRfTE9DQUwoIHggKSAgICAgIHN0YXRpYyAgeAorI2RlZmluZSBGVF9MT0NBTF9ERUYoIHggKSAgc3RhdGljICB4CisKKyNlbHNlCisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBGVF9MT0NBTCggeCApICAgICAgZXh0ZXJuICJDIiAgeAorI2RlZmluZSBGVF9MT0NBTF9ERUYoIHggKSAgZXh0ZXJuICJDIiAgeAorI2Vsc2UKKyNkZWZpbmUgRlRfTE9DQUwoIHggKSAgICAgIGV4dGVybiAgeAorI2RlZmluZSBGVF9MT0NBTF9ERUYoIHggKSAgeAorI2VuZGlmCisKKyNlbmRpZiAvKiBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUICovCisKKyNkZWZpbmUgRlRfTE9DQUxfQVJSQVkoIHggKSAgICAgIGV4dGVybiBjb25zdCAgeAorI2RlZmluZSBGVF9MT0NBTF9BUlJBWV9ERUYoIHggKSAgY29uc3QgIHgKKworCisjaWZuZGVmIEZUX0JBU0UKKworI2lmZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIEZUX0JBU0UoIHggKSAgZXh0ZXJuICJDIiAgeAorI2Vsc2UKKyNkZWZpbmUgRlRfQkFTRSggeCApICBleHRlcm4gIHgKKyNlbmRpZgorCisjZW5kaWYgLyogIUZUX0JBU0UgKi8KKworCisjaWZuZGVmIEZUX0JBU0VfREVGCisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBGVF9CQVNFX0RFRiggeCApICB4CisjZWxzZQorI2RlZmluZSBGVF9CQVNFX0RFRiggeCApICB4CisjZW5kaWYKKworI2VuZGlmIC8qICFGVF9CQVNFX0RFRiAqLworCisKKyNpZm5kZWYgRlRfRVhQT1JUCisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBGVF9FWFBPUlQoIHggKSAgZXh0ZXJuICJDIiAgeAorI2Vsc2UKKyNkZWZpbmUgRlRfRVhQT1JUKCB4ICkgIGV4dGVybiAgeAorI2VuZGlmCisKKyNlbmRpZiAvKiAhRlRfRVhQT1JUICovCisKKworI2lmbmRlZiBGVF9FWFBPUlRfREVGCisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBGVF9FWFBPUlRfREVGKCB4ICkgIGV4dGVybiAiQyIgIHgKKyNlbHNlCisjZGVmaW5lIEZUX0VYUE9SVF9ERUYoIHggKSAgZXh0ZXJuICB4CisjZW5kaWYKKworI2VuZGlmIC8qICFGVF9FWFBPUlRfREVGICovCisKKworI2lmbmRlZiBGVF9FWFBPUlRfVkFSCisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBGVF9FWFBPUlRfVkFSKCB4ICkgIGV4dGVybiAiQyIgIHgKKyNlbHNlCisjZGVmaW5lIEZUX0VYUE9SVF9WQVIoIHggKSAgZXh0ZXJuICB4CisjZW5kaWYKKworI2VuZGlmIC8qICFGVF9FWFBPUlRfVkFSICovCisKKyAgLyogVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIG5lZWRlZCB0byBjb21waWxlIHRoZSBsaWJyYXJ5IHdpdGggYSAgICovCisgIC8qIEMrKyBjb21waWxlciBhbmQgd2l0aCAxNmJpdCBjb21waWxlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAvKiBUaGlzIGlzIHNwZWNpYWwuICBXaXRoaW4gQysrLCB5b3UgbXVzdCBzcGVjaWZ5IGBleHRlcm4gIkMiJyBmb3IgKi8KKyAgLyogZnVuY3Rpb25zIHdoaWNoIGFyZSB1c2VkIHZpYSBmdW5jdGlvbiBwb2ludGVycywgYW5kIHlvdSBhbHNvICAgICovCisgIC8qIG11c3QgZG8gdGhhdCBmb3Igc3RydWN0dXJlcyB3aGljaCBjb250YWluIGZ1bmN0aW9uIHBvaW50ZXJzIHRvICAqLworICAvKiBhc3N1cmUgQyBsaW5rYWdlIC0tIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGhhdmUgKGxvY2FsKSBhbm9ueW1vdXMgKi8KKyAgLyogZnVuY3Rpb25zIHdoaWNoIGFyZSBhY2Nlc3NlZCBieSAoZ2xvYmFsKSBmdW5jdGlvbiBwb2ludGVycy4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRlRfQ0FMTEJBQ0tfREVGIGlzIHVzZWQgdG8gX2RlZmluZV8gYSBjYWxsYmFjayBmdW5jdGlvbi4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBGVF9DQUxMQkFDS19UQUJMRSBpcyB1c2VkIHRvIF9kZWNsYXJlXyBhIGNvbnN0YW50IHZhcmlhYmxlIHRoYXQgKi8KKyAgLyogY29udGFpbnMgcG9pbnRlcnMgdG8gY2FsbGJhY2sgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBGVF9DQUxMQkFDS19UQUJMRV9ERUYgaXMgdXNlZCB0byBfZGVmaW5lXyBhIGNvbnN0YW50IHZhcmlhYmxlICAgKi8KKyAgLyogdGhhdCBjb250YWlucyBwb2ludGVycyB0byBjYWxsYmFjayBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU29tZSAxNmJpdCBjb21waWxlcnMgaGF2ZSB0byByZWRlZmluZSB0aGVzZSBtYWNyb3MgdG8gaW5zZXJ0ICAgICovCisgIC8qIHRoZSBpbmZhbW91cyBgX2NkZWNsJyBvciBgX19mYXN0Y2FsbCcgZGVjbGFyYXRpb25zLiAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZm5kZWYgRlRfQ0FMTEJBQ0tfREVGCisjaWZkZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgRlRfQ0FMTEJBQ0tfREVGKCB4ICkgIGV4dGVybiAiQyIgIHgKKyNlbHNlCisjZGVmaW5lIEZUX0NBTExCQUNLX0RFRiggeCApICBzdGF0aWMgIHgKKyNlbmRpZgorI2VuZGlmIC8qIEZUX0NBTExCQUNLX0RFRiAqLworCisjaWZuZGVmIEZUX0NBTExCQUNLX1RBQkxFCisjaWZkZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgRlRfQ0FMTEJBQ0tfVEFCTEUgICAgICBleHRlcm4gIkMiCisjZGVmaW5lIEZUX0NBTExCQUNLX1RBQkxFX0RFRiAgZXh0ZXJuICJDIgorI2Vsc2UKKyNkZWZpbmUgRlRfQ0FMTEJBQ0tfVEFCTEUgICAgICBleHRlcm4KKyNkZWZpbmUgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGICAvKiBub3RoaW5nICovCisjZW5kaWYKKyNlbmRpZiAvKiBGVF9DQUxMQkFDS19UQUJMRSAqLworCisKK0ZUX0VORF9IRUFERVIKKworCisjZW5kaWYgLyogX19GVENPTkZJR19IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZjgzM2QKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oCkBAIC0wLDAgKzEsODM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBmdGhlYWRlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQnVpbGQgbWFjcm9zIG9mIHRoZSBGcmVlVHlwZSAyIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fRlRfSEVBREVSX0hfXworI2RlZmluZSBfX0ZUX0hFQURFUl9IX18KKworCisgIC8qQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0JFR0lOX0hFQURFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgbWFjcm8gaXMgdXNlZCBpbiBhc3NvY2lhdGlvbiB3aXRoIEBGVF9FTkRfSEVBREVSIGluIGhlYWRlciAgICAqLworICAvKiAgICBmaWxlcyB0byBlbnN1cmUgdGhhdCB0aGUgZGVjbGFyYXRpb25zIHdpdGhpbiBhcmUgcHJvcGVybHkgICAgICAgICAgKi8KKyAgLyogICAgZW5jYXBzdWxhdGVkIGluIGFuIGBleHRlcm4gIkMiIHsgLi4gfScgYmxvY2sgd2hlbiBpbmNsdWRlZCBmcm9tIGEgICovCisgIC8qICAgIEMrKyBjb21waWxlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBGVF9CRUdJTl9IRUFERVIgIGV4dGVybiAiQyIgeworI2Vsc2UKKyNkZWZpbmUgRlRfQkVHSU5fSEVBREVSICAvKiBub3RoaW5nICovCisjZW5kaWYKKworCisgIC8qQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0VORF9IRUFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgbWFjcm8gaXMgdXNlZCBpbiBhc3NvY2lhdGlvbiB3aXRoIEBGVF9CRUdJTl9IRUFERVIgaW4gaGVhZGVyICAqLworICAvKiAgICBmaWxlcyB0byBlbnN1cmUgdGhhdCB0aGUgZGVjbGFyYXRpb25zIHdpdGhpbiBhcmUgcHJvcGVybHkgICAgICAgICAgKi8KKyAgLyogICAgZW5jYXBzdWxhdGVkIGluIGFuIGBleHRlcm4gIkMiIHsgLi4gfScgYmxvY2sgd2hlbiBpbmNsdWRlZCBmcm9tIGEgICovCisgIC8qICAgIEMrKyBjb21waWxlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBGVF9FTkRfSEVBREVSICB9CisjZWxzZQorI2RlZmluZSBGVF9FTkRfSEVBREVSICAvKiBub3RoaW5nICovCisjZW5kaWYKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQWxpYXNlcyBmb3IgdGhlIEZyZWVUeXBlIDIgcHVibGljIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBoZWFkZXJfZmlsZV9tYWNyb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBIZWFkZXIgRmlsZSBNYWNyb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBNYWNybyBkZWZpbml0aW9ucyB1c2VkIHRvICNpbmNsdWRlIHNwZWNpZmljIGhlYWRlciBmaWxlcy4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgZGVmaW5lZCB0byB0aGUgbmFtZSBvZiBzcGVjaWZpYyAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGV+MiBoZWFkZXIgZmlsZXMuICBUaGV5IGNhbiBiZSB1c2VkIGRpcmVjdGx5IGluICNpbmNsdWRlICAgICovCisgIC8qICAgIHN0YXRlbWVudHMgYXMgaW46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgI2luY2x1ZGUgRlRfRlJFRVRZUEVfSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICNpbmNsdWRlIEZUX01VTFRJUExFX01BU1RFUlNfSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAjaW5jbHVkZSBGVF9HTFlQSF9IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlcmUgYXJlIHNldmVyYWwgcmVhc29ucyB3aHkgd2UgYXJlIG5vdyB1c2luZyBtYWNyb3MgdG8gbmFtZSAgICAgICovCisgIC8qICAgIHB1YmxpYyBoZWFkZXIgZmlsZXMuICBUaGUgZmlyc3Qgb25lIGlzIHRoYXQgc3VjaCBtYWNyb3MgYXJlIG5vdCAgICAqLworICAvKiAgICBsaW1pdGVkIHRvIHRoZSBpbmZhbW91cyA4LjN+bmFtaW5nIHJ1bGUgcmVxdWlyZWQgYnkgRE9TIChhbmQgICAgICAgKi8KKyAgLyogICAgYEZUX01VTFRJUExFX01BU1RFUlNfSCcgaXMgYSBsb3QgbW9yZSBtZWFuaW5nZnVsIHRoYW4gYGZ0bW0uaCcpLiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgc2Vjb25kIHJlYXNvbiBpcyB0aGF0IGl0IGFsbG93cyBmb3IgbW9yZSBmbGV4aWJpbGl0eSBpbiB0aGUgICAgKi8KKyAgLyogICAgd2F5IEZyZWVUeXBlfjIgaXMgaW5zdGFsbGVkIG9uIGEgZ2l2ZW4gc3lzdGVtLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qIGNvbmZpZ3VyYXRpb24gZmlsZXMgKi8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfQ09ORklHX0NPTkZJR19ICisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcKKyAgICogICBGcmVlVHlwZX4yIGNvbmZpZ3VyYXRpb24gZGF0YS4KKyAgICoKKyAgICovCisjaWZuZGVmIEZUX0NPTkZJR19DT05GSUdfSAorI2RlZmluZSBGVF9DT05GSUdfQ09ORklHX0ggIDxmcmVldHlwZS9jb25maWcvZnRjb25maWcuaD4KKyNlbmRpZgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0gKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZworICAgKiAgIEZyZWVUeXBlfjIgaW50ZXJmYWNlIHRvIHRoZSBzdGFuZGFyZCBDIGxpYnJhcnkgZnVuY3Rpb25zLgorICAgKgorICAgKi8KKyNpZm5kZWYgRlRfQ09ORklHX1NUQU5EQVJEX0xJQlJBUllfSAorI2RlZmluZSBGVF9DT05GSUdfU1RBTkRBUkRfTElCUkFSWV9IICA8ZnJlZXR5cGUvY29uZmlnL2Z0c3RkbGliLmg+CisjZW5kaWYKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9DT05GSUdfT1BUSU9OU19ICisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcKKyAgICogICBGcmVlVHlwZX4yIHByb2plY3Qtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBvcHRpb25zLgorICAgKgorICAgKi8KKyNpZm5kZWYgRlRfQ09ORklHX09QVElPTlNfSAorI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OU19IICA8ZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmg+CisjZW5kaWYKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9DT05GSUdfTU9EVUxFU19ICisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgbGlzdCBvZiBGcmVlVHlwZX4yIG1vZHVsZXMgdGhhdCBhcmUgc3RhdGljYWxseSBsaW5rZWQgdG8gbmV3IGxpYnJhcnkKKyAgICogICBpbnN0YW5jZXMgaW4gQEZUX0luaXRfRnJlZVR5cGUuCisgICAqCisgICAqLworI2lmbmRlZiBGVF9DT05GSUdfTU9EVUxFU19ICisjZGVmaW5lIEZUX0NPTkZJR19NT0RVTEVTX0ggIDxmcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaD4KKyNlbmRpZgorCisgIC8qICovCisKKyAgLyogcHVibGljIGhlYWRlcnMgKi8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfRlJFRVRZUEVfSAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIGJhc2UgRnJlZVR5cGV+MiBBUEkuCisgICAqCisgICAqLworI2RlZmluZSBGVF9GUkVFVFlQRV9IICA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9FUlJPUlNfSAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIGxpc3Qgb2YgRnJlZVR5cGV+MiBlcnJvciBjb2RlcyAoYW5kIG1lc3NhZ2VzKS4KKyAgICoKKyAgICogICBJdCBpcyBpbmNsdWRlZCBieSBARlRfRlJFRVRZUEVfSC4KKyAgICoKKyAgICovCisjZGVmaW5lIEZUX0VSUk9SU19IICA8ZnJlZXR5cGUvZnRlcnJvcnMuaD4KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9NT0RVTEVfRVJST1JTX0gKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKKyAgICogICBsaXN0IG9mIEZyZWVUeXBlfjIgbW9kdWxlIGVycm9yIG9mZnNldHMgKGFuZCBtZXNzYWdlcykuCisgICAqCisgICAqLworI2RlZmluZSBGVF9NT0RVTEVfRVJST1JTX0ggIDxmcmVldHlwZS9mdG1vZGVyci5oPgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX1NZU1RFTV9ICisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgRnJlZVR5cGV+MiBpbnRlcmZhY2UgdG8gbG93LWxldmVsIG9wZXJhdGlvbnMgKGkuZS4sIG1lbW9yeSBtYW5hZ2VtZW50CisgICAqICAgYW5kIHN0cmVhbSBpL28pLgorICAgKgorICAgKiAgIEl0IGlzIGluY2x1ZGVkIGJ5IEBGVF9GUkVFVFlQRV9ILgorICAgKgorICAgKi8KKyNkZWZpbmUgRlRfU1lTVEVNX0ggIDxmcmVldHlwZS9mdHN5c3RlbS5oPgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX0lNQUdFX0gKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0eXBlCisgICAqICAgZGVmaW5pdGlvbnMgcmVsYXRlZCB0byBnbHlwaCBpbWFnZXMgKGkuZS4sIGJpdG1hcHMsIG91dGxpbmVzLAorICAgKiAgIHNjYW4tY29udmVydGVyIHBhcmFtZXRlcnMpLgorICAgKgorICAgKiAgIEl0IGlzIGluY2x1ZGVkIGJ5IEBGVF9GUkVFVFlQRV9ILgorICAgKgorICAgKi8KKyNkZWZpbmUgRlRfSU1BR0VfSCAgPGZyZWV0eXBlL2Z0aW1hZ2UuaD4KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9UWVBFU19ICisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgYmFzaWMgZGF0YSB0eXBlcyBkZWZpbmVkIGJ5IEZyZWVUeXBlfjIuCisgICAqCisgICAqICAgSXQgaXMgaW5jbHVkZWQgYnkgQEZUX0ZSRUVUWVBFX0guCisgICAqCisgICAqLworI2RlZmluZSBGVF9UWVBFU19IICA8ZnJlZXR5cGUvZnR0eXBlcy5oPgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX0xJU1RfSAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIGxpc3QgbWFuYWdlbWVudCBBUEkgb2YgRnJlZVR5cGV+Mi4KKyAgICoKKyAgICogICAoTW9zdCBhcHBsaWNhdGlvbnMgd2lsbCBuZXZlciBuZWVkIHRvIGluY2x1ZGUgdGhpcyBmaWxlLikKKyAgICoKKyAgICovCisjZGVmaW5lIEZUX0xJU1RfSCAgPGZyZWV0eXBlL2Z0bGlzdC5oPgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX09VVExJTkVfSAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIHNjYWxhYmxlIG91dGxpbmUgbWFuYWdlbWVudCBBUEkgb2YgRnJlZVR5cGV+Mi4KKyAgICoKKyAgICovCisjZGVmaW5lIEZUX09VVExJTkVfSCAgPGZyZWV0eXBlL2Z0b3V0bG4uaD4KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9TSVpFU19ICisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgQVBJIHdoaWNoIG1hbmFnZXMgbXVsdGlwbGUgQEZUX1NpemUgb2JqZWN0cyBwZXIgZmFjZS4KKyAgICoKKyAgICovCisjZGVmaW5lIEZUX1NJWkVTX0ggIDxmcmVldHlwZS9mdHNpemVzLmg+CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfTU9EVUxFX0gKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKKyAgICogICBtb2R1bGUgbWFuYWdlbWVudCBBUEkgb2YgRnJlZVR5cGV+Mi4KKyAgICoKKyAgICovCisjZGVmaW5lIEZUX01PRFVMRV9IICA8ZnJlZXR5cGUvZnRtb2RhcGkuaD4KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9SRU5ERVJfSAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIHJlbmRlcmVyIG1vZHVsZSBtYW5hZ2VtZW50IEFQSSBvZiBGcmVlVHlwZX4yLgorICAgKgorICAgKi8KKyNkZWZpbmUgRlRfUkVOREVSX0ggIDxmcmVldHlwZS9mdHJlbmRlci5oPgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX0FVVE9ISU5URVJfSAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nCisgICAqICAgc3RydWN0dXJlcyBhbmQgbWFjcm9zIHJlbGF0ZWQgdG8gdGhlIGF1dG8taGludGluZyBtb2R1bGUuCisgICAqCisgICAqLworI2RlZmluZSBGVF9BVVRPSElOVEVSX0ggIDxmcmVldHlwZS9mdGF1dG9oLmg+CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfQ0ZGX0RSSVZFUl9ICisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcKKyAgICogICBzdHJ1Y3R1cmVzIGFuZCBtYWNyb3MgcmVsYXRlZCB0byB0aGUgQ0ZGIGRyaXZlciBtb2R1bGUuCisgICAqCisgICAqLworI2RlZmluZSBGVF9DRkZfRFJJVkVSX0ggIDxmcmVldHlwZS9mdGNmZmRydi5oPgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX1RSVUVUWVBFX0RSSVZFUl9ICisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcKKyAgICogICBzdHJ1Y3R1cmVzIGFuZCBtYWNyb3MgcmVsYXRlZCB0byB0aGUgVHJ1ZVR5cGUgZHJpdmVyIG1vZHVsZS4KKyAgICoKKyAgICovCisjZGVmaW5lIEZUX1RSVUVUWVBFX0RSSVZFUl9IICA8ZnJlZXR5cGUvZnR0dGRydi5oPgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX1RZUEUxX1RBQkxFU19ICisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgdHlwZXMgYW5kIEFQSSBzcGVjaWZpYyB0byB0aGUgVHlwZX4xIGZvcm1hdC4KKyAgICoKKyAgICovCisjZGVmaW5lIEZUX1RZUEUxX1RBQkxFU19IICA8ZnJlZXR5cGUvdDF0YWJsZXMuaD4KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9UUlVFVFlQRV9JRFNfSAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIGVudW1lcmF0aW9uIHZhbHVlcyB3aGljaCBpZGVudGlmeSBuYW1lIHN0cmluZ3MsIGxhbmd1YWdlcywgZW5jb2RpbmdzLAorICAgKiAgIGV0Yy4gIFRoaXMgZmlsZSByZWFsbHkgY29udGFpbnMgYSBfbGFyZ2VfIHNldCBvZiBjb25zdGFudCBtYWNybworICAgKiAgIGRlZmluaXRpb25zLCB0YWtlbiBmcm9tIHRoZSBUcnVlVHlwZSBhbmQgT3BlblR5cGUgc3BlY2lmaWNhdGlvbnMuCisgICAqCisgICAqLworI2RlZmluZSBGVF9UUlVFVFlQRV9JRFNfSCAgPGZyZWV0eXBlL3R0bmFtZWlkLmg+CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfVFJVRVRZUEVfVEFCTEVTX0gKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKKyAgICogICB0eXBlcyBhbmQgQVBJIHNwZWNpZmljIHRvIHRoZSBUcnVlVHlwZSAoYXMgd2VsbCBhcyBPcGVuVHlwZSkgZm9ybWF0LgorICAgKgorICAgKi8KKyNkZWZpbmUgRlRfVFJVRVRZUEVfVEFCTEVTX0ggIDxmcmVldHlwZS90dHRhYmxlcy5oPgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX1RSVUVUWVBFX1RBR1NfSAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIGRlZmluaXRpb25zIG9mIFRydWVUeXBlIGZvdXItYnl0ZSBgdGFncycgd2hpY2ggaWRlbnRpZnkgYmxvY2tzIGluCisgICAqICAgU0ZOVC1iYXNlZCBmb250IGZvcm1hdHMgKGkuZS4sIFRydWVUeXBlIGFuZCBPcGVuVHlwZSkuCisgICAqCisgICAqLworI2RlZmluZSBGVF9UUlVFVFlQRV9UQUdTX0ggIDxmcmVldHlwZS90dHRhZ3MuaD4KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9CREZfSAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIGRlZmluaXRpb25zIG9mIGFuIEFQSSB3aGljaCBhY2Nlc3NlcyBCREYtc3BlY2lmaWMgc3RyaW5ncyBmcm9tIGEKKyAgICogICBmYWNlLgorICAgKgorICAgKi8KKyNkZWZpbmUgRlRfQkRGX0ggIDxmcmVldHlwZS9mdGJkZi5oPgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX0NJRF9ICisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgZGVmaW5pdGlvbnMgb2YgYW4gQVBJIHdoaWNoIGFjY2VzcyBDSUQgZm9udCBpbmZvcm1hdGlvbiBmcm9tIGEKKyAgICogICBmYWNlLgorICAgKgorICAgKi8KKyNkZWZpbmUgRlRfQ0lEX0ggIDxmcmVldHlwZS9mdGNpZC5oPgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX0daSVBfSAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIGRlZmluaXRpb25zIG9mIGFuIEFQSSB3aGljaCBzdXBwb3J0cyBnemlwLWNvbXByZXNzZWQgZmlsZXMuCisgICAqCisgICAqLworI2RlZmluZSBGVF9HWklQX0ggIDxmcmVldHlwZS9mdGd6aXAuaD4KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9MWldfSAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIGRlZmluaXRpb25zIG9mIGFuIEFQSSB3aGljaCBzdXBwb3J0cyBMWlctY29tcHJlc3NlZCBmaWxlcy4KKyAgICoKKyAgICovCisjZGVmaW5lIEZUX0xaV19IICA8ZnJlZXR5cGUvZnRsencuaD4KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9CWklQMl9ICisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgZGVmaW5pdGlvbnMgb2YgYW4gQVBJIHdoaWNoIHN1cHBvcnRzIGJ6aXAyLWNvbXByZXNzZWQgZmlsZXMuCisgICAqCisgICAqLworI2RlZmluZSBGVF9CWklQMl9IICA8ZnJlZXR5cGUvZnRiemlwMi5oPgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX1dJTkZPTlRTX0gKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKKyAgICogICBkZWZpbml0aW9ucyBvZiBhbiBBUEkgd2hpY2ggc3VwcG9ydHMgV2luZG93cyBGTlQgZmlsZXMuCisgICAqCisgICAqLworI2RlZmluZSBGVF9XSU5GT05UU19IICAgPGZyZWV0eXBlL2Z0d2luZm50Lmg+CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfR0xZUEhfSAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIEFQSSBvZiB0aGUgb3B0aW9uYWwgZ2x5cGggbWFuYWdlbWVudCBjb21wb25lbnQuCisgICAqCisgICAqLworI2RlZmluZSBGVF9HTFlQSF9IICA8ZnJlZXR5cGUvZnRnbHlwaC5oPgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX0JJVE1BUF9ICisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgQVBJIG9mIHRoZSBvcHRpb25hbCBiaXRtYXAgY29udmVyc2lvbiBjb21wb25lbnQuCisgICAqCisgICAqLworI2RlZmluZSBGVF9CSVRNQVBfSCAgPGZyZWV0eXBlL2Z0Yml0bWFwLmg+CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfQkJPWF9ICisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgQVBJIG9mIHRoZSBvcHRpb25hbCBleGFjdCBib3VuZGluZyBib3ggY29tcHV0YXRpb24gcm91dGluZXMuCisgICAqCisgICAqLworI2RlZmluZSBGVF9CQk9YX0ggIDxmcmVldHlwZS9mdGJib3guaD4KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9DQUNIRV9ICisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgQVBJIG9mIHRoZSBvcHRpb25hbCBGcmVlVHlwZX4yIGNhY2hlIHN1Yi1zeXN0ZW0uCisgICAqCisgICAqLworI2RlZmluZSBGVF9DQUNIRV9IICA8ZnJlZXR5cGUvZnRjYWNoZS5oPgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX0NBQ0hFX0lNQUdFX0gKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKKyAgICogICBgZ2x5cGggaW1hZ2UnIEFQSSBvZiB0aGUgRnJlZVR5cGV+MiBjYWNoZSBzdWItc3lzdGVtLgorICAgKgorICAgKiAgIEl0IGlzIHVzZWQgdG8gZGVmaW5lIGEgY2FjaGUgZm9yIEBGVF9HbHlwaCBlbGVtZW50cy4gIFlvdSBjYW4gYWxzbworICAgKiAgIHVzZSB0aGUgQVBJIGRlZmluZWQgaW4gQEZUX0NBQ0hFX1NNQUxMX0JJVE1BUFNfSCBpZiB5b3Ugb25seSBuZWVkIHRvCisgICAqICAgc3RvcmUgc21hbGwgZ2x5cGggYml0bWFwcywgYXMgaXQgd2lsbCB1c2UgbGVzcyBtZW1vcnkuCisgICAqCisgICAqICAgVGhpcyBtYWNybyBpcyBkZXByZWNhdGVkLiAgU2ltcGx5IGluY2x1ZGUgQEZUX0NBQ0hFX0ggdG8gaGF2ZSBhbGwKKyAgICogICBnbHlwaCBpbWFnZS1yZWxhdGVkIGNhY2hlIGRlY2xhcmF0aW9ucy4KKyAgICoKKyAgICovCisjZGVmaW5lIEZUX0NBQ0hFX0lNQUdFX0ggIEZUX0NBQ0hFX0gKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9DQUNIRV9TTUFMTF9CSVRNQVBTX0gKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKKyAgICogICBgc21hbGwgYml0bWFwcycgQVBJIG9mIHRoZSBGcmVlVHlwZX4yIGNhY2hlIHN1Yi1zeXN0ZW0uCisgICAqCisgICAqICAgSXQgaXMgdXNlZCB0byBkZWZpbmUgYSBjYWNoZSBmb3Igc21hbGwgZ2x5cGggYml0bWFwcyBpbiBhIHJlbGF0aXZlbHkKKyAgICogICBtZW1vcnktZWZmaWNpZW50IHdheS4gIFlvdSBjYW4gYWxzbyB1c2UgdGhlIEFQSSBkZWZpbmVkIGluCisgICAqICAgQEZUX0NBQ0hFX0lNQUdFX0ggaWYgeW91IHdhbnQgdG8gY2FjaGUgYXJiaXRyYXJ5IGdseXBoIGltYWdlcywKKyAgICogICBpbmNsdWRpbmcgc2NhbGFibGUgb3V0bGluZXMuCisgICAqCisgICAqICAgVGhpcyBtYWNybyBpcyBkZXByZWNhdGVkLiAgU2ltcGx5IGluY2x1ZGUgQEZUX0NBQ0hFX0ggdG8gaGF2ZSBhbGwKKyAgICogICBzbWFsbCBiaXRtYXBzLXJlbGF0ZWQgY2FjaGUgZGVjbGFyYXRpb25zLgorICAgKgorICAgKi8KKyNkZWZpbmUgRlRfQ0FDSEVfU01BTExfQklUTUFQU19IICBGVF9DQUNIRV9ICisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfQ0FDSEVfQ0hBUk1BUF9ICisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgYGNoYXJtYXAnIEFQSSBvZiB0aGUgRnJlZVR5cGV+MiBjYWNoZSBzdWItc3lzdGVtLgorICAgKgorICAgKiAgIFRoaXMgbWFjcm8gaXMgZGVwcmVjYXRlZC4gIFNpbXBseSBpbmNsdWRlIEBGVF9DQUNIRV9IIHRvIGhhdmUgYWxsCisgICAqICAgY2hhcm1hcC1iYXNlZCBjYWNoZSBkZWNsYXJhdGlvbnMuCisgICAqCisgICAqLworI2RlZmluZSBGVF9DQUNIRV9DSEFSTUFQX0ggIEZUX0NBQ0hFX0gKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9NQUNfSAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIE1hY2ludG9zaC1zcGVjaWZpYyBGcmVlVHlwZX4yIEFQSS4gIFRoZSBsYXR0ZXIgaXMgdXNlZCB0byBhY2Nlc3MKKyAgICogICBmb250cyBlbWJlZGRlZCBpbiByZXNvdXJjZSBmb3Jrcy4KKyAgICoKKyAgICogICBUaGlzIGhlYWRlciBmaWxlIG11c3QgYmUgZXhwbGljaXRseSBpbmNsdWRlZCBieSBjbGllbnQgYXBwbGljYXRpb25zCisgICAqICAgY29tcGlsZWQgb24gdGhlIE1hYyAobm90ZSB0aGF0IHRoZSBiYXNlIEFQSSBzdGlsbCB3b3JrcyB0aG91Z2gpLgorICAgKgorICAgKi8KKyNkZWZpbmUgRlRfTUFDX0ggIDxmcmVldHlwZS9mdG1hYy5oPgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX01VTFRJUExFX01BU1RFUlNfSAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIG9wdGlvbmFsIG11bHRpcGxlLW1hc3RlcnMgbWFuYWdlbWVudCBBUEkgb2YgRnJlZVR5cGV+Mi4KKyAgICoKKyAgICovCisjZGVmaW5lIEZUX01VTFRJUExFX01BU1RFUlNfSCAgPGZyZWV0eXBlL2Z0bW0uaD4KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9TRk5UX05BTUVTX0gKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKKyAgICogICBvcHRpb25hbCBGcmVlVHlwZX4yIEFQSSB3aGljaCBhY2Nlc3NlcyBlbWJlZGRlZCBgbmFtZScgc3RyaW5ncyBpbgorICAgKiAgIFNGTlQtYmFzZWQgZm9udCBmb3JtYXRzIChpLmUuLCBUcnVlVHlwZSBhbmQgT3BlblR5cGUpLgorICAgKgorICAgKi8KKyNkZWZpbmUgRlRfU0ZOVF9OQU1FU19IICA8ZnJlZXR5cGUvZnRzbmFtZXMuaD4KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9PUEVOVFlQRV9WQUxJREFURV9ICisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgb3B0aW9uYWwgRnJlZVR5cGV+MiBBUEkgd2hpY2ggdmFsaWRhdGVzIE9wZW5UeXBlIHRhYmxlcyAoQkFTRSwgR0RFRiwKKyAgICogICBHUE9TLCBHU1VCLCBKU1RGKS4KKyAgICoKKyAgICovCisjZGVmaW5lIEZUX09QRU5UWVBFX1ZBTElEQVRFX0ggIDxmcmVldHlwZS9mdG90dmFsLmg+CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfR1hfVkFMSURBVEVfSAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIG9wdGlvbmFsIEZyZWVUeXBlfjIgQVBJIHdoaWNoIHZhbGlkYXRlcyBUcnVlVHlwZUdYL0FBVCB0YWJsZXMgKGZlYXQsCisgICAqICAgbW9ydCwgbW9yeCwgYnNsbiwganVzdCwga2Vybiwgb3BiZCwgdHJhaywgcHJvcCkuCisgICAqCisgICAqLworI2RlZmluZSBGVF9HWF9WQUxJREFURV9IICA8ZnJlZXR5cGUvZnRneHZhbC5oPgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX1BGUl9ICisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgRnJlZVR5cGV+MiBBUEkgd2hpY2ggYWNjZXNzZXMgUEZSLXNwZWNpZmljIGRhdGEuCisgICAqCisgICAqLworI2RlZmluZSBGVF9QRlJfSCAgPGZyZWV0eXBlL2Z0cGZyLmg+CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfU1RST0tFUl9ICisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgRnJlZVR5cGV+MiBBUEkgd2hpY2ggcHJvdmlkZXMgZnVuY3Rpb25zIHRvIHN0cm9rZSBvdXRsaW5lIHBhdGhzLgorICAgKi8KKyNkZWZpbmUgRlRfU1RST0tFUl9IICA8ZnJlZXR5cGUvZnRzdHJva2UuaD4KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9TWU5USEVTSVNfSAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIEZyZWVUeXBlfjIgQVBJIHdoaWNoIHBlcmZvcm1zIGFydGlmaWNpYWwgb2JsaXF1aW5nIGFuZCBlbWJvbGRlbmluZy4KKyAgICovCisjZGVmaW5lIEZUX1NZTlRIRVNJU19IICA8ZnJlZXR5cGUvZnRzeW50aC5oPgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX0ZPTlRfRk9STUFUU19ICisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgRnJlZVR5cGV+MiBBUEkgd2hpY2ggcHJvdmlkZXMgZnVuY3Rpb25zIHNwZWNpZmljIHRvIGZvbnQgZm9ybWF0cy4KKyAgICovCisjZGVmaW5lIEZUX0ZPTlRfRk9STUFUU19IICA8ZnJlZXR5cGUvZnRmbnRmbXQuaD4KKworICAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIEZUX1hGUkVFODZfSCAgRlRfRk9OVF9GT1JNQVRTX0gKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9UUklHT05PTUVUUllfSAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIEZyZWVUeXBlfjIgQVBJIHdoaWNoIHBlcmZvcm1zIHRyaWdvbm9tZXRyaWMgY29tcHV0YXRpb25zIChlLmcuLAorICAgKiAgIGNvc2luZXMgYW5kIGFyYyB0YW5nZW50cykuCisgICAqLworI2RlZmluZSBGVF9UUklHT05PTUVUUllfSCAgPGZyZWV0eXBlL2Z0dHJpZ29uLmg+CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfTENEX0ZJTFRFUl9ICisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgRnJlZVR5cGV+MiBBUEkgd2hpY2ggcGVyZm9ybXMgY29sb3IgZmlsdGVyaW5nIGZvciBzdWJwaXhlbCByZW5kZXJpbmcuCisgICAqLworI2RlZmluZSBGVF9MQ0RfRklMVEVSX0ggIDxmcmVldHlwZS9mdGxjZGZpbC5oPgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX1VOUEFURU5URURfSElOVElOR19ICisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgRnJlZVR5cGV+MiBBUEkgd2hpY2ggcGVyZm9ybXMgY29sb3IgZmlsdGVyaW5nIGZvciBzdWJwaXhlbCByZW5kZXJpbmcuCisgICAqLworI2RlZmluZSBGVF9VTlBBVEVOVEVEX0hJTlRJTkdfSCAgPGZyZWV0eXBlL3R0dW5wYXQuaD4KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9JTkNSRU1FTlRBTF9ICisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgRnJlZVR5cGV+MiBBUEkgd2hpY2ggcGVyZm9ybXMgY29sb3IgZmlsdGVyaW5nIGZvciBzdWJwaXhlbCByZW5kZXJpbmcuCisgICAqLworI2RlZmluZSBGVF9JTkNSRU1FTlRBTF9IICA8ZnJlZXR5cGUvZnRpbmNyZW0uaD4KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9HQVNQX0gKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKKyAgICogICBGcmVlVHlwZX4yIEFQSSB3aGljaCByZXR1cm5zIGVudHJpZXMgZnJvbSB0aGUgVHJ1ZVR5cGUgR0FTUCB0YWJsZS4KKyAgICovCisjZGVmaW5lIEZUX0dBU1BfSCAgPGZyZWV0eXBlL2Z0Z2FzcC5oPgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX0FEVkFOQ0VTX0gKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKKyAgICogICBGcmVlVHlwZX4yIEFQSSB3aGljaCByZXR1cm5zIGluZGl2aWR1YWwgYW5kIHJhbmdlZCBnbHlwaCBhZHZhbmNlcy4KKyAgICovCisjZGVmaW5lIEZUX0FEVkFOQ0VTX0ggIDxmcmVldHlwZS9mdGFkdmFuYy5oPgorCisKKyAgLyogKi8KKworI2RlZmluZSBGVF9FUlJPUl9ERUZJTklUSU9OU19IICA8ZnJlZXR5cGUvZnRlcnJkZWYuaD4KKworCisgIC8qIFRoZSBpbnRlcm5hbHMgb2YgdGhlIGNhY2hlIHN1Yi1zeXN0ZW0gYXJlIG5vIGxvbmdlciBleHBvc2VkLiAgV2UgKi8KKyAgLyogZGVmYXVsdCB0byBGVF9DQUNIRV9IIGF0IHRoZSBtb21lbnQganVzdCBpbiBjYXNlLCBidXQgd2Uga25vdyBvZiAqLworICAvKiBubyByb2d1ZSBjbGllbnQgdGhhdCB1c2VzIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfQ0FDSEVfTUFOQUdFUl9IICAgICAgICAgICA8ZnJlZXR5cGUvZnRjYWNoZS5oPgorI2RlZmluZSBGVF9DQUNIRV9JTlRFUk5BTF9NUlVfSCAgICAgIDxmcmVldHlwZS9mdGNhY2hlLmg+CisjZGVmaW5lIEZUX0NBQ0hFX0lOVEVSTkFMX01BTkFHRVJfSCAgPGZyZWV0eXBlL2Z0Y2FjaGUuaD4KKyNkZWZpbmUgRlRfQ0FDSEVfSU5URVJOQUxfQ0FDSEVfSCAgICA8ZnJlZXR5cGUvZnRjYWNoZS5oPgorI2RlZmluZSBGVF9DQUNIRV9JTlRFUk5BTF9HTFlQSF9IICAgIDxmcmVldHlwZS9mdGNhY2hlLmg+CisjZGVmaW5lIEZUX0NBQ0hFX0lOVEVSTkFMX0lNQUdFX0ggICAgPGZyZWV0eXBlL2Z0Y2FjaGUuaD4KKyNkZWZpbmUgRlRfQ0FDSEVfSU5URVJOQUxfU0JJVFNfSCAgICA8ZnJlZXR5cGUvZnRjYWNoZS5oPgorCisKKyNkZWZpbmUgRlRfSU5DUkVNRU5UQUxfSCAgICAgICAgICA8ZnJlZXR5cGUvZnRpbmNyZW0uaD4KKworI2RlZmluZSBGVF9UUlVFVFlQRV9VTlBBVEVOVEVEX0ggIDxmcmVldHlwZS90dHVucGF0Lmg+CisKKworICAvKgorICAgKiBJbmNsdWRlIGludGVybmFsIGhlYWRlcnMgZGVmaW5pdGlvbnMgZnJvbSA8aW50ZXJuYWwvLi4uPgorICAgKiBvbmx5IHdoZW4gYnVpbGRpbmcgdGhlIGxpYnJhcnkuCisgICAqLworI2lmZGVmIEZUMl9CVUlMRF9MSUJSQVJZCisjZGVmaW5lICBGVF9JTlRFUk5BTF9JTlRFUk5BTF9IICA8ZnJlZXR5cGUvaW50ZXJuYWwvaW50ZXJuYWwuaD4KKyNpbmNsdWRlIEZUX0lOVEVSTkFMX0lOVEVSTkFMX0gKKyNlbmRpZiAvKiBGVDJfQlVJTERfTElCUkFSWSAqLworCisKKyNlbmRpZiAvKiBfX0ZUMl9CVUlMRF9IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvY29uZmlnL2Z0bW9kdWxlLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2NvbmZpZy9mdG1vZHVsZS5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODZlNjRlCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaApAQCAtMCwwICsxLDg4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRvcHRpb24uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFVzZXItc2VsZWN0YWJsZSBjb25maWd1cmF0aW9uIG1hY3JvcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fRlRPUFRJT05fSF9fCisjZGVmaW5lIF9fRlRPUFRJT05fSF9fCisKKworI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CisKKworRlRfQkVHSU5fSEVBREVSCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgVVNFUi1TRUxFQ1RBQkxFIENPTkZJR1VSQVRJT04gTUFDUk9TICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIG1hY3JvIGRlZmluaXRpb25zIGZvciAgICAqLworICAvKiBhIHN0YW5kYXJkIGJ1aWxkIG9mIHRoZSBGcmVlVHlwZSBsaWJyYXJ5LiAgVGhlcmUgYXJlIHRocmVlIHdheXMgdG8gICAgKi8KKyAgLyogdXNlIHRoaXMgZmlsZSB0byBidWlsZCBwcm9qZWN0LXNwZWNpZmljIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5OiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgLSBZb3UgY2FuIG1vZGlmeSB0aGlzIGZpbGUgYnkgaGFuZCwgYnV0IHRoaXMgaXMgbm90IHJlY29tbWVuZGVkIGluICAgKi8KKyAgLyogICAgY2FzZXMgd2hlcmUgeW91IHdvdWxkIGxpa2UgdG8gYnVpbGQgc2V2ZXJhbCB2ZXJzaW9ucyBvZiB0aGUgICAgICAgICovCisgIC8qICAgIGxpYnJhcnkgZnJvbSBhIHNpbmdsZSBzb3VyY2UgZGlyZWN0b3J5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIC0gWW91IGNhbiBwdXQgYSBjb3B5IG9mIHRoaXMgZmlsZSBpbiB5b3VyIGJ1aWxkIGRpcmVjdG9yeSwgbW9yZSAgICAgICovCisgIC8qICAgIHByZWNpc2VseSBpbiBgJEJVSUxEL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oJywgd2hlcmUgYCRCVUlMRCcgICAqLworICAvKiAgICBpcyB0aGUgbmFtZSBvZiBhIGRpcmVjdG9yeSB0aGF0IGlzIGluY2x1ZGVkIF9iZWZvcmVfIHRoZSBGcmVlVHlwZSAgKi8KKyAgLyogICAgaW5jbHVkZSBwYXRoIGR1cmluZyBjb21waWxhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgZGVmYXVsdCBGcmVlVHlwZSBNYWtlZmlsZXMgYW5kIEphbWZpbGVzIHVzZSB0aGUgYnVpbGQgICAgICAgICAgKi8KKyAgLyogICAgZGlyZWN0b3J5IGBidWlsZHMvPHN5c3RlbT4nIGJ5IGRlZmF1bHQsIGJ1dCB5b3UgY2FuIGVhc2lseSBjaGFuZ2UgICovCisgIC8qICAgIHRoYXQgZm9yIHlvdXIgb3duIHByb2plY3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIC0gQ29weSB0aGUgZmlsZSA8ZnQyYnVpbGQuaD4gdG8gYCRCVUlMRC9mdDJidWlsZC5oJyBhbmQgbW9kaWZ5IGl0ICAgICovCisgIC8qICAgIHNsaWdodGx5IHRvIHByZS1kZWZpbmUgdGhlIG1hY3JvIEZUX0NPTkZJR19PUFRJT05TX0ggdXNlZCB0byAgICAgICAqLworICAvKiAgICBsb2NhdGUgdGhpcyBmaWxlIGR1cmluZyB0aGUgYnVpbGQuICBGb3IgZXhhbXBsZSwgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OU19IICA8bXlmdG9wdGlvbnMuaD4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICNpbmNsdWRlIDxmcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHdpbGwgdXNlIGAkQlVJTEQvbXlmdG9wdGlvbnMuaCcgaW5zdGVhZCBvZiB0aGlzIGZpbGUgZm9yIG1hY3JvICAgICAqLworICAvKiAgICBkZWZpbml0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE5vdGUgYWxzbyB0aGF0IHlvdSBjYW4gc2ltaWxhcmx5IHByZS1kZWZpbmUgdGhlIG1hY3JvICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9DT05GSUdfTU9EVUxFU19IIHVzZWQgdG8gbG9jYXRlIHRoZSBmaWxlIGxpc3Rpbmcgb2YgdGhlIG1vZHVsZXMgKi8KKyAgLyogICAgdGhhdCBhcmUgc3RhdGljYWxseSBsaW5rZWQgdG8gdGhlIGxpYnJhcnkgYXQgY29tcGlsZSB0aW1lLiAgQnkgICAgICovCisgIC8qICAgIGRlZmF1bHQsIHRoaXMgZmlsZSBpcyA8ZnJlZXR5cGUvY29uZmlnL2Z0bW9kdWxlLmg+LiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogV2UgaGlnaGx5IHJlY29tbWVuZCB1c2luZyB0aGUgdGhpcmQgbWV0aG9kIHdoZW5ldmVyIHBvc3NpYmxlLiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqIEcgRSBOIEUgUiBBIEwgICBGIFIgRSBFIFQgWSBQIEUgICAyICAgQyBPIE4gRiBJIEcgVSBSIEEgVCBJIE8gTiAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBVbmNvbW1lbnQgdGhlIGxpbmUgYmVsb3cgaWYgeW91IHdhbnQgdG8gYWN0aXZhdGUgc3ViLXBpeGVsIHJlbmRlcmluZyAgKi8KKyAgLyogKGEuay5hLiBMQ0QgcmVuZGVyaW5nLCBvciBDbGVhclR5cGUpIGluIHRoaXMgYnVpbGQgb2YgdGhlIGxpYnJhcnkuICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIGNvdmVyZWQgYnkgc2V2ZXJhbCBNaWNyb3NvZnQgcGF0ZW50cyAgICAgICAgKi8KKyAgLyogYW5kIHNob3VsZCBub3QgYmUgYWN0aXZhdGVkIGluIGFueSBkZWZhdWx0IGJ1aWxkIG9mIHRoZSBsaWJyYXJ5LiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGlzIG1hY3JvIGhhcyBubyBpbXBhY3Qgb24gdGhlIEZyZWVUeXBlIEFQSSwgb25seSBvbiBpdHMgICAgICAgICAgICAgKi8KKyAgLyogX2ltcGxlbWVudGF0aW9uXy4gIEZvciBleGFtcGxlLCB1c2luZyBGVF9SRU5ERVJfTU9ERV9MQ0Qgd2hlbiBjYWxsaW5nICovCisgIC8qIEZUX1JlbmRlcl9HbHlwaCBzdGlsbCBnZW5lcmF0ZXMgYSBiaXRtYXAgdGhhdCBpcyAzIHRpbWVzIHdpZGVyIHRoYW4gICAqLworICAvKiB0aGUgb3JpZ2luYWwgc2l6ZSBpbiBjYXNlIHRoaXMgbWFjcm8gaXNuJ3QgZGVmaW5lZDsgaG93ZXZlciwgZWFjaCAgICAgKi8KKyAgLyogdHJpcGxldCBvZiBzdWJwaXhlbHMgaGFzIFI9Rz1CLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGlzIGlzIGRvbmUgdG8gYWxsb3cgRnJlZVR5cGUgY2xpZW50cyB0byBydW4gdW5tb2RpZmllZCwgZm9yY2luZyAgICAgKi8KKyAgLyogdGhlbSB0byBkaXNwbGF5IG5vcm1hbCBncmF5LWxldmVsIGFudGktYWxpYXNlZCBnbHlwaHMuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBNYW55IGNvbXBpbGVycyBwcm92aWRlIGEgbm9uLUFOU0kgNjQtYml0IGRhdGEgdHlwZSB0aGF0IGNhbiBiZSB1c2VkICAgKi8KKyAgLyogYnkgRnJlZVR5cGUgdG8gc3BlZWQgdXAgc29tZSBjb21wdXRhdGlvbnMuICBIb3dldmVyLCB0aGlzIHdpbGwgY3JlYXRlICovCisgIC8qIHNvbWUgcHJvYmxlbXMgd2hlbiBjb21waWxpbmcgdGhlIGxpYnJhcnkgaW4gc3RyaWN0IEFOU0kgbW9kZS4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRm9yIHRoaXMgcmVhc29uLCB0aGUgdXNlIG9mIDY0LWJpdCBpbnRlZ2VycyBpcyBub3JtYWxseSBkaXNhYmxlZCB3aGVuICovCisgIC8qIHRoZSBfX1NURENfXyBtYWNybyBpcyBkZWZpbmVkLiAgWW91IGNhbiBob3dldmVyIGRpc2FibGUgdGhpcyBieSAgICAgICAqLworICAvKiBkZWZpbmluZyB0aGUgbWFjcm8gRlRfQ09ORklHX09QVElPTl9GT1JDRV9JTlQ2NCBoZXJlLiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEZvciBtb3N0IGNvbXBpbGVycywgdGhpcyB3aWxsIG9ubHkgY3JlYXRlIGNvbXBpbGF0aW9uIHdhcm5pbmdzIHdoZW4gICAqLworICAvKiBidWlsZGluZyB0aGUgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9iTm90ZTogVGhlIGNvbXBpbGVyLXNwZWNpZmljIDY0LWJpdCBpbnRlZ2VycyBhcmUgZGV0ZWN0ZWQgaW4gdGhlICAgICAqLworICAvKiAgICAgICAgIGZpbGUgYGZ0Y29uZmlnLmgnIGVpdGhlciBzdGF0aWNhbGx5IG9yIHRocm91Z2ggdGhlICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICBgY29uZmlndXJlJyBzY3JpcHQgb24gc3VwcG9ydGVkIHBsYXRmb3Jtcy4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3VuZGVmIEZUX0NPTkZJR19PUFRJT05fRk9SQ0VfSU5UNjQKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSWYgdGhpcyBtYWNybyBpcyBkZWZpbmVkLCBkbyBub3QgdHJ5IHRvIHVzZSBhbiBhc3NlbWJsZXIgdmVyc2lvbiBvZiAgICovCisgIC8qIHBlcmZvcm1hbmNlLWNyaXRpY2FsIGZ1bmN0aW9ucyAoZS5nLiBGVF9NdWxGaXgpLiAgWW91IHNob3VsZCBvbmx5IGRvICAqLworICAvKiB0aGF0IHRvIHZlcmlmeSB0aGF0IHRoZSBhc3NlbWJsZXIgZnVuY3Rpb24gd29ya3MgcHJvcGVybHksIG9yIHRvICAgICAgKi8KKyAgLyogZXhlY3V0ZSBiZW5jaG1hcmsgdGVzdHMgb2YgdGhlIHZhcmlvdXMgaW1wbGVtZW50YXRpb25zLiAgICAgICAgICAgICAgICovCisvKiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fTk9fQVNTRU1CTEVSICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIElmIHRoaXMgbWFjcm8gaXMgZGVmaW5lZCwgdHJ5IHRvIHVzZSBhbiBpbmxpbmVkIGFzc2VtYmxlciB2ZXJzaW9uIG9mICAqLworICAvKiB0aGUgYEZUX011bEZpeCcgZnVuY3Rpb24sIHdoaWNoIGlzIGEgYGhvdHNwb3QnIHdoZW4gbG9hZGluZyBhbmQgICAgICAgKi8KKyAgLyogaGludGluZyBnbHlwaHMsIGFuZCB3aGljaCBzaG91bGQgYmUgZXhlY3V0ZWQgYXMgZmFzdCBhcyBwb3NzaWJsZS4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBOb3RlIHRoYXQgaWYgeW91ciBjb21waWxlciBvciBDUFUgaXMgbm90IHN1cHBvcnRlZCwgdGhpcyB3aWxsIGRlZmF1bHQgKi8KKyAgLyogdG8gdGhlIHN0YW5kYXJkIGFuZCBwb3J0YWJsZSBpbXBsZW1lbnRhdGlvbiBmb3VuZCBpbiBgZnRjYWxjLmMnLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX0lOTElORV9NVUxGSVgKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTFpXLWNvbXByZXNzZWQgZmlsZSBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEZyZWVUeXBlIG5vdyBoYW5kbGVzIGZvbnQgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY29tcHJlc3NlZCB3aXRoIHRoZSAgKi8KKyAgLyogICBgY29tcHJlc3MnIHByb2dyYW0uICBUaGlzIGlzIG1vc3RseSB1c2VkIHRvIHBhcnNlIG1hbnkgb2YgdGhlIFBDRiAgICovCisgIC8qICAgZmlsZXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBYMTEgZGlzdHJpYnV0aW9ucy4gIFRoZSBpbXBsZW1lbnRhdGlvbiAqLworICAvKiAgIHVzZXMgTmV0QlNEJ3MgYHpvcGVuJyB0byBwYXJ0aWFsbHkgdW5jb21wcmVzcyB0aGUgZmlsZSBvbiB0aGUgZmx5ICAgKi8KKyAgLyogICAoc2VlIHNyYy9sencvZnRnemlwLmMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIERlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGlzIGBmZWF0dXJlJy4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fVVNFX0xaVworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBHemlwLWNvbXByZXNzZWQgZmlsZSBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRnJlZVR5cGUgbm93IGhhbmRsZXMgZm9udCBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjb21wcmVzc2VkIHdpdGggdGhlICAqLworICAvKiAgIGBnemlwJyBwcm9ncmFtLiAgVGhpcyBpcyBtb3N0bHkgdXNlZCB0byBwYXJzZSBtYW55IG9mIHRoZSBQQ0YgZmlsZXMgKi8KKyAgLyogICB0aGF0IGNvbWUgd2l0aCBYRnJlZTg2LiAgVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgYHpsaWInIHRvICAgICAgICAgICovCisgIC8qICAgcGFydGlhbGx5IHVuY29tcHJlc3MgdGhlIGZpbGUgb24gdGhlIGZseSAoc2VlIHNyYy9nemlwL2Z0Z3ppcC5jKS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBEZWZpbmUgdGhpcyBtYWNybyBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhpcyBgZmVhdHVyZScuICBTZWUgYWxzbyAgICovCisgIC8qICAgdGhlIG1hY3JvIEZUX0NPTkZJR19PUFRJT05fU1lTVEVNX1pMSUIgYmVsb3cuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8vI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1VTRV9aTElCCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFpMaWIgbGlicmFyeSBzZWxlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBUaGlzIG1hY3JvIGlzIG9ubHkgdXNlZCB3aGVuIEZUX0NPTkZJR19PUFRJT05fVVNFX1pMSUIgaXMgZGVmaW5lZC4gICovCisgIC8qICAgSXQgYWxsb3dzIEZyZWVUeXBlJ3MgYGZ0Z3ppcCcgY29tcG9uZW50IHRvIGxpbmsgdG8gdGhlIHN5c3RlbSdzICAgICAqLworICAvKiAgIGluc3RhbGxhdGlvbiBvZiB0aGUgWkxpYiBsaWJyYXJ5LiAgVGhpcyBpcyB1c2VmdWwgb24gc3lzdGVtcyBsaWtlICAgKi8KKyAgLyogICBVbml4IG9yIFZNUyB3aGVyZSBpdCBnZW5lcmFsbHkgaXMgYWxyZWFkeSBhdmFpbGFibGUuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIElmIHlvdSBsZXQgaXQgdW5kZWZpbmVkLCB0aGUgY29tcG9uZW50IHdpbGwgdXNlIGl0cyBvd24gY29weSAgICAgICAgKi8KKyAgLyogICBvZiB0aGUgemxpYiBzb3VyY2VzIGluc3RlYWQuICBUaGVzZSBoYXZlIGJlZW4gbW9kaWZpZWQgdG8gYmUgICAgICAgICovCisgIC8qICAgaW5jbHVkZWQgZGlyZWN0bHkgd2l0aGluIHRoZSBjb21wb25lbnQgYW5kICpub3QqIGV4cG9ydCBleHRlcm5hbCAgICAqLworICAvKiAgIGZ1bmN0aW9uIG5hbWVzLiAgVGhpcyBhbGxvd3MgeW91IHRvIGxpbmsgYW55IHByb2dyYW0gd2l0aCBGcmVlVHlwZSAgKi8KKyAgLyogICBfYW5kXyBaTGliIHdpdGhvdXQgbGlua2luZyBjb25mbGljdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIERvIG5vdCAjdW5kZWYgdGhpcyBtYWNybyBoZXJlIHNpbmNlIHRoZSBidWlsZCBzeXN0ZW0gbWlnaHQgZGVmaW5lICAgKi8KKyAgLyogICBpdCBmb3IgY2VydGFpbiBjb25maWd1cmF0aW9ucyBvbmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1NZU1RFTV9aTElCICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEJ6aXAyLWNvbXByZXNzZWQgZmlsZSBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBGcmVlVHlwZSBub3cgaGFuZGxlcyBmb250IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNvbXByZXNzZWQgd2l0aCB0aGUgICovCisgIC8qICAgYGJ6aXAyJyBwcm9ncmFtLiAgVGhpcyBpcyBtb3N0bHkgdXNlZCB0byBwYXJzZSBtYW55IG9mIHRoZSBQQ0YgICAgICAqLworICAvKiAgIGZpbGVzIHRoYXQgY29tZSB3aXRoIFhGcmVlODYuICBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyBgbGliYnoyJyB0byAgKi8KKyAgLyogICBwYXJ0aWFsbHkgdW5jb21wcmVzcyB0aGUgZmlsZSBvbiB0aGUgZmx5IChzZWUgc3JjL2J6aXAyL2Z0YnppcDIuYykuICovCisgIC8qICAgQ29udHJhcnkgdG8gZ3ppcCwgYnppcDIgY3VycmVudGx5IGlzIG5vdCBpbmNsdWRlZCBhbmQgbmVlZCB0byB1c2UgICAqLworICAvKiAgIHRoZSBzeXN0ZW0gYXZhaWxhYmxlIGJ6aXAyIGltcGxlbWVudGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoaXMgYGZlYXR1cmUnLiAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9VU0VfQlpJUDIgKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRGVmaW5lIHRvIGRpc2FibGUgdGhlIHVzZSBvZiBmaWxlIHN0cmVhbSBmdW5jdGlvbnMgYW5kIHR5cGVzLCBGSUxFLCAgICovCisgIC8qIGZvcGVuKCkgZXRjLiAgRW5hYmxlcyB0aGUgdXNlIG9mIHNtYWxsZXIgc3lzdGVtIGxpYnJhcmllcyBvbiBlbWJlZGRlZCAqLworICAvKiBzeXN0ZW1zIHRoYXQgaGF2ZSBtdWx0aXBsZSBzeXN0ZW0gbGlicmFyaWVzLCBzb21lIHdpdGggb3Igd2l0aG91dCAgICAgKi8KKyAgLyogZmlsZSBzdHJlYW0gc3VwcG9ydCwgaW4gdGhlIGNhc2VzIHdoZXJlIGZpbGUgc3RyZWFtIHN1cHBvcnQgaXMgbm90ICAgICovCisgIC8qIG5lY2Vzc2FyeSBzdWNoIGFzIG1lbW9yeSBsb2FkaW5nIG9mIGZvbnQgZmlsZXMuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9ESVNBQkxFX1NUUkVBTV9TVVBQT1JUICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFBORyBiaXRtYXAgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBGcmVlVHlwZSBub3cgaGFuZGxlcyBsb2FkaW5nIGNvbG9yIGJpdG1hcCBnbHlwaHMgaW4gdGhlIFBORyBmb3JtYXQuICovCisgIC8qICAgVGhpcyByZXF1aXJlcyBoZWxwIGZyb20gdGhlIGV4dGVybmFsIGxpYnBuZyBsaWJyYXJ5LiAgVW5jb21wcmVzc2VkICAqLworICAvKiAgIGNvbG9yIGJpdG1hcHMgZG8gbm90IG5lZWQgYW55IGV4dGVybmFsIGxpYnJhcmllcyBhbmQgd2lsbCBiZSAgICAgICAgKi8KKyAgLyogICBzdXBwb3J0ZWQgcmVnYXJkbGVzcyBvZiB0aGlzIGNvbmZpZ3VyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIERlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGlzIGBmZWF0dXJlJy4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fVVNFX1BORyAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBIYXJmQnV6eiBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRnJlZVR5cGUgdXNlcyB0aGUgSGFyZkJ1enogbGlicmFyeSB0byBpbXByb3ZlIGF1dG8taGludGluZyBvZiAgICAgICAqLworICAvKiAgIE9wZW5UeXBlIGZvbnRzLiAgSWYgYXZhaWxhYmxlLCBtYW55IGdseXBocyBub3QgZGlyZWN0bHkgYWRkcmVzc2FibGUgKi8KKyAgLyogICBieSBhIGZvbnQncyBjaGFyYWN0ZXIgbWFwIHdpbGwgYmUgaGludGVkIGFsc28uICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIERlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGlzIGBmZWF0dXJlJy4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fVVNFX0hBUkZCVVpaICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIERMTCBleHBvcnQgY29tcGlsYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBXaGVuIGNvbXBpbGluZyBGcmVlVHlwZSBhcyBhIERMTCwgc29tZSBzeXN0ZW1zL2NvbXBpbGVycyBuZWVkIGEgICAgICovCisgIC8qICAgc3BlY2lhbCBrZXl3b3JkIGluIGZyb250IE9SIGFmdGVyIHRoZSByZXR1cm4gdHlwZSBvZiBmdW5jdGlvbiAgICAgICAqLworICAvKiAgIGRlY2xhcmF0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgVHdvIG1hY3JvcyBhcmUgdXNlZCB3aXRoaW4gdGhlIEZyZWVUeXBlIHNvdXJjZSBjb2RlIHRvIGRlZmluZSAgICAgICAqLworICAvKiAgIGV4cG9ydGVkIGxpYnJhcnkgZnVuY3Rpb25zOiBGVF9FWFBPUlQgYW5kIEZUX0VYUE9SVF9ERUYuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBGVF9FWFBPUlQoIHJldHVybl90eXBlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgaXMgdXNlZCBpbiBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLCBhcyBpbiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICBGVF9Jbml0X0ZyZWVUeXBlKCBGVF9MaWJyYXJ5KiAgYWxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIEZUX0VYUE9SVF9ERUYoIHJldHVybl90eXBlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICBpcyB1c2VkIGluIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiwgYXMgaW4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgIEZUX0luaXRfRnJlZVR5cGUoIEZUX0xpYnJhcnkqICBhbGlicmFyeSApICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgcmV0dXJuIEZUX0Vycl9PazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFlvdSBjYW4gcHJvdmlkZSB5b3VyIG93biBpbXBsZW1lbnRhdGlvbiBvZiBGVF9FWFBPUlQgYW5kICAgICAgICAgICAgKi8KKyAgLyogICBGVF9FWFBPUlRfREVGIGhlcmUgaWYgeW91IHdhbnQuICBJZiB5b3UgbGVhdmUgdGhlbSB1bmRlZmluZWQsIHRoZXkgICovCisgIC8qICAgd2lsbCBiZSBsYXRlciBhdXRvbWF0aWNhbGx5IGRlZmluZWQgYXMgYGV4dGVybiByZXR1cm5fdHlwZScgdG8gICAgICAqLworICAvKiAgIGFsbG93IG5vcm1hbCBjb21waWxhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRG8gbm90ICN1bmRlZiB0aGVzZSBtYWNyb3MgaGVyZSBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0IGRlZmluZSAqLworICAvKiAgIHRoZW0gZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAjZGVmaW5lIEZUX0VYUE9SVCh4KSAgICAgIGV4dGVybiB4ICovCisvKiAjZGVmaW5lIEZUX0VYUE9SVF9ERUYoeCkgIHggKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogR2x5cGggUG9zdHNjcmlwdCBOYW1lcyBoYW5kbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEJ5IGRlZmF1bHQsIEZyZWVUeXBlIDIgaXMgY29tcGlsZWQgd2l0aCB0aGUgYHBzbmFtZXMnIG1vZHVsZS4gIFRoaXMgKi8KKyAgLyogICBtb2R1bGUgaXMgaW4gY2hhcmdlIG9mIGNvbnZlcnRpbmcgYSBnbHlwaCBuYW1lIHN0cmluZyBpbnRvIGEgICAgICAgICovCisgIC8qICAgVW5pY29kZSB2YWx1ZSwgb3IgcmV0dXJuIGEgTWFjaW50b3NoIHN0YW5kYXJkIGdseXBoIG5hbWUgZm9yIHRoZSAgICAqLworICAvKiAgIHVzZSB3aXRoIHRoZSBUcnVlVHlwZSBgcG9zdCcgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgVW5kZWZpbmUgdGhpcyBtYWNybyBpZiB5b3UgZG8gbm90IHdhbnQgYHBzbmFtZXMnIGNvbXBpbGVkIGluIHlvdXIgICAqLworICAvKiAgIGJ1aWxkIG9mIEZyZWVUeXBlLiAgVGhpcyBoYXMgdGhlIGZvbGxvd2luZyBlZmZlY3RzOiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgLSBUaGUgVHJ1ZVR5cGUgZHJpdmVyIHdpbGwgcHJvdmlkZSBpdHMgb3duIHNldCBvZiBnbHlwaCBuYW1lcywgICAgICAqLworICAvKiAgICAgaWYgeW91IGJ1aWxkIGl0IHRvIHN1cHBvcnQgcG9zdHNjcmlwdCBuYW1lcyBpbiB0aGUgVHJ1ZVR5cGUgICAgICAgKi8KKyAgLyogICAgIGBwb3N0JyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIC0gVGhlIFR5cGUgMSBkcml2ZXIgd2lsbCBub3QgYmUgYWJsZSB0byBzeW50aGVzaXplIGEgVW5pY29kZSAgICAgICAgKi8KKyAgLyogICAgIGNoYXJtYXAgb3V0IG9mIHRoZSBnbHlwaHMgZm91bmQgaW4gdGhlIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFlvdSB3b3VsZCBub3JtYWxseSB1bmRlZmluZSB0aGlzIGNvbmZpZ3VyYXRpb24gbWFjcm8gd2hlbiBidWlsZGluZyAgKi8KKyAgLyogICBhIHZlcnNpb24gb2YgRnJlZVR5cGUgdGhhdCBkb2Vzbid0IGNvbnRhaW4gYSBUeXBlIDEgb3IgQ0ZGIGRyaXZlci4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUG9zdHNjcmlwdCBOYW1lcyB0byBVbmljb2RlIFZhbHVlcyBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEJ5IGRlZmF1bHQsIEZyZWVUeXBlIDIgaXMgYnVpbHQgd2l0aCB0aGUgYFBTTmFtZXMnIG1vZHVsZSBjb21waWxlZCAgKi8KKyAgLyogICBpbi4gIEFtb25nIG90aGVyIHRoaW5ncywgdGhlIG1vZHVsZSBpcyB1c2VkIHRvIGNvbnZlcnQgYSBnbHlwaCBuYW1lICovCisgIC8qICAgaW50byBhIFVuaWNvZGUgdmFsdWUuICBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGluIG9yZGVyIHRvICAgICAgICAqLworICAvKiAgIHN5bnRoZXNpemUgb24gdGhlIGZseSBhIFVuaWNvZGUgY2hhcm1hcCBmcm9tIHRoZSBDRkYvVHlwZSAxIGRyaXZlciAgKi8KKyAgLyogICB0aHJvdWdoIGEgYmlnIHRhYmxlIG5hbWVkIHRoZSBgQWRvYmUgR2x5cGggTGlzdCcgKEFHTCkuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFVuZGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IGRvIG5vdCB3YW50IHRoZSBBZG9iZSBHbHlwaCBMaXN0ICAgICAgICAgKi8KKyAgLyogICBjb21waWxlZCBpbiB5b3VyIGBQU05hbWVzJyBtb2R1bGUuICBUaGUgVHlwZSAxIGRyaXZlciB3aWxsIG5vdCBiZSAgICovCisgIC8qICAgYWJsZSB0byBzeW50aGVzaXplIGEgVW5pY29kZSBjaGFybWFwIG91dCBvZiB0aGUgZ2x5cGhzIGZvdW5kIGluIHRoZSAqLworICAvKiAgIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fQURPQkVfR0xZUEhfTElTVAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdXBwb3J0IGZvciBNYWMgZm9udHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgc3VwcG9ydCBmb3Igb3V0bGluZSBmb250cyBpbiBNYWMgICAgICAqLworICAvKiAgIGZvcm1hdCAobWFjIGRmb250LCBtYWMgcmVzb3VyY2UsIG1hY2JpbmFyeSBjb250YWluaW5nIGEgbWFjICAgICAgICAgKi8KKyAgLyogICByZXNvdXJjZSkgb24gbm9uLU1hYyBwbGF0Zm9ybXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIE5vdGUgdGhhdCB0aGUgYEZPTkQnIHJlc291cmNlIGlzbid0IGNoZWNrZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgRlRfQ09ORklHX09QVElPTl9NQUNfRk9OVFMKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogR3Vlc3NpbmcgbWV0aG9kcyB0byBhY2Nlc3MgZW1iZWRkZWQgcmVzb3VyY2UgZm9ya3MgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEVuYWJsZSBleHRyYSBNYWMgZm9udHMgc3VwcG9ydCBvbiBub24tTWFjIHBsYXRmb3JtcyAoZS5nLiAgICAgICAgICAgKi8KKyAgLyogICBHTlUvTGludXgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFJlc291cmNlIGZvcmtzIHdoaWNoIGluY2x1ZGUgZm9udHMgZGF0YSBhcmUgc3RvcmVkIHNvbWV0aW1lcyBpbiAgICAgKi8KKyAgLyogICBsb2NhdGlvbnMgd2hpY2ggdXNlcnMgb3IgZGV2ZWxvcGVycyBkb24ndCBleHBlY3RlZC4gIEluIHNvbWUgY2FzZXMsICovCisgIC8qICAgcmVzb3VyY2UgZm9ya3Mgc3RhcnQgd2l0aCBzb21lIG9mZnNldCBmcm9tIHRoZSBoZWFkIG9mIGEgZmlsZS4gIEluICAqLworICAvKiAgIG90aGVyIGNhc2VzLCB0aGUgYWN0dWFsIHJlc291cmNlIGZvcmsgaXMgc3RvcmVkIGluIGZpbGUgZGlmZmVyZW50ICAgKi8KKyAgLyogICBmcm9tIHdoYXQgdGhlIHVzZXIgc3BlY2lmaWVzLiAgSWYgdGhpcyBvcHRpb24gaXMgYWN0aXZhdGVkLCAgICAgICAgICovCisgIC8qICAgRnJlZVR5cGUgdHJpZXMgdG8gZ3Vlc3Mgd2hldGhlciBzdWNoIG9mZnNldHMgb3IgZGlmZmVyZW50IGZpbGUgICAgICAqLworICAvKiAgIG5hbWVzIG11c3QgYmUgdXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgTm90ZSB0aGF0IG5vcm1hbCwgZGlyZWN0IGFjY2VzcyBvZiByZXNvdXJjZSBmb3JrcyBpcyBjb250cm9sbGVkIHZpYSAqLworICAvKiAgIHRoZSBGVF9DT05GSUdfT1BUSU9OX01BQ19GT05UUyBvcHRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZkZWYgRlRfQ09ORklHX09QVElPTl9NQUNfRk9OVFMKKyNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9HVUVTU0lOR19FTUJFRERFRF9SRk9SSworI2VuZGlmCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEFsbG93IHRoZSB1c2Ugb2YgRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlIHRvIGxvYWQgdHlwZWZhY2VzIHRoYXQgICAgICAqLworICAvKiBjb250YWluIG5vIGdseXBoIGRhdGEsIGJ1dCBzdXBwbHkgaXQgdmlhIGEgY2FsbGJhY2sgZnVuY3Rpb24uICAgICAgICAgKi8KKyAgLyogVGhpcyBpcyByZXF1aXJlZCBieSBjbGllbnRzIHN1cHBvcnRpbmcgZG9jdW1lbnQgZm9ybWF0cyB3aGljaCAgICAgICAgICovCisgIC8qIHN1cHBseSBmb250IGRhdGEgaW5jcmVtZW50YWxseSBhcyB0aGUgZG9jdW1lbnQgaXMgcGFyc2VkLCBzdWNoICAgICAgICAqLworICAvKiBhcyB0aGUgR2hvc3RzY3JpcHQgaW50ZXJwcmV0ZXIgZm9yIHRoZSBQb3N0U2NyaXB0IGxhbmd1YWdlLiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlbmRlciBwb29sIHVzZWQgYnkgdGhlIHNjYW4tbGluZSBjb252ZXJ0ZXIgICovCisgIC8qIHRvIGRvIGFsbCBvZiBpdHMgd29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfUkVOREVSX1BPT0xfU0laRSAgMTYzODRMCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEZUX01BWF9NT0RVTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBUaGUgbWF4aW11bSBudW1iZXIgb2YgbW9kdWxlcyB0aGF0IGNhbiBiZSByZWdpc3RlcmVkIGluIGEgc2luZ2xlICAgICovCisgIC8qICAgRnJlZVR5cGUgbGlicmFyeSBvYmplY3QuICAzMiBpcyB0aGUgZGVmYXVsdC4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfTUFYX01PRFVMRVMgIDMyCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIERlYnVnIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBGcmVlVHlwZSBjYW4gYmUgY29tcGlsZWQgaW4gZGVidWcgb3IgdHJhY2UgbW9kZS4gIEluIGRlYnVnIG1vZGUsICAgICovCisgIC8qICAgZXJyb3JzIGFyZSByZXBvcnRlZCB0aHJvdWdoIHRoZSBgZnRkZWJ1ZycgY29tcG9uZW50LiAgSW4gdHJhY2UgICAgICAqLworICAvKiAgIG1vZGUsIGFkZGl0aW9uYWwgbWVzc2FnZXMgYXJlIHNlbnQgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCBkdXJpbmcgICAgKi8KKyAgLyogICBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIERlZmluZSBGVF9ERUJVR19MRVZFTF9FUlJPUiB0byBidWlsZCB0aGUgbGlicmFyeSBpbiBkZWJ1ZyBtb2RlLiAgICAgKi8KKyAgLyogICBEZWZpbmUgRlRfREVCVUdfTEVWRUxfVFJBQ0UgdG8gYnVpbGQgaXQgaW4gdHJhY2UgbW9kZS4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIERvbid0IGRlZmluZSBhbnkgb2YgdGhlc2UgbWFjcm9zIHRvIGNvbXBpbGUgaW4gYHJlbGVhc2UnIG1vZGUhICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRG8gbm90ICN1bmRlZiB0aGVzZSBtYWNyb3MgaGVyZSBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0IGRlZmluZSAqLworICAvKiAgIHRoZW0gZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAjZGVmaW5lIEZUX0RFQlVHX0xFVkVMX0VSUk9SICovCisvKiAjZGVmaW5lIEZUX0RFQlVHX0xFVkVMX1RSQUNFICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEF1dG9maXR0ZXIgZGVidWdnaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBJZiBGVF9ERUJVR19BVVRPRklUIGlzIGRlZmluZWQsIEZyZWVUeXBlIHByb3ZpZGVzIHNvbWUgbWVhbnMgdG8gICAgICovCisgIC8qICAgY29udHJvbCB0aGUgYXV0b2ZpdHRlciBiZWhhdmlvdXIgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyB3aXRoIGdsb2JhbCAqLworICAvKiAgIGJvb2xlYW4gdmFyaWFibGVzIChjb25zZXF1ZW50bHksIHlvdSBzaG91bGQgKm5ldmVyKiBlbmFibGUgdGhpcyAgICAgKi8KKyAgLyogICB3aGlsZSBjb21waWxpbmcgaW4gYHJlbGVhc2UnIG1vZGUpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgX2FmX2RlYnVnX2Rpc2FibGVfaG9yel9oaW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIF9hZl9kZWJ1Z19kaXNhYmxlX3ZlcnRfaGludHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBfYWZfZGVidWdfZGlzYWJsZV9ibHVlX2hpbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBBZGRpdGlvbmFsbHksIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHByb3ZpZGUgZHVtcHMgb2YgdmFyaW91cyAgICAgICovCisgIC8qICAgaW50ZXJuYWwgYXV0b2ZpdCBzdHJ1Y3R1cmVzIHRvIHN0ZG91dCAodXNpbmcgYHByaW50ZicpOiAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIGFmX2dseXBoX2hpbnRzX2R1bXBfcG9pbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBhZl9nbHlwaF9oaW50c19kdW1wX3NlZ21lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgYWZfZ2x5cGhfaGludHNfZHVtcF9lZGdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIGFmX2dseXBoX2hpbnRzX2dldF9udW1fc2VnbWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBhZl9nbHlwaF9oaW50c19nZXRfc2VnbWVudF9vZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBBcyBhbiBhcmd1bWVudCwgdGhleSB1c2UgYW5vdGhlciBnbG9iYWwgdmFyaWFibGU6ICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgX2FmX2RlYnVnX2hpbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgUGxlYXNlIGhhdmUgYSBsb29rIGF0IHRoZSBgZnRncmlkJyBkZW1vIHByb2dyYW0gdG8gc2VlIGhvdyB0aG9zZSAgICAqLworICAvKiAgIHZhcmlhYmxlcyBhbmQgbWFjcm9zIHNob3VsZCBiZSB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRG8gbm90ICN1bmRlZiB0aGVzZSBtYWNyb3MgaGVyZSBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0IGRlZmluZSAqLworICAvKiAgIHRoZW0gZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAjZGVmaW5lIEZUX0RFQlVHX0FVVE9GSVQgKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTWVtb3J5IERlYnVnZ2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEZyZWVUeXBlIG5vdyBjb21lcyB3aXRoIGFuIGludGVncmF0ZWQgbWVtb3J5IGRlYnVnZ2VyIHRoYXQgaXMgICAgICAgKi8KKyAgLyogICBjYXBhYmxlIG9mIGRldGVjdGluZyBzaW1wbGUgZXJyb3JzIGxpa2UgbWVtb3J5IGxlYWtzIG9yIGRvdWJsZSAgICAgICovCisgIC8qICAgZGVsZXRlcy4gIFRvIGNvbXBpbGUgaXQgd2l0aGluIHlvdXIgYnVpbGQgb2YgdGhlIGxpYnJhcnksIHlvdSAgICAgICAqLworICAvKiAgIHNob3VsZCBkZWZpbmUgRlRfREVCVUdfTUVNT1JZIGhlcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgTm90ZSB0aGF0IHRoZSBtZW1vcnkgZGVidWdnZXIgaXMgb25seSBhY3RpdmF0ZWQgYXQgcnVudGltZSB3aGVuICAgICAqLworICAvKiAgIHdoZW4gdGhlIF9lbnZpcm9ubWVudF8gdmFyaWFibGUgYEZUMl9ERUJVR19NRU1PUlknIGlzIGRlZmluZWQgYWxzbyEgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRG8gbm90ICN1bmRlZiB0aGlzIG1hY3JvIGhlcmUgc2luY2UgdGhlIGJ1aWxkIHN5c3RlbSBtaWdodCBkZWZpbmUgICAqLworICAvKiAgIGl0IGZvciBjZXJ0YWluIGNvbmZpZ3VyYXRpb25zIG9ubHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAjZGVmaW5lIEZUX0RFQlVHX01FTU9SWSAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBNb2R1bGUgZXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgSWYgdGhpcyBtYWNybyBpcyBzZXQgKHdoaWNoIGlzIF9ub3RfIHRoZSBkZWZhdWx0KSwgdGhlIGhpZ2hlciBieXRlICAqLworICAvKiAgIG9mIGFuIGVycm9yIGNvZGUgZ2l2ZXMgdGhlIG1vZHVsZSBpbiB3aGljaCB0aGUgZXJyb3IgaGFzIG9jY3VycmVkLCAgKi8KKyAgLyogICB3aGlsZSB0aGUgbG93ZXIgYnl0ZSBpcyB0aGUgcmVhbCBlcnJvciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFNldHRpbmcgdGhpcyBtYWNybyBtYWtlcyBzZW5zZSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHksIHNpbmNlICAgKi8KKyAgLyogICBpdCB3b3VsZCBicmVhayBzb3VyY2UgY29tcGF0aWJpbGl0eSBvZiBjZXJ0YWluIHByb2dyYW1zIHRoYXQgdXNlICAgICovCisgIC8qICAgRnJlZVR5cGUgMi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBNb3JlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGluIHRoZSBmaWxlcyBmdG1vZGVyci5oIGFuZCBmdGVycm9ycy5oLiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3VuZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX01PRFVMRV9FUlJPUlMKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUG9zaXRpb24gSW5kZXBlbmRlbnQgQ29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIElmIHRoaXMgbWFjcm8gaXMgc2V0ICh3aGljaCBpcyBfbm90XyB0aGUgZGVmYXVsdCksIEZyZWVUeXBlMiB3aWxsICAgKi8KKyAgLyogICBhdm9pZCBjcmVhdGluZyBjb25zdGFudHMgdGhhdCByZXF1aXJlIGFkZHJlc3MgZml4dXBzLiAgSW5zdGVhZCB0aGUgICovCisgIC8qICAgY29uc3RhbnRzIHdpbGwgYmUgbW92ZWQgaW50byBhIHN0cnVjdCBhbmQgYWRkaXRpb25hbCBpbnRpYWxpemF0aW9uICAqLworICAvKiAgIGNvZGUgd2lsbCBiZSB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgU2V0dGluZyB0aGlzIG1hY3JvIGlzIG5lZWRlZCBmb3Igc3lzdGVtcyB0aGF0IHByb2hpYml0IGFkZHJlc3MgICAgICAqLworICAvKiAgIGZpeHVwcywgc3VjaCBhcyBCUkVXLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fUElDICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgUyBGIE4gVCAgIEQgUiBJIFYgRSBSICAgIEMgTyBOIEYgSSBHIFUgUiBBIFQgSSBPIE4gICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRGVmaW5lIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUyBpZiB5b3Ugd2FudCB0byBzdXBwb3J0ICAgICAgICovCisgIC8qIGVtYmVkZGVkIGJpdG1hcHMgaW4gYWxsIGZvcm1hdHMgdXNpbmcgdGhlIFNGTlQgbW9kdWxlIChuYW1lbHkgICAgICAgICAqLworICAvKiBUcnVlVHlwZSAmIE9wZW5UeXBlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byAgICAqLworICAvKiBsb2FkIGFuZCBlbnVtZXJhdGUgdGhlIGdseXBoIFBvc3RzY3JpcHQgbmFtZXMgaW4gYSBUcnVlVHlwZSBvciAgICAgICAgKi8KKyAgLyogT3BlblR5cGUgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBOb3RlIHRoYXQgd2hlbiB5b3UgZG8gbm90IGNvbXBpbGUgdGhlIGBQU05hbWVzJyBtb2R1bGUgYnkgdW5kZWZpbmluZyAgKi8KKyAgLyogdGhlIGFib3ZlIEZUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUywgdGhlIGBzZm50JyBtb2R1bGUgd2lsbCAgICovCisgIC8qIGNvbnRhaW4gYWRkaXRpb25hbCBjb2RlIHVzZWQgdG8gcmVhZCB0aGUgUFMgTmFtZXMgdGFibGUgZnJvbSBhIGZvbnQuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogKEJ5IGRlZmF1bHQsIHRoZSBtb2R1bGUgdXNlcyBgUFNOYW1lcycgdG8gZXh0cmFjdCBnbHlwaCBuYW1lcy4pICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRGVmaW5lIFRUX0NPTkZJR19PUFRJT05fU0ZOVF9OQU1FUyBpZiB5b3VyIGFwcGxpY2F0aW9ucyBuZWVkIHRvICAgICAgICovCisgIC8qIGFjY2VzcyB0aGUgaW50ZXJuYWwgbmFtZSB0YWJsZSBpbiBhIFNGTlQtYmFzZWQgZm9ybWF0IGxpa2UgVHJ1ZVR5cGUgICAqLworICAvKiBvciBPcGVuVHlwZS4gIFRoZSBuYW1lIHRhYmxlIGNvbnRhaW5zIHZhcmlvdXMgc3RyaW5ncyB1c2VkIHRvICAgICAgICAgKi8KKyAgLyogZGVzY3JpYmUgdGhlIGZvbnQsIGxpa2UgZmFtaWx5IG5hbWUsIGNvcHlyaWdodCwgdmVyc2lvbiwgZXRjLiAgSXQgICAgICovCisgIC8qIGRvZXMgbm90IGNvbnRhaW4gYW55IGdseXBoIG5hbWUgdGhvdWdoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQWNjZXNzaW5nIFNGTlQgbmFtZXMgaXMgZG9uZSB0aHJvdWdoIHRoZSBmdW5jdGlvbnMgZGVjbGFyZWQgaW4gICAgICAgICovCisgIC8qIGBmdHNuYW1lcy5oJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9TRk5UX05BTUVTCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRydWVUeXBlIENNYXAgc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBIZXJlIHlvdSBjYW4gZmluZS10dW5lIHdoaWNoIFRydWVUeXBlIENNYXAgdGFibGUgZm9ybWF0IHNoYWxsIGJlICAgICovCisgIC8qICAgc3VwcG9ydGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMAorI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMgorI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfNAorI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfNgorI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfOAorI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMTAKKyNkZWZpbmUgVFRfQ09ORklHX0NNQVBfRk9STUFUXzEyCisjZGVmaW5lIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8xMworI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMTQKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgIFQgUiBVIEUgVCBZIFAgRSAgIEQgUiBJIFYgRSBSICAgIEMgTyBOIEYgSSBHIFUgUiBBIFQgSSBPIE4gICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRGVmaW5lIFRUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVIgaWYgeW91IHdhbnQgdG8gY29tcGlsZSAgICovCisgIC8qIGEgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgaW4gdGhlIFRydWVUeXBlIGRyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQnkgdW5kZWZpbmluZyB0aGlzLCB5b3Ugd2lsbCBvbmx5IGNvbXBpbGUgdGhlIGNvZGUgbmVjZXNzYXJ5IHRvIGxvYWQgICovCisgIC8qIFRydWVUeXBlIGdseXBocyB3aXRob3V0IGhpbnRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBEbyBub3QgI3VuZGVmIHRoaXMgbWFjcm8gaGVyZSwgc2luY2UgdGhlIGJ1aWxkIHN5c3RlbSBtaWdodCAgICAgICAgICovCisgIC8qICAgZGVmaW5lIGl0IGZvciBjZXJ0YWluIGNvbmZpZ3VyYXRpb25zIG9ubHkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUlBSRVRFUgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HIGlmIHlvdSB3YW50IHRvIGNvbXBpbGUgICAgICAgKi8KKyAgLyogRVhQRVJJTUVOVEFMIHN1YnBpeGVsIGhpbnRpbmcgc3VwcG9ydCBpbnRvIHRoZSBUcnVlVHlwZSBkcml2ZXIuICBUaGlzICovCisgIC8qIHJlcGxhY2VzIHRoZSBuYXRpdmUgVHJ1ZVR5cGUgaGludGluZyBtZWNoYW5pc20gd2hlbiBhbnl0aGluZyBidXQgICAgICAqLworICAvKiBGVF9SRU5ERVJfTU9ERV9NT05PIGlzIHJlcXVlc3RlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEVuYWJsaW5nIHRoaXMgY2F1c2VzIHRoZSBUcnVlVHlwZSBkcml2ZXIgdG8gaWdub3JlIGluc3RydWN0aW9ucyB1bmRlciAqLworICAvKiBjZXJ0YWluIGNvbmRpdGlvbnMuICBUaGlzIGlzIGRvbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBndWlkZSBoZXJlLCAgKi8KKyAgLyogd2l0aCBzb21lIG1pbm9yIGRpZmZlcmVuY2VzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvY2xlYXJ0eXBlL3RydWV0eXBlY2xlYXJ0eXBlLmFzcHggKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEJ5IHVuZGVmaW5pbmcgdGhpcywgeW91IG9ubHkgY29tcGlsZSB0aGUgY29kZSBuZWNlc3NhcnkgdG8gaGludCAgICAgICAqLworICAvKiBUcnVlVHlwZSBnbHlwaHMgd2l0aCBuYXRpdmUgVFQgaGludGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgVGhpcyBvcHRpb24gcmVxdWlyZXMgVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUlBSRVRFUiB0byBiZSAgICAqLworICAvKiAgIGRlZmluZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAjZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBJZiB5b3UgZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HLCBhIHNwZWNpYWwgdmVyc2lvbiAgKi8KKyAgLyogb2YgdGhlIFRydWVUeXBlIGJ5dGVjb2RlIGludGVycHJldGVyIGlzIHVzZWQgdGhhdCBkb2Vzbid0IGltcGxlbWVudCAgICovCisgIC8qIGFueSBvZiB0aGUgcGF0ZW50ZWQgb3Bjb2RlcyBhbmQgYWxnb3JpdGhtcy4gIFRoZSBwYXRlbnRzIHJlbGF0ZWQgdG8gICAqLworICAvKiBUcnVlVHlwZSBoaW50aW5nIGhhdmUgZXhwaXJlZCB3b3JsZHdpZGUgc2luY2UgTWF5IDIwMTA7IHRoaXMgb3B0aW9uICAgKi8KKyAgLyogaXMgbm93IGRlcHJlY2F0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBOb3RlIHRoYXQgdGhlIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HIG1hY3JvIGlzICppZ25vcmVkKiAgKi8KKyAgLyogaWYgeW91IGRlZmluZSBUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSOyBpbiBvdGhlciB3b3JkcywgICovCisgIC8qIGVpdGhlciBkZWZpbmUgVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUlBSRVRFUiBvciAgICAgICAgICAgICAgICAqLworICAvKiBUVF9DT05GSUdfT1BUSU9OX1VOUEFURU5URURfSElOVElORyBidXQgbm90IGJvdGggYXQgdGhlIHNhbWUgdGltZS4gICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoaXMgbWFjcm8gaXMgb25seSB1c2VmdWwgZm9yIGEgc21hbGwgbnVtYmVyIG9mIGZvbnQgZmlsZXMgKG1vc3RseSAgICAqLworICAvKiBmb3IgQXNpYW4gc2NyaXB0cykgdGhhdCByZXF1aXJlIGJ5dGVjb2RlIGludGVycHJldGF0aW9uIHRvIHByb3Blcmx5ICAgKi8KKyAgLyogbG9hZCBnbHlwaHMuICBGb3IgYWxsIG90aGVyIGZvbnRzLCB0aGlzIHByb2R1Y2VzIHVucGxlYXNhbnQgcmVzdWx0cywgICovCisgIC8qIHRodXMgdGhlIHVucGF0ZW50ZWQgaW50ZXJwcmV0ZXIgaXMgbmV2ZXIgdXNlZCB0byBsb2FkIGdseXBocyBmcm9tICAgICAqLworICAvKiBUcnVlVHlwZSBmb250cyB1bmxlc3Mgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIG9wdGlvbnMgaXMgdXNlZC4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgLSBUaGUgdW5wYXRlbnRlZCBpbnRlcnByZXRlciBpcyBleHBsaWNpdGx5IGFjdGl2YXRlZCBieSB0aGUgdXNlciAgICAqLworICAvKiAgICAgdGhyb3VnaCB0aGUgRlRfUEFSQU1fVEFHX1VOUEFURU5URURfSElOVElORyBwYXJhbWV0ZXIgdGFnICAgICAgICAgKi8KKyAgLyogICAgIHdoZW4gb3BlbmluZyB0aGUgRlRfRmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIC0gRnJlZVR5cGUgZGV0ZWN0cyB0aGF0IHRoZSBGVF9GYWNlIGNvcnJlc3BvbmRzIHRvIG9uZSBvZiB0aGUgICAgICAgKi8KKyAgLyogICAgIGB0cmljaycgZm9udHMgKGUuZy4sIGBNaW5nbGl1JykgaXQga25vd3MgYWJvdXQuICBUaGUgZm9udCBlbmdpbmUgICovCisgIC8qICAgICBjb250YWlucyBhIGhhcmQtY29kZWQgbGlzdCBvZiBmb250IG5hbWVzIGFuZCBvdGhlciBtYXRjaGluZyAgICAgICAqLworICAvKiAgICAgcGFyYW1ldGVycyAoc2VlIGZ1bmN0aW9uIGB0dF9mYWNlX2luaXQnIGluIGZpbGUgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIGBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMnKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBIZXJlIGEgc2FtcGxlIGNvZGUgc25pcHBldCBmb3IgdXNpbmcgRlRfUEFSQU1fVEFHX1VOUEFURU5URURfSElOVElORy4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgRlRfUGFyYW1ldGVyICBwYXJhbWV0ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIEZUX09wZW5fQXJncyAgb3Blbl9hcmdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIHBhcmFtZXRlci50YWcgPSBGVF9QQVJBTV9UQUdfVU5QQVRFTlRFRF9ISU5USU5HOyAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgb3Blbl9hcmdzLmZsYWdzICAgICAgPSBGVF9PUEVOX1BBVEhOQU1FIHwgRlRfT1BFTl9QQVJBTVM7ICAgICAgICAgKi8KKyAgLyogICAgIG9wZW5fYXJncy5wYXRobmFtZSAgID0gbXlfZm9udF9wYXRobmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBvcGVuX2FyZ3MubnVtX3BhcmFtcyA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgb3Blbl9hcmdzLnBhcmFtcyAgICAgPSAmcGFyYW1ldGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBlcnJvciA9IEZUX09wZW5fRmFjZSggbGlicmFyeSwgJm9wZW5fYXJncywgaW5kZXgsICZmYWNlICk7ICAgICAgICAqLworICAvKiAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogI2RlZmluZSBUVF9DT05GSUdfT1BUSU9OX1VOUEFURU5URURfSElOVElORyAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9DT01QT05FTlRfT0ZGU0VUX1NDQUxFRCB0byBjb21waWxlIHRoZSAgICAgICAgKi8KKyAgLyogVHJ1ZVR5cGUgZ2x5cGggbG9hZGVyIHRvIHVzZSBBcHBsZSdzIGRlZmluaXRpb24gb2YgaG93IHRvIGhhbmRsZSAgICAgICovCisgIC8qIGNvbXBvbmVudCBvZmZzZXRzIGluIGNvbXBvc2l0ZSBnbHlwaHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQXBwbGUgYW5kIE1TIGRpc2FncmVlIG9uIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIGNvbXBvbmVudCBvZmZzZXRzICAgICovCisgIC8qIGluIGNvbXBvc2l0ZXMuICBBcHBsZSBzYXlzIHRoYXQgdGhleSBzaG91bGQgYmUgc2NhbGVkIGJ5IHRoZSBzY2FsaW5nICAqLworICAvKiBmYWN0b3JzIGluIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggKHJvdWdobHksIGl0J3MgbW9yZSBjb21wbGV4KSAgICAgKi8KKyAgLyogd2hpbGUgTVMgc2F5cyB0aGV5IHNob3VsZCBub3QuICBPcGVuVHlwZSBkZWZpbmVzIHR3byBiaXRzIGluIHRoZSAgICAgICovCisgIC8qIGNvbXBvc2l0ZSBmbGFncyBhcnJheSB3aGljaCBjYW4gYmUgdXNlZCB0byBkaXNhbWJpZ3VhdGUsIGJ1dCBvbGQgICAgICAqLworICAvKiBmb250cyB3aWxsIG5vdCBoYXZlIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvb3RzcGVjL2dseWYuaHRtICAgICAgICAgICAgICAgICAqLworICAvKiAgIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9mb250cy9UcnVlVHlwZS1SZWZlcmVuY2UtTWFudWFsL1JNMDYvQ2hhcDZnbHlmLmh0bWwgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgVFRfQ09ORklHX09QVElPTl9DT01QT05FTlRfT0ZGU0VUX1NDQUxFRAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVCBpZiB5b3Ugd2FudCB0byBpbmNsdWRlICAgICAgICAgKi8KKyAgLyogc3VwcG9ydCBmb3IgQXBwbGUncyBkaXN0b3J0YWJsZSBmb250IHRlY2hub2xvZ3kgKGZ2YXIsIGd2YXIsIGN2YXIsICAgICovCisgIC8qIGFuZCBhdmFyIHRhYmxlcykuICBUaGlzIGhhcyBtYW55IHNpbWlsYXJpdGllcyB0byBUeXBlIDEgTXVsdGlwbGUgICAgICAqLworICAvKiBNYXN0ZXJzIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9CREYgaWYgeW91IHdhbnQgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciAgICAgICAgKi8KKyAgLyogYW4gZW1iZWRkZWQgYEJERiAnIHRhYmxlIHdpdGhpbiBTRk5ULWJhc2VkIGJpdG1hcCBmb3JtYXRzLiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3VuZGVmIFRUX0NPTkZJR19PUFRJT05fQkRGCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgIFQgWSBQIEUgMSAgIEQgUiBJIFYgRSBSICAgIEMgTyBOIEYgSSBHIFUgUiBBIFQgSSBPIE4gICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVDFfTUFYX0RJQ1RfREVQVEggaXMgdGhlIG1heGltdW0gZGVwdGggb2YgbmVzdCBkaWN0aW9uYXJpZXMgYW5kICAgICAgICovCisgIC8qIGFycmF5cyBpbiB0aGUgVHlwZSAxIHN0cmVhbSAoc2VlIHQxbG9hZC5jKS4gIEEgbWluaW11bSBvZiA0IGlzICAgICAgICAqLworICAvKiByZXF1aXJlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFQxX01BWF9ESUNUX0RFUFRIICA1CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFQxX01BWF9TVUJSU19DQUxMUyBkZXRhaWxzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBuZXN0ZWQgc3ViLXJvdXRpbmUgICAqLworICAvKiBjYWxscyBkdXJpbmcgZ2x5cGggbG9hZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFQxX01BWF9TVUJSU19DQUxMUyAgMTYKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVDFfTUFYX0NIQVJTVFJJTkdfT1BFUkFORFMgaXMgdGhlIGNoYXJzdHJpbmcgc3RhY2sncyBjYXBhY2l0eS4gIEEgICAgICovCisgIC8qIG1pbmltdW0gb2YgMTYgaXMgcmVxdWlyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlIENoaW5lc2UgZm9udCBNaW5nVGlFRy1NZWRpdW0gKENOUyAxMTY0MyBjaGFyYWN0ZXIgc2V0KSBuZWVkcyAyNTYuICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUMV9NQVhfQ0hBUlNUUklOR1NfT1BFUkFORFMgIDUxMgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBEZWZpbmUgdGhpcyBjb25maWd1cmF0aW9uIG1hY3JvIGlmIHlvdSB3YW50IHRvIHByZXZlbnQgdGhlICAgICAgICAgICAgKi8KKyAgLyogY29tcGlsYXRpb24gb2YgYHQxYWZtJywgd2hpY2ggaXMgaW4gY2hhcmdlIG9mIHJlYWRpbmcgVHlwZSAxIEFGTSAgICAgICovCisgIC8qIGZpbGVzIGludG8gYW4gZXhpc3RpbmcgZmFjZS4gIE5vdGUgdGhhdCBpZiBzZXQsIHRoZSBUMSBkcml2ZXIgd2lsbCBiZSAqLworICAvKiB1bmFibGUgdG8gcHJvZHVjZSBrZXJuaW5nIGRpc3RhbmNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgVDFfQ09ORklHX09QVElPTl9OT19BRk0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRGVmaW5lIHRoaXMgY29uZmlndXJhdGlvbiBtYWNybyBpZiB5b3Ugd2FudCB0byBwcmV2ZW50IHRoZSAgICAgICAgICAgICovCisgIC8qIGNvbXBpbGF0aW9uIG9mIHRoZSBNdWx0aXBsZSBNYXN0ZXJzIGZvbnQgc3VwcG9ydCBpbiB0aGUgVHlwZSAxICAgICAgICAqLworICAvKiBkcml2ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgVDFfQ09ORklHX09QVElPTl9OT19NTV9TVVBQT1JUCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgIEMgRiBGICAgRCBSIEkgViBFIFIgICAgQyBPIE4gRiBJIEcgVSBSIEEgVCBJIE8gTiAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVXNpbmcgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl97WCxZfXsxLDIsMyw0fSBpdCBpcyAgICAgICovCisgIC8qIHBvc3NpYmxlIHRvIHNldCB1cCB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YgdGhlIGZvdXIgY29udHJvbCBwb2ludHMgdGhhdCAqLworICAvKiBkZWZpbmUgdGhlIHN0ZW0gZGFya2VuaW5nIGJlaGF2aW91ciBvZiB0aGUgKG5ldykgQ0ZGIGVuZ2luZS4gIEZvciAgICAgKi8KKyAgLyogbW9yZSBkZXRhaWxzIHBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIGBkYXJrZW5pbmctcGFyYW1ldGVycycgcHJvcGVydHkgb2YgdGhlIGNmZiBkcml2ZXIgbW9kdWxlIChmaWxlICAgICAgICAqLworICAvKiBgZnRjZmZkcnYuaCcpLCB3aGljaCBhbGxvd3MgdGhlIGNvbnRyb2wgYXQgcnVuLXRpbWUuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIERvICpub3QqIHVuZGVmaW5lIHRoZXNlIG1hY3JvcyEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMSAgIDUwMAorI2RlZmluZSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kxICAgNDAwCisKKyNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMiAgMTAwMAorI2RlZmluZSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kyICAgMjc1CisKKyNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMyAgMTY2NworI2RlZmluZSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kzICAgMjc1CisKKyNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YNCAgMjMzMworI2RlZmluZSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1k0ICAgICAwCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIENGRl9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUgY29udHJvbHMgd2hldGhlciB0aGUgcHJlLUFkb2JlIENGRiAgICAgICAqLworICAvKiBlbmdpbmUgZ2V0cyBjb21waWxlZCBpbnRvIEZyZWVUeXBlLiAgSWYgZGVmaW5lZCwgaXQgaXMgcG9zc2libGUgdG8gICAgKi8KKyAgLyogc3dpdGNoIGJldHdlZW4gdGhlIHR3byBlbmdpbmVzIHVzaW5nIHRoZSBgaGludGluZy1lbmdpbmUnIHByb3BlcnR5IG9mICovCisgIC8qIHRoZSBjZmYgZHJpdmVyIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORSAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgQSBVIFQgTyBGIEkgVCAgIE0gTyBEIFUgTCBFICAgIEMgTyBOIEYgSSBHIFUgUiBBIFQgSSBPIE4gICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIENvbXBpbGUgYXV0b2ZpdCBtb2R1bGUgd2l0aCBDSksgKENoaW5lc2UsIEphcGFuZXNlLCBLb3JlYW4pIHNjcmlwdCAgICAqLworICAvKiBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFGX0NPTkZJR19PUFRJT05fQ0pLCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBDb21waWxlIGF1dG9maXQgbW9kdWxlIHdpdGggSW5kaWMgc2NyaXB0IHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFGX0NPTkZJR19PUFRJT05fSU5ESUMKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIENvbXBpbGUgYXV0b2ZpdCBtb2R1bGUgd2l0aCB3YXJwIGhpbnRpbmcuICBUaGUgaWRlYSBvZiB0aGUgd2FycGluZyAgICAqLworICAvKiBjb2RlIGlzIHRvIHNsaWdodGx5IHNjYWxlIGFuZCBzaGlmdCBhIGdseXBoIHdpdGhpbiBhIHNpbmdsZSBkaW1lbnNpb24gKi8KKyAgLyogc28gdGhhdCBhcyBtdWNoIG9mIGl0cyBzZWdtZW50cyBhcmUgYWxpZ25lZCAobW9yZSBvciBsZXNzKSBvbiB0aGUgICAgICovCisgIC8qIGdyaWQuICBUbyBmaW5kIG91dCB0aGUgb3B0aW1hbCBzY2FsaW5nIGFuZCBzaGlmdGluZyB2YWx1ZSwgdmFyaW91cyAgICAqLworICAvKiBwYXJhbWV0ZXIgY29tYmluYXRpb25zIGFyZSB0cmllZCBhbmQgc2NvcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoaXMgZXhwZXJpbWVudGFsIG9wdGlvbiBpcyBhY3RpdmUgb25seSBpZiB0aGUgcmVuZGVyaW5nIG1vZGUgaXMgICAgICAqLworICAvKiBGVF9SRU5ERVJfTU9ERV9MSUdIVDsgeW91IGNhbiBzd2l0Y2ggd2FycGluZyBvbiBhbmQgb2ZmIHdpdGggdGhlICAgICAgKi8KKyAgLyogYHdhcnBpbmcnIHByb3BlcnR5IG9mIHRoZSBhdXRvLWhpbnRlciAoc2VlIGZpbGUgYGZ0YXV0b2guaCcgZm9yIG1vcmUgICovCisgIC8qIGluZm9ybWF0aW9uOyBieSBkZWZhdWx0IGl0IGlzIHN3aXRjaGVkIG9mZikuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQUZfQ09ORklHX09QVElPTl9VU0VfV0FSUEVSCisKKyAgLyogKi8KKworCisgIC8qCisgICAqIFRoaXMgbWFjcm8gaXMgb2Jzb2xldGUuICBTdXBwb3J0IGhhcyBiZWVuIHJlbW92ZWQgaW4gRnJlZVR5cGUKKyAgICogdmVyc2lvbiAyLjUuCisgICAqLworLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMgKi8KKworCisgIC8qCisgICAqIFRoaXMgbWFjcm8gaXMgZGVmaW5lZCBpZiBlaXRoZXIgdW5wYXRlbnRlZCBvciBuYXRpdmUgVHJ1ZVR5cGUKKyAgICogaGludGluZyBpcyByZXF1ZXN0ZWQgYnkgdGhlIGRlZmluaXRpb25zIGFib3ZlLgorICAgKi8KKyNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSCisjZGVmaW5lICBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKKyN1bmRlZiAgIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HCisjZWxpZiBkZWZpbmVkIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HCisjZGVmaW5lICBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKKyNlbmRpZgorCisKKyAgLyoKKyAgICogQ2hlY2sgQ0ZGIGRhcmtlbmluZyBwYXJhbWV0ZXJzLiAgVGhlIGNoZWNrcyBhcmUgdGhlIHNhbWUgYXMgaW4gZnVuY3Rpb24KKyAgICogYGNmZl9wcm9wZXJ0eV9zZXQnIGluIGZpbGUgYGNmZmRyaXZyLmMnLgorICAgKi8KKyNpZiBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1gxIDwgMCAgIHx8IFwKKyAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1gyIDwgMCAgIHx8IFwKKyAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1gzIDwgMCAgIHx8IFwKKyAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1g0IDwgMCAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kxIDwgMCAgIHx8IFwKKyAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kyIDwgMCAgIHx8IFwKKyAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kzIDwgMCAgIHx8IFwKKyAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1k0IDwgMCAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1gxID4gICAgICAgIFwKKyAgICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDIgICAgIHx8IFwKKyAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1gyID4gICAgICAgIFwKKyAgICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDMgICAgIHx8IFwKKyAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1gzID4gICAgICAgIFwKKyAgICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDQgICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kxID4gNTAwIHx8IFwKKyAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kyID4gNTAwIHx8IFwKKyAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kzID4gNTAwIHx8IFwKKyAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1k0ID4gNTAwCisjZXJyb3IgIkludmFsaWQgQ0ZGIGRhcmtlbmluZyBwYXJhbWV0ZXJzISIKKyNlbmRpZgorCitGVF9FTkRfSEVBREVSCisKKworI2VuZGlmIC8qIF9fRlRPUFRJT05fSF9fICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdHN0ZGxpYi5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRzdGRsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjQ3MWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRzdGRsaWIuaApAQCAtMCwwICsxLDE3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRzdGRsaWIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFOU0ktc3BlY2lmaWMgbGlicmFyeSBhbmQgaGVhZGVyIGNvbmZpZ3VyYXRpb24gZmlsZSAoc3BlY2lmaWNhdGlvbiAgICovCisvKiAgICBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwMi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGdyb3VwIGFsbCAjaW5jbHVkZXMgdG8gdGhlIEFOU0kgQyBsaWJyYXJ5IHRoYXQgICAqLworICAvKiBGcmVlVHlwZSBub3JtYWxseSByZXF1aXJlcy4gIEl0IGFsc28gZGVmaW5lcyBtYWNyb3MgdG8gcmVuYW1lIHRoZSAgICAgKi8KKyAgLyogc3RhbmRhcmQgZnVuY3Rpb25zIHdpdGhpbiB0aGUgRnJlZVR5cGUgc291cmNlIGNvZGUuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBMb2FkIGEgZmlsZSB3aGljaCBkZWZpbmVzIF9fRlRTVERMSUJfSF9fIGJlZm9yZSB0aGlzIG9uZSB0byBvdmVycmlkZSAgKi8KKyAgLyogaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fRlRTVERMSUJfSF9fCisjZGVmaW5lIF9fRlRTVERMSUJfSF9fCisKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjZGVmaW5lIGZ0X3B0cmRpZmZfdCAgcHRyZGlmZl90CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdlciBsaW1pdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVUlOVF9NQVggYW5kIFVMT05HX01BWCBhcmUgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGNvbXB1dGUgdGhlIHNpemUgICovCisgIC8qIG9mIGBpbnQnIGFuZCBgbG9uZycgaW4gYnl0ZXMgYXQgY29tcGlsZS10aW1lLiAgU28gZmFyLCB0aGlzIHdvcmtzICAqLworICAvKiBmb3IgYWxsIHBsYXRmb3JtcyB0aGUgbGlicmFyeSBoYXMgYmVlbiB0ZXN0ZWQgb24uICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE5vdGUgdGhhdCBvbiB0aGUgZXh0cmVtZWx5IHJhcmUgcGxhdGZvcm1zIHRoYXQgZG8gbm90IHByb3ZpZGUgICAgICAqLworICAvKiBpbnRlZ2VyIHR5cGVzIHRoYXQgYXJlIF9leGFjdGx5XyAxNiBhbmQgMzIgYml0cyB3aWRlIChlLmcuIHNvbWUgICAgKi8KKyAgLyogb2xkIENyYXlzIHdoZXJlIGBpbnQnIGlzIDM2IGJpdHMpLCB3ZSBkbyBub3QgbWFrZSBhbnkgZ3VhcmFudGVlICAgICovCisgIC8qIGFib3V0IHRoZSBjb3JyZWN0IGJlaGF2aW91ciBvZiBGVDIgd2l0aCBhbGwgZm9udHMuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSW4gdGhlc2UgY2FzZSwgYGZ0Y29uZmlnLmgnIHdpbGwgcmVmdXNlIHRvIGNvbXBpbGUgYW55d2F5IHdpdGggYSAgICovCisgIC8qIG1lc3NhZ2UgbGlrZSBgY291bGRuJ3QgZmluZCAzMi1iaXQgdHlwZScgb3Igc29tZXRoaW5nIHNpbWlsYXIuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjZGVmaW5lIEZUX0NIQVJfQklUICAgIENIQVJfQklUCisjZGVmaW5lIEZUX1VTSE9SVF9NQVggIFVTSFJUX01BWAorI2RlZmluZSBGVF9JTlRfTUFYICAgICBJTlRfTUFYCisjZGVmaW5lIEZUX0lOVF9NSU4gICAgIElOVF9NSU4KKyNkZWZpbmUgRlRfVUlOVF9NQVggICAgVUlOVF9NQVgKKyNkZWZpbmUgRlRfTE9OR19NQVggICAgTE9OR19NQVgKKyNkZWZpbmUgRlRfVUxPTkdfTUFYICAgVUxPTkdfTUFYCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgYW5kIHN0cmluZyBwcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIGZ0X21lbWNociAgIG1lbWNocgorI2RlZmluZSBmdF9tZW1jbXAgICBtZW1jbXAKKyNkZWZpbmUgZnRfbWVtY3B5ICAgbWVtY3B5CisjZGVmaW5lIGZ0X21lbW1vdmUgIG1lbW1vdmUKKyNkZWZpbmUgZnRfbWVtc2V0ICAgbWVtc2V0CisjZGVmaW5lIGZ0X3N0cmNhdCAgIHN0cmNhdAorI2RlZmluZSBmdF9zdHJjbXAgICBzdHJjbXAKKyNkZWZpbmUgZnRfc3RyY3B5ICAgc3RyY3B5CisjZGVmaW5lIGZ0X3N0cmxlbiAgIHN0cmxlbgorI2RlZmluZSBmdF9zdHJuY21wICBzdHJuY21wCisjZGVmaW5lIGZ0X3N0cm5jcHkgIHN0cm5jcHkKKyNkZWZpbmUgZnRfc3RycmNociAgc3RycmNocgorI2RlZmluZSBmdF9zdHJzdHIgICBzdHJzdHIKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGhhbmRsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2RlZmluZSBGVF9GSUxFICAgICBGSUxFCisjZGVmaW5lIGZ0X2ZjbG9zZSAgIGZjbG9zZQorI2RlZmluZSBmdF9mb3BlbiAgICBmb3BlbgorI2RlZmluZSBmdF9mcmVhZCAgICBmcmVhZAorI2RlZmluZSBmdF9mc2VlayAgICBmc2VlaworI2RlZmluZSBmdF9mdGVsbCAgICBmdGVsbAorI2RlZmluZSBmdF9zcHJpbnRmICBzcHJpbnRmCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lIGZ0X3Fzb3J0ICBxc29ydAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSBhbGxvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNkZWZpbmUgZnRfc2NhbGxvYyAgIGNhbGxvYworI2RlZmluZSBmdF9zZnJlZSAgICAgZnJlZQorI2RlZmluZSBmdF9zbWFsbG9jICAgbWFsbG9jCisjZGVmaW5lIGZ0X3NyZWFsbG9jICByZWFsbG9jCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNjZWxsYW5lb3VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2RlZmluZSBmdF9hdG9sICBhdG9sCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbiBjb250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgPHNldGptcC5oPgorCisjZGVmaW5lIGZ0X2ptcF9idWYgICAgIGptcF9idWYgIC8qIG5vdGU6IHRoaXMgY2Fubm90IGJlIGEgdHlwZWRlZiBzaW5jZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICBqbXBfYnVmIGlzIGRlZmluZWQgYXMgYSBtYWNybyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgb24gY2VydGFpbiBwbGF0Zm9ybXMgICAgICAgICAgICovCisKKyNkZWZpbmUgZnRfbG9uZ2ptcCAgICAgbG9uZ2ptcAorI2RlZmluZSBmdF9zZXRqbXAoIGIgKSBzZXRqbXAoICooZnRfam1wX2J1ZiopICYoYikgKSAvKiBzYW1lIHRoaW5nIGhlcmUgKi8KKworCisgIC8qIHRoZSBmb2xsb3dpbmcgaXMgb25seSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIGkuZS4sIGlmICovCisgIC8qIEZUX0RFQlVHX0xFVkVMX0VSUk9SIG9yIEZUX0RFQlVHX0xFVkVMX1RSQUNFIGFyZSBkZWZpbmVkICAgICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworCisjZW5kaWYgLyogX19GVFNURExJQl9IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjI0N2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oCkBAIC0wLDAgKzEsNDIwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnJlZXR5cGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWVUeXBlIGhpZ2gtbGV2ZWwgQVBJIGFuZCBjb21tb24gdHlwZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fRlJFRVRZUEVfSF9fCisjZGVmaW5lIF9fRlJFRVRZUEVfSF9fCisKKworI2lmbmRlZiBGVF9GUkVFVFlQRV9ICisjZXJyb3IgImBmdDJidWlsZC5oJyBoYXNuJ3QgYmVlbiBpbmNsdWRlZCB5ZXQhIgorI2Vycm9yICJQbGVhc2UgYWx3YXlzIHVzZSBtYWNyb3MgdG8gaW5jbHVkZSBGcmVlVHlwZSBoZWFkZXIgZmlsZXMuIgorI2Vycm9yICJFeGFtcGxlOiIKKyNlcnJvciAiICAjaW5jbHVkZSA8ZnQyYnVpbGQuaD4iCisjZXJyb3IgIiAgI2luY2x1ZGUgRlRfRlJFRVRZUEVfSCIKKyNlbmRpZgorCisKKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorI2luY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ICisjaW5jbHVkZSBGVF9UWVBFU19ICisjaW5jbHVkZSBGVF9FUlJPUlNfSAorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBoZWFkZXJfaW5jbHVzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSdzIGhlYWRlciBpbmNsdXNpb24gc2NoZW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBIb3cgY2xpZW50IGFwcGxpY2F0aW9ucyBzaG91bGQgaW5jbHVkZSBGcmVlVHlwZSBoZWFkZXIgZmlsZXMuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUbyBiZSBhcyBmbGV4aWJsZSBhcyBwb3NzaWJsZSAoYW5kIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMpLCAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgdXNlcyBhIHZlcnkgc3BlY2lhbCBpbmNsdXNpb24gc2NoZW1lIHRvIGxvYWQgaGVhZGVyICAgICAgICovCisgIC8qICAgIGZpbGVzLCBmb3IgZXhhbXBsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAjaW5jbHVkZSBGVF9GUkVFVFlQRV9IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgI2luY2x1ZGUgRlRfT1VUTElORV9IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgY29tcGlsZXIgYW5kIGl0cyBwcmVwcm9jZXNzb3Igb25seSBuZWVkcyBhbiBpbmNsdWRlIHBhdGggdG8gZmluZCAqLworICAvKiAgICB0aGUgZmlsZSBgZnQyYnVpbGQuaCc7IHRoZSBleGFjdCBsb2NhdGlvbnMgYW5kIG5hbWVzIG9mIHRoZSBvdGhlciAgKi8KKyAgLyogICAgRnJlZVR5cGUgaGVhZGVyIGZpbGVzIGFyZSBoaWRkZW4gYnkgcHJlcHJvY2Vzc29yIG1hY3JvIG5hbWVzLCAgICAgICovCisgIC8qICAgIGxvYWRlZCBieSBgZnQyYnVpbGQuaCcuICBUaGUgQVBJIGRvY3VtZW50YXRpb24gYWx3YXlzIGdpdmVzIHRoZSAgICAqLworICAvKiAgICBoZWFkZXIgbWFjcm8gbmFtZSBuZWVkZWQgZm9yIGEgcGFydGljdWxhciBmdW5jdGlvbi4gICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdXNlcl9hbGxvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVXNlciBhbGxvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSG93IGNsaWVudCBhcHBsaWNhdGlvbnMgc2hvdWxkIGFsbG9jYXRlIEZyZWVUeXBlIGRhdGEgc3RydWN0dXJlcy4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgYXNzdW1lcyB0aGF0IHN0cnVjdHVyZXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyIGFuZCBwYXNzZWQgICovCisgIC8qICAgIGFzIGFyZ3VtZW50cyBhcmUgemVyb2VkIG91dCBleGNlcHQgZm9yIHRoZSBhY3R1YWwgZGF0YS4gIEluIG90aGVyICAqLworICAvKiAgICB3b3JkcywgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGBjYWxsb2MnIChvciB2YXJpYW50cyBvZiBpdCkgICAgICAgKi8KKyAgLyogICAgaW5zdGVhZCBvZiBgbWFsbG9jJyBmb3IgYWxsb2NhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICBCIEEgUyBJIEMgICBUIFkgUCBFIFMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBiYXNlX2ludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBCYXNlIEludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgRnJlZVR5cGV+MiBiYXNlIGZvbnQgaW50ZXJmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGltcG9ydGFudCBwdWJsaWMgaGlnaC1sZXZlbCBBUEkgICAgKi8KKyAgLyogICAgZnVuY3Rpb25zIG9mIEZyZWVUeXBlfjIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3JkZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2x5cGhTbG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0NoYXJNYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9FbmNvZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRU5DX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GYWNlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GQUNFX0ZMQUdfRklYRURfU0laRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRkFDRV9GTEFHX0ZJWEVEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZBQ0VfRkxBR19IT1JJWk9OVEFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GQUNFX0ZMQUdfVkVSVElDQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRkFDRV9GTEFHX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZBQ0VfRkxBR19TRk5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GQUNFX0ZMQUdfQ0lEX0tFWUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRkFDRV9GTEFHX1RSSUNLWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZBQ0VfRkxBR19LRVJOSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GQUNFX0ZMQUdfTVVMVElQTEVfTUFTVEVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRkFDRV9GTEFHX0dMWVBIX05BTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZBQ0VfRkxBR19FWFRFUk5BTF9TVFJFQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GQUNFX0ZMQUdfSElOVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRkFDRV9GTEFHX1RSSUNLWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9IQVNfSE9SSVpPTlRBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfSEFTX1ZFUlRJQ0FMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0hBU19LRVJOSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9IQVNfRklYRURfU0laRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfSEFTX0dMWVBIX05BTUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0hBU19NVUxUSVBMRV9NQVNURVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9IQVNfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0lTX1NGTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9JU19TQ0FMQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfSVNfRklYRURfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0lTX0NJRF9LRVlFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9JU19UUklDS1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1NUWUxFX0ZMQUdfQk9MRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TVFlMRV9GTEFHX0lUQUxJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1NpemVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TaXplX01ldHJpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0dseXBoU2xvdFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HbHlwaF9NZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU3ViR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9CaXRtYXBfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0luaXRfRnJlZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9Eb25lX0ZyZWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX05ld19GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9Eb25lX0ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUmVmZXJlbmNlX0ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX05ld19NZW1vcnlfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PcGVuX0ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT3Blbl9BcmdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1BhcmFtZXRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9BdHRhY2hfRmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfQXR0YWNoX1N0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TZXRfQ2hhcl9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU2V0X1BpeGVsX1NpemVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1JlcXVlc3RfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TZWxlY3RfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU2l6ZV9SZXF1ZXN0X1R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1NpemVfUmVxdWVzdFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TaXplX1JlcXVlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU2V0X1RyYW5zZm9ybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xvYWRfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZXRfQ2hhcl9JbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2V0X0ZpcnN0X0NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0dldF9OZXh0X0NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZXRfTmFtZV9JbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTG9hZF9DaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PUEVOX01FTU9SWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT1BFTl9TVFJFQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX09QRU5fUEFUSE5BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PUEVOX0RSSVZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT1BFTl9QQVJBTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MT0FEX0RFRkFVTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTE9BRF9SRU5ERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xPQURfTU9OT0NIUk9NRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MT0FEX0xJTkVBUl9ERVNJR04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTE9BRF9OT19TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xPQURfTk9fSElOVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MT0FEX05PX0JJVE1BUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTE9BRF9OT19BVVRPSElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xPQURfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTE9BRF9WRVJUSUNBTF9MQVlPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xPQURfSUdOT1JFX1RSQU5TRk9STSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MT0FEX0ZPUkNFX0FVVE9ISU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTE9BRF9OT19SRUNVUlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xPQURfUEVEQU5USUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTE9BRF9UQVJHRVRfTk9STUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xPQURfVEFSR0VUX0xJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MT0FEX1RBUkdFVF9NT05PICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTE9BRF9UQVJHRVRfTENEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xPQURfVEFSR0VUX0xDRF9WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTE9BRF9UQVJHRVRfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9SZW5kZXJfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUmVuZGVyX01vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0dldF9LZXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9LZXJuaW5nX01vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2V0X1RyYWNrX0tlcm5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0dldF9HbHlwaF9OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZXRfUG9zdHNjcmlwdF9OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0NoYXJNYXBSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TZWxlY3RfQ2hhcm1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU2V0X0NoYXJtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0dldF9DaGFybWFwX0luZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2V0X0ZTVHlwZV9GbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0dldF9TdWJHbHlwaF9JbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRmFjZV9JbnRlcm5hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1NpemVfSW50ZXJuYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TbG90X0ludGVybmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZBQ0VfRkxBR19YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TVFlMRV9GTEFHX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT1BFTl9YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xPQURfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MT0FEX1RBUkdFVF9YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU1VCR0xZUEhfRkxBR19YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZTVFlQRV9YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfSEFTX0ZBU1RfR0xZUEhTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0dseXBoX01ldHJpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgdGhlIG1ldHJpY3Mgb2YgYSBzaW5nbGUgZ2x5cGguICBUaGUgICAgICAqLworICAvKiAgICB2YWx1ZXMgYXJlIGV4cHJlc3NlZCBpbiAyNi42IGZyYWN0aW9uYWwgcGl4ZWwgZm9ybWF0OyBpZiB0aGUgZmxhZyAgKi8KKyAgLyogICAgQEZUX0xPQURfTk9fU0NBTEUgaGFzIGJlZW4gdXNlZCB3aGlsZSBsb2FkaW5nIHRoZSBnbHlwaCwgdmFsdWVzICAgICovCisgIC8qICAgIGFyZSBleHByZXNzZWQgaW4gZm9udCB1bml0cyBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHdpZHRoIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIFRoZSBnbHlwaCdzIHdpZHRoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGhlaWdodCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIFRoZSBnbHlwaCdzIGhlaWdodC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGhvcmlCZWFyaW5nWCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIExlZnQgc2lkZSBiZWFyaW5nIGZvciBob3Jpem9udGFsIGxheW91dC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGhvcmlCZWFyaW5nWSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIFRvcCBzaWRlIGJlYXJpbmcgZm9yIGhvcml6b250YWwgbGF5b3V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGhvcmlBZHZhbmNlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIEFkdmFuY2Ugd2lkdGggZm9yIGhvcml6b250YWwgbGF5b3V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHZlcnRCZWFyaW5nWCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIExlZnQgc2lkZSBiZWFyaW5nIGZvciB2ZXJ0aWNhbCBsYXlvdXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHZlcnRCZWFyaW5nWSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIFRvcCBzaWRlIGJlYXJpbmcgZm9yIHZlcnRpY2FsIGxheW91dC4gIExhcmdlciBwb3NpdGl2ZSB2YWx1ZXMgICAgKi8KKyAgLyogICAgICBtZWFuIGZ1cnRoZXIgYmVsb3cgdGhlIHZlcnRpY2FsIGdseXBoIG9yaWdpbi4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB2ZXJ0QWR2YW5jZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBBZHZhbmNlIGhlaWdodCBmb3IgdmVydGljYWwgbGF5b3V0LiAgUG9zaXRpdmUgdmFsdWVzIG1lYW4gdGhlICAgICovCisgIC8qICAgICAgZ2x5cGggaGFzIGEgcG9zaXRpdmUgYWR2YW5jZSBkb3dud2FyZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIElmIG5vdCBkaXNhYmxlZCB3aXRoIEBGVF9MT0FEX05PX0hJTlRJTkcsIHRoZSB2YWx1ZXMgcmVwcmVzZW50ICAgICAqLworICAvKiAgICBkaW1lbnNpb25zIG9mIHRoZSBoaW50ZWQgZ2x5cGggKGluIGNhc2UgaGludGluZyBpcyBhcHBsaWNhYmxlKS4gICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFN0cm9raW5nIGEgZ2x5cGggd2l0aCBhbiBvdXRzaWRlIGJvcmRlciBkb2VzIG5vdCBpbmNyZWFzZSAgICAgICAgICAqLworICAvKiAgICBgaG9yaUFkdmFuY2UnIG9yIGB2ZXJ0QWR2YW5jZSc7IHlvdSBoYXZlIHRvIG1hbnVhbGx5IGFkanVzdCB0aGVzZSAgKi8KKyAgLyogICAgdmFsdWVzIHRvIGFjY291bnQgZm9yIHRoZSBhZGRlZCB3aWR0aCBhbmQgaGVpZ2h0LiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgRlRfR2x5cGhfTWV0cmljc18KKyAgeworICAgIEZUX1BvcyAgd2lkdGg7CisgICAgRlRfUG9zICBoZWlnaHQ7CisKKyAgICBGVF9Qb3MgIGhvcmlCZWFyaW5nWDsKKyAgICBGVF9Qb3MgIGhvcmlCZWFyaW5nWTsKKyAgICBGVF9Qb3MgIGhvcmlBZHZhbmNlOworCisgICAgRlRfUG9zICB2ZXJ0QmVhcmluZ1g7CisgICAgRlRfUG9zICB2ZXJ0QmVhcmluZ1k7CisgICAgRlRfUG9zICB2ZXJ0QWR2YW5jZTsKKworICB9IEZUX0dseXBoX01ldHJpY3M7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9CaXRtYXBfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIHN0cnVjdHVyZSBtb2RlbHMgdGhlIG1ldHJpY3Mgb2YgYSBiaXRtYXAgc3RyaWtlIChpLmUuLCBhIHNldCAgKi8KKyAgLyogICAgb2YgZ2x5cGhzIGZvciBhIGdpdmVuIHBvaW50IHNpemUgYW5kIHJlc29sdXRpb24pIGluIGEgYml0bWFwIGZvbnQuICovCisgIC8qICAgIEl0IGlzIHVzZWQgZm9yIHRoZSBgYXZhaWxhYmxlX3NpemVzJyBmaWVsZCBvZiBARlRfRmFjZS4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGhlaWdodCA6OiBUaGUgdmVydGljYWwgZGlzdGFuY2UsIGluIHBpeGVscywgYmV0d2VlbiB0d28gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgY29uc2VjdXRpdmUgYmFzZWxpbmVzLiAgSXQgaXMgYWx3YXlzIHBvc2l0aXZlLiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHdpZHRoICA6OiBUaGUgYXZlcmFnZSB3aWR0aCwgaW4gcGl4ZWxzLCBvZiBhbGwgZ2x5cGhzIGluIHRoZSAgICAgICAqLworICAvKiAgICAgICAgICAgICAgc3RyaWtlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNpemUgICA6OiBUaGUgbm9taW5hbCBzaXplIG9mIHRoZSBzdHJpa2UgaW4gMjYuNiBmcmFjdGlvbmFsICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgcG9pbnRzLiAgVGhpcyBmaWVsZCBpcyBub3QgdmVyeSB1c2VmdWwuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHhfcHBlbSA6OiBUaGUgaG9yaXpvbnRhbCBwcGVtIChub21pbmFsIHdpZHRoKSBpbiAyNi42IGZyYWN0aW9uYWwgICAqLworICAvKiAgICAgICAgICAgICAgcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHlfcHBlbSA6OiBUaGUgdmVydGljYWwgcHBlbSAobm9taW5hbCBoZWlnaHQpIGluIDI2LjYgZnJhY3Rpb25hbCAgICAqLworICAvKiAgICAgICAgICAgICAgcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBXaW5kb3dzIEZOVDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBUaGUgbm9taW5hbCBzaXplIGdpdmVuIGluIGEgRk5UIGZvbnQgaXMgbm90IHJlbGlhYmxlLiAgVGh1cyB3aGVuICovCisgIC8qICAgICAgdGhlIGRyaXZlciBmaW5kcyBpdCBpbmNvcnJlY3QsIGl0IHNldHMgYHNpemUnIHRvIHNvbWUgY2FsY3VsYXRlZCAqLworICAvKiAgICAgIHZhbHVlcyBhbmQgc2V0cyBgeF9wcGVtJyBhbmQgYHlfcHBlbScgdG8gdGhlIHBpeGVsIHdpZHRoIGFuZCAgICAgKi8KKyAgLyogICAgICBoZWlnaHQgZ2l2ZW4gaW4gdGhlIGZvbnQsIHJlc3BlY3RpdmVseS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlbWJlZGRlZCBiaXRtYXBzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBgc2l6ZScsIGB3aWR0aCcsIGFuZCBgaGVpZ2h0JyB2YWx1ZXMgYXJlIG5vdCBjb250YWluZWQgaW4gdGhlICAgICovCisgIC8qICAgICAgYml0bWFwIHN0cmlrZSBpdHNlbGYuICBUaGV5IGFyZSBjb21wdXRlZCBmcm9tIHRoZSBnbG9iYWwgZm9udCAgICAqLworICAvKiAgICAgIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBGVF9CaXRtYXBfU2l6ZV8KKyAgeworICAgIEZUX1Nob3J0ICBoZWlnaHQ7CisgICAgRlRfU2hvcnQgIHdpZHRoOworCisgICAgRlRfUG9zICAgIHNpemU7CisKKyAgICBGVF9Qb3MgICAgeF9wcGVtOworICAgIEZUX1BvcyAgICB5X3BwZW07CisKKyAgfSBGVF9CaXRtYXBfU2l6ZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgTyBCIEogRSBDIFQgICBDIEwgQSBTIFMgRSBTICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgaGFuZGxlIHRvIGEgRnJlZVR5cGUgbGlicmFyeSBpbnN0YW5jZS4gIEVhY2ggYGxpYnJhcnknIGlzICAgICAgICAqLworICAvKiAgICBjb21wbGV0ZWx5IGluZGVwZW5kZW50IGZyb20gdGhlIG90aGVyczsgaXQgaXMgdGhlIGByb290JyBvZiBhIHNldCAgKi8KKyAgLyogICAgb2Ygb2JqZWN0cyBsaWtlIGZvbnRzLCBmYWNlcywgc2l6ZXMsIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJdCBhbHNvIGVtYmVkcyBhIG1lbW9yeSBtYW5hZ2VyIChzZWUgQEZUX01lbW9yeSksIGFzIHdlbGwgYXMgYSAgICAgKi8KKyAgLyogICAgc2Nhbi1saW5lIGNvbnZlcnRlciBvYmplY3QgKHNlZSBARlRfUmFzdGVyKS4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJbiBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMgaXQgaXMgZWFzaWVzdCB0byB1c2Ugb25lICAgICAgICAgICAgKi8KKyAgLyogICAgYEZUX0xpYnJhcnknIG9iamVjdCBwZXIgdGhyZWFkLiAgSW4gY2FzZSB0aGlzIGlzIHRvbyBjdW1iZXJzb21lLCAgICovCisgIC8qICAgIGEgc2luZ2xlIGBGVF9MaWJyYXJ5JyBvYmplY3QgYWNyb3NzIHRocmVhZHMgaXMgcG9zc2libGUgYWxzbyAgICAgICAqLworICAvKiAgICAoc2luY2UgRnJlZVR5cGUgdmVyc2lvbiAyLjUuNiksIGFzIGxvbmcgYXMgYSBtdXRleCBsb2NrIGlzIHVzZWQgICAgKi8KKyAgLyogICAgYXJvdW5kIEBGVF9OZXdfRmFjZSBhbmQgQEZUX0RvbmVfRmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTGlicmFyeSBvYmplY3RzIGFyZSBub3JtYWxseSBjcmVhdGVkIGJ5IEBGVF9Jbml0X0ZyZWVUeXBlLCBhbmQgICAgICovCisgIC8qICAgIGRlc3Ryb3llZCB3aXRoIEBGVF9Eb25lX0ZyZWVUeXBlLiAgSWYgeW91IG5lZWQgcmVmZXJlbmNlLWNvdW50aW5nICAqLworICAvKiAgICAoY2YuIEBGVF9SZWZlcmVuY2VfTGlicmFyeSksIHVzZSBARlRfTmV3X0xpYnJhcnkgYW5kICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQEZUX0RvbmVfTGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCBGVF9MaWJyYXJ5UmVjXyAgKkZUX0xpYnJhcnk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtb2R1bGVfbWFuYWdlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX01vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgaGFuZGxlIHRvIGEgZ2l2ZW4gRnJlZVR5cGUgbW9kdWxlIG9iamVjdC4gIEVhY2ggbW9kdWxlIGNhbiBiZSBhICAqLworICAvKiAgICBmb250IGRyaXZlciwgYSByZW5kZXJlciwgb3IgYW55dGhpbmcgZWxzZSB0aGF0IHByb3ZpZGVzIHNlcnZpY2VzICAgKi8KKyAgLyogICAgdG8gdGhlIGZvcm1lcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCBGVF9Nb2R1bGVSZWNfKiAgRlRfTW9kdWxlOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBoYW5kbGUgdG8gYSBnaXZlbiBGcmVlVHlwZSBmb250IGRyaXZlciBvYmplY3QuICBFYWNoIGZvbnQgZHJpdmVyICovCisgIC8qICAgIGlzIGEgc3BlY2lhbCBtb2R1bGUgY2FwYWJsZSBvZiBjcmVhdGluZyBmYWNlcyBmcm9tIGZvbnQgZmlsZXMuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgRlRfRHJpdmVyUmVjXyogIEZUX0RyaXZlcjsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1JlbmRlcmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgaGFuZGxlIHRvIGEgZ2l2ZW4gRnJlZVR5cGUgcmVuZGVyZXIuICBBIHJlbmRlcmVyIGlzIGEgc3BlY2lhbCAgICAqLworICAvKiAgICBtb2R1bGUgaW4gY2hhcmdlIG9mIGNvbnZlcnRpbmcgYSBnbHlwaCBpbWFnZSB0byBhIGJpdG1hcCwgd2hlbiAgICAgKi8KKyAgLyogICAgbmVjZXNzYXJ5LiAgRWFjaCByZW5kZXJlciBzdXBwb3J0cyBhIGdpdmVuIGdseXBoIGltYWdlIGZvcm1hdCwgYW5kICovCisgIC8qICAgIG9uZSBvciBtb3JlIHRhcmdldCBzdXJmYWNlIGRlcHRocy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgRlRfUmVuZGVyZXJSZWNfKiAgRlRfUmVuZGVyZXI7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBiYXNlX2ludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgaGFuZGxlIHRvIGEgZ2l2ZW4gdHlwb2dyYXBoaWMgZmFjZSBvYmplY3QuICBBIGZhY2Ugb2JqZWN0IG1vZGVscyAqLworICAvKiAgICBhIGdpdmVuIHR5cGVmYWNlLCBpbiBhIGdpdmVuIHN0eWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFYWNoIGZhY2Ugb2JqZWN0IGFsc28gb3ducyBhIHNpbmdsZSBARlRfR2x5cGhTbG90IG9iamVjdCwgYXMgd2VsbCAgKi8KKyAgLyogICAgYXMgb25lIG9yIG1vcmUgQEZUX1NpemUgb2JqZWN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBVc2UgQEZUX05ld19GYWNlIG9yIEBGVF9PcGVuX0ZhY2UgdG8gY3JlYXRlIGEgbmV3IGZhY2Ugb2JqZWN0IGZyb20gKi8KKyAgLyogICAgYSBnaXZlbiBmaWxlcGF0aG5hbWUgb3IgYSBjdXN0b20gaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBVc2UgQEZUX0RvbmVfRmFjZSB0byBkZXN0cm95IGl0IChhbG9uZyB3aXRoIGl0cyBzbG90IGFuZCBzaXplcykuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFuIGBGVF9GYWNlJyBvYmplY3QgY2FuIG9ubHkgYmUgc2FmZWx5IHVzZWQgZnJvbSBvbmUgdGhyZWFkIGF0IGEgICAqLworICAvKiAgICB0aW1lLiAgU2ltaWxhcmx5LCBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gb2YgYEZUX0ZhY2UnIHdpdGggdGhlICAgKi8KKyAgLyogICAgc2FtZSBARlRfTGlicmFyeSBvYmplY3QgY2FuIG9ubHkgYmUgZG9uZSBmcm9tIG9uZSB0aHJlYWQgYXQgYSAgICAgICovCisgIC8qICAgIHRpbWUuICBPbiB0aGUgb3RoZXIgaGFuZCwgZnVuY3Rpb25zIGxpa2UgQEZUX0xvYWRfR2x5cGggYW5kIGl0cyAgICAqLworICAvKiAgICBzaWJsaW5ncyBhcmUgdGhyZWFkLXNhZmUgYW5kIGRvIG5vdCBuZWVkIHRoZSBsb2NrIHRvIGJlIGhlbGQgYXMgICAgKi8KKyAgLyogICAgbG9uZyBhcyB0aGUgc2FtZSBgRlRfRmFjZScgb2JqZWN0IGlzIG5vdCB1c2VkIGZyb20gbXVsdGlwbGUgICAgICAgICovCisgIC8qICAgIHRocmVhZHMgYXQgdGhlIHNhbWUgdGltZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEFsc28+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFNlZSBARlRfRmFjZVJlYyBmb3IgdGhlIHB1YmxpY2x5IGFjY2Vzc2libGUgZmllbGRzIG9mIGEgZ2l2ZW4gZmFjZSAqLworICAvKiAgICBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IEZUX0ZhY2VSZWNfKiAgRlRfRmFjZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgaGFuZGxlIHRvIGFuIG9iamVjdCB1c2VkIHRvIG1vZGVsIGEgZmFjZSBzY2FsZWQgdG8gYSBnaXZlbiAgICAgICAqLworICAvKiAgICBjaGFyYWN0ZXIgc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFYWNoIEBGVF9GYWNlIGhhcyBhbiBfYWN0aXZlXyBARlRfU2l6ZSBvYmplY3QgdGhhdCBpcyB1c2VkIGJ5ICAgICAgKi8KKyAgLyogICAgZnVuY3Rpb25zIGxpa2UgQEZUX0xvYWRfR2x5cGggdG8gZGV0ZXJtaW5lIHRoZSBzY2FsaW5nICAgICAgICAgICAgICovCisgIC8qICAgIHRyYW5zZm9ybWF0aW9uIHRoYXQgaW4gdHVybiBpcyB1c2VkIHRvIGxvYWQgYW5kIGhpbnQgZ2x5cGhzIGFuZCAgICAqLworICAvKiAgICBtZXRyaWNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFlvdSBjYW4gdXNlIEBGVF9TZXRfQ2hhcl9TaXplLCBARlRfU2V0X1BpeGVsX1NpemVzLCAgICAgICAgICAgICAgICAqLworICAvKiAgICBARlRfUmVxdWVzdF9TaXplIG9yIGV2ZW4gQEZUX1NlbGVjdF9TaXplIHRvIGNoYW5nZSB0aGUgY29udGVudCAgICAgKi8KKyAgLyogICAgKGkuZS4sIHRoZSBzY2FsaW5nIHZhbHVlcykgb2YgdGhlIGFjdGl2ZSBARlRfU2l6ZS4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBZb3UgY2FuIHVzZSBARlRfTmV3X1NpemUgdG8gY3JlYXRlIGFkZGl0aW9uYWwgc2l6ZSBvYmplY3RzIGZvciBhICAgKi8KKyAgLyogICAgZ2l2ZW4gQEZUX0ZhY2UsIGJ1dCB0aGV5IHdvbid0IGJlIHVzZWQgYnkgb3RoZXIgZnVuY3Rpb25zIHVudGlsICAgICovCisgIC8qICAgIHlvdSBhY3RpdmF0ZSBpdCB0aHJvdWdoIEBGVF9BY3RpdmF0ZV9TaXplLiAgT25seSBvbmUgc2l6ZSBjYW4gYmUgICAqLworICAvKiAgICBhY3RpdmF0ZWQgYXQgYW55IGdpdmVuIHRpbWUgcGVyIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxBbHNvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTZWUgQEZUX1NpemVSZWMgZm9yIHRoZSBwdWJsaWNseSBhY2Nlc3NpYmxlIGZpZWxkcyBvZiBhIGdpdmVuIHNpemUgKi8KKyAgLyogICAgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCBGVF9TaXplUmVjXyogIEZUX1NpemU7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HbHlwaFNsb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGhhbmRsZSB0byBhIGdpdmVuIGBnbHlwaCBzbG90Jy4gIEEgc2xvdCBpcyBhIGNvbnRhaW5lciB3aGVyZSBpdCAgKi8KKyAgLyogICAgaXMgcG9zc2libGUgdG8gbG9hZCBhbnkgb2YgdGhlIGdseXBocyBjb250YWluZWQgaW4gaXRzIHBhcmVudCAgICAgICovCisgIC8qICAgIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSW4gb3RoZXIgd29yZHMsIGVhY2ggdGltZSB5b3UgY2FsbCBARlRfTG9hZF9HbHlwaCBvciAgICAgICAgICAgICAgICovCisgIC8qICAgIEBGVF9Mb2FkX0NoYXIsIHRoZSBzbG90J3MgY29udGVudCBpcyBlcmFzZWQgYnkgdGhlIG5ldyBnbHlwaCBkYXRhLCAqLworICAvKiAgICBpLmUuLCB0aGUgZ2x5cGgncyBtZXRyaWNzLCBpdHMgaW1hZ2UgKGJpdG1hcCBvciBvdXRsaW5lKSwgYW5kICAgICAgKi8KKyAgLyogICAgb3RoZXIgY29udHJvbCBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8QWxzbz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2VlIEBGVF9HbHlwaFNsb3RSZWMgZm9yIHRoZSBwdWJsaWNseSBhY2Nlc3NpYmxlIGdseXBoIGZpZWxkcy4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCBGVF9HbHlwaFNsb3RSZWNfKiAgRlRfR2x5cGhTbG90OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfQ2hhck1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBoYW5kbGUgdG8gYSBnaXZlbiBjaGFyYWN0ZXIgbWFwLiAgQSBjaGFybWFwIGlzIHVzZWQgdG8gdHJhbnNsYXRlICovCisgIC8qICAgIGNoYXJhY3RlciBjb2RlcyBpbiBhIGdpdmVuIGVuY29kaW5nIGludG8gZ2x5cGggaW5kZXhlcyBmb3IgaXRzICAgICAqLworICAvKiAgICBwYXJlbnQncyBmYWNlLiAgU29tZSBmb250IGZvcm1hdHMgbWF5IHByb3ZpZGUgc2V2ZXJhbCBjaGFybWFwcyBwZXIgKi8KKyAgLyogICAgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFYWNoIGZhY2Ugb2JqZWN0IG93bnMgemVybyBvciBtb3JlIGNoYXJtYXBzLCBidXQgb25seSBvbmUgb2YgdGhlbSAgKi8KKyAgLyogICAgY2FuIGJlIGBhY3RpdmUnIGFuZCB1c2VkIGJ5IEBGVF9HZXRfQ2hhcl9JbmRleCBvciBARlRfTG9hZF9DaGFyLiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgbGlzdCBvZiBhdmFpbGFibGUgY2hhcm1hcHMgaW4gYSBmYWNlIGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSAgKi8KKyAgLyogICAgYGZhY2UtPm51bV9jaGFybWFwcycgYW5kIGBmYWNlLT5jaGFybWFwcycgZmllbGRzIG9mIEBGVF9GYWNlUmVjLiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgY3VycmVudGx5IGFjdGl2ZSBjaGFybWFwIGlzIGF2YWlsYWJsZSBhcyBgZmFjZS0+Y2hhcm1hcCcuICAgICAgKi8KKyAgLyogICAgWW91IHNob3VsZCBjYWxsIEBGVF9TZXRfQ2hhcm1hcCB0byBjaGFuZ2UgaXQuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgV2hlbiBhIG5ldyBmYWNlIGlzIGNyZWF0ZWQgKGVpdGhlciB0aHJvdWdoIEBGVF9OZXdfRmFjZSBvciAgICAgICAgICovCisgIC8qICAgIEBGVF9PcGVuX0ZhY2UpLCB0aGUgbGlicmFyeSBsb29rcyBmb3IgYSBVbmljb2RlIGNoYXJtYXAgd2l0aGluICAgICAqLworICAvKiAgICB0aGUgbGlzdCBhbmQgYXV0b21hdGljYWxseSBhY3RpdmF0ZXMgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxBbHNvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTZWUgQEZUX0NoYXJNYXBSZWMgZm9yIHRoZSBwdWJsaWNseSBhY2Nlc3NpYmxlIGZpZWxkcyBvZiBhIGdpdmVuICAgKi8KKyAgLyogICAgY2hhcmFjdGVyIG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCBGVF9DaGFyTWFwUmVjXyogIEZUX0NoYXJNYXA7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9FTkNfVEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIG1hY3JvIGNvbnZlcnRzIGZvdXItbGV0dGVyIHRhZ3MgaW50byBhbiB1bnNpZ25lZCBsb25nLiAgSXQgaXMgKi8KKyAgLyogICAgdXNlZCB0byBkZWZpbmUgYGVuY29kaW5nJyBpZGVudGlmaWVycyAoc2VlIEBGVF9FbmNvZGluZykuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2luY2UgbWFueSAxNi1iaXQgY29tcGlsZXJzIGRvbid0IGxpa2UgMzItYml0IGVudW1lcmF0aW9ucywgeW91ICAgICovCisgIC8qICAgIHNob3VsZCByZWRlZmluZSB0aGlzIG1hY3JvIGluIGNhc2Ugb2YgcHJvYmxlbXMgdG8gc29tZXRoaW5nIGxpa2UgICAqLworICAvKiAgICB0aGlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICNkZWZpbmUgRlRfRU5DX1RBRyggdmFsdWUsIGEsIGIsIGMsIGQgKSAgdmFsdWUgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0byBnZXQgYSBzaW1wbGUgZW51bWVyYXRpb24gd2l0aG91dCBhc3NpZ25pbmcgc3BlY2lhbCBudW1iZXJzLiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpZm5kZWYgRlRfRU5DX1RBRworI2RlZmluZSBGVF9FTkNfVEFHKCB2YWx1ZSwgYSwgYiwgYywgZCApICAgICAgICAgXAorICAgICAgICAgIHZhbHVlID0gKCAoIChGVF9VSW50MzIpKGEpIDw8IDI0ICkgfCAgXAorICAgICAgICAgICAgICAgICAgICAoIChGVF9VSW50MzIpKGIpIDw8IDE2ICkgfCAgXAorICAgICAgICAgICAgICAgICAgICAoIChGVF9VSW50MzIpKGMpIDw8ICA4ICkgfCAgXAorICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50MzIpKGQpICAgICAgICAgKQorCisjZW5kaWYgLyogRlRfRU5DX1RBRyAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRW5jb2RpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQW4gZW51bWVyYXRpb24gdXNlZCB0byBzcGVjaWZ5IGNoYXJhY3RlciBzZXRzIHN1cHBvcnRlZCBieSAgICAgICAgICovCisgIC8qICAgIGNoYXJtYXBzLiAgVXNlZCBpbiB0aGUgQEZUX1NlbGVjdF9DaGFybWFwIEFQSSBmdW5jdGlvbi4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERlc3BpdGUgdGhlIG5hbWUsIHRoaXMgZW51bWVyYXRpb24gbGlzdHMgc3BlY2lmaWMgY2hhcmFjdGVyICAgICAgICAqLworICAvKiAgICByZXBlcnRvcmllcyAoaS5lLiwgY2hhcnNldHMpLCBhbmQgbm90IHRleHQgZW5jb2RpbmcgbWV0aG9kcyAoZS5nLiwgKi8KKyAgLyogICAgVVRGLTgsIFVURi0xNiwgZXRjLikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPdGhlciBlbmNvZGluZ3MgbWlnaHQgYmUgZGVmaW5lZCBpbiB0aGUgZnV0dXJlLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9FTkNPRElOR19OT05FIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBUaGUgZW5jb2RpbmcgdmFsdWV+MCBpcyByZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9FTkNPRElOR19VTklDT0RFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBDb3JyZXNwb25kcyB0byB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgc2V0LiAgVGhpcyB2YWx1ZSBjb3ZlcnMgICAgICovCisgIC8qICAgICAgYWxsIHZlcnNpb25zIG9mIHRoZSBVbmljb2RlIHJlcGVydG9pcmUsIGluY2x1ZGluZyBBU0NJSSBhbmQgICAgICAqLworICAvKiAgICAgIExhdGluLTEuICBNb3N0IGZvbnRzIGluY2x1ZGUgYSBVbmljb2RlIGNoYXJtYXAsIGJ1dCBub3QgYWxsICAgICAgKi8KKyAgLyogICAgICBvZiB0aGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBhY2Nlc3MgVW5pY29kZSB2YWx1ZSBVKzFGMDI4IChhbmQgICAgKi8KKyAgLyogICAgICB0aGUgZm9udCBjb250YWlucyBpdCksIHVzZSB2YWx1ZSAweDFGMDI4IGFzIHRoZSBpbnB1dCB2YWx1ZSBmb3IgICovCisgIC8qICAgICAgQEZUX0dldF9DaGFyX0luZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRU5DT0RJTkdfTVNfU1lNQk9MIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgQ29ycmVzcG9uZHMgdG8gdGhlIE1pY3Jvc29mdCBTeW1ib2wgZW5jb2RpbmcsIHVzZWQgdG8gZW5jb2RlICAgICAqLworICAvKiAgICAgIG1hdGhlbWF0aWNhbCBzeW1ib2xzIGFuZCB3aW5nZGluZ3MuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlICAgKi8KKyAgLyogICAgICBgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvb3RzcGVjL3JlY29tLmh0bScsICAgICAgICAgICovCisgIC8qICAgICAgYGh0dHA6Ly93d3cua29zdGlzLm5ldC9jaGFyc2V0cy9zeW1ib2wuaHRtJywgYW5kICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIGBodHRwOi8vd3d3Lmtvc3Rpcy5uZXQvY2hhcnNldHMvd2luZ2RpbmcuaHRtJy4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgVGhpcyBlbmNvZGluZyB1c2VzIGNoYXJhY3RlciBjb2RlcyBmcm9tIHRoZSBQVUEgKFByaXZhdGUgVW5pY29kZSAqLworICAvKiAgICAgIEFyZWEpIGluIHRoZSByYW5nZSBVK0YwMjAtVStGMEZGLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0VOQ09ESU5HX1NKSVMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIENvcnJlc3BvbmRzIHRvIEphcGFuZXNlIFNKSVMgZW5jb2RpbmcuICBNb3JlIGluZm8gYXQgICAgICAgICAgICAgKi8KKyAgLyogICAgICBhdCBgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TaGlmdF9KSVMnLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgU2VlIG5vdGUgb24gbXVsdGktYnl0ZSBlbmNvZGluZ3MgYmVsb3cuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRU5DT0RJTkdfR0IyMzEyIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgQ29ycmVzcG9uZHMgdG8gYW4gZW5jb2Rpbmcgc3lzdGVtIGZvciBTaW1wbGlmaWVkIENoaW5lc2UgYXMgdXNlZCAqLworICAvKiAgICAgIHVzZWQgaW4gbWFpbmxhbmQgQ2hpbmEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0VOQ09ESU5HX0JJRzUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIENvcnJlc3BvbmRzIHRvIGFuIGVuY29kaW5nIHN5c3RlbSBmb3IgVHJhZGl0aW9uYWwgQ2hpbmVzZSBhcyAgICAgKi8KKyAgLyogICAgICB1c2VkIGluIFRhaXdhbiBhbmQgSG9uZyBLb25nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9FTkNPRElOR19XQU5TVU5HIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBDb3JyZXNwb25kcyB0byB0aGUgS29yZWFuIGVuY29kaW5nIHN5c3RlbSBrbm93biBhcyBXYW5zdW5nLiAgICAgICovCisgIC8qICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIGBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi1VUy9nb2dsb2JhbC9jYzMwNTE1NCcuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0VOQ09ESU5HX0pPSEFCIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIFRoZSBLb3JlYW4gc3RhbmRhcmQgY2hhcmFjdGVyIHNldCAoS1N+QyA1NjAxLTE5OTIpLCB3aGljaCAgICAgICAgKi8KKyAgLyogICAgICBjb3JyZXNwb25kcyB0byBNUyBXaW5kb3dzIGNvZGUgcGFnZSAxMzYxLiAgVGhpcyBjaGFyYWN0ZXIgc2V0ICAgICovCisgIC8qICAgICAgaW5jbHVkZXMgYWxsIHBvc3NpYmxlIEhhbmdldWwgY2hhcmFjdGVyIGNvbWJpbmF0aW9ucy4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRU5DT0RJTkdfQURPQkVfTEFUSU5fMSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgQ29ycmVzcG9uZHMgdG8gYSBMYXRpbi0xIGVuY29kaW5nIGFzIGRlZmluZWQgaW4gYSBUeXBlfjEgICAgICAgICAqLworICAvKiAgICAgIFBvc3RTY3JpcHQgZm9udC4gIEl0IGlzIGxpbWl0ZWQgdG8gMjU2IGNoYXJhY3RlciBjb2Rlcy4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0VOQ09ESU5HX0FET0JFX1NUQU5EQVJEIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIENvcnJlc3BvbmRzIHRvIHRoZSBBZG9iZSBTdGFuZGFyZCBlbmNvZGluZywgYXMgZm91bmQgaW4gVHlwZX4xLCAgKi8KKyAgLyogICAgICBDRkYsIGFuZCBPcGVuVHlwZS9DRkYgZm9udHMuICBJdCBpcyBsaW1pdGVkIHRvIDI1NiBjaGFyYWN0ZXIgICAgICovCisgIC8qICAgICAgY29kZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRU5DT0RJTkdfQURPQkVfRVhQRVJUIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgQ29ycmVzcG9uZHMgdG8gdGhlIEFkb2JlIEV4cGVydCBlbmNvZGluZywgYXMgZm91bmQgaW4gVHlwZX4xLCAgICAqLworICAvKiAgICAgIENGRiwgYW5kIE9wZW5UeXBlL0NGRiBmb250cy4gIEl0IGlzIGxpbWl0ZWQgdG8gMjU2IGNoYXJhY3RlciAgICAgKi8KKyAgLyogICAgICBjb2Rlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9FTkNPRElOR19BRE9CRV9DVVNUT00gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBDb3JyZXNwb25kcyB0byBhIGN1c3RvbSBlbmNvZGluZywgYXMgZm91bmQgaW4gVHlwZX4xLCBDRkYsIGFuZCAgICovCisgIC8qICAgICAgT3BlblR5cGUvQ0ZGIGZvbnRzLiAgSXQgaXMgbGltaXRlZCB0byAyNTYgY2hhcmFjdGVyIGNvZGVzLiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRU5DT0RJTkdfQVBQTEVfUk9NQU4gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgQ29ycmVzcG9uZHMgdG8gdGhlIDgtYml0IEFwcGxlIHJvbWFuIGVuY29kaW5nLiAgTWFueSBUcnVlVHlwZSAgICAqLworICAvKiAgICAgIGFuZCBPcGVuVHlwZSBmb250cyBjb250YWluIGEgY2hhcm1hcCBmb3IgdGhpcyBlbmNvZGluZywgc2luY2UgICAgKi8KKyAgLyogICAgICBvbGRlciB2ZXJzaW9ucyBvZiBNYWMgT1MgYXJlIGFibGUgdG8gdXNlIGl0LiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9FTkNPRElOR19PTERfTEFUSU5fMiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBUaGlzIHZhbHVlIGlzIGRlcHJlY2F0ZWQgYW5kIHdhcyBuZXZlciB1c2VkIG5vciByZXBvcnRlZCBieSAgICAgICovCisgIC8qICAgICAgRnJlZVR5cGUuICBEb24ndCB1c2Ugb3IgdGVzdCBmb3IgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRU5DT0RJTkdfTVNfU0pJUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgU2FtZSBhcyBGVF9FTkNPRElOR19TSklTLiAgRGVwcmVjYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRU5DT0RJTkdfTVNfR0IyMzEyIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgU2FtZSBhcyBGVF9FTkNPRElOR19HQjIzMTIuICBEZXByZWNhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRU5DT0RJTkdfTVNfQklHNSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgU2FtZSBhcyBGVF9FTkNPRElOR19CSUc1LiAgRGVwcmVjYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRU5DT0RJTkdfTVNfV0FOU1VORyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgU2FtZSBhcyBGVF9FTkNPRElOR19XQU5TVU5HLiAgRGVwcmVjYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRU5DT0RJTkdfTVNfSk9IQUIgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgU2FtZSBhcyBGVF9FTkNPRElOR19KT0hBQi4gIERlcHJlY2F0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEJ5IGRlZmF1bHQsIEZyZWVUeXBlIGF1dG9tYXRpY2FsbHkgc3ludGhlc2l6ZXMgYSBVbmljb2RlIGNoYXJtYXAgICAqLworICAvKiAgICBmb3IgUG9zdFNjcmlwdCBmb250cywgdXNpbmcgdGhlaXIgZ2x5cGggbmFtZXMgZGljdGlvbmFyaWVzLiAgICAgICAgKi8KKyAgLyogICAgSG93ZXZlciwgaXQgYWxzbyByZXBvcnRzIHRoZSBlbmNvZGluZ3MgZGVmaW5lZCBleHBsaWNpdGx5IGluIHRoZSAgICovCisgIC8qICAgIGZvbnQgZmlsZSwgZm9yIHRoZSBjYXNlcyB3aGVuIHRoZXkgYXJlIG5lZWRlZCwgd2l0aCB0aGUgQWRvYmUgICAgICAqLworICAvKiAgICB2YWx1ZXMgYXMgd2VsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0VOQ09ESU5HX05PTkUgaXMgc2V0IGJ5IHRoZSBCREYgYW5kIFBDRiBkcml2ZXJzIGlmIHRoZSBjaGFybWFwICAqLworICAvKiAgICBpcyBuZWl0aGVyIFVuaWNvZGUgbm9yIElTTy04ODU5LTEgKG90aGVyd2lzZSBpdCBpcyBzZXQgdG8gICAgICAgICAgKi8KKyAgLyogICAgRlRfRU5DT0RJTkdfVU5JQ09ERSkuICBVc2UgQEZUX0dldF9CREZfQ2hhcnNldF9JRCB0byBmaW5kIG91dCAgICAgICovCisgIC8qICAgIHdoaWNoIGVuY29kaW5nIGlzIHJlYWxseSBwcmVzZW50LiAgSWYsIGZvciBleGFtcGxlLCB0aGUgICAgICAgICAgICAqLworICAvKiAgICBgY3NfcmVnaXN0cnknIGZpZWxkIGlzIGBLT0k4JyBhbmQgdGhlIGBjc19lbmNvZGluZycgZmllbGQgaXMgYFInLCAgKi8KKyAgLyogICAgdGhlIGZvbnQgaXMgZW5jb2RlZCBpbiBLT0k4LVIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9FTkNPRElOR19OT05FIGlzIGFsd2F5cyBzZXQgKHdpdGggYSBzaW5nbGUgZXhjZXB0aW9uKSBieSB0aGUgICAgKi8KKyAgLyogICAgd2luZm9udHMgZHJpdmVyLiAgVXNlIEBGVF9HZXRfV2luRk5UX0hlYWRlciBhbmQgZXhhbWluZSB0aGUgICAgICAgICovCisgIC8qICAgIGBjaGFyc2V0JyBmaWVsZCBvZiB0aGUgQEZUX1dpbkZOVF9IZWFkZXJSZWMgc3RydWN0dXJlIHRvIGZpbmQgb3V0ICAqLworICAvKiAgICB3aGljaCBlbmNvZGluZyBpcyByZWFsbHkgcHJlc2VudC4gIEZvciBleGFtcGxlLCAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQEZUX1dpbkZOVF9JRF9DUDEyNTEgKDIwNCkgbWVhbnMgV2luZG93cyBjb2RlIHBhZ2UgMTI1MSAoZm9yICAgICAgICovCisgIC8qICAgIFJ1c3NpYW4pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRU5DT0RJTkdfTk9ORSBpcyBzZXQgaWYgYHBsYXRmb3JtX2lkJyBpcyBAVFRfUExBVEZPUk1fTUFDSU5UT1NIICovCisgIC8qICAgIGFuZCBgZW5jb2RpbmdfaWQnIGlzIG5vdCBAVFRfTUFDX0lEX1JPTUFOIChvdGhlcndpc2UgaXQgaXMgc2V0IHRvICAqLworICAvKiAgICBGVF9FTkNPRElOR19BUFBMRV9ST01BTikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIElmIGBwbGF0Zm9ybV9pZCcgaXMgQFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwgdXNlIHRoZSBmdW5jdGlvbiAgICAgICAqLworICAvKiAgICBARlRfR2V0X0NNYXBfTGFuZ3VhZ2VfSUQgdG8gcXVlcnkgdGhlIE1hYyBsYW5ndWFnZSBJRCB0aGF0IG1heSAgICAgKi8KKyAgLyogICAgYmUgbmVlZGVkIHRvIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2ggQXBwbGUgZW5jb2RpbmcgdmFyaWFudHMuICBTZWUgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTL1ZFTkRPUlMvQVBQTEUvUmVhZG1lLnR4dCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHRvIGdldCBhbiBpZGVhIGhvdyB0byBkbyB0aGF0LiAgQmFzaWNhbGx5LCBpZiB0aGUgbGFuZ3VhZ2UgSUQgICAgICAqLworICAvKiAgICBpc34wLCBkb24ndCB1c2UgaXQsIG90aGVyd2lzZSBzdWJ0cmFjdCAxIGZyb20gdGhlIGxhbmd1YWdlIElELiAgICAgKi8KKyAgLyogICAgVGhlbiBleGFtaW5lIGBlbmNvZGluZ19pZCcuICBJZiwgZm9yIGV4YW1wbGUsIGBlbmNvZGluZ19pZCcgaXMgICAgICovCisgIC8qICAgIEBUVF9NQUNfSURfUk9NQU4gYW5kIHRoZSBsYW5ndWFnZSBJRCAobWludXN+MSkgaXMgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBgVFRfTUFDX0xBTkdJRF9HUkVFSycsIGl0IGlzIHRoZSBHcmVlayBlbmNvZGluZywgbm90IFJvbWFuLiAgICAgICAgKi8KKyAgLyogICAgQFRUX01BQ19JRF9BUkFCSUMgd2l0aCBgVFRfTUFDX0xBTkdJRF9GQVJTSScgbWVhbnMgdGhlIEZhcnNpICAgICAgICovCisgIC8qICAgIHZhcmlhbnQgdGhlIEFyYWJpYyBlbmNvZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBlbnVtICBGVF9FbmNvZGluZ18KKyAgeworICAgIEZUX0VOQ19UQUcoIEZUX0VOQ09ESU5HX05PTkUsIDAsIDAsIDAsIDAgKSwKKworICAgIEZUX0VOQ19UQUcoIEZUX0VOQ09ESU5HX01TX1NZTUJPTCwgJ3MnLCAneScsICdtJywgJ2InICksCisgICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfVU5JQ09ERSwgICAndScsICduJywgJ2knLCAnYycgKSwKKworICAgIEZUX0VOQ19UQUcoIEZUX0VOQ09ESU5HX1NKSVMsICAgICdzJywgJ2onLCAnaScsICdzJyApLAorICAgIEZUX0VOQ19UQUcoIEZUX0VOQ09ESU5HX0dCMjMxMiwgICdnJywgJ2InLCAnICcsICcgJyApLAorICAgIEZUX0VOQ19UQUcoIEZUX0VOQ09ESU5HX0JJRzUsICAgICdiJywgJ2knLCAnZycsICc1JyApLAorICAgIEZUX0VOQ19UQUcoIEZUX0VOQ09ESU5HX1dBTlNVTkcsICd3JywgJ2EnLCAnbicsICdzJyApLAorICAgIEZUX0VOQ19UQUcoIEZUX0VOQ09ESU5HX0pPSEFCLCAgICdqJywgJ28nLCAnaCcsICdhJyApLAorCisgICAgLyogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCisgICAgRlRfRU5DT0RJTkdfTVNfU0pJUyAgICA9IEZUX0VOQ09ESU5HX1NKSVMsCisgICAgRlRfRU5DT0RJTkdfTVNfR0IyMzEyICA9IEZUX0VOQ09ESU5HX0dCMjMxMiwKKyAgICBGVF9FTkNPRElOR19NU19CSUc1ICAgID0gRlRfRU5DT0RJTkdfQklHNSwKKyAgICBGVF9FTkNPRElOR19NU19XQU5TVU5HID0gRlRfRU5DT0RJTkdfV0FOU1VORywKKyAgICBGVF9FTkNPRElOR19NU19KT0hBQiAgID0gRlRfRU5DT0RJTkdfSk9IQUIsCisKKyAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19BRE9CRV9TVEFOREFSRCwgJ0EnLCAnRCcsICdPJywgJ0InICksCisgICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfQURPQkVfRVhQRVJULCAgICdBJywgJ0QnLCAnQicsICdFJyApLAorICAgIEZUX0VOQ19UQUcoIEZUX0VOQ09ESU5HX0FET0JFX0NVU1RPTSwgICAnQScsICdEJywgJ0InLCAnQycgKSwKKyAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19BRE9CRV9MQVRJTl8xLCAgJ2wnLCAnYScsICd0JywgJzEnICksCisKKyAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19PTERfTEFUSU5fMiwgJ2wnLCAnYScsICd0JywgJzInICksCisKKyAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19BUFBMRV9ST01BTiwgJ2EnLCAncicsICdtJywgJ24nICkKKworICB9IEZUX0VuY29kaW5nOworCisKKyAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgYEZUX0VuY29kaW5nJyAqLworICAvKiB2YWx1ZXMgaW5zdGVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIGZ0X2VuY29kaW5nX25vbmUgICAgICAgICAgICBGVF9FTkNPRElOR19OT05FCisjZGVmaW5lIGZ0X2VuY29kaW5nX3VuaWNvZGUgICAgICAgICBGVF9FTkNPRElOR19VTklDT0RFCisjZGVmaW5lIGZ0X2VuY29kaW5nX3N5bWJvbCAgICAgICAgICBGVF9FTkNPRElOR19NU19TWU1CT0wKKyNkZWZpbmUgZnRfZW5jb2RpbmdfbGF0aW5fMSAgICAgICAgIEZUX0VOQ09ESU5HX0FET0JFX0xBVElOXzEKKyNkZWZpbmUgZnRfZW5jb2RpbmdfbGF0aW5fMiAgICAgICAgIEZUX0VOQ09ESU5HX09MRF9MQVRJTl8yCisjZGVmaW5lIGZ0X2VuY29kaW5nX3NqaXMgICAgICAgICAgICBGVF9FTkNPRElOR19TSklTCisjZGVmaW5lIGZ0X2VuY29kaW5nX2diMjMxMiAgICAgICAgICBGVF9FTkNPRElOR19HQjIzMTIKKyNkZWZpbmUgZnRfZW5jb2RpbmdfYmlnNSAgICAgICAgICAgIEZUX0VOQ09ESU5HX0JJRzUKKyNkZWZpbmUgZnRfZW5jb2Rpbmdfd2Fuc3VuZyAgICAgICAgIEZUX0VOQ09ESU5HX1dBTlNVTkcKKyNkZWZpbmUgZnRfZW5jb2Rpbmdfam9oYWIgICAgICAgICAgIEZUX0VOQ09ESU5HX0pPSEFCCisKKyNkZWZpbmUgZnRfZW5jb2RpbmdfYWRvYmVfc3RhbmRhcmQgIEZUX0VOQ09ESU5HX0FET0JFX1NUQU5EQVJECisjZGVmaW5lIGZ0X2VuY29kaW5nX2Fkb2JlX2V4cGVydCAgICBGVF9FTkNPRElOR19BRE9CRV9FWFBFUlQKKyNkZWZpbmUgZnRfZW5jb2RpbmdfYWRvYmVfY3VzdG9tICAgIEZUX0VOQ09ESU5HX0FET0JFX0NVU1RPTQorI2RlZmluZSBmdF9lbmNvZGluZ19hcHBsZV9yb21hbiAgICAgRlRfRU5DT0RJTkdfQVBQTEVfUk9NQU4KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0NoYXJNYXBSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBiYXNlIGNoYXJtYXAgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBwYXJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZW5jb2RpbmcgICAgOjogQW4gQEZUX0VuY29kaW5nIHRhZyBpZGVudGlmeWluZyB0aGUgY2hhcm1hcC4gIFVzZSAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIHRoaXMgd2l0aCBARlRfU2VsZWN0X0NoYXJtYXAuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcGxhdGZvcm1faWQgOjogQW4gSUQgbnVtYmVyIGRlc2NyaWJpbmcgdGhlIHBsYXRmb3JtIGZvciB0aGUgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyBlbmNvZGluZyBJRC4gIFRoaXMgY29tZXMgZGlyZWN0bHkgZnJvbSAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiBhbmQgc2hvdWxkIGJlIGVtdWxhdGVkICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgZm9yIG90aGVyIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBlbmNvZGluZ19pZCA6OiBBIHBsYXRmb3JtIHNwZWNpZmljIGVuY29kaW5nIG51bWJlci4gIFRoaXMgYWxzbyAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgY29tZXMgZnJvbSB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiBhbmQgc2hvdWxkIGJlICovCisgIC8qICAgICAgICAgICAgICAgICAgIGVtdWxhdGVkIHNpbWlsYXJseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0NoYXJNYXBSZWNfCisgIHsKKyAgICBGVF9GYWNlICAgICAgZmFjZTsKKyAgICBGVF9FbmNvZGluZyAgZW5jb2Rpbmc7CisgICAgRlRfVVNob3J0ICAgIHBsYXRmb3JtX2lkOworICAgIEZUX1VTaG9ydCAgICBlbmNvZGluZ19pZDsKKworICB9IEZUX0NoYXJNYXBSZWM7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgQiBBIFMgRSAgIE8gQiBKIEUgQyBUICAgQyBMIEEgUyBTIEUgUyAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZhY2VfSW50ZXJuYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFuIG9wYXF1ZSBoYW5kbGUgdG8gYW4gYEZUX0ZhY2VfSW50ZXJuYWxSZWMnIHN0cnVjdHVyZSwgdXNlZCB0byAgICAqLworICAvKiAgICBtb2RlbCBwcml2YXRlIGRhdGEgb2YgYSBnaXZlbiBARlRfRmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgc3RydWN0dXJlIG1pZ2h0IGNoYW5nZSBiZXR3ZWVuIHJlbGVhc2VzIG9mIEZyZWVUeXBlfjIgYW5kIGlzICAqLworICAvKiAgICBub3QgZ2VuZXJhbGx5IGF2YWlsYWJsZSB0byBjbGllbnQgYXBwbGljYXRpb25zLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IEZUX0ZhY2VfSW50ZXJuYWxSZWNfKiAgRlRfRmFjZV9JbnRlcm5hbDsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZhY2VSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIHJvb3QgZmFjZSBjbGFzcyBzdHJ1Y3R1cmUuICBBIGZhY2Ugb2JqZWN0IG1vZGVscyBhICAgICAgICAqLworICAvKiAgICB0eXBlZmFjZSBpbiBhIGZvbnQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fZmFjZXMgICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgZmFjZXMgaW4gdGhlIGZvbnQgZmlsZS4gIFNvbWUgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb250IGZvcm1hdHMgY2FuIGhhdmUgbXVsdGlwbGUgZmFjZXMgaW4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBmb250IGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZV9pbmRleCAgICAgICAgICA6OiBUaGlzIGZpZWxkIGhvbGRzIHR3byBkaWZmZXJlbnQgdmFsdWVzLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0cyAwLTE1IGFyZSB0aGUgaW5kZXggb2YgdGhlIGZhY2UgaW4gdGhlICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgZmlsZSAoc3RhcnRpbmcgd2l0aCB2YWx1ZX4wKS4gIFRoZXkgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgc2V0IHRvfjAgaWYgdGhlcmUgaXMgb25seSBvbmUgZmFjZSBpbiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZvbnQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRzIDE2LTMwIGFyZSByZWxldmFudCB0byBHWCB2YXJpYXRpb24gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udHMgb25seSwgaG9sZGluZyB0aGUgbmFtZWQgaW5zdGFuY2UgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4IGZvciB0aGUgY3VycmVudCBmYWNlIGluZGV4IChzdGFydGluZyAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHZhbHVlfjE7IHZhbHVlfjAgaW5kaWNhdGVzIGZvbnQgYWNjZXNzICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCBHWCB2YXJpYXRpb24gZGF0YSkuICBGb3Igbm9uLUdYICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRzLCBiaXRzIDE2LTMwIGFyZSBpZ25vcmVkLiAgSWYgd2UgaGF2ZSAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGhpcmQgbmFtZWQgaW5zdGFuY2Ugb2YgZmFjZX40LCBzYXksICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYGZhY2VfaW5kZXgnIGlzIHNldCB0byAweDAwMDMwMDA0LiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBCaXQgMzEgaXMgYWx3YXlzIHplcm8gKHRoaXMgaXMsICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYGZhY2VfaW5kZXgnIGlzIGFsd2F5cyBhIHBvc2l0aXZlIHZhbHVlKS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZV9mbGFncyAgICAgICAgICA6OiBBIHNldCBvZiBiaXQgZmxhZ3MgdGhhdCBnaXZlIGltcG9ydGFudCAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZhY2U7IHNlZSAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEBGVF9GQUNFX0ZMQUdfWFhYIGZvciB0aGUgZGV0YWlscy4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0eWxlX2ZsYWdzICAgICAgICAgOjogVGhlIGxvd2VyIDE2fmJpdHMgY29udGFpbiBhIHNldCBvZiBiaXQgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzIGluZGljYXRpbmcgdGhlIHN0eWxlIG9mIHRoZSBmYWNlOyBzZWUgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBARlRfU1RZTEVfRkxBR19YWFggZm9yIHRoZSBkZXRhaWxzLiAgQml0cyAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYtMzAgaG9sZCB0aGUgbnVtYmVyIG9mIG5hbWVkIGluc3RhbmNlcyAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSBmb3IgdGhlIGN1cnJlbnQgZmFjZSBpZiB3ZSBoYXZlIGEgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBHWCB2YXJpYXRpb24gKHN1Yilmb250LiAgQml0IDMxIGlzIGFsd2F5cyAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgemVybyAodGhpcyBpcywgYHN0eWxlX2ZsYWdzJyBpcyBhbHdheXMgYSAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlIHZhbHVlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9nbHlwaHMgICAgICAgICAgOjogVGhlIG51bWJlciBvZiBnbHlwaHMgaW4gdGhlIGZhY2UuICBJZiB0aGUgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgaXMgc2NhbGFibGUgYW5kIGhhcyBzYml0cyAoc2VlICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBgbnVtX2ZpeGVkX3NpemVzJyksIGl0IGlzIHNldCB0byB0aGUgbnVtYmVyICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Ygb3V0bGluZSBnbHlwaHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgQ0lELWtleWVkIGZvbnRzLCB0aGlzIHZhbHVlIGdpdmVzIHRoZSAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGVzdCBDSUQgdXNlZCBpbiB0aGUgZm9udC4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFtaWx5X25hbWUgICAgICAgICA6OiBUaGUgZmFjZSdzIGZhbWlseSBuYW1lLiAgVGhpcyBpcyBhbiBBU0NJSSAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLCB1c3VhbGx5IGluIEVuZ2xpc2gsIHRoYXQgZGVzY3JpYmVzICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0eXBlZmFjZSdzIGZhbWlseSAobGlrZSBgVGltZXMgTmV3ICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBSb21hbicsIGBCb2RvbmknLCBgR2FyYW1vbmQnLCBldGMpLiAgVGhpcyAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYSBsZWFzdCBjb21tb24gZGVub21pbmF0b3IgdXNlZCB0byBsaXN0ICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRzLiAgU29tZSBmb3JtYXRzIChUcnVlVHlwZSAmIE9wZW5UeXBlKSAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlIGxvY2FsaXplZCBhbmQgVW5pY29kZSB2ZXJzaW9ucyBvZiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBzdHJpbmcuICBBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSB0aGUgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCBzcGVjaWZpYyBpbnRlcmZhY2UgdG8gYWNjZXNzIHRoZW0uICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBDYW4gYmUgTlVMTCAoZS5nLiwgaW4gZm9udHMgZW1iZWRkZWQgaW4gYSAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgUERGIGZpbGUpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBJbiBjYXNlIHRoZSBmb250IGRvZXNuJ3QgcHJvdmlkZSBhIHNwZWNpZmljICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5IG5hbWUgZW50cnksIEZyZWVUeXBlIHRyaWVzIHRvICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRoZXNpemUgb25lLCBkZXJpdmluZyBpdCBmcm9tIG90aGVyIG5hbWUgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHlsZV9uYW1lICAgICAgICAgIDo6IFRoZSBmYWNlJ3Mgc3R5bGUgbmFtZS4gIFRoaXMgaXMgYW4gQVNDSUkgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcsIHVzdWFsbHkgaW4gRW5nbGlzaCwgdGhhdCBkZXNjcmliZXMgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHR5cGVmYWNlJ3Mgc3R5bGUgKGxpa2UgYEl0YWxpYycsICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBCb2xkJywgYENvbmRlbnNlZCcsIGV0YykuICBOb3QgYWxsIGZvbnQgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzIHByb3ZpZGUgYSBzdHlsZSBuYW1lLCBzbyB0aGlzIGZpZWxkICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgb3B0aW9uYWwsIGFuZCBjYW4gYmUgc2V0IHRvIE5VTEwuICBBcyAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBgZmFtaWx5X25hbWUnLCBzb21lIGZvcm1hdHMgcHJvdmlkZSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGl6ZWQgYW5kIFVuaWNvZGUgdmVyc2lvbnMgb2YgdGhpcyAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLiAgQXBwbGljYXRpb25zIHNob3VsZCB1c2UgdGhlIGZvcm1hdCAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljIGludGVyZmFjZSB0byBhY2Nlc3MgdGhlbS4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9maXhlZF9zaXplcyAgICAgOjogVGhlIG51bWJlciBvZiBiaXRtYXAgc3RyaWtlcyBpbiB0aGUgZmFjZS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW4gaWYgdGhlIGZhY2UgaXMgc2NhbGFibGUsIHRoZXJlIG1pZ2h0ICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlsbCBiZSBiaXRtYXAgc3RyaWtlcywgd2hpY2ggYXJlIGNhbGxlZCAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYHNiaXRzJyBpbiB0aGF0IGNhc2UuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYXZhaWxhYmxlX3NpemVzICAgICA6OiBBbiBhcnJheSBvZiBARlRfQml0bWFwX1NpemUgZm9yIGFsbCBiaXRtYXAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWtlcyBpbiB0aGUgZmFjZS4gIEl0IGlzIHNldCB0byBOVUxMIGlmICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGJpdG1hcCBzdHJpa2UuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9jaGFybWFwcyAgICAgICAgOjogVGhlIG51bWJlciBvZiBjaGFybWFwcyBpbiB0aGUgZmFjZS4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2hhcm1hcHMgICAgICAgICAgICA6OiBBbiBhcnJheSBvZiB0aGUgY2hhcm1hcHMgb2YgdGhlIGZhY2UuICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnZW5lcmljICAgICAgICAgICAgIDo6IEEgZmllbGQgcmVzZXJ2ZWQgZm9yIGNsaWVudCB1c2VzLiAgU2VlIHRoZSAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBARlRfR2VuZXJpYyB0eXBlIGRlc2NyaXB0aW9uLiAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBiYm94ICAgICAgICAgICAgICAgIDo6IFRoZSBmb250IGJvdW5kaW5nIGJveC4gIENvb3JkaW5hdGVzIGFyZSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzZWQgaW4gZm9udCB1bml0cyAoc2VlICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYHVuaXRzX3Blcl9FTScpLiAgVGhlIGJveCBpcyBsYXJnZSBlbm91Z2ggICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGNvbnRhaW4gYW55IGdseXBoIGZyb20gdGhlIGZvbnQuICBUaHVzLCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBgYmJveC55TWF4JyBjYW4gYmUgc2VlbiBhcyB0aGUgYG1heGltdW0gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjZW5kZXInLCBhbmQgYGJib3gueU1pbicgYXMgdGhlIGBtaW5pbXVtICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NlbmRlcicuICBPbmx5IHJlbGV2YW50IGZvciBzY2FsYWJsZSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgYm91bmRpbmcgYm94IG1pZ2h0IGJlIG9mZiBieSAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAoYXQgbGVhc3QpIG9uZSBwaXhlbCBmb3IgaGludGVkIGZvbnRzLiAgU2VlICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgQEZUX1NpemVfTWV0cmljcyBmb3IgZnVydGhlciBkaXNjdXNzaW9uLiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdW5pdHNfcGVyX0VNICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGZvbnQgdW5pdHMgcGVyIEVNIHNxdWFyZSBmb3IgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmYWNlLiAgVGhpcyBpcyB0eXBpY2FsbHkgMjA0OCBmb3IgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlIGZvbnRzLCBhbmQgMTAwMCBmb3IgVHlwZX4xIGZvbnRzLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IHJlbGV2YW50IGZvciBzY2FsYWJsZSBmb3JtYXRzLiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhc2NlbmRlciAgICAgICAgICAgIDo6IFRoZSB0eXBvZ3JhcGhpYyBhc2NlbmRlciBvZiB0aGUgZmFjZSwgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzZWQgaW4gZm9udCB1bml0cy4gIEZvciBmb250IGZvcm1hdHMgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGhhdmluZyB0aGlzIGluZm9ybWF0aW9uLCBpdCBpcyBzZXQgdG8gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBiYm94LnlNYXgnLiAgT25seSByZWxldmFudCBmb3Igc2NhbGFibGUgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkZXNjZW5kZXIgICAgICAgICAgIDo6IFRoZSB0eXBvZ3JhcGhpYyBkZXNjZW5kZXIgb2YgdGhlIGZhY2UsICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzZWQgaW4gZm9udCB1bml0cy4gIEZvciBmb250IGZvcm1hdHMgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGhhdmluZyB0aGlzIGluZm9ybWF0aW9uLCBpdCBpcyBzZXQgdG8gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBiYm94LnlNaW4nLiAgTm90ZSB0aGF0IHRoaXMgZmllbGQgaXMgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB1c3VhbGx5IG5lZ2F0aXZlLiAgT25seSByZWxldmFudCBmb3IgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGFibGUgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaGVpZ2h0ICAgICAgICAgICAgICA6OiBUaGlzIHZhbHVlIGlzIHRoZSB2ZXJ0aWNhbCBkaXN0YW5jZSAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgYmFzZWxpbmVzLCAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3NlZCBpbiBmb250IHVuaXRzLiAgSXQgaXMgYWx3YXlzICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZS4gIE9ubHkgcmVsZXZhbnQgZm9yIHNjYWxhYmxlICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3Ugd2FudCB0aGUgZ2xvYmFsIGdseXBoIGhlaWdodCwgdXNlICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYGFzY2VuZGVyIC0gZGVzY2VuZGVyJy4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4X2FkdmFuY2Vfd2lkdGggICA6OiBUaGUgbWF4aW11bSBhZHZhbmNlIHdpZHRoLCBpbiBmb250IHVuaXRzLCAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFsbCBnbHlwaHMgaW4gdGhpcyBmYWNlLiAgVGhpcyBjYW4gYmUgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gbWFrZSB3b3JkIHdyYXBwaW5nIGNvbXB1dGF0aW9ucyAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmYXN0ZXIuICBPbmx5IHJlbGV2YW50IGZvciBzY2FsYWJsZSAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4X2FkdmFuY2VfaGVpZ2h0ICA6OiBUaGUgbWF4aW11bSBhZHZhbmNlIGhlaWdodCwgaW4gZm9udCB1bml0cywgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFsbCBnbHlwaHMgaW4gdGhpcyBmYWNlLiAgVGhpcyBpcyBvbmx5ICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW50IGZvciB2ZXJ0aWNhbCBsYXlvdXRzLCBhbmQgaXMgc2V0ICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB0byBgaGVpZ2h0JyBmb3IgZm9udHMgdGhhdCBkbyBub3QgcHJvdmlkZSAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgbWV0cmljcy4gIE9ubHkgcmVsZXZhbnQgZm9yICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxhYmxlIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHVuZGVybGluZV9wb3NpdGlvbiAgOjogVGhlIHBvc2l0aW9uLCBpbiBmb250IHVuaXRzLCBvZiB0aGUgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVybGluZSBsaW5lIGZvciB0aGlzIGZhY2UuICBJdCBpcyB0aGUgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgb2YgdGhlIHVuZGVybGluaW5nIHN0ZW0uICBPbmx5ICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZXZhbnQgZm9yIHNjYWxhYmxlIGZvcm1hdHMuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdW5kZXJsaW5lX3RoaWNrbmVzcyA6OiBUaGUgdGhpY2tuZXNzLCBpbiBmb250IHVuaXRzLCBvZiB0aGUgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJsaW5lIGZvciB0aGlzIGZhY2UuICBPbmx5IHJlbGV2YW50IGZvciAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxhYmxlIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdseXBoICAgICAgICAgICAgICAgOjogVGhlIGZhY2UncyBhc3NvY2lhdGVkIGdseXBoIHNsb3QocykuICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2l6ZSAgICAgICAgICAgICAgICA6OiBUaGUgY3VycmVudCBhY3RpdmUgc2l6ZSBmb3IgdGhpcyBmYWNlLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjaGFybWFwICAgICAgICAgICAgIDo6IFRoZSBjdXJyZW50IGFjdGl2ZSBjaGFybWFwIGZvciB0aGlzIGZhY2UuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGaWVsZHMgbWF5IGJlIGNoYW5nZWQgYWZ0ZXIgYSBjYWxsIHRvIEBGVF9BdHRhY2hfRmlsZSBvciAgICAgICAgICAgKi8KKyAgLyogICAgQEZUX0F0dGFjaF9TdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgRlRfRmFjZVJlY18KKyAgeworICAgIEZUX0xvbmcgICAgICAgICAgIG51bV9mYWNlczsKKyAgICBGVF9Mb25nICAgICAgICAgICBmYWNlX2luZGV4OworCisgICAgRlRfTG9uZyAgICAgICAgICAgZmFjZV9mbGFnczsKKyAgICBGVF9Mb25nICAgICAgICAgICBzdHlsZV9mbGFnczsKKworICAgIEZUX0xvbmcgICAgICAgICAgIG51bV9nbHlwaHM7CisKKyAgICBGVF9TdHJpbmcqICAgICAgICBmYW1pbHlfbmFtZTsKKyAgICBGVF9TdHJpbmcqICAgICAgICBzdHlsZV9uYW1lOworCisgICAgRlRfSW50ICAgICAgICAgICAgbnVtX2ZpeGVkX3NpemVzOworICAgIEZUX0JpdG1hcF9TaXplKiAgIGF2YWlsYWJsZV9zaXplczsKKworICAgIEZUX0ludCAgICAgICAgICAgIG51bV9jaGFybWFwczsKKyAgICBGVF9DaGFyTWFwKiAgICAgICBjaGFybWFwczsKKworICAgIEZUX0dlbmVyaWMgICAgICAgIGdlbmVyaWM7CisKKyAgICAvKiMgVGhlIGZvbGxvd2luZyBtZW1iZXIgdmFyaWFibGVzIChkb3duIHRvIGB1bmRlcmxpbmVfdGhpY2tuZXNzJykgKi8KKyAgICAvKiMgYXJlIG9ubHkgcmVsZXZhbnQgdG8gc2NhbGFibGUgb3V0bGluZXM7IGNmLiBARlRfQml0bWFwX1NpemUgICAgKi8KKyAgICAvKiMgZm9yIGJpdG1hcCBmb250cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBGVF9CQm94ICAgICAgICAgICBiYm94OworCisgICAgRlRfVVNob3J0ICAgICAgICAgdW5pdHNfcGVyX0VNOworICAgIEZUX1Nob3J0ICAgICAgICAgIGFzY2VuZGVyOworICAgIEZUX1Nob3J0ICAgICAgICAgIGRlc2NlbmRlcjsKKyAgICBGVF9TaG9ydCAgICAgICAgICBoZWlnaHQ7CisKKyAgICBGVF9TaG9ydCAgICAgICAgICBtYXhfYWR2YW5jZV93aWR0aDsKKyAgICBGVF9TaG9ydCAgICAgICAgICBtYXhfYWR2YW5jZV9oZWlnaHQ7CisKKyAgICBGVF9TaG9ydCAgICAgICAgICB1bmRlcmxpbmVfcG9zaXRpb247CisgICAgRlRfU2hvcnQgICAgICAgICAgdW5kZXJsaW5lX3RoaWNrbmVzczsKKworICAgIEZUX0dseXBoU2xvdCAgICAgIGdseXBoOworICAgIEZUX1NpemUgICAgICAgICAgIHNpemU7CisgICAgRlRfQ2hhck1hcCAgICAgICAgY2hhcm1hcDsKKworICAgIC8qQHByaXZhdGUgYmVnaW4gKi8KKworICAgIEZUX0RyaXZlciAgICAgICAgIGRyaXZlcjsKKyAgICBGVF9NZW1vcnkgICAgICAgICBtZW1vcnk7CisgICAgRlRfU3RyZWFtICAgICAgICAgc3RyZWFtOworCisgICAgRlRfTGlzdFJlYyAgICAgICAgc2l6ZXNfbGlzdDsKKworICAgIEZUX0dlbmVyaWMgICAgICAgIGF1dG9oaW50OyAgIC8qIGZhY2Utc3BlY2lmaWMgYXV0by1oaW50ZXIgZGF0YSAqLworICAgIHZvaWQqICAgICAgICAgICAgIGV4dGVuc2lvbnM7IC8qIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgRlRfRmFjZV9JbnRlcm5hbCAgaW50ZXJuYWw7CisKKyAgICAvKkBwcml2YXRlIGVuZCAqLworCisgIH0gRlRfRmFjZVJlYzsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZBQ0VfRkxBR19YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgbGlzdCBvZiBiaXQgZmxhZ3MgdXNlZCBpbiB0aGUgYGZhY2VfZmxhZ3MnIGZpZWxkIG9mIHRoZSAgICAgICAgICAqLworICAvKiAgICBARlRfRmFjZVJlYyBzdHJ1Y3R1cmUuICBUaGV5IGluZm9ybSBjbGllbnQgYXBwbGljYXRpb25zIG9mICAgICAgICAgKi8KKyAgLyogICAgcHJvcGVydGllcyBvZiB0aGUgY29ycmVzcG9uZGluZyBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRkFDRV9GTEFHX1NDQUxBQkxFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgSW5kaWNhdGVzIHRoYXQgdGhlIGZhY2UgY29udGFpbnMgb3V0bGluZSBnbHlwaHMuICBUaGlzIGRvZXNuJ3QgICAqLworICAvKiAgICAgIHByZXZlbnQgYml0bWFwIHN0cmlrZXMsIGkuZS4sIGEgZmFjZSBjYW4gaGF2ZSBib3RoIHRoaXMgYW5kICAgICAgKi8KKyAgLyogICAgICBhbmQgQEZUX0ZBQ0VfRkxBR19GSVhFRF9TSVpFUyBzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GQUNFX0ZMQUdfRklYRURfU0laRVMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBJbmRpY2F0ZXMgdGhhdCB0aGUgZmFjZSBjb250YWlucyBiaXRtYXAgc3RyaWtlcy4gIFNlZSBhbHNvIHRoZSAgICovCisgIC8qICAgICAgYG51bV9maXhlZF9zaXplcycgYW5kIGBhdmFpbGFibGVfc2l6ZXMnIGZpZWxkcyBvZiBARlRfRmFjZVJlYy4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRkFDRV9GTEFHX0ZJWEVEX1dJRFRIIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgSW5kaWNhdGVzIHRoYXQgdGhlIGZhY2UgY29udGFpbnMgZml4ZWQtd2lkdGggY2hhcmFjdGVycyAobGlrZSAgICAqLworICAvKiAgICAgIENvdXJpZXIsIEx1Y2lkbywgTW9ub1R5cGUsIGV0Yy4pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZBQ0VfRkxBR19TRk5UIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIEluZGljYXRlcyB0aGF0IHRoZSBmYWNlIHVzZXMgdGhlIGBzZm50JyBzdG9yYWdlIHNjaGVtZS4gIEZvciAgICAgKi8KKyAgLyogICAgICBub3csIHRoaXMgbWVhbnMgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GQUNFX0ZMQUdfSE9SSVpPTlRBTCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBJbmRpY2F0ZXMgdGhhdCB0aGUgZmFjZSBjb250YWlucyBob3Jpem9udGFsIGdseXBoIG1ldHJpY3MuICBUaGlzICovCisgIC8qICAgICAgc2hvdWxkIGJlIHNldCBmb3IgYWxsIGNvbW1vbiBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRkFDRV9GTEFHX1ZFUlRJQ0FMIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgSW5kaWNhdGVzIHRoYXQgdGhlIGZhY2UgY29udGFpbnMgdmVydGljYWwgZ2x5cGggbWV0cmljcy4gIFRoaXMgICAqLworICAvKiAgICAgIGlzIG9ubHkgYXZhaWxhYmxlIGluIHNvbWUgZm9ybWF0cywgbm90IGFsbCBvZiB0aGVtLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZBQ0VfRkxBR19LRVJOSU5HIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIEluZGljYXRlcyB0aGF0IHRoZSBmYWNlIGNvbnRhaW5zIGtlcm5pbmcgaW5mb3JtYXRpb24uICBJZiBzZXQsICAgKi8KKyAgLyogICAgICB0aGUga2VybmluZyBkaXN0YW5jZSBjYW4gYmUgcmV0cmlldmVkIHRocm91Z2ggdGhlIGZ1bmN0aW9uICAgICAgICovCisgIC8qICAgICAgQEZUX0dldF9LZXJuaW5nLiAgT3RoZXJ3aXNlIHRoZSBmdW5jdGlvbiBhbHdheXMgcmV0dXJuIHRoZSAgICAgICAqLworICAvKiAgICAgIHZlY3RvciAoMCwwKS4gIE5vdGUgdGhhdCBGcmVlVHlwZSBkb2Vzbid0IGhhbmRsZSBrZXJuaW5nIGRhdGEgICAgKi8KKyAgLyogICAgICBmcm9tIHRoZSBgR1BPUycgdGFibGUgKGFzIHByZXNlbnQgaW4gc29tZSBPcGVuVHlwZSBmb250cykuICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GQUNFX0ZMQUdfRkFTVF9HTFlQSFMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBUSElTIEZMQUcgSVMgREVQUkVDQVRFRC4gIERPIE5PVCBVU0UgT1IgVEVTVCBJVC4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GQUNFX0ZMQUdfTVVMVElQTEVfTUFTVEVSUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBJbmRpY2F0ZXMgdGhhdCB0aGUgZm9udCBjb250YWlucyBtdWx0aXBsZSBtYXN0ZXJzIGFuZCBpcyBjYXBhYmxlICovCisgIC8qICAgICAgb2YgaW50ZXJwb2xhdGluZyBiZXR3ZWVuIHRoZW0uICBTZWUgdGhlIG11bHRpcGxlLW1hc3RlcnMgICAgICAgICAqLworICAvKiAgICAgIHNwZWNpZmljIEFQSSBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZBQ0VfRkxBR19HTFlQSF9OQU1FUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIEluZGljYXRlcyB0aGF0IHRoZSBmb250IGNvbnRhaW5zIGdseXBoIG5hbWVzIHRoYXQgY2FuIGJlICAgICAgICAgKi8KKyAgLyogICAgICByZXRyaWV2ZWQgdGhyb3VnaCBARlRfR2V0X0dseXBoX05hbWUuICBOb3RlIHRoYXQgc29tZSBUcnVlVHlwZSAgICovCisgIC8qICAgICAgZm9udHMgY29udGFpbiBicm9rZW4gZ2x5cGggbmFtZSB0YWJsZXMuICBVc2UgdGhlIGZ1bmN0aW9uICAgICAgICAqLworICAvKiAgICAgIEBGVF9IYXNfUFNfR2x5cGhfTmFtZXMgd2hlbiBuZWVkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZBQ0VfRkxBR19FWFRFUk5BTF9TVFJFQU0gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIFVzZWQgaW50ZXJuYWxseSBieSBGcmVlVHlwZSB0byBpbmRpY2F0ZSB0aGF0IGEgZmFjZSdzIHN0cmVhbSB3YXMgKi8KKyAgLyogICAgICBwcm92aWRlZCBieSB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIGFuZCBzaG91bGQgbm90IGJlIGRlc3Ryb3llZCAgICovCisgIC8qICAgICAgd2hlbiBARlRfRG9uZV9GYWNlIGlzIGNhbGxlZC4gIERvbid0IHJlYWQgb3IgdGVzdCB0aGlzIGZsYWcuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRkFDRV9GTEFHX0hJTlRFUiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgU2V0IGlmIHRoZSBmb250IGRyaXZlciBoYXMgYSBoaW50aW5nIG1hY2hpbmUgb2YgaXRzIG93bi4gIEZvciAgICAqLworICAvKiAgICAgIGV4YW1wbGUsIHdpdGggVHJ1ZVR5cGUgZm9udHMsIGl0IG1ha2VzIHNlbnNlIHRvIHVzZSBkYXRhIGZyb20gICAgKi8KKyAgLyogICAgICB0aGUgU0ZOVCBgZ2FzcCcgdGFibGUgb25seSBpZiB0aGUgbmF0aXZlIFRydWVUeXBlIGhpbnRpbmcgZW5naW5lICovCisgIC8qICAgICAgKHdpdGggdGhlIGJ5dGVjb2RlIGludGVycHJldGVyKSBpcyBhdmFpbGFibGUgYW5kIGFjdGl2ZS4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRkFDRV9GTEFHX0NJRF9LRVlFRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgU2V0IGlmIHRoZSBmb250IGlzIENJRC1rZXllZC4gIEluIHRoYXQgY2FzZSwgdGhlIGZvbnQgaXMgbm90ICAgICAqLworICAvKiAgICAgIGFjY2Vzc2VkIGJ5IGdseXBoIGluZGljZXMgYnV0IGJ5IENJRCB2YWx1ZXMuICBGb3Igc3Vic2V0dGVkICAgICAgKi8KKyAgLyogICAgICBDSUQta2V5ZWQgZm9udHMgdGhpcyBoYXMgdGhlIGNvbnNlcXVlbmNlIHRoYXQgbm90IGFsbCBpbmRleCAgICAgICovCisgIC8qICAgICAgdmFsdWVzIGFyZSBhIHZhbGlkIGFyZ3VtZW50IHRvIEZUX0xvYWRfR2x5cGguICBPbmx5IHRoZSBDSUQgICAgICAqLworICAvKiAgICAgIHZhbHVlcyBmb3Igd2hpY2ggY29ycmVzcG9uZGluZyBnbHlwaHMgaW4gdGhlIHN1YnNldHRlZCBmb250ICAgICAgKi8KKyAgLyogICAgICBleGlzdCBtYWtlIEZUX0xvYWRfR2x5cGggcmV0dXJuIHN1Y2Nlc3NmdWxseTsgaW4gYWxsIG90aGVyIGNhc2VzICovCisgIC8qICAgICAgeW91IGdldCBhbiBgRlRfRXJyX0ludmFsaWRfQXJndW1lbnQnIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBOb3RlIHRoYXQgQ0lELWtleWVkIGZvbnRzIHRoYXQgYXJlIGluIGFuIFNGTlQgd3JhcHBlciBkb24ndCAgICAgICovCisgIC8qICAgICAgaGF2ZSB0aGlzIGZsYWcgc2V0IHNpbmNlIHRoZSBnbHlwaHMgYXJlIGFjY2Vzc2VkIGluIHRoZSBub3JtYWwgICAqLworICAvKiAgICAgIHdheSAodXNpbmcgY29udGlndW91cyBpbmRpY2VzKTsgdGhlIGBDSUQtbmVzcycgaXNuJ3QgdmlzaWJsZSB0byAgKi8KKyAgLyogICAgICB0aGUgYXBwbGljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GQUNFX0ZMQUdfVFJJQ0tZIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBTZXQgaWYgdGhlIGZvbnQgaXMgYHRyaWNreScsIHRoaXMgaXMsIGl0IGFsd2F5cyBuZWVkcyB0aGUgICAgICAgICovCisgIC8qICAgICAgZm9udCBmb3JtYXQncyBuYXRpdmUgaGludGluZyBlbmdpbmUgdG8gZ2V0IGEgcmVhc29uYWJsZSByZXN1bHQuICAqLworICAvKiAgICAgIEEgdHlwaWNhbCBleGFtcGxlIGlzIHRoZSBDaGluZXNlIGZvbnQgYG1pbmdsaS50dGYnIHRoYXQgdXNlcyAgICAgKi8KKyAgLyogICAgICBUcnVlVHlwZSBieXRlY29kZSBpbnN0cnVjdGlvbnMgdG8gbW92ZSBhbmQgc2NhbGUgYWxsIG9mIGl0cyAgICAgICovCisgIC8qICAgICAgc3ViZ2x5cGhzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBJdCBpcyBub3QgcG9zc2libGUgdG8gYXV0by1oaW50IHN1Y2ggZm9udHMgdXNpbmcgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgQEZUX0xPQURfRk9SQ0VfQVVUT0hJTlQ7IGl0IHdpbGwgYWxzbyBpZ25vcmUgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIEBGVF9MT0FEX05PX0hJTlRJTkcuICBZb3UgaGF2ZSB0byBzZXQgYm90aCBARlRfTE9BRF9OT19ISU5USU5HICAgKi8KKyAgLyogICAgICBhbmQgQEZUX0xPQURfTk9fQVVUT0hJTlQgdG8gcmVhbGx5IGRpc2FibGUgaGludGluZzsgaG93ZXZlciwgeW91ICovCisgIC8qICAgICAgcHJvYmFibHkgbmV2ZXIgd2FudCB0aGlzIGV4Y2VwdCBmb3IgZGVtb25zdHJhdGlvbiBwdXJwb3Nlcy4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBDdXJyZW50bHksIHRoZXJlIGFyZSBhYm91dCBhIGRvemVuIFRydWVUeXBlIGZvbnRzIGluIHRoZSBsaXN0IG9mICovCisgIC8qICAgICAgdHJpY2t5IGZvbnRzOyB0aGV5IGFyZSBoYXJkLWNvZGVkIGluIGZpbGUgYHR0b2Jqcy5jJy4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRkFDRV9GTEFHX0NPTE9SIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgU2V0IGlmIHRoZSBmb250IGhhcyBjb2xvciBnbHlwaCB0YWJsZXMuICBUbyBhY2Nlc3MgY29sb3IgZ2x5cGhzICAqLworICAvKiAgICAgIHVzZSBARlRfTE9BRF9DT0xPUi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSAgICAgICAgICAoIDFMIDw8ICAwICkKKyNkZWZpbmUgRlRfRkFDRV9GTEFHX0ZJWEVEX1NJWkVTICAgICAgICggMUwgPDwgIDEgKQorI2RlZmluZSBGVF9GQUNFX0ZMQUdfRklYRURfV0lEVEggICAgICAgKCAxTCA8PCAgMiApCisjZGVmaW5lIEZUX0ZBQ0VfRkxBR19TRk5UICAgICAgICAgICAgICAoIDFMIDw8ICAzICkKKyNkZWZpbmUgRlRfRkFDRV9GTEFHX0hPUklaT05UQUwgICAgICAgICggMUwgPDwgIDQgKQorI2RlZmluZSBGVF9GQUNFX0ZMQUdfVkVSVElDQUwgICAgICAgICAgKCAxTCA8PCAgNSApCisjZGVmaW5lIEZUX0ZBQ0VfRkxBR19LRVJOSU5HICAgICAgICAgICAoIDFMIDw8ICA2ICkKKyNkZWZpbmUgRlRfRkFDRV9GTEFHX0ZBU1RfR0xZUEhTICAgICAgICggMUwgPDwgIDcgKQorI2RlZmluZSBGVF9GQUNFX0ZMQUdfTVVMVElQTEVfTUFTVEVSUyAgKCAxTCA8PCAgOCApCisjZGVmaW5lIEZUX0ZBQ0VfRkxBR19HTFlQSF9OQU1FUyAgICAgICAoIDFMIDw8ICA5ICkKKyNkZWZpbmUgRlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTSAgICggMUwgPDwgMTAgKQorI2RlZmluZSBGVF9GQUNFX0ZMQUdfSElOVEVSICAgICAgICAgICAgKCAxTCA8PCAxMSApCisjZGVmaW5lIEZUX0ZBQ0VfRkxBR19DSURfS0VZRUQgICAgICAgICAoIDFMIDw8IDEyICkKKyNkZWZpbmUgRlRfRkFDRV9GTEFHX1RSSUNLWSAgICAgICAgICAgICggMUwgPDwgMTMgKQorI2RlZmluZSBGVF9GQUNFX0ZMQUdfQ09MT1IgICAgICAgICAgICAgKCAxTCA8PCAxNCApCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfSEFTX0hPUklaT05UQUwoIGZhY2UgKQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtYWNybyB0aGF0IHJldHVybnMgdHJ1ZSB3aGVuZXZlciBhIGZhY2Ugb2JqZWN0IGNvbnRhaW5zCisgICAqICAgaG9yaXpvbnRhbCBtZXRyaWNzICh0aGlzIGlzIHRydWUgZm9yIGFsbCBmb250IGZvcm1hdHMgdGhvdWdoKS4KKyAgICoKKyAgICogQGFsc286CisgICAqICAgQEZUX0hBU19WRVJUSUNBTCBjYW4gYmUgdXNlZCB0byBjaGVjayBmb3IgdmVydGljYWwgbWV0cmljcy4KKyAgICoKKyAgICovCisjZGVmaW5lIEZUX0hBU19IT1JJWk9OVEFMKCBmYWNlICkgXAorICAgICAgICAgICggZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19IT1JJWk9OVEFMICkKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9IQVNfVkVSVElDQUwoIGZhY2UgKQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtYWNybyB0aGF0IHJldHVybnMgdHJ1ZSB3aGVuZXZlciBhIGZhY2Ugb2JqZWN0IGNvbnRhaW5zIHJlYWwKKyAgICogICB2ZXJ0aWNhbCBtZXRyaWNzIChhbmQgbm90IG9ubHkgc3ludGhlc2l6ZWQgb25lcykuCisgICAqCisgICAqLworI2RlZmluZSBGVF9IQVNfVkVSVElDQUwoIGZhY2UgKSBcCisgICAgICAgICAgKCBmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1ZFUlRJQ0FMICkKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9IQVNfS0VSTklORyggZmFjZSApCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIGEgZmFjZSBvYmplY3QgY29udGFpbnMga2VybmluZworICAgKiAgIGRhdGEgdGhhdCBjYW4gYmUgYWNjZXNzZWQgd2l0aCBARlRfR2V0X0tlcm5pbmcuCisgICAqCisgICAqLworI2RlZmluZSBGVF9IQVNfS0VSTklORyggZmFjZSApIFwKKyAgICAgICAgICAoIGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfS0VSTklORyApCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfSVNfU0NBTEFCTEUoIGZhY2UgKQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtYWNybyB0aGF0IHJldHVybnMgdHJ1ZSB3aGVuZXZlciBhIGZhY2Ugb2JqZWN0IGNvbnRhaW5zIGEgc2NhbGFibGUKKyAgICogICBmb250IGZhY2UgKHRydWUgZm9yIFRydWVUeXBlLCBUeXBlfjEsIFR5cGV+NDIsIENJRCwgT3BlblR5cGUvQ0ZGLAorICAgKiAgIGFuZCBQRlIgZm9udCBmb3JtYXRzLgorICAgKgorICAgKi8KKyNkZWZpbmUgRlRfSVNfU0NBTEFCTEUoIGZhY2UgKSBcCisgICAgICAgICAgKCBmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1NDQUxBQkxFICkKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9JU19TRk5UKCBmYWNlICkKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucyBhIGZvbnQKKyAgICogICB3aG9zZSBmb3JtYXQgaXMgYmFzZWQgb24gdGhlIFNGTlQgc3RvcmFnZSBzY2hlbWUuICBUaGlzIHVzdWFsbHkKKyAgICogICBtZWFuczogVHJ1ZVR5cGUgZm9udHMsIE9wZW5UeXBlIGZvbnRzLCBhcyB3ZWxsIGFzIFNGTlQtYmFzZWQgZW1iZWRkZWQKKyAgICogICBiaXRtYXAgZm9udHMuCisgICAqCisgICAqICAgSWYgdGhpcyBtYWNybyBpcyB0cnVlLCBhbGwgZnVuY3Rpb25zIGRlZmluZWQgaW4gQEZUX1NGTlRfTkFNRVNfSCBhbmQKKyAgICogICBARlRfVFJVRVRZUEVfVEFCTEVTX0ggYXJlIGF2YWlsYWJsZS4KKyAgICoKKyAgICovCisjZGVmaW5lIEZUX0lTX1NGTlQoIGZhY2UgKSBcCisgICAgICAgICAgKCBmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1NGTlQgKQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX0lTX0ZJWEVEX1dJRFRIKCBmYWNlICkKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucyBhIGZvbnQgZmFjZQorICAgKiAgIHRoYXQgY29udGFpbnMgZml4ZWQtd2lkdGggKG9yIGBtb25vc3BhY2UnLCBgZml4ZWQtcGl0Y2gnLCBldGMuKQorICAgKiAgIGdseXBocy4KKyAgICoKKyAgICovCisjZGVmaW5lIEZUX0lTX0ZJWEVEX1dJRFRIKCBmYWNlICkgXAorICAgICAgICAgICggZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19GSVhFRF9XSURUSCApCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfSEFTX0ZJWEVEX1NJWkVTKCBmYWNlICkKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucyBzb21lCisgICAqICAgZW1iZWRkZWQgYml0bWFwcy4gIFNlZSB0aGUgYGF2YWlsYWJsZV9zaXplcycgZmllbGQgb2YgdGhlCisgICAqICAgQEZUX0ZhY2VSZWMgc3RydWN0dXJlLgorICAgKgorICAgKi8KKyNkZWZpbmUgRlRfSEFTX0ZJWEVEX1NJWkVTKCBmYWNlICkgXAorICAgICAgICAgICggZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19GSVhFRF9TSVpFUyApCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfSEFTX0ZBU1RfR0xZUEhTKCBmYWNlICkKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIERlcHJlY2F0ZWQuCisgICAqCisgICAqLworI2RlZmluZSBGVF9IQVNfRkFTVF9HTFlQSFMoIGZhY2UgKSAgMAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX0hBU19HTFlQSF9OQU1FUyggZmFjZSApCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIGEgZmFjZSBvYmplY3QgY29udGFpbnMgc29tZSBnbHlwaAorICAgKiAgIG5hbWVzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2ggQEZUX0dldF9HbHlwaF9OYW1lLgorICAgKgorICAgKi8KKyNkZWZpbmUgRlRfSEFTX0dMWVBIX05BTUVTKCBmYWNlICkgXAorICAgICAgICAgICggZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19HTFlQSF9OQU1FUyApCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfSEFTX01VTFRJUExFX01BU1RFUlMoIGZhY2UgKQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtYWNybyB0aGF0IHJldHVybnMgdHJ1ZSB3aGVuZXZlciBhIGZhY2Ugb2JqZWN0IGNvbnRhaW5zIHNvbWUKKyAgICogICBtdWx0aXBsZSBtYXN0ZXJzLiAgVGhlIGZ1bmN0aW9ucyBwcm92aWRlZCBieSBARlRfTVVMVElQTEVfTUFTVEVSU19ICisgICAqICAgYXJlIHRoZW4gYXZhaWxhYmxlIHRvIGNob29zZSB0aGUgZXhhY3QgZGVzaWduIHlvdSB3YW50LgorICAgKgorICAgKi8KKyNkZWZpbmUgRlRfSEFTX01VTFRJUExFX01BU1RFUlMoIGZhY2UgKSBcCisgICAgICAgICAgKCBmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX01VTFRJUExFX01BU1RFUlMgKQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX0lTX0NJRF9LRVlFRCggZmFjZSApCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIGEgZmFjZSBvYmplY3QgY29udGFpbnMgYSBDSUQta2V5ZWQKKyAgICogICBmb250LiAgU2VlIHRoZSBkaXNjdXNzaW9uIG9mIEBGVF9GQUNFX0ZMQUdfQ0lEX0tFWUVEIGZvciBtb3JlCisgICAqICAgZGV0YWlscy4KKyAgICoKKyAgICogICBJZiB0aGlzIG1hY3JvIGlzIHRydWUsIGFsbCBmdW5jdGlvbnMgZGVmaW5lZCBpbiBARlRfQ0lEX0ggYXJlCisgICAqICAgYXZhaWxhYmxlLgorICAgKgorICAgKi8KKyNkZWZpbmUgRlRfSVNfQ0lEX0tFWUVEKCBmYWNlICkgXAorICAgICAgICAgICggZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19DSURfS0VZRUQgKQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX0lTX1RSSUNLWSggZmFjZSApCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIGEgZmFjZSByZXByZXNlbnRzIGEgYHRyaWNreScgZm9udC4KKyAgICogICBTZWUgdGhlIGRpc2N1c3Npb24gb2YgQEZUX0ZBQ0VfRkxBR19UUklDS1kgZm9yIG1vcmUgZGV0YWlscy4KKyAgICoKKyAgICovCisjZGVmaW5lIEZUX0lTX1RSSUNLWSggZmFjZSApIFwKKyAgICAgICAgICAoIGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfVFJJQ0tZICkKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9IQVNfQ09MT1IoIGZhY2UgKQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtYWNybyB0aGF0IHJldHVybnMgdHJ1ZSB3aGVuZXZlciBhIGZhY2Ugb2JqZWN0IGNvbnRhaW5zCisgICAqICAgdGFibGVzIGZvciBjb2xvciBnbHlwaHMuCisgICAqCisgICAqLworI2RlZmluZSBGVF9IQVNfQ09MT1IoIGZhY2UgKSBcCisgICAgICAgICAgKCBmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0NPTE9SICkKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPENvbnN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1NUWUxFX0ZMQUdfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgbGlzdCBvZiBiaXQgZmxhZ3MgdXNlZCB0byBpbmRpY2F0ZSB0aGUgc3R5bGUgb2YgYSBnaXZlbiBmYWNlLiAgICAqLworICAvKiAgICBUaGVzZSBhcmUgdXNlZCBpbiB0aGUgYHN0eWxlX2ZsYWdzJyBmaWVsZCBvZiBARlRfRmFjZVJlYy4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TVFlMRV9GTEFHX0lUQUxJQyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBJbmRpY2F0ZXMgdGhhdCBhIGdpdmVuIGZhY2Ugc3R5bGUgaXMgaXRhbGljIG9yIG9ibGlxdWUuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TVFlMRV9GTEFHX0JPTEQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBJbmRpY2F0ZXMgdGhhdCBhIGdpdmVuIGZhY2UgaXMgYm9sZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIHN0eWxlIGluZm9ybWF0aW9uIGFzIHByb3ZpZGVkIGJ5IEZyZWVUeXBlIGlzIHZlcnkgYmFzaWMuICBNb3JlICovCisgIC8qICAgIGRldGFpbHMgYXJlIGJleW9uZCB0aGUgc2NvcGUgYW5kIHNob3VsZCBiZSBkb25lIG9uIGEgaGlnaGVyIGxldmVsICAqLworICAvKiAgICAoZm9yIGV4YW1wbGUsIGJ5IGFuYWx5emluZyB2YXJpb3VzIGZpZWxkcyBvZiB0aGUgYE9TLzInIHRhYmxlIGluICAgKi8KKyAgLyogICAgU0ZOVCBiYXNlZCBmb250cykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9TVFlMRV9GTEFHX0lUQUxJQyAgKCAxIDw8IDAgKQorI2RlZmluZSBGVF9TVFlMRV9GTEFHX0JPTEQgICAgKCAxIDw8IDEgKQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU2l6ZV9JbnRlcm5hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQW4gb3BhcXVlIGhhbmRsZSB0byBhbiBgRlRfU2l6ZV9JbnRlcm5hbFJlYycgc3RydWN0dXJlLCB1c2VkIHRvICAgICovCisgIC8qICAgIG1vZGVsIHByaXZhdGUgZGF0YSBvZiBhIGdpdmVuIEBGVF9TaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgRlRfU2l6ZV9JbnRlcm5hbFJlY18qICBGVF9TaXplX0ludGVybmFsOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU2l6ZV9NZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIHNpemUgbWV0cmljcyBzdHJ1Y3R1cmUgZ2l2ZXMgdGhlIG1ldHJpY3Mgb2YgYSBzaXplIG9iamVjdC4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeF9wcGVtICAgICAgIDo6IFRoZSB3aWR0aCBvZiB0aGUgc2NhbGVkIEVNIHNxdWFyZSBpbiBwaXhlbHMsIGhlbmNlICovCisgIC8qICAgICAgICAgICAgICAgICAgICB0aGUgdGVybSBgcHBlbScgKHBpeGVscyBwZXIgRU0pLiAgSXQgaXMgYWxzbyAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgcmVmZXJyZWQgdG8gYXMgYG5vbWluYWwgd2lkdGgnLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHlfcHBlbSAgICAgICA6OiBUaGUgaGVpZ2h0IG9mIHRoZSBzY2FsZWQgRU0gc3F1YXJlIGluIHBpeGVscywgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgaGVuY2UgdGhlIHRlcm0gYHBwZW0nIChwaXhlbHMgcGVyIEVNKS4gIEl0IGlzIGFsc28gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIHJlZmVycmVkIHRvIGFzIGBub21pbmFsIGhlaWdodCcuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4X3NjYWxlICAgICAgOjogQSAxNi4xNiBmcmFjdGlvbmFsIHNjYWxpbmcgdmFsdWUgdXNlZCB0byBjb252ZXJ0ICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIGhvcml6b250YWwgbWV0cmljcyBmcm9tIGZvbnQgdW5pdHMgdG8gMjYuNiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbmFsIHBpeGVscy4gIE9ubHkgcmVsZXZhbnQgZm9yIHNjYWxhYmxlICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgZm9udCBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHlfc2NhbGUgICAgICA6OiBBIDE2LjE2IGZyYWN0aW9uYWwgc2NhbGluZyB2YWx1ZSB1c2VkIHRvIGNvbnZlcnQgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgbWV0cmljcyBmcm9tIGZvbnQgdW5pdHMgdG8gMjYuNiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uYWwgcGl4ZWxzLiAgT25seSByZWxldmFudCBmb3Igc2NhbGFibGUgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICBmb250IGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYXNjZW5kZXIgICAgIDo6IFRoZSBhc2NlbmRlciBpbiAyNi42IGZyYWN0aW9uYWwgcGl4ZWxzLiAgU2VlICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICBARlRfRmFjZVJlYyBmb3IgdGhlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZGVzY2VuZGVyICAgIDo6IFRoZSBkZXNjZW5kZXIgaW4gMjYuNiBmcmFjdGlvbmFsIHBpeGVscy4gIFNlZSAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICBARlRfRmFjZVJlYyBmb3IgdGhlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaGVpZ2h0ICAgICAgIDo6IFRoZSBoZWlnaHQgaW4gMjYuNiBmcmFjdGlvbmFsIHBpeGVscy4gIFNlZSAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICBARlRfRmFjZVJlYyBmb3IgdGhlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4X2FkdmFuY2UgIDo6IFRoZSBtYXhpbXVtIGFkdmFuY2Ugd2lkdGggaW4gMjYuNiBmcmFjdGlvbmFsICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICBwaXhlbHMuICBTZWUgQEZUX0ZhY2VSZWMgZm9yIHRoZSBkZXRhaWxzLiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBzY2FsaW5nIHZhbHVlcywgaWYgcmVsZXZhbnQsIGFyZSBkZXRlcm1pbmVkIGZpcnN0IGR1cmluZyBhICAgICAqLworICAvKiAgICBzaXplIGNoYW5naW5nIG9wZXJhdGlvbi4gIFRoZSByZW1haW5pbmcgZmllbGRzIGFyZSB0aGVuIHNldCBieSB0aGUgKi8KKyAgLyogICAgZHJpdmVyLiAgRm9yIHNjYWxhYmxlIGZvcm1hdHMsIHRoZXkgYXJlIHVzdWFsbHkgc2V0IHRvIHNjYWxlZCAgICAgICovCisgIC8qICAgIHZhbHVlcyBvZiB0aGUgY29ycmVzcG9uZGluZyBmaWVsZHMgaW4gQEZUX0ZhY2VSZWMuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTm90ZSB0aGF0IGR1ZSB0byBnbHlwaCBoaW50aW5nLCB0aGVzZSB2YWx1ZXMgbWlnaHQgbm90IGJlIGV4YWN0ICAgICovCisgIC8qICAgIGZvciBjZXJ0YWluIGZvbnRzLiAgVGh1cyB0aGV5IG11c3QgYmUgdHJlYXRlZCBhcyB1bnJlbGlhYmxlICAgICAgICAqLworICAvKiAgICB3aXRoIGFuIGVycm9yIG1hcmdpbiBvZiBhdCBsZWFzdCBvbmUgcGl4ZWwhICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEluZGVlZCwgdGhlIG9ubHkgd2F5IHRvIGdldCB0aGUgZXhhY3QgbWV0cmljcyBpcyB0byByZW5kZXIgX2FsbF8gICAqLworICAvKiAgICBnbHlwaHMuICBBcyB0aGlzIHdvdWxkIGJlIGEgZGVmaW5pdGUgcGVyZm9ybWFuY2UgaGl0LCBpdCBpcyB1cCB0byAgKi8KKyAgLyogICAgY2xpZW50IGFwcGxpY2F0aW9ucyB0byBwZXJmb3JtIHN1Y2ggY29tcHV0YXRpb25zLiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgRlRfU2l6ZV9NZXRyaWNzIHN0cnVjdHVyZSBpcyB2YWxpZCBmb3IgYml0bWFwIGZvbnRzIGFsc28uICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBGVF9TaXplX01ldHJpY3NfCisgIHsKKyAgICBGVF9VU2hvcnQgIHhfcHBlbTsgICAgICAvKiBob3Jpem9udGFsIHBpeGVscyBwZXIgRU0gICAgICAgICAgICAgICAqLworICAgIEZUX1VTaG9ydCAgeV9wcGVtOyAgICAgIC8qIHZlcnRpY2FsIHBpeGVscyBwZXIgRU0gICAgICAgICAgICAgICAgICovCisKKyAgICBGVF9GaXhlZCAgIHhfc2NhbGU7ICAgICAvKiBzY2FsaW5nIHZhbHVlcyB1c2VkIHRvIGNvbnZlcnQgZm9udCAgICAqLworICAgIEZUX0ZpeGVkICAgeV9zY2FsZTsgICAgIC8qIHVuaXRzIHRvIDI2LjYgZnJhY3Rpb25hbCBwaXhlbHMgICAgICAgICovCisKKyAgICBGVF9Qb3MgICAgIGFzY2VuZGVyOyAgICAvKiBhc2NlbmRlciBpbiAyNi42IGZyYWMuIHBpeGVscyAgICAgICAgICAqLworICAgIEZUX1BvcyAgICAgZGVzY2VuZGVyOyAgIC8qIGRlc2NlbmRlciBpbiAyNi42IGZyYWMuIHBpeGVscyAgICAgICAgICovCisgICAgRlRfUG9zICAgICBoZWlnaHQ7ICAgICAgLyogdGV4dCBoZWlnaHQgaW4gMjYuNiBmcmFjLiBwaXhlbHMgICAgICAgKi8KKyAgICBGVF9Qb3MgICAgIG1heF9hZHZhbmNlOyAvKiBtYXggaG9yaXpvbnRhbCBhZHZhbmNlLCBpbiAyNi42IHBpeGVscyAqLworCisgIH0gRlRfU2l6ZV9NZXRyaWNzOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU2l6ZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgcm9vdCBzaXplIGNsYXNzIHN0cnVjdHVyZS4gIEEgc2l6ZSBvYmplY3QgbW9kZWxzIGEgZmFjZSAgICovCisgIC8qICAgIG9iamVjdCBhdCBhIGdpdmVuIHNpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgOjogSGFuZGxlIHRvIHRoZSBwYXJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2VuZXJpYyA6OiBBIHR5cGVsZXNzIHBvaW50ZXIsIHVudXNlZCBieSB0aGUgRnJlZVR5cGUgbGlicmFyeSBvciAgICovCisgIC8qICAgICAgICAgICAgICAgYW55IG9mIGl0cyBkcml2ZXJzLiAgSXQgY2FuIGJlIHVzZWQgYnkgY2xpZW50ICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgIGFwcGxpY2F0aW9ucyB0byBsaW5rIHRoZWlyIG93biBkYXRhIHRvIGVhY2ggc2l6ZSAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtZXRyaWNzIDo6IE1ldHJpY3MgZm9yIHRoaXMgc2l6ZSBvYmplY3QuICBUaGlzIGZpZWxkIGlzIHJlYWQtb25seS4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBGVF9TaXplUmVjXworICB7CisgICAgRlRfRmFjZSAgICAgICAgICAgZmFjZTsgICAgICAvKiBwYXJlbnQgZmFjZSBvYmplY3QgICAgICAgICAgICAgICovCisgICAgRlRfR2VuZXJpYyAgICAgICAgZ2VuZXJpYzsgICAvKiBnZW5lcmljIHBvaW50ZXIgZm9yIGNsaWVudCB1c2VzICovCisgICAgRlRfU2l6ZV9NZXRyaWNzICAgbWV0cmljczsgICAvKiBzaXplIG1ldHJpY3MgICAgICAgICAgICAgICAgICAgICovCisgICAgRlRfU2l6ZV9JbnRlcm5hbCAgaW50ZXJuYWw7CisKKyAgfSBGVF9TaXplUmVjOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU3ViR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIHN1YmdseXBoIHN0cnVjdHVyZSBpcyBhbiBpbnRlcm5hbCBvYmplY3QgdXNlZCB0byBkZXNjcmliZSAgICAgICovCisgIC8qICAgIHN1YmdseXBocyAoZm9yIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIGNvbXBvc2l0ZXMpLiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBzdWJnbHlwaCBpbXBsZW1lbnRhdGlvbiBpcyBub3QgcGFydCBvZiB0aGUgaGlnaC1sZXZlbCBBUEksICAgICAqLworICAvKiAgICBoZW5jZSB0aGUgZm9yd2FyZCBzdHJ1Y3R1cmUgZGVjbGFyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFlvdSBjYW4gaG93ZXZlciByZXRyaWV2ZSBzdWJnbHlwaCBpbmZvcm1hdGlvbiB3aXRoICAgICAgICAgICAgICAgICAqLworICAvKiAgICBARlRfR2V0X1N1YkdseXBoX0luZm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IEZUX1N1YkdseXBoUmVjXyogIEZUX1N1YkdseXBoOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU2xvdF9JbnRlcm5hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQW4gb3BhcXVlIGhhbmRsZSB0byBhbiBgRlRfU2xvdF9JbnRlcm5hbFJlYycgc3RydWN0dXJlLCB1c2VkIHRvICAgICovCisgIC8qICAgIG1vZGVsIHByaXZhdGUgZGF0YSBvZiBhIGdpdmVuIEBGVF9HbHlwaFNsb3Qgb2JqZWN0LiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgRlRfU2xvdF9JbnRlcm5hbFJlY18qICBGVF9TbG90X0ludGVybmFsOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2x5cGhTbG90UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgcm9vdCBnbHlwaCBzbG90IGNsYXNzIHN0cnVjdHVyZS4gIEEgZ2x5cGggc2xvdCBpcyBhICAgICAgICovCisgIC8qICAgIGNvbnRhaW5lciB3aGVyZSBpbmRpdmlkdWFsIGdseXBocyBjYW4gYmUgbG9hZGVkLCBiZSB0aGV5IGluICAgICAgICAqLworICAvKiAgICBvdXRsaW5lIG9yIGJpdG1hcCBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaWJyYXJ5ICAgICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgRnJlZVR5cGUgbGlicmFyeSBpbnN0YW5jZSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBzbG90IGJlbG9uZ3MgdG8uICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgICAgICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgcGFyZW50IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG5leHQgICAgICAgICAgICAgIDo6IEluIHNvbWUgY2FzZXMgKGxpa2Ugc29tZSBmb250IHRvb2xzKSwgc2V2ZXJhbCAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaCBzbG90cyBwZXIgZmFjZSBvYmplY3QgY2FuIGJlIGEgZ29vZCAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuICBBcyB0aGlzIGlzIHJhcmUsIHRoZSBnbHlwaCBzbG90cyBhcmUgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlZCB0aHJvdWdoIGEgZGlyZWN0LCBzaW5nbGUtbGlua2VkIGxpc3QgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyBpdHMgYG5leHQnIGZpZWxkLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdlbmVyaWMgICAgICAgICAgIDo6IEEgdHlwZWxlc3MgcG9pbnRlciB1bnVzZWQgYnkgdGhlIEZyZWVUeXBlICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5IG9yIGFueSBvZiBpdHMgZHJpdmVycy4gIEl0IGNhbiBiZSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBieSBjbGllbnQgYXBwbGljYXRpb25zIHRvIGxpbmsgdGhlaXIgb3duICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgdG8gZWFjaCBnbHlwaCBzbG90IG9iamVjdC4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWV0cmljcyAgICAgICAgICAgOjogVGhlIG1ldHJpY3Mgb2YgdGhlIGxhc3QgbG9hZGVkIGdseXBoIGluIHRoZSAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QuICBUaGUgcmV0dXJuZWQgdmFsdWVzIGRlcGVuZCBvbiB0aGUgbGFzdCAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkIGZsYWdzIChzZWUgdGhlIEBGVF9Mb2FkX0dseXBoIEFQSSAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24pIGFuZCBjYW4gYmUgZXhwcmVzc2VkIGVpdGhlciBpbiAyNi42ICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uYWwgcGl4ZWxzIG9yIGZvbnQgdW5pdHMuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGV2ZW4gd2hlbiB0aGUgZ2x5cGggaW1hZ2UgaXMgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkLCB0aGUgbWV0cmljcyBhcmUgbm90LiAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGluZWFySG9yaUFkdmFuY2UgOjogVGhlIGFkdmFuY2Ugd2lkdGggb2YgdGhlIHVuaGludGVkIGdseXBoLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEl0cyB2YWx1ZSBpcyBleHByZXNzZWQgaW4gMTYuMTYgZnJhY3Rpb25hbCAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHMsIHVubGVzcyBARlRfTE9BRF9MSU5FQVJfREVTSUdOIGlzIHNldCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBsb2FkaW5nIHRoZSBnbHlwaC4gIFRoaXMgZmllbGQgY2FuIGJlICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydGFudCB0byBwZXJmb3JtIGNvcnJlY3QgV1lTSVdZRyBsYXlvdXQuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IHJlbGV2YW50IGZvciBvdXRsaW5lIGdseXBocy4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpbmVhclZlcnRBZHZhbmNlIDo6IFRoZSBhZHZhbmNlIGhlaWdodCBvZiB0aGUgdW5oaW50ZWQgZ2x5cGguICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBJdHMgdmFsdWUgaXMgZXhwcmVzc2VkIGluIDE2LjE2IGZyYWN0aW9uYWwgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzLCB1bmxlc3MgQEZUX0xPQURfTElORUFSX0RFU0lHTiBpcyBzZXQgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gbG9hZGluZyB0aGUgZ2x5cGguICBUaGlzIGZpZWxkIGNhbiBiZSAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRhbnQgdG8gcGVyZm9ybSBjb3JyZWN0IFdZU0lXWUcgbGF5b3V0LiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgT25seSByZWxldmFudCBmb3Igb3V0bGluZSBnbHlwaHMuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhZHZhbmNlICAgICAgICAgICA6OiBUaGlzIHNob3J0aGFuZCBpcywgZGVwZW5kaW5nIG9uICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgQEZUX0xPQURfSUdOT1JFX1RSQU5TRk9STSwgdGhlIHRyYW5zZm9ybWVkICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIChoaW50ZWQpIGFkdmFuY2Ugd2lkdGggZm9yIHRoZSBnbHlwaCwgaW4gMjYuNiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbmFsIHBpeGVsIGZvcm1hdC4gIEFzIHNwZWNpZmllZCB3aXRoICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgQEZUX0xPQURfVkVSVElDQUxfTEFZT1VULCBpdCB1c2VzIGVpdGhlciB0aGUgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGBob3JpQWR2YW5jZScgb3IgdGhlIGB2ZXJ0QWR2YW5jZScgdmFsdWUgb2YgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBgbWV0cmljcycgZmllbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZvcm1hdCAgICAgICAgICAgIDo6IFRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSBmb3JtYXQgb2YgdGhlIGltYWdlICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWQgaW4gdGhlIGdseXBoIHNsb3QuICBUeXBpY2FsbHkgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgQEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAsICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSwgb3IgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBARlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURSwgYnV0IG90aGVycyBhcmUgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBiaXRtYXAgICAgICAgICAgICA6OiBUaGlzIGZpZWxkIGlzIHVzZWQgYXMgYSBiaXRtYXAgZGVzY3JpcHRvciAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgc2xvdCBmb3JtYXQgaXMgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEBGVF9HTFlQSF9GT1JNQVRfQklUTUFQLiAgTm90ZSB0aGF0IHRoZSAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIGFuZCBjb250ZW50IG9mIHRoZSBiaXRtYXAgYnVmZmVyIGNhbiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlIGJldHdlZW4gY2FsbHMgb2YgQEZUX0xvYWRfR2x5cGggYW5kIGEgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGZldyBvdGhlciBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYml0bWFwX2xlZnQgICAgICAgOjogVGhlIGJpdG1hcCdzIGxlZnQgYmVhcmluZyBleHByZXNzZWQgaW4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGludGVnZXIgcGl4ZWxzLiAgT25seSB2YWxpZCBpZiB0aGUgZm9ybWF0IGlzICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBARlRfR0xZUEhfRk9STUFUX0JJVE1BUCwgdGhpcyBpcywgaWYgdGhlICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGggc2xvdCBjb250YWlucyBhIGJpdG1hcC4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBiaXRtYXBfdG9wICAgICAgICA6OiBUaGUgYml0bWFwJ3MgdG9wIGJlYXJpbmcgZXhwcmVzc2VkIGluIGludGVnZXIgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzLiAgUmVtZW1iZXIgdGhhdCB0aGlzIGlzIHRoZSBkaXN0YW5jZSAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIGJhc2VsaW5lIHRvIHRoZSB0b3AtbW9zdCBnbHlwaCAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubGluZSwgdXB3YXJkcyB5fmNvb3JkaW5hdGVzIGJlaW5nICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgKnBvc2l0aXZlKi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvdXRsaW5lICAgICAgICAgICA6OiBUaGUgb3V0bGluZSBkZXNjcmlwdG9yIGZvciB0aGUgY3VycmVudCBnbHlwaCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgaWYgaXRzIGZvcm1hdCBpcyAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEBGVF9HTFlQSF9GT1JNQVRfT1VUTElORS4gIE9uY2UgYSBnbHlwaCBpcyAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQsIGBvdXRsaW5lJyBjYW4gYmUgdHJhbnNmb3JtZWQsICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZGlzdG9ydGVkLCBlbWJvbGRlZCwgZXRjLiAgSG93ZXZlciwgaXQgbXVzdCAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBiZSBmcmVlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtX3N1YmdseXBocyAgICAgOjogVGhlIG51bWJlciBvZiBzdWJnbHlwaHMgaW4gYSBjb21wb3NpdGUgZ2x5cGguICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgaXMgb25seSB2YWxpZCBmb3IgdGhlIGNvbXBvc2l0ZSAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaCBmb3JtYXQgdGhhdCBzaG91bGQgbm9ybWFsbHkgb25seSBiZSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkIHdpdGggdGhlIEBGVF9MT0FEX05PX1JFQ1VSU0UgZmxhZy4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdWJnbHlwaHMgICAgICAgICA6OiBBbiBhcnJheSBvZiBzdWJnbHlwaCBkZXNjcmlwdG9ycyBmb3IgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlIGdseXBocy4gIFRoZXJlIGFyZSBgbnVtX3N1YmdseXBocycgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIGluIHRoZXJlLiAgQ3VycmVudGx5IGludGVybmFsIHRvICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBGcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNvbnRyb2xfZGF0YSAgICAgIDo6IENlcnRhaW4gZm9udCBkcml2ZXJzIGNhbiBhbHNvIHJldHVybiB0aGUgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sIGRhdGEgZm9yIGEgZ2l2ZW4gZ2x5cGggaW1hZ2UgKGUuZy4gICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUgYnl0ZWNvZGUsIFR5cGV+MSBjaGFyc3RyaW5ncywgZXRjLikuICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgaXMgYSBwb2ludGVyIHRvIHN1Y2ggZGF0YS4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY29udHJvbF9sZW4gICAgICAgOjogVGhpcyBpcyB0aGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBjb250cm9sICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgb3RoZXIgICAgICAgICAgICAgOjogUmVhbGx5IHdpY2tlZCBmb3JtYXRzIGNhbiB1c2UgdGhpcyBwb2ludGVyIHRvICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnQgdGhlaXIgb3duIGdseXBoIGltYWdlIHRvIGNsaWVudCAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbnMuICBOb3RlIHRoYXQgdGhlIGFwcGxpY2F0aW9uICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgbmVlZHMgdG8ga25vdyBhYm91dCB0aGUgaW1hZ2UgZm9ybWF0LiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsc2JfZGVsdGEgICAgICAgICA6OiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGhpbnRlZCBhbmQgdW5oaW50ZWQgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBzaWRlIGJlYXJpbmcgd2hpbGUgYXV0by1oaW50aW5nIGlzICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZS4gIFplcm8gb3RoZXJ3aXNlLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcnNiX2RlbHRhICAgICAgICAgOjogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBoaW50ZWQgYW5kIHVuaGludGVkICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IHNpZGUgYmVhcmluZyB3aGlsZSBhdXRvLWhpbnRpbmcgaXMgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUuICBaZXJvIG90aGVyd2lzZS4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJZiBARlRfTG9hZF9HbHlwaCBpcyBjYWxsZWQgd2l0aCBkZWZhdWx0IGZsYWdzIChzZWUgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQEZUX0xPQURfREVGQVVMVCkgdGhlIGdseXBoIGltYWdlIGlzIGxvYWRlZCBpbiB0aGUgZ2x5cGggc2xvdCBpbiAgICovCisgIC8qICAgIGl0cyBuYXRpdmUgZm9ybWF0IChlLmcuLCBhbiBvdXRsaW5lIGdseXBoIGZvciBUcnVlVHlwZSBhbmQgVHlwZX4xICAqLworICAvKiAgICBmb3JtYXRzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgaW1hZ2UgY2FuIGxhdGVyIGJlIGNvbnZlcnRlZCBpbnRvIGEgYml0bWFwIGJ5IGNhbGxpbmcgICAgICAgICAqLworICAvKiAgICBARlRfUmVuZGVyX0dseXBoLiAgVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgY3VycmVudCByZW5kZXJlciBmb3IgICAgKi8KKyAgLyogICAgdGhlIG5hdGl2ZSBpbWFnZSdzIGZvcm1hdCwgdGhlbiBpbnZva2VzIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgcmVuZGVyZXIgaXMgaW4gY2hhcmdlIG9mIHRyYW5zZm9ybWluZyB0aGUgbmF0aXZlIGltYWdlIHRocm91Z2ggKi8KKyAgLyogICAgdGhlIHNsb3QncyBmYWNlIHRyYW5zZm9ybWF0aW9uIGZpZWxkcywgdGhlbiBjb252ZXJ0aW5nIGl0IGludG8gYSAgICovCisgIC8qICAgIGJpdG1hcCB0aGF0IGlzIHJldHVybmVkIGluIGBzbG90LT5iaXRtYXAnLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTm90ZSB0aGF0IGBzbG90LT5iaXRtYXBfbGVmdCcgYW5kIGBzbG90LT5iaXRtYXBfdG9wJyBhcmUgYWxzbyB1c2VkICovCisgIC8qICAgIHRvIHNwZWNpZnkgdGhlIHBvc2l0aW9uIG9mIHRoZSBiaXRtYXAgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcGVuICAqLworICAvKiAgICBwb3NpdGlvbiAoZS5nLiwgY29vcmRpbmF0ZXMgKDAsMCkgb24gdGhlIGJhc2VsaW5lKS4gIE9mIGNvdXJzZSwgICAgKi8KKyAgLyogICAgYHNsb3QtPmZvcm1hdCcgaXMgYWxzbyBjaGFuZ2VkIHRvIEBGVF9HTFlQSF9GT1JNQVRfQklUTUFQLiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSGVyZSBpcyBhIHNtYWxsIHBzZXVkbyBjb2RlIGZyYWdtZW50IHRoYXQgc2hvd3MgaG93IHRvIHVzZSAgICAgICAgICovCisgIC8qICAgIGBsc2JfZGVsdGEnIGFuZCBgcnNiX2RlbHRhJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgRlRfUG9zICBvcmlnaW5feCAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIEZUX1BvcyAgcHJldl9yc2JfZGVsdGEgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIGZvciBhbGwgZ2x5cGhzIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIDxjb21wdXRlIGtlcm4gYmV0d2VlbiBjdXJyZW50IGFuZCBwcmV2aW91cyBnbHlwaCBhbmQgYWRkIGl0IHRvICovCisgIC8qICAgICAgICAgYG9yaWdpbl94Jz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIDxsb2FkIGdseXBoIHdpdGggYEZUX0xvYWRfR2x5cGgnPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgaWYgKCBwcmV2X3JzYl9kZWx0YSAtIGZhY2UtPmdseXBoLT5sc2JfZGVsdGEgPj0gMzIgKSAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgb3JpZ2luX3ggLT0gNjQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICBlbHNlIGlmICggcHJldl9yc2JfZGVsdGEgLSBmYWNlLT5nbHlwaC0+bHNiX2RlbHRhIDwgLTMyICkgICAgICAqLworICAvKiAgICAgICAgICBvcmlnaW5feCArPSA2NDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICBwcmV2X3JzYl9kZWx0YSA9IGZhY2UtPmdseXBoLT5yc2JfZGVsdGE7ICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIDxzYXZlIGdseXBoIGltYWdlLCBvciByZW5kZXIgZ2x5cGgsIG9yIC4uLj4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgb3JpZ2luX3ggKz0gZmFjZS0+Z2x5cGgtPmFkdmFuY2UueDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBlbmRmb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0dseXBoU2xvdFJlY18KKyAgeworICAgIEZUX0xpYnJhcnkgICAgICAgIGxpYnJhcnk7CisgICAgRlRfRmFjZSAgICAgICAgICAgZmFjZTsKKyAgICBGVF9HbHlwaFNsb3QgICAgICBuZXh0OworICAgIEZUX1VJbnQgICAgICAgICAgIHJlc2VydmVkOyAgICAgICAvKiByZXRhaW5lZCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkgKi8KKyAgICBGVF9HZW5lcmljICAgICAgICBnZW5lcmljOworCisgICAgRlRfR2x5cGhfTWV0cmljcyAgbWV0cmljczsKKyAgICBGVF9GaXhlZCAgICAgICAgICBsaW5lYXJIb3JpQWR2YW5jZTsKKyAgICBGVF9GaXhlZCAgICAgICAgICBsaW5lYXJWZXJ0QWR2YW5jZTsKKyAgICBGVF9WZWN0b3IgICAgICAgICBhZHZhbmNlOworCisgICAgRlRfR2x5cGhfRm9ybWF0ICAgZm9ybWF0OworCisgICAgRlRfQml0bWFwICAgICAgICAgYml0bWFwOworICAgIEZUX0ludCAgICAgICAgICAgIGJpdG1hcF9sZWZ0OworICAgIEZUX0ludCAgICAgICAgICAgIGJpdG1hcF90b3A7CisKKyAgICBGVF9PdXRsaW5lICAgICAgICBvdXRsaW5lOworCisgICAgRlRfVUludCAgICAgICAgICAgbnVtX3N1YmdseXBoczsKKyAgICBGVF9TdWJHbHlwaCAgICAgICBzdWJnbHlwaHM7CisKKyAgICB2b2lkKiAgICAgICAgICAgICBjb250cm9sX2RhdGE7CisgICAgbG9uZyAgICAgICAgICAgICAgY29udHJvbF9sZW47CisKKyAgICBGVF9Qb3MgICAgICAgICAgICBsc2JfZGVsdGE7CisgICAgRlRfUG9zICAgICAgICAgICAgcnNiX2RlbHRhOworCisgICAgdm9pZCogICAgICAgICAgICAgb3RoZXI7CisKKyAgICBGVF9TbG90X0ludGVybmFsICBpbnRlcm5hbDsKKworICB9IEZUX0dseXBoU2xvdFJlYzsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfSW5pdF9GcmVlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSW5pdGlhbGl6ZSBhIG5ldyBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdC4gIFRoZSBzZXQgb2YgbW9kdWxlcyAgICAgICovCisgIC8qICAgIHRoYXQgYXJlIHJlZ2lzdGVyZWQgYnkgdGhpcyBmdW5jdGlvbiBpcyBkZXRlcm1pbmVkIGF0IGJ1aWxkIHRpbWUuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIGEgbmV3IGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEluIGNhc2UgeW91IHdhbnQgdG8gcHJvdmlkZSB5b3VyIG93biBtZW1vcnkgYWxsb2NhdGluZyByb3V0aW5lcywgICAqLworICAvKiAgICB1c2UgQEZUX05ld19MaWJyYXJ5IGluc3RlYWQsIGZvbGxvd2VkIGJ5IGEgY2FsbCB0byAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQEZUX0FkZF9EZWZhdWx0X01vZHVsZXMgKG9yIGEgc2VyaWVzIG9mIGNhbGxzIHRvIEBGVF9BZGRfTW9kdWxlKS4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgQEZUX0xpYnJhcnkgYW5kIEBGVF9GYWNlIGZvciAgICAgICAgICAgICAgKi8KKyAgLyogICAgbXVsdGktdGhyZWFkaW5nIGlzc3Vlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJZiB5b3UgbmVlZCByZWZlcmVuY2UtY291bnRpbmcgKGNmLiBARlRfUmVmZXJlbmNlX0xpYnJhcnkpLCB1c2UgICAgKi8KKyAgLyogICAgQEZUX05ld19MaWJyYXJ5IGFuZCBARlRfRG9uZV9MaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfSW5pdF9GcmVlVHlwZSggRlRfTGlicmFyeSAgKmFsaWJyYXJ5ICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9Eb25lX0ZyZWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBEZXN0cm95IGEgZ2l2ZW4gRnJlZVR5cGUgbGlicmFyeSBvYmplY3QgYW5kIGFsbCBvZiBpdHMgY2hpbGRyZW4sICAgKi8KKyAgLyogICAgaW5jbHVkaW5nIHJlc291cmNlcywgZHJpdmVycywgZmFjZXMsIHNpemVzLCBldGMuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfRG9uZV9GcmVlVHlwZSggRlRfTGlicmFyeSAgbGlicmFyeSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT1BFTl9YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBsaXN0IG9mIGJpdCBmaWVsZCBjb25zdGFudHMgdXNlZCB3aXRoaW4gdGhlIGBmbGFncycgZmllbGQgb2YgdGhlICovCisgIC8qICAgIEBGVF9PcGVuX0FyZ3Mgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX09QRU5fTUVNT1JZICAgOjogVGhpcyBpcyBhIG1lbW9yeS1iYXNlZCBzdHJlYW0uICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT1BFTl9TVFJFQU0gICA6OiBDb3B5IHRoZSBzdHJlYW0gZnJvbSB0aGUgYHN0cmVhbScgZmllbGQuICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PUEVOX1BBVEhOQU1FIDo6IENyZWF0ZSBhIG5ldyBpbnB1dCBzdHJlYW0gZnJvbSBhIEN+cGF0aCAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PUEVOX0RSSVZFUiAgIDo6IFVzZSB0aGUgYGRyaXZlcicgZmllbGQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX09QRU5fUEFSQU1TICAgOjogVXNlIHRoZSBgbnVtX3BhcmFtcycgYW5kIGBwYXJhbXMnIGZpZWxkcy4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBgRlRfT1BFTl9NRU1PUlknLCBgRlRfT1BFTl9TVFJFQU0nLCBhbmQgYEZUX09QRU5fUEFUSE5BTUUnICAgICAqLworICAvKiAgICBmbGFncyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX09QRU5fTUVNT1JZICAgIDB4MQorI2RlZmluZSBGVF9PUEVOX1NUUkVBTSAgICAweDIKKyNkZWZpbmUgRlRfT1BFTl9QQVRITkFNRSAgMHg0CisjZGVmaW5lIEZUX09QRU5fRFJJVkVSICAgIDB4OAorI2RlZmluZSBGVF9PUEVOX1BBUkFNUyAgICAweDEwCisKKworICAvKiB0aGVzZSBjb25zdGFudHMgYXJlIGRlcHJlY2F0ZWQ7IHVzZSB0aGUgY29ycmVzcG9uZGluZyBgRlRfT1BFTl9YWFgnICovCisgIC8qIHZhbHVlcyBpbnN0ZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgZnRfb3Blbl9tZW1vcnkgICAgRlRfT1BFTl9NRU1PUlkKKyNkZWZpbmUgZnRfb3Blbl9zdHJlYW0gICAgRlRfT1BFTl9TVFJFQU0KKyNkZWZpbmUgZnRfb3Blbl9wYXRobmFtZSAgRlRfT1BFTl9QQVRITkFNRQorI2RlZmluZSBmdF9vcGVuX2RyaXZlciAgICBGVF9PUEVOX0RSSVZFUgorI2RlZmluZSBmdF9vcGVuX3BhcmFtcyAgICBGVF9PUEVOX1BBUkFNUworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUGFyYW1ldGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzaW1wbGUgc3RydWN0dXJlIHVzZWQgdG8gcGFzcyBtb3JlIG9yIGxlc3MgZ2VuZXJpYyBwYXJhbWV0ZXJzIHRvICovCisgIC8qICAgIEBGVF9PcGVuX0ZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHRhZyAgOjogQSBmb3VyLWJ5dGUgaWRlbnRpZmljYXRpb24gdGFnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZGF0YSA6OiBBIHBvaW50ZXIgdG8gdGhlIHBhcmFtZXRlciBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIElEIGFuZCBmdW5jdGlvbiBvZiBwYXJhbWV0ZXJzIGFyZSBkcml2ZXItc3BlY2lmaWMuICBTZWUgdGhlICAgICovCisgIC8qICAgIHZhcmlvdXMgRlRfUEFSQU1fVEFHX1hYWCBmbGFncyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1BhcmFtZXRlcl8KKyAgeworICAgIEZUX1VMb25nICAgIHRhZzsKKyAgICBGVF9Qb2ludGVyICBkYXRhOworCisgIH0gRlRfUGFyYW1ldGVyOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT3Blbl9BcmdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBpbmRpY2F0ZSBob3cgdG8gb3BlbiBhIG5ldyBmb250IGZpbGUgb3IgICAgICAgICovCisgIC8qICAgIHN0cmVhbS4gIEEgcG9pbnRlciB0byBzdWNoIGEgc3RydWN0dXJlIGNhbiBiZSB1c2VkIGFzIGEgcGFyYW1ldGVyICAqLworICAvKiAgICBmb3IgdGhlIGZ1bmN0aW9ucyBARlRfT3Blbl9GYWNlIGFuZCBARlRfQXR0YWNoX1N0cmVhbS4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmbGFncyAgICAgICA6OiBBIHNldCBvZiBiaXQgZmxhZ3MgaW5kaWNhdGluZyBob3cgdG8gdXNlIHRoZSAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtZW1vcnlfYmFzZSA6OiBUaGUgZmlyc3QgYnl0ZSBvZiB0aGUgZmlsZSBpbiBtZW1vcnkuICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1lbW9yeV9zaXplIDo6IFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBmaWxlIGluIG1lbW9yeS4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcGF0aG5hbWUgICAgOjogQSBwb2ludGVyIHRvIGFuIDgtYml0IGZpbGUgcGF0aG5hbWUuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gICAgICA6OiBBIGhhbmRsZSB0byBhIHNvdXJjZSBzdHJlYW0gb2JqZWN0LiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGRyaXZlciAgICAgIDo6IFRoaXMgZmllbGQgaXMgZXhjbHVzaXZlbHkgdXNlZCBieSBARlRfT3Blbl9GYWNlOyAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBpdCBzaW1wbHkgc3BlY2lmaWVzIHRoZSBmb250IGRyaXZlciB0byB1c2UgdG8gb3BlbiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgdGhlIGZhY2UuICBJZiBzZXQgdG9+MCwgRnJlZVR5cGUgdHJpZXMgdG8gbG9hZCB0aGUgICovCisgIC8qICAgICAgICAgICAgICAgICAgIGZhY2Ugd2l0aCBlYWNoIG9uZSBvZiB0aGUgZHJpdmVycyBpbiBpdHMgbGlzdC4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtX3BhcmFtcyAgOjogVGhlIG51bWJlciBvZiBleHRyYSBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwYXJhbXMgICAgICA6OiBFeHRyYSBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUgZm9udCBkcml2ZXIgd2hlbiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgb3BlbmluZyBhIG5ldyBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIHN0cmVhbSB0eXBlIGlzIGRldGVybWluZWQgYnkgdGhlIGNvbnRlbnRzIG9mIGBmbGFncycgdGhhdCAgICAgICovCisgIC8qICAgIGFyZSB0ZXN0ZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlciBieSBARlRfT3Blbl9GYWNlOiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSWYgdGhlIEBGVF9PUEVOX01FTU9SWSBiaXQgaXMgc2V0LCBhc3N1bWUgdGhhdCB0aGlzIGlzIGEgICAgICAgICAgICovCisgIC8qICAgIG1lbW9yeSBmaWxlIG9mIGBtZW1vcnlfc2l6ZScgYnl0ZXMsIGxvY2F0ZWQgYXQgYG1lbW9yeV9hZGRyZXNzJy4gICAqLworICAvKiAgICBUaGUgZGF0YSBhcmUgYXJlIG5vdCBjb3BpZWQsIGFuZCB0aGUgY2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciAgICAgKi8KKyAgLyogICAgcmVsZWFzaW5nIGFuZCBkZXN0cm95aW5nIHRoZW0gX2FmdGVyXyB0aGUgY29ycmVzcG9uZGluZyBjYWxsIHRvICAgICovCisgIC8qICAgIEBGVF9Eb25lX0ZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT3RoZXJ3aXNlLCBpZiB0aGUgQEZUX09QRU5fU1RSRUFNIGJpdCBpcyBzZXQsIGFzc3VtZSB0aGF0IGEgICAgICAgICovCisgIC8qICAgIGN1c3RvbSBpbnB1dCBzdHJlYW0gYHN0cmVhbScgaXMgdXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT3RoZXJ3aXNlLCBpZiB0aGUgQEZUX09QRU5fUEFUSE5BTUUgYml0IGlzIHNldCwgYXNzdW1lIHRoYXQgdGhpcyAgICovCisgIC8qICAgIGlzIGEgbm9ybWFsIGZpbGUgYW5kIHVzZSBgcGF0aG5hbWUnIHRvIG9wZW4gaXQuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSWYgdGhlIEBGVF9PUEVOX0RSSVZFUiBiaXQgaXMgc2V0LCBARlRfT3Blbl9GYWNlIG9ubHkgdHJpZXMgdG8gICAgICovCisgIC8qICAgIG9wZW4gdGhlIGZpbGUgd2l0aCB0aGUgZHJpdmVyIHdob3NlIGhhbmRsZXIgaXMgaW4gYGRyaXZlcicuICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSWYgdGhlIEBGVF9PUEVOX1BBUkFNUyBiaXQgaXMgc2V0LCB0aGUgcGFyYW1ldGVycyBnaXZlbiBieSAgICAgICAgICovCisgIC8qICAgIGBudW1fcGFyYW1zJyBhbmQgYHBhcmFtcycgaXMgdXNlZC4gIFRoZXkgYXJlIGlnbm9yZWQgb3RoZXJ3aXNlLiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSWRlYWxseSwgYm90aCB0aGUgYHBhdGhuYW1lJyBhbmQgYHBhcmFtcycgZmllbGRzIHNob3VsZCBiZSB0YWdnZWQgICovCisgIC8qICAgIGFzIGBjb25zdCc7IHRoaXMgaXMgbWlzc2luZyBmb3IgQVBJIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAgSW4gICAqLworICAvKiAgICBvdGhlciB3b3JkcywgYXBwbGljYXRpb25zIHNob3VsZCB0cmVhdCB0aGVtIGFzIHJlYWQtb25seS4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBGVF9PcGVuX0FyZ3NfCisgIHsKKyAgICBGVF9VSW50ICAgICAgICAgZmxhZ3M7CisgICAgY29uc3QgRlRfQnl0ZSogIG1lbW9yeV9iYXNlOworICAgIEZUX0xvbmcgICAgICAgICBtZW1vcnlfc2l6ZTsKKyAgICBGVF9TdHJpbmcqICAgICAgcGF0aG5hbWU7CisgICAgRlRfU3RyZWFtICAgICAgIHN0cmVhbTsKKyAgICBGVF9Nb2R1bGUgICAgICAgZHJpdmVyOworICAgIEZUX0ludCAgICAgICAgICBudW1fcGFyYW1zOworICAgIEZUX1BhcmFtZXRlciogICBwYXJhbXM7CisKKyAgfSBGVF9PcGVuX0FyZ3M7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9OZXdfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIGNhbGxzIEBGVF9PcGVuX0ZhY2UgdG8gb3BlbiBhIGZvbnQgYnkgaXRzIHBhdGhuYW1lLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaWJyYXJ5ICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwYXRobmFtZSAgIDo6IEEgcGF0aCB0byB0aGUgZm9udCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2VfaW5kZXggOjogU2VlIEBGVF9PcGVuX0ZhY2UgZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhpcyAqLworICAvKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhZmFjZSAgICAgIDo6IEEgaGFuZGxlIHRvIGEgbmV3IGZhY2Ugb2JqZWN0LiAgSWYgYGZhY2VfaW5kZXgnIGlzICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gemVybywgaXQgbXVzdCBiZSBub24tTlVMTC4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVXNlIEBGVF9Eb25lX0ZhY2UgdG8gZGVzdHJveSB0aGUgY3JlYXRlZCBARlRfRmFjZSBvYmplY3QgKGFsb25nICAgICovCisgIC8qICAgIHdpdGggaXRzIHNsb3QgYW5kIHNpemVzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX05ld19GYWNlKCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBmaWxlcGF0aG5hbWUsCisgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgZmFjZV9pbmRleCwKKyAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICphZmFjZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTmV3X01lbW9yeV9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBjYWxscyBARlRfT3Blbl9GYWNlIHRvIG9wZW4gYSBmb250IHRoYXQgaGFzIGJlZW4gICAgICovCisgIC8qICAgIGxvYWRlZCBpbnRvIG1lbW9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpYnJhcnkgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZpbGVfYmFzZSAgOjogQSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZvbnQgZGF0YS4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmlsZV9zaXplICA6OiBUaGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGNodW5rIHVzZWQgYnkgdGhlIGZvbnQgZGF0YS4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlX2luZGV4IDo6IFNlZSBARlRfT3Blbl9GYWNlIGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoaXMgKi8KKyAgLyogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYWZhY2UgICAgICA6OiBBIGhhbmRsZSB0byBhIG5ldyBmYWNlIG9iamVjdC4gIElmIGBmYWNlX2luZGV4JyBpcyAgICovCisgIC8qICAgICAgICAgICAgICAgICAgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHplcm8sIGl0IG11c3QgYmUgbm9uLU5VTEwuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFlvdSBtdXN0IG5vdCBkZWFsbG9jYXRlIHRoZSBtZW1vcnkgYmVmb3JlIGNhbGxpbmcgQEZUX0RvbmVfRmFjZS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX05ld19NZW1vcnlfRmFjZSggRlRfTGlicmFyeSAgICAgIGxpYnJhcnksCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfQnl0ZSogIGZpbGVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgICAgZmlsZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgICBmYWNlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgICphZmFjZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT3Blbl9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ3JlYXRlIGEgZmFjZSBvYmplY3QgZnJvbSBhIGdpdmVuIHJlc291cmNlIGRlc2NyaWJlZCBieSAgICAgICAgICAgICovCisgIC8qICAgIEBGVF9PcGVuX0FyZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpYnJhcnkgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFyZ3MgICAgICAgOjogQSBwb2ludGVyIHRvIGFuIGBGVF9PcGVuX0FyZ3MnIHN0cnVjdHVyZSB0aGF0IG11c3QgICAqLworICAvKiAgICAgICAgICAgICAgICAgIGJlIGZpbGxlZCBieSB0aGUgY2FsbGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2VfaW5kZXggOjogVGhpcyBmaWVsZCBob2xkcyB0d28gZGlmZmVyZW50IHZhbHVlcy4gIEJpdHMgMC0xNSAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIGFyZSB0aGUgaW5kZXggb2YgdGhlIGZhY2UgaW4gdGhlIGZvbnQgZmlsZSAoc3RhcnRpbmcgKi8KKyAgLyogICAgICAgICAgICAgICAgICB3aXRoIHZhbHVlfjApLiAgU2V0IGl0IHRvfjAgaWYgdGhlcmUgaXMgb25seSBvbmUgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgZmFjZSBpbiB0aGUgZm9udCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBCaXRzIDE2LTMwIGFyZSByZWxldmFudCB0byBHWCB2YXJpYXRpb24gZm9udHMgb25seSwgICovCisgIC8qICAgICAgICAgICAgICAgICAgc3BlY2lmeWluZyB0aGUgbmFtZWQgaW5zdGFuY2UgaW5kZXggZm9yIHRoZSBjdXJyZW50ICAqLworICAvKiAgICAgICAgICAgICAgICAgIGZhY2UgaW5kZXggKHN0YXJ0aW5nIHdpdGggdmFsdWV+MTsgdmFsdWV+MCBtYWtlcyAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBGcmVlVHlwZSBpZ25vcmUgbmFtZWQgaW5zdGFuY2VzKS4gIEZvciBub24tR1ggZm9udHMsICovCisgIC8qICAgICAgICAgICAgICAgICAgYml0cyAxNi0zMCBhcmUgaWdub3JlZC4gIEFzc3VtaW5nIHRoYXQgeW91IHdhbnQgdG8gICAqLworICAvKiAgICAgICAgICAgICAgICAgIGFjY2VzcyB0aGUgdGhpcmQgbmFtZWQgaW5zdGFuY2UgaW4gZmFjZX40LCAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBgZmFjZV9pbmRleCcgc2hvdWxkIGJlIHNldCB0byAweDAwMDMwMDA0LiAgSWYgeW91ICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgd2FudCB0byBhY2Nlc3MgZmFjZX40IHdpdGhvdXQgR1ggdmFyaWF0aW9uIGhhbmRsaW5nLCAqLworICAvKiAgICAgICAgICAgICAgICAgIHNpbXBseSBzZXQgYGZhY2VfaW5kZXgnIHRvIHZhbHVlfjQuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgRlRfT3Blbl9GYWNlIGFuZCBpdHMgc2libGluZ3MgY2FuIGJlIHVzZWQgdG8gcXVpY2tseSAqLworICAvKiAgICAgICAgICAgICAgICAgIGNoZWNrIHdoZXRoZXIgdGhlIGZvbnQgZm9ybWF0IG9mIGEgZ2l2ZW4gZm9udCAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICByZXNvdXJjZSBpcyBzdXBwb3J0ZWQgYnkgRnJlZVR5cGUuICBJbiBnZW5lcmFsLCBpZiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgdGhlIGBmYWNlX2luZGV4JyBhcmd1bWVudCBpcyBuZWdhdGl2ZSwgdGhlICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlIGlzfjAgaWYgdGhlIGZvbnQgZm9ybWF0IGlzICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICByZWNvZ25pemVkLCBvciBub24temVybyBvdGhlcndpc2UuICBUaGUgZnVuY3Rpb24gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgYWxsb2NhdGVzIGEgbW9yZSBvciBsZXNzIGVtcHR5IGZhY2UgaGFuZGxlIGluICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIGAqYWZhY2UnIChpZiBgYWZhY2UnIGlzbid0IE5VTEwpOyB0aGUgb25seSB0d28gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICB1c2VmdWwgZmllbGRzIGluIHRoaXMgc3BlY2lhbCBjYXNlIGFyZSAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgYGZhY2UtPm51bV9mYWNlcycgYW5kIGBmYWNlLT5zdHlsZV9mbGFncycuICBGb3IgYW55ICAqLworICAvKiAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlIHZhbHVlIG9mIGBmYWNlX2luZGV4JywgYGZhY2UtPm51bV9mYWNlcycgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBnaXZlcyB0aGUgbnVtYmVyIG9mIGZhY2VzIHdpdGhpbiB0aGUgZm9udCBmaWxlLiAgRm9yICovCisgIC8qICAgICAgICAgICAgICAgICAgdGhlIG5lZ2F0aXZlIHZhbHVlIGAtKE4rMSknICh3aXRoIGBOJyBhIDE2LWJpdCAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIHZhbHVlKSwgYml0cyAxNi0zMCBpbiBgZmFjZS0+c3R5bGVfZmxhZ3MnIGdpdmUgdGhlICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBudW1iZXIgb2YgbmFtZWQgaW5zdGFuY2VzIGluIGZhY2UgYE4nIGlmIHdlIGhhdmUgYSAgICovCisgIC8qICAgICAgICAgICAgICAgICAgR1ggdmFyaWF0aW9uIGZvbnQgKG9yIHplcm8gb3RoZXJ3aXNlKS4gIEFmdGVyICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIGV4YW1pbmF0aW9uLCB0aGUgcmV0dXJuZWQgQEZUX0ZhY2Ugc3RydWN0dXJlIHNob3VsZCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBiZSBkZWFsbG9jYXRlZCB3aXRoIGEgY2FsbCB0byBARlRfRG9uZV9GYWNlLiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYWZhY2UgICAgICA6OiBBIGhhbmRsZSB0byBhIG5ldyBmYWNlIG9iamVjdC4gIElmIGBmYWNlX2luZGV4JyBpcyAgICovCisgIC8qICAgICAgICAgICAgICAgICAgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHplcm8sIGl0IG11c3QgYmUgbm9uLU5VTEwuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFVubGlrZSBGcmVlVHlwZSAxLngsIHRoaXMgZnVuY3Rpb24gYXV0b21hdGljYWxseSBjcmVhdGVzIGEgZ2x5cGggICAqLworICAvKiAgICBzbG90IGZvciB0aGUgZmFjZSBvYmplY3QgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgdGhyb3VnaCAgICAgKi8KKyAgLyogICAgYGZhY2UtPmdseXBoJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFYWNoIG5ldyBmYWNlIG9iamVjdCBjcmVhdGVkIHdpdGggdGhpcyBmdW5jdGlvbiBhbHNvIG93bnMgYSAgICAgICAgKi8KKyAgLyogICAgZGVmYXVsdCBARlRfU2l6ZSBvYmplY3QsIGFjY2Vzc2libGUgYXMgYGZhY2UtPnNpemUnLiAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPbmUgQEZUX0xpYnJhcnkgaW5zdGFuY2UgY2FuIGhhdmUgbXVsdGlwbGUgZmFjZSBvYmplY3RzLCB0aGlzIGlzLCAgKi8KKyAgLyogICAgQEZUX09wZW5fRmFjZSBhbmQgaXRzIHNpYmxpbmdzIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgdXNpbmcgICovCisgIC8qICAgIHRoZSBzYW1lIGBsaWJyYXJ5JyBhcmd1bWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2VlIHRoZSBkaXNjdXNzaW9uIG9mIHJlZmVyZW5jZSBjb3VudGVycyBpbiB0aGUgZGVzY3JpcHRpb24gb2YgICAgICovCisgIC8qICAgIEBGVF9SZWZlcmVuY2VfRmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVG8gbG9vcCBvdmVyIGFsbCBmYWNlcywgdXNlIGNvZGUgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nIHNuaXBwZXQgICovCisgIC8qICAgIChvbWl0dGluZyB0aGUgZXJyb3IgaGFuZGxpbmcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIEZUX0ZhY2UgIGZhY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBGVF9Mb25nICBpLCBudW1fZmFjZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBlcnJvciA9IEZUX09wZW5fRmFjZSggbGlicmFyeSwgYXJncywgLTEsICZmYWNlICk7ICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgaWYgKCBlcnJvciApIHsgLi4uIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBudW1fZmFjZXMgPSBmYWNlLT5udW1fZmFjZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgRlRfRG9uZV9GYWNlKCBmYWNlICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9mYWNlczsgaSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIGVycm9yID0gRlRfT3Blbl9GYWNlKCBsaWJyYXJ5LCBhcmdzLCBpLCAmZmFjZSApOyAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgRlRfRG9uZV9GYWNlKCBmYWNlICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRvIGxvb3Agb3ZlciBhbGwgdmFsaWQgdmFsdWVzIGZvciBgZmFjZV9pbmRleCcsIHVzZSBzb21ldGhpbmcgICAgICAqLworICAvKiAgICBzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmcgc25pcHBldCwgYWdhaW4gd2l0aG91dCBlcnJvciBoYW5kbGluZy4gICAgKi8KKyAgLyogICAgVGhlIGNvZGUgYWNjZXNzZXMgYWxsIGZhY2VzIGltbWVkaWF0ZWx5ICh0aHVzIG9ubHkgYSBzaW5nbGUgY2FsbCAgICovCisgIC8qICAgIG9mIGBGVF9PcGVuX0ZhY2UnIHdpdGhpbiB0aGUgZG8tbG9vcCksIHdpdGggYW5kIHdpdGhvdXQgbmFtZWQgICAgICAqLworICAvKiAgICBpbnN0YW5jZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBGVF9GYWNlICBmYWNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIEZUX0xvbmcgIG51bV9mYWNlcyAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBGVF9Mb25nICBudW1faW5zdGFuY2VzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIEZUX0xvbmcgIGZhY2VfaWR4ICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBGVF9Mb25nICBpbnN0YW5jZV9pZHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgRlRfTG9uZyAgaWQgPSAoIGluc3RhbmNlX2lkeCA8PCAxNiApICsgZmFjZV9pZHg7ICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgZXJyb3IgPSBGVF9PcGVuX0ZhY2UoIGxpYnJhcnksIGFyZ3MsIGlkLCAmZmFjZSApOyAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIGlmICggZXJyb3IgKSB7IC4uLiB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgbnVtX2ZhY2VzICAgICA9IGZhY2UtPm51bV9mYWNlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIG51bV9pbnN0YW5jZXMgPSBmYWNlLT5zdHlsZV9mbGFncyA+PiAxNjsgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICBGVF9Eb25lX0ZhY2UoIGZhY2UgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIGlmICggaW5zdGFuY2VfaWR4IDwgbnVtX2luc3RhbmNlcyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgIGluc3RhbmNlX2lkeCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgIGZhY2VfaWR4Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICBpbnN0YW5jZV9pZHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIH0gd2hpbGUgKCBmYWNlX2lkeCA8IG51bV9mYWNlcyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfT3Blbl9GYWNlKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LAorICAgICAgICAgICAgICAgIGNvbnN0IEZUX09wZW5fQXJncyogIGFyZ3MsCisgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgICAgICAgZmFjZV9pbmRleCwKKyAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICAgICAgICphZmFjZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfQXR0YWNoX0ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBjYWxscyBARlRfQXR0YWNoX1N0cmVhbSB0byBhdHRhY2ggYSBmaWxlLiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgICAgICAgIDo6IFRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmlsZXBhdGhuYW1lIDo6IFRoZSBwYXRobmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfQXR0YWNoX0ZpbGUoIEZUX0ZhY2UgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIGZpbGVwYXRobmFtZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfQXR0YWNoX1N0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYEF0dGFjaCcgZGF0YSB0byBhIGZhY2Ugb2JqZWN0LiAgTm9ybWFsbHksIHRoaXMgaXMgdXNlZCB0byByZWFkICAgICovCisgIC8qICAgIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBmYWNlIG9iamVjdC4gIEZvciBleGFtcGxlLCB5b3UgY2FuICAqLworICAvKiAgICBhdHRhY2ggYW4gQUZNIGZpbGUgdGhhdCBjb21lcyB3aXRoIGEgVHlwZX4xIGZvbnQgdG8gZ2V0IHRoZSAgICAgICAgKi8KKyAgLyogICAga2VybmluZyB2YWx1ZXMgYW5kIG90aGVyIG1ldHJpY3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgICAgICA6OiBUaGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcGFyYW1ldGVycyA6OiBBIHBvaW50ZXIgdG8gQEZUX09wZW5fQXJncyB0aGF0IG11c3QgYmUgZmlsbGVkIGJ5ICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgdGhlIGNhbGxlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBtZWFuaW5nIG9mIHRoZSBgYXR0YWNoJyAoaS5lLiwgd2hhdCByZWFsbHkgaGFwcGVucyB3aGVuIHRoZSAgICAqLworICAvKiAgICBuZXcgZmlsZSBpcyByZWFkKSBpcyBub3QgZml4ZWQgYnkgRnJlZVR5cGUgaXRzZWxmLiAgSXQgcmVhbGx5ICAgICAgKi8KKyAgLyogICAgZGVwZW5kcyBvbiB0aGUgZm9udCBmb3JtYXQgKGFuZCB0aHVzIHRoZSBmb250IGRyaXZlcikuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDbGllbnQgYXBwbGljYXRpb25zIGFyZSBleHBlY3RlZCB0byBrbm93IHdoYXQgdGhleSBhcmUgZG9pbmcgICAgICAgKi8KKyAgLyogICAgd2hlbiBpbnZva2luZyB0aGlzIGZ1bmN0aW9uLiAgTW9zdCBkcml2ZXJzIHNpbXBseSBkbyBub3QgaW1wbGVtZW50ICovCisgIC8qICAgIGZpbGUgYXR0YWNobWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX0F0dGFjaF9TdHJlYW0oIEZUX0ZhY2UgICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgIEZUX09wZW5fQXJncyogIHBhcmFtZXRlcnMgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1JlZmVyZW5jZV9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgY291bnRlciBnZXRzIGluaXRpYWxpemVkIHRvfjEgYXQgdGhlIHRpbWUgYW4gQEZUX0ZhY2Ugc3RydWN0dXJlICAqLworICAvKiAgICBpcyBjcmVhdGVkLiAgVGhpcyBmdW5jdGlvbiBpbmNyZW1lbnRzIHRoZSBjb3VudGVyLiAgQEZUX0RvbmVfRmFjZSAgKi8KKyAgLyogICAgdGhlbiBvbmx5IGRlc3Ryb3lzIGEgZmFjZSBpZiB0aGUgY291bnRlciBpc34xLCBvdGhlcndpc2UgaXQgc2ltcGx5ICovCisgIC8qICAgIGRlY3JlbWVudHMgdGhlIGNvdW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBoZWxwcyBpbiBtYW5hZ2luZyBsaWZlLWN5Y2xlcyBvZiBzdHJ1Y3R1cmVzIHRoYXQgICAgICovCisgIC8qICAgIHJlZmVyZW5jZSBARlRfRmFjZSBvYmplY3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gYSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFNpbmNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIDIuNC4yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX1JlZmVyZW5jZV9GYWNlKCBGVF9GYWNlICBmYWNlICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9Eb25lX0ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBEaXNjYXJkIGEgZ2l2ZW4gZmFjZSBvYmplY3QsIGFzIHdlbGwgYXMgYWxsIG9mIGl0cyBjaGlsZCBzbG90cyBhbmQgKi8KKyAgLyogICAgc2l6ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2VlIHRoZSBkaXNjdXNzaW9uIG9mIHJlZmVyZW5jZSBjb3VudGVycyBpbiB0aGUgZGVzY3JpcHRpb24gb2YgICAgICovCisgIC8qICAgIEBGVF9SZWZlcmVuY2VfRmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX0RvbmVfRmFjZSggRlRfRmFjZSAgZmFjZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU2VsZWN0X1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2VsZWN0IGEgYml0bWFwIHN0cmlrZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgICAgICAgIDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyaWtlX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgYml0bWFwIHN0cmlrZSBpbiB0aGUgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICBgYXZhaWxhYmxlX3NpemVzJyBmaWVsZCBvZiBARlRfRmFjZVJlYyBzdHJ1Y3R1cmUuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX1NlbGVjdF9TaXplKCBGVF9GYWNlICBmYWNlLAorICAgICAgICAgICAgICAgICAgRlRfSW50ICAgc3RyaWtlX2luZGV4ICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TaXplX1JlcXVlc3RfVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbiBlbnVtZXJhdGlvbiB0eXBlIHRoYXQgbGlzdHMgdGhlIHN1cHBvcnRlZCBzaXplIHJlcXVlc3QgdHlwZXMuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TSVpFX1JFUVVFU1RfVFlQRV9OT01JTkFMIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBUaGUgbm9taW5hbCBzaXplLiAgVGhlIGB1bml0c19wZXJfRU0nIGZpZWxkIG9mIEBGVF9GYWNlUmVjIGlzICAgICovCisgIC8qICAgICAgdXNlZCB0byBkZXRlcm1pbmUgYm90aCBzY2FsaW5nIHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU0laRV9SRVFVRVNUX1RZUEVfUkVBTF9ESU0gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgVGhlIHJlYWwgZGltZW5zaW9uLiAgVGhlIHN1bSBvZiB0aGUgdGhlIGBhc2NlbmRlcicgYW5kIChtaW51cyAgICAqLworICAvKiAgICAgIG9mKSB0aGUgYGRlc2NlbmRlcicgZmllbGRzIG9mIEBGVF9GYWNlUmVjIGFyZSB1c2VkIHRvIGRldGVybWluZSAgKi8KKyAgLyogICAgICBib3RoIHNjYWxpbmcgdmFsdWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TSVpFX1JFUVVFU1RfVFlQRV9CQk9YIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBUaGUgZm9udCBib3VuZGluZyBib3guICBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgYGJib3gnIGZpZWxkICovCisgIC8qICAgICAgb2YgQEZUX0ZhY2VSZWMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCAqLworICAvKiAgICAgIHNjYWxpbmcgdmFsdWUsIHJlc3BlY3RpdmVseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1NJWkVfUkVRVUVTVF9UWVBFX0NFTEwgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIFRoZSBgbWF4X2FkdmFuY2Vfd2lkdGgnIGZpZWxkIG9mIEBGVF9GYWNlUmVjIGlzIHVzZWQgdG8gICAgICAgICAgKi8KKyAgLyogICAgICBkZXRlcm1pbmUgdGhlIGhvcml6b250YWwgc2NhbGluZyB2YWx1ZTsgdGhlIHZlcnRpY2FsIHNjYWxpbmcgICAgICovCisgIC8qICAgICAgdmFsdWUgaXMgZGV0ZXJtaW5lZCB0aGUgc2FtZSB3YXkgYXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIEBGVF9TSVpFX1JFUVVFU1RfVFlQRV9SRUFMX0RJTSBkb2VzLiAgRmluYWxseSwgYm90aCBzY2FsaW5nICAgICAgKi8KKyAgLyogICAgICB2YWx1ZXMgYXJlIHNldCB0byB0aGUgc21hbGxlciBvbmUuICBUaGlzIHR5cGUgaXMgdXNlZnVsIGlmIHlvdSAgICovCisgIC8qICAgICAgd2FudCB0byBzcGVjaWZ5IHRoZSBmb250IHNpemUgZm9yLCBzYXksIGEgd2luZG93IG9mIGEgZ2l2ZW4gICAgICAqLworICAvKiAgICAgIGRpbWVuc2lvbiBhbmQgODB4MjQgY2VsbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1NJWkVfUkVRVUVTVF9UWVBFX1NDQUxFUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIFNwZWNpZnkgdGhlIHNjYWxpbmcgdmFsdWVzIGRpcmVjdGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgYWJvdmUgZGVzY3JpcHRpb25zIG9ubHkgYXBwbHkgdG8gc2NhbGFibGUgZm9ybWF0cy4gIEZvciBiaXRtYXAgKi8KKyAgLyogICAgZm9ybWF0cywgdGhlIGJlaGF2aW91ciBpcyB1cCB0byB0aGUgZHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTZWUgdGhlIG5vdGUgc2VjdGlvbiBvZiBARlRfU2l6ZV9NZXRyaWNzIGlmIHlvdSB3b25kZXIgaG93IHNpemUgICAgKi8KKyAgLyogICAgcmVxdWVzdGluZyByZWxhdGVzIHRvIHNjYWxpbmcgdmFsdWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIGVudW0gIEZUX1NpemVfUmVxdWVzdF9UeXBlXworICB7CisgICAgRlRfU0laRV9SRVFVRVNUX1RZUEVfTk9NSU5BTCwKKyAgICBGVF9TSVpFX1JFUVVFU1RfVFlQRV9SRUFMX0RJTSwKKyAgICBGVF9TSVpFX1JFUVVFU1RfVFlQRV9CQk9YLAorICAgIEZUX1NJWkVfUkVRVUVTVF9UWVBFX0NFTEwsCisgICAgRlRfU0laRV9SRVFVRVNUX1RZUEVfU0NBTEVTLAorCisgICAgRlRfU0laRV9SRVFVRVNUX1RZUEVfTUFYCisKKyAgfSBGVF9TaXplX1JlcXVlc3RfVHlwZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1NpemVfUmVxdWVzdFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBzaXplIHJlcXVlc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHR5cGUgICAgICAgICAgIDo6IFNlZSBARlRfU2l6ZV9SZXF1ZXN0X1R5cGUuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgd2lkdGggICAgICAgICAgOjogVGhlIGRlc2lyZWQgd2lkdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBoZWlnaHQgICAgICAgICA6OiBUaGUgZGVzaXJlZCBoZWlnaHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGhvcmlSZXNvbHV0aW9uIDo6IFRoZSBob3Jpem9udGFsIHJlc29sdXRpb24uICBJZiBzZXQgdG8gemVybywgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICBgd2lkdGgnIGlzIHRyZWF0ZWQgYXMgYSAyNi42IGZyYWN0aW9uYWwgcGl4ZWwgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB2ZXJ0UmVzb2x1dGlvbiA6OiBUaGUgdmVydGljYWwgcmVzb2x1dGlvbi4gIElmIHNldCB0byB6ZXJvLCAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgYGhlaWdodCcgaXMgdHJlYXRlZCBhcyBhIDI2LjYgZnJhY3Rpb25hbCBwaXhlbCAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIElmIGB3aWR0aCcgaXMgemVybywgdGhlbiB0aGUgaG9yaXpvbnRhbCBzY2FsaW5nIHZhbHVlIGlzIHNldCBlcXVhbCAqLworICAvKiAgICB0byB0aGUgdmVydGljYWwgc2NhbGluZyB2YWx1ZSwgYW5kIHZpY2UgdmVyc2EuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBGVF9TaXplX1JlcXVlc3RSZWNfCisgIHsKKyAgICBGVF9TaXplX1JlcXVlc3RfVHlwZSAgdHlwZTsKKyAgICBGVF9Mb25nICAgICAgICAgICAgICAgd2lkdGg7CisgICAgRlRfTG9uZyAgICAgICAgICAgICAgIGhlaWdodDsKKyAgICBGVF9VSW50ICAgICAgICAgICAgICAgaG9yaVJlc29sdXRpb247CisgICAgRlRfVUludCAgICAgICAgICAgICAgIHZlcnRSZXNvbHV0aW9uOworCisgIH0gRlRfU2l6ZV9SZXF1ZXN0UmVjOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU2l6ZV9SZXF1ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBoYW5kbGUgdG8gYSBzaXplIHJlcXVlc3Qgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCBGVF9TaXplX1JlcXVlc3RSZWNfICAqRlRfU2l6ZV9SZXF1ZXN0OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUmVxdWVzdF9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmVzaXplIHRoZSBzY2FsZSBvZiB0aGUgYWN0aXZlIEBGVF9TaXplIG9iamVjdCBpbiBhIGZhY2UuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcmVxICA6OiBBIHBvaW50ZXIgdG8gYSBARlRfU2l6ZV9SZXF1ZXN0UmVjLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQWx0aG91Z2ggZHJpdmVycyBtYXkgc2VsZWN0IHRoZSBiaXRtYXAgc3RyaWtlIG1hdGNoaW5nIHRoZSAgICAgICAgICovCisgIC8qICAgIHJlcXVlc3QsIHlvdSBzaG91bGQgbm90IHJlbHkgb24gdGhpcyBpZiB5b3UgaW50ZW5kIHRvIHNlbGVjdCBhICAgICAqLworICAvKiAgICBwYXJ0aWN1bGFyIGJpdG1hcCBzdHJpa2UuICBVc2UgQEZUX1NlbGVjdF9TaXplIGluc3RlYWQgaW4gdGhhdCAgICAgKi8KKyAgLyogICAgY2FzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgcmVsYXRpb24gYmV0d2VlbiB0aGUgcmVxdWVzdGVkIHNpemUgYW5kIHRoZSByZXN1bHRpbmcgZ2x5cGggICAgKi8KKyAgLyogICAgc2l6ZSBpcyBkZXBlbmRlbnQgZW50aXJlbHkgb24gaG93IHRoZSBzaXplIGlzIGRlZmluZWQgaW4gdGhlICAgICAgICovCisgIC8qICAgIHNvdXJjZSBmYWNlLiAgVGhlIGZvbnQgZGVzaWduZXIgY2hvb3NlcyB0aGUgZmluYWwgc2l6ZSBvZiBlYWNoICAgICAqLworICAvKiAgICBnbHlwaCByZWxhdGl2ZSB0byB0aGlzIHNpemUuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWZlciB0byAgICAgICAgKi8KKyAgLyogICAgYGh0dHA6Ly93d3cuZnJlZXR5cGUub3JnL2ZyZWV0eXBlMi9kb2NzL2dseXBocy9nbHlwaHMtMi5odG1sJyAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBEb24ndCB1c2UgdGhpcyBmdW5jdGlvbiBpZiB5b3UgYXJlIHVzaW5nIHRoZSBGcmVlVHlwZSBjYWNoZSBBUEkuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9SZXF1ZXN0X1NpemUoIEZUX0ZhY2UgICAgICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICBGVF9TaXplX1JlcXVlc3QgIHJlcSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU2V0X0NoYXJfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBjYWxscyBARlRfUmVxdWVzdF9TaXplIHRvIHJlcXVlc3QgdGhlIG5vbWluYWwgc2l6ZSAgICovCisgIC8qICAgIChpbiBwb2ludHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICAgICAgICA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNoYXJfd2lkdGggICAgICA6OiBUaGUgbm9taW5hbCB3aWR0aCwgaW4gMjYuNiBmcmFjdGlvbmFsIHBvaW50cy4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2hhcl9oZWlnaHQgICAgIDo6IFRoZSBub21pbmFsIGhlaWdodCwgaW4gMjYuNiBmcmFjdGlvbmFsIHBvaW50cy4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBob3J6X3Jlc29sdXRpb24gOjogVGhlIGhvcml6b250YWwgcmVzb2x1dGlvbiBpbiBkcGkuICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHZlcnRfcmVzb2x1dGlvbiA6OiBUaGUgdmVydGljYWwgcmVzb2x1dGlvbiBpbiBkcGkuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIElmIGVpdGhlciB0aGUgY2hhcmFjdGVyIHdpZHRoIG9yIGhlaWdodCBpcyB6ZXJvLCBpdCBpcyBzZXQgZXF1YWwgICAqLworICAvKiAgICB0byB0aGUgb3RoZXIgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIElmIGVpdGhlciB0aGUgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCByZXNvbHV0aW9uIGlzIHplcm8sIGl0IGlzIHNldCAqLworICAvKiAgICBlcXVhbCB0byB0aGUgb3RoZXIgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgY2hhcmFjdGVyIHdpZHRoIG9yIGhlaWdodCBzbWFsbGVyIHRoYW4gMXB0IGlzIHNldCB0byAxcHQ7IGlmICAgICAqLworICAvKiAgICBib3RoIHJlc29sdXRpb24gdmFsdWVzIGFyZSB6ZXJvLCB0aGV5IGFyZSBzZXQgdG8gNzJkcGkuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERvbid0IHVzZSB0aGlzIGZ1bmN0aW9uIGlmIHlvdSBhcmUgdXNpbmcgdGhlIEZyZWVUeXBlIGNhY2hlIEFQSS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX1NldF9DaGFyX1NpemUoIEZUX0ZhY2UgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIGNoYXJfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIGNoYXJfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBob3J6X3Jlc29sdXRpb24sCisgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHZlcnRfcmVzb2x1dGlvbiApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU2V0X1BpeGVsX1NpemVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBjYWxscyBARlRfUmVxdWVzdF9TaXplIHRvIHJlcXVlc3QgdGhlIG5vbWluYWwgc2l6ZSAgICovCisgIC8qICAgIChpbiBwaXhlbHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBpeGVsX3dpZHRoICA6OiBUaGUgbm9taW5hbCB3aWR0aCwgaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcGl4ZWxfaGVpZ2h0IDo6IFRoZSBub21pbmFsIGhlaWdodCwgaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgWW91IHNob3VsZCBub3QgcmVseSBvbiB0aGUgcmVzdWx0aW5nIGdseXBocyBtYXRjaGluZywgb3IgYmVpbmcgICAgICovCisgIC8qICAgIGNvbnN0cmFpbmVkLCB0byB0aGlzIHBpeGVsIHNpemUuICBSZWZlciB0byBARlRfUmVxdWVzdF9TaXplIHRvICAgICAqLworICAvKiAgICB1bmRlcnN0YW5kIGhvdyByZXF1ZXN0ZWQgc2l6ZXMgcmVsYXRlIHRvIGFjdHVhbCBzaXplcy4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERvbid0IHVzZSB0aGlzIGZ1bmN0aW9uIGlmIHlvdSBhcmUgdXNpbmcgdGhlIEZyZWVUeXBlIGNhY2hlIEFQSS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX1NldF9QaXhlbF9TaXplcyggRlRfRmFjZSAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBwaXhlbF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBwaXhlbF9oZWlnaHQgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xvYWRfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBsb2FkIGEgc2luZ2xlIGdseXBoIGludG8gdGhlIGdseXBoIHNsb3Qgb2YgYSAgICAqLworICAvKiAgICBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0IHdoZXJlIHRoZSBnbHlwaCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgaXMgbG9hZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGhfaW5kZXggOjogVGhlIGluZGV4IG9mIHRoZSBnbHlwaCBpbiB0aGUgZm9udCBmaWxlLiAgRm9yICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIENJRC1rZXllZCBmb250cyAoZWl0aGVyIGluIFBTIG9yIGluIENGRiBmb3JtYXQpICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICB0aGlzIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgQ0lEIHZhbHVlLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxvYWRfZmxhZ3MgIDo6IEEgZmxhZyBpbmRpY2F0aW5nIHdoYXQgdG8gbG9hZCBmb3IgdGhpcyBnbHlwaC4gIFRoZSAqLworICAvKiAgICAgICAgICAgICAgICAgICBARlRfTE9BRF9YWFggY29uc3RhbnRzIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgZ2x5cGggbG9hZGluZyBwcm9jZXNzIChlLmcuLCB3aGV0aGVyIHRoZSBvdXRsaW5lICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBzY2FsZWQsIHdoZXRoZXIgdG8gbG9hZCBiaXRtYXBzIG9yIG5vdCwgICAqLworICAvKiAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRvIGhpbnQgdGhlIG91dGxpbmUsIGV0YykuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgbG9hZGVkIGdseXBoIG1heSBiZSB0cmFuc2Zvcm1lZC4gIFNlZSBARlRfU2V0X1RyYW5zZm9ybSBmb3IgICAgKi8KKyAgLyogICAgdGhlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGb3Igc3Vic2V0dGVkIENJRC1rZXllZCBmb250cywgYEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50JyBpcyAgICAgICAgKi8KKyAgLyogICAgcmV0dXJuZWQgZm9yIGludmFsaWQgQ0lEIHZhbHVlcyAodGhpcyBpcywgZm9yIENJRCB2YWx1ZXMgdGhhdCAgICAgICovCisgIC8qICAgIGRvbid0IGhhdmUgYSBjb3JyZXNwb25kaW5nIGdseXBoIGluIHRoZSBmb250KS4gIFNlZSB0aGUgZGlzY3Vzc2lvbiAqLworICAvKiAgICBvZiB0aGUgQEZUX0ZBQ0VfRkxBR19DSURfS0VZRUQgZmxhZyBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9Mb2FkX0dseXBoKCBGVF9GYWNlICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgRlRfVUludCAgIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgbG9hZF9mbGFncyApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTG9hZF9DaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBmdW5jdGlvbiB1c2VkIHRvIGxvYWQgYSBzaW5nbGUgZ2x5cGggaW50byB0aGUgZ2x5cGggc2xvdCBvZiBhICAgICovCisgIC8qICAgIGZhY2Ugb2JqZWN0LCBhY2NvcmRpbmcgdG8gaXRzIGNoYXJhY3RlciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICAgIDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IGZhY2Ugb2JqZWN0IHdoZXJlIHRoZSBnbHlwaCAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBpcyBsb2FkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjaGFyX2NvZGUgICA6OiBUaGUgZ2x5cGgncyBjaGFyYWN0ZXIgY29kZSwgYWNjb3JkaW5nIHRvIHRoZSAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgY3VycmVudCBjaGFybWFwIHVzZWQgaW4gdGhlIGZhY2UuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsb2FkX2ZsYWdzICA6OiBBIGZsYWcgaW5kaWNhdGluZyB3aGF0IHRvIGxvYWQgZm9yIHRoaXMgZ2x5cGguICBUaGUgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgQEZUX0xPQURfWFhYIGNvbnN0YW50cyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIGdseXBoIGxvYWRpbmcgcHJvY2VzcyAoZS5nLiwgd2hldGhlciB0aGUgb3V0bGluZSAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgc2NhbGVkLCB3aGV0aGVyIHRvIGxvYWQgYml0bWFwcyBvciBub3QsICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgd2hldGhlciB0byBoaW50IHRoZSBvdXRsaW5lLCBldGMpLiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBzaW1wbHkgY2FsbHMgQEZUX0dldF9DaGFyX0luZGV4IGFuZCBARlRfTG9hZF9HbHlwaC4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfTG9hZF9DaGFyKCBGVF9GYWNlICAgZmFjZSwKKyAgICAgICAgICAgICAgICBGVF9VTG9uZyAgY2hhcl9jb2RlLAorICAgICAgICAgICAgICAgIEZUX0ludDMyICBsb2FkX2ZsYWdzICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZW51bToKKyAgICogICBGVF9MT0FEX1hYWAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBsaXN0IG9mIGJpdCBmaWVsZCBjb25zdGFudHMgdXNlZCB3aXRoIEBGVF9Mb2FkX0dseXBoIHRvIGluZGljYXRlCisgICAqICAgd2hhdCBraW5kIG9mIG9wZXJhdGlvbnMgdG8gcGVyZm9ybSBkdXJpbmcgZ2x5cGggbG9hZGluZy4KKyAgICoKKyAgICogQHZhbHVlczoKKyAgICogICBGVF9MT0FEX0RFRkFVTFQgOjoKKyAgICogICAgIENvcnJlc3BvbmRpbmcgdG9+MCwgdGhpcyB2YWx1ZSBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0IGdseXBoIGxvYWQKKyAgICogICAgIG9wZXJhdGlvbi4gIEluIHRoaXMgY2FzZSwgdGhlIGZvbGxvd2luZyBoYXBwZW5zOgorICAgKgorICAgKiAgICAgMS4gRnJlZVR5cGUgbG9va3MgZm9yIGEgYml0bWFwIGZvciB0aGUgZ2x5cGggY29ycmVzcG9uZGluZyB0byB0aGUKKyAgICogICAgICAgIGZhY2UncyBjdXJyZW50IHNpemUuICBJZiBvbmUgaXMgZm91bmQsIHRoZSBmdW5jdGlvbiByZXR1cm5zLgorICAgKiAgICAgICAgVGhlIGJpdG1hcCBkYXRhIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBnbHlwaCBzbG90IChzZWUgbm90ZQorICAgKiAgICAgICAgYmVsb3cpLgorICAgKgorICAgKiAgICAgMi4gSWYgbm8gZW1iZWRkZWQgYml0bWFwIGlzIHNlYXJjaGVkIG9yIGZvdW5kLCBGcmVlVHlwZSBsb29rcyBmb3IgYQorICAgKiAgICAgICAgc2NhbGFibGUgb3V0bGluZS4gIElmIG9uZSBpcyBmb3VuZCwgaXQgaXMgbG9hZGVkIGZyb20gdGhlIGZvbnQKKyAgICogICAgICAgIGZpbGUsIHNjYWxlZCB0byBkZXZpY2UgcGl4ZWxzLCB0aGVuIGBoaW50ZWQnIHRvIHRoZSBwaXhlbCBncmlkCisgICAqICAgICAgICBpbiBvcmRlciB0byBvcHRpbWl6ZSBpdC4gIFRoZSBvdXRsaW5lIGRhdGEgY2FuIGJlIGFjY2Vzc2VkIGZyb20KKyAgICogICAgICAgIHRoZSBnbHlwaCBzbG90IChzZWUgbm90ZSBiZWxvdykuCisgICAqCisgICAqICAgICBOb3RlIHRoYXQgYnkgZGVmYXVsdCwgdGhlIGdseXBoIGxvYWRlciBkb2Vzbid0IHJlbmRlciBvdXRsaW5lcyBpbnRvCisgICAqICAgICBiaXRtYXBzLiAgVGhlIGZvbGxvd2luZyBmbGFncyBhcmUgdXNlZCB0byBtb2RpZnkgdGhpcyBkZWZhdWx0CisgICAqICAgICBiZWhhdmlvdXIgdG8gbW9yZSBzcGVjaWZpYyBhbmQgdXNlZnVsIGNhc2VzLgorICAgKgorICAgKiAgIEZUX0xPQURfTk9fU0NBTEUgOjoKKyAgICogICAgIERvbid0IHNjYWxlIHRoZSBsb2FkZWQgb3V0bGluZSBnbHlwaCBidXQga2VlcCBpdCBpbiBmb250IHVuaXRzLgorICAgKgorICAgKiAgICAgVGhpcyBmbGFnIGltcGxpZXMgQEZUX0xPQURfTk9fSElOVElORyBhbmQgQEZUX0xPQURfTk9fQklUTUFQLCBhbmQKKyAgICogICAgIHVuc2V0cyBARlRfTE9BRF9SRU5ERVIuCisgICAqCisgICAqICAgICBJZiB0aGUgZm9udCBpcyBgdHJpY2t5JyAoc2VlIEBGVF9GQUNFX0ZMQUdfVFJJQ0tZIGZvciBtb3JlKSwgdXNpbmcKKyAgICogICAgIEZUX0xPQURfTk9fU0NBTEUgdXN1YWxseSB5aWVsZHMgbWVhbmluZ2xlc3Mgb3V0bGluZXMgYmVjYXVzZSB0aGUKKyAgICogICAgIHN1YmdseXBocyBtdXN0IGJlIHNjYWxlZCBhbmQgcG9zaXRpb25lZCB3aXRoIGhpbnRpbmcgaW5zdHJ1Y3Rpb25zLgorICAgKiAgICAgVGhpcyBjYW4gYmUgc29sdmVkIGJ5IGxvYWRpbmcgdGhlIGZvbnQgd2l0aG91dCBGVF9MT0FEX05PX1NDQUxFIGFuZAorICAgKiAgICAgc2V0dGluZyB0aGUgY2hhcmFjdGVyIHNpemUgdG8gYGZvbnQtPnVuaXRzX3Blcl9FTScuCisgICAqCisgICAqICAgRlRfTE9BRF9OT19ISU5USU5HIDo6CisgICAqICAgICBEaXNhYmxlIGhpbnRpbmcuICBUaGlzIGdlbmVyYWxseSBnZW5lcmF0ZXMgYGJsdXJyaWVyJyBiaXRtYXAgZ2x5cGhzCisgICAqICAgICB3aGVuIHRoZSBnbHlwaCBhcmUgcmVuZGVyZWQgaW4gYW55IG9mIHRoZSBhbnRpLWFsaWFzZWQgbW9kZXMuICBTZWUKKyAgICogICAgIGFsc28gdGhlIG5vdGUgYmVsb3cuCisgICAqCisgICAqICAgICBUaGlzIGZsYWcgaXMgaW1wbGllZCBieSBARlRfTE9BRF9OT19TQ0FMRS4KKyAgICoKKyAgICogICBGVF9MT0FEX1JFTkRFUiA6OgorICAgKiAgICAgQ2FsbCBARlRfUmVuZGVyX0dseXBoIGFmdGVyIHRoZSBnbHlwaCBpcyBsb2FkZWQuICBCeSBkZWZhdWx0LCB0aGUKKyAgICogICAgIGdseXBoIGlzIHJlbmRlcmVkIGluIEBGVF9SRU5ERVJfTU9ERV9OT1JNQUwgbW9kZS4gIFRoaXMgY2FuIGJlCisgICAqICAgICBvdmVycmlkZGVuIGJ5IEBGVF9MT0FEX1RBUkdFVF9YWFggb3IgQEZUX0xPQURfTU9OT0NIUk9NRS4KKyAgICoKKyAgICogICAgIFRoaXMgZmxhZyBpcyB1bnNldCBieSBARlRfTE9BRF9OT19TQ0FMRS4KKyAgICoKKyAgICogICBGVF9MT0FEX05PX0JJVE1BUCA6OgorICAgKiAgICAgSWdub3JlIGJpdG1hcCBzdHJpa2VzIHdoZW4gbG9hZGluZy4gIEJpdG1hcC1vbmx5IGZvbnRzIGlnbm9yZSB0aGlzCisgICAqICAgICBmbGFnLgorICAgKgorICAgKiAgICAgQEZUX0xPQURfTk9fU0NBTEUgYWx3YXlzIHNldHMgdGhpcyBmbGFnLgorICAgKgorICAgKiAgIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUIDo6CisgICAqICAgICBMb2FkIHRoZSBnbHlwaCBmb3IgdmVydGljYWwgdGV4dCBsYXlvdXQuICBJbiBwYXJ0aWN1bGFyLCB0aGUKKyAgICogICAgIGBhZHZhbmNlJyB2YWx1ZSBpbiB0aGUgQEZUX0dseXBoU2xvdFJlYyBzdHJ1Y3R1cmUgaXMgc2V0IHRvIHRoZQorICAgKiAgICAgYHZlcnRBZHZhbmNlJyB2YWx1ZSBvZiB0aGUgYG1ldHJpY3MnIGZpZWxkLgorICAgKgorICAgKiAgICAgSW4gY2FzZSBARlRfSEFTX1ZFUlRJQ0FMIGRvZXNuJ3QgcmV0dXJuIHRydWUsIHlvdSBzaG91bGRuJ3QgdXNlCisgICAqICAgICB0aGlzIGZsYWcgY3VycmVudGx5LiAgUmVhc29uIGlzIHRoYXQgaW4gdGhpcyBjYXNlIHZlcnRpY2FsIG1ldHJpY3MKKyAgICogICAgIGdldCBzeW50aGVzaXplZCwgYW5kIHRob3NlIHZhbHVlcyBhcmUgbm90IGFsd2F5cyBjb25zaXN0ZW50IGFjcm9zcworICAgKiAgICAgdmFyaW91cyBmb250IGZvcm1hdHMuCisgICAqCisgICAqICAgRlRfTE9BRF9GT1JDRV9BVVRPSElOVCA6OgorICAgKiAgICAgSW5kaWNhdGVzIHRoYXQgdGhlIGF1dG8taGludGVyIGlzIHByZWZlcnJlZCBvdmVyIHRoZSBmb250J3MgbmF0aXZlCisgICAqICAgICBoaW50ZXIuICBTZWUgYWxzbyB0aGUgbm90ZSBiZWxvdy4KKyAgICoKKyAgICogICBGVF9MT0FEX1BFREFOVElDIDo6CisgICAqICAgICBJbmRpY2F0ZXMgdGhhdCB0aGUgZm9udCBkcml2ZXIgc2hvdWxkIHBlcmZvcm0gcGVkYW50aWMgdmVyaWZpY2F0aW9ucworICAgKiAgICAgZHVyaW5nIGdseXBoIGxvYWRpbmcuICBUaGlzIGlzIG1vc3RseSB1c2VkIHRvIGRldGVjdCBicm9rZW4gZ2x5cGhzCisgICAqICAgICBpbiBmb250cy4gIEJ5IGRlZmF1bHQsIEZyZWVUeXBlIHRyaWVzIHRvIGhhbmRsZSBicm9rZW4gZm9udHMgYWxzby4KKyAgICoKKyAgICogICAgIEluIHBhcnRpY3VsYXIsIGVycm9ycyBmcm9tIHRoZSBUcnVlVHlwZSBieXRlY29kZSBlbmdpbmUgYXJlIG5vdAorICAgKiAgICAgcGFzc2VkIHRvIHRoZSBhcHBsaWNhdGlvbiBpZiB0aGlzIGZsYWcgaXMgbm90IHNldDsgdGhpcyBtaWdodAorICAgKiAgICAgcmVzdWx0IGluIHBhcnRpYWxseSBoaW50ZWQgb3IgZGlzdG9ydGVkIGdseXBocyBpbiBjYXNlIGEgZ2x5cGgncworICAgKiAgICAgYnl0ZWNvZGUgaXMgYnVnZ3kuCisgICAqCisgICAqICAgRlRfTE9BRF9OT19SRUNVUlNFIDo6CisgICAqICAgICBJbmRpY2F0ZSB0aGF0IHRoZSBmb250IGRyaXZlciBzaG91bGQgbm90IGxvYWQgY29tcG9zaXRlIGdseXBocworICAgKiAgICAgcmVjdXJzaXZlbHkuICBJbnN0ZWFkLCBpdCBzaG91bGQgc2V0IHRoZSBgbnVtX3N1YmdseXBoJyBhbmQKKyAgICogICAgIGBzdWJnbHlwaHMnIHZhbHVlcyBvZiB0aGUgZ2x5cGggc2xvdCBhY2NvcmRpbmdseSwgYW5kIHNldAorICAgKiAgICAgYGdseXBoLT5mb3JtYXQnIHRvIEBGVF9HTFlQSF9GT1JNQVRfQ09NUE9TSVRFLiAgVGhlIGRlc2NyaXB0aW9uIG9mCisgICAqICAgICBzdWJnbHlwaHMgY2FuIHRoZW4gYmUgYWNjZXNzZWQgd2l0aCBARlRfR2V0X1N1YkdseXBoX0luZm8uCisgICAqCisgICAqICAgICBUaGlzIGZsYWcgaW1wbGllcyBARlRfTE9BRF9OT19TQ0FMRSBhbmQgQEZUX0xPQURfSUdOT1JFX1RSQU5TRk9STS4KKyAgICoKKyAgICogICBGVF9MT0FEX0lHTk9SRV9UUkFOU0ZPUk0gOjoKKyAgICogICAgIEluZGljYXRlcyB0aGF0IHRoZSB0cmFuc2Zvcm0gbWF0cml4IHNldCBieSBARlRfU2V0X1RyYW5zZm9ybSBzaG91bGQKKyAgICogICAgIGJlIGlnbm9yZWQuCisgICAqCisgICAqICAgRlRfTE9BRF9NT05PQ0hST01FIDo6CisgICAqICAgICBUaGlzIGZsYWcgaXMgdXNlZCB3aXRoIEBGVF9MT0FEX1JFTkRFUiB0byBpbmRpY2F0ZSB0aGF0IHlvdSB3YW50IHRvCisgICAqICAgICByZW5kZXIgYW4gb3V0bGluZSBnbHlwaCB0byBhIDEtYml0IG1vbm9jaHJvbWUgYml0bWFwIGdseXBoLCB3aXRoCisgICAqICAgICA4fnBpeGVscyBwYWNrZWQgaW50byBlYWNoIGJ5dGUgb2YgdGhlIGJpdG1hcCBkYXRhLgorICAgKgorICAgKiAgICAgTm90ZSB0aGF0IHRoaXMgaGFzIG5vIGVmZmVjdCBvbiB0aGUgaGludGluZyBhbGdvcml0aG0gdXNlZC4gIFlvdQorICAgKiAgICAgc2hvdWxkIHJhdGhlciB1c2UgQEZUX0xPQURfVEFSR0VUX01PTk8gc28gdGhhdCB0aGUKKyAgICogICAgIG1vbm9jaHJvbWUtb3B0aW1pemVkIGhpbnRpbmcgYWxnb3JpdGhtIGlzIHVzZWQuCisgICAqCisgICAqICAgRlRfTE9BRF9MSU5FQVJfREVTSUdOIDo6CisgICAqICAgICBJbmRpY2F0ZXMgdGhhdCB0aGUgYGxpbmVhckhvcmlBZHZhbmNlJyBhbmQgYGxpbmVhclZlcnRBZHZhbmNlJworICAgKiAgICAgZmllbGRzIG9mIEBGVF9HbHlwaFNsb3RSZWMgc2hvdWxkIGJlIGtlcHQgaW4gZm9udCB1bml0cy4gIFNlZQorICAgKiAgICAgQEZUX0dseXBoU2xvdFJlYyBmb3IgZGV0YWlscy4KKyAgICoKKyAgICogICBGVF9MT0FEX05PX0FVVE9ISU5UIDo6CisgICAqICAgICBEaXNhYmxlIGF1dG8taGludGVyLiAgU2VlIGFsc28gdGhlIG5vdGUgYmVsb3cuCisgICAqCisgICAqICAgRlRfTE9BRF9DT0xPUiA6OgorICAgKiAgICAgVGhpcyBmbGFnIGlzIHVzZWQgdG8gcmVxdWVzdCBsb2FkaW5nIG9mIGNvbG9yIGVtYmVkZGVkLWJpdG1hcAorICAgKiAgICAgaW1hZ2VzLiAgVGhlIHJlc3VsdGluZyBjb2xvciBiaXRtYXBzLCBpZiBhdmFpbGFibGUsIHdpbGwgaGF2ZSB0aGUKKyAgICogICAgIEBGVF9QSVhFTF9NT0RFX0JHUkEgZm9ybWF0LiAgV2hlbiB0aGUgZmxhZyBpcyBub3QgdXNlZCBhbmQgY29sb3IKKyAgICogICAgIGJpdG1hcHMgYXJlIGZvdW5kLCB0aGV5IHdpbGwgYmUgY29udmVydGVkIHRvIDI1Ni1sZXZlbCBncmF5CisgICAqICAgICBiaXRtYXBzIHRyYW5zcGFyZW50bHkuICBUaG9zZSBiaXRtYXBzIHdpbGwgYmUgaW4gdGhlCisgICAqICAgICBARlRfUElYRUxfTU9ERV9HUkFZIGZvcm1hdC4KKyAgICoKKyAgICogICBGVF9MT0FEX0NPTVBVVEVfTUVUUklDUyA6OgorICAgKiAgICAgVGhpcyBmbGFnIHNldHMgY29tcHV0aW5nIGdseXBoIG1ldHJpY3Mgd2l0aG91dCB0aGUgdXNlIG9mIGJ1bmRsZWQKKyAgICogICAgIG1ldHJpY3MgdGFibGVzIChmb3IgZXhhbXBsZSwgdGhlIGBoZG14JyB0YWJsZSBpbiBUcnVlVHlwZSBmb250cykuCisgICAqICAgICBXZWxsLWJlaGF2aW5nIGZvbnRzIGhhdmUgb3B0aW1pemVkIGJ1bmRsZWQgbWV0cmljcyBhbmQgdGhlc2Ugc2hvdWxkCisgICAqICAgICBiZSB1c2VkLiAgVGhpcyBmbGFnIGlzIG1haW5seSB1c2VkIGJ5IGZvbnQgdmFsaWRhdGluZyBvciBmb250CisgICAqICAgICBlZGl0aW5nIGFwcGxpY2F0aW9ucywgd2hpY2ggbmVlZCB0byBpZ25vcmUsIHZlcmlmeSwgb3IgZWRpdCB0aG9zZQorICAgKiAgICAgdGFibGVzLgorICAgKgorICAgKiAgICAgQ3VycmVudGx5LCB0aGlzIGZsYWcgaXMgb25seSBpbXBsZW1lbnRlZCBmb3IgVHJ1ZVR5cGUgZm9udHMuCisgICAqCisgICAqICAgRlRfTE9BRF9DUk9QX0JJVE1BUCA6OgorICAgKiAgICAgSWdub3JlZC4gIERlcHJlY2F0ZWQuCisgICAqCisgICAqICAgRlRfTE9BRF9JR05PUkVfR0xPQkFMX0FEVkFOQ0VfV0lEVEggOjoKKyAgICogICAgIElnbm9yZWQuICBEZXByZWNhdGVkLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBCeSBkZWZhdWx0LCBoaW50aW5nIGlzIGVuYWJsZWQgYW5kIHRoZSBmb250J3MgbmF0aXZlIGhpbnRlciAoc2VlCisgICAqICAgQEZUX0ZBQ0VfRkxBR19ISU5URVIpIGlzIHByZWZlcnJlZCBvdmVyIHRoZSBhdXRvLWhpbnRlci4gIFlvdSBjYW4KKyAgICogICBkaXNhYmxlIGhpbnRpbmcgYnkgc2V0dGluZyBARlRfTE9BRF9OT19ISU5USU5HIG9yIGNoYW5nZSB0aGUKKyAgICogICBwcmVjZWRlbmNlIGJ5IHNldHRpbmcgQEZUX0xPQURfRk9SQ0VfQVVUT0hJTlQuICBZb3UgY2FuIGFsc28gc2V0CisgICAqICAgQEZUX0xPQURfTk9fQVVUT0hJTlQgaW4gY2FzZSB5b3UgZG9uJ3Qgd2FudCB0aGUgYXV0by1oaW50ZXIgdG8gYmUKKyAgICogICB1c2VkIGF0IGFsbC4KKyAgICoKKyAgICogICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIEBGVF9GQUNFX0ZMQUdfVFJJQ0tZIGZvciBhIHNwZWNpYWwgZXhjZXB0aW9uCisgICAqICAgKGFmZmVjdGluZyBvbmx5IGEgaGFuZGZ1bCBvZiBBc2lhbiBmb250cykuCisgICAqCisgICAqICAgQmVzaWRlcyBkZWNpZGluZyB3aGljaCBoaW50ZXIgdG8gdXNlLCB5b3UgY2FuIGFsc28gZGVjaWRlIHdoaWNoCisgICAqICAgaGludGluZyBhbGdvcml0aG0gdG8gdXNlLiAgU2VlIEBGVF9MT0FEX1RBUkdFVF9YWFggZm9yIGRldGFpbHMuCisgICAqCisgICAqICAgTm90ZSB0aGF0IHRoZSBhdXRvLWhpbnRlciBuZWVkcyBhIHZhbGlkIFVuaWNvZGUgY21hcCAoZWl0aGVyIGEgbmF0aXZlCisgICAqICAgb25lIG9yIHN5bnRoZXNpemVkIGJ5IEZyZWVUeXBlKSBmb3IgcHJvZHVjaW5nIGNvcnJlY3QgcmVzdWx0cy4gIElmIGEKKyAgICogICBmb250IHByb3ZpZGVzIGFuIGluY29ycmVjdCBtYXBwaW5nIChmb3IgZXhhbXBsZSwgYXNzaWduaW5nIHRoZQorICAgKiAgIGNoYXJhY3RlciBjb2RlIFUrMDA1QSwgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiwgdG8gYSBnbHlwaCBkZXBpY3RpbmcgYQorICAgKiAgIG1hdGhlbWF0aWNhbCBpbnRlZ3JhbCBzaWduKSwgdGhlIGF1dG8taGludGVyIG1pZ2h0IHByb2R1Y2UgdXNlbGVzcworICAgKiAgIHJlc3VsdHMuCisgICAqCisgICAqLworI2RlZmluZSBGVF9MT0FEX0RFRkFVTFQgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIEZUX0xPQURfTk9fU0NBTEUgICAgICAgICAgICAgICAgICAgICAoIDFMIDw8IDAgKQorI2RlZmluZSBGVF9MT0FEX05PX0hJTlRJTkcgICAgICAgICAgICAgICAgICAgKCAxTCA8PCAxICkKKyNkZWZpbmUgRlRfTE9BRF9SRU5ERVIgICAgICAgICAgICAgICAgICAgICAgICggMUwgPDwgMiApCisjZGVmaW5lIEZUX0xPQURfTk9fQklUTUFQICAgICAgICAgICAgICAgICAgICAoIDFMIDw8IDMgKQorI2RlZmluZSBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCAgICAgICAgICAgICAgKCAxTCA8PCA0ICkKKyNkZWZpbmUgRlRfTE9BRF9GT1JDRV9BVVRPSElOVCAgICAgICAgICAgICAgICggMUwgPDwgNSApCisjZGVmaW5lIEZUX0xPQURfQ1JPUF9CSVRNQVAgICAgICAgICAgICAgICAgICAoIDFMIDw8IDYgKQorI2RlZmluZSBGVF9MT0FEX1BFREFOVElDICAgICAgICAgICAgICAgICAgICAgKCAxTCA8PCA3ICkKKyNkZWZpbmUgRlRfTE9BRF9JR05PUkVfR0xPQkFMX0FEVkFOQ0VfV0lEVEggICggMUwgPDwgOSApCisjZGVmaW5lIEZUX0xPQURfTk9fUkVDVVJTRSAgICAgICAgICAgICAgICAgICAoIDFMIDw8IDEwICkKKyNkZWZpbmUgRlRfTE9BRF9JR05PUkVfVFJBTlNGT1JNICAgICAgICAgICAgICggMUwgPDwgMTEgKQorI2RlZmluZSBGVF9MT0FEX01PTk9DSFJPTUUgICAgICAgICAgICAgICAgICAgKCAxTCA8PCAxMiApCisjZGVmaW5lIEZUX0xPQURfTElORUFSX0RFU0lHTiAgICAgICAgICAgICAgICAoIDFMIDw8IDEzICkKKyNkZWZpbmUgRlRfTE9BRF9OT19BVVRPSElOVCAgICAgICAgICAgICAgICAgICggMUwgPDwgMTUgKQorICAvKiBCaXRzIDE2Li4xOSBhcmUgdXNlZCBieSBgRlRfTE9BRF9UQVJHRVRfJyAqLworI2RlZmluZSBGVF9MT0FEX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgKCAxTCA8PCAyMCApCisjZGVmaW5lIEZUX0xPQURfQ09NUFVURV9NRVRSSUNTICAgICAgICAgICAgICAoIDFMIDw8IDIxICkKKworICAvKiAqLworCisgIC8qIHVzZWQgaW50ZXJuYWxseSBvbmx5IGJ5IGNlcnRhaW4gZm9udCBkcml2ZXJzISAqLworI2RlZmluZSBGVF9MT0FEX0FEVkFOQ0VfT05MWSAgICAgICAgICAgICAgICAgKCAxTCA8PCA4ICkKKyNkZWZpbmUgRlRfTE9BRF9TQklUU19PTkxZICAgICAgICAgICAgICAgICAgICggMUwgPDwgMTQgKQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBlbnVtOgorICAgKiAgIEZUX0xPQURfVEFSR0VUX1hYWAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBsaXN0IG9mIHZhbHVlcyB0aGF0IGFyZSB1c2VkIHRvIHNlbGVjdCBhIHNwZWNpZmljIGhpbnRpbmcgYWxnb3JpdGhtCisgICAqICAgdG8gdXNlIGJ5IHRoZSBoaW50ZXIuICBZb3Ugc2hvdWxkIE9SIG9uZSBvZiB0aGVzZSB2YWx1ZXMgdG8geW91cgorICAgKiAgIGBsb2FkX2ZsYWdzJyB3aGVuIGNhbGxpbmcgQEZUX0xvYWRfR2x5cGguCisgICAqCisgICAqICAgTm90ZSB0aGF0IGZvbnQncyBuYXRpdmUgaGludGVycyBtYXkgaWdub3JlIHRoZSBoaW50aW5nIGFsZ29yaXRobSB5b3UKKyAgICogICBoYXZlIHNwZWNpZmllZCAoZS5nLiwgdGhlIFRydWVUeXBlIGJ5dGVjb2RlIGludGVycHJldGVyKS4gIFlvdSBjYW4gc2V0CisgICAqICAgQEZUX0xPQURfRk9SQ0VfQVVUT0hJTlQgdG8gZW5zdXJlIHRoYXQgdGhlIGF1dG8taGludGVyIGlzIHVzZWQuCisgICAqCisgICAqICAgQWxzbyBub3RlIHRoYXQgQEZUX0xPQURfVEFSR0VUX0xJR0hUIGlzIGFuIGV4Y2VwdGlvbiwgaW4gdGhhdCBpdAorICAgKiAgIGFsd2F5cyBpbXBsaWVzIEBGVF9MT0FEX0ZPUkNFX0FVVE9ISU5ULgorICAgKgorICAgKiBAdmFsdWVzOgorICAgKiAgIEZUX0xPQURfVEFSR0VUX05PUk1BTCA6OgorICAgKiAgICAgVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgZGVmYXVsdCBoaW50aW5nIGFsZ29yaXRobSwgb3B0aW1pemVkIGZvcgorICAgKiAgICAgc3RhbmRhcmQgZ3JheS1sZXZlbCByZW5kZXJpbmcuICBGb3IgbW9ub2Nocm9tZSBvdXRwdXQsIHVzZQorICAgKiAgICAgQEZUX0xPQURfVEFSR0VUX01PTk8gaW5zdGVhZC4KKyAgICoKKyAgICogICBGVF9MT0FEX1RBUkdFVF9MSUdIVCA6OgorICAgKiAgICAgQSBsaWdodGVyIGhpbnRpbmcgYWxnb3JpdGhtIGZvciBub24tbW9ub2Nocm9tZSBtb2Rlcy4gIE1hbnkKKyAgICogICAgIGdlbmVyYXRlZCBnbHlwaHMgYXJlIG1vcmUgZnV6enkgYnV0IGJldHRlciByZXNlbWJsZSBpdHMgb3JpZ2luYWwKKyAgICogICAgIHNoYXBlLiAgQSBiaXQgbGlrZSByZW5kZXJpbmcgb24gTWFjIE9TflguCisgICAqCisgICAqICAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGlzIHRhcmdldCBpbXBsaWVzIEBGVF9MT0FEX0ZPUkNFX0FVVE9ISU5ULgorICAgKgorICAgKiAgIEZUX0xPQURfVEFSR0VUX01PTk8gOjoKKyAgICogICAgIFN0cm9uZyBoaW50aW5nIGFsZ29yaXRobSB0aGF0IHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIG1vbm9jaHJvbWUKKyAgICogICAgIG91dHB1dC4gIFRoZSByZXN1bHQgaXMgcHJvYmFibHkgdW5wbGVhc2FudCBpZiB0aGUgZ2x5cGggaXMgcmVuZGVyZWQKKyAgICogICAgIGluIG5vbi1tb25vY2hyb21lIG1vZGVzLgorICAgKgorICAgKiAgIEZUX0xPQURfVEFSR0VUX0xDRCA6OgorICAgKiAgICAgQSB2YXJpYW50IG9mIEBGVF9MT0FEX1RBUkdFVF9OT1JNQUwgb3B0aW1pemVkIGZvciBob3Jpem9udGFsbHkKKyAgICogICAgIGRlY2ltYXRlZCBMQ0QgZGlzcGxheXMuCisgICAqCisgICAqICAgRlRfTE9BRF9UQVJHRVRfTENEX1YgOjoKKyAgICogICAgIEEgdmFyaWFudCBvZiBARlRfTE9BRF9UQVJHRVRfTk9STUFMIG9wdGltaXplZCBmb3IgdmVydGljYWxseQorICAgKiAgICAgZGVjaW1hdGVkIExDRCBkaXNwbGF5cy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgWW91IHNob3VsZCB1c2Ugb25seSBfb25lXyBvZiB0aGUgRlRfTE9BRF9UQVJHRVRfWFhYIHZhbHVlcyBpbiB5b3VyCisgICAqICAgYGxvYWRfZmxhZ3MnLiAgVGhleSBjYW4ndCBiZSBPUmVkLgorICAgKgorICAgKiAgIElmIEBGVF9MT0FEX1JFTkRFUiBpcyBhbHNvIHNldCwgdGhlIGdseXBoIGlzIHJlbmRlcmVkIGluIHRoZQorICAgKiAgIGNvcnJlc3BvbmRpbmcgbW9kZSAoaS5lLiwgdGhlIG1vZGUgdGhhdCBtYXRjaGVzIHRoZSB1c2VkIGFsZ29yaXRobQorICAgKiAgIGJlc3QpLiAgQW4gZXhlcHRpb24gaXMgRlRfTE9BRF9UQVJHRVRfTU9OTyBzaW5jZSBpdCBpbXBsaWVzCisgICAqICAgQEZUX0xPQURfTU9OT0NIUk9NRS4KKyAgICoKKyAgICogICBZb3UgY2FuIHVzZSBhIGhpbnRpbmcgYWxnb3JpdGhtIHRoYXQgZG9lc24ndCBjb3JyZXNwb25kIHRvIHRoZSBzYW1lCisgICAqICAgcmVuZGVyaW5nIG1vZGUuICBBcyBhbiBleGFtcGxlLCBpdCBpcyBwb3NzaWJsZSB0byB1c2UgdGhlIGBsaWdodCcKKyAgICogICBoaW50aW5nIGFsZ29yaXRobSBhbmQgaGF2ZSB0aGUgcmVzdWx0cyByZW5kZXJlZCBpbiBob3Jpem9udGFsIExDRAorICAgKiAgIHBpeGVsIG1vZGUsIHdpdGggY29kZSBsaWtlCisgICAqCisgICAqICAgICB7CisgICAqICAgICAgIEZUX0xvYWRfR2x5cGgoIGZhY2UsIGdseXBoX2luZGV4LAorICAgKiAgICAgICAgICAgICAgICAgICAgICBsb2FkX2ZsYWdzIHwgRlRfTE9BRF9UQVJHRVRfTElHSFQgKTsKKyAgICoKKyAgICogICAgICAgRlRfUmVuZGVyX0dseXBoKCBmYWNlLT5nbHlwaCwgRlRfUkVOREVSX01PREVfTENEICk7CisgICAqICAgICB9CisgICAqCisgICAqLworI2RlZmluZSBGVF9MT0FEX1RBUkdFVF8oIHggKSAgICggKEZUX0ludDMyKSggKHgpICYgMTUgKSA8PCAxNiApCisKKyNkZWZpbmUgRlRfTE9BRF9UQVJHRVRfTk9STUFMICBGVF9MT0FEX1RBUkdFVF8oIEZUX1JFTkRFUl9NT0RFX05PUk1BTCApCisjZGVmaW5lIEZUX0xPQURfVEFSR0VUX0xJR0hUICAgRlRfTE9BRF9UQVJHRVRfKCBGVF9SRU5ERVJfTU9ERV9MSUdIVCAgKQorI2RlZmluZSBGVF9MT0FEX1RBUkdFVF9NT05PICAgIEZUX0xPQURfVEFSR0VUXyggRlRfUkVOREVSX01PREVfTU9OTyAgICkKKyNkZWZpbmUgRlRfTE9BRF9UQVJHRVRfTENEICAgICBGVF9MT0FEX1RBUkdFVF8oIEZUX1JFTkRFUl9NT0RFX0xDRCAgICApCisjZGVmaW5lIEZUX0xPQURfVEFSR0VUX0xDRF9WICAgRlRfTE9BRF9UQVJHRVRfKCBGVF9SRU5ERVJfTU9ERV9MQ0RfViAgKQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9MT0FEX1RBUkdFVF9NT0RFCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZXR1cm4gdGhlIEBGVF9SZW5kZXJfTW9kZSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4KKyAgICogICBARlRfTE9BRF9UQVJHRVRfWFhYIHZhbHVlLgorICAgKgorICAgKi8KKyNkZWZpbmUgRlRfTE9BRF9UQVJHRVRfTU9ERSggeCApICAoIChGVF9SZW5kZXJfTW9kZSkoICggKHgpID4+IDE2ICkgJiAxNSApICkKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1NldF9UcmFuc2Zvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBzZXQgdGhlIHRyYW5zZm9ybWF0aW9uIHRoYXQgaXMgYXBwbGllZCB0byBnbHlwaCAqLworICAvKiAgICBpbWFnZXMgd2hlbiB0aGV5IGFyZSBsb2FkZWQgaW50byBhIGdseXBoIHNsb3QgdGhyb3VnaCAgICAgICAgICAgICAgKi8KKyAgLyogICAgQEZUX0xvYWRfR2x5cGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF0cml4IDo6IEEgcG9pbnRlciB0byB0aGUgdHJhbnNmb3JtYXRpb24ncyAyeDIgbWF0cml4LiAgVXNlfjAgZm9yICovCisgIC8qICAgICAgICAgICAgICB0aGUgaWRlbnRpdHkgbWF0cml4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkZWx0YSAgOjogQSBwb2ludGVyIHRvIHRoZSB0cmFuc2xhdGlvbiB2ZWN0b3IuICBVc2V+MCBmb3IgdGhlIG51bGwgKi8KKyAgLyogICAgICAgICAgICAgIHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIHRyYW5zZm9ybWF0aW9uIGlzIG9ubHkgYXBwbGllZCB0byBzY2FsYWJsZSBpbWFnZSBmb3JtYXRzIGFmdGVyICovCisgIC8qICAgIHRoZSBnbHlwaCBoYXMgYmVlbiBsb2FkZWQuICBJdCBtZWFucyB0aGF0IGhpbnRpbmcgaXMgdW5hbHRlcmVkIGJ5ICAqLworICAvKiAgICB0aGUgdHJhbnNmb3JtYXRpb24gYW5kIGlzIHBlcmZvcm1lZCBvbiB0aGUgY2hhcmFjdGVyIHNpemUgZ2l2ZW4gaW4gKi8KKyAgLyogICAgdGhlIGxhc3QgY2FsbCB0byBARlRfU2V0X0NoYXJfU2l6ZSBvciBARlRfU2V0X1BpeGVsX1NpemVzLiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBOb3RlIHRoYXQgdGhpcyBhbHNvIHRyYW5zZm9ybXMgdGhlIGBmYWNlLmdseXBoLmFkdmFuY2UnIGZpZWxkLCBidXQgKi8KKyAgLyogICAgKm5vdCogdGhlIHZhbHVlcyBpbiBgZmFjZS5nbHlwaC5tZXRyaWNzJy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIHZvaWQgKQorICBGVF9TZXRfVHJhbnNmb3JtKCBGVF9GYWNlICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICBGVF9NYXRyaXgqICBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIGRlbHRhICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9SZW5kZXJfTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbiBlbnVtZXJhdGlvbiB0eXBlIHRoYXQgbGlzdHMgdGhlIHJlbmRlciBtb2RlcyBzdXBwb3J0ZWQgYnkgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGV+Mi4gIEVhY2ggbW9kZSBjb3JyZXNwb25kcyB0byBhIHNwZWNpZmljIHR5cGUgb2Ygc2NhbmxpbmUgICovCisgIC8qICAgIGNvbnZlcnNpb24gcGVyZm9ybWVkIG9uIHRoZSBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRm9yIGJpdG1hcCBmb250cyBhbmQgZW1iZWRkZWQgYml0bWFwcyB0aGUgYGJpdG1hcC0+cGl4ZWxfbW9kZScgICAgICovCisgIC8qICAgIGZpZWxkIGluIHRoZSBARlRfR2x5cGhTbG90UmVjIHN0cnVjdHVyZSBnaXZlcyB0aGUgZm9ybWF0IG9mIHRoZSAgICAqLworICAvKiAgICByZXR1cm5lZCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFsbCBtb2RlcyBleGNlcHQgQEZUX1JFTkRFUl9NT0RFX01PTk8gdXNlIDI1NiBsZXZlbHMgb2Ygb3BhY2l0eS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1JFTkRFUl9NT0RFX05PUk1BTCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIFRoaXMgaXMgdGhlIGRlZmF1bHQgcmVuZGVyIG1vZGU7IGl0IGNvcnJlc3BvbmRzIHRvIDgtYml0ICAgICAgICAgKi8KKyAgLyogICAgICBhbnRpLWFsaWFzZWQgYml0bWFwcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9SRU5ERVJfTU9ERV9MSUdIVCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gQEZUX1JFTkRFUl9NT0RFX05PUk1BTC4gIEl0IGlzIG9ubHkgICAgICAgICovCisgIC8qICAgICAgZGVmaW5lZCBhcyBhIHNlcGFyYXRlIHZhbHVlIGJlY2F1c2UgcmVuZGVyIG1vZGVzIGFyZSBhbHNvIHVzZWQgICAqLworICAvKiAgICAgIGluZGlyZWN0bHkgdG8gZGVmaW5lIGhpbnRpbmcgYWxnb3JpdGhtIHNlbGVjdG9ycy4gIFNlZSAgICAgICAgICAgKi8KKyAgLyogICAgICBARlRfTE9BRF9UQVJHRVRfWFhYIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9SRU5ERVJfTU9ERV9NT05PIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBUaGlzIG1vZGUgY29ycmVzcG9uZHMgdG8gMS1iaXQgYml0bWFwcyAod2l0aCAyfmxldmVscyBvZiAgICAgICAgICovCisgIC8qICAgICAgb3BhY2l0eSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUkVOREVSX01PREVfTENEIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgVGhpcyBtb2RlIGNvcnJlc3BvbmRzIHRvIGhvcml6b250YWwgUkdCIGFuZCBCR1Igc3ViLXBpeGVsICAgICAgICAqLworICAvKiAgICAgIGRpc3BsYXlzIGxpa2UgTENEIHNjcmVlbnMuICBJdCBwcm9kdWNlcyA4LWJpdCBiaXRtYXBzIHRoYXQgYXJlICAgKi8KKyAgLyogICAgICAzfnRpbWVzIHRoZSB3aWR0aCBvZiB0aGUgb3JpZ2luYWwgZ2x5cGggb3V0bGluZSBpbiBwaXhlbHMsIGFuZCAgICovCisgIC8qICAgICAgd2hpY2ggdXNlIHRoZSBARlRfUElYRUxfTU9ERV9MQ0QgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUkVOREVSX01PREVfTENEX1YgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgVGhpcyBtb2RlIGNvcnJlc3BvbmRzIHRvIHZlcnRpY2FsIFJHQiBhbmQgQkdSIHN1Yi1waXhlbCBkaXNwbGF5cyAqLworICAvKiAgICAgIChsaWtlIFBEQSBzY3JlZW5zLCByb3RhdGVkIExDRCBkaXNwbGF5cywgZXRjLikuICBJdCBwcm9kdWNlcyAgICAgKi8KKyAgLyogICAgICA4LWJpdCBiaXRtYXBzIHRoYXQgYXJlIDN+dGltZXMgdGhlIGhlaWdodCBvZiB0aGUgb3JpZ2luYWwgICAgICAgICovCisgIC8qICAgICAgZ2x5cGggb3V0bGluZSBpbiBwaXhlbHMgYW5kIHVzZSB0aGUgQEZUX1BJWEVMX01PREVfTENEX1YgbW9kZS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBMQ0Qtb3B0aW1pemVkIGdseXBoIGJpdG1hcHMgcHJvZHVjZWQgYnkgRlRfUmVuZGVyX0dseXBoIGNhbiBiZSAqLworICAvKiAgICBmaWx0ZXJlZCB0byByZWR1Y2UgY29sb3ItZnJpbmdlcyBieSB1c2luZyBARlRfTGlicmFyeV9TZXRMY2RGaWx0ZXIgKi8KKyAgLyogICAgKG5vdCBhY3RpdmUgaW4gdGhlIGRlZmF1bHQgYnVpbGRzKS4gIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gICAgICovCisgIC8qICAgIGVpdGhlciBjYWxsIEBGVF9MaWJyYXJ5X1NldExjZEZpbHRlciAoaWYgYXZhaWxhYmxlKSBvciBkbyB0aGUgICAgICAqLworICAvKiAgICBmaWx0ZXJpbmcgaXRzZWxmLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBzZWxlY3RlZCByZW5kZXIgbW9kZSBvbmx5IGFmZmVjdHMgdmVjdG9yIGdseXBocyBvZiBhIGZvbnQuICAgICAqLworICAvKiAgICBFbWJlZGRlZCBiaXRtYXBzIG9mdGVuIGhhdmUgYSBkaWZmZXJlbnQgcGl4ZWwgbW9kZSBsaWtlICAgICAgICAgICAgKi8KKyAgLyogICAgQEZUX1BJWEVMX01PREVfTU9OTy4gIFlvdSBjYW4gdXNlIEBGVF9CaXRtYXBfQ29udmVydCB0byB0cmFuc2Zvcm0gICovCisgIC8qICAgIHRoZW0gaW50byA4LWJpdCBwaXhtYXBzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBlbnVtICBGVF9SZW5kZXJfTW9kZV8KKyAgeworICAgIEZUX1JFTkRFUl9NT0RFX05PUk1BTCA9IDAsCisgICAgRlRfUkVOREVSX01PREVfTElHSFQsCisgICAgRlRfUkVOREVSX01PREVfTU9OTywKKyAgICBGVF9SRU5ERVJfTU9ERV9MQ0QsCisgICAgRlRfUkVOREVSX01PREVfTENEX1YsCisKKyAgICBGVF9SRU5ERVJfTU9ERV9NQVgKKworICB9IEZUX1JlbmRlcl9Nb2RlOworCisKKyAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgKi8KKyAgLyogYEZUX1JlbmRlcl9Nb2RlJyB2YWx1ZXMgaW5zdGVhZCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgZnRfcmVuZGVyX21vZGVfbm9ybWFsICBGVF9SRU5ERVJfTU9ERV9OT1JNQUwKKyNkZWZpbmUgZnRfcmVuZGVyX21vZGVfbW9ubyAgICBGVF9SRU5ERVJfTU9ERV9NT05PCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9SZW5kZXJfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDb252ZXJ0IGEgZ2l2ZW4gZ2x5cGggaW1hZ2UgdG8gYSBiaXRtYXAuICBJdCBkb2VzIHNvIGJ5IGluc3BlY3RpbmcgKi8KKyAgLyogICAgdGhlIGdseXBoIGltYWdlIGZvcm1hdCwgZmluZGluZyB0aGUgcmVsZXZhbnQgcmVuZGVyZXIsIGFuZCAgICAgICAgICovCisgIC8qICAgIGludm9raW5nIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNsb3QgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBnbHlwaCBzbG90IGNvbnRhaW5pbmcgdGhlIGltYWdlIHRvICAqLworICAvKiAgICAgICAgICAgICAgICAgICBjb252ZXJ0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByZW5kZXJfbW9kZSA6OiBUaGlzIGlzIHRoZSByZW5kZXIgbW9kZSB1c2VkIHRvIHJlbmRlciB0aGUgZ2x5cGggICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgaW1hZ2UgaW50byBhIGJpdG1hcC4gIFNlZSBARlRfUmVuZGVyX01vZGUgZm9yIGEgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRvIGdldCBtZWFuaW5nZnVsIHJlc3VsdHMsIGZvbnQgc2NhbGluZyB2YWx1ZXMgbXVzdCBiZSBzZXQgd2l0aCAgICAqLworICAvKiAgICBmdW5jdGlvbnMgbGlrZSBARlRfU2V0X0NoYXJfU2l6ZSBiZWZvcmUgY2FsbGluZyBGVF9SZW5kZXJfR2x5cGguICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9SZW5kZXJfR2x5cGgoIEZUX0dseXBoU2xvdCAgICBzbG90LAorICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICByZW5kZXJfbW9kZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfS2VybmluZ19Nb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQW4gZW51bWVyYXRpb24gdXNlZCB0byBzcGVjaWZ5IHdoaWNoIGtlcm5pbmcgdmFsdWVzIHRvIHJldHVybiBpbiAgICovCisgIC8qICAgIEBGVF9HZXRfS2VybmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0tFUk5JTkdfREVGQVVMVCAgOjogUmV0dXJuIGdyaWQtZml0dGVkIGtlcm5pbmcgZGlzdGFuY2VzIGluICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVscyAodmFsdWUgaXN+MCkuICBXaGV0aGVyIHRoZXkgYXJlICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZWQgZGVwZW5kcyBvbiBARlRfTE9BRF9OT19TQ0FMRS4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9LRVJOSU5HX1VORklUVEVEIDo6IFJldHVybiB1bi1ncmlkLWZpdHRlZCBrZXJuaW5nIGRpc3RhbmNlcyBpbiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAyNi42IGZyYWN0aW9uYWwgcGl4ZWxzLiAgV2hldGhlciB0aGV5IGFyZSAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVkIGRlcGVuZHMgb24gQEZUX0xPQURfTk9fU0NBTEUuICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfS0VSTklOR19VTlNDQUxFRCA6OiBSZXR1cm4gdGhlIGtlcm5pbmcgdmVjdG9yIGluIG9yaWdpbmFsIGZvbnQgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0tFUk5JTkdfREVGQVVMVCByZXR1cm5zIGZ1bGwgcGl4ZWwgdmFsdWVzOyBpdCBhbHNvIG1ha2VzICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBoZXVyaXN0aWNhbGx5IHNjYWxlIGRvd24ga2VybmluZyBkaXN0YW5jZXMgYXQgc21hbGwgcHBlbSAgKi8KKyAgLyogICAgdmFsdWVzIHNvIHRoYXQgdGhleSBkb24ndCBiZWNvbWUgdG9vIGJpZy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIGVudW0gIEZUX0tlcm5pbmdfTW9kZV8KKyAgeworICAgIEZUX0tFUk5JTkdfREVGQVVMVCAgPSAwLAorICAgIEZUX0tFUk5JTkdfVU5GSVRURUQsCisgICAgRlRfS0VSTklOR19VTlNDQUxFRAorCisgIH0gRlRfS2VybmluZ19Nb2RlOworCisKKyAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgKi8KKyAgLyogYEZUX0tlcm5pbmdfTW9kZScgdmFsdWVzIGluc3RlYWQgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgZnRfa2VybmluZ19kZWZhdWx0ICAgRlRfS0VSTklOR19ERUZBVUxUCisjZGVmaW5lIGZ0X2tlcm5pbmdfdW5maXR0ZWQgIEZUX0tFUk5JTkdfVU5GSVRURUQKKyNkZWZpbmUgZnRfa2VybmluZ191bnNjYWxlZCAgRlRfS0VSTklOR19VTlNDQUxFRAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2V0X0tlcm5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmV0dXJuIHRoZSBrZXJuaW5nIHZlY3RvciBiZXR3ZWVuIHR3byBnbHlwaHMgb2YgYSBzYW1lIGZhY2UuICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgICAgICAgOjogQSBoYW5kbGUgdG8gYSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsZWZ0X2dseXBoICA6OiBUaGUgaW5kZXggb2YgdGhlIGxlZnQgZ2x5cGggaW4gdGhlIGtlcm4gcGFpci4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJpZ2h0X2dseXBoIDo6IFRoZSBpbmRleCBvZiB0aGUgcmlnaHQgZ2x5cGggaW4gdGhlIGtlcm4gcGFpci4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAga2Vybl9tb2RlICAgOjogU2VlIEBGVF9LZXJuaW5nX01vZGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIERldGVybWluZXMgdGhlIHNjYWxlIGFuZCBkaW1lbnNpb24gb2YgdGhlIHJldHVybmVkICAqLworICAvKiAgICAgICAgICAgICAgICAgICBrZXJuaW5nIHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBha2VybmluZyAgICA6OiBUaGUga2VybmluZyB2ZWN0b3IuICBUaGlzIGlzIGVpdGhlciBpbiBmb250IHVuaXRzLCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgZnJhY3Rpb25hbCBwaXhlbHMgKDI2LjYgZm9ybWF0KSwgb3IgcGl4ZWxzIGZvciAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIHNjYWxhYmxlIGZvcm1hdHMsIGFuZCBpbiBwaXhlbHMgZm9yIGZpeGVkLXNpemVzICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPbmx5IGhvcml6b250YWwgbGF5b3V0cyAobGVmdC10by1yaWdodCAmIHJpZ2h0LXRvLWxlZnQpIGFyZSAgICAgICAgKi8KKyAgLyogICAgc3VwcG9ydGVkIGJ5IHRoaXMgbWV0aG9kLiAgT3RoZXIgbGF5b3V0cywgb3IgbW9yZSBzb3BoaXN0aWNhdGVkICAgICovCisgIC8qICAgIGtlcm5pbmdzLCBhcmUgb3V0IG9mIHRoZSBzY29wZSBvZiB0aGlzIEFQSSBmdW5jdGlvbiAtLSB0aGV5IGNhbiBiZSAqLworICAvKiAgICBpbXBsZW1lbnRlZCB0aHJvdWdoIGZvcm1hdC1zcGVjaWZpYyBpbnRlcmZhY2VzLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9HZXRfS2VybmluZyggRlRfRmFjZSAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGxlZnRfZ2x5cGgsCisgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICByaWdodF9nbHlwaCwKKyAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGtlcm5fbW9kZSwKKyAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciAgKmFrZXJuaW5nICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZXRfVHJhY2tfS2VybmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZXR1cm4gdGhlIHRyYWNrIGtlcm5pbmcgZm9yIGEgZ2l2ZW4gZmFjZSBvYmplY3QgYXQgYSBnaXZlbiBzaXplLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgICAgIDo6IEEgaGFuZGxlIHRvIGEgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBvaW50X3NpemUgOjogVGhlIHBvaW50IHNpemUgaW4gMTYuMTYgZnJhY3Rpb25hbCBwb2ludHMuICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZGVncmVlICAgICA6OiBUaGUgZGVncmVlIG9mIHRpZ2h0bmVzcy4gIEluY3JlYXNpbmdseSBuZWdhdGl2ZSAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgdmFsdWVzIHJlcHJlc2VudCB0aWdodGVyIHRyYWNrIGtlcm5pbmcsIHdoaWxlICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIGluY3JlYXNpbmdseSBwb3NpdGl2ZSB2YWx1ZXMgcmVwcmVzZW50IGxvb3NlciB0cmFjayAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBrZXJuaW5nLiAgVmFsdWUgemVybyBtZWFucyBubyB0cmFjayBrZXJuaW5nLiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYWtlcm5pbmcgICA6OiBUaGUga2VybmluZyBpbiAxNi4xNiBmcmFjdGlvbmFsIHBvaW50cywgdG8gYmUgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgdW5pZm9ybWx5IGFwcGxpZWQgYmV0d2VlbiBhbGwgZ2x5cGhzLiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEN1cnJlbnRseSwgb25seSB0aGUgVHlwZX4xIGZvbnQgZHJpdmVyIHN1cHBvcnRzIHRyYWNrIGtlcm5pbmcsICAgICAqLworICAvKiAgICB1c2luZyBkYXRhIGZyb20gQUZNIGZpbGVzIChpZiBhdHRhY2hlZCB3aXRoIEBGVF9BdHRhY2hfRmlsZSBvciAgICAgKi8KKyAgLyogICAgQEZUX0F0dGFjaF9TdHJlYW0pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPbmx5IHZlcnkgZmV3IEFGTSBmaWxlcyBjb21lIHdpdGggdHJhY2sga2VybmluZyBkYXRhOyBwbGVhc2UgcmVmZXIgKi8KKyAgLyogICAgdG8gdGhlIEFkb2JlJ3MgQUZNIHNwZWNpZmljYXRpb24gZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfR2V0X1RyYWNrX0tlcm5pbmcoIEZUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgcG9pbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgZGVncmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBha2VybmluZyApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2V0X0dseXBoX05hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmV0cmlldmUgdGhlIEFTQ0lJIG5hbWUgb2YgYSBnaXZlbiBnbHlwaCBpbiBhIGZhY2UuICBUaGlzIG9ubHkgICAgICovCisgIC8qICAgIHdvcmtzIGZvciB0aG9zZSBmYWNlcyB3aGVyZSBARlRfSEFTX0dMWVBIX05BTUVTKGZhY2UpIHJldHVybnN+MS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICAgIDo6IEEgaGFuZGxlIHRvIGEgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGhfaW5kZXggOjogVGhlIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBidWZmZXJfbWF4ICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYnVmZmVyICAgICAgOjogQSBwb2ludGVyIHRvIGEgdGFyZ2V0IGJ1ZmZlciB3aGVyZSB0aGUgbmFtZSBpcyAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIGNvcGllZCB0by4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFuIGVycm9yIGlzIHJldHVybmVkIGlmIHRoZSBmYWNlIGRvZXNuJ3QgcHJvdmlkZSBnbHlwaCBuYW1lcyBvciBpZiAqLworICAvKiAgICB0aGUgZ2x5cGggaW5kZXggaXMgaW52YWxpZC4gIEluIGFsbCBjYXNlcyBvZiBmYWlsdXJlLCB0aGUgZmlyc3QgICAgKi8KKyAgLyogICAgYnl0ZSBvZiBgYnVmZmVyJyBpcyBzZXQgdG9+MCB0byBpbmRpY2F0ZSBhbiBlbXB0eSBuYW1lLiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgZ2x5cGggbmFtZSBpcyB0cnVuY2F0ZWQgdG8gZml0IHdpdGhpbiB0aGUgYnVmZmVyIGlmIGl0IGlzIHRvbyAgKi8KKyAgLyogICAgbG9uZy4gIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgYWx3YXlzIHplcm8tdGVybWluYXRlZC4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBCZSBhd2FyZSB0aGF0IEZyZWVUeXBlIHJlb3JkZXJzIGdseXBoIGluZGljZXMgaW50ZXJuYWxseSBzbyB0aGF0ICAgKi8KKyAgLyogICAgZ2x5cGggaW5kZXh+MCBhbHdheXMgY29ycmVzcG9uZHMgdG8gdGhlIGBtaXNzaW5nIGdseXBoJyAoY2FsbGVkICAgICovCisgIC8qICAgIGAubm90ZGVmJykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgY29uZmlnIG1hY3JvICAgICAgICAgICovCisgIC8qICAgIGBGVF9DT05GSUdfT1BUSU9OX05PX0dMWVBIX05BTUVTJyBpcyBub3QgZGVmaW5lZCBpbiBgZnRvcHRpb25zLmgnLiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX0dldF9HbHlwaF9OYW1lKCBGVF9GYWNlICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBidWZmZXJfbWF4ICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZXRfUG9zdHNjcmlwdF9OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZXRyaWV2ZSB0aGUgQVNDSUkgUG9zdFNjcmlwdCBuYW1lIG9mIGEgZ2l2ZW4gZmFjZSwgaWYgYXZhaWxhYmxlLiAgKi8KKyAgLyogICAgVGhpcyBvbmx5IHdvcmtzIHdpdGggUG9zdFNjcmlwdCBhbmQgVHJ1ZVR5cGUgZm9udHMuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBwb2ludGVyIHRvIHRoZSBmYWNlJ3MgUG9zdFNjcmlwdCBuYW1lLiAgTlVMTCBpZiB1bmF2YWlsYWJsZS4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIHJldHVybmVkIHBvaW50ZXIgaXMgb3duZWQgYnkgdGhlIGZhY2UgYW5kIGlzIGRlc3Ryb3llZCB3aXRoICAgICovCisgIC8qICAgIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBjb25zdCBjaGFyKiApCisgIEZUX0dldF9Qb3N0c2NyaXB0X05hbWUoIEZUX0ZhY2UgIGZhY2UgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1NlbGVjdF9DaGFybWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFNlbGVjdCBhIGdpdmVuIGNoYXJtYXAgYnkgaXRzIGVuY29kaW5nIHRhZyAoYXMgbGlzdGVkIGluICAgICAgICAgICAqLworICAvKiAgICBgZnJlZXR5cGUuaCcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBlbmNvZGluZyA6OiBBIGhhbmRsZSB0byB0aGUgc2VsZWN0ZWQgZW5jb2RpbmcuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgbm8gY2hhcm1hcCBpbiB0aGUgZmFjZSAgICAgICAgICAgKi8KKyAgLyogICAgY29ycmVzcG9uZHMgdG8gdGhlIGVuY29kaW5nIHF1ZXJpZWQgaGVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBCZWNhdXNlIG1hbnkgZm9udHMgY29udGFpbiBtb3JlIHRoYW4gYSBzaW5nbGUgY21hcCBmb3IgVW5pY29kZSAgICAgKi8KKyAgLyogICAgZW5jb2RpbmcsIHRoaXMgZnVuY3Rpb24gaGFzIHNvbWUgc3BlY2lhbCBjb2RlIHRvIHNlbGVjdCB0aGUgb25lICAgICovCisgIC8qICAgIHRoYXQgY292ZXJzIFVuaWNvZGUgYmVzdCAoYGJlc3QnIGluIHRoZSBzZW5zZSB0aGF0IGEgVUNTLTQgY21hcCBpcyAqLworICAvKiAgICBwcmVmZXJyZWQgdG8gYSBVQ1MtMiBjbWFwKS4gIEl0IGlzIHRodXMgcHJlZmVyYWJsZSB0byAgICAgICAgICAgICAgKi8KKyAgLyogICAgQEZUX1NldF9DaGFybWFwIGluIHRoaXMgY2FzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfU2VsZWN0X0NoYXJtYXAoIEZUX0ZhY2UgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgRlRfRW5jb2RpbmcgIGVuY29kaW5nICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TZXRfQ2hhcm1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTZWxlY3QgYSBnaXZlbiBjaGFybWFwIGZvciBjaGFyYWN0ZXIgY29kZSB0byBnbHlwaCBpbmRleCBtYXBwaW5nLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjaGFybWFwIDo6IEEgaGFuZGxlIHRvIHRoZSBzZWxlY3RlZCBjaGFybWFwLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIGNoYXJtYXAgaXMgbm90IHBhcnQgb2YgICAgICAgKi8KKyAgLyogICAgdGhlIGZhY2UgKGkuZS4sIGlmIGl0IGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGBmYWNlLT5jaGFybWFwcycgICAgICAgICovCisgIC8qICAgIHRhYmxlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSXQgYWxzbyBmYWlscyBpZiBhIHR5cGV+MTQgY2hhcm1hcCBpcyBzZWxlY3RlZC4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfU2V0X0NoYXJtYXAoIEZUX0ZhY2UgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICBGVF9DaGFyTWFwICBjaGFybWFwICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfR2V0X0NoYXJtYXBfSW5kZXgKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFJldHJpZXZlIGluZGV4IG9mIGEgZ2l2ZW4gY2hhcm1hcC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGNoYXJtYXAgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIGEgY2hhcm1hcC4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBUaGUgaW5kZXggaW50byB0aGUgYXJyYXkgb2YgY2hhcmFjdGVyIG1hcHMgd2l0aGluIHRoZSBmYWNlIHRvIHdoaWNoCisgICAqICAgYGNoYXJtYXAnIGJlbG9uZ3MuICBJZiBhbiBlcnJvciBvY2N1cnMsIC0xIGlzIHJldHVybmVkLgorICAgKgorICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9JbnQgKQorICBGVF9HZXRfQ2hhcm1hcF9JbmRleCggRlRfQ2hhck1hcCAgY2hhcm1hcCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2V0X0NoYXJfSW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmV0dXJuIHRoZSBnbHlwaCBpbmRleCBvZiBhIGdpdmVuIGNoYXJhY3RlciBjb2RlLiAgVGhpcyBmdW5jdGlvbiAgICovCisgIC8qICAgIHVzZXMgYSBjaGFybWFwIG9iamVjdCB0byBkbyB0aGUgbWFwcGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2hhcmNvZGUgOjogVGhlIGNoYXJhY3RlciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGdseXBoIGluZGV4LiAgMH5tZWFucyBgdW5kZWZpbmVkIGNoYXJhY3RlciBjb2RlJy4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSWYgeW91IHVzZSBGcmVlVHlwZSB0byBtYW5pcHVsYXRlIHRoZSBjb250ZW50cyBvZiBmb250IGZpbGVzICAgICAgICovCisgIC8qICAgIGRpcmVjdGx5LCBiZSBhd2FyZSB0aGF0IHRoZSBnbHlwaCBpbmRleCByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uICAqLworICAvKiAgICBkb2Vzbid0IGFsd2F5cyBjb3JyZXNwb25kIHRvIHRoZSBpbnRlcm5hbCBpbmRpY2VzIHVzZWQgd2l0aGluIHRoZSAgKi8KKyAgLyogICAgZmlsZS4gIFRoaXMgaXMgZG9uZSB0byBlbnN1cmUgdGhhdCB2YWx1ZX4wIGFsd2F5cyBjb3JyZXNwb25kcyB0byAgICovCisgIC8qICAgIHRoZSBgbWlzc2luZyBnbHlwaCcuICBJZiB0aGUgZmlyc3QgZ2x5cGggaXMgbm90IG5hbWVkIGAubm90ZGVmJywgICAqLworICAvKiAgICB0aGVuIGZvciBUeXBlfjEgYW5kIFR5cGV+NDIgZm9udHMsIGAubm90ZGVmJyB3aWxsIGJlIG1vdmVkIGludG8gICAgKi8KKyAgLyogICAgdGhlIGdseXBoIElEfjAgcG9zaXRpb24sIGFuZCB3aGF0ZXZlciB3YXMgdGhlcmUgd2lsbCBiZSBtb3ZlZCB0byAgICovCisgIC8qICAgIHRoZSBwb3NpdGlvbiBgLm5vdGRlZicgaGFkLiAgRm9yIFR5cGV+MSBmb250cywgaWYgdGhlcmUgaXMgbm8gICAgICAqLworICAvKiAgICBgLm5vdGRlZicgZ2x5cGggYXQgYWxsLCB0aGVuIG9uZSB3aWxsIGJlIGNyZWF0ZWQgYXQgaW5kZXh+MCBhbmQgICAgKi8KKyAgLyogICAgd2hhdGV2ZXIgd2FzIHRoZXJlIHdpbGwgYmUgbW92ZWQgdG8gdGhlIGxhc3QgaW5kZXggLS0gVHlwZX40MiAgICAgICovCisgIC8qICAgIGZvbnRzIGFyZSBjb25zaWRlcmVkIGludmFsaWQgdW5kZXIgdGhpcyBjb25kaXRpb24uICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9VSW50ICkKKyAgRlRfR2V0X0NoYXJfSW5kZXgoIEZUX0ZhY2UgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIGNoYXJjb2RlICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZXRfRmlyc3RfQ2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBmaXJzdCBjaGFyYWN0ZXIgY29kZSBpbiB0aGUgICAgKi8KKyAgLyogICAgY3VycmVudCBjaGFybWFwIG9mIGEgZ2l2ZW4gZmFjZS4gIEl0IGFsc28gcmV0dXJucyB0aGUgICAgICAgICAgICAgICovCisgIC8qICAgIGNvcnJlc3BvbmRpbmcgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFnaW5kZXggOjogR2x5cGggaW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIGNvZGUuICAwfmlmIGNoYXJtYXAgaXMgICAqLworICAvKiAgICAgICAgICAgICAgIGVtcHR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgY2hhcm1hcCdzIGZpcnN0IGNoYXJhY3RlciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBZb3Ugc2hvdWxkIHVzZSB0aGlzIGZ1bmN0aW9uIHdpdGggQEZUX0dldF9OZXh0X0NoYXIgdG8gYmUgYWJsZSB0byAgKi8KKyAgLyogICAgcGFyc2UgYWxsIGNoYXJhY3RlciBjb2RlcyBhdmFpbGFibGUgaW4gYSBnaXZlbiBjaGFybWFwLiAgVGhlIGNvZGUgICovCisgIC8qICAgIHNob3VsZCBsb29rIGxpa2UgdGhpczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgRlRfVUxvbmcgIGNoYXJjb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIEZUX1VJbnQgICBnaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIGNoYXJjb2RlID0gRlRfR2V0X0ZpcnN0X0NoYXIoIGZhY2UsICZnaW5kZXggKTsgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICB3aGlsZSAoIGdpbmRleCAhPSAwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgLi4uIGRvIHNvbWV0aGluZyB3aXRoIChjaGFyY29kZSxnaW5kZXgpIHBhaXIgLi4uICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICBjaGFyY29kZSA9IEZUX0dldF9OZXh0X0NoYXIoIGZhY2UsIGNoYXJjb2RlLCAmZ2luZGV4ICk7ICAgICAgICAqLworICAvKiAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBCZSBhd2FyZSB0aGF0IGNoYXJhY3RlciBjb2RlcyBjYW4gaGF2ZSB2YWx1ZXMgdXAgdG8gMHhGRkZGRkZGRjsgICAgKi8KKyAgLyogICAgdGhpcyBtaWdodCBoYXBwZW4gZm9yIG5vbi1Vbmljb2RlIG9yIG1hbGZvcm1lZCBjbWFwcy4gIEhvd2V2ZXIsICAgICovCisgIC8qICAgIGV2ZW4gd2l0aCByZWd1bGFyIFVuaWNvZGUgZW5jb2RpbmcsIHNvLWNhbGxlZCBgbGFzdCByZXNvcnQgZm9udHMnICAqLworICAvKiAgICAodXNpbmcgU0ZOVCBjbWFwIGZvcm1hdCAxMywgc2VlIGZ1bmN0aW9uIEBGVF9HZXRfQ01hcF9Gb3JtYXQpICAgICAgKi8KKyAgLyogICAgbm9ybWFsbHkgaGF2ZSBlbnRyaWVzIGZvciBhbGwgVW5pY29kZSBjaGFyYWN0ZXJzIHVwIHRvIDB4MUZGRkZGLCAgICovCisgIC8qICAgIHdoaWNoIGNhbiBjYXVzZSAqYSBsb3QqIG9mIGl0ZXJhdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTm90ZSB0aGF0IGAqYWdpbmRleCcgaXMgc2V0IHRvfjAgaWYgdGhlIGNoYXJtYXAgaXMgZW1wdHkuICBUaGUgICAgICovCisgIC8qICAgIHJlc3VsdCBpdHNlbGYgY2FuIGJlfjAgaW4gdHdvIGNhc2VzOiBpZiB0aGUgY2hhcm1hcCBpcyBlbXB0eSBvciAgICAqLworICAvKiAgICBpZiB0aGUgdmFsdWV+MCBpcyB0aGUgZmlyc3QgdmFsaWQgY2hhcmFjdGVyIGNvZGUuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfVUxvbmcgKQorICBGVF9HZXRfRmlyc3RfQ2hhciggRlRfRmFjZSAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAqYWdpbmRleCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2V0X05leHRfQ2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHVybiB0aGUgbmV4dCBjaGFyYWN0ZXIgY29kZSBpbiB0aGUgICAgICovCisgIC8qICAgIGN1cnJlbnQgY2hhcm1hcCBvZiBhIGdpdmVuIGZhY2UgZm9sbG93aW5nIHRoZSB2YWx1ZSBgY2hhcl9jb2RlJywgICAqLworICAvKiAgICBhcyB3ZWxsIGFzIHRoZSBjb3JyZXNwb25kaW5nIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2hhcl9jb2RlIDo6IFRoZSBzdGFydGluZyBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYWdpbmRleCAgIDo6IEdseXBoIGluZGV4IG9mIG5leHQgY2hhcmFjdGVyIGNvZGUuICAwfmlmIGNoYXJtYXAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICBpcyBlbXB0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBjaGFybWFwJ3MgbmV4dCBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFlvdSBzaG91bGQgdXNlIHRoaXMgZnVuY3Rpb24gd2l0aCBARlRfR2V0X0ZpcnN0X0NoYXIgdG8gd2FsayAgICAgICAqLworICAvKiAgICBvdmVyIGFsbCBjaGFyYWN0ZXIgY29kZXMgYXZhaWxhYmxlIGluIGEgZ2l2ZW4gY2hhcm1hcC4gIFNlZSB0aGUgICAgKi8KKyAgLyogICAgbm90ZSBmb3IgdGhpcyBmdW5jdGlvbiBmb3IgYSBzaW1wbGUgY29kZSBleGFtcGxlLiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBOb3RlIHRoYXQgYCphZ2luZGV4JyBpcyBzZXQgdG9+MCB3aGVuIHRoZXJlIGFyZSBubyBtb3JlIGNvZGVzIGluICAgKi8KKyAgLyogICAgdGhlIGNoYXJtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX1VMb25nICkKKyAgRlRfR2V0X05leHRfQ2hhciggRlRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGNoYXJfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICphZ2luZGV4ICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZXRfTmFtZV9JbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZXR1cm4gdGhlIGdseXBoIGluZGV4IG9mIGEgZ2l2ZW4gZ2x5cGggbmFtZS4gIFRoaXMgZnVuY3Rpb24gdXNlcyAgKi8KKyAgLyogICAgZHJpdmVyIHNwZWNpZmljIG9iamVjdHMgdG8gZG8gdGhlIHRyYW5zbGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnbHlwaF9uYW1lIDo6IFRoZSBnbHlwaCBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgZ2x5cGggaW5kZXguICAwfm1lYW5zIGB1bmRlZmluZWQgY2hhcmFjdGVyIGNvZGUnLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfVUludCApCisgIEZUX0dldF9OYW1lX0luZGV4KCBGVF9GYWNlICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgRlRfU3RyaW5nKiAgZ2x5cGhfbmFtZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX1NVQkdMWVBIX0ZMQUdfWFhYCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIGxpc3Qgb2YgY29uc3RhbnRzIHVzZWQgdG8gZGVzY3JpYmUgc3ViZ2x5cGhzLiAgUGxlYXNlIHJlZmVyIHRvIHRoZQorICAgKiAgIFRydWVUeXBlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBtZWFuaW5nIG9mIHRoZSB2YXJpb3VzIGZsYWdzLgorICAgKgorICAgKiBAdmFsdWVzOgorICAgKiAgIEZUX1NVQkdMWVBIX0ZMQUdfQVJHU19BUkVfV09SRFMgOjoKKyAgICogICBGVF9TVUJHTFlQSF9GTEFHX0FSR1NfQVJFX1hZX1ZBTFVFUyA6OgorICAgKiAgIEZUX1NVQkdMWVBIX0ZMQUdfUk9VTkRfWFlfVE9fR1JJRCA6OgorICAgKiAgIEZUX1NVQkdMWVBIX0ZMQUdfU0NBTEUgOjoKKyAgICogICBGVF9TVUJHTFlQSF9GTEFHX1hZX1NDQUxFIDo6CisgICAqICAgRlRfU1VCR0xZUEhfRkxBR18yWDIgOjoKKyAgICogICBGVF9TVUJHTFlQSF9GTEFHX1VTRV9NWV9NRVRSSUNTIDo6CisgICAqCisgICAqLworI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHX0FSR1NfQVJFX1dPUkRTICAgICAgICAgIDEKKyNkZWZpbmUgRlRfU1VCR0xZUEhfRkxBR19BUkdTX0FSRV9YWV9WQUxVRVMgICAgICAyCisjZGVmaW5lIEZUX1NVQkdMWVBIX0ZMQUdfUk9VTkRfWFlfVE9fR1JJRCAgICAgICAgNAorI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHX1NDQUxFICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgRlRfU1VCR0xZUEhfRkxBR19YWV9TQ0FMRSAgICAgICAgICAgICAweDQwCisjZGVmaW5lIEZUX1NVQkdMWVBIX0ZMQUdfMlgyICAgICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHX1VTRV9NWV9NRVRSSUNTICAgICAgMHgyMDAKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jOgorICAgKiAgIEZUX0dldF9TdWJHbHlwaF9JbmZvCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZXRyaWV2ZSBhIGRlc2NyaXB0aW9uIG9mIGEgZ2l2ZW4gc3ViZ2x5cGguICBPbmx5IHVzZSBpdCBpZgorICAgKiAgIGBnbHlwaC0+Zm9ybWF0JyBpcyBARlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURTsgYW4gZXJyb3IgaXMKKyAgICogICByZXR1cm5lZCBvdGhlcndpc2UuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBnbHlwaCA6OgorICAgKiAgICAgVGhlIHNvdXJjZSBnbHlwaCBzbG90LgorICAgKgorICAgKiAgIHN1Yl9pbmRleCA6OgorICAgKiAgICAgVGhlIGluZGV4IG9mIHRoZSBzdWJnbHlwaC4gIE11c3QgYmUgbGVzcyB0aGFuCisgICAqICAgICBgZ2x5cGgtPm51bV9zdWJnbHlwaHMnLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIHBfaW5kZXggOjoKKyAgICogICAgIFRoZSBnbHlwaCBpbmRleCBvZiB0aGUgc3ViZ2x5cGguCisgICAqCisgICAqICAgcF9mbGFncyA6OgorICAgKiAgICAgVGhlIHN1YmdseXBoIGZsYWdzLCBzZWUgQEZUX1NVQkdMWVBIX0ZMQUdfWFhYLgorICAgKgorICAgKiAgIHBfYXJnMSA6OgorICAgKiAgICAgVGhlIHN1YmdseXBoJ3MgZmlyc3QgYXJndW1lbnQgKGlmIGFueSkuCisgICAqCisgICAqICAgcF9hcmcyIDo6CisgICAqICAgICBUaGUgc3ViZ2x5cGgncyBzZWNvbmQgYXJndW1lbnQgKGlmIGFueSkuCisgICAqCisgICAqICAgcF90cmFuc2Zvcm0gOjoKKyAgICogICAgIFRoZSBzdWJnbHlwaCB0cmFuc2Zvcm1hdGlvbiAoaWYgYW55KS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGUgdmFsdWVzIG9mIGAqcF9hcmcxJywgYCpwX2FyZzInLCBhbmQgYCpwX3RyYW5zZm9ybScgbXVzdCBiZQorICAgKiAgIGludGVycHJldGVkIGRlcGVuZGluZyBvbiB0aGUgZmxhZ3MgcmV0dXJuZWQgaW4gYCpwX2ZsYWdzJy4gIFNlZSB0aGUKKyAgICogICBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgorICAgKgorICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX0dldF9TdWJHbHlwaF9JbmZvKCBGVF9HbHlwaFNsb3QgIGdseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBzdWJfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgKnBfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgKnBfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgKnBfYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAqcF9hcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWF0cml4ICAgICpwX3RyYW5zZm9ybSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRlNUWVBFX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBsaXN0IG9mIGJpdCBmbGFncyB1c2VkIGluIHRoZSBgZnNUeXBlJyBmaWVsZCBvZiB0aGUgT1MvMiB0YWJsZSAgICovCisgIC8qICAgIGluIGEgVHJ1ZVR5cGUgb3IgT3BlblR5cGUgZm9udCBhbmQgdGhlIGBGU1R5cGUnIGVudHJ5IGluIGEgICAgICAgICAqLworICAvKiAgICBQb3N0U2NyaXB0IGZvbnQuICBUaGVzZSBiaXQgZmxhZ3MgYXJlIHJldHVybmVkIGJ5ICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQEZUX0dldF9GU1R5cGVfRmxhZ3M7IHRoZXkgaW5mb3JtIGNsaWVudCBhcHBsaWNhdGlvbnMgb2YgZW1iZWRkaW5nICovCisgIC8qICAgIGFuZCBzdWJzZXR0aW5nIHJlc3RyaWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBmb250LiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2VlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGh0dHA6Ly93d3cuYWRvYmUuY29tL2NvbnRlbnQvZGFtL0Fkb2JlL2VuL2Rldm5ldC9hY3JvYmF0L3BkZnMvRm9udFBvbGljaWVzLnBkZiAqLworICAvKiAgICBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GU1RZUEVfSU5TVEFMTEFCTEVfRU1CRURESU5HIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBGb250cyB3aXRoIG5vIGZzVHlwZSBiaXQgc2V0IG1heSBiZSBlbWJlZGRlZCBhbmQgcGVybWFuZW50bHkgICAgICovCisgIC8qICAgICAgaW5zdGFsbGVkIG9uIHRoZSByZW1vdGUgc3lzdGVtIGJ5IGFuIGFwcGxpY2F0aW9uLiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRlNUWVBFX1JFU1RSSUNURURfTElDRU5TRV9FTUJFRERJTkcgOjogICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgRm9udHMgdGhhdCBoYXZlIG9ubHkgdGhpcyBiaXQgc2V0IG11c3Qgbm90IGJlIG1vZGlmaWVkLCBlbWJlZGRlZCAqLworICAvKiAgICAgIG9yIGV4Y2hhbmdlZCBpbiBhbnkgbWFubmVyIHdpdGhvdXQgZmlyc3Qgb2J0YWluaW5nIHBlcm1pc3Npb24gb2YgKi8KKyAgLyogICAgICB0aGUgZm9udCBzb2Z0d2FyZSBjb3B5cmlnaHQgb3duZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GU1RZUEVfUFJFVklFV19BTkRfUFJJTlRfRU1CRURESU5HIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZSBmb250IG1heSBiZSBlbWJlZGRlZCBhbmQgdGVtcG9yYXJpbHkgICAgICovCisgIC8qICAgICAgbG9hZGVkIG9uIHRoZSByZW1vdGUgc3lzdGVtLiAgRG9jdW1lbnRzIGNvbnRhaW5pbmcgUHJldmlldyAmICAgICAqLworICAvKiAgICAgIFByaW50IGZvbnRzIG11c3QgYmUgb3BlbmVkIGByZWFkLW9ubHknOyBubyBlZGl0cyBjYW4gYmUgYXBwbGllZCAgKi8KKyAgLyogICAgICB0byB0aGUgZG9jdW1lbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GU1RZUEVfRURJVEFCTEVfRU1CRURESU5HIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZSBmb250IG1heSBiZSBlbWJlZGRlZCBidXQgbXVzdCBvbmx5IGJlICAgICovCisgIC8qICAgICAgaW5zdGFsbGVkIHRlbXBvcmFyaWx5IG9uIG90aGVyIHN5c3RlbXMuICBJbiBjb250cmFzdCB0byBQcmV2aWV3ICAqLworICAvKiAgICAgICYgUHJpbnQgZm9udHMsIGRvY3VtZW50cyBjb250YWluaW5nIGVkaXRhYmxlIGZvbnRzIG1heSBiZSBvcGVuZWQgKi8KKyAgLyogICAgICBmb3IgcmVhZGluZywgZWRpdGluZyBpcyBwZXJtaXR0ZWQsIGFuZCBjaGFuZ2VzIG1heSBiZSBzYXZlZC4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GU1RZUEVfTk9fU1VCU0VUVElORyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBJZiB0aGlzIGJpdCBpcyBzZXQsIHRoZSBmb250IG1heSBub3QgYmUgc3Vic2V0dGVkIHByaW9yIHRvICAgICAgICovCisgIC8qICAgICAgZW1iZWRkaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRlNUWVBFX0JJVE1BUF9FTUJFRERJTkdfT05MWSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgSWYgdGhpcyBiaXQgaXMgc2V0LCBvbmx5IGJpdG1hcHMgY29udGFpbmVkIGluIHRoZSBmb250IG1heSBiZSAgICAqLworICAvKiAgICAgIGVtYmVkZGVkOyBubyBvdXRsaW5lIGRhdGEgbWF5IGJlIGVtYmVkZGVkLiAgSWYgdGhlcmUgYXJlIG5vICAgICAgKi8KKyAgLyogICAgICBiaXRtYXBzIGF2YWlsYWJsZSBpbiB0aGUgZm9udCwgdGhlbiB0aGUgZm9udCBpcyB1bmVtYmVkZGFibGUuICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGZsYWdzIGFyZSBPUmVkIHRvZ2V0aGVyLCB0aHVzIG1vcmUgdGhhbiBhIHNpbmdsZSB2YWx1ZSBjYW4gYmUgICovCisgIC8qICAgIHJldHVybmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgV2hpbGUgdGhlIGZzVHlwZSBmbGFncyBjYW4gaW5kaWNhdGUgdGhhdCBhIGZvbnQgbWF5IGJlIGVtYmVkZGVkLCBhICovCisgIC8qICAgIGxpY2Vuc2Ugd2l0aCB0aGUgZm9udCB2ZW5kb3IgbWF5IGJlIHNlcGFyYXRlbHkgcmVxdWlyZWQgdG8gdXNlIHRoZSAqLworICAvKiAgICBmb250IGluIHRoaXMgd2F5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX0ZTVFlQRV9JTlNUQUxMQUJMRV9FTUJFRERJTkcgICAgICAgICAweDAwMDAKKyNkZWZpbmUgRlRfRlNUWVBFX1JFU1RSSUNURURfTElDRU5TRV9FTUJFRERJTkcgIDB4MDAwMgorI2RlZmluZSBGVF9GU1RZUEVfUFJFVklFV19BTkRfUFJJTlRfRU1CRURESU5HICAgMHgwMDA0CisjZGVmaW5lIEZUX0ZTVFlQRV9FRElUQUJMRV9FTUJFRERJTkcgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgRlRfRlNUWVBFX05PX1NVQlNFVFRJTkcgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBGVF9GU1RZUEVfQklUTUFQX0VNQkVERElOR19PTkxZICAgICAgICAgMHgwMjAwCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZXRfRlNUeXBlX0ZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZXR1cm4gdGhlIGZzVHlwZSBmbGFncyBmb3IgYSBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgZnNUeXBlIGZsYWdzLCBARlRfRlNUWVBFX1hYWC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBVc2UgdGhpcyBmdW5jdGlvbiByYXRoZXIgdGhhbiBkaXJlY3RseSByZWFkaW5nIHRoZSBgZnNfdHlwZScgZmllbGQgKi8KKyAgLyogICAgaW4gdGhlIEBQU19Gb250SW5mb1JlYyBzdHJ1Y3R1cmUsIHdoaWNoIGlzIG9ubHkgZ3VhcmFudGVlZCB0byAgICAgICovCisgIC8qICAgIHJldHVybiB0aGUgY29ycmVjdCByZXN1bHRzIGZvciBUeXBlfjEgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFNpbmNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIDIuMy44ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9VU2hvcnQgKQorICBGVF9HZXRfRlNUeXBlX0ZsYWdzKCBGVF9GYWNlICBmYWNlICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnbHlwaF92YXJpYW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBHbHlwaCBWYXJpYW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgRnJlZVR5cGV+MiBpbnRlcmZhY2UgdG8gVW5pY29kZSBJZGVvZ3JhcGhpYyBWYXJpYXRpb24gICAgICAgICAgKi8KKyAgLyogICAgU2VxdWVuY2VzIChJVlMpLCB1c2luZyB0aGUgU0ZOVCBjbWFwIGZvcm1hdH4xNC4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTWFueSBDSksgY2hhcmFjdGVycyBoYXZlIHZhcmlhbnQgZm9ybXMuICBUaGV5IGFyZSBhIHNvcnQgb2YgZ3JleSAgICovCisgIC8qICAgIGFyZWEgc29tZXdoZXJlIGJldHdlZW4gYmVpbmcgdG90YWxseSBpcnJlbGV2YW50IGFuZCBzZW1hbnRpY2FsbHkgICAqLworICAvKiAgICBkaXN0aW5jdDsgZm9yIHRoaXMgcmVhc29uLCB0aGUgVW5pY29kZSBjb25zb3J0aXVtIGRlY2lkZWQgdG8gICAgICAgKi8KKyAgLyogICAgaW50cm9kdWNlIElkZW9ncmFwaGljIFZhcmlhdGlvbiBTZXF1ZW5jZXMgKElWUyksIGNvbnNpc3Rpbmcgb2YgYSAgICovCisgIC8qICAgIFVuaWNvZGUgYmFzZSBjaGFyYWN0ZXIgYW5kIG9uZSBvZiAyNDAgdmFyaWFudCBzZWxlY3RvcnMgICAgICAgICAgICAqLworICAvKiAgICAoVStFMDEwMC1VK0UwMUVGKSwgaW5zdGVhZCBvZiBmdXJ0aGVyIGV4dGVuZGluZyB0aGUgYWxyZWFkeSBodWdlICAgKi8KKyAgLyogICAgY29kZSByYW5nZSBmb3IgQ0pLIGNoYXJhY3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbiBJVlMgaXMgcmVnaXN0ZXJlZCBhbmQgdW5pcXVlOyBmb3IgZnVydGhlciBkZXRhaWxzIHBsZWFzZSByZWZlciAgKi8KKyAgLyogICAgdG8gVW5pY29kZSBUZWNobmljYWwgU3RhbmRhcmQgIzM3LCB0aGUgSWRlb2dyYXBoaWMgVmFyaWF0aW9uICAgICAgICovCisgIC8qICAgIERhdGFiYXNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIzNy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUbyBkYXRlIChOb3ZlbWJlciAyMDE0KSwgdGhlIGNoYXJhY3RlciB3aXRoIHRoZSBtb3N0IHZhcmlhbnRzIGlzICAgKi8KKyAgLyogICAgVSs5MDg5LCBoYXZpbmcgMzIgc3VjaCBJVlMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBZG9iZSBhbmQgTVMgZGVjaWRlZCB0byBzdXBwb3J0IElWUyB3aXRoIGEgbmV3IGNtYXAgc3VidGFibGUgICAgICAgKi8KKyAgLyogICAgKGZvcm1hdH4xNCkuICBJdCBpcyBhbiBvZGQgc3VidGFibGUgYmVjYXVzZSBpdCBpcyBub3QgYSBtYXBwaW5nIG9mICovCisgIC8qICAgIGlucHV0IGNvZGUgcG9pbnRzIHRvIGdseXBocywgYnV0IGNvbnRhaW5zIGxpc3RzIG9mIGFsbCB2YXJpYW50cyAgICAqLworICAvKiAgICBzdXBwb3J0ZWQgYnkgdGhlIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgdmFyaWFudCBtYXkgYmUgZWl0aGVyIGBkZWZhdWx0JyBvciBgbm9uLWRlZmF1bHQnLiAgQSBkZWZhdWx0ICAgICAqLworICAvKiAgICB2YXJpYW50IGlzIHRoZSBvbmUgeW91IHdpbGwgZ2V0IGZvciB0aGF0IGNvZGUgcG9pbnQgaWYgeW91IGxvb2sgaXQgKi8KKyAgLyogICAgdXAgaW4gdGhlIHN0YW5kYXJkIFVuaWNvZGUgY21hcC4gIEEgbm9uLWRlZmF1bHQgdmFyaWFudCBpcyBhICAgICAgICovCisgIC8qICAgIGRpZmZlcmVudCBnbHlwaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GYWNlX0dldENoYXJWYXJpYW50SW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZXR1cm4gdGhlIGdseXBoIGluZGV4IG9mIGEgZ2l2ZW4gY2hhcmFjdGVyIGNvZGUgYXMgbW9kaWZpZWQgYnkgICAgKi8KKyAgLyogICAgdGhlIHZhcmlhdGlvbiBzZWxlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2hhcmNvZGUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgVGhlIGNoYXJhY3RlciBjb2RlIHBvaW50IGluIFVuaWNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdmFyaWFudFNlbGVjdG9yIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgVGhlIFVuaWNvZGUgY29kZSBwb2ludCBvZiB0aGUgdmFyaWF0aW9uIHNlbGVjdG9yLiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBnbHlwaCBpbmRleC4gIDB+bWVhbnMgZWl0aGVyIGB1bmRlZmluZWQgY2hhcmFjdGVyIGNvZGUnLCBvciAgICAqLworICAvKiAgICBgdW5kZWZpbmVkIHNlbGVjdG9yIGNvZGUnLCBvciBgbm8gdmFyaWF0aW9uIHNlbGVjdG9yIGNtYXAgICAgICAgICAgKi8KKyAgLyogICAgc3VidGFibGUnLCBvciBgY3VycmVudCBDaGFyTWFwIGlzIG5vdCBVbmljb2RlJy4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSWYgeW91IHVzZSBGcmVlVHlwZSB0byBtYW5pcHVsYXRlIHRoZSBjb250ZW50cyBvZiBmb250IGZpbGVzICAgICAgICovCisgIC8qICAgIGRpcmVjdGx5LCBiZSBhd2FyZSB0aGF0IHRoZSBnbHlwaCBpbmRleCByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uICAqLworICAvKiAgICBkb2Vzbid0IGFsd2F5cyBjb3JyZXNwb25kIHRvIHRoZSBpbnRlcm5hbCBpbmRpY2VzIHVzZWQgd2l0aGluICAgICAgKi8KKyAgLyogICAgdGhlIGZpbGUuICBUaGlzIGlzIGRvbmUgdG8gZW5zdXJlIHRoYXQgdmFsdWV+MCBhbHdheXMgY29ycmVzcG9uZHMgICovCisgIC8qICAgIHRvIHRoZSBgbWlzc2luZyBnbHlwaCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IG1lYW5pbmdmdWwgaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgYSkgdGhlIGZvbnQgaGFzIGEgdmFyaWF0aW9uIHNlbGVjdG9yIGNtYXAgc3ViIHRhYmxlLCAgICAgICAgICAgICAqLworICAvKiAgICBhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBiKSB0aGUgY3VycmVudCBjaGFybWFwIGhhcyBhIFVuaWNvZGUgZW5jb2RpbmcuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U2luY2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgMi4zLjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX1VJbnQgKQorICBGVF9GYWNlX0dldENoYXJWYXJpYW50SW5kZXgoIEZUX0ZhY2UgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBjaGFyY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgdmFyaWFudFNlbGVjdG9yICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GYWNlX0dldENoYXJWYXJpYW50SXNEZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDaGVjayB3aGV0aGVyIHRoaXMgdmFyaWFudCBvZiB0aGlzIFVuaWNvZGUgY2hhcmFjdGVyIGlzIHRoZSBvbmUgdG8gKi8KKyAgLyogICAgYmUgZm91bmQgaW4gdGhlIGBjbWFwJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2hhcmNvZGUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgVGhlIGNoYXJhY3RlciBjb2RlcG9pbnQgaW4gVW5pY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdmFyaWFudFNlbGVjdG9yIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgVGhlIFVuaWNvZGUgY29kZXBvaW50IG9mIHRoZSB2YXJpYXRpb24gc2VsZWN0b3IuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIDF+aWYgZm91bmQgaW4gdGhlIHN0YW5kYXJkIChVbmljb2RlKSBjbWFwLCAwfmlmIGZvdW5kIGluIHRoZSAgICAgICAqLworICAvKiAgICB2YXJpYXRpb24gc2VsZWN0b3IgY21hcCwgb3IgLTEgaWYgaXQgaXMgbm90IGEgdmFyaWFudC4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgbWVhbmluZ2Z1bCBpZiB0aGUgZm9udCBoYXMgYSB2YXJpYXRpb24gICAgICAgKi8KKyAgLyogICAgc2VsZWN0b3IgY21hcCBzdWJ0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U2luY2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgMi4zLjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0ludCApCisgIEZUX0ZhY2VfR2V0Q2hhclZhcmlhbnRJc0RlZmF1bHQoIEZUX0ZhY2UgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgY2hhcmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICB2YXJpYW50U2VsZWN0b3IgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZhY2VfR2V0VmFyaWFudFNlbGVjdG9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJldHVybiBhIHplcm8tdGVybWluYXRlZCBsaXN0IG9mIFVuaWNvZGUgdmFyaWFudCBzZWxlY3RvcnMgZm91bmQgICAqLworICAvKiAgICBpbiB0aGUgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHNlbGVjdG9yIGNvZGUgcG9pbnRzLCBvciBOVUxMIGlmIHRoZXJlIGlzICovCisgIC8qICAgIG5vIHZhbGlkIHZhcmlhbnQgc2VsZWN0b3IgY21hcCBzdWJ0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBsYXN0IGl0ZW0gaW4gdGhlIGFycmF5IGlzfjA7IHRoZSBhcnJheSBpcyBvd25lZCBieSB0aGUgICAgICAgICAqLworICAvKiAgICBARlRfRmFjZSBvYmplY3QgYnV0IGNhbiBiZSBvdmVyd3JpdHRlbiBvciByZWxlYXNlZCBvbiB0aGUgbmV4dCAgICAgKi8KKyAgLyogICAgY2FsbCB0byBhIEZyZWVUeXBlIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U2luY2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgMi4zLjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX1VJbnQzMiogKQorICBGVF9GYWNlX0dldFZhcmlhbnRTZWxlY3RvcnMoIEZUX0ZhY2UgIGZhY2UgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZhY2VfR2V0VmFyaWFudHNPZkNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJldHVybiBhIHplcm8tdGVybWluYXRlZCBsaXN0IG9mIFVuaWNvZGUgdmFyaWFudCBzZWxlY3RvcnMgZm91bmQgICAqLworICAvKiAgICBmb3IgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjaGFyY29kZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBUaGUgY2hhcmFjdGVyIGNvZGVwb2ludCBpbiBVbmljb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHZhcmlhbnQgc2VsZWN0b3IgY29kZSBwb2ludHMgdGhhdCBhcmUgICAgICovCisgIC8qICAgIGFjdGl2ZSBmb3IgdGhlIGdpdmVuIGNoYXJhY3Rlciwgb3IgTlVMTCBpZiB0aGUgY29ycmVzcG9uZGluZyBsaXN0ICAqLworICAvKiAgICBpcyBlbXB0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgbGFzdCBpdGVtIGluIHRoZSBhcnJheSBpc34wOyB0aGUgYXJyYXkgaXMgb3duZWQgYnkgdGhlICAgICAgICAgKi8KKyAgLyogICAgQEZUX0ZhY2Ugb2JqZWN0IGJ1dCBjYW4gYmUgb3ZlcndyaXR0ZW4gb3IgcmVsZWFzZWQgb24gdGhlIG5leHQgICAgICovCisgIC8qICAgIGNhbGwgdG8gYSBGcmVlVHlwZSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFNpbmNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIDIuMy42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9VSW50MzIqICkKKyAgRlRfRmFjZV9HZXRWYXJpYW50c09mQ2hhciggRlRfRmFjZSAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBjaGFyY29kZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRmFjZV9HZXRDaGFyc09mVmFyaWFudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmV0dXJuIGEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgVW5pY29kZSBjaGFyYWN0ZXIgY29kZXMgZm91bmQgZm9yICovCisgIC8qICAgIHRoZSBzcGVjaWZpZWQgdmFyaWFudCBzZWxlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHZhcmlhbnRTZWxlY3RvciA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIFRoZSB2YXJpYW50IHNlbGVjdG9yIGNvZGUgcG9pbnQgaW4gVW5pY29kZS4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGxpc3Qgb2YgYWxsIHRoZSBjb2RlIHBvaW50cyB0aGF0IGFyZSBzcGVjaWZpZWQgYnkgdGhpcyBzZWxlY3RvciAgKi8KKyAgLyogICAgKGJvdGggZGVmYXVsdCBhbmQgbm9uLWRlZmF1bHQgY29kZXMgYXJlIHJldHVybmVkKSBvciBOVUxMIGlmIHRoZXJlICovCisgIC8qICAgIGlzIG5vIHZhbGlkIGNtYXAgb3IgdGhlIHZhcmlhbnQgc2VsZWN0b3IgaXMgaW52YWxpZC4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBsYXN0IGl0ZW0gaW4gdGhlIGFycmF5IGlzfjA7IHRoZSBhcnJheSBpcyBvd25lZCBieSB0aGUgICAgICAgICAqLworICAvKiAgICBARlRfRmFjZSBvYmplY3QgYnV0IGNhbiBiZSBvdmVyd3JpdHRlbiBvciByZWxlYXNlZCBvbiB0aGUgbmV4dCAgICAgKi8KKyAgLyogICAgY2FsbCB0byBhIEZyZWVUeXBlIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U2luY2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgMi4zLjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX1VJbnQzMiogKQorICBGVF9GYWNlX0dldENoYXJzT2ZWYXJpYW50KCBGVF9GYWNlICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIHZhcmlhbnRTZWxlY3RvciApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY29tcHV0YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ29tcHV0YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ3J1bmNoaW5nIGZpeGVkIG51bWJlcnMgYW5kIHZlY3RvcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHZhcmlvdXMgZnVuY3Rpb25zIHVzZWQgdG8gcGVyZm9ybSAgICAgICAgICAgICovCisgIC8qICAgIGNvbXB1dGF0aW9ucyBvbiAxNi4xNiBmaXhlZC1mbG9hdCBudW1iZXJzIG9yIDJkIHZlY3RvcnMuICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE9yZGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX011bERpdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9NdWxGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRGl2Rml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1JvdW5kRml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9DZWlsRml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRmxvb3JGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1ZlY3Rvcl9UcmFuc2Zvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9NYXRyaXhfTXVsdGlwbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTWF0cml4X0ludmVydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX011bERpdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgdmVyeSBzaW1wbGUgZnVuY3Rpb24gdXNlZCB0byBwZXJmb3JtIHRoZSBjb21wdXRhdGlvbiBgKGEqYikvYycgICAqLworICAvKiAgICB3aXRoIG1heGltdW0gYWNjdXJhY3kgKGl0IHVzZXMgYSA2NC1iaXQgaW50ZXJtZWRpYXRlIGludGVnZXIgICAgICAgKi8KKyAgLyogICAgd2hlbmV2ZXIgbmVjZXNzYXJ5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzbid0IG5lY2Vzc2FyaWx5IGFzIGZhc3QgYXMgc29tZSBwcm9jZXNzb3Igc3BlY2lmaWMgKi8KKyAgLyogICAgb3BlcmF0aW9ucywgYnV0IGlzIGF0IGxlYXN0IGNvbXBsZXRlbHkgcG9ydGFibGUuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYSA6OiBUaGUgZmlyc3QgbXVsdGlwbGllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGIgOjogVGhlIHNlY29uZCBtdWx0aXBsaWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjIDo6IFRoZSBkaXZpc29yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgcmVzdWx0IG9mIGAoYSpiKS9jJy4gIFRoaXMgZnVuY3Rpb24gbmV2ZXIgdHJhcHMgd2hlbiB0cnlpbmcgdG8gKi8KKyAgLyogICAgZGl2aWRlIGJ5IHplcm87IGl0IHNpbXBseSByZXR1cm5zIGBNYXhJbnQnIG9yIGBNaW5JbnQnIGRlcGVuZGluZyAgICovCisgIC8qICAgIG9uIHRoZSBzaWducyBvZiBgYScgYW5kIGBiJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9Mb25nICkKKyAgRlRfTXVsRGl2KCBGVF9Mb25nICBhLAorICAgICAgICAgICAgIEZUX0xvbmcgIGIsCisgICAgICAgICAgICAgRlRfTG9uZyAgYyApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTXVsRml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSB2ZXJ5IHNpbXBsZSBmdW5jdGlvbiB1c2VkIHRvIHBlcmZvcm0gdGhlIGNvbXB1dGF0aW9uICAgICAgICAgICAgICovCisgIC8qICAgIGAoYSpiKS8weDEwMDAwJyB3aXRoIG1heGltdW0gYWNjdXJhY3kuICBNb3N0IG9mIHRoZSB0aW1lIHRoaXMgaXMgICAqLworICAvKiAgICB1c2VkIHRvIG11bHRpcGx5IGEgZ2l2ZW4gdmFsdWUgYnkgYSAxNi4xNiBmaXhlZC1wb2ludCBmYWN0b3IuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhIDo6IFRoZSBmaXJzdCBtdWx0aXBsaWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYiA6OiBUaGUgc2Vjb25kIG11bHRpcGxpZXIuICBVc2UgYSAxNi4xNiBmYWN0b3IgaGVyZSB3aGVuZXZlciAgICAgICovCisgIC8qICAgICAgICAgcG9zc2libGUgKHNlZSBub3RlIGJlbG93KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSByZXN1bHQgb2YgYChhKmIpLzB4MTAwMDAnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gb3B0aW1pemVkIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgYWJzb2x1dGUgICAqLworICAvKiAgICB2YWx1ZSBvZiBgYScgaXMgbGVzcyB0aGFuIDIwNDgsIGFuZCBgYicgaXMgYSAxNi4xNiBzY2FsaW5nIGZhY3Rvci4gKi8KKyAgLyogICAgQXMgdGhpcyBoYXBwZW5zIG1haW5seSB3aGVuIHNjYWxpbmcgZnJvbSBub3Rpb25hbCB1bml0cyB0byAgICAgICAgICovCisgIC8qICAgIGZyYWN0aW9uYWwgcGl4ZWxzIGluIEZyZWVUeXBlLCBpdCByZXN1bHRlZCBpbiBub3RpY2VhYmxlIHNwZWVkICAgICAqLworICAvKiAgICBpbXByb3ZlbWVudHMgYmV0d2VlbiB2ZXJzaW9ucyAyLnggYW5kIDEueC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFzIGEgY29uY2x1c2lvbiwgYWx3YXlzIHRyeSB0byBwbGFjZSBhIDE2LjE2IGZhY3RvciBhcyB0aGUgICAgICAgICAqLworICAvKiAgICBfc2Vjb25kXyBhcmd1bWVudCBvZiB0aGlzIGZ1bmN0aW9uOyB0aGlzIGNhbiBtYWtlIGEgZ3JlYXQgICAgICAgICAgKi8KKyAgLyogICAgZGlmZmVyZW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0xvbmcgKQorICBGVF9NdWxGaXgoIEZUX0xvbmcgIGEsCisgICAgICAgICAgICAgRlRfTG9uZyAgYiApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRGl2Rml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSB2ZXJ5IHNpbXBsZSBmdW5jdGlvbiB1c2VkIHRvIHBlcmZvcm0gdGhlIGNvbXB1dGF0aW9uICAgICAgICAgICAgICovCisgIC8qICAgIGAoYSoweDEwMDAwKS9iJyB3aXRoIG1heGltdW0gYWNjdXJhY3kuICBNb3N0IG9mIHRoZSB0aW1lLCB0aGlzIGlzICAqLworICAvKiAgICB1c2VkIHRvIGRpdmlkZSBhIGdpdmVuIHZhbHVlIGJ5IGEgMTYuMTYgZml4ZWQtcG9pbnQgZmFjdG9yLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhIDo6IFRoZSBudW1lcmF0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYiA6OiBUaGUgZGVub21pbmF0b3IuICBVc2UgYSAxNi4xNiBmYWN0b3IgaGVyZS4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIHJlc3VsdCBvZiBgKGEqMHgxMDAwMCkvYicuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0xvbmcgKQorICBGVF9EaXZGaXgoIEZUX0xvbmcgIGEsCisgICAgICAgICAgICAgRlRfTG9uZyAgYiApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUm91bmRGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSB2ZXJ5IHNpbXBsZSBmdW5jdGlvbiB1c2VkIHRvIHJvdW5kIGEgMTYuMTYgZml4ZWQgbnVtYmVyLiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYSA6OiBUaGUgbnVtYmVyIHRvIGJlIHJvdW5kZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYGEnIHJvdW5kZWQgdG8gbmVhcmVzdCAxNi4xNiBmaXhlZCBpbnRlZ2VyLCBoYWxmd2F5IGNhc2VzIGF3YXkgICAgICovCisgIC8qICAgIGZyb20gemVyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9GaXhlZCApCisgIEZUX1JvdW5kRml4KCBGVF9GaXhlZCAgYSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfQ2VpbEZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSB2ZXJ5IHNpbXBsZSBmdW5jdGlvbiB1c2VkIHRvIGNvbXB1dGUgdGhlIGNlaWxpbmcgZnVuY3Rpb24gb2YgYSAgICovCisgIC8qICAgIDE2LjE2IGZpeGVkIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGEgOjogVGhlIG51bWJlciBmb3Igd2hpY2ggdGhlIGNlaWxpbmcgZnVuY3Rpb24gaXMgdG8gYmUgY29tcHV0ZWQuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGBhJyByb3VuZGVkIHRvd2FyZHMgcGx1cyBpbmZpbml0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9GaXhlZCApCisgIEZUX0NlaWxGaXgoIEZUX0ZpeGVkICBhICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GbG9vckZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHZlcnkgc2ltcGxlIGZ1bmN0aW9uIHVzZWQgdG8gY29tcHV0ZSB0aGUgZmxvb3IgZnVuY3Rpb24gb2YgYSAgICAgKi8KKyAgLyogICAgMTYuMTYgZml4ZWQgbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYSA6OiBUaGUgbnVtYmVyIGZvciB3aGljaCB0aGUgZmxvb3IgZnVuY3Rpb24gaXMgdG8gYmUgY29tcHV0ZWQuICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYGEnIHJvdW5kZWQgdG93YXJkcyBtaW51cyBpbmZpbml0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0ZpeGVkICkKKyAgRlRfRmxvb3JGaXgoIEZUX0ZpeGVkICBhICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9WZWN0b3JfVHJhbnNmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcmFuc2Zvcm0gYSBzaW5nbGUgdmVjdG9yIHRocm91Z2ggYSAyeDIgbWF0cml4LiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB2ZWN0b3IgOjogVGhlIHRhcmdldCB2ZWN0b3IgdG8gdHJhbnNmb3JtLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXRyaXggOjogQSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgMngyIG1hdHJpeC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgcmVzdWx0IGlzIHVuZGVmaW5lZCBpZiBlaXRoZXIgYHZlY3Rvcicgb3IgYG1hdHJpeCcgaXMgaW52YWxpZC4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggdm9pZCApCisgIEZUX1ZlY3Rvcl9UcmFuc2Zvcm0oIEZUX1ZlY3RvciogICAgICAgIHZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfTWF0cml4KiAgbWF0cml4ICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB2ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBWZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGdW5jdGlvbnMgYW5kIG1hY3JvcyByZWxhdGVkIHRvIEZyZWVUeXBlIHZlcnNpb25zLiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBOb3RlIHRoYXQgdGhvc2UgZnVuY3Rpb25zIGFuZCBtYWNyb3MgYXJlIG9mIGxpbWl0ZWQgdXNlIGJlY2F1c2UgICAgKi8KKyAgLyogICAgZXZlbiBhIG5ldyByZWxlYXNlIG9mIEZyZWVUeXBlIHdpdGggb25seSBkb2N1bWVudGF0aW9uIGNoYW5nZXMgICAgICovCisgIC8qICAgIGluY3JlYXNlcyB0aGUgdmVyc2lvbiBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE9yZGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xpYnJhcnlfVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlJFRVRZUEVfTUFKT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZSRUVUWVBFX01JTk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGUkVFVFlQRV9QQVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZhY2VfQ2hlY2tUcnVlVHlwZVBhdGVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GYWNlX1NldFVucGF0ZW50ZWRIaW50aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZSRUVUWVBFX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZW51bToKKyAgICogICBGUkVFVFlQRV9YWFgKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoZXNlIHRocmVlIG1hY3JvcyBpZGVudGlmeSB0aGUgRnJlZVR5cGUgc291cmNlIGNvZGUgdmVyc2lvbi4KKyAgICogICBVc2UgQEZUX0xpYnJhcnlfVmVyc2lvbiB0byBhY2Nlc3MgdGhlbSBhdCBydW50aW1lLgorICAgKgorICAgKiBAdmFsdWVzOgorICAgKiAgIEZSRUVUWVBFX01BSk9SIDo6IFRoZSBtYWpvciB2ZXJzaW9uIG51bWJlci4KKyAgICogICBGUkVFVFlQRV9NSU5PUiA6OiBUaGUgbWlub3IgdmVyc2lvbiBudW1iZXIuCisgICAqICAgRlJFRVRZUEVfUEFUQ0ggOjogVGhlIHBhdGNoIGxldmVsLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGUgdmVyc2lvbiBudW1iZXIgb2YgRnJlZVR5cGUgaWYgYnVpbHQgYXMgYSBkeW5hbWljIGxpbmsgbGlicmFyeQorICAgKiAgIHdpdGggdGhlIGBsaWJ0b29sJyBwYWNrYWdlIGlzIF9ub3RfIGNvbnRyb2xsZWQgYnkgdGhlc2UgdGhyZWUKKyAgICogICBtYWNyb3MuCisgICAqCisgICAqLworI2RlZmluZSBGUkVFVFlQRV9NQUpPUiAgMgorI2RlZmluZSBGUkVFVFlQRV9NSU5PUiAgNgorI2RlZmluZSBGUkVFVFlQRV9QQVRDSCAgMQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTGlicmFyeV9WZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSBGcmVlVHlwZSBsaWJyYXJ5IGJlaW5nIHVzZWQuICBUaGlzIGlzICAgICovCisgIC8qICAgIHVzZWZ1bCB3aGVuIGR5bmFtaWNhbGx5IGxpbmtpbmcgdG8gdGhlIGxpYnJhcnksIHNpbmNlIG9uZSBjYW5ub3QgICAqLworICAvKiAgICB1c2UgdGhlIG1hY3JvcyBARlJFRVRZUEVfTUFKT1IsIEBGUkVFVFlQRV9NSU5PUiwgYW5kICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQEZSRUVUWVBFX1BBVENILiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlicmFyeSA6OiBBIHNvdXJjZSBsaWJyYXJ5IGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYW1ham9yICA6OiBUaGUgbWFqb3IgdmVyc2lvbiBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhbWlub3IgIDo6IFRoZSBtaW5vciB2ZXJzaW9uIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFwYXRjaCAgOjogVGhlIHBhdGNoIHZlcnNpb24gbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSByZWFzb24gd2h5IHRoaXMgZnVuY3Rpb24gdGFrZXMgYSBgbGlicmFyeScgYXJndW1lbnQgaXMgYmVjYXVzZSAqLworICAvKiAgICBjZXJ0YWluIHByb2dyYW1zIGltcGxlbWVudCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGluIGEgY3VzdG9tIHdheSAgKi8KKyAgLyogICAgdGhhdCBkb2Vzbid0IHVzZSBARlRfSW5pdF9GcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJbiBzdWNoIGNhc2VzLCB0aGUgbGlicmFyeSB2ZXJzaW9uIG1pZ2h0IG5vdCBiZSBhdmFpbGFibGUgYmVmb3JlICAgKi8KKyAgLyogICAgdGhlIGxpYnJhcnkgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIHZvaWQgKQorICBGVF9MaWJyYXJ5X1ZlcnNpb24oIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICphbWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgKmFtaW5vciwKKyAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAqYXBhdGNoICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GYWNlX0NoZWNrVHJ1ZVR5cGVQYXRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQYXJzZSBhbGwgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zIG9mIGEgVHJ1ZVR5cGUgZm9udCBmaWxlIHRvIGNoZWNrICAgKi8KKyAgLyogICAgd2hldGhlciBhbnkgb2YgdGhlIHBhdGVudGVkIG9wY29kZXMgYXJlIHVzZWQuICBUaGlzIGlzIG9ubHkgdXNlZnVsICovCisgIC8qICAgIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gdXNlIHRoZSB1bnBhdGVudGVkIGhpbnRlciB3aXRoICAgICAgICAgICAqLworICAvKiAgICBmb250cyB0aGF0IGRvICpub3QqIHVzZSB0aGVzZSBvcGNvZGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHBhcnNlcyAqYWxsKiBnbHlwaCBpbnN0cnVjdGlvbnMgaW4gdGhlICAgICAqLworICAvKiAgICBmb250IGZpbGUsIHdoaWNoIG1heSBiZSBzbG93LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlIDo6IEEgZmFjZSBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAxfmlmIHRoaXMgaXMgYSBUcnVlVHlwZSBmb250IHRoYXQgdXNlcyBvbmUgb2YgdGhlIHBhdGVudGVkICAgICAgICAgKi8KKyAgLyogICAgb3Bjb2RlcywgMH5vdGhlcndpc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2luY2UgTWF5IDIwMTAsIFRydWVUeXBlIGhpbnRpbmcgaXMgbm8gbG9uZ2VyIHBhdGVudGVkLiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U2luY2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgMi4zLjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Jvb2wgKQorICBGVF9GYWNlX0NoZWNrVHJ1ZVR5cGVQYXRlbnRzKCBGVF9GYWNlICBmYWNlICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GYWNlX1NldFVucGF0ZW50ZWRIaW50aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgdW5wYXRlbnRlZCBoaW50ZXIgZm9yIGEgZ2l2ZW4gZmFjZS4gICAgICAgICAgKi8KKyAgLyogICAgT25seSBlbmFibGUgaXQgaWYgeW91IGhhdmUgZGV0ZXJtaW5lZCB0aGF0IHRoZSBmYWNlIGRvZXNuJ3QgICAgICAgICovCisgIC8qICAgIHVzZSBhbnkgcGF0ZW50ZWQgb3Bjb2RlcyAoc2VlIEBGVF9GYWNlX0NoZWNrVHJ1ZVR5cGVQYXRlbnRzKS4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgIDo6IEEgZmFjZSBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdmFsdWUgOjogTmV3IGJvb2xlYW4gc2V0dGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIG9sZCBzZXR0aW5nIHZhbHVlLiAgVGhpcyB3aWxsIGFsd2F5cyBiZSBmYWxzZSBpZiB0aGlzIGlzIG5vdCAgICovCisgIC8qICAgIGFuIFNGTlQgZm9udCwgb3IgaWYgdGhlIHVucGF0ZW50ZWQgaGludGVyIGlzIG5vdCBjb21waWxlZCBpbiB0aGlzICAqLworICAvKiAgICBpbnN0YW5jZSBvZiB0aGUgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTaW5jZSBNYXkgMjAxMCwgVHJ1ZVR5cGUgaGludGluZyBpcyBubyBsb25nZXIgcGF0ZW50ZWQuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTaW5jZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAyLjMuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfQm9vbCApCisgIEZUX0ZhY2VfU2V0VW5wYXRlbnRlZEhpbnRpbmcoIEZUX0ZhY2UgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgIHZhbHVlICk7CisKKyAgLyogKi8KKworCitGVF9FTkRfSEVBREVSCisKKyNlbmRpZiAvKiBfX0ZSRUVUWVBFX0hfXyAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGFkdmFuYy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGFkdmFuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZDJhZWQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0YWR2YW5jLmgKQEAgLTAsMCArMSwxODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0YWR2YW5jLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBRdWljayBjb21wdXRhdGlvbiBvZiBhZHZhbmNlIHdpZHRocyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwOC0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0ZUQURWQU5DX0hfXworI2RlZmluZSBfX0ZUQURWQU5DX0hfXworCisKKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAorCisjaWZkZWYgRlJFRVRZUEVfSAorI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKKyNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgorI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCisjZW5kaWYKKworCitGVF9CRUdJTl9IRUFERVIKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc2VjdGlvbjoKKyAgICogICBxdWlja19hZHZhbmNlCisgICAqCisgICAqIEB0aXRsZToKKyAgICogICBRdWljayByZXRyaWV2YWwgb2YgYWR2YW5jZSB2YWx1ZXMKKyAgICoKKyAgICogQGFic3RyYWN0OgorICAgKiAgIFJldHJpZXZlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGFkdmFuY2UgdmFsdWVzIHdpdGhvdXQgcHJvY2Vzc2luZworICAgKiAgIGdseXBoIG91dGxpbmVzLCBpZiBwb3NzaWJsZS4KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgc2VjdGlvbiBjb250YWlucyBmdW5jdGlvbnMgdG8gcXVpY2tseSBleHRyYWN0IGFkdmFuY2UgdmFsdWVzCisgICAqICAgd2l0aG91dCBoYW5kbGluZyBnbHlwaCBvdXRsaW5lcywgaWYgcG9zc2libGUuCisgICAqCisgICAqIEBvcmRlcjoKKyAgICogICBGVF9HZXRfQWR2YW5jZQorICAgKiAgIEZUX0dldF9BZHZhbmNlcworICAgKgorICAgKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPENvbnN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0FEVkFOQ0VfRkxBR19GQVNUX09OTFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgYml0LWZsYWcgdG8gYmUgT1ItZWQgd2l0aCB0aGUgYGZsYWdzJyBwYXJhbWV0ZXIgb2YgdGhlICAgICAgICAgICAqLworICAvKiAgICBARlRfR2V0X0FkdmFuY2UgYW5kIEBGVF9HZXRfQWR2YW5jZXMgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIElmIHNldCwgaXQgaW5kaWNhdGVzIHRoYXQgeW91IHdhbnQgdGhlc2UgZnVuY3Rpb25zIHRvIGZhaWwgaWYgdGhlICAqLworICAvKiAgICBjb3JyZXNwb25kaW5nIGhpbnRpbmcgbW9kZSBvciBmb250IGRyaXZlciBkb2Vzbid0IGFsbG93IGZvciB2ZXJ5ICAgKi8KKyAgLyogICAgcXVpY2sgYWR2YW5jZSBjb21wdXRhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUeXBpY2FsbHksIGdseXBocyB0aGF0IGFyZSBlaXRoZXIgdW5zY2FsZWQsIHVuaGludGVkLCBiaXRtYXBwZWQsICAgKi8KKyAgLyogICAgb3IgbGlnaHQtaGludGVkIGNhbiBoYXZlIHRoZWlyIGFkdmFuY2Ugd2lkdGggY29tcHV0ZWQgdmVyeSAgICAgICAgICovCisgIC8qICAgIHF1aWNrbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTm9ybWFsIGFuZCBieXRlY29kZSBoaW50ZWQgbW9kZXMgdGhhdCByZXF1aXJlIGxvYWRpbmcsIHNjYWxpbmcsICAgICovCisgIC8qICAgIGFuZCBoaW50aW5nIG9mIHRoZSBnbHlwaCBvdXRsaW5lLCBhcmUgZXh0cmVtZWx5IHNsb3cgYnkgICAgICAgICAgICAqLworICAvKiAgICBjb21wYXJpc29uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX0FEVkFOQ0VfRkxBR19GQVNUX09OTFkgIDB4MjAwMDAwMDBMCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZXRfQWR2YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZXRyaWV2ZSB0aGUgYWR2YW5jZSB2YWx1ZSBvZiBhIGdpdmVuIGdseXBoIG91dGxpbmUgaW4gYW4gICAgICAgICAgKi8KKyAgLyogICAgQEZUX0ZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgICAgICA6OiBUaGUgc291cmNlIEBGVF9GYWNlIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnaW5kZXggICAgIDo6IFRoZSBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxvYWRfZmxhZ3MgOjogQSBzZXQgb2YgYml0IGZsYWdzIHNpbWlsYXIgdG8gdGhvc2UgdXNlZCB3aGVuICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIGNhbGxpbmcgQEZUX0xvYWRfR2x5cGgsIHVzZWQgdG8gZGV0ZXJtaW5lIHdoYXQga2luZCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBvZiBhZHZhbmNlcyB5b3UgbmVlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwYWR2YW5jZSA6OiBUaGUgYWR2YW5jZSB2YWx1ZS4gIElmIHNjYWxpbmcgaXMgcGVyZm9ybWVkIChiYXNlZCBvbiAgKi8KKyAgLyogICAgICAgICAgICAgICAgdGhlIHZhbHVlIG9mIGBsb2FkX2ZsYWdzJyksIHRoZSBhZHZhbmNlIHZhbHVlIGlzIGluICAgICovCisgIC8qICAgICAgICAgICAgICAgIDE2LjE2IGZvcm1hdC4gIE90aGVyd2lzZSwgaXQgaXMgaW4gZm9udCB1bml0cy4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgSWYgQEZUX0xPQURfVkVSVElDQUxfTEFZT1VUIGlzIHNldCwgdGhpcyBpcyB0aGUgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgIHZlcnRpY2FsIGFkdmFuY2UgY29ycmVzcG9uZGluZyB0byBhIHZlcnRpY2FsIGxheW91dC4gICAqLworICAvKiAgICAgICAgICAgICAgICBPdGhlcndpc2UsIGl0IGlzIHRoZSBob3Jpem9udGFsIGFkdmFuY2UgaW4gYSAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgaG9yaXpvbnRhbCBsYXlvdXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBtYXkgZmFpbCBpZiB5b3UgdXNlIEBGVF9BRFZBTkNFX0ZMQUdfRkFTVF9PTkxZIGFuZCAgICovCisgIC8qICAgIGlmIHRoZSBjb3JyZXNwb25kaW5nIGZvbnQgYmFja2VuZCBkb2Vzbid0IGhhdmUgYSBxdWljayB3YXkgdG8gICAgICAqLworICAvKiAgICByZXRyaWV2ZSB0aGUgYWR2YW5jZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc2NhbGVkIGFkdmFuY2UgaXMgcmV0dXJuZWQgaW4gMTYuMTYgZm9ybWF0IGJ1dCBpc24ndCB0cmFuc2Zvcm1lZCAqLworICAvKiAgICBieSB0aGUgYWZmaW5lIHRyYW5zZm9ybWF0aW9uIHNwZWNpZmllZCBieSBARlRfU2V0X1RyYW5zZm9ybS4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9HZXRfQWR2YW5jZSggRlRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBnaW5kZXgsCisgICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgIGxvYWRfZmxhZ3MsCisgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgKnBhZHZhbmNlICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZXRfQWR2YW5jZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZXRyaWV2ZSB0aGUgYWR2YW5jZSB2YWx1ZXMgb2Ygc2V2ZXJhbCBnbHlwaCBvdXRsaW5lcyBpbiBhbiAgICAgICAgKi8KKyAgLyogICAgQEZUX0ZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgICAgICAgOjogVGhlIHNvdXJjZSBARlRfRmFjZSBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdGFydCAgICAgICA6OiBUaGUgZmlyc3QgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNvdW50ICAgICAgIDo6IFRoZSBudW1iZXIgb2YgYWR2YW5jZSB2YWx1ZXMgeW91IHdhbnQgdG8gcmV0cmlldmUuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbG9hZF9mbGFncyAgOjogQSBzZXQgb2YgYml0IGZsYWdzIHNpbWlsYXIgdG8gdGhvc2UgdXNlZCB3aGVuICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIGNhbGxpbmcgQEZUX0xvYWRfR2x5cGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBhZHZhbmNlIDo6IFRoZSBhZHZhbmNlIHZhbHVlcy4gIFRoaXMgYXJyYXksIHRvIGJlIHByb3ZpZGVkIGJ5IHRoZSAqLworICAvKiAgICAgICAgICAgICAgICBjYWxsZXIsIG11c3QgY29udGFpbiBhdCBsZWFzdCBgY291bnQnIGVsZW1lbnRzLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgIElmIHNjYWxpbmcgaXMgcGVyZm9ybWVkIChiYXNlZCBvbiB0aGUgdmFsdWUgb2YgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICBgbG9hZF9mbGFncycpLCB0aGUgYWR2YW5jZSB2YWx1ZXMgYXJlIGluIDE2LjE2IGZvcm1hdC4gKi8KKyAgLyogICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGV5IGFyZSBpbiBmb250IHVuaXRzLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICBJZiBARlRfTE9BRF9WRVJUSUNBTF9MQVlPVVQgaXMgc2V0LCB0aGVzZSBhcmUgdGhlICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgdmVydGljYWwgYWR2YW5jZXMgY29ycmVzcG9uZGluZyB0byBhIHZlcnRpY2FsIGxheW91dC4gICovCisgIC8qICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhleSBhcmUgdGhlIGhvcml6b250YWwgYWR2YW5jZXMgaW4gYSAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICBob3Jpem9udGFsIGxheW91dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIG1heSBmYWlsIGlmIHlvdSB1c2UgQEZUX0FEVkFOQ0VfRkxBR19GQVNUX09OTFkgYW5kICAgKi8KKyAgLyogICAgaWYgdGhlIGNvcnJlc3BvbmRpbmcgZm9udCBiYWNrZW5kIGRvZXNuJ3QgaGF2ZSBhIHF1aWNrIHdheSB0byAgICAgICovCisgIC8qICAgIHJldHJpZXZlIHRoZSBhZHZhbmNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2NhbGVkIGFkdmFuY2VzIGFyZSByZXR1cm5lZCBpbiAxNi4xNiBmb3JtYXQgYnV0IGFyZW4ndCAgICAgICAgICAgICovCisgIC8qICAgIHRyYW5zZm9ybWVkIGJ5IHRoZSBhZmZpbmUgdHJhbnNmb3JtYXRpb24gc3BlY2lmaWVkIGJ5ICAgICAgICAgICAgICAqLworICAvKiAgICBARlRfU2V0X1RyYW5zZm9ybS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9HZXRfQWR2YW5jZXMoIEZUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgY291bnQsCisgICAgICAgICAgICAgICAgICAgRlRfSW50MzIgICBsb2FkX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAqcGFkdmFuY2VzICk7CisKKyAgLyogKi8KKworCitGVF9FTkRfSEVBREVSCisKKyNlbmRpZiAvKiBfX0ZUQURWQU5DX0hfXyAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGF1dG9oLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0YXV0b2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjM5YzIxCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGF1dG9oLmgKQEAgLTAsMCArMSw0NTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0YXV0b2guaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGcmVlVHlwZSBBUEkgZm9yIGNvbnRyb2xsaW5nIHRoZSBhdXRvLWhpbnRlciAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAxMi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0ZUQVVUT0hfSF9fCisjZGVmaW5lIF9fRlRBVVRPSF9IX18KKworI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CisjaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisKKyNpZmRlZiBGUkVFVFlQRV9ICisjZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgorI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCisjZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKKyNlbmRpZgorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzZWN0aW9uOgorICAgKiAgIGF1dG9faGludGVyCisgICAqCisgICAqIEB0aXRsZToKKyAgICogICBUaGUgYXV0by1oaW50ZXIKKyAgICoKKyAgICogQGFic3RyYWN0OgorICAgKiAgIENvbnRyb2xsaW5nIHRoZSBhdXRvLWhpbnRpbmcgbW9kdWxlLgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgV2hpbGUgRnJlZVR5cGUncyBhdXRvLWhpbnRlciBkb2Vzbid0IGV4cG9zZSBBUEkgZnVuY3Rpb25zIGJ5IGl0c2VsZiwKKyAgICogICBpdCBpcyBwb3NzaWJsZSB0byBjb250cm9sIGl0cyBiZWhhdmlvdXIgd2l0aCBARlRfUHJvcGVydHlfU2V0IGFuZAorICAgKiAgIEBGVF9Qcm9wZXJ0eV9HZXQuICBUaGUgZm9sbG93aW5nIGxpc3RzIHRoZSBhdmFpbGFibGUgcHJvcGVydGllcworICAgKiAgIHRvZ2V0aGVyIHdpdGggdGhlIG5lY2Vzc2FyeSBtYWNyb3MgYW5kIHN0cnVjdHVyZXMuCisgICAqCisgICAqICAgTm90ZSB0aGF0IHRoZSBhdXRvLWhpbnRlcidzIG1vZHVsZSBuYW1lIGlzIGBhdXRvZml0dGVyJyBmb3IKKyAgICogICBoaXN0b3JpY2FsIHJlYXNvbnMuCisgICAqCisgICAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBwcm9wZXJ0eToKKyAgICogICBnbHlwaC10by1zY3JpcHQtbWFwCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICAqRXhwZXJpbWVudGFsKiAqb25seSoKKyAgICoKKyAgICogICBUaGUgYXV0by1oaW50ZXIgcHJvdmlkZXMgdmFyaW91cyBzY3JpcHQgbW9kdWxlcyB0byBoaW50IGdseXBocy4KKyAgICogICBFeGFtcGxlcyBvZiBzdXBwb3J0ZWQgc2NyaXB0cyBhcmUgTGF0aW4gb3IgQ0pLLiAgQmVmb3JlIGEgZ2x5cGggaXMKKyAgICogICBhdXRvLWhpbnRlZCwgdGhlIFVuaWNvZGUgY2hhcmFjdGVyIG1hcCBvZiB0aGUgZm9udCBnZXRzIGV4YW1pbmVkLCBhbmQKKyAgICogICB0aGUgc2NyaXB0IGlzIHRoZW4gZGV0ZXJtaW5lZCBiYXNlZCBvbiBVbmljb2RlIGNoYXJhY3RlciByYW5nZXMsIHNlZQorICAgKiAgIGJlbG93LgorICAgKgorICAgKiAgIE9wZW5UeXBlIGZvbnRzLCBob3dldmVyLCBvZnRlbiBwcm92aWRlIG11Y2ggbW9yZSBnbHlwaHMgdGhhbgorICAgKiAgIGNoYXJhY3RlciBjb2RlcyAoc21hbGwgY2Fwcywgc3VwZXJzY3JpcHRzLCBsaWdhdHVyZXMsIHN3YXNoZXMsIGV0Yy4pLAorICAgKiAgIHRvIGJlIGNvbnRyb2xsZWQgYnkgc28tY2FsbGVkIGBmZWF0dXJlcycuICBIYW5kbGluZyBPcGVuVHlwZSBmZWF0dXJlcworICAgKiAgIGNhbiBiZSBxdWl0ZSBjb21wbGljYXRlZCBhbmQgdGh1cyBuZWVkcyBhIHNlcGFyYXRlIGxpYnJhcnkgb24gdG9wIG9mCisgICAqICAgRnJlZVR5cGUuCisgICAqCisgICAqICAgVGhlIG1hcHBpbmcgYmV0d2VlbiBnbHlwaCBpbmRpY2VzIGFuZCBzY3JpcHRzIChpbiB0aGUgYXV0by1oaW50ZXIKKyAgICogICBzZW5zZSwgc2VlIHRoZSBARlRfQVVUT0hJTlRFUl9TQ1JJUFRfWFhYIHZhbHVlcykgaXMgc3RvcmVkIGFzIGFuCisgICAqICAgYXJyYXkgd2l0aCBgbnVtX2dseXBocycgZWxlbWVudHMsIGFzIGZvdW5kIGluIHRoZSBmb250J3MgQEZUX0ZhY2UKKyAgICogICBzdHJ1Y3R1cmUuICBUaGUgYGdseXBoLXRvLXNjcmlwdC1tYXAnIHByb3BlcnR5IHJldHVybnMgYSBwb2ludGVyIHRvCisgICAqICAgdGhpcyBhcnJheSwgd2hpY2ggY2FuIGJlIG1vZGlmaWVkIGFzIG5lZWRlZC4gIE5vdGUgdGhhdCB0aGUKKyAgICogICBtb2RpZmljYXRpb24gc2hvdWxkIGhhcHBlbiBiZWZvcmUgdGhlIGZpcnN0IGdseXBoIGdldHMgcHJvY2Vzc2VkIGJ5CisgICAqICAgdGhlIGF1dG8taGludGVyIHNvIHRoYXQgdGhlIGdsb2JhbCBhbmFseXNpcyBvZiB0aGUgZm9udCBzaGFwZXMKKyAgICogICBhY3R1YWxseSB1c2VzIHRoZSBtb2RpZmllZCBtYXBwaW5nLgorICAgKgorICAgKiAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjb2RlIGRlbW9uc3RyYXRlcyBob3cgdG8gYWNjZXNzIGl0IChvbWl0dGluZworICAgKiAgIHRoZSBlcnJvciBoYW5kbGluZykuCisgICAqCisgICAqICAgeworICAgKiAgICAgRlRfTGlicmFyeSAgICAgICAgICAgICAgICBsaWJyYXJ5OworICAgKiAgICAgRlRfRmFjZSAgICAgICAgICAgICAgICAgICBmYWNlOworICAgKiAgICAgRlRfUHJvcF9HbHlwaFRvU2NyaXB0TWFwICBwcm9wOworICAgKgorICAgKgorICAgKiAgICAgRlRfSW5pdF9GcmVlVHlwZSggJmxpYnJhcnkgKTsKKyAgICogICAgIEZUX05ld19GYWNlKCBsaWJyYXJ5LCAiZm9vLnR0ZiIsIDAsICZmYWNlICk7CisgICAqCisgICAqICAgICBwcm9wLmZhY2UgPSBmYWNlOworICAgKgorICAgKiAgICAgRlRfUHJvcGVydHlfR2V0KCBsaWJyYXJ5LCAiYXV0b2ZpdHRlciIsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnbHlwaC10by1zY3JpcHQtbWFwIiwgJnByb3AgKTsKKyAgICoKKyAgICogICAgIC8vIGFkanVzdCBgcHJvcC5tYXAnIGFzIG5lZWRlZCByaWdodCBoZXJlCisgICAqCisgICAqICAgICBGVF9Mb2FkX0dseXBoKCBmYWNlLCAuLi4sIEZUX0xPQURfRk9SQ0VfQVVUT0hJTlQgKTsKKyAgICogICB9CisgICAqCisgICAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBlbnVtOgorICAgKiAgIEZUX0FVVE9ISU5URVJfU0NSSVBUX1hYWAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgKkV4cGVyaW1lbnRhbCogKm9ubHkqCisgICAqCisgICAqICAgQSBsaXN0IG9mIGNvbnN0YW50cyB1c2VkIGZvciB0aGUgQGdseXBoLXRvLXNjcmlwdC1tYXAgcHJvcGVydHkgdG8KKyAgICogICBzcGVjaWZ5IHRoZSBzY3JpcHQgc3VibW9kdWxlIHRoZSBhdXRvLWhpbnRlciBzaG91bGQgdXNlIGZvciBoaW50aW5nIGEKKyAgICogICBwYXJ0aWN1bGFyIGdseXBoLgorICAgKgorICAgKiBAdmFsdWVzOgorICAgKiAgIEZUX0FVVE9ISU5URVJfU0NSSVBUX05PTkUgOjoKKyAgICogICAgIERvbid0IGF1dG8taGludCB0aGlzIGdseXBoLgorICAgKgorICAgKiAgIEZUX0FVVE9ISU5URVJfU0NSSVBUX0xBVElOIDo6CisgICAqICAgICBBcHBseSB0aGUgbGF0aW4gYXV0by1oaW50ZXIuICBGb3IgdGhlIGF1dG8taGludGVyLCBgbGF0aW4nIGlzIGEKKyAgICogICAgIHZlcnkgYnJvYWQgdGVybSwgaW5jbHVkaW5nIEN5cmlsbGljIGFuZCBHcmVlayBhbHNvIHNpbmNlIGNoYXJhY3RlcnMKKyAgICogICAgIGZyb20gdGhvc2Ugc2NyaXB0cyBzaGFyZSB0aGUgc2FtZSBkZXNpZ24gY29uc3RyYWludHMuCisgICAqCisgICAqICAgICBCeSBkZWZhdWx0LCBjaGFyYWN0ZXJzIGZyb20gdGhlIGZvbGxvd2luZyBVbmljb2RlIHJhbmdlcyBhcmUKKyAgICogICAgIGFzc2lnbmVkIHRvIHRoaXMgc3VibW9kdWxlLgorICAgKgorICAgKiAgICAgeworICAgKiAgICAgICBVKzAwMjAgLSBVKzAwN0YgIC8vIEJhc2ljIExhdGluIChubyBjb250cm9sIGNoYXJhY3RlcnMpCisgICAqICAgICAgIFUrMDBBMCAtIFUrMDBGRiAgLy8gTGF0aW4tMSBTdXBwbGVtZW50IChubyBjb250cm9sIGNoYXJhY3RlcnMpCisgICAqICAgICAgIFUrMDEwMCAtIFUrMDE3RiAgLy8gTGF0aW4gRXh0ZW5kZWQtQQorICAgKiAgICAgICBVKzAxODAgLSBVKzAyNEYgIC8vIExhdGluIEV4dGVuZGVkLUIKKyAgICogICAgICAgVSswMjUwIC0gVSswMkFGICAvLyBJUEEgRXh0ZW5zaW9ucworICAgKiAgICAgICBVKzAyQjAgLSBVKzAyRkYgIC8vIFNwYWNpbmcgTW9kaWZpZXIgTGV0dGVycworICAgKiAgICAgICBVKzAzMDAgLSBVKzAzNkYgIC8vIENvbWJpbmluZyBEaWFjcml0aWNhbCBNYXJrcworICAgKiAgICAgICBVKzAzNzAgLSBVKzAzRkYgIC8vIEdyZWVrIGFuZCBDb3B0aWMKKyAgICogICAgICAgVSswNDAwIC0gVSswNEZGICAvLyBDeXJpbGxpYworICAgKiAgICAgICBVKzA1MDAgLSBVKzA1MkYgIC8vIEN5cmlsbGljIFN1cHBsZW1lbnQKKyAgICogICAgICAgVSsxRDAwIC0gVSsxRDdGICAvLyBQaG9uZXRpYyBFeHRlbnNpb25zCisgICAqICAgICAgIFUrMUQ4MCAtIFUrMURCRiAgLy8gUGhvbmV0aWMgRXh0ZW5zaW9ucyBTdXBwbGVtZW50CisgICAqICAgICAgIFUrMURDMCAtIFUrMURGRiAgLy8gQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzIFN1cHBsZW1lbnQKKyAgICogICAgICAgVSsxRTAwIC0gVSsxRUZGICAvLyBMYXRpbiBFeHRlbmRlZCBBZGRpdGlvbmFsCisgICAqICAgICAgIFUrMUYwMCAtIFUrMUZGRiAgLy8gR3JlZWsgRXh0ZW5kZWQKKyAgICogICAgICAgVSsyMDAwIC0gVSsyMDZGICAvLyBHZW5lcmFsIFB1bmN0dWF0aW9uCisgICAqICAgICAgIFUrMjA3MCAtIFUrMjA5RiAgLy8gU3VwZXJzY3JpcHRzIGFuZCBTdWJzY3JpcHRzCisgICAqICAgICAgIFUrMjBBMCAtIFUrMjBDRiAgLy8gQ3VycmVuY3kgU3ltYm9scworICAgKiAgICAgICBVKzIxNTAgLSBVKzIxOEYgIC8vIE51bWJlciBGb3JtcworICAgKiAgICAgICBVKzI0NjAgLSBVKzI0RkYgIC8vIEVuY2xvc2VkIEFscGhhbnVtZXJpY3MKKyAgICogICAgICAgVSsyQzYwIC0gVSsyQzdGICAvLyBMYXRpbiBFeHRlbmRlZC1DCisgICAqICAgICAgIFUrMkRFMCAtIFUrMkRGRiAgLy8gQ3lyaWxsaWMgRXh0ZW5kZWQtQQorICAgKiAgICAgICBVKzJFMDAgLSBVKzJFN0YgIC8vIFN1cHBsZW1lbnRhbCBQdW5jdHVhdGlvbgorICAgKiAgICAgICBVK0E2NDAgLSBVK0E2OUYgIC8vIEN5cmlsbGljIEV4dGVuZGVkLUIKKyAgICogICAgICAgVStBNzIwIC0gVStBN0ZGICAvLyBMYXRpbiBFeHRlbmRlZC1ECisgICAqICAgICAgIFUrRkIwMCAtIFUrRkIwNiAgLy8gQWxwaGFiLiBQcmVzZW50LiBGb3JtcyAoTGF0aW4gTGlnYXR1cmVzKQorICAgKiAgICAgIFUrMUQ0MDAgLSBVKzFEN0ZGIC8vIE1hdGhlbWF0aWNhbCBBbHBoYW51bWVyaWMgU3ltYm9scworICAgKiAgICAgIFUrMUYxMDAgLSBVKzFGMUZGIC8vIEVuY2xvc2VkIEFscGhhbnVtZXJpYyBTdXBwbGVtZW50CisgICAqICAgICB9CisgICAqCisgICAqICAgRlRfQVVUT0hJTlRFUl9TQ1JJUFRfQ0pLIDo6CisgICAqICAgICBBcHBseSB0aGUgQ0pLIGF1dG8taGludGVyLCBjb3ZlcmluZyBDaGluZXNlLCBKYXBhbmVzZSwgS29yZWFuLCBvbGQKKyAgICogICAgIFZpZXRuYW1lc2UsIGFuZCBzb21lIG90aGVyIHNjcmlwdHMuCisgICAqCisgICAqICAgICBCeSBkZWZhdWx0LCBjaGFyYWN0ZXJzIGZyb20gdGhlIGZvbGxvd2luZyBVbmljb2RlIHJhbmdlcyBhcmUKKyAgICogICAgIGFzc2lnbmVkIHRvIHRoaXMgc3VibW9kdWxlLgorICAgKgorICAgKiAgICAgeworICAgKiAgICAgICBVKzExMDAgLSBVKzExRkYgIC8vIEhhbmd1bCBKYW1vCisgICAqICAgICAgIFUrMkU4MCAtIFUrMkVGRiAgLy8gQ0pLIFJhZGljYWxzIFN1cHBsZW1lbnQKKyAgICogICAgICAgVSsyRjAwIC0gVSsyRkRGICAvLyBLYW5neGkgUmFkaWNhbHMKKyAgICogICAgICAgVSsyRkYwIC0gVSsyRkZGICAvLyBJZGVvZ3JhcGhpYyBEZXNjcmlwdGlvbiBDaGFyYWN0ZXJzCisgICAqICAgICAgIFUrMzAwMCAtIFUrMzAzRiAgLy8gQ0pLIFN5bWJvbHMgYW5kIFB1bmN0dWF0aW9uCisgICAqICAgICAgIFUrMzA0MCAtIFUrMzA5RiAgLy8gSGlyYWdhbmEKKyAgICogICAgICAgVSszMEEwIC0gVSszMEZGICAvLyBLYXRha2FuYQorICAgKiAgICAgICBVKzMxMDAgLSBVKzMxMkYgIC8vIEJvcG9tb2ZvCisgICAqICAgICAgIFUrMzEzMCAtIFUrMzE4RiAgLy8gSGFuZ3VsIENvbXBhdGliaWxpdHkgSmFtbworICAgKiAgICAgICBVKzMxOTAgLSBVKzMxOUYgIC8vIEthbmJ1bgorICAgKiAgICAgICBVKzMxQTAgLSBVKzMxQkYgIC8vIEJvcG9tb2ZvIEV4dGVuZGVkCisgICAqICAgICAgIFUrMzFDMCAtIFUrMzFFRiAgLy8gQ0pLIFN0cm9rZXMKKyAgICogICAgICAgVSszMUYwIC0gVSszMUZGICAvLyBLYXRha2FuYSBQaG9uZXRpYyBFeHRlbnNpb25zCisgICAqICAgICAgIFUrMzIwMCAtIFUrMzJGRiAgLy8gRW5jbG9zZWQgQ0pLIExldHRlcnMgYW5kIE1vbnRocworICAgKiAgICAgICBVKzMzMDAgLSBVKzMzRkYgIC8vIENKSyBDb21wYXRpYmlsaXR5CisgICAqICAgICAgIFUrMzQwMCAtIFUrNERCRiAgLy8gQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQQorICAgKiAgICAgICBVKzREQzAgLSBVKzRERkYgIC8vIFlpamluZyBIZXhhZ3JhbSBTeW1ib2xzCisgICAqICAgICAgIFUrNEUwMCAtIFUrOUZGRiAgLy8gQ0pLIFVuaWZpZWQgSWRlb2dyYXBocworICAgKiAgICAgICBVK0E5NjAgLSBVK0E5N0YgIC8vIEhhbmd1bCBKYW1vIEV4dGVuZGVkLUEKKyAgICogICAgICAgVStBQzAwIC0gVStEN0FGICAvLyBIYW5ndWwgU3lsbGFibGVzCisgICAqICAgICAgIFUrRDdCMCAtIFUrRDdGRiAgLy8gSGFuZ3VsIEphbW8gRXh0ZW5kZWQtQgorICAgKiAgICAgICBVK0Y5MDAgLSBVK0ZBRkYgIC8vIENKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMKKyAgICogICAgICAgVStGRTEwIC0gVStGRTFGICAvLyBWZXJ0aWNhbCBmb3JtcworICAgKiAgICAgICBVK0ZFMzAgLSBVK0ZFNEYgIC8vIENKSyBDb21wYXRpYmlsaXR5IEZvcm1zCisgICAqICAgICAgIFUrRkYwMCAtIFUrRkZFRiAgLy8gSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXMKKyAgICogICAgICBVKzFCMDAwIC0gVSsxQjBGRiAvLyBLYW5hIFN1cHBsZW1lbnQKKyAgICogICAgICBVKzFEMzAwIC0gVSsxRDM1RiAvLyBUYWkgWHVhbiBIaW5nIFN5bWJvbHMKKyAgICogICAgICBVKzFGMjAwIC0gVSsxRjJGRiAvLyBFbmNsb3NlZCBJZGVvZ3JhcGhpYyBTdXBwbGVtZW50CisgICAqICAgICAgVSsyMDAwMCAtIFUrMkE2REYgLy8gQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQgorICAgKiAgICAgIFUrMkE3MDAgLSBVKzJCNzNGIC8vIENKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEMKKyAgICogICAgICBVKzJCNzQwIC0gVSsyQjgxRiAvLyBDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBECisgICAqICAgICAgVSsyRjgwMCAtIFUrMkZBMUYgLy8gQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocyBTdXBwbGVtZW50CisgICAqICAgICB9CisgICAqCisgICAqICAgRlRfQVVUT0hJTlRFUl9TQ1JJUFRfSU5ESUMgOjoKKyAgICogICAgIEFwcGx5IHRoZSBpbmRpYyBhdXRvLWhpbnRlciwgY292ZXJpbmcgYWxsIG1ham9yIHNjcmlwdHMgZnJvbSB0aGUKKyAgICogICAgIEluZGlhbiBzdWItY29udGluZW50IGFuZCBzb21lIG90aGVyIHJlbGF0ZWQgc2NyaXB0cyBsaWtlIFRoYWksIExhbywKKyAgICogICAgIG9yIFRpYmV0YW4uCisgICAqCisgICAqICAgICBCeSBkZWZhdWx0LCBjaGFyYWN0ZXJzIGZyb20gdGhlIGZvbGxvd2luZyBVbmljb2RlIHJhbmdlcyBhcmUKKyAgICogICAgIGFzc2lnbmVkIHRvIHRoaXMgc3VibW9kdWxlLgorICAgKgorICAgKiAgICAgeworICAgKiAgICAgICBVKzA5MDAgLSBVKzBERkYgIC8vIEluZGljIFJhbmdlCisgICAqICAgICAgIFUrMEYwMCAtIFUrMEZGRiAgLy8gVGliZXRhbgorICAgKiAgICAgICBVKzE5MDAgLSBVKzE5NEYgIC8vIExpbWJ1CisgICAqICAgICAgIFUrMUI4MCAtIFUrMUJCRiAgLy8gU3VuZGFuZXNlCisgICAqICAgICAgIFUrMUM4MCAtIFUrMUNERiAgLy8gTWVldGVpIE1heWFrCisgICAqICAgICAgIFUrQTgwMCAtIFUrQTgyRiAgLy8gU3lsb3RpIE5hZ3JpCisgICAqICAgICAgVSsxMTgwMCAtIFUrMTE4REYgLy8gU2hhcmFkYQorICAgKiAgICAgfQorICAgKgorICAgKiAgICAgTm90ZSB0aGF0IGN1cnJlbnRseSBJbmRpYyBzdXBwb3J0IGlzIHJ1ZGltZW50YXJ5IG9ubHksIG1pc3NpbmcgYmx1ZQorICAgKiAgICAgem9uZSBzdXBwb3J0LgorICAgKgorICAgKi8KKyNkZWZpbmUgRlRfQVVUT0hJTlRFUl9TQ1JJUFRfTk9ORSAgIDAKKyNkZWZpbmUgRlRfQVVUT0hJTlRFUl9TQ1JJUFRfTEFUSU4gIDEKKyNkZWZpbmUgRlRfQVVUT0hJTlRFUl9TQ1JJUFRfQ0pLICAgIDIKKyNkZWZpbmUgRlRfQVVUT0hJTlRFUl9TQ1JJUFRfSU5ESUMgIDMKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIEZUX1Byb3BfR2x5cGhUb1NjcmlwdE1hcAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgKkV4cGVyaW1lbnRhbCogKm9ubHkqCisgICAqCisgICAqICAgVGhlIGRhdGEgZXhjaGFuZ2Ugc3RydWN0dXJlIGZvciB0aGUgQGdseXBoLXRvLXNjcmlwdC1tYXAgcHJvcGVydHkuCisgICAqCisgICAqLworICB0eXBlZGVmIHN0cnVjdCAgRlRfUHJvcF9HbHlwaFRvU2NyaXB0TWFwXworICB7CisgICAgRlRfRmFjZSAgICAgZmFjZTsKKyAgICBGVF9VU2hvcnQqICBtYXA7CisKKyAgfSBGVF9Qcm9wX0dseXBoVG9TY3JpcHRNYXA7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHByb3BlcnR5OgorICAgKiAgIGZhbGxiYWNrLXNjcmlwdAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgKkV4cGVyaW1lbnRhbCogKm9ubHkqCisgICAqCisgICAqICAgSWYgbm8gYXV0by1oaW50ZXIgc2NyaXB0IG1vZHVsZSBjYW4gYmUgYXNzaWduZWQgdG8gYSBnbHlwaCwgYQorICAgKiAgIGZhbGxiYWNrIHNjcmlwdCBnZXRzIGFzc2lnbmVkIHRvIGl0IChzZWUgYWxzbyB0aGUKKyAgICogICBAZ2x5cGgtdG8tc2NyaXB0LW1hcCBwcm9wZXJ0eSkuICBCeSBkZWZhdWx0LCB0aGlzIGlzCisgICAqICAgQEZUX0FVVE9ISU5URVJfU0NSSVBUX0NKSy4gIFVzaW5nIHRoZSBgZmFsbGJhY2stc2NyaXB0JyBwcm9wZXJ0eSwKKyAgICogICB0aGlzIGZhbGxiYWNrIHZhbHVlIGNhbiBiZSBjaGFuZ2VkLgorICAgKgorICAgKiAgIHsKKyAgICogICAgIEZUX0xpYnJhcnkgIGxpYnJhcnk7CisgICAqICAgICBGVF9VSW50ICAgICBmYWxsYmFja19zY3JpcHQgPSBGVF9BVVRPSElOVEVSX1NDUklQVF9OT05FOworICAgKgorICAgKgorICAgKiAgICAgRlRfSW5pdF9GcmVlVHlwZSggJmxpYnJhcnkgKTsKKyAgICoKKyAgICogICAgIEZUX1Byb3BlcnR5X1NldCggbGlicmFyeSwgImF1dG9maXR0ZXIiLAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFsbGJhY2stc2NyaXB0IiwgJmZhbGxiYWNrX3NjcmlwdCApOworICAgKiAgIH0KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB3aXRoIEBGVF9Qcm9wZXJ0eV9HZXQgYWxzby4KKyAgICoKKyAgICogICBJdCdzIGltcG9ydGFudCB0byB1c2UgdGhlIHJpZ2h0IHRpbWluZyBmb3IgY2hhbmdpbmcgdGhpcyB2YWx1ZTogVGhlCisgICAqICAgY3JlYXRpb24gb2YgdGhlIGdseXBoLXRvLXNjcmlwdCBtYXAgdGhhdCBldmVudHVhbGx5IHVzZXMgdGhlCisgICAqICAgZmFsbGJhY2sgc2NyaXB0IHZhbHVlIGdldHMgdHJpZ2dlcmVkIGVpdGhlciBieSBzZXR0aW5nIG9yIHJlYWRpbmcgYQorICAgKiAgIGZhY2Utc3BlY2lmaWMgcHJvcGVydHkgbGlrZSBAZ2x5cGgtdG8tc2NyaXB0LW1hcCwgb3IgYnkgYXV0by1oaW50aW5nCisgICAqICAgYW55IGdseXBoIGZyb20gdGhhdCBmYWNlLiAgSW4gcGFydGljdWxhciwgaWYgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkCisgICAqICAgYW4gQEZUX0ZhY2Ugc3RydWN0dXJlIGJ1dCBub3QgbG9hZGVkIGFueSBnbHlwaCAodXNpbmcgdGhlCisgICAqICAgYXV0by1oaW50ZXIpLCBhIGNoYW5nZSBvZiB0aGUgZmFsbGJhY2sgc2NyaXB0IHdpbGwgYWZmZWN0IHRoaXMgZmFjZS4KKyAgICoKKyAgICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHByb3BlcnR5OgorICAgKiAgIGRlZmF1bHQtc2NyaXB0CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICAqRXhwZXJpbWVudGFsKiAqb25seSoKKyAgICoKKyAgICogICBJZiBGcmVlVHlwZSBnZXRzIGNvbXBpbGVkIHdpdGggRlRfQ09ORklHX09QVElPTl9VU0VfSEFSRkJVWlogdG8gbWFrZQorICAgKiAgIHRoZSBIYXJmQnV6eiBsaWJyYXJ5IGFjY2VzcyBPcGVuVHlwZSBmZWF0dXJlcyBmb3IgZ2V0dGluZyBiZXR0ZXIKKyAgICogICBnbHlwaCBjb3ZlcmFnZXMsIHRoaXMgcHJvcGVydHkgc2V0cyB0aGUgKGF1dG8tZml0dGVyKSBzY3JpcHQgdG8gYmUKKyAgICogICB1c2VkIGZvciB0aGUgZGVmYXVsdCAoT3BlblR5cGUpIHNjcmlwdCBkYXRhIG9mIGEgZm9udCdzIEdTVUIgdGFibGUuCisgICAqICAgRmVhdHVyZXMgZm9yIHRoZSBkZWZhdWx0IHNjcmlwdCBhcmUgaW50ZW5kZWQgZm9yIGFsbCBzY3JpcHRzIG5vdAorICAgKiAgIGV4cGxpY2l0bHkgaGFuZGxlZCBpbiBHU1VCOyBhbiBleGFtcGxlIGlzIGEgYGRsaWcnIGZlYXR1cmUsCisgICAqICAgY29udGFpbmluZyB0aGUgY29tYmluYXRpb24gb2YgdGhlIGNoYXJhY3RlcnMgYFQnLCBgRScsIGFuZCBgTCcgdG8KKyAgICogICBmb3JtIGEgYFRFTCcgbGlnYXR1cmUuCisgICAqCisgICAqICAgQnkgZGVmYXVsdCwgdGhpcyBpcyBARlRfQVVUT0hJTlRFUl9TQ1JJUFRfTEFUSU4uICBVc2luZyB0aGUKKyAgICogICBgZGVmYXVsdC1zY3JpcHQnIHByb3BlcnR5LCB0aGlzIGRlZmF1bHQgdmFsdWUgY2FuIGJlIGNoYW5nZWQuCisgICAqCisgICAqICAgeworICAgKiAgICAgRlRfTGlicmFyeSAgbGlicmFyeTsKKyAgICogICAgIEZUX1VJbnQgICAgIGRlZmF1bHRfc2NyaXB0ID0gRlRfQVVUT0hJTlRFUl9TQ1JJUFRfTk9ORTsKKyAgICoKKyAgICoKKyAgICogICAgIEZUX0luaXRfRnJlZVR5cGUoICZsaWJyYXJ5ICk7CisgICAqCisgICAqICAgICBGVF9Qcm9wZXJ0eV9TZXQoIGxpYnJhcnksICJhdXRvZml0dGVyIiwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQtc2NyaXB0IiwgJmRlZmF1bHRfc2NyaXB0ICk7CisgICAqICAgfQorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHdpdGggQEZUX1Byb3BlcnR5X0dldCBhbHNvLgorICAgKgorICAgKiAgIEl0J3MgaW1wb3J0YW50IHRvIHVzZSB0aGUgcmlnaHQgdGltaW5nIGZvciBjaGFuZ2luZyB0aGlzIHZhbHVlOiBUaGUKKyAgICogICBjcmVhdGlvbiBvZiB0aGUgZ2x5cGgtdG8tc2NyaXB0IG1hcCB0aGF0IGV2ZW50dWFsbHkgdXNlcyB0aGUKKyAgICogICBkZWZhdWx0IHNjcmlwdCB2YWx1ZSBnZXRzIHRyaWdnZXJlZCBlaXRoZXIgYnkgc2V0dGluZyBvciByZWFkaW5nIGEKKyAgICogICBmYWNlLXNwZWNpZmljIHByb3BlcnR5IGxpa2UgQGdseXBoLXRvLXNjcmlwdC1tYXAsIG9yIGJ5IGF1dG8taGludGluZworICAgKiAgIGFueSBnbHlwaCBmcm9tIHRoYXQgZmFjZS4gIEluIHBhcnRpY3VsYXIsIGlmIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZAorICAgKiAgIGFuIEBGVF9GYWNlIHN0cnVjdHVyZSBidXQgbm90IGxvYWRlZCBhbnkgZ2x5cGggKHVzaW5nIHRoZQorICAgKiAgIGF1dG8taGludGVyKSwgYSBjaGFuZ2Ugb2YgdGhlIGRlZmF1bHQgc2NyaXB0IHdpbGwgYWZmZWN0IHRoaXMgZmFjZS4KKyAgICoKKyAgICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHByb3BlcnR5OgorICAgKiAgIGluY3JlYXNlLXgtaGVpZ2h0CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBGb3IgcHBlbSB2YWx1ZXMgaW4gdGhlIHJhbmdlIDZ+PD0gcHBlbSA8PSBgaW5jcmVhc2UteC1oZWlnaHQnLCByb3VuZAorICAgKiAgIHVwIHRoZSBmb250J3MgeH5oZWlnaHQgbXVjaCBtb3JlIG9mdGVuIHRoYW4gbm9ybWFsbHkuICBJZiB0aGUgdmFsdWUKKyAgICogICBpcyBzZXQgdG9+MCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQsIHRoaXMgZmVhdHVyZSBpcyBzd2l0Y2hlZCBvZmYuICBVc2UKKyAgICogICB0aGlzIHByb3BlcnR5IHRvIGltcHJvdmUgdGhlIGxlZ2liaWxpdHkgb2Ygc21hbGwgZm9udCBzaXplcyBpZgorICAgKiAgIG5lY2Vzc2FyeS4KKyAgICoKKyAgICogICB7CisgICAqICAgICBGVF9MaWJyYXJ5ICAgICAgICAgICAgICAgbGlicmFyeTsKKyAgICogICAgIEZUX0ZhY2UgICAgICAgICAgICAgICAgICBmYWNlOworICAgKiAgICAgRlRfUHJvcF9JbmNyZWFzZVhIZWlnaHQgIHByb3A7CisgICAqCisgICAqCisgICAqICAgICBGVF9Jbml0X0ZyZWVUeXBlKCAmbGlicmFyeSApOworICAgKiAgICAgRlRfTmV3X0ZhY2UoIGxpYnJhcnksICJmb28udHRmIiwgMCwgJmZhY2UgKTsKKyAgICogICAgIEZUX1NldF9DaGFyX1NpemUoIGZhY2UsIDEwICogNjQsIDAsIDcyLCAwICk7CisgICAqCisgICAqICAgICBwcm9wLmZhY2UgID0gZmFjZTsKKyAgICogICAgIHByb3AubGltaXQgPSAxNDsKKyAgICoKKyAgICogICAgIEZUX1Byb3BlcnR5X1NldCggbGlicmFyeSwgImF1dG9maXR0ZXIiLAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jcmVhc2UteC1oZWlnaHQiLCAmcHJvcCApOworICAgKiAgIH0KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB3aXRoIEBGVF9Qcm9wZXJ0eV9HZXQgYWxzby4KKyAgICoKKyAgICogICBTZXQgdGhpcyB2YWx1ZSByaWdodCBhZnRlciBjYWxsaW5nIEBGVF9TZXRfQ2hhcl9TaXplLCBidXQgYmVmb3JlCisgICAqICAgbG9hZGluZyBhbnkgZ2x5cGggKHVzaW5nIHRoZSBhdXRvLWhpbnRlcikuCisgICAqCisgICAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRfUHJvcF9JbmNyZWFzZVhIZWlnaHQKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoZSBkYXRhIGV4Y2hhbmdlIHN0cnVjdHVyZSBmb3IgdGhlIEBpbmNyZWFzZS14LWhlaWdodCBwcm9wZXJ0eS4KKyAgICoKKyAgICovCisgIHR5cGVkZWYgc3RydWN0ICBGVF9Qcm9wX0luY3JlYXNlWEhlaWdodF8KKyAgeworICAgIEZUX0ZhY2UgIGZhY2U7CisgICAgRlRfVUludCAgbGltaXQ7CisKKyAgfSBGVF9Qcm9wX0luY3JlYXNlWEhlaWdodDsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAcHJvcGVydHk6CisgICAqICAgd2FycGluZworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgKkV4cGVyaW1lbnRhbCogKm9ubHkqCisgICAqCisgICAqICAgSWYgRnJlZVR5cGUgZ2V0cyBjb21waWxlZCB3aXRoIG9wdGlvbiBBRl9DT05GSUdfT1BUSU9OX1VTRV9XQVJQRVIgdG8KKyAgICogICBhY3RpdmF0ZSB0aGUgd2FycCBoaW50aW5nIGNvZGUgaW4gdGhlIGF1dG8taGludGVyLCB0aGlzIHByb3BlcnR5CisgICAqICAgc3dpdGNoZXMgd2FycGluZyBvbiBhbmQgb2ZmLgorICAgKgorICAgKiAgIFdhcnBpbmcgb25seSB3b3JrcyBpbiBgbGlnaHQnIGF1dG8taGludGluZyBtb2RlLiAgVGhlIGlkZWEgb2YgdGhlCisgICAqICAgY29kZSBpcyB0byBzbGlnaHRseSBzY2FsZSBhbmQgc2hpZnQgYSBnbHlwaCBhbG9uZyB0aGUgbm9uLWhpbnRlZAorICAgKiAgIGRpbWVuc2lvbiAod2hpY2ggaXMgdXN1YWxseSB0aGUgaG9yaXpvbnRhbCBheGlzKSBzbyB0aGF0IGFzIG11Y2ggb2YKKyAgICogICBpdHMgc2VnbWVudHMgYXJlIGFsaWduZWQgKG1vcmUgb3IgbGVzcykgdG8gdGhlIGdyaWQuICBUbyBmaW5kIG91dCBhCisgICAqICAgZ2x5cGgncyBvcHRpbWFsIHNjYWxpbmcgYW5kIHNoaWZ0aW5nIHZhbHVlLCB2YXJpb3VzIHBhcmFtZXRlcgorICAgKiAgIGNvbWJpbmF0aW9ucyBhcmUgdHJpZWQgYW5kIHNjb3JlZC4KKyAgICoKKyAgICogICBCeSBkZWZhdWx0LCB3YXJwaW5nIGlzIG9mZi4gIFRoZSBleGFtcGxlIGJlbG93IHNob3dzIGhvdyB0byBzd2l0Y2ggb24KKyAgICogICB3YXJwaW5nIChvbWl0dGluZyB0aGUgZXJyb3IgaGFuZGxpbmcpLgorICAgKgorICAgKiAgIHsKKyAgICogICAgIEZUX0xpYnJhcnkgIGxpYnJhcnk7CisgICAqICAgICBGVF9Cb29sICAgICB3YXJwaW5nID0gMTsKKyAgICoKKyAgICoKKyAgICogICAgIEZUX0luaXRfRnJlZVR5cGUoICZsaWJyYXJ5ICk7CisgICAqCisgICAqICAgICBGVF9Qcm9wZXJ0eV9TZXQoIGxpYnJhcnksICJhdXRvZml0dGVyIiwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhcnBpbmciLCAmd2FycGluZyApOworICAgKiAgIH0KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB3aXRoIEBGVF9Qcm9wZXJ0eV9HZXQgYWxzby4KKyAgICoKKyAgICogICBUaGUgd2FycGluZyBjb2RlIGNhbiBhbHNvIGNoYW5nZSBhZHZhbmNlIHdpZHRocy4gIEhhdmUgYSBsb29rIGF0IHRoZQorICAgKiAgIGBsc2JfZGVsdGEnIGFuZCBgcnNiX2RlbHRhJyBmaWVsZHMgaW4gdGhlIEBGVF9HbHlwaFNsb3RSZWMgc3RydWN0dXJlCisgICAqICAgZm9yIGRldGFpbHMgb24gaW1wcm92aW5nIGludGVyLWdseXBoIGRpc3RhbmNlcyB3aGlsZSByZW5kZXJpbmcuCisgICAqCisgICAqICAgU2luY2Ugd2FycGluZyBpcyBhIGdsb2JhbCBwcm9wZXJ0eSBvZiB0aGUgYXV0by1oaW50ZXIgaXQgaXMgYmVzdCB0bworICAgKiAgIGNoYW5nZSBpdHMgdmFsdWUgYmVmb3JlIHJlbmRlcmluZyBhbnkgZmFjZS4gIE90aGVyd2lzZSwgeW91IHNob3VsZAorICAgKiAgIHJlbG9hZCBhbGwgZmFjZXMgdGhhdCBnZXQgYXV0by1oaW50ZWQgaW4gYGxpZ2h0JyBoaW50aW5nIG1vZGUuCisgICAqCisgICAqLworCisKKyAgLyogKi8KKworCitGVF9FTkRfSEVBREVSCisKKyNlbmRpZiAvKiBfX0ZUQVVUT0hfSF9fICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0YmJveC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGJib3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDlkMDQwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGJib3guaApAQCAtMCwwICsxLDEwMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRiYm94LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWVUeXBlIGV4YWN0IGJib3ggY29tcHV0YXRpb24gKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhpcyBjb21wb25lbnQgaGFzIGEgX3NpbmdsZV8gcm9sZTogdG8gY29tcHV0ZSBleGFjdCBvdXRsaW5lIGJvdW5kaW5nICovCisgIC8qIGJveGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSXQgaXMgc2VwYXJhdGVkIGZyb20gdGhlIHJlc3Qgb2YgdGhlIGVuZ2luZSBmb3IgdmFyaW91cyB0ZWNobmljYWwgICAgICovCisgIC8qIHJlYXNvbnMuICBJdCBtYXkgd2VsbCBiZSBpbnRlZ3JhdGVkIGluIGBmdG91dGxuJyBsYXRlci4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0ZUQkJPWF9IX18KKyNkZWZpbmUgX19GVEJCT1hfSF9fCisKKworI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CisjaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisKKyNpZmRlZiBGUkVFVFlQRV9ICisjZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgorI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCisjZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKKyNlbmRpZgorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgb3V0bGluZV9wcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX091dGxpbmVfR2V0X0JCb3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENvbXB1dGUgdGhlIGV4YWN0IGJvdW5kaW5nIGJveCBvZiBhbiBvdXRsaW5lLiAgVGhpcyBpcyBzbG93ZXIgICAgICAqLworICAvKiAgICB0aGFuIGNvbXB1dGluZyB0aGUgY29udHJvbCBib3guICBIb3dldmVyLCBpdCB1c2VzIGFuIGFkdmFuY2VkICAgICAgKi8KKyAgLyogICAgYWxnb3JpdGhtIHRoYXQgcmV0dXJucyBfdmVyeV8gcXVpY2tseSB3aGVuIHRoZSB0d28gYm94ZXMgICAgICAgICAgICovCisgIC8qICAgIGNvaW5jaWRlLiAgT3RoZXJ3aXNlLCB0aGUgb3V0bGluZSBCw6l6aWVyIGFyY3MgYXJlIHRyYXZlcnNlZCB0byAgICAgKi8KKyAgLyogICAgZXh0cmFjdCB0aGVpciBleHRyZW1hLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgb3V0bGluZSA6OiBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYWJib3ggICA6OiBUaGUgb3V0bGluZSdzIGV4YWN0IGJvdW5kaW5nIGJveC4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSWYgdGhlIGZvbnQgaXMgdHJpY2t5IGFuZCB0aGUgZ2x5cGggaGFzIGJlZW4gbG9hZGVkIHdpdGggICAgICAgICAgICovCisgIC8qICAgIEBGVF9MT0FEX05PX1NDQUxFLCB0aGUgcmVzdWx0aW5nIEJCb3ggaXMgbWVhbmluZ2xlc3MuICBUbyBnZXQgICAgICAqLworICAvKiAgICByZWFzb25hYmxlIHZhbHVlcyBmb3IgdGhlIEJCb3ggaXQgaXMgbmVjZXNzYXJ5IHRvIGxvYWQgdGhlIGdseXBoICAgKi8KKyAgLyogICAgYXQgYSBsYXJnZSBwcGVtIHZhbHVlIChzbyB0aGF0IHRoZSBoaW50aW5nIGluc3RydWN0aW9ucyBjYW4gICAgICAgICovCisgIC8qICAgIHByb3Blcmx5IHNoaWZ0IGFuZCBzY2FsZSB0aGUgc3ViZ2x5cGhzKSwgdGhlbiBleHRyYWN0aW5nIHRoZSBCQm94LCAqLworICAvKiAgICB3aGljaCBjYW4gYmUgZXZlbnR1YWxseSBjb252ZXJ0ZWQgYmFjayB0byBmb250IHVuaXRzLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9PdXRsaW5lX0dldF9CQm94KCBGVF9PdXRsaW5lKiAgb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlRfQkJveCAgICAgKmFiYm94ICk7CisKKyAgLyogKi8KKworCitGVF9FTkRfSEVBREVSCisKKyNlbmRpZiAvKiBfX0ZUQkJPWF9IX18gKi8KKworCisvKiBFTkQgKi8KKworCisvKiBMb2NhbCBWYXJpYWJsZXM6ICovCisvKiBjb2Rpbmc6IHV0Zi04ICAgICovCisvKiBFbmQ6ICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0YmRmLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0YmRmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJkYWJmNAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRiZGYuaApAQCAtMCwwICsxLDIxMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRiZGYuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWVUeXBlIEFQSSBmb3IgYWNjZXNzaW5nIEJERi1zcGVjaWZpYyBzdHJpbmdzIChzcGVjaWZpY2F0aW9uKS4gICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAyLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fRlRCREZfSF9fCisjZGVmaW5lIF9fRlRCREZfSF9fCisKKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAorCisjaWZkZWYgRlJFRVRZUEVfSAorI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKKyNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgorI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCisjZW5kaWYKKworCitGVF9CRUdJTl9IRUFERVIKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJkZl9mb250cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEJERiBhbmQgUENGIEZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEJERiBhbmQgUENGIHNwZWNpZmljIEFQSS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgZnVuY3Rpb25zIHNwZWNpZmljIHRvIEJERiAqLworICAvKiAgICBhbmQgUENGIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGVudW06CisgICAqICAgIEJERl9Qcm9wZXJ0eVR5cGUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgICBBIGxpc3Qgb2YgQkRGIHByb3BlcnR5IHR5cGVzLgorICAgKgorICAgKiBAdmFsdWVzOgorICAgKiAgICBCREZfUFJPUEVSVFlfVFlQRV9OT05FIDo6CisgICAqICAgICAgVmFsdWV+MCBpcyB1c2VkIHRvIGluZGljYXRlIGEgbWlzc2luZyBwcm9wZXJ0eS4KKyAgICoKKyAgICogICAgQkRGX1BST1BFUlRZX1RZUEVfQVRPTSA6OgorICAgKiAgICAgIFByb3BlcnR5IGlzIGEgc3RyaW5nIGF0b20uCisgICAqCisgICAqICAgIEJERl9QUk9QRVJUWV9UWVBFX0lOVEVHRVIgOjoKKyAgICogICAgICBQcm9wZXJ0eSBpcyBhIDMyLWJpdCBzaWduZWQgaW50ZWdlci4KKyAgICoKKyAgICogICAgQkRGX1BST1BFUlRZX1RZUEVfQ0FSRElOQUwgOjoKKyAgICogICAgICBQcm9wZXJ0eSBpcyBhIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyLgorICAgKi8KKyAgdHlwZWRlZiBlbnVtICBCREZfUHJvcGVydHlUeXBlXworICB7CisgICAgQkRGX1BST1BFUlRZX1RZUEVfTk9ORSAgICAgPSAwLAorICAgIEJERl9QUk9QRVJUWV9UWVBFX0FUT00gICAgID0gMSwKKyAgICBCREZfUFJPUEVSVFlfVFlQRV9JTlRFR0VSICA9IDIsCisgICAgQkRGX1BST1BFUlRZX1RZUEVfQ0FSRElOQUwgPSAzCisKKyAgfSBCREZfUHJvcGVydHlUeXBlOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHR5cGU6CisgICAqICAgIEJERl9Qcm9wZXJ0eQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgIEEgaGFuZGxlIHRvIGEgQEJERl9Qcm9wZXJ0eVJlYyBzdHJ1Y3R1cmUgdG8gbW9kZWwgYSBnaXZlbgorICAgKiAgICBCREYvUENGIHByb3BlcnR5LgorICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgQkRGX1Byb3BlcnR5UmVjXyogIEJERl9Qcm9wZXJ0eTsKKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIEBzdHJ1Y3Q6CisgICogICAgQkRGX1Byb3BlcnR5UmVjCisgICoKKyAgKiBAZGVzY3JpcHRpb246CisgICogICAgVGhpcyBzdHJ1Y3R1cmUgbW9kZWxzIGEgZ2l2ZW4gQkRGL1BDRiBwcm9wZXJ0eS4KKyAgKgorICAqIEBmaWVsZHM6CisgICogICAgdHlwZSA6OgorICAqICAgICAgVGhlIHByb3BlcnR5IHR5cGUuCisgICoKKyAgKiAgICB1LmF0b20gOjoKKyAgKiAgICAgIFRoZSBhdG9tIHN0cmluZywgaWYgdHlwZSBpcyBAQkRGX1BST1BFUlRZX1RZUEVfQVRPTS4gIE1heSBiZQorICAqICAgICAgTlVMTCwgaW5kaWNhdGluZyBhbiBlbXB0eSBzdHJpbmcuCisgICoKKyAgKiAgICB1LmludGVnZXIgOjoKKyAgKiAgICAgIEEgc2lnbmVkIGludGVnZXIsIGlmIHR5cGUgaXMgQEJERl9QUk9QRVJUWV9UWVBFX0lOVEVHRVIuCisgICoKKyAgKiAgICB1LmNhcmRpbmFsIDo6CisgICogICAgICBBbiB1bnNpZ25lZCBpbnRlZ2VyLCBpZiB0eXBlIGlzIEBCREZfUFJPUEVSVFlfVFlQRV9DQVJESU5BTC4KKyAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEJERl9Qcm9wZXJ0eVJlY18KKyAgeworICAgIEJERl9Qcm9wZXJ0eVR5cGUgIHR5cGU7CisgICAgdW5pb24geworICAgICAgY29uc3QgY2hhciogICAgIGF0b207CisgICAgICBGVF9JbnQzMiAgICAgICAgaW50ZWdlcjsKKyAgICAgIEZUX1VJbnQzMiAgICAgICBjYXJkaW5hbDsKKworICAgIH0gdTsKKworICB9IEJERl9Qcm9wZXJ0eVJlYzsKKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIEBmdW5jdGlvbjoKKyAgKiAgICBGVF9HZXRfQkRGX0NoYXJzZXRfSUQKKyAgKgorICAqIEBkZXNjcmlwdGlvbjoKKyAgKiAgICBSZXRyaWV2ZSBhIEJERiBmb250IGNoYXJhY3RlciBzZXQgaWRlbnRpdHksIGFjY29yZGluZyB0bworICAqICAgIHRoZSBCREYgc3BlY2lmaWNhdGlvbi4KKyAgKgorICAqIEBpbnB1dDoKKyAgKiAgICBmYWNlIDo6CisgICogICAgICAgQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCisgICoKKyAgKiBAb3V0cHV0OgorICAqICAgIGFjaGFyc2V0X2VuY29kaW5nIDo6CisgICogICAgICAgQ2hhcnNldCBlbmNvZGluZywgYXMgYSBDfnN0cmluZywgb3duZWQgYnkgdGhlIGZhY2UuCisgICoKKyAgKiAgICBhY2hhcnNldF9yZWdpc3RyeSA6OgorICAqICAgICAgIENoYXJzZXQgcmVnaXN0cnksIGFzIGEgQ35zdHJpbmcsIG93bmVkIGJ5IHRoZSBmYWNlLgorICAqCisgICogQHJldHVybjoKKyAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICoKKyAgKiBAbm90ZToKKyAgKiAgIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyB3aXRoIEJERiBmYWNlcywgcmV0dXJuaW5nIGFuIGVycm9yIG90aGVyd2lzZS4KKyAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX0dldF9CREZfQ2hhcnNldF9JRCggRlRfRmFjZSAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAqYWNoYXJzZXRfZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICphY2hhcnNldF9yZWdpc3RyeSApOworCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCisgICogQGZ1bmN0aW9uOgorICAqICAgIEZUX0dldF9CREZfUHJvcGVydHkKKyAgKgorICAqIEBkZXNjcmlwdGlvbjoKKyAgKiAgICBSZXRyaWV2ZSBhIEJERiBwcm9wZXJ0eSBmcm9tIGEgQkRGIG9yIFBDRiBmb250IGZpbGUuCisgICoKKyAgKiBAaW5wdXQ6CisgICogICAgZmFjZSA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KKyAgKgorICAqICAgIG5hbWUgOjogVGhlIHByb3BlcnR5IG5hbWUuCisgICoKKyAgKiBAb3V0cHV0OgorICAqICAgIGFwcm9wZXJ0eSA6OiBUaGUgcHJvcGVydHkuCisgICoKKyAgKiBAcmV0dXJuOgorICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgKgorICAqIEBub3RlOgorICAqICAgVGhpcyBmdW5jdGlvbiB3b3JrcyB3aXRoIEJERiBfYW5kXyBQQ0YgZm9udHMuICBJdCByZXR1cm5zIGFuIGVycm9yCisgICogICBvdGhlcndpc2UuICBJdCBhbHNvIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHByb3BlcnR5IGlzIG5vdCBpbiB0aGUKKyAgKiAgIGZvbnQuCisgICoKKyAgKiAgIEEgYHByb3BlcnR5JyBpcyBhIGVpdGhlciBrZXktdmFsdWUgcGFpciB3aXRoaW4gdGhlIFNUQVJUUFJPUEVSVElFUworICAqICAgLi4uIEVORFBST1BFUlRJRVMgYmxvY2sgb2YgYSBCREYgZm9udCBvciBhIGtleS12YWx1ZSBwYWlyIGZyb20gdGhlCisgICogICBgaW5mby0+cHJvcHMnIGFycmF5IHdpdGhpbiBhIGBGb250UmVjJyBzdHJ1Y3R1cmUgb2YgYSBQQ0YgZm9udC4KKyAgKgorICAqICAgSW50ZWdlciBwcm9wZXJ0aWVzIGFyZSBhbHdheXMgc3RvcmVkIGFzIGBzaWduZWQnIHdpdGhpbiBQQ0YgZm9udHM7CisgICogICBjb25zZXF1ZW50bHksIEBCREZfUFJPUEVSVFlfVFlQRV9DQVJESU5BTCBpcyBhIHBvc3NpYmxlIHJldHVybiB2YWx1ZQorICAqICAgZm9yIEJERiBmb250cyBvbmx5LgorICAqCisgICogICBJbiBjYXNlIG9mIGVycm9yLCBgYXByb3BlcnR5LT50eXBlJyBpcyBhbHdheXMgc2V0IHRvCisgICogICBAQkRGX1BST1BFUlRZX1RZUEVfTk9ORS4KKyAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX0dldF9CREZfUHJvcGVydHkoIEZUX0ZhY2UgICAgICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgICAgIHByb3BfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQkRGX1Byb3BlcnR5UmVjICAqYXByb3BlcnR5ICk7CisKKyAgLyogKi8KKworRlRfRU5EX0hFQURFUgorCisjZW5kaWYgLyogX19GVEJERl9IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRiaXRtYXAuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRiaXRtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmNjNDdiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGJpdG1hcC5oCkBAIC0wLDAgKzEsMjQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBmdGJpdG1hcC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnJlZVR5cGUgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGJpdG1hcHMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDQtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX19GVEJJVE1BUF9IX18KKyNkZWZpbmUgX19GVEJJVE1BUF9IX18KKworCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKworI2lmZGVmIEZSRUVUWVBFX0gKKyNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCisjZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKKyNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgorI2VuZGlmCisKKworRlRfQkVHSU5fSEVBREVSCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBiaXRtYXBfaGFuZGxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBCaXRtYXAgSGFuZGxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBIYW5kbGluZyBGVF9CaXRtYXAgb2JqZWN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBARlRfQml0bWFwIG9iamVjdHMuICAgKi8KKyAgLyogICAgTm90ZSB0aGF0IG5vbmUgb2YgdGhlIGZ1bmN0aW9ucyBjaGFuZ2VzIHRoZSBiaXRtYXAncyBgZmxvdycgKGFzICAgICovCisgIC8qICAgIGluZGljYXRlZCBieSB0aGUgc2lnbiBvZiB0aGUgYHBpdGNoJyBmaWVsZCBpbiBgRlRfQml0bWFwJykuICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9CaXRtYXBfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJbml0aWFsaXplIGEgcG9pbnRlciB0byBhbiBARlRfQml0bWFwIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhYml0bWFwIDo6IEEgcG9pbnRlciB0byB0aGUgYml0bWFwIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGRlcHJlY2F0ZWQgbmFtZSBmb3IgdGhlIHNhbWUgZnVuY3Rpb24gaXMgYEZUX0JpdG1hcF9OZXcnLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggdm9pZCApCisgIEZUX0JpdG1hcF9Jbml0KCBGVF9CaXRtYXAgICphYml0bWFwICk7CisKKworICAvKiBkZXByZWNhdGVkICovCisgIEZUX0VYUE9SVCggdm9pZCApCisgIEZUX0JpdG1hcF9OZXcoIEZUX0JpdG1hcCAgKmFiaXRtYXAgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0JpdG1hcF9Db3B5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENvcHkgYSBiaXRtYXAgaW50byBhbm90aGVyIG9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gYSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc291cmNlICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdGFyZ2V0ICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfQml0bWFwX0NvcHkoIEZUX0xpYnJhcnkgICAgICAgIGxpYnJhcnksCisgICAgICAgICAgICAgICAgICBjb25zdCBGVF9CaXRtYXAgICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICBGVF9CaXRtYXAgICAgICAgICp0YXJnZXQpOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfQml0bWFwX0VtYm9sZGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRW1ib2xkZW4gYSBiaXRtYXAuICBUaGUgbmV3IGJpdG1hcCB3aWxsIGJlIGFib3V0IGB4U3RyZW5ndGgnICAgICAgICovCisgIC8qICAgIHBpeGVscyB3aWRlciBhbmQgYHlTdHJlbmd0aCcgcGl4ZWxzIGhpZ2hlci4gIFRoZSBsZWZ0IGFuZCBib3R0b20gICAqLworICAvKiAgICBib3JkZXJzIGFyZSBrZXB0IHVuY2hhbmdlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaWJyYXJ5ICAgOjogQSBoYW5kbGUgdG8gYSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHhTdHJlbmd0aCA6OiBIb3cgc3Ryb25nIHRoZSBnbHlwaCBpcyBlbWJvbGRlbmVkIGhvcml6b250YWxseS4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgRXhwcmVzc2VkIGluIDI2LjYgcGl4ZWwgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHlTdHJlbmd0aCA6OiBIb3cgc3Ryb25nIHRoZSBnbHlwaCBpcyBlbWJvbGRlbmVkIHZlcnRpY2FsbHkuICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgRXhwcmVzc2VkIGluIDI2LjYgcGl4ZWwgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBiaXRtYXAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiByZXN0cmljdHMgYHhTdHJlbmd0aCcgdG8gYmUgbGVzcyB0aGFuICAgKi8KKyAgLyogICAgb3IgZXF1YWwgdG9+OCBpZiBiaXRtYXAgaXMgb2YgcGl4ZWxfbW9kZSBARlRfUElYRUxfTU9ERV9NT05PLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJZiB5b3Ugd2FudCB0byBlbWJvbGRlbiB0aGUgYml0bWFwIG93bmVkIGJ5IGEgQEZUX0dseXBoU2xvdFJlYywgICAgKi8KKyAgLyogICAgeW91IHNob3VsZCBjYWxsIEBGVF9HbHlwaFNsb3RfT3duX0JpdG1hcCBvbiB0aGUgc2xvdCBmaXJzdC4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBCaXRtYXBzIGluIEBGVF9QSVhFTF9NT0RFX0dSQVkyIGFuZCBARlRfUElYRUxfTU9ERV9HUkFZQCBmb3JtYXQgICAgKi8KKyAgLyogICAgYXJlIGNvbnZlcnRlZCB0byBARlRfUElYRUxfTU9ERV9HUkFZIGZvcm1hdCAoaS5lLiwgOGJwcCkuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfQml0bWFwX0VtYm9sZGVuKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCogIGJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB4U3RyZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeVN0cmVuZ3RoICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9CaXRtYXBfQ29udmVydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDb252ZXJ0IGEgYml0bWFwIG9iamVjdCB3aXRoIGRlcHRoIDFicHAsIDJicHAsIDRicHAsIDhicHAgb3IgMzJicHAgKi8KKyAgLyogICAgdG8gYSBiaXRtYXAgb2JqZWN0IHdpdGggZGVwdGggOGJwcCwgbWFraW5nIHRoZSBudW1iZXIgb2YgdXNlZCAgICAgICovCisgIC8qICAgIGJ5dGVzIGxpbmUgKGEuay5hLiB0aGUgYHBpdGNoJykgYSBtdWx0aXBsZSBvZiBgYWxpZ25tZW50Jy4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpYnJhcnkgICA6OiBBIGhhbmRsZSB0byBhIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc291cmNlICAgIDo6IFRoZSBzb3VyY2UgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhbGlnbm1lbnQgOjogVGhlIHBpdGNoIG9mIHRoZSBiaXRtYXAgaXMgYSBtdWx0aXBsZSBvZiB0aGlzICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgIHBhcmFtZXRlci4gIENvbW1vbiB2YWx1ZXMgYXJlIDEsIDIsIG9yIDQuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdGFyZ2V0ICAgIDo6IFRoZSB0YXJnZXQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSXQgaXMgcG9zc2libGUgdG8gY2FsbCBARlRfQml0bWFwX0NvbnZlcnQgbXVsdGlwbGUgdGltZXMgd2l0aG91dCAgICovCisgIC8qICAgIGNhbGxpbmcgQEZUX0JpdG1hcF9Eb25lICh0aGUgbWVtb3J5IGlzIHNpbXBseSByZWFsbG9jYXRlZCkuICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVXNlIEBGVF9CaXRtYXBfRG9uZSB0byBmaW5hbGx5IHJlbW92ZSB0aGUgYml0bWFwIG9iamVjdC4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgYGxpYnJhcnknIGFyZ3VtZW50IGlzIHRha2VuIHRvIGhhdmUgYWNjZXNzIHRvIEZyZWVUeXBlJ3MgICAgICAgKi8KKyAgLyogICAgbWVtb3J5IGhhbmRsaW5nIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfQml0bWFwX0NvbnZlcnQoIEZUX0xpYnJhcnkgICAgICAgIGxpYnJhcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9CaXRtYXAgICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICBGVF9CaXRtYXAgICAgICAgICp0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgICBhbGlnbm1lbnQgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0dseXBoU2xvdF9Pd25fQml0bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE1ha2Ugc3VyZSB0aGF0IGEgZ2x5cGggc2xvdCBvd25zIGBzbG90LT5iaXRtYXAnLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNsb3QgOjogVGhlIGdseXBoIHNsb3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdG8gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBARlRfQml0bWFwX0VtYm9sZGVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9HbHlwaFNsb3RfT3duX0JpdG1hcCggRlRfR2x5cGhTbG90ICBzbG90ICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9CaXRtYXBfRG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBEZXN0cm95IGEgYml0bWFwIG9iamVjdCBpbml0aWFsaXplZCB3aXRoIEBGVF9CaXRtYXBfSW5pdC4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIGEgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJpdG1hcCAgOjogVGhlIGJpdG1hcCBvYmplY3QgdG8gYmUgZnJlZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBgbGlicmFyeScgYXJndW1lbnQgaXMgdGFrZW4gdG8gaGF2ZSBhY2Nlc3MgdG8gRnJlZVR5cGUncyAgICAgICAqLworICAvKiAgICBtZW1vcnkgaGFuZGxpbmcgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9CaXRtYXBfRG9uZSggRlRfTGlicmFyeSAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCAgKmJpdG1hcCApOworCisKKyAgLyogKi8KKworCitGVF9FTkRfSEVBREVSCisKKyNlbmRpZiAvKiBfX0ZUQklUTUFQX0hfXyAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGJ6aXAyLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0YnppcDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjVmOTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGJ6aXAyLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0YnppcDIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBCemlwMi1jb21wcmVzc2VkIHN0cmVhbSBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAxMC0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSm9lbCBLbGluZ2hlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0ZUQlpJUDJfSF9fCisjZGVmaW5lIF9fRlRCWklQMl9IX18KKworI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CisjaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisKKyNpZmRlZiBGUkVFVFlQRV9ICisjZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgorI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCisjZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKKyNlbmRpZgorCisKK0ZUX0JFR0lOX0hFQURFUgorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJ6aXAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEJaSVAyIFN0cmVhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFVzaW5nIGJ6aXAyLWNvbXByZXNzZWQgZm9udCBmaWxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgQnppcDItc3BlY2lmaWMgZnVuY3Rpb25zLiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIEBmdW5jdGlvbjoKKyAgKiAgIEZUX1N0cmVhbV9PcGVuQnppcDIKKyAgKgorICAqIEBkZXNjcmlwdGlvbjoKKyAgKiAgIE9wZW4gYSBuZXcgc3RyZWFtIHRvIHBhcnNlIGJ6aXAyLWNvbXByZXNzZWQgZm9udCBmaWxlcy4gIFRoaXMgaXMKKyAgKiAgIG1haW5seSB1c2VkIHRvIHN1cHBvcnQgdGhlIGNvbXByZXNzZWQgYCoucGNmLmJ6MicgZm9udHMgdGhhdCBjb21lCisgICogICB3aXRoIFhGcmVlODYuCisgICoKKyAgKiBAaW5wdXQ6CisgICogICBzdHJlYW0gOjoKKyAgKiAgICAgVGhlIHRhcmdldCBlbWJlZGRpbmcgc3RyZWFtLgorICAqCisgICogICBzb3VyY2UgOjoKKyAgKiAgICAgVGhlIHNvdXJjZSBzdHJlYW0uCisgICoKKyAgKiBAcmV0dXJuOgorICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgKgorICAqIEBub3RlOgorICAqICAgVGhlIHNvdXJjZSBzdHJlYW0gbXVzdCBiZSBvcGVuZWQgX2JlZm9yZV8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICAqCisgICogICBDYWxsaW5nIHRoZSBpbnRlcm5hbCBmdW5jdGlvbiBgRlRfU3RyZWFtX0Nsb3NlJyBvbiB0aGUgbmV3IHN0cmVhbSB3aWxsCisgICogICAqbm90KiBjYWxsIGBGVF9TdHJlYW1fQ2xvc2UnIG9uIHRoZSBzb3VyY2Ugc3RyZWFtLiAgTm9uZSBvZiB0aGUgc3RyZWFtCisgICogICBvYmplY3RzIHdpbGwgYmUgcmVsZWFzZWQgdG8gdGhlIGhlYXAuCisgICoKKyAgKiAgIFRoZSBzdHJlYW0gaW1wbGVtZW50YXRpb24gaXMgdmVyeSBiYXNpYyBhbmQgcmVzZXRzIHRoZSBkZWNvbXByZXNzaW9uCisgICogICBwcm9jZXNzIGVhY2ggdGltZSBzZWVraW5nIGJhY2t3YXJkcyBpcyBuZWVkZWQgd2l0aGluIHRoZSBzdHJlYW0uCisgICoKKyAgKiAgIEluIGNlcnRhaW4gYnVpbGRzIG9mIHRoZSBsaWJyYXJ5LCBiemlwMiBjb21wcmVzc2lvbiByZWNvZ25pdGlvbiBpcworICAqICAgYXV0b21hdGljYWxseSBoYW5kbGVkIHdoZW4gY2FsbGluZyBARlRfTmV3X0ZhY2Ugb3IgQEZUX09wZW5fRmFjZS4KKyAgKiAgIFRoaXMgbWVhbnMgdGhhdCBpZiBubyBmb250IGRyaXZlciBpcyBjYXBhYmxlIG9mIGhhbmRsaW5nIHRoZSByYXcKKyAgKiAgIGNvbXByZXNzZWQgZmlsZSwgdGhlIGxpYnJhcnkgd2lsbCB0cnkgdG8gb3BlbiBhIGJ6aXAyIGNvbXByZXNzZWQgc3RyZWFtCisgICogICBmcm9tIGl0IGFuZCByZS1vcGVuIHRoZSBmYWNlIHdpdGggaXQuCisgICoKKyAgKiAgIFRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZScgaWYgeW91ciBidWlsZAorICAqICAgb2YgRnJlZVR5cGUgd2FzIG5vdCBjb21waWxlZCB3aXRoIGJ6aXAyIHN1cHBvcnQuCisgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9TdHJlYW1fT3BlbkJ6aXAyKCBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzb3VyY2UgKTsKKworICAvKiAqLworCisKK0ZUX0VORF9IRUFERVIKKworI2VuZGlmIC8qIF9fRlRCWklQMl9IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRjYWNoZS5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGNhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg1MjViYgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRjYWNoZS5oCkBAIC0wLDAgKzEsMTA1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRjYWNoZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWVUeXBlIENhY2hlIHN1YnN5c3RlbSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fRlRDQUNIRV9IX18KKyNkZWZpbmUgX19GVENBQ0hFX0hfXworCisKKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorI2luY2x1ZGUgRlRfR0xZUEhfSAorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogPFNlY3Rpb24+CisgICAqICAgIGNhY2hlX3N1YnN5c3RlbQorICAgKgorICAgKiA8VGl0bGU+CisgICAqICAgIENhY2hlIFN1Yi1TeXN0ZW0KKyAgICoKKyAgICogPEFic3RyYWN0PgorICAgKiAgICBIb3cgdG8gY2FjaGUgZmFjZSwgc2l6ZSwgYW5kIGdseXBoIGRhdGEgd2l0aCBGcmVlVHlwZX4yLgorICAgKgorICAgKiA8RGVzY3JpcHRpb24+CisgICAqICAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgRnJlZVR5cGV+MiBjYWNoZSBzdWItc3lzdGVtLCB3aGljaCBpcyB1c2VkCisgICAqICAgdG8gbGltaXQgdGhlIG51bWJlciBvZiBjb25jdXJyZW50bHkgb3BlbmVkIEBGVF9GYWNlIGFuZCBARlRfU2l6ZQorICAgKiAgIG9iamVjdHMsIGFzIHdlbGwgYXMgY2FjaGluZyBpbmZvcm1hdGlvbiBsaWtlIGNoYXJhY3RlciBtYXBzIGFuZCBnbHlwaAorICAgKiAgIGltYWdlcyB3aGlsZSBsaW1pdGluZyB0aGVpciBtYXhpbXVtIG1lbW9yeSB1c2FnZS4KKyAgICoKKyAgICogICBOb3RlIHRoYXQgYWxsIHR5cGVzIGFuZCBmdW5jdGlvbnMgYmVnaW4gd2l0aCB0aGUgYEZUQ18nIHByZWZpeC4KKyAgICoKKyAgICogICBUaGUgY2FjaGUgaXMgaGlnaGx5IHBvcnRhYmxlIGFuZCB0aHVzIGRvZXNuJ3Qga25vdyBhbnl0aGluZyBhYm91dCB0aGUKKyAgICogICBmb250cyBpbnN0YWxsZWQgb24geW91ciBzeXN0ZW0sIG9yIGhvdyB0byBhY2Nlc3MgdGhlbS4gIFRoaXMgaW1wbGllcworICAgKiAgIHRoZSBmb2xsb3dpbmcgc2NoZW1lOgorICAgKgorICAgKiAgIEZpcnN0LCBhdmFpbGFibGUgb3IgaW5zdGFsbGVkIGZvbnQgZmFjZXMgYXJlIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkKKyAgICogICBARlRDX0ZhY2VJRCB2YWx1ZXMsIHByb3ZpZGVkIHRvIHRoZSBjYWNoZSBieSB0aGUgY2xpZW50LiAgTm90ZSB0aGF0CisgICAqICAgdGhlIGNhY2hlIG9ubHkgc3RvcmVzIGFuZCBjb21wYXJlcyB0aGVzZSB2YWx1ZXMsIGFuZCBkb2Vzbid0IHRyeSB0bworICAgKiAgIGludGVycHJldCB0aGVtIGluIGFueSB3YXkuCisgICAqCisgICAqICAgU2Vjb25kLCB0aGUgY2FjaGUgY2FsbHMsIG9ubHkgd2hlbiBuZWVkZWQsIGEgY2xpZW50LXByb3ZpZGVkIGZ1bmN0aW9uCisgICAqICAgdG8gY29udmVydCBhbiBARlRDX0ZhY2VJRCBpbnRvIGEgbmV3IEBGVF9GYWNlIG9iamVjdC4gIFRoZSBsYXR0ZXIgaXMKKyAgICogICB0aGVuIGNvbXBsZXRlbHkgbWFuYWdlZCBieSB0aGUgY2FjaGUsIGluY2x1ZGluZyBpdHMgdGVybWluYXRpb24KKyAgICogICB0aHJvdWdoIEBGVF9Eb25lX0ZhY2UuICBUbyBtb25pdG9yIHRlcm1pbmF0aW9uIG9mIGZhY2Ugb2JqZWN0cywgdGhlCisgICAqICAgZmluYWxpemVyIGNhbGxiYWNrIGluIHRoZSBgZ2VuZXJpYycgZmllbGQgb2YgdGhlIEBGVF9GYWNlIG9iamVjdCBjYW4KKyAgICogICBiZSB1c2VkLCB3aGljaCBtaWdodCBhbHNvIGJlIHVzZWQgdG8gc3RvcmUgdGhlIEBGVENfRmFjZUlEIG9mIHRoZQorICAgKiAgIGZhY2UuCisgICAqCisgICAqICAgQ2xpZW50cyBhcmUgZnJlZSB0byBtYXAgZmFjZSBJRHMgdG8gYW55dGhpbmcgZWxzZS4gIFRoZSBtb3N0IHNpbXBsZQorICAgKiAgIHVzYWdlIGlzIHRvIGFzc29jaWF0ZSB0aGVtIHRvIGEgKHBhdGhuYW1lLGZhY2VfaW5kZXgpIHBhaXIgdGhhdCBpcworICAgKiAgIHVzZWQgdG8gY2FsbCBARlRfTmV3X0ZhY2UuICBIb3dldmVyLCBtb3JlIGNvbXBsZXggc2NoZW1lcyBhcmUgYWxzbworICAgKiAgIHBvc3NpYmxlLgorICAgKgorICAgKiAgIE5vdGUgdGhhdCBmb3IgdGhlIGNhY2hlIHRvIHdvcmsgY29ycmVjdGx5LCB0aGUgZmFjZSBJRCB2YWx1ZXMgbXVzdCBiZQorICAgKiAgICpwZXJzaXN0ZW50Kiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgY29udGVudHMgdGhleSBwb2ludCB0byBzaG91bGQgbm90CisgICAqICAgY2hhbmdlIGF0IHJ1bnRpbWUsIG9yIHRoYXQgdGhlaXIgdmFsdWUgc2hvdWxkIG5vdCBiZWNvbWUgaW52YWxpZC4KKyAgICoKKyAgICogICBJZiB0aGlzIGlzIHVuYXZvaWRhYmxlIChlLmcuLCB3aGVuIGEgZm9udCBpcyB1bmluc3RhbGxlZCBhdCBydW50aW1lKSwKKyAgICogICB5b3Ugc2hvdWxkIGNhbGwgQEZUQ19NYW5hZ2VyX1JlbW92ZUZhY2VJRCBhcyBzb29uIGFzIHBvc3NpYmxlLCB0byBsZXQKKyAgICogICB0aGUgY2FjaGUgZ2V0IHJpZCBvZiBhbnkgcmVmZXJlbmNlcyB0byB0aGUgb2xkIEBGVENfRmFjZUlEIGl0IG1heQorICAgKiAgIGtlZXAgaW50ZXJuYWxseS4gIEZhaWx1cmUgdG8gZG8gc28gd2lsbCBsZWFkIHRvIGluY29ycmVjdCBiZWhhdmlvdXIKKyAgICogICBvciBldmVuIGNyYXNoZXMuCisgICAqCisgICAqICAgVG8gdXNlIHRoZSBjYWNoZSwgc3RhcnQgd2l0aCBjYWxsaW5nIEBGVENfTWFuYWdlcl9OZXcgdG8gY3JlYXRlIGEgbmV3CisgICAqICAgQEZUQ19NYW5hZ2VyIG9iamVjdCwgd2hpY2ggbW9kZWxzIGEgc2luZ2xlIGNhY2hlIGluc3RhbmNlLiAgWW91IGNhbgorICAgKiAgIHRoZW4gbG9vayB1cCBARlRfRmFjZSBhbmQgQEZUX1NpemUgb2JqZWN0cyB3aXRoCisgICAqICAgQEZUQ19NYW5hZ2VyX0xvb2t1cEZhY2UgYW5kIEBGVENfTWFuYWdlcl9Mb29rdXBTaXplLCByZXNwZWN0aXZlbHkuCisgICAqCisgICAqICAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBjaGFybWFwIGNhY2hpbmcsIGNhbGwgQEZUQ19DTWFwQ2FjaGVfTmV3LCB0aGVuCisgICAqICAgbGF0ZXIgdXNlIEBGVENfQ01hcENhY2hlX0xvb2t1cCB0byBwZXJmb3JtIHRoZSBlcXVpdmFsZW50IG9mCisgICAqICAgQEZUX0dldF9DaGFyX0luZGV4LCBvbmx5IG11Y2ggZmFzdGVyLgorICAgKgorICAgKiAgIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgQEZUX0dseXBoIGNhY2hpbmcsIGNhbGwgQEZUQ19JbWFnZUNhY2hlLCB0aGVuCisgICAqICAgbGF0ZXIgdXNlIEBGVENfSW1hZ2VDYWNoZV9Mb29rdXAgdG8gcmV0cmlldmUgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICogICBARlRfR2x5cGggb2JqZWN0cyBmcm9tIHRoZSBjYWNoZS4KKyAgICoKKyAgICogICBJZiB5b3UgbmVlZCBsb3RzIG9mIHNtYWxsIGJpdG1hcHMsIGl0IGlzIG11Y2ggbW9yZSBtZW1vcnkgZWZmaWNpZW50CisgICAqICAgdG8gY2FsbCBARlRDX1NCaXRDYWNoZV9OZXcgZm9sbG93ZWQgYnkgQEZUQ19TQml0Q2FjaGVfTG9va3VwLiAgVGhpcworICAgKiAgIHJldHVybnMgQEZUQ19TQml0UmVjIHN0cnVjdHVyZXMsIHdoaWNoIGFyZSB1c2VkIHRvIHN0b3JlIHNtYWxsCisgICAqICAgYml0bWFwcyBkaXJlY3RseS4gIChBIHNtYWxsIGJpdG1hcCBpcyBvbmUgd2hvc2UgbWV0cmljcyBhbmQKKyAgICogICBkaW1lbnNpb25zIGFsbCBmaXQgaW50byA4LWJpdCBpbnRlZ2VycykuCisgICAqCisgICAqICAgV2UgaG9wZSB0byBhbHNvIHByb3ZpZGUgYSBrZXJuaW5nIGNhY2hlIGluIHRoZSBuZWFyIGZ1dHVyZS4KKyAgICoKKyAgICoKKyAgICogPE9yZGVyPgorICAgKiAgIEZUQ19NYW5hZ2VyCisgICAqICAgRlRDX0ZhY2VJRAorICAgKiAgIEZUQ19GYWNlX1JlcXVlc3RlcgorICAgKgorICAgKiAgIEZUQ19NYW5hZ2VyX05ldworICAgKiAgIEZUQ19NYW5hZ2VyX1Jlc2V0CisgICAqICAgRlRDX01hbmFnZXJfRG9uZQorICAgKiAgIEZUQ19NYW5hZ2VyX0xvb2t1cEZhY2UKKyAgICogICBGVENfTWFuYWdlcl9Mb29rdXBTaXplCisgICAqICAgRlRDX01hbmFnZXJfUmVtb3ZlRmFjZUlECisgICAqCisgICAqICAgRlRDX05vZGUKKyAgICogICBGVENfTm9kZV9VbnJlZgorICAgKgorICAgKiAgIEZUQ19JbWFnZUNhY2hlCisgICAqICAgRlRDX0ltYWdlQ2FjaGVfTmV3CisgICAqICAgRlRDX0ltYWdlQ2FjaGVfTG9va3VwCisgICAqCisgICAqICAgRlRDX1NCaXQKKyAgICogICBGVENfU0JpdENhY2hlCisgICAqICAgRlRDX1NCaXRDYWNoZV9OZXcKKyAgICogICBGVENfU0JpdENhY2hlX0xvb2t1cAorICAgKgorICAgKiAgIEZUQ19DTWFwQ2FjaGUKKyAgICogICBGVENfQ01hcENhY2hlX05ldworICAgKiAgIEZUQ19DTWFwQ2FjaGVfTG9va3VwCisgICAqCisgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCisgIC8qKioqKiAgICAgICAgICAgICAgICAgICAgQkFTSUMgVFlQRSBERUZJTklUSU9OUyAgICAgICAgICAgICAgICAgICAgICoqKioqLworICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOiBGVENfRmFjZUlECisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBbiBvcGFxdWUgcG9pbnRlciB0eXBlIHRoYXQgaXMgdXNlZCB0byBpZGVudGl0eSBmYWNlIG9iamVjdHMuICBUaGUKKyAgICogICBjb250ZW50cyBvZiBzdWNoIG9iamVjdHMgaXMgYXBwbGljYXRpb24tZGVwZW5kZW50LgorICAgKgorICAgKiAgIFRoZXNlIHBvaW50ZXJzIGFyZSB0eXBpY2FsbHkgdXNlZCB0byBwb2ludCB0byBhIHVzZXItZGVmaW5lZAorICAgKiAgIHN0cnVjdHVyZSBjb250YWluaW5nIGEgZm9udCBmaWxlIHBhdGgsIGFuZCBmYWNlIGluZGV4LgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBOZXZlciB1c2UgTlVMTCBhcyBhIHZhbGlkIEBGVENfRmFjZUlELgorICAgKgorICAgKiAgIEZhY2UgSURzIGFyZSBwYXNzZWQgYnkgdGhlIGNsaWVudCB0byB0aGUgY2FjaGUgbWFuYWdlciB0aGF0IGNhbGxzLAorICAgKiAgIHdoZW4gbmVlZGVkLCB0aGUgQEZUQ19GYWNlX1JlcXVlc3RlciB0byB0cmFuc2xhdGUgdGhlbSBpbnRvIG5ldworICAgKiAgIEBGVF9GYWNlIG9iamVjdHMuCisgICAqCisgICAqICAgSWYgdGhlIGNvbnRlbnQgb2YgYSBnaXZlbiBmYWNlIElEIGNoYW5nZXMgYXQgcnVudGltZSwgb3IgaWYgdGhlIHZhbHVlCisgICAqICAgYmVjb21lcyBpbnZhbGlkIChlLmcuLCB3aGVuIHVuaW5zdGFsbGluZyBhIGZvbnQpLCB5b3Ugc2hvdWxkCisgICAqICAgaW1tZWRpYXRlbHkgY2FsbCBARlRDX01hbmFnZXJfUmVtb3ZlRmFjZUlEIGJlZm9yZSBhbnkgb3RoZXIgY2FjaGUKKyAgICogICBmdW5jdGlvbi4KKyAgICoKKyAgICogICBGYWlsdXJlIHRvIGRvIHNvIHdpbGwgcmVzdWx0IGluIGluY29ycmVjdCBiZWhhdmlvdXIgb3IgZXZlbgorICAgKiAgIG1lbW9yeSBsZWFrcyBhbmQgY3Jhc2hlcy4KKyAgICovCisgIHR5cGVkZWYgRlRfUG9pbnRlciAgRlRDX0ZhY2VJRDsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIEZUQ19GYWNlX1JlcXVlc3RlcgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBjYWxsYmFjayBmdW5jdGlvbiBwcm92aWRlZCBieSBjbGllbnQgYXBwbGljYXRpb25zLiAgSXQgaXMgdXNlZCBieQorICAgKiAgIHRoZSBjYWNoZSBtYW5hZ2VyIHRvIHRyYW5zbGF0ZSBhIGdpdmVuIEBGVENfRmFjZUlEIGludG8gYSBuZXcgdmFsaWQKKyAgICogICBARlRfRmFjZSBvYmplY3QsIG9uIGRlbWFuZC4KKyAgICoKKyAgICogPElucHV0PgorICAgKiAgIGZhY2VfaWQgOjoKKyAgICogICAgIFRoZSBmYWNlIElEIHRvIHJlc29sdmUuCisgICAqCisgICAqICAgbGlicmFyeSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gYSBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdC4KKyAgICoKKyAgICogICByZXFfZGF0YSA6OgorICAgKiAgICAgQXBwbGljYXRpb24tcHJvdmlkZWQgcmVxdWVzdCBkYXRhIChzZWUgbm90ZSBiZWxvdykuCisgICAqCisgICAqIDxPdXRwdXQ+CisgICAqICAgYWZhY2UgOjoKKyAgICogICAgIEEgbmV3IEBGVF9GYWNlIGhhbmRsZS4KKyAgICoKKyAgICogPFJldHVybj4KKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiA8Tm90ZT4KKyAgICogICBUaGUgdGhpcmQgcGFyYW1ldGVyIGByZXFfZGF0YScgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSBwYXNzZWQgYnkgdGhlCisgICAqICAgY2xpZW50IHdoZW4gQEZUQ19NYW5hZ2VyX05ldyBpcyBjYWxsZWQuCisgICAqCisgICAqICAgVGhlIGZhY2UgcmVxdWVzdGVyIHNob3VsZCBub3QgcGVyZm9ybSBmdW5ueSB0aGluZ3Mgb24gdGhlIHJldHVybmVkCisgICAqICAgZmFjZSBvYmplY3QsIGxpa2UgY3JlYXRpbmcgYSBuZXcgQEZUX1NpemUgZm9yIGl0LCBvciBzZXR0aW5nIGEKKyAgICogICB0cmFuc2Zvcm1hdGlvbiB0aHJvdWdoIEBGVF9TZXRfVHJhbnNmb3JtIQorICAgKi8KKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKkZUQ19GYWNlX1JlcXVlc3RlcikoIEZUQ19GYWNlSUQgIGZhY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTGlicmFyeSAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICByZXFfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlKiAgICBhZmFjZSApOworCisgIC8qICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKyAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgIENBQ0hFIE1BTkFHRVIgT0JKRUNUICAgICAgICAgICAgICAgICAgICAgKioqKiovCisgIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRDX01hbmFnZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBvYmplY3QgY29ycmVzcG9uZHMgdG8gb25lIGluc3RhbmNlIG9mIHRoZSBjYWNoZS1zdWJzeXN0ZW0uICAgICovCisgIC8qICAgIEl0IGlzIHVzZWQgdG8gY2FjaGUgb25lIG9yIG1vcmUgQEZUX0ZhY2Ugb2JqZWN0cywgYWxvbmcgd2l0aCAgICAgICAqLworICAvKiAgICBjb3JyZXNwb25kaW5nIEBGVF9TaXplIG9iamVjdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBtYW5hZ2VyIGludGVudGlvbmFsbHkgbGltaXRzIHRoZSB0b3RhbCBudW1iZXIgb2Ygb3BlbmVkICAgICAgICAqLworICAvKiAgICBARlRfRmFjZSBhbmQgQEZUX1NpemUgb2JqZWN0cyB0byBjb250cm9sIG1lbW9yeSB1c2FnZS4gIFNlZSB0aGUgICAgKi8KKyAgLyogICAgYG1heF9mYWNlcycgYW5kIGBtYXhfc2l6ZXMnIHBhcmFtZXRlcnMgb2YgQEZUQ19NYW5hZ2VyX05ldy4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgbWFuYWdlciBpcyBhbHNvIHVzZWQgdG8gY2FjaGUgYG5vZGVzJyBvZiB2YXJpb3VzIHR5cGVzIHdoaWxlICAgKi8KKyAgLyogICAgbGltaXRpbmcgdGhlaXIgdG90YWwgbWVtb3J5IHVzYWdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbGwgbGltaXRhdGlvbnMgYXJlIGVuZm9yY2VkIGJ5IGtlZXBpbmcgbGlzdHMgb2YgbWFuYWdlZCBvYmplY3RzICAgKi8KKyAgLyogICAgaW4gbW9zdC1yZWNlbnRseS11c2VkIG9yZGVyLCBhbmQgZmx1c2hpbmcgb2xkIG5vZGVzIHRvIG1ha2Ugcm9vbSAgICovCisgIC8qICAgIGZvciBuZXcgb25lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgRlRDX01hbmFnZXJSZWNfKiAgRlRDX01hbmFnZXI7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVENfTm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbiBvcGFxdWUgaGFuZGxlIHRvIGEgY2FjaGUgbm9kZSBvYmplY3QuICBFYWNoIGNhY2hlIG5vZGUgaXMgICAgICAgKi8KKyAgLyogICAgcmVmZXJlbmNlLWNvdW50ZWQuICBBIG5vZGUgd2l0aCBhIGNvdW50IG9mfjAgbWlnaHQgYmUgZmx1c2hlZCAgICAgICovCisgIC8qICAgIG91dCBvZiBhIGZ1bGwgY2FjaGUgd2hlbmV2ZXIgYSBsb29rdXAgcmVxdWVzdCBpcyBwZXJmb3JtZWQuICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSWYgeW91IGxvb2sgdXAgbm9kZXMsIHlvdSBoYXZlIHRoZSBhYmlsaXR5IHRvIGBhY3F1aXJlJyB0aGVtLCAgICAgICovCisgIC8qICAgIGkuZS4sIHRvIGluY3JlbWVudCB0aGVpciByZWZlcmVuY2UgY291bnQuICBUaGlzIHdpbGwgcHJldmVudCB0aGUgICAqLworICAvKiAgICBub2RlIGZyb20gYmVpbmcgZmx1c2hlZCBvdXQgb2YgdGhlIGNhY2hlIHVudGlsIHlvdSBleHBsaWNpdGx5ICAgICAgKi8KKyAgLyogICAgYHJlbGVhc2UnIGl0IChzZWUgQEZUQ19Ob2RlX1VucmVmKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTZWUgYWxzbyBARlRDX1NCaXRDYWNoZV9Mb29rdXAgYW5kIEBGVENfSW1hZ2VDYWNoZV9Mb29rdXAuICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IEZUQ19Ob2RlUmVjXyogIEZUQ19Ob2RlOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRDX01hbmFnZXJfTmV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ3JlYXRlIGEgbmV3IGNhY2hlIG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlicmFyeSAgIDo6IFRoZSBwYXJlbnQgRnJlZVR5cGUgbGlicmFyeSBoYW5kbGUgdG8gdXNlLiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhfZmFjZXMgOjogTWF4aW11bSBudW1iZXIgb2Ygb3BlbmVkIEBGVF9GYWNlIG9iamVjdHMgbWFuYWdlZCBieSAgKi8KKyAgLyogICAgICAgICAgICAgICAgIHRoaXMgY2FjaGUgaW5zdGFuY2UuICBVc2V+MCBmb3IgZGVmYXVsdHMuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhfc2l6ZXMgOjogTWF4aW11bSBudW1iZXIgb2Ygb3BlbmVkIEBGVF9TaXplIG9iamVjdHMgbWFuYWdlZCBieSAgKi8KKyAgLyogICAgICAgICAgICAgICAgIHRoaXMgY2FjaGUgaW5zdGFuY2UuICBVc2V+MCBmb3IgZGVmYXVsdHMuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhfYnl0ZXMgOjogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gdXNlIGZvciBjYWNoZWQgZGF0YSBub2Rlcy4gKi8KKyAgLyogICAgICAgICAgICAgICAgIFVzZX4wIGZvciBkZWZhdWx0cy4gIE5vdGUgdGhhdCB0aGlzIHZhbHVlIGRvZXMgbm90ICAgICovCisgIC8qICAgICAgICAgICAgICAgICBhY2NvdW50IGZvciBtYW5hZ2VkIEBGVF9GYWNlIGFuZCBARlRfU2l6ZSBvYmplY3RzLiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcmVxdWVzdGVyIDo6IEFuIGFwcGxpY2F0aW9uLXByb3ZpZGVkIGNhbGxiYWNrIHVzZWQgdG8gdHJhbnNsYXRlICAgICovCisgIC8qICAgICAgICAgICAgICAgICBmYWNlIElEcyBpbnRvIHJlYWwgQEZUX0ZhY2Ugb2JqZWN0cy4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcmVxX2RhdGEgIDo6IEEgZ2VuZXJpYyBwb2ludGVyIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSByZXF1ZXN0ZXIgICAgICovCisgIC8qICAgICAgICAgICAgICAgICBlYWNoIHRpbWUgaXQgaXMgY2FsbGVkIChzZWUgQEZUQ19GYWNlX1JlcXVlc3RlcikuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFtYW5hZ2VyICA6OiBBIGhhbmRsZSB0byBhIG5ldyBtYW5hZ2VyIG9iamVjdC4gIDB+aW4gY2FzZSBvZiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgZmFpbHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVENfTWFuYWdlcl9OZXcoIEZUX0xpYnJhcnkgICAgICAgICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgIG1heF9mYWNlcywKKyAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgIG1heF9zaXplcywKKyAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgICAgIG1heF9ieXRlcywKKyAgICAgICAgICAgICAgICAgICBGVENfRmFjZV9SZXF1ZXN0ZXIgIHJlcXVlc3RlciwKKyAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgICAgICAgIHJlcV9kYXRhLAorICAgICAgICAgICAgICAgICAgIEZUQ19NYW5hZ2VyICAgICAgICAqYW1hbmFnZXIgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUQ19NYW5hZ2VyX1Jlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVtcHR5IGEgZ2l2ZW4gY2FjaGUgbWFuYWdlci4gIFRoaXMgc2ltcGx5IGdldHMgcmlkIG9mIGFsbCB0aGUgICAgICAqLworICAvKiAgICBjdXJyZW50bHkgY2FjaGVkIEBGVF9GYWNlIGFuZCBARlRfU2l6ZSBvYmplY3RzIHdpdGhpbiB0aGUgbWFuYWdlci4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYW5hZ2VyIDo6IEEgaGFuZGxlIHRvIHRoZSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggdm9pZCApCisgIEZUQ19NYW5hZ2VyX1Jlc2V0KCBGVENfTWFuYWdlciAgbWFuYWdlciApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRDX01hbmFnZXJfRG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRGVzdHJveSBhIGdpdmVuIG1hbmFnZXIgYWZ0ZXIgZW1wdHlpbmcgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWFuYWdlciA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGNhY2hlIG1hbmFnZXIgb2JqZWN0LiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIHZvaWQgKQorICBGVENfTWFuYWdlcl9Eb25lKCBGVENfTWFuYWdlciAgbWFuYWdlciApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRDX01hbmFnZXJfTG9va3VwRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmV0cmlldmUgdGhlIEBGVF9GYWNlIG9iamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgZ2l2ZW4gZmFjZSBJRCAgICovCisgIC8qICAgIHRocm91Z2ggYSBjYWNoZSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1hbmFnZXIgOjogQSBoYW5kbGUgdG8gdGhlIGNhY2hlIG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZV9pZCA6OiBUaGUgSUQgb2YgdGhlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYWZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIHJldHVybmVkIEBGVF9GYWNlIG9iamVjdCBpcyBhbHdheXMgb3duZWQgYnkgdGhlIG1hbmFnZXIuICBZb3UgICovCisgIC8qICAgIHNob3VsZCBuZXZlciB0cnkgdG8gZGlzY2FyZCBpdCB5b3Vyc2VsZi4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIEBGVF9GYWNlIG9iamVjdCBkb2Vzbid0IG5lY2Vzc2FyaWx5IGhhdmUgYSBjdXJyZW50IHNpemUgb2JqZWN0ICovCisgIC8qICAgIChpLmUuLCBmYWNlLT5zaXplIGNhbiBiZX4wKS4gIElmIHlvdSBuZWVkIGEgc3BlY2lmaWMgYGZvbnQgc2l6ZScsICAqLworICAvKiAgICB1c2UgQEZUQ19NYW5hZ2VyX0xvb2t1cFNpemUgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE5ldmVyIGNoYW5nZSB0aGUgZmFjZSdzIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCAoaS5lLiwgbmV2ZXIgY2FsbCAgICAqLworICAvKiAgICB0aGUgQEZUX1NldF9UcmFuc2Zvcm0gZnVuY3Rpb24pIG9uIGEgcmV0dXJuZWQgZmFjZSEgIElmIHlvdSBuZWVkICAgKi8KKyAgLyogICAgdG8gdHJhbnNmb3JtIGdseXBocywgZG8gaXQgeW91cnNlbGYgYWZ0ZXIgZ2x5cGggbG9hZGluZy4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBXaGVuIHlvdSBwZXJmb3JtIGEgbG9va3VwLCBvdXQtb2YtbWVtb3J5IGVycm9ycyBhcmUgZGV0ZWN0ZWQgICAgICAgKi8KKyAgLyogICAgX3dpdGhpbl8gdGhlIGxvb2t1cCBhbmQgZm9yY2UgaW5jcmVtZW50YWwgZmx1c2hlcyBvZiB0aGUgY2FjaGUgICAgICovCisgIC8qICAgIHVudGlsIGVub3VnaCBtZW1vcnkgaXMgcmVsZWFzZWQgZm9yIHRoZSBsb29rdXAgdG8gc3VjY2VlZC4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSWYgYSBsb29rdXAgZmFpbHMgd2l0aCBgRlRfRXJyX091dF9PZl9NZW1vcnknIHRoZSBjYWNoZSBoYXMgICAgICAgICovCisgIC8qICAgIGFscmVhZHkgYmVlbiBjb21wbGV0ZWx5IGZsdXNoZWQsIGFuZCBzdGlsbCBubyBtZW1vcnkgd2FzIGF2YWlsYWJsZSAqLworICAvKiAgICBmb3IgdGhlIG9wZXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVENfTWFuYWdlcl9Mb29rdXBGYWNlKCBGVENfTWFuYWdlciAgbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX0ZhY2VJRCAgIGZhY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICphZmFjZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRDX1NjYWxlclJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSBhIGdpdmVuIGNoYXJhY3RlciBzaXplIGluIGVpdGhlciAgICAgICovCisgIC8qICAgIHBpeGVscyBvciBwb2ludHMgdG8gdGhlIGNhY2hlIG1hbmFnZXIuICBTZWUgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBARlRDX01hbmFnZXJfTG9va3VwU2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlX2lkIDo6IFRoZSBzb3VyY2UgZmFjZSBJRC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHdpZHRoICAgOjogVGhlIGNoYXJhY3RlciB3aWR0aC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaGVpZ2h0ICA6OiBUaGUgY2hhcmFjdGVyIGhlaWdodC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwaXhlbCAgIDo6IEEgQm9vbGVhbi4gIElmIDEsIHRoZSBgd2lkdGgnIGFuZCBgaGVpZ2h0JyBmaWVsZHMgYXJlICAgKi8KKyAgLyogICAgICAgICAgICAgICBpbnRlcnByZXRlZCBhcyBpbnRlZ2VyIHBpeGVsIGNoYXJhY3RlciBzaXplcy4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGV5IGFyZSBleHByZXNzZWQgYXMgMS82NHRoIG9mIHBvaW50cy4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeF9yZXMgICA6OiBPbmx5IHVzZWQgd2hlbiBgcGl4ZWwnIGlzIHZhbHVlfjAgdG8gaW5kaWNhdGUgdGhlICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgaG9yaXpvbnRhbCByZXNvbHV0aW9uIGluIGRwaS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeV9yZXMgICA6OiBPbmx5IHVzZWQgd2hlbiBgcGl4ZWwnIGlzIHZhbHVlfjAgdG8gaW5kaWNhdGUgdGhlICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgdmVydGljYWwgcmVzb2x1dGlvbiBpbiBkcGkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgdHlwZSBpcyBtYWlubHkgdXNlZCB0byByZXRyaWV2ZSBARlRfU2l6ZSBvYmplY3RzIHRocm91Z2ggdGhlICAqLworICAvKiAgICBjYWNoZSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBGVENfU2NhbGVyUmVjXworICB7CisgICAgRlRDX0ZhY2VJRCAgZmFjZV9pZDsKKyAgICBGVF9VSW50ICAgICB3aWR0aDsKKyAgICBGVF9VSW50ICAgICBoZWlnaHQ7CisgICAgRlRfSW50ICAgICAgcGl4ZWw7CisgICAgRlRfVUludCAgICAgeF9yZXM7CisgICAgRlRfVUludCAgICAgeV9yZXM7CisKKyAgfSBGVENfU2NhbGVyUmVjOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRDX1NjYWxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBoYW5kbGUgdG8gYW4gQEZUQ19TY2FsZXJSZWMgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCBGVENfU2NhbGVyUmVjXyogIEZUQ19TY2FsZXI7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVENfTWFuYWdlcl9Mb29rdXBTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZXRyaWV2ZSB0aGUgQEZUX1NpemUgb2JqZWN0IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBnaXZlbiAgICAgICAgICAgKi8KKyAgLyogICAgQEZUQ19TY2FsZXJSZWMgcG9pbnRlciB0aHJvdWdoIGEgY2FjaGUgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWFuYWdlciA6OiBBIGhhbmRsZSB0byB0aGUgY2FjaGUgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzY2FsZXIgIDo6IEEgc2NhbGVyIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhc2l6ZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgcmV0dXJuZWQgQEZUX1NpemUgb2JqZWN0IGlzIGFsd2F5cyBvd25lZCBieSB0aGUgbWFuYWdlci4gIFlvdSAgKi8KKyAgLyogICAgc2hvdWxkIG5ldmVyIHRyeSB0byBkaXNjYXJkIGl0IGJ5IHlvdXJzZWxmLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBZb3UgY2FuIGFjY2VzcyB0aGUgcGFyZW50IEBGVF9GYWNlIG9iamVjdCBzaW1wbHkgYXMgYHNpemUtPmZhY2UnICAgKi8KKyAgLyogICAgaWYgeW91IG5lZWQgaXQuICBOb3RlIHRoYXQgdGhpcyBvYmplY3QgaXMgYWxzbyBvd25lZCBieSB0aGUgICAgICAgICovCisgIC8qICAgIG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFdoZW4geW91IHBlcmZvcm0gYSBsb29rdXAsIG91dC1vZi1tZW1vcnkgZXJyb3JzIGFyZSBkZXRlY3RlZCAgICAgICAqLworICAvKiAgICBfd2l0aGluXyB0aGUgbG9va3VwIGFuZCBmb3JjZSBpbmNyZW1lbnRhbCBmbHVzaGVzIG9mIHRoZSBjYWNoZSAgICAgKi8KKyAgLyogICAgdW50aWwgZW5vdWdoIG1lbW9yeSBpcyByZWxlYXNlZCBmb3IgdGhlIGxvb2t1cCB0byBzdWNjZWVkLiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJZiBhIGxvb2t1cCBmYWlscyB3aXRoIGBGVF9FcnJfT3V0X09mX01lbW9yeScgdGhlIGNhY2hlIGhhcyAgICAgICAgKi8KKyAgLyogICAgYWxyZWFkeSBiZWVuIGNvbXBsZXRlbHkgZmx1c2hlZCwgYW5kIHN0aWxsIG5vIG1lbW9yeSBpcyBhdmFpbGFibGUgICovCisgIC8qICAgIGZvciB0aGUgb3BlcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUQ19NYW5hZ2VyX0xvb2t1cFNpemUoIEZUQ19NYW5hZ2VyICBtYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfU2NhbGVyICAgc2NhbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TaXplICAgICAqYXNpemUgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUQ19Ob2RlX1VucmVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERlY3JlbWVudCBhIGNhY2hlIG5vZGUncyBpbnRlcm5hbCByZWZlcmVuY2UgY291bnQuICBXaGVuIHRoZSBjb3VudCAqLworICAvKiAgICByZWFjaGVzIDAsIGl0IGlzIG5vdCBkZXN0cm95ZWQgYnV0IGJlY29tZXMgZWxpZ2libGUgZm9yIHN1YnNlcXVlbnQgKi8KKyAgLyogICAgY2FjaGUgZmx1c2hlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbm9kZSAgICA6OiBUaGUgY2FjaGUgbm9kZSBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYW5hZ2VyIDo6IFRoZSBjYWNoZSBtYW5hZ2VyIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggdm9pZCApCisgIEZUQ19Ob2RlX1VucmVmKCBGVENfTm9kZSAgICAgbm9kZSwKKyAgICAgICAgICAgICAgICAgIEZUQ19NYW5hZ2VyICBtYW5hZ2VyICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRDX01hbmFnZXJfUmVtb3ZlRmFjZUlECisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIHNwZWNpYWwgZnVuY3Rpb24gdXNlZCB0byBpbmRpY2F0ZSB0byB0aGUgY2FjaGUgbWFuYWdlciB0aGF0CisgICAqICAgYSBnaXZlbiBARlRDX0ZhY2VJRCBpcyBubyBsb25nZXIgdmFsaWQsIGVpdGhlciBiZWNhdXNlIGl0cworICAgKiAgIGNvbnRlbnQgY2hhbmdlZCwgb3IgYmVjYXVzZSBpdCB3YXMgZGVhbGxvY2F0ZWQgb3IgdW5pbnN0YWxsZWQuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBtYW5hZ2VyIDo6CisgICAqICAgICBUaGUgY2FjaGUgbWFuYWdlciBoYW5kbGUuCisgICAqCisgICAqICAgZmFjZV9pZCA6OgorICAgKiAgICAgVGhlIEBGVENfRmFjZUlEIHRvIGJlIHJlbW92ZWQuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoaXMgZnVuY3Rpb24gZmx1c2hlcyBhbGwgbm9kZXMgZnJvbSB0aGUgY2FjaGUgY29ycmVzcG9uZGluZyB0byB0aGlzCisgICAqICAgYGZhY2VfaWQnLCB3aXRoIHRoZSBleGNlcHRpb24gb2Ygbm9kZXMgd2l0aCBhIG5vbi1udWxsIHJlZmVyZW5jZQorICAgKiAgIGNvdW50LgorICAgKgorICAgKiAgIFN1Y2ggbm9kZXMgYXJlIGhvd2V2ZXIgbW9kaWZpZWQgaW50ZXJuYWxseSBzbyBhcyB0byBuZXZlciBhcHBlYXIKKyAgICogICBpbiBsYXRlciBsb29rdXBzIHdpdGggdGhlIHNhbWUgYGZhY2VfaWQnIHZhbHVlLCBhbmQgdG8gYmUgaW1tZWRpYXRlbHkKKyAgICogICBkZXN0cm95ZWQgd2hlbiByZWxlYXNlZCBieSBhbGwgdGhlaXIgdXNlcnMuCisgICAqCisgICAqLworICBGVF9FWFBPUlQoIHZvaWQgKQorICBGVENfTWFuYWdlcl9SZW1vdmVGYWNlSUQoIEZUQ19NYW5hZ2VyICBtYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19GYWNlSUQgICBmYWNlX2lkICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjYWNoZV9zdWJzeXN0ZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOgorICAgKiAgIEZUQ19DTWFwQ2FjaGUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEFuIG9wYXF1ZSBoYW5kbGUgdXNlZCB0byBtb2RlbCBhIGNoYXJtYXAgY2FjaGUuICBUaGlzIGNhY2hlIGlzIHRvCisgICAqICAgaG9sZCBjaGFyYWN0ZXIgY29kZXMgLT4gZ2x5cGggaW5kaWNlcyBtYXBwaW5ncy4KKyAgICoKKyAgICovCisgIHR5cGVkZWYgc3RydWN0IEZUQ19DTWFwQ2FjaGVSZWNfKiAgRlRDX0NNYXBDYWNoZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVENfQ01hcENhY2hlX05ldworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQ3JlYXRlIGEgbmV3IGNoYXJtYXAgY2FjaGUuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBtYW5hZ2VyIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgY2FjaGUgbWFuYWdlci4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBhY2FjaGUgOjoKKyAgICogICAgIEEgbmV3IGNhY2hlIGhhbmRsZS4gIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBMaWtlIGFsbCBvdGhlciBjYWNoZXMsIHRoaXMgb25lIHdpbGwgYmUgZGVzdHJveWVkIHdpdGggdGhlIGNhY2hlCisgICAqICAgbWFuYWdlci4KKyAgICoKKyAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVENfQ01hcENhY2hlX05ldyggRlRDX01hbmFnZXIgICAgIG1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICBGVENfQ01hcENhY2hlICAqYWNhY2hlICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVENfQ01hcENhY2hlX0xvb2t1cAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVHJhbnNsYXRlIGEgY2hhcmFjdGVyIGNvZGUgaW50byBhIGdseXBoIGluZGV4LCB1c2luZyB0aGUgY2hhcm1hcAorICAgKiAgIGNhY2hlLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgY2FjaGUgOjoKKyAgICogICAgIEEgY2hhcm1hcCBjYWNoZSBoYW5kbGUuCisgICAqCisgICAqICAgZmFjZV9pZCA6OgorICAgKiAgICAgVGhlIHNvdXJjZSBmYWNlIElELgorICAgKgorICAgKiAgIGNtYXBfaW5kZXggOjoKKyAgICogICAgIFRoZSBpbmRleCBvZiB0aGUgY2hhcm1hcCBpbiB0aGUgc291cmNlIGZhY2UuICBBbnkgbmVnYXRpdmUgdmFsdWUKKyAgICogICAgIG1lYW5zIHRvIHVzZSB0aGUgY2FjaGUgQEZUX0ZhY2UncyBkZWZhdWx0IGNoYXJtYXAuCisgICAqCisgICAqICAgY2hhcl9jb2RlIDo6CisgICAqICAgICBUaGUgY2hhcmFjdGVyIGNvZGUgKGluIHRoZSBjb3JyZXNwb25kaW5nIGNoYXJtYXApLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgICBHbHlwaCBpbmRleC4gIDB+bWVhbnMgYG5vIGdseXBoJy4KKyAgICoKKyAgICovCisgIEZUX0VYUE9SVCggRlRfVUludCApCisgIEZUQ19DTWFwQ2FjaGVfTG9va3VwKCBGVENfQ01hcENhY2hlICBjYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19GYWNlSUQgICAgIGZhY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBjbWFwX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAgICAgY2hhcl9jb2RlICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjYWNoZV9zdWJzeXN0ZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCisgIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgSU1BR0UgQ0FDSEUgT0JKRUNUICAgICAgICAgICAgICAgICAgICAgICoqKioqLworICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRDX0ltYWdlVHlwZVJlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCB0aGUgdHlwZSBvZiBpbWFnZXMgaW4gYSBnbHlwaCBjYWNoZS4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBmYWNlX2lkIDo6CisgICAqICAgICBUaGUgZmFjZSBJRC4KKyAgICoKKyAgICogICB3aWR0aCA6OgorICAgKiAgICAgVGhlIHdpZHRoIGluIHBpeGVscy4KKyAgICoKKyAgICogICBoZWlnaHQgOjoKKyAgICogICAgIFRoZSBoZWlnaHQgaW4gcGl4ZWxzLgorICAgKgorICAgKiAgIGZsYWdzIDo6CisgICAqICAgICBUaGUgbG9hZCBmbGFncywgYXMgaW4gQEZUX0xvYWRfR2x5cGguCisgICAqCisgICAqLworICB0eXBlZGVmIHN0cnVjdCAgRlRDX0ltYWdlVHlwZVJlY18KKyAgeworICAgIEZUQ19GYWNlSUQgIGZhY2VfaWQ7CisgICAgRlRfVUludCAgICAgd2lkdGg7CisgICAgRlRfVUludCAgICAgaGVpZ2h0OworICAgIEZUX0ludDMyICAgIGZsYWdzOworCisgIH0gRlRDX0ltYWdlVHlwZVJlYzsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOgorICAgKiAgIEZUQ19JbWFnZVR5cGUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgaGFuZGxlIHRvIGFuIEBGVENfSW1hZ2VUeXBlUmVjIHN0cnVjdHVyZS4KKyAgICoKKyAgICovCisgIHR5cGVkZWYgc3RydWN0IEZUQ19JbWFnZVR5cGVSZWNfKiAgRlRDX0ltYWdlVHlwZTsKKworCisgIC8qICovCisKKworI2RlZmluZSBGVENfSU1BR0VfVFlQRV9DT01QQVJFKCBkMSwgZDIgKSAgICAgIFwKKyAgICAgICAgICAoIChkMSktPmZhY2VfaWQgPT0gKGQyKS0+ZmFjZV9pZCAmJiBcCisgICAgICAgICAgICAoZDEpLT53aWR0aCAgID09IChkMiktPndpZHRoICAgJiYgXAorICAgICAgICAgICAgKGQxKS0+ZmxhZ3MgICA9PSAoZDIpLT5mbGFncyAgICkKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUQ19JbWFnZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgaGFuZGxlIHRvIGEgZ2x5cGggaW1hZ2UgY2FjaGUgb2JqZWN0LiAgVGhleSBhcmUgZGVzaWduZWQgdG8gICAgICAqLworICAvKiAgICBob2xkIG1hbnkgZGlzdGluY3QgZ2x5cGggaW1hZ2VzIHdoaWxlIG5vdCBleGNlZWRpbmcgYSBjZXJ0YWluICAgICAgKi8KKyAgLyogICAgbWVtb3J5IHRocmVzaG9sZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCBGVENfSW1hZ2VDYWNoZVJlY18qICBGVENfSW1hZ2VDYWNoZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUQ19JbWFnZUNhY2hlX05ldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENyZWF0ZSBhIG5ldyBnbHlwaCBpbWFnZSBjYWNoZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1hbmFnZXIgOjogVGhlIHBhcmVudCBtYW5hZ2VyIGZvciB0aGUgaW1hZ2UgY2FjaGUuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFjYWNoZSAgOjogQSBoYW5kbGUgdG8gdGhlIG5ldyBnbHlwaCBpbWFnZSBjYWNoZSBvYmplY3QuICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUQ19JbWFnZUNhY2hlX05ldyggRlRDX01hbmFnZXIgICAgICBtYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgIEZUQ19JbWFnZUNhY2hlICAqYWNhY2hlICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVENfSW1hZ2VDYWNoZV9Mb29rdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZXRyaWV2ZSBhIGdpdmVuIGdseXBoIGltYWdlIGZyb20gYSBnbHlwaCBpbWFnZSBjYWNoZS4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjYWNoZSAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBnbHlwaCBpbWFnZSBjYWNoZS4gICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHR5cGUgICA6OiBBIHBvaW50ZXIgdG8gYSBnbHlwaCBpbWFnZSB0eXBlIGRlc2NyaXB0b3IuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2luZGV4IDo6IFRoZSBnbHlwaCBpbmRleCB0byByZXRyaWV2ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYWdseXBoIDo6IFRoZSBjb3JyZXNwb25kaW5nIEBGVF9HbHlwaCBvYmplY3QuICAwfmluIGNhc2Ugb2YgICAgICAgICovCisgIC8qICAgICAgICAgICAgICBmYWlsdXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYW5vZGUgIDo6IFVzZWQgdG8gcmV0dXJuIHRoZSBhZGRyZXNzIG9mIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNhY2hlICovCisgIC8qICAgICAgICAgICAgICBub2RlIGFmdGVyIGluY3JlbWVudGluZyBpdHMgcmVmZXJlbmNlIGNvdW50IChzZWUgbm90ZSAgICAqLworICAvKiAgICAgICAgICAgICAgYmVsb3cpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgcmV0dXJuZWQgZ2x5cGggaXMgb3duZWQgYW5kIG1hbmFnZWQgYnkgdGhlIGdseXBoIGltYWdlIGNhY2hlLiAgKi8KKyAgLyogICAgTmV2ZXIgdHJ5IHRvIHRyYW5zZm9ybSBvciBkaXNjYXJkIGl0IG1hbnVhbGx5ISAgWW91IGNhbiBob3dldmVyICAgICovCisgIC8qICAgIGNyZWF0ZSBhIGNvcHkgd2l0aCBARlRfR2x5cGhfQ29weSBhbmQgbW9kaWZ5IHRoZSBuZXcgb25lLiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSWYgYGFub2RlJyBpcyBfbm90XyBOVUxMLCBpdCByZWNlaXZlcyB0aGUgYWRkcmVzcyBvZiB0aGUgY2FjaGUgICAgICovCisgIC8qICAgIG5vZGUgY29udGFpbmluZyB0aGUgZ2x5cGggaW1hZ2UsIGFmdGVyIGluY3JlYXNpbmcgaXRzIHJlZmVyZW5jZSAgICAqLworICAvKiAgICBjb3VudC4gIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBub2RlIChhcyB3ZWxsIGFzIHRoZSBARlRfR2x5cGgpIHdpbGwgKi8KKyAgLyogICAgYWx3YXlzIGJlIGtlcHQgaW4gdGhlIGNhY2hlIHVudGlsIHlvdSBjYWxsIEBGVENfTm9kZV9VbnJlZiB0byAgICAgICovCisgIC8qICAgIGByZWxlYXNlJyBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSWYgYGFub2RlJyBpcyBOVUxMLCB0aGUgY2FjaGUgbm9kZSBpcyBsZWZ0IHVuY2hhbmdlZCwgd2hpY2ggbWVhbnMgICovCisgIC8qICAgIHRoYXQgdGhlIEBGVF9HbHlwaCBjb3VsZCBiZSBmbHVzaGVkIG91dCBvZiB0aGUgY2FjaGUgb24gdGhlIG5leHQgICAqLworICAvKiAgICBjYWxsIHRvIG9uZSBvZiB0aGUgY2FjaGluZyBzdWItc3lzdGVtIEFQSXMuICBEb24ndCBhc3N1bWUgdGhhdCBpdCAgKi8KKyAgLyogICAgaXMgcGVyc2lzdGVudCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRDX0ltYWdlQ2FjaGVfTG9va3VwKCBGVENfSW1hZ2VDYWNoZSAgY2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX0ltYWdlVHlwZSAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIGdpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaCAgICAgICAqYWdseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19Ob2RlICAgICAgICphbm9kZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRDX0ltYWdlQ2FjaGVfTG9va3VwU2NhbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSB2YXJpYW50IG9mIEBGVENfSW1hZ2VDYWNoZV9Mb29rdXAgdGhhdCB1c2VzIGFuIEBGVENfU2NhbGVyUmVjICAgICovCisgIC8qICAgIHRvIHNwZWNpZnkgdGhlIGZhY2UgSUQgYW5kIGl0cyBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNhY2hlICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBnbHlwaCBpbWFnZSBjYWNoZS4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2NhbGVyICAgICA6OiBBIHBvaW50ZXIgdG8gYSBzY2FsZXIgZGVzY3JpcHRvci4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsb2FkX2ZsYWdzIDo6IFRoZSBjb3JyZXNwb25kaW5nIGxvYWQgZmxhZ3MuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdpbmRleCAgICAgOjogVGhlIGdseXBoIGluZGV4IHRvIHJldHJpZXZlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFnbHlwaCAgICAgOjogVGhlIGNvcnJlc3BvbmRpbmcgQEZUX0dseXBoIG9iamVjdC4gIDB+aW4gY2FzZSBvZiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIGZhaWx1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFub2RlICAgICAgOjogVXNlZCB0byByZXR1cm4gdGhlIGFkZHJlc3Mgb2Ygb2YgdGhlIGNvcnJlc3BvbmRpbmcgICAqLworICAvKiAgICAgICAgICAgICAgICAgIGNhY2hlIG5vZGUgYWZ0ZXIgaW5jcmVtZW50aW5nIGl0cyByZWZlcmVuY2UgY291bnQgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAoc2VlIG5vdGUgYmVsb3cpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIHJldHVybmVkIGdseXBoIGlzIG93bmVkIGFuZCBtYW5hZ2VkIGJ5IHRoZSBnbHlwaCBpbWFnZSBjYWNoZS4gICovCisgIC8qICAgIE5ldmVyIHRyeSB0byB0cmFuc2Zvcm0gb3IgZGlzY2FyZCBpdCBtYW51YWxseSEgIFlvdSBjYW4gaG93ZXZlciAgICAqLworICAvKiAgICBjcmVhdGUgYSBjb3B5IHdpdGggQEZUX0dseXBoX0NvcHkgYW5kIG1vZGlmeSB0aGUgbmV3IG9uZS4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIElmIGBhbm9kZScgaXMgX25vdF8gTlVMTCwgaXQgcmVjZWl2ZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGNhY2hlICAgICAqLworICAvKiAgICBub2RlIGNvbnRhaW5pbmcgdGhlIGdseXBoIGltYWdlLCBhZnRlciBpbmNyZWFzaW5nIGl0cyByZWZlcmVuY2UgICAgKi8KKyAgLyogICAgY291bnQuICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbm9kZSAoYXMgd2VsbCBhcyB0aGUgQEZUX0dseXBoKSB3aWxsICovCisgIC8qICAgIGFsd2F5cyBiZSBrZXB0IGluIHRoZSBjYWNoZSB1bnRpbCB5b3UgY2FsbCBARlRDX05vZGVfVW5yZWYgdG8gICAgICAqLworICAvKiAgICBgcmVsZWFzZScgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIElmIGBhbm9kZScgaXMgTlVMTCwgdGhlIGNhY2hlIG5vZGUgaXMgbGVmdCB1bmNoYW5nZWQsIHdoaWNoIG1lYW5zICAqLworICAvKiAgICB0aGF0IHRoZSBARlRfR2x5cGggY291bGQgYmUgZmx1c2hlZCBvdXQgb2YgdGhlIGNhY2hlIG9uIHRoZSBuZXh0ICAgKi8KKyAgLyogICAgY2FsbCB0byBvbmUgb2YgdGhlIGNhY2hpbmcgc3ViLXN5c3RlbSBBUElzLiAgRG9uJ3QgYXNzdW1lIHRoYXQgaXQgICovCisgIC8qICAgIGlzIHBlcnNpc3RlbnQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ2FsbHMgdG8gQEZUX1NldF9DaGFyX1NpemUgYW5kIGZyaWVuZHMgaGF2ZSBubyBlZmZlY3Qgb24gY2FjaGVkICAgICovCisgIC8qICAgIGdseXBoczsgeW91IHNob3VsZCBhbHdheXMgdXNlIHRoZSBGcmVlVHlwZSBjYWNoZSBBUEkgaW5zdGVhZC4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUQ19JbWFnZUNhY2hlX0xvb2t1cFNjYWxlciggRlRDX0ltYWdlQ2FjaGUgIGNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19TY2FsZXIgICAgICBzY2FsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgIGxvYWRfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIGdpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaCAgICAgICAqYWdseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19Ob2RlICAgICAgICphbm9kZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRDX1NCaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBoYW5kbGUgdG8gYSBzbWFsbCBiaXRtYXAgZGVzY3JpcHRvci4gIFNlZSB0aGUgQEZUQ19TQml0UmVjICAgICAgICovCisgIC8qICAgIHN0cnVjdHVyZSBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgRlRDX1NCaXRSZWNfKiAgRlRDX1NCaXQ7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVENfU0JpdFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHZlcnkgY29tcGFjdCBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSBhIHNtYWxsIGdseXBoIGJpdG1hcC4gICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB3aWR0aCAgICAgOjogVGhlIGJpdG1hcCB3aWR0aCBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGhlaWdodCAgICA6OiBUaGUgYml0bWFwIGhlaWdodCBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGVmdCAgICAgIDo6IFRoZSBob3Jpem9udGFsIGRpc3RhbmNlIGZyb20gdGhlIHBlbiBwb3NpdGlvbiB0byB0aGUgICovCisgIC8qICAgICAgICAgICAgICAgICBsZWZ0IGJpdG1hcCBib3JkZXIgKGEuay5hLiBgbGVmdCBzaWRlIGJlYXJpbmcnLCBvciAgICAqLworICAvKiAgICAgICAgICAgICAgICAgYGxzYicpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHRvcCAgICAgICA6OiBUaGUgdmVydGljYWwgZGlzdGFuY2UgZnJvbSB0aGUgcGVuIHBvc2l0aW9uIChvbiB0aGUgICAqLworICAvKiAgICAgICAgICAgICAgICAgYmFzZWxpbmUpIHRvIHRoZSB1cHBlciBiaXRtYXAgYm9yZGVyIChhLmsuYS4gYHRvcCAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgIHNpZGUgYmVhcmluZycpLiAgVGhlIGRpc3RhbmNlIGlzIHBvc2l0aXZlIGZvciB1cHdhcmRzICovCisgIC8qICAgICAgICAgICAgICAgICB5fmNvb3JkaW5hdGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZm9ybWF0ICAgIDo6IFRoZSBmb3JtYXQgb2YgdGhlIGdseXBoIGJpdG1hcCAobW9ub2Nocm9tZSBvciBncmF5KS4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhfZ3JheXMgOjogTWF4aW11bSBncmF5IGxldmVsIHZhbHVlIChpbiB0aGUgcmFuZ2UgMSB0b34yNTUpLiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBpdGNoICAgICA6OiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBiaXRtYXAgbGluZS4gIE1heSBiZSBwb3NpdGl2ZSAqLworICAvKiAgICAgICAgICAgICAgICAgb3IgbmVnYXRpdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHhhZHZhbmNlICA6OiBUaGUgaG9yaXpvbnRhbCBhZHZhbmNlIHdpZHRoIGluIHBpeGVscy4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeWFkdmFuY2UgIDo6IFRoZSB2ZXJ0aWNhbCBhZHZhbmNlIGhlaWdodCBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBidWZmZXIgICAgOjogQSBwb2ludGVyIHRvIHRoZSBiaXRtYXAgcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBGVENfU0JpdFJlY18KKyAgeworICAgIEZUX0J5dGUgICB3aWR0aDsKKyAgICBGVF9CeXRlICAgaGVpZ2h0OworICAgIEZUX0NoYXIgICBsZWZ0OworICAgIEZUX0NoYXIgICB0b3A7CisKKyAgICBGVF9CeXRlICAgZm9ybWF0OworICAgIEZUX0J5dGUgICBtYXhfZ3JheXM7CisgICAgRlRfU2hvcnQgIHBpdGNoOworICAgIEZUX0NoYXIgICB4YWR2YW5jZTsKKyAgICBGVF9DaGFyICAgeWFkdmFuY2U7CisKKyAgICBGVF9CeXRlKiAgYnVmZmVyOworCisgIH0gRlRDX1NCaXRSZWM7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVENfU0JpdENhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGhhbmRsZSB0byBhIHNtYWxsIGJpdG1hcCBjYWNoZS4gIFRoZXNlIGFyZSBzcGVjaWFsIGNhY2hlIG9iamVjdHMgKi8KKyAgLyogICAgdXNlZCB0byBzdG9yZSBzbWFsbCBnbHlwaCBiaXRtYXBzIChhbmQgYW50aS1hbGlhc2VkIHBpeG1hcHMpIGluIGEgICovCisgIC8qICAgIG11Y2ggbW9yZSBlZmZpY2llbnQgd2F5IHRoYW4gdGhlIHRyYWRpdGlvbmFsIGdseXBoIGltYWdlIGNhY2hlICAgICAqLworICAvKiAgICBpbXBsZW1lbnRlZCBieSBARlRDX0ltYWdlQ2FjaGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IEZUQ19TQml0Q2FjaGVSZWNfKiAgRlRDX1NCaXRDYWNoZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUQ19TQml0Q2FjaGVfTmV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENyZWF0ZSBhIG5ldyBjYWNoZSB0byBzdG9yZSBzbWFsbCBnbHlwaCBiaXRtYXBzLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1hbmFnZXIgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBjYWNoZSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFjYWNoZSAgOjogQSBoYW5kbGUgdG8gdGhlIG5ldyBzYml0IGNhY2hlLiAgTlVMTCBpbiBjYXNlIG9mIGVycm9yLiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUQ19TQml0Q2FjaGVfTmV3KCBGVENfTWFuYWdlciAgICAgbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgIEZUQ19TQml0Q2FjaGUgICphY2FjaGUgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUQ19TQml0Q2FjaGVfTG9va3VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvb2sgdXAgYSBnaXZlbiBzbWFsbCBnbHlwaCBiaXRtYXAgaW4gYSBnaXZlbiBzYml0IGNhY2hlIGFuZCAgICAgICAqLworICAvKiAgICBgbG9jaycgaXQgdG8gcHJldmVudCBpdHMgZmx1c2hpbmcgZnJvbSB0aGUgY2FjaGUgdW50aWwgbmVlZGVkLiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjYWNoZSAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBzYml0IGNhY2hlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHR5cGUgICA6OiBBIHBvaW50ZXIgdG8gdGhlIGdseXBoIGltYWdlIHR5cGUgZGVzY3JpcHRvci4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2luZGV4IDo6IFRoZSBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2JpdCAgIDo6IEEgaGFuZGxlIHRvIGEgc21hbGwgYml0bWFwIGRlc2NyaXB0b3IuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhbm9kZSAgOjogVXNlZCB0byByZXR1cm4gdGhlIGFkZHJlc3Mgb2Ygb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2FjaGUgKi8KKyAgLyogICAgICAgICAgICAgIG5vZGUgYWZ0ZXIgaW5jcmVtZW50aW5nIGl0cyByZWZlcmVuY2UgY291bnQgKHNlZSBub3RlICAgICovCisgIC8qICAgICAgICAgICAgICBiZWxvdykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBzbWFsbCBiaXRtYXAgZGVzY3JpcHRvciBhbmQgaXRzIGJpdCBidWZmZXIgYXJlIG93bmVkIGJ5IHRoZSAgICAqLworICAvKiAgICBjYWNoZSBhbmQgc2hvdWxkIG5ldmVyIGJlIGZyZWVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gIFRoZXkgbWlnaHQgICAgKi8KKyAgLyogICAgYXMgd2VsbCBkaXNhcHBlYXIgZnJvbSBtZW1vcnkgb24gdGhlIG5leHQgY2FjaGUgbG9va3VwLCBzbyBkb24ndCAgICovCisgIC8qICAgIHRyZWF0IHRoZW0gYXMgcGVyc2lzdGVudCBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGRlc2NyaXB0b3IncyBgYnVmZmVyJyBmaWVsZCBpcyBzZXQgdG9+MCB0byBpbmRpY2F0ZSBhIG1pc3NpbmcgICovCisgIC8qICAgIGdseXBoIGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSWYgYGFub2RlJyBpcyBfbm90XyBOVUxMLCBpdCByZWNlaXZlcyB0aGUgYWRkcmVzcyBvZiB0aGUgY2FjaGUgICAgICovCisgIC8qICAgIG5vZGUgY29udGFpbmluZyB0aGUgYml0bWFwLCBhZnRlciBpbmNyZWFzaW5nIGl0cyByZWZlcmVuY2UgY291bnQuICAqLworICAvKiAgICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbm9kZSAoYXMgd2VsbCBhcyB0aGUgaW1hZ2UpIHdpbGwgYWx3YXlzIGJlICAgKi8KKyAgLyogICAga2VwdCBpbiB0aGUgY2FjaGUgdW50aWwgeW91IGNhbGwgQEZUQ19Ob2RlX1VucmVmIHRvIGByZWxlYXNlJyBpdC4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJZiBgYW5vZGUnIGlzIE5VTEwsIHRoZSBjYWNoZSBub2RlIGlzIGxlZnQgdW5jaGFuZ2VkLCB3aGljaCBtZWFucyAgKi8KKyAgLyogICAgdGhhdCB0aGUgYml0bWFwIGNvdWxkIGJlIGZsdXNoZWQgb3V0IG9mIHRoZSBjYWNoZSBvbiB0aGUgbmV4dCAgICAgICovCisgIC8qICAgIGNhbGwgdG8gb25lIG9mIHRoZSBjYWNoaW5nIHN1Yi1zeXN0ZW0gQVBJcy4gIERvbid0IGFzc3VtZSB0aGF0IGl0ICAqLworICAvKiAgICBpcyBwZXJzaXN0ZW50ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVENfU0JpdENhY2hlX0xvb2t1cCggRlRDX1NCaXRDYWNoZSAgICBjYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19JbWFnZVR5cGUgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgZ2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgRlRDX1NCaXQgICAgICAgICpzYml0LAorICAgICAgICAgICAgICAgICAgICAgICAgRlRDX05vZGUgICAgICAgICphbm9kZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRDX1NCaXRDYWNoZV9Mb29rdXBTY2FsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSB2YXJpYW50IG9mIEBGVENfU0JpdENhY2hlX0xvb2t1cCB0aGF0IHVzZXMgYW4gQEZUQ19TY2FsZXJSZWMgICAgICovCisgIC8qICAgIHRvIHNwZWNpZnkgdGhlIGZhY2UgSUQgYW5kIGl0cyBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNhY2hlICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBzYml0IGNhY2hlLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2NhbGVyICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIHNjYWxlciBkZXNjcmlwdG9yLiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsb2FkX2ZsYWdzIDo6IFRoZSBjb3JyZXNwb25kaW5nIGxvYWQgZmxhZ3MuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdpbmRleCAgICAgOjogVGhlIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNiaXQgICAgICAgOjogQSBoYW5kbGUgdG8gYSBzbWFsbCBiaXRtYXAgZGVzY3JpcHRvci4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYW5vZGUgICAgICA6OiBVc2VkIHRvIHJldHVybiB0aGUgYWRkcmVzcyBvZiBvZiB0aGUgY29ycmVzcG9uZGluZyAgICovCisgIC8qICAgICAgICAgICAgICAgICAgY2FjaGUgbm9kZSBhZnRlciBpbmNyZW1lbnRpbmcgaXRzIHJlZmVyZW5jZSBjb3VudCAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIChzZWUgbm90ZSBiZWxvdykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgc21hbGwgYml0bWFwIGRlc2NyaXB0b3IgYW5kIGl0cyBiaXQgYnVmZmVyIGFyZSBvd25lZCBieSB0aGUgICAgKi8KKyAgLyogICAgY2FjaGUgYW5kIHNob3VsZCBuZXZlciBiZSBmcmVlZCBieSB0aGUgYXBwbGljYXRpb24uICBUaGV5IG1pZ2h0ICAgICovCisgIC8qICAgIGFzIHdlbGwgZGlzYXBwZWFyIGZyb20gbWVtb3J5IG9uIHRoZSBuZXh0IGNhY2hlIGxvb2t1cCwgc28gZG9uJ3QgICAqLworICAvKiAgICB0cmVhdCB0aGVtIGFzIHBlcnNpc3RlbnQgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBkZXNjcmlwdG9yJ3MgYGJ1ZmZlcicgZmllbGQgaXMgc2V0IHRvfjAgdG8gaW5kaWNhdGUgYSBtaXNzaW5nICAqLworICAvKiAgICBnbHlwaCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIElmIGBhbm9kZScgaXMgX25vdF8gTlVMTCwgaXQgcmVjZWl2ZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGNhY2hlICAgICAqLworICAvKiAgICBub2RlIGNvbnRhaW5pbmcgdGhlIGJpdG1hcCwgYWZ0ZXIgaW5jcmVhc2luZyBpdHMgcmVmZXJlbmNlIGNvdW50LiAgKi8KKyAgLyogICAgVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG5vZGUgKGFzIHdlbGwgYXMgdGhlIGltYWdlKSB3aWxsIGFsd2F5cyBiZSAgICovCisgIC8qICAgIGtlcHQgaW4gdGhlIGNhY2hlIHVudGlsIHlvdSBjYWxsIEBGVENfTm9kZV9VbnJlZiB0byBgcmVsZWFzZScgaXQuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSWYgYGFub2RlJyBpcyBOVUxMLCB0aGUgY2FjaGUgbm9kZSBpcyBsZWZ0IHVuY2hhbmdlZCwgd2hpY2ggbWVhbnMgICovCisgIC8qICAgIHRoYXQgdGhlIGJpdG1hcCBjb3VsZCBiZSBmbHVzaGVkIG91dCBvZiB0aGUgY2FjaGUgb24gdGhlIG5leHQgICAgICAqLworICAvKiAgICBjYWxsIHRvIG9uZSBvZiB0aGUgY2FjaGluZyBzdWItc3lzdGVtIEFQSXMuICBEb24ndCBhc3N1bWUgdGhhdCBpdCAgKi8KKyAgLyogICAgaXMgcGVyc2lzdGVudCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRDX1NCaXRDYWNoZV9Mb29rdXBTY2FsZXIoIEZUQ19TQml0Q2FjaGUgIGNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX1NjYWxlciAgICAgc2NhbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgbG9hZF9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgIGdpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19TQml0ICAgICAgKnNiaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfTm9kZSAgICAgICphbm9kZSApOworCisgIC8qICovCisKKworRlRfRU5EX0hFQURFUgorCisjZW5kaWYgLyogX19GVENBQ0hFX0hfXyAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGNmZmRydi5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGNmZmRydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOGU0MTYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Y2ZmZHJ2LmgKQEAgLTAsMCArMSwyNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0Y2ZmZHJ2LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGcmVlVHlwZSBBUEkgZm9yIGNvbnRyb2xsaW5nIHRoZSBDRkYgZHJpdmVyIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAxMy0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0ZUQ0ZGRFJWX0hfXworI2RlZmluZSBfX0ZUQ0ZGRFJWX0hfXworCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKworI2lmZGVmIEZSRUVUWVBFX0gKKyNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCisjZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKKyNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgorI2VuZGlmCisKKworRlRfQkVHSU5fSEVBREVSCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHNlY3Rpb246CisgICAqICAgY2ZmX2RyaXZlcgorICAgKgorICAgKiBAdGl0bGU6CisgICAqICAgVGhlIENGRiBkcml2ZXIKKyAgICoKKyAgICogQGFic3RyYWN0OgorICAgKiAgIENvbnRyb2xsaW5nIHRoZSBDRkYgZHJpdmVyIG1vZHVsZS4KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFdoaWxlIEZyZWVUeXBlJ3MgQ0ZGIGRyaXZlciBkb2Vzbid0IGV4cG9zZSBBUEkgZnVuY3Rpb25zIGJ5IGl0c2VsZiwKKyAgICogICBpdCBpcyBwb3NzaWJsZSB0byBjb250cm9sIGl0cyBiZWhhdmlvdXIgd2l0aCBARlRfUHJvcGVydHlfU2V0IGFuZAorICAgKiAgIEBGVF9Qcm9wZXJ0eV9HZXQuICBUaGUgbGlzdCBiZWxvdyBnaXZlcyB0aGUgYXZhaWxhYmxlIHByb3BlcnRpZXMKKyAgICogICB0b2dldGhlciB3aXRoIHRoZSBuZWNlc3NhcnkgbWFjcm9zIGFuZCBzdHJ1Y3R1cmVzLgorICAgKgorICAgKiAgIFRoZSBDRkYgZHJpdmVyJ3MgbW9kdWxlIG5hbWUgaXMgYGNmZicuCisgICAqCisgICAqICAgKkhpbnRpbmcqICphbmQqICphbnRpYWxpYXNpbmcqICpwcmluY2lwbGVzKiAqb2YqICp0aGUqICpuZXcqICplbmdpbmUqCisgICAqCisgICAqICAgVGhlIHJhc3Rlcml6ZXIgaXMgcG9zaXRpb25pbmcgaG9yaXpvbnRhbCBmZWF0dXJlcyAoZS5nLiwgYXNjZW5kZXIKKyAgICogICBoZWlnaHQgJiB4LWhlaWdodCwgb3IgY3Jvc3NiYXJzKSBvbiB0aGUgcGl4ZWwgZ3JpZCBhbmQgbWluaW1pemluZyB0aGUKKyAgICogICBhbW91bnQgb2YgYW50aWFsaWFzaW5nIGFwcGxpZWQgdG8gdGhlbSwgd2hpbGUgcGxhY2luZyB2ZXJ0aWNhbAorICAgKiAgIGZlYXR1cmVzICh2ZXJ0aWNhbCBzdGVtcykgb24gdGhlIHBpeGVsIGdyaWQgd2l0aG91dCBoaW50aW5nLCB0aHVzCisgICAqICAgcmVwcmVzZW50aW5nIHRoZSBzdGVtIHBvc2l0aW9uIGFuZCB3ZWlnaHQgYWNjdXJhdGVseS4gIFNvbWV0aW1lcyB0aGUKKyAgICogICB2ZXJ0aWNhbCBzdGVtcyBtYXkgYmUgb25seSBwYXJ0aWFsbHkgYmxhY2suICBJbiB0aGlzIGNvbnRleHQsCisgICAqICAgYGFudGlhbGlhc2luZycgbWVhbnMgdGhhdCBzdGVtcyBhcmUgbm90IHBvc2l0aW9uZWQgZXhhY3RseSBvbiBwaXhlbAorICAgKiAgIGJvcmRlcnMsIGNhdXNpbmcgYSBmdXp6eSBhcHBlYXJhbmNlLgorICAgKgorICAgKiAgIFRoZXJlIGFyZSB0d28gcHJpbmNpcGxlcyBiZWhpbmQgdGhpcyBhcHByb2FjaC4KKyAgICoKKyAgICogICAxKSBObyBoaW50aW5nIGluIHRoZSBob3Jpem9udGFsIGRpcmVjdGlvbjogVW5saWtlIGBzdXBlcmhpbnRlZCcKKyAgICogICBUcnVlVHlwZSwgd2hpY2ggY2hhbmdlcyBnbHlwaCB3aWR0aHMgdG8gYWNjb21tb2RhdGUgcmVndWxhcgorICAgKiAgIGludGVyLWdseXBoIHNwYWNpbmcsIEFkb2JlJ3MgYXBwcm9hY2ggaXMgYGZhaXRoZnVsIHRvIHRoZSBkZXNpZ24nIGluCisgICAqICAgcmVwcmVzZW50aW5nIGJvdGggdGhlIGdseXBoIHdpZHRoIGFuZCB0aGUgaW50ZXItZ2x5cGggc3BhY2luZworICAgKiAgIGRlc2lnbmVkIGZvciB0aGUgZm9udC4gIFRoaXMgbWFrZXMgdGhlIHNjcmVlbiBkaXNwbGF5IGFzIGNsb3NlIGFzIGl0CisgICAqICAgY2FuIGJlIHRvIHRoZSByZXN1bHQgb25lIHdvdWxkIGdldCB3aXRoIGluZmluaXRlIHJlc29sdXRpb24sIHdoaWxlCisgICAqICAgcHJlc2VydmluZyB3aGF0IGlzIGNvbnNpZGVyZWQgdGhlIGtleSBjaGFyYWN0ZXJpc3RpY3Mgb2YgZWFjaCBnbHlwaC4KKyAgICogICBOb3RlIHRoYXQgdGhlIGRpc3RhbmNlcyBiZXR3ZWVuIHVuaGludGVkIGFuZCBncmlkLWZpdHRlZCBwb3NpdGlvbnMgYXQKKyAgICogICBzbWFsbCBzaXplcyBhcmUgY29tcGFyYWJsZSB0byBrZXJuaW5nIHZhbHVlcyBhbmQgdGh1cyB3b3VsZCBiZQorICAgKiAgIG5vdGljZWFibGUgKGFuZCBkaXN0cmFjdGluZykgd2hpbGUgcmVhZGluZyBpZiBoaW50aW5nIHdlcmUgYXBwbGllZC4KKyAgICoKKyAgICogICBPbmUgb2YgdGhlIHJlYXNvbnMgdG8gbm90IGhpbnQgaG9yaXpvbnRhbGx5IGlzIGFudGlhbGlhc2luZyBmb3IgTENECisgICAqICAgc2NyZWVuczogVGhlIHBpeGVsIGdlb21ldHJ5IG9mIG1vZGVybiBkaXNwbGF5cyBzdXBwbGllcyB0aHJlZQorICAgKiAgIHZlcnRpY2FsIHN1Yi1waXhlbHMgYXMgdGhlIGV5ZSBtb3ZlcyBob3Jpem9udGFsbHkgYWNyb3NzIGVhY2ggdmlzaWJsZQorICAgKiAgIHBpeGVsLiAgT24gZGV2aWNlcyB3aGVyZSB3ZSBjYW4gYmUgY2VydGFpbiB0aGlzIGNoYXJhY3RlcmlzdGljIGlzCisgICAqICAgcHJlc2VudCBhIHJhc3Rlcml6ZXIgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoZSBzdWItcGl4ZWxzIHRvIGFkZAorICAgKiAgIGluY3JlbWVudHMgb2Ygd2VpZ2h0LiAgSW4gV2VzdGVybiB3cml0aW5nIHN5c3RlbXMgdGhpcyB0dXJucyBvdXQgdG8KKyAgICogICBiZSB0aGUgbW9yZSBjcml0aWNhbCBkaXJlY3Rpb24gYW55d2F5OyB0aGUgd2VpZ2h0cyBhbmQgc3BhY2luZyBvZgorICAgKiAgIHZlcnRpY2FsIHN0ZW1zIChzZWUgYWJvdmUpIGFyZSBjZW50cmFsIHRvIEFybWVuaWFuLCBDeXJpbGxpYywgR3JlZWssCisgICAqICAgYW5kIExhdGluIHR5cGUgZGVzaWducy4gIEV2ZW4gd2hlbiB0aGUgcmFzdGVyaXplciB1c2VzIGdyZXlzY2FsZQorICAgKiAgIGFudGlhbGlhc2luZyBpbnN0ZWFkIG9mIGNvbG9yIChhIG5lY2Vzc2FyeSBjb21wcm9taXNlIHdoZW4gb25lCisgICAqICAgZG9lc24ndCBrbm93IHRoZSBzY3JlZW4gY2hhcmFjdGVyaXN0aWNzKSwgdGhlIHVuaGludGVkIHZlcnRpY2FsCisgICAqICAgZmVhdHVyZXMgcHJlc2VydmUgdGhlIGRlc2lnbidzIHdlaWdodCBhbmQgc3BhY2luZyBtdWNoIGJldHRlciB0aGFuCisgICAqICAgYWxpYXNlZCB0eXBlIHdvdWxkLgorICAgKgorICAgKiAgIDIpIEFsaWdtZW50IGluIHRoZSB2ZXJ0aWNhbCBkaXJlY3Rpb246IFdlaWdodHMgYW5kIHNwYWNpbmcgYWxvbmcgdGhlCisgICAqICAgeX5heGlzIGFyZSBsZXNzIGNyaXRpY2FsOyB3aGF0IGlzIG11Y2ggbW9yZSBpbXBvcnRhbnQgaXMgdGhlIHZpc3VhbAorICAgKiAgIGFsaWdubWVudCBvZiByZWxhdGVkIGZlYXR1cmVzIChsaWtlIGNhcC1oZWlnaHQgYW5kIHgtaGVpZ2h0KS4gIFRoZQorICAgKiAgIHNlbnNlIG9mIGFsaWdubWVudCBmb3IgdGhlc2UgaXMgZW5oYW5jZWQgYnkgdGhlIHNoYXJwbmVzcyBvZiBncmlkLWZpdAorICAgKiAgIGVkZ2VzLCB3aGlsZSB0aGUgY3J1ZGVyIHZlcnRpY2FsIHJlc29sdXRpb24gKGZ1bGwgcGl4ZWxzIGluc3RlYWQgb2YKKyAgICogICAxLzMgcGl4ZWxzKSBpcyBsZXNzIG9mIGEgcHJvYmxlbS4KKyAgICoKKyAgICogICBPbiB0aGUgdGVjaG5pY2FsIHNpZGUsIGhvcml6b250YWwgYWxpZ25tZW50IHpvbmVzIGZvciBhc2NlbmRlciwKKyAgICogICB4LWhlaWdodCwgYW5kIG90aGVyIGltcG9ydGFudCBoZWlnaHQgdmFsdWVzICh0cmFkaXRpb25hbGx5IGNhbGxlZAorICAgKiAgIGBibHVlIHpvbmVzJykgYXMgZGVmaW5lZCBpbiB0aGUgZm9udCBhcmUgcG9zaXRpb25lZCBpbmRlcGVuZGVudGx5LAorICAgKiAgIGVhY2ggYmVpbmcgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBwaXhlbCBlZGdlLCB0YWtpbmcgY2FyZSBvZgorICAgKiAgIG92ZXJzaG9vdCBzdXBwcmVzc2lvbiBhdCBzbWFsbCBzaXplcywgc3RlbSBkYXJrZW5pbmcsIGFuZCBzY2FsaW5nLgorICAgKgorICAgKiAgIEhzdGVtcyAodGhpcyBpcywgaGludCB2YWx1ZXMgZGVmaW5lZCBpbiB0aGUgZm9udCB0byBoZWxwIGFsaWduCisgICAqICAgaG9yaXpvbnRhbCBmZWF0dXJlcykgdGhhdCBmYWxsIHdpdGhpbiBhIGJsdWUgem9uZSBhcmUgc2FpZCB0byBiZQorICAgKiAgIGBjYXB0dXJlZCcgYW5kIGFyZSBhbGlnbmVkIHRvIHRoYXQgem9uZS4gIFVuY2FwdHVyZWQgc3RlbXMgYXJlIG1vdmVkCisgICAqICAgaW4gb25lIG9mIGZvdXIgd2F5cywgdG9wIGVkZ2UgdXAgb3IgZG93biwgYm90dG9tIGVkZ2UgdXAgb3IgZG93bi4KKyAgICogICBVbmxlc3MgdGhlcmUgYXJlIGNvbmZsaWN0aW5nIGhzdGVtcywgdGhlIHNtYWxsZXN0IG1vdmVtZW50IGlzIHRha2VuCisgICAqICAgdG8gbWluaW1pemUgZGlzdG9ydGlvbi4KKyAgICoKKyAgICogQG9yZGVyOgorICAgKiAgIGhpbnRpbmctZW5naW5lCisgICAqICAgbm8tc3RlbS1kYXJrZW5pbmcKKyAgICogICBkYXJrZW5pbmctcGFyYW1ldGVycworICAgKgorICAgKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAcHJvcGVydHk6CisgICAqICAgaGludGluZy1lbmdpbmUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoYW5rcyB0byBBZG9iZSwgd2hpY2ggY29udHJpYnV0ZWQgYSBuZXcgaGludGluZyAoYW5kIHBhcnNpbmcpCisgICAqICAgZW5naW5lLCBhbiBhcHBsaWNhdGlvbiBjYW4gc2VsZWN0IGJldHdlZW4gYGZyZWV0eXBlJyBhbmQgYGFkb2JlJyBpZgorICAgKiAgIGNvbXBpbGVkIHdpdGggQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORS4gIElmIHRoaXMgY29uZmlndXJhdGlvbgorICAgKiAgIG1hY3JvIGlzbid0IGRlZmluZWQsIGBoaW50aW5nLWVuZ2luZScgZG9lcyBub3RoaW5nLgorICAgKgorICAgKiAgIFRoZSBkZWZhdWx0IGVuZ2luZSBpcyBgZnJlZXR5cGUnIGlmIENGRl9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUgaXMKKyAgICogICBkZWZpbmVkLCBhbmQgYGFkb2JlJyBvdGhlcndpc2UuCisgICAqCisgICAqICAgVGhlIGZvbGxvd2luZyBleGFtcGxlIGNvZGUgZGVtb25zdHJhdGVzIGhvdyB0byBzZWxlY3QgQWRvYmUncyBoaW50aW5nCisgICAqICAgZW5naW5lIChvbWl0dGluZyB0aGUgZXJyb3IgaGFuZGxpbmcpLgorICAgKgorICAgKiAgIHsKKyAgICogICAgIEZUX0xpYnJhcnkgIGxpYnJhcnk7CisgICAqICAgICBGVF9VSW50ICAgICBoaW50aW5nX2VuZ2luZSA9IEZUX0NGRl9ISU5USU5HX0FET0JFOworICAgKgorICAgKgorICAgKiAgICAgRlRfSW5pdF9GcmVlVHlwZSggJmxpYnJhcnkgKTsKKyAgICoKKyAgICogICAgIEZUX1Byb3BlcnR5X1NldCggbGlicmFyeSwgImNmZiIsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoaW50aW5nLWVuZ2luZSIsICZoaW50aW5nX2VuZ2luZSApOworICAgKiAgIH0KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB3aXRoIEBGVF9Qcm9wZXJ0eV9HZXQgYWxzby4KKyAgICoKKyAgICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGVudW06CisgICAqICAgRlRfQ0ZGX0hJTlRJTkdfWFhYCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIGxpc3Qgb2YgY29uc3RhbnRzIHVzZWQgZm9yIHRoZSBAaGludGluZy1lbmdpbmUgcHJvcGVydHkgdG8gc2VsZWN0CisgICAqICAgdGhlIGhpbnRpbmcgZW5naW5lIGZvciBDRkYgZm9udHMuCisgICAqCisgICAqIEB2YWx1ZXM6CisgICAqICAgRlRfQ0ZGX0hJTlRJTkdfRlJFRVRZUEUgOjoKKyAgICogICAgIFVzZSB0aGUgb2xkIEZyZWVUeXBlIGhpbnRpbmcgZW5naW5lLgorICAgKgorICAgKiAgIEZUX0NGRl9ISU5USU5HX0FET0JFIDo6CisgICAqICAgICBVc2UgdGhlIGhpbnRpbmcgZW5naW5lIGNvbnRyaWJ1dGVkIGJ5IEFkb2JlLgorICAgKgorICAgKi8KKyNkZWZpbmUgRlRfQ0ZGX0hJTlRJTkdfRlJFRVRZUEUgIDAKKyNkZWZpbmUgRlRfQ0ZGX0hJTlRJTkdfQURPQkUgICAgIDEKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAcHJvcGVydHk6CisgICAqICAgbm8tc3RlbS1kYXJrZW5pbmcKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEJ5IGRlZmF1bHQsIHRoZSBBZG9iZSBDRkYgZW5naW5lIGRhcmtlbnMgc3RlbXMgYXQgc21hbGxlciBzaXplcywKKyAgICogICByZWdhcmRsZXNzIG9mIGhpbnRpbmcsIHRvIGVuaGFuY2UgY29udHJhc3QuICBUaGlzIGZlYXR1cmUgcmVxdWlyZXMKKyAgICogICBhIHJlbmRlcmluZyBzeXN0ZW0gd2l0aCBwcm9wZXIgZ2FtbWEgY29ycmVjdGlvbi4gIFNldHRpbmcgdGhpcworICAgKiAgIHByb3BlcnR5LCBzdGVtIGRhcmtlbmluZyBnZXRzIHN3aXRjaGVkIG9mZi4KKyAgICoKKyAgICogICBOb3RlIHRoYXQgc3RlbSBkYXJrZW5pbmcgaXMgbmV2ZXIgYXBwbGllZCBpZiBARlRfTE9BRF9OT19TQ0FMRSBpcyBzZXQuCisgICAqCisgICAqICAgeworICAgKiAgICAgRlRfTGlicmFyeSAgbGlicmFyeTsKKyAgICogICAgIEZUX0Jvb2wgICAgIG5vX3N0ZW1fZGFya2VuaW5nID0gVFJVRTsKKyAgICoKKyAgICoKKyAgICogICAgIEZUX0luaXRfRnJlZVR5cGUoICZsaWJyYXJ5ICk7CisgICAqCisgICAqICAgICBGVF9Qcm9wZXJ0eV9TZXQoIGxpYnJhcnksICJjZmYiLAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8tc3RlbS1kYXJrZW5pbmciLCAmbm9fc3RlbV9kYXJrZW5pbmcgKTsKKyAgICogICB9CisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgd2l0aCBARlRfUHJvcGVydHlfR2V0IGFsc28uCisgICAqCisgICAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBwcm9wZXJ0eToKKyAgICogICBkYXJrZW5pbmctcGFyYW1ldGVycworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQnkgZGVmYXVsdCwgdGhlIEFkb2JlIENGRiBlbmdpbmUgZGFya2VucyBzdGVtcyBhcyBmb2xsb3dzIChpZiB0aGUKKyAgICogICBgbm8tc3RlbS1kYXJrZW5pbmcnIHByb3BlcnR5IGlzbid0IHNldCk6CisgICAqCisgICAqICAgeworICAgKiAgICAgc3RlbSB3aWR0aCA8PSAwLjVweDogICBkYXJrZW5pbmcgYW1vdW50ID0gMC40cHgKKyAgICogICAgIHN0ZW0gd2lkdGggID0gMXB4OiAgICAgZGFya2VuaW5nIGFtb3VudCA9IDAuMjc1cHgKKyAgICogICAgIHN0ZW0gd2lkdGggID0gMS42NjdweDogZGFya2VuaW5nIGFtb3VudCA9IDAuMjc1cHgKKyAgICogICAgIHN0ZW0gd2lkdGggPj0gMi4zMzNweDogZGFya2VuaW5nIGFtb3VudCA9IDBweAorICAgKiAgIH0KKyAgICoKKyAgICogICBhbmQgcGllY2V3aXNlIGxpbmVhciBpbi1iZXR3ZWVuLiAgQXQgY29uZmlndXJhdGlvbiB0aW1lLCB0aGVzZSBmb3VyCisgICAqICAgY29udHJvbCBwb2ludHMgY2FuIGJlIHNldCB3aXRoIHRoZSBtYWNybworICAgKiAgIGBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSUycuICBBdCBydW50aW1lLCB0aGUgY29udHJvbAorICAgKiAgIHBvaW50cyBjYW4gYmUgY2hhbmdlZCB1c2luZyB0aGUgYGRhcmtlbmluZy1wYXJhbWV0ZXJzJyBwcm9wZXJ0eSwgYXMKKyAgICogICB0aGUgZm9sbG93aW5nIGV4YW1wbGUgZGVtb25zdHJhdGVzLgorICAgKgorICAgKiAgIHsKKyAgICogICAgIEZUX0xpYnJhcnkgIGxpYnJhcnk7CisgICAqICAgICBGVF9JbnQgICAgICBkYXJrZW5fcGFyYW1zWzhdID0geyAgNTAwLCAzMDAsICAgLy8geDEsIHkxCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwLCAyMDAsICAgLy8geDIsIHkyCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTAwLCAxMDAsICAgLy8geDMsIHkzCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAwLCAgIDAgfTsgLy8geDQsIHk0CisgICAqCisgICAqCisgICAqICAgICBGVF9Jbml0X0ZyZWVUeXBlKCAmbGlicmFyeSApOworICAgKgorICAgKiAgICAgRlRfUHJvcGVydHlfU2V0KCBsaWJyYXJ5LCAiY2ZmIiwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhcmtlbmluZy1wYXJhbWV0ZXJzIiwgZGFya2VuX3BhcmFtcyApOworICAgKiAgIH0KKyAgICoKKyAgICogICBUaGUgeH52YWx1ZXMgZ2l2ZSB0aGUgc3RlbSB3aWR0aCwgYW5kIHRoZSB5fnZhbHVlcyB0aGUgZGFya2VuaW5nCisgICAqICAgYW1vdW50LiAgVGhlIHVuaXQgaXMgMTAwMHRoIG9mIHBpeGVscy4gIEFsbCBjb29yZGluYXRlIHZhbHVlcyBtdXN0IGJlCisgICAqICAgcG9zaXRpdmU7IHRoZSB4fnZhbHVlcyBtdXN0IGJlIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZzsgdGhlCisgICAqICAgeX52YWx1ZXMgbXVzdCBiZSBtb25vdG9uaWNhbGx5IGRlY3JlYXNpbmcgYW5kIHNtYWxsZXIgdGhhbiBvcgorICAgKiAgIGVxdWFsIHRvIDUwMCAoY29ycmVzcG9uZGluZyB0byBoYWxmIGEgcGl4ZWwpOyB0aGUgc2xvcGUgb2YgZWFjaAorICAgKiAgIGxpbmVhciBwaWVjZSBtdXN0IGJlIHNoYWxsb3dlciB0aGFuIC0xIChlLmcuLCAtLjQpLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHdpdGggQEZUX1Byb3BlcnR5X0dldCBhbHNvLgorICAgKgorICAgKi8KKworICAvKiAqLworCisKK0ZUX0VORF9IRUFERVIKKworCisjZW5kaWYgLyogX19GVENGRkRSVl9IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRjaWQuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRjaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTc0MWM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGNpZC5oCkBAIC0wLDAgKzEsMTY4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBmdGNpZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnJlZVR5cGUgQVBJIGZvciBhY2Nlc3NpbmcgQ0lEIGZvbnQgaW5mb3JtYXRpb24gKHNwZWNpZmljYXRpb24pLiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDctMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERlcmVnIENsZWdnIGFuZCBNaWNoYWVsIFRvZnRkYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX19GVENJRF9IX18KKyNkZWZpbmUgX19GVENJRF9IX18KKworI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CisjaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisKKyNpZmRlZiBGUkVFVFlQRV9ICisjZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgorI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCisjZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKKyNlbmRpZgorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2lkX2ZvbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ0lEIEZvbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ0lELWtleWVkIGZvbnQgc3BlY2lmaWMgQVBJLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBDSUQta2V5ZWQgZm9udCBzcGVjaWZpYyAgICovCisgIC8qICAgIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgIEZUX0dldF9DSURfUmVnaXN0cnlfT3JkZXJpbmdfU3VwcGxlbWVudAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgIFJldHJpZXZlIHRoZSBSZWdpc3RyeS9PcmRlcmluZy9TdXBwbGVtZW50IHRyaXBsZSAoYWxzbyBrbm93biBhcyB0aGUKKyAgICogICAgIlIvTy9TIikgZnJvbSBhIENJRC1rZXllZCBmb250LgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgIGZhY2UgOjoKKyAgICogICAgICAgQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCisgICAqCisgICAqIEBvdXRwdXQ6CisgICAqICAgIHJlZ2lzdHJ5IDo6CisgICAqICAgICAgIFRoZSByZWdpc3RyeSwgYXMgYSBDfnN0cmluZywgb3duZWQgYnkgdGhlIGZhY2UuCisgICAqCisgICAqICAgIG9yZGVyaW5nIDo6CisgICAqICAgICAgIFRoZSBvcmRlcmluZywgYXMgYSBDfnN0cmluZywgb3duZWQgYnkgdGhlIGZhY2UuCisgICAqCisgICAqICAgIHN1cHBsZW1lbnQgOjoKKyAgICogICAgICAgVGhlIHN1cHBsZW1lbnQuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgICBUaGlzIGZ1bmN0aW9uIG9ubHkgd29ya3Mgd2l0aCBDSUQgZmFjZXMsIHJldHVybmluZyBhbiBlcnJvcgorICAgKiAgICBvdGhlcndpc2UuCisgICAqCisgICAqIEBzaW5jZToKKyAgICogICAgMi4zLjYKKyAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9HZXRfQ0lEX1JlZ2lzdHJ5X09yZGVyaW5nX1N1cHBsZW1lbnQoIEZUX0ZhY2UgICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgKnJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAqb3JkZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICpzdXBwbGVtZW50KTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICAgRlRfR2V0X0NJRF9Jc19JbnRlcm5hbGx5X0NJRF9LZXllZAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgIFJldHJpZXZlIHRoZSB0eXBlIG9mIHRoZSBpbnB1dCBmYWNlLCBDSUQga2V5ZWQgb3Igbm90LiAgSW4KKyAgICogICAgY29uc3RyYXN0IHRvIHRoZSBARlRfSVNfQ0lEX0tFWUVEIG1hY3JvIHRoaXMgZnVuY3Rpb24gcmV0dXJucworICAgKiAgICBzdWNjZXNzZnVsbHkgYWxzbyBmb3IgQ0lELWtleWVkIGZvbnRzIGluIGFuIFNORlQgd3JhcHBlci4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgICBmYWNlIDo6CisgICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgICBpc19jaWQgOjoKKyAgICogICAgICAgVGhlIHR5cGUgb2YgdGhlIGZhY2UgYXMgYW4gQEZUX0Jvb2wuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgICBUaGlzIGZ1bmN0aW9uIG9ubHkgd29ya3Mgd2l0aCBDSUQgZmFjZXMgYW5kIE9wZW5UeXBlIGZvbnRzLAorICAgKiAgICByZXR1cm5pbmcgYW4gZXJyb3Igb3RoZXJ3aXNlLgorICAgKgorICAgKiBAc2luY2U6CisgICAqICAgIDIuMy45CisgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfR2V0X0NJRF9Jc19JbnRlcm5hbGx5X0NJRF9LZXllZCggRlRfRmFjZSAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICppc19jaWQgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICAgRlRfR2V0X0NJRF9Gcm9tX0dseXBoX0luZGV4CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICAgUmV0cmlldmUgdGhlIENJRCBvZiB0aGUgaW5wdXQgZ2x5cGggaW5kZXguCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICAgZmFjZSA6OgorICAgKiAgICAgICBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KKyAgICoKKyAgICogICAgZ2x5cGhfaW5kZXggOjoKKyAgICogICAgICAgVGhlIGlucHV0IGdseXBoIGluZGV4LgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgICBjaWQgOjoKKyAgICogICAgICAgVGhlIENJRCBhcyBhbiBARlRfVUludC4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyB3aXRoIENJRCBmYWNlcyBhbmQgT3BlblR5cGUgZm9udHMsCisgICAqICAgIHJldHVybmluZyBhbiBlcnJvciBvdGhlcndpc2UuCisgICAqCisgICAqIEBzaW5jZToKKyAgICogICAgMi4zLjkKKyAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9HZXRfQ0lEX0Zyb21fR2x5cGhfSW5kZXgoIEZUX0ZhY2UgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAqY2lkICk7CisKKyAgLyogKi8KKworCitGVF9FTkRfSEVBREVSCisKKyNlbmRpZiAvKiBfX0ZUQ0lEX0hfXyAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGVycmRlZi5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGVycmRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NjVkYTcKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0ZXJyZGVmLmgKQEAgLTAsMCArMSwyNzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0ZXJyZGVmLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwMi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIGVycm9yX2NvZGVfdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEVycm9yIENvZGUgVmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEFsbCBwb3NzaWJsZSBlcnJvciBjb2RlcyByZXR1cm5lZCBieSBGcmVlVHlwZSBmdW5jdGlvbnMuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFRoZSBsaXN0IGJlbG93IGlzIHRha2VuIHZlcmJhdGltIGZyb20gdGhlIGZpbGUgYGZ0ZXJyZGVmLmgnICAgICAgICAgKi8KKyAgLyogICAobG9hZGVkIGF1dG9tYXRpY2FsbHkgYnkgaW5jbHVkaW5nIGBGVF9GUkVFVFlQRV9IJykuICBUaGUgZmlyc3QgICAgICovCisgIC8qICAgYXJndW1lbnQgb2YgdGhlIGBGVF9FUlJPUl9ERUZfJyBtYWNybyBpcyB0aGUgZXJyb3IgbGFiZWw7IGJ5ICAgICAgICAqLworICAvKiAgIGRlZmF1bHQsIHRoZSBwcmVmaXggYEZUX0Vycl8nIGdldHMgYWRkZWQgc28gdGhhdCB5b3UgZ2V0IGVycm9yICAgICAgKi8KKyAgLyogICBuYW1lcyBsaWtlIGBGVF9FcnJfQ2Fubm90X09wZW5fUmVzb3VyY2UnLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyAgICovCisgIC8qICAgdGhlIGVycm9yIGNvZGUsIGFuZCB0aGUgbGFzdCBhcmd1bWVudCBhbiBlcnJvciBzdHJpbmcsIHdoaWNoIGlzIG5vdCAqLworICAvKiAgIHVzZWQgYnkgRnJlZVR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgV2l0aGluIHlvdXIgYXBwbGljYXRpb24geW91IHNob3VsZCAqb25seSogdXNlIGVycm9yIG5hbWVzIGFuZCAgICAgICAqLworICAvKiAgICpuZXZlciogaXRzIG51bWVyaWMgdmFsdWVzISAgVGhlIGxhdHRlciBtaWdodCAoYW5kIGFjdHVhbGx5IGRvKSAgICAgKi8KKyAgLyogICBjaGFuZ2UgaW4gZm9ydGhjb21pbmcgRnJlZVR5cGUgdmVyc2lvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIE1hY3JvIGBGVF9OT0VSUk9SREVGXycgZGVmaW5lcyBgRlRfRXJyX09rJywgd2hpY2ggaXMgYWx3YXlzIHplcm8uICAgKi8KKyAgLyogICBTZWUgdGhlIGBFcnJvciBFbnVtZXJhdGlvbnMnIHN1YnNlY3Rpb24gaG93IHRvIGF1dG9tYXRpY2FsbHkgICAgICAgICovCisgIC8qICAgZ2VuZXJhdGUgYSBsaXN0IG9mIGVycm9yIHN0cmluZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9FcnJfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qIGdlbmVyaWMgZXJyb3JzICovCisKKyAgRlRfTk9FUlJPUkRFRl8oIE9rLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgICAgICAgIm5vIGVycm9yIiApCisKKyAgRlRfRVJST1JERUZfKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSwgICAgICAgICAgICAgICAgICAgICAgICAweDAxLAorICAgICAgICAgICAgICAgICJjYW5ub3Qgb3BlbiByZXNvdXJjZSIgKQorICBGVF9FUlJPUkRFRl8oIFVua25vd25fRmlsZV9Gb3JtYXQsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIsCisgICAgICAgICAgICAgICAgInVua25vd24gZmlsZSBmb3JtYXQiICkKKyAgRlRfRVJST1JERUZfKCBJbnZhbGlkX0ZpbGVfRm9ybWF0LCAgICAgICAgICAgICAgICAgICAgICAgICAweDAzLAorICAgICAgICAgICAgICAgICJicm9rZW4gZmlsZSIgKQorICBGVF9FUlJPUkRFRl8oIEludmFsaWRfVmVyc2lvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQsCisgICAgICAgICAgICAgICAgImludmFsaWQgRnJlZVR5cGUgdmVyc2lvbiIgKQorICBGVF9FUlJPUkRFRl8oIExvd2VyX01vZHVsZV9WZXJzaW9uLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUsCisgICAgICAgICAgICAgICAgIm1vZHVsZSB2ZXJzaW9uIGlzIHRvbyBsb3ciICkKKyAgRlRfRVJST1JERUZfKCBJbnZhbGlkX0FyZ3VtZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA2LAorICAgICAgICAgICAgICAgICJpbnZhbGlkIGFyZ3VtZW50IiApCisgIEZUX0VSUk9SREVGXyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlLCAgICAgICAgICAgICAgICAgICAgICAgMHgwNywKKyAgICAgICAgICAgICAgICAidW5pbXBsZW1lbnRlZCBmZWF0dXJlIiApCisgIEZUX0VSUk9SREVGXyggSW52YWxpZF9UYWJsZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOCwKKyAgICAgICAgICAgICAgICAiYnJva2VuIHRhYmxlIiApCisgIEZUX0VSUk9SREVGXyggSW52YWxpZF9PZmZzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOSwKKyAgICAgICAgICAgICAgICAiYnJva2VuIG9mZnNldCB3aXRoaW4gdGFibGUiICkKKyAgRlRfRVJST1JERUZfKCBBcnJheV9Ub29fTGFyZ2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLAorICAgICAgICAgICAgICAgICJhcnJheSBhbGxvY2F0aW9uIHNpemUgdG9vIGxhcmdlIiApCisgIEZUX0VSUk9SREVGXyggTWlzc2luZ19Nb2R1bGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQiwKKyAgICAgICAgICAgICAgICAibWlzc2luZyBtb2R1bGUiICkKKyAgRlRfRVJST1JERUZfKCBNaXNzaW5nX1Byb3BlcnR5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBDLAorICAgICAgICAgICAgICAgICJtaXNzaW5nIHByb3BlcnR5IiApCisKKyAgLyogZ2x5cGgvY2hhcmFjdGVyIGVycm9ycyAqLworCisgIEZUX0VSUk9SREVGXyggSW52YWxpZF9HbHlwaF9JbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMCwKKyAgICAgICAgICAgICAgICAiaW52YWxpZCBnbHlwaCBpbmRleCIgKQorICBGVF9FUlJPUkRFRl8oIEludmFsaWRfQ2hhcmFjdGVyX0NvZGUsICAgICAgICAgICAgICAgICAgICAgIDB4MTEsCisgICAgICAgICAgICAgICAgImludmFsaWQgY2hhcmFjdGVyIGNvZGUiICkKKyAgRlRfRVJST1JERUZfKCBJbnZhbGlkX0dseXBoX0Zvcm1hdCwgICAgICAgICAgICAgICAgICAgICAgICAweDEyLAorICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBnbHlwaCBpbWFnZSBmb3JtYXQiICkKKyAgRlRfRVJST1JERUZfKCBDYW5ub3RfUmVuZGVyX0dseXBoLCAgICAgICAgICAgICAgICAgICAgICAgICAweDEzLAorICAgICAgICAgICAgICAgICJjYW5ub3QgcmVuZGVyIHRoaXMgZ2x5cGggZm9ybWF0IiApCisgIEZUX0VSUk9SREVGXyggSW52YWxpZF9PdXRsaW5lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNCwKKyAgICAgICAgICAgICAgICAiaW52YWxpZCBvdXRsaW5lIiApCisgIEZUX0VSUk9SREVGXyggSW52YWxpZF9Db21wb3NpdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNSwKKyAgICAgICAgICAgICAgICAiaW52YWxpZCBjb21wb3NpdGUgZ2x5cGgiICkKKyAgRlRfRVJST1JERUZfKCBUb29fTWFueV9IaW50cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE2LAorICAgICAgICAgICAgICAgICJ0b28gbWFueSBoaW50cyIgKQorICBGVF9FUlJPUkRFRl8oIEludmFsaWRfUGl4ZWxfU2l6ZSwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTcsCisgICAgICAgICAgICAgICAgImludmFsaWQgcGl4ZWwgc2l6ZSIgKQorCisgIC8qIGhhbmRsZSBlcnJvcnMgKi8KKworICBGVF9FUlJPUkRFRl8oIEludmFsaWRfSGFuZGxlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAsCisgICAgICAgICAgICAgICAgImludmFsaWQgb2JqZWN0IGhhbmRsZSIgKQorICBGVF9FUlJPUkRFRl8oIEludmFsaWRfTGlicmFyeV9IYW5kbGUsICAgICAgICAgICAgICAgICAgICAgIDB4MjEsCisgICAgICAgICAgICAgICAgImludmFsaWQgbGlicmFyeSBoYW5kbGUiICkKKyAgRlRfRVJST1JERUZfKCBJbnZhbGlkX0RyaXZlcl9IYW5kbGUsICAgICAgICAgICAgICAgICAgICAgICAweDIyLAorICAgICAgICAgICAgICAgICJpbnZhbGlkIG1vZHVsZSBoYW5kbGUiICkKKyAgRlRfRVJST1JERUZfKCBJbnZhbGlkX0ZhY2VfSGFuZGxlLCAgICAgICAgICAgICAgICAgICAgICAgICAweDIzLAorICAgICAgICAgICAgICAgICJpbnZhbGlkIGZhY2UgaGFuZGxlIiApCisgIEZUX0VSUk9SREVGXyggSW52YWxpZF9TaXplX0hhbmRsZSwgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNCwKKyAgICAgICAgICAgICAgICAiaW52YWxpZCBzaXplIGhhbmRsZSIgKQorICBGVF9FUlJPUkRFRl8oIEludmFsaWRfU2xvdF9IYW5kbGUsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjUsCisgICAgICAgICAgICAgICAgImludmFsaWQgZ2x5cGggc2xvdCBoYW5kbGUiICkKKyAgRlRfRVJST1JERUZfKCBJbnZhbGlkX0NoYXJNYXBfSGFuZGxlLCAgICAgICAgICAgICAgICAgICAgICAweDI2LAorICAgICAgICAgICAgICAgICJpbnZhbGlkIGNoYXJtYXAgaGFuZGxlIiApCisgIEZUX0VSUk9SREVGXyggSW52YWxpZF9DYWNoZV9IYW5kbGUsICAgICAgICAgICAgICAgICAgICAgICAgMHgyNywKKyAgICAgICAgICAgICAgICAiaW52YWxpZCBjYWNoZSBtYW5hZ2VyIGhhbmRsZSIgKQorICBGVF9FUlJPUkRFRl8oIEludmFsaWRfU3RyZWFtX0hhbmRsZSwgICAgICAgICAgICAgICAgICAgICAgIDB4MjgsCisgICAgICAgICAgICAgICAgImludmFsaWQgc3RyZWFtIGhhbmRsZSIgKQorCisgIC8qIGRyaXZlciBlcnJvcnMgKi8KKworICBGVF9FUlJPUkRFRl8oIFRvb19NYW55X0RyaXZlcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAsCisgICAgICAgICAgICAgICAgInRvbyBtYW55IG1vZHVsZXMiICkKKyAgRlRfRVJST1JERUZfKCBUb29fTWFueV9FeHRlbnNpb25zLCAgICAgICAgICAgICAgICAgICAgICAgICAweDMxLAorICAgICAgICAgICAgICAgICJ0b28gbWFueSBleHRlbnNpb25zIiApCisKKyAgLyogbWVtb3J5IGVycm9ycyAqLworCisgIEZUX0VSUk9SREVGXyggT3V0X09mX01lbW9yeSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MCwKKyAgICAgICAgICAgICAgICAib3V0IG9mIG1lbW9yeSIgKQorICBGVF9FUlJPUkRFRl8oIFVubGlzdGVkX09iamVjdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDEsCisgICAgICAgICAgICAgICAgInVubGlzdGVkIG9iamVjdCIgKQorCisgIC8qIHN0cmVhbSBlcnJvcnMgKi8KKworICBGVF9FUlJPUkRFRl8oIENhbm5vdF9PcGVuX1N0cmVhbSwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTEsCisgICAgICAgICAgICAgICAgImNhbm5vdCBvcGVuIHN0cmVhbSIgKQorICBGVF9FUlJPUkRFRl8oIEludmFsaWRfU3RyZWFtX1NlZWssICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTIsCisgICAgICAgICAgICAgICAgImludmFsaWQgc3RyZWFtIHNlZWsiICkKKyAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1N0cmVhbV9Ta2lwLCAgICAgICAgICAgICAgICAgICAgICAgICAweDUzLAorICAgICAgICAgICAgICAgICJpbnZhbGlkIHN0cmVhbSBza2lwIiApCisgIEZUX0VSUk9SREVGXyggSW52YWxpZF9TdHJlYW1fUmVhZCwgICAgICAgICAgICAgICAgICAgICAgICAgMHg1NCwKKyAgICAgICAgICAgICAgICAiaW52YWxpZCBzdHJlYW0gcmVhZCIgKQorICBGVF9FUlJPUkRFRl8oIEludmFsaWRfU3RyZWFtX09wZXJhdGlvbiwgICAgICAgICAgICAgICAgICAgIDB4NTUsCisgICAgICAgICAgICAgICAgImludmFsaWQgc3RyZWFtIG9wZXJhdGlvbiIgKQorICBGVF9FUlJPUkRFRl8oIEludmFsaWRfRnJhbWVfT3BlcmF0aW9uLCAgICAgICAgICAgICAgICAgICAgIDB4NTYsCisgICAgICAgICAgICAgICAgImludmFsaWQgZnJhbWUgb3BlcmF0aW9uIiApCisgIEZUX0VSUk9SREVGXyggTmVzdGVkX0ZyYW1lX0FjY2VzcywgICAgICAgICAgICAgICAgICAgICAgICAgMHg1NywKKyAgICAgICAgICAgICAgICAibmVzdGVkIGZyYW1lIGFjY2VzcyIgKQorICBGVF9FUlJPUkRFRl8oIEludmFsaWRfRnJhbWVfUmVhZCwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTgsCisgICAgICAgICAgICAgICAgImludmFsaWQgZnJhbWUgcmVhZCIgKQorCisgIC8qIHJhc3RlciBlcnJvcnMgKi8KKworICBGVF9FUlJPUkRFRl8oIFJhc3Rlcl9VbmluaXRpYWxpemVkLCAgICAgICAgICAgICAgICAgICAgICAgIDB4NjAsCisgICAgICAgICAgICAgICAgInJhc3RlciB1bmluaXRpYWxpemVkIiApCisgIEZUX0VSUk9SREVGXyggUmFzdGVyX0NvcnJ1cHRlZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MSwKKyAgICAgICAgICAgICAgICAicmFzdGVyIGNvcnJ1cHRlZCIgKQorICBGVF9FUlJPUkRFRl8oIFJhc3Rlcl9PdmVyZmxvdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjIsCisgICAgICAgICAgICAgICAgInJhc3RlciBvdmVyZmxvdyIgKQorICBGVF9FUlJPUkRFRl8oIFJhc3Rlcl9OZWdhdGl2ZV9IZWlnaHQsICAgICAgICAgICAgICAgICAgICAgIDB4NjMsCisgICAgICAgICAgICAgICAgIm5lZ2F0aXZlIGhlaWdodCB3aGlsZSByYXN0ZXJpbmciICkKKworICAvKiBjYWNoZSBlcnJvcnMgKi8KKworICBGVF9FUlJPUkRFRl8oIFRvb19NYW55X0NhY2hlcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzAsCisgICAgICAgICAgICAgICAgInRvbyBtYW55IHJlZ2lzdGVyZWQgY2FjaGVzIiApCisKKyAgLyogVHJ1ZVR5cGUgYW5kIFNGTlQgZXJyb3JzICovCisKKyAgRlRfRVJST1JERUZfKCBJbnZhbGlkX09wY29kZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwLAorICAgICAgICAgICAgICAgICJpbnZhbGlkIG9wY29kZSIgKQorICBGVF9FUlJPUkRFRl8oIFRvb19GZXdfQXJndW1lbnRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODEsCisgICAgICAgICAgICAgICAgInRvbyBmZXcgYXJndW1lbnRzIiApCisgIEZUX0VSUk9SREVGXyggU3RhY2tfT3ZlcmZsb3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MiwKKyAgICAgICAgICAgICAgICAic3RhY2sgb3ZlcmZsb3ciICkKKyAgRlRfRVJST1JERUZfKCBDb2RlX092ZXJmbG93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzLAorICAgICAgICAgICAgICAgICJjb2RlIG92ZXJmbG93IiApCisgIEZUX0VSUk9SREVGXyggQmFkX0FyZ3VtZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NCwKKyAgICAgICAgICAgICAgICAiYmFkIGFyZ3VtZW50IiApCisgIEZUX0VSUk9SREVGXyggRGl2aWRlX0J5X1plcm8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NSwKKyAgICAgICAgICAgICAgICAiZGl2aXNpb24gYnkgemVybyIgKQorICBGVF9FUlJPUkRFRl8oIEludmFsaWRfUmVmZXJlbmNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODYsCisgICAgICAgICAgICAgICAgImludmFsaWQgcmVmZXJlbmNlIiApCisgIEZUX0VSUk9SREVGXyggRGVidWdfT3BDb2RlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NywKKyAgICAgICAgICAgICAgICAiZm91bmQgZGVidWcgb3Bjb2RlIiApCisgIEZUX0VSUk9SREVGXyggRU5ERl9Jbl9FeGVjX1N0cmVhbSwgICAgICAgICAgICAgICAgICAgICAgICAgMHg4OCwKKyAgICAgICAgICAgICAgICAiZm91bmQgRU5ERiBvcGNvZGUgaW4gZXhlY3V0aW9uIHN0cmVhbSIgKQorICBGVF9FUlJPUkRFRl8oIE5lc3RlZF9ERUZTLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODksCisgICAgICAgICAgICAgICAgIm5lc3RlZCBERUZTIiApCisgIEZUX0VSUk9SREVGXyggSW52YWxpZF9Db2RlUmFuZ2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QSwKKyAgICAgICAgICAgICAgICAiaW52YWxpZCBjb2RlIHJhbmdlIiApCisgIEZUX0VSUk9SREVGXyggRXhlY3V0aW9uX1Rvb19Mb25nLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QiwKKyAgICAgICAgICAgICAgICAiZXhlY3V0aW9uIGNvbnRleHQgdG9vIGxvbmciICkKKyAgRlRfRVJST1JERUZfKCBUb29fTWFueV9GdW5jdGlvbl9EZWZzLCAgICAgICAgICAgICAgICAgICAgICAweDhDLAorICAgICAgICAgICAgICAgICJ0b28gbWFueSBmdW5jdGlvbiBkZWZpbml0aW9ucyIgKQorICBGVF9FUlJPUkRFRl8oIFRvb19NYW55X0luc3RydWN0aW9uX0RlZnMsICAgICAgICAgICAgICAgICAgIDB4OEQsCisgICAgICAgICAgICAgICAgInRvbyBtYW55IGluc3RydWN0aW9uIGRlZmluaXRpb25zIiApCisgIEZUX0VSUk9SREVGXyggVGFibGVfTWlzc2luZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RSwKKyAgICAgICAgICAgICAgICAiU0ZOVCBmb250IHRhYmxlIG1pc3NpbmciICkKKyAgRlRfRVJST1JERUZfKCBIb3Jpel9IZWFkZXJfTWlzc2luZywgICAgICAgICAgICAgICAgICAgICAgICAweDhGLAorICAgICAgICAgICAgICAgICJob3Jpem9udGFsIGhlYWRlciAoaGhlYSkgdGFibGUgbWlzc2luZyIgKQorICBGVF9FUlJPUkRFRl8oIExvY2F0aW9uc19NaXNzaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTAsCisgICAgICAgICAgICAgICAgImxvY2F0aW9ucyAobG9jYSkgdGFibGUgbWlzc2luZyIgKQorICBGVF9FUlJPUkRFRl8oIE5hbWVfVGFibGVfTWlzc2luZywgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTEsCisgICAgICAgICAgICAgICAgIm5hbWUgdGFibGUgbWlzc2luZyIgKQorICBGVF9FUlJPUkRFRl8oIENNYXBfVGFibGVfTWlzc2luZywgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTIsCisgICAgICAgICAgICAgICAgImNoYXJhY3RlciBtYXAgKGNtYXApIHRhYmxlIG1pc3NpbmciICkKKyAgRlRfRVJST1JERUZfKCBIbXR4X1RhYmxlX01pc3NpbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAweDkzLAorICAgICAgICAgICAgICAgICJob3Jpem9udGFsIG1ldHJpY3MgKGhtdHgpIHRhYmxlIG1pc3NpbmciICkKKyAgRlRfRVJST1JERUZfKCBQb3N0X1RhYmxlX01pc3NpbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAweDk0LAorICAgICAgICAgICAgICAgICJQb3N0U2NyaXB0IChwb3N0KSB0YWJsZSBtaXNzaW5nIiApCisgIEZUX0VSUk9SREVGXyggSW52YWxpZF9Ib3Jpel9NZXRyaWNzLCAgICAgICAgICAgICAgICAgICAgICAgMHg5NSwKKyAgICAgICAgICAgICAgICAiaW52YWxpZCBob3Jpem9udGFsIG1ldHJpY3MiICkKKyAgRlRfRVJST1JERUZfKCBJbnZhbGlkX0NoYXJNYXBfRm9ybWF0LCAgICAgICAgICAgICAgICAgICAgICAweDk2LAorICAgICAgICAgICAgICAgICJpbnZhbGlkIGNoYXJhY3RlciBtYXAgKGNtYXApIGZvcm1hdCIgKQorICBGVF9FUlJPUkRFRl8oIEludmFsaWRfUFBlbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTcsCisgICAgICAgICAgICAgICAgImludmFsaWQgcHBlbSB2YWx1ZSIgKQorICBGVF9FUlJPUkRFRl8oIEludmFsaWRfVmVydF9NZXRyaWNzLCAgICAgICAgICAgICAgICAgICAgICAgIDB4OTgsCisgICAgICAgICAgICAgICAgImludmFsaWQgdmVydGljYWwgbWV0cmljcyIgKQorICBGVF9FUlJPUkRFRl8oIENvdWxkX05vdF9GaW5kX0NvbnRleHQsICAgICAgICAgICAgICAgICAgICAgIDB4OTksCisgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBmaW5kIGNvbnRleHQiICkKKyAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1Bvc3RfVGFibGVfRm9ybWF0LCAgICAgICAgICAgICAgICAgICAweDlBLAorICAgICAgICAgICAgICAgICJpbnZhbGlkIFBvc3RTY3JpcHQgKHBvc3QpIHRhYmxlIGZvcm1hdCIgKQorICBGVF9FUlJPUkRFRl8oIEludmFsaWRfUG9zdF9UYWJsZSwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OUIsCisgICAgICAgICAgICAgICAgImludmFsaWQgUG9zdFNjcmlwdCAocG9zdCkgdGFibGUiICkKKworICAvKiBDRkYsIENJRCwgYW5kIFR5cGUgMSBlcnJvcnMgKi8KKworICBGVF9FUlJPUkRFRl8oIFN5bnRheF9FcnJvciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTAsCisgICAgICAgICAgICAgICAgIm9wY29kZSBzeW50YXggZXJyb3IiICkKKyAgRlRfRVJST1JERUZfKCBTdGFja19VbmRlcmZsb3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEExLAorICAgICAgICAgICAgICAgICJhcmd1bWVudCBzdGFjayB1bmRlcmZsb3ciICkKKyAgRlRfRVJST1JERUZfKCBJZ25vcmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEEyLAorICAgICAgICAgICAgICAgICJpZ25vcmUiICkKKyAgRlRfRVJST1JERUZfKCBOb19Vbmljb2RlX0dseXBoX05hbWUsICAgICAgICAgICAgICAgICAgICAgICAweEEzLAorICAgICAgICAgICAgICAgICJubyBVbmljb2RlIGdseXBoIG5hbWUgZm91bmQiICkKKyAgRlRfRVJST1JERUZfKCBHbHlwaF9Ub29fQmlnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEE0LAorICAgICAgICAgICAgICAgICJnbHlwaCB0byBiaWcgZm9yIGhpbnRpbmciICkKKworICAvKiBCREYgZXJyb3JzICovCisKKyAgRlRfRVJST1JERUZfKCBNaXNzaW5nX1N0YXJ0Zm9udF9GaWVsZCwgICAgICAgICAgICAgICAgICAgICAweEIwLAorICAgICAgICAgICAgICAgICJgU1RBUlRGT05UJyBmaWVsZCBtaXNzaW5nIiApCisgIEZUX0VSUk9SREVGXyggTWlzc2luZ19Gb250X0ZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCMSwKKyAgICAgICAgICAgICAgICAiYEZPTlQnIGZpZWxkIG1pc3NpbmciICkKKyAgRlRfRVJST1JERUZfKCBNaXNzaW5nX1NpemVfRmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAweEIyLAorICAgICAgICAgICAgICAgICJgU0laRScgZmllbGQgbWlzc2luZyIgKQorICBGVF9FUlJPUkRFRl8oIE1pc3NpbmdfRm9udGJvdW5kaW5nYm94X0ZpZWxkLCAgICAgICAgICAgICAgIDB4QjMsCisgICAgICAgICAgICAgICAgImBGT05UQk9VTkRJTkdCT1gnIGZpZWxkIG1pc3NpbmciICkKKyAgRlRfRVJST1JERUZfKCBNaXNzaW5nX0NoYXJzX0ZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAweEI0LAorICAgICAgICAgICAgICAgICJgQ0hBUlMnIGZpZWxkIG1pc3NpbmciICkKKyAgRlRfRVJST1JERUZfKCBNaXNzaW5nX1N0YXJ0Y2hhcl9GaWVsZCwgICAgICAgICAgICAgICAgICAgICAweEI1LAorICAgICAgICAgICAgICAgICJgU1RBUlRDSEFSJyBmaWVsZCBtaXNzaW5nIiApCisgIEZUX0VSUk9SREVGXyggTWlzc2luZ19FbmNvZGluZ19GaWVsZCwgICAgICAgICAgICAgICAgICAgICAgMHhCNiwKKyAgICAgICAgICAgICAgICAiYEVOQ09ESU5HJyBmaWVsZCBtaXNzaW5nIiApCisgIEZUX0VSUk9SREVGXyggTWlzc2luZ19CYnhfRmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCNywKKyAgICAgICAgICAgICAgICAiYEJCWCcgZmllbGQgbWlzc2luZyIgKQorICBGVF9FUlJPUkRFRl8oIEJieF9Ub29fQmlnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjgsCisgICAgICAgICAgICAgICAgImBCQlgnIHRvbyBiaWciICkKKyAgRlRfRVJST1JERUZfKCBDb3JydXB0ZWRfRm9udF9IZWFkZXIsICAgICAgICAgICAgICAgICAgICAgICAweEI5LAorICAgICAgICAgICAgICAgICJGb250IGhlYWRlciBjb3JydXB0ZWQgb3IgbWlzc2luZyBmaWVsZHMiICkKKyAgRlRfRVJST1JERUZfKCBDb3JydXB0ZWRfRm9udF9HbHlwaHMsICAgICAgICAgICAgICAgICAgICAgICAweEJBLAorICAgICAgICAgICAgICAgICJGb250IGdseXBocyBjb3JydXB0ZWQgb3IgbWlzc2luZyBmaWVsZHMiICkKKworICAvKiAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGVycm9ycy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGVycm9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MDdiOWEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0ZXJyb3JzLmgKQEAgLTAsMCArMSwyMTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0ZXJyb3JzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlIGhhbmRsaW5nIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIGVycm9yX2VudW1lcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEVycm9yIEVudW1lcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEhvdyB0byBoYW5kbGUgZXJyb3JzIGFuZCBlcnJvciBzdHJpbmdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFRoZSBoZWFkZXIgZmlsZSBgZnRlcnJvcnMuaCcgKHdoaWNoIGlzIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgYnkgICAgKi8KKyAgLyogICBgZnJlZXR5cGUuaCcgZGVmaW5lcyB0aGUgaGFuZGxpbmcgb2YgRnJlZVR5cGUncyBlbnVtZXJhdGlvbiAgICAgICAgICovCisgIC8qICAgY29uc3RhbnRzLiAgSXQgY2FuIGFsc28gYmUgdXNlZCB0byBnZW5lcmF0ZSBlcnJvciBtZXNzYWdlIHN0cmluZ3MgICAqLworICAvKiAgIHdpdGggYSBzbWFsbCBtYWNybyB0cmljayBleHBsYWluZWQgYmVsb3cuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgKkVycm9yKiAqRm9ybWF0cyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBUaGUgY29uZmlndXJhdGlvbiBtYWNybyBGVF9DT05GSUdfT1BUSU9OX1VTRV9NT0RVTEVfRVJST1JTIGNhbiBiZSAgICovCisgIC8qICAgZGVmaW5lZCBpbiBgZnRvcHRpb24uaCcgaW4gb3JkZXIgdG8gbWFrZSB0aGUgaGlnaGVyIGJ5dGUgaW5kaWNhdGUgICAqLworICAvKiAgIHRoZSBtb2R1bGUgd2hlcmUgdGhlIGVycm9yIGhhcyBoYXBwZW5lZCAodGhpcyBpcyBub3QgY29tcGF0aWJsZSAgICAgKi8KKyAgLyogICB3aXRoIHN0YW5kYXJkIGJ1aWxkcyBvZiBGcmVlVHlwZSZuYnNwOzIsIGhvd2V2ZXIpLiAgU2VlIHRoZSBmaWxlICAgICovCisgIC8qICAgYGZ0bW9kZXJyLmgnIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAqRXJyb3IqICpNZXNzYWdlKiAqU3RyaW5ncyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEVycm9yIGRlZmluaXRpb25zIGFyZSBzZXQgdXAgd2l0aCBzcGVjaWFsIG1hY3JvcyB0aGF0IGFsbG93IGNsaWVudCAgKi8KKyAgLyogICBhcHBsaWNhdGlvbnMgdG8gYnVpbGQgYSB0YWJsZSBvZiBlcnJvciBtZXNzYWdlIHN0cmluZ3MuICBUaGUgICAgICAgICovCisgIC8qICAgc3RyaW5ncyBhcmUgbm90IGluY2x1ZGVkIGluIGEgbm9ybWFsIGJ1aWxkIG9mIEZyZWVUeXBlJm5ic3A7MiB0byAgICAqLworICAvKiAgIHNhdmUgc3BhY2UgKG1vc3QgY2xpZW50IGFwcGxpY2F0aW9ucyBkbyBub3QgdXNlIHRoZW0pLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgVG8gZG8gc28sIHlvdSBoYXZlIHRvIGRlZmluZSB0aGUgZm9sbG93aW5nIG1hY3JvcyBiZWZvcmUgaW5jbHVkaW5nICAqLworICAvKiAgIHRoaXMgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgRlRfRVJST1JfU1RBUlRfTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFRoaXMgbWFjcm8gaXMgY2FsbGVkIGJlZm9yZSBhbnl0aGluZyBlbHNlIHRvIGRlZmluZSB0aGUgc3RhcnQgb2YgICAgKi8KKyAgLyogICB0aGUgZXJyb3IgbGlzdC4gIEl0IGlzIGZvbGxvd2VkIGJ5IHNldmVyYWwgRlRfRVJST1JfREVGIGNhbGxzLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIEZUX0VSUk9SX0RFRiggZSwgdiwgcyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBUaGlzIG1hY3JvIGlzIGNhbGxlZCB0byBkZWZpbmUgb25lIHNpbmdsZSBlcnJvci4gIGBlJyBpcyB0aGUgZXJyb3IgICovCisgIC8qICAgY29kZSBpZGVudGlmaWVyIChlLmcuLCBgSW52YWxpZF9Bcmd1bWVudCcpLCBgdicgaXMgdGhlIGVycm9yJ3MgICAgICAqLworICAvKiAgIG51bWVyaWNhbCB2YWx1ZSwgYW5kIGBzJyBpcyB0aGUgY29ycmVzcG9uZGluZyBlcnJvciBzdHJpbmcuICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgRlRfRVJST1JfRU5EX0xJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFRoaXMgbWFjcm8gZW5kcyB0aGUgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgQWRkaXRpb25hbGx5LCB5b3UgaGF2ZSB0byB1bmRlZmluZSBgX19GVEVSUk9SU19IX18nIGJlZm9yZSAgICAgICAgICAqLworICAvKiAgICNpbmNsdWRpbmcgdGhpcyBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAjdW5kZWYgX19GVEVSUk9SU19IX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgI2RlZmluZSBGVF9FUlJPUkRFRiggZSwgdiwgcyApICB7IGUsIHMgfSwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICNkZWZpbmUgRlRfRVJST1JfU1RBUlRfTElTVCAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAjZGVmaW5lIEZUX0VSUk9SX0VORF9MSVNUICAgICAgIHsgMCwgTlVMTCB9IH07ICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIGNvbnN0IHN0cnVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICBpbnQgICAgICAgICAgZXJyX2NvZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgY29uc3QgY2hhciogIGVycl9tc2c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICB9IGZ0X2Vycm9yc1tdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICNpbmNsdWRlIEZUX0VSUk9SU19IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBOb3RlIHRoYXQgYEZUX0Vycl9PaycgaXMgX25vdF8gZGVmaW5lZCB3aXRoIGBGVF9FUlJPUkRFRicgYnV0IHdpdGggICovCisgIC8qICAgYEZUX05PRVJST1JERUYnOyBpdCBpcyBhbHdheXMgemVyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyogKi8KKworI2lmbmRlZiBfX0ZURVJST1JTX0hfXworI2RlZmluZSBfX0ZURVJST1JTX0hfXworCisKKyAgLyogaW5jbHVkZSBtb2R1bGUgYmFzZSBlcnJvciBjb2RlcyAqLworI2luY2x1ZGUgRlRfTU9EVUxFX0VSUk9SU19ICisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLworICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgIFNFVFVQIE1BQ1JPUyAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKyAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjdW5kZWYgIEZUX05FRURfRVhURVJOX0MKKworCisgIC8qIEZUX0VSUl9QUkVGSVggaXMgdXNlZCBhcyBhIHByZWZpeCBmb3IgZXJyb3IgaWRlbnRpZmllcnMuICovCisgIC8qIEJ5IGRlZmF1bHQsIHdlIHVzZSBgRlRfRXJyXycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZuZGVmIEZUX0VSUl9QUkVGSVgKKyNkZWZpbmUgRlRfRVJSX1BSRUZJWCAgRlRfRXJyXworI2VuZGlmCisKKworICAvKiBGVF9FUlJfQkFTRSBpcyB1c2VkIGFzIHRoZSBiYXNlIGZvciBtb2R1bGUtc3BlY2lmaWMgZXJyb3JzLiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX01PRFVMRV9FUlJPUlMKKworI2lmbmRlZiBGVF9FUlJfQkFTRQorI2RlZmluZSBGVF9FUlJfQkFTRSAgRlRfTW9kX0Vycl9CYXNlCisjZW5kaWYKKworI2Vsc2UKKworI3VuZGVmIEZUX0VSUl9CQVNFCisjZGVmaW5lIEZUX0VSUl9CQVNFICAwCisKKyNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1VTRV9NT0RVTEVfRVJST1JTICovCisKKworICAvKiBJZiBGVF9FUlJPUkRFRiBpcyBub3QgZGVmaW5lZCwgd2UgbmVlZCB0byBkZWZpbmUgYSBzaW1wbGUgKi8KKyAgLyogZW51bWVyYXRpb24gdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmbmRlZiBGVF9FUlJPUkRFRgorCisjZGVmaW5lIEZUX0VSUk9SREVGKCBlLCB2LCBzICkgIGUgPSB2LAorI2RlZmluZSBGVF9FUlJPUl9TVEFSVF9MSVNUICAgICBlbnVtIHsKKyNkZWZpbmUgRlRfRVJST1JfRU5EX0xJU1QgICAgICAgRlRfRVJSX0NBVCggRlRfRVJSX1BSRUZJWCwgTWF4ICkgfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIEZUX05FRURfRVhURVJOX0MKKyAgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2VuZGlmIC8qICFGVF9FUlJPUkRFRiAqLworCisKKyAgLyogdGhpcyBtYWNybyBpcyB1c2VkIHRvIGRlZmluZSBhbiBlcnJvciAqLworI2RlZmluZSBGVF9FUlJPUkRFRl8oIGUsIHYsIHMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBGVF9FUlJPUkRFRiggRlRfRVJSX0NBVCggRlRfRVJSX1BSRUZJWCwgZSApLCB2ICsgRlRfRVJSX0JBU0UsIHMgKQorCisgIC8qIHRoaXMgaXMgb25seSB1c2VkIGZvciA8bW9kdWxlPl9FcnJfT2ssIHdoaWNoIG11c3QgYmUgMCEgKi8KKyNkZWZpbmUgRlRfTk9FUlJPUkRFRl8oIGUsIHYsIHMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEZUX0VSUk9SREVGKCBGVF9FUlJfQ0FUKCBGVF9FUlJfUFJFRklYLCBlICksIHYsIHMgKQorCisKKyNpZmRlZiBGVF9FUlJPUl9TVEFSVF9MSVNUCisgIEZUX0VSUk9SX1NUQVJUX0xJU1QKKyNlbmRpZgorCisKKyAgLyogbm93IGluY2x1ZGUgdGhlIGVycm9yIGNvZGVzICovCisjaW5jbHVkZSBGVF9FUlJPUl9ERUZJTklUSU9OU19ICisKKworI2lmZGVmIEZUX0VSUk9SX0VORF9MSVNUCisgIEZUX0VSUk9SX0VORF9MSVNUCisjZW5kaWYKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCisgIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICBTSU1QTEUgQ0xFQU5VUCAgICAgICAgICAgICAgICAgICAgICoqKioqLworICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgRlRfTkVFRF9FWFRFUk5fQworICB9CisjZW5kaWYKKworI3VuZGVmIEZUX0VSUk9SX1NUQVJUX0xJU1QKKyN1bmRlZiBGVF9FUlJPUl9FTkRfTElTVAorCisjdW5kZWYgRlRfRVJST1JERUYKKyN1bmRlZiBGVF9FUlJPUkRFRl8KKyN1bmRlZiBGVF9OT0VSUk9SREVGXworCisjdW5kZWYgRlRfTkVFRF9FWFRFUk5fQworI3VuZGVmIEZUX0VSUl9CQVNFCisKKyAgLyogRlRfRVJSX1BSRUZJWCBpcyBuZWVkZWQgaW50ZXJuYWxseSAqLworI2lmbmRlZiBGVDJfQlVJTERfTElCUkFSWQorI3VuZGVmIEZUX0VSUl9QUkVGSVgKKyNlbmRpZgorCisjZW5kaWYgLyogX19GVEVSUk9SU19IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRmbnRmbXQuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRmbnRmbXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjhmZjI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGZudGZtdC5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0Zm50Zm10LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBTdXBwb3J0IGZ1bmN0aW9ucyBmb3IgZm9udCBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwMi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0ZURk5URk1UX0hfXworI2RlZmluZSBfX0ZURk5URk1UX0hfXworCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKworI2lmZGVmIEZSRUVUWVBFX0gKKyNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCisjZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKKyNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgorI2VuZGlmCisKKworRlRfQkVHSU5fSEVBREVSCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIGZvbnRfZm9ybWF0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEZvbnQgRm9ybWF0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEdldHRpbmcgdGhlIGZvbnQgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFRoZSBzaW5nbGUgZnVuY3Rpb24gaW4gdGhpcyBzZWN0aW9uIGNhbiBiZSB1c2VkIHRvIGdldCB0aGUgZm9udCAgICAgKi8KKyAgLyogICBmb3JtYXQuICBOb3RlIHRoYXQgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgbmVlZGVkIG5vcm1hbGx5OyAgICAgICAgICovCisgIC8qICAgaG93ZXZlciwgdGhlcmUgYXJlIHNwZWNpYWwgY2FzZXMgKGxpa2UgaW4gUERGIGRldmljZXMpIHdoZXJlIGl0IGlzICAqLworICAvKiAgIGltcG9ydGFudCB0byBkaWZmZXJlbnRpYXRlLCBpbiBzcGl0ZSBvZiBGcmVlVHlwZSdzIHVuaWZvcm0gQVBJLiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBGVF9HZXRfRm9udF9Gb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZm9ybWF0IG9mIGEgZ2l2ZW4gZmFjZS4gIFBvc3NpYmxlICAgICovCisgIC8qICAgdmFsdWVzIGFyZSBgVHJ1ZVR5cGUnLCBgVHlwZX4xJywgYEJERicsIGBQQ0YnLCBgVHlwZX40MicsICAgICAgICAgICAqLworICAvKiAgIGBDSUR+VHlwZX4xJywgYENGRicsIGBQRlInLCBhbmQgYFdpbmRvd3N+Rk5UJy4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgVGhlIHJldHVybiB2YWx1ZSBpcyBzdWl0YWJsZSB0byBiZSB1c2VkIGFzIGFuIFgxMSBGT05UX1BST1BFUlRZLiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgZmFjZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgSW5wdXQgZmFjZSBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEZvbnQgZm9ybWF0IHN0cmluZy4gIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEEgZGVwcmVjYXRlZCBuYW1lIGZvciB0aGUgc2FtZSBmdW5jdGlvbiBpcyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBgRlRfR2V0X1gxMV9Gb250X0Zvcm1hdCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIGNvbnN0IGNoYXIqICkKKyAgRlRfR2V0X0ZvbnRfRm9ybWF0KCBGVF9GYWNlICBmYWNlICk7CisKKworICAvKiBkZXByZWNhdGVkICovCisgIEZUX0VYUE9SVCggY29uc3QgY2hhciogKQorICBGVF9HZXRfWDExX0ZvbnRfRm9ybWF0KCBGVF9GYWNlICBmYWNlICk7CisKKworICAvKiAqLworCisKK0ZUX0VORF9IRUFERVIKKworI2VuZGlmIC8qIF9fRlRGTlRGTVRfSF9fICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z2FzcC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGdhc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTliNjMyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGdhc3AuaApAQCAtMCwwICsxLDEyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRnYXNwLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFjY2VzcyBvZiBUcnVlVHlwZSdzIGBnYXNwJyB0YWJsZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDA3LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9GVF9HQVNQX0hfCisjZGVmaW5lIF9GVF9HQVNQX0hfCisKKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAorCisjaWZkZWYgRlJFRVRZUEVfSAorI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKKyNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgorI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCisjZW5kaWYKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHNlY3Rpb246CisgICAqICAgZ2FzcF90YWJsZQorICAgKgorICAgKiBAdGl0bGU6CisgICAqICAgR2FzcCBUYWJsZQorICAgKgorICAgKiBAYWJzdHJhY3Q6CisgICAqICAgUmV0cmlldmluZyBUcnVlVHlwZSBgZ2FzcCcgdGFibGUgZW50cmllcy4KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoZSBmdW5jdGlvbiBARlRfR2V0X0dhc3AgY2FuIGJlIHVzZWQgdG8gcXVlcnkgYSBUcnVlVHlwZSBvciBPcGVuVHlwZQorICAgKiAgIGZvbnQgZm9yIHNwZWNpZmljIGVudHJpZXMgaW4gaXRzIGBnYXNwJyB0YWJsZSwgaWYgYW55LiAgVGhpcyBpcworICAgKiAgIG1haW5seSB1c2VmdWwgd2hlbiBpbXBsZW1lbnRpbmcgbmF0aXZlIFRydWVUeXBlIGhpbnRpbmcgd2l0aCB0aGUKKyAgICogICBieXRlY29kZSBpbnRlcnByZXRlciB0byBkdXBsaWNhdGUgdGhlIFdpbmRvd3MgdGV4dCByZW5kZXJpbmcgcmVzdWx0cy4KKyAgICovCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGVudW06CisgICAqICAgRlRfR0FTUF9YWFgKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgbGlzdCBvZiB2YWx1ZXMgYW5kL29yIGJpdC1mbGFncyByZXR1cm5lZCBieSB0aGUgQEZUX0dldF9HYXNwCisgICAqICAgZnVuY3Rpb24uCisgICAqCisgICAqIEB2YWx1ZXM6CisgICAqICAgRlRfR0FTUF9OT19UQUJMRSA6OgorICAgKiAgICAgVGhpcyBzcGVjaWFsIHZhbHVlIG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8gR0FTUCB0YWJsZSBpbiB0aGlzIGZhY2UuCisgICAqICAgICBJdCBpcyB1cCB0byB0aGUgY2xpZW50IHRvIGRlY2lkZSB3aGF0IHRvIGRvLgorICAgKgorICAgKiAgIEZUX0dBU1BfRE9fR1JJREZJVCA6OgorICAgKiAgICAgR3JpZC1maXR0aW5nIGFuZCBoaW50aW5nIHNob3VsZCBiZSBwZXJmb3JtZWQgYXQgdGhlIHNwZWNpZmllZCBwcGVtLgorICAgKiAgICAgVGhpcyAqcmVhbGx5KiBtZWFucyBUcnVlVHlwZSBieXRlY29kZSBpbnRlcnByZXRhdGlvbi4gIElmIHRoaXMgYml0CisgICAqICAgICBpcyBub3Qgc2V0LCBubyBoaW50aW5nIGdldHMgYXBwbGllZC4KKyAgICoKKyAgICogICBGVF9HQVNQX0RPX0dSQVkgOjoKKyAgICogICAgIEFudGktYWxpYXNlZCByZW5kZXJpbmcgc2hvdWxkIGJlIHBlcmZvcm1lZCBhdCB0aGUgc3BlY2lmaWVkIHBwZW0uCisgICAqICAgICBJZiBub3Qgc2V0LCBkbyBtb25vY2hyb21lIHJlbmRlcmluZy4KKyAgICoKKyAgICogICBGVF9HQVNQX1NZTU1FVFJJQ19TTU9PVEhJTkcgOjoKKyAgICogICAgIElmIHNldCwgc21vb3RoaW5nIGFsb25nIG11bHRpcGxlIGF4ZXMgbXVzdCBiZSB1c2VkIHdpdGggQ2xlYXJUeXBlLgorICAgKgorICAgKiAgIEZUX0dBU1BfU1lNTUVUUklDX0dSSURGSVQgOjoKKyAgICogICAgIEdyaWQtZml0dGluZyBtdXN0IGJlIHVzZWQgd2l0aCBDbGVhclR5cGUncyBzeW1tZXRyaWMgc21vb3RoaW5nLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGUgYml0LWZsYWdzIGBGVF9HQVNQX0RPX0dSSURGSVQnIGFuZCBgRlRfR0FTUF9ET19HUkFZJyBhcmUgdG8gYmUKKyAgICogICB1c2VkIGZvciBzdGFuZGFyZCBmb250IHJhc3Rlcml6YXRpb24gb25seS4gIEluZGVwZW5kZW50bHkgb2YgdGhhdCwKKyAgICogICBgRlRfR0FTUF9TWU1NRVRSSUNfU01PT1RISU5HJyBhbmQgYEZUX0dBU1BfU1lNTUVUUklDX0dSSURGSVQnIGFyZSB0bworICAgKiAgIGJlIHVzZWQgaWYgQ2xlYXJUeXBlIGlzIGVuYWJsZWQgKGFuZCBgRlRfR0FTUF9ET19HUklERklUJyBhbmQKKyAgICogICBgRlRfR0FTUF9ET19HUkFZJyBhcmUgY29uc2VxdWVudGx5IGlnbm9yZWQpLgorICAgKgorICAgKiAgIGBDbGVhclR5cGUnIGlzIE1pY3Jvc29mdCdzIGltcGxlbWVudGF0aW9uIG9mIExDRCByZW5kZXJpbmcsIHBhcnRseQorICAgKiAgIHByb3RlY3RlZCBieSBwYXRlbnRzLgorICAgKgorICAgKiBAc2luY2U6CisgICAqICAgMi4zLjAKKyAgICovCisjZGVmaW5lIEZUX0dBU1BfTk9fVEFCTEUgICAgICAgICAgICAgICAtMQorI2RlZmluZSBGVF9HQVNQX0RPX0dSSURGSVQgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRlRfR0FTUF9ET19HUkFZICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEZUX0dBU1BfU1lNTUVUUklDX1NNT09USElORyAgMHgwOAorI2RlZmluZSBGVF9HQVNQX1NZTU1FVFJJQ19HUklERklUICAgIDB4MTAKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jOgorICAgKiAgIEZUX0dldF9HYXNwCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZWFkIHRoZSBgZ2FzcCcgdGFibGUgZnJvbSBhIFRydWVUeXBlIG9yIE9wZW5UeXBlIGZvbnQgZmlsZSBhbmQKKyAgICogICByZXR1cm4gdGhlIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBjaGFyYWN0ZXIgcGl4ZWwgc2l6ZS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGZhY2UgOjogVGhlIHNvdXJjZSBmYWNlIGhhbmRsZS4KKyAgICogICBwcGVtIDo6IFRoZSB2ZXJ0aWNhbCBjaGFyYWN0ZXIgcGl4ZWwgc2l6ZS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBCaXQgZmxhZ3MgKHNlZSBARlRfR0FTUF9YWFgpLCBvciBARlRfR0FTUF9OT19UQUJMRSBpZiB0aGVyZSBpcyBubworICAgKiAgIGBnYXNwJyB0YWJsZSBpbiB0aGUgZmFjZS4KKyAgICoKKyAgICogQHNpbmNlOgorICAgKiAgIDIuMy4wCisgICAqLworICBGVF9FWFBPUlQoIEZUX0ludCApCisgIEZUX0dldF9HYXNwKCBGVF9GYWNlICBmYWNlLAorICAgICAgICAgICAgICAgRlRfVUludCAgcHBlbSApOworCisgIC8qICovCisKKworI2VuZGlmIC8qIF9GVF9HQVNQX0hfICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z2x5cGguaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRnbHlwaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwM2FkMzkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z2x5cGguaApAQCAtMCwwICsxLDYwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRnbHlwaC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWVUeXBlIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyB0byBoYW5kbGUgZ2x5cGhzIChzcGVjaWZpY2F0aW9uKS4gICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHNldmVyYWwgY29udmVuaWVuY2UgZnVuY3Rpb25zICAgICovCisgIC8qIHRoYXQgY2FuIGJlIHVzZWQgYnkgY2xpZW50IGFwcGxpY2F0aW9ucyB0byBlYXNpbHkgcmV0cmlldmUgZ2x5cGggICAgICAqLworICAvKiBiaXRtYXBzIGFuZCBvdXRsaW5lcyBmcm9tIGEgZ2l2ZW4gZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgb3B0aW9uYWwgaWYgeW91IGFyZSB3cml0aW5nIGEgZm9udCBzZXJ2ZXIgICAqLworICAvKiBvciB0ZXh0IGxheW91dCBlbmdpbmUgb24gdG9wIG9mIEZyZWVUeXBlLiAgSG93ZXZlciwgdGhleSBhcmUgcHJldHR5ICAgKi8KKyAgLyogaGFuZHkgZm9yIG1hbnkgb3RoZXIgc2ltcGxlIHVzZXMgb2YgdGhlIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fRlRHTFlQSF9IX18KKyNkZWZpbmUgX19GVEdMWVBIX0hfXworCisKKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAorCisjaWZkZWYgRlJFRVRZUEVfSAorI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKKyNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgorI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCisjZW5kaWYKKworCitGVF9CRUdJTl9IRUFERVIKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdseXBoX21hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEdseXBoIE1hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEdlbmVyaWMgaW50ZXJmYWNlIHRvIG1hbmFnZSBpbmRpdmlkdWFsIGdseXBoIGRhdGEuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyBkZWZpbml0aW9ucyB1c2VkIHRvIG1hbmFnZSBnbHlwaCBkYXRhICAgICAgICAqLworICAvKiAgICB0aHJvdWdoIGdlbmVyaWMgRlRfR2x5cGggb2JqZWN0cy4gIEVhY2ggb2YgdGhlbSBjYW4gY29udGFpbiBhICAgICAgKi8KKyAgLyogICAgYml0bWFwLCBhIHZlY3RvciBvdXRsaW5lLCBvciBldmVuIGltYWdlcyBpbiBvdGhlciBmb3JtYXRzLiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gdG8gYSBwcml2YXRlIHR5cGUgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgRlRfR2x5cGhfQ2xhc3NfICBGVF9HbHlwaF9DbGFzczsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEhhbmRsZSB0byBhbiBvYmplY3QgdXNlZCB0byBtb2RlbCBnZW5lcmljIGdseXBoIGltYWdlcy4gIEl0IGlzIGEgICAqLworICAvKiAgICBwb2ludGVyIHRvIHRoZSBARlRfR2x5cGhSZWMgc3RydWN0dXJlIGFuZCBjYW4gY29udGFpbiBhIGdseXBoICAgICAgKi8KKyAgLyogICAgYml0bWFwIG9yIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgR2x5cGggb2JqZWN0cyBhcmUgbm90IG93bmVkIGJ5IHRoZSBsaWJyYXJ5LiAgWW91IG11c3QgdGh1cyByZWxlYXNlICovCisgIC8qICAgIHRoZW0gbWFudWFsbHkgKHRocm91Z2ggQEZUX0RvbmVfR2x5cGgpIF9iZWZvcmVfIGNhbGxpbmcgICAgICAgICAgICAqLworICAvKiAgICBARlRfRG9uZV9GcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IEZUX0dseXBoUmVjXyogIEZUX0dseXBoOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2x5cGhSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIHJvb3QgZ2x5cGggc3RydWN0dXJlIGNvbnRhaW5zIGEgZ2l2ZW4gZ2x5cGggaW1hZ2UgcGx1cyBpdHMgICAgICovCisgIC8qICAgIGFkdmFuY2Ugd2lkdGggaW4gMTYuMTYgZml4ZWQtcG9pbnQgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gdGhlIEZyZWVUeXBlIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2xhenogICA6OiBBIHBvaW50ZXIgdG8gdGhlIGdseXBoJ3MgY2xhc3MuICBQcml2YXRlLiAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmb3JtYXQgIDo6IFRoZSBmb3JtYXQgb2YgdGhlIGdseXBoJ3MgaW1hZ2UuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFkdmFuY2UgOjogQSAxNi4xNiB2ZWN0b3IgdGhhdCBnaXZlcyB0aGUgZ2x5cGgncyBhZHZhbmNlIHdpZHRoLiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0dseXBoUmVjXworICB7CisgICAgRlRfTGlicmFyeSAgICAgICAgICAgICBsaWJyYXJ5OworICAgIGNvbnN0IEZUX0dseXBoX0NsYXNzKiAgY2xheno7CisgICAgRlRfR2x5cGhfRm9ybWF0ICAgICAgICBmb3JtYXQ7CisgICAgRlRfVmVjdG9yICAgICAgICAgICAgICBhZHZhbmNlOworCisgIH0gRlRfR2x5cGhSZWM7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9CaXRtYXBHbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGhhbmRsZSB0byBhbiBvYmplY3QgdXNlZCB0byBtb2RlbCBhIGJpdG1hcCBnbHlwaCBpbWFnZS4gIFRoaXMgaXMgKi8KKyAgLyogICAgYSBzdWItY2xhc3Mgb2YgQEZUX0dseXBoLCBhbmQgYSBwb2ludGVyIHRvIEBGVF9CaXRtYXBHbHlwaFJlYy4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCBGVF9CaXRtYXBHbHlwaFJlY18qICBGVF9CaXRtYXBHbHlwaDsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0JpdG1hcEdseXBoUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgZm9yIGJpdG1hcCBnbHlwaCBpbWFnZXMuICBUaGlzIHJlYWxseSBpcyBhICAgICAgICAqLworICAvKiAgICBgc3ViLWNsYXNzJyBvZiBARlRfR2x5cGhSZWMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByb290ICAgOjogVGhlIHJvb3QgQEZUX0dseXBoIGZpZWxkcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxlZnQgICA6OiBUaGUgbGVmdC1zaWRlIGJlYXJpbmcsIGkuZS4sIHRoZSBob3Jpem9udGFsIGRpc3RhbmNlICAgICAqLworICAvKiAgICAgICAgICAgICAgZnJvbSB0aGUgY3VycmVudCBwZW4gcG9zaXRpb24gdG8gdGhlIGxlZnQgYm9yZGVyIG9mIHRoZSAgKi8KKyAgLyogICAgICAgICAgICAgIGdseXBoIGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0b3AgICAgOjogVGhlIHRvcC1zaWRlIGJlYXJpbmcsIGkuZS4sIHRoZSB2ZXJ0aWNhbCBkaXN0YW5jZSBmcm9tICAgKi8KKyAgLyogICAgICAgICAgICAgIHRoZSBjdXJyZW50IHBlbiBwb3NpdGlvbiB0byB0aGUgdG9wIGJvcmRlciBvZiB0aGUgZ2x5cGggICovCisgIC8qICAgICAgICAgICAgICBiaXRtYXAuICBUaGlzIGRpc3RhbmNlIGlzIHBvc2l0aXZlIGZvciB1cHdhcmRzfnkhICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYml0bWFwIDo6IEEgZGVzY3JpcHRvciBmb3IgdGhlIGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgWW91IGNhbiB0eXBlY2FzdCBhbiBARlRfR2x5cGggdG8gQEZUX0JpdG1hcEdseXBoIGlmIHlvdSBoYXZlICAgICAgICovCisgIC8qICAgIGBnbHlwaC0+Zm9ybWF0ID09IEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAnLiAgVGhpcyBsZXRzIHlvdSBhY2Nlc3MgICAqLworICAvKiAgICB0aGUgYml0bWFwJ3MgY29udGVudHMgZWFzaWx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBjb3JyZXNwb25kaW5nIHBpeGVsIGJ1ZmZlciBpcyBhbHdheXMgb3duZWQgYnkgQEZUX0JpdG1hcEdseXBoICAqLworICAvKiAgICBhbmQgaXMgdGh1cyBjcmVhdGVkIGFuZCBkZXN0cm95ZWQgd2l0aCBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBGVF9CaXRtYXBHbHlwaFJlY18KKyAgeworICAgIEZUX0dseXBoUmVjICByb290OworICAgIEZUX0ludCAgICAgICBsZWZ0OworICAgIEZUX0ludCAgICAgICB0b3A7CisgICAgRlRfQml0bWFwICAgIGJpdG1hcDsKKworICB9IEZUX0JpdG1hcEdseXBoUmVjOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT3V0bGluZUdseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBoYW5kbGUgdG8gYW4gb2JqZWN0IHVzZWQgdG8gbW9kZWwgYW4gb3V0bGluZSBnbHlwaCBpbWFnZS4gIFRoaXMgICovCisgIC8qICAgIGlzIGEgc3ViLWNsYXNzIG9mIEBGVF9HbHlwaCwgYW5kIGEgcG9pbnRlciB0byBARlRfT3V0bGluZUdseXBoUmVjLiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgRlRfT3V0bGluZUdseXBoUmVjXyogIEZUX091dGxpbmVHbHlwaDsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX091dGxpbmVHbHlwaFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgZm9yIG91dGxpbmUgKHZlY3RvcmlhbCkgZ2x5cGggaW1hZ2VzLiAgVGhpcyAgICAgICAqLworICAvKiAgICByZWFsbHkgaXMgYSBgc3ViLWNsYXNzJyBvZiBARlRfR2x5cGhSZWMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByb290ICAgIDo6IFRoZSByb290IEBGVF9HbHlwaCBmaWVsZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG91dGxpbmUgOjogQSBkZXNjcmlwdG9yIGZvciB0aGUgb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFlvdSBjYW4gdHlwZWNhc3QgYW4gQEZUX0dseXBoIHRvIEBGVF9PdXRsaW5lR2x5cGggaWYgeW91IGhhdmUgICAgICAqLworICAvKiAgICBgZ2x5cGgtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORScuICBUaGlzIGxldHMgeW91IGFjY2VzcyAgKi8KKyAgLyogICAgdGhlIG91dGxpbmUncyBjb250ZW50IGVhc2lseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBcyB0aGUgb3V0bGluZSBpcyBleHRyYWN0ZWQgZnJvbSBhIGdseXBoIHNsb3QsIGl0cyBjb29yZGluYXRlcyBhcmUgKi8KKyAgLyogICAgZXhwcmVzc2VkIG5vcm1hbGx5IGluIDI2LjYgcGl4ZWxzLCB1bmxlc3MgdGhlIGZsYWcgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEBGVF9MT0FEX05PX1NDQUxFIHdhcyB1c2VkIGluIEBGVF9Mb2FkX0dseXBoKCkgb3IgQEZUX0xvYWRfQ2hhcigpLiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIG91dGxpbmUncyB0YWJsZXMgYXJlIGFsd2F5cyBvd25lZCBieSB0aGUgb2JqZWN0IGFuZCBhcmUgICAgICAgICovCisgIC8qICAgIGRlc3Ryb3llZCB3aXRoIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX091dGxpbmVHbHlwaFJlY18KKyAgeworICAgIEZUX0dseXBoUmVjICByb290OworICAgIEZUX091dGxpbmUgICBvdXRsaW5lOworCisgIH0gRlRfT3V0bGluZUdseXBoUmVjOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2V0X0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBmdW5jdGlvbiB1c2VkIHRvIGV4dHJhY3QgYSBnbHlwaCBpbWFnZSBmcm9tIGEgc2xvdC4gIE5vdGUgdGhhdCAgICovCisgIC8qICAgIHRoZSBjcmVhdGVkIEBGVF9HbHlwaCBvYmplY3QgbXVzdCBiZSByZWxlYXNlZCB3aXRoIEBGVF9Eb25lX0dseXBoLiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNsb3QgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGdseXBoIHNsb3QuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFnbHlwaCA6OiBBIGhhbmRsZSB0byB0aGUgZ2x5cGggb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX0dldF9HbHlwaCggRlRfR2x5cGhTbG90ICBzbG90LAorICAgICAgICAgICAgICAgIEZUX0dseXBoICAgICAqYWdseXBoICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HbHlwaF9Db3B5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gY29weSBhIGdseXBoIGltYWdlLiAgTm90ZSB0aGF0IHRoZSBjcmVhdGVkICAgICAgKi8KKyAgLyogICAgQEZUX0dseXBoIG9iamVjdCBtdXN0IGJlIHJlbGVhc2VkIHdpdGggQEZUX0RvbmVfR2x5cGguICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc291cmNlIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZ2x5cGggb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdGFyZ2V0IDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZ2x5cGggb2JqZWN0LiAgMH5pbiBjYXNlIG9mICAgICAgICovCisgIC8qICAgICAgICAgICAgICBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX0dseXBoX0NvcHkoIEZUX0dseXBoICAgc291cmNlLAorICAgICAgICAgICAgICAgICBGVF9HbHlwaCAgKnRhcmdldCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2x5cGhfVHJhbnNmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJhbnNmb3JtIGEgZ2x5cGggaW1hZ2UgaWYgaXRzIGZvcm1hdCBpcyBzY2FsYWJsZS4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGggIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZ2x5cGggb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF0cml4IDo6IEEgcG9pbnRlciB0byBhIDJ4MiBtYXRyaXggdG8gYXBwbHkuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkZWx0YSAgOjogQSBwb2ludGVyIHRvIGEgMmQgdmVjdG9yIHRvIGFwcGx5LiAgQ29vcmRpbmF0ZXMgYXJlICAgICAgKi8KKyAgLyogICAgICAgICAgICAgIGV4cHJlc3NlZCBpbiAxLzY0dGggb2YgYSBwaXhlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZSAoaWYgbm90IDAsIHRoZSBnbHlwaCBmb3JtYXQgaXMgbm90IHNjYWxhYmxlKS4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIDJ4MiB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggaXMgYWxzbyBhcHBsaWVkIHRvIHRoZSBnbHlwaCdzICAgICAgICovCisgIC8qICAgIGFkdmFuY2UgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX0dseXBoX1RyYW5zZm9ybSggRlRfR2x5cGggICAgZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgRlRfTWF0cml4KiAgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIGRlbHRhICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HbHlwaF9CQm94X01vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgbW9kZSBob3cgdGhlIHZhbHVlcyBvZiBARlRfR2x5cGhfR2V0X0NCb3ggYXJlIHJldHVybmVkLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HTFlQSF9CQk9YX1VOU0NBTEVEIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBSZXR1cm4gdW5zY2FsZWQgZm9udCB1bml0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HTFlQSF9CQk9YX1NVQlBJWEVMUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBSZXR1cm4gdW5maXR0ZWQgMjYuNiBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HTFlQSF9CQk9YX0dSSURGSVQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBSZXR1cm4gZ3JpZC1maXR0ZWQgMjYuNiBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HTFlQSF9CQk9YX1RSVU5DQVRFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBSZXR1cm4gY29vcmRpbmF0ZXMgaW4gaW50ZWdlciBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HTFlQSF9CQk9YX1BJWEVMUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBSZXR1cm4gZ3JpZC1maXR0ZWQgcGl4ZWwgY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIGVudW0gIEZUX0dseXBoX0JCb3hfTW9kZV8KKyAgeworICAgIEZUX0dMWVBIX0JCT1hfVU5TQ0FMRUQgID0gMCwKKyAgICBGVF9HTFlQSF9CQk9YX1NVQlBJWEVMUyA9IDAsCisgICAgRlRfR0xZUEhfQkJPWF9HUklERklUICAgPSAxLAorICAgIEZUX0dMWVBIX0JCT1hfVFJVTkNBVEUgID0gMiwKKyAgICBGVF9HTFlQSF9CQk9YX1BJWEVMUyAgICA9IDMKKworICB9IEZUX0dseXBoX0JCb3hfTW9kZTsKKworCisgIC8qIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVwcmVjYXRlZDsgdXNlIHRoZSBjb3JyZXNwb25kaW5nICovCisgIC8qIGBGVF9HbHlwaF9CQm94X01vZGUnIHZhbHVlcyBpbnN0ZWFkICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIGZ0X2dseXBoX2Jib3hfdW5zY2FsZWQgICBGVF9HTFlQSF9CQk9YX1VOU0NBTEVECisjZGVmaW5lIGZ0X2dseXBoX2Jib3hfc3VicGl4ZWxzICBGVF9HTFlQSF9CQk9YX1NVQlBJWEVMUworI2RlZmluZSBmdF9nbHlwaF9iYm94X2dyaWRmaXQgICAgRlRfR0xZUEhfQkJPWF9HUklERklUCisjZGVmaW5lIGZ0X2dseXBoX2Jib3hfdHJ1bmNhdGUgICBGVF9HTFlQSF9CQk9YX1RSVU5DQVRFCisjZGVmaW5lIGZ0X2dseXBoX2Jib3hfcGl4ZWxzICAgICBGVF9HTFlQSF9CQk9YX1BJWEVMUworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2x5cGhfR2V0X0NCb3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmV0dXJuIGEgZ2x5cGgncyBgY29udHJvbCBib3gnLiAgVGhlIGNvbnRyb2wgYm94IGVuY2xvc2VzIGFsbCB0aGUgICovCisgIC8qICAgIG91dGxpbmUncyBwb2ludHMsIGluY2x1ZGluZyBCw6l6aWVyIGNvbnRyb2wgcG9pbnRzLiAgVGhvdWdoIGl0ICAgICAgKi8KKyAgLyogICAgY29pbmNpZGVzIHdpdGggdGhlIGV4YWN0IGJvdW5kaW5nIGJveCBmb3IgbW9zdCBnbHlwaHMsIGl0IGNhbiBiZSAgICovCisgIC8qICAgIHNsaWdodGx5IGxhcmdlciBpbiBzb21lIHNpdHVhdGlvbnMgKGxpa2Ugd2hlbiByb3RhdGluZyBhbiBvdXRsaW5lICAqLworICAvKiAgICB0aGF0IGNvbnRhaW5zIELDqXppZXIgb3V0c2lkZSBhcmNzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDb21wdXRpbmcgdGhlIGNvbnRyb2wgYm94IGlzIHZlcnkgZmFzdCwgd2hpbGUgZ2V0dGluZyB0aGUgYm91bmRpbmcgKi8KKyAgLyogICAgYm94IGNhbiB0YWtlIG11Y2ggbW9yZSB0aW1lIGFzIGl0IG5lZWRzIHRvIHdhbGsgb3ZlciBhbGwgc2VnbWVudHMgICovCisgIC8qICAgIGFuZCBhcmNzIGluIHRoZSBvdXRsaW5lLiAgVG8gZ2V0IHRoZSBsYXR0ZXIsIHlvdSBjYW4gdXNlIHRoZSAgICAgICAqLworICAvKiAgICBgZnRiYm94JyBjb21wb25lbnQsIHdoaWNoIGlzIGRlZGljYXRlZCB0byB0aGlzIHNpbmdsZSB0YXNrLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnbHlwaCA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGdseXBoIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1vZGUgIDo6IFRoZSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0byBpbnRlcnByZXQgdGhlIHJldHVybmVkICAgICAqLworICAvKiAgICAgICAgICAgICBib3VuZGluZyBib3ggdmFsdWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhY2JveCA6OiBUaGUgZ2x5cGggY29vcmRpbmF0ZSBib3VuZGluZyBib3guICBDb29yZGluYXRlcyBhcmUgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgZXhwcmVzc2VkIGluIDEvNjR0aCBvZiBwaXhlbHMgaWYgaXQgaXMgZ3JpZC1maXR0ZWQuICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ29vcmRpbmF0ZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBnbHlwaCBvcmlnaW4sIHVzaW5nIHRoZSB5fnVwd2FyZHMgICovCisgIC8qICAgIGNvbnZlbnRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSWYgdGhlIGdseXBoIGhhcyBiZWVuIGxvYWRlZCB3aXRoIEBGVF9MT0FEX05PX1NDQUxFLCBgYmJveF9tb2RlJyAgICovCisgIC8qICAgIG11c3QgYmUgc2V0IHRvIEBGVF9HTFlQSF9CQk9YX1VOU0NBTEVEIHRvIGdldCB1bnNjYWxlZCBmb250ICAgICAgICAqLworICAvKiAgICB1bml0cyBpbiAyNi42IHBpeGVsIGZvcm1hdC4gIFRoZSB2YWx1ZSBARlRfR0xZUEhfQkJPWF9TVUJQSVhFTFMgICAgKi8KKyAgLyogICAgaXMgYW5vdGhlciBuYW1lIGZvciB0aGlzIGNvbnN0YW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJZiB0aGUgZm9udCBpcyB0cmlja3kgYW5kIHRoZSBnbHlwaCBoYXMgYmVlbiBsb2FkZWQgd2l0aCAgICAgICAgICAgKi8KKyAgLyogICAgQEZUX0xPQURfTk9fU0NBTEUsIHRoZSByZXN1bHRpbmcgQ0JveCBpcyBtZWFuaW5nbGVzcy4gIFRvIGdldCAgICAgICovCisgIC8qICAgIHJlYXNvbmFibGUgdmFsdWVzIGZvciB0aGUgQ0JveCBpdCBpcyBuZWNlc3NhcnkgdG8gbG9hZCB0aGUgZ2x5cGggICAqLworICAvKiAgICBhdCBhIGxhcmdlIHBwZW0gdmFsdWUgKHNvIHRoYXQgdGhlIGhpbnRpbmcgaW5zdHJ1Y3Rpb25zIGNhbiAgICAgICAgKi8KKyAgLyogICAgcHJvcGVybHkgc2hpZnQgYW5kIHNjYWxlIHRoZSBzdWJnbHlwaHMpLCB0aGVuIGV4dHJhY3RpbmcgdGhlIENCb3gsICovCisgIC8qICAgIHdoaWNoIGNhbiBiZSBldmVudHVhbGx5IGNvbnZlcnRlZCBiYWNrIHRvIGZvbnQgdW5pdHMuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTm90ZSB0aGF0IHRoZSBtYXhpbXVtIGNvb3JkaW5hdGVzIGFyZSBleGNsdXNpdmUsIHdoaWNoIG1lYW5zIHRoYXQgICovCisgIC8qICAgIG9uZSBjYW4gY29tcHV0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgZ2x5cGggaW1hZ2UgKGJlIGl0IGluICAqLworICAvKiAgICBpbnRlZ2VyIG9yIDI2LjYgcGl4ZWxzKSBhczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIHdpZHRoICA9IGJib3gueE1heCAtIGJib3gueE1pbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBoZWlnaHQgPSBiYm94LnlNYXggLSBiYm94LnlNaW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTm90ZSBhbHNvIHRoYXQgZm9yIDI2LjYgY29vcmRpbmF0ZXMsIGlmIGBiYm94X21vZGUnIGlzIHNldCB0byAgICAgICovCisgIC8qICAgIEBGVF9HTFlQSF9CQk9YX0dSSURGSVQsIHRoZSBjb29yZGluYXRlcyB3aWxsIGFsc28gYmUgZ3JpZC1maXR0ZWQsICAqLworICAvKiAgICB3aGljaCBjb3JyZXNwb25kcyB0bzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIGJib3gueE1pbiA9IEZMT09SKGJib3gueE1pbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBiYm94LnlNaW4gPSBGTE9PUihiYm94LnlNaW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgYmJveC54TWF4ID0gQ0VJTElORyhiYm94LnhNYXgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIGJib3gueU1heCA9IENFSUxJTkcoYmJveC55TWF4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUbyBnZXQgdGhlIGJib3ggaW4gcGl4ZWwgY29vcmRpbmF0ZXMsIHNldCBgYmJveF9tb2RlJyB0byAgICAgICAgICAgKi8KKyAgLyogICAgQEZUX0dMWVBIX0JCT1hfVFJVTkNBVEUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUbyBnZXQgdGhlIGJib3ggaW4gZ3JpZC1maXR0ZWQgcGl4ZWwgY29vcmRpbmF0ZXMsIHNldCBgYmJveF9tb2RlJyAgKi8KKyAgLyogICAgdG8gQEZUX0dMWVBIX0JCT1hfUElYRUxTLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIHZvaWQgKQorICBGVF9HbHlwaF9HZXRfQ0JveCggRlRfR2x5cGggIGdseXBoLAorICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGJib3hfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgIEZUX0JCb3ggICphY2JveCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2x5cGhfVG9fQml0bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ29udmVydCBhIGdpdmVuIGdseXBoIG9iamVjdCB0byBhIGJpdG1hcCBnbHlwaCBvYmplY3QuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdGhlX2dseXBoICAgOjogQSBwb2ludGVyIHRvIGEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZ2x5cGguICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcmVuZGVyX21vZGUgOjogQW4gZW51bWVyYXRpb24gdGhhdCBkZXNjcmliZXMgaG93IHRoZSBkYXRhIGlzICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgb3JpZ2luICAgICAgOjogQSBwb2ludGVyIHRvIGEgdmVjdG9yIHVzZWQgdG8gdHJhbnNsYXRlIHRoZSBnbHlwaCAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIGltYWdlIGJlZm9yZSByZW5kZXJpbmcuICBDYW4gYmV+MCAoaWYgbm8gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbikuICBUaGUgb3JpZ2luIGlzIGV4cHJlc3NlZCBpbiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgMjYuNiBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkZXN0cm95ICAgICA6OiBBIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgb3JpZ2luYWwgZ2x5cGggICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgaW1hZ2Ugc2hvdWxkIGJlIGRlc3Ryb3llZCBieSB0aGlzIGZ1bmN0aW9uLiAgSXQgaXMgICovCisgIC8qICAgICAgICAgICAgICAgICAgIG5ldmVyIGRlc3Ryb3llZCBpbiBjYXNlIG9mIGVycm9yLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nIGlmIHRoZSBnbHlwaCBmb3JtYXQgaXNuJ3Qgc2NhbGFibGUuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGdseXBoIGltYWdlIGlzIHRyYW5zbGF0ZWQgd2l0aCB0aGUgYG9yaWdpbicgdmVjdG9yIGJlZm9yZSAgICAgICovCisgIC8qICAgIHJlbmRlcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYW4gQEZUX0dseXBoIGhhbmRsZSwgdGhhdCB3aWxsICovCisgIC8qICAgIGJlIF9yZXBsYWNlZF8gYnkgdGhpcyBmdW5jdGlvbiAod2l0aCBuZXdseSBhbGxvY2F0ZWQgZGF0YSkuICAgICAgICAqLworICAvKiAgICBUeXBpY2FsbHksIHlvdSB3b3VsZCB1c2UgKG9taXR0aW5nIGVycm9yIGhhbmRsaW5nKTogICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIEZUX0dseXBoICAgICAgICBnbHlwaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICBGVF9CaXRtYXBHbHlwaCAgZ2x5cGhfYml0bWFwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAvLyBsb2FkIGdseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgZXJyb3IgPSBGVF9Mb2FkX0NoYXIoIGZhY2UsIGdseXBoX2luZGV4LCBGVF9MT0FEX0RFRkFVVCApOyAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAvLyBleHRyYWN0IGdseXBoIGltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgZXJyb3IgPSBGVF9HZXRfR2x5cGgoIGZhY2UtPmdseXBoLCAmZ2x5cGggKTsgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAvLyBjb252ZXJ0IHRvIGEgYml0bWFwIChkZWZhdWx0IHJlbmRlciBtb2RlICsgZGVzdHJveWluZyBvbGQpICAqLworICAvKiAgICAgICAgaWYgKCBnbHlwaC0+Zm9ybWF0ICE9IEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAgKSAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgIGVycm9yID0gRlRfR2x5cGhfVG9fQml0bWFwKCAmZ2x5cGgsIEZUX1JFTkRFUl9NT0RFX05PUk1BTCwgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgaWYgKCBlcnJvciApIC8vIGBnbHlwaCcgdW5jaGFuZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAvLyBhY2Nlc3MgYml0bWFwIGNvbnRlbnQgYnkgdHlwZWNhc3RpbmcgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgZ2x5cGhfYml0bWFwID0gKEZUX0JpdG1hcEdseXBoKWdseXBoOyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAvLyBkbyBmdW5ueSBzdHVmZiB3aXRoIGl0LCBsaWtlIGJsaXR0aW5nL2RyYXdpbmcgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAvLyBkaXNjYXJkIGdseXBoIGltYWdlIChiaXRtYXAgb3Igbm90KSAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgRlRfRG9uZV9HbHlwaCggZ2x5cGggKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSGVyZSBhbm90aGVyIGV4YW1wbGUsIGFnYWluIHdpdGhvdXQgZXJyb3IgaGFuZGxpbmc6ICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICBGVF9HbHlwaCAgZ2x5cGhzW01BWF9HTFlQSFNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIGZvciAoIGlkeCA9IDA7IGkgPCBNQVhfR0xZUEhTOyBpKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgIGVycm9yID0gRlRfTG9hZF9HbHlwaCggZmFjZSwgaWR4LCBGVF9MT0FEX0RFRkFVTFQgKSB8fCAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIEZUX0dldF9HbHlwaCAoIGZhY2UtPmdseXBoLCAmZ2x5cGhbaWR4XSApOyAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIGZvciAoIGlkeCA9IDA7IGkgPCBNQVhfR0xZUEhTOyBpKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICBGVF9HbHlwaCAgYml0bWFwID0gZ2x5cGhzW2lkeF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgIC8vIGFmdGVyIHRoaXMgY2FsbCwgYGJpdG1hcCcgbm8gbG9uZ2VyIHBvaW50cyBpbnRvICAgICAgICAgICAqLworICAvKiAgICAgICAgICAvLyB0aGUgYGdseXBocycgYXJyYXkgKGFuZCB0aGUgb2xkIHZhbHVlIGlzbid0IGRlc3Ryb3llZCkgICAgKi8KKyAgLyogICAgICAgICAgRlRfR2x5cGhfVG9fQml0bWFwKCAmYml0bWFwLCBGVF9SRU5ERVJfTU9ERV9NT05PLCAwLCAwICk7ICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgIEZUX0RvbmVfR2x5cGgoIGJpdG1hcCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgIGZvciAoIGlkeCA9IDA7IGkgPCBNQVhfR0xZUEhTOyBpKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgIEZUX0RvbmVfR2x5cGgoIGdseXBoc1tpZHhdICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9HbHlwaF9Ub19CaXRtYXAoIEZUX0dseXBoKiAgICAgICB0aGVfZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgIHJlbmRlcl9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogICAgICBvcmlnaW4sCisgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgIGRlc3Ryb3kgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0RvbmVfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERlc3Ryb3kgYSBnaXZlbiBnbHlwaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdseXBoIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZ2x5cGggb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCB2b2lkICkKKyAgRlRfRG9uZV9HbHlwaCggRlRfR2x5cGggIGdseXBoICk7CisKKyAgLyogKi8KKworCisgIC8qIG90aGVyIGhlbHBmdWwgZnVuY3Rpb25zICovCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY29tcHV0YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX01hdHJpeF9NdWx0aXBseSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBlcmZvcm0gdGhlIG1hdHJpeCBvcGVyYXRpb24gYGIgPSBhKmInLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGEgOjogQSBwb2ludGVyIHRvIG1hdHJpeCBgYScuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGIgOjogQSBwb2ludGVyIHRvIG1hdHJpeCBgYicuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSByZXN1bHQgaXMgdW5kZWZpbmVkIGlmIGVpdGhlciBgYScgb3IgYGInIGlzIHplcm8uICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCB2b2lkICkKKyAgRlRfTWF0cml4X011bHRpcGx5KCBjb25zdCBGVF9NYXRyaXgqICBhLAorICAgICAgICAgICAgICAgICAgICAgIEZUX01hdHJpeCogICAgICAgIGIgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX01hdHJpeF9JbnZlcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEludmVydCBhIDJ4MiBtYXRyaXguICBSZXR1cm4gYW4gZXJyb3IgaWYgaXQgY2FuJ3QgYmUgaW52ZXJ0ZWQuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1hdHJpeCA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBtYXRyaXguICBSZW1haW5zIHVudG91Y2hlZCBpbiAgICAqLworICAvKiAgICAgICAgICAgICAgY2FzZSBvZiBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9NYXRyaXhfSW52ZXJ0KCBGVF9NYXRyaXgqICBtYXRyaXggKTsKKworICAvKiAqLworCisKK0ZUX0VORF9IRUFERVIKKworI2VuZGlmIC8qIF9fRlRHTFlQSF9IX18gKi8KKworCisvKiBFTkQgKi8KKworCisvKiBMb2NhbCBWYXJpYWJsZXM6ICovCisvKiBjb2Rpbmc6IHV0Zi04ICAgICovCisvKiBFbmQ6ICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z3h2YWwuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRneHZhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlOWFjMWQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z3h2YWwuaApAQCAtMCwwICsxLDM1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRneHZhbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWVUeXBlIEFQSSBmb3IgdmFsaWRhdGluZyBUcnVlVHlwZUdYL0FBVCB0YWJsZXMgKHNwZWNpZmljYXRpb24pLiAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDA0LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNYXNhdGFrZSBZQU1BVE8sIFJlZGhhdCBLLkssICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KKy8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCisvKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0ZUR1hWQUxfSF9fCisjZGVmaW5lIF9fRlRHWFZBTF9IX18KKworI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CisjaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisKKyNpZmRlZiBGUkVFVFlQRV9ICisjZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgorI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCisjZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKKyNlbmRpZgorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ3hfdmFsaWRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGVHWC9BQVQgVmFsaWRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQW4gQVBJIHRvIHZhbGlkYXRlIFRydWVUeXBlR1gvQUFUIHRhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBmdW5jdGlvbnMgdG8gdmFsaWRhdGUgICAgICovCisgIC8qICAgIHNvbWUgVHJ1ZVR5cGVHWCB0YWJsZXMgKGZlYXQsIG1vcnQsIG1vcngsIGJzbG4sIGp1c3QsIGtlcm4sIG9wYmQsICAqLworICAvKiAgICB0cmFrLCBwcm9wLCBsY2FyKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPcmRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9UcnVlVHlwZUdYX1ZhbGlkYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfVHJ1ZVR5cGVHWF9GcmVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9DbGFzc2ljS2Vybl9WYWxpZGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfQ2xhc3NpY0tlcm5fRnJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9WQUxJREFURV9HWF9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfVkFMSURBVEVfR1hYWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1ZBTElEQVRFX0NLRVJOWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogV2FybmluZzogVXNlIEZUX1ZBTElEQVRFX1hYWCB0byB2YWxpZGF0ZSBhIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgIEZvbGxvd2luZyBkZWZpbml0aW9ucyBhcmUgZm9yIGd4dmFsaWQgZGV2ZWxvcGVycy4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEZUX1ZBTElEQVRFX2ZlYXRfSU5ERVggICAgIDAKKyNkZWZpbmUgRlRfVkFMSURBVEVfbW9ydF9JTkRFWCAgICAgMQorI2RlZmluZSBGVF9WQUxJREFURV9tb3J4X0lOREVYICAgICAyCisjZGVmaW5lIEZUX1ZBTElEQVRFX2JzbG5fSU5ERVggICAgIDMKKyNkZWZpbmUgRlRfVkFMSURBVEVfanVzdF9JTkRFWCAgICAgNAorI2RlZmluZSBGVF9WQUxJREFURV9rZXJuX0lOREVYICAgICA1CisjZGVmaW5lIEZUX1ZBTElEQVRFX29wYmRfSU5ERVggICAgIDYKKyNkZWZpbmUgRlRfVkFMSURBVEVfdHJha19JTkRFWCAgICAgNworI2RlZmluZSBGVF9WQUxJREFURV9wcm9wX0lOREVYICAgICA4CisjZGVmaW5lIEZUX1ZBTElEQVRFX2xjYXJfSU5ERVggICAgIDkKKyNkZWZpbmUgRlRfVkFMSURBVEVfR1hfTEFTVF9JTkRFWCAgRlRfVkFMSURBVEVfbGNhcl9JTkRFWAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX1ZBTElEQVRFX0dYX0xFTkdUSAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVGhlIG51bWJlciBvZiB0YWJsZXMgY2hlY2tlZCBpbiB0aGlzIG1vZHVsZS4gIFVzZSBpdCBhcyBhIHBhcmFtZXRlcgorICAgKiAgIGZvciB0aGUgYHRhYmxlLWxlbmd0aCcgYXJndW1lbnQgb2YgZnVuY3Rpb24gQEZUX1RydWVUeXBlR1hfVmFsaWRhdGUuCisgICAqLworI2RlZmluZSBGVF9WQUxJREFURV9HWF9MRU5HVEggICAgIChGVF9WQUxJREFURV9HWF9MQVNUX0lOREVYICsgMSkKKworICAvKiAqLworCisgIC8qIFVwIHRvIDB4MTAwMCBpcyB1c2VkIGJ5IG90dmFsaWQuCisgICAgIE94Mnh4eCBpcyByZXNlcnZlZCBmb3IgZmVhdHVyZSBPVCBleHRlbnNpb24uICovCisjZGVmaW5lIEZUX1ZBTElEQVRFX0dYX1NUQVJUIDB4NDAwMAorI2RlZmluZSBGVF9WQUxJREFURV9HWF9CSVRGSUVMRCggdGFnICkgICAgICAgICAgICAgICAgICBcCisgICggRlRfVkFMSURBVEVfR1hfU1RBUlQgPDwgRlRfVkFMSURBVEVfIyN0YWcjI19JTkRFWCApCisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiBAZW51bToKKyAgKiAgICBGVF9WQUxJREFURV9HWFhYWAorICAqCisgICogQGRlc2NyaXB0aW9uOgorICAqICAgIEEgbGlzdCBvZiBiaXQtZmllbGQgY29uc3RhbnRzIHVzZWQgd2l0aCBARlRfVHJ1ZVR5cGVHWF9WYWxpZGF0ZSB0bworICAqICAgIGluZGljYXRlIHdoaWNoIFRydWVUeXBlR1gvQUFUIFR5cGUgdGFibGVzIHNob3VsZCBiZSB2YWxpZGF0ZWQuCisgICoKKyAgKiBAdmFsdWVzOgorICAqICAgIEZUX1ZBTElEQVRFX2ZlYXQgOjoKKyAgKiAgICAgIFZhbGlkYXRlIGBmZWF0JyB0YWJsZS4KKyAgKgorICAqICAgIEZUX1ZBTElEQVRFX21vcnQgOjoKKyAgKiAgICAgIFZhbGlkYXRlIGBtb3J0JyB0YWJsZS4KKyAgKgorICAqICAgIEZUX1ZBTElEQVRFX21vcnggOjoKKyAgKiAgICAgIFZhbGlkYXRlIGBtb3J4JyB0YWJsZS4KKyAgKgorICAqICAgIEZUX1ZBTElEQVRFX2JzbG4gOjoKKyAgKiAgICAgIFZhbGlkYXRlIGBic2xuJyB0YWJsZS4KKyAgKgorICAqICAgIEZUX1ZBTElEQVRFX2p1c3QgOjoKKyAgKiAgICAgIFZhbGlkYXRlIGBqdXN0JyB0YWJsZS4KKyAgKgorICAqICAgIEZUX1ZBTElEQVRFX2tlcm4gOjoKKyAgKiAgICAgIFZhbGlkYXRlIGBrZXJuJyB0YWJsZS4KKyAgKgorICAqICAgIEZUX1ZBTElEQVRFX29wYmQgOjoKKyAgKiAgICAgIFZhbGlkYXRlIGBvcGJkJyB0YWJsZS4KKyAgKgorICAqICAgIEZUX1ZBTElEQVRFX3RyYWsgOjoKKyAgKiAgICAgIFZhbGlkYXRlIGB0cmFrJyB0YWJsZS4KKyAgKgorICAqICAgIEZUX1ZBTElEQVRFX3Byb3AgOjoKKyAgKiAgICAgIFZhbGlkYXRlIGBwcm9wJyB0YWJsZS4KKyAgKgorICAqICAgIEZUX1ZBTElEQVRFX2xjYXIgOjoKKyAgKiAgICAgIFZhbGlkYXRlIGBsY2FyJyB0YWJsZS4KKyAgKgorICAqICAgIEZUX1ZBTElEQVRFX0dYIDo6CisgICogICAgICBWYWxpZGF0ZSBhbGwgVHJ1ZVR5cGVHWCB0YWJsZXMgKGZlYXQsIG1vcnQsIG1vcngsIGJzbG4sIGp1c3QsIGtlcm4sCisgICogICAgICBvcGJkLCB0cmFrLCBwcm9wIGFuZCBsY2FyKS4KKyAgKgorICAqLworCisjZGVmaW5lIEZUX1ZBTElEQVRFX2ZlYXQgIEZUX1ZBTElEQVRFX0dYX0JJVEZJRUxEKCBmZWF0ICkKKyNkZWZpbmUgRlRfVkFMSURBVEVfbW9ydCAgRlRfVkFMSURBVEVfR1hfQklURklFTEQoIG1vcnQgKQorI2RlZmluZSBGVF9WQUxJREFURV9tb3J4ICBGVF9WQUxJREFURV9HWF9CSVRGSUVMRCggbW9yeCApCisjZGVmaW5lIEZUX1ZBTElEQVRFX2JzbG4gIEZUX1ZBTElEQVRFX0dYX0JJVEZJRUxEKCBic2xuICkKKyNkZWZpbmUgRlRfVkFMSURBVEVfanVzdCAgRlRfVkFMSURBVEVfR1hfQklURklFTEQoIGp1c3QgKQorI2RlZmluZSBGVF9WQUxJREFURV9rZXJuICBGVF9WQUxJREFURV9HWF9CSVRGSUVMRCgga2VybiApCisjZGVmaW5lIEZUX1ZBTElEQVRFX29wYmQgIEZUX1ZBTElEQVRFX0dYX0JJVEZJRUxEKCBvcGJkICkKKyNkZWZpbmUgRlRfVkFMSURBVEVfdHJhayAgRlRfVkFMSURBVEVfR1hfQklURklFTEQoIHRyYWsgKQorI2RlZmluZSBGVF9WQUxJREFURV9wcm9wICBGVF9WQUxJREFURV9HWF9CSVRGSUVMRCggcHJvcCApCisjZGVmaW5lIEZUX1ZBTElEQVRFX2xjYXIgIEZUX1ZBTElEQVRFX0dYX0JJVEZJRUxEKCBsY2FyICkKKworI2RlZmluZSBGVF9WQUxJREFURV9HWCAgKCBGVF9WQUxJREFURV9mZWF0IHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9tb3J0IHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9tb3J4IHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9ic2xuIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9qdXN0IHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9rZXJuIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9vcGJkIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV90cmFrIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9wcm9wIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9sY2FyICkKKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIEBmdW5jdGlvbjoKKyAgKiAgICBGVF9UcnVlVHlwZUdYX1ZhbGlkYXRlCisgICoKKyAgKiBAZGVzY3JpcHRpb246CisgICogICAgVmFsaWRhdGUgdmFyaW91cyBUcnVlVHlwZUdYIHRhYmxlcyB0byBhc3N1cmUgdGhhdCBhbGwgb2Zmc2V0cyBhbmQKKyAgKiAgICBpbmRpY2VzIGFyZSB2YWxpZC4gIFRoZSBpZGVhIGlzIHRoYXQgYSBoaWdoZXItbGV2ZWwgbGlicmFyeSB0aGF0CisgICogICAgYWN0dWFsbHkgZG9lcyB0aGUgdGV4dCBsYXlvdXQgY2FuIGFjY2VzcyB0aG9zZSB0YWJsZXMgd2l0aG91dAorICAqICAgIGVycm9yIGNoZWNraW5nICh3aGljaCBjYW4gYmUgcXVpdGUgdGltZSBjb25zdW1pbmcpLgorICAqCisgICogQGlucHV0OgorICAqICAgIGZhY2UgOjoKKyAgKiAgICAgICBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KKyAgKgorICAqICAgIHZhbGlkYXRpb25fZmxhZ3MgOjoKKyAgKiAgICAgICBBIGJpdCBmaWVsZCB0aGF0IHNwZWNpZmllcyB0aGUgdGFibGVzIHRvIGJlIHZhbGlkYXRlZC4gIFNlZQorICAqICAgICAgIEBGVF9WQUxJREFURV9HWFhYWCBmb3IgcG9zc2libGUgdmFsdWVzLgorICAqCisgICogICAgdGFibGVfbGVuZ3RoIDo6CisgICogICAgICAgVGhlIHNpemUgb2YgdGhlIGB0YWJsZXMnIGFycmF5LiAgTm9ybWFsbHksIEBGVF9WQUxJREFURV9HWF9MRU5HVEgKKyAgKiAgICAgICBzaG91bGQgYmUgcGFzc2VkLgorICAqCisgICogQG91dHB1dDoKKyAgKiAgICB0YWJsZXMgOjoKKyAgKiAgICAgICBUaGUgYXJyYXkgd2hlcmUgYWxsIHZhbGlkYXRlZCBzZm50IHRhYmxlcyBhcmUgc3RvcmVkLgorICAqICAgICAgIFRoZSBhcnJheSBpdHNlbGYgbXVzdCBiZSBhbGxvY2F0ZWQgYnkgYSBjbGllbnQuCisgICoKKyAgKiBAcmV0dXJuOgorICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgKgorICAqIEBub3RlOgorICAqICAgVGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIHdpdGggVHJ1ZVR5cGVHWCBmb250cywgcmV0dXJuaW5nIGFuIGVycm9yCisgICogICBvdGhlcndpc2UuCisgICoKKyAgKiAgIEFmdGVyIHVzZSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBkZWFsbG9jYXRlIHRoZSBidWZmZXJzIHBvaW50ZWQgdG8gYnkKKyAgKiAgIGVhY2ggYHRhYmxlcycgZWxlbWVudCwgYnkgY2FsbGluZyBARlRfVHJ1ZVR5cGVHWF9GcmVlLiAgQSBOVUxMIHZhbHVlCisgICogICBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFibGUgZWl0aGVyIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIGZvbnQsIHRoZQorICAqICAgYXBwbGljYXRpb24gaGFzbid0IGFza2VkIGZvciB2YWxpZGF0aW9uLCBvciB0aGUgdmFsaWRhdG9yIGRvZXNuJ3QgaGF2ZQorICAqICAgdGhlIGFiaWxpdHkgdG8gdmFsaWRhdGUgdGhlIHNmbnQgdGFibGUuCisgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9UcnVlVHlwZUdYX1ZhbGlkYXRlKCBGVF9GYWNlICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIHZhbGlkYXRpb25fZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICB0YWJsZXNbRlRfVkFMSURBVEVfR1hfTEVOR1RIXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIHRhYmxlX2xlbmd0aCApOworCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCisgICogQGZ1bmN0aW9uOgorICAqICAgIEZUX1RydWVUeXBlR1hfRnJlZQorICAqCisgICogQGRlc2NyaXB0aW9uOgorICAqICAgIEZyZWUgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgVHJ1ZVR5cGVHWCB2YWxpZGF0b3IuCisgICoKKyAgKiBAaW5wdXQ6CisgICogICAgZmFjZSA6OgorICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgorICAqCisgICogICAgdGFibGUgOjoKKyAgKiAgICAgICBUaGUgcG9pbnRlciB0byB0aGUgYnVmZmVyIGFsbG9jYXRlZCBieQorICAqICAgICAgIEBGVF9UcnVlVHlwZUdYX1ZhbGlkYXRlLgorICAqCisgICogQG5vdGU6CisgICogICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCB0byBmcmVlIHRoZSBidWZmZXIgYWxsb2NhdGVkIGJ5CisgICogICBARlRfVHJ1ZVR5cGVHWF9WYWxpZGF0ZSBvbmx5LgorICAqLworICBGVF9FWFBPUlQoIHZvaWQgKQorICBGVF9UcnVlVHlwZUdYX0ZyZWUoIEZUX0ZhY2UgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICB0YWJsZSApOworCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCisgICogQGVudW06CisgICogICAgRlRfVkFMSURBVEVfQ0tFUk5YWFgKKyAgKgorICAqIEBkZXNjcmlwdGlvbjoKKyAgKiAgICBBIGxpc3Qgb2YgYml0LWZpZWxkIGNvbnN0YW50cyB1c2VkIHdpdGggQEZUX0NsYXNzaWNLZXJuX1ZhbGlkYXRlCisgICogICAgdG8gaW5kaWNhdGUgdGhlIGNsYXNzaWMga2VybiBkaWFsZWN0IG9yIGRpYWxlY3RzLiAgSWYgdGhlIHNlbGVjdGVkCisgICogICAgdHlwZSBkb2Vzbid0IGZpdCwgQEZUX0NsYXNzaWNLZXJuX1ZhbGlkYXRlIHJlZ2FyZHMgdGhlIHRhYmxlIGFzCisgICogICAgaW52YWxpZC4KKyAgKgorICAqIEB2YWx1ZXM6CisgICogICAgRlRfVkFMSURBVEVfTVMgOjoKKyAgKiAgICAgIEhhbmRsZSB0aGUgYGtlcm4nIHRhYmxlIGFzIGEgY2xhc3NpYyBNaWNyb3NvZnQga2VybiB0YWJsZS4KKyAgKgorICAqICAgIEZUX1ZBTElEQVRFX0FQUExFIDo6CisgICogICAgICBIYW5kbGUgdGhlIGBrZXJuJyB0YWJsZSBhcyBhIGNsYXNzaWMgQXBwbGUga2VybiB0YWJsZS4KKyAgKgorICAqICAgIEZUX1ZBTElEQVRFX0NLRVJOIDo6CisgICogICAgICBIYW5kbGUgdGhlIGBrZXJuJyBhcyBlaXRoZXIgY2xhc3NpYyBBcHBsZSBvciBNaWNyb3NvZnQga2VybiB0YWJsZS4KKyAgKi8KKyNkZWZpbmUgRlRfVkFMSURBVEVfTVMgICAgICggRlRfVkFMSURBVEVfR1hfU1RBUlQgPDwgMCApCisjZGVmaW5lIEZUX1ZBTElEQVRFX0FQUExFICAoIEZUX1ZBTElEQVRFX0dYX1NUQVJUIDw8IDEgKQorCisjZGVmaW5lIEZUX1ZBTElEQVRFX0NLRVJOICAoIEZUX1ZBTElEQVRFX01TIHwgRlRfVkFMSURBVEVfQVBQTEUgKQorCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCisgICogQGZ1bmN0aW9uOgorICAqICAgIEZUX0NsYXNzaWNLZXJuX1ZhbGlkYXRlCisgICoKKyAgKiBAZGVzY3JpcHRpb246CisgICogICAgVmFsaWRhdGUgY2xhc3NpYyAoMTYtYml0IGZvcm1hdCkga2VybiB0YWJsZSB0byBhc3N1cmUgdGhhdCB0aGUgb2Zmc2V0cworICAqICAgIGFuZCBpbmRpY2VzIGFyZSB2YWxpZC4gIFRoZSBpZGVhIGlzIHRoYXQgYSBoaWdoZXItbGV2ZWwgbGlicmFyeSB0aGF0CisgICogICAgYWN0dWFsbHkgZG9lcyB0aGUgdGV4dCBsYXlvdXQgY2FuIGFjY2VzcyB0aG9zZSB0YWJsZXMgd2l0aG91dCBlcnJvcgorICAqICAgIGNoZWNraW5nICh3aGljaCBjYW4gYmUgcXVpdGUgdGltZSBjb25zdW1pbmcpLgorICAqCisgICogICAgVGhlIGBrZXJuJyB0YWJsZSB2YWxpZGF0b3IgaW4gQEZUX1RydWVUeXBlR1hfVmFsaWRhdGUgZGVhbHMgd2l0aCBib3RoCisgICogICAgdGhlIG5ldyAzMi1iaXQgZm9ybWF0IGFuZCB0aGUgY2xhc3NpYyAxNi1iaXQgZm9ybWF0LCB3aGlsZQorICAqICAgIEZUX0NsYXNzaWNLZXJuX1ZhbGlkYXRlIG9ubHkgc3VwcG9ydHMgdGhlIGNsYXNzaWMgMTYtYml0IGZvcm1hdC4KKyAgKgorICAqIEBpbnB1dDoKKyAgKiAgICBmYWNlIDo6CisgICogICAgICAgQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCisgICoKKyAgKiAgICB2YWxpZGF0aW9uX2ZsYWdzIDo6CisgICogICAgICAgQSBiaXQgZmllbGQgdGhhdCBzcGVjaWZpZXMgdGhlIGRpYWxlY3QgdG8gYmUgdmFsaWRhdGVkLiAgU2VlCisgICogICAgICAgQEZUX1ZBTElEQVRFX0NLRVJOWFhYIGZvciBwb3NzaWJsZSB2YWx1ZXMuCisgICoKKyAgKiBAb3V0cHV0OgorICAqICAgIGNrZXJuX3RhYmxlIDo6CisgICogICAgICAgQSBwb2ludGVyIHRvIHRoZSBrZXJuIHRhYmxlLgorICAqCisgICogQHJldHVybjoKKyAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICoKKyAgKiBAbm90ZToKKyAgKiAgIEFmdGVyIHVzZSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBkZWFsbG9jYXRlIHRoZSBidWZmZXJzIHBvaW50ZWQgdG8gYnkKKyAgKiAgIGBja2Vybl90YWJsZScsIGJ5IGNhbGxpbmcgQEZUX0NsYXNzaWNLZXJuX0ZyZWUuICBBIE5VTEwgdmFsdWUKKyAgKiAgIGluZGljYXRlcyB0aGF0IHRoZSB0YWJsZSBkb2Vzbid0IGV4aXN0IGluIHRoZSBmb250LgorICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfQ2xhc3NpY0tlcm5fVmFsaWRhdGUoIEZUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgdmFsaWRhdGlvbl9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqY2tlcm5fdGFibGUgKTsKKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIEBmdW5jdGlvbjoKKyAgKiAgICBGVF9DbGFzc2ljS2Vybl9GcmVlCisgICoKKyAgKiBAZGVzY3JpcHRpb246CisgICogICAgRnJlZSB0aGUgYnVmZmVyIGFsbG9jYXRlZCBieSBjbGFzc2ljIEtlcm4gdmFsaWRhdG9yLgorICAqCisgICogQGlucHV0OgorICAqICAgIGZhY2UgOjoKKyAgKiAgICAgICBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KKyAgKgorICAqICAgIHRhYmxlIDo6CisgICogICAgICAgVGhlIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0aGF0IGlzIGFsbG9jYXRlZCBieQorICAqICAgICAgIEBGVF9DbGFzc2ljS2Vybl9WYWxpZGF0ZS4KKyAgKgorICAqIEBub3RlOgorICAqICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgdG8gZnJlZSB0aGUgYnVmZmVyIGFsbG9jYXRlZCBieQorICAqICAgQEZUX0NsYXNzaWNLZXJuX1ZhbGlkYXRlIG9ubHkuCisgICovCisgIEZUX0VYUE9SVCggdm9pZCApCisgIEZUX0NsYXNzaWNLZXJuX0ZyZWUoIEZUX0ZhY2UgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgdGFibGUgKTsKKworICAvKiAqLworCisKK0ZUX0VORF9IRUFERVIKKworI2VuZGlmIC8qIF9fRlRHWFZBTF9IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRnemlwLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z3ppcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYTUzMmQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z3ppcC5oCkBAIC0wLDAgKzEsMTQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBmdGd6aXAuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgR3ppcC1jb21wcmVzc2VkIHN0cmVhbSBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDItMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX19GVEdaSVBfSF9fCisjZGVmaW5lIF9fRlRHWklQX0hfXworCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKworI2lmZGVmIEZSRUVUWVBFX0gKKyNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCisjZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKKyNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgorI2VuZGlmCisKKworRlRfQkVHSU5fSEVBREVSCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ3ppcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgR1pJUCBTdHJlYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVXNpbmcgZ3ppcC1jb21wcmVzc2VkIGZvbnQgZmlsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBHemlwLXNwZWNpZmljIGZ1bmN0aW9ucy4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCisgICogQGZ1bmN0aW9uOgorICAqICAgRlRfU3RyZWFtX09wZW5HemlwCisgICoKKyAgKiBAZGVzY3JpcHRpb246CisgICogICBPcGVuIGEgbmV3IHN0cmVhbSB0byBwYXJzZSBnemlwLWNvbXByZXNzZWQgZm9udCBmaWxlcy4gIFRoaXMgaXMKKyAgKiAgIG1haW5seSB1c2VkIHRvIHN1cHBvcnQgdGhlIGNvbXByZXNzZWQgYCoucGNmLmd6JyBmb250cyB0aGF0IGNvbWUKKyAgKiAgIHdpdGggWEZyZWU4Ni4KKyAgKgorICAqIEBpbnB1dDoKKyAgKiAgIHN0cmVhbSA6OgorICAqICAgICBUaGUgdGFyZ2V0IGVtYmVkZGluZyBzdHJlYW0uCisgICoKKyAgKiAgIHNvdXJjZSA6OgorICAqICAgICBUaGUgc291cmNlIHN0cmVhbS4KKyAgKgorICAqIEByZXR1cm46CisgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAqCisgICogQG5vdGU6CisgICogICBUaGUgc291cmNlIHN0cmVhbSBtdXN0IGJlIG9wZW5lZCBfYmVmb3JlXyBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgICoKKyAgKiAgIENhbGxpbmcgdGhlIGludGVybmFsIGZ1bmN0aW9uIGBGVF9TdHJlYW1fQ2xvc2UnIG9uIHRoZSBuZXcgc3RyZWFtIHdpbGwKKyAgKiAgICpub3QqIGNhbGwgYEZUX1N0cmVhbV9DbG9zZScgb24gdGhlIHNvdXJjZSBzdHJlYW0uICBOb25lIG9mIHRoZSBzdHJlYW0KKyAgKiAgIG9iamVjdHMgd2lsbCBiZSByZWxlYXNlZCB0byB0aGUgaGVhcC4KKyAgKgorICAqICAgVGhlIHN0cmVhbSBpbXBsZW1lbnRhdGlvbiBpcyB2ZXJ5IGJhc2ljIGFuZCByZXNldHMgdGhlIGRlY29tcHJlc3Npb24KKyAgKiAgIHByb2Nlc3MgZWFjaCB0aW1lIHNlZWtpbmcgYmFja3dhcmRzIGlzIG5lZWRlZCB3aXRoaW4gdGhlIHN0cmVhbS4KKyAgKgorICAqICAgSW4gY2VydGFpbiBidWlsZHMgb2YgdGhlIGxpYnJhcnksIGd6aXAgY29tcHJlc3Npb24gcmVjb2duaXRpb24gaXMKKyAgKiAgIGF1dG9tYXRpY2FsbHkgaGFuZGxlZCB3aGVuIGNhbGxpbmcgQEZUX05ld19GYWNlIG9yIEBGVF9PcGVuX0ZhY2UuCisgICogICBUaGlzIG1lYW5zIHRoYXQgaWYgbm8gZm9udCBkcml2ZXIgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyB0aGUgcmF3CisgICogICBjb21wcmVzc2VkIGZpbGUsIHRoZSBsaWJyYXJ5IHdpbGwgdHJ5IHRvIG9wZW4gYSBnemlwcGVkIHN0cmVhbSBmcm9tCisgICogICBpdCBhbmQgcmUtb3BlbiB0aGUgZmFjZSB3aXRoIGl0LgorICAqCisgICogICBUaGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gYEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmUnIGlmIHlvdXIgYnVpbGQKKyAgKiAgIG9mIEZyZWVUeXBlIHdhcyBub3QgY29tcGlsZWQgd2l0aCB6bGliIHN1cHBvcnQuCisgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9TdHJlYW1fT3Blbkd6aXAoIEZUX1N0cmVhbSAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc291cmNlICk7CisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIEBmdW5jdGlvbjoKKyAgKiAgIEZUX0d6aXBfVW5jb21wcmVzcworICAqCisgICogQGRlc2NyaXB0aW9uOgorICAqICAgRGVjb21wcmVzcyBhIHppcHBlZCBpbnB1dCBidWZmZXIgaW50byBhbiBvdXRwdXQgYnVmZmVyLiAgVGhpcyBmdW5jdGlvbgorICAqICAgaXMgbW9kZWxlZCBhZnRlciB6bGliJ3MgYHVuY29tcHJlc3MnIGZ1bmN0aW9uLgorICAqCisgICogQGlucHV0OgorICAqICAgbWVtb3J5IDo6CisgICogICAgIEEgRnJlZVR5cGUgbWVtb3J5IGhhbmRsZS4KKyAgKgorICAqICAgaW5wdXQgOjoKKyAgKiAgICAgVGhlIGlucHV0IGJ1ZmZlci4KKyAgKgorICAqICAgaW5wdXRfbGVuIDo6CisgICogICAgIFRoZSBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlci4KKyAgKgorICAqIEBvdXRwdXQ6CisgICogICBvdXRwdXQ6OgorICAqICAgICBUaGUgb3V0cHV0IGJ1ZmZlci4KKyAgKgorICAqIEBpbm91dDoKKyAgKiAgIG91dHB1dF9sZW4gOjoKKyAgKiAgICAgQmVmb3JlIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLCB0aGlzIGlzIHRoZSB0aGUgdG90YWwgc2l6ZSBvZiB0aGUKKyAgKiAgICAgb3V0cHV0IGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgZW50aXJlCisgICogICAgIHVuY29tcHJlc3NlZCBkYXRhIChzbyB0aGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbXVzdCBiZQorICAqICAgICBrbm93biBpbiBhZHZhbmNlKS4gIEFmdGVyIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLCBgb3V0cHV0X2xlbicgaXMgdGhlCisgICogICAgIHNpemUgb2YgdGhlIHVzZWQgZGF0YSBpbiBgb3V0cHV0Jy4KKyAgKgorICAqIEByZXR1cm46CisgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAqCisgICogQG5vdGU6CisgICogICBUaGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gYEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmUnIGlmIHlvdXIgYnVpbGQKKyAgKiAgIG9mIEZyZWVUeXBlIHdhcyBub3QgY29tcGlsZWQgd2l0aCB6bGliIHN1cHBvcnQuCisgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9HemlwX1VuY29tcHJlc3MoIEZUX01lbW9yeSAgICAgICBtZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICAgIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgICAgb3V0cHV0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9CeXRlKiAgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgIGlucHV0X2xlbiApOworCisgIC8qICovCisKKworRlRfRU5EX0hFQURFUgorCisjZW5kaWYgLyogX19GVEdaSVBfSF9fICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0aW1hZ2UuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRpbWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZjI4NGMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0aW1hZ2UuaApAQCAtMCwwICsxLDEyMTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0aW1hZ2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGcmVlVHlwZSBnbHlwaCBpbWFnZSBmb3JtYXRzIGFuZCBkZWZhdWx0IHJhc3RlciBpbnRlcmZhY2UgICAgICAgICAgICAqLworLyogICAgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTm90ZTogQSBgcmFzdGVyJyBpcyBzaW1wbHkgYSBzY2FuLWxpbmUgY29udmVydGVyLCB1c2VkIHRvIHJlbmRlciAgICAgICovCisgIC8qICAgICAgIEZUX091dGxpbmVzIGludG8gRlRfQml0bWFwcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0ZUSU1BR0VfSF9fCisjZGVmaW5lIF9fRlRJTUFHRV9IX18KKworCisgIC8qIF9TVEFOREFMT05FXyBpcyBmcm9tIGZ0Z3JheXMuYyAqLworI2lmbmRlZiBfU1RBTkRBTE9ORV8KKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorI2VuZGlmCisKKworRlRfQkVHSU5fSEVBREVSCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBiYXNpY190eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUG9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIHR5cGUgRlRfUG9zIGlzIHVzZWQgdG8gc3RvcmUgdmVjdG9yaWFsIGNvb3JkaW5hdGVzLiAgRGVwZW5kaW5nICovCisgIC8qICAgIG9uIHRoZSBjb250ZXh0LCB0aGVzZSBjYW4gcmVwcmVzZW50IGRpc3RhbmNlcyBpbiBpbnRlZ2VyIGZvbnQgICAgICAqLworICAvKiAgICB1bml0cywgb3IgMTYuMTYsIG9yIDI2LjYgZml4ZWQtcG9pbnQgcGl4ZWwgY29vcmRpbmF0ZXMuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc2lnbmVkIGxvbmcgIEZUX1BvczsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1ZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIGEgMkQgdmVjdG9yOyBjb29yZGluYXRlcyBhcmUgb2YgICAqLworICAvKiAgICB0aGUgRlRfUG9zIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4IDo6IFRoZSBob3Jpem9udGFsIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeSA6OiBUaGUgdmVydGljYWwgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgRlRfVmVjdG9yXworICB7CisgICAgRlRfUG9zICB4OworICAgIEZUX1BvcyAgeTsKKworICB9IEZUX1ZlY3RvcjsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0JCb3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBhbiBvdXRsaW5lJ3MgYm91bmRpbmcgYm94LCBpLmUuLCB0aGUgICAgICAqLworICAvKiAgICBjb29yZGluYXRlcyBvZiBpdHMgZXh0cmVtYSBpbiB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgICAgICAgICAgKi8KKyAgLyogICAgZGlyZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeE1pbiA6OiBUaGUgaG9yaXpvbnRhbCBtaW5pbXVtIChsZWZ0LW1vc3QpLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB5TWluIDo6IFRoZSB2ZXJ0aWNhbCBtaW5pbXVtIChib3R0b20tbW9zdCkuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHhNYXggOjogVGhlIGhvcml6b250YWwgbWF4aW11bSAocmlnaHQtbW9zdCkuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeU1heCA6OiBUaGUgdmVydGljYWwgbWF4aW11bSAodG9wLW1vc3QpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGJvdW5kaW5nIGJveCBpcyBzcGVjaWZpZWQgd2l0aCB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGxvd2VyICAgICovCisgIC8qICAgIGxlZnQgYW5kIHRoZSB1cHBlciByaWdodCBjb3JuZXIuICBJbiBQb3N0U2NyaXB0LCB0aG9zZSB2YWx1ZXMgYXJlICAqLworICAvKiAgICBvZnRlbiBjYWxsZWQgKGxseCxsbHkpIGFuZCAodXJ4LHVyeSksIHJlc3BlY3RpdmVseS4gICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIElmIGB5TWluJyBpcyBuZWdhdGl2ZSwgdGhpcyB2YWx1ZSBnaXZlcyB0aGUgZ2x5cGgncyBkZXNjZW5kZXIuICAgICAqLworICAvKiAgICBPdGhlcndpc2UsIHRoZSBnbHlwaCBkb2Vzbid0IGRlc2NlbmQgYmVsb3cgdGhlIGJhc2VsaW5lLiAgICAgICAgICAgKi8KKyAgLyogICAgU2ltaWxhcmx5LCBpZiBgeW1heCcgaXMgcG9zaXRpdmUsIHRoaXMgdmFsdWUgZ2l2ZXMgdGhlIGdseXBoJ3MgICAgICovCisgIC8qICAgIGFzY2VuZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYHhNaW4nIGdpdmVzIHRoZSBob3Jpem9udGFsIGRpc3RhbmNlIGZyb20gdGhlIGdseXBoJ3Mgb3JpZ2luIHRvICAgICovCisgIC8qICAgIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGdseXBoJ3MgYm91bmRpbmcgYm94LiAgSWYgYHhNaW4nIGlzIG5lZ2F0aXZlLCAqLworICAvKiAgICB0aGUgZ2x5cGggZXh0ZW5kcyB0byB0aGUgbGVmdCBvZiB0aGUgb3JpZ2luLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBGVF9CQm94XworICB7CisgICAgRlRfUG9zICB4TWluLCB5TWluOworICAgIEZUX1BvcyAgeE1heCwgeU1heDsKKworICB9IEZUX0JCb3g7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9QaXhlbF9Nb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbiBlbnVtZXJhdGlvbiB0eXBlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGZvcm1hdCBvZiBwaXhlbHMgaW4gYSAgICAgKi8KKyAgLyogICAgZ2l2ZW4gYml0bWFwLiAgTm90ZSB0aGF0IGFkZGl0aW9uYWwgZm9ybWF0cyBtYXkgYmUgYWRkZWQgaW4gdGhlICAgICovCisgIC8qICAgIGZ1dHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1BJWEVMX01PREVfTk9ORSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIFZhbHVlfjAgaXMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1BJWEVMX01PREVfTU9OTyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIEEgbW9ub2Nocm9tZSBiaXRtYXAsIHVzaW5nIDF+Yml0IHBlciBwaXhlbC4gIE5vdGUgdGhhdCBwaXhlbHMgICAgKi8KKyAgLyogICAgICBhcmUgc3RvcmVkIGluIG1vc3Qtc2lnbmlmaWNhbnQgb3JkZXIgKE1TQiksIHdoaWNoIG1lYW5zIHRoYXQgICAgICovCisgIC8qICAgICAgdGhlIGxlZnQtbW9zdCBwaXhlbCBpbiBhIGJ5dGUgaGFzIHZhbHVlIDEyOC4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUElYRUxfTU9ERV9HUkFZIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgQW4gOC1iaXQgYml0bWFwLCBnZW5lcmFsbHkgdXNlZCB0byByZXByZXNlbnQgYW50aS1hbGlhc2VkIGdseXBoICAqLworICAvKiAgICAgIGltYWdlcy4gIEVhY2ggcGl4ZWwgaXMgc3RvcmVkIGluIG9uZSBieXRlLiAgTm90ZSB0aGF0IHRoZSBudW1iZXIgKi8KKyAgLyogICAgICBvZiBgZ3JheScgbGV2ZWxzIGlzIHN0b3JlZCBpbiB0aGUgYG51bV9ncmF5cycgZmllbGQgb2YgdGhlICAgICAgICovCisgIC8qICAgICAgQEZUX0JpdG1hcCBzdHJ1Y3R1cmUgKGl0IGdlbmVyYWxseSBpcyAyNTYpLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUElYRUxfTU9ERV9HUkFZMiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgQSAyLWJpdCBwZXIgcGl4ZWwgYml0bWFwLCB1c2VkIHRvIHJlcHJlc2VudCBlbWJlZGRlZCAgICAgICAgICAgICAqLworICAvKiAgICAgIGFudGktYWxpYXNlZCBiaXRtYXBzIGluIGZvbnQgZmlsZXMgYWNjb3JkaW5nIHRvIHRoZSBPcGVuVHlwZSAgICAgKi8KKyAgLyogICAgICBzcGVjaWZpY2F0aW9uLiAgV2UgaGF2ZW4ndCBmb3VuZCBhIHNpbmdsZSBmb250IHVzaW5nIHRoaXMgICAgICAgICovCisgIC8qICAgICAgZm9ybWF0LCBob3dldmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUElYRUxfTU9ERV9HUkFZNCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgQSA0LWJpdCBwZXIgcGl4ZWwgYml0bWFwLCByZXByZXNlbnRpbmcgZW1iZWRkZWQgYW50aS1hbGlhc2VkICAgICAqLworICAvKiAgICAgIGJpdG1hcHMgaW4gZm9udCBmaWxlcyBhY2NvcmRpbmcgdG8gdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24uICAgKi8KKyAgLyogICAgICBXZSBoYXZlbid0IGZvdW5kIGEgc2luZ2xlIGZvbnQgdXNpbmcgdGhpcyBmb3JtYXQsIGhvd2V2ZXIuICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9QSVhFTF9NT0RFX0xDRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBBbiA4LWJpdCBiaXRtYXAsIHJlcHJlc2VudGluZyBSR0Igb3IgQkdSIGRlY2ltYXRlZCBnbHlwaCBpbWFnZXMgICovCisgIC8qICAgICAgdXNlZCBmb3IgZGlzcGxheSBvbiBMQ0QgZGlzcGxheXM7IHRoZSBiaXRtYXAgaXMgdGhyZWUgdGltZXMgICAgICAqLworICAvKiAgICAgIHdpZGVyIHRoYW4gdGhlIG9yaWdpbmFsIGdseXBoIGltYWdlLiAgU2VlIGFsc28gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBARlRfUkVOREVSX01PREVfTENELiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9QSVhFTF9NT0RFX0xDRF9WIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBBbiA4LWJpdCBiaXRtYXAsIHJlcHJlc2VudGluZyBSR0Igb3IgQkdSIGRlY2ltYXRlZCBnbHlwaCBpbWFnZXMgICovCisgIC8qICAgICAgdXNlZCBmb3IgZGlzcGxheSBvbiByb3RhdGVkIExDRCBkaXNwbGF5czsgdGhlIGJpdG1hcCBpcyB0aHJlZSAgICAqLworICAvKiAgICAgIHRpbWVzIHRhbGxlciB0aGFuIHRoZSBvcmlnaW5hbCBnbHlwaCBpbWFnZS4gIFNlZSBhbHNvICAgICAgICAgICAgKi8KKyAgLyogICAgICBARlRfUkVOREVSX01PREVfTENEX1YuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9QSVhFTF9NT0RFX0JHUkEgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBBbiBpbWFnZSB3aXRoIGZvdXIgOC1iaXQgY2hhbm5lbHMgcGVyIHBpeGVsLCByZXByZXNlbnRpbmcgYSAgICAgICovCisgIC8qICAgICAgY29sb3IgaW1hZ2UgKHN1Y2ggYXMgZW1vdGljb25zKSB3aXRoIGFscGhhIGNoYW5uZWwuICBGb3IgZWFjaCAgICAqLworICAvKiAgICAgIHBpeGVsLCB0aGUgZm9ybWF0IGlzIEJHUkEsIHdoaWNoIG1lYW5zLCB0aGUgYmx1ZSBjaGFubmVsIGNvbWVzICAgKi8KKyAgLyogICAgICBmaXJzdCBpbiBtZW1vcnkuICBUaGUgY29sb3IgY2hhbm5lbHMgYXJlIHByZS1tdWx0aXBsaWVkIGFuZCBpbiAgICovCisgIC8qICAgICAgdGhlIHNSR0IgY29sb3JzcGFjZS4gIEZvciBleGFtcGxlLCBmdWxsIHJlZCBhdCBoYWxmLXRyYW5zbHVjZW50ICAqLworICAvKiAgICAgIG9wYWNpdHkgd2lsbCBiZSByZXByZXNlbnRlZCBhcyBgMDAsMDAsODAsODAnLCBub3QgYDAwLDAwLEZGLDgwJy4gKi8KKyAgLyogICAgICBTZWUgYWxzbyBARlRfTE9BRF9DT0xPUi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIGVudW0gIEZUX1BpeGVsX01vZGVfCisgIHsKKyAgICBGVF9QSVhFTF9NT0RFX05PTkUgPSAwLAorICAgIEZUX1BJWEVMX01PREVfTU9OTywKKyAgICBGVF9QSVhFTF9NT0RFX0dSQVksCisgICAgRlRfUElYRUxfTU9ERV9HUkFZMiwKKyAgICBGVF9QSVhFTF9NT0RFX0dSQVk0LAorICAgIEZUX1BJWEVMX01PREVfTENELAorICAgIEZUX1BJWEVMX01PREVfTENEX1YsCisgICAgRlRfUElYRUxfTU9ERV9CR1JBLAorCisgICAgRlRfUElYRUxfTU9ERV9NQVggICAgICAvKiBkbyBub3QgcmVtb3ZlICovCisKKyAgfSBGVF9QaXhlbF9Nb2RlOworCisKKyAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgYEZUX1BpeGVsX01vZGUnICovCisgIC8qIHZhbHVlcyBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBmdF9waXhlbF9tb2RlX25vbmUgICBGVF9QSVhFTF9NT0RFX05PTkUKKyNkZWZpbmUgZnRfcGl4ZWxfbW9kZV9tb25vICAgRlRfUElYRUxfTU9ERV9NT05PCisjZGVmaW5lIGZ0X3BpeGVsX21vZGVfZ3JheXMgIEZUX1BJWEVMX01PREVfR1JBWQorI2RlZmluZSBmdF9waXhlbF9tb2RlX3BhbDIgICBGVF9QSVhFTF9NT0RFX0dSQVkyCisjZGVmaW5lIGZ0X3BpeGVsX21vZGVfcGFsNCAgIEZUX1BJWEVMX01PREVfR1JBWTQKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0JpdG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgYSBiaXRtYXAgb3IgcGl4bWFwIHRvIHRoZSByYXN0ZXIuICAgICAqLworICAvKiAgICBOb3RlIHRoYXQgd2Ugbm93IG1hbmFnZSBwaXhtYXBzIG9mIHZhcmlvdXMgZGVwdGhzIHRocm91Z2ggdGhlICAgICAgKi8KKyAgLyogICAgYHBpeGVsX21vZGUnIGZpZWxkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcm93cyAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgYml0bWFwIHJvd3MuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB3aWR0aCAgICAgICAgOjogVGhlIG51bWJlciBvZiBwaXhlbHMgaW4gYml0bWFwIHJvdy4gICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBpdGNoICAgICAgICA6OiBUaGUgcGl0Y2gncyBhYnNvbHV0ZSB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgdGFrZW4gYnkgb25lIGJpdG1hcCByb3csIGluY2x1ZGluZyBwYWRkaW5nLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIEhvd2V2ZXIsIHRoZSBwaXRjaCBpcyBwb3NpdGl2ZSB3aGVuIHRoZSBiaXRtYXAgaGFzICovCisgIC8qICAgICAgICAgICAgICAgICAgICBhIGBkb3duJyBmbG93LCBhbmQgbmVnYXRpdmUgd2hlbiBpdCBoYXMgYW4gYHVwJyAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgZmxvdy4gIEluIGFsbCBjYXNlcywgdGhlIHBpdGNoIGlzIGFuIG9mZnNldCB0byBhZGQgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIHRvIGEgYml0bWFwIHBvaW50ZXIgaW4gb3JkZXIgdG8gZ28gZG93biBvbmUgcm93LiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGBwYWRkaW5nJyBtZWFucyB0aGUgYWxpZ25tZW50IG9mIGEgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIGJpdG1hcCB0byBhIGJ5dGUgYm9yZGVyLCBhbmQgRnJlZVR5cGUgZnVuY3Rpb25zICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICBub3JtYWxseSBhbGlnbiB0byB0aGUgc21hbGxlc3QgcG9zc2libGUgaW50ZWdlciAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICBGb3IgdGhlIEIvVyByYXN0ZXJpemVyLCBgcGl0Y2gnIGlzIGFsd2F5cyBhbiBldmVuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICBUbyBjaGFuZ2UgdGhlIHBpdGNoIG9mIGEgYml0bWFwIChzYXksIHRvIG1ha2UgaXQgYSAqLworICAvKiAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGUgb2YgNCksIHVzZSBARlRfQml0bWFwX0NvbnZlcnQuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIEFsdGVybmF0aXZlbHksIHlvdSBtaWdodCB1c2UgY2FsbGJhY2sgZnVuY3Rpb25zIHRvICovCisgIC8qICAgICAgICAgICAgICAgICAgICBkaXJlY3RseSByZW5kZXIgdG8gdGhlIGFwcGxpY2F0aW9uJ3Mgc3VyZmFjZTsgc2VlICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgdGhlIGZpbGUgYGV4YW1wbGUyLmNwcCcgaW4gdGhlIHR1dG9yaWFsIGZvciBhICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIGRlbW9uc3RyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBidWZmZXIgICAgICAgOjogQSB0eXBlbGVzcyBwb2ludGVyIHRvIHRoZSBiaXRtYXAgYnVmZmVyLiAgVGhpcyAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIHZhbHVlIHNob3VsZCBiZSBhbGlnbmVkIG9uIDMyLWJpdCBib3VuZGFyaWVzIGluICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICBtb3N0IGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtX2dyYXlzICAgIDo6IFRoaXMgZmllbGQgaXMgb25seSB1c2VkIHdpdGggICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICBARlRfUElYRUxfTU9ERV9HUkFZOyBpdCBnaXZlcyB0aGUgbnVtYmVyIG9mIGdyYXkgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgbGV2ZWxzIHVzZWQgaW4gdGhlIGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBpeGVsX21vZGUgICA6OiBUaGUgcGl4ZWwgbW9kZSwgaS5lLiwgaG93IHBpeGVsIGJpdHMgYXJlIHN0b3JlZC4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgU2VlIEBGVF9QaXhlbF9Nb2RlIGZvciBwb3NzaWJsZSB2YWx1ZXMuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBhbGV0dGVfbW9kZSA6OiBUaGlzIGZpZWxkIGlzIGludGVuZGVkIGZvciBwYWxldHRlZCBwaXhlbCBtb2RlczsgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgaXQgaW5kaWNhdGVzIGhvdyB0aGUgcGFsZXR0ZSBpcyBzdG9yZWQuICBOb3QgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIHVzZWQgY3VycmVudGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwYWxldHRlICAgICAgOjogQSB0eXBlbGVzcyBwb2ludGVyIHRvIHRoZSBiaXRtYXAgcGFsZXR0ZTsgdGhpcyAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIGZpZWxkIGlzIGludGVuZGVkIGZvciBwYWxldHRlZCBwaXhlbCBtb2Rlcy4gIE5vdCAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICB1c2VkIGN1cnJlbnRseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0JpdG1hcF8KKyAgeworICAgIHVuc2lnbmVkIGludCAgICByb3dzOworICAgIHVuc2lnbmVkIGludCAgICB3aWR0aDsKKyAgICBpbnQgICAgICAgICAgICAgcGl0Y2g7CisgICAgdW5zaWduZWQgY2hhciogIGJ1ZmZlcjsKKyAgICB1bnNpZ25lZCBzaG9ydCAgbnVtX2dyYXlzOworICAgIHVuc2lnbmVkIGNoYXIgICBwaXhlbF9tb2RlOworICAgIHVuc2lnbmVkIGNoYXIgICBwYWxldHRlX21vZGU7CisgICAgdm9pZCogICAgICAgICAgIHBhbGV0dGU7CisKKyAgfSBGVF9CaXRtYXA7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvdXRsaW5lX3Byb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT3V0bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBkZXNjcmliZSBhbiBvdXRsaW5lIHRvIHRoZSBzY2FuLWxpbmUgICAgICovCisgIC8qICAgIGNvbnZlcnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG5fY29udG91cnMgOjogVGhlIG51bWJlciBvZiBjb250b3VycyBpbiB0aGUgb3V0bGluZS4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbl9wb2ludHMgICA6OiBUaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgb3V0bGluZS4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwb2ludHMgICAgIDo6IEEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBgbl9wb2ludHMnIEBGVF9WZWN0b3IgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBlbGVtZW50cywgZ2l2aW5nIHRoZSBvdXRsaW5lJ3MgcG9pbnQgY29vcmRpbmF0ZXMuICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0YWdzICAgICAgIDo6IEEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBgbl9wb2ludHMnIGNoYXJzLCBnaXZpbmcgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBlYWNoIG91dGxpbmUgcG9pbnQncyB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIElmIGJpdH4wIGlzIHVuc2V0LCB0aGUgcG9pbnQgaXMgYG9mZicgdGhlIGN1cnZlLCAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBpLmUuLCBhIELDqXppZXIgY29udHJvbCBwb2ludCwgd2hpbGUgaXQgaXMgYG9uJyBpZiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIHNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgQml0fjEgaXMgbWVhbmluZ2Z1bCBmb3IgYG9mZicgcG9pbnRzIG9ubHkuICBJZiBzZXQsICAqLworICAvKiAgICAgICAgICAgICAgICAgIGl0IGluZGljYXRlcyBhIHRoaXJkLW9yZGVyIELDqXppZXIgYXJjIGNvbnRyb2wgcG9pbnQ7ICovCisgIC8qICAgICAgICAgICAgICAgICAgYW5kIGEgc2Vjb25kLW9yZGVyIGNvbnRyb2wgcG9pbnQgaWYgdW5zZXQuICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBJZiBiaXR+MiBpcyBzZXQsIGJpdHMgNS03IGNvbnRhaW4gdGhlIGRyb3Atb3V0IG1vZGUgICovCisgIC8qICAgICAgICAgICAgICAgICAgKGFzIGRlZmluZWQgaW4gdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb247IHRoZSB2YWx1ZSAqLworICAvKiAgICAgICAgICAgICAgICAgIGlzIHRoZSBzYW1lIGFzIHRoZSBhcmd1bWVudCB0byB0aGUgU0NBTk1PREUgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIEJpdHMgMyBhbmR+NCBhcmUgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHB1cnBvc2VzLiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNvbnRvdXJzICAgOjogQW4gYXJyYXkgb2YgYG5fY29udG91cnMnIHNob3J0cywgZ2l2aW5nIHRoZSBlbmQgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIHBvaW50IG9mIGVhY2ggY29udG91ciB3aXRoaW4gdGhlIG91dGxpbmUuICBGb3IgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBleGFtcGxlLCB0aGUgZmlyc3QgY29udG91ciBpcyBkZWZpbmVkIGJ5IHRoZSBwb2ludHMgICovCisgIC8qICAgICAgICAgICAgICAgICAgYDAnIHRvIGBjb250b3Vyc1swXScsIHRoZSBzZWNvbmQgb25lIGlzIGRlZmluZWQgYnkgICAqLworICAvKiAgICAgICAgICAgICAgICAgIHRoZSBwb2ludHMgYGNvbnRvdXJzWzBdKzEnIHRvIGBjb250b3Vyc1sxXScsIGV0Yy4gICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZsYWdzICAgICAgOjogQSBzZXQgb2YgYml0IGZsYWdzIHVzZWQgdG8gY2hhcmFjdGVyaXplIHRoZSBvdXRsaW5lICAqLworICAvKiAgICAgICAgICAgICAgICAgIGFuZCBnaXZlIGhpbnRzIHRvIHRoZSBzY2FuLWNvbnZlcnRlciBhbmQgaGludGVyIG9uICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBob3cgdG8gY29udmVydC9ncmlkLWZpdCBpdC4gIFNlZSBARlRfT1VUTElORV9YWFguICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIEIvVyByYXN0ZXJpemVyIG9ubHkgY2hlY2tzIGJpdH4yIGluIHRoZSBgdGFncycgYXJyYXkgZm9yIHRoZSAgICovCisgIC8qICAgIGZpcnN0IHBvaW50IG9mIGVhY2ggY29udG91ci4gIFRoZSBkcm9wLW91dCBtb2RlIGFzIGdpdmVuIHdpdGggICAgICAqLworICAvKiAgICBARlRfT1VUTElORV9JR05PUkVfRFJPUE9VVFMsIEBGVF9PVVRMSU5FX1NNQVJUX0RST1BPVVRTLCBhbmQgICAgICAgKi8KKyAgLyogICAgQEZUX09VVExJTkVfSU5DTFVERV9TVFVCUyBpbiBgZmxhZ3MnIGlzIHRoZW4gb3ZlcnJpZGRlbi4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgRlRfT3V0bGluZV8KKyAgeworICAgIHNob3J0ICAgICAgIG5fY29udG91cnM7ICAgICAgLyogbnVtYmVyIG9mIGNvbnRvdXJzIGluIGdseXBoICAgICAgICAqLworICAgIHNob3J0ICAgICAgIG5fcG9pbnRzOyAgICAgICAgLyogbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgZ2x5cGggICAgICAqLworCisgICAgRlRfVmVjdG9yKiAgcG9pbnRzOyAgICAgICAgICAvKiB0aGUgb3V0bGluZSdzIHBvaW50cyAgICAgICAgICAgICAgICovCisgICAgY2hhciogICAgICAgdGFnczsgICAgICAgICAgICAvKiB0aGUgcG9pbnRzIGZsYWdzICAgICAgICAgICAgICAgICAgICovCisgICAgc2hvcnQqICAgICAgY29udG91cnM7ICAgICAgICAvKiB0aGUgY29udG91ciBlbmQgcG9pbnRzICAgICAgICAgICAgICovCisKKyAgICBpbnQgICAgICAgICBmbGFnczsgICAgICAgICAgIC8qIG91dGxpbmUgbWFza3MgICAgICAgICAgICAgICAgICAgICAgKi8KKworICB9IEZUX091dGxpbmU7CisKKyAgLyogKi8KKworICAvKiBGb2xsb3dpbmcgbGltaXRzIG11c3QgYmUgY29uc2lzdGVudCB3aXRoICovCisgIC8qIEZUX091dGxpbmUue25fY29udG91cnMsbl9wb2ludHN9ICAgICAgICAgKi8KKyNkZWZpbmUgRlRfT1VUTElORV9DT05UT1VSU19NQVggIFNIUlRfTUFYCisjZGVmaW5lIEZUX09VVExJTkVfUE9JTlRTX01BWCAgICBTSFJUX01BWAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT1VUTElORV9YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBsaXN0IG9mIGJpdC1maWVsZCBjb25zdGFudHMgdXNlIGZvciB0aGUgZmxhZ3MgaW4gYW4gb3V0bGluZSdzICAgICovCisgIC8qICAgIGBmbGFncycgZmllbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX09VVExJTkVfTk9ORSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIFZhbHVlfjAgaXMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX09VVExJTkVfT1dORVIgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIElmIHNldCwgdGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBvdXRsaW5lJ3MgZmllbGQgYXJyYXlzICAgICAgKi8KKyAgLyogICAgICAoaS5lLiwgYHBvaW50cycsIGBmbGFncycsIGFuZCBgY29udG91cnMnKSBhcmUgYG93bmVkJyBieSB0aGUgICAgICovCisgIC8qICAgICAgb3V0bGluZSBvYmplY3QsIGFuZCBzaG91bGQgdGh1cyBiZSBmcmVlZCB3aGVuIGl0IGlzIGRlc3Ryb3llZC4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT1VUTElORV9FVkVOX09ERF9GSUxMIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgQnkgZGVmYXVsdCwgb3V0bGluZXMgYXJlIGZpbGxlZCB1c2luZyB0aGUgbm9uLXplcm8gd2luZGluZyBydWxlLiAqLworICAvKiAgICAgIElmIHNldCB0byAxLCB0aGUgb3V0bGluZSB3aWxsIGJlIGZpbGxlZCB1c2luZyB0aGUgZXZlbi1vZGQgZmlsbCAgKi8KKyAgLyogICAgICBydWxlIChvbmx5IHdvcmtzIHdpdGggdGhlIHNtb290aCByYXN0ZXJpemVyKS4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PVVRMSU5FX1JFVkVSU0VfRklMTCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBCeSBkZWZhdWx0LCBvdXRzaWRlIGNvbnRvdXJzIG9mIGFuIG91dGxpbmUgYXJlIG9yaWVudGVkIGluICAgICAgICovCisgIC8qICAgICAgY2xvY2std2lzZSBkaXJlY3Rpb24sIGFzIGRlZmluZWQgaW4gdGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24uICAqLworICAvKiAgICAgIFRoaXMgZmxhZyBpcyBzZXQgaWYgdGhlIG91dGxpbmUgdXNlcyB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uICAgICAgKi8KKyAgLyogICAgICAodHlwaWNhbGx5IGZvciBUeXBlfjEgZm9udHMpLiAgVGhpcyBmbGFnIGlzIGlnbm9yZWQgYnkgdGhlIHNjYW4gICovCisgIC8qICAgICAgY29udmVydGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT1VUTElORV9JR05PUkVfRFJPUE9VVFMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgQnkgZGVmYXVsdCwgdGhlIHNjYW4gY29udmVydGVyIHdpbGwgdHJ5IHRvIGRldGVjdCBkcm9wLW91dHMgaW4gICAqLworICAvKiAgICAgIGFuIG91dGxpbmUgYW5kIGNvcnJlY3QgdGhlIGdseXBoIGJpdG1hcCB0byBlbnN1cmUgY29uc2lzdGVudCAgICAgKi8KKyAgLyogICAgICBzaGFwZSBjb250aW51aXR5LiAgSWYgc2V0LCB0aGlzIGZsYWcgaGludHMgdGhlIHNjYW4tbGluZSAgICAgICAgICovCisgIC8qICAgICAgY29udmVydGVyIHRvIGlnbm9yZSBzdWNoIGNhc2VzLiAgU2VlIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uLiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT1VUTElORV9TTUFSVF9EUk9QT1VUUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgU2VsZWN0IHNtYXJ0IGRyb3BvdXQgY29udHJvbC4gIElmIHVuc2V0LCB1c2Ugc2ltcGxlIGRyb3BvdXQgICAgICAqLworICAvKiAgICAgIGNvbnRyb2wuICBJZ25vcmVkIGlmIEBGVF9PVVRMSU5FX0lHTk9SRV9EUk9QT1VUUyBpcyBzZXQuICBTZWUgICAgKi8KKyAgLyogICAgICBiZWxvdyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PVVRMSU5FX0lOQ0xVREVfU1RVQlMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBJZiBzZXQsIHR1cm4gcGl4ZWxzIG9uIGZvciBgc3R1YnMnLCBvdGhlcndpc2UgZXhjbHVkZSB0aGVtLiAgICAgICovCisgIC8qICAgICAgSWdub3JlZCBpZiBARlRfT1VUTElORV9JR05PUkVfRFJPUE9VVFMgaXMgc2V0LiAgU2VlIGJlbG93IGZvciAgICAqLworICAvKiAgICAgIG1vcmUgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX09VVExJTkVfSElHSF9QUkVDSVNJT04gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgc2Nhbi1saW5lIGNvbnZlcnRlciBzaG91bGQgdHJ5IHRvICAgKi8KKyAgLyogICAgICBjb252ZXJ0IHRoaXMgb3V0bGluZSB0byBiaXRtYXBzIHdpdGggdGhlIGhpZ2hlc3QgcG9zc2libGUgICAgICAgICovCisgIC8qICAgICAgcXVhbGl0eS4gIEl0IGlzIHR5cGljYWxseSBzZXQgZm9yIHNtYWxsIGNoYXJhY3RlciBzaXplcy4gIE5vdGUgICAqLworICAvKiAgICAgIHRoYXQgdGhpcyBpcyBvbmx5IGEgaGludCB0aGF0IG1pZ2h0IGJlIGNvbXBsZXRlbHkgaWdub3JlZCBieSBhICAgKi8KKyAgLyogICAgICBnaXZlbiBzY2FuLWNvbnZlcnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PVVRMSU5FX1NJTkdMRV9QQVNTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBUaGlzIGZsYWcgaXMgc2V0IHRvIGZvcmNlIGEgZ2l2ZW4gc2Nhbi1jb252ZXJ0ZXIgdG8gb25seSB1c2UgYSAgICovCisgIC8qICAgICAgc2luZ2xlIHBhc3Mgb3ZlciB0aGUgb3V0bGluZSB0byByZW5kZXIgYSBiaXRtYXAgZ2x5cGggaW1hZ2UuICAgICAqLworICAvKiAgICAgIE5vcm1hbGx5LCBpdCBpcyBzZXQgZm9yIHZlcnkgbGFyZ2UgY2hhcmFjdGVyIHNpemVzLiAgSXQgaXMgb25seSAgKi8KKyAgLyogICAgICBhIGhpbnQgdGhhdCBtaWdodCBiZSBjb21wbGV0ZWx5IGlnbm9yZWQgYnkgYSBnaXZlbiAgICAgICAgICAgICAgICovCisgIC8qICAgICAgc2Nhbi1jb252ZXJ0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBmbGFncyBARlRfT1VUTElORV9JR05PUkVfRFJPUE9VVFMsIEBGVF9PVVRMSU5FX1NNQVJUX0RST1BPVVRTLCAqLworICAvKiAgICBhbmQgQEZUX09VVExJTkVfSU5DTFVERV9TVFVCUyBhcmUgaWdub3JlZCBieSB0aGUgc21vb3RoICAgICAgICAgICAgKi8KKyAgLyogICAgcmFzdGVyaXplci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGVyZSBleGlzdHMgYSBzZWNvbmQgbWVjaGFuaXNtIHRvIHBhc3MgdGhlIGRyb3Atb3V0IG1vZGUgdG8gdGhlICAgKi8KKyAgLyogICAgQi9XIHJhc3Rlcml6ZXI7IHNlZSB0aGUgYHRhZ3MnIGZpZWxkIGluIEBGVF9PdXRsaW5lLiAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQbGVhc2UgcmVmZXIgdG8gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBgU0NBTlRZUEUnIGluc3RydWN0aW9uIGluICAgKi8KKyAgLyogICAgdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24gKGluIGZpbGUgYHR0aW5zdDEuZG9jJykgaG93IHNpbXBsZSAgICAgICovCisgIC8qICAgIGRyb3Atb3V0cywgc21hcnQgZHJvcC1vdXRzLCBhbmQgc3R1YnMgYXJlIGRlZmluZWQuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfT1VUTElORV9OT05FICAgICAgICAgICAgIDB4MAorI2RlZmluZSBGVF9PVVRMSU5FX09XTkVSICAgICAgICAgICAgMHgxCisjZGVmaW5lIEZUX09VVExJTkVfRVZFTl9PRERfRklMTCAgICAweDIKKyNkZWZpbmUgRlRfT1VUTElORV9SRVZFUlNFX0ZJTEwgICAgIDB4NAorI2RlZmluZSBGVF9PVVRMSU5FX0lHTk9SRV9EUk9QT1VUUyAgMHg4CisjZGVmaW5lIEZUX09VVExJTkVfU01BUlRfRFJPUE9VVFMgICAweDEwCisjZGVmaW5lIEZUX09VVExJTkVfSU5DTFVERV9TVFVCUyAgICAweDIwCisKKyNkZWZpbmUgRlRfT1VUTElORV9ISUdIX1BSRUNJU0lPTiAgIDB4MTAwCisjZGVmaW5lIEZUX09VVExJTkVfU0lOR0xFX1BBU1MgICAgICAweDIwMAorCisKKyAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgKi8KKyAgLyogYEZUX09VVExJTkVfWFhYJyB2YWx1ZXMgaW5zdGVhZCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgZnRfb3V0bGluZV9ub25lICAgICAgICAgICAgIEZUX09VVExJTkVfTk9ORQorI2RlZmluZSBmdF9vdXRsaW5lX293bmVyICAgICAgICAgICAgRlRfT1VUTElORV9PV05FUgorI2RlZmluZSBmdF9vdXRsaW5lX2V2ZW5fb2RkX2ZpbGwgICAgRlRfT1VUTElORV9FVkVOX09ERF9GSUxMCisjZGVmaW5lIGZ0X291dGxpbmVfcmV2ZXJzZV9maWxsICAgICBGVF9PVVRMSU5FX1JFVkVSU0VfRklMTAorI2RlZmluZSBmdF9vdXRsaW5lX2lnbm9yZV9kcm9wb3V0cyAgRlRfT1VUTElORV9JR05PUkVfRFJPUE9VVFMKKyNkZWZpbmUgZnRfb3V0bGluZV9oaWdoX3ByZWNpc2lvbiAgIEZUX09VVExJTkVfSElHSF9QUkVDSVNJT04KKyNkZWZpbmUgZnRfb3V0bGluZV9zaW5nbGVfcGFzcyAgICAgIEZUX09VVExJTkVfU0lOR0xFX1BBU1MKKworICAvKiAqLworCisjZGVmaW5lIEZUX0NVUlZFX1RBRyggZmxhZyApICAoIGZsYWcgJiAzICkKKworI2RlZmluZSBGVF9DVVJWRV9UQUdfT04gICAgICAgICAgICAxCisjZGVmaW5lIEZUX0NVUlZFX1RBR19DT05JQyAgICAgICAgIDAKKyNkZWZpbmUgRlRfQ1VSVkVfVEFHX0NVQklDICAgICAgICAgMgorCisjZGVmaW5lIEZUX0NVUlZFX1RBR19IQVNfU0NBTk1PREUgIDQKKworI2RlZmluZSBGVF9DVVJWRV9UQUdfVE9VQ0hfWCAgICAgICA4ICAvKiByZXNlcnZlZCBmb3IgdGhlIFRydWVUeXBlIGhpbnRlciAqLworI2RlZmluZSBGVF9DVVJWRV9UQUdfVE9VQ0hfWSAgICAgIDE2ICAvKiByZXNlcnZlZCBmb3IgdGhlIFRydWVUeXBlIGhpbnRlciAqLworCisjZGVmaW5lIEZUX0NVUlZFX1RBR19UT1VDSF9CT1RIICAgICggRlRfQ1VSVkVfVEFHX1RPVUNIX1ggfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQ1VSVkVfVEFHX1RPVUNIX1kgKQorCisjZGVmaW5lIEZUX0N1cnZlX1RhZ19PbiAgICAgICBGVF9DVVJWRV9UQUdfT04KKyNkZWZpbmUgRlRfQ3VydmVfVGFnX0NvbmljICAgIEZUX0NVUlZFX1RBR19DT05JQworI2RlZmluZSBGVF9DdXJ2ZV9UYWdfQ3ViaWMgICAgRlRfQ1VSVkVfVEFHX0NVQklDCisjZGVmaW5lIEZUX0N1cnZlX1RhZ19Ub3VjaF9YICBGVF9DVVJWRV9UQUdfVE9VQ0hfWAorI2RlZmluZSBGVF9DdXJ2ZV9UYWdfVG91Y2hfWSAgRlRfQ1VSVkVfVEFHX1RPVUNIX1kKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX091dGxpbmVfTW92ZVRvRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgZnVuY3Rpb24gcG9pbnRlciB0eXBlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHNpZ25hdHVyZSBvZiBhIGBtb3ZlICAqLworICAvKiAgICB0bycgZnVuY3Rpb24gZHVyaW5nIG91dGxpbmUgd2Fsa2luZy9kZWNvbXBvc2l0aW9uLiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgYG1vdmUgdG8nIGlzIGVtaXR0ZWQgdG8gc3RhcnQgYSBuZXcgY29udG91ciBpbiBhbiBvdXRsaW5lLiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHRvICAgOjogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgcG9pbnQgb2YgdGhlIGBtb3ZlIHRvJy4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdXNlciA6OiBBIHR5cGVsZXNzIHBvaW50ZXIsIHdoaWNoIGlzIHBhc3NlZCBmcm9tIHRoZSBjYWxsZXIgb2YgdGhlICovCisgIC8qICAgICAgICAgICAgZGVjb21wb3NpdGlvbiBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBpbnQKKyAgKCpGVF9PdXRsaW5lX01vdmVUb0Z1bmMpKCBjb25zdCBGVF9WZWN0b3IqICB0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICB1c2VyICk7CisKKyNkZWZpbmUgRlRfT3V0bGluZV9Nb3ZlVG9fRnVuYyAgRlRfT3V0bGluZV9Nb3ZlVG9GdW5jCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PdXRsaW5lX0xpbmVUb0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzaWduYXR1cmUgb2YgYSBgbGluZSAgKi8KKyAgLyogICAgdG8nIGZ1bmN0aW9uIGR1cmluZyBvdXRsaW5lIHdhbGtpbmcvZGVjb21wb3NpdGlvbi4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGBsaW5lIHRvJyBpcyBlbWl0dGVkIHRvIGluZGljYXRlIGEgc2VnbWVudCBpbiB0aGUgb3V0bGluZS4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0byAgIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IHBvaW50IG9mIHRoZSBgbGluZSB0bycuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHVzZXIgOjogQSB0eXBlbGVzcyBwb2ludGVyLCB3aGljaCBpcyBwYXNzZWQgZnJvbSB0aGUgY2FsbGVyIG9mIHRoZSAqLworICAvKiAgICAgICAgICAgIGRlY29tcG9zaXRpb24gZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgaW50CisgICgqRlRfT3V0bGluZV9MaW5lVG9GdW5jKSggY29uc3QgRlRfVmVjdG9yKiAgdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgdXNlciApOworCisjZGVmaW5lIEZUX091dGxpbmVfTGluZVRvX0Z1bmMgIEZUX091dGxpbmVfTGluZVRvRnVuYworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT3V0bGluZV9Db25pY1RvRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBmdW5jdGlvbiBwb2ludGVyIHR5cGUgdXNlZCB0byBkZXNjcmliZSB0aGUgc2lnbmF0dXJlIG9mIGEgYGNvbmljICovCisgIC8qICAgIHRvJyBmdW5jdGlvbiBkdXJpbmcgb3V0bGluZSB3YWxraW5nIG9yIGRlY29tcG9zaXRpb24uICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBgY29uaWMgdG8nIGlzIGVtaXR0ZWQgdG8gaW5kaWNhdGUgYSBzZWNvbmQtb3JkZXIgQsOpemllciBhcmMgaW4gICAqLworICAvKiAgICB0aGUgb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjb250cm9sIDo6IEFuIGludGVybWVkaWF0ZSBjb250cm9sIHBvaW50IGJldHdlZW4gdGhlIGxhc3QgcG9zaXRpb24gKi8KKyAgLyogICAgICAgICAgICAgICBhbmQgdGhlIG5ldyB0YXJnZXQgaW4gYHRvJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0byAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IGVuZCBwb2ludCBvZiB0aGUgY29uaWMgYXJjLiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHVzZXIgICAgOjogQSB0eXBlbGVzcyBwb2ludGVyLCB3aGljaCBpcyBwYXNzZWQgZnJvbSB0aGUgY2FsbGVyIG9mICAqLworICAvKiAgICAgICAgICAgICAgIHRoZSBkZWNvbXBvc2l0aW9uIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgaW50CisgICgqRlRfT3V0bGluZV9Db25pY1RvRnVuYykoIGNvbnN0IEZUX1ZlY3RvciogIGNvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogIHRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICB1c2VyICk7CisKKyNkZWZpbmUgRlRfT3V0bGluZV9Db25pY1RvX0Z1bmMgIEZUX091dGxpbmVfQ29uaWNUb0Z1bmMKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX091dGxpbmVfQ3ViaWNUb0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgZnVuY3Rpb24gcG9pbnRlciB0eXBlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHNpZ25hdHVyZSBvZiBhIGBjdWJpYyAqLworICAvKiAgICB0bycgZnVuY3Rpb24gZHVyaW5nIG91dGxpbmUgd2Fsa2luZyBvciBkZWNvbXBvc2l0aW9uLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgYGN1YmljIHRvJyBpcyBlbWl0dGVkIHRvIGluZGljYXRlIGEgdGhpcmQtb3JkZXIgQsOpemllciBhcmMuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjb250cm9sMSA6OiBBIHBvaW50ZXIgdG8gdGhlIGZpcnN0IELDqXppZXIgY29udHJvbCBwb2ludC4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjb250cm9sMiA6OiBBIHBvaW50ZXIgdG8gdGhlIHNlY29uZCBCw6l6aWVyIGNvbnRyb2wgcG9pbnQuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0byAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBlbmQgcG9pbnQuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHVzZXIgICAgIDo6IEEgdHlwZWxlc3MgcG9pbnRlciwgd2hpY2ggaXMgcGFzc2VkIGZyb20gdGhlIGNhbGxlciBvZiAqLworICAvKiAgICAgICAgICAgICAgICB0aGUgZGVjb21wb3NpdGlvbiBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgaW50CisgICgqRlRfT3V0bGluZV9DdWJpY1RvRnVuYykoIGNvbnN0IEZUX1ZlY3RvciogIGNvbnRyb2wxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICBjb250cm9sMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgIHVzZXIgKTsKKworI2RlZmluZSBGVF9PdXRsaW5lX0N1YmljVG9fRnVuYyAgRlRfT3V0bGluZV9DdWJpY1RvRnVuYworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT3V0bGluZV9GdW5jcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzdHJ1Y3R1cmUgdG8gaG9sZCB2YXJpb3VzIGZ1bmN0aW9uIHBvaW50ZXJzIHVzZWQgZHVyaW5nIG91dGxpbmUgICovCisgIC8qICAgIGRlY29tcG9zaXRpb24gaW4gb3JkZXIgdG8gZW1pdCBzZWdtZW50cywgY29uaWMsIGFuZCBjdWJpYyBCw6l6aWVycy4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtb3ZlX3RvICA6OiBUaGUgYG1vdmUgdG8nIGVtaXR0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpbmVfdG8gIDo6IFRoZSBzZWdtZW50IGVtaXR0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY29uaWNfdG8gOjogVGhlIHNlY29uZC1vcmRlciBCw6l6aWVyIGFyYyBlbWl0dGVyLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY3ViaWNfdG8gOjogVGhlIHRoaXJkLW9yZGVyIELDqXppZXIgYXJjIGVtaXR0ZXIuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2hpZnQgICAgOjogVGhlIHNoaWZ0IHRoYXQgaXMgYXBwbGllZCB0byBjb29yZGluYXRlcyBiZWZvcmUgdGhleSAgICovCisgIC8qICAgICAgICAgICAgICAgIGFyZSBzZW50IHRvIHRoZSBlbWl0dGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZGVsdGEgICAgOjogVGhlIGRlbHRhIHRoYXQgaXMgYXBwbGllZCB0byBjb29yZGluYXRlcyBiZWZvcmUgdGhleSAgICovCisgIC8qICAgICAgICAgICAgICAgIGFyZSBzZW50IHRvIHRoZSBlbWl0dGVyLCBidXQgYWZ0ZXIgdGhlIHNoaWZ0LiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBwb2ludCBjb29yZGluYXRlcyBzZW50IHRvIHRoZSBlbWl0dGVycyBhcmUgdGhlIHRyYW5zZm9ybWVkICAgICAqLworICAvKiAgICB2ZXJzaW9uIG9mIHRoZSBvcmlnaW5hbCBjb29yZGluYXRlcyAodGhpcyBpcyBpbXBvcnRhbnQgZm9yIGhpZ2ggICAgKi8KKyAgLyogICAgYWNjdXJhY3kgZHVyaW5nIHNjYW4tY29udmVyc2lvbikuICBUaGUgdHJhbnNmb3JtYXRpb24gaXMgc2ltcGxlOiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICB4JyA9ICh4IDw8IHNoaWZ0KSAtIGRlbHRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgeScgPSAoeCA8PCBzaGlmdCkgLSBkZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFNldCB0aGUgdmFsdWVzIG9mIGBzaGlmdCcgYW5kIGBkZWx0YScgdG9+MCB0byBnZXQgdGhlIG9yaWdpbmFsICAgICAqLworICAvKiAgICBwb2ludCBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBGVF9PdXRsaW5lX0Z1bmNzXworICB7CisgICAgRlRfT3V0bGluZV9Nb3ZlVG9GdW5jICAgbW92ZV90bzsKKyAgICBGVF9PdXRsaW5lX0xpbmVUb0Z1bmMgICBsaW5lX3RvOworICAgIEZUX091dGxpbmVfQ29uaWNUb0Z1bmMgIGNvbmljX3RvOworICAgIEZUX091dGxpbmVfQ3ViaWNUb0Z1bmMgIGN1YmljX3RvOworCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgc2hpZnQ7CisgICAgRlRfUG9zICAgICAgICAgICAgICAgICAgZGVsdGE7CisKKyAgfSBGVF9PdXRsaW5lX0Z1bmNzOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYmFzaWNfdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0lNQUdFX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgbWFjcm8gY29udmVydHMgZm91ci1sZXR0ZXIgdGFncyB0byBhbiB1bnNpZ25lZCBsb25nIHR5cGUuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFNpbmNlIG1hbnkgMTYtYml0IGNvbXBpbGVycyBkb24ndCBsaWtlIDMyLWJpdCBlbnVtZXJhdGlvbnMsIHlvdSAgICAqLworICAvKiAgICBzaG91bGQgcmVkZWZpbmUgdGhpcyBtYWNybyBpbiBjYXNlIG9mIHByb2JsZW1zIHRvIHNvbWV0aGluZyBsaWtlICAgKi8KKyAgLyogICAgdGhpczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAjZGVmaW5lIEZUX0lNQUdFX1RBRyggdmFsdWUsIF94MSwgX3gyLCBfeDMsIF94NCApICB2YWx1ZSAgICAgICAgICovCisgIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdG8gZ2V0IGEgc2ltcGxlIGVudW1lcmF0aW9uIHdpdGhvdXQgYXNzaWduaW5nIHNwZWNpYWwgbnVtYmVycy4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmbmRlZiBGVF9JTUFHRV9UQUcKKyNkZWZpbmUgRlRfSU1BR0VfVEFHKCB2YWx1ZSwgX3gxLCBfeDIsIF94MywgX3g0ICkgIFwKKyAgICAgICAgICB2YWx1ZSA9ICggKCAodW5zaWduZWQgbG9uZylfeDEgPDwgMjQgKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgKCAodW5zaWduZWQgbG9uZylfeDIgPDwgMTYgKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgKCAodW5zaWduZWQgbG9uZylfeDMgPDwgOCAgKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylfeDQgICAgICAgICApCisjZW5kaWYgLyogRlRfSU1BR0VfVEFHICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HbHlwaF9Gb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbiBlbnVtZXJhdGlvbiB0eXBlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGZvcm1hdCBvZiBhIGdpdmVuIGdseXBoICAgKi8KKyAgLyogICAgaW1hZ2UuICBOb3RlIHRoYXQgdGhpcyB2ZXJzaW9uIG9mIEZyZWVUeXBlIG9ubHkgc3VwcG9ydHMgdHdvIGltYWdlICovCisgIC8qICAgIGZvcm1hdHMsIGV2ZW4gdGhvdWdoIGZ1dHVyZSBmb250IGRyaXZlcnMgd2lsbCBiZSBhYmxlIHRvIHJlZ2lzdGVyICAqLworICAvKiAgICB0aGVpciBvd24gZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HTFlQSF9GT1JNQVRfTk9ORSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBUaGUgdmFsdWV+MCBpcyByZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HTFlQSF9GT1JNQVRfQ09NUE9TSVRFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBUaGUgZ2x5cGggaW1hZ2UgaXMgYSBjb21wb3NpdGUgb2Ygc2V2ZXJhbCBvdGhlciBpbWFnZXMuICBUaGlzICAgICovCisgIC8qICAgICAgZm9ybWF0IGlzIF9vbmx5XyB1c2VkIHdpdGggQEZUX0xPQURfTk9fUkVDVVJTRSwgYW5kIGlzIHVzZWQgdG8gICAqLworICAvKiAgICAgIHJlcG9ydCBjb21wb3VuZCBnbHlwaHMgKGxpa2UgYWNjZW50ZWQgY2hhcmFjdGVycykuICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIFRoZSBnbHlwaCBpbWFnZSBpcyBhIGJpdG1hcCwgYW5kIGNhbiBiZSBkZXNjcmliZWQgYXMgYW4gICAgICAgICAgKi8KKyAgLyogICAgICBARlRfQml0bWFwLiAgWW91IGdlbmVyYWxseSBuZWVkIHRvIGFjY2VzcyB0aGUgYGJpdG1hcCcgZmllbGQgb2YgICovCisgIC8qICAgICAgdGhlIEBGVF9HbHlwaFNsb3RSZWMgc3RydWN0dXJlIHRvIHJlYWQgaXQuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR0xZUEhfRk9STUFUX09VVExJTkUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgVGhlIGdseXBoIGltYWdlIGlzIGEgdmVjdG9yaWFsIG91dGxpbmUgbWFkZSBvZiBsaW5lIHNlZ21lbnRzICAgICAqLworICAvKiAgICAgIGFuZCBCw6l6aWVyIGFyY3M7IGl0IGNhbiBiZSBkZXNjcmliZWQgYXMgYW4gQEZUX091dGxpbmU7IHlvdSAgICAgICovCisgIC8qICAgICAgZ2VuZXJhbGx5IHdhbnQgdG8gYWNjZXNzIHRoZSBgb3V0bGluZScgZmllbGQgb2YgdGhlICAgICAgICAgICAgICAqLworICAvKiAgICAgIEBGVF9HbHlwaFNsb3RSZWMgc3RydWN0dXJlIHRvIHJlYWQgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0dMWVBIX0ZPUk1BVF9QTE9UVEVSIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIFRoZSBnbHlwaCBpbWFnZSBpcyBhIHZlY3RvcmlhbCBwYXRoIHdpdGggbm8gaW5zaWRlIGFuZCBvdXRzaWRlICAgKi8KKyAgLyogICAgICBjb250b3Vycy4gIFNvbWUgVHlwZX4xIGZvbnRzLCBsaWtlIHRob3NlIGluIHRoZSBIZXJzaGV5IGZhbWlseSwgICovCisgIC8qICAgICAgY29udGFpbiBnbHlwaHMgaW4gdGhpcyBmb3JtYXQuICBUaGVzZSBhcmUgZGVzY3JpYmVkIGFzICAgICAgICAgICAqLworICAvKiAgICAgIEBGVF9PdXRsaW5lLCBidXQgRnJlZVR5cGUgaXNuJ3QgY3VycmVudGx5IGNhcGFibGUgb2YgcmVuZGVyaW5nICAgKi8KKyAgLyogICAgICB0aGVtIGNvcnJlY3RseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIGVudW0gIEZUX0dseXBoX0Zvcm1hdF8KKyAgeworICAgIEZUX0lNQUdFX1RBRyggRlRfR0xZUEhfRk9STUFUX05PTkUsIDAsIDAsIDAsIDAgKSwKKworICAgIEZUX0lNQUdFX1RBRyggRlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURSwgJ2MnLCAnbycsICdtJywgJ3AnICksCisgICAgRlRfSU1BR0VfVEFHKCBGVF9HTFlQSF9GT1JNQVRfQklUTUFQLCAgICAnYicsICdpJywgJ3QnLCAncycgKSwKKyAgICBGVF9JTUFHRV9UQUcoIEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FLCAgICdvJywgJ3UnLCAndCcsICdsJyApLAorICAgIEZUX0lNQUdFX1RBRyggRlRfR0xZUEhfRk9STUFUX1BMT1RURVIsICAgJ3AnLCAnbCcsICdvJywgJ3QnICkKKworICB9IEZUX0dseXBoX0Zvcm1hdDsKKworCisgIC8qIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVwcmVjYXRlZDsgdXNlIHRoZSBjb3JyZXNwb25kaW5nICovCisgIC8qIGBGVF9HbHlwaF9Gb3JtYXQnIHZhbHVlcyBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIGZ0X2dseXBoX2Zvcm1hdF9ub25lICAgICAgIEZUX0dMWVBIX0ZPUk1BVF9OT05FCisjZGVmaW5lIGZ0X2dseXBoX2Zvcm1hdF9jb21wb3NpdGUgIEZUX0dMWVBIX0ZPUk1BVF9DT01QT1NJVEUKKyNkZWZpbmUgZnRfZ2x5cGhfZm9ybWF0X2JpdG1hcCAgICAgRlRfR0xZUEhfRk9STUFUX0JJVE1BUAorI2RlZmluZSBmdF9nbHlwaF9mb3JtYXRfb3V0bGluZSAgICBGVF9HTFlQSF9GT1JNQVRfT1VUTElORQorI2RlZmluZSBmdF9nbHlwaF9mb3JtYXRfcGxvdHRlciAgICBGVF9HTFlQSF9GT1JNQVRfUExPVFRFUgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCisgIC8qKioqKiAgICAgICAgICAgIFIgQSBTIFQgRSBSICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICoqKioqLworICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQSByYXN0ZXIgaXMgYSBzY2FuIGNvbnZlcnRlciwgaW4gY2hhcmdlIG9mIHJlbmRlcmluZyBhbiBvdXRsaW5lIGludG8gICovCisgIC8qIGEgYSBiaXRtYXAuICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIHB1YmxpYyBBUEkgZm9yIHJhc3RlcnMuICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTm90ZSB0aGF0IGluIEZyZWVUeXBlIDIsIGFsbCByYXN0ZXJzIGFyZSBub3cgZW5jYXBzdWxhdGVkIHdpdGhpbiAgICAgICovCisgIC8qIHNwZWNpZmljIG1vZHVsZXMgY2FsbGVkIGByZW5kZXJlcnMnLiAgU2VlIGBmdHJlbmRlci5oJyBmb3IgbW9yZSAgICAgICAqLworICAvKiBkZXRhaWxzIG9uIHJlbmRlcmVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcmFzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2NhbmxpbmUgQ29udmVydGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSG93IHZlY3RvcmlhbCBvdXRsaW5lcyBhcmUgY29udmVydGVkIGludG8gYml0bWFwcyBhbmQgcGl4bWFwcy4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRlY2huaWNhbCBkZWZpbml0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3JkZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUmFzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1NwYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TcGFuRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1Jhc3Rlcl9QYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9SQVNURVJfRkxBR19YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1Jhc3Rlcl9OZXdGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9SYXN0ZXJfRG9uZUZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUmFzdGVyX1Jlc2V0RnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1Jhc3Rlcl9TZXRNb2RlRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9SYXN0ZXJfUmVuZGVyRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUmFzdGVyX0Z1bmNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1Jhc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFuIG9wYXF1ZSBoYW5kbGUgKHBvaW50ZXIpIHRvIGEgcmFzdGVyIG9iamVjdC4gIEVhY2ggb2JqZWN0IGNhbiBiZSAqLworICAvKiAgICB1c2VkIGluZGVwZW5kZW50bHkgdG8gY29udmVydCBhbiBvdXRsaW5lIGludG8gYSBiaXRtYXAgb3IgcGl4bWFwLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IEZUX1Jhc3RlclJlY18qICBGVF9SYXN0ZXI7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TcGFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgc2luZ2xlIHNwYW4gb2YgZ3JheSBwaXhlbHMgd2hlbiAgICAgICAgKi8KKyAgLyogICAgcmVuZGVyaW5nIGFuIGFudGktYWxpYXNlZCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeCAgICAgICAgOjogVGhlIHNwYW4ncyBob3Jpem9udGFsIHN0YXJ0IHBvc2l0aW9uLiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsZW4gICAgICA6OiBUaGUgc3BhbidzIGxlbmd0aCBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNvdmVyYWdlIDo6IFRoZSBzcGFuIGNvbG9yL2NvdmVyYWdlLCByYW5naW5nIGZyb20gMCAoYmFja2dyb3VuZCkgICAqLworICAvKiAgICAgICAgICAgICAgICB0byAyNTUgKGZvcmVncm91bmQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGJ5IHRoZSBzcGFuIGRyYXdpbmcgY2FsbGJhY2sgdHlwZSBuYW1lZCAgICAgKi8KKyAgLyogICAgQEZUX1NwYW5GdW5jIHRoYXQgdGFrZXMgdGhlIHl+Y29vcmRpbmF0ZSBvZiB0aGUgc3BhbiBhcyBhICAgICAgICAgICovCisgIC8qICAgIHBhcmFtZXRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGNvdmVyYWdlIHZhbHVlIGlzIGFsd2F5cyBiZXR3ZWVuIDAgYW5kIDI1NS4gIElmIHlvdSB3YW50IGxlc3MgICovCisgIC8qICAgIGdyYXkgdmFsdWVzLCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gaGFzIHRvIHJlZHVjZSB0aGVtLiAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1NwYW5fCisgIHsKKyAgICBzaG9ydCAgICAgICAgICAgeDsKKyAgICB1bnNpZ25lZCBzaG9ydCAgbGVuOworICAgIHVuc2lnbmVkIGNoYXIgICBjb3ZlcmFnZTsKKworICB9IEZUX1NwYW47CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TcGFuRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgYXMgYSBjYWxsLWJhY2sgYnkgdGhlIGFudGktYWxpYXNlZCByZW5kZXJlciBpbiAgICAgKi8KKyAgLyogICAgb3JkZXIgdG8gbGV0IGNsaWVudCBhcHBsaWNhdGlvbnMgZHJhdyB0aGVtc2VsdmVzIHRoZSBncmF5IHBpeGVsICAgICovCisgIC8qICAgIHNwYW5zIG9uIGVhY2ggc2NhbiBsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHkgICAgIDo6IFRoZSBzY2FubGluZSdzIHl+Y29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY291bnQgOjogVGhlIG51bWJlciBvZiBzcGFucyB0byBkcmF3IG9uIHRoaXMgc2NhbmxpbmUuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzcGFucyA6OiBBIHRhYmxlIG9mIGBjb3VudCcgc3BhbnMgdG8gZHJhdyBvbiB0aGUgc2NhbmxpbmUuICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHVzZXIgIDo6IFVzZXItc3VwcGxpZWQgZGF0YSB0aGF0IGlzIHBhc3NlZCB0byB0aGUgY2FsbGJhY2suICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgY2FsbGJhY2sgYWxsb3dzIGNsaWVudCBhcHBsaWNhdGlvbnMgdG8gZGlyZWN0bHkgcmVuZGVyIHRoZSAgICAqLworICAvKiAgICBncmF5IHNwYW5zIG9mIHRoZSBhbnRpLWFsaWFzZWQgYml0bWFwIHRvIGFueSBraW5kIG9mIHN1cmZhY2VzLiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gd3JpdGUgYW50aS1hbGlhc2VkIG91dGxpbmVzIGRpcmVjdGx5IHRvIGEgICAgICAqLworICAvKiAgICBnaXZlbiBiYWNrZ3JvdW5kIGJpdG1hcCwgYW5kIGV2ZW4gcGVyZm9ybSB0cmFuc2x1Y2VuY3kuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE5vdGUgdGhhdCB0aGUgYGNvdW50JyBmaWVsZCBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIGEgZml4ZWQgdmFsdWUgICAqLworICAvKiAgICBkZWZpbmVkIGJ5IHRoZSBgRlRfTUFYX0dSQVlfU1BBTlMnIGNvbmZpZ3VyYXRpb24gbWFjcm8gaW4gICAgICAgICAgKi8KKyAgLyogICAgYGZ0b3B0aW9uLmgnLiAgQnkgZGVmYXVsdCwgdGhpcyB2YWx1ZSBpcyBzZXQgdG9+MzIsIHdoaWNoIG1lYW5zICAgICovCisgIC8qICAgIHRoYXQgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiAzMn5zcGFucyBvbiBhIGdpdmVuIHNjYW5saW5lLCB0aGUgICAgICAqLworICAvKiAgICBjYWxsYmFjayBpcyBjYWxsZWQgc2V2ZXJhbCB0aW1lcyB3aXRoIHRoZSBzYW1lIGB5JyBwYXJhbWV0ZXIgaW4gICAgKi8KKyAgLyogICAgb3JkZXIgdG8gZHJhdyBhbGwgY2FsbGJhY2tzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPdGhlcndpc2UsIHRoZSBjYWxsYmFjayBpcyBvbmx5IGNhbGxlZCBvbmNlIHBlciBzY2FuLWxpbmUsIGFuZCAgICAgKi8KKyAgLyogICAgb25seSBmb3IgdGhvc2Ugc2NhbmxpbmVzIHRoYXQgZG8gaGF2ZSBgZ3JheScgcGl4ZWxzIG9uIHRoZW0uICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHZvaWQKKyAgKCpGVF9TcGFuRnVuYykoIGludCAgICAgICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGNvdW50LAorICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3BhbiogIHNwYW5zLAorICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgIHVzZXIgKTsKKworI2RlZmluZSBGVF9SYXN0ZXJfU3Bhbl9GdW5jICBGVF9TcGFuRnVuYworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUmFzdGVyX0JpdFRlc3RfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRGVwcmVjYXRlZCwgdW5pbXBsZW1lbnRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIGludAorICAoKkZUX1Jhc3Rlcl9CaXRUZXN0X0Z1bmMpKCBpbnQgICAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICB1c2VyICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9SYXN0ZXJfQml0U2V0X0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBEZXByZWNhdGVkLCB1bmltcGxlbWVudGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgdm9pZAorICAoKkZUX1Jhc3Rlcl9CaXRTZXRfRnVuYykoIGludCAgICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICB1c2VyICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9SQVNURVJfRkxBR19YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGxpc3Qgb2YgYml0IGZsYWcgY29uc3RhbnRzIGFzIHVzZWQgaW4gdGhlIGBmbGFncycgZmllbGQgb2YgYSAgICAgKi8KKyAgLyogICAgQEZUX1Jhc3Rlcl9QYXJhbXMgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUkFTVEVSX0ZMQUdfREVGQVVMVCA6OiBUaGlzIHZhbHVlIGlzIDAuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9SQVNURVJfRkxBR19BQSAgICAgIDo6IFRoaXMgZmxhZyBpcyBzZXQgdG8gaW5kaWNhdGUgdGhhdCBhbiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnRpLWFsaWFzZWQgZ2x5cGggaW1hZ2Ugc2hvdWxkIGJlICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIGJlICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbm9jaHJvbWUgKDEtYml0KS4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1JBU1RFUl9GTEFHX0RJUkVDVCAgOjogVGhpcyBmbGFnIGlzIHNldCB0byBpbmRpY2F0ZSBkaXJlY3QgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZy4gIEluIHRoaXMgbW9kZSwgY2xpZW50ICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbnMgbXVzdCBwcm92aWRlIHRoZWlyIG93biBzcGFuICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suICBUaGlzIGxldHMgdGhlbSBkaXJlY3RseSAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXcgb3IgY29tcG9zZSBvdmVyIGFuIGV4aXN0aW5nIGJpdG1hcC4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIGJpdCBpcyBub3Qgc2V0LCB0aGUgdGFyZ2V0ICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4bWFwJ3MgYnVmZmVyIF9tdXN0XyBiZSB6ZXJvZWQgYmVmb3JlICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0IHJlbmRlcmluZyBpcyBvbmx5IHBvc3NpYmxlIHdpdGggICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFudGktYWxpYXNlZCBnbHlwaHMuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1JBU1RFUl9GTEFHX0NMSVAgICAgOjogVGhpcyBmbGFnIGlzIG9ubHkgdXNlZCBpbiBkaXJlY3QgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZyBtb2RlLiAgSWYgc2V0LCB0aGUgb3V0cHV0IHdpbGwgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjbGlwcGVkIHRvIGEgYm94IHNwZWNpZmllZCBpbiB0aGUgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGNsaXBfYm94JyBmaWVsZCBvZiB0aGUgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBGVF9SYXN0ZXJfUGFyYW1zIHN0cnVjdHVyZS4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGJ5IGRlZmF1bHQsIHRoZSBnbHlwaCBiaXRtYXAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGNsaXBwZWQgdG8gdGhlIHRhcmdldCBwaXhtYXAsIGV4Y2VwdCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBkaXJlY3QgcmVuZGVyaW5nIG1vZGUgd2hlcmUgYWxsIHNwYW5zICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGdlbmVyYXRlZCBpZiBubyBjbGlwcGluZyBib3ggaXMgc2V0LiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfUkFTVEVSX0ZMQUdfREVGQVVMVCAgMHgwCisjZGVmaW5lIEZUX1JBU1RFUl9GTEFHX0FBICAgICAgIDB4MQorI2RlZmluZSBGVF9SQVNURVJfRkxBR19ESVJFQ1QgICAweDIKKyNkZWZpbmUgRlRfUkFTVEVSX0ZMQUdfQ0xJUCAgICAgMHg0CisKKyAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgKi8KKyAgLyogYEZUX1JBU1RFUl9GTEFHX1hYWCcgdmFsdWVzIGluc3RlYWQgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgZnRfcmFzdGVyX2ZsYWdfZGVmYXVsdCAgRlRfUkFTVEVSX0ZMQUdfREVGQVVMVAorI2RlZmluZSBmdF9yYXN0ZXJfZmxhZ19hYSAgICAgICBGVF9SQVNURVJfRkxBR19BQQorI2RlZmluZSBmdF9yYXN0ZXJfZmxhZ19kaXJlY3QgICBGVF9SQVNURVJfRkxBR19ESVJFQ1QKKyNkZWZpbmUgZnRfcmFzdGVyX2ZsYWdfY2xpcCAgICAgRlRfUkFTVEVSX0ZMQUdfQ0xJUAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUmFzdGVyX1BhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgYXJndW1lbnRzIHVzZWQgYnkgYSByYXN0ZXIncyByZW5kZXIgICAgICAgICovCisgIC8qICAgIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHRhcmdldCAgICAgIDo6IFRoZSB0YXJnZXQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc291cmNlICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgZ2x5cGggaW1hZ2UgKGUuZy4sIGFuICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIEBGVF9PdXRsaW5lKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmxhZ3MgICAgICAgOjogVGhlIHJlbmRlcmluZyBmbGFncy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBncmF5X3NwYW5zICA6OiBUaGUgZ3JheSBzcGFuIGRyYXdpbmcgY2FsbGJhY2suICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJsYWNrX3NwYW5zIDo6IFVudXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYml0X3Rlc3QgICAgOjogVW51c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBiaXRfc2V0ICAgICA6OiBVbnVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHVzZXIgICAgICAgIDo6IFVzZXItc3VwcGxpZWQgZGF0YSB0aGF0IGlzIHBhc3NlZCB0byBlYWNoIGRyYXdpbmcgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBjYWxsYmFjay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNsaXBfYm94ICAgIDo6IEFuIG9wdGlvbmFsIGNsaXBwaW5nIGJveC4gIEl0IGlzIG9ubHkgdXNlZCBpbiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBkaXJlY3QgcmVuZGVyaW5nIG1vZGUuICBOb3RlIHRoYXQgY29vcmRpbmF0ZXMgaGVyZSAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGV4cHJlc3NlZCBpbiBfaW50ZWdlcl8gcGl4ZWxzIChhbmQgbm90IGluICovCisgIC8qICAgICAgICAgICAgICAgICAgIDI2LjYgZml4ZWQtcG9pbnQgdW5pdHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFuIGFudGktYWxpYXNlZCBnbHlwaCBiaXRtYXAgaXMgZHJhd24gaWYgdGhlIEBGVF9SQVNURVJfRkxBR19BQSAgICAqLworICAvKiAgICBiaXQgZmxhZyBpcyBzZXQgaW4gdGhlIGBmbGFncycgZmllbGQsIG90aGVyd2lzZSBhIG1vbm9jaHJvbWUgICAgICAgKi8KKyAgLyogICAgYml0bWFwIGlzIGdlbmVyYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJZiB0aGUgQEZUX1JBU1RFUl9GTEFHX0RJUkVDVCBiaXQgZmxhZyBpcyBzZXQgaW4gYGZsYWdzJywgdGhlICAgICAgKi8KKyAgLyogICAgcmFzdGVyIHdpbGwgY2FsbCB0aGUgYGdyYXlfc3BhbnMnIGNhbGxiYWNrIHRvIGRyYXcgZ3JheSBwaXhlbCAgICAgICovCisgIC8qICAgIHNwYW5zLiAgVGhpcyBhbGxvd3MgZGlyZWN0IGNvbXBvc2l0aW9uIG92ZXIgYSBwcmUtZXhpc3RpbmcgYml0bWFwICAqLworICAvKiAgICB0aHJvdWdoIHVzZXItcHJvdmlkZWQgY2FsbGJhY2tzIHRvIHBlcmZvcm0gdGhlIHNwYW4gZHJhd2luZyBhbmQgICAgKi8KKyAgLyogICAgY29tcG9zaXRpb24uICAgIE5vdCBzdXBwb3J0ZWQgYnkgdGhlIG1vbm9jaHJvbWUgcmFzdGVyaXplci4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgRlRfUmFzdGVyX1BhcmFtc18KKyAgeworICAgIGNvbnN0IEZUX0JpdG1hcCogICAgICAgIHRhcmdldDsKKyAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICBzb3VyY2U7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7CisgICAgRlRfU3BhbkZ1bmMgICAgICAgICAgICAgZ3JheV9zcGFuczsKKyAgICBGVF9TcGFuRnVuYyAgICAgICAgICAgICBibGFja19zcGFuczsgIC8qIHVudXNlZCAqLworICAgIEZUX1Jhc3Rlcl9CaXRUZXN0X0Z1bmMgIGJpdF90ZXN0OyAgICAgLyogdW51c2VkICovCisgICAgRlRfUmFzdGVyX0JpdFNldF9GdW5jICAgYml0X3NldDsgICAgICAvKiB1bnVzZWQgKi8KKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICB1c2VyOworICAgIEZUX0JCb3ggICAgICAgICAgICAgICAgIGNsaXBfYm94OworCisgIH0gRlRfUmFzdGVyX1BhcmFtczsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1Jhc3Rlcl9OZXdGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBjcmVhdGUgYSBuZXcgcmFzdGVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1lbW9yeSA6OiBBIGhhbmRsZSB0byB0aGUgbWVtb3J5IGFsbG9jYXRvci4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJhc3RlciA6OiBBIGhhbmRsZSB0byB0aGUgbmV3IHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBgbWVtb3J5JyBwYXJhbWV0ZXIgaXMgYSB0eXBlbGVzcyBwb2ludGVyIGluIG9yZGVyIHRvIGF2b2lkICAgICAqLworICAvKiAgICB1bi13YW50ZWQgZGVwZW5kZW5jaWVzIG9uIHRoZSByZXN0IG9mIHRoZSBGcmVlVHlwZSBjb2RlLiAgSW4gICAgICAgKi8KKyAgLyogICAgcHJhY3RpY2UsIGl0IGlzIGFuIEBGVF9NZW1vcnkgb2JqZWN0LCBpLmUuLCBhIGhhbmRsZSB0byB0aGUgICAgICAgICovCisgIC8qICAgIHN0YW5kYXJkIEZyZWVUeXBlIG1lbW9yeSBhbGxvY2F0b3IuICBIb3dldmVyLCB0aGlzIGZpZWxkIGNhbiBiZSAgICAqLworICAvKiAgICBjb21wbGV0ZWx5IGlnbm9yZWQgYnkgYSBnaXZlbiByYXN0ZXIgaW1wbGVtZW50YXRpb24uICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgaW50CisgICgqRlRfUmFzdGVyX05ld0Z1bmMpKCB2b2lkKiAgICAgICBtZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9SYXN0ZXIqICByYXN0ZXIgKTsKKworI2RlZmluZSBGVF9SYXN0ZXJfTmV3X0Z1bmMgIEZUX1Jhc3Rlcl9OZXdGdW5jCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9SYXN0ZXJfRG9uZUZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gZGVzdHJveSBhIGdpdmVuIHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByYXN0ZXIgOjogQSBoYW5kbGUgdG8gdGhlIHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgdm9pZAorICAoKkZUX1Jhc3Rlcl9Eb25lRnVuYykoIEZUX1Jhc3RlciAgcmFzdGVyICk7CisKKyNkZWZpbmUgRlRfUmFzdGVyX0RvbmVfRnVuYyAgRlRfUmFzdGVyX0RvbmVGdW5jCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9SYXN0ZXJfUmVzZXRGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSB1c2VkIHRvIHByb3ZpZGUgYW4gYXJlYSBvZiBtZW1vcnkgY2FsbGVkIHRoZSBgcmVuZGVyICAgICAgKi8KKyAgLyogICAgcG9vbCcgYXZhaWxhYmxlIHRvIGFsbCByZWdpc3RlcmVkIHJhc3RlcnMuICBUaGlzIHdhcyBub3QgdGhyZWFkICAgICovCisgIC8qICAgIHNhZmUgaG93ZXZlciBhbmQgbm93IEZyZWVUeXBlIG5ldmVyIGFsbG9jYXRlcyB0aGlzIHBvb2wuICBOVUxMICAgICAqLworICAvKiAgICBpcyBhbHdheXMgcGFzc2VkIGluIGFzIHBvb2xfYmFzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGVhY2ggdGltZSB0aGUgcmVuZGVyIHBvb2wgY2hhbmdlcywgb3IganVzdCAqLworICAvKiAgICBhZnRlciBhIG5ldyByYXN0ZXIgb2JqZWN0IGlzIGNyZWF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByYXN0ZXIgICAgOjogQSBoYW5kbGUgdG8gdGhlIG5ldyByYXN0ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBvb2xfYmFzZSA6OiBUaGUgYWRkcmVzcyBpbiBtZW1vcnkgb2YgdGhlIHJlbmRlciBwb29sLiAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcG9vbF9zaXplIDo6IFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZW5kZXIgcG9vbC4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmFzdGVycyBzaG91bGQgaWdub3JlIHRoZSByZW5kZXIgcG9vbCBhbmQgcmVseSBvbiBkeW5hbWljIG9yIHN0YWNrICovCisgIC8qICAgIGFsbG9jYXRpb24gaWYgdGhleSB3YW50IHRvIChhIGhhbmRsZSB0byB0aGUgbWVtb3J5IGFsbG9jYXRvciBpcyAgICAqLworICAvKiAgICBwYXNzZWQgdG8gdGhlIHJhc3RlciBjb25zdHJ1Y3RvcikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgdm9pZAorICAoKkZUX1Jhc3Rlcl9SZXNldEZ1bmMpKCBGVF9SYXN0ZXIgICAgICAgcmFzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiAgcG9vbF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgcG9vbF9zaXplICk7CisKKyNkZWZpbmUgRlRfUmFzdGVyX1Jlc2V0X0Z1bmMgIEZUX1Jhc3Rlcl9SZXNldEZ1bmMKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1Jhc3Rlcl9TZXRNb2RlRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgYSBnZW5lcmljIGZhY2lsaXR5IHRvIGNoYW5nZSBtb2RlcyBvciBhdHRyaWJ1dGVzICAqLworICAvKiAgICBpbiBhIGdpdmVuIHJhc3Rlci4gIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcywgb3IgICAgKi8KKyAgLyogICAgc2ltcGx5IHRvIGFsbG93IGltcGxlbWVudGF0aW9uLXNwZWNpZmljIGBmZWF0dXJlcycgaW4gYSBnaXZlbiAgICAgICovCisgIC8qICAgIHJhc3RlciBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJhc3RlciA6OiBBIGhhbmRsZSB0byB0aGUgbmV3IHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbW9kZSAgIDo6IEEgNC1ieXRlIHRhZyB1c2VkIHRvIG5hbWUgdGhlIG1vZGUgb3IgcHJvcGVydHkuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhcmdzICAgOjogQSBwb2ludGVyIHRvIHRoZSBuZXcgbW9kZS9wcm9wZXJ0eSB0byB1c2UuICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgaW50CisgICgqRlRfUmFzdGVyX1NldE1vZGVGdW5jKSggRlRfUmFzdGVyICAgICAgcmFzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgYXJncyApOworCisjZGVmaW5lIEZUX1Jhc3Rlcl9TZXRfTW9kZV9GdW5jICBGVF9SYXN0ZXJfU2V0TW9kZUZ1bmMKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1Jhc3Rlcl9SZW5kZXJGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEludm9rZSBhIGdpdmVuIHJhc3RlciB0byBzY2FuLWNvbnZlcnQgYSBnaXZlbiBnbHlwaCBpbWFnZSBpbnRvIGEgICAqLworICAvKiAgICB0YXJnZXQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByYXN0ZXIgOjogQSBoYW5kbGUgdG8gdGhlIHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBhcmFtcyA6OiBBIHBvaW50ZXIgdG8gYW4gQEZUX1Jhc3Rlcl9QYXJhbXMgc3RydWN0dXJlIHVzZWQgdG8gICAgICAqLworICAvKiAgICAgICAgICAgICAgc3RvcmUgdGhlIHJlbmRlcmluZyBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgZXhhY3QgZm9ybWF0IG9mIHRoZSBzb3VyY2UgaW1hZ2UgZGVwZW5kcyBvbiB0aGUgcmFzdGVyJ3MgZ2x5cGggKi8KKyAgLyogICAgZm9ybWF0IGRlZmluZWQgaW4gaXRzIEBGVF9SYXN0ZXJfRnVuY3Mgc3RydWN0dXJlLiAgSXQgY2FuIGJlIGFuICAgICovCisgIC8qICAgIEBGVF9PdXRsaW5lIG9yIGFueXRoaW5nIGVsc2UgaW4gb3JkZXIgdG8gc3VwcG9ydCBhIGxhcmdlIGFycmF5IG9mICAqLworICAvKiAgICBnbHlwaCBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE5vdGUgYWxzbyB0aGF0IHRoZSByZW5kZXIgZnVuY3Rpb24gY2FuIGZhaWwgYW5kIHJldHVybiBhICAgICAgICAgICAqLworICAvKiAgICBgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZScgZXJyb3IgY29kZSBpZiB0aGUgcmFzdGVyIHVzZWQgZG9lcyAgKi8KKyAgLyogICAgbm90IHN1cHBvcnQgZGlyZWN0IGNvbXBvc2l0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBYWFg6IEZvciBub3csIHRoZSBzdGFuZGFyZCByYXN0ZXIgZG9lc24ndCBzdXBwb3J0IGRpcmVjdCAgICAgICAgICAgKi8KKyAgLyogICAgICAgICBjb21wb3NpdGlvbiBidXQgdGhpcyBzaG91bGQgY2hhbmdlIGZvciB0aGUgZmluYWwgcmVsZWFzZSAoc2VlICovCisgIC8qICAgICAgICAgdGhlIGZpbGVzIGBkZW1vcy9zcmMvZnRncmF5cy5jJyBhbmQgYGRlbW9zL3NyYy9mdGdyYXlzMi5jJyAgICAqLworICAvKiAgICAgICAgIGZvciBleGFtcGxlcyBvZiBkaXN0aW5jdCBpbXBsZW1lbnRhdGlvbnMgdGhhdCBzdXBwb3J0IGRpcmVjdCAgKi8KKyAgLyogICAgICAgICBjb21wb3NpdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIGludAorICAoKkZUX1Jhc3Rlcl9SZW5kZXJGdW5jKSggRlRfUmFzdGVyICAgICAgICAgICAgICAgIHJhc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1Jhc3Rlcl9QYXJhbXMqICBwYXJhbXMgKTsKKworI2RlZmluZSBGVF9SYXN0ZXJfUmVuZGVyX0Z1bmMgIEZUX1Jhc3Rlcl9SZW5kZXJGdW5jCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9SYXN0ZXJfRnVuY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEEgc3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgYSBnaXZlbiByYXN0ZXIgY2xhc3MgdG8gdGhlIGxpYnJhcnkuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnbHlwaF9mb3JtYXQgIDo6IFRoZSBzdXBwb3J0ZWQgZ2x5cGggZm9ybWF0IGZvciB0aGlzIHJhc3Rlci4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJhc3Rlcl9uZXcgICAgOjogVGhlIHJhc3RlciBjb25zdHJ1Y3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcmFzdGVyX3Jlc2V0ICA6OiBVc2VkIHRvIHJlc2V0IHRoZSByZW5kZXIgcG9vbCB3aXRoaW4gdGhlIHJhc3Rlci4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByYXN0ZXJfcmVuZGVyIDo6IEEgZnVuY3Rpb24gdG8gcmVuZGVyIGEgZ2x5cGggaW50byBhIGdpdmVuIGJpdG1hcC4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJhc3Rlcl9kb25lICAgOjogVGhlIHJhc3RlciBkZXN0cnVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1Jhc3Rlcl9GdW5jc18KKyAgeworICAgIEZUX0dseXBoX0Zvcm1hdCAgICAgICAgZ2x5cGhfZm9ybWF0OworICAgIEZUX1Jhc3Rlcl9OZXdGdW5jICAgICAgcmFzdGVyX25ldzsKKyAgICBGVF9SYXN0ZXJfUmVzZXRGdW5jICAgIHJhc3Rlcl9yZXNldDsKKyAgICBGVF9SYXN0ZXJfU2V0TW9kZUZ1bmMgIHJhc3Rlcl9zZXRfbW9kZTsKKyAgICBGVF9SYXN0ZXJfUmVuZGVyRnVuYyAgIHJhc3Rlcl9yZW5kZXI7CisgICAgRlRfUmFzdGVyX0RvbmVGdW5jICAgICByYXN0ZXJfZG9uZTsKKworICB9IEZUX1Jhc3Rlcl9GdW5jczsKKworICAvKiAqLworCisKK0ZUX0VORF9IRUFERVIKKworI2VuZGlmIC8qIF9fRlRJTUFHRV9IX18gKi8KKworCisvKiBFTkQgKi8KKworCisvKiBMb2NhbCBWYXJpYWJsZXM6ICovCisvKiBjb2Rpbmc6IHV0Zi04ICAgICovCisvKiBFbmQ6ICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0aW5jcmVtLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0aW5jcmVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQwYWYyNQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRpbmNyZW0uaApAQCAtMCwwICsxLDM1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRpbmNyZW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWVUeXBlIGluY3JlbWVudGFsIGxvYWRpbmcgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAyLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fRlRJTkNSRU1fSF9fCisjZGVmaW5lIF9fRlRJTkNSRU1fSF9fCisKKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAorCisjaWZkZWYgRlJFRVRZUEVfSAorI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKKyNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgorI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCisjZW5kaWYKKworCitGVF9CRUdJTl9IRUFERVIKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzZWN0aW9uOgorICAgKiAgICBpbmNyZW1lbnRhbAorICAgKgorICAgKiBAdGl0bGU6CisgICAqICAgIEluY3JlbWVudGFsIExvYWRpbmcKKyAgICoKKyAgICogQGFic3RyYWN0OgorICAgKiAgICBDdXN0b20gR2x5cGggTG9hZGluZy4KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB2YXJpb3VzIGZ1bmN0aW9ucyB1c2VkIHRvIHBlcmZvcm0gc28tY2FsbGVkCisgICAqICAgYGluY3JlbWVudGFsJyBnbHlwaCBsb2FkaW5nLiAgVGhpcyBpcyBhIG1vZGUgd2hlcmUgYWxsIGdseXBocyBsb2FkZWQKKyAgICogICBmcm9tIGEgZ2l2ZW4gQEZUX0ZhY2UgYXJlIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgYXBwbGljYXRpb24uCisgICAqCisgICAqICAgQXBhcnQgZnJvbSB0aGF0LCBhbGwgb3RoZXIgdGFibGVzIGFyZSBsb2FkZWQgbm9ybWFsbHkgZnJvbSB0aGUgZm9udAorICAgKiAgIGZpbGUuICBUaGlzIG1vZGUgaXMgdXNlZnVsIHdoZW4gRnJlZVR5cGUgaXMgdXNlZCB3aXRoaW4gYW5vdGhlcgorICAgKiAgIGVuZ2luZSwgZS5nLiwgYSBQb3N0U2NyaXB0IEltYWdpbmcgUHJvY2Vzc29yLgorICAgKgorICAgKiAgIFRvIGVuYWJsZSB0aGlzIG1vZGUsIHlvdSBtdXN0IHVzZSBARlRfT3Blbl9GYWNlLCBwYXNzaW5nIGFuCisgICAqICAgQEZUX1BhcmFtZXRlciB3aXRoIHRoZSBARlRfUEFSQU1fVEFHX0lOQ1JFTUVOVEFMIHRhZyBhbmQgYW4KKyAgICogICBARlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlIHZhbHVlLiAgU2VlIHRoZSBjb21tZW50cyBmb3IKKyAgICogICBARlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjIGZvciBhbiBleGFtcGxlLgorICAgKgorICAgKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHR5cGU6CisgICAqICAgRlRfSW5jcmVtZW50YWwKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEFuIG9wYXF1ZSB0eXBlIGRlc2NyaWJpbmcgYSB1c2VyLXByb3ZpZGVkIG9iamVjdCB1c2VkIHRvIGltcGxlbWVudAorICAgKiAgIGBpbmNyZW1lbnRhbCcgZ2x5cGggbG9hZGluZyB3aXRoaW4gRnJlZVR5cGUuICBUaGlzIGlzIHVzZWQgdG8gc3VwcG9ydAorICAgKiAgIGVtYmVkZGVkIGZvbnRzIGluIGNlcnRhaW4gZW52aXJvbm1lbnRzIChlLmcuLCBQb3N0U2NyaXB0IGludGVycHJldGVycyksCisgICAqICAgd2hlcmUgdGhlIGdseXBoIGRhdGEgaXNuJ3QgaW4gdGhlIGZvbnQgZmlsZSwgb3IgbXVzdCBiZSBvdmVycmlkZGVuIGJ5CisgICAqICAgZGlmZmVyZW50IHZhbHVlcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgSXQgaXMgdXAgdG8gY2xpZW50IGFwcGxpY2F0aW9ucyB0byBjcmVhdGUgYW5kIGltcGxlbWVudCBARlRfSW5jcmVtZW50YWwKKyAgICogICBvYmplY3RzLCBhcyBsb25nIGFzIHRoZXkgcHJvdmlkZSBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBtZXRob2RzCisgICAqICAgQEZUX0luY3JlbWVudGFsX0dldEdseXBoRGF0YUZ1bmMsIEBGVF9JbmNyZW1lbnRhbF9GcmVlR2x5cGhEYXRhRnVuYworICAgKiAgIGFuZCBARlRfSW5jcmVtZW50YWxfR2V0R2x5cGhNZXRyaWNzRnVuYy4KKyAgICoKKyAgICogICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIEBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2VSZWMgdG8gdW5kZXJzdGFuZCBob3cKKyAgICogICB0byB1c2UgaW5jcmVtZW50YWwgb2JqZWN0cyB3aXRoIEZyZWVUeXBlLgorICAgKgorICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgRlRfSW5jcmVtZW50YWxSZWNfKiAgRlRfSW5jcmVtZW50YWw7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRfSW5jcmVtZW50YWxfTWV0cmljc1JlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBzbWFsbCBzdHJ1Y3R1cmUgdXNlZCB0byBjb250YWluIHRoZSBiYXNpYyBnbHlwaCBtZXRyaWNzIHJldHVybmVkCisgICAqICAgYnkgdGhlIEBGVF9JbmNyZW1lbnRhbF9HZXRHbHlwaE1ldHJpY3NGdW5jIG1ldGhvZC4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBiZWFyaW5nX3ggOjoKKyAgICogICAgIExlZnQgYmVhcmluZywgaW4gZm9udCB1bml0cy4KKyAgICoKKyAgICogICBiZWFyaW5nX3kgOjoKKyAgICogICAgIFRvcCBiZWFyaW5nLCBpbiBmb250IHVuaXRzLgorICAgKgorICAgKiAgIGFkdmFuY2UgOjoKKyAgICogICAgIEhvcml6b250YWwgY29tcG9uZW50IG9mIGdseXBoIGFkdmFuY2UsIGluIGZvbnQgdW5pdHMuCisgICAqCisgICAqICAgYWR2YW5jZV92IDo6CisgICAqICAgICBWZXJ0aWNhbCBjb21wb25lbnQgb2YgZ2x5cGggYWR2YW5jZSwgaW4gZm9udCB1bml0cy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhlc2UgY29ycmVzcG9uZCB0byBob3Jpem9udGFsIG9yIHZlcnRpY2FsIG1ldHJpY3MgZGVwZW5kaW5nIG9uIHRoZQorICAgKiAgIHZhbHVlIG9mIHRoZSBgdmVydGljYWwnIGFyZ3VtZW50IHRvIHRoZSBmdW5jdGlvbgorICAgKiAgIEBGVF9JbmNyZW1lbnRhbF9HZXRHbHlwaE1ldHJpY3NGdW5jLgorICAgKgorICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0luY3JlbWVudGFsX01ldHJpY3NSZWNfCisgIHsKKyAgICBGVF9Mb25nICBiZWFyaW5nX3g7CisgICAgRlRfTG9uZyAgYmVhcmluZ195OworICAgIEZUX0xvbmcgIGFkdmFuY2U7CisgICAgRlRfTG9uZyAgYWR2YW5jZV92OyAgICAgLyogc2luY2UgMi4zLjEyICovCisKKyAgfSBGVF9JbmNyZW1lbnRhbF9NZXRyaWNzUmVjOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIEZUX0luY3JlbWVudGFsX01ldHJpY3MKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgaGFuZGxlIHRvIGFuIEBGVF9JbmNyZW1lbnRhbF9NZXRyaWNzUmVjIHN0cnVjdHVyZS4KKyAgICoKKyAgICovCisgICB0eXBlZGVmIHN0cnVjdCBGVF9JbmNyZW1lbnRhbF9NZXRyaWNzUmVjXyogIEZUX0luY3JlbWVudGFsX01ldHJpY3M7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOgorICAgKiAgIEZUX0luY3JlbWVudGFsX0dldEdseXBoRGF0YUZ1bmMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgZnVuY3Rpb24gY2FsbGVkIGJ5IEZyZWVUeXBlIHRvIGFjY2VzcyBhIGdpdmVuIGdseXBoJ3MgZGF0YSBieXRlcworICAgKiAgIGR1cmluZyBARlRfTG9hZF9HbHlwaCBvciBARlRfTG9hZF9DaGFyIGlmIGluY3JlbWVudGFsIGxvYWRpbmcgaXMKKyAgICogICBlbmFibGVkLgorICAgKgorICAgKiAgIE5vdGUgdGhhdCB0aGUgZm9ybWF0IG9mIHRoZSBnbHlwaCdzIGRhdGEgYnl0ZXMgZGVwZW5kcyBvbiB0aGUgZm9udAorICAgKiAgIGZpbGUgZm9ybWF0LiAgRm9yIFRydWVUeXBlLCBpdCBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIHJhdyBieXRlcyB3aXRoaW4KKyAgICogICB0aGUgYGdseWYnIHRhYmxlLiAgRm9yIFBvc3RTY3JpcHQgZm9ybWF0cywgaXQgbXVzdCBjb3JyZXNwb25kIHRvIHRoZQorICAgKiAgICp1bmVuY3J5cHRlZCogY2hhcnN0cmluZyBieXRlcywgd2l0aG91dCBhbnkgYGxlbklWJyBoZWFkZXIuICBJdCBpcworICAgKiAgIHVuZGVmaW5lZCBmb3IgYW55IG90aGVyIGZvcm1hdC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGluY3JlbWVudGFsIDo6CisgICAqICAgICBIYW5kbGUgdG8gYW4gb3BhcXVlIEBGVF9JbmNyZW1lbnRhbCBoYW5kbGUgcHJvdmlkZWQgYnkgdGhlIGNsaWVudAorICAgKiAgICAgYXBwbGljYXRpb24uCisgICAqCisgICAqICAgZ2x5cGhfaW5kZXggOjoKKyAgICogICAgIEluZGV4IG9mIHJlbGV2YW50IGdseXBoLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIGFkYXRhIDo6CisgICAqICAgICBBIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSByZXR1cm5lZCBnbHlwaCBkYXRhIGJ5dGVzICh3aGljaCB3aWxsIGJlCisgICAqICAgICBhY2Nlc3NlZCBhcyBhIHJlYWQtb25seSBieXRlIGJsb2NrKS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgc3VjY2Vzc2Z1bGx5IHRoZSBtZXRob2QKKyAgICogICBARlRfSW5jcmVtZW50YWxfRnJlZUdseXBoRGF0YUZ1bmMgd2lsbCBiZSBjYWxsZWQgbGF0ZXIgdG8gcmVsZWFzZQorICAgKiAgIHRoZSBkYXRhIGJ5dGVzLgorICAgKgorICAgKiAgIE5lc3RlZCBjYWxscyB0byBARlRfSW5jcmVtZW50YWxfR2V0R2x5cGhEYXRhRnVuYyBjYW4gaGFwcGVuIGZvcgorICAgKiAgIGNvbXBvdW5kIGdseXBocy4KKyAgICoKKyAgICovCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpGVF9JbmNyZW1lbnRhbF9HZXRHbHlwaERhdGFGdW5jKSggRlRfSW5jcmVtZW50YWwgIGluY3JlbWVudGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RhdGEqICAgICAgICBhZGF0YSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBGVF9JbmNyZW1lbnRhbF9GcmVlR2x5cGhEYXRhRnVuYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBmdW5jdGlvbiB1c2VkIHRvIHJlbGVhc2UgdGhlIGdseXBoIGRhdGEgYnl0ZXMgcmV0dXJuZWQgYnkgYQorICAgKiAgIHN1Y2Nlc3NmdWwgY2FsbCB0byBARlRfSW5jcmVtZW50YWxfR2V0R2x5cGhEYXRhRnVuYy4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGluY3JlbWVudGFsIDo6CisgICAqICAgICBBIGhhbmRsZSB0byBhbiBvcGFxdWUgQEZUX0luY3JlbWVudGFsIGhhbmRsZSBwcm92aWRlZCBieSB0aGUgY2xpZW50CisgICAqICAgICBhcHBsaWNhdGlvbi4KKyAgICoKKyAgICogICBkYXRhIDo6CisgICAqICAgICBBIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBnbHlwaCBkYXRhIGJ5dGVzICh3aGljaCB3aWxsIGJlIGFjY2Vzc2VkCisgICAqICAgICBhcyBhIHJlYWQtb25seSBieXRlIGJsb2NrKS4KKyAgICoKKyAgICovCisgIHR5cGVkZWYgdm9pZAorICAoKkZUX0luY3JlbWVudGFsX0ZyZWVHbHlwaERhdGFGdW5jKSggRlRfSW5jcmVtZW50YWwgIGluY3JlbWVudGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRGF0YSogICAgICAgIGRhdGEgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHR5cGU6CisgICAqICAgRlRfSW5jcmVtZW50YWxfR2V0R2x5cGhNZXRyaWNzRnVuYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBmdW5jdGlvbiB1c2VkIHRvIHJldHJpZXZlIHRoZSBiYXNpYyBtZXRyaWNzIG9mIGEgZ2l2ZW4gZ2x5cGggaW5kZXgKKyAgICogICBiZWZvcmUgYWNjZXNzaW5nIGl0cyBkYXRhLiAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSwgaW4gY2VydGFpbgorICAgKiAgIGZvcm1hdHMgbGlrZSBUcnVlVHlwZSwgdGhlIG1ldHJpY3MgYXJlIHN0b3JlZCBpbiBhIGRpZmZlcmVudCBwbGFjZSBmcm9tCisgICAqICAgdGhlIGdseXBoIGltYWdlcyBwcm9wZXIuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBpbmNyZW1lbnRhbCA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gYW4gb3BhcXVlIEBGVF9JbmNyZW1lbnRhbCBoYW5kbGUgcHJvdmlkZWQgYnkgdGhlIGNsaWVudAorICAgKiAgICAgYXBwbGljYXRpb24uCisgICAqCisgICAqICAgZ2x5cGhfaW5kZXggOjoKKyAgICogICAgIEluZGV4IG9mIHJlbGV2YW50IGdseXBoLgorICAgKgorICAgKiAgIHZlcnRpY2FsIDo6CisgICAqICAgICBJZiB0cnVlLCByZXR1cm4gdmVydGljYWwgbWV0cmljcy4KKyAgICoKKyAgICogICBhbWV0cmljcyA6OgorICAgKiAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0LgorICAgKiAgICAgVGhlIG9yaWdpbmFsIGdseXBoIG1ldHJpY3MsIGlmIGFueSwgaW4gZm9udCB1bml0cy4gIElmIG1ldHJpY3MgYXJlCisgICAqICAgICBub3QgYXZhaWxhYmxlIGFsbCB0aGUgdmFsdWVzIG11c3QgYmUgc2V0IHRvIHplcm8uCisgICAqCisgICAqIEBvdXRwdXQ6CisgICAqICAgYW1ldHJpY3MgOjoKKyAgICogICAgIFRoZSByZXBsYWNlbWVudCBnbHlwaCBtZXRyaWNzIGluIGZvbnQgdW5pdHMuCisgICAqCisgICAqLworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqRlRfSW5jcmVtZW50YWxfR2V0R2x5cGhNZXRyaWNzRnVuYykKKyAgICAgICAgICAgICAgICAgICAgICAoIEZUX0luY3JlbWVudGFsICAgICAgICAgICAgICBpbmNyZW1lbnRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX0luY3JlbWVudGFsX01ldHJpY3NSZWMgICphbWV0cmljcyApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRfSW5jcmVtZW50YWxfRnVuY3NSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgdGFibGUgb2YgZnVuY3Rpb25zIGZvciBhY2Nlc3NpbmcgZm9udHMgdGhhdCBsb2FkIGRhdGEKKyAgICogICBpbmNyZW1lbnRhbGx5LiAgVXNlZCBpbiBARlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIGdldF9nbHlwaF9kYXRhIDo6CisgICAqICAgICBUaGUgZnVuY3Rpb24gdG8gZ2V0IGdseXBoIGRhdGEuICBNdXN0IG5vdCBiZSBudWxsLgorICAgKgorICAgKiAgIGZyZWVfZ2x5cGhfZGF0YSA6OgorICAgKiAgICAgVGhlIGZ1bmN0aW9uIHRvIHJlbGVhc2UgZ2x5cGggZGF0YS4gIE11c3Qgbm90IGJlIG51bGwuCisgICAqCisgICAqICAgZ2V0X2dseXBoX21ldHJpY3MgOjoKKyAgICogICAgIFRoZSBmdW5jdGlvbiB0byBnZXQgZ2x5cGggbWV0cmljcy4gIE1heSBiZSBudWxsIGlmIHRoZSBmb250IGRvZXMKKyAgICogICAgIG5vdCBwcm92aWRlIG92ZXJyaWRpbmcgZ2x5cGggbWV0cmljcy4KKyAgICoKKyAgICovCisgIHR5cGVkZWYgc3RydWN0ICBGVF9JbmNyZW1lbnRhbF9GdW5jc1JlY18KKyAgeworICAgIEZUX0luY3JlbWVudGFsX0dldEdseXBoRGF0YUZ1bmMgICAgIGdldF9nbHlwaF9kYXRhOworICAgIEZUX0luY3JlbWVudGFsX0ZyZWVHbHlwaERhdGFGdW5jICAgIGZyZWVfZ2x5cGhfZGF0YTsKKyAgICBGVF9JbmNyZW1lbnRhbF9HZXRHbHlwaE1ldHJpY3NGdW5jICBnZXRfZ2x5cGhfbWV0cmljczsKKworICB9IEZUX0luY3JlbWVudGFsX0Z1bmNzUmVjOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIEZUX0luY3JlbWVudGFsX0ludGVyZmFjZVJlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBzdHJ1Y3R1cmUgdG8gYmUgdXNlZCB3aXRoIEBGVF9PcGVuX0ZhY2UgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdXNlcgorICAgKiAgIHdhbnRzIHRvIHN1cHBvcnQgaW5jcmVtZW50YWwgZ2x5cGggbG9hZGluZy4gIFlvdSBzaG91bGQgdXNlIGl0IHdpdGgKKyAgICogICBARlRfUEFSQU1fVEFHX0lOQ1JFTUVOVEFMIGFzIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKyAgICoKKyAgICogICAgIHsKKyAgICogICAgICAgRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjICBpbmNfaW50OworICAgKiAgICAgICBGVF9QYXJhbWV0ZXIgICAgICAgICAgICAgICAgIHBhcmFtZXRlcjsKKyAgICogICAgICAgRlRfT3Blbl9BcmdzICAgICAgICAgICAgICAgICBvcGVuX2FyZ3M7CisgICAqCisgICAqCisgICAqICAgICAgIC8vIHNldCB1cCBpbmNyZW1lbnRhbCBkZXNjcmlwdG9yCisgICAqICAgICAgIGluY19pbnQuZnVuY3MgID0gbXlfZnVuY3M7CisgICAqICAgICAgIGluY19pbnQub2JqZWN0ID0gbXlfb2JqZWN0OworICAgKgorICAgKiAgICAgICAvLyBzZXQgdXAgb3B0aW9uYWwgcGFyYW1ldGVyCisgICAqICAgICAgIHBhcmFtZXRlci50YWcgID0gRlRfUEFSQU1fVEFHX0lOQ1JFTUVOVEFMOworICAgKiAgICAgICBwYXJhbWV0ZXIuZGF0YSA9ICZpbmNfaW50OworICAgKgorICAgKiAgICAgICAvLyBzZXQgdXAgRlRfT3Blbl9BcmdzIHN0cnVjdHVyZQorICAgKiAgICAgICBvcGVuX2FyZ3MuZmxhZ3MgICAgICA9IEZUX09QRU5fUEFUSE5BTUUgfCBGVF9PUEVOX1BBUkFNUzsKKyAgICogICAgICAgb3Blbl9hcmdzLnBhdGhuYW1lICAgPSBteV9mb250X3BhdGhuYW1lOworICAgKiAgICAgICBvcGVuX2FyZ3MubnVtX3BhcmFtcyA9IDE7CisgICAqICAgICAgIG9wZW5fYXJncy5wYXJhbXMgICAgID0gJnBhcmFtZXRlcjsgLy8gd2UgdXNlIG9uZSBvcHRpb25hbCBhcmd1bWVudAorICAgKgorICAgKiAgICAgICAvLyBvcGVuIHRoZSBmb250CisgICAqICAgICAgIGVycm9yID0gRlRfT3Blbl9GYWNlKCBsaWJyYXJ5LCAmb3Blbl9hcmdzLCBpbmRleCwgJmZhY2UgKTsKKyAgICogICAgICAgLi4uCisgICAqICAgICB9CisgICAqCisgICAqLworICB0eXBlZGVmIHN0cnVjdCAgRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjXworICB7CisgICAgY29uc3QgRlRfSW5jcmVtZW50YWxfRnVuY3NSZWMqICBmdW5jczsKKyAgICBGVF9JbmNyZW1lbnRhbCAgICAgICAgICAgICAgICAgIG9iamVjdDsKKworICB9IEZUX0luY3JlbWVudGFsX0ludGVyZmFjZVJlYzsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHR5cGU6CisgICAqICAgRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIHBvaW50ZXIgdG8gYW4gQEZUX0luY3JlbWVudGFsX0ludGVyZmFjZVJlYyBzdHJ1Y3R1cmUuCisgICAqCisgICAqLworICB0eXBlZGVmIEZUX0luY3JlbWVudGFsX0ludGVyZmFjZVJlYyogICBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2U7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBjb25zdGFudDoKKyAgICogICBGVF9QQVJBTV9UQUdfSU5DUkVNRU5UQUwKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgY29uc3RhbnQgdXNlZCBhcyB0aGUgdGFnIG9mIEBGVF9QYXJhbWV0ZXIgc3RydWN0dXJlcyB0byBpbmRpY2F0ZQorICAgKiAgIGFuIGluY3JlbWVudGFsIGxvYWRpbmcgb2JqZWN0IHRvIGJlIHVzZWQgYnkgRnJlZVR5cGUuCisgICAqCisgICAqLworI2RlZmluZSBGVF9QQVJBTV9UQUdfSU5DUkVNRU5UQUwgIEZUX01BS0VfVEFHKCAnaScsICduJywgJ2MnLCAncicgKQorCisgIC8qICovCisKKworRlRfRU5EX0hFQURFUgorCisjZW5kaWYgLyogX19GVElOQ1JFTV9IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRsY2RmaWwuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRsY2RmaWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2Q5OTlhCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGxjZGZpbC5oCkBAIC0wLDAgKzEsMjUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBmdGxjZGZpbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnJlZVR5cGUgQVBJIGZvciBjb2xvciBmaWx0ZXJpbmcgb2Ygc3VicGl4ZWwgYml0bWFwIGdseXBocyAgICAgICAgICAgKi8KKy8qICAgIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDA2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fRlRfTENEX0ZJTFRFUl9IX18KKyNkZWZpbmUgX19GVF9MQ0RfRklMVEVSX0hfXworCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKworI2lmZGVmIEZSRUVUWVBFX0gKKyNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCisjZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKKyNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgorI2VuZGlmCisKKworRlRfQkVHSU5fSEVBREVSCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc2VjdGlvbjoKKyAgICogICBsY2RfZmlsdGVyaW5nCisgICAqCisgICAqIEB0aXRsZToKKyAgICogICBMQ0QgRmlsdGVyaW5nCisgICAqCisgICAqIEBhYnN0cmFjdDoKKyAgICogICBSZWR1Y2UgY29sb3IgZnJpbmdlcyBvZiBMQ0Qtb3B0aW1pemVkIGJpdG1hcHMuCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGUgQEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyIEFQSSBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbG93LXBhc3MKKyAgICogICBmaWx0ZXIsIHdoaWNoIGlzIHRoZW4gYXBwbGllZCB0byBMQ0Qtb3B0aW1pemVkIGJpdG1hcHMgZ2VuZXJhdGVkCisgICAqICAgdGhyb3VnaCBARlRfUmVuZGVyX0dseXBoLiAgVGhpcyBpcyB1c2VmdWwgdG8gcmVkdWNlIGNvbG9yIGZyaW5nZXMKKyAgICogICB0aGF0IHdvdWxkIG9jY3VyIHdpdGggdW5maWx0ZXJlZCByZW5kZXJpbmcuCisgICAqCisgICAqICAgTm90ZSB0aGF0IG5vIGZpbHRlciBpcyBhY3RpdmUgYnkgZGVmYXVsdCwgYW5kIHRoYXQgdGhpcyBmdW5jdGlvbiBpcworICAgKiAgICpub3QqIGltcGxlbWVudGVkIGluIGRlZmF1bHQgYnVpbGRzIG9mIHRoZSBsaWJyYXJ5LiAgWW91IG5lZWQgdG8KKyAgICogICAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HIGluIHlvdXIgYGZ0b3B0aW9uLmgnIGZpbGUKKyAgICogICBpbiBvcmRlciB0byBhY3RpdmF0ZSBpdC4KKyAgICoKKyAgICogICBGcmVlVHlwZSBnZW5lcmF0ZXMgYWxwaGEgY292ZXJhZ2UgbWFwcywgd2hpY2ggYXJlIGxpbmVhciBieSBuYXR1cmUuCisgICAqICAgRm9yIGluc3RhbmNlLCB0aGUgdmFsdWUgMHg4MCBpbiBiaXRtYXAgcmVwcmVzZW50YXRpb24gbWVhbnMgdGhhdAorICAgKiAgICh3aXRoaW4gbnVtZXJpY2FsIHByZWNpc2lvbikgMHg4MC8weEZGIGZyYWN0aW9uIG9mIHRoYXQgcGl4ZWwgaXMKKyAgICogICBjb3ZlcmVkIGJ5IHRoZSBnbHlwaCdzIG91dGxpbmUuICBUaGUgYmxlbmRpbmcgZnVuY3Rpb24gZm9yIHBsYWNpbmcKKyAgICogICB0ZXh0IG92ZXIgYSBiYWNrZ3JvdW5kIGlzCisgICAqCisgICAqICAgeworICAgKiAgICAgZHN0ID0gYWxwaGEgKiBzcmMgKyAoMSAtIGFscGhhKSAqIGRzdCAgICAsCisgICAqICAgfQorICAgKgorICAgKiAgIHdoaWNoIGlzIGtub3duIGFzIE9WRVIuICBIb3dldmVyLCB3aGVuIGNhbGN1bGF0aW5nIHRoZSBvdXRwdXQgb2YgdGhlCisgICAqICAgT1ZFUiBvcGVyYXRvciwgdGhlIHNvdXJjZSBjb2xvcnMgc2hvdWxkIGZpcnN0IGJlIHRyYW5zZm9ybWVkIHRvIGEKKyAgICogICBsaW5lYXIgY29sb3Igc3BhY2UsIHRoZW4gYWxwaGEgYmxlbmRlZCBpbiB0aGF0IHNwYWNlLCBhbmQgdHJhbnNmb3JtZWQKKyAgICogICBiYWNrIHRvIHRoZSBvdXRwdXQgY29sb3Igc3BhY2UuCisgICAqCisgICAqICAgV2hlbiBsaW5lYXIgbGlnaHQgYmxlbmRpbmcgaXMgdXNlZCwgdGhlIGRlZmF1bHQgRklSNSBmaWx0ZXJpbmcKKyAgICogICB3ZWlnaHRzIChhcyBnaXZlbiBieSBGVF9MQ0RfRklMVEVSX0RFRkFVTFQpIGFyZSBubyBsb25nZXIgb3B0aW1hbCwgYXMKKyAgICogICB0aGV5IGhhdmUgYmVlbiBkZXNpZ25lZCBmb3IgYmxhY2sgb24gd2hpdGUgcmVuZGVyaW5nIHdoaWxlIGxhY2tpbmcKKyAgICogICBnYW1tYSBjb3JyZWN0aW9uLiAgVG8gcHJlc2VydmUgY29sb3IgbmV1dHJhbGl0eSwgd2VpZ2h0cyBmb3IgYSBGSVI1CisgICAqICAgZmlsdGVyIHNob3VsZCBiZSBjaG9zZW4gYWNjb3JkaW5nIHRvIHR3byBmcmVlIHBhcmFtZXRlcnMgYGEnIGFuZCBgYycsCisgICAqICAgYW5kIHRoZSBGSVIgd2VpZ2h0cyBzaG91bGQgYmUKKyAgICoKKyAgICogICB7CisgICAqICAgICBbYSAtIGMsIGEgKyBjLCAyICogYSwgYSArIGMsIGEgLSBjXSAgICAuCisgICAqICAgfQorICAgKgorICAgKiAgIFRoaXMgZm9ybXVsYSBnZW5lcmF0ZXMgZXF1YWwgd2VpZ2h0cyBmb3IgYWxsIHRoZSBjb2xvciBwcmltYXJpZXMKKyAgICogICBhY3Jvc3MgdGhlIGZpbHRlciBrZXJuZWwsIHdoaWNoIG1ha2VzIGl0IGNvbG9ybGVzcy4gIE9uZSBzdWdnZXN0ZWQKKyAgICogICBzZXQgb2Ygd2VpZ2h0cyBpcworICAgKgorICAgKiAgIHsKKyAgICogICAgIFsweDEwLCAweDUwLCAweDYwLCAweDUwLCAweDEwXSAgICAsCisgICAqICAgfQorICAgKgorICAgKiAgIHdoZXJlIGBhJyBoYXMgdmFsdWUgMHgzMCBhbmQgYGInIHZhbHVlIDB4MjAuICBUaGUgd2VpZ2h0cyBpbiBmaWx0ZXIKKyAgICogICBtYXkgaGF2ZSBhIHN1bSBsYXJnZXIgdGhhbiAweDEwMCwgd2hpY2ggaW5jcmVhc2VzIGNvbG9yYXRpb24gc2xpZ2h0bHkKKyAgICogICBidXQgYWxzbyBpbXByb3ZlcyBjb250cmFzdC4KKyAgICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZW51bToKKyAgICogICBGVF9MY2RGaWx0ZXIKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgbGlzdCBvZiB2YWx1ZXMgdG8gaWRlbnRpZnkgdmFyaW91cyB0eXBlcyBvZiBMQ0QgZmlsdGVycy4KKyAgICoKKyAgICogQHZhbHVlczoKKyAgICogICBGVF9MQ0RfRklMVEVSX05PTkUgOjoKKyAgICogICAgIERvIG5vdCBwZXJmb3JtIGZpbHRlcmluZy4gIFdoZW4gdXNlZCB3aXRoIHN1YnBpeGVsIHJlbmRlcmluZywgdGhpcworICAgKiAgICAgcmVzdWx0cyBpbiBzb21ldGltZXMgc2V2ZXJlIGNvbG9yIGZyaW5nZXMuCisgICAqCisgICAqICAgRlRfTENEX0ZJTFRFUl9ERUZBVUxUIDo6CisgICAqICAgICBUaGUgZGVmYXVsdCBmaWx0ZXIgcmVkdWNlcyBjb2xvciBmcmluZ2VzIGNvbnNpZGVyYWJseSwgYXQgdGhlIGNvc3QKKyAgICogICAgIG9mIGEgc2xpZ2h0IGJsdXJyaW5lc3MgaW4gdGhlIG91dHB1dC4KKyAgICoKKyAgICogICBGVF9MQ0RfRklMVEVSX0xJR0hUIDo6CisgICAqICAgICBUaGUgbGlnaHQgZmlsdGVyIGlzIGEgdmFyaWFudCB0aGF0IHByb2R1Y2VzIGxlc3MgYmx1cnJpbmVzcyBhdCB0aGUKKyAgICogICAgIGNvc3Qgb2Ygc2xpZ2h0bHkgbW9yZSBjb2xvciBmcmluZ2VzIHRoYW4gdGhlIGRlZmF1bHQgb25lLiAgSXQgbWlnaHQKKyAgICogICAgIGJlIGJldHRlciwgZGVwZW5kaW5nIG9uIHRhc3RlLCB5b3VyIG1vbml0b3IsIG9yIHlvdXIgcGVyc29uYWwgdmlzaW9uLgorICAgKgorICAgKiAgIEZUX0xDRF9GSUxURVJfTEVHQUNZIDo6CisgICAqICAgICBUaGlzIGZpbHRlciBjb3JyZXNwb25kcyB0byB0aGUgb3JpZ2luYWwgbGliWGZ0IGNvbG9yIGZpbHRlci4gIEl0CisgICAqICAgICBwcm92aWRlcyBoaWdoIGNvbnRyYXN0IG91dHB1dCBidXQgY2FuIGV4aGliaXQgcmVhbGx5IGJhZCBjb2xvcgorICAgKiAgICAgZnJpbmdlcyBpZiBnbHlwaHMgYXJlIG5vdCBleHRyZW1lbHkgd2VsbCBoaW50ZWQgdG8gdGhlIHBpeGVsIGdyaWQuCisgICAqICAgICBJbiBvdGhlciB3b3JkcywgaXQgb25seSB3b3JrcyB3ZWxsIGlmIHRoZSBUcnVlVHlwZSBieXRlY29kZQorICAgKiAgICAgaW50ZXJwcmV0ZXIgaXMgZW5hYmxlZCAqYW5kKiBoaWdoLXF1YWxpdHkgaGludGVkIGZvbnRzIGFyZSB1c2VkLgorICAgKgorICAgKiAgICAgVGhpcyBmaWx0ZXIgaXMgb25seSBwcm92aWRlZCBmb3IgY29tcGFyaXNvbiBwdXJwb3NlcywgYW5kIG1pZ2h0IGJlCisgICAqICAgICBkaXNhYmxlZCBvciBzdGF5IHVuc3VwcG9ydGVkIGluIHRoZSBmdXR1cmUuCisgICAqCisgICAqIEBzaW5jZToKKyAgICogICAyLjMuMAorICAgKi8KKyAgdHlwZWRlZiBlbnVtICBGVF9MY2RGaWx0ZXJfCisgIHsKKyAgICBGVF9MQ0RfRklMVEVSX05PTkUgICAgPSAwLAorICAgIEZUX0xDRF9GSUxURVJfREVGQVVMVCA9IDEsCisgICAgRlRfTENEX0ZJTFRFUl9MSUdIVCAgID0gMiwKKyAgICBGVF9MQ0RfRklMVEVSX0xFR0FDWSAgPSAxNiwKKworICAgIEZUX0xDRF9GSUxURVJfTUFYICAgLyogZG8gbm90IHJlbW92ZSAqLworCisgIH0gRlRfTGNkRmlsdGVyOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jOgorICAgKiAgIEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYXBwbHkgY29sb3IgZmlsdGVyaW5nIHRvIExDRCBkZWNpbWF0ZWQKKyAgICogICBiaXRtYXBzLCBsaWtlIHRoZSBvbmVzIHVzZWQgd2hlbiBjYWxsaW5nIEBGVF9SZW5kZXJfR2x5cGggd2l0aAorICAgKiAgIEBGVF9SRU5ERVJfTU9ERV9MQ0Qgb3IgQEZUX1JFTkRFUl9NT0RFX0xDRF9WLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgbGlicmFyeSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBsaWJyYXJ5IGluc3RhbmNlLgorICAgKgorICAgKiAgIGZpbHRlciA6OgorICAgKiAgICAgVGhlIGZpbHRlciB0eXBlLgorICAgKgorICAgKiAgICAgWW91IGNhbiB1c2UgQEZUX0xDRF9GSUxURVJfTk9ORSBoZXJlIHRvIGRpc2FibGUgdGhpcyBmZWF0dXJlLCBvcgorICAgKiAgICAgQEZUX0xDRF9GSUxURVJfREVGQVVMVCB0byB1c2UgYSBkZWZhdWx0IGZpbHRlciB0aGF0IHNob3VsZCB3b3JrCisgICAqICAgICB3ZWxsIG9uIG1vc3QgTENEIHNjcmVlbnMuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhpcyBmZWF0dXJlIGlzIGFsd2F5cyBkaXNhYmxlZCBieSBkZWZhdWx0LiAgQ2xpZW50cyBtdXN0IG1ha2UgYW4KKyAgICogICBleHBsaWNpdCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gd2l0aCBhIGBmaWx0ZXInIHZhbHVlIG90aGVyIHRoYW4KKyAgICogICBARlRfTENEX0ZJTFRFUl9OT05FIGluIG9yZGVyIHRvIGVuYWJsZSBpdC4KKyAgICoKKyAgICogICBEdWUgdG8gKlBBVEVOVFMqIGNvdmVyaW5nIHN1YnBpeGVsIHJlbmRlcmluZywgdGhpcyBmdW5jdGlvbiBkb2Vzbid0CisgICAqICAgZG8gYW55dGhpbmcgZXhjZXB0IHJldHVybmluZyBgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZScgaWYgdGhlCisgICAqICAgY29uZmlndXJhdGlvbiBtYWNybyBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORyBpcyBub3QKKyAgICogICBkZWZpbmVkIGluIHlvdXIgYnVpbGQgb2YgdGhlIGxpYnJhcnksIHdoaWNoIHNob3VsZCBjb3JyZXNwb25kIHRvIGFsbAorICAgKiAgIGRlZmF1bHQgYnVpbGRzIG9mIEZyZWVUeXBlLgorICAgKgorICAgKiAgIFRoZSBmaWx0ZXIgYWZmZWN0cyBnbHlwaCBiaXRtYXBzIHJlbmRlcmVkIHRocm91Z2ggQEZUX1JlbmRlcl9HbHlwaCwKKyAgICogICBARlRfT3V0bGluZV9HZXRfQml0bWFwLCBARlRfTG9hZF9HbHlwaCwgYW5kIEBGVF9Mb2FkX0NoYXIuCisgICAqCisgICAqICAgSXQgZG9lcyBfbm90XyBhZmZlY3QgdGhlIG91dHB1dCBvZiBARlRfT3V0bGluZV9SZW5kZXIgYW5kCisgICAqICAgQEZUX091dGxpbmVfR2V0X0JpdG1hcC4KKyAgICoKKyAgICogICBJZiB0aGlzIGZlYXR1cmUgaXMgYWN0aXZhdGVkLCB0aGUgZGltZW5zaW9ucyBvZiBMQ0QgZ2x5cGggYml0bWFwcyBhcmUKKyAgICogICBlaXRoZXIgbGFyZ2VyIG9yIHRhbGxlciB0aGFuIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBjb3JyZXNwb25kaW5nCisgICAqICAgb3V0bGluZSB3aXRoIHJlZ2FyZHMgdG8gdGhlIHBpeGVsIGdyaWQuICBGb3IgZXhhbXBsZSwgZm9yCisgICAqICAgQEZUX1JFTkRFUl9NT0RFX0xDRCwgdGhlIGZpbHRlciBhZGRzIHVwIHRvIDN+cGl4ZWxzIHRvIHRoZSBsZWZ0LCBhbmQKKyAgICogICB1cCB0byAzfnBpeGVscyB0byB0aGUgcmlnaHQuCisgICAqCisgICAqICAgVGhlIGJpdG1hcCBvZmZzZXQgdmFsdWVzIGFyZSBhZGp1c3RlZCBjb3JyZWN0bHksIHNvIGNsaWVudHMgc2hvdWxkbid0CisgICAqICAgbmVlZCB0byBtb2RpZnkgdGhlaXIgbGF5b3V0IGFuZCBnbHlwaCBwb3NpdGlvbmluZyBjb2RlIHdoZW4gZW5hYmxpbmcKKyAgICogICB0aGUgZmlsdGVyLgorICAgKgorICAgKiBAc2luY2U6CisgICAqICAgMi4zLjAKKyAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9MaWJyYXJ5X1NldExjZEZpbHRlciggRlRfTGlicmFyeSAgICBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTGNkRmlsdGVyICBmaWx0ZXIgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuYzoKKyAgICogICBGVF9MaWJyYXJ5X1NldExjZEZpbHRlcldlaWdodHMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIG92ZXJyaWRlIHRoZSBmaWx0ZXIgd2VpZ2h0cyBzZWxlY3RlZCBieQorICAgKiAgIEBGVF9MaWJyYXJ5X1NldExjZEZpbHRlci4gIEJ5IGRlZmF1bHQsIEZyZWVUeXBlIHVzZXMgdGhlIHF1aW50dXBsZQorICAgKiAgICgweDAwLCAweDU1LCAweDU2LCAweDU1LCAweDAwKSBmb3IgRlRfTENEX0ZJTFRFUl9MSUdIVCwgYW5kICgweDEwLAorICAgKiAgIDB4NDAsIDB4NzAsIDB4NDAsIDB4MTApIGZvciBGVF9MQ0RfRklMVEVSX0RFRkFVTFQgYW5kCisgICAqICAgRlRfTENEX0ZJTFRFUl9MRUdBQ1kuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBsaWJyYXJ5IDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGxpYnJhcnkgaW5zdGFuY2UuCisgICAqCisgICAqICAgd2VpZ2h0cyA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIGFuIGFycmF5OyB0aGUgZnVuY3Rpb24gY29waWVzIHRoZSBmaXJzdCBmaXZlIGJ5dGVzIGFuZAorICAgKiAgICAgdXNlcyB0aGVtIHRvIHNwZWNpZnkgdGhlIGZpbHRlciB3ZWlnaHRzLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIER1ZSB0byAqUEFURU5UUyogY292ZXJpbmcgc3VicGl4ZWwgcmVuZGVyaW5nLCB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QKKyAgICogICBkbyBhbnl0aGluZyBleGNlcHQgcmV0dXJuaW5nIGBGVF9FcnJfVW5pbXBsZW1lbnRlZF9GZWF0dXJlJyBpZiB0aGUKKyAgICogICBjb25maWd1cmF0aW9uIG1hY3JvIEZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HIGlzIG5vdAorICAgKiAgIGRlZmluZWQgaW4geW91ciBidWlsZCBvZiB0aGUgbGlicmFyeSwgd2hpY2ggc2hvdWxkIGNvcnJlc3BvbmQgdG8gYWxsCisgICAqICAgZGVmYXVsdCBidWlsZHMgb2YgRnJlZVR5cGUuCisgICAqCisgICAqICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZnRlciBARlRfTGlicmFyeV9TZXRMY2RGaWx0ZXIgdG8gaGF2ZQorICAgKiAgIGFueSBlZmZlY3QuCisgICAqCisgICAqIEBzaW5jZToKKyAgICogICAyLjQuMAorICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyV2VpZ2h0cyggRlRfTGlicmFyeSAgICAgIGxpYnJhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgKndlaWdodHMgKTsKKworICAvKiAqLworCisKK0ZUX0VORF9IRUFERVIKKworI2VuZGlmIC8qIF9fRlRfTENEX0ZJTFRFUl9IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRsaXN0LmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0bGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYjQ4YzcKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0bGlzdC5oCkBAIC0wLDAgKzEsMjc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBmdGxpc3QuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgR2VuZXJpYyBsaXN0IHN1cHBvcnQgZm9yIEZyZWVUeXBlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHJlbGF0aXZlIHRvIGxpc3QgcHJvY2Vzc2luZy4gIEl0cyAgICAgKi8KKyAgLyogIGRhdGEgc3RydWN0dXJlcyBhcmUgZGVmaW5lZCBpbiBgZnJlZXR5cGUuaCcuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fRlRMSVNUX0hfXworI2RlZmluZSBfX0ZUTElTVF9IX18KKworCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKworI2lmZGVmIEZSRUVUWVBFX0gKKyNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCisjZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKKyNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgorI2VuZGlmCisKKworRlRfQkVHSU5fSEVBREVSCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaXN0X3Byb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMaXN0IFByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTaW1wbGUgbWFuYWdlbWVudCBvZiBsaXN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdmFyaW91cyBkZWZpbml0aW9ucyByZWxhdGVkIHRvIGxpc3QgICAgICAgICAgKi8KKyAgLyogICAgcHJvY2Vzc2luZyB1c2luZyBkb3VibHktbGlua2VkIG5vZGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3JkZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xpc3ROb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MaXN0UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTGlzdE5vZGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MaXN0X0FkZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTGlzdF9JbnNlcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xpc3RfRmluZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MaXN0X1JlbW92ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTGlzdF9VcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xpc3RfSXRlcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MaXN0X0l0ZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTGlzdF9GaW5hbGl6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xpc3RfRGVzdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MaXN0X0ZpbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGaW5kIHRoZSBsaXN0IG5vZGUgZm9yIGEgZ2l2ZW4gbGlzdGVkIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaXN0IDo6IEEgcG9pbnRlciB0byB0aGUgcGFyZW50IGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZGF0YSA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgbGlzdGVkIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTGlzdCBub2RlLiAgTlVMTCBpZiBpdCB3YXNuJ3QgZm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0xpc3ROb2RlICkKKyAgRlRfTGlzdF9GaW5kKCBGVF9MaXN0ICBsaXN0LAorICAgICAgICAgICAgICAgIHZvaWQqICAgIGRhdGEgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xpc3RfQWRkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFwcGVuZCBhbiBlbGVtZW50IHRvIHRoZSBlbmQgb2YgYSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpc3QgOjogQSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBub2RlIDo6IFRoZSBub2RlIHRvIGFwcGVuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggdm9pZCApCisgIEZUX0xpc3RfQWRkKCBGVF9MaXN0ICAgICAgbGlzdCwKKyAgICAgICAgICAgICAgIEZUX0xpc3ROb2RlICBub2RlICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MaXN0X0luc2VydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJbnNlcnQgYW4gZWxlbWVudCBhdCB0aGUgaGVhZCBvZiBhIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaXN0IDo6IEEgcG9pbnRlciB0byBwYXJlbnQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbm9kZSA6OiBUaGUgbm9kZSB0byBpbnNlcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIHZvaWQgKQorICBGVF9MaXN0X0luc2VydCggRlRfTGlzdCAgICAgIGxpc3QsCisgICAgICAgICAgICAgICAgICBGVF9MaXN0Tm9kZSAgbm9kZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTGlzdF9SZW1vdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmVtb3ZlIGEgbm9kZSBmcm9tIGEgbGlzdC4gIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayB3aGV0aGVyICAgICovCisgIC8qICAgIHRoZSBub2RlIGlzIGluIHRoZSBsaXN0ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG5vZGUgOjogVGhlIG5vZGUgdG8gcmVtb3ZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpc3QgOjogQSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCB2b2lkICkKKyAgRlRfTGlzdF9SZW1vdmUoIEZUX0xpc3QgICAgICBsaXN0LAorICAgICAgICAgICAgICAgICAgRlRfTGlzdE5vZGUgIG5vZGUgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xpc3RfVXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE1vdmUgYSBub2RlIHRvIHRoZSBoZWFkL3RvcCBvZiBhIGxpc3QuICBVc2VkIHRvIG1haW50YWluIExSVSAgICAgICAqLworICAvKiAgICBsaXN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaXN0IDo6IEEgcG9pbnRlciB0byB0aGUgcGFyZW50IGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbm9kZSA6OiBUaGUgbm9kZSB0byBtb3ZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIHZvaWQgKQorICBGVF9MaXN0X1VwKCBGVF9MaXN0ICAgICAgbGlzdCwKKyAgICAgICAgICAgICAgRlRfTGlzdE5vZGUgIG5vZGUgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xpc3RfSXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFuIEZUX0xpc3QgaXRlcmF0b3IgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgZHVyaW5nIGEgbGlzdCBwYXJzZSAgICAqLworICAvKiAgICBieSBARlRfTGlzdF9JdGVyYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBub2RlIDo6IFRoZSBjdXJyZW50IGl0ZXJhdGlvbiBsaXN0IG5vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHVzZXIgOjogQSB0eXBlbGVzcyBwb2ludGVyIHBhc3NlZCB0byBARlRfTGlzdF9JdGVyYXRlLiAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgIENhbiBiZSB1c2VkIHRvIHBvaW50IHRvIHRoZSBpdGVyYXRpb24ncyBzdGF0ZS4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpGVF9MaXN0X0l0ZXJhdG9yKSggRlRfTGlzdE5vZGUgIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICB1c2VyICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MaXN0X0l0ZXJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQYXJzZSBhIGxpc3QgYW5kIGNhbGxzIGEgZ2l2ZW4gaXRlcmF0b3IgZnVuY3Rpb24gb24gZWFjaCBlbGVtZW50LiAgKi8KKyAgLyogICAgTm90ZSB0aGF0IHBhcnNpbmcgaXMgc3RvcHBlZCBhcyBzb29uIGFzIG9uZSBvZiB0aGUgaXRlcmF0b3IgY2FsbHMgICovCisgIC8qICAgIHJldHVybnMgYSBub24temVybyB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpc3QgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBpdGVyYXRvciA6OiBBbiBpdGVyYXRvciBmdW5jdGlvbiwgY2FsbGVkIG9uIGVhY2ggbm9kZSBvZiB0aGUgbGlzdC4gKi8KKyAgLyogICAgdXNlciAgICAgOjogQSB1c2VyLXN1cHBsaWVkIGZpZWxkIHRoYXQgaXMgcGFzc2VkIGFzIHRoZSBzZWNvbmQgICAgICovCisgIC8qICAgICAgICAgICAgICAgIGFyZ3VtZW50IHRvIHRoZSBpdGVyYXRvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSByZXN1bHQgKGEgRnJlZVR5cGUgZXJyb3IgY29kZSkgb2YgdGhlIGxhc3QgaXRlcmF0b3IgY2FsbC4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX0xpc3RfSXRlcmF0ZSggRlRfTGlzdCAgICAgICAgICAgbGlzdCwKKyAgICAgICAgICAgICAgICAgICBGVF9MaXN0X0l0ZXJhdG9yICBpdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICB1c2VyICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MaXN0X0Rlc3RydWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbiBARlRfTGlzdCBpdGVyYXRvciBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBkdXJpbmcgYSBsaXN0ICAgICAgICAgKi8KKyAgLyogICAgZmluYWxpemF0aW9uIGJ5IEBGVF9MaXN0X0ZpbmFsaXplIHRvIGRlc3Ryb3kgYWxsIGVsZW1lbnRzIGluIGEgICAgICovCisgIC8qICAgIGdpdmVuIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN5c3RlbSA6OiBUaGUgY3VycmVudCBzeXN0ZW0gb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZGF0YSAgIDo6IFRoZSBjdXJyZW50IG9iamVjdCB0byBkZXN0cm95LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB1c2VyICAgOjogQSB0eXBlbGVzcyBwb2ludGVyIHBhc3NlZCB0byBARlRfTGlzdF9JdGVyYXRlLiAgSXQgY2FuICAgKi8KKyAgLyogICAgICAgICAgICAgIGJlIHVzZWQgdG8gcG9pbnQgdG8gdGhlIGl0ZXJhdGlvbidzIHN0YXRlLiAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHZvaWQKKyAgKCpGVF9MaXN0X0Rlc3RydWN0b3IpKCBGVF9NZW1vcnkgIG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICB1c2VyICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MaXN0X0ZpbmFsaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBEZXN0cm95IGFsbCBlbGVtZW50cyBpbiB0aGUgbGlzdCBhcyB3ZWxsIGFzIHRoZSBsaXN0IGl0c2VsZi4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaXN0ICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGRlc3Ryb3kgOjogQSBsaXN0IGRlc3RydWN0b3IgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gZWFjaCBlbGVtZW50ICAqLworICAvKiAgICAgICAgICAgICAgIG9mIHRoZSBsaXN0LiAgU2V0IHRoaXMgdG8gTlVMTCBpZiBub3QgbmVlZGVkLiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1lbW9yeSAgOjogVGhlIGN1cnJlbnQgbWVtb3J5IG9iamVjdCB0aGF0IGhhbmRsZXMgZGVhbGxvY2F0aW9uLiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdXNlciAgICA6OiBBIHVzZXItc3VwcGxpZWQgZmllbGQgdGhhdCBpcyBwYXNzZWQgYXMgdGhlIGxhc3QgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgYXJndW1lbnQgdG8gdGhlIGRlc3RydWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gZXhwZWN0cyB0aGF0IGFsbCBub2RlcyBhZGRlZCBieSBARlRfTGlzdF9BZGQgb3IgICAgICAqLworICAvKiAgICBARlRfTGlzdF9JbnNlcnQgaGF2ZSBiZWVuIGR5bmFtaWNhbGx5IGFsbG9jYXRlZC4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggdm9pZCApCisgIEZUX0xpc3RfRmluYWxpemUoIEZUX0xpc3QgICAgICAgICAgICAgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgRlRfTGlzdF9EZXN0cnVjdG9yICBkZXN0cm95LAorICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICB1c2VyICk7CisKKyAgLyogKi8KKworCitGVF9FTkRfSEVBREVSCisKKyNlbmRpZiAvKiBfX0ZUTElTVF9IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRsencuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRsencuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2VjMjhlCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGx6dy5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0bHp3LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBMWlctY29tcHJlc3NlZCBzdHJlYW0gc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwNC0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0ZUTFpXX0hfXworI2RlZmluZSBfX0ZUTFpXX0hfXworCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKworI2lmZGVmIEZSRUVUWVBFX0gKKyNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCisjZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKKyNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgorI2VuZGlmCisKKworRlRfQkVHSU5fSEVBREVSCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbHp3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTFpXIFN0cmVhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVXNpbmcgTFpXLWNvbXByZXNzZWQgZm9udCBmaWxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBMWlctc3BlY2lmaWMgZnVuY3Rpb25zLiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIEBmdW5jdGlvbjoKKyAgKiAgIEZUX1N0cmVhbV9PcGVuTFpXCisgICoKKyAgKiBAZGVzY3JpcHRpb246CisgICogICBPcGVuIGEgbmV3IHN0cmVhbSB0byBwYXJzZSBMWlctY29tcHJlc3NlZCBmb250IGZpbGVzLiAgVGhpcyBpcworICAqICAgbWFpbmx5IHVzZWQgdG8gc3VwcG9ydCB0aGUgY29tcHJlc3NlZCBgKi5wY2YuWicgZm9udHMgdGhhdCBjb21lCisgICogICB3aXRoIFhGcmVlODYuCisgICoKKyAgKiBAaW5wdXQ6CisgICogICBzdHJlYW0gOjogVGhlIHRhcmdldCBlbWJlZGRpbmcgc3RyZWFtLgorICAqCisgICogICBzb3VyY2UgOjogVGhlIHNvdXJjZSBzdHJlYW0uCisgICoKKyAgKiBAcmV0dXJuOgorICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgKgorICAqIEBub3RlOgorICAqICAgVGhlIHNvdXJjZSBzdHJlYW0gbXVzdCBiZSBvcGVuZWQgX2JlZm9yZV8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICAqCisgICogICBDYWxsaW5nIHRoZSBpbnRlcm5hbCBmdW5jdGlvbiBgRlRfU3RyZWFtX0Nsb3NlJyBvbiB0aGUgbmV3IHN0cmVhbSB3aWxsCisgICogICAqbm90KiBjYWxsIGBGVF9TdHJlYW1fQ2xvc2UnIG9uIHRoZSBzb3VyY2Ugc3RyZWFtLiAgTm9uZSBvZiB0aGUgc3RyZWFtCisgICogICBvYmplY3RzIHdpbGwgYmUgcmVsZWFzZWQgdG8gdGhlIGhlYXAuCisgICoKKyAgKiAgIFRoZSBzdHJlYW0gaW1wbGVtZW50YXRpb24gaXMgdmVyeSBiYXNpYyBhbmQgcmVzZXRzIHRoZSBkZWNvbXByZXNzaW9uCisgICogICBwcm9jZXNzIGVhY2ggdGltZSBzZWVraW5nIGJhY2t3YXJkcyBpcyBuZWVkZWQgd2l0aGluIHRoZSBzdHJlYW0KKyAgKgorICAqICAgSW4gY2VydGFpbiBidWlsZHMgb2YgdGhlIGxpYnJhcnksIExaVyBjb21wcmVzc2lvbiByZWNvZ25pdGlvbiBpcworICAqICAgYXV0b21hdGljYWxseSBoYW5kbGVkIHdoZW4gY2FsbGluZyBARlRfTmV3X0ZhY2Ugb3IgQEZUX09wZW5fRmFjZS4KKyAgKiAgIFRoaXMgbWVhbnMgdGhhdCBpZiBubyBmb250IGRyaXZlciBpcyBjYXBhYmxlIG9mIGhhbmRsaW5nIHRoZSByYXcKKyAgKiAgIGNvbXByZXNzZWQgZmlsZSwgdGhlIGxpYnJhcnkgd2lsbCB0cnkgdG8gb3BlbiBhIExaVyBzdHJlYW0gZnJvbSBpdAorICAqICAgYW5kIHJlLW9wZW4gdGhlIGZhY2Ugd2l0aCBpdC4KKyAgKgorICAqICAgVGhpcyBmdW5jdGlvbiBtYXkgcmV0dXJuIGBGVF9FcnJfVW5pbXBsZW1lbnRlZF9GZWF0dXJlJyBpZiB5b3VyIGJ1aWxkCisgICogICBvZiBGcmVlVHlwZSB3YXMgbm90IGNvbXBpbGVkIHdpdGggTFpXIHN1cHBvcnQuCisgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9TdHJlYW1fT3BlbkxaVyggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHNvdXJjZSApOworCisgIC8qICovCisKKworRlRfRU5EX0hFQURFUgorCisjZW5kaWYgLyogX19GVExaV19IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRtYWMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRtYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGM1NWNmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdG1hYy5oCkBAIC0wLDAgKzEsMjc0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBmdG1hYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQWRkaXRpb25hbCBNYWMtc3BlY2lmaWMgQVBJLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEp1c3QgdmFuIFJvc3N1bSwgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URTogSW5jbHVkZSB0aGlzIGZpbGUgYWZ0ZXIgRlRfRlJFRVRZUEVfSCBhbmQgYWZ0ZXIgYW55ICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIE1hYy1zcGVjaWZpYyBoZWFkZXJzIChiZWNhdXNlIHRoaXMgaGVhZGVyIHVzZXMgTWFjIHR5cGVzIHN1Y2ggYXMgICovCisvKiAgICAgICBIYW5kbGUsIEZTU3BlYywgRlNSZWYsIGV0Yy4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0ZUTUFDX0hfXworI2RlZmluZSBfX0ZUTUFDX0hfXworCisKKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKy8qIGdjYy0zLjQuMSBhbmQgbGF0ZXIgY2FuIHdhcm4gYWJvdXQgZnVuY3Rpb25zIHRhZ2dlZCBhcyBkZXByZWNhdGVkICovCisjaWZuZGVmIEZUX0RFUFJFQ0FURURfQVRUUklCVVRFCisjaWYgZGVmaW5lZChfX0dOVUNfXykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFwKKyAgICAoKF9fR05VQ19fID49IDQpIHx8ICgoX19HTlVDX18gPT0gMykgJiYgKF9fR05VQ19NSU5PUl9fID49IDEpKSkKKyNkZWZpbmUgRlRfREVQUkVDQVRFRF9BVFRSSUJVVEUgIF9fYXR0cmlidXRlX18oKGRlcHJlY2F0ZWQpKQorI2Vsc2UKKyNkZWZpbmUgRlRfREVQUkVDQVRFRF9BVFRSSUJVVEUKKyNlbmRpZgorI2VuZGlmCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYWNfc3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBNYWMgU3BlY2lmaWMgSW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPbmx5IGF2YWlsYWJsZSBvbiB0aGUgTWFjaW50b3NoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGFyZSBvbmx5IGF2YWlsYWJsZSBpZiBGcmVlVHlwZSBpcyAgICAgICAgKi8KKyAgLyogICAgY29tcGlsZWQgb24gYSBNYWNpbnRvc2guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX05ld19GYWNlX0Zyb21fRk9ORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENyZWF0ZSBhIG5ldyBmYWNlIG9iamVjdCBmcm9tIGEgRk9ORCByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpYnJhcnkgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZvbmQgICAgICAgOjogQSBGT05EIHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZV9pbmRleCA6OiBPbmx5IHN1cHBvcnRlZCBmb3IgdGhlIC0xIGBzYW5pdHkgY2hlY2snIHNwZWNpYWwgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgY2FzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFmYWNlICAgICAgOjogQSBoYW5kbGUgdG8gYSBuZXcgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIEBGVF9GYWNlIG9iamVjdHMgZnJvbSBmb250cyAgICAqLworICAvKiAgICB0aGF0IGFyZSBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbSBhcyBmb2xsb3dzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIGZvbmQgPSBHZXRSZXNvdXJjZSggJ0ZPTkQnLCBmb250TmFtZSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBlcnJvciA9IEZUX05ld19GYWNlX0Zyb21fRk9ORCggbGlicmFyeSwgZm9uZCwgMCwgJmZhY2UgKTsgICAgICAgICovCisgIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX05ld19GYWNlX0Zyb21fRk9ORCggRlRfTGlicmFyeSAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGUgICAgICBmb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgIGZhY2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAqYWZhY2UgKQorICAgICAgICAgICAgICAgICAgICAgICBGVF9ERVBSRUNBVEVEX0FUVFJJQlVURTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0dldEZpbGVfRnJvbV9NYWNfTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJldHVybiBhbiBGU1NwZWMgZm9yIHRoZSBkaXNrIGZpbGUgY29udGFpbmluZyB0aGUgbmFtZWQgZm9udC4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZvbnROYW1lICAgOjogTWFjIE9TIG5hbWUgb2YgdGhlIGZvbnQgKGUuZy4sIFRpbWVzIE5ldyBSb21hbiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIEJvbGQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwYXRoU3BlYyAgIDo6IEZTU3BlYyB0byB0aGUgZmlsZS4gIEZvciBwYXNzaW5nIHRvICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBARlRfTmV3X0ZhY2VfRnJvbV9GU1NwZWMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlX2luZGV4IDo6IEluZGV4IG9mIHRoZSBmYWNlLiAgRm9yIHBhc3NpbmcgdG8gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBARlRfTmV3X0ZhY2VfRnJvbV9GU1NwZWMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfR2V0RmlsZV9Gcm9tX01hY19OYW1lKCBjb25zdCBjaGFyKiAgZm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjKiAgICAgIHBhdGhTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICBmYWNlX2luZGV4ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfREVQUkVDQVRFRF9BVFRSSUJVVEU7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZXRGaWxlX0Zyb21fTWFjX0FUU19OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZXR1cm4gYW4gRlNTcGVjIGZvciB0aGUgZGlzayBmaWxlIGNvbnRhaW5pbmcgdGhlIG5hbWVkIGZvbnQuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmb250TmFtZSAgIDo6IE1hYyBPUyBuYW1lIG9mIHRoZSBmb250IGluIEFUUyBmcmFtZXdvcmsuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwYXRoU3BlYyAgIDo6IEZTU3BlYyB0byB0aGUgZmlsZS4gRm9yIHBhc3NpbmcgdG8gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBARlRfTmV3X0ZhY2VfRnJvbV9GU1NwZWMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlX2luZGV4IDo6IEluZGV4IG9mIHRoZSBmYWNlLiBGb3IgcGFzc2luZyB0byAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBARlRfTmV3X0ZhY2VfRnJvbV9GU1NwZWMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfR2V0RmlsZV9Gcm9tX01hY19BVFNfTmFtZSggY29uc3QgY2hhciogIGZvbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWMqICAgICAgcGF0aFNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICBmYWNlX2luZGV4ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RFUFJFQ0FURURfQVRUUklCVVRFOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2V0RmlsZVBhdGhfRnJvbV9NYWNfQVRTX05hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmV0dXJuIGEgcGF0aG5hbWUgb2YgdGhlIGRpc2sgZmlsZSBhbmQgZmFjZSBpbmRleCBmb3IgZ2l2ZW4gZm9udCAgICovCisgIC8qICAgIG5hbWUgdGhhdCBpcyBoYW5kbGVkIGJ5IEFUUyBmcmFtZXdvcmsuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZvbnROYW1lICAgIDo6IE1hYyBPUyBuYW1lIG9mIHRoZSBmb250IGluIEFUUyBmcmFtZXdvcmsuICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBhdGggICAgICAgIDo6IEJ1ZmZlciB0byBzdG9yZSBwYXRobmFtZSBvZiB0aGUgZmlsZS4gIEZvciBwYXNzaW5nICAqLworICAvKiAgICAgICAgICAgICAgICAgICB0byBARlRfTmV3X0ZhY2UuICBUaGUgY2xpZW50IG11c3QgYWxsb2NhdGUgdGhpcyAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgYnVmZmVyIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhQYXRoU2l6ZSA6OiBMZW5ndGhzIG9mIHRoZSBidWZmZXIgYHBhdGgnIHRoYXQgY2xpZW50IGFsbG9jYXRlZC4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2VfaW5kZXggIDo6IEluZGV4IG9mIHRoZSBmYWNlLiAgRm9yIHBhc3NpbmcgdG8gQEZUX05ld19GYWNlLiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX0dldEZpbGVQYXRoX0Zyb21fTWFjX0FUU19OYW1lKCBjb25zdCBjaGFyKiAgZm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50OCogICAgICAgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiAgICAgICBtYXhQYXRoU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICBmYWNlX2luZGV4ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9ERVBSRUNBVEVEX0FUVFJJQlVURTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX05ld19GYWNlX0Zyb21fRlNTcGVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENyZWF0ZSBhIG5ldyBmYWNlIG9iamVjdCBmcm9tIGEgZ2l2ZW4gcmVzb3VyY2UgYW5kIHR5cGVmYWNlIGluZGV4ICAqLworICAvKiAgICB1c2luZyBhbiBGU1NwZWMgdG8gdGhlIGZvbnQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaWJyYXJ5ICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzcGVjICAgICAgIDo6IEZTU3BlYyB0byB0aGUgZm9udCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2VfaW5kZXggOjogVGhlIGluZGV4IG9mIHRoZSBmYWNlIHdpdGhpbiB0aGUgcmVzb3VyY2UuICBUaGUgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIGZpcnN0IGZhY2UgaGFzIGluZGV4fjAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFmYWNlICAgICAgOjogQSBoYW5kbGUgdG8gYSBuZXcgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYyBpcyBpZGVudGljYWwgdG8gQEZUX05ld19GYWNlIGV4Y2VwdCAgICAgICAqLworICAvKiAgICBpdCBhY2NlcHRzIGFuIEZTU3BlYyBpbnN0ZWFkIG9mIGEgcGF0aC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYyggRlRfTGlicmFyeSAgICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZTU3BlYyAgKnNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgICBmYWNlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAqYWZhY2UgKQorICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RFUFJFQ0FURURfQVRUUklCVVRFOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTmV3X0ZhY2VfRnJvbV9GU1JlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ3JlYXRlIGEgbmV3IGZhY2Ugb2JqZWN0IGZyb20gYSBnaXZlbiByZXNvdXJjZSBhbmQgdHlwZWZhY2UgaW5kZXggICovCisgIC8qICAgIHVzaW5nIGFuIEZTUmVmIHRvIHRoZSBmb250IGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpYnJhcnkgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNwZWMgICAgICAgOjogRlNSZWYgdG8gdGhlIGZvbnQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGZhY2Ugd2l0aGluIHRoZSByZXNvdXJjZS4gIFRoZSAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgZmlyc3QgZmFjZSBoYXMgaW5kZXh+MC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYWZhY2UgICAgICA6OiBBIGhhbmRsZSB0byBhIG5ldyBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQEZUX05ld19GYWNlX0Zyb21fRlNSZWYgaXMgaWRlbnRpY2FsIHRvIEBGVF9OZXdfRmFjZSBleGNlcHQgICAgICAgICovCisgIC8qICAgIGl0IGFjY2VwdHMgYW4gRlNSZWYgaW5zdGVhZCBvZiBhIHBhdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX05ld19GYWNlX0Zyb21fRlNSZWYoIEZUX0xpYnJhcnkgICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlNSZWYgICpyZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgZmFjZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICphZmFjZSApCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9ERVBSRUNBVEVEX0FUVFJJQlVURTsKKworICAvKiAqLworCisKK0ZUX0VORF9IRUFERVIKKworCisjZW5kaWYgLyogX19GVE1BQ19IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRtbS5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdG1tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVmNDc5OAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRtbS5oCkBAIC0wLDAgKzEsMzc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBmdG1tLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnJlZVR5cGUgTXVsdGlwbGUgTWFzdGVyIGZvbnQgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX19GVE1NX0hfXworI2RlZmluZSBfX0ZUTU1fSF9fCisKKworI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CisjaW5jbHVkZSBGVF9UWVBFMV9UQUJMRVNfSAorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbXVsdGlwbGVfbWFzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTXVsdGlwbGUgTWFzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSG93IHRvIG1hbmFnZSBNdWx0aXBsZSBNYXN0ZXJzIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGZvbGxvd2luZyB0eXBlcyBhbmQgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIG1hbmFnZSBNdWx0aXBsZSAgICAgICovCisgIC8qICAgIE1hc3RlciBmb250cywgaS5lLiwgdGhlIHNlbGVjdGlvbiBvZiBzcGVjaWZpYyBkZXNpZ24gaW5zdGFuY2VzIGJ5ICAqLworICAvKiAgICBzZXR0aW5nIGRlc2lnbiBheGlzIGNvb3JkaW5hdGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEdlb3JnZSBXaWxsaWFtcyBoYXMgZXh0ZW5kZWQgdGhpcyBpbnRlcmZhY2UgdG8gbWFrZSBpdCB3b3JrIHdpdGggICAqLworICAvKiAgICBib3RoIFR5cGV+MSBNdWx0aXBsZSBNYXN0ZXJzIGZvbnRzIGFuZCBHWCBkaXN0b3J0YWJsZSAodmFyKSAgICAgICAgKi8KKyAgLyogICAgZm9udHMuICBTb21lIG9mIHRoZXNlIHJvdXRpbmVzIG9ubHkgd29yayB3aXRoIE1NIGZvbnRzLCBvdGhlcnMgICAgICovCisgIC8qICAgIHdpbGwgd29yayB3aXRoIGJvdGggdHlwZXMuICBUaGV5IGFyZSBzaW1pbGFyIGVub3VnaCB0aGF0IGEgICAgICAgICAqLworICAvKiAgICBjb25zaXN0ZW50IGludGVyZmFjZSBtYWtlcyBzZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTU1fQXhpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzaW1wbGUgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBnaXZlbiBheGlzIGluIGRlc2lnbiBzcGFjZSBmb3IgICovCisgIC8qICAgIE11bHRpcGxlIE1hc3RlcnMgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgY2FuJ3QgYmUgdXNlZCBmb3IgR1ggdmFyIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbmFtZSAgICA6OiBUaGUgYXhpcydzIG5hbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtaW5pbXVtIDo6IFRoZSBheGlzJ3MgbWluaW11bSBkZXNpZ24gY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1heGltdW0gOjogVGhlIGF4aXMncyBtYXhpbXVtIGRlc2lnbiBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX01NX0F4aXNfCisgIHsKKyAgICBGVF9TdHJpbmcqICBuYW1lOworICAgIEZUX0xvbmcgICAgIG1pbmltdW07CisgICAgRlRfTG9uZyAgICAgbWF4aW11bTsKKworICB9IEZUX01NX0F4aXM7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9NdWx0aV9NYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIHRoZSBheGVzIGFuZCBzcGFjZSBvZiBhIE11bHRpcGxlIE1hc3RlcnMgKi8KKyAgLyogICAgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIHN0cnVjdHVyZSBjYW4ndCBiZSB1c2VkIGZvciBHWCB2YXIgZm9udHMuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fYXhpcyAgICA6OiBOdW1iZXIgb2YgYXhlcy4gIENhbm5vdCBleGNlZWR+NC4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9kZXNpZ25zIDo6IE51bWJlciBvZiBkZXNpZ25zOyBzaG91bGQgYmUgbm9ybWFsbHkgMl5udW1fYXhpcyAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBldmVuIHRob3VnaCB0aGUgVHlwZX4xIHNwZWNpZmljYXRpb24gc3RyYW5nZWx5ICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgYWxsb3dzIGZvciBpbnRlcm1lZGlhdGUgZGVzaWducyB0byBiZSBwcmVzZW50LiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIGNhbm5vdCBleGNlZWR+MTYuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYXhpcyAgICAgICAgOjogQSB0YWJsZSBvZiBheGlzIGRlc2NyaXB0b3JzLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgRlRfTXVsdGlfTWFzdGVyXworICB7CisgICAgRlRfVUludCAgICAgbnVtX2F4aXM7CisgICAgRlRfVUludCAgICAgbnVtX2Rlc2lnbnM7CisgICAgRlRfTU1fQXhpcyAgYXhpc1tUMV9NQVhfTU1fQVhJU107CisKKyAgfSBGVF9NdWx0aV9NYXN0ZXI7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9WYXJfQXhpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHNpbXBsZSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIGdpdmVuIGF4aXMgaW4gZGVzaWduIHNwYWNlIGZvciAgKi8KKyAgLyogICAgTXVsdGlwbGUgTWFzdGVycyBhbmQgR1ggdmFyIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbmFtZSAgICA6OiBUaGUgYXhpcydzIG5hbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgTm90IGFsd2F5cyBtZWFuaW5nZnVsIGZvciBHWC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWluaW11bSA6OiBUaGUgYXhpcydzIG1pbmltdW0gZGVzaWduIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkZWYgICAgIDo6IFRoZSBheGlzJ3MgZGVmYXVsdCBkZXNpZ24gY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICBGcmVlVHlwZSBjb21wdXRlcyBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWVzIGZvciBNTTsgaXQgICovCisgIC8qICAgICAgICAgICAgICAgaXMgdGhlbiBhbiBpbnRlZ2VyIHZhbHVlLCBub3QgaW4gMTYuMTYgZm9ybWF0LiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4aW11bSA6OiBUaGUgYXhpcydzIG1heGltdW0gZGVzaWduIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0YWcgICAgIDo6IFRoZSBheGlzJ3MgdGFnICh0aGUgR1ggZXF1aXZhbGVudCB0byBgbmFtZScpLiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICBGcmVlVHlwZSBwcm92aWRlcyBkZWZhdWx0IHZhbHVlcyBmb3IgTU0gaWYgcG9zc2libGUuICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJpZCAgIDo6IFRoZSBlbnRyeSBpbiBgbmFtZScgdGFibGUgKGFub3RoZXIgR1ggdmVyc2lvbiBvZiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICBgbmFtZScpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgTm90IG1lYW5pbmdmdWwgZm9yIE1NLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1Zhcl9BeGlzXworICB7CisgICAgRlRfU3RyaW5nKiAgbmFtZTsKKworICAgIEZUX0ZpeGVkICAgIG1pbmltdW07CisgICAgRlRfRml4ZWQgICAgZGVmOworICAgIEZUX0ZpeGVkICAgIG1heGltdW07CisKKyAgICBGVF9VTG9uZyAgICB0YWc7CisgICAgRlRfVUludCAgICAgc3RyaWQ7CisKKyAgfSBGVF9WYXJfQXhpczsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1Zhcl9OYW1lZF9TdHlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgbmFtZWQgc3R5bGUgaW4gYSBHWCB2YXIgZm9udC4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgY2FuJ3QgYmUgdXNlZCBmb3IgTU0gZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY29vcmRzIDo6IFRoZSBkZXNpZ24gY29vcmRpbmF0ZXMgZm9yIHRoaXMgc3R5bGUuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICBUaGlzIGlzIGFuIGFycmF5IHdpdGggb25lIGVudHJ5IGZvciBlYWNoIGF4aXMuICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyaWQgIDo6IFRoZSBlbnRyeSBpbiBgbmFtZScgdGFibGUgaWRlbnRpZnlpbmcgdGhpcyBzdHlsZS4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgRlRfVmFyX05hbWVkX1N0eWxlXworICB7CisgICAgRlRfRml4ZWQqICBjb29yZHM7CisgICAgRlRfVUludCAgICBzdHJpZDsKKworICB9IEZUX1Zhcl9OYW1lZF9TdHlsZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX01NX1ZhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgdGhlIGF4ZXMgYW5kIHNwYWNlIG9mIGEgTXVsdGlwbGUgTWFzdGVycyAqLworICAvKiAgICBvciBHWCB2YXIgZGlzdG9ydGFibGUgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFNvbWUgZmllbGRzIGFyZSBzcGVjaWZpYyB0byBvbmUgZm9ybWF0IGFuZCBub3QgdG8gdGhlIG90aGVyLiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9heGlzICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGF4ZXMuICBUaGUgbWF4aW11bSB2YWx1ZSBpc340IGZvciAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgTU07IG5vIGxpbWl0IGluIEdYLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9kZXNpZ25zICAgICA6OiBUaGUgbnVtYmVyIG9mIGRlc2lnbnM7IHNob3VsZCBiZSBub3JtYWxseSAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgMl5udW1fYXhpcyBmb3IgTU0gZm9udHMuICBOb3QgbWVhbmluZ2Z1bCBmb3IgR1ggKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICh3aGVyZSBldmVyeSBnbHlwaCBjb3VsZCBoYXZlIGEgZGlmZmVyZW50ICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgZGVzaWducykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtX25hbWVkc3R5bGVzIDo6IFRoZSBudW1iZXIgb2YgbmFtZWQgc3R5bGVzOyBvbmx5IG1lYW5pbmdmdWwgZm9yICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICBHWCB0aGF0IGFsbG93cyBjZXJ0YWluIGRlc2lnbiBjb29yZGluYXRlcyB0byAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBhIHN0cmluZyBJRCAoaW4gdGhlIGBuYW1lJyB0YWJsZSkgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGVtLiAgVGhlIGZvbnQgY2FuIHRlbGwgdGhlICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICB1c2VyIHRoYXQsIGZvciBleGFtcGxlLCBXZWlnaHQ9MS41IGlzIGBCb2xkJy4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYXhpcyAgICAgICAgICAgIDo6IEFuIGF4aXMgZGVzY3JpcHRvciB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICBHWCBmb250cyBjb250YWluIHNsaWdodGx5IG1vcmUgZGF0YSB0aGFuIE1NLiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbmFtZWRzdHlsZSAgICAgIDo6IEEgbmFtZWQgc3R5bGUgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICBPbmx5IG1lYW5pbmdmdWwgd2l0aCBHWC4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX01NX1Zhcl8KKyAgeworICAgIEZUX1VJbnQgICAgICAgICAgICAgIG51bV9heGlzOworICAgIEZUX1VJbnQgICAgICAgICAgICAgIG51bV9kZXNpZ25zOworICAgIEZUX1VJbnQgICAgICAgICAgICAgIG51bV9uYW1lZHN0eWxlczsKKyAgICBGVF9WYXJfQXhpcyogICAgICAgICBheGlzOworICAgIEZUX1Zhcl9OYW1lZF9TdHlsZSogIG5hbWVkc3R5bGU7CisKKyAgfSBGVF9NTV9WYXI7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZXRfTXVsdGlfTWFzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZXRyaWV2ZSB0aGUgTXVsdGlwbGUgTWFzdGVyIGRlc2NyaXB0b3Igb2YgYSBnaXZlbiBmb250LiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gY2FuJ3QgYmUgdXNlZCB3aXRoIEdYIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFtYXN0ZXIgOjogVGhlIE11bHRpcGxlIE1hc3RlcnMgZGVzY3JpcHRvci4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX0dldF9NdWx0aV9NYXN0ZXIoIEZUX0ZhY2UgICAgICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgIEZUX011bHRpX01hc3RlciAgKmFtYXN0ZXIgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0dldF9NTV9WYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJldHJpZXZlIHRoZSBNdWx0aXBsZSBNYXN0ZXIvR1ggdmFyIGRlc2NyaXB0b3Igb2YgYSBnaXZlbiBmb250LiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFtYXN0ZXIgOjogVGhlIE11bHRpcGxlIE1hc3RlcnMvR1ggdmFyIGRlc2NyaXB0b3IuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgIEFsbG9jYXRlcyBhIGRhdGEgc3RydWN0dXJlLCB3aGljaCB0aGUgdXNlciBtdXN0IGZyZWUuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9HZXRfTU1fVmFyKCBGVF9GYWNlICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgRlRfTU1fVmFyKiAgKmFtYXN0ZXIgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1NldF9NTV9EZXNpZ25fQ29vcmRpbmF0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZvciBNdWx0aXBsZSBNYXN0ZXJzIGZvbnRzLCBjaG9vc2UgYW4gaW50ZXJwb2xhdGVkIGZvbnQgZGVzaWduICAgICAqLworICAvKiAgICB0aHJvdWdoIGRlc2lnbiBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gY2FuJ3QgYmUgdXNlZCB3aXRoIEdYIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9jb29yZHMgOjogVGhlIG51bWJlciBvZiBhdmFpbGFibGUgZGVzaWduIGNvb3JkaW5hdGVzLiAgSWYgaXQgICAqLworICAvKiAgICAgICAgICAgICAgICAgIGlzIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYXhlcywgaWdub3JlIHRoZSBleGNlc3MgKi8KKyAgLyogICAgICAgICAgICAgICAgICB2YWx1ZXMuICBJZiBpdCBpcyBzbWFsbGVyIHRoYW4gdGhlIG51bWJlciBvZiBheGVzLCAgICovCisgIC8qICAgICAgICAgICAgICAgICAgdXNlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgcmVtYWluaW5nIGF4ZXMuICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY29vcmRzICAgICA6OiBBbiBhcnJheSBvZiBkZXNpZ24gY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfU2V0X01NX0Rlc2lnbl9Db29yZGluYXRlcyggRlRfRmFjZSAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBudW1fY29vcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgY29vcmRzICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TZXRfVmFyX0Rlc2lnbl9Db29yZGluYXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGb3IgTXVsdGlwbGUgTWFzdGVyIG9yIEdYIFZhciBmb250cywgY2hvb3NlIGFuIGludGVycG9sYXRlZCBmb250ICAgKi8KKyAgLyogICAgZGVzaWduIHRocm91Z2ggZGVzaWduIGNvb3JkaW5hdGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtX2Nvb3JkcyA6OiBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBkZXNpZ24gY29vcmRpbmF0ZXMuICBJZiBpdCAgICovCisgIC8qICAgICAgICAgICAgICAgICAgaXMgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBheGVzLCBpZ25vcmUgdGhlIGV4Y2VzcyAqLworICAvKiAgICAgICAgICAgICAgICAgIHZhbHVlcy4gIElmIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGF4ZXMsICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICB1c2UgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSByZW1haW5pbmcgYXhlcy4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjb29yZHMgICAgIDo6IEFuIGFycmF5IG9mIGRlc2lnbiBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9TZXRfVmFyX0Rlc2lnbl9Db29yZGluYXRlcyggRlRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBudW1fY29vcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1NldF9NTV9CbGVuZF9Db29yZGluYXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZvciBNdWx0aXBsZSBNYXN0ZXJzIGFuZCBHWCB2YXIgZm9udHMsIGNob29zZSBhbiBpbnRlcnBvbGF0ZWQgZm9udCAqLworICAvKiAgICBkZXNpZ24gdGhyb3VnaCBub3JtYWxpemVkIGJsZW5kIGNvb3JkaW5hdGVzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fY29vcmRzIDo6IFRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGRlc2lnbiBjb29yZGluYXRlcy4gIElmIGl0ICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBpcyBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGF4ZXMsIGlnbm9yZSB0aGUgZXhjZXNzICovCisgIC8qICAgICAgICAgICAgICAgICAgdmFsdWVzLiAgSWYgaXQgaXMgc21hbGxlciB0aGFuIHRoZSBudW1iZXIgb2YgYXhlcywgICAqLworICAvKiAgICAgICAgICAgICAgICAgIHVzZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIHJlbWFpbmluZyBheGVzLiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNvb3JkcyAgICAgOjogVGhlIGRlc2lnbiBjb29yZGluYXRlcyBhcnJheSAoZWFjaCBlbGVtZW50IG11c3QgYmUgICAqLworICAvKiAgICAgICAgICAgICAgICAgIGJldHdlZW4gMCBhbmQgMS4wKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9TZXRfTU1fQmxlbmRfQ29vcmRpbmF0ZXMoIEZUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9jb29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1NldF9WYXJfQmxlbmRfQ29vcmRpbmF0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgaXMgYW5vdGhlciBuYW1lIG9mIEBGVF9TZXRfTU1fQmxlbmRfQ29vcmRpbmF0ZXMuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX1NldF9WYXJfQmxlbmRfQ29vcmRpbmF0ZXMoIEZUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBudW1fY29vcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApOworCisgIC8qICovCisKKworRlRfRU5EX0hFQURFUgorCisjZW5kaWYgLyogX19GVE1NX0hfXyAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdG1vZGFwaS5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdG1vZGFwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NDI3OWEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0bW9kYXBpLmgKQEAgLTAsMCArMSw2NjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0bW9kYXBpLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGcmVlVHlwZSBtb2R1bGVzIHB1YmxpYyBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0ZUTU9EQVBJX0hfXworI2RlZmluZSBfX0ZUTU9EQVBJX0hfXworCisKKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAorCisjaWZkZWYgRlJFRVRZUEVfSAorI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKKyNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgorI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCisjZW5kaWYKKworCitGVF9CRUdJTl9IRUFERVIKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1vZHVsZV9tYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE1vZHVsZSBNYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEhvdyB0byBhZGQsIHVwZ3JhZGUsIHJlbW92ZSwgYW5kIGNvbnRyb2wgbW9kdWxlcyBmcm9tIEZyZWVUeXBlLiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBkZWZpbml0aW9ucyBiZWxvdyBhcmUgdXNlZCB0byBtYW5hZ2UgbW9kdWxlcyB3aXRoaW4gRnJlZVR5cGUuICAqLworICAvKiAgICBNb2R1bGVzIGNhbiBiZSBhZGRlZCwgdXBncmFkZWQsIGFuZCByZW1vdmVkIGF0IHJ1bnRpbWUuICAgICAgICAgICAgKi8KKyAgLyogICAgQWRkaXRpb25hbGx5LCBzb21lIG1vZHVsZSBwcm9wZXJ0aWVzIGNhbiBiZSBjb250cm9sbGVkIGFsc28uICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBIZXJlIGlzIGEgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGBtb2R1bGVfbmFtZScgZmllbGQgaW4gICAgKi8KKyAgLyogICAgdGhlIEBGVF9Nb2R1bGVfQ2xhc3Mgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBhdXRvZml0dGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgYmRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIGNmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBneHZhbGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgb3R2YWxpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIHBjZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBwZnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgcHNhdXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIHBzaGludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBwc25hbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgcmFzdGVyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIHNmbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBzbW9vdGgsIHNtb290aC1sY2QsIHNtb290aC1sY2R2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgdHJ1ZXR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIHR5cGUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICB0eXBlNDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgdDFjaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIHdpbmZvbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBOb3RlIHRoYXQgdGhlIEZyZWVUeXBlIENhY2hlIHN1Yi1zeXN0ZW0gaXMgbm90IGEgRnJlZVR5cGUgbW9kdWxlLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPcmRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9Nb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTW9kdWxlX0NvbnN0cnVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX01vZHVsZV9EZXN0cnVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9Nb2R1bGVfUmVxdWVzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTW9kdWxlX0NsYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9BZGRfTW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2V0X01vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1JlbW92ZV9Nb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9BZGRfRGVmYXVsdF9Nb2R1bGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1Byb3BlcnR5X1NldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9Qcm9wZXJ0eV9HZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX05ld19MaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9Eb25lX0xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUmVmZXJlbmNlX0xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9SZW5kZXJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUmVuZGVyZXJfQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZXRfUmVuZGVyZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU2V0X1JlbmRlcmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TZXRfRGVidWdfSG9vayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyogbW9kdWxlIGJpdCBmbGFncyAqLworI2RlZmluZSBGVF9NT0RVTEVfRk9OVF9EUklWRVIgICAgICAgICAxICAvKiB0aGlzIG1vZHVsZSBpcyBhIGZvbnQgZHJpdmVyICAqLworI2RlZmluZSBGVF9NT0RVTEVfUkVOREVSRVIgICAgICAgICAgICAyICAvKiB0aGlzIG1vZHVsZSBpcyBhIHJlbmRlcmVyICAgICAqLworI2RlZmluZSBGVF9NT0RVTEVfSElOVEVSICAgICAgICAgICAgICA0ICAvKiB0aGlzIG1vZHVsZSBpcyBhIGdseXBoIGhpbnRlciAqLworI2RlZmluZSBGVF9NT0RVTEVfU1RZTEVSICAgICAgICAgICAgICA4ICAvKiB0aGlzIG1vZHVsZSBpcyBhIHN0eWxlciAgICAgICAqLworCisjZGVmaW5lIEZUX01PRFVMRV9EUklWRVJfU0NBTEFCTEUgICAgIDB4MTAwICAgLyogdGhlIGRyaXZlciBzdXBwb3J0cyAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGFibGUgZm9udHMgICAgICAgICAgICovCisjZGVmaW5lIEZUX01PRFVMRV9EUklWRVJfTk9fT1VUTElORVMgIDB4MjAwICAgLyogdGhlIGRyaXZlciBkb2VzIG5vdCAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VwcG9ydCB2ZWN0b3Igb3V0bGluZXMgICovCisjZGVmaW5lIEZUX01PRFVMRV9EUklWRVJfSEFTX0hJTlRFUiAgIDB4NDAwICAgLyogdGhlIGRyaXZlciBwcm92aWRlcyBpdHMgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3duIGhpbnRlciAgICAgICAgICAgICAgICovCisKKworICAvKiBkZXByZWNhdGVkIHZhbHVlcyAqLworI2RlZmluZSBmdF9tb2R1bGVfZm9udF9kcml2ZXIgICAgICAgICBGVF9NT0RVTEVfRk9OVF9EUklWRVIKKyNkZWZpbmUgZnRfbW9kdWxlX3JlbmRlcmVyICAgICAgICAgICAgRlRfTU9EVUxFX1JFTkRFUkVSCisjZGVmaW5lIGZ0X21vZHVsZV9oaW50ZXIgICAgICAgICAgICAgIEZUX01PRFVMRV9ISU5URVIKKyNkZWZpbmUgZnRfbW9kdWxlX3N0eWxlciAgICAgICAgICAgICAgRlRfTU9EVUxFX1NUWUxFUgorCisjZGVmaW5lIGZ0X21vZHVsZV9kcml2ZXJfc2NhbGFibGUgICAgIEZUX01PRFVMRV9EUklWRVJfU0NBTEFCTEUKKyNkZWZpbmUgZnRfbW9kdWxlX2RyaXZlcl9ub19vdXRsaW5lcyAgRlRfTU9EVUxFX0RSSVZFUl9OT19PVVRMSU5FUworI2RlZmluZSBmdF9tb2R1bGVfZHJpdmVyX2hhc19oaW50ZXIgICBGVF9NT0RVTEVfRFJJVkVSX0hBU19ISU5URVIKKworCisgIHR5cGVkZWYgRlRfUG9pbnRlciAgRlRfTW9kdWxlX0ludGVyZmFjZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX01vZHVsZV9Db25zdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBpbml0aWFsaXplIChub3QgY3JlYXRlKSBhIG5ldyBtb2R1bGUgb2JqZWN0LiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1vZHVsZSA6OiBUaGUgbW9kdWxlIHRvIGluaXRpYWxpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKkZUX01vZHVsZV9Db25zdHJ1Y3RvcikoIEZUX01vZHVsZSAgbW9kdWxlICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9Nb2R1bGVfRGVzdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gZmluYWxpemUgKG5vdCBkZXN0cm95KSBhIGdpdmVuIG1vZHVsZSBvYmplY3QuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtb2R1bGUgOjogVGhlIG1vZHVsZSB0byBmaW5hbGl6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgdm9pZAorICAoKkZUX01vZHVsZV9EZXN0cnVjdG9yKSggRlRfTW9kdWxlICBtb2R1bGUgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX01vZHVsZV9SZXF1ZXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBxdWVyeSBhIGdpdmVuIG1vZHVsZSBmb3IgYSBzcGVjaWZpYyBpbnRlcmZhY2UuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1vZHVsZSA6OiBUaGUgbW9kdWxlIHRvIGJlIHNlYXJjaGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbmFtZSA6OiAgIFRoZSBuYW1lIG9mIHRoZSBpbnRlcmZhY2UgaW4gdGhlIG1vZHVsZS4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIEZUX01vZHVsZV9JbnRlcmZhY2UKKyAgKCpGVF9Nb2R1bGVfUmVxdWVzdGVyKSggRlRfTW9kdWxlICAgIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIG5hbWUgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX01vZHVsZV9DbGFzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBtb2R1bGUgY2xhc3MgZGVzY3JpcHRvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1vZHVsZV9mbGFncyAgICA6OiBCaXQgZmxhZ3MgZGVzY3JpYmluZyB0aGUgbW9kdWxlLiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbW9kdWxlX3NpemUgICAgIDo6IFRoZSBzaXplIG9mIG9uZSBtb2R1bGUgb2JqZWN0L2luc3RhbmNlIGluICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbW9kdWxlX25hbWUgICAgIDo6IFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtb2R1bGVfdmVyc2lvbiAgOjogVGhlIHZlcnNpb24sIGFzIGEgMTYuMTYgZml4ZWQgbnVtYmVyICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgIChtYWpvci5taW5vcikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtb2R1bGVfcmVxdWlyZXMgOjogVGhlIHZlcnNpb24gb2YgRnJlZVR5cGUgdGhpcyBtb2R1bGUgcmVxdWlyZXMsICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgIGFzIGEgMTYuMTYgZml4ZWQgbnVtYmVyIChtYWpvci5taW5vcikuICBTdGFydHMgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICBhdCB2ZXJzaW9uIDIuMCwgaS5lLiwgMHgyMDAwMC4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbW9kdWxlX2luaXQgICAgIDo6IFRoZSBpbml0aWFsaXppbmcgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtb2R1bGVfZG9uZSAgICAgOjogVGhlIGZpbmFsaXppbmcgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdldF9pbnRlcmZhY2UgICA6OiBUaGUgaW50ZXJmYWNlIHJlcXVlc3RpbmcgZnVuY3Rpb24uICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX01vZHVsZV9DbGFzc18KKyAgeworICAgIEZUX1VMb25nICAgICAgICAgICAgICAgbW9kdWxlX2ZsYWdzOworICAgIEZUX0xvbmcgICAgICAgICAgICAgICAgbW9kdWxlX3NpemU7CisgICAgY29uc3QgRlRfU3RyaW5nKiAgICAgICBtb2R1bGVfbmFtZTsKKyAgICBGVF9GaXhlZCAgICAgICAgICAgICAgIG1vZHVsZV92ZXJzaW9uOworICAgIEZUX0ZpeGVkICAgICAgICAgICAgICAgbW9kdWxlX3JlcXVpcmVzOworCisgICAgY29uc3Qgdm9pZCogICAgICAgICAgICBtb2R1bGVfaW50ZXJmYWNlOworCisgICAgRlRfTW9kdWxlX0NvbnN0cnVjdG9yICBtb2R1bGVfaW5pdDsKKyAgICBGVF9Nb2R1bGVfRGVzdHJ1Y3RvciAgIG1vZHVsZV9kb25lOworICAgIEZUX01vZHVsZV9SZXF1ZXN0ZXIgICAgZ2V0X2ludGVyZmFjZTsKKworICB9IEZUX01vZHVsZV9DbGFzczsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0FkZF9Nb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFkZCBhIG5ldyBtb2R1bGUgdG8gYSBnaXZlbiBsaWJyYXJ5IGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNsYXp6ICAgOjogQSBwb2ludGVyIHRvIGNsYXNzIGRlc2NyaXB0b3IgZm9yIHRoZSBtb2R1bGUuICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBtb2R1bGUgYWxyZWFkeSBleGlzdHMgYnkgdGhhdCBuYW1lLCAqLworICAvKiAgICBvciBpZiB0aGUgbW9kdWxlIHJlcXVpcmVzIGEgdmVyc2lvbiBvZiBGcmVlVHlwZSB0aGF0IGlzIHRvbyBncmVhdC4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9BZGRfTW9kdWxlKCBGVF9MaWJyYXJ5ICAgICAgICAgICAgICBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICBjb25zdCBGVF9Nb2R1bGVfQ2xhc3MqICBjbGF6eiApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2V0X01vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRmluZCBhIG1vZHVsZSBieSBpdHMgbmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlicmFyeSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtb2R1bGVfbmFtZSA6OiBUaGUgbW9kdWxlJ3MgbmFtZSAoYXMgYW4gQVNDSUkgc3RyaW5nKS4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIG1vZHVsZSBoYW5kbGUuICAwfmlmIG5vbmUgd2FzIGZvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSdzIGludGVybmFsIG1vZHVsZXMgYXJlbid0IGRvY3VtZW50ZWQgdmVyeSB3ZWxsLCBhbmQgeW91ICAgKi8KKyAgLyogICAgc2hvdWxkIGxvb2sgdXAgdGhlIHNvdXJjZSBjb2RlIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX01vZHVsZSApCisgIEZUX0dldF9Nb2R1bGUoIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgbW9kdWxlX25hbWUgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1JlbW92ZV9Nb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJlbW92ZSBhIGdpdmVuIG1vZHVsZSBmcm9tIGEgbGlicmFyeSBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gYSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1vZHVsZSAgOjogQSBoYW5kbGUgdG8gYSBtb2R1bGUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBtb2R1bGUgb2JqZWN0IGlzIGRlc3Ryb3llZCBieSB0aGUgZnVuY3Rpb24gaW4gY2FzZSBvZiBzdWNjZXNzLiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX1JlbW92ZV9Nb2R1bGUoIEZUX0xpYnJhcnkgIGxpYnJhcnksCisgICAgICAgICAgICAgICAgICAgIEZUX01vZHVsZSAgIG1vZHVsZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgICBGVF9Qcm9wZXJ0eV9TZXQKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgICBTZXQgYSBwcm9wZXJ0eSBmb3IgYSBnaXZlbiBtb2R1bGUuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICAgbGlicmFyeSA6OgorICAgKiAgICAgICBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSB0aGUgbW9kdWxlIGlzIHBhcnQgb2YuCisgICAqCisgICAqICAgIG1vZHVsZV9uYW1lIDo6CisgICAqICAgICAgIFRoZSBtb2R1bGUgbmFtZS4KKyAgICoKKyAgICogICAgcHJvcGVydHlfbmFtZSA6OgorICAgKiAgICAgICBUaGUgcHJvcGVydHkgbmFtZS4gIFByb3BlcnRpZXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgYFN5bm9wc2lzJworICAgKiAgICAgICBzdWJzZWN0aW9uIG9mIHRoZSBtb2R1bGUncyBkb2N1bWVudGF0aW9uLgorICAgKgorICAgKiAgICAgICBOb3RlIHRoYXQgb25seSBhIGZldyBtb2R1bGVzIGhhdmUgcHJvcGVydGllcy4KKyAgICoKKyAgICogICAgdmFsdWUgOjoKKyAgICogICAgICAgQSBnZW5lcmljIHBvaW50ZXIgdG8gYSB2YXJpYWJsZSBvciBzdHJ1Y3R1cmUgdGhhdCBnaXZlcyB0aGUgbmV3CisgICAqICAgICAgIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4gIFRoZSBleGFjdCBkZWZpbml0aW9uIG9mIGB2YWx1ZScgaXMKKyAgICogICAgICAgZGVwZW5kZW50IG9uIHRoZSBwcm9wZXJ0eTsgc2VlIHRoZSBgU3lub3BzaXMnIHN1YnNlY3Rpb24gb2YgdGhlCisgICAqICAgICAgIG1vZHVsZSdzIGRvY3VtZW50YXRpb24uCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgIElmIGBtb2R1bGVfbmFtZScgaXNuJ3QgYSB2YWxpZCBtb2R1bGUgbmFtZSwgb3IgYHByb3BlcnR5X25hbWUnCisgICAqICAgIGRvZXNuJ3Qgc3BlY2lmeSBhIHZhbGlkIHByb3BlcnR5LCBvciBpZiBgdmFsdWUnIGRvZXNuJ3QgcmVwcmVzZW50IGEKKyAgICogICAgdmFsaWQgdmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eSwgYW4gZXJyb3IgaXMgcmV0dXJuZWQuCisgICAqCisgICAqICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzZXRzIHByb3BlcnR5IGBiYXInIChhIHNpbXBsZSBpbnRlZ2VyKSBpbgorICAgKiAgICBtb2R1bGUgYGZvbycgdG8gdmFsdWV+MS4KKyAgICoKKyAgICogICAgeworICAgKiAgICAgIEZUX1VJbnQgIGJhcjsKKyAgICoKKyAgICoKKyAgICogICAgICBiYXIgPSAxOworICAgKiAgICAgIEZUX1Byb3BlcnR5X1NldCggbGlicmFyeSwgImZvbyIsICJiYXIiLCAmYmFyICk7CisgICAqICAgIH0KKyAgICoKKyAgICogICAgTm90ZSB0aGF0IHRoZSBGcmVlVHlwZSBDYWNoZSBzdWItc3lzdGVtIGRvZXNuJ3QgcmVjb2duaXplIG1vZHVsZQorICAgKiAgICBwcm9wZXJ0eSBjaGFuZ2VzLiAgVG8gYXZvaWQgZ2x5cGggbG9va3VwIGNvbmZ1c2lvbiB3aXRoaW4gdGhlIGNhY2hlCisgICAqICAgIHlvdSBzaG91bGQgY2FsbCBARlRDX01hbmFnZXJfUmVzZXQgdG8gY29tcGxldGVseSBmbHVzaCB0aGUgY2FjaGUgaWYKKyAgICogICAgYSBtb2R1bGUgcHJvcGVydHkgZ2V0cyBjaGFuZ2VkIGFmdGVyIEBGVENfTWFuYWdlcl9OZXcgaGFzIGJlZW4KKyAgICogICAgY2FsbGVkLgorICAgKgorICAgKiAgICBJdCBpcyBub3QgcG9zc2libGUgdG8gc2V0IHByb3BlcnRpZXMgb2YgdGhlIEZyZWVUeXBlIENhY2hlCisgICAqICAgIHN1Yi1zeXN0ZW0gaXRzZWxmIHdpdGggRlRfUHJvcGVydHlfU2V0OyB1c2UgQEZUQ19Qcm9wZXJ0eV9TZXQKKyAgICogICAgaW5zdGVhZC4KKyAgICoKKyAgICogIEBzaW5jZToKKyAgICogICAgMi40LjExCisgICAqCisgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfUHJvcGVydHlfU2V0KCBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIG1vZHVsZV9uYW1lLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIHByb3BlcnR5X25hbWUsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogICAgICAgdmFsdWUgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICAgRlRfUHJvcGVydHlfR2V0CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICAgR2V0IGEgbW9kdWxlJ3MgcHJvcGVydHkgdmFsdWUuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICAgbGlicmFyeSA6OgorICAgKiAgICAgICBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSB0aGUgbW9kdWxlIGlzIHBhcnQgb2YuCisgICAqCisgICAqICAgIG1vZHVsZV9uYW1lIDo6CisgICAqICAgICAgIFRoZSBtb2R1bGUgbmFtZS4KKyAgICoKKyAgICogICAgcHJvcGVydHlfbmFtZSA6OgorICAgKiAgICAgICBUaGUgcHJvcGVydHkgbmFtZS4gIFByb3BlcnRpZXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgYFN5bm9wc2lzJworICAgKiAgICAgICBzdWJzZWN0aW9uIG9mIHRoZSBtb2R1bGUncyBkb2N1bWVudGF0aW9uLgorICAgKgorICAgKiBAaW5vdXQ6CisgICAqICAgIHZhbHVlIDo6CisgICAqICAgICAgIEEgZ2VuZXJpYyBwb2ludGVyIHRvIGEgdmFyaWFibGUgb3Igc3RydWN0dXJlIHRoYXQgZ2l2ZXMgdGhlCisgICAqICAgICAgIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4gIFRoZSBleGFjdCBkZWZpbml0aW9uIG9mIGB2YWx1ZScgaXMKKyAgICogICAgICAgZGVwZW5kZW50IG9uIHRoZSBwcm9wZXJ0eTsgc2VlIHRoZSBgU3lub3BzaXMnIHN1YnNlY3Rpb24gb2YgdGhlCisgICAqICAgICAgIG1vZHVsZSdzIGRvY3VtZW50YXRpb24uCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgIElmIGBtb2R1bGVfbmFtZScgaXNuJ3QgYSB2YWxpZCBtb2R1bGUgbmFtZSwgb3IgYHByb3BlcnR5X25hbWUnCisgICAqICAgIGRvZXNuJ3Qgc3BlY2lmeSBhIHZhbGlkIHByb3BlcnR5LCBvciBpZiBgdmFsdWUnIGRvZXNuJ3QgcmVwcmVzZW50IGEKKyAgICogICAgdmFsaWQgdmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eSwgYW4gZXJyb3IgaXMgcmV0dXJuZWQuCisgICAqCisgICAqICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBnZXRzIHByb3BlcnR5IGBiYXonIChhIHJhbmdlKSBpbiBtb2R1bGUgYGZvbycuCisgICAqCisgICAqICAgIHsKKyAgICogICAgICB0eXBlZGVmICByYW5nZV8KKyAgICogICAgICB7CisgICAqICAgICAgICBGVF9JbnQzMiAgbWluOworICAgKiAgICAgICAgRlRfSW50MzIgIG1heDsKKyAgICoKKyAgICogICAgICB9IHJhbmdlOworICAgKgorICAgKiAgICAgIHJhbmdlICBiYXo7CisgICAqCisgICAqCisgICAqICAgICAgRlRfUHJvcGVydHlfR2V0KCBsaWJyYXJ5LCAiZm9vIiwgImJheiIsICZiYXogKTsKKyAgICogICAgfQorICAgKgorICAgKiAgICBJdCBpcyBub3QgcG9zc2libGUgdG8gcmV0cmlldmUgcHJvcGVydGllcyBvZiB0aGUgRnJlZVR5cGUgQ2FjaGUKKyAgICogICAgc3ViLXN5c3RlbSB3aXRoIEZUX1Byb3BlcnR5X0dldDsgdXNlIEBGVENfUHJvcGVydHlfR2V0IGluc3RlYWQuCisgICAqCisgICAqICBAc2luY2U6CisgICAqICAgIDIuNC4xMQorICAgKgorICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX1Byb3BlcnR5X0dldCggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICBtb2R1bGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICBwcm9wZXJ0eV9uYW1lLAorICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgIHZhbHVlICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9SZWZlcmVuY2VfTGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGNvdW50ZXIgZ2V0cyBpbml0aWFsaXplZCB0b34xIGF0IHRoZSB0aW1lIGFuIEBGVF9MaWJyYXJ5ICAgICAgICAgKi8KKyAgLyogICAgc3RydWN0dXJlIGlzIGNyZWF0ZWQuICBUaGlzIGZ1bmN0aW9uIGluY3JlbWVudHMgdGhlIGNvdW50ZXIuICAgICAgICovCisgIC8qICAgIEBGVF9Eb25lX0xpYnJhcnkgdGhlbiBvbmx5IGRlc3Ryb3lzIGEgbGlicmFyeSBpZiB0aGUgY291bnRlciBpc34xLCAqLworICAvKiAgICBvdGhlcndpc2UgaXQgc2ltcGx5IGRlY3JlbWVudHMgdGhlIGNvdW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gaGVscHMgaW4gbWFuYWdpbmcgbGlmZS1jeWNsZXMgb2Ygc3RydWN0dXJlcyB0aGF0ICAgICAqLworICAvKiAgICByZWZlcmVuY2UgQEZUX0xpYnJhcnkgb2JqZWN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTaW5jZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAyLjQuMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9SZWZlcmVuY2VfTGlicmFyeSggRlRfTGlicmFyeSAgbGlicmFyeSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTmV3X0xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBGcmVlVHlwZSBsaWJyYXJ5IGluc3RhbmNlICAgICovCisgIC8qICAgIGZyb20gYSBnaXZlbiBtZW1vcnkgb2JqZWN0LiAgSXQgaXMgdGh1cyBwb3NzaWJsZSB0byB1c2UgbGlicmFyaWVzICAqLworICAvKiAgICB3aXRoIGRpc3RpbmN0IG1lbW9yeSBhbGxvY2F0b3JzIHdpdGhpbiB0aGUgc2FtZSBwcm9ncmFtLiAgTm90ZSwgICAgKi8KKyAgLyogICAgaG93ZXZlciwgdGhhdCB0aGUgdXNlZCBARlRfTWVtb3J5IHN0cnVjdHVyZSBpcyBleHBlY3RlZCB0byByZW1haW4gICovCisgIC8qICAgIHZhbGlkIGZvciB0aGUgbGlmZSBvZiB0aGUgQEZUX0xpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTm9ybWFsbHksIHlvdSB3b3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gKGZvbGxvd2VkIGJ5IGEgY2FsbCB0byAgICAgICovCisgIC8qICAgIEBGVF9BZGRfRGVmYXVsdF9Nb2R1bGVzIG9yIGEgc2VyaWVzIG9mIGNhbGxzIHRvIEBGVF9BZGRfTW9kdWxlKSAgICAqLworICAvKiAgICBpbnN0ZWFkIG9mIEBGVF9Jbml0X0ZyZWVUeXBlIHRvIGluaXRpYWxpemUgdGhlIEZyZWVUeXBlIGxpYnJhcnkuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERvbid0IHVzZSBARlRfRG9uZV9GcmVlVHlwZSBidXQgQEZUX0RvbmVfTGlicmFyeSB0byBkZXN0cm95IGEgICAgICAqLworICAvKiAgICBsaWJyYXJ5IGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtZW1vcnkgICA6OiBBIGhhbmRsZSB0byB0aGUgb3JpZ2luYWwgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhbGlicmFyeSA6OiBBIHBvaW50ZXIgdG8gaGFuZGxlIG9mIGEgbmV3IGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTZWUgdGhlIGRpc2N1c3Npb24gb2YgcmVmZXJlbmNlIGNvdW50ZXJzIGluIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgKi8KKyAgLyogICAgQEZUX1JlZmVyZW5jZV9MaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfTmV3X0xpYnJhcnkoIEZUX01lbW9yeSAgICBtZW1vcnksCisgICAgICAgICAgICAgICAgICBGVF9MaWJyYXJ5ICAqYWxpYnJhcnkgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0RvbmVfTGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERpc2NhcmQgYSBnaXZlbiBsaWJyYXJ5IG9iamVjdC4gIFRoaXMgY2xvc2VzIGFsbCBkcml2ZXJzIGFuZCAgICAgICAqLworICAvKiAgICBkaXNjYXJkcyBhbGwgcmVzb3VyY2Ugb2JqZWN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTZWUgdGhlIGRpc2N1c3Npb24gb2YgcmVmZXJlbmNlIGNvdW50ZXJzIGluIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgKi8KKyAgLyogICAgQEZUX1JlZmVyZW5jZV9MaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfRG9uZV9MaWJyYXJ5KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7CisKKyAgLyogKi8KKworICB0eXBlZGVmIHZvaWQKKyAgKCpGVF9EZWJ1Z0hvb2tfRnVuYykoIHZvaWQqICBhcmcgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1NldF9EZWJ1Z19Ib29rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFNldCBhIGRlYnVnIGhvb2sgZnVuY3Rpb24gZm9yIGRlYnVnZ2luZyB0aGUgaW50ZXJwcmV0ZXIgb2YgYSBmb250ICAqLworICAvKiAgICBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaWJyYXJ5ICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBob29rX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgZGVidWcgaG9vay4gIFlvdSBzaG91bGQgdXNlIHRoZSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICB2YWx1ZXMgZGVmaW5lZCBpbiBgZnRvYmpzLmgnLCBlLmcuLCAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgYEZUX0RFQlVHX0hPT0tfVFJVRVRZUEUnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZGVidWdfaG9vayA6OiBUaGUgZnVuY3Rpb24gdXNlZCB0byBkZWJ1ZyB0aGUgaW50ZXJwcmV0ZXIuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ3VycmVudGx5LCBmb3VyIGRlYnVnIGhvb2sgc2xvdHMgYXJlIGF2YWlsYWJsZSwgYnV0IG9ubHkgdHdvIChmb3IgICovCisgIC8qICAgIHRoZSBUcnVlVHlwZSBhbmQgdGhlIFR5cGV+MSBpbnRlcnByZXRlcikgYXJlIGRlZmluZWQuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2luY2UgdGhlIGludGVybmFsIGhlYWRlcnMgb2YgRnJlZVR5cGUgYXJlIG5vIGxvbmdlciBpbnN0YWxsZWQsICAgICovCisgIC8qICAgIHRoZSBzeW1ib2wgYEZUX0RFQlVHX0hPT0tfVFJVRVRZUEUnIGlzbid0IGF2YWlsYWJsZSBwdWJsaWNseS4gICAgICAqLworICAvKiAgICBUaGlzIGlzIGEgYnVnIGFuZCB3aWxsIGJlIGZpeGVkIGluIGEgZm9ydGhjb21pbmcgcmVsZWFzZS4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggdm9pZCApCisgIEZUX1NldF9EZWJ1Z19Ib29rKCBGVF9MaWJyYXJ5ICAgICAgICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICBob29rX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgRlRfRGVidWdIb29rX0Z1bmMgIGRlYnVnX2hvb2sgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0FkZF9EZWZhdWx0X01vZHVsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFkZCB0aGUgc2V0IG9mIGRlZmF1bHQgZHJpdmVycyB0byBhIGdpdmVuIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAqLworICAvKiAgICBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4geW91IGNyZWF0ZSBhIGxpYnJhcnkgb2JqZWN0IHdpdGggICAgICAgICAgKi8KKyAgLyogICAgQEZUX05ld19MaWJyYXJ5ICh1c3VhbGx5IHRvIHBsdWcgYSBjdXN0b20gbWVtb3J5IG1hbmFnZXIpLiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSB0byBhIG5ldyBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIHZvaWQgKQorICBGVF9BZGRfRGVmYXVsdF9Nb2R1bGVzKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7CisKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc2VjdGlvbjoKKyAgICogICB0cnVldHlwZV9lbmdpbmUKKyAgICoKKyAgICogQHRpdGxlOgorICAgKiAgIFRoZSBUcnVlVHlwZSBFbmdpbmUKKyAgICoKKyAgICogQGFic3RyYWN0OgorICAgKiAgIFRydWVUeXBlIGJ5dGVjb2RlIHN1cHBvcnQuCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGlzIHNlY3Rpb24gY29udGFpbnMgYSBmdW5jdGlvbiB1c2VkIHRvIHF1ZXJ5IHRoZSBsZXZlbCBvZiBUcnVlVHlwZQorICAgKiAgIGJ5dGVjb2RlIHN1cHBvcnQgY29tcGlsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgKgorICAgKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiAgQGVudW06CisgICAqICAgICBGVF9UcnVlVHlwZUVuZ2luZVR5cGUKKyAgICoKKyAgICogIEBkZXNjcmlwdGlvbjoKKyAgICogICAgIEEgbGlzdCBvZiB2YWx1ZXMgZGVzY3JpYmluZyB3aGljaCBraW5kIG9mIFRydWVUeXBlIGJ5dGVjb2RlCisgICAqICAgICBlbmdpbmUgaXMgaW1wbGVtZW50ZWQgaW4gYSBnaXZlbiBGVF9MaWJyYXJ5IGluc3RhbmNlLiAgSXQgaXMgdXNlZAorICAgKiAgICAgYnkgdGhlIEBGVF9HZXRfVHJ1ZVR5cGVfRW5naW5lX1R5cGUgZnVuY3Rpb24uCisgICAqCisgICAqICBAdmFsdWVzOgorICAgKiAgICAgRlRfVFJVRVRZUEVfRU5HSU5FX1RZUEVfTk9ORSA6OgorICAgKiAgICAgICBUaGUgbGlicmFyeSBkb2Vzbid0IGltcGxlbWVudCBhbnkga2luZCBvZiBieXRlY29kZSBpbnRlcnByZXRlci4KKyAgICoKKyAgICogICAgIEZUX1RSVUVUWVBFX0VOR0lORV9UWVBFX1VOUEFURU5URUQgOjoKKyAgICogICAgICAgVGhlIGxpYnJhcnkgaW1wbGVtZW50cyBhIGJ5dGVjb2RlIGludGVycHJldGVyIHRoYXQgZG9lc24ndAorICAgKiAgICAgICBzdXBwb3J0IHRoZSBwYXRlbnRlZCBvcGVyYXRpb25zIG9mIHRoZSBUcnVlVHlwZSB2aXJ0dWFsIG1hY2hpbmUuCisgICAqCisgICAqICAgICAgIEl0cyBtYWluIHVzZSBpcyB0byBsb2FkIGNlcnRhaW4gQXNpYW4gZm9udHMgdGhhdCBwb3NpdGlvbiBhbmQKKyAgICogICAgICAgc2NhbGUgZ2x5cGggY29tcG9uZW50cyB3aXRoIGJ5dGVjb2RlIGluc3RydWN0aW9ucy4gIEl0IHByb2R1Y2VzCisgICAqICAgICAgIGJhZCBvdXRwdXQgZm9yIG1vc3Qgb3RoZXIgZm9udHMuCisgICAqCisgICAqICAgICBGVF9UUlVFVFlQRV9FTkdJTkVfVFlQRV9QQVRFTlRFRCA6OgorICAgKiAgICAgICBUaGUgbGlicmFyeSBpbXBsZW1lbnRzIGEgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgdGhhdCBjb3ZlcnMKKyAgICogICAgICAgdGhlIGZ1bGwgaW5zdHJ1Y3Rpb24gc2V0IG9mIHRoZSBUcnVlVHlwZSB2aXJ0dWFsIG1hY2hpbmUgKHRoaXMKKyAgICogICAgICAgd2FzIGdvdmVybmVkIGJ5IHBhdGVudHMgdW50aWwgTWF5IDIwMTAsIGhlbmNlIHRoZSBuYW1lKS4KKyAgICoKKyAgICogIEBzaW5jZToKKyAgICogICAgIDIuMgorICAgKgorICAgKi8KKyAgdHlwZWRlZiBlbnVtICBGVF9UcnVlVHlwZUVuZ2luZVR5cGVfCisgIHsKKyAgICBGVF9UUlVFVFlQRV9FTkdJTkVfVFlQRV9OT05FID0gMCwKKyAgICBGVF9UUlVFVFlQRV9FTkdJTkVfVFlQRV9VTlBBVEVOVEVELAorICAgIEZUX1RSVUVUWVBFX0VOR0lORV9UWVBFX1BBVEVOVEVECisKKyAgfSBGVF9UcnVlVHlwZUVuZ2luZVR5cGU7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogIEBmdW5jOgorICAgKiAgICAgRlRfR2V0X1RydWVUeXBlX0VuZ2luZV9UeXBlCisgICAqCisgICAqICBAZGVzY3JpcHRpb246CisgICAqICAgICBSZXR1cm4gYW4gQEZUX1RydWVUeXBlRW5naW5lVHlwZSB2YWx1ZSB0byBpbmRpY2F0ZSB3aGljaCBsZXZlbCBvZgorICAgKiAgICAgdGhlIFRydWVUeXBlIHZpcnR1YWwgbWFjaGluZSBhIGdpdmVuIGxpYnJhcnkgaW5zdGFuY2Ugc3VwcG9ydHMuCisgICAqCisgICAqICBAaW5wdXQ6CisgICAqICAgICBsaWJyYXJ5IDo6CisgICAqICAgICAgIEEgbGlicmFyeSBpbnN0YW5jZS4KKyAgICoKKyAgICogIEByZXR1cm46CisgICAqICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hpY2ggbGV2ZWwgaXMgc3VwcG9ydGVkLgorICAgKgorICAgKiAgQHNpbmNlOgorICAgKiAgICAgMi4yCisgICAqCisgICAqLworICBGVF9FWFBPUlQoIEZUX1RydWVUeXBlRW5naW5lVHlwZSApCisgIEZUX0dldF9UcnVlVHlwZV9FbmdpbmVfVHlwZSggRlRfTGlicmFyeSAgbGlicmFyeSApOworCisgIC8qICovCisKKworRlRfRU5EX0hFQURFUgorCisjZW5kaWYgLyogX19GVE1PREFQSV9IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRtb2RlcnIuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRtb2RlcnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDdmOTgxCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdG1vZGVyci5oCkBAIC0wLDAgKzEsMTk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBmdG1vZGVyci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnJlZVR5cGUgbW9kdWxlIGVycm9yIG9mZnNldHMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDEtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIEZyZWVUeXBlIG1vZHVsZSBlcnJvciBjb2Rlcy4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIElmIHRoZSBtYWNybyBGVF9DT05GSUdfT1BUSU9OX1VTRV9NT0RVTEVfRVJST1JTIGluIGBmdG9wdGlvbi5oJyBpcyAgICAqLworICAvKiBzZXQsIHRoZSBsb3dlciBieXRlIG9mIGFuIGVycm9yIHZhbHVlIGlkZW50aWZpZXMgdGhlIGVycm9yIGNvZGUgYXMgICAgKi8KKyAgLyogdXN1YWwuICBJbiBhZGRpdGlvbiwgdGhlIGhpZ2hlciBieXRlIGlkZW50aWZpZXMgdGhlIG1vZHVsZS4gIEZvciAgICAgICovCisgIC8qIGV4YW1wbGUsIHRoZSBlcnJvciBgRlRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQnIGhhcyB2YWx1ZSAweDAwMDMsIHRoZSAqLworICAvKiBlcnJvciBgVFRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQnIGhhcyB2YWx1ZSAweDEzMDMsIHRoZSBlcnJvciAgICAgICAgKi8KKyAgLyogYFQxX0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0JyBoYXMgdmFsdWUgMHgxNDAzLCBldGMuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBOb3RlIHRoYXQgYEZUX0Vycl9PaycsIGBUVF9FcnJfT2snLCBldGMuIGFyZSBhbHdheXMgZXF1YWwgdG8gemVybywgICAgKi8KKyAgLyogaW5jbHVkaW5nIHRoZSBoaWdoIGJ5dGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBJZiBGVF9DT05GSUdfT1BUSU9OX1VTRV9NT0RVTEVfRVJST1JTIGlzbid0IHNldCwgdGhlIGhpZ2hlciBieXRlIG9mICAgKi8KKyAgLyogYW4gZXJyb3IgdmFsdWUgaXMgc2V0IHRvIHplcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUbyBoaWRlIHRoZSB2YXJpb3VzIGBYWFhfRXJyXycgcHJlZml4ZXMgaW4gdGhlIHNvdXJjZSBjb2RlLCBGcmVlVHlwZSAgKi8KKyAgLyogcHJvdmlkZXMgc29tZSBtYWNyb3MgaW4gYGZ0dHlwZXMuaCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEZUX0VSUiggZXJyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIEFkZCBjdXJyZW50IGVycm9yIG1vZHVsZSBwcmVmaXggKGFzIGRlZmluZWQgd2l0aCB0aGUgICAgICAgICAgICAgICovCisgIC8qICAgICBgRlRfRVJSX1BSRUZJWCcgbWFjcm8pIHRvIGBlcnInLiAgRm9yIGV4YW1wbGUsIGluIHRoZSBCREYgbW9kdWxlICAqLworICAvKiAgICAgdGhlIGxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIGVycm9yID0gRlRfRVJSKCBJbnZhbGlkX091dGxpbmUgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIGV4cGFuZHMgdG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICBlcnJvciA9IEJERl9FcnJfSW52YWxpZF9PdXRsaW5lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBGb3Igc2ltcGxpY2l0eSwgeW91IGNhbiBhbHdheXMgdXNlIGBGVF9FcnJfT2snIGRpcmVjdGx5IGluc3RlYWQgICAqLworICAvKiAgICAgb2YgYEZUX0VSUiggT2sgKScuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRlRfRVJSX0VRKCBlcnJjb2RlLCBlcnIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEZUX0VSUl9ORVEoIGVycmNvZGUsIGVyciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIENvbXBhcmUgZXJyb3IgY29kZSBgZXJyY29kZScgd2l0aCB0aGUgZXJyb3IgYGVycicgZm9yIGVxdWFsaXR5ICAgICovCisgIC8qICAgICBhbmQgaW5lcXVhbGl0eSwgcmVzcGVjdGl2ZWx5LiAgRXhhbXBsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgaWYgKCBGVF9FUlJfRVEoIGVycm9yLCBJbnZhbGlkX091dGxpbmUgKSApICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIFVzaW5nIHRoaXMgbWFjcm8geW91IGRvbid0IGhhdmUgdG8gdGhpbmsgYWJvdXQgZXJyb3IgcHJlZml4ZXMuICAgICovCisgIC8qICAgICBPZiBjb3Vyc2UsIGlmIG1vZHVsZSBlcnJvcnMgYXJlIG5vdCBhY3RpdmUsIHRoZSBhYm92ZSBleGFtcGxlIGlzICAqLworICAvKiAgICAgdGhlIHNhbWUgYXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgIGlmICggZXJyb3IgPT0gRlRfRXJyX0ludmFsaWRfT3V0bGluZSApICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRlRfRVJST1JfQkFTRSggZXJyY29kZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEZUX0VSUk9SX01PRFVMRSggZXJyY29kZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIEdldCBiYXNlIGVycm9yIGFuZCBtb2R1bGUgZXJyb3IgY29kZSwgcmVzcGVjdGl2ZWx5LiAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSXQgY2FuIGFsc28gYmUgdXNlZCB0byBjcmVhdGUgYSBtb2R1bGUgZXJyb3IgbWVzc2FnZSB0YWJsZSBlYXNpbHkgICAgICovCisgIC8qIHdpdGggc29tZXRoaW5nIGxpa2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAjdW5kZWYgX19GVE1PREVSUl9IX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgI2RlZmluZSBGVF9NT0RFUlJERUYoIGUsIHYsIHMgKSAgeyBGVF9Nb2RfRXJyXyAjIyBlLCBzIH0sICAgICAgICAgKi8KKyAgLyogICAgICNkZWZpbmUgRlRfTU9ERVJSX1NUQVJUX0xJU1QgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAjZGVmaW5lIEZUX01PREVSUl9FTkRfTElTVCAgICAgICB7IDAsIDAgfSB9OyAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIGNvbnN0IHN0cnVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICBpbnQgICAgICAgICAgbW9kX2Vycl9vZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgY29uc3QgY2hhciogIG1vZF9lcnJfbXNnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICB9IGZ0X21vZF9lcnJvcnNbXSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0ZUTU9ERVJSX0hfXworI2RlZmluZSBfX0ZUTU9ERVJSX0hfXworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKyAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICBTRVRVUCBNQUNST1MgICAgICAgICAgICAgICAgICAgICAgKioqKiovCisgIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI3VuZGVmICBGVF9ORUVEX0VYVEVSTl9DCisKKyNpZm5kZWYgRlRfTU9ERVJSREVGCisKKyNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1VTRV9NT0RVTEVfRVJST1JTCisjZGVmaW5lIEZUX01PREVSUkRFRiggZSwgdiwgcyApICBGVF9Nb2RfRXJyXyAjIyBlID0gdiwKKyNlbHNlCisjZGVmaW5lIEZUX01PREVSUkRFRiggZSwgdiwgcyApICBGVF9Nb2RfRXJyXyAjIyBlID0gMCwKKyNlbmRpZgorCisjZGVmaW5lIEZUX01PREVSUl9TVEFSVF9MSVNUICBlbnVtIHsKKyNkZWZpbmUgRlRfTU9ERVJSX0VORF9MSVNUICAgIEZUX01vZF9FcnJfTWF4IH07CisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBGVF9ORUVEX0VYVEVSTl9DCisgIGV4dGVybiAiQyIgeworI2VuZGlmCisKKyNlbmRpZiAvKiAhRlRfTU9ERVJSREVGICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLworICAvKioqKiogICAgICAgICAgICAgICBMSVNUIE1PRFVMRSBFUlJPUiBCQVNFUyAgICAgICAgICAgICAgICAgICAqKioqKi8KKyAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZkZWYgRlRfTU9ERVJSX1NUQVJUX0xJU1QKKyAgRlRfTU9ERVJSX1NUQVJUX0xJU1QKKyNlbmRpZgorCisKKyAgRlRfTU9ERVJSREVGKCBCYXNlLCAgICAgIDB4MDAwLCAiYmFzZSBtb2R1bGUiICkKKyAgRlRfTU9ERVJSREVGKCBBdXRvZml0LCAgIDB4MTAwLCAiYXV0b2ZpdHRlciBtb2R1bGUiICkKKyAgRlRfTU9ERVJSREVGKCBCREYsICAgICAgIDB4MjAwLCAiQkRGIG1vZHVsZSIgKQorICBGVF9NT0RFUlJERUYoIEJ6aXAyLCAgICAgMHgzMDAsICJCemlwMiBtb2R1bGUiICkKKyAgRlRfTU9ERVJSREVGKCBDYWNoZSwgICAgIDB4NDAwLCAiY2FjaGUgbW9kdWxlIiApCisgIEZUX01PREVSUkRFRiggQ0ZGLCAgICAgICAweDUwMCwgIkNGRiBtb2R1bGUiICkKKyAgRlRfTU9ERVJSREVGKCBDSUQsICAgICAgIDB4NjAwLCAiQ0lEIG1vZHVsZSIgKQorICBGVF9NT0RFUlJERUYoIEd6aXAsICAgICAgMHg3MDAsICJHemlwIG1vZHVsZSIgKQorICBGVF9NT0RFUlJERUYoIExaVywgICAgICAgMHg4MDAsICJMWlcgbW9kdWxlIiApCisgIEZUX01PREVSUkRFRiggT1R2YWxpZCwgICAweDkwMCwgIk9wZW5UeXBlIHZhbGlkYXRpb24gbW9kdWxlIiApCisgIEZUX01PREVSUkRFRiggUENGLCAgICAgICAweEEwMCwgIlBDRiBtb2R1bGUiICkKKyAgRlRfTU9ERVJSREVGKCBQRlIsICAgICAgIDB4QjAwLCAiUEZSIG1vZHVsZSIgKQorICBGVF9NT0RFUlJERUYoIFBTYXV4LCAgICAgMHhDMDAsICJQUyBhdXhpbGlhcnkgbW9kdWxlIiApCisgIEZUX01PREVSUkRFRiggUFNoaW50ZXIsICAweEQwMCwgIlBTIGhpbnRlciBtb2R1bGUiICkKKyAgRlRfTU9ERVJSREVGKCBQU25hbWVzLCAgIDB4RTAwLCAiUFMgbmFtZXMgbW9kdWxlIiApCisgIEZUX01PREVSUkRFRiggUmFzdGVyLCAgICAweEYwMCwgInJhc3RlciBtb2R1bGUiICkKKyAgRlRfTU9ERVJSREVGKCBTRk5ULCAgICAgMHgxMDAwLCAiU0ZOVCBtb2R1bGUiICkKKyAgRlRfTU9ERVJSREVGKCBTbW9vdGgsICAgMHgxMTAwLCAic21vb3RoIHJhc3RlciBtb2R1bGUiICkKKyAgRlRfTU9ERVJSREVGKCBUcnVlVHlwZSwgMHgxMjAwLCAiVHJ1ZVR5cGUgbW9kdWxlIiApCisgIEZUX01PREVSUkRFRiggVHlwZTEsICAgIDB4MTMwMCwgIlR5cGUgMSBtb2R1bGUiICkKKyAgRlRfTU9ERVJSREVGKCBUeXBlNDIsICAgMHgxNDAwLCAiVHlwZSA0MiBtb2R1bGUiICkKKyAgRlRfTU9ERVJSREVGKCBXaW5mb250cywgMHgxNTAwLCAiV2luZG93cyBGT04vRk5UIG1vZHVsZSIgKQorICBGVF9NT0RFUlJERUYoIEdYdmFsaWQsICAweDE2MDAsICJHWCB2YWxpZGF0aW9uIG1vZHVsZSIgKQorCisKKyNpZmRlZiBGVF9NT0RFUlJfRU5EX0xJU1QKKyAgRlRfTU9ERVJSX0VORF9MSVNUCisjZW5kaWYKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCisgIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICBDTEVBTlVQICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLworICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZmRlZiBGVF9ORUVEX0VYVEVSTl9DCisgIH0KKyNlbmRpZgorCisjdW5kZWYgRlRfTU9ERVJSX1NUQVJUX0xJU1QKKyN1bmRlZiBGVF9NT0RFUlJfRU5EX0xJU1QKKyN1bmRlZiBGVF9NT0RFUlJERUYKKyN1bmRlZiBGVF9ORUVEX0VYVEVSTl9DCisKKworI2VuZGlmIC8qIF9fRlRNT0RFUlJfSF9fICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0b3R2YWwuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRvdHZhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NDRiNzEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0b3R2YWwuaApAQCAtMCwwICsxLDIwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRvdHZhbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWVUeXBlIEFQSSBmb3IgdmFsaWRhdGluZyBPcGVuVHlwZSB0YWJsZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDA0LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBXYXJuaW5nOiBUaGlzIG1vZHVsZSBtaWdodCBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCBsaWJyYXJ5IGluIHRoZSAgICAgICAqLworLyogICAgICAgICAgZnV0dXJlIHRvIGF2b2lkIGEgdGlnaHQgZGVwZW5kZW5jeSBiZXR3ZWVuIEZyZWVUeXBlIGFuZCB0aGUgICAgKi8KKy8qICAgICAgICAgIE9wZW5UeXBlIHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0ZUT1RWQUxfSF9fCisjZGVmaW5lIF9fRlRPVFZBTF9IX18KKworI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CisjaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisKKyNpZmRlZiBGUkVFVFlQRV9ICisjZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgorI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCisjZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKKyNlbmRpZgorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgb3RfdmFsaWRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT3BlblR5cGUgVmFsaWRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQW4gQVBJIHRvIHZhbGlkYXRlIE9wZW5UeXBlIHRhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBmdW5jdGlvbnMgdG8gdmFsaWRhdGUgICAgICovCisgIC8qICAgIHNvbWUgT3BlblR5cGUgdGFibGVzIChCQVNFLCBHREVGLCBHUE9TLCBHU1VCLCBKU1RGLCBNQVRIKS4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE9yZGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX09wZW5UeXBlX1ZhbGlkYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PcGVuVHlwZV9GcmVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1ZBTElEQVRFX09UWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiBAZW51bToKKyAgKiAgICBGVF9WQUxJREFURV9PVFhYWAorICAqCisgICogQGRlc2NyaXB0aW9uOgorICAqICAgIEEgbGlzdCBvZiBiaXQtZmllbGQgY29uc3RhbnRzIHVzZWQgd2l0aCBARlRfT3BlblR5cGVfVmFsaWRhdGUgdG8KKyAgKiAgICBpbmRpY2F0ZSB3aGljaCBPcGVuVHlwZSB0YWJsZXMgc2hvdWxkIGJlIHZhbGlkYXRlZC4KKyAgKgorICAqIEB2YWx1ZXM6CisgICogICAgRlRfVkFMSURBVEVfQkFTRSA6OgorICAqICAgICAgVmFsaWRhdGUgQkFTRSB0YWJsZS4KKyAgKgorICAqICAgIEZUX1ZBTElEQVRFX0dERUYgOjoKKyAgKiAgICAgIFZhbGlkYXRlIEdERUYgdGFibGUuCisgICoKKyAgKiAgICBGVF9WQUxJREFURV9HUE9TIDo6CisgICogICAgICBWYWxpZGF0ZSBHUE9TIHRhYmxlLgorICAqCisgICogICAgRlRfVkFMSURBVEVfR1NVQiA6OgorICAqICAgICAgVmFsaWRhdGUgR1NVQiB0YWJsZS4KKyAgKgorICAqICAgIEZUX1ZBTElEQVRFX0pTVEYgOjoKKyAgKiAgICAgIFZhbGlkYXRlIEpTVEYgdGFibGUuCisgICoKKyAgKiAgICBGVF9WQUxJREFURV9NQVRIIDo6CisgICogICAgICBWYWxpZGF0ZSBNQVRIIHRhYmxlLgorICAqCisgICogICAgRlRfVkFMSURBVEVfT1QgOjoKKyAgKiAgICAgIFZhbGlkYXRlIGFsbCBPcGVuVHlwZSB0YWJsZXMgKEJBU0UsIEdERUYsIEdQT1MsIEdTVUIsIEpTVEYsIE1BVEgpLgorICAqCisgICovCisjZGVmaW5lIEZUX1ZBTElEQVRFX0JBU0UgIDB4MDEwMAorI2RlZmluZSBGVF9WQUxJREFURV9HREVGICAweDAyMDAKKyNkZWZpbmUgRlRfVkFMSURBVEVfR1BPUyAgMHgwNDAwCisjZGVmaW5lIEZUX1ZBTElEQVRFX0dTVUIgIDB4MDgwMAorI2RlZmluZSBGVF9WQUxJREFURV9KU1RGICAweDEwMDAKKyNkZWZpbmUgRlRfVkFMSURBVEVfTUFUSCAgMHgyMDAwCisKKyNkZWZpbmUgRlRfVkFMSURBVEVfT1QgIEZUX1ZBTElEQVRFX0JBU0UgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9HREVGIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgRlRfVkFMSURBVEVfR1BPUyB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX0dTVUIgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9KU1RGIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgRlRfVkFMSURBVEVfTUFUSAorCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIEBmdW5jdGlvbjoKKyAgKiAgICBGVF9PcGVuVHlwZV9WYWxpZGF0ZQorICAqCisgICogQGRlc2NyaXB0aW9uOgorICAqICAgIFZhbGlkYXRlIHZhcmlvdXMgT3BlblR5cGUgdGFibGVzIHRvIGFzc3VyZSB0aGF0IGFsbCBvZmZzZXRzIGFuZAorICAqICAgIGluZGljZXMgYXJlIHZhbGlkLiAgVGhlIGlkZWEgaXMgdGhhdCBhIGhpZ2hlci1sZXZlbCBsaWJyYXJ5IHRoYXQKKyAgKiAgICBhY3R1YWxseSBkb2VzIHRoZSB0ZXh0IGxheW91dCBjYW4gYWNjZXNzIHRob3NlIHRhYmxlcyB3aXRob3V0CisgICogICAgZXJyb3IgY2hlY2tpbmcgKHdoaWNoIGNhbiBiZSBxdWl0ZSB0aW1lIGNvbnN1bWluZykuCisgICoKKyAgKiBAaW5wdXQ6CisgICogICAgZmFjZSA6OgorICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgorICAqCisgICogICAgdmFsaWRhdGlvbl9mbGFncyA6OgorICAqICAgICAgIEEgYml0IGZpZWxkIHRoYXQgc3BlY2lmaWVzIHRoZSB0YWJsZXMgdG8gYmUgdmFsaWRhdGVkLiAgU2VlCisgICogICAgICAgQEZUX1ZBTElEQVRFX09UWFhYIGZvciBwb3NzaWJsZSB2YWx1ZXMuCisgICoKKyAgKiBAb3V0cHV0OgorICAqICAgIEJBU0VfdGFibGUgOjoKKyAgKiAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEJBU0UgdGFibGUuCisgICoKKyAgKiAgICBHREVGX3RhYmxlIDo6CisgICogICAgICAgQSBwb2ludGVyIHRvIHRoZSBHREVGIHRhYmxlLgorICAqCisgICogICAgR1BPU190YWJsZSA6OgorICAqICAgICAgIEEgcG9pbnRlciB0byB0aGUgR1BPUyB0YWJsZS4KKyAgKgorICAqICAgIEdTVUJfdGFibGUgOjoKKyAgKiAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEdTVUIgdGFibGUuCisgICoKKyAgKiAgICBKU1RGX3RhYmxlIDo6CisgICogICAgICAgQSBwb2ludGVyIHRvIHRoZSBKU1RGIHRhYmxlLgorICAqCisgICogQHJldHVybjoKKyAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICoKKyAgKiBAbm90ZToKKyAgKiAgIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyB3aXRoIE9wZW5UeXBlIGZvbnRzLCByZXR1cm5pbmcgYW4gZXJyb3IKKyAgKiAgIG90aGVyd2lzZS4KKyAgKgorICAqICAgQWZ0ZXIgdXNlLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGRlYWxsb2NhdGUgdGhlIGZpdmUgdGFibGVzIHdpdGgKKyAgKiAgIEBGVF9PcGVuVHlwZV9GcmVlLiAgQSBOVUxMIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSB0YWJsZSBlaXRoZXIKKyAgKiAgIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIGZvbnQsIG9yIHRoZSBhcHBsaWNhdGlvbiBoYXNuJ3QgYXNrZWQgZm9yCisgICogICB2YWxpZGF0aW9uLgorICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfT3BlblR5cGVfVmFsaWRhdGUoIEZUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgdmFsaWRhdGlvbl9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqQkFTRV90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqR0RFRl90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqR1BPU190YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqR1NVQl90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqSlNURl90YWJsZSApOworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIEBmdW5jdGlvbjoKKyAgKiAgICBGVF9PcGVuVHlwZV9GcmVlCisgICoKKyAgKiBAZGVzY3JpcHRpb246CisgICogICAgRnJlZSB0aGUgYnVmZmVyIGFsbG9jYXRlZCBieSBPcGVuVHlwZSB2YWxpZGF0b3IuCisgICoKKyAgKiBAaW5wdXQ6CisgICogICAgZmFjZSA6OgorICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgorICAqCisgICogICAgdGFibGUgOjoKKyAgKiAgICAgICBUaGUgcG9pbnRlciB0byB0aGUgYnVmZmVyIHRoYXQgaXMgYWxsb2NhdGVkIGJ5CisgICogICAgICAgQEZUX09wZW5UeXBlX1ZhbGlkYXRlLgorICAqCisgICogQG5vdGU6CisgICogICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCB0byBmcmVlIHRoZSBidWZmZXIgYWxsb2NhdGVkIGJ5CisgICogICBARlRfT3BlblR5cGVfVmFsaWRhdGUgb25seS4KKyAgKi8KKyAgRlRfRVhQT1JUKCB2b2lkICkKKyAgRlRfT3BlblR5cGVfRnJlZSggRlRfRmFjZSAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICB0YWJsZSApOworCisgIC8qICovCisKKworRlRfRU5EX0hFQURFUgorCisjZW5kaWYgLyogX19GVE9UVkFMX0hfXyAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdG91dGxuLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0b3V0bG4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmVjNzBkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdG91dGxuLmgKQEAgLTAsMCArMSw1NzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0b3V0bG4uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBTdXBwb3J0IGZvciB0aGUgRlRfT3V0bGluZSB0eXBlIHVzZWQgdG8gc3RvcmUgZ2x5cGggc2hhcGVzIG9mICAgICAgICAqLworLyogICAgbW9zdCBzY2FsYWJsZSBmb250IGZvcm1hdHMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX19GVE9VVExOX0hfXworI2RlZmluZSBfX0ZUT1VUTE5fSF9fCisKKworI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CisjaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisKKyNpZmRlZiBGUkVFVFlQRV9ICisjZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgorI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCisjZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKKyNlbmRpZgorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgb3V0bGluZV9wcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT3V0bGluZSBQcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnVuY3Rpb25zIHRvIGNyZWF0ZSwgdHJhbnNmb3JtLCBhbmQgcmVuZGVyIHZlY3RvcmlhbCBnbHlwaCBpbWFnZXMuICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHJvdXRpbmVzIHVzZWQgdG8gY3JlYXRlIGFuZCBkZXN0cm95IHNjYWxhYmxlICovCisgIC8qICAgIGdseXBoIGltYWdlcyBrbm93biBhcyBgb3V0bGluZXMnLiAgVGhlc2UgY2FuIGFsc28gYmUgbWVhc3VyZWQsICAgICAqLworICAvKiAgICB0cmFuc2Zvcm1lZCwgYW5kIGNvbnZlcnRlZCBpbnRvIGJpdG1hcHMgYW5kIHBpeG1hcHMuICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPcmRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PdXRsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT3V0bGluZV9OZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX091dGxpbmVfRG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PdXRsaW5lX0NvcHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT3V0bGluZV9UcmFuc2xhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX091dGxpbmVfVHJhbnNmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PdXRsaW5lX0VtYm9sZGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT3V0bGluZV9FbWJvbGRlblhZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX091dGxpbmVfUmV2ZXJzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PdXRsaW5lX0NoZWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX091dGxpbmVfR2V0X0NCb3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PdXRsaW5lX0dldF9CQm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX091dGxpbmVfR2V0X0JpdG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PdXRsaW5lX1JlbmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT3V0bGluZV9EZWNvbXBvc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX091dGxpbmVfRnVuY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PdXRsaW5lX01vdmVUb0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT3V0bGluZV9MaW5lVG9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX091dGxpbmVfQ29uaWNUb0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PdXRsaW5lX0N1YmljVG9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX09yaWVudGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PdXRsaW5lX0dldF9PcmllbnRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX09VVExJTkVfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PdXRsaW5lX0RlY29tcG9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBXYWxrIG92ZXIgYW4gb3V0bGluZSdzIHN0cnVjdHVyZSB0byBkZWNvbXBvc2UgaXQgaW50byBpbmRpdmlkdWFsICAgKi8KKyAgLyogICAgc2VnbWVudHMgYW5kIELDqXppZXIgYXJjcy4gIFRoaXMgZnVuY3Rpb24gYWxzbyBlbWl0cyBgbW92ZSB0bycgICAgICAqLworICAvKiAgICBvcGVyYXRpb25zIHRvIGluZGljYXRlIHRoZSBzdGFydCBvZiBuZXcgY29udG91cnMgaW4gdGhlIG91dGxpbmUuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvdXRsaW5lICAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSB0YXJnZXQuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZ1bmNfaW50ZXJmYWNlIDo6IEEgdGFibGUgb2YgYGVtaXR0ZXJzJywgaS5lLiwgZnVuY3Rpb24gcG9pbnRlcnMgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQgZHVyaW5nIGRlY29tcG9zaXRpb24gdG8gaW5kaWNhdGUgcGF0aCAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdXNlciAgICAgICAgICAgOjogQSB0eXBlbGVzcyBwb2ludGVyIHRoYXQgaXMgcGFzc2VkIHRvIGVhY2ggICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgIGVtaXR0ZXIgZHVyaW5nIHRoZSBkZWNvbXBvc2l0aW9uLiAgSXQgY2FuIGJlICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIHN0b3JlIHRoZSBzdGF0ZSBkdXJpbmcgdGhlICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NpdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBjb250b3VyIHRoYXQgY29udGFpbnMgYSBzaW5nbGUgcG9pbnQgb25seSBpcyByZXByZXNlbnRlZCBieSBhICAgICovCisgIC8qICAgIGBtb3ZlIHRvJyBvcGVyYXRpb24gZm9sbG93ZWQgYnkgYGxpbmUgdG8nIHRvIHRoZSBzYW1lIHBvaW50LiAgSW4gICAqLworICAvKiAgICBtb3N0IGNhc2VzLCBpdCBpcyBiZXN0IHRvIGZpbHRlciB0aGlzIG91dCBiZWZvcmUgdXNpbmcgdGhlICAgICAgICAgKi8KKyAgLyogICAgb3V0bGluZSBmb3Igc3Ryb2tpbmcgcHVycG9zZXMgKG90aGVyd2lzZSBpdCB3b3VsZCByZXN1bHQgaW4gYSAgICAgICovCisgIC8qICAgIHZpc2libGUgZG90IHdoZW4gcm91bmQgY2FwcyBhcmUgdXNlZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX091dGxpbmVfRGVjb21wb3NlKCBGVF9PdXRsaW5lKiAgICAgICAgICAgICAgb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX091dGxpbmVfRnVuY3MqICBmdW5jX2ludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICB1c2VyICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PdXRsaW5lX05ldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDcmVhdGUgYSBuZXcgb3V0bGluZSBvZiBhIGdpdmVuIHNpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaWJyYXJ5ICAgICA6OiBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSBvYmplY3QgZnJvbSB3aGVyZSB0aGUgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgb3V0bGluZSBpcyBhbGxvY2F0ZWQuICBOb3RlIGhvd2V2ZXIgdGhhdCB0aGUgbmV3ICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIG91dGxpbmUgd2lsbCAqbm90KiBuZWNlc3NhcmlseSBiZSAqZnJlZWQqLCB3aGVuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBkZXN0cm95aW5nIHRoZSBsaWJyYXJ5LCBieSBARlRfRG9uZV9GcmVlVHlwZS4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bVBvaW50cyAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBwb2ludHMgd2l0aGluIHRoZSBvdXRsaW5lLiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICBNdXN0IGJlIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byAweEZGRkYgKDY1NTM1KS4gICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bUNvbnRvdXJzIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb250b3VycyB3aXRoaW4gdGhlIG91dGxpbmUuICAqLworICAvKiAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIG11c3QgYmUgaW4gdGhlIHJhbmdlIDAgdG8gYG51bVBvaW50cycuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhbm91dGxpbmUgICA6OiBBIGhhbmRsZSB0byB0aGUgbmV3IG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgcmVhc29uIHdoeSB0aGlzIGZ1bmN0aW9uIHRha2VzIGEgYGxpYnJhcnknIHBhcmFtZXRlciBpcyBzaW1wbHkgKi8KKyAgLyogICAgdG8gdXNlIHRoZSBsaWJyYXJ5J3MgbWVtb3J5IGFsbG9jYXRvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfT3V0bGluZV9OZXcoIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIG51bVBvaW50cywKKyAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICBudW1Db250b3VycywKKyAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUgICphbm91dGxpbmUgKTsKKworCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9PdXRsaW5lX05ld19JbnRlcm5hbCggRlRfTWVtb3J5ICAgIG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBudW1Qb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgbnVtQ29udG91cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lICAqYW5vdXRsaW5lICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PdXRsaW5lX0RvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBEZXN0cm95IGFuIG91dGxpbmUgY3JlYXRlZCB3aXRoIEBGVF9PdXRsaW5lX05ldy4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIG9mIHRoZSBsaWJyYXJ5IG9iamVjdCB1c2VkIHRvIGFsbG9jYXRlIHRoZSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvdXRsaW5lIDo6IEEgcG9pbnRlciB0byB0aGUgb3V0bGluZSBvYmplY3QgdG8gYmUgZGlzY2FyZGVkLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJZiB0aGUgb3V0bGluZSdzIGBvd25lcicgZmllbGQgaXMgbm90IHNldCwgb25seSB0aGUgb3V0bGluZSAgICAgICAgKi8KKyAgLyogICAgZGVzY3JpcHRvciB3aWxsIGJlIHJlbGVhc2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgcmVhc29uIHdoeSB0aGlzIGZ1bmN0aW9uIHRha2VzIGFuIGBsaWJyYXJ5JyBwYXJhbWV0ZXIgaXMgICAgICAgKi8KKyAgLyogICAgc2ltcGx5IHRvIHVzZSBmdF9tZW1fZnJlZSgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfT3V0bGluZV9Eb25lKCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSApOworCisKKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX091dGxpbmVfRG9uZV9JbnRlcm5hbCggRlRfTWVtb3J5ICAgIG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT3V0bGluZV9DaGVjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ2hlY2sgdGhlIGNvbnRlbnRzIG9mIGFuIG91dGxpbmUgZGVzY3JpcHRvci4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgb3V0bGluZSA6OiBBIGhhbmRsZSB0byBhIHNvdXJjZSBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfT3V0bGluZV9DaGVjayggRlRfT3V0bGluZSogIG91dGxpbmUgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX091dGxpbmVfR2V0X0NCb3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJldHVybiBhbiBvdXRsaW5lJ3MgYGNvbnRyb2wgYm94Jy4gIFRoZSBjb250cm9sIGJveCBlbmNsb3NlcyBhbGwgICAqLworICAvKiAgICB0aGUgb3V0bGluZSdzIHBvaW50cywgaW5jbHVkaW5nIELDqXppZXIgY29udHJvbCBwb2ludHMuICBUaG91Z2ggaXQgICovCisgIC8qICAgIGNvaW5jaWRlcyB3aXRoIHRoZSBleGFjdCBib3VuZGluZyBib3ggZm9yIG1vc3QgZ2x5cGhzLCBpdCBjYW4gYmUgICAqLworICAvKiAgICBzbGlnaHRseSBsYXJnZXIgaW4gc29tZSBzaXR1YXRpb25zIChsaWtlIHdoZW4gcm90YXRpbmcgYW4gb3V0bGluZSAgKi8KKyAgLyogICAgdGhhdCBjb250YWlucyBCw6l6aWVyIG91dHNpZGUgYXJjcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ29tcHV0aW5nIHRoZSBjb250cm9sIGJveCBpcyB2ZXJ5IGZhc3QsIHdoaWxlIGdldHRpbmcgdGhlIGJvdW5kaW5nICovCisgIC8qICAgIGJveCBjYW4gdGFrZSBtdWNoIG1vcmUgdGltZSBhcyBpdCBuZWVkcyB0byB3YWxrIG92ZXIgYWxsIHNlZ21lbnRzICAqLworICAvKiAgICBhbmQgYXJjcyBpbiB0aGUgb3V0bGluZS4gIFRvIGdldCB0aGUgbGF0dGVyLCB5b3UgY2FuIHVzZSB0aGUgICAgICAgKi8KKyAgLyogICAgYGZ0YmJveCcgY29tcG9uZW50LCB3aGljaCBpcyBkZWRpY2F0ZWQgdG8gdGhpcyBzaW5nbGUgdGFzay4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgb3V0bGluZSA6OiBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBvdXRsaW5lIGRlc2NyaXB0b3IuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYWNib3ggICA6OiBUaGUgb3V0bGluZSdzIGNvbnRyb2wgYm94LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2VlIEBGVF9HbHlwaF9HZXRfQ0JveCBmb3IgYSBkaXNjdXNzaW9uIG9mIHRyaWNreSBmb250cy4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIHZvaWQgKQorICBGVF9PdXRsaW5lX0dldF9DQm94KCBjb25zdCBGVF9PdXRsaW5lKiAgb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlRfQkJveCAgICAgICAgICAgKmFjYm94ICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBcHBseSBhIHNpbXBsZSB0cmFuc2xhdGlvbiB0byB0aGUgcG9pbnRzIG9mIGFuIG91dGxpbmUuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvdXRsaW5lIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IG91dGxpbmUgZGVzY3JpcHRvci4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4T2Zmc2V0IDo6IFRoZSBob3Jpem9udGFsIG9mZnNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHlPZmZzZXQgOjogVGhlIHZlcnRpY2FsIG9mZnNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCB2b2lkICkKKyAgRlRfT3V0bGluZV9UcmFuc2xhdGUoIGNvbnN0IEZUX091dGxpbmUqICBvdXRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICAgICAgIHhPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICAgICAgeU9mZnNldCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT3V0bGluZV9Db3B5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ29weSBhbiBvdXRsaW5lIGludG8gYW5vdGhlciBvbmUuICBCb3RoIG9iamVjdHMgbXVzdCBoYXZlIHRoZSAgICAgICovCisgIC8qICAgIHNhbWUgc2l6ZXMgKG51bWJlciBvZiBwb2ludHMgJiBudW1iZXIgb2YgY29udG91cnMpIHdoZW4gdGhpcyAgICAgICAqLworICAvKiAgICBmdW5jdGlvbiBpcyBjYWxsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzb3VyY2UgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0YXJnZXQgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9PdXRsaW5lX0NvcHkoIGNvbnN0IEZUX091dGxpbmUqICBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSAgICAgICAgKnRhcmdldCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT3V0bGluZV9UcmFuc2Zvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQXBwbHkgYSBzaW1wbGUgMngyIG1hdHJpeCB0byBhbGwgb2YgYW4gb3V0bGluZSdzIHBvaW50cy4gIFVzZWZ1bCAgICovCisgIC8qICAgIGZvciBhcHBseWluZyByb3RhdGlvbnMsIHNsYW50aW5nLCBmbGlwcGluZywgZXRjLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG91dGxpbmUgOjogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgb3V0bGluZSBkZXNjcmlwdG9yLiAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1hdHJpeCAgOjogQSBwb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFlvdSBjYW4gdXNlIEBGVF9PdXRsaW5lX1RyYW5zbGF0ZSBpZiB5b3UgbmVlZCB0byB0cmFuc2xhdGUgdGhlICAgICAqLworICAvKiAgICBvdXRsaW5lJ3MgcG9pbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggdm9pZCApCisgIEZUX091dGxpbmVfVHJhbnNmb3JtKCBjb25zdCBGVF9PdXRsaW5lKiAgb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX01hdHJpeCogICBtYXRyaXggKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX091dGxpbmVfRW1ib2xkZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEVtYm9sZGVuIGFuIG91dGxpbmUuICBUaGUgbmV3IG91dGxpbmUgd2lsbCBiZSBhdCBtb3N0IDR+dGltZXMgICAgICAqLworICAvKiAgICBgc3RyZW5ndGgnIHBpeGVscyB3aWRlciBhbmQgaGlnaGVyLiAgWW91IG1heSB0aGluayBvZiB0aGUgbGVmdCBhbmQgKi8KKyAgLyogICAgYm90dG9tIGJvcmRlcnMgYXMgdW5jaGFuZ2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBOZWdhdGl2ZSBgc3RyZW5ndGgnIHZhbHVlcyB0byByZWR1Y2UgdGhlIG91dGxpbmUgdGhpY2tuZXNzIGFyZSAgICAgKi8KKyAgLyogICAgcG9zc2libGUgYWxzby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgb3V0bGluZSAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZW5ndGggOjogSG93IHN0cm9uZyB0aGUgZ2x5cGggaXMgZW1ib2xkZW5lZC4gIEV4cHJlc3NlZCBpbiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgIDI2LjYgcGl4ZWwgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSB1c2VkIGFsZ29yaXRobSB0byBpbmNyZWFzZSBvciBkZWNyZWFzZSB0aGUgdGhpY2tuZXNzIG9mIHRoZSAgICAqLworICAvKiAgICBnbHlwaCBkb2Vzbid0IGNoYW5nZSB0aGUgbnVtYmVyIG9mIHBvaW50czsgdGhpcyBtZWFucyB0aGF0IGNlcnRhaW4gKi8KKyAgLyogICAgc2l0dWF0aW9ucyBsaWtlIGFjdXRlIGFuZ2xlcyBvciBpbnRlcnNlY3Rpb25zIGFyZSBzb21ldGltZXMgICAgICAgICovCisgIC8qICAgIGhhbmRsZWQgaW5jb3JyZWN0bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSWYgeW91IG5lZWQgYGJldHRlcicgbWV0cmljcyB2YWx1ZXMgeW91IHNob3VsZCBjYWxsICAgICAgICAgICAgICAgICovCisgIC8qICAgIEBGVF9PdXRsaW5lX0dldF9DQm94IG9yIEBGVF9PdXRsaW5lX0dldF9CQm94LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRXhhbXBsZSBjYWxsOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBGVF9Mb2FkX0dseXBoKCBmYWNlLCBpbmRleCwgRlRfTE9BRF9ERUZBVUxUICk7ICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgaWYgKCBmYWNlLT5nbHlwaC0+Zm9ybWF0ID09IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FICkgICAgICAgICAgICAqLworICAvKiAgICAgICAgRlRfT3V0bGluZV9FbWJvbGRlbiggJmZhY2UtPmdseXBoLT5vdXRsaW5lLCBzdHJlbmd0aCApOyAgICAgICAgKi8KKyAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUbyBnZXQgbWVhbmluZ2Z1bCByZXN1bHRzLCBmb250IHNjYWxpbmcgdmFsdWVzIG11c3QgYmUgc2V0IHdpdGggICAgKi8KKyAgLyogICAgZnVuY3Rpb25zIGxpa2UgQEZUX1NldF9DaGFyX1NpemUgYmVmb3JlIGNhbGxpbmcgRlRfUmVuZGVyX0dseXBoLiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfT3V0bGluZV9FbWJvbGRlbiggRlRfT3V0bGluZSogIG91dGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICBzdHJlbmd0aCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT3V0bGluZV9FbWJvbGRlblhZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRW1ib2xkZW4gYW4gb3V0bGluZS4gIFRoZSBuZXcgb3V0bGluZSB3aWxsIGJlIGB4c3RyZW5ndGgnIHBpeGVscyAgICovCisgIC8qICAgIHdpZGVyIGFuZCBgeXN0cmVuZ3RoJyBwaXhlbHMgaGlnaGVyLiAgT3RoZXJ3aXNlLCBpdCBpcyBzaW1pbGFyIHRvICAqLworICAvKiAgICBARlRfT3V0bGluZV9FbWJvbGRlbiwgd2hpY2ggdXNlcyB0aGUgc2FtZSBzdHJlbmd0aCBpbiBib3RoICAgICAgICAgKi8KKyAgLyogICAgZGlyZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfT3V0bGluZV9FbWJvbGRlblhZKCBGVF9PdXRsaW5lKiAgb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgeHN0cmVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICB5c3RyZW5ndGggKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX091dGxpbmVfUmV2ZXJzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJldmVyc2UgdGhlIGRyYXdpbmcgZGlyZWN0aW9uIG9mIGFuIG91dGxpbmUuICBUaGlzIGlzIHVzZWQgdG8gICAgICAqLworICAvKiAgICBlbnN1cmUgY29uc2lzdGVudCBmaWxsIGNvbnZlbnRpb25zIGZvciBtaXJyb3JlZCBnbHlwaHMuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvdXRsaW5lIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IG91dGxpbmUgZGVzY3JpcHRvci4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIHRvZ2dsZXMgdGhlIGJpdCBmbGFnIEBGVF9PVVRMSU5FX1JFVkVSU0VfRklMTCBpbiAgICAgKi8KKyAgLyogICAgdGhlIG91dGxpbmUncyBgZmxhZ3MnIGZpZWxkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJdCBzaG91bGRuJ3QgYmUgdXNlZCBieSBhIG5vcm1hbCBjbGllbnQgYXBwbGljYXRpb24sIHVubGVzcyBpdCAgICAgKi8KKyAgLyogICAga25vd3Mgd2hhdCBpdCBpcyBkb2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIHZvaWQgKQorICBGVF9PdXRsaW5lX1JldmVyc2UoIEZUX091dGxpbmUqICBvdXRsaW5lICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PdXRsaW5lX0dldF9CaXRtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZW5kZXIgYW4gb3V0bGluZSB3aXRoaW4gYSBiaXRtYXAuICBUaGUgb3V0bGluZSdzIGltYWdlIGlzIHNpbXBseSAgKi8KKyAgLyogICAgT1ItZWQgdG8gdGhlIHRhcmdldCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSB0byBhIEZyZWVUeXBlIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvdXRsaW5lIDo6IEEgcG9pbnRlciB0byB0aGUgc291cmNlIG91dGxpbmUgZGVzY3JpcHRvci4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhYml0bWFwIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IGJpdG1hcCBkZXNjcmlwdG9yLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgTk9UIENSRUFURSB0aGUgYml0bWFwLCBpdCBvbmx5IHJlbmRlcnMgYW4gICAgICAgKi8KKyAgLyogICAgb3V0bGluZSBpbWFnZSB3aXRoaW4gdGhlIG9uZSB5b3UgcGFzcyB0byBpdCEgIENvbnNlcXVlbnRseSwgdGhlICAgICovCisgIC8qICAgIHZhcmlvdXMgZmllbGRzIGluIGBhYml0bWFwJyBzaG91bGQgYmUgc2V0IGFjY29yZGluZ2x5LiAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSXQgd2lsbCB1c2UgdGhlIHJhc3RlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBkZWZhdWx0IGdseXBoIGZvcm1hdC4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgdmFsdWUgb2YgdGhlIGBudW1fZ3JheXMnIGZpZWxkIGluIGBhYml0bWFwJyBpcyBpZ25vcmVkLiAgSWYgICAgKi8KKyAgLyogICAgeW91IHNlbGVjdCB0aGUgZ3JheS1sZXZlbCByYXN0ZXJpemVyLCBhbmQgeW91IHdhbnQgbGVzcyB0aGFuIDI1NiAgICovCisgIC8qICAgIGdyYXkgbGV2ZWxzLCB5b3UgaGF2ZSB0byB1c2UgQEZUX091dGxpbmVfUmVuZGVyIGRpcmVjdGx5LiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX091dGxpbmVfR2V0X0JpdG1hcCggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgICAgICBvdXRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0JpdG1hcCAgKmFiaXRtYXAgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX091dGxpbmVfUmVuZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJlbmRlciBhbiBvdXRsaW5lIHdpdGhpbiBhIGJpdG1hcCB1c2luZyB0aGUgY3VycmVudCBzY2FuLWNvbnZlcnQuICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIHVzZXMgYW4gQEZUX1Jhc3Rlcl9QYXJhbXMgc3RydWN0dXJlIGFzIGFuIGFyZ3VtZW50LCAgKi8KKyAgLyogICAgYWxsb3dpbmcgYWR2YW5jZWQgZmVhdHVyZXMgbGlrZSBkaXJlY3QgY29tcG9zaXRpb24sIHRyYW5zbHVjZW5jeSwgICovCisgIC8qICAgIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gYSBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgb3V0bGluZSA6OiBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBvdXRsaW5lIGRlc2NyaXB0b3IuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcGFyYW1zICA6OiBBIHBvaW50ZXIgdG8gYW4gQEZUX1Jhc3Rlcl9QYXJhbXMgc3RydWN0dXJlIHVzZWQgdG8gICAgICovCisgIC8qICAgICAgICAgICAgICAgZGVzY3JpYmUgdGhlIHJlbmRlcmluZyBvcGVyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFlvdSBzaG91bGQga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcgYW5kIGhvdyBARlRfUmFzdGVyX1BhcmFtcyB3b3JrcyAqLworICAvKiAgICB0byB1c2UgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBmaWVsZCBgcGFyYW1zLnNvdXJjZScgd2lsbCBiZSBzZXQgdG8gYG91dGxpbmUnIGJlZm9yZSB0aGUgc2NhbiAqLworICAvKiAgICBjb252ZXJ0ZXIgaXMgY2FsbGVkLCB3aGljaCBtZWFucyB0aGF0IHRoZSB2YWx1ZSB5b3UgZ2l2ZSB0byBpdCBpcyAgKi8KKyAgLyogICAgYWN0dWFsbHkgaWdub3JlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgZ3JheS1sZXZlbCByYXN0ZXJpemVyIGFsd2F5cyB1c2VzIDI1NiBncmF5IGxldmVscy4gIElmIHlvdSAgICAgKi8KKyAgLyogICAgd2FudCBsZXNzIGdyYXkgbGV2ZWxzLCB5b3UgaGF2ZSB0byBwcm92aWRlIHlvdXIgb3duIHNwYW4gY2FsbGJhY2suICovCisgIC8qICAgIFNlZSB0aGUgQEZUX1JBU1RFUl9GTEFHX0RJUkVDVCB2YWx1ZSBvZiB0aGUgYGZsYWdzJyBmaWVsZCBpbiB0aGUgICAqLworICAvKiAgICBARlRfUmFzdGVyX1BhcmFtcyBzdHJ1Y3R1cmUgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9PdXRsaW5lX1JlbmRlciggRlRfTGlicmFyeSAgICAgICAgIGxpYnJhcnksCisgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgICAgICAgb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgIEZUX1Jhc3Rlcl9QYXJhbXMqICBwYXJhbXMgKTsKKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiBAZW51bToKKyAgKiAgIEZUX09yaWVudGF0aW9uCisgICoKKyAgKiBAZGVzY3JpcHRpb246CisgICogICBBIGxpc3Qgb2YgdmFsdWVzIHVzZWQgdG8gZGVzY3JpYmUgYW4gb3V0bGluZSdzIGNvbnRvdXIgb3JpZW50YXRpb24uCisgICoKKyAgKiAgIFRoZSBUcnVlVHlwZSBhbmQgUG9zdFNjcmlwdCBzcGVjaWZpY2F0aW9ucyB1c2UgZGlmZmVyZW50IGNvbnZlbnRpb25zCisgICogICB0byBkZXRlcm1pbmUgd2hldGhlciBvdXRsaW5lIGNvbnRvdXJzIHNob3VsZCBiZSBmaWxsZWQgb3IgdW5maWxsZWQuCisgICoKKyAgKiBAdmFsdWVzOgorICAqICAgRlRfT1JJRU5UQVRJT05fVFJVRVRZUEUgOjoKKyAgKiAgICAgQWNjb3JkaW5nIHRvIHRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uLCBjbG9ja3dpc2UgY29udG91cnMgbXVzdAorICAqICAgICBiZSBmaWxsZWQsIGFuZCBjb3VudGVyLWNsb2Nrd2lzZSBvbmVzIG11c3QgYmUgdW5maWxsZWQuCisgICoKKyAgKiAgIEZUX09SSUVOVEFUSU9OX1BPU1RTQ1JJUFQgOjoKKyAgKiAgICAgQWNjb3JkaW5nIHRvIHRoZSBQb3N0U2NyaXB0IHNwZWNpZmljYXRpb24sIGNvdW50ZXItY2xvY2t3aXNlIGNvbnRvdXJzCisgICogICAgIG11c3QgYmUgZmlsbGVkLCBhbmQgY2xvY2t3aXNlIG9uZXMgbXVzdCBiZSB1bmZpbGxlZC4KKyAgKgorICAqICAgRlRfT1JJRU5UQVRJT05fRklMTF9SSUdIVCA6OgorICAqICAgICBUaGlzIGlzIGlkZW50aWNhbCB0byBARlRfT1JJRU5UQVRJT05fVFJVRVRZUEUsIGJ1dCBpcyB1c2VkIHRvCisgICogICAgIHJlbWVtYmVyIHRoYXQgaW4gVHJ1ZVR5cGUsIGV2ZXJ5dGhpbmcgdGhhdCBpcyB0byB0aGUgcmlnaHQgb2YKKyAgKiAgICAgdGhlIGRyYXdpbmcgZGlyZWN0aW9uIG9mIGEgY29udG91ciBtdXN0IGJlIGZpbGxlZC4KKyAgKgorICAqICAgRlRfT1JJRU5UQVRJT05fRklMTF9MRUZUIDo6CisgICogICAgIFRoaXMgaXMgaWRlbnRpY2FsIHRvIEBGVF9PUklFTlRBVElPTl9QT1NUU0NSSVBULCBidXQgaXMgdXNlZCB0bworICAqICAgICByZW1lbWJlciB0aGF0IGluIFBvc3RTY3JpcHQsIGV2ZXJ5dGhpbmcgdGhhdCBpcyB0byB0aGUgbGVmdCBvZgorICAqICAgICB0aGUgZHJhd2luZyBkaXJlY3Rpb24gb2YgYSBjb250b3VyIG11c3QgYmUgZmlsbGVkLgorICAqCisgICogICBGVF9PUklFTlRBVElPTl9OT05FIDo6CisgICogICAgIFRoZSBvcmllbnRhdGlvbiBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4gIFRoYXQgaXMsIGRpZmZlcmVudCBwYXJ0cyBvZgorICAqICAgICB0aGUgZ2x5cGggaGF2ZSBkaWZmZXJlbnQgb3JpZW50YXRpb24uCisgICoKKyAgKi8KKyAgdHlwZWRlZiBlbnVtICBGVF9PcmllbnRhdGlvbl8KKyAgeworICAgIEZUX09SSUVOVEFUSU9OX1RSVUVUWVBFICAgPSAwLAorICAgIEZUX09SSUVOVEFUSU9OX1BPU1RTQ1JJUFQgPSAxLAorICAgIEZUX09SSUVOVEFUSU9OX0ZJTExfUklHSFQgPSBGVF9PUklFTlRBVElPTl9UUlVFVFlQRSwKKyAgICBGVF9PUklFTlRBVElPTl9GSUxMX0xFRlQgID0gRlRfT1JJRU5UQVRJT05fUE9TVFNDUklQVCwKKyAgICBGVF9PUklFTlRBVElPTl9OT05FCisKKyAgfSBGVF9PcmllbnRhdGlvbjsKKworCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiBAZnVuY3Rpb246CisgICogICBGVF9PdXRsaW5lX0dldF9PcmllbnRhdGlvbgorICAqCisgICogQGRlc2NyaXB0aW9uOgorICAqICAgVGhpcyBmdW5jdGlvbiBhbmFseXplcyBhIGdseXBoIG91dGxpbmUgYW5kIHRyaWVzIHRvIGNvbXB1dGUgaXRzCisgICogICBmaWxsIG9yaWVudGF0aW9uIChzZWUgQEZUX09yaWVudGF0aW9uKS4gIFRoaXMgaXMgZG9uZSBieSBpbnRlZ3JhdGluZworICAqICAgdGhlIHRvdGFsIGFyZWEgY292ZXJlZCBieSB0aGUgb3V0bGluZS4gVGhlIHBvc2l0aXZlIGludGVncmFsCisgICogICBjb3JyZXNwb25kcyB0byB0aGUgY2xvY2t3aXNlIG9yaWVudGF0aW9uIGFuZCBARlRfT1JJRU5UQVRJT05fUE9TVFNDUklQVAorICAqICAgaXMgcmV0dXJuZWQuIFRoZSBuZWdhdGl2ZSBpbnRlZ3JhbCBjb3JyZXNwb25kcyB0byB0aGUgY291bnRlci1jbG9ja3dpc2UKKyAgKiAgIG9yaWVudGF0aW9uIGFuZCBARlRfT1JJRU5UQVRJT05fVFJVRVRZUEUgaXMgcmV0dXJuZWQuCisgICoKKyAgKiAgIE5vdGUgdGhhdCB0aGlzIHdpbGwgcmV0dXJuIEBGVF9PUklFTlRBVElPTl9UUlVFVFlQRSBmb3IgZW1wdHkKKyAgKiAgIG91dGxpbmVzLgorICAqCisgICogQGlucHV0OgorICAqICAgb3V0bGluZSA6OgorICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIG91dGxpbmUuCisgICoKKyAgKiBAcmV0dXJuOgorICAqICAgVGhlIG9yaWVudGF0aW9uLgorICAqCisgICovCisgIEZUX0VYUE9SVCggRlRfT3JpZW50YXRpb24gKQorICBGVF9PdXRsaW5lX0dldF9PcmllbnRhdGlvbiggRlRfT3V0bGluZSogIG91dGxpbmUgKTsKKworICAvKiAqLworCisKK0ZUX0VORF9IRUFERVIKKworI2VuZGlmIC8qIF9fRlRPVVRMTl9IX18gKi8KKworCisvKiBFTkQgKi8KKworCisvKiBMb2NhbCBWYXJpYWJsZXM6ICovCisvKiBjb2Rpbmc6IHV0Zi04ICAgICovCisvKiBFbmQ6ICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0cGZyLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0cGZyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFjMDJhMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRwZnIuaApAQCAtMCwwICsxLDE3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRwZnIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWVUeXBlIEFQSSBmb3IgYWNjZXNzaW5nIFBGUi1zcGVjaWZpYyBkYXRhIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAyLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fRlRQRlJfSF9fCisjZGVmaW5lIF9fRlRQRlJfSF9fCisKKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAorCisjaWZkZWYgRlJFRVRZUEVfSAorI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKKyNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgorI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCisjZW5kaWYKKworCitGVF9CRUdJTl9IRUFERVIKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBmcl9mb250cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBGUiBGb250cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBGUi9UcnVlRG9jIHNwZWNpZmljIEFQSS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgUEZSLXNwZWNpZmljIGZ1bmN0aW9ucy4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiBAZnVuY3Rpb246CisgICogICAgRlRfR2V0X1BGUl9NZXRyaWNzCisgICoKKyAgKiBAZGVzY3JpcHRpb246CisgICogICAgUmV0dXJuIHRoZSBvdXRsaW5lIGFuZCBtZXRyaWNzIHJlc29sdXRpb25zIG9mIGEgZ2l2ZW4gUEZSIGZhY2UuCisgICoKKyAgKiBAaW5wdXQ6CisgICogICAgZmFjZSA6OiBIYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuICBJdCBjYW4gYmUgYSBub24tUEZSIGZhY2UuCisgICoKKyAgKiBAb3V0cHV0OgorICAqICAgIGFvdXRsaW5lX3Jlc29sdXRpb24gOjoKKyAgKiAgICAgIE91dGxpbmUgcmVzb2x1dGlvbi4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byBgZmFjZS0+dW5pdHNfcGVyX0VNJworICAqICAgICAgZm9yIG5vbi1QRlIgZm9udHMuICBPcHRpb25hbCAocGFyYW1ldGVyIGNhbiBiZSBOVUxMKS4KKyAgKgorICAqICAgIGFtZXRyaWNzX3Jlc29sdXRpb24gOjoKKyAgKiAgICAgIE1ldHJpY3MgcmVzb2x1dGlvbi4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byBgb3V0bGluZV9yZXNvbHV0aW9uJworICAqICAgICAgZm9yIG5vbi1QRlIgZm9udHMuICBPcHRpb25hbCAocGFyYW1ldGVyIGNhbiBiZSBOVUxMKS4KKyAgKgorICAqICAgIGFtZXRyaWNzX3hfc2NhbGUgOjoKKyAgKiAgICAgIEEgMTYuMTYgZml4ZWQtcG9pbnQgbnVtYmVyIHVzZWQgdG8gc2NhbGUgZGlzdGFuY2UgZXhwcmVzc2VkCisgICogICAgICBpbiBtZXRyaWNzIHVuaXRzIHRvIGRldmljZSBzdWItcGl4ZWxzLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvCisgICogICAgICBgZmFjZS0+c2l6ZS0+eF9zY2FsZScsIGJ1dCBmb3IgbWV0cmljcyBvbmx5LiAgT3B0aW9uYWwgKHBhcmFtZXRlcgorICAqICAgICAgY2FuIGJlIE5VTEwpLgorICAqCisgICogICAgYW1ldHJpY3NfeV9zY2FsZSA6OgorICAqICAgICAgU2FtZSBhcyBgYW1ldHJpY3NfeF9zY2FsZScgYnV0IGZvciB0aGUgdmVydGljYWwgZGlyZWN0aW9uLgorICAqICAgICAgb3B0aW9uYWwgKHBhcmFtZXRlciBjYW4gYmUgTlVMTCkuCisgICoKKyAgKiBAcmV0dXJuOgorICAqICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICoKKyAgKiBAbm90ZToKKyAgKiAgIElmIHRoZSBpbnB1dCBmYWNlIGlzIG5vdCBhIFBGUiwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhbiBlcnJvci4KKyAgKiAgIEhvd2V2ZXIsIGluIGFsbCBjYXNlcywgaXQgd2lsbCByZXR1cm4gdmFsaWQgdmFsdWVzLgorICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfR2V0X1BGUl9NZXRyaWNzKCBGVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICphb3V0bGluZV9yZXNvbHV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAqYW1ldHJpY3NfcmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgKmFtZXRyaWNzX3hfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICphbWV0cmljc195X3NjYWxlICk7CisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiBAZnVuY3Rpb246CisgICogICAgRlRfR2V0X1BGUl9LZXJuaW5nCisgICoKKyAgKiBAZGVzY3JpcHRpb246CisgICogICAgUmV0dXJuIHRoZSBrZXJuaW5nIHBhaXIgY29ycmVzcG9uZGluZyB0byB0d28gZ2x5cGhzIGluIGEgUEZSIGZhY2UuCisgICogICAgVGhlIGRpc3RhbmNlIGlzIGV4cHJlc3NlZCBpbiBtZXRyaWNzIHVuaXRzLCB1bmxpa2UgdGhlIHJlc3VsdCBvZgorICAqICAgIEBGVF9HZXRfS2VybmluZy4KKyAgKgorICAqIEBpbnB1dDoKKyAgKiAgICBmYWNlICA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KKyAgKgorICAqICAgIGxlZnQgIDo6IEluZGV4IG9mIHRoZSBsZWZ0IGdseXBoLgorICAqCisgICogICAgcmlnaHQgOjogSW5kZXggb2YgdGhlIHJpZ2h0IGdseXBoLgorICAqCisgICogQG91dHB1dDoKKyAgKiAgICBhdmVjdG9yIDo6IEEga2VybmluZyB2ZWN0b3IuCisgICoKKyAgKiBAcmV0dXJuOgorICAqICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICoKKyAgKiBAbm90ZToKKyAgKiAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm4gZGlzdGFuY2VzIGluIG9yaWdpbmFsIFBGUiBtZXRyaWNzCisgICogICAgdW5pdHMuICBUaGlzIGlzIHVubGlrZSBARlRfR2V0X0tlcm5pbmcgd2l0aCB0aGUgQEZUX0tFUk5JTkdfVU5TQ0FMRUQKKyAgKiAgICBtb2RlLCB3aGljaCBhbHdheXMgcmV0dXJucyBkaXN0YW5jZXMgY29udmVydGVkIHRvIG91dGxpbmUgdW5pdHMuCisgICoKKyAgKiAgICBZb3UgY2FuIHVzZSB0aGUgdmFsdWUgb2YgdGhlIGB4X3NjYWxlJyBhbmQgYHlfc2NhbGUnIHBhcmFtZXRlcnMKKyAgKiAgICByZXR1cm5lZCBieSBARlRfR2V0X1BGUl9NZXRyaWNzIHRvIHNjYWxlIHRoZXNlIHRvIGRldmljZSBzdWItcGl4ZWxzLgorICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfR2V0X1BGUl9LZXJuaW5nKCBGVF9GYWNlICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yICAqYXZlY3RvciApOworCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCisgICogQGZ1bmN0aW9uOgorICAqICAgIEZUX0dldF9QRlJfQWR2YW5jZQorICAqCisgICogQGRlc2NyaXB0aW9uOgorICAqICAgIFJldHVybiBhIGdpdmVuIGdseXBoIGFkdmFuY2UsIGV4cHJlc3NlZCBpbiBvcmlnaW5hbCBtZXRyaWNzIHVuaXRzLAorICAqICAgIGZyb20gYSBQRlIgZm9udC4KKyAgKgorICAqIEBpbnB1dDoKKyAgKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCisgICoKKyAgKiAgICBnaW5kZXggOjogVGhlIGdseXBoIGluZGV4LgorICAqCisgICogQG91dHB1dDoKKyAgKiAgICBhYWR2YW5jZSA6OiBUaGUgZ2x5cGggYWR2YW5jZSBpbiBtZXRyaWNzIHVuaXRzLgorICAqCisgICogQHJldHVybjoKKyAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAqCisgICogQG5vdGU6CisgICogICAgWW91IGNhbiB1c2UgdGhlIGB4X3NjYWxlJyBvciBgeV9zY2FsZScgcmVzdWx0cyBvZiBARlRfR2V0X1BGUl9NZXRyaWNzCisgICogICAgdG8gY29udmVydCB0aGUgYWR2YW5jZSB0byBkZXZpY2Ugc3ViLXBpeGVscyAoaS5lLiwgMS82NHRoIG9mIHBpeGVscykuCisgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9HZXRfUEZSX0FkdmFuY2UoIEZUX0ZhY2UgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBnaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgKmFhZHZhbmNlICk7CisKKyAgLyogKi8KKworCitGVF9FTkRfSEVBREVSCisKKyNlbmRpZiAvKiBfX0ZUUEZSX0hfXyAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdHJlbmRlci5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdHJlbmRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjOGRhNzAKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0cmVuZGVyLmgKQEAgLTAsMCArMSwyMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0cmVuZGVyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGcmVlVHlwZSByZW5kZXJlciBtb2R1bGVzIHB1YmxpYyBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0ZUUkVOREVSX0hfXworI2RlZmluZSBfX0ZUUkVOREVSX0hfXworCisKKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorI2luY2x1ZGUgRlRfTU9EVUxFX0gKKyNpbmNsdWRlIEZUX0dMWVBIX0gKKworCitGVF9CRUdJTl9IRUFERVIKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1vZHVsZV9tYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKiBjcmVhdGUgYSBuZXcgZ2x5cGggb2JqZWN0ICovCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpGVF9HbHlwaF9Jbml0RnVuYykoIEZUX0dseXBoICAgICAgZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgIHNsb3QgKTsKKworICAvKiBkZXN0cm95cyBhIGdpdmVuIGdseXBoIG9iamVjdCAqLworICB0eXBlZGVmIHZvaWQKKyAgKCpGVF9HbHlwaF9Eb25lRnVuYykoIEZUX0dseXBoICBnbHlwaCApOworCisgIHR5cGVkZWYgdm9pZAorICAoKkZUX0dseXBoX1RyYW5zZm9ybUZ1bmMpKCBGVF9HbHlwaCAgICAgICAgICBnbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfTWF0cml4KiAgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICBkZWx0YSApOworCisgIHR5cGVkZWYgdm9pZAorICAoKkZUX0dseXBoX0dldEJCb3hGdW5jKSggRlRfR2x5cGggIGdseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQkJveCogIGFiYm94ICk7CisKKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKkZUX0dseXBoX0NvcHlGdW5jKSggRlRfR2x5cGggICBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaCAgIHRhcmdldCApOworCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpGVF9HbHlwaF9QcmVwYXJlRnVuYykoIEZUX0dseXBoICAgICAgZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgIHNsb3QgKTsKKworLyogZGVwcmVjYXRlZCAqLworI2RlZmluZSBGVF9HbHlwaF9Jbml0X0Z1bmMgICAgICAgRlRfR2x5cGhfSW5pdEZ1bmMKKyNkZWZpbmUgRlRfR2x5cGhfRG9uZV9GdW5jICAgICAgIEZUX0dseXBoX0RvbmVGdW5jCisjZGVmaW5lIEZUX0dseXBoX1RyYW5zZm9ybV9GdW5jICBGVF9HbHlwaF9UcmFuc2Zvcm1GdW5jCisjZGVmaW5lIEZUX0dseXBoX0JCb3hfRnVuYyAgICAgICBGVF9HbHlwaF9HZXRCQm94RnVuYworI2RlZmluZSBGVF9HbHlwaF9Db3B5X0Z1bmMgICAgICAgRlRfR2x5cGhfQ29weUZ1bmMKKyNkZWZpbmUgRlRfR2x5cGhfUHJlcGFyZV9GdW5jICAgIEZUX0dseXBoX1ByZXBhcmVGdW5jCisKKworICBzdHJ1Y3QgIEZUX0dseXBoX0NsYXNzXworICB7CisgICAgRlRfTG9uZyAgICAgICAgICAgICAgICAgZ2x5cGhfc2l6ZTsKKyAgICBGVF9HbHlwaF9Gb3JtYXQgICAgICAgICBnbHlwaF9mb3JtYXQ7CisgICAgRlRfR2x5cGhfSW5pdEZ1bmMgICAgICAgZ2x5cGhfaW5pdDsKKyAgICBGVF9HbHlwaF9Eb25lRnVuYyAgICAgICBnbHlwaF9kb25lOworICAgIEZUX0dseXBoX0NvcHlGdW5jICAgICAgIGdseXBoX2NvcHk7CisgICAgRlRfR2x5cGhfVHJhbnNmb3JtRnVuYyAgZ2x5cGhfdHJhbnNmb3JtOworICAgIEZUX0dseXBoX0dldEJCb3hGdW5jICAgIGdseXBoX2Jib3g7CisgICAgRlRfR2x5cGhfUHJlcGFyZUZ1bmMgICAgZ2x5cGhfcHJlcGFyZTsKKyAgfTsKKworCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpGVF9SZW5kZXJlcl9SZW5kZXJGdW5jKSggRlRfUmVuZGVyZXIgICAgICAgcmVuZGVyZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogIG9yaWdpbiApOworCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpGVF9SZW5kZXJlcl9UcmFuc2Zvcm1GdW5jKSggRlRfUmVuZGVyZXIgICAgICAgcmVuZGVyZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX01hdHJpeCogIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgZGVsdGEgKTsKKworCisgIHR5cGVkZWYgdm9pZAorICAoKkZUX1JlbmRlcmVyX0dldENCb3hGdW5jKSggRlRfUmVuZGVyZXIgICByZW5kZXJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JCb3gqICAgICAgY2JveCApOworCisKKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKkZUX1JlbmRlcmVyX1NldE1vZGVGdW5jKSggRlRfUmVuZGVyZXIgIHJlbmRlcmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgIG1vZGVfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgIG1vZGVfcHRyICk7CisKKy8qIGRlcHJlY2F0ZWQgaWRlbnRpZmllcnMgKi8KKyNkZWZpbmUgRlRSZW5kZXJlcl9yZW5kZXIgIEZUX1JlbmRlcmVyX1JlbmRlckZ1bmMKKyNkZWZpbmUgRlRSZW5kZXJlcl90cmFuc2Zvcm0gIEZUX1JlbmRlcmVyX1RyYW5zZm9ybUZ1bmMKKyNkZWZpbmUgRlRSZW5kZXJlcl9nZXRDQm94ICBGVF9SZW5kZXJlcl9HZXRDQm94RnVuYworI2RlZmluZSBGVFJlbmRlcmVyX3NldE1vZGUgIEZUX1JlbmRlcmVyX1NldE1vZGVGdW5jCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9SZW5kZXJlcl9DbGFzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgcmVuZGVyZXIgbW9kdWxlIGNsYXNzIGRlc2NyaXB0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByb290ICAgICAgICAgICAgOjogVGhlIHJvb3QgQEZUX01vZHVsZV9DbGFzcyBmaWVsZHMuICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdseXBoX2Zvcm1hdCAgICA6OiBUaGUgZ2x5cGggaW1hZ2UgZm9ybWF0IHRoaXMgcmVuZGVyZXIgaGFuZGxlcy4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcmVuZGVyX2dseXBoICAgIDo6IEEgbWV0aG9kIHVzZWQgdG8gcmVuZGVyIHRoZSBpbWFnZSB0aGF0IGlzIGluIGEgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICBnaXZlbiBnbHlwaCBzbG90IGludG8gYSBiaXRtYXAuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdHJhbnNmb3JtX2dseXBoIDo6IEEgbWV0aG9kIHVzZWQgdG8gdHJhbnNmb3JtIHRoZSBpbWFnZSB0aGF0IGlzIGluICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICBhIGdpdmVuIGdseXBoIHNsb3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2V0X2dseXBoX2Nib3ggIDo6IEEgbWV0aG9kIHVzZWQgdG8gYWNjZXNzIHRoZSBnbHlwaCdzIGNib3guICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzZXRfbW9kZSAgICAgICAgOjogQSBtZXRob2QgdXNlZCB0byBwYXNzIGFkZGl0aW9uYWwgcGFyYW1ldGVycy4gICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJhc3Rlcl9jbGFzcyAgICA6OiBGb3IgQEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FIHJlbmRlcmVycyBvbmx5LiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhIHBvaW50ZXIgdG8gaXRzIHJhc3RlcidzIGNsYXNzLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBGVF9SZW5kZXJlcl9DbGFzc18KKyAgeworICAgIEZUX01vZHVsZV9DbGFzcyAgICAgICAgICAgIHJvb3Q7CisKKyAgICBGVF9HbHlwaF9Gb3JtYXQgICAgICAgICAgICBnbHlwaF9mb3JtYXQ7CisKKyAgICBGVF9SZW5kZXJlcl9SZW5kZXJGdW5jICAgICByZW5kZXJfZ2x5cGg7CisgICAgRlRfUmVuZGVyZXJfVHJhbnNmb3JtRnVuYyAgdHJhbnNmb3JtX2dseXBoOworICAgIEZUX1JlbmRlcmVyX0dldENCb3hGdW5jICAgIGdldF9nbHlwaF9jYm94OworICAgIEZUX1JlbmRlcmVyX1NldE1vZGVGdW5jICAgIHNldF9tb2RlOworCisgICAgRlRfUmFzdGVyX0Z1bmNzKiAgICAgICAgICAgcmFzdGVyX2NsYXNzOworCisgIH0gRlRfUmVuZGVyZXJfQ2xhc3M7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZXRfUmVuZGVyZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZXRyaWV2ZSB0aGUgY3VycmVudCByZW5kZXJlciBmb3IgYSBnaXZlbiBnbHlwaCBmb3JtYXQuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZvcm1hdCAgOjogVGhlIGdseXBoIGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgcmVuZGVyZXIgaGFuZGxlLiAgMH5pZiBub25lIGZvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBtb2R1bGUgYWxyZWFkeSBleGlzdHMgYnkgdGhhdCBuYW1lLCAqLworICAvKiAgICBvciBpZiB0aGUgbW9kdWxlIHJlcXVpcmVzIGEgdmVyc2lvbiBvZiBGcmVlVHlwZSB0aGF0IGlzIHRvbyBncmVhdC4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRvIGFkZCBhIG5ldyByZW5kZXJlciwgc2ltcGx5IHVzZSBARlRfQWRkX01vZHVsZS4gIFRvIHJldHJpZXZlIGEgICAqLworICAvKiAgICByZW5kZXJlciBieSBpdHMgbmFtZSwgdXNlIEBGVF9HZXRfTW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfUmVuZGVyZXIgKQorICBGVF9HZXRfUmVuZGVyZXIoIEZUX0xpYnJhcnkgICAgICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICBGVF9HbHlwaF9Gb3JtYXQgIGZvcm1hdCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU2V0X1JlbmRlcmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2V0IHRoZSBjdXJyZW50IHJlbmRlcmVyIHRvIHVzZSwgYW5kIHNldCBhZGRpdGlvbmFsIG1vZGUuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlicmFyeSAgICA6OiBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcmVuZGVyZXIgICA6OiBBIGhhbmRsZSB0byB0aGUgcmVuZGVyZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fcGFyYW1zIDo6IFRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBhcmFtZXRlcnMgOjogQWRkaXRpb25hbCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEluIGNhc2Ugb2Ygc3VjY2VzcywgdGhlIHJlbmRlcmVyIHdpbGwgYmUgdXNlZCB0byBjb252ZXJ0IGdseXBoICAgICAqLworICAvKiAgICBpbWFnZXMgaW4gdGhlIHJlbmRlcmVyJ3Mga25vd24gZm9ybWF0IGludG8gYml0bWFwcy4gICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZG9lc24ndCBjaGFuZ2UgdGhlIGN1cnJlbnQgcmVuZGVyZXIgZm9yIG90aGVyIGZvcm1hdHMuICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ3VycmVudGx5LCBubyBGcmVlVHlwZSByZW5kZXJlciBtb2R1bGUgdXNlcyBgcGFyYW1ldGVycyc7IHlvdSAgICAgICovCisgIC8qICAgIHNob3VsZCB0aHVzIGFsd2F5cyBwYXNzIE5VTEwgYXMgdGhlIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX1NldF9SZW5kZXJlciggRlRfTGlicmFyeSAgICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJlciAgICByZW5kZXJlciwKKyAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICBudW1fcGFyYW1zLAorICAgICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtZXRlcnMgKTsKKworICAvKiAqLworCisKK0ZUX0VORF9IRUFERVIKKworI2VuZGlmIC8qIF9fRlRSRU5ERVJfSF9fICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0c2l6ZXMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRzaXplcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZjg0MjQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0c2l6ZXMuaApAQCAtMCwwICsxLDE1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRzaXplcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWVUeXBlIHNpemUgb2JqZWN0cyBtYW5hZ2VtZW50IChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBub3JtYWxseSBub3QgbmVlZCB0byB1c2UgdGhlc2UgZnVuY3Rpb25zLiAgICovCisgIC8qIEhvd2V2ZXIsIHRoZXkgaGF2ZSBiZWVuIHBsYWNlZCBpbiBhIHB1YmxpYyBBUEkgZm9yIHRoZSByYXJlIGNhc2VzICAgICAqLworICAvKiB3aGVyZSB0aGV5IGFyZSBuZWVkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX19GVFNJWkVTX0hfXworI2RlZmluZSBfX0ZUU0laRVNfSF9fCisKKworI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CisjaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisKKyNpZmRlZiBGUkVFVFlQRV9ICisjZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgorI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCisjZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKKyNlbmRpZgorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2l6ZXNfbWFuYWdlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2l6ZSBNYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTWFuYWdpbmcgbXVsdGlwbGUgc2l6ZXMgcGVyIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgV2hlbiBjcmVhdGluZyBhIG5ldyBmYWNlIG9iamVjdCAoZS5nLiwgd2l0aCBARlRfTmV3X0ZhY2UpLCBhbiAgICAgICovCisgIC8qICAgIEBGVF9TaXplIG9iamVjdCBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYW5kIHVzZWQgdG8gc3RvcmUgYWxsICAgICAqLworICAvKiAgICBwaXhlbC1zaXplIGRlcGVuZGVudCBpbmZvcm1hdGlvbiwgYXZhaWxhYmxlIGluIHRoZSBgZmFjZS0+c2l6ZScgICAgKi8KKyAgLyogICAgZmllbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJdCBpcyBob3dldmVyIHBvc3NpYmxlIHRvIGNyZWF0ZSBtb3JlIHNpemVzIGZvciBhIGdpdmVuIGZhY2UsICAgICAgKi8KKyAgLyogICAgbW9zdGx5IGluIG9yZGVyIHRvIG1hbmFnZSBzZXZlcmFsIGNoYXJhY3RlciBwaXhlbCBzaXplcyBvZiB0aGUgICAgICovCisgIC8qICAgIHNhbWUgZm9udCBmYW1pbHkgYW5kIHN0eWxlLiAgU2VlIEBGVF9OZXdfU2l6ZSBhbmQgQEZUX0RvbmVfU2l6ZS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTm90ZSB0aGF0IEBGVF9TZXRfUGl4ZWxfU2l6ZXMgYW5kIEBGVF9TZXRfQ2hhcl9TaXplIG9ubHkgICAgICAgICAgICovCisgIC8qICAgIG1vZGlmeSB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgYGFjdGl2ZScgc2l6ZTsgeW91IHRodXMgbmVlZCAgICAqLworICAvKiAgICB0byB1c2UgQEZUX0FjdGl2YXRlX1NpemUgdG8gY2hhbmdlIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIDk5JSBvZiBhcHBsaWNhdGlvbnMgd29uJ3QgbmVlZCB0aGUgZnVuY3Rpb25zIHByb3ZpZGVkIGhlcmUsICAgICAgICAqLworICAvKiAgICBlc3BlY2lhbGx5IGlmIHRoZXkgdXNlIHRoZSBjYWNoaW5nIHN1Yi1zeXN0ZW0sIHNvIGJlIGNhdXRpb3VzICAgICAgKi8KKyAgLyogICAgd2hlbiB1c2luZyB0aGVzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX05ld19TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENyZWF0ZSBhIG5ldyBzaXplIG9iamVjdCBmcm9tIGEgZ2l2ZW4gZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gYSBwYXJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFzaXplIDo6IEEgaGFuZGxlIHRvIGEgbmV3IHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFlvdSBuZWVkIHRvIGNhbGwgQEZUX0FjdGl2YXRlX1NpemUgaW4gb3JkZXIgdG8gc2VsZWN0IHRoZSBuZXcgc2l6ZSAqLworICAvKiAgICBmb3IgdXBjb21pbmcgY2FsbHMgdG8gQEZUX1NldF9QaXhlbF9TaXplcywgQEZUX1NldF9DaGFyX1NpemUsICAgICAgKi8KKyAgLyogICAgQEZUX0xvYWRfR2x5cGgsIEBGVF9Mb2FkX0NoYXIsIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfTmV3X1NpemUoIEZUX0ZhY2UgICBmYWNlLAorICAgICAgICAgICAgICAgRlRfU2l6ZSogIHNpemUgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0RvbmVfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERpc2NhcmQgYSBnaXZlbiBzaXplIG9iamVjdC4gIE5vdGUgdGhhdCBARlRfRG9uZV9GYWNlICAgICAgICAgICAgICAqLworICAvKiAgICBhdXRvbWF0aWNhbGx5IGRpc2NhcmRzIGFsbCBzaXplIG9iamVjdHMgYWxsb2NhdGVkIHdpdGggICAgICAgICAgICAgKi8KKyAgLyogICAgQEZUX05ld19TaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2l6ZSA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfRG9uZV9TaXplKCBGVF9TaXplICBzaXplICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9BY3RpdmF0ZV9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBFdmVuIHRob3VnaCBpdCBpcyBwb3NzaWJsZSB0byBjcmVhdGUgc2V2ZXJhbCBzaXplIG9iamVjdHMgZm9yIGEgICAgKi8KKyAgLyogICAgZ2l2ZW4gZmFjZSAoc2VlIEBGVF9OZXdfU2l6ZSBmb3IgZGV0YWlscyksIGZ1bmN0aW9ucyBsaWtlICAgICAgICAgICovCisgIC8qICAgIEBGVF9Mb2FkX0dseXBoIG9yIEBGVF9Mb2FkX0NoYXIgb25seSB1c2UgdGhlIG9uZSB0aGF0IGhhcyBiZWVuICAgICAqLworICAvKiAgICBhY3RpdmF0ZWQgbGFzdCB0byBkZXRlcm1pbmUgdGhlIGBjdXJyZW50IGNoYXJhY3RlciBwaXhlbCBzaXplJy4gICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gYGFjdGl2YXRlJyBhIHByZXZpb3VzbHkgY3JlYXRlZCBzaXplICAqLworICAvKiAgICBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzaXplIDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJZiBgZmFjZScgaXMgdGhlIHNpemUncyBwYXJlbnQgZmFjZSBvYmplY3QsIHRoaXMgZnVuY3Rpb24gY2hhbmdlcyAgKi8KKyAgLyogICAgdGhlIHZhbHVlIG9mIGBmYWNlLT5zaXplJyB0byB0aGUgaW5wdXQgc2l6ZSBoYW5kbGUuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfQWN0aXZhdGVfU2l6ZSggRlRfU2l6ZSAgc2l6ZSApOworCisgIC8qICovCisKKworRlRfRU5EX0hFQURFUgorCisjZW5kaWYgLyogX19GVFNJWkVTX0hfXyAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdHNuYW1lcy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdHNuYW1lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmN2ZiZTEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0c25hbWVzLmgKQEAgLTAsMCArMSwyMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0c25hbWVzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBTaW1wbGUgaW50ZXJmYWNlIHRvIGFjY2VzcyBTRk5UIG5hbWUgdGFibGVzICh3aGljaCBhcmUgdXNlZCAgICAgICAgICAqLworLyogICAgdG8gaG9sZCBmb250IG5hbWVzLCBjb3B5cmlnaHQgaW5mbywgbm90aWNlcywgZXRjLikgKHNwZWNpZmljYXRpb24pLiAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGlzIGlzIF9ub3RfIHVzZWQgdG8gcmV0cmlldmUgZ2x5cGggbmFtZXMhICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0ZUX1NGTlRfTkFNRVNfSF9fCisjZGVmaW5lIF9fRlRfU0ZOVF9OQU1FU19IX18KKworCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKworI2lmZGVmIEZSRUVUWVBFX0gKKyNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCisjZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKKyNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgorI2VuZGlmCisKKworRlRfQkVHSU5fSEVBREVSCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzZm50X25hbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTRk5UIE5hbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBY2Nlc3MgdGhlIG5hbWVzIGVtYmVkZGVkIGluIFRydWVUeXBlIGFuZCBPcGVuVHlwZSBmaWxlcy4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIHNwZWNpZmljYXRpb25zIGFsbG93IHRoZSBpbmNsdXNpb24gb2YgICAgKi8KKyAgLyogICAgYSBzcGVjaWFsIGBuYW1lcyB0YWJsZScgaW4gZm9udCBmaWxlcy4gIFRoaXMgdGFibGUgY29udGFpbnMgICAgICAgICovCisgIC8qICAgIHRleHR1YWwgKGFuZCBpbnRlcm5hdGlvbmFsaXplZCkgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBmb250LCAgICAqLworICAvKiAgICBsaWtlIGZhbWlseSBuYW1lLCBjb3B5cmlnaHQsIHZlcnNpb24sIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBkZWZpbml0aW9ucyBiZWxvdyBhcmUgdXNlZCB0byBhY2Nlc3MgdGhlbSBpZiBhdmFpbGFibGUuICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTm90ZSB0aGF0IHRoaXMgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBnbHlwaCBuYW1lcyEgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1NmbnROYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYW4gU0ZOVCBgbmFtZScgdGFibGUgZW50cnkuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBsYXRmb3JtX2lkIDo6IFRoZSBwbGF0Zm9ybSBJRCBmb3IgYHN0cmluZycuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZW5jb2RpbmdfaWQgOjogVGhlIGVuY29kaW5nIElEIGZvciBgc3RyaW5nJy4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsYW5ndWFnZV9pZCA6OiBUaGUgbGFuZ3VhZ2UgSUQgZm9yIGBzdHJpbmcnLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG5hbWVfaWQgICAgIDo6IEFuIGlkZW50aWZpZXIgZm9yIGBzdHJpbmcnLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyaW5nICAgICAgOjogVGhlIGBuYW1lJyBzdHJpbmcuICBOb3RlIHRoYXQgaXRzIGZvcm1hdCBkaWZmZXJzICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgKHBsYXRmb3JtLGVuY29kaW5nKSBwYWlyLiAgSXQgY2FuICAqLworICAvKiAgICAgICAgICAgICAgICAgICBiZSBhIFBhc2NhbCBTdHJpbmcsIGEgVVRGLTE2IG9uZSwgZXRjLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgIEdlbmVyYWxseSBzcGVha2luZywgdGhlIHN0cmluZyBpcyBub3QgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICB6ZXJvLXRlcm1pbmF0ZWQuICBQbGVhc2UgcmVmZXIgdG8gdGhlIFRydWVUeXBlICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJpbmdfbGVuICA6OiBUaGUgbGVuZ3RoIG9mIGBzdHJpbmcnIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQb3NzaWJsZSB2YWx1ZXMgZm9yIGBwbGF0Zm9ybV9pZCcsIGBlbmNvZGluZ19pZCcsIGBsYW5ndWFnZV9pZCcsICAgKi8KKyAgLyogICAgYW5kIGBuYW1lX2lkJyBhcmUgZ2l2ZW4gaW4gdGhlIGZpbGUgYHR0bmFtZWlkLmgnLiAgRm9yIGRldGFpbHMgICAgICovCisgIC8qICAgIHBsZWFzZSByZWZlciB0byB0aGUgVHJ1ZVR5cGUgb3IgT3BlblR5cGUgc3BlY2lmaWNhdGlvbi4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2VlIGFsc28gQFRUX1BMQVRGT1JNX1hYWCwgQFRUX0FQUExFX0lEX1hYWCwgQFRUX01BQ19JRF9YWFgsICAgICAgICovCisgIC8qICAgIEBUVF9JU09fSURfWFhYLCBhbmQgQFRUX01TX0lEX1hYWC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1NmbnROYW1lXworICB7CisgICAgRlRfVVNob3J0ICBwbGF0Zm9ybV9pZDsKKyAgICBGVF9VU2hvcnQgIGVuY29kaW5nX2lkOworICAgIEZUX1VTaG9ydCAgbGFuZ3VhZ2VfaWQ7CisgICAgRlRfVVNob3J0ICBuYW1lX2lkOworCisgICAgRlRfQnl0ZSogICBzdHJpbmc7ICAgICAgLyogdGhpcyBzdHJpbmcgaXMgKm5vdCogbnVsbC10ZXJtaW5hdGVkISAqLworICAgIEZUX1VJbnQgICAgc3RyaW5nX2xlbjsgIC8qIGluIGJ5dGVzICovCisKKyAgfSBGVF9TZm50TmFtZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0dldF9TZm50X05hbWVfQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJldHJpZXZlIHRoZSBudW1iZXIgb2YgbmFtZSBzdHJpbmdzIGluIHRoZSBTRk5UIGBuYW1lJyB0YWJsZS4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBudW1iZXIgb2Ygc3RyaW5ncyBpbiB0aGUgYG5hbWUnIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9VSW50ICkKKyAgRlRfR2V0X1NmbnRfTmFtZV9Db3VudCggRlRfRmFjZSAgZmFjZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2V0X1NmbnRfTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmV0cmlldmUgYSBzdHJpbmcgb2YgdGhlIFNGTlQgYG5hbWUnIHRhYmxlIGZvciBhIGdpdmVuIGluZGV4LiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBpZHggICA6OiBUaGUgaW5kZXggb2YgdGhlIGBuYW1lJyBzdHJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhbmFtZSA6OiBUaGUgaW5kZXhlZCBARlRfU2ZudE5hbWUgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgYHN0cmluZycgYXJyYXkgcmV0dXJuZWQgaW4gdGhlIGBhbmFtZScgc3RydWN0dXJlIGlzIG5vdCAgICAgICAgKi8KKyAgLyogICAgbnVsbC10ZXJtaW5hdGVkLiAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBkZWFsbG9jYXRlIGl0IGlmIGl0IGlzIG5vICovCisgIC8qICAgIGxvbmdlciBpbiB1c2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVXNlIEBGVF9HZXRfU2ZudF9OYW1lX0NvdW50IHRvIGdldCB0aGUgdG90YWwgbnVtYmVyIG9mIGF2YWlsYWJsZSAgICovCisgIC8qICAgIGBuYW1lJyB0YWJsZSBlbnRyaWVzLCB0aGVuIGRvIGEgbG9vcCB1bnRpbCB5b3UgZ2V0IHRoZSByaWdodCAgICAgICAqLworICAvKiAgICBwbGF0Zm9ybSwgZW5jb2RpbmcsIGFuZCBuYW1lIElELiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9HZXRfU2ZudF9OYW1lKCBGVF9GYWNlICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgaWR4LAorICAgICAgICAgICAgICAgICAgICBGVF9TZm50TmFtZSAgKmFuYW1lICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBjb25zdGFudDoKKyAgICogICBGVF9QQVJBTV9UQUdfSUdOT1JFX1BSRUZFUlJFRF9GQU1JTFkKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgY29uc3RhbnQgdXNlZCBhcyB0aGUgdGFnIG9mIEBGVF9QYXJhbWV0ZXIgc3RydWN0dXJlcyB0byBtYWtlCisgICAqICAgRlRfT3Blbl9GYWNlKCkgaWdub3JlIHByZWZlcnJlZCBmYW1pbHkgc3ViZmFtaWx5IG5hbWVzIGluIGBuYW1lJworICAgKiAgIHRhYmxlIHNpbmNlIE9wZW5UeXBlIHZlcnNpb24gMS40LiAgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGgKKyAgICogICBsZWdhY3kgc3lzdGVtcyB0aGF0IGhhdmUgYSA0LWZhY2UtcGVyLWZhbWlseSByZXN0cmljdGlvbi4KKyAgICoKKyAgICovCisjZGVmaW5lIEZUX1BBUkFNX1RBR19JR05PUkVfUFJFRkVSUkVEX0ZBTUlMWSAgRlRfTUFLRV9UQUcoICdpJywgJ2cnLCAncCcsICdmJyApCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBjb25zdGFudDoKKyAgICogICBGVF9QQVJBTV9UQUdfSUdOT1JFX1BSRUZFUlJFRF9TVUJGQU1JTFkKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgY29uc3RhbnQgdXNlZCBhcyB0aGUgdGFnIG9mIEBGVF9QYXJhbWV0ZXIgc3RydWN0dXJlcyB0byBtYWtlCisgICAqICAgRlRfT3Blbl9GYWNlKCkgaWdub3JlIHByZWZlcnJlZCBzdWJmYW1pbHkgbmFtZXMgaW4gYG5hbWUnIHRhYmxlIHNpbmNlCisgICAqICAgT3BlblR5cGUgdmVyc2lvbiAxLjQuICBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kKKyAgICogICBzeXN0ZW1zIHRoYXQgaGF2ZSBhIDQtZmFjZS1wZXItZmFtaWx5IHJlc3RyaWN0aW9uLgorICAgKgorICAgKi8KKyNkZWZpbmUgRlRfUEFSQU1fVEFHX0lHTk9SRV9QUkVGRVJSRURfU1VCRkFNSUxZICBGVF9NQUtFX1RBRyggJ2knLCAnZycsICdwJywgJ3MnICkKKworICAvKiAqLworCisKK0ZUX0VORF9IRUFERVIKKworI2VuZGlmIC8qIF9fRlRfU0ZOVF9OQU1FU19IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRzdHJva2UuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRzdHJva2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWJiMWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdHN0cm9rZS5oCkBAIC0wLDAgKzEsNzg1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBmdHN0cm9rZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnJlZVR5cGUgcGF0aCBzdHJva2VyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDItMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX19GVF9TVFJPS0VfSF9fCisjZGVmaW5lIF9fRlRfU1RST0tFX0hfXworCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX09VVExJTkVfSAorI2luY2x1ZGUgRlRfR0xZUEhfSAorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICoKKyAgKiBAc2VjdGlvbjoKKyAgKiAgICBnbHlwaF9zdHJva2VyCisgICoKKyAgKiBAdGl0bGU6CisgICogICAgR2x5cGggU3Ryb2tlcgorICAqCisgICogQGFic3RyYWN0OgorICAqICAgIEdlbmVyYXRpbmcgYm9yZGVyZWQgYW5kIHN0cm9rZWQgZ2x5cGhzLgorICAqCisgICogQGRlc2NyaXB0aW9uOgorICAqICAgIFRoaXMgY29tcG9uZW50IGdlbmVyYXRlcyBzdHJva2VkIG91dGxpbmVzIG9mIGEgZ2l2ZW4gdmVjdG9yaWFsCisgICogICAgZ2x5cGguICBJdCBhbHNvIGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIGBvdXRzaWRlJyBhbmQvb3IgdGhlCisgICogICAgYGluc2lkZScgYm9yZGVycyBvZiB0aGUgc3Ryb2tlLgorICAqCisgICogICAgVGhpcyBjYW4gYmUgdXNlZnVsIHRvIGdlbmVyYXRlIGBib3JkZXJlZCcgZ2x5cGgsIGkuZS4sIGdseXBocworICAqICAgIGRpc3BsYXllZCB3aXRoIGEgY29sb3VyZWQgKGFuZCBhbnRpLWFsaWFzZWQpIGJvcmRlciBhcm91bmQgdGhlaXIKKyAgKiAgICBzaGFwZS4KKyAgKgorICAqIEBvcmRlcjoKKyAgKiAgICBGVF9TdHJva2VyCisgICoKKyAgKiAgICBGVF9TdHJva2VyX0xpbmVKb2luCisgICogICAgRlRfU3Ryb2tlcl9MaW5lQ2FwCisgICogICAgRlRfU3Ryb2tlckJvcmRlcgorICAqCisgICogICAgRlRfT3V0bGluZV9HZXRJbnNpZGVCb3JkZXIKKyAgKiAgICBGVF9PdXRsaW5lX0dldE91dHNpZGVCb3JkZXIKKyAgKgorICAqICAgIEZUX0dseXBoX1N0cm9rZQorICAqICAgIEZUX0dseXBoX1N0cm9rZUJvcmRlcgorICAqCisgICogICAgRlRfU3Ryb2tlcl9OZXcKKyAgKiAgICBGVF9TdHJva2VyX1NldAorICAqICAgIEZUX1N0cm9rZXJfUmV3aW5kCisgICogICAgRlRfU3Ryb2tlcl9QYXJzZU91dGxpbmUKKyAgKiAgICBGVF9TdHJva2VyX0RvbmUKKyAgKgorICAqICAgIEZUX1N0cm9rZXJfQmVnaW5TdWJQYXRoCisgICogICAgRlRfU3Ryb2tlcl9FbmRTdWJQYXRoCisgICoKKyAgKiAgICBGVF9TdHJva2VyX0xpbmVUbworICAqICAgIEZUX1N0cm9rZXJfQ29uaWNUbworICAqICAgIEZUX1N0cm9rZXJfQ3ViaWNUbworICAqCisgICogICAgRlRfU3Ryb2tlcl9HZXRCb3JkZXJDb3VudHMKKyAgKiAgICBGVF9TdHJva2VyX0V4cG9ydEJvcmRlcgorICAqICAgIEZUX1N0cm9rZXJfR2V0Q291bnRzCisgICogICAgRlRfU3Ryb2tlcl9FeHBvcnQKKyAgKgorICAqLworCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIEB0eXBlOgorICAqICAgRlRfU3Ryb2tlcgorICAqCisgICogQGRlc2NyaXB0aW9uOgorICAqICAgT3BhcXVlIGhhbmRsZSB0byBhIHBhdGggc3Ryb2tlciBvYmplY3QuCisgICovCisgIHR5cGVkZWYgc3RydWN0IEZUX1N0cm9rZXJSZWNfKiAgRlRfU3Ryb2tlcjsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZW51bToKKyAgICogICBGVF9TdHJva2VyX0xpbmVKb2luCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGVzZSB2YWx1ZXMgZGV0ZXJtaW5lIGhvdyB0d28gam9pbmluZyBsaW5lcyBhcmUgcmVuZGVyZWQKKyAgICogICBpbiBhIHN0cm9rZXIuCisgICAqCisgICAqIEB2YWx1ZXM6CisgICAqICAgRlRfU1RST0tFUl9MSU5FSk9JTl9ST1VORCA6OgorICAgKiAgICAgVXNlZCB0byByZW5kZXIgcm91bmRlZCBsaW5lIGpvaW5zLiAgQ2lyY3VsYXIgYXJjcyBhcmUgdXNlZAorICAgKiAgICAgdG8gam9pbiB0d28gbGluZXMgc21vb3RobHkuCisgICAqCisgICAqICAgRlRfU1RST0tFUl9MSU5FSk9JTl9CRVZFTCA6OgorICAgKiAgICAgVXNlZCB0byByZW5kZXIgYmV2ZWxlZCBsaW5lIGpvaW5zLiAgVGhlIG91dGVyIGNvcm5lciBvZgorICAgKiAgICAgdGhlIGpvaW5lZCBsaW5lcyBpcyBmaWxsZWQgYnkgZW5jbG9zaW5nIHRoZSB0cmlhbmd1bGFyCisgICAqICAgICByZWdpb24gb2YgdGhlIGNvcm5lciB3aXRoIGEgc3RyYWlnaHQgbGluZSBiZXR3ZWVuIHRoZQorICAgKiAgICAgb3V0ZXIgY29ybmVycyBvZiBlYWNoIHN0cm9rZS4KKyAgICoKKyAgICogICBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSX0ZJWEVEIDo6CisgICAqICAgICBVc2VkIHRvIHJlbmRlciBtaXRlcmVkIGxpbmUgam9pbnMsIHdpdGggZml4ZWQgYmV2ZWxzIGlmIHRoZQorICAgKiAgICAgbWl0ZXIgbGltaXQgaXMgZXhjZWVkZWQuICBUaGUgb3V0ZXIgZWRnZXMgb2YgdGhlIHN0cm9rZXMKKyAgICogICAgIGZvciB0aGUgdHdvIHNlZ21lbnRzIGFyZSBleHRlbmRlZCB1bnRpbCB0aGV5IG1lZXQgYXQgYW4KKyAgICogICAgIGFuZ2xlLiAgSWYgdGhlIHNlZ21lbnRzIG1lZXQgYXQgdG9vIHNoYXJwIGFuIGFuZ2xlIChzdWNoCisgICAqICAgICB0aGF0IHRoZSBtaXRlciB3b3VsZCBleHRlbmQgZnJvbSB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZQorICAgKiAgICAgc2VnbWVudHMgYSBkaXN0YW5jZSBncmVhdGVyIHRoYW4gdGhlIHByb2R1Y3Qgb2YgdGhlIG1pdGVyCisgICAqICAgICBsaW1pdCB2YWx1ZSBhbmQgdGhlIGJvcmRlciByYWRpdXMpLCB0aGVuIGEgYmV2ZWwgam9pbiAoc2VlCisgICAqICAgICBhYm92ZSkgaXMgdXNlZCBpbnN0ZWFkLiAgVGhpcyBwcmV2ZW50cyBsb25nIHNwaWtlcyBiZWluZworICAgKiAgICAgY3JlYXRlZC4gIEZUX1NUUk9LRVJfTElORUpPSU5fTUlURVJfRklYRUQgZ2VuZXJhdGVzIGEgbWl0ZXIKKyAgICogICAgIGxpbmUgam9pbiBhcyB1c2VkIGluIFBvc3RTY3JpcHQgYW5kIFBERi4KKyAgICoKKyAgICogICBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSX1ZBUklBQkxFIDo6CisgICAqICAgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUiA6OgorICAgKiAgICAgVXNlZCB0byByZW5kZXIgbWl0ZXJlZCBsaW5lIGpvaW5zLCB3aXRoIHZhcmlhYmxlIGJldmVscyBpZgorICAgKiAgICAgdGhlIG1pdGVyIGxpbWl0IGlzIGV4Y2VlZGVkLiAgVGhlIGludGVyc2VjdGlvbiBvZiB0aGUKKyAgICogICAgIHN0cm9rZXMgaXMgY2xpcHBlZCBhdCBhIGxpbmUgcGVycGVuZGljdWxhciB0byB0aGUgYmlzZWN0b3IKKyAgICogICAgIG9mIHRoZSBhbmdsZSBiZXR3ZWVuIHRoZSBzdHJva2VzLCBhdCB0aGUgZGlzdGFuY2UgZnJvbSB0aGUKKyAgICogICAgIGludGVyc2VjdGlvbiBvZiB0aGUgc2VnbWVudHMgZXF1YWwgdG8gdGhlIHByb2R1Y3Qgb2YgdGhlCisgICAqICAgICBtaXRlciBsaW1pdCB2YWx1ZSBhbmQgdGhlIGJvcmRlciByYWRpdXMuICBUaGlzIHByZXZlbnRzCisgICAqICAgICBsb25nIHNwaWtlcyBiZWluZyBjcmVhdGVkLgorICAgKiAgICAgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUl9WQVJJQUJMRSBnZW5lcmF0ZXMgYSBtaXRlcmVkIGxpbmUKKyAgICogICAgIGpvaW4gYXMgdXNlZCBpbiBYUFMuICBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSIGlzIGFuIGFsaWFzCisgICAqICAgICBmb3IgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUl9WQVJJQUJMRSwgcmV0YWluZWQgZm9yCisgICAqICAgICBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyAgICovCisgIHR5cGVkZWYgZW51bSAgRlRfU3Ryb2tlcl9MaW5lSm9pbl8KKyAgeworICAgIEZUX1NUUk9LRVJfTElORUpPSU5fUk9VTkQgICAgICAgICAgPSAwLAorICAgIEZUX1NUUk9LRVJfTElORUpPSU5fQkVWRUwgICAgICAgICAgPSAxLAorICAgIEZUX1NUUk9LRVJfTElORUpPSU5fTUlURVJfVkFSSUFCTEUgPSAyLAorICAgIEZUX1NUUk9LRVJfTElORUpPSU5fTUlURVIgICAgICAgICAgPSBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSX1ZBUklBQkxFLAorICAgIEZUX1NUUk9LRVJfTElORUpPSU5fTUlURVJfRklYRUQgICAgPSAzCisKKyAgfSBGVF9TdHJva2VyX0xpbmVKb2luOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBlbnVtOgorICAgKiAgIEZUX1N0cm9rZXJfTGluZUNhcAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVGhlc2UgdmFsdWVzIGRldGVybWluZSBob3cgdGhlIGVuZCBvZiBvcGVuZWQgc3ViLXBhdGhzIGFyZQorICAgKiAgIHJlbmRlcmVkIGluIGEgc3Ryb2tlLgorICAgKgorICAgKiBAdmFsdWVzOgorICAgKiAgIEZUX1NUUk9LRVJfTElORUNBUF9CVVRUIDo6CisgICAqICAgICBUaGUgZW5kIG9mIGxpbmVzIGlzIHJlbmRlcmVkIGFzIGEgZnVsbCBzdG9wIG9uIHRoZSBsYXN0CisgICAqICAgICBwb2ludCBpdHNlbGYuCisgICAqCisgICAqICAgRlRfU1RST0tFUl9MSU5FQ0FQX1JPVU5EIDo6CisgICAqICAgICBUaGUgZW5kIG9mIGxpbmVzIGlzIHJlbmRlcmVkIGFzIGEgaGFsZi1jaXJjbGUgYXJvdW5kIHRoZQorICAgKiAgICAgbGFzdCBwb2ludC4KKyAgICoKKyAgICogICBGVF9TVFJPS0VSX0xJTkVDQVBfU1FVQVJFIDo6CisgICAqICAgICBUaGUgZW5kIG9mIGxpbmVzIGlzIHJlbmRlcmVkIGFzIGEgc3F1YXJlIGFyb3VuZCB0aGUKKyAgICogICAgIGxhc3QgcG9pbnQuCisgICAqLworICB0eXBlZGVmIGVudW0gIEZUX1N0cm9rZXJfTGluZUNhcF8KKyAgeworICAgIEZUX1NUUk9LRVJfTElORUNBUF9CVVRUID0gMCwKKyAgICBGVF9TVFJPS0VSX0xJTkVDQVBfUk9VTkQsCisgICAgRlRfU1RST0tFUl9MSU5FQ0FQX1NRVUFSRQorCisgIH0gRlRfU3Ryb2tlcl9MaW5lQ2FwOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBlbnVtOgorICAgKiAgIEZUX1N0cm9rZXJCb3JkZXIKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBzZWxlY3QgYSBnaXZlbiBzdHJva2UgYm9yZGVyCisgICAqICAgaW4gQEZUX1N0cm9rZXJfR2V0Qm9yZGVyQ291bnRzIGFuZCBARlRfU3Ryb2tlcl9FeHBvcnRCb3JkZXIuCisgICAqCisgICAqIEB2YWx1ZXM6CisgICAqICAgRlRfU1RST0tFUl9CT1JERVJfTEVGVCA6OgorICAgKiAgICAgU2VsZWN0IHRoZSBsZWZ0IGJvcmRlciwgcmVsYXRpdmUgdG8gdGhlIGRyYXdpbmcgZGlyZWN0aW9uLgorICAgKgorICAgKiAgIEZUX1NUUk9LRVJfQk9SREVSX1JJR0hUIDo6CisgICAqICAgICBTZWxlY3QgdGhlIHJpZ2h0IGJvcmRlciwgcmVsYXRpdmUgdG8gdGhlIGRyYXdpbmcgZGlyZWN0aW9uLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBBcHBsaWNhdGlvbnMgYXJlIGdlbmVyYWxseSBpbnRlcmVzdGVkIGluIHRoZSBgaW5zaWRlJyBhbmQgYG91dHNpZGUnCisgICAqICAgYm9yZGVycy4gIEhvd2V2ZXIsIHRoZXJlIGlzIG5vIGRpcmVjdCBtYXBwaW5nIGJldHdlZW4gdGhlc2UgYW5kIHRoZQorICAgKiAgIGBsZWZ0JyBhbmQgYHJpZ2h0JyBvbmVzLCBzaW5jZSB0aGlzIHJlYWxseSBkZXBlbmRzIG9uIHRoZSBnbHlwaCdzCisgICAqICAgZHJhd2luZyBvcmllbnRhdGlvbiwgd2hpY2ggdmFyaWVzIGJldHdlZW4gZm9udCBmb3JtYXRzLgorICAgKgorICAgKiAgIFlvdSBjYW4gaG93ZXZlciB1c2UgQEZUX091dGxpbmVfR2V0SW5zaWRlQm9yZGVyIGFuZAorICAgKiAgIEBGVF9PdXRsaW5lX0dldE91dHNpZGVCb3JkZXIgdG8gZ2V0IHRoZXNlLgorICAgKi8KKyAgdHlwZWRlZiBlbnVtICBGVF9TdHJva2VyQm9yZGVyXworICB7CisgICAgRlRfU1RST0tFUl9CT1JERVJfTEVGVCA9IDAsCisgICAgRlRfU1RST0tFUl9CT1JERVJfUklHSFQKKworICB9IEZUX1N0cm9rZXJCb3JkZXI7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX091dGxpbmVfR2V0SW5zaWRlQm9yZGVyCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZXRyaWV2ZSB0aGUgQEZUX1N0cm9rZXJCb3JkZXIgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUKKyAgICogICBgaW5zaWRlJyBib3JkZXJzIG9mIGEgZ2l2ZW4gb3V0bGluZS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIG91dGxpbmUgOjoKKyAgICogICAgIFRoZSBzb3VyY2Ugb3V0bGluZSBoYW5kbGUuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgVGhlIGJvcmRlciBpbmRleC4gIEBGVF9TVFJPS0VSX0JPUkRFUl9SSUdIVCBmb3IgZW1wdHkgb3IgaW52YWxpZAorICAgKiAgIG91dGxpbmVzLgorICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9TdHJva2VyQm9yZGVyICkKKyAgRlRfT3V0bGluZV9HZXRJbnNpZGVCb3JkZXIoIEZUX091dGxpbmUqICBvdXRsaW5lICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX091dGxpbmVfR2V0T3V0c2lkZUJvcmRlcgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgUmV0cmlldmUgdGhlIEBGVF9TdHJva2VyQm9yZGVyIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgICAqICAgYG91dHNpZGUnIGJvcmRlcnMgb2YgYSBnaXZlbiBvdXRsaW5lLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgb3V0bGluZSA6OgorICAgKiAgICAgVGhlIHNvdXJjZSBvdXRsaW5lIGhhbmRsZS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBUaGUgYm9yZGVyIGluZGV4LiAgQEZUX1NUUk9LRVJfQk9SREVSX0xFRlQgZm9yIGVtcHR5IG9yIGludmFsaWQKKyAgICogICBvdXRsaW5lcy4KKyAgICovCisgIEZUX0VYUE9SVCggRlRfU3Ryb2tlckJvcmRlciApCisgIEZUX091dGxpbmVfR2V0T3V0c2lkZUJvcmRlciggRlRfT3V0bGluZSogIG91dGxpbmUgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfU3Ryb2tlcl9OZXcKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIENyZWF0ZSBhIG5ldyBzdHJva2VyIG9iamVjdC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGxpYnJhcnkgOjoKKyAgICogICAgIEZyZWVUeXBlIGxpYnJhcnkgaGFuZGxlLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIGFzdHJva2VyIDo6CisgICAqICAgICBBIG5ldyBzdHJva2VyIG9iamVjdCBoYW5kbGUuICBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfU3Ryb2tlcl9OZXcoIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgRlRfU3Ryb2tlciAgKmFzdHJva2VyICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX1N0cm9rZXJfU2V0CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZXNldCBhIHN0cm9rZXIgb2JqZWN0J3MgYXR0cmlidXRlcy4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIHN0cm9rZXIgOjoKKyAgICogICAgIFRoZSB0YXJnZXQgc3Ryb2tlciBoYW5kbGUuCisgICAqCisgICAqICAgcmFkaXVzIDo6CisgICAqICAgICBUaGUgYm9yZGVyIHJhZGl1cy4KKyAgICoKKyAgICogICBsaW5lX2NhcCA6OgorICAgKiAgICAgVGhlIGxpbmUgY2FwIHN0eWxlLgorICAgKgorICAgKiAgIGxpbmVfam9pbiA6OgorICAgKiAgICAgVGhlIGxpbmUgam9pbiBzdHlsZS4KKyAgICoKKyAgICogICBtaXRlcl9saW1pdCA6OgorICAgKiAgICAgVGhlIG1pdGVyIGxpbWl0IGZvciB0aGUgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUl9GSVhFRCBhbmQKKyAgICogICAgIEZUX1NUUk9LRVJfTElORUpPSU5fTUlURVJfVkFSSUFCTEUgbGluZSBqb2luIHN0eWxlcywKKyAgICogICAgIGV4cHJlc3NlZCBhcyAxNi4xNiBmaXhlZC1wb2ludCB2YWx1ZS4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhlIHJhZGl1cyBpcyBleHByZXNzZWQgaW4gdGhlIHNhbWUgdW5pdHMgYXMgdGhlIG91dGxpbmUKKyAgICogICBjb29yZGluYXRlcy4KKyAgICoKKyAgICogICBUaGlzIGZ1bmN0aW9uIGNhbGxzIEBGVF9TdHJva2VyX1Jld2luZCBhdXRvbWF0aWNhbGx5LgorICAgKi8KKyAgRlRfRVhQT1JUKCB2b2lkICkKKyAgRlRfU3Ryb2tlcl9TZXQoIEZUX1N0cm9rZXIgICAgICAgICAgIHN0cm9rZXIsCisgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICAgICAgICAgICByYWRpdXMsCisgICAgICAgICAgICAgICAgICBGVF9TdHJva2VyX0xpbmVDYXAgICBsaW5lX2NhcCwKKyAgICAgICAgICAgICAgICAgIEZUX1N0cm9rZXJfTGluZUpvaW4gIGxpbmVfam9pbiwKKyAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICAgICAgICAgIG1pdGVyX2xpbWl0ICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX1N0cm9rZXJfUmV3aW5kCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZXNldCBhIHN0cm9rZXIgb2JqZWN0IHdpdGhvdXQgY2hhbmdpbmcgaXRzIGF0dHJpYnV0ZXMuCisgICAqICAgWW91IHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGJlZ2lubmluZyBhIG5ldworICAgKiAgIHNlcmllcyBvZiBjYWxscyB0byBARlRfU3Ryb2tlcl9CZWdpblN1YlBhdGggb3IKKyAgICogICBARlRfU3Ryb2tlcl9FbmRTdWJQYXRoLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgc3Ryb2tlciA6OgorICAgKiAgICAgVGhlIHRhcmdldCBzdHJva2VyIGhhbmRsZS4KKyAgICovCisgIEZUX0VYUE9SVCggdm9pZCApCisgIEZUX1N0cm9rZXJfUmV3aW5kKCBGVF9TdHJva2VyICBzdHJva2VyICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX1N0cm9rZXJfUGFyc2VPdXRsaW5lCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHVzZWQgdG8gcGFyc2UgYSB3aG9sZSBvdXRsaW5lIHdpdGgKKyAgICogICB0aGUgc3Ryb2tlci4gIFRoZSByZXN1bHRpbmcgb3V0bGluZShzKSBjYW4gYmUgcmV0cmlldmVkCisgICAqICAgbGF0ZXIgYnkgZnVuY3Rpb25zIGxpa2UgQEZUX1N0cm9rZXJfR2V0Q291bnRzIGFuZCBARlRfU3Ryb2tlcl9FeHBvcnQuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBzdHJva2VyIDo6CisgICAqICAgICBUaGUgdGFyZ2V0IHN0cm9rZXIgaGFuZGxlLgorICAgKgorICAgKiAgIG91dGxpbmUgOjoKKyAgICogICAgIFRoZSBzb3VyY2Ugb3V0bGluZS4KKyAgICoKKyAgICogICBvcGVuZWQgOjoKKyAgICogICAgIEEgYm9vbGVhbi4gIElmfjEsIHRoZSBvdXRsaW5lIGlzIHRyZWF0ZWQgYXMgYW4gb3BlbiBwYXRoIGluc3RlYWQKKyAgICogICAgIG9mIGEgY2xvc2VkIG9uZS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBJZiBgb3BlbmVkJyBpc34wICh0aGUgZGVmYXVsdCksIHRoZSBvdXRsaW5lIGlzIHRyZWF0ZWQgYXMgYSBjbG9zZWQKKyAgICogICBwYXRoLCBhbmQgdGhlIHN0cm9rZXIgZ2VuZXJhdGVzIHR3byBkaXN0aW5jdCBgYm9yZGVyJyBvdXRsaW5lcy4KKyAgICoKKyAgICogICBJZiBgb3BlbmVkJyBpc34xLCB0aGUgb3V0bGluZSBpcyBwcm9jZXNzZWQgYXMgYW4gb3BlbiBwYXRoLCBhbmQgdGhlCisgICAqICAgc3Ryb2tlciBnZW5lcmF0ZXMgYSBzaW5nbGUgYHN0cm9rZScgb3V0bGluZS4KKyAgICoKKyAgICogICBUaGlzIGZ1bmN0aW9uIGNhbGxzIEBGVF9TdHJva2VyX1Jld2luZCBhdXRvbWF0aWNhbGx5LgorICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX1N0cm9rZXJfUGFyc2VPdXRsaW5lKCBGVF9TdHJva2VyICAgc3Ryb2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICBvdXRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgIG9wZW5lZCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9TdHJva2VyX0JlZ2luU3ViUGF0aAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgU3RhcnQgYSBuZXcgc3ViLXBhdGggaW4gdGhlIHN0cm9rZXIuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBzdHJva2VyIDo6CisgICAqICAgICBUaGUgdGFyZ2V0IHN0cm9rZXIgaGFuZGxlLgorICAgKgorICAgKiAgIHRvIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IHZlY3Rvci4KKyAgICoKKyAgICogICBvcGVuIDo6CisgICAqICAgICBBIGJvb2xlYW4uICBJZn4xLCB0aGUgc3ViLXBhdGggaXMgdHJlYXRlZCBhcyBhbiBvcGVuIG9uZS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSBuZWVkIHRvIHN0cm9rZSBhIHBhdGggdGhhdCBpcworICAgKiAgIG5vdCBzdG9yZWQgYXMgYW4gQEZUX091dGxpbmUgb2JqZWN0LgorICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX1N0cm9rZXJfQmVnaW5TdWJQYXRoKCBGVF9TdHJva2VyICBzdHJva2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICBvcGVuICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX1N0cm9rZXJfRW5kU3ViUGF0aAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQ2xvc2UgdGhlIGN1cnJlbnQgc3ViLXBhdGggaW4gdGhlIHN0cm9rZXIuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBzdHJva2VyIDo6CisgICAqICAgICBUaGUgdGFyZ2V0IHN0cm9rZXIgaGFuZGxlLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFlvdSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIEBGVF9TdHJva2VyX0JlZ2luU3ViUGF0aC4KKyAgICogICBJZiB0aGUgc3VicGF0aCB3YXMgbm90IGBvcGVuZWQnLCB0aGlzIGZ1bmN0aW9uIGBkcmF3cycgYQorICAgKiAgIHNpbmdsZSBsaW5lIHNlZ21lbnQgdG8gdGhlIHN0YXJ0IHBvc2l0aW9uIHdoZW4gbmVlZGVkLgorICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX1N0cm9rZXJfRW5kU3ViUGF0aCggRlRfU3Ryb2tlciAgc3Ryb2tlciApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9TdHJva2VyX0xpbmVUbworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgYERyYXcnIGEgc2luZ2xlIGxpbmUgc2VnbWVudCBpbiB0aGUgc3Ryb2tlcidzIGN1cnJlbnQgc3ViLXBhdGgsCisgICAqICAgZnJvbSB0aGUgbGFzdCBwb3NpdGlvbi4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIHN0cm9rZXIgOjoKKyAgICogICAgIFRoZSB0YXJnZXQgc3Ryb2tlciBoYW5kbGUuCisgICAqCisgICAqICAgdG8gOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gcG9pbnQuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgWW91IHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gYmV0d2VlbiBARlRfU3Ryb2tlcl9CZWdpblN1YlBhdGggYW5kCisgICAqICAgQEZUX1N0cm9rZXJfRW5kU3ViUGF0aC4KKyAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9TdHJva2VyX0xpbmVUbyggRlRfU3Ryb2tlciAgc3Ryb2tlciwKKyAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHRvICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX1N0cm9rZXJfQ29uaWNUbworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgYERyYXcnIGEgc2luZ2xlIHF1YWRyYXRpYyBCw6l6aWVyIGluIHRoZSBzdHJva2VyJ3MgY3VycmVudCBzdWItcGF0aCwKKyAgICogICBmcm9tIHRoZSBsYXN0IHBvc2l0aW9uLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgc3Ryb2tlciA6OgorICAgKiAgICAgVGhlIHRhcmdldCBzdHJva2VyIGhhbmRsZS4KKyAgICoKKyAgICogICBjb250cm9sIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gYSBCw6l6aWVyIGNvbnRyb2wgcG9pbnQuCisgICAqCisgICAqICAgdG8gOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gcG9pbnQuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgWW91IHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gYmV0d2VlbiBARlRfU3Ryb2tlcl9CZWdpblN1YlBhdGggYW5kCisgICAqICAgQEZUX1N0cm9rZXJfRW5kU3ViUGF0aC4KKyAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9TdHJva2VyX0NvbmljVG8oIEZUX1N0cm9rZXIgIHN0cm9rZXIsCisgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICB0byApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9TdHJva2VyX0N1YmljVG8KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIGBEcmF3JyBhIHNpbmdsZSBjdWJpYyBCw6l6aWVyIGluIHRoZSBzdHJva2VyJ3MgY3VycmVudCBzdWItcGF0aCwKKyAgICogICBmcm9tIHRoZSBsYXN0IHBvc2l0aW9uLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgc3Ryb2tlciA6OgorICAgKiAgICAgVGhlIHRhcmdldCBzdHJva2VyIGhhbmRsZS4KKyAgICoKKyAgICogICBjb250cm9sMSA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBmaXJzdCBCw6l6aWVyIGNvbnRyb2wgcG9pbnQuCisgICAqCisgICAqICAgY29udHJvbDIgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byBzZWNvbmQgQsOpemllciBjb250cm9sIHBvaW50LgorICAgKgorICAgKiAgIHRvIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHBvaW50LgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFlvdSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIGJldHdlZW4gQEZUX1N0cm9rZXJfQmVnaW5TdWJQYXRoIGFuZAorICAgKiAgIEBGVF9TdHJva2VyX0VuZFN1YlBhdGguCisgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfU3Ryb2tlcl9DdWJpY1RvKCBGVF9TdHJva2VyICBzdHJva2VyLAorICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIGNvbnRyb2wxLAorICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIGNvbnRyb2wyLAorICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHRvICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX1N0cm9rZXJfR2V0Qm9yZGVyQ291bnRzCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBDYWxsIHRoaXMgZnVuY3Rpb24gb25jZSB5b3UgaGF2ZSBmaW5pc2hlZCBwYXJzaW5nIHlvdXIgcGF0aHMKKyAgICogICB3aXRoIHRoZSBzdHJva2VyLiAgSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHBvaW50cyBhbmQKKyAgICogICBjb250b3VycyBuZWNlc3NhcnkgdG8gZXhwb3J0IG9uZSBvZiB0aGUgYGJvcmRlcicgb3IgYHN0cm9rZScKKyAgICogICBvdXRsaW5lcyBnZW5lcmF0ZWQgYnkgdGhlIHN0cm9rZXIuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBzdHJva2VyIDo6CisgICAqICAgICBUaGUgdGFyZ2V0IHN0cm9rZXIgaGFuZGxlLgorICAgKgorICAgKiAgIGJvcmRlciA6OgorICAgKiAgICAgVGhlIGJvcmRlciBpbmRleC4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBhbnVtX3BvaW50cyA6OgorICAgKiAgICAgVGhlIG51bWJlciBvZiBwb2ludHMuCisgICAqCisgICAqICAgYW51bV9jb250b3VycyA6OgorICAgKiAgICAgVGhlIG51bWJlciBvZiBjb250b3Vycy4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBXaGVuIGFuIG91dGxpbmUsIG9yIGEgc3ViLXBhdGgsIGlzIGBjbG9zZWQnLCB0aGUgc3Ryb2tlciBnZW5lcmF0ZXMKKyAgICogICB0d28gaW5kZXBlbmRlbnQgYGJvcmRlcicgb3V0bGluZXMsIG5hbWVkIGBsZWZ0JyBhbmQgYHJpZ2h0Jy4KKyAgICoKKyAgICogICBXaGVuIHRoZSBvdXRsaW5lLCBvciBhIHN1Yi1wYXRoLCBpcyBgb3BlbmVkJywgdGhlIHN0cm9rZXIgbWVyZ2VzCisgICAqICAgdGhlIGBib3JkZXInIG91dGxpbmVzIHdpdGggY2Fwcy4gIFRoZSBgbGVmdCcgYm9yZGVyIHJlY2VpdmVzIGFsbAorICAgKiAgIHBvaW50cywgd2hpbGUgdGhlIGByaWdodCcgYm9yZGVyIGJlY29tZXMgZW1wdHkuCisgICAqCisgICAqICAgVXNlIHRoZSBmdW5jdGlvbiBARlRfU3Ryb2tlcl9HZXRDb3VudHMgaW5zdGVhZCBpZiB5b3Ugd2FudCB0bworICAgKiAgIHJldHJpZXZlIHRoZSBjb3VudHMgYXNzb2NpYXRlZCB0byBib3RoIGJvcmRlcnMuCisgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfU3Ryb2tlcl9HZXRCb3JkZXJDb3VudHMoIEZUX1N0cm9rZXIgICAgICAgIHN0cm9rZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJva2VyQm9yZGVyICBib3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICphbnVtX3BvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgKmFudW1fY29udG91cnMgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfU3Ryb2tlcl9FeHBvcnRCb3JkZXIKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIENhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciBARlRfU3Ryb2tlcl9HZXRCb3JkZXJDb3VudHMgdG8KKyAgICogICBleHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgYm9yZGVyIHRvIHlvdXIgb3duIEBGVF9PdXRsaW5lCisgICAqICAgc3RydWN0dXJlLgorICAgKgorICAgKiAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGFwcGVuZHMgdGhlIGJvcmRlciBwb2ludHMgYW5kCisgICAqICAgY29udG91cnMgdG8geW91ciBvdXRsaW5lLCBidXQgZG9lcyBub3QgdHJ5IHRvIHJlc2l6ZSBpdHMKKyAgICogICBhcnJheXMuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBzdHJva2VyIDo6CisgICAqICAgICBUaGUgdGFyZ2V0IHN0cm9rZXIgaGFuZGxlLgorICAgKgorICAgKiAgIGJvcmRlciA6OgorICAgKiAgICAgVGhlIGJvcmRlciBpbmRleC4KKyAgICoKKyAgICogICBvdXRsaW5lIDo6CisgICAqICAgICBUaGUgdGFyZ2V0IG91dGxpbmUgaGFuZGxlLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBBbHdheXMgY2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIEBGVF9TdHJva2VyX0dldEJvcmRlckNvdW50cyB0bworICAgKiAgIGdldCBzdXJlIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4geW91ciBARlRfT3V0bGluZSBvYmplY3QgdG8KKyAgICogICByZWNlaXZlIGFsbCBuZXcgZGF0YS4KKyAgICoKKyAgICogICBXaGVuIGFuIG91dGxpbmUsIG9yIGEgc3ViLXBhdGgsIGlzIGBjbG9zZWQnLCB0aGUgc3Ryb2tlciBnZW5lcmF0ZXMKKyAgICogICB0d28gaW5kZXBlbmRlbnQgYGJvcmRlcicgb3V0bGluZXMsIG5hbWVkIGBsZWZ0JyBhbmQgYHJpZ2h0Jy4KKyAgICoKKyAgICogICBXaGVuIHRoZSBvdXRsaW5lLCBvciBhIHN1Yi1wYXRoLCBpcyBgb3BlbmVkJywgdGhlIHN0cm9rZXIgbWVyZ2VzCisgICAqICAgdGhlIGBib3JkZXInIG91dGxpbmVzIHdpdGggY2Fwcy4gIFRoZSBgbGVmdCcgYm9yZGVyIHJlY2VpdmVzIGFsbAorICAgKiAgIHBvaW50cywgd2hpbGUgdGhlIGByaWdodCcgYm9yZGVyIGJlY29tZXMgZW1wdHkuCisgICAqCisgICAqICAgVXNlIHRoZSBmdW5jdGlvbiBARlRfU3Ryb2tlcl9FeHBvcnQgaW5zdGVhZCBpZiB5b3Ugd2FudCB0bworICAgKiAgIHJldHJpZXZlIGFsbCBib3JkZXJzIGF0IG9uY2UuCisgICAqLworICBGVF9FWFBPUlQoIHZvaWQgKQorICBGVF9TdHJva2VyX0V4cG9ydEJvcmRlciggRlRfU3Ryb2tlciAgICAgICAgc3Ryb2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cm9rZXJCb3JkZXIgIGJvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICAgICAgIG91dGxpbmUgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfU3Ryb2tlcl9HZXRDb3VudHMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIENhbGwgdGhpcyBmdW5jdGlvbiBvbmNlIHlvdSBoYXZlIGZpbmlzaGVkIHBhcnNpbmcgeW91ciBwYXRocworICAgKiAgIHdpdGggdGhlIHN0cm9rZXIuICBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgcG9pbnRzIGFuZAorICAgKiAgIGNvbnRvdXJzIG5lY2Vzc2FyeSB0byBleHBvcnQgYWxsIHBvaW50cy9ib3JkZXJzIGZyb20gdGhlIHN0cm9rZWQKKyAgICogICBvdXRsaW5lL3BhdGguCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBzdHJva2VyIDo6CisgICAqICAgICBUaGUgdGFyZ2V0IHN0cm9rZXIgaGFuZGxlLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIGFudW1fcG9pbnRzIDo6CisgICAqICAgICBUaGUgbnVtYmVyIG9mIHBvaW50cy4KKyAgICoKKyAgICogICBhbnVtX2NvbnRvdXJzIDo6CisgICAqICAgICBUaGUgbnVtYmVyIG9mIGNvbnRvdXJzLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfU3Ryb2tlcl9HZXRDb3VudHMoIEZUX1N0cm9rZXIgIHN0cm9rZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICphbnVtX3BvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgKmFudW1fY29udG91cnMgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfU3Ryb2tlcl9FeHBvcnQKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIENhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciBARlRfU3Ryb2tlcl9HZXRCb3JkZXJDb3VudHMgdG8KKyAgICogICBleHBvcnQgYWxsIGJvcmRlcnMgdG8geW91ciBvd24gQEZUX091dGxpbmUgc3RydWN0dXJlLgorICAgKgorICAgKiAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGFwcGVuZHMgdGhlIGJvcmRlciBwb2ludHMgYW5kCisgICAqICAgY29udG91cnMgdG8geW91ciBvdXRsaW5lLCBidXQgZG9lcyBub3QgdHJ5IHRvIHJlc2l6ZSBpdHMKKyAgICogICBhcnJheXMuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBzdHJva2VyIDo6CisgICAqICAgICBUaGUgdGFyZ2V0IHN0cm9rZXIgaGFuZGxlLgorICAgKgorICAgKiAgIG91dGxpbmUgOjoKKyAgICogICAgIFRoZSB0YXJnZXQgb3V0bGluZSBoYW5kbGUuCisgICAqLworICBGVF9FWFBPUlQoIHZvaWQgKQorICBGVF9TdHJva2VyX0V4cG9ydCggRlRfU3Ryb2tlciAgIHN0cm9rZXIsCisgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9TdHJva2VyX0RvbmUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIERlc3Ryb3kgYSBzdHJva2VyIG9iamVjdC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIHN0cm9rZXIgOjoKKyAgICogICAgIEEgc3Ryb2tlciBoYW5kbGUuICBDYW4gYmUgTlVMTC4KKyAgICovCisgIEZUX0VYUE9SVCggdm9pZCApCisgIEZUX1N0cm9rZXJfRG9uZSggRlRfU3Ryb2tlciAgc3Ryb2tlciApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9HbHlwaF9TdHJva2UKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFN0cm9rZSBhIGdpdmVuIG91dGxpbmUgZ2x5cGggb2JqZWN0IHdpdGggYSBnaXZlbiBzdHJva2VyLgorICAgKgorICAgKiBAaW5vdXQ6CisgICAqICAgcGdseXBoIDo6CisgICAqICAgICBTb3VyY2UgZ2x5cGggaGFuZGxlIG9uIGlucHV0LCBuZXcgZ2x5cGggaGFuZGxlIG9uIG91dHB1dC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIHN0cm9rZXIgOjoKKyAgICogICAgIEEgc3Ryb2tlciBoYW5kbGUuCisgICAqCisgICAqICAgZGVzdHJveSA6OgorICAgKiAgICAgQSBCb29sZWFuLiAgSWZ+MSwgdGhlIHNvdXJjZSBnbHlwaCBvYmplY3QgaXMgZGVzdHJveWVkCisgICAqICAgICBvbiBzdWNjZXNzLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGUgc291cmNlIGdseXBoIGlzIHVudG91Y2hlZCBpbiBjYXNlIG9mIGVycm9yLgorICAgKgorICAgKiAgIEFkZGluZyBzdHJva2UgbWF5IHlpZWxkIGEgc2lnbmlmaWNhbnRseSB3aWRlciBhbmQgdGFsbGVyIGdseXBoCisgICAqICAgZGVwZW5kaW5nIG9uIGhvdyBsYXJnZSBvZiBhIHJhZGl1cyB3YXMgdXNlZCB0byBzdHJva2UgdGhlIGdseXBoLiAgWW91CisgICAqICAgbWF5IG5lZWQgdG8gbWFudWFsbHkgYWRqdXN0IGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGFkdmFuY2UgYW1vdW50cworICAgKiAgIHRvIGFjY291bnQgZm9yIHRoaXMgYWRkZWQgc2l6ZS4KKyAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9HbHlwaF9TdHJva2UoIEZUX0dseXBoICAgICpwZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgRlRfU3Ryb2tlciAgIHN0cm9rZXIsCisgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgIGRlc3Ryb3kgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfR2x5cGhfU3Ryb2tlQm9yZGVyCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBTdHJva2UgYSBnaXZlbiBvdXRsaW5lIGdseXBoIG9iamVjdCB3aXRoIGEgZ2l2ZW4gc3Ryb2tlciwgYnV0CisgICAqICAgb25seSByZXR1cm4gZWl0aGVyIGl0cyBpbnNpZGUgb3Igb3V0c2lkZSBib3JkZXIuCisgICAqCisgICAqIEBpbm91dDoKKyAgICogICBwZ2x5cGggOjoKKyAgICogICAgIFNvdXJjZSBnbHlwaCBoYW5kbGUgb24gaW5wdXQsIG5ldyBnbHlwaCBoYW5kbGUgb24gb3V0cHV0LgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgc3Ryb2tlciA6OgorICAgKiAgICAgQSBzdHJva2VyIGhhbmRsZS4KKyAgICoKKyAgICogICBpbnNpZGUgOjoKKyAgICogICAgIEEgQm9vbGVhbi4gIElmfjEsIHJldHVybiB0aGUgaW5zaWRlIGJvcmRlciwgb3RoZXJ3aXNlCisgICAqICAgICB0aGUgb3V0c2lkZSBib3JkZXIuCisgICAqCisgICAqICAgZGVzdHJveSA6OgorICAgKiAgICAgQSBCb29sZWFuLiAgSWZ+MSwgdGhlIHNvdXJjZSBnbHlwaCBvYmplY3QgaXMgZGVzdHJveWVkCisgICAqICAgICBvbiBzdWNjZXNzLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGUgc291cmNlIGdseXBoIGlzIHVudG91Y2hlZCBpbiBjYXNlIG9mIGVycm9yLgorICAgKgorICAgKiAgIEFkZGluZyBzdHJva2UgbWF5IHlpZWxkIGEgc2lnbmlmaWNhbnRseSB3aWRlciBhbmQgdGFsbGVyIGdseXBoCisgICAqICAgZGVwZW5kaW5nIG9uIGhvdyBsYXJnZSBvZiBhIHJhZGl1cyB3YXMgdXNlZCB0byBzdHJva2UgdGhlIGdseXBoLiAgWW91CisgICAqICAgbWF5IG5lZWQgdG8gbWFudWFsbHkgYWRqdXN0IGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGFkdmFuY2UgYW1vdW50cworICAgKiAgIHRvIGFjY291bnQgZm9yIHRoaXMgYWRkZWQgc2l6ZS4KKyAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9HbHlwaF9TdHJva2VCb3JkZXIoIEZUX0dseXBoICAgICpwZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3Ryb2tlciAgIHN0cm9rZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgIGluc2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgZGVzdHJveSApOworCisgIC8qICovCisKK0ZUX0VORF9IRUFERVIKKworI2VuZGlmIC8qIF9fRlRfU1RST0tFX0hfXyAqLworCisKKy8qIEVORCAqLworCisKKy8qIExvY2FsIFZhcmlhYmxlczogKi8KKy8qIGNvZGluZzogdXRmLTggICAgKi8KKy8qIEVuZDogICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRzeW50aC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdHN5bnRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjYmFkOAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRzeW50aC5oCkBAIC0wLDAgKzEsODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0c3ludGguaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGcmVlVHlwZSBzeW50aGVzaXppbmcgY29kZSBmb3IgZW1ib2xkZW5pbmcgYW5kIHNsYW50aW5nICAgICAgICAgICAgICAqLworLyogICAgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDAtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KKyAgLyoqKioqKioqKiAgICAgICAgV0FSTklORywgVEhJUyBJUyBBTFBIQSBDT0RFISAgVEhJUyBBUEkgICAgICAgICAqKioqKioqKiovCisgIC8qKioqKioqKiogICAgSVMgRFVFIFRPIENIQU5HRSBVTlRJTCBTVFJJQ1RMWSBOT1RJRklFRCBCWSBUSEUgICAgKioqKioqKioqLworICAvKioqKioqKioqICAgICAgICAgICAgRlJFRVRZUEUgREVWRUxPUE1FTlQgVEVBTSAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KKyAgLyoqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qIE1haW4gcmVhc29uIGZvciBub3QgbGlmdGluZyB0aGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIHRvIGEgICovCisgIC8qIGBzdGFuZGFyZCcgQVBJIGlzIHRoYXQgdGhlIHVzZWQgcGFyYW1ldGVycyBmb3IgZW1ib2xkZW5pbmcgYW5kICovCisgIC8qIHNsYW50aW5nIGFyZSBub3QgY29uZmlndXJhYmxlLiAgQ29uc2lkZXIgdGhlIGZ1bmN0aW9ucyBhcyBhICAgICovCisgIC8qIGNvZGUgcmVzb3VyY2UgdGhhdCBzaG91bGQgYmUgY29waWVkIGludG8gdGhlIGFwcGxpY2F0aW9uIGFuZCAgICovCisgIC8qIGFkYXB0ZWQgdG8gdGhlIHBhcnRpY3VsYXIgbmVlZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKworI2lmbmRlZiBfX0ZUU1lOVEhfSF9fCisjZGVmaW5lIF9fRlRTWU5USF9IX18KKworCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKworI2lmZGVmIEZSRUVUWVBFX0gKKyNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCisjZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKKyNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgorI2VuZGlmCisKKworRlRfQkVHSU5fSEVBREVSCisKKyAgLyogRW1ib2xkZW4gYSBnbHlwaCBieSBhIGByZWFzb25hYmxlJyB2YWx1ZSAod2hpY2ggaXMgaGlnaGx5IGEgbWF0dGVyIG9mICovCisgIC8qIHRhc3RlKS4gIFRoaXMgZnVuY3Rpb24gaXMgYWN0dWFsbHkgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiwgcHJvdmlkaW5nICAqLworICAvKiBhIHdyYXBwZXIgZm9yIEBGVF9PdXRsaW5lX0VtYm9sZGVuIGFuZCBARlRfQml0bWFwX0VtYm9sZGVuLiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEZvciBlbWJvbGRlbmVkIG91dGxpbmVzIHRoZSBoZWlnaHQsIHdpZHRoLCBhbmQgYWR2YW5jZSBtZXRyaWNzIGFyZSAgICAqLworICAvKiBpbmNyZWFzZWQgYnkgdGhlIHN0cmVuZ3RoIG9mIHRoZSBlbWJvbGRlbmluZyAtLSB0aGlzIGV2ZW4gYWZmZWN0cyAgICAgKi8KKyAgLyogbW9uby13aWR0aCBmb250cyEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBZb3UgY2FuIGFsc28gY2FsbCBARlRfT3V0bGluZV9HZXRfQ0JveCB0byBnZXQgcHJlY2lzZSB2YWx1ZXMuICAgICAgICAgKi8KKyAgRlRfRVhQT1JUKCB2b2lkICkKKyAgRlRfR2x5cGhTbG90X0VtYm9sZGVuKCBGVF9HbHlwaFNsb3QgIHNsb3QgKTsKKworICAvKiBTbGFudCBhbiBvdXRsaW5lIGdseXBoIHRvIHRoZSByaWdodCBieSBhYm91dCAxMiBkZWdyZWVzLiAqLworICBGVF9FWFBPUlQoIHZvaWQgKQorICBGVF9HbHlwaFNsb3RfT2JsaXF1ZSggRlRfR2x5cGhTbG90ICBzbG90ICk7CisKKyAgLyogKi8KKworCitGVF9FTkRfSEVBREVSCisKKyNlbmRpZiAvKiBfX0ZUU1lOVEhfSF9fICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0c3lzdGVtLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0c3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJjOTk5OQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRzeXN0ZW0uaApAQCAtMCwwICsxLDM1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRzeXN0ZW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWVUeXBlIGxvdy1sZXZlbCBzeXN0ZW0gaW50ZXJmYWNlIGRlZmluaXRpb24gKHNwZWNpZmljYXRpb24pLiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fRlRTWVNURU1fSF9fCisjZGVmaW5lIF9fRlRTWVNURU1fSF9fCisKKworI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CisKKworRlRfQkVHSU5fSEVBREVSCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIHN5c3RlbV9pbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFN5c3RlbSBJbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEhvdyBGcmVlVHlwZSBtYW5hZ2VzIG1lbW9yeSBhbmQgaS9vLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB2YXJpb3VzIGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gbWVtb3J5ICAgICAgICAgKi8KKyAgLyogICBtYW5hZ2VtZW50IGFuZCBpL28gYWNjZXNzLiAgWW91IG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzICAgICAgICAgICAgICovCisgIC8qICAgaW5mb3JtYXRpb24gaWYgeW91IHdhbnQgdG8gdXNlIGEgY3VzdG9tIG1lbW9yeSBtYW5hZ2VyIG9yIHlvdSBvd24gICAqLworICAvKiAgIGkvbyBzdHJlYW1zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIE0gRSBNIE8gUiBZICAgTSBBIE4gQSBHIEUgTSBFIE4gVCAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHR5cGU6CisgICAqICAgRlRfTWVtb3J5CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIGhhbmRsZSB0byBhIGdpdmVuIG1lbW9yeSBtYW5hZ2VyIG9iamVjdCwgZGVmaW5lZCB3aXRoIGFuCisgICAqICAgQEZUX01lbW9yeVJlYyBzdHJ1Y3R1cmUuCisgICAqCisgICAqLworICB0eXBlZGVmIHN0cnVjdCBGVF9NZW1vcnlSZWNfKiAgRlRfTWVtb3J5OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIEZUX0FsbG9jX0Z1bmMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgZnVuY3Rpb24gdXNlZCB0byBhbGxvY2F0ZSBgc2l6ZScgYnl0ZXMgZnJvbSBgbWVtb3J5Jy4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIG1lbW9yeSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBtZW1vcnkgbWFuYWdlci4KKyAgICoKKyAgICogICBzaXplIDo6CisgICAqICAgICBUaGUgc2l6ZSBpbiBieXRlcyB0byBhbGxvY2F0ZS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBBZGRyZXNzIG9mIG5ldyBtZW1vcnkgYmxvY2suICAwfmluIGNhc2Ugb2YgZmFpbHVyZS4KKyAgICoKKyAgICovCisgIHR5cGVkZWYgdm9pZCoKKyAgKCpGVF9BbGxvY19GdW5jKSggRlRfTWVtb3J5ICBtZW1vcnksCisgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgc2l6ZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIEZUX0ZyZWVfRnVuYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBmdW5jdGlvbiB1c2VkIHRvIHJlbGVhc2UgYSBnaXZlbiBibG9jayBvZiBtZW1vcnkuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBtZW1vcnkgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgbWVtb3J5IG1hbmFnZXIuCisgICAqCisgICAqICAgYmxvY2sgOjoKKyAgICogICAgIFRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgbWVtb3J5IGJsb2NrLgorICAgKgorICAgKi8KKyAgdHlwZWRlZiB2b2lkCisgICgqRlRfRnJlZV9GdW5jKSggRlRfTWVtb3J5ICBtZW1vcnksCisgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICBibG9jayApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIEZUX1JlYWxsb2NfRnVuYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBmdW5jdGlvbiB1c2VkIHRvIHJlLWFsbG9jYXRlIGEgZ2l2ZW4gYmxvY2sgb2YgbWVtb3J5LgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgbWVtb3J5IDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIG1lbW9yeSBtYW5hZ2VyLgorICAgKgorICAgKiAgIGN1cl9zaXplIDo6CisgICAqICAgICBUaGUgYmxvY2sncyBjdXJyZW50IHNpemUgaW4gYnl0ZXMuCisgICAqCisgICAqICAgbmV3X3NpemUgOjoKKyAgICogICAgIFRoZSBibG9jaydzIHJlcXVlc3RlZCBuZXcgc2l6ZS4KKyAgICoKKyAgICogICBibG9jayA6OgorICAgKiAgICAgVGhlIGJsb2NrJ3MgY3VycmVudCBhZGRyZXNzLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIE5ldyBibG9jayBhZGRyZXNzLiAgMH5pbiBjYXNlIG9mIG1lbW9yeSBzaG9ydGFnZS4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgSW4gY2FzZSBvZiBlcnJvciwgdGhlIG9sZCBibG9jayBtdXN0IHN0aWxsIGJlIGF2YWlsYWJsZS4KKyAgICoKKyAgICovCisgIHR5cGVkZWYgdm9pZCoKKyAgKCpGVF9SZWFsbG9jX0Z1bmMpKCBGVF9NZW1vcnkgIG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgIGN1cl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgbmV3X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICBibG9jayApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBGVF9NZW1vcnlSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgYSBnaXZlbiBtZW1vcnkgbWFuYWdlciB0byBGcmVlVHlwZX4yLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIHVzZXIgOjoKKyAgICogICAgIEEgZ2VuZXJpYyB0eXBlbGVzcyBwb2ludGVyIGZvciB1c2VyIGRhdGEuCisgICAqCisgICAqICAgYWxsb2MgOjoKKyAgICogICAgIEEgcG9pbnRlciB0eXBlIHRvIGFuIGFsbG9jYXRpb24gZnVuY3Rpb24uCisgICAqCisgICAqICAgZnJlZSA6OgorICAgKiAgICAgQSBwb2ludGVyIHR5cGUgdG8gYW4gbWVtb3J5IGZyZWVpbmcgZnVuY3Rpb24uCisgICAqCisgICAqICAgcmVhbGxvYyA6OgorICAgKiAgICAgQSBwb2ludGVyIHR5cGUgdG8gYSByZWFsbG9jYXRpb24gZnVuY3Rpb24uCisgICAqCisgICAqLworICBzdHJ1Y3QgIEZUX01lbW9yeVJlY18KKyAgeworICAgIHZvaWQqICAgICAgICAgICAgdXNlcjsKKyAgICBGVF9BbGxvY19GdW5jICAgIGFsbG9jOworICAgIEZUX0ZyZWVfRnVuYyAgICAgZnJlZTsKKyAgICBGVF9SZWFsbG9jX0Z1bmMgIHJlYWxsb2M7CisgIH07CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICBJIC8gTyAgIE0gQSBOIEEgRyBFIE0gRSBOIFQgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBGVF9TdHJlYW0KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgaGFuZGxlIHRvIGFuIGlucHV0IHN0cmVhbS4KKyAgICoKKyAgICogQGFsc286CisgICAqICAgU2VlIEBGVF9TdHJlYW1SZWMgZm9yIHRoZSBwdWJsaWNseSBhY2Nlc3NpYmxlIGZpZWxkcyBvZiBhIGdpdmVuCisgICAqICAgc3RyZWFtIG9iamVjdC4KKyAgICoKKyAgICovCisgIHR5cGVkZWYgc3RydWN0IEZUX1N0cmVhbVJlY18qICBGVF9TdHJlYW07CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIEZUX1N0cmVhbURlc2MKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgdW5pb24gdHlwZSB1c2VkIHRvIHN0b3JlIGVpdGhlciBhIGxvbmcgb3IgYSBwb2ludGVyLiAgVGhpcyBpcyB1c2VkCisgICAqICAgdG8gc3RvcmUgYSBmaWxlIGRlc2NyaXB0b3Igb3IgYSBgRklMRSonIGluIGFuIGlucHV0IHN0cmVhbS4KKyAgICoKKyAgICovCisgIHR5cGVkZWYgdW5pb24gIEZUX1N0cmVhbURlc2NfCisgIHsKKyAgICBsb25nICAgdmFsdWU7CisgICAgdm9pZCogIHBvaW50ZXI7CisKKyAgfSBGVF9TdHJlYW1EZXNjOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIEZUX1N0cmVhbV9Jb0Z1bmMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgZnVuY3Rpb24gdXNlZCB0byBzZWVrIGFuZCByZWFkIGRhdGEgZnJvbSBhIGdpdmVuIGlucHV0IHN0cmVhbS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIHN0cmVhbSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBzdHJlYW0uCisgICAqCisgICAqICAgb2Zmc2V0IDo6CisgICAqICAgICBUaGUgb2Zmc2V0IG9mIHJlYWQgaW4gc3RyZWFtIChhbHdheXMgZnJvbSBzdGFydCkuCisgICAqCisgICAqICAgYnVmZmVyIDo6CisgICAqICAgICBUaGUgYWRkcmVzcyBvZiB0aGUgcmVhZCBidWZmZXIuCisgICAqCisgICAqICAgY291bnQgOjoKKyAgICogICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIHRoZSBzdHJlYW0uCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgVGhlIG51bWJlciBvZiBieXRlcyBlZmZlY3RpdmVseSByZWFkIGJ5IHRoZSBzdHJlYW0uCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoaXMgZnVuY3Rpb24gbWlnaHQgYmUgY2FsbGVkIHRvIHBlcmZvcm0gYSBzZWVrIG9yIHNraXAgb3BlcmF0aW9uCisgICAqICAgd2l0aCBhIGBjb3VudCcgb2Z+MC4gIEEgbm9uLXplcm8gcmV0dXJuIHZhbHVlIHRoZW4gaW5kaWNhdGVzIGFuCisgICAqICAgZXJyb3IuCisgICAqCisgICAqLworICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcKKyAgKCpGVF9TdHJlYW1fSW9GdW5jKSggRlRfU3RyZWFtICAgICAgIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgIGNvdW50ICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3R5cGU6CisgICAqICAgRlRfU3RyZWFtX0Nsb3NlRnVuYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBmdW5jdGlvbiB1c2VkIHRvIGNsb3NlIGEgZ2l2ZW4gaW5wdXQgc3RyZWFtLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICBzdHJlYW0gOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgc3RyZWFtLgorICAgKgorICAgKi8KKyAgdHlwZWRlZiB2b2lkCisgICgqRlRfU3RyZWFtX0Nsb3NlRnVuYykoIEZUX1N0cmVhbSAgc3RyZWFtICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIEZUX1N0cmVhbVJlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSBhbiBpbnB1dCBzdHJlYW0uCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBiYXNlIDo6CisgICAqICAgICBGb3IgbWVtb3J5LWJhc2VkIHN0cmVhbXMsIHRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHN0cmVhbQorICAgKiAgICAgYnl0ZSBpbiBtZW1vcnkuICBUaGlzIGZpZWxkIHNob3VsZCBhbHdheXMgYmUgc2V0IHRvIE5VTEwgZm9yCisgICAqICAgICBkaXNrLWJhc2VkIHN0cmVhbXMuCisgICAqCisgICAqICAgc2l6ZSA6OgorICAgKiAgICAgVGhlIHN0cmVhbSBzaXplIGluIGJ5dGVzLgorICAgKgorICAgKiAgICAgSW4gY2FzZSBvZiBjb21wcmVzc2VkIHN0cmVhbXMgd2hlcmUgdGhlIHNpemUgaXMgdW5rbm93biBiZWZvcmUKKyAgICogICAgIGFjdHVhbGx5IGRvaW5nIHRoZSBkZWNvbXByZXNzaW9uLCB0aGUgdmFsdWUgaXMgc2V0IHRvIDB4N0ZGRkZGRkYuIAorICAgKiAgICAgKE5vdGUgdGhhdCB0aGlzIHNpemUgdmFsdWUgY2FuIG9jY3VyIGZvciBub3JtYWwgc3RyZWFtcyBhbHNvOyBpdCBpcworICAgKiAgICAgdGh1cyBqdXN0IGEgaGludC4pCisgICAqCisgICAqICAgcG9zIDo6CisgICAqICAgICBUaGUgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhlIHN0cmVhbS4KKyAgICoKKyAgICogICBkZXNjcmlwdG9yIDo6CisgICAqICAgICBUaGlzIGZpZWxkIGlzIGEgdW5pb24gdGhhdCBjYW4gaG9sZCBhbiBpbnRlZ2VyIG9yIGEgcG9pbnRlci4gIEl0IGlzCisgICAqICAgICB1c2VkIGJ5IHN0cmVhbSBpbXBsZW1lbnRhdGlvbnMgdG8gc3RvcmUgZmlsZSBkZXNjcmlwdG9ycyBvciBgRklMRSonCisgICAqICAgICBwb2ludGVycy4KKyAgICoKKyAgICogICBwYXRobmFtZSA6OgorICAgKiAgICAgVGhpcyBmaWVsZCBpcyBjb21wbGV0ZWx5IGlnbm9yZWQgYnkgRnJlZVR5cGUuICBIb3dldmVyLCBpdCBpcyBvZnRlbgorICAgKiAgICAgdXNlZnVsIGR1cmluZyBkZWJ1Z2dpbmcgdG8gdXNlIGl0IHRvIHN0b3JlIHRoZSBzdHJlYW0ncyBmaWxlbmFtZQorICAgKiAgICAgKHdoZXJlIGF2YWlsYWJsZSkuCisgICAqCisgICAqICAgcmVhZCA6OgorICAgKiAgICAgVGhlIHN0cmVhbSdzIGlucHV0IGZ1bmN0aW9uLgorICAgKgorICAgKiAgIGNsb3NlIDo6CisgICAqICAgICBUaGUgc3RyZWFtJ3MgY2xvc2UgZnVuY3Rpb24uCisgICAqCisgICAqICAgbWVtb3J5IDo6CisgICAqICAgICBUaGUgbWVtb3J5IG1hbmFnZXIgdG8gdXNlIHRvIHByZWxvYWQgZnJhbWVzLiAgVGhpcyBpcyBzZXQKKyAgICogICAgIGludGVybmFsbHkgYnkgRnJlZVR5cGUgYW5kIHNob3VsZG4ndCBiZSB0b3VjaGVkIGJ5IHN0cmVhbQorICAgKiAgICAgaW1wbGVtZW50YXRpb25zLgorICAgKgorICAgKiAgIGN1cnNvciA6OgorICAgKiAgICAgVGhpcyBmaWVsZCBpcyBzZXQgYW5kIHVzZWQgaW50ZXJuYWxseSBieSBGcmVlVHlwZSB3aGVuIHBhcnNpbmcKKyAgICogICAgIGZyYW1lcy4KKyAgICoKKyAgICogICBsaW1pdCA6OgorICAgKiAgICAgVGhpcyBmaWVsZCBpcyBzZXQgYW5kIHVzZWQgaW50ZXJuYWxseSBieSBGcmVlVHlwZSB3aGVuIHBhcnNpbmcKKyAgICogICAgIGZyYW1lcy4KKyAgICoKKyAgICovCisgIHR5cGVkZWYgc3RydWN0ICBGVF9TdHJlYW1SZWNfCisgIHsKKyAgICB1bnNpZ25lZCBjaGFyKiAgICAgICBiYXNlOworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgIHNpemU7CisgICAgdW5zaWduZWQgbG9uZyAgICAgICAgcG9zOworCisgICAgRlRfU3RyZWFtRGVzYyAgICAgICAgZGVzY3JpcHRvcjsKKyAgICBGVF9TdHJlYW1EZXNjICAgICAgICBwYXRobmFtZTsKKyAgICBGVF9TdHJlYW1fSW9GdW5jICAgICByZWFkOworICAgIEZUX1N0cmVhbV9DbG9zZUZ1bmMgIGNsb3NlOworCisgICAgRlRfTWVtb3J5ICAgICAgICAgICAgbWVtb3J5OworICAgIHVuc2lnbmVkIGNoYXIqICAgICAgIGN1cnNvcjsKKyAgICB1bnNpZ25lZCBjaGFyKiAgICAgICBsaW1pdDsKKworICB9IEZUX1N0cmVhbVJlYzsKKworICAvKiAqLworCisKK0ZUX0VORF9IRUFERVIKKworI2VuZGlmIC8qIF9fRlRTWVNURU1fSF9fICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0dHJpZ29uLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0dHJpZ29uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg1ZWM1MQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnR0cmlnb24uaApAQCAtMCwwICsxLDM1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnR0cmlnb24uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWVUeXBlIHRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAxLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fRlRUUklHT05fSF9fCisjZGVmaW5lIF9fRlRUUklHT05fSF9fCisKKyNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKworI2lmZGVmIEZSRUVUWVBFX0gKKyNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCisjZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKKyNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgorI2VuZGlmCisKKworRlRfQkVHSU5fSEVBREVSCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIGNvbXB1dGF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHR5cGU6CisgICAqICAgRlRfQW5nbGUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgdHlwZSBpcyB1c2VkIHRvIG1vZGVsIGFuZ2xlIHZhbHVlcyBpbiBGcmVlVHlwZS4gIE5vdGUgdGhhdCB0aGUKKyAgICogICBhbmdsZSBpcyBhIDE2LjE2IGZpeGVkLXBvaW50IHZhbHVlIGV4cHJlc3NlZCBpbiBkZWdyZWVzLgorICAgKgorICAgKi8KKyAgdHlwZWRlZiBGVF9GaXhlZCAgRlRfQW5nbGU7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfQU5HTEVfUEkKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoZSBhbmdsZSBwaSBleHByZXNzZWQgaW4gQEZUX0FuZ2xlIHVuaXRzLgorICAgKgorICAgKi8KKyNkZWZpbmUgRlRfQU5HTEVfUEkgICggMTgwTCA8PCAxNiApCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfQU5HTEVfMlBJCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGUgYW5nbGUgMipwaSBleHByZXNzZWQgaW4gQEZUX0FuZ2xlIHVuaXRzLgorICAgKgorICAgKi8KKyNkZWZpbmUgRlRfQU5HTEVfMlBJICAoIEZUX0FOR0xFX1BJICogMiApCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfQU5HTEVfUEkyCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGUgYW5nbGUgcGkvMiBleHByZXNzZWQgaW4gQEZUX0FuZ2xlIHVuaXRzLgorICAgKgorICAgKi8KKyNkZWZpbmUgRlRfQU5HTEVfUEkyICAoIEZUX0FOR0xFX1BJIC8gMiApCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfQU5HTEVfUEk0CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGUgYW5nbGUgcGkvNCBleHByZXNzZWQgaW4gQEZUX0FuZ2xlIHVuaXRzLgorICAgKgorICAgKi8KKyNkZWZpbmUgRlRfQU5HTEVfUEk0ICAoIEZUX0FOR0xFX1BJIC8gNCApCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfU2luCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZXR1cm4gdGhlIHNpbnVzIG9mIGEgZ2l2ZW4gYW5nbGUgaW4gZml4ZWQtcG9pbnQgZm9ybWF0LgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgYW5nbGUgOjoKKyAgICogICAgIFRoZSBpbnB1dCBhbmdsZS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBUaGUgc2ludXMgdmFsdWUuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIElmIHlvdSBuZWVkIGJvdGggdGhlIHNpbnVzIGFuZCBjb3NpbnVzIGZvciBhIGdpdmVuIGFuZ2xlLCB1c2UgdGhlCisgICAqICAgZnVuY3Rpb24gQEZUX1ZlY3Rvcl9Vbml0LgorICAgKgorICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9GaXhlZCApCisgIEZUX1NpbiggRlRfQW5nbGUgIGFuZ2xlICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfQ29zCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZXR1cm4gdGhlIGNvc2ludXMgb2YgYSBnaXZlbiBhbmdsZSBpbiBmaXhlZC1wb2ludCBmb3JtYXQuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBhbmdsZSA6OgorICAgKiAgICAgVGhlIGlucHV0IGFuZ2xlLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIFRoZSBjb3NpbnVzIHZhbHVlLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBJZiB5b3UgbmVlZCBib3RoIHRoZSBzaW51cyBhbmQgY29zaW51cyBmb3IgYSBnaXZlbiBhbmdsZSwgdXNlIHRoZQorICAgKiAgIGZ1bmN0aW9uIEBGVF9WZWN0b3JfVW5pdC4KKyAgICoKKyAgICovCisgIEZUX0VYUE9SVCggRlRfRml4ZWQgKQorICBGVF9Db3MoIEZUX0FuZ2xlICBhbmdsZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX1RhbgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgUmV0dXJuIHRoZSB0YW5nZW50IG9mIGEgZ2l2ZW4gYW5nbGUgaW4gZml4ZWQtcG9pbnQgZm9ybWF0LgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgYW5nbGUgOjoKKyAgICogICAgIFRoZSBpbnB1dCBhbmdsZS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBUaGUgdGFuZ2VudCB2YWx1ZS4KKyAgICoKKyAgICovCisgIEZUX0VYUE9SVCggRlRfRml4ZWQgKQorICBGVF9UYW4oIEZUX0FuZ2xlICBhbmdsZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0F0YW4yCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZXR1cm4gdGhlIGFyYy10YW5nZW50IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiB2ZWN0b3IgKHgseSkgaW4KKyAgICogICB0aGUgMmQgcGxhbmUuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICB4IDo6CisgICAqICAgICBUaGUgaG9yaXpvbnRhbCB2ZWN0b3IgY29vcmRpbmF0ZS4KKyAgICoKKyAgICogICB5IDo6CisgICAqICAgICBUaGUgdmVydGljYWwgdmVjdG9yIGNvb3JkaW5hdGUuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgVGhlIGFyYy10YW5nZW50IHZhbHVlIChpLmUuIGFuZ2xlKS4KKyAgICoKKyAgICovCisgIEZUX0VYUE9SVCggRlRfQW5nbGUgKQorICBGVF9BdGFuMiggRlRfRml4ZWQgIHgsCisgICAgICAgICAgICBGVF9GaXhlZCAgeSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0FuZ2xlX0RpZmYKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFJldHVybiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBhbmdsZXMuICBUaGUgcmVzdWx0IGlzIGFsd2F5cworICAgKiAgIGNvbnN0cmFpbmVkIHRvIHRoZSBdLVBJLi5QSV0gaW50ZXJ2YWwuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBhbmdsZTEgOjoKKyAgICogICAgIEZpcnN0IGFuZ2xlLgorICAgKgorICAgKiAgIGFuZ2xlMiA6OgorICAgKiAgICAgU2Vjb25kIGFuZ2xlLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIENvbnN0cmFpbmVkIHZhbHVlIG9mIGB2YWx1ZTItdmFsdWUxJy4KKyAgICoKKyAgICovCisgIEZUX0VYUE9SVCggRlRfQW5nbGUgKQorICBGVF9BbmdsZV9EaWZmKCBGVF9BbmdsZSAgYW5nbGUxLAorICAgICAgICAgICAgICAgICBGVF9BbmdsZSAgYW5nbGUyICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfVmVjdG9yX1VuaXQKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFJldHVybiB0aGUgdW5pdCB2ZWN0b3IgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIGFuZ2xlLiAgQWZ0ZXIgdGhlCisgICAqICAgY2FsbCwgdGhlIHZhbHVlIG9mIGB2ZWMueCcgd2lsbCBiZSBgY29zKGFuZ2xlKScsIGFuZCB0aGUgdmFsdWUgb2YKKyAgICogICBgdmVjLnknIHdpbGwgYmUgYHNpbihhbmdsZSknLgorICAgKgorICAgKiAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIHRvIHJldHJpZXZlIGJvdGggdGhlIHNpbnVzIGFuZCBjb3NpbnVzIG9mIGEKKyAgICogICBnaXZlbiBhbmdsZSBxdWlja2x5LgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIHZlYyA6OgorICAgKiAgICAgVGhlIGFkZHJlc3Mgb2YgdGFyZ2V0IHZlY3Rvci4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGFuZ2xlIDo6CisgICAqICAgICBUaGUgaW5wdXQgYW5nbGUuCisgICAqCisgICAqLworICBGVF9FWFBPUlQoIHZvaWQgKQorICBGVF9WZWN0b3JfVW5pdCggRlRfVmVjdG9yKiAgdmVjLAorICAgICAgICAgICAgICAgICAgRlRfQW5nbGUgICAgYW5nbGUgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9WZWN0b3JfUm90YXRlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSb3RhdGUgYSB2ZWN0b3IgYnkgYSBnaXZlbiBhbmdsZS4KKyAgICoKKyAgICogQGlub3V0OgorICAgKiAgIHZlYyA6OgorICAgKiAgICAgVGhlIGFkZHJlc3Mgb2YgdGFyZ2V0IHZlY3Rvci4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGFuZ2xlIDo6CisgICAqICAgICBUaGUgaW5wdXQgYW5nbGUuCisgICAqCisgICAqLworICBGVF9FWFBPUlQoIHZvaWQgKQorICBGVF9WZWN0b3JfUm90YXRlKCBGVF9WZWN0b3IqICB2ZWMsCisgICAgICAgICAgICAgICAgICAgIEZUX0FuZ2xlICAgIGFuZ2xlICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfVmVjdG9yX0xlbmd0aAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgUmV0dXJuIHRoZSBsZW5ndGggb2YgYSBnaXZlbiB2ZWN0b3IuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICB2ZWMgOjoKKyAgICogICAgIFRoZSBhZGRyZXNzIG9mIHRhcmdldCB2ZWN0b3IuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgVGhlIHZlY3RvciBsZW5ndGgsIGV4cHJlc3NlZCBpbiB0aGUgc2FtZSB1bml0cyB0aGF0IHRoZSBvcmlnaW5hbAorICAgKiAgIHZlY3RvciBjb29yZGluYXRlcy4KKyAgICoKKyAgICovCisgIEZUX0VYUE9SVCggRlRfRml4ZWQgKQorICBGVF9WZWN0b3JfTGVuZ3RoKCBGVF9WZWN0b3IqICB2ZWMgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9WZWN0b3JfUG9sYXJpemUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIENvbXB1dGUgYm90aCB0aGUgbGVuZ3RoIGFuZCBhbmdsZSBvZiBhIGdpdmVuIHZlY3Rvci4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIHZlYyA6OgorICAgKiAgICAgVGhlIGFkZHJlc3Mgb2Ygc291cmNlIHZlY3Rvci4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBsZW5ndGggOjoKKyAgICogICAgIFRoZSB2ZWN0b3IgbGVuZ3RoLgorICAgKgorICAgKiAgIGFuZ2xlIDo6CisgICAqICAgICBUaGUgdmVjdG9yIGFuZ2xlLgorICAgKgorICAgKi8KKyAgRlRfRVhQT1JUKCB2b2lkICkKKyAgRlRfVmVjdG9yX1BvbGFyaXplKCBGVF9WZWN0b3IqICB2ZWMsCisgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAqbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgIEZUX0FuZ2xlICAgKmFuZ2xlICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIENvbXB1dGUgdmVjdG9yIGNvb3JkaW5hdGVzIGZyb20gYSBsZW5ndGggYW5kIGFuZ2xlLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIHZlYyA6OgorICAgKiAgICAgVGhlIGFkZHJlc3Mgb2Ygc291cmNlIHZlY3Rvci4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGxlbmd0aCA6OgorICAgKiAgICAgVGhlIHZlY3RvciBsZW5ndGguCisgICAqCisgICAqICAgYW5nbGUgOjoKKyAgICogICAgIFRoZSB2ZWN0b3IgYW5nbGUuCisgICAqCisgICAqLworICBGVF9FWFBPUlQoIHZvaWQgKQorICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggRlRfVmVjdG9yKiAgdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgRlRfQW5nbGUgICAgYW5nbGUgKTsKKworICAvKiAqLworCisKK0ZUX0VORF9IRUFERVIKKworI2VuZGlmIC8qIF9fRlRUUklHT05fSF9fICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0dHRkcnYuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnR0dGRydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMDA4MWEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0dHRkcnYuaApAQCAtMCwwICsxLDMxMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnR0dGRydi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWVUeXBlIEFQSSBmb3IgY29udHJvbGxpbmcgdGhlIFRydWVUeXBlIGRyaXZlciAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAxMy0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0ZUVFREUlZfSF9fCisjZGVmaW5lIF9fRlRUVERSVl9IX18KKworI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CisjaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisKKyNpZmRlZiBGUkVFVFlQRV9ICisjZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgorI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCisjZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKKyNlbmRpZgorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzZWN0aW9uOgorICAgKiAgIHR0X2RyaXZlcgorICAgKgorICAgKiBAdGl0bGU6CisgICAqICAgVGhlIFRydWVUeXBlIGRyaXZlcgorICAgKgorICAgKiBAYWJzdHJhY3Q6CisgICAqICAgQ29udHJvbGxpbmcgdGhlIFRydWVUeXBlIGRyaXZlciBtb2R1bGUuCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBXaGlsZSBGcmVlVHlwZSdzIFRydWVUeXBlIGRyaXZlciBkb2Vzbid0IGV4cG9zZSBBUEkgZnVuY3Rpb25zIGJ5CisgICAqICAgaXRzZWxmLCBpdCBpcyBwb3NzaWJsZSB0byBjb250cm9sIGl0cyBiZWhhdmlvdXIgd2l0aCBARlRfUHJvcGVydHlfU2V0CisgICAqICAgYW5kIEBGVF9Qcm9wZXJ0eV9HZXQuICBUaGUgZm9sbG93aW5nIGxpc3RzIHRoZSBhdmFpbGFibGUgcHJvcGVydGllcworICAgKiAgIHRvZ2V0aGVyIHdpdGggdGhlIG5lY2Vzc2FyeSBtYWNyb3MgYW5kIHN0cnVjdHVyZXMuCisgICAqCisgICAqICAgVGhlIFRydWVUeXBlIGRyaXZlcidzIG1vZHVsZSBuYW1lIGlzIGB0cnVldHlwZScuCisgICAqCisgICAqICAgV2Ugc3RhcnQgd2l0aCBhIGxpc3Qgb2YgZGVmaW5pdGlvbnMsIGtpbmRseSBwcm92aWRlZCBieSBHcmVnCisgICAqICAgSGl0Y2hjb2NrLgorICAgKgorICAgKiAgIF9CaS1MZXZlbF8gX1JlbmRlcmluZ18KKyAgICoKKyAgICogICBNb25vY2hyb21hdGljIHJlbmRlcmluZywgZXhjbHVzaXZlbHkgdXNlZCBpbiB0aGUgZWFybHkgZGF5cyBvZgorICAgKiAgIFRydWVUeXBlIGJ5IGJvdGggQXBwbGUgYW5kIE1pY3Jvc29mdC4gIE1pY3Jvc29mdCdzIEdESSBpbnRlcmZhY2UKKyAgICogICBzdXBwb3J0ZWQgaGludGluZyBvZiB0aGUgcmlnaHQtc2lkZSBiZWFyaW5nIHBvaW50LCBzdWNoIHRoYXQgdGhlCisgICAqICAgYWR2YW5jZSB3aWR0aCBjb3VsZCBiZSBub24tbGluZWFyLiAgTW9zdCBvZnRlbiB0aGlzIHdhcyBkb25lIHRvCisgICAqICAgYWNoaWV2ZSBzb21lIGxldmVsIG9mIGdseXBoIHN5bW1ldHJ5LiAgVG8gZW5hYmxlIHJlYXNvbmFibGUKKyAgICogICBwZXJmb3JtYW5jZSAoZS5nLiwgbm90IGhhdmluZyB0byBydW4gaGludGluZyBvbiBhbGwgZ2x5cGhzIGp1c3QgdG8KKyAgICogICBnZXQgdGhlIHdpZHRocykgdGhlcmUgd2FzIGEgYml0IGluIHRoZSBoZWFkIHRhYmxlIGluZGljYXRpbmcgaWYgdGhlCisgICAqICAgc2lkZSBiZWFyaW5nIHdhcyBoaW50ZWQsIGFuZCBhZGRpdGlvbmFsIHRhYmxlcywgYGhkbXgnIGFuZCBgTFRTSCcsIHRvCisgICAqICAgY2FjaGUgaGludGluZyB3aWR0aHMgYWNyb3NzIG11bHRpcGxlIHNpemVzIGFuZCBkZXZpY2UgYXNwZWN0IHJhdGlvcy4KKyAgICoKKyAgICogICBfRm9udF8gX1Ntb290aGluZ18KKyAgICoKKyAgICogICBNaWNyb3NvZnQncyBHREkgaW1wbGVtZW50YXRpb24gb2YgYW50aS1hbGlhc2luZy4gIE5vdCB0cmFkaXRpb25hbAorICAgKiAgIGFudGktYWxpYXNpbmcgYXMgdGhlIG91dGxpbmVzIHdlcmUgaGludGVkIGJlZm9yZSB0aGUgc2FtcGxpbmcuICBUaGUKKyAgICogICB3aWR0aHMgbWF0Y2hlZCB0aGUgYmktbGV2ZWwgcmVuZGVyaW5nLgorICAgKgorICAgKiAgIF9DbGVhclR5cGVfIF9SZW5kZXJpbmdfCisgICAqCisgICAqICAgVGVjaG5pcXVlIHRoYXQgdXNlcyBwaHlzaWNhbCBzdWJwaXhlbHMgdG8gaW1wcm92ZSByZW5kZXJpbmcgb24gTENECisgICAqICAgKGFuZCBvdGhlcikgZGlzcGxheXMuICBCZWNhdXNlIG9mIHRoZSBoaWdoZXIgcmVzb2x1dGlvbiwgbWFueSBtZXRob2RzCisgICAqICAgb2YgaW1wcm92aW5nIHN5bW1ldHJ5IGluIGdseXBocyB0aHJvdWdoIGhpbnRpbmcgdGhlIHJpZ2h0LXNpZGUKKyAgICogICBiZWFyaW5nIHdlcmUgbm8gbG9uZ2VyIG5lY2Vzc2FyeS4gIFRoaXMgbGVhZCB0byB3aGF0IEdESSBjYWxscworICAgKiAgIGBuYXR1cmFsIHdpZHRocycgQ2xlYXJUeXBlLCBzZWUKKyAgICogICBodHRwOi8vd3d3LmJlYXRzdGFtbS5jb20vdHlwb2dyYXBoeS9SVFJDaDQuaHRtI1NlYzIxLiAgU2luY2UgaGludGluZworICAgKiAgIGhhcyBleHRyYSByZXNvbHV0aW9uLCBtb3N0IG5vbi1saW5lYXJpdHkgd2VudCBhd2F5LCBidXQgaXQgaXMgc3RpbGwKKyAgICogICBwb3NzaWJsZSBmb3IgaGludHMgdG8gY2hhbmdlIHRoZSBhZHZhbmNlIHdpZHRocyBpbiB0aGlzIG1vZGUuCisgICAqCisgICAqICAgX0NsZWFyVHlwZV8gX0NvbXBhdGlibGVfIF9XaWR0aHNfCisgICAqCisgICAqICAgT25lIG9mIHRoZSBlYXJsaWVzdCBjaGFsbGVuZ2VzIHdpdGggQ2xlYXJUeXBlIHdhcyBhbGxvd2luZyB0aGUKKyAgICogICBpbXBsZW1lbnRhdGlvbiBpbiBHREkgdG8gYmUgc2VsZWN0ZWQgd2l0aG91dCByZXF1aXJpbmcgYWxsIFVJIGFuZAorICAgKiAgIGRvY3VtZW50cyB0byByZWZsb3cuICBUbyBhZGRyZXNzIHRoaXMsIGEgY29tcGF0aWJsZSBtZXRob2Qgb2YKKyAgICogICByZW5kZXJpbmcgQ2xlYXJUeXBlIHdhcyBhZGRlZCB3aGVyZSB0aGUgZm9udCBoaW50cyBhcmUgZXhlY3V0ZWQgb25jZQorICAgKiAgIHRvIGRldGVybWluZSB0aGUgd2lkdGggaW4gYmktbGV2ZWwgcmVuZGVyaW5nLCBhbmQgdGhlbiByZS1ydW4gaW4KKyAgICogICBDbGVhclR5cGUsIHdpdGggdGhlIGRpZmZlcmVuY2UgaW4gd2lkdGhzIGJlaW5nIGFic29yYmVkIGluIHRoZSBmb250CisgICAqICAgaGludHMgZm9yIENsZWFyVHlwZSAobW9zdGx5IGluIHRoZSB3aGl0ZSBzcGFjZSBvZiBoaW50cyk7IHNlZQorICAgKiAgIGh0dHA6Ly93d3cuYmVhdHN0YW1tLmNvbS90eXBvZ3JhcGh5L1JUUkNoNC5odG0jU2VjMjAuICBTb21ld2hhdCBieQorICAgKiAgIGRlZmluaXRpb24sIGNvbXBhdGlibGUgd2lkdGggQ2xlYXJUeXBlIGFsbG93cyBmb3Igbm9uLWxpbmVhciB3aWR0aHMsCisgICAqICAgYnV0IG9ubHkgd2hlbiB0aGUgYmktbGV2ZWwgdmVyc2lvbiBoYXMgbm9uLWxpbmVhciB3aWR0aHMuCisgICAqCisgICAqICAgX0NsZWFyVHlwZV8gX1N1YnBpeGVsXyBfUG9zaXRpb25pbmdfCisgICAqCisgICAqICAgT25lIG9mIHRoZSBuaWNlIGJlbmVmaXRzIG9mIENsZWFyVHlwZSBpcyB0aGUgYWJpbGl0eSB0byBtb3JlIGNyaXNwbHkKKyAgICogICBkaXNwbGF5IGZyYWN0aW9uYWwgd2lkdGhzOyB1bmZvcnR1bmF0ZWx5LCB0aGUgR0RJIG1vZGVsIG9mIGludGVnZXIKKyAgICogICBiaXRtYXBzIGRpZCBub3Qgc3VwcG9ydCB0aGlzLiAgSG93ZXZlciwgdGhlIFdQRiBhbmQgRGlyZWN0IFdyaXRlCisgICAqICAgZnJhbWV3b3JrcyBkbyBzdXBwb3J0IGZyYWN0aW9uYWwgd2lkdGhzLiAgRFdyaXRlIGNhbGxzIHRoaXMgYG5hdHVyYWwKKyAgICogICBtb2RlJywgbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggR0RJJ3MgYG5hdHVyYWwgd2lkdGhzJy4gIFN1YnBpeGVsCisgICAqICAgcG9zaXRpb25pbmcsIGluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIERpcmVjdCBXcml0ZSwKKyAgICogICB1bmZvcnR1bmF0ZWx5IGRvZXMgbm90IHN1cHBvcnQgaGludGVkIGFkdmFuY2Ugd2lkdGhzLCBzZWUKKyAgICogICBodHRwOi8vd3d3LmJlYXRzdGFtbS5jb20vdHlwb2dyYXBoeS9SVFJDaDQuaHRtI1NlYzIyLiAgTm90ZSB0aGF0IHRoZQorICAgKiAgIFRydWVUeXBlIGludGVycHJldGVyIGZ1bGx5IGFsbG93cyB0aGUgYWR2YW5jZSB3aWR0aCB0byBiZSBhZGp1c3RlZCBpbgorICAgKiAgIHRoaXMgbW9kZSwganVzdCB0aGUgRFdyaXRlIGNsaWVudCB3aWxsIGlnbm9yZSB0aG9zZSBjaGFuZ2VzLgorICAgKgorICAgKiAgIF9DbGVhclR5cGVfIF9CYWNrd2FyZHNfIF9Db21wYXRpYmlsaXR5XworICAgKgorICAgKiAgIFRoaXMgaXMgYSBzZXQgb2YgZXhjZXB0aW9ucyBtYWRlIGluIHRoZSBUcnVlVHlwZSBpbnRlcnByZXRlciB0bworICAgKiAgIG1pbmltaXplIGhpbnRpbmcgdGVjaG5pcXVlcyB0aGF0IHdlcmUgcHJvYmxlbWF0aWMgd2l0aCB0aGUgZXh0cmEKKyAgICogICByZXNvbHV0aW9uIG9mIENsZWFyVHlwZTsgc2VlCisgICAqICAgaHR0cDovL3d3dy5iZWF0c3RhbW0uY29tL3R5cG9ncmFwaHkvUlRSQ2g0Lmh0bSNTZWMxIGFuZAorICAgKiAgIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L2NsZWFydHlwZS90cnVldHlwZWNsZWFydHlwZS5hc3B4LgorICAgKiAgIFRoaXMgdGVjaG5pcXVlIGlzIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIENsZWFyVHlwZSBjb21wYXRpYmxlCisgICAqICAgd2lkdGhzLiAgQ2xlYXJUeXBlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGhhcyBubyBkaXJlY3QgaW1wYWN0IG9uCisgICAqICAgY2hhbmdpbmcgYWR2YW5jZSB3aWR0aHMsIGJ1dCB0aGVyZSBtaWdodCBiZSBhbiBpbmRpcmVjdCBpbXBhY3Qgb24KKyAgICogICBkaXNhYmxpbmcgc29tZSBkZWx0YXMuICBUaGlzIGNvdWxkIGJlIHdvcmtlZCBhcm91bmQgaW4gYmFja3dhcmRzCisgICAqICAgY29tcGF0aWJpbGl0eSBtb2RlLgorICAgKgorICAgKiAgIF9OYXRpdmVfIF9DbGVhclR5cGVfIF9Nb2RlXworICAgKgorICAgKiAgIChOb3QgdG8gYmUgY29uZnVzZWQgd2l0aCBgbmF0dXJhbCB3aWR0aHMnLikgIFRoaXMgbW9kZSByZW1vdmVzIGFsbAorICAgKiAgIHRoZSBleGNlcHRpb25zIGluIHRoZSBUcnVlVHlwZSBpbnRlcnByZXRlciB3aGVuIHJ1bm5pbmcgd2l0aAorICAgKiAgIENsZWFyVHlwZS4gIEFueSBpc3N1ZXMgb24gd2lkdGhzIHdvdWxkIHN0aWxsIGFwcGx5LCB0aG91Z2guCisgICAqCisgICAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBwcm9wZXJ0eToKKyAgICogICBpbnRlcnByZXRlci12ZXJzaW9uCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBDdXJyZW50bHksIHR3byB2ZXJzaW9ucyBhcmUgYXZhaWxhYmxlLCByZXByZXNlbnRpbmcgdGhlIGJ5dGVjb2RlCisgICAqICAgaW50ZXJwcmV0ZXIgd2l0aCBhbmQgd2l0aG91dCBzdWJwaXhlbCBoaW50aW5nIHN1cHBvcnQsCisgICAqICAgcmVzcGVjdGl2ZWx5LiAgVGhlIGRlZmF1bHQgaXMgc3VicGl4ZWwgc3VwcG9ydCBpZgorICAgKiAgIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyBpcyBkZWZpbmVkLCBhbmQgbm8gc3VicGl4ZWwKKyAgICogICBzdXBwb3J0IG90aGVyd2lzZSAoc2luY2UgaXQgaXNuJ3QgYXZhaWxhYmxlIHRoZW4pLgorICAgKgorICAgKiAgIElmIHN1YnBpeGVsIGhpbnRpbmcgaXMgb24sIG1hbnkgVHJ1ZVR5cGUgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zIGJlaGF2ZQorICAgKiAgIGRpZmZlcmVudGx5IGNvbXBhcmVkIHRvIEIvVyBvciBncmF5c2NhbGUgcmVuZGVyaW5nIChleGNlcHQgaWYgYG5hdGl2ZQorICAgKiAgIENsZWFyVHlwZScgaXMgc2VsZWN0ZWQgYnkgdGhlIGZvbnQpLiAgVGhlIG1haW4gaWRlYSBpcyB0byByZW5kZXIgYXQgYQorICAgKiAgIG11Y2ggaW5jcmVhc2VkIGhvcml6b250YWwgcmVzb2x1dGlvbiwgdGhlbiBzYW1wbGluZyBkb3duIHRoZSBjcmVhdGVkCisgICAqICAgb3V0cHV0IHRvIHN1YnBpeGVsIHByZWNpc2lvbi4gIEhvd2V2ZXIsIG1hbnkgb2xkZXIgZm9udHMgYXJlIG5vdAorICAgKiAgIHN1aXRlZCB0byB0aGlzIGFuZCBtdXN0IGJlIHNwZWNpYWxseSB0YWtlbiBjYXJlIG9mIGJ5IGFwcGx5aW5nCisgICAqICAgKGhhcmRjb2RlZCkgZm9udC1zcGVjaWZpYyB0d2Vha3MuCisgICAqCisgICAqICAgRGV0YWlscyBvbiBzdWJwaXhlbCBoaW50aW5nIGFuZCBzb21lIG9mIHRoZSBuZWNlc3NhcnkgdHdlYWtzIGNhbiBiZQorICAgKiAgIGZvdW5kIGluIEdyZWcgSGl0Y2hjb2NrJ3Mgd2hpdGVwYXBlciBhdAorICAgKiAgIGBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS9jbGVhcnR5cGUvdHJ1ZXR5cGVjbGVhcnR5cGUuYXNweCcuCisgICAqCisgICAqICAgVGhlIGZvbGxvd2luZyBleGFtcGxlIGNvZGUgZGVtb25zdHJhdGVzIGhvdyB0byBhY3RpdmF0ZSBzdWJwaXhlbAorICAgKiAgIGhpbnRpbmcgKG9taXR0aW5nIHRoZSBlcnJvciBoYW5kbGluZykuCisgICAqCisgICAqICAgeworICAgKiAgICAgRlRfTGlicmFyeSAgbGlicmFyeTsKKyAgICogICAgIEZUX0ZhY2UgICAgIGZhY2U7CisgICAqICAgICBGVF9VSW50ICAgICBpbnRlcnByZXRlcl92ZXJzaW9uID0gVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zODsKKyAgICoKKyAgICoKKyAgICogICAgIEZUX0luaXRfRnJlZVR5cGUoICZsaWJyYXJ5ICk7CisgICAqCisgICAqICAgICBGVF9Qcm9wZXJ0eV9TZXQoIGxpYnJhcnksICJ0cnVldHlwZSIsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcnByZXRlci12ZXJzaW9uIiwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVycHJldGVyX3ZlcnNpb24gKTsKKyAgICogICB9CisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgd2l0aCBARlRfUHJvcGVydHlfR2V0IGFsc28uCisgICAqCisgICAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBlbnVtOgorICAgKiAgIFRUX0lOVEVSUFJFVEVSX1ZFUlNJT05fWFhYCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIGxpc3Qgb2YgY29uc3RhbnRzIHVzZWQgZm9yIHRoZSBAaW50ZXJwcmV0ZXItdmVyc2lvbiBwcm9wZXJ0eSB0bworICAgKiAgIHNlbGVjdCB0aGUgaGludGluZyBlbmdpbmUgZm9yIFRydWV0eXBlIGZvbnRzLgorICAgKgorICAgKiAgIFRoZSBudW1lcmljIHZhbHVlIGluIHRoZSBjb25zdGFudCBuYW1lcyByZXByZXNlbnRzIHRoZSB2ZXJzaW9uCisgICAqICAgbnVtYmVyIGFzIHJldHVybmVkIGJ5IHRoZSBgR0VUSU5GTycgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24uCisgICAqCisgICAqIEB2YWx1ZXM6CisgICAqICAgVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zNSA6OgorICAgKiAgICAgVmVyc2lvbn4zNSBjb3JyZXNwb25kcyB0byBNUyByYXN0ZXJpemVyIHYuMS43IGFzIHVzZWQgZS5nLiBpbgorICAgKiAgICAgV2luZG93c345ODsgb25seSBncmF5c2NhbGUgYW5kIEIvVyByYXN0ZXJpemluZyBpcyBzdXBwb3J0ZWQuCisgICAqCisgICAqICAgVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zOCA6OgorICAgKiAgICAgVmVyc2lvbn4zOCBjb3JyZXNwb25kcyB0byBNUyByYXN0ZXJpemVyIHYuMS45OyBpdCBpcyByb3VnaGx5CisgICAqICAgICBlcXVpdmFsZW50IHRvIHRoZSBoaW50aW5nIHByb3ZpZGVkIGJ5IERpcmVjdFdyaXRlIENsZWFyVHlwZSAoYXMKKyAgICogICAgIGNhbiBiZSBmb3VuZCwgZm9yIGV4YW1wbGUsIGluIHRoZSBJbnRlcm5ldCBFeHBsb3Jlcn45IHJ1bm5pbmcgb24KKyAgICogICAgIFdpbmRvd3N+NykuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoaXMgcHJvcGVydHkgY29udHJvbHMgdGhlIGJlaGF2aW91ciBvZiB0aGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIKKyAgICogICBhbmQgdGh1cyBob3cgb3V0bGluZXMgZ2V0IGhpbnRlZC4gIEl0IGRvZXMgKm5vdCogY29udHJvbCBob3cgZ2x5cGgKKyAgICogICBnZXQgcmFzdGVyaXplZCEgIEluIHBhcnRpY3VsYXIsIGl0IGRvZXMgbm90IGNvbnRyb2wgc3VicGl4ZWwgY29sb3IKKyAgICogICBmaWx0ZXJpbmcuCisgICAqCisgICAqICAgSWYgRnJlZVR5cGUgaGFzIG5vdCBiZWVuIGNvbXBpbGVkIHdpdGggY29uZmlndXJhdGlvbiBvcHRpb24KKyAgICogICBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcsIHNlbGVjdGluZyB2ZXJzaW9ufjM4IGNhdXNlcyBhbgorICAgKiAgIGBGVF9FcnJfVW5pbXBsZW1lbnRlZF9GZWF0dXJlJyBlcnJvci4KKyAgICoKKyAgICogICBEZXBlbmRpbmcgb24gdGhlIGdyYXBoaWNzIGZyYW1ld29yaywgTWljcm9zb2Z0IHVzZXMgZGlmZmVyZW50CisgICAqICAgYnl0ZWNvZGUgYW5kIHJlbmRlcmluZyBlbmdpbmVzLiAgQXMgYSBjb25zZXF1ZW5jZSwgdGhlIHZlcnNpb24KKyAgICogICBudW1iZXJzIHJldHVybmVkIGJ5IGEgY2FsbCB0byB0aGUgYEdFVElORk8nIGJ5dGVjb2RlIGluc3RydWN0aW9uIGFyZQorICAgKiAgIG1vcmUgY29udm9sdXRlZCB0aGFuIGRlc2lyZWQuCisgICAqCisgICAqICAgSGVyZSBhcmUgdHdvIHRhYmxlcyB0aGF0IHRyeSB0byBzaGVkIHNvbWUgbGlnaHQgb24gdGhlIHBvc3NpYmxlCisgICAqICAgdmFsdWVzIGZvciB0aGUgTVMgcmFzdGVyaXplciBlbmdpbmUsIHRvZ2V0aGVyIHdpdGggdGhlIGFkZGl0aW9uYWwKKyAgICogICBmZWF0dXJlcyBpbnRyb2R1Y2VkIGJ5IGl0LgorICAgKgorICAgKiAgIHsKKyAgICogICAgIEdFVElORk8gZnJhbWV3b3JrICAgICAgICAgICAgICAgdmVyc2lvbiBmZWF0dXJlCisgICAqICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAqICAgICAgICAgMyAgIEdESSAoV2luIDMuMSksICAgICAgICAgICAgdjEuMCAgMTYtYml0LCBmaXJzdCB2ZXJzaW9uCisgICAqICAgICAgICAgICAgIFRydWVJbWFnZQorICAgKiAgICAgICAgMzMgICBHREkgKFdpbiBOVCAzLjEpLCAgICAgICAgIHYxLjUgIDMyLWJpdAorICAgKiAgICAgICAgICAgICBIUCBMYXNlcmpldAorICAgKiAgICAgICAgMzQgICBHREkgKFdpbiA5NSkgICAgICAgICAgICAgIHYxLjYgIGZvbnQgc21vb3RoaW5nLAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTQ0FOVFlQRSBvcGNvZGUKKyAgICogICAgICAgIDM1ICAgR0RJIChXaW4gOTgvMjAwMCkgICAgICAgICB2MS43ICAoVU4pU0NBTEVEX0NPTVBPTkVOVF9PRkZTRVQKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgaW4gY29tcG9zaXRlIGdseXBocworICAgKiAgICAgICAgMzYgICBNR0RJIChXaW4gQ0UgMikgICAgICAgICAgIHYxLjYrIGNsYXNzaWMgQ2xlYXJUeXBlCisgICAqICAgICAgICAzNyAgIEdESSAoWFAgYW5kIGxhdGVyKSwgICAgICAgdjEuOCAgQ2xlYXJUeXBlCisgICAqICAgICAgICAgICAgIEdESSsgb2xkIChiZWZvcmUgVmlzdGEpCisgICAqICAgICAgICAzOCAgIEdESSsgb2xkIChWaXN0YSwgV2luIDcpLCAgdjEuOSAgc3VicGl4ZWwgQ2xlYXJUeXBlLAorICAgKiAgICAgICAgICAgICBXUEYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFktZGlyZWN0aW9uIENsZWFyVHlwZSwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsIGVycm9yIGNoZWNraW5nCisgICAqICAgICAgICAzOSAgIERXcml0ZSAoYmVmb3JlIFdpbiA4KSAgICAgdjIuMCAgc3VicGl4ZWwgQ2xlYXJUeXBlIGZsYWdzCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBHRVRJTkZPIG9wY29kZSwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWcgZml4ZXMKKyAgICogICAgICAgIDQwICAgR0RJKyAoYWZ0ZXIgV2luIDcpLCAgICAgICB2Mi4xICBZLWRpcmVjdGlvbiBDbGVhclR5cGUgZmxhZworICAgKiAgICAgICAgICAgICBEV3JpdGUgKFdpbiA4KSAgICAgICAgICAgICAgICAgICAgaW4gR0VUSU5GTyBvcGNvZGUsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JheSBDbGVhclR5cGUKKyAgICogICB9CisgICAqCisgICAqICAgVGhlIGB2ZXJzaW9uJyBmaWVsZCBnaXZlcyBhIHJvdWdoIG9yaWVudGF0aW9uIG9ubHksIHNpbmNlIHNvbWUKKyAgICogICBhcHBsaWNhdGlvbnMgcHJvdmlkZWQgY2VydGFpbiBmZWF0dXJlcyBtdWNoIGVhcmxpZXIgKGFzIGFuIGV4YW1wbGUsCisgICAqICAgTWljcm9zb2Z0IFJlYWRlciB1c2VkIHN1YnBpeGVsIGFuZCBZLWRpcmVjdGlvbiBDbGVhclR5cGUgYWxyZWFkeSBpbgorICAgKiAgIFdpbmRvd3MgMjAwMCkuICBTaW1pbGFybHksIHVwZGF0ZXMgdG8gYSBnaXZlbiBmcmFtZXdvcmsgbWlnaHQgaW5jbHVkZQorICAgKiAgIGltcHJvdmVkIGhpbnRpbmcgc3VwcG9ydC4KKyAgICoKKyAgICogICB7CisgICAqICAgICAgdmVyc2lvbiAgIHNhbXBsaW5nICAgICAgICAgIHJlbmRlcmluZyAgICAgICAgY29tbWVudAorICAgKiAgICAgICAgICAgICAgIHggICAgICAgIHkgICAgICAgeCAgICAgICAgICAgeQorICAgKiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogICAgICAgdjEuMCAgIG5vcm1hbCAgbm9ybWFsICBCL1cgICAgICAgICAgIEIvVyAgICBiaS1sZXZlbAorICAgKiAgICAgICB2MS42ICAgaGlnaCAgICBoaWdoICAgIGdyYXkgICAgICAgICAgZ3JheSAgIGdyYXlzY2FsZQorICAgKiAgICAgICB2MS44ICAgaGlnaCAgICBub3JtYWwgIGNvbG9yLWZpbHRlciAgQi9XICAgIChHREkpIENsZWFyVHlwZQorICAgKiAgICAgICB2MS45ICAgaGlnaCAgICBoaWdoICAgIGNvbG9yLWZpbHRlciAgZ3JheSAgIENvbG9yIENsZWFyVHlwZQorICAgKiAgICAgICB2Mi4xICAgaGlnaCAgICBub3JtYWwgIGdyYXkgICAgICAgICAgQi9XICAgIEdyYXkgQ2xlYXJUeXBlCisgICAqICAgICAgIHYyLjEgICBoaWdoICAgIGhpZ2ggICAgZ3JheSAgICAgICAgICBncmF5ICAgR3JheSBDbGVhclR5cGUKKyAgICogICB9CisgICAqCisgICAqICAgQ29sb3IgYW5kIEdyYXkgQ2xlYXJUeXBlIGFyZSB0aGUgdHdvIGF2YWlsYWJsZSB2YXJpYW50cyBvZgorICAgKiAgIGBZLWRpcmVjdGlvbiBDbGVhclR5cGUnLCBtZWFuaW5nIGdyYXlzY2FsZSByYXN0ZXJpemF0aW9uIGFsb25nIHRoZQorICAgKiAgIFktZGlyZWN0aW9uOyB0aGUgbmFtZSB1c2VkIGluIHRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uIGZvciB0aGlzCisgICAqICAgZmVhdHVyZSBpcyBgc3ltbWV0cmljIHNtb290aGluZycuICBgQ2xhc3NpYyBDbGVhclR5cGUnIGlzIHRoZQorICAgKiAgIG9yaWdpbmFsIGFsZ29yaXRobSB1c2VkIGJlZm9yZSBpbnRyb2R1Y2luZyBhIG1vZGlmaWVkIHZlcnNpb24gaW4KKyAgICogICBXaW5+WFAuICBBbm90aGVyIG5hbWUgZm9yIHYxLjYncyBncmF5c2NhbGUgcmVuZGVyaW5nIGlzIGBmb250CisgICAqICAgc21vb3RoaW5nJywgYW5kIGBDb2xvciBDbGVhclR5cGUnIGlzIHNvbWV0aW1lcyBhbHNvIGNhbGxlZCBgRFdyaXRlCisgICAqICAgQ2xlYXJUeXBlJy4gIFRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0b2RheSdzIENvbG9yIENsZWFyVHlwZSBhbmQgdGhlCisgICAqICAgZWFybGllciBDbGVhclR5cGUgdmFyaWFudCB3aXRoIEIvVyByZW5kZXJpbmcgYWxvbmcgdGhlIHZlcnRpY2FsIGF4aXMsCisgICAqICAgdGhlIGxhdHRlciBpcyBzb21ldGltZXMgY2FsbGVkIGBHREkgQ2xlYXJUeXBlJy4KKyAgICoKKyAgICogICBgTm9ybWFsJyBhbmQgYGhpZ2gnIHNhbXBsaW5nIGRlc2NyaWJlIHRoZSAodmlydHVhbCkgcmVzb2x1dGlvbiB0bworICAgKiAgIGFjY2VzcyB0aGUgcmFzdGVyaXplZCBvdXRsaW5lIGFmdGVyIHRoZSBoaW50aW5nIHByb2Nlc3MuICBgTm9ybWFsJworICAgKiAgIG1lYW5zIDEgc2FtcGxlIHBlciBncmlkIGxpbmUgKGkuZS4sIEIvVykuICBJbiB0aGUgY3VycmVudCBNaWNyb3NvZnQKKyAgICogICBpbXBsZW1lbnRhdGlvbiwgYGhpZ2gnIG1lYW5zIGFuIGV4dHJhIHZpcnR1YWwgcmVzb2x1dGlvbiBvZiAxNngxNiAob3IKKyAgICogICAxNngxKSBncmlkIGxpbmVzIHBlciBwaXhlbCBmb3IgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zIGxpa2UgYE1JUlAnLgorICAgKiAgIEFmdGVyIGhpbnRpbmcsIHRoZXNlIDE2IGdyaWQgbGluZXMgYXJlIG1hcHBlZCB0byA2eDUgKG9yIDZ4MSkgZ3JpZAorICAgKiAgIGxpbmVzIGZvciBjb2xvciBmaWx0ZXJpbmcgaWYgQ29sb3IgQ2xlYXJUeXBlIGlzIGFjdGl2YXRlZC4KKyAgICoKKyAgICogICBOb3RlIHRoYXQgYEdyYXkgQ2xlYXJUeXBlJyBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyB2MS42J3MKKyAgICogICBncmF5c2NhbGUgcmVuZGVyaW5nLiAgSG93ZXZlciwgdGhlIEdFVElORk8gaW5zdHJ1Y3Rpb24gaGFuZGxlcyBpdAorICAgKiAgIGRpZmZlcmVudGx5OiB2MS42IHJldHVybnMgYml0fjEyIChoaW50aW5nIGZvciBncmF5c2NhbGUpLCB3aGlsZSB2Mi4xCisgICAqICAgcmV0dXJucyBiaXRzfjEzIChoaW50aW5nIGZvciBDbGVhclR5cGUpLCAxOCAoc3ltbWV0cmljYWwgc21vb3RoaW5nKSwKKyAgICogICBhbmR+MTkgKEdyYXkgQ2xlYXJUeXBlKS4gIEFsc28sIHRoaXMgbW9kZSByZXNwZWN0cyBiaXRzIDIgYW5kfjMgZm9yCisgICAqICAgdGhlIHZlcnNpb25+MSBnYXNwIHRhYmxlIGV4Y2x1c2l2ZWx5IChsaWtlIENvbG9yIENsZWFyVHlwZSksIHdoaWxlCisgICAqICAgdjEuNiBvbmx5IHJlc3BlY3RzIHRoZSB2YWx1ZXMgb2YgdmVyc2lvbn4wIChiaXRzIDAgYW5kfjEpLgorICAgKgorICAgKiAgIEZyZWVUeXBlIGRvZXNuJ3QgcHJvdmlkZSBhbGwgY2FwYWJpbGl0aWVzIG9mIHRoZSBtb3N0IHJlY2VudAorICAgKiAgIENsZWFyVHlwZSBpbmNhcm5hdGlvbiwgdGh1cyB3ZSBpZGVudGlmeSBvdXIgc3VicGl4ZWwgc3VwcG9ydCBhcworICAgKiAgIHZlcnNpb25+MzguCisgICAqCisgICAqLworI2RlZmluZSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzM1ICAzNQorI2RlZmluZSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzM4ICAzOAorCisgLyogKi8KKworCitGVF9FTkRfSEVBREVSCisKKworI2VuZGlmIC8qIF9fRlRUVERSVl9IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnR0eXBlcy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdHR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2YTFiZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnR0eXBlcy5oCkBAIC0wLDAgKzEsNjAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBmdHR5cGVzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnJlZVR5cGUgc2ltcGxlIHR5cGVzIGRlZmluaXRpb25zIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX19GVFRZUEVTX0hfXworI2RlZmluZSBfX0ZUVFlQRVNfSF9fCisKKworI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CisjaW5jbHVkZSBGVF9DT05GSUdfQ09ORklHX0gKKyNpbmNsdWRlIEZUX1NZU1RFTV9ICisjaW5jbHVkZSBGVF9JTUFHRV9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworCitGVF9CRUdJTl9IRUFERVIKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJhc2ljX3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEJhc2ljIERhdGEgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBiYXNpYyBkYXRhIHR5cGVzIGRlZmluZWQgYnkgdGhlIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgYmFzaWMgZGF0YSB0eXBlcyBkZWZpbmVkIGJ5IEZyZWVUeXBlfjIsICAqLworICAvKiAgICByYW5naW5nIGZyb20gc2ltcGxlIHNjYWxhciB0eXBlcyB0byBiaXRtYXAgZGVzY3JpcHRvcnMuICBNb3JlICAgICAgKi8KKyAgLyogICAgZm9udC1zcGVjaWZpYyBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkIGluIGEgZGlmZmVyZW50IHNlY3Rpb24uICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3JkZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfQnl0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9DaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfSW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1VJbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9JbnQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfVUludDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfSW50NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1VJbnQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TaG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfVVNob3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9VTG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX09mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9QdHJEaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1RhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRml4ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1BvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9Qb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfVmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0JCb3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9NYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRldvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1VGV29yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GMkRvdDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfVW5pdFZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0YyNkRvdDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9EYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX01BS0VfVEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0dlbmVyaWNfRmluYWxpemVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfQml0bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1BpeGVsX01vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9QYWxldHRlX01vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2x5cGhfRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0lNQUdFX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHR5cGVkZWYgb2YgdW5zaWduZWQgY2hhciwgdXNlZCBmb3Igc2ltcGxlIGJvb2xlYW5zLiAgQXMgdXN1YWwsICAgKi8KKyAgLyogICAgdmFsdWVzIDEgYW5kfjAgcmVwcmVzZW50IHRydWUgYW5kIGZhbHNlLCByZXNwZWN0aXZlbHkuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIEZUX0Jvb2w7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GV29yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHNpZ25lZCAxNi1iaXQgaW50ZWdlciB1c2VkIHRvIHN0b3JlIGEgZGlzdGFuY2UgaW4gb3JpZ2luYWwgZm9udCAgKi8KKyAgLyogICAgdW5pdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHNpZ25lZCBzaG9ydCAgRlRfRldvcmQ7ICAgLyogZGlzdGFuY2UgaW4gRlVuaXRzICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9VRldvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBbiB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlciB1c2VkIHRvIHN0b3JlIGEgZGlzdGFuY2UgaW4gb3JpZ2luYWwgICAgKi8KKyAgLyogICAgZm9udCB1bml0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBGVF9VRldvcmQ7ICAvKiB1bnNpZ25lZCBkaXN0YW5jZSAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfQ2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzaW1wbGUgdHlwZWRlZiBmb3IgdGhlIF9zaWduZWRfIGNoYXIgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHNpZ25lZCBjaGFyICBGVF9DaGFyOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfQnl0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzaW1wbGUgdHlwZWRlZiBmb3IgdGhlIF91bnNpZ25lZF8gY2hhciB0eXBlLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIEZUX0J5dGU7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9CeXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHR5cGVkZWYgZm9yIGNvbnN0YW50IG1lbW9yeSBhcmVhcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgY29uc3QgRlRfQnl0ZSogIEZUX0J5dGVzOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfVGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSB0eXBlZGVmIGZvciAzMi1iaXQgdGFncyAoYXMgdXNlZCBpbiB0aGUgU0ZOVCBmb3JtYXQpLiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIEZUX1VJbnQzMiAgRlRfVGFnOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzaW1wbGUgdHlwZWRlZiBmb3IgdGhlIGNoYXIgdHlwZSwgdXN1YWxseSB1c2VkIGZvciBzdHJpbmdzLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIGNoYXIgIEZUX1N0cmluZzsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1Nob3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgdHlwZWRlZiBmb3Igc2lnbmVkIHNob3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzaWduZWQgc2hvcnQgIEZUX1Nob3J0OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfVVNob3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSB0eXBlZGVmIGZvciB1bnNpZ25lZCBzaG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBGVF9VU2hvcnQ7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9JbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHR5cGVkZWYgZm9yIHRoZSBpbnQgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc2lnbmVkIGludCAgRlRfSW50OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfVUludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSB0eXBlZGVmIGZvciB0aGUgdW5zaWduZWQgaW50IHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHVuc2lnbmVkIGludCAgRlRfVUludDsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0xvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgdHlwZWRlZiBmb3Igc2lnbmVkIGxvbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzaWduZWQgbG9uZyAgRlRfTG9uZzsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1VMb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgdHlwZWRlZiBmb3IgdW5zaWduZWQgbG9uZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICBGVF9VTG9uZzsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0YyRG90MTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc2lnbmVkIDIuMTQgZml4ZWQtcG9pbnQgdHlwZSB1c2VkIGZvciB1bml0IHZlY3RvcnMuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzaWduZWQgc2hvcnQgIEZUX0YyRG90MTQ7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9GMjZEb3Q2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHNpZ25lZCAyNi42IGZpeGVkLXBvaW50IHR5cGUgdXNlZCBmb3IgdmVjdG9yaWFsIHBpeGVsICAgICAgICAgICAgKi8KKyAgLyogICAgY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHNpZ25lZCBsb25nICBGVF9GMjZEb3Q2OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRml4ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyB0eXBlIGlzIHVzZWQgdG8gc3RvcmUgMTYuMTYgZml4ZWQtcG9pbnQgdmFsdWVzLCBsaWtlIHNjYWxpbmcgICovCisgIC8qICAgIHZhbHVlcyBvciBtYXRyaXggY29lZmZpY2llbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzaWduZWQgbG9uZyAgRlRfRml4ZWQ7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgRnJlZVR5cGUgZXJyb3IgY29kZSB0eXBlLiAgQSB2YWx1ZSBvZn4wIGlzIGFsd2F5cyBpbnRlcnByZXRlZCAgKi8KKyAgLyogICAgYXMgYSBzdWNjZXNzZnVsIG9wZXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIGludCAgRlRfRXJyb3I7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9Qb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHNpbXBsZSB0eXBlZGVmIGZvciBhIHR5cGVsZXNzIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgdm9pZCogIEZUX1BvaW50ZXI7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9PZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIEFOU0l+QyBgc2l6ZV90JyB0eXBlLCBpLmUuLCB0aGUgbGFyZ2VzdCAgKi8KKyAgLyogICAgX3Vuc2lnbmVkXyBpbnRlZ2VyIHR5cGUgdXNlZCB0byBleHByZXNzIGEgZmlsZSBzaXplIG9yIHBvc2l0aW9uLCAgICovCisgIC8qICAgIG9yIGEgbWVtb3J5IGJsb2NrIHNpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzaXplX3QgIEZUX09mZnNldDsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1B0ckRpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgQU5TSX5DIGBwdHJkaWZmX3QnIHR5cGUsIGkuZS4sIHRoZSAgICAgICAqLworICAvKiAgICBsYXJnZXN0IF9zaWduZWRfIGludGVnZXIgdHlwZSB1c2VkIHRvIGV4cHJlc3MgdGhlIGRpc3RhbmNlICAgICAgICAgKi8KKyAgLyogICAgYmV0d2VlbiB0d28gcG9pbnRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIGZ0X3B0cmRpZmZfdCAgRlRfUHRyRGlzdDsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1VuaXRWZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIGEgMkQgdmVjdG9yIHVuaXQgdmVjdG9yLiAgVXNlcyAgICAqLworICAvKiAgICBGVF9GMkRvdDE0IHR5cGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4IDo6IEhvcml6b250YWwgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHkgOjogVmVydGljYWwgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1VuaXRWZWN0b3JfCisgIHsKKyAgICBGVF9GMkRvdDE0ICB4OworICAgIEZUX0YyRG90MTQgIHk7CisKKyAgfSBGVF9Vbml0VmVjdG9yOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTWF0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzaW1wbGUgc3RydWN0dXJlIHVzZWQgdG8gc3RvcmUgYSAyeDIgbWF0cml4LiAgQ29lZmZpY2llbnRzIGFyZSAgICovCisgIC8qICAgIGluIDE2LjE2IGZpeGVkLXBvaW50IGZvcm1hdC4gIFRoZSBjb21wdXRhdGlvbiBwZXJmb3JtZWQgaXM6ICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgIHgnID0geCp4eCArIHkqeHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICB5JyA9IHgqeXggKyB5Knl5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeHggOjogTWF0cml4IGNvZWZmaWNpZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4eSA6OiBNYXRyaXggY29lZmZpY2llbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHl4IDo6IE1hdHJpeCBjb2VmZmljaWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeXkgOjogTWF0cml4IGNvZWZmaWNpZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgRlRfTWF0cml4XworICB7CisgICAgRlRfRml4ZWQgIHh4LCB4eTsKKyAgICBGVF9GaXhlZCAgeXgsIHl5OworCisgIH0gRlRfTWF0cml4OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmVhZC1vbmx5IGJpbmFyeSBkYXRhIHJlcHJlc2VudGVkIGFzIGEgcG9pbnRlciBhbmQgYSBsZW5ndGguICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcG9pbnRlciA6OiBUaGUgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsZW5ndGggIDo6IFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBGVF9EYXRhXworICB7CisgICAgY29uc3QgRlRfQnl0ZSogIHBvaW50ZXI7CisgICAgRlRfSW50ICAgICAgICAgIGxlbmd0aDsKKworICB9IEZUX0RhdGE7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZW5lcmljX0ZpbmFsaXplciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBEZXNjcmliZSBhIGZ1bmN0aW9uIHVzZWQgdG8gZGVzdHJveSB0aGUgYGNsaWVudCcgZGF0YSBvZiBhbnkgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgb2JqZWN0LiAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgQEZUX0dlbmVyaWMgdHlwZSBmb3IgICovCisgIC8qICAgIGRldGFpbHMgb2YgdXNhZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBhZGRyZXNzIG9mIHRoZSBGcmVlVHlwZSBvYmplY3QgdGhhdCBpcyB1bmRlciBmaW5hbGl6YXRpb24uICAgICAqLworICAvKiAgICBJdHMgY2xpZW50IGRhdGEgaXMgYWNjZXNzZWQgdGhyb3VnaCBpdHMgYGdlbmVyaWMnIGZpZWxkLiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgdm9pZCAgKCpGVF9HZW5lcmljX0ZpbmFsaXplcikodm9pZCogIG9iamVjdCk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDbGllbnQgYXBwbGljYXRpb25zIG9mdGVuIG5lZWQgdG8gYXNzb2NpYXRlIHRoZWlyIG93biBkYXRhIHRvIGEgICAgKi8KKyAgLyogICAgdmFyaWV0eSBvZiBGcmVlVHlwZSBjb3JlIG9iamVjdHMuICBGb3IgZXhhbXBsZSwgYSB0ZXh0IGxheW91dCBBUEkgICovCisgIC8qICAgIG1pZ2h0IHdhbnQgdG8gYXNzb2NpYXRlIGEgZ2x5cGggY2FjaGUgdG8gYSBnaXZlbiBzaXplIG9iamVjdC4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU29tZSBGcmVlVHlwZSBvYmplY3QgY29udGFpbnMgYSBgZ2VuZXJpYycgZmllbGQsIG9mIHR5cGUgICAgICAgICAgICovCisgIC8qICAgIEZUX0dlbmVyaWMsIHdoaWNoIHVzYWdlIGlzIGxlZnQgdG8gY2xpZW50IGFwcGxpY2F0aW9ucyBhbmQgZm9udCAgICAqLworICAvKiAgICBzZXJ2ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEl0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIGEgcG9pbnRlciB0byBjbGllbnQtc3BlY2lmaWMgZGF0YSwgYXMgd2VsbCAqLworICAvKiAgICBhcyB0aGUgYWRkcmVzcyBvZiBhIGBmaW5hbGl6ZXInIGZ1bmN0aW9uLCB3aGljaCB3aWxsIGJlIGNhbGxlZCBieSAgKi8KKyAgLyogICAgRnJlZVR5cGUgd2hlbiB0aGUgb2JqZWN0IGlzIGRlc3Ryb3llZCAoZm9yIGV4YW1wbGUsIHRoZSBwcmV2aW91cyAgICovCisgIC8qICAgIGNsaWVudCBleGFtcGxlIHdvdWxkIHB1dCB0aGUgYWRkcmVzcyBvZiB0aGUgZ2x5cGggY2FjaGUgZGVzdHJ1Y3RvciAqLworICAvKiAgICBpbiB0aGUgYGZpbmFsaXplcicgZmllbGQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkYXRhICAgICAgOjogQSB0eXBlbGVzcyBwb2ludGVyIHRvIGFueSBjbGllbnQtc3BlY2lmaWVkIGRhdGEuIFRoaXMgKi8KKyAgLyogICAgICAgICAgICAgICAgIGZpZWxkIGlzIGNvbXBsZXRlbHkgaWdub3JlZCBieSB0aGUgRnJlZVR5cGUgbGlicmFyeS4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmaW5hbGl6ZXIgOjogQSBwb2ludGVyIHRvIGEgYGdlbmVyaWMgZmluYWxpemVyJyBmdW5jdGlvbiwgd2hpY2ggICAgKi8KKyAgLyogICAgICAgICAgICAgICAgIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIG9iamVjdCBpcyBkZXN0cm95ZWQuICBJZiB0aGlzICovCisgIC8qICAgICAgICAgICAgICAgICBmaWVsZCBpcyBzZXQgdG8gTlVMTCwgbm8gY29kZSB3aWxsIGJlIGNhbGxlZC4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0dlbmVyaWNfCisgIHsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgZGF0YTsKKyAgICBGVF9HZW5lcmljX0ZpbmFsaXplciAgZmluYWxpemVyOworCisgIH0gRlRfR2VuZXJpYzsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX01BS0VfVEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgbWFjcm8gY29udmVydHMgZm91ci1sZXR0ZXIgdGFncyB0aGF0IGFyZSB1c2VkIHRvIGxhYmVsICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSB0YWJsZXMgaW50byBhbiB1bnNpZ25lZCBsb25nLCB0byBiZSB1c2VkIHdpdGhpbiBGcmVlVHlwZS4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgcHJvZHVjZWQgdmFsdWVzICptdXN0KiBiZSAzMi1iaXQgaW50ZWdlcnMuICBEb24ndCByZWRlZmluZSAgICAgKi8KKyAgLyogICAgdGhpcyBtYWNyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9NQUtFX1RBRyggX3gxLCBfeDIsIF94MywgX3g0ICkgXAorICAgICAgICAgIChGVF9UYWcpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICggKCAoRlRfVUxvbmcpX3gxIDw8IDI0ICkgfCAgICAgXAorICAgICAgICAgICAgKCAoRlRfVUxvbmcpX3gyIDw8IDE2ICkgfCAgICAgXAorICAgICAgICAgICAgKCAoRlRfVUxvbmcpX3gzIDw8ICA4ICkgfCAgICAgXAorICAgICAgICAgICAgICAoRlRfVUxvbmcpX3g0ICAgICAgICAgKQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIEwgSSBTIFQgICBNIEEgTiBBIEcgRSBNIEUgTiBUICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaXN0X3Byb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTGlzdE5vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIE1hbnkgZWxlbWVudHMgYW5kIG9iamVjdHMgaW4gRnJlZVR5cGUgYXJlIGxpc3RlZCB0aHJvdWdoIGFuICAgICAgICovCisgIC8qICAgICBARlRfTGlzdCByZWNvcmQgKHNlZSBARlRfTGlzdFJlYykuICBBcyBpdHMgbmFtZSBzdWdnZXN0cywgYW4gICAgICAqLworICAvKiAgICAgRlRfTGlzdE5vZGUgaXMgYSBoYW5kbGUgdG8gYSBzaW5nbGUgbGlzdCBlbGVtZW50LiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IEZUX0xpc3ROb2RlUmVjXyogIEZUX0xpc3ROb2RlOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBoYW5kbGUgdG8gYSBsaXN0IHJlY29yZCAoc2VlIEBGVF9MaXN0UmVjKS4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCBGVF9MaXN0UmVjXyogIEZUX0xpc3Q7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9MaXN0Tm9kZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgYSBzaW5nbGUgbGlzdCBlbGVtZW50LiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwcmV2IDo6IFRoZSBwcmV2aW91cyBlbGVtZW50IGluIHRoZSBsaXN0LiAgTlVMTCBpZiBmaXJzdC4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG5leHQgOjogVGhlIG5leHQgZWxlbWVudCBpbiB0aGUgbGlzdC4gIE5VTEwgaWYgbGFzdC4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZGF0YSA6OiBBIHR5cGVsZXNzIHBvaW50ZXIgdG8gdGhlIGxpc3RlZCBvYmplY3QuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgRlRfTGlzdE5vZGVSZWNfCisgIHsKKyAgICBGVF9MaXN0Tm9kZSAgcHJldjsKKyAgICBGVF9MaXN0Tm9kZSAgbmV4dDsKKyAgICB2b2lkKiAgICAgICAgZGF0YTsKKworICB9IEZUX0xpc3ROb2RlUmVjOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTGlzdFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGEgc2ltcGxlIGRvdWJseS1saW5rZWQgbGlzdC4gIFRoZXNlIGFyZSAgICovCisgIC8qICAgIHVzZWQgaW4gbWFueSBwYXJ0cyBvZiBGcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGhlYWQgOjogVGhlIGhlYWQgKGZpcnN0IGVsZW1lbnQpIG9mIGRvdWJseS1saW5rZWQgbGlzdC4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdGFpbCA6OiBUaGUgdGFpbCAobGFzdCBlbGVtZW50KSBvZiBkb3VibHktbGlua2VkIGxpc3QuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgRlRfTGlzdFJlY18KKyAgeworICAgIEZUX0xpc3ROb2RlICBoZWFkOworICAgIEZUX0xpc3ROb2RlICB0YWlsOworCisgIH0gRlRfTGlzdFJlYzsKKworICAvKiAqLworCisKKyNkZWZpbmUgRlRfSVNfRU1QVFkoIGxpc3QgKSAgKCAobGlzdCkuaGVhZCA9PSAwICkKKyNkZWZpbmUgRlRfQk9PTCggeCApICAoIChGVF9Cb29sKSggeCApICkKKworICAvKiBjb25jYXRlbmF0ZSBDIHRva2VucyAqLworI2RlZmluZSBGVF9FUlJfWENBVCggeCwgeSApICB4ICMjIHkKKyNkZWZpbmUgRlRfRVJSX0NBVCggeCwgeSApICAgRlRfRVJSX1hDQVQoIHgsIHkgKQorCisgIC8qIHNlZSBgZnRtb2RlcnIuaCcgZm9yIGRlc2NyaXB0aW9ucyBvZiB0aGUgZm9sbG93aW5nIG1hY3JvcyAqLworCisjZGVmaW5lIEZUX0VSUiggZSApICBGVF9FUlJfQ0FUKCBGVF9FUlJfUFJFRklYLCBlICkKKworI2RlZmluZSBGVF9FUlJPUl9CQVNFKCB4ICkgICAgKCAoeCkgJiAweEZGICkKKyNkZWZpbmUgRlRfRVJST1JfTU9EVUxFKCB4ICkgICggKHgpICYgMHhGRjAwVSApCisKKyNkZWZpbmUgRlRfRVJSX0VRKCB4LCBlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICggRlRfRVJST1JfQkFTRSggeCApID09IEZUX0VSUk9SX0JBU0UoIEZUX0VSUiggZSApICkgKQorI2RlZmluZSBGVF9FUlJfTkVRKCB4LCBlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKCBGVF9FUlJPUl9CQVNFKCB4ICkgIT0gRlRfRVJST1JfQkFTRSggRlRfRVJSKCBlICkgKSApCisKKworRlRfRU5EX0hFQURFUgorCisjZW5kaWYgLyogX19GVFRZUEVTX0hfXyAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdHdpbmZudC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdHdpbmZudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZWRhYTEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0d2luZm50LmgKQEAgLTAsMCArMSwyNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0d2luZm50LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGcmVlVHlwZSBBUEkgZm9yIGFjY2Vzc2luZyBXaW5kb3dzIGZudC1zcGVjaWZpYyBkYXRhLiAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwMy0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0ZUV0lORk5UX0hfXworI2RlZmluZSBfX0ZUV0lORk5UX0hfXworCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKworI2lmZGVmIEZSRUVUWVBFX0gKKyNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCisjZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKKyNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgorI2VuZGlmCisKKworRlRfQkVHSU5fSEVBREVSCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB3aW5mbnRfZm9udHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBXaW5kb3cgRk5UIEZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBXaW5kb3dzIEZOVCBzcGVjaWZpYyBBUEkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIFdpbmRvd3MgRk5UIHNwZWNpZmljICAgICAgKi8KKyAgLyogICAgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBlbnVtOgorICAgKiAgIEZUX1dpbkZOVF9JRF9YWFgKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgbGlzdCBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBgY2hhcnNldCcgYnl0ZSBpbgorICAgKiAgIEBGVF9XaW5GTlRfSGVhZGVyUmVjLiAgRXhhY3QgbWFwcGluZyB0YWJsZXMgZm9yIHRoZSB2YXJpb3VzIGNwWFhYWAorICAgKiAgIGVuY29kaW5ncyAoZXhjZXB0IGZvciBjcDEzNjEpIGNhbiBiZSBmb3VuZCBhdAorICAgKiAgIGZ0cDovL2Z0cC51bmljb2RlLm9yZy9QdWJsaWMgaW4gdGhlIE1BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL1dJTkRPV1MKKyAgICogICBzdWJkaXJlY3RvcnkuICBjcDEzNjEgaXMgcm91Z2hseSBhIHN1cGVyc2V0IG9mCisgICAqICAgTUFQUElOR1MvT0JTT0xFVEUvRUFTVEFTSUEvS1NDL0pPSEFCLlRYVC4KKyAgICoKKyAgICogQHZhbHVlczoKKyAgICogICBGVF9XaW5GTlRfSURfREVGQVVMVCA6OgorICAgKiAgICAgVGhpcyBpcyB1c2VkIGZvciBmb250IGVudW1lcmF0aW9uIGFuZCBmb250IGNyZWF0aW9uIGFzIGEKKyAgICogICAgIGBkb24ndCBjYXJlJyB2YWx1ZS4gIFZhbGlkIGZvbnQgZmlsZXMgZG9uJ3QgY29udGFpbiB0aGlzIHZhbHVlLgorICAgKiAgICAgV2hlbiBxdWVyeWluZyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNoYXJhY3RlciBzZXQgb2YgdGhlIGZvbnQKKyAgICogICAgIHRoYXQgaXMgY3VycmVudGx5IHNlbGVjdGVkIGludG8gYSBzcGVjaWZpZWQgZGV2aWNlIGNvbnRleHQsIHRoaXMKKyAgICogICAgIHJldHVybiB2YWx1ZSAob2YgdGhlIHJlbGF0ZWQgV2luZG93cyBBUEkpIHNpbXBseSBkZW5vdGVzIGZhaWx1cmUuCisgICAqCisgICAqICAgRlRfV2luRk5UX0lEX1NZTUJPTCA6OgorICAgKiAgICAgVGhlcmUgaXMgbm8ga25vd24gbWFwcGluZyB0YWJsZSBhdmFpbGFibGUuCisgICAqCisgICAqICAgRlRfV2luRk5UX0lEX01BQyA6OgorICAgKiAgICAgTWFjIFJvbWFuIGVuY29kaW5nLgorICAgKgorICAgKiAgIEZUX1dpbkZOVF9JRF9PRU0gOjoKKyAgICogICAgIEZyb20gTWljaGFlbCBQw7Z0dGdlbiA8bWljaGFlbEBwb2V0dGdlbi5kZT46CisgICAqCisgICAqICAgICAgIFRoZSBgV2luZG93cyBGb250IE1hcHBpbmcnIGFydGljbGUgc2F5cyB0aGF0IEZUX1dpbkZOVF9JRF9PRU0KKyAgICogICAgICAgaXMgdXNlZCBmb3IgdGhlIGNoYXJzZXQgb2YgdmVjdG9yIGZvbnRzLCBsaWtlIGBtb2Rlcm4uZm9uJywKKyAgICogICAgICAgYHJvbWFuLmZvbicsIGFuZCBgc2NyaXB0LmZvbicgb24gV2luZG93cy4KKyAgICoKKyAgICogICAgICAgVGhlIGBDcmVhdGVGb250JyBkb2N1bWVudGF0aW9uIHNheXM6IFRoZSBGVF9XaW5GTlRfSURfT0VNIHZhbHVlCisgICAqICAgICAgIHNwZWNpZmllcyBhIGNoYXJhY3RlciBzZXQgdGhhdCBpcyBvcGVyYXRpbmctc3lzdGVtIGRlcGVuZGVudC4KKyAgICoKKyAgICogICAgICAgVGhlIGBJRklNRVRSSUNTJyBkb2N1bWVudGF0aW9uIGZyb20gdGhlIGBXaW5kb3dzIERyaXZlcgorICAgKiAgICAgICBEZXZlbG9wbWVudCBLaXQnIHNheXM6IFRoaXMgZm9udCBzdXBwb3J0cyBhbiBPRU0tc3BlY2lmaWMKKyAgICogICAgICAgY2hhcmFjdGVyIHNldC4gIFRoZSBPRU0gY2hhcmFjdGVyIHNldCBpcyBzeXN0ZW0gZGVwZW5kZW50LgorICAgKgorICAgKiAgICAgICBJbiBnZW5lcmFsIE9FTSwgYXMgb3Bwb3NlZCB0byBBTlNJIChpLmUuLCBjcDEyNTIpLCBkZW5vdGVzIHRoZQorICAgKiAgICAgICBzZWNvbmQgZGVmYXVsdCBjb2RlcGFnZSB0aGF0IG1vc3QgaW50ZXJuYXRpb25hbCB2ZXJzaW9ucyBvZgorICAgKiAgICAgICBXaW5kb3dzIGhhdmUuICBJdCBpcyBvbmUgb2YgdGhlIE9FTSBjb2RlcGFnZXMgZnJvbQorICAgKgorICAgKiAgICAgICAgIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2dvZ2xvYmFsL2JiOTY0NjU1LAorICAgKgorICAgKiAgICAgICBhbmQgaXMgdXNlZCBmb3IgdGhlIGBET1MgYm94ZXMnLCB0byBzdXBwb3J0IGxlZ2FjeSBhcHBsaWNhdGlvbnMuCisgICAqICAgICAgIEEgR2VybWFuIFdpbmRvd3MgdmVyc2lvbiBmb3IgZXhhbXBsZSB1c3VhbGx5IHVzZXMgQU5TSSBjb2RlcGFnZQorICAgKiAgICAgICAxMjUyIGFuZCBPRU0gY29kZXBhZ2UgODUwLgorICAgKgorICAgKiAgIEZUX1dpbkZOVF9JRF9DUDg3NCA6OgorICAgKiAgICAgQSBzdXBlcnNldCBvZiBUaGFpIFRJUyA2MjAgYW5kIElTTyA4ODU5LTExLgorICAgKgorICAgKiAgIEZUX1dpbkZOVF9JRF9DUDkzMiA6OgorICAgKiAgICAgQSBzdXBlcnNldCBvZiBKYXBhbmVzZSBTaGlmdC1KSVMgKHdpdGggbWlub3IgZGV2aWF0aW9ucykuCisgICAqCisgICAqICAgRlRfV2luRk5UX0lEX0NQOTM2IDo6CisgICAqICAgICBBIHN1cGVyc2V0IG9mIHNpbXBsaWZpZWQgQ2hpbmVzZSBHQiAyMzEyLTE5ODAgKHdpdGggZGlmZmVyZW50CisgICAqICAgICBvcmRlcmluZyBhbmQgbWlub3IgZGV2aWF0aW9ucykuCisgICAqCisgICAqICAgRlRfV2luRk5UX0lEX0NQOTQ5IDo6CisgICAqICAgICBBIHN1cGVyc2V0IG9mIEtvcmVhbiBIYW5ndWwgS1N+QyA1NjAxLTE5ODcgKHdpdGggZGlmZmVyZW50CisgICAqICAgICBvcmRlcmluZyBhbmQgbWlub3IgZGV2aWF0aW9ucykuCisgICAqCisgICAqICAgRlRfV2luRk5UX0lEX0NQOTUwIDo6CisgICAqICAgICBBIHN1cGVyc2V0IG9mIHRyYWRpdGlvbmFsIENoaW5lc2UgQmlnfjUgRVRlbiAod2l0aCBkaWZmZXJlbnQKKyAgICogICAgIG9yZGVyaW5nIGFuZCBtaW5vciBkZXZpYXRpb25zKS4KKyAgICoKKyAgICogICBGVF9XaW5GTlRfSURfQ1AxMjUwIDo6CisgICAqICAgICBBIHN1cGVyc2V0IG9mIEVhc3QgRXVyb3BlYW4gSVNPIDg4NTktMiAod2l0aCBzbGlnaHRseSBkaWZmZXJlbnQKKyAgICogICAgIG9yZGVyaW5nKS4KKyAgICoKKyAgICogICBGVF9XaW5GTlRfSURfQ1AxMjUxIDo6CisgICAqICAgICBBIHN1cGVyc2V0IG9mIFJ1c3NpYW4gSVNPIDg4NTktNSAod2l0aCBkaWZmZXJlbnQgb3JkZXJpbmcpLgorICAgKgorICAgKiAgIEZUX1dpbkZOVF9JRF9DUDEyNTIgOjoKKyAgICogICAgIEFOU0kgZW5jb2RpbmcuICBBIHN1cGVyc2V0IG9mIElTTyA4ODU5LTEuCisgICAqCisgICAqICAgRlRfV2luRk5UX0lEX0NQMTI1MyA6OgorICAgKiAgICAgQSBzdXBlcnNldCBvZiBHcmVlayBJU08gODg1OS03ICh3aXRoIG1pbm9yIG1vZGlmaWNhdGlvbnMpLgorICAgKgorICAgKiAgIEZUX1dpbkZOVF9JRF9DUDEyNTQgOjoKKyAgICogICAgIEEgc3VwZXJzZXQgb2YgVHVya2lzaCBJU08gODg1OS05LgorICAgKgorICAgKiAgIEZUX1dpbkZOVF9JRF9DUDEyNTUgOjoKKyAgICogICAgIEEgc3VwZXJzZXQgb2YgSGVicmV3IElTTyA4ODU5LTggKHdpdGggc29tZSBtb2RpZmljYXRpb25zKS4KKyAgICoKKyAgICogICBGVF9XaW5GTlRfSURfQ1AxMjU2IDo6CisgICAqICAgICBBIHN1cGVyc2V0IG9mIEFyYWJpYyBJU08gODg1OS02ICh3aXRoIGRpZmZlcmVudCBvcmRlcmluZykuCisgICAqCisgICAqICAgRlRfV2luRk5UX0lEX0NQMTI1NyA6OgorICAgKiAgICAgQSBzdXBlcnNldCBvZiBCYWx0aWMgSVNPIDg4NTktMTMgKHdpdGggc29tZSBkZXZpYXRpb25zKS4KKyAgICoKKyAgICogICBGVF9XaW5GTlRfSURfQ1AxMjU4IDo6CisgICAqICAgICBGb3IgVmlldG5hbWVzZS4gIFRoaXMgZW5jb2RpbmcgZG9lc24ndCBjb3ZlciBhbGwgbmVjZXNzYXJ5CisgICAqICAgICBjaGFyYWN0ZXJzLgorICAgKgorICAgKiAgIEZUX1dpbkZOVF9JRF9DUDEzNjEgOjoKKyAgICogICAgIEtvcmVhbiAoSm9oYWIpLgorICAgKi8KKworI2RlZmluZSBGVF9XaW5GTlRfSURfQ1AxMjUyICAgIDAKKyNkZWZpbmUgRlRfV2luRk5UX0lEX0RFRkFVTFQgICAxCisjZGVmaW5lIEZUX1dpbkZOVF9JRF9TWU1CT0wgICAgMgorI2RlZmluZSBGVF9XaW5GTlRfSURfTUFDICAgICAgNzcKKyNkZWZpbmUgRlRfV2luRk5UX0lEX0NQOTMyICAgMTI4CisjZGVmaW5lIEZUX1dpbkZOVF9JRF9DUDk0OSAgIDEyOQorI2RlZmluZSBGVF9XaW5GTlRfSURfQ1AxMzYxICAxMzAKKyNkZWZpbmUgRlRfV2luRk5UX0lEX0NQOTM2ICAgMTM0CisjZGVmaW5lIEZUX1dpbkZOVF9JRF9DUDk1MCAgIDEzNgorI2RlZmluZSBGVF9XaW5GTlRfSURfQ1AxMjUzICAxNjEKKyNkZWZpbmUgRlRfV2luRk5UX0lEX0NQMTI1NCAgMTYyCisjZGVmaW5lIEZUX1dpbkZOVF9JRF9DUDEyNTggIDE2MworI2RlZmluZSBGVF9XaW5GTlRfSURfQ1AxMjU1ICAxNzcKKyNkZWZpbmUgRlRfV2luRk5UX0lEX0NQMTI1NiAgMTc4CisjZGVmaW5lIEZUX1dpbkZOVF9JRF9DUDEyNTcgIDE4NgorI2RlZmluZSBGVF9XaW5GTlRfSURfQ1AxMjUxICAyMDQKKyNkZWZpbmUgRlRfV2luRk5UX0lEX0NQODc0ICAgMjIyCisjZGVmaW5lIEZUX1dpbkZOVF9JRF9DUDEyNTAgIDIzOAorI2RlZmluZSBGVF9XaW5GTlRfSURfT0VNICAgICAyNTUKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1dpbkZOVF9IZWFkZXJSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFdpbmRvd3MgRk5UIEhlYWRlciBpbmZvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1dpbkZOVF9IZWFkZXJSZWNfCisgIHsKKyAgICBGVF9VU2hvcnQgIHZlcnNpb247CisgICAgRlRfVUxvbmcgICBmaWxlX3NpemU7CisgICAgRlRfQnl0ZSAgICBjb3B5cmlnaHRbNjBdOworICAgIEZUX1VTaG9ydCAgZmlsZV90eXBlOworICAgIEZUX1VTaG9ydCAgbm9taW5hbF9wb2ludF9zaXplOworICAgIEZUX1VTaG9ydCAgdmVydGljYWxfcmVzb2x1dGlvbjsKKyAgICBGVF9VU2hvcnQgIGhvcml6b250YWxfcmVzb2x1dGlvbjsKKyAgICBGVF9VU2hvcnQgIGFzY2VudDsKKyAgICBGVF9VU2hvcnQgIGludGVybmFsX2xlYWRpbmc7CisgICAgRlRfVVNob3J0ICBleHRlcm5hbF9sZWFkaW5nOworICAgIEZUX0J5dGUgICAgaXRhbGljOworICAgIEZUX0J5dGUgICAgdW5kZXJsaW5lOworICAgIEZUX0J5dGUgICAgc3RyaWtlX291dDsKKyAgICBGVF9VU2hvcnQgIHdlaWdodDsKKyAgICBGVF9CeXRlICAgIGNoYXJzZXQ7CisgICAgRlRfVVNob3J0ICBwaXhlbF93aWR0aDsKKyAgICBGVF9VU2hvcnQgIHBpeGVsX2hlaWdodDsKKyAgICBGVF9CeXRlICAgIHBpdGNoX2FuZF9mYW1pbHk7CisgICAgRlRfVVNob3J0ICBhdmdfd2lkdGg7CisgICAgRlRfVVNob3J0ICBtYXhfd2lkdGg7CisgICAgRlRfQnl0ZSAgICBmaXJzdF9jaGFyOworICAgIEZUX0J5dGUgICAgbGFzdF9jaGFyOworICAgIEZUX0J5dGUgICAgZGVmYXVsdF9jaGFyOworICAgIEZUX0J5dGUgICAgYnJlYWtfY2hhcjsKKyAgICBGVF9VU2hvcnQgIGJ5dGVzX3Blcl9yb3c7CisgICAgRlRfVUxvbmcgICBkZXZpY2Vfb2Zmc2V0OworICAgIEZUX1VMb25nICAgZmFjZV9uYW1lX29mZnNldDsKKyAgICBGVF9VTG9uZyAgIGJpdHNfcG9pbnRlcjsKKyAgICBGVF9VTG9uZyAgIGJpdHNfb2Zmc2V0OworICAgIEZUX0J5dGUgICAgcmVzZXJ2ZWQ7CisgICAgRlRfVUxvbmcgICBmbGFnczsKKyAgICBGVF9VU2hvcnQgIEFfc3BhY2U7CisgICAgRlRfVVNob3J0ICBCX3NwYWNlOworICAgIEZUX1VTaG9ydCAgQ19zcGFjZTsKKyAgICBGVF9VU2hvcnQgIGNvbG9yX3RhYmxlX29mZnNldDsKKyAgICBGVF9VTG9uZyAgIHJlc2VydmVkMVs0XTsKKworICB9IEZUX1dpbkZOVF9IZWFkZXJSZWM7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9XaW5GTlRfSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGhhbmRsZSB0byBhbiBARlRfV2luRk5UX0hlYWRlclJlYyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0IEZUX1dpbkZOVF9IZWFkZXJSZWNfKiAgRlRfV2luRk5UX0hlYWRlcjsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICAgRlRfR2V0X1dpbkZOVF9IZWFkZXIKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgICBSZXRyaWV2ZSBhIFdpbmRvd3MgRk5UIGZvbnQgaW5mbyBoZWFkZXIuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICAgZmFjZSAgICA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICAgYWhlYWRlciA6OiBUaGUgV2luRk5UIGhlYWRlci4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGlzIGZ1bmN0aW9uIG9ubHkgd29ya3Mgd2l0aCBXaW5kb3dzIEZOVCBmYWNlcywgcmV0dXJuaW5nIGFuIGVycm9yCisgICAqICAgb3RoZXJ3aXNlLgorICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX0dldF9XaW5GTlRfSGVhZGVyKCBGVF9GYWNlICAgICAgICAgICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX1dpbkZOVF9IZWFkZXJSZWMgICphaGVhZGVyICk7CisKKyAgLyogKi8KKworCitGVF9FTkRfSEVBREVSCisKKyNlbmRpZiAvKiBfX0ZUV0lORk5UX0hfXyAqLworCisKKy8qIEVORCAqLworCisKKy8qIExvY2FsIFZhcmlhYmxlczogKi8KKy8qIGNvZGluZzogdXRmLTggICAgKi8KKy8qIEVuZDogICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvYXV0b2hpbnQuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvYXV0b2hpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDVhOTc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9hdXRvaGludC5oCkBAIC0wLDAgKzEsMjQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBhdXRvaGludC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSGlnaC1sZXZlbCBgYXV0b2hpbnQnIG1vZHVsZS1zcGVjaWZpYyBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgYXV0by1oaW50ZXIgaXMgdXNlZCB0byBsb2FkIGFuZCBhdXRvbWF0aWNhbGx5IGhpbnQgZ2x5cGhzIGlmIGEgICAgKi8KKyAgLyogZm9ybWF0LXNwZWNpZmljIGhpbnRlciBpc24ndCBhdmFpbGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fQVVUT0hJTlRfSF9fCisjZGVmaW5lIF9fQVVUT0hJTlRfSF9fCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEEgc21hbGwgdGVjaG5pY2FsIG5vdGUgcmVnYXJkaW5nIGF1dG9tYXRpYyBoaW50aW5nIGluIG9yZGVyIHRvICAgICAgICAqLworICAvKiBjbGFyaWZ5IHRoaXMgbW9kdWxlIGludGVyZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEFuIGF1dG9tYXRpYyBoaW50ZXIgbWlnaHQgY29tcHV0ZSB0d28ga2luZHMgb2YgZGF0YSBmb3IgYSBnaXZlbiBmYWNlOiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogLSBnbG9iYWwgaGludHM6IFVzdWFsbHkgc29tZSBtZXRyaWNzIHRoYXQgZGVzY3JpYmUgZ2xvYmFsIHByb3BlcnRpZXMgICovCisgIC8qICAgICAgICAgICAgICAgICBvZiB0aGUgZmFjZS4gIEl0IGlzIGNvbXB1dGVkIGJ5IHNjYW5uaW5nIG1vcmUgb3IgbGVzcyAqLworICAvKiAgICAgICAgICAgICAgICAgYWdncmVzc2l2ZWx5IHRoZSBnbHlwaHMgaW4gdGhlIGZhY2UsIGFuZCB0aHVzIGNhbiBiZSAgKi8KKyAgLyogICAgICAgICAgICAgICAgIHZlcnkgc2xvdyB0byBjb21wdXRlIChldmVuIGlmIHRoZSBzaXplIG9mIGdsb2JhbCAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICBoaW50cyBpcyByZWFsbHkgc21hbGwpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogLSBnbHlwaCBoaW50czogIFRoZXNlIGRlc2NyaWJlIHNvbWUgaW1wb3J0YW50IGZlYXR1cmVzIG9mIHRoZSBnbHlwaCAgICovCisgIC8qICAgICAgICAgICAgICAgICBvdXRsaW5lLCBhcyB3ZWxsIGFzIGhvdyB0byBhbGlnbiB0aGVtLiAgVGhleSBhcmUgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgZ2VuZXJhbGx5IG11Y2ggZmFzdGVyIHRvIGNvbXB1dGUgdGhhbiBnbG9iYWwgaGludHMuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoZSBjdXJyZW50IEZyZWVUeXBlIGF1dG8taGludGVyIGRvZXMgYSBwcmV0dHkgZ29vZCBqb2Igd2hpbGUgICAgICAgICAqLworICAvKiBwZXJmb3JtaW5nIGZhc3QgY29tcHV0YXRpb25zIGZvciBib3RoIGdsb2JhbCBhbmQgZ2x5cGggaGludHMuICAgICAgICAgKi8KKyAgLyogSG93ZXZlciwgd2UgbWlnaHQgYmUgaW50ZXJlc3RlZCBpbiBpbnRyb2R1Y2luZyBtb3JlIGNvbXBsZXggYW5kICAgICAgICovCisgIC8qIHBvd2VyZnVsIGFsZ29yaXRobXMgaW4gdGhlIGZ1dHVyZSwgbGlrZSB0aGUgb25lIGRlc2NyaWJlZCBpbiB0aGUgSm9obiAqLworICAvKiBELiBIb2JieSBwYXBlciwgd2hpY2ggdW5mb3J0dW5hdGVseSByZXF1aXJlcyBhIGxvdCBtb3JlIGhvcnNlcG93ZXIuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEJlY2F1c2UgYSBzdWZmaWNpZW50bHkgc29waGlzdGljYXRlZCBmb250IG1hbmFnZW1lbnQgc3lzdGVtIHdvdWxkICAgICAqLworICAvKiB0eXBpY2FsbHkgaW1wbGVtZW50IGFuIExSVSBjYWNoZSBvZiBvcGVuZWQgZmFjZSBvYmplY3RzIHRvIHJlZHVjZSAgICAgKi8KKyAgLyogbWVtb3J5IHVzYWdlLCBpdCBpcyBhIGdvb2QgaWRlYSB0byBiZSBhYmxlIHRvIGF2b2lkIHJlY29tcHV0aW5nICAgICAgICovCisgIC8qIGdsb2JhbCBoaW50cyBldmVyeSB0aW1lIHRoZSBzYW1lIGZhY2UgaXMgcmUtb3BlbmVkLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogV2UgdGh1cyBwcm92aWRlIHRoZSBhYmlsaXR5IHRvIGNhY2hlIGdsb2JhbCBoaW50cyBvdXRzaWRlIG9mIHRoZSBmYWNlICovCisgIC8qIG9iamVjdCwgaW4gb3JkZXIgdG8gc3BlZWQgdXAgZm9udCByZS1vcGVuaW5nIHRpbWUuICBPZiBjb3Vyc2UsIHRoaXMgICAqLworICAvKiBmZWF0dXJlIGlzIHB1cmVseSBvcHRpb25hbCwgc28gbW9zdCBjbGllbnQgcHJvZ3JhbXMgd29uJ3QgZXZlbiBub3RpY2UgKi8KKyAgLyogaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBJIGluaXRpYWxseSB0aG91Z2h0IHRoYXQgaXQgd291bGQgYmUgYSBnb29kIGlkZWEgdG8gY2FjaGUgdGhlIGdseXBoICAgKi8KKyAgLyogaGludHMgdG9vLiAgSG93ZXZlciwgbXkgZ2VuZXJhbCBpZGVhIG5vdyBpcyB0aGF0IGlmIHlvdSByZWFsbHkgbmVlZCAgICovCisgIC8qIHRvIGNhY2hlIHRoZXNlIHRvbywgeW91IGFyZSBzaW1wbHkgaW4gbmVlZCBvZiBhIG5ldyBmb250IGZvcm1hdCwgICAgICAqLworICAvKiB3aGVyZSBhbGwgdGhpcyBpbmZvcm1hdGlvbiBjb3VsZCBiZSBzdG9yZWQgd2l0aGluIHRoZSBmb250IGZpbGUgYW5kICAgKi8KKyAgLyogZGVjb2RlZCBvbiB0aGUgZmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKworCitGVF9CRUdJTl9IRUFERVIKKworCisgIHR5cGVkZWYgc3RydWN0IEZUX0F1dG9IaW50ZXJSZWNfICAqRlRfQXV0b0hpbnRlcjsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0F1dG9IaW50ZXJfR2xvYmFsR2V0RnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJldHJpZXZlIHRoZSBnbG9iYWwgaGludHMgY29tcHV0ZWQgZm9yIGEgZ2l2ZW4gZmFjZSBvYmplY3QuICBUaGUgICAqLworICAvKiAgICByZXN1bHRpbmcgZGF0YSBpcyBkaXNzb2NpYXRlZCBmcm9tIHRoZSBmYWNlIGFuZCB3aWxsIHN1cnZpdmUgYSAgICAgKi8KKyAgLyogICAgY2FsbCB0byBGVF9Eb25lX0ZhY2UoKS4gIEl0IG11c3QgYmUgZGlzY2FyZGVkIHRocm91Z2ggdGhlIEFQSSAgICAgICovCisgIC8qICAgIEZUX0F1dG9IaW50ZXJfR2xvYmFsRG9uZUZ1bmMoKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGhpbnRlciAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGF1dG8taGludGVyLiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2xvYmFsX2hpbnRzIDo6IEEgdHlwZWxlc3MgcG9pbnRlciB0byB0aGUgZ2xvYmFsIGhpbnRzLiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnbG9iYWxfbGVuICAgOjogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGdsb2JhbCBoaW50cy4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgdm9pZAorICAoKkZUX0F1dG9IaW50ZXJfR2xvYmFsR2V0RnVuYykoIEZUX0F1dG9IaW50ZXIgIGhpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiAgICAgICAgIGdsb2JhbF9oaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nKiAgICAgICAgICBnbG9iYWxfbGVuICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9BdXRvSGludGVyX0dsb2JhbERvbmVGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBEaXNjYXJkIHRoZSBnbG9iYWwgaGludHMgcmV0cmlldmVkIHRocm91Z2ggICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfQXV0b0hpbnRlcl9HbG9iYWxHZXRGdW5jKCkuICBUaGlzIGlzIHRoZSBvbmx5IHdheSB0aGVzZSBoaW50cyAgICovCisgIC8qICAgIGFyZSBmcmVlZCBmcm9tIG1lbW9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGhpbnRlciA6OiBBIGhhbmRsZSB0byB0aGUgYXV0by1oaW50ZXIgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2xvYmFsIDo6IEEgcG9pbnRlciB0byByZXRyaWV2ZWQgZ2xvYmFsIGhpbnRzIHRvIGRpc2NhcmQuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHZvaWQKKyAgKCpGVF9BdXRvSGludGVyX0dsb2JhbERvbmVGdW5jKSggRlRfQXV0b0hpbnRlciAgaGludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICBnbG9iYWwgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0F1dG9IaW50ZXJfR2xvYmFsUmVzZXRGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWNvbXB1dGUgdGhlIGdsb2JhbCBtZXRyaWNzIGluIGEgZ2l2ZW4gICAqLworICAvKiAgICBmb250LiAgVGhpcyBpcyB1c2VmdWwgd2hlbiBnbG9iYWwgZm9udCBkYXRhIGNoYW5nZXMgKGUuZy4gTXVsdGlwbGUgKi8KKyAgLyogICAgTWFzdGVycyBmb250cyB3aGVyZSBibGVuZCBjb29yZGluYXRlcyBjaGFuZ2UpLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaGludGVyIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgYXV0by1oaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgdm9pZAorICAoKkZUX0F1dG9IaW50ZXJfR2xvYmFsUmVzZXRGdW5jKSggRlRfQXV0b0hpbnRlciAgaGludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgZmFjZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfQXV0b0hpbnRlcl9HbHlwaExvYWRGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGxvYWQsIHNjYWxlLCBhbmQgYXV0b21hdGljYWxseSBoaW50IGEgICAgICovCisgIC8qICAgIGdseXBoIGZyb20gYSBnaXZlbiBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGhfaW5kZXggOjogVGhlIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsb2FkX2ZsYWdzICA6OiBUaGUgbG9hZCBmbGFncy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhcGFibGUgb2YgbG9hZGluZyBjb21wb3NpdGUgZ2x5cGhzIGJ5IGhpbnRpbmcgICAgKi8KKyAgLyogICAgZWFjaCBzdWItZ2x5cGggaW5kZXBlbmRlbnRseSAod2hpY2ggaW1wcm92ZXMgcXVhbGl0eSkuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBJdCB3aWxsIGNhbGwgdGhlIGZvbnQgZHJpdmVyIHdpdGggQEZUX0xvYWRfR2x5cGgsIHdpdGggICAgICAgICAgICAgKi8KKyAgLyogICAgQEZUX0xPQURfTk9fU0NBTEUgc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqRlRfQXV0b0hpbnRlcl9HbHlwaExvYWRGdW5jKSggRlRfQXV0b0hpbnRlciAgaGludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZSAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICBnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgICAgICBsb2FkX2ZsYWdzICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9BdXRvSGludGVyX0ludGVyZmFjZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgYXV0by1oaW50ZXIgbW9kdWxlJ3MgaW50ZXJmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBGVF9BdXRvSGludGVyX0ludGVyZmFjZVJlY18KKyAgeworICAgIEZUX0F1dG9IaW50ZXJfR2xvYmFsUmVzZXRGdW5jICByZXNldF9mYWNlOworICAgIEZUX0F1dG9IaW50ZXJfR2xvYmFsR2V0RnVuYyAgICBnZXRfZ2xvYmFsX2hpbnRzOworICAgIEZUX0F1dG9IaW50ZXJfR2xvYmFsRG9uZUZ1bmMgICBkb25lX2dsb2JhbF9oaW50czsKKyAgICBGVF9BdXRvSGludGVyX0dseXBoTG9hZEZ1bmMgICAgbG9hZF9nbHlwaDsKKworICB9IEZUX0F1dG9IaW50ZXJfSW50ZXJmYWNlUmVjLCAqRlRfQXV0b0hpbnRlcl9JbnRlcmZhY2U7CisKKworI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQworCisjZGVmaW5lIEZUX0RFRklORV9BVVRPSElOVEVSX0lOVEVSRkFDRSggICAgICAgXAorICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICByZXNldF9mYWNlXywgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZ2V0X2dsb2JhbF9oaW50c18sICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGRvbmVfZ2xvYmFsX2hpbnRzXywgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBsb2FkX2dseXBoXyApICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0NBTExCQUNLX1RBQkxFX0RFRiAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBGVF9BdXRvSGludGVyX0ludGVyZmFjZVJlYyAgY2xhc3NfID0gIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVzZXRfZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdldF9nbG9iYWxfaGludHNfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkb25lX2dsb2JhbF9oaW50c18sICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbG9hZF9nbHlwaF8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OworCisjZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLworCisjZGVmaW5lIEZUX0RFRklORV9BVVRPSElOVEVSX0lOVEVSRkFDRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICByZXNldF9mYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZ2V0X2dsb2JhbF9oaW50c18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGRvbmVfZ2xvYmFsX2hpbnRzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBsb2FkX2dseXBoXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgICAgICAgICAgbGlicmFyeSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9BdXRvSGludGVyX0ludGVyZmFjZVJlYyogIGNsYXp6ICkgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZUX1VOVVNFRCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPnJlc2V0X2ZhY2UgICAgICAgID0gcmVzZXRfZmFjZV87ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5nZXRfZ2xvYmFsX2hpbnRzICA9IGdldF9nbG9iYWxfaGludHNfOyAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+ZG9uZV9nbG9iYWxfaGludHMgPSBkb25lX2dsb2JhbF9oaW50c187ICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPmxvYWRfZ2x5cGggICAgICAgID0gbG9hZF9nbHlwaF87ICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLworCitGVF9FTkRfSEVBREVSCisKKyNlbmRpZiAvKiBfX0FVVE9ISU5UX0hfXyAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRjYWxjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdhZGU3ZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRjYWxjLmgKQEAgLTAsMCArMSw0MTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0Y2FsYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBcml0aG1ldGljIGNvbXB1dGF0aW9ucyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0ZUQ0FMQ19IX18KKyNkZWZpbmUgX19GVENBTENfSF9fCisKKworI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CisjaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisKKworRlRfQkVHSU5fSEVBREVSCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEZUX011bERpdigpIGFuZCBGVF9NdWxGaXgoKSBhcmUgZGVjbGFyZWQgaW4gZnJlZXR5cGUuaC4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgIEZUX0NPTkZJR19PUFRJT05fTk9fQVNTRU1CTEVSCisgIC8qIFByb3ZpZGUgYXNzZW1ibGVyIGZyYWdtZW50cyBmb3IgcGVyZm9ybWFuY2UtY3JpdGljYWwgZnVuY3Rpb25zLiAqLworICAvKiBUaGVzZSBtdXN0IGJlIGRlZmluZWQgYHN0YXRpYyBfX2lubGluZV9fJyB3aXRoIEdDQy4gICAgICAgICAgICAgKi8KKworI2lmIGRlZmluZWQoIF9fQ0NfQVJNICkgfHwgZGVmaW5lZCggX19BUk1DQ19fICkgIC8qIFJWQ1QgKi8KKworI2RlZmluZSBGVF9NVUxGSVhfQVNTRU1CTEVSICBGVF9NdWxGaXhfYXJtCisKKyAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCisKKyAgc3RhdGljIF9faW5saW5lIEZUX0ludDMyCisgIEZUX011bEZpeF9hcm0oIEZUX0ludDMyICBhLAorICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgYiApCisgIHsKKyAgICByZWdpc3RlciBGVF9JbnQzMiAgdCwgdDI7CisKKworICAgIF9fYXNtCisgICAgeworICAgICAgc211bGwgdDIsIHQsICBiLCAgYSAgICAgICAgICAgLyogKGxvPXQyLGhpPXQpID0gYSpiICovCisgICAgICBtb3YgICBhLCAgdCwgIGFzciAjMzEgICAgICAgICAvKiBhICAgPSAoaGkgPj4gMzEpICovCisgICAgICBhZGQgICBhLCAgYSwgICMweDgwMDAgICAgICAgICAvKiBhICArPSAweDgwMDAgKi8KKyAgICAgIGFkZHMgIHQyLCB0MiwgYSAgICAgICAgICAgICAgIC8qIHQyICs9IGEgKi8KKyAgICAgIGFkYyAgIHQsICB0LCAgIzAgICAgICAgICAgICAgIC8qIHQgICs9IGNhcnJ5ICovCisgICAgICBtb3YgICBhLCAgdDIsIGxzciAjMTYgICAgICAgICAvKiBhICAgPSB0MiA+PiAxNiAqLworICAgICAgb3JyICAgYSwgIGEsICB0LCAgbHNsICMxNiAgICAgLyogYSAgfD0gdCA8PCAxNiAqLworICAgIH0KKyAgICByZXR1cm4gYTsKKyAgfQorCisjZW5kaWYgLyogX19DQ19BUk0gfHwgX19BUk1DQ19fICovCisKKworI2lmZGVmIF9fR05VQ19fCisKKyNpZiBkZWZpbmVkKCBfX2FybV9fICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBcCisgICAgKCAhZGVmaW5lZCggX190aHVtYl9fICkgfHwgZGVmaW5lZCggX190aHVtYjJfXyApICkgJiYgXAorICAgICEoIGRlZmluZWQoIF9fQ0NfQVJNICkgfHwgZGVmaW5lZCggX19BUk1DQ19fICkgKQorCisjZGVmaW5lIEZUX01VTEZJWF9BU1NFTUJMRVIgIEZUX011bEZpeF9hcm0KKworICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KKworICBzdGF0aWMgX19pbmxpbmVfXyBGVF9JbnQzMgorICBGVF9NdWxGaXhfYXJtKCBGVF9JbnQzMiAgYSwKKyAgICAgICAgICAgICAgICAgRlRfSW50MzIgIGIgKQorICB7CisgICAgcmVnaXN0ZXIgRlRfSW50MzIgIHQsIHQyOworCisKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisgICAgICAic211bGwgICUxLCAlMiwgJTQsICUzXG5cdCIgICAgICAgLyogKGxvPSUxLGhpPSUyKSA9IGEqYiAqLworICAgICAgIm1vdiAgICAlMCwgJTIsIGFzciAjMzFcblx0IiAgICAgIC8qICUwICA9IChoaSA+PiAzMSkgKi8KKyNpZiBkZWZpbmVkKCBfX2NsYW5nX18gKSAmJiBkZWZpbmVkKCBfX3RodW1iMl9fICkKKyAgICAgICJhZGQudyAgJTAsICUwLCAjMHg4MDAwXG5cdCIgICAgICAvKiAlMCArPSAweDgwMDAgKi8KKyNlbHNlCisgICAgICAiYWRkICAgICUwLCAlMCwgIzB4ODAwMFxuXHQiICAgICAgLyogJTAgKz0gMHg4MDAwICovCisjZW5kaWYKKyAgICAgICJhZGRzICAgJTEsICUxLCAlMFxuXHQiICAgICAgICAgICAvKiAlMSArPSAlMCAqLworICAgICAgImFkYyAgICAlMiwgJTIsICMwXG5cdCIgICAgICAgICAgIC8qICUyICs9IGNhcnJ5ICovCisgICAgICAibW92ICAgICUwLCAlMSwgbHNyICMxNlxuXHQiICAgICAgLyogJTAgID0gJTEgPj4gMTYgKi8KKyAgICAgICJvcnIgICAgJTAsICUwLCAlMiwgbHNsICMxNlxuXHQiICAvKiAlMCB8PSAlMiA8PCAxNiAqLworICAgICAgOiAiPXIiKGEpLCAiPSZyIih0MiksICI9JnIiKHQpCisgICAgICA6ICJyIihhKSwgInIiKGIpCisgICAgICA6ICJjYyIgKTsKKyAgICByZXR1cm4gYTsKKyAgfQorCisjZW5kaWYgLyogX19hcm1fXyAgICAgICAgICAgICAgICAgICAgICAmJiAqLworICAgICAgIC8qICggX190aHVtYjJfXyB8fCAhX190aHVtYl9fICkgJiYgKi8KKyAgICAgICAvKiAhKCBfX0NDX0FSTSB8fCBfX0FSTUNDX18gKSAgICAgICovCisKKworI2lmIGRlZmluZWQoIF9faTM4Nl9fICkKKworI2RlZmluZSBGVF9NVUxGSVhfQVNTRU1CTEVSICBGVF9NdWxGaXhfaTM4NgorCisgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLworCisgIHN0YXRpYyBfX2lubGluZV9fIEZUX0ludDMyCisgIEZUX011bEZpeF9pMzg2KCBGVF9JbnQzMiAgYSwKKyAgICAgICAgICAgICAgICAgIEZUX0ludDMyICBiICkKKyAgeworICAgIHJlZ2lzdGVyIEZUX0ludDMyICByZXN1bHQ7CisKKworICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICJpbXVsICAlJWVkeFxuIgorICAgICAgIm1vdmwgICUlZWR4LCAlJWVjeFxuIgorICAgICAgInNhcmwgICQzMSwgJSVlY3hcbiIKKyAgICAgICJhZGRsICAkMHg4MDAwLCAlJWVjeFxuIgorICAgICAgImFkZGwgICUlZWN4LCAlJWVheFxuIgorICAgICAgImFkY2wgICQwLCAlJWVkeFxuIgorICAgICAgInNocmwgICQxNiwgJSVlYXhcbiIKKyAgICAgICJzaGxsICAkMTYsICUlZWR4XG4iCisgICAgICAiYWRkbCAgJSVlZHgsICUlZWF4XG4iCisgICAgICA6ICI9YSIocmVzdWx0KSwgIj1kIihiKQorICAgICAgOiAiYSIoYSksICJkIihiKQorICAgICAgOiAiJWVjeCIsICJjYyIgKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyNlbmRpZiAvKiBpMzg2ICovCisKKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworCisKKyNpZmRlZiBfTVNDX1ZFUiAvKiBWaXN1YWwgQysrICovCisKKyNpZmRlZiBfTV9JWDg2CisKKyNkZWZpbmUgRlRfTVVMRklYX0FTU0VNQkxFUiAgRlRfTXVsRml4X2kzODYKKworICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KKworICBzdGF0aWMgX19pbmxpbmUgRlRfSW50MzIKKyAgRlRfTXVsRml4X2kzODYoIEZUX0ludDMyICBhLAorICAgICAgICAgICAgICAgICAgRlRfSW50MzIgIGIgKQorICB7CisgICAgcmVnaXN0ZXIgRlRfSW50MzIgIHJlc3VsdDsKKworICAgIF9fYXNtCisgICAgeworICAgICAgbW92IGVheCwgYQorICAgICAgbW92IGVkeCwgYgorICAgICAgaW11bCBlZHgKKyAgICAgIG1vdiBlY3gsIGVkeAorICAgICAgc2FyIGVjeCwgMzEKKyAgICAgIGFkZCBlY3gsIDgwMDBoCisgICAgICBhZGQgZWF4LCBlY3gKKyAgICAgIGFkYyBlZHgsIDAKKyAgICAgIHNociBlYXgsIDE2CisgICAgICBzaGwgZWR4LCAxNgorICAgICAgYWRkIGVheCwgZWR4CisgICAgICBtb3YgcmVzdWx0LCBlYXgKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisjZW5kaWYgLyogX01fSVg4NiAqLworCisjZW5kaWYgLyogX01TQ19WRVIgKi8KKworCisjaWYgZGVmaW5lZCggX19HTlVDX18gKSAmJiBkZWZpbmVkKCBfX3g4Nl82NF9fICkKKworI2RlZmluZSBGVF9NVUxGSVhfQVNTRU1CTEVSICBGVF9NdWxGaXhfeDg2XzY0CisKKyAgc3RhdGljIF9faW5saW5lX18gRlRfSW50MzIKKyAgRlRfTXVsRml4X3g4Nl82NCggRlRfSW50MzIgIGEsCisgICAgICAgICAgICAgICAgICAgIEZUX0ludDMyICBiICkKKyAgeworICAgIC8qIFRlbXBvcmFyaWx5IGRpc2FibGUgdGhlIHdhcm5pbmcgdGhhdCBDOTAgZG9lc24ndCBzdXBwb3J0ICovCisgICAgLyogYGxvbmcgbG9uZycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZiBfX0dOVUNfXyA+IDQgfHwgKCBfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDYgKQorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XbG9uZy1sb25nIgorI2VuZGlmCisKKyNpZiAxCisgICAgLyogVGVjaG5pY2FsbHkgbm90IGFuIGFzc2VtYmx5IGZyYWdtZW50LCBidXQgR0NDIGRvZXMgYSByZWFsbHkgZ29vZCAqLworICAgIC8qIGpvYiBhdCBpbmxpbmluZyBpdCBhbmQgZ2VuZXJhdGluZyBnb29kIG1hY2hpbmUgY29kZSBmb3IgaXQuICAgICAgKi8KKyAgICBsb25nIGxvbmcgIHJldCwgdG1wOworCisKKyAgICByZXQgID0gKGxvbmcgbG9uZylhICogYjsKKyAgICB0bXAgID0gcmV0ID4+IDYzOworICAgIHJldCArPSAweDgwMDAgKyB0bXA7CisKKyAgICByZXR1cm4gKEZUX0ludDMyKSggcmV0ID4+IDE2ICk7CisjZWxzZQorCisgICAgLyogRm9yIHNvbWUgcmVhc29uLCBHQ0MgNC42IG9uIFVidW50dSAxMi4wNCBnZW5lcmF0ZXMgaW52YWxpZCBtYWNoaW5lICAqLworICAgIC8qIGNvZGUgZnJvbSB0aGUgbGluZXMgYmVsb3cuICBUaGUgbWFpbiBpc3N1ZSBpcyB0aGF0IGB3aWRlX2EnIGlzIG5vdCAgKi8KKyAgICAvKiBwcm9wZXJseSBpbml0aWFsaXplZCBieSBzaWduLWV4dGVuZGluZyBgYScuICBJbnN0ZWFkLCB0aGUgZ2VuZXJhdGVkICovCisgICAgLyogbWFjaGluZSBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgcmVnaXN0ZXIgdGhhdCBjb250YWlucyBgYScgb24gaW5wdXQgICAqLworICAgIC8qIGNhbiBiZSB1c2VkIGRpcmVjdGx5IGFzIGEgNjQtYml0IHZhbHVlLCB3aGljaCBpcyB3cm9uZyBtb3N0IG9mIHRoZSAgKi8KKyAgICAvKiB0aW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgbG9uZyBsb25nICB3aWRlX2EgPSAobG9uZyBsb25nKWE7CisgICAgbG9uZyBsb25nICB3aWRlX2IgPSAobG9uZyBsb25nKWI7CisgICAgbG9uZyBsb25nICByZXN1bHQ7CisKKworICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKKyAgICAgICJpbXVsICUyLCAlMVxuIgorICAgICAgIm1vdiAlMSwgJTBcbiIKKyAgICAgICJzYXIgJDYzLCAlMFxuIgorICAgICAgImxlYSAweDgwMDAoJTEsICUwKSwgJTBcbiIKKyAgICAgICJzYXIgJDE2LCAlMFxuIgorICAgICAgOiAiPSZyIihyZXN1bHQpLCAiPSZyIih3aWRlX2EpCisgICAgICA6ICJyIih3aWRlX2IpCisgICAgICA6ICJjYyIgKTsKKworICAgIHJldHVybiAoRlRfSW50MzIpcmVzdWx0OworI2VuZGlmCisKKyNpZiBfX0dOVUNfXyA+IDQgfHwgKCBfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDYgKQorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorICB9CisKKyNlbmRpZiAvKiBfX0dOVUNfXyAmJiBfX3g4Nl82NF9fICovCisKKyNlbmRpZiAvKiAhRlRfQ09ORklHX09QVElPTl9OT19BU1NFTUJMRVIgKi8KKworCisjaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkxJTkVfTVVMRklYCisjaWZkZWYgRlRfTVVMRklYX0FTU0VNQkxFUgorI2RlZmluZSBGVF9NdWxGaXgoIGEsIGIgKSAgRlRfTVVMRklYX0FTU0VNQkxFUiggKEZUX0ludDMyKShhKSwgKEZUX0ludDMyKShiKSApCisjZW5kaWYKKyNlbmRpZgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTXVsRGl2X05vX1JvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSB2ZXJ5IHNpbXBsZSBmdW5jdGlvbiB1c2VkIHRvIHBlcmZvcm0gdGhlIGNvbXB1dGF0aW9uIGAoYSpiKS9jJyAgICovCisgIC8qICAgICh3aXRob3V0IHJvdW5kaW5nKSB3aXRoIG1heGltdW0gYWNjdXJhY3kgKGl0IHVzZXMgYSA2NC1iaXQgICAgICAgICAqLworICAvKiAgICBpbnRlcm1lZGlhdGUgaW50ZWdlciB3aGVuZXZlciBuZWNlc3NhcnkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gaXNuJ3QgbmVjZXNzYXJpbHkgYXMgZmFzdCBhcyBzb21lIHByb2Nlc3NvciBzcGVjaWZpYyAqLworICAvKiAgICBvcGVyYXRpb25zLCBidXQgaXMgYXQgbGVhc3QgY29tcGxldGVseSBwb3J0YWJsZS4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhIDo6IFRoZSBmaXJzdCBtdWx0aXBsaWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYiA6OiBUaGUgc2Vjb25kIG11bHRpcGxpZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGMgOjogVGhlIGRpdmlzb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSByZXN1bHQgb2YgYChhKmIpL2MnLiAgVGhpcyBmdW5jdGlvbiBuZXZlciB0cmFwcyB3aGVuIHRyeWluZyB0byAqLworICAvKiAgICBkaXZpZGUgYnkgemVybzsgaXQgc2ltcGx5IHJldHVybnMgYE1heEludCcgb3IgYE1pbkludCcgZGVwZW5kaW5nICAgKi8KKyAgLyogICAgb24gdGhlIHNpZ25zIG9mIGBhJyBhbmQgYGInLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9CQVNFKCBGVF9Mb25nICkKKyAgRlRfTXVsRGl2X05vX1JvdW5kKCBGVF9Mb25nICBhLAorICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgIGIsCisgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgYyApOworCisKKyAgLyoKKyAgICogIEEgdmFyaWFudCBvZiBGVF9NYXRyaXhfTXVsdGlwbHkgd2hpY2ggc2NhbGVzIGl0cyByZXN1bHQgYWZ0ZXJ3YXJkcy4KKyAgICogIFRoZSBpZGVhIGlzIHRoYXQgYm90aCBgYScgYW5kIGBiJyBhcmUgc2NhbGVkIGJ5IGZhY3RvcnMgb2YgMTAgc28gdGhhdAorICAgKiAgdGhlIHZhbHVlcyBhcmUgYXMgcHJlY2lzZSBhcyBwb3NzaWJsZSB0byBnZXQgYSBjb3JyZWN0IHJlc3VsdCBkdXJpbmcKKyAgICogIHRoZSA2NGJpdCBtdWx0aXBsaWNhdGlvbi4gIExldCBgc2EnIGFuZCBgc2InIGJlIHRoZSBzY2FsaW5nIGZhY3RvcnMgb2YKKyAgICogIGBhJyBhbmQgYGInLCByZXNwZWN0aXZlbHksIHRoZW4gdGhlIHNjYWxpbmcgZmFjdG9yIG9mIHRoZSByZXN1bHQgaXMKKyAgICogIGBzYSpzYicuCisgICAqLworICBGVF9CQVNFKCB2b2lkICkKKyAgRlRfTWF0cml4X011bHRpcGx5X1NjYWxlZCggY29uc3QgRlRfTWF0cml4KiAgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWF0cml4ICAgICAgICAqYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgICAgc2NhbGluZyApOworCisKKyAgLyoKKyAgICogIEEgdmFyaWFudCBvZiBGVF9WZWN0b3JfVHJhbnNmb3JtLiAgU2VlIGNvbW1lbnRzIGZvcgorICAgKiAgRlRfTWF0cml4X011bHRpcGx5X1NjYWxlZC4KKyAgICovCisgIEZUX0JBU0UoIHZvaWQgKQorICBGVF9WZWN0b3JfVHJhbnNmb3JtX1NjYWxlZCggRlRfVmVjdG9yKiAgICAgICAgdmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfTWF0cml4KiAgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgICAgc2NhbGluZyApOworCisKKyAgLyoKKyAgICogIFRoaXMgZnVuY3Rpb24gbm9ybWFsaXplcyBhIHZlY3RvciBhbmQgcmV0dXJucyBpdHMgb3JpZ2luYWwgbGVuZ3RoLgorICAgKiAgVGhlIG5vcm1hbGl6ZWQgdmVjdG9yIGlzIGEgMTYuMTYgZml4ZWQtcG9pbnQgdW5pdCB2ZWN0b3Igd2l0aCBsZW5ndGgKKyAgICogIGNsb3NlIHRvIDB4MTAwMDAuICBUaGUgYWNjdXJhY3kgb2YgdGhlIHJldHVybmVkIGxlbmd0aCBpcyBsaW1pdGVkIHRvCisgICAqICAxNiBiaXRzIGFsc28uICBUaGUgZnVuY3Rpb24gdXRpbGl6ZXMgcXVpY2sgaW52ZXJzZSBzcXVhcmUgcm9vdAorICAgKiAgYXBwcm94aW1hdGlvbiB3aXRob3V0IGRpdmlzaW9ucyBhbmQgc3F1YXJlIHJvb3RzIHJlbHlpbmcgb24gTmV3dG9uJ3MKKyAgICogIGl0ZXJhdGlvbnMgaW5zdGVhZC4KKyAgICovCisgIEZUX0JBU0UoIEZUX1VJbnQzMiApCisgIEZUX1ZlY3Rvcl9Ob3JtTGVuKCBGVF9WZWN0b3IqICB2ZWN0b3IgKTsKKworCisgIC8qCisgICAqICBSZXR1cm4gLTEsIDAsIG9yICsxLCBkZXBlbmRpbmcgb24gdGhlIG9yaWVudGF0aW9uIG9mIGEgZ2l2ZW4gY29ybmVyLgorICAgKiAgV2UgdXNlIHRoZSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSBzeXN0ZW0sIHdpdGggcG9zaXRpdmUgdmVydGljYWwgdmFsdWVzCisgICAqICBnb2luZyB1cHdhcmRzLiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgKzEgaWYgdGhlIGNvcm5lciB0dXJucyB0byB0aGUKKyAgICogIGxlZnQsIC0xIHRvIHRoZSByaWdodCwgYW5kIDAgZm9yIHVuZGVjaWRhYmxlIGNhc2VzLgorICAgKi8KKyAgRlRfQkFTRSggRlRfSW50ICkKKyAgZnRfY29ybmVyX29yaWVudGF0aW9uKCBGVF9Qb3MgIGluX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBpbl95LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgb3V0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBvdXRfeSApOworCisKKyAgLyoKKyAgICogIFJldHVybiBUUlVFIGlmIGEgY29ybmVyIGlzIGZsYXQgb3IgbmVhcmx5IGZsYXQuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAgICogIHNheWluZyB0aGF0IHRoZSBjb3JuZXIgcG9pbnQgaXMgY2xvc2UgdG8gaXRzIG5laWdoYm9ycywgb3IgaW5zaWRlIGFuCisgICAqICBlbGxpcHNlIGRlZmluZWQgYnkgdGhlIG5laWdoYm9yIGZvY2FsIHBvaW50cyB0byBiZSBtb3JlIHByZWNpc2UuCisgICAqLworICBGVF9CQVNFKCBGVF9JbnQgKQorICBmdF9jb3JuZXJfaXNfZmxhdCggRlRfUG9zICBpbl94LAorICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBpbl95LAorICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBvdXRfeCwKKyAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgb3V0X3kgKTsKKworCisgIC8qCisgICAqICBSZXR1cm4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGluZGV4LgorICAgKi8KKworI2lmbmRlZiAgRlRfQ09ORklHX09QVElPTl9OT19BU1NFTUJMRVIKKyNpZiBkZWZpbmVkKCBfX0dOVUNfXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgXAorICAgICggX19HTlVDX18gPiAzIHx8ICggX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA+PSA0ICkgKQorCisjaWYgRlRfU0laRU9GX0lOVCA9PSA0CisKKyNkZWZpbmUgRlRfTVNCKCB4ICkgICggMzEgLSBfX2J1aWx0aW5fY2x6KCB4ICkgKQorCisjZWxpZiBGVF9TSVpFT0ZfTE9ORyA9PSA0CisKKyNkZWZpbmUgRlRfTVNCKCB4ICkgICggMzEgLSBfX2J1aWx0aW5fY2x6bCggeCApICkKKworI2VuZGlmCisKKyNlbmRpZiAvKiBfX0dOVUNfXyAqLworI2VuZGlmIC8qICFGVF9DT05GSUdfT1BUSU9OX05PX0FTU0VNQkxFUiAqLworCisjaWZuZGVmIEZUX01TQgorCisgIEZUX0JBU0UoIEZUX0ludCApCisgIEZUX01TQiggRlRfVUludDMyICB6ICk7CisKKyNlbmRpZgorCisKKyAgLyoKKyAgICogIFJldHVybiBzcXJ0KHgqeCt5KnkpLCB3aGljaCBpcyB0aGUgc2FtZSBhcyBgRlRfVmVjdG9yX0xlbmd0aCcgYnV0IHVzZXMKKyAgICogIHR3byBmaXhlZC1wb2ludCBhcmd1bWVudHMgaW5zdGVhZC4KKyAgICovCisgIEZUX0JBU0UoIEZUX0ZpeGVkICkKKyAgRlRfSHlwb3QoIEZUX0ZpeGVkICB4LAorICAgICAgICAgICAgRlRfRml4ZWQgIHkgKTsKKworCisjaWYgMAorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1NxcnRGaXhlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENvbXB1dGVzIHRoZSBzcXVhcmUgcm9vdCBvZiBhIDE2LjE2IGZpeGVkLXBvaW50IHZhbHVlLiAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHggOjogVGhlIHZhbHVlIHRvIGNvbXB1dGUgdGhlIHJvb3QgZm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSByZXN1bHQgb2YgYHNxcnQoeCknLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHZlcnkgZmFzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfQkFTRSggRlRfSW50MzIgKQorICBGVF9TcXJ0Rml4ZWQoIEZUX0ludDMyICB4ICk7CisKKyNlbmRpZiAvKiAwICovCisKKworI2RlZmluZSBJTlRfVE9fRjI2RE9UNiggeCApICAgICggKEZUX0xvbmcpKHgpIDw8IDYgICkKKyNkZWZpbmUgSU5UX1RPX0YyRE9UMTQoIHggKSAgICAoIChGVF9Mb25nKSh4KSA8PCAxNCApCisjZGVmaW5lIElOVF9UT19GSVhFRCggeCApICAgICAgKCAoRlRfTG9uZykoeCkgPDwgMTYgKQorI2RlZmluZSBGMkRPVDE0X1RPX0ZJWEVEKCB4ICkgICggKEZUX0xvbmcpKHgpIDw8IDIgICkKKyNkZWZpbmUgRkxPQVRfVE9fRklYRUQoIHggKSAgICAoIChGVF9Mb25nKSggeCAqIDY1NTM2LjAgKSApCisjZGVmaW5lIEZJWEVEX1RPX0lOVCggeCApICAgICAgKCBGVF9Sb3VuZEZpeCggeCApID4+IDE2ICkKKworI2RlZmluZSBST1VORF9GMjZET1Q2KCB4ICkgICAgICggeCA+PSAwID8gKCAgICAoICh4KSArIDMyICkgJiAtNjQgKSAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKCAtKCAoIDMyIC0gKHgpICkgJiAtNjQgKSApICkKKworCitGVF9FTkRfSEVBREVSCisKKyNlbmRpZiAvKiBfX0ZUQ0FMQ19IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2YzczMAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oCkBAIC0wLDAgKzEsMjU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBmdGRlYnVnLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRGVidWdnaW5nIGFuZCBsb2dnaW5nIGNvbXBvbmVudCAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIElNUE9SVEFOVDogQSBkZXNjcmlwdGlvbiBvZiBGcmVlVHlwZSdzIGRlYnVnZ2luZyBzdXBwb3J0IGNhbiBiZSAgICAgICAgKi8KKy8qICAgICAgICAgICAgIGZvdW5kIGluIGBkb2NzL0RFQlVHLlRYVCcuICBSZWFkIGl0IGlmIHlvdSBuZWVkIHRvIHVzZSBvciAgICovCisvKiAgICAgICAgICAgICB1bmRlcnN0YW5kIHRoaXMgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0ZUREVCVUdfSF9fCisjZGVmaW5lIF9fRlRERUJVR19IX18KKworCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAorI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyAgLyogZm9yY2UgdGhlIGRlZmluaXRpb24gb2YgRlRfREVCVUdfTEVWRUxfRVJST1IgaWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KKyAgLyogaXMgYWxyZWFkeSBkZWZpbmVkOyB0aGlzIHNpbXBsaWZpZXMgdGhlIGZvbGxvd2luZyAjaWZkZWZzICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQorI3VuZGVmICBGVF9ERUJVR19MRVZFTF9FUlJPUgorI2RlZmluZSBGVF9ERUJVR19MRVZFTF9FUlJPUgorI2VuZGlmCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIERlZmluZSB0aGUgdHJhY2UgZW51bXMgYXMgd2VsbCBhcyB0aGUgdHJhY2UgbGV2ZWxzIGFycmF5IHdoZW4gdGhleSAgICAqLworICAvKiBhcmUgbmVlZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKKworI2RlZmluZSBGVF9UUkFDRV9ERUYoIHggKSAgdHJhY2VfICMjIHggLAorCisgIC8qIGRlZmluaW5nIHRoZSBlbnVtZXJhdGlvbiAqLworICB0eXBlZGVmIGVudW0gIEZUX1RyYWNlXworICB7CisjaW5jbHVkZSBGVF9JTlRFUk5BTF9UUkFDRV9ICisgICAgdHJhY2VfY291bnQKKworICB9IEZUX1RyYWNlOworCisKKyAgLyogZGVmaW5pbmcgdGhlIGFycmF5IG9mIHRyYWNlIGxldmVscywgcHJvdmlkZWQgYnkgYHNyYy9iYXNlL2Z0ZGVidWcuYycgKi8KKyAgZXh0ZXJuIGludCAgZnRfdHJhY2VfbGV2ZWxzW3RyYWNlX2NvdW50XTsKKworI3VuZGVmIEZUX1RSQUNFX0RFRgorCisjZW5kaWYgLyogRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRGVmaW5lIHRoZSBGVF9UUkFDRSBtYWNybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBJTVBPUlRBTlQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEVhY2ggY29tcG9uZW50IG11c3QgZGVmaW5lIHRoZSBtYWNybyBGVF9DT01QT05FTlQgdG8gYSB2YWxpZCBGVF9UcmFjZSAqLworICAvKiB2YWx1ZSBiZWZvcmUgdXNpbmcgYW55IFRSQUNFIG1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKKworI2RlZmluZSBGVF9UUkFDRSggbGV2ZWwsIHZhcmZvcm1hdCApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCBmdF90cmFjZV9sZXZlbHNbRlRfQ09NUE9ORU5UXSA+PSBsZXZlbCApIFwKKyAgICAgICAgICAgICAgRlRfTWVzc2FnZSB2YXJmb3JtYXQ7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgfSB3aGlsZSAoIDAgKQorCisjZWxzZSAvKiAhRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KKworI2RlZmluZSBGVF9UUkFDRSggbGV2ZWwsIHZhcmZvcm1hdCApICBkbyB7IH0gd2hpbGUgKCAwICkgICAgICAvKiBub3RoaW5nICovCisKKyNlbmRpZiAvKiAhRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1RyYWNlX0dldF9Db3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSB0cmFjZSBjb21wb25lbnRzLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBudW1iZXIgb2YgdHJhY2UgY29tcG9uZW50cy4gIDAgaWYgRnJlZVR5cGUgMiBpcyBub3QgYnVpbHQgd2l0aCAqLworICAvKiAgICBGVF9ERUJVR19MRVZFTF9UUkFDRSBkZWZpbml0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gYWNjZXNzIGVsZW1lbnRzIG9mICAgICAgKi8KKyAgLyogICAgdGhlIGludGVybmFsIGBmdF90cmFjZV9sZXZlbHMnIGFycmF5IGJ5IGFuIGluZGV4LiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9CQVNFKCBGVF9JbnQgKQorICBGVF9UcmFjZV9HZXRfQ291bnQoIHZvaWQgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1RyYWNlX0dldF9OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFJldHVybiB0aGUgbmFtZSBvZiBhIHRyYWNlIGNvbXBvbmVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBpbmRleCBvZiB0aGUgdHJhY2UgY29tcG9uZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBuYW1lIG9mIHRoZSB0cmFjZSBjb21wb25lbnQuICBUaGlzIGlzIGEgc3RhdGljYWxseSBhbGxvY2F0ZWQgICAqLworICAvKiAgICBDIHN0cmluZywgc28gZG8gbm90IGZyZWUgaXQgYWZ0ZXIgdXNlLiAgTlVMTCBpZiBGcmVlVHlwZSAyIGlzIG5vdCAgKi8KKyAgLyogICAgYnVpbHQgd2l0aCBGVF9ERUJVR19MRVZFTF9UUkFDRSBkZWZpbml0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVXNlIEBGVF9UcmFjZV9HZXRfQ291bnQgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHRyYWNlICAgICAgICovCisgIC8qICAgIGNvbXBvbmVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGNvbnRyb2wgRnJlZVR5cGUgMidzICAgICovCisgIC8qICAgIGRlYnVnIGxldmVsIGluIHlvdXIgYXBwbGljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfQkFTRSggY29uc3QgY2hhciogKQorICBGVF9UcmFjZV9HZXRfTmFtZSggRlRfSW50ICBpZHggKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogWW91IG5lZWQgdHdvIG9wZW5pbmcgYW5kIGNsb3NpbmcgcGFyZW50aGVzZXMhICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBFeGFtcGxlOiBGVF9UUkFDRTAoKCAiVmFsdWUgaXMgJWkiLCBmb28gKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE91dHB1dCBvZiB0aGUgRlRfVFJBQ0VYIG1hY3JvcyBpcyBzZW50IHRvIHN0ZGVyci4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRlRfVFJBQ0UwKCB2YXJmb3JtYXQgKSAgRlRfVFJBQ0UoIDAsIHZhcmZvcm1hdCApCisjZGVmaW5lIEZUX1RSQUNFMSggdmFyZm9ybWF0ICkgIEZUX1RSQUNFKCAxLCB2YXJmb3JtYXQgKQorI2RlZmluZSBGVF9UUkFDRTIoIHZhcmZvcm1hdCApICBGVF9UUkFDRSggMiwgdmFyZm9ybWF0ICkKKyNkZWZpbmUgRlRfVFJBQ0UzKCB2YXJmb3JtYXQgKSAgRlRfVFJBQ0UoIDMsIHZhcmZvcm1hdCApCisjZGVmaW5lIEZUX1RSQUNFNCggdmFyZm9ybWF0ICkgIEZUX1RSQUNFKCA0LCB2YXJmb3JtYXQgKQorI2RlZmluZSBGVF9UUkFDRTUoIHZhcmZvcm1hdCApICBGVF9UUkFDRSggNSwgdmFyZm9ybWF0ICkKKyNkZWZpbmUgRlRfVFJBQ0U2KCB2YXJmb3JtYXQgKSAgRlRfVFJBQ0UoIDYsIHZhcmZvcm1hdCApCisjZGVmaW5lIEZUX1RSQUNFNyggdmFyZm9ybWF0ICkgIEZUX1RSQUNFKCA3LCB2YXJmb3JtYXQgKQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBEZWZpbmUgdGhlIEZUX0VSUk9SIG1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE91dHB1dCBvZiB0aGlzIG1hY3JvIGlzIHNlbnQgdG8gc3RkZXJyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBGVF9ERUJVR19MRVZFTF9FUlJPUgorCisjZGVmaW5lIEZUX0VSUk9SKCB2YXJmb3JtYXQgKSAgRlRfTWVzc2FnZSAgdmFyZm9ybWF0CisKKyNlbHNlICAvKiAhRlRfREVCVUdfTEVWRUxfRVJST1IgKi8KKworI2RlZmluZSBGVF9FUlJPUiggdmFyZm9ybWF0ICkgIGRvIHsgfSB3aGlsZSAoIDAgKSAgICAgIC8qIG5vdGhpbmcgKi8KKworI2VuZGlmIC8qICFGVF9ERUJVR19MRVZFTF9FUlJPUiAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBEZWZpbmUgdGhlIEZUX0FTU0VSVCBhbmQgRlRfVEhST1cgbWFjcm9zLiAgVGhlIGNhbGwgdG8gYEZUX1Rocm93JyAgICAgKi8KKyAgLyogbWFrZXMgaXQgcG9zc2libGUgdG8gZWFzaWx5IHNldCBhIGJyZWFrcG9pbnQgYXQgdGhpcyBmdW5jdGlvbi4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIEZUX0RFQlVHX0xFVkVMX0VSUk9SCisKKyNkZWZpbmUgRlRfQVNTRVJUKCBjb25kaXRpb24gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggISggY29uZGl0aW9uICkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBGVF9QYW5pYyggImFzc2VydGlvbiBmYWlsZWQgb24gbGluZSAlZCBvZiBmaWxlICVzXG4iLCBcCisgICAgICAgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgX19GSUxFX18gKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9IHdoaWxlICggMCApCisKKyNkZWZpbmUgRlRfVEhST1coIGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICggRlRfVGhyb3coIEZUX0VSUl9DQVQoIEZUX0VSUl9QUkVGSVgsIGUgKSwgICBcCisgICAgICAgICAgICAgICAgICAgICAgX19MSU5FX18sICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZJTEVfXyApICAgICAgICAgICAgICAgICAgICAgIHwgXAorICAgICAgICAgICAgRlRfRVJSX0NBVCggRlRfRVJSX1BSRUZJWCwgZSApICAgICAgICAgICAgKQorCisjZWxzZSAvKiAhRlRfREVCVUdfTEVWRUxfRVJST1IgKi8KKworI2RlZmluZSBGVF9BU1NFUlQoIGNvbmRpdGlvbiApICBkbyB7IH0gd2hpbGUgKCAwICkKKworI2RlZmluZSBGVF9USFJPVyggZSApICBGVF9FUlJfQ0FUKCBGVF9FUlJfUFJFRklYLCBlICkKKworI2VuZGlmIC8qICFGVF9ERUJVR19MRVZFTF9FUlJPUiAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBEZWZpbmUgYEZUX01lc3NhZ2UnIGFuZCBgRlRfUGFuaWMnIHdoZW4gbmVlZGVkLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgRlRfREVCVUdfTEVWRUxfRVJST1IKKworI2luY2x1ZGUgInN0ZGlvLmgiICAvKiBmb3IgdmZwcmludGYoKSAqLworCisgIC8qIHByaW50IGEgbWVzc2FnZSAqLworICBGVF9CQVNFKCB2b2lkICkKKyAgRlRfTWVzc2FnZSggY29uc3QgY2hhciogIGZtdCwKKyAgICAgICAgICAgICAgLi4uICk7CisKKyAgLyogcHJpbnQgYSBtZXNzYWdlIGFuZCBleGl0ICovCisgIEZUX0JBU0UoIHZvaWQgKQorICBGVF9QYW5pYyggY29uc3QgY2hhciogIGZtdCwKKyAgICAgICAgICAgIC4uLiApOworCisgIC8qIHJlcG9ydCBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIG9mIGFuIGVycm9yICovCisgIEZUX0JBU0UoIGludCApCisgIEZUX1Rocm93KCBGVF9FcnJvciAgICAgZXJyb3IsCisgICAgICAgICAgICBpbnQgICAgICAgICAgbGluZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqICBmaWxlICk7CisKKyNlbmRpZiAvKiBGVF9ERUJVR19MRVZFTF9FUlJPUiAqLworCisKKyAgRlRfQkFTRSggdm9pZCApCisgIGZ0X2RlYnVnX2luaXQoIHZvaWQgKTsKKworRlRfRU5EX0hFQURFUgorCisjZW5kaWYgLyogX19GVERFQlVHX0hfXyAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGRyaXZlci5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGRyaXZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ODU2ZDMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZHJpdmVyLmgKQEAgLTAsMCArMSw0MDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0ZHJpdmVyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGcmVlVHlwZSBmb250IGRyaXZlciBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0ZURFJJVkVSX0hfXworI2RlZmluZSBfX0ZURFJJVkVSX0hfXworCisKKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorI2luY2x1ZGUgRlRfTU9EVUxFX0gKKworCitGVF9CRUdJTl9IRUFERVIKKworCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpGVF9GYWNlX0luaXRGdW5jKSggRlRfU3RyZWFtICAgICAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICB0eXBlZmFjZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgbnVtX3BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1ldGVycyApOworCisgIHR5cGVkZWYgdm9pZAorICAoKkZUX0ZhY2VfRG9uZUZ1bmMpKCBGVF9GYWNlICBmYWNlICk7CisKKworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqRlRfU2l6ZV9Jbml0RnVuYykoIEZUX1NpemUgIHNpemUgKTsKKworICB0eXBlZGVmIHZvaWQKKyAgKCpGVF9TaXplX0RvbmVGdW5jKSggRlRfU2l6ZSAgc2l6ZSApOworCisKKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKkZUX1Nsb3RfSW5pdEZ1bmMpKCBGVF9HbHlwaFNsb3QgIHNsb3QgKTsKKworICB0eXBlZGVmIHZvaWQKKyAgKCpGVF9TbG90X0RvbmVGdW5jKSggRlRfR2x5cGhTbG90ICBzbG90ICk7CisKKworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqRlRfU2l6ZV9SZXF1ZXN0RnVuYykoIEZUX1NpemUgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEgKTsKKworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqRlRfU2l6ZV9TZWxlY3RGdW5jKSggRlRfU2l6ZSAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIHNpemVfaW5kZXggKTsKKworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqRlRfU2xvdF9Mb2FkRnVuYykoIEZUX0dseXBoU2xvdCAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZSAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgICAgIGxvYWRfZmxhZ3MgKTsKKworCisgIHR5cGVkZWYgRlRfVUludAorICAoKkZUX0NoYXJNYXBfQ2hhckluZGV4RnVuYykoIEZUX0NoYXJNYXAgIGNoYXJtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgY2hhcmNvZGUgKTsKKworICB0eXBlZGVmIEZUX0xvbmcKKyAgKCpGVF9DaGFyTWFwX0NoYXJOZXh0RnVuYykoIEZUX0NoYXJNYXAgIGNoYXJtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICBjaGFyY29kZSApOworCisKKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKkZUX0ZhY2VfR2V0S2VybmluZ0Z1bmMpKCBGVF9GYWNlICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBsZWZ0X2dseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICByaWdodF9nbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAga2VybmluZyApOworCisKKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKkZUX0ZhY2VfQXR0YWNoRnVuYykoIEZUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOworCisKKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKkZUX0ZhY2VfR2V0QWR2YW5jZXNGdW5jKSggRlRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBmaXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBhZHZhbmNlcyApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfRHJpdmVyX0NsYXNzUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGZvbnQgZHJpdmVyIGNsYXNzLiAgVGhpcyBzdHJ1Y3R1cmUgbW9zdGx5IGNvbnRhaW5zIHBvaW50ZXJzIHRvICovCisgIC8qICAgIGRyaXZlciBtZXRob2RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJvb3QgICAgICAgICAgICAgOjogVGhlIHBhcmVudCBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZV9vYmplY3Rfc2l6ZSA6OiBUaGUgc2l6ZSBvZiBhIGZhY2Ugb2JqZWN0IGluIGJ5dGVzLiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzaXplX29iamVjdF9zaXplIDo6IFRoZSBzaXplIG9mIGEgc2l6ZSBvYmplY3QgaW4gYnl0ZXMuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNsb3Rfb2JqZWN0X3NpemUgOjogVGhlIHNpemUgb2YgYSBnbHlwaCBvYmplY3QgaW4gYnl0ZXMuICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW5pdF9mYWNlICAgICAgICA6OiBUaGUgZm9ybWF0LXNwZWNpZmljIGZhY2UgY29uc3RydWN0b3IuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkb25lX2ZhY2UgICAgICAgIDo6IFRoZSBmb3JtYXQtc3BlY2lmaWMgZmFjZSBkZXN0cnVjdG9yLiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGluaXRfc2l6ZSAgICAgICAgOjogVGhlIGZvcm1hdC1zcGVjaWZpYyBzaXplIGNvbnN0cnVjdG9yLiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZG9uZV9zaXplICAgICAgICA6OiBUaGUgZm9ybWF0LXNwZWNpZmljIHNpemUgZGVzdHJ1Y3Rvci4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBpbml0X3Nsb3QgICAgICAgIDo6IFRoZSBmb3JtYXQtc3BlY2lmaWMgc2xvdCBjb25zdHJ1Y3Rvci4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGRvbmVfc2xvdCAgICAgICAgOjogVGhlIGZvcm1hdC1zcGVjaWZpYyBzbG90IGRlc3RydWN0b3IuICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxvYWRfZ2x5cGggICAgICAgOjogQSBmdW5jdGlvbiBoYW5kbGUgdG8gbG9hZCBhIGdseXBoIHRvIGEgc2xvdC4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgaXMgbWFuZGF0b3J5ISAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdldF9rZXJuaW5nICAgICAgOjogQSBmdW5jdGlvbiBoYW5kbGUgdG8gcmV0dXJuIHRoZSB1bnNjYWxlZCAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGtlcm5pbmcgZm9yIGEgZ2l2ZW4gcGFpciBvZiBnbHlwaHMuICBDYW4gYmUgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICBzZXQgdG8gMCBpZiB0aGUgZm9ybWF0IGRvZXNuJ3Qgc3VwcG9ydCAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAga2VybmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYXR0YWNoX2ZpbGUgICAgICA6OiBUaGlzIGZ1bmN0aW9uIGhhbmRsZSBpcyB1c2VkIHRvIHJlYWQgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbCBkYXRhIGZvciBhIGZhY2UgZnJvbSBhbm90aGVyICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUvc3RyZWFtLiAgRm9yIGV4YW1wbGUsIHRoaXMgY2FuIGJlIHVzZWQgdG8gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICBhZGQgZGF0YSBmcm9tIEFGTSBvciBQRk0gZmlsZXMgb24gYSBUeXBlIDEgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSwgb3IgYSBDSURNYXAgb24gYSBDSUQta2V5ZWQgZmFjZS4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2V0X2FkdmFuY2VzICAgICA6OiBBIGZ1bmN0aW9uIGhhbmRsZSB1c2VkIHRvIHJldHVybiBhZHZhbmNlICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzIG9mIGBjb3VudCcgZ2x5cGhzIChpbiBmb250IHVuaXRzKSwgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIGF0IGBmaXJzdCcuICBUaGUgYHZlcnRpY2FsJyBmbGFnIG11c3QgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICBiZSBzZXQgdG8gZ2V0IHZlcnRpY2FsIGFkdmFuY2UgaGVpZ2h0cy4gIFRoZSAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgYGFkdmFuY2VzJyBidWZmZXIgaXMgY2FsbGVyLWFsbG9jYXRlZC4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBpZGVhIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gYmUgYWJsZSB0byAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGRldmljZS1pbmRlcGVuZGVudCB0ZXh0IGxheW91dCB3aXRob3V0ICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGluZyBhIHNpbmdsZSBnbHlwaCBpbWFnZS4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcmVxdWVzdF9zaXplICAgICA6OiBBIGhhbmRsZSB0byBhIGZ1bmN0aW9uIHVzZWQgdG8gcmVxdWVzdCB0aGUgbmV3ICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyIHNpemUuICBDYW4gYmUgc2V0IHRvIDAgaWYgdGhlICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxpbmcgZG9uZSBpbiB0aGUgYmFzZSBsYXllciBzdWZmaWNlcy4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNlbGVjdF9zaXplICAgICAgOjogQSBoYW5kbGUgdG8gYSBmdW5jdGlvbiB1c2VkIHRvIHNlbGVjdCBhIG5ldyAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkIHNpemUuICBJdCBpcyB1c2VkIG9ubHkgaWYgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICBARlRfRkFDRV9GTEFHX0ZJWEVEX1NJWkVTIGlzIHNldC4gIENhbiBiZSBzZXQgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgdG8gMCBpZiB0aGUgc2NhbGluZyBkb25lIGluIHRoZSBiYXNlIGxheWVyICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE1vc3QgZnVuY3Rpb24gcG9pbnRlcnMsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBgbG9hZF9nbHlwaCcsIGNhbiBiZSAqLworICAvKiAgICBzZXQgdG8gMCB0byBpbmRpY2F0ZSBhIGRlZmF1bHQgYmVoYXZpb3VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBGVF9Ecml2ZXJfQ2xhc3NSZWNfCisgIHsKKyAgICBGVF9Nb2R1bGVfQ2xhc3MgICAgICAgICAgcm9vdDsKKworICAgIEZUX0xvbmcgICAgICAgICAgICAgICAgICBmYWNlX29iamVjdF9zaXplOworICAgIEZUX0xvbmcgICAgICAgICAgICAgICAgICBzaXplX29iamVjdF9zaXplOworICAgIEZUX0xvbmcgICAgICAgICAgICAgICAgICBzbG90X29iamVjdF9zaXplOworCisgICAgRlRfRmFjZV9Jbml0RnVuYyAgICAgICAgIGluaXRfZmFjZTsKKyAgICBGVF9GYWNlX0RvbmVGdW5jICAgICAgICAgZG9uZV9mYWNlOworCisgICAgRlRfU2l6ZV9Jbml0RnVuYyAgICAgICAgIGluaXRfc2l6ZTsKKyAgICBGVF9TaXplX0RvbmVGdW5jICAgICAgICAgZG9uZV9zaXplOworCisgICAgRlRfU2xvdF9Jbml0RnVuYyAgICAgICAgIGluaXRfc2xvdDsKKyAgICBGVF9TbG90X0RvbmVGdW5jICAgICAgICAgZG9uZV9zbG90OworCisgICAgRlRfU2xvdF9Mb2FkRnVuYyAgICAgICAgIGxvYWRfZ2x5cGg7CisKKyAgICBGVF9GYWNlX0dldEtlcm5pbmdGdW5jICAgZ2V0X2tlcm5pbmc7CisgICAgRlRfRmFjZV9BdHRhY2hGdW5jICAgICAgIGF0dGFjaF9maWxlOworICAgIEZUX0ZhY2VfR2V0QWR2YW5jZXNGdW5jICBnZXRfYWR2YW5jZXM7CisKKyAgICAvKiBzaW5jZSB2ZXJzaW9uIDIuMiAqLworICAgIEZUX1NpemVfUmVxdWVzdEZ1bmMgICAgICByZXF1ZXN0X3NpemU7CisgICAgRlRfU2l6ZV9TZWxlY3RGdW5jICAgICAgIHNlbGVjdF9zaXplOworCisgIH0gRlRfRHJpdmVyX0NsYXNzUmVjLCAqRlRfRHJpdmVyX0NsYXNzOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfREVDTEFSRV9EUklWRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVXNlZCB0byBjcmVhdGUgYSBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGFuIEZUX0RyaXZlcl9DbGFzc1JlYyAgICAgICovCisgIC8qICAgIHN0cnVjdCBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0RFRklORV9EUklWRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiBGVF9Ecml2ZXJfQ2xhc3NSZWMgc3RydWN0LiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkIGEgYGNyZWF0ZScgZnVuY3Rpb24gaGFzIHRvIGJlICovCisgIC8qICAgIGNhbGxlZCB3aXRoIGEgcG9pbnRlciB3aGVyZSB0aGUgYWxsb2NhdGVkIHN0cnVjdHVyZSBpcyByZXR1cm5lZC4gICAqLworICAvKiAgICBBbmQgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkIGEgYGRlc3Ryb3knIGZ1bmN0aW9uIG5lZWRzIHRvIGJlICAgKi8KKyAgLyogICAgY2FsbGVkIHRvIHJlbGVhc2UgdGhhdCBhbGxvY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBgZmNpbml0LmMnIChmdF9jcmVhdGVfZGVmYXVsdF9tb2R1bGVfY2xhc3NlcykgYWxyZWFkeSBjb250YWlucyBhICAgKi8KKyAgLyogICAgbWVjaGFuaXNtIHRvIGNhbGwgdGhlc2UgZnVuY3Rpb25zIGZvciB0aGUgZGVmYXVsdCBtb2R1bGVzICAgICAgICAgICovCisgIC8qICAgIGRlc2NyaWJlZCBpbiBgZnRtb2R1bGUuaCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTm90aWNlIHRoYXQgdGhlIGNyZWF0ZWQgYGNyZWF0ZScgYW5kIGBkZXN0cm95JyBmdW5jdGlvbnMgY2FsbCAgICAgICovCisgIC8qICAgIGBwaWNfaW5pdCcgYW5kIGBwaWNfZnJlZScgdG8gYWxsb3cgeW91IHRvIG1hbnVhbGx5IGFsbG9jYXRlIGFuZCAgICAqLworICAvKiAgICBpbml0aWFsaXplIGFueSBhZGRpdGlvbmFsIGdsb2JhbCBkYXRhLCBsaWtlIGEgbW9kdWxlIHNwZWNpZmljICAgICAgKi8KKyAgLyogICAgaW50ZXJmYWNlLCBhbmQgcHV0IHRoZW0gaW4gdGhlIGdsb2JhbCBwaWMgY29udGFpbmVyIGRlZmluZWQgaW4gICAgICovCisgIC8qICAgIGBmdHBpYy5oJy4gIElmIHlvdSBkb24ndCBuZWVkIHRoZW0ganVzdCBpbXBsZW1lbnQgdGhlIGZ1bmN0aW9ucyBhcyAqLworICAvKiAgICBlbXB0eSB0byByZXNvbHZlIHRoZSBsaW5rIGVycm9yLiAgQWxzbyB0aGUgYHBpY19pbml0JyBhbmQgICAgICAgICAgKi8KKyAgLyogICAgYHBpY19mcmVlJyBmdW5jdGlvbnMgc2hvdWxkIGJlIGRlY2xhcmVkIGluIGBwaWMuaCcsIHRvIGJlIHJlZmVycmVkICovCisgIC8qICAgIGJ5IGRyaXZlciBkZWZpbml0aW9uIGNhbGxpbmcgYEZUX0RFRklORV9EUklWRVInIGluIGZvbGxvd2luZy4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBub3QgZGVmaW5lZCB0aGUgc3RydWN0IHdpbGwgYmUgICAgICAgICovCisgIC8qICAgIGFsbG9jYXRlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIChvciB0aGUgc2NvcGUgd2hlcmUgdGhlIG1hY3JvIGlzICAgICAqLworICAvKiAgICB1c2VkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCisKKyNkZWZpbmUgRlRfREVDTEFSRV9EUklWRVIoIGNsYXNzXyApICBcCisgIEZUX0NBTExCQUNLX1RBQkxFICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBGVF9Ecml2ZXJfQ2xhc3NSZWMgIGNsYXNzXzsKKworI2RlZmluZSBGVF9ERUZJTkVfRFJJVkVSKCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGZsYWdzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIG5hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHZlcnNpb25fLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHJlcXVpcmVzXywgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGludGVyZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGdldF9pbnRlcmZhY2VfLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGZhY2Vfb2JqZWN0X3NpemVfLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHNpemVfb2JqZWN0X3NpemVfLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHNsb3Rfb2JqZWN0X3NpemVfLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGluaXRfZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGRvbmVfZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGluaXRfc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGRvbmVfc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGluaXRfc2xvdF8sICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGRvbmVfc2xvdF8sICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGxvYWRfZ2x5cGhfLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGdldF9rZXJuaW5nXywgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGF0dGFjaF9maWxlXywgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGdldF9hZHZhbmNlc18sICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHJlcXVlc3Rfc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHNlbGVjdF9zaXplXyApICAgICAgICAgICAgICAgICAgICAgXAorICBGVF9DQUxMQkFDS19UQUJMRV9ERUYgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBGVF9Ecml2ZXJfQ2xhc3NSZWMgIGNsYXNzXyA9ICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZUX0RFRklORV9ST09UX01PRFVMRSggZmxhZ3NfLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV8sICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV8sICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbl8sICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZXNfLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlXywgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF8sICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZV8sICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2ludGVyZmFjZV8gKSAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZhY2Vfb2JqZWN0X3NpemVfLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNpemVfb2JqZWN0X3NpemVfLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNsb3Rfb2JqZWN0X3NpemVfLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGluaXRfZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvbmVfZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGluaXRfc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvbmVfc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGluaXRfc2xvdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvbmVfc2xvdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGxvYWRfZ2x5cGhfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdldF9rZXJuaW5nXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGF0dGFjaF9maWxlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdldF9hZHZhbmNlc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJlcXVlc3Rfc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNlbGVjdF9zaXplXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OworCisjZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLworCisjZGVmaW5lIEZUX0RFQ0xBUkVfRFJJVkVSKCBjbGFzc18gKSAgRlRfREVDTEFSRV9NT0RVTEUoIGNsYXNzXyApCisKKyNkZWZpbmUgRlRfREVGSU5FX0RSSVZFUiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZmxhZ3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBzaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIG5hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdmVyc2lvbl8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICByZXF1aXJlc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGludGVyZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBkb25lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGdldF9pbnRlcmZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZmFjZV9vYmplY3Rfc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBzaXplX29iamVjdF9zaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHNsb3Rfb2JqZWN0X3NpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgaW5pdF9mYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBkb25lX2ZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGluaXRfc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZG9uZV9zaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBpbml0X3Nsb3RfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGRvbmVfc2xvdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbG9hZF9nbHlwaF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBnZXRfa2VybmluZ18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGF0dGFjaF9maWxlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZ2V0X2FkdmFuY2VzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICByZXF1ZXN0X3NpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHNlbGVjdF9zaXplXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlRfRGVzdHJveV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5LCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01vZHVsZV9DbGFzcyogIGNsYXp6ICkgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVF9NZW1vcnkgICAgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgXAorICAgIEZUX0RyaXZlcl9DbGFzcyAgZGNsYXp6ID0gKEZUX0RyaXZlcl9DbGFzcyljbGF6ejsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXNzXyAjIyBfcGljX2ZyZWUoIGxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCBkY2xhenogKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZUX0ZSRUUoIGRjbGF6eiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0NyZWF0ZV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgbGlicmFyeSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01vZHVsZV9DbGFzcyoqICBvdXRwdXRfY2xhc3MgKSAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlRfRHJpdmVyX0NsYXNzICBjbGF6eiAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVF9FcnJvciAgICAgICAgIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggRlRfQUxMT0MoIGNsYXp6LCBzaXplb2YgKCAqY2xhenogKSApICkgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVycm9yID0gY2xhc3NfICMjIF9waWNfaW5pdCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCBlcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlRfRlJFRSggY2xhenogKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlRfREVGSU5FX1JPT1RfTU9EVUxFKCBmbGFnc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2ludGVyZmFjZV8gKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+ZmFjZV9vYmplY3Rfc2l6ZSA9IGZhY2Vfb2JqZWN0X3NpemVfOyAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5zaXplX29iamVjdF9zaXplID0gc2l6ZV9vYmplY3Rfc2l6ZV87ICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPnNsb3Rfb2JqZWN0X3NpemUgPSBzbG90X29iamVjdF9zaXplXzsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5pbml0X2ZhY2UgICAgICAgID0gaW5pdF9mYWNlXzsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPmRvbmVfZmFjZSAgICAgICAgPSBkb25lX2ZhY2VfOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5pbml0X3NpemUgICAgICAgID0gaW5pdF9zaXplXzsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPmRvbmVfc2l6ZSAgICAgICAgPSBkb25lX3NpemVfOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5pbml0X3Nsb3QgICAgICAgID0gaW5pdF9zbG90XzsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPmRvbmVfc2xvdCAgICAgICAgPSBkb25lX3Nsb3RfOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5sb2FkX2dseXBoICAgICAgID0gbG9hZF9nbHlwaF87ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+Z2V0X2tlcm5pbmcgICAgICA9IGdldF9rZXJuaW5nXzsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5hdHRhY2hfZmlsZSAgICAgID0gYXR0YWNoX2ZpbGVfOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPmdldF9hZHZhbmNlcyAgICAgPSBnZXRfYWR2YW5jZXNfOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5yZXF1ZXN0X3NpemUgICAgID0gcmVxdWVzdF9zaXplXzsgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPnNlbGVjdF9zaXplICAgICAgPSBzZWxlY3Rfc2l6ZV87ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpvdXRwdXRfY2xhc3MgPSAoRlRfTW9kdWxlX0NsYXNzKiljbGF6ejsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKworI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCisKK0ZUX0VORF9IRUFERVIKKworI2VuZGlmIC8qIF9fRlREUklWRVJfSF9fICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Z2xvYWRyLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Z2xvYWRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcwZGQ3MAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRnbG9hZHIuaApAQCAtMCwwICsxLDE3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRnbG9hZHIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoZSBGcmVlVHlwZSBnbHlwaCBsb2FkZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAyLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fRlRHTE9BRFJfSF9fCisjZGVmaW5lIF9fRlRHTE9BRFJfSF9fCisKKworI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CisjaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisKKworRlRfQkVHSU5fSEVBREVSCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HbHlwaExvYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgZ2x5cGggbG9hZGVyIGlzIGFuIGludGVybmFsIG9iamVjdCB1c2VkIHRvIGxvYWQgc2V2ZXJhbCBnbHlwaHMgKi8KKyAgLyogICAgdG9nZXRoZXIgKGZvciBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBjb21wb3NpdGVzKS4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGdseXBoIGxvYWRlciBpbXBsZW1lbnRhdGlvbiBpcyBub3QgcGFydCBvZiB0aGUgaGlnaC1sZXZlbCBBUEksICovCisgIC8qICAgIGhlbmNlIHRoZSBmb3J3YXJkIHN0cnVjdHVyZSBkZWNsYXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgRlRfR2x5cGhMb2FkZXJSZWNfKiAgRlRfR2x5cGhMb2FkZXIgOworCisKKyNpZiAwICAvKiBtb3ZlZCB0byBmcmVldHlwZS5oIGluIHZlcnNpb24gMi4yICovCisjZGVmaW5lIEZUX1NVQkdMWVBIX0ZMQUdfQVJHU19BUkVfV09SRFMgICAgICAgICAgMQorI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHX0FSR1NfQVJFX1hZX1ZBTFVFUyAgICAgIDIKKyNkZWZpbmUgRlRfU1VCR0xZUEhfRkxBR19ST1VORF9YWV9UT19HUklEICAgICAgICA0CisjZGVmaW5lIEZUX1NVQkdMWVBIX0ZMQUdfU0NBTEUgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHX1hZX1NDQUxFICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgRlRfU1VCR0xZUEhfRkxBR18yWDIgICAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIEZUX1NVQkdMWVBIX0ZMQUdfVVNFX01ZX01FVFJJQ1MgICAgICAweDIwMAorI2VuZGlmCisKKworICB0eXBlZGVmIHN0cnVjdCAgRlRfU3ViR2x5cGhSZWNfCisgIHsKKyAgICBGVF9JbnQgICAgIGluZGV4OworICAgIEZUX1VTaG9ydCAgZmxhZ3M7CisgICAgRlRfSW50ICAgICBhcmcxOworICAgIEZUX0ludCAgICAgYXJnMjsKKyAgICBGVF9NYXRyaXggIHRyYW5zZm9ybTsKKworICB9IEZUX1N1YkdseXBoUmVjOworCisKKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0dseXBoTG9hZFJlY18KKyAgeworICAgIEZUX091dGxpbmUgICBvdXRsaW5lOyAgICAgICAvKiBvdXRsaW5lICAgICAgICAgICAgICAgICAgICovCisgICAgRlRfVmVjdG9yKiAgIGV4dHJhX3BvaW50czsgIC8qIGV4dHJhIHBvaW50cyB0YWJsZSAgICAgICAgKi8KKyAgICBGVF9WZWN0b3IqICAgZXh0cmFfcG9pbnRzMjsgLyogc2Vjb25kIGV4dHJhIHBvaW50cyB0YWJsZSAqLworICAgIEZUX1VJbnQgICAgICBudW1fc3ViZ2x5cGhzOyAvKiBudW1iZXIgb2Ygc3ViZ2x5cGhzICAgICAgICovCisgICAgRlRfU3ViR2x5cGggIHN1YmdseXBoczsgICAgIC8qIHN1YmdseXBocyAgICAgICAgICAgICAgICAgKi8KKworICB9IEZUX0dseXBoTG9hZFJlYywgKkZUX0dseXBoTG9hZDsKKworCisgIHR5cGVkZWYgc3RydWN0ICBGVF9HbHlwaExvYWRlclJlY18KKyAgeworICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5OworICAgIEZUX1VJbnQgICAgICAgICAgbWF4X3BvaW50czsKKyAgICBGVF9VSW50ICAgICAgICAgIG1heF9jb250b3VyczsKKyAgICBGVF9VSW50ICAgICAgICAgIG1heF9zdWJnbHlwaHM7CisgICAgRlRfQm9vbCAgICAgICAgICB1c2VfZXh0cmE7CisKKyAgICBGVF9HbHlwaExvYWRSZWMgIGJhc2U7CisgICAgRlRfR2x5cGhMb2FkUmVjICBjdXJyZW50OworCisgICAgdm9pZCogICAgICAgICAgICBvdGhlcjsgICAgICAgICAgICAvKiBmb3IgcG9zc2libGUgZnV0dXJlIGV4dGVuc2lvbj8gKi8KKworICB9IEZUX0dseXBoTG9hZGVyUmVjOworCisKKyAgLyogY3JlYXRlIG5ldyBlbXB0eSBnbHlwaCBsb2FkZXIgKi8KKyAgRlRfQkFTRSggRlRfRXJyb3IgKQorICBGVF9HbHlwaExvYWRlcl9OZXcoIEZUX01lbW9yeSAgICAgICAgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoTG9hZGVyICAqYWxvYWRlciApOworCisgIC8qIGFkZCBhbiBleHRyYSBwb2ludHMgdGFibGUgdG8gYSBnbHlwaCBsb2FkZXIgKi8KKyAgRlRfQkFTRSggRlRfRXJyb3IgKQorICBGVF9HbHlwaExvYWRlcl9DcmVhdGVFeHRyYSggRlRfR2x5cGhMb2FkZXIgIGxvYWRlciApOworCisgIC8qIGRlc3Ryb3kgYSBnbHlwaCBsb2FkZXIgKi8KKyAgRlRfQkFTRSggdm9pZCApCisgIEZUX0dseXBoTG9hZGVyX0RvbmUoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgKTsKKworICAvKiByZXNldCBhIGdseXBoIGxvYWRlciAoZnJlZXMgZXZlcnl0aGluZyBpbnQgaXQpICovCisgIEZUX0JBU0UoIHZvaWQgKQorICBGVF9HbHlwaExvYWRlcl9SZXNldCggRlRfR2x5cGhMb2FkZXIgIGxvYWRlciApOworCisgIC8qIHJld2luZCBhIGdseXBoIGxvYWRlciAqLworICBGVF9CQVNFKCB2b2lkICkKKyAgRlRfR2x5cGhMb2FkZXJfUmV3aW5kKCBGVF9HbHlwaExvYWRlciAgbG9hZGVyICk7CisKKyAgLyogY2hlY2sgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgdG8gYWRkIGBuX3BvaW50cycgYW5kIGBuX2NvbnRvdXJzJyAqLworICAvKiB0byB0aGUgZ2x5cGggbG9hZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0JBU0UoIEZUX0Vycm9yICkKKyAgRlRfR2x5cGhMb2FkZXJfQ2hlY2tQb2ludHMoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgbl9wb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgbl9jb250b3VycyApOworCisKKyNkZWZpbmUgRlRfR0xZUEhMT0FERVJfQ0hFQ0tfUCggX2xvYWRlciwgX2NvdW50ICkgICAgICAgXAorICAoIChfY291bnQpID09IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCisgICAgKCAoRlRfVUludCkoX2xvYWRlciktPmJhc2Uub3V0bGluZS5uX3BvaW50cyAgICArICAgIFwKKyAgICAgIChGVF9VSW50KShfbG9hZGVyKS0+Y3VycmVudC5vdXRsaW5lLm5fcG9pbnRzICsgICAgXAorICAgICAgKEZUX1VJbnQpKF9jb3VudCkgKSA8PSAoX2xvYWRlciktPm1heF9wb2ludHMgICApCisKKyNkZWZpbmUgRlRfR0xZUEhMT0FERVJfQ0hFQ0tfQyggX2xvYWRlciwgX2NvdW50ICkgICAgICAgICBcCisgICggKF9jb3VudCkgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAorICAgICggKEZUX1VJbnQpKF9sb2FkZXIpLT5iYXNlLm91dGxpbmUubl9jb250b3VycyAgICArICAgIFwKKyAgICAgIChGVF9VSW50KShfbG9hZGVyKS0+Y3VycmVudC5vdXRsaW5lLm5fY29udG91cnMgKyAgICBcCisgICAgICAoRlRfVUludCkoX2NvdW50KSApIDw9IChfbG9hZGVyKS0+bWF4X2NvbnRvdXJzICAgKQorCisjZGVmaW5lIEZUX0dMWVBITE9BREVSX0NIRUNLX1BPSU5UUyggX2xvYWRlciwgX3BvaW50cywgX2NvbnRvdXJzICkgXAorICAoICggRlRfR0xZUEhMT0FERVJfQ0hFQ0tfUCggX2xvYWRlciwgX3BvaW50cyApICAgJiYgICAgICAgICAgICAgIFwKKyAgICAgIEZUX0dMWVBITE9BREVSX0NIRUNLX0MoIF9sb2FkZXIsIF9jb250b3VycyApICkgICAgICAgICAgICAgICBcCisgICAgPyAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDogRlRfR2x5cGhMb2FkZXJfQ2hlY2tQb2ludHMoIChfbG9hZGVyKSwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludCkoX3BvaW50cyksICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpKF9jb250b3VycykgKSApCisKKworICAvKiBjaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSB0byBhZGQgYG5fc3Vicycgc3ViLWdseXBocyB0byAqLworICAvKiBhIGdseXBoIGxvYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9CQVNFKCBGVF9FcnJvciApCisgIEZUX0dseXBoTG9hZGVyX0NoZWNrU3ViR2x5cGhzKCBGVF9HbHlwaExvYWRlciAgbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIG5fc3VicyApOworCisgIC8qIHByZXBhcmUgYSBnbHlwaCBsb2FkZXIsIGkuZS4gZW1wdHkgdGhlIGN1cnJlbnQgZ2x5cGggKi8KKyAgRlRfQkFTRSggdm9pZCApCisgIEZUX0dseXBoTG9hZGVyX1ByZXBhcmUoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgKTsKKworICAvKiBhZGQgdGhlIGN1cnJlbnQgZ2x5cGggdG8gdGhlIGJhc2UgZ2x5cGggKi8KKyAgRlRfQkFTRSggdm9pZCApCisgIEZUX0dseXBoTG9hZGVyX0FkZCggRlRfR2x5cGhMb2FkZXIgIGxvYWRlciApOworCisgIC8qIGNvcHkgcG9pbnRzIGZyb20gb25lIGdseXBoIGxvYWRlciB0byBhbm90aGVyICovCisgIEZUX0JBU0UoIEZUX0Vycm9yICkKKyAgRlRfR2x5cGhMb2FkZXJfQ29weVBvaW50cyggRlRfR2x5cGhMb2FkZXIgIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhMb2FkZXIgIHNvdXJjZSApOworCisgLyogKi8KKworCitGVF9FTkRfSEVBREVSCisKKyNlbmRpZiAvKiBfX0ZUR0xPQURSX0hfXyAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG1lbW9yeS5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG1lbW9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYzU1M2IKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0bWVtb3J5LmgKQEAgLTAsMCArMSwzODYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0bWVtb3J5LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgRnJlZVR5cGUgbWVtb3J5IG1hbmFnZW1lbnQgbWFjcm9zIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0ZUTUVNT1JZX0hfXworI2RlZmluZSBfX0ZUTUVNT1JZX0hfXworCisKKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorI2luY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ICisjaW5jbHVkZSBGVF9UWVBFU19ICisKKworRlRfQkVHSU5fSEVBREVSCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TRVRfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gc2V0IGFuIGltcGxpY2l0IGBlcnJvcicgdmFyaWFibGUgdG8gYSBnaXZlbiAgKi8KKyAgLyogICAgZXhwcmVzc2lvbidzIHZhbHVlICh1c3VhbGx5IGEgZnVuY3Rpb24gY2FsbCksIGFuZCBjb252ZXJ0IGl0IHRvIGEgICovCisgIC8qICAgIGJvb2xlYW4gd2hpY2ggaXMgc2V0IHdoZW5ldmVyIHRoZSB2YWx1ZSBpcyAhPSAwLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyN1bmRlZiAgRlRfU0VUX0VSUk9SCisjZGVmaW5lIEZUX1NFVF9FUlJPUiggZXhwcmVzc2lvbiApIFwKKyAgICAgICAgICAoICggZXJyb3IgPSAoZXhwcmVzc2lvbikgKSAhPSAwICkKKworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE0gRSBNIE8gUiBZICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoKKyAgICogIEMrKyByZWZ1c2VzIHRvIGhhbmRsZSBzdGF0ZW1lbnRzIGxpa2UgcCA9ICh2b2lkKilhbnl0aGluZywgd2l0aCBgcCcgYQorICAgKiAgdHlwZWQgcG9pbnRlci4gIFNpbmNlIHdlIGRvbid0IGhhdmUgYSBgdHlwZW9mJyBvcGVyYXRvciBpbiBzdGFuZGFyZAorICAgKiAgQysrLCB3ZSBoYXZlIHRvIHVzZSBhIHRlbXBsYXRlIHRvIGVtdWxhdGUgaXQuCisgICAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKKworICBleHRlcm4gIkMrKyIKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGlubGluZSBUKgorICBjcGx1c3BsdXNfdHlwZW9mKCAgICAgICAgVCosCisgICAgICAgICAgICAgICAgICAgIHZvaWQgICp2ICkKKyAgeworICAgIHJldHVybiBzdGF0aWNfY2FzdCA8VCo+ICggdiApOworICB9CisKKyNkZWZpbmUgRlRfQVNTSUdOUCggcCwgdmFsICkgIChwKSA9IGNwbHVzcGx1c190eXBlb2YoIChwKSwgKHZhbCkgKQorCisjZWxzZQorCisjZGVmaW5lIEZUX0FTU0lHTlAoIHAsIHZhbCApICAocCkgPSAodmFsKQorCisjZW5kaWYKKworCisKKyNpZmRlZiBGVF9ERUJVR19NRU1PUlkKKworICBGVF9CQVNFKCBjb25zdCBjaGFyKiApICBfZnRfZGVidWdfZmlsZTsKKyAgRlRfQkFTRSggbG9uZyApICAgICAgICAgX2Z0X2RlYnVnX2xpbmVubzsKKworI2RlZmluZSBGVF9ERUJVR19JTk5FUiggZXhwICkgICggX2Z0X2RlYnVnX2ZpbGUgICA9IF9fRklMRV9fLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZnRfZGVidWdfbGluZW5vID0gX19MSU5FX18sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleHApICkKKworI2RlZmluZSBGVF9BU1NJR05QX0lOTkVSKCBwLCBleHAgKSAgKCBfZnRfZGVidWdfZmlsZSAgID0gX19GSUxFX18sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Z0X2RlYnVnX2xpbmVubyA9IF9fTElORV9fLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0FTU0lHTlAoIHAsIGV4cCApICkKKworI2Vsc2UgLyogIUZUX0RFQlVHX01FTU9SWSAqLworCisjZGVmaW5lIEZUX0RFQlVHX0lOTkVSKCBleHAgKSAgICAgICAoZXhwKQorI2RlZmluZSBGVF9BU1NJR05QX0lOTkVSKCBwLCBleHAgKSAgRlRfQVNTSUdOUCggcCwgZXhwICkKKworI2VuZGlmIC8qICFGVF9ERUJVR19NRU1PUlkgKi8KKworCisgIC8qCisgICAqICBUaGUgYWxsb2NhdGlvbiBmdW5jdGlvbnMgcmV0dXJuIGEgcG9pbnRlciwgYW5kIHRoZSBlcnJvciBjb2RlCisgICAqICBpcyB3cml0dGVuIHRvIHRocm91Z2ggdGhlIGBwX2Vycm9yJyBwYXJhbWV0ZXIuICBTZWUgYmVsb3cgZm9yCisgICAqICBmb3IgZG9jdW1lbnRhdGlvbi4KKyAgICovCisKKyAgRlRfQkFTRSggRlRfUG9pbnRlciApCisgIGZ0X21lbV9hbGxvYyggRlRfTWVtb3J5ICBtZW1vcnksCisgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBzaXplLAorICAgICAgICAgICAgICAgIEZUX0Vycm9yICAqcF9lcnJvciApOworCisgIEZUX0JBU0UoIEZUX1BvaW50ZXIgKQorICBmdF9tZW1fcWFsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBzaXplLAorICAgICAgICAgICAgICAgICBGVF9FcnJvciAgKnBfZXJyb3IgKTsKKworICBGVF9CQVNFKCBGVF9Qb2ludGVyICkKKyAgZnRfbWVtX3JlYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBpdGVtX3NpemUsCisgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIGN1cl9jb3VudCwKKyAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgbmV3X2NvdW50LAorICAgICAgICAgICAgICAgICAgdm9pZCogICAgICBibG9jaywKKyAgICAgICAgICAgICAgICAgIEZUX0Vycm9yICAqcF9lcnJvciApOworCisgIEZUX0JBU0UoIEZUX1BvaW50ZXIgKQorICBmdF9tZW1fcXJlYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgaXRlbV9zaXplLAorICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgY3VyX2NvdW50LAorICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgbmV3X2NvdW50LAorICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgYmxvY2ssCisgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IgICpwX2Vycm9yICk7CisKKyAgRlRfQkFTRSggdm9pZCApCisgIGZ0X21lbV9mcmVlKCBGVF9NZW1vcnkgICAgbWVtb3J5LAorICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogIFAgKTsKKworCisjZGVmaW5lIEZUX01FTV9BTExPQyggcHRyLCBzaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEZUX0FTU0lHTlBfSU5ORVIoIHB0ciwgZnRfbWVtX2FsbG9jKCBtZW1vcnksICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKHNpemUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciApICkKKworI2RlZmluZSBGVF9NRU1fRlJFRSggcHRyICkgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZnRfbWVtX2ZyZWUoIG1lbW9yeSwgKHB0cikgKTsgXAorICAgICAgICAgICAgKHB0cikgPSBOVUxMOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEZUX0VORF9TVE1OVAorCisjZGVmaW5lIEZUX01FTV9ORVcoIHB0ciApICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEZUX01FTV9BTExPQyggcHRyLCBzaXplb2YgKCAqKHB0cikgKSApCisKKyNkZWZpbmUgRlRfTUVNX1JFQUxMT0MoIHB0ciwgY3Vyc3osIG5ld3N6ICkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgRlRfQVNTSUdOUF9JTk5FUiggcHRyLCBmdF9tZW1fcmVhbGxvYyggbWVtb3J5LCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykoY3Vyc3opLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKG5ld3N6KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIpLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IgKSApCisKKyNkZWZpbmUgRlRfTUVNX1FBTExPQyggcHRyLCBzaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEZUX0FTU0lHTlBfSU5ORVIoIHB0ciwgZnRfbWVtX3FhbGxvYyggbWVtb3J5LCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykoc2l6ZSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciApICkKKworI2RlZmluZSBGVF9NRU1fUU5FVyggcHRyICkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgRlRfTUVNX1FBTExPQyggcHRyLCBzaXplb2YgKCAqKHB0cikgKSApCisKKyNkZWZpbmUgRlRfTUVNX1FSRUFMTE9DKCBwdHIsIGN1cnN6LCBuZXdzeiApICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEZUX0FTU0lHTlBfSU5ORVIoIHB0ciwgZnRfbWVtX3FyZWFsbG9jKCBtZW1vcnksICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKGN1cnN6KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykobmV3c3opLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIpLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yICkgKQorCisjZGVmaW5lIEZUX01FTV9BTExPQ19NVUxUKCBwdHIsIGNvdW50LCBpdGVtX3NpemUgKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBGVF9BU1NJR05QX0lOTkVSKCBwdHIsIGZ0X21lbV9yZWFsbG9jKCBtZW1vcnksICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShpdGVtX3NpemUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykoY291bnQpLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yICkgKQorCisjZGVmaW5lIEZUX01FTV9SRUFMTE9DX01VTFQoIHB0ciwgb2xkY250LCBuZXdjbnQsIGl0bXN6ICkgICAgICAgICAgIFwKKyAgICAgICAgICBGVF9BU1NJR05QX0lOTkVSKCBwdHIsIGZ0X21lbV9yZWFsbG9jKCBtZW1vcnksICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShpdG1zeiksICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKG9sZGNudCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykobmV3Y250KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIpLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yICkgKQorCisjZGVmaW5lIEZUX01FTV9RQUxMT0NfTVVMVCggcHRyLCBjb3VudCwgaXRlbV9zaXplICkgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgRlRfQVNTSUdOUF9JTk5FUiggcHRyLCBmdF9tZW1fcXJlYWxsb2MoIG1lbW9yeSwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShpdGVtX3NpemUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShjb3VudCksICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciApICkKKworI2RlZmluZSBGVF9NRU1fUVJFQUxMT0NfTVVMVCggcHRyLCBvbGRjbnQsIG5ld2NudCwgaXRtc3opICAgICAgICAgICAgXAorICAgICAgICAgIEZUX0FTU0lHTlBfSU5ORVIoIHB0ciwgZnRfbWVtX3FyZWFsbG9jKCBtZW1vcnksICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykoaXRtc3opLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykob2xkY250KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykobmV3Y250KSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRyKSwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IgKSApCisKKworI2RlZmluZSBGVF9NRU1fU0VUX0VSUk9SKCBjb25kICkgICggKGNvbmQpLCBlcnJvciAhPSAwICkKKworCisjZGVmaW5lIEZUX01FTV9TRVQoIGRlc3QsIGJ5dGUsIGNvdW50ICkgICAgICAgICAgICAgICBcCisgICAgICAgICAgZnRfbWVtc2V0KCBkZXN0LCBieXRlLCAoRlRfT2Zmc2V0KShjb3VudCkgKQorCisjZGVmaW5lIEZUX01FTV9DT1BZKCBkZXN0LCBzb3VyY2UsIGNvdW50ICkgICAgICAgICAgICAgIFwKKyAgICAgICAgICBmdF9tZW1jcHkoIGRlc3QsIHNvdXJjZSwgKEZUX09mZnNldCkoY291bnQpICkKKworI2RlZmluZSBGVF9NRU1fTU9WRSggZGVzdCwgc291cmNlLCBjb3VudCApICAgICAgICAgICAgICAgXAorICAgICAgICAgIGZ0X21lbW1vdmUoIGRlc3QsIHNvdXJjZSwgKEZUX09mZnNldCkoY291bnQpICkKKworCisjZGVmaW5lIEZUX01FTV9aRVJPKCBkZXN0LCBjb3VudCApICBGVF9NRU1fU0VUKCBkZXN0LCAwLCBjb3VudCApCisKKyNkZWZpbmUgRlRfWkVSTyggcCApICAgICAgICAgICAgICAgIEZUX01FTV9aRVJPKCBwLCBzaXplb2YgKCAqKHApICkgKQorCisKKyNkZWZpbmUgRlRfQVJSQVlfWkVSTyggZGVzdCwgY291bnQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEZUX01FTV9aRVJPKCBkZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIChGVF9PZmZzZXQpKGNvdW50KSAqIHNpemVvZiAoICooZGVzdCkgKSApCisKKyNkZWZpbmUgRlRfQVJSQVlfQ09QWSggZGVzdCwgc291cmNlLCBjb3VudCApICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEZUX01FTV9DT1BZKCBkZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgKEZUX09mZnNldCkoY291bnQpICogc2l6ZW9mICggKihkZXN0KSApICkKKworI2RlZmluZSBGVF9BUlJBWV9NT1ZFKCBkZXN0LCBzb3VyY2UsIGNvdW50ICkgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgRlRfTUVNX01PVkUoIGRlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAoRlRfT2Zmc2V0KShjb3VudCkgKiBzaXplb2YgKCAqKGRlc3QpICkgKQorCisKKyAgLyoKKyAgICogIFJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgYWRkcmVzc2FibGUgZWxlbWVudHMgaW4gYW4gYXJyYXkuCisgICAqICBXZSBsaW1pdCBvdXJzZWx2ZXMgdG8gSU5UX01BWCwgcmF0aGVyIHRoYW4gVUlOVF9NQVgsIHRvIGF2b2lkCisgICAqICBhbnkgcHJvYmxlbXMuCisgICAqLworI2RlZmluZSBGVF9BUlJBWV9NQVgoIHB0ciApICAgICAgICAgICAoIEZUX0lOVF9NQVggLyBzaXplb2YgKCAqKHB0cikgKSApCisKKyNkZWZpbmUgRlRfQVJSQVlfQ0hFQ0soIHB0ciwgY291bnQgKSAgKCAoY291bnQpIDw9IEZUX0FSUkFZX01BWCggcHRyICkgKQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBtYWNyb3MgZXhwZWN0IHRoYXQgdGhlaXIgcG9pbnRlciBhcmd1bWVudCBpcyAgKi8KKyAgLyogX3R5cGVkXyBpbiBvcmRlciB0byBhdXRvbWF0aWNhbGx5IGNvbXB1dGUgYXJyYXkgZWxlbWVudCBzaXplcy4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIEZUX01FTV9ORVdfQVJSQVkoIHB0ciwgY291bnQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBGVF9BU1NJR05QX0lOTkVSKCBwdHIsIGZ0X21lbV9yZWFsbG9jKCBtZW1vcnksICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoICoocHRyKSApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykoY291bnQpLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yICkgKQorCisjZGVmaW5lIEZUX01FTV9SRU5FV19BUlJBWSggcHRyLCBjdXJzeiwgbmV3c3ogKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBGVF9BU1NJR05QX0lOTkVSKCBwdHIsIGZ0X21lbV9yZWFsbG9jKCBtZW1vcnksICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoICoocHRyKSApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKGN1cnN6KSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykobmV3c3opLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIpLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yICkgKQorCisjZGVmaW5lIEZUX01FTV9RTkVXX0FSUkFZKCBwdHIsIGNvdW50ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgRlRfQVNTSUdOUF9JTk5FUiggcHRyLCBmdF9tZW1fcXJlYWxsb2MoIG1lbW9yeSwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoICoocHRyKSApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShjb3VudCksICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciApICkKKworI2RlZmluZSBGVF9NRU1fUVJFTkVXX0FSUkFZKCBwdHIsIGN1cnN6LCBuZXdzeiApICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEZUX0FTU0lHTlBfSU5ORVIoIHB0ciwgZnRfbWVtX3FyZWFsbG9jKCBtZW1vcnksICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCAqKHB0cikgKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykoY3Vyc3opLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykobmV3c3opLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRyKSwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IgKSApCisKKyNkZWZpbmUgRlRfQUxMT0MoIHB0ciwgc2l6ZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9BTExPQyggcHRyLCBzaXplICkgKQorCisjZGVmaW5lIEZUX1JFQUxMT0MoIHB0ciwgY3Vyc3osIG5ld3N6ICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX1JFQUxMT0MoIHB0ciwgY3Vyc3osIG5ld3N6ICkgKQorCisjZGVmaW5lIEZUX0FMTE9DX01VTFQoIHB0ciwgY291bnQsIGl0ZW1fc2l6ZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9BTExPQ19NVUxUKCBwdHIsIGNvdW50LCBpdGVtX3NpemUgKSApCisKKyNkZWZpbmUgRlRfUkVBTExPQ19NVUxUKCBwdHIsIG9sZGNudCwgbmV3Y250LCBpdG1zeiApICAgICAgICAgICAgICBcCisgICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX1JFQUxMT0NfTVVMVCggcHRyLCBvbGRjbnQsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2NudCwgaXRtc3ogKSApCisKKyNkZWZpbmUgRlRfUUFMTE9DKCBwdHIsIHNpemUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fUUFMTE9DKCBwdHIsIHNpemUgKSApCisKKyNkZWZpbmUgRlRfUVJFQUxMT0MoIHB0ciwgY3Vyc3osIG5ld3N6ICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX1FSRUFMTE9DKCBwdHIsIGN1cnN6LCBuZXdzeiApICkKKworI2RlZmluZSBGVF9RQUxMT0NfTVVMVCggcHRyLCBjb3VudCwgaXRlbV9zaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX1FBTExPQ19NVUxUKCBwdHIsIGNvdW50LCBpdGVtX3NpemUgKSApCisKKyNkZWZpbmUgRlRfUVJFQUxMT0NfTVVMVCggcHRyLCBvbGRjbnQsIG5ld2NudCwgaXRtc3ogKSAgICAgICAgICAgICAgXAorICAgICAgICAgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9RUkVBTExPQ19NVUxUKCBwdHIsIG9sZGNudCwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2NudCwgaXRtc3ogKSApCisKKyNkZWZpbmUgRlRfRlJFRSggcHRyICkgIEZUX01FTV9GUkVFKCBwdHIgKQorCisjZGVmaW5lIEZUX05FVyggcHRyICkgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9ORVcoIHB0ciApICkKKworI2RlZmluZSBGVF9ORVdfQVJSQVkoIHB0ciwgY291bnQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fTkVXX0FSUkFZKCBwdHIsIGNvdW50ICkgKQorCisjZGVmaW5lIEZUX1JFTkVXX0FSUkFZKCBwdHIsIGN1cmNudCwgbmV3Y250ICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX1JFTkVXX0FSUkFZKCBwdHIsIGN1cmNudCwgbmV3Y250ICkgKQorCisjZGVmaW5lIEZUX1FORVcoIHB0ciApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9RTkVXKCBwdHIgKSApCisKKyNkZWZpbmUgRlRfUU5FV19BUlJBWSggcHRyLCBjb3VudCApICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX05FV19BUlJBWSggcHRyLCBjb3VudCApICkKKworI2RlZmluZSBGVF9RUkVORVdfQVJSQVkoIHB0ciwgY3VyY250LCBuZXdjbnQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9SRU5FV19BUlJBWSggcHRyLCBjdXJjbnQsIG5ld2NudCApICkKKworCisgIEZUX0JBU0UoIEZUX1BvaW50ZXIgKQorICBmdF9tZW1fc3RyZHVwKCBGVF9NZW1vcnkgICAgbWVtb3J5LAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgc3RyLAorICAgICAgICAgICAgICAgICBGVF9FcnJvciAgICAqcF9lcnJvciApOworCisgIEZUX0JBU0UoIEZUX1BvaW50ZXIgKQorICBmdF9tZW1fZHVwKCBGVF9NZW1vcnkgICAgbWVtb3J5LAorICAgICAgICAgICAgICBjb25zdCB2b2lkKiAgYWRkcmVzcywKKyAgICAgICAgICAgICAgRlRfVUxvbmcgICAgIHNpemUsCisgICAgICAgICAgICAgIEZUX0Vycm9yICAgICpwX2Vycm9yICk7CisKKworI2RlZmluZSBGVF9NRU1fU1RSRFVQKCBkc3QsIHN0ciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKGRzdCkgPSAoY2hhciopZnRfbWVtX3N0cmR1cCggbWVtb3J5LCAoY29uc3QgY2hhciopKHN0ciksICZlcnJvciApCisKKyNkZWZpbmUgRlRfU1RSRFVQKCBkc3QsIHN0ciApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9TVFJEVVAoIGRzdCwgc3RyICkgKQorCisjZGVmaW5lIEZUX01FTV9EVVAoIGRzdCwgYWRkcmVzcywgc2l6ZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChkc3QpID0gZnRfbWVtX2R1cCggbWVtb3J5LCAoYWRkcmVzcyksIChGVF9VTG9uZykoc2l6ZSksICZlcnJvciApCisKKyNkZWZpbmUgRlRfRFVQKCBkc3QsIGFkZHJlc3MsIHNpemUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fRFVQKCBkc3QsIGFkZHJlc3MsIHNpemUgKSApCisKKworICAvKiBSZXR1cm4gPj0gMSBpZiBhIHRydW5jYXRpb24gb2NjdXJzLiAgICAgICAgICAgICovCisgIC8qIFJldHVybiAwIGlmIHRoZSBzb3VyY2Ugc3RyaW5nIGZpdHMgdGhlIGJ1ZmZlci4gKi8KKyAgLyogVGhpcyBpcyAqbm90KiB0aGUgc2FtZSBhcyBzdHJsY3B5KCkuICAgICAgICAgICAqLworICBGVF9CQVNFKCBGVF9JbnQgKQorICBmdF9tZW1fc3RyY3B5biggY2hhciogICAgICAgIGRzdCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBzcmMsCisgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgc2l6ZSApOworCisjZGVmaW5lIEZUX1NUUkNQWU4oIGRzdCwgc3JjLCBzaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBmdF9tZW1fc3RyY3B5biggKGNoYXIqKWRzdCwgKGNvbnN0IGNoYXIqKShzcmMpLCAoRlRfVUxvbmcpKHNpemUpICkKKworIC8qICovCisKKworRlRfRU5EX0hFQURFUgorCisjZW5kaWYgLyogX19GVE1FTU9SWV9IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNTU4MmQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oCkBAIC0wLDAgKzEsMTU3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRvYmpzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoZSBGcmVlVHlwZSBwcml2YXRlIGJhc2UgY2xhc3NlcyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBhbGwgaW50ZXJuYWwgRnJlZVR5cGUgY2xhc3Nlcy4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fRlRPQkpTX0hfXworI2RlZmluZSBfX0ZUT0JKU19IX18KKworI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CisjaW5jbHVkZSBGVF9SRU5ERVJfSAorI2luY2x1ZGUgRlRfU0laRVNfSAorI2luY2x1ZGUgRlRfTENEX0ZJTFRFUl9ICisjaW5jbHVkZSBGVF9JTlRFUk5BTF9NRU1PUllfSAorI2luY2x1ZGUgRlRfSU5URVJOQUxfR0xZUEhfTE9BREVSX0gKKyNpbmNsdWRlIEZUX0lOVEVSTkFMX0RSSVZFUl9ICisjaW5jbHVkZSBGVF9JTlRFUk5BTF9BVVRPSElOVF9ICisjaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKKyNpbmNsdWRlIEZUX0lOVEVSTkFMX1BJQ19ICisKKyNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCisjaW5jbHVkZSBGVF9JTkNSRU1FTlRBTF9ICisjZW5kaWYKKworCitGVF9CRUdJTl9IRUFERVIKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU29tZSBnZW5lcmljIGRlZmluaXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgIDEKKyNlbmRpZgorCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFICAwCisjZW5kaWYKKworI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgICh2b2lkKikwCisjZW5kaWYKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlIG1pbiBhbmQgbWF4IGZ1bmN0aW9ucyBtaXNzaW5nIGluIEMuICBBcyB1c3VhbCwgYmUgY2FyZWZ1bCBub3QgdG8gICovCisgIC8qIHdyaXRlIHRoaW5ncyBsaWtlIEZUX01JTiggYSsrLCBiKysgKSB0byBhdm9pZCBzaWRlIGVmZmVjdHMuICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfTUlOKCBhLCBiICkgICggKGEpIDwgKGIpID8gKGEpIDogKGIpICkKKyNkZWZpbmUgRlRfTUFYKCBhLCBiICkgICggKGEpID4gKGIpID8gKGEpIDogKGIpICkKKworI2RlZmluZSBGVF9BQlMoIGEgKSAgICAgKCAoYSkgPCAwID8gLShhKSA6IChhKSApCisKKyAgLyoKKyAgICogIEFwcHJveGltYXRlIHNxcnQoeCp4K3kqeSkgdXNpbmcgdGhlIGBhbHBoYSBtYXggcGx1cyBiZXRhIG1pbicKKyAgICogIGFsZ29yaXRobS4gIFdlIHVzZSBhbHBoYSA9IDEsIGJldGEgPSAzLzgsIGdpdmluZyB1cyByZXN1bHRzIHdpdGggYQorICAgKiAgbGFyZ2VzdCBlcnJvciBsZXNzIHRoYW4gNyUgY29tcGFyZWQgdG8gdGhlIGV4YWN0IHZhbHVlLgorICAgKi8KKyNkZWZpbmUgRlRfSFlQT1QoIHgsIHkgKSAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICggeCA9IEZUX0FCUyggeCApLCAgICAgICAgICAgICBcCisgICAgICAgICAgICB5ID0gRlRfQUJTKCB5ICksICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHggPiB5ID8geCArICggMyAqIHkgPj4gMyApICAgXAorICAgICAgICAgICAgICAgICAgOiB5ICsgKCAzICogeCA+PiAzICkgKQorCisgIC8qIHdlIHVzZSBGVF9UWVBFT0YgdG8gc3VwcHJlc3Mgc2lnbmVkbmVzcyBjb21waWxhdGlvbiB3YXJuaW5ncyAqLworI2RlZmluZSBGVF9QQURfRkxPT1IoIHgsIG4gKSAgKCAoeCkgJiB+RlRfVFlQRU9GKCB4ICkoIChuKS0xICkgKQorI2RlZmluZSBGVF9QQURfUk9VTkQoIHgsIG4gKSAgRlRfUEFEX0ZMT09SKCAoeCkgKyAoKG4pLzIpLCBuICkKKyNkZWZpbmUgRlRfUEFEX0NFSUwoIHgsIG4gKSAgIEZUX1BBRF9GTE9PUiggKHgpICsgKChuKS0xKSwgbiApCisKKyNkZWZpbmUgRlRfUElYX0ZMT09SKCB4ICkgICAgICggKHgpICYgfkZUX1RZUEVPRiggeCApNjMgKQorI2RlZmluZSBGVF9QSVhfUk9VTkQoIHggKSAgICAgRlRfUElYX0ZMT09SKCAoeCkgKyAzMiApCisjZGVmaW5lIEZUX1BJWF9DRUlMKCB4ICkgICAgICBGVF9QSVhfRkxPT1IoICh4KSArIDYzICkKKworCisgIC8qCisgICAqICBjaGFyYWN0ZXIgY2xhc3NpZmljYXRpb24gZnVuY3Rpb25zIC0tIHNpbmNlIHRoZXNlIGFyZSB1c2VkIHRvIHBhcnNlCisgICAqICBmb250IGZpbGVzLCB3ZSBtdXN0IG5vdCB1c2UgdGhvc2UgaW4gPGN0eXBlcy5oPiB3aGljaCBhcmUKKyAgICogIGxvY2FsZS1kZXBlbmRlbnQKKyAgICovCisjZGVmaW5lICBmdF9pc2RpZ2l0KCB4ICkgICAoICggKHVuc2lnbmVkKSh4KSAtICcwJyApIDwgMTBVICkKKworI2RlZmluZSAgZnRfaXN4ZGlnaXQoIHggKSAgKCAoICh1bnNpZ25lZCkoeCkgLSAnMCcgKSA8IDEwVSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKHVuc2lnbmVkKSh4KSAtICdhJyApIDwgNlUgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAodW5zaWduZWQpKHgpIC0gJ0EnICkgPCA2VSAgKQorCisgIC8qIHRoZSBuZXh0IHR3byBtYWNyb3MgYXNzdW1lIEFTQ0lJIHJlcHJlc2VudGF0aW9uICovCisjZGVmaW5lICBmdF9pc3VwcGVyKCB4ICkgICggKCAodW5zaWduZWQpKHgpIC0gJ0EnICkgPCAyNlUgKQorI2RlZmluZSAgZnRfaXNsb3dlciggeCApICAoICggKHVuc2lnbmVkKSh4KSAtICdhJyApIDwgMjZVICkKKworI2RlZmluZSAgZnRfaXNhbHBoYSggeCApICAoIGZ0X2lzdXBwZXIoIHggKSB8fCBmdF9pc2xvd2VyKCB4ICkgKQorI2RlZmluZSAgZnRfaXNhbG51bSggeCApICAoIGZ0X2lzZGlnaXQoIHggKSB8fCBmdF9pc2FscGhhKCB4ICkgKQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgQyBIIEEgUiBNIEEgUCBTICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qIGhhbmRsZSB0byBpbnRlcm5hbCBjaGFybWFwIG9iamVjdCAqLworICB0eXBlZGVmIHN0cnVjdCBGVF9DTWFwUmVjXyogICAgICAgICAgICAgIEZUX0NNYXA7CisKKyAgLyogaGFuZGxlIHRvIGNoYXJtYXAgY2xhc3Mgc3RydWN0dXJlICovCisgIHR5cGVkZWYgY29uc3Qgc3RydWN0IEZUX0NNYXBfQ2xhc3NSZWNfKiAgRlRfQ01hcF9DbGFzczsKKworICAvKiBpbnRlcm5hbCBjaGFybWFwIG9iamVjdCBzdHJ1Y3R1cmUgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0NNYXBSZWNfCisgIHsKKyAgICBGVF9DaGFyTWFwUmVjICBjaGFybWFwOworICAgIEZUX0NNYXBfQ2xhc3MgIGNsYXp6OworCisgIH0gRlRfQ01hcFJlYzsKKworICAvKiB0eXBlY2FzZSBhbnkgcG9pbnRlciB0byBhIGNoYXJtYXAgaGFuZGxlICovCisjZGVmaW5lIEZUX0NNQVAoIHggKSAgICAgICAgICAgICAgKChGVF9DTWFwKSggeCApKQorCisgIC8qIG9idmlvdXMgbWFjcm9zICovCisjZGVmaW5lIEZUX0NNQVBfUExBVEZPUk1fSUQoIHggKSAgRlRfQ01BUCggeCApLT5jaGFybWFwLnBsYXRmb3JtX2lkCisjZGVmaW5lIEZUX0NNQVBfRU5DT0RJTkdfSUQoIHggKSAgRlRfQ01BUCggeCApLT5jaGFybWFwLmVuY29kaW5nX2lkCisjZGVmaW5lIEZUX0NNQVBfRU5DT0RJTkcoIHggKSAgICAgRlRfQ01BUCggeCApLT5jaGFybWFwLmVuY29kaW5nCisjZGVmaW5lIEZUX0NNQVBfRkFDRSggeCApICAgICAgICAgRlRfQ01BUCggeCApLT5jaGFybWFwLmZhY2UKKworCisgIC8qIGNsYXNzIG1ldGhvZCBkZWZpbml0aW9ucyAqLworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqRlRfQ01hcF9Jbml0RnVuYykoIEZUX0NNYXAgICAgIGNtYXAsCisgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgIGluaXRfZGF0YSApOworCisgIHR5cGVkZWYgdm9pZAorICAoKkZUX0NNYXBfRG9uZUZ1bmMpKCBGVF9DTWFwICBjbWFwICk7CisKKyAgdHlwZWRlZiBGVF9VSW50CisgICgqRlRfQ01hcF9DaGFySW5kZXhGdW5jKSggRlRfQ01hcCAgICBjbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlICk7CisKKyAgdHlwZWRlZiBGVF9VSW50CisgICgqRlRfQ01hcF9DaGFyTmV4dEZ1bmMpKCBGVF9DTWFwICAgICBjbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAqYWNoYXJfY29kZSApOworCisgIHR5cGVkZWYgRlRfVUludAorICAoKkZUX0NNYXBfQ2hhclZhckluZGV4RnVuYykoIEZUX0NNYXAgICAgY21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9DTWFwICAgIHVuaWNvZGVfY21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIGNoYXJfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIHZhcmlhbnRfc2VsZWN0b3IgKTsKKworICB0eXBlZGVmIEZUX0Jvb2wKKyAgKCpGVF9DTWFwX0NoYXJWYXJJc0RlZmF1bHRGdW5jKSggRlRfQ01hcCAgICBjbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIGNoYXJfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICB2YXJpYW50X3NlbGVjdG9yICk7CisKKyAgdHlwZWRlZiBGVF9VSW50MzIgKgorICAoKkZUX0NNYXBfVmFyaWFudExpc3RGdW5jKSggRlRfQ01hcCAgICBjbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW0gKTsKKworICB0eXBlZGVmIEZUX1VJbnQzMiAqCisgICgqRlRfQ01hcF9DaGFyVmFyaWFudExpc3RGdW5jKSggRlRfQ01hcCAgICBjbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlICk7CisKKyAgdHlwZWRlZiBGVF9VSW50MzIgKgorICAoKkZUX0NNYXBfVmFyaWFudENoYXJMaXN0RnVuYykoIEZUX0NNYXAgICAgY21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIHZhcmlhbnRfc2VsZWN0b3IgKTsKKworCisgIHR5cGVkZWYgc3RydWN0ICBGVF9DTWFwX0NsYXNzUmVjXworICB7CisgICAgRlRfVUxvbmcgICAgICAgICAgICAgICBzaXplOworICAgIEZUX0NNYXBfSW5pdEZ1bmMgICAgICAgaW5pdDsKKyAgICBGVF9DTWFwX0RvbmVGdW5jICAgICAgIGRvbmU7CisgICAgRlRfQ01hcF9DaGFySW5kZXhGdW5jICBjaGFyX2luZGV4OworICAgIEZUX0NNYXBfQ2hhck5leHRGdW5jICAgY2hhcl9uZXh0OworCisgICAgLyogU3Vic2VxdWVudCBlbnRyaWVzIGFyZSBzcGVjaWFsIG9uZXMgZm9yIGZvcm1hdCAxNCAtLSB0aGUgdmFyaWFudCAqLworICAgIC8qIHNlbGVjdG9yIHN1YnRhYmxlIHdoaWNoIGJlaGF2ZXMgbGlrZSBubyBvdGhlciAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIEZUX0NNYXBfQ2hhclZhckluZGV4RnVuYyAgICAgIGNoYXJfdmFyX2luZGV4OworICAgIEZUX0NNYXBfQ2hhclZhcklzRGVmYXVsdEZ1bmMgIGNoYXJfdmFyX2RlZmF1bHQ7CisgICAgRlRfQ01hcF9WYXJpYW50TGlzdEZ1bmMgICAgICAgdmFyaWFudF9saXN0OworICAgIEZUX0NNYXBfQ2hhclZhcmlhbnRMaXN0RnVuYyAgIGNoYXJ2YXJpYW50X2xpc3Q7CisgICAgRlRfQ01hcF9WYXJpYW50Q2hhckxpc3RGdW5jICAgdmFyaWFudGNoYXJfbGlzdDsKKworICB9IEZUX0NNYXBfQ2xhc3NSZWM7CisKKworI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQworCisjZGVmaW5lIEZUX0RFQ0xBUkVfQ01BUF9DTEFTUyggY2xhc3NfICkgICAgICAgICAgICAgIFwKKyAgRlRfQ0FMTEJBQ0tfVEFCTEUgY29uc3QgIEZUX0NNYXBfQ2xhc3NSZWMgY2xhc3NfOworCisjZGVmaW5lIEZUX0RFRklORV9DTUFQX0NMQVNTKCAgICAgICBcCisgICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgaW5pdF8sICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgY2hhcl9pbmRleF8sICAgICAgICAgICAgICBcCisgICAgICAgICAgY2hhcl9uZXh0XywgICAgICAgICAgICAgICBcCisgICAgICAgICAgY2hhcl92YXJfaW5kZXhfLCAgICAgICAgICBcCisgICAgICAgICAgY2hhcl92YXJfZGVmYXVsdF8sICAgICAgICBcCisgICAgICAgICAgdmFyaWFudF9saXN0XywgICAgICAgICAgICBcCisgICAgICAgICAgY2hhcnZhcmlhbnRfbGlzdF8sICAgICAgICBcCisgICAgICAgICAgdmFyaWFudGNoYXJfbGlzdF8gKSAgICAgICBcCisgIEZUX0NBTExCQUNLX1RBQkxFX0RFRiAgICAgICAgICAgICBcCisgIGNvbnN0IEZUX0NNYXBfQ2xhc3NSZWMgIGNsYXNzXyA9ICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2hhcl9pbmRleF8sICAgICAgICAgICAgICAgICAgICBcCisgICAgY2hhcl9uZXh0XywgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2hhcl92YXJfaW5kZXhfLCAgICAgICAgICAgICAgICBcCisgICAgY2hhcl92YXJfZGVmYXVsdF8sICAgICAgICAgICAgICBcCisgICAgdmFyaWFudF9saXN0XywgICAgICAgICAgICAgICAgICBcCisgICAgY2hhcnZhcmlhbnRfbGlzdF8sICAgICAgICAgICAgICBcCisgICAgdmFyaWFudGNoYXJfbGlzdF8gICAgICAgICAgICAgICBcCisgIH07CisKKyNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCisKKyNkZWZpbmUgRlRfREVDTEFSRV9DTUFQX0NMQVNTKCBjbGFzc18gKSAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgbGlicmFyeSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9DTWFwX0NsYXNzUmVjKiAgY2xhenogKTsKKworI2RlZmluZSBGVF9ERUZJTkVfQ01BUF9DTEFTUyggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNoYXJfaW5kZXhfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNoYXJfbmV4dF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNoYXJfdmFyX2luZGV4XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNoYXJfdmFyX2RlZmF1bHRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHZhcmlhbnRfbGlzdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNoYXJ2YXJpYW50X2xpc3RfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHZhcmlhbnRjaGFyX2xpc3RfICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICBsaWJyYXJ5LCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0NNYXBfQ2xhc3NSZWMqICBjbGF6eiApICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZUX1VOVVNFRCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5zaXplICAgICAgICAgICAgID0gc2l6ZV87ICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5pbml0ICAgICAgICAgICAgID0gaW5pdF87ICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5kb25lICAgICAgICAgICAgID0gZG9uZV87ICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5jaGFyX2luZGV4ICAgICAgID0gY2hhcl9pbmRleF87ICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5jaGFyX25leHQgICAgICAgID0gY2hhcl9uZXh0XzsgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5jaGFyX3Zhcl9pbmRleCAgID0gY2hhcl92YXJfaW5kZXhfOyAgICAgICAgICAgXAorICAgIGNsYXp6LT5jaGFyX3Zhcl9kZWZhdWx0ID0gY2hhcl92YXJfZGVmYXVsdF87ICAgICAgICAgXAorICAgIGNsYXp6LT52YXJpYW50X2xpc3QgICAgID0gdmFyaWFudF9saXN0XzsgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5jaGFydmFyaWFudF9saXN0ID0gY2hhcnZhcmlhbnRfbGlzdF87ICAgICAgICAgXAorICAgIGNsYXp6LT52YXJpYW50Y2hhcl9saXN0ID0gdmFyaWFudGNoYXJfbGlzdF87ICAgICAgICAgXAorICB9CisKKyNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLworCisKKyAgLyogY3JlYXRlIGEgbmV3IGNoYXJtYXAgYW5kIGFkZCBpdCB0byBjaGFybWFwLT5mYWNlICovCisgIEZUX0JBU0UoIEZUX0Vycm9yICkKKyAgRlRfQ01hcF9OZXcoIEZUX0NNYXBfQ2xhc3MgIGNsYXp6LAorICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgICAgaW5pdF9kYXRhLAorICAgICAgICAgICAgICAgRlRfQ2hhck1hcCAgICAgY2hhcm1hcCwKKyAgICAgICAgICAgICAgIEZUX0NNYXAgICAgICAgKmFjbWFwICk7CisKKyAgLyogZGVzdHJveSBhIGNoYXJtYXAgYW5kIHJlbW92ZSBpdCBmcm9tIGZhY2UncyBsaXN0ICovCisgIEZUX0JBU0UoIHZvaWQgKQorICBGVF9DTWFwX0RvbmUoIEZUX0NNYXAgIGNtYXAgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0ZhY2VfSW50ZXJuYWxSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBpbnRlcm5hbCBmaWVsZHMgb2YgZWFjaCBGVF9GYWNlICAgICAgICAqLworICAvKiAgICBvYmplY3QuICBUaGVzZSBmaWVsZHMgbWF5IGNoYW5nZSBiZXR3ZWVuIGRpZmZlcmVudCByZWxlYXNlcyBvZiAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4X3BvaW50cyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIHBvaW50cyB1c2VkIHRvIHN0b3JlIHRoZSB2ZWN0b3JpYWwgb3V0bGluZSAqLworICAvKiAgICAgIG9mIGFueSBnbHlwaCBpbiB0aGlzIGZhY2UuICBJZiB0aGlzIHZhbHVlIGNhbm5vdCBiZSBrbm93biBpbiAgICAgKi8KKyAgLyogICAgICBhZHZhbmNlLCBvciBpZiB0aGUgZmFjZSBpc24ndCBzY2FsYWJsZSwgdGhpcyBzaG91bGQgYmUgc2V0IHRvIDAuICovCisgIC8qICAgICAgT25seSByZWxldmFudCBmb3Igc2NhbGFibGUgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4X2NvbnRvdXJzIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbnRvdXJzIHVzZWQgdG8gc3RvcmUgdGhlIHZlY3RvcmlhbCAgICAgICAqLworICAvKiAgICAgIG91dGxpbmUgb2YgYW55IGdseXBoIGluIHRoaXMgZmFjZS4gIElmIHRoaXMgdmFsdWUgY2Fubm90IGJlICAgICAgKi8KKyAgLyogICAgICBrbm93biBpbiBhZHZhbmNlLCBvciBpZiB0aGUgZmFjZSBpc24ndCBzY2FsYWJsZSwgdGhpcyBzaG91bGQgYmUgICovCisgIC8qICAgICAgc2V0IHRvIDAuICBPbmx5IHJlbGV2YW50IGZvciBzY2FsYWJsZSBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdHJhbnNmb3JtX21hdHJpeCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgQSAyeDIgbWF0cml4IG9mIDE2LjE2IGNvZWZmaWNpZW50cyB1c2VkIHRvIHRyYW5zZm9ybSBnbHlwaCAgICAgICAqLworICAvKiAgICAgIG91dGxpbmVzIGFmdGVyIHRoZXkgYXJlIGxvYWRlZCBmcm9tIHRoZSBmb250LiAgT25seSB1c2VkIGJ5IHRoZSAgKi8KKyAgLyogICAgICBjb252ZW5pZW5jZSBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0cmFuc2Zvcm1fZGVsdGEgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBBIHRyYW5zbGF0aW9uIHZlY3RvciB1c2VkIHRvIHRyYW5zZm9ybSBnbHlwaCBvdXRsaW5lcyBhZnRlciB0aGV5ICovCisgIC8qICAgICAgYXJlIGxvYWRlZCBmcm9tIHRoZSBmb250LiAgT25seSB1c2VkIGJ5IHRoZSBjb252ZW5pZW5jZSAgICAgICAgICAqLworICAvKiAgICAgIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHRyYW5zZm9ybV9mbGFncyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIFNvbWUgZmxhZ3MgdXNlZCB0byBjbGFzc2lmeSB0aGUgdHJhbnNmb3JtLiAgT25seSB1c2VkIGJ5IHRoZSAgICAgKi8KKyAgLyogICAgICBjb252ZW5pZW5jZSBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzZXJ2aWNlcyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBBIGNhY2hlIGZvciBmcmVxdWVudGx5IHVzZWQgc2VydmljZXMuICBJdCBzaG91bGQgYmUgb25seSAgICAgICAgICovCisgIC8qICAgICAgYWNjZXNzZWQgd2l0aCB0aGUgbWFjcm8gYEZUX0ZBQ0VfTE9PS1VQX1NFUlZJQ0UnLiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW5jcmVtZW50YWxfaW50ZXJmYWNlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgSWYgbm9uLW51bGwsIHRoZSBpbnRlcmZhY2UgdGhyb3VnaCB3aGljaCBnbHlwaCBkYXRhIGFuZCBtZXRyaWNzICAqLworICAvKiAgICAgIGFyZSBsb2FkZWQgaW5jcmVtZW50YWxseSBmb3IgZmFjZXMgdGhhdCBkbyBub3QgcHJvdmlkZSBhbGwgb2YgICAgKi8KKyAgLyogICAgICB0aGlzIGRhdGEgd2hlbiBmaXJzdCBvcGVuZWQuICBUaGlzIGZpZWxkIGV4aXN0cyBvbmx5IGlmICAgICAgICAgICovCisgIC8qICAgICAgQEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwgaXMgZGVmaW5lZC4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaWdub3JlX3VucGF0ZW50ZWRfaGludGVyIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgVGhpcyBib29sZWFuIGZsYWcgaW5zdHJ1Y3RzIHRoZSBnbHlwaCBsb2FkZXIgdG8gaWdub3JlIHRoZSAgICAgICAqLworICAvKiAgICAgIG5hdGl2ZSBmb250IGhpbnRlciwgaWYgb25lIGlzIGZvdW5kLiAgVGhpcyBpcyBleGNsdXNpdmVseSB1c2VkICAgKi8KKyAgLyogICAgICBpbiB0aGUgY2FzZSB3aGVuIHRoZSB1bnBhdGVudGVkIGhpbnRlciBpcyBjb21waWxlZCB3aXRoaW4gdGhlICAgICovCisgIC8qICAgICAgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcmVmY291bnQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgQSBjb3VudGVyIGluaXRpYWxpemVkIHRvfjEgYXQgdGhlIHRpbWUgYW4gQEZUX0ZhY2Ugc3RydWN0dXJlIGlzICAqLworICAvKiAgICAgIGNyZWF0ZWQuICBARlRfUmVmZXJlbmNlX0ZhY2UgaW5jcmVtZW50cyB0aGlzIGNvdW50ZXIsIGFuZCAgICAgICAgKi8KKyAgLyogICAgICBARlRfRG9uZV9GYWNlIG9ubHkgZGVzdHJveXMgYSBmYWNlIGlmIHRoZSBjb3VudGVyIGlzfjEsICAgICAgICAgICovCisgIC8qICAgICAgb3RoZXJ3aXNlIGl0IHNpbXBseSBkZWNyZW1lbnRzIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0ZhY2VfSW50ZXJuYWxSZWNfCisgIHsKKyAgICBGVF9NYXRyaXggICAgICAgICAgIHRyYW5zZm9ybV9tYXRyaXg7CisgICAgRlRfVmVjdG9yICAgICAgICAgICB0cmFuc2Zvcm1fZGVsdGE7CisgICAgRlRfSW50ICAgICAgICAgICAgICB0cmFuc2Zvcm1fZmxhZ3M7CisKKyAgICBGVF9TZXJ2aWNlQ2FjaGVSZWMgIHNlcnZpY2VzOworCisjaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAorICAgIEZUX0luY3JlbWVudGFsX0ludGVyZmFjZVJlYyogIGluY3JlbWVudGFsX2ludGVyZmFjZTsKKyNlbmRpZgorCisgICAgRlRfQm9vbCAgICAgICAgICAgICBpZ25vcmVfdW5wYXRlbnRlZF9oaW50ZXI7CisgICAgRlRfSW50ICAgICAgICAgICAgICByZWZjb3VudDsKKworICB9IEZUX0ZhY2VfSW50ZXJuYWxSZWM7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TbG90X0ludGVybmFsUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgaW50ZXJuYWwgZmllbGRzIG9mIGVhY2ggRlRfR2x5cGhTbG90ICAgKi8KKyAgLyogICAgb2JqZWN0LiAgVGhlc2UgZmllbGRzIG1heSBjaGFuZ2UgYmV0d2VlbiBkaWZmZXJlbnQgcmVsZWFzZXMgb2YgICAgICovCisgIC8qICAgIEZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxvYWRlciAgICAgICAgICAgIDo6IFRoZSBnbHlwaCBsb2FkZXIgb2JqZWN0IHVzZWQgdG8gbG9hZCBvdXRsaW5lcyAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvIHRoZSBnbHlwaCBzbG90LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZsYWdzICAgICAgICAgICAgIDo6IFBvc3NpYmxlIHZhbHVlcyBhcmUgemVybyBvciAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HTFlQSF9PV05fQklUTUFQLiAgVGhlIGxhdHRlciBpbmRpY2F0ZXMgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGUgRlRfR2x5cGhTbG90IHN0cnVjdHVyZSBvd25zIHRoZSAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGhfdHJhbnNmb3JtZWQgOjogQm9vbGVhbi4gIFNldCB0byBUUlVFIHdoZW4gdGhlIGxvYWRlZCBnbHlwaCAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgdHJhbnNmb3JtZWQgdGhyb3VnaCBhIHNwZWNpZmljICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBmb250IHRyYW5zZm9ybWF0aW9uLiAgVGhpcyBpcyBfbm90XyB0aGUgc2FtZSAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgYXMgdGhlIGZhY2UgdHJhbnNmb3JtIHNldCB0aHJvdWdoICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NldF9UcmFuc2Zvcm0oKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGhfbWF0cml4ICAgICAgOjogVGhlIDJ4MiBtYXRyaXggY29ycmVzcG9uZGluZyB0byB0aGUgZ2x5cGggICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uLCBpZiBuZWNlc3NhcnkuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGhfZGVsdGEgICAgICAgOjogVGhlIDJkIHRyYW5zbGF0aW9uIHZlY3RvciBjb3JyZXNwb25kaW5nIHRvICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBnbHlwaCB0cmFuc2Zvcm1hdGlvbiwgaWYgbmVjZXNzYXJ5LiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGhfaGludHMgICAgICAgOjogRm9ybWF0LXNwZWNpZmljIGdseXBoIGhpbnRzIG1hbmFnZW1lbnQuICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIEZUX0dMWVBIX09XTl9CSVRNQVAgIDB4MVUKKworICB0eXBlZGVmIHN0cnVjdCAgRlRfU2xvdF9JbnRlcm5hbFJlY18KKyAgeworICAgIEZUX0dseXBoTG9hZGVyICBsb2FkZXI7CisgICAgRlRfVUludCAgICAgICAgIGZsYWdzOworICAgIEZUX0Jvb2wgICAgICAgICBnbHlwaF90cmFuc2Zvcm1lZDsKKyAgICBGVF9NYXRyaXggICAgICAgZ2x5cGhfbWF0cml4OworICAgIEZUX1ZlY3RvciAgICAgICBnbHlwaF9kZWx0YTsKKyAgICB2b2lkKiAgICAgICAgICAgZ2x5cGhfaGludHM7CisKKyAgfSBGVF9HbHlwaFNsb3RfSW50ZXJuYWxSZWM7CisKKworI2lmIDAKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TaXplX0ludGVybmFsUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgaW50ZXJuYWwgZmllbGRzIG9mIGVhY2ggRlRfU2l6ZSAgICAgICAgKi8KKyAgLyogICAgb2JqZWN0LiAgQ3VycmVudGx5LCBpdCdzIGVtcHR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICB0eXBlZGVmIHN0cnVjdCAgRlRfU2l6ZV9JbnRlcm5hbFJlY18KKyAgeworICAgIC8qIGVtcHR5ICovCisKKyAgfSBGVF9TaXplX0ludGVybmFsUmVjOworCisjZW5kaWYKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgTSBPIEQgVSBMIEUgUyAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX01vZHVsZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgbW9kdWxlIG9iamVjdCBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNsYXp6ICAgOjogQSBwb2ludGVyIHRvIHRoZSBtb2R1bGUncyBjbGFzcy4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSB0byB0aGUgcGFyZW50IGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtZW1vcnkgIDo6IEEgaGFuZGxlIHRvIHRoZSBtZW1vcnkgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBGVF9Nb2R1bGVSZWNfCisgIHsKKyAgICBGVF9Nb2R1bGVfQ2xhc3MqICBjbGF6ejsKKyAgICBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5OworICAgIEZUX01lbW9yeSAgICAgICAgIG1lbW9yeTsKKworICB9IEZUX01vZHVsZVJlYzsKKworCisgIC8qIHR5cGVjYXN0IGFuIG9iamVjdCB0byBhbiBGVF9Nb2R1bGUgKi8KKyNkZWZpbmUgRlRfTU9EVUxFKCB4ICkgICAgICAgICAgKChGVF9Nb2R1bGUpKCB4ICkpCisjZGVmaW5lIEZUX01PRFVMRV9DTEFTUyggeCApICAgIEZUX01PRFVMRSggeCApLT5jbGF6egorI2RlZmluZSBGVF9NT0RVTEVfTElCUkFSWSggeCApICBGVF9NT0RVTEUoIHggKS0+bGlicmFyeQorI2RlZmluZSBGVF9NT0RVTEVfTUVNT1JZKCB4ICkgICBGVF9NT0RVTEUoIHggKS0+bWVtb3J5CisKKworI2RlZmluZSBGVF9NT0RVTEVfSVNfRFJJVkVSKCB4ICkgICggRlRfTU9EVUxFX0NMQVNTKCB4ICktPm1vZHVsZV9mbGFncyAmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01PRFVMRV9GT05UX0RSSVZFUiApCisKKyNkZWZpbmUgRlRfTU9EVUxFX0lTX1JFTkRFUkVSKCB4ICkgICggRlRfTU9EVUxFX0NMQVNTKCB4ICktPm1vZHVsZV9mbGFncyAmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTU9EVUxFX1JFTkRFUkVSICkKKworI2RlZmluZSBGVF9NT0RVTEVfSVNfSElOVEVSKCB4ICkgICggRlRfTU9EVUxFX0NMQVNTKCB4ICktPm1vZHVsZV9mbGFncyAmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01PRFVMRV9ISU5URVIgKQorCisjZGVmaW5lIEZUX01PRFVMRV9JU19TVFlMRVIoIHggKSAgKCBGVF9NT0RVTEVfQ0xBU1MoIHggKS0+bW9kdWxlX2ZsYWdzICYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTU9EVUxFX1NUWUxFUiApCisKKyNkZWZpbmUgRlRfRFJJVkVSX0lTX1NDQUxBQkxFKCB4ICkgICggRlRfTU9EVUxFX0NMQVNTKCB4ICktPm1vZHVsZV9mbGFncyAmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTU9EVUxFX0RSSVZFUl9TQ0FMQUJMRSApCisKKyNkZWZpbmUgRlRfRFJJVkVSX1VTRVNfT1VUTElORVMoIHggKSAgISggRlRfTU9EVUxFX0NMQVNTKCB4ICktPm1vZHVsZV9mbGFncyAmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTU9EVUxFX0RSSVZFUl9OT19PVVRMSU5FUyApCisKKyNkZWZpbmUgRlRfRFJJVkVSX0hBU19ISU5URVIoIHggKSAgKCBGVF9NT0RVTEVfQ0xBU1MoIHggKS0+bW9kdWxlX2ZsYWdzICYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01PRFVMRV9EUklWRVJfSEFTX0hJTlRFUiApCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZXRfTW9kdWxlX0ludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGaW5kcyBhIG1vZHVsZSBhbmQgcmV0dXJucyBpdHMgc3BlY2lmaWMgaW50ZXJmYWNlIGFzIGEgdHlwZWxlc3MgICAgKi8KKyAgLyogICAgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlicmFyeSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtb2R1bGVfbmFtZSA6OiBUaGUgbW9kdWxlJ3MgbmFtZSAoYXMgYW4gQVNDSUkgc3RyaW5nKS4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIG1vZHVsZS1zcGVjaWZpYyBpbnRlcmZhY2UgaWYgYXZhaWxhYmxlLCAwIG90aGVyd2lzZS4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBZb3Ugc2hvdWxkIGJldHRlciBiZSBmYW1pbGlhciB3aXRoIEZyZWVUeXBlIGludGVybmFscyB0byBrbm93ICAgICAgKi8KKyAgLyogICAgd2hpY2ggbW9kdWxlIHRvIGxvb2sgZm9yLCBhbmQgd2hhdCBpdHMgaW50ZXJmYWNlIGlzIDotKSAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9CQVNFKCBjb25zdCB2b2lkKiApCisgIEZUX0dldF9Nb2R1bGVfSW50ZXJmYWNlKCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBtb2RfbmFtZSApOworCisgIEZUX0JBU0UoIEZUX1BvaW50ZXIgKQorICBmdF9tb2R1bGVfZ2V0X3NlcnZpY2UoIEZUX01vZHVsZSAgICBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHNlcnZpY2VfaWQgKTsKKworICAvKiAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgIEYgQSBDIEUsICAgUyBJIFogRSAgICYgICBHIEwgWSBQIEggICBTIEwgTyBUICAgTyBCIEogRSBDIFQgUyAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qIGEgZmV3IG1hY3JvcyB1c2VkIHRvIHBlcmZvcm0gZWFzeSB0eXBlY2FzdHMgd2l0aCBtaW5pbWFsIGJyYWluIGRhbWFnZSAqLworCisjZGVmaW5lIEZUX0ZBQ0UoIHggKSAgICAgICAgICAoKEZUX0ZhY2UpKHgpKQorI2RlZmluZSBGVF9TSVpFKCB4ICkgICAgICAgICAgKChGVF9TaXplKSh4KSkKKyNkZWZpbmUgRlRfU0xPVCggeCApICAgICAgICAgICgoRlRfR2x5cGhTbG90KSh4KSkKKworI2RlZmluZSBGVF9GQUNFX0RSSVZFUiggeCApICAgRlRfRkFDRSggeCApLT5kcml2ZXIKKyNkZWZpbmUgRlRfRkFDRV9MSUJSQVJZKCB4ICkgIEZUX0ZBQ0VfRFJJVkVSKCB4ICktPnJvb3QubGlicmFyeQorI2RlZmluZSBGVF9GQUNFX01FTU9SWSggeCApICAgRlRfRkFDRSggeCApLT5tZW1vcnkKKyNkZWZpbmUgRlRfRkFDRV9TVFJFQU0oIHggKSAgIEZUX0ZBQ0UoIHggKS0+c3RyZWFtCisKKyNkZWZpbmUgRlRfU0laRV9GQUNFKCB4ICkgICAgIEZUX1NJWkUoIHggKS0+ZmFjZQorI2RlZmluZSBGVF9TTE9UX0ZBQ0UoIHggKSAgICAgRlRfU0xPVCggeCApLT5mYWNlCisKKyNkZWZpbmUgRlRfRkFDRV9TTE9UKCB4ICkgICAgIEZUX0ZBQ0UoIHggKS0+Z2x5cGgKKyNkZWZpbmUgRlRfRkFDRV9TSVpFKCB4ICkgICAgIEZUX0ZBQ0UoIHggKS0+c2l6ZQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTmV3X0dseXBoU2xvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgSXQgaXMgc29tZXRpbWVzIHVzZWZ1bCB0byBoYXZlIG1vcmUgdGhhbiBvbmUgZ2x5cGggc2xvdCBmb3IgYSAgICAgICovCisgIC8qICAgIGdpdmVuIGZhY2Ugb2JqZWN0LiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhZGRpdGlvbmFsICAgICAqLworICAvKiAgICBzbG90cy4gIEFsbCBvZiB0aGVtIGFyZSBhdXRvbWF0aWNhbGx5IGRpc2NhcmRlZCB3aGVuIHRoZSBmYWNlIGlzICAgKi8KKyAgLyogICAgZGVzdHJveWVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgOjogQSBoYW5kbGUgdG8gYSBwYXJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYXNsb3QgOjogQSBoYW5kbGUgdG8gYSBuZXcgZ2x5cGggc2xvdCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9CQVNFKCBGVF9FcnJvciApCisgIEZUX05ld19HbHlwaFNsb3QoIEZUX0ZhY2UgICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgKmFzbG90ICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9Eb25lX0dseXBoU2xvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBEZXN0cm95cyBhIGdpdmVuIGdseXBoIHNsb3QuICBSZW1lbWJlciBob3dldmVyIHRoYXQgYWxsIHNsb3RzIGFyZSAgKi8KKyAgLyogICAgYXV0b21hdGljYWxseSBkZXN0cm95ZWQgd2l0aCBpdHMgcGFyZW50LiAgVXNpbmcgdGhpcyBmdW5jdGlvbiBpcyAgICovCisgIC8qICAgIG5vdCBhbHdheXMgbWFuZGF0b3J5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNsb3QgOjogQSBoYW5kbGUgdG8gYSB0YXJnZXQgZ2x5cGggc2xvdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfQkFTRSggdm9pZCApCisgIEZUX0RvbmVfR2x5cGhTbG90KCBGVF9HbHlwaFNsb3QgIHNsb3QgKTsKKworIC8qICovCisKKyNkZWZpbmUgRlRfUkVRVUVTVF9XSURUSCggcmVxICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoIChyZXEpLT5ob3JpUmVzb2x1dGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgPyAoIChyZXEpLT53aWR0aCAqIChGVF9Qb3MpKHJlcSktPmhvcmlSZXNvbHV0aW9uICsgMzYgKSAvIDcyIFwKKyAgICAgICAgICAgICAgOiAocmVxKS0+d2lkdGggKQorCisjZGVmaW5lIEZUX1JFUVVFU1RfSEVJR0hUKCByZXEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICggKHJlcSktPnZlcnRSZXNvbHV0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgPyAoIChyZXEpLT5oZWlnaHQgKiAoRlRfUG9zKShyZXEpLT52ZXJ0UmVzb2x1dGlvbiArIDM2ICkgLyA3MiBcCisgICAgICAgICAgICAgIDogKHJlcSktPmhlaWdodCApCisKKworICAvKiBTZXQgdGhlIG1ldHJpY3MgYWNjb3JkaW5nIHRvIGEgYml0bWFwIHN0cmlrZS4gKi8KKyAgRlRfQkFTRSggdm9pZCApCisgIEZUX1NlbGVjdF9NZXRyaWNzKCBGVF9GYWNlICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBzdHJpa2VfaW5kZXggKTsKKworCisgIC8qIFNldCB0aGUgbWV0cmljcyBhY2NvcmRpbmcgdG8gYSBzaXplIHJlcXVlc3QuICovCisgIEZUX0JBU0UoIHZvaWQgKQorICBGVF9SZXF1ZXN0X01ldHJpY3MoIEZUX0ZhY2UgICAgICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICBGVF9TaXplX1JlcXVlc3QgIHJlcSApOworCisKKyAgLyogTWF0Y2ggYSBzaXplIHJlcXVlc3QgYWdhaW5zdCBgYXZhaWxhYmxlX3NpemVzJy4gKi8KKyAgRlRfQkFTRSggRlRfRXJyb3IgKQorICBGVF9NYXRjaF9TaXplKCBGVF9GYWNlICAgICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgIEZUX1NpemVfUmVxdWVzdCAgcmVxLAorICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgIGlnbm9yZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgICBzaXplX2luZGV4ICk7CisKKworICAvKiBVc2UgdGhlIGhvcml6b250YWwgbWV0cmljcyB0byBzeW50aGVzaXplIHRoZSB2ZXJ0aWNhbCBtZXRyaWNzLiAqLworICAvKiBJZiBgYWR2YW5jZScgaXMgemVybywgaXQgaXMgYWxzbyBzeW50aGVzaXplZC4gICAgICAgICAgICAgICAgICAqLworICBGVF9CQVNFKCB2b2lkICkKKyAgZnRfc3ludGhlc2l6ZV92ZXJ0aWNhbF9tZXRyaWNzKCBGVF9HbHlwaF9NZXRyaWNzKiAgbWV0cmljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICAgICAgYWR2YW5jZSApOworCisKKyAgLyogRnJlZSB0aGUgYml0bWFwIG9mIGEgZ2l2ZW4gZ2x5cGhzbG90IHdoZW4gbmVlZGVkIChpLmUuLCBvbmx5IHdoZW4gaXQgKi8KKyAgLyogd2FzIGFsbG9jYXRlZCB3aXRoIGZ0X2dseXBoc2xvdF9hbGxvY19iaXRtYXApLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfQkFTRSggdm9pZCApCisgIGZ0X2dseXBoc2xvdF9mcmVlX2JpdG1hcCggRlRfR2x5cGhTbG90ICBzbG90ICk7CisKKworICAvKiBBbGxvY2F0ZSBhIG5ldyBiaXRtYXAgYnVmZmVyIGluIGEgZ2x5cGggc2xvdC4gKi8KKyAgRlRfQkFTRSggRlRfRXJyb3IgKQorICBmdF9nbHlwaHNsb3RfYWxsb2NfYml0bWFwKCBGVF9HbHlwaFNsb3QgIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgc2l6ZSApOworCisKKyAgLyogU2V0IHRoZSBiaXRtYXAgYnVmZmVyIGluIGEgZ2x5cGggc2xvdCB0byBhIGdpdmVuIHBvaW50ZXIuICBUaGUgYnVmZmVyICovCisgIC8qIHdpbGwgbm90IGJlIGZyZWVkIGJ5IGEgbGF0ZXIgY2FsbCB0byBmdF9nbHlwaHNsb3RfZnJlZV9iaXRtYXAuICAgICAgICAqLworICBGVF9CQVNFKCB2b2lkICkKKyAgZnRfZ2x5cGhzbG90X3NldF9iaXRtYXAoIEZUX0dseXBoU2xvdCAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgYnVmZmVyICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgUiBFIE4gRCBFIFIgRSBSIFMgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2RlZmluZSBGVF9SRU5ERVJFUiggeCApICAgICAgKChGVF9SZW5kZXJlcikoIHggKSkKKyNkZWZpbmUgRlRfR0xZUEgoIHggKSAgICAgICAgICgoRlRfR2x5cGgpKCB4ICkpCisjZGVmaW5lIEZUX0JJVE1BUF9HTFlQSCggeCApICAoKEZUX0JpdG1hcEdseXBoKSggeCApKQorI2RlZmluZSBGVF9PVVRMSU5FX0dMWVBIKCB4ICkgKChGVF9PdXRsaW5lR2x5cGgpKCB4ICkpCisKKworICB0eXBlZGVmIHN0cnVjdCAgRlRfUmVuZGVyZXJSZWNfCisgIHsKKyAgICBGVF9Nb2R1bGVSZWMgICAgICAgICAgICByb290OworICAgIEZUX1JlbmRlcmVyX0NsYXNzKiAgICAgIGNsYXp6OworICAgIEZUX0dseXBoX0Zvcm1hdCAgICAgICAgIGdseXBoX2Zvcm1hdDsKKyAgICBGVF9HbHlwaF9DbGFzcyAgICAgICAgICBnbHlwaF9jbGFzczsKKworICAgIEZUX1Jhc3RlciAgICAgICAgICAgICAgIHJhc3RlcjsKKyAgICBGVF9SYXN0ZXJfUmVuZGVyX0Z1bmMgICByYXN0ZXJfcmVuZGVyOworICAgIEZUX1JlbmRlcmVyX1JlbmRlckZ1bmMgIHJlbmRlcjsKKworICB9IEZUX1JlbmRlcmVyUmVjOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgRiBPIE4gVCAgIEQgUiBJIFYgRSBSIFMgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyogdHlwZWNhc3QgYSBtb2R1bGUgaW50byBhIGRyaXZlciBlYXNpbHkgKi8KKyNkZWZpbmUgRlRfRFJJVkVSKCB4ICkgICAgICAgICgoRlRfRHJpdmVyKSh4KSkKKworICAvKiB0eXBlY2FzdCBhIG1vZHVsZSBhcyBhIGRyaXZlciwgYW5kIGdldCBpdHMgZHJpdmVyIGNsYXNzICovCisjZGVmaW5lIEZUX0RSSVZFUl9DTEFTUyggeCApICBGVF9EUklWRVIoIHggKS0+Y2xhenoKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0RyaXZlclJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSByb290IGZvbnQgZHJpdmVyIGNsYXNzLiAgQSBmb250IGRyaXZlciBpcyByZXNwb25zaWJsZSBmb3IgICAgICAqLworICAvKiAgICBtYW5hZ2luZyBhbmQgbG9hZGluZyBmb250IGZpbGVzIG9mIGEgZ2l2ZW4gZm9ybWF0LiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgcm9vdCAgICAgICAgIDo6IENvbnRhaW5zIHRoZSBmaWVsZHMgb2YgdGhlIHJvb3QgbW9kdWxlIGNsYXNzLiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBjbGF6eiAgICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBmb250IGRyaXZlcidzIGNsYXNzLiAgTm90ZSB0aGF0ICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgTk9UIHJvb3QuY2xhenouICBgY2xhc3MnIHdhc24ndCB1c2VkICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICBhcyBpdCBpcyBhIHJlc2VydmVkIHdvcmQgaW4gQysrLiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgZmFjZXNfbGlzdCAgIDo6IFRoZSBsaXN0IG9mIGZhY2VzIGN1cnJlbnRseSBvcGVuZWQgYnkgdGhpcyAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICBkcml2ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgZ2x5cGhfbG9hZGVyIDo6IFVudXNlZC4gIFVzZWQgdG8gYmUgZ2x5cGggbG9hZGVyIGZvciBhbGwgZmFjZXMgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICBtYW5hZ2VkIGJ5IHRoaXMgZHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgRlRfRHJpdmVyUmVjXworICB7CisgICAgRlRfTW9kdWxlUmVjICAgICByb290OworICAgIEZUX0RyaXZlcl9DbGFzcyAgY2xheno7CisgICAgRlRfTGlzdFJlYyAgICAgICBmYWNlc19saXN0OworICAgIEZUX0dseXBoTG9hZGVyICAgZ2x5cGhfbG9hZGVyOworCisgIH0gRlRfRHJpdmVyUmVjOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgTCBJIEIgUiBBIFIgSSBFIFMgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyogVGhpcyBob29rIGlzIHVzZWQgYnkgdGhlIFRydWVUeXBlIGRlYnVnZ2VyLiAgSXQgbXVzdCBiZSBzZXQgdG8gYW4gKi8KKyAgLyogYWx0ZXJuYXRlIHRydWV0eXBlIGJ5dGVjb2RlIGludGVycHJldGVyIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfREVCVUdfSE9PS19UUlVFVFlQRSAgICAgICAgICAgIDAKKworCisgIC8qIFNldCB0aGlzIGRlYnVnIGhvb2sgdG8gYSBub24tbnVsbCBwb2ludGVyIHRvIGZvcmNlIHVucGF0ZW50ZWQgaGludGluZyAqLworICAvKiBmb3IgYWxsIGZhY2VzIHdoZW4gYm90aCBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIgYW5kICAgICAgICAgICAgICAgKi8KKyAgLyogVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcgYXJlIGRlZmluZWQuICBUaGlzIGlzIG9ubHkgdXNlZCAgICovCisgIC8qIGR1cmluZyBkZWJ1Z2dpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9ERUJVR19IT09LX1VOUEFURU5URURfSElOVElORyAgMQorCisKKyAgdHlwZWRlZiB2b2lkICAoKkZUX0JpdG1hcF9MY2RGaWx0ZXJGdW5jKSggRlRfQml0bWFwKiAgICAgIGJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgIHJlbmRlcl9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9MaWJyYXJ5ICAgICAgbGlicmFyeSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTGlicmFyeVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIEZyZWVUeXBlIGxpYnJhcnkgY2xhc3MuICBUaGlzIGlzIHRoZSByb290IG9mIGFsbCBGcmVlVHlwZSAgICAgICovCisgIC8qICAgIGRhdGEuICBVc2UgRlRfTmV3X0xpYnJhcnkoKSB0byBjcmVhdGUgYSBsaWJyYXJ5IG9iamVjdCwgYW5kICAgICAgICAqLworICAvKiAgICBGVF9Eb25lX0xpYnJhcnkoKSB0byBkaXNjYXJkIGl0IGFuZCBhbGwgY2hpbGQgb2JqZWN0cy4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtZW1vcnkgICAgICAgICAgIDo6IFRoZSBsaWJyYXJ5J3MgbWVtb3J5IG9iamVjdC4gIE1hbmFnZXMgbWVtb3J5ICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB2ZXJzaW9uX21ham9yICAgIDo6IFRoZSBtYWpvciB2ZXJzaW9uIG51bWJlciBvZiB0aGUgbGlicmFyeS4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHZlcnNpb25fbWlub3IgICAgOjogVGhlIG1pbm9yIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBsaWJyYXJ5LiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdmVyc2lvbl9wYXRjaCAgICA6OiBUaGUgY3VycmVudCBwYXRjaCBsZXZlbCBvZiB0aGUgbGlicmFyeS4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fbW9kdWxlcyAgICAgIDo6IFRoZSBudW1iZXIgb2YgbW9kdWxlcyBjdXJyZW50bHkgcmVnaXN0ZXJlZCAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICB3aXRoaW4gdGhpcyBsaWJyYXJ5LiAgVGhpcyBpcyBzZXQgdG8gMCBmb3IgbmV3ICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzLiAgTmV3IG1vZHVsZXMgYXJlIGFkZGVkIHRocm91Z2ggdGhlICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgIEZUX0FkZF9Nb2R1bGUoKSBBUEkgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1vZHVsZXMgICAgICAgICAgOjogQSB0YWJsZSB1c2VkIHRvIHN0b3JlIGhhbmRsZXMgdG8gdGhlIGN1cnJlbnRseSAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQgbW9kdWxlcy4gTm90ZSB0aGF0IGVhY2ggZm9udCBkcml2ZXIgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucyBhIGxpc3Qgb2YgaXRzIG9wZW5lZCBmYWNlcy4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByZW5kZXJlcnMgICAgICAgIDo6IFRoZSBsaXN0IG9mIHJlbmRlcmVycyBjdXJyZW50bHkgcmVnaXN0ZXJlZCAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICB3aXRoaW4gdGhlIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjdXJfcmVuZGVyZXIgICAgIDo6IFRoZSBjdXJyZW50IG91dGxpbmUgcmVuZGVyZXIuICBUaGlzIGlzIGEgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICBzaG9ydGN1dCB1c2VkIHRvIGF2b2lkIHBhcnNpbmcgdGhlIGxpc3Qgb24gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBjYWxsIHRvIEZUX091dGxpbmVfUmVuZGVyKCkuICBJdCBpcyBhICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSB0byB0aGUgY3VycmVudCByZW5kZXJlciBmb3IgdGhlICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSBmb3JtYXQuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhdXRvX2hpbnRlciAgICAgIDo6IFhYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJhc3Rlcl9wb29sICAgICAgOjogVGhlIHJhc3RlciBvYmplY3QncyByZW5kZXIgcG9vbC4gIFRoaXMgY2FuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGlkZWFsbHkgYmUgY2hhbmdlZCBkeW5hbWljYWxseSBhdCBydW4tdGltZS4gICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJhc3Rlcl9wb29sX3NpemUgOjogVGhlIHNpemUgb2YgdGhlIHJlbmRlciBwb29sIGluIGJ5dGVzLiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZGVidWdfaG9va3MgICAgICA6OiBYWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsY2RfZmlsdGVyICAgICAgIDo6IElmIHN1YnBpeGVsIHJlbmRlcmluZyBpcyBhY3RpdmF0ZWQsIHRoZSAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCBMQ0QgZmlsdGVyIG1vZGUuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsY2RfZXh0cmEgICAgICAgIDo6IElmIHN1YnBpeGVsIHJlbmRlcmluZyBpcyBhY3RpdmF0ZWQsIHRoZSBudW1iZXIgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICBvZiBleHRyYSBwaXhlbHMgbmVlZGVkIGZvciB0aGUgTENEIGZpbHRlci4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsY2Rfd2VpZ2h0cyAgICAgIDo6IElmIHN1YnBpeGVsIHJlbmRlcmluZyBpcyBhY3RpdmF0ZWQsIHRoZSBMQ0QgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgd2VpZ2h0cywgaWYgYW55LiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsY2RfZmlsdGVyX2Z1bmMgIDo6IElmIHN1YnBpeGVsIHJlbmRlcmluZyBpcyBhY3RpdmF0ZWQsIHRoZSBMQ0QgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJpbmcgY2FsbGJhY2sgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwaWNfY29udGFpbmVyICAgIDo6IENvbnRhaW5zIGdsb2JhbCBzdHJ1Y3RzIGFuZCB0YWJsZXMsIGluc3RlYWQgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICBvZiBkZWZpbmluZyB0aGVtIGdsb2JhbGxseS4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByZWZjb3VudCAgICAgICAgIDo6IEEgY291bnRlciBpbml0aWFsaXplZCB0b34xIGF0IHRoZSB0aW1lIGFuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICBARlRfTGlicmFyeSBzdHJ1Y3R1cmUgaXMgY3JlYXRlZC4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgQEZUX1JlZmVyZW5jZV9MaWJyYXJ5IGluY3JlbWVudHMgdGhpcyBjb3VudGVyLCAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBARlRfRG9uZV9MaWJyYXJ5IG9ubHkgZGVzdHJveXMgYSBsaWJyYXJ5ICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgY291bnRlciBpc34xLCBvdGhlcndpc2UgaXQgc2ltcGx5ICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgZGVjcmVtZW50cyBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0xpYnJhcnlSZWNfCisgIHsKKyAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5OyAgICAgICAgICAgLyogbGlicmFyeSdzIG1lbW9yeSBtYW5hZ2VyICovCisKKyAgICBGVF9JbnQgICAgICAgICAgICAgdmVyc2lvbl9tYWpvcjsKKyAgICBGVF9JbnQgICAgICAgICAgICAgdmVyc2lvbl9taW5vcjsKKyAgICBGVF9JbnQgICAgICAgICAgICAgdmVyc2lvbl9wYXRjaDsKKworICAgIEZUX1VJbnQgICAgICAgICAgICBudW1fbW9kdWxlczsKKyAgICBGVF9Nb2R1bGUgICAgICAgICAgbW9kdWxlc1tGVF9NQVhfTU9EVUxFU107ICAvKiBtb2R1bGUgb2JqZWN0cyAgKi8KKworICAgIEZUX0xpc3RSZWMgICAgICAgICByZW5kZXJlcnM7ICAgICAgICAvKiBsaXN0IG9mIHJlbmRlcmVycyAgICAgICAgKi8KKyAgICBGVF9SZW5kZXJlciAgICAgICAgY3VyX3JlbmRlcmVyOyAgICAgLyogY3VycmVudCBvdXRsaW5lIHJlbmRlcmVyICovCisgICAgRlRfTW9kdWxlICAgICAgICAgIGF1dG9faGludGVyOworCisgICAgRlRfQnl0ZSogICAgICAgICAgIHJhc3Rlcl9wb29sOyAgICAgIC8qIHNjYW4tbGluZSBjb252ZXJzaW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlbmRlciBwb29sICAgICAgICAgICovCisgICAgRlRfVUxvbmcgICAgICAgICAgIHJhc3Rlcl9wb29sX3NpemU7IC8qIHNpemUgb2YgcmVuZGVyIHBvb2wgaW4gYnl0ZXMgKi8KKworICAgIEZUX0RlYnVnSG9va19GdW5jICBkZWJ1Z19ob29rc1s0XTsKKworI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HCisgICAgRlRfTGNkRmlsdGVyICAgICAgICAgICAgIGxjZF9maWx0ZXI7CisgICAgRlRfSW50ICAgICAgICAgICAgICAgICAgIGxjZF9leHRyYTsgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBwaXhlbHMgKi8KKyAgICBGVF9CeXRlICAgICAgICAgICAgICAgICAgbGNkX3dlaWdodHNbN107ICAgLyogZmlsdGVyIHdlaWdodHMsIGlmIGFueSAqLworICAgIEZUX0JpdG1hcF9MY2RGaWx0ZXJGdW5jICBsY2RfZmlsdGVyX2Z1bmM7ICAvKiBmaWx0ZXJpbmcgY2FsbGJhY2sgICAgICovCisjZW5kaWYKKworI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCisgICAgRlRfUElDX0NvbnRhaW5lciAgIHBpY19jb250YWluZXI7CisjZW5kaWYKKworICAgIEZUX0ludCAgICAgICAgICAgICByZWZjb3VudDsKKworICB9IEZUX0xpYnJhcnlSZWM7CisKKworICBGVF9CQVNFKCBGVF9SZW5kZXJlciApCisgIEZUX0xvb2t1cF9SZW5kZXJlciggRlRfTGlicmFyeSAgICAgICBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoX0Zvcm1hdCAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgIEZUX0xpc3ROb2RlKiAgICAgbm9kZSApOworCisgIEZUX0JBU0UoIEZUX0Vycm9yICkKKyAgRlRfUmVuZGVyX0dseXBoX0ludGVybmFsKCBGVF9MaWJyYXJ5ICAgICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgcmVuZGVyX21vZGUgKTsKKworICB0eXBlZGVmIGNvbnN0IGNoYXIqCisgICgqRlRfRmFjZV9HZXRQb3N0c2NyaXB0TmFtZUZ1bmMpKCBGVF9GYWNlICBmYWNlICk7CisKKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKkZUX0ZhY2VfR2V0R2x5cGhOYW1lRnVuYykoIEZUX0ZhY2UgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGJ1ZmZlcl9tYXggKTsKKworICB0eXBlZGVmIEZUX1VJbnQKKyAgKCpGVF9GYWNlX0dldEdseXBoTmFtZUluZGV4RnVuYykoIEZUX0ZhY2UgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJpbmcqICBnbHlwaF9uYW1lICk7CisKKworI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX05PX0RFRkFVTFRfU1lTVEVNCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTmV3X01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ3JlYXRlcyBhIG5ldyBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBwb2ludGVyIHRvIHRoZSBuZXcgbWVtb3J5IG9iamVjdC4gIDAgaW4gY2FzZSBvZiBlcnJvci4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9CQVNFKCBGVF9NZW1vcnkgKQorICBGVF9OZXdfTWVtb3J5KCB2b2lkICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9Eb25lX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBEaXNjYXJkcyBtZW1vcnkgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtZW1vcnkgOjogQSBoYW5kbGUgdG8gdGhlIG1lbW9yeSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0JBU0UoIHZvaWQgKQorICBGVF9Eb25lX01lbW9yeSggRlRfTWVtb3J5ICBtZW1vcnkgKTsKKworI2VuZGlmIC8qICFGVF9DT05GSUdfT1BUSU9OX05PX0RFRkFVTFRfU1lTVEVNICovCisKKworICAvKiBEZWZpbmUgZGVmYXVsdCByYXN0ZXIncyBpbnRlcmZhY2UuICBUaGUgZGVmYXVsdCByYXN0ZXIgaXMgbG9jYXRlZCBpbiAgKi8KKyAgLyogYHNyYy9iYXNlL2Z0cmFzdGVyLmMnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBDbGllbnQgYXBwbGljYXRpb25zIGNhbiByZWdpc3RlciBuZXcgcmFzdGVycyB0aHJvdWdoIHRoZSAgICAgICAgICAgICAgKi8KKyAgLyogRlRfU2V0X1Jhc3RlcigpIEFQSS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpZm5kZWYgRlRfTk9fREVGQVVMVF9SQVNURVIKKyAgRlRfRVhQT1JUX1ZBUiggRlRfUmFzdGVyX0Z1bmNzICkgIGZ0X2RlZmF1bHRfcmFzdGVyOworI2VuZGlmCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgIFAgSSBDICAgUyBVIFAgUCBPIFIgVCAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKiBQSUMgc3VwcG9ydCBtYWNyb3MgZm9yIGZ0aW1hZ2UuaCAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfREVGSU5FX09VVExJTkVfRlVOQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVXNlZCB0byBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIEZUX091dGxpbmVfRnVuY3Mgc3RydWN0LiAgICAgICAgICovCisgIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgZGVmaW5lZCBhbiBpbml0IGZ1bnRpb24gd2lsbCBuZWVkIHRvICAqLworICAvKiAgICBiZSBjYWxsZWQgd2l0aCBhIHByZS1hbGxvY2F0ZWQgc3RydWN0dXJlIHRvIGJlIGZpbGxlZC4gICAgICAgICAgICAgKi8KKyAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBub3QgZGVmaW5lZCB0aGUgc3RydWN0IHdpbGwgYmUgICAgICAgICovCisgIC8qICAgIGFsbG9jYXRlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIChvciB0aGUgc2NvcGUgd2hlcmUgdGhlIG1hY3JvICAgICAgICAqLworICAvKiAgICBpcyB1c2VkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCisKKyNkZWZpbmUgRlRfREVGSU5FX09VVExJTkVfRlVOQ1MoICAgICAgICAgICBcCisgICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIG1vdmVfdG9fLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBsaW5lX3RvXywgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgY29uaWNfdG9fLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGN1YmljX3RvXywgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBzaGlmdF8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZGVsdGFfICkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgY29uc3QgIEZUX091dGxpbmVfRnVuY3MgY2xhc3NfID0gIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbW92ZV90b18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGxpbmVfdG9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25pY190b18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY3ViaWNfdG9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNoaWZ0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkZWx0YV8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH07CisKKyNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCisKKyNkZWZpbmUgRlRfREVGSU5FX09VVExJTkVfRlVOQ1MoICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbW92ZV90b18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBsaW5lX3RvXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNvbmljX3RvXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgY3ViaWNfdG9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBzaGlmdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGRlbHRhXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9PdXRsaW5lX0Z1bmNzKiAgY2xhenogKSAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPm1vdmVfdG8gID0gbW92ZV90b187ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+bGluZV90byAgPSBsaW5lX3RvXzsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5jb25pY190byA9IGNvbmljX3RvXzsgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPmN1YmljX3RvID0gY3ViaWNfdG9fOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+c2hpZnQgICAgPSBzaGlmdF87ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5kZWx0YSAgICA9IGRlbHRhXzsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfREVGSU5FX1JBU1RFUl9GVU5DUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVXNlZCB0byBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIEZUX1Jhc3Rlcl9GdW5jcyBzdHJ1Y3QuICAgICAgICAgICovCisgIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgZGVmaW5lZCBhbiBpbml0IGZ1bnRpb24gd2lsbCBuZWVkIHRvICAqLworICAvKiAgICBiZSBjYWxsZWQgd2l0aCBhIHByZS1hbGxvY2F0ZWQgc3RydWN0dXJlIHRvIGJlIGZpbGxlZC4gICAgICAgICAgICAgKi8KKyAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBub3QgZGVmaW5lZCB0aGUgc3RydWN0IHdpbGwgYmUgICAgICAgICovCisgIC8qICAgIGFsbG9jYXRlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIChvciB0aGUgc2NvcGUgd2hlcmUgdGhlIG1hY3JvICAgICAgICAqLworICAvKiAgICBpcyB1c2VkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCisKKyNkZWZpbmUgRlRfREVGSU5FX1JBU1RFUl9GVU5DUyggICAgXAorICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZ2x5cGhfZm9ybWF0XywgICAgICAgICAgIFwKKyAgICAgICAgICByYXN0ZXJfbmV3XywgICAgICAgICAgICAgXAorICAgICAgICAgIHJhc3Rlcl9yZXNldF8sICAgICAgICAgICBcCisgICAgICAgICAgcmFzdGVyX3NldF9tb2RlXywgICAgICAgIFwKKyAgICAgICAgICByYXN0ZXJfcmVuZGVyXywgICAgICAgICAgXAorICAgICAgICAgIHJhc3Rlcl9kb25lXyApICAgICAgICAgICBcCisgIGNvbnN0IEZUX1Jhc3Rlcl9GdW5jcyAgY2xhc3NfID0gIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdseXBoX2Zvcm1hdF8sICAgICAgICAgICAgICAgICBcCisgICAgcmFzdGVyX25ld18sICAgICAgICAgICAgICAgICAgIFwKKyAgICByYXN0ZXJfcmVzZXRfLCAgICAgICAgICAgICAgICAgXAorICAgIHJhc3Rlcl9zZXRfbW9kZV8sICAgICAgICAgICAgICBcCisgICAgcmFzdGVyX3JlbmRlcl8sICAgICAgICAgICAgICAgIFwKKyAgICByYXN0ZXJfZG9uZV8gICAgICAgICAgICAgICAgICAgXAorICB9OworCisjZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLworCisjZGVmaW5lIEZUX0RFRklORV9SQVNURVJfRlVOQ1MoICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBnbHlwaF9mb3JtYXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcmFzdGVyX25ld18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHJhc3Rlcl9yZXNldF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICByYXN0ZXJfc2V0X21vZGVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcmFzdGVyX3JlbmRlcl8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHJhc3Rlcl9kb25lXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfUmFzdGVyX0Z1bmNzKiAgY2xhenogKSAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+Z2x5cGhfZm9ybWF0ICAgID0gZ2x5cGhfZm9ybWF0XzsgICAgICAgICAgICBcCisgICAgY2xhenotPnJhc3Rlcl9uZXcgICAgICA9IHJhc3Rlcl9uZXdfOyAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5yYXN0ZXJfcmVzZXQgICAgPSByYXN0ZXJfcmVzZXRfOyAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+cmFzdGVyX3NldF9tb2RlID0gcmFzdGVyX3NldF9tb2RlXzsgICAgICAgICBcCisgICAgY2xhenotPnJhc3Rlcl9yZW5kZXIgICA9IHJhc3Rlcl9yZW5kZXJfOyAgICAgICAgICAgXAorICAgIGNsYXp6LT5yYXN0ZXJfZG9uZSAgICAgPSByYXN0ZXJfZG9uZV87ICAgICAgICAgICAgIFwKKyAgfQorCisjZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KKworCisgIC8qIFBJQyBzdXBwb3J0IG1hY3JvcyBmb3IgZnRyZW5kZXIuaCAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfREVGSU5FX0dMWVBIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVXNlZCB0byBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIEZUX0dseXBoX0NsYXNzIHN0cnVjdC4gICAgICAgICAgICovCisgIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgZGVmaW5lZCBhbiBpbml0IGZ1bnRpb24gd2lsbCBuZWVkIHRvICAqLworICAvKiAgICBiZSBjYWxsZWQgd2l0aCBhIHByZS1hbGxvY2F0ZWQgc3RjdHVyZSB0byBiZSBmaWxsZWQuICAgICAgICAgICAgICAgKi8KKyAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBub3QgZGVmaW5lZCB0aGUgc3RydWN0IHdpbGwgYmUgICAgICAgICovCisgIC8qICAgIGFsbG9jYXRlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIChvciB0aGUgc2NvcGUgd2hlcmUgdGhlIG1hY3JvICAgICAgICAqLworICAvKiAgICBpcyB1c2VkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCisKKyNkZWZpbmUgRlRfREVGSU5FX0dMWVBIKCAgICAgICAgICBcCisgICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBmb3JtYXRfLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgaW5pdF8sICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBjb3B5XywgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdHJhbnNmb3JtXywgICAgICAgICAgICAgXAorICAgICAgICAgIGJib3hfLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBwcmVwYXJlXyApICAgICAgICAgICAgICBcCisgIEZUX0NBTExCQUNLX1RBQkxFX0RFRiAgICAgICAgICAgXAorICBjb25zdCBGVF9HbHlwaF9DbGFzcyAgY2xhc3NfID0gIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvcm1hdF8sICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbml0XywgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvcHlfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0cmFuc2Zvcm1fLCAgICAgICAgICAgICAgICAgICBcCisgICAgYmJveF8sICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHByZXBhcmVfICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsKKworI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KKworI2RlZmluZSBGVF9ERUZJTkVfR0xZUEgoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGZvcm1hdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNvcHlfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHRyYW5zZm9ybV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGJib3hfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHByZXBhcmVfICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX0dseXBoX0NsYXNzKiAgY2xhenogKSAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5nbHlwaF9zaXplICAgICAgPSBzaXplXzsgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5nbHlwaF9mb3JtYXQgICAgPSBmb3JtYXRfOyAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5nbHlwaF9pbml0ICAgICAgPSBpbml0XzsgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5nbHlwaF9kb25lICAgICAgPSBkb25lXzsgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5nbHlwaF9jb3B5ICAgICAgPSBjb3B5XzsgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5nbHlwaF90cmFuc2Zvcm0gPSB0cmFuc2Zvcm1fOyAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5nbHlwaF9iYm94ICAgICAgPSBiYm94XzsgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5nbHlwaF9wcmVwYXJlICAgPSBwcmVwYXJlXzsgICAgICAgICAgICAgICAgXAorICB9CisKKyNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfREVDTEFSRV9SRU5ERVJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVXNlZCB0byBjcmVhdGUgYSBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGEgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1JlbmRlcmVyX0NsYXNzIHN0cnVjdCBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0RFRklORV9SRU5ERVJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiBGVF9SZW5kZXJlcl9DbGFzcyBzdHJ1Y3QuICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkIGEgYGNyZWF0ZScgZnVudGlvbiB3aWxsIG5lZWQgICovCisgIC8qICAgIHRvIGJlIGNhbGxlZCB3aXRoIGEgcG9pbnRlciB3aGVyZSB0aGUgYWxsb2NhdGVkIHN0cnVjdHVyZSBpcyAgICAgICAqLworICAvKiAgICByZXR1cm5lZC4gIEFuZCB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQgYSBgZGVzdHJveScgZnVuY3Rpb24gICAgKi8KKyAgLyogICAgbmVlZHMgdG8gYmUgY2FsbGVkIHRvIHJlbGVhc2UgdGhhdCBhbGxvY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGBmY2luaXQuYycgKGZ0X2NyZWF0ZV9kZWZhdWx0X21vZHVsZV9jbGFzc2VzKSBhbHJlYWR5IGNvbnRhaW5zICAgICAqLworICAvKiAgICBhIG1lY2hhbmlzbSB0byBjYWxsIHRoZXNlIGZ1bmN0aW9ucyBmb3IgdGhlIGRlZmF1bHQgbW9kdWxlcyAgICAgICAgKi8KKyAgLyogICAgZGVzY3JpYmVkIGluIGBmdG1vZHVsZS5oJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBOb3RpY2UgdGhhdCB0aGUgY3JlYXRlZCBgY3JlYXRlJyBhbmQgYGRlc3Ryb3knIGZ1bmN0aW9ucyBjYWxsICAgICAgKi8KKyAgLyogICAgYHBpY19pbml0JyBhbmQgYHBpY19mcmVlJyB0byBhbGxvdyB5b3UgdG8gbWFudWFsbHkgYWxsb2NhdGUgYW5kICAgICovCisgIC8qICAgIGluaXRpYWxpemUgYW55IGFkZGl0aW9uYWwgZ2xvYmFsIGRhdGEsIGxpa2UgYSBtb2R1bGUgc3BlY2lmaWMgICAgICAqLworICAvKiAgICBpbnRlcmZhY2UsIGFuZCBwdXQgdGhlbSBpbiB0aGUgZ2xvYmFsIHBpYyBjb250YWluZXIgZGVmaW5lZCBpbiAgICAgKi8KKyAgLyogICAgYGZ0cGljLmgnLiAgSWYgeW91IGRvbid0IG5lZWQgdGhlbSBqdXN0IGltcGxlbWVudCB0aGUgZnVuY3Rpb25zIGFzICovCisgIC8qICAgIGVtcHR5IHRvIHJlc29sdmUgdGhlIGxpbmsgZXJyb3IuICBBbHNvIHRoZSBgcGljX2luaXQnIGFuZCAgICAgICAgICAqLworICAvKiAgICBgcGljX2ZyZWUnIGZ1bmN0aW9ucyBzaG91bGQgYmUgZGVjbGFyZWQgaW4gYHBpYy5oJywgdG8gYmUgcmVmZXJyZWQgKi8KKyAgLyogICAgYnkgdGhlIHJlbmRlcmVyIGRlZmluaXRpb24gY2FsbGluZyBgRlRfREVGSU5FX1JFTkRFUkVSJyBpbiB0aGUgICAgICovCisgIC8qICAgIGZvbGxvd2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBub3QgZGVmaW5lZCB0aGUgc3RydWN0IHdpbGwgYmUgICAgICAgICovCisgIC8qICAgIGFsbG9jYXRlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIChvciB0aGUgc2NvcGUgd2hlcmUgdGhlIG1hY3JvICAgICAgICAqLworICAvKiAgICBpcyB1c2VkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCisKKyNkZWZpbmUgRlRfREVDTEFSRV9SRU5ERVJFUiggY2xhc3NfICkgICAgICAgICAgICAgICBcCisgIEZUX0VYUE9SVF9WQVIoIGNvbnN0IEZUX1JlbmRlcmVyX0NsYXNzICkgY2xhc3NfOworCisjZGVmaW5lIEZUX0RFRklORV9SRU5ERVJFUiggICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZmxhZ3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdmVyc2lvbl8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcmVxdWlyZXNfLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgaW50ZXJmYWNlXywgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZ2V0X2ludGVyZmFjZV8sICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZ2x5cGhfZm9ybWF0XywgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcmVuZGVyX2dseXBoXywgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdHJhbnNmb3JtX2dseXBoXywgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZ2V0X2dseXBoX2Nib3hfLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgc2V0X21vZGVfLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcmFzdGVyX2NsYXNzXyApICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0NBTExCQUNLX1RBQkxFX0RFRiAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IEZUX1JlbmRlcmVyX0NsYXNzICBjbGFzc18gPSAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlRfREVGSU5FX1JPT1RfTU9EVUxFKCBmbGFnc18sICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplXywgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lXywgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uXywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlc18sICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0XywgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lXywgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfaW50ZXJmYWNlXyApICBcCisgICAgZ2x5cGhfZm9ybWF0XywgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVuZGVyX2dseXBoXywgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHJhbnNmb3JtX2dseXBoXywgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ2V0X2dseXBoX2Nib3hfLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2V0X21vZGVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmFzdGVyX2NsYXNzXyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH07CisKKyNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCisKKyNkZWZpbmUgRlRfREVDTEFSRV9SRU5ERVJFUiggY2xhc3NfICkgIEZUX0RFQ0xBUkVfTU9EVUxFKCBjbGFzc18gKQorCisjZGVmaW5lIEZUX0RFRklORV9SRU5ERVJFUiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGZsYWdzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBuYW1lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHZlcnNpb25fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcmVxdWlyZXNfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBpbnRlcmZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBnZXRfaW50ZXJmYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGdseXBoX2Zvcm1hdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcmVuZGVyX2dseXBoXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB0cmFuc2Zvcm1fZ2x5cGhfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGdldF9nbHlwaF9jYm94XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgc2V0X21vZGVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICByYXN0ZXJfY2xhc3NfICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0Rlc3Ryb3lfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Nb2R1bGVfQ2xhc3MqICBjbGF6eiApICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlRfUmVuZGVyZXJfQ2xhc3MqICByY2xhenogPSAoRlRfUmVuZGVyZXJfQ2xhc3MqKWNsYXp6OyAgICAgIFwKKyAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGFzc18gIyMgX3BpY19mcmVlKCBsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggcmNsYXp6ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGVF9GUkVFKCByY2xhenogKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGVF9DcmVhdGVfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgIGxpYnJhcnksICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Nb2R1bGVfQ2xhc3MqKiAgb3V0cHV0X2NsYXNzICkgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZUX1JlbmRlcmVyX0NsYXNzKiAgY2xhenogPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIEZUX0FMTE9DKCBjbGF6eiwgc2l6ZW9mICggKmNsYXp6ICkgKSApICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlcnJvciA9IGNsYXNzXyAjIyBfcGljX2luaXQoIGxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggZXJyb3IgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZUX0RFRklORV9ST09UX01PRFVMRSggZmxhZ3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbl8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9pbnRlcmZhY2VfICkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPmdseXBoX2Zvcm1hdCAgICA9IGdseXBoX2Zvcm1hdF87ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5yZW5kZXJfZ2x5cGggICAgPSByZW5kZXJfZ2x5cGhfOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPnRyYW5zZm9ybV9nbHlwaCA9IHRyYW5zZm9ybV9nbHlwaF87ICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+Z2V0X2dseXBoX2Nib3ggID0gZ2V0X2dseXBoX2Nib3hfOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5zZXRfbW9kZSAgICAgICAgPSBzZXRfbW9kZV87ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+cmFzdGVyX2NsYXNzICAgID0gcmFzdGVyX2NsYXNzXzsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKm91dHB1dF9jbGFzcyA9IChGVF9Nb2R1bGVfQ2xhc3MqKWNsYXp6OyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBGVF9FcnJfT2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCisKKworICAvKiBQSUMgc3VwcG9ydCBtYWNyb3MgZm9yIGZ0bW9kYXBpLmggKiovCisKKworI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfTW9kdWxlX0NyZWF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBmdW5jdGlvbiB1c2VkIHRvIGNyZWF0ZSAoYWxsb2NhdGUpIGEgbmV3IG1vZHVsZSBjbGFzcyBvYmplY3QuICAgICovCisgIC8qICAgIFRoZSBvYmplY3QncyBtZW1iZXJzIGFyZSBpbml0aWFsaXplZCwgYnV0IHRoZSBtb2R1bGUgaXRzZWxmIGlzICAgICAqLworICAvKiAgICBub3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtZW1vcnkgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIG1lbW9yeSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgb3V0cHV0X2NsYXNzIDo6IEluaXRpYWxpemVkIHdpdGggdGhlIG5ld2x5IGFsbG9jYXRlZCBjbGFzcy4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqRlRfTW9kdWxlX0NyZWF0b3IpKCBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgRlRfTW9kdWxlX0NsYXNzKiogIG91dHB1dF9jbGFzcyApOworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX01vZHVsZV9EZXN0cm95ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBkZXN0cm95IChkZWFsbG9jYXRlKSBhIG1vZHVsZSBjbGFzcyBvYmplY3QuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1lbW9yeSA6OiBBIGhhbmRsZSB0byB0aGUgbWVtb3J5IG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjbGF6eiAgOjogTW9kdWxlIGNsYXNzIHRvIGRlc3Ryb3kuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgdm9pZAorICAoKkZUX01vZHVsZV9EZXN0cm95ZXIpKCBGVF9NZW1vcnkgICAgICAgICBtZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01vZHVsZV9DbGFzcyogIGNsYXp6ICk7CisKKyNlbmRpZgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfREVDTEFSRV9NT0RVTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVXNlZCB0byBjcmVhdGUgYSBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGEgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX01vZHVsZV9DbGFzcyBzdHJ1Y3QgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0RFRklORV9NT0RVTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiBhbiBGVF9Nb2R1bGVfQ2xhc3Mgc3RydWN0LiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkIGEgYGNyZWF0ZScgZnVudGlvbiBuZWVkcyB0byAgICovCisgIC8qICAgIGJlIGNhbGxlZCB3aXRoIGEgcG9pbnRlciB3aGVyZSB0aGUgYWxsb2NhdGVkIHN0cnVjdHVyZSBpcyAgICAgICAgICAqLworICAvKiAgICByZXR1cm5lZC4gIEFuZCB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQgYSBgZGVzdHJveScgZnVuY3Rpb24gICAgKi8KKyAgLyogICAgbmVlZHMgdG8gYmUgY2FsbGVkIHRvIHJlbGVhc2UgdGhhdCBhbGxvY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGBmY2luaXQuYycgKGZ0X2NyZWF0ZV9kZWZhdWx0X21vZHVsZV9jbGFzc2VzKSBhbHJlYWR5IGNvbnRhaW5zICAgICAqLworICAvKiAgICBhIG1lY2hhbmlzbSB0byBjYWxsIHRoZXNlIGZ1bmN0aW9ucyBmb3IgdGhlIGRlZmF1bHQgbW9kdWxlcyAgICAgICAgKi8KKyAgLyogICAgZGVzY3JpYmVkIGluIGBmdG1vZHVsZS5oJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBOb3RpY2UgdGhhdCB0aGUgY3JlYXRlZCBgY3JlYXRlJyBhbmQgYGRlc3Ryb3knIGZ1bmN0aW9ucyBjYWxsICAgICAgKi8KKyAgLyogICAgYHBpY19pbml0JyBhbmQgYHBpY19mcmVlJyB0byBhbGxvdyB5b3UgdG8gbWFudWFsbHkgYWxsb2NhdGUgYW5kICAgICovCisgIC8qICAgIGluaXRpYWxpemUgYW55IGFkZGl0aW9uYWwgZ2xvYmFsIGRhdGEsIGxpa2UgYSBtb2R1bGUgc3BlY2lmaWMgICAgICAqLworICAvKiAgICBpbnRlcmZhY2UsIGFuZCBwdXQgdGhlbSBpbiB0aGUgZ2xvYmFsIHBpYyBjb250YWluZXIgZGVmaW5lZCBpbiAgICAgKi8KKyAgLyogICAgYGZ0cGljLmgnLiAgSWYgeW91IGRvbid0IG5lZWQgdGhlbSBqdXN0IGltcGxlbWVudCB0aGUgZnVuY3Rpb25zIGFzICovCisgIC8qICAgIGVtcHR5IHRvIHJlc29sdmUgdGhlIGxpbmsgZXJyb3IuICBBbHNvIHRoZSBgcGljX2luaXQnIGFuZCAgICAgICAgICAqLworICAvKiAgICBgcGljX2ZyZWUnIGZ1bmN0aW9ucyBzaG91bGQgYmUgZGVjbGFyZWQgaW4gYHBpYy5oJywgdG8gYmUgcmVmZXJyZWQgKi8KKyAgLyogICAgYnkgdGhlIG1vZHVsZSBkZWZpbml0aW9uIGNhbGxpbmcgYEZUX0RFRklORV9NT0RVTEUnIGluIHRoZSAgICAgICAgICovCisgIC8qICAgIGZvbGxvd2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBub3QgZGVmaW5lZCB0aGUgc3RydWN0IHdpbGwgYmUgICAgICAgICovCisgIC8qICAgIGFsbG9jYXRlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIChvciB0aGUgc2NvcGUgd2hlcmUgdGhlIG1hY3JvICAgICAgICAqLworICAvKiAgICBpcyB1c2VkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9ERUZJTkVfUk9PVF9NT0RVTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBVc2VkIHRvIGluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgYW4gRlRfTW9kdWxlX0NsYXNzIHN0cnVjdCBpbnNpZGUgKi8KKyAgLyogICAgYW5vdGhlciBzdHJ1Y3QgdGhhdCBjb250YWlucyBpdCBvciBpbiBhIGZ1bmN0aW9uIHRoYXQgaW5pdGlhbGl6ZXMgICovCisgIC8qICAgIHRoYXQgY29udGFpbmluZyBzdHJ1Y3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKKworI2RlZmluZSBGVF9ERUNMQVJFX01PRFVMRSggY2xhc3NfICkgIFwKKyAgRlRfQ0FMTEJBQ0tfVEFCTEUgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IEZUX01vZHVsZV9DbGFzcyAgY2xhc3NfOworCisjZGVmaW5lIEZUX0RFRklORV9ST09UX01PRFVMRSggIFwKKyAgICAgICAgICBmbGFnc18sICAgICAgICAgICAgICAgXAorICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbmFtZV8sICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB2ZXJzaW9uXywgICAgICAgICAgICAgXAorICAgICAgICAgIHJlcXVpcmVzXywgICAgICAgICAgICBcCisgICAgICAgICAgaW50ZXJmYWNlXywgICAgICAgICAgIFwKKyAgICAgICAgICBpbml0XywgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZ2V0X2ludGVyZmFjZV8gKSAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZsYWdzXywgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5hbWVfLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVyc2lvbl8sICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXF1aXJlc18sICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ZXJmYWNlXywgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnZXRfaW50ZXJmYWNlXywgICAgICAgICAgICAgXAorICB9LAorCisjZGVmaW5lIEZUX0RFRklORV9NT0RVTEUoICAgICAgICAgXAorICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBmbGFnc18sICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIG5hbWVfLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB2ZXJzaW9uXywgICAgICAgICAgICAgICBcCisgICAgICAgICAgcmVxdWlyZXNfLCAgICAgICAgICAgICAgXAorICAgICAgICAgIGludGVyZmFjZV8sICAgICAgICAgICAgIFwKKyAgICAgICAgICBpbml0XywgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZG9uZV8sICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGdldF9pbnRlcmZhY2VfICkgICAgICAgIFwKKyAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGICAgICAgICAgICBcCisgIGNvbnN0IEZUX01vZHVsZV9DbGFzcyBjbGFzc18gPSAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmbGFnc18sICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuYW1lXywgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVyc2lvbl8sICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJlcXVpcmVzXywgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ZXJmYWNlXywgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbml0XywgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdldF9pbnRlcmZhY2VfLCAgICAgICAgICAgICAgIFwKKyAgfTsKKworCisjZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLworCisjZGVmaW5lIEZUX0RFQ0xBUkVfTU9EVUxFKCBjbGFzc18gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0NyZWF0ZV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgbGlicmFyeSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Nb2R1bGVfQ2xhc3MqKiAgb3V0cHV0X2NsYXNzICk7ICBcCisgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0Rlc3Ryb3lfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTW9kdWxlX0NsYXNzKiAgY2xhenogKTsKKworI2RlZmluZSBGVF9ERUZJTkVfUk9PVF9NT0RVTEUoICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBmbGFnc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIG5hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB2ZXJzaW9uXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcmVxdWlyZXNfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGludGVyZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBpbml0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGdldF9pbnRlcmZhY2VfICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+cm9vdC5tb2R1bGVfZmxhZ3MgICAgID0gZmxhZ3NfOyAgICAgICAgICBcCisgICAgY2xhenotPnJvb3QubW9kdWxlX3NpemUgICAgICA9IHNpemVfOyAgICAgICAgICAgXAorICAgIGNsYXp6LT5yb290Lm1vZHVsZV9uYW1lICAgICAgPSBuYW1lXzsgICAgICAgICAgIFwKKyAgICBjbGF6ei0+cm9vdC5tb2R1bGVfdmVyc2lvbiAgID0gdmVyc2lvbl87ICAgICAgICBcCisgICAgY2xhenotPnJvb3QubW9kdWxlX3JlcXVpcmVzICA9IHJlcXVpcmVzXzsgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+cm9vdC5tb2R1bGVfaW50ZXJmYWNlID0gaW50ZXJmYWNlXzsgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5yb290Lm1vZHVsZV9pbml0ICAgICAgPSBpbml0XzsgICAgICAgICAgIFwKKyAgICBjbGF6ei0+cm9vdC5tb2R1bGVfZG9uZSAgICAgID0gZG9uZV87ICAgICAgICAgICBcCisgICAgY2xhenotPnJvb3QuZ2V0X2ludGVyZmFjZSAgICA9IGdldF9pbnRlcmZhY2VfOworCisjZGVmaW5lIEZUX0RFRklORV9NT0RVTEUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGZsYWdzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBuYW1lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHZlcnNpb25fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgcmVxdWlyZXNfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBpbnRlcmZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBnZXRfaW50ZXJmYWNlXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0Rlc3Ryb3lfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Nb2R1bGVfQ2xhc3MqICBjbGF6eiApICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlRfTWVtb3J5IG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhc3NfICMjIF9waWNfZnJlZSggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIGNsYXp6ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlRfRlJFRSggY2xhenogKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlRfQ3JlYXRlX0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICBsaWJyYXJ5LCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTW9kdWxlX0NsYXNzKiogIG91dHB1dF9jbGFzcyApICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVF9NZW1vcnkgICAgICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgXAorICAgIEZUX01vZHVsZV9DbGFzcyogIGNsYXp6ICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlRfRXJyb3IgICAgICAgICAgZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCBGVF9BTExPQyggY2xhenosIHNpemVvZiAoICpjbGF6eiApICkgKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVycm9yID0gY2xhc3NfICMjIF9waWNfaW5pdCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCBlcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlRfRlJFRSggY2xhenogKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPm1vZHVsZV9mbGFncyAgICAgPSBmbGFnc187ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+bW9kdWxlX3NpemUgICAgICA9IHNpemVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5tb2R1bGVfbmFtZSAgICAgID0gbmFtZV87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPm1vZHVsZV92ZXJzaW9uICAgPSB2ZXJzaW9uXzsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+bW9kdWxlX3JlcXVpcmVzICA9IHJlcXVpcmVzXzsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPm1vZHVsZV9pbnRlcmZhY2UgPSBpbnRlcmZhY2VfOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5tb2R1bGVfaW5pdCAgICAgID0gaW5pdF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPm1vZHVsZV9kb25lICAgICAgPSBkb25lXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+Z2V0X2ludGVyZmFjZSAgICA9IGdldF9pbnRlcmZhY2VfOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKm91dHB1dF9jbGFzcyA9IGNsYXp6OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBGVF9FcnJfT2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCisKKworRlRfRU5EX0hFQURFUgorCisjZW5kaWYgLyogX19GVE9CSlNfSF9fICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0cGljLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0cGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y5MTU0ZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRwaWMuaApAQCAtMCwwICsxLDcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBmdHBpYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgKGRlY2xhcmF0aW9uKS4gICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDktMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIE1vZHVsZXMgdGhhdCBvcmRpbmFyaWx5IGhhdmUgY29uc3QgZ2xvYmFsIGRhdGEgdGhhdCBuZWVkIGFkZHJlc3MgICAgICovCisgIC8qICBjYW4gaW5zdGVhZCBkZWZpbmUgcG9pbnRlcnMgaGVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0ZUUElDX0hfXworI2RlZmluZSBfX0ZUUElDX0hfXworCisKK0ZUX0JFR0lOX0hFQURFUgorCisjaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKKworICB0eXBlZGVmIHN0cnVjdCAgRlRfUElDX0NvbnRhaW5lcl8KKyAgeworICAgIC8qIHBpYyBjb250YWluZXJzIGZvciBiYXNlICovCisgICAgdm9pZCogIGJhc2U7CisKKyAgICAvKiBwaWMgY29udGFpbmVycyBmb3IgbW9kdWxlcyAqLworICAgIHZvaWQqICBhdXRvZml0OworICAgIHZvaWQqICBjZmY7CisgICAgdm9pZCogIHBzaGludGVyOworICAgIHZvaWQqICBwc25hbWVzOworICAgIHZvaWQqICByYXN0ZXI7CisgICAgdm9pZCogIHNmbnQ7CisgICAgdm9pZCogIHNtb290aDsKKyAgICB2b2lkKiAgdHJ1ZXR5cGU7CisKKyAgfSBGVF9QSUNfQ29udGFpbmVyOworCisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgdmFyaW91cyBmdW5jdGlvbiB0YWJsZXMsIHN0cnVjdHMsIGV0Yy4gKi8KKyAgLyogc3RvcmVkIGluIHRoZSBjb250YWluZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfQkFTRSggRlRfRXJyb3IgKQorICBmdF9waWNfY29udGFpbmVyX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKKworCisgIC8qIERlc3Ryb3kgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb250YWluZXIuICovCisgIEZUX0JBU0UoIHZvaWQgKQorICBmdF9waWNfY29udGFpbmVyX2Rlc3Ryb3koIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKKworI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCisKKyAvKiAqLworCitGVF9FTkRfSEVBREVSCisKKyNlbmRpZiAvKiBfX0ZUUElDX0hfXyAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHJmb3JrLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0cmZvcmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTYxY2E3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHJmb3JrLmgKQEAgLTAsMCArMSwyNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0cmZvcmsuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBFbWJlZGRlZCByZXNvdXJjZSBmb3JrcyBhY2Nlc3NvciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwNC0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTWFzYXRha2UgWUFNQVRPIGFuZCBSZWRoYXQgSy5LLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXZlbG9wbWVudCBvZiB0aGUgY29kZSBpbiB0aGlzIGZpbGUgaXMgc3VwcG9ydCBvZiAgICAgICAgICAgICAgICAgICAgICAqLworLyogSW5mb3JtYXRpb24tdGVjaG5vbG9neSBQcm9tb3Rpb24gQWdlbmN5LCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0ZUUkZPUktfSF9fCisjZGVmaW5lIF9fRlRSRk9SS19IX18KKworCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyAgLyogTnVtYmVyIG9mIGd1ZXNzaW5nIHJ1bGVzIHN1cHBvcnRlZCBpbiBgRlRfUmFjY2Vzc19HdWVzcycuICAgICAgICAgICAgKi8KKyAgLyogRG9uJ3QgZm9yZ2V0IHRvIGluY3JlbWVudCB0aGUgbnVtYmVyIGlmIHlvdSBhZGQgYSBuZXcgZ3Vlc3NpbmcgcnVsZS4gKi8KKyNkZWZpbmUgRlRfUkFDQ0VTU19OX1JVTEVTICA5CisKKworICAvKiBBIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIHJlZmVyZW5jZSBpbiBhIHJlc291cmNlIGJ5IGl0cyByZXNvdXJjZSBJRCAqLworICAvKiBhbmQgaW50ZXJuYWwgb2Zmc2V0LiAgVGhlIGBQT1NUJyByZXNvdXJjZSBleHBlY3RzIHRvIGJlIGNvbmNhdGVuYXRlZCAqLworICAvKiBieSB0aGUgb3JkZXIgb2YgcmVzb3VyY2UgSURzIGluc3RlYWQgb2YgaXRzIGFwcGVhcmFuY2UgaW4gdGhlIGZpbGUuICAqLworCisgIHR5cGVkZWYgc3RydWN0ICBGVF9SRm9ya19SZWZfCisgIHsKKyAgICBGVF9VU2hvcnQgIHJlc19pZDsKKyAgICBGVF9Mb25nICAgIG9mZnNldDsKKworICB9IEZUX1JGb3JrX1JlZjsKKworI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fR1VFU1NJTkdfRU1CRURERURfUkZPUksKKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKmZ0X3JhY2Nlc3NfZ3Vlc3NfZnVuYykoIEZUX0xpYnJhcnkgIGxpYnJhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAqKnJlc3VsdF9maWxlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApOworCisgIHR5cGVkZWYgZW51bSAgRlRfUkZvcmtfUnVsZV8geworICAgIEZUX1JGb3JrX1J1bGVfaW52YWxpZCA9IC0yLAorICAgIEZUX1JGb3JrX1J1bGVfdWtub3duLCAvKiAtMSAqLworICAgIEZUX1JGb3JrX1J1bGVfYXBwbGVfZG91YmxlLAorICAgIEZUX1JGb3JrX1J1bGVfYXBwbGVfc2luZ2xlLAorICAgIEZUX1JGb3JrX1J1bGVfZGFyd2luX3Vmc19leHBvcnQsCisgICAgRlRfUkZvcmtfUnVsZV9kYXJ3aW5fbmV3dmZzLAorICAgIEZUX1JGb3JrX1J1bGVfZGFyd2luX2hmc3BsdXMsCisgICAgRlRfUkZvcmtfUnVsZV92ZmF0LAorICAgIEZUX1JGb3JrX1J1bGVfbGludXhfY2FwLAorICAgIEZUX1JGb3JrX1J1bGVfbGludXhfZG91YmxlLAorICAgIEZUX1JGb3JrX1J1bGVfbGludXhfbmV0YXRhbGsKKyAgfSBGVF9SRm9ya19SdWxlOworCisgIC8qIEZvciBmYXN0IHRyYW5zbGF0aW9uIGJldHdlZW4gcnVsZSBpbmRleCBhbmQgcnVsZSB0eXBlLAorICAgKiB0aGUgbWFjcm9zIEZUX1JGT1JLX3h4eCBzaG91bGQgYmUga2VwdCBjb25zaXN0ZW50IHdpdGgKKyAgICogdGhlIHJhY2Nlc3NfZ3Vlc3NfZnVuY3MgdGFibGUKKyAgICovCisgIHR5cGVkZWYgc3RydWN0IGZ0X3JhY2Nlc3NfZ3Vlc3NfcmVjXyB7CisgICAgZnRfcmFjY2Vzc19ndWVzc19mdW5jICBmdW5jOworICAgIEZUX1JGb3JrX1J1bGUgICAgICAgICAgdHlwZTsKKyAgfSBmdF9yYWNjZXNzX2d1ZXNzX3JlYzsKKworI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQworCisgIC8qIHRoaXMgYXJyYXkgaXMgYSBzdG9yYWdlIGluIG5vbi1QSUMgbW9kZSwgc28gOyBpcyBuZWVkZWQgaW4gRU5EICovCisjZGVmaW5lIENPTlNUX0ZUX1JGT1JLX1JVTEVfQVJSQVlfQkVHSU4oIG5hbWUsIHR5cGUgKSAgXAorICAgICAgICAgIHN0YXRpYyBjb25zdCB0eXBlIG5hbWVbXSA9IHsKKyNkZWZpbmUgQ09OU1RfRlRfUkZPUktfUlVMRV9BUlJBWV9FTlRSWSggZnVuY19zdWZmaXgsIHR5cGVfc3VmZml4ICkgIFwKKyAgICAgICAgICB7IHJhY2Nlc3NfZ3Vlc3NfICMjIGZ1bmNfc3VmZml4LCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEZUX1JGb3JrX1J1bGVfICMjIHR5cGVfc3VmZml4IH0sCisjZGVmaW5lIENPTlNUX0ZUX1JGT1JLX1JVTEVfQVJSQVlfRU5EICB9OworCisjZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLworCisgIC8qIHRoaXMgYXJyYXkgaXMgYSBmdW5jdGlvbiBpbiBQSUMgbW9kZSwgc28gbm8gOyBpcyBuZWVkZWQgaW4gRU5EICovCisjZGVmaW5lIENPTlNUX0ZUX1JGT1JLX1JVTEVfQVJSQVlfQkVHSU4oIG5hbWUsIHR5cGUgKSAgXAorICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBGVF9Jbml0X1RhYmxlXyAjIyBuYW1lKCB0eXBlKiAgc3RvcmFnZSApICAgICBcCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdHlwZSogIGxvY2FsID0gc3RvcmFnZTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50ICBpID0gMDsKKyNkZWZpbmUgQ09OU1RfRlRfUkZPUktfUlVMRV9BUlJBWV9FTlRSWSggZnVuY19zdWZmaXgsIHR5cGVfc3VmZml4ICkgIFwKKyAgICAgICAgICBsb2NhbFtpXS5mdW5jID0gcmFjY2Vzc19ndWVzc18gIyMgZnVuY19zdWZmaXg7ICAgICAgICAgICAgIFwKKyAgICAgICAgICBsb2NhbFtpXS50eXBlID0gRlRfUkZvcmtfUnVsZV8gIyMgdHlwZV9zdWZmaXg7ICAgICAgICAgICAgIFwKKyAgICAgICAgICBpKys7CisjZGVmaW5lIENPTlNUX0ZUX1JGT1JLX1JVTEVfQVJSQVlfRU5EICB9CisKKyNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLworCisjZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9HVUVTU0lOR19FTUJFRERFRF9SRk9SSyAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUmFjY2Vzc19HdWVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgR3Vlc3MgYSBmaWxlIG5hbWUgYW5kIG9mZnNldCB3aGVyZSB0aGUgYWN0dWFsIHJlc291cmNlIGZvcmsgaXMgICAgICovCisgIC8qICAgIHN0b3JlZC4gIFRoZSBtYWNybyBGVF9SQUNDRVNTX05fUlVMRVMgaG9sZHMgdGhlIG51bWJlciBvZiAgICAgICAgICAqLworICAvKiAgICBndWVzc2luZyBydWxlczsgIHRoZSBndWVzc2VkIHJlc3VsdCBmb3IgdGhlIE50aCBydWxlIGlzICAgICAgICAgICAgKi8KKyAgLyogICAgcmVwcmVzZW50ZWQgYXMgYSB0cmlwbGV0OiBhIG5ldyBmaWxlIG5hbWUgKG5ld19uYW1lc1tOXSksIGEgZmlsZSAgICovCisgIC8qICAgIG9mZnNldCAob2Zmc2V0c1tOXSksIGFuZCBhbiBlcnJvciBjb2RlIChlcnJvcnNbTl0pLiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpYnJhcnkgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIEEgRnJlZVR5cGUgbGlicmFyeSBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIEEgZmlsZSBzdHJlYW0gY29udGFpbmluZyB0aGUgcmVzb3VyY2UgZm9yay4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJhc2VfbmFtZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIFRoZSAoYmFzZSkgZmlsZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBmb3JrIHVzZWQgZm9yIHNvbWUgICAgICAgICAgKi8KKyAgLyogICAgICBndWVzc2luZyBydWxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbmV3X25hbWVzIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgQW4gYXJyYXkgb2YgZ3Vlc3NlZCBmaWxlIG5hbWVzIGluIHdoaWNoIHRoZSByZXNvdXJjZSBmb3JrcyBtYXkgICAqLworICAvKiAgICAgIGV4aXN0LiAgSWYgYG5ld19uYW1lc1tOXScgaXMgTlVMTCwgdGhlIGd1ZXNzZWQgZmlsZSBuYW1lIGlzICAgICAgKi8KKyAgLyogICAgICBlcXVhbCB0byBgYmFzZV9uYW1lJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvZmZzZXRzIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBBbiBhcnJheSBvZiBndWVzc2VkIGZpbGUgb2Zmc2V0cy4gIGBvZmZzZXRzW05dJyBob2xkcyB0aGUgZmlsZSAgICovCisgIC8qICAgICAgb2Zmc2V0IG9mIHRoZSBwb3NzaWJsZSBzdGFydCBvZiB0aGUgcmVzb3VyY2UgZm9yayBpbiBmaWxlICAgICAgICAqLworICAvKiAgICAgIGBuZXdfbmFtZXNbTl0nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGVycm9ycyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIEFuIGFycmF5IG9mIEZyZWVUeXBlIGVycm9yIGNvZGVzLiAgYGVycm9yc1tOXScgaXMgdGhlIGVycm9yICAgICAgKi8KKyAgLyogICAgICBjb2RlIG9mIE50aCBndWVzc2luZyBydWxlIGZ1bmN0aW9uLiAgSWYgYGVycm9yc1tOXScgaXMgbm90ICAgICAgICovCisgIC8qICAgICAgRlRfRXJyX09rLCBgbmV3X25hbWVzW05dJyBhbmQgYG9mZnNldHNbTl0nIGFyZSBtZWFuaW5nbGVzcy4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfQkFTRSggdm9pZCApCisgIEZUX1JhY2Nlc3NfR3Vlc3MoIEZUX0xpYnJhcnkgIGxpYnJhcnksCisgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICAgYmFzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICBjaGFyKiogICAgICBuZXdfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgIG9mZnNldHMsCisgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgIGVycm9ycyApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUmFjY2Vzc19HZXRfSGVhZGVySW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgR2V0IHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBoZWFkZXIgb2YgcmVzb3VyY2UgZm9yay4gIFRoZSAgICAgICAgICovCisgIC8qICAgIGluZm9ybWF0aW9uIGluY2x1ZGVzIHRoZSBmaWxlIG9mZnNldCB3aGVyZSB0aGUgcmVzb3VyY2UgbWFwICAgICAgICAqLworICAvKiAgICBzdGFydHMsIGFuZCB0aGUgZmlsZSBvZmZzZXQgd2hlcmUgdGhlIHJlc291cmNlIGRhdGEgc3RhcnRzLiAgICAgICAgKi8KKyAgLyogICAgYEZUX1JhY2Nlc3NfR2V0X0RhdGFPZmZzZXRzJyByZXF1aXJlcyB0aGVzZSB0d28gZGF0YS4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGlicmFyeSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgQSBGcmVlVHlwZSBsaWJyYXJ5IGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgQSBmaWxlIHN0cmVhbSBjb250YWluaW5nIHRoZSByZXNvdXJjZSBmb3JrLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcmZvcmtfb2Zmc2V0IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgVGhlIGZpbGUgb2Zmc2V0IHdoZXJlIHRoZSByZXNvdXJjZSBmb3JrIHN0YXJ0cy4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1hcF9vZmZzZXQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIFRoZSBmaWxlIG9mZnNldCB3aGVyZSB0aGUgcmVzb3VyY2UgbWFwIHN0YXJ0cy4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJkYXRhX3BvcyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIFRoZSBmaWxlIG9mZnNldCB3aGVyZSB0aGUgcmVzb3VyY2UgZGF0YSBzdGFydHMuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgRlRfRXJyX09rIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0JBU0UoIEZUX0Vycm9yICkKKyAgRlRfUmFjY2Vzc19HZXRfSGVhZGVySW5mbyggRlRfTGlicmFyeSAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICByZm9ya19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKm1hcF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJkYXRhX3BvcyApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfUmFjY2Vzc19HZXRfRGF0YU9mZnNldHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgR2V0IHRoZSBkYXRhIG9mZnNldHMgZm9yIGEgdGFnIGluIGEgcmVzb3VyY2UgZm9yay4gIE9mZnNldHMgYXJlICAgICovCisgIC8qICAgIHN0b3JlZCBpbiBhbiBhcnJheSBiZWNhdXNlLCBpbiBzb21lIGNhc2VzLCByZXNvdXJjZXMgaW4gYSByZXNvdXJjZSAqLworICAvKiAgICBmb3JrIGhhdmUgdGhlIHNhbWUgdGFnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsaWJyYXJ5IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBBIEZyZWVUeXBlIGxpYnJhcnkgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBBIGZpbGUgc3RyZWFtIGNvbnRhaW5pbmcgdGhlIHJlc291cmNlIGZvcmsuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXBfb2Zmc2V0IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBUaGUgZmlsZSBvZmZzZXQgd2hlcmUgdGhlIHJlc291cmNlIG1hcCBzdGFydHMuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByZGF0YV9wb3MgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBUaGUgZmlsZSBvZmZzZXQgd2hlcmUgdGhlIHJlc291cmNlIGRhdGEgc3RhcnRzLiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0YWcgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBUaGUgcmVzb3VyY2UgdGFnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzb3J0X2J5X3Jlc19pZCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBBIEJvb2xlYW4gdG8gc29ydCB0aGUgZnJhZ21lbnRlZCByZXNvdXJjZSBieSB0aGVpciBpZHMuICAgICAgICAgICovCisgIC8qICAgICAgVGhlIGZyYWdtZW50ZWQgcmVzb3VyY2VzIGZvciBgUE9TVCcgcmVzb3VyY2Ugc2hvdWxkIGJlIHNvcnRlZCAgICAqLworICAvKiAgICAgIHRvIHJlc3RvcmUgVHlwZTEgZm9udCBwcm9wZXJseS4gIEZvciBgc25mdCcgcmVzb3VyY2VzLCBzb3J0aW5nICAgKi8KKyAgLyogICAgICBtYXkgaW5kdWNlIGEgZGlmZmVyZW50IG9yZGVyIG9mIHRoZSBmYWNlcyBpbiBjb21wYXJpc29uIHRvIHRoYXQgICovCisgIC8qICAgICAgYnkgUXVpY2tEcmF3IEFQSS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG9mZnNldHMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIFRoZSBzdHJlYW0gb2Zmc2V0cyBmb3IgdGhlIHJlc291cmNlIGRhdGEgc3BlY2lmaWVkIGJ5IGB0YWcnLiAgICAgKi8KKyAgLyogICAgICBUaGlzIGFycmF5IGlzIGFsbG9jYXRlZCBieSB0aGUgZnVuY3Rpb24sIHNvIHlvdSBoYXZlIHRvIGNhbGwgICAgICovCisgIC8qICAgICAgQGZ0X21lbV9mcmVlIGFmdGVyIHVzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY291bnQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgVGhlIGxlbmd0aCBvZiBvZmZzZXRzIGFycmF5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICBGVF9FcnJfT2sgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE5vcm1hbGx5IHlvdSBzaG91bGQgdXNlIGBGVF9SYWNjZXNzX0dldF9IZWFkZXJJbmZvJyB0byBnZXQgdGhlICAgICAqLworICAvKiAgICB2YWx1ZSBmb3IgYG1hcF9vZmZzZXQnIGFuZCBgcmRhdGFfcG9zJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0JBU0UoIEZUX0Vycm9yICkKKyAgRlRfUmFjY2Vzc19HZXRfRGF0YU9mZnNldHMoIEZUX0xpYnJhcnkgIGxpYnJhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICBtYXBfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgcmRhdGFfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgc29ydF9ieV9yZXNfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgKipvZmZzZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqY291bnQgKTsKKworCitGVF9FTkRfSEVBREVSCisKKyNlbmRpZiAvKiBfX0ZUUkZPUktfSF9fICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c2Vydi5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWEwYzdmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaApAQCAtMCwwICsxLDc2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnRzZXJ2LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoZSBGcmVlVHlwZSBzZXJ2aWNlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAzLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICBFYWNoIG1vZHVsZSBjYW4gZXhwb3J0IG9uZSBvciBtb3JlIGBzZXJ2aWNlcycuICBFYWNoIHNlcnZpY2UgaXMgICAgICAqLworICAvKiAgaWRlbnRpZmllZCBieSBhIGNvbnN0YW50IHN0cmluZyBhbmQgbW9kZWxlZCBieSBhIHBvaW50ZXI7IHRoZSBsYXR0ZXIgKi8KKyAgLyogIGdlbmVyYWxseSBjb3JyZXNwb25kcyB0byBhIHN0cnVjdHVyZSBjb250YWluaW5nIGZ1bmN0aW9uIHBvaW50ZXJzLiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgTm90ZSB0aGF0IGEgc2VydmljZSdzIGRhdGEgY2Fubm90IGJlIGEgbWVyZSBmdW5jdGlvbiBwb2ludGVyIGJlY2F1c2UgKi8KKyAgLyogIGluIEMgaXQgaXMgcG9zc2libGUgdGhhdCBmdW5jdGlvbiBwb2ludGVycyBtaWdodCBiZSBpbXBsZW1lbnRlZCAgICAgICovCisgIC8qICBkaWZmZXJlbnRseSB0aGFuIGRhdGEgcG9pbnRlcnMgKGUuZy4gNDggYml0cyBpbnN0ZWFkIG9mIDMyKS4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0ZUU0VSVl9IX18KKyNkZWZpbmUgX19GVFNFUlZfSF9fCisKKworRlRfQkVHSU5fSEVBREVSCisKKyAgLyoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX0ZBQ0VfRklORF9TRVJWSUNFCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gbG9vayB1cCBhIHNlcnZpY2UgZnJvbSBhIGZhY2UncyBkcml2ZXIgbW9kdWxlLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgVGhlIHNvdXJjZSBmYWNlIGhhbmRsZS4KKyAgICoKKyAgICogICBpZCA6OgorICAgKiAgICAgQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgc2VydmljZSBhcyBkZWZpbmVkIGluIHRoZSBzZXJ2aWNlJ3MKKyAgICogICAgIGhlYWRlciBmaWxlcyAoZS5nLiBGVF9TRVJWSUNFX0lEX01VTFRJX01BU1RFUlMgd2hpY2ggZXhwYW5kcyB0bworICAgKiAgICAgYG11bHRpLW1hc3RlcnMnKS4gIEl0IGlzIGF1dG9tYXRpY2FsbHkgcHJlZml4ZWQgd2l0aAorICAgKiAgICAgYEZUX1NFUlZJQ0VfSURfJy4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBwdHIgOjoKKyAgICogICAgIEEgdmFyaWFibGUgdGhhdCByZWNlaXZlcyB0aGUgc2VydmljZSBwb2ludGVyLiAgV2lsbCBiZSBOVUxMCisgICAqICAgICBpZiBub3QgZm91bmQuCisgICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCisKKyNkZWZpbmUgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHB0ciwgaWQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZUX01vZHVsZSAgICBtb2R1bGUgPSBGVF9NT0RVTEUoIEZUX0ZBQ0UoIGZhY2UgKS0+ZHJpdmVyICk7ICAgICAgICAgICAgIFwKKyAgICBGVF9Qb2ludGVyICAgX3RtcF8gID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlRfUG9pbnRlciogIF9wcHRyXyA9IChGVF9Qb2ludGVyKikmKHB0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCBtb2R1bGUtPmNsYXp6LT5nZXRfaW50ZXJmYWNlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX3RtcF8gPSBtb2R1bGUtPmNsYXp6LT5nZXRfaW50ZXJmYWNlKCBtb2R1bGUsIEZUX1NFUlZJQ0VfSURfICMjIGlkICk7IFwKKyAgICAqX3BwdHJfID0gX3RtcF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0VORF9TVE1OVAorCisjZWxzZSAvKiAhQysrICovCisKKyNkZWZpbmUgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHB0ciwgaWQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZUX01vZHVsZSAgIG1vZHVsZSA9IEZUX01PRFVMRSggRlRfRkFDRSggZmFjZSApLT5kcml2ZXIgKTsgICAgICAgICAgICAgIFwKKyAgICBGVF9Qb2ludGVyICBfdG1wXyAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggbW9kdWxlLT5jbGF6ei0+Z2V0X2ludGVyZmFjZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF90bXBfID0gbW9kdWxlLT5jbGF6ei0+Z2V0X2ludGVyZmFjZSggbW9kdWxlLCBGVF9TRVJWSUNFX0lEXyAjIyBpZCApOyBcCisgICAgcHRyID0gX3RtcF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGVF9FTkRfU1RNTlQKKworI2VuZGlmIC8qICFDKysgKi8KKworCisgIC8qCisgICAqIEBtYWNybzoKKyAgICogICBGVF9GQUNFX0ZJTkRfR0xPQkFMX1NFUlZJQ0UKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBsb29rIHVwIGEgc2VydmljZSBmcm9tIGFsbCBtb2R1bGVzLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgVGhlIHNvdXJjZSBmYWNlIGhhbmRsZS4KKyAgICoKKyAgICogICBpZCA6OgorICAgKiAgICAgQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgc2VydmljZSBhcyBkZWZpbmVkIGluIHRoZSBzZXJ2aWNlJ3MKKyAgICogICAgIGhlYWRlciBmaWxlcyAoZS5nLiBGVF9TRVJWSUNFX0lEX01VTFRJX01BU1RFUlMgd2hpY2ggZXhwYW5kcyB0bworICAgKiAgICAgYG11bHRpLW1hc3RlcnMnKS4gIEl0IGlzIGF1dG9tYXRpY2FsbHkgcHJlZml4ZWQgd2l0aAorICAgKiAgICAgYEZUX1NFUlZJQ0VfSURfJy4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBwdHIgOjoKKyAgICogICAgIEEgdmFyaWFibGUgdGhhdCByZWNlaXZlcyB0aGUgc2VydmljZSBwb2ludGVyLiAgV2lsbCBiZSBOVUxMCisgICAqICAgICBpZiBub3QgZm91bmQuCisgICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCisKKyNkZWZpbmUgRlRfRkFDRV9GSU5EX0dMT0JBTF9TRVJWSUNFKCBmYWNlLCBwdHIsIGlkICkgICAgICAgICAgICAgICBcCisgIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZUX01vZHVsZSAgICBtb2R1bGUgPSBGVF9NT0RVTEUoIEZUX0ZBQ0UoIGZhY2UgKS0+ZHJpdmVyICk7ICAgIFwKKyAgICBGVF9Qb2ludGVyICAgX3RtcF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlRfUG9pbnRlciogIF9wcHRyXyA9IChGVF9Qb2ludGVyKikmKHB0cik7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX3RtcF8gPSBmdF9tb2R1bGVfZ2V0X3NlcnZpY2UoIG1vZHVsZSwgRlRfU0VSVklDRV9JRF8gIyMgaWQgKTsgXAorICAgICpfcHB0cl8gPSBfdG1wXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlRfRU5EX1NUTU5UCisKKyNlbHNlIC8qICFDKysgKi8KKworI2RlZmluZSBGVF9GQUNFX0ZJTkRfR0xPQkFMX1NFUlZJQ0UoIGZhY2UsIHB0ciwgaWQgKSAgICAgICAgICAgICAgIFwKKyAgRlRfQkVHSU5fU1RNTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlRfTW9kdWxlICAgbW9kdWxlID0gRlRfTU9EVUxFKCBGVF9GQUNFKCBmYWNlICktPmRyaXZlciApOyAgICAgXAorICAgIEZUX1BvaW50ZXIgIF90bXBfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF90bXBfID0gZnRfbW9kdWxlX2dldF9zZXJ2aWNlKCBtb2R1bGUsIEZUX1NFUlZJQ0VfSURfICMjIGlkICk7IFwKKyAgICBwdHIgICA9IF90bXBfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0VORF9TVE1OVAorCisjZW5kaWYgLyogIUMrKyAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKyAgLyoqKioqICAgICAgICAgUyBFIFIgViBJIEMgRSAgIEQgRSBTIEMgUiBJIFAgVCBPIFIgUyAgICAgICAgICAgICAgICAgKioqKiovCisgIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyoKKyAgICogIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGlzIHVzZWQgdG8gX2Rlc2NyaWJlXyBhIGdpdmVuIHNlcnZpY2UKKyAgICogIHRvIHRoZSBsaWJyYXJ5LiAgVGhpcyBpcyB1c2VmdWwgdG8gYnVpbGQgc2ltcGxlIHN0YXRpYyBzZXJ2aWNlIGxpc3RzLgorICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1NlcnZpY2VEZXNjUmVjXworICB7CisgICAgY29uc3QgY2hhciogIHNlcnZfaWQ7ICAgICAvKiBzZXJ2aWNlIG5hbWUgICAgICAgICAqLworICAgIGNvbnN0IHZvaWQqICBzZXJ2X2RhdGE7ICAgLyogc2VydmljZSBwb2ludGVyL2RhdGEgKi8KKworICB9IEZUX1NlcnZpY2VEZXNjUmVjOworCisgIHR5cGVkZWYgY29uc3QgRlRfU2VydmljZURlc2NSZWMqICBGVF9TZXJ2aWNlRGVzYzsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBhcnJheSBvZiBGVF9TZXJ2aWNlRGVzY1JlYyBzdHJ1Y3R1cmVzLiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkIGEgYGNyZWF0ZScgZnVuY3Rpb24gbmVlZHMgdG8gICovCisgIC8qICAgIGJlIGNhbGxlZCB3aXRoIGEgcG9pbnRlciB0byByZXR1cm4gYW4gYWxsb2NhdGVkIGFycmF5LiAgQXMgc29vbiBhcyAqLworICAvKiAgICBpdCBpcyBubyBsb25nZXIgbmVlZGVkLCBhIGBkZXN0cm95JyBmdW5jdGlvbiBuZWVkcyB0byBiZSBjYWxsZWQgdG8gKi8KKyAgLyogICAgcmVsZWFzZSB0aGF0IGFsbG9jYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIG1hbnVhbGx5IGNhbGxlZCBmcm9tIHRoZSBgcGljX2luaXQnIGFuZCAgKi8KKyAgLyogICAgYHBpY19mcmVlJyBmdW5jdGlvbnMgb2YgeW91ciBtb2R1bGUgKHNlZSBGVF9ERUZJTkVfTU9EVUxFKS4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBXaGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIG5vdCBkZWZpbmVkIHRoZSBhcnJheSB3aWxsIGJlICAgICAgICAgKi8KKyAgLyogICAgYWxsb2NhdGVkIGluIHRoZSBnbG9iYWwgc2NvcGUgKG9yIHRoZSBzY29wZSB3aGVyZSB0aGUgbWFjcm8gaXMgICAgICovCisgIC8qICAgIHVzZWQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKKworI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUMxKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSApICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlRGVzY1JlYyAgY2xhc3NfW10gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyBOVUxMLCBOVUxMIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OworCisjZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzIoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8yLCBzZXJ2X2RhdGFfMiApICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlRGVzY1JlYyAgY2xhc3NfW10gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgTlVMTCwgTlVMTCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsKKworI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUMzKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzMsIHNlcnZfZGF0YV8zICkgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VEZXNjUmVjICBjbGFzc19bXSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyBzZXJ2X2lkXzMsIHNlcnZfZGF0YV8zIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgTlVMTCwgTlVMTCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsKKworI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM0KCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzMsIHNlcnZfZGF0YV8zLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF80LCBzZXJ2X2RhdGFfNCApICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlRGVzY1JlYyAgY2xhc3NfW10gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMyB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IHNlcnZfaWRfNCwgc2Vydl9kYXRhXzQgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyBOVUxMLCBOVUxMIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OworCisjZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzUoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8yLCBzZXJ2X2RhdGFfMiwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMywgc2Vydl9kYXRhXzMsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzQsIHNlcnZfZGF0YV80LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF81LCBzZXJ2X2RhdGFfNSApICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlRGVzY1JlYyAgY2xhc3NfW10gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMyB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IHNlcnZfaWRfNCwgc2Vydl9kYXRhXzQgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyBzZXJ2X2lkXzUsIHNlcnZfZGF0YV81IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgTlVMTCwgTlVMTCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsKKworI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM2KCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzMsIHNlcnZfZGF0YV8zLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF80LCBzZXJ2X2RhdGFfNCwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNSwgc2Vydl9kYXRhXzUsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzYsIHNlcnZfZGF0YV82ICkgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VEZXNjUmVjICBjbGFzc19bXSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyBzZXJ2X2lkXzMsIHNlcnZfZGF0YV8zIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgc2Vydl9pZF80LCBzZXJ2X2RhdGFfNCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IHNlcnZfaWRfNSwgc2Vydl9kYXRhXzUgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyBzZXJ2X2lkXzYsIHNlcnZfZGF0YV82IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgTlVMTCwgTlVMTCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsKKworI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM3KCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzMsIHNlcnZfZGF0YV8zLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF80LCBzZXJ2X2RhdGFfNCwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNSwgc2Vydl9kYXRhXzUsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzYsIHNlcnZfZGF0YV82LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF83LCBzZXJ2X2RhdGFfNyApICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlRGVzY1JlYyAgY2xhc3NfW10gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMyB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IHNlcnZfaWRfNCwgc2Vydl9kYXRhXzQgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyBzZXJ2X2lkXzUsIHNlcnZfZGF0YV81IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgc2Vydl9pZF82LCBzZXJ2X2RhdGFfNiB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IHNlcnZfaWRfNywgc2Vydl9kYXRhXzcgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyBOVUxMLCBOVUxMIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OworCisjZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLworCisjZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzEoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xICkgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0Rlc3Ryb3lfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogKSAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCBjbGF6eiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlRfRlJFRSggY2xhenogKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlRfQ3JlYXRlX0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyoqICBvdXRwdXRfY2xhc3MgKSAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZUX01lbW9yeSAgICAgICAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggRlRfQUxMT0MoIGNsYXp6LCBzaXplb2YgKCAqY2xhenogKSAqIDIgKSApICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6WzBdLnNlcnZfaWQgICA9IHNlcnZfaWRfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6elswXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenpbMV0uc2Vydl9pZCAgID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6WzFdLnNlcnZfZGF0YSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKm91dHB1dF9jbGFzcyA9IGNsYXp6OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUMyKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIgKSAgICAgICAgICAgICAgICAgXAorICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlRfRGVzdHJveV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiApICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIGNsYXp6ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGVF9GUkVFKCBjbGF6eiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGVF9DcmVhdGVfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiogIG91dHB1dF9jbGFzcyApICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVF9FcnJvciAgICAgICAgICAgIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlRfTWVtb3J5ICAgICAgICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCBGVF9BTExPQyggY2xhenosIHNpemVvZiAoICpjbGF6eiApICogMyApICkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenpbMF0uc2Vydl9pZCAgID0gc2Vydl9pZF8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6WzBdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6elsxXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenpbMV0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6WzJdLnNlcnZfaWQgICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6elsyXS5zZXJ2X2RhdGEgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpvdXRwdXRfY2xhc3MgPSBjbGF6ejsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIEZUX0Vycl9PazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDMyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMyApICAgICAgICAgICAgICAgICBcCisgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGVF9EZXN0cm95X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICkgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggY2xhenogKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0NyZWF0ZV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqKiAgb3V0cHV0X2NsYXNzICkgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZUX0Vycm9yICAgICAgICAgICAgZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIEZUX0FMTE9DKCBjbGF6eiwgc2l6ZW9mICggKmNsYXp6ICkgKiA0ICkgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6elswXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenpbMF0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6WzFdLnNlcnZfaWQgICA9IHNlcnZfaWRfMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6elsxXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenpbMl0uc2Vydl9pZCAgID0gc2Vydl9pZF8zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6WzJdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6elszXS5zZXJ2X2lkICAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenpbM10uc2Vydl9kYXRhID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqb3V0cHV0X2NsYXNzID0gY2xheno7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBGVF9FcnJfT2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzQoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8yLCBzZXJ2X2RhdGFfMiwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMywgc2Vydl9kYXRhXzMsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzQsIHNlcnZfZGF0YV80ICkgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0Rlc3Ryb3lfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogKSAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCBjbGF6eiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlRfRlJFRSggY2xhenogKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlRfQ3JlYXRlX0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyoqICBvdXRwdXRfY2xhc3MgKSAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZUX01lbW9yeSAgICAgICAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggRlRfQUxMT0MoIGNsYXp6LCBzaXplb2YgKCAqY2xhenogKSAqIDUgKSApICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6WzBdLnNlcnZfaWQgICA9IHNlcnZfaWRfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6elswXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenpbMV0uc2Vydl9pZCAgID0gc2Vydl9pZF8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6WzFdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6elsyXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenpbMl0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6WzNdLnNlcnZfaWQgICA9IHNlcnZfaWRfNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6elszXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenpbNF0uc2Vydl9pZCAgID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6WzRdLnNlcnZfZGF0YSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKm91dHB1dF9jbGFzcyA9IGNsYXp6OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM1KCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzMsIHNlcnZfZGF0YV8zLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF80LCBzZXJ2X2RhdGFfNCwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNSwgc2Vydl9kYXRhXzUgKSAgICAgICAgICAgICAgICAgXAorICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlRfRGVzdHJveV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiApICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIGNsYXp6ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGVF9GUkVFKCBjbGF6eiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGVF9DcmVhdGVfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiogIG91dHB1dF9jbGFzcyApICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVF9FcnJvciAgICAgICAgICAgIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlRfTWVtb3J5ICAgICAgICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCBGVF9BTExPQyggY2xhenosIHNpemVvZiAoICpjbGF6eiApICogNiApICkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenpbMF0uc2Vydl9pZCAgID0gc2Vydl9pZF8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6WzBdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6elsxXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenpbMV0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6WzJdLnNlcnZfaWQgICA9IHNlcnZfaWRfMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6elsyXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenpbM10uc2Vydl9pZCAgID0gc2Vydl9pZF80OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6WzNdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV80OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6els0XS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenpbNF0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6WzVdLnNlcnZfaWQgICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6els1XS5zZXJ2X2RhdGEgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpvdXRwdXRfY2xhc3MgPSBjbGF6ejsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIEZUX0Vycl9PazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNiggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMywgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNCwgc2Vydl9kYXRhXzQsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzUsIHNlcnZfZGF0YV81LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF82LCBzZXJ2X2RhdGFfNiApICAgICAgICAgICAgICAgICBcCisgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGVF9EZXN0cm95X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICkgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggY2xhenogKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0NyZWF0ZV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqKiAgb3V0cHV0X2NsYXNzKSAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZUX0Vycm9yICAgICAgICAgICAgZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIEZUX0FMTE9DKCBjbGF6eiwgc2l6ZW9mICggKmNsYXp6ICkgKiA3ICkgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6elswXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenpbMF0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6WzFdLnNlcnZfaWQgICA9IHNlcnZfaWRfMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6elsxXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenpbMl0uc2Vydl9pZCAgID0gc2Vydl9pZF8zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6WzJdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6elszXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenpbM10uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6WzRdLnNlcnZfaWQgICA9IHNlcnZfaWRfNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6els0XS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenpbNV0uc2Vydl9pZCAgID0gc2Vydl9pZF82OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6WzVdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV82OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6els2XS5zZXJ2X2lkICAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenpbNl0uc2Vydl9kYXRhID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqb3V0cHV0X2NsYXNzID0gY2xheno7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBGVF9FcnJfT2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzcoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8yLCBzZXJ2X2RhdGFfMiwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMywgc2Vydl9kYXRhXzMsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzQsIHNlcnZfZGF0YV80LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF81LCBzZXJ2X2RhdGFfNSwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNiwgc2Vydl9kYXRhXzYsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzcsIHNlcnZfZGF0YV83ICkgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0Rlc3Ryb3lfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogKSAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCBjbGF6eiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlRfRlJFRSggY2xhenogKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlRfQ3JlYXRlX0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyoqICBvdXRwdXRfY2xhc3MpICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZUX01lbW9yeSAgICAgICAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggRlRfQUxMT0MoIGNsYXp6LCBzaXplb2YgKCAqY2xhenogKSAqIDggKSApICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6WzBdLnNlcnZfaWQgICA9IHNlcnZfaWRfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6elswXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenpbMV0uc2Vydl9pZCAgID0gc2Vydl9pZF8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6WzFdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6elsyXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenpbMl0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6WzNdLnNlcnZfaWQgICA9IHNlcnZfaWRfNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6elszXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenpbNF0uc2Vydl9pZCAgID0gc2Vydl9pZF81OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6WzRdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV81OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6els1XS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenpbNV0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6WzZdLnNlcnZfaWQgICA9IHNlcnZfaWRfNzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6els2XS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfNzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenpbN10uc2Vydl9pZCAgID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6WzddLnNlcnZfZGF0YSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKm91dHB1dF9jbGFzcyA9IGNsYXp6OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCisKKworICAvKgorICAgKiAgUGFyc2UgYSBsaXN0IG9mIEZUX1NlcnZpY2VEZXNjUmVjIGRlc2NyaXB0b3JzIGFuZCBsb29rIGZvcgorICAgKiAgYSBzcGVjaWZpYyBzZXJ2aWNlIGJ5IElELiAgTm90ZSB0aGF0IHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlCisgICAqICBhcnJheSBtdXN0IGJlIHsgTlVMTCwgTlVMTCB9LCBhbmQgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkCisgICAqICByZXR1cm4gTlVMTCBpZiB0aGUgc2VydmljZSBpc24ndCBhdmFpbGFibGUuCisgICAqCisgICAqICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGJ5IG1vZHVsZXMgdG8gaW1wbGVtZW50IHRoZWlyCisgICAqICBgZ2V0X3NlcnZpY2UnIG1ldGhvZC4KKyAgICovCisgIEZUX0JBU0UoIEZUX1BvaW50ZXIgKQorICBmdF9zZXJ2aWNlX2xpc3RfbG9va3VwKCBGVF9TZXJ2aWNlRGVzYyAgc2VydmljZV9kZXNjcmlwdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICAgIHNlcnZpY2VfaWQgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCisgIC8qKioqKiAgICAgICAgICAgICBTIEUgUiBWIEkgQyBFIFMgICBDIEEgQyBIIEUgICAgICAgICAgICAgICAgICAgICAgICoqKioqLworICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qCisgICAqICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHN0b3JlIGEgY2FjaGUgZm9yIHNldmVyYWwgZnJlcXVlbnRseSB1c2VkCisgICAqICBzZXJ2aWNlcy4gIEl0IGlzIHRoZSB0eXBlIG9mIGBmYWNlLT5pbnRlcm5hbC0+c2VydmljZXMnLiAgWW91CisgICAqICBzaG91bGQgb25seSB1c2UgRlRfRkFDRV9MT09LVVBfU0VSVklDRSB0byBhY2Nlc3MgaXQuCisgICAqCisgICAqICBBbGwgZmllbGRzIHNob3VsZCBoYXZlIHRoZSB0eXBlIEZUX1BvaW50ZXIgdG8gcmVsYXggY29tcGlsYXRpb24KKyAgICogIGRlcGVuZGVuY2llcy4gIFdlIGFzc3VtZSB0aGUgZGV2ZWxvcGVyIGlzbid0IGNvbXBsZXRlbHkgc3R1cGlkLgorICAgKgorICAgKiAgRWFjaCBmaWVsZCBtdXN0IGJlIG5hbWVkIGBzZXJ2aWNlX1hYWFgnIHdoZXJlIGBYWFgnIGNvcnJlc3BvbmRzIHRvCisgICAqICB0aGUgY29ycmVjdCBGVF9TRVJWSUNFX0lEX1hYWFggbWFjcm8uICBTZWUgdGhlIGRlZmluaXRpb24gb2YKKyAgICogIEZUX0ZBQ0VfTE9PS1VQX1NFUlZJQ0UgYmVsb3cgaG93IHRoaXMgaXMgaW1wbGVtZW50ZWQuCisgICAqCisgICAqLworICB0eXBlZGVmIHN0cnVjdCAgRlRfU2VydmljZUNhY2hlUmVjXworICB7CisgICAgRlRfUG9pbnRlciAgc2VydmljZV9QT1NUU0NSSVBUX0ZPTlRfTkFNRTsKKyAgICBGVF9Qb2ludGVyICBzZXJ2aWNlX01VTFRJX01BU1RFUlM7CisgICAgRlRfUG9pbnRlciAgc2VydmljZV9HTFlQSF9ESUNUOworICAgIEZUX1BvaW50ZXIgIHNlcnZpY2VfUEZSX01FVFJJQ1M7CisgICAgRlRfUG9pbnRlciAgc2VydmljZV9XSU5GTlQ7CisKKyAgfSBGVF9TZXJ2aWNlQ2FjaGVSZWMsICpGVF9TZXJ2aWNlQ2FjaGU7CisKKworICAvKgorICAgKiAgQSBtYWdpYyBudW1iZXIgdXNlZCB3aXRoaW4gdGhlIHNlcnZpY2VzIGNhY2hlLgorICAgKi8KKworICAvKiBlbnN1cmUgdGhhdCB2YWx1ZSBgMScgaGFzIHRoZSBzYW1lIHdpZHRoIGFzIGEgcG9pbnRlciAqLworI2RlZmluZSBGVF9TRVJWSUNFX1VOQVZBSUxBQkxFICAoKEZUX1BvaW50ZXIpfihGVF9QdHJEaXN0KTEpCisKKworICAvKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfRkFDRV9MT09LVVBfU0VSVklDRQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVGhpcyBtYWNybyBpcyB1c2VkIHRvIGxvb2t1cCBhIHNlcnZpY2UgZnJvbSBhIGZhY2UncyBkcml2ZXIgbW9kdWxlCisgICAqICAgdXNpbmcgaXRzIGNhY2hlLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgZmFjZTo6CisgICAqICAgICBUaGUgc291cmNlIGZhY2UgaGFuZGxlIGNvbnRhaW5pbmcgdGhlIGNhY2hlLgorICAgKgorICAgKiAgIGZpZWxkIDo6CisgICAqICAgICBUaGUgZmllbGQgbmFtZSBpbiB0aGUgY2FjaGUuCisgICAqCisgICAqICAgaWQgOjoKKyAgICogICAgIFRoZSBzZXJ2aWNlIElELgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIHB0ciA6OgorICAgKiAgICAgQSB2YXJpYWJsZSByZWNlaXZpbmcgdGhlIHNlcnZpY2UgZGF0YS4gIE5VTEwgaWYgbm90IGF2YWlsYWJsZS4KKyAgICovCisjaWZkZWYgX19jcGx1c3BsdXMKKworI2RlZmluZSBGVF9GQUNFX0xPT0tVUF9TRVJWSUNFKCBmYWNlLCBwdHIsIGlkICkgICAgICAgICAgICAgICAgXAorICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZUX1BvaW50ZXIgICBzdmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZUX1BvaW50ZXIqICBQcHRyID0gKEZUX1BvaW50ZXIqKSYocHRyKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN2YyA9IEZUX0ZBQ0UoIGZhY2UgKS0+aW50ZXJuYWwtPnNlcnZpY2VzLiBzZXJ2aWNlXyAjIyBpZDsgXAorICAgIGlmICggc3ZjID09IEZUX1NFUlZJQ0VfVU5BVkFJTEFCTEUgKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3ZjID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYgKCBzdmMgPT0gTlVMTCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHN2YywgaWQgKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlRfRkFDRSggZmFjZSApLT5pbnRlcm5hbC0+c2VydmljZXMuIHNlcnZpY2VfICMjIGlkID0gICAgXAorICAgICAgICAoRlRfUG9pbnRlcikoIHN2YyAhPSBOVUxMID8gc3ZjICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlRfU0VSVklDRV9VTkFWQUlMQUJMRSApOyAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpQcHRyID0gc3ZjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGVF9FTkRfU1RNTlQKKworI2Vsc2UgLyogIUMrKyAqLworCisjZGVmaW5lIEZUX0ZBQ0VfTE9PS1VQX1NFUlZJQ0UoIGZhY2UsIHB0ciwgaWQgKSAgICAgICAgICAgICAgICBcCisgIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlRfUG9pbnRlciAgc3ZjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3ZjID0gRlRfRkFDRSggZmFjZSApLT5pbnRlcm5hbC0+c2VydmljZXMuIHNlcnZpY2VfICMjIGlkOyBcCisgICAgaWYgKCBzdmMgPT0gRlRfU0VSVklDRV9VTkFWQUlMQUJMRSApICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdmMgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAoIHN2YyA9PSBOVUxMICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGVF9GQUNFX0ZJTkRfU0VSVklDRSggZmFjZSwgc3ZjLCBpZCApOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGVF9GQUNFKCBmYWNlICktPmludGVybmFsLT5zZXJ2aWNlcy4gc2VydmljZV8gIyMgaWQgPSAgICBcCisgICAgICAgIChGVF9Qb2ludGVyKSggc3ZjICE9IE5VTEwgPyBzdmMgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGVF9TRVJWSUNFX1VOQVZBSUxBQkxFICk7ICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHRyID0gc3ZjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0VORF9TVE1OVAorCisjZW5kaWYgLyogIUMrKyAqLworCisgIC8qCisgICAqICBBIG1hY3JvIHVzZWQgdG8gZGVmaW5lIG5ldyBzZXJ2aWNlIHN0cnVjdHVyZSB0eXBlcy4KKyAgICovCisKKyNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0UoIG5hbWUgKSAgICAgICAgICAgIFwKKyAgdHlwZWRlZiBzdHJ1Y3QgRlRfU2VydmljZV8gIyMgbmFtZSAjIyBSZWNfIFwKKyAgICBGVF9TZXJ2aWNlXyAjIyBuYW1lICMjIFJlYyA7ICAgICAgICAgICAgIFwKKyAgdHlwZWRlZiBzdHJ1Y3QgRlRfU2VydmljZV8gIyMgbmFtZSAjIyBSZWNfIFwKKyAgICBjb25zdCAqIEZUX1NlcnZpY2VfICMjIG5hbWUgOyAgICAgICAgICAgIFwKKyAgc3RydWN0IEZUX1NlcnZpY2VfICMjIG5hbWUgIyMgUmVjXworCisgIC8qICovCisKKyAgLyoKKyAgICogIFRoZSBoZWFkZXIgZmlsZXMgY29udGFpbmluZyB0aGUgc2VydmljZXMuCisgICAqLworCisjZGVmaW5lIEZUX1NFUlZJQ0VfQkRGX0ggICAgICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2YmRmLmg+CisjZGVmaW5lIEZUX1NFUlZJQ0VfQ0lEX0ggICAgICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Y2lkLmg+CisjZGVmaW5lIEZUX1NFUlZJQ0VfR0xZUEhfRElDVF9IICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Z2xkaWN0Lmg+CisjZGVmaW5lIEZUX1NFUlZJQ0VfR1hfVkFMSURBVEVfSCAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Z3h2YWwuaD4KKyNkZWZpbmUgRlRfU0VSVklDRV9LRVJOSU5HX0ggICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZrZXJuLmg+CisjZGVmaW5lIEZUX1NFUlZJQ0VfTVVMVElQTEVfTUFTVEVSU19IICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2bW0uaD4KKyNkZWZpbmUgRlRfU0VSVklDRV9PUEVOVFlQRV9WQUxJREFURV9IICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZvdHZhbC5oPgorI2RlZmluZSBGVF9TRVJWSUNFX1BGUl9IICAgICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBmci5oPgorI2RlZmluZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSCAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBzY21hcC5oPgorI2RlZmluZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfSU5GT19IICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBzaW5mby5oPgorI2RlZmluZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfTkFNRV9IICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBvc3RubS5oPgorI2RlZmluZSBGVF9TRVJWSUNFX1BST1BFUlRJRVNfSCAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnByb3AuaD4KKyNkZWZpbmUgRlRfU0VSVklDRV9TRk5UX0ggICAgICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZzZm50Lmg+CisjZGVmaW5lIEZUX1NFUlZJQ0VfVFJVRVRZUEVfRU5HSU5FX0ggICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRlbmcuaD4KKyNkZWZpbmUgRlRfU0VSVklDRV9UVF9DTUFQX0ggICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGNtYXAuaD4KKyNkZWZpbmUgRlRfU0VSVklDRV9XSU5GTlRfSCAgICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z3aW5mbnQuaD4KKyNkZWZpbmUgRlRfU0VSVklDRV9GT05UX0ZPUk1BVF9IICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZmbnRmbXQuaD4KKyNkZWZpbmUgRlRfU0VSVklDRV9UUlVFVFlQRV9HTFlGX0ggICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGdseWYuaD4KKworIC8qICovCisKK0ZUX0VORF9IRUFERVIKKworI2VuZGlmIC8qIF9fRlRTRVJWX0hfXyAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NGU1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmgKQEAgLTAsMCArMSw1MzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0c3RyZWFtLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBTdHJlYW0gaGFuZGxpbmcgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0ZUU1RSRUFNX0hfXworI2RlZmluZSBfX0ZUU1RSRUFNX0hfXworCisKKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorI2luY2x1ZGUgRlRfU1lTVEVNX0gKKyNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyAgLyogZm9ybWF0IG9mIGFuIDgtYml0IGZyYW1lX29wIHZhbHVlOiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogYml0ICA3NjU0MzIxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICB4eHh4eHhlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogcyBpcyBzZXQgdG8gMSBpZiB0aGUgdmFsdWUgaXMgc2lnbmVkLiAgICAgICAgKi8KKyAgLyogZSBpcyBzZXQgdG8gMSBpZiB0aGUgdmFsdWUgaXMgbGl0dGxlLWVuZGlhbi4gKi8KKyAgLyogeHh4IGlzIGEgY29tbWFuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBGVF9GUkFNRV9PUF9TSElGVCAgICAgICAgIDIKKyNkZWZpbmUgRlRfRlJBTUVfT1BfU0lHTkVEICAgICAgICAxCisjZGVmaW5lIEZUX0ZSQU1FX09QX0xJVFRMRSAgICAgICAgMgorI2RlZmluZSBGVF9GUkFNRV9PUF9DT01NQU5EKCB4ICkgICggeCA+PiBGVF9GUkFNRV9PUF9TSElGVCApCisKKyNkZWZpbmUgRlRfTUFLRV9GUkFNRV9PUCggY29tbWFuZCwgbGl0dGxlLCBzaWduICkgXAorICAgICAgICAgICggKCBjb21tYW5kIDw8IEZUX0ZSQU1FX09QX1NISUZUICkgfCAoIGxpdHRsZSA8PCAxICkgfCBzaWduICkKKworI2RlZmluZSBGVF9GUkFNRV9PUF9FTkQgICAgMAorI2RlZmluZSBGVF9GUkFNRV9PUF9TVEFSVCAgMSAgLyogc3RhcnQgYSBuZXcgZnJhbWUgICAgICovCisjZGVmaW5lIEZUX0ZSQU1FX09QX0JZVEUgICAyICAvKiByZWFkIDEtYnl0ZSB2YWx1ZSAgICAgKi8KKyNkZWZpbmUgRlRfRlJBTUVfT1BfU0hPUlQgIDMgIC8qIHJlYWQgMi1ieXRlIHZhbHVlICAgICAqLworI2RlZmluZSBGVF9GUkFNRV9PUF9MT05HICAgNCAgLyogcmVhZCA0LWJ5dGUgdmFsdWUgICAgICovCisjZGVmaW5lIEZUX0ZSQU1FX09QX09GRjMgICA1ICAvKiByZWFkIDMtYnl0ZSB2YWx1ZSAgICAgKi8KKyNkZWZpbmUgRlRfRlJBTUVfT1BfQllURVMgIDYgIC8qIHJlYWQgYSBieXRlcyBzZXF1ZW5jZSAqLworCisKKyAgdHlwZWRlZiBlbnVtICBGVF9GcmFtZV9PcF8KKyAgeworICAgIGZ0X2ZyYW1lX2VuZCAgICAgICA9IDAsCisgICAgZnRfZnJhbWVfc3RhcnQgICAgID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfU1RBUlQsIDAsIDAgKSwKKworICAgIGZ0X2ZyYW1lX2J5dGUgICAgICA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX0JZVEUsICAwLCAwICksCisgICAgZnRfZnJhbWVfc2NoYXIgICAgID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfQllURSwgIDAsIDEgKSwKKworICAgIGZ0X2ZyYW1lX3VzaG9ydF9iZSA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX1NIT1JULCAwLCAwICksCisgICAgZnRfZnJhbWVfc2hvcnRfYmUgID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfU0hPUlQsIDAsIDEgKSwKKyAgICBmdF9mcmFtZV91c2hvcnRfbGUgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9TSE9SVCwgMSwgMCApLAorICAgIGZ0X2ZyYW1lX3Nob3J0X2xlICA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX1NIT1JULCAxLCAxICksCisKKyAgICBmdF9mcmFtZV91bG9uZ19iZSAgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9MT05HLCAwLCAwICksCisgICAgZnRfZnJhbWVfbG9uZ19iZSAgID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfTE9ORywgMCwgMSApLAorICAgIGZ0X2ZyYW1lX3Vsb25nX2xlICA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX0xPTkcsIDEsIDAgKSwKKyAgICBmdF9mcmFtZV9sb25nX2xlICAgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9MT05HLCAxLCAxICksCisKKyAgICBmdF9mcmFtZV91b2ZmM19iZSAgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9PRkYzLCAwLCAwICksCisgICAgZnRfZnJhbWVfb2ZmM19iZSAgID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfT0ZGMywgMCwgMSApLAorICAgIGZ0X2ZyYW1lX3VvZmYzX2xlICA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX09GRjMsIDEsIDAgKSwKKyAgICBmdF9mcmFtZV9vZmYzX2xlICAgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9PRkYzLCAxLCAxICksCisKKyAgICBmdF9mcmFtZV9ieXRlcyAgICAgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9CWVRFUywgMCwgMCApLAorICAgIGZ0X2ZyYW1lX3NraXAgICAgICA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX0JZVEVTLCAwLCAxICkKKworICB9IEZUX0ZyYW1lX09wOworCisKKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0ZyYW1lX0ZpZWxkXworICB7CisgICAgRlRfQnl0ZSAgICB2YWx1ZTsKKyAgICBGVF9CeXRlICAgIHNpemU7CisgICAgRlRfVVNob3J0ICBvZmZzZXQ7CisKKyAgfSBGVF9GcmFtZV9GaWVsZDsKKworCisgIC8qIENvbnN0cnVjdCBhbiBGVF9GcmFtZV9GaWVsZCBvdXQgb2YgYSBzdHJ1Y3R1cmUgdHlwZSBhbmQgYSBmaWVsZCBuYW1lLiAqLworICAvKiBUaGUgc3RydWN0dXJlIHR5cGUgbXVzdCBiZSBzZXQgaW4gdGhlIEZUX1NUUlVDVFVSRSBtYWNybyBiZWZvcmUgICAgICAgKi8KKyAgLyogY2FsbGluZyB0aGUgRlRfRlJBTUVfU1RBUlQoKSBtYWNyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9GSUVMRF9TSVpFKCBmICkgXAorICAgICAgICAgIChGVF9CeXRlKXNpemVvZiAoICgoRlRfU1RSVUNUVVJFKikwKS0+ZiApCisKKyNkZWZpbmUgRlRfRklFTERfU0laRV9ERUxUQSggZiApIFwKKyAgICAgICAgICAoRlRfQnl0ZSlzaXplb2YgKCAoKEZUX1NUUlVDVFVSRSopMCktPmZbMF0gKQorCisjZGVmaW5lIEZUX0ZJRUxEX09GRlNFVCggZiApIFwKKyAgICAgICAgICAoRlRfVVNob3J0KSggb2Zmc2V0b2YoIEZUX1NUUlVDVFVSRSwgZiApICkKKworI2RlZmluZSBGVF9GUkFNRV9GSUVMRCggZnJhbWVfb3AsIGZpZWxkICkgXAorICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZnJhbWVfb3AsICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgRlRfRklFTERfU0laRSggZmllbGQgKSwgICAgICAgXAorICAgICAgICAgICAgRlRfRklFTERfT0ZGU0VUKCBmaWVsZCApICAgICAgXAorICAgICAgICAgIH0KKworI2RlZmluZSBGVF9NQUtFX0VNUFRZX0ZJRUxEKCBmcmFtZV9vcCApICB7IGZyYW1lX29wLCAwLCAwIH0KKworI2RlZmluZSBGVF9GUkFNRV9TVEFSVCggc2l6ZSApICAgeyBmdF9mcmFtZV9zdGFydCwgMCwgc2l6ZSB9CisjZGVmaW5lIEZUX0ZSQU1FX0VORCAgICAgICAgICAgICB7IGZ0X2ZyYW1lX2VuZCwgMCwgMCB9CisKKyNkZWZpbmUgRlRfRlJBTUVfTE9ORyggZiApICAgICAgIEZUX0ZSQU1FX0ZJRUxEKCBmdF9mcmFtZV9sb25nX2JlLCBmICkKKyNkZWZpbmUgRlRfRlJBTUVfVUxPTkcoIGYgKSAgICAgIEZUX0ZSQU1FX0ZJRUxEKCBmdF9mcmFtZV91bG9uZ19iZSwgZiApCisjZGVmaW5lIEZUX0ZSQU1FX1NIT1JUKCBmICkgICAgICBGVF9GUkFNRV9GSUVMRCggZnRfZnJhbWVfc2hvcnRfYmUsIGYgKQorI2RlZmluZSBGVF9GUkFNRV9VU0hPUlQoIGYgKSAgICAgRlRfRlJBTUVfRklFTEQoIGZ0X2ZyYW1lX3VzaG9ydF9iZSwgZiApCisjZGVmaW5lIEZUX0ZSQU1FX09GRjMoIGYgKSAgICAgICBGVF9GUkFNRV9GSUVMRCggZnRfZnJhbWVfb2ZmM19iZSwgZiApCisjZGVmaW5lIEZUX0ZSQU1FX1VPRkYzKCBmICkgICAgICBGVF9GUkFNRV9GSUVMRCggZnRfZnJhbWVfdW9mZjNfYmUsIGYgKQorI2RlZmluZSBGVF9GUkFNRV9CWVRFKCBmICkgICAgICAgRlRfRlJBTUVfRklFTEQoIGZ0X2ZyYW1lX2J5dGUsIGYgKQorI2RlZmluZSBGVF9GUkFNRV9DSEFSKCBmICkgICAgICAgRlRfRlJBTUVfRklFTEQoIGZ0X2ZyYW1lX3NjaGFyLCBmICkKKworI2RlZmluZSBGVF9GUkFNRV9MT05HX0xFKCBmICkgICAgRlRfRlJBTUVfRklFTEQoIGZ0X2ZyYW1lX2xvbmdfbGUsIGYgKQorI2RlZmluZSBGVF9GUkFNRV9VTE9OR19MRSggZiApICAgRlRfRlJBTUVfRklFTEQoIGZ0X2ZyYW1lX3Vsb25nX2xlLCBmICkKKyNkZWZpbmUgRlRfRlJBTUVfU0hPUlRfTEUoIGYgKSAgIEZUX0ZSQU1FX0ZJRUxEKCBmdF9mcmFtZV9zaG9ydF9sZSwgZiApCisjZGVmaW5lIEZUX0ZSQU1FX1VTSE9SVF9MRSggZiApICBGVF9GUkFNRV9GSUVMRCggZnRfZnJhbWVfdXNob3J0X2xlLCBmICkKKyNkZWZpbmUgRlRfRlJBTUVfT0ZGM19MRSggZiApICAgIEZUX0ZSQU1FX0ZJRUxEKCBmdF9mcmFtZV9vZmYzX2xlLCBmICkKKyNkZWZpbmUgRlRfRlJBTUVfVU9GRjNfTEUoIGYgKSAgIEZUX0ZSQU1FX0ZJRUxEKCBmdF9mcmFtZV91b2ZmM19sZSwgZiApCisKKyNkZWZpbmUgRlRfRlJBTUVfU0tJUF9MT05HICAgICAgIHsgZnRfZnJhbWVfbG9uZ19iZSwgMCwgMCB9CisjZGVmaW5lIEZUX0ZSQU1FX1NLSVBfU0hPUlQgICAgICB7IGZ0X2ZyYW1lX3Nob3J0X2JlLCAwLCAwIH0KKyNkZWZpbmUgRlRfRlJBTUVfU0tJUF9CWVRFICAgICAgIHsgZnRfZnJhbWVfYnl0ZSwgMCwgMCB9CisKKyNkZWZpbmUgRlRfRlJBTUVfQllURVMoIGZpZWxkLCBjb3VudCApIFwKKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZ0X2ZyYW1lX2J5dGVzLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvdW50LCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEZUX0ZJRUxEX09GRlNFVCggZmllbGQgKSAgIFwKKyAgICAgICAgICB9CisKKyNkZWZpbmUgRlRfRlJBTUVfU0tJUF9CWVRFUyggY291bnQgKSAgeyBmdF9mcmFtZV9za2lwLCBjb3VudCwgMCB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEludGVnZXIgZXh0cmFjdGlvbiBtYWNyb3MgLS0gdGhlIGBidWZmZXInIHBhcmFtZXRlciBtdXN0IEFMV0FZUyBiZSBvZiAqLworICAvKiB0eXBlIGBjaGFyKicgb3IgZXF1aXZhbGVudCAoMS1ieXRlIGVsZW1lbnRzKS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgRlRfQllURV8oIHAsIGkgKSAgKCAoKGNvbnN0IEZUX0J5dGUqKShwKSlbKGkpXSApCisKKyNkZWZpbmUgRlRfSU5UMTYoIHggKSAgICggKEZUX0ludDE2KSh4KSAgKQorI2RlZmluZSBGVF9VSU5UMTYoIHggKSAgKCAoRlRfVUludDE2KSh4KSApCisjZGVmaW5lIEZUX0lOVDMyKCB4ICkgICAoIChGVF9JbnQzMikoeCkgICkKKyNkZWZpbmUgRlRfVUlOVDMyKCB4ICkgICggKEZUX1VJbnQzMikoeCkgKQorCisKKyNkZWZpbmUgRlRfQllURV9VMTYoIHAsIGksIHMgKSAgKCBGVF9VSU5UMTYoIEZUX0JZVEVfKCBwLCBpICkgKSA8PCAocykgKQorI2RlZmluZSBGVF9CWVRFX1UzMiggcCwgaSwgcyApICAoIEZUX1VJTlQzMiggRlRfQllURV8oIHAsIGkgKSApIDw8IChzKSApCisKKworI2RlZmluZSBGVF9QRUVLX1NIT1JUKCBwICkgIEZUX0lOVDE2KCBGVF9CWVRFX1UxNiggcCwgMCwgOCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTE2KCBwLCAxLCAwKSApCisKKyNkZWZpbmUgRlRfUEVFS19VU0hPUlQoIHAgKSAgRlRfVUlOVDE2KCBGVF9CWVRFX1UxNiggcCwgMCwgOCApIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTE2KCBwLCAxLCAwICkgKQorCisjZGVmaW5lIEZUX1BFRUtfTE9ORyggcCApICBGVF9JTlQzMiggRlRfQllURV9VMzIoIHAsIDAsIDI0ICkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDEsIDE2ICkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDIsICA4ICkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDMsICAwICkgKQorCisjZGVmaW5lIEZUX1BFRUtfVUxPTkcoIHAgKSAgRlRfVUlOVDMyKCBGVF9CWVRFX1UzMiggcCwgMCwgMjQgKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAxLCAxNiApIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDIsICA4ICkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMywgIDAgKSApCisKKyNkZWZpbmUgRlRfUEVFS19PRkYzKCBwICkgIEZUX0lOVDMyKCBGVF9CWVRFX1UzMiggcCwgMCwgMTYgKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMSwgIDggKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMiwgIDAgKSApCisKKyNkZWZpbmUgRlRfUEVFS19VT0ZGMyggcCApICBGVF9VSU5UMzIoIEZUX0JZVEVfVTMyKCBwLCAwLCAxNiApIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDEsICA4ICkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMiwgIDAgKSApCisKKyNkZWZpbmUgRlRfUEVFS19TSE9SVF9MRSggcCApICBGVF9JTlQxNiggRlRfQllURV9VMTYoIHAsIDEsIDggKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMTYoIHAsIDAsIDAgKSApCisKKyNkZWZpbmUgRlRfUEVFS19VU0hPUlRfTEUoIHAgKSAgRlRfVUlOVDE2KCBGVF9CWVRFX1UxNiggcCwgMSwgOCApIHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UxNiggcCwgMCwgMCApICkKKworI2RlZmluZSBGVF9QRUVLX0xPTkdfTEUoIHAgKSAgRlRfSU5UMzIoIEZUX0JZVEVfVTMyKCBwLCAzLCAyNCApIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAyLCAxNiApIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAxLCAgOCApIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAwLCAgMCApICkKKworI2RlZmluZSBGVF9QRUVLX1VMT05HX0xFKCBwICkgIEZUX1VJTlQzMiggRlRfQllURV9VMzIoIHAsIDMsIDI0ICkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMiwgMTYgKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAxLCAgOCApIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDAsICAwICkgKQorCisjZGVmaW5lIEZUX1BFRUtfT0ZGM19MRSggcCApICBGVF9JTlQzMiggRlRfQllURV9VMzIoIHAsIDIsIDE2ICkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDEsICA4ICkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDAsICAwICkgKQorCisjZGVmaW5lIEZUX1BFRUtfVU9GRjNfTEUoIHAgKSAgRlRfVUlOVDMyKCBGVF9CWVRFX1UzMiggcCwgMiwgMTYgKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAxLCAgOCApIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDAsICAwICkgKQorCisKKyNkZWZpbmUgRlRfTkVYVF9DSEFSKCBidWZmZXIgKSAgICAgICBcCisgICAgICAgICAgKCAoc2lnbmVkIGNoYXIpKmJ1ZmZlcisrICkKKworI2RlZmluZSBGVF9ORVhUX0JZVEUoIGJ1ZmZlciApICAgICAgICAgXAorICAgICAgICAgICggKHVuc2lnbmVkIGNoYXIpKmJ1ZmZlcisrICkKKworI2RlZmluZSBGVF9ORVhUX1NIT1JUKCBidWZmZXIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICggKHNob3J0KSggYnVmZmVyICs9IDIsIEZUX1BFRUtfU0hPUlQoIGJ1ZmZlciAtIDIgKSApICkKKworI2RlZmluZSBGVF9ORVhUX1VTSE9SVCggYnVmZmVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoICh1bnNpZ25lZCBzaG9ydCkoIGJ1ZmZlciArPSAyLCBGVF9QRUVLX1VTSE9SVCggYnVmZmVyIC0gMiApICkgKQorCisjZGVmaW5lIEZUX05FWFRfT0ZGMyggYnVmZmVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICggKGxvbmcpKCBidWZmZXIgKz0gMywgRlRfUEVFS19PRkYzKCBidWZmZXIgLSAzICkgKSApCisKKyNkZWZpbmUgRlRfTkVYVF9VT0ZGMyggYnVmZmVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICggKHVuc2lnbmVkIGxvbmcpKCBidWZmZXIgKz0gMywgRlRfUEVFS19VT0ZGMyggYnVmZmVyIC0gMyApICkgKQorCisjZGVmaW5lIEZUX05FWFRfTE9ORyggYnVmZmVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICggKGxvbmcpKCBidWZmZXIgKz0gNCwgRlRfUEVFS19MT05HKCBidWZmZXIgLSA0ICkgKSApCisKKyNkZWZpbmUgRlRfTkVYVF9VTE9ORyggYnVmZmVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICggKHVuc2lnbmVkIGxvbmcpKCBidWZmZXIgKz0gNCwgRlRfUEVFS19VTE9ORyggYnVmZmVyIC0gNCApICkgKQorCisKKyNkZWZpbmUgRlRfTkVYVF9TSE9SVF9MRSggYnVmZmVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoIChzaG9ydCkoIGJ1ZmZlciArPSAyLCBGVF9QRUVLX1NIT1JUX0xFKCBidWZmZXIgLSAyICkgKSApCisKKyNkZWZpbmUgRlRfTkVYVF9VU0hPUlRfTEUoIGJ1ZmZlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKCAodW5zaWduZWQgc2hvcnQpKCBidWZmZXIgKz0gMiwgRlRfUEVFS19VU0hPUlRfTEUoIGJ1ZmZlciAtIDIgKSApICkKKworI2RlZmluZSBGVF9ORVhUX09GRjNfTEUoIGJ1ZmZlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoIChsb25nKSggYnVmZmVyICs9IDMsIEZUX1BFRUtfT0ZGM19MRSggYnVmZmVyIC0gMyApICkgKQorCisjZGVmaW5lIEZUX05FWFRfVU9GRjNfTEUoIGJ1ZmZlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSggYnVmZmVyICs9IDMsIEZUX1BFRUtfVU9GRjNfTEUoIGJ1ZmZlciAtIDMgKSApICkKKworI2RlZmluZSBGVF9ORVhUX0xPTkdfTEUoIGJ1ZmZlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoIChsb25nKSggYnVmZmVyICs9IDQsIEZUX1BFRUtfTE9OR19MRSggYnVmZmVyIC0gNCApICkgKQorCisjZGVmaW5lIEZUX05FWFRfVUxPTkdfTEUoIGJ1ZmZlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSggYnVmZmVyICs9IDQsIEZUX1BFRUtfVUxPTkdfTEUoIGJ1ZmZlciAtIDQgKSApICkKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRWFjaCBHRVRfeHh4eCgpIG1hY3JvIHVzZXMgYW4gaW1wbGljaXQgYHN0cmVhbScgdmFyaWFibGUuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmIDAKKyNkZWZpbmUgRlRfR0VUX01BQ1JPKCB0eXBlICkgICAgRlRfTkVYVF8gIyMgdHlwZSAoIHN0cmVhbS0+Y3Vyc29yICkKKworI2RlZmluZSBGVF9HRVRfQ0hBUigpICAgICAgIEZUX0dFVF9NQUNSTyggQ0hBUiApCisjZGVmaW5lIEZUX0dFVF9CWVRFKCkgICAgICAgRlRfR0VUX01BQ1JPKCBCWVRFICkKKyNkZWZpbmUgRlRfR0VUX1NIT1JUKCkgICAgICBGVF9HRVRfTUFDUk8oIFNIT1JUICkKKyNkZWZpbmUgRlRfR0VUX1VTSE9SVCgpICAgICBGVF9HRVRfTUFDUk8oIFVTSE9SVCApCisjZGVmaW5lIEZUX0dFVF9PRkYzKCkgICAgICAgRlRfR0VUX01BQ1JPKCBPRkYzICkKKyNkZWZpbmUgRlRfR0VUX1VPRkYzKCkgICAgICBGVF9HRVRfTUFDUk8oIFVPRkYzICkKKyNkZWZpbmUgRlRfR0VUX0xPTkcoKSAgICAgICBGVF9HRVRfTUFDUk8oIExPTkcgKQorI2RlZmluZSBGVF9HRVRfVUxPTkcoKSAgICAgIEZUX0dFVF9NQUNSTyggVUxPTkcgKQorI2RlZmluZSBGVF9HRVRfVEFHNCgpICAgICAgIEZUX0dFVF9NQUNSTyggVUxPTkcgKQorCisjZGVmaW5lIEZUX0dFVF9TSE9SVF9MRSgpICAgRlRfR0VUX01BQ1JPKCBTSE9SVF9MRSApCisjZGVmaW5lIEZUX0dFVF9VU0hPUlRfTEUoKSAgRlRfR0VUX01BQ1JPKCBVU0hPUlRfTEUgKQorI2RlZmluZSBGVF9HRVRfTE9OR19MRSgpICAgIEZUX0dFVF9NQUNSTyggTE9OR19MRSApCisjZGVmaW5lIEZUX0dFVF9VTE9OR19MRSgpICAgRlRfR0VUX01BQ1JPKCBVTE9OR19MRSApCisKKyNlbHNlCisjZGVmaW5lIEZUX0dFVF9NQUNSTyggZnVuYywgdHlwZSApICAgICAgICAoICh0eXBlKWZ1bmMoIHN0cmVhbSApICkKKworI2RlZmluZSBGVF9HRVRfQ0hBUigpICAgICAgIEZUX0dFVF9NQUNSTyggRlRfU3RyZWFtX0dldENoYXIsIEZUX0NoYXIgKQorI2RlZmluZSBGVF9HRVRfQllURSgpICAgICAgIEZUX0dFVF9NQUNSTyggRlRfU3RyZWFtX0dldENoYXIsIEZUX0J5dGUgKQorI2RlZmluZSBGVF9HRVRfU0hPUlQoKSAgICAgIEZUX0dFVF9NQUNSTyggRlRfU3RyZWFtX0dldFVTaG9ydCwgRlRfU2hvcnQgKQorI2RlZmluZSBGVF9HRVRfVVNIT1JUKCkgICAgIEZUX0dFVF9NQUNSTyggRlRfU3RyZWFtX0dldFVTaG9ydCwgRlRfVVNob3J0ICkKKyNkZWZpbmUgRlRfR0VUX09GRjMoKSAgICAgICBGVF9HRVRfTUFDUk8oIEZUX1N0cmVhbV9HZXRVT2Zmc2V0LCBGVF9Mb25nICkKKyNkZWZpbmUgRlRfR0VUX1VPRkYzKCkgICAgICBGVF9HRVRfTUFDUk8oIEZUX1N0cmVhbV9HZXRVT2Zmc2V0LCBGVF9VTG9uZyApCisjZGVmaW5lIEZUX0dFVF9MT05HKCkgICAgICAgRlRfR0VUX01BQ1JPKCBGVF9TdHJlYW1fR2V0VUxvbmcsIEZUX0xvbmcgKQorI2RlZmluZSBGVF9HRVRfVUxPTkcoKSAgICAgIEZUX0dFVF9NQUNSTyggRlRfU3RyZWFtX0dldFVMb25nLCBGVF9VTG9uZyApCisjZGVmaW5lIEZUX0dFVF9UQUc0KCkgICAgICAgRlRfR0VUX01BQ1JPKCBGVF9TdHJlYW1fR2V0VUxvbmcsIEZUX1VMb25nICkKKworI2RlZmluZSBGVF9HRVRfU0hPUlRfTEUoKSAgIEZUX0dFVF9NQUNSTyggRlRfU3RyZWFtX0dldFVTaG9ydExFLCBGVF9TaG9ydCApCisjZGVmaW5lIEZUX0dFVF9VU0hPUlRfTEUoKSAgRlRfR0VUX01BQ1JPKCBGVF9TdHJlYW1fR2V0VVNob3J0TEUsIEZUX1VTaG9ydCApCisjZGVmaW5lIEZUX0dFVF9MT05HX0xFKCkgICAgRlRfR0VUX01BQ1JPKCBGVF9TdHJlYW1fR2V0VUxvbmdMRSwgRlRfTG9uZyApCisjZGVmaW5lIEZUX0dFVF9VTE9OR19MRSgpICAgRlRfR0VUX01BQ1JPKCBGVF9TdHJlYW1fR2V0VUxvbmdMRSwgRlRfVUxvbmcgKQorI2VuZGlmCisKKyNkZWZpbmUgRlRfUkVBRF9NQUNSTyggZnVuYywgdHlwZSwgdmFyICkgICAgICAgIFwKKyAgICAgICAgICAoIHZhciA9ICh0eXBlKWZ1bmMoIHN0cmVhbSwgJmVycm9yICksIFwKKyAgICAgICAgICAgIGVycm9yICE9IEZUX0Vycl9PayApCisKKyNkZWZpbmUgRlRfUkVBRF9CWVRFKCB2YXIgKSAgICAgICBGVF9SRUFEX01BQ1JPKCBGVF9TdHJlYW1fUmVhZENoYXIsIEZUX0J5dGUsIHZhciApCisjZGVmaW5lIEZUX1JFQURfQ0hBUiggdmFyICkgICAgICAgRlRfUkVBRF9NQUNSTyggRlRfU3RyZWFtX1JlYWRDaGFyLCBGVF9DaGFyLCB2YXIgKQorI2RlZmluZSBGVF9SRUFEX1NIT1JUKCB2YXIgKSAgICAgIEZUX1JFQURfTUFDUk8oIEZUX1N0cmVhbV9SZWFkVVNob3J0LCBGVF9TaG9ydCwgdmFyICkKKyNkZWZpbmUgRlRfUkVBRF9VU0hPUlQoIHZhciApICAgICBGVF9SRUFEX01BQ1JPKCBGVF9TdHJlYW1fUmVhZFVTaG9ydCwgRlRfVVNob3J0LCB2YXIgKQorI2RlZmluZSBGVF9SRUFEX09GRjMoIHZhciApICAgICAgIEZUX1JFQURfTUFDUk8oIEZUX1N0cmVhbV9SZWFkVU9mZnNldCwgRlRfTG9uZywgdmFyICkKKyNkZWZpbmUgRlRfUkVBRF9VT0ZGMyggdmFyICkgICAgICBGVF9SRUFEX01BQ1JPKCBGVF9TdHJlYW1fUmVhZFVPZmZzZXQsIEZUX1VMb25nLCB2YXIgKQorI2RlZmluZSBGVF9SRUFEX0xPTkcoIHZhciApICAgICAgIEZUX1JFQURfTUFDUk8oIEZUX1N0cmVhbV9SZWFkVUxvbmcsIEZUX0xvbmcsIHZhciApCisjZGVmaW5lIEZUX1JFQURfVUxPTkcoIHZhciApICAgICAgRlRfUkVBRF9NQUNSTyggRlRfU3RyZWFtX1JlYWRVTG9uZywgRlRfVUxvbmcsIHZhciApCisKKyNkZWZpbmUgRlRfUkVBRF9TSE9SVF9MRSggdmFyICkgICBGVF9SRUFEX01BQ1JPKCBGVF9TdHJlYW1fUmVhZFVTaG9ydExFLCBGVF9TaG9ydCwgdmFyICkKKyNkZWZpbmUgRlRfUkVBRF9VU0hPUlRfTEUoIHZhciApICBGVF9SRUFEX01BQ1JPKCBGVF9TdHJlYW1fUmVhZFVTaG9ydExFLCBGVF9VU2hvcnQsIHZhciApCisjZGVmaW5lIEZUX1JFQURfTE9OR19MRSggdmFyICkgICAgRlRfUkVBRF9NQUNSTyggRlRfU3RyZWFtX1JlYWRVTG9uZ0xFLCBGVF9Mb25nLCB2YXIgKQorI2RlZmluZSBGVF9SRUFEX1VMT05HX0xFKCB2YXIgKSAgIEZUX1JFQURfTUFDUk8oIEZUX1N0cmVhbV9SZWFkVUxvbmdMRSwgRlRfVUxvbmcsIHZhciApCisKKworI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX05PX0RFRkFVTFRfU1lTVEVNCisKKyAgLyogaW5pdGlhbGl6ZSBhIHN0cmVhbSBmb3IgcmVhZGluZyBhIHJlZ3VsYXIgc3lzdGVtIHN0cmVhbSAqLworICBGVF9CQVNFKCBGVF9FcnJvciApCisgIEZUX1N0cmVhbV9PcGVuKCBGVF9TdHJlYW0gICAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIGZpbGVwYXRobmFtZSApOworCisjZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9OT19ERUZBVUxUX1NZU1RFTSAqLworCisKKyAgLyogY3JlYXRlIGEgbmV3IChpbnB1dCkgc3RyZWFtIGZyb20gYW4gRlRfT3Blbl9BcmdzIHN0cnVjdHVyZSAqLworICBGVF9CQVNFKCBGVF9FcnJvciApCisgIEZUX1N0cmVhbV9OZXcoIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksCisgICAgICAgICAgICAgICAgIGNvbnN0IEZUX09wZW5fQXJncyogIGFyZ3MsCisgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgICAgICAgKmFzdHJlYW0gKTsKKworICAvKiBmcmVlIGEgc3RyZWFtICovCisgIEZUX0JBU0UoIHZvaWQgKQorICBGVF9TdHJlYW1fRnJlZSggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGV4dGVybmFsICk7CisKKyAgLyogaW5pdGlhbGl6ZSBhIHN0cmVhbSBmb3IgcmVhZGluZyBpbi1tZW1vcnkgZGF0YSAqLworICBGVF9CQVNFKCB2b2lkICkKKyAgRlRfU3RyZWFtX09wZW5NZW1vcnkoIEZUX1N0cmVhbSAgICAgICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9CeXRlKiAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICBzaXplICk7CisKKyAgLyogY2xvc2UgYSBzdHJlYW0gKGRvZXMgbm90IGRlc3Ryb3kgdGhlIHN0cmVhbSBzdHJ1Y3R1cmUpICovCisgIEZUX0JBU0UoIHZvaWQgKQorICBGVF9TdHJlYW1fQ2xvc2UoIEZUX1N0cmVhbSAgc3RyZWFtICk7CisKKworICAvKiBzZWVrIHdpdGhpbiBhIHN0cmVhbS4gcG9zaXRpb24gaXMgcmVsYXRpdmUgdG8gc3RhcnQgb2Ygc3RyZWFtICovCisgIEZUX0JBU0UoIEZUX0Vycm9yICkKKyAgRlRfU3RyZWFtX1NlZWsoIEZUX1N0cmVhbSAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBwb3MgKTsKKworICAvKiBza2lwIGJ5dGVzIGluIGEgc3RyZWFtICovCisgIEZUX0JBU0UoIEZUX0Vycm9yICkKKyAgRlRfU3RyZWFtX1NraXAoIEZUX1N0cmVhbSAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBkaXN0YW5jZSApOworCisgIC8qIHJldHVybiBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbiAqLworICBGVF9CQVNFKCBGVF9VTG9uZyApCisgIEZUX1N0cmVhbV9Qb3MoIEZUX1N0cmVhbSAgc3RyZWFtICk7CisKKyAgLyogcmVhZCBieXRlcyBmcm9tIGEgc3RyZWFtIGludG8gYSB1c2VyLWFsbG9jYXRlZCBidWZmZXIsIHJldHVybnMgYW4gKi8KKyAgLyogZXJyb3IgaWYgbm90IGFsbCBieXRlcyBjb3VsZCBiZSByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfQkFTRSggRlRfRXJyb3IgKQorICBGVF9TdHJlYW1fUmVhZCggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKTsKKworICAvKiByZWFkIGJ5dGVzIGZyb20gYSBzdHJlYW0gYXQgYSBnaXZlbiBwb3NpdGlvbiAqLworICBGVF9CQVNFKCBGVF9FcnJvciApCisgIEZUX1N0cmVhbV9SZWFkQXQoIEZUX1N0cmVhbSAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHBvcywKKyAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKTsKKworICAvKiB0cnkgdG8gcmVhZCBieXRlcyBhdCB0aGUgZW5kIG9mIGEgc3RyZWFtOyByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzICovCisgIC8qIHJlYWxseSBhdmFpbGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfQkFTRSggRlRfVUxvbmcgKQorICBGVF9TdHJlYW1fVHJ5UmVhZCggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKTsKKworICAvKiBFbnRlciBhIGZyYW1lIG9mIGBjb3VudCcgY29uc2VjdXRpdmUgYnl0ZXMgaW4gYSBzdHJlYW0uICBSZXR1cm5zIGFuICovCisgIC8qIGVycm9yIGlmIHRoZSBmcmFtZSBjb3VsZCBub3QgYmUgcmVhZC9hY2Nlc3NlZC4gIFRoZSBjYWxsZXIgY2FuIHVzZSAgKi8KKyAgLyogdGhlIEZUX1N0cmVhbV9HZXRfWFhYIGZ1bmN0aW9ucyB0byByZXRyaWV2ZSBmcmFtZSBkYXRhIHdpdGhvdXQgICAgICAqLworICAvKiBlcnJvciBjaGVja3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogWW91IG11c3QgX2Fsd2F5c18gY2FsbCBGVF9TdHJlYW1fRXhpdEZyYW1lKCkgb25jZSB5b3UgaGF2ZSBlbnRlcmVkICAqLworICAvKiBhIHN0cmVhbSBmcmFtZSEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgRlRfQkFTRSggRlRfRXJyb3IgKQorICBGVF9TdHJlYW1fRW50ZXJGcmFtZSggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGNvdW50ICk7CisKKyAgLyogZXhpdCBhIHN0cmVhbSBmcmFtZSAqLworICBGVF9CQVNFKCB2b2lkICkKKyAgRlRfU3RyZWFtX0V4aXRGcmFtZSggRlRfU3RyZWFtICBzdHJlYW0gKTsKKworICAvKiBFeHRyYWN0IGEgc3RyZWFtIGZyYW1lLiAgSWYgdGhlIHN0cmVhbSBpcyBkaXNrLWJhc2VkLCBhIGhlYXAgYmxvY2sgKi8KKyAgLyogaXMgYWxsb2NhdGVkIGFuZCB0aGUgZnJhbWUgYnl0ZXMgYXJlIHJlYWQgaW50byBpdC4gIElmIHRoZSBzdHJlYW0gICovCisgIC8qIGlzIG1lbW9yeS1iYXNlZCwgdGhpcyBmdW5jdGlvbiBzaW1wbHkgc2V0IGEgcG9pbnRlciB0byB0aGUgZGF0YS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVXNlZnVsIHRvIG9wdGltaXplIGFjY2VzcyB0byBtZW1vcnktYmFzZWQgc3RyZWFtcyB0cmFuc3BhcmVudGx5LiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBBbGwgZXh0cmFjdGVkIGZyYW1lcyBtdXN0IGJlIGBmcmVlZCcgd2l0aCBhIGNhbGwgdG8gdGhlIGZ1bmN0aW9uICAgKi8KKyAgLyogRlRfU3RyZWFtX1JlbGVhc2VGcmFtZSgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9CQVNFKCBGVF9FcnJvciApCisgIEZUX1N0cmVhbV9FeHRyYWN0RnJhbWUoIEZUX1N0cmVhbSAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogIHBieXRlcyApOworCisgIC8qIHJlbGVhc2UgYW4gZXh0cmFjdCBmcmFtZSAoc2VlIEZUX1N0cmVhbV9FeHRyYWN0RnJhbWUpICovCisgIEZUX0JBU0UoIHZvaWQgKQorICBGVF9TdHJlYW1fUmVsZWFzZUZyYW1lKCBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSoqICBwYnl0ZXMgKTsKKworICAvKiByZWFkIGEgYnl0ZSBmcm9tIGFuIGVudGVyZWQgZnJhbWUgKi8KKyAgRlRfQkFTRSggRlRfQ2hhciApCisgIEZUX1N0cmVhbV9HZXRDaGFyKCBGVF9TdHJlYW0gIHN0cmVhbSApOworCisgIC8qIHJlYWQgYSAxNi1iaXQgYmlnLWVuZGlhbiB1bnNpZ25lZCBpbnRlZ2VyIGZyb20gYW4gZW50ZXJlZCBmcmFtZSAqLworICBGVF9CQVNFKCBGVF9VU2hvcnQgKQorICBGVF9TdHJlYW1fR2V0VVNob3J0KCBGVF9TdHJlYW0gIHN0cmVhbSApOworCisgIC8qIHJlYWQgYSAyNC1iaXQgYmlnLWVuZGlhbiB1bnNpZ25lZCBpbnRlZ2VyIGZyb20gYW4gZW50ZXJlZCBmcmFtZSAqLworICBGVF9CQVNFKCBGVF9VTG9uZyApCisgIEZUX1N0cmVhbV9HZXRVT2Zmc2V0KCBGVF9TdHJlYW0gIHN0cmVhbSApOworCisgIC8qIHJlYWQgYSAzMi1iaXQgYmlnLWVuZGlhbiB1bnNpZ25lZCBpbnRlZ2VyIGZyb20gYW4gZW50ZXJlZCBmcmFtZSAqLworICBGVF9CQVNFKCBGVF9VTG9uZyApCisgIEZUX1N0cmVhbV9HZXRVTG9uZyggRlRfU3RyZWFtICBzdHJlYW0gKTsKKworICAvKiByZWFkIGEgMTYtYml0IGxpdHRsZS1lbmRpYW4gdW5zaWduZWQgaW50ZWdlciBmcm9tIGFuIGVudGVyZWQgZnJhbWUgKi8KKyAgRlRfQkFTRSggRlRfVVNob3J0ICkKKyAgRlRfU3RyZWFtX0dldFVTaG9ydExFKCBGVF9TdHJlYW0gIHN0cmVhbSApOworCisgIC8qIHJlYWQgYSAzMi1iaXQgbGl0dGxlLWVuZGlhbiB1bnNpZ25lZCBpbnRlZ2VyIGZyb20gYW4gZW50ZXJlZCBmcmFtZSAqLworICBGVF9CQVNFKCBGVF9VTG9uZyApCisgIEZUX1N0cmVhbV9HZXRVTG9uZ0xFKCBGVF9TdHJlYW0gIHN0cmVhbSApOworCisKKyAgLyogcmVhZCBhIGJ5dGUgZnJvbSBhIHN0cmVhbSAqLworICBGVF9CQVNFKCBGVF9DaGFyICkKKyAgRlRfU3RyZWFtX1JlYWRDaGFyKCBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogIGVycm9yICk7CisKKyAgLyogcmVhZCBhIDE2LWJpdCBiaWctZW5kaWFuIHVuc2lnbmVkIGludGVnZXIgZnJvbSBhIHN0cmVhbSAqLworICBGVF9CQVNFKCBGVF9VU2hvcnQgKQorICBGVF9TdHJlYW1fUmVhZFVTaG9ydCggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogIGVycm9yICk7CisKKyAgLyogcmVhZCBhIDI0LWJpdCBiaWctZW5kaWFuIHVuc2lnbmVkIGludGVnZXIgZnJvbSBhIHN0cmVhbSAqLworICBGVF9CQVNFKCBGVF9VTG9uZyApCisgIEZUX1N0cmVhbV9SZWFkVU9mZnNldCggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IqICBlcnJvciApOworCisgIC8qIHJlYWQgYSAzMi1iaXQgYmlnLWVuZGlhbiBpbnRlZ2VyIGZyb20gYSBzdHJlYW0gKi8KKyAgRlRfQkFTRSggRlRfVUxvbmcgKQorICBGVF9TdHJlYW1fUmVhZFVMb25nKCBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IqICBlcnJvciApOworCisgIC8qIHJlYWQgYSAxNi1iaXQgbGl0dGxlLWVuZGlhbiB1bnNpZ25lZCBpbnRlZ2VyIGZyb20gYSBzdHJlYW0gKi8KKyAgRlRfQkFTRSggRlRfVVNob3J0ICkKKyAgRlRfU3RyZWFtX1JlYWRVU2hvcnRMRSggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IgKTsKKworICAvKiByZWFkIGEgMzItYml0IGxpdHRsZS1lbmRpYW4gdW5zaWduZWQgaW50ZWdlciBmcm9tIGEgc3RyZWFtICovCisgIEZUX0JBU0UoIEZUX1VMb25nICkKKyAgRlRfU3RyZWFtX1JlYWRVTG9uZ0xFKCBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogIGVycm9yICk7CisKKyAgLyogUmVhZCBhIHN0cnVjdHVyZSBmcm9tIGEgc3RyZWFtLiAgVGhlIHN0cnVjdHVyZSBtdXN0IGJlIGRlc2NyaWJlZCAqLworICAvKiBieSBhbiBhcnJheSBvZiBGVF9GcmFtZV9GaWVsZCByZWNvcmRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0JBU0UoIEZUX0Vycm9yICkKKyAgRlRfU3RyZWFtX1JlYWRGaWVsZHMoIEZUX1N0cmVhbSAgICAgICAgICAgICAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfRnJhbWVfRmllbGQqICBmaWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSApOworCisKKyNkZWZpbmUgRlRfU1RSRUFNX1BPUygpICAgICAgICAgICBcCisgICAgICAgICAgRlRfU3RyZWFtX1Bvcyggc3RyZWFtICkKKworI2RlZmluZSBGVF9TVFJFQU1fU0VFSyggcG9zaXRpb24gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgRlRfU0VUX0VSUk9SKCBGVF9TdHJlYW1fU2Vlayggc3RyZWFtLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUxvbmcpKHBvc2l0aW9uKSApICkKKworI2RlZmluZSBGVF9TVFJFQU1fU0tJUCggZGlzdGFuY2UgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBGVF9TRVRfRVJST1IoIEZUX1N0cmVhbV9Ta2lwKCBzdHJlYW0sICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKGRpc3RhbmNlKSApICkKKworI2RlZmluZSBGVF9TVFJFQU1fUkVBRCggYnVmZmVyLCBjb3VudCApICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgRlRfU0VUX0VSUk9SKCBGVF9TdHJlYW1fUmVhZCggc3RyZWFtLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQnl0ZSopKGJ1ZmZlciksICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VTG9uZykoY291bnQpICkgKQorCisjZGVmaW5lIEZUX1NUUkVBTV9SRUFEX0FUKCBwb3NpdGlvbiwgYnVmZmVyLCBjb3VudCApICAgICAgICAgICAgXAorICAgICAgICAgIEZUX1NFVF9FUlJPUiggRlRfU3RyZWFtX1JlYWRBdCggc3RyZWFtLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VTG9uZykocG9zaXRpb24pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQnl0ZSopYnVmZmVyLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VMb25nKShjb3VudCkgKSApCisKKyNkZWZpbmUgRlRfU1RSRUFNX1JFQURfRklFTERTKCBmaWVsZHMsIG9iamVjdCApICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgRlRfU0VUX0VSUk9SKCBGVF9TdHJlYW1fUmVhZEZpZWxkcyggc3RyZWFtLCBmaWVsZHMsIG9iamVjdCApICkKKworCisjZGVmaW5lIEZUX0ZSQU1FX0VOVEVSKCBzaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEZUX1NFVF9FUlJPUiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEZUX0RFQlVHX0lOTkVSKCBGVF9TdHJlYW1fRW50ZXJGcmFtZSggc3RyZWFtLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VTG9uZykoc2l6ZSkgKSApICkKKworI2RlZmluZSBGVF9GUkFNRV9FWElUKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBGVF9ERUJVR19JTk5FUiggRlRfU3RyZWFtX0V4aXRGcmFtZSggc3RyZWFtICkgKQorCisjZGVmaW5lIEZUX0ZSQU1FX0VYVFJBQ1QoIHNpemUsIGJ5dGVzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgRlRfU0VUX0VSUk9SKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBGVF9ERUJVR19JTk5FUiggRlRfU3RyZWFtX0V4dHJhY3RGcmFtZSggc3RyZWFtLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VMb25nKShzaXplKSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0J5dGUqKikmKGJ5dGVzKSApICkgKQorCisjZGVmaW5lIEZUX0ZSQU1FX1JFTEVBU0UoIGJ5dGVzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBGVF9ERUJVR19JTk5FUiggRlRfU3RyZWFtX1JlbGVhc2VGcmFtZSggc3RyZWFtLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQnl0ZSoqKSYoYnl0ZXMpICkgKQorCisKK0ZUX0VORF9IRUFERVIKKworI2VuZGlmIC8qIF9fRlRTVFJFQU1fSF9fICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR0cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMjhkMjEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaApAQCAtMCwwICsxLDE1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnR0cmFjZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRyYWNpbmcgaGFuZGxpbmcgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAyLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qIGRlZmluaXRpb25zIG9mIHRyYWNlIGxldmVscyBmb3IgRnJlZVR5cGUgMiAqLworCisgIC8qIHRoZSBmaXJzdCBsZXZlbCBtdXN0IGFsd2F5cyBiZSBgdHJhY2VfYW55JyAqLworRlRfVFJBQ0VfREVGKCBhbnkgKQorCisgIC8qIGJhc2UgY29tcG9uZW50cyAqLworRlRfVFJBQ0VfREVGKCBjYWxjICkgICAgICAvKiBjYWxjdWxhdGlvbnMgICAgICAgICAgICAoZnRjYWxjLmMpICAgKi8KK0ZUX1RSQUNFX0RFRiggbWVtb3J5ICkgICAgLyogbWVtb3J5IG1hbmFnZXIgICAgICAgICAgKGZ0b2Jqcy5jKSAgICovCitGVF9UUkFDRV9ERUYoIHN0cmVhbSApICAgIC8qIHN0cmVhbSBtYW5hZ2VyICAgICAgICAgIChmdHN0cmVhbS5jKSAqLworRlRfVFJBQ0VfREVGKCBpbyApICAgICAgICAvKiBpL28gaW50ZXJmYWNlICAgICAgICAgICAoZnRzeXN0ZW0uYykgKi8KK0ZUX1RSQUNFX0RFRiggbGlzdCApICAgICAgLyogbGlzdCBtYW5hZ2VtZW50ICAgICAgICAgKGZ0bGlzdC5jKSAgICovCitGVF9UUkFDRV9ERUYoIGluaXQgKSAgICAgIC8qIGluaXRpYWxpemF0aW9uICAgICAgICAgIChmdGluaXQuYykgICAqLworRlRfVFJBQ0VfREVGKCBvYmpzICkgICAgICAvKiBiYXNlIG9iamVjdHMgICAgICAgICAgICAoZnRvYmpzLmMpICAgKi8KK0ZUX1RSQUNFX0RFRiggb3V0bGluZSApICAgLyogb3V0bGluZSBtYW5hZ2VtZW50ICAgICAgKGZ0b3V0bG4uYykgICovCitGVF9UUkFDRV9ERUYoIGdseXBoICkgICAgIC8qIGdseXBoIG1hbmFnZW1lbnQgICAgICAgIChmdGdseXBoLmMpICAqLworRlRfVFJBQ0VfREVGKCBnbG9hZGVyICkgICAvKiBnbHlwaCBsb2FkZXIgICAgICAgICAgICAoZnRnbG9hZHIuYykgKi8KKworRlRfVFJBQ0VfREVGKCByYXN0ZXIgKSAgICAvKiBtb25vY2hyb21lIHJhc3Rlcml6ZXIgICAoZnRyYXN0ZXIuYykgKi8KK0ZUX1RSQUNFX0RFRiggc21vb3RoICkgICAgLyogYW50aS1hbGlhc2luZyByYXN0ZXIgICAgKGZ0Z3JheXMuYykgICovCitGVF9UUkFDRV9ERUYoIG1tICkgICAgICAgIC8qIE1NIGludGVyZmFjZSAgICAgICAgICAgIChmdG1tLmMpICAgICAqLworRlRfVFJBQ0VfREVGKCByYWNjZXNzICkgICAvKiByZXNvdXJjZSBmb3JrIGFjY2Vzc29yICAoZnRyZm9yay5jKSAgKi8KK0ZUX1RSQUNFX0RFRiggc3ludGggKSAgICAgLyogYm9sZC9zbGFudCBzeW50aGVzaXplciAgKGZ0c3ludGguYykgICovCitGVF9UUkFDRV9ERUYoIGJpdG1hcCApICAgIC8qIGJpdG1hcCBjaGVja3N1bSAgICAgICAgIChmdG9ianMuYykgICAqLworCisgIC8qIENhY2hlIHN1Yi1zeXN0ZW0gKi8KK0ZUX1RSQUNFX0RFRiggY2FjaGUgKSAgICAgLyogY2FjaGUgc3ViLXN5c3RlbSAgICAgICAgKGZ0Y2FjaGUuYywgZXRjLikgKi8KKworICAvKiBTRk5UIGRyaXZlciBjb21wb25lbnRzICovCitGVF9UUkFDRV9ERUYoIHNmZHJpdmVyICkgIC8qIFNGTlQgZm9udCBkcml2ZXIgICAgICAgIChzZmRyaXZlci5jKSAqLworRlRfVFJBQ0VfREVGKCBzZm9ianMgKSAgICAvKiBTRk5UIG9iamVjdCBoYW5kbGVyICAgICAoc2ZvYmpzLmMpICAgKi8KK0ZUX1RSQUNFX0RFRiggdHRjbWFwICkgICAgLyogY2hhcm1hcCBoYW5kbGVyICAgICAgICAgKHR0Y21hcC5jKSAgICovCitGVF9UUkFDRV9ERUYoIHR0a2VybiApICAgIC8qIGtlcm5pbmcgaGFuZGxlciAgICAgICAgICh0dGtlcm4uYykgICAqLworRlRfVFJBQ0VfREVGKCB0dGxvYWQgKSAgICAvKiBiYXNpYyBUcnVlVHlwZSB0YWJsZXMgICAodHRsb2FkLmMpICAgKi8KK0ZUX1RSQUNFX0RFRiggdHRtdHggKSAgICAgLyogbWV0cmljcy1yZWxhdGVkIHRhYmxlcyAgKHR0bXR4LmMpICAgICovCitGVF9UUkFDRV9ERUYoIHR0cG9zdCApICAgIC8qIFBTIHRhYmxlIHByb2Nlc3NpbmcgICAgICh0dHBvc3QuYykgICAqLworRlRfVFJBQ0VfREVGKCB0dHNiaXQgKSAgICAvKiBUcnVlVHlwZSBzYml0IGhhbmRsaW5nICAodHRzYml0LmMpICAgKi8KK0ZUX1RSQUNFX0RFRiggdHRiZGYgKSAgICAgLyogVHJ1ZVR5cGUgZW1iZWRkZWQgQkRGICAgKHR0YmRmLmMpICAgICovCisKKyAgLyogVHJ1ZVR5cGUgZHJpdmVyIGNvbXBvbmVudHMgKi8KK0ZUX1RSQUNFX0RFRiggdHRkcml2ZXIgKSAgLyogVFQgZm9udCBkcml2ZXIgICAgICAgICAgKHR0ZHJpdmVyLmMpICovCitGVF9UUkFDRV9ERUYoIHR0Z2xvYWQgKSAgIC8qIFRUIGdseXBoIGxvYWRlciAgICAgICAgICh0dGdsb2FkLmMpICAqLworRlRfVFJBQ0VfREVGKCB0dGludGVycCApICAvKiBieXRlY29kZSBpbnRlcnByZXRlciAgICAodHRpbnRlcnAuYykgKi8KK0ZUX1RSQUNFX0RFRiggdHRvYmpzICkgICAgLyogVFQgb2JqZWN0cyBtYW5hZ2VyICAgICAgKHR0b2Jqcy5jKSAgICovCitGVF9UUkFDRV9ERUYoIHR0cGxvYWQgKSAgIC8qIFRUIGRhdGEvcHJvZ3JhbSBsb2FkZXIgICh0dHBsb2FkLmMpICAqLworRlRfVFJBQ0VfREVGKCB0dGd4dmFyICkgICAvKiBUcnVlVHlwZSBHWCB2YXIgaGFuZGxlciAodHRneHZhci5jKSAgKi8KKworICAvKiBUeXBlIDEgZHJpdmVyIGNvbXBvbmVudHMgKi8KK0ZUX1RSQUNFX0RFRiggdDFhZm0gKQorRlRfVFJBQ0VfREVGKCB0MWRyaXZlciApCitGVF9UUkFDRV9ERUYoIHQxZ2xvYWQgKQorRlRfVFJBQ0VfREVGKCB0MWhpbnQgKQorRlRfVFJBQ0VfREVGKCB0MWxvYWQgKQorRlRfVFJBQ0VfREVGKCB0MW9ianMgKQorRlRfVFJBQ0VfREVGKCB0MXBhcnNlICkKKworICAvKiBQb3N0U2NyaXB0IGhlbHBlciBtb2R1bGUgYHBzYXV4JyAqLworRlRfVFJBQ0VfREVGKCB0MWRlY29kZSApCitGVF9UUkFDRV9ERUYoIHBzb2JqcyApCitGVF9UUkFDRV9ERUYoIHBzY29udiApCisKKyAgLyogUG9zdFNjcmlwdCBoaW50aW5nIG1vZHVsZSBgcHNoaW50ZXInICovCitGVF9UUkFDRV9ERUYoIHBzaHJlYyApCitGVF9UUkFDRV9ERUYoIHBzaGFsZ28xICkKK0ZUX1RSQUNFX0RFRiggcHNoYWxnbzIgKQorCisgIC8qIFR5cGUgMiBkcml2ZXIgY29tcG9uZW50cyAqLworRlRfVFJBQ0VfREVGKCBjZmZkcml2ZXIgKQorRlRfVFJBQ0VfREVGKCBjZmZnbG9hZCApCitGVF9UUkFDRV9ERUYoIGNmZmxvYWQgKQorRlRfVFJBQ0VfREVGKCBjZmZvYmpzICkKK0ZUX1RSQUNFX0RFRiggY2ZmcGFyc2UgKQorCitGVF9UUkFDRV9ERUYoIGNmMmJsdWVzICkKK0ZUX1RSQUNFX0RFRiggY2YyaGludHMgKQorRlRfVFJBQ0VfREVGKCBjZjJpbnRlcnAgKQorCisgIC8qIFR5cGUgNDIgZHJpdmVyIGNvbXBvbmVudCAqLworRlRfVFJBQ0VfREVGKCB0NDIgKQorCisgIC8qIENJRCBkcml2ZXIgY29tcG9uZW50cyAqLworRlRfVFJBQ0VfREVGKCBjaWRhZm0gKQorRlRfVFJBQ0VfREVGKCBjaWRkcml2ZXIgKQorRlRfVFJBQ0VfREVGKCBjaWRnbG9hZCApCitGVF9UUkFDRV9ERUYoIGNpZGxvYWQgKQorRlRfVFJBQ0VfREVGKCBjaWRvYmpzICkKK0ZUX1RSQUNFX0RFRiggY2lkcGFyc2UgKQorCisgIC8qIFdpbmRvd3MgZm9udCBjb21wb25lbnQgKi8KK0ZUX1RSQUNFX0RFRiggd2luZm50ICkKKworICAvKiBQQ0YgZm9udCBjb21wb25lbnRzICovCitGVF9UUkFDRV9ERUYoIHBjZmRyaXZlciApCitGVF9UUkFDRV9ERUYoIHBjZnJlYWQgKQorCisgIC8qIEJERiBmb250IGNvbXBvbmVudHMgKi8KK0ZUX1RSQUNFX0RFRiggYmRmZHJpdmVyICkKK0ZUX1RSQUNFX0RFRiggYmRmbGliICkKKworICAvKiBQRlIgZm9udCBjb21wb25lbnQgKi8KK0ZUX1RSQUNFX0RFRiggcGZyICkKKworICAvKiBPcGVuVHlwZSB2YWxpZGF0aW9uIGNvbXBvbmVudHMgKi8KK0ZUX1RSQUNFX0RFRiggb3R2bW9kdWxlICkKK0ZUX1RSQUNFX0RFRiggb3R2Y29tbW9uICkKK0ZUX1RSQUNFX0RFRiggb3R2YmFzZSApCitGVF9UUkFDRV9ERUYoIG90dmdkZWYgKQorRlRfVFJBQ0VfREVGKCBvdHZncG9zICkKK0ZUX1RSQUNFX0RFRiggb3R2Z3N1YiApCitGVF9UUkFDRV9ERUYoIG90dmpzdGYgKQorRlRfVFJBQ0VfREVGKCBvdHZtYXRoICkKKworICAvKiBUcnVlVHlwZUdYL0FBVCB2YWxpZGF0aW9uIGNvbXBvbmVudHMgKi8KK0ZUX1RSQUNFX0RFRiggZ3h2bW9kdWxlICkKK0ZUX1RSQUNFX0RFRiggZ3h2Y29tbW9uICkKK0ZUX1RSQUNFX0RFRiggZ3h2ZmVhdCApCitGVF9UUkFDRV9ERUYoIGd4dm1vcnQgKQorRlRfVFJBQ0VfREVGKCBneHZtb3J4ICkKK0ZUX1RSQUNFX0RFRiggZ3h2YnNsbiApCitGVF9UUkFDRV9ERUYoIGd4dmp1c3QgKQorRlRfVFJBQ0VfREVGKCBneHZrZXJuICkKK0ZUX1RSQUNFX0RFRiggZ3h2b3BiZCApCitGVF9UUkFDRV9ERUYoIGd4dnRyYWsgKQorRlRfVFJBQ0VfREVGKCBneHZwcm9wICkKK0ZUX1RSQUNFX0RFRiggZ3h2bGNhciApCisKKyAgLyogYXV0b2ZpdCBjb21wb25lbnRzICovCitGVF9UUkFDRV9ERUYoIGFmbW9kdWxlICkKK0ZUX1RSQUNFX0RFRiggYWZoaW50cyApCitGVF9UUkFDRV9ERUYoIGFmY2prICkKK0ZUX1RSQUNFX0RFRiggYWZsYXRpbiApCitGVF9UUkFDRV9ERUYoIGFmbGF0aW4yICkKK0ZUX1RSQUNFX0RFRiggYWZ3YXJwICkKK0ZUX1RSQUNFX0RFRiggYWZoYXJmYnV6eiApCitGVF9UUkFDRV9ERUYoIGFmZ2xvYmFsICkKKworLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dmFsaWQuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR2YWxpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZGE2ZWUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dmFsaWQuaApAQCAtMCwwICsxLDE1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZnR2YWxpZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWVUeXBlIHZhbGlkYXRpb24gc3VwcG9ydCAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDA0LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fRlRWQUxJRF9IX18KKyNkZWZpbmUgX19GVFZBTElEX0hfXworCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0ggICAvKiBmb3IgZnRfc2V0am1wIGFuZCBmdF9sb25nam1wICovCisKKworRlRfQkVHSU5fSEVBREVSCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICBWIEEgTCBJIEQgQSBUIEkgTyBOICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyogaGFuZGxlIHRvIGEgdmFsaWRhdGlvbiBvYmplY3QgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgRlRfVmFsaWRhdG9yUmVjXyB2b2xhdGlsZSogIEZUX1ZhbGlkYXRvcjsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlcmUgYXJlIHRocmVlIGRpc3RpbmN0IHZhbGlkYXRpb24gbGV2ZWxzIGRlZmluZWQgaGVyZTogICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBGVF9WQUxJREFURV9ERUZBVUxUIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBBIHRhYmxlIHRoYXQgcGFzc2VzIHRoaXMgdmFsaWRhdGlvbiBsZXZlbCBjYW4gYmUgdXNlZCByZWxpYWJseSBieSAgICovCisgIC8qICAgRnJlZVR5cGUuICBJdCBnZW5lcmFsbHkgbWVhbnMgdGhhdCBhbGwgb2Zmc2V0cyBoYXZlIGJlZW4gY2hlY2tlZCB0byAqLworICAvKiAgIHByZXZlbnQgb3V0LW9mLWJvdW5kIHJlYWRzLCB0aGF0IGFycmF5IGNvdW50cyBhcmUgY29ycmVjdCwgZXRjLiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEZUX1ZBTElEQVRFX1RJR0hUIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEEgdGFibGUgdGhhdCBwYXNzZXMgdGhpcyB2YWxpZGF0aW9uIGxldmVsIGNhbiBiZSB1c2VkIHJlbGlhYmx5IGFuZCAgKi8KKyAgLyogICBkb2Vzbid0IGNvbnRhaW4gaW52YWxpZCBkYXRhLiAgRm9yIGV4YW1wbGUsIGEgY2hhcm1hcCB0YWJsZSB0aGF0ICAgICovCisgIC8qICAgcmV0dXJucyBpbnZhbGlkIGdseXBoIGluZGljZXMgd2lsbCBub3QgcGFzcywgZXZlbiB0aG91Z2ggaXQgY2FuICAgICAqLworICAvKiAgIGJlIHVzZWQgd2l0aCBGcmVlVHlwZSBpbiBkZWZhdWx0IG1vZGUgKHRoZSBsaWJyYXJ5IHdpbGwgc2ltcGx5ICAgICAgKi8KKyAgLyogICByZXR1cm4gYW4gZXJyb3IgbGF0ZXIgd2hlbiB0cnlpbmcgdG8gbG9hZCB0aGUgZ2x5cGgpLiAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEl0IGFsc28gY2hlY2tzIHRoYXQgZmllbGRzIHdoaWNoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAyLCA0LCBvciA4LCAgKi8KKyAgLyogICBkb24ndCBoYXZlIGluY29ycmVjdCB2YWx1ZXMsIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBGVF9WQUxJREFURV9QQVJBTk9JRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBPbmx5IGZvciBmb250IGRlYnVnZ2luZy4gIENoZWNrcyB0aGF0IGEgdGFibGUgZm9sbG93cyB0aGUgICAgICAgICAgICovCisgIC8qICAgc3BlY2lmaWNhdGlvbiBieSAxMDAlLiAgVmVyeSBmZXcgZm9udHMgd2lsbCBiZSBhYmxlIHRvIHBhc3MgdGhpcyAgICAqLworICAvKiAgIGxldmVsIGFueXdheSBidXQgaXQgY2FuIGJlIHVzZWZ1bCBmb3IgY2VydGFpbiB0b29scyBsaWtlIGZvbnQgICAgICAgKi8KKyAgLyogICBlZGl0b3JzL2NvbnZlcnRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIGVudW0gIEZUX1ZhbGlkYXRpb25MZXZlbF8KKyAgeworICAgIEZUX1ZBTElEQVRFX0RFRkFVTFQgPSAwLAorICAgIEZUX1ZBTElEQVRFX1RJR0hULAorICAgIEZUX1ZBTElEQVRFX1BBUkFOT0lECisKKyAgfSBGVF9WYWxpZGF0aW9uTGV2ZWw7CisKKworI2lmIGRlZmluZWQoIF9NU0NfVkVSICkgICAgICAvKiBWaXN1YWwgQysrIChhbmQgSW50ZWwgQysrKSAqLworICAvKiBXZSBkaXNhYmxlIHRoZSB3YXJuaW5nIGBzdHJ1Y3R1cmUgd2FzIHBhZGRlZCBkdWUgdG8gICAqLworICAvKiBfX2RlY2xzcGVjKGFsaWduKCkpJyBpbiBvcmRlciB0byBjb21waWxlIGNsZWFubHkgd2l0aCAqLworICAvKiB0aGUgbWF4aW11bSBsZXZlbCBvZiB3YXJuaW5ncy4gICAgICAgICAgICAgICAgICAgICAgICAqLworI3ByYWdtYSB3YXJuaW5nKCBwdXNoICkKKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQzMjQgKQorI2VuZGlmIC8qIF9NU0NfVkVSICovCisKKyAgLyogdmFsaWRhdG9yIHN0cnVjdHVyZSAqLworICB0eXBlZGVmIHN0cnVjdCAgRlRfVmFsaWRhdG9yUmVjXworICB7CisgICAgZnRfam1wX2J1ZiAgICAgICAgICBqdW1wX2J1ZmZlcjsgLyogdXNlZCBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nICAgICAgKi8KKworICAgIGNvbnN0IEZUX0J5dGUqICAgICAgYmFzZTsgICAgICAgIC8qIGFkZHJlc3Mgb2YgdGFibGUgaW4gbWVtb3J5ICAgICAgICovCisgICAgY29uc3QgRlRfQnl0ZSogICAgICBsaW1pdDsgICAgICAgLyogYGJhc2UnICsgc2l6ZW9mKHRhYmxlKSBpbiBtZW1vcnkgKi8KKyAgICBGVF9WYWxpZGF0aW9uTGV2ZWwgIGxldmVsOyAgICAgICAvKiB2YWxpZGF0aW9uIGxldmVsICAgICAgICAgICAgICAgICAqLworICAgIEZUX0Vycm9yICAgICAgICAgICAgZXJyb3I7ICAgICAgIC8qIGVycm9yIHJldHVybmVkLiAwIG1lYW5zIHN1Y2Nlc3MgICovCisKKyAgfSBGVF9WYWxpZGF0b3JSZWM7CisKKyNpZiBkZWZpbmVkKCBfTVNDX1ZFUiApCisjcHJhZ21hIHdhcm5pbmcoIHBvcCApCisjZW5kaWYKKworI2RlZmluZSBGVF9WQUxJREFUT1IoIHggKSAgKCAoRlRfVmFsaWRhdG9yKSggeCApICkKKworCisgIEZUX0JBU0UoIHZvaWQgKQorICBmdF92YWxpZGF0b3JfaW5pdCggRlRfVmFsaWRhdG9yICAgICAgICB2YWxpZCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICAgICAgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICBGVF9WYWxpZGF0aW9uTGV2ZWwgIGxldmVsICk7CisKKyAgLyogRG8gbm90IHVzZSB0aGlzLiBJdCdzIGJyb2tlbiBhbmQgd2lsbCBjYXVzZSB5b3VyIHZhbGlkYXRvciB0byBjcmFzaCAqLworICAvKiBpZiB5b3UgcnVuIGl0IG9uIGFuIGludmFsaWQgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0JBU0UoIEZUX0ludCApCisgIGZ0X3ZhbGlkYXRvcl9ydW4oIEZUX1ZhbGlkYXRvciAgdmFsaWQgKTsKKworICAvKiBTZXRzIHRoZSBlcnJvciBmaWVsZCBpbiBhIHZhbGlkYXRvciwgdGhlbiBjYWxscyBgbG9uZ2ptcCcgdG8gcmV0dXJuICovCisgIC8qIHRvIGhpZ2gtbGV2ZWwgY2FsbGVyLiAgVXNpbmcgYHNldGptcC9sb25nam1wJyBhdm9pZHMgbWFueSBzdHVwaWQgICAgKi8KKyAgLyogZXJyb3IgY2hlY2tzIHdpdGhpbiB0aGUgdmFsaWRhdGlvbiByb3V0aW5lcy4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0JBU0UoIHZvaWQgKQorICBmdF92YWxpZGF0b3JfZXJyb3IoIEZUX1ZhbGlkYXRvciAgdmFsaWQsCisgICAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IgICAgICBlcnJvciApOworCisKKyAgLyogQ2FsbHMgZnRfdmFsaWRhdGVfZXJyb3IuICBBc3N1bWVzIHRoYXQgdGhlIGB2YWxpZCcgbG9jYWwgdmFyaWFibGUgKi8KKyAgLyogaG9sZHMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHZhbGlkYXRvciBvYmplY3QuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfSU5WQUxJRCggX2Vycm9yICkgIEZUX0lOVkFMSURfKCBfZXJyb3IgKQorI2RlZmluZSBGVF9JTlZBTElEXyggX2Vycm9yICkgXAorICAgICAgICAgIGZ0X3ZhbGlkYXRvcl9lcnJvciggdmFsaWQsIEZUX1RIUk9XKCBfZXJyb3IgKSApCisKKyAgLyogY2FsbGVkIHdoZW4gYSBicm9rZW4gdGFibGUgaXMgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgRlRfSU5WQUxJRF9UT09fU0hPUlQgXAorICAgICAgICAgIEZUX0lOVkFMSUQoIEludmFsaWRfVGFibGUgKQorCisgIC8qIGNhbGxlZCB3aGVuIGFuIGludmFsaWQgb2Zmc2V0IGlzIGRldGVjdGVkICovCisjZGVmaW5lIEZUX0lOVkFMSURfT0ZGU0VUIFwKKyAgICAgICAgICBGVF9JTlZBTElEKCBJbnZhbGlkX09mZnNldCApCisKKyAgLyogY2FsbGVkIHdoZW4gYW4gaW52YWxpZCBmb3JtYXQvdmFsdWUgaXMgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgRlRfSU5WQUxJRF9GT1JNQVQgXAorICAgICAgICAgIEZUX0lOVkFMSUQoIEludmFsaWRfVGFibGUgKQorCisgIC8qIGNhbGxlZCB3aGVuIGFuIGludmFsaWQgZ2x5cGggaW5kZXggaXMgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgRlRfSU5WQUxJRF9HTFlQSF9JRCBcCisgICAgICAgICAgRlRfSU5WQUxJRCggSW52YWxpZF9HbHlwaF9JbmRleCApCisKKyAgLyogY2FsbGVkIHdoZW4gYW4gaW52YWxpZCBmaWVsZCB2YWx1ZSBpcyBkZXRlY3RlZCAqLworI2RlZmluZSBGVF9JTlZBTElEX0RBVEEgXAorICAgICAgICAgIEZUX0lOVkFMSUQoIEludmFsaWRfVGFibGUgKQorCisKK0ZUX0VORF9IRUFERVIKKworI2VuZGlmIC8qIF9fRlRWQUxJRF9IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvaW50ZXJuYWwuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDljZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGludGVybmFsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbnRlcm5hbCBoZWFkZXIgZmlsZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGJ5IGBmdDJidWlsZC5oJy4gICAgICAgICAgICAgICAgICAqLworICAvKiBEbyBub3QgaW5jbHVkZSBpdCBtYW51YWxseSEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNkZWZpbmUgRlRfSU5URVJOQUxfT0JKRUNUU19IICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KKyNkZWZpbmUgRlRfSU5URVJOQUxfUElDX0ggICAgICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdHBpYy5oPgorI2RlZmluZSBGVF9JTlRFUk5BTF9TVFJFQU1fSCAgICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CisjZGVmaW5lIEZUX0lOVEVSTkFMX01FTU9SWV9IICAgICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRtZW1vcnkuaD4KKyNkZWZpbmUgRlRfSU5URVJOQUxfREVCVUdfSCAgICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CisjZGVmaW5lIEZUX0lOVEVSTkFMX0NBTENfSCAgICAgICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRjYWxjLmg+CisjZGVmaW5lIEZUX0lOVEVSTkFMX0RSSVZFUl9IICAgICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkcml2ZXIuaD4KKyNkZWZpbmUgRlRfSU5URVJOQUxfVFJBQ0VfSCAgICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdHRyYWNlLmg+CisjZGVmaW5lIEZUX0lOVEVSTkFMX0dMWVBIX0xPQURFUl9IICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRnbG9hZHIuaD4KKyNkZWZpbmUgRlRfSU5URVJOQUxfU0ZOVF9IICAgICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZm50Lmg+CisjZGVmaW5lIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSCAgICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2Lmg+CisjZGVmaW5lIEZUX0lOVEVSTkFMX1JGT1JLX0ggICAgICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRyZm9yay5oPgorI2RlZmluZSBGVF9JTlRFUk5BTF9WQUxJREFURV9IICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL2Z0dmFsaWQuaD4KKworI2RlZmluZSBGVF9JTlRFUk5BTF9UUlVFVFlQRV9UWVBFU19IICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaD4KKyNkZWZpbmUgRlRfSU5URVJOQUxfVFlQRTFfVFlQRVNfSCAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC90MXR5cGVzLmg+CisKKyNkZWZpbmUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSCAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oPgorI2RlZmluZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0hJTlRTX0ggICAgPGZyZWV0eXBlL2ludGVybmFsL3BzaGludHMuaD4KKyNkZWZpbmUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9HTE9CQUxTX0ggIDxmcmVldHlwZS9pbnRlcm5hbC9wc2dsb2JhbC5oPgorCisjZGVmaW5lIEZUX0lOVEVSTkFMX0FVVE9ISU5UX0ggICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvYXV0b2hpbnQuaD4KKworCisjaWYgZGVmaW5lZCggX01TQ19WRVIgKSAgICAgIC8qIFZpc3VhbCBDKysgKGFuZCBJbnRlbCBDKyspICovCisKKyAgLyogV2UgZGlzYWJsZSB0aGUgd2FybmluZyBgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBjb25zdGFudCcgaGVyZSAqLworICAvKiBpbiBvcmRlciB0byBjb21waWxlIGNsZWFubHkgd2l0aCB0aGUgbWF4aW11bSBsZXZlbCBvZiB3YXJuaW5ncy4gICovCisgIC8qIEluIHBhcnRpY3VsYXIsIHRoZSB3YXJuaW5nIGNvbXBsYWlucyBhYm91dCBzdHVmZiBsaWtlIGB3aGlsZSgwKScgKi8KKyAgLyogd2hpY2ggaXMgdmVyeSB1c2VmdWwgaW4gbWFjcm8gZGVmaW5pdGlvbnMuICBUaGVyZSBpcyBubyBiZW5lZml0ICAqLworICAvKiBpbiBoYXZpbmcgaXQgZW5hYmxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MTI3ICkKKworI2VuZGlmIC8qIF9NU0NfVkVSICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM1Zjc4NAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaApAQCAtMCwwICsxLDg3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcHNhdXguaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEF1eGlsaWFyeSBmdW5jdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlcyByZWxhdGVkIHRvIFBvc3RTY3JpcHQgZm9udHMgICovCisvKiAgICAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX1BTQVVYX0hfXworI2RlZmluZSBfX1BTQVVYX0hfXworCisKKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICisjaW5jbHVkZSBGVF9JTlRFUk5BTF9UWVBFMV9UWVBFU19ICisjaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSAorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKyAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCisgIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICB0eXBlZGVmIHN0cnVjdCBQU19UYWJsZVJlY18qICAgICAgICAgICAgICBQU19UYWJsZTsKKyAgdHlwZWRlZiBjb25zdCBzdHJ1Y3QgUFNfVGFibGVfRnVuY3NSZWNfKiAgUFNfVGFibGVfRnVuY3M7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQU19UYWJsZV9GdW5jc1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHNldCBvZiBmdW5jdGlvbiBwb2ludGVycyB0byBtYW5hZ2UgUFNfVGFibGUgb2JqZWN0cy4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0YWJsZV9pbml0ICAgIDo6IFVzZWQgdG8gaW5pdGlhbGl6ZSBhIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHRhYmxlX2RvbmUgICAgOjogRmluYWxpemVzIHJlc3AuIGRlc3Ryb3kgYSBnaXZlbiB0YWJsZS4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdGFibGVfYWRkICAgICA6OiBBZGRzIGEgbmV3IG9iamVjdCB0byBhIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0YWJsZV9yZWxlYXNlIDo6IFJlbGVhc2VzIHRhYmxlIGRhdGEsIHRoZW4gZmluYWxpemVzIGl0LiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBQU19UYWJsZV9GdW5jc1JlY18KKyAgeworICAgIEZUX0Vycm9yCisgICAgKCppbml0KSggUFNfVGFibGUgICB0YWJsZSwKKyAgICAgICAgICAgICBGVF9JbnQgICAgIGNvdW50LAorICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICk7CisKKyAgICB2b2lkCisgICAgKCpkb25lKSggUFNfVGFibGUgIHRhYmxlICk7CisKKyAgICBGVF9FcnJvcgorICAgICgqYWRkKSggUFNfVGFibGUgIHRhYmxlLAorICAgICAgICAgICAgRlRfSW50ICAgIGlkeCwKKyAgICAgICAgICAgIHZvaWQqICAgICBvYmplY3QsCisgICAgICAgICAgICBGVF9VSW50ICAgbGVuZ3RoICk7CisKKyAgICB2b2lkCisgICAgKCpyZWxlYXNlKSggUFNfVGFibGUgIHRhYmxlICk7CisKKyAgfSBQU19UYWJsZV9GdW5jc1JlYzsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBTX1RhYmxlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgUFNfVGFibGUgaXMgYSBzaW1wbGUgb2JqZWN0IHVzZWQgdG8gc3RvcmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyBpbiAqLworICAvKiAgICBhIHNpbmdsZSBtZW1vcnkgYmxvY2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBibG9jayAgICAgOjogVGhlIGFkZHJlc3MgaW4gbWVtb3J5IG9mIHRoZSBncm93aGVhcCdzIGJsb2NrLiAgVGhpcyAgKi8KKyAgLyogICAgICAgICAgICAgICAgIGNhbiBjaGFuZ2UgYmV0d2VlbiB0d28gb2JqZWN0IGFkZHMsIGR1ZSB0byAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICByZWFsbG9jYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY3Vyc29yICAgIDo6IFRoZSBjdXJyZW50IHRvcCBvZiB0aGUgZ3JvdyBoZWFwIHdpdGhpbiBpdHMgYmxvY2suICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjYXBhY2l0eSAgOjogVGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgaGVhcCBibG9jay4gIEluY3JlbWVudHMgYnkgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgIDFrQnl0ZSBjaHVua3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBpbml0ICAgICAgOjogU2V0IHRvIDB4REVBREJFRUYgaWYgYGVsZW1lbnRzJyBhbmQgYGxlbmd0aHMnIGhhdmUgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgIGJlZW4gYWxsb2NhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhfZWxlbXMgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRhYmxlLiAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9lbGVtcyA6OiBUaGUgY3VycmVudCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGFibGUuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZWxlbWVudHMgIDo6IEEgdGFibGUgb2YgZWxlbWVudCBhZGRyZXNzZXMgd2l0aGluIHRoZSBibG9jay4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsZW5ndGhzICAgOjogQSB0YWJsZSBvZiBlbGVtZW50IHNpemVzIHdpdGhpbiB0aGUgYmxvY2suICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1lbW9yeSAgICA6OiBUaGUgb2JqZWN0IHVzZWQgZm9yIG1lbW9yeSBvcGVyYXRpb25zICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgKGFsbG9jL3JlYWxsb2MpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZ1bmNzICAgICA6OiBBIHRhYmxlIG9mIG1ldGhvZCBwb2ludGVycyBmb3IgdGhpcyBvYmplY3QuICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFBTX1RhYmxlUmVjXworICB7CisgICAgRlRfQnl0ZSogICAgICAgICAgIGJsb2NrOyAgICAgICAgICAvKiBjdXJyZW50IG1lbW9yeSBibG9jayAgICAgICAgICAgKi8KKyAgICBGVF9PZmZzZXQgICAgICAgICAgY3Vyc29yOyAgICAgICAgIC8qIGN1cnJlbnQgY3Vyc29yIGluIG1lbW9yeSBibG9jayAqLworICAgIEZUX09mZnNldCAgICAgICAgICBjYXBhY2l0eTsgICAgICAgLyogY3VycmVudCBzaXplIG9mIG1lbW9yeSBibG9jayAgICovCisgICAgRlRfVUxvbmcgICAgICAgICAgIGluaXQ7CisKKyAgICBGVF9JbnQgICAgICAgICAgICAgbWF4X2VsZW1zOworICAgIEZUX0ludCAgICAgICAgICAgICBudW1fZWxlbXM7CisgICAgRlRfQnl0ZSoqICAgICAgICAgIGVsZW1lbnRzOyAgICAgICAvKiBhZGRyZXNzZXMgb2YgdGFibGUgZWxlbWVudHMgKi8KKyAgICBGVF9VSW50KiAgICAgICAgICAgbGVuZ3RoczsgICAgICAgIC8qIGxlbmd0aHMgb2YgdGFibGUgZWxlbWVudHMgICAqLworCisgICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeTsKKyAgICBQU19UYWJsZV9GdW5jc1JlYyAgZnVuY3M7CisKKyAgfSBQU19UYWJsZVJlYzsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCisgIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgVDEgRklFTERTICYgVE9LRU5TICAgICAgICAgICAgICAgICAgICAgICoqKioqLworICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIHR5cGVkZWYgc3RydWN0IFBTX1BhcnNlclJlY18qICBQU19QYXJzZXI7CisKKyAgdHlwZWRlZiBzdHJ1Y3QgVDFfVG9rZW5SZWNfKiAgIFQxX1Rva2VuOworCisgIHR5cGVkZWYgc3RydWN0IFQxX0ZpZWxkUmVjXyogICBUMV9GaWVsZDsKKworCisgIC8qIHNpbXBsZSBlbnVtZXJhdGlvbiB0eXBlIHVzZWQgdG8gaWRlbnRpZnkgdG9rZW4gdHlwZXMgKi8KKyAgdHlwZWRlZiBlbnVtICBUMV9Ub2tlblR5cGVfCisgIHsKKyAgICBUMV9UT0tFTl9UWVBFX05PTkUgPSAwLAorICAgIFQxX1RPS0VOX1RZUEVfQU5ZLAorICAgIFQxX1RPS0VOX1RZUEVfU1RSSU5HLAorICAgIFQxX1RPS0VOX1RZUEVfQVJSQVksCisgICAgVDFfVE9LRU5fVFlQRV9LRVksIC8qIGFrYSBgbmFtZScgKi8KKworICAgIC8qIGRvIG5vdCByZW1vdmUgKi8KKyAgICBUMV9UT0tFTl9UWVBFX01BWAorCisgIH0gVDFfVG9rZW5UeXBlOworCisKKyAgLyogYSBzaW1wbGUgc3RydWN0dXJlIHVzZWQgdG8gaWRlbnRpZnkgdG9rZW5zICovCisgIHR5cGVkZWYgc3RydWN0ICBUMV9Ub2tlblJlY18KKyAgeworICAgIEZUX0J5dGUqICAgICAgc3RhcnQ7ICAgLyogZmlyc3QgY2hhcmFjdGVyIG9mIHRva2VuIGluIGlucHV0IHN0cmVhbSAqLworICAgIEZUX0J5dGUqICAgICAgbGltaXQ7ICAgLyogZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSB0b2tlbiAgICAgICAgICAqLworICAgIFQxX1Rva2VuVHlwZSAgdHlwZTsgICAgLyogdHlwZSBvZiB0b2tlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIH0gVDFfVG9rZW5SZWM7CisKKworICAvKiBlbnVtZXJhdGlvbiB0eXBlIHVzZWQgdG8gaWRlbnRpZnkgb2JqZWN0IGZpZWxkcyAqLworICB0eXBlZGVmIGVudW0gIFQxX0ZpZWxkVHlwZV8KKyAgeworICAgIFQxX0ZJRUxEX1RZUEVfTk9ORSA9IDAsCisgICAgVDFfRklFTERfVFlQRV9CT09MLAorICAgIFQxX0ZJRUxEX1RZUEVfSU5URUdFUiwKKyAgICBUMV9GSUVMRF9UWVBFX0ZJWEVELAorICAgIFQxX0ZJRUxEX1RZUEVfRklYRURfMTAwMCwKKyAgICBUMV9GSUVMRF9UWVBFX1NUUklORywKKyAgICBUMV9GSUVMRF9UWVBFX0tFWSwKKyAgICBUMV9GSUVMRF9UWVBFX0JCT1gsCisgICAgVDFfRklFTERfVFlQRV9NTV9CQk9YLAorICAgIFQxX0ZJRUxEX1RZUEVfSU5URUdFUl9BUlJBWSwKKyAgICBUMV9GSUVMRF9UWVBFX0ZJWEVEX0FSUkFZLAorICAgIFQxX0ZJRUxEX1RZUEVfQ0FMTEJBQ0ssCisKKyAgICAvKiBkbyBub3QgcmVtb3ZlICovCisgICAgVDFfRklFTERfVFlQRV9NQVgKKworICB9IFQxX0ZpZWxkVHlwZTsKKworCisgIHR5cGVkZWYgZW51bSAgVDFfRmllbGRMb2NhdGlvbl8KKyAgeworICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX0NJRF9JTkZPLAorICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX0ZPTlRfRElDVCwKKyAgICBUMV9GSUVMRF9MT0NBVElPTl9GT05UX0VYVFJBLAorICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX0ZPTlRfSU5GTywKKyAgICBUMV9GSUVMRF9MT0NBVElPTl9QUklWQVRFLAorICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX0JCT1gsCisgICAgVDFfRklFTERfTE9DQVRJT05fTE9BREVSLAorICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX0ZBQ0UsCisgICAgVDFfRklFTERfTE9DQVRJT05fQkxFTkQsCisKKyAgICAvKiBkbyBub3QgcmVtb3ZlICovCisgICAgVDFfRklFTERfTE9DQVRJT05fTUFYCisKKyAgfSBUMV9GaWVsZExvY2F0aW9uOworCisKKyAgdHlwZWRlZiB2b2lkCisgICgqVDFfRmllbGRfUGFyc2VGdW5jKSggRlRfRmFjZSAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBwYXJzZXIgKTsKKworCisgIC8qIHN0cnVjdHVyZSB0eXBlIHVzZWQgdG8gbW9kZWwgb2JqZWN0IGZpZWxkcyAqLworICB0eXBlZGVmIHN0cnVjdCAgVDFfRmllbGRSZWNfCisgIHsKKyAgICBjb25zdCBjaGFyKiAgICAgICAgIGlkZW50OyAgICAgICAgLyogZmllbGQgaWRlbnRpZmllciAgICAgICAgICAgICAgICovCisgICAgVDFfRmllbGRMb2NhdGlvbiAgICBsb2NhdGlvbjsKKyAgICBUMV9GaWVsZFR5cGUgICAgICAgIHR5cGU7ICAgICAgICAgLyogdHlwZSBvZiBmaWVsZCAgICAgICAgICAgICAgICAgICovCisgICAgVDFfRmllbGRfUGFyc2VGdW5jICByZWFkZXI7CisgICAgRlRfVUludCAgICAgICAgICAgICBvZmZzZXQ7ICAgICAgIC8qIG9mZnNldCBvZiBmaWVsZCBpbiBvYmplY3QgICAgICAqLworICAgIEZUX0J5dGUgICAgICAgICAgICAgc2l6ZTsgICAgICAgICAvKiBzaXplIG9mIGZpZWxkIGluIGJ5dGVzICAgICAgICAgKi8KKyAgICBGVF9VSW50ICAgICAgICAgICAgIGFycmF5X21heDsgICAgLyogbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgZm9yICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFycmF5ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIEZUX1VJbnQgICAgICAgICAgICAgY291bnRfb2Zmc2V0OyAvKiBvZmZzZXQgb2YgZWxlbWVudCBjb3VudCBmb3IgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXJyYXlzOyBtdXN0IG5vdCBiZSB6ZXJvIGlmIGluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZSAtLSBpbiBvdGhlciB3b3JkcywgYSAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBgbnVtX0ZPTycgZWxlbWVudCBtdXN0IG5vdCAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgdGhlIHVzZWQgc3RydWN0dXJlIGlmIHdlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBhcnNlIGEgYEZPTycgYXJyYXkgICAgICAgICAgICAqLworICAgIEZUX1VJbnQgICAgICAgICAgICAgZGljdDsgICAgICAgICAvKiB3aGVyZSB3ZSBleHBlY3QgaXQgICAgICAgICAgICAgKi8KKyAgfSBUMV9GaWVsZFJlYzsKKworI2RlZmluZSBUMV9GSUVMRF9ESUNUX0ZPTlRESUNUICggMSA8PCAwICkgLyogYWxzbyBGb250SW5mbyBhbmQgRkRBcnJheSAqLworI2RlZmluZSBUMV9GSUVMRF9ESUNUX1BSSVZBVEUgICggMSA8PCAxICkKKworCisKKyNkZWZpbmUgVDFfTkVXX1NJTVBMRV9GSUVMRCggX2lkZW50LCBfdHlwZSwgX2ZuYW1lLCBfZGljdCApIFwKKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9pZGVudCwgVDFDT0RFLCBfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEZUX0ZJRUxEX09GRlNFVCggX2ZuYW1lICksICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEZUX0ZJRUxEX1NJWkUoIF9mbmFtZSApLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9kaWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9LAorCisjZGVmaW5lIFQxX05FV19DQUxMQkFDS19GSUVMRCggX2lkZW50LCBfcmVhZGVyLCBfZGljdCApIFwKKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX2lkZW50LCBUMUNPREUsIFQxX0ZJRUxEX1RZUEVfQ0FMTEJBQ0ssICAgICBcCisgICAgICAgICAgICAoVDFfRmllbGRfUGFyc2VGdW5jKV9yZWFkZXIsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfZGljdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9LAorCisjZGVmaW5lIFQxX05FV19UQUJMRV9GSUVMRCggX2lkZW50LCBfdHlwZSwgX2ZuYW1lLCBfbWF4LCBfZGljdCApIFwKKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX2lkZW50LCBUMUNPREUsIF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEZUX0ZJRUxEX09GRlNFVCggX2ZuYW1lICksICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgRlRfRklFTERfU0laRV9ERUxUQSggX2ZuYW1lICksICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfbWF4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEZUX0ZJRUxEX09GRlNFVCggbnVtXyAjIyBfZm5hbWUgKSwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX2RpY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgfSwKKworI2RlZmluZSBUMV9ORVdfVEFCTEVfRklFTEQyKCBfaWRlbnQsIF90eXBlLCBfZm5hbWUsIF9tYXgsIF9kaWN0ICkgXAorICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX2lkZW50LCBUMUNPREUsIF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgRlRfRklFTERfT0ZGU0VUKCBfZm5hbWUgKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgRlRfRklFTERfU0laRV9ERUxUQSggX2ZuYW1lICksICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX21heCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX2RpY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIH0sCisKKworI2RlZmluZSBUMV9GSUVMRF9CT09MKCBfaWRlbnQsIF9mbmFtZSwgX2RpY3QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIFQxX05FV19TSU1QTEVfRklFTEQoIF9pZGVudCwgVDFfRklFTERfVFlQRV9CT09MLCBfZm5hbWUsIF9kaWN0ICkKKworI2RlZmluZSBUMV9GSUVMRF9OVU0oIF9pZGVudCwgX2ZuYW1lLCBfZGljdCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIFQxX05FV19TSU1QTEVfRklFTEQoIF9pZGVudCwgVDFfRklFTERfVFlQRV9JTlRFR0VSLCBfZm5hbWUsIF9kaWN0ICkKKworI2RlZmluZSBUMV9GSUVMRF9GSVhFRCggX2lkZW50LCBfZm5hbWUsIF9kaWN0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBUMV9ORVdfU0lNUExFX0ZJRUxEKCBfaWRlbnQsIFQxX0ZJRUxEX1RZUEVfRklYRUQsIF9mbmFtZSwgX2RpY3QgKQorCisjZGVmaW5lIFQxX0ZJRUxEX0ZJWEVEXzEwMDAoIF9pZGVudCwgX2ZuYW1lLCBfZGljdCApICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIFQxX05FV19TSU1QTEVfRklFTEQoIF9pZGVudCwgVDFfRklFTERfVFlQRV9GSVhFRF8xMDAwLCBfZm5hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGljdCApCisKKyNkZWZpbmUgVDFfRklFTERfU1RSSU5HKCBfaWRlbnQsIF9mbmFtZSwgX2RpY3QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIFQxX05FV19TSU1QTEVfRklFTEQoIF9pZGVudCwgVDFfRklFTERfVFlQRV9TVFJJTkcsIF9mbmFtZSwgX2RpY3QgKQorCisjZGVmaW5lIFQxX0ZJRUxEX0tFWSggX2lkZW50LCBfZm5hbWUsIF9kaWN0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBUMV9ORVdfU0lNUExFX0ZJRUxEKCBfaWRlbnQsIFQxX0ZJRUxEX1RZUEVfS0VZLCBfZm5hbWUsIF9kaWN0ICkKKworI2RlZmluZSBUMV9GSUVMRF9CQk9YKCBfaWRlbnQsIF9mbmFtZSwgX2RpY3QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIFQxX05FV19TSU1QTEVfRklFTEQoIF9pZGVudCwgVDFfRklFTERfVFlQRV9CQk9YLCBfZm5hbWUsIF9kaWN0ICkKKworCisjZGVmaW5lIFQxX0ZJRUxEX05VTV9UQUJMRSggX2lkZW50LCBfZm5hbWUsIF9mbWF4LCBfZGljdCApICAgICAgICAgXAorICAgICAgICAgIFQxX05FV19UQUJMRV9GSUVMRCggX2lkZW50LCBUMV9GSUVMRF9UWVBFX0lOVEVHRVJfQVJSQVksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mbmFtZSwgX2ZtYXgsIF9kaWN0ICkKKworI2RlZmluZSBUMV9GSUVMRF9GSVhFRF9UQUJMRSggX2lkZW50LCBfZm5hbWUsIF9mbWF4LCBfZGljdCApICAgICBcCisgICAgICAgICAgVDFfTkVXX1RBQkxFX0ZJRUxEKCBfaWRlbnQsIFQxX0ZJRUxEX1RZUEVfRklYRURfQVJSQVksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mbmFtZSwgX2ZtYXgsIF9kaWN0ICkKKworI2RlZmluZSBUMV9GSUVMRF9OVU1fVEFCTEUyKCBfaWRlbnQsIF9mbmFtZSwgX2ZtYXgsIF9kaWN0ICkgICAgICAgICBcCisgICAgICAgICAgVDFfTkVXX1RBQkxFX0ZJRUxEMiggX2lkZW50LCBUMV9GSUVMRF9UWVBFX0lOVEVHRVJfQVJSQVksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZm5hbWUsIF9mbWF4LCBfZGljdCApCisKKyNkZWZpbmUgVDFfRklFTERfRklYRURfVEFCTEUyKCBfaWRlbnQsIF9mbmFtZSwgX2ZtYXgsIF9kaWN0ICkgICAgIFwKKyAgICAgICAgICBUMV9ORVdfVEFCTEVfRklFTEQyKCBfaWRlbnQsIFQxX0ZJRUxEX1RZUEVfRklYRURfQVJSQVksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZm5hbWUsIF9mbWF4LCBfZGljdCApCisKKyNkZWZpbmUgVDFfRklFTERfQ0FMTEJBQ0soIF9pZGVudCwgX25hbWUsIF9kaWN0ICkgICAgICAgXAorICAgICAgICAgIFQxX05FV19DQUxMQkFDS19GSUVMRCggX2lkZW50LCBfbmFtZSwgX2RpY3QgKQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKyAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxIFBBUlNFUiAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCisgIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgdHlwZWRlZiBjb25zdCBzdHJ1Y3QgUFNfUGFyc2VyX0Z1bmNzUmVjXyogIFBTX1BhcnNlcl9GdW5jczsKKworICB0eXBlZGVmIHN0cnVjdCAgUFNfUGFyc2VyX0Z1bmNzUmVjXworICB7CisgICAgdm9pZAorICAgICgqaW5pdCkoIFBTX1BhcnNlciAgcGFyc2VyLAorICAgICAgICAgICAgIEZUX0J5dGUqICAgYmFzZSwKKyAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0LAorICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICk7CisKKyAgICB2b2lkCisgICAgKCpkb25lKSggUFNfUGFyc2VyICBwYXJzZXIgKTsKKworICAgIHZvaWQKKyAgICAoKnNraXBfc3BhY2VzKSggUFNfUGFyc2VyICBwYXJzZXIgKTsKKyAgICB2b2lkCisgICAgKCpza2lwX1BTX3Rva2VuKSggUFNfUGFyc2VyICBwYXJzZXIgKTsKKworICAgIEZUX0xvbmcKKyAgICAoKnRvX2ludCkoIFBTX1BhcnNlciAgcGFyc2VyICk7CisgICAgRlRfRml4ZWQKKyAgICAoKnRvX2ZpeGVkKSggUFNfUGFyc2VyICBwYXJzZXIsCisgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgcG93ZXJfdGVuICk7CisKKyAgICBGVF9FcnJvcgorICAgICgqdG9fYnl0ZXMpKCBQU19QYXJzZXIgIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBieXRlcywKKyAgICAgICAgICAgICAgICAgRlRfT2Zmc2V0ICBtYXhfYnl0ZXMsCisgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgcG51bV9ieXRlcywKKyAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICBkZWxpbWl0ZXJzICk7CisKKyAgICBGVF9JbnQKKyAgICAoKnRvX2Nvb3JkX2FycmF5KSggUFNfUGFyc2VyICBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgbWF4X2Nvb3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgRlRfU2hvcnQqICBjb29yZHMgKTsKKyAgICBGVF9JbnQKKyAgICAoKnRvX2ZpeGVkX2FycmF5KSggUFNfUGFyc2VyICBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgbWF4X3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICB2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgcG93ZXJfdGVuICk7CisKKyAgICB2b2lkCisgICAgKCp0b190b2tlbikoIFBTX1BhcnNlciAgcGFyc2VyLAorICAgICAgICAgICAgICAgICBUMV9Ub2tlbiAgIHRva2VuICk7CisgICAgdm9pZAorICAgICgqdG9fdG9rZW5fYXJyYXkpKCBQU19QYXJzZXIgIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgVDFfVG9rZW4gICB0b2tlbnMsCisgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbWF4X3Rva2VucywKKyAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50KiAgICBwbnVtX3Rva2VucyApOworCisgICAgRlRfRXJyb3IKKyAgICAoKmxvYWRfZmllbGQpKCBQU19QYXJzZXIgICAgICAgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxX0ZpZWxkICBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICB2b2lkKiogICAgICAgICAgb2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgbWF4X29iamVjdHMsCisgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgIHBmbGFncyApOworCisgICAgRlRfRXJyb3IKKyAgICAoKmxvYWRfZmllbGRfdGFibGUpKCBQU19QYXJzZXIgICAgICAgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxX0ZpZWxkICBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogICAgICAgICAgb2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgbWF4X29iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgIHBmbGFncyApOworCisgIH0gUFNfUGFyc2VyX0Z1bmNzUmVjOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUFNfUGFyc2VyUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBQU19QYXJzZXIgaXMgYW4gb2JqZWN0IHVzZWQgdG8gcGFyc2UgYSBUeXBlIDEgZm9udCB2ZXJ5IHF1aWNrbHkuICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY3Vyc29yIDo6IFRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSB0ZXh0LiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBiYXNlICAgOjogU3RhcnQgb2YgdGhlIHByb2Nlc3NlZCB0ZXh0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxpbWl0ICA6OiBFbmQgb2YgdGhlIHByb2Nlc3NlZCB0ZXh0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZXJyb3IgIDo6IFRoZSBsYXN0IGVycm9yIHJldHVybmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtZW1vcnkgOjogVGhlIG9iamVjdCB1c2VkIGZvciBtZW1vcnkgb3BlcmF0aW9ucyAoYWxsb2MvcmVhbGxvYykuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZ1bmNzICA6OiBBIHRhYmxlIG9mIGZ1bmN0aW9ucyBmb3IgdGhlIHBhcnNlci4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFBTX1BhcnNlclJlY18KKyAgeworICAgIEZUX0J5dGUqICAgY3Vyc29yOworICAgIEZUX0J5dGUqICAgYmFzZTsKKyAgICBGVF9CeXRlKiAgIGxpbWl0OworICAgIEZUX0Vycm9yICAgZXJyb3I7CisgICAgRlRfTWVtb3J5ICBtZW1vcnk7CisKKyAgICBQU19QYXJzZXJfRnVuY3NSZWMgIGZ1bmNzOworCisgIH0gUFNfUGFyc2VyUmVjOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKyAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgIFQxIEJVSUxERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCisgIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICB0eXBlZGVmIHN0cnVjdCBUMV9CdWlsZGVyUmVjXyogIFQxX0J1aWxkZXI7CisKKworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqVDFfQnVpbGRlcl9DaGVja19Qb2ludHNfRnVuYykoIFQxX0J1aWxkZXIgIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIGNvdW50ICk7CisKKyAgdHlwZWRlZiB2b2lkCisgICgqVDFfQnVpbGRlcl9BZGRfUG9pbnRfRnVuYykoIFQxX0J1aWxkZXIgIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUgICAgIGZsYWcgKTsKKworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqVDFfQnVpbGRlcl9BZGRfUG9pbnQxX0Z1bmMpKCBUMV9CdWlsZGVyICBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHkgKTsKKworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqVDFfQnVpbGRlcl9BZGRfQ29udG91cl9GdW5jKSggVDFfQnVpbGRlciAgYnVpbGRlciApOworCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpUMV9CdWlsZGVyX1N0YXJ0X1BvaW50X0Z1bmMpKCBUMV9CdWlsZGVyICBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeSApOworCisgIHR5cGVkZWYgdm9pZAorICAoKlQxX0J1aWxkZXJfQ2xvc2VfQ29udG91cl9GdW5jKSggVDFfQnVpbGRlciAgYnVpbGRlciApOworCisKKyAgdHlwZWRlZiBjb25zdCBzdHJ1Y3QgVDFfQnVpbGRlcl9GdW5jc1JlY18qICBUMV9CdWlsZGVyX0Z1bmNzOworCisgIHR5cGVkZWYgc3RydWN0ICBUMV9CdWlsZGVyX0Z1bmNzUmVjXworICB7CisgICAgdm9pZAorICAgICgqaW5pdCkoIFQxX0J1aWxkZXIgICAgYnVpbGRlciwKKyAgICAgICAgICAgICBGVF9GYWNlICAgICAgIGZhY2UsCisgICAgICAgICAgICAgRlRfU2l6ZSAgICAgICBzaXplLAorICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgc2xvdCwKKyAgICAgICAgICAgICBGVF9Cb29sICAgICAgIGhpbnRpbmcgKTsKKworICAgIHZvaWQKKyAgICAoKmRvbmUpKCBUMV9CdWlsZGVyICAgYnVpbGRlciApOworCisgICAgVDFfQnVpbGRlcl9DaGVja19Qb2ludHNfRnVuYyAgIGNoZWNrX3BvaW50czsKKyAgICBUMV9CdWlsZGVyX0FkZF9Qb2ludF9GdW5jICAgICAgYWRkX3BvaW50OworICAgIFQxX0J1aWxkZXJfQWRkX1BvaW50MV9GdW5jICAgICBhZGRfcG9pbnQxOworICAgIFQxX0J1aWxkZXJfQWRkX0NvbnRvdXJfRnVuYyAgICBhZGRfY29udG91cjsKKyAgICBUMV9CdWlsZGVyX1N0YXJ0X1BvaW50X0Z1bmMgICAgc3RhcnRfcG9pbnQ7CisgICAgVDFfQnVpbGRlcl9DbG9zZV9Db250b3VyX0Z1bmMgIGNsb3NlX2NvbnRvdXI7CisKKyAgfSBUMV9CdWlsZGVyX0Z1bmNzUmVjOworCisKKyAgLyogYW4gZW51bWVyYXRpb24gdHlwZSB0byBoYW5kbGUgY2hhcnN0cmluZyBwYXJzaW5nIHN0YXRlcyAqLworICB0eXBlZGVmIGVudW0gIFQxX1BhcnNlU3RhdGVfCisgIHsKKyAgICBUMV9QYXJzZV9TdGFydCwKKyAgICBUMV9QYXJzZV9IYXZlX1dpZHRoLAorICAgIFQxX1BhcnNlX0hhdmVfTW92ZXRvLAorICAgIFQxX1BhcnNlX0hhdmVfUGF0aAorCisgIH0gVDFfUGFyc2VTdGF0ZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdHVyZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFQxX0J1aWxkZXJSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBBIHN0cnVjdHVyZSB1c2VkIGR1cmluZyBnbHlwaCBsb2FkaW5nIHRvIHN0b3JlIGl0cyBvdXRsaW5lLiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1lbW9yeSAgICAgICA6OiBUaGUgY3VycmVudCBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgICAgICAgIDo6IFRoZSBjdXJyZW50IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnbHlwaCAgICAgICAgOjogVGhlIGN1cnJlbnQgZ2x5cGggc2xvdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxvYWRlciAgICAgICA6OiBYWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYmFzZSAgICAgICAgIDo6IFRoZSBiYXNlIGdseXBoIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjdXJyZW50ICAgICAgOjogVGhlIGN1cnJlbnQgZ2x5cGggb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1heF9wb2ludHMgICA6OiBtYXhpbXVtIHBvaW50cyBpbiBidWlsZGVyIG91dGxpbmUgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4X2NvbnRvdXJzIDo6IE1heGltdW0gbnVtYmVyIG9mIGNvbnRvdXJzIGluIGJ1aWxkZXIgb3V0bGluZS4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwb3NfeCAgICAgICAgOjogVGhlIGhvcml6b250YWwgdHJhbnNsYXRpb24gKGlmIGNvbXBvc2l0ZSBnbHlwaCkuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBvc195ICAgICAgICA6OiBUaGUgdmVydGljYWwgdHJhbnNsYXRpb24gKGlmIGNvbXBvc2l0ZSBnbHlwaCkuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbGVmdF9iZWFyaW5nIDo6IFRoZSBsZWZ0IHNpZGUgYmVhcmluZyBwb2ludC4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhZHZhbmNlICAgICAgOjogVGhlIGhvcml6b250YWwgYWR2YW5jZSB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJib3ggICAgICAgICA6OiBVbnVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcGFyc2Vfc3RhdGUgIDo6IEFuIGVudW1lcmF0aW9uIHdoaWNoIGNvbnRyb2xzIHRoZSBjaGFyc3RyaW5nICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICBwYXJzaW5nIHN0YXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbG9hZF9wb2ludHMgIDo6IElmIHRoaXMgZmxhZyBpcyBub3Qgc2V0LCBubyBwb2ludHMgYXJlIGxvYWRlZC4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBub19yZWN1cnNlICAgOjogU2V0IGJ1dCBub3QgdXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1ldHJpY3Nfb25seSA6OiBBIGJvb2xlYW4gaW5kaWNhdGluZyB0aGF0IHdlIG9ubHkgd2FudCB0byBjb21wdXRlICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgdGhlIG1ldHJpY3Mgb2YgYSBnaXZlbiBnbHlwaCwgbm90IGxvYWQgYWxsIG9mIGl0cyAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgIHBvaW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmdW5jcyAgICAgICAgOjogQW4gYXJyYXkgb2YgZnVuY3Rpb24gcG9pbnRlcnMgZm9yIHRoZSBidWlsZGVyLiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUMV9CdWlsZGVyUmVjXworICB7CisgICAgRlRfTWVtb3J5ICAgICAgIG1lbW9yeTsKKyAgICBGVF9GYWNlICAgICAgICAgZmFjZTsKKyAgICBGVF9HbHlwaFNsb3QgICAgZ2x5cGg7CisgICAgRlRfR2x5cGhMb2FkZXIgIGxvYWRlcjsKKyAgICBGVF9PdXRsaW5lKiAgICAgYmFzZTsKKyAgICBGVF9PdXRsaW5lKiAgICAgY3VycmVudDsKKworICAgIEZUX1BvcyAgICAgICAgICBwb3NfeDsKKyAgICBGVF9Qb3MgICAgICAgICAgcG9zX3k7CisKKyAgICBGVF9WZWN0b3IgICAgICAgbGVmdF9iZWFyaW5nOworICAgIEZUX1ZlY3RvciAgICAgICBhZHZhbmNlOworCisgICAgRlRfQkJveCAgICAgICAgIGJib3g7ICAgICAgICAgIC8qIGJvdW5kaW5nIGJveCAqLworICAgIFQxX1BhcnNlU3RhdGUgICBwYXJzZV9zdGF0ZTsKKyAgICBGVF9Cb29sICAgICAgICAgbG9hZF9wb2ludHM7CisgICAgRlRfQm9vbCAgICAgICAgIG5vX3JlY3Vyc2U7CisKKyAgICBGVF9Cb29sICAgICAgICAgbWV0cmljc19vbmx5OworCisgICAgdm9pZCogICAgICAgICAgIGhpbnRzX2Z1bmNzOyAgICAvKiBoaW50ZXItc3BlY2lmaWMgKi8KKyAgICB2b2lkKiAgICAgICAgICAgaGludHNfZ2xvYmFsczsgIC8qIGhpbnRlci1zcGVjaWZpYyAqLworCisgICAgVDFfQnVpbGRlcl9GdW5jc1JlYyAgZnVuY3M7CisKKyAgfSBUMV9CdWlsZGVyUmVjOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKyAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgIFQxIERFQ09ERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCisgIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAwCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUMV9NQVhfU1VCUlNfQ0FMTFMgZGV0YWlscyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbmVzdGVkIHN1Yi1yb3V0aW5lICAgKi8KKyAgLyogY2FsbHMgZHVyaW5nIGdseXBoIGxvYWRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUMV9NQVhfU1VCUlNfQ0FMTFMgIDgKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVDFfTUFYX0NIQVJTVFJJTkdfT1BFUkFORFMgaXMgdGhlIGNoYXJzdHJpbmcgc3RhY2sncyBjYXBhY2l0eS4gIEEgICAgICovCisgIC8qIG1pbmltdW0gb2YgMTYgaXMgcmVxdWlyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVDFfTUFYX0NIQVJTVFJJTkdTX09QRVJBTkRTICAzMgorCisjZW5kaWYgLyogMCAqLworCisKKyAgdHlwZWRlZiBzdHJ1Y3QgIFQxX0RlY29kZXJfWm9uZVJlY18KKyAgeworICAgIEZUX0J5dGUqICBjdXJzb3I7CisgICAgRlRfQnl0ZSogIGJhc2U7CisgICAgRlRfQnl0ZSogIGxpbWl0OworCisgIH0gVDFfRGVjb2Rlcl9ab25lUmVjLCAqVDFfRGVjb2Rlcl9ab25lOworCisKKyAgdHlwZWRlZiBzdHJ1Y3QgVDFfRGVjb2RlclJlY18qICAgICAgICAgICAgICBUMV9EZWNvZGVyOworICB0eXBlZGVmIGNvbnN0IHN0cnVjdCBUMV9EZWNvZGVyX0Z1bmNzUmVjXyogIFQxX0RlY29kZXJfRnVuY3M7CisKKworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqVDFfRGVjb2Rlcl9DYWxsYmFjaykoIFQxX0RlY29kZXIgIGRlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGdseXBoX2luZGV4ICk7CisKKworICB0eXBlZGVmIHN0cnVjdCAgVDFfRGVjb2Rlcl9GdW5jc1JlY18KKyAgeworICAgIEZUX0Vycm9yCisgICAgKCppbml0KSggVDFfRGVjb2RlciAgICAgICAgICAgZGVjb2RlciwKKyAgICAgICAgICAgICBGVF9GYWNlICAgICAgICAgICAgICBmYWNlLAorICAgICAgICAgICAgIEZUX1NpemUgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICAgICAgICAgc2xvdCwKKyAgICAgICAgICAgICBGVF9CeXRlKiogICAgICAgICAgICBnbHlwaF9uYW1lcywKKyAgICAgICAgICAgICBQU19CbGVuZCAgICAgICAgICAgICBibGVuZCwKKyAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgICAgICBoaW50aW5nLAorICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICAgICAgIGhpbnRfbW9kZSwKKyAgICAgICAgICAgICBUMV9EZWNvZGVyX0NhbGxiYWNrICBjYWxsYmFjayApOworCisgICAgdm9pZAorICAgICgqZG9uZSkoIFQxX0RlY29kZXIgIGRlY29kZXIgKTsKKworICAgIEZUX0Vycm9yCisgICAgKCpwYXJzZV9jaGFyc3RyaW5ncykoIFQxX0RlY29kZXIgIGRlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGxlbiApOworCisgIH0gVDFfRGVjb2Rlcl9GdW5jc1JlYzsKKworCisgIHR5cGVkZWYgc3RydWN0ICBUMV9EZWNvZGVyUmVjXworICB7CisgICAgVDFfQnVpbGRlclJlYyAgICAgICAgYnVpbGRlcjsKKworICAgIEZUX0xvbmcgICAgICAgICAgICAgIHN0YWNrW1QxX01BWF9DSEFSU1RSSU5HU19PUEVSQU5EU107CisgICAgRlRfTG9uZyogICAgICAgICAgICAgdG9wOworCisgICAgVDFfRGVjb2Rlcl9ab25lUmVjICAgem9uZXNbVDFfTUFYX1NVQlJTX0NBTExTICsgMV07CisgICAgVDFfRGVjb2Rlcl9ab25lICAgICAgem9uZTsKKworICAgIEZUX1NlcnZpY2VfUHNDTWFwcyAgIHBzbmFtZXM7ICAgICAgLyogZm9yIHNlYWMgKi8KKyAgICBGVF9VSW50ICAgICAgICAgICAgICBudW1fZ2x5cGhzOworICAgIEZUX0J5dGUqKiAgICAgICAgICAgIGdseXBoX25hbWVzOworCisgICAgRlRfSW50ICAgICAgICAgICAgICAgbGVuSVY7ICAgICAgICAvKiBpbnRlcm5hbCBmb3Igc3ViIHJvdXRpbmUgY2FsbHMgKi8KKyAgICBGVF9JbnQgICAgICAgICAgICAgICBudW1fc3VicnM7CisgICAgRlRfQnl0ZSoqICAgICAgICAgICAgc3VicnM7CisgICAgRlRfVUludCogICAgICAgICAgICAgc3VicnNfbGVuOyAgICAvKiBhcnJheSBvZiBzdWJycyBsZW5ndGggKG9wdGlvbmFsKSAqLworCisgICAgRlRfTWF0cml4ICAgICAgICAgICAgZm9udF9tYXRyaXg7CisgICAgRlRfVmVjdG9yICAgICAgICAgICAgZm9udF9vZmZzZXQ7CisKKyAgICBGVF9JbnQgICAgICAgICAgICAgICBmbGV4X3N0YXRlOworICAgIEZUX0ludCAgICAgICAgICAgICAgIG51bV9mbGV4X3ZlY3RvcnM7CisgICAgRlRfVmVjdG9yICAgICAgICAgICAgZmxleF92ZWN0b3JzWzddOworCisgICAgUFNfQmxlbmQgICAgICAgICAgICAgYmxlbmQ7ICAgICAgIC8qIGZvciBtdWx0aXBsZSBtYXN0ZXIgc3VwcG9ydCAqLworCisgICAgRlRfUmVuZGVyX01vZGUgICAgICAgaGludF9tb2RlOworCisgICAgVDFfRGVjb2Rlcl9DYWxsYmFjayAgcGFyc2VfY2FsbGJhY2s7CisgICAgVDFfRGVjb2Rlcl9GdW5jc1JlYyAgZnVuY3M7CisKKyAgICBGVF9Mb25nKiAgICAgICAgICAgICBidWlsZGNoYXI7CisgICAgRlRfVUludCAgICAgICAgICAgICAgbGVuX2J1aWxkY2hhcjsKKworICAgIEZUX0Jvb2wgICAgICAgICAgICAgIHNlYWM7CisKKyAgfSBUMV9EZWNvZGVyUmVjOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKyAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGTSBQQVJTRVIgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCisgIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgdHlwZWRlZiBzdHJ1Y3QgQUZNX1BhcnNlclJlY18qICBBRk1fUGFyc2VyOworCisgIHR5cGVkZWYgc3RydWN0ICBBRk1fUGFyc2VyX0Z1bmNzUmVjXworICB7CisgICAgRlRfRXJyb3IKKyAgICAoKmluaXQpKCBBRk1fUGFyc2VyICBwYXJzZXIsCisgICAgICAgICAgICAgRlRfTWVtb3J5ICAgbWVtb3J5LAorICAgICAgICAgICAgIEZUX0J5dGUqICAgIGJhc2UsCisgICAgICAgICAgICAgRlRfQnl0ZSogICAgbGltaXQgKTsKKworICAgIHZvaWQKKyAgICAoKmRvbmUpKCBBRk1fUGFyc2VyICBwYXJzZXIgKTsKKworICAgIEZUX0Vycm9yCisgICAgKCpwYXJzZSkoIEFGTV9QYXJzZXIgIHBhcnNlciApOworCisgIH0gQUZNX1BhcnNlcl9GdW5jc1JlYzsKKworCisgIHR5cGVkZWYgc3RydWN0IEFGTV9TdHJlYW1SZWNfKiAgQUZNX1N0cmVhbTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFGTV9QYXJzZXJSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFuIEFGTV9QYXJzZXIgaXMgYSBwYXJzZXIgZm9yIHRoZSBBRk0gZmlsZXMuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1lbW9yeSAgICA6OiBUaGUgb2JqZWN0IHVzZWQgZm9yIG1lbW9yeSBvcGVyYXRpb25zIChhbGxvYyBhbmQgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgcmVhbGxvYykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSAgICA6OiBUaGlzIGlzIGFuIG9wYXF1ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRm9udEluZm8gIDo6IFRoZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQgaGVyZS4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnZXRfaW5kZXggOjogQSB1c2VyIHByb3ZpZGVkIGZ1bmN0aW9uIHRvIGdldCBhIGdseXBoIGluZGV4IGJ5IGl0cyAgKi8KKyAgLyogICAgICAgICAgICAgICAgIG5hbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgQUZNX1BhcnNlclJlY18KKyAgeworICAgIEZUX01lbW9yeSAgICAgbWVtb3J5OworICAgIEFGTV9TdHJlYW0gICAgc3RyZWFtOworCisgICAgQUZNX0ZvbnRJbmZvICBGb250SW5mbzsKKworICAgIEZUX0ludAorICAgICgqZ2V0X2luZGV4KSggY29uc3QgY2hhciogIG5hbWUsCisgICAgICAgICAgICAgICAgICBGVF9PZmZzZXQgICAgbGVuLAorICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIHVzZXJfZGF0YSApOworCisgICAgdm9pZCogICAgICAgICB1c2VyX2RhdGE7CisKKyAgfSBBRk1fUGFyc2VyUmVjOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKyAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgVFlQRTEgQ0hBUk1BUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCisgIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgdHlwZWRlZiBjb25zdCBzdHJ1Y3QgVDFfQ01hcF9DbGFzc2VzUmVjXyogIFQxX0NNYXBfQ2xhc3NlczsKKworICB0eXBlZGVmIHN0cnVjdCBUMV9DTWFwX0NsYXNzZXNSZWNfCisgIHsKKyAgICBGVF9DTWFwX0NsYXNzICBzdGFuZGFyZDsKKyAgICBGVF9DTWFwX0NsYXNzICBleHBlcnQ7CisgICAgRlRfQ01hcF9DbGFzcyAgY3VzdG9tOworICAgIEZUX0NNYXBfQ2xhc3MgIHVuaWNvZGU7CisKKyAgfSBUMV9DTWFwX0NsYXNzZXNSZWM7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLworICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICBQU0F1eCBNb2R1bGUgSW50ZXJmYWNlICAgICAgICAgICAgICAgICAqKioqKi8KKyAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICB0eXBlZGVmIHN0cnVjdCAgUFNBdXhfU2VydmljZVJlY18KKyAgeworICAgIC8qIGRvbid0IHVzZSBgUFNfVGFibGVfRnVuY3MnIGFuZCBmcmllbmRzIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgY29uc3QgUFNfVGFibGVfRnVuY3NSZWMqICAgIHBzX3RhYmxlX2Z1bmNzOworICAgIGNvbnN0IFBTX1BhcnNlcl9GdW5jc1JlYyogICBwc19wYXJzZXJfZnVuY3M7CisgICAgY29uc3QgVDFfQnVpbGRlcl9GdW5jc1JlYyogIHQxX2J1aWxkZXJfZnVuY3M7CisgICAgY29uc3QgVDFfRGVjb2Rlcl9GdW5jc1JlYyogIHQxX2RlY29kZXJfZnVuY3M7CisKKyAgICB2b2lkCisgICAgKCp0MV9kZWNyeXB0KSggRlRfQnl0ZSogICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgRlRfT2Zmc2V0ICBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICBzZWVkICk7CisKKyAgICBUMV9DTWFwX0NsYXNzZXMgIHQxX2NtYXBfY2xhc3NlczsKKworICAgIC8qIGZpZWxkcyBhZnRlciB0aGlzIGNvbW1lbnQgbGluZSB3ZXJlIGFkZGVkIGFmdGVyIHZlcnNpb24gMi4xLjEwICovCisgICAgY29uc3QgQUZNX1BhcnNlcl9GdW5jc1JlYyogIGFmbV9wYXJzZXJfZnVuY3M7CisKKyAgfSBQU0F1eF9TZXJ2aWNlUmVjLCAqUFNBdXhfU2VydmljZTsKKworICAvKiBiYWNrd2FyZHMtY29tcGF0aWJsZSB0eXBlIGRlZmluaXRpb24gKi8KKyAgdHlwZWRlZiBQU0F1eF9TZXJ2aWNlUmVjICAgUFNBdXhfSW50ZXJmYWNlOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKyAgLyoqKioqICAgICAgICAgICAgICAgICBTb21lIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgKioqKiovCisgIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSVNfUFNfTkVXTElORSggY2ggKSBcCisgICggKGNoKSA9PSAnXHInIHx8ICAgICAgICAgXAorICAgIChjaCkgPT0gJ1xuJyApCisKKyNkZWZpbmUgSVNfUFNfU1BBQ0UoIGNoICkgIFwKKyAgKCAoY2gpID09ICcgJyAgICAgICAgIHx8IFwKKyAgICBJU19QU19ORVdMSU5FKCBjaCApIHx8IFwKKyAgICAoY2gpID09ICdcdCcgICAgICAgIHx8IFwKKyAgICAoY2gpID09ICdcZicgICAgICAgIHx8IFwKKyAgICAoY2gpID09ICdcMCcgKQorCisjZGVmaW5lIElTX1BTX1NQRUNJQUwoIGNoICkgICAgICAgXAorICAoIChjaCkgPT0gJy8nICAgICAgICAgICAgICAgIHx8IFwKKyAgICAoY2gpID09ICcoJyB8fCAoY2gpID09ICcpJyB8fCBcCisgICAgKGNoKSA9PSAnPCcgfHwgKGNoKSA9PSAnPicgfHwgXAorICAgIChjaCkgPT0gJ1snIHx8IChjaCkgPT0gJ10nIHx8IFwKKyAgICAoY2gpID09ICd7JyB8fCAoY2gpID09ICd9JyB8fCBcCisgICAgKGNoKSA9PSAnJScgICAgICAgICAgICAgICAgKQorCisjZGVmaW5lIElTX1BTX0RFTElNKCBjaCApICBcCisgICggSVNfUFNfU1BBQ0UoIGNoICkgICB8fCBcCisgICAgSVNfUFNfU1BFQ0lBTCggY2ggKSApCisKKyNkZWZpbmUgSVNfUFNfRElHSVQoIGNoICkgICAgICAgIFwKKyAgKCAoY2gpID49ICcwJyAmJiAoY2gpIDw9ICc5JyApCisKKyNkZWZpbmUgSVNfUFNfWERJR0lUKCBjaCApICAgICAgICAgICAgXAorICAoIElTX1BTX0RJR0lUKCBjaCApICAgICAgICAgICAgICB8fCBcCisgICAgKCAoY2gpID49ICdBJyAmJiAoY2gpIDw9ICdGJyApIHx8IFwKKyAgICAoIChjaCkgPj0gJ2EnICYmIChjaCkgPD0gJ2YnICkgKQorCisjZGVmaW5lIElTX1BTX0JBU0U4NSggY2ggKSAgICAgICBcCisgICggKGNoKSA+PSAnIScgJiYgKGNoKSA8PSAndScgKQorCisjZGVmaW5lIElTX1BTX1RPS0VOKCBjdXIsIGxpbWl0LCB0b2tlbiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggKGNoYXIpKGN1cilbMF0gPT0gKHRva2VuKVswXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBcCisgICAgKCAoY3VyKSArIHNpemVvZiAoICh0b2tlbikgKSA9PSAobGltaXQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoIChjdXIpICsgc2l6ZW9mKCAodG9rZW4pICkgPCAobGltaXQpICAgICAgICAgICYmICAgICAgICAgICAgICAgICBcCisgICAgICAgIElTX1BTX0RFTElNKCAoY3VyKVtzaXplb2YgKCAodG9rZW4pICkgLSAxXSApICkgKSAgICAgICAgICAgICAmJiBcCisgICAgZnRfc3RybmNtcCggKGNoYXIqKShjdXIpLCAodG9rZW4pLCBzaXplb2YgKCAodG9rZW4pICkgLSAxICkgPT0gMCApCisKKworRlRfRU5EX0hFQURFUgorCisjZW5kaWYgLyogX19QU0FVWF9IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNoaW50cy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2hpbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJhYWFiYQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNoaW50cy5oCkBAIC0wLDAgKzEsNzIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwc2hpbnRzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSW50ZXJmYWNlIHRvIFBvc3RzY3JpcHQtc3BlY2lmaWMgKFR5cGUgMSBhbmQgVHlwZSAyKSBoaW50cyAgICAgICAgICAgKi8KKy8qICAgIHJlY29yZGVycyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gIFRoZXNlIGFyZSB1c2VkIHRvIHN1cHBvcnQgbmF0aXZlICAgICovCisvKiAgICBUMS9UMiBoaW50cyBpbiB0aGUgYHR5cGUxJywgYGNpZCcsIGFuZCBgY2ZmJyBmb250IGRyaXZlcnMuICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwMS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX1BTSElOVFNfSF9fCisjZGVmaW5lIF9fUFNISU5UU19IX18KKworCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKyNpbmNsdWRlIEZUX1RZUEUxX1RBQkxFU19ICisKKworRlRfQkVHSU5fSEVBREVSCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLworICAvKioqKiogICAgICAgICAgICAgICBJTlRFUk5BTCBSRVBSRVNFTlRBVElPTiBPRiBHTE9CQUxTICAgICAgICAgICAgICAqKioqKi8KKyAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICB0eXBlZGVmIHN0cnVjdCBQU0hfR2xvYmFsc1JlY18qICBQU0hfR2xvYmFsczsKKworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqUFNIX0dsb2JhbHNfTmV3RnVuYykoIEZUX01lbW9yeSAgICAgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qcml2YXRlKiAgIHByaXZhdGVfZGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUFNIX0dsb2JhbHMqICBhZ2xvYmFscyApOworCisgIHR5cGVkZWYgdm9pZAorICAoKlBTSF9HbG9iYWxzX1NldFNjYWxlRnVuYykoIFBTSF9HbG9iYWxzICBnbG9iYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICB4X3NjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICB5X3NjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICB4X2RlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICB5X2RlbHRhICk7CisKKyAgdHlwZWRlZiB2b2lkCisgICgqUFNIX0dsb2JhbHNfRGVzdHJveUZ1bmMpKCBQU0hfR2xvYmFscyAgZ2xvYmFscyApOworCisKKyAgdHlwZWRlZiBzdHJ1Y3QgIFBTSF9HbG9iYWxzX0Z1bmNzUmVjXworICB7CisgICAgUFNIX0dsb2JhbHNfTmV3RnVuYyAgICAgICBjcmVhdGU7CisgICAgUFNIX0dsb2JhbHNfU2V0U2NhbGVGdW5jICBzZXRfc2NhbGU7CisgICAgUFNIX0dsb2JhbHNfRGVzdHJveUZ1bmMgICBkZXN0cm95OworCisgIH0gUFNIX0dsb2JhbHNfRnVuY3NSZWMsICpQU0hfR2xvYmFsc19GdW5jczsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCisgIC8qKioqKiAgICAgICAgICAgICAgICAgIFBVQkxJQyBUWVBFIDEgSElOVFMgUkVDT1JERVIgICAgICAgICAgICAgICAgICoqKioqLworICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOgorICAgKiAgIFQxX0hpbnRzCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGlzIGlzIGEgaGFuZGxlIHRvIGFuIG9wYXF1ZSBzdHJ1Y3R1cmUgdXNlZCB0byByZWNvcmQgZ2x5cGggaGludHMKKyAgICogICBmcm9tIGEgVHlwZSAxIGNoYXJhY3RlciBnbHlwaCBjaGFyYWN0ZXIgc3RyaW5nLgorICAgKgorICAgKiAgIFRoZSBtZXRob2RzIHVzZWQgdG8gb3BlcmF0ZSBvbiB0aGlzIG9iamVjdCBhcmUgZGVmaW5lZCBieSB0aGUKKyAgICogICBAVDFfSGludHNfRnVuY3NSZWMgc3RydWN0dXJlLiAgUmVjb3JkaW5nIGdseXBoIGhpbnRzIGlzIG5vcm1hbGx5CisgICAqICAgYWNoaWV2ZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHNjaGVtZToKKyAgICoKKyAgICogICAtIE9wZW4gYSBuZXcgaGludCByZWNvcmRpbmcgc2Vzc2lvbiBieSBjYWxsaW5nIHRoZSBgb3BlbicgbWV0aG9kLgorICAgKiAgICAgVGhpcyByZXdpbmRzIHRoZSByZWNvcmRlciBhbmQgcHJlcGFyZSBpdCBmb3IgbmV3IGlucHV0LgorICAgKgorICAgKiAgIC0gRm9yIGVhY2ggaGludCBmb3VuZCBpbiB0aGUgZ2x5cGggY2hhcnN0cmluZywgY2FsbCB0aGUgY29ycmVzcG9uZGluZworICAgKiAgICAgbWV0aG9kIChgc3RlbScsIGBzdGVtMycsIG9yIGByZXNldCcpLiAgTm90ZSB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBkbworICAgKiAgICAgbm90IHJldHVybiBhbiBlcnJvciBjb2RlLgorICAgKgorICAgKiAgIC0gQ2xvc2UgdGhlIHJlY29yZGluZyBzZXNzaW9uIGJ5IGNhbGxpbmcgdGhlIGBjbG9zZScgbWV0aG9kLiAgSXQKKyAgICogICAgIHJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGUgaGludHMgd2VyZSBpbnZhbGlkIG9yIHNvbWV0aGluZworICAgKiAgICAgc3RyYW5nZSBoYXBwZW5lZCAoZS5nLiwgbWVtb3J5IHNob3J0YWdlKS4KKyAgICoKKyAgICogICBUaGUgaGludHMgYWNjdW11bGF0ZWQgaW4gdGhlIG9iamVjdCBjYW4gbGF0ZXIgYmUgdXNlZCBieSB0aGUKKyAgICogICBQb3N0U2NyaXB0IGhpbnRlci4KKyAgICoKKyAgICovCisgIHR5cGVkZWYgc3RydWN0IFQxX0hpbnRzUmVjXyogIFQxX0hpbnRzOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHR5cGU6CisgICAqICAgVDFfSGludHNfRnVuY3MKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgcG9pbnRlciB0byB0aGUgQFQxX0hpbnRzX0Z1bmNzUmVjIHN0cnVjdHVyZSB0aGF0IGRlZmluZXMgdGhlIEFQSSBvZgorICAgKiAgIGEgZ2l2ZW4gQFQxX0hpbnRzIG9iamVjdC4KKyAgICoKKyAgICovCisgIHR5cGVkZWYgY29uc3Qgc3RydWN0IFQxX0hpbnRzX0Z1bmNzUmVjXyogIFQxX0hpbnRzX0Z1bmNzOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIFQxX0hpbnRzX09wZW5GdW5jCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1ldGhvZCBvZiB0aGUgQFQxX0hpbnRzIGNsYXNzIHVzZWQgdG8gcHJlcGFyZSBpdCBmb3IgYSBuZXcgVHlwZSAxCisgICAqICAgaGludHMgcmVjb3JkaW5nIHNlc3Npb24uCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBoaW50cyA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFR5cGUgMSBoaW50cyByZWNvcmRlci4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgWW91IHNob3VsZCBhbHdheXMgY2FsbCB0aGUgQFQxX0hpbnRzX0Nsb3NlRnVuYyBtZXRob2QgaW4gb3JkZXIgdG8KKyAgICogICBjbG9zZSBhbiBvcGVuZWQgcmVjb3JkaW5nIHNlc3Npb24uCisgICAqCisgICAqLworICB0eXBlZGVmIHZvaWQKKyAgKCpUMV9IaW50c19PcGVuRnVuYykoIFQxX0hpbnRzICBoaW50cyApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIFQxX0hpbnRzX1NldFN0ZW1GdW5jCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1ldGhvZCBvZiB0aGUgQFQxX0hpbnRzIGNsYXNzIHVzZWQgdG8gcmVjb3JkIGEgbmV3IGhvcml6b250YWwgb3IKKyAgICogICB2ZXJ0aWNhbCBzdGVtLiAgVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgVHlwZSAxIGBoc3RlbScgYW5kIGB2c3RlbScKKyAgICogICBvcGVyYXRvcnMuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBoaW50cyA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFR5cGUgMSBoaW50cyByZWNvcmRlci4KKyAgICoKKyAgICogICBkaW1lbnNpb24gOjoKKyAgICogICAgIDAgZm9yIGhvcml6b250YWwgc3RlbXMgKGhzdGVtKSwgMSBmb3IgdmVydGljYWwgb25lcyAodnN0ZW0pLgorICAgKgorICAgKiAgIGNvb3JkcyA6OgorICAgKiAgICAgQXJyYXkgb2YgMiBjb29yZGluYXRlcyBpbiAxNi4xNiBmb3JtYXQsIHVzZWQgYXMgKHBvc2l0aW9uLGxlbmd0aCkKKyAgICogICAgIHN0ZW0gZGVzY3JpcHRvci4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVXNlIHZlcnRpY2FsIGNvb3JkaW5hdGVzICh5KSBmb3IgaG9yaXpvbnRhbCBzdGVtcyAoZGltPTApLiAgVXNlCisgICAqICAgaG9yaXpvbnRhbCBjb29yZGluYXRlcyAoeCkgZm9yIHZlcnRpY2FsIHN0ZW1zIChkaW09MSkuCisgICAqCisgICAqICAgYGNvb3Jkc1swXScgaXMgdGhlIGFic29sdXRlIHN0ZW0gcG9zaXRpb24gKGxvd2VzdCBjb29yZGluYXRlKTsKKyAgICogICBgY29vcmRzWzFdJyBpcyB0aGUgbGVuZ3RoLgorICAgKgorICAgKiAgIFRoZSBsZW5ndGggY2FuIGJlIG5lZ2F0aXZlLCBpbiB3aGljaCBjYXNlIGl0IG11c3QgYmUgZWl0aGVyIC0yMCBvcgorICAgKiAgIC0yMS4gIEl0IGlzIGludGVycHJldGVkIGFzIGEgYGdob3N0JyBzdGVtLCBhY2NvcmRpbmcgdG8gdGhlIFR5cGUgMQorICAgKiAgIHNwZWNpZmljYXRpb24uCisgICAqCisgICAqICAgSWYgdGhlIGxlbmd0aCBpcyAtMjEgKGNvcnJlc3BvbmRpbmcgdG8gYSBib3R0b20gZ2hvc3Qgc3RlbSksIHRoZW4KKyAgICogICB0aGUgcmVhbCBzdGVtIHBvc2l0aW9uIGlzIGBjb29yZHNbMF0rY29vcmRzWzFdJy4KKyAgICoKKyAgICovCisgIHR5cGVkZWYgdm9pZAorICAoKlQxX0hpbnRzX1NldFN0ZW1GdW5jKSggVDFfSGludHMgICBoaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZGltZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdHlwZToKKyAgICogICBUMV9IaW50c19TZXRTdGVtM0Z1bmMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgbWV0aG9kIG9mIHRoZSBAVDFfSGludHMgY2xhc3MgdXNlZCB0byByZWNvcmQgdGhyZWUKKyAgICogICBjb3VudGVyLWNvbnRyb2xsZWQgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBzdGVtcyBhdCBvbmNlLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgaGludHMgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUeXBlIDEgaGludHMgcmVjb3JkZXIuCisgICAqCisgICAqICAgZGltZW5zaW9uIDo6CisgICAqICAgICAwIGZvciBob3Jpem9udGFsIHN0ZW1zLCAxIGZvciB2ZXJ0aWNhbCBvbmVzLgorICAgKgorICAgKiAgIGNvb3JkcyA6OgorICAgKiAgICAgQW4gYXJyYXkgb2YgNiB2YWx1ZXMgaW4gMTYuMTYgZm9ybWF0LCBob2xkaW5nIDMgKHBvc2l0aW9uLGxlbmd0aCkKKyAgICogICAgIHBhaXJzIGZvciB0aGUgY291bnRlci1jb250cm9sbGVkIHN0ZW1zLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBVc2UgdmVydGljYWwgY29vcmRpbmF0ZXMgKHkpIGZvciBob3Jpem9udGFsIHN0ZW1zIChkaW09MCkuICBVc2UKKyAgICogICBob3Jpem9udGFsIGNvb3JkaW5hdGVzICh4KSBmb3IgdmVydGljYWwgc3RlbXMgKGRpbT0xKS4KKyAgICoKKyAgICogICBUaGUgbGVuZ3RocyBjYW5ub3QgYmUgbmVnYXRpdmUgKGdob3N0IHN0ZW1zIGFyZSBuZXZlcgorICAgKiAgIGNvdW50ZXItY29udHJvbGxlZCkuCisgICAqCisgICAqLworICB0eXBlZGVmIHZvaWQKKyAgKCpUMV9IaW50c19TZXRTdGVtM0Z1bmMpKCBUMV9IaW50cyAgIGhpbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZGltZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3R5cGU6CisgICAqICAgVDFfSGludHNfUmVzZXRGdW5jCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1ldGhvZCBvZiB0aGUgQFQxX0hpbnRzIGNsYXNzIHVzZWQgdG8gcmVzZXQgdGhlIHN0ZW1zIGhpbnRzIGluIGEKKyAgICogICByZWNvcmRpbmcgc2Vzc2lvbi4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGhpbnRzIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgVHlwZSAxIGhpbnRzIHJlY29yZGVyLgorICAgKgorICAgKiAgIGVuZF9wb2ludCA6OgorICAgKiAgICAgVGhlIGluZGV4IG9mIHRoZSBsYXN0IHBvaW50IGluIHRoZSBpbnB1dCBnbHlwaCBpbiB3aGljaCB0aGUKKyAgICogICAgIHByZXZpb3VzbHkgZGVmaW5lZCBoaW50cyBhcHBseS4KKyAgICoKKyAgICovCisgIHR5cGVkZWYgdm9pZAorICAoKlQxX0hpbnRzX1Jlc2V0RnVuYykoIFQxX0hpbnRzICBoaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZW5kX3BvaW50ICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3R5cGU6CisgICAqICAgVDFfSGludHNfQ2xvc2VGdW5jCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1ldGhvZCBvZiB0aGUgQFQxX0hpbnRzIGNsYXNzIHVzZWQgdG8gY2xvc2UgYSBoaW50IHJlY29yZGluZworICAgKiAgIHNlc3Npb24uCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBoaW50cyA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFR5cGUgMSBoaW50cyByZWNvcmRlci4KKyAgICoKKyAgICogICBlbmRfcG9pbnQgOjoKKyAgICogICAgIFRoZSBpbmRleCBvZiB0aGUgbGFzdCBwb2ludCBpbiB0aGUgaW5wdXQgZ2x5cGguCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhlIGVycm9yIGNvZGUgaXMgc2V0IHRvIGluZGljYXRlIHRoYXQgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHRoZQorICAgKiAgIHJlY29yZGluZyBzZXNzaW9uLgorICAgKgorICAgKi8KKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKlQxX0hpbnRzX0Nsb3NlRnVuYykoIFQxX0hpbnRzICBoaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZW5kX3BvaW50ICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3R5cGU6CisgICAqICAgVDFfSGludHNfQXBwbHlGdW5jCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1ldGhvZCBvZiB0aGUgQFQxX0hpbnRzIGNsYXNzIHVzZWQgdG8gYXBwbHkgaGludHMgdG8gdGhlCisgICAqICAgY29ycmVzcG9uZGluZyBnbHlwaCBvdXRsaW5lLiAgTXVzdCBiZSBjYWxsZWQgb25jZSBhbGwgaGludHMgaGF2ZSBiZWVuCisgICAqICAgcmVjb3JkZWQuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBoaW50cyA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFR5cGUgMSBoaW50cyByZWNvcmRlci4KKyAgICoKKyAgICogICBvdXRsaW5lIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBvdXRsaW5lIGRlc2NyaXB0b3IuCisgICAqCisgICAqICAgZ2xvYmFscyA6OgorICAgKiAgICAgVGhlIGhpbnRlciBnbG9iYWxzIGZvciB0aGlzIGZvbnQuCisgICAqCisgICAqICAgaGludF9tb2RlIDo6CisgICAqICAgICBIaW50aW5nIGluZm9ybWF0aW9uLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIE9uIGlucHV0LCBhbGwgcG9pbnRzIHdpdGhpbiB0aGUgb3V0bGluZSBhcmUgaW4gZm9udCBjb29yZGluYXRlcy4gT24KKyAgICogICBvdXRwdXQsIHRoZXkgYXJlIGluIDEvNjR0aCBvZiBwaXhlbHMuCisgICAqCisgICAqICAgVGhlIHNjYWxpbmcgdHJhbnNmb3JtYXRpb24gaXMgdGFrZW4gZnJvbSB0aGUgYGdsb2JhbHMnIG9iamVjdCB3aGljaAorICAgKiAgIG11c3QgY29ycmVzcG9uZCB0byB0aGUgc2FtZSBmb250IGFzIHRoZSBnbHlwaC4KKyAgICoKKyAgICovCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpUMV9IaW50c19BcHBseUZ1bmMpKCBUMV9IaW50cyAgICAgICAgaGludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgIG91dGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUFNIX0dsb2JhbHMgICAgIGdsb2JhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgIGhpbnRfbW9kZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBUMV9IaW50c19GdW5jc1JlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVGhlIHN0cnVjdHVyZSB1c2VkIHRvIHByb3ZpZGUgdGhlIEFQSSB0byBAVDFfSGludHMgb2JqZWN0cy4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBoaW50cyA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFQxIEhpbnRzIHJlY29yZGVyLgorICAgKgorICAgKiAgIG9wZW4gOjoKKyAgICogICAgIFRoZSBmdW5jdGlvbiB0byBvcGVuIGEgcmVjb3JkaW5nIHNlc3Npb24uCisgICAqCisgICAqICAgY2xvc2UgOjoKKyAgICogICAgIFRoZSBmdW5jdGlvbiB0byBjbG9zZSBhIHJlY29yZGluZyBzZXNzaW9uLgorICAgKgorICAgKiAgIHN0ZW0gOjoKKyAgICogICAgIFRoZSBmdW5jdGlvbiB0byBzZXQgYSBzaW1wbGUgc3RlbS4KKyAgICoKKyAgICogICBzdGVtMyA6OgorICAgKiAgICAgVGhlIGZ1bmN0aW9uIHRvIHNldCBjb3VudGVyLWNvbnRyb2xsZWQgc3RlbXMuCisgICAqCisgICAqICAgcmVzZXQgOjoKKyAgICogICAgIFRoZSBmdW5jdGlvbiB0byByZXNldCBzdGVtIGhpbnRzLgorICAgKgorICAgKiAgIGFwcGx5IDo6CisgICAqICAgICBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgdGhlIGhpbnRzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGdseXBoIG91dGxpbmUuCisgICAqCisgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVDFfSGludHNfRnVuY3NSZWNfCisgIHsKKyAgICBUMV9IaW50cyAgICAgICAgICAgICAgIGhpbnRzOworICAgIFQxX0hpbnRzX09wZW5GdW5jICAgICAgb3BlbjsKKyAgICBUMV9IaW50c19DbG9zZUZ1bmMgICAgIGNsb3NlOworICAgIFQxX0hpbnRzX1NldFN0ZW1GdW5jICAgc3RlbTsKKyAgICBUMV9IaW50c19TZXRTdGVtM0Z1bmMgIHN0ZW0zOworICAgIFQxX0hpbnRzX1Jlc2V0RnVuYyAgICAgcmVzZXQ7CisgICAgVDFfSGludHNfQXBwbHlGdW5jICAgICBhcHBseTsKKworICB9IFQxX0hpbnRzX0Z1bmNzUmVjOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKyAgLyoqKioqICAgICAgICAgICAgICAgICAgUFVCTElDIFRZUEUgMiBISU5UUyBSRUNPUkRFUiAgICAgICAgICAgICAgICAgKioqKiovCisgIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHR5cGU6CisgICAqICAgVDJfSGludHMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgaXMgYSBoYW5kbGUgdG8gYW4gb3BhcXVlIHN0cnVjdHVyZSB1c2VkIHRvIHJlY29yZCBnbHlwaCBoaW50cworICAgKiAgIGZyb20gYSBUeXBlIDIgY2hhcmFjdGVyIGdseXBoIGNoYXJhY3RlciBzdHJpbmcuCisgICAqCisgICAqICAgVGhlIG1ldGhvZHMgdXNlZCB0byBvcGVyYXRlIG9uIHRoaXMgb2JqZWN0IGFyZSBkZWZpbmVkIGJ5IHRoZQorICAgKiAgIEBUMl9IaW50c19GdW5jc1JlYyBzdHJ1Y3R1cmUuICBSZWNvcmRpbmcgZ2x5cGggaGludHMgaXMgbm9ybWFsbHkKKyAgICogICBhY2hpZXZlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgc2NoZW1lOgorICAgKgorICAgKiAgIC0gT3BlbiBhIG5ldyBoaW50IHJlY29yZGluZyBzZXNzaW9uIGJ5IGNhbGxpbmcgdGhlIGBvcGVuJyBtZXRob2QuCisgICAqICAgICBUaGlzIHJld2luZHMgdGhlIHJlY29yZGVyIGFuZCBwcmVwYXJlIGl0IGZvciBuZXcgaW5wdXQuCisgICAqCisgICAqICAgLSBGb3IgZWFjaCBoaW50IGZvdW5kIGluIHRoZSBnbHlwaCBjaGFyc3RyaW5nLCBjYWxsIHRoZSBjb3JyZXNwb25kaW5nCisgICAqICAgICBtZXRob2QgKGBzdGVtcycsIGBoaW50bWFzaycsIGBjb3VudGVycycpLiAgTm90ZSB0aGF0IHRoZXNlCisgICAqICAgICBmdW5jdGlvbnMgZG8gbm90IHJldHVybiBhbiBlcnJvciBjb2RlLgorICAgKgorICAgKiAgIC0gQ2xvc2UgdGhlIHJlY29yZGluZyBzZXNzaW9uIGJ5IGNhbGxpbmcgdGhlIGBjbG9zZScgbWV0aG9kLiAgSXQKKyAgICogICAgIHJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGUgaGludHMgd2VyZSBpbnZhbGlkIG9yIHNvbWV0aGluZworICAgKiAgICAgc3RyYW5nZSBoYXBwZW5lZCAoZS5nLiwgbWVtb3J5IHNob3J0YWdlKS4KKyAgICoKKyAgICogICBUaGUgaGludHMgYWNjdW11bGF0ZWQgaW4gdGhlIG9iamVjdCBjYW4gbGF0ZXIgYmUgdXNlZCBieSB0aGUKKyAgICogICBQb3N0c2NyaXB0IGhpbnRlci4KKyAgICoKKyAgICovCisgIHR5cGVkZWYgc3RydWN0IFQyX0hpbnRzUmVjXyogIFQyX0hpbnRzOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHR5cGU6CisgICAqICAgVDJfSGludHNfRnVuY3MKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgcG9pbnRlciB0byB0aGUgQFQyX0hpbnRzX0Z1bmNzUmVjIHN0cnVjdHVyZSB0aGF0IGRlZmluZXMgdGhlIEFQSSBvZgorICAgKiAgIGEgZ2l2ZW4gQFQyX0hpbnRzIG9iamVjdC4KKyAgICoKKyAgICovCisgIHR5cGVkZWYgY29uc3Qgc3RydWN0IFQyX0hpbnRzX0Z1bmNzUmVjXyogIFQyX0hpbnRzX0Z1bmNzOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIFQyX0hpbnRzX09wZW5GdW5jCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1ldGhvZCBvZiB0aGUgQFQyX0hpbnRzIGNsYXNzIHVzZWQgdG8gcHJlcGFyZSBpdCBmb3IgYSBuZXcgVHlwZSAyCisgICAqICAgaGludHMgcmVjb3JkaW5nIHNlc3Npb24uCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBoaW50cyA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFR5cGUgMiBoaW50cyByZWNvcmRlci4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgWW91IHNob3VsZCBhbHdheXMgY2FsbCB0aGUgQFQyX0hpbnRzX0Nsb3NlRnVuYyBtZXRob2QgaW4gb3JkZXIgdG8KKyAgICogICBjbG9zZSBhbiBvcGVuZWQgcmVjb3JkaW5nIHNlc3Npb24uCisgICAqCisgICAqLworICB0eXBlZGVmIHZvaWQKKyAgKCpUMl9IaW50c19PcGVuRnVuYykoIFQyX0hpbnRzICBoaW50cyApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIFQyX0hpbnRzX1N0ZW1zRnVuYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMl9IaW50cyBjbGFzcyB1c2VkIHRvIHNldCB0aGUgdGFibGUgb2Ygc3RlbXMgaW4KKyAgICogICBlaXRoZXIgdGhlIHZlcnRpY2FsIG9yIGhvcml6b250YWwgZGltZW5zaW9uLiAgRXF1aXZhbGVudCB0byB0aGUKKyAgICogICBgaHN0ZW0nLCBgdnN0ZW0nLCBgaHN0ZW1obScsIGFuZCBgdnN0ZW1obScgVHlwZSAyIG9wZXJhdG9ycy4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGhpbnRzIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgVHlwZSAyIGhpbnRzIHJlY29yZGVyLgorICAgKgorICAgKiAgIGRpbWVuc2lvbiA6OgorICAgKiAgICAgMCBmb3IgaG9yaXpvbnRhbCBzdGVtcyAoaHN0ZW0pLCAxIGZvciB2ZXJ0aWNhbCBvbmVzICh2c3RlbSkuCisgICAqCisgICAqICAgY291bnQgOjoKKyAgICogICAgIFRoZSBudW1iZXIgb2Ygc3RlbXMuCisgICAqCisgICAqICAgY29vcmRzIDo6CisgICAqICAgICBBbiBhcnJheSBvZiBgY291bnQnIChwb3NpdGlvbixsZW5ndGgpIHBhaXJzIGluIDE2LjE2IGZvcm1hdC4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVXNlIHZlcnRpY2FsIGNvb3JkaW5hdGVzICh5KSBmb3IgaG9yaXpvbnRhbCBzdGVtcyAoZGltPTApLiAgVXNlCisgICAqICAgaG9yaXpvbnRhbCBjb29yZGluYXRlcyAoeCkgZm9yIHZlcnRpY2FsIHN0ZW1zIChkaW09MSkuCisgICAqCisgICAqICAgVGhlcmUgYXJlIGAyKmNvdW50JyBlbGVtZW50cyBpbiB0aGUgYGNvb3JkcycgYXJyYXkuICBFYWNoIGV2ZW4KKyAgICogICBlbGVtZW50IGlzIGFuIGFic29sdXRlIHBvc2l0aW9uIGluIGZvbnQgdW5pdHMsIGVhY2ggb2RkIGVsZW1lbnQgaXMgYQorICAgKiAgIGxlbmd0aCBpbiBmb250IHVuaXRzLgorICAgKgorICAgKiAgIEEgbGVuZ3RoIGNhbiBiZSBuZWdhdGl2ZSwgaW4gd2hpY2ggY2FzZSBpdCBtdXN0IGJlIGVpdGhlciAtMjAgb3IKKyAgICogICAtMjEuICBJdCBpcyBpbnRlcnByZXRlZCBhcyBhIGBnaG9zdCcgc3RlbSwgYWNjb3JkaW5nIHRvIHRoZSBUeXBlIDEKKyAgICogICBzcGVjaWZpY2F0aW9uLgorICAgKgorICAgKi8KKyAgdHlwZWRlZiB2b2lkCisgICgqVDJfSGludHNfU3RlbXNGdW5jKSggVDJfSGludHMgICBoaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGRpbWVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRpbmF0ZXMgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdHlwZToKKyAgICogICBUMl9IaW50c19NYXNrRnVuYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMl9IaW50cyBjbGFzcyB1c2VkIHRvIHNldCBhIGdpdmVuIGhpbnRtYXNrICh0aGlzCisgICAqICAgY29ycmVzcG9uZHMgdG8gdGhlIGBoaW50bWFzaycgVHlwZSAyIG9wZXJhdG9yKS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGhpbnRzIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgVHlwZSAyIGhpbnRzIHJlY29yZGVyLgorICAgKgorICAgKiAgIGVuZF9wb2ludCA6OgorICAgKiAgICAgVGhlIGdseXBoIGluZGV4IG9mIHRoZSBsYXN0IHBvaW50IHRvIHdoaWNoIHRoZSBwcmV2aW91c2x5IGRlZmluZWQKKyAgICogICAgIG9yIGFjdGl2YXRlZCBoaW50cyBhcHBseS4KKyAgICoKKyAgICogICBiaXRfY291bnQgOjoKKyAgICogICAgIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgaGludCBtYXNrLgorICAgKgorICAgKiAgIGJ5dGVzIDo6CisgICAqICAgICBBbiBhcnJheSBvZiBieXRlcyBtb2RlbGxpbmcgdGhlIGhpbnQgbWFzay4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgSWYgdGhlIGhpbnRtYXNrIHN0YXJ0cyB0aGUgY2hhcnN0cmluZyAoYmVmb3JlIGFueSBnbHlwaCBwb2ludAorICAgKiAgIGRlZmluaXRpb24pLCB0aGUgdmFsdWUgb2YgYGVuZF9wb2ludCcgc2hvdWxkIGJlIDAuCisgICAqCisgICAqICAgYGJpdF9jb3VudCcgaXMgdGhlIG51bWJlciBvZiBtZWFuaW5nZnVsIGJpdHMgaW4gdGhlIGBieXRlcycgYXJyYXk7IGl0CisgICAqICAgbXVzdCBiZSBlcXVhbCB0byB0aGUgdG90YWwgbnVtYmVyIG9mIGhpbnRzIGRlZmluZWQgc28gZmFyIChpLmUuLAorICAgKiAgIGhvcml6b250YWwrdmVydGljYWxzKS4KKyAgICoKKyAgICogICBUaGUgYGJ5dGVzJyBhcnJheSBjYW4gY29tZSBkaXJlY3RseSBmcm9tIHRoZSBUeXBlIDIgY2hhcnN0cmluZyBhbmQKKyAgICogICByZXNwZWN0cyB0aGUgc2FtZSBmb3JtYXQuCisgICAqCisgICAqLworICB0eXBlZGVmIHZvaWQKKyAgKCpUMl9IaW50c19NYXNrRnVuYykoIFQyX0hpbnRzICAgICAgICBoaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBlbmRfcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgYml0X2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfQnl0ZSogIGJ5dGVzICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3R5cGU6CisgICAqICAgVDJfSGludHNfQ291bnRlckZ1bmMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgbWV0aG9kIG9mIHRoZSBAVDJfSGludHMgY2xhc3MgdXNlZCB0byBzZXQgYSBnaXZlbiBjb3VudGVyIG1hc2sKKyAgICogICAodGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYGhpbnRtYXNrJyBUeXBlIDIgb3BlcmF0b3IpLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgaGludHMgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUeXBlIDIgaGludHMgcmVjb3JkZXIuCisgICAqCisgICAqICAgZW5kX3BvaW50IDo6CisgICAqICAgICBBIGdseXBoIGluZGV4IG9mIHRoZSBsYXN0IHBvaW50IHRvIHdoaWNoIHRoZSBwcmV2aW91c2x5IGRlZmluZWQgb3IKKyAgICogICAgIGFjdGl2ZSBoaW50cyBhcHBseS4KKyAgICoKKyAgICogICBiaXRfY291bnQgOjoKKyAgICogICAgIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgaGludCBtYXNrLgorICAgKgorICAgKiAgIGJ5dGVzIDo6CisgICAqICAgICBBbiBhcnJheSBvZiBieXRlcyBtb2RlbGxpbmcgdGhlIGhpbnQgbWFzay4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgSWYgdGhlIGhpbnRtYXNrIHN0YXJ0cyB0aGUgY2hhcnN0cmluZyAoYmVmb3JlIGFueSBnbHlwaCBwb2ludAorICAgKiAgIGRlZmluaXRpb24pLCB0aGUgdmFsdWUgb2YgYGVuZF9wb2ludCcgc2hvdWxkIGJlIDAuCisgICAqCisgICAqICAgYGJpdF9jb3VudCcgaXMgdGhlIG51bWJlciBvZiBtZWFuaW5nZnVsIGJpdHMgaW4gdGhlIGBieXRlcycgYXJyYXk7IGl0CisgICAqICAgbXVzdCBiZSBlcXVhbCB0byB0aGUgdG90YWwgbnVtYmVyIG9mIGhpbnRzIGRlZmluZWQgc28gZmFyIChpLmUuLAorICAgKiAgIGhvcml6b250YWwrdmVydGljYWxzKS4KKyAgICoKKyAgICogICAgVGhlIGBieXRlcycgYXJyYXkgY2FuIGNvbWUgZGlyZWN0bHkgZnJvbSB0aGUgVHlwZSAyIGNoYXJzdHJpbmcgYW5kCisgICAqICAgIHJlc3BlY3RzIHRoZSBzYW1lIGZvcm1hdC4KKyAgICoKKyAgICovCisgIHR5cGVkZWYgdm9pZAorICAoKlQyX0hpbnRzX0NvdW50ZXJGdW5jKSggVDJfSGludHMgICAgICAgIGhpbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIGJpdF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICBieXRlcyApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIFQyX0hpbnRzX0Nsb3NlRnVuYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMl9IaW50cyBjbGFzcyB1c2VkIHRvIGNsb3NlIGEgaGludCByZWNvcmRpbmcKKyAgICogICBzZXNzaW9uLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgaGludHMgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUeXBlIDIgaGludHMgcmVjb3JkZXIuCisgICAqCisgICAqICAgZW5kX3BvaW50IDo6CisgICAqICAgICBUaGUgaW5kZXggb2YgdGhlIGxhc3QgcG9pbnQgaW4gdGhlIGlucHV0IGdseXBoLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSBlcnJvciBjb2RlIGlzIHNldCB0byBpbmRpY2F0ZSB0aGF0IGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUKKyAgICogICByZWNvcmRpbmcgc2Vzc2lvbi4KKyAgICoKKyAgICovCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpUMl9IaW50c19DbG9zZUZ1bmMpKCBUMl9IaW50cyAgaGludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGVuZF9wb2ludCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIFQyX0hpbnRzX0FwcGx5RnVuYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMl9IaW50cyBjbGFzcyB1c2VkIHRvIGFwcGx5IGhpbnRzIHRvIHRoZQorICAgKiAgIGNvcnJlc3BvbmRpbmcgZ2x5cGggb3V0bGluZS4gIE11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBgY2xvc2UnCisgICAqICAgbWV0aG9kLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgaGludHMgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUeXBlIDIgaGludHMgcmVjb3JkZXIuCisgICAqCisgICAqICAgb3V0bGluZSA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgb3V0bGluZSBkZXNjcmlwdG9yLgorICAgKgorICAgKiAgIGdsb2JhbHMgOjoKKyAgICogICAgIFRoZSBoaW50ZXIgZ2xvYmFscyBmb3IgdGhpcyBmb250LgorICAgKgorICAgKiAgIGhpbnRfbW9kZSA6OgorICAgKiAgICAgSGludGluZyBpbmZvcm1hdGlvbi4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBPbiBpbnB1dCwgYWxsIHBvaW50cyB3aXRoaW4gdGhlIG91dGxpbmUgYXJlIGluIGZvbnQgY29vcmRpbmF0ZXMuIE9uCisgICAqICAgb3V0cHV0LCB0aGV5IGFyZSBpbiAxLzY0dGggb2YgcGl4ZWxzLgorICAgKgorICAgKiAgIFRoZSBzY2FsaW5nIHRyYW5zZm9ybWF0aW9uIGlzIHRha2VuIGZyb20gdGhlIGBnbG9iYWxzJyBvYmplY3Qgd2hpY2gKKyAgICogICBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIHNhbWUgZm9udCB0aGFuIHRoZSBnbHlwaC4KKyAgICoKKyAgICovCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpUMl9IaW50c19BcHBseUZ1bmMpKCBUMl9IaW50cyAgICAgICAgaGludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgIG91dGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUFNIX0dsb2JhbHMgICAgIGdsb2JhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgIGhpbnRfbW9kZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBUMl9IaW50c19GdW5jc1JlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVGhlIHN0cnVjdHVyZSB1c2VkIHRvIHByb3ZpZGUgdGhlIEFQSSB0byBAVDJfSGludHMgb2JqZWN0cy4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBoaW50cyA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFQyIGhpbnRzIHJlY29yZGVyIG9iamVjdC4KKyAgICoKKyAgICogICBvcGVuIDo6CisgICAqICAgICBUaGUgZnVuY3Rpb24gdG8gb3BlbiBhIHJlY29yZGluZyBzZXNzaW9uLgorICAgKgorICAgKiAgIGNsb3NlIDo6CisgICAqICAgICBUaGUgZnVuY3Rpb24gdG8gY2xvc2UgYSByZWNvcmRpbmcgc2Vzc2lvbi4KKyAgICoKKyAgICogICBzdGVtcyA6OgorICAgKiAgICAgVGhlIGZ1bmN0aW9uIHRvIHNldCB0aGUgZGltZW5zaW9uJ3Mgc3RlbXMgdGFibGUuCisgICAqCisgICAqICAgaGludG1hc2sgOjoKKyAgICogICAgIFRoZSBmdW5jdGlvbiB0byBzZXQgaGludCBtYXNrcy4KKyAgICoKKyAgICogICBjb3VudGVyIDo6CisgICAqICAgICBUaGUgZnVuY3Rpb24gdG8gc2V0IGNvdW50ZXIgbWFza3MuCisgICAqCisgICAqICAgYXBwbHkgOjoKKyAgICogICAgIFRoZSBmdW5jdGlvbiB0byBhcHBseSB0aGUgaGludHMgb24gdGhlIGNvcnJlc3BvbmRpbmcgZ2x5cGggb3V0bGluZS4KKyAgICoKKyAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUMl9IaW50c19GdW5jc1JlY18KKyAgeworICAgIFQyX0hpbnRzICAgICAgICAgICAgICBoaW50czsKKyAgICBUMl9IaW50c19PcGVuRnVuYyAgICAgb3BlbjsKKyAgICBUMl9IaW50c19DbG9zZUZ1bmMgICAgY2xvc2U7CisgICAgVDJfSGludHNfU3RlbXNGdW5jICAgIHN0ZW1zOworICAgIFQyX0hpbnRzX01hc2tGdW5jICAgICBoaW50bWFzazsKKyAgICBUMl9IaW50c19Db3VudGVyRnVuYyAgY291bnRlcjsKKyAgICBUMl9IaW50c19BcHBseUZ1bmMgICAgYXBwbHk7CisKKyAgfSBUMl9IaW50c19GdW5jc1JlYzsKKworCisgIC8qICovCisKKworICB0eXBlZGVmIHN0cnVjdCAgUFNIaW50ZXJfSW50ZXJmYWNlXworICB7CisgICAgUFNIX0dsb2JhbHNfRnVuY3MgICgqZ2V0X2dsb2JhbHNfZnVuY3MpKCBGVF9Nb2R1bGUgIG1vZHVsZSApOworICAgIFQxX0hpbnRzX0Z1bmNzICAgICAoKmdldF90MV9mdW5jcykgICAgICggRlRfTW9kdWxlICBtb2R1bGUgKTsKKyAgICBUMl9IaW50c19GdW5jcyAgICAgKCpnZXRfdDJfZnVuY3MpICAgICAoIEZUX01vZHVsZSAgbW9kdWxlICk7CisKKyAgfSBQU0hpbnRlcl9JbnRlcmZhY2U7CisKKyAgdHlwZWRlZiBQU0hpbnRlcl9JbnRlcmZhY2UqICBQU0hpbnRlcl9TZXJ2aWNlOworCisKKyNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKKworI2RlZmluZSBGVF9ERUZJTkVfUFNISU5URVJfSU5URVJGQUNFKCAgICAgICAgXAorICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGdldF9nbG9iYWxzX2Z1bmNzXywgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGdldF90MV9mdW5jc18sICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGdldF90Ml9mdW5jc18gKSAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgY29uc3QgUFNIaW50ZXJfSW50ZXJmYWNlICBjbGFzc18gPSAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdldF9nbG9iYWxzX2Z1bmNzXywgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdldF90MV9mdW5jc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdldF90Ml9mdW5jc18gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OworCisjZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLworCisjZGVmaW5lIEZUX0RFRklORV9QU0hJTlRFUl9JTlRFUkZBQ0UoICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGdldF9nbG9iYWxzX2Z1bmNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZ2V0X3QxX2Z1bmNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBnZXRfdDJfZnVuY3NfICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU0hpbnRlcl9JbnRlcmZhY2UqICBjbGF6eiApICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5nZXRfZ2xvYmFsc19mdW5jcyA9IGdldF9nbG9iYWxzX2Z1bmNzXzsgICAgICAgICBcCisgICAgY2xhenotPmdldF90MV9mdW5jcyAgICAgID0gZ2V0X3QxX2Z1bmNzXzsgICAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+Z2V0X3QyX2Z1bmNzICAgICAgPSBnZXRfdDJfZnVuY3NfOyAgICAgICAgICAgICAgXAorICB9CisKKyNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLworCitGVF9FTkRfSEVBREVSCisKKyNlbmRpZiAvKiBfX1BTSElOVFNfSF9fICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2YmRmLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2YmRmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY1YjUzNgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZiZGYuaApAQCAtMCwwICsxLDgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBzdmJkZi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhlIEZyZWVUeXBlIEJERiBzZXJ2aWNlcyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDMtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX19TVkJERl9IX18KKyNkZWZpbmUgX19TVkJERl9IX18KKworI2luY2x1ZGUgRlRfQkRGX0gKKyNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyNkZWZpbmUgRlRfU0VSVklDRV9JRF9CREYgICJiZGYiCisKKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKkZUX0JERl9HZXRDaGFyc2V0SWRGdW5jKSggRlRfRmFjZSAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICphY2hhcnNldF9lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAqYWNoYXJzZXRfcmVnaXN0cnkgKTsKKworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqRlRfQkRGX0dldFByb3BlcnR5RnVuYykoIEZUX0ZhY2UgICAgICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgICAgIHByb3BfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRGX1Byb3BlcnR5UmVjICAqYXByb3BlcnR5ICk7CisKKworICBGVF9ERUZJTkVfU0VSVklDRSggQkRGICkKKyAgeworICAgIEZUX0JERl9HZXRDaGFyc2V0SWRGdW5jICBnZXRfY2hhcnNldF9pZDsKKyAgICBGVF9CREZfR2V0UHJvcGVydHlGdW5jICAgZ2V0X3Byb3BlcnR5OworICB9OworCisKKyNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKKworI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9CREZSZWMoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfY2hhcnNldF9pZF8sICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Byb3BlcnR5XyApICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgY29uc3QgRlRfU2VydmljZV9CREZSZWMgIGNsYXNzXyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ2V0X2NoYXJzZXRfaWRfLCBnZXRfcHJvcGVydHlfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OworCisjZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLworCisjZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX0JERlJlYyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9jaGFyc2V0X2lkXywgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcHJvcGVydHlfICkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX1NlcnZpY2VfQkRGUmVjKiAgY2xhenogKSAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPmdldF9jaGFyc2V0X2lkID0gZ2V0X2NoYXJzZXRfaWRfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5nZXRfcHJvcGVydHkgICA9IGdldF9wcm9wZXJ0eV87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KKworICAvKiAqLworCisKK0ZUX0VORF9IRUFERVIKKworCisjZW5kaWYgLyogX19TVkJERl9IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZjaWQuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZjaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTUzNWE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmNpZC5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHN2Y2lkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgRnJlZVR5cGUgQ0lEIGZvbnQgc2VydmljZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwNy0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGVyZWsgQ2xlZ2cgYW5kIE1pY2hhZWwgVG9mdGRhbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX1NWQ0lEX0hfXworI2RlZmluZSBfX1NWQ0lEX0hfXworCisjaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKKworCitGVF9CRUdJTl9IRUFERVIKKworCisjZGVmaW5lIEZUX1NFUlZJQ0VfSURfQ0lEICAiQ0lEIgorCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpGVF9DSURfR2V0UmVnaXN0cnlPcmRlcmluZ1N1cHBsZW1lbnRGdW5jKSggRlRfRmFjZSAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgKnJlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgKm9yZGVyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgKnN1cHBsZW1lbnQgKTsKKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKkZUX0NJRF9HZXRJc0ludGVybmFsbHlDSURLZXllZEZ1bmMpKCBGVF9GYWNlICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgKmlzX2NpZCApOworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqRlRfQ0lEX0dldENJREZyb21HbHlwaEluZGV4RnVuYykoIEZUX0ZhY2UgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICpjaWQgKTsKKworICBGVF9ERUZJTkVfU0VSVklDRSggQ0lEICkKKyAgeworICAgIEZUX0NJRF9HZXRSZWdpc3RyeU9yZGVyaW5nU3VwcGxlbWVudEZ1bmMgIGdldF9yb3M7CisgICAgRlRfQ0lEX0dldElzSW50ZXJuYWxseUNJREtleWVkRnVuYyAgICAgICAgZ2V0X2lzX2NpZDsKKyAgICBGVF9DSURfR2V0Q0lERnJvbUdseXBoSW5kZXhGdW5jICAgICAgICAgICBnZXRfY2lkX2Zyb21fZ2x5cGhfaW5kZXg7CisgIH07CisKKworI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQworCisjZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX0NJRFJFQyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9yb3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfaXNfY2lkXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2NpZF9mcm9tX2dseXBoX2luZGV4XyApICAgICAgICAgICAgICAgXAorICBzdGF0aWMgY29uc3QgRlRfU2VydmljZV9DSURSZWMgY2xhc3NfID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ2V0X3Jvc18sIGdldF9pc19jaWRfLCBnZXRfY2lkX2Zyb21fZ2x5cGhfaW5kZXhfICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OworCisjZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLworCisjZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX0NJRFJFQyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9yb3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfaXNfY2lkXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2NpZF9mcm9tX2dseXBoX2luZGV4XyApICAgICAgICAgICAgICAgXAorICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZV9DSURSZWMqICBjbGF6eiApICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVF9VTlVTRUQoIGxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5nZXRfcm9zICAgICAgICAgICAgICAgICAgPSBnZXRfcm9zXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+Z2V0X2lzX2NpZCAgICAgICAgICAgICAgID0gZ2V0X2lzX2NpZF87ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPmdldF9jaWRfZnJvbV9nbHlwaF9pbmRleCA9IGdldF9jaWRfZnJvbV9nbHlwaF9pbmRleF87ICAgICAgICAgICAgXAorICB9CisKKyNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLworCisgIC8qICovCisKKworRlRfRU5EX0hFQURFUgorCisKKyNlbmRpZiAvKiBfX1NWQ0lEX0hfXyAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmZudGZtdC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmZudGZtdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YjM2MTcKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Zm50Zm10LmgKQEAgLTAsMCArMSw1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgc3ZmbnRmbXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoZSBGcmVlVHlwZSBmb250IGZvcm1hdCBzZXJ2aWNlIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAzLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fU1ZGTlRGTVRfSF9fCisjZGVmaW5lIF9fU1ZGTlRGTVRfSF9fCisKKyNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyAgLyoKKyAgICogIEEgdHJpdmlhbCBzZXJ2aWNlIHVzZWQgdG8gcmV0dXJuIHRoZSBuYW1lIG9mIGEgZmFjZSdzIGZvbnQgZHJpdmVyLAorICAgKiAgYWNjb3JkaW5nIHRvIHRoZSBYRnJlZTg2IG5vbWVuY2xhdHVyZS4gIE5vdGUgdGhhdCB0aGUgc2VydmljZSBkYXRhCisgICAqICBpcyBhIHNpbXBsZSBjb25zdGFudCBzdHJpbmcgcG9pbnRlci4KKyAgICovCisKKyNkZWZpbmUgRlRfU0VSVklDRV9JRF9GT05UX0ZPUk1BVCAgImZvbnQtZm9ybWF0IgorCisjZGVmaW5lIEZUX0ZPTlRfRk9STUFUX1RSVUVUWVBFICAiVHJ1ZVR5cGUiCisjZGVmaW5lIEZUX0ZPTlRfRk9STUFUX1RZUEVfMSAgICAiVHlwZSAxIgorI2RlZmluZSBGVF9GT05UX0ZPUk1BVF9CREYgICAgICAgIkJERiIKKyNkZWZpbmUgRlRfRk9OVF9GT1JNQVRfUENGICAgICAgICJQQ0YiCisjZGVmaW5lIEZUX0ZPTlRfRk9STUFUX1RZUEVfNDIgICAiVHlwZSA0MiIKKyNkZWZpbmUgRlRfRk9OVF9GT1JNQVRfQ0lEICAgICAgICJDSUQgVHlwZSAxIgorI2RlZmluZSBGVF9GT05UX0ZPUk1BVF9DRkYgICAgICAgIkNGRiIKKyNkZWZpbmUgRlRfRk9OVF9GT1JNQVRfUEZSICAgICAgICJQRlIiCisjZGVmaW5lIEZUX0ZPTlRfRk9STUFUX1dJTkZOVCAgICAiV2luZG93cyBGTlQiCisKKyAgLyogKi8KKworCitGVF9FTkRfSEVBREVSCisKKworI2VuZGlmIC8qIF9fU1ZGTlRGTVRfSF9fICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Z2xkaWN0LmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Z2xkaWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc4YmNhNQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZnbGRpY3QuaApAQCAtMCwwICsxLDg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBzdmdsZGljdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhlIEZyZWVUeXBlIGdseXBoIGRpY3Rpb25hcnkgc2VydmljZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDMtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX19TVkdMRElDVF9IX18KKyNkZWZpbmUgX19TVkdMRElDVF9IX18KKworI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICisKKworRlRfQkVHSU5fSEVBREVSCisKKworICAvKgorICAgKiAgQSBzZXJ2aWNlIHVzZWQgdG8gcmV0cmlldmUgZ2x5cGggbmFtZXMsIGFzIHdlbGwgYXMgdG8gZmluZCB0aGUKKyAgICogIGluZGV4IG9mIGEgZ2l2ZW4gZ2x5cGggbmFtZSBpbiBhIGZvbnQuCisgICAqCisgICAqLworCisjZGVmaW5lIEZUX1NFUlZJQ0VfSURfR0xZUEhfRElDVCAgImdseXBoLWRpY3QiCisKKworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqRlRfR2x5cGhEaWN0X0dldE5hbWVGdW5jKSggRlRfRmFjZSAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgYnVmZmVyX21heCApOworCisgIHR5cGVkZWYgRlRfVUludAorICAoKkZUX0dseXBoRGljdF9OYW1lSW5kZXhGdW5jKSggRlRfRmFjZSAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmluZyogIGdseXBoX25hbWUgKTsKKworCisgIEZUX0RFRklORV9TRVJWSUNFKCBHbHlwaERpY3QgKQorICB7CisgICAgRlRfR2x5cGhEaWN0X0dldE5hbWVGdW5jICAgIGdldF9uYW1lOworICAgIEZUX0dseXBoRGljdF9OYW1lSW5kZXhGdW5jICBuYW1lX2luZGV4OyAgLyogb3B0aW9uYWwgKi8KKyAgfTsKKworCisjaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCisKKyNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfR0xZUEhESUNUUkVDKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9uYW1lXywgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9pbmRleF8pICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfR2x5cGhEaWN0UmVjICBjbGFzc18gPSAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ2V0X25hbWVfLCBuYW1lX2luZGV4XyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsKKworI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KKworI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9HTFlQSERJQ1RSRUMoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X25hbWVfLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2luZGV4XykgICAgICAgICAgICAgICAgICAgXAorICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlX0dseXBoRGljdFJlYyogIGNsYXp6ICkgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5nZXRfbmFtZSAgID0gZ2V0X25hbWVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPm5hbWVfaW5kZXggPSBuYW1lX2luZGV4XzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KKworICAvKiAqLworCisKK0ZUX0VORF9IRUFERVIKKworCisjZW5kaWYgLyogX19TVkdMRElDVF9IX18gKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZneHZhbC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmd4dmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljYzNiNwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZneHZhbC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHN2Z3h2YWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGcmVlVHlwZSBBUEkgZm9yIHZhbGlkYXRpbmcgVHJ1ZVR5cGVHWC9BQVQgdGFibGVzIChzcGVjaWZpY2F0aW9uKS4gICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwNC0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4gICAgICAgICovCisvKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgICAgICAqLworLyogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX19TVkdYVkFMX0hfXworI2RlZmluZSBfX1NWR1hWQUxfSF9fCisKKyNpbmNsdWRlIEZUX0dYX1ZBTElEQVRFX0gKKyNpbmNsdWRlIEZUX0lOVEVSTkFMX1ZBTElEQVRFX0gKKworRlRfQkVHSU5fSEVBREVSCisKKworI2RlZmluZSBGVF9TRVJWSUNFX0lEX0dYX1ZBTElEQVRFICAgICAgICAgICAidHJ1ZXR5cGVneC12YWxpZGF0ZSIKKyNkZWZpbmUgRlRfU0VSVklDRV9JRF9DTEFTU0lDS0VSTl9WQUxJREFURSAgImNsYXNzaWNrZXJuLXZhbGlkYXRlIgorCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpneHZfdmFsaWRhdGVfZnVuYykoIEZUX0ZhY2UgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGd4X2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgIHRhYmxlc1tGVF9WQUxJREFURV9HWF9MRU5HVEhdLAorICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIHRhYmxlX2xlbmd0aCApOworCisKKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKmNrZXJuX3ZhbGlkYXRlX2Z1bmMpKCBGVF9GYWNlICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGNrZXJuX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgKmNrZXJuX3RhYmxlICk7CisKKworICBGVF9ERUZJTkVfU0VSVklDRSggR1h2YWxpZGF0ZSApCisgIHsKKyAgICBneHZfdmFsaWRhdGVfZnVuYyAgdmFsaWRhdGU7CisgIH07CisKKyAgRlRfREVGSU5FX1NFUlZJQ0UoIENLRVJOdmFsaWRhdGUgKQorICB7CisgICAgY2tlcm5fdmFsaWRhdGVfZnVuYyAgdmFsaWRhdGU7CisgIH07CisKKyAgLyogKi8KKworCitGVF9FTkRfSEVBREVSCisKKworI2VuZGlmIC8qIF9fU1ZHWFZBTF9IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZrZXJuLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2a2Vybi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMjZmMTUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2a2Vybi5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHN2a2Vybi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgRnJlZVR5cGUgS2VybmluZyBzZXJ2aWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwNi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX1NWS0VSTl9IX18KKyNkZWZpbmUgX19TVktFUk5fSF9fCisKKyNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAorI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFCTEVTX0gKKworCitGVF9CRUdJTl9IRUFERVIKKworI2RlZmluZSBGVF9TRVJWSUNFX0lEX0tFUk5JTkcgICJrZXJuaW5nIgorCisKKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKkZUX0tlcm5pbmdfVHJhY2tHZXRGdW5jKSggRlRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICBwb2ludF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBkZWdyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGFrZXJuaW5nICk7CisKKyAgRlRfREVGSU5FX1NFUlZJQ0UoIEtlcm5pbmcgKQorICB7CisgICAgRlRfS2VybmluZ19UcmFja0dldEZ1bmMgIGdldF90cmFjazsKKyAgfTsKKworICAvKiAqLworCisKK0ZUX0VORF9IRUFERVIKKworCisjZW5kaWYgLyogX19TVktFUk5fSF9fICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2bW0uaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyY2VjZmIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2bW0uaApAQCAtMCwwICsxLDExMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgc3ZtbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoZSBGcmVlVHlwZSBNdWx0aXBsZSBNYXN0ZXJzIGFuZCBHWCB2YXIgc2VydmljZXMgKHNwZWNpZmljYXRpb24pLiAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAzLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fU1ZNTV9IX18KKyNkZWZpbmUgX19TVk1NX0hfXworCisjaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKKworCitGVF9CRUdJTl9IRUFERVIKKworCisgIC8qCisgICAqICBBIHNlcnZpY2UgdXNlZCB0byBtYW5hZ2UgbXVsdGlwbGUtbWFzdGVycyBkYXRhIGluIGEgZ2l2ZW4gZmFjZS4KKyAgICoKKyAgICogIFNlZSB0aGUgcmVsYXRlZCBBUElzIGluIGBmdG1tLmgnIChGVF9NVUxUSVBMRV9NQVNURVJTX0gpLgorICAgKgorICAgKi8KKworI2RlZmluZSBGVF9TRVJWSUNFX0lEX01VTFRJX01BU1RFUlMgICJtdWx0aS1tYXN0ZXJzIgorCisKKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKkZUX0dldF9NTV9GdW5jKSggRlRfRmFjZSAgICAgICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgIEZUX011bHRpX01hc3RlciogIG1hc3RlciApOworCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpGVF9HZXRfTU1fVmFyX0Z1bmMpKCBGVF9GYWNlICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NTV9WYXIqICAqbWFzdGVyICk7CisKKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKkZUX1NldF9NTV9EZXNpZ25fRnVuYykoIEZUX0ZhY2UgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBudW1fY29vcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICBjb29yZHMgKTsKKworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqRlRfU2V0X1Zhcl9EZXNpZ25fRnVuYykoIEZUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBudW1fY29vcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApOworCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpGVF9TZXRfTU1fQmxlbmRfRnVuYykoIEZUX0ZhY2UgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIG51bV9jb29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgY29vcmRzICk7CisKKworICBGVF9ERUZJTkVfU0VSVklDRSggTXVsdGlNYXN0ZXJzICkKKyAgeworICAgIEZUX0dldF9NTV9GdW5jICAgICAgICAgIGdldF9tbTsKKyAgICBGVF9TZXRfTU1fRGVzaWduX0Z1bmMgICBzZXRfbW1fZGVzaWduOworICAgIEZUX1NldF9NTV9CbGVuZF9GdW5jICAgIHNldF9tbV9ibGVuZDsKKyAgICBGVF9HZXRfTU1fVmFyX0Z1bmMgICAgICBnZXRfbW1fdmFyOworICAgIEZUX1NldF9WYXJfRGVzaWduX0Z1bmMgIHNldF92YXJfZGVzaWduOworICB9OworCisKKyNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKKworI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9NVUxUSU1BU1RFUlNSRUMoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbW1fLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X21tX2Rlc2lnbl8sICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9tbV9ibGVuZF8sICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbW1fdmFyXywgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3Zhcl9kZXNpZ25fICkgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgY29uc3QgRlRfU2VydmljZV9NdWx0aU1hc3RlcnNSZWMgIGNsYXNzXyA9ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ2V0X21tXywgc2V0X21tX2Rlc2lnbl8sIHNldF9tbV9ibGVuZF8sIGdldF9tbV92YXJfLCBzZXRfdmFyX2Rlc2lnbl8gICAgXAorICB9OworCisjZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLworCisjZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX01VTFRJTUFTVEVSU1JFQyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9tbV8sICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfbW1fZGVzaWduXywgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X21tX2JsZW5kXywgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9tbV92YXJfLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfdmFyX2Rlc2lnbl8gKSAgICAgICAgICAgICAgICBcCisgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX1NlcnZpY2VfTXVsdGlNYXN0ZXJzUmVjKiAgY2xhenogKSAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPmdldF9tbSAgICAgICAgID0gZ2V0X21tXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5zZXRfbW1fZGVzaWduICA9IHNldF9tbV9kZXNpZ25fOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+c2V0X21tX2JsZW5kICAgPSBzZXRfbW1fYmxlbmRfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPmdldF9tbV92YXIgICAgID0gZ2V0X21tX3Zhcl87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5zZXRfdmFyX2Rlc2lnbiA9IHNldF92YXJfZGVzaWduXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KKworICAvKiAqLworCisKK0ZUX0VORF9IRUFERVIKKworI2VuZGlmIC8qIF9fU1ZNTV9IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZvdHZhbC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm90dmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgyYTY0MgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZvdHZhbC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHN2b3R2YWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgRnJlZVR5cGUgT3BlblR5cGUgdmFsaWRhdGlvbiBzZXJ2aWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwNC0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX1NWT1RWQUxfSF9fCisjZGVmaW5lIF9fU1ZPVFZBTF9IX18KKworI2luY2x1ZGUgRlRfT1BFTlRZUEVfVkFMSURBVEVfSAorI2luY2x1ZGUgRlRfSU5URVJOQUxfVkFMSURBVEVfSAorCitGVF9CRUdJTl9IRUFERVIKKworCisjZGVmaW5lIEZUX1NFUlZJQ0VfSURfT1BFTlRZUEVfVkFMSURBVEUgICJvcGVudHlwZS12YWxpZGF0ZSIKKworCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpvdHZfdmFsaWRhdGVfZnVuYykoIEZUX0ZhY2Ugdm9sYXRpbGUgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICBvdF9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgICAgKmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICAgICpnZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgICAqZ3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgICAgKmdzdWIsCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICAgICpqc3RmICk7CisKKworICBGVF9ERUZJTkVfU0VSVklDRSggT1R2YWxpZGF0ZSApCisgIHsKKyAgICBvdHZfdmFsaWRhdGVfZnVuYyAgdmFsaWRhdGU7CisgIH07CisKKyAgLyogKi8KKworCitGVF9FTkRfSEVBREVSCisKKworI2VuZGlmIC8qIF9fU1ZPVFZBTF9IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZwZnIuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZwZnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGViMTY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBmci5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHN2cGZyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbnRlcm5hbCBQRlIgc2VydmljZSBmdW5jdGlvbnMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwMy0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX1NWUEZSX0hfXworI2RlZmluZSBfX1NWUEZSX0hfXworCisjaW5jbHVkZSBGVF9QRlJfSAorI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICisKKworRlRfQkVHSU5fSEVBREVSCisKKworI2RlZmluZSBGVF9TRVJWSUNFX0lEX1BGUl9NRVRSSUNTICAicGZyLW1ldHJpY3MiCisKKworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqRlRfUEZSX0dldE1ldHJpY3NGdW5jKSggRlRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAqYW91dGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICphbWV0cmljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgKmF4X3NjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAqYXlfc2NhbGUgKTsKKworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqRlRfUEZSX0dldEtlcm5pbmdGdW5jKSggRlRfRmFjZSAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciAgKmF2ZWN0b3IgKTsKKworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqRlRfUEZSX0dldEFkdmFuY2VGdW5jKSggRlRfRmFjZSAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGdpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAqYWFkdmFuY2UgKTsKKworCisgIEZUX0RFRklORV9TRVJWSUNFKCBQZnJNZXRyaWNzICkKKyAgeworICAgIEZUX1BGUl9HZXRNZXRyaWNzRnVuYyAgZ2V0X21ldHJpY3M7CisgICAgRlRfUEZSX0dldEtlcm5pbmdGdW5jICBnZXRfa2VybmluZzsKKyAgICBGVF9QRlJfR2V0QWR2YW5jZUZ1bmMgIGdldF9hZHZhbmNlOworCisgIH07CisKKyAvKiAqLworCitGVF9FTkRfSEVBREVSCisKKyNlbmRpZiAvKiBfX1NWUEZSX0hfXyAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBvc3RubS5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBvc3RubS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4OWY3OWUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cG9zdG5tLmgKQEAgLTAsMCArMSw4MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgc3Zwb3N0bm0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoZSBGcmVlVHlwZSBQb3N0U2NyaXB0IG5hbWUgc2VydmljZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAzLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fU1ZQT1NUTk1fSF9fCisjZGVmaW5lIF9fU1ZQT1NUTk1fSF9fCisKKyNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAorCisKK0ZUX0JFR0lOX0hFQURFUgorCisgIC8qCisgICAqICBBIHRyaXZpYWwgc2VydmljZSB1c2VkIHRvIHJldHJpZXZlIHRoZSBQb3N0U2NyaXB0IG5hbWUgb2YgYSBnaXZlbgorICAgKiAgZm9udCB3aGVuIGF2YWlsYWJsZS4gIFRoZSBgZ2V0X25hbWUnIGZpZWxkIHNob3VsZCBuZXZlciBiZSBOVUxMLgorICAgKgorICAgKiAgVGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24gY2FuIHJldHVybiBOVUxMIHRvIGluZGljYXRlIHRoYXQgdGhlCisgICAqICBQb3N0U2NyaXB0IG5hbWUgaXMgbm90IGF2YWlsYWJsZS4KKyAgICoKKyAgICogIFRoZSBuYW1lIGlzIG93bmVkIGJ5IHRoZSBmYWNlIGFuZCB3aWxsIGJlIGRlc3Ryb3llZCB3aXRoIGl0LgorICAgKi8KKworI2RlZmluZSBGVF9TRVJWSUNFX0lEX1BPU1RTQ1JJUFRfRk9OVF9OQU1FICAicG9zdHNjcmlwdC1mb250LW5hbWUiCisKKworICB0eXBlZGVmIGNvbnN0IGNoYXIqCisgICgqRlRfUHNOYW1lX0dldEZ1bmMpKCBGVF9GYWNlICBmYWNlICk7CisKKworICBGVF9ERUZJTkVfU0VSVklDRSggUHNGb250TmFtZSApCisgIHsKKyAgICBGVF9Qc05hbWVfR2V0RnVuYyAgZ2V0X3BzX2ZvbnRfbmFtZTsKKyAgfTsKKworCisjaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCisKKyNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfUFNGT05UTkFNRVJFQyggY2xhc3NfLCBnZXRfcHNfZm9udF9uYW1lXyApIFwKKyAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfUHNGb250TmFtZVJlYyAgY2xhc3NfID0gICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnZXRfcHNfZm9udF9uYW1lXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsKKworI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KKworI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9QU0ZPTlROQU1FUkVDKCBjbGFzc18sIGdldF9wc19mb250X25hbWVfICkgXAorICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgICAgICAgIGxpYnJhcnksICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VfUHNGb250TmFtZVJlYyogIGNsYXp6ICkgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZUX1VOVVNFRCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5nZXRfcHNfZm9udF9uYW1lID0gZ2V0X3BzX2ZvbnRfbmFtZV87ICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLworCisgIC8qICovCisKKworRlRfRU5EX0hFQURFUgorCisKKyNlbmRpZiAvKiBfX1NWUE9TVE5NX0hfXyAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnByb3AuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwcm9wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlmMDdjZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwcm9wLmgKQEAgLTAsMCArMSw4MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgc3Zwcm9wLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoZSBGcmVlVHlwZSBwcm9wZXJ0eSBzZXJ2aWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDEyLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fU1ZQUk9QX0hfXworI2RlZmluZSBfX1NWUFJPUF9IX18KKworCitGVF9CRUdJTl9IRUFERVIKKworCisjZGVmaW5lIEZUX1NFUlZJQ0VfSURfUFJPUEVSVElFUyAgInByb3BlcnRpZXMiCisKKworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqRlRfUHJvcGVydGllc19TZXRGdW5jKSggRlRfTW9kdWxlICAgIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgcHJvcGVydHlfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiAgdmFsdWUgKTsKKworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqRlRfUHJvcGVydGllc19HZXRGdW5jKSggRlRfTW9kdWxlICAgIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgcHJvcGVydHlfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgdmFsdWUgKTsKKworCisgIEZUX0RFRklORV9TRVJWSUNFKCBQcm9wZXJ0aWVzICkKKyAgeworICAgIEZUX1Byb3BlcnRpZXNfU2V0RnVuYyAgc2V0X3Byb3BlcnR5OworICAgIEZUX1Byb3BlcnRpZXNfR2V0RnVuYyAgZ2V0X3Byb3BlcnR5OworICB9OworCisKKyNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKKworI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9QUk9QRVJUSUVTUkVDKCBjbGFzc18sICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3Byb3BlcnR5XywgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9wcm9wZXJ0eV8gKSAgXAorICBzdGF0aWMgY29uc3QgRlRfU2VydmljZV9Qcm9wZXJ0aWVzUmVjICBjbGFzc18gPSAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2V0X3Byb3BlcnR5XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdldF9wcm9wZXJ0eV8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsKKworI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KKworI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9QUk9QRVJUSUVTUkVDKCBjbGFzc18sICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3Byb3BlcnR5XywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9wcm9wZXJ0eV8gKSAgICAgICAgXAorICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9TZXJ2aWNlX1Byb3BlcnRpZXNSZWMqICBjbGF6eiApICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5zZXRfcHJvcGVydHkgPSBzZXRfcHJvcGVydHlfOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+Z2V0X3Byb3BlcnR5ID0gZ2V0X3Byb3BlcnR5XzsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCisKKyAgLyogKi8KKworCitGVF9FTkRfSEVBREVSCisKKworI2VuZGlmIC8qIF9fU1ZQUk9QX0hfXyAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBzY21hcC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBzY21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZGE2ZTEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNjbWFwLmgKQEAgLTAsMCArMSwxNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHN2cHNjbWFwLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgRnJlZVR5cGUgUG9zdFNjcmlwdCBjaGFybWFwIHNlcnZpY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwMy0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX1NWUFNDTUFQX0hfXworI2RlZmluZSBfX1NWUFNDTUFQX0hfXworCisjaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKKworCitGVF9CRUdJTl9IRUFERVIKKworCisjZGVmaW5lIEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9DTUFQUyAgInBvc3RzY3JpcHQtY21hcHMiCisKKworICAvKgorICAgKiAgQWRvYmUgZ2x5cGggbmFtZSB0byB1bmljb2RlIHZhbHVlLgorICAgKi8KKyAgdHlwZWRlZiBGVF9VSW50MzIKKyAgKCpQU19Vbmljb2RlX1ZhbHVlRnVuYykoIGNvbnN0IGNoYXIqICBnbHlwaF9uYW1lICk7CisKKyAgLyoKKyAgICogIE1hY2ludG9zaCBuYW1lIGlkIHRvIGdseXBoIG5hbWUuICBOVUxMIGlmIGludmFsaWQgaW5kZXguCisgICAqLworICB0eXBlZGVmIGNvbnN0IGNoYXIqCisgICgqUFNfTWFjaW50b3NoX05hbWVGdW5jKSggRlRfVUludCAgbmFtZV9pbmRleCApOworCisgIC8qCisgICAqICBBZG9iZSBzdGFuZGFyZCBzdHJpbmcgSUQgdG8gZ2x5cGggbmFtZS4gIE5VTEwgaWYgaW52YWxpZCBpbmRleC4KKyAgICovCisgIHR5cGVkZWYgY29uc3QgY2hhcioKKyAgKCpQU19BZG9iZV9TdGRfU3RyaW5nc0Z1bmMpKCBGVF9VSW50ICBzdHJpbmdfaW5kZXggKTsKKworCisgIC8qCisgICAqICBTaW1wbGUgdW5pY29kZSAtPiBnbHlwaCBpbmRleCBjaGFybWFwIGJ1aWx0IGZyb20gZm9udCBnbHlwaCBuYW1lcworICAgKiAgdGFibGUuCisgICAqLworICB0eXBlZGVmIHN0cnVjdCAgUFNfVW5pTWFwXworICB7CisgICAgRlRfVUludDMyICB1bmljb2RlOyAgICAgIC8qIGJpdCAzMSBzZXQ6IGlzIGdseXBoIHZhcmlhbnQgKi8KKyAgICBGVF9VSW50ICAgIGdseXBoX2luZGV4OworCisgIH0gUFNfVW5pTWFwOworCisKKyAgdHlwZWRlZiBzdHJ1Y3QgUFNfVW5pY29kZXNSZWNfKiAgUFNfVW5pY29kZXM7CisKKyAgdHlwZWRlZiBzdHJ1Y3QgIFBTX1VuaWNvZGVzUmVjXworICB7CisgICAgRlRfQ01hcFJlYyAgY21hcDsKKyAgICBGVF9VSW50ICAgICBudW1fbWFwczsKKyAgICBQU19VbmlNYXAqICBtYXBzOworCisgIH0gUFNfVW5pY29kZXNSZWM7CisKKworICAvKgorICAgKiAgQSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGEgZ2x5cGggbmFtZSBmb3IgYSBnaXZlbiBpbmRleC4gIFJldHVybnMKKyAgICogIE5VTEwgaWYgaW52YWxpZCBpbmRleC4KKyAgICovCisgIHR5cGVkZWYgY29uc3QgY2hhcioKKyAgKCpQU19HZXRHbHlwaE5hbWVGdW5jKSggRlRfUG9pbnRlciAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgc3RyaW5nX2luZGV4ICk7CisKKyAgLyoKKyAgICogIEEgZnVuY3Rpb24gdXNlZCB0byByZWxlYXNlIHRoZSBnbHlwaCBuYW1lIHJldHVybmVkIGJ5CisgICAqICBQU19HZXRHbHlwaE5hbWVGdW5jLCB3aGVuIG5lZWRlZAorICAgKi8KKyAgdHlwZWRlZiB2b2lkCisgICgqUFNfRnJlZUdseXBoTmFtZUZ1bmMpKCBGVF9Qb2ludGVyICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIG5hbWUgKTsKKworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqUFNfVW5pY29kZXNfSW5pdEZ1bmMpKCBGVF9NZW1vcnkgICAgICAgICAgICAgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNfVW5pY29kZXMgICAgICAgICAgIHVuaWNvZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgICAgIG51bV9nbHlwaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQU19HZXRHbHlwaE5hbWVGdW5jICAgZ2V0X2dseXBoX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQU19GcmVlR2x5cGhOYW1lRnVuYyAgZnJlZV9nbHlwaF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgICAgICAgICAgIGdseXBoX2RhdGEgKTsKKworICB0eXBlZGVmIEZUX1VJbnQKKyAgKCpQU19Vbmljb2Rlc19DaGFySW5kZXhGdW5jKSggUFNfVW5pY29kZXMgIHVuaWNvZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICAgdW5pY29kZSApOworCisgIHR5cGVkZWYgRlRfVUludDMyCisgICgqUFNfVW5pY29kZXNfQ2hhck5leHRGdW5jKSggUFNfVW5pY29kZXMgIHVuaWNvZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgICp1bmljb2RlICk7CisKKworICBGVF9ERUZJTkVfU0VSVklDRSggUHNDTWFwcyApCisgIHsKKyAgICBQU19Vbmljb2RlX1ZhbHVlRnVuYyAgICAgICB1bmljb2RlX3ZhbHVlOworCisgICAgUFNfVW5pY29kZXNfSW5pdEZ1bmMgICAgICAgdW5pY29kZXNfaW5pdDsKKyAgICBQU19Vbmljb2Rlc19DaGFySW5kZXhGdW5jICB1bmljb2Rlc19jaGFyX2luZGV4OworICAgIFBTX1VuaWNvZGVzX0NoYXJOZXh0RnVuYyAgIHVuaWNvZGVzX2NoYXJfbmV4dDsKKworICAgIFBTX01hY2ludG9zaF9OYW1lRnVuYyAgICAgIG1hY2ludG9zaF9uYW1lOworICAgIFBTX0Fkb2JlX1N0ZF9TdHJpbmdzRnVuYyAgIGFkb2JlX3N0ZF9zdHJpbmdzOworICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0KiAgICAgIGFkb2JlX3N0ZF9lbmNvZGluZzsKKyAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCogICAgICBhZG9iZV9leHBlcnRfZW5jb2Rpbmc7CisgIH07CisKKworI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQworCisjZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX1BTQ01BUFNSRUMoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlX3ZhbHVlXywgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZXNfaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGVzX2NoYXJfaW5kZXhfLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2Rlc19jaGFyX25leHRfLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjaW50b3NoX25hbWVfLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkb2JlX3N0ZF9zdHJpbmdzXywgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZG9iZV9zdGRfZW5jb2RpbmdfLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRvYmVfZXhwZXJ0X2VuY29kaW5nXyApICAgICAgICAgICAgICBcCisgIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX1BzQ01hcHNSZWMgIGNsYXNzXyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1bmljb2RlX3ZhbHVlXywgdW5pY29kZXNfaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5pY29kZXNfY2hhcl9pbmRleF8sIHVuaWNvZGVzX2NoYXJfbmV4dF8sIG1hY2ludG9zaF9uYW1lXywgICAgICAgICAgICAgXAorICAgIGFkb2JlX3N0ZF9zdHJpbmdzXywgYWRvYmVfc3RkX2VuY29kaW5nXywgYWRvYmVfZXhwZXJ0X2VuY29kaW5nXyAgICAgICAgIFwKKyAgfTsKKworI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KKworI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9QU0NNQVBTUkVDKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZV92YWx1ZV8sICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGVzX2luaXRfLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2Rlc19jaGFyX2luZGV4XywgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZXNfY2hhcl9uZXh0XywgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY2ludG9zaF9uYW1lXywgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZG9iZV9zdGRfc3RyaW5nc18sICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRvYmVfc3RkX2VuY29kaW5nXywgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkb2JlX2V4cGVydF9lbmNvZGluZ18gKSAgICAgICAgICAgICAgXAorICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZV9Qc0NNYXBzUmVjKiAgY2xhenogKSAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVF9VTlVTRUQoIGxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT51bmljb2RlX3ZhbHVlICAgICAgICAgPSB1bmljb2RlX3ZhbHVlXzsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+dW5pY29kZXNfaW5pdCAgICAgICAgID0gdW5pY29kZXNfaW5pdF87ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPnVuaWNvZGVzX2NoYXJfaW5kZXggICA9IHVuaWNvZGVzX2NoYXJfaW5kZXhfOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT51bmljb2Rlc19jaGFyX25leHQgICAgPSB1bmljb2Rlc19jaGFyX25leHRfOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+bWFjaW50b3NoX25hbWUgICAgICAgID0gbWFjaW50b3NoX25hbWVfOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPmFkb2JlX3N0ZF9zdHJpbmdzICAgICA9IGFkb2JlX3N0ZF9zdHJpbmdzXzsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5hZG9iZV9zdGRfZW5jb2RpbmcgICAgPSBhZG9iZV9zdGRfZW5jb2RpbmdfOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+YWRvYmVfZXhwZXJ0X2VuY29kaW5nID0gYWRvYmVfZXhwZXJ0X2VuY29kaW5nXzsgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCisKKyAgLyogKi8KKworCitGVF9FTkRfSEVBREVSCisKKworI2VuZGlmIC8qIF9fU1ZQU0NNQVBfSF9fICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNpbmZvLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNpbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUyYTI2NgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2luZm8uaApAQCAtMCwwICsxLDExMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgc3Zwc2luZm8uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoZSBGcmVlVHlwZSBQb3N0U2NyaXB0IGluZm8gc2VydmljZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAzLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fU1ZQU0lORk9fSF9fCisjZGVmaW5lIF9fU1ZQU0lORk9fSF9fCisKKyNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAorI2luY2x1ZGUgRlRfSU5URVJOQUxfVFlQRTFfVFlQRVNfSAorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyNkZWZpbmUgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0lORk8gICJwb3N0c2NyaXB0LWluZm8iCisKKworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqUFNfR2V0Rm9udEluZm9GdW5jKSggRlRfRmFjZSAgICAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFBTX0ZvbnRJbmZvUmVjKiAgYWZvbnRfaW5mbyApOworCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpQU19HZXRGb250RXh0cmFGdW5jKSggRlRfRmFjZSAgICAgICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUFNfRm9udEV4dHJhUmVjKiAgYWZvbnRfZXh0cmEgKTsKKworICB0eXBlZGVmIEZUX0ludAorICAoKlBTX0hhc0dseXBoTmFtZXNGdW5jKSggRlRfRmFjZSAgZmFjZSApOworCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpQU19HZXRGb250UHJpdmF0ZUZ1bmMpKCBGVF9GYWNlICAgICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU19Qcml2YXRlUmVjKiAgYWZvbnRfcHJpdmF0ZSApOworCisgIHR5cGVkZWYgRlRfTG9uZworICAoKlBTX0dldEZvbnRWYWx1ZUZ1bmMpKCBGVF9GYWNlICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBTX0RpY3RfS2V5cyAga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICB2YWx1ZV9sZW4gKTsKKworCisgIEZUX0RFRklORV9TRVJWSUNFKCBQc0luZm8gKQorICB7CisgICAgUFNfR2V0Rm9udEluZm9GdW5jICAgICBwc19nZXRfZm9udF9pbmZvOworICAgIFBTX0dldEZvbnRFeHRyYUZ1bmMgICAgcHNfZ2V0X2ZvbnRfZXh0cmE7CisgICAgUFNfSGFzR2x5cGhOYW1lc0Z1bmMgICBwc19oYXNfZ2x5cGhfbmFtZXM7CisgICAgUFNfR2V0Rm9udFByaXZhdGVGdW5jICBwc19nZXRfZm9udF9wcml2YXRlOworICAgIFBTX0dldEZvbnRWYWx1ZUZ1bmMgICAgcHNfZ2V0X2ZvbnRfdmFsdWU7CisgIH07CisKKworI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQworCisjZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX1BTSU5GT1JFQyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZm9udF9pbmZvXywgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2dldF9mb250X2V4dHJhXywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2dseXBoX25hbWVzXywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZm9udF9wcml2YXRlXywgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9mb250X3ZhbHVlXyApICAgICAgICAgICBcCisgIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX1BzSW5mb1JlYyAgY2xhc3NfID0gICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdldF9mb250X2luZm9fLCBwc19nZXRfZm9udF9leHRyYV8sIGhhc19nbHlwaF9uYW1lc18sICAgICAgICBcCisgICAgZ2V0X2ZvbnRfcHJpdmF0ZV8sIGdldF9mb250X3ZhbHVlXyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsKKworI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KKworI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9QU0lORk9SRUMoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2ZvbnRfaW5mb18sICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19nZXRfZm9udF9leHRyYV8sICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19nbHlwaF9uYW1lc18sICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2ZvbnRfcHJpdmF0ZV8sICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZm9udF92YWx1ZV8gKSAgICAgICAgICAgXAorICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgICBsaWJyYXJ5LCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlX1BzSW5mb1JlYyogIGNsYXp6ICkgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5wc19nZXRfZm9udF9pbmZvICAgID0gZ2V0X2ZvbnRfaW5mb187ICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPnBzX2dldF9mb250X2V4dHJhICAgPSBwc19nZXRfZm9udF9leHRyYV87ICAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+cHNfaGFzX2dseXBoX25hbWVzICA9IGhhc19nbHlwaF9uYW1lc187ICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5wc19nZXRfZm9udF9wcml2YXRlID0gZ2V0X2ZvbnRfcHJpdmF0ZV87ICAgICAgICAgICAgICBcCisgICAgY2xhenotPnBzX2dldF9mb250X3ZhbHVlICAgPSBnZXRfZm9udF92YWx1ZV87ICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KKworICAvKiAqLworCisKK0ZUX0VORF9IRUFERVIKKworCisjZW5kaWYgLyogX19TVlBTSU5GT19IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZzZm50LmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2c2ZudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MmFlMWMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2c2ZudC5oCkBAIC0wLDAgKzEsMTAzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBzdnNmbnQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhlIEZyZWVUeXBlIFNGTlQgdGFibGUgbG9hZGluZyBzZXJ2aWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDMtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX19TVlNGTlRfSF9fCisjZGVmaW5lIF9fU1ZTRk5UX0hfXworCisjaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKKyNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBQkxFU19ICisKKworRlRfQkVHSU5fSEVBREVSCisKKworICAvKgorICAgKiAgU0ZOVCB0YWJsZSBsb2FkaW5nIHNlcnZpY2UuCisgICAqLworCisjZGVmaW5lIEZUX1NFUlZJQ0VfSURfU0ZOVF9UQUJMRSAgInNmbnQtdGFibGUiCisKKworICAvKgorICAgKiBVc2VkIHRvIGltcGxlbWVudCBGVF9Mb2FkX1NmbnRfVGFibGUoKS4KKyAgICovCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpGVF9TRk5UX1RhYmxlTG9hZEZ1bmMpKCBGVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICBsZW5ndGggKTsKKworICAvKgorICAgKiBVc2VkIHRvIGltcGxlbWVudCBGVF9HZXRfU2ZudF9UYWJsZSgpLgorICAgKi8KKyAgdHlwZWRlZiB2b2lkKgorICAoKkZUX1NGTlRfVGFibGVHZXRGdW5jKSggRlRfRmFjZSAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZm50X1RhZyAgdGFnICk7CisKKworICAvKgorICAgKiBVc2VkIHRvIGltcGxlbWVudCBGVF9TZm50X1RhYmxlX0luZm8oKS4KKyAgICovCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpGVF9TRk5UX1RhYmxlSW5mb0Z1bmMpKCBGVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBpZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICp0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICpvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICpsZW5ndGggKTsKKworCisgIEZUX0RFRklORV9TRVJWSUNFKCBTRk5UX1RhYmxlICkKKyAgeworICAgIEZUX1NGTlRfVGFibGVMb2FkRnVuYyAgbG9hZF90YWJsZTsKKyAgICBGVF9TRk5UX1RhYmxlR2V0RnVuYyAgIGdldF90YWJsZTsKKyAgICBGVF9TRk5UX1RhYmxlSW5mb0Z1bmMgIHRhYmxlX2luZm87CisgIH07CisKKworI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQworCisjZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX1NGTlRfVEFCTEVSRUMoIGNsYXNzXywgbG9hZF8sIGdldF8sIGluZm9fICkgIFwKKyAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfU0ZOVF9UYWJsZVJlYyAgY2xhc3NfID0gICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbG9hZF8sIGdldF8sIGluZm9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsKKworI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KKworI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9TRk5UX1RBQkxFUkVDKCBjbGFzc18sIGxvYWRfLCBnZXRfLCBpbmZvXyApIFwKKyAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfU2VydmljZV9TRk5UX1RhYmxlUmVjKiAgY2xhenogKSAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+bG9hZF90YWJsZSA9IGxvYWRfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPmdldF90YWJsZSAgPSBnZXRfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNsYXp6LT50YWJsZV9pbmZvID0gaW5mb187ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KKworICAvKiAqLworCisKK0ZUX0VORF9IRUFERVIKKworCisjZW5kaWYgLyogX19TVlNGTlRfSF9fICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRjbWFwLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRjbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q5NWI5YQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGNtYXAuaApAQCAtMCwwICsxLDEwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgc3Z0dGNtYXAuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoZSBGcmVlVHlwZSBUcnVlVHlwZS9zZm50IGNtYXAgZXh0cmEgaW5mb3JtYXRpb24gc2VydmljZS4gICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAzLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNYXNhdGFrZSBZQU1BVE8sIFJlZGhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERldmVsb3BtZW50IG9mIHRoaXMgc2VydmljZSBpcyBzdXBwb3J0IG9mCisgICBJbmZvcm1hdGlvbi10ZWNobm9sb2d5IFByb21vdGlvbiBBZ2VuY3ksIEphcGFuLiAqLworCisjaWZuZGVmIF9fU1ZUVENNQVBfSF9fCisjZGVmaW5lIF9fU1ZUVENNQVBfSF9fCisKKyNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAorI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFCTEVTX0gKKworCitGVF9CRUdJTl9IRUFERVIKKworCisjZGVmaW5lIEZUX1NFUlZJQ0VfSURfVFRfQ01BUCAgInR0LWNtYXBzIgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfQ01hcEluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBUcnVlVHlwZS9zZm50IHNwZWNpZmljIGNtYXAgaW5mb3JtYXRpb24gICovCisgIC8qICAgIHdoaWNoIGlzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBnZW5lcmljIEBGVF9DaGFyTWFwIHN0cnVjdHVyZS4gIFRoaXMgICAqLworICAvKiAgICBzdHJ1Y3R1cmUgY2FuIGJlIGFjY2Vzc2VkIHdpdGggdGhlIEBGVF9HZXRfVFRfQ01hcF9JbmZvIGZ1bmN0aW9uLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsYW5ndWFnZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBUaGUgbGFuZ3VhZ2UgSUQgdXNlZCBpbiBNYWMgZm9udHMuICBEZWZpbml0aW9ucyBvZiB2YWx1ZXMgYXJlIGluICovCisgIC8qICAgICAgYHR0bmFtZWlkLmgnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZm9ybWF0IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgVGhlIGNtYXAgZm9ybWF0LiAgT3BlblR5cGUgMS42IGRlZmluZXMgdGhlIGZvcm1hdHMgMCAoYnl0ZSAgICAgICAqLworICAvKiAgICAgIGVuY29kaW5nIHRhYmxlKSwgMn4oaGlnaC1ieXRlIG1hcHBpbmcgdGhyb3VnaCB0YWJsZSksIDR+KHNlZ21lbnQgKi8KKyAgLyogICAgICBtYXBwaW5nIHRvIGRlbHRhIHZhbHVlcyksIDZ+KHRyaW1tZWQgdGFibGUgbWFwcGluZyksIDh+KG1peGVkICAgICovCisgIC8qICAgICAgMTYtYml0IGFuZCAzMi1iaXQgY292ZXJhZ2UpLCAxMH4odHJpbW1lZCBhcnJheSksIDEyfihzZWdtZW50ZWQgICAqLworICAvKiAgICAgIGNvdmVyYWdlKSwgMTN+KGxhc3QgcmVzb3J0IGZvbnQpLCBhbmQgMTQgKFVuaWNvZGUgVmFyaWF0aW9uICAgICAgKi8KKyAgLyogICAgICBTZXF1ZW5jZXMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfQ01hcEluZm9fCisgIHsKKyAgICBGVF9VTG9uZyAgbGFuZ3VhZ2U7CisgICAgRlRfTG9uZyAgIGZvcm1hdDsKKworICB9IFRUX0NNYXBJbmZvOworCisKKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKlRUX0NNYXBfSW5mb19HZXRGdW5jKSggRlRfQ2hhck1hcCAgICBjaGFybWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfQ01hcEluZm8gICpjbWFwX2luZm8gKTsKKworCisgIEZUX0RFRklORV9TRVJWSUNFKCBUVENNYXBzICkKKyAgeworICAgIFRUX0NNYXBfSW5mb19HZXRGdW5jICBnZXRfY21hcF9pbmZvOworICB9OworCisjaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCisKKyNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfVFRDTUFQU1JFQyggY2xhc3NfLCBnZXRfY21hcF9pbmZvXyApICBcCisgIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX1RUQ01hcHNSZWMgIGNsYXNzXyA9ICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnZXRfY21hcF9pbmZvXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH07CisKKyNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCisKKyNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfVFRDTUFQU1JFQyggY2xhc3NfLCBnZXRfY21hcF9pbmZvXyApICBcCisgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgICAgIGxpYnJhcnksICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlX1RUQ01hcHNSZWMqICBjbGF6eiApICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZUX1VOVVNFRCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPmdldF9jbWFwX2luZm8gPSBnZXRfY21hcF9pbmZvXzsgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLworCisgIC8qICovCisKKworRlRfRU5EX0hFQURFUgorCisjZW5kaWYgLyogX19TVlRUQ01BUF9IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGVuZy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0ZW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcyZWU4YwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGVuZy5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHN2dHRlbmcuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgRnJlZVR5cGUgVHJ1ZVR5cGUgZW5naW5lIHF1ZXJ5IHNlcnZpY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwNi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX1NWVFRFTkdfSF9fCisjZGVmaW5lIF9fU1ZUVEVOR19IX18KKworI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICisjaW5jbHVkZSBGVF9NT0RVTEVfSAorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyAgLyoKKyAgICogIFNGTlQgdGFibGUgbG9hZGluZyBzZXJ2aWNlLgorICAgKi8KKworI2RlZmluZSBGVF9TRVJWSUNFX0lEX1RSVUVUWVBFX0VOR0lORSAgInRydWV0eXBlLWVuZ2luZSIKKworICAvKgorICAgKiBVc2VkIHRvIGltcGxlbWVudCBGVF9HZXRfVHJ1ZVR5cGVfRW5naW5lX1R5cGUKKyAgICovCisKKyAgRlRfREVGSU5FX1NFUlZJQ0UoIFRydWVUeXBlRW5naW5lICkKKyAgeworICAgIEZUX1RydWVUeXBlRW5naW5lVHlwZSAgZW5naW5lX3R5cGU7CisgIH07CisKKyAgLyogKi8KKworCitGVF9FTkRfSEVBREVSCisKKworI2VuZGlmIC8qIF9fU1ZUVEVOR19IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGdseWYuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGdseWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWNiNzZhCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0Z2x5Zi5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHN2dHRnbHlmLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgRnJlZVR5cGUgVHJ1ZVR5cGUgZ2x5cGggc2VydmljZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwNy0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19TVlRUR0xZRl9IX18KKyNkZWZpbmUgX19TVlRUR0xZRl9IX18KKworI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICisjaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUJMRVNfSAorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyNkZWZpbmUgRlRfU0VSVklDRV9JRF9UVF9HTFlGICAidHQtZ2x5ZiIKKworCisgIHR5cGVkZWYgRlRfVUxvbmcKKyAgKCpUVF9HbHlmX0dldExvY2F0aW9uRnVuYykoIEZUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZ2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICpwc2l6ZSApOworCisgIEZUX0RFRklORV9TRVJWSUNFKCBUVEdseWYgKQorICB7CisgICAgVFRfR2x5Zl9HZXRMb2NhdGlvbkZ1bmMgIGdldF9sb2NhdGlvbjsKKyAgfTsKKworCisjaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCisKKyNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfVFRHTFlGUkVDKCBjbGFzc18sIGdldF9sb2NhdGlvbl8gKSAgXAorICBzdGF0aWMgY29uc3QgRlRfU2VydmljZV9UVEdseWZSZWMgIGNsYXNzXyA9ICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnZXRfbG9jYXRpb25fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OworCisjZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLworCisjZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX1RUR0xZRlJFQyggY2xhc3NfLCBnZXRfbG9jYXRpb25fICkgIFwKKyAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX1NlcnZpY2VfVFRHbHlmUmVjKiAgY2xhenogKSAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+Z2V0X2xvY2F0aW9uID0gZ2V0X2xvY2F0aW9uXzsgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLworCisgIC8qICovCisKKworRlRfRU5EX0hFQURFUgorCisjZW5kaWYgLyogX19TVlRUR0xZRl9IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z3aW5mbnQuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z3aW5mbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDM2OTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdndpbmZudC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHN2d2luZm50LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgRnJlZVR5cGUgV2luZG93cyBGTlQvRk9OVCBzZXJ2aWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwMy0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX1NWV0lORk5UX0hfXworI2RlZmluZSBfX1NWV0lORk5UX0hfXworCisjaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKKyNpbmNsdWRlIEZUX1dJTkZPTlRTX0gKKworCitGVF9CRUdJTl9IRUFERVIKKworCisjZGVmaW5lIEZUX1NFUlZJQ0VfSURfV0lORk5UICAid2luZm9udHMiCisKKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKkZUX1dpbkZudF9HZXRIZWFkZXJGdW5jKSggRlRfRmFjZSAgICAgICAgICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9XaW5GTlRfSGVhZGVyUmVjICAqYWhlYWRlciApOworCisKKyAgRlRfREVGSU5FX1NFUlZJQ0UoIFdpbkZudCApCisgIHsKKyAgICBGVF9XaW5GbnRfR2V0SGVhZGVyRnVuYyAgZ2V0X2hlYWRlcjsKKyAgfTsKKworICAvKiAqLworCisKK0ZUX0VORF9IRUFERVIKKworCisjZW5kaWYgLyogX19TVldJTkZOVF9IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZm50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBmNTNiZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oCkBAIC0wLDAgKzEsNzQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBzZm50LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSGlnaC1sZXZlbCBgc2ZudCcgZHJpdmVyIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX19TRk5UX0hfXworI2RlZmluZSBfX1NGTlRfSF9fCisKKworI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CisjaW5jbHVkZSBGVF9JTlRFUk5BTF9EUklWRVJfSAorI2luY2x1ZGUgRlRfSU5URVJOQUxfVFJVRVRZUEVfVFlQRVNfSAorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfSW5pdF9GYWNlX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRmlyc3QgcGFydCBvZiB0aGUgU0ZOVCBmYWNlIG9iamVjdCBpbml0aWFsaXphdGlvbi4gIFRoaXMgZmluZHMgICAgICovCisgIC8qICAgIHRoZSBmYWNlIGluIGEgU0ZOVCBmaWxlIG9yIGNvbGxlY3Rpb24sIGFuZCBsb2FkIGl0cyBmb3JtYXQgdGFnIGluICAqLworICAvKiAgICBmYWNlLT5mb3JtYXRfdGFnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gICAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIFRydWVUeXBlIGZvbnQsIGlmIHdlIGFyZSBvcGVuaW5nIGEgICovCisgIC8qICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbiwgaW4gYml0cyAwLTE1LiAgVGhlIG51bWJlcmVkIGluc3RhbmNlICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIGluZGV4fit+MSBvZiBhIEdYIChzdWIpZm9udCwgaWYgYXBwbGljYWJsZSwgaW4gYml0cyAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAxNi0zMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fcGFyYW1zIDo6IFRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBhcmFtcyAgICAgOjogT3B0aW9uYWwgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBzdHJlYW0gY3Vyc29yIG11c3QgYmUgYXQgdGhlIGZvbnQgZmlsZSdzIG9yaWdpbi4gICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiByZWNvZ25pemVzIGZvbnRzIGVtYmVkZGVkIGluIGEgYFRydWVUeXBlICAgICAgICAgICAgICovCisgIC8qICAgIGNvbGxlY3Rpb24nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgT25jZSB0aGUgZm9ybWF0IHRhZyBoYXMgYmVlbiB2YWxpZGF0ZWQgYnkgdGhlIGZvbnQgZHJpdmVyLCBpdCAgICAgICovCisgIC8qICAgIHNob3VsZCB0aGVuIGNhbGwgdGhlIFRUX0xvYWRfRmFjZV9GdW5jKCkgY2FsbGJhY2sgdG8gcmVhZCB0aGUgcmVzdCAqLworICAvKiAgICBvZiB0aGUgU0ZOVCB0YWJsZXMgaW4gdGhlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpUVF9Jbml0X0ZhY2VfRnVuYykoIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRUX0ZhY2UgICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBmYWNlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgbnVtX3BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcyApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9GYWNlX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2Vjb25kIHBhcnQgb2YgdGhlIFNGTlQgZmFjZSBvYmplY3QgaW5pdGlhbGl6YXRpb24uICBUaGlzIGxvYWRzICAgICovCisgIC8qICAgIHRoZSBjb21tb24gU0ZOVCB0YWJsZXMgKGhlYWQsIE9TLzIsIG1heHAsIG1ldHJpY3MsIGV0Yy4pIGluIHRoZSAgICAqLworICAvKiAgICBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gICAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIFRydWVUeXBlIGZvbnQsIGlmIHdlIGFyZSBvcGVuaW5nIGEgICovCisgIC8qICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbiwgaW4gYml0cyAwLTE1LiAgVGhlIG51bWJlcmVkIGluc3RhbmNlICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIGluZGV4fit+MSBvZiBhIEdYIChzdWIpZm9udCwgaWYgYXBwbGljYWJsZSwgaW4gYml0cyAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAxNi0zMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fcGFyYW1zIDo6IFRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBhcmFtcyAgICAgOjogT3B0aW9uYWwgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgVFRfSW5pdF9GYWNlX0Z1bmMoKS4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKlRUX0xvYWRfRmFjZV9GdW5jKSggRlRfU3RyZWFtICAgICAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGZhY2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBudW1fcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Eb25lX0ZhY2VfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIGNhbGxiYWNrIHVzZWQgdG8gZGVsZXRlIHRoZSBjb21tb24gU0ZOVCBkYXRhIGZyb20gYSBmYWNlLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgTk9UIGRlc3Ryb3kgdGhlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgdm9pZAorICAoKlRUX0RvbmVfRmFjZV9GdW5jKSggVFRfRmFjZSAgZmFjZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZF9BbnlfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTG9hZCBhbnkgZm9udCB0YWJsZSBpbnRvIGNsaWVudCBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgIDo6IFRoZSBmYWNlIG9iamVjdCB0byBsb29rIGZvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0YWcgICAgOjogVGhlIHRhZyBvZiB0YWJsZSB0byBsb2FkLiAgVXNlIHRoZSB2YWx1ZSAwIGlmIHlvdSB3YW50ICAgKi8KKyAgLyogICAgICAgICAgICAgIHRvIGFjY2VzcyB0aGUgd2hvbGUgZm9udCBmaWxlLCBlbHNlIHNldCB0aGlzIHBhcmFtZXRlciAgICovCisgIC8qICAgICAgICAgICAgICB0byBhIHZhbGlkIFRydWVUeXBlIHRhYmxlIHRhZyB0aGF0IHlvdSBjYW4gZm9yZ2Ugd2l0aCAgICAqLworICAvKiAgICAgICAgICAgICAgdGhlIE1BS0VfVFRfVEFHIG1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG9mZnNldCA6OiBUaGUgc3RhcnRpbmcgb2Zmc2V0IGluIHRoZSB0YWJsZSAob3IgdGhlIGZpbGUgaWYgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgdGFnID09IDApLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxlbmd0aCA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgZGVjaXNpb24gdmFyaWFibGU6ICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgSWYgbGVuZ3RoID09IE5VTEw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgTG9hZHMgdGhlIHdob2xlIHRhYmxlLiAgUmV0dXJucyBhbiBlcnJvciBpZiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIGBvZmZzZXQnID09IDAhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgIElmICpsZW5ndGggPT0gMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIEV4aXRzIGltbWVkaWF0ZWx5OyByZXR1cm5pbmcgdGhlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gKi8KKyAgLyogICAgICAgICAgICAgICAgICB0YWJsZSBvciBvZiB0aGUgZm9udCBmaWxlLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mICovCisgIC8qICAgICAgICAgICAgICAgICAgYHRhZycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgSWYgKmxlbmd0aCAhPSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgTG9hZHMgdGhlIG5leHQgYGxlbmd0aCcgYnl0ZXMgb2YgdGFibGUgb3IgZm9udCwgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIGF0IG9mZnNldCBgb2Zmc2V0JyAoaW4gdGFibGUgb3IgZm9udCB0b28pLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBidWZmZXIgOjogVGhlIGFkZHJlc3Mgb2YgdGFyZ2V0IGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpUVF9Mb2FkX0FueV9GdW5jKSggVFRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUgICAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIGxlbmd0aCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfRmluZF9TQml0X0ltYWdlX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ2hlY2sgd2hldGhlciBhbiBlbWJlZGRlZCBiaXRtYXAgKGFuIGBzYml0JykgZXhpc3RzIGZvciBhIGdpdmVuICAgICovCisgIC8qICAgIGdseXBoLCBhdCBhIGdpdmVuIHN0cmlrZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICAgICAgOjogVGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGhfaW5kZXggICA6OiBUaGUgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJpa2VfaW5kZXggIDo6IFRoZSBjdXJyZW50IHN0cmlrZSBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBhcmFuZ2UgICAgICAgIDo6IFRoZSBTQml0IHJhbmdlIGNvbnRhaW5pbmcgdGhlIGdseXBoIGluZGV4LiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFzdHJpa2UgICAgICAgOjogVGhlIFNCaXQgc3RyaWtlIGNvbnRhaW5pbmcgdGhlIGdseXBoIGluZGV4LiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYWdseXBoX29mZnNldCA6OiBUaGUgb2Zmc2V0IG9mIHRoZSBnbHlwaCBkYXRhIGluIGBFQkRUJyB0YWJsZS4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gIFJldHVybnMgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFNGTlRfRXJyX0ludmFsaWRfQXJndW1lbnQgaWYgbm8gc2JpdCBleGlzdHMgZm9yIHRoZSByZXF1ZXN0ZWQgICAgICAqLworICAvKiAgICBnbHlwaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpUVF9GaW5kX1NCaXRfSW1hZ2VfRnVuYykoIFRUX0ZhY2UgICAgICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgIHN0cmlrZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfUmFuZ2UgICAqYXJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9TdHJpa2UgICphc3RyaWtlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICphZ2x5cGhfb2Zmc2V0ICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb2FkX1NCaXRfTWV0cmljc19GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBHZXQgdGhlIGJpZyBtZXRyaWNzIGZvciBhIGdpdmVuIGVtYmVkZGVkIGJpdG1hcC4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gICAgICA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJhbmdlICAgICAgIDo6IFRoZSBTQml0IHJhbmdlIGNvbnRhaW5pbmcgdGhlIGdseXBoLiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJpZ19tZXRyaWNzIDo6IEEgYmlnIFNCaXQgbWV0cmljcyBzdHJ1Y3R1cmUgZm9yIHRoZSBnbHlwaC4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBzdHJlYW0gY3Vyc29yIG11c3QgYmUgcG9zaXRpb25lZCBhdCB0aGUgZ2x5cGgncyBvZmZzZXQgd2l0aGluICAqLworICAvKiAgICB0aGUgYEVCRFQnIHRhYmxlIGJlZm9yZSB0aGUgY2FsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIElmIHRoZSBpbWFnZSBmb3JtYXQgdXNlcyB2YXJpYWJsZSBtZXRyaWNzLCB0aGUgc3RyZWFtIGN1cnNvciBpcyAgICAqLworICAvKiAgICBwb3NpdGlvbmVkIGp1c3QgYWZ0ZXIgdGhlIG1ldHJpY3MgaGVhZGVyIGluIHRoZSBgRUJEVCcgdGFibGUgb24gICAgKi8KKyAgLyogICAgZnVuY3Rpb24gZXhpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqVFRfTG9hZF9TQml0X01ldHJpY3NfRnVuYykoIEZUX1N0cmVhbSAgICAgICAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TQml0X1JhbmdlICAgIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TQml0X01ldHJpY3MgIG1ldHJpY3MgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfU0JpdF9JbWFnZV9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWQgYSBnaXZlbiBnbHlwaCBzYml0IGltYWdlIGZyb20gdGhlIGZvbnQgcmVzb3VyY2UuICBUaGlzIGFsc28gICAqLworICAvKiAgICByZXR1cm5zIGl0cyBtZXRyaWNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBUaGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJpa2VfaW5kZXggOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBUaGUgc3RyaWtlIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnbHlwaF9pbmRleCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBUaGUgY3VycmVudCBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsb2FkX2ZsYWdzIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBUaGUgY3VycmVudCBsb2FkIGZsYWdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYW1hcCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgVGhlIHRhcmdldCBwaXhtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYW1ldHJpY3MgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgQSBiaWcgc2JpdCBtZXRyaWNzIHN0cnVjdHVyZSBmb3IgdGhlIGdseXBoIGltYWdlLiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICBSZXR1cm5zIGFuIGVycm9yIGlmIG5vICAgICAqLworICAvKiAgICBnbHlwaCBzYml0IGV4aXN0cyBmb3IgdGhlIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgYG1hcC5idWZmZXInIGZpZWxkIGlzIGFsd2F5cyBmcmVlZCBiZWZvcmUgdGhlIGdseXBoIGlzIGxvYWRlZC4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpUVF9Mb2FkX1NCaXRfSW1hZ2VfRnVuYykoIFRUX0ZhY2UgICAgICAgICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgICAgICBzdHJpa2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgICBnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgIGxvYWRfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICAgICAgICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CaXRtYXAgICAgICAgICAgICphbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9NZXRyaWNzUmVjICAqYW1ldHJpY3MgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1NldF9TQml0X1N0cmlrZV9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFNlbGVjdCBhbiBzYml0IHN0cmlrZSBmb3IgYSBnaXZlbiBzaXplIHJlcXVlc3QuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICAgICAgOjogVGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcmVxICAgICAgICAgICA6OiBUaGUgc2l6ZSByZXF1ZXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYXN0cmlrZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIHNiaXQgc3RyaWtlLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gIFJldHVybnMgYW4gZXJyb3IgaWYgbm8gICAgICovCisgIC8qICAgIHNiaXQgc3RyaWtlIGV4aXN0cyBmb3IgdGhlIHNlbGVjdGVkIHBwZW0gdmFsdWVzLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKlRUX1NldF9TQml0X1N0cmlrZV9GdW5jKSggVFRfRmFjZSAgICAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgICAgIGFzdHJpa2VfaW5kZXggKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfU3RyaWtlX01ldHJpY3NfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWQgdGhlIG1ldHJpY3Mgb2YgYSBnaXZlbiBzdHJpa2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgICAgICAgOjogVGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyaWtlX2luZGV4ICA6OiBUaGUgc3RyaWtlIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWV0cmljcyAgICAgICA6OiB0aGUgbWV0cmljcyBvZiB0aGUgc3RyaWtlLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gIFJldHVybnMgYW4gZXJyb3IgaWYgbm8gICAgICovCisgIC8qICAgIHN1Y2ggc2JpdCBzdHJpa2UgZXhpc3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKlRUX0xvYWRfU3RyaWtlX01ldHJpY3NfRnVuYykoIFRUX0ZhY2UgICAgICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICAgc3RyaWtlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NpemVfTWV0cmljcyogIG1ldHJpY3MgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0dldF9QU19OYW1lX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEdldCB0aGUgUG9zdFNjcmlwdCBnbHlwaCBuYW1lIG9mIGEgZ2x5cGguICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGlkeCAgOjogVGhlIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUFNuYW1lIDo6IFRoZSBhZGRyZXNzIG9mIGEgc3RyaW5nIHBvaW50ZXIuICBXaWxsIGJlIE5VTEwgaW4gY2FzZSAgICovCisgIC8qICAgICAgICAgICAgICBvZiBlcnJvciwgb3RoZXJ3aXNlIGl0IGlzIGEgcG9pbnRlciB0byB0aGUgZ2x5cGggbmFtZS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgIFlvdSBtdXN0IG5vdCBtb2RpZnkgdGhlIHJldHVybmVkIHN0cmluZyEgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqVFRfR2V0X1BTX05hbWVfRnVuYykoIFRUX0ZhY2UgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJpbmcqKiAgUFNuYW1lICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Mb2FkX01ldHJpY3NfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkIGEgbWV0cmljcyB0YWJsZSwgd2hpY2ggaXMgYSB0YWJsZSB3aXRoIGEgaG9yaXpvbnRhbCBhbmQgYSAgICAgKi8KKyAgLyogICAgdmVydGljYWwgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gICA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHZlcnRpY2FsIDo6IEEgYm9vbGVhbiBmbGFnLiAgSWYgc2V0LCBsb2FkIHRoZSB2ZXJ0aWNhbCBvbmUuICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKlRUX0xvYWRfTWV0cmljc19GdW5jKSggVFRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgIHZlcnRpY2FsICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9HZXRfTWV0cmljc19GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMb2FkIHRoZSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIGhlYWRlciBpbiBhIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmYWNlICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHZlcnRpY2FsIDo6IEEgYm9vbGVhbiBmbGFnLiAgSWYgc2V0LCBsb2FkIHZlcnRpY2FsIG1ldHJpY3MuICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2luZGV4ICAgOjogVGhlIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYWJlYXJpbmcgOjogVGhlIGhvcml6b250YWwgKG9yIHZlcnRpY2FsKSBiZWFyaW5nLiAgU2V0IHRvIHplcm8gaW4gICovCisgIC8qICAgICAgICAgICAgICAgIGNhc2Ugb2YgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYWFkdmFuY2UgOjogVGhlIGhvcml6b250YWwgKG9yIHZlcnRpY2FsKSBhZHZhbmNlLiAgU2V0IHRvIHplcm8gaW4gICovCisgIC8qICAgICAgICAgICAgICAgIGNhc2Ugb2YgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiB2b2lkCisgICgqVFRfR2V0X01ldHJpY3NfRnVuYykoIFRUX0ZhY2UgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgIHZlcnRpY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1Nob3J0KiAgIGFiZWFyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICBhYWR2YW5jZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfR2V0X05hbWVfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJvbSB0aGUgYG5hbWUnIHRhYmxlLCByZXR1cm4gYSBnaXZlbiBFTkdMSVNIIG5hbWUgcmVjb3JkIGluICAgICAgICovCisgIC8qICAgIEFTQ0lJLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbmFtZWlkICAgOjogVGhlIG5hbWUgaWQgb2YgdGhlIG5hbWUgcmVjb3JkIHRvIHJldHVybi4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbmFtZSAgICAgOjogVGhlIGFkZHJlc3Mgb2YgYW4gYWxsb2NhdGVkIHN0cmluZyBwb2ludGVyLiAgTlVMTCBpZiAgICovCisgIC8qICAgICAgICAgICAgICAgIG5vIG5hbWUgaXMgcHJlc2VudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKlRUX0dldF9OYW1lX0Z1bmMpKCBUVF9GYWNlICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgIG5hbWVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyaW5nKiogIG5hbWUgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExvYWQgYSBnaXZlbiBUcnVlVHlwZSB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGZ1bmN0aW9uIHVzZXMgYGZhY2UtPmdvdG9fdGFibGUnIHRvIHNlZWsgdGhlIHN0cmVhbSB0byB0aGUgICAgICovCisgIC8qICAgIHN0YXJ0IG9mIHRoZSB0YWJsZSwgZXhjZXB0IHdoaWxlIGxvYWRpbmcgdGhlIGZvbnQgZGlyZWN0b3J5LiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKlRUX0xvYWRfVGFibGVfRnVuYykoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfRnJlZV9UYWJsZV9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRnJlZSBhIGdpdmVuIFRydWVUeXBlIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHZvaWQKKyAgKCpUVF9GcmVlX1RhYmxlX0Z1bmMpKCBUVF9GYWNlICBmYWNlICk7CisKKworICAvKgorICAgKiBAZnVuY3R5cGU6CisgICAqICAgIFRUX0ZhY2VfR2V0S2VybmluZ0Z1bmMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgICBSZXR1cm4gdGhlIGhvcml6b250YWwga2VybmluZyB2YWx1ZSBiZXR3ZWVuIHR3byBnbHlwaHMuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICAgZmFjZSAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4KKyAgICogICAgbGVmdF9nbHlwaCAgOjogVGhlIGxlZnQgZ2x5cGggaW5kZXguCisgICAqICAgIHJpZ2h0X2dseXBoIDo6IFRoZSByaWdodCBnbHlwaCBpbmRleC4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICAgVGhlIGtlcm5pbmcgdmFsdWUgaW4gZm9udCB1bml0cy4KKyAgICovCisgIHR5cGVkZWYgRlRfSW50CisgICgqVFRfRmFjZV9HZXRLZXJuaW5nRnVuYykoIFRUX0ZhY2UgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgIGxlZnRfZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgIHJpZ2h0X2dseXBoICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBTRk5UX0ludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIHN0cnVjdHVyZSBob2xkcyBwb2ludGVycyB0byB0aGUgZnVuY3Rpb25zIHVzZWQgdG8gbG9hZCBhbmQgICAgKi8KKyAgLyogICAgZnJlZSB0aGUgYmFzaWMgdGFibGVzIHRoYXQgYXJlIHJlcXVpcmVkIGluIGEgYHNmbnQnIGZvbnQgZmlsZS4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ2hlY2sgdGhlIHZhcmlvdXMgeHh4X0Z1bmMoKSBkZXNjcmlwdGlvbnMgZm9yIGRldGFpbHMuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgU0ZOVF9JbnRlcmZhY2VfCisgIHsKKyAgICBUVF9Mb2FkZXJfR290b1RhYmxlRnVuYyAgICAgIGdvdG9fdGFibGU7CisKKyAgICBUVF9Jbml0X0ZhY2VfRnVuYyAgICAgICAgICAgIGluaXRfZmFjZTsKKyAgICBUVF9Mb2FkX0ZhY2VfRnVuYyAgICAgICAgICAgIGxvYWRfZmFjZTsKKyAgICBUVF9Eb25lX0ZhY2VfRnVuYyAgICAgICAgICAgIGRvbmVfZmFjZTsKKyAgICBGVF9Nb2R1bGVfUmVxdWVzdGVyICAgICAgICAgIGdldF9pbnRlcmZhY2U7CisKKyAgICBUVF9Mb2FkX0FueV9GdW5jICAgICAgICAgICAgIGxvYWRfYW55OworCisgICAgLyogdGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgYnkgYGxvYWRfZmFjZScgYnV0IHRoZXkgY2FuIGFsc28gICovCisgICAgLyogYmUgY2FsbGVkIGZyb20gZXh0ZXJuYWwgbW9kdWxlcywgaWYgdGhlcmUgaXMgYSBuZWVkIHRvIGRvIHNvICovCisgICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgICAgICBsb2FkX2hlYWQ7CisgICAgVFRfTG9hZF9NZXRyaWNzX0Z1bmMgICAgICAgICBsb2FkX2hoZWE7CisgICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgICAgICBsb2FkX2NtYXA7CisgICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgICAgICBsb2FkX21heHA7CisgICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgICAgICBsb2FkX29zMjsKKyAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICAgICAgIGxvYWRfcG9zdDsKKworICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgICAgICAgbG9hZF9uYW1lOworICAgIFRUX0ZyZWVfVGFibGVfRnVuYyAgICAgICAgICAgZnJlZV9uYW1lOworCisgICAgLyogdGhpcyBmaWVsZCB3YXMgY2FsbGVkIGBsb2FkX2tlcm5pbmcnIHVwIHRvIHZlcnNpb24gMi4xLjEwICovCisgICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgICAgICBsb2FkX2tlcm47CisKKyAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICAgICAgIGxvYWRfZ2FzcDsKKyAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICAgICAgIGxvYWRfcGNsdDsKKworICAgIC8qIHNlZSBgdHRsb2FkLmgnOyB0aGlzIGZpZWxkIHdhcyBjYWxsZWQgYGxvYWRfYml0bWFwX2hlYWRlcicgdXAgdG8gKi8KKyAgICAvKiB2ZXJzaW9uIDIuMS4xMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgICAgICBsb2FkX2JoZWQ7CisKKyAgICBUVF9Mb2FkX1NCaXRfSW1hZ2VfRnVuYyAgICAgIGxvYWRfc2JpdF9pbWFnZTsKKworICAgIC8qIHNlZSBgdHRwb3N0LmgnICovCisgICAgVFRfR2V0X1BTX05hbWVfRnVuYyAgICAgICAgICBnZXRfcHNuYW1lOworICAgIFRUX0ZyZWVfVGFibGVfRnVuYyAgICAgICAgICAgZnJlZV9wc25hbWVzOworCisgICAgLyogc3RhcnRpbmcgaGVyZSwgdGhlIHN0cnVjdHVyZSBkaWZmZXJzIGZyb20gdmVyc2lvbiAyLjEuNyAqLworCisgICAgLyogdGhpcyBmaWVsZCB3YXMgaW50cm9kdWNlZCBpbiB2ZXJzaW9uIDIuMS44LCBuYW1lZCBgZ2V0X3BzbmFtZScgKi8KKyAgICBUVF9GYWNlX0dldEtlcm5pbmdGdW5jICAgICAgIGdldF9rZXJuaW5nOworCisgICAgLyogbmV3IGVsZW1lbnRzIGludHJvZHVjZWQgYWZ0ZXIgdmVyc2lvbiAyLjEuMTAgKi8KKworICAgIC8qIGxvYWQgdGhlIGZvbnQgZGlyZWN0b3J5LCBpLmUuLCB0aGUgb2Zmc2V0IHRhYmxlIGFuZCAqLworICAgIC8qIHRoZSB0YWJsZSBkaXJlY3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgICAgICAgbG9hZF9mb250X2RpcjsKKyAgICBUVF9Mb2FkX01ldHJpY3NfRnVuYyAgICAgICAgIGxvYWRfaG10eDsKKworICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgICAgICAgbG9hZF9lYmxjOworICAgIFRUX0ZyZWVfVGFibGVfRnVuYyAgICAgICAgICAgZnJlZV9lYmxjOworCisgICAgVFRfU2V0X1NCaXRfU3RyaWtlX0Z1bmMgICAgICBzZXRfc2JpdF9zdHJpa2U7CisgICAgVFRfTG9hZF9TdHJpa2VfTWV0cmljc19GdW5jICBsb2FkX3N0cmlrZV9tZXRyaWNzOworCisgICAgVFRfR2V0X01ldHJpY3NfRnVuYyAgICAgICAgICBnZXRfbWV0cmljczsKKworICAgIFRUX0dldF9OYW1lX0Z1bmMgICAgICAgICAgICAgZ2V0X25hbWU7CisKKyAgfSBTRk5UX0ludGVyZmFjZTsKKworCisgIC8qIHRyYW5zaXRpb25hbCAqLworICB0eXBlZGVmIFNGTlRfSW50ZXJmYWNlKiAgIFNGTlRfU2VydmljZTsKKworI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQworCisjZGVmaW5lIEZUX0RFRklORV9TRk5UX0lOVEVSRkFDRSggICAgICAgIFwKKyAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGdvdG9fdGFibGVfLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgaW5pdF9mYWNlXywgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBsb2FkX2ZhY2VfLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGRvbmVfZmFjZV8sICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZ2V0X2ludGVyZmFjZV8sICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBsb2FkX2FueV8sICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGxvYWRfaGVhZF8sICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbG9hZF9oaGVhXywgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBsb2FkX2NtYXBfLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGxvYWRfbWF4cF8sICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbG9hZF9vczJfLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBsb2FkX3Bvc3RfLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGxvYWRfbmFtZV8sICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZnJlZV9uYW1lXywgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBsb2FkX2tlcm5fLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGxvYWRfZ2FzcF8sICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbG9hZF9wY2x0XywgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBsb2FkX2JoZWRfLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGxvYWRfc2JpdF9pbWFnZV8sICAgICAgICAgICAgICBcCisgICAgICAgICAgZ2V0X3BzbmFtZV8sICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBmcmVlX3BzbmFtZXNfLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGdldF9rZXJuaW5nXywgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbG9hZF9mb250X2Rpcl8sICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBsb2FkX2htdHhfLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGxvYWRfZWJsY18sICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZnJlZV9lYmxjXywgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBzZXRfc2JpdF9zdHJpa2VfLCAgICAgICAgICAgICAgXAorICAgICAgICAgIGxvYWRfc3RyaWtlX21ldHJpY3NfLCAgICAgICAgICBcCisgICAgICAgICAgZ2V0X21ldHJpY3NfLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBnZXRfbmFtZV8gKSAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgY29uc3QgU0ZOVF9JbnRlcmZhY2UgIGNsYXNzXyA9ICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnb3RvX3RhYmxlXywgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGluaXRfZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbG9hZF9mYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkb25lX2ZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdldF9pbnRlcmZhY2VfLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbG9hZF9hbnlfLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsb2FkX2hlYWRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGxvYWRfaGhlYV8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbG9hZF9jbWFwXywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsb2FkX21heHBfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGxvYWRfb3MyXywgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbG9hZF9wb3N0XywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsb2FkX25hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZyZWVfbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbG9hZF9rZXJuXywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsb2FkX2dhc3BfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGxvYWRfcGNsdF8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbG9hZF9iaGVkXywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsb2FkX3NiaXRfaW1hZ2VfLCAgICAgICAgICAgICAgICAgICAgXAorICAgIGdldF9wc25hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZnJlZV9wc25hbWVzXywgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnZXRfa2VybmluZ18sICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGxvYWRfZm9udF9kaXJfLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbG9hZF9obXR4XywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsb2FkX2VibGNfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZyZWVfZWJsY18sICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2V0X3NiaXRfc3RyaWtlXywgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsb2FkX3N0cmlrZV9tZXRyaWNzXywgICAgICAgICAgICAgICAgXAorICAgIGdldF9tZXRyaWNzXywgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ2V0X25hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsKKworI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KKworI2RlZmluZSBGVF9JTlRFUk5BTCggYSwgYV8gKSAgXAorICAgICAgICAgIGNsYXp6LT5hID0gYV87CisKKyNkZWZpbmUgRlRfREVGSU5FX1NGTlRfSU5URVJGQUNFKCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZ290b190YWJsZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBpbml0X2ZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGxvYWRfZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZG9uZV9mYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBnZXRfaW50ZXJmYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGxvYWRfYW55XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbG9hZF9oZWFkXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBsb2FkX2hoZWFfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGxvYWRfY21hcF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbG9hZF9tYXhwXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBsb2FkX29zMl8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGxvYWRfcG9zdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbG9hZF9uYW1lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBmcmVlX25hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGxvYWRfa2Vybl8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbG9hZF9nYXNwXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBsb2FkX3BjbHRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGxvYWRfYmhlZF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbG9hZF9zYml0X2ltYWdlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBnZXRfcHNuYW1lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGZyZWVfcHNuYW1lc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZ2V0X2tlcm5pbmdfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBsb2FkX2ZvbnRfZGlyXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGxvYWRfaG10eF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbG9hZF9lYmxjXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBmcmVlX2VibGNfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHNldF9zYml0X3N0cmlrZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbG9hZF9zdHJpa2VfbWV0cmljc18sICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBnZXRfbWV0cmljc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGdldF9uYW1lXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgIGxpYnJhcnksICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNGTlRfSW50ZXJmYWNlKiAgY2xhenogKSAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVF9VTlVTRUQoIGxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2xhenotPmdvdG9fdGFibGUgICAgICAgICAgPSBnb3RvX3RhYmxlXzsgICAgICAgICAgIFwKKyAgICBjbGF6ei0+aW5pdF9mYWNlICAgICAgICAgICA9IGluaXRfZmFjZV87ICAgICAgICAgICAgXAorICAgIGNsYXp6LT5sb2FkX2ZhY2UgICAgICAgICAgID0gbG9hZF9mYWNlXzsgICAgICAgICAgICBcCisgICAgY2xhenotPmRvbmVfZmFjZSAgICAgICAgICAgPSBkb25lX2ZhY2VfOyAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+Z2V0X2ludGVyZmFjZSAgICAgICA9IGdldF9pbnRlcmZhY2VfOyAgICAgICAgXAorICAgIGNsYXp6LT5sb2FkX2FueSAgICAgICAgICAgID0gbG9hZF9hbnlfOyAgICAgICAgICAgICBcCisgICAgY2xhenotPmxvYWRfaGVhZCAgICAgICAgICAgPSBsb2FkX2hlYWRfOyAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+bG9hZF9oaGVhICAgICAgICAgICA9IGxvYWRfaGhlYV87ICAgICAgICAgICAgXAorICAgIGNsYXp6LT5sb2FkX2NtYXAgICAgICAgICAgID0gbG9hZF9jbWFwXzsgICAgICAgICAgICBcCisgICAgY2xhenotPmxvYWRfbWF4cCAgICAgICAgICAgPSBsb2FkX21heHBfOyAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+bG9hZF9vczIgICAgICAgICAgICA9IGxvYWRfb3MyXzsgICAgICAgICAgICAgXAorICAgIGNsYXp6LT5sb2FkX3Bvc3QgICAgICAgICAgID0gbG9hZF9wb3N0XzsgICAgICAgICAgICBcCisgICAgY2xhenotPmxvYWRfbmFtZSAgICAgICAgICAgPSBsb2FkX25hbWVfOyAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+ZnJlZV9uYW1lICAgICAgICAgICA9IGZyZWVfbmFtZV87ICAgICAgICAgICAgXAorICAgIGNsYXp6LT5sb2FkX2tlcm4gICAgICAgICAgID0gbG9hZF9rZXJuXzsgICAgICAgICAgICBcCisgICAgY2xhenotPmxvYWRfZ2FzcCAgICAgICAgICAgPSBsb2FkX2dhc3BfOyAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+bG9hZF9wY2x0ICAgICAgICAgICA9IGxvYWRfcGNsdF87ICAgICAgICAgICAgXAorICAgIGNsYXp6LT5sb2FkX2JoZWQgICAgICAgICAgID0gbG9hZF9iaGVkXzsgICAgICAgICAgICBcCisgICAgY2xhenotPmxvYWRfc2JpdF9pbWFnZSAgICAgPSBsb2FkX3NiaXRfaW1hZ2VfOyAgICAgIFwKKyAgICBjbGF6ei0+Z2V0X3BzbmFtZSAgICAgICAgICA9IGdldF9wc25hbWVfOyAgICAgICAgICAgXAorICAgIGNsYXp6LT5mcmVlX3BzbmFtZXMgICAgICAgID0gZnJlZV9wc25hbWVzXzsgICAgICAgICBcCisgICAgY2xhenotPmdldF9rZXJuaW5nICAgICAgICAgPSBnZXRfa2VybmluZ187ICAgICAgICAgIFwKKyAgICBjbGF6ei0+bG9hZF9mb250X2RpciAgICAgICA9IGxvYWRfZm9udF9kaXJfOyAgICAgICAgXAorICAgIGNsYXp6LT5sb2FkX2htdHggICAgICAgICAgID0gbG9hZF9obXR4XzsgICAgICAgICAgICBcCisgICAgY2xhenotPmxvYWRfZWJsYyAgICAgICAgICAgPSBsb2FkX2VibGNfOyAgICAgICAgICAgIFwKKyAgICBjbGF6ei0+ZnJlZV9lYmxjICAgICAgICAgICA9IGZyZWVfZWJsY187ICAgICAgICAgICAgXAorICAgIGNsYXp6LT5zZXRfc2JpdF9zdHJpa2UgICAgID0gc2V0X3NiaXRfc3RyaWtlXzsgICAgICBcCisgICAgY2xhenotPmxvYWRfc3RyaWtlX21ldHJpY3MgPSBsb2FkX3N0cmlrZV9tZXRyaWNzXzsgIFwKKyAgICBjbGF6ei0+Z2V0X21ldHJpY3MgICAgICAgICA9IGdldF9tZXRyaWNzXzsgICAgICAgICAgXAorICAgIGNsYXp6LT5nZXRfbmFtZSAgICAgICAgICAgID0gZ2V0X25hbWVfOyAgICAgICAgICAgICBcCisgIH0KKworI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCisKK0ZUX0VORF9IRUFERVIKKworI2VuZGlmIC8qIF9fU0ZOVF9IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdDF0eXBlcy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90MXR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI5YWNjNAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdDF0eXBlcy5oCkBAIC0wLDAgKzEsMjU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB0MXR5cGVzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQmFzaWMgVHlwZTEvVHlwZTIgdHlwZSBkZWZpbml0aW9ucyBhbmQgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uICAgICAgKi8KKy8qICAgIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KKy8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCisvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLworLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KKy8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZuZGVmIF9fVDFUWVBFU19IX18KKyNkZWZpbmUgX19UMVRZUEVTX0hfXworCisKKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorI2luY2x1ZGUgRlRfVFlQRTFfVEFCTEVTX0gKKyNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfSElOVFNfSAorI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICisjaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSAorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICBSRVFVSVJFRCBUWVBFMS9UWVBFMiBUQUJMRVMgREVGSU5JVElPTlMgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVDFfRW5jb2RpbmdSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzdHJ1Y3R1cmUgbW9kZWxpbmcgYSBjdXN0b20gZW5jb2RpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtX2NoYXJzICA6OiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlciBjb2RlcyBpbiB0aGUgZW5jb2RpbmcuICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgVXN1YWxseSAyNTYuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY29kZV9maXJzdCA6OiBUaGUgbG93ZXN0IHZhbGlkIGNoYXJhY3RlciBjb2RlIGluIHRoZSBlbmNvZGluZy4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjb2RlX2xhc3QgIDo6IFRoZSBoaWdoZXN0IHZhbGlkIGNoYXJhY3RlciBjb2RlIGluIHRoZSBlbmNvZGluZyAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICArIDEuIFdoZW4gZXF1YWwgdG8gY29kZV9maXJzdCB0aGVyZSBhcmUgbm8gdmFsaWQgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyIGNvZGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2hhcl9pbmRleCA6OiBBbiBhcnJheSBvZiBjb3JyZXNwb25kaW5nIGdseXBoIGluZGljZXMuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjaGFyX25hbWUgIDo6IEFuIGFycmF5IG9mIGNvcnJlc3BvbmRpbmcgZ2x5cGggbmFtZXMuICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUMV9FbmNvZGluZ1JlY1JlY18KKyAgeworICAgIEZUX0ludCAgICAgICBudW1fY2hhcnM7CisgICAgRlRfSW50ICAgICAgIGNvZGVfZmlyc3Q7CisgICAgRlRfSW50ICAgICAgIGNvZGVfbGFzdDsKKworICAgIEZUX1VTaG9ydCogICBjaGFyX2luZGV4OworICAgIEZUX1N0cmluZyoqICBjaGFyX25hbWU7CisKKyAgfSBUMV9FbmNvZGluZ1JlYywgKlQxX0VuY29kaW5nOworCisKKyAgLyogdXNlZCB0byBob2xkIGV4dHJhIGRhdGEgb2YgUFNfRm9udEluZm9SZWMgdGhhdAorICAgKiBjYW5ub3QgYmUgc3RvcmVkIGluIHRoZSBwdWJsaWNseSBkZWZpbmVkIHN0cnVjdHVyZS4KKyAgICoKKyAgICogTm90ZSB0aGVzZSBjYW4ndCBiZSBibGVuZGVkIHdpdGggbXVsdGlwbGUtbWFzdGVycy4KKyAgICovCisgIHR5cGVkZWYgc3RydWN0ICBQU19Gb250RXh0cmFSZWNfCisgIHsKKyAgICBGVF9VU2hvcnQgIGZzX3R5cGU7CisKKyAgfSBQU19Gb250RXh0cmFSZWM7CisKKworICB0eXBlZGVmIHN0cnVjdCAgVDFfRm9udFJlY18KKyAgeworICAgIFBTX0ZvbnRJbmZvUmVjICAgZm9udF9pbmZvOyAgICAgICAgIC8qIGZvbnQgaW5mbyBkaWN0aW9uYXJ5ICAgKi8KKyAgICBQU19Gb250RXh0cmFSZWMgIGZvbnRfZXh0cmE7ICAgICAgICAvKiBmb250IGluZm8gZXh0cmEgZmllbGRzICovCisgICAgUFNfUHJpdmF0ZVJlYyAgICBwcml2YXRlX2RpY3Q7ICAgICAgLyogcHJpdmF0ZSBkaWN0aW9uYXJ5ICAgICAqLworICAgIEZUX1N0cmluZyogICAgICAgZm9udF9uYW1lOyAgICAgICAgIC8qIHRvcC1sZXZlbCBkaWN0aW9uYXJ5ICAgKi8KKworICAgIFQxX0VuY29kaW5nVHlwZSAgZW5jb2RpbmdfdHlwZTsKKyAgICBUMV9FbmNvZGluZ1JlYyAgIGVuY29kaW5nOworCisgICAgRlRfQnl0ZSogICAgICAgICBzdWJyc19ibG9jazsKKyAgICBGVF9CeXRlKiAgICAgICAgIGNoYXJzdHJpbmdzX2Jsb2NrOworICAgIEZUX0J5dGUqICAgICAgICAgZ2x5cGhfbmFtZXNfYmxvY2s7CisKKyAgICBGVF9JbnQgICAgICAgICAgIG51bV9zdWJyczsKKyAgICBGVF9CeXRlKiogICAgICAgIHN1YnJzOworICAgIEZUX1VJbnQqICAgICAgICAgc3VicnNfbGVuOworCisgICAgRlRfSW50ICAgICAgICAgICBudW1fZ2x5cGhzOworICAgIEZUX1N0cmluZyoqICAgICAgZ2x5cGhfbmFtZXM7ICAgICAgIC8qIGFycmF5IG9mIGdseXBoIG5hbWVzICAgICAgICovCisgICAgRlRfQnl0ZSoqICAgICAgICBjaGFyc3RyaW5nczsgICAgICAgLyogYXJyYXkgb2YgZ2x5cGggY2hhcnN0cmluZ3MgKi8KKyAgICBGVF9VSW50KiAgICAgICAgIGNoYXJzdHJpbmdzX2xlbjsKKworICAgIEZUX0J5dGUgICAgICAgICAgcGFpbnRfdHlwZTsKKyAgICBGVF9CeXRlICAgICAgICAgIGZvbnRfdHlwZTsKKyAgICBGVF9NYXRyaXggICAgICAgIGZvbnRfbWF0cml4OworICAgIEZUX1ZlY3RvciAgICAgICAgZm9udF9vZmZzZXQ7CisgICAgRlRfQkJveCAgICAgICAgICBmb250X2Jib3g7CisgICAgRlRfTG9uZyAgICAgICAgICBmb250X2lkOworCisgICAgRlRfRml4ZWQgICAgICAgICBzdHJva2Vfd2lkdGg7CisKKyAgfSBUMV9Gb250UmVjLCAqVDFfRm9udDsKKworCisgIHR5cGVkZWYgc3RydWN0ICBDSURfU3VicnNSZWNfCisgIHsKKyAgICBGVF9JbnQgICAgIG51bV9zdWJyczsKKyAgICBGVF9CeXRlKiogIGNvZGU7CisKKyAgfSBDSURfU3VicnNSZWMsICpDSURfU3VicnM7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgICAgQUZNIEZPTlQgSU5GT1JNQVRJT04gU1RSVUNUVVJFUyAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgdHlwZWRlZiBzdHJ1Y3QgIEFGTV9UcmFja0tlcm5SZWNfCisgIHsKKyAgICBGVF9JbnQgICAgZGVncmVlOworICAgIEZUX0ZpeGVkICBtaW5fcHRzaXplOworICAgIEZUX0ZpeGVkICBtaW5fa2VybjsKKyAgICBGVF9GaXhlZCAgbWF4X3B0c2l6ZTsKKyAgICBGVF9GaXhlZCAgbWF4X2tlcm47CisKKyAgfSBBRk1fVHJhY2tLZXJuUmVjLCAqQUZNX1RyYWNrS2VybjsKKworICB0eXBlZGVmIHN0cnVjdCAgQUZNX0tlcm5QYWlyUmVjXworICB7CisgICAgRlRfVUludCAgaW5kZXgxOworICAgIEZUX1VJbnQgIGluZGV4MjsKKyAgICBGVF9JbnQgICB4OworICAgIEZUX0ludCAgIHk7CisKKyAgfSBBRk1fS2VyblBhaXJSZWMsICpBRk1fS2VyblBhaXI7CisKKyAgdHlwZWRlZiBzdHJ1Y3QgIEFGTV9Gb250SW5mb1JlY18KKyAgeworICAgIEZUX0Jvb2wgICAgICAgIElzQ0lERm9udDsKKyAgICBGVF9CQm94ICAgICAgICBGb250QkJveDsKKyAgICBGVF9GaXhlZCAgICAgICBBc2NlbmRlcjsKKyAgICBGVF9GaXhlZCAgICAgICBEZXNjZW5kZXI7CisgICAgQUZNX1RyYWNrS2VybiAgVHJhY2tLZXJuczsgICAvKiBmcmVlIGlmIG5vbi1OVUxMICovCisgICAgRlRfVUludCAgICAgICAgTnVtVHJhY2tLZXJuOworICAgIEFGTV9LZXJuUGFpciAgIEtlcm5QYWlyczsgICAgLyogZnJlZSBpZiBub24tTlVMTCAqLworICAgIEZUX1VJbnQgICAgICAgIE51bUtlcm5QYWlyOworCisgIH0gQUZNX0ZvbnRJbmZvUmVjLCAqQUZNX0ZvbnRJbmZvOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgIE9SSUdJTkFMIFQxX0ZBQ0UgQ0xBU1MgREVGSU5JVElPTiAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgdHlwZWRlZiBzdHJ1Y3QgVDFfRmFjZVJlY18qICAgVDFfRmFjZTsKKyAgdHlwZWRlZiBzdHJ1Y3QgQ0lEX0ZhY2VSZWNfKiAgQ0lEX0ZhY2U7CisKKworICB0eXBlZGVmIHN0cnVjdCAgVDFfRmFjZVJlY18KKyAgeworICAgIEZUX0ZhY2VSZWMgICAgICByb290OworICAgIFQxX0ZvbnRSZWMgICAgICB0eXBlMTsKKyAgICBjb25zdCB2b2lkKiAgICAgcHNuYW1lczsKKyAgICBjb25zdCB2b2lkKiAgICAgcHNhdXg7CisgICAgY29uc3Qgdm9pZCogICAgIGFmbV9kYXRhOworICAgIEZUX0NoYXJNYXBSZWMgICBjaGFybWFwcmVjc1syXTsKKyAgICBGVF9DaGFyTWFwICAgICAgY2hhcm1hcHNbMl07CisKKyAgICAvKiBzdXBwb3J0IGZvciBNdWx0aXBsZSBNYXN0ZXJzIGZvbnRzICovCisgICAgUFNfQmxlbmQgICAgICAgIGJsZW5kOworCisgICAgLyogdW5kb2N1bWVudGVkLCBvcHRpb25hbDogaW5kaWNlcyBvZiBzdWJyb3V0aW5lcyB0aGF0IGV4cHJlc3MgICAgICAqLworICAgIC8qIHRoZSBOb3JtYWxpemVEZXNpZ25WZWN0b3IgYW5kIHRoZSBDb252ZXJ0RGVzaWduVmVjdG9yIHByb2NlZHVyZSwgKi8KKyAgICAvKiByZXNwZWN0aXZlbHksIGFzIFR5cGUgMiBjaGFyc3RyaW5nczsgLTEgaWYga2V5d29yZHMgbm90IHByZXNlbnQgICovCisgICAgRlRfSW50ICAgICAgICAgICBuZHZfaWR4OworICAgIEZUX0ludCAgICAgICAgICAgY2R2X2lkeDsKKworICAgIC8qIHVuZG9jdW1lbnRlZCwgb3B0aW9uYWw6IGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIGxlbl9idWlsZGNoYXIgKi8KKyAgICAvKiBmb3IgVHlwZSAyIGZvbnRzOyBtYW5pcHVsYXRlZCBieSBvdGhlcnN1YnJzIDE5LCAyNCwgYW5kIDI1ICAgICovCisgICAgRlRfVUludCAgICAgICAgICBsZW5fYnVpbGRjaGFyOworICAgIEZUX0xvbmcqICAgICAgICAgYnVpbGRjaGFyOworCisgICAgLyogc2luY2UgdmVyc2lvbiAyLjEgLSBpbnRlcmZhY2UgdG8gUG9zdFNjcmlwdCBoaW50ZXIgKi8KKyAgICBjb25zdCB2b2lkKiAgICAgcHNoaW50ZXI7CisKKyAgfSBUMV9GYWNlUmVjOworCisKKyAgdHlwZWRlZiBzdHJ1Y3QgIENJRF9GYWNlUmVjXworICB7CisgICAgRlRfRmFjZVJlYyAgICAgICByb290OworICAgIHZvaWQqICAgICAgICAgICAgcHNuYW1lczsKKyAgICB2b2lkKiAgICAgICAgICAgIHBzYXV4OworICAgIENJRF9GYWNlSW5mb1JlYyAgY2lkOworICAgIFBTX0ZvbnRFeHRyYVJlYyAgZm9udF9leHRyYTsKKyNpZiAwCisgICAgdm9pZCogICAgICAgICAgICBhZm1fZGF0YTsKKyNlbmRpZgorICAgIENJRF9TdWJycyAgICAgICAgc3VicnM7CisKKyAgICAvKiBzaW5jZSB2ZXJzaW9uIDIuMSAtIGludGVyZmFjZSB0byBQb3N0U2NyaXB0IGhpbnRlciAqLworICAgIHZvaWQqICAgICAgICAgICAgcHNoaW50ZXI7CisKKyAgICAvKiBzaW5jZSB2ZXJzaW9uIDIuMS44LCBidXQgd2FzIG9yaWdpbmFsbHkgcG9zaXRpb25lZCBhZnRlciBgYWZtX2RhdGEnICovCisgICAgRlRfQnl0ZSogICAgICAgICBiaW5hcnlfZGF0YTsgLyogdXNlZCBpZiBoZXggZGF0YSBoYXMgYmVlbiBjb252ZXJ0ZWQgKi8KKyAgICBGVF9TdHJlYW0gICAgICAgIGNpZF9zdHJlYW07CisKKyAgfSBDSURfRmFjZVJlYzsKKworCitGVF9FTkRfSEVBREVSCisKKyNlbmRpZiAvKiBfX1QxVFlQRVNfSF9fICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MDdhN2MKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaApAQCAtMCwwICsxLDE1MjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHR0dHlwZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBCYXNpYyBTRk5UL1RydWVUeXBlIHR5cGUgZGVmaW5pdGlvbnMgYW5kIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbiAgICAqLworLyogICAgb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX19UVFRZUEVTX0hfXworI2RlZmluZSBfX1RUVFlQRVNfSF9fCisKKworI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CisjaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUJMRVNfSAorI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICisKKyNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCisjaW5jbHVkZSBGVF9NVUxUSVBMRV9NQVNURVJTX0gKKyNlbmRpZgorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgIFJFUVVJUkVEIFRSVUVUWVBFL09QRU5UWVBFIFRBQkxFUyBERUZJTklUSU9OUyAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRDX0hlYWRlclJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgY29sbGVjdGlvbiBoZWFkZXIuICBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBvZmZzZXRzIG9mICAgICovCisgIC8qICAgIHRoZSBmb250IGhlYWRlcnMgb2YgZWFjaCBkaXN0aW5jdCBUcnVlVHlwZSBmYWNlIGluIHRoZSBmaWxlLiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHRhZyAgICAgOjogTXVzdCBiZSBgdHRjICcgdG8gaW5kaWNhdGUgYSBUcnVlVHlwZSBjb2xsZWN0aW9uLiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdmVyc2lvbiA6OiBUaGUgdmVyc2lvbiBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjb3VudCAgIDo6IFRoZSBudW1iZXIgb2YgZmFjZXMgaW4gdGhlIGNvbGxlY3Rpb24uICBUaGUgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICBzcGVjaWZpY2F0aW9uIHNheXMgdGhpcyBzaG91bGQgYmUgYW4gdW5zaWduZWQgbG9uZywgYnV0ICovCisgIC8qICAgICAgICAgICAgICAgd2UgdXNlIGEgc2lnbmVkIGxvbmcgc2luY2Ugd2UgbmVlZCB0aGUgdmFsdWUgLTEgZm9yICAgICAqLworICAvKiAgICAgICAgICAgICAgIHNwZWNpZmljIHB1cnBvc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG9mZnNldHMgOjogVGhlIG9mZnNldHMgb2YgdGhlIGZvbnQgaGVhZGVycywgb25lIHBlciBmYWNlLiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUQ19IZWFkZXJSZWNfCisgIHsKKyAgICBGVF9VTG9uZyAgIHRhZzsKKyAgICBGVF9GaXhlZCAgIHZlcnNpb247CisgICAgRlRfTG9uZyAgICBjb3VudDsKKyAgICBGVF9VTG9uZyogIG9mZnNldHM7CisKKyAgfSBUVENfSGVhZGVyUmVjOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU0ZOVF9IZWFkZXJSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU0ZOVCBmaWxlIGZvcm1hdCBoZWFkZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZm9ybWF0X3RhZyAgICAgOjogVGhlIGZvbnQgZm9ybWF0IHRhZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fdGFibGVzICAgICA6OiBUaGUgbnVtYmVyIG9mIHRhYmxlcyBpbiBmaWxlLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNlYXJjaF9yYW5nZSAgIDo6IE11c3QgYmUgYDE2ICogKG1heCBwb3dlciBvZiAyIDw9IG51bV90YWJsZXMpJy4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZW50cnlfc2VsZWN0b3IgOjogTXVzdCBiZSBsb2cyIG9mIGBzZWFyY2hfcmFuZ2UgLyAxNicuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByYW5nZV9zaGlmdCAgICA6OiBNdXN0IGJlIGBudW1fdGFibGVzICogMTYgLSBzZWFyY2hfcmFuZ2UnLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBTRk5UX0hlYWRlclJlY18KKyAgeworICAgIEZUX1VMb25nICAgZm9ybWF0X3RhZzsKKyAgICBGVF9VU2hvcnQgIG51bV90YWJsZXM7CisgICAgRlRfVVNob3J0ICBzZWFyY2hfcmFuZ2U7CisgICAgRlRfVVNob3J0ICBlbnRyeV9zZWxlY3RvcjsKKyAgICBGVF9VU2hvcnQgIHJhbmdlX3NoaWZ0OworCisgICAgRlRfVUxvbmcgICBvZmZzZXQ7ICAvKiBub3QgaW4gZmlsZSAqLworCisgIH0gU0ZOVF9IZWFkZXJSZWMsICpTRk5UX0hlYWRlcjsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1RhYmxlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBhIGdpdmVuIHRhYmxlIG9mIGEgVHJ1ZVR5cGUgZm9udC4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRhZyAgICAgIDo6IEEgZm91ci1ieXRlcyB0YWcgZGVzY3JpYmluZyB0aGUgdGFibGUuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ2hlY2tTdW0gOjogVGhlIHRhYmxlIGNoZWNrc3VtLiAgVGhpcyB2YWx1ZSBjYW4gYmUgaWdub3JlZC4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPZmZzZXQgICA6OiBUaGUgb2Zmc2V0IG9mIHRoZSB0YWJsZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgVHJ1ZVR5cGUgKi8KKyAgLyogICAgICAgICAgICAgICAgZm9udCBpbiBpdHMgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBMZW5ndGggICA6OiBUaGUgdGFibGUgbGVuZ3RoIChpbiBieXRlcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9UYWJsZVJlY18KKyAgeworICAgIEZUX1VMb25nICBUYWc7ICAgICAgICAvKiAgICAgICAgdGFibGUgdHlwZSAqLworICAgIEZUX1VMb25nICBDaGVja1N1bTsgICAvKiAgICB0YWJsZSBjaGVja3N1bSAqLworICAgIEZUX1VMb25nICBPZmZzZXQ7ICAgICAvKiB0YWJsZSBmaWxlIG9mZnNldCAqLworICAgIEZUX1VMb25nICBMZW5ndGg7ICAgICAvKiAgICAgIHRhYmxlIGxlbmd0aCAqLworCisgIH0gVFRfVGFibGVSZWMsICpUVF9UYWJsZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFdPRkZfSGVhZGVyUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFdPRkYgZmlsZSBmb3JtYXQgaGVhZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFNlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9XT0ZGLyNXT0ZGSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgV09GRl9IZWFkZXJSZWNfCisgIHsKKyAgICBGVF9VTG9uZyAgIHNpZ25hdHVyZTsKKyAgICBGVF9VTG9uZyAgIGZsYXZvcjsKKyAgICBGVF9VTG9uZyAgIGxlbmd0aDsKKyAgICBGVF9VU2hvcnQgIG51bV90YWJsZXM7CisgICAgRlRfVVNob3J0ICByZXNlcnZlZDsKKyAgICBGVF9VTG9uZyAgIHRvdGFsU2ZudFNpemU7CisgICAgRlRfVVNob3J0ICBtYWpvclZlcnNpb247CisgICAgRlRfVVNob3J0ICBtaW5vclZlcnNpb247CisgICAgRlRfVUxvbmcgICBtZXRhT2Zmc2V0OworICAgIEZUX1VMb25nICAgbWV0YUxlbmd0aDsKKyAgICBGVF9VTG9uZyAgIG1ldGFPcmlnTGVuZ3RoOworICAgIEZUX1VMb25nICAgcHJpdk9mZnNldDsKKyAgICBGVF9VTG9uZyAgIHByaXZMZW5ndGg7CisKKyAgfSBXT0ZGX0hlYWRlclJlYywgKldPRkZfSGVhZGVyOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgV09GRl9UYWJsZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGEgZ2l2ZW4gdGFibGUgb2YgYSBXT0ZGIGZvbnQuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGFnICAgICAgICA6OiBBIGZvdXItYnl0ZXMgdGFnIGRlc2NyaWJpbmcgdGhlIHRhYmxlLiAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPZmZzZXQgICAgIDo6IFRoZSBvZmZzZXQgb2YgdGhlIHRhYmxlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBXT0ZGICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBmb250IGluIGl0cyByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDb21wTGVuZ3RoIDo6IENvbXByZXNzZWQgdGFibGUgbGVuZ3RoIChpbiBieXRlcykuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIE9yaWdMZW5ndGggOjogVW5vbXByZXNzZWQgdGFibGUgbGVuZ3RoIChpbiBieXRlcykuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ2hlY2tTdW0gICA6OiBUaGUgdGFibGUgY2hlY2tzdW0uICBUaGlzIHZhbHVlIGNhbiBiZSBpZ25vcmVkLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBPcmlnT2Zmc2V0IDo6IFRoZSB1bmNvbXByZXNzZWQgdGFibGUgZmlsZSBvZmZzZXQuICBUaGlzIHZhbHVlIGdldHMgKi8KKyAgLyogICAgICAgICAgICAgICAgICBjb21wdXRlZCB3aGlsZSBjb25zdHJ1Y3RpbmcgdGhlICh1bmNvbXByZXNzZWQpIFNGTlQgICovCisgIC8qICAgICAgICAgICAgICAgICAgaGVhZGVyLiAgSXQgaXMgbm90IGNvbnRhaW5lZCBpbiB0aGUgV09GRiBmaWxlLiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFdPRkZfVGFibGVSZWNfCisgIHsKKyAgICBGVF9VTG9uZyAgVGFnOyAgICAgICAgICAgLyogdGFibGUgSUQgICAgICAgICAgICAgICAgICAqLworICAgIEZUX1VMb25nICBPZmZzZXQ7ICAgICAgICAvKiB0YWJsZSBmaWxlIG9mZnNldCAgICAgICAgICovCisgICAgRlRfVUxvbmcgIENvbXBMZW5ndGg7ICAgIC8qIGNvbXByZXNzZWQgdGFibGUgbGVuZ3RoICAgKi8KKyAgICBGVF9VTG9uZyAgT3JpZ0xlbmd0aDsgICAgLyogdW5jb21wcmVzc2VkIHRhYmxlIGxlbmd0aCAqLworICAgIEZUX1VMb25nICBDaGVja1N1bTsgICAgICAvKiB1bmNvbXByZXNzZWQgY2hlY2tzdW0gICAgICovCisKKyAgICBGVF9VTG9uZyAgT3JpZ09mZnNldDsgICAgLyogdW5jb21wcmVzc2VkIHRhYmxlIGZpbGUgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChub3QgaW4gdGhlIFdPRkYgZmlsZSkgICAgICAgICAqLworICB9IFdPRkZfVGFibGVSZWMsICpXT0ZGX1RhYmxlOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9uZ01ldHJpY3NSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzdHJ1Y3R1cmUgbW9kZWxpbmcgdGhlIGxvbmcgbWV0cmljcyBvZiB0aGUgYGhtdHgnIGFuZCBgdm10eCcgICAgICovCisgIC8qICAgIFRydWVUeXBlIHRhYmxlcy4gIFRoZSB2YWx1ZXMgYXJlIGV4cHJlc3NlZCBpbiBmb250IHVuaXRzLiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFkdmFuY2UgOjogVGhlIGFkdmFuY2Ugd2lkdGggb3IgaGVpZ2h0IGZvciB0aGUgZ2x5cGguICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYmVhcmluZyA6OiBUaGUgbGVmdC1zaWRlIG9yIHRvcC1zaWRlIGJlYXJpbmcgZm9yIHRoZSBnbHlwaC4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfTG9uZ01ldHJpY3NSZWNfCisgIHsKKyAgICBGVF9VU2hvcnQgIGFkdmFuY2U7CisgICAgRlRfU2hvcnQgICBiZWFyaW5nOworCisgIH0gVFRfTG9uZ01ldHJpY3NSZWMsICpUVF9Mb25nTWV0cmljczsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1Nob3J0TWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc2ltcGxlIHR5cGUgdG8gbW9kZWwgdGhlIHNob3J0IG1ldHJpY3Mgb2YgdGhlIGBobXR4JyBhbmQgYHZtdHgnICAqLworICAvKiAgICB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgRlRfU2hvcnQgIFRUX1Nob3J0TWV0cmljczsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX05hbWVFbnRyeVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIG1vZGVsaW5nIFRydWVUeXBlIG5hbWUgcmVjb3Jkcy4gIE5hbWUgcmVjb3JkcyBhcmUgdXNlZCAqLworICAvKiAgICB0byBzdG9yZSBpbXBvcnRhbnQgc3RyaW5ncyBsaWtlIGZhbWlseSBuYW1lLCBzdHlsZSBuYW1lLCAgICAgICAgICAgKi8KKyAgLyogICAgY29weXJpZ2h0LCBldGMuIGluIF9sb2NhbGl6ZWRfIHZlcnNpb25zIChpLmUuLCBsYW5ndWFnZSwgZW5jb2RpbmcsICovCisgIC8qICAgIGV0YykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBsYXRmb3JtSUQgICA6OiBUaGUgSUQgb2YgdGhlIG5hbWUncyBlbmNvZGluZyBwbGF0Zm9ybS4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZW5jb2RpbmdJRCAgIDo6IFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBJRCBmb3IgdGhlIG5hbWUncyBlbmNvZGluZy4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsYW5ndWFnZUlEICAgOjogVGhlIHBsYXRmb3JtLXNwZWNpZmljIElEIGZvciB0aGUgbmFtZSdzIGxhbmd1YWdlLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG5hbWVJRCAgICAgICA6OiBUaGUgSUQgc3BlY2lmeWluZyB3aGF0IGtpbmQgb2YgbmFtZSB0aGlzIGlzLiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RyaW5nTGVuZ3RoIDo6IFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBpbiBieXRlcy4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJpbmdPZmZzZXQgOjogVGhlIG9mZnNldCB0byB0aGUgc3RyaW5nIGluIHRoZSBgbmFtZScgdGFibGUuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmluZyAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIHN0cmluZydzIGJ5dGVzLiAgTm90ZSB0aGF0IHRoZXNlICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgYXJlIHVzdWFsbHkgVVRGLTE2IGVuY29kZWQgY2hhcmFjdGVycy4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9OYW1lRW50cnlSZWNfCisgIHsKKyAgICBGVF9VU2hvcnQgIHBsYXRmb3JtSUQ7CisgICAgRlRfVVNob3J0ICBlbmNvZGluZ0lEOworICAgIEZUX1VTaG9ydCAgbGFuZ3VhZ2VJRDsKKyAgICBGVF9VU2hvcnQgIG5hbWVJRDsKKyAgICBGVF9VU2hvcnQgIHN0cmluZ0xlbmd0aDsKKyAgICBGVF9VTG9uZyAgIHN0cmluZ09mZnNldDsKKworICAgIC8qIHRoaXMgbGFzdCBmaWVsZCBpcyBub3QgZGVmaW5lZCBpbiB0aGUgc3BlYyAqLworICAgIC8qIGJ1dCB1c2VkIGJ5IHRoZSBGcmVlVHlwZSBlbmdpbmUgICAgICAgICAgICAqLworCisgICAgRlRfQnl0ZSogICBzdHJpbmc7CisKKyAgfSBUVF9OYW1lRW50cnlSZWMsICpUVF9OYW1lRW50cnk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9OYW1lVGFibGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSBtb2RlbGluZyB0aGUgVHJ1ZVR5cGUgbmFtZSB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmb3JtYXQgICAgICAgICA6OiBUaGUgZm9ybWF0IG9mIHRoZSBuYW1lIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bU5hbWVSZWNvcmRzIDo6IFRoZSBudW1iZXIgb2YgbmFtZXMgaW4gdGFibGUuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc3RvcmFnZU9mZnNldCAgOjogVGhlIG9mZnNldCBvZiB0aGUgbmFtZSB0YWJsZSBpbiB0aGUgYG5hbWUnICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbmFtZXMgICAgICAgICAgOjogQW4gYXJyYXkgb2YgbmFtZSByZWNvcmRzLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBzdHJlYW0gICAgICAgICA6OiB0aGUgZmlsZSdzIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9OYW1lVGFibGVSZWNfCisgIHsKKyAgICBGVF9VU2hvcnQgICAgICAgICBmb3JtYXQ7CisgICAgRlRfVUludCAgICAgICAgICAgbnVtTmFtZVJlY29yZHM7CisgICAgRlRfVUludCAgICAgICAgICAgc3RvcmFnZU9mZnNldDsKKyAgICBUVF9OYW1lRW50cnlSZWMqICBuYW1lczsKKyAgICBGVF9TdHJlYW0gICAgICAgICBzdHJlYW07CisKKyAgfSBUVF9OYW1lVGFibGVSZWMsICpUVF9OYW1lVGFibGU7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgT1BUSU9OQUwgVFJVRVRZUEUvT1BFTlRZUEUgVEFCTEVTIERFRklOSVRJT05TICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9HYXNwUmFuZ2VSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHRpbnkgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBnYXNwIHJhbmdlIGFjY29yZGluZyB0byB0aGUgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4UFBFTSAgOjogVGhlIG1heGltdW0gcHBlbSB2YWx1ZSB0byB3aGljaCBgZ2FzcEZsYWcnIGFwcGxpZXMuICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnYXNwRmxhZyA6OiBBIGZsYWcgZGVzY3JpYmluZyB0aGUgZ3JpZC1maXR0aW5nIGFuZCBhbnRpLWFsaWFzaW5nICAgKi8KKyAgLyogICAgICAgICAgICAgICAgbW9kZXMgdG8gYmUgdXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfR2FzcFJhbmdlUmVjXworICB7CisgICAgRlRfVVNob3J0ICBtYXhQUEVNOworICAgIEZUX1VTaG9ydCAgZ2FzcEZsYWc7CisKKyAgfSBUVF9HYXNwUmFuZ2VSZWMsICpUVF9HYXNwUmFuZ2U7CisKKworI2RlZmluZSBUVF9HQVNQX0dSSURGSVQgIDB4MDEKKyNkZWZpbmUgVFRfR0FTUF9ET0dSQVkgICAweDAyCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9HYXNwUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSBtb2RlbGluZyB0aGUgVHJ1ZVR5cGUgYGdhc3AnIHRhYmxlIHVzZWQgdG8gc3BlY2lmeSAgICAgKi8KKyAgLyogICAgZ3JpZC1maXR0aW5nIGFuZCBhbnRpLWFsaWFzaW5nIGJlaGF2aW91ci4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdmVyc2lvbiAgICA6OiBUaGUgdmVyc2lvbiBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1SYW5nZXMgIDo6IFRoZSBudW1iZXIgb2YgZ2FzcCByYW5nZXMgaW4gdGFibGUuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdhc3BSYW5nZXMgOjogQW4gYXJyYXkgb2YgZ2FzcCByYW5nZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0dhc3BfCisgIHsKKyAgICBGVF9VU2hvcnQgICAgIHZlcnNpb247CisgICAgRlRfVVNob3J0ICAgICBudW1SYW5nZXM7CisgICAgVFRfR2FzcFJhbmdlICBnYXNwUmFuZ2VzOworCisgIH0gVFRfR2FzcFJlYzsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgRU1CRURERUQgQklUTUFQUyBTVVBQT1JUICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1NCaXRfTWV0cmljc1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCB0aGUgYmlnIG1ldHJpY3Mgb2YgYSBnaXZlbiBnbHlwaCBiaXRtYXAgICAqLworICAvKiAgICBpbiBhIFRydWVUeXBlIG9yIE9wZW5UeXBlIGZvbnQuICBUaGVzZSBhcmUgdXN1YWxseSBmb3VuZCBpbiB0aGUgICAgKi8KKyAgLyogICAgYEVCRFQnIChNaWNyb3NvZnQpIG9yIGBibG9jJyAoQXBwbGUpIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaGVpZ2h0ICAgICAgIDo6IFRoZSBnbHlwaCBoZWlnaHQgaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB3aWR0aCAgICAgICAgOjogVGhlIGdseXBoIHdpZHRoIGluIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGhvcmlCZWFyaW5nWCA6OiBUaGUgaG9yaXpvbnRhbCBsZWZ0IGJlYXJpbmcuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaG9yaUJlYXJpbmdZIDo6IFRoZSBob3Jpem9udGFsIHRvcCBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBob3JpQWR2YW5jZSAgOjogVGhlIGhvcml6b250YWwgYWR2YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHZlcnRCZWFyaW5nWCA6OiBUaGUgdmVydGljYWwgbGVmdCBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdmVydEJlYXJpbmdZIDo6IFRoZSB2ZXJ0aWNhbCB0b3AgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB2ZXJ0QWR2YW5jZSAgOjogVGhlIHZlcnRpY2FsIGFkdmFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9TQml0X01ldHJpY3NSZWNfCisgIHsKKyAgICBGVF9VU2hvcnQgIGhlaWdodDsKKyAgICBGVF9VU2hvcnQgIHdpZHRoOworCisgICAgRlRfU2hvcnQgICBob3JpQmVhcmluZ1g7CisgICAgRlRfU2hvcnQgICBob3JpQmVhcmluZ1k7CisgICAgRlRfVVNob3J0ICBob3JpQWR2YW5jZTsKKworICAgIEZUX1Nob3J0ICAgdmVydEJlYXJpbmdYOworICAgIEZUX1Nob3J0ICAgdmVydEJlYXJpbmdZOworICAgIEZUX1VTaG9ydCAgdmVydEFkdmFuY2U7CisKKyAgfSBUVF9TQml0X01ldHJpY3NSZWMsICpUVF9TQml0X01ldHJpY3M7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9TQml0X1NtYWxsTWV0cmljc1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgdGhlIHNtYWxsIG1ldHJpY3Mgb2YgYSBnaXZlbiBnbHlwaCBiaXRtYXAgKi8KKyAgLyogICAgaW4gYSBUcnVlVHlwZSBvciBPcGVuVHlwZSBmb250LiAgVGhlc2UgYXJlIHVzdWFsbHkgZm91bmQgaW4gdGhlICAgICovCisgIC8qICAgIGBFQkRUJyAoTWljcm9zb2Z0KSBvciB0aGUgYGJkYXQnIChBcHBsZSkgdGFibGUuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGhlaWdodCAgIDo6IFRoZSBnbHlwaCBoZWlnaHQgaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgd2lkdGggICAgOjogVGhlIGdseXBoIHdpZHRoIGluIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBiZWFyaW5nWCA6OiBUaGUgbGVmdC1zaWRlIGJlYXJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJlYXJpbmdZIDo6IFRoZSB0b3Atc2lkZSBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYWR2YW5jZSAgOjogVGhlIGFkdmFuY2Ugd2lkdGggb3IgaGVpZ2h0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfU0JpdF9TbWFsbF9NZXRyaWNzXworICB7CisgICAgRlRfQnl0ZSAgaGVpZ2h0OworICAgIEZUX0J5dGUgIHdpZHRoOworCisgICAgRlRfQ2hhciAgYmVhcmluZ1g7CisgICAgRlRfQ2hhciAgYmVhcmluZ1k7CisgICAgRlRfQnl0ZSAgYWR2YW5jZTsKKworICB9IFRUX1NCaXRfU21hbGxNZXRyaWNzUmVjLCAqVFRfU0JpdF9TbWFsbE1ldHJpY3M7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9TQml0X0xpbmVNZXRyaWNzUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSB0ZXh0IGxpbmUgbWV0cmljcyBvZiBhIGdpdmVuICAgICAgKi8KKyAgLyogICAgYml0bWFwIHN0cmlrZSwgZm9yIGVpdGhlciBhIGhvcml6b250YWwgb3IgdmVydGljYWwgbGF5b3V0LiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYXNjZW5kZXIgICAgICAgICAgICAgICAgOjogVGhlIGFzY2VuZGVyIGluIHBpeGVscy4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBkZXNjZW5kZXIgICAgICAgICAgICAgICA6OiBUaGUgZGVzY2VuZGVyIGluIHBpeGVscy4gICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1heF93aWR0aCAgICAgICAgICAgICAgIDo6IFRoZSBtYXhpbXVtIGdseXBoIHdpZHRoIGluIHBpeGVscy4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2FyZXRfc2xvcGVfZW51bWVyYXRvciAgOjogUmlzZSBvZiB0aGUgY2FyZXQgc2xvcGUsIHR5cGljYWxseSBzZXQgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIDEgZm9yIG5vbi1pdGFsaWMgZm9udHMuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2FyZXRfc2xvcGVfZGVub21pbmF0b3IgOjogUmlzZSBvZiB0aGUgY2FyZXQgc2xvcGUsIHR5cGljYWxseSBzZXQgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIDAgZm9yIG5vbi1pdGFsaWMgZm9udHMuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2FyZXRfb2Zmc2V0ICAgICAgICAgICAgOjogT2Zmc2V0IGluIHBpeGVscyB0byBtb3ZlIHRoZSBjYXJldCBmb3IgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlciBwb3NpdGlvbmluZy4gICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWluX29yaWdpbl9TQiAgICAgICAgICAgOjogTWluaW11bSBvZiBob3JpQmVhcmluZ1ggKHJlc3AuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRCZWFyaW5nWSkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtaW5fYWR2YW5jZV9TQiAgICAgICAgICA6OiBNaW5pbXVtIG9mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbCBhZHZhbmNlIC0gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBob3JpQmVhcmluZ1ggKyB3aWR0aCApICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3AuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBhZHZhbmNlIC0gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHZlcnRCZWFyaW5nWSArIGhlaWdodCApICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4X2JlZm9yZV9CTCAgICAgICAgICAgOjogTWF4aW11bSBvZiBob3JpQmVhcmluZ1kgKHJlc3AuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRCZWFyaW5nWSkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWluX2FmdGVyX0JMICAgICAgICAgICAgOjogTWluaW11bSBvZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcmlCZWFyaW5nWSAtIGhlaWdodCAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3AuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0QmVhcmluZ1ggLSB3aWR0aCAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwYWRzICAgICAgICAgICAgICAgICAgICA6OiBVbnVzZWQgKHRvIG1ha2UgdGhlIHNpemUgb2YgdGhlIHJlY29yZCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBtdWx0aXBsZSBvZiAzMiBiaXRzLiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfU0JpdF9MaW5lTWV0cmljc1JlY18KKyAgeworICAgIEZUX0NoYXIgIGFzY2VuZGVyOworICAgIEZUX0NoYXIgIGRlc2NlbmRlcjsKKyAgICBGVF9CeXRlICBtYXhfd2lkdGg7CisgICAgRlRfQ2hhciAgY2FyZXRfc2xvcGVfbnVtZXJhdG9yOworICAgIEZUX0NoYXIgIGNhcmV0X3Nsb3BlX2Rlbm9taW5hdG9yOworICAgIEZUX0NoYXIgIGNhcmV0X29mZnNldDsKKyAgICBGVF9DaGFyICBtaW5fb3JpZ2luX1NCOworICAgIEZUX0NoYXIgIG1pbl9hZHZhbmNlX1NCOworICAgIEZUX0NoYXIgIG1heF9iZWZvcmVfQkw7CisgICAgRlRfQ2hhciAgbWluX2FmdGVyX0JMOworICAgIEZUX0NoYXIgIHBhZHNbMl07CisKKyAgfSBUVF9TQml0X0xpbmVNZXRyaWNzUmVjLCAqVFRfU0JpdF9MaW5lTWV0cmljczsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1NCaXRfUmFuZ2VSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgVHJ1ZVR5cGUvT3BlblR5cGUgc3ViSW5kZXhUYWJsZSBhcyBkZWZpbmVkIGluIHRoZSBgRUJMQycgICAgICAgICAqLworICAvKiAgICAoTWljcm9zb2Z0KSBvciBgYmxvYycgKEFwcGxlKSB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmaXJzdF9nbHlwaCAgIDo6IFRoZSBmaXJzdCBnbHlwaCBpbmRleCBpbiB0aGUgcmFuZ2UuICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxhc3RfZ2x5cGggICAgOjogVGhlIGxhc3QgZ2x5cGggaW5kZXggaW4gdGhlIHJhbmdlLiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW5kZXhfZm9ybWF0ICA6OiBUaGUgZm9ybWF0IG9mIGluZGV4IHRhYmxlLiAgVmFsaWQgdmFsdWVzIGFyZSAxICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgdG8gNS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW1hZ2VfZm9ybWF0ICA6OiBUaGUgZm9ybWF0IG9mIGBFQkRUJyBpbWFnZSBkYXRhLiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBpbWFnZV9vZmZzZXQgIDo6IFRoZSBvZmZzZXQgdG8gaW1hZ2UgZGF0YSBpbiBgRUJEVCcuICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGltYWdlX3NpemUgICAgOjogRm9yIGluZGV4IGZvcm1hdHMgMiBhbmQgNS4gIFRoaXMgaXMgdGhlIHNpemUgaW4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgIGJ5dGVzIG9mIGVhY2ggZ2x5cGggYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJpZ19tZXRyaWNzICAgOjogRm9yIGluZGV4IGZvcm1hdHMgMiBhbmQgNS4gIFRoaXMgaXMgdGhlIGJpZyAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MgZm9yIGVhY2ggZ2x5cGggYml0bWFwLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9nbHlwaHMgICAgOjogRm9yIGluZGV4IGZvcm1hdHMgNCBhbmQgNS4gIFRoaXMgaXMgdGhlIG51bWJlciBvZiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgIGdseXBocyBpbiB0aGUgY29kZSBhcnJheS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdseXBoX29mZnNldHMgOjogRm9yIGluZGV4IGZvcm1hdHMgMSBhbmQgMy4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGhfY29kZXMgICA6OiBGb3IgaW5kZXggZm9ybWF0cyA0IGFuZCA1LiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0YWJsZV9vZmZzZXQgIDo6IFRoZSBvZmZzZXQgb2YgdGhlIGluZGV4IHRhYmxlIGluIHRoZSBgRUJMQycgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICB0YWJsZS4gIE9ubHkgdXNlZCBkdXJpbmcgc3RyaWtlIGxvYWRpbmcuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfU0JpdF9SYW5nZVJlY18KKyAgeworICAgIEZUX1VTaG9ydCAgICAgICAgICAgZmlyc3RfZ2x5cGg7CisgICAgRlRfVVNob3J0ICAgICAgICAgICBsYXN0X2dseXBoOworCisgICAgRlRfVVNob3J0ICAgICAgICAgICBpbmRleF9mb3JtYXQ7CisgICAgRlRfVVNob3J0ICAgICAgICAgICBpbWFnZV9mb3JtYXQ7CisgICAgRlRfVUxvbmcgICAgICAgICAgICBpbWFnZV9vZmZzZXQ7CisKKyAgICBGVF9VTG9uZyAgICAgICAgICAgIGltYWdlX3NpemU7CisgICAgVFRfU0JpdF9NZXRyaWNzUmVjICBtZXRyaWNzOworICAgIEZUX1VMb25nICAgICAgICAgICAgbnVtX2dseXBoczsKKworICAgIEZUX1VMb25nKiAgICAgICAgICAgZ2x5cGhfb2Zmc2V0czsKKyAgICBGVF9VU2hvcnQqICAgICAgICAgIGdseXBoX2NvZGVzOworCisgICAgRlRfVUxvbmcgICAgICAgICAgICB0YWJsZV9vZmZzZXQ7CisKKyAgfSBUVF9TQml0X1JhbmdlUmVjLCAqVFRfU0JpdF9SYW5nZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1NCaXRfU3RyaWtlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgZGVzY3JpYmUgYSBnaXZlbiBiaXRtYXAgc3RyaWtlIGluIHRoZSBgRUJMQycgICAgICAqLworICAvKiAgICAoTWljcm9zb2Z0KSBvciBgYmxvYycgKEFwcGxlKSB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIG51bV9pbmRleF9yYW5nZXMgOjogVGhlIG51bWJlciBvZiBpbmRleCByYW5nZXMuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgaW5kZXhfcmFuZ2VzICAgICA6OiBBbiBhcnJheSBvZiBnbHlwaCBpbmRleCByYW5nZXMuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBjb2xvcl9yZWYgICAgICAgIDo6IFVudXNlZC4gIGBjb2xvcl9yZWYnIGlzIHB1dCBpbiBmb3IgZnV0dXJlICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICBlbmhhbmNlbWVudHMsIGJ1dCB0aGVzZSBmaWVsZHMgYXJlIGFscmVhZHkgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgaW4gdXNlIGJ5IG90aGVyIHBsYXRmb3JtcyAoZS5nLiBOZXd0b24pLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgIEZvciBkZXRhaWxzLCBwbGVhc2Ugc2VlICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZm9udHMvVHJ1ZVR5cGUtUmVmZXJlbmNlLU1hbnVhbC9STTA2L0NoYXA2YmxvYy5odG1sICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIGhvcmkgICAgICAgICAgICAgOjogVGhlIGxpbmUgbWV0cmljcyBmb3IgaG9yaXpvbnRhbCBsYXlvdXRzLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgdmVydCAgICAgICAgICAgICA6OiBUaGUgbGluZSBtZXRyaWNzIGZvciB2ZXJ0aWNhbCBsYXlvdXRzLiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBzdGFydF9nbHlwaCAgICAgIDo6IFRoZSBsb3dlc3QgZ2x5cGggaW5kZXggZm9yIHRoaXMgc3RyaWtlLiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIGVuZF9nbHlwaCAgICAgICAgOjogVGhlIGhpZ2hlc3QgZ2x5cGggaW5kZXggZm9yIHRoaXMgc3RyaWtlLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgeF9wcGVtICAgICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGhvcml6b250YWwgcGl4ZWxzIHBlciBFTS4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICB5X3BwZW0gICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgdmVydGljYWwgcGl4ZWxzIHBlciBFTS4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIGJpdF9kZXB0aCAgICAgICAgOjogVGhlIGJpdCBkZXB0aC4gIFZhbGlkIHZhbHVlcyBhcmUgMSwgMiwgNCwgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgIGFuZCA4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIGZsYWdzICAgICAgICAgICAgOjogSXMgdGhpcyBhIHZlcnRpY2FsIG9yIGhvcml6b250YWwgc3RyaWtlPyAgRm9yICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHMsIHBsZWFzZSBzZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZm9udHMvVHJ1ZVR5cGUtUmVmZXJlbmNlLU1hbnVhbC9STTA2L0NoYXA2YmxvYy5odG1sICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfU0JpdF9TdHJpa2VSZWNfCisgIHsKKyAgICBGVF9JbnQgICAgICAgICAgICAgICAgICBudW1fcmFuZ2VzOworICAgIFRUX1NCaXRfUmFuZ2UgICAgICAgICAgIHNiaXRfcmFuZ2VzOworICAgIEZUX1VMb25nICAgICAgICAgICAgICAgIHJhbmdlc19vZmZzZXQ7CisKKyAgICBGVF9VTG9uZyAgICAgICAgICAgICAgICBjb2xvcl9yZWY7CisKKyAgICBUVF9TQml0X0xpbmVNZXRyaWNzUmVjICBob3JpOworICAgIFRUX1NCaXRfTGluZU1ldHJpY3NSZWMgIHZlcnQ7CisKKyAgICBGVF9VU2hvcnQgICAgICAgICAgICAgICBzdGFydF9nbHlwaDsKKyAgICBGVF9VU2hvcnQgICAgICAgICAgICAgICBlbmRfZ2x5cGg7CisKKyAgICBGVF9CeXRlICAgICAgICAgICAgICAgICB4X3BwZW07CisgICAgRlRfQnl0ZSAgICAgICAgICAgICAgICAgeV9wcGVtOworCisgICAgRlRfQnl0ZSAgICAgICAgICAgICAgICAgYml0X2RlcHRoOworICAgIEZUX0NoYXIgICAgICAgICAgICAgICAgIGZsYWdzOworCisgIH0gVFRfU0JpdF9TdHJpa2VSZWMsICpUVF9TQml0X1N0cmlrZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1NCaXRfQ29tcG9uZW50UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIGNvbXBvdW5kIHNiaXQgZWxlbWVudC4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdseXBoX2NvZGUgOjogVGhlIGVsZW1lbnQncyBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeF9vZmZzZXQgICA6OiBUaGUgZWxlbWVudCdzIGxlZnQgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB5X29mZnNldCAgIDo6IFRoZSBlbGVtZW50J3MgdG9wIGJlYXJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9TQml0X0NvbXBvbmVudFJlY18KKyAgeworICAgIEZUX1VTaG9ydCAgZ2x5cGhfY29kZTsKKyAgICBGVF9DaGFyICAgIHhfb2Zmc2V0OworICAgIEZUX0NoYXIgICAgeV9vZmZzZXQ7CisKKyAgfSBUVF9TQml0X0NvbXBvbmVudFJlYywgKlRUX1NCaXRfQ29tcG9uZW50OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfU0JpdF9TY2FsZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCBkZXNjcmliZSBhIGdpdmVuIGJpdG1hcCBzY2FsaW5nIHRhYmxlLCBhcyBkZWZpbmVkICovCisgIC8qICAgIGluIHRoZSBgRUJTQycgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGhvcmkgICAgICAgICAgICAgIDo6IFRoZSBob3Jpem9udGFsIGxpbmUgbWV0cmljcy4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdmVydCAgICAgICAgICAgICAgOjogVGhlIHZlcnRpY2FsIGxpbmUgbWV0cmljcy4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4X3BwZW0gICAgICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGhvcml6b250YWwgcGl4ZWxzIHBlciBFTS4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHlfcHBlbSAgICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgdmVydGljYWwgcGl4ZWxzIHBlciBFTS4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeF9wcGVtX3N1YnN0aXR1dGUgOjogU3Vic3RpdHV0aW9uIHhfcHBlbSB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB5X3BwZW1fc3Vic3RpdHV0ZSA6OiBTdWJzdGl0dXRpb24geV9wcGVtIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9TQml0X1NjYWxlUmVjXworICB7CisgICAgVFRfU0JpdF9MaW5lTWV0cmljc1JlYyAgaG9yaTsKKyAgICBUVF9TQml0X0xpbmVNZXRyaWNzUmVjICB2ZXJ0OworCisgICAgRlRfQnl0ZSAgICAgICAgICAgICAgICAgeF9wcGVtOworICAgIEZUX0J5dGUgICAgICAgICAgICAgICAgIHlfcHBlbTsKKworICAgIEZUX0J5dGUgICAgICAgICAgICAgICAgIHhfcHBlbV9zdWJzdGl0dXRlOworICAgIEZUX0J5dGUgICAgICAgICAgICAgICAgIHlfcHBlbV9zdWJzdGl0dXRlOworCisgIH0gVFRfU0JpdF9TY2FsZVJlYywgKlRUX1NCaXRfU2NhbGU7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICBQT1NUU0NSSVBUIEdMWVBIIE5BTUVTIFNVUFBPUlQgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Qb3N0XzIwUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQb3N0c2NyaXB0IG5hbWVzIHN1Yi10YWJsZSwgZm9ybWF0IDIuMC4gIFN0b3JlcyB0aGUgUFMgbmFtZSBvZiAgICAgKi8KKyAgLyogICAgZWFjaCBnbHlwaCBpbiB0aGUgZm9udCBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtX2dseXBocyAgICA6OiBUaGUgbnVtYmVyIG9mIG5hbWVkIGdseXBocyBpbiB0aGUgdGFibGUuICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fbmFtZXMgICAgIDo6IFRoZSBudW1iZXIgb2YgUFMgbmFtZXMgc3RvcmVkIGluIHRoZSB0YWJsZS4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdseXBoX2luZGljZXMgOjogVGhlIGluZGljZXMgb2YgdGhlIGdseXBocyBpbiB0aGUgbmFtZXMgYXJyYXlzLiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGhfbmFtZXMgICA6OiBUaGUgUFMgbmFtZXMgbm90IGluIE1hYyBFbmNvZGluZy4gICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfUG9zdF8yMFJlY18KKyAgeworICAgIEZUX1VTaG9ydCAgIG51bV9nbHlwaHM7CisgICAgRlRfVVNob3J0ICAgbnVtX25hbWVzOworICAgIEZUX1VTaG9ydCogIGdseXBoX2luZGljZXM7CisgICAgRlRfQ2hhcioqICAgZ2x5cGhfbmFtZXM7CisKKyAgfSBUVF9Qb3N0XzIwUmVjLCAqVFRfUG9zdF8yMDsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1Bvc3RfMjVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBvc3RzY3JpcHQgbmFtZXMgc3ViLXRhYmxlLCBmb3JtYXQgMi41LiAgU3RvcmVzIHRoZSBQUyBuYW1lIG9mICAgICAqLworICAvKiAgICBlYWNoIGdseXBoIGluIHRoZSBmb250IGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fZ2x5cGhzIDo6IFRoZSBudW1iZXIgb2YgZ2x5cGhzIGluIHRoZSB0YWJsZS4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG9mZnNldHMgICAgOjogQW4gYXJyYXkgb2Ygc2lnbmVkIG9mZnNldHMgaW4gYSBub3JtYWwgTWFjICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIFBvc3RzY3JpcHQgbmFtZSBlbmNvZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9Qb3N0XzI1XworICB7CisgICAgRlRfVVNob3J0ICBudW1fZ2x5cGhzOworICAgIEZUX0NoYXIqICAgb2Zmc2V0czsKKworICB9IFRUX1Bvc3RfMjVSZWMsICpUVF9Qb3N0XzI1OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfUG9zdF9OYW1lc1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUG9zdHNjcmlwdCBuYW1lcyB0YWJsZSwgZWl0aGVyIGZvcm1hdCAyLjAgb3IgMi41LiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbG9hZGVkICAgIDo6IEEgZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBQUyBuYW1lcyBhcmUgbG9hZGVkLiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmb3JtYXRfMjAgOjogVGhlIHN1Yi10YWJsZSB1c2VkIGZvciBmb3JtYXQgMi4wLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZvcm1hdF8yNSA6OiBUaGUgc3ViLXRhYmxlIHVzZWQgZm9yIGZvcm1hdCAyLjUuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1Bvc3RfTmFtZXNSZWNfCisgIHsKKyAgICBGVF9Cb29sICBsb2FkZWQ7CisKKyAgICB1bmlvbgorICAgIHsKKyAgICAgIFRUX1Bvc3RfMjBSZWMgIGZvcm1hdF8yMDsKKyAgICAgIFRUX1Bvc3RfMjVSZWMgIGZvcm1hdF8yNTsKKworICAgIH0gbmFtZXM7CisKKyAgfSBUVF9Qb3N0X05hbWVzUmVjLCAqVFRfUG9zdF9OYW1lczsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgR1ggVkFSSUFUSU9OIFRBQkxFIFNVUFBPUlQgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAorICB0eXBlZGVmIHN0cnVjdCBHWF9CbGVuZFJlY18gICpHWF9CbGVuZDsKKyNlbmRpZgorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICAgRU1CRURERUQgQkRGIFBST1BFUlRJRVMgVEFCTEUgU1VQUE9SVCAgICAgICAgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAvKgorICAgKiBUaGVzZSB0eXBlcyBhcmUgdXNlZCB0byBzdXBwb3J0IGEgYEJERiAnIHRhYmxlIHRoYXQgaXNuJ3QgcGFydCBvZiB0aGUKKyAgICogb2ZmaWNpYWwgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbi4gIEl0IGlzIG1haW5seSB1c2VkIGluIFNGTlQtYmFzZWQKKyAgICogYml0bWFwIGZvbnRzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgZnJvbSBhIHNldCBvZiBCREYgZm9udHMuCisgICAqCisgICAqIFRoZSBmb3JtYXQgb2YgdGhlIHRhYmxlIGlzIGFzIGZvbGxvd3MuCisgICAqCisgICAqICAgVVNIT1JUICAgdmVyc2lvbiAgICAgIGBCREYgJyB0YWJsZSB2ZXJzaW9uIG51bWJlciwgc2hvdWxkIGJlIDB4MDAwMS4KKyAgICogICBVU0hPUlQgICBzdHJpa2VDb3VudCAgTnVtYmVyIG9mIHN0cmlrZXMgKGJpdG1hcCBzaXplcykgaW4gdGhpcyB0YWJsZS4KKyAgICogICBVTE9ORyAgICBzdHJpbmdUYWJsZSAgT2Zmc2V0IChmcm9tIHN0YXJ0IG9mIEJERiB0YWJsZSkgdG8gc3RyaW5nCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLgorICAgKgorICAgKiBUaGlzIGlzIGZvbGxvd2VkIGJ5IGFuIGFycmF5IG9mIGBzdHJpa2VDb3VudCcgZGVzY3JpcHRvcnMsIGhhdmluZyB0aGUKKyAgICogZm9sbG93aW5nIGZvcm1hdC4KKyAgICoKKyAgICogICBVU0hPUlQgICBwcGVtICAgICAgICAgVmVydGljYWwgcGl4ZWxzIHBlciBFTSBmb3IgdGhpcyBzdHJpa2UuCisgICAqICAgVVNIT1JUICAgbnVtSXRlbXMgICAgIE51bWJlciBvZiBpdGVtcyBmb3IgdGhpcyBzdHJpa2UgKHByb3BlcnRpZXMgYW5kCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGF0b21zKS4gIE1heGltdW0gaXMgMjU1LgorICAgKgorICAgKiBUaGlzIGFycmF5IGluIHR1cm4gaXMgZm9sbG93ZWQgYnkgYHN0cmlrZUNvdW50JyB2YWx1ZSBzZXRzLiAgRWFjaAorICAgKiBgdmFsdWUgc2V0JyBpcyBhbiBhcnJheSBvZiBgbnVtSXRlbXMnIGl0ZW1zIHdpdGggdGhlIGZvbGxvd2luZyBmb3JtYXQuCisgICAqCisgICAqICAgVUxPTkcgICAgaXRlbV9uYW1lICAgIE9mZnNldCBpbiBzdHJpbmcgdGFibGUgdG8gaXRlbSBuYW1lLgorICAgKiAgIFVTSE9SVCAgIGl0ZW1fdHlwZSAgICBUaGUgaXRlbSB0eXBlLiAgUG9zc2libGUgdmFsdWVzIGFyZQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwID0+IHN0cmluZyAoZS5nLiwgQ09NTUVOVCkKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9PiBhdG9tICAgKGUuZy4sIEZPTlQgb3IgZXZlbiBTSVpFKQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyID0+IGludDMyCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgPT4gdWludDMyCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAgPT4gQSBmbGFnIHRvIGluZGljYXRlIGEgcHJvcGVydGllcy4gIFRoaXMKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBPUmVkIHdpdGggdGhlIGFib3ZlIHZhbHVlcy4KKyAgICogICBVTE9ORyAgICBpdGVtX3ZhbHVlICAgRm9yIHN0cmluZ3MgID0+IE9mZnNldCBpbnRvIHN0cmluZyB0YWJsZSB3aXRob3V0CisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ycmVzcG9uZGluZyBkb3VibGUgcXVvdGVzLgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgYXRvbXMgICAgPT4gT2Zmc2V0IGludG8gc3RyaW5nIHRhYmxlLgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgaW50ZWdlcnMgPT4gRGlyZWN0IHZhbHVlLgorICAgKgorICAgKiBBbGwgc3RyaW5ncyBpbiB0aGUgc3RyaW5nIHRhYmxlIGNvbnNpc3Qgb2YgYnl0ZXMgYW5kIGFyZQorICAgKiB6ZXJvLXRlcm1pbmF0ZWQuCisgICAqCisgICAqLworCisjaWZkZWYgVFRfQ09ORklHX09QVElPTl9CREYKKworICB0eXBlZGVmIHN0cnVjdCAgVFRfQkRGUmVjXworICB7CisgICAgRlRfQnl0ZSogICB0YWJsZTsKKyAgICBGVF9CeXRlKiAgIHRhYmxlX2VuZDsKKyAgICBGVF9CeXRlKiAgIHN0cmluZ3M7CisgICAgRlRfVUxvbmcgICBzdHJpbmdzX3NpemU7CisgICAgRlRfVUludCAgICBudW1fc3RyaWtlczsKKyAgICBGVF9Cb29sICAgIGxvYWRlZDsKKworICB9IFRUX0JERlJlYywgKlRUX0JERjsKKworI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fQkRGICovCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqICAgICAgICAgICAgICAgICAgT1JJR0lOQUwgVFRfRkFDRSBDTEFTUyBERUZJTklUSU9OICAgICAgICAgICAgICAgICoqKi8KKyAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisgIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGlzIHN0cnVjdHVyZS9jbGFzcyBpcyBkZWZpbmVkIGhlcmUgYmVjYXVzZSBpdCBpcyBjb21tb24gdG8gdGhlICAgICAgKi8KKyAgLyogZm9sbG93aW5nIGZvcm1hdHM6IFRURiwgT3BlblR5cGUtVFQsIGFuZCBPcGVuVHlwZS1DRkYuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBOb3RlLCBob3dldmVyLCB0aGF0IHRoZSBjbGFzc2VzIFRUX1NpemUgYW5kIFRUX0dseXBoU2xvdCBhcmUgbm90ICAgICAgKi8KKyAgLyogc2hhcmVkIGJldHdlZW4gZm9udCBkcml2ZXJzLCBhbmQgYXJlIHRodXMgZGVmaW5lZCBpbiBgdHRvYmpzLmgnLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgaGFuZGxlIHRvIGEgVHJ1ZVR5cGUgZmFjZS9mb250IG9iamVjdC4gIEEgVFRfRmFjZSBlbmNhcHN1bGF0ZXMgICAqLworICAvKiAgICB0aGUgcmVzb2x1dGlvbiBhbmQgc2NhbGluZyBpbmRlcGVuZGVudCBwYXJ0cyBvZiBhIFRydWVUeXBlIGZvbnQgICAgKi8KKyAgLyogICAgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIFRUX0ZhY2Ugc3RydWN0dXJlIGlzIGFsc28gdXNlZCBhcyBhIGBwYXJlbnQgY2xhc3MnIGZvciB0aGUgICAgICovCisgIC8qICAgIE9wZW5UeXBlLUNGRiBjbGFzcyAoVDJfRmFjZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgVFRfRmFjZVJlY18qICBUVF9GYWNlOworCisKKyAgLyogYSBmdW5jdGlvbiB0eXBlIHVzZWQgZm9yIHRoZSB0cnVldHlwZSBieXRlY29kZSBpbnRlcnByZXRlciBob29rcyAqLworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqVFRfSW50ZXJwcmV0ZXIpKCB2b2lkKiAgZXhlY19jb250ZXh0ICk7CisKKyAgLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLworICB0eXBlZGVmIHN0cnVjdCBUVF9Mb2FkZXJSZWNfKiAgVFRfTG9hZGVyOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZGVyX0dvdG9UYWJsZUZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2Vla3MgYSBzdHJlYW0gdG8gdGhlIHN0YXJ0IG9mIGEgZ2l2ZW4gVHJ1ZVR5cGUgdGFibGUuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0YWcgICAgOjogQSA0LWJ5dGUgdGFnIHVzZWQgdG8gbmFtZSB0aGUgdGFibGUuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHN0cmVhbSA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxlbmd0aCA6OiBUaGUgbGVuZ3RoIG9mIHRoZSB0YWJsZSBpbiBieXRlcy4gIFNldCB0byAwIGlmIG5vdCAgICAgICAqLworICAvKiAgICAgICAgICAgICAgbmVlZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgc3RyZWFtIGN1cnNvciBtdXN0IGJlIGF0IHRoZSBmb250IGZpbGUncyBvcmlnaW4uICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpUVF9Mb2FkZXJfR290b1RhYmxlRnVuYykoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIGxlbmd0aCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZGVyX1N0YXJ0R2x5cGhGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgU2Vla3MgYSBzdHJlYW0gdG8gdGhlIHN0YXJ0IG9mIGEgZ2l2ZW4gZ2x5cGggZWxlbWVudCwgYW5kIG9wZW5zIGEgICovCisgIC8qICAgIGZyYW1lIGZvciBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxvYWRlciAgICAgIDo6IFRoZSBjdXJyZW50IFRydWVUeXBlIGdseXBoIGxvYWRlciBvYmplY3QuICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGggaW5kZXggOjogVGhlIGluZGV4IG9mIHRoZSBnbHlwaCB0byBhY2Nlc3MuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvZmZzZXQgICAgICA6OiBUaGUgb2Zmc2V0IG9mIHRoZSBnbHlwaCBhY2NvcmRpbmcgdG8gdGhlICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgYGxvY2F0aW9ucycgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBieXRlX2NvdW50ICA6OiBUaGUgc2l6ZSBvZiB0aGUgZnJhbWUgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vcm1hbGx5IGVxdWl2YWxlbnQgdG8gRlRfU1RSRUFNX1NFRUsob2Zmc2V0KSAgICAgKi8KKyAgLyogICAgZm9sbG93ZWQgYnkgRlRfRlJBTUVfRU5URVIoYnl0ZV9jb3VudCkgd2l0aCB0aGUgbG9hZGVyJ3Mgc3RyZWFtLCAgICovCisgIC8qICAgIGJ1dCBhbHRlcm5hdGl2ZSBmb3JtYXRzIChlLmcuIGNvbXByZXNzZWQgb25lcykgbWlnaHQgdXNlIHNvbWV0aGluZyAqLworICAvKiAgICBkaWZmZXJlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpUVF9Mb2FkZXJfU3RhcnRHbHlwaEZ1bmMpKCBUVF9Mb2FkZXIgIGxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgYnl0ZV9jb3VudCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfTG9hZGVyX1JlYWRHbHlwaEZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmVhZHMgb25lIGdseXBoIGVsZW1lbnQgKGl0cyBoZWFkZXIsIGEgc2ltcGxlIGdseXBoLCBvciBhICAgICAgICAgICovCisgIC8qICAgIGNvbXBvc2l0ZSkgZnJvbSB0aGUgbG9hZGVyJ3MgY3VycmVudCBzdHJlYW0gZnJhbWUuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxvYWRlciA6OiBUaGUgY3VycmVudCBUcnVlVHlwZSBnbHlwaCBsb2FkZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKlRUX0xvYWRlcl9SZWFkR2x5cGhGdW5jKSggVFRfTG9hZGVyICBsb2FkZXIgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0xvYWRlcl9FbmRHbHlwaEZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENsb3NlcyB0aGUgY3VycmVudCBsb2FkZXIgc3RyZWFtIGZyYW1lIGZvciB0aGUgZ2x5cGguICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGxvYWRlciA6OiBUaGUgY3VycmVudCBUcnVlVHlwZSBnbHlwaCBsb2FkZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiB2b2lkCisgICgqVFRfTG9hZGVyX0VuZEdseXBoRnVuYykoIFRUX0xvYWRlciAgbG9hZGVyICk7CisKKworICB0eXBlZGVmIGVudW0gVFRfU2JpdFRhYmxlVHlwZV8KKyAgeworICAgIFRUX1NCSVRfVEFCTEVfVFlQRV9OT05FID0gMCwKKyAgICBUVF9TQklUX1RBQkxFX1RZUEVfRUJMQywgLyogYEVCTEMnIChNaWNyb3NvZnQpLCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBgYmxvYycgKEFwcGxlKSAgICAgICovCisgICAgVFRfU0JJVF9UQUJMRV9UWVBFX0NCTEMsIC8qIGBDQkxDJyAoR29vZ2xlKSAgICAgKi8KKyAgICBUVF9TQklUX1RBQkxFX1RZUEVfU0JJWCwgLyogYHNiaXgnIChBcHBsZSkgICAgICAqLworCisgICAgLyogZG8gbm90IHJlbW92ZSAqLworICAgIFRUX1NCSVRfVEFCTEVfVFlQRV9NQVgKKworICB9IFRUX1NiaXRUYWJsZVR5cGU7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlIEZhY2UgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBUcnVlVHlwZSBmYWNlIGNsYXNzLiAgVGhlc2Ugb2JqZWN0cyBtb2RlbCB0aGUgcmVzb2x1dGlvbiBhbmQgICAqLworICAvKiAgICBwb2ludC1zaXplIGluZGVwZW5kZW50IGRhdGEgZm91bmQgaW4gYSBUcnVlVHlwZSBmb250IGZpbGUuICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByb290ICAgICAgICAgICAgICAgICA6OiBUaGUgYmFzZSBGVF9GYWNlIHN0cnVjdHVyZSwgbWFuYWdlZCBieSB0aGUgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSBsYXllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0dGNfaGVhZGVyICAgICAgICAgICA6OiBUaGUgVHJ1ZVR5cGUgY29sbGVjdGlvbiBoZWFkZXIsIHVzZWQgd2hlbiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpbGUgaXMgYSBgdHRjJyByYXRoZXIgdGhhbiBhIGB0dGYnLiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBvcmRpbmFyeSBmb250IGZpbGVzLCB0aGUgZmllbGQgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgdHRjX2hlYWRlci5jb3VudCcgaXMgc2V0IHRvIDAuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZvcm1hdF90YWcgICAgICAgICAgIDo6IFRoZSBmb250IGZvcm1hdCB0YWcuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtX3RhYmxlcyAgICAgICAgICAgOjogVGhlIG51bWJlciBvZiBUcnVlVHlwZSB0YWJsZXMgaW4gdGhpcyBmb250ICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZGlyX3RhYmxlcyAgICAgICAgICAgOjogVGhlIGRpcmVjdG9yeSBvZiBUcnVlVHlwZSB0YWJsZXMgZm9yIHRoaXMgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaGVhZGVyICAgICAgICAgICAgICAgOjogVGhlIGZvbnQncyBmb250IGhlYWRlciAoYGhlYWQnIHRhYmxlKS4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWQgb24gZm9udCBvcGVuaW5nLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaG9yaXpvbnRhbCAgICAgICAgICAgOjogVGhlIGZvbnQncyBob3Jpem9udGFsIGhlYWRlciAoYGhoZWEnICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlKS4gIFRoaXMgZmllbGQgYWxzbyBjb250YWlucyB0aGUgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NvY2lhdGVkIGhvcml6b250YWwgbWV0cmljcyB0YWJsZSAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGBobXR4JykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhfcHJvZmlsZSAgICAgICAgICA6OiBUaGUgZm9udCdzIG1heGltdW0gcHJvZmlsZSB0YWJsZS4gIFJlYWQgb24gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udCBvcGVuaW5nLiAgTm90ZSB0aGF0IHNvbWUgbWF4aW11bSAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyBjYW5ub3QgYmUgdGFrZW4gZGlyZWN0bHkgZnJvbSB0aGlzICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS4gIFdlIHRodXMgZGVmaW5lIGFkZGl0aW9uYWwgZmllbGRzICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVsb3cgdG8gaG9sZCB0aGUgY29tcHV0ZWQgbWF4aW1hLiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB2ZXJ0aWNhbF9pbmZvICAgICAgICA6OiBBIGJvb2xlYW4gd2hpY2ggaXMgc2V0IHdoZW4gdGhlIGZvbnQgZmlsZSAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgdmVydGljYWwgbWV0cmljcy4gIElmIG5vdCwgdGhlICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIHRoZSBgdmVydGljYWwnIGZpZWxkIGlzICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHZlcnRpY2FsICAgICAgICAgICAgIDo6IFRoZSBmb250J3MgdmVydGljYWwgaGVhZGVyIChgdmhlYScgdGFibGUpLiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZpZWxkIGFsc28gY29udGFpbnMgdGhlIGFzc29jaWF0ZWQgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgbWV0cmljcyB0YWJsZSAoYHZtdHgnKSwgaWYgZm91bmQuICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNUE9SVEFOVDogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmllbGQgaXMgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQgaWYgdGhlIGB2ZXJ0aWNhbF9pbmZvJyBmaWVsZCBpcyAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fbmFtZXMgICAgICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIG5hbWUgcmVjb3JkcyB3aXRoaW4gdGhpcyAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBuYW1lX3RhYmxlICAgICAgICAgICA6OiBUaGUgdGFibGUgb2YgbmFtZSByZWNvcmRzIChgbmFtZScpLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG9zMiAgICAgICAgICAgICAgICAgIDo6IFRoZSBmb250J3MgT1MvMiB0YWJsZSAoYE9TLzInKS4gICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcG9zdHNjcmlwdCAgICAgICAgICAgOjogVGhlIGZvbnQncyBQb3N0U2NyaXB0IHRhYmxlIChgcG9zdCcgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlKS4gIFRoZSBQb3N0U2NyaXB0IGdseXBoIG5hbWVzIGFyZSAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgbG9hZGVkIGJ5IHRoZSBkcml2ZXIgb24gZmFjZSBvcGVuaW5nLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIHRoZSBgdHRwb3N0JyBtb2R1bGUgZm9yIG1vcmUgZGV0YWlscy4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjbWFwX3RhYmxlICAgICAgICAgICA6OiBBZGRyZXNzIG9mIHRoZSBmYWNlJ3MgYGNtYXAnIFNGTlQgdGFibGUgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gbWVtb3J5IChpdCdzIGFuIGV4dHJhY3RlZCBmcmFtZSkuICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBjbWFwX3NpemUgICAgICAgICAgICA6OiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgYGNtYXBfdGFibGUnICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVkIGFib3ZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnb3RvX3RhYmxlICAgICAgICAgICA6OiBBIGZ1bmN0aW9uIGNhbGxlZCBieSBlYWNoIFRydWVUeXBlIHRhYmxlICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyIHRvIHBvc2l0aW9uIGEgc3RyZWFtJ3MgY3Vyc29yIHRvICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdGFydCBvZiBhIGdpdmVuIHRhYmxlIGFjY29yZGluZyB0byAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdHMgdGFnLiAgSXQgZGVmYXVsdHMgdG8gVFRfR290b19GYWNlIGJ1dCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGRpZmZlcmVudCBmb3Igc3RyYW5nZSBmb3JtYXRzIChlLmcuICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgNDIpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYWNjZXNzX2dseXBoX2ZyYW1lICAgOjogQSBmdW5jdGlvbiB1c2VkIHRvIGFjY2VzcyB0aGUgZnJhbWUgb2YgYSAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIGdseXBoIHdpdGhpbiB0aGUgZmFjZSdzIGZvbnQgZmlsZS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZm9yZ2V0X2dseXBoX2ZyYW1lICAgOjogQSBmdW5jdGlvbiB1c2VkIHRvIGZvcmdldCB0aGUgZnJhbWUgb2YgYSAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIGdseXBoIHdoZW4gYWxsIGRhdGEgaGFzIGJlZW4gbG9hZGVkLiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcmVhZF9nbHlwaF9oZWFkZXIgICAgOjogQSBmdW5jdGlvbiB1c2VkIHRvIHJlYWQgYSBnbHlwaCBoZWFkZXIuICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0IG11c3QgYmUgY2FsbGVkIGJldHdlZW4gYW4gYGFjY2VzcycgYW5kICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZm9yZ2V0Jy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHJlYWRfc2ltcGxlX2dseXBoICAgIDo6IEEgZnVuY3Rpb24gdXNlZCB0byByZWFkIGEgc2ltcGxlIGdseXBoLiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgaGVhZGVyIHdhcyAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCwgYW5kIGJlZm9yZSB0aGUgYGZvcmdldCcuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByZWFkX2NvbXBvc2l0ZV9nbHlwaCA6OiBBIGZ1bmN0aW9uIHVzZWQgdG8gcmVhZCBhIGNvbXBvc2l0ZSBnbHlwaC4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGhlYWRlciB3YXMgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQsIGFuZCBiZWZvcmUgdGhlIGBmb3JnZXQnLiAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgc2ZudCAgICAgICAgICAgICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBTRk5UIHNlcnZpY2UuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwc25hbWVzICAgICAgICAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIFBvc3RTY3JpcHQgbmFtZXMgc2VydmljZS4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGhkbXggICAgICAgICAgICAgICAgIDo6IFRoZSBmYWNlJ3MgaG9yaXpvbnRhbCBkZXZpY2UgbWV0cmljcyAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYGhkbXgnIHRhYmxlKS4gIFRoaXMgdGFibGUgaXMgb3B0aW9uYWwgaW4gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUvT3BlblR5cGUgZm9udHMuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBnYXNwICAgICAgICAgICAgICAgICA6OiBUaGUgZ3JpZC1maXR0aW5nIGFuZCBzY2FsaW5nIHByb3BlcnRpZXMgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgKGBnYXNwJykuICBUaGlzIHRhYmxlIGlzIG9wdGlvbmFsIGluICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlL09wZW5UeXBlIGZvbnRzLiAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgcGNsdCAgICAgICAgICAgICAgICAgOjogVGhlIGBwY2x0JyBTRk5UIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fc2JpdF9zY2FsZXMgICAgICA6OiBUaGUgbnVtYmVyIG9mIHNiaXQgc2NhbGVzIGZvciB0aGlzIGZvbnQuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNiaXRfc2NhbGVzICAgICAgICAgIDo6IEFycmF5IG9mIHNiaXQgc2NhbGVzIGVtYmVkZGVkIGluIHRoaXMgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LiAgVGhpcyB0YWJsZSBpcyBvcHRpb25hbCBpbiBhICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUvT3BlblR5cGUgZm9udC4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBwb3N0c2NyaXB0X25hbWVzICAgICA6OiBBIHRhYmxlIHVzZWQgdG8gc3RvcmUgdGhlIFBvc3RzY3JpcHQgbmFtZXMgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgIHRoZSBnbHlwaHMgZm9yIHRoaXMgZm9udC4gIFNlZSB0aGUgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgIGB0dGNvbmZpZy5oJyBmb3IgY29tbWVudHMgb24gdGhlICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMgb3B0aW9uLiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bV9sb2NhdGlvbnMgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgZ2x5cGggbG9jYXRpb25zIGluIHRoaXMgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlVHlwZSBmaWxlLiAgVGhpcyBzaG91bGQgYmUgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpY2FsIHRvIHRoZSBudW1iZXIgb2YgZ2x5cGhzLiAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIElnbm9yZWQgZm9yIFR5cGUgMiBmb250cy4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZ2x5cGhfbG9jYXRpb25zICAgICAgOjogQW4gYXJyYXkgb2YgbG9uZ3MuICBUaGVzZSBhcmUgb2Zmc2V0cyB0byAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoIGRhdGEgd2l0aGluIHRoZSBgZ2x5ZicgdGFibGUuICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZ25vcmVkIGZvciBUeXBlIDIgZm9udCBmYWNlcy4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGdseWZfbGVuICAgICAgICAgICAgIDo6IFRoZSBsZW5ndGggb2YgdGhlIGBnbHlmJyB0YWJsZS4gIE5lZWRlZCAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbWFsZm9ybWVkIGBsb2NhJyB0YWJsZXMuICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGZvbnRfcHJvZ3JhbV9zaXplICAgIDo6IFNpemUgaW4gYnl0ZWNvZGVzIG9mIHRoZSBmYWNlJ3MgZm9udCAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtLiAgMCBpZiBub25lIGRlZmluZWQuICBJZ25vcmVkIGZvciAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAyIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBmb250X3Byb2dyYW0gICAgICAgICA6OiBUaGUgZmFjZSdzIGZvbnQgcHJvZ3JhbSAoYnl0ZWNvZGUgc3RyZWFtKSAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWQgYXQgbG9hZCB0aW1lLCBhbHNvIHVzZWQgZHVyaW5nICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoIHJlbmRlcmluZy4gIENvbWVzIGZyb20gdGhlIGBmcGdtJyAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS4gIElnbm9yZWQgZm9yIFR5cGUgMiBmb250IGZvbnRzLiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGN2dF9wcm9ncmFtX3NpemUgICAgIDo6IFRoZSBzaXplIGluIGJ5dGVjb2RlcyBvZiB0aGUgZmFjZSdzIGN2dCAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtLiAgSWdub3JlZCBmb3IgVHlwZSAyIGZvbnRzLiAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGN2dF9wcm9ncmFtICAgICAgICAgIDo6IFRoZSBmYWNlJ3MgY3Z0IHByb2dyYW0gKGJ5dGVjb2RlIHN0cmVhbSkgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZCBlYWNoIHRpbWUgYW4gaW5zdGFuY2Uvc2l6ZSBpcyAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZC9yZXNldC4gIENvbWVzIGZyb20gdGhlIGBwcmVwJyAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLiAgSWdub3JlZCBmb3IgVHlwZSAyIGZvbnRzLiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY3Z0X3NpemUgICAgICAgICAgICAgOjogU2l6ZSBvZiB0aGUgY29udHJvbCB2YWx1ZSB0YWJsZSAoaW4gICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJpZXMpLiAgIElnbm9yZWQgZm9yIFR5cGUgMiBmb250cy4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY3Z0ICAgICAgICAgICAgICAgICAgOjogVGhlIGZhY2UncyBvcmlnaW5hbCBjb250cm9sIHZhbHVlIHRhYmxlLiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvb3JkaW5hdGVzIGFyZSBleHByZXNzZWQgaW4gdW5zY2FsZWQgZm9udCAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cy4gIENvbWVzIGZyb20gdGhlIGBjdnQgJyB0YWJsZS4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgSWdub3JlZCBmb3IgVHlwZSAyIGZvbnRzLiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBudW1fa2Vybl9wYWlycyAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGtlcm5pbmcgcGFpcnMgcHJlc2VudCBpbiB0aGUgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udCBmaWxlLiAgVGhlIGVuZ2luZSBvbmx5IGxvYWRzIHRoZSAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0IGhvcml6b250YWwgZm9ybWF0IDAga2VybiB0YWJsZSBpdCAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kcyBpbiB0aGUgZm9udCBmaWxlLiAgSWdub3JlZCBmb3IgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAyIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBrZXJuX3RhYmxlX2luZGV4ICAgICA6OiBUaGUgaW5kZXggb2YgdGhlIGtlcm5pbmcgdGFibGUgaW4gdGhlIGZvbnQgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAga2VybmluZyBkaXJlY3RvcnkuICBJZ25vcmVkIGZvciBUeXBlIDIgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgaW50ZXJwcmV0ZXIgICAgICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBUcnVlVHlwZSBieXRlY29kZSAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycHJldGVycyBmaWVsZCBpcyBhbHNvIHVzZWQgdG8gaG9vayAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGVidWdnZXIgaW4gYHR0ZGVidWcnLiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHVucGF0ZW50ZWRfaGludGluZyAgIDo6IElmIHRydWUsIHVzZSBvbmx5IHVucGF0ZW50ZWQgbWV0aG9kcyBpbiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGRvYmxlbmQgICAgICAgICAgICAgIDo6IEEgYm9vbGVhbiB3aGljaCBpcyBzZXQgaWYgdGhlIGZvbnQgc2hvdWxkICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBibGVuZGVkICh0aGlzIGlzIGZvciBHWCB2YXIpLiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGJsZW5kICAgICAgICAgICAgICAgIDo6IENvbnRhaW5zIHRoZSBkYXRhIG5lZWRlZCB0byBjb250cm9sIEdYICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYXRpb24gdGFibGVzIChyYXRoZXIgbGlrZSBNdWx0aXBsZSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFzdGVyIGRhdGEpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBleHRyYSAgICAgICAgICAgICAgICA6OiBSZXNlcnZlZCBmb3IgdGhpcmQtcGFydHkgZm9udCBkcml2ZXJzLiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHBvc3RzY3JpcHRfbmFtZSAgICAgIDo6IFRoZSBQUyBuYW1lIG9mIHRoZSBmb250LiAgVXNlZCBieSB0aGUgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0c2NyaXB0IG5hbWUgc2VydmljZS4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9GYWNlUmVjXworICB7CisgICAgRlRfRmFjZVJlYyAgICAgICAgICAgIHJvb3Q7CisKKyAgICBUVENfSGVhZGVyUmVjICAgICAgICAgdHRjX2hlYWRlcjsKKworICAgIEZUX1VMb25nICAgICAgICAgICAgICBmb3JtYXRfdGFnOworICAgIEZUX1VTaG9ydCAgICAgICAgICAgICBudW1fdGFibGVzOworICAgIFRUX1RhYmxlICAgICAgICAgICAgICBkaXJfdGFibGVzOworCisgICAgVFRfSGVhZGVyICAgICAgICAgICAgIGhlYWRlcjsgICAgICAgLyogVHJ1ZVR5cGUgaGVhZGVyIHRhYmxlICAgICAgICAgICovCisgICAgVFRfSG9yaUhlYWRlciAgICAgICAgIGhvcml6b250YWw7ICAgLyogVHJ1ZVR5cGUgaG9yaXpvbnRhbCBoZWFkZXIgICAgICovCisKKyAgICBUVF9NYXhQcm9maWxlICAgICAgICAgbWF4X3Byb2ZpbGU7CisKKyAgICBGVF9Cb29sICAgICAgICAgICAgICAgdmVydGljYWxfaW5mbzsKKyAgICBUVF9WZXJ0SGVhZGVyICAgICAgICAgdmVydGljYWw7ICAgICAvKiBUVCBWZXJ0aWNhbCBoZWFkZXIsIGlmIHByZXNlbnQgKi8KKworICAgIEZUX1VTaG9ydCAgICAgICAgICAgICBudW1fbmFtZXM7ICAgIC8qIG51bWJlciBvZiBuYW1lIHJlY29yZHMgICovCisgICAgVFRfTmFtZVRhYmxlUmVjICAgICAgIG5hbWVfdGFibGU7ICAgLyogbmFtZSB0YWJsZSAgICAgICAgICAgICAgKi8KKworICAgIFRUX09TMiAgICAgICAgICAgICAgICBvczI7ICAgICAgICAgIC8qIFRydWVUeXBlIE9TLzIgdGFibGUgICAgICAgICAgICAqLworICAgIFRUX1Bvc3RzY3JpcHQgICAgICAgICBwb3N0c2NyaXB0OyAgIC8qIFRydWVUeXBlIFBvc3RzY3JpcHQgdGFibGUgICAgICAqLworCisgICAgRlRfQnl0ZSogICAgICAgICAgICAgIGNtYXBfdGFibGU7ICAgLyogZXh0cmFjdGVkIGBjbWFwJyB0YWJsZSAqLworICAgIEZUX1VMb25nICAgICAgICAgICAgICBjbWFwX3NpemU7CisKKyAgICBUVF9Mb2FkZXJfR290b1RhYmxlRnVuYyAgIGdvdG9fdGFibGU7CisKKyAgICBUVF9Mb2FkZXJfU3RhcnRHbHlwaEZ1bmMgIGFjY2Vzc19nbHlwaF9mcmFtZTsKKyAgICBUVF9Mb2FkZXJfRW5kR2x5cGhGdW5jICAgIGZvcmdldF9nbHlwaF9mcmFtZTsKKyAgICBUVF9Mb2FkZXJfUmVhZEdseXBoRnVuYyAgIHJlYWRfZ2x5cGhfaGVhZGVyOworICAgIFRUX0xvYWRlcl9SZWFkR2x5cGhGdW5jICAgcmVhZF9zaW1wbGVfZ2x5cGg7CisgICAgVFRfTG9hZGVyX1JlYWRHbHlwaEZ1bmMgICByZWFkX2NvbXBvc2l0ZV9nbHlwaDsKKworICAgIC8qIGEgdHlwZWxlc3MgcG9pbnRlciB0byB0aGUgU0ZOVF9JbnRlcmZhY2UgdGFibGUgdXNlZCB0byBsb2FkICovCisgICAgLyogdGhlIGJhc2ljIFRydWVUeXBlIHRhYmxlcyBpbiB0aGUgZmFjZSBvYmplY3QgICAgICAgICAgICAgICAgKi8KKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgc2ZudDsKKworICAgIC8qIGEgdHlwZWxlc3MgcG9pbnRlciB0byB0aGUgRlRfU2VydmljZV9Qc0NNYXBzUmVjIHRhYmxlIHVzZWQgdG8gKi8KKyAgICAvKiBoYW5kbGUgZ2x5cGggbmFtZXMgPC0+IHVuaWNvZGUgJiBNYWMgdmFsdWVzICAgICAgICAgICAgICAgICAgICovCisgICAgdm9pZCogICAgICAgICAgICAgICAgIHBzbmFtZXM7CisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogT3B0aW9uYWwgVHJ1ZVR5cGUvT3BlblR5cGUgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAvKiBncmlkLWZpdHRpbmcgYW5kIHNjYWxpbmcgdGFibGUgKi8KKyAgICBUVF9HYXNwUmVjICAgICAgICAgICAgZ2FzcDsgICAgICAgICAgICAgICAgIC8qIHRoZSBgZ2FzcCcgdGFibGUgKi8KKworICAgIC8qIFBDTCA1IHRhYmxlICovCisgICAgVFRfUENMVCAgICAgICAgICAgICAgIHBjbHQ7CisKKyAgICAvKiBlbWJlZGRlZCBiaXRtYXBzIHN1cHBvcnQgKi8KKyAgICBGVF9VTG9uZyAgICAgICAgICAgICAgbnVtX3NiaXRfc2NhbGVzOworICAgIFRUX1NCaXRfU2NhbGUgICAgICAgICBzYml0X3NjYWxlczsKKworICAgIC8qIHBvc3RzY3JpcHQgbmFtZXMgdGFibGUgKi8KKyAgICBUVF9Qb3N0X05hbWVzUmVjICAgICAgcG9zdHNjcmlwdF9uYW1lczsKKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBUcnVlVHlwZS1zcGVjaWZpYyBmaWVsZHMgKGlnbm9yZWQgYnkgdGhlIE9URi1UeXBlMiBkcml2ZXIpICAgICAgICAgICovCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qIHRoZSBmb250IHByb2dyYW0sIGlmIGFueSAqLworICAgIEZUX1VMb25nICAgICAgICAgICAgICBmb250X3Byb2dyYW1fc2l6ZTsKKyAgICBGVF9CeXRlKiAgICAgICAgICAgICAgZm9udF9wcm9ncmFtOworCisgICAgLyogdGhlIGN2dCBwcm9ncmFtLCBpZiBhbnkgKi8KKyAgICBGVF9VTG9uZyAgICAgICAgICAgICAgY3Z0X3Byb2dyYW1fc2l6ZTsKKyAgICBGVF9CeXRlKiAgICAgICAgICAgICAgY3Z0X3Byb2dyYW07CisKKyAgICAvKiB0aGUgb3JpZ2luYWwsIHVuc2NhbGVkLCBjb250cm9sIHZhbHVlIHRhYmxlICovCisgICAgRlRfVUxvbmcgICAgICAgICAgICAgIGN2dF9zaXplOworICAgIEZUX1Nob3J0KiAgICAgICAgICAgICBjdnQ7CisKKyAgICAvKiBBIHBvaW50ZXIgdG8gdGhlIGJ5dGVjb2RlIGludGVycHJldGVyIHRvIHVzZS4gIFRoaXMgaXMgYWxzbyAqLworICAgIC8qIHVzZWQgdG8gaG9vayB0aGUgZGVidWdnZXIgZm9yIHRoZSBgdHRkZWJ1ZycgdXRpbGl0eS4gICAgICAgICovCisgICAgVFRfSW50ZXJwcmV0ZXIgICAgICAgIGludGVycHJldGVyOworCisjaWZkZWYgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcKKyAgICAvKiBVc2UgdW5wYXRlbnRlZCBoaW50aW5nIG9ubHkuICovCisgICAgRlRfQm9vbCAgICAgICAgICAgICAgIHVucGF0ZW50ZWRfaGludGluZzsKKyNlbmRpZgorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBPdGhlciB0YWJsZXMgb3IgZmllbGRzLiBUaGlzIGlzIHVzZWQgYnkgZGVyaXZhdGl2ZSBmb3JtYXRzIGxpa2UgICAgICovCisgICAgLyogT3BlblR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBGVF9HZW5lcmljICAgICAgICAgICAgZXh0cmE7CisKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgcG9zdHNjcmlwdF9uYW1lOworCisgICAgRlRfVUxvbmcgICAgICAgICAgICAgIGdseWZfbGVuOworCisjaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAorICAgIEZUX0Jvb2wgICAgICAgICAgICAgICBkb2JsZW5kOworICAgIEdYX0JsZW5kICAgICAgICAgICAgICBibGVuZDsKKyNlbmRpZgorCisgICAgLyogc2luY2UgdmVyc2lvbiAyLjIgKi8KKworICAgIEZUX0J5dGUqICAgICAgICAgICAgICBob3J6X21ldHJpY3M7CisgICAgRlRfVUxvbmcgICAgICAgICAgICAgIGhvcnpfbWV0cmljc19zaXplOworCisgICAgRlRfQnl0ZSogICAgICAgICAgICAgIHZlcnRfbWV0cmljczsKKyAgICBGVF9VTG9uZyAgICAgICAgICAgICAgdmVydF9tZXRyaWNzX3NpemU7CisKKyAgICBGVF9VTG9uZyAgICAgICAgICAgICAgbnVtX2xvY2F0aW9uczsgLyogaW4gYnJva2VuIFRURiwgZ2lkID4gMHhGRkZGICovCisgICAgRlRfQnl0ZSogICAgICAgICAgICAgIGdseXBoX2xvY2F0aW9uczsKKworICAgIEZUX0J5dGUqICAgICAgICAgICAgICBoZG14X3RhYmxlOworICAgIEZUX1VMb25nICAgICAgICAgICAgICBoZG14X3RhYmxlX3NpemU7CisgICAgRlRfVUludCAgICAgICAgICAgICAgIGhkbXhfcmVjb3JkX2NvdW50OworICAgIEZUX1VMb25nICAgICAgICAgICAgICBoZG14X3JlY29yZF9zaXplOworICAgIEZUX0J5dGUqICAgICAgICAgICAgICBoZG14X3JlY29yZF9zaXplczsKKworICAgIEZUX0J5dGUqICAgICAgICAgICAgICBzYml0X3RhYmxlOworICAgIEZUX1VMb25nICAgICAgICAgICAgICBzYml0X3RhYmxlX3NpemU7CisgICAgVFRfU2JpdFRhYmxlVHlwZSAgICAgIHNiaXRfdGFibGVfdHlwZTsKKyAgICBGVF9VSW50ICAgICAgICAgICAgICAgc2JpdF9udW1fc3RyaWtlczsKKworICAgIEZUX0J5dGUqICAgICAgICAgICAgICBrZXJuX3RhYmxlOworICAgIEZUX1VMb25nICAgICAgICAgICAgICBrZXJuX3RhYmxlX3NpemU7CisgICAgRlRfVUludCAgICAgICAgICAgICAgIG51bV9rZXJuX3RhYmxlczsKKyAgICBGVF9VSW50MzIgICAgICAgICAgICAga2Vybl9hdmFpbF9iaXRzOworICAgIEZUX1VJbnQzMiAgICAgICAgICAgICBrZXJuX29yZGVyX2JpdHM7CisKKyNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0JERgorICAgIFRUX0JERlJlYyAgICAgICAgICAgICBiZGY7CisjZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9CREYgKi8KKworICAgIC8qIHNpbmNlIDIuMy4wICovCisgICAgRlRfVUxvbmcgICAgICAgICAgICAgIGhvcnpfbWV0cmljc19vZmZzZXQ7CisgICAgRlRfVUxvbmcgICAgICAgICAgICAgIHZlcnRfbWV0cmljc19vZmZzZXQ7CisKKyNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKKyAgICAvKiBzaW5jZSAyLjQuMTIgKi8KKyAgICBGVF9VTG9uZyAgICAgICAgICAgICAgc3BoX2ZvdW5kX2Z1bmNfZmxhZ3M7IC8qIHNwZWNpYWwgZnVuY3Rpb25zIGZvdW5kICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgdGhpcyBmYWNlICAgICAgICAgICAqLworICAgIEZUX0Jvb2wgICAgICAgICAgICAgICBzcGhfY29tcGF0aWJpbGl0eV9tb2RlOworI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLworCisgIH0gVFRfRmFjZVJlYzsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBUVF9HbHlwaFpvbmVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBBIGdseXBoIHpvbmUgaXMgdXNlZCB0byBsb2FkLCBzY2FsZSBhbmQgaGludCBnbHlwaCBvdXRsaW5lICAgICAgICAqLworICAvKiAgICAgY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgbWVtb3J5ICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBtZW1vcnkgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBtYXhfcG9pbnRzICAgOjogVGhlIG1heGltdW0gc2l6ZSBpbiBwb2ludHMgb2YgdGhlIHpvbmUuICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIG1heF9jb250b3VycyA6OiBNYXggc2l6ZSBpbiBsaW5rcyBjb250b3VycyBvZiB0aGUgem9uZS4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgbl9wb2ludHMgICAgIDo6IFRoZSBjdXJyZW50IG51bWJlciBvZiBwb2ludHMgaW4gdGhlIHpvbmUuICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBuX2NvbnRvdXJzICAgOjogVGhlIGN1cnJlbnQgbnVtYmVyIG9mIGNvbnRvdXJzIGluIHRoZSB6b25lLiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIG9yZyAgICAgICAgICA6OiBUaGUgb3JpZ2luYWwgZ2x5cGggY29vcmRpbmF0ZXMgKGZvbnQgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgdW5pdHMvc2NhbGVkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIGN1ciAgICAgICAgICA6OiBUaGUgY3VycmVudCBnbHlwaCBjb29yZGluYXRlcyAoc2NhbGVkL2hpbnRlZCkuICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgdGFncyAgICAgICAgIDo6IFRoZSBwb2ludCBjb250cm9sIHRhZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBjb250b3VycyAgICAgOjogVGhlIGNvbnRvdXJzIGVuZCBwb2ludHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIGZpcnN0X3BvaW50ICA6OiBPZmZzZXQgb2YgdGhlIGN1cnJlbnQgc3ViZ2x5cGgncyBmaXJzdCBwb2ludC4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfR2x5cGhab25lUmVjXworICB7CisgICAgRlRfTWVtb3J5ICAgbWVtb3J5OworICAgIEZUX1VTaG9ydCAgIG1heF9wb2ludHM7CisgICAgRlRfU2hvcnQgICAgbWF4X2NvbnRvdXJzOworICAgIEZUX1VTaG9ydCAgIG5fcG9pbnRzOyAgICAvKiBudW1iZXIgb2YgcG9pbnRzIGluIHpvbmUgICAgKi8KKyAgICBGVF9TaG9ydCAgICBuX2NvbnRvdXJzOyAgLyogbnVtYmVyIG9mIGNvbnRvdXJzICAgICAgICAgICovCisKKyAgICBGVF9WZWN0b3IqICBvcmc7ICAgICAgICAgLyogb3JpZ2luYWwgcG9pbnQgY29vcmRpbmF0ZXMgICovCisgICAgRlRfVmVjdG9yKiAgY3VyOyAgICAgICAgIC8qIGN1cnJlbnQgcG9pbnQgY29vcmRpbmF0ZXMgICAqLworICAgIEZUX1ZlY3RvciogIG9ydXM7ICAgICAgICAvKiBvcmlnaW5hbCAodW5zY2FsZWQpIHBvaW50IGNvb3JkaW5hdGVzICovCisKKyAgICBGVF9CeXRlKiAgICB0YWdzOyAgICAgICAgLyogY3VycmVudCB0b3VjaCBmbGFncyAgICAgICAgICovCisgICAgRlRfVVNob3J0KiAgY29udG91cnM7ICAgIC8qIGNvbnRvdXIgZW5kIHBvaW50cyAgICAgICAgICAqLworCisgICAgRlRfVVNob3J0ICAgZmlyc3RfcG9pbnQ7IC8qIG9mZnNldCBvZiBmaXJzdCAoIzApIHBvaW50ICAqLworCisgIH0gVFRfR2x5cGhab25lUmVjLCAqVFRfR2x5cGhab25lOworCisKKyAgLyogaGFuZGxlIHRvIGV4ZWN1dGlvbiBjb250ZXh0ICovCisgIHR5cGVkZWYgc3RydWN0IFRUX0V4ZWNDb250ZXh0UmVjXyogIFRUX0V4ZWNDb250ZXh0OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBoYW5kbGUgdG8gYSBUcnVlVHlwZSBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCBUVF9TaXplUmVjXyogIFRUX1NpemU7CisKKworICAvKiBnbHlwaCBsb2FkZXIgc3RydWN0dXJlICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9Mb2FkZXJSZWNfCisgIHsKKyAgICBUVF9GYWNlICAgICAgICAgIGZhY2U7CisgICAgVFRfU2l6ZSAgICAgICAgICBzaXplOworICAgIEZUX0dseXBoU2xvdCAgICAgZ2x5cGg7CisgICAgRlRfR2x5cGhMb2FkZXIgICBnbG9hZGVyOworCisgICAgRlRfVUxvbmcgICAgICAgICBsb2FkX2ZsYWdzOworICAgIEZUX1VJbnQgICAgICAgICAgZ2x5cGhfaW5kZXg7CisKKyAgICBGVF9TdHJlYW0gICAgICAgIHN0cmVhbTsKKyAgICBGVF9JbnQgICAgICAgICAgIGJ5dGVfbGVuOworCisgICAgRlRfU2hvcnQgICAgICAgICBuX2NvbnRvdXJzOworICAgIEZUX0JCb3ggICAgICAgICAgYmJveDsKKyAgICBGVF9JbnQgICAgICAgICAgIGxlZnRfYmVhcmluZzsKKyAgICBGVF9JbnQgICAgICAgICAgIGFkdmFuY2U7CisgICAgRlRfSW50ICAgICAgICAgICBsaW5lYXI7CisgICAgRlRfQm9vbCAgICAgICAgICBsaW5lYXJfZGVmOworICAgIEZUX1ZlY3RvciAgICAgICAgcHAxOworICAgIEZUX1ZlY3RvciAgICAgICAgcHAyOworCisgICAgRlRfVUxvbmcgICAgICAgICBnbHlmX29mZnNldDsKKworICAgIC8qIHRoZSB6b25lIHdoZXJlIHdlIGxvYWQgb3VyIGdseXBocyAqLworICAgIFRUX0dseXBoWm9uZVJlYyAgYmFzZTsKKyAgICBUVF9HbHlwaFpvbmVSZWMgIHpvbmU7CisKKyAgICBUVF9FeGVjQ29udGV4dCAgIGV4ZWM7CisgICAgRlRfQnl0ZSogICAgICAgICBpbnN0cnVjdGlvbnM7CisgICAgRlRfVUxvbmcgICAgICAgICBpbnNfcG9zOworCisgICAgLyogZm9yIHBvc3NpYmxlIGV4dGVuc2liaWxpdHkgaW4gb3RoZXIgZm9ybWF0cyAqLworICAgIHZvaWQqICAgICAgICAgICAgb3RoZXI7CisKKyAgICAvKiBzaW5jZSB2ZXJzaW9uIDIuMS44ICovCisgICAgRlRfSW50ICAgICAgICAgICB0b3BfYmVhcmluZzsKKyAgICBGVF9JbnQgICAgICAgICAgIHZhZHZhbmNlOworICAgIEZUX1ZlY3RvciAgICAgICAgcHAzOworICAgIEZUX1ZlY3RvciAgICAgICAgcHA0OworCisgICAgLyogc2luY2UgdmVyc2lvbiAyLjIuMSAqLworICAgIEZUX0J5dGUqICAgICAgICAgY3Vyc29yOworICAgIEZUX0J5dGUqICAgICAgICAgbGltaXQ7CisKKyAgfSBUVF9Mb2FkZXJSZWM7CisKKworRlRfRU5EX0hFQURFUgorCisjZW5kaWYgLyogX19UVFRZUEVTX0hfXyAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS90MXRhYmxlcy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS90MXRhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZWE0MTUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL3QxdGFibGVzLmgKQEAgLTAsMCArMSw3NjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHQxdGFibGVzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBCYXNpYyBUeXBlIDEvVHlwZSAyIHRhYmxlcyBkZWZpbml0aW9ucyBhbmQgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uICAqLworLyogICAgb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX19UMVRBQkxFU19IX18KKyNkZWZpbmUgX19UMVRBQkxFU19IX18KKworCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKworI2lmZGVmIEZSRUVUWVBFX0gKKyNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCisjZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKKyNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgorI2VuZGlmCisKKworRlRfQkVHSU5fSEVBREVSCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0eXBlMV90YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUeXBlIDEgVGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUeXBlfjEgKFBvc3RTY3JpcHQpIHNwZWNpZmljIGZvbnQgdGFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgVHlwZSAxLXNwZWNpZmljIHRhYmxlcywgICAgKi8KKyAgLyogICAgaW5jbHVkaW5nIHN0cnVjdHVyZXMgcmVsYXRlZCB0byBvdGhlciBQb3N0U2NyaXB0IGZvbnQgZm9ybWF0cy4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8T3JkZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUFNfRm9udEluZm9SZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBTX0ZvbnRJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQU19Qcml2YXRlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUFNfUHJpdmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDSURfRmFjZURpY3RSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ0lEX0ZhY2VEaWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENJRF9GYWNlSW5mb1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDSURfRmFjZUluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0hhc19QU19HbHlwaF9OYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZXRfUFNfRm9udF9JbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2V0X1BTX0ZvbnRfUHJpdmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0dldF9QU19Gb250X1ZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVDFfQmxlbmRfRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFQxX0VuY29kaW5nVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQU19EaWN0X0tleXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyogTm90ZSB0aGF0IHdlIHNlcGFyYXRlIGZvbnQgZGF0YSBpbiBQU19Gb250SW5mb1JlYyBhbmQgUFNfUHJpdmF0ZVJlYyAqLworICAvKiBzdHJ1Y3R1cmVzIGluIG9yZGVyIHRvIHN1cHBvcnQgTXVsdGlwbGUgTWFzdGVyIGZvbnRzLiAgICAgICAgICAgICAgICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQU19Gb250SW5mb1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgVHlwZX4xIG9yIFR5cGV+MiBGb250SW5mbyBkaWN0aW9uYXJ5LiAgKi8KKyAgLyogICAgTm90ZSB0aGF0IGZvciBNdWx0aXBsZSBNYXN0ZXIgZm9udHMsIGVhY2ggaW5zdGFuY2UgaGFzIGl0cyBvd24gICAgICovCisgIC8qICAgIEZvbnRJbmZvIGRpY3Rpb25hcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFBTX0ZvbnRJbmZvUmVjXworICB7CisgICAgRlRfU3RyaW5nKiAgdmVyc2lvbjsKKyAgICBGVF9TdHJpbmcqICBub3RpY2U7CisgICAgRlRfU3RyaW5nKiAgZnVsbF9uYW1lOworICAgIEZUX1N0cmluZyogIGZhbWlseV9uYW1lOworICAgIEZUX1N0cmluZyogIHdlaWdodDsKKyAgICBGVF9Mb25nICAgICBpdGFsaWNfYW5nbGU7CisgICAgRlRfQm9vbCAgICAgaXNfZml4ZWRfcGl0Y2g7CisgICAgRlRfU2hvcnQgICAgdW5kZXJsaW5lX3Bvc2l0aW9uOworICAgIEZUX1VTaG9ydCAgIHVuZGVybGluZV90aGlja25lc3M7CisKKyAgfSBQU19Gb250SW5mb1JlYzsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBTX0ZvbnRJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgaGFuZGxlIHRvIGEgQFBTX0ZvbnRJbmZvUmVjIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgUFNfRm9udEluZm9SZWNfKiAgUFNfRm9udEluZm87CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUMV9Gb250SW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGlzIHR5cGUgaXMgZXF1aXZhbGVudCB0byBAUFNfRm9udEluZm9SZWMuICBJdCBpcyBkZXByZWNhdGVkIGJ1dCAgKi8KKyAgLyogICAga2VwdCB0byBtYWludGFpbiBzb3VyY2UgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHZhcmlvdXMgdmVyc2lvbnMgb2YgICovCisgIC8qICAgIEZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBQU19Gb250SW5mb1JlYyAgVDFfRm9udEluZm87CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQU19Qcml2YXRlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgVHlwZX4xIG9yIFR5cGV+MiBwcml2YXRlIGRpY3Rpb25hcnkuICAgKi8KKyAgLyogICAgTm90ZSB0aGF0IGZvciBNdWx0aXBsZSBNYXN0ZXIgZm9udHMsIGVhY2ggaW5zdGFuY2UgaGFzIGl0cyBvd24gICAgICovCisgIC8qICAgIFByaXZhdGUgZGljdGlvbmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFBTX1ByaXZhdGVSZWNfCisgIHsKKyAgICBGVF9JbnQgICAgIHVuaXF1ZV9pZDsKKyAgICBGVF9JbnQgICAgIGxlbklWOworCisgICAgRlRfQnl0ZSAgICBudW1fYmx1ZV92YWx1ZXM7CisgICAgRlRfQnl0ZSAgICBudW1fb3RoZXJfYmx1ZXM7CisgICAgRlRfQnl0ZSAgICBudW1fZmFtaWx5X2JsdWVzOworICAgIEZUX0J5dGUgICAgbnVtX2ZhbWlseV9vdGhlcl9ibHVlczsKKworICAgIEZUX1Nob3J0ICAgYmx1ZV92YWx1ZXNbMTRdOworICAgIEZUX1Nob3J0ICAgb3RoZXJfYmx1ZXNbMTBdOworCisgICAgRlRfU2hvcnQgICBmYW1pbHlfYmx1ZXMgICAgICBbMTRdOworICAgIEZUX1Nob3J0ICAgZmFtaWx5X290aGVyX2JsdWVzWzEwXTsKKworICAgIEZUX0ZpeGVkICAgYmx1ZV9zY2FsZTsKKyAgICBGVF9JbnQgICAgIGJsdWVfc2hpZnQ7CisgICAgRlRfSW50ICAgICBibHVlX2Z1eno7CisKKyAgICBGVF9VU2hvcnQgIHN0YW5kYXJkX3dpZHRoWzFdOworICAgIEZUX1VTaG9ydCAgc3RhbmRhcmRfaGVpZ2h0WzFdOworCisgICAgRlRfQnl0ZSAgICBudW1fc25hcF93aWR0aHM7CisgICAgRlRfQnl0ZSAgICBudW1fc25hcF9oZWlnaHRzOworICAgIEZUX0Jvb2wgICAgZm9yY2VfYm9sZDsKKyAgICBGVF9Cb29sICAgIHJvdW5kX3N0ZW1fdXA7CisKKyAgICBGVF9TaG9ydCAgIHNuYXBfd2lkdGhzIFsxM107ICAvKiBpbmNsdWRpbmcgc3RkIHdpZHRoICAqLworICAgIEZUX1Nob3J0ICAgc25hcF9oZWlnaHRzWzEzXTsgIC8qIGluY2x1ZGluZyBzdGQgaGVpZ2h0ICovCisKKyAgICBGVF9GaXhlZCAgIGV4cGFuc2lvbl9mYWN0b3I7CisKKyAgICBGVF9Mb25nICAgIGxhbmd1YWdlX2dyb3VwOworICAgIEZUX0xvbmcgICAgcGFzc3dvcmQ7CisKKyAgICBGVF9TaG9ydCAgIG1pbl9mZWF0dXJlWzJdOworCisgIH0gUFNfUHJpdmF0ZVJlYzsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBTX1ByaXZhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgaGFuZGxlIHRvIGEgQFBTX1ByaXZhdGVSZWMgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgUFNfUHJpdmF0ZVJlY18qICBQU19Qcml2YXRlOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVDFfUHJpdmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBUaGlzIHR5cGUgaXMgZXF1aXZhbGVudCB0byBAUFNfUHJpdmF0ZVJlYy4gIEl0IGlzIGRlcHJlY2F0ZWQgYnV0ICAgICovCisgIC8qICAga2VwdCB0byBtYWludGFpbiBzb3VyY2UgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHZhcmlvdXMgdmVyc2lvbnMgb2YgICAqLworICAvKiAgIEZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgUFNfUHJpdmF0ZVJlYyAgVDFfUHJpdmF0ZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFQxX0JsZW5kX0ZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc2V0IG9mIGZsYWdzIHVzZWQgdG8gaW5kaWNhdGUgd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIGEgICAgICAqLworICAvKiAgICBnaXZlbiBibGVuZCBkaWN0aW9uYXJ5IChmb250IGluZm8gb3IgcHJpdmF0ZSkuICBVc2VkIHRvIHN1cHBvcnQgICAgKi8KKyAgLyogICAgTXVsdGlwbGUgTWFzdGVycyBmb250cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVDFfQkxFTkRfVU5ERVJMSU5FX1BPU0lUSU9OIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFQxX0JMRU5EX1VOREVSTElORV9USElDS05FU1MgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUMV9CTEVORF9JVEFMSUNfQU5HTEUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVDFfQkxFTkRfQkxVRV9WQUxVRVMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFQxX0JMRU5EX09USEVSX0JMVUVTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUMV9CTEVORF9TVEFOREFSRF9XSURUSCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVDFfQkxFTkRfU1RBTkRBUkRfSEVJR0hUIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFQxX0JMRU5EX1NURU1fU05BUF9XSURUSFMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUMV9CTEVORF9TVEVNX1NOQVBfSEVJR0hUUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVDFfQkxFTkRfQkxVRV9TQ0FMRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFQxX0JMRU5EX0JMVUVfU0hJRlQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUMV9CTEVORF9GQU1JTFlfQkxVRVMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVDFfQkxFTkRfRkFNSUxZX09USEVSX0JMVUVTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFQxX0JMRU5EX0ZPUkNFX0JPTEQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBlbnVtICBUMV9CbGVuZF9GbGFnc18KKyAgeworICAgIC8qIHJlcXVpcmVkIGZpZWxkcyBpbiBhIEZvbnRJbmZvIGJsZW5kIGRpY3Rpb25hcnkgKi8KKyAgICBUMV9CTEVORF9VTkRFUkxJTkVfUE9TSVRJT04gPSAwLAorICAgIFQxX0JMRU5EX1VOREVSTElORV9USElDS05FU1MsCisgICAgVDFfQkxFTkRfSVRBTElDX0FOR0xFLAorCisgICAgLyogcmVxdWlyZWQgZmllbGRzIGluIGEgUHJpdmF0ZSBibGVuZCBkaWN0aW9uYXJ5ICovCisgICAgVDFfQkxFTkRfQkxVRV9WQUxVRVMsCisgICAgVDFfQkxFTkRfT1RIRVJfQkxVRVMsCisgICAgVDFfQkxFTkRfU1RBTkRBUkRfV0lEVEgsCisgICAgVDFfQkxFTkRfU1RBTkRBUkRfSEVJR0hULAorICAgIFQxX0JMRU5EX1NURU1fU05BUF9XSURUSFMsCisgICAgVDFfQkxFTkRfU1RFTV9TTkFQX0hFSUdIVFMsCisgICAgVDFfQkxFTkRfQkxVRV9TQ0FMRSwKKyAgICBUMV9CTEVORF9CTFVFX1NISUZULAorICAgIFQxX0JMRU5EX0ZBTUlMWV9CTFVFUywKKyAgICBUMV9CTEVORF9GQU1JTFlfT1RIRVJfQkxVRVMsCisgICAgVDFfQkxFTkRfRk9SQ0VfQk9MRCwKKworICAgIFQxX0JMRU5EX01BWCAgICAvKiBkbyBub3QgcmVtb3ZlICovCisKKyAgfSBUMV9CbGVuZF9GbGFnczsKKworCisgIC8qIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVwcmVjYXRlZDsgdXNlIHRoZSBjb3JyZXNwb25kaW5nICovCisgIC8qIGBUMV9CbGVuZF9GbGFncycgdmFsdWVzIGluc3RlYWQgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIHQxX2JsZW5kX3VuZGVybGluZV9wb3NpdGlvbiAgIFQxX0JMRU5EX1VOREVSTElORV9QT1NJVElPTgorI2RlZmluZSB0MV9ibGVuZF91bmRlcmxpbmVfdGhpY2tuZXNzICBUMV9CTEVORF9VTkRFUkxJTkVfVEhJQ0tORVNTCisjZGVmaW5lIHQxX2JsZW5kX2l0YWxpY19hbmdsZSAgICAgICAgIFQxX0JMRU5EX0lUQUxJQ19BTkdMRQorI2RlZmluZSB0MV9ibGVuZF9ibHVlX3ZhbHVlcyAgICAgICAgICBUMV9CTEVORF9CTFVFX1ZBTFVFUworI2RlZmluZSB0MV9ibGVuZF9vdGhlcl9ibHVlcyAgICAgICAgICBUMV9CTEVORF9PVEhFUl9CTFVFUworI2RlZmluZSB0MV9ibGVuZF9zdGFuZGFyZF93aWR0aHMgICAgICBUMV9CTEVORF9TVEFOREFSRF9XSURUSAorI2RlZmluZSB0MV9ibGVuZF9zdGFuZGFyZF9oZWlnaHQgICAgICBUMV9CTEVORF9TVEFOREFSRF9IRUlHSFQKKyNkZWZpbmUgdDFfYmxlbmRfc3RlbV9zbmFwX3dpZHRocyAgICAgVDFfQkxFTkRfU1RFTV9TTkFQX1dJRFRIUworI2RlZmluZSB0MV9ibGVuZF9zdGVtX3NuYXBfaGVpZ2h0cyAgICBUMV9CTEVORF9TVEVNX1NOQVBfSEVJR0hUUworI2RlZmluZSB0MV9ibGVuZF9ibHVlX3NjYWxlICAgICAgICAgICBUMV9CTEVORF9CTFVFX1NDQUxFCisjZGVmaW5lIHQxX2JsZW5kX2JsdWVfc2hpZnQgICAgICAgICAgIFQxX0JMRU5EX0JMVUVfU0hJRlQKKyNkZWZpbmUgdDFfYmxlbmRfZmFtaWx5X2JsdWVzICAgICAgICAgVDFfQkxFTkRfRkFNSUxZX0JMVUVTCisjZGVmaW5lIHQxX2JsZW5kX2ZhbWlseV9vdGhlcl9ibHVlcyAgIFQxX0JMRU5EX0ZBTUlMWV9PVEhFUl9CTFVFUworI2RlZmluZSB0MV9ibGVuZF9mb3JjZV9ib2xkICAgICAgICAgICBUMV9CTEVORF9GT1JDRV9CT0xECisjZGVmaW5lIHQxX2JsZW5kX21heCAgICAgICAgICAgICAgICAgIFQxX0JMRU5EX01BWAorCisgIC8qICovCisKKworICAvKiBtYXhpbXVtIG51bWJlciBvZiBNdWx0aXBsZSBNYXN0ZXJzIGRlc2lnbnMsIGFzIGRlZmluZWQgaW4gdGhlIHNwZWMgKi8KKyNkZWZpbmUgVDFfTUFYX01NX0RFU0lHTlMgICAgIDE2CisKKyAgLyogbWF4aW11bSBudW1iZXIgb2YgTXVsdGlwbGUgTWFzdGVycyBheGVzLCBhcyBkZWZpbmVkIGluIHRoZSBzcGVjICovCisjZGVmaW5lIFQxX01BWF9NTV9BWElTICAgICAgICA0CisKKyAgLyogbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSBkZXNpZ24gbWFwICovCisjZGVmaW5lIFQxX01BWF9NTV9NQVBfUE9JTlRTICAyMAorCisKKyAgLyogdGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzdG9yZSB0aGUgQmxlbmREZXNpZ25NYXAgZW50cnkgZm9yIGFuIGF4aXMgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFBTX0Rlc2lnbk1hcF8KKyAgeworICAgIEZUX0J5dGUgICAgbnVtX3BvaW50czsKKyAgICBGVF9Mb25nKiAgIGRlc2lnbl9wb2ludHM7CisgICAgRlRfRml4ZWQqICBibGVuZF9wb2ludHM7CisKKyAgfSBQU19EZXNpZ25NYXBSZWMsICpQU19EZXNpZ25NYXA7CisKKyAgLyogYmFja3dhcmRzLWNvbXBhdGlibGUgZGVmaW5pdGlvbiAqLworICB0eXBlZGVmIFBTX0Rlc2lnbk1hcFJlYyAgVDFfRGVzaWduTWFwOworCisKKyAgdHlwZWRlZiBzdHJ1Y3QgIFBTX0JsZW5kUmVjXworICB7CisgICAgRlRfVUludCAgICAgICAgICBudW1fZGVzaWduczsKKyAgICBGVF9VSW50ICAgICAgICAgIG51bV9heGlzOworCisgICAgRlRfU3RyaW5nKiAgICAgICBheGlzX25hbWVzW1QxX01BWF9NTV9BWElTXTsKKyAgICBGVF9GaXhlZCogICAgICAgIGRlc2lnbl9wb3NbVDFfTUFYX01NX0RFU0lHTlNdOworICAgIFBTX0Rlc2lnbk1hcFJlYyAgZGVzaWduX21hcFtUMV9NQVhfTU1fQVhJU107CisKKyAgICBGVF9GaXhlZCogICAgICAgIHdlaWdodF92ZWN0b3I7CisgICAgRlRfRml4ZWQqICAgICAgICBkZWZhdWx0X3dlaWdodF92ZWN0b3I7CisKKyAgICBQU19Gb250SW5mbyAgICAgIGZvbnRfaW5mb3NbVDFfTUFYX01NX0RFU0lHTlMgKyAxXTsKKyAgICBQU19Qcml2YXRlICAgICAgIHByaXZhdGVzICBbVDFfTUFYX01NX0RFU0lHTlMgKyAxXTsKKworICAgIEZUX1VMb25nICAgICAgICAgYmxlbmRfYml0ZmxhZ3M7CisKKyAgICBGVF9CQm94KiAgICAgICAgIGJib3hlcyAgICBbVDFfTUFYX01NX0RFU0lHTlMgKyAxXTsKKworICAgIC8qIHNpbmNlIDIuMy4wICovCisKKyAgICAvKiB1bmRvY3VtZW50ZWQsIG9wdGlvbmFsOiB0aGUgZGVmYXVsdCBkZXNpZ24gaW5zdGFuY2U7ICAgKi8KKyAgICAvKiBjb3JyZXNwb25kcyB0byBkZWZhdWx0X3dlaWdodF92ZWN0b3IgLS0gICAgICAgICAgICAgICAgKi8KKyAgICAvKiBudW1fZGVmYXVsdF9kZXNpZ25fdmVjdG9yID09IDAgbWVhbnMgaXQgaXMgbm90IHByZXNlbnQgKi8KKyAgICAvKiBpbiB0aGUgZm9udCBhbmQgYXNzb2NpYXRlZCBtZXRyaWNzIGZpbGVzICAgICAgICAgICAgICAgKi8KKyAgICBGVF9VSW50ICAgICAgICAgIGRlZmF1bHRfZGVzaWduX3ZlY3RvcltUMV9NQVhfTU1fREVTSUdOU107CisgICAgRlRfVUludCAgICAgICAgICBudW1fZGVmYXVsdF9kZXNpZ25fdmVjdG9yOworCisgIH0gUFNfQmxlbmRSZWMsICpQU19CbGVuZDsKKworCisgIC8qIGJhY2t3YXJkcy1jb21wYXRpYmxlIGRlZmluaXRpb24gKi8KKyAgdHlwZWRlZiBQU19CbGVuZFJlYyAgVDFfQmxlbmQ7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBDSURfRmFjZURpY3RSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIHJlcHJlc2VudCBkYXRhIGluIGEgQ0lEIHRvcC1sZXZlbCBkaWN0aW9uYXJ5LiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBDSURfRmFjZURpY3RSZWNfCisgIHsKKyAgICBQU19Qcml2YXRlUmVjICBwcml2YXRlX2RpY3Q7CisKKyAgICBGVF9VSW50ICAgICAgICBsZW5fYnVpbGRjaGFyOworICAgIEZUX0ZpeGVkICAgICAgIGZvcmNlYm9sZF90aHJlc2hvbGQ7CisgICAgRlRfUG9zICAgICAgICAgc3Ryb2tlX3dpZHRoOworICAgIEZUX0ZpeGVkICAgICAgIGV4cGFuc2lvbl9mYWN0b3I7CisKKyAgICBGVF9CeXRlICAgICAgICBwYWludF90eXBlOworICAgIEZUX0J5dGUgICAgICAgIGZvbnRfdHlwZTsKKyAgICBGVF9NYXRyaXggICAgICBmb250X21hdHJpeDsKKyAgICBGVF9WZWN0b3IgICAgICBmb250X29mZnNldDsKKworICAgIEZUX1VJbnQgICAgICAgIG51bV9zdWJyczsKKyAgICBGVF9VTG9uZyAgICAgICBzdWJybWFwX29mZnNldDsKKyAgICBGVF9JbnQgICAgICAgICBzZF9ieXRlczsKKworICB9IENJRF9GYWNlRGljdFJlYzsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENJRF9GYWNlRGljdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgaGFuZGxlIHRvIGEgQENJRF9GYWNlRGljdFJlYyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgQ0lEX0ZhY2VEaWN0UmVjXyogIENJRF9GYWNlRGljdDsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENJRF9Gb250RGljdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoaXMgdHlwZSBpcyBlcXVpdmFsZW50IHRvIEBDSURfRmFjZURpY3RSZWMuICBJdCBpcyBkZXByZWNhdGVkIGJ1dCAqLworICAvKiAgICBrZXB0IHRvIG1haW50YWluIHNvdXJjZSBjb21wYXRpYmlsaXR5IGJldHdlZW4gdmFyaW91cyB2ZXJzaW9ucyBvZiAgKi8KKyAgLyogICAgRnJlZVR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIENJRF9GYWNlRGljdFJlYyAgQ0lEX0ZvbnREaWN0OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQ0lEX0ZhY2VJbmZvUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byByZXByZXNlbnQgQ0lEIEZhY2UgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgQ0lEX0ZhY2VJbmZvUmVjXworICB7CisgICAgRlRfU3RyaW5nKiAgICAgIGNpZF9mb250X25hbWU7CisgICAgRlRfRml4ZWQgICAgICAgIGNpZF92ZXJzaW9uOworICAgIEZUX0ludCAgICAgICAgICBjaWRfZm9udF90eXBlOworCisgICAgRlRfU3RyaW5nKiAgICAgIHJlZ2lzdHJ5OworICAgIEZUX1N0cmluZyogICAgICBvcmRlcmluZzsKKyAgICBGVF9JbnQgICAgICAgICAgc3VwcGxlbWVudDsKKworICAgIFBTX0ZvbnRJbmZvUmVjICBmb250X2luZm87CisgICAgRlRfQkJveCAgICAgICAgIGZvbnRfYmJveDsKKyAgICBGVF9VTG9uZyAgICAgICAgdWlkX2Jhc2U7CisKKyAgICBGVF9JbnQgICAgICAgICAgbnVtX3h1aWQ7CisgICAgRlRfVUxvbmcgICAgICAgIHh1aWRbMTZdOworCisgICAgRlRfVUxvbmcgICAgICAgIGNpZG1hcF9vZmZzZXQ7CisgICAgRlRfSW50ICAgICAgICAgIGZkX2J5dGVzOworICAgIEZUX0ludCAgICAgICAgICBnZF9ieXRlczsKKyAgICBGVF9VTG9uZyAgICAgICAgY2lkX2NvdW50OworCisgICAgRlRfSW50ICAgICAgICAgIG51bV9kaWN0czsKKyAgICBDSURfRmFjZURpY3QgICAgZm9udF9kaWN0czsKKworICAgIEZUX1VMb25nICAgICAgICBkYXRhX29mZnNldDsKKworICB9IENJRF9GYWNlSW5mb1JlYzsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENJRF9GYWNlSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgaGFuZGxlIHRvIGEgQENJRF9GYWNlSW5mb1JlYyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgQ0lEX0ZhY2VJbmZvUmVjXyogIENJRF9GYWNlSW5mbzsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIENJRF9JbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgVGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQgdG8gQENJRF9GYWNlSW5mb1JlYy4gIEl0IGlzIGRlcHJlY2F0ZWQgYnV0ICAqLworICAvKiAgIGtlcHQgdG8gbWFpbnRhaW4gc291cmNlIGNvbXBhdGliaWxpdHkgYmV0d2VlbiB2YXJpb3VzIHZlcnNpb25zIG9mICAgKi8KKyAgLyogICBGcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIENJRF9GYWNlSW5mb1JlYyAgQ0lEX0luZm87CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICAgRlRfSGFzX1BTX0dseXBoX05hbWVzCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICAgUmV0dXJuIHRydWUgaWYgYSBnaXZlbiBmYWNlIHByb3ZpZGVzIHJlbGlhYmxlIFBvc3RTY3JpcHQgZ2x5cGgKKyAgICogICAgbmFtZXMuICBUaGlzIGlzIHNpbWlsYXIgdG8gdXNpbmcgdGhlIEBGVF9IQVNfR0xZUEhfTkFNRVMgbWFjcm8sCisgICAqICAgIGV4Y2VwdCB0aGF0IGNlcnRhaW4gZm9udHMgKG1vc3RseSBUcnVlVHlwZSkgY29udGFpbiBpbmNvcnJlY3QKKyAgICogICAgZ2x5cGggbmFtZSB0YWJsZXMuCisgICAqCisgICAqICAgIFdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUsIHRoZSBjYWxsZXIgaXMgc3VyZSB0aGF0IHRoZSBnbHlwaAorICAgKiAgICBuYW1lcyByZXR1cm5lZCBieSBARlRfR2V0X0dseXBoX05hbWUgYXJlIHJlbGlhYmxlLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgIGZhY2UgOjoKKyAgICogICAgICAgZmFjZSBoYW5kbGUKKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICAgQm9vbGVhbi4gIFRydWUgaWYgZ2x5cGggbmFtZXMgYXJlIHJlbGlhYmxlLgorICAgKgorICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9JbnQgKQorICBGVF9IYXNfUFNfR2x5cGhfTmFtZXMoIEZUX0ZhY2UgIGZhY2UgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgICBGVF9HZXRfUFNfRm9udF9JbmZvCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICAgUmV0cmlldmUgdGhlIEBQU19Gb250SW5mb1JlYyBzdHJ1Y3R1cmUgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuCisgICAqICAgIFBvc3RTY3JpcHQgZm9udC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgICBmYWNlIDo6CisgICAqICAgICAgIFBvc3RTY3JpcHQgZmFjZSBoYW5kbGUuCisgICAqCisgICAqIEBvdXRwdXQ6CisgICAqICAgIGFmb250X2luZm8gOjoKKyAgICogICAgICAgT3V0cHV0IGZvbnQgaW5mbyBzdHJ1Y3R1cmUgcG9pbnRlci4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgIFN0cmluZyBwb2ludGVycyB3aXRoaW4gdGhlIEBQU19Gb250SW5mb1JlYyBzdHJ1Y3R1cmUgYXJlIG93bmVkIGJ5CisgICAqICAgIHRoZSBmYWNlIGFuZCBkb24ndCBuZWVkIHRvIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuICBNaXNzaW5nIGVudHJpZXMKKyAgICogICAgaW4gdGhlIGZvbnQncyBGb250SW5mbyBkaWN0aW9uYXJ5IGFyZSByZXByZXNlbnRlZCBieSBOVUxMIHBvaW50ZXJzLgorICAgKgorICAgKiAgICBJZiB0aGUgZm9udCdzIGZvcm1hdCBpcyBub3QgUG9zdFNjcmlwdC1iYXNlZCwgdGhpcyBmdW5jdGlvbiB3aWxsCisgICAqICAgIHJldHVybiB0aGUgYEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50JyBlcnJvciBjb2RlLgorICAgKgorICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX0dldF9QU19Gb250X0luZm8oIEZUX0ZhY2UgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICBQU19Gb250SW5mbyAgYWZvbnRfaW5mbyApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgIEZUX0dldF9QU19Gb250X1ByaXZhdGUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgICBSZXRyaWV2ZSB0aGUgQFBTX1ByaXZhdGVSZWMgc3RydWN0dXJlIGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbgorICAgKiAgICBQb3N0U2NyaXB0IGZvbnQuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICAgZmFjZSA6OgorICAgKiAgICAgICBQb3N0U2NyaXB0IGZhY2UgaGFuZGxlLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgICBhZm9udF9wcml2YXRlIDo6CisgICAqICAgICAgIE91dHB1dCBwcml2YXRlIGRpY3Rpb25hcnkgc3RydWN0dXJlIHBvaW50ZXIuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgICBUaGUgc3RyaW5nIHBvaW50ZXJzIHdpdGhpbiB0aGUgQFBTX1ByaXZhdGVSZWMgc3RydWN0dXJlIGFyZSBvd25lZCBieQorICAgKiAgICB0aGUgZmFjZSBhbmQgZG9uJ3QgbmVlZCB0byBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICAgKgorICAgKiAgICBJZiB0aGUgZm9udCdzIGZvcm1hdCBpcyBub3QgUG9zdFNjcmlwdC1iYXNlZCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zCisgICAqICAgIHRoZSBgRlRfRXJyX0ludmFsaWRfQXJndW1lbnQnIGVycm9yIGNvZGUuCisgICAqCisgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfR2V0X1BTX0ZvbnRfUHJpdmF0ZSggRlRfRmFjZSAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUFNfUHJpdmF0ZSAgYWZvbnRfcHJpdmF0ZSApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVDFfRW5jb2RpbmdUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQW4gZW51bWVyYXRpb24gZGVzY3JpYmluZyB0aGUgYEVuY29kaW5nJyBlbnRyeSBpbiBhIFR5cGUgMSAgICAgICAgICovCisgIC8qICAgIGRpY3Rpb25hcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFQxX0VOQ09ESU5HX1RZUEVfTk9ORSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUMV9FTkNPRElOR19UWVBFX0FSUkFZIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVDFfRU5DT0RJTkdfVFlQRV9TVEFOREFSRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFQxX0VOQ09ESU5HX1RZUEVfSVNPTEFUSU4xIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUMV9FTkNPRElOR19UWVBFX0VYUEVSVCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgZW51bSAgVDFfRW5jb2RpbmdUeXBlXworICB7CisgICAgVDFfRU5DT0RJTkdfVFlQRV9OT05FID0gMCwKKyAgICBUMV9FTkNPRElOR19UWVBFX0FSUkFZLAorICAgIFQxX0VOQ09ESU5HX1RZUEVfU1RBTkRBUkQsCisgICAgVDFfRU5DT0RJTkdfVFlQRV9JU09MQVRJTjEsCisgICAgVDFfRU5DT0RJTkdfVFlQRV9FWFBFUlQKKworICB9IFQxX0VuY29kaW5nVHlwZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBTX0RpY3RfS2V5cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFuIGVudW1lcmF0aW9uIHVzZWQgaW4gY2FsbHMgdG8gQEZUX0dldF9QU19Gb250X1ZhbHVlIHRvIGlkZW50aWZ5ICAqLworICAvKiAgICB0aGUgVHlwZX4xIGRpY3Rpb25hcnkgZW50cnkgdG8gcmV0cmlldmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQU19ESUNUX0ZPTlRfVFlQRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUFNfRElDVF9GT05UX01BVFJJWCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBTX0RJQ1RfRk9OVF9CQk9YIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQU19ESUNUX1BBSU5UX1RZUEUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUFNfRElDVF9GT05UX05BTUUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBTX0RJQ1RfVU5JUVVFX0lEIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQU19ESUNUX05VTV9DSEFSX1NUUklOR1MgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUFNfRElDVF9DSEFSX1NUUklOR19LRVkgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBTX0RJQ1RfQ0hBUl9TVFJJTkcgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQU19ESUNUX0VOQ09ESU5HX1RZUEUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUFNfRElDVF9FTkNPRElOR19FTlRSWSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBTX0RJQ1RfTlVNX1NVQlJTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQU19ESUNUX1NVQlIgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUFNfRElDVF9TVERfSFcgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBTX0RJQ1RfU1REX1ZXIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQU19ESUNUX05VTV9CTFVFX1ZBTFVFUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUFNfRElDVF9CTFVFX1ZBTFVFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBTX0RJQ1RfQkxVRV9GVVpaIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQU19ESUNUX05VTV9PVEhFUl9CTFVFUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUFNfRElDVF9PVEhFUl9CTFVFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBTX0RJQ1RfTlVNX0ZBTUlMWV9CTFVFUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQU19ESUNUX0ZBTUlMWV9CTFVFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUFNfRElDVF9OVU1fRkFNSUxZX09USEVSX0JMVUVTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBTX0RJQ1RfRkFNSUxZX09USEVSX0JMVUUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQU19ESUNUX0JMVUVfU0NBTEUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUFNfRElDVF9CTFVFX1NISUZUIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBTX0RJQ1RfTlVNX1NURU1fU05BUF9IIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQU19ESUNUX1NURU1fU05BUF9IIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUFNfRElDVF9OVU1fU1RFTV9TTkFQX1YgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBTX0RJQ1RfU1RFTV9TTkFQX1YgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQU19ESUNUX0ZPUkNFX0JPTEQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUFNfRElDVF9STkRfU1RFTV9VUCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBTX0RJQ1RfTUlOX0ZFQVRVUkUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQU19ESUNUX0xFTl9JViA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUFNfRElDVF9QQVNTV09SRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBTX0RJQ1RfTEFOR1VBR0VfR1JPVVAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQU19ESUNUX1ZFUlNJT04gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUFNfRElDVF9OT1RJQ0UgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBTX0RJQ1RfRlVMTF9OQU1FIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQU19ESUNUX0ZBTUlMWV9OQU1FIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUFNfRElDVF9XRUlHSFQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBTX0RJQ1RfSVNfRklYRURfUElUQ0ggOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQU19ESUNUX1VOREVSTElORV9QT1NJVElPTiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUFNfRElDVF9VTkRFUkxJTkVfVEhJQ0tORVNTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFBTX0RJQ1RfRlNfVFlQRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBQU19ESUNUX0lUQUxJQ19BTkdMRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgZW51bSAgUFNfRGljdF9LZXlzXworICB7CisgICAgLyogY29udmVudGlvbmFsbHkgaW4gdGhlIGZvbnQgZGljdGlvbmFyeSAqLworICAgIFBTX0RJQ1RfRk9OVF9UWVBFLCAgICAgICAgICAgICAgLyogRlRfQnl0ZSAgICAgICAgICovCisgICAgUFNfRElDVF9GT05UX01BVFJJWCwgICAgICAgICAgICAvKiBGVF9GaXhlZCAgICAgICAgKi8KKyAgICBQU19ESUNUX0ZPTlRfQkJPWCwgICAgICAgICAgICAgIC8qIEZUX0ZpeGVkICAgICAgICAqLworICAgIFBTX0RJQ1RfUEFJTlRfVFlQRSwgICAgICAgICAgICAgLyogRlRfQnl0ZSAgICAgICAgICovCisgICAgUFNfRElDVF9GT05UX05BTUUsICAgICAgICAgICAgICAvKiBGVF9TdHJpbmcqICAgICAgKi8KKyAgICBQU19ESUNUX1VOSVFVRV9JRCwgICAgICAgICAgICAgIC8qIEZUX0ludCAgICAgICAgICAqLworICAgIFBTX0RJQ1RfTlVNX0NIQVJfU1RSSU5HUywgICAgICAgLyogRlRfSW50ICAgICAgICAgICovCisgICAgUFNfRElDVF9DSEFSX1NUUklOR19LRVksICAgICAgICAvKiBGVF9TdHJpbmcqICAgICAgKi8KKyAgICBQU19ESUNUX0NIQVJfU1RSSU5HLCAgICAgICAgICAgIC8qIEZUX1N0cmluZyogICAgICAqLworICAgIFBTX0RJQ1RfRU5DT0RJTkdfVFlQRSwgICAgICAgICAgLyogVDFfRW5jb2RpbmdUeXBlICovCisgICAgUFNfRElDVF9FTkNPRElOR19FTlRSWSwgICAgICAgICAvKiBGVF9TdHJpbmcqICAgICAgKi8KKworICAgIC8qIGNvbnZlbnRpb25hbGx5IGluIHRoZSBmb250IFByaXZhdGUgZGljdGlvbmFyeSAqLworICAgIFBTX0RJQ1RfTlVNX1NVQlJTLCAgICAgICAgICAgICAgLyogRlRfSW50ICAgICAqLworICAgIFBTX0RJQ1RfU1VCUiwgICAgICAgICAgICAgICAgICAgLyogRlRfU3RyaW5nKiAqLworICAgIFBTX0RJQ1RfU1REX0hXLCAgICAgICAgICAgICAgICAgLyogRlRfVVNob3J0ICAqLworICAgIFBTX0RJQ1RfU1REX1ZXLCAgICAgICAgICAgICAgICAgLyogRlRfVVNob3J0ICAqLworICAgIFBTX0RJQ1RfTlVNX0JMVUVfVkFMVUVTLCAgICAgICAgLyogRlRfQnl0ZSAgICAqLworICAgIFBTX0RJQ1RfQkxVRV9WQUxVRSwgICAgICAgICAgICAgLyogRlRfU2hvcnQgICAqLworICAgIFBTX0RJQ1RfQkxVRV9GVVpaLCAgICAgICAgICAgICAgLyogRlRfSW50ICAgICAqLworICAgIFBTX0RJQ1RfTlVNX09USEVSX0JMVUVTLCAgICAgICAgLyogRlRfQnl0ZSAgICAqLworICAgIFBTX0RJQ1RfT1RIRVJfQkxVRSwgICAgICAgICAgICAgLyogRlRfU2hvcnQgICAqLworICAgIFBTX0RJQ1RfTlVNX0ZBTUlMWV9CTFVFUywgICAgICAgLyogRlRfQnl0ZSAgICAqLworICAgIFBTX0RJQ1RfRkFNSUxZX0JMVUUsICAgICAgICAgICAgLyogRlRfU2hvcnQgICAqLworICAgIFBTX0RJQ1RfTlVNX0ZBTUlMWV9PVEhFUl9CTFVFUywgLyogRlRfQnl0ZSAgICAqLworICAgIFBTX0RJQ1RfRkFNSUxZX09USEVSX0JMVUUsICAgICAgLyogRlRfU2hvcnQgICAqLworICAgIFBTX0RJQ1RfQkxVRV9TQ0FMRSwgICAgICAgICAgICAgLyogRlRfRml4ZWQgICAqLworICAgIFBTX0RJQ1RfQkxVRV9TSElGVCwgICAgICAgICAgICAgLyogRlRfSW50ICAgICAqLworICAgIFBTX0RJQ1RfTlVNX1NURU1fU05BUF9ILCAgICAgICAgLyogRlRfQnl0ZSAgICAqLworICAgIFBTX0RJQ1RfU1RFTV9TTkFQX0gsICAgICAgICAgICAgLyogRlRfU2hvcnQgICAqLworICAgIFBTX0RJQ1RfTlVNX1NURU1fU05BUF9WLCAgICAgICAgLyogRlRfQnl0ZSAgICAqLworICAgIFBTX0RJQ1RfU1RFTV9TTkFQX1YsICAgICAgICAgICAgLyogRlRfU2hvcnQgICAqLworICAgIFBTX0RJQ1RfRk9SQ0VfQk9MRCwgICAgICAgICAgICAgLyogRlRfQm9vbCAgICAqLworICAgIFBTX0RJQ1RfUk5EX1NURU1fVVAsICAgICAgICAgICAgLyogRlRfQm9vbCAgICAqLworICAgIFBTX0RJQ1RfTUlOX0ZFQVRVUkUsICAgICAgICAgICAgLyogRlRfU2hvcnQgICAqLworICAgIFBTX0RJQ1RfTEVOX0lWLCAgICAgICAgICAgICAgICAgLyogRlRfSW50ICAgICAqLworICAgIFBTX0RJQ1RfUEFTU1dPUkQsICAgICAgICAgICAgICAgLyogRlRfTG9uZyAgICAqLworICAgIFBTX0RJQ1RfTEFOR1VBR0VfR1JPVVAsICAgICAgICAgLyogRlRfTG9uZyAgICAqLworCisgICAgLyogY29udmVudGlvbmFsbHkgaW4gdGhlIGZvbnQgRm9udEluZm8gZGljdGlvbmFyeSAqLworICAgIFBTX0RJQ1RfVkVSU0lPTiwgICAgICAgICAgICAgICAgLyogRlRfU3RyaW5nKiAqLworICAgIFBTX0RJQ1RfTk9USUNFLCAgICAgICAgICAgICAgICAgLyogRlRfU3RyaW5nKiAqLworICAgIFBTX0RJQ1RfRlVMTF9OQU1FLCAgICAgICAgICAgICAgLyogRlRfU3RyaW5nKiAqLworICAgIFBTX0RJQ1RfRkFNSUxZX05BTUUsICAgICAgICAgICAgLyogRlRfU3RyaW5nKiAqLworICAgIFBTX0RJQ1RfV0VJR0hULCAgICAgICAgICAgICAgICAgLyogRlRfU3RyaW5nKiAqLworICAgIFBTX0RJQ1RfSVNfRklYRURfUElUQ0gsICAgICAgICAgLyogRlRfQm9vbCAgICAqLworICAgIFBTX0RJQ1RfVU5ERVJMSU5FX1BPU0lUSU9OLCAgICAgLyogRlRfU2hvcnQgICAqLworICAgIFBTX0RJQ1RfVU5ERVJMSU5FX1RISUNLTkVTUywgICAgLyogRlRfVVNob3J0ICAqLworICAgIFBTX0RJQ1RfRlNfVFlQRSwgICAgICAgICAgICAgICAgLyogRlRfVVNob3J0ICAqLworICAgIFBTX0RJQ1RfSVRBTElDX0FOR0xFLCAgICAgICAgICAgLyogRlRfTG9uZyAgICAqLworCisgICAgUFNfRElDVF9NQVggPSBQU19ESUNUX0lUQUxJQ19BTkdMRQorCisgIH0gUFNfRGljdF9LZXlzOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgIEZUX0dldF9QU19Gb250X1ZhbHVlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICAgUmV0cmlldmUgdGhlIHZhbHVlIGZvciB0aGUgc3VwcGxpZWQga2V5IGZyb20gYSBQb3N0U2NyaXB0IGZvbnQuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICAgZmFjZSA6OgorICAgKiAgICAgICBQb3N0U2NyaXB0IGZhY2UgaGFuZGxlLgorICAgKgorICAgKiAgICBrZXkgOjoKKyAgICogICAgICAgQW4gZW51bWVyYXRpb24gdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBkaWN0aW9uYXJ5IGtleSB0byByZXRyaWV2ZS4KKyAgICoKKyAgICogICAgaWR4IDo6CisgICAqICAgICAgIEZvciBhcnJheSB2YWx1ZXMsIHRoaXMgc3BlY2lmaWVzIHRoZSBpbmRleCB0byBiZSByZXR1cm5lZC4KKyAgICoKKyAgICogICAgdmFsdWUgOjoKKyAgICogICAgICAgQSBwb2ludGVyIHRvIG1lbW9yeSBpbnRvIHdoaWNoIHRvIHdyaXRlIHRoZSB2YWx1ZS4KKyAgICoKKyAgICogICAgdmFsZW5fbGVuIDo6CisgICAqICAgICAgIFRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIG1lbW9yeSBzdXBwbGllZCBmb3IgdGhlIHZhbHVlLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgICB2YWx1ZSA6OgorICAgKiAgICAgICBUaGUgdmFsdWUgbWF0Y2hpbmcgdGhlIGFib3ZlIGtleSwgaWYgaXQgZXhpc3RzLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgICBUaGUgYW1vdW50IG9mIG1lbW9yeSAoaW4gYnl0ZXMpIHJlcXVpcmVkIHRvIGhvbGQgdGhlIHJlcXVlc3RlZAorICAgKiAgICB2YWx1ZSAoaWYgaXQgZXhpc3RzLCAtMSBvdGhlcndpc2UpLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICAgVGhlIHZhbHVlcyByZXR1cm5lZCBhcmUgbm90IHBvaW50ZXJzIGludG8gdGhlIGludGVybmFsIHN0cnVjdHVyZXMgb2YKKyAgICogICAgdGhlIGZhY2UsIGJ1dCBhcmUgYGZyZXNoJyBjb3BpZXMsIHNvIHRoYXQgdGhlIG1lbW9yeSBjb250YWluaW5nIHRoZW0KKyAgICogICAgYmVsb25ncyB0byB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbi4gIFRoaXMgYWxzbyBlbmZvcmNlcyB0aGUKKyAgICogICAgYHJlYWQtb25seScgbmF0dXJlIG9mIHRoZXNlIHZhbHVlcywgaS5lLiwgdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUKKyAgICogICAgdXNlZCB0byBtYW5pcHVsYXRlIHRoZSBmYWNlLgorICAgKgorICAgKiAgICBgdmFsdWUnIGlzIGEgdm9pZCBwb2ludGVyIGJlY2F1c2UgdGhlIHZhbHVlcyByZXR1cm5lZCBjYW4gYmUgb2YKKyAgICogICAgdmFyaW91cyB0eXBlcy4KKyAgICoKKyAgICogICAgSWYgZWl0aGVyIGB2YWx1ZScgaXMgTlVMTCBvciBgdmFsdWVfbGVuJyBpcyB0b28gc21hbGwsIGp1c3QgdGhlCisgICAqICAgIHJlcXVpcmVkIG1lbW9yeSBzaXplIGZvciB0aGUgcmVxdWVzdGVkIGVudHJ5IGlzIHJldHVybmVkLgorICAgKgorICAgKiAgICBUaGUgYGlkeCcgcGFyYW1ldGVyIGlzIHVzZWQsIG5vdCBvbmx5IHRvIHJldHJpZXZlIGVsZW1lbnRzIG9mLCBmb3IKKyAgICogICAgZXhhbXBsZSwgdGhlIEZvbnRNYXRyaXggb3IgRm9udEJCb3gsIGJ1dCBhbHNvIHRvIHJldHJpZXZlIG5hbWUga2V5cworICAgKiAgICBmcm9tIHRoZSBDaGFyU3RyaW5ncyBkaWN0aW9uYXJ5LCBhbmQgdGhlIGNoYXJzdHJpbmdzIHRoZW1zZWx2ZXMuICBJdAorICAgKiAgICBpcyBpZ25vcmVkIGZvciBhdG9taWMgdmFsdWVzLgorICAgKgorICAgKiAgICBQU19ESUNUX0JMVUVfU0NBTEUgcmV0dXJucyBhIHZhbHVlIHRoYXQgaXMgc2NhbGVkIHVwIGJ5IDEwMDAuICBUbworICAgKiAgICBnZXQgdGhlIHZhbHVlIGFzIGluIHRoZSBmb250IHN0cmVhbSwgeW91IG5lZWQgdG8gZGl2aWRlIGJ5CisgICAqICAgIDY1NTM2MDAwLjAgKHRvIHJlbW92ZSB0aGUgRlRfRml4ZWQgc2NhbGUsIGFuZCB0aGUgeDEwMDAgc2NhbGUpLgorICAgKgorICAgKiAgICBJTVBPUlRBTlQ6IE9ubHkga2V5L3ZhbHVlIHBhaXJzIHJlYWQgYnkgdGhlIEZyZWVUeXBlIGludGVycHJldGVyIGNhbgorICAgKiAgICBiZSByZXRyaWV2ZWQuICBTbywgZm9yIGV4YW1wbGUsIFBvc3RTY3JpcHQgcHJvY2VkdXJlcyBzdWNoIGFzIE5QLAorICAgKiAgICBORCwgYW5kIFJEIGFyZSBub3QgYXZhaWxhYmxlLiAgQXJiaXRyYXJ5IGtleXMgYXJlLCBvYnZpb3VzbHksIG5vdCBiZQorICAgKiAgICBhdmFpbGFibGUgZWl0aGVyLgorICAgKgorICAgKiAgICBJZiB0aGUgZm9udCdzIGZvcm1hdCBpcyBub3QgUG9zdFNjcmlwdC1iYXNlZCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zCisgICAqICAgIHRoZSBgRlRfRXJyX0ludmFsaWRfQXJndW1lbnQnIGVycm9yIGNvZGUuCisgICAqCisgICAqLworICBGVF9FWFBPUlQoIEZUX0xvbmcgKQorICBGVF9HZXRfUFNfRm9udF9WYWx1ZSggRlRfRmFjZSAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgUFNfRGljdF9LZXlzICBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgIHZhbHVlX2xlbiApOworCisgIC8qICovCisKK0ZUX0VORF9IRUFERVIKKworI2VuZGlmIC8qIF9fVDFUQUJMRVNfSF9fICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL3R0bmFtZWlkLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL3R0bmFtZWlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1ODVmMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvdHRuYW1laWQuaApAQCAtMCwwICsxLDEyMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHR0bmFtZWlkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUcnVlVHlwZSBuYW1lIElEIGRlZmluaXRpb25zIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX1RUTkFNRUlEX0hfXworI2RlZmluZSBfX1RUTkFNRUlEX0hfXworCisKKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdHJ1ZXR5cGVfdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBQb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBgcGxhdGZvcm0nIGlkZW50aWZpZXIgY29kZSBpbiB0aGUgbmFtZSAgICAgICAgKi8KKyAgLyogcmVjb3JkcyBvZiB0aGUgVFRGIGBuYW1lJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZW51bToKKyAgICogICBUVF9QTEFURk9STV9YWFgKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgbGlzdCBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBgcGxhdGZvcm1faWQnIGlkZW50aWZpZXIgY29kZSBpbgorICAgKiAgIEBGVF9DaGFyTWFwUmVjIGFuZCBARlRfU2ZudE5hbWUgc3RydWN0dXJlcy4KKyAgICoKKyAgICogQHZhbHVlczoKKyAgICogICBUVF9QTEFURk9STV9BUFBMRV9VTklDT0RFIDo6CisgICAqICAgICBVc2VkIGJ5IEFwcGxlIHRvIGluZGljYXRlIGEgVW5pY29kZSBjaGFyYWN0ZXIgbWFwIGFuZC9vciBuYW1lIGVudHJ5LgorICAgKiAgICAgU2VlIEBUVF9BUFBMRV9JRF9YWFggZm9yIGNvcnJlc3BvbmRpbmcgYGVuY29kaW5nX2lkJyB2YWx1ZXMuICBOb3RlCisgICAqICAgICB0aGF0IG5hbWUgZW50cmllcyBpbiB0aGlzIGZvcm1hdCBhcmUgY29kZWQgYXMgYmlnLWVuZGlhbiBVQ1MtMgorICAgKiAgICAgY2hhcmFjdGVyIGNvZGVzIF9vbmx5Xy4KKyAgICoKKyAgICogICBUVF9QTEFURk9STV9NQUNJTlRPU0ggOjoKKyAgICogICAgIFVzZWQgYnkgQXBwbGUgdG8gaW5kaWNhdGUgYSBNYWNPUy1zcGVjaWZpYyBjaGFybWFwIGFuZC9vciBuYW1lIGVudHJ5LgorICAgKiAgICAgU2VlIEBUVF9NQUNfSURfWFhYIGZvciBjb3JyZXNwb25kaW5nIGBlbmNvZGluZ19pZCcgdmFsdWVzLiAgTm90ZSB0aGF0CisgICAqICAgICBtb3N0IFRydWVUeXBlIGZvbnRzIGNvbnRhaW4gYW4gQXBwbGUgcm9tYW4gY2hhcm1hcCB0byBiZSB1c2FibGUgb24KKyAgICogICAgIE1hY09TIHN5c3RlbXMgKGV2ZW4gaWYgdGhleSBjb250YWluIGEgTWljcm9zb2Z0IGNoYXJtYXAgYXMgd2VsbCkuCisgICAqCisgICAqICAgVFRfUExBVEZPUk1fSVNPIDo6CisgICAqICAgICBUaGlzIHZhbHVlIHdhcyB1c2VkIHRvIHNwZWNpZnkgSVNPL0lFQyAxMDY0NiBjaGFybWFwcy4gIEl0IGlzIGhvd2V2ZXIKKyAgICogICAgIG5vdyBkZXByZWNhdGVkLiAgU2VlIEBUVF9JU09fSURfWFhYIGZvciBhIGxpc3Qgb2YgY29ycmVzcG9uZGluZworICAgKiAgICAgYGVuY29kaW5nX2lkJyB2YWx1ZXMuCisgICAqCisgICAqICAgVFRfUExBVEZPUk1fTUlDUk9TT0ZUIDo6CisgICAqICAgICBVc2VkIGJ5IE1pY3Jvc29mdCB0byBpbmRpY2F0ZSBXaW5kb3dzLXNwZWNpZmljIGNoYXJtYXBzLiAgU2VlCisgICAqICAgICBAVFRfTVNfSURfWFhYIGZvciBhIGxpc3Qgb2YgY29ycmVzcG9uZGluZyBgZW5jb2RpbmdfaWQnIHZhbHVlcy4KKyAgICogICAgIE5vdGUgdGhhdCBtb3N0IGZvbnRzIGNvbnRhaW4gYSBVbmljb2RlIGNoYXJtYXAgdXNpbmcKKyAgICogICAgIChUVF9QTEFURk9STV9NSUNST1NPRlQsIEBUVF9NU19JRF9VTklDT0RFX0NTKS4KKyAgICoKKyAgICogICBUVF9QTEFURk9STV9DVVNUT00gOjoKKyAgICogICAgIFVzZWQgdG8gaW5kaWNhdGUgYXBwbGljYXRpb24tc3BlY2lmaWMgY2hhcm1hcHMuCisgICAqCisgICAqICAgVFRfUExBVEZPUk1fQURPQkUgOjoKKyAgICogICAgIFRoaXMgdmFsdWUgaXNuJ3QgcGFydCBvZiBhbnkgZm9udCBmb3JtYXQgc3BlY2lmaWNhdGlvbiwgYnV0IGlzIHVzZWQKKyAgICogICAgIGJ5IEZyZWVUeXBlIHRvIHJlcG9ydCBBZG9iZS1zcGVjaWZpYyBjaGFybWFwcyBpbiBhbiBARlRfQ2hhck1hcFJlYworICAgKiAgICAgc3RydWN0dXJlLiAgU2VlIEBUVF9BRE9CRV9JRF9YWFguCisgICAqLworCisjZGVmaW5lIFRUX1BMQVRGT1JNX0FQUExFX1VOSUNPREUgIDAKKyNkZWZpbmUgVFRfUExBVEZPUk1fTUFDSU5UT1NIICAgICAgMQorI2RlZmluZSBUVF9QTEFURk9STV9JU08gICAgICAgICAgICAyIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgVFRfUExBVEZPUk1fTUlDUk9TT0ZUICAgICAgMworI2RlZmluZSBUVF9QTEFURk9STV9DVVNUT00gICAgICAgICA0CisjZGVmaW5lIFRUX1BMQVRGT1JNX0FET0JFICAgICAgICAgIDcgLyogYXJ0aWZpY2lhbCAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBlbnVtOgorICAgKiAgIFRUX0FQUExFX0lEX1hYWAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBsaXN0IG9mIHZhbGlkIHZhbHVlcyBmb3IgdGhlIGBlbmNvZGluZ19pZCcgZm9yCisgICAqICAgQFRUX1BMQVRGT1JNX0FQUExFX1VOSUNPREUgY2hhcm1hcHMgYW5kIG5hbWUgZW50cmllcy4KKyAgICoKKyAgICogQHZhbHVlczoKKyAgICogICBUVF9BUFBMRV9JRF9ERUZBVUxUIDo6CisgICAqICAgICBVbmljb2RlIHZlcnNpb24gMS4wLgorICAgKgorICAgKiAgIFRUX0FQUExFX0lEX1VOSUNPREVfMV8xIDo6CisgICAqICAgICBVbmljb2RlIDEuMTsgc3BlY2lmaWVzIEhhbmd1bCBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0IFUrMzR4eC4KKyAgICoKKyAgICogICBUVF9BUFBMRV9JRF9JU09fMTA2NDYgOjoKKyAgICogICAgIERlcHJlY2F0ZWQgKGlkZW50aWNhbCB0byBwcmVjZWRpbmcpLgorICAgKgorICAgKiAgIFRUX0FQUExFX0lEX1VOSUNPREVfMl8wIDo6CisgICAqICAgICBVbmljb2RlIDIuMCBhbmQgYmV5b25kIChVVEYtMTYgQk1QIG9ubHkpLgorICAgKgorICAgKiAgIFRUX0FQUExFX0lEX1VOSUNPREVfMzIgOjoKKyAgICogICAgIFVuaWNvZGUgMy4xIGFuZCBiZXlvbmQsIHVzaW5nIFVURi0zMi4KKyAgICoKKyAgICogICBUVF9BUFBMRV9JRF9WQVJJQU5UX1NFTEVDVE9SIDo6CisgICAqICAgICBGcm9tIEFkb2JlLCBub3QgQXBwbGUuICBOb3QgYSBub3JtYWwgY21hcC4gIFNwZWNpZmllcyB2YXJpYXRpb25zCisgICAqICAgICBvbiBhIHJlYWwgY21hcC4KKyAgICovCisKKyNkZWZpbmUgVFRfQVBQTEVfSURfREVGQVVMVCAgICAgICAgICAgMCAvKiBVbmljb2RlIDEuMCAqLworI2RlZmluZSBUVF9BUFBMRV9JRF9VTklDT0RFXzFfMSAgICAgICAxIC8qIHNwZWNpZnkgSGFuZ3VsIGF0IFUrMzR4eCAqLworI2RlZmluZSBUVF9BUFBMRV9JRF9JU09fMTA2NDYgICAgICAgICAyIC8qIGRlcHJlY2F0ZWQgKi8KKyNkZWZpbmUgVFRfQVBQTEVfSURfVU5JQ09ERV8yXzAgICAgICAgMyAvKiBvciBsYXRlciAqLworI2RlZmluZSBUVF9BUFBMRV9JRF9VTklDT0RFXzMyICAgICAgICA0IC8qIDIuMCBvciBsYXRlciwgZnVsbCByZXBlcnRvaXJlICovCisjZGVmaW5lIFRUX0FQUExFX0lEX1ZBUklBTlRfU0VMRUNUT1IgIDUgLyogdmFyaWF0aW9uIHNlbGVjdG9yIGRhdGEgKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZW51bToKKyAgICogICBUVF9NQUNfSURfWFhYCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIGxpc3Qgb2YgdmFsaWQgdmFsdWVzIGZvciB0aGUgYGVuY29kaW5nX2lkJyBmb3IKKyAgICogICBAVFRfUExBVEZPUk1fTUFDSU5UT1NIIGNoYXJtYXBzIGFuZCBuYW1lIGVudHJpZXMuCisgICAqCisgICAqIEB2YWx1ZXM6CisgICAqICAgVFRfTUFDX0lEX1JPTUFOIDo6CisgICAqICAgVFRfTUFDX0lEX0pBUEFORVNFIDo6CisgICAqICAgVFRfTUFDX0lEX1RSQURJVElPTkFMX0NISU5FU0UgOjoKKyAgICogICBUVF9NQUNfSURfS09SRUFOIDo6CisgICAqICAgVFRfTUFDX0lEX0FSQUJJQyA6OgorICAgKiAgIFRUX01BQ19JRF9IRUJSRVcgOjoKKyAgICogICBUVF9NQUNfSURfR1JFRUsgOjoKKyAgICogICBUVF9NQUNfSURfUlVTU0lBTiA6OgorICAgKiAgIFRUX01BQ19JRF9SU1lNQk9MIDo6CisgICAqICAgVFRfTUFDX0lEX0RFVkFOQUdBUkkgOjoKKyAgICogICBUVF9NQUNfSURfR1VSTVVLSEkgOjoKKyAgICogICBUVF9NQUNfSURfR1VKQVJBVEkgOjoKKyAgICogICBUVF9NQUNfSURfT1JJWUEgOjoKKyAgICogICBUVF9NQUNfSURfQkVOR0FMSSA6OgorICAgKiAgIFRUX01BQ19JRF9UQU1JTCA6OgorICAgKiAgIFRUX01BQ19JRF9URUxVR1UgOjoKKyAgICogICBUVF9NQUNfSURfS0FOTkFEQSA6OgorICAgKiAgIFRUX01BQ19JRF9NQUxBWUFMQU0gOjoKKyAgICogICBUVF9NQUNfSURfU0lOSEFMRVNFIDo6CisgICAqICAgVFRfTUFDX0lEX0JVUk1FU0UgOjoKKyAgICogICBUVF9NQUNfSURfS0hNRVIgOjoKKyAgICogICBUVF9NQUNfSURfVEhBSSA6OgorICAgKiAgIFRUX01BQ19JRF9MQU9USUFOIDo6CisgICAqICAgVFRfTUFDX0lEX0dFT1JHSUFOIDo6CisgICAqICAgVFRfTUFDX0lEX0FSTUVOSUFOIDo6CisgICAqICAgVFRfTUFDX0lEX01BTERJVklBTiA6OgorICAgKiAgIFRUX01BQ19JRF9TSU1QTElGSUVEX0NISU5FU0UgOjoKKyAgICogICBUVF9NQUNfSURfVElCRVRBTiA6OgorICAgKiAgIFRUX01BQ19JRF9NT05HT0xJQU4gOjoKKyAgICogICBUVF9NQUNfSURfR0VFWiA6OgorICAgKiAgIFRUX01BQ19JRF9TTEFWSUMgOjoKKyAgICogICBUVF9NQUNfSURfVklFVE5BTUVTRSA6OgorICAgKiAgIFRUX01BQ19JRF9TSU5ESEkgOjoKKyAgICogICBUVF9NQUNfSURfVU5JTlRFUlAgOjoKKyAgICovCisKKyNkZWZpbmUgVFRfTUFDX0lEX1JPTUFOICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFRUX01BQ19JRF9KQVBBTkVTRSAgICAgICAgICAgICAgMQorI2RlZmluZSBUVF9NQUNfSURfVFJBRElUSU9OQUxfQ0hJTkVTRSAgIDIKKyNkZWZpbmUgVFRfTUFDX0lEX0tPUkVBTiAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFRUX01BQ19JRF9BUkFCSUMgICAgICAgICAgICAgICAgNAorI2RlZmluZSBUVF9NQUNfSURfSEVCUkVXICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgVFRfTUFDX0lEX0dSRUVLICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFRUX01BQ19JRF9SVVNTSUFOICAgICAgICAgICAgICAgNworI2RlZmluZSBUVF9NQUNfSURfUlNZTUJPTCAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgVFRfTUFDX0lEX0RFVkFOQUdBUkkgICAgICAgICAgICA5CisjZGVmaW5lIFRUX01BQ19JRF9HVVJNVUtISSAgICAgICAgICAgICAxMAorI2RlZmluZSBUVF9NQUNfSURfR1VKQVJBVEkgICAgICAgICAgICAgMTEKKyNkZWZpbmUgVFRfTUFDX0lEX09SSVlBICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIFRUX01BQ19JRF9CRU5HQUxJICAgICAgICAgICAgICAxMworI2RlZmluZSBUVF9NQUNfSURfVEFNSUwgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgVFRfTUFDX0lEX1RFTFVHVSAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIFRUX01BQ19JRF9LQU5OQURBICAgICAgICAgICAgICAxNgorI2RlZmluZSBUVF9NQUNfSURfTUFMQVlBTEFNICAgICAgICAgICAgMTcKKyNkZWZpbmUgVFRfTUFDX0lEX1NJTkhBTEVTRSAgICAgICAgICAgIDE4CisjZGVmaW5lIFRUX01BQ19JRF9CVVJNRVNFICAgICAgICAgICAgICAxOQorI2RlZmluZSBUVF9NQUNfSURfS0hNRVIgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgVFRfTUFDX0lEX1RIQUkgICAgICAgICAgICAgICAgIDIxCisjZGVmaW5lIFRUX01BQ19JRF9MQU9USUFOICAgICAgICAgICAgICAyMgorI2RlZmluZSBUVF9NQUNfSURfR0VPUkdJQU4gICAgICAgICAgICAgMjMKKyNkZWZpbmUgVFRfTUFDX0lEX0FSTUVOSUFOICAgICAgICAgICAgIDI0CisjZGVmaW5lIFRUX01BQ19JRF9NQUxESVZJQU4gICAgICAgICAgICAyNQorI2RlZmluZSBUVF9NQUNfSURfU0lNUExJRklFRF9DSElORVNFICAgMjUKKyNkZWZpbmUgVFRfTUFDX0lEX1RJQkVUQU4gICAgICAgICAgICAgIDI2CisjZGVmaW5lIFRUX01BQ19JRF9NT05HT0xJQU4gICAgICAgICAgICAyNworI2RlZmluZSBUVF9NQUNfSURfR0VFWiAgICAgICAgICAgICAgICAgMjgKKyNkZWZpbmUgVFRfTUFDX0lEX1NMQVZJQyAgICAgICAgICAgICAgIDI5CisjZGVmaW5lIFRUX01BQ19JRF9WSUVUTkFNRVNFICAgICAgICAgICAzMAorI2RlZmluZSBUVF9NQUNfSURfU0lOREhJICAgICAgICAgICAgICAgMzEKKyNkZWZpbmUgVFRfTUFDX0lEX1VOSU5URVJQICAgICAgICAgICAgIDMyCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGVudW06CisgICAqICAgVFRfSVNPX0lEX1hYWAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBsaXN0IG9mIHZhbGlkIHZhbHVlcyBmb3IgdGhlIGBlbmNvZGluZ19pZCcgZm9yCisgICAqICAgQFRUX1BMQVRGT1JNX0lTTyBjaGFybWFwcyBhbmQgbmFtZSBlbnRyaWVzLgorICAgKgorICAgKiAgIFRoZWlyIHVzZSBpcyBub3cgZGVwcmVjYXRlZC4KKyAgICoKKyAgICogQHZhbHVlczoKKyAgICogICBUVF9JU09fSURfN0JJVF9BU0NJSSA6OgorICAgKiAgICAgQVNDSUkuCisgICAqICAgVFRfSVNPX0lEXzEwNjQ2IDo6CisgICAqICAgICBJU08vMTA2NDYuCisgICAqICAgVFRfSVNPX0lEXzg4NTlfMSA6OgorICAgKiAgICAgQWxzbyBrbm93biBhcyBMYXRpbi0xLgorICAgKi8KKworI2RlZmluZSBUVF9JU09fSURfN0JJVF9BU0NJSSAgMAorI2RlZmluZSBUVF9JU09fSURfMTA2NDYgICAgICAgMQorI2RlZmluZSBUVF9JU09fSURfODg1OV8xICAgICAgMgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBlbnVtOgorICAgKiAgIFRUX01TX0lEX1hYWAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBsaXN0IG9mIHZhbGlkIHZhbHVlcyBmb3IgdGhlIGBlbmNvZGluZ19pZCcgZm9yCisgICAqICAgQFRUX1BMQVRGT1JNX01JQ1JPU09GVCBjaGFybWFwcyBhbmQgbmFtZSBlbnRyaWVzLgorICAgKgorICAgKiBAdmFsdWVzOgorICAgKiAgIFRUX01TX0lEX1NZTUJPTF9DUyA6OgorICAgKiAgICAgQ29ycmVzcG9uZHMgdG8gTWljcm9zb2Z0IHN5bWJvbCBlbmNvZGluZy4gU2VlCisgICAqICAgICBARlRfRU5DT0RJTkdfTVNfU1lNQk9MLgorICAgKgorICAgKiAgIFRUX01TX0lEX1VOSUNPREVfQ1MgOjoKKyAgICogICAgIENvcnJlc3BvbmRzIHRvIGEgTWljcm9zb2Z0IFdHTDQgY2hhcm1hcCwgbWF0Y2hpbmcgVW5pY29kZS4gIFNlZQorICAgKiAgICAgQEZUX0VOQ09ESU5HX1VOSUNPREUuCisgICAqCisgICAqICAgVFRfTVNfSURfU0pJUyA6OgorICAgKiAgICAgQ29ycmVzcG9uZHMgdG8gU0pJUyBKYXBhbmVzZSBlbmNvZGluZy4gIFNlZSBARlRfRU5DT0RJTkdfU0pJUy4KKyAgICoKKyAgICogICBUVF9NU19JRF9HQjIzMTIgOjoKKyAgICogICAgIENvcnJlc3BvbmRzIHRvIFNpbXBsaWZpZWQgQ2hpbmVzZSBhcyB1c2VkIGluIE1haW5sYW5kIENoaW5hLiAgU2VlCisgICAqICAgICBARlRfRU5DT0RJTkdfR0IyMzEyLgorICAgKgorICAgKiAgIFRUX01TX0lEX0JJR181IDo6CisgICAqICAgICBDb3JyZXNwb25kcyB0byBUcmFkaXRpb25hbCBDaGluZXNlIGFzIHVzZWQgaW4gVGFpd2FuIGFuZCBIb25nIEtvbmcuCisgICAqICAgICBTZWUgQEZUX0VOQ09ESU5HX0JJRzUuCisgICAqCisgICAqICAgVFRfTVNfSURfV0FOU1VORyA6OgorICAgKiAgICAgQ29ycmVzcG9uZHMgdG8gS29yZWFuIFdhbnN1bmcgZW5jb2RpbmcuICBTZWUgQEZUX0VOQ09ESU5HX1dBTlNVTkcuCisgICAqCisgICAqICAgVFRfTVNfSURfSk9IQUIgOjoKKyAgICogICAgIENvcnJlc3BvbmRzIHRvIEpvaGFiIGVuY29kaW5nLiAgU2VlIEBGVF9FTkNPRElOR19KT0hBQi4KKyAgICoKKyAgICogICBUVF9NU19JRF9VQ1NfNCA6OgorICAgKiAgICAgQ29ycmVzcG9uZHMgdG8gVUNTLTQgb3IgVVRGLTMyIGNoYXJtYXBzLiAgVGhpcyBoYXMgYmVlbiBhZGRlZCB0bworICAgKiAgICAgdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjQgKG1pZC0yMDAxLikKKyAgICovCisKKyNkZWZpbmUgVFRfTVNfSURfU1lNQk9MX0NTICAgIDAKKyNkZWZpbmUgVFRfTVNfSURfVU5JQ09ERV9DUyAgIDEKKyNkZWZpbmUgVFRfTVNfSURfU0pJUyAgICAgICAgIDIKKyNkZWZpbmUgVFRfTVNfSURfR0IyMzEyICAgICAgIDMKKyNkZWZpbmUgVFRfTVNfSURfQklHXzUgICAgICAgIDQKKyNkZWZpbmUgVFRfTVNfSURfV0FOU1VORyAgICAgIDUKKyNkZWZpbmUgVFRfTVNfSURfSk9IQUIgICAgICAgIDYKKyNkZWZpbmUgVFRfTVNfSURfVUNTXzQgICAgICAgMTAKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZW51bToKKyAgICogICBUVF9BRE9CRV9JRF9YWFgKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgbGlzdCBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBgZW5jb2RpbmdfaWQnIGZvcgorICAgKiAgIEBUVF9QTEFURk9STV9BRE9CRSBjaGFybWFwcy4gIFRoaXMgaXMgYSBGcmVlVHlwZS1zcGVjaWZpYyBleHRlbnNpb24hCisgICAqCisgICAqIEB2YWx1ZXM6CisgICAqICAgVFRfQURPQkVfSURfU1RBTkRBUkQgOjoKKyAgICogICAgIEFkb2JlIHN0YW5kYXJkIGVuY29kaW5nLgorICAgKiAgIFRUX0FET0JFX0lEX0VYUEVSVCA6OgorICAgKiAgICAgQWRvYmUgZXhwZXJ0IGVuY29kaW5nLgorICAgKiAgIFRUX0FET0JFX0lEX0NVU1RPTSA6OgorICAgKiAgICAgQWRvYmUgY3VzdG9tIGVuY29kaW5nLgorICAgKiAgIFRUX0FET0JFX0lEX0xBVElOXzEgOjoKKyAgICogICAgIEFkb2JlIExhdGlufjEgZW5jb2RpbmcuCisgICAqLworCisjZGVmaW5lIFRUX0FET0JFX0lEX1NUQU5EQVJEICAwCisjZGVmaW5lIFRUX0FET0JFX0lEX0VYUEVSVCAgICAxCisjZGVmaW5lIFRUX0FET0JFX0lEX0NVU1RPTSAgICAyCisjZGVmaW5lIFRUX0FET0JFX0lEX0xBVElOXzEgICAzCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgbGFuZ3VhZ2UgaWRlbnRpZmllciBmaWVsZCBpbiB0aGUgbmFtZSByZWNvcmRzICAqLworICAvKiBvZiB0aGUgVFRGIGBuYW1lJyB0YWJsZSBpZiB0aGUgYHBsYXRmb3JtJyBpZGVudGlmaWVyIGNvZGUgaXMgICAgICAgICAgKi8KKyAgLyogVFRfUExBVEZPUk1fTUFDSU5UT1NILiAgVGhlc2UgdmFsdWVzIGFyZSBhbHNvIHVzZWQgYXMgcmV0dXJuIHZhbHVlcyAgICovCisgIC8qIGZvciBmdW5jdGlvbiBARlRfR2V0X0NNYXBfTGFuZ3VhZ2VfSUQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlIGNhbm9uaWNhbCBzb3VyY2UgZm9yIHRoZSBBcHBsZSBhc3NpZ25lZCBMYW5ndWFnZSBJRCdzIGlzIGF0ICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9mb250cy9UcnVlVHlwZS1SZWZlcmVuY2UtTWFudWFsL1JNMDYvQ2hhcDZuYW1lLmh0bWwgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRUX01BQ19MQU5HSURfRU5HTElTSCAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0ZSRU5DSCAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HRVJNQU4gICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFRUX01BQ19MQU5HSURfSVRBTElBTiAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBUVF9NQUNfTEFOR0lEX0RVVENIICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TV0VESVNIICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFRUX01BQ19MQU5HSURfU1BBTklTSCAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0RBTklTSCAgICAgICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9QT1JUVUdVRVNFICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFRUX01BQ19MQU5HSURfTk9SV0VHSUFOICAgICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0hFQlJFVyAgICAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9KQVBBTkVTRSAgICAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIFRUX01BQ19MQU5HSURfQVJBQklDICAgICAgICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0ZJTk5JU0ggICAgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HUkVFSyAgICAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIFRUX01BQ19MQU5HSURfSUNFTEFORElDICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX01BTFRFU0UgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9UVVJLSVNIICAgICAgICAgICAgICAgICAgICAgIDE3CisjZGVmaW5lIFRUX01BQ19MQU5HSURfQ1JPQVRJQU4gICAgICAgICAgICAgICAgICAgICAxOAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0NISU5FU0VfVFJBRElUSU9OQUwgICAgICAgICAgMTkKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9VUkRVICAgICAgICAgICAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIFRUX01BQ19MQU5HSURfSElOREkgICAgICAgICAgICAgICAgICAgICAgICAyMQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RIQUkgICAgICAgICAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9LT1JFQU4gICAgICAgICAgICAgICAgICAgICAgIDIzCisjZGVmaW5lIFRUX01BQ19MQU5HSURfTElUSFVBTklBTiAgICAgICAgICAgICAgICAgICAyNAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1BPTElTSCAgICAgICAgICAgICAgICAgICAgICAgMjUKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9IVU5HQVJJQU4gICAgICAgICAgICAgICAgICAgIDI2CisjZGVmaW5lIFRUX01BQ19MQU5HSURfRVNUT05JQU4gICAgICAgICAgICAgICAgICAgICAyNworI2RlZmluZSBUVF9NQUNfTEFOR0lEX0xFVFRJU0ggICAgICAgICAgICAgICAgICAgICAgMjgKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TQUFNSVNLICAgICAgICAgICAgICAgICAgICAgIDI5CisjZGVmaW5lIFRUX01BQ19MQU5HSURfRkFFUk9FU0UgICAgICAgICAgICAgICAgICAgICAzMAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0ZBUlNJICAgICAgICAgICAgICAgICAgICAgICAgMzEKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9SVVNTSUFOICAgICAgICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIFRUX01BQ19MQU5HSURfQ0hJTkVTRV9TSU1QTElGSUVEICAgICAgICAgICAzMworI2RlZmluZSBUVF9NQUNfTEFOR0lEX0ZMRU1JU0ggICAgICAgICAgICAgICAgICAgICAgMzQKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9JUklTSCAgICAgICAgICAgICAgICAgICAgICAgIDM1CisjZGVmaW5lIFRUX01BQ19MQU5HSURfQUxCQU5JQU4gICAgICAgICAgICAgICAgICAgICAzNgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1JPTUFOSUFOICAgICAgICAgICAgICAgICAgICAgMzcKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9DWkVDSCAgICAgICAgICAgICAgICAgICAgICAgIDM4CisjZGVmaW5lIFRUX01BQ19MQU5HSURfU0xPVkFLICAgICAgICAgICAgICAgICAgICAgICAzOQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NMT1ZFTklBTiAgICAgICAgICAgICAgICAgICAgNDAKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9ZSURESVNIICAgICAgICAgICAgICAgICAgICAgIDQxCisjZGVmaW5lIFRUX01BQ19MQU5HSURfU0VSQklBTiAgICAgICAgICAgICAgICAgICAgICA0MgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX01BQ0VET05JQU4gICAgICAgICAgICAgICAgICAgNDMKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9CVUxHQVJJQU4gICAgICAgICAgICAgICAgICAgIDQ0CisjZGVmaW5lIFRUX01BQ19MQU5HSURfVUtSQUlOSUFOICAgICAgICAgICAgICAgICAgICA0NQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0JZRUxPUlVTU0lBTiAgICAgICAgICAgICAgICAgNDYKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9VWkJFSyAgICAgICAgICAgICAgICAgICAgICAgIDQ3CisjZGVmaW5lIFRUX01BQ19MQU5HSURfS0FaQUtIICAgICAgICAgICAgICAgICAgICAgICA0OAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FaRVJCQUlKQU5JICAgICAgICAgICAgICAgICAgNDkKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9BWkVSQkFJSkFOSV9DWVJJTExJQ19TQ1JJUFQgIDQ5CisjZGVmaW5lIFRUX01BQ19MQU5HSURfQVpFUkJBSUpBTklfQVJBQklDX1NDUklQVCAgICA1MAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FSTUVOSUFOICAgICAgICAgICAgICAgICAgICAgNTEKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HRU9SR0lBTiAgICAgICAgICAgICAgICAgICAgIDUyCisjZGVmaW5lIFRUX01BQ19MQU5HSURfTU9MREFWSUFOICAgICAgICAgICAgICAgICAgICA1MworI2RlZmluZSBUVF9NQUNfTEFOR0lEX0tJUkdISVogICAgICAgICAgICAgICAgICAgICAgNTQKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9UQUpJS0kgICAgICAgICAgICAgICAgICAgICAgIDU1CisjZGVmaW5lIFRUX01BQ19MQU5HSURfVFVSS01FTiAgICAgICAgICAgICAgICAgICAgICA1NgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX01PTkdPTElBTiAgICAgICAgICAgICAgICAgICAgNTcKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NT05HT0xJQU5fTU9OR09MSUFOX1NDUklQVCAgIDU3CisjZGVmaW5lIFRUX01BQ19MQU5HSURfTU9OR09MSUFOX0NZUklMTElDX1NDUklQVCAgICA1OAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1BBU0hUTyAgICAgICAgICAgICAgICAgICAgICAgNTkKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9LVVJESVNIICAgICAgICAgICAgICAgICAgICAgIDYwCisjZGVmaW5lIFRUX01BQ19MQU5HSURfS0FTSE1JUkkgICAgICAgICAgICAgICAgICAgICA2MQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NJTkRISSAgICAgICAgICAgICAgICAgICAgICAgNjIKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9USUJFVEFOICAgICAgICAgICAgICAgICAgICAgIDYzCisjZGVmaW5lIFRUX01BQ19MQU5HSURfTkVQQUxJICAgICAgICAgICAgICAgICAgICAgICA2NAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NBTlNLUklUICAgICAgICAgICAgICAgICAgICAgNjUKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQVJBVEhJICAgICAgICAgICAgICAgICAgICAgIDY2CisjZGVmaW5lIFRUX01BQ19MQU5HSURfQkVOR0FMSSAgICAgICAgICAgICAgICAgICAgICA2NworI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FTU0FNRVNFICAgICAgICAgICAgICAgICAgICAgNjgKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HVUpBUkFUSSAgICAgICAgICAgICAgICAgICAgIDY5CisjZGVmaW5lIFRUX01BQ19MQU5HSURfUFVOSkFCSSAgICAgICAgICAgICAgICAgICAgICA3MAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX09SSVlBICAgICAgICAgICAgICAgICAgICAgICAgNzEKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQUxBWUFMQU0gICAgICAgICAgICAgICAgICAgIDcyCisjZGVmaW5lIFRUX01BQ19MQU5HSURfS0FOTkFEQSAgICAgICAgICAgICAgICAgICAgICA3MworI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RBTUlMICAgICAgICAgICAgICAgICAgICAgICAgNzQKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9URUxVR1UgICAgICAgICAgICAgICAgICAgICAgIDc1CisjZGVmaW5lIFRUX01BQ19MQU5HSURfU0lOSEFMRVNFICAgICAgICAgICAgICAgICAgICA3NgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0JVUk1FU0UgICAgICAgICAgICAgICAgICAgICAgNzcKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9LSE1FUiAgICAgICAgICAgICAgICAgICAgICAgIDc4CisjZGVmaW5lIFRUX01BQ19MQU5HSURfTEFPICAgICAgICAgICAgICAgICAgICAgICAgICA3OQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1ZJRVROQU1FU0UgICAgICAgICAgICAgICAgICAgODAKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9JTkRPTkVTSUFOICAgICAgICAgICAgICAgICAgIDgxCisjZGVmaW5lIFRUX01BQ19MQU5HSURfVEFHQUxPRyAgICAgICAgICAgICAgICAgICAgICA4MgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX01BTEFZX1JPTUFOX1NDUklQVCAgICAgICAgICAgODMKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQUxBWV9BUkFCSUNfU0NSSVBUICAgICAgICAgIDg0CisjZGVmaW5lIFRUX01BQ19MQU5HSURfQU1IQVJJQyAgICAgICAgICAgICAgICAgICAgICA4NQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RJR1JJTllBICAgICAgICAgICAgICAgICAgICAgODYKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HQUxMQSAgICAgICAgICAgICAgICAgICAgICAgIDg3CisjZGVmaW5lIFRUX01BQ19MQU5HSURfU09NQUxJICAgICAgICAgICAgICAgICAgICAgICA4OAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NXQUhJTEkgICAgICAgICAgICAgICAgICAgICAgODkKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9SVUFOREEgICAgICAgICAgICAgICAgICAgICAgIDkwCisjZGVmaW5lIFRUX01BQ19MQU5HSURfUlVOREkgICAgICAgICAgICAgICAgICAgICAgICA5MQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0NIRVdBICAgICAgICAgICAgICAgICAgICAgICAgOTIKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQUxBR0FTWSAgICAgICAgICAgICAgICAgICAgIDkzCisjZGVmaW5lIFRUX01BQ19MQU5HSURfRVNQRVJBTlRPICAgICAgICAgICAgICAgICAgICA5NAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1dFTFNIICAgICAgICAgICAgICAgICAgICAgICAxMjgKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9CQVNRVUUgICAgICAgICAgICAgICAgICAgICAgMTI5CisjZGVmaW5lIFRUX01BQ19MQU5HSURfQ0FUQUxBTiAgICAgICAgICAgICAgICAgICAgIDEzMAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0xBVElOICAgICAgICAgICAgICAgICAgICAgICAxMzEKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9RVUVDSFVBICAgICAgICAgICAgICAgICAgICAgMTMyCisjZGVmaW5lIFRUX01BQ19MQU5HSURfR1VBUkFOSSAgICAgICAgICAgICAgICAgICAgIDEzMworI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FZTUFSQSAgICAgICAgICAgICAgICAgICAgICAxMzQKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9UQVRBUiAgICAgICAgICAgICAgICAgICAgICAgMTM1CisjZGVmaW5lIFRUX01BQ19MQU5HSURfVUlHSFVSICAgICAgICAgICAgICAgICAgICAgIDEzNgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0RaT05HS0hBICAgICAgICAgICAgICAgICAgICAxMzcKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9KQVZBTkVTRSAgICAgICAgICAgICAgICAgICAgMTM4CisjZGVmaW5lIFRUX01BQ19MQU5HSURfU1VOREFORVNFICAgICAgICAgICAgICAgICAgIDEzOQorCisKKyNpZiAwICAvKiB0aGVzZSBzZWVtIHRvIGJlIGVycm9ycyB0aGF0IGhhdmUgYmVlbiBkcm9wcGVkICovCisKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TQ09UVElTSF9HQUVMSUMgICAgICAgICAgICAgMTQwCisjZGVmaW5lIFRUX01BQ19MQU5HSURfSVJJU0hfR0FFTElDICAgICAgICAgICAgICAgIDE0MQorCisjZW5kaWYKKworCisgIC8qIFRoZSBmb2xsb3dpbmcgY29kZXMgYXJlIG5ldyBhcyBvZiAyMDAwLTAzLTEwICovCisjZGVmaW5lIFRUX01BQ19MQU5HSURfR0FMSUNJQU4gICAgICAgICAgICAgICAgICAgIDE0MAorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FGUklLQUFOUyAgICAgICAgICAgICAgICAgICAxNDEKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9CUkVUT04gICAgICAgICAgICAgICAgICAgICAgMTQyCisjZGVmaW5lIFRUX01BQ19MQU5HSURfSU5VS1RJVFVUICAgICAgICAgICAgICAgICAgIDE0MworI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NDT1RUSVNIX0dBRUxJQyAgICAgICAgICAgICAxNDQKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQU5YX0dBRUxJQyAgICAgICAgICAgICAgICAgMTQ1CisjZGVmaW5lIFRUX01BQ19MQU5HSURfSVJJU0hfR0FFTElDICAgICAgICAgICAgICAgIDE0NgorI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RPTkdBTiAgICAgICAgICAgICAgICAgICAgICAxNDcKKyNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HUkVFS19QT0xZVE9OSUMgICAgICAgICAgICAgMTQ4CisjZGVmaW5lIFRUX01BQ19MQU5HSURfR1JFRUxBTkRJQyAgICAgICAgICAgICAgICAgIDE0OQorI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FaRVJCQUlKQU5JX1JPTUFOX1NDUklQVCAgICAxNTAKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBsYW5ndWFnZSBpZGVudGlmaWVyIGZpZWxkIGluIHRoZSBuYW1lIHJlY29yZHMgICovCisgIC8qIG9mIHRoZSBUVEYgYG5hbWUnIHRhYmxlIGlmIHRoZSBgcGxhdGZvcm0nIGlkZW50aWZpZXIgY29kZSBpcyAgICAgICAgICAqLworICAvKiBUVF9QTEFURk9STV9NSUNST1NPRlQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoZSBjYW5vbmljYWwgc291cmNlIGZvciB0aGUgTVMgYXNzaWduZWQgTENJRHMgaXMgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vZ2xvYmFsZGV2L3JlZmVyZW5jZS9sY2lkLWFsbC5tc3B4ICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfR0VORVJBTCAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfU0FVRElfQVJBQklBICAgICAgICAgICAgICAgMHgwNDAxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfSVJBUSAgICAgICAgICAgICAgICAgICAgICAgMHgwODAxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfRUdZUFQgICAgICAgICAgICAgICAgICAgICAgMHgwQzAxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfTElCWUEgICAgICAgICAgICAgICAgICAgICAgMHgxMDAxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfQUxHRVJJQSAgICAgICAgICAgICAgICAgICAgMHgxNDAxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfTU9ST0NDTyAgICAgICAgICAgICAgICAgICAgMHgxODAxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfVFVOSVNJQSAgICAgICAgICAgICAgICAgICAgMHgxQzAxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfT01BTiAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfWUVNRU4gICAgICAgICAgICAgICAgICAgICAgMHgyNDAxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfU1lSSUEgICAgICAgICAgICAgICAgICAgICAgMHgyODAxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfSk9SREFOICAgICAgICAgICAgICAgICAgICAgMHgyQzAxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfTEVCQU5PTiAgICAgICAgICAgICAgICAgICAgMHgzMDAxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfS1VXQUlUICAgICAgICAgICAgICAgICAgICAgMHgzNDAxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfVUFFICAgICAgICAgICAgICAgICAgICAgICAgMHgzODAxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfQkFIUkFJTiAgICAgICAgICAgICAgICAgICAgMHgzQzAxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfUUFUQVIgICAgICAgICAgICAgICAgICAgICAgMHg0MDAxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9CVUxHQVJJQU5fQlVMR0FSSUEgICAgICAgICAgICAgICAgMHgwNDAyCisjZGVmaW5lIFRUX01TX0xBTkdJRF9DQVRBTEFOX1NQQUlOICAgICAgICAgICAgICAgICAgICAgMHgwNDAzCisjZGVmaW5lIFRUX01TX0xBTkdJRF9DSElORVNFX0dFTkVSQUwgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFRUX01TX0xBTkdJRF9DSElORVNFX1RBSVdBTiAgICAgICAgICAgICAgICAgICAgMHgwNDA0CisjZGVmaW5lIFRUX01TX0xBTkdJRF9DSElORVNFX1BSQyAgICAgICAgICAgICAgICAgICAgICAgMHgwODA0CisjZGVmaW5lIFRUX01TX0xBTkdJRF9DSElORVNFX0hPTkdfS09ORyAgICAgICAgICAgICAgICAgMHgwQzA0CisjZGVmaW5lIFRUX01TX0xBTkdJRF9DSElORVNFX1NJTkdBUE9SRSAgICAgICAgICAgICAgICAgMHgxMDA0CisKKyNpZiAxICAvKiB0aGlzIGxvb2tzIGxpa2UgdGhlIGNvcnJlY3QgdmFsdWUgKi8KKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0NISU5FU0VfTUFDQVUgICAgICAgICAgICAgICAgICAgICAweDE0MDQKKyNlbHNlICAvKiBidXQgYmV3YXJlLCBNaWNyb3NvZnQgbWF5IGNoYW5nZSBpdHMgbWluZC4uLgorICAgICAgICAgIHRoZSBtb3N0IHJlY2VudCBXb3JkIHJlZmVyZW5jZSBoYXMgdGhlIGZvbGxvd2luZzogKi8KKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0NISU5FU0VfTUFDQVUgIFRUX01TX0xBTkdJRF9DSElORVNFX0hPTkdfS09ORworI2VuZGlmCisKKyNpZiAwICAvKiB1c2VkIG9ubHkgd2l0aCAuTkVUIGBjdWx0dXJlcyc7IGNvbW1lbnRlZCBvdXQgKi8KKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0NISU5FU0VfVFJBRElUSU9OQUwgICAgICAgICAgICAgICAweDdDMDQKKyNlbmRpZgorCisjZGVmaW5lIFRUX01TX0xBTkdJRF9DWkVDSF9DWkVDSF9SRVBVQkxJQyAgICAgICAgICAgICAgMHgwNDA1CisjZGVmaW5lIFRUX01TX0xBTkdJRF9EQU5JU0hfREVOTUFSSyAgICAgICAgICAgICAgICAgICAgMHgwNDA2CisjZGVmaW5lIFRUX01TX0xBTkdJRF9HRVJNQU5fR0VSTUFOWSAgICAgICAgICAgICAgICAgICAgMHgwNDA3CisjZGVmaW5lIFRUX01TX0xBTkdJRF9HRVJNQU5fU1dJVFpFUkxBTkQgICAgICAgICAgICAgICAgMHgwODA3CisjZGVmaW5lIFRUX01TX0xBTkdJRF9HRVJNQU5fQVVTVFJJQSAgICAgICAgICAgICAgICAgICAgMHgwQzA3CisjZGVmaW5lIFRUX01TX0xBTkdJRF9HRVJNQU5fTFVYRU1CT1VSRyAgICAgICAgICAgICAgICAgMHgxMDA3CisjZGVmaW5lIFRUX01TX0xBTkdJRF9HRVJNQU5fTElFQ0hURU5TVEVJICAgICAgICAgICAgICAgMHgxNDA3CisjZGVmaW5lIFRUX01TX0xBTkdJRF9HUkVFS19HUkVFQ0UgICAgICAgICAgICAgICAgICAgICAgMHgwNDA4CisKKyAgLyogZG9uJ3QgYXNrIHdoYXQgdGhpcyBvbmUgbWVhbnMuLi4gSXQgaXMgY29tbWVudGVkIG91dCBjdXJyZW50bHkuICovCisjaWYgMAorI2RlZmluZSBUVF9NU19MQU5HSURfR1JFRUtfR1JFRUNFMiAgICAgICAgICAgICAgICAgICAgIDB4MjAwOAorI2VuZGlmCisKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfR0VORVJBTCAgICAgICAgICAgICAgICAgICAweDAwMDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfVU5JVEVEX1NUQVRFUyAgICAgICAgICAgICAweDA0MDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfVU5JVEVEX0tJTkdET00gICAgICAgICAgICAweDA4MDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfQVVTVFJBTElBICAgICAgICAgICAgICAgICAweDBDMDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfQ0FOQURBICAgICAgICAgICAgICAgICAgICAweDEwMDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfTkVXX1pFQUxBTkQgICAgICAgICAgICAgICAweDE0MDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfSVJFTEFORCAgICAgICAgICAgICAgICAgICAweDE4MDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfU09VVEhfQUZSSUNBICAgICAgICAgICAgICAweDFDMDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfSkFNQUlDQSAgICAgICAgICAgICAgICAgICAweDIwMDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfQ0FSSUJCRUFOICAgICAgICAgICAgICAgICAweDI0MDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfQkVMSVpFICAgICAgICAgICAgICAgICAgICAweDI4MDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfVFJJTklEQUQgICAgICAgICAgICAgICAgICAweDJDMDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfWklNQkFCV0UgICAgICAgICAgICAgICAgICAweDMwMDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfUEhJTElQUElORVMgICAgICAgICAgICAgICAweDM0MDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfSU5ET05FU0lBICAgICAgICAgICAgICAgICAweDM4MDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfSE9OR19LT05HICAgICAgICAgICAgICAgICAweDNDMDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfSU5ESUEgICAgICAgICAgICAgICAgICAgICAweDQwMDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfTUFMQVlTSUEgICAgICAgICAgICAgICAgICAweDQ0MDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfU0lOR0FQT1JFICAgICAgICAgICAgICAgICAweDQ4MDkKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfU1BBSU5fVFJBRElUSU9OQUxfU09SVCAgICAweDA0MEEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfTUVYSUNPICAgICAgICAgICAgICAgICAgICAweDA4MEEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfU1BBSU5fSU5URVJOQVRJT05BTF9TT1JUICAweDBDMEEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfR1VBVEVNQUxBICAgICAgICAgICAgICAgICAweDEwMEEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfQ09TVEFfUklDQSAgICAgICAgICAgICAgICAweDE0MEEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfUEFOQU1BICAgICAgICAgICAgICAgICAgICAweDE4MEEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfRE9NSU5JQ0FOX1JFUFVCTElDICAgICAgICAweDFDMEEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfVkVORVpVRUxBICAgICAgICAgICAgICAgICAweDIwMEEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfQ09MT01CSUEgICAgICAgICAgICAgICAgICAweDI0MEEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfUEVSVSAgICAgICAgICAgICAgICAgICAgICAweDI4MEEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfQVJHRU5USU5BICAgICAgICAgICAgICAgICAweDJDMEEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfRUNVQURPUiAgICAgICAgICAgICAgICAgICAweDMwMEEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfQ0hJTEUgICAgICAgICAgICAgICAgICAgICAweDM0MEEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfVVJVR1VBWSAgICAgICAgICAgICAgICAgICAweDM4MEEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfUEFSQUdVQVkgICAgICAgICAgICAgICAgICAweDNDMEEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfQk9MSVZJQSAgICAgICAgICAgICAgICAgICAweDQwMEEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfRUxfU0FMVkFET1IgICAgICAgICAgICAgICAweDQ0MEEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfSE9ORFVSQVMgICAgICAgICAgICAgICAgICAweDQ4MEEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfTklDQVJBR1VBICAgICAgICAgICAgICAgICAweDRDMEEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfUFVFUlRPX1JJQ08gICAgICAgICAgICAgICAweDUwMEEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfVU5JVEVEX1NUQVRFUyAgICAgICAgICAgICAweDU0MEEKKyAgLyogVGhlIGZvbGxvd2luZyBJRCBibGF0YW50bHkgdmlvbGF0ZSBNUyBzcGVjcyBieSB1c2luZyBhICovCisgIC8qIHN1Ymxhbmd1YWdlID4gMHgxRi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9MQVRJTl9BTUVSSUNBICAgICAgICAgICAgIDB4RTQwQVUKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZJTk5JU0hfRklOTEFORCAgICAgICAgICAgICAgICAgICAweDA0MEIKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9GUkFOQ0UgICAgICAgICAgICAgICAgICAgICAweDA0MEMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9CRUxHSVVNICAgICAgICAgICAgICAgICAgICAweDA4MEMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9DQU5BREEgICAgICAgICAgICAgICAgICAgICAweDBDMEMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9TV0lUWkVSTEFORCAgICAgICAgICAgICAgICAweDEwMEMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9MVVhFTUJPVVJHICAgICAgICAgICAgICAgICAweDE0MEMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9NT05BQ08gICAgICAgICAgICAgICAgICAgICAweDE4MEMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9XRVNUX0lORElFUyAgICAgICAgICAgICAgICAweDFDMEMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9SRVVOSU9OICAgICAgICAgICAgICAgICAgICAweDIwMEMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9DT05HTyAgICAgICAgICAgICAgICAgICAgICAweDI0MEMKKyAgLyogd2hpY2ggd2FzIGZvcm1lcmx5OiAqLworI2RlZmluZSBUVF9NU19MQU5HSURfRlJFTkNIX1pBSVJFICBUVF9NU19MQU5HSURfRlJFTkNIX0NPTkdPCisjZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfU0VORUdBTCAgICAgICAgICAgICAgICAgICAgMHgyODBDCisjZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfQ0FNRVJPT04gICAgICAgICAgICAgICAgICAgMHgyQzBDCisjZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfQ09URV9EX0lWT0lSRSAgICAgICAgICAgICAgMHgzMDBDCisjZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfTUFMSSAgICAgICAgICAgICAgICAgICAgICAgMHgzNDBDCisjZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfTU9ST0NDTyAgICAgICAgICAgICAgICAgICAgMHgzODBDCisjZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfSEFJVEkgICAgICAgICAgICAgICAgICAgICAgMHgzQzBDCisgIC8qIGFuZCBhbm90aGVyIHZpb2xhdGlvbiBvZiB0aGUgc3BlYyAoc2VlIDB4RTQwQVUpICovCisjZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfTk9SVEhfQUZSSUNBICAgICAgICAgICAgICAgMHhFNDBDVQorI2RlZmluZSBUVF9NU19MQU5HSURfSEVCUkVXX0lTUkFFTCAgICAgICAgICAgICAgICAgICAgIDB4MDQwRAorI2RlZmluZSBUVF9NU19MQU5HSURfSFVOR0FSSUFOX0hVTkdBUlkgICAgICAgICAgICAgICAgIDB4MDQwRQorI2RlZmluZSBUVF9NU19MQU5HSURfSUNFTEFORElDX0lDRUxBTkQgICAgICAgICAgICAgICAgIDB4MDQwRgorI2RlZmluZSBUVF9NU19MQU5HSURfSVRBTElBTl9JVEFMWSAgICAgICAgICAgICAgICAgICAgIDB4MDQxMAorI2RlZmluZSBUVF9NU19MQU5HSURfSVRBTElBTl9TV0lUWkVSTEFORCAgICAgICAgICAgICAgIDB4MDgxMAorI2RlZmluZSBUVF9NU19MQU5HSURfSkFQQU5FU0VfSkFQQU4gICAgICAgICAgICAgICAgICAgIDB4MDQxMQorI2RlZmluZSBUVF9NU19MQU5HSURfS09SRUFOX0VYVEVOREVEX1dBTlNVTkdfS09SRUEgICAgIDB4MDQxMgorI2RlZmluZSBUVF9NU19MQU5HSURfS09SRUFOX0pPSEFCX0tPUkVBICAgICAgICAgICAgICAgIDB4MDgxMgorI2RlZmluZSBUVF9NU19MQU5HSURfRFVUQ0hfTkVUSEVSTEFORFMgICAgICAgICAgICAgICAgIDB4MDQxMworI2RlZmluZSBUVF9NU19MQU5HSURfRFVUQ0hfQkVMR0lVTSAgICAgICAgICAgICAgICAgICAgIDB4MDgxMworI2RlZmluZSBUVF9NU19MQU5HSURfTk9SV0VHSUFOX05PUldBWV9CT0tNQUwgICAgICAgICAgIDB4MDQxNAorI2RlZmluZSBUVF9NU19MQU5HSURfTk9SV0VHSUFOX05PUldBWV9OWU5PUlNLICAgICAgICAgIDB4MDgxNAorI2RlZmluZSBUVF9NU19MQU5HSURfUE9MSVNIX1BPTEFORCAgICAgICAgICAgICAgICAgICAgIDB4MDQxNQorI2RlZmluZSBUVF9NU19MQU5HSURfUE9SVFVHVUVTRV9CUkFaSUwgICAgICAgICAgICAgICAgIDB4MDQxNgorI2RlZmluZSBUVF9NU19MQU5HSURfUE9SVFVHVUVTRV9QT1JUVUdBTCAgICAgICAgICAgICAgIDB4MDgxNgorI2RlZmluZSBUVF9NU19MQU5HSURfUkhBRVRPX1JPTUFOSUNfU1dJVFpFUkxBTkQgICAgICAgIDB4MDQxNworI2RlZmluZSBUVF9NU19MQU5HSURfUk9NQU5JQU5fUk9NQU5JQSAgICAgICAgICAgICAgICAgIDB4MDQxOAorI2RlZmluZSBUVF9NU19MQU5HSURfTU9MREFWSUFOX01PTERBVklBICAgICAgICAgICAgICAgIDB4MDgxOAorI2RlZmluZSBUVF9NU19MQU5HSURfUlVTU0lBTl9SVVNTSUEgICAgICAgICAgICAgICAgICAgIDB4MDQxOQorI2RlZmluZSBUVF9NU19MQU5HSURfUlVTU0lBTl9NT0xEQVZJQSAgICAgICAgICAgICAgICAgIDB4MDgxOQorI2RlZmluZSBUVF9NU19MQU5HSURfQ1JPQVRJQU5fQ1JPQVRJQSAgICAgICAgICAgICAgICAgIDB4MDQxQQorI2RlZmluZSBUVF9NU19MQU5HSURfU0VSQklBTl9TRVJCSUFfTEFUSU4gICAgICAgICAgICAgIDB4MDgxQQorI2RlZmluZSBUVF9NU19MQU5HSURfU0VSQklBTl9TRVJCSUFfQ1lSSUxMSUMgICAgICAgICAgIDB4MEMxQQorCisjaWYgMCAgLyogdGhpcyB1c2VkIHRvIGJlIHRoaXMgdmFsdWUsIGJ1dCBpdCBsb29rcyBsaWtlIHdlIHdlcmUgd3JvbmcgKi8KKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0JPU05JQU5fQk9TTklBX0hFUlpFR09WSU5BICAgICAgICAweDEwMUEKKyNlbHNlICAvKiBjdXJyZW50IHNvdXJjZXMgc2F5ICovCisjZGVmaW5lIFRUX01TX0xBTkdJRF9DUk9BVElBTl9CT1NOSUFfSEVSWkVHT1ZJTkEgICAgICAgMHgxMDFBCisjZGVmaW5lIFRUX01TX0xBTkdJRF9CT1NOSUFOX0JPU05JQV9IRVJaRUdPVklOQSAgICAgICAgMHgxNDFBCisgICAgICAgLyogYW5kIFhQc3AyIFBsYXRmb3JtIFNESyBhZGRlZCAoMjAwNC0wNy0yNikgKi8KKyAgICAgICAvKiBOYW1lcyBhcmUgc2hvcnRlbmVkIHRvIGJlIHNpZ25pZmljYW50IHdpdGhpbiA0MCBjaGFycy4gKi8KKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NFUkJJQU5fQk9TTklBX0hFUlpfTEFUSU4gICAgICAgICAweDE4MUEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NFUkJJQU5fQk9TTklBX0hFUlpfQ1lSSUxMSUMgICAgICAweDE4MUEKKyNlbmRpZgorCisjZGVmaW5lIFRUX01TX0xBTkdJRF9TTE9WQUtfU0xPVkFLSUEgICAgICAgICAgICAgICAgICAgMHgwNDFCCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BTEJBTklBTl9BTEJBTklBICAgICAgICAgICAgICAgICAgMHgwNDFDCisjZGVmaW5lIFRUX01TX0xBTkdJRF9TV0VESVNIX1NXRURFTiAgICAgICAgICAgICAgICAgICAgMHgwNDFECisjZGVmaW5lIFRUX01TX0xBTkdJRF9TV0VESVNIX0ZJTkxBTkQgICAgICAgICAgICAgICAgICAgMHgwODFECisjZGVmaW5lIFRUX01TX0xBTkdJRF9USEFJX1RIQUlMQU5EICAgICAgICAgICAgICAgICAgICAgMHgwNDFFCisjZGVmaW5lIFRUX01TX0xBTkdJRF9UVVJLSVNIX1RVUktFWSAgICAgICAgICAgICAgICAgICAgMHgwNDFGCisjZGVmaW5lIFRUX01TX0xBTkdJRF9VUkRVX1BBS0lTVEFOICAgICAgICAgICAgICAgICAgICAgMHgwNDIwCisjZGVmaW5lIFRUX01TX0xBTkdJRF9VUkRVX0lORElBICAgICAgICAgICAgICAgICAgICAgICAgMHgwODIwCisjZGVmaW5lIFRUX01TX0xBTkdJRF9JTkRPTkVTSUFOX0lORE9ORVNJQSAgICAgICAgICAgICAgMHgwNDIxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9VS1JBSU5JQU5fVUtSQUlORSAgICAgICAgICAgICAgICAgMHgwNDIyCisjZGVmaW5lIFRUX01TX0xBTkdJRF9CRUxBUlVTSUFOX0JFTEFSVVMgICAgICAgICAgICAgICAgMHgwNDIzCisjZGVmaW5lIFRUX01TX0xBTkdJRF9TTE9WRU5FX1NMT1ZFTklBICAgICAgICAgICAgICAgICAgMHgwNDI0CisjZGVmaW5lIFRUX01TX0xBTkdJRF9FU1RPTklBTl9FU1RPTklBICAgICAgICAgICAgICAgICAgMHgwNDI1CisjZGVmaW5lIFRUX01TX0xBTkdJRF9MQVRWSUFOX0xBVFZJQSAgICAgICAgICAgICAgICAgICAgMHgwNDI2CisjZGVmaW5lIFRUX01TX0xBTkdJRF9MSVRIVUFOSUFOX0xJVEhVQU5JQSAgICAgICAgICAgICAgMHgwNDI3CisjZGVmaW5lIFRUX01TX0xBTkdJRF9DTEFTU0lDX0xJVEhVQU5JQU5fTElUSFVBTklBICAgICAgMHgwODI3CisjZGVmaW5lIFRUX01TX0xBTkdJRF9UQUpJS19UQUpJS0lTVEFOICAgICAgICAgICAgICAgICAgMHgwNDI4CisjZGVmaW5lIFRUX01TX0xBTkdJRF9GQVJTSV9JUkFOICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDI5CisjZGVmaW5lIFRUX01TX0xBTkdJRF9WSUVUTkFNRVNFX1ZJRVRfTkFNICAgICAgICAgICAgICAgMHgwNDJBCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BUk1FTklBTl9BUk1FTklBICAgICAgICAgICAgICAgICAgMHgwNDJCCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BWkVSSV9BWkVSQkFJSkFOX0xBVElOICAgICAgICAgICAgMHgwNDJDCisjZGVmaW5lIFRUX01TX0xBTkdJRF9BWkVSSV9BWkVSQkFJSkFOX0NZUklMTElDICAgICAgICAgMHgwODJDCisjZGVmaW5lIFRUX01TX0xBTkdJRF9CQVNRVUVfU1BBSU4gICAgICAgICAgICAgICAgICAgICAgMHgwNDJECisjZGVmaW5lIFRUX01TX0xBTkdJRF9TT1JCSUFOX0dFUk1BTlkgICAgICAgICAgICAgICAgICAgMHgwNDJFCisjZGVmaW5lIFRUX01TX0xBTkdJRF9NQUNFRE9OSUFOX01BQ0VET05JQSAgICAgICAgICAgICAgMHgwNDJGCisjZGVmaW5lIFRUX01TX0xBTkdJRF9TVVRVX1NPVVRIX0FGUklDQSAgICAgICAgICAgICAgICAgMHgwNDMwCisjZGVmaW5lIFRUX01TX0xBTkdJRF9UU09OR0FfU09VVEhfQUZSSUNBICAgICAgICAgICAgICAgMHgwNDMxCisjZGVmaW5lIFRUX01TX0xBTkdJRF9UU1dBTkFfU09VVEhfQUZSSUNBICAgICAgICAgICAgICAgMHgwNDMyCisjZGVmaW5lIFRUX01TX0xBTkdJRF9WRU5EQV9TT1VUSF9BRlJJQ0EgICAgICAgICAgICAgICAgMHgwNDMzCisjZGVmaW5lIFRUX01TX0xBTkdJRF9YSE9TQV9TT1VUSF9BRlJJQ0EgICAgICAgICAgICAgICAgMHgwNDM0CisjZGVmaW5lIFRUX01TX0xBTkdJRF9aVUxVX1NPVVRIX0FGUklDQSAgICAgICAgICAgICAgICAgMHgwNDM1CisjZGVmaW5lIFRUX01TX0xBTkdJRF9BRlJJS0FBTlNfU09VVEhfQUZSSUNBICAgICAgICAgICAgMHgwNDM2CisjZGVmaW5lIFRUX01TX0xBTkdJRF9HRU9SR0lBTl9HRU9SR0lBICAgICAgICAgICAgICAgICAgMHgwNDM3CisjZGVmaW5lIFRUX01TX0xBTkdJRF9GQUVST0VTRV9GQUVST0VfSVNMQU5EUyAgICAgICAgICAgMHgwNDM4CisjZGVmaW5lIFRUX01TX0xBTkdJRF9ISU5ESV9JTkRJQSAgICAgICAgICAgICAgICAgICAgICAgMHgwNDM5CisjZGVmaW5lIFRUX01TX0xBTkdJRF9NQUxURVNFX01BTFRBICAgICAgICAgICAgICAgICAgICAgMHgwNDNBCisgIC8qIEFkZGVkIGJ5IFhQc3AyIFBsYXRmb3JtIFNESyAoMjAwNC0wNy0yNikgKi8KKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfTk9SVEhFUk5fTk9SV0FZICAgICAgICAgICAgICAweDA0M0IKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfTk9SVEhFUk5fU1dFREVOICAgICAgICAgICAgICAweDA4M0IKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfTk9SVEhFUk5fRklOTEFORCAgICAgICAgICAgICAweDBDM0IKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfTFVMRV9OT1JXQVkgICAgICAgICAgICAgICAgICAweDEwM0IKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfTFVMRV9TV0VERU4gICAgICAgICAgICAgICAgICAweDE0M0IKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfU09VVEhFUk5fTk9SV0FZICAgICAgICAgICAgICAweDE4M0IKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfU09VVEhFUk5fU1dFREVOICAgICAgICAgICAgICAweDFDM0IKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfU0tPTFRfRklOTEFORCAgICAgICAgICAgICAgICAweDIwM0IKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfSU5BUklfRklOTEFORCAgICAgICAgICAgICAgICAweDI0M0IKKyAgLyogLi4uIGFuZCB3ZSBhbHNvIGtlZXAgb3VyIG9sZCBpZGVudGlmaWVyLi4uICovCisjZGVmaW5lIFRUX01TX0xBTkdJRF9TQUFNSV9MQVBPTklBICAgICAgICAgICAgICAgICAgICAgMHgwNDNCCisKKyNpZiAwIC8qIHRoaXMgc2VlbXMgdG8gYmUgYSBwcmV2aW91cyBpbnZlcnNpb24gKi8KKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0lSSVNIX0dBRUxJQ19JUkVMQU5EICAgICAgICAgICAgICAweDA0M0MKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1NDT1RUSVNIX0dBRUxJQ19VTklURURfS0lOR0RPTSAgICAweDA4M0MKKyNlbHNlCisjZGVmaW5lIFRUX01TX0xBTkdJRF9TQ09UVElTSF9HQUVMSUNfVU5JVEVEX0tJTkdET00gICAgMHgwODNDCisjZGVmaW5lIFRUX01TX0xBTkdJRF9JUklTSF9HQUVMSUNfSVJFTEFORCAgICAgICAgICAgICAgMHgwNDNDCisjZW5kaWYKKworI2RlZmluZSBUVF9NU19MQU5HSURfWUlERElTSF9HRVJNQU5ZICAgICAgICAgICAgICAgICAgIDB4MDQzRAorI2RlZmluZSBUVF9NU19MQU5HSURfTUFMQVlfTUFMQVlTSUEgICAgICAgICAgICAgICAgICAgIDB4MDQzRQorI2RlZmluZSBUVF9NU19MQU5HSURfTUFMQVlfQlJVTkVJX0RBUlVTU0FMQU0gICAgICAgICAgIDB4MDgzRQorI2RlZmluZSBUVF9NU19MQU5HSURfS0FaQUtfS0FaQUtTVEFOICAgICAgICAgICAgICAgICAgIDB4MDQzRgorI2RlZmluZSBUVF9NU19MQU5HSURfS0lSR0hJWl9LSVJHSElaU1RBTiAvKiBDeXJpbGxpYyovIDB4MDQ0MAorICAvKiBhbGlhcyBkZWNsYXJlZCBpbiBXaW5kb3dzIDIwMDAgKi8KKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0tJUkdISVpfS0lSR0hJWl9SRVBVQkxJQyBcCisgICAgICAgICAgVFRfTVNfTEFOR0lEX0tJUkdISVpfS0lSR0hJWlNUQU4KKworI2RlZmluZSBUVF9NU19MQU5HSURfU1dBSElMSV9LRU5ZQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ0MQorI2RlZmluZSBUVF9NU19MQU5HSURfVFVSS01FTl9UVVJLTUVOSVNUQU4gICAgICAgICAgICAgIDB4MDQ0MgorI2RlZmluZSBUVF9NU19MQU5HSURfVVpCRUtfVVpCRUtJU1RBTl9MQVRJTiAgICAgICAgICAgIDB4MDQ0MworI2RlZmluZSBUVF9NU19MQU5HSURfVVpCRUtfVVpCRUtJU1RBTl9DWVJJTExJQyAgICAgICAgIDB4MDg0MworI2RlZmluZSBUVF9NU19MQU5HSURfVEFUQVJfVEFUQVJTVEFOICAgICAgICAgICAgICAgICAgIDB4MDQ0NAorI2RlZmluZSBUVF9NU19MQU5HSURfQkVOR0FMSV9JTkRJQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ0NQorI2RlZmluZSBUVF9NU19MQU5HSURfQkVOR0FMSV9CQU5HTEFERVNIICAgICAgICAgICAgICAgIDB4MDg0NQorI2RlZmluZSBUVF9NU19MQU5HSURfUFVOSkFCSV9JTkRJQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ0NgorI2RlZmluZSBUVF9NU19MQU5HSURfUFVOSkFCSV9BUkFCSUNfUEFLSVNUQU4gICAgICAgICAgIDB4MDg0NgorI2RlZmluZSBUVF9NU19MQU5HSURfR1VKQVJBVElfSU5ESUEgICAgICAgICAgICAgICAgICAgIDB4MDQ0NworI2RlZmluZSBUVF9NU19MQU5HSURfT1JJWUFfSU5ESUEgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ0OAorI2RlZmluZSBUVF9NU19MQU5HSURfVEFNSUxfSU5ESUEgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ0OQorI2RlZmluZSBUVF9NU19MQU5HSURfVEVMVUdVX0lORElBICAgICAgICAgICAgICAgICAgICAgIDB4MDQ0QQorI2RlZmluZSBUVF9NU19MQU5HSURfS0FOTkFEQV9JTkRJQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ0QgorI2RlZmluZSBUVF9NU19MQU5HSURfTUFMQVlBTEFNX0lORElBICAgICAgICAgICAgICAgICAgIDB4MDQ0QworI2RlZmluZSBUVF9NU19MQU5HSURfQVNTQU1FU0VfSU5ESUEgICAgICAgICAgICAgICAgICAgIDB4MDQ0RAorI2RlZmluZSBUVF9NU19MQU5HSURfTUFSQVRISV9JTkRJQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ0RQorI2RlZmluZSBUVF9NU19MQU5HSURfU0FOU0tSSVRfSU5ESUEgICAgICAgICAgICAgICAgICAgIDB4MDQ0RgorI2RlZmluZSBUVF9NU19MQU5HSURfTU9OR09MSUFOX01PTkdPTElBIC8qIEN5cmlsbGljICovIDB4MDQ1MAorI2RlZmluZSBUVF9NU19MQU5HSURfTU9OR09MSUFOX01PTkdPTElBX01PTkdPTElBTiAgICAgIDB4MDg1MAorI2RlZmluZSBUVF9NU19MQU5HSURfVElCRVRBTl9DSElOQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ1MQorICAvKiBEb24ndCB1c2UgdGhlIG5leHQgY29uc3RhbnQhICBJdCBoYXMgICAgICAgICAgICAqLworICAvKiAgICgxKSB0aGUgd3Jvbmcgc3BlbGxpbmcgKER6b25naGthKSAgICAgICAgICAgICAqLworICAvKiAgICgyKSBNaWNyb3NvZnQgZG9lc24ndCBvZmZpY2lhbGx5IGRlZmluZSBpdCAtLSAqLworICAvKiAgICAgICBhdCBsZWFzdCBpdCBpcyBub3QgaW4gdGhlIExpc3Qgb2YgTG9jYWwgICAqLworICAvKiAgICAgICBJRCBWYWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICgzKSBEem9uZ2toYSBpcyBub3QgdGhlIHNhbWUgbGFuZ3VhZ2UgYXMgICAgICAqLworICAvKiAgICAgICBUaWJldGFuLCBzbyBtZXJnaW5nIGl0IGlzIHdyb25nIGFueXdheS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUVF9NU19MQU5HSURfVElCRVRBTl9CSFVUQU4gaXMgY29ycmVjdCwgQlRXLiAgICAqLworI2RlZmluZSBUVF9NU19MQU5HSURfRFpPTkdIS0FfQkhVVEFOICAgICAgICAgICAgICAgICAgIDB4MDg1MQorCisjaWYgMAorICAvKiB0aGUgZm9sbG93aW5nIHVzZWQgdG8gYmUgZGVmaW5lZCAqLworI2RlZmluZSBUVF9NU19MQU5HSURfVElCRVRBTl9CSFVUQU4gICAgICAgICAgICAgICAgICAgIDB4MDQ1MQorICAvKiAuLi4gYnV0IGl0IHdhcyBjaGFuZ2VkOyAqLworI2Vsc2UKKyAgLyogU28gd2Ugd2lsbCBjb250aW51ZSB0byAjZGVmaW5lIGl0LCBidXQgd2l0aCB0aGUgY29ycmVjdCB2YWx1ZSAqLworI2RlZmluZSBUVF9NU19MQU5HSURfVElCRVRBTl9CSFVUQU4gICBUVF9NU19MQU5HSURfRFpPTkdIS0FfQkhVVEFOCisjZW5kaWYKKworI2RlZmluZSBUVF9NU19MQU5HSURfV0VMU0hfV0FMRVMgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ1MgorI2RlZmluZSBUVF9NU19MQU5HSURfS0hNRVJfQ0FNQk9ESUEgICAgICAgICAgICAgICAgICAgIDB4MDQ1MworI2RlZmluZSBUVF9NU19MQU5HSURfTEFPX0xBT1MgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ1NAorI2RlZmluZSBUVF9NU19MQU5HSURfQlVSTUVTRV9NWUFOTUFSICAgICAgICAgICAgICAgICAgIDB4MDQ1NQorI2RlZmluZSBUVF9NU19MQU5HSURfR0FMSUNJQU5fU1BBSU4gICAgICAgICAgICAgICAgICAgIDB4MDQ1NgorI2RlZmluZSBUVF9NU19MQU5HSURfS09OS0FOSV9JTkRJQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ1NworI2RlZmluZSBUVF9NU19MQU5HSURfTUFOSVBVUklfSU5ESUEgIC8qIEJlbmdhbGkgKi8gICAgIDB4MDQ1OAorI2RlZmluZSBUVF9NU19MQU5HSURfU0lOREhJX0lORElBIC8qIEFyYWJpYyAqLyAgICAgICAgIDB4MDQ1OQorI2RlZmluZSBUVF9NU19MQU5HSURfU0lOREhJX1BBS0lTVEFOICAgICAgICAgICAgICAgICAgIDB4MDg1OQorICAvKiBNaXNzaW5nIGEgTENJRCBmb3IgU2luZGhpIGluIERldmFuYWdhcmkgc2NyaXB0ICovCisjZGVmaW5lIFRUX01TX0xBTkdJRF9TWVJJQUNfU1lSSUEgICAgICAgICAgICAgICAgICAgICAgMHgwNDVBCisjZGVmaW5lIFRUX01TX0xBTkdJRF9TSU5IQUxFU0VfU1JJX0xBTktBICAgICAgICAgICAgICAgMHgwNDVCCisjZGVmaW5lIFRUX01TX0xBTkdJRF9DSEVST0tFRV9VTklURURfU1RBVEVTICAgICAgICAgICAgMHgwNDVDCisjZGVmaW5lIFRUX01TX0xBTkdJRF9JTlVLVElUVVRfQ0FOQURBICAgICAgICAgICAgICAgICAgMHgwNDVECisjZGVmaW5lIFRUX01TX0xBTkdJRF9BTUhBUklDX0VUSElPUElBICAgICAgICAgICAgICAgICAgMHgwNDVFCisjZGVmaW5lIFRUX01TX0xBTkdJRF9UQU1BWklHSFRfTU9ST0NDTyAvKiBBcmFiaWMgKi8gICAgMHgwNDVGCisjZGVmaW5lIFRUX01TX0xBTkdJRF9UQU1BWklHSFRfTU9ST0NDT19MQVRJTiAgICAgICAgICAgMHgwODVGCisgIC8qIE1pc3NpbmcgYSBMQ0lEIGZvciBUaWZpbmFnaCBzY3JpcHQgKi8KKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0tBU0hNSVJJX1BBS0lTVEFOIC8qIEFyYWJpYyAqLyAgICAweDA0NjAKKyAgLyogU3BlbGxlZCB0aGlzIHdheSBieSBYUHNwMiBQbGF0Zm9ybSBTREsgKDIwMDQtMDctMjYpICovCisgIC8qIHNjcmlwdCBpcyB5ZXQgdW5jbGVhci4uLiBtaWdodCBiZSBBcmFiaWMsIE5hZ2FyaSBvciBTaGFyYWRhICovCisjZGVmaW5lIFRUX01TX0xBTkdJRF9LQVNITUlSSV9TQVNJQSAgICAgICAgICAgICAgICAgICAgMHgwODYwCisgIC8qIC4uLiBhbmQgYWxpYXNlZCAoYnkgTVMpIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuICovCisjZGVmaW5lIFRUX01TX0xBTkdJRF9LQVNITUlSSV9JTkRJQSBUVF9NU19MQU5HSURfS0FTSE1JUklfU0FTSUEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX05FUEFMSV9ORVBBTCAgICAgICAgICAgICAgICAgICAgICAweDA0NjEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX05FUEFMSV9JTkRJQSAgICAgICAgICAgICAgICAgICAgICAweDA4NjEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSSVNJQU5fTkVUSEVSTEFORFMgICAgICAgICAgICAgICAweDA0NjIKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1BBU0hUT19BRkdIQU5JU1RBTiAgICAgICAgICAgICAgICAweDA0NjMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZJTElQSU5PX1BISUxJUFBJTkVTICAgICAgICAgICAgICAweDA0NjQKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0RISVZFSElfTUFMRElWRVMgICAgICAgICAgICAgICAgICAweDA0NjUKKyAgLyogYWxpYXMgZGVjbGFyZWQgaW4gV2luZG93cyAyMDAwICovCisjZGVmaW5lIFRUX01TX0xBTkdJRF9ESVZFSElfTUFMRElWRVMgIFRUX01TX0xBTkdJRF9ESElWRUhJX01BTERJVkVTCisjZGVmaW5lIFRUX01TX0xBTkdJRF9FRE9fTklHRVJJQSAgICAgICAgICAgICAgICAgICAgICAgMHgwNDY2CisjZGVmaW5lIFRUX01TX0xBTkdJRF9GVUxGVUxERV9OSUdFUklBICAgICAgICAgICAgICAgICAgMHgwNDY3CisjZGVmaW5lIFRUX01TX0xBTkdJRF9IQVVTQV9OSUdFUklBICAgICAgICAgICAgICAgICAgICAgMHgwNDY4CisjZGVmaW5lIFRUX01TX0xBTkdJRF9JQklCSU9fTklHRVJJQSAgICAgICAgICAgICAgICAgICAgMHgwNDY5CisjZGVmaW5lIFRUX01TX0xBTkdJRF9ZT1JVQkFfTklHRVJJQSAgICAgICAgICAgICAgICAgICAgMHgwNDZBCisjZGVmaW5lIFRUX01TX0xBTkdJRF9RVUVDSFVBX0JPTElWSUEgICAgICAgICAgICAgICAgICAgMHgwNDZCCisjZGVmaW5lIFRUX01TX0xBTkdJRF9RVUVDSFVBX0VDVUFET1IgICAgICAgICAgICAgICAgICAgMHgwODZCCisjZGVmaW5lIFRUX01TX0xBTkdJRF9RVUVDSFVBX1BFUlUgICAgICAgICAgICAgICAgICAgICAgMHgwQzZCCisjZGVmaW5lIFRUX01TX0xBTkdJRF9TRVBFRElfU09VVEhfQUZSSUNBICAgICAgICAgICAgICAgMHgwNDZDCisgIC8qIEFsc28gc3BlbGxlZCBieSBYUHNwMiBQbGF0Zm9ybSBTREsgKDIwMDQtMDctMjYpICovCisjZGVmaW5lIFRUX01TX0xBTkdJRF9TT1RIT19TT1VUSEVSTl9TT1VUSF9BRlJJQ0EgXAorICAgICAgICAgIFRUX01TX0xBTkdJRF9TRVBFRElfU09VVEhfQUZSSUNBCisgIC8qIGxhbmd1YWdlIGNvZGVzIDB4MDQ2RCwgMHgwNDZFIGFuZCAweDA0NkYgYXJlIChzdGlsbCkgdW5rbm93bi4gKi8KKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0lHQk9fTklHRVJJQSAgICAgICAgICAgICAgICAgICAgICAweDA0NzAKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX0tBTlVSSV9OSUdFUklBICAgICAgICAgICAgICAgICAgICAweDA0NzEKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX09ST01PX0VUSElPUElBICAgICAgICAgICAgICAgICAgICAweDA0NzIKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1RJR1JJR05BX0VUSElPUElBICAgICAgICAgICAgICAgICAweDA0NzMKKyNkZWZpbmUgVFRfTVNfTEFOR0lEX1RJR1JJR05BX0VSWVRIUkVBICAgICAgICAgICAgICAgICAweDA4NzMKKyAgLyogYWxzbyBzcGVsbGVkIGluIHRoZSBgUGFzc3BvcnQgU0RLJyBsaXN0IGFzOiAqLworI2RlZmluZSBUVF9NU19MQU5HSURfVElHUklHTkFfRVJZVFJFQSAgVFRfTVNfTEFOR0lEX1RJR1JJR05BX0VSWVRIUkVBCisjZGVmaW5lIFRUX01TX0xBTkdJRF9HVUFSQU5JX1BBUkFHVUFZICAgICAgICAgICAgICAgICAgMHgwNDc0CisjZGVmaW5lIFRUX01TX0xBTkdJRF9IQVdBSUlBTl9VTklURURfU1RBVEVTICAgICAgICAgICAgMHgwNDc1CisjZGVmaW5lIFRUX01TX0xBTkdJRF9MQVRJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDc2CisjZGVmaW5lIFRUX01TX0xBTkdJRF9TT01BTElfU09NQUxJQSAgICAgICAgICAgICAgICAgICAgMHgwNDc3CisgIC8qIE5vdGU6IFlpIGRvZXMgbm90IGhhdmUgYSAocHJvcGVyKSBJU08gNjM5LTIgY29kZSwgc2luY2UgaXQgaXMgbW9zdGx5ICovCisgIC8qICAgICAgIG5vdCB3cml0dGVuIChidXQgT1RPSCB0aGUgcGVjdWxpYXIgd3JpdGluZyBzeXN0ZW0gaXMgd29ydGggICAgICovCisgIC8qICAgICAgIHN0dWR5aW5nKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRUX01TX0xBTkdJRF9ZSV9DSElOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDc4CisjZGVmaW5lIFRUX01TX0xBTkdJRF9QQVBJQU1FTlRVX05FVEhFUkxBTkRTX0FOVElMTEVTICAgMHgwNDc5CisgIC8qIGxhbmd1YWdlIGNvZGVzIGZyb20gMHgwNDdBIHRvIDB4MDQ3RiBhcmUgKHN0aWxsKSB1bmtub3duLiAqLworI2RlZmluZSBUVF9NU19MQU5HSURfVUlHSFVSX0NISU5BICAgICAgICAgICAgICAgICAgICAgIDB4MDQ4MAorI2RlZmluZSBUVF9NU19MQU5HSURfTUFPUklfTkVXX1pFQUxBTkQgICAgICAgICAgICAgICAgIDB4MDQ4MQorCisjaWYgMCAgLyogbm90IGRlZW1lZCB1c2VmdWwgZm9yIGZvbnRzICovCisjZGVmaW5lIFRUX01TX0xBTkdJRF9IVU1BTl9JTlRFUkZBQ0VfREVWSUNFICAgICAgICAgICAgMHgwNEZGCisjZW5kaWYKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBgbmFtZScgaWRlbnRpZmllciBmaWVsZCBpbiB0aGUgbmFtZSByZWNvcmRzIG9mICovCisgIC8qIHRoZSBUVEYgYG5hbWUnIHRhYmxlLiAgVGhlc2UgdmFsdWVzIGFyZSBwbGF0Zm9ybSBpbmRlcGVuZGVudC4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFRfTkFNRV9JRF9DT1BZUklHSFQgICAgICAgICAgICAwCisjZGVmaW5lIFRUX05BTUVfSURfRk9OVF9GQU1JTFkgICAgICAgICAgMQorI2RlZmluZSBUVF9OQU1FX0lEX0ZPTlRfU1VCRkFNSUxZICAgICAgIDIKKyNkZWZpbmUgVFRfTkFNRV9JRF9VTklRVUVfSUQgICAgICAgICAgICAzCisjZGVmaW5lIFRUX05BTUVfSURfRlVMTF9OQU1FICAgICAgICAgICAgNAorI2RlZmluZSBUVF9OQU1FX0lEX1ZFUlNJT05fU1RSSU5HICAgICAgIDUKKyNkZWZpbmUgVFRfTkFNRV9JRF9QU19OQU1FICAgICAgICAgICAgICA2CisjZGVmaW5lIFRUX05BTUVfSURfVFJBREVNQVJLICAgICAgICAgICAgNworCisgIC8qIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBmcm9tIHRoZSBPcGVuVHlwZSBzcGVjICovCisjZGVmaW5lIFRUX05BTUVfSURfTUFOVUZBQ1RVUkVSICAgICAgICAgOAorI2RlZmluZSBUVF9OQU1FX0lEX0RFU0lHTkVSICAgICAgICAgICAgIDkKKyNkZWZpbmUgVFRfTkFNRV9JRF9ERVNDUklQVElPTiAgICAgICAgICAxMAorI2RlZmluZSBUVF9OQU1FX0lEX1ZFTkRPUl9VUkwgICAgICAgICAgIDExCisjZGVmaW5lIFRUX05BTUVfSURfREVTSUdORVJfVVJMICAgICAgICAgMTIKKyNkZWZpbmUgVFRfTkFNRV9JRF9MSUNFTlNFICAgICAgICAgICAgICAxMworI2RlZmluZSBUVF9OQU1FX0lEX0xJQ0VOU0VfVVJMICAgICAgICAgIDE0CisgIC8qIG51bWJlciAxNSBpcyByZXNlcnZlZCAqLworI2RlZmluZSBUVF9OQU1FX0lEX1BSRUZFUlJFRF9GQU1JTFkgICAgIDE2CisjZGVmaW5lIFRUX05BTUVfSURfUFJFRkVSUkVEX1NVQkZBTUlMWSAgMTcKKyNkZWZpbmUgVFRfTkFNRV9JRF9NQUNfRlVMTF9OQU1FICAgICAgICAxOAorCisgIC8qIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBuZXcgYXMgb2YgMjAwMC0wMS0yMSAqLworI2RlZmluZSBUVF9OQU1FX0lEX1NBTVBMRV9URVhUICAgICAgICAgIDE5CisKKyAgLyogVGhpcyBpcyBuZXcgaW4gT3BlblR5cGUgMS4zICovCisjZGVmaW5lIFRUX05BTUVfSURfQ0lEX0ZJTkRGT05UX05BTUUgICAgMjAKKworICAvKiBUaGlzIGlzIG5ldyBpbiBPcGVuVHlwZSAxLjUgKi8KKyNkZWZpbmUgVFRfTkFNRV9JRF9XV1NfRkFNSUxZICAgICAgICAgICAyMQorI2RlZmluZSBUVF9OQU1FX0lEX1dXU19TVUJGQU1JTFkgICAgICAgIDIyCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEJpdCBtYXNrIHZhbHVlcyBmb3IgdGhlIFVuaWNvZGUgUmFuZ2VzIGZyb20gdGhlIFRURiBgT1MyICcgdGFibGUuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVXBkYXRlZCAwOC1Ob3YtMjAwOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIC8qIEJpdCAgMCAgIEJhc2ljIExhdGluICovCisjZGVmaW5lIFRUX1VDUl9CQVNJQ19MQVRJTiAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgMCkgLyogVSswMDIwLVUrMDA3RSAqLworICAvKiBCaXQgIDEgICBDMSBDb250cm9scyBhbmQgTGF0aW4tMSBTdXBwbGVtZW50ICovCisjZGVmaW5lIFRUX1VDUl9MQVRJTjFfU1VQUExFTUVOVCAgICAgICAgICAgICAgICgxTCA8PCAgMSkgLyogVSswMDgwLVUrMDBGRiAqLworICAvKiBCaXQgIDIgICBMYXRpbiBFeHRlbmRlZC1BICovCisjZGVmaW5lIFRUX1VDUl9MQVRJTl9FWFRFTkRFRF9BICAgICAgICAgICAgICAgICgxTCA8PCAgMikgLyogVSswMTAwLVUrMDE3RiAqLworICAvKiBCaXQgIDMgICBMYXRpbiBFeHRlbmRlZC1CICovCisjZGVmaW5lIFRUX1VDUl9MQVRJTl9FWFRFTkRFRF9CICAgICAgICAgICAgICAgICgxTCA8PCAgMykgLyogVSswMTgwLVUrMDI0RiAqLworICAvKiBCaXQgIDQgICBJUEEgRXh0ZW5zaW9ucyAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgUGhvbmV0aWMgRXh0ZW5zaW9ucyAgICAgICAgICAgICovCisgIC8qICAgICAgICAgIFBob25ldGljIEV4dGVuc2lvbnMgU3VwcGxlbWVudCAqLworI2RlZmluZSBUVF9VQ1JfSVBBX0VYVEVOU0lPTlMgICAgICAgICAgICAgICAgICAoMUwgPDwgIDQpIC8qIFUrMDI1MC1VKzAyQUYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzFEMDAtVSsxRDdGICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsxRDgwLVUrMURCRiAqLworICAvKiBCaXQgIDUgICBTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMgKi8KKyAgLyogICAgICAgICAgTW9kaWZpZXIgVG9uZSBMZXR0ZXJzICAgICovCisjZGVmaW5lIFRUX1VDUl9TUEFDSU5HX01PRElGSUVSICAgICAgICAgICAgICAgICgxTCA8PCAgNSkgLyogVSswMkIwLVUrMDJGRiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrQTcwMC1VK0E3MUYgKi8KKyAgLyogQml0ICA2ICAgQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzIFN1cHBsZW1lbnQgKi8KKyNkZWZpbmUgVFRfVUNSX0NPTUJJTklOR19ESUFDUklUSUNTICAgICAgICAgICAgKDFMIDw8ICA2KSAvKiBVKzAzMDAtVSswMzZGICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsxREMwLVUrMURGRiAqLworICAvKiBCaXQgIDcgICBHcmVlayBhbmQgQ29wdGljICovCisjZGVmaW5lIFRUX1VDUl9HUkVFSyAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgNykgLyogVSswMzcwLVUrMDNGRiAqLworICAvKiBCaXQgIDggICBDb3B0aWMgKi8KKyNkZWZpbmUgVFRfVUNSX0NPUFRJQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA4KSAvKiBVKzJDODAtVSsyQ0ZGICovCisgIC8qIEJpdCAgOSAgIEN5cmlsbGljICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgQ3lyaWxsaWMgU3VwcGxlbWVudCAqLworICAvKiAgICAgICAgICBDeXJpbGxpYyBFeHRlbmRlZC1BICovCisgIC8qICAgICAgICAgIEN5cmlsbGljIEV4dGVuZGVkLUIgKi8KKyNkZWZpbmUgVFRfVUNSX0NZUklMTElDICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA5KSAvKiBVKzA0MDAtVSswNEZGICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSswNTAwLVUrMDUyRiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMkRFMC1VKzJERkYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVK0E2NDAtVStBNjlGICovCisgIC8qIEJpdCAxMCAgIEFybWVuaWFuICovCisjZGVmaW5lIFRUX1VDUl9BUk1FTklBTiAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxMCkgLyogVSswNTMwLVUrMDU4RiAqLworICAvKiBCaXQgMTEgICBIZWJyZXcgKi8KKyNkZWZpbmUgVFRfVUNSX0hFQlJFVyAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDExKSAvKiBVKzA1OTAtVSswNUZGICovCisgIC8qIEJpdCAxMiAgIFZhaSAqLworI2RlZmluZSBUVF9VQ1JfVkFJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTIpIC8qIFUrQTUwMC1VK0E2M0YgKi8KKyAgLyogQml0IDEzICAgQXJhYmljICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgQXJhYmljIFN1cHBsZW1lbnQgKi8KKyNkZWZpbmUgVFRfVUNSX0FSQUJJQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDEzKSAvKiBVKzA2MDAtVSswNkZGICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSswNzUwLVUrMDc3RiAqLworICAvKiBCaXQgMTQgICBOS28gKi8KKyNkZWZpbmUgVFRfVUNSX05LTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE0KSAvKiBVKzA3QzAtVSswN0ZGICovCisgIC8qIEJpdCAxNSAgIERldmFuYWdhcmkgKi8KKyNkZWZpbmUgVFRfVUNSX0RFVkFOQUdBUkkgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE1KSAvKiBVKzA5MDAtVSswOTdGICovCisgIC8qIEJpdCAxNiAgIEJlbmdhbGkgKi8KKyNkZWZpbmUgVFRfVUNSX0JFTkdBTEkgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE2KSAvKiBVKzA5ODAtVSswOUZGICovCisgIC8qIEJpdCAxNyAgIEd1cm11a2hpICovCisjZGVmaW5lIFRUX1VDUl9HVVJNVUtISSAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxNykgLyogVSswQTAwLVUrMEE3RiAqLworICAvKiBCaXQgMTggICBHdWphcmF0aSAqLworI2RlZmluZSBUVF9VQ1JfR1VKQVJBVEkgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTgpIC8qIFUrMEE4MC1VKzBBRkYgKi8KKyAgLyogQml0IDE5ICAgT3JpeWEgKi8KKyNkZWZpbmUgVFRfVUNSX09SSVlBICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE5KSAvKiBVKzBCMDAtVSswQjdGICovCisgIC8qIEJpdCAyMCAgIFRhbWlsICovCisjZGVmaW5lIFRUX1VDUl9UQU1JTCAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMCkgLyogVSswQjgwLVUrMEJGRiAqLworICAvKiBCaXQgMjEgICBUZWx1Z3UgKi8KKyNkZWZpbmUgVFRfVUNSX1RFTFVHVSAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDIxKSAvKiBVKzBDMDAtVSswQzdGICovCisgIC8qIEJpdCAyMiAgIEthbm5hZGEgKi8KKyNkZWZpbmUgVFRfVUNSX0tBTk5BREEgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDIyKSAvKiBVKzBDODAtVSswQ0ZGICovCisgIC8qIEJpdCAyMyAgIE1hbGF5YWxhbSAqLworI2RlZmluZSBUVF9VQ1JfTUFMQVlBTEFNICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjMpIC8qIFUrMEQwMC1VKzBEN0YgKi8KKyAgLyogQml0IDI0ICAgVGhhaSAqLworI2RlZmluZSBUVF9VQ1JfVEhBSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjQpIC8qIFUrMEUwMC1VKzBFN0YgKi8KKyAgLyogQml0IDI1ICAgTGFvICovCisjZGVmaW5lIFRUX1VDUl9MQU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyNSkgLyogVSswRTgwLVUrMEVGRiAqLworICAvKiBCaXQgMjYgICBHZW9yZ2lhbiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgIEdlb3JnaWFuIFN1cHBsZW1lbnQgKi8KKyNkZWZpbmUgVFRfVUNSX0dFT1JHSUFOICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI2KSAvKiBVKzEwQTAtVSsxMEZGICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsyRDAwLVUrMkQyRiAqLworICAvKiBCaXQgMjcgICBCYWxpbmVzZSAqLworI2RlZmluZSBUVF9VQ1JfQkFMSU5FU0UgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjcpIC8qIFUrMUIwMC1VKzFCN0YgKi8KKyAgLyogQml0IDI4ICAgSGFuZ3VsIEphbW8gKi8KKyNkZWZpbmUgVFRfVUNSX0hBTkdVTF9KQU1PICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI4KSAvKiBVKzExMDAtVSsxMUZGICovCisgIC8qIEJpdCAyOSAgIExhdGluIEV4dGVuZGVkIEFkZGl0aW9uYWwgKi8KKyAgLyogICAgICAgICAgTGF0aW4gRXh0ZW5kZWQtQyAgICAgICAgICAqLworICAvKiAgICAgICAgICBMYXRpbiBFeHRlbmRlZC1EICAgICAgICAgICovCisjZGVmaW5lIFRUX1VDUl9MQVRJTl9FWFRFTkRFRF9BRERJVElPTkFMICAgICAgICgxTCA8PCAyOSkgLyogVSsxRTAwLVUrMUVGRiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMkM2MC1VKzJDN0YgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVK0E3MjAtVStBN0ZGICovCisgIC8qIEJpdCAzMCAgIEdyZWVrIEV4dGVuZGVkICovCisjZGVmaW5lIFRUX1VDUl9HUkVFS19FWFRFTkRFRCAgICAgICAgICAgICAgICAgICgxTCA8PCAzMCkgLyogVSsxRjAwLVUrMUZGRiAqLworICAvKiBCaXQgMzEgICBHZW5lcmFsIFB1bmN0dWF0aW9uICAgICAgKi8KKyAgLyogICAgICAgICAgU3VwcGxlbWVudGFsIFB1bmN0dWF0aW9uICovCisjZGVmaW5lIFRUX1VDUl9HRU5FUkFMX1BVTkNUVUFUSU9OICAgICAgICAgICAgICgxTCA8PCAzMSkgLyogVSsyMDAwLVUrMjA2RiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMkUwMC1VKzJFN0YgKi8KKyAgLyogQml0IDMyICAgU3VwZXJzY3JpcHRzIEFuZCBTdWJzY3JpcHRzICovCisjZGVmaW5lIFRUX1VDUl9TVVBFUlNDUklQVFNfU1VCU0NSSVBUUyAgICAgICAgICgxTCA8PCAgMCkgLyogVSsyMDcwLVUrMjA5RiAqLworICAvKiBCaXQgMzMgICBDdXJyZW5jeSBTeW1ib2xzICovCisjZGVmaW5lIFRUX1VDUl9DVVJSRU5DWV9TWU1CT0xTICAgICAgICAgICAgICAgICgxTCA8PCAgMSkgLyogVSsyMEEwLVUrMjBDRiAqLworICAvKiBCaXQgMzQgICBDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3MgRm9yIFN5bWJvbHMgKi8KKyNkZWZpbmUgVFRfVUNSX0NPTUJJTklOR19ESUFDUklUSUNTX1NZTUIgICAgICAgKDFMIDw8ICAyKSAvKiBVKzIwRDAtVSsyMEZGICovCisgIC8qIEJpdCAzNSAgIExldHRlcmxpa2UgU3ltYm9scyAqLworI2RlZmluZSBUVF9VQ1JfTEVUVEVSTElLRV9TWU1CT0xTICAgICAgICAgICAgICAoMUwgPDwgIDMpIC8qIFUrMjEwMC1VKzIxNEYgKi8KKyAgLyogQml0IDM2ICAgTnVtYmVyIEZvcm1zICovCisjZGVmaW5lIFRUX1VDUl9OVU1CRVJfRk9STVMgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgNCkgLyogVSsyMTUwLVUrMjE4RiAqLworICAvKiBCaXQgMzcgICBBcnJvd3MgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICBTdXBwbGVtZW50YWwgQXJyb3dzLUEgICAgICAgICAgICAqLworICAvKiAgICAgICAgICBTdXBwbGVtZW50YWwgQXJyb3dzLUIgICAgICAgICAgICAqLworICAvKiAgICAgICAgICBNaXNjZWxsYW5lb3VzIFN5bWJvbHMgYW5kIEFycm93cyAqLworI2RlZmluZSBUVF9VQ1JfQVJST1dTICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDUpIC8qIFUrMjE5MC1VKzIxRkYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzI3RjAtVSsyN0ZGICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsyOTAwLVUrMjk3RiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMkIwMC1VKzJCRkYgKi8KKyAgLyogQml0IDM4ICAgTWF0aGVtYXRpY2FsIE9wZXJhdG9ycyAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgIFN1cHBsZW1lbnRhbCBNYXRoZW1hdGljYWwgT3BlcmF0b3JzICAqLworICAvKiAgICAgICAgICBNaXNjZWxsYW5lb3VzIE1hdGhlbWF0aWNhbCBTeW1ib2xzLUEgKi8KKyAgLyogICAgICAgICAgTWlzY2VsbGFuZW91cyBNYXRoZW1hdGljYWwgU3ltYm9scy1CICovCisjZGVmaW5lIFRUX1VDUl9NQVRIRU1BVElDQUxfT1BFUkFUT1JTICAgICAgICAgICgxTCA8PCAgNikgLyogVSsyMjAwLVUrMjJGRiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMkEwMC1VKzJBRkYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzI3QzAtVSsyN0VGICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsyOTgwLVUrMjlGRiAqLworICAvKiBCaXQgMzkgTWlzY2VsbGFuZW91cyBUZWNobmljYWwgKi8KKyNkZWZpbmUgVFRfVUNSX01JU0NFTExBTkVPVVNfVEVDSE5JQ0FMICAgICAgICAgKDFMIDw8ICA3KSAvKiBVKzIzMDAtVSsyM0ZGICovCisgIC8qIEJpdCA0MCAgIENvbnRyb2wgUGljdHVyZXMgKi8KKyNkZWZpbmUgVFRfVUNSX0NPTlRST0xfUElDVFVSRVMgICAgICAgICAgICAgICAgKDFMIDw8ICA4KSAvKiBVKzI0MDAtVSsyNDNGICovCisgIC8qIEJpdCA0MSAgIE9wdGljYWwgQ2hhcmFjdGVyIFJlY29nbml0aW9uICovCisjZGVmaW5lIFRUX1VDUl9PQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgOSkgLyogVSsyNDQwLVUrMjQ1RiAqLworICAvKiBCaXQgNDIgICBFbmNsb3NlZCBBbHBoYW51bWVyaWNzICovCisjZGVmaW5lIFRUX1VDUl9FTkNMT1NFRF9BTFBIQU5VTUVSSUNTICAgICAgICAgICgxTCA8PCAxMCkgLyogVSsyNDYwLVUrMjRGRiAqLworICAvKiBCaXQgNDMgICBCb3ggRHJhd2luZyAqLworI2RlZmluZSBUVF9VQ1JfQk9YX0RSQVdJTkcgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTEpIC8qIFUrMjUwMC1VKzI1N0YgKi8KKyAgLyogQml0IDQ0ICAgQmxvY2sgRWxlbWVudHMgKi8KKyNkZWZpbmUgVFRfVUNSX0JMT0NLX0VMRU1FTlRTICAgICAgICAgICAgICAgICAgKDFMIDw8IDEyKSAvKiBVKzI1ODAtVSsyNTlGICovCisgIC8qIEJpdCA0NSAgIEdlb21ldHJpYyBTaGFwZXMgKi8KKyNkZWZpbmUgVFRfVUNSX0dFT01FVFJJQ19TSEFQRVMgICAgICAgICAgICAgICAgKDFMIDw8IDEzKSAvKiBVKzI1QTAtVSsyNUZGICovCisgIC8qIEJpdCA0NiAgIE1pc2NlbGxhbmVvdXMgU3ltYm9scyAqLworI2RlZmluZSBUVF9VQ1JfTUlTQ0VMTEFORU9VU19TWU1CT0xTICAgICAgICAgICAoMUwgPDwgMTQpIC8qIFUrMjYwMC1VKzI2RkYgKi8KKyAgLyogQml0IDQ3ICAgRGluZ2JhdHMgKi8KKyNkZWZpbmUgVFRfVUNSX0RJTkdCQVRTICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE1KSAvKiBVKzI3MDAtVSsyN0JGICovCisgIC8qIEJpdCA0OCAgIENKSyBTeW1ib2xzIGFuZCBQdW5jdHVhdGlvbiAqLworI2RlZmluZSBUVF9VQ1JfQ0pLX1NZTUJPTFMgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTYpIC8qIFUrMzAwMC1VKzMwM0YgKi8KKyAgLyogQml0IDQ5ICAgSGlyYWdhbmEgKi8KKyNkZWZpbmUgVFRfVUNSX0hJUkFHQU5BICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE3KSAvKiBVKzMwNDAtVSszMDlGICovCisgIC8qIEJpdCA1MCAgIEthdGFrYW5hICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgS2F0YWthbmEgUGhvbmV0aWMgRXh0ZW5zaW9ucyAqLworI2RlZmluZSBUVF9VQ1JfS0FUQUtBTkEgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTgpIC8qIFUrMzBBMC1VKzMwRkYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzMxRjAtVSszMUZGICovCisgIC8qIEJpdCA1MSAgIEJvcG9tb2ZvICAgICAgICAgICovCisgIC8qICAgICAgICAgIEJvcG9tb2ZvIEV4dGVuZGVkICovCisjZGVmaW5lIFRUX1VDUl9CT1BPTU9GTyAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxOSkgLyogVSszMTAwLVUrMzEyRiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMzFBMC1VKzMxQkYgKi8KKyAgLyogQml0IDUyICAgSGFuZ3VsIENvbXBhdGliaWxpdHkgSmFtbyAqLworI2RlZmluZSBUVF9VQ1JfSEFOR1VMX0NPTVBBVElCSUxJVFlfSkFNTyAgICAgICAoMUwgPDwgMjApIC8qIFUrMzEzMC1VKzMxOEYgKi8KKyAgLyogQml0IDUzICAgUGhhZ3MtUGEgKi8KKyNkZWZpbmUgVFRfVUNSX0NKS19NSVNDICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDIxKSAvKiBVK0E4NDAtVStBODdGICovCisjZGVmaW5lIFRUX1VDUl9LQU5CVU4gIFRUX1VDUl9DSktfTUlTQyAvKiBkZXByZWNhdGVkICovCisjZGVmaW5lIFRUX1VDUl9QSEFHU1BBCisgIC8qIEJpdCA1NCAgIEVuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHMgKi8KKyNkZWZpbmUgVFRfVUNSX0VOQ0xPU0VEX0NKS19MRVRURVJTX01PTlRIUyAgICAgKDFMIDw8IDIyKSAvKiBVKzMyMDAtVSszMkZGICovCisgIC8qIEJpdCA1NSAgIENKSyBDb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFRUX1VDUl9DSktfQ09NUEFUSUJJTElUWSAgICAgICAgICAgICAgICgxTCA8PCAyMykgLyogVSszMzAwLVUrMzNGRiAqLworICAvKiBCaXQgNTYgICBIYW5ndWwgU3lsbGFibGVzICovCisjZGVmaW5lIFRUX1VDUl9IQU5HVUwgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyNCkgLyogVStBQzAwLVUrRDdBMyAqLworICAvKiBCaXQgNTcgICBIaWdoIFN1cnJvZ2F0ZXMgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgIEhpZ2ggUHJpdmF0ZSBVc2UgU3Vycm9nYXRlcyAgKi8KKyAgLyogICAgICAgICAgTG93IFN1cnJvZ2F0ZXMgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEFjY29yZGluZyB0byBPcGVuVHlwZSBzcGVjcyB2LjEuMyssICAgKi8KKyAgLyogc2V0dGluZyBiaXQgNTcgaW1wbGllcyB0aGF0IHRoZXJlIGlzICAqLworICAvKiBhdCBsZWFzdCBvbmUgY29kZXBvaW50IGJleW9uZCB0aGUgICAgICovCisgIC8qIEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZSB0aGF0IGlzICAgICAgKi8KKyAgLyogc3VwcG9ydGVkIGJ5IHRoaXMgZm9udC4gIFNvIGl0IHJlYWxseSAqLworICAvKiBtZWFucyA+PSBVKzEwMDAwICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRUX1VDUl9TVVJST0dBVEVTICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyNSkgLyogVStEODAwLVUrREI3RiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrREI4MC1VK0RCRkYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVK0RDMDAtVStERkZGICovCisjZGVmaW5lIFRUX1VDUl9OT05fUExBTkVfMCAgVFRfVUNSX1NVUlJPR0FURVMKKyAgLyogQml0IDU4ICBQaG9lbmljaWFuICovCisjZGVmaW5lIFRUX1VDUl9QSE9FTklDSUFOICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyNikgLypVKzEwOTAwLVUrMTA5MUYqLworICAvKiBCaXQgNTkgICBDSksgVW5pZmllZCBJZGVvZ3JhcGhzICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgIENKSyBSYWRpY2FscyBTdXBwbGVtZW50ICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgS2FuZ3hpIFJhZGljYWxzICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICBJZGVvZ3JhcGhpYyBEZXNjcmlwdGlvbiBDaGFyYWN0ZXJzICovCisgIC8qICAgICAgICAgIENKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEEgKi8KKyAgLyogICAgICAgICAgQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQiAqLworICAvKiAgICAgICAgICBLYW5idW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRUX1VDUl9DSktfVU5JRklFRF9JREVPR1JBUEhTICAgICAgICAgICgxTCA8PCAyNykgLyogVSs0RTAwLVUrOUZGRiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMkU4MC1VKzJFRkYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzJGMDAtVSsyRkRGICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsyRkYwLVUrMkZGRiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMzQwMC1VKzREQjUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlUrMjAwMDAtVSsyQTZERiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSszMTkwLVUrMzE5RiAqLworICAvKiBCaXQgNjAgICBQcml2YXRlIFVzZSAqLworI2RlZmluZSBUVF9VQ1JfUFJJVkFURV9VU0UgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjgpIC8qIFUrRTAwMC1VK0Y4RkYgKi8KKyAgLyogQml0IDYxICAgQ0pLIFN0cm9rZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgIENKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMgICAgICAgICAgICAqLworICAvKiAgICAgICAgICBDSksgQ29tcGF0aWJpbGl0eSBJZGVvZ3JhcGhzIFN1cHBsZW1lbnQgKi8KKyNkZWZpbmUgVFRfVUNSX0NKS19DT01QQVRJQklMSVRZX0lERU9HUkFQSFMgICAgKDFMIDw8IDI5KSAvKiBVKzMxQzAtVSszMUVGICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVStGOTAwLVUrRkFGRiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVSsyRjgwMC1VKzJGQTFGKi8KKyAgLyogQml0IDYyICAgQWxwaGFiZXRpYyBQcmVzZW50YXRpb24gRm9ybXMgKi8KKyNkZWZpbmUgVFRfVUNSX0FMUEhBQkVUSUNfUFJFU0VOVEFUSU9OX0ZPUk1TICAgKDFMIDw8IDMwKSAvKiBVK0ZCMDAtVStGQjRGICovCisgIC8qIEJpdCA2MyAgIEFyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQSAqLworI2RlZmluZSBUVF9VQ1JfQVJBQklDX1BSRVNFTlRBVElPTlNfQSAgICAgICAgICAoMUwgPDwgMzEpIC8qIFUrRkI1MC1VK0ZERkYgKi8KKyAgLyogQml0IDY0ICAgQ29tYmluaW5nIEhhbGYgTWFya3MgKi8KKyNkZWZpbmUgVFRfVUNSX0NPTUJJTklOR19IQUxGX01BUktTICAgICAgICAgICAgKDFMIDw8ICAwKSAvKiBVK0ZFMjAtVStGRTJGICovCisgIC8qIEJpdCA2NSAgIFZlcnRpY2FsIGZvcm1zICAgICAgICAgICovCisgIC8qICAgICAgICAgIENKSyBDb21wYXRpYmlsaXR5IEZvcm1zICovCisjZGVmaW5lIFRUX1VDUl9DSktfQ09NUEFUSUJJTElUWV9GT1JNUyAgICAgICAgICgxTCA8PCAgMSkgLyogVStGRTEwLVUrRkUxRiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrRkUzMC1VK0ZFNEYgKi8KKyAgLyogQml0IDY2ICAgU21hbGwgRm9ybSBWYXJpYW50cyAqLworI2RlZmluZSBUVF9VQ1JfU01BTExfRk9STV9WQVJJQU5UUyAgICAgICAgICAgICAoMUwgPDwgIDIpIC8qIFUrRkU1MC1VK0ZFNkYgKi8KKyAgLyogQml0IDY3ICAgQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1CICovCisjZGVmaW5lIFRUX1VDUl9BUkFCSUNfUFJFU0VOVEFUSU9OU19CICAgICAgICAgICgxTCA8PCAgMykgLyogVStGRTcwLVUrRkVGRSAqLworICAvKiBCaXQgNjggICBIYWxmd2lkdGggYW5kIEZ1bGx3aWR0aCBGb3JtcyAqLworI2RlZmluZSBUVF9VQ1JfSEFMRldJRFRIX0ZVTExXSURUSF9GT1JNUyAgICAgICAoMUwgPDwgIDQpIC8qIFUrRkYwMC1VK0ZGRUYgKi8KKyAgLyogQml0IDY5ICAgU3BlY2lhbHMgKi8KKyNkZWZpbmUgVFRfVUNSX1NQRUNJQUxTICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA1KSAvKiBVK0ZGRjAtVStGRkZEICovCisgIC8qIEJpdCA3MCAgIFRpYmV0YW4gKi8KKyNkZWZpbmUgVFRfVUNSX1RJQkVUQU4gICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA2KSAvKiBVKzBGMDAtVSswRkZGICovCisgIC8qIEJpdCA3MSAgIFN5cmlhYyAqLworI2RlZmluZSBUVF9VQ1JfU1lSSUFDICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDcpIC8qIFUrMDcwMC1VKzA3NEYgKi8KKyAgLyogQml0IDcyICAgVGhhYW5hICovCisjZGVmaW5lIFRUX1VDUl9USEFBTkEgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgOCkgLyogVSswNzgwLVUrMDdCRiAqLworICAvKiBCaXQgNzMgICBTaW5oYWxhICovCisjZGVmaW5lIFRUX1VDUl9TSU5IQUxBICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgOSkgLyogVSswRDgwLVUrMERGRiAqLworICAvKiBCaXQgNzQgICBNeWFubWFyICovCisjZGVmaW5lIFRUX1VDUl9NWUFOTUFSICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxMCkgLyogVSsxMDAwLVUrMTA5RiAqLworICAvKiBCaXQgNzUgICBFdGhpb3BpYyAgICAgICAgICAgICovCisgIC8qICAgICAgICAgIEV0aGlvcGljIFN1cHBsZW1lbnQgKi8KKyAgLyogICAgICAgICAgRXRoaW9waWMgRXh0ZW5kZWQgICAqLworI2RlZmluZSBUVF9VQ1JfRVRISU9QSUMgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTEpIC8qIFUrMTIwMC1VKzEzN0YgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzEzODAtVSsxMzlGICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsyRDgwLVUrMkRERiAqLworICAvKiBCaXQgNzYgICBDaGVyb2tlZSAqLworI2RlZmluZSBUVF9VQ1JfQ0hFUk9LRUUgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTIpIC8qIFUrMTNBMC1VKzEzRkYgKi8KKyAgLyogQml0IDc3ICAgVW5pZmllZCBDYW5hZGlhbiBBYm9yaWdpbmFsIFN5bGxhYmljcyAqLworI2RlZmluZSBUVF9VQ1JfQ0FOQURJQU5fQUJPUklHSU5BTF9TWUxMQUJJQ1MgICAoMUwgPDwgMTMpIC8qIFUrMTQwMC1VKzE2N0YgKi8KKyAgLyogQml0IDc4ICAgT2doYW0gKi8KKyNkZWZpbmUgVFRfVUNSX09HSEFNICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE0KSAvKiBVKzE2ODAtVSsxNjlGICovCisgIC8qIEJpdCA3OSAgIFJ1bmljICovCisjZGVmaW5lIFRUX1VDUl9SVU5JQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxNSkgLyogVSsxNkEwLVUrMTZGRiAqLworICAvKiBCaXQgODAgICBLaG1lciAgICAgICAgICovCisgIC8qICAgICAgICAgIEtobWVyIFN5bWJvbHMgKi8KKyNkZWZpbmUgVFRfVUNSX0tITUVSICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE2KSAvKiBVKzE3ODAtVSsxN0ZGICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsxOUUwLVUrMTlGRiAqLworICAvKiBCaXQgODEgICBNb25nb2xpYW4gKi8KKyNkZWZpbmUgVFRfVUNSX01PTkdPTElBTiAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE3KSAvKiBVKzE4MDAtVSsxOEFGICovCisgIC8qIEJpdCA4MiAgIEJyYWlsbGUgUGF0dGVybnMgKi8KKyNkZWZpbmUgVFRfVUNSX0JSQUlMTEUgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE4KSAvKiBVKzI4MDAtVSsyOEZGICovCisgIC8qIEJpdCA4MyAgIFlpIFN5bGxhYmxlcyAqLworICAvKiAgICAgICAgICBZaSBSYWRpY2FscyAgKi8KKyNkZWZpbmUgVFRfVUNSX1lJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE5KSAvKiBVK0EwMDAtVStBNDhGICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVStBNDkwLVUrQTRDRiAqLworICAvKiBCaXQgODQgICBUYWdhbG9nICAqLworICAvKiAgICAgICAgICBIYW51bm9vICAqLworICAvKiAgICAgICAgICBCdWhpZCAgICAqLworICAvKiAgICAgICAgICBUYWdiYW53YSAqLworI2RlZmluZSBUVF9VQ1JfUEhJTElQUElORSAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjApIC8qIFUrMTcwMC1VKzE3MUYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzE3MjAtVSsxNzNGICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsxNzQwLVUrMTc1RiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMTc2MC1VKzE3N0YgKi8KKyAgLyogQml0IDg1ICAgT2xkIEl0YWxpYyAqLworI2RlZmluZSBUVF9VQ1JfT0xEX0lUQUxJQyAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjEpIC8qVSsxMDMwMC1VKzEwMzJGKi8KKyAgLyogQml0IDg2ICAgR290aGljICovCisjZGVmaW5lIFRUX1VDUl9HT1RISUMgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMikgLypVKzEwMzMwLVUrMTAzNEYqLworICAvKiBCaXQgODcgICBEZXNlcmV0ICovCisjZGVmaW5lIFRUX1VDUl9ERVNFUkVUICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMykgLypVKzEwNDAwLVUrMTA0NEYqLworICAvKiBCaXQgODggICBCeXphbnRpbmUgTXVzaWNhbCBTeW1ib2xzICAgICAgKi8KKyAgLyogICAgICAgICAgTXVzaWNhbCBTeW1ib2xzICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgIEFuY2llbnQgR3JlZWsgTXVzaWNhbCBOb3RhdGlvbiAqLworI2RlZmluZSBUVF9VQ1JfTVVTSUNBTF9TWU1CT0xTICAgICAgICAgICAgICAgICAoMUwgPDwgMjQpIC8qVSsxRDAwMC1VKzFEMEZGKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlUrMUQxMDAtVSsxRDFGRiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypVKzFEMjAwLVUrMUQyNEYqLworICAvKiBCaXQgODkgICBNYXRoZW1hdGljYWwgQWxwaGFudW1lcmljIFN5bWJvbHMgKi8KKyNkZWZpbmUgVFRfVUNSX01BVEhfQUxQSEFOVU1FUklDX1NZTUJPTFMgICAgICAgKDFMIDw8IDI1KSAvKlUrMUQ0MDAtVSsxRDdGRiovCisgIC8qIEJpdCA5MCAgIFByaXZhdGUgVXNlIChwbGFuZSAxNSkgKi8KKyAgLyogICAgICAgICAgUHJpdmF0ZSBVc2UgKHBsYW5lIDE2KSAqLworI2RlZmluZSBUVF9VQ1JfUFJJVkFURV9VU0VfU1VQUExFTUVOVEFSWSAgICAgICAoMUwgPDwgMjYpIC8qVStGMDAwMC1VK0ZGRkZEKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypVKzEwMDAwMC1VKzEwRkZGRCovCisgIC8qIEJpdCA5MSAgIFZhcmlhdGlvbiBTZWxlY3RvcnMgICAgICAgICAgICAqLworICAvKiAgICAgICAgICBWYXJpYXRpb24gU2VsZWN0b3JzIFN1cHBsZW1lbnQgKi8KKyNkZWZpbmUgVFRfVUNSX1ZBUklBVElPTl9TRUxFQ1RPUlMgICAgICAgICAgICAgKDFMIDw8IDI3KSAvKiBVK0ZFMDAtVStGRTBGICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypVK0UwMTAwLVUrRTAxRUYqLworICAvKiBCaXQgOTIgICBUYWdzICovCisjZGVmaW5lIFRUX1VDUl9UQUdTICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyOCkgLypVK0UwMDAwLVUrRTAwN0YqLworICAvKiBCaXQgOTMgICBMaW1idSAqLworI2RlZmluZSBUVF9VQ1JfTElNQlUgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjkpIC8qIFUrMTkwMC1VKzE5NEYgKi8KKyAgLyogQml0IDk0ICAgVGFpIExlICovCisjZGVmaW5lIFRUX1VDUl9UQUlfTEUgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAzMCkgLyogVSsxOTUwLVUrMTk3RiAqLworICAvKiBCaXQgOTUgICBOZXcgVGFpIEx1ZSAqLworI2RlZmluZSBUVF9VQ1JfTkVXX1RBSV9MVUUgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMzEpIC8qIFUrMTk4MC1VKzE5REYgKi8KKyAgLyogQml0IDk2ICAgQnVnaW5lc2UgKi8KKyNkZWZpbmUgVFRfVUNSX0JVR0lORVNFICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICAwKSAvKiBVKzFBMDAtVSsxQTFGICovCisgIC8qIEJpdCA5NyAgIEdsYWdvbGl0aWMgKi8KKyNkZWZpbmUgVFRfVUNSX0dMQUdPTElUSUMgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICAxKSAvKiBVKzJDMDAtVSsyQzVGICovCisgIC8qIEJpdCA5OCAgIFRpZmluYWdoICovCisjZGVmaW5lIFRUX1VDUl9USUZJTkFHSCAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgMikgLyogVSsyRDMwLVUrMkQ3RiAqLworICAvKiBCaXQgOTkgICBZaWppbmcgSGV4YWdyYW0gU3ltYm9scyAqLworI2RlZmluZSBUVF9VQ1JfWUlKSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDMpIC8qIFUrNERDMC1VKzRERkYgKi8KKyAgLyogQml0IDEwMCAgU3lsb3RpIE5hZ3JpICovCisjZGVmaW5lIFRUX1VDUl9TWUxPVElfTkFHUkkgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgNCkgLyogVStBODAwLVUrQTgyRiAqLworICAvKiBCaXQgMTAxICBMaW5lYXIgQiBTeWxsYWJhcnkgKi8KKyAgLyogICAgICAgICAgTGluZWFyIEIgSWRlb2dyYW1zICovCisgIC8qICAgICAgICAgIEFlZ2VhbiBOdW1iZXJzICAgICAqLworI2RlZmluZSBUVF9VQ1JfTElORUFSX0IgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDUpIC8qVSsxMDAwMC1VKzEwMDdGKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlUrMTAwODAtVSsxMDBGRiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypVKzEwMTAwLVUrMTAxM0YqLworICAvKiBCaXQgMTAyICBBbmNpZW50IEdyZWVrIE51bWJlcnMgKi8KKyNkZWZpbmUgVFRfVUNSX0FOQ0lFTlRfR1JFRUtfTlVNQkVSUyAgICAgICAgICAgKDFMIDw8ICA2KSAvKlUrMTAxNDAtVSsxMDE4RiovCisgIC8qIEJpdCAxMDMgIFVnYXJpdGljICovCisjZGVmaW5lIFRUX1VDUl9VR0FSSVRJQyAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgNykgLypVKzEwMzgwLVUrMTAzOUYqLworICAvKiBCaXQgMTA0ICBPbGQgUGVyc2lhbiAqLworI2RlZmluZSBUVF9VQ1JfT0xEX1BFUlNJQU4gICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDgpIC8qVSsxMDNBMC1VKzEwM0RGKi8KKyAgLyogQml0IDEwNSAgU2hhdmlhbiAqLworI2RlZmluZSBUVF9VQ1JfU0hBVklBTiAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDkpIC8qVSsxMDQ1MC1VKzEwNDdGKi8KKyAgLyogQml0IDEwNiAgT3NtYW55YSAqLworI2RlZmluZSBUVF9VQ1JfT1NNQU5ZQSAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTApIC8qVSsxMDQ4MC1VKzEwNEFGKi8KKyAgLyogQml0IDEwNyAgQ3lwcmlvdCBTeWxsYWJhcnkgKi8KKyNkZWZpbmUgVFRfVUNSX0NZUFJJT1RfU1lMTEFCQVJZICAgICAgICAgICAgICAgKDFMIDw8IDExKSAvKlUrMTA4MDAtVSsxMDgzRiovCisgIC8qIEJpdCAxMDggIEtoYXJvc2h0aGkgKi8KKyNkZWZpbmUgVFRfVUNSX0tIQVJPU0hUSEkgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDEyKSAvKlUrMTBBMDAtVSsxMEE1RiovCisgIC8qIEJpdCAxMDkgIFRhaSBYdWFuIEppbmcgU3ltYm9scyAqLworI2RlZmluZSBUVF9VQ1JfVEFJX1hVQU5fSklORyAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTMpIC8qVSsxRDMwMC1VKzFEMzVGKi8KKyAgLyogQml0IDExMCAgQ3VuZWlmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgIEN1bmVpZm9ybSBOdW1iZXJzIGFuZCBQdW5jdHVhdGlvbiAqLworI2RlZmluZSBUVF9VQ1JfQ1VORUlGT1JNICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTQpIC8qVSsxMjAwMC1VKzEyM0ZGKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlUrMTI0MDAtVSsxMjQ3RiovCisgIC8qIEJpdCAxMTEgIENvdW50aW5nIFJvZCBOdW1lcmFscyAqLworI2RlZmluZSBUVF9VQ1JfQ09VTlRJTkdfUk9EX05VTUVSQUxTICAgICAgICAgICAoMUwgPDwgMTUpIC8qVSsxRDM2MC1VKzFEMzdGKi8KKyAgLyogQml0IDExMiAgU3VuZGFuZXNlICovCisjZGVmaW5lIFRUX1VDUl9TVU5EQU5FU0UgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxNikgLyogVSsxQjgwLVUrMUJCRiAqLworICAvKiBCaXQgMTEzICBMZXBjaGEgKi8KKyNkZWZpbmUgVFRfVUNSX0xFUENIQSAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE3KSAvKiBVKzFDMDAtVSsxQzRGICovCisgIC8qIEJpdCAxMTQgIE9sIENoaWtpICovCisjZGVmaW5lIFRUX1VDUl9PTF9DSElLSSAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxOCkgLyogVSsxQzUwLVUrMUM3RiAqLworICAvKiBCaXQgMTE1ICBTYXVyYXNodHJhICovCisjZGVmaW5lIFRUX1VDUl9TQVVSQVNIVFJBICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxOSkgLyogVStBODgwLVUrQThERiAqLworICAvKiBCaXQgMTE2ICBLYXlhaCBMaSAqLworI2RlZmluZSBUVF9VQ1JfS0FZQUhfTEkgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjApIC8qIFUrQTkwMC1VK0E5MkYgKi8KKyAgLyogQml0IDExNyAgUmVqYW5nICovCisjZGVmaW5lIFRUX1VDUl9SRUpBTkcgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMSkgLyogVStBOTMwLVUrQTk1RiAqLworICAvKiBCaXQgMTE4ICBDaGFtICovCisjZGVmaW5lIFRUX1VDUl9DSEFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMikgLyogVStBQTAwLVUrQUE1RiAqLworICAvKiBCaXQgMTE5ICBBbmNpZW50IFN5bWJvbHMgKi8KKyNkZWZpbmUgVFRfVUNSX0FOQ0lFTlRfU1lNQk9MUyAgICAgICAgICAgICAgICAgKDFMIDw8IDIzKSAvKlUrMTAxOTAtVSsxMDFDRiovCisgIC8qIEJpdCAxMjAgIFBoYWlzdG9zIERpc2MgKi8KKyNkZWZpbmUgVFRfVUNSX1BIQUlTVE9TX0RJU0MgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI0KSAvKlUrMTAxRDAtVSsxMDFGRiovCisgIC8qIEJpdCAxMjEgIENhcmlhbiAqLworICAvKiAgICAgICAgICBMeWNpYW4gKi8KKyAgLyogICAgICAgICAgTHlkaWFuICovCisjZGVmaW5lIFRUX1VDUl9PTERfQU5BVE9MSUFOICAgICAgICAgICAgICAgICAgICgxTCA8PCAyNSkgLypVKzEwMkEwLVUrMTAyREYqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVSsxMDI4MC1VKzEwMjlGKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlUrMTA5MjAtVSsxMDkzRiovCisgIC8qIEJpdCAxMjIgIERvbWlubyBUaWxlcyAgKi8KKyAgLyogICAgICAgICAgTWFoam9uZyBUaWxlcyAqLworI2RlZmluZSBUVF9VQ1JfR0FNRV9USUxFUyAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjYpIC8qVSsxRjAzMC1VKzFGMDlGKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlUrMUYwMDAtVSsxRjAyRiovCisgIC8qIEJpdCAxMjMtMTI3IFJlc2VydmVkIGZvciBwcm9jZXNzLWludGVybmFsIHVzYWdlICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNvbWUgY29tcGlsZXJzIGhhdmUgYSB2ZXJ5IGxpbWl0ZWQgbGVuZ3RoIG9mIGlkZW50aWZpZXJzLiAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZiBkZWZpbmVkKCBfX1RVUkJPQ19fICkgJiYgX19UVVJCT0NfXyA8IDB4MDQxMCB8fCBkZWZpbmVkKCBfX1BBQ0lGSUNfXyApCisjZGVmaW5lIEhBVkVfTElNSVRfT05fSURFTlRTCisjZW5kaWYKKworCisjaWZuZGVmIEhBVkVfTElNSVRfT05fSURFTlRTCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEhlcmUgc29tZSBhbGlhcyAjZGVmaW5lcyBpbiBvcmRlciB0byBiZSBjbGVhcmVyLiAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlc2UgYXJlIG5vdCBhbHdheXMgI2RlZmluZWQgdG8gc3RheSB3aXRoaW4gdGhlIDMxfmNoYXJhY3RlciBsaW1pdCwgICovCisgIC8qIHdoaWNoIHNvbWUgY29tcGlsZXJzIGhhdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQ3JlZGl0cyBnbyB0byBEYXZlIEhvbyA8ZGhvb0BmbGFzaC5uZXQ+IGZvciBwb2ludGluZyBvdXQgdGhhdCBtb2Rlcm4gICovCisgIC8qIEJvcmxhbmQgY29tcGlsZXJzIChyZWFkOiBmcm9tIEJDKysgMy4xIG9uKSBjYW4gaW5jcmVhc2UgdGhpcyBsaW1pdC4gICAqLworICAvKiBJZiB5b3UgZ2V0IGEgd2FybmluZyB3aXRoIHN1Y2ggYSBjb21waWxlciwgdXNlIHRoZSAtaTQwIHN3aXRjaC4gICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRUX1VDUl9BUkFCSUNfUFJFU0VOVEFUSU9OX0ZPUk1TX0EgICAgICBcCisgICAgICAgICBUVF9VQ1JfQVJBQklDX1BSRVNFTlRBVElPTlNfQQorI2RlZmluZSBUVF9VQ1JfQVJBQklDX1BSRVNFTlRBVElPTl9GT1JNU19CICAgICAgXAorICAgICAgICAgVFRfVUNSX0FSQUJJQ19QUkVTRU5UQVRJT05TX0IKKworI2RlZmluZSBUVF9VQ1JfQ09NQklOSU5HX0RJQUNSSVRJQ0FMX01BUktTICAgICAgXAorICAgICAgICAgVFRfVUNSX0NPTUJJTklOR19ESUFDUklUSUNTCisjZGVmaW5lIFRUX1VDUl9DT01CSU5JTkdfRElBQ1JJVElDQUxfTUFSS1NfU1lNQiBcCisgICAgICAgICBUVF9VQ1JfQ09NQklOSU5HX0RJQUNSSVRJQ1NfU1lNQgorCisKKyNlbmRpZiAvKiAhSEFWRV9MSU1JVF9PTl9JREVOVFMgKi8KKworCitGVF9FTkRfSEVBREVSCisKKyNlbmRpZiAvKiBfX1RUTkFNRUlEX0hfXyAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS90dHRhYmxlcy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS90dHRhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NjhmNDAKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL3R0dGFibGVzLmgKQEAgLTAsMCArMSw4MjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHR0dGFibGVzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBCYXNpYyBTRk5UL1RydWVUeXBlIHRhYmxlcyBkZWZpbml0aW9ucyBhbmQgaW50ZXJmYWNlICAgICAgICAgICAgICAgICAqLworLyogICAgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX19UVFRBQkxFU19IX18KKyNkZWZpbmUgX19UVFRBQkxFU19IX18KKworCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKworI2lmZGVmIEZSRUVUWVBFX0gKKyNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCisjZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKKyNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgorI2VuZGlmCisKKworRlRfQkVHSU5fSEVBREVSCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgdHJ1ZXR5cGVfdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgVGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVHJ1ZVR5cGUgc3BlY2lmaWMgdGFibGUgdHlwZXMgYW5kIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIFRydWVUeXBlLXNwZWNpZmljIHRhYmxlcyAgICovCisgIC8qICAgIGFzIHdlbGwgYXMgc29tZSByb3V0aW5lcyB1c2VkIHRvIGFjY2VzcyBhbmQgcHJvY2VzcyB0aGVtLiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE9yZGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX0hlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Ib3JpSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfVmVydEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX09TMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Qb3N0c2NyaXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfUENMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX01heFByb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU2ZudF9UYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX0dldF9TZm50X1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9Mb2FkX1NmbnRfVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU2ZudF9UYWJsZV9JbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZXRfQ01hcF9MYW5ndWFnZV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2V0X0NNYXBfRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9QQVJBTV9UQUdfVU5QQVRFTlRFRF9ISU5USU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIFRydWVUeXBlIGZvbnQgaGVhZGVyIHRhYmxlLiAgQWxsICAgICAgICovCisgIC8qICAgIGZpZWxkcyBmb2xsb3cgdGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0hlYWRlcl8KKyAgeworICAgIEZUX0ZpeGVkICAgVGFibGVfVmVyc2lvbjsKKyAgICBGVF9GaXhlZCAgIEZvbnRfUmV2aXNpb247CisKKyAgICBGVF9Mb25nICAgIENoZWNrU3VtX0FkanVzdDsKKyAgICBGVF9Mb25nICAgIE1hZ2ljX051bWJlcjsKKworICAgIEZUX1VTaG9ydCAgRmxhZ3M7CisgICAgRlRfVVNob3J0ICBVbml0c19QZXJfRU07CisKKyAgICBGVF9Mb25nICAgIENyZWF0ZWQgWzJdOworICAgIEZUX0xvbmcgICAgTW9kaWZpZWRbMl07CisKKyAgICBGVF9TaG9ydCAgIHhNaW47CisgICAgRlRfU2hvcnQgICB5TWluOworICAgIEZUX1Nob3J0ICAgeE1heDsKKyAgICBGVF9TaG9ydCAgIHlNYXg7CisKKyAgICBGVF9VU2hvcnQgIE1hY19TdHlsZTsKKyAgICBGVF9VU2hvcnQgIExvd2VzdF9SZWNfUFBFTTsKKworICAgIEZUX1Nob3J0ICAgRm9udF9EaXJlY3Rpb247CisgICAgRlRfU2hvcnQgICBJbmRleF9Ub19Mb2NfRm9ybWF0OworICAgIEZUX1Nob3J0ICAgR2x5cGhfRGF0YV9Gb3JtYXQ7CisKKyAgfSBUVF9IZWFkZXI7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Ib3JpSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgVHJ1ZVR5cGUgaG9yaXpvbnRhbCBoZWFkZXIsIHRoZSBgaGhlYScgKi8KKyAgLyogICAgdGFibGUsIGFzIHdlbGwgYXMgdGhlIGNvcnJlc3BvbmRpbmcgaG9yaXpvbnRhbCBtZXRyaWNzIHRhYmxlLCAgICAgICovCisgIC8qICAgIGkuZS4sIHRoZSBgaG10eCcgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFZlcnNpb24gICAgICAgICAgICAgICAgOjogVGhlIHRhYmxlIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQXNjZW5kZXIgICAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIGFzY2VuZGVyLCBpLmUuLCB0aGUgZGlzdGFuY2UgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgYmFzZWxpbmUgdG8gdGhlIHRvcC1tb3N0IG9mIGFsbCAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoIHBvaW50cyBmb3VuZCBpbiB0aGUgZm9udC4gICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBpbnZhbGlkIGluIG1hbnkgZm9udHMsIGFzICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIHVzdWFsbHkgc2V0IGJ5IHRoZSBmb250IGRlc2lnbmVyLCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgb2Z0ZW4gcmVmbGVjdHMgb25seSBhIHBvcnRpb24gb2YgdGhlICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhzIGZvdW5kIGluIHRoZSBmb250IChtYXliZSBBU0NJSSkuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3Ugc2hvdWxkIHVzZSB0aGUgYHNUeXBvQXNjZW5kZXInIGZpZWxkICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIE9TLzIgdGFibGUgaW5zdGVhZCBpZiB5b3Ugd2FudCAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZWN0IG9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERlc2NlbmRlciAgICAgICAgICAgICAgOjogVGhlIGZvbnQncyBkZXNjZW5kZXIsIGkuZS4sIHRoZSBkaXN0YW5jZSAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIGJhc2VsaW5lIHRvIHRoZSBib3R0b20tbW9zdCBvZiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgZ2x5cGggcG9pbnRzIGZvdW5kIGluIHRoZSBmb250LiAgSXQgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbmVnYXRpdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGludmFsaWQgaW4gbWFueSBmb250cywgYXMgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgaXMgdXN1YWxseSBzZXQgYnkgdGhlIGZvbnQgZGVzaWduZXIsICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBvZnRlbiByZWZsZWN0cyBvbmx5IGEgcG9ydGlvbiBvZiB0aGUgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHMgZm91bmQgaW4gdGhlIGZvbnQgKG1heWJlIEFTQ0lJKS4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBzaG91bGQgdXNlIHRoZSBgc1R5cG9EZXNjZW5kZXInICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBvZiB0aGUgT1MvMiB0YWJsZSBpbnN0ZWFkIGlmIHlvdSAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudCB0aGUgY29ycmVjdCBvbmUuICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTGluZV9HYXAgICAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIGxpbmUgZ2FwLCBpLmUuLCB0aGUgZGlzdGFuY2UgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWRkIHRvIHRoZSBhc2NlbmRlciBhbmQgZGVzY2VuZGVyIHRvICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCB0aGUgQlRCLCBpLmUuLCB0aGUgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlbGluZS10by1iYXNlbGluZSBkaXN0YW5jZSBmb3IgdGhlICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgYWR2YW5jZV9XaWR0aF9NYXggICAgICA6OiBUaGlzIGZpZWxkIGlzIHRoZSBtYXhpbXVtIG9mIGFsbCBhZHZhbmNlICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzIGZvdW5kIGluIHRoZSBmb250LiAgSXQgY2FuIGJlICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gY29tcHV0ZSB0aGUgbWF4aW11bSB3aWR0aCBvZiBhbiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmJpdHJhcnkgc3RyaW5nIG9mIHRleHQuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtaW5fTGVmdF9TaWRlX0JlYXJpbmcgIDo6IFRoZSBtaW5pbXVtIGxlZnQgc2lkZSBiZWFyaW5nIG9mIGFsbCAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHMgd2l0aGluIHRoZSBmb250LiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtaW5fUmlnaHRfU2lkZV9CZWFyaW5nIDo6IFRoZSBtaW5pbXVtIHJpZ2h0IHNpZGUgYmVhcmluZyBvZiBhbGwgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHMgd2l0aGluIHRoZSBmb250LiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB4TWF4X0V4dGVudCAgICAgICAgICAgIDo6IFRoZSBtYXhpbXVtIGhvcml6b250YWwgZXh0ZW50IChpLmUuLCB0aGUgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgd2lkdGgnIG9mIGEgZ2x5cGgncyBib3VuZGluZyBib3gpIGZvciAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIGdseXBocyBpbiB0aGUgZm9udC4gICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2FyZXRfU2xvcGVfUmlzZSAgICAgICA6OiBUaGUgcmlzZSBjb2VmZmljaWVudCBvZiB0aGUgY3Vyc29yJ3MgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvcGUgb2YgdGhlIGN1cnNvciAoc2xvcGU9cmlzZS9ydW4pLiAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2FyZXRfU2xvcGVfUnVuICAgICAgICA6OiBUaGUgcnVuIGNvZWZmaWNpZW50IG9mIHRoZSBjdXJzb3IncyAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvcGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmVzZXJ2ZWQgICAgICAgICAgICAgICA6OiA4fnJlc2VydmVkIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtZXRyaWNfRGF0YV9Gb3JtYXQgICAgIDo6IEFsd2F5c34wLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG51bWJlcl9PZl9ITWV0cmljcyAgICAgOjogTnVtYmVyIG9mIEhNZXRyaWNzIGVudHJpZXMgaW4gdGhlIGBobXR4JyAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlIC0tIHRoaXMgdmFsdWUgY2FuIGJlIHNtYWxsZXIgdGhhbiAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdG90YWwgbnVtYmVyIG9mIGdseXBocyBpbiB0aGUgZm9udC4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsb25nX21ldHJpY3MgICAgICAgICAgIDo6IEEgcG9pbnRlciBpbnRvIHRoZSBgaG10eCcgdGFibGUuICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNob3J0X21ldHJpY3MgICAgICAgICAgOjogQSBwb2ludGVyIGludG8gdGhlIGBobXR4JyB0YWJsZS4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIElNUE9SVEFOVDogVGhlIFRUX0hvcmlIZWFkZXIgYW5kIFRUX1ZlcnRIZWFkZXIgc3RydWN0dXJlcyBzaG91bGQgICAqLworICAvKiAgICAgICAgICAgICAgIGJlIGlkZW50aWNhbCBleGNlcHQgZm9yIHRoZSBuYW1lcyBvZiB0aGVpciBmaWVsZHMsICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICB3aGljaCBhcmUgZGlmZmVyZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgIFRoaXMgZW5zdXJlcyB0aGF0IGEgc2luZ2xlIGZ1bmN0aW9uIGluIHRoZSBgdHRsb2FkJyAgICAgKi8KKyAgLyogICAgICAgICAgICAgICBtb2R1bGUgaXMgYWJsZSB0byByZWFkIGJvdGggdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsICovCisgIC8qICAgICAgICAgICAgICAgaGVhZGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0hvcmlIZWFkZXJfCisgIHsKKyAgICBGVF9GaXhlZCAgIFZlcnNpb247CisgICAgRlRfU2hvcnQgICBBc2NlbmRlcjsKKyAgICBGVF9TaG9ydCAgIERlc2NlbmRlcjsKKyAgICBGVF9TaG9ydCAgIExpbmVfR2FwOworCisgICAgRlRfVVNob3J0ICBhZHZhbmNlX1dpZHRoX01heDsgICAgICAvKiBhZHZhbmNlIHdpZHRoIG1heGltdW0gKi8KKworICAgIEZUX1Nob3J0ICAgbWluX0xlZnRfU2lkZV9CZWFyaW5nOyAgLyogbWluaW11bSBsZWZ0LXNiICAgICAgICovCisgICAgRlRfU2hvcnQgICBtaW5fUmlnaHRfU2lkZV9CZWFyaW5nOyAvKiBtaW5pbXVtIHJpZ2h0LXNiICAgICAgKi8KKyAgICBGVF9TaG9ydCAgIHhNYXhfRXh0ZW50OyAgICAgICAgICAgIC8qIHhtYXggZXh0ZW50cyAgICAgICAgICAqLworICAgIEZUX1Nob3J0ICAgY2FyZXRfU2xvcGVfUmlzZTsKKyAgICBGVF9TaG9ydCAgIGNhcmV0X1Nsb3BlX1J1bjsKKyAgICBGVF9TaG9ydCAgIGNhcmV0X09mZnNldDsKKworICAgIEZUX1Nob3J0ICAgUmVzZXJ2ZWRbNF07CisKKyAgICBGVF9TaG9ydCAgIG1ldHJpY19EYXRhX0Zvcm1hdDsKKyAgICBGVF9VU2hvcnQgIG51bWJlcl9PZl9ITWV0cmljczsKKworICAgIC8qIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBub3QgZGVmaW5lZCBieSB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiAqLworICAgIC8qIGJ1dCB0aGV5IGFyZSB1c2VkIHRvIGNvbm5lY3QgdGhlIG1ldHJpY3MgaGVhZGVyIHRvIHRoZSByZWxldmFudCAgICAqLworICAgIC8qIGBITVRYJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgdm9pZCogICAgICBsb25nX21ldHJpY3M7CisgICAgdm9pZCogICAgICBzaG9ydF9tZXRyaWNzOworCisgIH0gVFRfSG9yaUhlYWRlcjsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1ZlcnRIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBUcnVlVHlwZSB2ZXJ0aWNhbCBoZWFkZXIsIHRoZSBgdmhlYScgICAqLworICAvKiAgICB0YWJsZSwgYXMgd2VsbCBhcyB0aGUgY29ycmVzcG9uZGluZyB2ZXJ0aWNhbCBtZXRyaWNzIHRhYmxlLCBpLmUuLCAgKi8KKyAgLyogICAgdGhlIGB2bXR4JyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVmVyc2lvbiAgICAgICAgICAgICAgICAgOjogVGhlIHRhYmxlIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBc2NlbmRlciAgICAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIGFzY2VuZGVyLCBpLmUuLCB0aGUgZGlzdGFuY2UgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgYmFzZWxpbmUgdG8gdGhlIHRvcC1tb3N0IG9mICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCBnbHlwaCBwb2ludHMgZm91bmQgaW4gdGhlIGZvbnQuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBpbnZhbGlkIGluIG1hbnkgZm9udHMsIGFzICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIHVzdWFsbHkgc2V0IGJ5IHRoZSBmb250IGRlc2lnbmVyLCAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgb2Z0ZW4gcmVmbGVjdHMgb25seSBhIHBvcnRpb24gb2YgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGdseXBocyBmb3VuZCBpbiB0aGUgZm9udCAobWF5YmUgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTQ0lJKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91IHNob3VsZCB1c2UgdGhlIGBzVHlwb0FzY2VuZGVyJyAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIG9mIHRoZSBPUy8yIHRhYmxlIGluc3RlYWQgaWYgeW91ICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50IHRoZSBjb3JyZWN0IG9uZS4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIERlc2NlbmRlciAgICAgICAgICAgICAgIDo6IFRoZSBmb250J3MgZGVzY2VuZGVyLCBpLmUuLCB0aGUgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSBmcm9tIHRoZSBiYXNlbGluZSB0byB0aGUgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tLW1vc3Qgb2YgYWxsIGdseXBoIHBvaW50cyBmb3VuZCAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBmb250LiAgSXQgaXMgbmVnYXRpdmUuICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBpbnZhbGlkIGluIG1hbnkgZm9udHMsIGFzICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIHVzdWFsbHkgc2V0IGJ5IHRoZSBmb250IGRlc2lnbmVyLCAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgb2Z0ZW4gcmVmbGVjdHMgb25seSBhIHBvcnRpb24gb2YgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGdseXBocyBmb3VuZCBpbiB0aGUgZm9udCAobWF5YmUgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTQ0lJKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91IHNob3VsZCB1c2UgdGhlIGBzVHlwb0Rlc2NlbmRlcicgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIG9mIHRoZSBPUy8yIHRhYmxlIGluc3RlYWQgaWYgeW91ICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50IHRoZSBjb3JyZWN0IG9uZS4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIExpbmVfR2FwICAgICAgICAgICAgICAgIDo6IFRoZSBmb250J3MgbGluZSBnYXAsIGkuZS4sIHRoZSBkaXN0YW5jZSAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhZGQgdG8gdGhlIGFzY2VuZGVyIGFuZCBkZXNjZW5kZXIgdG8gKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IHRoZSBCVEIsIGkuZS4sIHRoZSAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VsaW5lLXRvLWJhc2VsaW5lIGRpc3RhbmNlIGZvciB0aGUgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGFkdmFuY2VfSGVpZ2h0X01heCAgICAgIDo6IFRoaXMgZmllbGQgaXMgdGhlIG1heGltdW0gb2YgYWxsICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlIGhlaWdodHMgZm91bmQgaW4gdGhlIGZvbnQuICBJdCAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgbWF4aW11bSAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCBvZiBhbiBhcmJpdHJhcnkgc3RyaW5nIG9mIHRleHQuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWluX1RvcF9TaWRlX0JlYXJpbmcgICAgOjogVGhlIG1pbmltdW0gdG9wIHNpZGUgYmVhcmluZyBvZiBhbGwgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocyB3aXRoaW4gdGhlIGZvbnQuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWluX0JvdHRvbV9TaWRlX0JlYXJpbmcgOjogVGhlIG1pbmltdW0gYm90dG9tIHNpZGUgYmVhcmluZyBvZiBhbGwgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocyB3aXRoaW4gdGhlIGZvbnQuICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeU1heF9FeHRlbnQgICAgICAgICAgICAgOjogVGhlIG1heGltdW0gdmVydGljYWwgZXh0ZW50IChpLmUuLCB0aGUgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBoZWlnaHQnIG9mIGEgZ2x5cGgncyBib3VuZGluZyBib3gpIGZvciAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgZ2x5cGhzIGluIHRoZSBmb250LiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNhcmV0X1Nsb3BlX1Jpc2UgICAgICAgIDo6IFRoZSByaXNlIGNvZWZmaWNpZW50IG9mIHRoZSBjdXJzb3IncyAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG9wZSBvZiB0aGUgY3Vyc29yIChzbG9wZT1yaXNlL3J1bikuICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNhcmV0X1Nsb3BlX1J1biAgICAgICAgIDo6IFRoZSBydW4gY29lZmZpY2llbnQgb2YgdGhlIGN1cnNvcidzICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG9wZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGNhcmV0X09mZnNldCAgICAgICAgICAgIDo6IFRoZSBjdXJzb3IncyBvZmZzZXQgZm9yIHNsYW50ZWQgZm9udHMuICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGByZXNlcnZlZCcgaW4gdm10eCAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiAxLjAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZXNlcnZlZCAgICAgICAgICAgICAgICA6OiA4fnJlc2VydmVkIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1ldHJpY19EYXRhX0Zvcm1hdCAgICAgIDo6IEFsd2F5c34wLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtYmVyX09mX0hNZXRyaWNzICAgICAgOjogTnVtYmVyIG9mIFZNZXRyaWNzIGVudHJpZXMgaW4gdGhlICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB2bXR4JyB0YWJsZSAtLSB0aGlzIHZhbHVlIGNhbiBiZSAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWFsbGVyIHRoYW4gdGhlIHRvdGFsIG51bWJlciBvZiBnbHlwaHMgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBsb25nX21ldHJpY3MgICAgICAgICAgIDo6IEEgcG9pbnRlciBpbnRvIHRoZSBgdm10eCcgdGFibGUuICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHNob3J0X21ldHJpY3MgICAgICAgICAgOjogQSBwb2ludGVyIGludG8gdGhlIGB2bXR4JyB0YWJsZS4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIElNUE9SVEFOVDogVGhlIFRUX0hvcmlIZWFkZXIgYW5kIFRUX1ZlcnRIZWFkZXIgc3RydWN0dXJlcyBzaG91bGQgICAqLworICAvKiAgICAgICAgICAgICAgIGJlIGlkZW50aWNhbCBleGNlcHQgZm9yIHRoZSBuYW1lcyBvZiB0aGVpciBmaWVsZHMsICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICB3aGljaCBhcmUgZGlmZmVyZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgIFRoaXMgZW5zdXJlcyB0aGF0IGEgc2luZ2xlIGZ1bmN0aW9uIGluIHRoZSBgdHRsb2FkJyAgICAgKi8KKyAgLyogICAgICAgICAgICAgICBtb2R1bGUgaXMgYWJsZSB0byByZWFkIGJvdGggdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsICovCisgIC8qICAgICAgICAgICAgICAgaGVhZGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1ZlcnRIZWFkZXJfCisgIHsKKyAgICBGVF9GaXhlZCAgIFZlcnNpb247CisgICAgRlRfU2hvcnQgICBBc2NlbmRlcjsKKyAgICBGVF9TaG9ydCAgIERlc2NlbmRlcjsKKyAgICBGVF9TaG9ydCAgIExpbmVfR2FwOworCisgICAgRlRfVVNob3J0ICBhZHZhbmNlX0hlaWdodF9NYXg7ICAgICAgLyogYWR2YW5jZSBoZWlnaHQgbWF4aW11bSAqLworCisgICAgRlRfU2hvcnQgICBtaW5fVG9wX1NpZGVfQmVhcmluZzsgICAgLyogbWluaW11bSBsZWZ0LXNiIG9yIHRvcC1zYiAgICAgICAqLworICAgIEZUX1Nob3J0ICAgbWluX0JvdHRvbV9TaWRlX0JlYXJpbmc7IC8qIG1pbmltdW0gcmlnaHQtc2Igb3IgYm90dG9tLXNiICAgKi8KKyAgICBGVF9TaG9ydCAgIHlNYXhfRXh0ZW50OyAgICAgICAgICAgICAvKiB4bWF4IG9yIHltYXggZXh0ZW50cyAgICAgICAgICAgICovCisgICAgRlRfU2hvcnQgICBjYXJldF9TbG9wZV9SaXNlOworICAgIEZUX1Nob3J0ICAgY2FyZXRfU2xvcGVfUnVuOworICAgIEZUX1Nob3J0ICAgY2FyZXRfT2Zmc2V0OworCisgICAgRlRfU2hvcnQgICBSZXNlcnZlZFs0XTsKKworICAgIEZUX1Nob3J0ICAgbWV0cmljX0RhdGFfRm9ybWF0OworICAgIEZUX1VTaG9ydCAgbnVtYmVyX09mX1ZNZXRyaWNzOworCisgICAgLyogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG5vdCBkZWZpbmVkIGJ5IHRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uICovCisgICAgLyogYnV0IHRoZXkncmUgdXNlZCB0byBjb25uZWN0IHRoZSBtZXRyaWNzIGhlYWRlciB0byB0aGUgcmVsZXZhbnQgICAgICovCisgICAgLyogYEhNVFgnIG9yIGBWTVRYJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICB2b2lkKiAgICAgIGxvbmdfbWV0cmljczsKKyAgICB2b2lkKiAgICAgIHNob3J0X21ldHJpY3M7CisKKyAgfSBUVF9WZXJ0SGVhZGVyOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfT1MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIFRydWVUeXBlIE9TLzIgdGFibGUuICBBbGwgZmllbGRzICAgICAgICovCisgIC8qICAgIGNvbXBseSB0byB0aGUgT3BlblR5cGUgc3BlY2lmaWNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgTm90ZSB0aGF0IHdlIG5vdyBzdXBwb3J0IG9sZCBNYWMgZm9udHMgdGhhdCBkbyBub3QgaW5jbHVkZSBhbiBPUy8yICovCisgIC8qICAgIHRhYmxlLiAgSW4gdGhpcyBjYXNlLCB0aGUgYHZlcnNpb24nIGZpZWxkIGlzIGFsd2F5cyBzZXQgdG8gMHhGRkZGLiAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFRUX09TMl8KKyAgeworICAgIEZUX1VTaG9ydCAgdmVyc2lvbjsgICAgICAgICAgICAgICAgLyogMHgwMDAxIC0gbW9yZSBvciAweEZGRkYgKi8KKyAgICBGVF9TaG9ydCAgIHhBdmdDaGFyV2lkdGg7CisgICAgRlRfVVNob3J0ICB1c1dlaWdodENsYXNzOworICAgIEZUX1VTaG9ydCAgdXNXaWR0aENsYXNzOworICAgIEZUX1VTaG9ydCAgZnNUeXBlOworICAgIEZUX1Nob3J0ICAgeVN1YnNjcmlwdFhTaXplOworICAgIEZUX1Nob3J0ICAgeVN1YnNjcmlwdFlTaXplOworICAgIEZUX1Nob3J0ICAgeVN1YnNjcmlwdFhPZmZzZXQ7CisgICAgRlRfU2hvcnQgICB5U3Vic2NyaXB0WU9mZnNldDsKKyAgICBGVF9TaG9ydCAgIHlTdXBlcnNjcmlwdFhTaXplOworICAgIEZUX1Nob3J0ICAgeVN1cGVyc2NyaXB0WVNpemU7CisgICAgRlRfU2hvcnQgICB5U3VwZXJzY3JpcHRYT2Zmc2V0OworICAgIEZUX1Nob3J0ICAgeVN1cGVyc2NyaXB0WU9mZnNldDsKKyAgICBGVF9TaG9ydCAgIHlTdHJpa2VvdXRTaXplOworICAgIEZUX1Nob3J0ICAgeVN0cmlrZW91dFBvc2l0aW9uOworICAgIEZUX1Nob3J0ICAgc0ZhbWlseUNsYXNzOworCisgICAgRlRfQnl0ZSAgICBwYW5vc2VbMTBdOworCisgICAgRlRfVUxvbmcgICB1bFVuaWNvZGVSYW5nZTE7ICAgICAgICAvKiBCaXRzIDAtMzEgICAqLworICAgIEZUX1VMb25nICAgdWxVbmljb2RlUmFuZ2UyOyAgICAgICAgLyogQml0cyAzMi02MyAgKi8KKyAgICBGVF9VTG9uZyAgIHVsVW5pY29kZVJhbmdlMzsgICAgICAgIC8qIEJpdHMgNjQtOTUgICovCisgICAgRlRfVUxvbmcgICB1bFVuaWNvZGVSYW5nZTQ7ICAgICAgICAvKiBCaXRzIDk2LTEyNyAqLworCisgICAgRlRfQ2hhciAgICBhY2hWZW5kSURbNF07CisKKyAgICBGVF9VU2hvcnQgIGZzU2VsZWN0aW9uOworICAgIEZUX1VTaG9ydCAgdXNGaXJzdENoYXJJbmRleDsKKyAgICBGVF9VU2hvcnQgIHVzTGFzdENoYXJJbmRleDsKKyAgICBGVF9TaG9ydCAgIHNUeXBvQXNjZW5kZXI7CisgICAgRlRfU2hvcnQgICBzVHlwb0Rlc2NlbmRlcjsKKyAgICBGVF9TaG9ydCAgIHNUeXBvTGluZUdhcDsKKyAgICBGVF9VU2hvcnQgIHVzV2luQXNjZW50OworICAgIEZUX1VTaG9ydCAgdXNXaW5EZXNjZW50OworCisgICAgLyogb25seSB2ZXJzaW9uIDEgYW5kIGhpZ2hlcjogKi8KKworICAgIEZUX1VMb25nICAgdWxDb2RlUGFnZVJhbmdlMTsgICAgICAgLyogQml0cyAwLTMxICAgKi8KKyAgICBGVF9VTG9uZyAgIHVsQ29kZVBhZ2VSYW5nZTI7ICAgICAgIC8qIEJpdHMgMzItNjMgICovCisKKyAgICAvKiBvbmx5IHZlcnNpb24gMiBhbmQgaGlnaGVyOiAqLworCisgICAgRlRfU2hvcnQgICBzeEhlaWdodDsKKyAgICBGVF9TaG9ydCAgIHNDYXBIZWlnaHQ7CisgICAgRlRfVVNob3J0ICB1c0RlZmF1bHRDaGFyOworICAgIEZUX1VTaG9ydCAgdXNCcmVha0NoYXI7CisgICAgRlRfVVNob3J0ICB1c01heENvbnRleHQ7CisKKyAgICAvKiBvbmx5IHZlcnNpb24gNSBhbmQgaGlnaGVyOiAqLworCisgICAgRlRfVVNob3J0ICB1c0xvd2VyT3B0aWNhbFBvaW50U2l6ZTsgICAgICAgLyogaW4gdHdpcHMgKDEvMjB0aCBwb2ludHMpICovCisgICAgRlRfVVNob3J0ICB1c1VwcGVyT3B0aWNhbFBvaW50U2l6ZTsgICAgICAgLyogaW4gdHdpcHMgKDEvMjB0aCBwb2ludHMpICovCisKKyAgfSBUVF9PUzI7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9Qb3N0c2NyaXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgVHJ1ZVR5cGUgUG9zdFNjcmlwdCB0YWJsZS4gIEFsbCBmaWVsZHMgKi8KKyAgLyogICAgY29tcGx5IHRvIHRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uLiAgVGhpcyBzdHJ1Y3R1cmUgZG9lcyBub3QgICAgICovCisgIC8qICAgIHJlZmVyZW5jZSB0aGUgUG9zdFNjcmlwdCBnbHlwaCBuYW1lcywgd2hpY2ggY2FuIGJlIG5ldmVydGhlbGVzcyAgICAqLworICAvKiAgICBhY2Nlc3NlZCB3aXRoIHRoZSBgdHRwb3N0JyBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9Qb3N0c2NyaXB0XworICB7CisgICAgRlRfRml4ZWQgIEZvcm1hdFR5cGU7CisgICAgRlRfRml4ZWQgIGl0YWxpY0FuZ2xlOworICAgIEZUX1Nob3J0ICB1bmRlcmxpbmVQb3NpdGlvbjsKKyAgICBGVF9TaG9ydCAgdW5kZXJsaW5lVGhpY2tuZXNzOworICAgIEZUX1VMb25nICBpc0ZpeGVkUGl0Y2g7CisgICAgRlRfVUxvbmcgIG1pbk1lbVR5cGU0MjsKKyAgICBGVF9VTG9uZyAgbWF4TWVtVHlwZTQyOworICAgIEZUX1VMb25nICBtaW5NZW1UeXBlMTsKKyAgICBGVF9VTG9uZyAgbWF4TWVtVHlwZTE7CisKKyAgICAvKiBHbHlwaCBuYW1lcyBmb2xsb3cgaW4gdGhlIGZpbGUsIGJ1dCB3ZSBkb24ndCAgICovCisgICAgLyogbG9hZCB0aGVtIGJ5IGRlZmF1bHQuICBTZWUgdGhlIHR0cG9zdC5jIGZpbGUuICAqLworCisgIH0gVFRfUG9zdHNjcmlwdDsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRUX1BDTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBUcnVlVHlwZSBQQ0xUIHRhYmxlLiAgQWxsIGZpZWxkcyAgICAgICAqLworICAvKiAgICBjb21wbHkgdG8gdGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgc3RydWN0ICBUVF9QQ0xUXworICB7CisgICAgRlRfRml4ZWQgICBWZXJzaW9uOworICAgIEZUX1VMb25nICAgRm9udE51bWJlcjsKKyAgICBGVF9VU2hvcnQgIFBpdGNoOworICAgIEZUX1VTaG9ydCAgeEhlaWdodDsKKyAgICBGVF9VU2hvcnQgIFN0eWxlOworICAgIEZUX1VTaG9ydCAgVHlwZUZhbWlseTsKKyAgICBGVF9VU2hvcnQgIENhcEhlaWdodDsKKyAgICBGVF9VU2hvcnQgIFN5bWJvbFNldDsKKyAgICBGVF9DaGFyICAgIFR5cGVGYWNlWzE2XTsKKyAgICBGVF9DaGFyICAgIENoYXJhY3RlckNvbXBsZW1lbnRbOF07CisgICAgRlRfQ2hhciAgICBGaWxlTmFtZVs2XTsKKyAgICBGVF9DaGFyICAgIFN0cm9rZVdlaWdodDsKKyAgICBGVF9DaGFyICAgIFdpZHRoVHlwZTsKKyAgICBGVF9CeXRlICAgIFNlcmlmU3R5bGU7CisgICAgRlRfQnl0ZSAgICBSZXNlcnZlZDsKKworICB9IFRUX1BDTFQ7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUVF9NYXhQcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBUaGUgbWF4aW11bSBwcm9maWxlIGlzIGEgdGFibGUgY29udGFpbmluZyBtYW55IG1heCB2YWx1ZXMsIHdoaWNoICAgKi8KKyAgLyogICAgY2FuIGJlIHVzZWQgdG8gcHJlLWFsbG9jYXRlIGFycmF5cy4gIFRoaXMgZW5zdXJlcyB0aGF0IG5vIG1lbW9yeSAgICovCisgIC8qICAgIGFsbG9jYXRpb24gb2NjdXJzIGR1cmluZyBhIGdseXBoIGxvYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIHZlcnNpb24gICAgICAgICAgICAgICA6OiBUaGUgdmVyc2lvbiBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtR2x5cGhzICAgICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgZ2x5cGhzIGluIHRoaXMgVHJ1ZVR5cGUgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4UG9pbnRzICAgICAgICAgICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBwb2ludHMgaW4gYSAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub24tY29tcG9zaXRlIFRydWVUeXBlIGdseXBoLiAgU2VlIGFsc28gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0cnVjdHVyZSBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBtYXhDb21wb3NpdGVQb2ludHMnLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhDb250b3VycyAgICAgICAgICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbnRvdXJzIGluIGEgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1jb21wb3NpdGUgVHJ1ZVR5cGUgZ2x5cGguICBTZWUgYWxzbyAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3RydWN0dXJlIGVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYG1heENvbXBvc2l0ZUNvbnRvdXJzJy4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1heENvbXBvc2l0ZVBvaW50cyAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcG9pbnRzIGluIGEgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlIFRydWVUeXBlIGdseXBoLiAgU2VlIGFsc28gdGhlICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSBlbGVtZW50IGBtYXhQb2ludHMnLiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhDb21wb3NpdGVDb250b3VycyAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbnRvdXJzIGluIGEgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZSBUcnVlVHlwZSBnbHlwaC4gIFNlZSBhbHNvIHRoZSAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgZWxlbWVudCBgbWF4Q29udG91cnMnLiAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4Wm9uZXMgICAgICAgICAgICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiB6b25lcyB1c2VkIGZvciAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaCBoaW50aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4VHdpbGlnaHRQb2ludHMgICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBwb2ludHMgaW4gdGhlICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d2lsaWdodCB6b25lIHVzZWQgZm9yIGdseXBoIGhpbnRpbmcuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4U3RvcmFnZSAgICAgICAgICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlIGFyZWEgdXNlZCBmb3IgZ2x5cGggaGludGluZy4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbWF4RnVuY3Rpb25EZWZzICAgICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBmdW5jdGlvbiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9ucyBpbiB0aGUgVHJ1ZVR5cGUgYnl0ZWNvZGUgZm9yICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIG1heEluc3RydWN0aW9uRGVmcyAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb24gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbnMgaW4gdGhlIFRydWVUeXBlIGJ5dGVjb2RlIGZvciAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhTdGFja0VsZW1lbnRzICAgICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGVsZW1lbnRzIHVzZWQgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmluZyBieXRlY29kZSBpbnRlcnByZXRhdGlvbi4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhTaXplT2ZJbnN0cnVjdGlvbnMgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIFRydWVUeXBlIG9wY29kZXMgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgZm9yIGdseXBoIGhpbnRpbmcuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhDb21wb25lbnRFbGVtZW50cyAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIHNpbXBsZSAoaS5lLiwgbm9uLSAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZSkgZ2x5cGhzIGluIGEgY29tcG9zaXRlIGdseXBoLiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBtYXhDb21wb25lbnREZXB0aCAgICAgOjogVGhlIG1heGltdW0gbmVzdGluZyBkZXB0aCBvZiBjb21wb3NpdGUgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgaXMgb25seSB1c2VkIGR1cmluZyBmb250IGxvYWRpbmcuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICB0eXBlZGVmIHN0cnVjdCAgVFRfTWF4UHJvZmlsZV8KKyAgeworICAgIEZUX0ZpeGVkICAgdmVyc2lvbjsKKyAgICBGVF9VU2hvcnQgIG51bUdseXBoczsKKyAgICBGVF9VU2hvcnQgIG1heFBvaW50czsKKyAgICBGVF9VU2hvcnQgIG1heENvbnRvdXJzOworICAgIEZUX1VTaG9ydCAgbWF4Q29tcG9zaXRlUG9pbnRzOworICAgIEZUX1VTaG9ydCAgbWF4Q29tcG9zaXRlQ29udG91cnM7CisgICAgRlRfVVNob3J0ICBtYXhab25lczsKKyAgICBGVF9VU2hvcnQgIG1heFR3aWxpZ2h0UG9pbnRzOworICAgIEZUX1VTaG9ydCAgbWF4U3RvcmFnZTsKKyAgICBGVF9VU2hvcnQgIG1heEZ1bmN0aW9uRGVmczsKKyAgICBGVF9VU2hvcnQgIG1heEluc3RydWN0aW9uRGVmczsKKyAgICBGVF9VU2hvcnQgIG1heFN0YWNrRWxlbWVudHM7CisgICAgRlRfVVNob3J0ICBtYXhTaXplT2ZJbnN0cnVjdGlvbnM7CisgICAgRlRfVVNob3J0ICBtYXhDb21wb25lbnRFbGVtZW50czsKKyAgICBGVF9VU2hvcnQgIG1heENvbXBvbmVudERlcHRoOworCisgIH0gVFRfTWF4UHJvZmlsZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1NmbnRfVGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFuIGVudW1lcmF0aW9uIHVzZWQgdG8gc3BlY2lmeSB0aGUgaW5kZXggb2YgYW4gU0ZOVCB0YWJsZS4gICAgICAgICAqLworICAvKiAgICBVc2VkIGluIHRoZSBARlRfR2V0X1NmbnRfVGFibGUgQVBJIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TRk5UX0hFQUQgOjogVG8gYWNjZXNzIHRoZSBmb250J3MgQFRUX0hlYWRlciBzdHJ1Y3R1cmUuICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1NGTlRfTUFYUCA6OiBUbyBhY2Nlc3MgdGhlIGZvbnQncyBAVFRfTWF4UHJvZmlsZSBzdHJ1Y3R1cmUuICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU0ZOVF9PUzIgIDo6IFRvIGFjY2VzcyB0aGUgZm9udCdzIEBUVF9PUzIgc3RydWN0dXJlLiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TRk5UX0hIRUEgOjogVG8gYWNjZXNzIHRoZSBmb250J3MgQFRUX0hvcmlIZWFkZXIgc3RydWN0dXJlLiAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZUX1NGTlRfVkhFQSA6OiBUbyBhY2Nlc3MgdGhlIGZvbnQncyBAVFRfVmVydEhlYWRlciBzdHJ1dHVyZS4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfU0ZOVF9QT1NUIDo6IFRvIGFjY2VzcyB0aGUgZm9udCdzIEBUVF9Qb3N0c2NyaXB0IHN0cnVjdHVyZS4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9TRk5UX1BDTFQgOjogVG8gYWNjZXNzIHRoZSBmb250J3MgQFRUX1BDTFQgc3RydWN0dXJlLiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHR5cGVkZWYgZW51bSAgRlRfU2ZudF9UYWdfCisgIHsKKyAgICBGVF9TRk5UX0hFQUQsCisgICAgRlRfU0ZOVF9NQVhQLAorICAgIEZUX1NGTlRfT1MyLAorICAgIEZUX1NGTlRfSEhFQSwKKyAgICBGVF9TRk5UX1ZIRUEsCisgICAgRlRfU0ZOVF9QT1NULAorICAgIEZUX1NGTlRfUENMVCwKKworICAgIEZUX1NGTlRfTUFYCisKKyAgfSBGVF9TZm50X1RhZzsKKworICAvKiB0aGVzZSBjb25zdGFudHMgYXJlIGRlcHJlY2F0ZWQ7IHVzZSB0aGUgY29ycmVzcG9uZGluZyBgRlRfU2ZudF9UYWcnICovCisgIC8qIHZhbHVlcyBpbnN0ZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgZnRfc2ZudF9oZWFkICBGVF9TRk5UX0hFQUQKKyNkZWZpbmUgZnRfc2ZudF9tYXhwICBGVF9TRk5UX01BWFAKKyNkZWZpbmUgZnRfc2ZudF9vczIgICBGVF9TRk5UX09TMgorI2RlZmluZSBmdF9zZm50X2hoZWEgIEZUX1NGTlRfSEhFQQorI2RlZmluZSBmdF9zZm50X3ZoZWEgIEZUX1NGTlRfVkhFQQorI2RlZmluZSBmdF9zZm50X3Bvc3QgIEZUX1NGTlRfUE9TVAorI2RlZmluZSBmdF9zZm50X3BjbHQgIEZUX1NGTlRfUENMVAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2V0X1NmbnRfVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmV0dXJuIGEgcG9pbnRlciB0byBhIGdpdmVuIFNGTlQgdGFibGUgd2l0aGluIGEgZmFjZS4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB0YWcgIDo6IFRoZSBpbmRleCBvZiB0aGUgU0ZOVCB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBBIHR5cGUtbGVzcyBwb2ludGVyIHRvIHRoZSB0YWJsZS4gIFRoaXMgd2lsbCBiZX4wIGluIGNhc2Ugb2YgICAgICAgKi8KKyAgLyogICAgZXJyb3IsIG9yIGlmIHRoZSBjb3JyZXNwb25kaW5nIHRhYmxlIHdhcyBub3QgZm91bmQgKk9SKiBsb2FkZWQgICAgICovCisgIC8qICAgIGZyb20gdGhlIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVXNlIGEgdHlwZWNhc3QgYWNjb3JkaW5nIHRvIGB0YWcnIHRvIGFjY2VzcyB0aGUgc3RydWN0dXJlICAgICAgICAgICovCisgIC8qICAgIGVsZW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSB0YWJsZSBpcyBvd25lZCBieSB0aGUgZmFjZSBvYmplY3QgYW5kIGRpc2FwcGVhcnMgd2l0aCBpdC4gICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWZ1bCB0byBhY2Nlc3MgU0ZOVCB0YWJsZXMgdGhhdCBhcmUgbG9hZGVkICovCisgIC8qICAgIGJ5IHRoZSBzZm50LCB0cnVldHlwZSwgYW5kIG9wZW50eXBlIGRyaXZlcnMuICBTZWUgQEZUX1NmbnRfVGFnIGZvciAqLworICAvKiAgICBhIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEhlcmUgYW4gZXhhbXBsZSBob3cgdG8gYWNjZXNzIHRoZSBgdmhlYScgdGFibGU6ICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgVFRfVmVydEhlYWRlciogIHZlcnRfaGVhZGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgdmVydF9oZWFkZXIgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgKFRUX1ZlcnRIZWFkZXIqKUZUX0dldF9TZm50X1RhYmxlKCBmYWNlLCBGVF9TRk5UX1ZIRUEgKTsgICAgICAgKi8KKyAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBGVF9FWFBPUlQoIHZvaWQqICkKKyAgRlRfR2V0X1NmbnRfVGFibGUoIEZUX0ZhY2UgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgRlRfU2ZudF9UYWcgIHRhZyApOworCisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIEBmdW5jdGlvbjoKKyAgKiAgIEZUX0xvYWRfU2ZudF9UYWJsZQorICAqCisgICogQGRlc2NyaXB0aW9uOgorICAqICAgTG9hZCBhbnkgZm9udCB0YWJsZSBpbnRvIGNsaWVudCBtZW1vcnkuCisgICoKKyAgKiBAaW5wdXQ6CisgICogICBmYWNlIDo6CisgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZS4KKyAgKgorICAqICAgdGFnIDo6CisgICogICAgIFRoZSBmb3VyLWJ5dGUgdGFnIG9mIHRoZSB0YWJsZSB0byBsb2FkLiAgVXNlIHRoZSB2YWx1ZX4wIGlmIHlvdSB3YW50CisgICogICAgIHRvIGFjY2VzcyB0aGUgd2hvbGUgZm9udCBmaWxlLiAgT3RoZXJ3aXNlLCB5b3UgY2FuIHVzZSBvbmUgb2YgdGhlCisgICogICAgIGRlZmluaXRpb25zIGZvdW5kIGluIHRoZSBARlRfVFJVRVRZUEVfVEFHU19IIGZpbGUsIG9yIGZvcmdlIGEgbmV3CisgICogICAgIG9uZSB3aXRoIEBGVF9NQUtFX1RBRy4KKyAgKgorICAqICAgb2Zmc2V0IDo6CisgICogICAgIFRoZSBzdGFydGluZyBvZmZzZXQgaW4gdGhlIHRhYmxlIChvciBmaWxlIGlmIHRhZyA9PSAwKS4KKyAgKgorICAqIEBvdXRwdXQ6CisgICogICBidWZmZXIgOjoKKyAgKiAgICAgVGhlIHRhcmdldCBidWZmZXIgYWRkcmVzcy4gIFRoZSBjbGllbnQgbXVzdCBlbnN1cmUgdGhhdCB0aGUgbWVtb3J5CisgICogICAgIGFycmF5IGlzIGJpZyBlbm91Z2ggdG8gaG9sZCB0aGUgZGF0YS4KKyAgKgorICAqIEBpbm91dDoKKyAgKiAgIGxlbmd0aCA6OgorICAqICAgICBJZiB0aGUgYGxlbmd0aCcgcGFyYW1ldGVyIGlzIE5VTEwsIHRoZW4gdHJ5IHRvIGxvYWQgdGhlIHdob2xlIHRhYmxlLgorICAqICAgICBSZXR1cm4gYW4gZXJyb3IgY29kZSBpZiBpdCBmYWlscy4KKyAgKgorICAqICAgICBFbHNlLCBpZiBgKmxlbmd0aCcgaXN+MCwgZXhpdCBpbW1lZGlhdGVseSB3aGlsZSByZXR1cm5pbmcgdGhlCisgICogICAgIHRhYmxlJ3MgKG9yIGZpbGUpIGZ1bGwgc2l6ZSBpbiBpdC4KKyAgKgorICAqICAgICBFbHNlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIHRoZSB0YWJsZSBvciBmaWxlLCBmcm9tIHRoZQorICAqICAgICBzdGFydGluZyBvZmZzZXQuCisgICoKKyAgKiBAcmV0dXJuOgorICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgKgorICAqIEBub3RlOgorICAqICAgSWYgeW91IG5lZWQgdG8gZGV0ZXJtaW5lIHRoZSB0YWJsZSdzIGxlbmd0aCB5b3Ugc2hvdWxkIGZpcnN0IGNhbGwgdGhpcworICAqICAgZnVuY3Rpb24gd2l0aCBgKmxlbmd0aCcgc2V0IHRvfjAsIGFzIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKyAgKgorICAqICAgICB7CisgICogICAgICAgRlRfVUxvbmcgIGxlbmd0aCA9IDA7CisgICoKKyAgKgorICAqICAgICAgIGVycm9yID0gRlRfTG9hZF9TZm50X1RhYmxlKCBmYWNlLCB0YWcsIDAsIE5VTEwsICZsZW5ndGggKTsKKyAgKiAgICAgICBpZiAoIGVycm9yICkgeyAuLi4gdGFibGUgZG9lcyBub3QgZXhpc3QgLi4uIH0KKyAgKgorICAqICAgICAgIGJ1ZmZlciA9IG1hbGxvYyggbGVuZ3RoICk7CisgICogICAgICAgaWYgKCBidWZmZXIgPT0gTlVMTCApIHsgLi4uIG5vdCBlbm91Z2ggbWVtb3J5IC4uLiB9CisgICoKKyAgKiAgICAgICBlcnJvciA9IEZUX0xvYWRfU2ZudF9UYWJsZSggZmFjZSwgdGFnLCAwLCBidWZmZXIsICZsZW5ndGggKTsKKyAgKiAgICAgICBpZiAoIGVycm9yICkgeyAuLi4gY291bGQgbm90IGxvYWQgdGFibGUgLi4uIH0KKyAgKiAgICAgfQorICAqCisgICogICBOb3RlIHRoYXQgc3RydWN0dXJlcyBsaWtlIEBUVF9IZWFkZXIgb3IgQFRUX09TMiBjYW4ndCBiZSB1c2VkIHdpdGgKKyAgKiAgIHRoaXMgZnVuY3Rpb247IHRoZXkgYXJlIGxpbWl0ZWQgdG8gQEZUX0dldF9TZm50X1RhYmxlLiAgUmVhc29uIGlzIHRoYXQKKyAgKiAgIHRob3NlIHN0cnVjdHVyZXMgZGVwZW5kIG9uIHRoZSBwcm9jZXNzb3IgYXJjaGl0ZWN0dXJlLCB3aXRoIHZhcnlpbmcKKyAgKiAgIHNpemUgKGUuZy4gMzJiaXQgdnMuIDY0Yml0KSBvciBvcmRlciAoYmlnIGVuZGlhbiB2cy4gbGl0dGxlIGVuZGlhbikuCisgICoKKyAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX0xvYWRfU2ZudF9UYWJsZSggRlRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgdGFnLAorICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgbGVuZ3RoICk7CisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCisgICogQGZ1bmN0aW9uOgorICAqICAgRlRfU2ZudF9UYWJsZV9JbmZvCisgICoKKyAgKiBAZGVzY3JpcHRpb246CisgICogICBSZXR1cm4gaW5mb3JtYXRpb24gb24gYW4gU0ZOVCB0YWJsZS4KKyAgKgorICAqIEBpbnB1dDoKKyAgKiAgIGZhY2UgOjoKKyAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLgorICAqCisgICogICB0YWJsZV9pbmRleCA6OgorICAqICAgICBUaGUgaW5kZXggb2YgYW4gU0ZOVCB0YWJsZS4gIFRoZSBmdW5jdGlvbiByZXR1cm5zCisgICogICAgIEZUX0Vycl9UYWJsZV9NaXNzaW5nIGZvciBhbiBpbnZhbGlkIHZhbHVlLgorICAqCisgICogQGlub3V0OgorICAqICAgdGFnIDo6CisgICogICAgIFRoZSBuYW1lIHRhZyBvZiB0aGUgU0ZOVCB0YWJsZS4gIElmIHRoZSB2YWx1ZSBpcyBOVUxMLCBgdGFibGVfaW5kZXgnCisgICogICAgIGlzIGlnbm9yZWQsIGFuZCBgbGVuZ3RoJyByZXR1cm5zIHRoZSBudW1iZXIgb2YgU0ZOVCB0YWJsZXMgaW4gdGhlCisgICogICAgIGZvbnQuCisgICoKKyAgKiBAb3V0cHV0OgorICAqICAgbGVuZ3RoIDo6CisgICogICAgIFRoZSBsZW5ndGggb2YgdGhlIFNGTlQgdGFibGUgKG9yIHRoZSBudW1iZXIgb2YgU0ZOVCB0YWJsZXMsIGRlcGVuZGluZworICAqICAgICBvbiBgdGFnJykuCisgICoKKyAgKiBAcmV0dXJuOgorICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgKgorICAqIEBub3RlOgorICAqICAgV2hpbGUgcGFyc2luZyBmb250cywgRnJlZVR5cGUgaGFuZGxlcyBTRk5UIHRhYmxlcyB3aXRoIGxlbmd0aCB6ZXJvIGFzCisgICogICBtaXNzaW5nLgorICAqCisgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9TZm50X1RhYmxlX0luZm8oIEZUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIHRhYmxlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAqdGFnLAorICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAqbGVuZ3RoICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9HZXRfQ01hcF9MYW5ndWFnZV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBSZXR1cm4gVHJ1ZVR5cGUvc2ZudCBzcGVjaWZpYyBjbWFwIGxhbmd1YWdlIElELiAgRGVmaW5pdGlvbnMgb2YgICAgKi8KKyAgLyogICAgbGFuZ3VhZ2UgSUQgdmFsdWVzIGFyZSBpbiBgdHRuYW1laWQuaCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2hhcm1hcCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgVGhlIHRhcmdldCBjaGFybWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBsYW5ndWFnZSBJRCBvZiBgY2hhcm1hcCcuICBJZiBgY2hhcm1hcCcgZG9lc24ndCBiZWxvbmcgdG8gYSAgICAqLworICAvKiAgICBUcnVlVHlwZS9zZm50IGZhY2UsIGp1c3QgcmV0dXJufjAgYXMgdGhlIGRlZmF1bHQgdmFsdWUuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIEZvciBhIGZvcm1hdH4xNCBjbWFwICh0byBhY2Nlc3MgVW5pY29kZSBJVlMpLCB0aGUgcmV0dXJuIHZhbHVlIGlzICAqLworICAvKiAgICAweEZGRkZGRkZGLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfVUxvbmcgKQorICBGVF9HZXRfQ01hcF9MYW5ndWFnZV9JRCggRlRfQ2hhck1hcCAgY2hhcm1hcCApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfR2V0X0NNYXBfRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUmV0dXJuIFRydWVUeXBlL3NmbnQgc3BlY2lmaWMgY21hcCBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgY2hhcm1hcCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgVGhlIHRhcmdldCBjaGFybWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIFRoZSBmb3JtYXQgb2YgYGNoYXJtYXAnLiAgSWYgYGNoYXJtYXAnIGRvZXNuJ3QgYmVsb25nIHRvIGEgICAgICAgICAqLworICAvKiAgICBUcnVlVHlwZS9zZm50IGZhY2UsIHJldHVybiAtMS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIEZUX0VYUE9SVCggRlRfTG9uZyApCisgIEZUX0dldF9DTWFwX0Zvcm1hdCggRlRfQ2hhck1hcCAgY2hhcm1hcCApOworCisgIC8qICovCisKKworRlRfRU5EX0hFQURFUgorCisjZW5kaWYgLyogX19UVFRBQkxFU19IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvdHR0YWdzLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL3R0dGFncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MzZjN2IKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL3R0dGFncy5oCkBAIC0wLDAgKzEsMTExIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB0dHRhZ3MuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGFncyBmb3IgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIHRhYmxlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX19UVEFHU19IX18KKyNkZWZpbmUgX19UVEFHU19IX18KKworCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKworI2lmZGVmIEZSRUVUWVBFX0gKKyNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCisjZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKKyNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgorI2VuZGlmCisKKworRlRfQkVHSU5fSEVBREVSCisKKworI2RlZmluZSBUVEFHX2F2YXIgIEZUX01BS0VfVEFHKCAnYScsICd2JywgJ2EnLCAncicgKQorI2RlZmluZSBUVEFHX0JBU0UgIEZUX01BS0VfVEFHKCAnQicsICdBJywgJ1MnLCAnRScgKQorI2RlZmluZSBUVEFHX2JkYXQgIEZUX01BS0VfVEFHKCAnYicsICdkJywgJ2EnLCAndCcgKQorI2RlZmluZSBUVEFHX0JERiAgIEZUX01BS0VfVEFHKCAnQicsICdEJywgJ0YnLCAnICcgKQorI2RlZmluZSBUVEFHX2JoZWQgIEZUX01BS0VfVEFHKCAnYicsICdoJywgJ2UnLCAnZCcgKQorI2RlZmluZSBUVEFHX2Jsb2MgIEZUX01BS0VfVEFHKCAnYicsICdsJywgJ28nLCAnYycgKQorI2RlZmluZSBUVEFHX2JzbG4gIEZUX01BS0VfVEFHKCAnYicsICdzJywgJ2wnLCAnbicgKQorI2RlZmluZSBUVEFHX0NCRFQgIEZUX01BS0VfVEFHKCAnQycsICdCJywgJ0QnLCAnVCcgKQorI2RlZmluZSBUVEFHX0NCTEMgIEZUX01BS0VfVEFHKCAnQycsICdCJywgJ0wnLCAnQycgKQorI2RlZmluZSBUVEFHX0NGRiAgIEZUX01BS0VfVEFHKCAnQycsICdGJywgJ0YnLCAnICcgKQorI2RlZmluZSBUVEFHX0NJRCAgIEZUX01BS0VfVEFHKCAnQycsICdJJywgJ0QnLCAnICcgKQorI2RlZmluZSBUVEFHX2NtYXAgIEZUX01BS0VfVEFHKCAnYycsICdtJywgJ2EnLCAncCcgKQorI2RlZmluZSBUVEFHX2N2YXIgIEZUX01BS0VfVEFHKCAnYycsICd2JywgJ2EnLCAncicgKQorI2RlZmluZSBUVEFHX2N2dCAgIEZUX01BS0VfVEFHKCAnYycsICd2JywgJ3QnLCAnICcgKQorI2RlZmluZSBUVEFHX0RTSUcgIEZUX01BS0VfVEFHKCAnRCcsICdTJywgJ0knLCAnRycgKQorI2RlZmluZSBUVEFHX0VCRFQgIEZUX01BS0VfVEFHKCAnRScsICdCJywgJ0QnLCAnVCcgKQorI2RlZmluZSBUVEFHX0VCTEMgIEZUX01BS0VfVEFHKCAnRScsICdCJywgJ0wnLCAnQycgKQorI2RlZmluZSBUVEFHX0VCU0MgIEZUX01BS0VfVEFHKCAnRScsICdCJywgJ1MnLCAnQycgKQorI2RlZmluZSBUVEFHX2ZlYXQgIEZUX01BS0VfVEFHKCAnZicsICdlJywgJ2EnLCAndCcgKQorI2RlZmluZSBUVEFHX0ZPTkQgIEZUX01BS0VfVEFHKCAnRicsICdPJywgJ04nLCAnRCcgKQorI2RlZmluZSBUVEFHX2ZwZ20gIEZUX01BS0VfVEFHKCAnZicsICdwJywgJ2cnLCAnbScgKQorI2RlZmluZSBUVEFHX2Z2YXIgIEZUX01BS0VfVEFHKCAnZicsICd2JywgJ2EnLCAncicgKQorI2RlZmluZSBUVEFHX2dhc3AgIEZUX01BS0VfVEFHKCAnZycsICdhJywgJ3MnLCAncCcgKQorI2RlZmluZSBUVEFHX0dERUYgIEZUX01BS0VfVEFHKCAnRycsICdEJywgJ0UnLCAnRicgKQorI2RlZmluZSBUVEFHX2dseWYgIEZUX01BS0VfVEFHKCAnZycsICdsJywgJ3knLCAnZicgKQorI2RlZmluZSBUVEFHX0dQT1MgIEZUX01BS0VfVEFHKCAnRycsICdQJywgJ08nLCAnUycgKQorI2RlZmluZSBUVEFHX0dTVUIgIEZUX01BS0VfVEFHKCAnRycsICdTJywgJ1UnLCAnQicgKQorI2RlZmluZSBUVEFHX2d2YXIgIEZUX01BS0VfVEFHKCAnZycsICd2JywgJ2EnLCAncicgKQorI2RlZmluZSBUVEFHX2hkbXggIEZUX01BS0VfVEFHKCAnaCcsICdkJywgJ20nLCAneCcgKQorI2RlZmluZSBUVEFHX2hlYWQgIEZUX01BS0VfVEFHKCAnaCcsICdlJywgJ2EnLCAnZCcgKQorI2RlZmluZSBUVEFHX2hoZWEgIEZUX01BS0VfVEFHKCAnaCcsICdoJywgJ2UnLCAnYScgKQorI2RlZmluZSBUVEFHX2htdHggIEZUX01BS0VfVEFHKCAnaCcsICdtJywgJ3QnLCAneCcgKQorI2RlZmluZSBUVEFHX0pTVEYgIEZUX01BS0VfVEFHKCAnSicsICdTJywgJ1QnLCAnRicgKQorI2RlZmluZSBUVEFHX2p1c3QgIEZUX01BS0VfVEFHKCAnaicsICd1JywgJ3MnLCAndCcgKQorI2RlZmluZSBUVEFHX2tlcm4gIEZUX01BS0VfVEFHKCAnaycsICdlJywgJ3InLCAnbicgKQorI2RlZmluZSBUVEFHX2xjYXIgIEZUX01BS0VfVEFHKCAnbCcsICdjJywgJ2EnLCAncicgKQorI2RlZmluZSBUVEFHX2xvY2EgIEZUX01BS0VfVEFHKCAnbCcsICdvJywgJ2MnLCAnYScgKQorI2RlZmluZSBUVEFHX0xUU0ggIEZUX01BS0VfVEFHKCAnTCcsICdUJywgJ1MnLCAnSCcgKQorI2RlZmluZSBUVEFHX0xXRk4gIEZUX01BS0VfVEFHKCAnTCcsICdXJywgJ0YnLCAnTicgKQorI2RlZmluZSBUVEFHX01BVEggIEZUX01BS0VfVEFHKCAnTScsICdBJywgJ1QnLCAnSCcgKQorI2RlZmluZSBUVEFHX21heHAgIEZUX01BS0VfVEFHKCAnbScsICdhJywgJ3gnLCAncCcgKQorI2RlZmluZSBUVEFHX01FVEEgIEZUX01BS0VfVEFHKCAnTScsICdFJywgJ1QnLCAnQScgKQorI2RlZmluZSBUVEFHX01NRlggIEZUX01BS0VfVEFHKCAnTScsICdNJywgJ0YnLCAnWCcgKQorI2RlZmluZSBUVEFHX01NU0QgIEZUX01BS0VfVEFHKCAnTScsICdNJywgJ1MnLCAnRCcgKQorI2RlZmluZSBUVEFHX21vcnQgIEZUX01BS0VfVEFHKCAnbScsICdvJywgJ3InLCAndCcgKQorI2RlZmluZSBUVEFHX21vcnggIEZUX01BS0VfVEFHKCAnbScsICdvJywgJ3InLCAneCcgKQorI2RlZmluZSBUVEFHX25hbWUgIEZUX01BS0VfVEFHKCAnbicsICdhJywgJ20nLCAnZScgKQorI2RlZmluZSBUVEFHX29wYmQgIEZUX01BS0VfVEFHKCAnbycsICdwJywgJ2InLCAnZCcgKQorI2RlZmluZSBUVEFHX09TMiAgIEZUX01BS0VfVEFHKCAnTycsICdTJywgJy8nLCAnMicgKQorI2RlZmluZSBUVEFHX09UVE8gIEZUX01BS0VfVEFHKCAnTycsICdUJywgJ1QnLCAnTycgKQorI2RlZmluZSBUVEFHX1BDTFQgIEZUX01BS0VfVEFHKCAnUCcsICdDJywgJ0wnLCAnVCcgKQorI2RlZmluZSBUVEFHX1BPU1QgIEZUX01BS0VfVEFHKCAnUCcsICdPJywgJ1MnLCAnVCcgKQorI2RlZmluZSBUVEFHX3Bvc3QgIEZUX01BS0VfVEFHKCAncCcsICdvJywgJ3MnLCAndCcgKQorI2RlZmluZSBUVEFHX3ByZXAgIEZUX01BS0VfVEFHKCAncCcsICdyJywgJ2UnLCAncCcgKQorI2RlZmluZSBUVEFHX3Byb3AgIEZUX01BS0VfVEFHKCAncCcsICdyJywgJ28nLCAncCcgKQorI2RlZmluZSBUVEFHX3NiaXggIEZUX01BS0VfVEFHKCAncycsICdiJywgJ2knLCAneCcgKQorI2RlZmluZSBUVEFHX3NmbnQgIEZUX01BS0VfVEFHKCAncycsICdmJywgJ24nLCAndCcgKQorI2RlZmluZSBUVEFHX1NJTkcgIEZUX01BS0VfVEFHKCAnUycsICdJJywgJ04nLCAnRycgKQorI2RlZmluZSBUVEFHX3RyYWsgIEZUX01BS0VfVEFHKCAndCcsICdyJywgJ2EnLCAnaycgKQorI2RlZmluZSBUVEFHX3RydWUgIEZUX01BS0VfVEFHKCAndCcsICdyJywgJ3UnLCAnZScgKQorI2RlZmluZSBUVEFHX3R0YyAgIEZUX01BS0VfVEFHKCAndCcsICd0JywgJ2MnLCAnICcgKQorI2RlZmluZSBUVEFHX3R0Y2YgIEZUX01BS0VfVEFHKCAndCcsICd0JywgJ2MnLCAnZicgKQorI2RlZmluZSBUVEFHX1RZUDEgIEZUX01BS0VfVEFHKCAnVCcsICdZJywgJ1AnLCAnMScgKQorI2RlZmluZSBUVEFHX3R5cDEgIEZUX01BS0VfVEFHKCAndCcsICd5JywgJ3AnLCAnMScgKQorI2RlZmluZSBUVEFHX1ZETVggIEZUX01BS0VfVEFHKCAnVicsICdEJywgJ00nLCAnWCcgKQorI2RlZmluZSBUVEFHX3ZoZWEgIEZUX01BS0VfVEFHKCAndicsICdoJywgJ2UnLCAnYScgKQorI2RlZmluZSBUVEFHX3ZtdHggIEZUX01BS0VfVEFHKCAndicsICdtJywgJ3QnLCAneCcgKQorI2RlZmluZSBUVEFHX3dPRkYgIEZUX01BS0VfVEFHKCAndycsICdPJywgJ0YnLCAnRicgKQorCisKK0ZUX0VORF9IRUFERVIKKworI2VuZGlmIC8qIF9fVFRBR1NfSF9fICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL3R0dW5wYXQuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvdHR1bnBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYTU1NjgKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL3R0dW5wYXQuaApAQCAtMCwwICsxLDYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB0dHVucGF0LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRGVmaW5pdGlvbnMgZm9yIHRoZSB1bnBhdGVudGVkIFRydWVUeXBlIGhpbnRpbmcgc3lzdGVtICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDMtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV3JpdHRlbiBieSBHcmFoYW0gQXNoZXIgPGdyYWhhbS5hc2hlckBidGludGVybmV0LmNvbT4gICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX1RUVU5QQVRfSF9fCisjZGVmaW5lIF9fVFRVTlBBVF9IX18KKworCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKworI2lmZGVmIEZSRUVUWVBFX0gKKyNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCisjZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKKyNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgorI2VuZGlmCisKKworRlRfQkVHSU5fSEVBREVSCisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIEBjb25zdGFudDoKKyAgKiAgIEZUX1BBUkFNX1RBR19VTlBBVEVOVEVEX0hJTlRJTkcKKyAgKgorICAqIEBkZXNjcmlwdGlvbjoKKyAgKiAgIEEgY29uc3RhbnQgdXNlZCBhcyB0aGUgdGFnIG9mIGFuIEBGVF9QYXJhbWV0ZXIgc3RydWN0dXJlIHRvIGluZGljYXRlCisgICogICB0aGF0IHVucGF0ZW50ZWQgbWV0aG9kcyBvbmx5IHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBUcnVlVHlwZSBieXRlY29kZQorICAqICAgaW50ZXJwcmV0ZXIgZm9yIGEgdHlwZWZhY2Ugb3BlbmVkIGJ5IEBGVF9PcGVuX0ZhY2UuCisgICoKKyAgKi8KKyNkZWZpbmUgRlRfUEFSQU1fVEFHX1VOUEFURU5URURfSElOVElORyAgRlRfTUFLRV9UQUcoICd1JywgJ24nLCAncCcsICdhJyApCisKKyAgLyogKi8KKworCitGVF9FTkRfSEVBREVSCisKKworI2VuZGlmIC8qIF9fVFRVTlBBVF9IX18gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnQyYnVpbGQuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnQyYnVpbGQuaAppbmRleCA2ZjhlYjdmLi40MTliODBhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0MmJ1aWxkLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdDJidWlsZC5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEZyZWVUeXBlIDIgYnVpbGQgYW5kIHNldHVwIG1hY3Jvcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDYsIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC0zNCw3ICszNCw3IEBACiAjaWZuZGVmIF9fRlQyQlVJTERfSF9fCiAjZGVmaW5lIF9fRlQyQlVJTERfSF9fCiAKLSNpbmNsdWRlIDxjb25maWcvZnRoZWFkZXIuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaD4KIAogI2VuZGlmIC8qIF9fRlQyQlVJTERfSF9fICovCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRhZHZhbmMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRhZHZhbmMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU1ZjkzZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0YWR2YW5jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRhZHZhbmMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFF1aWNrIGNvbXB1dGF0aW9uIG9mIGFkdmFuY2Ugd2lkdGhzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA4LCAyMDEzLCAyMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRBRFZBTkNfSF9fCi0jZGVmaW5lIF9fRlRBRFZBTkNfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzZWN0aW9uOgotICAgKiAgIHF1aWNrX2FkdmFuY2UKLSAgICoKLSAgICogQHRpdGxlOgotICAgKiAgIFF1aWNrIHJldHJpZXZhbCBvZiBhZHZhbmNlIHZhbHVlcwotICAgKgotICAgKiBAYWJzdHJhY3Q6Ci0gICAqICAgUmV0cmlldmUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgYWR2YW5jZSB2YWx1ZXMgd2l0aG91dCBwcm9jZXNzaW5nCi0gICAqICAgZ2x5cGggb3V0bGluZXMsIGlmIHBvc3NpYmxlLgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBxdWlja2x5IGV4dHJhY3QgYWR2YW5jZSB2YWx1ZXMKLSAgICogICB3aXRob3V0IGhhbmRsaW5nIGdseXBoIG91dGxpbmVzLCBpZiBwb3NzaWJsZS4KLSAgICoKLSAgICogQG9yZGVyOgotICAgKiAgIEZUX0dldF9BZHZhbmNlCi0gICAqICAgRlRfR2V0X0FkdmFuY2VzCi0gICAqCi0gICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Q29uc3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQURWQU5DRV9GTEFHX0ZBU1RfT05MWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBiaXQtZmxhZyB0byBiZSBPUi1lZCB3aXRoIHRoZSBgZmxhZ3MnIHBhcmFtZXRlciBvZiB0aGUgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9HZXRfQWR2YW5jZSBhbmQgQEZUX0dldF9BZHZhbmNlcyBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgc2V0LCBpdCBpbmRpY2F0ZXMgdGhhdCB5b3Ugd2FudCB0aGVzZSBmdW5jdGlvbnMgdG8gZmFpbCBpZiB0aGUgICovCi0gIC8qICAgIGNvcnJlc3BvbmRpbmcgaGludGluZyBtb2RlIG9yIGZvbnQgZHJpdmVyIGRvZXNuJ3QgYWxsb3cgZm9yIHZlcnkgICAqLwotICAvKiAgICBxdWljayBhZHZhbmNlIGNvbXB1dGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFR5cGljYWxseSwgZ2x5cGhzIHRoYXQgYXJlIGVpdGhlciB1bnNjYWxlZCwgdW5oaW50ZWQsIGJpdG1hcHBlZCwgICAqLwotICAvKiAgICBvciBsaWdodC1oaW50ZWQgY2FuIGhhdmUgdGhlaXIgYWR2YW5jZSB3aWR0aCBjb21wdXRlZCB2ZXJ5ICAgICAgICAgKi8KLSAgLyogICAgcXVpY2tseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3JtYWwgYW5kIGJ5dGVjb2RlIGhpbnRlZCBtb2RlcyB0aGF0IHJlcXVpcmUgbG9hZGluZywgc2NhbGluZywgICAgKi8KLSAgLyogICAgYW5kIGhpbnRpbmcgb2YgdGhlIGdseXBoIG91dGxpbmUsIGFyZSBleHRyZW1lbHkgc2xvdyBieSAgICAgICAgICAgICovCi0gIC8qICAgIGNvbXBhcmlzb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfQURWQU5DRV9GTEFHX0ZBU1RfT05MWSAgMHgyMDAwMDAwMFVMCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfQWR2YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXRyaWV2ZSB0aGUgYWR2YW5jZSB2YWx1ZSBvZiBhIGdpdmVuIGdseXBoIG91dGxpbmUgaW4gYW4gICAgICAgICAgKi8KLSAgLyogICAgQEZUX0ZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICA6OiBUaGUgc291cmNlIEBGVF9GYWNlIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnaW5kZXggICAgIDo6IFRoZSBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfZmxhZ3MgOjogQSBzZXQgb2YgYml0IGZsYWdzIHNpbWlsYXIgdG8gdGhvc2UgdXNlZCB3aGVuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGNhbGxpbmcgQEZUX0xvYWRfR2x5cGgsIHVzZWQgdG8gZGV0ZXJtaW5lIHdoYXQga2luZCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBvZiBhZHZhbmNlcyB5b3UgbmVlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYWR2YW5jZSA6OiBUaGUgYWR2YW5jZSB2YWx1ZS4gIElmIHNjYWxpbmcgaXMgcGVyZm9ybWVkIChiYXNlZCBvbiAgKi8KLSAgLyogICAgICAgICAgICAgICAgdGhlIHZhbHVlIG9mIGBsb2FkX2ZsYWdzJyksIHRoZSBhZHZhbmNlIHZhbHVlIGlzIGluICAgICovCi0gIC8qICAgICAgICAgICAgICAgIDE2LjE2IGZvcm1hdC4gIE90aGVyd2lzZSwgaXQgaXMgaW4gZm9udCB1bml0cy4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgSWYgQEZUX0xPQURfVkVSVElDQUxfTEFZT1VUIGlzIHNldCwgdGhpcyBpcyB0aGUgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIHZlcnRpY2FsIGFkdmFuY2UgY29ycmVzcG9uZGluZyB0byBhIHZlcnRpY2FsIGxheW91dC4gICAqLwotICAvKiAgICAgICAgICAgICAgICBPdGhlcndpc2UsIGl0IGlzIHRoZSBob3Jpem9udGFsIGFkdmFuY2UgaW4gYSAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgaG9yaXpvbnRhbCBsYXlvdXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBtYXkgZmFpbCBpZiB5b3UgdXNlIEBGVF9BRFZBTkNFX0ZMQUdfRkFTVF9PTkxZIGFuZCAgICovCi0gIC8qICAgIGlmIHRoZSBjb3JyZXNwb25kaW5nIGZvbnQgYmFja2VuZCBkb2Vzbid0IGhhdmUgYSBxdWljayB3YXkgdG8gICAgICAqLwotICAvKiAgICByZXRyaWV2ZSB0aGUgYWR2YW5jZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2NhbGVkIGFkdmFuY2UgaXMgcmV0dXJuZWQgaW4gMTYuMTYgZm9ybWF0IGJ1dCBpc24ndCB0cmFuc2Zvcm1lZCAqLwotICAvKiAgICBieSB0aGUgYWZmaW5lIHRyYW5zZm9ybWF0aW9uIHNwZWNpZmllZCBieSBARlRfU2V0X1RyYW5zZm9ybS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfQWR2YW5jZSggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgIGxvYWRfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgKnBhZHZhbmNlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfQWR2YW5jZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXRyaWV2ZSB0aGUgYWR2YW5jZSB2YWx1ZXMgb2Ygc2V2ZXJhbCBnbHlwaCBvdXRsaW5lcyBpbiBhbiAgICAgICAgKi8KLSAgLyogICAgQEZUX0ZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgOjogVGhlIHNvdXJjZSBARlRfRmFjZSBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdGFydCAgICAgICA6OiBUaGUgZmlyc3QgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvdW50ICAgICAgIDo6IFRoZSBudW1iZXIgb2YgYWR2YW5jZSB2YWx1ZXMgeW91IHdhbnQgdG8gcmV0cmlldmUuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZF9mbGFncyAgOjogQSBzZXQgb2YgYml0IGZsYWdzIHNpbWlsYXIgdG8gdGhvc2UgdXNlZCB3aGVuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGNhbGxpbmcgQEZUX0xvYWRfR2x5cGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhZHZhbmNlIDo6IFRoZSBhZHZhbmNlIHZhbHVlcy4gIFRoaXMgYXJyYXksIHRvIGJlIHByb3ZpZGVkIGJ5IHRoZSAqLwotICAvKiAgICAgICAgICAgICAgICBjYWxsZXIsIG11c3QgY29udGFpbiBhdCBsZWFzdCBgY291bnQnIGVsZW1lbnRzLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIElmIHNjYWxpbmcgaXMgcGVyZm9ybWVkIChiYXNlZCBvbiB0aGUgdmFsdWUgb2YgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICBgbG9hZF9mbGFncycpLCB0aGUgYWR2YW5jZSB2YWx1ZXMgYXJlIGluIDE2LjE2IGZvcm1hdC4gKi8KLSAgLyogICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGV5IGFyZSBpbiBmb250IHVuaXRzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICBJZiBARlRfTE9BRF9WRVJUSUNBTF9MQVlPVVQgaXMgc2V0LCB0aGVzZSBhcmUgdGhlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgdmVydGljYWwgYWR2YW5jZXMgY29ycmVzcG9uZGluZyB0byBhIHZlcnRpY2FsIGxheW91dC4gICovCi0gIC8qICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhleSBhcmUgdGhlIGhvcml6b250YWwgYWR2YW5jZXMgaW4gYSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICBob3Jpem9udGFsIGxheW91dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIG1heSBmYWlsIGlmIHlvdSB1c2UgQEZUX0FEVkFOQ0VfRkxBR19GQVNUX09OTFkgYW5kICAgKi8KLSAgLyogICAgaWYgdGhlIGNvcnJlc3BvbmRpbmcgZm9udCBiYWNrZW5kIGRvZXNuJ3QgaGF2ZSBhIHF1aWNrIHdheSB0byAgICAgICovCi0gIC8qICAgIHJldHJpZXZlIHRoZSBhZHZhbmNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2NhbGVkIGFkdmFuY2VzIGFyZSByZXR1cm5lZCBpbiAxNi4xNiBmb3JtYXQgYnV0IGFyZW4ndCAgICAgICAgICAgICovCi0gIC8qICAgIHRyYW5zZm9ybWVkIGJ5IHRoZSBhZmZpbmUgdHJhbnNmb3JtYXRpb24gc3BlY2lmaWVkIGJ5ICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfU2V0X1RyYW5zZm9ybS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfQWR2YW5jZXMoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgRlRfSW50MzIgICBsb2FkX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAqcGFkdmFuY2VzICk7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUQURWQU5DX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdGF1dG9oLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0YXV0b2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkxOTFhYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0YXV0b2guaAorKysgL2Rldi9udWxsCkBAIC0xLDQwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGF1dG9oLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciBjb250cm9sbGluZyB0aGUgYXV0by1oaW50ZXIgKHNwZWNpZmljYXRpb24gb25seSkuICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTIsIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVEFVVE9IX0hfXwotI2RlZmluZSBfX0ZUQVVUT0hfSF9fCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAc2VjdGlvbjoKLSAgICogICBhdXRvX2hpbnRlcgotICAgKgotICAgKiBAdGl0bGU6Ci0gICAqICAgVGhlIGF1dG8taGludGVyCi0gICAqCi0gICAqIEBhYnN0cmFjdDoKLSAgICogICBDb250cm9sbGluZyB0aGUgYXV0by1oaW50aW5nIG1vZHVsZS4KLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFdoaWxlIEZyZWVUeXBlJ3MgYXV0by1oaW50ZXIgZG9lc24ndCBleHBvc2UgQVBJIGZ1bmN0aW9ucyBieSBpdHNlbGYsCi0gICAqICAgaXQgaXMgcG9zc2libGUgdG8gY29udHJvbCBpdHMgYmVoYXZpb3VyIHdpdGggQEZUX1Byb3BlcnR5X1NldCBhbmQKLSAgICogICBARlRfUHJvcGVydHlfR2V0LiAgVGhlIGZvbGxvd2luZyBsaXN0cyB0aGUgYXZhaWxhYmxlIHByb3BlcnRpZXMKLSAgICogICB0b2dldGhlciB3aXRoIHRoZSBuZWNlc3NhcnkgbWFjcm9zIGFuZCBzdHJ1Y3R1cmVzLgotICAgKgotICAgKiAgIE5vdGUgdGhhdCB0aGUgYXV0by1oaW50ZXIncyBtb2R1bGUgbmFtZSBpcyBgYXV0b2ZpdHRlcicgZm9yCi0gICAqICAgaGlzdG9yaWNhbCByZWFzb25zLgotICAgKgotICAgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAcHJvcGVydHk6Ci0gICAqICAgZ2x5cGgtdG8tc2NyaXB0LW1hcAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgKkV4cGVyaW1lbnRhbCogKm9ubHkqCi0gICAqCi0gICAqICAgVGhlIGF1dG8taGludGVyIHByb3ZpZGVzIHZhcmlvdXMgc2NyaXB0IG1vZHVsZXMgdG8gaGludCBnbHlwaHMuCi0gICAqICAgRXhhbXBsZXMgb2Ygc3VwcG9ydGVkIHNjcmlwdHMgYXJlIExhdGluIG9yIENKSy4gIEJlZm9yZSBhIGdseXBoIGlzCi0gICAqICAgYXV0by1oaW50ZWQsIHRoZSBVbmljb2RlIGNoYXJhY3RlciBtYXAgb2YgdGhlIGZvbnQgZ2V0cyBleGFtaW5lZCwgYW5kCi0gICAqICAgdGhlIHNjcmlwdCBpcyB0aGVuIGRldGVybWluZWQgYmFzZWQgb24gVW5pY29kZSBjaGFyYWN0ZXIgcmFuZ2VzLCBzZWUKLSAgICogICBiZWxvdy4KLSAgICoKLSAgICogICBPcGVuVHlwZSBmb250cywgaG93ZXZlciwgb2Z0ZW4gcHJvdmlkZSBtdWNoIG1vcmUgZ2x5cGhzIHRoYW4KLSAgICogICBjaGFyYWN0ZXIgY29kZXMgKHNtYWxsIGNhcHMsIHN1cGVyc2NyaXB0cywgbGlnYXR1cmVzLCBzd2FzaGVzLCBldGMuKSwKLSAgICogICB0byBiZSBjb250cm9sbGVkIGJ5IHNvLWNhbGxlZCBgZmVhdHVyZXMnLiAgSGFuZGxpbmcgT3BlblR5cGUgZmVhdHVyZXMKLSAgICogICBjYW4gYmUgcXVpdGUgY29tcGxpY2F0ZWQgYW5kIHRodXMgbmVlZHMgYSBzZXBhcmF0ZSBsaWJyYXJ5IG9uIHRvcCBvZgotICAgKiAgIEZyZWVUeXBlLgotICAgKgotICAgKiAgIFRoZSBtYXBwaW5nIGJldHdlZW4gZ2x5cGggaW5kaWNlcyBhbmQgc2NyaXB0cyAoaW4gdGhlIGF1dG8taGludGVyCi0gICAqICAgc2Vuc2UsIHNlZSB0aGUgQEZUX0FVVE9ISU5URVJfU0NSSVBUX1hYWCB2YWx1ZXMpIGlzIHN0b3JlZCBhcyBhbgotICAgKiAgIGFycmF5IHdpdGggYG51bV9nbHlwaHMnIGVsZW1lbnRzLCBhcyBmb3VuZCBpbiB0aGUgZm9udCdzIEBGVF9GYWNlCi0gICAqICAgc3RydWN0dXJlLiAgVGhlIGBnbHlwaC10by1zY3JpcHQtbWFwJyBwcm9wZXJ0eSByZXR1cm5zIGEgcG9pbnRlciB0bwotICAgKiAgIHRoaXMgYXJyYXksIHdoaWNoIGNhbiBiZSBtb2RpZmllZCBhcyBuZWVkZWQuICBOb3RlIHRoYXQgdGhlCi0gICAqICAgbW9kaWZpY2F0aW9uIHNob3VsZCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCBnbHlwaCBnZXRzIHByb2Nlc3NlZCBieQotICAgKiAgIHRoZSBhdXRvLWhpbnRlciBzbyB0aGF0IHRoZSBnbG9iYWwgYW5hbHlzaXMgb2YgdGhlIGZvbnQgc2hhcGVzCi0gICAqICAgYWN0dWFsbHkgdXNlcyB0aGUgbW9kaWZpZWQgbWFwcGluZy4KLSAgICoKLSAgICogICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgY29kZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGFjY2VzcyBpdCAob21pdHRpbmcKLSAgICogICB0aGUgZXJyb3IgaGFuZGxpbmcpLgotICAgKgotICAgKiAgIHsKLSAgICogICAgIEZUX0xpYnJhcnkgICAgICAgICAgICAgICAgbGlicmFyeTsKLSAgICogICAgIEZUX0ZhY2UgICAgICAgICAgICAgICAgICAgZmFjZTsKLSAgICogICAgIEZUX1Byb3BfR2x5cGhUb1NjcmlwdE1hcCAgcHJvcDsKLSAgICoKLSAgICoKLSAgICogICAgIEZUX0luaXRfRnJlZVR5cGUoICZsaWJyYXJ5ICk7Ci0gICAqICAgICBGVF9OZXdfRmFjZSggbGlicmFyeSwgImZvby50dGYiLCAwLCAmZmFjZSApOwotICAgKgotICAgKiAgICAgcHJvcC5mYWNlID0gZmFjZTsKLSAgICoKLSAgICogICAgIEZUX1Byb3BlcnR5X0dldCggbGlicmFyeSwgImF1dG9maXR0ZXIiLAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2x5cGgtdG8tc2NyaXB0LW1hcCIsICZwcm9wICk7Ci0gICAqCi0gICAqICAgICAvLyBhZGp1c3QgYHByb3AubWFwJyBhcyBuZWVkZWQgcmlnaHQgaGVyZQotICAgKgotICAgKiAgICAgRlRfTG9hZF9HbHlwaCggZmFjZSwgLi4uLCBGVF9MT0FEX0ZPUkNFX0FVVE9ISU5UICk7Ci0gICAqICAgfQotICAgKgotICAgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZW51bToKLSAgICogICBGVF9BVVRPSElOVEVSX1NDUklQVF9YWFgKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICpFeHBlcmltZW50YWwqICpvbmx5KgotICAgKgotICAgKiAgIEEgbGlzdCBvZiBjb25zdGFudHMgdXNlZCBmb3IgdGhlIEBnbHlwaC10by1zY3JpcHQtbWFwIHByb3BlcnR5IHRvCi0gICAqICAgc3BlY2lmeSB0aGUgc2NyaXB0IHN1Ym1vZHVsZSB0aGUgYXV0by1oaW50ZXIgc2hvdWxkIHVzZSBmb3IgaGludGluZyBhCi0gICAqICAgcGFydGljdWxhciBnbHlwaC4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBGVF9BVVRPSElOVEVSX1NDUklQVF9OT05FIDo6Ci0gICAqICAgICBEb24ndCBhdXRvLWhpbnQgdGhpcyBnbHlwaC4KLSAgICoKLSAgICogICBGVF9BVVRPSElOVEVSX1NDUklQVF9MQVRJTiA6OgotICAgKiAgICAgQXBwbHkgdGhlIGxhdGluIGF1dG8taGludGVyLiAgRm9yIHRoZSBhdXRvLWhpbnRlciwgYGxhdGluJyBpcyBhCi0gICAqICAgICB2ZXJ5IGJyb2FkIHRlcm0sIGluY2x1ZGluZyBDeXJpbGxpYyBhbmQgR3JlZWsgYWxzbyBzaW5jZSBjaGFyYWN0ZXJzCi0gICAqICAgICBmcm9tIHRob3NlIHNjcmlwdHMgc2hhcmUgdGhlIHNhbWUgZGVzaWduIGNvbnN0cmFpbnRzLgotICAgKgotICAgKiAgICAgQnkgZGVmYXVsdCwgY2hhcmFjdGVycyBmcm9tIHRoZSBmb2xsb3dpbmcgVW5pY29kZSByYW5nZXMgYXJlCi0gICAqICAgICBhc3NpZ25lZCB0byB0aGlzIHN1Ym1vZHVsZS4KLSAgICoKLSAgICogICAgIHsKLSAgICogICAgICAgVSswMDIwIC0gVSswMDdGICAvLyBCYXNpYyBMYXRpbiAobm8gY29udHJvbCBjaGFyYWN0ZXJzKQotICAgKiAgICAgICBVKzAwQTAgLSBVKzAwRkYgIC8vIExhdGluLTEgU3VwcGxlbWVudCAobm8gY29udHJvbCBjaGFyYWN0ZXJzKQotICAgKiAgICAgICBVKzAxMDAgLSBVKzAxN0YgIC8vIExhdGluIEV4dGVuZGVkLUEKLSAgICogICAgICAgVSswMTgwIC0gVSswMjRGICAvLyBMYXRpbiBFeHRlbmRlZC1CCi0gICAqICAgICAgIFUrMDI1MCAtIFUrMDJBRiAgLy8gSVBBIEV4dGVuc2lvbnMKLSAgICogICAgICAgVSswMkIwIC0gVSswMkZGICAvLyBTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMKLSAgICogICAgICAgVSswMzAwIC0gVSswMzZGICAvLyBDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3MKLSAgICogICAgICAgVSswMzcwIC0gVSswM0ZGICAvLyBHcmVlayBhbmQgQ29wdGljCi0gICAqICAgICAgIFUrMDQwMCAtIFUrMDRGRiAgLy8gQ3lyaWxsaWMKLSAgICogICAgICAgVSswNTAwIC0gVSswNTJGICAvLyBDeXJpbGxpYyBTdXBwbGVtZW50Ci0gICAqICAgICAgIFUrMUQwMCAtIFUrMUQ3RiAgLy8gUGhvbmV0aWMgRXh0ZW5zaW9ucwotICAgKiAgICAgICBVKzFEODAgLSBVKzFEQkYgIC8vIFBob25ldGljIEV4dGVuc2lvbnMgU3VwcGxlbWVudAotICAgKiAgICAgICBVKzFEQzAgLSBVKzFERkYgIC8vIENvbWJpbmluZyBEaWFjcml0aWNhbCBNYXJrcyBTdXBwbGVtZW50Ci0gICAqICAgICAgIFUrMUUwMCAtIFUrMUVGRiAgLy8gTGF0aW4gRXh0ZW5kZWQgQWRkaXRpb25hbAotICAgKiAgICAgICBVKzFGMDAgLSBVKzFGRkYgIC8vIEdyZWVrIEV4dGVuZGVkCi0gICAqICAgICAgIFUrMjAwMCAtIFUrMjA2RiAgLy8gR2VuZXJhbCBQdW5jdHVhdGlvbgotICAgKiAgICAgICBVKzIwNzAgLSBVKzIwOUYgIC8vIFN1cGVyc2NyaXB0cyBhbmQgU3Vic2NyaXB0cwotICAgKiAgICAgICBVKzIwQTAgLSBVKzIwQ0YgIC8vIEN1cnJlbmN5IFN5bWJvbHMKLSAgICogICAgICAgVSsyMTUwIC0gVSsyMThGICAvLyBOdW1iZXIgRm9ybXMKLSAgICogICAgICAgVSsyNDYwIC0gVSsyNEZGICAvLyBFbmNsb3NlZCBBbHBoYW51bWVyaWNzCi0gICAqICAgICAgIFUrMkM2MCAtIFUrMkM3RiAgLy8gTGF0aW4gRXh0ZW5kZWQtQwotICAgKiAgICAgICBVKzJERTAgLSBVKzJERkYgIC8vIEN5cmlsbGljIEV4dGVuZGVkLUEKLSAgICogICAgICAgVSsyRTAwIC0gVSsyRTdGICAvLyBTdXBwbGVtZW50YWwgUHVuY3R1YXRpb24KLSAgICogICAgICAgVStBNjQwIC0gVStBNjlGICAvLyBDeXJpbGxpYyBFeHRlbmRlZC1CCi0gICAqICAgICAgIFUrQTcyMCAtIFUrQTdGRiAgLy8gTGF0aW4gRXh0ZW5kZWQtRAotICAgKiAgICAgICBVK0ZCMDAgLSBVK0ZCMDYgIC8vIEFscGhhYi4gUHJlc2VudC4gRm9ybXMgKExhdGluIExpZ2F0dXJlcykKLSAgICogICAgICBVKzFENDAwIC0gVSsxRDdGRiAvLyBNYXRoZW1hdGljYWwgQWxwaGFudW1lcmljIFN5bWJvbHMKLSAgICogICAgICBVKzFGMTAwIC0gVSsxRjFGRiAvLyBFbmNsb3NlZCBBbHBoYW51bWVyaWMgU3VwcGxlbWVudAotICAgKiAgICAgfQotICAgKgotICAgKiAgIEZUX0FVVE9ISU5URVJfU0NSSVBUX0NKSyA6OgotICAgKiAgICAgQXBwbHkgdGhlIENKSyBhdXRvLWhpbnRlciwgY292ZXJpbmcgQ2hpbmVzZSwgSmFwYW5lc2UsIEtvcmVhbiwgb2xkCi0gICAqICAgICBWaWV0bmFtZXNlLCBhbmQgc29tZSBvdGhlciBzY3JpcHRzLgotICAgKgotICAgKiAgICAgQnkgZGVmYXVsdCwgY2hhcmFjdGVycyBmcm9tIHRoZSBmb2xsb3dpbmcgVW5pY29kZSByYW5nZXMgYXJlCi0gICAqICAgICBhc3NpZ25lZCB0byB0aGlzIHN1Ym1vZHVsZS4KLSAgICoKLSAgICogICAgIHsKLSAgICogICAgICAgVSsxMTAwIC0gVSsxMUZGICAvLyBIYW5ndWwgSmFtbwotICAgKiAgICAgICBVKzJFODAgLSBVKzJFRkYgIC8vIENKSyBSYWRpY2FscyBTdXBwbGVtZW50Ci0gICAqICAgICAgIFUrMkYwMCAtIFUrMkZERiAgLy8gS2FuZ3hpIFJhZGljYWxzCi0gICAqICAgICAgIFUrMkZGMCAtIFUrMkZGRiAgLy8gSWRlb2dyYXBoaWMgRGVzY3JpcHRpb24gQ2hhcmFjdGVycwotICAgKiAgICAgICBVKzMwMDAgLSBVKzMwM0YgIC8vIENKSyBTeW1ib2xzIGFuZCBQdW5jdHVhdGlvbgotICAgKiAgICAgICBVKzMwNDAgLSBVKzMwOUYgIC8vIEhpcmFnYW5hCi0gICAqICAgICAgIFUrMzBBMCAtIFUrMzBGRiAgLy8gS2F0YWthbmEKLSAgICogICAgICAgVSszMTAwIC0gVSszMTJGICAvLyBCb3BvbW9mbwotICAgKiAgICAgICBVKzMxMzAgLSBVKzMxOEYgIC8vIEhhbmd1bCBDb21wYXRpYmlsaXR5IEphbW8KLSAgICogICAgICAgVSszMTkwIC0gVSszMTlGICAvLyBLYW5idW4KLSAgICogICAgICAgVSszMUEwIC0gVSszMUJGICAvLyBCb3BvbW9mbyBFeHRlbmRlZAotICAgKiAgICAgICBVKzMxQzAgLSBVKzMxRUYgIC8vIENKSyBTdHJva2VzCi0gICAqICAgICAgIFUrMzFGMCAtIFUrMzFGRiAgLy8gS2F0YWthbmEgUGhvbmV0aWMgRXh0ZW5zaW9ucwotICAgKiAgICAgICBVKzMyMDAgLSBVKzMyRkYgIC8vIEVuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHMKLSAgICogICAgICAgVSszMzAwIC0gVSszM0ZGICAvLyBDSksgQ29tcGF0aWJpbGl0eQotICAgKiAgICAgICBVKzM0MDAgLSBVKzREQkYgIC8vIENKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEEKLSAgICogICAgICAgVSs0REMwIC0gVSs0REZGICAvLyBZaWppbmcgSGV4YWdyYW0gU3ltYm9scwotICAgKiAgICAgICBVKzRFMDAgLSBVKzlGRkYgIC8vIENKSyBVbmlmaWVkIElkZW9ncmFwaHMKLSAgICogICAgICAgVStBOTYwIC0gVStBOTdGICAvLyBIYW5ndWwgSmFtbyBFeHRlbmRlZC1BCi0gICAqICAgICAgIFUrQUMwMCAtIFUrRDdBRiAgLy8gSGFuZ3VsIFN5bGxhYmxlcwotICAgKiAgICAgICBVK0Q3QjAgLSBVK0Q3RkYgIC8vIEhhbmd1bCBKYW1vIEV4dGVuZGVkLUIKLSAgICogICAgICAgVStGOTAwIC0gVStGQUZGICAvLyBDSksgQ29tcGF0aWJpbGl0eSBJZGVvZ3JhcGhzCi0gICAqICAgICAgIFUrRkUxMCAtIFUrRkUxRiAgLy8gVmVydGljYWwgZm9ybXMKLSAgICogICAgICAgVStGRTMwIC0gVStGRTRGICAvLyBDSksgQ29tcGF0aWJpbGl0eSBGb3JtcwotICAgKiAgICAgICBVK0ZGMDAgLSBVK0ZGRUYgIC8vIEhhbGZ3aWR0aCBhbmQgRnVsbHdpZHRoIEZvcm1zCi0gICAqICAgICAgVSsxQjAwMCAtIFUrMUIwRkYgLy8gS2FuYSBTdXBwbGVtZW50Ci0gICAqICAgICAgVSsxRDMwMCAtIFUrMUQzNUYgLy8gVGFpIFh1YW4gSGluZyBTeW1ib2xzCi0gICAqICAgICAgVSsxRjIwMCAtIFUrMUYyRkYgLy8gRW5jbG9zZWQgSWRlb2dyYXBoaWMgU3VwcGxlbWVudAotICAgKiAgICAgIFUrMjAwMDAgLSBVKzJBNkRGIC8vIENKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEIKLSAgICogICAgICBVKzJBNzAwIC0gVSsyQjczRiAvLyBDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBDCi0gICAqICAgICAgVSsyQjc0MCAtIFUrMkI4MUYgLy8gQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gRAotICAgKiAgICAgIFUrMkY4MDAgLSBVKzJGQTFGIC8vIENKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMgU3VwcGxlbWVudAotICAgKiAgICAgfQotICAgKgotICAgKiAgIEZUX0FVVE9ISU5URVJfU0NSSVBUX0lORElDIDo6Ci0gICAqICAgICBBcHBseSB0aGUgaW5kaWMgYXV0by1oaW50ZXIsIGNvdmVyaW5nIGFsbCBtYWpvciBzY3JpcHRzIGZyb20gdGhlCi0gICAqICAgICBJbmRpYW4gc3ViLWNvbnRpbmVudCBhbmQgc29tZSBvdGhlciByZWxhdGVkIHNjcmlwdHMgbGlrZSBUaGFpLCBMYW8sCi0gICAqICAgICBvciBUaWJldGFuLgotICAgKgotICAgKiAgICAgQnkgZGVmYXVsdCwgY2hhcmFjdGVycyBmcm9tIHRoZSBmb2xsb3dpbmcgVW5pY29kZSByYW5nZXMgYXJlCi0gICAqICAgICBhc3NpZ25lZCB0byB0aGlzIHN1Ym1vZHVsZS4KLSAgICoKLSAgICogICAgIHsKLSAgICogICAgICAgVSswOTAwIC0gVSswREZGICAvLyBJbmRpYyBSYW5nZQotICAgKiAgICAgICBVKzBGMDAgLSBVKzBGRkYgIC8vIFRpYmV0YW4KLSAgICogICAgICAgVSsxOTAwIC0gVSsxOTRGICAvLyBMaW1idQotICAgKiAgICAgICBVKzFCODAgLSBVKzFCQkYgIC8vIFN1bmRhbmVzZQotICAgKiAgICAgICBVKzFDODAgLSBVKzFDREYgIC8vIE1lZXRlaSBNYXlhawotICAgKiAgICAgICBVK0E4MDAgLSBVK0E4MkYgIC8vIFN5bG90aSBOYWdyaQotICAgKiAgICAgIFUrMTE4MDAgLSBVKzExOERGIC8vIFNoYXJhZGEKLSAgICogICAgIH0KLSAgICoKLSAgICogICAgIE5vdGUgdGhhdCBjdXJyZW50bHkgSW5kaWMgc3VwcG9ydCBpcyBydWRpbWVudGFyeSBvbmx5LCBtaXNzaW5nIGJsdWUKLSAgICogICAgIHpvbmUgc3VwcG9ydC4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0FVVE9ISU5URVJfU0NSSVBUX05PTkUgICAwCi0jZGVmaW5lIEZUX0FVVE9ISU5URVJfU0NSSVBUX0xBVElOICAxCi0jZGVmaW5lIEZUX0FVVE9ISU5URVJfU0NSSVBUX0NKSyAgICAyCi0jZGVmaW5lIEZUX0FVVE9ISU5URVJfU0NSSVBUX0lORElDICAzCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHN0cnVjdDoKLSAgICogICBGVF9Qcm9wX0dseXBoVG9TY3JpcHRNYXAKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICpFeHBlcmltZW50YWwqICpvbmx5KgotICAgKgotICAgKiAgIFRoZSBkYXRhIGV4Y2hhbmdlIHN0cnVjdHVyZSBmb3IgdGhlIEBnbHlwaC10by1zY3JpcHQtbWFwIHByb3BlcnR5LgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1Byb3BfR2x5cGhUb1NjcmlwdE1hcF8KLSAgewotICAgIEZUX0ZhY2UgICBmYWNlOwotICAgIEZUX0J5dGUqICBtYXA7Ci0KLSAgfSBGVF9Qcm9wX0dseXBoVG9TY3JpcHRNYXA7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHByb3BlcnR5OgotICAgKiAgIGZhbGxiYWNrLXNjcmlwdAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgKkV4cGVyaW1lbnRhbCogKm9ubHkqCi0gICAqCi0gICAqICAgSWYgbm8gYXV0by1oaW50ZXIgc2NyaXB0IG1vZHVsZSBjYW4gYmUgYXNzaWduZWQgdG8gYSBnbHlwaCwgYQotICAgKiAgIGZhbGxiYWNrIHNjcmlwdCBnZXRzIGFzc2lnbmVkIHRvIGl0IChzZWUgYWxzbyB0aGUKLSAgICogICBAZ2x5cGgtdG8tc2NyaXB0LW1hcCBwcm9wZXJ0eSkuICBCeSBkZWZhdWx0LCB0aGlzIGlzCi0gICAqICAgQEZUX0FVVE9ISU5URVJfU0NSSVBUX0NKSy4gIFVzaW5nIHRoZSBgZmFsbGJhY2stc2NyaXB0JyBwcm9wZXJ0eSwKLSAgICogICB0aGlzIGZhbGxiYWNrIHZhbHVlIGNhbiBiZSBjaGFuZ2VkLgotICAgKgotICAgKiAgIHsKLSAgICogICAgIEZUX0xpYnJhcnkgIGxpYnJhcnk7Ci0gICAqICAgICBGVF9VSW50ICAgICBmYWxsYmFja19zY3JpcHQgPSBGVF9BVVRPSElOVEVSX1NDUklQVF9OT05FOwotICAgKgotICAgKgotICAgKiAgICAgRlRfSW5pdF9GcmVlVHlwZSggJmxpYnJhcnkgKTsKLSAgICoKLSAgICogICAgIEZUX1Byb3BlcnR5X1NldCggbGlicmFyeSwgImF1dG9maXR0ZXIiLAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFsbGJhY2stc2NyaXB0IiwgJmZhbGxiYWNrX3NjcmlwdCApOwotICAgKiAgIH0KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB3aXRoIEBGVF9Qcm9wZXJ0eV9HZXQgYWxzby4KLSAgICoKLSAgICogICBJdCdzIGltcG9ydGFudCB0byB1c2UgdGhlIHJpZ2h0IHRpbWluZyBmb3IgY2hhbmdpbmcgdGhpcyB2YWx1ZTogVGhlCi0gICAqICAgY3JlYXRpb24gb2YgdGhlIGdseXBoLXRvLXNjcmlwdCBtYXAgdGhhdCBldmVudHVhbGx5IHVzZXMgdGhlCi0gICAqICAgZmFsbGJhY2sgc2NyaXB0IHZhbHVlIGdldHMgdHJpZ2dlcmVkIGVpdGhlciBieSBzZXR0aW5nIG9yIHJlYWRpbmcgYQotICAgKiAgIGZhY2Utc3BlY2lmaWMgcHJvcGVydHkgbGlrZSBAZ2x5cGgtdG8tc2NyaXB0LW1hcCwgb3IgYnkgYXV0by1oaW50aW5nCi0gICAqICAgYW55IGdseXBoIGZyb20gdGhhdCBmYWNlLiAgSW4gcGFydGljdWxhciwgaWYgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkCi0gICAqICAgYW4gQEZUX0ZhY2Ugc3RydWN0dXJlIGJ1dCBub3QgbG9hZGVkIGFueSBnbHlwaCAodXNpbmcgdGhlCi0gICAqICAgYXV0by1oaW50ZXIpLCBhIGNoYW5nZSBvZiB0aGUgZmFsbGJhY2sgc2NyaXB0IHdpbGwgYWZmZWN0IHRoaXMgZmFjZS4KLSAgICoKLSAgICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHByb3BlcnR5OgotICAgKiAgIGRlZmF1bHQtc2NyaXB0Ci0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICAqRXhwZXJpbWVudGFsKiAqb25seSoKLSAgICoKLSAgICogICBJZiBGcmVldHlwZSBnZXRzIGNvbXBpbGVkIHdpdGggRlRfQ09ORklHX09QVElPTl9VU0VfSEFSRkJVWlogdG8gbWFrZQotICAgKiAgIHRoZSBIYXJmQnV6eiBsaWJyYXJ5IGFjY2VzcyBPcGVuVHlwZSBmZWF0dXJlcyBmb3IgZ2V0dGluZyBiZXR0ZXIKLSAgICogICBnbHlwaCBjb3ZlcmFnZXMsIHRoaXMgcHJvcGVydHkgc2V0cyB0aGUgKGF1dG8tZml0dGVyKSBzY3JpcHQgdG8gYmUKLSAgICogICB1c2VkIGZvciB0aGUgZGVmYXVsdCAoT3BlblR5cGUpIHNjcmlwdCBkYXRhIG9mIGEgZm9udCdzIEdTVUIgdGFibGUuCi0gICAqICAgRmVhdHVyZXMgZm9yIHRoZSBkZWZhdWx0IHNjcmlwdCBhcmUgaW50ZW5kZWQgZm9yIGFsbCBzY3JpcHRzIG5vdAotICAgKiAgIGV4cGxpY2l0bHkgaGFuZGxlZCBpbiBHU1VCOyBhbiBleGFtcGxlIGlzIGEgYGRsaWcnIGZlYXR1cmUsCi0gICAqICAgY29udGFpbmluZyB0aGUgY29tYmluYXRpb24gb2YgdGhlIGNoYXJhY3RlcnMgYFQnLCBgRScsIGFuZCBgTCcgdG8KLSAgICogICBmb3JtIGEgYFRFTCcgbGlnYXR1cmUuCi0gICAqCi0gICAqICAgQnkgZGVmYXVsdCwgdGhpcyBpcyBARlRfQVVUT0hJTlRFUl9TQ1JJUFRfTEFUSU4uICBVc2luZyB0aGUKLSAgICogICBgZGVmYXVsdC1zY3JpcHQnIHByb3BlcnR5LCB0aGlzIGRlZmF1bHQgdmFsdWUgY2FuIGJlIGNoYW5nZWQuCi0gICAqCi0gICAqICAgewotICAgKiAgICAgRlRfTGlicmFyeSAgbGlicmFyeTsKLSAgICogICAgIEZUX1VJbnQgICAgIGRlZmF1bHRfc2NyaXB0ID0gRlRfQVVUT0hJTlRFUl9TQ1JJUFRfTk9ORTsKLSAgICoKLSAgICoKLSAgICogICAgIEZUX0luaXRfRnJlZVR5cGUoICZsaWJyYXJ5ICk7Ci0gICAqCi0gICAqICAgICBGVF9Qcm9wZXJ0eV9TZXQoIGxpYnJhcnksICJhdXRvZml0dGVyIiwKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQtc2NyaXB0IiwgJmRlZmF1bHRfc2NyaXB0ICk7Ci0gICAqICAgfQotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHdpdGggQEZUX1Byb3BlcnR5X0dldCBhbHNvLgotICAgKgotICAgKiAgIEl0J3MgaW1wb3J0YW50IHRvIHVzZSB0aGUgcmlnaHQgdGltaW5nIGZvciBjaGFuZ2luZyB0aGlzIHZhbHVlOiBUaGUKLSAgICogICBjcmVhdGlvbiBvZiB0aGUgZ2x5cGgtdG8tc2NyaXB0IG1hcCB0aGF0IGV2ZW50dWFsbHkgdXNlcyB0aGUKLSAgICogICBkZWZhdWx0IHNjcmlwdCB2YWx1ZSBnZXRzIHRyaWdnZXJlZCBlaXRoZXIgYnkgc2V0dGluZyBvciByZWFkaW5nIGEKLSAgICogICBmYWNlLXNwZWNpZmljIHByb3BlcnR5IGxpa2UgQGdseXBoLXRvLXNjcmlwdC1tYXAsIG9yIGJ5IGF1dG8taGludGluZwotICAgKiAgIGFueSBnbHlwaCBmcm9tIHRoYXQgZmFjZS4gIEluIHBhcnRpY3VsYXIsIGlmIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZAotICAgKiAgIGFuIEBGVF9GYWNlIHN0cnVjdHVyZSBidXQgbm90IGxvYWRlZCBhbnkgZ2x5cGggKHVzaW5nIHRoZQotICAgKiAgIGF1dG8taGludGVyKSwgYSBjaGFuZ2Ugb2YgdGhlIGRlZmF1bHQgc2NyaXB0IHdpbGwgYWZmZWN0IHRoaXMgZmFjZS4KLSAgICoKLSAgICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHByb3BlcnR5OgotICAgKiAgIGluY3JlYXNlLXgtaGVpZ2h0Ci0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBGb3IgcHBlbSB2YWx1ZXMgaW4gdGhlIHJhbmdlIDZ+PD0gcHBlbSA8PSBgaW5jcmVhc2UteC1oZWlnaHQnLCByb3VuZAotICAgKiAgIHVwIHRoZSBmb250J3MgeH5oZWlnaHQgbXVjaCBtb3JlIG9mdGVuIHRoYW4gbm9ybWFsbHkuICBJZiB0aGUgdmFsdWUKLSAgICogICBpcyBzZXQgdG9+MCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQsIHRoaXMgZmVhdHVyZSBpcyBzd2l0Y2hlZCBvZmYuICBVc2UKLSAgICogICB0aGlzIHByb3BlcnR5IHRvIGltcHJvdmUgdGhlIGxlZ2liaWxpdHkgb2Ygc21hbGwgZm9udCBzaXplcyBpZgotICAgKiAgIG5lY2Vzc2FyeS4KLSAgICoKLSAgICogICB7Ci0gICAqICAgICBGVF9MaWJyYXJ5ICAgICAgICAgICAgICAgbGlicmFyeTsKLSAgICogICAgIEZUX0ZhY2UgICAgICAgICAgICAgICAgICBmYWNlOwotICAgKiAgICAgRlRfUHJvcF9JbmNyZWFzZVhIZWlnaHQgIHByb3A7Ci0gICAqCi0gICAqCi0gICAqICAgICBGVF9Jbml0X0ZyZWVUeXBlKCAmbGlicmFyeSApOwotICAgKiAgICAgRlRfTmV3X0ZhY2UoIGxpYnJhcnksICJmb28udHRmIiwgMCwgJmZhY2UgKTsKLSAgICogICAgIEZUX1NldF9DaGFyX1NpemUoIGZhY2UsIDEwICogNjQsIDAsIDcyLCAwICk7Ci0gICAqCi0gICAqICAgICBwcm9wLmZhY2UgID0gZmFjZTsKLSAgICogICAgIHByb3AubGltaXQgPSAxNDsKLSAgICoKLSAgICogICAgIEZUX1Byb3BlcnR5X1NldCggbGlicmFyeSwgImF1dG9maXR0ZXIiLAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jcmVhc2UteC1oZWlnaHQiLCAmcHJvcCApOwotICAgKiAgIH0KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB3aXRoIEBGVF9Qcm9wZXJ0eV9HZXQgYWxzby4KLSAgICoKLSAgICogICBTZXQgdGhpcyB2YWx1ZSByaWdodCBhZnRlciBjYWxsaW5nIEBGVF9TZXRfQ2hhcl9TaXplLCBidXQgYmVmb3JlCi0gICAqICAgbG9hZGluZyBhbnkgZ2x5cGggKHVzaW5nIHRoZSBhdXRvLWhpbnRlcikuCi0gICAqCi0gICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzdHJ1Y3Q6Ci0gICAqICAgRlRfUHJvcF9JbmNyZWFzZVhIZWlnaHQKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoZSBkYXRhIGV4Y2hhbmdlIHN0cnVjdHVyZSBmb3IgdGhlIEBpbmNyZWFzZS14LWhlaWdodCBwcm9wZXJ0eS4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9Qcm9wX0luY3JlYXNlWEhlaWdodF8KLSAgewotICAgIEZUX0ZhY2UgIGZhY2U7Ci0gICAgRlRfVUludCAgbGltaXQ7Ci0KLSAgfSBGVF9Qcm9wX0luY3JlYXNlWEhlaWdodDsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRBVVRPSF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRiYm94LmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0YmJveC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjgwMGUyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRiYm94LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRiYm94LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIGV4YWN0IGJib3ggY29tcHV0YXRpb24gKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDMsIDIwMDcsIDIwMTEsIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBjb21wb25lbnQgaGFzIGEgX3NpbmdsZV8gcm9sZTogdG8gY29tcHV0ZSBleGFjdCBvdXRsaW5lIGJvdW5kaW5nICovCi0gIC8qIGJveGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSXQgaXMgc2VwYXJhdGVkIGZyb20gdGhlIHJlc3Qgb2YgdGhlIGVuZ2luZSBmb3IgdmFyaW91cyB0ZWNobmljYWwgICAgICovCi0gIC8qIHJlYXNvbnMuICBJdCBtYXkgd2VsbCBiZSBpbnRlZ3JhdGVkIGluIGBmdG91dGxuJyBsYXRlci4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUQkJPWF9IX18KLSNkZWZpbmUgX19GVEJCT1hfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZV9wcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfR2V0X0JCb3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGUgdGhlIGV4YWN0IGJvdW5kaW5nIGJveCBvZiBhbiBvdXRsaW5lLiAgVGhpcyBpcyBzbG93ZXIgICAgICAqLwotICAvKiAgICB0aGFuIGNvbXB1dGluZyB0aGUgY29udHJvbCBib3guICBIb3dldmVyLCBpdCB1c2VzIGFuIGFkdmFuY2VkICAgICAgKi8KLSAgLyogICAgYWxnb3JpdGhtIHRoYXQgcmV0dXJucyBfdmVyeV8gcXVpY2tseSB3aGVuIHRoZSB0d28gYm94ZXMgICAgICAgICAgICovCi0gIC8qICAgIGNvaW5jaWRlLiAgT3RoZXJ3aXNlLCB0aGUgb3V0bGluZSBCw6l6aWVyIGFyY3MgYXJlIHRyYXZlcnNlZCB0byAgICAgKi8KLSAgLyogICAgZXh0cmFjdCB0aGVpciBleHRyZW1hLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSA6OiBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWJib3ggICA6OiBUaGUgb3V0bGluZSdzIGV4YWN0IGJvdW5kaW5nIGJveC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgdGhlIGZvbnQgaXMgdHJpY2t5IGFuZCB0aGUgZ2x5cGggaGFzIGJlZW4gbG9hZGVkIHdpdGggICAgICAgICAgICovCi0gIC8qICAgIEBGVF9MT0FEX05PX1NDQUxFLCB0aGUgcmVzdWx0aW5nIEJCb3ggaXMgbWVhbmluZ2xlc3MuICBUbyBnZXQgICAgICAqLwotICAvKiAgICByZWFzb25hYmxlIHZhbHVlcyBmb3IgdGhlIEJCb3ggaXQgaXMgbmVjZXNzYXJ5IHRvIGxvYWQgdGhlIGdseXBoICAgKi8KLSAgLyogICAgYXQgYSBsYXJnZSBwcGVtIHZhbHVlIChzbyB0aGF0IHRoZSBoaW50aW5nIGluc3RydWN0aW9ucyBjYW4gICAgICAgICovCi0gIC8qICAgIHByb3Blcmx5IHNoaWZ0IGFuZCBzY2FsZSB0aGUgc3ViZ2x5cGhzKSwgdGhlbiBleHRyYWN0aW5nIHRoZSBCQm94LCAqLwotICAvKiAgICB3aGljaCBjYW4gYmUgZXZlbnR1YWxseSBjb252ZXJ0ZWQgYmFjayB0byBmb250IHVuaXRzLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX0dldF9CQm94KCBGVF9PdXRsaW5lKiAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfQkJveCAgICAgKmFiYm94ICk7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUQkJPWF9IX18gKi8KLQotCi0vKiBFTkQgKi8KLQotCi0vKiBMb2NhbCBWYXJpYWJsZXM6ICovCi0vKiBjb2Rpbmc6IHV0Zi04ICAgICovCi0vKiBFbmQ6ICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0YmRmLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0YmRmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMjYyZTQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdGJkZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0YmRmLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBBUEkgZm9yIGFjY2Vzc2luZyBCREYtc3BlY2lmaWMgc3RyaW5ncyAoc3BlY2lmaWNhdGlvbikuICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDA0LCAyMDA2LCAyMDA5LCAyMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUQkRGX0hfXwotI2RlZmluZSBfX0ZUQkRGX0hfXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiZGZfZm9udHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCREYgYW5kIFBDRiBGaWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCREYgYW5kIFBDRiBzcGVjaWZpYyBBUEkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGZ1bmN0aW9ucyBzcGVjaWZpYyB0byBCREYgKi8KLSAgLyogICAgYW5kIFBDRiBmb250cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgICBCREZfUHJvcGVydHlUeXBlCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICAgQSBsaXN0IG9mIEJERiBwcm9wZXJ0eSB0eXBlcy4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICAgQkRGX1BST1BFUlRZX1RZUEVfTk9ORSA6OgotICAgKiAgICAgIFZhbHVlfjAgaXMgdXNlZCB0byBpbmRpY2F0ZSBhIG1pc3NpbmcgcHJvcGVydHkuCi0gICAqCi0gICAqICAgIEJERl9QUk9QRVJUWV9UWVBFX0FUT00gOjoKLSAgICogICAgICBQcm9wZXJ0eSBpcyBhIHN0cmluZyBhdG9tLgotICAgKgotICAgKiAgICBCREZfUFJPUEVSVFlfVFlQRV9JTlRFR0VSIDo6Ci0gICAqICAgICAgUHJvcGVydHkgaXMgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIuCi0gICAqCi0gICAqICAgIEJERl9QUk9QRVJUWV9UWVBFX0NBUkRJTkFMIDo6Ci0gICAqICAgICAgUHJvcGVydHkgaXMgYSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlci4KLSAgICovCi0gIHR5cGVkZWYgZW51bSAgQkRGX1Byb3BlcnR5VHlwZV8KLSAgewotICAgIEJERl9QUk9QRVJUWV9UWVBFX05PTkUgICAgID0gMCwKLSAgICBCREZfUFJPUEVSVFlfVFlQRV9BVE9NICAgICA9IDEsCi0gICAgQkRGX1BST1BFUlRZX1RZUEVfSU5URUdFUiAgPSAyLAotICAgIEJERl9QUk9QRVJUWV9UWVBFX0NBUkRJTkFMID0gMwotCi0gIH0gQkRGX1Byb3BlcnR5VHlwZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEB0eXBlOgotICAgKiAgICBCREZfUHJvcGVydHkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICBBIGhhbmRsZSB0byBhIEBCREZfUHJvcGVydHlSZWMgc3RydWN0dXJlIHRvIG1vZGVsIGEgZ2l2ZW4KLSAgICogICAgQkRGL1BDRiBwcm9wZXJ0eS4KLSAgICovCi0gIHR5cGVkZWYgc3RydWN0IEJERl9Qcm9wZXJ0eVJlY18qICBCREZfUHJvcGVydHk7Ci0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAc3RydWN0OgotICAqICAgIEJERl9Qcm9wZXJ0eVJlYwotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIFRoaXMgc3RydWN0dXJlIG1vZGVscyBhIGdpdmVuIEJERi9QQ0YgcHJvcGVydHkuCi0gICoKLSAgKiBAZmllbGRzOgotICAqICAgIHR5cGUgOjoKLSAgKiAgICAgIFRoZSBwcm9wZXJ0eSB0eXBlLgotICAqCi0gICogICAgdS5hdG9tIDo6Ci0gICogICAgICBUaGUgYXRvbSBzdHJpbmcsIGlmIHR5cGUgaXMgQEJERl9QUk9QRVJUWV9UWVBFX0FUT00uICBNYXkgYmUKLSAgKiAgICAgIE5VTEwsIGluZGljYXRpbmcgYW4gZW1wdHkgc3RyaW5nLgotICAqCi0gICogICAgdS5pbnRlZ2VyIDo6Ci0gICogICAgICBBIHNpZ25lZCBpbnRlZ2VyLCBpZiB0eXBlIGlzIEBCREZfUFJPUEVSVFlfVFlQRV9JTlRFR0VSLgotICAqCi0gICogICAgdS5jYXJkaW5hbCA6OgotICAqICAgICAgQW4gdW5zaWduZWQgaW50ZWdlciwgaWYgdHlwZSBpcyBAQkRGX1BST1BFUlRZX1RZUEVfQ0FSRElOQUwuCi0gICovCi0gIHR5cGVkZWYgc3RydWN0ICBCREZfUHJvcGVydHlSZWNfCi0gIHsKLSAgICBCREZfUHJvcGVydHlUeXBlICB0eXBlOwotICAgIHVuaW9uIHsKLSAgICAgIGNvbnN0IGNoYXIqICAgICBhdG9tOwotICAgICAgRlRfSW50MzIgICAgICAgIGludGVnZXI7Ci0gICAgICBGVF9VSW50MzIgICAgICAgY2FyZGluYWw7Ci0KLSAgICB9IHU7Ci0KLSAgfSBCREZfUHJvcGVydHlSZWM7Ci0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICAgRlRfR2V0X0JERl9DaGFyc2V0X0lECi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgUmV0cmlldmUgYSBCREYgZm9udCBjaGFyYWN0ZXIgc2V0IGlkZW50aXR5LCBhY2NvcmRpbmcgdG8KLSAgKiAgICB0aGUgQkRGIHNwZWNpZmljYXRpb24uCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICAgZmFjZSA6OgotICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAqCi0gICogQG91dHB1dDoKLSAgKiAgICBhY2hhcnNldF9lbmNvZGluZyA6OgotICAqICAgICAgIENoYXJzZXQgZW5jb2RpbmcsIGFzIGEgQ35zdHJpbmcsIG93bmVkIGJ5IHRoZSBmYWNlLgotICAqCi0gICogICAgYWNoYXJzZXRfcmVnaXN0cnkgOjoKLSAgKiAgICAgICBDaGFyc2V0IHJlZ2lzdHJ5LCBhcyBhIEN+c3RyaW5nLCBvd25lZCBieSB0aGUgZmFjZS4KLSAgKgotICAqIEByZXR1cm46Ci0gICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAqCi0gICogQG5vdGU6Ci0gICogICBUaGlzIGZ1bmN0aW9uIG9ubHkgd29ya3Mgd2l0aCBCREYgZmFjZXMsIHJldHVybmluZyBhbiBlcnJvciBvdGhlcndpc2UuCi0gICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfQkRGX0NoYXJzZXRfSUQoIEZUX0ZhY2UgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgKmFjaGFyc2V0X2VuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAqYWNoYXJzZXRfcmVnaXN0cnkgKTsKLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgICBGVF9HZXRfQkRGX1Byb3BlcnR5Ci0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgUmV0cmlldmUgYSBCREYgcHJvcGVydHkgZnJvbSBhIEJERiBvciBQQ0YgZm9udCBmaWxlLgotICAqCi0gICogQGlucHV0OgotICAqICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCi0gICoKLSAgKiAgICBuYW1lIDo6IFRoZSBwcm9wZXJ0eSBuYW1lLgotICAqCi0gICogQG91dHB1dDoKLSAgKiAgICBhcHJvcGVydHkgOjogVGhlIHByb3BlcnR5LgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFRoaXMgZnVuY3Rpb24gd29ya3Mgd2l0aCBCREYgX2FuZF8gUENGIGZvbnRzLiAgSXQgcmV0dXJucyBhbiBlcnJvcgotICAqICAgb3RoZXJ3aXNlLiAgSXQgYWxzbyByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBwcm9wZXJ0eSBpcyBub3QgaW4gdGhlCi0gICogICBmb250LgotICAqCi0gICogICBBIGBwcm9wZXJ0eScgaXMgYSBlaXRoZXIga2V5LXZhbHVlIHBhaXIgd2l0aGluIHRoZSBTVEFSVFBST1BFUlRJRVMKLSAgKiAgIC4uLiBFTkRQUk9QRVJUSUVTIGJsb2NrIG9mIGEgQkRGIGZvbnQgb3IgYSBrZXktdmFsdWUgcGFpciBmcm9tIHRoZQotICAqICAgYGluZm8tPnByb3BzJyBhcnJheSB3aXRoaW4gYSBgRm9udFJlYycgc3RydWN0dXJlIG9mIGEgUENGIGZvbnQuCi0gICoKLSAgKiAgIEludGVnZXIgcHJvcGVydGllcyBhcmUgYWx3YXlzIHN0b3JlZCBhcyBgc2lnbmVkJyB3aXRoaW4gUENGIGZvbnRzOwotICAqICAgY29uc2VxdWVudGx5LCBAQkRGX1BST1BFUlRZX1RZUEVfQ0FSRElOQUwgaXMgYSBwb3NzaWJsZSByZXR1cm4gdmFsdWUKLSAgKiAgIGZvciBCREYgZm9udHMgb25seS4KLSAgKgotICAqICAgSW4gY2FzZSBvZiBlcnJvciwgYGFwcm9wZXJ0eS0+dHlwZScgaXMgYWx3YXlzIHNldCB0bwotICAqICAgQEJERl9QUk9QRVJUWV9UWVBFX05PTkUuCi0gICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfQkRGX1Byb3BlcnR5KCBGVF9GYWNlICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgICAgICBwcm9wX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIEJERl9Qcm9wZXJ0eVJlYyAgKmFwcm9wZXJ0eSApOwotCi0gIC8qICovCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRCREZfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0Yml0bWFwLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0Yml0bWFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZTcxNjkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdGJpdG1hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Yml0bWFwLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgYml0bWFwcyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDA2LCAyMDA4LCAyMDEzLCAyMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUQklUTUFQX0hfXwotI2RlZmluZSBfX0ZUQklUTUFQX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJpdG1hcF9oYW5kbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJpdG1hcCBIYW5kbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEhhbmRsaW5nIEZUX0JpdG1hcCBvYmplY3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIEBGVF9CaXRtYXAgb2JqZWN0cy4gICAqLwotICAvKiAgICBOb3RlIHRoYXQgbm9uZSBvZiB0aGUgZnVuY3Rpb25zIGNoYW5nZXMgdGhlIGJpdG1hcCdzIGBmbG93JyAoYXMgICAgKi8KLSAgLyogICAgaW5kaWNhdGVkIGJ5IHRoZSBzaWduIG9mIHRoZSBgcGl0Y2gnIGZpZWxkIGluIGBGVF9CaXRtYXAnKS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0JpdG1hcF9OZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluaXRpYWxpemUgYSBwb2ludGVyIHRvIGFuIEBGVF9CaXRtYXAgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFiaXRtYXAgOjogQSBwb2ludGVyIHRvIHRoZSBiaXRtYXAgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfQml0bWFwX05ldyggRlRfQml0bWFwICAqYWJpdG1hcCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQml0bWFwX0NvcHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29weSBhIGJpdG1hcCBpbnRvIGFub3RoZXIgb25lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSB0byBhIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzb3VyY2UgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YXJnZXQgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9CaXRtYXBfQ29weSggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0JpdG1hcCAgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCAgICAgICAgKnRhcmdldCk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CaXRtYXBfRW1ib2xkZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFbWJvbGRlbiBhIGJpdG1hcC4gIFRoZSBuZXcgYml0bWFwIHdpbGwgYmUgYWJvdXQgYHhTdHJlbmd0aCcgICAgICAgKi8KLSAgLyogICAgcGl4ZWxzIHdpZGVyIGFuZCBgeVN0cmVuZ3RoJyBwaXhlbHMgaGlnaGVyLiAgVGhlIGxlZnQgYW5kIGJvdHRvbSAgICovCi0gIC8qICAgIGJvcmRlcnMgYXJlIGtlcHQgdW5jaGFuZ2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICA6OiBBIGhhbmRsZSB0byBhIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeFN0cmVuZ3RoIDo6IEhvdyBzdHJvbmcgdGhlIGdseXBoIGlzIGVtYm9sZGVuZWQgaG9yaXpvbnRhbGx5LiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBFeHByZXNzZWQgaW4gMjYuNiBwaXhlbCBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeVN0cmVuZ3RoIDo6IEhvdyBzdHJvbmcgdGhlIGdseXBoIGlzIGVtYm9sZGVuZWQgdmVydGljYWxseS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBFeHByZXNzZWQgaW4gMjYuNiBwaXhlbCBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJpdG1hcCAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHJlc3RyaWN0cyBgeFN0cmVuZ3RoJyB0byBiZSBsZXNzIHRoYW4gICAqLwotICAvKiAgICBvciBlcXVhbCB0b344IGlmIGJpdG1hcCBpcyBvZiBwaXhlbF9tb2RlIEBGVF9QSVhFTF9NT0RFX01PTk8uICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHlvdSB3YW50IHRvIGVtYm9sZGVuIHRoZSBiaXRtYXAgb3duZWQgYnkgYSBARlRfR2x5cGhTbG90UmVjLCAgICAqLwotICAvKiAgICB5b3Ugc2hvdWxkIGNhbGwgQEZUX0dseXBoU2xvdF9Pd25fQml0bWFwIG9uIHRoZSBzbG90IGZpcnN0LiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJpdG1hcHMgaW4gQEZUX1BJWEVMX01PREVfR1JBWTIgYW5kIEBGVF9QSVhFTF9NT0RFX0dSQVlAIGZvcm1hdCAgICAqLwotICAvKiAgICBhcmUgY29udmVydGVkIHRvIEBGVF9QSVhFTF9NT0RFX0dSQVkgZm9ybWF0IChpLmUuLCA4YnBwKS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9CaXRtYXBfRW1ib2xkZW4oIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgRlRfQml0bWFwKiAgYml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHhTdHJlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB5U3RyZW5ndGggKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0JpdG1hcF9Db252ZXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbnZlcnQgYSBiaXRtYXAgb2JqZWN0IHdpdGggZGVwdGggMWJwcCwgMmJwcCwgNGJwcCwgOGJwcCBvciAzMmJwcCAqLwotICAvKiAgICB0byBhIGJpdG1hcCBvYmplY3Qgd2l0aCBkZXB0aCA4YnBwLCBtYWtpbmcgdGhlIG51bWJlciBvZiB1c2VkICAgICAgKi8KLSAgLyogICAgYnl0ZXMgbGluZSAoYS5rLmEuIHRoZSBgcGl0Y2gnKSBhIG11bHRpcGxlIG9mIGBhbGlnbm1lbnQnLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgIDo6IEEgaGFuZGxlIHRvIGEgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzb3VyY2UgICAgOjogVGhlIHNvdXJjZSBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFsaWdubWVudCA6OiBUaGUgcGl0Y2ggb2YgdGhlIGJpdG1hcCBpcyBhIG11bHRpcGxlIG9mIHRoaXMgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLiAgQ29tbW9uIHZhbHVlcyBhcmUgMSwgMiwgb3IgNC4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YXJnZXQgICAgOjogVGhlIHRhcmdldCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJdCBpcyBwb3NzaWJsZSB0byBjYWxsIEBGVF9CaXRtYXBfQ29udmVydCBtdWx0aXBsZSB0aW1lcyB3aXRob3V0ICAgKi8KLSAgLyogICAgY2FsbGluZyBARlRfQml0bWFwX0RvbmUgKHRoZSBtZW1vcnkgaXMgc2ltcGx5IHJlYWxsb2NhdGVkKS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2UgQEZUX0JpdG1hcF9Eb25lIHRvIGZpbmFsbHkgcmVtb3ZlIHRoZSBiaXRtYXAgb2JqZWN0LiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBgbGlicmFyeScgYXJndW1lbnQgaXMgdGFrZW4gdG8gaGF2ZSBhY2Nlc3MgdG8gRnJlZVR5cGUncyAgICAgICAqLwotICAvKiAgICBtZW1vcnkgaGFuZGxpbmcgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9CaXRtYXBfQ29udmVydCggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0JpdG1hcCAgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCAgICAgICAgKnRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICAgIGFsaWdubWVudCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhTbG90X093bl9CaXRtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTWFrZSBzdXJlIHRoYXQgYSBnbHlwaCBzbG90IG93bnMgYHNsb3QtPmJpdG1hcCcuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2xvdCA6OiBUaGUgZ2x5cGggc2xvdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyB0byBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9CaXRtYXBfRW1ib2xkZW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dseXBoU2xvdF9Pd25fQml0bWFwKCBGVF9HbHlwaFNsb3QgIHNsb3QgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0JpdG1hcF9Eb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlc3Ryb3kgYSBiaXRtYXAgb2JqZWN0IGNyZWF0ZWQgd2l0aCBARlRfQml0bWFwX05ldy4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gYSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYml0bWFwICA6OiBUaGUgYml0bWFwIG9iamVjdCB0byBiZSBmcmVlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGBsaWJyYXJ5JyBhcmd1bWVudCBpcyB0YWtlbiB0byBoYXZlIGFjY2VzcyB0byBGcmVlVHlwZSdzICAgICAgICovCi0gIC8qICAgIG1lbW9yeSBoYW5kbGluZyBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0JpdG1hcF9Eb25lKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgRlRfQml0bWFwICAqYml0bWFwICk7Ci0KLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRCSVRNQVBfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0YnppcDIuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRiemlwMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGNlMTYxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRiemlwMi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0YnppcDIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBCemlwMi1jb21wcmVzc2VkIHN0cmVhbSBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxMCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSm9lbCBLbGluZ2hlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUQlpJUDJfSF9fCi0jZGVmaW5lIF9fRlRCWklQMl9IX18KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJ6aXAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJaSVAyIFN0cmVhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzaW5nIGJ6aXAyLWNvbXByZXNzZWQgZm9udCBmaWxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgQnppcDItc3BlY2lmaWMgZnVuY3Rpb25zLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgIEZUX1N0cmVhbV9PcGVuQnppcDIKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgIE9wZW4gYSBuZXcgc3RyZWFtIHRvIHBhcnNlIGJ6aXAyLWNvbXByZXNzZWQgZm9udCBmaWxlcy4gIFRoaXMgaXMKLSAgKiAgIG1haW5seSB1c2VkIHRvIHN1cHBvcnQgdGhlIGNvbXByZXNzZWQgYCoucGNmLmJ6MicgZm9udHMgdGhhdCBjb21lCi0gICogICB3aXRoIFhGcmVlODYuCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICBzdHJlYW0gOjoKLSAgKiAgICAgVGhlIHRhcmdldCBlbWJlZGRpbmcgc3RyZWFtLgotICAqCi0gICogICBzb3VyY2UgOjoKLSAgKiAgICAgVGhlIHNvdXJjZSBzdHJlYW0uCi0gICoKLSAgKiBAcmV0dXJuOgotICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgKgotICAqIEBub3RlOgotICAqICAgVGhlIHNvdXJjZSBzdHJlYW0gbXVzdCBiZSBvcGVuZWQgX2JlZm9yZV8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgotICAqCi0gICogICBDYWxsaW5nIHRoZSBpbnRlcm5hbCBmdW5jdGlvbiBgRlRfU3RyZWFtX0Nsb3NlJyBvbiB0aGUgbmV3IHN0cmVhbSB3aWxsCi0gICogICAqbm90KiBjYWxsIGBGVF9TdHJlYW1fQ2xvc2UnIG9uIHRoZSBzb3VyY2Ugc3RyZWFtLiAgTm9uZSBvZiB0aGUgc3RyZWFtCi0gICogICBvYmplY3RzIHdpbGwgYmUgcmVsZWFzZWQgdG8gdGhlIGhlYXAuCi0gICoKLSAgKiAgIFRoZSBzdHJlYW0gaW1wbGVtZW50YXRpb24gaXMgdmVyeSBiYXNpYyBhbmQgcmVzZXRzIHRoZSBkZWNvbXByZXNzaW9uCi0gICogICBwcm9jZXNzIGVhY2ggdGltZSBzZWVraW5nIGJhY2t3YXJkcyBpcyBuZWVkZWQgd2l0aGluIHRoZSBzdHJlYW0uCi0gICoKLSAgKiAgIEluIGNlcnRhaW4gYnVpbGRzIG9mIHRoZSBsaWJyYXJ5LCBiemlwMiBjb21wcmVzc2lvbiByZWNvZ25pdGlvbiBpcwotICAqICAgYXV0b21hdGljYWxseSBoYW5kbGVkIHdoZW4gY2FsbGluZyBARlRfTmV3X0ZhY2Ugb3IgQEZUX09wZW5fRmFjZS4KLSAgKiAgIFRoaXMgbWVhbnMgdGhhdCBpZiBubyBmb250IGRyaXZlciBpcyBjYXBhYmxlIG9mIGhhbmRsaW5nIHRoZSByYXcKLSAgKiAgIGNvbXByZXNzZWQgZmlsZSwgdGhlIGxpYnJhcnkgd2lsbCB0cnkgdG8gb3BlbiBhIGJ6aXAyIGNvbXByZXNzZWQgc3RyZWFtCi0gICogICBmcm9tIGl0IGFuZCByZS1vcGVuIHRoZSBmYWNlIHdpdGggaXQuCi0gICoKLSAgKiAgIFRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZScgaWYgeW91ciBidWlsZAotICAqICAgb2YgRnJlZVR5cGUgd2FzIG5vdCBjb21waWxlZCB3aXRoIGJ6aXAyIHN1cHBvcnQuCi0gICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fT3BlbkJ6aXAyKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzb3VyY2UgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRCWklQMl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRjYWNoZS5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdGNhY2hlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMGU5MjUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdGNhY2hlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Y2FjaGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBDYWNoZSBzdWJzeXN0ZW0gKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDA4LCAyMDEwLCAyMDEzLCAyMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUQ0FDSEVfSF9fCi0jZGVmaW5lIF9fRlRDQUNIRV9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0dMWVBIX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIDxTZWN0aW9uPgotICAgKiAgICBjYWNoZV9zdWJzeXN0ZW0KLSAgICoKLSAgICogPFRpdGxlPgotICAgKiAgICBDYWNoZSBTdWItU3lzdGVtCi0gICAqCi0gICAqIDxBYnN0cmFjdD4KLSAgICogICAgSG93IHRvIGNhY2hlIGZhY2UsIHNpemUsIGFuZCBnbHlwaCBkYXRhIHdpdGggRnJlZVR5cGV+Mi4KLSAgICoKLSAgICogPERlc2NyaXB0aW9uPgotICAgKiAgIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIEZyZWVUeXBlfjIgY2FjaGUgc3ViLXN5c3RlbSwgd2hpY2ggaXMgdXNlZAotICAgKiAgIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgY29uY3VycmVudGx5IG9wZW5lZCBARlRfRmFjZSBhbmQgQEZUX1NpemUKLSAgICogICBvYmplY3RzLCBhcyB3ZWxsIGFzIGNhY2hpbmcgaW5mb3JtYXRpb24gbGlrZSBjaGFyYWN0ZXIgbWFwcyBhbmQgZ2x5cGgKLSAgICogICBpbWFnZXMgd2hpbGUgbGltaXRpbmcgdGhlaXIgbWF4aW11bSBtZW1vcnkgdXNhZ2UuCi0gICAqCi0gICAqICAgTm90ZSB0aGF0IGFsbCB0eXBlcyBhbmQgZnVuY3Rpb25zIGJlZ2luIHdpdGggdGhlIGBGVENfJyBwcmVmaXguCi0gICAqCi0gICAqICAgVGhlIGNhY2hlIGlzIGhpZ2hseSBwb3J0YWJsZSBhbmQgdGh1cyBkb2Vzbid0IGtub3cgYW55dGhpbmcgYWJvdXQgdGhlCi0gICAqICAgZm9udHMgaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtLCBvciBob3cgdG8gYWNjZXNzIHRoZW0uICBUaGlzIGltcGxpZXMKLSAgICogICB0aGUgZm9sbG93aW5nIHNjaGVtZToKLSAgICoKLSAgICogICBGaXJzdCwgYXZhaWxhYmxlIG9yIGluc3RhbGxlZCBmb250IGZhY2VzIGFyZSB1bmlxdWVseSBpZGVudGlmaWVkIGJ5Ci0gICAqICAgQEZUQ19GYWNlSUQgdmFsdWVzLCBwcm92aWRlZCB0byB0aGUgY2FjaGUgYnkgdGhlIGNsaWVudC4gIE5vdGUgdGhhdAotICAgKiAgIHRoZSBjYWNoZSBvbmx5IHN0b3JlcyBhbmQgY29tcGFyZXMgdGhlc2UgdmFsdWVzLCBhbmQgZG9lc24ndCB0cnkgdG8KLSAgICogICBpbnRlcnByZXQgdGhlbSBpbiBhbnkgd2F5LgotICAgKgotICAgKiAgIFNlY29uZCwgdGhlIGNhY2hlIGNhbGxzLCBvbmx5IHdoZW4gbmVlZGVkLCBhIGNsaWVudC1wcm92aWRlZCBmdW5jdGlvbgotICAgKiAgIHRvIGNvbnZlcnQgYW4gQEZUQ19GYWNlSUQgaW50byBhIG5ldyBARlRfRmFjZSBvYmplY3QuICBUaGUgbGF0dGVyIGlzCi0gICAqICAgdGhlbiBjb21wbGV0ZWx5IG1hbmFnZWQgYnkgdGhlIGNhY2hlLCBpbmNsdWRpbmcgaXRzIHRlcm1pbmF0aW9uCi0gICAqICAgdGhyb3VnaCBARlRfRG9uZV9GYWNlLiAgVG8gbW9uaXRvciB0ZXJtaW5hdGlvbiBvZiBmYWNlIG9iamVjdHMsIHRoZQotICAgKiAgIGZpbmFsaXplciBjYWxsYmFjayBpbiB0aGUgYGdlbmVyaWMnIGZpZWxkIG9mIHRoZSBARlRfRmFjZSBvYmplY3QgY2FuCi0gICAqICAgYmUgdXNlZCwgd2hpY2ggbWlnaHQgYWxzbyBiZSB1c2VkIHRvIHN0b3JlIHRoZSBARlRDX0ZhY2VJRCBvZiB0aGUKLSAgICogICBmYWNlLgotICAgKgotICAgKiAgIENsaWVudHMgYXJlIGZyZWUgdG8gbWFwIGZhY2UgSURzIHRvIGFueXRoaW5nIGVsc2UuICBUaGUgbW9zdCBzaW1wbGUKLSAgICogICB1c2FnZSBpcyB0byBhc3NvY2lhdGUgdGhlbSB0byBhIChwYXRobmFtZSxmYWNlX2luZGV4KSBwYWlyIHRoYXQgaXMKLSAgICogICB1c2VkIHRvIGNhbGwgQEZUX05ld19GYWNlLiAgSG93ZXZlciwgbW9yZSBjb21wbGV4IHNjaGVtZXMgYXJlIGFsc28KLSAgICogICBwb3NzaWJsZS4KLSAgICoKLSAgICogICBOb3RlIHRoYXQgZm9yIHRoZSBjYWNoZSB0byB3b3JrIGNvcnJlY3RseSwgdGhlIGZhY2UgSUQgdmFsdWVzIG11c3QgYmUKLSAgICogICAqcGVyc2lzdGVudCosIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGNvbnRlbnRzIHRoZXkgcG9pbnQgdG8gc2hvdWxkIG5vdAotICAgKiAgIGNoYW5nZSBhdCBydW50aW1lLCBvciB0aGF0IHRoZWlyIHZhbHVlIHNob3VsZCBub3QgYmVjb21lIGludmFsaWQuCi0gICAqCi0gICAqICAgSWYgdGhpcyBpcyB1bmF2b2lkYWJsZSAoZS5nLiwgd2hlbiBhIGZvbnQgaXMgdW5pbnN0YWxsZWQgYXQgcnVudGltZSksCi0gICAqICAgeW91IHNob3VsZCBjYWxsIEBGVENfTWFuYWdlcl9SZW1vdmVGYWNlSUQgYXMgc29vbiBhcyBwb3NzaWJsZSwgdG8gbGV0Ci0gICAqICAgdGhlIGNhY2hlIGdldCByaWQgb2YgYW55IHJlZmVyZW5jZXMgdG8gdGhlIG9sZCBARlRDX0ZhY2VJRCBpdCBtYXkKLSAgICogICBrZWVwIGludGVybmFsbHkuICBGYWlsdXJlIHRvIGRvIHNvIHdpbGwgbGVhZCB0byBpbmNvcnJlY3QgYmVoYXZpb3VyCi0gICAqICAgb3IgZXZlbiBjcmFzaGVzLgotICAgKgotICAgKiAgIFRvIHVzZSB0aGUgY2FjaGUsIHN0YXJ0IHdpdGggY2FsbGluZyBARlRDX01hbmFnZXJfTmV3IHRvIGNyZWF0ZSBhIG5ldwotICAgKiAgIEBGVENfTWFuYWdlciBvYmplY3QsIHdoaWNoIG1vZGVscyBhIHNpbmdsZSBjYWNoZSBpbnN0YW5jZS4gIFlvdSBjYW4KLSAgICogICB0aGVuIGxvb2sgdXAgQEZUX0ZhY2UgYW5kIEBGVF9TaXplIG9iamVjdHMgd2l0aAotICAgKiAgIEBGVENfTWFuYWdlcl9Mb29rdXBGYWNlIGFuZCBARlRDX01hbmFnZXJfTG9va3VwU2l6ZSwgcmVzcGVjdGl2ZWx5LgotICAgKgotICAgKiAgIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgY2hhcm1hcCBjYWNoaW5nLCBjYWxsIEBGVENfQ01hcENhY2hlX05ldywgdGhlbgotICAgKiAgIGxhdGVyIHVzZSBARlRDX0NNYXBDYWNoZV9Mb29rdXAgdG8gcGVyZm9ybSB0aGUgZXF1aXZhbGVudCBvZgotICAgKiAgIEBGVF9HZXRfQ2hhcl9JbmRleCwgb25seSBtdWNoIGZhc3Rlci4KLSAgICoKLSAgICogICBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIEBGVF9HbHlwaCBjYWNoaW5nLCBjYWxsIEBGVENfSW1hZ2VDYWNoZSwgdGhlbgotICAgKiAgIGxhdGVyIHVzZSBARlRDX0ltYWdlQ2FjaGVfTG9va3VwIHRvIHJldHJpZXZlIHRoZSBjb3JyZXNwb25kaW5nCi0gICAqICAgQEZUX0dseXBoIG9iamVjdHMgZnJvbSB0aGUgY2FjaGUuCi0gICAqCi0gICAqICAgSWYgeW91IG5lZWQgbG90cyBvZiBzbWFsbCBiaXRtYXBzLCBpdCBpcyBtdWNoIG1vcmUgbWVtb3J5IGVmZmljaWVudAotICAgKiAgIHRvIGNhbGwgQEZUQ19TQml0Q2FjaGVfTmV3IGZvbGxvd2VkIGJ5IEBGVENfU0JpdENhY2hlX0xvb2t1cC4gIFRoaXMKLSAgICogICByZXR1cm5zIEBGVENfU0JpdFJlYyBzdHJ1Y3R1cmVzLCB3aGljaCBhcmUgdXNlZCB0byBzdG9yZSBzbWFsbAotICAgKiAgIGJpdG1hcHMgZGlyZWN0bHkuICAoQSBzbWFsbCBiaXRtYXAgaXMgb25lIHdob3NlIG1ldHJpY3MgYW5kCi0gICAqICAgZGltZW5zaW9ucyBhbGwgZml0IGludG8gOC1iaXQgaW50ZWdlcnMpLgotICAgKgotICAgKiAgIFdlIGhvcGUgdG8gYWxzbyBwcm92aWRlIGEga2VybmluZyBjYWNoZSBpbiB0aGUgbmVhciBmdXR1cmUuCi0gICAqCi0gICAqCi0gICAqIDxPcmRlcj4KLSAgICogICBGVENfTWFuYWdlcgotICAgKiAgIEZUQ19GYWNlSUQKLSAgICogICBGVENfRmFjZV9SZXF1ZXN0ZXIKLSAgICoKLSAgICogICBGVENfTWFuYWdlcl9OZXcKLSAgICogICBGVENfTWFuYWdlcl9SZXNldAotICAgKiAgIEZUQ19NYW5hZ2VyX0RvbmUKLSAgICogICBGVENfTWFuYWdlcl9Mb29rdXBGYWNlCi0gICAqICAgRlRDX01hbmFnZXJfTG9va3VwU2l6ZQotICAgKiAgIEZUQ19NYW5hZ2VyX1JlbW92ZUZhY2VJRAotICAgKgotICAgKiAgIEZUQ19Ob2RlCi0gICAqICAgRlRDX05vZGVfVW5yZWYKLSAgICoKLSAgICogICBGVENfSW1hZ2VDYWNoZQotICAgKiAgIEZUQ19JbWFnZUNhY2hlX05ldwotICAgKiAgIEZUQ19JbWFnZUNhY2hlX0xvb2t1cAotICAgKgotICAgKiAgIEZUQ19TQml0Ci0gICAqICAgRlRDX1NCaXRDYWNoZQotICAgKiAgIEZUQ19TQml0Q2FjaGVfTmV3Ci0gICAqICAgRlRDX1NCaXRDYWNoZV9Mb29rdXAKLSAgICoKLSAgICogICBGVENfQ01hcENhY2hlCi0gICAqICAgRlRDX0NNYXBDYWNoZV9OZXcKLSAgICogICBGVENfQ01hcENhY2hlX0xvb2t1cAotICAgKgotICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgIEJBU0lDIFRZUEUgREVGSU5JVElPTlMgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAdHlwZTogRlRDX0ZhY2VJRAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQW4gb3BhcXVlIHBvaW50ZXIgdHlwZSB0aGF0IGlzIHVzZWQgdG8gaWRlbnRpdHkgZmFjZSBvYmplY3RzLiAgVGhlCi0gICAqICAgY29udGVudHMgb2Ygc3VjaCBvYmplY3RzIGlzIGFwcGxpY2F0aW9uLWRlcGVuZGVudC4KLSAgICoKLSAgICogICBUaGVzZSBwb2ludGVycyBhcmUgdHlwaWNhbGx5IHVzZWQgdG8gcG9pbnQgdG8gYSB1c2VyLWRlZmluZWQKLSAgICogICBzdHJ1Y3R1cmUgY29udGFpbmluZyBhIGZvbnQgZmlsZSBwYXRoLCBhbmQgZmFjZSBpbmRleC4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgTmV2ZXIgdXNlIE5VTEwgYXMgYSB2YWxpZCBARlRDX0ZhY2VJRC4KLSAgICoKLSAgICogICBGYWNlIElEcyBhcmUgcGFzc2VkIGJ5IHRoZSBjbGllbnQgdG8gdGhlIGNhY2hlIG1hbmFnZXIgdGhhdCBjYWxscywKLSAgICogICB3aGVuIG5lZWRlZCwgdGhlIEBGVENfRmFjZV9SZXF1ZXN0ZXIgdG8gdHJhbnNsYXRlIHRoZW0gaW50byBuZXcKLSAgICogICBARlRfRmFjZSBvYmplY3RzLgotICAgKgotICAgKiAgIElmIHRoZSBjb250ZW50IG9mIGEgZ2l2ZW4gZmFjZSBJRCBjaGFuZ2VzIGF0IHJ1bnRpbWUsIG9yIGlmIHRoZSB2YWx1ZQotICAgKiAgIGJlY29tZXMgaW52YWxpZCAoZS5nLiwgd2hlbiB1bmluc3RhbGxpbmcgYSBmb250KSwgeW91IHNob3VsZAotICAgKiAgIGltbWVkaWF0ZWx5IGNhbGwgQEZUQ19NYW5hZ2VyX1JlbW92ZUZhY2VJRCBiZWZvcmUgYW55IG90aGVyIGNhY2hlCi0gICAqICAgZnVuY3Rpb24uCi0gICAqCi0gICAqICAgRmFpbHVyZSB0byBkbyBzbyB3aWxsIHJlc3VsdCBpbiBpbmNvcnJlY3QgYmVoYXZpb3VyIG9yIGV2ZW4KLSAgICogICBtZW1vcnkgbGVha3MgYW5kIGNyYXNoZXMuCi0gICAqLwotICB0eXBlZGVmIEZUX1BvaW50ZXIgIEZUQ19GYWNlSUQ7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdHlwZToKLSAgICogICBGVENfRmFjZV9SZXF1ZXN0ZXIKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgY2FsbGJhY2sgZnVuY3Rpb24gcHJvdmlkZWQgYnkgY2xpZW50IGFwcGxpY2F0aW9ucy4gIEl0IGlzIHVzZWQgYnkKLSAgICogICB0aGUgY2FjaGUgbWFuYWdlciB0byB0cmFuc2xhdGUgYSBnaXZlbiBARlRDX0ZhY2VJRCBpbnRvIGEgbmV3IHZhbGlkCi0gICAqICAgQEZUX0ZhY2Ugb2JqZWN0LCBvbiBkZW1hbmQuCi0gICAqCi0gICAqIDxJbnB1dD4KLSAgICogICBmYWNlX2lkIDo6Ci0gICAqICAgICBUaGUgZmFjZSBJRCB0byByZXNvbHZlLgotICAgKgotICAgKiAgIGxpYnJhcnkgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIGEgRnJlZVR5cGUgbGlicmFyeSBvYmplY3QuCi0gICAqCi0gICAqICAgcmVxX2RhdGEgOjoKLSAgICogICAgIEFwcGxpY2F0aW9uLXByb3ZpZGVkIHJlcXVlc3QgZGF0YSAoc2VlIG5vdGUgYmVsb3cpLgotICAgKgotICAgKiA8T3V0cHV0PgotICAgKiAgIGFmYWNlIDo6Ci0gICAqICAgICBBIG5ldyBARlRfRmFjZSBoYW5kbGUuCi0gICAqCi0gICAqIDxSZXR1cm4+Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogPE5vdGU+Ci0gICAqICAgVGhlIHRoaXJkIHBhcmFtZXRlciBgcmVxX2RhdGEnIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgcGFzc2VkIGJ5IHRoZQotICAgKiAgIGNsaWVudCB3aGVuIEBGVENfTWFuYWdlcl9OZXcgaXMgY2FsbGVkLgotICAgKgotICAgKiAgIFRoZSBmYWNlIHJlcXVlc3RlciBzaG91bGQgbm90IHBlcmZvcm0gZnVubnkgdGhpbmdzIG9uIHRoZSByZXR1cm5lZAotICAgKiAgIGZhY2Ugb2JqZWN0LCBsaWtlIGNyZWF0aW5nIGEgbmV3IEBGVF9TaXplIGZvciBpdCwgb3Igc2V0dGluZyBhCi0gICAqICAgdHJhbnNmb3JtYXRpb24gdGhyb3VnaCBARlRfU2V0X1RyYW5zZm9ybSEKLSAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVENfRmFjZV9SZXF1ZXN0ZXIpKCBGVENfRmFjZUlEICBmYWNlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgcmVxX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSogICAgYWZhY2UgKTsKLQotICAvKiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICBDQUNIRSBNQU5BR0VSIE9CSkVDVCAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19NYW5hZ2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgb2JqZWN0IGNvcnJlc3BvbmRzIHRvIG9uZSBpbnN0YW5jZSBvZiB0aGUgY2FjaGUtc3Vic3lzdGVtLiAgICAqLwotICAvKiAgICBJdCBpcyB1c2VkIHRvIGNhY2hlIG9uZSBvciBtb3JlIEBGVF9GYWNlIG9iamVjdHMsIGFsb25nIHdpdGggICAgICAgKi8KLSAgLyogICAgY29ycmVzcG9uZGluZyBARlRfU2l6ZSBvYmplY3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbWFuYWdlciBpbnRlbnRpb25hbGx5IGxpbWl0cyB0aGUgdG90YWwgbnVtYmVyIG9mIG9wZW5lZCAgICAgICAgKi8KLSAgLyogICAgQEZUX0ZhY2UgYW5kIEBGVF9TaXplIG9iamVjdHMgdG8gY29udHJvbCBtZW1vcnkgdXNhZ2UuICBTZWUgdGhlICAgICovCi0gIC8qICAgIGBtYXhfZmFjZXMnIGFuZCBgbWF4X3NpemVzJyBwYXJhbWV0ZXJzIG9mIEBGVENfTWFuYWdlcl9OZXcuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIG1hbmFnZXIgaXMgYWxzbyB1c2VkIHRvIGNhY2hlIGBub2Rlcycgb2YgdmFyaW91cyB0eXBlcyB3aGlsZSAgICovCi0gIC8qICAgIGxpbWl0aW5nIHRoZWlyIHRvdGFsIG1lbW9yeSB1c2FnZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQWxsIGxpbWl0YXRpb25zIGFyZSBlbmZvcmNlZCBieSBrZWVwaW5nIGxpc3RzIG9mIG1hbmFnZWQgb2JqZWN0cyAgICovCi0gIC8qICAgIGluIG1vc3QtcmVjZW50bHktdXNlZCBvcmRlciwgYW5kIGZsdXNoaW5nIG9sZCBub2RlcyB0byBtYWtlIHJvb20gICAqLwotICAvKiAgICBmb3IgbmV3IG9uZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUQ19NYW5hZ2VyUmVjXyogIEZUQ19NYW5hZ2VyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX05vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gb3BhcXVlIGhhbmRsZSB0byBhIGNhY2hlIG5vZGUgb2JqZWN0LiAgRWFjaCBjYWNoZSBub2RlIGlzICAgICAgICovCi0gIC8qICAgIHJlZmVyZW5jZS1jb3VudGVkLiAgQSBub2RlIHdpdGggYSBjb3VudCBvZn4wIG1pZ2h0IGJlIGZsdXNoZWQgICAgICAqLwotICAvKiAgICBvdXQgb2YgYSBmdWxsIGNhY2hlIHdoZW5ldmVyIGEgbG9va3VwIHJlcXVlc3QgaXMgcGVyZm9ybWVkLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHlvdSBsb29rIHVwIG5vZGVzLCB5b3UgaGF2ZSB0aGUgYWJpbGl0eSB0byBgYWNxdWlyZScgdGhlbSwgICAgICAqLwotICAvKiAgICBpLmUuLCB0byBpbmNyZW1lbnQgdGhlaXIgcmVmZXJlbmNlIGNvdW50LiAgVGhpcyB3aWxsIHByZXZlbnQgdGhlICAgKi8KLSAgLyogICAgbm9kZSBmcm9tIGJlaW5nIGZsdXNoZWQgb3V0IG9mIHRoZSBjYWNoZSB1bnRpbCB5b3UgZXhwbGljaXRseSAgICAgICovCi0gIC8qICAgIGByZWxlYXNlJyBpdCAoc2VlIEBGVENfTm9kZV9VbnJlZikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VlIGFsc28gQEZUQ19TQml0Q2FjaGVfTG9va3VwIGFuZCBARlRDX0ltYWdlQ2FjaGVfTG9va3VwLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVENfTm9kZVJlY18qICBGVENfTm9kZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19NYW5hZ2VyX05ldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENyZWF0ZSBhIG5ldyBjYWNoZSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICA6OiBUaGUgcGFyZW50IEZyZWVUeXBlIGxpYnJhcnkgaGFuZGxlIHRvIHVzZS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4X2ZhY2VzIDo6IE1heGltdW0gbnVtYmVyIG9mIG9wZW5lZCBARlRfRmFjZSBvYmplY3RzIG1hbmFnZWQgYnkgICovCi0gIC8qICAgICAgICAgICAgICAgICB0aGlzIGNhY2hlIGluc3RhbmNlLiAgVXNlfjAgZm9yIGRlZmF1bHRzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4X3NpemVzIDo6IE1heGltdW0gbnVtYmVyIG9mIG9wZW5lZCBARlRfU2l6ZSBvYmplY3RzIG1hbmFnZWQgYnkgICovCi0gIC8qICAgICAgICAgICAgICAgICB0aGlzIGNhY2hlIGluc3RhbmNlLiAgVXNlfjAgZm9yIGRlZmF1bHRzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4X2J5dGVzIDo6IE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHVzZSBmb3IgY2FjaGVkIGRhdGEgbm9kZXMuICovCi0gIC8qICAgICAgICAgICAgICAgICBVc2V+MCBmb3IgZGVmYXVsdHMuICBOb3RlIHRoYXQgdGhpcyB2YWx1ZSBkb2VzIG5vdCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgYWNjb3VudCBmb3IgbWFuYWdlZCBARlRfRmFjZSBhbmQgQEZUX1NpemUgb2JqZWN0cy4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJlcXVlc3RlciA6OiBBbiBhcHBsaWNhdGlvbi1wcm92aWRlZCBjYWxsYmFjayB1c2VkIHRvIHRyYW5zbGF0ZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgZmFjZSBJRHMgaW50byByZWFsIEBGVF9GYWNlIG9iamVjdHMuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJlcV9kYXRhICA6OiBBIGdlbmVyaWMgcG9pbnRlciB0aGF0IGlzIHBhc3NlZCB0byB0aGUgcmVxdWVzdGVyICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgZWFjaCB0aW1lIGl0IGlzIGNhbGxlZCAoc2VlIEBGVENfRmFjZV9SZXF1ZXN0ZXIpLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbWFuYWdlciAgOjogQSBoYW5kbGUgdG8gYSBuZXcgbWFuYWdlciBvYmplY3QuICAwfmluIGNhc2Ugb2YgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGZhaWx1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRDX01hbmFnZXJfTmV3KCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgICBtYXhfZmFjZXMsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgICBtYXhfc2l6ZXMsCi0gICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICAgICBtYXhfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgRlRDX0ZhY2VfUmVxdWVzdGVyICByZXF1ZXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgICAgICAgICByZXFfZGF0YSwKLSAgICAgICAgICAgICAgICAgICBGVENfTWFuYWdlciAgICAgICAgKmFtYW5hZ2VyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfTWFuYWdlcl9SZXNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFbXB0eSBhIGdpdmVuIGNhY2hlIG1hbmFnZXIuICBUaGlzIHNpbXBseSBnZXRzIHJpZCBvZiBhbGwgdGhlICAgICAgKi8KLSAgLyogICAgY3VycmVudGx5IGNhY2hlZCBARlRfRmFjZSBhbmQgQEZUX1NpemUgb2JqZWN0cyB3aXRoaW4gdGhlIG1hbmFnZXIuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWFuYWdlciA6OiBBIGhhbmRsZSB0byB0aGUgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVENfTWFuYWdlcl9SZXNldCggRlRDX01hbmFnZXIgIG1hbmFnZXIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19NYW5hZ2VyX0RvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlc3Ryb3kgYSBnaXZlbiBtYW5hZ2VyIGFmdGVyIGVtcHR5aW5nIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hbmFnZXIgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBjYWNoZSBtYW5hZ2VyIG9iamVjdC4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRDX01hbmFnZXJfRG9uZSggRlRDX01hbmFnZXIgIG1hbmFnZXIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19NYW5hZ2VyX0xvb2t1cEZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHJpZXZlIHRoZSBARlRfRmFjZSBvYmplY3QgdGhhdCBjb3JyZXNwb25kcyB0byBhIGdpdmVuIGZhY2UgSUQgICAqLwotICAvKiAgICB0aHJvdWdoIGEgY2FjaGUgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYW5hZ2VyIDo6IEEgaGFuZGxlIHRvIHRoZSBjYWNoZSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfaWQgOjogVGhlIElEIG9mIHRoZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXR1cm5lZCBARlRfRmFjZSBvYmplY3QgaXMgYWx3YXlzIG93bmVkIGJ5IHRoZSBtYW5hZ2VyLiAgWW91ICAqLwotICAvKiAgICBzaG91bGQgbmV2ZXIgdHJ5IHRvIGRpc2NhcmQgaXQgeW91cnNlbGYuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBARlRfRmFjZSBvYmplY3QgZG9lc24ndCBuZWNlc3NhcmlseSBoYXZlIGEgY3VycmVudCBzaXplIG9iamVjdCAqLwotICAvKiAgICAoaS5lLiwgZmFjZS0+c2l6ZSBjYW4gYmV+MCkuICBJZiB5b3UgbmVlZCBhIHNwZWNpZmljIGBmb250IHNpemUnLCAgKi8KLSAgLyogICAgdXNlIEBGVENfTWFuYWdlcl9Mb29rdXBTaXplIGluc3RlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOZXZlciBjaGFuZ2UgdGhlIGZhY2UncyB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggKGkuZS4sIG5ldmVyIGNhbGwgICAgKi8KLSAgLyogICAgdGhlIEBGVF9TZXRfVHJhbnNmb3JtIGZ1bmN0aW9uKSBvbiBhIHJldHVybmVkIGZhY2UhICBJZiB5b3UgbmVlZCAgICovCi0gIC8qICAgIHRvIHRyYW5zZm9ybSBnbHlwaHMsIGRvIGl0IHlvdXJzZWxmIGFmdGVyIGdseXBoIGxvYWRpbmcuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2hlbiB5b3UgcGVyZm9ybSBhIGxvb2t1cCwgb3V0LW9mLW1lbW9yeSBlcnJvcnMgYXJlIGRldGVjdGVkICAgICAgICovCi0gIC8qICAgIF93aXRoaW5fIHRoZSBsb29rdXAgYW5kIGZvcmNlIGluY3JlbWVudGFsIGZsdXNoZXMgb2YgdGhlIGNhY2hlICAgICAqLwotICAvKiAgICB1bnRpbCBlbm91Z2ggbWVtb3J5IGlzIHJlbGVhc2VkIGZvciB0aGUgbG9va3VwIHRvIHN1Y2NlZWQuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGEgbG9va3VwIGZhaWxzIHdpdGggYEZUX0Vycl9PdXRfT2ZfTWVtb3J5JyB0aGUgY2FjaGUgaGFzICAgICAgICAqLwotICAvKiAgICBhbHJlYWR5IGJlZW4gY29tcGxldGVseSBmbHVzaGVkLCBhbmQgc3RpbGwgbm8gbWVtb3J5IHdhcyBhdmFpbGFibGUgKi8KLSAgLyogICAgZm9yIHRoZSBvcGVyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRDX01hbmFnZXJfTG9va3VwRmFjZSggRlRDX01hbmFnZXIgIG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19GYWNlSUQgICBmYWNlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAqYWZhY2UgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19TY2FsZXJSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgYSBnaXZlbiBjaGFyYWN0ZXIgc2l6ZSBpbiBlaXRoZXIgICAgICAqLwotICAvKiAgICBwaXhlbHMgb3IgcG9pbnRzIHRvIHRoZSBjYWNoZSBtYW5hZ2VyLiAgU2VlICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUQ19NYW5hZ2VyX0xvb2t1cFNpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pZCA6OiBUaGUgc291cmNlIGZhY2UgSUQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB3aWR0aCAgIDo6IFRoZSBjaGFyYWN0ZXIgd2lkdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhlaWdodCAgOjogVGhlIGNoYXJhY3RlciBoZWlnaHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGl4ZWwgICA6OiBBIEJvb2xlYW4uICBJZiAxLCB0aGUgYHdpZHRoJyBhbmQgYGhlaWdodCcgZmllbGRzIGFyZSAgICovCi0gIC8qICAgICAgICAgICAgICAgaW50ZXJwcmV0ZWQgYXMgaW50ZWdlciBwaXhlbCBjaGFyYWN0ZXIgc2l6ZXMuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhleSBhcmUgZXhwcmVzc2VkIGFzIDEvNjR0aCBvZiBwb2ludHMuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHhfcmVzICAgOjogT25seSB1c2VkIHdoZW4gYHBpeGVsJyBpcyB2YWx1ZX4wIHRvIGluZGljYXRlIHRoZSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIGhvcml6b250YWwgcmVzb2x1dGlvbiBpbiBkcGkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHlfcmVzICAgOjogT25seSB1c2VkIHdoZW4gYHBpeGVsJyBpcyB2YWx1ZX4wIHRvIGluZGljYXRlIHRoZSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIHZlcnRpY2FsIHJlc29sdXRpb24gaW4gZHBpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHR5cGUgaXMgbWFpbmx5IHVzZWQgdG8gcmV0cmlldmUgQEZUX1NpemUgb2JqZWN0cyB0aHJvdWdoIHRoZSAgKi8KLSAgLyogICAgY2FjaGUgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRDX1NjYWxlclJlY18KLSAgewotICAgIEZUQ19GYWNlSUQgIGZhY2VfaWQ7Ci0gICAgRlRfVUludCAgICAgd2lkdGg7Ci0gICAgRlRfVUludCAgICAgaGVpZ2h0OwotICAgIEZUX0ludCAgICAgIHBpeGVsOwotICAgIEZUX1VJbnQgICAgIHhfcmVzOwotICAgIEZUX1VJbnQgICAgIHlfcmVzOwotCi0gIH0gRlRDX1NjYWxlclJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19TY2FsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGFuIEBGVENfU2NhbGVyUmVjIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRDX1NjYWxlclJlY18qICBGVENfU2NhbGVyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX01hbmFnZXJfTG9va3VwU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmUgdGhlIEBGVF9TaXplIG9iamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgZ2l2ZW4gICAgICAgICAgICovCi0gIC8qICAgIEBGVENfU2NhbGVyUmVjIHBvaW50ZXIgdGhyb3VnaCBhIGNhY2hlIG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hbmFnZXIgOjogQSBoYW5kbGUgdG8gdGhlIGNhY2hlIG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2NhbGVyICA6OiBBIHNjYWxlciBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXNpemUgICA6OiBBIGhhbmRsZSB0byB0aGUgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJldHVybmVkIEBGVF9TaXplIG9iamVjdCBpcyBhbHdheXMgb3duZWQgYnkgdGhlIG1hbmFnZXIuICBZb3UgICovCi0gIC8qICAgIHNob3VsZCBuZXZlciB0cnkgdG8gZGlzY2FyZCBpdCBieSB5b3Vyc2VsZi4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgWW91IGNhbiBhY2Nlc3MgdGhlIHBhcmVudCBARlRfRmFjZSBvYmplY3Qgc2ltcGx5IGFzIGBzaXplLT5mYWNlJyAgICovCi0gIC8qICAgIGlmIHlvdSBuZWVkIGl0LiAgTm90ZSB0aGF0IHRoaXMgb2JqZWN0IGlzIGFsc28gb3duZWQgYnkgdGhlICAgICAgICAqLwotICAvKiAgICBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXaGVuIHlvdSBwZXJmb3JtIGEgbG9va3VwLCBvdXQtb2YtbWVtb3J5IGVycm9ycyBhcmUgZGV0ZWN0ZWQgICAgICAgKi8KLSAgLyogICAgX3dpdGhpbl8gdGhlIGxvb2t1cCBhbmQgZm9yY2UgaW5jcmVtZW50YWwgZmx1c2hlcyBvZiB0aGUgY2FjaGUgICAgICovCi0gIC8qICAgIHVudGlsIGVub3VnaCBtZW1vcnkgaXMgcmVsZWFzZWQgZm9yIHRoZSBsb29rdXAgdG8gc3VjY2VlZC4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgYSBsb29rdXAgZmFpbHMgd2l0aCBgRlRfRXJyX091dF9PZl9NZW1vcnknIHRoZSBjYWNoZSBoYXMgICAgICAgICovCi0gIC8qICAgIGFscmVhZHkgYmVlbiBjb21wbGV0ZWx5IGZsdXNoZWQsIGFuZCBzdGlsbCBubyBtZW1vcnkgaXMgYXZhaWxhYmxlICAqLwotICAvKiAgICBmb3IgdGhlIG9wZXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVENfTWFuYWdlcl9Mb29rdXBTaXplKCBGVENfTWFuYWdlciAgbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX1NjYWxlciAgIHNjYWxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZSAgICAgKmFzaXplICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfTm9kZV9VbnJlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZWNyZW1lbnQgYSBjYWNoZSBub2RlJ3MgaW50ZXJuYWwgcmVmZXJlbmNlIGNvdW50LiAgV2hlbiB0aGUgY291bnQgKi8KLSAgLyogICAgcmVhY2hlcyAwLCBpdCBpcyBub3QgZGVzdHJveWVkIGJ1dCBiZWNvbWVzIGVsaWdpYmxlIGZvciBzdWJzZXF1ZW50ICovCi0gIC8qICAgIGNhY2hlIGZsdXNoZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5vZGUgICAgOjogVGhlIGNhY2hlIG5vZGUgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWFuYWdlciA6OiBUaGUgY2FjaGUgbWFuYWdlciBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVENfTm9kZV9VbnJlZiggRlRDX05vZGUgICAgIG5vZGUsCi0gICAgICAgICAgICAgICAgICBGVENfTWFuYWdlciAgbWFuYWdlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUQ19NYW5hZ2VyX1JlbW92ZUZhY2VJRAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBzcGVjaWFsIGZ1bmN0aW9uIHVzZWQgdG8gaW5kaWNhdGUgdG8gdGhlIGNhY2hlIG1hbmFnZXIgdGhhdAotICAgKiAgIGEgZ2l2ZW4gQEZUQ19GYWNlSUQgaXMgbm8gbG9uZ2VyIHZhbGlkLCBlaXRoZXIgYmVjYXVzZSBpdHMKLSAgICogICBjb250ZW50IGNoYW5nZWQsIG9yIGJlY2F1c2UgaXQgd2FzIGRlYWxsb2NhdGVkIG9yIHVuaW5zdGFsbGVkLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgbWFuYWdlciA6OgotICAgKiAgICAgVGhlIGNhY2hlIG1hbmFnZXIgaGFuZGxlLgotICAgKgotICAgKiAgIGZhY2VfaWQgOjoKLSAgICogICAgIFRoZSBARlRDX0ZhY2VJRCB0byBiZSByZW1vdmVkLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGlzIGZ1bmN0aW9uIGZsdXNoZXMgYWxsIG5vZGVzIGZyb20gdGhlIGNhY2hlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcwotICAgKiAgIGBmYWNlX2lkJywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIG5vZGVzIHdpdGggYSBub24tbnVsbCByZWZlcmVuY2UKLSAgICogICBjb3VudC4KLSAgICoKLSAgICogICBTdWNoIG5vZGVzIGFyZSBob3dldmVyIG1vZGlmaWVkIGludGVybmFsbHkgc28gYXMgdG8gbmV2ZXIgYXBwZWFyCi0gICAqICAgaW4gbGF0ZXIgbG9va3VwcyB3aXRoIHRoZSBzYW1lIGBmYWNlX2lkJyB2YWx1ZSwgYW5kIHRvIGJlIGltbWVkaWF0ZWx5Ci0gICAqICAgZGVzdHJveWVkIHdoZW4gcmVsZWFzZWQgYnkgYWxsIHRoZWlyIHVzZXJzLgotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRDX01hbmFnZXJfUmVtb3ZlRmFjZUlEKCBGVENfTWFuYWdlciAgbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfRmFjZUlEICAgZmFjZV9pZCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2FjaGVfc3Vic3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAdHlwZToKLSAgICogICBGVENfQ01hcENhY2hlCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBbiBvcGFxdWUgaGFuZGxlIHVzZWQgdG8gbW9kZWwgYSBjaGFybWFwIGNhY2hlLiAgVGhpcyBjYWNoZSBpcyB0bwotICAgKiAgIGhvbGQgY2hhcmFjdGVyIGNvZGVzIC0+IGdseXBoIGluZGljZXMgbWFwcGluZ3MuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVENfQ01hcENhY2hlUmVjXyogIEZUQ19DTWFwQ2FjaGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRDX0NNYXBDYWNoZV9OZXcKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIENyZWF0ZSBhIG5ldyBjaGFybWFwIGNhY2hlLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgbWFuYWdlciA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIGNhY2hlIG1hbmFnZXIuCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgYWNhY2hlIDo6Ci0gICAqICAgICBBIG5ldyBjYWNoZSBoYW5kbGUuICBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgTGlrZSBhbGwgb3RoZXIgY2FjaGVzLCB0aGlzIG9uZSB3aWxsIGJlIGRlc3Ryb3llZCB3aXRoIHRoZSBjYWNoZQotICAgKiAgIG1hbmFnZXIuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRDX0NNYXBDYWNoZV9OZXcoIEZUQ19NYW5hZ2VyICAgICBtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgRlRDX0NNYXBDYWNoZSAgKmFjYWNoZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRDX0NNYXBDYWNoZV9Mb29rdXAKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRyYW5zbGF0ZSBhIGNoYXJhY3RlciBjb2RlIGludG8gYSBnbHlwaCBpbmRleCwgdXNpbmcgdGhlIGNoYXJtYXAKLSAgICogICBjYWNoZS4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGNhY2hlIDo6Ci0gICAqICAgICBBIGNoYXJtYXAgY2FjaGUgaGFuZGxlLgotICAgKgotICAgKiAgIGZhY2VfaWQgOjoKLSAgICogICAgIFRoZSBzb3VyY2UgZmFjZSBJRC4KLSAgICoKLSAgICogICBjbWFwX2luZGV4IDo6Ci0gICAqICAgICBUaGUgaW5kZXggb2YgdGhlIGNoYXJtYXAgaW4gdGhlIHNvdXJjZSBmYWNlLiAgQW55IG5lZ2F0aXZlIHZhbHVlCi0gICAqICAgICBtZWFucyB0byB1c2UgdGhlIGNhY2hlIEBGVF9GYWNlJ3MgZGVmYXVsdCBjaGFybWFwLgotICAgKgotICAgKiAgIGNoYXJfY29kZSA6OgotICAgKiAgICAgVGhlIGNoYXJhY3RlciBjb2RlIChpbiB0aGUgY29ycmVzcG9uZGluZyBjaGFybWFwKS4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICAgR2x5cGggaW5kZXguICAwfm1lYW5zIGBubyBnbHlwaCcuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX1VJbnQgKQotICBGVENfQ01hcENhY2hlX0xvb2t1cCggRlRDX0NNYXBDYWNoZSAgY2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVENfRmFjZUlEICAgICBmYWNlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgY21hcF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgICAgIGNoYXJfY29kZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2FjaGVfc3Vic3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgIElNQUdFIENBQ0hFIE9CSkVDVCAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAc3RydWN0OgotICAgKiAgIEZUQ19JbWFnZVR5cGVSZWMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgdGhlIHR5cGUgb2YgaW1hZ2VzIGluIGEgZ2x5cGggY2FjaGUuCi0gICAqCi0gICAqIEBmaWVsZHM6Ci0gICAqICAgZmFjZV9pZCA6OgotICAgKiAgICAgVGhlIGZhY2UgSUQuCi0gICAqCi0gICAqICAgd2lkdGggOjoKLSAgICogICAgIFRoZSB3aWR0aCBpbiBwaXhlbHMuCi0gICAqCi0gICAqICAgaGVpZ2h0IDo6Ci0gICAqICAgICBUaGUgaGVpZ2h0IGluIHBpeGVscy4KLSAgICoKLSAgICogICBmbGFncyA6OgotICAgKiAgICAgVGhlIGxvYWQgZmxhZ3MsIGFzIGluIEBGVF9Mb2FkX0dseXBoLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUQ19JbWFnZVR5cGVSZWNfCi0gIHsKLSAgICBGVENfRmFjZUlEICBmYWNlX2lkOwotICAgIEZUX0ludCAgICAgIHdpZHRoOwotICAgIEZUX0ludCAgICAgIGhlaWdodDsKLSAgICBGVF9JbnQzMiAgICBmbGFnczsKLQotICB9IEZUQ19JbWFnZVR5cGVSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAdHlwZToKLSAgICogICBGVENfSW1hZ2VUeXBlCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGhhbmRsZSB0byBhbiBARlRDX0ltYWdlVHlwZVJlYyBzdHJ1Y3R1cmUuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVENfSW1hZ2VUeXBlUmVjXyogIEZUQ19JbWFnZVR5cGU7Ci0KLQotICAvKiAqLwotCi0KLSNkZWZpbmUgRlRDX0lNQUdFX1RZUEVfQ09NUEFSRSggZDEsIGQyICkgICAgICBcCi0gICAgICAgICAgKCAoZDEpLT5mYWNlX2lkID09IChkMiktPmZhY2VfaWQgJiYgXAotICAgICAgICAgICAgKGQxKS0+d2lkdGggICA9PSAoZDIpLT53aWR0aCAgICYmIFwKLSAgICAgICAgICAgIChkMSktPmZsYWdzICAgPT0gKGQyKS0+ZmxhZ3MgICApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfSW1hZ2VDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIGdseXBoIGltYWdlIGNhY2hlIG9iamVjdC4gIFRoZXkgYXJlIGRlc2lnbmVkIHRvICAgICAgKi8KLSAgLyogICAgaG9sZCBtYW55IGRpc3RpbmN0IGdseXBoIGltYWdlcyB3aGlsZSBub3QgZXhjZWVkaW5nIGEgY2VydGFpbiAgICAgICovCi0gIC8qICAgIG1lbW9yeSB0aHJlc2hvbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRDX0ltYWdlQ2FjaGVSZWNfKiAgRlRDX0ltYWdlQ2FjaGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfSW1hZ2VDYWNoZV9OZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDcmVhdGUgYSBuZXcgZ2x5cGggaW1hZ2UgY2FjaGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYW5hZ2VyIDo6IFRoZSBwYXJlbnQgbWFuYWdlciBmb3IgdGhlIGltYWdlIGNhY2hlLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhY2FjaGUgIDo6IEEgaGFuZGxlIHRvIHRoZSBuZXcgZ2x5cGggaW1hZ2UgY2FjaGUgb2JqZWN0LiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVENfSW1hZ2VDYWNoZV9OZXcoIEZUQ19NYW5hZ2VyICAgICAgbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICBGVENfSW1hZ2VDYWNoZSAgKmFjYWNoZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX0ltYWdlQ2FjaGVfTG9va3VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmUgYSBnaXZlbiBnbHlwaCBpbWFnZSBmcm9tIGEgZ2x5cGggaW1hZ2UgY2FjaGUuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2FjaGUgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZ2x5cGggaW1hZ2UgY2FjaGUuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0eXBlICAgOjogQSBwb2ludGVyIHRvIGEgZ2x5cGggaW1hZ2UgdHlwZSBkZXNjcmlwdG9yLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdpbmRleCA6OiBUaGUgZ2x5cGggaW5kZXggdG8gcmV0cmlldmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFnbHlwaCA6OiBUaGUgY29ycmVzcG9uZGluZyBARlRfR2x5cGggb2JqZWN0LiAgMH5pbiBjYXNlIG9mICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgZmFpbHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFub2RlICA6OiBVc2VkIHRvIHJldHVybiB0aGUgYWRkcmVzcyBvZiBvZiB0aGUgY29ycmVzcG9uZGluZyBjYWNoZSAqLwotICAvKiAgICAgICAgICAgICAgbm9kZSBhZnRlciBpbmNyZW1lbnRpbmcgaXRzIHJlZmVyZW5jZSBjb3VudCAoc2VlIG5vdGUgICAgKi8KLSAgLyogICAgICAgICAgICAgIGJlbG93KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJldHVybmVkIGdseXBoIGlzIG93bmVkIGFuZCBtYW5hZ2VkIGJ5IHRoZSBnbHlwaCBpbWFnZSBjYWNoZS4gICovCi0gIC8qICAgIE5ldmVyIHRyeSB0byB0cmFuc2Zvcm0gb3IgZGlzY2FyZCBpdCBtYW51YWxseSEgIFlvdSBjYW4gaG93ZXZlciAgICAqLwotICAvKiAgICBjcmVhdGUgYSBjb3B5IHdpdGggQEZUX0dseXBoX0NvcHkgYW5kIG1vZGlmeSB0aGUgbmV3IG9uZS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGBhbm9kZScgaXMgX25vdF8gTlVMTCwgaXQgcmVjZWl2ZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGNhY2hlICAgICAqLwotICAvKiAgICBub2RlIGNvbnRhaW5pbmcgdGhlIGdseXBoIGltYWdlLCBhZnRlciBpbmNyZWFzaW5nIGl0cyByZWZlcmVuY2UgICAgKi8KLSAgLyogICAgY291bnQuICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbm9kZSAoYXMgd2VsbCBhcyB0aGUgQEZUX0dseXBoKSB3aWxsICovCi0gIC8qICAgIGFsd2F5cyBiZSBrZXB0IGluIHRoZSBjYWNoZSB1bnRpbCB5b3UgY2FsbCBARlRDX05vZGVfVW5yZWYgdG8gICAgICAqLwotICAvKiAgICBgcmVsZWFzZScgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGBhbm9kZScgaXMgTlVMTCwgdGhlIGNhY2hlIG5vZGUgaXMgbGVmdCB1bmNoYW5nZWQsIHdoaWNoIG1lYW5zICAqLwotICAvKiAgICB0aGF0IHRoZSBARlRfR2x5cGggY291bGQgYmUgZmx1c2hlZCBvdXQgb2YgdGhlIGNhY2hlIG9uIHRoZSBuZXh0ICAgKi8KLSAgLyogICAgY2FsbCB0byBvbmUgb2YgdGhlIGNhY2hpbmcgc3ViLXN5c3RlbSBBUElzLiAgRG9uJ3QgYXNzdW1lIHRoYXQgaXQgICovCi0gIC8qICAgIGlzIHBlcnNpc3RlbnQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUQ19JbWFnZUNhY2hlX0xvb2t1cCggRlRDX0ltYWdlQ2FjaGUgIGNhY2hlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19JbWFnZVR5cGUgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGggICAgICAgKmFnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVENfTm9kZSAgICAgICAqYW5vZGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19JbWFnZUNhY2hlX0xvb2t1cFNjYWxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdmFyaWFudCBvZiBARlRDX0ltYWdlQ2FjaGVfTG9va3VwIHRoYXQgdXNlcyBhbiBARlRDX1NjYWxlclJlYyAgICAqLwotICAvKiAgICB0byBzcGVjaWZ5IHRoZSBmYWNlIElEIGFuZCBpdHMgc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjYWNoZSAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZ2x5cGggaW1hZ2UgY2FjaGUuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNjYWxlciAgICAgOjogQSBwb2ludGVyIHRvIGEgc2NhbGVyIGRlc2NyaXB0b3IuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZF9mbGFncyA6OiBUaGUgY29ycmVzcG9uZGluZyBsb2FkIGZsYWdzLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnaW5kZXggICAgIDo6IFRoZSBnbHlwaCBpbmRleCB0byByZXRyaWV2ZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZ2x5cGggICAgIDo6IFRoZSBjb3JyZXNwb25kaW5nIEBGVF9HbHlwaCBvYmplY3QuICAwfmluIGNhc2Ugb2YgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBmYWlsdXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbm9kZSAgICAgIDo6IFVzZWQgdG8gcmV0dXJuIHRoZSBhZGRyZXNzIG9mIG9mIHRoZSBjb3JyZXNwb25kaW5nICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBjYWNoZSBub2RlIGFmdGVyIGluY3JlbWVudGluZyBpdHMgcmVmZXJlbmNlIGNvdW50ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgKHNlZSBub3RlIGJlbG93KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXR1cm5lZCBnbHlwaCBpcyBvd25lZCBhbmQgbWFuYWdlZCBieSB0aGUgZ2x5cGggaW1hZ2UgY2FjaGUuICAqLwotICAvKiAgICBOZXZlciB0cnkgdG8gdHJhbnNmb3JtIG9yIGRpc2NhcmQgaXQgbWFudWFsbHkhICBZb3UgY2FuIGhvd2V2ZXIgICAgKi8KLSAgLyogICAgY3JlYXRlIGEgY29weSB3aXRoIEBGVF9HbHlwaF9Db3B5IGFuZCBtb2RpZnkgdGhlIG5ldyBvbmUuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgYW5vZGUnIGlzIF9ub3RfIE5VTEwsIGl0IHJlY2VpdmVzIHRoZSBhZGRyZXNzIG9mIHRoZSBjYWNoZSAgICAgKi8KLSAgLyogICAgbm9kZSBjb250YWluaW5nIHRoZSBnbHlwaCBpbWFnZSwgYWZ0ZXIgaW5jcmVhc2luZyBpdHMgcmVmZXJlbmNlICAgICovCi0gIC8qICAgIGNvdW50LiAgVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG5vZGUgKGFzIHdlbGwgYXMgdGhlIEBGVF9HbHlwaCkgd2lsbCAqLwotICAvKiAgICBhbHdheXMgYmUga2VwdCBpbiB0aGUgY2FjaGUgdW50aWwgeW91IGNhbGwgQEZUQ19Ob2RlX1VucmVmIHRvICAgICAgKi8KLSAgLyogICAgYHJlbGVhc2UnIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgYW5vZGUnIGlzIE5VTEwsIHRoZSBjYWNoZSBub2RlIGlzIGxlZnQgdW5jaGFuZ2VkLCB3aGljaCBtZWFucyAgKi8KLSAgLyogICAgdGhhdCB0aGUgQEZUX0dseXBoIGNvdWxkIGJlIGZsdXNoZWQgb3V0IG9mIHRoZSBjYWNoZSBvbiB0aGUgbmV4dCAgICovCi0gIC8qICAgIGNhbGwgdG8gb25lIG9mIHRoZSBjYWNoaW5nIHN1Yi1zeXN0ZW0gQVBJcy4gIERvbid0IGFzc3VtZSB0aGF0IGl0ICAqLwotICAvKiAgICBpcyBwZXJzaXN0ZW50ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENhbGxzIHRvIEBGVF9TZXRfQ2hhcl9TaXplIGFuZCBmcmllbmRzIGhhdmUgbm8gZWZmZWN0IG9uIGNhY2hlZCAgICAqLwotICAvKiAgICBnbHlwaHM7IHlvdSBzaG91bGQgYWx3YXlzIHVzZSB0aGUgRnJlZVR5cGUgY2FjaGUgQVBJIGluc3RlYWQuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVENfSW1hZ2VDYWNoZV9Mb29rdXBTY2FsZXIoIEZUQ19JbWFnZUNhY2hlICBjYWNoZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfU2NhbGVyICAgICAgc2NhbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICBsb2FkX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGggICAgICAgKmFnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfTm9kZSAgICAgICAqYW5vZGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19TQml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgc21hbGwgYml0bWFwIGRlc2NyaXB0b3IuICBTZWUgdGhlIEBGVENfU0JpdFJlYyAgICAgICAqLwotICAvKiAgICBzdHJ1Y3R1cmUgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUQ19TQml0UmVjXyogIEZUQ19TQml0OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX1NCaXRSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB2ZXJ5IGNvbXBhY3Qgc3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgYSBzbWFsbCBnbHlwaCBiaXRtYXAuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2lkdGggICAgIDo6IFRoZSBiaXRtYXAgd2lkdGggaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZWlnaHQgICAgOjogVGhlIGJpdG1hcCBoZWlnaHQgaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlZnQgICAgICA6OiBUaGUgaG9yaXpvbnRhbCBkaXN0YW5jZSBmcm9tIHRoZSBwZW4gcG9zaXRpb24gdG8gdGhlICAqLwotICAvKiAgICAgICAgICAgICAgICAgbGVmdCBiaXRtYXAgYm9yZGVyIChhLmsuYS4gYGxlZnQgc2lkZSBiZWFyaW5nJywgb3IgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGBsc2InKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0b3AgICAgICAgOjogVGhlIHZlcnRpY2FsIGRpc3RhbmNlIGZyb20gdGhlIHBlbiBwb3NpdGlvbiAob24gdGhlICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGJhc2VsaW5lKSB0byB0aGUgdXBwZXIgYml0bWFwIGJvcmRlciAoYS5rLmEuIGB0b3AgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBzaWRlIGJlYXJpbmcnKS4gIFRoZSBkaXN0YW5jZSBpcyBwb3NpdGl2ZSBmb3IgdXB3YXJkcyAqLwotICAvKiAgICAgICAgICAgICAgICAgeX5jb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvcm1hdCAgICA6OiBUaGUgZm9ybWF0IG9mIHRoZSBnbHlwaCBiaXRtYXAgKG1vbm9jaHJvbWUgb3IgZ3JheSkuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4X2dyYXlzIDo6IE1heGltdW0gZ3JheSBsZXZlbCB2YWx1ZSAoaW4gdGhlIHJhbmdlIDEgdG9+MjU1KS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwaXRjaCAgICAgOjogVGhlIG51bWJlciBvZiBieXRlcyBwZXIgYml0bWFwIGxpbmUuICBNYXkgYmUgcG9zaXRpdmUgKi8KLSAgLyogICAgICAgICAgICAgICAgIG9yIG5lZ2F0aXZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4YWR2YW5jZSAgOjogVGhlIGhvcml6b250YWwgYWR2YW5jZSB3aWR0aCBpbiBwaXhlbHMuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHlhZHZhbmNlICA6OiBUaGUgdmVydGljYWwgYWR2YW5jZSBoZWlnaHQgaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYnVmZmVyICAgIDo6IEEgcG9pbnRlciB0byB0aGUgYml0bWFwIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRDX1NCaXRSZWNfCi0gIHsKLSAgICBGVF9CeXRlICAgd2lkdGg7Ci0gICAgRlRfQnl0ZSAgIGhlaWdodDsKLSAgICBGVF9DaGFyICAgbGVmdDsKLSAgICBGVF9DaGFyICAgdG9wOwotCi0gICAgRlRfQnl0ZSAgIGZvcm1hdDsKLSAgICBGVF9CeXRlICAgbWF4X2dyYXlzOwotICAgIEZUX1Nob3J0ICBwaXRjaDsKLSAgICBGVF9DaGFyICAgeGFkdmFuY2U7Ci0gICAgRlRfQ2hhciAgIHlhZHZhbmNlOwotCi0gICAgRlRfQnl0ZSogIGJ1ZmZlcjsKLQotICB9IEZUQ19TQml0UmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX1NCaXRDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBzbWFsbCBiaXRtYXAgY2FjaGUuICBUaGVzZSBhcmUgc3BlY2lhbCBjYWNoZSBvYmplY3RzICovCi0gIC8qICAgIHVzZWQgdG8gc3RvcmUgc21hbGwgZ2x5cGggYml0bWFwcyAoYW5kIGFudGktYWxpYXNlZCBwaXhtYXBzKSBpbiBhICAqLwotICAvKiAgICBtdWNoIG1vcmUgZWZmaWNpZW50IHdheSB0aGFuIHRoZSB0cmFkaXRpb25hbCBnbHlwaCBpbWFnZSBjYWNoZSAgICAgKi8KLSAgLyogICAgaW1wbGVtZW50ZWQgYnkgQEZUQ19JbWFnZUNhY2hlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVENfU0JpdENhY2hlUmVjXyogIEZUQ19TQml0Q2FjaGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfU0JpdENhY2hlX05ldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDcmVhdGUgYSBuZXcgY2FjaGUgdG8gc3RvcmUgc21hbGwgZ2x5cGggYml0bWFwcy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYW5hZ2VyIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgY2FjaGUgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhY2FjaGUgIDo6IEEgaGFuZGxlIHRvIHRoZSBuZXcgc2JpdCBjYWNoZS4gIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVENfU0JpdENhY2hlX05ldyggRlRDX01hbmFnZXIgICAgIG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICBGVENfU0JpdENhY2hlICAqYWNhY2hlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfU0JpdENhY2hlX0xvb2t1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb29rIHVwIGEgZ2l2ZW4gc21hbGwgZ2x5cGggYml0bWFwIGluIGEgZ2l2ZW4gc2JpdCBjYWNoZSBhbmQgICAgICAgKi8KLSAgLyogICAgYGxvY2snIGl0IHRvIHByZXZlbnQgaXRzIGZsdXNoaW5nIGZyb20gdGhlIGNhY2hlIHVudGlsIG5lZWRlZC4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2FjaGUgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2Ugc2JpdCBjYWNoZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0eXBlICAgOjogQSBwb2ludGVyIHRvIHRoZSBnbHlwaCBpbWFnZSB0eXBlIGRlc2NyaXB0b3IuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdpbmRleCA6OiBUaGUgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNiaXQgICA6OiBBIGhhbmRsZSB0byBhIHNtYWxsIGJpdG1hcCBkZXNjcmlwdG9yLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYW5vZGUgIDo6IFVzZWQgdG8gcmV0dXJuIHRoZSBhZGRyZXNzIG9mIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNhY2hlICovCi0gIC8qICAgICAgICAgICAgICBub2RlIGFmdGVyIGluY3JlbWVudGluZyBpdHMgcmVmZXJlbmNlIGNvdW50IChzZWUgbm90ZSAgICAqLwotICAvKiAgICAgICAgICAgICAgYmVsb3cpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgc21hbGwgYml0bWFwIGRlc2NyaXB0b3IgYW5kIGl0cyBiaXQgYnVmZmVyIGFyZSBvd25lZCBieSB0aGUgICAgKi8KLSAgLyogICAgY2FjaGUgYW5kIHNob3VsZCBuZXZlciBiZSBmcmVlZCBieSB0aGUgYXBwbGljYXRpb24uICBUaGV5IG1pZ2h0ICAgICovCi0gIC8qICAgIGFzIHdlbGwgZGlzYXBwZWFyIGZyb20gbWVtb3J5IG9uIHRoZSBuZXh0IGNhY2hlIGxvb2t1cCwgc28gZG9uJ3QgICAqLwotICAvKiAgICB0cmVhdCB0aGVtIGFzIHBlcnNpc3RlbnQgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBkZXNjcmlwdG9yJ3MgYGJ1ZmZlcicgZmllbGQgaXMgc2V0IHRvfjAgdG8gaW5kaWNhdGUgYSBtaXNzaW5nICAqLwotICAvKiAgICBnbHlwaCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGBhbm9kZScgaXMgX25vdF8gTlVMTCwgaXQgcmVjZWl2ZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGNhY2hlICAgICAqLwotICAvKiAgICBub2RlIGNvbnRhaW5pbmcgdGhlIGJpdG1hcCwgYWZ0ZXIgaW5jcmVhc2luZyBpdHMgcmVmZXJlbmNlIGNvdW50LiAgKi8KLSAgLyogICAgVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG5vZGUgKGFzIHdlbGwgYXMgdGhlIGltYWdlKSB3aWxsIGFsd2F5cyBiZSAgICovCi0gIC8qICAgIGtlcHQgaW4gdGhlIGNhY2hlIHVudGlsIHlvdSBjYWxsIEBGVENfTm9kZV9VbnJlZiB0byBgcmVsZWFzZScgaXQuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgYGFub2RlJyBpcyBOVUxMLCB0aGUgY2FjaGUgbm9kZSBpcyBsZWZ0IHVuY2hhbmdlZCwgd2hpY2ggbWVhbnMgICovCi0gIC8qICAgIHRoYXQgdGhlIGJpdG1hcCBjb3VsZCBiZSBmbHVzaGVkIG91dCBvZiB0aGUgY2FjaGUgb24gdGhlIG5leHQgICAgICAqLwotICAvKiAgICBjYWxsIHRvIG9uZSBvZiB0aGUgY2FjaGluZyBzdWItc3lzdGVtIEFQSXMuICBEb24ndCBhc3N1bWUgdGhhdCBpdCAgKi8KLSAgLyogICAgaXMgcGVyc2lzdGVudCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRDX1NCaXRDYWNoZV9Mb29rdXAoIEZUQ19TQml0Q2FjaGUgICAgY2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVENfSW1hZ2VUeXBlICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19TQml0ICAgICAgICAqc2JpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19Ob2RlICAgICAgICAqYW5vZGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19TQml0Q2FjaGVfTG9va3VwU2NhbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdmFyaWFudCBvZiBARlRDX1NCaXRDYWNoZV9Mb29rdXAgdGhhdCB1c2VzIGFuIEBGVENfU2NhbGVyUmVjICAgICAqLwotICAvKiAgICB0byBzcGVjaWZ5IHRoZSBmYWNlIElEIGFuZCBpdHMgc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjYWNoZSAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2Ugc2JpdCBjYWNoZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNjYWxlciAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBzY2FsZXIgZGVzY3JpcHRvci4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZF9mbGFncyA6OiBUaGUgY29ycmVzcG9uZGluZyBsb2FkIGZsYWdzLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnaW5kZXggICAgIDo6IFRoZSBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzYml0ICAgICAgIDo6IEEgaGFuZGxlIHRvIGEgc21hbGwgYml0bWFwIGRlc2NyaXB0b3IuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFub2RlICAgICAgOjogVXNlZCB0byByZXR1cm4gdGhlIGFkZHJlc3Mgb2Ygb2YgdGhlIGNvcnJlc3BvbmRpbmcgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGNhY2hlIG5vZGUgYWZ0ZXIgaW5jcmVtZW50aW5nIGl0cyByZWZlcmVuY2UgY291bnQgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAoc2VlIG5vdGUgYmVsb3cpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHNtYWxsIGJpdG1hcCBkZXNjcmlwdG9yIGFuZCBpdHMgYml0IGJ1ZmZlciBhcmUgb3duZWQgYnkgdGhlICAgICovCi0gIC8qICAgIGNhY2hlIGFuZCBzaG91bGQgbmV2ZXIgYmUgZnJlZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiAgVGhleSBtaWdodCAgICAqLwotICAvKiAgICBhcyB3ZWxsIGRpc2FwcGVhciBmcm9tIG1lbW9yeSBvbiB0aGUgbmV4dCBjYWNoZSBsb29rdXAsIHNvIGRvbid0ICAgKi8KLSAgLyogICAgdHJlYXQgdGhlbSBhcyBwZXJzaXN0ZW50IGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZGVzY3JpcHRvcidzIGBidWZmZXInIGZpZWxkIGlzIHNldCB0b34wIHRvIGluZGljYXRlIGEgbWlzc2luZyAgKi8KLSAgLyogICAgZ2x5cGggYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgYW5vZGUnIGlzIF9ub3RfIE5VTEwsIGl0IHJlY2VpdmVzIHRoZSBhZGRyZXNzIG9mIHRoZSBjYWNoZSAgICAgKi8KLSAgLyogICAgbm9kZSBjb250YWluaW5nIHRoZSBiaXRtYXAsIGFmdGVyIGluY3JlYXNpbmcgaXRzIHJlZmVyZW5jZSBjb3VudC4gICovCi0gIC8qICAgIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBub2RlIChhcyB3ZWxsIGFzIHRoZSBpbWFnZSkgd2lsbCBhbHdheXMgYmUgICAqLwotICAvKiAgICBrZXB0IGluIHRoZSBjYWNoZSB1bnRpbCB5b3UgY2FsbCBARlRDX05vZGVfVW5yZWYgdG8gYHJlbGVhc2UnIGl0LiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGBhbm9kZScgaXMgTlVMTCwgdGhlIGNhY2hlIG5vZGUgaXMgbGVmdCB1bmNoYW5nZWQsIHdoaWNoIG1lYW5zICAqLwotICAvKiAgICB0aGF0IHRoZSBiaXRtYXAgY291bGQgYmUgZmx1c2hlZCBvdXQgb2YgdGhlIGNhY2hlIG9uIHRoZSBuZXh0ICAgICAgKi8KLSAgLyogICAgY2FsbCB0byBvbmUgb2YgdGhlIGNhY2hpbmcgc3ViLXN5c3RlbSBBUElzLiAgRG9uJ3QgYXNzdW1lIHRoYXQgaXQgICovCi0gIC8qICAgIGlzIHBlcnNpc3RlbnQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUQ19TQml0Q2FjaGVfTG9va3VwU2NhbGVyKCBGVENfU0JpdENhY2hlICBjYWNoZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19TY2FsZXIgICAgIHNjYWxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgIGxvYWRfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfU0JpdCAgICAgICpzYml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX05vZGUgICAgICAqYW5vZGUgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRDQUNIRV9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRjZmZkcnYuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRjZmZkcnYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcwMzFiYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0Y2ZmZHJ2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRjZmZkcnYuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgY29udHJvbGxpbmcgdGhlIENGRiBkcml2ZXIgKHNwZWNpZmljYXRpb24gb25seSkuICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDEzLCAyMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRDRkZEUlZfSF9fCi0jZGVmaW5lIF9fRlRDRkZEUlZfSF9fCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAc2VjdGlvbjoKLSAgICogICBjZmZfZHJpdmVyCi0gICAqCi0gICAqIEB0aXRsZToKLSAgICogICBUaGUgQ0ZGIGRyaXZlcgotICAgKgotICAgKiBAYWJzdHJhY3Q6Ci0gICAqICAgQ29udHJvbGxpbmcgdGhlIENGRiBkcml2ZXIgbW9kdWxlLgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgV2hpbGUgRnJlZVR5cGUncyBDRkYgZHJpdmVyIGRvZXNuJ3QgZXhwb3NlIEFQSSBmdW5jdGlvbnMgYnkgaXRzZWxmLAotICAgKiAgIGl0IGlzIHBvc3NpYmxlIHRvIGNvbnRyb2wgaXRzIGJlaGF2aW91ciB3aXRoIEBGVF9Qcm9wZXJ0eV9TZXQgYW5kCi0gICAqICAgQEZUX1Byb3BlcnR5X0dldC4gIFRoZSBsaXN0IGJlbG93IGdpdmVzIHRoZSBhdmFpbGFibGUgcHJvcGVydGllcwotICAgKiAgIHRvZ2V0aGVyIHdpdGggdGhlIG5lY2Vzc2FyeSBtYWNyb3MgYW5kIHN0cnVjdHVyZXMuCi0gICAqCi0gICAqICAgVGhlIENGRiBkcml2ZXIncyBtb2R1bGUgbmFtZSBpcyBgY2ZmJy4KLSAgICoKLSAgICogICAqSGludGluZyogKmFuZCogKmFudGlhbGlhc2luZyogKnByaW5jaXBsZXMqICpvZiogKnRoZSogKm5ldyogKmVuZ2luZSoKLSAgICoKLSAgICogICBUaGUgcmFzdGVyaXplciBpcyBwb3NpdGlvbmluZyBob3Jpem9udGFsIGZlYXR1cmVzIChlLmcuLCBhc2NlbmRlcgotICAgKiAgIGhlaWdodCAmIHgtaGVpZ2h0LCBvciBjcm9zc2JhcnMpIG9uIHRoZSBwaXhlbCBncmlkIGFuZCBtaW5pbWl6aW5nIHRoZQotICAgKiAgIGFtb3VudCBvZiBhbnRpYWxpYXNpbmcgYXBwbGllZCB0byB0aGVtLCB3aGlsZSBwbGFjaW5nIHZlcnRpY2FsCi0gICAqICAgZmVhdHVyZXMgKHZlcnRpY2FsIHN0ZW1zKSBvbiB0aGUgcGl4ZWwgZ3JpZCB3aXRob3V0IGhpbnRpbmcsIHRodXMKLSAgICogICByZXByZXNlbnRpbmcgdGhlIHN0ZW0gcG9zaXRpb24gYW5kIHdlaWdodCBhY2N1cmF0ZWx5LiAgU29tZXRpbWVzIHRoZQotICAgKiAgIHZlcnRpY2FsIHN0ZW1zIG1heSBiZSBvbmx5IHBhcnRpYWxseSBibGFjay4gIEluIHRoaXMgY29udGV4dCwKLSAgICogICBgYW50aWFsaWFzaW5nJyBtZWFucyB0aGF0IHN0ZW1zIGFyZSBub3QgcG9zaXRpb25lZCBleGFjdGx5IG9uIHBpeGVsCi0gICAqICAgYm9yZGVycywgY2F1c2luZyBhIGZ1enp5IGFwcGVhcmFuY2UuCi0gICAqCi0gICAqICAgVGhlcmUgYXJlIHR3byBwcmluY2lwbGVzIGJlaGluZCB0aGlzIGFwcHJvYWNoLgotICAgKgotICAgKiAgIDEpIE5vIGhpbnRpbmcgaW4gdGhlIGhvcml6b250YWwgZGlyZWN0aW9uOiBVbmxpa2UgYHN1cGVyaGludGVkJwotICAgKiAgIFRydWVUeXBlLCB3aGljaCBjaGFuZ2VzIGdseXBoIHdpZHRocyB0byBhY2NvbW1vZGF0ZSByZWd1bGFyCi0gICAqICAgaW50ZXItZ2x5cGggc3BhY2luZywgQWRvYmUncyBhcHByb2FjaCBpcyBgZmFpdGhmdWwgdG8gdGhlIGRlc2lnbicgaW4KLSAgICogICByZXByZXNlbnRpbmcgYm90aCB0aGUgZ2x5cGggd2lkdGggYW5kIHRoZSBpbnRlci1nbHlwaCBzcGFjaW5nCi0gICAqICAgZGVzaWduZWQgZm9yIHRoZSBmb250LiAgVGhpcyBtYWtlcyB0aGUgc2NyZWVuIGRpc3BsYXkgYXMgY2xvc2UgYXMgaXQKLSAgICogICBjYW4gYmUgdG8gdGhlIHJlc3VsdCBvbmUgd291bGQgZ2V0IHdpdGggaW5maW5pdGUgcmVzb2x1dGlvbiwgd2hpbGUKLSAgICogICBwcmVzZXJ2aW5nIHdoYXQgaXMgY29uc2lkZXJlZCB0aGUga2V5IGNoYXJhY3RlcmlzdGljcyBvZiBlYWNoIGdseXBoLgotICAgKiAgIE5vdGUgdGhhdCB0aGUgZGlzdGFuY2VzIGJldHdlZW4gdW5oaW50ZWQgYW5kIGdyaWQtZml0dGVkIHBvc2l0aW9ucyBhdAotICAgKiAgIHNtYWxsIHNpemVzIGFyZSBjb21wYXJhYmxlIHRvIGtlcm5pbmcgdmFsdWVzIGFuZCB0aHVzIHdvdWxkIGJlCi0gICAqICAgbm90aWNlYWJsZSAoYW5kIGRpc3RyYWN0aW5nKSB3aGlsZSByZWFkaW5nIGlmIGhpbnRpbmcgd2VyZSBhcHBsaWVkLgotICAgKgotICAgKiAgIE9uZSBvZiB0aGUgcmVhc29ucyB0byBub3QgaGludCBob3Jpem9udGFsbHkgaXMgYW50aWFsaWFzaW5nIGZvciBMQ0QKLSAgICogICBzY3JlZW5zOiBUaGUgcGl4ZWwgZ2VvbWV0cnkgb2YgbW9kZXJuIGRpc3BsYXlzIHN1cHBsaWVzIHRocmVlCi0gICAqICAgdmVydGljYWwgc3ViLXBpeGVscyBhcyB0aGUgZXllIG1vdmVzIGhvcml6b250YWxseSBhY3Jvc3MgZWFjaCB2aXNpYmxlCi0gICAqICAgcGl4ZWwuICBPbiBkZXZpY2VzIHdoZXJlIHdlIGNhbiBiZSBjZXJ0YWluIHRoaXMgY2hhcmFjdGVyaXN0aWMgaXMKLSAgICogICBwcmVzZW50IGEgcmFzdGVyaXplciBjYW4gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIHN1Yi1waXhlbHMgdG8gYWRkCi0gICAqICAgaW5jcmVtZW50cyBvZiB3ZWlnaHQuICBJbiBXZXN0ZXJuIHdyaXRpbmcgc3lzdGVtcyB0aGlzIHR1cm5zIG91dCB0bwotICAgKiAgIGJlIHRoZSBtb3JlIGNyaXRpY2FsIGRpcmVjdGlvbiBhbnl3YXk7IHRoZSB3ZWlnaHRzIGFuZCBzcGFjaW5nIG9mCi0gICAqICAgdmVydGljYWwgc3RlbXMgKHNlZSBhYm92ZSkgYXJlIGNlbnRyYWwgdG8gQXJtZW5pYW4sIEN5cmlsbGljLCBHcmVlaywKLSAgICogICBhbmQgTGF0aW4gdHlwZSBkZXNpZ25zLiAgRXZlbiB3aGVuIHRoZSByYXN0ZXJpemVyIHVzZXMgZ3JleXNjYWxlCi0gICAqICAgYW50aWFsaWFzaW5nIGluc3RlYWQgb2YgY29sb3IgKGEgbmVjZXNzYXJ5IGNvbXByb21pc2Ugd2hlbiBvbmUKLSAgICogICBkb2Vzbid0IGtub3cgdGhlIHNjcmVlbiBjaGFyYWN0ZXJpc3RpY3MpLCB0aGUgdW5oaW50ZWQgdmVydGljYWwKLSAgICogICBmZWF0dXJlcyBwcmVzZXJ2ZSB0aGUgZGVzaWduJ3Mgd2VpZ2h0IGFuZCBzcGFjaW5nIG11Y2ggYmV0dGVyIHRoYW4KLSAgICogICBhbGlhc2VkIHR5cGUgd291bGQuCi0gICAqCi0gICAqICAgMikgQWxpZ21lbnQgaW4gdGhlIHZlcnRpY2FsIGRpcmVjdGlvbjogV2VpZ2h0cyBhbmQgc3BhY2luZyBhbG9uZyB0aGUKLSAgICogICB5fmF4aXMgYXJlIGxlc3MgY3JpdGljYWw7IHdoYXQgaXMgbXVjaCBtb3JlIGltcG9ydGFudCBpcyB0aGUgdmlzdWFsCi0gICAqICAgYWxpZ25tZW50IG9mIHJlbGF0ZWQgZmVhdHVyZXMgKGxpa2UgY2FwLWhlaWdodCBhbmQgeC1oZWlnaHQpLiAgVGhlCi0gICAqICAgc2Vuc2Ugb2YgYWxpZ25tZW50IGZvciB0aGVzZSBpcyBlbmhhbmNlZCBieSB0aGUgc2hhcnBuZXNzIG9mIGdyaWQtZml0Ci0gICAqICAgZWRnZXMsIHdoaWxlIHRoZSBjcnVkZXIgdmVydGljYWwgcmVzb2x1dGlvbiAoZnVsbCBwaXhlbHMgaW5zdGVhZCBvZgotICAgKiAgIDEvMyBwaXhlbHMpIGlzIGxlc3Mgb2YgYSBwcm9ibGVtLgotICAgKgotICAgKiAgIE9uIHRoZSB0ZWNobmljYWwgc2lkZSwgaG9yaXpvbnRhbCBhbGlnbm1lbnQgem9uZXMgZm9yIGFzY2VuZGVyLAotICAgKiAgIHgtaGVpZ2h0LCBhbmQgb3RoZXIgaW1wb3J0YW50IGhlaWdodCB2YWx1ZXMgKHRyYWRpdGlvbmFsbHkgY2FsbGVkCi0gICAqICAgYGJsdWUgem9uZXMnKSBhcyBkZWZpbmVkIGluIHRoZSBmb250IGFyZSBwb3NpdGlvbmVkIGluZGVwZW5kZW50bHksCi0gICAqICAgZWFjaCBiZWluZyByb3VuZGVkIHRvIHRoZSBuZWFyZXN0IHBpeGVsIGVkZ2UsIHRha2luZyBjYXJlIG9mCi0gICAqICAgb3ZlcnNob290IHN1cHByZXNzaW9uIGF0IHNtYWxsIHNpemVzLCBzdGVtIGRhcmtlbmluZywgYW5kIHNjYWxpbmcuCi0gICAqCi0gICAqICAgSHN0ZW1zICh0aGlzIGlzLCBoaW50IHZhbHVlcyBkZWZpbmVkIGluIHRoZSBmb250IHRvIGhlbHAgYWxpZ24KLSAgICogICBob3Jpem9udGFsIGZlYXR1cmVzKSB0aGF0IGZhbGwgd2l0aGluIGEgYmx1ZSB6b25lIGFyZSBzYWlkIHRvIGJlCi0gICAqICAgYGNhcHR1cmVkJyBhbmQgYXJlIGFsaWduZWQgdG8gdGhhdCB6b25lLiAgVW5jYXB0dXJlZCBzdGVtcyBhcmUgbW92ZWQKLSAgICogICBpbiBvbmUgb2YgZm91ciB3YXlzLCB0b3AgZWRnZSB1cCBvciBkb3duLCBib3R0b20gZWRnZSB1cCBvciBkb3duLgotICAgKiAgIFVubGVzcyB0aGVyZSBhcmUgY29uZmxpY3RpbmcgaHN0ZW1zLCB0aGUgc21hbGxlc3QgbW92ZW1lbnQgaXMgdGFrZW4KLSAgICogICB0byBtaW5pbWl6ZSBkaXN0b3J0aW9uLgotICAgKgotICAgKiBAb3JkZXI6Ci0gICAqICAgaGludGluZy1lbmdpbmUKLSAgICogICBuby1zdGVtLWRhcmtlbmluZwotICAgKiAgIGRhcmtlbmluZy1wYXJhbWV0ZXJzCi0gICAqCi0gICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBwcm9wZXJ0eToKLSAgICogICBoaW50aW5nLWVuZ2luZQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhhbmtzIHRvIEFkb2JlLCB3aGljaCBjb250cmlidXRlZCBhIG5ldyBoaW50aW5nIChhbmQgcGFyc2luZykKLSAgICogICBlbmdpbmUsIGFuIGFwcGxpY2F0aW9uIGNhbiBzZWxlY3QgYmV0d2VlbiBgZnJlZXR5cGUnIGFuZCBgYWRvYmUnIGlmCi0gICAqICAgY29tcGlsZWQgd2l0aCBDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FLiAgSWYgdGhpcyBjb25maWd1cmF0aW9uCi0gICAqICAgbWFjcm8gaXNuJ3QgZGVmaW5lZCwgYGhpbnRpbmctZW5naW5lJyBkb2VzIG5vdGhpbmcuCi0gICAqCi0gICAqICAgVGhlIGRlZmF1bHQgZW5naW5lIGlzIGBmcmVldHlwZScgaWYgQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORSBpcwotICAgKiAgIGRlZmluZWQsIGFuZCBgYWRvYmUnIG90aGVyd2lzZS4KLSAgICoKLSAgICogICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgY29kZSBkZW1vbnN0cmF0ZXMgaG93IHRvIHNlbGVjdCBBZG9iZSdzIGhpbnRpbmcKLSAgICogICBlbmdpbmUgKG9taXR0aW5nIHRoZSBlcnJvciBoYW5kbGluZykuCi0gICAqCi0gICAqICAgewotICAgKiAgICAgRlRfTGlicmFyeSAgbGlicmFyeTsKLSAgICogICAgIEZUX1VJbnQgICAgIGhpbnRpbmdfZW5naW5lID0gRlRfQ0ZGX0hJTlRJTkdfQURPQkU7Ci0gICAqCi0gICAqCi0gICAqICAgICBGVF9Jbml0X0ZyZWVUeXBlKCAmbGlicmFyeSApOwotICAgKgotICAgKiAgICAgRlRfUHJvcGVydHlfU2V0KCBsaWJyYXJ5LCAiY2ZmIiwKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhpbnRpbmctZW5naW5lIiwgJmhpbnRpbmdfZW5naW5lICk7Ci0gICAqICAgfQotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHdpdGggQEZUX1Byb3BlcnR5X0dldCBhbHNvLgotICAgKgotICAgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZW51bToKLSAgICogICBGVF9DRkZfSElOVElOR19YWFgKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbGlzdCBvZiBjb25zdGFudHMgdXNlZCBmb3IgdGhlIEBoaW50aW5nLWVuZ2luZSBwcm9wZXJ0eSB0byBzZWxlY3QKLSAgICogICB0aGUgaGludGluZyBlbmdpbmUgZm9yIENGRiBmb250cy4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBGVF9DRkZfSElOVElOR19GUkVFVFlQRSA6OgotICAgKiAgICAgVXNlIHRoZSBvbGQgRnJlZVR5cGUgaGludGluZyBlbmdpbmUuCi0gICAqCi0gICAqICAgRlRfQ0ZGX0hJTlRJTkdfQURPQkUgOjoKLSAgICogICAgIFVzZSB0aGUgaGludGluZyBlbmdpbmUgY29udHJpYnV0ZWQgYnkgQWRvYmUuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9DRkZfSElOVElOR19GUkVFVFlQRSAgMAotI2RlZmluZSBGVF9DRkZfSElOVElOR19BRE9CRSAgICAgMQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBwcm9wZXJ0eToKLSAgICogICBuby1zdGVtLWRhcmtlbmluZwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQnkgZGVmYXVsdCwgdGhlIEFkb2JlIENGRiBlbmdpbmUgZGFya2VucyBzdGVtcyBhdCBzbWFsbGVyIHNpemVzLAotICAgKiAgIHJlZ2FyZGxlc3Mgb2YgaGludGluZywgdG8gZW5oYW5jZSBjb250cmFzdC4gIFRoaXMgZmVhdHVyZSByZXF1aXJlcwotICAgKiAgIGEgcmVuZGVyaW5nIHN5c3RlbSB3aXRoIHByb3BlciBnYW1tYSBjb3JyZWN0aW9uLiAgU2V0dGluZyB0aGlzCi0gICAqICAgcHJvcGVydHksIHN0ZW0gZGFya2VuaW5nIGdldHMgc3dpdGNoZWQgb2ZmLgotICAgKgotICAgKiAgIE5vdGUgdGhhdCBzdGVtIGRhcmtlbmluZyBpcyBuZXZlciBhcHBsaWVkIGlmIEBGVF9MT0FEX05PX1NDQUxFIGlzIHNldC4KLSAgICoKLSAgICogICB7Ci0gICAqICAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5OwotICAgKiAgICAgRlRfQm9vbCAgICAgbm9fc3RlbV9kYXJrZW5pbmcgPSBUUlVFOwotICAgKgotICAgKgotICAgKiAgICAgRlRfSW5pdF9GcmVlVHlwZSggJmxpYnJhcnkgKTsKLSAgICoKLSAgICogICAgIEZUX1Byb3BlcnR5X1NldCggbGlicmFyeSwgImNmZiIsCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuby1zdGVtLWRhcmtlbmluZyIsICZub19zdGVtX2RhcmtlbmluZyApOwotICAgKiAgIH0KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB3aXRoIEBGVF9Qcm9wZXJ0eV9HZXQgYWxzby4KLSAgICoKLSAgICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHByb3BlcnR5OgotICAgKiAgIGRhcmtlbmluZy1wYXJhbWV0ZXJzCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBCeSBkZWZhdWx0LCB0aGUgQWRvYmUgQ0ZGIGVuZ2luZSBkYXJrZW5zIHN0ZW1zIGFzIGZvbGxvd3MgKGlmIHRoZQotICAgKiAgIGBuby1zdGVtLWRhcmtlbmluZycgcHJvcGVydHkgaXNuJ3Qgc2V0KToKLSAgICoKLSAgICogICB7Ci0gICAqICAgICBzdGVtIHdpZHRoIDw9IDAuNXB4OiAgIGRhcmtlbmluZyBhbW91bnQgPSAwLjRweAotICAgKiAgICAgc3RlbSB3aWR0aCAgPSAxcHg6ICAgICBkYXJrZW5pbmcgYW1vdW50ID0gMC4yNzVweAotICAgKiAgICAgc3RlbSB3aWR0aCAgPSAxLjY2N3B4OiBkYXJrZW5pbmcgYW1vdW50ID0gMC4yNzVweAotICAgKiAgICAgc3RlbSB3aWR0aCA+PSAyLjMzM3B4OiBkYXJrZW5pbmcgYW1vdW50ID0gMHB4Ci0gICAqICAgfQotICAgKgotICAgKiAgIGFuZCBwaWVjZXdpc2UgbGluZWFyIGluLWJldHdlZW4uICBBdCBjb25maWd1cmF0aW9uIHRpbWUsIHRoZXNlIGZvdXIKLSAgICogICBjb250cm9sIHBvaW50cyBjYW4gYmUgc2V0IHdpdGggdGhlIG1hY3JvCi0gICAqICAgYENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJTJy4gIEF0IHJ1bnRpbWUsIHRoZSBjb250cm9sCi0gICAqICAgcG9pbnRzIGNhbiBiZSBjaGFuZ2VkIHVzaW5nIHRoZSBgZGFya2VuaW5nLXBhcmFtZXRlcnMnIHByb3BlcnR5LCBhcwotICAgKiAgIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZXMuCi0gICAqCi0gICAqICAgewotICAgKiAgICAgRlRfTGlicmFyeSAgbGlicmFyeTsKLSAgICogICAgIEZUX0ludCAgICAgIGRhcmtlbl9wYXJhbXNbOF0gPSB7ICA1MDAsIDMwMCwgICAvLyB4MSwgeTEKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAsIDIwMCwgICAvLyB4MiwgeTIKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1MDAsIDEwMCwgICAvLyB4MywgeTMKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDAsICAgMCB9OyAvLyB4NCwgeTQKLSAgICoKLSAgICoKLSAgICogICAgIEZUX0luaXRfRnJlZVR5cGUoICZsaWJyYXJ5ICk7Ci0gICAqCi0gICAqICAgICBGVF9Qcm9wZXJ0eV9TZXQoIGxpYnJhcnksICJjZmYiLAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGFya2VuaW5nLXBhcmFtZXRlcnMiLCBkYXJrZW5fcGFyYW1zICk7Ci0gICAqICAgfQotICAgKgotICAgKiAgIFRoZSB4fnZhbHVlcyBnaXZlIHRoZSBzdGVtIHdpZHRoLCBhbmQgdGhlIHl+dmFsdWVzIHRoZSBkYXJrZW5pbmcKLSAgICogICBhbW91bnQuICBUaGUgdW5pdCBpcyAxMDAwdGggb2YgcGl4ZWxzLiAgQWxsIGNvb3JkaW5hdGUgdmFsdWVzIG11c3QgYmUKLSAgICogICBwb3NpdGl2ZTsgdGhlIHh+dmFsdWVzIG11c3QgYmUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nOyB0aGUKLSAgICogICB5fnZhbHVlcyBtdXN0IGJlIG1vbm90b25pY2FsbHkgZGVjcmVhc2luZyBhbmQgc21hbGxlciB0aGFuIG9yCi0gICAqICAgZXF1YWwgdG8gNTAwIChjb3JyZXNwb25kaW5nIHRvIGhhbGYgYSBwaXhlbCk7IHRoZSBzbG9wZSBvZiBlYWNoCi0gICAqICAgbGluZWFyIHBpZWNlIG11c3QgYmUgc2hhbGxvd2VyIHRoYW4gLTEgKGUuZy4sIC0uNCkuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgd2l0aCBARlRfUHJvcGVydHlfR2V0IGFsc28uCi0gICAqCi0gICAqLwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX0ZUQ0ZGRFJWX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdGNpZC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdGNpZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzU1MGQ4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRjaWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGNpZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciBhY2Nlc3NpbmcgQ0lEIGZvbnQgaW5mb3JtYXRpb24gKHNwZWNpZmljYXRpb24pLiAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDcsIDIwMDkgYnkgRGVyZWcgQ2xlZ2csIE1pY2hhZWwgVG9mdGRhbC4gICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUQ0lEX0hfXwotI2RlZmluZSBfX0ZUQ0lEX0hfXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaWRfZm9udHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDSUQgRm9udHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDSUQta2V5ZWQgZm9udCBzcGVjaWZpYyBBUEkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIENJRC1rZXllZCBmb250IHNwZWNpZmljICAgKi8KLSAgLyogICAgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICAgRlRfR2V0X0NJRF9SZWdpc3RyeV9PcmRlcmluZ19TdXBwbGVtZW50Ci0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICAgUmV0cmlldmUgdGhlIFJlZ2lzdHJ5L09yZGVyaW5nL1N1cHBsZW1lbnQgdHJpcGxlIChhbHNvIGtub3duIGFzIHRoZQotICAgKiAgICAiUi9PL1MiKSBmcm9tIGEgQ0lELWtleWVkIGZvbnQuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICAgZmFjZSA6OgotICAgKiAgICAgICBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICAgcmVnaXN0cnkgOjoKLSAgICogICAgICAgVGhlIHJlZ2lzdHJ5LCBhcyBhIEN+c3RyaW5nLCBvd25lZCBieSB0aGUgZmFjZS4KLSAgICoKLSAgICogICAgb3JkZXJpbmcgOjoKLSAgICogICAgICAgVGhlIG9yZGVyaW5nLCBhcyBhIEN+c3RyaW5nLCBvd25lZCBieSB0aGUgZmFjZS4KLSAgICoKLSAgICogICAgc3VwcGxlbWVudCA6OgotICAgKiAgICAgICBUaGUgc3VwcGxlbWVudC4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyB3aXRoIENJRCBmYWNlcywgcmV0dXJuaW5nIGFuIGVycm9yCi0gICAqICAgIG90aGVyd2lzZS4KLSAgICoKLSAgICogQHNpbmNlOgotICAgKiAgICAyLjMuNgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9DSURfUmVnaXN0cnlfT3JkZXJpbmdfU3VwcGxlbWVudCggRlRfRmFjZSAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAqcmVnaXN0cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICpvcmRlcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgKnN1cHBsZW1lbnQpOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgICBGVF9HZXRfQ0lEX0lzX0ludGVybmFsbHlfQ0lEX0tleWVkCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICAgUmV0cmlldmUgdGhlIHR5cGUgb2YgdGhlIGlucHV0IGZhY2UsIENJRCBrZXllZCBvciBub3QuICBJbgotICAgKiAgICBjb25zdHJhc3QgdG8gdGhlIEBGVF9JU19DSURfS0VZRUQgbWFjcm8gdGhpcyBmdW5jdGlvbiByZXR1cm5zCi0gICAqICAgIHN1Y2Nlc3NmdWxseSBhbHNvIGZvciBDSUQta2V5ZWQgZm9udHMgaW4gYW4gU05GVCB3cmFwcGVyLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgIGZhY2UgOjoKLSAgICogICAgICAgQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgIGlzX2NpZCA6OgotICAgKiAgICAgICBUaGUgdHlwZSBvZiB0aGUgZmFjZSBhcyBhbiBARlRfQm9vbC4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyB3aXRoIENJRCBmYWNlcyBhbmQgT3BlblR5cGUgZm9udHMsCi0gICAqICAgIHJldHVybmluZyBhbiBlcnJvciBvdGhlcndpc2UuCi0gICAqCi0gICAqIEBzaW5jZToKLSAgICogICAgMi4zLjkKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfQ0lEX0lzX0ludGVybmFsbHlfQ0lEX0tleWVkKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgKmlzX2NpZCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgICBGVF9HZXRfQ0lEX0Zyb21fR2x5cGhfSW5kZXgKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICBSZXRyaWV2ZSB0aGUgQ0lEIG9mIHRoZSBpbnB1dCBnbHlwaCBpbmRleC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgICBmYWNlIDo6Ci0gICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAgKgotICAgKiAgICBnbHlwaF9pbmRleCA6OgotICAgKiAgICAgICBUaGUgaW5wdXQgZ2x5cGggaW5kZXguCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgIGNpZCA6OgotICAgKiAgICAgICBUaGUgQ0lEIGFzIGFuIEBGVF9VSW50LgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICAgVGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIHdpdGggQ0lEIGZhY2VzIGFuZCBPcGVuVHlwZSBmb250cywKLSAgICogICAgcmV0dXJuaW5nIGFuIGVycm9yIG90aGVyd2lzZS4KLSAgICoKLSAgICogQHNpbmNlOgotICAgKiAgICAyLjMuOQotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9DSURfRnJvbV9HbHlwaF9JbmRleCggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICpjaWQgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRDSURfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0ZXJyZGVmLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0ZXJyZGVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YjJmYWQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdGVycmRlZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0ZXJyZGVmLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMiwgMjAwNCwgMjAwNiwgMjAwNywgMjAxMC0yMDEzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgTElTVCBPRiBFUlJPUiBDT0RFUy9NRVNTQUdFUyAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIFlvdSBuZWVkIHRvIGRlZmluZSBib3RoIEZUX0VSUk9SREVGXyBhbmQgRlRfTk9FUlJPUkRFRl8gYmVmb3JlICovCi0gIC8qIGluY2x1ZGluZyB0aGlzIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLQotICAvKiBnZW5lcmljIGVycm9ycyAqLwotCi0gIEZUX05PRVJST1JERUZfKCBPaywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwKLSAgICAgICAgICAgICAgICAgICJubyBlcnJvciIgKQotCi0gIEZUX0VSUk9SREVGXyggQ2Fubm90X09wZW5fUmVzb3VyY2UsICAgICAgICAgICAgICAgICAgICAgICAgMHgwMSwKLSAgICAgICAgICAgICAgICAiY2Fubm90IG9wZW4gcmVzb3VyY2UiICkKLSAgRlRfRVJST1JERUZfKCBVbmtub3duX0ZpbGVfRm9ybWF0LCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyLAotICAgICAgICAgICAgICAgICJ1bmtub3duIGZpbGUgZm9ybWF0IiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9GaWxlX0Zvcm1hdCwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMywKLSAgICAgICAgICAgICAgICAiYnJva2VuIGZpbGUiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1ZlcnNpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIEZyZWVUeXBlIHZlcnNpb24iICkKLSAgRlRfRVJST1JERUZfKCBMb3dlcl9Nb2R1bGVfVmVyc2lvbiwgICAgICAgICAgICAgICAgICAgICAgICAweDA1LAotICAgICAgICAgICAgICAgICJtb2R1bGUgdmVyc2lvbiBpcyB0b28gbG93IiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9Bcmd1bWVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNiwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBhcmd1bWVudCIgKQotICBGVF9FUlJPUkRFRl8oIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSwgICAgICAgICAgICAgICAgICAgICAgIDB4MDcsCi0gICAgICAgICAgICAgICAgInVuaW1wbGVtZW50ZWQgZmVhdHVyZSIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfVGFibGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgsCi0gICAgICAgICAgICAgICAgImJyb2tlbiB0YWJsZSIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfT2Zmc2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDksCi0gICAgICAgICAgICAgICAgImJyb2tlbiBvZmZzZXQgd2l0aGluIHRhYmxlIiApCi0gIEZUX0VSUk9SREVGXyggQXJyYXlfVG9vX0xhcmdlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQSwKLSAgICAgICAgICAgICAgICAiYXJyYXkgYWxsb2NhdGlvbiBzaXplIHRvbyBsYXJnZSIgKQotICBGVF9FUlJPUkRFRl8oIE1pc3NpbmdfTW9kdWxlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEIsCi0gICAgICAgICAgICAgICAgIm1pc3NpbmcgbW9kdWxlIiApCi0gIEZUX0VSUk9SREVGXyggTWlzc2luZ19Qcm9wZXJ0eSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQywKLSAgICAgICAgICAgICAgICAibWlzc2luZyBwcm9wZXJ0eSIgKQotCi0gIC8qIGdseXBoL2NoYXJhY3RlciBlcnJvcnMgKi8KLQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfR2x5cGhfSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAsCi0gICAgICAgICAgICAgICAgImludmFsaWQgZ2x5cGggaW5kZXgiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX0NoYXJhY3Rlcl9Db2RlLCAgICAgICAgICAgICAgICAgICAgICAweDExLAotICAgICAgICAgICAgICAgICJpbnZhbGlkIGNoYXJhY3RlciBjb2RlIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9HbHlwaF9Gb3JtYXQsICAgICAgICAgICAgICAgICAgICAgICAgMHgxMiwKLSAgICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgZ2x5cGggaW1hZ2UgZm9ybWF0IiApCi0gIEZUX0VSUk9SREVGXyggQ2Fubm90X1JlbmRlcl9HbHlwaCwgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMywKLSAgICAgICAgICAgICAgICAiY2Fubm90IHJlbmRlciB0aGlzIGdseXBoIGZvcm1hdCIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfT3V0bGluZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQsCi0gICAgICAgICAgICAgICAgImludmFsaWQgb3V0bGluZSIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfQ29tcG9zaXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUsCi0gICAgICAgICAgICAgICAgImludmFsaWQgY29tcG9zaXRlIGdseXBoIiApCi0gIEZUX0VSUk9SREVGXyggVG9vX01hbnlfSGludHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNiwKLSAgICAgICAgICAgICAgICAidG9vIG1hbnkgaGludHMiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1BpeGVsX1NpemUsICAgICAgICAgICAgICAgICAgICAgICAgICAweDE3LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIHBpeGVsIHNpemUiICkKLQotICAvKiBoYW5kbGUgZXJyb3JzICovCi0KLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX0hhbmRsZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwLAotICAgICAgICAgICAgICAgICJpbnZhbGlkIG9iamVjdCBoYW5kbGUiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX0xpYnJhcnlfSGFuZGxlLCAgICAgICAgICAgICAgICAgICAgICAweDIxLAotICAgICAgICAgICAgICAgICJpbnZhbGlkIGxpYnJhcnkgaGFuZGxlIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9Ecml2ZXJfSGFuZGxlLCAgICAgICAgICAgICAgICAgICAgICAgMHgyMiwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBtb2R1bGUgaGFuZGxlIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9GYWNlX0hhbmRsZSwgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMywKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBmYWNlIGhhbmRsZSIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfU2l6ZV9IYW5kbGUsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjQsCi0gICAgICAgICAgICAgICAgImludmFsaWQgc2l6ZSBoYW5kbGUiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1Nsb3RfSGFuZGxlLCAgICAgICAgICAgICAgICAgICAgICAgICAweDI1LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIGdseXBoIHNsb3QgaGFuZGxlIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9DaGFyTWFwX0hhbmRsZSwgICAgICAgICAgICAgICAgICAgICAgMHgyNiwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBjaGFybWFwIGhhbmRsZSIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfQ2FjaGVfSGFuZGxlLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MjcsCi0gICAgICAgICAgICAgICAgImludmFsaWQgY2FjaGUgbWFuYWdlciBoYW5kbGUiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1N0cmVhbV9IYW5kbGUsICAgICAgICAgICAgICAgICAgICAgICAweDI4LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIHN0cmVhbSBoYW5kbGUiICkKLQotICAvKiBkcml2ZXIgZXJyb3JzICovCi0KLSAgRlRfRVJST1JERUZfKCBUb29fTWFueV9Ecml2ZXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwLAotICAgICAgICAgICAgICAgICJ0b28gbWFueSBtb2R1bGVzIiApCi0gIEZUX0VSUk9SREVGXyggVG9vX01hbnlfRXh0ZW5zaW9ucywgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMSwKLSAgICAgICAgICAgICAgICAidG9vIG1hbnkgZXh0ZW5zaW9ucyIgKQotCi0gIC8qIG1lbW9yeSBlcnJvcnMgKi8KLQotICBGVF9FUlJPUkRFRl8oIE91dF9PZl9NZW1vcnksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAsCi0gICAgICAgICAgICAgICAgIm91dCBvZiBtZW1vcnkiICkKLSAgRlRfRVJST1JERUZfKCBVbmxpc3RlZF9PYmplY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQxLAotICAgICAgICAgICAgICAgICJ1bmxpc3RlZCBvYmplY3QiICkKLQotICAvKiBzdHJlYW0gZXJyb3JzICovCi0KLSAgRlRfRVJST1JERUZfKCBDYW5ub3RfT3Blbl9TdHJlYW0sICAgICAgICAgICAgICAgICAgICAgICAgICAweDUxLAotICAgICAgICAgICAgICAgICJjYW5ub3Qgb3BlbiBzdHJlYW0iICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1N0cmVhbV9TZWVrLCAgICAgICAgICAgICAgICAgICAgICAgICAweDUyLAotICAgICAgICAgICAgICAgICJpbnZhbGlkIHN0cmVhbSBzZWVrIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9TdHJlYW1fU2tpcCwgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MywKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBzdHJlYW0gc2tpcCIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfU3RyZWFtX1JlYWQsICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTQsCi0gICAgICAgICAgICAgICAgImludmFsaWQgc3RyZWFtIHJlYWQiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1N0cmVhbV9PcGVyYXRpb24sICAgICAgICAgICAgICAgICAgICAweDU1LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIHN0cmVhbSBvcGVyYXRpb24iICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX0ZyYW1lX09wZXJhdGlvbiwgICAgICAgICAgICAgICAgICAgICAweDU2LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIGZyYW1lIG9wZXJhdGlvbiIgKQotICBGVF9FUlJPUkRFRl8oIE5lc3RlZF9GcmFtZV9BY2Nlc3MsICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTcsCi0gICAgICAgICAgICAgICAgIm5lc3RlZCBmcmFtZSBhY2Nlc3MiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX0ZyYW1lX1JlYWQsICAgICAgICAgICAgICAgICAgICAgICAgICAweDU4LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIGZyYW1lIHJlYWQiICkKLQotICAvKiByYXN0ZXIgZXJyb3JzICovCi0KLSAgRlRfRVJST1JERUZfKCBSYXN0ZXJfVW5pbml0aWFsaXplZCwgICAgICAgICAgICAgICAgICAgICAgICAweDYwLAotICAgICAgICAgICAgICAgICJyYXN0ZXIgdW5pbml0aWFsaXplZCIgKQotICBGVF9FUlJPUkRFRl8oIFJhc3Rlcl9Db3JydXB0ZWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjEsCi0gICAgICAgICAgICAgICAgInJhc3RlciBjb3JydXB0ZWQiICkKLSAgRlRfRVJST1JERUZfKCBSYXN0ZXJfT3ZlcmZsb3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYyLAotICAgICAgICAgICAgICAgICJyYXN0ZXIgb3ZlcmZsb3ciICkKLSAgRlRfRVJST1JERUZfKCBSYXN0ZXJfTmVnYXRpdmVfSGVpZ2h0LCAgICAgICAgICAgICAgICAgICAgICAweDYzLAotICAgICAgICAgICAgICAgICJuZWdhdGl2ZSBoZWlnaHQgd2hpbGUgcmFzdGVyaW5nIiApCi0KLSAgLyogY2FjaGUgZXJyb3JzICovCi0KLSAgRlRfRVJST1JERUZfKCBUb29fTWFueV9DYWNoZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDcwLAotICAgICAgICAgICAgICAgICJ0b28gbWFueSByZWdpc3RlcmVkIGNhY2hlcyIgKQotCi0gIC8qIFRydWVUeXBlIGFuZCBTRk5UIGVycm9ycyAqLwotCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9PcGNvZGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MCwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBvcGNvZGUiICkKLSAgRlRfRVJST1JERUZfKCBUb29fRmV3X0FyZ3VtZW50cywgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgxLAotICAgICAgICAgICAgICAgICJ0b28gZmV3IGFyZ3VtZW50cyIgKQotICBGVF9FUlJPUkRFRl8oIFN0YWNrX092ZXJmbG93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIsCi0gICAgICAgICAgICAgICAgInN0YWNrIG92ZXJmbG93IiApCi0gIEZUX0VSUk9SREVGXyggQ29kZV9PdmVyZmxvdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MywKLSAgICAgICAgICAgICAgICAiY29kZSBvdmVyZmxvdyIgKQotICBGVF9FUlJPUkRFRl8oIEJhZF9Bcmd1bWVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODQsCi0gICAgICAgICAgICAgICAgImJhZCBhcmd1bWVudCIgKQotICBGVF9FUlJPUkRFRl8oIERpdmlkZV9CeV9aZXJvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODUsCi0gICAgICAgICAgICAgICAgImRpdmlzaW9uIGJ5IHplcm8iICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1JlZmVyZW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg2LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIHJlZmVyZW5jZSIgKQotICBGVF9FUlJPUkRFRl8oIERlYnVnX09wQ29kZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODcsCi0gICAgICAgICAgICAgICAgImZvdW5kIGRlYnVnIG9wY29kZSIgKQotICBGVF9FUlJPUkRFRl8oIEVOREZfSW5fRXhlY19TdHJlYW0sICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgsCi0gICAgICAgICAgICAgICAgImZvdW5kIEVOREYgb3Bjb2RlIGluIGV4ZWN1dGlvbiBzdHJlYW0iICkKLSAgRlRfRVJST1JERUZfKCBOZXN0ZWRfREVGUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg5LAotICAgICAgICAgICAgICAgICJuZXN0ZWQgREVGUyIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfQ29kZVJhbmdlLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEEsCi0gICAgICAgICAgICAgICAgImludmFsaWQgY29kZSByYW5nZSIgKQotICBGVF9FUlJPUkRFRl8oIEV4ZWN1dGlvbl9Ub29fTG9uZywgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEIsCi0gICAgICAgICAgICAgICAgImV4ZWN1dGlvbiBjb250ZXh0IHRvbyBsb25nIiApCi0gIEZUX0VSUk9SREVGXyggVG9vX01hbnlfRnVuY3Rpb25fRGVmcywgICAgICAgICAgICAgICAgICAgICAgMHg4QywKLSAgICAgICAgICAgICAgICAidG9vIG1hbnkgZnVuY3Rpb24gZGVmaW5pdGlvbnMiICkKLSAgRlRfRVJST1JERUZfKCBUb29fTWFueV9JbnN0cnVjdGlvbl9EZWZzLCAgICAgICAgICAgICAgICAgICAweDhELAotICAgICAgICAgICAgICAgICJ0b28gbWFueSBpbnN0cnVjdGlvbiBkZWZpbml0aW9ucyIgKQotICBGVF9FUlJPUkRFRl8oIFRhYmxlX01pc3NpbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEUsCi0gICAgICAgICAgICAgICAgIlNGTlQgZm9udCB0YWJsZSBtaXNzaW5nIiApCi0gIEZUX0VSUk9SREVGXyggSG9yaXpfSGVhZGVyX01pc3NpbmcsICAgICAgICAgICAgICAgICAgICAgICAgMHg4RiwKLSAgICAgICAgICAgICAgICAiaG9yaXpvbnRhbCBoZWFkZXIgKGhoZWEpIHRhYmxlIG1pc3NpbmciICkKLSAgRlRfRVJST1JERUZfKCBMb2NhdGlvbnNfTWlzc2luZywgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkwLAotICAgICAgICAgICAgICAgICJsb2NhdGlvbnMgKGxvY2EpIHRhYmxlIG1pc3NpbmciICkKLSAgRlRfRVJST1JERUZfKCBOYW1lX1RhYmxlX01pc3NpbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAweDkxLAotICAgICAgICAgICAgICAgICJuYW1lIHRhYmxlIG1pc3NpbmciICkKLSAgRlRfRVJST1JERUZfKCBDTWFwX1RhYmxlX01pc3NpbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAweDkyLAotICAgICAgICAgICAgICAgICJjaGFyYWN0ZXIgbWFwIChjbWFwKSB0YWJsZSBtaXNzaW5nIiApCi0gIEZUX0VSUk9SREVGXyggSG10eF9UYWJsZV9NaXNzaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5MywKLSAgICAgICAgICAgICAgICAiaG9yaXpvbnRhbCBtZXRyaWNzIChobXR4KSB0YWJsZSBtaXNzaW5nIiApCi0gIEZUX0VSUk9SREVGXyggUG9zdF9UYWJsZV9NaXNzaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5NCwKLSAgICAgICAgICAgICAgICAiUG9zdFNjcmlwdCAocG9zdCkgdGFibGUgbWlzc2luZyIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfSG9yaXpfTWV0cmljcywgICAgICAgICAgICAgICAgICAgICAgIDB4OTUsCi0gICAgICAgICAgICAgICAgImludmFsaWQgaG9yaXpvbnRhbCBtZXRyaWNzIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9DaGFyTWFwX0Zvcm1hdCwgICAgICAgICAgICAgICAgICAgICAgMHg5NiwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBjaGFyYWN0ZXIgbWFwIChjbWFwKSBmb3JtYXQiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1BQZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDk3LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIHBwZW0gdmFsdWUiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1ZlcnRfTWV0cmljcywgICAgICAgICAgICAgICAgICAgICAgICAweDk4LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIHZlcnRpY2FsIG1ldHJpY3MiICkKLSAgRlRfRVJST1JERUZfKCBDb3VsZF9Ob3RfRmluZF9Db250ZXh0LCAgICAgICAgICAgICAgICAgICAgICAweDk5LAotICAgICAgICAgICAgICAgICJjb3VsZCBub3QgZmluZCBjb250ZXh0IiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9Qb3N0X1RhYmxlX0Zvcm1hdCwgICAgICAgICAgICAgICAgICAgMHg5QSwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBQb3N0U2NyaXB0IChwb3N0KSB0YWJsZSBmb3JtYXQiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1Bvc3RfVGFibGUsICAgICAgICAgICAgICAgICAgICAgICAgICAweDlCLAotICAgICAgICAgICAgICAgICJpbnZhbGlkIFBvc3RTY3JpcHQgKHBvc3QpIHRhYmxlIiApCi0KLSAgLyogQ0ZGLCBDSUQsIGFuZCBUeXBlIDEgZXJyb3JzICovCi0KLSAgRlRfRVJST1JERUZfKCBTeW50YXhfRXJyb3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEEwLAotICAgICAgICAgICAgICAgICJvcGNvZGUgc3ludGF4IGVycm9yIiApCi0gIEZUX0VSUk9SREVGXyggU3RhY2tfVW5kZXJmbG93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhBMSwKLSAgICAgICAgICAgICAgICAiYXJndW1lbnQgc3RhY2sgdW5kZXJmbG93IiApCi0gIEZUX0VSUk9SREVGXyggSWdub3JlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhBMiwKLSAgICAgICAgICAgICAgICAiaWdub3JlIiApCi0gIEZUX0VSUk9SREVGXyggTm9fVW5pY29kZV9HbHlwaF9OYW1lLCAgICAgICAgICAgICAgICAgICAgICAgMHhBMywKLSAgICAgICAgICAgICAgICAibm8gVW5pY29kZSBnbHlwaCBuYW1lIGZvdW5kIiApCi0gIEZUX0VSUk9SREVGXyggR2x5cGhfVG9vX0JpZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhBNCwKLSAgICAgICAgICAgICAgICAiZ2x5cGggdG8gYmlnIGZvciBoaW50aW5nIiApCi0KLSAgLyogQkRGIGVycm9ycyAqLwotCi0gIEZUX0VSUk9SREVGXyggTWlzc2luZ19TdGFydGZvbnRfRmllbGQsICAgICAgICAgICAgICAgICAgICAgMHhCMCwKLSAgICAgICAgICAgICAgICAiYFNUQVJURk9OVCcgZmllbGQgbWlzc2luZyIgKQotICBGVF9FUlJPUkRFRl8oIE1pc3NpbmdfRm9udF9GaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjEsCi0gICAgICAgICAgICAgICAgImBGT05UJyBmaWVsZCBtaXNzaW5nIiApCi0gIEZUX0VSUk9SREVGXyggTWlzc2luZ19TaXplX0ZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCMiwKLSAgICAgICAgICAgICAgICAiYFNJWkUnIGZpZWxkIG1pc3NpbmciICkKLSAgRlRfRVJST1JERUZfKCBNaXNzaW5nX0ZvbnRib3VuZGluZ2JveF9GaWVsZCwgICAgICAgICAgICAgICAweEIzLAotICAgICAgICAgICAgICAgICJgRk9OVEJPVU5ESU5HQk9YJyBmaWVsZCBtaXNzaW5nIiApCi0gIEZUX0VSUk9SREVGXyggTWlzc2luZ19DaGFyc19GaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgMHhCNCwKLSAgICAgICAgICAgICAgICAiYENIQVJTJyBmaWVsZCBtaXNzaW5nIiApCi0gIEZUX0VSUk9SREVGXyggTWlzc2luZ19TdGFydGNoYXJfRmllbGQsICAgICAgICAgICAgICAgICAgICAgMHhCNSwKLSAgICAgICAgICAgICAgICAiYFNUQVJUQ0hBUicgZmllbGQgbWlzc2luZyIgKQotICBGVF9FUlJPUkRFRl8oIE1pc3NpbmdfRW5jb2RpbmdfRmllbGQsICAgICAgICAgICAgICAgICAgICAgIDB4QjYsCi0gICAgICAgICAgICAgICAgImBFTkNPRElORycgZmllbGQgbWlzc2luZyIgKQotICBGVF9FUlJPUkRFRl8oIE1pc3NpbmdfQmJ4X0ZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjcsCi0gICAgICAgICAgICAgICAgImBCQlgnIGZpZWxkIG1pc3NpbmciICkKLSAgRlRfRVJST1JERUZfKCBCYnhfVG9vX0JpZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI4LAotICAgICAgICAgICAgICAgICJgQkJYJyB0b28gYmlnIiApCi0gIEZUX0VSUk9SREVGXyggQ29ycnVwdGVkX0ZvbnRfSGVhZGVyLCAgICAgICAgICAgICAgICAgICAgICAgMHhCOSwKLSAgICAgICAgICAgICAgICAiRm9udCBoZWFkZXIgY29ycnVwdGVkIG9yIG1pc3NpbmcgZmllbGRzIiApCi0gIEZUX0VSUk9SREVGXyggQ29ycnVwdGVkX0ZvbnRfR2x5cGhzLCAgICAgICAgICAgICAgICAgICAgICAgMHhCQSwKLSAgICAgICAgICAgICAgICAiRm9udCBnbHlwaHMgY29ycnVwdGVkIG9yIG1pc3NpbmcgZmllbGRzIiApCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0ZXJyb3JzLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0ZXJyb3JzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYTNlNGQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdGVycm9ycy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0ZXJyb3JzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlIGhhbmRsaW5nIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAyLCAyMDA0LCAyMDA3LCAyMDEzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgc3BlY2lhbCBoZWFkZXIgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgaGFuZGxpbmcgb2YgRlQyICAgICAgICAqLwotICAvKiBlbnVtZXJhdGlvbiBjb25zdGFudHMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGdlbmVyYXRlIGVycm9yIG1lc3NhZ2UgKi8KLSAgLyogc3RyaW5ncyB3aXRoIGEgc21hbGwgbWFjcm8gdHJpY2sgZXhwbGFpbmVkIGJlbG93LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJIC0gRXJyb3IgRm9ybWF0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoZSBjb25maWd1cmF0aW9uIG1hY3JvIEZUX0NPTkZJR19PUFRJT05fVVNFX01PRFVMRV9FUlJPUlMgY2FuIGJlICAgKi8KLSAgLyogICBkZWZpbmVkIGluIGZ0b3B0aW9uLmggaW4gb3JkZXIgdG8gbWFrZSB0aGUgaGlnaGVyIGJ5dGUgaW5kaWNhdGUgICAgICovCi0gIC8qICAgdGhlIG1vZHVsZSB3aGVyZSB0aGUgZXJyb3IgaGFzIGhhcHBlbmVkICh0aGlzIGlzIG5vdCBjb21wYXRpYmxlICAgICAqLwotICAvKiAgIHdpdGggc3RhbmRhcmQgYnVpbGRzIG9mIEZyZWVUeXBlIDIpLiAgU2VlIHRoZSBmaWxlIGBmdG1vZGVyci5oJyBmb3IgKi8KLSAgLyogICBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSUkgLSBFcnJvciBNZXNzYWdlIHN0cmluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGUgZXJyb3IgZGVmaW5pdGlvbnMgYmVsb3cgYXJlIG1hZGUgdGhyb3VnaCBzcGVjaWFsIG1hY3JvcyB0aGF0ICAgICovCi0gIC8qICAgYWxsb3cgY2xpZW50IGFwcGxpY2F0aW9ucyB0byBidWlsZCBhIHRhYmxlIG9mIGVycm9yIG1lc3NhZ2Ugc3RyaW5ncyAqLwotICAvKiAgIGlmIHRoZXkgbmVlZCBpdC4gIFRoZSBzdHJpbmdzIGFyZSBub3QgaW5jbHVkZWQgaW4gYSBub3JtYWwgYnVpbGQgb2YgKi8KLSAgLyogICBGcmVlVHlwZSAyIHRvIHNhdmUgc3BhY2UgKG1vc3QgY2xpZW50IGFwcGxpY2F0aW9ucyBkbyBub3QgdXNlICAgICAgICovCi0gIC8qICAgdGhlbSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUbyBkbyBzbywgeW91IGhhdmUgdG8gZGVmaW5lIHRoZSBmb2xsb3dpbmcgbWFjcm9zIGJlZm9yZSBpbmNsdWRpbmcgICovCi0gIC8qICAgdGhpcyBmaWxlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGVF9FUlJPUl9TVEFSVF9MSVNUIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBUaGlzIG1hY3JvIGlzIGNhbGxlZCBiZWZvcmUgYW55dGhpbmcgZWxzZSB0byBkZWZpbmUgdGhlIHN0YXJ0IG9mICAqLwotICAvKiAgICAgdGhlIGVycm9yIGxpc3QuICBJdCBpcyBmb2xsb3dlZCBieSBzZXZlcmFsIEZUX0VSUk9SX0RFRiBjYWxscyAgICAgKi8KLSAgLyogICAgIChzZWUgYmVsb3cpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZUX0VSUk9SX0RFRiggZSwgdiwgcyApIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIFRoaXMgbWFjcm8gaXMgY2FsbGVkIHRvIGRlZmluZSBvbmUgc2luZ2xlIGVycm9yLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBgZScgaXMgdGhlIGVycm9yIGNvZGUgaWRlbnRpZmllciAoZS5nLiBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudCkuICAqLwotICAvKiAgICAgYHYnIGlzIHRoZSBlcnJvciBudW1lcmljYWwgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGBzJyBpcyB0aGUgY29ycmVzcG9uZGluZyBlcnJvciBzdHJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZUX0VSUk9SX0VORF9MSVNUIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIFRoaXMgbWFjcm8gZW5kcyB0aGUgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEFkZGl0aW9uYWxseSwgeW91IGhhdmUgdG8gdW5kZWZpbmUgX19GVEVSUk9SU19IX18gYmVmb3JlICNpbmNsdWRpbmcgKi8KLSAgLyogICB0aGlzIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEhlcmUgaXMgYSBzaW1wbGUgZXhhbXBsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAjdW5kZWYgX19GVEVSUk9SU19IX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgI2RlZmluZSBGVF9FUlJPUkRFRiggZSwgdiwgcyApICB7IGUsIHMgfSwgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICNkZWZpbmUgRlRfRVJST1JfU1RBUlRfTElTVCAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAjZGVmaW5lIEZUX0VSUk9SX0VORF9MSVNUICAgICAgIHsgMCwgMCB9IH07ICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIGNvbnN0IHN0cnVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICBpbnQgICAgICAgICAgZXJyX2NvZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgY29uc3QgY2hhciogIGVycl9tc2c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICB9IGZ0X2Vycm9yc1tdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICNpbmNsdWRlIEZUX0VSUk9SU19IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVEVSUk9SU19IX18KLSNkZWZpbmUgX19GVEVSUk9SU19IX18KLQotCi0gIC8qIGluY2x1ZGUgbW9kdWxlIGJhc2UgZXJyb3IgY29kZXMgKi8KLSNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICBTRVRVUCBNQUNST1MgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI3VuZGVmICBGVF9ORUVEX0VYVEVSTl9DCi0KLQotICAvKiBGVF9FUlJfUFJFRklYIGlzIHVzZWQgYXMgYSBwcmVmaXggZm9yIGVycm9yIGlkZW50aWZpZXJzLiAqLwotICAvKiBCeSBkZWZhdWx0LCB3ZSB1c2UgYEZUX0Vycl8nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9FUlJfUFJFRklYCi0jZGVmaW5lIEZUX0VSUl9QUkVGSVggIEZUX0Vycl8KLSNlbmRpZgotCi0KLSAgLyogRlRfRVJSX0JBU0UgaXMgdXNlZCBhcyB0aGUgYmFzZSBmb3IgbW9kdWxlLXNwZWNpZmljIGVycm9ycy4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1VTRV9NT0RVTEVfRVJST1JTCi0KLSNpZm5kZWYgRlRfRVJSX0JBU0UKLSNkZWZpbmUgRlRfRVJSX0JBU0UgIEZUX01vZF9FcnJfQmFzZQotI2VuZGlmCi0KLSNlbHNlCi0KLSN1bmRlZiBGVF9FUlJfQkFTRQotI2RlZmluZSBGVF9FUlJfQkFTRSAgMAotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9VU0VfTU9EVUxFX0VSUk9SUyAqLwotCi0KLSAgLyogSWYgRlRfRVJST1JERUYgaXMgbm90IGRlZmluZWQsIHdlIG5lZWQgdG8gZGVmaW5lIGEgc2ltcGxlICovCi0gIC8qIGVudW1lcmF0aW9uIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZm5kZWYgRlRfRVJST1JERUYKLQotI2RlZmluZSBGVF9FUlJPUkRFRiggZSwgdiwgcyApICBlID0gdiwKLSNkZWZpbmUgRlRfRVJST1JfU1RBUlRfTElTVCAgICAgZW51bSB7Ci0jZGVmaW5lIEZUX0VSUk9SX0VORF9MSVNUICAgICAgIEZUX0VSUl9DQVQoIEZUX0VSUl9QUkVGSVgsIE1heCApIH07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9ORUVEX0VYVEVSTl9DCi0gIGV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNlbmRpZiAvKiAhRlRfRVJST1JERUYgKi8KLQotCi0gIC8qIHRoaXMgbWFjcm8gaXMgdXNlZCB0byBkZWZpbmUgYW4gZXJyb3IgKi8KLSNkZWZpbmUgRlRfRVJST1JERUZfKCBlLCB2LCBzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfRVJST1JERUYoIEZUX0VSUl9DQVQoIEZUX0VSUl9QUkVGSVgsIGUgKSwgdiArIEZUX0VSUl9CQVNFLCBzICkKLQotICAvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgPG1vZHVsZT5fRXJyX09rLCB3aGljaCBtdXN0IGJlIDAhICovCi0jZGVmaW5lIEZUX05PRVJST1JERUZfKCBlLCB2LCBzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9FUlJPUkRFRiggRlRfRVJSX0NBVCggRlRfRVJSX1BSRUZJWCwgZSApLCB2LCBzICkKLQotCi0jaWZkZWYgRlRfRVJST1JfU1RBUlRfTElTVAotICBGVF9FUlJPUl9TVEFSVF9MSVNUCi0jZW5kaWYKLQotCi0gIC8qIG5vdyBpbmNsdWRlIHRoZSBlcnJvciBjb2RlcyAqLwotI2luY2x1ZGUgRlRfRVJST1JfREVGSU5JVElPTlNfSAotCi0KLSNpZmRlZiBGVF9FUlJPUl9FTkRfTElTVAotICBGVF9FUlJPUl9FTkRfTElTVAotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgU0lNUExFIENMRUFOVVAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIEZUX05FRURfRVhURVJOX0MKLSAgfQotI2VuZGlmCi0KLSN1bmRlZiBGVF9FUlJPUl9TVEFSVF9MSVNUCi0jdW5kZWYgRlRfRVJST1JfRU5EX0xJU1QKLQotI3VuZGVmIEZUX0VSUk9SREVGCi0jdW5kZWYgRlRfRVJST1JERUZfCi0jdW5kZWYgRlRfTk9FUlJPUkRFRl8KLQotI3VuZGVmIEZUX05FRURfRVhURVJOX0MKLSN1bmRlZiBGVF9FUlJfQkFTRQotCi0gIC8qIEZUX0VSUl9QUkVGSVggaXMgbmVlZGVkIGludGVybmFsbHkgKi8KLSNpZm5kZWYgRlQyX0JVSUxEX0xJQlJBUlkKLSN1bmRlZiBGVF9FUlJfUFJFRklYCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fRlRFUlJPUlNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0Z2FzcC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdGdhc3AuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YzZDc2NS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0Z2FzcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Z2FzcC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBY2Nlc3Mgb2YgVHJ1ZVR5cGUncyBgZ2FzcCcgdGFibGUgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNywgMjAwOCwgMjAxMSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfRlRfR0FTUF9IXwotI2RlZmluZSBfRlRfR0FTUF9IXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzZWN0aW9uOgotICAgKiAgIGdhc3BfdGFibGUKLSAgICoKLSAgICogQHRpdGxlOgotICAgKiAgIEdhc3AgVGFibGUKLSAgICoKLSAgICogQGFic3RyYWN0OgotICAgKiAgIFJldHJpZXZpbmcgVHJ1ZVR5cGUgYGdhc3AnIHRhYmxlIGVudHJpZXMuCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGUgZnVuY3Rpb24gQEZUX0dldF9HYXNwIGNhbiBiZSB1c2VkIHRvIHF1ZXJ5IGEgVHJ1ZVR5cGUgb3IgT3BlblR5cGUKLSAgICogICBmb250IGZvciBzcGVjaWZpYyBlbnRyaWVzIGluIGl0cyBgZ2FzcCcgdGFibGUsIGlmIGFueS4gIFRoaXMgaXMKLSAgICogICBtYWlubHkgdXNlZnVsIHdoZW4gaW1wbGVtZW50aW5nIG5hdGl2ZSBUcnVlVHlwZSBoaW50aW5nIHdpdGggdGhlCi0gICAqICAgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgdG8gZHVwbGljYXRlIHRoZSBXaW5kb3dzIHRleHQgcmVuZGVyaW5nIHJlc3VsdHMuCi0gICAqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIEZUX0dBU1BfWFhYCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGxpc3Qgb2YgdmFsdWVzIGFuZC9vciBiaXQtZmxhZ3MgcmV0dXJuZWQgYnkgdGhlIEBGVF9HZXRfR2FzcAotICAgKiAgIGZ1bmN0aW9uLgotICAgKgotICAgKiBAdmFsdWVzOgotICAgKiAgIEZUX0dBU1BfTk9fVEFCTEUgOjoKLSAgICogICAgIFRoaXMgc3BlY2lhbCB2YWx1ZSBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIEdBU1AgdGFibGUgaW4gdGhpcyBmYWNlLgotICAgKiAgICAgSXQgaXMgdXAgdG8gdGhlIGNsaWVudCB0byBkZWNpZGUgd2hhdCB0byBkby4KLSAgICoKLSAgICogICBGVF9HQVNQX0RPX0dSSURGSVQgOjoKLSAgICogICAgIEdyaWQtZml0dGluZyBhbmQgaGludGluZyBzaG91bGQgYmUgcGVyZm9ybWVkIGF0IHRoZSBzcGVjaWZpZWQgcHBlbS4KLSAgICogICAgIFRoaXMgKnJlYWxseSogbWVhbnMgVHJ1ZVR5cGUgYnl0ZWNvZGUgaW50ZXJwcmV0YXRpb24uICBJZiB0aGlzIGJpdAotICAgKiAgICAgaXMgbm90IHNldCwgbm8gaGludGluZyBnZXRzIGFwcGxpZWQuCi0gICAqCi0gICAqICAgRlRfR0FTUF9ET19HUkFZIDo6Ci0gICAqICAgICBBbnRpLWFsaWFzZWQgcmVuZGVyaW5nIHNob3VsZCBiZSBwZXJmb3JtZWQgYXQgdGhlIHNwZWNpZmllZCBwcGVtLgotICAgKiAgICAgSWYgbm90IHNldCwgZG8gbW9ub2Nocm9tZSByZW5kZXJpbmcuCi0gICAqCi0gICAqICAgRlRfR0FTUF9TWU1NRVRSSUNfU01PT1RISU5HIDo6Ci0gICAqICAgICBJZiBzZXQsIHNtb290aGluZyBhbG9uZyBtdWx0aXBsZSBheGVzIG11c3QgYmUgdXNlZCB3aXRoIENsZWFyVHlwZS4KLSAgICoKLSAgICogICBGVF9HQVNQX1NZTU1FVFJJQ19HUklERklUIDo6Ci0gICAqICAgICBHcmlkLWZpdHRpbmcgbXVzdCBiZSB1c2VkIHdpdGggQ2xlYXJUeXBlJ3Mgc3ltbWV0cmljIHNtb290aGluZy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhlIGJpdC1mbGFncyBgRlRfR0FTUF9ET19HUklERklUJyBhbmQgYEZUX0dBU1BfRE9fR1JBWScgYXJlIHRvIGJlCi0gICAqICAgdXNlZCBmb3Igc3RhbmRhcmQgZm9udCByYXN0ZXJpemF0aW9uIG9ubHkuICBJbmRlcGVuZGVudGx5IG9mIHRoYXQsCi0gICAqICAgYEZUX0dBU1BfU1lNTUVUUklDX1NNT09USElORycgYW5kIGBGVF9HQVNQX1NZTU1FVFJJQ19HUklERklUJyBhcmUgdG8KLSAgICogICBiZSB1c2VkIGlmIENsZWFyVHlwZSBpcyBlbmFibGVkIChhbmQgYEZUX0dBU1BfRE9fR1JJREZJVCcgYW5kCi0gICAqICAgYEZUX0dBU1BfRE9fR1JBWScgYXJlIGNvbnNlcXVlbnRseSBpZ25vcmVkKS4KLSAgICoKLSAgICogICBgQ2xlYXJUeXBlJyBpcyBNaWNyb3NvZnQncyBpbXBsZW1lbnRhdGlvbiBvZiBMQ0QgcmVuZGVyaW5nLCBwYXJ0bHkKLSAgICogICBwcm90ZWN0ZWQgYnkgcGF0ZW50cy4KLSAgICoKLSAgICogQHNpbmNlOgotICAgKiAgIDIuMy4wCi0gICAqLwotI2RlZmluZSBGVF9HQVNQX05PX1RBQkxFICAgICAgICAgICAgICAgLTEKLSNkZWZpbmUgRlRfR0FTUF9ET19HUklERklUICAgICAgICAgICAweDAxCi0jZGVmaW5lIEZUX0dBU1BfRE9fR1JBWSAgICAgICAgICAgICAgMHgwMgotI2RlZmluZSBGVF9HQVNQX1NZTU1FVFJJQ19TTU9PVEhJTkcgIDB4MDgKLSNkZWZpbmUgRlRfR0FTUF9TWU1NRVRSSUNfR1JJREZJVCAgICAweDEwCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuYzoKLSAgICogICBGVF9HZXRfR2FzcAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgUmVhZCB0aGUgYGdhc3AnIHRhYmxlIGZyb20gYSBUcnVlVHlwZSBvciBPcGVuVHlwZSBmb250IGZpbGUgYW5kCi0gICAqICAgcmV0dXJuIHRoZSBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gY2hhcmFjdGVyIHBpeGVsIHNpemUuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBmYWNlIDo6IFRoZSBzb3VyY2UgZmFjZSBoYW5kbGUuCi0gICAqICAgcHBlbSA6OiBUaGUgdmVydGljYWwgY2hhcmFjdGVyIHBpeGVsIHNpemUuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgQml0IGZsYWdzIChzZWUgQEZUX0dBU1BfWFhYKSwgb3IgQEZUX0dBU1BfTk9fVEFCTEUgaWYgdGhlcmUgaXMgbm8KLSAgICogICBgZ2FzcCcgdGFibGUgaW4gdGhlIGZhY2UuCi0gICAqCi0gICAqIEBzaW5jZToKLSAgICogICAyLjMuMAotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9JbnQgKQotICBGVF9HZXRfR2FzcCggRlRfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgIEZUX1VJbnQgIHBwZW0gKTsKLQotICAvKiAqLwotCi0KLSNlbmRpZiAvKiBfRlRfR0FTUF9IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdGdseXBoLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0Z2x5cGguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVmYTZhOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0Z2x5cGguaAorKysgL2Rldi9udWxsCkBAIC0xLDYwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGdseXBoLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgY29udmVuaWVuY2UgZnVuY3Rpb25zIHRvIGhhbmRsZSBnbHlwaHMgKHNwZWNpZmljYXRpb24pLiAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMywgMjAwNiwgMjAwOCwgMjAwOSwgMjAxMSwgMjAxMywgMjAxNCBieSAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2Ygc2V2ZXJhbCBjb252ZW5pZW5jZSBmdW5jdGlvbnMgICAgKi8KLSAgLyogdGhhdCBjYW4gYmUgdXNlZCBieSBjbGllbnQgYXBwbGljYXRpb25zIHRvIGVhc2lseSByZXRyaWV2ZSBnbHlwaCAgICAgICovCi0gIC8qIGJpdG1hcHMgYW5kIG91dGxpbmVzIGZyb20gYSBnaXZlbiBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlc2UgZnVuY3Rpb25zIHNob3VsZCBiZSBvcHRpb25hbCBpZiB5b3UgYXJlIHdyaXRpbmcgYSBmb250IHNlcnZlciAgICovCi0gIC8qIG9yIHRleHQgbGF5b3V0IGVuZ2luZSBvbiB0b3Agb2YgRnJlZVR5cGUuICBIb3dldmVyLCB0aGV5IGFyZSBwcmV0dHkgICAqLwotICAvKiBoYW5keSBmb3IgbWFueSBvdGhlciBzaW1wbGUgdXNlcyBvZiB0aGUgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVEdMWVBIX0hfXwotI2RlZmluZSBfX0ZUR0xZUEhfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfbWFuYWdlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR2x5cGggTWFuYWdlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR2VuZXJpYyBpbnRlcmZhY2UgdG8gbWFuYWdlIGluZGl2aWR1YWwgZ2x5cGggZGF0YS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGRlZmluaXRpb25zIHVzZWQgdG8gbWFuYWdlIGdseXBoIGRhdGEgICAgICAgICovCi0gIC8qICAgIHRocm91Z2ggZ2VuZXJpYyBGVF9HbHlwaCBvYmplY3RzLiAgRWFjaCBvZiB0aGVtIGNhbiBjb250YWluIGEgICAgICAqLwotICAvKiAgICBiaXRtYXAsIGEgdmVjdG9yIG91dGxpbmUsIG9yIGV2ZW4gaW1hZ2VzIGluIG90aGVyIGZvcm1hdHMuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogZm9yd2FyZCBkZWNsYXJhdGlvbiB0byBhIHByaXZhdGUgdHlwZSAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9HbHlwaF9DbGFzc18gIEZUX0dseXBoX0NsYXNzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSGFuZGxlIHRvIGFuIG9iamVjdCB1c2VkIHRvIG1vZGVsIGdlbmVyaWMgZ2x5cGggaW1hZ2VzLiAgSXQgaXMgYSAgICovCi0gIC8qICAgIHBvaW50ZXIgdG8gdGhlIEBGVF9HbHlwaFJlYyBzdHJ1Y3R1cmUgYW5kIGNhbiBjb250YWluIGEgZ2x5cGggICAgICAqLwotICAvKiAgICBiaXRtYXAgb3IgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHbHlwaCBvYmplY3RzIGFyZSBub3Qgb3duZWQgYnkgdGhlIGxpYnJhcnkuICBZb3UgbXVzdCB0aHVzIHJlbGVhc2UgKi8KLSAgLyogICAgdGhlbSBtYW51YWxseSAodGhyb3VnaCBARlRfRG9uZV9HbHlwaCkgX2JlZm9yZV8gY2FsbGluZyAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9Eb25lX0ZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfR2x5cGhSZWNfKiAgRlRfR2x5cGg7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcm9vdCBnbHlwaCBzdHJ1Y3R1cmUgY29udGFpbnMgYSBnaXZlbiBnbHlwaCBpbWFnZSBwbHVzIGl0cyAgICAgKi8KLSAgLyogICAgYWR2YW5jZSB3aWR0aCBpbiAxNi4xNiBmaXhlZC1wb2ludCBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSB0byB0aGUgRnJlZVR5cGUgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjbGF6eiAgIDo6IEEgcG9pbnRlciB0byB0aGUgZ2x5cGgncyBjbGFzcy4gIFByaXZhdGUuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvcm1hdCAgOjogVGhlIGZvcm1hdCBvZiB0aGUgZ2x5cGgncyBpbWFnZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWR2YW5jZSA6OiBBIDE2LjE2IHZlY3RvciB0aGF0IGdpdmVzIHRoZSBnbHlwaCdzIGFkdmFuY2Ugd2lkdGguICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfR2x5cGhSZWNfCi0gIHsKLSAgICBGVF9MaWJyYXJ5ICAgICAgICAgICAgIGxpYnJhcnk7Ci0gICAgY29uc3QgRlRfR2x5cGhfQ2xhc3MqICBjbGF6ejsKLSAgICBGVF9HbHlwaF9Gb3JtYXQgICAgICAgIGZvcm1hdDsKLSAgICBGVF9WZWN0b3IgICAgICAgICAgICAgIGFkdmFuY2U7Ci0KLSAgfSBGVF9HbHlwaFJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0JpdG1hcEdseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGFuIG9iamVjdCB1c2VkIHRvIG1vZGVsIGEgYml0bWFwIGdseXBoIGltYWdlLiAgVGhpcyBpcyAqLwotICAvKiAgICBhIHN1Yi1jbGFzcyBvZiBARlRfR2x5cGgsIGFuZCBhIHBvaW50ZXIgdG8gQEZUX0JpdG1hcEdseXBoUmVjLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX0JpdG1hcEdseXBoUmVjXyogIEZUX0JpdG1hcEdseXBoOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQml0bWFwR2x5cGhSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCBmb3IgYml0bWFwIGdseXBoIGltYWdlcy4gIFRoaXMgcmVhbGx5IGlzIGEgICAgICAgICovCi0gIC8qICAgIGBzdWItY2xhc3MnIG9mIEBGVF9HbHlwaFJlYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJvb3QgICA6OiBUaGUgcm9vdCBARlRfR2x5cGggZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGVmdCAgIDo6IFRoZSBsZWZ0LXNpZGUgYmVhcmluZywgaS5lLiwgdGhlIGhvcml6b250YWwgZGlzdGFuY2UgICAgICovCi0gIC8qICAgICAgICAgICAgICBmcm9tIHRoZSBjdXJyZW50IHBlbiBwb3NpdGlvbiB0byB0aGUgbGVmdCBib3JkZXIgb2YgdGhlICAqLwotICAvKiAgICAgICAgICAgICAgZ2x5cGggYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRvcCAgICA6OiBUaGUgdG9wLXNpZGUgYmVhcmluZywgaS5lLiwgdGhlIHZlcnRpY2FsIGRpc3RhbmNlIGZyb20gICAqLwotICAvKiAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgcGVuIHBvc2l0aW9uIHRvIHRoZSB0b3AgYm9yZGVyIG9mIHRoZSBnbHlwaCAgKi8KLSAgLyogICAgICAgICAgICAgIGJpdG1hcC4gIFRoaXMgZGlzdGFuY2UgaXMgcG9zaXRpdmUgZm9yIHVwd2FyZHN+eSEgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiaXRtYXAgOjogQSBkZXNjcmlwdG9yIGZvciB0aGUgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3UgY2FuIHR5cGVjYXN0IGFuIEBGVF9HbHlwaCB0byBARlRfQml0bWFwR2x5cGggaWYgeW91IGhhdmUgICAgICAgKi8KLSAgLyogICAgYGdseXBoLT5mb3JtYXQgPT0gRlRfR0xZUEhfRk9STUFUX0JJVE1BUCcuICBUaGlzIGxldHMgeW91IGFjY2VzcyAgICovCi0gIC8qICAgIHRoZSBiaXRtYXAncyBjb250ZW50cyBlYXNpbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGNvcnJlc3BvbmRpbmcgcGl4ZWwgYnVmZmVyIGlzIGFsd2F5cyBvd25lZCBieSBARlRfQml0bWFwR2x5cGggICovCi0gIC8qICAgIGFuZCBpcyB0aHVzIGNyZWF0ZWQgYW5kIGRlc3Ryb3llZCB3aXRoIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0JpdG1hcEdseXBoUmVjXwotICB7Ci0gICAgRlRfR2x5cGhSZWMgIHJvb3Q7Ci0gICAgRlRfSW50ICAgICAgIGxlZnQ7Ci0gICAgRlRfSW50ICAgICAgIHRvcDsKLSAgICBGVF9CaXRtYXAgICAgYml0bWFwOwotCi0gIH0gRlRfQml0bWFwR2x5cGhSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhbiBvYmplY3QgdXNlZCB0byBtb2RlbCBhbiBvdXRsaW5lIGdseXBoIGltYWdlLiAgVGhpcyAgKi8KLSAgLyogICAgaXMgYSBzdWItY2xhc3Mgb2YgQEZUX0dseXBoLCBhbmQgYSBwb2ludGVyIHRvIEBGVF9PdXRsaW5lR2x5cGhSZWMuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9PdXRsaW5lR2x5cGhSZWNfKiAgRlRfT3V0bGluZUdseXBoOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZUdseXBoUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCBmb3Igb3V0bGluZSAodmVjdG9yaWFsKSBnbHlwaCBpbWFnZXMuICBUaGlzICAgICAgICovCi0gIC8qICAgIHJlYWxseSBpcyBhIGBzdWItY2xhc3MnIG9mIEBGVF9HbHlwaFJlYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJvb3QgICAgOjogVGhlIHJvb3QgQEZUX0dseXBoIGZpZWxkcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSA6OiBBIGRlc2NyaXB0b3IgZm9yIHRoZSBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgWW91IGNhbiB0eXBlY2FzdCBhbiBARlRfR2x5cGggdG8gQEZUX091dGxpbmVHbHlwaCBpZiB5b3UgaGF2ZSAgICAgICovCi0gIC8qICAgIGBnbHlwaC0+Zm9ybWF0ID09IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FJy4gIFRoaXMgbGV0cyB5b3UgYWNjZXNzICAqLwotICAvKiAgICB0aGUgb3V0bGluZSdzIGNvbnRlbnQgZWFzaWx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFzIHRoZSBvdXRsaW5lIGlzIGV4dHJhY3RlZCBmcm9tIGEgZ2x5cGggc2xvdCwgaXRzIGNvb3JkaW5hdGVzIGFyZSAqLwotICAvKiAgICBleHByZXNzZWQgbm9ybWFsbHkgaW4gMjYuNiBwaXhlbHMsIHVubGVzcyB0aGUgZmxhZyAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0xPQURfTk9fU0NBTEUgd2FzIHVzZWQgaW4gQEZUX0xvYWRfR2x5cGgoKSBvciBARlRfTG9hZF9DaGFyKCkuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgb3V0bGluZSdzIHRhYmxlcyBhcmUgYWx3YXlzIG93bmVkIGJ5IHRoZSBvYmplY3QgYW5kIGFyZSAgICAgICAgKi8KLSAgLyogICAgZGVzdHJveWVkIHdpdGggaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfT3V0bGluZUdseXBoUmVjXwotICB7Ci0gICAgRlRfR2x5cGhSZWMgIHJvb3Q7Ci0gICAgRlRfT3V0bGluZSAgIG91dGxpbmU7Ci0KLSAgfSBGVF9PdXRsaW5lR2x5cGhSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gZXh0cmFjdCBhIGdseXBoIGltYWdlIGZyb20gYSBzbG90LiAgTm90ZSB0aGF0ICAgKi8KLSAgLyogICAgdGhlIGNyZWF0ZWQgQEZUX0dseXBoIG9iamVjdCBtdXN0IGJlIHJlbGVhc2VkIHdpdGggQEZUX0RvbmVfR2x5cGguICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2xvdCAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZ2x5cGggc2xvdC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWdseXBoIDo6IEEgaGFuZGxlIHRvIHRoZSBnbHlwaCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0dseXBoKCBGVF9HbHlwaFNsb3QgIHNsb3QsCi0gICAgICAgICAgICAgICAgRlRfR2x5cGggICAgICphZ2x5cGggKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoX0NvcHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBjb3B5IGEgZ2x5cGggaW1hZ2UuICBOb3RlIHRoYXQgdGhlIGNyZWF0ZWQgICAgICAqLwotICAvKiAgICBARlRfR2x5cGggb2JqZWN0IG11c3QgYmUgcmVsZWFzZWQgd2l0aCBARlRfRG9uZV9HbHlwaC4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzb3VyY2UgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBnbHlwaCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YXJnZXQgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBnbHlwaCBvYmplY3QuICAwfmluIGNhc2Ugb2YgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2x5cGhfQ29weSggRlRfR2x5cGggICBzb3VyY2UsCi0gICAgICAgICAgICAgICAgIEZUX0dseXBoICAqdGFyZ2V0ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaF9UcmFuc2Zvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUcmFuc2Zvcm0gYSBnbHlwaCBpbWFnZSBpZiBpdHMgZm9ybWF0IGlzIHNjYWxhYmxlLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaCAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBnbHlwaCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXRyaXggOjogQSBwb2ludGVyIHRvIGEgMngyIG1hdHJpeCB0byBhcHBseS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlbHRhICA6OiBBIHBvaW50ZXIgdG8gYSAyZCB2ZWN0b3IgdG8gYXBwbHkuICBDb29yZGluYXRlcyBhcmUgICAgICAqLwotICAvKiAgICAgICAgICAgICAgZXhwcmVzc2VkIGluIDEvNjR0aCBvZiBhIHBpeGVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlIChpZiBub3QgMCwgdGhlIGdseXBoIGZvcm1hdCBpcyBub3Qgc2NhbGFibGUpLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgMngyIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBpcyBhbHNvIGFwcGxpZWQgdG8gdGhlIGdseXBoJ3MgICAgICAgKi8KLSAgLyogICAgYWR2YW5jZSB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2x5cGhfVHJhbnNmb3JtKCBGVF9HbHlwaCAgICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9NYXRyaXgqICBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgZGVsdGEgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoX0JCb3hfTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBtb2RlIGhvdyB0aGUgdmFsdWVzIG9mIEBGVF9HbHlwaF9HZXRfQ0JveCBhcmUgcmV0dXJuZWQuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dMWVBIX0JCT1hfVU5TQ0FMRUQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFJldHVybiB1bnNjYWxlZCBmb250IHVuaXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dMWVBIX0JCT1hfU1VCUElYRUxTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFJldHVybiB1bmZpdHRlZCAyNi42IGNvb3JkaW5hdGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dMWVBIX0JCT1hfR1JJREZJVCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFJldHVybiBncmlkLWZpdHRlZCAyNi42IGNvb3JkaW5hdGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dMWVBIX0JCT1hfVFJVTkNBVEUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFJldHVybiBjb29yZGluYXRlcyBpbiBpbnRlZ2VyIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dMWVBIX0JCT1hfUElYRUxTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFJldHVybiBncmlkLWZpdHRlZCBwaXhlbCBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgZW51bSAgRlRfR2x5cGhfQkJveF9Nb2RlXwotICB7Ci0gICAgRlRfR0xZUEhfQkJPWF9VTlNDQUxFRCAgPSAwLAotICAgIEZUX0dMWVBIX0JCT1hfU1VCUElYRUxTID0gMCwKLSAgICBGVF9HTFlQSF9CQk9YX0dSSURGSVQgICA9IDEsCi0gICAgRlRfR0xZUEhfQkJPWF9UUlVOQ0FURSAgPSAyLAotICAgIEZUX0dMWVBIX0JCT1hfUElYRUxTICAgID0gMwotCi0gIH0gRlRfR2x5cGhfQkJveF9Nb2RlOwotCi0KLSAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgKi8KLSAgLyogYEZUX0dseXBoX0JCb3hfTW9kZScgdmFsdWVzIGluc3RlYWQgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgZnRfZ2x5cGhfYmJveF91bnNjYWxlZCAgIEZUX0dMWVBIX0JCT1hfVU5TQ0FMRUQKLSNkZWZpbmUgZnRfZ2x5cGhfYmJveF9zdWJwaXhlbHMgIEZUX0dMWVBIX0JCT1hfU1VCUElYRUxTCi0jZGVmaW5lIGZ0X2dseXBoX2Jib3hfZ3JpZGZpdCAgICBGVF9HTFlQSF9CQk9YX0dSSURGSVQKLSNkZWZpbmUgZnRfZ2x5cGhfYmJveF90cnVuY2F0ZSAgIEZUX0dMWVBIX0JCT1hfVFJVTkNBVEUKLSNkZWZpbmUgZnRfZ2x5cGhfYmJveF9waXhlbHMgICAgIEZUX0dMWVBIX0JCT1hfUElYRUxTCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaF9HZXRfQ0JveCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gYSBnbHlwaCdzIGBjb250cm9sIGJveCcuICBUaGUgY29udHJvbCBib3ggZW5jbG9zZXMgYWxsIHRoZSAgKi8KLSAgLyogICAgb3V0bGluZSdzIHBvaW50cywgaW5jbHVkaW5nIELDqXppZXIgY29udHJvbCBwb2ludHMuICBUaG91Z2ggaXQgICAgICAqLwotICAvKiAgICBjb2luY2lkZXMgd2l0aCB0aGUgZXhhY3QgYm91bmRpbmcgYm94IGZvciBtb3N0IGdseXBocywgaXQgY2FuIGJlICAgKi8KLSAgLyogICAgc2xpZ2h0bHkgbGFyZ2VyIGluIHNvbWUgc2l0dWF0aW9ucyAobGlrZSB3aGVuIHJvdGF0aW5nIGFuIG91dGxpbmUgICovCi0gIC8qICAgIHRoYXQgY29udGFpbnMgQsOpemllciBvdXRzaWRlIGFyY3MpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGluZyB0aGUgY29udHJvbCBib3ggaXMgdmVyeSBmYXN0LCB3aGlsZSBnZXR0aW5nIHRoZSBib3VuZGluZyAqLwotICAvKiAgICBib3ggY2FuIHRha2UgbXVjaCBtb3JlIHRpbWUgYXMgaXQgbmVlZHMgdG8gd2FsayBvdmVyIGFsbCBzZWdtZW50cyAgKi8KLSAgLyogICAgYW5kIGFyY3MgaW4gdGhlIG91dGxpbmUuICBUbyBnZXQgdGhlIGxhdHRlciwgeW91IGNhbiB1c2UgdGhlICAgICAgICovCi0gIC8qICAgIGBmdGJib3gnIGNvbXBvbmVudCwgd2hpY2ggaXMgZGVkaWNhdGVkIHRvIHRoaXMgc2luZ2xlIHRhc2suICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZ2x5cGggb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kZSAgOjogVGhlIG1vZGUgdGhhdCBpbmRpY2F0ZXMgaG93IHRvIGludGVycHJldCB0aGUgcmV0dXJuZWQgICAgICovCi0gIC8qICAgICAgICAgICAgIGJvdW5kaW5nIGJveCB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFjYm94IDo6IFRoZSBnbHlwaCBjb29yZGluYXRlIGJvdW5kaW5nIGJveC4gIENvb3JkaW5hdGVzIGFyZSAgICAgICAqLwotICAvKiAgICAgICAgICAgICBleHByZXNzZWQgaW4gMS82NHRoIG9mIHBpeGVscyBpZiBpdCBpcyBncmlkLWZpdHRlZC4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb29yZGluYXRlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGdseXBoIG9yaWdpbiwgdXNpbmcgdGhlIHl+dXB3YXJkcyAgKi8KLSAgLyogICAgY29udmVudGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB0aGUgZ2x5cGggaGFzIGJlZW4gbG9hZGVkIHdpdGggQEZUX0xPQURfTk9fU0NBTEUsIGBiYm94X21vZGUnICAgKi8KLSAgLyogICAgbXVzdCBiZSBzZXQgdG8gQEZUX0dMWVBIX0JCT1hfVU5TQ0FMRUQgdG8gZ2V0IHVuc2NhbGVkIGZvbnQgICAgICAgICovCi0gIC8qICAgIHVuaXRzIGluIDI2LjYgcGl4ZWwgZm9ybWF0LiAgVGhlIHZhbHVlIEBGVF9HTFlQSF9CQk9YX1NVQlBJWEVMUyAgICAqLwotICAvKiAgICBpcyBhbm90aGVyIG5hbWUgZm9yIHRoaXMgY29uc3RhbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHRoZSBmb250IGlzIHRyaWNreSBhbmQgdGhlIGdseXBoIGhhcyBiZWVuIGxvYWRlZCB3aXRoICAgICAgICAgICAqLwotICAvKiAgICBARlRfTE9BRF9OT19TQ0FMRSwgdGhlIHJlc3VsdGluZyBDQm94IGlzIG1lYW5pbmdsZXNzLiAgVG8gZ2V0ICAgICAgKi8KLSAgLyogICAgcmVhc29uYWJsZSB2YWx1ZXMgZm9yIHRoZSBDQm94IGl0IGlzIG5lY2Vzc2FyeSB0byBsb2FkIHRoZSBnbHlwaCAgICovCi0gIC8qICAgIGF0IGEgbGFyZ2UgcHBlbSB2YWx1ZSAoc28gdGhhdCB0aGUgaGludGluZyBpbnN0cnVjdGlvbnMgY2FuICAgICAgICAqLwotICAvKiAgICBwcm9wZXJseSBzaGlmdCBhbmQgc2NhbGUgdGhlIHN1YmdseXBocyksIHRoZW4gZXh0cmFjdGluZyB0aGUgQ0JveCwgKi8KLSAgLyogICAgd2hpY2ggY2FuIGJlIGV2ZW50dWFsbHkgY29udmVydGVkIGJhY2sgdG8gZm9udCB1bml0cy4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3RlIHRoYXQgdGhlIG1heGltdW0gY29vcmRpbmF0ZXMgYXJlIGV4Y2x1c2l2ZSwgd2hpY2ggbWVhbnMgdGhhdCAgKi8KLSAgLyogICAgb25lIGNhbiBjb21wdXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBnbHlwaCBpbWFnZSAoYmUgaXQgaW4gICovCi0gIC8qICAgIGludGVnZXIgb3IgMjYuNiBwaXhlbHMpIGFzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgd2lkdGggID0gYmJveC54TWF4IC0gYmJveC54TWluOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGhlaWdodCA9IGJib3gueU1heCAtIGJib3gueU1pbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3RlIGFsc28gdGhhdCBmb3IgMjYuNiBjb29yZGluYXRlcywgaWYgYGJib3hfbW9kZScgaXMgc2V0IHRvICAgICAgKi8KLSAgLyogICAgQEZUX0dMWVBIX0JCT1hfR1JJREZJVCwgdGhlIGNvb3JkaW5hdGVzIHdpbGwgYWxzbyBiZSBncmlkLWZpdHRlZCwgICovCi0gIC8qICAgIHdoaWNoIGNvcnJlc3BvbmRzIHRvOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgYmJveC54TWluID0gRkxPT1IoYmJveC54TWluKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGJib3gueU1pbiA9IEZMT09SKGJib3gueU1pbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBiYm94LnhNYXggPSBDRUlMSU5HKGJib3gueE1heCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgYmJveC55TWF4ID0gQ0VJTElORyhiYm94LnlNYXgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRvIGdldCB0aGUgYmJveCBpbiBwaXhlbCBjb29yZGluYXRlcywgc2V0IGBiYm94X21vZGUnIHRvICAgICAgICAgICAqLwotICAvKiAgICBARlRfR0xZUEhfQkJPWF9UUlVOQ0FURS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRvIGdldCB0aGUgYmJveCBpbiBncmlkLWZpdHRlZCBwaXhlbCBjb29yZGluYXRlcywgc2V0IGBiYm94X21vZGUnICAqLwotICAvKiAgICB0byBARlRfR0xZUEhfQkJPWF9QSVhFTFMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX0dseXBoX0dldF9DQm94KCBGVF9HbHlwaCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgYmJveF9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgRlRfQkJveCAgKmFjYm94ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaF9Ub19CaXRtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb252ZXJ0IGEgZ2l2ZW4gZ2x5cGggb2JqZWN0IHRvIGEgYml0bWFwIGdseXBoIG9iamVjdC4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0aGVfZ2x5cGggICA6OiBBIHBvaW50ZXIgdG8gYSBoYW5kbGUgdG8gdGhlIHRhcmdldCBnbHlwaC4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZW5kZXJfbW9kZSA6OiBBbiBlbnVtZXJhdGlvbiB0aGF0IGRlc2NyaWJlcyBob3cgdGhlIGRhdGEgaXMgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgcmVuZGVyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvcmlnaW4gICAgICA6OiBBIHBvaW50ZXIgdG8gYSB2ZWN0b3IgdXNlZCB0byB0cmFuc2xhdGUgdGhlIGdseXBoICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgaW1hZ2UgYmVmb3JlIHJlbmRlcmluZy4gIENhbiBiZX4wIChpZiBubyAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uKS4gIFRoZSBvcmlnaW4gaXMgZXhwcmVzc2VkIGluICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAyNi42IHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlc3Ryb3kgICAgIDo6IEEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBvcmlnaW5hbCBnbHlwaCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBpbWFnZSBzaG91bGQgYmUgZGVzdHJveWVkIGJ5IHRoaXMgZnVuY3Rpb24uICBJdCBpcyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgbmV2ZXIgZGVzdHJveWVkIGluIGNhc2Ugb2YgZXJyb3IuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcgaWYgdGhlIGdseXBoIGZvcm1hdCBpc24ndCBzY2FsYWJsZS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZ2x5cGggaW1hZ2UgaXMgdHJhbnNsYXRlZCB3aXRoIHRoZSBgb3JpZ2luJyB2ZWN0b3IgYmVmb3JlICAgICAgKi8KLSAgLyogICAgcmVuZGVyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhbiBARlRfR2x5cGggaGFuZGxlLCB0aGF0IHdpbGwgKi8KLSAgLyogICAgYmUgX3JlcGxhY2VkXyBieSB0aGlzIGZ1bmN0aW9uICh3aXRoIG5ld2x5IGFsbG9jYXRlZCBkYXRhKS4gICAgICAgICovCi0gIC8qICAgIFR5cGljYWxseSwgeW91IHdvdWxkIHVzZSAob21pdHRpbmcgZXJyb3IgaGFuZGxpbmcpOiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgRlRfR2x5cGggICAgICAgIGdseXBoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIEZUX0JpdG1hcEdseXBoICBnbHlwaF9iaXRtYXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIC8vIGxvYWQgZ2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBlcnJvciA9IEZUX0xvYWRfQ2hhciggZmFjZSwgZ2x5cGhfaW5kZXgsIEZUX0xPQURfREVGQVVUICk7ICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIC8vIGV4dHJhY3QgZ2x5cGggaW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBlcnJvciA9IEZUX0dldF9HbHlwaCggZmFjZS0+Z2x5cGgsICZnbHlwaCApOyAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIC8vIGNvbnZlcnQgdG8gYSBiaXRtYXAgKGRlZmF1bHQgcmVuZGVyIG1vZGUgKyBkZXN0cm95aW5nIG9sZCkgICovCi0gIC8qICAgICAgICBpZiAoIGdseXBoLT5mb3JtYXQgIT0gRlRfR0xZUEhfRk9STUFUX0JJVE1BUCApICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgZXJyb3IgPSBGVF9HbHlwaF9Ub19CaXRtYXAoICZnbHlwaCwgRlRfUkVOREVSX01PREVfTk9STUFMLCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAxICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBpZiAoIGVycm9yICkgLy8gYGdseXBoJyB1bmNoYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIC8vIGFjY2VzcyBiaXRtYXAgY29udGVudCBieSB0eXBlY2FzdGluZyAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBnbHlwaF9iaXRtYXAgPSAoRlRfQml0bWFwR2x5cGgpZ2x5cGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIC8vIGRvIGZ1bm55IHN0dWZmIHdpdGggaXQsIGxpa2UgYmxpdHRpbmcvZHJhd2luZyAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIC8vIGRpc2NhcmQgZ2x5cGggaW1hZ2UgKGJpdG1hcCBvciBub3QpICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBGVF9Eb25lX0dseXBoKCBnbHlwaCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBIZXJlIGFub3RoZXIgZXhhbXBsZSwgYWdhaW4gd2l0aG91dCBlcnJvciBoYW5kbGluZzogICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIEZUX0dseXBoICBnbHlwaHNbTUFYX0dMWVBIU10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgZm9yICggaWR4ID0gMDsgaSA8IE1BWF9HTFlQSFM7IGkrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgZXJyb3IgPSBGVF9Mb2FkX0dseXBoKCBmYWNlLCBpZHgsIEZUX0xPQURfREVGQVVMVCApIHx8ICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgRlRfR2V0X0dseXBoICggZmFjZS0+Z2x5cGgsICZnbHlwaFtpZHhdICk7ICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgZm9yICggaWR4ID0gMDsgaSA8IE1BWF9HTFlQSFM7IGkrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIEZUX0dseXBoICBiaXRtYXAgPSBnbHlwaHNbaWR4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgLy8gYWZ0ZXIgdGhpcyBjYWxsLCBgYml0bWFwJyBubyBsb25nZXIgcG9pbnRzIGludG8gICAgICAgICAgICovCi0gIC8qICAgICAgICAgIC8vIHRoZSBgZ2x5cGhzJyBhcnJheSAoYW5kIHRoZSBvbGQgdmFsdWUgaXNuJ3QgZGVzdHJveWVkKSAgICAqLwotICAvKiAgICAgICAgICBGVF9HbHlwaF9Ub19CaXRtYXAoICZiaXRtYXAsIEZUX1JFTkRFUl9NT0RFX01PTk8sIDAsIDAgKTsgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgRlRfRG9uZV9HbHlwaCggYml0bWFwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgZm9yICggaWR4ID0gMDsgaSA8IE1BWF9HTFlQSFM7IGkrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgRlRfRG9uZV9HbHlwaCggZ2x5cGhzW2lkeF0gKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dseXBoX1RvX0JpdG1hcCggRlRfR2x5cGgqICAgICAgIHRoZV9nbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgcmVuZGVyX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgICAgIG9yaWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgZGVzdHJveSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9HbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzdHJveSBhIGdpdmVuIGdseXBoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGggOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBnbHlwaCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9Eb25lX0dseXBoKCBGVF9HbHlwaCAgZ2x5cGggKTsKLQotICAvKiAqLwotCi0KLSAgLyogb3RoZXIgaGVscGZ1bCBmdW5jdGlvbnMgKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb21wdXRhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTWF0cml4X011bHRpcGx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUGVyZm9ybSB0aGUgbWF0cml4IG9wZXJhdGlvbiBgYiA9IGEqYicuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYSA6OiBBIHBvaW50ZXIgdG8gbWF0cml4IGBhJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYiA6OiBBIHBvaW50ZXIgdG8gbWF0cml4IGBiJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlc3VsdCBpcyB1bmRlZmluZWQgaWYgZWl0aGVyIGBhJyBvciBgYicgaXMgemVyby4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9NYXRyaXhfTXVsdGlwbHkoIGNvbnN0IEZUX01hdHJpeCogIGEsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTWF0cml4KiAgICAgICAgYiApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTWF0cml4X0ludmVydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW52ZXJ0IGEgMngyIG1hdHJpeC4gIFJldHVybiBhbiBlcnJvciBpZiBpdCBjYW4ndCBiZSBpbnZlcnRlZC4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF0cml4IDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IG1hdHJpeC4gIFJlbWFpbnMgdW50b3VjaGVkIGluICAgICovCi0gIC8qICAgICAgICAgICAgICBjYXNlIG9mIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX01hdHJpeF9JbnZlcnQoIEZUX01hdHJpeCogIG1hdHJpeCApOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVEdMWVBIX0hfXyAqLwotCi0KLS8qIEVORCAqLwotCi0KLS8qIExvY2FsIFZhcmlhYmxlczogKi8KLS8qIGNvZGluZzogdXRmLTggICAgKi8KLS8qIEVuZDogICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRneHZhbC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdGd4dmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YzNkOTMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdGd4dmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRneHZhbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgdmFsaWRhdGluZyBUcnVlVHlwZUdYL0FBVCB0YWJsZXMgKHNwZWNpZmljYXRpb24pLiAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMDYsIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNYXNhdGFrZSBZQU1BVE8sIFJlZGhhdCBLLkssICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUR1hWQUxfSF9fCi0jZGVmaW5lIF9fRlRHWFZBTF9IX18KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ3hfdmFsaWRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVHJ1ZVR5cGVHWC9BQVQgVmFsaWRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gQVBJIHRvIHZhbGlkYXRlIFRydWVUeXBlR1gvQUFUIHRhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBmdW5jdGlvbnMgdG8gdmFsaWRhdGUgICAgICovCi0gIC8qICAgIHNvbWUgVHJ1ZVR5cGVHWCB0YWJsZXMgKGZlYXQsIG1vcnQsIG1vcngsIGJzbG4sIGp1c3QsIGtlcm4sIG9wYmQsICAqLwotICAvKiAgICB0cmFrLCBwcm9wLCBsY2FyKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPcmRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9UcnVlVHlwZUdYX1ZhbGlkYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVHJ1ZVR5cGVHWF9GcmVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9DbGFzc2ljS2Vybl9WYWxpZGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQ2xhc3NpY0tlcm5fRnJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9WQUxJREFURV9HWF9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVkFMSURBVEVfR1hYWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1ZBTElEQVRFX0NLRVJOWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogV2FybmluZzogVXNlIEZUX1ZBTElEQVRFX1hYWCB0byB2YWxpZGF0ZSBhIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIEZvbGxvd2luZyBkZWZpbml0aW9ucyBhcmUgZm9yIGd4dmFsaWQgZGV2ZWxvcGVycy4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEZUX1ZBTElEQVRFX2ZlYXRfSU5ERVggICAgIDAKLSNkZWZpbmUgRlRfVkFMSURBVEVfbW9ydF9JTkRFWCAgICAgMQotI2RlZmluZSBGVF9WQUxJREFURV9tb3J4X0lOREVYICAgICAyCi0jZGVmaW5lIEZUX1ZBTElEQVRFX2JzbG5fSU5ERVggICAgIDMKLSNkZWZpbmUgRlRfVkFMSURBVEVfanVzdF9JTkRFWCAgICAgNAotI2RlZmluZSBGVF9WQUxJREFURV9rZXJuX0lOREVYICAgICA1Ci0jZGVmaW5lIEZUX1ZBTElEQVRFX29wYmRfSU5ERVggICAgIDYKLSNkZWZpbmUgRlRfVkFMSURBVEVfdHJha19JTkRFWCAgICAgNwotI2RlZmluZSBGVF9WQUxJREFURV9wcm9wX0lOREVYICAgICA4Ci0jZGVmaW5lIEZUX1ZBTElEQVRFX2xjYXJfSU5ERVggICAgIDkKLSNkZWZpbmUgRlRfVkFMSURBVEVfR1hfTEFTVF9JTkRFWCAgRlRfVkFMSURBVEVfbGNhcl9JTkRFWAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX1ZBTElEQVRFX0dYX0xFTkdUSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhlIG51bWJlciBvZiB0YWJsZXMgY2hlY2tlZCBpbiB0aGlzIG1vZHVsZS4gIFVzZSBpdCBhcyBhIHBhcmFtZXRlcgotICAgKiAgIGZvciB0aGUgYHRhYmxlLWxlbmd0aCcgYXJndW1lbnQgb2YgZnVuY3Rpb24gQEZUX1RydWVUeXBlR1hfVmFsaWRhdGUuCi0gICAqLwotI2RlZmluZSBGVF9WQUxJREFURV9HWF9MRU5HVEggICAgIChGVF9WQUxJREFURV9HWF9MQVNUX0lOREVYICsgMSkKLQotICAvKiAqLwotCi0gIC8qIFVwIHRvIDB4MTAwMCBpcyB1c2VkIGJ5IG90dmFsaWQuCi0gICAgIE94Mnh4eCBpcyByZXNlcnZlZCBmb3IgZmVhdHVyZSBPVCBleHRlbnNpb24uICovCi0jZGVmaW5lIEZUX1ZBTElEQVRFX0dYX1NUQVJUIDB4NDAwMAotI2RlZmluZSBGVF9WQUxJREFURV9HWF9CSVRGSUVMRCggdGFnICkgICAgICAgICAgICAgICAgICBcCi0gICggRlRfVkFMSURBVEVfR1hfU1RBUlQgPDwgRlRfVkFMSURBVEVfIyN0YWcjI19JTkRFWCApCi0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZW51bToKLSAgKiAgICBGVF9WQUxJREFURV9HWFhYWAotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIEEgbGlzdCBvZiBiaXQtZmllbGQgY29uc3RhbnRzIHVzZWQgd2l0aCBARlRfVHJ1ZVR5cGVHWF9WYWxpZGF0ZSB0bwotICAqICAgIGluZGljYXRlIHdoaWNoIFRydWVUeXBlR1gvQUFUIFR5cGUgdGFibGVzIHNob3VsZCBiZSB2YWxpZGF0ZWQuCi0gICoKLSAgKiBAdmFsdWVzOgotICAqICAgIEZUX1ZBTElEQVRFX2ZlYXQgOjoKLSAgKiAgICAgIFZhbGlkYXRlIGBmZWF0JyB0YWJsZS4KLSAgKgotICAqICAgIEZUX1ZBTElEQVRFX21vcnQgOjoKLSAgKiAgICAgIFZhbGlkYXRlIGBtb3J0JyB0YWJsZS4KLSAgKgotICAqICAgIEZUX1ZBTElEQVRFX21vcnggOjoKLSAgKiAgICAgIFZhbGlkYXRlIGBtb3J4JyB0YWJsZS4KLSAgKgotICAqICAgIEZUX1ZBTElEQVRFX2JzbG4gOjoKLSAgKiAgICAgIFZhbGlkYXRlIGBic2xuJyB0YWJsZS4KLSAgKgotICAqICAgIEZUX1ZBTElEQVRFX2p1c3QgOjoKLSAgKiAgICAgIFZhbGlkYXRlIGBqdXN0JyB0YWJsZS4KLSAgKgotICAqICAgIEZUX1ZBTElEQVRFX2tlcm4gOjoKLSAgKiAgICAgIFZhbGlkYXRlIGBrZXJuJyB0YWJsZS4KLSAgKgotICAqICAgIEZUX1ZBTElEQVRFX29wYmQgOjoKLSAgKiAgICAgIFZhbGlkYXRlIGBvcGJkJyB0YWJsZS4KLSAgKgotICAqICAgIEZUX1ZBTElEQVRFX3RyYWsgOjoKLSAgKiAgICAgIFZhbGlkYXRlIGB0cmFrJyB0YWJsZS4KLSAgKgotICAqICAgIEZUX1ZBTElEQVRFX3Byb3AgOjoKLSAgKiAgICAgIFZhbGlkYXRlIGBwcm9wJyB0YWJsZS4KLSAgKgotICAqICAgIEZUX1ZBTElEQVRFX2xjYXIgOjoKLSAgKiAgICAgIFZhbGlkYXRlIGBsY2FyJyB0YWJsZS4KLSAgKgotICAqICAgIEZUX1ZBTElEQVRFX0dYIDo6Ci0gICogICAgICBWYWxpZGF0ZSBhbGwgVHJ1ZVR5cGVHWCB0YWJsZXMgKGZlYXQsIG1vcnQsIG1vcngsIGJzbG4sIGp1c3QsIGtlcm4sCi0gICogICAgICBvcGJkLCB0cmFrLCBwcm9wIGFuZCBsY2FyKS4KLSAgKgotICAqLwotCi0jZGVmaW5lIEZUX1ZBTElEQVRFX2ZlYXQgIEZUX1ZBTElEQVRFX0dYX0JJVEZJRUxEKCBmZWF0ICkKLSNkZWZpbmUgRlRfVkFMSURBVEVfbW9ydCAgRlRfVkFMSURBVEVfR1hfQklURklFTEQoIG1vcnQgKQotI2RlZmluZSBGVF9WQUxJREFURV9tb3J4ICBGVF9WQUxJREFURV9HWF9CSVRGSUVMRCggbW9yeCApCi0jZGVmaW5lIEZUX1ZBTElEQVRFX2JzbG4gIEZUX1ZBTElEQVRFX0dYX0JJVEZJRUxEKCBic2xuICkKLSNkZWZpbmUgRlRfVkFMSURBVEVfanVzdCAgRlRfVkFMSURBVEVfR1hfQklURklFTEQoIGp1c3QgKQotI2RlZmluZSBGVF9WQUxJREFURV9rZXJuICBGVF9WQUxJREFURV9HWF9CSVRGSUVMRCgga2VybiApCi0jZGVmaW5lIEZUX1ZBTElEQVRFX29wYmQgIEZUX1ZBTElEQVRFX0dYX0JJVEZJRUxEKCBvcGJkICkKLSNkZWZpbmUgRlRfVkFMSURBVEVfdHJhayAgRlRfVkFMSURBVEVfR1hfQklURklFTEQoIHRyYWsgKQotI2RlZmluZSBGVF9WQUxJREFURV9wcm9wICBGVF9WQUxJREFURV9HWF9CSVRGSUVMRCggcHJvcCApCi0jZGVmaW5lIEZUX1ZBTElEQVRFX2xjYXIgIEZUX1ZBTElEQVRFX0dYX0JJVEZJRUxEKCBsY2FyICkKLQotI2RlZmluZSBGVF9WQUxJREFURV9HWCAgKCBGVF9WQUxJREFURV9mZWF0IHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9tb3J0IHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9tb3J4IHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9ic2xuIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9qdXN0IHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9rZXJuIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9vcGJkIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV90cmFrIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9wcm9wIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9sY2FyICkKLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgICBGVF9UcnVlVHlwZUdYX1ZhbGlkYXRlCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgVmFsaWRhdGUgdmFyaW91cyBUcnVlVHlwZUdYIHRhYmxlcyB0byBhc3N1cmUgdGhhdCBhbGwgb2Zmc2V0cyBhbmQKLSAgKiAgICBpbmRpY2VzIGFyZSB2YWxpZC4gIFRoZSBpZGVhIGlzIHRoYXQgYSBoaWdoZXItbGV2ZWwgbGlicmFyeSB0aGF0Ci0gICogICAgYWN0dWFsbHkgZG9lcyB0aGUgdGV4dCBsYXlvdXQgY2FuIGFjY2VzcyB0aG9zZSB0YWJsZXMgd2l0aG91dAotICAqICAgIGVycm9yIGNoZWNraW5nICh3aGljaCBjYW4gYmUgcXVpdGUgdGltZSBjb25zdW1pbmcpLgotICAqCi0gICogQGlucHV0OgotICAqICAgIGZhY2UgOjoKLSAgKiAgICAgICBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KLSAgKgotICAqICAgIHZhbGlkYXRpb25fZmxhZ3MgOjoKLSAgKiAgICAgICBBIGJpdCBmaWVsZCB0aGF0IHNwZWNpZmllcyB0aGUgdGFibGVzIHRvIGJlIHZhbGlkYXRlZC4gIFNlZQotICAqICAgICAgIEBGVF9WQUxJREFURV9HWFhYWCBmb3IgcG9zc2libGUgdmFsdWVzLgotICAqCi0gICogICAgdGFibGVfbGVuZ3RoIDo6Ci0gICogICAgICAgVGhlIHNpemUgb2YgdGhlIGB0YWJsZXMnIGFycmF5LiAgTm9ybWFsbHksIEBGVF9WQUxJREFURV9HWF9MRU5HVEgKLSAgKiAgICAgICBzaG91bGQgYmUgcGFzc2VkLgotICAqCi0gICogQG91dHB1dDoKLSAgKiAgICB0YWJsZXMgOjoKLSAgKiAgICAgICBUaGUgYXJyYXkgd2hlcmUgYWxsIHZhbGlkYXRlZCBzZm50IHRhYmxlcyBhcmUgc3RvcmVkLgotICAqICAgICAgIFRoZSBhcnJheSBpdHNlbGYgbXVzdCBiZSBhbGxvY2F0ZWQgYnkgYSBjbGllbnQuCi0gICoKLSAgKiBAcmV0dXJuOgotICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgKgotICAqIEBub3RlOgotICAqICAgVGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIHdpdGggVHJ1ZVR5cGVHWCBmb250cywgcmV0dXJuaW5nIGFuIGVycm9yCi0gICogICBvdGhlcndpc2UuCi0gICoKLSAgKiAgIEFmdGVyIHVzZSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBkZWFsbG9jYXRlIHRoZSBidWZmZXJzIHBvaW50ZWQgdG8gYnkKLSAgKiAgIGVhY2ggYHRhYmxlcycgZWxlbWVudCwgYnkgY2FsbGluZyBARlRfVHJ1ZVR5cGVHWF9GcmVlLiAgQSBOVUxMIHZhbHVlCi0gICogICBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFibGUgZWl0aGVyIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIGZvbnQsIHRoZQotICAqICAgYXBwbGljYXRpb24gaGFzbid0IGFza2VkIGZvciB2YWxpZGF0aW9uLCBvciB0aGUgdmFsaWRhdG9yIGRvZXNuJ3QgaGF2ZQotICAqICAgdGhlIGFiaWxpdHkgdG8gdmFsaWRhdGUgdGhlIHNmbnQgdGFibGUuCi0gICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9UcnVlVHlwZUdYX1ZhbGlkYXRlKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIHZhbGlkYXRpb25fZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICB0YWJsZXNbRlRfVkFMSURBVEVfR1hfTEVOR1RIXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIHRhYmxlX2xlbmd0aCApOwotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGZ1bmN0aW9uOgotICAqICAgIEZUX1RydWVUeXBlR1hfRnJlZQotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIEZyZWUgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgVHJ1ZVR5cGVHWCB2YWxpZGF0b3IuCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICAgZmFjZSA6OgotICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAqCi0gICogICAgdGFibGUgOjoKLSAgKiAgICAgICBUaGUgcG9pbnRlciB0byB0aGUgYnVmZmVyIGFsbG9jYXRlZCBieQotICAqICAgICAgIEBGVF9UcnVlVHlwZUdYX1ZhbGlkYXRlLgotICAqCi0gICogQG5vdGU6Ci0gICogICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCB0byBmcmVlIHRoZSBidWZmZXIgYWxsb2NhdGVkIGJ5Ci0gICogICBARlRfVHJ1ZVR5cGVHWF9WYWxpZGF0ZSBvbmx5LgotICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9UcnVlVHlwZUdYX0ZyZWUoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICB0YWJsZSApOwotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGVudW06Ci0gICogICAgRlRfVkFMSURBVEVfQ0tFUk5YWFgKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgICBBIGxpc3Qgb2YgYml0LWZpZWxkIGNvbnN0YW50cyB1c2VkIHdpdGggQEZUX0NsYXNzaWNLZXJuX1ZhbGlkYXRlCi0gICogICAgdG8gaW5kaWNhdGUgdGhlIGNsYXNzaWMga2VybiBkaWFsZWN0IG9yIGRpYWxlY3RzLiAgSWYgdGhlIHNlbGVjdGVkCi0gICogICAgdHlwZSBkb2Vzbid0IGZpdCwgQEZUX0NsYXNzaWNLZXJuX1ZhbGlkYXRlIHJlZ2FyZHMgdGhlIHRhYmxlIGFzCi0gICogICAgaW52YWxpZC4KLSAgKgotICAqIEB2YWx1ZXM6Ci0gICogICAgRlRfVkFMSURBVEVfTVMgOjoKLSAgKiAgICAgIEhhbmRsZSB0aGUgYGtlcm4nIHRhYmxlIGFzIGEgY2xhc3NpYyBNaWNyb3NvZnQga2VybiB0YWJsZS4KLSAgKgotICAqICAgIEZUX1ZBTElEQVRFX0FQUExFIDo6Ci0gICogICAgICBIYW5kbGUgdGhlIGBrZXJuJyB0YWJsZSBhcyBhIGNsYXNzaWMgQXBwbGUga2VybiB0YWJsZS4KLSAgKgotICAqICAgIEZUX1ZBTElEQVRFX0NLRVJOIDo6Ci0gICogICAgICBIYW5kbGUgdGhlIGBrZXJuJyBhcyBlaXRoZXIgY2xhc3NpYyBBcHBsZSBvciBNaWNyb3NvZnQga2VybiB0YWJsZS4KLSAgKi8KLSNkZWZpbmUgRlRfVkFMSURBVEVfTVMgICAgICggRlRfVkFMSURBVEVfR1hfU1RBUlQgPDwgMCApCi0jZGVmaW5lIEZUX1ZBTElEQVRFX0FQUExFICAoIEZUX1ZBTElEQVRFX0dYX1NUQVJUIDw8IDEgKQotCi0jZGVmaW5lIEZUX1ZBTElEQVRFX0NLRVJOICAoIEZUX1ZBTElEQVRFX01TIHwgRlRfVkFMSURBVEVfQVBQTEUgKQotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGZ1bmN0aW9uOgotICAqICAgIEZUX0NsYXNzaWNLZXJuX1ZhbGlkYXRlCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgVmFsaWRhdGUgY2xhc3NpYyAoMTYtYml0IGZvcm1hdCkga2VybiB0YWJsZSB0byBhc3N1cmUgdGhhdCB0aGUgb2Zmc2V0cwotICAqICAgIGFuZCBpbmRpY2VzIGFyZSB2YWxpZC4gIFRoZSBpZGVhIGlzIHRoYXQgYSBoaWdoZXItbGV2ZWwgbGlicmFyeSB0aGF0Ci0gICogICAgYWN0dWFsbHkgZG9lcyB0aGUgdGV4dCBsYXlvdXQgY2FuIGFjY2VzcyB0aG9zZSB0YWJsZXMgd2l0aG91dCBlcnJvcgotICAqICAgIGNoZWNraW5nICh3aGljaCBjYW4gYmUgcXVpdGUgdGltZSBjb25zdW1pbmcpLgotICAqCi0gICogICAgVGhlIGBrZXJuJyB0YWJsZSB2YWxpZGF0b3IgaW4gQEZUX1RydWVUeXBlR1hfVmFsaWRhdGUgZGVhbHMgd2l0aCBib3RoCi0gICogICAgdGhlIG5ldyAzMi1iaXQgZm9ybWF0IGFuZCB0aGUgY2xhc3NpYyAxNi1iaXQgZm9ybWF0LCB3aGlsZQotICAqICAgIEZUX0NsYXNzaWNLZXJuX1ZhbGlkYXRlIG9ubHkgc3VwcG9ydHMgdGhlIGNsYXNzaWMgMTYtYml0IGZvcm1hdC4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgICBmYWNlIDo6Ci0gICogICAgICAgQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCi0gICoKLSAgKiAgICB2YWxpZGF0aW9uX2ZsYWdzIDo6Ci0gICogICAgICAgQSBiaXQgZmllbGQgdGhhdCBzcGVjaWZpZXMgdGhlIGRpYWxlY3QgdG8gYmUgdmFsaWRhdGVkLiAgU2VlCi0gICogICAgICAgQEZUX1ZBTElEQVRFX0NLRVJOWFhYIGZvciBwb3NzaWJsZSB2YWx1ZXMuCi0gICoKLSAgKiBAb3V0cHV0OgotICAqICAgIGNrZXJuX3RhYmxlIDo6Ci0gICogICAgICAgQSBwb2ludGVyIHRvIHRoZSBrZXJuIHRhYmxlLgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIEFmdGVyIHVzZSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBkZWFsbG9jYXRlIHRoZSBidWZmZXJzIHBvaW50ZWQgdG8gYnkKLSAgKiAgIGBja2Vybl90YWJsZScsIGJ5IGNhbGxpbmcgQEZUX0NsYXNzaWNLZXJuX0ZyZWUuICBBIE5VTEwgdmFsdWUKLSAgKiAgIGluZGljYXRlcyB0aGF0IHRoZSB0YWJsZSBkb2Vzbid0IGV4aXN0IGluIHRoZSBmb250LgotICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfQ2xhc3NpY0tlcm5fVmFsaWRhdGUoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgdmFsaWRhdGlvbl9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqY2tlcm5fdGFibGUgKTsKLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgICBGVF9DbGFzc2ljS2Vybl9GcmVlCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgRnJlZSB0aGUgYnVmZmVyIGFsbG9jYXRlZCBieSBjbGFzc2ljIEtlcm4gdmFsaWRhdG9yLgotICAqCi0gICogQGlucHV0OgotICAqICAgIGZhY2UgOjoKLSAgKiAgICAgICBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KLSAgKgotICAqICAgIHRhYmxlIDo6Ci0gICogICAgICAgVGhlIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0aGF0IGlzIGFsbG9jYXRlZCBieQotICAqICAgICAgIEBGVF9DbGFzc2ljS2Vybl9WYWxpZGF0ZS4KLSAgKgotICAqIEBub3RlOgotICAqICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgdG8gZnJlZSB0aGUgYnVmZmVyIGFsbG9jYXRlZCBieQotICAqICAgQEZUX0NsYXNzaWNLZXJuX1ZhbGlkYXRlIG9ubHkuCi0gICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX0NsYXNzaWNLZXJuX0ZyZWUoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgdGFibGUgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRHWFZBTF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRnemlwLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0Z3ppcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjM0NmM2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRnemlwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRnemlwLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEd6aXAtY29tcHJlc3NlZCBzdHJlYW0gc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMDQsIDIwMDYsIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRHWklQX0hfXwotI2RlZmluZSBfX0ZUR1pJUF9IX18KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGd6aXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdaSVAgU3RyZWFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzaW5nIGd6aXAtY29tcHJlc3NlZCBmb250IGZpbGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgR3ppcC1zcGVjaWZpYyBmdW5jdGlvbnMuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgIEZUX1N0cmVhbV9PcGVuR3ppcAotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgT3BlbiBhIG5ldyBzdHJlYW0gdG8gcGFyc2UgZ3ppcC1jb21wcmVzc2VkIGZvbnQgZmlsZXMuICBUaGlzIGlzCi0gICogICBtYWlubHkgdXNlZCB0byBzdXBwb3J0IHRoZSBjb21wcmVzc2VkIGAqLnBjZi5neicgZm9udHMgdGhhdCBjb21lCi0gICogICB3aXRoIFhGcmVlODYuCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICBzdHJlYW0gOjoKLSAgKiAgICAgVGhlIHRhcmdldCBlbWJlZGRpbmcgc3RyZWFtLgotICAqCi0gICogICBzb3VyY2UgOjoKLSAgKiAgICAgVGhlIHNvdXJjZSBzdHJlYW0uCi0gICoKLSAgKiBAcmV0dXJuOgotICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgKgotICAqIEBub3RlOgotICAqICAgVGhlIHNvdXJjZSBzdHJlYW0gbXVzdCBiZSBvcGVuZWQgX2JlZm9yZV8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgotICAqCi0gICogICBDYWxsaW5nIHRoZSBpbnRlcm5hbCBmdW5jdGlvbiBgRlRfU3RyZWFtX0Nsb3NlJyBvbiB0aGUgbmV3IHN0cmVhbSB3aWxsCi0gICogICAqbm90KiBjYWxsIGBGVF9TdHJlYW1fQ2xvc2UnIG9uIHRoZSBzb3VyY2Ugc3RyZWFtLiAgTm9uZSBvZiB0aGUgc3RyZWFtCi0gICogICBvYmplY3RzIHdpbGwgYmUgcmVsZWFzZWQgdG8gdGhlIGhlYXAuCi0gICoKLSAgKiAgIFRoZSBzdHJlYW0gaW1wbGVtZW50YXRpb24gaXMgdmVyeSBiYXNpYyBhbmQgcmVzZXRzIHRoZSBkZWNvbXByZXNzaW9uCi0gICogICBwcm9jZXNzIGVhY2ggdGltZSBzZWVraW5nIGJhY2t3YXJkcyBpcyBuZWVkZWQgd2l0aGluIHRoZSBzdHJlYW0uCi0gICoKLSAgKiAgIEluIGNlcnRhaW4gYnVpbGRzIG9mIHRoZSBsaWJyYXJ5LCBnemlwIGNvbXByZXNzaW9uIHJlY29nbml0aW9uIGlzCi0gICogICBhdXRvbWF0aWNhbGx5IGhhbmRsZWQgd2hlbiBjYWxsaW5nIEBGVF9OZXdfRmFjZSBvciBARlRfT3Blbl9GYWNlLgotICAqICAgVGhpcyBtZWFucyB0aGF0IGlmIG5vIGZvbnQgZHJpdmVyIGlzIGNhcGFibGUgb2YgaGFuZGxpbmcgdGhlIHJhdwotICAqICAgY29tcHJlc3NlZCBmaWxlLCB0aGUgbGlicmFyeSB3aWxsIHRyeSB0byBvcGVuIGEgZ3ppcHBlZCBzdHJlYW0gZnJvbQotICAqICAgaXQgYW5kIHJlLW9wZW4gdGhlIGZhY2Ugd2l0aCBpdC4KLSAgKgotICAqICAgVGhpcyBmdW5jdGlvbiBtYXkgcmV0dXJuIGBGVF9FcnJfVW5pbXBsZW1lbnRlZF9GZWF0dXJlJyBpZiB5b3VyIGJ1aWxkCi0gICogICBvZiBGcmVlVHlwZSB3YXMgbm90IGNvbXBpbGVkIHdpdGggemxpYiBzdXBwb3J0LgotICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX09wZW5HemlwKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHNvdXJjZSApOwotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICBGVF9HemlwX1VuY29tcHJlc3MKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgIERlY29tcHJlc3MgYSB6aXBwZWQgaW5wdXQgYnVmZmVyIGludG8gYW4gb3V0cHV0IGJ1ZmZlci4gIFRoaXMgZnVuY3Rpb24KLSAgKiAgIGlzIG1vZGVsZWQgYWZ0ZXIgemxpYidzIGB1bmNvbXByZXNzJyBmdW5jdGlvbi4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgIG1lbW9yeSA6OgotICAqICAgICBBIEZyZWVUeXBlIG1lbW9yeSBoYW5kbGUuCi0gICoKLSAgKiAgIGlucHV0IDo6Ci0gICogICAgIFRoZSBpbnB1dCBidWZmZXIuCi0gICoKLSAgKiAgIGlucHV0X2xlbiA6OgotICAqICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIuCi0gICoKLSAgKiBAb3V0cHV0OgotICAqICAgb3V0cHV0OjoKLSAgKiAgICAgVGhlIG91dHB1dCBidWZmZXIuCi0gICoKLSAgKiBAaW5vdXQ6Ci0gICogICBvdXRwdXRfbGVuIDo6Ci0gICogICAgIEJlZm9yZSBjYWxsaW5nIHRoZSBmdW5jdGlvbiwgdGhpcyBpcyB0aGUgdGhlIHRvdGFsIHNpemUgb2YgdGhlCi0gICogICAgIG91dHB1dCBidWZmZXIsIHdoaWNoIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIGVudGlyZQotICAqICAgICB1bmNvbXByZXNzZWQgZGF0YSAoc28gdGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG11c3QgYmUKLSAgKiAgICAga25vd24gaW4gYWR2YW5jZSkuICBBZnRlciBjYWxsaW5nIHRoZSBmdW5jdGlvbiwgYG91dHB1dF9sZW4nIGlzIHRoZQotICAqICAgICBzaXplIG9mIHRoZSB1c2VkIGRhdGEgaW4gYG91dHB1dCcuCi0gICoKLSAgKiBAcmV0dXJuOgotICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgKgotICAqIEBub3RlOgotICAqICAgVGhpcyBmdW5jdGlvbiBtYXkgcmV0dXJuIGBGVF9FcnJfVW5pbXBsZW1lbnRlZF9GZWF0dXJlJyBpZiB5b3VyIGJ1aWxkCi0gICogICBvZiBGcmVlVHlwZSB3YXMgbm90IGNvbXBpbGVkIHdpdGggemxpYiBzdXBwb3J0LgotICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR3ppcF9VbmNvbXByZXNzKCBGVF9NZW1vcnkgICAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgICBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgIG91dHB1dF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfQnl0ZSogIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICBpbnB1dF9sZW4gKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRHWklQX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdGltYWdlLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0aW1hZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY3Y2EyYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0aW1hZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRpbWFnZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIGdseXBoIGltYWdlIGZvcm1hdHMgYW5kIGRlZmF1bHQgcmFzdGVyIGludGVyZmFjZSAgICAgICAgICAgICovCi0vKiAgICAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDEwLCAyMDEzLCAyMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOb3RlOiBBIGByYXN0ZXInIGlzIHNpbXBseSBhIHNjYW4tbGluZSBjb252ZXJ0ZXIsIHVzZWQgdG8gcmVuZGVyICAgICAgKi8KLSAgLyogICAgICAgRlRfT3V0bGluZXMgaW50byBGVF9CaXRtYXBzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRJTUFHRV9IX18KLSNkZWZpbmUgX19GVElNQUdFX0hfXwotCi0KLSAgLyogX1NUQU5EQUxPTkVfIGlzIGZyb20gZnRncmF5cy5jICovCi0jaWZuZGVmIF9TVEFOREFMT05FXwotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJhc2ljX3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Qb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgdHlwZSBGVF9Qb3MgaXMgdXNlZCB0byBzdG9yZSB2ZWN0b3JpYWwgY29vcmRpbmF0ZXMuICBEZXBlbmRpbmcgKi8KLSAgLyogICAgb24gdGhlIGNvbnRleHQsIHRoZXNlIGNhbiByZXByZXNlbnQgZGlzdGFuY2VzIGluIGludGVnZXIgZm9udCAgICAgICovCi0gIC8qICAgIHVuaXRzLCBvciAxNi4xNiwgb3IgMjYuNiBmaXhlZC1wb2ludCBwaXhlbCBjb29yZGluYXRlcy4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzaWduZWQgbG9uZyAgRlRfUG9zOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzaW1wbGUgc3RydWN0dXJlIHVzZWQgdG8gc3RvcmUgYSAyRCB2ZWN0b3I7IGNvb3JkaW5hdGVzIGFyZSBvZiAgICovCi0gIC8qICAgIHRoZSBGVF9Qb3MgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHggOjogVGhlIGhvcml6b250YWwgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5IDo6IFRoZSB2ZXJ0aWNhbCBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9WZWN0b3JfCi0gIHsKLSAgICBGVF9Qb3MgIHg7Ci0gICAgRlRfUG9zICB5OwotCi0gIH0gRlRfVmVjdG9yOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQkJveCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGFuIG91dGxpbmUncyBib3VuZGluZyBib3gsIGkuZS4sIHRoZSAgICAgICovCi0gIC8qICAgIGNvb3JkaW5hdGVzIG9mIGl0cyBleHRyZW1hIGluIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCAgICAgICAgICAqLwotICAvKiAgICBkaXJlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4TWluIDo6IFRoZSBob3Jpem9udGFsIG1pbmltdW0gKGxlZnQtbW9zdCkuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHlNaW4gOjogVGhlIHZlcnRpY2FsIG1pbmltdW0gKGJvdHRvbS1tb3N0KS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeE1heCA6OiBUaGUgaG9yaXpvbnRhbCBtYXhpbXVtIChyaWdodC1tb3N0KS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5TWF4IDo6IFRoZSB2ZXJ0aWNhbCBtYXhpbXVtICh0b3AtbW9zdCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYm91bmRpbmcgYm94IGlzIHNwZWNpZmllZCB3aXRoIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgbG93ZXIgICAgKi8KLSAgLyogICAgbGVmdCBhbmQgdGhlIHVwcGVyIHJpZ2h0IGNvcm5lci4gIEluIFBvc3RTY3JpcHQsIHRob3NlIHZhbHVlcyBhcmUgICovCi0gIC8qICAgIG9mdGVuIGNhbGxlZCAobGx4LGxseSkgYW5kICh1cngsdXJ5KSwgcmVzcGVjdGl2ZWx5LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgYHlNaW4nIGlzIG5lZ2F0aXZlLCB0aGlzIHZhbHVlIGdpdmVzIHRoZSBnbHlwaCdzIGRlc2NlbmRlci4gICAgICovCi0gIC8qICAgIE90aGVyd2lzZSwgdGhlIGdseXBoIGRvZXNuJ3QgZGVzY2VuZCBiZWxvdyB0aGUgYmFzZWxpbmUuICAgICAgICAgICAqLwotICAvKiAgICBTaW1pbGFybHksIGlmIGB5bWF4JyBpcyBwb3NpdGl2ZSwgdGhpcyB2YWx1ZSBnaXZlcyB0aGUgZ2x5cGgncyAgICAgKi8KLSAgLyogICAgYXNjZW5kZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBgeE1pbicgZ2l2ZXMgdGhlIGhvcml6b250YWwgZGlzdGFuY2UgZnJvbSB0aGUgZ2x5cGgncyBvcmlnaW4gdG8gICAgKi8KLSAgLyogICAgdGhlIGxlZnQgZWRnZSBvZiB0aGUgZ2x5cGgncyBib3VuZGluZyBib3guICBJZiBgeE1pbicgaXMgbmVnYXRpdmUsICovCi0gIC8qICAgIHRoZSBnbHlwaCBleHRlbmRzIHRvIHRoZSBsZWZ0IG9mIHRoZSBvcmlnaW4uICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0JCb3hfCi0gIHsKLSAgICBGVF9Qb3MgIHhNaW4sIHlNaW47Ci0gICAgRlRfUG9zICB4TWF4LCB5TWF4OwotCi0gIH0gRlRfQkJveDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BpeGVsX01vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIGVudW1lcmF0aW9uIHR5cGUgdXNlZCB0byBkZXNjcmliZSB0aGUgZm9ybWF0IG9mIHBpeGVscyBpbiBhICAgICAqLwotICAvKiAgICBnaXZlbiBiaXRtYXAuICBOb3RlIHRoYXQgYWRkaXRpb25hbCBmb3JtYXRzIG1heSBiZSBhZGRlZCBpbiB0aGUgICAgKi8KLSAgLyogICAgZnV0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUElYRUxfTU9ERV9OT05FIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVmFsdWV+MCBpcyByZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUElYRUxfTU9ERV9NT05PIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSBtb25vY2hyb21lIGJpdG1hcCwgdXNpbmcgMX5iaXQgcGVyIHBpeGVsLiAgTm90ZSB0aGF0IHBpeGVscyAgICAqLwotICAvKiAgICAgIGFyZSBzdG9yZWQgaW4gbW9zdC1zaWduaWZpY2FudCBvcmRlciAoTVNCKSwgd2hpY2ggbWVhbnMgdGhhdCAgICAgKi8KLSAgLyogICAgICB0aGUgbGVmdC1tb3N0IHBpeGVsIGluIGEgYnl0ZSBoYXMgdmFsdWUgMTI4LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QSVhFTF9NT0RFX0dSQVkgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBbiA4LWJpdCBiaXRtYXAsIGdlbmVyYWxseSB1c2VkIHRvIHJlcHJlc2VudCBhbnRpLWFsaWFzZWQgZ2x5cGggICovCi0gIC8qICAgICAgaW1hZ2VzLiAgRWFjaCBwaXhlbCBpcyBzdG9yZWQgaW4gb25lIGJ5dGUuICBOb3RlIHRoYXQgdGhlIG51bWJlciAqLwotICAvKiAgICAgIG9mIGBncmF5JyBsZXZlbHMgaXMgc3RvcmVkIGluIHRoZSBgbnVtX2dyYXlzJyBmaWVsZCBvZiB0aGUgICAgICAgKi8KLSAgLyogICAgICBARlRfQml0bWFwIHN0cnVjdHVyZSAoaXQgZ2VuZXJhbGx5IGlzIDI1NikuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QSVhFTF9NT0RFX0dSQVkyIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIDItYml0IHBlciBwaXhlbCBiaXRtYXAsIHVzZWQgdG8gcmVwcmVzZW50IGVtYmVkZGVkICAgICAgICAgICAgICovCi0gIC8qICAgICAgYW50aS1hbGlhc2VkIGJpdG1hcHMgaW4gZm9udCBmaWxlcyBhY2NvcmRpbmcgdG8gdGhlIE9wZW5UeXBlICAgICAqLwotICAvKiAgICAgIHNwZWNpZmljYXRpb24uICBXZSBoYXZlbid0IGZvdW5kIGEgc2luZ2xlIGZvbnQgdXNpbmcgdGhpcyAgICAgICAgKi8KLSAgLyogICAgICBmb3JtYXQsIGhvd2V2ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QSVhFTF9NT0RFX0dSQVk0IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIDQtYml0IHBlciBwaXhlbCBiaXRtYXAsIHJlcHJlc2VudGluZyBlbWJlZGRlZCBhbnRpLWFsaWFzZWQgICAgICovCi0gIC8qICAgICAgYml0bWFwcyBpbiBmb250IGZpbGVzIGFjY29yZGluZyB0byB0aGUgT3BlblR5cGUgc3BlY2lmaWNhdGlvbi4gICAqLwotICAvKiAgICAgIFdlIGhhdmVuJ3QgZm91bmQgYSBzaW5nbGUgZm9udCB1c2luZyB0aGlzIGZvcm1hdCwgaG93ZXZlci4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BJWEVMX01PREVfTENEIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEFuIDgtYml0IGJpdG1hcCwgcmVwcmVzZW50aW5nIFJHQiBvciBCR1IgZGVjaW1hdGVkIGdseXBoIGltYWdlcyAgKi8KLSAgLyogICAgICB1c2VkIGZvciBkaXNwbGF5IG9uIExDRCBkaXNwbGF5czsgdGhlIGJpdG1hcCBpcyB0aHJlZSB0aW1lcyAgICAgICovCi0gIC8qICAgICAgd2lkZXIgdGhhbiB0aGUgb3JpZ2luYWwgZ2x5cGggaW1hZ2UuICBTZWUgYWxzbyAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEBGVF9SRU5ERVJfTU9ERV9MQ0QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BJWEVMX01PREVfTENEX1YgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEFuIDgtYml0IGJpdG1hcCwgcmVwcmVzZW50aW5nIFJHQiBvciBCR1IgZGVjaW1hdGVkIGdseXBoIGltYWdlcyAgKi8KLSAgLyogICAgICB1c2VkIGZvciBkaXNwbGF5IG9uIHJvdGF0ZWQgTENEIGRpc3BsYXlzOyB0aGUgYml0bWFwIGlzIHRocmVlICAgICovCi0gIC8qICAgICAgdGltZXMgdGFsbGVyIHRoYW4gdGhlIG9yaWdpbmFsIGdseXBoIGltYWdlLiAgU2VlIGFsc28gICAgICAgICAgICAqLwotICAvKiAgICAgIEBGVF9SRU5ERVJfTU9ERV9MQ0RfVi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BJWEVMX01PREVfQkdSQSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEFuIGltYWdlIHdpdGggZm91ciA4LWJpdCBjaGFubmVscyBwZXIgcGl4ZWwsIHJlcHJlc2VudGluZyBhICAgICAgKi8KLSAgLyogICAgICBjb2xvciBpbWFnZSAoc3VjaCBhcyBlbW90aWNvbnMpIHdpdGggYWxwaGEgY2hhbm5lbC4gIEZvciBlYWNoICAgICovCi0gIC8qICAgICAgcGl4ZWwsIHRoZSBmb3JtYXQgaXMgQkdSQSwgd2hpY2ggbWVhbnMsIHRoZSBibHVlIGNoYW5uZWwgY29tZXMgICAqLwotICAvKiAgICAgIGZpcnN0IGluIG1lbW9yeS4gIFRoZSBjb2xvciBjaGFubmVscyBhcmUgcHJlLW11bHRpcGxpZWQgYW5kIGluICAgKi8KLSAgLyogICAgICB0aGUgc1JHQiBjb2xvcnNwYWNlLiAgRm9yIGV4YW1wbGUsIGZ1bGwgcmVkIGF0IGhhbGYtdHJhbnNsdWNlbnQgICovCi0gIC8qICAgICAgb3BhY2l0eSB3aWxsIGJlIHJlcHJlc2VudGVkIGFzIGAwMCwwMCw4MCw4MCcsIG5vdCBgMDAsMDAsRkYsODAnLiAqLwotICAvKiAgICAgIFNlZSBhbHNvIEBGVF9MT0FEX0NPTE9SLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgZW51bSAgRlRfUGl4ZWxfTW9kZV8KLSAgewotICAgIEZUX1BJWEVMX01PREVfTk9ORSA9IDAsCi0gICAgRlRfUElYRUxfTU9ERV9NT05PLAotICAgIEZUX1BJWEVMX01PREVfR1JBWSwKLSAgICBGVF9QSVhFTF9NT0RFX0dSQVkyLAotICAgIEZUX1BJWEVMX01PREVfR1JBWTQsCi0gICAgRlRfUElYRUxfTU9ERV9MQ0QsCi0gICAgRlRfUElYRUxfTU9ERV9MQ0RfViwKLSAgICBGVF9QSVhFTF9NT0RFX0JHUkEsCi0KLSAgICBGVF9QSVhFTF9NT0RFX01BWCAgICAgIC8qIGRvIG5vdCByZW1vdmUgKi8KLQotICB9IEZUX1BpeGVsX01vZGU7Ci0KLQotICAvKiB0aGVzZSBjb25zdGFudHMgYXJlIGRlcHJlY2F0ZWQ7IHVzZSB0aGUgY29ycmVzcG9uZGluZyBgRlRfUGl4ZWxfTW9kZScgKi8KLSAgLyogdmFsdWVzIGluc3RlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIGZ0X3BpeGVsX21vZGVfbm9uZSAgIEZUX1BJWEVMX01PREVfTk9ORQotI2RlZmluZSBmdF9waXhlbF9tb2RlX21vbm8gICBGVF9QSVhFTF9NT0RFX01PTk8KLSNkZWZpbmUgZnRfcGl4ZWxfbW9kZV9ncmF5cyAgRlRfUElYRUxfTU9ERV9HUkFZCi0jZGVmaW5lIGZ0X3BpeGVsX21vZGVfcGFsMiAgIEZUX1BJWEVMX01PREVfR1JBWTIKLSNkZWZpbmUgZnRfcGl4ZWxfbW9kZV9wYWw0ICAgRlRfUElYRUxfTU9ERV9HUkFZNAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQml0bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSBhIGJpdG1hcCBvciBwaXhtYXAgdG8gdGhlIHJhc3Rlci4gICAgICovCi0gIC8qICAgIE5vdGUgdGhhdCB3ZSBub3cgbWFuYWdlIHBpeG1hcHMgb2YgdmFyaW91cyBkZXB0aHMgdGhyb3VnaCB0aGUgICAgICAqLwotICAvKiAgICBgcGl4ZWxfbW9kZScgZmllbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByb3dzICAgICAgICAgOjogVGhlIG51bWJlciBvZiBiaXRtYXAgcm93cy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHdpZHRoICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIHBpeGVscyBpbiBiaXRtYXAgcm93LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGl0Y2ggICAgICAgIDo6IFRoZSBwaXRjaCdzIGFic29sdXRlIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICB0YWtlbiBieSBvbmUgYml0bWFwIHJvdywgaW5jbHVkaW5nIHBhZGRpbmcuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgSG93ZXZlciwgdGhlIHBpdGNoIGlzIHBvc2l0aXZlIHdoZW4gdGhlIGJpdG1hcCBoYXMgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGEgYGRvd24nIGZsb3csIGFuZCBuZWdhdGl2ZSB3aGVuIGl0IGhhcyBhbiBgdXAnICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBmbG93LiAgSW4gYWxsIGNhc2VzLCB0aGUgcGl0Y2ggaXMgYW4gb2Zmc2V0IHRvIGFkZCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgdG8gYSBiaXRtYXAgcG9pbnRlciBpbiBvcmRlciB0byBnbyBkb3duIG9uZSByb3cuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgYHBhZGRpbmcnIG1lYW5zIHRoZSBhbGlnbm1lbnQgb2YgYSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgYml0bWFwIHRvIGEgYnl0ZSBib3JkZXIsIGFuZCBGcmVlVHlwZSBmdW5jdGlvbnMgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIG5vcm1hbGx5IGFsaWduIHRvIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBpbnRlZ2VyICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIEZvciB0aGUgQi9XIHJhc3Rlcml6ZXIsIGBwaXRjaCcgaXMgYWx3YXlzIGFuIGV2ZW4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIFRvIGNoYW5nZSB0aGUgcGl0Y2ggb2YgYSBiaXRtYXAgKHNheSwgdG8gbWFrZSBpdCBhICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSBvZiA0KSwgdXNlIEBGVF9CaXRtYXBfQ29udmVydC4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwgeW91IG1pZ2h0IHVzZSBjYWxsYmFjayBmdW5jdGlvbnMgdG8gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGRpcmVjdGx5IHJlbmRlciB0byB0aGUgYXBwbGljYXRpb24ncyBzdXJmYWNlOyBzZWUgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICB0aGUgZmlsZSBgZXhhbXBsZTIuY3BwJyBpbiB0aGUgdHV0b3JpYWwgZm9yIGEgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgZGVtb25zdHJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJ1ZmZlciAgICAgICA6OiBBIHR5cGVsZXNzIHBvaW50ZXIgdG8gdGhlIGJpdG1hcCBidWZmZXIuICBUaGlzICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgdmFsdWUgc2hvdWxkIGJlIGFsaWduZWQgb24gMzItYml0IGJvdW5kYXJpZXMgaW4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIG1vc3QgY2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fZ3JheXMgICAgOjogVGhpcyBmaWVsZCBpcyBvbmx5IHVzZWQgd2l0aCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIEBGVF9QSVhFTF9NT0RFX0dSQVk7IGl0IGdpdmVzIHRoZSBudW1iZXIgb2YgZ3JheSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBsZXZlbHMgdXNlZCBpbiB0aGUgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGl4ZWxfbW9kZSAgIDo6IFRoZSBwaXhlbCBtb2RlLCBpLmUuLCBob3cgcGl4ZWwgYml0cyBhcmUgc3RvcmVkLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBTZWUgQEZUX1BpeGVsX01vZGUgZm9yIHBvc3NpYmxlIHZhbHVlcy4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGFsZXR0ZV9tb2RlIDo6IFRoaXMgZmllbGQgaXMgaW50ZW5kZWQgZm9yIHBhbGV0dGVkIHBpeGVsIG1vZGVzOyAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBpdCBpbmRpY2F0ZXMgaG93IHRoZSBwYWxldHRlIGlzIHN0b3JlZC4gIE5vdCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgdXNlZCBjdXJyZW50bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhbGV0dGUgICAgICA6OiBBIHR5cGVsZXNzIHBvaW50ZXIgdG8gdGhlIGJpdG1hcCBwYWxldHRlOyB0aGlzICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgZmllbGQgaXMgaW50ZW5kZWQgZm9yIHBhbGV0dGVkIHBpeGVsIG1vZGVzLiAgTm90ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHVzZWQgY3VycmVudGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGb3Igbm93LCB0aGUgb25seSBwaXhlbCBtb2RlcyBzdXBwb3J0ZWQgYnkgRnJlZVR5cGUgYXJlIG1vbm8gYW5kICAgICovCi0gIC8qICAgZ3JheXMuICBIb3dldmVyLCBkcml2ZXJzIG1pZ2h0IGJlIGFkZGVkIGluIHRoZSBmdXR1cmUgdG8gc3VwcG9ydCAgICAqLwotICAvKiAgIG1vcmUgYGNvbG9yZnVsJyBvcHRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9CaXRtYXBfCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgICAgcm93czsKLSAgICB1bnNpZ25lZCBpbnQgICAgd2lkdGg7Ci0gICAgaW50ICAgICAgICAgICAgIHBpdGNoOwotICAgIHVuc2lnbmVkIGNoYXIqICBidWZmZXI7Ci0gICAgdW5zaWduZWQgc2hvcnQgIG51bV9ncmF5czsKLSAgICB1bnNpZ25lZCBjaGFyICAgcGl4ZWxfbW9kZTsKLSAgICB1bnNpZ25lZCBjaGFyICAgcGFsZXR0ZV9tb2RlOwotICAgIHZvaWQqICAgICAgICAgICBwYWxldHRlOwotCi0gIH0gRlRfQml0bWFwOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZV9wcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVzY3JpYmUgYW4gb3V0bGluZSB0byB0aGUgc2Nhbi1saW5lICAgICAqLwotICAvKiAgICBjb252ZXJ0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuX2NvbnRvdXJzIDo6IFRoZSBudW1iZXIgb2YgY29udG91cnMgaW4gdGhlIG91dGxpbmUuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5fcG9pbnRzICAgOjogVGhlIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIG91dGxpbmUuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9pbnRzICAgICA6OiBBIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYG5fcG9pbnRzJyBARlRfVmVjdG9yICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZWxlbWVudHMsIGdpdmluZyB0aGUgb3V0bGluZSdzIHBvaW50IGNvb3JkaW5hdGVzLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFncyAgICAgICA6OiBBIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYG5fcG9pbnRzJyBjaGFycywgZ2l2aW5nICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZWFjaCBvdXRsaW5lIHBvaW50J3MgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBJZiBiaXR+MCBpcyB1bnNldCwgdGhlIHBvaW50IGlzIGBvZmYnIHRoZSBjdXJ2ZSwgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgaS5lLiwgYSBCw6l6aWVyIGNvbnRyb2wgcG9pbnQsIHdoaWxlIGl0IGlzIGBvbicgaWYgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIEJpdH4xIGlzIG1lYW5pbmdmdWwgZm9yIGBvZmYnIHBvaW50cyBvbmx5LiAgSWYgc2V0LCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBpdCBpbmRpY2F0ZXMgYSB0aGlyZC1vcmRlciBCw6l6aWVyIGFyYyBjb250cm9sIHBvaW50OyAqLwotICAvKiAgICAgICAgICAgICAgICAgIGFuZCBhIHNlY29uZC1vcmRlciBjb250cm9sIHBvaW50IGlmIHVuc2V0LiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgSWYgYml0fjIgaXMgc2V0LCBiaXRzIDUtNyBjb250YWluIHRoZSBkcm9wLW91dCBtb2RlICAqLwotICAvKiAgICAgICAgICAgICAgICAgIChhcyBkZWZpbmVkIGluIHRoZSBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uOyB0aGUgdmFsdWUgKi8KLSAgLyogICAgICAgICAgICAgICAgICBpcyB0aGUgc2FtZSBhcyB0aGUgYXJndW1lbnQgdG8gdGhlIFNDQU5NT0RFICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBCaXRzIDMgYW5kfjQgYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCBwdXJwb3Nlcy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb250b3VycyAgIDo6IEFuIGFycmF5IG9mIGBuX2NvbnRvdXJzJyBzaG9ydHMsIGdpdmluZyB0aGUgZW5kICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBwb2ludCBvZiBlYWNoIGNvbnRvdXIgd2l0aGluIHRoZSBvdXRsaW5lLiAgRm9yICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZXhhbXBsZSwgdGhlIGZpcnN0IGNvbnRvdXIgaXMgZGVmaW5lZCBieSB0aGUgcG9pbnRzICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGAwJyB0byBgY29udG91cnNbMF0nLCB0aGUgc2Vjb25kIG9uZSBpcyBkZWZpbmVkIGJ5ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICB0aGUgcG9pbnRzIGBjb250b3Vyc1swXSsxJyB0byBgY29udG91cnNbMV0nLCBldGMuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmbGFncyAgICAgIDo6IEEgc2V0IG9mIGJpdCBmbGFncyB1c2VkIHRvIGNoYXJhY3Rlcml6ZSB0aGUgb3V0bGluZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBhbmQgZ2l2ZSBoaW50cyB0byB0aGUgc2Nhbi1jb252ZXJ0ZXIgYW5kIGhpbnRlciBvbiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgaG93IHRvIGNvbnZlcnQvZ3JpZC1maXQgaXQuICBTZWUgQEZUX09VVExJTkVfWFhYLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBCL1cgcmFzdGVyaXplciBvbmx5IGNoZWNrcyBiaXR+MiBpbiB0aGUgYHRhZ3MnIGFycmF5IGZvciB0aGUgICAqLwotICAvKiAgICBmaXJzdCBwb2ludCBvZiBlYWNoIGNvbnRvdXIuICBUaGUgZHJvcC1vdXQgbW9kZSBhcyBnaXZlbiB3aXRoICAgICAgKi8KLSAgLyogICAgQEZUX09VVExJTkVfSUdOT1JFX0RST1BPVVRTLCBARlRfT1VUTElORV9TTUFSVF9EUk9QT1VUUywgYW5kICAgICAgICovCi0gIC8qICAgIEBGVF9PVVRMSU5FX0lOQ0xVREVfU1RVQlMgaW4gYGZsYWdzJyBpcyB0aGVuIG92ZXJyaWRkZW4uICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX091dGxpbmVfCi0gIHsKLSAgICBzaG9ydCAgICAgICBuX2NvbnRvdXJzOyAgICAgIC8qIG51bWJlciBvZiBjb250b3VycyBpbiBnbHlwaCAgICAgICAgKi8KLSAgICBzaG9ydCAgICAgICBuX3BvaW50czsgICAgICAgIC8qIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIGdseXBoICAgICAgKi8KLQotICAgIEZUX1ZlY3RvciogIHBvaW50czsgICAgICAgICAgLyogdGhlIG91dGxpbmUncyBwb2ludHMgICAgICAgICAgICAgICAqLwotICAgIGNoYXIqICAgICAgIHRhZ3M7ICAgICAgICAgICAgLyogdGhlIHBvaW50cyBmbGFncyAgICAgICAgICAgICAgICAgICAqLwotICAgIHNob3J0KiAgICAgIGNvbnRvdXJzOyAgICAgICAgLyogdGhlIGNvbnRvdXIgZW5kIHBvaW50cyAgICAgICAgICAgICAqLwotCi0gICAgaW50ICAgICAgICAgZmxhZ3M7ICAgICAgICAgICAvKiBvdXRsaW5lIG1hc2tzICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgfSBGVF9PdXRsaW5lOwotCi0gIC8qICovCi0KLSAgLyogRm9sbG93aW5nIGxpbWl0cyBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCAqLwotICAvKiBGVF9PdXRsaW5lLntuX2NvbnRvdXJzLG5fcG9pbnRzfSAgICAgICAgICovCi0jZGVmaW5lIEZUX09VVExJTkVfQ09OVE9VUlNfTUFYICBTSFJUX01BWAotI2RlZmluZSBGVF9PVVRMSU5FX1BPSU5UU19NQVggICAgU0hSVF9NQVgKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09VVExJTkVfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgbGlzdCBvZiBiaXQtZmllbGQgY29uc3RhbnRzIHVzZSBmb3IgdGhlIGZsYWdzIGluIGFuIG91dGxpbmUncyAgICAqLwotICAvKiAgICBgZmxhZ3MnIGZpZWxkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PVVRMSU5FX05PTkUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBWYWx1ZX4wIGlzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PVVRMSU5FX09XTkVSIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBJZiBzZXQsIHRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgb3V0bGluZSdzIGZpZWxkIGFycmF5cyAgICAgICovCi0gIC8qICAgICAgKGkuZS4sIGBwb2ludHMnLCBgZmxhZ3MnLCBhbmQgYGNvbnRvdXJzJykgYXJlIGBvd25lZCcgYnkgdGhlICAgICAqLwotICAvKiAgICAgIG91dGxpbmUgb2JqZWN0LCBhbmQgc2hvdWxkIHRodXMgYmUgZnJlZWQgd2hlbiBpdCBpcyBkZXN0cm95ZWQuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09VVExJTkVfRVZFTl9PRERfRklMTCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEJ5IGRlZmF1bHQsIG91dGxpbmVzIGFyZSBmaWxsZWQgdXNpbmcgdGhlIG5vbi16ZXJvIHdpbmRpbmcgcnVsZS4gKi8KLSAgLyogICAgICBJZiBzZXQgdG8gMSwgdGhlIG91dGxpbmUgd2lsbCBiZSBmaWxsZWQgdXNpbmcgdGhlIGV2ZW4tb2RkIGZpbGwgICovCi0gIC8qICAgICAgcnVsZSAob25seSB3b3JrcyB3aXRoIHRoZSBzbW9vdGggcmFzdGVyaXplcikuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1VUTElORV9SRVZFUlNFX0ZJTEwgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQnkgZGVmYXVsdCwgb3V0c2lkZSBjb250b3VycyBvZiBhbiBvdXRsaW5lIGFyZSBvcmllbnRlZCBpbiAgICAgICAqLwotICAvKiAgICAgIGNsb2NrLXdpc2UgZGlyZWN0aW9uLCBhcyBkZWZpbmVkIGluIHRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uLiAgKi8KLSAgLyogICAgICBUaGlzIGZsYWcgaXMgc2V0IGlmIHRoZSBvdXRsaW5lIHVzZXMgdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiAgICAgICovCi0gIC8qICAgICAgKHR5cGljYWxseSBmb3IgVHlwZX4xIGZvbnRzKS4gIFRoaXMgZmxhZyBpcyBpZ25vcmVkIGJ5IHRoZSBzY2FuICAqLwotICAvKiAgICAgIGNvbnZlcnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09VVExJTkVfSUdOT1JFX0RST1BPVVRTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEJ5IGRlZmF1bHQsIHRoZSBzY2FuIGNvbnZlcnRlciB3aWxsIHRyeSB0byBkZXRlY3QgZHJvcC1vdXRzIGluICAgKi8KLSAgLyogICAgICBhbiBvdXRsaW5lIGFuZCBjb3JyZWN0IHRoZSBnbHlwaCBiaXRtYXAgdG8gZW5zdXJlIGNvbnNpc3RlbnQgICAgICovCi0gIC8qICAgICAgc2hhcGUgY29udGludWl0eS4gIElmIHNldCwgdGhpcyBmbGFnIGhpbnRzIHRoZSBzY2FuLWxpbmUgICAgICAgICAqLwotICAvKiAgICAgIGNvbnZlcnRlciB0byBpZ25vcmUgc3VjaCBjYXNlcy4gIFNlZSBiZWxvdyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09VVExJTkVfU01BUlRfRFJPUE9VVFMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFNlbGVjdCBzbWFydCBkcm9wb3V0IGNvbnRyb2wuICBJZiB1bnNldCwgdXNlIHNpbXBsZSBkcm9wb3V0ICAgICAgKi8KLSAgLyogICAgICBjb250cm9sLiAgSWdub3JlZCBpZiBARlRfT1VUTElORV9JR05PUkVfRFJPUE9VVFMgaXMgc2V0LiAgU2VlICAgICovCi0gIC8qICAgICAgYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1VUTElORV9JTkNMVURFX1NUVUJTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgSWYgc2V0LCB0dXJuIHBpeGVscyBvbiBmb3IgYHN0dWJzJywgb3RoZXJ3aXNlIGV4Y2x1ZGUgdGhlbS4gICAgICAqLwotICAvKiAgICAgIElnbm9yZWQgaWYgQEZUX09VVExJTkVfSUdOT1JFX0RST1BPVVRTIGlzIHNldC4gIFNlZSBiZWxvdyBmb3IgICAgKi8KLSAgLyogICAgICBtb3JlIGluZm9ybWF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PVVRMSU5FX0hJR0hfUFJFQ0lTSU9OIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIHNjYW4tbGluZSBjb252ZXJ0ZXIgc2hvdWxkIHRyeSB0byAgICovCi0gIC8qICAgICAgY29udmVydCB0aGlzIG91dGxpbmUgdG8gYml0bWFwcyB3aXRoIHRoZSBoaWdoZXN0IHBvc3NpYmxlICAgICAgICAqLwotICAvKiAgICAgIHF1YWxpdHkuICBJdCBpcyB0eXBpY2FsbHkgc2V0IGZvciBzbWFsbCBjaGFyYWN0ZXIgc2l6ZXMuICBOb3RlICAgKi8KLSAgLyogICAgICB0aGF0IHRoaXMgaXMgb25seSBhIGhpbnQgdGhhdCBtaWdodCBiZSBjb21wbGV0ZWx5IGlnbm9yZWQgYnkgYSAgICovCi0gIC8qICAgICAgZ2l2ZW4gc2Nhbi1jb252ZXJ0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1VUTElORV9TSU5HTEVfUEFTUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhpcyBmbGFnIGlzIHNldCB0byBmb3JjZSBhIGdpdmVuIHNjYW4tY29udmVydGVyIHRvIG9ubHkgdXNlIGEgICAqLwotICAvKiAgICAgIHNpbmdsZSBwYXNzIG92ZXIgdGhlIG91dGxpbmUgdG8gcmVuZGVyIGEgYml0bWFwIGdseXBoIGltYWdlLiAgICAgKi8KLSAgLyogICAgICBOb3JtYWxseSwgaXQgaXMgc2V0IGZvciB2ZXJ5IGxhcmdlIGNoYXJhY3RlciBzaXplcy4gIEl0IGlzIG9ubHkgICovCi0gIC8qICAgICAgYSBoaW50IHRoYXQgbWlnaHQgYmUgY29tcGxldGVseSBpZ25vcmVkIGJ5IGEgZ2l2ZW4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHNjYW4tY29udmVydGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZmxhZ3MgQEZUX09VVExJTkVfSUdOT1JFX0RST1BPVVRTLCBARlRfT1VUTElORV9TTUFSVF9EUk9QT1VUUywgKi8KLSAgLyogICAgYW5kIEBGVF9PVVRMSU5FX0lOQ0xVREVfU1RVQlMgYXJlIGlnbm9yZWQgYnkgdGhlIHNtb290aCAgICAgICAgICAgICovCi0gIC8qICAgIHJhc3Rlcml6ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlcmUgZXhpc3RzIGEgc2Vjb25kIG1lY2hhbmlzbSB0byBwYXNzIHRoZSBkcm9wLW91dCBtb2RlIHRvIHRoZSAgICovCi0gIC8qICAgIEIvVyByYXN0ZXJpemVyOyBzZWUgdGhlIGB0YWdzJyBmaWVsZCBpbiBARlRfT3V0bGluZS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUGxlYXNlIHJlZmVyIHRvIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYFNDQU5UWVBFJyBpbnN0cnVjdGlvbiBpbiAgICovCi0gIC8qICAgIHRoZSBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uIChpbiBmaWxlIGB0dGluc3QxLmRvYycpIGhvdyBzaW1wbGUgICAgICAqLwotICAvKiAgICBkcm9wLW91dHMsIHNtYXJ0IGRyb3Atb3V0cywgYW5kIHN0dWJzIGFyZSBkZWZpbmVkLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX09VVExJTkVfTk9ORSAgICAgICAgICAgICAweDAKLSNkZWZpbmUgRlRfT1VUTElORV9PV05FUiAgICAgICAgICAgIDB4MQotI2RlZmluZSBGVF9PVVRMSU5FX0VWRU5fT0REX0ZJTEwgICAgMHgyCi0jZGVmaW5lIEZUX09VVExJTkVfUkVWRVJTRV9GSUxMICAgICAweDQKLSNkZWZpbmUgRlRfT1VUTElORV9JR05PUkVfRFJPUE9VVFMgIDB4OAotI2RlZmluZSBGVF9PVVRMSU5FX1NNQVJUX0RST1BPVVRTICAgMHgxMAotI2RlZmluZSBGVF9PVVRMSU5FX0lOQ0xVREVfU1RVQlMgICAgMHgyMAotCi0jZGVmaW5lIEZUX09VVExJTkVfSElHSF9QUkVDSVNJT04gICAweDEwMAotI2RlZmluZSBGVF9PVVRMSU5FX1NJTkdMRV9QQVNTICAgICAgMHgyMDAKLQotCi0gIC8qIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVwcmVjYXRlZDsgdXNlIHRoZSBjb3JyZXNwb25kaW5nICovCi0gIC8qIGBGVF9PVVRMSU5FX1hYWCcgdmFsdWVzIGluc3RlYWQgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIGZ0X291dGxpbmVfbm9uZSAgICAgICAgICAgICBGVF9PVVRMSU5FX05PTkUKLSNkZWZpbmUgZnRfb3V0bGluZV9vd25lciAgICAgICAgICAgIEZUX09VVExJTkVfT1dORVIKLSNkZWZpbmUgZnRfb3V0bGluZV9ldmVuX29kZF9maWxsICAgIEZUX09VVExJTkVfRVZFTl9PRERfRklMTAotI2RlZmluZSBmdF9vdXRsaW5lX3JldmVyc2VfZmlsbCAgICAgRlRfT1VUTElORV9SRVZFUlNFX0ZJTEwKLSNkZWZpbmUgZnRfb3V0bGluZV9pZ25vcmVfZHJvcG91dHMgIEZUX09VVExJTkVfSUdOT1JFX0RST1BPVVRTCi0jZGVmaW5lIGZ0X291dGxpbmVfaGlnaF9wcmVjaXNpb24gICBGVF9PVVRMSU5FX0hJR0hfUFJFQ0lTSU9OCi0jZGVmaW5lIGZ0X291dGxpbmVfc2luZ2xlX3Bhc3MgICAgICBGVF9PVVRMSU5FX1NJTkdMRV9QQVNTCi0KLSAgLyogKi8KLQotI2RlZmluZSBGVF9DVVJWRV9UQUcoIGZsYWcgKSAgKCBmbGFnICYgMyApCi0KLSNkZWZpbmUgRlRfQ1VSVkVfVEFHX09OICAgICAgICAgICAgMQotI2RlZmluZSBGVF9DVVJWRV9UQUdfQ09OSUMgICAgICAgICAwCi0jZGVmaW5lIEZUX0NVUlZFX1RBR19DVUJJQyAgICAgICAgIDIKLQotI2RlZmluZSBGVF9DVVJWRV9UQUdfSEFTX1NDQU5NT0RFICA0Ci0KLSNkZWZpbmUgRlRfQ1VSVkVfVEFHX1RPVUNIX1ggICAgICAgOCAgLyogcmVzZXJ2ZWQgZm9yIHRoZSBUcnVlVHlwZSBoaW50ZXIgKi8KLSNkZWZpbmUgRlRfQ1VSVkVfVEFHX1RPVUNIX1kgICAgICAxNiAgLyogcmVzZXJ2ZWQgZm9yIHRoZSBUcnVlVHlwZSBoaW50ZXIgKi8KLQotI2RlZmluZSBGVF9DVVJWRV9UQUdfVE9VQ0hfQk9USCAgICAoIEZUX0NVUlZFX1RBR19UT1VDSF9YIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0NVUlZFX1RBR19UT1VDSF9ZICkKLQotI2RlZmluZSBGVF9DdXJ2ZV9UYWdfT24gICAgICAgRlRfQ1VSVkVfVEFHX09OCi0jZGVmaW5lIEZUX0N1cnZlX1RhZ19Db25pYyAgICBGVF9DVVJWRV9UQUdfQ09OSUMKLSNkZWZpbmUgRlRfQ3VydmVfVGFnX0N1YmljICAgIEZUX0NVUlZFX1RBR19DVUJJQwotI2RlZmluZSBGVF9DdXJ2ZV9UYWdfVG91Y2hfWCAgRlRfQ1VSVkVfVEFHX1RPVUNIX1gKLSNkZWZpbmUgRlRfQ3VydmVfVGFnX1RvdWNoX1kgIEZUX0NVUlZFX1RBR19UT1VDSF9ZCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX01vdmVUb0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzaWduYXR1cmUgb2YgYSBgbW92ZSAgKi8KLSAgLyogICAgdG8nIGZ1bmN0aW9uIGR1cmluZyBvdXRsaW5lIHdhbGtpbmcvZGVjb21wb3NpdGlvbi4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGBtb3ZlIHRvJyBpcyBlbWl0dGVkIHRvIHN0YXJ0IGEgbmV3IGNvbnRvdXIgaW4gYW4gb3V0bGluZS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0byAgIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IHBvaW50IG9mIHRoZSBgbW92ZSB0bycuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgOjogQSB0eXBlbGVzcyBwb2ludGVyLCB3aGljaCBpcyBwYXNzZWQgZnJvbSB0aGUgY2FsbGVyIG9mIHRoZSAqLwotICAvKiAgICAgICAgICAgIGRlY29tcG9zaXRpb24gZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgaW50Ci0gICgqRlRfT3V0bGluZV9Nb3ZlVG9GdW5jKSggY29uc3QgRlRfVmVjdG9yKiAgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgdXNlciApOwotCi0jZGVmaW5lIEZUX091dGxpbmVfTW92ZVRvX0Z1bmMgIEZUX091dGxpbmVfTW92ZVRvRnVuYwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9MaW5lVG9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBmdW5jdGlvbiBwb2ludGVyIHR5cGUgdXNlZCB0byBkZXNjcmliZSB0aGUgc2lnbmF0dXJlIG9mIGEgYGxpbmUgICovCi0gIC8qICAgIHRvJyBmdW5jdGlvbiBkdXJpbmcgb3V0bGluZSB3YWxraW5nL2RlY29tcG9zaXRpb24uICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBgbGluZSB0bycgaXMgZW1pdHRlZCB0byBpbmRpY2F0ZSBhIHNlZ21lbnQgaW4gdGhlIG91dGxpbmUuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdG8gICA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBwb2ludCBvZiB0aGUgYGxpbmUgdG8nLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1c2VyIDo6IEEgdHlwZWxlc3MgcG9pbnRlciwgd2hpY2ggaXMgcGFzc2VkIGZyb20gdGhlIGNhbGxlciBvZiB0aGUgKi8KLSAgLyogICAgICAgICAgICBkZWNvbXBvc2l0aW9uIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGludAotICAoKkZUX091dGxpbmVfTGluZVRvRnVuYykoIGNvbnN0IEZUX1ZlY3RvciogIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgIHVzZXIgKTsKLQotI2RlZmluZSBGVF9PdXRsaW5lX0xpbmVUb19GdW5jICBGVF9PdXRsaW5lX0xpbmVUb0Z1bmMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfQ29uaWNUb0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gcG9pbnRlciB0eXBlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHNpZ25hdHVyZSBvZiBhIGBjb25pYyAqLwotICAvKiAgICB0bycgZnVuY3Rpb24gZHVyaW5nIG91dGxpbmUgd2Fsa2luZyBvciBkZWNvbXBvc2l0aW9uLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgYGNvbmljIHRvJyBpcyBlbWl0dGVkIHRvIGluZGljYXRlIGEgc2Vjb25kLW9yZGVyIELDqXppZXIgYXJjIGluICAgKi8KLSAgLyogICAgdGhlIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29udHJvbCA6OiBBbiBpbnRlcm1lZGlhdGUgY29udHJvbCBwb2ludCBiZXR3ZWVuIHRoZSBsYXN0IHBvc2l0aW9uICovCi0gIC8qICAgICAgICAgICAgICAgYW5kIHRoZSBuZXcgdGFyZ2V0IGluIGB0bycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdG8gICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBlbmQgcG9pbnQgb2YgdGhlIGNvbmljIGFyYy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1c2VyICAgIDo6IEEgdHlwZWxlc3MgcG9pbnRlciwgd2hpY2ggaXMgcGFzc2VkIGZyb20gdGhlIGNhbGxlciBvZiAgKi8KLSAgLyogICAgICAgICAgICAgICB0aGUgZGVjb21wb3NpdGlvbiBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGludAotICAoKkZUX091dGxpbmVfQ29uaWNUb0Z1bmMpKCBjb25zdCBGVF9WZWN0b3IqICBjb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgdXNlciApOwotCi0jZGVmaW5lIEZUX091dGxpbmVfQ29uaWNUb19GdW5jICBGVF9PdXRsaW5lX0NvbmljVG9GdW5jCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0N1YmljVG9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzaWduYXR1cmUgb2YgYSBgY3ViaWMgKi8KLSAgLyogICAgdG8nIGZ1bmN0aW9uIGR1cmluZyBvdXRsaW5lIHdhbGtpbmcgb3IgZGVjb21wb3NpdGlvbi4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGBjdWJpYyB0bycgaXMgZW1pdHRlZCB0byBpbmRpY2F0ZSBhIHRoaXJkLW9yZGVyIELDqXppZXIgYXJjLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29udHJvbDEgOjogQSBwb2ludGVyIHRvIHRoZSBmaXJzdCBCw6l6aWVyIGNvbnRyb2wgcG9pbnQuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29udHJvbDIgOjogQSBwb2ludGVyIHRvIHRoZSBzZWNvbmQgQsOpemllciBjb250cm9sIHBvaW50LiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdG8gICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgZW5kIHBvaW50LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1c2VyICAgICA6OiBBIHR5cGVsZXNzIHBvaW50ZXIsIHdoaWNoIGlzIHBhc3NlZCBmcm9tIHRoZSBjYWxsZXIgb2YgKi8KLSAgLyogICAgICAgICAgICAgICAgdGhlIGRlY29tcG9zaXRpb24gZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGludAotICAoKkZUX091dGxpbmVfQ3ViaWNUb0Z1bmMpKCBjb25zdCBGVF9WZWN0b3IqICBjb250cm9sMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgY29udHJvbDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICB1c2VyICk7Ci0KLSNkZWZpbmUgRlRfT3V0bGluZV9DdWJpY1RvX0Z1bmMgIEZUX091dGxpbmVfQ3ViaWNUb0Z1bmMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfRnVuY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHRvIGhvbGQgdmFyaW91cyBmdW5jdGlvbiBwb2ludGVycyB1c2VkIGR1cmluZyBvdXRsaW5lICAqLwotICAvKiAgICBkZWNvbXBvc2l0aW9uIGluIG9yZGVyIHRvIGVtaXQgc2VnbWVudHMsIGNvbmljLCBhbmQgY3ViaWMgQsOpemllcnMuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW92ZV90byAgOjogVGhlIGBtb3ZlIHRvJyBlbWl0dGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaW5lX3RvICA6OiBUaGUgc2VnbWVudCBlbWl0dGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbmljX3RvIDo6IFRoZSBzZWNvbmQtb3JkZXIgQsOpemllciBhcmMgZW1pdHRlci4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGN1YmljX3RvIDo6IFRoZSB0aGlyZC1vcmRlciBCw6l6aWVyIGFyYyBlbWl0dGVyLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNoaWZ0ICAgIDo6IFRoZSBzaGlmdCB0aGF0IGlzIGFwcGxpZWQgdG8gY29vcmRpbmF0ZXMgYmVmb3JlIHRoZXkgICAqLwotICAvKiAgICAgICAgICAgICAgICBhcmUgc2VudCB0byB0aGUgZW1pdHRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlbHRhICAgIDo6IFRoZSBkZWx0YSB0aGF0IGlzIGFwcGxpZWQgdG8gY29vcmRpbmF0ZXMgYmVmb3JlIHRoZXkgICAqLwotICAvKiAgICAgICAgICAgICAgICBhcmUgc2VudCB0byB0aGUgZW1pdHRlciwgYnV0IGFmdGVyIHRoZSBzaGlmdC4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcG9pbnQgY29vcmRpbmF0ZXMgc2VudCB0byB0aGUgZW1pdHRlcnMgYXJlIHRoZSB0cmFuc2Zvcm1lZCAgICAgKi8KLSAgLyogICAgdmVyc2lvbiBvZiB0aGUgb3JpZ2luYWwgY29vcmRpbmF0ZXMgKHRoaXMgaXMgaW1wb3J0YW50IGZvciBoaWdoICAgICovCi0gIC8qICAgIGFjY3VyYWN5IGR1cmluZyBzY2FuLWNvbnZlcnNpb24pLiAgVGhlIHRyYW5zZm9ybWF0aW9uIGlzIHNpbXBsZTogICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgeCcgPSAoeCA8PCBzaGlmdCkgLSBkZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHknID0gKHggPDwgc2hpZnQpIC0gZGVsdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZXQgdGhlIHZhbHVlcyBvZiBgc2hpZnQnIGFuZCBgZGVsdGEnIHRvfjAgdG8gZ2V0IHRoZSBvcmlnaW5hbCAgICAgKi8KLSAgLyogICAgcG9pbnQgY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfT3V0bGluZV9GdW5jc18KLSAgewotICAgIEZUX091dGxpbmVfTW92ZVRvRnVuYyAgIG1vdmVfdG87Ci0gICAgRlRfT3V0bGluZV9MaW5lVG9GdW5jICAgbGluZV90bzsKLSAgICBGVF9PdXRsaW5lX0NvbmljVG9GdW5jICBjb25pY190bzsKLSAgICBGVF9PdXRsaW5lX0N1YmljVG9GdW5jICBjdWJpY190bzsKLQotICAgIGludCAgICAgICAgICAgICAgICAgICAgIHNoaWZ0OwotICAgIEZUX1BvcyAgICAgICAgICAgICAgICAgIGRlbHRhOwotCi0gIH0gRlRfT3V0bGluZV9GdW5jczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJhc2ljX3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JTUFHRV9UQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIG1hY3JvIGNvbnZlcnRzIGZvdXItbGV0dGVyIHRhZ3MgdG8gYW4gdW5zaWduZWQgbG9uZyB0eXBlLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTaW5jZSBtYW55IDE2LWJpdCBjb21waWxlcnMgZG9uJ3QgbGlrZSAzMi1iaXQgZW51bWVyYXRpb25zLCB5b3UgICAgKi8KLSAgLyogICAgc2hvdWxkIHJlZGVmaW5lIHRoaXMgbWFjcm8gaW4gY2FzZSBvZiBwcm9ibGVtcyB0byBzb21ldGhpbmcgbGlrZSAgICovCi0gIC8qICAgIHRoaXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgI2RlZmluZSBGVF9JTUFHRV9UQUcoIHZhbHVlLCBfeDEsIF94MiwgX3gzLCBfeDQgKSAgdmFsdWUgICAgICAgICAqLwotICAvKiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRvIGdldCBhIHNpbXBsZSBlbnVtZXJhdGlvbiB3aXRob3V0IGFzc2lnbmluZyBzcGVjaWFsIG51bWJlcnMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZm5kZWYgRlRfSU1BR0VfVEFHCi0jZGVmaW5lIEZUX0lNQUdFX1RBRyggdmFsdWUsIF94MSwgX3gyLCBfeDMsIF94NCApICBcCi0gICAgICAgICAgdmFsdWUgPSAoICggKHVuc2lnbmVkIGxvbmcpX3gxIDw8IDI0ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICggKHVuc2lnbmVkIGxvbmcpX3gyIDw8IDE2ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICggKHVuc2lnbmVkIGxvbmcpX3gzIDw8IDggICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpX3g0ICAgICAgICAgKQotI2VuZGlmIC8qIEZUX0lNQUdFX1RBRyAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhfRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gZW51bWVyYXRpb24gdHlwZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBmb3JtYXQgb2YgYSBnaXZlbiBnbHlwaCAgICovCi0gIC8qICAgIGltYWdlLiAgTm90ZSB0aGF0IHRoaXMgdmVyc2lvbiBvZiBGcmVlVHlwZSBvbmx5IHN1cHBvcnRzIHR3byBpbWFnZSAqLwotICAvKiAgICBmb3JtYXRzLCBldmVuIHRob3VnaCBmdXR1cmUgZm9udCBkcml2ZXJzIHdpbGwgYmUgYWJsZSB0byByZWdpc3RlciAgKi8KLSAgLyogICAgdGhlaXIgb3duIGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR0xZUEhfRk9STUFUX05PTkUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIHZhbHVlfjAgaXMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGdseXBoIGltYWdlIGlzIGEgY29tcG9zaXRlIG9mIHNldmVyYWwgb3RoZXIgaW1hZ2VzLiAgVGhpcyAgICAqLwotICAvKiAgICAgIGZvcm1hdCBpcyBfb25seV8gdXNlZCB3aXRoIEBGVF9MT0FEX05PX1JFQ1VSU0UsIGFuZCBpcyB1c2VkIHRvICAgKi8KLSAgLyogICAgICByZXBvcnQgY29tcG91bmQgZ2x5cGhzIChsaWtlIGFjY2VudGVkIGNoYXJhY3RlcnMpLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HTFlQSF9GT1JNQVRfQklUTUFQIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZ2x5cGggaW1hZ2UgaXMgYSBiaXRtYXAsIGFuZCBjYW4gYmUgZGVzY3JpYmVkIGFzIGFuICAgICAgICAgICovCi0gIC8qICAgICAgQEZUX0JpdG1hcC4gIFlvdSBnZW5lcmFsbHkgbmVlZCB0byBhY2Nlc3MgdGhlIGBiaXRtYXAnIGZpZWxkIG9mICAqLwotICAvKiAgICAgIHRoZSBARlRfR2x5cGhTbG90UmVjIHN0cnVjdHVyZSB0byByZWFkIGl0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBnbHlwaCBpbWFnZSBpcyBhIHZlY3RvcmlhbCBvdXRsaW5lIG1hZGUgb2YgbGluZSBzZWdtZW50cyAgICAgKi8KLSAgLyogICAgICBhbmQgQsOpemllciBhcmNzOyBpdCBjYW4gYmUgZGVzY3JpYmVkIGFzIGFuIEBGVF9PdXRsaW5lOyB5b3UgICAgICAqLwotICAvKiAgICAgIGdlbmVyYWxseSB3YW50IHRvIGFjY2VzcyB0aGUgYG91dGxpbmUnIGZpZWxkIG9mIHRoZSAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBARlRfR2x5cGhTbG90UmVjIHN0cnVjdHVyZSB0byByZWFkIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HTFlQSF9GT1JNQVRfUExPVFRFUiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZ2x5cGggaW1hZ2UgaXMgYSB2ZWN0b3JpYWwgcGF0aCB3aXRoIG5vIGluc2lkZSBhbmQgb3V0c2lkZSAgICovCi0gIC8qICAgICAgY29udG91cnMuICBTb21lIFR5cGV+MSBmb250cywgbGlrZSB0aG9zZSBpbiB0aGUgSGVyc2hleSBmYW1pbHksICAqLwotICAvKiAgICAgIGNvbnRhaW4gZ2x5cGhzIGluIHRoaXMgZm9ybWF0LiAgVGhlc2UgYXJlIGRlc2NyaWJlZCBhcyAgICAgICAgICAgKi8KLSAgLyogICAgICBARlRfT3V0bGluZSwgYnV0IEZyZWVUeXBlIGlzbid0IGN1cnJlbnRseSBjYXBhYmxlIG9mIHJlbmRlcmluZyAgICovCi0gIC8qICAgICAgdGhlbSBjb3JyZWN0bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBlbnVtICBGVF9HbHlwaF9Gb3JtYXRfCi0gIHsKLSAgICBGVF9JTUFHRV9UQUcoIEZUX0dMWVBIX0ZPUk1BVF9OT05FLCAwLCAwLCAwLCAwICksCi0KLSAgICBGVF9JTUFHRV9UQUcoIEZUX0dMWVBIX0ZPUk1BVF9DT01QT1NJVEUsICdjJywgJ28nLCAnbScsICdwJyApLAotICAgIEZUX0lNQUdFX1RBRyggRlRfR0xZUEhfRk9STUFUX0JJVE1BUCwgICAgJ2InLCAnaScsICd0JywgJ3MnICksCi0gICAgRlRfSU1BR0VfVEFHKCBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSwgICAnbycsICd1JywgJ3QnLCAnbCcgKSwKLSAgICBGVF9JTUFHRV9UQUcoIEZUX0dMWVBIX0ZPUk1BVF9QTE9UVEVSLCAgICdwJywgJ2wnLCAnbycsICd0JyApCi0KLSAgfSBGVF9HbHlwaF9Gb3JtYXQ7Ci0KLQotICAvKiB0aGVzZSBjb25zdGFudHMgYXJlIGRlcHJlY2F0ZWQ7IHVzZSB0aGUgY29ycmVzcG9uZGluZyAqLwotICAvKiBgRlRfR2x5cGhfRm9ybWF0JyB2YWx1ZXMgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBmdF9nbHlwaF9mb3JtYXRfbm9uZSAgICAgICBGVF9HTFlQSF9GT1JNQVRfTk9ORQotI2RlZmluZSBmdF9nbHlwaF9mb3JtYXRfY29tcG9zaXRlICBGVF9HTFlQSF9GT1JNQVRfQ09NUE9TSVRFCi0jZGVmaW5lIGZ0X2dseXBoX2Zvcm1hdF9iaXRtYXAgICAgIEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAKLSNkZWZpbmUgZnRfZ2x5cGhfZm9ybWF0X291dGxpbmUgICAgRlRfR0xZUEhfRk9STUFUX09VVExJTkUKLSNkZWZpbmUgZnRfZ2x5cGhfZm9ybWF0X3Bsb3R0ZXIgICAgRlRfR0xZUEhfRk9STUFUX1BMT1RURVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICBSIEEgUyBUIEUgUiAgIEQgRSBGIEkgTiBJIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEEgcmFzdGVyIGlzIGEgc2NhbiBjb252ZXJ0ZXIsIGluIGNoYXJnZSBvZiByZW5kZXJpbmcgYW4gb3V0bGluZSBpbnRvICAqLwotICAvKiBhIGEgYml0bWFwLiAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBwdWJsaWMgQVBJIGZvciByYXN0ZXJzLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUgdGhhdCBpbiBGcmVlVHlwZSAyLCBhbGwgcmFzdGVycyBhcmUgbm93IGVuY2Fwc3VsYXRlZCB3aXRoaW4gICAgICAqLwotICAvKiBzcGVjaWZpYyBtb2R1bGVzIGNhbGxlZCBgcmVuZGVyZXJzJy4gIFNlZSBgZnRyZW5kZXIuaCcgZm9yIG1vcmUgICAgICAgKi8KLSAgLyogZGV0YWlscyBvbiByZW5kZXJlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNjYW5saW5lIENvbnZlcnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEhvdyB2ZWN0b3JpYWwgb3V0bGluZXMgYXJlIGNvbnZlcnRlZCBpbnRvIGJpdG1hcHMgYW5kIHBpeG1hcHMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0ZWNobmljYWwgZGVmaW5pdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE9yZGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TcGFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU3BhbkZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfUGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUkFTVEVSX0ZMQUdfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfTmV3RnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyX0RvbmVGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3Rlcl9SZXNldEZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfU2V0TW9kZUZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyX1JlbmRlckZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3Rlcl9GdW5jcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBvcGFxdWUgaGFuZGxlIChwb2ludGVyKSB0byBhIHJhc3RlciBvYmplY3QuICBFYWNoIG9iamVjdCBjYW4gYmUgKi8KLSAgLyogICAgdXNlZCBpbmRlcGVuZGVudGx5IHRvIGNvbnZlcnQgYW4gb3V0bGluZSBpbnRvIGEgYml0bWFwIG9yIHBpeG1hcC4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9SYXN0ZXJSZWNfKiAgRlRfUmFzdGVyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU3BhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIHNpbmdsZSBzcGFuIG9mIGdyYXkgcGl4ZWxzIHdoZW4gICAgICAgICovCi0gIC8qICAgIHJlbmRlcmluZyBhbiBhbnRpLWFsaWFzZWQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHggICAgICAgIDo6IFRoZSBzcGFuJ3MgaG9yaXpvbnRhbCBzdGFydCBwb3NpdGlvbi4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGVuICAgICAgOjogVGhlIHNwYW4ncyBsZW5ndGggaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb3ZlcmFnZSA6OiBUaGUgc3BhbiBjb2xvci9jb3ZlcmFnZSwgcmFuZ2luZyBmcm9tIDAgKGJhY2tncm91bmQpICAgKi8KLSAgLyogICAgICAgICAgICAgICAgdG8gMjU1IChmb3JlZ3JvdW5kKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieSB0aGUgc3BhbiBkcmF3aW5nIGNhbGxiYWNrIHR5cGUgbmFtZWQgICAgICovCi0gIC8qICAgIEBGVF9TcGFuRnVuYyB0aGF0IHRha2VzIHRoZSB5fmNvb3JkaW5hdGUgb2YgdGhlIHNwYW4gYXMgYSAgICAgICAgICAqLwotICAvKiAgICBwYXJhbWV0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBjb3ZlcmFnZSB2YWx1ZSBpcyBhbHdheXMgYmV0d2VlbiAwIGFuZCAyNTUuICBJZiB5b3Ugd2FudCBsZXNzICAqLwotICAvKiAgICBncmF5IHZhbHVlcywgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGhhcyB0byByZWR1Y2UgdGhlbS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9TcGFuXwotICB7Ci0gICAgc2hvcnQgICAgICAgICAgIHg7Ci0gICAgdW5zaWduZWQgc2hvcnQgIGxlbjsKLSAgICB1bnNpZ25lZCBjaGFyICAgY292ZXJhZ2U7Ci0KLSAgfSBGVF9TcGFuOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU3BhbkZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBmdW5jdGlvbiB1c2VkIGFzIGEgY2FsbC1iYWNrIGJ5IHRoZSBhbnRpLWFsaWFzZWQgcmVuZGVyZXIgaW4gICAgICovCi0gIC8qICAgIG9yZGVyIHRvIGxldCBjbGllbnQgYXBwbGljYXRpb25zIGRyYXcgdGhlbXNlbHZlcyB0aGUgZ3JheSBwaXhlbCAgICAqLwotICAvKiAgICBzcGFucyBvbiBlYWNoIHNjYW4gbGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5ICAgICA6OiBUaGUgc2NhbmxpbmUncyB5fmNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvdW50IDo6IFRoZSBudW1iZXIgb2Ygc3BhbnMgdG8gZHJhdyBvbiB0aGlzIHNjYW5saW5lLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3BhbnMgOjogQSB0YWJsZSBvZiBgY291bnQnIHNwYW5zIHRvIGRyYXcgb24gdGhlIHNjYW5saW5lLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1c2VyICA6OiBVc2VyLXN1cHBsaWVkIGRhdGEgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGNhbGxiYWNrIGFsbG93cyBjbGllbnQgYXBwbGljYXRpb25zIHRvIGRpcmVjdGx5IHJlbmRlciB0aGUgICAgKi8KLSAgLyogICAgZ3JheSBzcGFucyBvZiB0aGUgYW50aS1hbGlhc2VkIGJpdG1hcCB0byBhbnkga2luZCBvZiBzdXJmYWNlcy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIHdyaXRlIGFudGktYWxpYXNlZCBvdXRsaW5lcyBkaXJlY3RseSB0byBhICAgICAgKi8KLSAgLyogICAgZ2l2ZW4gYmFja2dyb3VuZCBiaXRtYXAsIGFuZCBldmVuIHBlcmZvcm0gdHJhbnNsdWNlbmN5LiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3RlIHRoYXQgdGhlIGBjb3VudCcgZmllbGQgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiBhIGZpeGVkIHZhbHVlICAgKi8KLSAgLyogICAgZGVmaW5lZCBieSB0aGUgYEZUX01BWF9HUkFZX1NQQU5TJyBjb25maWd1cmF0aW9uIG1hY3JvIGluICAgICAgICAgICovCi0gIC8qICAgIGBmdG9wdGlvbi5oJy4gIEJ5IGRlZmF1bHQsIHRoaXMgdmFsdWUgaXMgc2V0IHRvfjMyLCB3aGljaCBtZWFucyAgICAqLwotICAvKiAgICB0aGF0IGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gMzJ+c3BhbnMgb24gYSBnaXZlbiBzY2FubGluZSwgdGhlICAgICAgKi8KLSAgLyogICAgY2FsbGJhY2sgaXMgY2FsbGVkIHNldmVyYWwgdGltZXMgd2l0aCB0aGUgc2FtZSBgeScgcGFyYW1ldGVyIGluICAgICovCi0gIC8qICAgIG9yZGVyIHRvIGRyYXcgYWxsIGNhbGxiYWNrcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT3RoZXJ3aXNlLCB0aGUgY2FsbGJhY2sgaXMgb25seSBjYWxsZWQgb25jZSBwZXIgc2Nhbi1saW5lLCBhbmQgICAgICovCi0gIC8qICAgIG9ubHkgZm9yIHRob3NlIHNjYW5saW5lcyB0aGF0IGRvIGhhdmUgYGdyYXknIHBpeGVscyBvbiB0aGVtLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqRlRfU3BhbkZ1bmMpKCBpbnQgICAgICAgICAgICAgeSwKLSAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1NwYW4qICBzcGFucywKLSAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICB1c2VyICk7Ci0KLSNkZWZpbmUgRlRfUmFzdGVyX1NwYW5fRnVuYyAgRlRfU3BhbkZ1bmMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3Rlcl9CaXRUZXN0X0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlcHJlY2F0ZWQsIHVuaW1wbGVtZW50ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBpbnQKLSAgKCpGVF9SYXN0ZXJfQml0VGVzdF9GdW5jKSggaW50ICAgIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgdXNlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyX0JpdFNldF9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVwcmVjYXRlZCwgdW5pbXBsZW1lbnRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9SYXN0ZXJfQml0U2V0X0Z1bmMpKCBpbnQgICAgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgdXNlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUkFTVEVSX0ZMQUdfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBsaXN0IG9mIGJpdCBmbGFnIGNvbnN0YW50cyBhcyB1c2VkIGluIHRoZSBgZmxhZ3MnIGZpZWxkIG9mIGEgICAgICovCi0gIC8qICAgIEBGVF9SYXN0ZXJfUGFyYW1zIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JBU1RFUl9GTEFHX0RFRkFVTFQgOjogVGhpcyB2YWx1ZSBpcyAwLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUkFTVEVSX0ZMQUdfQUEgICAgICA6OiBUaGlzIGZsYWcgaXMgc2V0IHRvIGluZGljYXRlIHRoYXQgYW4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW50aS1hbGlhc2VkIGdseXBoIGltYWdlIHNob3VsZCBiZSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC4gIE90aGVyd2lzZSwgaXQgd2lsbCBiZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb25vY2hyb21lICgxLWJpdCkuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SQVNURVJfRkxBR19ESVJFQ1QgIDo6IFRoaXMgZmxhZyBpcyBzZXQgdG8gaW5kaWNhdGUgZGlyZWN0ICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJpbmcuICBJbiB0aGlzIG1vZGUsIGNsaWVudCAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25zIG11c3QgcHJvdmlkZSB0aGVpciBvd24gc3BhbiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLiAgVGhpcyBsZXRzIHRoZW0gZGlyZWN0bHkgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3IG9yIGNvbXBvc2Ugb3ZlciBhbiBleGlzdGluZyBiaXRtYXAuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBiaXQgaXMgbm90IHNldCwgdGhlIHRhcmdldCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeG1hcCdzIGJ1ZmZlciBfbXVzdF8gYmUgemVyb2VkIGJlZm9yZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdCByZW5kZXJpbmcgaXMgb25seSBwb3NzaWJsZSB3aXRoICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnRpLWFsaWFzZWQgZ2x5cGhzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SQVNURVJfRkxBR19DTElQICAgIDo6IFRoaXMgZmxhZyBpcyBvbmx5IHVzZWQgaW4gZGlyZWN0ICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJpbmcgbW9kZS4gIElmIHNldCwgdGhlIG91dHB1dCB3aWxsICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgY2xpcHBlZCB0byBhIGJveCBzcGVjaWZpZWQgaW4gdGhlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBjbGlwX2JveCcgZmllbGQgb2YgdGhlICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBARlRfUmFzdGVyX1BhcmFtcyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBieSBkZWZhdWx0LCB0aGUgZ2x5cGggYml0bWFwICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBjbGlwcGVkIHRvIHRoZSB0YXJnZXQgcGl4bWFwLCBleGNlcHQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gZGlyZWN0IHJlbmRlcmluZyBtb2RlIHdoZXJlIGFsbCBzcGFucyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBnZW5lcmF0ZWQgaWYgbm8gY2xpcHBpbmcgYm94IGlzIHNldC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX1JBU1RFUl9GTEFHX0RFRkFVTFQgIDB4MAotI2RlZmluZSBGVF9SQVNURVJfRkxBR19BQSAgICAgICAweDEKLSNkZWZpbmUgRlRfUkFTVEVSX0ZMQUdfRElSRUNUICAgMHgyCi0jZGVmaW5lIEZUX1JBU1RFUl9GTEFHX0NMSVAgICAgIDB4NAotCi0gIC8qIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVwcmVjYXRlZDsgdXNlIHRoZSBjb3JyZXNwb25kaW5nICovCi0gIC8qIGBGVF9SQVNURVJfRkxBR19YWFgnIHZhbHVlcyBpbnN0ZWFkICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIGZ0X3Jhc3Rlcl9mbGFnX2RlZmF1bHQgIEZUX1JBU1RFUl9GTEFHX0RFRkFVTFQKLSNkZWZpbmUgZnRfcmFzdGVyX2ZsYWdfYWEgICAgICAgRlRfUkFTVEVSX0ZMQUdfQUEKLSNkZWZpbmUgZnRfcmFzdGVyX2ZsYWdfZGlyZWN0ICAgRlRfUkFTVEVSX0ZMQUdfRElSRUNUCi0jZGVmaW5lIGZ0X3Jhc3Rlcl9mbGFnX2NsaXAgICAgIEZUX1JBU1RFUl9GTEFHX0NMSVAKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3Rlcl9QYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHRvIGhvbGQgdGhlIGFyZ3VtZW50cyB1c2VkIGJ5IGEgcmFzdGVyJ3MgcmVuZGVyICAgICAgICAqLwotICAvKiAgICBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YXJnZXQgICAgICA6OiBUaGUgdGFyZ2V0IGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNvdXJjZSAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgc291cmNlIGdseXBoIGltYWdlIChlLmcuLCBhbiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBARlRfT3V0bGluZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZsYWdzICAgICAgIDo6IFRoZSByZW5kZXJpbmcgZmxhZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ3JheV9zcGFucyAgOjogVGhlIGdyYXkgc3BhbiBkcmF3aW5nIGNhbGxiYWNrLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBibGFja19zcGFucyA6OiBVbnVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJpdF90ZXN0ICAgIDo6IFVudXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYml0X3NldCAgICAgOjogVW51c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1c2VyICAgICAgICA6OiBVc2VyLXN1cHBsaWVkIGRhdGEgdGhhdCBpcyBwYXNzZWQgdG8gZWFjaCBkcmF3aW5nICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgY2FsbGJhY2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjbGlwX2JveCAgICA6OiBBbiBvcHRpb25hbCBjbGlwcGluZyBib3guICBJdCBpcyBvbmx5IHVzZWQgaW4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZGlyZWN0IHJlbmRlcmluZyBtb2RlLiAgTm90ZSB0aGF0IGNvb3JkaW5hdGVzIGhlcmUgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBleHByZXNzZWQgaW4gX2ludGVnZXJfIHBpeGVscyAoYW5kIG5vdCBpbiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAyNi42IGZpeGVkLXBvaW50IHVuaXRzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBhbnRpLWFsaWFzZWQgZ2x5cGggYml0bWFwIGlzIGRyYXduIGlmIHRoZSBARlRfUkFTVEVSX0ZMQUdfQUEgICAgKi8KLSAgLyogICAgYml0IGZsYWcgaXMgc2V0IGluIHRoZSBgZmxhZ3MnIGZpZWxkLCBvdGhlcndpc2UgYSBtb25vY2hyb21lICAgICAgICovCi0gIC8qICAgIGJpdG1hcCBpcyBnZW5lcmF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgdGhlIEBGVF9SQVNURVJfRkxBR19ESVJFQ1QgYml0IGZsYWcgaXMgc2V0IGluIGBmbGFncycsIHRoZSAgICAgICovCi0gIC8qICAgIHJhc3RlciB3aWxsIGNhbGwgdGhlIGBncmF5X3NwYW5zJyBjYWxsYmFjayB0byBkcmF3IGdyYXkgcGl4ZWwgICAgICAqLwotICAvKiAgICBzcGFucy4gIFRoaXMgYWxsb3dzIGRpcmVjdCBjb21wb3NpdGlvbiBvdmVyIGEgcHJlLWV4aXN0aW5nIGJpdG1hcCAgKi8KLSAgLyogICAgdGhyb3VnaCB1c2VyLXByb3ZpZGVkIGNhbGxiYWNrcyB0byBwZXJmb3JtIHRoZSBzcGFuIGRyYXdpbmcgYW5kICAgICovCi0gIC8qICAgIGNvbXBvc2l0aW9uLiAgICBOb3Qgc3VwcG9ydGVkIGJ5IHRoZSBtb25vY2hyb21lIHJhc3Rlcml6ZXIuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1Jhc3Rlcl9QYXJhbXNfCi0gIHsKLSAgICBjb25zdCBGVF9CaXRtYXAqICAgICAgICB0YXJnZXQ7Ci0gICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgc291cmNlOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgIGZsYWdzOwotICAgIEZUX1NwYW5GdW5jICAgICAgICAgICAgIGdyYXlfc3BhbnM7Ci0gICAgRlRfU3BhbkZ1bmMgICAgICAgICAgICAgYmxhY2tfc3BhbnM7ICAvKiB1bnVzZWQgKi8KLSAgICBGVF9SYXN0ZXJfQml0VGVzdF9GdW5jICBiaXRfdGVzdDsgICAgIC8qIHVudXNlZCAqLwotICAgIEZUX1Jhc3Rlcl9CaXRTZXRfRnVuYyAgIGJpdF9zZXQ7ICAgICAgLyogdW51c2VkICovCi0gICAgdm9pZCogICAgICAgICAgICAgICAgICAgdXNlcjsKLSAgICBGVF9CQm94ICAgICAgICAgICAgICAgICBjbGlwX2JveDsKLQotICB9IEZUX1Jhc3Rlcl9QYXJhbXM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfTmV3RnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gY3JlYXRlIGEgbmV3IHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgOjogQSBoYW5kbGUgdG8gdGhlIG1lbW9yeSBhbGxvY2F0b3IuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXIgOjogQSBoYW5kbGUgdG8gdGhlIG5ldyByYXN0ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYG1lbW9yeScgcGFyYW1ldGVyIGlzIGEgdHlwZWxlc3MgcG9pbnRlciBpbiBvcmRlciB0byBhdm9pZCAgICAgKi8KLSAgLyogICAgdW4td2FudGVkIGRlcGVuZGVuY2llcyBvbiB0aGUgcmVzdCBvZiB0aGUgRnJlZVR5cGUgY29kZS4gIEluICAgICAgICovCi0gIC8qICAgIHByYWN0aWNlLCBpdCBpcyBhbiBARlRfTWVtb3J5IG9iamVjdCwgaS5lLiwgYSBoYW5kbGUgdG8gdGhlICAgICAgICAqLwotICAvKiAgICBzdGFuZGFyZCBGcmVlVHlwZSBtZW1vcnkgYWxsb2NhdG9yLiAgSG93ZXZlciwgdGhpcyBmaWVsZCBjYW4gYmUgICAgKi8KLSAgLyogICAgY29tcGxldGVseSBpZ25vcmVkIGJ5IGEgZ2l2ZW4gcmFzdGVyIGltcGxlbWVudGF0aW9uLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGludAotICAoKkZUX1Jhc3Rlcl9OZXdGdW5jKSggdm9pZCogICAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfUmFzdGVyKiAgcmFzdGVyICk7Ci0KLSNkZWZpbmUgRlRfUmFzdGVyX05ld19GdW5jICBGVF9SYXN0ZXJfTmV3RnVuYwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyX0RvbmVGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBmdW5jdGlvbiB1c2VkIHRvIGRlc3Ryb3kgYSBnaXZlbiByYXN0ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmFzdGVyIDo6IEEgaGFuZGxlIHRvIHRoZSByYXN0ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9SYXN0ZXJfRG9uZUZ1bmMpKCBGVF9SYXN0ZXIgIHJhc3RlciApOwotCi0jZGVmaW5lIEZUX1Jhc3Rlcl9Eb25lX0Z1bmMgIEZUX1Jhc3Rlcl9Eb25lRnVuYwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyX1Jlc2V0RnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgcHJvdmlkZXMgYW4gYXJlYSBvZiBtZW1vcnkgY2FsbGVkIHRoZSBgcmVuZGVyIHBvb2wnLCAgICAgICovCi0gIC8qICAgIGF2YWlsYWJsZSB0byBhbGwgcmVnaXN0ZXJlZCByYXN0ZXJzLiAgVGhpcyBwb29sIGNhbiBiZSBmcmVlbHkgdXNlZCAqLwotICAvKiAgICBkdXJpbmcgYSBnaXZlbiBzY2FuLWNvbnZlcnNpb24gYnV0IGlzIHNoYXJlZCBieSBhbGwgcmFzdGVycy4gIEl0cyAgKi8KLSAgLyogICAgY29udGVudCBpcyB0aHVzIHRyYW5zaWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBlYWNoIHRpbWUgdGhlIHJlbmRlciBwb29sIGNoYW5nZXMsIG9yIGp1c3QgKi8KLSAgLyogICAgYWZ0ZXIgYSBuZXcgcmFzdGVyIG9iamVjdCBpcyBjcmVhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmFzdGVyICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBuZXcgcmFzdGVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb29sX2Jhc2UgOjogVGhlIGFkZHJlc3MgaW4gbWVtb3J5IG9mIHRoZSByZW5kZXIgcG9vbC4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBvb2xfc2l6ZSA6OiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVuZGVyIHBvb2wuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJhc3RlcnMgY2FuIGlnbm9yZSB0aGUgcmVuZGVyIHBvb2wgYW5kIHJlbHkgb24gZHluYW1pYyBtZW1vcnkgICAgICAqLwotICAvKiAgICBhbGxvY2F0aW9uIGlmIHRoZXkgd2FudCB0byAoYSBoYW5kbGUgdG8gdGhlIG1lbW9yeSBhbGxvY2F0b3IgaXMgICAgKi8KLSAgLyogICAgcGFzc2VkIHRvIHRoZSByYXN0ZXIgY29uc3RydWN0b3IpLiAgSG93ZXZlciwgdGhpcyBpcyBub3QgICAgICAgICAgICovCi0gIC8qICAgIHJlY29tbWVuZGVkIGZvciBlZmZpY2llbmN5IHB1cnBvc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqRlRfUmFzdGVyX1Jlc2V0RnVuYykoIEZUX1Jhc3RlciAgICAgICByYXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqICBwb29sX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICBwb29sX3NpemUgKTsKLQotI2RlZmluZSBGVF9SYXN0ZXJfUmVzZXRfRnVuYyAgRlRfUmFzdGVyX1Jlc2V0RnVuYwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyX1NldE1vZGVGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyBhIGdlbmVyaWMgZmFjaWxpdHkgdG8gY2hhbmdlIG1vZGVzIG9yIGF0dHJpYnV0ZXMgICovCi0gIC8qICAgIGluIGEgZ2l2ZW4gcmFzdGVyLiAgVGhpcyBjYW4gYmUgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBvciAgICAqLwotICAvKiAgICBzaW1wbHkgdG8gYWxsb3cgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgYGZlYXR1cmVzJyBpbiBhIGdpdmVuICAgICAgKi8KLSAgLyogICAgcmFzdGVyIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmFzdGVyIDo6IEEgaGFuZGxlIHRvIHRoZSBuZXcgcmFzdGVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2RlICAgOjogQSA0LWJ5dGUgdGFnIHVzZWQgdG8gbmFtZSB0aGUgbW9kZSBvciBwcm9wZXJ0eS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFyZ3MgICA6OiBBIHBvaW50ZXIgdG8gdGhlIG5ldyBtb2RlL3Byb3BlcnR5IHRvIHVzZS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBpbnQKLSAgKCpGVF9SYXN0ZXJfU2V0TW9kZUZ1bmMpKCBGVF9SYXN0ZXIgICAgICByYXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICBhcmdzICk7Ci0KLSNkZWZpbmUgRlRfUmFzdGVyX1NldF9Nb2RlX0Z1bmMgIEZUX1Jhc3Rlcl9TZXRNb2RlRnVuYwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyX1JlbmRlckZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW52b2tlIGEgZ2l2ZW4gcmFzdGVyIHRvIHNjYW4tY29udmVydCBhIGdpdmVuIGdseXBoIGltYWdlIGludG8gYSAgICovCi0gIC8qICAgIHRhcmdldCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhc3RlciA6OiBBIGhhbmRsZSB0byB0aGUgcmFzdGVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGFyYW1zIDo6IEEgcG9pbnRlciB0byBhbiBARlRfUmFzdGVyX1BhcmFtcyBzdHJ1Y3R1cmUgdXNlZCB0byAgICAgICovCi0gIC8qICAgICAgICAgICAgICBzdG9yZSB0aGUgcmVuZGVyaW5nIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBleGFjdCBmb3JtYXQgb2YgdGhlIHNvdXJjZSBpbWFnZSBkZXBlbmRzIG9uIHRoZSByYXN0ZXIncyBnbHlwaCAqLwotICAvKiAgICBmb3JtYXQgZGVmaW5lZCBpbiBpdHMgQEZUX1Jhc3Rlcl9GdW5jcyBzdHJ1Y3R1cmUuICBJdCBjYW4gYmUgYW4gICAgKi8KLSAgLyogICAgQEZUX091dGxpbmUgb3IgYW55dGhpbmcgZWxzZSBpbiBvcmRlciB0byBzdXBwb3J0IGEgbGFyZ2UgYXJyYXkgb2YgICovCi0gIC8qICAgIGdseXBoIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSBhbHNvIHRoYXQgdGhlIHJlbmRlciBmdW5jdGlvbiBjYW4gZmFpbCBhbmQgcmV0dXJuIGEgICAgICAgICAgICovCi0gIC8qICAgIGBGVF9FcnJfVW5pbXBsZW1lbnRlZF9GZWF0dXJlJyBlcnJvciBjb2RlIGlmIHRoZSByYXN0ZXIgdXNlZCBkb2VzICAqLwotICAvKiAgICBub3Qgc3VwcG9ydCBkaXJlY3QgY29tcG9zaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFhYWDogRm9yIG5vdywgdGhlIHN0YW5kYXJkIHJhc3RlciBkb2Vzbid0IHN1cHBvcnQgZGlyZWN0ICAgICAgICAgICAqLwotICAvKiAgICAgICAgIGNvbXBvc2l0aW9uIGJ1dCB0aGlzIHNob3VsZCBjaGFuZ2UgZm9yIHRoZSBmaW5hbCByZWxlYXNlIChzZWUgKi8KLSAgLyogICAgICAgICB0aGUgZmlsZXMgYGRlbW9zL3NyYy9mdGdyYXlzLmMnIGFuZCBgZGVtb3Mvc3JjL2Z0Z3JheXMyLmMnICAgICovCi0gIC8qICAgICAgICAgZm9yIGV4YW1wbGVzIG9mIGRpc3RpbmN0IGltcGxlbWVudGF0aW9ucyB0aGF0IHN1cHBvcnQgZGlyZWN0ICAqLwotICAvKiAgICAgICAgIGNvbXBvc2l0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgaW50Ci0gICgqRlRfUmFzdGVyX1JlbmRlckZ1bmMpKCBGVF9SYXN0ZXIgICAgICAgICAgICAgICAgcmFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfUmFzdGVyX1BhcmFtcyogIHBhcmFtcyApOwotCi0jZGVmaW5lIEZUX1Jhc3Rlcl9SZW5kZXJfRnVuYyAgRlRfUmFzdGVyX1JlbmRlckZ1bmMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3Rlcl9GdW5jcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSBhIGdpdmVuIHJhc3RlciBjbGFzcyB0byB0aGUgbGlicmFyeS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2Zvcm1hdCAgOjogVGhlIHN1cHBvcnRlZCBnbHlwaCBmb3JtYXQgZm9yIHRoaXMgcmFzdGVyLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmFzdGVyX25ldyAgICA6OiBUaGUgcmFzdGVyIGNvbnN0cnVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXJfcmVzZXQgIDo6IFVzZWQgdG8gcmVzZXQgdGhlIHJlbmRlciBwb29sIHdpdGhpbiB0aGUgcmFzdGVyLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhc3Rlcl9yZW5kZXIgOjogQSBmdW5jdGlvbiB0byByZW5kZXIgYSBnbHlwaCBpbnRvIGEgZ2l2ZW4gYml0bWFwLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmFzdGVyX2RvbmUgICA6OiBUaGUgcmFzdGVyIGRlc3RydWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfUmFzdGVyX0Z1bmNzXwotICB7Ci0gICAgRlRfR2x5cGhfRm9ybWF0ICAgICAgICBnbHlwaF9mb3JtYXQ7Ci0gICAgRlRfUmFzdGVyX05ld0Z1bmMgICAgICByYXN0ZXJfbmV3OwotICAgIEZUX1Jhc3Rlcl9SZXNldEZ1bmMgICAgcmFzdGVyX3Jlc2V0OwotICAgIEZUX1Jhc3Rlcl9TZXRNb2RlRnVuYyAgcmFzdGVyX3NldF9tb2RlOwotICAgIEZUX1Jhc3Rlcl9SZW5kZXJGdW5jICAgcmFzdGVyX3JlbmRlcjsKLSAgICBGVF9SYXN0ZXJfRG9uZUZ1bmMgICAgIHJhc3Rlcl9kb25lOwotCi0gIH0gRlRfUmFzdGVyX0Z1bmNzOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVElNQUdFX0hfXyAqLwotCi0KLS8qIEVORCAqLwotCi0KLS8qIExvY2FsIFZhcmlhYmxlczogKi8KLS8qIGNvZGluZzogdXRmLTggICAgKi8KLS8qIEVuZDogICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRpbmNyZW0uaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRpbmNyZW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwMjQ2Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0aW5jcmVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRpbmNyZW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIGluY3JlbWVudGFsIGxvYWRpbmcgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLCAyMDAzLCAyMDA2LTIwMDgsIDIwMTAsIDIwMTQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRJTkNSRU1fSF9fCi0jZGVmaW5lIF9fRlRJTkNSRU1fSF9fCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzZWN0aW9uOgotICAgKiAgICBpbmNyZW1lbnRhbAotICAgKgotICAgKiBAdGl0bGU6Ci0gICAqICAgIEluY3JlbWVudGFsIExvYWRpbmcKLSAgICoKLSAgICogQGFic3RyYWN0OgotICAgKiAgICBDdXN0b20gR2x5cGggTG9hZGluZy4KLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB2YXJpb3VzIGZ1bmN0aW9ucyB1c2VkIHRvIHBlcmZvcm0gc28tY2FsbGVkCi0gICAqICAgYGluY3JlbWVudGFsJyBnbHlwaCBsb2FkaW5nLiAgVGhpcyBpcyBhIG1vZGUgd2hlcmUgYWxsIGdseXBocyBsb2FkZWQKLSAgICogICBmcm9tIGEgZ2l2ZW4gQEZUX0ZhY2UgYXJlIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgYXBwbGljYXRpb24uCi0gICAqCi0gICAqICAgQXBhcnQgZnJvbSB0aGF0LCBhbGwgb3RoZXIgdGFibGVzIGFyZSBsb2FkZWQgbm9ybWFsbHkgZnJvbSB0aGUgZm9udAotICAgKiAgIGZpbGUuICBUaGlzIG1vZGUgaXMgdXNlZnVsIHdoZW4gRnJlZVR5cGUgaXMgdXNlZCB3aXRoaW4gYW5vdGhlcgotICAgKiAgIGVuZ2luZSwgZS5nLiwgYSBQb3N0U2NyaXB0IEltYWdpbmcgUHJvY2Vzc29yLgotICAgKgotICAgKiAgIFRvIGVuYWJsZSB0aGlzIG1vZGUsIHlvdSBtdXN0IHVzZSBARlRfT3Blbl9GYWNlLCBwYXNzaW5nIGFuCi0gICAqICAgQEZUX1BhcmFtZXRlciB3aXRoIHRoZSBARlRfUEFSQU1fVEFHX0lOQ1JFTUVOVEFMIHRhZyBhbmQgYW4KLSAgICogICBARlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlIHZhbHVlLiAgU2VlIHRoZSBjb21tZW50cyBmb3IKLSAgICogICBARlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjIGZvciBhbiBleGFtcGxlLgotICAgKgotICAgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHR5cGU6Ci0gICAqICAgRlRfSW5jcmVtZW50YWwKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEFuIG9wYXF1ZSB0eXBlIGRlc2NyaWJpbmcgYSB1c2VyLXByb3ZpZGVkIG9iamVjdCB1c2VkIHRvIGltcGxlbWVudAotICAgKiAgIGBpbmNyZW1lbnRhbCcgZ2x5cGggbG9hZGluZyB3aXRoaW4gRnJlZVR5cGUuICBUaGlzIGlzIHVzZWQgdG8gc3VwcG9ydAotICAgKiAgIGVtYmVkZGVkIGZvbnRzIGluIGNlcnRhaW4gZW52aXJvbm1lbnRzIChlLmcuLCBQb3N0U2NyaXB0IGludGVycHJldGVycyksCi0gICAqICAgd2hlcmUgdGhlIGdseXBoIGRhdGEgaXNuJ3QgaW4gdGhlIGZvbnQgZmlsZSwgb3IgbXVzdCBiZSBvdmVycmlkZGVuIGJ5Ci0gICAqICAgZGlmZmVyZW50IHZhbHVlcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgSXQgaXMgdXAgdG8gY2xpZW50IGFwcGxpY2F0aW9ucyB0byBjcmVhdGUgYW5kIGltcGxlbWVudCBARlRfSW5jcmVtZW50YWwKLSAgICogICBvYmplY3RzLCBhcyBsb25nIGFzIHRoZXkgcHJvdmlkZSBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBtZXRob2RzCi0gICAqICAgQEZUX0luY3JlbWVudGFsX0dldEdseXBoRGF0YUZ1bmMsIEBGVF9JbmNyZW1lbnRhbF9GcmVlR2x5cGhEYXRhRnVuYwotICAgKiAgIGFuZCBARlRfSW5jcmVtZW50YWxfR2V0R2x5cGhNZXRyaWNzRnVuYy4KLSAgICoKLSAgICogICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIEBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2VSZWMgdG8gdW5kZXJzdGFuZCBob3cKLSAgICogICB0byB1c2UgaW5jcmVtZW50YWwgb2JqZWN0cyB3aXRoIEZyZWVUeXBlLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfSW5jcmVtZW50YWxSZWNfKiAgRlRfSW5jcmVtZW50YWw7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzdHJ1Y3Q6Ci0gICAqICAgRlRfSW5jcmVtZW50YWxfTWV0cmljc1JlYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBzbWFsbCBzdHJ1Y3R1cmUgdXNlZCB0byBjb250YWluIHRoZSBiYXNpYyBnbHlwaCBtZXRyaWNzIHJldHVybmVkCi0gICAqICAgYnkgdGhlIEBGVF9JbmNyZW1lbnRhbF9HZXRHbHlwaE1ldHJpY3NGdW5jIG1ldGhvZC4KLSAgICoKLSAgICogQGZpZWxkczoKLSAgICogICBiZWFyaW5nX3ggOjoKLSAgICogICAgIExlZnQgYmVhcmluZywgaW4gZm9udCB1bml0cy4KLSAgICoKLSAgICogICBiZWFyaW5nX3kgOjoKLSAgICogICAgIFRvcCBiZWFyaW5nLCBpbiBmb250IHVuaXRzLgotICAgKgotICAgKiAgIGFkdmFuY2UgOjoKLSAgICogICAgIEhvcml6b250YWwgY29tcG9uZW50IG9mIGdseXBoIGFkdmFuY2UsIGluIGZvbnQgdW5pdHMuCi0gICAqCi0gICAqICAgYWR2YW5jZV92IDo6Ci0gICAqICAgICBWZXJ0aWNhbCBjb21wb25lbnQgb2YgZ2x5cGggYWR2YW5jZSwgaW4gZm9udCB1bml0cy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhlc2UgY29ycmVzcG9uZCB0byBob3Jpem9udGFsIG9yIHZlcnRpY2FsIG1ldHJpY3MgZGVwZW5kaW5nIG9uIHRoZQotICAgKiAgIHZhbHVlIG9mIHRoZSBgdmVydGljYWwnIGFyZ3VtZW50IHRvIHRoZSBmdW5jdGlvbgotICAgKiAgIEBGVF9JbmNyZW1lbnRhbF9HZXRHbHlwaE1ldHJpY3NGdW5jLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0luY3JlbWVudGFsX01ldHJpY3NSZWNfCi0gIHsKLSAgICBGVF9Mb25nICBiZWFyaW5nX3g7Ci0gICAgRlRfTG9uZyAgYmVhcmluZ195OwotICAgIEZUX0xvbmcgIGFkdmFuY2U7Ci0gICAgRlRfTG9uZyAgYWR2YW5jZV92OyAgICAgLyogc2luY2UgMi4zLjEyICovCi0KLSAgfSBGVF9JbmNyZW1lbnRhbF9NZXRyaWNzUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAc3RydWN0OgotICAgKiAgIEZUX0luY3JlbWVudGFsX01ldHJpY3MKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgaGFuZGxlIHRvIGFuIEBGVF9JbmNyZW1lbnRhbF9NZXRyaWNzUmVjIHN0cnVjdHVyZS4KLSAgICoKLSAgICovCi0gICB0eXBlZGVmIHN0cnVjdCBGVF9JbmNyZW1lbnRhbF9NZXRyaWNzUmVjXyogIEZUX0luY3JlbWVudGFsX01ldHJpY3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEB0eXBlOgotICAgKiAgIEZUX0luY3JlbWVudGFsX0dldEdseXBoRGF0YUZ1bmMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgZnVuY3Rpb24gY2FsbGVkIGJ5IEZyZWVUeXBlIHRvIGFjY2VzcyBhIGdpdmVuIGdseXBoJ3MgZGF0YSBieXRlcwotICAgKiAgIGR1cmluZyBARlRfTG9hZF9HbHlwaCBvciBARlRfTG9hZF9DaGFyIGlmIGluY3JlbWVudGFsIGxvYWRpbmcgaXMKLSAgICogICBlbmFibGVkLgotICAgKgotICAgKiAgIE5vdGUgdGhhdCB0aGUgZm9ybWF0IG9mIHRoZSBnbHlwaCdzIGRhdGEgYnl0ZXMgZGVwZW5kcyBvbiB0aGUgZm9udAotICAgKiAgIGZpbGUgZm9ybWF0LiAgRm9yIFRydWVUeXBlLCBpdCBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIHJhdyBieXRlcyB3aXRoaW4KLSAgICogICB0aGUgYGdseWYnIHRhYmxlLiAgRm9yIFBvc3RTY3JpcHQgZm9ybWF0cywgaXQgbXVzdCBjb3JyZXNwb25kIHRvIHRoZQotICAgKiAgICp1bmVuY3J5cHRlZCogY2hhcnN0cmluZyBieXRlcywgd2l0aG91dCBhbnkgYGxlbklWJyBoZWFkZXIuICBJdCBpcwotICAgKiAgIHVuZGVmaW5lZCBmb3IgYW55IG90aGVyIGZvcm1hdC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGluY3JlbWVudGFsIDo6Ci0gICAqICAgICBIYW5kbGUgdG8gYW4gb3BhcXVlIEBGVF9JbmNyZW1lbnRhbCBoYW5kbGUgcHJvdmlkZWQgYnkgdGhlIGNsaWVudAotICAgKiAgICAgYXBwbGljYXRpb24uCi0gICAqCi0gICAqICAgZ2x5cGhfaW5kZXggOjoKLSAgICogICAgIEluZGV4IG9mIHJlbGV2YW50IGdseXBoLgotICAgKgotICAgKiBAb3V0cHV0OgotICAgKiAgIGFkYXRhIDo6Ci0gICAqICAgICBBIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSByZXR1cm5lZCBnbHlwaCBkYXRhIGJ5dGVzICh3aGljaCB3aWxsIGJlCi0gICAqICAgICBhY2Nlc3NlZCBhcyBhIHJlYWQtb25seSBieXRlIGJsb2NrKS4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgc3VjY2Vzc2Z1bGx5IHRoZSBtZXRob2QKLSAgICogICBARlRfSW5jcmVtZW50YWxfRnJlZUdseXBoRGF0YUZ1bmMgd2lsbCBiZSBjYWxsZWQgbGF0ZXIgdG8gcmVsZWFzZQotICAgKiAgIHRoZSBkYXRhIGJ5dGVzLgotICAgKgotICAgKiAgIE5lc3RlZCBjYWxscyB0byBARlRfSW5jcmVtZW50YWxfR2V0R2x5cGhEYXRhRnVuYyBjYW4gaGFwcGVuIGZvcgotICAgKiAgIGNvbXBvdW5kIGdseXBocy4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9JbmNyZW1lbnRhbF9HZXRHbHlwaERhdGFGdW5jKSggRlRfSW5jcmVtZW50YWwgIGluY3JlbWVudGFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RhdGEqICAgICAgICBhZGF0YSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAdHlwZToKLSAgICogICBGVF9JbmNyZW1lbnRhbF9GcmVlR2x5cGhEYXRhRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBmdW5jdGlvbiB1c2VkIHRvIHJlbGVhc2UgdGhlIGdseXBoIGRhdGEgYnl0ZXMgcmV0dXJuZWQgYnkgYQotICAgKiAgIHN1Y2Nlc3NmdWwgY2FsbCB0byBARlRfSW5jcmVtZW50YWxfR2V0R2x5cGhEYXRhRnVuYy4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGluY3JlbWVudGFsIDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byBhbiBvcGFxdWUgQEZUX0luY3JlbWVudGFsIGhhbmRsZSBwcm92aWRlZCBieSB0aGUgY2xpZW50Ci0gICAqICAgICBhcHBsaWNhdGlvbi4KLSAgICoKLSAgICogICBkYXRhIDo6Ci0gICAqICAgICBBIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBnbHlwaCBkYXRhIGJ5dGVzICh3aGljaCB3aWxsIGJlIGFjY2Vzc2VkCi0gICAqICAgICBhcyBhIHJlYWQtb25seSBieXRlIGJsb2NrKS4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX0luY3JlbWVudGFsX0ZyZWVHbHlwaERhdGFGdW5jKSggRlRfSW5jcmVtZW50YWwgIGluY3JlbWVudGFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRGF0YSogICAgICAgIGRhdGEgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHR5cGU6Ci0gICAqICAgRlRfSW5jcmVtZW50YWxfR2V0R2x5cGhNZXRyaWNzRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBmdW5jdGlvbiB1c2VkIHRvIHJldHJpZXZlIHRoZSBiYXNpYyBtZXRyaWNzIG9mIGEgZ2l2ZW4gZ2x5cGggaW5kZXgKLSAgICogICBiZWZvcmUgYWNjZXNzaW5nIGl0cyBkYXRhLiAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSwgaW4gY2VydGFpbgotICAgKiAgIGZvcm1hdHMgbGlrZSBUcnVlVHlwZSwgdGhlIG1ldHJpY3MgYXJlIHN0b3JlZCBpbiBhIGRpZmZlcmVudCBwbGFjZSBmcm9tCi0gICAqICAgdGhlIGdseXBoIGltYWdlcyBwcm9wZXIuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBpbmNyZW1lbnRhbCA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gYW4gb3BhcXVlIEBGVF9JbmNyZW1lbnRhbCBoYW5kbGUgcHJvdmlkZWQgYnkgdGhlIGNsaWVudAotICAgKiAgICAgYXBwbGljYXRpb24uCi0gICAqCi0gICAqICAgZ2x5cGhfaW5kZXggOjoKLSAgICogICAgIEluZGV4IG9mIHJlbGV2YW50IGdseXBoLgotICAgKgotICAgKiAgIHZlcnRpY2FsIDo6Ci0gICAqICAgICBJZiB0cnVlLCByZXR1cm4gdmVydGljYWwgbWV0cmljcy4KLSAgICoKLSAgICogICBhbWV0cmljcyA6OgotICAgKiAgICAgVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0LgotICAgKiAgICAgVGhlIG9yaWdpbmFsIGdseXBoIG1ldHJpY3MsIGlmIGFueSwgaW4gZm9udCB1bml0cy4gIElmIG1ldHJpY3MgYXJlCi0gICAqICAgICBub3QgYXZhaWxhYmxlIGFsbCB0aGUgdmFsdWVzIG11c3QgYmUgc2V0IHRvIHplcm8uCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgYW1ldHJpY3MgOjoKLSAgICogICAgIFRoZSByZXBsYWNlbWVudCBnbHlwaCBtZXRyaWNzIGluIGZvbnQgdW5pdHMuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfSW5jcmVtZW50YWxfR2V0R2x5cGhNZXRyaWNzRnVuYykKLSAgICAgICAgICAgICAgICAgICAgICAoIEZUX0luY3JlbWVudGFsICAgICAgICAgICAgICBpbmNyZW1lbnRhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0luY3JlbWVudGFsX01ldHJpY3NSZWMgICphbWV0cmljcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzdHJ1Y3Q6Ci0gICAqICAgRlRfSW5jcmVtZW50YWxfRnVuY3NSZWMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgdGFibGUgb2YgZnVuY3Rpb25zIGZvciBhY2Nlc3NpbmcgZm9udHMgdGhhdCBsb2FkIGRhdGEKLSAgICogICBpbmNyZW1lbnRhbGx5LiAgVXNlZCBpbiBARlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjLgotICAgKgotICAgKiBAZmllbGRzOgotICAgKiAgIGdldF9nbHlwaF9kYXRhIDo6Ci0gICAqICAgICBUaGUgZnVuY3Rpb24gdG8gZ2V0IGdseXBoIGRhdGEuICBNdXN0IG5vdCBiZSBudWxsLgotICAgKgotICAgKiAgIGZyZWVfZ2x5cGhfZGF0YSA6OgotICAgKiAgICAgVGhlIGZ1bmN0aW9uIHRvIHJlbGVhc2UgZ2x5cGggZGF0YS4gIE11c3Qgbm90IGJlIG51bGwuCi0gICAqCi0gICAqICAgZ2V0X2dseXBoX21ldHJpY3MgOjoKLSAgICogICAgIFRoZSBmdW5jdGlvbiB0byBnZXQgZ2x5cGggbWV0cmljcy4gIE1heSBiZSBudWxsIGlmIHRoZSBmb250IGRvZXMKLSAgICogICAgIG5vdCBwcm92aWRlIG92ZXJyaWRpbmcgZ2x5cGggbWV0cmljcy4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9JbmNyZW1lbnRhbF9GdW5jc1JlY18KLSAgewotICAgIEZUX0luY3JlbWVudGFsX0dldEdseXBoRGF0YUZ1bmMgICAgIGdldF9nbHlwaF9kYXRhOwotICAgIEZUX0luY3JlbWVudGFsX0ZyZWVHbHlwaERhdGFGdW5jICAgIGZyZWVfZ2x5cGhfZGF0YTsKLSAgICBGVF9JbmNyZW1lbnRhbF9HZXRHbHlwaE1ldHJpY3NGdW5jICBnZXRfZ2x5cGhfbWV0cmljczsKLQotICB9IEZUX0luY3JlbWVudGFsX0Z1bmNzUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAc3RydWN0OgotICAgKiAgIEZUX0luY3JlbWVudGFsX0ludGVyZmFjZVJlYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBzdHJ1Y3R1cmUgdG8gYmUgdXNlZCB3aXRoIEBGVF9PcGVuX0ZhY2UgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdXNlcgotICAgKiAgIHdhbnRzIHRvIHN1cHBvcnQgaW5jcmVtZW50YWwgZ2x5cGggbG9hZGluZy4gIFlvdSBzaG91bGQgdXNlIGl0IHdpdGgKLSAgICogICBARlRfUEFSQU1fVEFHX0lOQ1JFTUVOVEFMIGFzIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKLSAgICoKLSAgICogICAgIHsKLSAgICogICAgICAgRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjICBpbmNfaW50OwotICAgKiAgICAgICBGVF9QYXJhbWV0ZXIgICAgICAgICAgICAgICAgIHBhcmFtZXRlcjsKLSAgICogICAgICAgRlRfT3Blbl9BcmdzICAgICAgICAgICAgICAgICBvcGVuX2FyZ3M7Ci0gICAqCi0gICAqCi0gICAqICAgICAgIC8vIHNldCB1cCBpbmNyZW1lbnRhbCBkZXNjcmlwdG9yCi0gICAqICAgICAgIGluY19pbnQuZnVuY3MgID0gbXlfZnVuY3M7Ci0gICAqICAgICAgIGluY19pbnQub2JqZWN0ID0gbXlfb2JqZWN0OwotICAgKgotICAgKiAgICAgICAvLyBzZXQgdXAgb3B0aW9uYWwgcGFyYW1ldGVyCi0gICAqICAgICAgIHBhcmFtZXRlci50YWcgID0gRlRfUEFSQU1fVEFHX0lOQ1JFTUVOVEFMOwotICAgKiAgICAgICBwYXJhbWV0ZXIuZGF0YSA9ICZpbmNfaW50OwotICAgKgotICAgKiAgICAgICAvLyBzZXQgdXAgRlRfT3Blbl9BcmdzIHN0cnVjdHVyZQotICAgKiAgICAgICBvcGVuX2FyZ3MuZmxhZ3MgICAgICA9IEZUX09QRU5fUEFUSE5BTUUgfCBGVF9PUEVOX1BBUkFNUzsKLSAgICogICAgICAgb3Blbl9hcmdzLnBhdGhuYW1lICAgPSBteV9mb250X3BhdGhuYW1lOwotICAgKiAgICAgICBvcGVuX2FyZ3MubnVtX3BhcmFtcyA9IDE7Ci0gICAqICAgICAgIG9wZW5fYXJncy5wYXJhbXMgICAgID0gJnBhcmFtZXRlcjsgLy8gd2UgdXNlIG9uZSBvcHRpb25hbCBhcmd1bWVudAotICAgKgotICAgKiAgICAgICAvLyBvcGVuIHRoZSBmb250Ci0gICAqICAgICAgIGVycm9yID0gRlRfT3Blbl9GYWNlKCBsaWJyYXJ5LCAmb3Blbl9hcmdzLCBpbmRleCwgJmZhY2UgKTsKLSAgICogICAgICAgLi4uCi0gICAqICAgICB9Ci0gICAqCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjXwotICB7Ci0gICAgY29uc3QgRlRfSW5jcmVtZW50YWxfRnVuY3NSZWMqICBmdW5jczsKLSAgICBGVF9JbmNyZW1lbnRhbCAgICAgICAgICAgICAgICAgIG9iamVjdDsKLQotICB9IEZUX0luY3JlbWVudGFsX0ludGVyZmFjZVJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHR5cGU6Ci0gICAqICAgRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIHBvaW50ZXIgdG8gYW4gQEZUX0luY3JlbWVudGFsX0ludGVyZmFjZVJlYyBzdHJ1Y3R1cmUuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIEZUX0luY3JlbWVudGFsX0ludGVyZmFjZVJlYyogICBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2U7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBjb25zdGFudDoKLSAgICogICBGVF9QQVJBTV9UQUdfSU5DUkVNRU5UQUwKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgY29uc3RhbnQgdXNlZCBhcyB0aGUgdGFnIG9mIEBGVF9QYXJhbWV0ZXIgc3RydWN0dXJlcyB0byBpbmRpY2F0ZQotICAgKiAgIGFuIGluY3JlbWVudGFsIGxvYWRpbmcgb2JqZWN0IHRvIGJlIHVzZWQgYnkgRnJlZVR5cGUuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9QQVJBTV9UQUdfSU5DUkVNRU5UQUwgIEZUX01BS0VfVEFHKCAnaScsICduJywgJ2MnLCAncicgKQotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVElOQ1JFTV9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRsY2RmaWwuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRsY2RmaWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkyMDZmMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0bGNkZmlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRsY2RmaWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgY29sb3IgZmlsdGVyaW5nIG9mIHN1YnBpeGVsIGJpdG1hcCBnbHlwaHMgICAgICAgICAgICovCi0vKiAgICAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNi0yMDA4LCAyMDEwLCAyMDEzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUX0xDRF9GSUxURVJfSF9fCi0jZGVmaW5lIF9fRlRfTENEX0ZJTFRFUl9IX18KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHNlY3Rpb246Ci0gICAqICAgbGNkX2ZpbHRlcmluZwotICAgKgotICAgKiBAdGl0bGU6Ci0gICAqICAgTENEIEZpbHRlcmluZwotICAgKgotICAgKiBAYWJzdHJhY3Q6Ci0gICAqICAgUmVkdWNlIGNvbG9yIGZyaW5nZXMgb2YgTENELW9wdGltaXplZCBiaXRtYXBzLgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhlIEBGVF9MaWJyYXJ5X1NldExjZEZpbHRlciBBUEkgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGxvdy1wYXNzCi0gICAqICAgZmlsdGVyLCB3aGljaCBpcyB0aGVuIGFwcGxpZWQgdG8gTENELW9wdGltaXplZCBiaXRtYXBzIGdlbmVyYXRlZAotICAgKiAgIHRocm91Z2ggQEZUX1JlbmRlcl9HbHlwaC4gIFRoaXMgaXMgdXNlZnVsIHRvIHJlZHVjZSBjb2xvciBmcmluZ2VzCi0gICAqICAgdGhhdCB3b3VsZCBvY2N1ciB3aXRoIHVuZmlsdGVyZWQgcmVuZGVyaW5nLgotICAgKgotICAgKiAgIE5vdGUgdGhhdCBubyBmaWx0ZXIgaXMgYWN0aXZlIGJ5IGRlZmF1bHQsIGFuZCB0aGF0IHRoaXMgZnVuY3Rpb24gaXMKLSAgICogICAqbm90KiBpbXBsZW1lbnRlZCBpbiBkZWZhdWx0IGJ1aWxkcyBvZiB0aGUgbGlicmFyeS4gIFlvdSBuZWVkIHRvCi0gICAqICAgI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORyBpbiB5b3VyIGBmdG9wdGlvbi5oJyBmaWxlCi0gICAqICAgaW4gb3JkZXIgdG8gYWN0aXZhdGUgaXQuCi0gICAqCi0gICAqICAgRnJlZVR5cGUgZ2VuZXJhdGVzIGFscGhhIGNvdmVyYWdlIG1hcHMsIHdoaWNoIGFyZSBsaW5lYXIgYnkgbmF0dXJlLgotICAgKiAgIEZvciBpbnN0YW5jZSwgdGhlIHZhbHVlIDB4ODAgaW4gYml0bWFwIHJlcHJlc2VudGF0aW9uIG1lYW5zIHRoYXQKLSAgICogICAod2l0aGluIG51bWVyaWNhbCBwcmVjaXNpb24pIDB4ODAvMHhmZiBmcmFjdGlvbiBvZiB0aGF0IHBpeGVsIGlzCi0gICAqICAgY292ZXJlZCBieSB0aGUgZ2x5cGgncyBvdXRsaW5lLiAgVGhlIGJsZW5kaW5nIGZ1bmN0aW9uIGZvciBwbGFjaW5nCi0gICAqICAgdGV4dCBvdmVyIGEgYmFja2dyb3VuZCBpcwotICAgKgotICAgKiAgIHsKLSAgICogICAgIGRzdCA9IGFscGhhICogc3JjICsgKDEgLSBhbHBoYSkgKiBkc3QgICAgLAotICAgKiAgIH0KLSAgICoKLSAgICogICB3aGljaCBpcyBrbm93biBhcyBPVkVSLiAgSG93ZXZlciwgd2hlbiBjYWxjdWxhdGluZyB0aGUgb3V0cHV0IG9mIHRoZQotICAgKiAgIE9WRVIgb3BlcmF0b3IsIHRoZSBzb3VyY2UgY29sb3JzIHNob3VsZCBmaXJzdCBiZSB0cmFuc2Zvcm1lZCB0byBhCi0gICAqICAgbGluZWFyIGNvbG9yIHNwYWNlLCB0aGVuIGFscGhhIGJsZW5kZWQgaW4gdGhhdCBzcGFjZSwgYW5kIHRyYW5zZm9ybWVkCi0gICAqICAgYmFjayB0byB0aGUgb3V0cHV0IGNvbG9yIHNwYWNlLgotICAgKgotICAgKiAgIFdoZW4gbGluZWFyIGxpZ2h0IGJsZW5kaW5nIGlzIHVzZWQsIHRoZSBkZWZhdWx0IEZJUjUgZmlsdGVyaW5nCi0gICAqICAgd2VpZ2h0cyAoYXMgZ2l2ZW4gYnkgRlRfTENEX0ZJTFRFUl9ERUZBVUxUKSBhcmUgbm8gbG9uZ2VyIG9wdGltYWwsIGFzCi0gICAqICAgdGhleSBoYXZlIGJlZW4gZGVzaWduZWQgZm9yIGJsYWNrIG9uIHdoaXRlIHJlbmRlcmluZyB3aGlsZSBsYWNraW5nCi0gICAqICAgZ2FtbWEgY29ycmVjdGlvbi4gIFRvIHByZXNlcnZlIGNvbG9yIG5ldXRyYWxpdHksIHdlaWdodHMgZm9yIGEgRklSNQotICAgKiAgIGZpbHRlciBzaG91bGQgYmUgY2hvc2VuIGFjY29yZGluZyB0byB0d28gZnJlZSBwYXJhbWV0ZXJzIGBhJyBhbmQgYGMnLAotICAgKiAgIGFuZCB0aGUgRklSIHdlaWdodHMgc2hvdWxkIGJlCi0gICAqCi0gICAqICAgewotICAgKiAgICAgW2EgLSBjLCBhICsgYywgMiAqIGEsIGEgKyBjLCBhIC0gY10gICAgLgotICAgKiAgIH0KLSAgICoKLSAgICogICBUaGlzIGZvcm11bGEgZ2VuZXJhdGVzIGVxdWFsIHdlaWdodHMgZm9yIGFsbCB0aGUgY29sb3IgcHJpbWFyaWVzCi0gICAqICAgYWNyb3NzIHRoZSBmaWx0ZXIga2VybmVsLCB3aGljaCBtYWtlcyBpdCBjb2xvcmxlc3MuICBPbmUgc3VnZ2VzdGVkCi0gICAqICAgc2V0IG9mIHdlaWdodHMgaXMKLSAgICoKLSAgICogICB7Ci0gICAqICAgICBbMHgxMCwgMHg1MCwgMHg2MCwgMHg1MCwgMHgxMF0gICAgLAotICAgKiAgIH0KLSAgICoKLSAgICogICB3aGVyZSBgYScgaGFzIHZhbHVlIDB4MzAgYW5kIGBiJyB2YWx1ZSAweDIwLiAgVGhlIHdlaWdodHMgaW4gZmlsdGVyCi0gICAqICAgbWF5IGhhdmUgYSBzdW0gbGFyZ2VyIHRoYW4gMHgxMDAsIHdoaWNoIGluY3JlYXNlcyBjb2xvcmF0aW9uIHNsaWdodGx5Ci0gICAqICAgYnV0IGFsc28gaW1wcm92ZXMgY29udHJhc3QuCi0gICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGVudW06Ci0gICAqICAgRlRfTGNkRmlsdGVyCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGxpc3Qgb2YgdmFsdWVzIHRvIGlkZW50aWZ5IHZhcmlvdXMgdHlwZXMgb2YgTENEIGZpbHRlcnMuCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgRlRfTENEX0ZJTFRFUl9OT05FIDo6Ci0gICAqICAgICBEbyBub3QgcGVyZm9ybSBmaWx0ZXJpbmcuICBXaGVuIHVzZWQgd2l0aCBzdWJwaXhlbCByZW5kZXJpbmcsIHRoaXMKLSAgICogICAgIHJlc3VsdHMgaW4gc29tZXRpbWVzIHNldmVyZSBjb2xvciBmcmluZ2VzLgotICAgKgotICAgKiAgIEZUX0xDRF9GSUxURVJfREVGQVVMVCA6OgotICAgKiAgICAgVGhlIGRlZmF1bHQgZmlsdGVyIHJlZHVjZXMgY29sb3IgZnJpbmdlcyBjb25zaWRlcmFibHksIGF0IHRoZSBjb3N0Ci0gICAqICAgICBvZiBhIHNsaWdodCBibHVycmluZXNzIGluIHRoZSBvdXRwdXQuCi0gICAqCi0gICAqICAgRlRfTENEX0ZJTFRFUl9MSUdIVCA6OgotICAgKiAgICAgVGhlIGxpZ2h0IGZpbHRlciBpcyBhIHZhcmlhbnQgdGhhdCBwcm9kdWNlcyBsZXNzIGJsdXJyaW5lc3MgYXQgdGhlCi0gICAqICAgICBjb3N0IG9mIHNsaWdodGx5IG1vcmUgY29sb3IgZnJpbmdlcyB0aGFuIHRoZSBkZWZhdWx0IG9uZS4gIEl0IG1pZ2h0Ci0gICAqICAgICBiZSBiZXR0ZXIsIGRlcGVuZGluZyBvbiB0YXN0ZSwgeW91ciBtb25pdG9yLCBvciB5b3VyIHBlcnNvbmFsIHZpc2lvbi4KLSAgICoKLSAgICogICBGVF9MQ0RfRklMVEVSX0xFR0FDWSA6OgotICAgKiAgICAgVGhpcyBmaWx0ZXIgY29ycmVzcG9uZHMgdG8gdGhlIG9yaWdpbmFsIGxpYlhmdCBjb2xvciBmaWx0ZXIuICBJdAotICAgKiAgICAgcHJvdmlkZXMgaGlnaCBjb250cmFzdCBvdXRwdXQgYnV0IGNhbiBleGhpYml0IHJlYWxseSBiYWQgY29sb3IKLSAgICogICAgIGZyaW5nZXMgaWYgZ2x5cGhzIGFyZSBub3QgZXh0cmVtZWx5IHdlbGwgaGludGVkIHRvIHRoZSBwaXhlbCBncmlkLgotICAgKiAgICAgSW4gb3RoZXIgd29yZHMsIGl0IG9ubHkgd29ya3Mgd2VsbCBpZiB0aGUgVHJ1ZVR5cGUgYnl0ZWNvZGUKLSAgICogICAgIGludGVycHJldGVyIGlzIGVuYWJsZWQgKmFuZCogaGlnaC1xdWFsaXR5IGhpbnRlZCBmb250cyBhcmUgdXNlZC4KLSAgICoKLSAgICogICAgIFRoaXMgZmlsdGVyIGlzIG9ubHkgcHJvdmlkZWQgZm9yIGNvbXBhcmlzb24gcHVycG9zZXMsIGFuZCBtaWdodCBiZQotICAgKiAgICAgZGlzYWJsZWQgb3Igc3RheSB1bnN1cHBvcnRlZCBpbiB0aGUgZnV0dXJlLgotICAgKgotICAgKiBAc2luY2U6Ci0gICAqICAgMi4zLjAKLSAgICovCi0gIHR5cGVkZWYgZW51bSAgRlRfTGNkRmlsdGVyXwotICB7Ci0gICAgRlRfTENEX0ZJTFRFUl9OT05FICAgID0gMCwKLSAgICBGVF9MQ0RfRklMVEVSX0RFRkFVTFQgPSAxLAotICAgIEZUX0xDRF9GSUxURVJfTElHSFQgICA9IDIsCi0gICAgRlRfTENEX0ZJTFRFUl9MRUdBQ1kgID0gMTYsCi0KLSAgICBGVF9MQ0RfRklMVEVSX01BWCAgIC8qIGRvIG5vdCByZW1vdmUgKi8KLQotICB9IEZUX0xjZEZpbHRlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuYzoKLSAgICogICBGVF9MaWJyYXJ5X1NldExjZEZpbHRlcgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFwcGx5IGNvbG9yIGZpbHRlcmluZyB0byBMQ0QgZGVjaW1hdGVkCi0gICAqICAgYml0bWFwcywgbGlrZSB0aGUgb25lcyB1c2VkIHdoZW4gY2FsbGluZyBARlRfUmVuZGVyX0dseXBoIHdpdGgKLSAgICogICBARlRfUkVOREVSX01PREVfTENEIG9yIEBGVF9SRU5ERVJfTU9ERV9MQ0RfVi4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGxpYnJhcnkgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgbGlicmFyeSBpbnN0YW5jZS4KLSAgICoKLSAgICogICBmaWx0ZXIgOjoKLSAgICogICAgIFRoZSBmaWx0ZXIgdHlwZS4KLSAgICoKLSAgICogICAgIFlvdSBjYW4gdXNlIEBGVF9MQ0RfRklMVEVSX05PTkUgaGVyZSB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZSwgb3IKLSAgICogICAgIEBGVF9MQ0RfRklMVEVSX0RFRkFVTFQgdG8gdXNlIGEgZGVmYXVsdCBmaWx0ZXIgdGhhdCBzaG91bGQgd29yawotICAgKiAgICAgd2VsbCBvbiBtb3N0IExDRCBzY3JlZW5zLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoaXMgZmVhdHVyZSBpcyBhbHdheXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4gIENsaWVudHMgbXVzdCBtYWtlIGFuCi0gICAqICAgZXhwbGljaXQgY2FsbCB0byB0aGlzIGZ1bmN0aW9uIHdpdGggYSBgZmlsdGVyJyB2YWx1ZSBvdGhlciB0aGFuCi0gICAqICAgQEZUX0xDRF9GSUxURVJfTk9ORSBpbiBvcmRlciB0byBlbmFibGUgaXQuCi0gICAqCi0gICAqICAgRHVlIHRvICpQQVRFTlRTKiBjb3ZlcmluZyBzdWJwaXhlbCByZW5kZXJpbmcsIHRoaXMgZnVuY3Rpb24gZG9lc24ndAotICAgKiAgIGRvIGFueXRoaW5nIGV4Y2VwdCByZXR1cm5pbmcgYEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmUnIGlmIHRoZQotICAgKiAgIGNvbmZpZ3VyYXRpb24gbWFjcm8gRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcgaXMgbm90Ci0gICAqICAgZGVmaW5lZCBpbiB5b3VyIGJ1aWxkIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCBzaG91bGQgY29ycmVzcG9uZCB0byBhbGwKLSAgICogICBkZWZhdWx0IGJ1aWxkcyBvZiBGcmVlVHlwZS4KLSAgICoKLSAgICogICBUaGUgZmlsdGVyIGFmZmVjdHMgZ2x5cGggYml0bWFwcyByZW5kZXJlZCB0aHJvdWdoIEBGVF9SZW5kZXJfR2x5cGgsCi0gICAqICAgQEZUX091dGxpbmVfR2V0X0JpdG1hcCwgQEZUX0xvYWRfR2x5cGgsIGFuZCBARlRfTG9hZF9DaGFyLgotICAgKgotICAgKiAgIEl0IGRvZXMgX25vdF8gYWZmZWN0IHRoZSBvdXRwdXQgb2YgQEZUX091dGxpbmVfUmVuZGVyIGFuZAotICAgKiAgIEBGVF9PdXRsaW5lX0dldF9CaXRtYXAuCi0gICAqCi0gICAqICAgSWYgdGhpcyBmZWF0dXJlIGlzIGFjdGl2YXRlZCwgdGhlIGRpbWVuc2lvbnMgb2YgTENEIGdseXBoIGJpdG1hcHMgYXJlCi0gICAqICAgZWl0aGVyIGxhcmdlciBvciB0YWxsZXIgdGhhbiB0aGUgZGltZW5zaW9ucyBvZiB0aGUgY29ycmVzcG9uZGluZwotICAgKiAgIG91dGxpbmUgd2l0aCByZWdhcmRzIHRvIHRoZSBwaXhlbCBncmlkLiAgRm9yIGV4YW1wbGUsIGZvcgotICAgKiAgIEBGVF9SRU5ERVJfTU9ERV9MQ0QsIHRoZSBmaWx0ZXIgYWRkcyB1cCB0byAzfnBpeGVscyB0byB0aGUgbGVmdCwgYW5kCi0gICAqICAgdXAgdG8gM35waXhlbHMgdG8gdGhlIHJpZ2h0LgotICAgKgotICAgKiAgIFRoZSBiaXRtYXAgb2Zmc2V0IHZhbHVlcyBhcmUgYWRqdXN0ZWQgY29ycmVjdGx5LCBzbyBjbGllbnRzIHNob3VsZG4ndAotICAgKiAgIG5lZWQgdG8gbW9kaWZ5IHRoZWlyIGxheW91dCBhbmQgZ2x5cGggcG9zaXRpb25pbmcgY29kZSB3aGVuIGVuYWJsaW5nCi0gICAqICAgdGhlIGZpbHRlci4KLSAgICoKLSAgICogQHNpbmNlOgotICAgKiAgIDIuMy4wCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfTGlicmFyeV9TZXRMY2RGaWx0ZXIoIEZUX0xpYnJhcnkgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xjZEZpbHRlciAgZmlsdGVyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmM6Ci0gICAqICAgRlRfTGlicmFyeV9TZXRMY2RGaWx0ZXJXZWlnaHRzCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBVc2UgdGhpcyBmdW5jdGlvbiB0byBvdmVycmlkZSB0aGUgZmlsdGVyIHdlaWdodHMgc2VsZWN0ZWQgYnkKLSAgICogICBARlRfTGlicmFyeV9TZXRMY2RGaWx0ZXIuICBCeSBkZWZhdWx0LCBGcmVlVHlwZSB1c2VzIHRoZSBxdWludHVwbGUKLSAgICogICAoMHgwMCwgMHg1NSwgMHg1NiwgMHg1NSwgMHgwMCkgZm9yIEZUX0xDRF9GSUxURVJfTElHSFQsIGFuZCAoMHgxMCwKLSAgICogICAweDQwLCAweDcwLCAweDQwLCAweDEwKSBmb3IgRlRfTENEX0ZJTFRFUl9ERUZBVUxUIGFuZAotICAgKiAgIEZUX0xDRF9GSUxURVJfTEVHQUNZLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgbGlicmFyeSA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBsaWJyYXJ5IGluc3RhbmNlLgotICAgKgotICAgKiAgIHdlaWdodHMgOjoKLSAgICogICAgIEEgcG9pbnRlciB0byBhbiBhcnJheTsgdGhlIGZ1bmN0aW9uIGNvcGllcyB0aGUgZmlyc3QgZml2ZSBieXRlcyBhbmQKLSAgICogICAgIHVzZXMgdGhlbSB0byBzcGVjaWZ5IHRoZSBmaWx0ZXIgd2VpZ2h0cy4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBEdWUgdG8gKlBBVEVOVFMqIGNvdmVyaW5nIHN1YnBpeGVsIHJlbmRlcmluZywgdGhpcyBmdW5jdGlvbiBkb2Vzbid0Ci0gICAqICAgZG8gYW55dGhpbmcgZXhjZXB0IHJldHVybmluZyBgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZScgaWYgdGhlCi0gICAqICAgY29uZmlndXJhdGlvbiBtYWNybyBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORyBpcyBub3QKLSAgICogICBkZWZpbmVkIGluIHlvdXIgYnVpbGQgb2YgdGhlIGxpYnJhcnksIHdoaWNoIHNob3VsZCBjb3JyZXNwb25kIHRvIGFsbAotICAgKiAgIGRlZmF1bHQgYnVpbGRzIG9mIEZyZWVUeXBlLgotICAgKgotICAgKiAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgQEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyIHRvIGhhdmUKLSAgICogICBhbnkgZWZmZWN0LgotICAgKgotICAgKiBAc2luY2U6Ci0gICAqICAgMi40LjAKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9MaWJyYXJ5X1NldExjZEZpbHRlcldlaWdodHMoIEZUX0xpYnJhcnkgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICp3ZWlnaHRzICk7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUX0xDRF9GSUxURVJfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0bGlzdC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdGxpc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk1MGEyNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0bGlzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0bGlzdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBHZW5lcmljIGxpc3Qgc3VwcG9ydCBmb3IgRnJlZVR5cGUgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAzLCAyMDA3LCAyMDEwLCAyMDEzLCAyMDE0IGJ5ICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgcmVsYXRpdmUgdG8gbGlzdCBwcm9jZXNzaW5nLiAgSXRzICAgICAqLwotICAvKiAgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkIGluIGBmcmVldHlwZS5oJy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVExJU1RfSF9fCi0jZGVmaW5lIF9fRlRMSVNUX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpc3RfcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExpc3QgUHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNpbXBsZSBtYW5hZ2VtZW50IG9mIGxpc3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB2YXJpb3VzIGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gbGlzdCAgICAgICAgICAqLwotICAvKiAgICBwcm9jZXNzaW5nIHVzaW5nIGRvdWJseS1saW5rZWQgbm9kZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPcmRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdE5vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0Tm9kZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfQWRkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0luc2VydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9GaW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfUmVtb3ZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X1VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9JdGVyYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfSXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0ZpbmFsaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9EZXN0cnVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfRmluZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZpbmQgdGhlIGxpc3Qgbm9kZSBmb3IgYSBnaXZlbiBsaXN0ZWQgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpc3QgOjogQSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkYXRhIDo6IFRoZSBhZGRyZXNzIG9mIHRoZSBsaXN0ZWQgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMaXN0IG5vZGUuICBOVUxMIGlmIGl0IHdhc24ndCBmb3VuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfTGlzdE5vZGUgKQotICBGVF9MaXN0X0ZpbmQoIEZUX0xpc3QgIGxpc3QsCi0gICAgICAgICAgICAgICAgdm9pZCogICAgZGF0YSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9BZGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQXBwZW5kIGFuIGVsZW1lbnQgdG8gdGhlIGVuZCBvZiBhIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlzdCA6OiBBIHBvaW50ZXIgdG8gdGhlIHBhcmVudCBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5vZGUgOjogVGhlIG5vZGUgdG8gYXBwZW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfTGlzdF9BZGQoIEZUX0xpc3QgICAgICBsaXN0LAotICAgICAgICAgICAgICAgRlRfTGlzdE5vZGUgIG5vZGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfSW5zZXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluc2VydCBhbiBlbGVtZW50IGF0IHRoZSBoZWFkIG9mIGEgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpc3QgOjogQSBwb2ludGVyIHRvIHBhcmVudCBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBub2RlIDo6IFRoZSBub2RlIHRvIGluc2VydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX0xpc3RfSW5zZXJ0KCBGVF9MaXN0ICAgICAgbGlzdCwKLSAgICAgICAgICAgICAgICAgIEZUX0xpc3ROb2RlICBub2RlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X1JlbW92ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZW1vdmUgYSBub2RlIGZyb20gYSBsaXN0LiAgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIHdoZXRoZXIgICAgKi8KLSAgLyogICAgdGhlIG5vZGUgaXMgaW4gdGhlIGxpc3QhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbm9kZSA6OiBUaGUgbm9kZSB0byByZW1vdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlzdCA6OiBBIHBvaW50ZXIgdG8gdGhlIHBhcmVudCBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9MaXN0X1JlbW92ZSggRlRfTGlzdCAgICAgIGxpc3QsCi0gICAgICAgICAgICAgICAgICBGVF9MaXN0Tm9kZSAgbm9kZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9VcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTW92ZSBhIG5vZGUgdG8gdGhlIGhlYWQvdG9wIG9mIGEgbGlzdC4gIFVzZWQgdG8gbWFpbnRhaW4gTFJVICAgICAgICovCi0gIC8qICAgIGxpc3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpc3QgOjogQSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBub2RlIDo6IFRoZSBub2RlIHRvIG1vdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX0xpc3RfVXAoIEZUX0xpc3QgICAgICBsaXN0LAotICAgICAgICAgICAgICBGVF9MaXN0Tm9kZSAgbm9kZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9JdGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gRlRfTGlzdCBpdGVyYXRvciBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBkdXJpbmcgYSBsaXN0IHBhcnNlICAgICovCi0gIC8qICAgIGJ5IEBGVF9MaXN0X0l0ZXJhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5vZGUgOjogVGhlIGN1cnJlbnQgaXRlcmF0aW9uIGxpc3Qgbm9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdXNlciA6OiBBIHR5cGVsZXNzIHBvaW50ZXIgcGFzc2VkIHRvIEBGVF9MaXN0X0l0ZXJhdGUuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgQ2FuIGJlIHVzZWQgdG8gcG9pbnQgdG8gdGhlIGl0ZXJhdGlvbidzIHN0YXRlLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0xpc3RfSXRlcmF0b3IpKCBGVF9MaXN0Tm9kZSAgbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIHVzZXIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfSXRlcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBhcnNlIGEgbGlzdCBhbmQgY2FsbHMgYSBnaXZlbiBpdGVyYXRvciBmdW5jdGlvbiBvbiBlYWNoIGVsZW1lbnQuICAqLwotICAvKiAgICBOb3RlIHRoYXQgcGFyc2luZyBpcyBzdG9wcGVkIGFzIHNvb24gYXMgb25lIG9mIHRoZSBpdGVyYXRvciBjYWxscyAgKi8KLSAgLyogICAgcmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlzdCAgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGl0ZXJhdG9yIDo6IEFuIGl0ZXJhdG9yIGZ1bmN0aW9uLCBjYWxsZWQgb24gZWFjaCBub2RlIG9mIHRoZSBsaXN0LiAqLwotICAvKiAgICB1c2VyICAgICA6OiBBIHVzZXItc3VwcGxpZWQgZmllbGQgdGhhdCBpcyBwYXNzZWQgYXMgdGhlIHNlY29uZCAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgYXJndW1lbnQgdG8gdGhlIGl0ZXJhdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlc3VsdCAoYSBGcmVlVHlwZSBlcnJvciBjb2RlKSBvZiB0aGUgbGFzdCBpdGVyYXRvciBjYWxsLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfTGlzdF9JdGVyYXRlKCBGVF9MaXN0ICAgICAgICAgICBsaXN0LAotICAgICAgICAgICAgICAgICAgIEZUX0xpc3RfSXRlcmF0b3IgIGl0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgIHVzZXIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfRGVzdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIEBGVF9MaXN0IGl0ZXJhdG9yIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGR1cmluZyBhIGxpc3QgICAgICAgICAqLwotICAvKiAgICBmaW5hbGl6YXRpb24gYnkgQEZUX0xpc3RfRmluYWxpemUgdG8gZGVzdHJveSBhbGwgZWxlbWVudHMgaW4gYSAgICAgKi8KLSAgLyogICAgZ2l2ZW4gbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3lzdGVtIDo6IFRoZSBjdXJyZW50IHN5c3RlbSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkYXRhICAgOjogVGhlIGN1cnJlbnQgb2JqZWN0IHRvIGRlc3Ryb3kuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgICA6OiBBIHR5cGVsZXNzIHBvaW50ZXIgcGFzc2VkIHRvIEBGVF9MaXN0X0l0ZXJhdGUuICBJdCBjYW4gICAqLwotICAvKiAgICAgICAgICAgICAgYmUgdXNlZCB0byBwb2ludCB0byB0aGUgaXRlcmF0aW9uJ3Mgc3RhdGUuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX0xpc3RfRGVzdHJ1Y3RvcikoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgIHVzZXIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfRmluYWxpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlc3Ryb3kgYWxsIGVsZW1lbnRzIGluIHRoZSBsaXN0IGFzIHdlbGwgYXMgdGhlIGxpc3QgaXRzZWxmLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpc3QgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVzdHJveSA6OiBBIGxpc3QgZGVzdHJ1Y3RvciB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byBlYWNoIGVsZW1lbnQgICovCi0gIC8qICAgICAgICAgICAgICAgb2YgdGhlIGxpc3QuICBTZXQgdGhpcyB0byBOVUxMIGlmIG5vdCBuZWVkZWQuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICA6OiBUaGUgY3VycmVudCBtZW1vcnkgb2JqZWN0IHRoYXQgaGFuZGxlcyBkZWFsbG9jYXRpb24uICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1c2VyICAgIDo6IEEgdXNlci1zdXBwbGllZCBmaWVsZCB0aGF0IGlzIHBhc3NlZCBhcyB0aGUgbGFzdCAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBhcmd1bWVudCB0byB0aGUgZGVzdHJ1Y3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBleHBlY3RzIHRoYXQgYWxsIG5vZGVzIGFkZGVkIGJ5IEBGVF9MaXN0X0FkZCBvciAgICAgICovCi0gIC8qICAgIEBGVF9MaXN0X0luc2VydCBoYXZlIGJlZW4gZHluYW1pY2FsbHkgYWxsb2NhdGVkLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfTGlzdF9GaW5hbGl6ZSggRlRfTGlzdCAgICAgICAgICAgICBsaXN0LAotICAgICAgICAgICAgICAgICAgICBGVF9MaXN0X0Rlc3RydWN0b3IgIGRlc3Ryb3ksCi0gICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgICAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgIHVzZXIgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRMSVNUX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdGx6dy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdGx6dy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTdjMGM1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRsencuaAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0bHp3LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBMWlctY29tcHJlc3NlZCBzdHJlYW0gc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNCwgMjAwNiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUTFpXX0hfXwotI2RlZmluZSBfX0ZUTFpXX0hfXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbHp3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTFpXIFN0cmVhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNpbmcgTFpXLWNvbXByZXNzZWQgZm9udCBmaWxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBMWlctc3BlY2lmaWMgZnVuY3Rpb25zLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgIEZUX1N0cmVhbV9PcGVuTFpXCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICBPcGVuIGEgbmV3IHN0cmVhbSB0byBwYXJzZSBMWlctY29tcHJlc3NlZCBmb250IGZpbGVzLiAgVGhpcyBpcwotICAqICAgbWFpbmx5IHVzZWQgdG8gc3VwcG9ydCB0aGUgY29tcHJlc3NlZCBgKi5wY2YuWicgZm9udHMgdGhhdCBjb21lCi0gICogICB3aXRoIFhGcmVlODYuCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICBzdHJlYW0gOjogVGhlIHRhcmdldCBlbWJlZGRpbmcgc3RyZWFtLgotICAqCi0gICogICBzb3VyY2UgOjogVGhlIHNvdXJjZSBzdHJlYW0uCi0gICoKLSAgKiBAcmV0dXJuOgotICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgKgotICAqIEBub3RlOgotICAqICAgVGhlIHNvdXJjZSBzdHJlYW0gbXVzdCBiZSBvcGVuZWQgX2JlZm9yZV8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgotICAqCi0gICogICBDYWxsaW5nIHRoZSBpbnRlcm5hbCBmdW5jdGlvbiBgRlRfU3RyZWFtX0Nsb3NlJyBvbiB0aGUgbmV3IHN0cmVhbSB3aWxsCi0gICogICAqbm90KiBjYWxsIGBGVF9TdHJlYW1fQ2xvc2UnIG9uIHRoZSBzb3VyY2Ugc3RyZWFtLiAgTm9uZSBvZiB0aGUgc3RyZWFtCi0gICogICBvYmplY3RzIHdpbGwgYmUgcmVsZWFzZWQgdG8gdGhlIGhlYXAuCi0gICoKLSAgKiAgIFRoZSBzdHJlYW0gaW1wbGVtZW50YXRpb24gaXMgdmVyeSBiYXNpYyBhbmQgcmVzZXRzIHRoZSBkZWNvbXByZXNzaW9uCi0gICogICBwcm9jZXNzIGVhY2ggdGltZSBzZWVraW5nIGJhY2t3YXJkcyBpcyBuZWVkZWQgd2l0aGluIHRoZSBzdHJlYW0KLSAgKgotICAqICAgSW4gY2VydGFpbiBidWlsZHMgb2YgdGhlIGxpYnJhcnksIExaVyBjb21wcmVzc2lvbiByZWNvZ25pdGlvbiBpcwotICAqICAgYXV0b21hdGljYWxseSBoYW5kbGVkIHdoZW4gY2FsbGluZyBARlRfTmV3X0ZhY2Ugb3IgQEZUX09wZW5fRmFjZS4KLSAgKiAgIFRoaXMgbWVhbnMgdGhhdCBpZiBubyBmb250IGRyaXZlciBpcyBjYXBhYmxlIG9mIGhhbmRsaW5nIHRoZSByYXcKLSAgKiAgIGNvbXByZXNzZWQgZmlsZSwgdGhlIGxpYnJhcnkgd2lsbCB0cnkgdG8gb3BlbiBhIExaVyBzdHJlYW0gZnJvbSBpdAotICAqICAgYW5kIHJlLW9wZW4gdGhlIGZhY2Ugd2l0aCBpdC4KLSAgKgotICAqICAgVGhpcyBmdW5jdGlvbiBtYXkgcmV0dXJuIGBGVF9FcnJfVW5pbXBsZW1lbnRlZF9GZWF0dXJlJyBpZiB5b3VyIGJ1aWxkCi0gICogICBvZiBGcmVlVHlwZSB3YXMgbm90IGNvbXBpbGVkIHdpdGggTFpXIHN1cHBvcnQuCi0gICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fT3BlbkxaVyggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHNvdXJjZSApOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVExaV19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRtYWMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRtYWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI4NzRmZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0bWFjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRtYWMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFkZGl0aW9uYWwgTWFjLXNwZWNpZmljIEFQSS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDQsIDIwMDYsIDIwMDcsIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBKdXN0IHZhbiBSb3NzdW0sIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEU6IEluY2x1ZGUgdGhpcyBmaWxlIGFmdGVyIEZUX0ZSRUVUWVBFX0ggYW5kIGFmdGVyIGFueSAgICAgICAgICAgICAgICovCi0vKiAgICAgICBNYWMtc3BlY2lmaWMgaGVhZGVycyAoYmVjYXVzZSB0aGlzIGhlYWRlciB1c2VzIE1hYyB0eXBlcyBzdWNoIGFzICAqLwotLyogICAgICAgSGFuZGxlLCBGU1NwZWMsIEZTUmVmLCBldGMuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVE1BQ19IX18KLSNkZWZpbmUgX19GVE1BQ19IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0vKiBnY2MtMy40LjEgYW5kIGxhdGVyIGNhbiB3YXJuIGFib3V0IGZ1bmN0aW9ucyB0YWdnZWQgYXMgZGVwcmVjYXRlZCAqLwotI2lmbmRlZiBGVF9ERVBSRUNBVEVEX0FUVFJJQlVURQotI2lmIGRlZmluZWQoX19HTlVDX18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBcCi0gICAgKChfX0dOVUNfXyA+PSA0KSB8fCAoKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA+PSAxKSkpCi0jZGVmaW5lIEZUX0RFUFJFQ0FURURfQVRUUklCVVRFICBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSkKLSNlbHNlCi0jZGVmaW5lIEZUX0RFUFJFQ0FURURfQVRUUklCVVRFCi0jZW5kaWYKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWFjX3NwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTWFjIFNwZWNpZmljIEludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT25seSBhdmFpbGFibGUgb24gdGhlIE1hY2ludG9zaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBhcmUgb25seSBhdmFpbGFibGUgaWYgRnJlZVR5cGUgaXMgICAgICAgICovCi0gIC8qICAgIGNvbXBpbGVkIG9uIGEgTWFjaW50b3NoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfRmFjZV9Gcm9tX0ZPTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDcmVhdGUgYSBuZXcgZmFjZSBvYmplY3QgZnJvbSBhIEZPTkQgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5ICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb25kICAgICAgIDo6IEEgRk9ORCByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfaW5kZXggOjogT25seSBzdXBwb3J0ZWQgZm9yIHRoZSAtMSBgc2FuaXR5IGNoZWNrJyBzcGVjaWFsICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGNhc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZmFjZSAgICAgIDo6IEEgaGFuZGxlIHRvIGEgbmV3IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3Rlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBARlRfRmFjZSBvYmplY3RzIGZyb20gZm9udHMgICAgKi8KLSAgLyogICAgdGhhdCBhcmUgaW5zdGFsbGVkIGluIHRoZSBzeXN0ZW0gYXMgZm9sbG93cy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBmb25kID0gR2V0UmVzb3VyY2UoICdGT05EJywgZm9udE5hbWUgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgZXJyb3IgPSBGVF9OZXdfRmFjZV9Gcm9tX0ZPTkQoIGxpYnJhcnksIGZvbmQsIDAsICZmYWNlICk7ICAgICAgICAqLwotICAvKiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9OZXdfRmFjZV9Gcm9tX0ZPTkQoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlICAgICAgZm9uZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgKmFmYWNlICkKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfREVQUkVDQVRFRF9BVFRSSUJVVEU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRGaWxlX0Zyb21fTWFjX05hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gYW4gRlNTcGVjIGZvciB0aGUgZGlzayBmaWxlIGNvbnRhaW5pbmcgdGhlIG5hbWVkIGZvbnQuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb250TmFtZSAgIDo6IE1hYyBPUyBuYW1lIG9mIHRoZSBmb250IChlLmcuLCBUaW1lcyBOZXcgUm9tYW4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBCb2xkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGF0aFNwZWMgICA6OiBGU1NwZWMgdG8gdGhlIGZpbGUuICBGb3IgcGFzc2luZyB0byAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgQEZUX05ld19GYWNlX0Zyb21fRlNTcGVjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCA6OiBJbmRleCBvZiB0aGUgZmFjZS4gIEZvciBwYXNzaW5nIHRvICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgQEZUX05ld19GYWNlX0Zyb21fRlNTcGVjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldEZpbGVfRnJvbV9NYWNfTmFtZSggY29uc3QgY2hhciogIGZvbnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlYyogICAgICBwYXRoU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgZmFjZV9pbmRleCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RFUFJFQ0FURURfQVRUUklCVVRFOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0RmlsZV9Gcm9tX01hY19BVFNfTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIGFuIEZTU3BlYyBmb3IgdGhlIGRpc2sgZmlsZSBjb250YWluaW5nIHRoZSBuYW1lZCBmb250LiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9udE5hbWUgICA6OiBNYWMgT1MgbmFtZSBvZiB0aGUgZm9udCBpbiBBVFMgZnJhbWV3b3JrLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGF0aFNwZWMgICA6OiBGU1NwZWMgdG8gdGhlIGZpbGUuIEZvciBwYXNzaW5nIHRvICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgQEZUX05ld19GYWNlX0Zyb21fRlNTcGVjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCA6OiBJbmRleCBvZiB0aGUgZmFjZS4gRm9yIHBhc3NpbmcgdG8gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgQEZUX05ld19GYWNlX0Zyb21fRlNTcGVjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldEZpbGVfRnJvbV9NYWNfQVRTX05hbWUoIGNvbnN0IGNoYXIqICBmb250TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjKiAgICAgIHBhdGhTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgZmFjZV9pbmRleCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9ERVBSRUNBVEVEX0FUVFJJQlVURTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldEZpbGVQYXRoX0Zyb21fTWFjX0FUU19OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiBhIHBhdGhuYW1lIG9mIHRoZSBkaXNrIGZpbGUgYW5kIGZhY2UgaW5kZXggZm9yIGdpdmVuIGZvbnQgICAqLwotICAvKiAgICBuYW1lIHRoYXQgaXMgaGFuZGxlZCBieSBBVFMgZnJhbWV3b3JrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb250TmFtZSAgICA6OiBNYWMgT1MgbmFtZSBvZiB0aGUgZm9udCBpbiBBVFMgZnJhbWV3b3JrLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYXRoICAgICAgICA6OiBCdWZmZXIgdG8gc3RvcmUgcGF0aG5hbWUgb2YgdGhlIGZpbGUuICBGb3IgcGFzc2luZyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgdG8gQEZUX05ld19GYWNlLiAgVGhlIGNsaWVudCBtdXN0IGFsbG9jYXRlIHRoaXMgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4UGF0aFNpemUgOjogTGVuZ3RocyBvZiB0aGUgYnVmZmVyIGBwYXRoJyB0aGF0IGNsaWVudCBhbGxvY2F0ZWQuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2luZGV4ICA6OiBJbmRleCBvZiB0aGUgZmFjZS4gIEZvciBwYXNzaW5nIHRvIEBGVF9OZXdfRmFjZS4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRGaWxlUGF0aF9Gcm9tX01hY19BVFNfTmFtZSggY29uc3QgY2hhciogIGZvbnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDgqICAgICAgIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIgICAgICAgbWF4UGF0aFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgZmFjZV9pbmRleCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfREVQUkVDQVRFRF9BVFRSSUJVVEU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDcmVhdGUgYSBuZXcgZmFjZSBvYmplY3QgZnJvbSBhIGdpdmVuIHJlc291cmNlIGFuZCB0eXBlZmFjZSBpbmRleCAgKi8KLSAgLyogICAgdXNpbmcgYW4gRlNTcGVjIHRvIHRoZSBmb250IGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgICA6OiBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3BlYyAgICAgICA6OiBGU1NwZWMgdG8gdGhlIGZvbnQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgZmFjZSB3aXRoaW4gdGhlIHJlc291cmNlLiAgVGhlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBmaXJzdCBmYWNlIGhhcyBpbmRleH4wLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZmFjZSAgICAgIDo6IEEgaGFuZGxlIHRvIGEgbmV3IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfTmV3X0ZhY2VfRnJvbV9GU1NwZWMgaXMgaWRlbnRpY2FsIHRvIEBGVF9OZXdfRmFjZSBleGNlcHQgICAgICAgKi8KLSAgLyogICAgaXQgYWNjZXB0cyBhbiBGU1NwZWMgaW5zdGVhZCBvZiBhIHBhdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfTmV3X0ZhY2VfRnJvbV9GU1NwZWMoIEZUX0xpYnJhcnkgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGU1NwZWMgICpzcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgKmFmYWNlICkKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9ERVBSRUNBVEVEX0FUVFJJQlVURTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX05ld19GYWNlX0Zyb21fRlNSZWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENyZWF0ZSBhIG5ldyBmYWNlIG9iamVjdCBmcm9tIGEgZ2l2ZW4gcmVzb3VyY2UgYW5kIHR5cGVmYWNlIGluZGV4ICAqLwotICAvKiAgICB1c2luZyBhbiBGU1JlZiB0byB0aGUgZm9udCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5ICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzcGVjICAgICAgIDo6IEZTUmVmIHRvIHRoZSBmb250IGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfaW5kZXggOjogVGhlIGluZGV4IG9mIHRoZSBmYWNlIHdpdGhpbiB0aGUgcmVzb3VyY2UuICBUaGUgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGZpcnN0IGZhY2UgaGFzIGluZGV4fjAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFmYWNlICAgICAgOjogQSBoYW5kbGUgdG8gYSBuZXcgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9OZXdfRmFjZV9Gcm9tX0ZTUmVmIGlzIGlkZW50aWNhbCB0byBARlRfTmV3X0ZhY2UgZXhjZXB0ICAgICAgICAqLwotICAvKiAgICBpdCBhY2NlcHRzIGFuIEZTUmVmIGluc3RlYWQgb2YgYSBwYXRoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9OZXdfRmFjZV9Gcm9tX0ZTUmVmKCBGVF9MaWJyYXJ5ICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZTUmVmICAqcmVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAqYWZhY2UgKQotICAgICAgICAgICAgICAgICAgICAgICAgRlRfREVQUkVDQVRFRF9BVFRSSUJVVEU7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIF9fRlRNQUNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0bW0uaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRtbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGNmZDY3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRtbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0bW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBNdWx0aXBsZSBNYXN0ZXIgZm9udCBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAzLCAyMDA0LCAyMDA2LCAyMDA5LCAyMDEzIGJ5ICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUTU1fSF9fCi0jZGVmaW5lIF9fRlRNTV9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX1RZUEUxX1RBQkxFU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtdWx0aXBsZV9tYXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBNdWx0aXBsZSBNYXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBIb3cgdG8gbWFuYWdlIE11bHRpcGxlIE1hc3RlcnMgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZm9sbG93aW5nIHR5cGVzIGFuZCBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gbWFuYWdlIE11bHRpcGxlICAgICAgKi8KLSAgLyogICAgTWFzdGVyIGZvbnRzLCBpLmUuLCB0aGUgc2VsZWN0aW9uIG9mIHNwZWNpZmljIGRlc2lnbiBpbnN0YW5jZXMgYnkgICovCi0gIC8qICAgIHNldHRpbmcgZGVzaWduIGF4aXMgY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR2VvcmdlIFdpbGxpYW1zIGhhcyBleHRlbmRlZCB0aGlzIGludGVyZmFjZSB0byBtYWtlIGl0IHdvcmsgd2l0aCAgICovCi0gIC8qICAgIGJvdGggVHlwZX4xIE11bHRpcGxlIE1hc3RlcnMgZm9udHMgYW5kIEdYIGRpc3RvcnRhYmxlICh2YXIpICAgICAgICAqLwotICAvKiAgICBmb250cy4gIFNvbWUgb2YgdGhlc2Ugcm91dGluZXMgb25seSB3b3JrIHdpdGggTU0gZm9udHMsIG90aGVycyAgICAgKi8KLSAgLyogICAgd2lsbCB3b3JrIHdpdGggYm90aCB0eXBlcy4gIFRoZXkgYXJlIHNpbWlsYXIgZW5vdWdoIHRoYXQgYSAgICAgICAgICovCi0gIC8qICAgIGNvbnNpc3RlbnQgaW50ZXJmYWNlIG1ha2VzIHNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NTV9BeGlzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNpbXBsZSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIGdpdmVuIGF4aXMgaW4gZGVzaWduIHNwYWNlIGZvciAgKi8KLSAgLyogICAgTXVsdGlwbGUgTWFzdGVycyBmb250cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHN0cnVjdHVyZSBjYW4ndCBiZSB1c2VkIGZvciBHWCB2YXIgZm9udHMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuYW1lICAgIDo6IFRoZSBheGlzJ3MgbmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1pbmltdW0gOjogVGhlIGF4aXMncyBtaW5pbXVtIGRlc2lnbiBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4aW11bSA6OiBUaGUgYXhpcydzIG1heGltdW0gZGVzaWduIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfTU1fQXhpc18KLSAgewotICAgIEZUX1N0cmluZyogIG5hbWU7Ci0gICAgRlRfTG9uZyAgICAgbWluaW11bTsKLSAgICBGVF9Mb25nICAgICBtYXhpbXVtOwotCi0gIH0gRlRfTU1fQXhpczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX011bHRpX01hc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgdGhlIGF4ZXMgYW5kIHNwYWNlIG9mIGEgTXVsdGlwbGUgTWFzdGVycyAqLwotICAvKiAgICBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIGNhbid0IGJlIHVzZWQgZm9yIEdYIHZhciBmb250cy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9heGlzICAgIDo6IE51bWJlciBvZiBheGVzLiAgQ2Fubm90IGV4Y2VlZH40LiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2Rlc2lnbnMgOjogTnVtYmVyIG9mIGRlc2lnbnM7IHNob3VsZCBiZSBub3JtYWxseSAyXm51bV9heGlzICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGV2ZW4gdGhvdWdoIHRoZSBUeXBlfjEgc3BlY2lmaWNhdGlvbiBzdHJhbmdlbHkgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBhbGxvd3MgZm9yIGludGVybWVkaWF0ZSBkZXNpZ25zIHRvIGJlIHByZXNlbnQuIFRoaXMgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgbnVtYmVyIGNhbm5vdCBleGNlZWR+MTYuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBheGlzICAgICAgICA6OiBBIHRhYmxlIG9mIGF4aXMgZGVzY3JpcHRvcnMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9NdWx0aV9NYXN0ZXJfCi0gIHsKLSAgICBGVF9VSW50ICAgICBudW1fYXhpczsKLSAgICBGVF9VSW50ICAgICBudW1fZGVzaWduczsKLSAgICBGVF9NTV9BeGlzICBheGlzW1QxX01BWF9NTV9BWElTXTsKLQotICB9IEZUX011bHRpX01hc3RlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Zhcl9BeGlzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgZ2l2ZW4gYXhpcyBpbiBkZXNpZ24gc3BhY2UgZm9yICAqLwotICAvKiAgICBNdWx0aXBsZSBNYXN0ZXJzIGFuZCBHWCB2YXIgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuYW1lICAgIDo6IFRoZSBheGlzJ3MgbmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBOb3QgYWx3YXlzIG1lYW5pbmdmdWwgZm9yIEdYLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtaW5pbXVtIDo6IFRoZSBheGlzJ3MgbWluaW11bSBkZXNpZ24gY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlZiAgICAgOjogVGhlIGF4aXMncyBkZWZhdWx0IGRlc2lnbiBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIEZyZWVUeXBlIGNvbXB1dGVzIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZXMgZm9yIE1NOyBpdCAgKi8KLSAgLyogICAgICAgICAgICAgICBpcyB0aGVuIGFuIGludGVnZXIgdmFsdWUsIG5vdCBpbiAxNi4xNiBmb3JtYXQuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhpbXVtIDo6IFRoZSBheGlzJ3MgbWF4aW11bSBkZXNpZ24gY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhZyAgICAgOjogVGhlIGF4aXMncyB0YWcgKHRoZSBHWCBlcXVpdmFsZW50IHRvIGBuYW1lJykuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIEZyZWVUeXBlIHByb3ZpZGVzIGRlZmF1bHQgdmFsdWVzIGZvciBNTSBpZiBwb3NzaWJsZS4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmlkICAgOjogVGhlIGVudHJ5IGluIGBuYW1lJyB0YWJsZSAoYW5vdGhlciBHWCB2ZXJzaW9uIG9mICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIGBuYW1lJykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBOb3QgbWVhbmluZ2Z1bCBmb3IgTU0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfVmFyX0F4aXNfCi0gIHsKLSAgICBGVF9TdHJpbmcqICBuYW1lOwotCi0gICAgRlRfRml4ZWQgICAgbWluaW11bTsKLSAgICBGVF9GaXhlZCAgICBkZWY7Ci0gICAgRlRfRml4ZWQgICAgbWF4aW11bTsKLQotICAgIEZUX1VMb25nICAgIHRhZzsKLSAgICBGVF9VSW50ICAgICBzdHJpZDsKLQotICB9IEZUX1Zhcl9BeGlzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVmFyX05hbWVkX1N0eWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzaW1wbGUgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBuYW1lZCBzdHlsZSBpbiBhIEdYIHZhciBmb250LiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHN0cnVjdHVyZSBjYW4ndCBiZSB1c2VkIGZvciBNTSBmb250cy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb29yZHMgOjogVGhlIGRlc2lnbiBjb29yZGluYXRlcyBmb3IgdGhpcyBzdHlsZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIFRoaXMgaXMgYW4gYXJyYXkgd2l0aCBvbmUgZW50cnkgZm9yIGVhY2ggYXhpcy4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJpZCAgOjogVGhlIGVudHJ5IGluIGBuYW1lJyB0YWJsZSBpZGVudGlmeWluZyB0aGlzIHN0eWxlLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9WYXJfTmFtZWRfU3R5bGVfCi0gIHsKLSAgICBGVF9GaXhlZCogIGNvb3JkczsKLSAgICBGVF9VSW50ICAgIHN0cmlkOwotCi0gIH0gRlRfVmFyX05hbWVkX1N0eWxlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTU1fVmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCB0aGUgYXhlcyBhbmQgc3BhY2Ugb2YgYSBNdWx0aXBsZSBNYXN0ZXJzICovCi0gIC8qICAgIG9yIEdYIHZhciBkaXN0b3J0YWJsZSBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU29tZSBmaWVsZHMgYXJlIHNwZWNpZmljIHRvIG9uZSBmb3JtYXQgYW5kIG5vdCB0byB0aGUgb3RoZXIuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2F4aXMgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgYXhlcy4gIFRoZSBtYXhpbXVtIHZhbHVlIGlzfjQgZm9yICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBNTTsgbm8gbGltaXQgaW4gR1guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2Rlc2lnbnMgICAgIDo6IFRoZSBudW1iZXIgb2YgZGVzaWduczsgc2hvdWxkIGJlIG5vcm1hbGx5ICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAyXm51bV9heGlzIGZvciBNTSBmb250cy4gIE5vdCBtZWFuaW5nZnVsIGZvciBHWCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgKHdoZXJlIGV2ZXJ5IGdseXBoIGNvdWxkIGhhdmUgYSBkaWZmZXJlbnQgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBkZXNpZ25zKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fbmFtZWRzdHlsZXMgOjogVGhlIG51bWJlciBvZiBuYW1lZCBzdHlsZXM7IG9ubHkgbWVhbmluZ2Z1bCBmb3IgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIEdYIHRoYXQgYWxsb3dzIGNlcnRhaW4gZGVzaWduIGNvb3JkaW5hdGVzIHRvICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBoYXZlIGEgc3RyaW5nIElEIChpbiB0aGUgYG5hbWUnIHRhYmxlKSAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZW0uICBUaGUgZm9udCBjYW4gdGVsbCB0aGUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIHVzZXIgdGhhdCwgZm9yIGV4YW1wbGUsIFdlaWdodD0xLjUgaXMgYEJvbGQnLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBheGlzICAgICAgICAgICAgOjogQSB0YWJsZSBvZiBheGlzIGRlc2NyaXB0b3JzLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIEdYIGZvbnRzIGNvbnRhaW4gc2xpZ2h0bHkgbW9yZSBkYXRhIHRoYW4gTU0uICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuYW1lZHN0eWxlcyAgICAgOjogQSB0YWJsZSBvZiBuYW1lZCBzdHlsZXMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIE9ubHkgbWVhbmluZ2Z1bCB3aXRoIEdYLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfTU1fVmFyXwotICB7Ci0gICAgRlRfVUludCAgICAgICAgICAgICAgbnVtX2F4aXM7Ci0gICAgRlRfVUludCAgICAgICAgICAgICAgbnVtX2Rlc2lnbnM7Ci0gICAgRlRfVUludCAgICAgICAgICAgICAgbnVtX25hbWVkc3R5bGVzOwotICAgIEZUX1Zhcl9BeGlzKiAgICAgICAgIGF4aXM7Ci0gICAgRlRfVmFyX05hbWVkX1N0eWxlKiAgbmFtZWRzdHlsZTsKLQotICB9IEZUX01NX1ZhcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9NdWx0aV9NYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHJpZXZlIHRoZSBNdWx0aXBsZSBNYXN0ZXIgZGVzY3JpcHRvciBvZiBhIGdpdmVuIGZvbnQuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBjYW4ndCBiZSB1c2VkIHdpdGggR1ggZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYW1hc3RlciA6OiBUaGUgTXVsdGlwbGUgTWFzdGVycyBkZXNjcmlwdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X011bHRpX01hc3RlciggRlRfRmFjZSAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsdGlfTWFzdGVyICAqYW1hc3RlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X01NX1ZhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmUgdGhlIE11bHRpcGxlIE1hc3Rlci9HWCB2YXIgZGVzY3JpcHRvciBvZiBhIGdpdmVuIGZvbnQuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYW1hc3RlciA6OiBUaGUgTXVsdGlwbGUgTWFzdGVycy9HWCB2YXIgZGVzY3JpcHRvci4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgQWxsb2NhdGVzIGEgZGF0YSBzdHJ1Y3R1cmUsIHdoaWNoIHRoZSB1c2VyIG11c3QgZnJlZS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9NTV9WYXIoIEZUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICBGVF9NTV9WYXIqICAqYW1hc3RlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X01NX0Rlc2lnbl9Db29yZGluYXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRm9yIE11bHRpcGxlIE1hc3RlcnMgZm9udHMsIGNob29zZSBhbiBpbnRlcnBvbGF0ZWQgZm9udCBkZXNpZ24gICAgICovCi0gIC8qICAgIHRocm91Z2ggZGVzaWduIGNvb3JkaW5hdGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBjYW4ndCBiZSB1c2VkIHdpdGggR1ggZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2Nvb3JkcyA6OiBUaGUgbnVtYmVyIG9mIGRlc2lnbiBjb29yZGluYXRlcyAobXVzdCBiZSBlcXVhbCB0byAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgdGhlIG51bWJlciBvZiBheGVzIGluIHRoZSBmb250KS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29vcmRzICAgICA6OiBBbiBhcnJheSBvZiBkZXNpZ24gY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU2V0X01NX0Rlc2lnbl9Db29yZGluYXRlcyggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgY29vcmRzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfVmFyX0Rlc2lnbl9Db29yZGluYXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGb3IgTXVsdGlwbGUgTWFzdGVyIG9yIEdYIFZhciBmb250cywgY2hvb3NlIGFuIGludGVycG9sYXRlZCBmb250ICAgKi8KLSAgLyogICAgZGVzaWduIHRocm91Z2ggZGVzaWduIGNvb3JkaW5hdGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2Nvb3JkcyA6OiBUaGUgbnVtYmVyIG9mIGRlc2lnbiBjb29yZGluYXRlcyAobXVzdCBiZSBlcXVhbCB0byAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgdGhlIG51bWJlciBvZiBheGVzIGluIHRoZSBmb250KS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29vcmRzICAgICA6OiBBbiBhcnJheSBvZiBkZXNpZ24gY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU2V0X1Zhcl9EZXNpZ25fQ29vcmRpbmF0ZXMoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfTU1fQmxlbmRfQ29vcmRpbmF0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGb3IgTXVsdGlwbGUgTWFzdGVycyBhbmQgR1ggdmFyIGZvbnRzLCBjaG9vc2UgYW4gaW50ZXJwb2xhdGVkIGZvbnQgKi8KLSAgLyogICAgZGVzaWduIHRocm91Z2ggbm9ybWFsaXplZCBibGVuZCBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2Nvb3JkcyA6OiBUaGUgbnVtYmVyIG9mIGRlc2lnbiBjb29yZGluYXRlcyAobXVzdCBiZSBlcXVhbCB0byAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgdGhlIG51bWJlciBvZiBheGVzIGluIHRoZSBmb250KS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29vcmRzICAgICA6OiBUaGUgZGVzaWduIGNvb3JkaW5hdGVzIGFycmF5IChlYWNoIGVsZW1lbnQgbXVzdCBiZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgYmV0d2VlbiAwIGFuZCAxLjApLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1NldF9NTV9CbGVuZF9Db29yZGluYXRlcyggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X1Zhcl9CbGVuZF9Db29yZGluYXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBpcyBhbm90aGVyIG5hbWUgb2YgQEZUX1NldF9NTV9CbGVuZF9Db29yZGluYXRlcy4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU2V0X1Zhcl9CbGVuZF9Db29yZGluYXRlcyggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICk7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUTU1fSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0bW9kYXBpLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0bW9kYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MGYxNWQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdG1vZGFwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0bW9kYXBpLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBtb2R1bGVzIHB1YmxpYyBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAzLCAyMDA2LCAyMDA4LTIwMTAsIDIwMTIsIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUTU9EQVBJX0hfXwotI2RlZmluZSBfX0ZUTU9EQVBJX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZV9tYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE1vZHVsZSBNYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEhvdyB0byBhZGQsIHVwZ3JhZGUsIHJlbW92ZSwgYW5kIGNvbnRyb2wgbW9kdWxlcyBmcm9tIEZyZWVUeXBlLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBkZWZpbml0aW9ucyBiZWxvdyBhcmUgdXNlZCB0byBtYW5hZ2UgbW9kdWxlcyB3aXRoaW4gRnJlZVR5cGUuICAqLwotICAvKiAgICBNb2R1bGVzIGNhbiBiZSBhZGRlZCwgdXBncmFkZWQsIGFuZCByZW1vdmVkIGF0IHJ1bnRpbWUuICAgICAgICAgICAgKi8KLSAgLyogICAgQWRkaXRpb25hbGx5LCBzb21lIG1vZHVsZSBwcm9wZXJ0aWVzIGNhbiBiZSBjb250cm9sbGVkIGFsc28uICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBIZXJlIGlzIGEgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGBtb2R1bGVfbmFtZScgZmllbGQgaW4gICAgKi8KLSAgLyogICAgdGhlIEBGVF9Nb2R1bGVfQ2xhc3Mgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBhdXRvZml0dGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgYmRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGNmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBneHZhbGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgb3R2YWxpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHBjZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBwZnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgcHNhdXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHBzaGludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBwc25hbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgcmFzdGVyMSwgcmFzdGVyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHNmbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBzbW9vdGgsIHNtb290aC1sY2QsIHNtb290aC1sY2R2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgdHJ1ZXR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHR5cGUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB0eXBlNDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgdDFjaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHdpbmZvbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3RlIHRoYXQgdGhlIEZyZWVUeXBlIENhY2hlIHN1Yi1zeXN0ZW0gaXMgbm90IGEgRnJlZVR5cGUgbW9kdWxlLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPcmRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Nb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTW9kdWxlX0NvbnN0cnVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01vZHVsZV9EZXN0cnVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Nb2R1bGVfUmVxdWVzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTW9kdWxlX0NsYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BZGRfTW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X01vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlbW92ZV9Nb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BZGRfRGVmYXVsdF9Nb2R1bGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Byb3BlcnR5X1NldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Qcm9wZXJ0eV9HZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX05ld19MaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Eb25lX0xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmVmZXJlbmNlX0xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SZW5kZXJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmVuZGVyZXJfQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfUmVuZGVyZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X1JlbmRlcmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfRGVidWdfSG9vayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogbW9kdWxlIGJpdCBmbGFncyAqLwotI2RlZmluZSBGVF9NT0RVTEVfRk9OVF9EUklWRVIgICAgICAgICAxICAvKiB0aGlzIG1vZHVsZSBpcyBhIGZvbnQgZHJpdmVyICAqLwotI2RlZmluZSBGVF9NT0RVTEVfUkVOREVSRVIgICAgICAgICAgICAyICAvKiB0aGlzIG1vZHVsZSBpcyBhIHJlbmRlcmVyICAgICAqLwotI2RlZmluZSBGVF9NT0RVTEVfSElOVEVSICAgICAgICAgICAgICA0ICAvKiB0aGlzIG1vZHVsZSBpcyBhIGdseXBoIGhpbnRlciAqLwotI2RlZmluZSBGVF9NT0RVTEVfU1RZTEVSICAgICAgICAgICAgICA4ICAvKiB0aGlzIG1vZHVsZSBpcyBhIHN0eWxlciAgICAgICAqLwotCi0jZGVmaW5lIEZUX01PRFVMRV9EUklWRVJfU0NBTEFCTEUgICAgIDB4MTAwICAgLyogdGhlIGRyaXZlciBzdXBwb3J0cyAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGFibGUgZm9udHMgICAgICAgICAgICovCi0jZGVmaW5lIEZUX01PRFVMRV9EUklWRVJfTk9fT1VUTElORVMgIDB4MjAwICAgLyogdGhlIGRyaXZlciBkb2VzIG5vdCAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VwcG9ydCB2ZWN0b3Igb3V0bGluZXMgICovCi0jZGVmaW5lIEZUX01PRFVMRV9EUklWRVJfSEFTX0hJTlRFUiAgIDB4NDAwICAgLyogdGhlIGRyaXZlciBwcm92aWRlcyBpdHMgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3duIGhpbnRlciAgICAgICAgICAgICAgICovCi0KLQotICAvKiBkZXByZWNhdGVkIHZhbHVlcyAqLwotI2RlZmluZSBmdF9tb2R1bGVfZm9udF9kcml2ZXIgICAgICAgICBGVF9NT0RVTEVfRk9OVF9EUklWRVIKLSNkZWZpbmUgZnRfbW9kdWxlX3JlbmRlcmVyICAgICAgICAgICAgRlRfTU9EVUxFX1JFTkRFUkVSCi0jZGVmaW5lIGZ0X21vZHVsZV9oaW50ZXIgICAgICAgICAgICAgIEZUX01PRFVMRV9ISU5URVIKLSNkZWZpbmUgZnRfbW9kdWxlX3N0eWxlciAgICAgICAgICAgICAgRlRfTU9EVUxFX1NUWUxFUgotCi0jZGVmaW5lIGZ0X21vZHVsZV9kcml2ZXJfc2NhbGFibGUgICAgIEZUX01PRFVMRV9EUklWRVJfU0NBTEFCTEUKLSNkZWZpbmUgZnRfbW9kdWxlX2RyaXZlcl9ub19vdXRsaW5lcyAgRlRfTU9EVUxFX0RSSVZFUl9OT19PVVRMSU5FUwotI2RlZmluZSBmdF9tb2R1bGVfZHJpdmVyX2hhc19oaW50ZXIgICBGVF9NT0RVTEVfRFJJVkVSX0hBU19ISU5URVIKLQotCi0gIHR5cGVkZWYgRlRfUG9pbnRlciAgRlRfTW9kdWxlX0ludGVyZmFjZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01vZHVsZV9Db25zdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBpbml0aWFsaXplIChub3QgY3JlYXRlKSBhIG5ldyBtb2R1bGUgb2JqZWN0LiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZSA6OiBUaGUgbW9kdWxlIHRvIGluaXRpYWxpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX01vZHVsZV9Db25zdHJ1Y3RvcikoIEZUX01vZHVsZSAgbW9kdWxlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Nb2R1bGVfRGVzdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gZmluYWxpemUgKG5vdCBkZXN0cm95KSBhIGdpdmVuIG1vZHVsZSBvYmplY3QuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGUgOjogVGhlIG1vZHVsZSB0byBmaW5hbGl6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX01vZHVsZV9EZXN0cnVjdG9yKSggRlRfTW9kdWxlICBtb2R1bGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01vZHVsZV9SZXF1ZXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBxdWVyeSBhIGdpdmVuIG1vZHVsZSBmb3IgYSBzcGVjaWZpYyBpbnRlcmZhY2UuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZSA6OiBUaGUgbW9kdWxlIHRvIGJlIHNlYXJjaGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmFtZSA6OiAgIFRoZSBuYW1lIG9mIHRoZSBpbnRlcmZhY2UgaW4gdGhlIG1vZHVsZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX01vZHVsZV9JbnRlcmZhY2UKLSAgKCpGVF9Nb2R1bGVfUmVxdWVzdGVyKSggRlRfTW9kdWxlICAgIG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIG5hbWUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01vZHVsZV9DbGFzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBtb2R1bGUgY2xhc3MgZGVzY3JpcHRvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZV9mbGFncyAgICA6OiBCaXQgZmxhZ3MgZGVzY3JpYmluZyB0aGUgbW9kdWxlLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlX3NpemUgICAgIDo6IFRoZSBzaXplIG9mIG9uZSBtb2R1bGUgb2JqZWN0L2luc3RhbmNlIGluICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlX25hbWUgICAgIDo6IFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGVfdmVyc2lvbiAgOjogVGhlIHZlcnNpb24sIGFzIGEgMTYuMTYgZml4ZWQgbnVtYmVyICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIChtYWpvci5taW5vcikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGVfcmVxdWlyZXMgOjogVGhlIHZlcnNpb24gb2YgRnJlZVR5cGUgdGhpcyBtb2R1bGUgcmVxdWlyZXMsICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIGFzIGEgMTYuMTYgZml4ZWQgbnVtYmVyIChtYWpvci5taW5vcikuICBTdGFydHMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBhdCB2ZXJzaW9uIDIuMCwgaS5lLiwgMHgyMDAwMC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlX2luaXQgICAgIDo6IFRoZSBpbml0aWFsaXppbmcgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGVfZG9uZSAgICAgOjogVGhlIGZpbmFsaXppbmcgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdldF9pbnRlcmZhY2UgICA6OiBUaGUgaW50ZXJmYWNlIHJlcXVlc3RpbmcgZnVuY3Rpb24uICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX01vZHVsZV9DbGFzc18KLSAgewotICAgIEZUX1VMb25nICAgICAgICAgICAgICAgbW9kdWxlX2ZsYWdzOwotICAgIEZUX0xvbmcgICAgICAgICAgICAgICAgbW9kdWxlX3NpemU7Ci0gICAgY29uc3QgRlRfU3RyaW5nKiAgICAgICBtb2R1bGVfbmFtZTsKLSAgICBGVF9GaXhlZCAgICAgICAgICAgICAgIG1vZHVsZV92ZXJzaW9uOwotICAgIEZUX0ZpeGVkICAgICAgICAgICAgICAgbW9kdWxlX3JlcXVpcmVzOwotCi0gICAgY29uc3Qgdm9pZCogICAgICAgICAgICBtb2R1bGVfaW50ZXJmYWNlOwotCi0gICAgRlRfTW9kdWxlX0NvbnN0cnVjdG9yICBtb2R1bGVfaW5pdDsKLSAgICBGVF9Nb2R1bGVfRGVzdHJ1Y3RvciAgIG1vZHVsZV9kb25lOwotICAgIEZUX01vZHVsZV9SZXF1ZXN0ZXIgICAgZ2V0X2ludGVyZmFjZTsKLQotICB9IEZUX01vZHVsZV9DbGFzczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0FkZF9Nb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFkZCBhIG5ldyBtb2R1bGUgdG8gYSBnaXZlbiBsaWJyYXJ5IGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNsYXp6ICAgOjogQSBwb2ludGVyIHRvIGNsYXNzIGRlc2NyaXB0b3IgZm9yIHRoZSBtb2R1bGUuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBtb2R1bGUgYWxyZWFkeSBleGlzdHMgYnkgdGhhdCBuYW1lLCAqLwotICAvKiAgICBvciBpZiB0aGUgbW9kdWxlIHJlcXVpcmVzIGEgdmVyc2lvbiBvZiBGcmVlVHlwZSB0aGF0IGlzIHRvbyBncmVhdC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9BZGRfTW9kdWxlKCBGVF9MaWJyYXJ5ICAgICAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICBjb25zdCBGVF9Nb2R1bGVfQ2xhc3MqICBjbGF6eiApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X01vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRmluZCBhIG1vZHVsZSBieSBpdHMgbmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGVfbmFtZSA6OiBUaGUgbW9kdWxlJ3MgbmFtZSAoYXMgYW4gQVNDSUkgc3RyaW5nKS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIG1vZHVsZSBoYW5kbGUuICAwfmlmIG5vbmUgd2FzIGZvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSdzIGludGVybmFsIG1vZHVsZXMgYXJlbid0IGRvY3VtZW50ZWQgdmVyeSB3ZWxsLCBhbmQgeW91ICAgKi8KLSAgLyogICAgc2hvdWxkIGxvb2sgdXAgdGhlIHNvdXJjZSBjb2RlIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX01vZHVsZSApCi0gIEZUX0dldF9Nb2R1bGUoIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgbW9kdWxlX25hbWUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlbW92ZV9Nb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlbW92ZSBhIGdpdmVuIG1vZHVsZSBmcm9tIGEgbGlicmFyeSBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gYSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZSAgOjogQSBoYW5kbGUgdG8gYSBtb2R1bGUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBtb2R1bGUgb2JqZWN0IGlzIGRlc3Ryb3llZCBieSB0aGUgZnVuY3Rpb24gaW4gY2FzZSBvZiBzdWNjZXNzLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1JlbW92ZV9Nb2R1bGUoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgIEZUX01vZHVsZSAgIG1vZHVsZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgICBGVF9Qcm9wZXJ0eV9TZXQKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICBTZXQgYSBwcm9wZXJ0eSBmb3IgYSBnaXZlbiBtb2R1bGUuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICAgbGlicmFyeSA6OgotICAgKiAgICAgICBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSB0aGUgbW9kdWxlIGlzIHBhcnQgb2YuCi0gICAqCi0gICAqICAgIG1vZHVsZV9uYW1lIDo6Ci0gICAqICAgICAgIFRoZSBtb2R1bGUgbmFtZS4KLSAgICoKLSAgICogICAgcHJvcGVydHlfbmFtZSA6OgotICAgKiAgICAgICBUaGUgcHJvcGVydHkgbmFtZS4gIFByb3BlcnRpZXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgYFN5bm9wc2lzJwotICAgKiAgICAgICBzdWJzZWN0aW9uIG9mIHRoZSBtb2R1bGUncyBkb2N1bWVudGF0aW9uLgotICAgKgotICAgKiAgICAgICBOb3RlIHRoYXQgb25seSBhIGZldyBtb2R1bGVzIGhhdmUgcHJvcGVydGllcy4KLSAgICoKLSAgICogICAgdmFsdWUgOjoKLSAgICogICAgICAgQSBnZW5lcmljIHBvaW50ZXIgdG8gYSB2YXJpYWJsZSBvciBzdHJ1Y3R1cmUgdGhhdCBnaXZlcyB0aGUgbmV3Ci0gICAqICAgICAgIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4gIFRoZSBleGFjdCBkZWZpbml0aW9uIG9mIGB2YWx1ZScgaXMKLSAgICogICAgICAgZGVwZW5kZW50IG9uIHRoZSBwcm9wZXJ0eTsgc2VlIHRoZSBgU3lub3BzaXMnIHN1YnNlY3Rpb24gb2YgdGhlCi0gICAqICAgICAgIG1vZHVsZSdzIGRvY3VtZW50YXRpb24uCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgIElmIGBtb2R1bGVfbmFtZScgaXNuJ3QgYSB2YWxpZCBtb2R1bGUgbmFtZSwgb3IgYHByb3BlcnR5X25hbWUnCi0gICAqICAgIGRvZXNuJ3Qgc3BlY2lmeSBhIHZhbGlkIHByb3BlcnR5LCBvciBpZiBgdmFsdWUnIGRvZXNuJ3QgcmVwcmVzZW50IGEKLSAgICogICAgdmFsaWQgdmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eSwgYW4gZXJyb3IgaXMgcmV0dXJuZWQuCi0gICAqCi0gICAqICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzZXRzIHByb3BlcnR5IGBiYXInIChhIHNpbXBsZSBpbnRlZ2VyKSBpbgotICAgKiAgICBtb2R1bGUgYGZvbycgdG8gdmFsdWV+MS4KLSAgICoKLSAgICogICAgewotICAgKiAgICAgIEZUX1VJbnQgIGJhcjsKLSAgICoKLSAgICoKLSAgICogICAgICBiYXIgPSAxOwotICAgKiAgICAgIEZUX1Byb3BlcnR5X1NldCggbGlicmFyeSwgImZvbyIsICJiYXIiLCAmYmFyICk7Ci0gICAqICAgIH0KLSAgICoKLSAgICogICAgTm90ZSB0aGF0IHRoZSBGcmVlVHlwZSBDYWNoZSBzdWItc3lzdGVtIGRvZXNuJ3QgcmVjb2duaXplIG1vZHVsZQotICAgKiAgICBwcm9wZXJ0eSBjaGFuZ2VzLiAgVG8gYXZvaWQgZ2x5cGggbG9va3VwIGNvbmZ1c2lvbiB3aXRoaW4gdGhlIGNhY2hlCi0gICAqICAgIHlvdSBzaG91bGQgY2FsbCBARlRDX01hbmFnZXJfUmVzZXQgdG8gY29tcGxldGVseSBmbHVzaCB0aGUgY2FjaGUgaWYKLSAgICogICAgYSBtb2R1bGUgcHJvcGVydHkgZ2V0cyBjaGFuZ2VkIGFmdGVyIEBGVENfTWFuYWdlcl9OZXcgaGFzIGJlZW4KLSAgICogICAgY2FsbGVkLgotICAgKgotICAgKiAgICBJdCBpcyBub3QgcG9zc2libGUgdG8gc2V0IHByb3BlcnRpZXMgb2YgdGhlIEZyZWVUeXBlIENhY2hlCi0gICAqICAgIHN1Yi1zeXN0ZW0gaXRzZWxmIHdpdGggRlRfUHJvcGVydHlfU2V0OyB1c2UgQEZUQ19Qcm9wZXJ0eV9TZXQKLSAgICogICAgaW5zdGVhZC4KLSAgICoKLSAgICogIEBzaW5jZToKLSAgICogICAgMi40LjExCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfUHJvcGVydHlfU2V0KCBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIG1vZHVsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIHByb3BlcnR5X25hbWUsCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogICAgICAgdmFsdWUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICAgRlRfUHJvcGVydHlfR2V0Ci0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICAgR2V0IGEgbW9kdWxlJ3MgcHJvcGVydHkgdmFsdWUuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICAgbGlicmFyeSA6OgotICAgKiAgICAgICBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSB0aGUgbW9kdWxlIGlzIHBhcnQgb2YuCi0gICAqCi0gICAqICAgIG1vZHVsZV9uYW1lIDo6Ci0gICAqICAgICAgIFRoZSBtb2R1bGUgbmFtZS4KLSAgICoKLSAgICogICAgcHJvcGVydHlfbmFtZSA6OgotICAgKiAgICAgICBUaGUgcHJvcGVydHkgbmFtZS4gIFByb3BlcnRpZXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgYFN5bm9wc2lzJwotICAgKiAgICAgICBzdWJzZWN0aW9uIG9mIHRoZSBtb2R1bGUncyBkb2N1bWVudGF0aW9uLgotICAgKgotICAgKiBAaW5vdXQ6Ci0gICAqICAgIHZhbHVlIDo6Ci0gICAqICAgICAgIEEgZ2VuZXJpYyBwb2ludGVyIHRvIGEgdmFyaWFibGUgb3Igc3RydWN0dXJlIHRoYXQgZ2l2ZXMgdGhlCi0gICAqICAgICAgIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4gIFRoZSBleGFjdCBkZWZpbml0aW9uIG9mIGB2YWx1ZScgaXMKLSAgICogICAgICAgZGVwZW5kZW50IG9uIHRoZSBwcm9wZXJ0eTsgc2VlIHRoZSBgU3lub3BzaXMnIHN1YnNlY3Rpb24gb2YgdGhlCi0gICAqICAgICAgIG1vZHVsZSdzIGRvY3VtZW50YXRpb24uCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgIElmIGBtb2R1bGVfbmFtZScgaXNuJ3QgYSB2YWxpZCBtb2R1bGUgbmFtZSwgb3IgYHByb3BlcnR5X25hbWUnCi0gICAqICAgIGRvZXNuJ3Qgc3BlY2lmeSBhIHZhbGlkIHByb3BlcnR5LCBvciBpZiBgdmFsdWUnIGRvZXNuJ3QgcmVwcmVzZW50IGEKLSAgICogICAgdmFsaWQgdmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eSwgYW4gZXJyb3IgaXMgcmV0dXJuZWQuCi0gICAqCi0gICAqICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBnZXRzIHByb3BlcnR5IGBiYXonIChhIHJhbmdlKSBpbiBtb2R1bGUgYGZvbycuCi0gICAqCi0gICAqICAgIHsKLSAgICogICAgICB0eXBlZGVmICByYW5nZV8KLSAgICogICAgICB7Ci0gICAqICAgICAgICBGVF9JbnQzMiAgbWluOwotICAgKiAgICAgICAgRlRfSW50MzIgIG1heDsKLSAgICoKLSAgICogICAgICB9IHJhbmdlOwotICAgKgotICAgKiAgICAgIHJhbmdlICBiYXo7Ci0gICAqCi0gICAqCi0gICAqICAgICAgRlRfUHJvcGVydHlfR2V0KCBsaWJyYXJ5LCAiZm9vIiwgImJheiIsICZiYXogKTsKLSAgICogICAgfQotICAgKgotICAgKiAgICBJdCBpcyBub3QgcG9zc2libGUgdG8gcmV0cmlldmUgcHJvcGVydGllcyBvZiB0aGUgRnJlZVR5cGUgQ2FjaGUKLSAgICogICAgc3ViLXN5c3RlbSB3aXRoIEZUX1Byb3BlcnR5X0dldDsgdXNlIEBGVENfUHJvcGVydHlfR2V0IGluc3RlYWQuCi0gICAqCi0gICAqICBAc2luY2U6Ci0gICAqICAgIDIuNC4xMQotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1Byb3BlcnR5X0dldCggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICBtb2R1bGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICBwcm9wZXJ0eV9uYW1lLAotICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgIHZhbHVlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SZWZlcmVuY2VfTGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGNvdW50ZXIgZ2V0cyBpbml0aWFsaXplZCB0b34xIGF0IHRoZSB0aW1lIGFuIEBGVF9MaWJyYXJ5ICAgICAgICAgKi8KLSAgLyogICAgc3RydWN0dXJlIGlzIGNyZWF0ZWQuICBUaGlzIGZ1bmN0aW9uIGluY3JlbWVudHMgdGhlIGNvdW50ZXIuICAgICAgICovCi0gIC8qICAgIEBGVF9Eb25lX0xpYnJhcnkgdGhlbiBvbmx5IGRlc3Ryb3lzIGEgbGlicmFyeSBpZiB0aGUgY291bnRlciBpc34xLCAqLwotICAvKiAgICBvdGhlcndpc2UgaXQgc2ltcGx5IGRlY3JlbWVudHMgdGhlIGNvdW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaGVscHMgaW4gbWFuYWdpbmcgbGlmZS1jeWNsZXMgb2Ygc3RydWN0dXJlcyB0aGF0ICAgICAqLwotICAvKiAgICByZWZlcmVuY2UgQEZUX0xpYnJhcnkgb2JqZWN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTaW5jZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAyLjQuMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9SZWZlcmVuY2VfTGlicmFyeSggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTmV3X0xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBGcmVlVHlwZSBsaWJyYXJ5IGluc3RhbmNlICAgICovCi0gIC8qICAgIGZyb20gYSBnaXZlbiBtZW1vcnkgb2JqZWN0LiAgSXQgaXMgdGh1cyBwb3NzaWJsZSB0byB1c2UgbGlicmFyaWVzICAqLwotICAvKiAgICB3aXRoIGRpc3RpbmN0IG1lbW9yeSBhbGxvY2F0b3JzIHdpdGhpbiB0aGUgc2FtZSBwcm9ncmFtLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vcm1hbGx5LCB5b3Ugd291bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIChmb2xsb3dlZCBieSBhIGNhbGwgdG8gICAgICAqLwotICAvKiAgICBARlRfQWRkX0RlZmF1bHRfTW9kdWxlcyBvciBhIHNlcmllcyBvZiBjYWxscyB0byBARlRfQWRkX01vZHVsZSkgICAgKi8KLSAgLyogICAgaW5zdGVhZCBvZiBARlRfSW5pdF9GcmVlVHlwZSB0byBpbml0aWFsaXplIHRoZSBGcmVlVHlwZSBsaWJyYXJ5LiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEb24ndCB1c2UgQEZUX0RvbmVfRnJlZVR5cGUgYnV0IEBGVF9Eb25lX0xpYnJhcnkgdG8gZGVzdHJveSBhICAgICAgKi8KLSAgLyogICAgbGlicmFyeSBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICAgOjogQSBoYW5kbGUgdG8gdGhlIG9yaWdpbmFsIG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWxpYnJhcnkgOjogQSBwb2ludGVyIHRvIGhhbmRsZSBvZiBhIG5ldyBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VlIHRoZSBkaXNjdXNzaW9uIG9mIHJlZmVyZW5jZSBjb3VudGVycyBpbiB0aGUgZGVzY3JpcHRpb24gb2YgICAgICovCi0gIC8qICAgIEBGVF9SZWZlcmVuY2VfTGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX05ld19MaWJyYXJ5KCBGVF9NZW1vcnkgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgRlRfTGlicmFyeSAgKmFsaWJyYXJ5ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Eb25lX0xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEaXNjYXJkIGEgZ2l2ZW4gbGlicmFyeSBvYmplY3QuICBUaGlzIGNsb3NlcyBhbGwgZHJpdmVycyBhbmQgICAgICAgKi8KLSAgLyogICAgZGlzY2FyZHMgYWxsIHJlc291cmNlIG9iamVjdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGxpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VlIHRoZSBkaXNjdXNzaW9uIG9mIHJlZmVyZW5jZSBjb3VudGVycyBpbiB0aGUgZGVzY3JpcHRpb24gb2YgICAgICovCi0gIC8qICAgIEBGVF9SZWZlcmVuY2VfTGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0RvbmVfTGlicmFyeSggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0gIC8qICovCi0KLSAgdHlwZWRlZiB2b2lkCi0gICgqRlRfRGVidWdIb29rX0Z1bmMpKCB2b2lkKiAgYXJnICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfRGVidWdfSG9vayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZXQgYSBkZWJ1ZyBob29rIGZ1bmN0aW9uIGZvciBkZWJ1Z2dpbmcgdGhlIGludGVycHJldGVyIG9mIGEgZm9udCAgKi8KLSAgLyogICAgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgICA6OiBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaG9va19pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGRlYnVnIGhvb2suICBZb3Ugc2hvdWxkIHVzZSB0aGUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgdmFsdWVzIGRlZmluZWQgaW4gYGZ0b2Jqcy5oJywgZS5nLiwgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGBGVF9ERUJVR19IT09LX1RSVUVUWVBFJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlYnVnX2hvb2sgOjogVGhlIGZ1bmN0aW9uIHVzZWQgdG8gZGVidWcgdGhlIGludGVycHJldGVyLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEN1cnJlbnRseSwgZm91ciBkZWJ1ZyBob29rIHNsb3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBvbmx5IHR3byAoZm9yICAqLwotICAvKiAgICB0aGUgVHJ1ZVR5cGUgYW5kIHRoZSBUeXBlfjEgaW50ZXJwcmV0ZXIpIGFyZSBkZWZpbmVkLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNpbmNlIHRoZSBpbnRlcm5hbCBoZWFkZXJzIG9mIEZyZWVUeXBlIGFyZSBubyBsb25nZXIgaW5zdGFsbGVkLCAgICAqLwotICAvKiAgICB0aGUgc3ltYm9sIGBGVF9ERUJVR19IT09LX1RSVUVUWVBFJyBpc24ndCBhdmFpbGFibGUgcHVibGljbHkuICAgICAgKi8KLSAgLyogICAgVGhpcyBpcyBhIGJ1ZyBhbmQgd2lsbCBiZSBmaXhlZCBpbiBhIGZvcnRoY29taW5nIHJlbGVhc2UuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9TZXRfRGVidWdfSG9vayggRlRfTGlicmFyeSAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgaG9va19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0RlYnVnSG9va19GdW5jICBkZWJ1Z19ob29rICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BZGRfRGVmYXVsdF9Nb2R1bGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBZGQgdGhlIHNldCBvZiBkZWZhdWx0IGRyaXZlcnMgdG8gYSBnaXZlbiBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBpcyBvbmx5IHVzZWZ1bCB3aGVuIHlvdSBjcmVhdGUgYSBsaWJyYXJ5IG9iamVjdCB3aXRoICAgICAgICAgICovCi0gIC8qICAgIEBGVF9OZXdfTGlicmFyeSAodXN1YWxseSB0byBwbHVnIGEgY3VzdG9tIG1lbW9yeSBtYW5hZ2VyKS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gYSBuZXcgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfQWRkX0RlZmF1bHRfTW9kdWxlcyggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHNlY3Rpb246Ci0gICAqICAgdHJ1ZXR5cGVfZW5naW5lCi0gICAqCi0gICAqIEB0aXRsZToKLSAgICogICBUaGUgVHJ1ZVR5cGUgRW5naW5lCi0gICAqCi0gICAqIEBhYnN0cmFjdDoKLSAgICogICBUcnVlVHlwZSBieXRlY29kZSBzdXBwb3J0LgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGEgZnVuY3Rpb24gdXNlZCB0byBxdWVyeSB0aGUgbGV2ZWwgb2YgVHJ1ZVR5cGUKLSAgICogICBieXRlY29kZSBzdXBwb3J0IGNvbXBpbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4KLSAgICoKLSAgICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogIEBlbnVtOgotICAgKiAgICAgRlRfVHJ1ZVR5cGVFbmdpbmVUeXBlCi0gICAqCi0gICAqICBAZGVzY3JpcHRpb246Ci0gICAqICAgICBBIGxpc3Qgb2YgdmFsdWVzIGRlc2NyaWJpbmcgd2hpY2gga2luZCBvZiBUcnVlVHlwZSBieXRlY29kZQotICAgKiAgICAgZW5naW5lIGlzIGltcGxlbWVudGVkIGluIGEgZ2l2ZW4gRlRfTGlicmFyeSBpbnN0YW5jZS4gIEl0IGlzIHVzZWQKLSAgICogICAgIGJ5IHRoZSBARlRfR2V0X1RydWVUeXBlX0VuZ2luZV9UeXBlIGZ1bmN0aW9uLgotICAgKgotICAgKiAgQHZhbHVlczoKLSAgICogICAgIEZUX1RSVUVUWVBFX0VOR0lORV9UWVBFX05PTkUgOjoKLSAgICogICAgICAgVGhlIGxpYnJhcnkgZG9lc24ndCBpbXBsZW1lbnQgYW55IGtpbmQgb2YgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIuCi0gICAqCi0gICAqICAgICBGVF9UUlVFVFlQRV9FTkdJTkVfVFlQRV9VTlBBVEVOVEVEIDo6Ci0gICAqICAgICAgIFRoZSBsaWJyYXJ5IGltcGxlbWVudHMgYSBieXRlY29kZSBpbnRlcnByZXRlciB0aGF0IGRvZXNuJ3QKLSAgICogICAgICAgc3VwcG9ydCB0aGUgcGF0ZW50ZWQgb3BlcmF0aW9ucyBvZiB0aGUgVHJ1ZVR5cGUgdmlydHVhbCBtYWNoaW5lLgotICAgKgotICAgKiAgICAgICBJdHMgbWFpbiB1c2UgaXMgdG8gbG9hZCBjZXJ0YWluIEFzaWFuIGZvbnRzIHRoYXQgcG9zaXRpb24gYW5kCi0gICAqICAgICAgIHNjYWxlIGdseXBoIGNvbXBvbmVudHMgd2l0aCBieXRlY29kZSBpbnN0cnVjdGlvbnMuICBJdCBwcm9kdWNlcwotICAgKiAgICAgICBiYWQgb3V0cHV0IGZvciBtb3N0IG90aGVyIGZvbnRzLgotICAgKgotICAgKiAgICAgRlRfVFJVRVRZUEVfRU5HSU5FX1RZUEVfUEFURU5URUQgOjoKLSAgICogICAgICAgVGhlIGxpYnJhcnkgaW1wbGVtZW50cyBhIGJ5dGVjb2RlIGludGVycHJldGVyIHRoYXQgY292ZXJzCi0gICAqICAgICAgIHRoZSBmdWxsIGluc3RydWN0aW9uIHNldCBvZiB0aGUgVHJ1ZVR5cGUgdmlydHVhbCBtYWNoaW5lICh0aGlzCi0gICAqICAgICAgIHdhcyBnb3Zlcm5lZCBieSBwYXRlbnRzIHVudGlsIE1heSAyMDEwLCBoZW5jZSB0aGUgbmFtZSkuCi0gICAqCi0gICAqICBAc2luY2U6Ci0gICAqICAgICAyLjIKLSAgICoKLSAgICovCi0gIHR5cGVkZWYgZW51bSAgRlRfVHJ1ZVR5cGVFbmdpbmVUeXBlXwotICB7Ci0gICAgRlRfVFJVRVRZUEVfRU5HSU5FX1RZUEVfTk9ORSA9IDAsCi0gICAgRlRfVFJVRVRZUEVfRU5HSU5FX1RZUEVfVU5QQVRFTlRFRCwKLSAgICBGVF9UUlVFVFlQRV9FTkdJTkVfVFlQRV9QQVRFTlRFRAotCi0gIH0gRlRfVHJ1ZVR5cGVFbmdpbmVUeXBlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqICBAZnVuYzoKLSAgICogICAgIEZUX0dldF9UcnVlVHlwZV9FbmdpbmVfVHlwZQotICAgKgotICAgKiAgQGRlc2NyaXB0aW9uOgotICAgKiAgICAgUmV0dXJuIGFuIEBGVF9UcnVlVHlwZUVuZ2luZVR5cGUgdmFsdWUgdG8gaW5kaWNhdGUgd2hpY2ggbGV2ZWwgb2YKLSAgICogICAgIHRoZSBUcnVlVHlwZSB2aXJ0dWFsIG1hY2hpbmUgYSBnaXZlbiBsaWJyYXJ5IGluc3RhbmNlIHN1cHBvcnRzLgotICAgKgotICAgKiAgQGlucHV0OgotICAgKiAgICAgbGlicmFyeSA6OgotICAgKiAgICAgICBBIGxpYnJhcnkgaW5zdGFuY2UuCi0gICAqCi0gICAqICBAcmV0dXJuOgotICAgKiAgICAgQSB2YWx1ZSBpbmRpY2F0aW5nIHdoaWNoIGxldmVsIGlzIHN1cHBvcnRlZC4KLSAgICoKLSAgICogIEBzaW5jZToKLSAgICogICAgIDIuMgotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9UcnVlVHlwZUVuZ2luZVR5cGUgKQotICBGVF9HZXRfVHJ1ZVR5cGVfRW5naW5lX1R5cGUoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRNT0RBUElfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0bW9kZXJyLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0bW9kZXJyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMjdkYjEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdG1vZGVyci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0bW9kZXJyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBtb2R1bGUgZXJyb3Igb2Zmc2V0cyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDA1LCAyMDEwLCAyMDEzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgRnJlZVR5cGUgbW9kdWxlIGVycm9yIGNvZGVzLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSWYgdGhlIG1hY3JvIEZUX0NPTkZJR19PUFRJT05fVVNFX01PRFVMRV9FUlJPUlMgaW4gYGZ0b3B0aW9uLmgnIGlzICAgICovCi0gIC8qIHNldCwgdGhlIGxvd2VyIGJ5dGUgb2YgYW4gZXJyb3IgdmFsdWUgaWRlbnRpZmllcyB0aGUgZXJyb3IgY29kZSBhcyAgICAqLwotICAvKiB1c3VhbC4gIEluIGFkZGl0aW9uLCB0aGUgaGlnaGVyIGJ5dGUgaWRlbnRpZmllcyB0aGUgbW9kdWxlLiAgRm9yICAgICAgKi8KLSAgLyogZXhhbXBsZSwgdGhlIGVycm9yIGBGVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdCcgaGFzIHZhbHVlIDB4MDAwMywgdGhlICovCi0gIC8qIGVycm9yIGBUVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdCcgaGFzIHZhbHVlIDB4MTMwMywgdGhlIGVycm9yICAgICAgICAqLwotICAvKiBgVDFfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQnIGhhcyB2YWx1ZSAweDE0MDMsIGV0Yy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUgdGhhdCBgRlRfRXJyX09rJywgYFRUX0Vycl9PaycsIGV0Yy4gYXJlIGFsd2F5cyBlcXVhbCB0byB6ZXJvLCAgICAqLwotICAvKiBpbmNsdWRpbmcgdGhlIGhpZ2ggYnl0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElmIEZUX0NPTkZJR19PUFRJT05fVVNFX01PRFVMRV9FUlJPUlMgaXNuJ3Qgc2V0LCB0aGUgaGlnaGVyIGJ5dGUgb2YgICAqLwotICAvKiBhbiBlcnJvciB2YWx1ZSBpcyBzZXQgdG8gemVyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRvIGhpZGUgdGhlIHZhcmlvdXMgYFhYWF9FcnJfJyBwcmVmaXhlcyBpbiB0aGUgc291cmNlIGNvZGUsIEZyZWVUeXBlICAqLwotICAvKiBwcm92aWRlcyBzb21lIG1hY3JvcyBpbiBgZnR0eXBlcy5oJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfRVJSKCBlcnIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgQWRkIGN1cnJlbnQgZXJyb3IgbW9kdWxlIHByZWZpeCAoYXMgZGVmaW5lZCB3aXRoIHRoZSAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGBGVF9FUlJfUFJFRklYJyBtYWNybykgdG8gYGVycicuICBGb3IgZXhhbXBsZSwgaW4gdGhlIEJERiBtb2R1bGUgICovCi0gIC8qICAgICB0aGUgbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgZXJyb3IgPSBGVF9FUlIoIEludmFsaWRfT3V0bGluZSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgZXhwYW5kcyB0byAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIGVycm9yID0gQkRGX0Vycl9JbnZhbGlkX091dGxpbmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIEZvciBzaW1wbGljaXR5LCB5b3UgY2FuIGFsd2F5cyB1c2UgYEZUX0Vycl9PaycgZGlyZWN0bHkgaW5zdGVhZCAgICovCi0gIC8qICAgICBvZiBgRlRfRVJSKCBPayApJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGVF9FUlJfRVEoIGVycmNvZGUsIGVyciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfRVJSX05FUSggZXJyY29kZSwgZXJyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgQ29tcGFyZSBlcnJvciBjb2RlIGBlcnJjb2RlJyB3aXRoIHRoZSBlcnJvciBgZXJyJyBmb3IgZXF1YWxpdHkgICAgKi8KLSAgLyogICAgIGFuZCBpbmVxdWFsaXR5LCByZXNwZWN0aXZlbHkuICBFeGFtcGxlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICBpZiAoIEZUX0VSUl9FUSggZXJyb3IsIEludmFsaWRfT3V0bGluZSApICkgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgVXNpbmcgdGhpcyBtYWNybyB5b3UgZG9uJ3QgaGF2ZSB0byB0aGluayBhYm91dCBlcnJvciBwcmVmaXhlcy4gICAgKi8KLSAgLyogICAgIE9mIGNvdXJzZSwgaWYgbW9kdWxlIGVycm9ycyBhcmUgbm90IGFjdGl2ZSwgdGhlIGFib3ZlIGV4YW1wbGUgaXMgICovCi0gIC8qICAgICB0aGUgc2FtZSBhcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgaWYgKCBlcnJvciA9PSBGVF9FcnJfSW52YWxpZF9PdXRsaW5lICkgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGVF9FUlJPUl9CQVNFKCBlcnJjb2RlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfRVJST1JfTU9EVUxFKCBlcnJjb2RlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgR2V0IGJhc2UgZXJyb3IgYW5kIG1vZHVsZSBlcnJvciBjb2RlLCByZXNwZWN0aXZlbHkuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGNyZWF0ZSBhIG1vZHVsZSBlcnJvciBtZXNzYWdlIHRhYmxlIGVhc2lseSAgICAgKi8KLSAgLyogd2l0aCBzb21ldGhpbmcgbGlrZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICN1bmRlZiBfX0ZUTU9ERVJSX0hfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAjZGVmaW5lIEZUX01PREVSUkRFRiggZSwgdiwgcyApICB7IEZUX01vZF9FcnJfICMjIGUsIHMgfSwgICAgICAgICAqLwotICAvKiAgICAgI2RlZmluZSBGVF9NT0RFUlJfU1RBUlRfTElTVCAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICNkZWZpbmUgRlRfTU9ERVJSX0VORF9MSVNUICAgICAgIHsgMCwgMCB9IH07ICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgY29uc3Qgc3RydWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIGludCAgICAgICAgICBtb2RfZXJyX29mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICBjb25zdCBjaGFyKiAgbW9kX2Vycl9tc2cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIH0gZnRfbW9kX2Vycm9yc1tdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgI2luY2x1ZGUgRlRfTU9EVUxFX0VSUk9SU19IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRNT0RFUlJfSF9fCi0jZGVmaW5lIF9fRlRNT0RFUlJfSF9fCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgIFNFVFVQIE1BQ1JPUyAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jdW5kZWYgIEZUX05FRURfRVhURVJOX0MKLQotI2lmbmRlZiBGVF9NT0RFUlJERUYKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX01PRFVMRV9FUlJPUlMKLSNkZWZpbmUgRlRfTU9ERVJSREVGKCBlLCB2LCBzICkgIEZUX01vZF9FcnJfICMjIGUgPSB2LAotI2Vsc2UKLSNkZWZpbmUgRlRfTU9ERVJSREVGKCBlLCB2LCBzICkgIEZUX01vZF9FcnJfICMjIGUgPSAwLAotI2VuZGlmCi0KLSNkZWZpbmUgRlRfTU9ERVJSX1NUQVJUX0xJU1QgIGVudW0gewotI2RlZmluZSBGVF9NT0RFUlJfRU5EX0xJU1QgICAgRlRfTW9kX0Vycl9NYXggfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX05FRURfRVhURVJOX0MKLSAgZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9NT0RFUlJERUYgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgIExJU1QgTU9EVUxFIEVSUk9SIEJBU0VTICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZmRlZiBGVF9NT0RFUlJfU1RBUlRfTElTVAotICBGVF9NT0RFUlJfU1RBUlRfTElTVAotI2VuZGlmCi0KLQotICBGVF9NT0RFUlJERUYoIEJhc2UsICAgICAgMHgwMDAsICJiYXNlIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIEF1dG9maXQsICAgMHgxMDAsICJhdXRvZml0dGVyIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIEJERiwgICAgICAgMHgyMDAsICJCREYgbW9kdWxlIiApCi0gIEZUX01PREVSUkRFRiggQnppcDIsICAgICAweDMwMCwgIkJ6aXAyIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIENhY2hlLCAgICAgMHg0MDAsICJjYWNoZSBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBDRkYsICAgICAgIDB4NTAwLCAiQ0ZGIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIENJRCwgICAgICAgMHg2MDAsICJDSUQgbW9kdWxlIiApCi0gIEZUX01PREVSUkRFRiggR3ppcCwgICAgICAweDcwMCwgIkd6aXAgbW9kdWxlIiApCi0gIEZUX01PREVSUkRFRiggTFpXLCAgICAgICAweDgwMCwgIkxaVyBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBPVHZhbGlkLCAgIDB4OTAwLCAiT3BlblR5cGUgdmFsaWRhdGlvbiBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBQQ0YsICAgICAgIDB4QTAwLCAiUENGIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIFBGUiwgICAgICAgMHhCMDAsICJQRlIgbW9kdWxlIiApCi0gIEZUX01PREVSUkRFRiggUFNhdXgsICAgICAweEMwMCwgIlBTIGF1eGlsaWFyeSBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBQU2hpbnRlciwgIDB4RDAwLCAiUFMgaGludGVyIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIFBTbmFtZXMsICAgMHhFMDAsICJQUyBuYW1lcyBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBSYXN0ZXIsICAgIDB4RjAwLCAicmFzdGVyIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIFNGTlQsICAgICAweDEwMDAsICJTRk5UIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIFNtb290aCwgICAweDExMDAsICJzbW9vdGggcmFzdGVyIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIFRydWVUeXBlLCAweDEyMDAsICJUcnVlVHlwZSBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBUeXBlMSwgICAgMHgxMzAwLCAiVHlwZSAxIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIFR5cGU0MiwgICAweDE0MDAsICJUeXBlIDQyIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIFdpbmZvbnRzLCAweDE1MDAsICJXaW5kb3dzIEZPTi9GTlQgbW9kdWxlIiApCi0gIEZUX01PREVSUkRFRiggR1h2YWxpZCwgIDB4MTYwMCwgIkdYIHZhbGlkYXRpb24gbW9kdWxlIiApCi0KLQotI2lmZGVmIEZUX01PREVSUl9FTkRfTElTVAotICBGVF9NT0RFUlJfRU5EX0xJU1QKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgIENMRUFOVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmZGVmIEZUX05FRURfRVhURVJOX0MKLSAgfQotI2VuZGlmCi0KLSN1bmRlZiBGVF9NT0RFUlJfU1RBUlRfTElTVAotI3VuZGVmIEZUX01PREVSUl9FTkRfTElTVAotI3VuZGVmIEZUX01PREVSUkRFRgotI3VuZGVmIEZUX05FRURfRVhURVJOX0MKLQotCi0jZW5kaWYgLyogX19GVE1PREVSUl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRvdHZhbC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdG90dmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YmEwM2UuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdG90dmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRvdHZhbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgdmFsaWRhdGluZyBPcGVuVHlwZSB0YWJsZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMDcsIDIwMTMsIDIwMTQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBXYXJuaW5nOiBUaGlzIG1vZHVsZSBtaWdodCBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCBsaWJyYXJ5IGluIHRoZSAgICAgICAqLwotLyogICAgICAgICAgZnV0dXJlIHRvIGF2b2lkIGEgdGlnaHQgZGVwZW5kZW5jeSBiZXR3ZWVuIEZyZWVUeXBlIGFuZCB0aGUgICAgKi8KLS8qICAgICAgICAgIE9wZW5UeXBlIHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUT1RWQUxfSF9fCi0jZGVmaW5lIF9fRlRPVFZBTF9IX18KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3RfdmFsaWRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT3BlblR5cGUgVmFsaWRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gQVBJIHRvIHZhbGlkYXRlIE9wZW5UeXBlIHRhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBmdW5jdGlvbnMgdG8gdmFsaWRhdGUgICAgICovCi0gIC8qICAgIHNvbWUgT3BlblR5cGUgdGFibGVzIChCQVNFLCBHREVGLCBHUE9TLCBHU1VCLCBKU1RGLCBNQVRIKS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE9yZGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09wZW5UeXBlX1ZhbGlkYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PcGVuVHlwZV9GcmVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1ZBTElEQVRFX09UWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZW51bToKLSAgKiAgICBGVF9WQUxJREFURV9PVFhYWAotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIEEgbGlzdCBvZiBiaXQtZmllbGQgY29uc3RhbnRzIHVzZWQgd2l0aCBARlRfT3BlblR5cGVfVmFsaWRhdGUgdG8KLSAgKiAgICBpbmRpY2F0ZSB3aGljaCBPcGVuVHlwZSB0YWJsZXMgc2hvdWxkIGJlIHZhbGlkYXRlZC4KLSAgKgotICAqIEB2YWx1ZXM6Ci0gICogICAgRlRfVkFMSURBVEVfQkFTRSA6OgotICAqICAgICAgVmFsaWRhdGUgQkFTRSB0YWJsZS4KLSAgKgotICAqICAgIEZUX1ZBTElEQVRFX0dERUYgOjoKLSAgKiAgICAgIFZhbGlkYXRlIEdERUYgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9HUE9TIDo6Ci0gICogICAgICBWYWxpZGF0ZSBHUE9TIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfR1NVQiA6OgotICAqICAgICAgVmFsaWRhdGUgR1NVQiB0YWJsZS4KLSAgKgotICAqICAgIEZUX1ZBTElEQVRFX0pTVEYgOjoKLSAgKiAgICAgIFZhbGlkYXRlIEpTVEYgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9NQVRIIDo6Ci0gICogICAgICBWYWxpZGF0ZSBNQVRIIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfT1QgOjoKLSAgKiAgICAgIFZhbGlkYXRlIGFsbCBPcGVuVHlwZSB0YWJsZXMgKEJBU0UsIEdERUYsIEdQT1MsIEdTVUIsIEpTVEYsIE1BVEgpLgotICAqCi0gICovCi0jZGVmaW5lIEZUX1ZBTElEQVRFX0JBU0UgIDB4MDEwMAotI2RlZmluZSBGVF9WQUxJREFURV9HREVGICAweDAyMDAKLSNkZWZpbmUgRlRfVkFMSURBVEVfR1BPUyAgMHgwNDAwCi0jZGVmaW5lIEZUX1ZBTElEQVRFX0dTVUIgIDB4MDgwMAotI2RlZmluZSBGVF9WQUxJREFURV9KU1RGICAweDEwMDAKLSNkZWZpbmUgRlRfVkFMSURBVEVfTUFUSCAgMHgyMDAwCi0KLSNkZWZpbmUgRlRfVkFMSURBVEVfT1QgIEZUX1ZBTElEQVRFX0JBU0UgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9HREVGIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVkFMSURBVEVfR1BPUyB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX0dTVUIgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9KU1RGIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVkFMSURBVEVfTUFUSAotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgICBGVF9PcGVuVHlwZV9WYWxpZGF0ZQotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIFZhbGlkYXRlIHZhcmlvdXMgT3BlblR5cGUgdGFibGVzIHRvIGFzc3VyZSB0aGF0IGFsbCBvZmZzZXRzIGFuZAotICAqICAgIGluZGljZXMgYXJlIHZhbGlkLiAgVGhlIGlkZWEgaXMgdGhhdCBhIGhpZ2hlci1sZXZlbCBsaWJyYXJ5IHRoYXQKLSAgKiAgICBhY3R1YWxseSBkb2VzIHRoZSB0ZXh0IGxheW91dCBjYW4gYWNjZXNzIHRob3NlIHRhYmxlcyB3aXRob3V0Ci0gICogICAgZXJyb3IgY2hlY2tpbmcgKHdoaWNoIGNhbiBiZSBxdWl0ZSB0aW1lIGNvbnN1bWluZykuCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICAgZmFjZSA6OgotICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAqCi0gICogICAgdmFsaWRhdGlvbl9mbGFncyA6OgotICAqICAgICAgIEEgYml0IGZpZWxkIHRoYXQgc3BlY2lmaWVzIHRoZSB0YWJsZXMgdG8gYmUgdmFsaWRhdGVkLiAgU2VlCi0gICogICAgICAgQEZUX1ZBTElEQVRFX09UWFhYIGZvciBwb3NzaWJsZSB2YWx1ZXMuCi0gICoKLSAgKiBAb3V0cHV0OgotICAqICAgIEJBU0VfdGFibGUgOjoKLSAgKiAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEJBU0UgdGFibGUuCi0gICoKLSAgKiAgICBHREVGX3RhYmxlIDo6Ci0gICogICAgICAgQSBwb2ludGVyIHRvIHRoZSBHREVGIHRhYmxlLgotICAqCi0gICogICAgR1BPU190YWJsZSA6OgotICAqICAgICAgIEEgcG9pbnRlciB0byB0aGUgR1BPUyB0YWJsZS4KLSAgKgotICAqICAgIEdTVUJfdGFibGUgOjoKLSAgKiAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEdTVUIgdGFibGUuCi0gICoKLSAgKiAgICBKU1RGX3RhYmxlIDo6Ci0gICogICAgICAgQSBwb2ludGVyIHRvIHRoZSBKU1RGIHRhYmxlLgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyB3aXRoIE9wZW5UeXBlIGZvbnRzLCByZXR1cm5pbmcgYW4gZXJyb3IKLSAgKiAgIG90aGVyd2lzZS4KLSAgKgotICAqICAgQWZ0ZXIgdXNlLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGRlYWxsb2NhdGUgdGhlIGZpdmUgdGFibGVzIHdpdGgKLSAgKiAgIEBGVF9PcGVuVHlwZV9GcmVlLiAgQSBOVUxMIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSB0YWJsZSBlaXRoZXIKLSAgKiAgIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIGZvbnQsIG9yIHRoZSBhcHBsaWNhdGlvbiBoYXNuJ3QgYXNrZWQgZm9yCi0gICogICB2YWxpZGF0aW9uLgotICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfT3BlblR5cGVfVmFsaWRhdGUoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgdmFsaWRhdGlvbl9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqQkFTRV90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqR0RFRl90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqR1BPU190YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqR1NVQl90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqSlNURl90YWJsZSApOwotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgICBGVF9PcGVuVHlwZV9GcmVlCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgRnJlZSB0aGUgYnVmZmVyIGFsbG9jYXRlZCBieSBPcGVuVHlwZSB2YWxpZGF0b3IuCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICAgZmFjZSA6OgotICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAqCi0gICogICAgdGFibGUgOjoKLSAgKiAgICAgICBUaGUgcG9pbnRlciB0byB0aGUgYnVmZmVyIHRoYXQgaXMgYWxsb2NhdGVkIGJ5Ci0gICogICAgICAgQEZUX09wZW5UeXBlX1ZhbGlkYXRlLgotICAqCi0gICogQG5vdGU6Ci0gICogICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCB0byBmcmVlIHRoZSBidWZmZXIgYWxsb2NhdGVkIGJ5Ci0gICogICBARlRfT3BlblR5cGVfVmFsaWRhdGUgb25seS4KLSAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfT3BlblR5cGVfRnJlZSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICB0YWJsZSApOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVE9UVkFMX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdG91dGxuLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0b3V0bG4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNiOGZiZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0b3V0bG4uaAorKysgL2Rldi9udWxsCkBAIC0xLDU3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG91dGxuLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgU3VwcG9ydCBmb3IgdGhlIEZUX091dGxpbmUgdHlwZSB1c2VkIHRvIHN0b3JlIGdseXBoIHNoYXBlcyBvZiAgICAgICAgKi8KLS8qICAgIG1vc3Qgc2NhbGFibGUgZm9udCBmb3JtYXRzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDMsIDIwMDUtMjAxNCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRPVVRMTl9IX18KLSNkZWZpbmUgX19GVE9VVExOX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmVfcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE91dGxpbmUgUHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZ1bmN0aW9ucyB0byBjcmVhdGUsIHRyYW5zZm9ybSwgYW5kIHJlbmRlciB2ZWN0b3JpYWwgZ2x5cGggaW1hZ2VzLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyByb3V0aW5lcyB1c2VkIHRvIGNyZWF0ZSBhbmQgZGVzdHJveSBzY2FsYWJsZSAqLwotICAvKiAgICBnbHlwaCBpbWFnZXMga25vd24gYXMgYG91dGxpbmVzJy4gIFRoZXNlIGNhbiBhbHNvIGJlIG1lYXN1cmVkLCAgICAgKi8KLSAgLyogICAgdHJhbnNmb3JtZWQsIGFuZCBjb252ZXJ0ZWQgaW50byBiaXRtYXBzIGFuZCBwaXhtYXBzLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3JkZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfTmV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0RvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9Db3B5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfVHJhbnNsYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX1RyYW5zZm9ybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9FbWJvbGRlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfRW1ib2xkZW5YWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX1JldmVyc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9DaGVjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0dldF9DQm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9HZXRfQkJveCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0dldF9CaXRtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9SZW5kZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfRGVjb21wb3NlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0Z1bmNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9Nb3ZlVG9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfTGluZVRvRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0NvbmljVG9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9DdWJpY1RvRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PcmllbnRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9HZXRfT3JpZW50YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PVVRMSU5FX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9EZWNvbXBvc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2FsayBvdmVyIGFuIG91dGxpbmUncyBzdHJ1Y3R1cmUgdG8gZGVjb21wb3NlIGl0IGludG8gaW5kaXZpZHVhbCAgICovCi0gIC8qICAgIHNlZ21lbnRzIGFuZCBCw6l6aWVyIGFyY3MuICBUaGlzIGZ1bmN0aW9uIGFsc28gZW1pdHMgYG1vdmUgdG8nICAgICAgKi8KLSAgLyogICAgb3BlcmF0aW9ucyB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgb2YgbmV3IGNvbnRvdXJzIGluIHRoZSBvdXRsaW5lLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSAgICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgdGFyZ2V0LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdW5jX2ludGVyZmFjZSA6OiBBIHRhYmxlIG9mIGBlbWl0dGVycycsIGkuZS4sIGZ1bmN0aW9uIHBvaW50ZXJzICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgY2FsbGVkIGR1cmluZyBkZWNvbXBvc2l0aW9uIHRvIGluZGljYXRlIHBhdGggICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgICAgICAgICAgIDo6IEEgdHlwZWxlc3MgcG9pbnRlciB0aGF0IGlzIHBhc3NlZCB0byBlYWNoICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICBlbWl0dGVyIGR1cmluZyB0aGUgZGVjb21wb3NpdGlvbi4gIEl0IGNhbiBiZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBzdG9yZSB0aGUgc3RhdGUgZHVyaW5nIHRoZSAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIGRlY29tcG9zaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgY29udG91ciB0aGF0IGNvbnRhaW5zIGEgc2luZ2xlIHBvaW50IG9ubHkgaXMgcmVwcmVzZW50ZWQgYnkgYSAgICAqLwotICAvKiAgICBgbW92ZSB0bycgb3BlcmF0aW9uIGZvbGxvd2VkIGJ5IGBsaW5lIHRvJyB0byB0aGUgc2FtZSBwb2ludC4gIEluICAgKi8KLSAgLyogICAgbW9zdCBjYXNlcywgaXQgaXMgYmVzdCB0byBmaWx0ZXIgdGhpcyBvdXQgYmVmb3JlIHVzaW5nIHRoZSAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgZm9yIHN0cm9raW5nIHB1cnBvc2VzIChvdGhlcndpc2UgaXQgd291bGQgcmVzdWx0IGluIGEgICAgICAqLwotICAvKiAgICB2aXNpYmxlIGRvdCB3aGVuIHJvdW5kIGNhcHMgYXJlIHVzZWQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX0RlY29tcG9zZSggRlRfT3V0bGluZSogICAgICAgICAgICAgIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9PdXRsaW5lX0Z1bmNzKiAgZnVuY19pbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgdXNlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9OZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3JlYXRlIGEgbmV3IG91dGxpbmUgb2YgYSBnaXZlbiBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgb2JqZWN0IGZyb20gd2hlcmUgdGhlICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIG91dGxpbmUgaXMgYWxsb2NhdGVkLiAgTm90ZSBob3dldmVyIHRoYXQgdGhlIG5ldyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBvdXRsaW5lIHdpbGwgKm5vdCogbmVjZXNzYXJpbHkgYmUgKmZyZWVkKiwgd2hlbiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZGVzdHJveWluZyB0aGUgbGlicmFyeSwgYnkgQEZUX0RvbmVfRnJlZVR5cGUuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1Qb2ludHMgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcG9pbnRzIHdpdGhpbiB0aGUgb3V0bGluZS4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgTXVzdCBiZSBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8gMHhGRkZGICg2NTUzNSkuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1Db250b3VycyA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29udG91cnMgd2l0aGluIHRoZSBvdXRsaW5lLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBtdXN0IGJlIGluIHRoZSByYW5nZSAwIHRvIGBudW1Qb2ludHMnLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYW5vdXRsaW5lICAgOjogQSBoYW5kbGUgdG8gdGhlIG5ldyBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlYXNvbiB3aHkgdGhpcyBmdW5jdGlvbiB0YWtlcyBhIGBsaWJyYXJ5JyBwYXJhbWV0ZXIgaXMgc2ltcGx5ICovCi0gIC8qICAgIHRvIHVzZSB0aGUgbGlicmFyeSdzIG1lbW9yeSBhbGxvY2F0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfTmV3KCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBudW1Qb2ludHMsCi0gICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgbnVtQ29udG91cnMsCi0gICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lICAqYW5vdXRsaW5lICk7Ci0KLQotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9OZXdfSW50ZXJuYWwoIEZUX01lbW9yeSAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgbnVtUG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgIG51bUNvbnRvdXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSAgKmFub3V0bGluZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9Eb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzdHJveSBhbiBvdXRsaW5lIGNyZWF0ZWQgd2l0aCBARlRfT3V0bGluZV9OZXcuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSBvZiB0aGUgbGlicmFyeSBvYmplY3QgdXNlZCB0byBhbGxvY2F0ZSB0aGUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSA6OiBBIHBvaW50ZXIgdG8gdGhlIG91dGxpbmUgb2JqZWN0IHRvIGJlIGRpc2NhcmRlZC4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgdGhlIG91dGxpbmUncyBgb3duZXInIGZpZWxkIGlzIG5vdCBzZXQsIG9ubHkgdGhlIG91dGxpbmUgICAgICAgICovCi0gIC8qICAgIGRlc2NyaXB0b3Igd2lsbCBiZSByZWxlYXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlYXNvbiB3aHkgdGhpcyBmdW5jdGlvbiB0YWtlcyBhbiBgbGlicmFyeScgcGFyYW1ldGVyIGlzICAgICAgICovCi0gIC8qICAgIHNpbXBseSB0byB1c2UgZnRfbWVtX2ZyZWUoKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfRG9uZSggRlRfTGlicmFyeSAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogIG91dGxpbmUgKTsKLQotCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX0RvbmVfSW50ZXJuYWwoIEZUX01lbW9yeSAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogIG91dGxpbmUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfQ2hlY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENoZWNrIHRoZSBjb250ZW50cyBvZiBhbiBvdXRsaW5lIGRlc2NyaXB0b3IuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgOjogQSBoYW5kbGUgdG8gYSBzb3VyY2Ugb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfQ2hlY2soIEZUX091dGxpbmUqICBvdXRsaW5lICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0dldF9DQm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gYW4gb3V0bGluZSdzIGBjb250cm9sIGJveCcuICBUaGUgY29udHJvbCBib3ggZW5jbG9zZXMgYWxsICAgKi8KLSAgLyogICAgdGhlIG91dGxpbmUncyBwb2ludHMsIGluY2x1ZGluZyBCw6l6aWVyIGNvbnRyb2wgcG9pbnRzLiAgVGhvdWdoIGl0ICAqLwotICAvKiAgICBjb2luY2lkZXMgd2l0aCB0aGUgZXhhY3QgYm91bmRpbmcgYm94IGZvciBtb3N0IGdseXBocywgaXQgY2FuIGJlICAgKi8KLSAgLyogICAgc2xpZ2h0bHkgbGFyZ2VyIGluIHNvbWUgc2l0dWF0aW9ucyAobGlrZSB3aGVuIHJvdGF0aW5nIGFuIG91dGxpbmUgICovCi0gIC8qICAgIHRoYXQgY29udGFpbnMgQsOpemllciBvdXRzaWRlIGFyY3MpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGluZyB0aGUgY29udHJvbCBib3ggaXMgdmVyeSBmYXN0LCB3aGlsZSBnZXR0aW5nIHRoZSBib3VuZGluZyAqLwotICAvKiAgICBib3ggY2FuIHRha2UgbXVjaCBtb3JlIHRpbWUgYXMgaXQgbmVlZHMgdG8gd2FsayBvdmVyIGFsbCBzZWdtZW50cyAgKi8KLSAgLyogICAgYW5kIGFyY3MgaW4gdGhlIG91dGxpbmUuICBUbyBnZXQgdGhlIGxhdHRlciwgeW91IGNhbiB1c2UgdGhlICAgICAgICovCi0gIC8qICAgIGBmdGJib3gnIGNvbXBvbmVudCwgd2hpY2ggaXMgZGVkaWNhdGVkIHRvIHRoaXMgc2luZ2xlIHRhc2suICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgOjogQSBwb2ludGVyIHRvIHRoZSBzb3VyY2Ugb3V0bGluZSBkZXNjcmlwdG9yLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFjYm94ICAgOjogVGhlIG91dGxpbmUncyBjb250cm9sIGJveC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlZSBARlRfR2x5cGhfR2V0X0NCb3ggZm9yIGEgZGlzY3Vzc2lvbiBvZiB0cmlja3kgZm9udHMuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfT3V0bGluZV9HZXRfQ0JveCggY29uc3QgRlRfT3V0bGluZSogIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0JCb3ggICAgICAgICAgICphY2JveCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9UcmFuc2xhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQXBwbHkgYSBzaW1wbGUgdHJhbnNsYXRpb24gdG8gdGhlIHBvaW50cyBvZiBhbiBvdXRsaW5lLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBvdXRsaW5lIGRlc2NyaXB0b3IuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeE9mZnNldCA6OiBUaGUgaG9yaXpvbnRhbCBvZmZzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5T2Zmc2V0IDo6IFRoZSB2ZXJ0aWNhbCBvZmZzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX091dGxpbmVfVHJhbnNsYXRlKCBjb25zdCBGVF9PdXRsaW5lKiAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgICAgICB4T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICAgICAgIHlPZmZzZXQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfQ29weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvcHkgYW4gb3V0bGluZSBpbnRvIGFub3RoZXIgb25lLiAgQm90aCBvYmplY3RzIG11c3QgaGF2ZSB0aGUgICAgICAqLwotICAvKiAgICBzYW1lIHNpemVzIChudW1iZXIgb2YgcG9pbnRzICYgbnVtYmVyIG9mIGNvbnRvdXJzKSB3aGVuIHRoaXMgICAgICAgKi8KLSAgLyogICAgZnVuY3Rpb24gaXMgY2FsbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc291cmNlIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2Ugb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFyZ2V0IDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9Db3B5KCBjb25zdCBGVF9PdXRsaW5lKiAgc291cmNlLAotICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUgICAgICAgICp0YXJnZXQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfVHJhbnNmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFwcGx5IGEgc2ltcGxlIDJ4MiBtYXRyaXggdG8gYWxsIG9mIGFuIG91dGxpbmUncyBwb2ludHMuICBVc2VmdWwgICAqLwotICAvKiAgICBmb3IgYXBwbHlpbmcgcm90YXRpb25zLCBzbGFudGluZywgZmxpcHBpbmcsIGV0Yy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdXRsaW5lIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IG91dGxpbmUgZGVzY3JpcHRvci4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXRyaXggIDo6IEEgcG9pbnRlciB0byB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3UgY2FuIHVzZSBARlRfT3V0bGluZV9UcmFuc2xhdGUgaWYgeW91IG5lZWQgdG8gdHJhbnNsYXRlIHRoZSAgICAgKi8KLSAgLyogICAgb3V0bGluZSdzIHBvaW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9PdXRsaW5lX1RyYW5zZm9ybSggY29uc3QgRlRfT3V0bGluZSogIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9NYXRyaXgqICAgbWF0cml4ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0VtYm9sZGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFbWJvbGRlbiBhbiBvdXRsaW5lLiAgVGhlIG5ldyBvdXRsaW5lIHdpbGwgYmUgYXQgbW9zdCA0fnRpbWVzICAgICAgKi8KLSAgLyogICAgYHN0cmVuZ3RoJyBwaXhlbHMgd2lkZXIgYW5kIGhpZ2hlci4gIFlvdSBtYXkgdGhpbmsgb2YgdGhlIGxlZnQgYW5kICovCi0gIC8qICAgIGJvdHRvbSBib3JkZXJzIGFzIHVuY2hhbmdlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTmVnYXRpdmUgYHN0cmVuZ3RoJyB2YWx1ZXMgdG8gcmVkdWNlIHRoZSBvdXRsaW5lIHRoaWNrbmVzcyBhcmUgICAgICovCi0gIC8qICAgIHBvc3NpYmxlIGFsc28uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVuZ3RoIDo6IEhvdyBzdHJvbmcgdGhlIGdseXBoIGlzIGVtYm9sZGVuZWQuICBFeHByZXNzZWQgaW4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAyNi42IHBpeGVsIGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgdXNlZCBhbGdvcml0aG0gdG8gaW5jcmVhc2Ugb3IgZGVjcmVhc2UgdGhlIHRoaWNrbmVzcyBvZiB0aGUgICAgKi8KLSAgLyogICAgZ2x5cGggZG9lc24ndCBjaGFuZ2UgdGhlIG51bWJlciBvZiBwb2ludHM7IHRoaXMgbWVhbnMgdGhhdCBjZXJ0YWluICovCi0gIC8qICAgIHNpdHVhdGlvbnMgbGlrZSBhY3V0ZSBhbmdsZXMgb3IgaW50ZXJzZWN0aW9ucyBhcmUgc29tZXRpbWVzICAgICAgICAqLwotICAvKiAgICBoYW5kbGVkIGluY29ycmVjdGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHlvdSBuZWVkIGBiZXR0ZXInIG1ldHJpY3MgdmFsdWVzIHlvdSBzaG91bGQgY2FsbCAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfT3V0bGluZV9HZXRfQ0JveCBvciBARlRfT3V0bGluZV9HZXRfQkJveC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEV4YW1wbGUgY2FsbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRlRfTG9hZF9HbHlwaCggZmFjZSwgaW5kZXgsIEZUX0xPQURfREVGQVVMVCApOyAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGlmICggZmFjZS0+c2xvdC0+Zm9ybWF0ID09IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FICkgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIEZUX091dGxpbmVfRW1ib2xkZW4oICZmYWNlLT5zbG90LT5vdXRsaW5lLCBzdHJlbmd0aCApOyAgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVG8gZ2V0IG1lYW5pbmdmdWwgcmVzdWx0cywgZm9udCBzY2FsaW5nIHZhbHVlcyBtdXN0IGJlIHNldCB3aXRoICAgICovCi0gIC8qICAgIGZ1bmN0aW9ucyBsaWtlIEBGVF9TZXRfQ2hhcl9TaXplIGJlZm9yZSBjYWxsaW5nIEZUX1JlbmRlcl9HbHlwaC4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfRW1ib2xkZW4oIEZUX091dGxpbmUqICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgc3RyZW5ndGggKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfRW1ib2xkZW5YWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEVtYm9sZGVuIGFuIG91dGxpbmUuICBUaGUgbmV3IG91dGxpbmUgd2lsbCBiZSBgeHN0cmVuZ3RoJyBwaXhlbHMgICAqLwotICAvKiAgICB3aWRlciBhbmQgYHlzdHJlbmd0aCcgcGl4ZWxzIGhpZ2hlci4gIE90aGVyd2lzZSwgaXQgaXMgc2ltaWxhciB0byAgKi8KLSAgLyogICAgQEZUX091dGxpbmVfRW1ib2xkZW4sIHdoaWNoIHVzZXMgdGhlIHNhbWUgc3RyZW5ndGggaW4gYm90aCAgICAgICAgICovCi0gIC8qICAgIGRpcmVjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfRW1ib2xkZW5YWSggRlRfT3V0bGluZSogIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgIHhzdHJlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgeXN0cmVuZ3RoICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX1JldmVyc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXZlcnNlIHRoZSBkcmF3aW5nIGRpcmVjdGlvbiBvZiBhbiBvdXRsaW5lLiAgVGhpcyBpcyB1c2VkIHRvICAgICAgKi8KLSAgLyogICAgZW5zdXJlIGNvbnNpc3RlbnQgZmlsbCBjb252ZW50aW9ucyBmb3IgbWlycm9yZWQgZ2x5cGhzLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBvdXRsaW5lIGRlc2NyaXB0b3IuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiB0b2dnbGVzIHRoZSBiaXQgZmxhZyBARlRfT1VUTElORV9SRVZFUlNFX0ZJTEwgaW4gICAgICovCi0gIC8qICAgIHRoZSBvdXRsaW5lJ3MgYGZsYWdzJyBmaWVsZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSXQgc2hvdWxkbid0IGJlIHVzZWQgYnkgYSBub3JtYWwgY2xpZW50IGFwcGxpY2F0aW9uLCB1bmxlc3MgaXQgICAgICovCi0gIC8qICAgIGtub3dzIHdoYXQgaXQgaXMgZG9pbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfT3V0bGluZV9SZXZlcnNlKCBGVF9PdXRsaW5lKiAgb3V0bGluZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9HZXRfQml0bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVuZGVyIGFuIG91dGxpbmUgd2l0aGluIGEgYml0bWFwLiAgVGhlIG91dGxpbmUncyBpbWFnZSBpcyBzaW1wbHkgICovCi0gIC8qICAgIE9SLWVkIHRvIHRoZSB0YXJnZXQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gYSBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSA6OiBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBvdXRsaW5lIGRlc2NyaXB0b3IuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWJpdG1hcCA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBiaXRtYXAgZGVzY3JpcHRvci4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBkb2VzIE5PVCBDUkVBVEUgdGhlIGJpdG1hcCwgaXQgb25seSByZW5kZXJzIGFuICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgaW1hZ2Ugd2l0aGluIHRoZSBvbmUgeW91IHBhc3MgdG8gaXQhICBDb25zZXF1ZW50bHksIHRoZSAgICAqLwotICAvKiAgICB2YXJpb3VzIGZpZWxkcyBpbiBgYWJpdG1hcCcgc2hvdWxkIGJlIHNldCBhY2NvcmRpbmdseS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEl0IHdpbGwgdXNlIHRoZSByYXN0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZGVmYXVsdCBnbHlwaCBmb3JtYXQuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHZhbHVlIG9mIHRoZSBgbnVtX2dyYXlzJyBmaWVsZCBpbiBgYWJpdG1hcCcgaXMgaWdub3JlZC4gIElmICAgICovCi0gIC8qICAgIHlvdSBzZWxlY3QgdGhlIGdyYXktbGV2ZWwgcmFzdGVyaXplciwgYW5kIHlvdSB3YW50IGxlc3MgdGhhbiAyNTYgICAqLwotICAvKiAgICBncmF5IGxldmVscywgeW91IGhhdmUgdG8gdXNlIEBGVF9PdXRsaW5lX1JlbmRlciBkaXJlY3RseS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX0dldF9CaXRtYXAoIEZUX0xpYnJhcnkgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgICAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9CaXRtYXAgICphYml0bWFwICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX1JlbmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZW5kZXIgYW4gb3V0bGluZSB3aXRoaW4gYSBiaXRtYXAgdXNpbmcgdGhlIGN1cnJlbnQgc2Nhbi1jb252ZXJ0LiAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiB1c2VzIGFuIEBGVF9SYXN0ZXJfUGFyYW1zIHN0cnVjdHVyZSBhcyBhbiBhcmd1bWVudCwgICovCi0gIC8qICAgIGFsbG93aW5nIGFkdmFuY2VkIGZlYXR1cmVzIGxpa2UgZGlyZWN0IGNvbXBvc2l0aW9uLCB0cmFuc2x1Y2VuY3ksICAqLwotICAvKiAgICBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIGEgRnJlZVR5cGUgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgOjogQSBwb2ludGVyIHRvIHRoZSBzb3VyY2Ugb3V0bGluZSBkZXNjcmlwdG9yLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhcmFtcyAgOjogQSBwb2ludGVyIHRvIGFuIEBGVF9SYXN0ZXJfUGFyYW1zIHN0cnVjdHVyZSB1c2VkIHRvICAgICAqLwotICAvKiAgICAgICAgICAgICAgIGRlc2NyaWJlIHRoZSByZW5kZXJpbmcgb3BlcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3Ugc2hvdWxkIGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIGFuZCBob3cgQEZUX1Jhc3Rlcl9QYXJhbXMgd29ya3MgKi8KLSAgLyogICAgdG8gdXNlIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZmllbGQgYHBhcmFtcy5zb3VyY2UnIHdpbGwgYmUgc2V0IHRvIGBvdXRsaW5lJyBiZWZvcmUgdGhlIHNjYW4gKi8KLSAgLyogICAgY29udmVydGVyIGlzIGNhbGxlZCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgdmFsdWUgeW91IGdpdmUgdG8gaXQgaXMgICovCi0gIC8qICAgIGFjdHVhbGx5IGlnbm9yZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGdyYXktbGV2ZWwgcmFzdGVyaXplciBhbHdheXMgdXNlcyAyNTYgZ3JheSBsZXZlbHMuICBJZiB5b3UgICAgICovCi0gIC8qICAgIHdhbnQgbGVzcyBncmF5IGxldmVscywgeW91IGhhdmUgdG8gcHJvdmlkZSB5b3VyIG93biBzcGFuIGNhbGxiYWNrLiAqLwotICAvKiAgICBTZWUgdGhlIEBGVF9SQVNURVJfRkxBR19ESVJFQ1QgdmFsdWUgb2YgdGhlIGBmbGFncycgZmllbGQgaW4gdGhlICAgKi8KLSAgLyogICAgQEZUX1Jhc3Rlcl9QYXJhbXMgc3RydWN0dXJlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9SZW5kZXIoIEZUX0xpYnJhcnkgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgICAgIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9SYXN0ZXJfUGFyYW1zKiAgcGFyYW1zICk7Ci0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGVudW06Ci0gICogICBGVF9PcmllbnRhdGlvbgotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgQSBsaXN0IG9mIHZhbHVlcyB1c2VkIHRvIGRlc2NyaWJlIGFuIG91dGxpbmUncyBjb250b3VyIG9yaWVudGF0aW9uLgotICAqCi0gICogICBUaGUgVHJ1ZVR5cGUgYW5kIFBvc3RTY3JpcHQgc3BlY2lmaWNhdGlvbnMgdXNlIGRpZmZlcmVudCBjb252ZW50aW9ucwotICAqICAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3V0bGluZSBjb250b3VycyBzaG91bGQgYmUgZmlsbGVkIG9yIHVuZmlsbGVkLgotICAqCi0gICogQHZhbHVlczoKLSAgKiAgIEZUX09SSUVOVEFUSU9OX1RSVUVUWVBFIDo6Ci0gICogICAgIEFjY29yZGluZyB0byB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiwgY2xvY2t3aXNlIGNvbnRvdXJzIG11c3QKLSAgKiAgICAgYmUgZmlsbGVkLCBhbmQgY291bnRlci1jbG9ja3dpc2Ugb25lcyBtdXN0IGJlIHVuZmlsbGVkLgotICAqCi0gICogICBGVF9PUklFTlRBVElPTl9QT1NUU0NSSVBUIDo6Ci0gICogICAgIEFjY29yZGluZyB0byB0aGUgUG9zdFNjcmlwdCBzcGVjaWZpY2F0aW9uLCBjb3VudGVyLWNsb2Nrd2lzZSBjb250b3VycwotICAqICAgICBtdXN0IGJlIGZpbGxlZCwgYW5kIGNsb2Nrd2lzZSBvbmVzIG11c3QgYmUgdW5maWxsZWQuCi0gICoKLSAgKiAgIEZUX09SSUVOVEFUSU9OX0ZJTExfUklHSFQgOjoKLSAgKiAgICAgVGhpcyBpcyBpZGVudGljYWwgdG8gQEZUX09SSUVOVEFUSU9OX1RSVUVUWVBFLCBidXQgaXMgdXNlZCB0bwotICAqICAgICByZW1lbWJlciB0aGF0IGluIFRydWVUeXBlLCBldmVyeXRoaW5nIHRoYXQgaXMgdG8gdGhlIHJpZ2h0IG9mCi0gICogICAgIHRoZSBkcmF3aW5nIGRpcmVjdGlvbiBvZiBhIGNvbnRvdXIgbXVzdCBiZSBmaWxsZWQuCi0gICoKLSAgKiAgIEZUX09SSUVOVEFUSU9OX0ZJTExfTEVGVCA6OgotICAqICAgICBUaGlzIGlzIGlkZW50aWNhbCB0byBARlRfT1JJRU5UQVRJT05fUE9TVFNDUklQVCwgYnV0IGlzIHVzZWQgdG8KLSAgKiAgICAgcmVtZW1iZXIgdGhhdCBpbiBQb3N0U2NyaXB0LCBldmVyeXRoaW5nIHRoYXQgaXMgdG8gdGhlIGxlZnQgb2YKLSAgKiAgICAgdGhlIGRyYXdpbmcgZGlyZWN0aW9uIG9mIGEgY29udG91ciBtdXN0IGJlIGZpbGxlZC4KLSAgKgotICAqICAgRlRfT1JJRU5UQVRJT05fTk9ORSA6OgotICAqICAgICBUaGUgb3JpZW50YXRpb24gY2Fubm90IGJlIGRldGVybWluZWQuICBUaGF0IGlzLCBkaWZmZXJlbnQgcGFydHMgb2YKLSAgKiAgICAgdGhlIGdseXBoIGhhdmUgZGlmZmVyZW50IG9yaWVudGF0aW9uLgotICAqCi0gICovCi0gIHR5cGVkZWYgZW51bSAgRlRfT3JpZW50YXRpb25fCi0gIHsKLSAgICBGVF9PUklFTlRBVElPTl9UUlVFVFlQRSAgID0gMCwKLSAgICBGVF9PUklFTlRBVElPTl9QT1NUU0NSSVBUID0gMSwKLSAgICBGVF9PUklFTlRBVElPTl9GSUxMX1JJR0hUID0gRlRfT1JJRU5UQVRJT05fVFJVRVRZUEUsCi0gICAgRlRfT1JJRU5UQVRJT05fRklMTF9MRUZUICA9IEZUX09SSUVOVEFUSU9OX1BPU1RTQ1JJUFQsCi0gICAgRlRfT1JJRU5UQVRJT05fTk9ORQotCi0gIH0gRlRfT3JpZW50YXRpb247Ci0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGZ1bmN0aW9uOgotICAqICAgRlRfT3V0bGluZV9HZXRfT3JpZW50YXRpb24KLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgIFRoaXMgZnVuY3Rpb24gYW5hbHl6ZXMgYSBnbHlwaCBvdXRsaW5lIGFuZCB0cmllcyB0byBjb21wdXRlIGl0cwotICAqICAgZmlsbCBvcmllbnRhdGlvbiAoc2VlIEBGVF9PcmllbnRhdGlvbikuICBUaGlzIGlzIGRvbmUgYnkgaW50ZWdyYXRpbmcKLSAgKiAgIHRoZSB0b3RhbCBhcmVhIGNvdmVyZWQgYnkgdGhlIG91dGxpbmUuIFRoZSBwb3NpdGl2ZSBpbnRlZ3JhbAotICAqICAgY29ycmVzcG9uZHMgdG8gdGhlIGNsb2Nrd2lzZSBvcmllbnRhdGlvbiBhbmQgQEZUX09SSUVOVEFUSU9OX1BPU1RTQ1JJUFQKLSAgKiAgIGlzIHJldHVybmVkLiBUaGUgbmVnYXRpdmUgaW50ZWdyYWwgY29ycmVzcG9uZHMgdG8gdGhlIGNvdW50ZXItY2xvY2t3aXNlCi0gICogICBvcmllbnRhdGlvbiBhbmQgQEZUX09SSUVOVEFUSU9OX1RSVUVUWVBFIGlzIHJldHVybmVkLgotICAqCi0gICogICBOb3RlIHRoYXQgdGhpcyB3aWxsIHJldHVybiBARlRfT1JJRU5UQVRJT05fVFJVRVRZUEUgZm9yIGVtcHR5Ci0gICogICBvdXRsaW5lcy4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgIG91dGxpbmUgOjoKLSAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBvdXRsaW5lLgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIFRoZSBvcmllbnRhdGlvbi4KLSAgKgotICAqLwotICBGVF9FWFBPUlQoIEZUX09yaWVudGF0aW9uICkKLSAgRlRfT3V0bGluZV9HZXRfT3JpZW50YXRpb24oIEZUX091dGxpbmUqICBvdXRsaW5lICk7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUT1VUTE5fSF9fICovCi0KLQotLyogRU5EICovCi0KLQotLyogTG9jYWwgVmFyaWFibGVzOiAqLwotLyogY29kaW5nOiB1dGYtOCAgICAqLwotLyogRW5kOiAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdHBmci5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdHBmci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDUwMzUzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRwZnIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHBmci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciBhY2Nlc3NpbmcgUEZSLXNwZWNpZmljIGRhdGEgKHNwZWNpZmljYXRpb24gb25seSkuICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDIsIDIwMDMsIDIwMDQsIDIwMDYsIDIwMDgsIDIwMDkgYnkgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVFBGUl9IX18KLSNkZWZpbmUgX19GVFBGUl9IX18KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGZyX2ZvbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUEZSIEZvbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUEZSL1RydWVEb2Mgc3BlY2lmaWMgQVBJLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBQRlItc3BlY2lmaWMgZnVuY3Rpb25zLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgICBGVF9HZXRfUEZSX01ldHJpY3MKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgICBSZXR1cm4gdGhlIG91dGxpbmUgYW5kIG1ldHJpY3MgcmVzb2x1dGlvbnMgb2YgYSBnaXZlbiBQRlIgZmFjZS4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgICBmYWNlIDo6IEhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4gIEl0IGNhbiBiZSBhIG5vbi1QRlIgZmFjZS4KLSAgKgotICAqIEBvdXRwdXQ6Ci0gICogICAgYW91dGxpbmVfcmVzb2x1dGlvbiA6OgotICAqICAgICAgT3V0bGluZSByZXNvbHV0aW9uLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBmYWNlLT51bml0c19wZXJfRU0nCi0gICogICAgICBmb3Igbm9uLVBGUiBmb250cy4gIE9wdGlvbmFsIChwYXJhbWV0ZXIgY2FuIGJlIE5VTEwpLgotICAqCi0gICogICAgYW1ldHJpY3NfcmVzb2x1dGlvbiA6OgotICAqICAgICAgTWV0cmljcyByZXNvbHV0aW9uLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBvdXRsaW5lX3Jlc29sdXRpb24nCi0gICogICAgICBmb3Igbm9uLVBGUiBmb250cy4gIE9wdGlvbmFsIChwYXJhbWV0ZXIgY2FuIGJlIE5VTEwpLgotICAqCi0gICogICAgYW1ldHJpY3NfeF9zY2FsZSA6OgotICAqICAgICAgQSAxNi4xNiBmaXhlZC1wb2ludCBudW1iZXIgdXNlZCB0byBzY2FsZSBkaXN0YW5jZSBleHByZXNzZWQKLSAgKiAgICAgIGluIG1ldHJpY3MgdW5pdHMgdG8gZGV2aWNlIHN1Yi1waXhlbHMuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KLSAgKiAgICAgIGBmYWNlLT5zaXplLT54X3NjYWxlJywgYnV0IGZvciBtZXRyaWNzIG9ubHkuICBPcHRpb25hbCAocGFyYW1ldGVyCi0gICogICAgICBjYW4gYmUgTlVMTCkuCi0gICoKLSAgKiAgICBhbWV0cmljc195X3NjYWxlIDo6Ci0gICogICAgICBTYW1lIGFzIGBhbWV0cmljc194X3NjYWxlJyBidXQgZm9yIHRoZSB2ZXJ0aWNhbCBkaXJlY3Rpb24uCi0gICogICAgICBvcHRpb25hbCAocGFyYW1ldGVyIGNhbiBiZSBOVUxMKS4KLSAgKgotICAqIEByZXR1cm46Ci0gICogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgKgotICAqIEBub3RlOgotICAqICAgSWYgdGhlIGlucHV0IGZhY2UgaXMgbm90IGEgUEZSLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGFuIGVycm9yLgotICAqICAgSG93ZXZlciwgaW4gYWxsIGNhc2VzLCBpdCB3aWxsIHJldHVybiB2YWxpZCB2YWx1ZXMuCi0gICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfUEZSX01ldHJpY3MoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgKmFvdXRsaW5lX3Jlc29sdXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICphbWV0cmljc19yZXNvbHV0aW9uLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAqYW1ldHJpY3NfeF9zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgKmFtZXRyaWNzX3lfc2NhbGUgKTsKLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgICBGVF9HZXRfUEZSX0tlcm5pbmcKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgICBSZXR1cm4gdGhlIGtlcm5pbmcgcGFpciBjb3JyZXNwb25kaW5nIHRvIHR3byBnbHlwaHMgaW4gYSBQRlIgZmFjZS4KLSAgKiAgICBUaGUgZGlzdGFuY2UgaXMgZXhwcmVzc2VkIGluIG1ldHJpY3MgdW5pdHMsIHVubGlrZSB0aGUgcmVzdWx0IG9mCi0gICogICAgQEZUX0dldF9LZXJuaW5nLgotICAqCi0gICogQGlucHV0OgotICAqICAgIGZhY2UgIDo6IEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAqCi0gICogICAgbGVmdCAgOjogSW5kZXggb2YgdGhlIGxlZnQgZ2x5cGguCi0gICoKLSAgKiAgICByaWdodCA6OiBJbmRleCBvZiB0aGUgcmlnaHQgZ2x5cGguCi0gICoKLSAgKiBAb3V0cHV0OgotICAqICAgIGF2ZWN0b3IgOjogQSBrZXJuaW5nIHZlY3Rvci4KLSAgKgotICAqIEByZXR1cm46Ci0gICogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgKgotICAqIEBub3RlOgotICAqICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybiBkaXN0YW5jZXMgaW4gb3JpZ2luYWwgUEZSIG1ldHJpY3MKLSAgKiAgICB1bml0cy4gIFRoaXMgaXMgdW5saWtlIEBGVF9HZXRfS2VybmluZyB3aXRoIHRoZSBARlRfS0VSTklOR19VTlNDQUxFRAotICAqICAgIG1vZGUsIHdoaWNoIGFsd2F5cyByZXR1cm5zIGRpc3RhbmNlcyBjb252ZXJ0ZWQgdG8gb3V0bGluZSB1bml0cy4KLSAgKgotICAqICAgIFlvdSBjYW4gdXNlIHRoZSB2YWx1ZSBvZiB0aGUgYHhfc2NhbGUnIGFuZCBgeV9zY2FsZScgcGFyYW1ldGVycwotICAqICAgIHJldHVybmVkIGJ5IEBGVF9HZXRfUEZSX01ldHJpY3MgdG8gc2NhbGUgdGhlc2UgdG8gZGV2aWNlIHN1Yi1waXhlbHMuCi0gICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfUEZSX0tlcm5pbmcoIEZUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICByaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IgICphdmVjdG9yICk7Ci0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICAgRlRfR2V0X1BGUl9BZHZhbmNlCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgUmV0dXJuIGEgZ2l2ZW4gZ2x5cGggYWR2YW5jZSwgZXhwcmVzc2VkIGluIG9yaWdpbmFsIG1ldHJpY3MgdW5pdHMsCi0gICogICAgZnJvbSBhIFBGUiBmb250LgotICAqCi0gICogQGlucHV0OgotICAqICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KLSAgKgotICAqICAgIGdpbmRleCA6OiBUaGUgZ2x5cGggaW5kZXguCi0gICoKLSAgKiBAb3V0cHV0OgotICAqICAgIGFhZHZhbmNlIDo6IFRoZSBnbHlwaCBhZHZhbmNlIGluIG1ldHJpY3MgdW5pdHMuCi0gICoKLSAgKiBAcmV0dXJuOgotICAqICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgICBZb3UgY2FuIHVzZSB0aGUgYHhfc2NhbGUnIG9yIGB5X3NjYWxlJyByZXN1bHRzIG9mIEBGVF9HZXRfUEZSX01ldHJpY3MKLSAgKiAgICB0byBjb252ZXJ0IHRoZSBhZHZhbmNlIHRvIGRldmljZSBzdWItcGl4ZWxzIChpLmUuLCAxLzY0dGggb2YgcGl4ZWxzKS4KLSAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9QRlJfQWR2YW5jZSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAqYWFkdmFuY2UgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRQRlJfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0cmVuZGVyLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0cmVuZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZDM2MzYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdHJlbmRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0cmVuZGVyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSByZW5kZXJlciBtb2R1bGVzIHB1YmxpYyBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDA1LCAyMDA2LCAyMDEwIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUUkVOREVSX0hfXwotI2RlZmluZSBfX0ZUUkVOREVSX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfTU9EVUxFX0gKLSNpbmNsdWRlIEZUX0dMWVBIX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZV9tYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBjcmVhdGUgYSBuZXcgZ2x5cGggb2JqZWN0ICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9HbHlwaF9Jbml0RnVuYykoIEZUX0dseXBoICAgICAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgIHNsb3QgKTsKLQotICAvKiBkZXN0cm95cyBhIGdpdmVuIGdseXBoIG9iamVjdCAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9HbHlwaF9Eb25lRnVuYykoIEZUX0dseXBoICBnbHlwaCApOwotCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX0dseXBoX1RyYW5zZm9ybUZ1bmMpKCBGVF9HbHlwaCAgICAgICAgICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfTWF0cml4KiAgbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICBkZWx0YSApOwotCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX0dseXBoX0dldEJCb3hGdW5jKSggRlRfR2x5cGggIGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQkJveCogIGFiYm94ICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0dseXBoX0NvcHlGdW5jKSggRlRfR2x5cGggICBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaCAgIHRhcmdldCApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9HbHlwaF9QcmVwYXJlRnVuYykoIEZUX0dseXBoICAgICAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgIHNsb3QgKTsKLQotLyogZGVwcmVjYXRlZCAqLwotI2RlZmluZSBGVF9HbHlwaF9Jbml0X0Z1bmMgICAgICAgRlRfR2x5cGhfSW5pdEZ1bmMKLSNkZWZpbmUgRlRfR2x5cGhfRG9uZV9GdW5jICAgICAgIEZUX0dseXBoX0RvbmVGdW5jCi0jZGVmaW5lIEZUX0dseXBoX1RyYW5zZm9ybV9GdW5jICBGVF9HbHlwaF9UcmFuc2Zvcm1GdW5jCi0jZGVmaW5lIEZUX0dseXBoX0JCb3hfRnVuYyAgICAgICBGVF9HbHlwaF9HZXRCQm94RnVuYwotI2RlZmluZSBGVF9HbHlwaF9Db3B5X0Z1bmMgICAgICAgRlRfR2x5cGhfQ29weUZ1bmMKLSNkZWZpbmUgRlRfR2x5cGhfUHJlcGFyZV9GdW5jICAgIEZUX0dseXBoX1ByZXBhcmVGdW5jCi0KLQotICBzdHJ1Y3QgIEZUX0dseXBoX0NsYXNzXwotICB7Ci0gICAgRlRfTG9uZyAgICAgICAgICAgICAgICAgZ2x5cGhfc2l6ZTsKLSAgICBGVF9HbHlwaF9Gb3JtYXQgICAgICAgICBnbHlwaF9mb3JtYXQ7Ci0gICAgRlRfR2x5cGhfSW5pdEZ1bmMgICAgICAgZ2x5cGhfaW5pdDsKLSAgICBGVF9HbHlwaF9Eb25lRnVuYyAgICAgICBnbHlwaF9kb25lOwotICAgIEZUX0dseXBoX0NvcHlGdW5jICAgICAgIGdseXBoX2NvcHk7Ci0gICAgRlRfR2x5cGhfVHJhbnNmb3JtRnVuYyAgZ2x5cGhfdHJhbnNmb3JtOwotICAgIEZUX0dseXBoX0dldEJCb3hGdW5jICAgIGdseXBoX2Jib3g7Ci0gICAgRlRfR2x5cGhfUHJlcGFyZUZ1bmMgICAgZ2x5cGhfcHJlcGFyZTsKLSAgfTsKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9SZW5kZXJlcl9SZW5kZXJGdW5jKSggRlRfUmVuZGVyZXIgICAgICAgcmVuZGVyZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogIG9yaWdpbiApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9SZW5kZXJlcl9UcmFuc2Zvcm1GdW5jKSggRlRfUmVuZGVyZXIgICAgICAgcmVuZGVyZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX01hdHJpeCogIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgZGVsdGEgKTsKLQotCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX1JlbmRlcmVyX0dldENCb3hGdW5jKSggRlRfUmVuZGVyZXIgICByZW5kZXJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JCb3gqICAgICAgY2JveCApOwotCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX1JlbmRlcmVyX1NldE1vZGVGdW5jKSggRlRfUmVuZGVyZXIgIHJlbmRlcmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgIG1vZGVfdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgIG1vZGVfcHRyICk7Ci0KLS8qIGRlcHJlY2F0ZWQgaWRlbnRpZmllcnMgKi8KLSNkZWZpbmUgRlRSZW5kZXJlcl9yZW5kZXIgIEZUX1JlbmRlcmVyX1JlbmRlckZ1bmMKLSNkZWZpbmUgRlRSZW5kZXJlcl90cmFuc2Zvcm0gIEZUX1JlbmRlcmVyX1RyYW5zZm9ybUZ1bmMKLSNkZWZpbmUgRlRSZW5kZXJlcl9nZXRDQm94ICBGVF9SZW5kZXJlcl9HZXRDQm94RnVuYwotI2RlZmluZSBGVFJlbmRlcmVyX3NldE1vZGUgIEZUX1JlbmRlcmVyX1NldE1vZGVGdW5jCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SZW5kZXJlcl9DbGFzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmVuZGVyZXIgbW9kdWxlIGNsYXNzIGRlc2NyaXB0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByb290ICAgICAgICAgICAgOjogVGhlIHJvb3QgQEZUX01vZHVsZV9DbGFzcyBmaWVsZHMuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2Zvcm1hdCAgICA6OiBUaGUgZ2x5cGggaW1hZ2UgZm9ybWF0IHRoaXMgcmVuZGVyZXIgaGFuZGxlcy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVuZGVyX2dseXBoICAgIDo6IEEgbWV0aG9kIHVzZWQgdG8gcmVuZGVyIHRoZSBpbWFnZSB0aGF0IGlzIGluIGEgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBnaXZlbiBnbHlwaCBzbG90IGludG8gYSBiaXRtYXAuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHJhbnNmb3JtX2dseXBoIDo6IEEgbWV0aG9kIHVzZWQgdG8gdHJhbnNmb3JtIHRoZSBpbWFnZSB0aGF0IGlzIGluICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBhIGdpdmVuIGdseXBoIHNsb3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2V0X2dseXBoX2Nib3ggIDo6IEEgbWV0aG9kIHVzZWQgdG8gYWNjZXNzIHRoZSBnbHlwaCdzIGNib3guICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzZXRfbW9kZSAgICAgICAgOjogQSBtZXRob2QgdXNlZCB0byBwYXNzIGFkZGl0aW9uYWwgcGFyYW1ldGVycy4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhc3Rlcl9jbGFzcyAgICA6OiBGb3IgQEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FIHJlbmRlcmVycyBvbmx5LiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhIHBvaW50ZXIgdG8gaXRzIHJhc3RlcidzIGNsYXNzLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9SZW5kZXJlcl9DbGFzc18KLSAgewotICAgIEZUX01vZHVsZV9DbGFzcyAgICAgICAgICAgIHJvb3Q7Ci0KLSAgICBGVF9HbHlwaF9Gb3JtYXQgICAgICAgICAgICBnbHlwaF9mb3JtYXQ7Ci0KLSAgICBGVF9SZW5kZXJlcl9SZW5kZXJGdW5jICAgICByZW5kZXJfZ2x5cGg7Ci0gICAgRlRfUmVuZGVyZXJfVHJhbnNmb3JtRnVuYyAgdHJhbnNmb3JtX2dseXBoOwotICAgIEZUX1JlbmRlcmVyX0dldENCb3hGdW5jICAgIGdldF9nbHlwaF9jYm94OwotICAgIEZUX1JlbmRlcmVyX1NldE1vZGVGdW5jICAgIHNldF9tb2RlOwotCi0gICAgRlRfUmFzdGVyX0Z1bmNzKiAgICAgICAgICAgcmFzdGVyX2NsYXNzOwotCi0gIH0gRlRfUmVuZGVyZXJfQ2xhc3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfUmVuZGVyZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXRyaWV2ZSB0aGUgY3VycmVudCByZW5kZXJlciBmb3IgYSBnaXZlbiBnbHlwaCBmb3JtYXQuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvcm1hdCAgOjogVGhlIGdseXBoIGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgcmVuZGVyZXIgaGFuZGxlLiAgMH5pZiBub25lIGZvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBtb2R1bGUgYWxyZWFkeSBleGlzdHMgYnkgdGhhdCBuYW1lLCAqLwotICAvKiAgICBvciBpZiB0aGUgbW9kdWxlIHJlcXVpcmVzIGEgdmVyc2lvbiBvZiBGcmVlVHlwZSB0aGF0IGlzIHRvbyBncmVhdC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRvIGFkZCBhIG5ldyByZW5kZXJlciwgc2ltcGx5IHVzZSBARlRfQWRkX01vZHVsZS4gIFRvIHJldHJpZXZlIGEgICAqLwotICAvKiAgICByZW5kZXJlciBieSBpdHMgbmFtZSwgdXNlIEBGVF9HZXRfTW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfUmVuZGVyZXIgKQotICBGVF9HZXRfUmVuZGVyZXIoIEZUX0xpYnJhcnkgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICBGVF9HbHlwaF9Gb3JtYXQgIGZvcm1hdCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X1JlbmRlcmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2V0IHRoZSBjdXJyZW50IHJlbmRlcmVyIHRvIHVzZSwgYW5kIHNldCBhZGRpdGlvbmFsIG1vZGUuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgICA6OiBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVuZGVyZXIgICA6OiBBIGhhbmRsZSB0byB0aGUgcmVuZGVyZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fcGFyYW1zIDo6IFRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhcmFtZXRlcnMgOjogQWRkaXRpb25hbCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluIGNhc2Ugb2Ygc3VjY2VzcywgdGhlIHJlbmRlcmVyIHdpbGwgYmUgdXNlZCB0byBjb252ZXJ0IGdseXBoICAgICAqLwotICAvKiAgICBpbWFnZXMgaW4gdGhlIHJlbmRlcmVyJ3Mga25vd24gZm9ybWF0IGludG8gYml0bWFwcy4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZG9lc24ndCBjaGFuZ2UgdGhlIGN1cnJlbnQgcmVuZGVyZXIgZm9yIG90aGVyIGZvcm1hdHMuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3VycmVudGx5LCBvbmx5IHRoZSBCL1cgcmVuZGVyZXIsIGlmIGNvbXBpbGVkIHdpdGggICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JBU1RFUl9PUFRJT05fQU5USV9BTElBU0lORyAocHJvdmlkaW5nIGEgNS1sZXZlbHMgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbnRpLWFsaWFzaW5nIG1vZGU7IHRoaXMgb3B0aW9uIG11c3QgYmUgc2V0IGRpcmVjdGx5IGluICAgICAgICAgICAgKi8KLSAgLyogICAgYGZ0cmFzdGVyLmMnIGFuZCBpcyB1bmRlZmluZWQgYnkgZGVmYXVsdCkgYWNjZXB0cyBhIHNpbmdsZSB0YWcgICAgICovCi0gIC8qICAgIGBwYWw1JyB0byBzZXQgaXRzIGdyYXkgcGFsZXR0ZSBhcyBhIGNoYXJhY3RlciBzdHJpbmcgd2l0aCAgICAgICAgICAqLwotICAvKiAgICA1fmVsZW1lbnRzLiAgQ29uc2VxdWVudGx5LCB0aGUgdGhpcmQgYW5kIGZvdXJ0aCBhcmd1bWVudCBhcmUgemVybyAgKi8KLSAgLyogICAgbm9ybWFsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU2V0X1JlbmRlcmVyKCBGVF9MaWJyYXJ5ICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcmVyICAgIHJlbmRlcmVyLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1ldGVycyApOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVFJFTkRFUl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRzaXplcy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdHNpemVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNjcwNDUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdHNpemVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzaXplcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHNpemUgb2JqZWN0cyBtYW5hZ2VtZW50IChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDMsIDIwMDQsIDIwMDYsIDIwMDksIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBub3JtYWxseSBub3QgbmVlZCB0byB1c2UgdGhlc2UgZnVuY3Rpb25zLiAgICovCi0gIC8qIEhvd2V2ZXIsIHRoZXkgaGF2ZSBiZWVuIHBsYWNlZCBpbiBhIHB1YmxpYyBBUEkgZm9yIHRoZSByYXJlIGNhc2VzICAgICAqLwotICAvKiB3aGVyZSB0aGV5IGFyZSBuZWVkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVFNJWkVTX0hfXwotI2RlZmluZSBfX0ZUU0laRVNfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZXNfbWFuYWdlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2l6ZSBNYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTWFuYWdpbmcgbXVsdGlwbGUgc2l6ZXMgcGVyIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2hlbiBjcmVhdGluZyBhIG5ldyBmYWNlIG9iamVjdCAoZS5nLiwgd2l0aCBARlRfTmV3X0ZhY2UpLCBhbiAgICAgICovCi0gIC8qICAgIEBGVF9TaXplIG9iamVjdCBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYW5kIHVzZWQgdG8gc3RvcmUgYWxsICAgICAqLwotICAvKiAgICBwaXhlbC1zaXplIGRlcGVuZGVudCBpbmZvcm1hdGlvbiwgYXZhaWxhYmxlIGluIHRoZSBgZmFjZS0+c2l6ZScgICAgKi8KLSAgLyogICAgZmllbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJdCBpcyBob3dldmVyIHBvc3NpYmxlIHRvIGNyZWF0ZSBtb3JlIHNpemVzIGZvciBhIGdpdmVuIGZhY2UsICAgICAgKi8KLSAgLyogICAgbW9zdGx5IGluIG9yZGVyIHRvIG1hbmFnZSBzZXZlcmFsIGNoYXJhY3RlciBwaXhlbCBzaXplcyBvZiB0aGUgICAgICovCi0gIC8qICAgIHNhbWUgZm9udCBmYW1pbHkgYW5kIHN0eWxlLiAgU2VlIEBGVF9OZXdfU2l6ZSBhbmQgQEZUX0RvbmVfU2l6ZS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IEBGVF9TZXRfUGl4ZWxfU2l6ZXMgYW5kIEBGVF9TZXRfQ2hhcl9TaXplIG9ubHkgICAgICAgICAgICovCi0gIC8qICAgIG1vZGlmeSB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgYGFjdGl2ZScgc2l6ZTsgeW91IHRodXMgbmVlZCAgICAqLwotICAvKiAgICB0byB1c2UgQEZUX0FjdGl2YXRlX1NpemUgdG8gY2hhbmdlIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIDk5JSBvZiBhcHBsaWNhdGlvbnMgd29uJ3QgbmVlZCB0aGUgZnVuY3Rpb25zIHByb3ZpZGVkIGhlcmUsICAgICAgICAqLwotICAvKiAgICBlc3BlY2lhbGx5IGlmIHRoZXkgdXNlIHRoZSBjYWNoaW5nIHN1Yi1zeXN0ZW0sIHNvIGJlIGNhdXRpb3VzICAgICAgKi8KLSAgLyogICAgd2hlbiB1c2luZyB0aGVzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX05ld19TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENyZWF0ZSBhIG5ldyBzaXplIG9iamVjdCBmcm9tIGEgZ2l2ZW4gZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gYSBwYXJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFzaXplIDo6IEEgaGFuZGxlIHRvIGEgbmV3IHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFlvdSBuZWVkIHRvIGNhbGwgQEZUX0FjdGl2YXRlX1NpemUgaW4gb3JkZXIgdG8gc2VsZWN0IHRoZSBuZXcgc2l6ZSAqLwotICAvKiAgICBmb3IgdXBjb21pbmcgY2FsbHMgdG8gQEZUX1NldF9QaXhlbF9TaXplcywgQEZUX1NldF9DaGFyX1NpemUsICAgICAgKi8KLSAgLyogICAgQEZUX0xvYWRfR2x5cGgsIEBGVF9Mb2FkX0NoYXIsIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfTmV3X1NpemUoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgRlRfU2l6ZSogIHNpemUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RvbmVfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERpc2NhcmQgYSBnaXZlbiBzaXplIG9iamVjdC4gIE5vdGUgdGhhdCBARlRfRG9uZV9GYWNlICAgICAgICAgICAgICAqLwotICAvKiAgICBhdXRvbWF0aWNhbGx5IGRpc2NhcmRzIGFsbCBzaXplIG9iamVjdHMgYWxsb2NhdGVkIHdpdGggICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX05ld19TaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfRG9uZV9TaXplKCBGVF9TaXplICBzaXplICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BY3RpdmF0ZV9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFdmVuIHRob3VnaCBpdCBpcyBwb3NzaWJsZSB0byBjcmVhdGUgc2V2ZXJhbCBzaXplIG9iamVjdHMgZm9yIGEgICAgKi8KLSAgLyogICAgZ2l2ZW4gZmFjZSAoc2VlIEBGVF9OZXdfU2l6ZSBmb3IgZGV0YWlscyksIGZ1bmN0aW9ucyBsaWtlICAgICAgICAgICovCi0gIC8qICAgIEBGVF9Mb2FkX0dseXBoIG9yIEBGVF9Mb2FkX0NoYXIgb25seSB1c2UgdGhlIG9uZSB0aGF0IGhhcyBiZWVuICAgICAqLwotICAvKiAgICBhY3RpdmF0ZWQgbGFzdCB0byBkZXRlcm1pbmUgdGhlIGBjdXJyZW50IGNoYXJhY3RlciBwaXhlbCBzaXplJy4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gYGFjdGl2YXRlJyBhIHByZXZpb3VzbHkgY3JlYXRlZCBzaXplICAqLwotICAvKiAgICBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplIDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgZmFjZScgaXMgdGhlIHNpemUncyBwYXJlbnQgZmFjZSBvYmplY3QsIHRoaXMgZnVuY3Rpb24gY2hhbmdlcyAgKi8KLSAgLyogICAgdGhlIHZhbHVlIG9mIGBmYWNlLT5zaXplJyB0byB0aGUgaW5wdXQgc2l6ZSBoYW5kbGUuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfQWN0aXZhdGVfU2l6ZSggRlRfU2l6ZSAgc2l6ZSApOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVFNJWkVTX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdHNuYW1lcy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdHNuYW1lcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGFmNDQwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRzbmFtZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHNuYW1lcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgU2ltcGxlIGludGVyZmFjZSB0byBhY2Nlc3MgU0ZOVCBuYW1lIHRhYmxlcyAod2hpY2ggYXJlIHVzZWQgICAgICAgICAgKi8KLS8qICAgIHRvIGhvbGQgZm9udCBuYW1lcywgY29weXJpZ2h0IGluZm8sIG5vdGljZXMsIGV0Yy4pIChzcGVjaWZpY2F0aW9uKS4gICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhpcyBpcyBfbm90XyB1c2VkIHRvIHJldHJpZXZlIGdseXBoIG5hbWVzISAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMywgMjAwNiwgMjAwOSwgMjAxMCwgMjAxMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVF9TRk5UX05BTUVTX0hfXwotI2RlZmluZSBfX0ZUX1NGTlRfTkFNRVNfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2ZudF9uYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU0ZOVCBOYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQWNjZXNzIHRoZSBuYW1lcyBlbWJlZGRlZCBpbiBUcnVlVHlwZSBhbmQgT3BlblR5cGUgZmlsZXMuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIFRydWVUeXBlIGFuZCBPcGVuVHlwZSBzcGVjaWZpY2F0aW9ucyBhbGxvdyB0aGUgaW5jbHVzaW9uIG9mICAgICovCi0gIC8qICAgIGEgc3BlY2lhbCBgbmFtZXMgdGFibGUnIGluIGZvbnQgZmlsZXMuICBUaGlzIHRhYmxlIGNvbnRhaW5zICAgICAgICAqLwotICAvKiAgICB0ZXh0dWFsIChhbmQgaW50ZXJuYXRpb25hbGl6ZWQpIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgZm9udCwgICAgKi8KLSAgLyogICAgbGlrZSBmYW1pbHkgbmFtZSwgY29weXJpZ2h0LCB2ZXJzaW9uLCBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZGVmaW5pdGlvbnMgYmVsb3cgYXJlIHVzZWQgdG8gYWNjZXNzIHRoZW0gaWYgYXZhaWxhYmxlLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgdGhhdCB0aGlzIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggZ2x5cGggbmFtZXMhICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZm50TmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGFuIFNGTlQgYG5hbWUnIHRhYmxlIGVudHJ5LiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwbGF0Zm9ybV9pZCA6OiBUaGUgcGxhdGZvcm0gSUQgZm9yIGBzdHJpbmcnLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGVuY29kaW5nX2lkIDo6IFRoZSBlbmNvZGluZyBJRCBmb3IgYHN0cmluZycuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGFuZ3VhZ2VfaWQgOjogVGhlIGxhbmd1YWdlIElEIGZvciBgc3RyaW5nJy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuYW1lX2lkICAgICA6OiBBbiBpZGVudGlmaWVyIGZvciBgc3RyaW5nJy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmluZyAgICAgIDo6IFRoZSBgbmFtZScgc3RyaW5nLiAgTm90ZSB0aGF0IGl0cyBmb3JtYXQgZGlmZmVycyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBkZXBlbmRpbmcgb24gdGhlIChwbGF0Zm9ybSxlbmNvZGluZykgcGFpci4gIEl0IGNhbiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgYmUgYSBQYXNjYWwgU3RyaW5nLCBhIFVURi0xNiBvbmUsIGV0Yy4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBHZW5lcmFsbHkgc3BlYWtpbmcsIHRoZSBzdHJpbmcgaXMgbm90ICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgemVyby10ZXJtaW5hdGVkLiAgUGxlYXNlIHJlZmVyIHRvIHRoZSBUcnVlVHlwZSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyaW5nX2xlbiAgOjogVGhlIGxlbmd0aCBvZiBgc3RyaW5nJyBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUG9zc2libGUgdmFsdWVzIGZvciBgcGxhdGZvcm1faWQnLCBgZW5jb2RpbmdfaWQnLCBgbGFuZ3VhZ2VfaWQnLCAgICovCi0gIC8qICAgIGFuZCBgbmFtZV9pZCcgYXJlIGdpdmVuIGluIHRoZSBmaWxlIGB0dG5hbWVpZC5oJy4gIEZvciBkZXRhaWxzICAgICAqLwotICAvKiAgICBwbGVhc2UgcmVmZXIgdG8gdGhlIFRydWVUeXBlIG9yIE9wZW5UeXBlIHNwZWNpZmljYXRpb24uICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlZSBhbHNvIEBUVF9QTEFURk9STV9YWFgsIEBUVF9BUFBMRV9JRF9YWFgsIEBUVF9NQUNfSURfWFhYLCAgICAgICAqLwotICAvKiAgICBAVFRfSVNPX0lEX1hYWCwgYW5kIEBUVF9NU19JRF9YWFguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9TZm50TmFtZV8KLSAgewotICAgIEZUX1VTaG9ydCAgcGxhdGZvcm1faWQ7Ci0gICAgRlRfVVNob3J0ICBlbmNvZGluZ19pZDsKLSAgICBGVF9VU2hvcnQgIGxhbmd1YWdlX2lkOwotICAgIEZUX1VTaG9ydCAgbmFtZV9pZDsKLQotICAgIEZUX0J5dGUqICAgc3RyaW5nOyAgICAgIC8qIHRoaXMgc3RyaW5nIGlzICpub3QqIG51bGwtdGVybWluYXRlZCEgKi8KLSAgICBGVF9VSW50ICAgIHN0cmluZ19sZW47ICAvKiBpbiBieXRlcyAqLwotCi0gIH0gRlRfU2ZudE5hbWU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfU2ZudF9OYW1lX0NvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIG5hbWUgc3RyaW5ncyBpbiB0aGUgU0ZOVCBgbmFtZScgdGFibGUuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbnVtYmVyIG9mIHN0cmluZ3MgaW4gdGhlIGBuYW1lJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfVUludCApCi0gIEZUX0dldF9TZm50X05hbWVfQ291bnQoIEZUX0ZhY2UgIGZhY2UgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9TZm50X05hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHJpZXZlIGEgc3RyaW5nIG9mIHRoZSBTRk5UIGBuYW1lJyB0YWJsZSBmb3IgYSBnaXZlbiBpbmRleC4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaWR4ICAgOjogVGhlIGluZGV4IG9mIHRoZSBgbmFtZScgc3RyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYW5hbWUgOjogVGhlIGluZGV4ZWQgQEZUX1NmbnROYW1lIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGBzdHJpbmcnIGFycmF5IHJldHVybmVkIGluIHRoZSBgYW5hbWUnIHN0cnVjdHVyZSBpcyBub3QgICAgICAgICovCi0gIC8qICAgIG51bGwtdGVybWluYXRlZC4gIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZGVhbGxvY2F0ZSBpdCBpZiBpdCBpcyBubyAqLwotICAvKiAgICBsb25nZXIgaW4gdXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZSBARlRfR2V0X1NmbnRfTmFtZV9Db3VudCB0byBnZXQgdGhlIHRvdGFsIG51bWJlciBvZiBhdmFpbGFibGUgICAqLwotICAvKiAgICBgbmFtZScgdGFibGUgZW50cmllcywgdGhlbiBkbyBhIGxvb3AgdW50aWwgeW91IGdldCB0aGUgcmlnaHQgICAgICAgKi8KLSAgLyogICAgcGxhdGZvcm0sIGVuY29kaW5nLCBhbmQgbmFtZSBJRC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X1NmbnRfTmFtZSggRlRfRmFjZSAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgRlRfU2ZudE5hbWUgICphbmFtZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAY29uc3RhbnQ6Ci0gICAqICAgRlRfUEFSQU1fVEFHX0lHTk9SRV9QUkVGRVJSRURfRkFNSUxZCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGNvbnN0YW50IHVzZWQgYXMgdGhlIHRhZyBvZiBARlRfUGFyYW1ldGVyIHN0cnVjdHVyZXMgdG8gbWFrZQotICAgKiAgIEZUX09wZW5fRmFjZSgpIGlnbm9yZSBwcmVmZXJyZWQgZmFtaWx5IHN1YmZhbWlseSBuYW1lcyBpbiBgbmFtZScKLSAgICogICB0YWJsZSBzaW5jZSBPcGVuVHlwZSB2ZXJzaW9uIDEuNC4gIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoCi0gICAqICAgbGVnYWN5IHN5c3RlbXMgdGhhdCBoYXZlIGEgNC1mYWNlLXBlci1mYW1pbHkgcmVzdHJpY3Rpb24uCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9QQVJBTV9UQUdfSUdOT1JFX1BSRUZFUlJFRF9GQU1JTFkgIEZUX01BS0VfVEFHKCAnaScsICdnJywgJ3AnLCAnZicgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAY29uc3RhbnQ6Ci0gICAqICAgRlRfUEFSQU1fVEFHX0lHTk9SRV9QUkVGRVJSRURfU1VCRkFNSUxZCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGNvbnN0YW50IHVzZWQgYXMgdGhlIHRhZyBvZiBARlRfUGFyYW1ldGVyIHN0cnVjdHVyZXMgdG8gbWFrZQotICAgKiAgIEZUX09wZW5fRmFjZSgpIGlnbm9yZSBwcmVmZXJyZWQgc3ViZmFtaWx5IG5hbWVzIGluIGBuYW1lJyB0YWJsZSBzaW5jZQotICAgKiAgIE9wZW5UeXBlIHZlcnNpb24gMS40LiAgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggbGVnYWN5Ci0gICAqICAgc3lzdGVtcyB0aGF0IGhhdmUgYSA0LWZhY2UtcGVyLWZhbWlseSByZXN0cmljdGlvbi4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX1BBUkFNX1RBR19JR05PUkVfUFJFRkVSUkVEX1NVQkZBTUlMWSAgRlRfTUFLRV9UQUcoICdpJywgJ2cnLCAncCcsICdzJyApCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUX1NGTlRfTkFNRVNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0c3Ryb2tlLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0c3Ryb2tlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMzExNzAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdHN0cm9rZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c3Ryb2tlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBwYXRoIHN0cm9rZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDA2LCAyMDA4LCAyMDA5LCAyMDExLTIwMTIsIDIwMTQgYnkgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUX1NUUk9LRV9IX18KLSNkZWZpbmUgX19GVF9TVFJPS0VfSF9fCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0jaW5jbHVkZSBGVF9HTFlQSF9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBzZWN0aW9uOgotICAqICAgIGdseXBoX3N0cm9rZXIKLSAgKgotICAqIEB0aXRsZToKLSAgKiAgICBHbHlwaCBTdHJva2VyCi0gICoKLSAgKiBAYWJzdHJhY3Q6Ci0gICogICAgR2VuZXJhdGluZyBib3JkZXJlZCBhbmQgc3Ryb2tlZCBnbHlwaHMuCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgVGhpcyBjb21wb25lbnQgZ2VuZXJhdGVzIHN0cm9rZWQgb3V0bGluZXMgb2YgYSBnaXZlbiB2ZWN0b3JpYWwKLSAgKiAgICBnbHlwaC4gIEl0IGFsc28gYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgYG91dHNpZGUnIGFuZC9vciB0aGUKLSAgKiAgICBgaW5zaWRlJyBib3JkZXJzIG9mIHRoZSBzdHJva2UuCi0gICoKLSAgKiAgICBUaGlzIGNhbiBiZSB1c2VmdWwgdG8gZ2VuZXJhdGUgYGJvcmRlcmVkJyBnbHlwaCwgaS5lLiwgZ2x5cGhzCi0gICogICAgZGlzcGxheWVkIHdpdGggYSBjb2xvdXJlZCAoYW5kIGFudGktYWxpYXNlZCkgYm9yZGVyIGFyb3VuZCB0aGVpcgotICAqICAgIHNoYXBlLgotICAqCi0gICogQG9yZGVyOgotICAqICAgIEZUX1N0cm9rZXIKLSAgKgotICAqICAgIEZUX1N0cm9rZXJfTGluZUpvaW4KLSAgKiAgICBGVF9TdHJva2VyX0xpbmVDYXAKLSAgKiAgICBGVF9TdHJva2VyQm9yZGVyCi0gICoKLSAgKiAgICBGVF9PdXRsaW5lX0dldEluc2lkZUJvcmRlcgotICAqICAgIEZUX091dGxpbmVfR2V0T3V0c2lkZUJvcmRlcgotICAqCi0gICogICAgRlRfR2x5cGhfU3Ryb2tlCi0gICogICAgRlRfR2x5cGhfU3Ryb2tlQm9yZGVyCi0gICoKLSAgKiAgICBGVF9TdHJva2VyX05ldwotICAqICAgIEZUX1N0cm9rZXJfU2V0Ci0gICogICAgRlRfU3Ryb2tlcl9SZXdpbmQKLSAgKiAgICBGVF9TdHJva2VyX1BhcnNlT3V0bGluZQotICAqICAgIEZUX1N0cm9rZXJfRG9uZQotICAqCi0gICogICAgRlRfU3Ryb2tlcl9CZWdpblN1YlBhdGgKLSAgKiAgICBGVF9TdHJva2VyX0VuZFN1YlBhdGgKLSAgKgotICAqICAgIEZUX1N0cm9rZXJfTGluZVRvCi0gICogICAgRlRfU3Ryb2tlcl9Db25pY1RvCi0gICogICAgRlRfU3Ryb2tlcl9DdWJpY1RvCi0gICoKLSAgKiAgICBGVF9TdHJva2VyX0dldEJvcmRlckNvdW50cwotICAqICAgIEZUX1N0cm9rZXJfRXhwb3J0Qm9yZGVyCi0gICogICAgRlRfU3Ryb2tlcl9HZXRDb3VudHMKLSAgKiAgICBGVF9TdHJva2VyX0V4cG9ydAotICAqCi0gICovCi0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQHR5cGU6Ci0gICogICBGVF9TdHJva2VyCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICBPcGFxdWUgaGFuZGxlIHRvIGEgcGF0aCBzdHJva2VyIG9iamVjdC4KLSAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfU3Ryb2tlclJlY18qICBGVF9TdHJva2VyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIEZUX1N0cm9rZXJfTGluZUpvaW4KLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoZXNlIHZhbHVlcyBkZXRlcm1pbmUgaG93IHR3byBqb2luaW5nIGxpbmVzIGFyZSByZW5kZXJlZAotICAgKiAgIGluIGEgc3Ryb2tlci4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBGVF9TVFJPS0VSX0xJTkVKT0lOX1JPVU5EIDo6Ci0gICAqICAgICBVc2VkIHRvIHJlbmRlciByb3VuZGVkIGxpbmUgam9pbnMuICBDaXJjdWxhciBhcmNzIGFyZSB1c2VkCi0gICAqICAgICB0byBqb2luIHR3byBsaW5lcyBzbW9vdGhseS4KLSAgICoKLSAgICogICBGVF9TVFJPS0VSX0xJTkVKT0lOX0JFVkVMIDo6Ci0gICAqICAgICBVc2VkIHRvIHJlbmRlciBiZXZlbGVkIGxpbmUgam9pbnMuICBUaGUgb3V0ZXIgY29ybmVyIG9mCi0gICAqICAgICB0aGUgam9pbmVkIGxpbmVzIGlzIGZpbGxlZCBieSBlbmNsb3NpbmcgdGhlIHRyaWFuZ3VsYXIKLSAgICogICAgIHJlZ2lvbiBvZiB0aGUgY29ybmVyIHdpdGggYSBzdHJhaWdodCBsaW5lIGJldHdlZW4gdGhlCi0gICAqICAgICBvdXRlciBjb3JuZXJzIG9mIGVhY2ggc3Ryb2tlLgotICAgKgotICAgKiAgIEZUX1NUUk9LRVJfTElORUpPSU5fTUlURVJfRklYRUQgOjoKLSAgICogICAgIFVzZWQgdG8gcmVuZGVyIG1pdGVyZWQgbGluZSBqb2lucywgd2l0aCBmaXhlZCBiZXZlbHMgaWYgdGhlCi0gICAqICAgICBtaXRlciBsaW1pdCBpcyBleGNlZWRlZC4gIFRoZSBvdXRlciBlZGdlcyBvZiB0aGUgc3Ryb2tlcwotICAgKiAgICAgZm9yIHRoZSB0d28gc2VnbWVudHMgYXJlIGV4dGVuZGVkIHVudGlsIHRoZXkgbWVldCBhdCBhbgotICAgKiAgICAgYW5nbGUuICBJZiB0aGUgc2VnbWVudHMgbWVldCBhdCB0b28gc2hhcnAgYW4gYW5nbGUgKHN1Y2gKLSAgICogICAgIHRoYXQgdGhlIG1pdGVyIHdvdWxkIGV4dGVuZCBmcm9tIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlCi0gICAqICAgICBzZWdtZW50cyBhIGRpc3RhbmNlIGdyZWF0ZXIgdGhhbiB0aGUgcHJvZHVjdCBvZiB0aGUgbWl0ZXIKLSAgICogICAgIGxpbWl0IHZhbHVlIGFuZCB0aGUgYm9yZGVyIHJhZGl1cyksIHRoZW4gYSBiZXZlbCBqb2luIChzZWUKLSAgICogICAgIGFib3ZlKSBpcyB1c2VkIGluc3RlYWQuICBUaGlzIHByZXZlbnRzIGxvbmcgc3Bpa2VzIGJlaW5nCi0gICAqICAgICBjcmVhdGVkLiAgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUl9GSVhFRCBnZW5lcmF0ZXMgYSBtaXRlcgotICAgKiAgICAgbGluZSBqb2luIGFzIHVzZWQgaW4gUG9zdFNjcmlwdCBhbmQgUERGLgotICAgKgotICAgKiAgIEZUX1NUUk9LRVJfTElORUpPSU5fTUlURVJfVkFSSUFCTEUgOjoKLSAgICogICBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSIDo6Ci0gICAqICAgICBVc2VkIHRvIHJlbmRlciBtaXRlcmVkIGxpbmUgam9pbnMsIHdpdGggdmFyaWFibGUgYmV2ZWxzIGlmCi0gICAqICAgICB0aGUgbWl0ZXIgbGltaXQgaXMgZXhjZWVkZWQuICBUaGUgaW50ZXJzZWN0aW9uIG9mIHRoZQotICAgKiAgICAgc3Ryb2tlcyBpcyBjbGlwcGVkIGF0IGEgbGluZSBwZXJwZW5kaWN1bGFyIHRvIHRoZSBiaXNlY3RvcgotICAgKiAgICAgb2YgdGhlIGFuZ2xlIGJldHdlZW4gdGhlIHN0cm9rZXMsIGF0IHRoZSBkaXN0YW5jZSBmcm9tIHRoZQotICAgKiAgICAgaW50ZXJzZWN0aW9uIG9mIHRoZSBzZWdtZW50cyBlcXVhbCB0byB0aGUgcHJvZHVjdCBvZiB0aGUKLSAgICogICAgIG1pdGVyIGxpbWl0IHZhbHVlIGFuZCB0aGUgYm9yZGVyIHJhZGl1cy4gIFRoaXMgcHJldmVudHMKLSAgICogICAgIGxvbmcgc3Bpa2VzIGJlaW5nIGNyZWF0ZWQuCi0gICAqICAgICBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSX1ZBUklBQkxFIGdlbmVyYXRlcyBhIG1pdGVyZWQgbGluZQotICAgKiAgICAgam9pbiBhcyB1c2VkIGluIFhQUy4gIEZUX1NUUk9LRVJfTElORUpPSU5fTUlURVIgaXMgYW4gYWxpYXMKLSAgICogICAgIGZvciBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSX1ZBUklBQkxFLCByZXRhaW5lZCBmb3IKLSAgICogICAgIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgotICAgKi8KLSAgdHlwZWRlZiBlbnVtICBGVF9TdHJva2VyX0xpbmVKb2luXwotICB7Ci0gICAgRlRfU1RST0tFUl9MSU5FSk9JTl9ST1VORCAgICAgICAgICA9IDAsCi0gICAgRlRfU1RST0tFUl9MSU5FSk9JTl9CRVZFTCAgICAgICAgICA9IDEsCi0gICAgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUl9WQVJJQUJMRSA9IDIsCi0gICAgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUiAgICAgICAgICA9IEZUX1NUUk9LRVJfTElORUpPSU5fTUlURVJfVkFSSUFCTEUsCi0gICAgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUl9GSVhFRCAgICA9IDMKLQotICB9IEZUX1N0cm9rZXJfTGluZUpvaW47Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGVudW06Ci0gICAqICAgRlRfU3Ryb2tlcl9MaW5lQ2FwCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGVzZSB2YWx1ZXMgZGV0ZXJtaW5lIGhvdyB0aGUgZW5kIG9mIG9wZW5lZCBzdWItcGF0aHMgYXJlCi0gICAqICAgcmVuZGVyZWQgaW4gYSBzdHJva2UuCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgRlRfU1RST0tFUl9MSU5FQ0FQX0JVVFQgOjoKLSAgICogICAgIFRoZSBlbmQgb2YgbGluZXMgaXMgcmVuZGVyZWQgYXMgYSBmdWxsIHN0b3Agb24gdGhlIGxhc3QKLSAgICogICAgIHBvaW50IGl0c2VsZi4KLSAgICoKLSAgICogICBGVF9TVFJPS0VSX0xJTkVDQVBfUk9VTkQgOjoKLSAgICogICAgIFRoZSBlbmQgb2YgbGluZXMgaXMgcmVuZGVyZWQgYXMgYSBoYWxmLWNpcmNsZSBhcm91bmQgdGhlCi0gICAqICAgICBsYXN0IHBvaW50LgotICAgKgotICAgKiAgIEZUX1NUUk9LRVJfTElORUNBUF9TUVVBUkUgOjoKLSAgICogICAgIFRoZSBlbmQgb2YgbGluZXMgaXMgcmVuZGVyZWQgYXMgYSBzcXVhcmUgYXJvdW5kIHRoZQotICAgKiAgICAgbGFzdCBwb2ludC4KLSAgICovCi0gIHR5cGVkZWYgZW51bSAgRlRfU3Ryb2tlcl9MaW5lQ2FwXwotICB7Ci0gICAgRlRfU1RST0tFUl9MSU5FQ0FQX0JVVFQgPSAwLAotICAgIEZUX1NUUk9LRVJfTElORUNBUF9ST1VORCwKLSAgICBGVF9TVFJPS0VSX0xJTkVDQVBfU1FVQVJFCi0KLSAgfSBGVF9TdHJva2VyX0xpbmVDYXA7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGVudW06Ci0gICAqICAgRlRfU3Ryb2tlckJvcmRlcgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhlc2UgdmFsdWVzIGFyZSB1c2VkIHRvIHNlbGVjdCBhIGdpdmVuIHN0cm9rZSBib3JkZXIKLSAgICogICBpbiBARlRfU3Ryb2tlcl9HZXRCb3JkZXJDb3VudHMgYW5kIEBGVF9TdHJva2VyX0V4cG9ydEJvcmRlci4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBGVF9TVFJPS0VSX0JPUkRFUl9MRUZUIDo6Ci0gICAqICAgICBTZWxlY3QgdGhlIGxlZnQgYm9yZGVyLCByZWxhdGl2ZSB0byB0aGUgZHJhd2luZyBkaXJlY3Rpb24uCi0gICAqCi0gICAqICAgRlRfU1RST0tFUl9CT1JERVJfUklHSFQgOjoKLSAgICogICAgIFNlbGVjdCB0aGUgcmlnaHQgYm9yZGVyLCByZWxhdGl2ZSB0byB0aGUgZHJhd2luZyBkaXJlY3Rpb24uCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIEFwcGxpY2F0aW9ucyBhcmUgZ2VuZXJhbGx5IGludGVyZXN0ZWQgaW4gdGhlIGBpbnNpZGUnIGFuZCBgb3V0c2lkZScKLSAgICogICBib3JkZXJzLiAgSG93ZXZlciwgdGhlcmUgaXMgbm8gZGlyZWN0IG1hcHBpbmcgYmV0d2VlbiB0aGVzZSBhbmQgdGhlCi0gICAqICAgYGxlZnQnIGFuZCBgcmlnaHQnIG9uZXMsIHNpbmNlIHRoaXMgcmVhbGx5IGRlcGVuZHMgb24gdGhlIGdseXBoJ3MKLSAgICogICBkcmF3aW5nIG9yaWVudGF0aW9uLCB3aGljaCB2YXJpZXMgYmV0d2VlbiBmb250IGZvcm1hdHMuCi0gICAqCi0gICAqICAgWW91IGNhbiBob3dldmVyIHVzZSBARlRfT3V0bGluZV9HZXRJbnNpZGVCb3JkZXIgYW5kCi0gICAqICAgQEZUX091dGxpbmVfR2V0T3V0c2lkZUJvcmRlciB0byBnZXQgdGhlc2UuCi0gICAqLwotICB0eXBlZGVmIGVudW0gIEZUX1N0cm9rZXJCb3JkZXJfCi0gIHsKLSAgICBGVF9TVFJPS0VSX0JPUkRFUl9MRUZUID0gMCwKLSAgICBGVF9TVFJPS0VSX0JPUkRFUl9SSUdIVAotCi0gIH0gRlRfU3Ryb2tlckJvcmRlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfT3V0bGluZV9HZXRJbnNpZGVCb3JkZXIKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFJldHJpZXZlIHRoZSBARlRfU3Ryb2tlckJvcmRlciB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZQotICAgKiAgIGBpbnNpZGUnIGJvcmRlcnMgb2YgYSBnaXZlbiBvdXRsaW5lLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgb3V0bGluZSA6OgotICAgKiAgICAgVGhlIHNvdXJjZSBvdXRsaW5lIGhhbmRsZS4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBUaGUgYm9yZGVyIGluZGV4LiAgQEZUX1NUUk9LRVJfQk9SREVSX1JJR0hUIGZvciBlbXB0eSBvciBpbnZhbGlkCi0gICAqICAgb3V0bGluZXMuCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX1N0cm9rZXJCb3JkZXIgKQotICBGVF9PdXRsaW5lX0dldEluc2lkZUJvcmRlciggRlRfT3V0bGluZSogIG91dGxpbmUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfT3V0bGluZV9HZXRPdXRzaWRlQm9yZGVyCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXRyaWV2ZSB0aGUgQEZUX1N0cm9rZXJCb3JkZXIgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUKLSAgICogICBgb3V0c2lkZScgYm9yZGVycyBvZiBhIGdpdmVuIG91dGxpbmUuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBvdXRsaW5lIDo6Ci0gICAqICAgICBUaGUgc291cmNlIG91dGxpbmUgaGFuZGxlLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIFRoZSBib3JkZXIgaW5kZXguICBARlRfU1RST0tFUl9CT1JERVJfTEVGVCBmb3IgZW1wdHkgb3IgaW52YWxpZAotICAgKiAgIG91dGxpbmVzLgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9TdHJva2VyQm9yZGVyICkKLSAgRlRfT3V0bGluZV9HZXRPdXRzaWRlQm9yZGVyKCBGVF9PdXRsaW5lKiAgb3V0bGluZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9TdHJva2VyX05ldwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQ3JlYXRlIGEgbmV3IHN0cm9rZXIgb2JqZWN0LgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgbGlicmFyeSA6OgotICAgKiAgICAgRnJlZVR5cGUgbGlicmFyeSBoYW5kbGUuCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgYXN0cm9rZXIgOjoKLSAgICogICAgIEEgbmV3IHN0cm9rZXIgb2JqZWN0IGhhbmRsZS4gIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TdHJva2VyX05ldyggRlRfTGlicmFyeSAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICBGVF9TdHJva2VyICAqYXN0cm9rZXIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU3Ryb2tlcl9TZXQKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFJlc2V0IGEgc3Ryb2tlciBvYmplY3QncyBhdHRyaWJ1dGVzLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgc3Ryb2tlciA6OgotICAgKiAgICAgVGhlIHRhcmdldCBzdHJva2VyIGhhbmRsZS4KLSAgICoKLSAgICogICByYWRpdXMgOjoKLSAgICogICAgIFRoZSBib3JkZXIgcmFkaXVzLgotICAgKgotICAgKiAgIGxpbmVfY2FwIDo6Ci0gICAqICAgICBUaGUgbGluZSBjYXAgc3R5bGUuCi0gICAqCi0gICAqICAgbGluZV9qb2luIDo6Ci0gICAqICAgICBUaGUgbGluZSBqb2luIHN0eWxlLgotICAgKgotICAgKiAgIG1pdGVyX2xpbWl0IDo6Ci0gICAqICAgICBUaGUgbWl0ZXIgbGltaXQgZm9yIHRoZSBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSX0ZJWEVEIGFuZAotICAgKiAgICAgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUl9WQVJJQUJMRSBsaW5lIGpvaW4gc3R5bGVzLAotICAgKiAgICAgZXhwcmVzc2VkIGFzIDE2LjE2IGZpeGVkLXBvaW50IHZhbHVlLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGUgcmFkaXVzIGlzIGV4cHJlc3NlZCBpbiB0aGUgc2FtZSB1bml0cyBhcyB0aGUgb3V0bGluZQotICAgKiAgIGNvb3JkaW5hdGVzLgotICAgKgotICAgKiAgIFRoaXMgZnVuY3Rpb24gY2FsbHMgQEZUX1N0cm9rZXJfUmV3aW5kIGF1dG9tYXRpY2FsbHkuCi0gICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9TdHJva2VyX1NldCggRlRfU3Ryb2tlciAgICAgICAgICAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICAgICAgICAgIHJhZGl1cywKLSAgICAgICAgICAgICAgICAgIEZUX1N0cm9rZXJfTGluZUNhcCAgIGxpbmVfY2FwLAotICAgICAgICAgICAgICAgICAgRlRfU3Ryb2tlcl9MaW5lSm9pbiAgbGluZV9qb2luLAotICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgICAgICAgICAgbWl0ZXJfbGltaXQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU3Ryb2tlcl9SZXdpbmQKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFJlc2V0IGEgc3Ryb2tlciBvYmplY3Qgd2l0aG91dCBjaGFuZ2luZyBpdHMgYXR0cmlidXRlcy4KLSAgICogICBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBiZWZvcmUgYmVnaW5uaW5nIGEgbmV3Ci0gICAqICAgc2VyaWVzIG9mIGNhbGxzIHRvIEBGVF9TdHJva2VyX0JlZ2luU3ViUGF0aCBvcgotICAgKiAgIEBGVF9TdHJva2VyX0VuZFN1YlBhdGguCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBzdHJva2VyIDo6Ci0gICAqICAgICBUaGUgdGFyZ2V0IHN0cm9rZXIgaGFuZGxlLgotICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfU3Ryb2tlcl9SZXdpbmQoIEZUX1N0cm9rZXIgIHN0cm9rZXIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU3Ryb2tlcl9QYXJzZU91dGxpbmUKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgY29udmVuaWVuY2UgZnVuY3Rpb24gdXNlZCB0byBwYXJzZSBhIHdob2xlIG91dGxpbmUgd2l0aAotICAgKiAgIHRoZSBzdHJva2VyLiAgVGhlIHJlc3VsdGluZyBvdXRsaW5lKHMpIGNhbiBiZSByZXRyaWV2ZWQKLSAgICogICBsYXRlciBieSBmdW5jdGlvbnMgbGlrZSBARlRfU3Ryb2tlcl9HZXRDb3VudHMgYW5kIEBGVF9TdHJva2VyX0V4cG9ydC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIHN0cm9rZXIgOjoKLSAgICogICAgIFRoZSB0YXJnZXQgc3Ryb2tlciBoYW5kbGUuCi0gICAqCi0gICAqICAgb3V0bGluZSA6OgotICAgKiAgICAgVGhlIHNvdXJjZSBvdXRsaW5lLgotICAgKgotICAgKiAgIG9wZW5lZCA6OgotICAgKiAgICAgQSBib29sZWFuLiAgSWZ+MSwgdGhlIG91dGxpbmUgaXMgdHJlYXRlZCBhcyBhbiBvcGVuIHBhdGggaW5zdGVhZAotICAgKiAgICAgb2YgYSBjbG9zZWQgb25lLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIElmIGBvcGVuZWQnIGlzfjAgKHRoZSBkZWZhdWx0KSwgdGhlIG91dGxpbmUgaXMgdHJlYXRlZCBhcyBhIGNsb3NlZAotICAgKiAgIHBhdGgsIGFuZCB0aGUgc3Ryb2tlciBnZW5lcmF0ZXMgdHdvIGRpc3RpbmN0IGBib3JkZXInIG91dGxpbmVzLgotICAgKgotICAgKiAgIElmIGBvcGVuZWQnIGlzfjEsIHRoZSBvdXRsaW5lIGlzIHByb2Nlc3NlZCBhcyBhbiBvcGVuIHBhdGgsIGFuZCB0aGUKLSAgICogICBzdHJva2VyIGdlbmVyYXRlcyBhIHNpbmdsZSBgc3Ryb2tlJyBvdXRsaW5lLgotICAgKgotICAgKiAgIFRoaXMgZnVuY3Rpb24gY2FsbHMgQEZUX1N0cm9rZXJfUmV3aW5kIGF1dG9tYXRpY2FsbHkuCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU3Ryb2tlcl9QYXJzZU91dGxpbmUoIEZUX1N0cm9rZXIgICBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgb3BlbmVkICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX1N0cm9rZXJfQmVnaW5TdWJQYXRoCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBTdGFydCBhIG5ldyBzdWItcGF0aCBpbiB0aGUgc3Ryb2tlci4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIHN0cm9rZXIgOjoKLSAgICogICAgIFRoZSB0YXJnZXQgc3Ryb2tlciBoYW5kbGUuCi0gICAqCi0gICAqICAgdG8gOjoKLSAgICogICAgIEEgcG9pbnRlciB0byB0aGUgc3RhcnQgdmVjdG9yLgotICAgKgotICAgKiAgIG9wZW4gOjoKLSAgICogICAgIEEgYm9vbGVhbi4gIElmfjEsIHRoZSBzdWItcGF0aCBpcyB0cmVhdGVkIGFzIGFuIG9wZW4gb25lLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIHdoZW4geW91IG5lZWQgdG8gc3Ryb2tlIGEgcGF0aCB0aGF0IGlzCi0gICAqICAgbm90IHN0b3JlZCBhcyBhbiBARlRfT3V0bGluZSBvYmplY3QuCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU3Ryb2tlcl9CZWdpblN1YlBhdGgoIEZUX1N0cm9rZXIgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgIG9wZW4gKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU3Ryb2tlcl9FbmRTdWJQYXRoCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBDbG9zZSB0aGUgY3VycmVudCBzdWItcGF0aCBpbiB0aGUgc3Ryb2tlci4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIHN0cm9rZXIgOjoKLSAgICogICAgIFRoZSB0YXJnZXQgc3Ryb2tlciBoYW5kbGUuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgWW91IHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgQEZUX1N0cm9rZXJfQmVnaW5TdWJQYXRoLgotICAgKiAgIElmIHRoZSBzdWJwYXRoIHdhcyBub3QgYG9wZW5lZCcsIHRoaXMgZnVuY3Rpb24gYGRyYXdzJyBhCi0gICAqICAgc2luZ2xlIGxpbmUgc2VnbWVudCB0byB0aGUgc3RhcnQgcG9zaXRpb24gd2hlbiBuZWVkZWQuCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU3Ryb2tlcl9FbmRTdWJQYXRoKCBGVF9TdHJva2VyICBzdHJva2VyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX1N0cm9rZXJfTGluZVRvCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBgRHJhdycgYSBzaW5nbGUgbGluZSBzZWdtZW50IGluIHRoZSBzdHJva2VyJ3MgY3VycmVudCBzdWItcGF0aCwKLSAgICogICBmcm9tIHRoZSBsYXN0IHBvc2l0aW9uLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgc3Ryb2tlciA6OgotICAgKiAgICAgVGhlIHRhcmdldCBzdHJva2VyIGhhbmRsZS4KLSAgICoKLSAgICogICB0byA6OgotICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBwb2ludC4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBiZXR3ZWVuIEBGVF9TdHJva2VyX0JlZ2luU3ViUGF0aCBhbmQKLSAgICogICBARlRfU3Ryb2tlcl9FbmRTdWJQYXRoLgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1N0cm9rZXJfTGluZVRvKCBGVF9TdHJva2VyICBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgdG8gKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU3Ryb2tlcl9Db25pY1RvCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBgRHJhdycgYSBzaW5nbGUgcXVhZHJhdGljIELDqXppZXIgaW4gdGhlIHN0cm9rZXIncyBjdXJyZW50IHN1Yi1wYXRoLAotICAgKiAgIGZyb20gdGhlIGxhc3QgcG9zaXRpb24uCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBzdHJva2VyIDo6Ci0gICAqICAgICBUaGUgdGFyZ2V0IHN0cm9rZXIgaGFuZGxlLgotICAgKgotICAgKiAgIGNvbnRyb2wgOjoKLSAgICogICAgIEEgcG9pbnRlciB0byBhIELDqXppZXIgY29udHJvbCBwb2ludC4KLSAgICoKLSAgICogICB0byA6OgotICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBwb2ludC4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBiZXR3ZWVuIEBGVF9TdHJva2VyX0JlZ2luU3ViUGF0aCBhbmQKLSAgICogICBARlRfU3Ryb2tlcl9FbmRTdWJQYXRoLgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1N0cm9rZXJfQ29uaWNUbyggRlRfU3Ryb2tlciAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBjb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHRvICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX1N0cm9rZXJfQ3ViaWNUbwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgYERyYXcnIGEgc2luZ2xlIGN1YmljIELDqXppZXIgaW4gdGhlIHN0cm9rZXIncyBjdXJyZW50IHN1Yi1wYXRoLAotICAgKiAgIGZyb20gdGhlIGxhc3QgcG9zaXRpb24uCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBzdHJva2VyIDo6Ci0gICAqICAgICBUaGUgdGFyZ2V0IHN0cm9rZXIgaGFuZGxlLgotICAgKgotICAgKiAgIGNvbnRyb2wxIDo6Ci0gICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIGZpcnN0IELDqXppZXIgY29udHJvbCBwb2ludC4KLSAgICoKLSAgICogICBjb250cm9sMiA6OgotICAgKiAgICAgQSBwb2ludGVyIHRvIHNlY29uZCBCw6l6aWVyIGNvbnRyb2wgcG9pbnQuCi0gICAqCi0gICAqICAgdG8gOjoKLSAgICogICAgIEEgcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gcG9pbnQuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgWW91IHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gYmV0d2VlbiBARlRfU3Ryb2tlcl9CZWdpblN1YlBhdGggYW5kCi0gICAqICAgQEZUX1N0cm9rZXJfRW5kU3ViUGF0aC4KLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TdHJva2VyX0N1YmljVG8oIEZUX1N0cm9rZXIgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgY29udHJvbDEsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgY29udHJvbDIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgdG8gKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU3Ryb2tlcl9HZXRCb3JkZXJDb3VudHMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIENhbGwgdGhpcyBmdW5jdGlvbiBvbmNlIHlvdSBoYXZlIGZpbmlzaGVkIHBhcnNpbmcgeW91ciBwYXRocwotICAgKiAgIHdpdGggdGhlIHN0cm9rZXIuICBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgcG9pbnRzIGFuZAotICAgKiAgIGNvbnRvdXJzIG5lY2Vzc2FyeSB0byBleHBvcnQgb25lIG9mIHRoZSBgYm9yZGVyJyBvciBgc3Ryb2tlJwotICAgKiAgIG91dGxpbmVzIGdlbmVyYXRlZCBieSB0aGUgc3Ryb2tlci4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIHN0cm9rZXIgOjoKLSAgICogICAgIFRoZSB0YXJnZXQgc3Ryb2tlciBoYW5kbGUuCi0gICAqCi0gICAqICAgYm9yZGVyIDo6Ci0gICAqICAgICBUaGUgYm9yZGVyIGluZGV4LgotICAgKgotICAgKiBAb3V0cHV0OgotICAgKiAgIGFudW1fcG9pbnRzIDo6Ci0gICAqICAgICBUaGUgbnVtYmVyIG9mIHBvaW50cy4KLSAgICoKLSAgICogICBhbnVtX2NvbnRvdXJzIDo6Ci0gICAqICAgICBUaGUgbnVtYmVyIG9mIGNvbnRvdXJzLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFdoZW4gYW4gb3V0bGluZSwgb3IgYSBzdWItcGF0aCwgaXMgYGNsb3NlZCcsIHRoZSBzdHJva2VyIGdlbmVyYXRlcwotICAgKiAgIHR3byBpbmRlcGVuZGVudCBgYm9yZGVyJyBvdXRsaW5lcywgbmFtZWQgYGxlZnQnIGFuZCBgcmlnaHQnLgotICAgKgotICAgKiAgIFdoZW4gdGhlIG91dGxpbmUsIG9yIGEgc3ViLXBhdGgsIGlzIGBvcGVuZWQnLCB0aGUgc3Ryb2tlciBtZXJnZXMKLSAgICogICB0aGUgYGJvcmRlcicgb3V0bGluZXMgd2l0aCBjYXBzLiAgVGhlIGBsZWZ0JyBib3JkZXIgcmVjZWl2ZXMgYWxsCi0gICAqICAgcG9pbnRzLCB3aGlsZSB0aGUgYHJpZ2h0JyBib3JkZXIgYmVjb21lcyBlbXB0eS4KLSAgICoKLSAgICogICBVc2UgdGhlIGZ1bmN0aW9uIEBGVF9TdHJva2VyX0dldENvdW50cyBpbnN0ZWFkIGlmIHlvdSB3YW50IHRvCi0gICAqICAgcmV0cmlldmUgdGhlIGNvdW50cyBhc3NvY2lhdGVkIHRvIGJvdGggYm9yZGVycy4KLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TdHJva2VyX0dldEJvcmRlckNvdW50cyggRlRfU3Ryb2tlciAgICAgICAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cm9rZXJCb3JkZXIgIGJvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgKmFudW1fcG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAqYW51bV9jb250b3VycyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9TdHJva2VyX0V4cG9ydEJvcmRlcgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQ2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIEBGVF9TdHJva2VyX0dldEJvcmRlckNvdW50cyB0bwotICAgKiAgIGV4cG9ydCB0aGUgY29ycmVzcG9uZGluZyBib3JkZXIgdG8geW91ciBvd24gQEZUX091dGxpbmUKLSAgICogICBzdHJ1Y3R1cmUuCi0gICAqCi0gICAqICAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gYXBwZW5kcyB0aGUgYm9yZGVyIHBvaW50cyBhbmQKLSAgICogICBjb250b3VycyB0byB5b3VyIG91dGxpbmUsIGJ1dCBkb2VzIG5vdCB0cnkgdG8gcmVzaXplIGl0cwotICAgKiAgIGFycmF5cy4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIHN0cm9rZXIgOjoKLSAgICogICAgIFRoZSB0YXJnZXQgc3Ryb2tlciBoYW5kbGUuCi0gICAqCi0gICAqICAgYm9yZGVyIDo6Ci0gICAqICAgICBUaGUgYm9yZGVyIGluZGV4LgotICAgKgotICAgKiAgIG91dGxpbmUgOjoKLSAgICogICAgIFRoZSB0YXJnZXQgb3V0bGluZSBoYW5kbGUuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIEFsd2F5cyBjYWxsIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgQEZUX1N0cm9rZXJfR2V0Qm9yZGVyQ291bnRzIHRvCi0gICAqICAgZ2V0IHN1cmUgdGhhdCB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpbiB5b3VyIEBGVF9PdXRsaW5lIG9iamVjdCB0bwotICAgKiAgIHJlY2VpdmUgYWxsIG5ldyBkYXRhLgotICAgKgotICAgKiAgIFdoZW4gYW4gb3V0bGluZSwgb3IgYSBzdWItcGF0aCwgaXMgYGNsb3NlZCcsIHRoZSBzdHJva2VyIGdlbmVyYXRlcwotICAgKiAgIHR3byBpbmRlcGVuZGVudCBgYm9yZGVyJyBvdXRsaW5lcywgbmFtZWQgYGxlZnQnIGFuZCBgcmlnaHQnLgotICAgKgotICAgKiAgIFdoZW4gdGhlIG91dGxpbmUsIG9yIGEgc3ViLXBhdGgsIGlzIGBvcGVuZWQnLCB0aGUgc3Ryb2tlciBtZXJnZXMKLSAgICogICB0aGUgYGJvcmRlcicgb3V0bGluZXMgd2l0aCBjYXBzLiAgVGhlIGBsZWZ0JyBib3JkZXIgcmVjZWl2ZXMgYWxsCi0gICAqICAgcG9pbnRzLCB3aGlsZSB0aGUgYHJpZ2h0JyBib3JkZXIgYmVjb21lcyBlbXB0eS4KLSAgICoKLSAgICogICBVc2UgdGhlIGZ1bmN0aW9uIEBGVF9TdHJva2VyX0V4cG9ydCBpbnN0ZWFkIGlmIHlvdSB3YW50IHRvCi0gICAqICAgcmV0cmlldmUgYWxsIGJvcmRlcnMgYXQgb25jZS4KLSAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX1N0cm9rZXJfRXhwb3J0Qm9yZGVyKCBGVF9TdHJva2VyICAgICAgICBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3Ryb2tlckJvcmRlciAgYm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgICAgb3V0bGluZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9TdHJva2VyX0dldENvdW50cwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQ2FsbCB0aGlzIGZ1bmN0aW9uIG9uY2UgeW91IGhhdmUgZmluaXNoZWQgcGFyc2luZyB5b3VyIHBhdGhzCi0gICAqICAgd2l0aCB0aGUgc3Ryb2tlci4gIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBwb2ludHMgYW5kCi0gICAqICAgY29udG91cnMgbmVjZXNzYXJ5IHRvIGV4cG9ydCBhbGwgcG9pbnRzL2JvcmRlcnMgZnJvbSB0aGUgc3Ryb2tlZAotICAgKiAgIG91dGxpbmUvcGF0aC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIHN0cm9rZXIgOjoKLSAgICogICAgIFRoZSB0YXJnZXQgc3Ryb2tlciBoYW5kbGUuCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgYW51bV9wb2ludHMgOjoKLSAgICogICAgIFRoZSBudW1iZXIgb2YgcG9pbnRzLgotICAgKgotICAgKiAgIGFudW1fY29udG91cnMgOjoKLSAgICogICAgIFRoZSBudW1iZXIgb2YgY29udG91cnMuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TdHJva2VyX0dldENvdW50cyggRlRfU3Ryb2tlciAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgKmFudW1fcG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAqYW51bV9jb250b3VycyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9TdHJva2VyX0V4cG9ydAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQ2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIEBGVF9TdHJva2VyX0dldEJvcmRlckNvdW50cyB0bwotICAgKiAgIGV4cG9ydCBhbGwgYm9yZGVycyB0byB5b3VyIG93biBARlRfT3V0bGluZSBzdHJ1Y3R1cmUuCi0gICAqCi0gICAqICAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gYXBwZW5kcyB0aGUgYm9yZGVyIHBvaW50cyBhbmQKLSAgICogICBjb250b3VycyB0byB5b3VyIG91dGxpbmUsIGJ1dCBkb2VzIG5vdCB0cnkgdG8gcmVzaXplIGl0cwotICAgKiAgIGFycmF5cy4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIHN0cm9rZXIgOjoKLSAgICogICAgIFRoZSB0YXJnZXQgc3Ryb2tlciBoYW5kbGUuCi0gICAqCi0gICAqICAgb3V0bGluZSA6OgotICAgKiAgICAgVGhlIHRhcmdldCBvdXRsaW5lIGhhbmRsZS4KLSAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX1N0cm9rZXJfRXhwb3J0KCBGVF9TdHJva2VyICAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICBvdXRsaW5lICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX1N0cm9rZXJfRG9uZQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgRGVzdHJveSBhIHN0cm9rZXIgb2JqZWN0LgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgc3Ryb2tlciA6OgotICAgKiAgICAgQSBzdHJva2VyIGhhbmRsZS4gIENhbiBiZSBOVUxMLgotICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfU3Ryb2tlcl9Eb25lKCBGVF9TdHJva2VyICBzdHJva2VyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX0dseXBoX1N0cm9rZQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgU3Ryb2tlIGEgZ2l2ZW4gb3V0bGluZSBnbHlwaCBvYmplY3Qgd2l0aCBhIGdpdmVuIHN0cm9rZXIuCi0gICAqCi0gICAqIEBpbm91dDoKLSAgICogICBwZ2x5cGggOjoKLSAgICogICAgIFNvdXJjZSBnbHlwaCBoYW5kbGUgb24gaW5wdXQsIG5ldyBnbHlwaCBoYW5kbGUgb24gb3V0cHV0LgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgc3Ryb2tlciA6OgotICAgKiAgICAgQSBzdHJva2VyIGhhbmRsZS4KLSAgICoKLSAgICogICBkZXN0cm95IDo6Ci0gICAqICAgICBBIEJvb2xlYW4uICBJZn4xLCB0aGUgc291cmNlIGdseXBoIG9iamVjdCBpcyBkZXN0cm95ZWQKLSAgICogICAgIG9uIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoZSBzb3VyY2UgZ2x5cGggaXMgdW50b3VjaGVkIGluIGNhc2Ugb2YgZXJyb3IuCi0gICAqCi0gICAqICAgQWRkaW5nIHN0cm9rZSBtYXkgeWllbGQgYSBzaWduaWZpY2FudGx5IHdpZGVyIGFuZCB0YWxsZXIgZ2x5cGgKLSAgICogICBkZXBlbmRpbmcgb24gaG93IGxhcmdlIG9mIGEgcmFkaXVzIHdhcyB1c2VkIHRvIHN0cm9rZSB0aGUgZ2x5cGguICBZb3UKLSAgICogICBtYXkgbmVlZCB0byBtYW51YWxseSBhZGp1c3QgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgYWR2YW5jZSBhbW91bnRzCi0gICAqICAgdG8gYWNjb3VudCBmb3IgdGhpcyBhZGRlZCBzaXplLgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dseXBoX1N0cm9rZSggRlRfR2x5cGggICAgKnBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICBGVF9TdHJva2VyICAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgZGVzdHJveSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9HbHlwaF9TdHJva2VCb3JkZXIKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFN0cm9rZSBhIGdpdmVuIG91dGxpbmUgZ2x5cGggb2JqZWN0IHdpdGggYSBnaXZlbiBzdHJva2VyLCBidXQKLSAgICogICBvbmx5IHJldHVybiBlaXRoZXIgaXRzIGluc2lkZSBvciBvdXRzaWRlIGJvcmRlci4KLSAgICoKLSAgICogQGlub3V0OgotICAgKiAgIHBnbHlwaCA6OgotICAgKiAgICAgU291cmNlIGdseXBoIGhhbmRsZSBvbiBpbnB1dCwgbmV3IGdseXBoIGhhbmRsZSBvbiBvdXRwdXQuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBzdHJva2VyIDo6Ci0gICAqICAgICBBIHN0cm9rZXIgaGFuZGxlLgotICAgKgotICAgKiAgIGluc2lkZSA6OgotICAgKiAgICAgQSBCb29sZWFuLiAgSWZ+MSwgcmV0dXJuIHRoZSBpbnNpZGUgYm9yZGVyLCBvdGhlcndpc2UKLSAgICogICAgIHRoZSBvdXRzaWRlIGJvcmRlci4KLSAgICoKLSAgICogICBkZXN0cm95IDo6Ci0gICAqICAgICBBIEJvb2xlYW4uICBJZn4xLCB0aGUgc291cmNlIGdseXBoIG9iamVjdCBpcyBkZXN0cm95ZWQKLSAgICogICAgIG9uIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoZSBzb3VyY2UgZ2x5cGggaXMgdW50b3VjaGVkIGluIGNhc2Ugb2YgZXJyb3IuCi0gICAqCi0gICAqICAgQWRkaW5nIHN0cm9rZSBtYXkgeWllbGQgYSBzaWduaWZpY2FudGx5IHdpZGVyIGFuZCB0YWxsZXIgZ2x5cGgKLSAgICogICBkZXBlbmRpbmcgb24gaG93IGxhcmdlIG9mIGEgcmFkaXVzIHdhcyB1c2VkIHRvIHN0cm9rZSB0aGUgZ2x5cGguICBZb3UKLSAgICogICBtYXkgbmVlZCB0byBtYW51YWxseSBhZGp1c3QgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgYWR2YW5jZSBhbW91bnRzCi0gICAqICAgdG8gYWNjb3VudCBmb3IgdGhpcyBhZGRlZCBzaXplLgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dseXBoX1N0cm9rZUJvcmRlciggRlRfR2x5cGggICAgKnBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJva2VyICAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgaW5zaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICBkZXN0cm95ICk7Ci0KLSAgLyogKi8KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVF9TVFJPS0VfSF9fICovCi0KLQotLyogRU5EICovCi0KLQotLyogTG9jYWwgVmFyaWFibGVzOiAqLwotLyogY29kaW5nOiB1dGYtOCAgICAqLwotLyogRW5kOiAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdHN5bnRoLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0c3ludGguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBlYTczMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0c3ludGguaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c3ludGguaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBzeW50aGVzaXppbmcgY29kZSBmb3IgZW1ib2xkZW5pbmcgYW5kIHNsYW50aW5nICAgICAgICAgICAgICAqLwotLyogICAgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDAtMjAwMSwgMjAwMywgMjAwNiwgMjAwOCwgMjAxMiwgMjAxMyBieSAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiAgICAgICAgV0FSTklORywgVEhJUyBJUyBBTFBIQSBDT0RFISAgVEhJUyBBUEkgICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKiogICAgSVMgRFVFIFRPIENIQU5HRSBVTlRJTCBTVFJJQ1RMWSBOT1RJRklFRCBCWSBUSEUgICAgKioqKioqKioqLwotICAvKioqKioqKioqICAgICAgICAgICAgRlJFRVRZUEUgREVWRUxPUE1FTlQgVEVBTSAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIE1haW4gcmVhc29uIGZvciBub3QgbGlmdGluZyB0aGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIHRvIGEgICovCi0gIC8qIGBzdGFuZGFyZCcgQVBJIGlzIHRoYXQgdGhlIHVzZWQgcGFyYW1ldGVycyBmb3IgZW1ib2xkZW5pbmcgYW5kICovCi0gIC8qIHNsYW50aW5nIGFyZSBub3QgY29uZmlndXJhYmxlLiAgQ29uc2lkZXIgdGhlIGZ1bmN0aW9ucyBhcyBhICAgICovCi0gIC8qIGNvZGUgcmVzb3VyY2UgdGhhdCBzaG91bGQgYmUgY29waWVkIGludG8gdGhlIGFwcGxpY2F0aW9uIGFuZCAgICovCi0gIC8qIGFkYXB0ZWQgdG8gdGhlIHBhcnRpY3VsYXIgbmVlZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLQotI2lmbmRlZiBfX0ZUU1lOVEhfSF9fCi0jZGVmaW5lIF9fRlRTWU5USF9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgLyogRW1ib2xkZW4gYSBnbHlwaCBieSBhIGByZWFzb25hYmxlJyB2YWx1ZSAod2hpY2ggaXMgaGlnaGx5IGEgbWF0dGVyIG9mICovCi0gIC8qIHRhc3RlKS4gIFRoaXMgZnVuY3Rpb24gaXMgYWN0dWFsbHkgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiwgcHJvdmlkaW5nICAqLwotICAvKiBhIHdyYXBwZXIgZm9yIEBGVF9PdXRsaW5lX0VtYm9sZGVuIGFuZCBARlRfQml0bWFwX0VtYm9sZGVuLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZvciBlbWJvbGRlbmVkIG91dGxpbmVzIHRoZSBoZWlnaHQsIHdpZHRoLCBhbmQgYWR2YW5jZSBtZXRyaWNzIGFyZSAgICAqLwotICAvKiBpbmNyZWFzZWQgYnkgdGhlIHN0cmVuZ3RoIG9mIHRoZSBlbWJvbGRlbmluZy4gIFlvdSBjYW4gYWxzbyBjYWxsICAgICAgKi8KLSAgLyogQEZUX091dGxpbmVfR2V0X0NCb3ggdG8gZ2V0IHByZWNpc2UgdmFsdWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX0dseXBoU2xvdF9FbWJvbGRlbiggRlRfR2x5cGhTbG90ICBzbG90ICk7Ci0KLSAgLyogU2xhbnQgYW4gb3V0bGluZSBnbHlwaCB0byB0aGUgcmlnaHQgYnkgYWJvdXQgMTIgZGVncmVlcy4gKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfR2x5cGhTbG90X09ibGlxdWUoIEZUX0dseXBoU2xvdCAgc2xvdCApOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVFNZTlRIX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdHN5c3RlbS5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdHN5c3RlbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzk1Y2JiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnRzeXN0ZW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDM0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHN5c3RlbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgbG93LWxldmVsIHN5c3RlbSBpbnRlcmZhY2UgZGVmaW5pdGlvbiAoc3BlY2lmaWNhdGlvbikuICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwNSwgMjAxMCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVFNZU1RFTV9IX18KLSNkZWZpbmUgX19GVFNZU1RFTV9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgc3lzdGVtX2ludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgU3lzdGVtIEludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSG93IEZyZWVUeXBlIG1hbmFnZXMgbWVtb3J5IGFuZCBpL28uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHZhcmlvdXMgZGVmaW5pdGlvbnMgcmVsYXRlZCB0byBtZW1vcnkgICAgICAgICAqLwotICAvKiAgIG1hbmFnZW1lbnQgYW5kIGkvbyBhY2Nlc3MuICBZb3UgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgICAgICAgICAgICAgKi8KLSAgLyogICBpbmZvcm1hdGlvbiBpZiB5b3Ugd2FudCB0byB1c2UgYSBjdXN0b20gbWVtb3J5IG1hbmFnZXIgb3IgeW91IG93biAgICovCi0gIC8qICAgaS9vIHN0cmVhbXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgTSBFIE0gTyBSIFkgICBNIEEgTiBBIEcgRSBNIEUgTiBUICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAdHlwZToKLSAgICogICBGVF9NZW1vcnkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgaGFuZGxlIHRvIGEgZ2l2ZW4gbWVtb3J5IG1hbmFnZXIgb2JqZWN0LCBkZWZpbmVkIHdpdGggYW4KLSAgICogICBARlRfTWVtb3J5UmVjIHN0cnVjdHVyZS4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX01lbW9yeVJlY18qICBGVF9NZW1vcnk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgRlRfQWxsb2NfRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBmdW5jdGlvbiB1c2VkIHRvIGFsbG9jYXRlIGBzaXplJyBieXRlcyBmcm9tIGBtZW1vcnknLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgbWVtb3J5IDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIG1lbW9yeSBtYW5hZ2VyLgotICAgKgotICAgKiAgIHNpemUgOjoKLSAgICogICAgIFRoZSBzaXplIGluIGJ5dGVzIHRvIGFsbG9jYXRlLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEFkZHJlc3Mgb2YgbmV3IG1lbW9yeSBibG9jay4gIDB+aW4gY2FzZSBvZiBmYWlsdXJlLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiB2b2lkKgotICAoKkZUX0FsbG9jX0Z1bmMpKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICBzaXplICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgRlRfRnJlZV9GdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGZ1bmN0aW9uIHVzZWQgdG8gcmVsZWFzZSBhIGdpdmVuIGJsb2NrIG9mIG1lbW9yeS4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIG1lbW9yeSA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBtZW1vcnkgbWFuYWdlci4KLSAgICoKLSAgICogICBibG9jayA6OgotICAgKiAgICAgVGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBtZW1vcnkgYmxvY2suCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9GcmVlX0Z1bmMpKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgIGJsb2NrICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgRlRfUmVhbGxvY19GdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGZ1bmN0aW9uIHVzZWQgdG8gcmUtYWxsb2NhdGUgYSBnaXZlbiBibG9jayBvZiBtZW1vcnkuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBtZW1vcnkgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgbWVtb3J5IG1hbmFnZXIuCi0gICAqCi0gICAqICAgY3VyX3NpemUgOjoKLSAgICogICAgIFRoZSBibG9jaydzIGN1cnJlbnQgc2l6ZSBpbiBieXRlcy4KLSAgICoKLSAgICogICBuZXdfc2l6ZSA6OgotICAgKiAgICAgVGhlIGJsb2NrJ3MgcmVxdWVzdGVkIG5ldyBzaXplLgotICAgKgotICAgKiAgIGJsb2NrIDo6Ci0gICAqICAgICBUaGUgYmxvY2sncyBjdXJyZW50IGFkZHJlc3MuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgTmV3IGJsb2NrIGFkZHJlc3MuICAwfmluIGNhc2Ugb2YgbWVtb3J5IHNob3J0YWdlLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBJbiBjYXNlIG9mIGVycm9yLCB0aGUgb2xkIGJsb2NrIG11c3Qgc3RpbGwgYmUgYXZhaWxhYmxlLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiB2b2lkKgotICAoKkZUX1JlYWxsb2NfRnVuYykoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgY3VyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICBuZXdfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgIGJsb2NrICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAc3RydWN0OgotICAgKiAgIEZUX01lbW9yeVJlYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSBhIGdpdmVuIG1lbW9yeSBtYW5hZ2VyIHRvIEZyZWVUeXBlfjIuCi0gICAqCi0gICAqIEBmaWVsZHM6Ci0gICAqICAgdXNlciA6OgotICAgKiAgICAgQSBnZW5lcmljIHR5cGVsZXNzIHBvaW50ZXIgZm9yIHVzZXIgZGF0YS4KLSAgICoKLSAgICogICBhbGxvYyA6OgotICAgKiAgICAgQSBwb2ludGVyIHR5cGUgdG8gYW4gYWxsb2NhdGlvbiBmdW5jdGlvbi4KLSAgICoKLSAgICogICBmcmVlIDo6Ci0gICAqICAgICBBIHBvaW50ZXIgdHlwZSB0byBhbiBtZW1vcnkgZnJlZWluZyBmdW5jdGlvbi4KLSAgICoKLSAgICogICByZWFsbG9jIDo6Ci0gICAqICAgICBBIHBvaW50ZXIgdHlwZSB0byBhIHJlYWxsb2NhdGlvbiBmdW5jdGlvbi4KLSAgICoKLSAgICovCi0gIHN0cnVjdCAgRlRfTWVtb3J5UmVjXwotICB7Ci0gICAgdm9pZCogICAgICAgICAgICB1c2VyOwotICAgIEZUX0FsbG9jX0Z1bmMgICAgYWxsb2M7Ci0gICAgRlRfRnJlZV9GdW5jICAgICBmcmVlOwotICAgIEZUX1JlYWxsb2NfRnVuYyAgcmVhbGxvYzsKLSAgfTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIEkgLyBPICAgTSBBIE4gQSBHIEUgTSBFIE4gVCAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEB0eXBlOgotICAgKiAgIEZUX1N0cmVhbQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBoYW5kbGUgdG8gYW4gaW5wdXQgc3RyZWFtLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfU3RyZWFtUmVjXyogIEZUX1N0cmVhbTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzdHJ1Y3Q6Ci0gICAqICAgRlRfU3RyZWFtRGVzYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSB1bmlvbiB0eXBlIHVzZWQgdG8gc3RvcmUgZWl0aGVyIGEgbG9uZyBvciBhIHBvaW50ZXIuICBUaGlzIGlzIHVzZWQKLSAgICogICB0byBzdG9yZSBhIGZpbGUgZGVzY3JpcHRvciBvciBhIGBGSUxFKicgaW4gYW4gaW5wdXQgc3RyZWFtLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiB1bmlvbiAgRlRfU3RyZWFtRGVzY18KLSAgewotICAgIGxvbmcgICB2YWx1ZTsKLSAgICB2b2lkKiAgcG9pbnRlcjsKLQotICB9IEZUX1N0cmVhbURlc2M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgRlRfU3RyZWFtX0lvRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBmdW5jdGlvbiB1c2VkIHRvIHNlZWsgYW5kIHJlYWQgZGF0YSBmcm9tIGEgZ2l2ZW4gaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgc3RyZWFtIDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIHN0cmVhbS4KLSAgICoKLSAgICogICBvZmZzZXQgOjoKLSAgICogICAgIFRoZSBvZmZzZXQgb2YgcmVhZCBpbiBzdHJlYW0gKGFsd2F5cyBmcm9tIHN0YXJ0KS4KLSAgICoKLSAgICogICBidWZmZXIgOjoKLSAgICogICAgIFRoZSBhZGRyZXNzIG9mIHRoZSByZWFkIGJ1ZmZlci4KLSAgICoKLSAgICogICBjb3VudCA6OgotICAgKiAgICAgVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIHN0cmVhbS4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBUaGUgbnVtYmVyIG9mIGJ5dGVzIGVmZmVjdGl2ZWx5IHJlYWQgYnkgdGhlIHN0cmVhbS4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhpcyBmdW5jdGlvbiBtaWdodCBiZSBjYWxsZWQgdG8gcGVyZm9ybSBhIHNlZWsgb3Igc2tpcCBvcGVyYXRpb24KLSAgICogICB3aXRoIGEgYGNvdW50JyBvZn4wLiAgQSBub24temVybyByZXR1cm4gdmFsdWUgdGhlbiBpbmRpY2F0ZXMgYW4KLSAgICogICBlcnJvci4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgdW5zaWduZWQgbG9uZwotICAoKkZUX1N0cmVhbV9Jb0Z1bmMpKCBGVF9TdHJlYW0gICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgY291bnQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdHlwZToKLSAgICogICBGVF9TdHJlYW1fQ2xvc2VGdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGZ1bmN0aW9uIHVzZWQgdG8gY2xvc2UgYSBnaXZlbiBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogIHN0cmVhbSA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBzdHJlYW0uCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9TdHJlYW1fQ2xvc2VGdW5jKSggRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzdHJ1Y3Q6Ci0gICAqICAgRlRfU3RyZWFtUmVjCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIHN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIGFuIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGJhc2UgOjoKLSAgICogICAgIEZvciBtZW1vcnktYmFzZWQgc3RyZWFtcywgdGhpcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3Qgc3RyZWFtCi0gICAqICAgICBieXRlIGluIG1lbW9yeS4gIFRoaXMgZmllbGQgc2hvdWxkIGFsd2F5cyBiZSBzZXQgdG8gTlVMTCBmb3IKLSAgICogICAgIGRpc2stYmFzZWQgc3RyZWFtcy4KLSAgICoKLSAgICogICBzaXplIDo6Ci0gICAqICAgICBUaGUgc3RyZWFtIHNpemUgaW4gYnl0ZXMuCi0gICAqCi0gICAqICAgcG9zIDo6Ci0gICAqICAgICBUaGUgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhlIHN0cmVhbS4KLSAgICoKLSAgICogICBkZXNjcmlwdG9yIDo6Ci0gICAqICAgICBUaGlzIGZpZWxkIGlzIGEgdW5pb24gdGhhdCBjYW4gaG9sZCBhbiBpbnRlZ2VyIG9yIGEgcG9pbnRlci4gIEl0IGlzCi0gICAqICAgICB1c2VkIGJ5IHN0cmVhbSBpbXBsZW1lbnRhdGlvbnMgdG8gc3RvcmUgZmlsZSBkZXNjcmlwdG9ycyBvciBgRklMRSonCi0gICAqICAgICBwb2ludGVycy4KLSAgICoKLSAgICogICBwYXRobmFtZSA6OgotICAgKiAgICAgVGhpcyBmaWVsZCBpcyBjb21wbGV0ZWx5IGlnbm9yZWQgYnkgRnJlZVR5cGUuICBIb3dldmVyLCBpdCBpcyBvZnRlbgotICAgKiAgICAgdXNlZnVsIGR1cmluZyBkZWJ1Z2dpbmcgdG8gdXNlIGl0IHRvIHN0b3JlIHRoZSBzdHJlYW0ncyBmaWxlbmFtZQotICAgKiAgICAgKHdoZXJlIGF2YWlsYWJsZSkuCi0gICAqCi0gICAqICAgcmVhZCA6OgotICAgKiAgICAgVGhlIHN0cmVhbSdzIGlucHV0IGZ1bmN0aW9uLgotICAgKgotICAgKiAgIGNsb3NlIDo6Ci0gICAqICAgICBUaGUgc3RyZWFtJ3MgY2xvc2UgZnVuY3Rpb24uCi0gICAqCi0gICAqICAgbWVtb3J5IDo6Ci0gICAqICAgICBUaGUgbWVtb3J5IG1hbmFnZXIgdG8gdXNlIHRvIHByZWxvYWQgZnJhbWVzLiAgVGhpcyBpcyBzZXQKLSAgICogICAgIGludGVybmFsbHkgYnkgRnJlZVR5cGUgYW5kIHNob3VsZG4ndCBiZSB0b3VjaGVkIGJ5IHN0cmVhbQotICAgKiAgICAgaW1wbGVtZW50YXRpb25zLgotICAgKgotICAgKiAgIGN1cnNvciA6OgotICAgKiAgICAgVGhpcyBmaWVsZCBpcyBzZXQgYW5kIHVzZWQgaW50ZXJuYWxseSBieSBGcmVlVHlwZSB3aGVuIHBhcnNpbmcKLSAgICogICAgIGZyYW1lcy4KLSAgICoKLSAgICogICBsaW1pdCA6OgotICAgKiAgICAgVGhpcyBmaWVsZCBpcyBzZXQgYW5kIHVzZWQgaW50ZXJuYWxseSBieSBGcmVlVHlwZSB3aGVuIHBhcnNpbmcKLSAgICogICAgIGZyYW1lcy4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9TdHJlYW1SZWNfCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyKiAgICAgICBiYXNlOwotICAgIHVuc2lnbmVkIGxvbmcgICAgICAgIHNpemU7Ci0gICAgdW5zaWduZWQgbG9uZyAgICAgICAgcG9zOwotCi0gICAgRlRfU3RyZWFtRGVzYyAgICAgICAgZGVzY3JpcHRvcjsKLSAgICBGVF9TdHJlYW1EZXNjICAgICAgICBwYXRobmFtZTsKLSAgICBGVF9TdHJlYW1fSW9GdW5jICAgICByZWFkOwotICAgIEZUX1N0cmVhbV9DbG9zZUZ1bmMgIGNsb3NlOwotCi0gICAgRlRfTWVtb3J5ICAgICAgICAgICAgbWVtb3J5OwotICAgIHVuc2lnbmVkIGNoYXIqICAgICAgIGN1cnNvcjsKLSAgICB1bnNpZ25lZCBjaGFyKiAgICAgICBsaW1pdDsKLQotICB9IEZUX1N0cmVhbVJlYzsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRTWVNURU1fSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0dHJpZ29uLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0dHJpZ29uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljN2I1NDMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdHRyaWdvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0dHJpZ29uLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSB0cmlnb25vbWV0cmljIGZ1bmN0aW9ucyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMSwgMjAwMywgMjAwNSwgMjAwNywgMjAxMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUVFJJR09OX0hfXwotI2RlZmluZSBfX0ZUVFJJR09OX0hfXwotCi0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBjb21wdXRhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEB0eXBlOgotICAgKiAgIEZUX0FuZ2xlCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGlzIHR5cGUgaXMgdXNlZCB0byBtb2RlbCBhbmdsZSB2YWx1ZXMgaW4gRnJlZVR5cGUuICBOb3RlIHRoYXQgdGhlCi0gICAqICAgYW5nbGUgaXMgYSAxNi4xNiBmaXhlZC1wb2ludCB2YWx1ZSBleHByZXNzZWQgaW4gZGVncmVlcy4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgRlRfRml4ZWQgIEZUX0FuZ2xlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0FOR0xFX1BJCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGUgYW5nbGUgcGkgZXhwcmVzc2VkIGluIEBGVF9BbmdsZSB1bml0cy4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0FOR0xFX1BJICAoIDE4MEwgPDwgMTYgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0FOR0xFXzJQSQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhlIGFuZ2xlIDIqcGkgZXhwcmVzc2VkIGluIEBGVF9BbmdsZSB1bml0cy4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0FOR0xFXzJQSSAgKCBGVF9BTkdMRV9QSSAqIDIgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0FOR0xFX1BJMgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhlIGFuZ2xlIHBpLzIgZXhwcmVzc2VkIGluIEBGVF9BbmdsZSB1bml0cy4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0FOR0xFX1BJMiAgKCBGVF9BTkdMRV9QSSAvIDIgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0FOR0xFX1BJNAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhlIGFuZ2xlIHBpLzQgZXhwcmVzc2VkIGluIEBGVF9BbmdsZSB1bml0cy4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0FOR0xFX1BJNCAgKCBGVF9BTkdMRV9QSSAvIDQgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX1NpbgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgUmV0dXJuIHRoZSBzaW51cyBvZiBhIGdpdmVuIGFuZ2xlIGluIGZpeGVkLXBvaW50IGZvcm1hdC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGFuZ2xlIDo6Ci0gICAqICAgICBUaGUgaW5wdXQgYW5nbGUuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgVGhlIHNpbnVzIHZhbHVlLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBJZiB5b3UgbmVlZCBib3RoIHRoZSBzaW51cyBhbmQgY29zaW51cyBmb3IgYSBnaXZlbiBhbmdsZSwgdXNlIHRoZQotICAgKiAgIGZ1bmN0aW9uIEBGVF9WZWN0b3JfVW5pdC4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRml4ZWQgKQotICBGVF9TaW4oIEZUX0FuZ2xlICBhbmdsZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX0NvcwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgUmV0dXJuIHRoZSBjb3NpbnVzIG9mIGEgZ2l2ZW4gYW5nbGUgaW4gZml4ZWQtcG9pbnQgZm9ybWF0LgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgYW5nbGUgOjoKLSAgICogICAgIFRoZSBpbnB1dCBhbmdsZS4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBUaGUgY29zaW51cyB2YWx1ZS4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgSWYgeW91IG5lZWQgYm90aCB0aGUgc2ludXMgYW5kIGNvc2ludXMgZm9yIGEgZ2l2ZW4gYW5nbGUsIHVzZSB0aGUKLSAgICogICBmdW5jdGlvbiBARlRfVmVjdG9yX1VuaXQuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0ZpeGVkICkKLSAgRlRfQ29zKCBGVF9BbmdsZSAgYW5nbGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9UYW4KLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFJldHVybiB0aGUgdGFuZ2VudCBvZiBhIGdpdmVuIGFuZ2xlIGluIGZpeGVkLXBvaW50IGZvcm1hdC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGFuZ2xlIDo6Ci0gICAqICAgICBUaGUgaW5wdXQgYW5nbGUuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgVGhlIHRhbmdlbnQgdmFsdWUuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0ZpeGVkICkKLSAgRlRfVGFuKCBGVF9BbmdsZSAgYW5nbGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9BdGFuMgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgUmV0dXJuIHRoZSBhcmMtdGFuZ2VudCBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gdmVjdG9yICh4LHkpIGluCi0gICAqICAgdGhlIDJkIHBsYW5lLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgeCA6OgotICAgKiAgICAgVGhlIGhvcml6b250YWwgdmVjdG9yIGNvb3JkaW5hdGUuCi0gICAqCi0gICAqICAgeSA6OgotICAgKiAgICAgVGhlIHZlcnRpY2FsIHZlY3RvciBjb29yZGluYXRlLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIFRoZSBhcmMtdGFuZ2VudCB2YWx1ZSAoaS5lLiBhbmdsZSkuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0FuZ2xlICkKLSAgRlRfQXRhbjIoIEZUX0ZpeGVkICB4LAotICAgICAgICAgICAgRlRfRml4ZWQgIHkgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9BbmdsZV9EaWZmCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXR1cm4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gYW5nbGVzLiAgVGhlIHJlc3VsdCBpcyBhbHdheXMKLSAgICogICBjb25zdHJhaW5lZCB0byB0aGUgXS1QSS4uUEldIGludGVydmFsLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgYW5nbGUxIDo6Ci0gICAqICAgICBGaXJzdCBhbmdsZS4KLSAgICoKLSAgICogICBhbmdsZTIgOjoKLSAgICogICAgIFNlY29uZCBhbmdsZS4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBDb25zdHJhaW5lZCB2YWx1ZSBvZiBgdmFsdWUyLXZhbHVlMScuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0FuZ2xlICkKLSAgRlRfQW5nbGVfRGlmZiggRlRfQW5nbGUgIGFuZ2xlMSwKLSAgICAgICAgICAgICAgICAgRlRfQW5nbGUgIGFuZ2xlMiApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX1ZlY3Rvcl9Vbml0Ci0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXR1cm4gdGhlIHVuaXQgdmVjdG9yIGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBhbmdsZS4gIEFmdGVyIHRoZQotICAgKiAgIGNhbGwsIHRoZSB2YWx1ZSBvZiBgdmVjLngnIHdpbGwgYmUgYHNpbihhbmdsZSknLCBhbmQgdGhlIHZhbHVlIG9mCi0gICAqICAgYHZlYy55JyB3aWxsIGJlIGBjb3MoYW5nbGUpJy4KLSAgICoKLSAgICogICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCB0byByZXRyaWV2ZSBib3RoIHRoZSBzaW51cyBhbmQgY29zaW51cyBvZiBhCi0gICAqICAgZ2l2ZW4gYW5nbGUgcXVpY2tseS4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICB2ZWMgOjoKLSAgICogICAgIFRoZSBhZGRyZXNzIG9mIHRhcmdldCB2ZWN0b3IuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBhbmdsZSA6OgotICAgKiAgICAgVGhlIGlucHV0IGFuZ2xlLgotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfVmVjdG9yX1VuaXQoIEZUX1ZlY3RvciogIHZlYywKLSAgICAgICAgICAgICAgICAgIEZUX0FuZ2xlICAgIGFuZ2xlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfVmVjdG9yX1JvdGF0ZQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgUm90YXRlIGEgdmVjdG9yIGJ5IGEgZ2l2ZW4gYW5nbGUuCi0gICAqCi0gICAqIEBpbm91dDoKLSAgICogICB2ZWMgOjoKLSAgICogICAgIFRoZSBhZGRyZXNzIG9mIHRhcmdldCB2ZWN0b3IuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBhbmdsZSA6OgotICAgKiAgICAgVGhlIGlucHV0IGFuZ2xlLgotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfVmVjdG9yX1JvdGF0ZSggRlRfVmVjdG9yKiAgdmVjLAotICAgICAgICAgICAgICAgICAgICBGVF9BbmdsZSAgICBhbmdsZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX1ZlY3Rvcl9MZW5ndGgKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFJldHVybiB0aGUgbGVuZ3RoIG9mIGEgZ2l2ZW4gdmVjdG9yLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgdmVjIDo6Ci0gICAqICAgICBUaGUgYWRkcmVzcyBvZiB0YXJnZXQgdmVjdG9yLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIFRoZSB2ZWN0b3IgbGVuZ3RoLCBleHByZXNzZWQgaW4gdGhlIHNhbWUgdW5pdHMgdGhhdCB0aGUgb3JpZ2luYWwKLSAgICogICB2ZWN0b3IgY29vcmRpbmF0ZXMuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0ZpeGVkICkKLSAgRlRfVmVjdG9yX0xlbmd0aCggRlRfVmVjdG9yKiAgdmVjICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfVmVjdG9yX1BvbGFyaXplCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBDb21wdXRlIGJvdGggdGhlIGxlbmd0aCBhbmQgYW5nbGUgb2YgYSBnaXZlbiB2ZWN0b3IuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICB2ZWMgOjoKLSAgICogICAgIFRoZSBhZGRyZXNzIG9mIHNvdXJjZSB2ZWN0b3IuCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgbGVuZ3RoIDo6Ci0gICAqICAgICBUaGUgdmVjdG9yIGxlbmd0aC4KLSAgICoKLSAgICogICBhbmdsZSA6OgotICAgKiAgICAgVGhlIHZlY3RvciBhbmdsZS4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX1ZlY3Rvcl9Qb2xhcml6ZSggRlRfVmVjdG9yKiAgdmVjLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgKmxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9BbmdsZSAgICphbmdsZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBDb21wdXRlIHZlY3RvciBjb29yZGluYXRlcyBmcm9tIGEgbGVuZ3RoIGFuZCBhbmdsZS4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICB2ZWMgOjoKLSAgICogICAgIFRoZSBhZGRyZXNzIG9mIHNvdXJjZSB2ZWN0b3IuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBsZW5ndGggOjoKLSAgICogICAgIFRoZSB2ZWN0b3IgbGVuZ3RoLgotICAgKgotICAgKiAgIGFuZ2xlIDo6Ci0gICAqICAgICBUaGUgdmVjdG9yIGFuZ2xlLgotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfVmVjdG9yX0Zyb21fUG9sYXIoIEZUX1ZlY3RvciogIHZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgIGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0FuZ2xlICAgIGFuZ2xlICk7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUVFJJR09OX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdHR0ZHJ2LmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0dHRkcnYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU4ODQxMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0dHRkcnYuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHR0ZHJ2LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciBjb250cm9sbGluZyB0aGUgVHJ1ZVR5cGUgZHJpdmVyICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDEzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRUVERSVl9IX18KLSNkZWZpbmUgX19GVFRURFJWX0hfXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHNlY3Rpb246Ci0gICAqICAgdHRfZHJpdmVyCi0gICAqCi0gICAqIEB0aXRsZToKLSAgICogICBUaGUgVHJ1ZVR5cGUgZHJpdmVyCi0gICAqCi0gICAqIEBhYnN0cmFjdDoKLSAgICogICBDb250cm9sbGluZyB0aGUgVHJ1ZVR5cGUgZHJpdmVyIG1vZHVsZS4KLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFdoaWxlIEZyZWVUeXBlJ3MgVHJ1ZVR5cGUgZHJpdmVyIGRvZXNuJ3QgZXhwb3NlIEFQSSBmdW5jdGlvbnMgYnkKLSAgICogICBpdHNlbGYsIGl0IGlzIHBvc3NpYmxlIHRvIGNvbnRyb2wgaXRzIGJlaGF2aW91ciB3aXRoIEBGVF9Qcm9wZXJ0eV9TZXQKLSAgICogICBhbmQgQEZUX1Byb3BlcnR5X0dldC4gIFRoZSBmb2xsb3dpbmcgbGlzdHMgdGhlIGF2YWlsYWJsZSBwcm9wZXJ0aWVzCi0gICAqICAgdG9nZXRoZXIgd2l0aCB0aGUgbmVjZXNzYXJ5IG1hY3JvcyBhbmQgc3RydWN0dXJlcy4KLSAgICoKLSAgICogICBUaGUgVHJ1ZVR5cGUgZHJpdmVyJ3MgbW9kdWxlIG5hbWUgaXMgYHRydWV0eXBlJy4KLSAgICoKLSAgICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHByb3BlcnR5OgotICAgKiAgIGludGVycHJldGVyLXZlcnNpb24KLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEN1cnJlbnRseSwgdHdvIHZlcnNpb25zIGFyZSBhdmFpbGFibGUsIHJlcHJlc2VudGluZyB0aGUgYnl0ZWNvZGUKLSAgICogICBpbnRlcnByZXRlciB3aXRoIGFuZCB3aXRob3V0IHN1YnBpeGVsIGhpbnRpbmcgc3VwcG9ydCwKLSAgICogICByZXNwZWN0aXZlbHkuICBUaGUgZGVmYXVsdCBpcyBzdWJwaXhlbCBzdXBwb3J0IGlmCi0gICAqICAgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HIGlzIGRlZmluZWQsIGFuZCBubyBzdWJwaXhlbAotICAgKiAgIHN1cHBvcnQgb3RoZXJ3aXNlIChzaW5jZSBpdCBpc24ndCBhdmFpbGFibGUgdGhlbikuCi0gICAqCi0gICAqICAgSWYgc3VicGl4ZWwgaGludGluZyBpcyBvbiwgbWFueSBUcnVlVHlwZSBieXRlY29kZSBpbnN0cnVjdGlvbnMKLSAgICogICBiZWhhdmUgZGlmZmVyZW50bHkgY29tcGFyZWQgdG8gQi9XIG9yIGdyYXlzY2FsZSByZW5kZXJpbmcuICBUaGUKLSAgICogICBtYWluIGlkZWEgaXMgdG8gcmVuZGVyIGF0IGEgbXVjaCBpbmNyZWFzZWQgaG9yaXpvbnRhbCByZXNvbHV0aW9uLAotICAgKiAgIHRoZW4gc2FtcGxpbmcgZG93biB0aGUgY3JlYXRlZCBvdXRwdXQgdG8gc3VicGl4ZWwgcHJlY2lzaW9uLgotICAgKiAgIEhvd2V2ZXIsIG1hbnkgb2xkZXIgZm9udHMgYXJlIG5vdCBzdWl0ZWQgdG8gdGhpcyBhbmQgbXVzdCBiZQotICAgKiAgIHNwZWNpYWxseSB0YWtlbiBjYXJlIG9mIGJ5IGFwcGx5aW5nIChoYXJkY29kZWQpIGZvbnQtc3BlY2lmaWMKLSAgICogICB0d2Vha3MuCi0gICAqCi0gICAqICAgRGV0YWlscyBvbiBzdWJwaXhlbCBoaW50aW5nIGFuZCBzb21lIG9mIHRoZSBuZWNlc3NhcnkgdHdlYWtzIGNhbiBiZQotICAgKiAgIGZvdW5kIGluIEdyZWcgSGl0Y2hjb2NrJ3Mgd2hpdGVwYXBlciBhdAotICAgKiAgIGBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS9jbGVhcnR5cGUvdHJ1ZXR5cGVjbGVhcnR5cGUuYXNweCcuCi0gICAqCi0gICAqICAgVGhlIGZvbGxvd2luZyBleGFtcGxlIGNvZGUgZGVtb25zdHJhdGVzIGhvdyB0byBhY3RpdmF0ZSBzdWJwaXhlbAotICAgKiAgIGhpbnRpbmcgKG9taXR0aW5nIHRoZSBlcnJvciBoYW5kbGluZykuCi0gICAqCi0gICAqICAgewotICAgKiAgICAgRlRfTGlicmFyeSAgbGlicmFyeTsKLSAgICogICAgIEZUX0ZhY2UgICAgIGZhY2U7Ci0gICAqICAgICBGVF9VSW50ICAgICBpbnRlcnByZXRlcl92ZXJzaW9uID0gVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zODsKLSAgICoKLSAgICoKLSAgICogICAgIEZUX0luaXRfRnJlZVR5cGUoICZsaWJyYXJ5ICk7Ci0gICAqCi0gICAqICAgICBGVF9Qcm9wZXJ0eV9TZXQoIGxpYnJhcnksICJ0cnVldHlwZSIsCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcnByZXRlci12ZXJzaW9uIiwKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVycHJldGVyX3ZlcnNpb24gKTsKLSAgICogICB9Ci0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgd2l0aCBARlRfUHJvcGVydHlfR2V0IGFsc28uCi0gICAqCi0gICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIFRUX0lOVEVSUFJFVEVSX1ZFUlNJT05fWFhYCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGxpc3Qgb2YgY29uc3RhbnRzIHVzZWQgZm9yIHRoZSBAaW50ZXJwcmV0ZXItdmVyc2lvbiBwcm9wZXJ0eSB0bwotICAgKiAgIHNlbGVjdCB0aGUgaGludGluZyBlbmdpbmUgZm9yIFRydWV0eXBlIGZvbnRzLgotICAgKgotICAgKiAgIFRoZSBudW1lcmljIHZhbHVlIGluIHRoZSBjb25zdGFudCBuYW1lcyByZXByZXNlbnRzIHRoZSB2ZXJzaW9uCi0gICAqICAgbnVtYmVyIGFzIHJldHVybmVkIGJ5IHRoZSBgR0VUSU5GTycgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24uCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zNSA6OgotICAgKiAgICAgVmVyc2lvbn4zNSBjb3JyZXNwb25kcyB0byBNUyByYXN0ZXJpemVyIHYuMS43IGFzIHVzZWQgZS5nLiBpbgotICAgKiAgICAgV2luZG93c345ODsgb25seSBncmF5c2NhbGUgYW5kIEIvVyByYXN0ZXJpemluZyBpcyBzdXBwb3J0ZWQuCi0gICAqCi0gICAqICAgVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zOCA6OgotICAgKiAgICAgVmVyc2lvbn4zOCBjb3JyZXNwb25kcyB0byBNUyByYXN0ZXJpemVyIHYuMS45OyBpdCBpcyByb3VnaGx5Ci0gICAqICAgICBlcXVpdmFsZW50IHRvIHRoZSBoaW50aW5nIHByb3ZpZGVkIGJ5IERpcmVjdFdyaXRlIENsZWFyVHlwZSAoYXMKLSAgICogICAgIGNhbiBiZSBmb3VuZCwgZm9yIGV4YW1wbGUsIGluIHRoZSBJbnRlcm5ldCBFeHBsb3Jlcn45IHJ1bm5pbmcgb24KLSAgICogICAgIFdpbmRvd3N+NykuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoaXMgcHJvcGVydHkgY29udHJvbHMgdGhlIGJlaGF2aW91ciBvZiB0aGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIKLSAgICogICBhbmQgdGh1cyBob3cgb3V0bGluZXMgZ2V0IGhpbnRlZC4gIEl0IGRvZXMgKm5vdCogY29udHJvbCBob3cgZ2x5cGgKLSAgICogICBnZXQgcmFzdGVyaXplZCEgIEluIHBhcnRpY3VsYXIsIGl0IGRvZXMgbm90IGNvbnRyb2wgc3VicGl4ZWwgY29sb3IKLSAgICogICBmaWx0ZXJpbmcuCi0gICAqCi0gICAqICAgSWYgRnJlZVR5cGUgaGFzIG5vdCBiZWVuIGNvbXBpbGVkIHdpdGggY29uZmlndXJhdGlvbiBvcHRpb24KLSAgICogICBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcsIHNlbGVjdGluZyB2ZXJzaW9ufjM4IGNhdXNlcyBhbgotICAgKiAgIGBGVF9FcnJfVW5pbXBsZW1lbnRlZF9GZWF0dXJlJyBlcnJvci4KLSAgICoKLSAgICogICBEZXBlbmRpbmcgb24gdGhlIGdyYXBoaWNzIGZyYW1ld29yaywgTWljcm9zb2Z0IHVzZXMgZGlmZmVyZW50Ci0gICAqICAgYnl0ZWNvZGUgZW5naW5lcy4gIEFzIGEgY29uc2VxdWVuY2UsIHRoZSB2ZXJzaW9uIG51bWJlcnMgcmV0dXJuZWQgYnkKLSAgICogICBhIGNhbGwgdG8gdGhlIGBHRVRJTkZPWzFdJyBieXRlY29kZSBpbnN0cnVjdGlvbiBhcmUgbW9yZSBjb252b2x1dGVkCi0gICAqICAgdGhhbiBkZXNpcmVkLgotICAgKgotICAgKiAgIHsKLSAgICogICAgICBmcmFtZXdvcmsgICBXaW5kb3dzIHZlcnNpb24gICByZXN1bHQgb2YgR0VUSU5GT1sxXQotICAgKiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgKiAgICAgICBHREkgICAgICAgICBiZWZvcmUgWFAgICAgICAgICAzNQotICAgKiAgICAgICBHREkgICAgICAgICBYUCBhbmQgbGF0ZXIgICAgICAzNwotICAgKiAgICAgICBHREkrIG9sZCAgICBiZWZvcmUgVmlzdGEgICAgICAzNwotICAgKiAgICAgICBHREkrIG9sZCAgICBWaXN0YSwgNyAgICAgICAgICAzOAotICAgKiAgICAgICBHREkrICAgICAgICBhZnRlciA3ICAgICAgICAgICA0MAotICAgKiAgICAgICBEV3JpdGUgICAgICBiZWZvcmUgOCAgICAgICAgICAzOQotICAgKiAgICAgICBEV3JpdGUgICAgICA4IGFuZCBsYXRlciAgICAgICA0MAotICAgKiAgIH0KLSAgICoKLSAgICogICBTaW5jZSBGcmVlVHlwZSBkb2Vzbid0IHByb3ZpZGUgYWxsIGNhcGFiaWxpdGllcyBvZiBEV3JpdGUgQ2xlYXJUeXBlLAotICAgKiAgIHVzaW5nIHZlcnNpb25+Mzggc2VlbXMganVzdGlmaWVkLgotICAgKgotICAgKi8KLSNkZWZpbmUgVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zNSAgMzUKLSNkZWZpbmUgVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zOCAgMzgKLQotIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX0ZUVFREUlZfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0dHlwZXMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnR0eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzAxZTg3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnR0eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0dHlwZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBzaW1wbGUgdHlwZXMgZGVmaW5pdGlvbnMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAyLCAyMDA0LCAyMDA2LTIwMDksIDIwMTItMjAxNCBieSAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUVFlQRVNfSF9fCi0jZGVmaW5lIF9fRlRUWVBFU19IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAotI2luY2x1ZGUgRlRfU1lTVEVNX0gKLSNpbmNsdWRlIEZUX0lNQUdFX0gKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmFzaWNfdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQmFzaWMgRGF0YSBUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGJhc2ljIGRhdGEgdHlwZXMgZGVmaW5lZCBieSB0aGUgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBiYXNpYyBkYXRhIHR5cGVzIGRlZmluZWQgYnkgRnJlZVR5cGV+MiwgICovCi0gIC8qICAgIHJhbmdpbmcgZnJvbSBzaW1wbGUgc2NhbGFyIHR5cGVzIHRvIGJpdG1hcCBkZXNjcmlwdG9ycy4gIE1vcmUgICAgICAqLwotICAvKiAgICBmb250LXNwZWNpZmljIHN0cnVjdHVyZXMgYXJlIGRlZmluZWQgaW4gYSBkaWZmZXJlbnQgc2VjdGlvbi4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPcmRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CeXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVUludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ludDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VSW50MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JbnQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVUludDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Nob3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VU2hvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VMb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1B0ckRpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GaXhlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9WZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQkJveCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GV29yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVUZXb3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0YyRG90MTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Vbml0VmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRjI2RG90NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTUFLRV9UQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2VuZXJpY19GaW5hbGl6ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CaXRtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUGl4ZWxfTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BhbGV0dGVfTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaF9Gb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSU1BR0VfVEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBvZiB1bnNpZ25lZCBjaGFyLCB1c2VkIGZvciBzaW1wbGUgYm9vbGVhbnMuICBBcyB1c3VhbCwgICAqLwotICAvKiAgICB2YWx1ZXMgMSBhbmR+MCByZXByZXNlbnQgdHJ1ZSBhbmQgZmFsc2UsIHJlc3BlY3RpdmVseS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgRlRfQm9vbDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZXb3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHVzZWQgdG8gc3RvcmUgYSBkaXN0YW5jZSBpbiBvcmlnaW5hbCBmb250ICAqLwotICAvKiAgICB1bml0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc2lnbmVkIHNob3J0ICBGVF9GV29yZDsgICAvKiBkaXN0YW5jZSBpbiBGVW5pdHMgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VGV29yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHVzZWQgdG8gc3RvcmUgYSBkaXN0YW5jZSBpbiBvcmlnaW5hbCAgICAqLwotICAvKiAgICBmb250IHVuaXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIEZUX1VGV29yZDsgIC8qIHVuc2lnbmVkIGRpc3RhbmNlICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9DaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNpbXBsZSB0eXBlZGVmIGZvciB0aGUgX3NpZ25lZF8gY2hhciB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc2lnbmVkIGNoYXIgIEZUX0NoYXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CeXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNpbXBsZSB0eXBlZGVmIGZvciB0aGUgX3Vuc2lnbmVkXyBjaGFyIHR5cGUuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgRlRfQnl0ZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3IgY29uc3RhbnQgbWVtb3J5IGFyZWFzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBjb25zdCBGVF9CeXRlKiAgRlRfQnl0ZXM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9UYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIDMyLWJpdCB0YWdzIChhcyB1c2VkIGluIHRoZSBTRk5UIGZvcm1hdCkuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfVUludDMyICBGVF9UYWc7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNpbXBsZSB0eXBlZGVmIGZvciB0aGUgY2hhciB0eXBlLCB1c3VhbGx5IHVzZWQgZm9yIHN0cmluZ3MuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgY2hhciAgRlRfU3RyaW5nOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2hvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciBzaWduZWQgc2hvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHNpZ25lZCBzaG9ydCAgRlRfU2hvcnQ7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VU2hvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIHVuc2lnbmVkIHNob3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIEZUX1VTaG9ydDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3IgdGhlIGludCB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzaWduZWQgaW50ICBGVF9JbnQ7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VSW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIHRoZSB1bnNpZ25lZCBpbnQgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdW5zaWduZWQgaW50ICBGVF9VSW50OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciBzaWduZWQgbG9uZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHNpZ25lZCBsb25nICBGVF9Mb25nOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVUxvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciB1bnNpZ25lZCBsb25nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIEZUX1VMb25nOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRjJEb3QxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzaWduZWQgMi4xNCBmaXhlZC1wb2ludCB0eXBlIHVzZWQgZm9yIHVuaXQgdmVjdG9ycy4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHNpZ25lZCBzaG9ydCAgRlRfRjJEb3QxNDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0YyNkRvdDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2lnbmVkIDI2LjYgZml4ZWQtcG9pbnQgdHlwZSB1c2VkIGZvciB2ZWN0b3JpYWwgcGl4ZWwgICAgICAgICAgICAqLwotICAvKiAgICBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc2lnbmVkIGxvbmcgIEZUX0YyNkRvdDY7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GaXhlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHR5cGUgaXMgdXNlZCB0byBzdG9yZSAxNi4xNiBmaXhlZC1wb2ludCB2YWx1ZXMsIGxpa2Ugc2NhbGluZyAgKi8KLSAgLyogICAgdmFsdWVzIG9yIG1hdHJpeCBjb2VmZmljaWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHNpZ25lZCBsb25nICBGVF9GaXhlZDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBGcmVlVHlwZSBlcnJvciBjb2RlIHR5cGUuICBBIHZhbHVlIG9mfjAgaXMgYWx3YXlzIGludGVycHJldGVkICAqLwotICAvKiAgICBhcyBhIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgaW50ICBGVF9FcnJvcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2ltcGxlIHR5cGVkZWYgZm9yIGEgdHlwZWxlc3MgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB2b2lkKiAgRlRfUG9pbnRlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgQU5TSX5DIGBzaXplX3QnIHR5cGUsIGkuZS4sIHRoZSBsYXJnZXN0ICAqLwotICAvKiAgICBfdW5zaWduZWRfIGludGVnZXIgdHlwZSB1c2VkIHRvIGV4cHJlc3MgYSBmaWxlIHNpemUgb3IgcG9zaXRpb24sICAgKi8KLSAgLyogICAgb3IgYSBtZW1vcnkgYmxvY2sgc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHNpemVfdCAgRlRfT2Zmc2V0OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUHRyRGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBBTlNJfkMgYHB0cmRpZmZfdCcgdHlwZSwgaS5lLiwgdGhlICAgICAgICovCi0gIC8qICAgIGxhcmdlc3QgX3NpZ25lZF8gaW50ZWdlciB0eXBlIHVzZWQgdG8gZXhwcmVzcyB0aGUgZGlzdGFuY2UgICAgICAgICAqLwotICAvKiAgICBiZXR3ZWVuIHR3byBwb2ludGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgZnRfcHRyZGlmZl90ICBGVF9QdHJEaXN0OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVW5pdFZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzaW1wbGUgc3RydWN0dXJlIHVzZWQgdG8gc3RvcmUgYSAyRCB2ZWN0b3IgdW5pdCB2ZWN0b3IuICBVc2VzICAgICovCi0gIC8qICAgIEZUX0YyRG90MTQgdHlwZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHggOjogSG9yaXpvbnRhbCBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeSA6OiBWZXJ0aWNhbCBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfVW5pdFZlY3Rvcl8KLSAgewotICAgIEZUX0YyRG90MTQgIHg7Ci0gICAgRlRfRjJEb3QxNCAgeTsKLQotICB9IEZUX1VuaXRWZWN0b3I7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNpbXBsZSBzdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBhIDJ4MiBtYXRyaXguICBDb2VmZmljaWVudHMgYXJlICAgKi8KLSAgLyogICAgaW4gMTYuMTYgZml4ZWQtcG9pbnQgZm9ybWF0LiAgVGhlIGNvbXB1dGF0aW9uIHBlcmZvcm1lZCBpczogICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgeCcgPSB4Knh4ICsgeSp4eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIHknID0geCp5eCArIHkqeXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4eCA6OiBNYXRyaXggY29lZmZpY2llbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHh5IDo6IE1hdHJpeCBjb2VmZmljaWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeXggOjogTWF0cml4IGNvZWZmaWNpZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5eSA6OiBNYXRyaXggY29lZmZpY2llbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9NYXRyaXhfCi0gIHsKLSAgICBGVF9GaXhlZCAgeHgsIHh5OwotICAgIEZUX0ZpeGVkICB5eCwgeXk7Ci0KLSAgfSBGVF9NYXRyaXg7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9EYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZWFkLW9ubHkgYmluYXJ5IGRhdGEgcmVwcmVzZW50ZWQgYXMgYSBwb2ludGVyIGFuZCBhIGxlbmd0aC4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb2ludGVyIDo6IFRoZSBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlbmd0aCAgOjogVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0RhdGFfCi0gIHsKLSAgICBjb25zdCBGVF9CeXRlKiAgcG9pbnRlcjsKLSAgICBGVF9JbnQgICAgICAgICAgbGVuZ3RoOwotCi0gIH0gRlRfRGF0YTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dlbmVyaWNfRmluYWxpemVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlc2NyaWJlIGEgZnVuY3Rpb24gdXNlZCB0byBkZXN0cm95IHRoZSBgY2xpZW50JyBkYXRhIG9mIGFueSAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBvYmplY3QuICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBARlRfR2VuZXJpYyB0eXBlIGZvciAgKi8KLSAgLyogICAgZGV0YWlscyBvZiB1c2FnZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGFkZHJlc3Mgb2YgdGhlIEZyZWVUeXBlIG9iamVjdCB0aGF0IGlzIHVuZGVyIGZpbmFsaXphdGlvbi4gICAgICovCi0gIC8qICAgIEl0cyBjbGllbnQgZGF0YSBpcyBhY2Nlc3NlZCB0aHJvdWdoIGl0cyBgZ2VuZXJpYycgZmllbGQuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB2b2lkICAoKkZUX0dlbmVyaWNfRmluYWxpemVyKSh2b2lkKiAgb2JqZWN0KTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENsaWVudCBhcHBsaWNhdGlvbnMgb2Z0ZW4gbmVlZCB0byBhc3NvY2lhdGUgdGhlaXIgb3duIGRhdGEgdG8gYSAgICAqLwotICAvKiAgICB2YXJpZXR5IG9mIEZyZWVUeXBlIGNvcmUgb2JqZWN0cy4gIEZvciBleGFtcGxlLCBhIHRleHQgbGF5b3V0IEFQSSAgKi8KLSAgLyogICAgbWlnaHQgd2FudCB0byBhc3NvY2lhdGUgYSBnbHlwaCBjYWNoZSB0byBhIGdpdmVuIHNpemUgb2JqZWN0LiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTb21lIEZyZWVUeXBlIG9iamVjdCBjb250YWlucyBhIGBnZW5lcmljJyBmaWVsZCwgb2YgdHlwZSAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2VuZXJpYywgd2hpY2ggdXNhZ2UgaXMgbGVmdCB0byBjbGllbnQgYXBwbGljYXRpb25zIGFuZCBmb250ICAgICovCi0gIC8qICAgIHNlcnZlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgYSBwb2ludGVyIHRvIGNsaWVudC1zcGVjaWZpYyBkYXRhLCBhcyB3ZWxsICovCi0gIC8qICAgIGFzIHRoZSBhZGRyZXNzIG9mIGEgYGZpbmFsaXplcicgZnVuY3Rpb24sIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGJ5ICAqLwotICAvKiAgICBGcmVlVHlwZSB3aGVuIHRoZSBvYmplY3QgaXMgZGVzdHJveWVkIChmb3IgZXhhbXBsZSwgdGhlIHByZXZpb3VzICAgKi8KLSAgLyogICAgY2xpZW50IGV4YW1wbGUgd291bGQgcHV0IHRoZSBhZGRyZXNzIG9mIHRoZSBnbHlwaCBjYWNoZSBkZXN0cnVjdG9yICovCi0gIC8qICAgIGluIHRoZSBgZmluYWxpemVyJyBmaWVsZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRhdGEgICAgICA6OiBBIHR5cGVsZXNzIHBvaW50ZXIgdG8gYW55IGNsaWVudC1zcGVjaWZpZWQgZGF0YS4gVGhpcyAqLwotICAvKiAgICAgICAgICAgICAgICAgZmllbGQgaXMgY29tcGxldGVseSBpZ25vcmVkIGJ5IHRoZSBGcmVlVHlwZSBsaWJyYXJ5LiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZpbmFsaXplciA6OiBBIHBvaW50ZXIgdG8gYSBgZ2VuZXJpYyBmaW5hbGl6ZXInIGZ1bmN0aW9uLCB3aGljaCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgb2JqZWN0IGlzIGRlc3Ryb3llZC4gIElmIHRoaXMgKi8KLSAgLyogICAgICAgICAgICAgICAgIGZpZWxkIGlzIHNldCB0byBOVUxMLCBubyBjb2RlIHdpbGwgYmUgY2FsbGVkLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfR2VuZXJpY18KLSAgewotICAgIHZvaWQqICAgICAgICAgICAgICAgICBkYXRhOwotICAgIEZUX0dlbmVyaWNfRmluYWxpemVyICBmaW5hbGl6ZXI7Ci0KLSAgfSBGVF9HZW5lcmljOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTUFLRV9UQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBtYWNybyBjb252ZXJ0cyBmb3VyLWxldHRlciB0YWdzIHRoYXQgYXJlIHVzZWQgdG8gbGFiZWwgICAgICAgICovCi0gIC8qICAgIFRydWVUeXBlIHRhYmxlcyBpbnRvIGFuIHVuc2lnbmVkIGxvbmcsIHRvIGJlIHVzZWQgd2l0aGluIEZyZWVUeXBlLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBwcm9kdWNlZCB2YWx1ZXMgKm11c3QqIGJlIDMyLWJpdCBpbnRlZ2Vycy4gIERvbid0IHJlZGVmaW5lICAgICAqLwotICAvKiAgICB0aGlzIG1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX01BS0VfVEFHKCBfeDEsIF94MiwgX3gzLCBfeDQgKSBcCi0gICAgICAgICAgKEZUX1RhZykgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAoIChGVF9VTG9uZylfeDEgPDwgMjQgKSB8ICAgICBcCi0gICAgICAgICAgICAoIChGVF9VTG9uZylfeDIgPDwgMTYgKSB8ICAgICBcCi0gICAgICAgICAgICAoIChGVF9VTG9uZylfeDMgPDwgIDggKSB8ICAgICBcCi0gICAgICAgICAgICAgIChGVF9VTG9uZylfeDQgICAgICAgICApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgTCBJIFMgVCAgIE0gQSBOIEEgRyBFIE0gRSBOIFQgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpc3RfcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0Tm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgTWFueSBlbGVtZW50cyBhbmQgb2JqZWN0cyBpbiBGcmVlVHlwZSBhcmUgbGlzdGVkIHRocm91Z2ggYW4gICAgICAgKi8KLSAgLyogICAgIEBGVF9MaXN0IHJlY29yZCAoc2VlIEBGVF9MaXN0UmVjKS4gIEFzIGl0cyBuYW1lIHN1Z2dlc3RzLCBhbiAgICAgICovCi0gIC8qICAgICBGVF9MaXN0Tm9kZSBpcyBhIGhhbmRsZSB0byBhIHNpbmdsZSBsaXN0IGVsZW1lbnQuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfTGlzdE5vZGVSZWNfKiAgRlRfTGlzdE5vZGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIGxpc3QgcmVjb3JkIChzZWUgQEZUX0xpc3RSZWMpLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX0xpc3RSZWNfKiAgRlRfTGlzdDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3ROb2RlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBhIHNpbmdsZSBsaXN0IGVsZW1lbnQuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHByZXYgOjogVGhlIHByZXZpb3VzIGVsZW1lbnQgaW4gdGhlIGxpc3QuICBOVUxMIGlmIGZpcnN0LiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmV4dCA6OiBUaGUgbmV4dCBlbGVtZW50IGluIHRoZSBsaXN0LiAgTlVMTCBpZiBsYXN0LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkYXRhIDo6IEEgdHlwZWxlc3MgcG9pbnRlciB0byB0aGUgbGlzdGVkIG9iamVjdC4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9MaXN0Tm9kZVJlY18KLSAgewotICAgIEZUX0xpc3ROb2RlICBwcmV2OwotICAgIEZUX0xpc3ROb2RlICBuZXh0OwotICAgIHZvaWQqICAgICAgICBkYXRhOwotCi0gIH0gRlRfTGlzdE5vZGVSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgYSBzaW1wbGUgZG91Ymx5LWxpbmtlZCBsaXN0LiAgVGhlc2UgYXJlICAgKi8KLSAgLyogICAgdXNlZCBpbiBtYW55IHBhcnRzIG9mIEZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGVhZCA6OiBUaGUgaGVhZCAoZmlyc3QgZWxlbWVudCkgb2YgZG91Ymx5LWxpbmtlZCBsaXN0LiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWlsIDo6IFRoZSB0YWlsIChsYXN0IGVsZW1lbnQpIG9mIGRvdWJseS1saW5rZWQgbGlzdC4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9MaXN0UmVjXwotICB7Ci0gICAgRlRfTGlzdE5vZGUgIGhlYWQ7Ci0gICAgRlRfTGlzdE5vZGUgIHRhaWw7Ci0KLSAgfSBGVF9MaXN0UmVjOwotCi0gIC8qICovCi0KLQotI2RlZmluZSBGVF9JU19FTVBUWSggbGlzdCApICAoIChsaXN0KS5oZWFkID09IDAgKQotI2RlZmluZSBGVF9CT09MKCB4ICkgICggKEZUX0Jvb2wpKCB4ICkgKQotCi0gIC8qIGNvbmNhdGVuYXRlIEMgdG9rZW5zICovCi0jZGVmaW5lIEZUX0VSUl9YQ0FUKCB4LCB5ICkgIHggIyMgeQotI2RlZmluZSBGVF9FUlJfQ0FUKCB4LCB5ICkgICBGVF9FUlJfWENBVCggeCwgeSApCi0KLSAgLyogc2VlIGBmdG1vZGVyci5oJyBmb3IgZGVzY3JpcHRpb25zIG9mIHRoZSBmb2xsb3dpbmcgbWFjcm9zICovCi0KLSNkZWZpbmUgRlRfRVJSKCBlICkgIEZUX0VSUl9DQVQoIEZUX0VSUl9QUkVGSVgsIGUgKQotCi0jZGVmaW5lIEZUX0VSUk9SX0JBU0UoIHggKSAgICAoICh4KSAmIDB4RkYgKQotI2RlZmluZSBGVF9FUlJPUl9NT0RVTEUoIHggKSAgKCAoeCkgJiAweEZGMDBVICkKLQotI2RlZmluZSBGVF9FUlJfRVEoIHgsIGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBGVF9FUlJPUl9CQVNFKCB4ICkgPT0gRlRfRVJST1JfQkFTRSggRlRfRVJSKCBlICkgKSApCi0jZGVmaW5lIEZUX0VSUl9ORVEoIHgsIGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEZUX0VSUk9SX0JBU0UoIHggKSAhPSBGVF9FUlJPUl9CQVNFKCBGVF9FUlIoIGUgKSApICkKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUVFlQRVNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0d2luZm50LmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0d2luZm50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMjYxNTguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mdHdpbmZudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0d2luZm50LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBBUEkgZm9yIGFjY2Vzc2luZyBXaW5kb3dzIGZudC1zcGVjaWZpYyBkYXRhLiAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMywgMjAwNCwgMjAwOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUV0lORk5UX0hfXwotI2RlZmluZSBfX0ZUV0lORk5UX0hfXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB3aW5mbnRfZm9udHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXaW5kb3cgRk5UIEZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXaW5kb3dzIEZOVCBzcGVjaWZpYyBBUEkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIFdpbmRvd3MgRk5UIHNwZWNpZmljICAgICAgKi8KLSAgLyogICAgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIEZUX1dpbkZOVF9JRF9YWFgKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbGlzdCBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBgY2hhcnNldCcgYnl0ZSBpbgotICAgKiAgIEBGVF9XaW5GTlRfSGVhZGVyUmVjLiAgRXhhY3QgbWFwcGluZyB0YWJsZXMgZm9yIHRoZSB2YXJpb3VzIGNwWFhYWAotICAgKiAgIGVuY29kaW5ncyAoZXhjZXB0IGZvciBjcDEzNjEpIGNhbiBiZSBmb3VuZCBhdAotICAgKiAgIGZ0cDovL2Z0cC51bmljb2RlLm9yZy9wdWJsaWMgaW4gdGhlIE1BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL1dJTkRPV1MKLSAgICogICBzdWJkaXJlY3RvcnkuICBjcDEzNjEgaXMgcm91Z2hseSBhIHN1cGVyc2V0IG9mCi0gICAqICAgTUFQUElOR1MvT0JTT0xFVEUvRUFTVEFTSUEvS1NDL0pPSEFCLlRYVC4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBGVF9XaW5GTlRfSURfREVGQVVMVCA6OgotICAgKiAgICAgVGhpcyBpcyB1c2VkIGZvciBmb250IGVudW1lcmF0aW9uIGFuZCBmb250IGNyZWF0aW9uIGFzIGEKLSAgICogICAgIGBkb24ndCBjYXJlJyB2YWx1ZS4gIFZhbGlkIGZvbnQgZmlsZXMgZG9uJ3QgY29udGFpbiB0aGlzIHZhbHVlLgotICAgKiAgICAgV2hlbiBxdWVyeWluZyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNoYXJhY3RlciBzZXQgb2YgdGhlIGZvbnQKLSAgICogICAgIHRoYXQgaXMgY3VycmVudGx5IHNlbGVjdGVkIGludG8gYSBzcGVjaWZpZWQgZGV2aWNlIGNvbnRleHQsIHRoaXMKLSAgICogICAgIHJldHVybiB2YWx1ZSAob2YgdGhlIHJlbGF0ZWQgV2luZG93cyBBUEkpIHNpbXBseSBkZW5vdGVzIGZhaWx1cmUuCi0gICAqCi0gICAqICAgRlRfV2luRk5UX0lEX1NZTUJPTCA6OgotICAgKiAgICAgVGhlcmUgaXMgbm8ga25vd24gbWFwcGluZyB0YWJsZSBhdmFpbGFibGUuCi0gICAqCi0gICAqICAgRlRfV2luRk5UX0lEX01BQyA6OgotICAgKiAgICAgTWFjIFJvbWFuIGVuY29kaW5nLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9PRU0gOjoKLSAgICogICAgIEZyb20gTWljaGFlbCBQw7Z0dGdlbiA8bWljaGFlbEBwb2V0dGdlbi5kZT46Ci0gICAqCi0gICAqICAgICAgIFRoZSBgV2luZG93cyBGb250IE1hcHBpbmcnIGFydGljbGUgc2F5cyB0aGF0IEZUX1dpbkZOVF9JRF9PRU0KLSAgICogICAgICAgaXMgdXNlZCBmb3IgdGhlIGNoYXJzZXQgb2YgdmVjdG9yIGZvbnRzLCBsaWtlIGBtb2Rlcm4uZm9uJywKLSAgICogICAgICAgYHJvbWFuLmZvbicsIGFuZCBgc2NyaXB0LmZvbicgb24gV2luZG93cy4KLSAgICoKLSAgICogICAgICAgVGhlIGBDcmVhdGVGb250JyBkb2N1bWVudGF0aW9uIHNheXM6IFRoZSBGVF9XaW5GTlRfSURfT0VNIHZhbHVlCi0gICAqICAgICAgIHNwZWNpZmllcyBhIGNoYXJhY3RlciBzZXQgdGhhdCBpcyBvcGVyYXRpbmctc3lzdGVtIGRlcGVuZGVudC4KLSAgICoKLSAgICogICAgICAgVGhlIGBJRklNRVRSSUNTJyBkb2N1bWVudGF0aW9uIGZyb20gdGhlIGBXaW5kb3dzIERyaXZlcgotICAgKiAgICAgICBEZXZlbG9wbWVudCBLaXQnIHNheXM6IFRoaXMgZm9udCBzdXBwb3J0cyBhbiBPRU0tc3BlY2lmaWMKLSAgICogICAgICAgY2hhcmFjdGVyIHNldC4gIFRoZSBPRU0gY2hhcmFjdGVyIHNldCBpcyBzeXN0ZW0gZGVwZW5kZW50LgotICAgKgotICAgKiAgICAgICBJbiBnZW5lcmFsIE9FTSwgYXMgb3Bwb3NlZCB0byBBTlNJIChpLmUuLCBjcDEyNTIpLCBkZW5vdGVzIHRoZQotICAgKiAgICAgICBzZWNvbmQgZGVmYXVsdCBjb2RlcGFnZSB0aGF0IG1vc3QgaW50ZXJuYXRpb25hbCB2ZXJzaW9ucyBvZgotICAgKiAgICAgICBXaW5kb3dzIGhhdmUuICBJdCBpcyBvbmUgb2YgdGhlIE9FTSBjb2RlcGFnZXMgZnJvbQotICAgKgotICAgKiAgICAgICAgIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9nbG9iYWxkZXYvcmVmZXJlbmNlL2NwaG9tZS5tc3B4LAotICAgKgotICAgKiAgICAgICBhbmQgaXMgdXNlZCBmb3IgdGhlIGBET1MgYm94ZXMnLCB0byBzdXBwb3J0IGxlZ2FjeSBhcHBsaWNhdGlvbnMuCi0gICAqICAgICAgIEEgR2VybWFuIFdpbmRvd3MgdmVyc2lvbiBmb3IgZXhhbXBsZSB1c3VhbGx5IHVzZXMgQU5TSSBjb2RlcGFnZQotICAgKiAgICAgICAxMjUyIGFuZCBPRU0gY29kZXBhZ2UgODUwLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9DUDg3NCA6OgotICAgKiAgICAgQSBzdXBlcnNldCBvZiBUaGFpIFRJUyA2MjAgYW5kIElTTyA4ODU5LTExLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9DUDkzMiA6OgotICAgKiAgICAgQSBzdXBlcnNldCBvZiBKYXBhbmVzZSBTaGlmdC1KSVMgKHdpdGggbWlub3IgZGV2aWF0aW9ucykuCi0gICAqCi0gICAqICAgRlRfV2luRk5UX0lEX0NQOTM2IDo6Ci0gICAqICAgICBBIHN1cGVyc2V0IG9mIHNpbXBsaWZpZWQgQ2hpbmVzZSBHQiAyMzEyLTE5ODAgKHdpdGggZGlmZmVyZW50Ci0gICAqICAgICBvcmRlcmluZyBhbmQgbWlub3IgZGV2aWF0aW9ucykuCi0gICAqCi0gICAqICAgRlRfV2luRk5UX0lEX0NQOTQ5IDo6Ci0gICAqICAgICBBIHN1cGVyc2V0IG9mIEtvcmVhbiBIYW5ndWwgS1N+QyA1NjAxLTE5ODcgKHdpdGggZGlmZmVyZW50Ci0gICAqICAgICBvcmRlcmluZyBhbmQgbWlub3IgZGV2aWF0aW9ucykuCi0gICAqCi0gICAqICAgRlRfV2luRk5UX0lEX0NQOTUwIDo6Ci0gICAqICAgICBBIHN1cGVyc2V0IG9mIHRyYWRpdGlvbmFsIENoaW5lc2UgQmlnfjUgRVRlbiAod2l0aCBkaWZmZXJlbnQKLSAgICogICAgIG9yZGVyaW5nIGFuZCBtaW5vciBkZXZpYXRpb25zKS4KLSAgICoKLSAgICogICBGVF9XaW5GTlRfSURfQ1AxMjUwIDo6Ci0gICAqICAgICBBIHN1cGVyc2V0IG9mIEVhc3QgRXVyb3BlYW4gSVNPIDg4NTktMiAod2l0aCBzbGlnaHRseSBkaWZmZXJlbnQKLSAgICogICAgIG9yZGVyaW5nKS4KLSAgICoKLSAgICogICBGVF9XaW5GTlRfSURfQ1AxMjUxIDo6Ci0gICAqICAgICBBIHN1cGVyc2V0IG9mIFJ1c3NpYW4gSVNPIDg4NTktNSAod2l0aCBkaWZmZXJlbnQgb3JkZXJpbmcpLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9DUDEyNTIgOjoKLSAgICogICAgIEFOU0kgZW5jb2RpbmcuICBBIHN1cGVyc2V0IG9mIElTTyA4ODU5LTEuCi0gICAqCi0gICAqICAgRlRfV2luRk5UX0lEX0NQMTI1MyA6OgotICAgKiAgICAgQSBzdXBlcnNldCBvZiBHcmVlayBJU08gODg1OS03ICh3aXRoIG1pbm9yIG1vZGlmaWNhdGlvbnMpLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9DUDEyNTQgOjoKLSAgICogICAgIEEgc3VwZXJzZXQgb2YgVHVya2lzaCBJU08gODg1OS05LgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9DUDEyNTUgOjoKLSAgICogICAgIEEgc3VwZXJzZXQgb2YgSGVicmV3IElTTyA4ODU5LTggKHdpdGggc29tZSBtb2RpZmljYXRpb25zKS4KLSAgICoKLSAgICogICBGVF9XaW5GTlRfSURfQ1AxMjU2IDo6Ci0gICAqICAgICBBIHN1cGVyc2V0IG9mIEFyYWJpYyBJU08gODg1OS02ICh3aXRoIGRpZmZlcmVudCBvcmRlcmluZykuCi0gICAqCi0gICAqICAgRlRfV2luRk5UX0lEX0NQMTI1NyA6OgotICAgKiAgICAgQSBzdXBlcnNldCBvZiBCYWx0aWMgSVNPIDg4NTktMTMgKHdpdGggc29tZSBkZXZpYXRpb25zKS4KLSAgICoKLSAgICogICBGVF9XaW5GTlRfSURfQ1AxMjU4IDo6Ci0gICAqICAgICBGb3IgVmlldG5hbWVzZS4gIFRoaXMgZW5jb2RpbmcgZG9lc24ndCBjb3ZlciBhbGwgbmVjZXNzYXJ5Ci0gICAqICAgICBjaGFyYWN0ZXJzLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9DUDEzNjEgOjoKLSAgICogICAgIEtvcmVhbiAoSm9oYWIpLgotICAgKi8KLQotI2RlZmluZSBGVF9XaW5GTlRfSURfQ1AxMjUyICAgIDAKLSNkZWZpbmUgRlRfV2luRk5UX0lEX0RFRkFVTFQgICAxCi0jZGVmaW5lIEZUX1dpbkZOVF9JRF9TWU1CT0wgICAgMgotI2RlZmluZSBGVF9XaW5GTlRfSURfTUFDICAgICAgNzcKLSNkZWZpbmUgRlRfV2luRk5UX0lEX0NQOTMyICAgMTI4Ci0jZGVmaW5lIEZUX1dpbkZOVF9JRF9DUDk0OSAgIDEyOQotI2RlZmluZSBGVF9XaW5GTlRfSURfQ1AxMzYxICAxMzAKLSNkZWZpbmUgRlRfV2luRk5UX0lEX0NQOTM2ICAgMTM0Ci0jZGVmaW5lIEZUX1dpbkZOVF9JRF9DUDk1MCAgIDEzNgotI2RlZmluZSBGVF9XaW5GTlRfSURfQ1AxMjUzICAxNjEKLSNkZWZpbmUgRlRfV2luRk5UX0lEX0NQMTI1NCAgMTYyCi0jZGVmaW5lIEZUX1dpbkZOVF9JRF9DUDEyNTggIDE2MwotI2RlZmluZSBGVF9XaW5GTlRfSURfQ1AxMjU1ICAxNzcKLSNkZWZpbmUgRlRfV2luRk5UX0lEX0NQMTI1NiAgMTc4Ci0jZGVmaW5lIEZUX1dpbkZOVF9JRF9DUDEyNTcgIDE4NgotI2RlZmluZSBGVF9XaW5GTlRfSURfQ1AxMjUxICAyMDQKLSNkZWZpbmUgRlRfV2luRk5UX0lEX0NQODc0ICAgMjIyCi0jZGVmaW5lIEZUX1dpbkZOVF9JRF9DUDEyNTAgIDIzOAotI2RlZmluZSBGVF9XaW5GTlRfSURfT0VNICAgICAyNTUKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1dpbkZOVF9IZWFkZXJSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdpbmRvd3MgRk5UIEhlYWRlciBpbmZvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1dpbkZOVF9IZWFkZXJSZWNfCi0gIHsKLSAgICBGVF9VU2hvcnQgIHZlcnNpb247Ci0gICAgRlRfVUxvbmcgICBmaWxlX3NpemU7Ci0gICAgRlRfQnl0ZSAgICBjb3B5cmlnaHRbNjBdOwotICAgIEZUX1VTaG9ydCAgZmlsZV90eXBlOwotICAgIEZUX1VTaG9ydCAgbm9taW5hbF9wb2ludF9zaXplOwotICAgIEZUX1VTaG9ydCAgdmVydGljYWxfcmVzb2x1dGlvbjsKLSAgICBGVF9VU2hvcnQgIGhvcml6b250YWxfcmVzb2x1dGlvbjsKLSAgICBGVF9VU2hvcnQgIGFzY2VudDsKLSAgICBGVF9VU2hvcnQgIGludGVybmFsX2xlYWRpbmc7Ci0gICAgRlRfVVNob3J0ICBleHRlcm5hbF9sZWFkaW5nOwotICAgIEZUX0J5dGUgICAgaXRhbGljOwotICAgIEZUX0J5dGUgICAgdW5kZXJsaW5lOwotICAgIEZUX0J5dGUgICAgc3RyaWtlX291dDsKLSAgICBGVF9VU2hvcnQgIHdlaWdodDsKLSAgICBGVF9CeXRlICAgIGNoYXJzZXQ7Ci0gICAgRlRfVVNob3J0ICBwaXhlbF93aWR0aDsKLSAgICBGVF9VU2hvcnQgIHBpeGVsX2hlaWdodDsKLSAgICBGVF9CeXRlICAgIHBpdGNoX2FuZF9mYW1pbHk7Ci0gICAgRlRfVVNob3J0ICBhdmdfd2lkdGg7Ci0gICAgRlRfVVNob3J0ICBtYXhfd2lkdGg7Ci0gICAgRlRfQnl0ZSAgICBmaXJzdF9jaGFyOwotICAgIEZUX0J5dGUgICAgbGFzdF9jaGFyOwotICAgIEZUX0J5dGUgICAgZGVmYXVsdF9jaGFyOwotICAgIEZUX0J5dGUgICAgYnJlYWtfY2hhcjsKLSAgICBGVF9VU2hvcnQgIGJ5dGVzX3Blcl9yb3c7Ci0gICAgRlRfVUxvbmcgICBkZXZpY2Vfb2Zmc2V0OwotICAgIEZUX1VMb25nICAgZmFjZV9uYW1lX29mZnNldDsKLSAgICBGVF9VTG9uZyAgIGJpdHNfcG9pbnRlcjsKLSAgICBGVF9VTG9uZyAgIGJpdHNfb2Zmc2V0OwotICAgIEZUX0J5dGUgICAgcmVzZXJ2ZWQ7Ci0gICAgRlRfVUxvbmcgICBmbGFnczsKLSAgICBGVF9VU2hvcnQgIEFfc3BhY2U7Ci0gICAgRlRfVVNob3J0ICBCX3NwYWNlOwotICAgIEZUX1VTaG9ydCAgQ19zcGFjZTsKLSAgICBGVF9VU2hvcnQgIGNvbG9yX3RhYmxlX29mZnNldDsKLSAgICBGVF9VTG9uZyAgIHJlc2VydmVkMVs0XTsKLQotICB9IEZUX1dpbkZOVF9IZWFkZXJSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9XaW5GTlRfSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhbiBARlRfV2luRk5UX0hlYWRlclJlYyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX1dpbkZOVF9IZWFkZXJSZWNfKiAgRlRfV2luRk5UX0hlYWRlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICAgRlRfR2V0X1dpbkZOVF9IZWFkZXIKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICBSZXRyaWV2ZSBhIFdpbmRvd3MgRk5UIGZvbnQgaW5mbyBoZWFkZXIuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICAgZmFjZSAgICA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICAgYWhlYWRlciA6OiBUaGUgV2luRk5UIGhlYWRlci4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGlzIGZ1bmN0aW9uIG9ubHkgd29ya3Mgd2l0aCBXaW5kb3dzIEZOVCBmYWNlcywgcmV0dXJuaW5nIGFuIGVycm9yCi0gICAqICAgb3RoZXJ3aXNlLgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9XaW5GTlRfSGVhZGVyKCBGVF9GYWNlICAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1dpbkZOVF9IZWFkZXJSZWMgICphaGVhZGVyICk7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUV0lORk5UX0hfXyAqLwotCi0KLS8qIEVORCAqLwotCi0KLS8qIExvY2FsIFZhcmlhYmxlczogKi8KLS8qIGNvZGluZzogdXRmLTggICAgKi8KLS8qIEVuZDogICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnR4Zjg2LmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0eGY4Ni5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWQxOTkzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnR4Zjg2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHhmODYuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgU3VwcG9ydCBmdW5jdGlvbnMgZm9yIFgxMS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAwNCwgMjAwNiwgMjAwNywgMjAxMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVFhGODZfSF9fCi0jZGVmaW5lIF9fRlRYRjg2X0hfXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGZvbnRfZm9ybWF0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZvbnQgRm9ybWF0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEdldHRpbmcgdGhlIGZvbnQgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoZSBzaW5nbGUgZnVuY3Rpb24gaW4gdGhpcyBzZWN0aW9uIGNhbiBiZSB1c2VkIHRvIGdldCB0aGUgZm9udCAgICAgKi8KLSAgLyogICBmb3JtYXQuICBOb3RlIHRoYXQgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgbmVlZGVkIG5vcm1hbGx5OyAgICAgICAgICovCi0gIC8qICAgaG93ZXZlciwgdGhlcmUgYXJlIHNwZWNpYWwgY2FzZXMgKGxpa2UgaW4gUERGIGRldmljZXMpIHdoZXJlIGl0IGlzICAqLwotICAvKiAgIGltcG9ydGFudCB0byBkaWZmZXJlbnRpYXRlLCBpbiBzcGl0ZSBvZiBGcmVlVHlwZSdzIHVuaWZvcm0gQVBJLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgWDExL3hmODYgbmFtZXNwYWNlIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMgICAqLwotICAvKiAgIGFuZCBpbiBubyB3YXkgZGVwZW5kcyBvbiB0aGF0IHdpbmRvd2luZyBzeXN0ZW0uICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGVF9HZXRfWDExX0ZvbnRfRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZm9ybWF0IG9mIGEgZ2l2ZW4gZmFjZSwgdXNpbmcgdmFsdWVzICovCi0gIC8qICAgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBYMTEgRk9OVF9QUk9QRVJUWS4gIFBvc3NpYmxlIHZhbHVlcyBhcmUgICAgICAqLwotICAvKiAgIGBUcnVlVHlwZScsIGBUeXBlfjEnLCBgQkRGJywgYFBDRicsIGBUeXBlfjQyJywgYENJRH5UeXBlfjEnLCBgQ0ZGJywgKi8KLSAgLyogICBgUEZSJywgYW5kIGBXaW5kb3dzfkZOVCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBmYWNlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBJbnB1dCBmYWNlIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRm9udCBmb3JtYXQgc3RyaW5nLiAgTlVMTCBpbiBjYXNlIG9mIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBjb25zdCBjaGFyKiApCi0gIEZUX0dldF9YMTFfRm9udF9Gb3JtYXQoIEZUX0ZhY2UgIGZhY2UgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRYRjg2X0hfXyAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9hdXRvaGludC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9hdXRvaGludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDVkZTkzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvYXV0b2hpbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhdXRvaGludC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSGlnaC1sZXZlbCBgYXV0b2hpbnQnIG1vZHVsZS1zcGVjaWZpYyBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMiwgMjAwNywgMjAwOSwgMjAxMiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgYXV0by1oaW50ZXIgaXMgdXNlZCB0byBsb2FkIGFuZCBhdXRvbWF0aWNhbGx5IGhpbnQgZ2x5cGhzIGlmIGEgICAgKi8KLSAgLyogZm9ybWF0LXNwZWNpZmljIGhpbnRlciBpc24ndCBhdmFpbGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fQVVUT0hJTlRfSF9fCi0jZGVmaW5lIF9fQVVUT0hJTlRfSF9fCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEEgc21hbGwgdGVjaG5pY2FsIG5vdGUgcmVnYXJkaW5nIGF1dG9tYXRpYyBoaW50aW5nIGluIG9yZGVyIHRvICAgICAgICAqLwotICAvKiBjbGFyaWZ5IHRoaXMgbW9kdWxlIGludGVyZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFuIGF1dG9tYXRpYyBoaW50ZXIgbWlnaHQgY29tcHV0ZSB0d28ga2luZHMgb2YgZGF0YSBmb3IgYSBnaXZlbiBmYWNlOiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSBnbG9iYWwgaGludHM6IFVzdWFsbHkgc29tZSBtZXRyaWNzIHRoYXQgZGVzY3JpYmUgZ2xvYmFsIHByb3BlcnRpZXMgICovCi0gIC8qICAgICAgICAgICAgICAgICBvZiB0aGUgZmFjZS4gIEl0IGlzIGNvbXB1dGVkIGJ5IHNjYW5uaW5nIG1vcmUgb3IgbGVzcyAqLwotICAvKiAgICAgICAgICAgICAgICAgYWdncmVzc2l2ZWx5IHRoZSBnbHlwaHMgaW4gdGhlIGZhY2UsIGFuZCB0aHVzIGNhbiBiZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgIHZlcnkgc2xvdyB0byBjb21wdXRlIChldmVuIGlmIHRoZSBzaXplIG9mIGdsb2JhbCAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBoaW50cyBpcyByZWFsbHkgc21hbGwpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSBnbHlwaCBoaW50czogIFRoZXNlIGRlc2NyaWJlIHNvbWUgaW1wb3J0YW50IGZlYXR1cmVzIG9mIHRoZSBnbHlwaCAgICovCi0gIC8qICAgICAgICAgICAgICAgICBvdXRsaW5lLCBhcyB3ZWxsIGFzIGhvdyB0byBhbGlnbiB0aGVtLiAgVGhleSBhcmUgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgZ2VuZXJhbGx5IG11Y2ggZmFzdGVyIHRvIGNvbXB1dGUgdGhhbiBnbG9iYWwgaGludHMuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBjdXJyZW50IEZyZWVUeXBlIGF1dG8taGludGVyIGRvZXMgYSBwcmV0dHkgZ29vZCBqb2Igd2hpbGUgICAgICAgICAqLwotICAvKiBwZXJmb3JtaW5nIGZhc3QgY29tcHV0YXRpb25zIGZvciBib3RoIGdsb2JhbCBhbmQgZ2x5cGggaGludHMuICAgICAgICAgKi8KLSAgLyogSG93ZXZlciwgd2UgbWlnaHQgYmUgaW50ZXJlc3RlZCBpbiBpbnRyb2R1Y2luZyBtb3JlIGNvbXBsZXggYW5kICAgICAgICovCi0gIC8qIHBvd2VyZnVsIGFsZ29yaXRobXMgaW4gdGhlIGZ1dHVyZSwgbGlrZSB0aGUgb25lIGRlc2NyaWJlZCBpbiB0aGUgSm9obiAqLwotICAvKiBELiBIb2JieSBwYXBlciwgd2hpY2ggdW5mb3J0dW5hdGVseSByZXF1aXJlcyBhIGxvdCBtb3JlIGhvcnNlcG93ZXIuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEJlY2F1c2UgYSBzdWZmaWNpZW50bHkgc29waGlzdGljYXRlZCBmb250IG1hbmFnZW1lbnQgc3lzdGVtIHdvdWxkICAgICAqLwotICAvKiB0eXBpY2FsbHkgaW1wbGVtZW50IGFuIExSVSBjYWNoZSBvZiBvcGVuZWQgZmFjZSBvYmplY3RzIHRvIHJlZHVjZSAgICAgKi8KLSAgLyogbWVtb3J5IHVzYWdlLCBpdCBpcyBhIGdvb2QgaWRlYSB0byBiZSBhYmxlIHRvIGF2b2lkIHJlY29tcHV0aW5nICAgICAgICovCi0gIC8qIGdsb2JhbCBoaW50cyBldmVyeSB0aW1lIHRoZSBzYW1lIGZhY2UgaXMgcmUtb3BlbmVkLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogV2UgdGh1cyBwcm92aWRlIHRoZSBhYmlsaXR5IHRvIGNhY2hlIGdsb2JhbCBoaW50cyBvdXRzaWRlIG9mIHRoZSBmYWNlICovCi0gIC8qIG9iamVjdCwgaW4gb3JkZXIgdG8gc3BlZWQgdXAgZm9udCByZS1vcGVuaW5nIHRpbWUuICBPZiBjb3Vyc2UsIHRoaXMgICAqLwotICAvKiBmZWF0dXJlIGlzIHB1cmVseSBvcHRpb25hbCwgc28gbW9zdCBjbGllbnQgcHJvZ3JhbXMgd29uJ3QgZXZlbiBub3RpY2UgKi8KLSAgLyogaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJIGluaXRpYWxseSB0aG91Z2h0IHRoYXQgaXQgd291bGQgYmUgYSBnb29kIGlkZWEgdG8gY2FjaGUgdGhlIGdseXBoICAgKi8KLSAgLyogaGludHMgdG9vLiAgSG93ZXZlciwgbXkgZ2VuZXJhbCBpZGVhIG5vdyBpcyB0aGF0IGlmIHlvdSByZWFsbHkgbmVlZCAgICovCi0gIC8qIHRvIGNhY2hlIHRoZXNlIHRvbywgeW91IGFyZSBzaW1wbHkgaW4gbmVlZCBvZiBhIG5ldyBmb250IGZvcm1hdCwgICAgICAqLwotICAvKiB3aGVyZSBhbGwgdGhpcyBpbmZvcm1hdGlvbiBjb3VsZCBiZSBzdG9yZWQgd2l0aGluIHRoZSBmb250IGZpbGUgYW5kICAgKi8KLSAgLyogZGVjb2RlZCBvbiB0aGUgZmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIHR5cGVkZWYgc3RydWN0IEZUX0F1dG9IaW50ZXJSZWNfICAqRlRfQXV0b0hpbnRlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0F1dG9IaW50ZXJfR2xvYmFsR2V0RnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHJpZXZlIHRoZSBnbG9iYWwgaGludHMgY29tcHV0ZWQgZm9yIGEgZ2l2ZW4gZmFjZSBvYmplY3QuICBUaGUgICAqLwotICAvKiAgICByZXN1bHRpbmcgZGF0YSBpcyBkaXNzb2NpYXRlZCBmcm9tIHRoZSBmYWNlIGFuZCB3aWxsIHN1cnZpdmUgYSAgICAgKi8KLSAgLyogICAgY2FsbCB0byBGVF9Eb25lX0ZhY2UoKS4gIEl0IG11c3QgYmUgZGlzY2FyZGVkIHRocm91Z2ggdGhlIEFQSSAgICAgICovCi0gIC8qICAgIEZUX0F1dG9IaW50ZXJfR2xvYmFsRG9uZUZ1bmMoKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhpbnRlciAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGF1dG8taGludGVyLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2xvYmFsX2hpbnRzIDo6IEEgdHlwZWxlc3MgcG9pbnRlciB0byB0aGUgZ2xvYmFsIGhpbnRzLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbG9iYWxfbGVuICAgOjogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGdsb2JhbCBoaW50cy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX0F1dG9IaW50ZXJfR2xvYmFsR2V0RnVuYykoIEZUX0F1dG9IaW50ZXIgIGhpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiAgICAgICAgIGdsb2JhbF9oaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nKiAgICAgICAgICBnbG9iYWxfbGVuICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BdXRvSGludGVyX0dsb2JhbERvbmVGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEaXNjYXJkIHRoZSBnbG9iYWwgaGludHMgcmV0cmlldmVkIHRocm91Z2ggICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQXV0b0hpbnRlcl9HbG9iYWxHZXRGdW5jKCkuICBUaGlzIGlzIHRoZSBvbmx5IHdheSB0aGVzZSBoaW50cyAgICovCi0gIC8qICAgIGFyZSBmcmVlZCBmcm9tIG1lbW9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhpbnRlciA6OiBBIGhhbmRsZSB0byB0aGUgYXV0by1oaW50ZXIgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2xvYmFsIDo6IEEgcG9pbnRlciB0byByZXRyaWV2ZWQgZ2xvYmFsIGhpbnRzIHRvIGRpc2NhcmQuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9BdXRvSGludGVyX0dsb2JhbERvbmVGdW5jKSggRlRfQXV0b0hpbnRlciAgaGludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICBnbG9iYWwgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0F1dG9IaW50ZXJfR2xvYmFsUmVzZXRGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWNvbXB1dGUgdGhlIGdsb2JhbCBtZXRyaWNzIGluIGEgZ2l2ZW4gICAqLwotICAvKiAgICBmb250LiAgVGhpcyBpcyB1c2VmdWwgd2hlbiBnbG9iYWwgZm9udCBkYXRhIGNoYW5nZXMgKGUuZy4gTXVsdGlwbGUgKi8KLSAgLyogICAgTWFzdGVycyBmb250cyB3aGVyZSBibGVuZCBjb29yZGluYXRlcyBjaGFuZ2UpLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGludGVyIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgYXV0by1oaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX0F1dG9IaW50ZXJfR2xvYmFsUmVzZXRGdW5jKSggRlRfQXV0b0hpbnRlciAgaGludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgZmFjZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQXV0b0hpbnRlcl9HbHlwaExvYWRGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGxvYWQsIHNjYWxlLCBhbmQgYXV0b21hdGljYWxseSBoaW50IGEgICAgICovCi0gIC8qICAgIGdseXBoIGZyb20gYSBnaXZlbiBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfaW5kZXggOjogVGhlIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkX2ZsYWdzICA6OiBUaGUgbG9hZCBmbGFncy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhcGFibGUgb2YgbG9hZGluZyBjb21wb3NpdGUgZ2x5cGhzIGJ5IGhpbnRpbmcgICAgKi8KLSAgLyogICAgZWFjaCBzdWItZ2x5cGggaW5kZXBlbmRlbnRseSAod2hpY2ggaW1wcm92ZXMgcXVhbGl0eSkuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJdCB3aWxsIGNhbGwgdGhlIGZvbnQgZHJpdmVyIHdpdGggQEZUX0xvYWRfR2x5cGgsIHdpdGggICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0xPQURfTk9fU0NBTEUgc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfQXV0b0hpbnRlcl9HbHlwaExvYWRGdW5jKSggRlRfQXV0b0hpbnRlciAgaGludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZSAgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgICAgICBsb2FkX2ZsYWdzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BdXRvSGludGVyX0ludGVyZmFjZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYXV0by1oaW50ZXIgbW9kdWxlJ3MgaW50ZXJmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9BdXRvSGludGVyX0ludGVyZmFjZVJlY18KLSAgewotICAgIEZUX0F1dG9IaW50ZXJfR2xvYmFsUmVzZXRGdW5jICByZXNldF9mYWNlOwotICAgIEZUX0F1dG9IaW50ZXJfR2xvYmFsR2V0RnVuYyAgICBnZXRfZ2xvYmFsX2hpbnRzOwotICAgIEZUX0F1dG9IaW50ZXJfR2xvYmFsRG9uZUZ1bmMgICBkb25lX2dsb2JhbF9oaW50czsKLSAgICBGVF9BdXRvSGludGVyX0dseXBoTG9hZEZ1bmMgICAgbG9hZF9nbHlwaDsKLQotICB9IEZUX0F1dG9IaW50ZXJfSW50ZXJmYWNlUmVjLCAqRlRfQXV0b0hpbnRlcl9JbnRlcmZhY2U7Ci0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX0RFRklORV9BVVRPSElOVEVSX0lOVEVSRkFDRSggICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByZXNldF9mYWNlXywgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X2dsb2JhbF9oaW50c18sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfZ2xvYmFsX2hpbnRzXywgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2dseXBoXyApICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRiAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBGVF9BdXRvSGludGVyX0ludGVyZmFjZVJlYyAgY2xhc3NfID0gIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmVzZXRfZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldF9nbG9iYWxfaGludHNfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBkb25lX2dsb2JhbF9oaW50c18sICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbG9hZF9nbHlwaF8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFRklORV9BVVRPSElOVEVSX0lOVEVSRkFDRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByZXNldF9mYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X2dsb2JhbF9oaW50c18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfZ2xvYmFsX2hpbnRzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2dseXBoXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgICAgICAgICAgbGlicmFyeSwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9BdXRvSGludGVyX0ludGVyZmFjZVJlYyogIGNsYXp6ICkgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnJlc2V0X2ZhY2UgICAgICAgID0gcmVzZXRfZmFjZV87ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfZ2xvYmFsX2hpbnRzICA9IGdldF9nbG9iYWxfaGludHNfOyAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+ZG9uZV9nbG9iYWxfaGludHMgPSBkb25lX2dsb2JhbF9oaW50c187ICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfZ2x5cGggICAgICAgID0gbG9hZF9nbHlwaF87ICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0FVVE9ISU5UX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9mdGNhbGMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvZnRjYWxjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZWMzN2IuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9mdGNhbGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGNhbGMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXJpdGhtZXRpYyBjb21wdXRhdGlvbnMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwNiwgMjAwOCwgMjAwOSwgMjAxMi0yMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVENBTENfSF9fCi0jZGVmaW5lIF9fRlRDQUxDX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGVF9NdWxEaXYoKSBhbmQgRlRfTXVsRml4KCkgYXJlIGRlY2xhcmVkIGluIGZyZWV0eXBlLmguICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmICBGVF9DT05GSUdfT1BUSU9OX05PX0FTU0VNQkxFUgotICAvKiBQcm92aWRlIGFzc2VtYmxlciBmcmFnbWVudHMgZm9yIHBlcmZvcm1hbmNlLWNyaXRpY2FsIGZ1bmN0aW9ucy4gKi8KLSAgLyogVGhlc2UgbXVzdCBiZSBkZWZpbmVkIGBzdGF0aWMgX19pbmxpbmVfXycgd2l0aCBHQ0MuICAgICAgICAgICAgICovCi0KLSNpZiBkZWZpbmVkKCBfX0NDX0FSTSApIHx8IGRlZmluZWQoIF9fQVJNQ0NfXyApICAvKiBSVkNUICovCi0KLSNkZWZpbmUgRlRfTVVMRklYX0FTU0VNQkxFUiAgRlRfTXVsRml4X2FybQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIHN0YXRpYyBfX2lubGluZSBGVF9JbnQzMgotICBGVF9NdWxGaXhfYXJtKCBGVF9JbnQzMiAgYSwKLSAgICAgICAgICAgICAgICAgRlRfSW50MzIgIGIgKQotICB7Ci0gICAgcmVnaXN0ZXIgRlRfSW50MzIgIHQsIHQyOwotCi0KLSAgICBfX2FzbQotICAgIHsKLSAgICAgIHNtdWxsIHQyLCB0LCAgYiwgIGEgICAgICAgICAgIC8qIChsbz10MixoaT10KSA9IGEqYiAqLwotICAgICAgbW92ICAgYSwgIHQsICBhc3IgIzMxICAgICAgICAgLyogYSAgID0gKGhpID4+IDMxKSAqLwotICAgICAgYWRkICAgYSwgIGEsICAjMHg4MDAwICAgICAgICAgLyogYSAgKz0gMHg4MDAwICovCi0gICAgICBhZGRzICB0MiwgdDIsIGEgICAgICAgICAgICAgICAvKiB0MiArPSBhICovCi0gICAgICBhZGMgICB0LCAgdCwgICMwICAgICAgICAgICAgICAvKiB0ICArPSBjYXJyeSAqLwotICAgICAgbW92ICAgYSwgIHQyLCBsc3IgIzE2ICAgICAgICAgLyogYSAgID0gdDIgPj4gMTYgKi8KLSAgICAgIG9yciAgIGEsICBhLCAgdCwgIGxzbCAjMTYgICAgIC8qIGEgIHw9IHQgPDwgMTYgKi8KLSAgICB9Ci0gICAgcmV0dXJuIGE7Ci0gIH0KLQotI2VuZGlmIC8qIF9fQ0NfQVJNIHx8IF9fQVJNQ0NfXyAqLwotCi0KLSNpZmRlZiBfX0dOVUNfXwotCi0jaWYgZGVmaW5lZCggX19hcm1fXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgXAotICAgICggIWRlZmluZWQoIF9fdGh1bWJfXyApIHx8IGRlZmluZWQoIF9fdGh1bWIyX18gKSApICYmIFwKLSAgICAhKCBkZWZpbmVkKCBfX0NDX0FSTSApIHx8IGRlZmluZWQoIF9fQVJNQ0NfXyApICkKLQotI2RlZmluZSBGVF9NVUxGSVhfQVNTRU1CTEVSICBGVF9NdWxGaXhfYXJtCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgc3RhdGljIF9faW5saW5lX18gRlRfSW50MzIKLSAgRlRfTXVsRml4X2FybSggRlRfSW50MzIgIGEsCi0gICAgICAgICAgICAgICAgIEZUX0ludDMyICBiICkKLSAgewotICAgIHJlZ2lzdGVyIEZUX0ludDMyICB0LCB0MjsKLQotCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgInNtdWxsICAlMSwgJTIsICU0LCAlM1xuXHQiICAgICAgIC8qIChsbz0lMSxoaT0lMikgPSBhKmIgKi8KLSAgICAgICJtb3YgICAgJTAsICUyLCBhc3IgIzMxXG5cdCIgICAgICAvKiAlMCAgPSAoaGkgPj4gMzEpICovCi0jaWYgZGVmaW5lZCggX19jbGFuZ19fICkgJiYgZGVmaW5lZCggX190aHVtYjJfXyApCi0gICAgICAiYWRkLncgICUwLCAlMCwgIzB4ODAwMFxuXHQiICAgICAgLyogJTAgKz0gMHg4MDAwICovCi0jZWxzZQotICAgICAgImFkZCAgICAlMCwgJTAsICMweDgwMDBcblx0IiAgICAgIC8qICUwICs9IDB4ODAwMCAqLwotI2VuZGlmCi0gICAgICAiYWRkcyAgICUxLCAlMSwgJTBcblx0IiAgICAgICAgICAgLyogJTEgKz0gJTAgKi8KLSAgICAgICJhZGMgICAgJTIsICUyLCAjMFxuXHQiICAgICAgICAgICAvKiAlMiArPSBjYXJyeSAqLwotICAgICAgIm1vdiAgICAlMCwgJTEsIGxzciAjMTZcblx0IiAgICAgIC8qICUwICA9ICUxID4+IDE2ICovCi0gICAgICAib3JyICAgICUwLCAlMCwgJTIsIGxzbCAjMTZcblx0IiAgLyogJTAgfD0gJTIgPDwgMTYgKi8KLSAgICAgIDogIj1yIihhKSwgIj0mciIodDIpLCAiPSZyIih0KQotICAgICAgOiAiciIoYSksICJyIihiKQotICAgICAgOiAiY2MiICk7Ci0gICAgcmV0dXJuIGE7Ci0gIH0KLQotI2VuZGlmIC8qIF9fYXJtX18gICAgICAgICAgICAgICAgICAgICAgJiYgKi8KLSAgICAgICAvKiAoIF9fdGh1bWIyX18gfHwgIV9fdGh1bWJfXyApICYmICovCi0gICAgICAgLyogISggX19DQ19BUk0gfHwgX19BUk1DQ19fICkgICAgICAqLwotCi0KLSNpZiBkZWZpbmVkKCBfX2kzODZfXyApCi0KLSNkZWZpbmUgRlRfTVVMRklYX0FTU0VNQkxFUiAgRlRfTXVsRml4X2kzODYKLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBzdGF0aWMgX19pbmxpbmVfXyBGVF9JbnQzMgotICBGVF9NdWxGaXhfaTM4NiggRlRfSW50MzIgIGEsCi0gICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgYiApCi0gIHsKLSAgICByZWdpc3RlciBGVF9JbnQzMiAgcmVzdWx0OwotCi0KLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAiaW11bCAgJSVlZHhcbiIKLSAgICAgICJtb3ZsICAlJWVkeCwgJSVlY3hcbiIKLSAgICAgICJzYXJsICAkMzEsICUlZWN4XG4iCi0gICAgICAiYWRkbCAgJDB4ODAwMCwgJSVlY3hcbiIKLSAgICAgICJhZGRsICAlJWVjeCwgJSVlYXhcbiIKLSAgICAgICJhZGNsICAkMCwgJSVlZHhcbiIKLSAgICAgICJzaHJsICAkMTYsICUlZWF4XG4iCi0gICAgICAic2hsbCAgJDE2LCAlJWVkeFxuIgotICAgICAgImFkZGwgICUlZWR4LCAlJWVheFxuIgotICAgICAgOiAiPWEiKHJlc3VsdCksICI9ZCIoYikKLSAgICAgIDogImEiKGEpLCAiZCIoYikKLSAgICAgIDogIiVlY3giLCAiY2MiICk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0jZW5kaWYgLyogaTM4NiAqLwotCi0jZW5kaWYgLyogX19HTlVDX18gKi8KLQotCi0jaWZkZWYgX01TQ19WRVIgLyogVmlzdWFsIEMrKyAqLwotCi0jaWZkZWYgX01fSVg4NgotCi0jZGVmaW5lIEZUX01VTEZJWF9BU1NFTUJMRVIgIEZUX011bEZpeF9pMzg2Ci0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgc3RhdGljIF9faW5saW5lIEZUX0ludDMyCi0gIEZUX011bEZpeF9pMzg2KCBGVF9JbnQzMiAgYSwKLSAgICAgICAgICAgICAgICAgIEZUX0ludDMyICBiICkKLSAgewotICAgIHJlZ2lzdGVyIEZUX0ludDMyICByZXN1bHQ7Ci0KLSAgICBfX2FzbQotICAgIHsKLSAgICAgIG1vdiBlYXgsIGEKLSAgICAgIG1vdiBlZHgsIGIKLSAgICAgIGltdWwgZWR4Ci0gICAgICBtb3YgZWN4LCBlZHgKLSAgICAgIHNhciBlY3gsIDMxCi0gICAgICBhZGQgZWN4LCA4MDAwaAotICAgICAgYWRkIGVheCwgZWN4Ci0gICAgICBhZGMgZWR4LCAwCi0gICAgICBzaHIgZWF4LCAxNgotICAgICAgc2hsIGVkeCwgMTYKLSAgICAgIGFkZCBlYXgsIGVkeAotICAgICAgbW92IHJlc3VsdCwgZWF4Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotI2VuZGlmIC8qIF9NX0lYODYgKi8KLQotI2VuZGlmIC8qIF9NU0NfVkVSICovCi0KLQotI2lmIGRlZmluZWQoIF9fR05VQ19fICkgJiYgZGVmaW5lZCggX194ODZfNjRfXyApCi0KLSNkZWZpbmUgRlRfTVVMRklYX0FTU0VNQkxFUiAgRlRfTXVsRml4X3g4Nl82NAotCi0gIHN0YXRpYyBfX2lubGluZV9fIEZUX0ludDMyCi0gIEZUX011bEZpeF94ODZfNjQoIEZUX0ludDMyICBhLAotICAgICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgYiApCi0gIHsKLSAgICAvKiBUZW1wb3JhcmlseSBkaXNhYmxlIHRoZSB3YXJuaW5nIHRoYXQgQzkwIGRvZXNuJ3Qgc3VwcG9ydCAqLwotICAgIC8qIGBsb25nIGxvbmcnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWYgX19HTlVDX18gPiA0IHx8ICggX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA+PSA2ICkKLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAotI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV2xvbmctbG9uZyIKLSNlbmRpZgotCi0jaWYgMQotICAgIC8qIFRlY2huaWNhbGx5IG5vdCBhbiBhc3NlbWJseSBmcmFnbWVudCwgYnV0IEdDQyBkb2VzIGEgcmVhbGx5IGdvb2QgKi8KLSAgICAvKiBqb2IgYXQgaW5saW5pbmcgaXQgYW5kIGdlbmVyYXRpbmcgZ29vZCBtYWNoaW5lIGNvZGUgZm9yIGl0LiAgICAgICovCi0gICAgbG9uZyBsb25nICByZXQsIHRtcDsKLQotCi0gICAgcmV0ICA9IChsb25nIGxvbmcpYSAqIGI7Ci0gICAgdG1wICA9IHJldCA+PiA2MzsKLSAgICByZXQgKz0gMHg4MDAwICsgdG1wOwotCi0gICAgcmV0dXJuIChGVF9JbnQzMikoIHJldCA+PiAxNiApOwotI2Vsc2UKLQotICAgIC8qIEZvciBzb21lIHJlYXNvbiwgR0NDIDQuNiBvbiBVYnVudHUgMTIuMDQgZ2VuZXJhdGVzIGludmFsaWQgbWFjaGluZSAgKi8KLSAgICAvKiBjb2RlIGZyb20gdGhlIGxpbmVzIGJlbG93LiAgVGhlIG1haW4gaXNzdWUgaXMgdGhhdCBgd2lkZV9hJyBpcyBub3QgICovCi0gICAgLyogcHJvcGVybHkgaW5pdGlhbGl6ZWQgYnkgc2lnbi1leHRlbmRpbmcgYGEnLiAgSW5zdGVhZCwgdGhlIGdlbmVyYXRlZCAqLwotICAgIC8qIG1hY2hpbmUgY29kZSBhc3N1bWVzIHRoYXQgdGhlIHJlZ2lzdGVyIHRoYXQgY29udGFpbnMgYGEnIG9uIGlucHV0ICAgKi8KLSAgICAvKiBjYW4gYmUgdXNlZCBkaXJlY3RseSBhcyBhIDY0LWJpdCB2YWx1ZSwgd2hpY2ggaXMgd3JvbmcgbW9zdCBvZiB0aGUgICovCi0gICAgLyogdGltZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGxvbmcgbG9uZyAgd2lkZV9hID0gKGxvbmcgbG9uZylhOwotICAgIGxvbmcgbG9uZyAgd2lkZV9iID0gKGxvbmcgbG9uZyliOwotICAgIGxvbmcgbG9uZyAgcmVzdWx0OwotCi0KLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0gICAgICAiaW11bCAlMiwgJTFcbiIKLSAgICAgICJtb3YgJTEsICUwXG4iCi0gICAgICAic2FyICQ2MywgJTBcbiIKLSAgICAgICJsZWEgMHg4MDAwKCUxLCAlMCksICUwXG4iCi0gICAgICAic2FyICQxNiwgJTBcbiIKLSAgICAgIDogIj0mciIocmVzdWx0KSwgIj0mciIod2lkZV9hKQotICAgICAgOiAiciIod2lkZV9iKQotICAgICAgOiAiY2MiICk7Ci0KLSAgICByZXR1cm4gKEZUX0ludDMyKXJlc3VsdDsKLSNlbmRpZgotCi0jaWYgX19HTlVDX18gPiA0IHx8ICggX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA+PSA2ICkKLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCi0jZW5kaWYKLSAgfQotCi0jZW5kaWYgLyogX19HTlVDX18gJiYgX194ODZfNjRfXyAqLwotCi0jZW5kaWYgLyogIUZUX0NPTkZJR19PUFRJT05fTk9fQVNTRU1CTEVSICovCi0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5MSU5FX01VTEZJWAotI2lmZGVmIEZUX01VTEZJWF9BU1NFTUJMRVIKLSNkZWZpbmUgRlRfTXVsRml4KCBhLCBiICkgIEZUX01VTEZJWF9BU1NFTUJMRVIoIChGVF9JbnQzMikoYSksIChGVF9JbnQzMikoYikgKQotI2VuZGlmCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX011bERpdl9Ob19Sb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdmVyeSBzaW1wbGUgZnVuY3Rpb24gdXNlZCB0byBwZXJmb3JtIHRoZSBjb21wdXRhdGlvbiBgKGEqYikvYycgICAqLwotICAvKiAgICAod2l0aG91dCByb3VuZGluZykgd2l0aCBtYXhpbXVtIGFjY3VyYWN5IChpdCB1c2VzIGEgNjQtYml0ICAgICAgICAgKi8KLSAgLyogICAgaW50ZXJtZWRpYXRlIGludGVnZXIgd2hlbmV2ZXIgbmVjZXNzYXJ5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzbid0IG5lY2Vzc2FyaWx5IGFzIGZhc3QgYXMgc29tZSBwcm9jZXNzb3Igc3BlY2lmaWMgKi8KLSAgLyogICAgb3BlcmF0aW9ucywgYnV0IGlzIGF0IGxlYXN0IGNvbXBsZXRlbHkgcG9ydGFibGUuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYSA6OiBUaGUgZmlyc3QgbXVsdGlwbGllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGIgOjogVGhlIHNlY29uZCBtdWx0aXBsaWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjIDo6IFRoZSBkaXZpc29yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmVzdWx0IG9mIGAoYSpiKS9jJy4gIFRoaXMgZnVuY3Rpb24gbmV2ZXIgdHJhcHMgd2hlbiB0cnlpbmcgdG8gKi8KLSAgLyogICAgZGl2aWRlIGJ5IHplcm87IGl0IHNpbXBseSByZXR1cm5zIGBNYXhJbnQnIG9yIGBNaW5JbnQnIGRlcGVuZGluZyAgICovCi0gIC8qICAgIG9uIHRoZSBzaWducyBvZiBgYScgYW5kIGBiJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfTG9uZyApCi0gIEZUX011bERpdl9Ob19Sb3VuZCggRlRfTG9uZyAgYSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICBiLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgIGMgKTsKLQotCi0gIC8qCi0gICAqICBBIHZhcmlhbnQgb2YgRlRfTWF0cml4X011bHRpcGx5IHdoaWNoIHNjYWxlcyBpdHMgcmVzdWx0IGFmdGVyd2FyZHMuCi0gICAqICBUaGUgaWRlYSBpcyB0aGF0IGJvdGggYGEnIGFuZCBgYicgYXJlIHNjYWxlZCBieSBmYWN0b3JzIG9mIDEwIHNvIHRoYXQKLSAgICogIHRoZSB2YWx1ZXMgYXJlIGFzIHByZWNpc2UgYXMgcG9zc2libGUgdG8gZ2V0IGEgY29ycmVjdCByZXN1bHQgZHVyaW5nCi0gICAqICB0aGUgNjRiaXQgbXVsdGlwbGljYXRpb24uICBMZXQgYHNhJyBhbmQgYHNiJyBiZSB0aGUgc2NhbGluZyBmYWN0b3JzIG9mCi0gICAqICBgYScgYW5kIGBiJywgcmVzcGVjdGl2ZWx5LCB0aGVuIHRoZSBzY2FsaW5nIGZhY3RvciBvZiB0aGUgcmVzdWx0IGlzCi0gICAqICBgc2Eqc2InLgotICAgKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIEZUX01hdHJpeF9NdWx0aXBseV9TY2FsZWQoIGNvbnN0IEZUX01hdHJpeCogIGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01hdHJpeCAgICAgICAgKmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgICAgIHNjYWxpbmcgKTsKLQotCi0gIC8qCi0gICAqICBBIHZhcmlhbnQgb2YgRlRfVmVjdG9yX1RyYW5zZm9ybS4gIFNlZSBjb21tZW50cyBmb3IKLSAgICogIEZUX01hdHJpeF9NdWx0aXBseV9TY2FsZWQuCi0gICAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfVmVjdG9yX1RyYW5zZm9ybV9TY2FsZWQoIEZUX1ZlY3RvciogICAgICAgIHZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX01hdHJpeCogIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgICAgIHNjYWxpbmcgKTsKLQotCi0gIC8qCi0gICAqICBSZXR1cm4gLTEsIDAsIG9yICsxLCBkZXBlbmRpbmcgb24gdGhlIG9yaWVudGF0aW9uIG9mIGEgZ2l2ZW4gY29ybmVyLgotICAgKiAgV2UgdXNlIHRoZSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSBzeXN0ZW0sIHdpdGggcG9zaXRpdmUgdmVydGljYWwgdmFsdWVzCi0gICAqICBnb2luZyB1cHdhcmRzLiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgKzEgaWYgdGhlIGNvcm5lciB0dXJucyB0byB0aGUKLSAgICogIGxlZnQsIC0xIHRvIHRoZSByaWdodCwgYW5kIDAgZm9yIHVuZGVjaWRhYmxlIGNhc2VzLgotICAgKi8KLSAgRlRfQkFTRSggRlRfSW50ICkKLSAgZnRfY29ybmVyX29yaWVudGF0aW9uKCBGVF9Qb3MgIGluX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBpbl95LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgb3V0X3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBvdXRfeSApOwotCi0KLSAgLyoKLSAgICogIFJldHVybiBUUlVFIGlmIGEgY29ybmVyIGlzIGZsYXQgb3IgbmVhcmx5IGZsYXQuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KLSAgICogIHNheWluZyB0aGF0IHRoZSBjb3JuZXIgcG9pbnQgaXMgY2xvc2UgdG8gaXRzIG5laWdoYm9ycywgb3IgaW5zaWRlIGFuCi0gICAqICBlbGxpcHNlIGRlZmluZWQgYnkgdGhlIG5laWdoYm9yIGZvY2FsIHBvaW50cyB0byBiZSBtb3JlIHByZWNpc2UuCi0gICAqLwotICBGVF9CQVNFKCBGVF9JbnQgKQotICBmdF9jb3JuZXJfaXNfZmxhdCggRlRfUG9zICBpbl94LAotICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBpbl95LAotICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBvdXRfeCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgb3V0X3kgKTsKLQotCi0gIC8qCi0gICAqICBSZXR1cm4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGluZGV4LgotICAgKi8KLQotI2lmbmRlZiAgRlRfQ09ORklHX09QVElPTl9OT19BU1NFTUJMRVIKLSNpZiBkZWZpbmVkKCBfX0dOVUNfXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgXAotICAgICggX19HTlVDX18gPiAzIHx8ICggX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA+PSA0ICkgKQotCi0jaWYgRlRfU0laRU9GX0lOVCA9PSA0Ci0KLSNkZWZpbmUgRlRfTVNCKCB4ICkgICggMzEgLSBfX2J1aWx0aW5fY2x6KCB4ICkgKQotCi0jZWxpZiBGVF9TSVpFT0ZfTE9ORyA9PSA0Ci0KLSNkZWZpbmUgRlRfTVNCKCB4ICkgICggMzEgLSBfX2J1aWx0aW5fY2x6bCggeCApICkKLQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX0dOVUNfXyAqLwotI2VuZGlmIC8qICFGVF9DT05GSUdfT1BUSU9OX05PX0FTU0VNQkxFUiAqLwotCi0jaWZuZGVmIEZUX01TQgotCi0gIEZUX0JBU0UoIEZUX0ludCApCi0gIEZUX01TQiggRlRfVUludDMyICB6ICk7Ci0KLSNlbmRpZgotCi0KLSAgLyoKLSAgICogIFJldHVybiBzcXJ0KHgqeCt5KnkpLCB3aGljaCBpcyB0aGUgc2FtZSBhcyBgRlRfVmVjdG9yX0xlbmd0aCcgYnV0IHVzZXMKLSAgICogIHR3byBmaXhlZC1wb2ludCBhcmd1bWVudHMgaW5zdGVhZC4KLSAgICovCi0gIEZUX0JBU0UoIEZUX0ZpeGVkICkKLSAgRlRfSHlwb3QoIEZUX0ZpeGVkICB4LAotICAgICAgICAgICAgRlRfRml4ZWQgIHkgKTsKLQotCi0jaWYgMAotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NxcnRGaXhlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGVzIHRoZSBzcXVhcmUgcm9vdCBvZiBhIDE2LjE2IGZpeGVkLXBvaW50IHZhbHVlLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHggOjogVGhlIHZhbHVlIHRvIGNvbXB1dGUgdGhlIHJvb3QgZm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXN1bHQgb2YgYHNxcnQoeCknLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHZlcnkgZmFzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfSW50MzIgKQotICBGVF9TcXJ0Rml4ZWQoIEZUX0ludDMyICB4ICk7Ci0KLSNlbmRpZiAvKiAwICovCi0KLQotI2RlZmluZSBJTlRfVE9fRjI2RE9UNiggeCApICAgICggKEZUX0xvbmcpKHgpIDw8IDYgICkKLSNkZWZpbmUgSU5UX1RPX0YyRE9UMTQoIHggKSAgICAoIChGVF9Mb25nKSh4KSA8PCAxNCApCi0jZGVmaW5lIElOVF9UT19GSVhFRCggeCApICAgICAgKCAoRlRfTG9uZykoeCkgPDwgMTYgKQotI2RlZmluZSBGMkRPVDE0X1RPX0ZJWEVEKCB4ICkgICggKEZUX0xvbmcpKHgpIDw8IDIgICkKLSNkZWZpbmUgRkxPQVRfVE9fRklYRUQoIHggKSAgICAoIChGVF9Mb25nKSggeCAqIDY1NTM2LjAgKSApCi0jZGVmaW5lIEZJWEVEX1RPX0lOVCggeCApICAgICAgKCBGVF9Sb3VuZEZpeCggeCApID4+IDE2ICkKLQotI2RlZmluZSBST1VORF9GMjZET1Q2KCB4ICkgICAgICggeCA+PSAwID8gKCAgICAoICh4KSArIDMyICkgJiAtNjQgKSAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKCAtKCAoIDMyIC0gKHgpICkgJiAtNjQgKSApICkKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUQ0FMQ19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvZnRkZWJ1Zy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9mdGRlYnVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YTM5MTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9mdGRlYnVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRkZWJ1Zy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIERlYnVnZ2luZyBhbmQgbG9nZ2luZyBjb21wb25lbnQgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDIsIDIwMDQsIDIwMDYtMjAwOSwgMjAxMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJTVBPUlRBTlQ6IEEgZGVzY3JpcHRpb24gb2YgRnJlZVR5cGUncyBkZWJ1Z2dpbmcgc3VwcG9ydCBjYW4gYmUgICAgICAgICovCi0vKiAgICAgICAgICAgICBmb3VuZCBpbiBgZG9jcy9ERUJVRy5UWFQnLiAgUmVhZCBpdCBpZiB5b3UgbmVlZCB0byB1c2Ugb3IgICAqLwotLyogICAgICAgICAgICAgdW5kZXJzdGFuZCB0aGlzIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVERFQlVHX0hfXwotI2RlZmluZSBfX0ZUREVCVUdfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9DT05GSUdfQ09ORklHX0gKLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qIGZvcmNlIHRoZSBkZWZpbml0aW9uIG9mIEZUX0RFQlVHX0xFVkVMX0VSUk9SIGlmIEZUX0RFQlVHX0xFVkVMX1RSQUNFICovCi0gIC8qIGlzIGFscmVhZHkgZGVmaW5lZDsgdGhpcyBzaW1wbGlmaWVzIHRoZSBmb2xsb3dpbmcgI2lmZGVmcyAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSN1bmRlZiAgRlRfREVCVUdfTEVWRUxfRVJST1IKLSNkZWZpbmUgRlRfREVCVUdfTEVWRUxfRVJST1IKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgdGhlIHRyYWNlIGVudW1zIGFzIHdlbGwgYXMgdGhlIHRyYWNlIGxldmVscyBhcnJheSB3aGVuIHRoZXkgICAgKi8KLSAgLyogYXJlIG5lZWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0KLSNkZWZpbmUgRlRfVFJBQ0VfREVGKCB4ICkgIHRyYWNlXyAjIyB4ICwKLQotICAvKiBkZWZpbmluZyB0aGUgZW51bWVyYXRpb24gKi8KLSAgdHlwZWRlZiBlbnVtICBGVF9UcmFjZV8KLSAgewotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFJBQ0VfSAotICAgIHRyYWNlX2NvdW50Ci0KLSAgfSBGVF9UcmFjZTsKLQotCi0gIC8qIGRlZmluaW5nIHRoZSBhcnJheSBvZiB0cmFjZSBsZXZlbHMsIHByb3ZpZGVkIGJ5IGBzcmMvYmFzZS9mdGRlYnVnLmMnICovCi0gIGV4dGVybiBpbnQgIGZ0X3RyYWNlX2xldmVsc1t0cmFjZV9jb3VudF07Ci0KLSN1bmRlZiBGVF9UUkFDRV9ERUYKLQotI2VuZGlmIC8qIEZUX0RFQlVHX0xFVkVMX1RSQUNFICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSB0aGUgRlRfVFJBQ0UgbWFjcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSU1QT1JUQU5UISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBFYWNoIGNvbXBvbmVudCBtdXN0IGRlZmluZSB0aGUgbWFjcm8gRlRfQ09NUE9ORU5UIHRvIGEgdmFsaWQgRlRfVHJhY2UgKi8KLSAgLyogdmFsdWUgYmVmb3JlIHVzaW5nIGFueSBUUkFDRSBtYWNyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0KLSNkZWZpbmUgRlRfVFJBQ0UoIGxldmVsLCB2YXJmb3JtYXQgKSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGlmICggZnRfdHJhY2VfbGV2ZWxzW0ZUX0NPTVBPTkVOVF0gPj0gbGV2ZWwgKSBcCi0gICAgICAgICAgICAgIEZUX01lc3NhZ2UgdmFyZm9ybWF0OyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0gd2hpbGUgKCAwICkKLQotI2Vsc2UgLyogIUZUX0RFQlVHX0xFVkVMX1RSQUNFICovCi0KLSNkZWZpbmUgRlRfVFJBQ0UoIGxldmVsLCB2YXJmb3JtYXQgKSAgZG8geyB9IHdoaWxlICggMCApICAgICAgLyogbm90aGluZyAqLwotCi0jZW5kaWYgLyogIUZUX0RFQlVHX0xFVkVMX1RSQUNFICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9UcmFjZV9HZXRfQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBhdmFpbGFibGUgdHJhY2UgY29tcG9uZW50cy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbnVtYmVyIG9mIHRyYWNlIGNvbXBvbmVudHMuICAwIGlmIEZyZWVUeXBlIDIgaXMgbm90IGJ1aWx0IHdpdGggKi8KLSAgLyogICAgRlRfREVCVUdfTEVWRUxfVFJBQ0UgZGVmaW5pdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGFjY2VzcyBlbGVtZW50cyBvZiAgICAgICovCi0gIC8qICAgIHRoZSBpbnRlcm5hbCBgZnRfdHJhY2VfbGV2ZWxzJyBhcnJheSBieSBhbiBpbmRleC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfSW50ICkKLSAgRlRfVHJhY2VfR2V0X0NvdW50KCB2b2lkICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9UcmFjZV9HZXRfTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gdGhlIG5hbWUgb2YgYSB0cmFjZSBjb21wb25lbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgaW5kZXggb2YgdGhlIHRyYWNlIGNvbXBvbmVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbmFtZSBvZiB0aGUgdHJhY2UgY29tcG9uZW50LiAgVGhpcyBpcyBhIHN0YXRpY2FsbHkgYWxsb2NhdGVkICAgKi8KLSAgLyogICAgQyBzdHJpbmcsIHNvIGRvIG5vdCBmcmVlIGl0IGFmdGVyIHVzZS4gIE5VTEwgaWYgRnJlZVR5cGUgMiBpcyBub3QgICovCi0gIC8qICAgIGJ1aWx0IHdpdGggRlRfREVCVUdfTEVWRUxfVFJBQ0UgZGVmaW5pdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZSBARlRfVHJhY2VfR2V0X0NvdW50IHRvIGdldCB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSB0cmFjZSAgICAgICAqLwotICAvKiAgICBjb21wb25lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBjb250cm9sIEZyZWVUeXBlIDIncyAgICAqLwotICAvKiAgICBkZWJ1ZyBsZXZlbCBpbiB5b3VyIGFwcGxpY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0JBU0UoIGNvbnN0IGNoYXIgKiApCi0gIEZUX1RyYWNlX0dldF9OYW1lKCBGVF9JbnQgIGlkeCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBZb3UgbmVlZCB0d28gb3BlbmluZyBhbmQgY2xvc2luZyBwYXJlbnRoZXNlcyEgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEV4YW1wbGU6IEZUX1RSQUNFMCgoICJWYWx1ZSBpcyAlaSIsIGZvbyApKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3V0cHV0IG9mIHRoZSBGVF9UUkFDRVggbWFjcm9zIGlzIHNlbnQgdG8gc3RkZXJyLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBGVF9UUkFDRTAoIHZhcmZvcm1hdCApICBGVF9UUkFDRSggMCwgdmFyZm9ybWF0ICkKLSNkZWZpbmUgRlRfVFJBQ0UxKCB2YXJmb3JtYXQgKSAgRlRfVFJBQ0UoIDEsIHZhcmZvcm1hdCApCi0jZGVmaW5lIEZUX1RSQUNFMiggdmFyZm9ybWF0ICkgIEZUX1RSQUNFKCAyLCB2YXJmb3JtYXQgKQotI2RlZmluZSBGVF9UUkFDRTMoIHZhcmZvcm1hdCApICBGVF9UUkFDRSggMywgdmFyZm9ybWF0ICkKLSNkZWZpbmUgRlRfVFJBQ0U0KCB2YXJmb3JtYXQgKSAgRlRfVFJBQ0UoIDQsIHZhcmZvcm1hdCApCi0jZGVmaW5lIEZUX1RSQUNFNSggdmFyZm9ybWF0ICkgIEZUX1RSQUNFKCA1LCB2YXJmb3JtYXQgKQotI2RlZmluZSBGVF9UUkFDRTYoIHZhcmZvcm1hdCApICBGVF9UUkFDRSggNiwgdmFyZm9ybWF0ICkKLSNkZWZpbmUgRlRfVFJBQ0U3KCB2YXJmb3JtYXQgKSAgRlRfVFJBQ0UoIDcsIHZhcmZvcm1hdCApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSB0aGUgRlRfRVJST1IgbWFjcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3V0cHV0IG9mIHRoaXMgbWFjcm8gaXMgc2VudCB0byBzdGRlcnIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX0VSUk9SCi0KLSNkZWZpbmUgRlRfRVJST1IoIHZhcmZvcm1hdCApICBGVF9NZXNzYWdlICB2YXJmb3JtYXQKLQotI2Vsc2UgIC8qICFGVF9ERUJVR19MRVZFTF9FUlJPUiAqLwotCi0jZGVmaW5lIEZUX0VSUk9SKCB2YXJmb3JtYXQgKSAgZG8geyB9IHdoaWxlICggMCApICAgICAgLyogbm90aGluZyAqLwotCi0jZW5kaWYgLyogIUZUX0RFQlVHX0xFVkVMX0VSUk9SICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSB0aGUgRlRfQVNTRVJUIGFuZCBGVF9USFJPVyBtYWNyb3MuICBUaGUgY2FsbCB0byBgRlRfVGhyb3cnICAgICAqLwotICAvKiBtYWtlcyBpdCBwb3NzaWJsZSB0byBlYXNpbHkgc2V0IGEgYnJlYWtwb2ludCBhdCB0aGlzIGZ1bmN0aW9uLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfRVJST1IKLQotI2RlZmluZSBGVF9BU1NFUlQoIGNvbmRpdGlvbiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaWYgKCAhKCBjb25kaXRpb24gKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIEZUX1BhbmljKCAiYXNzZXJ0aW9uIGZhaWxlZCBvbiBsaW5lICVkIG9mIGZpbGUgJXNcbiIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBfX0ZJTEVfXyApOyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0gd2hpbGUgKCAwICkKLQotI2RlZmluZSBGVF9USFJPVyggZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBGVF9UaHJvdyggRlRfRVJSX0NBVCggRlRfRVJSX1BSRUZJWCwgZSApLCAgIFwKLSAgICAgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fICkgICAgICAgICAgICAgICAgICAgICAgfCBcCi0gICAgICAgICAgICBGVF9FUlJfQ0FUKCBGVF9FUlJfUFJFRklYLCBlICkgICAgICAgICAgICApCi0KLSNlbHNlIC8qICFGVF9ERUJVR19MRVZFTF9FUlJPUiAqLwotCi0jZGVmaW5lIEZUX0FTU0VSVCggY29uZGl0aW9uICkgIGRvIHsgfSB3aGlsZSAoIDAgKQotCi0jZGVmaW5lIEZUX1RIUk9XKCBlICkgIEZUX0VSUl9DQVQoIEZUX0VSUl9QUkVGSVgsIGUgKQotCi0jZW5kaWYgLyogIUZUX0RFQlVHX0xFVkVMX0VSUk9SICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSBgRlRfTWVzc2FnZScgYW5kIGBGVF9QYW5pYycgd2hlbiBuZWVkZWQuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9FUlJPUgotCi0jaW5jbHVkZSAic3RkaW8uaCIgIC8qIGZvciB2ZnByaW50ZigpICovCi0KLSAgLyogcHJpbnQgYSBtZXNzYWdlICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9NZXNzYWdlKCBjb25zdCBjaGFyKiAgZm10LAotICAgICAgICAgICAgICAuLi4gKTsKLQotICAvKiBwcmludCBhIG1lc3NhZ2UgYW5kIGV4aXQgKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIEZUX1BhbmljKCBjb25zdCBjaGFyKiAgZm10LAotICAgICAgICAgICAgLi4uICk7Ci0KLSAgLyogcmVwb3J0IGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgb2YgYW4gZXJyb3IgKi8KLSAgRlRfQkFTRSggaW50ICkKLSAgRlRfVGhyb3coIEZUX0Vycm9yICAgICBlcnJvciwKLSAgICAgICAgICAgIGludCAgICAgICAgICBsaW5lLAotICAgICAgICAgICAgY29uc3QgY2hhciogIGZpbGUgKTsKLQotI2VuZGlmIC8qIEZUX0RFQlVHX0xFVkVMX0VSUk9SICovCi0KLQotICBGVF9CQVNFKCB2b2lkICkKLSAgZnRfZGVidWdfaW5pdCggdm9pZCApOwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUREVCVUdfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL2Z0ZHJpdmVyLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL2Z0ZHJpdmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MDIxOGUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9mdGRyaXZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0ZHJpdmVyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBmb250IGRyaXZlciBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAzLCAyMDA2LCAyMDA4LCAyMDExLTIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZURFJJVkVSX0hfXwotI2RlZmluZSBfX0ZURFJJVkVSX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfTU9EVUxFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9GYWNlX0luaXRGdW5jKSggRlRfU3RyZWFtICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICB0eXBlZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgbnVtX3BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1ldGVycyApOwotCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX0ZhY2VfRG9uZUZ1bmMpKCBGVF9GYWNlICBmYWNlICk7Ci0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfU2l6ZV9Jbml0RnVuYykoIEZUX1NpemUgIHNpemUgKTsKLQotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9TaXplX0RvbmVGdW5jKSggRlRfU2l6ZSAgc2l6ZSApOwotCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX1Nsb3RfSW5pdEZ1bmMpKCBGVF9HbHlwaFNsb3QgIHNsb3QgKTsKLQotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9TbG90X0RvbmVGdW5jKSggRlRfR2x5cGhTbG90ICBzbG90ICk7Ci0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfU2l6ZV9SZXF1ZXN0RnVuYykoIEZUX1NpemUgICAgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEgKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfU2l6ZV9TZWxlY3RGdW5jKSggRlRfU2l6ZSAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIHNpemVfaW5kZXggKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfU2xvdF9Mb2FkRnVuYykoIEZUX0dseXBoU2xvdCAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZSAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgICAgIGxvYWRfZmxhZ3MgKTsKLQotCi0gIHR5cGVkZWYgRlRfVUludAotICAoKkZUX0NoYXJNYXBfQ2hhckluZGV4RnVuYykoIEZUX0NoYXJNYXAgIGNoYXJtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgY2hhcmNvZGUgKTsKLQotICB0eXBlZGVmIEZUX0xvbmcKLSAgKCpGVF9DaGFyTWFwX0NoYXJOZXh0RnVuYykoIEZUX0NoYXJNYXAgIGNoYXJtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICBjaGFyY29kZSApOwotCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0ZhY2VfR2V0S2VybmluZ0Z1bmMpKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBsZWZ0X2dseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICByaWdodF9nbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAga2VybmluZyApOwotCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0ZhY2VfQXR0YWNoRnVuYykoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0ZhY2VfR2V0QWR2YW5jZXNGdW5jKSggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBmaXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBhZHZhbmNlcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRHJpdmVyX0NsYXNzUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGZvbnQgZHJpdmVyIGNsYXNzLiAgVGhpcyBzdHJ1Y3R1cmUgbW9zdGx5IGNvbnRhaW5zIHBvaW50ZXJzIHRvICovCi0gIC8qICAgIGRyaXZlciBtZXRob2RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJvb3QgICAgICAgICAgICAgOjogVGhlIHBhcmVudCBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9vYmplY3Rfc2l6ZSA6OiBUaGUgc2l6ZSBvZiBhIGZhY2Ugb2JqZWN0IGluIGJ5dGVzLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplX29iamVjdF9zaXplIDo6IFRoZSBzaXplIG9mIGEgc2l6ZSBvYmplY3QgaW4gYnl0ZXMuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNsb3Rfb2JqZWN0X3NpemUgOjogVGhlIHNpemUgb2YgYSBnbHlwaCBvYmplY3QgaW4gYnl0ZXMuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaW5pdF9mYWNlICAgICAgICA6OiBUaGUgZm9ybWF0LXNwZWNpZmljIGZhY2UgY29uc3RydWN0b3IuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkb25lX2ZhY2UgICAgICAgIDo6IFRoZSBmb3JtYXQtc3BlY2lmaWMgZmFjZSBkZXN0cnVjdG9yLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGluaXRfc2l6ZSAgICAgICAgOjogVGhlIGZvcm1hdC1zcGVjaWZpYyBzaXplIGNvbnN0cnVjdG9yLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZG9uZV9zaXplICAgICAgICA6OiBUaGUgZm9ybWF0LXNwZWNpZmljIHNpemUgZGVzdHJ1Y3Rvci4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpbml0X3Nsb3QgICAgICAgIDo6IFRoZSBmb3JtYXQtc3BlY2lmaWMgc2xvdCBjb25zdHJ1Y3Rvci4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRvbmVfc2xvdCAgICAgICAgOjogVGhlIGZvcm1hdC1zcGVjaWZpYyBzbG90IGRlc3RydWN0b3IuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfZ2x5cGggICAgICAgOjogQSBmdW5jdGlvbiBoYW5kbGUgdG8gbG9hZCBhIGdseXBoIHRvIGEgc2xvdC4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgaXMgbWFuZGF0b3J5ISAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdldF9rZXJuaW5nICAgICAgOjogQSBmdW5jdGlvbiBoYW5kbGUgdG8gcmV0dXJuIHRoZSB1bnNjYWxlZCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGtlcm5pbmcgZm9yIGEgZ2l2ZW4gcGFpciBvZiBnbHlwaHMuICBDYW4gYmUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBzZXQgdG8gMCBpZiB0aGUgZm9ybWF0IGRvZXNuJ3Qgc3VwcG9ydCAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAga2VybmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXR0YWNoX2ZpbGUgICAgICA6OiBUaGlzIGZ1bmN0aW9uIGhhbmRsZSBpcyB1c2VkIHRvIHJlYWQgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbCBkYXRhIGZvciBhIGZhY2UgZnJvbSBhbm90aGVyICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUvc3RyZWFtLiAgRm9yIGV4YW1wbGUsIHRoaXMgY2FuIGJlIHVzZWQgdG8gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBhZGQgZGF0YSBmcm9tIEFGTSBvciBQRk0gZmlsZXMgb24gYSBUeXBlIDEgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSwgb3IgYSBDSURNYXAgb24gYSBDSUQta2V5ZWQgZmFjZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2V0X2FkdmFuY2VzICAgICA6OiBBIGZ1bmN0aW9uIGhhbmRsZSB1c2VkIHRvIHJldHVybiBhZHZhbmNlICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzIG9mIGBjb3VudCcgZ2x5cGhzIChpbiBmb250IHVuaXRzKSwgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIGF0IGBmaXJzdCcuICBUaGUgYHZlcnRpY2FsJyBmbGFnIG11c3QgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBiZSBzZXQgdG8gZ2V0IHZlcnRpY2FsIGFkdmFuY2UgaGVpZ2h0cy4gIFRoZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgYGFkdmFuY2VzJyBidWZmZXIgaXMgY2FsbGVyLWFsbG9jYXRlZC4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBpZGVhIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gYmUgYWJsZSB0byAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGRldmljZS1pbmRlcGVuZGVudCB0ZXh0IGxheW91dCB3aXRob3V0ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGluZyBhIHNpbmdsZSBnbHlwaCBpbWFnZS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVxdWVzdF9zaXplICAgICA6OiBBIGhhbmRsZSB0byBhIGZ1bmN0aW9uIHVzZWQgdG8gcmVxdWVzdCB0aGUgbmV3ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyIHNpemUuICBDYW4gYmUgc2V0IHRvIDAgaWYgdGhlICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxpbmcgZG9uZSBpbiB0aGUgYmFzZSBsYXllciBzdWZmaWNlcy4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNlbGVjdF9zaXplICAgICAgOjogQSBoYW5kbGUgdG8gYSBmdW5jdGlvbiB1c2VkIHRvIHNlbGVjdCBhIG5ldyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkIHNpemUuICBJdCBpcyB1c2VkIG9ubHkgaWYgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBARlRfRkFDRV9GTEFHX0ZJWEVEX1NJWkVTIGlzIHNldC4gIENhbiBiZSBzZXQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgdG8gMCBpZiB0aGUgc2NhbGluZyBkb25lIGluIHRoZSBiYXNlIGxheWVyICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE1vc3QgZnVuY3Rpb24gcG9pbnRlcnMsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBgbG9hZF9nbHlwaCcsIGNhbiBiZSAqLwotICAvKiAgICBzZXQgdG8gMCB0byBpbmRpY2F0ZSBhIGRlZmF1bHQgYmVoYXZpb3VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9Ecml2ZXJfQ2xhc3NSZWNfCi0gIHsKLSAgICBGVF9Nb2R1bGVfQ2xhc3MgICAgICAgICAgcm9vdDsKLQotICAgIEZUX0xvbmcgICAgICAgICAgICAgICAgICBmYWNlX29iamVjdF9zaXplOwotICAgIEZUX0xvbmcgICAgICAgICAgICAgICAgICBzaXplX29iamVjdF9zaXplOwotICAgIEZUX0xvbmcgICAgICAgICAgICAgICAgICBzbG90X29iamVjdF9zaXplOwotCi0gICAgRlRfRmFjZV9Jbml0RnVuYyAgICAgICAgIGluaXRfZmFjZTsKLSAgICBGVF9GYWNlX0RvbmVGdW5jICAgICAgICAgZG9uZV9mYWNlOwotCi0gICAgRlRfU2l6ZV9Jbml0RnVuYyAgICAgICAgIGluaXRfc2l6ZTsKLSAgICBGVF9TaXplX0RvbmVGdW5jICAgICAgICAgZG9uZV9zaXplOwotCi0gICAgRlRfU2xvdF9Jbml0RnVuYyAgICAgICAgIGluaXRfc2xvdDsKLSAgICBGVF9TbG90X0RvbmVGdW5jICAgICAgICAgZG9uZV9zbG90OwotCi0gICAgRlRfU2xvdF9Mb2FkRnVuYyAgICAgICAgIGxvYWRfZ2x5cGg7Ci0KLSAgICBGVF9GYWNlX0dldEtlcm5pbmdGdW5jICAgZ2V0X2tlcm5pbmc7Ci0gICAgRlRfRmFjZV9BdHRhY2hGdW5jICAgICAgIGF0dGFjaF9maWxlOwotICAgIEZUX0ZhY2VfR2V0QWR2YW5jZXNGdW5jICBnZXRfYWR2YW5jZXM7Ci0KLSAgICAvKiBzaW5jZSB2ZXJzaW9uIDIuMiAqLwotICAgIEZUX1NpemVfUmVxdWVzdEZ1bmMgICAgICByZXF1ZXN0X3NpemU7Ci0gICAgRlRfU2l6ZV9TZWxlY3RGdW5jICAgICAgIHNlbGVjdF9zaXplOwotCi0gIH0gRlRfRHJpdmVyX0NsYXNzUmVjLCAqRlRfRHJpdmVyX0NsYXNzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfREVDTEFSRV9EUklWRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlZCB0byBjcmVhdGUgYSBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGFuIEZUX0RyaXZlcl9DbGFzc1JlYyAgICAgICovCi0gIC8qICAgIHN0cnVjdCBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFRklORV9EUklWRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiBGVF9Ecml2ZXJfQ2xhc3NSZWMgc3RydWN0LiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkIGEgYGNyZWF0ZScgZnVuY3Rpb24gaGFzIHRvIGJlICovCi0gIC8qICAgIGNhbGxlZCB3aXRoIGEgcG9pbnRlciB3aGVyZSB0aGUgYWxsb2NhdGVkIHN0cnVjdHVyZSBpcyByZXR1cm5lZC4gICAqLwotICAvKiAgICBBbmQgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkIGEgYGRlc3Ryb3knIGZ1bmN0aW9uIG5lZWRzIHRvIGJlICAgKi8KLSAgLyogICAgY2FsbGVkIHRvIHJlbGVhc2UgdGhhdCBhbGxvY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBgZmNpbml0LmMnIChmdF9jcmVhdGVfZGVmYXVsdF9tb2R1bGVfY2xhc3NlcykgYWxyZWFkeSBjb250YWlucyBhICAgKi8KLSAgLyogICAgbWVjaGFuaXNtIHRvIGNhbGwgdGhlc2UgZnVuY3Rpb25zIGZvciB0aGUgZGVmYXVsdCBtb2R1bGVzICAgICAgICAgICovCi0gIC8qICAgIGRlc2NyaWJlZCBpbiBgZnRtb2R1bGUuaCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90aWNlIHRoYXQgdGhlIGNyZWF0ZWQgYGNyZWF0ZScgYW5kIGBkZXN0cm95JyBmdW5jdGlvbnMgY2FsbCAgICAgICovCi0gIC8qICAgIGBwaWNfaW5pdCcgYW5kIGBwaWNfZnJlZScgdG8gYWxsb3cgeW91IHRvIG1hbnVhbGx5IGFsbG9jYXRlIGFuZCAgICAqLwotICAvKiAgICBpbml0aWFsaXplIGFueSBhZGRpdGlvbmFsIGdsb2JhbCBkYXRhLCBsaWtlIGEgbW9kdWxlIHNwZWNpZmljICAgICAgKi8KLSAgLyogICAgaW50ZXJmYWNlLCBhbmQgcHV0IHRoZW0gaW4gdGhlIGdsb2JhbCBwaWMgY29udGFpbmVyIGRlZmluZWQgaW4gICAgICovCi0gIC8qICAgIGBmdHBpYy5oJy4gIElmIHlvdSBkb24ndCBuZWVkIHRoZW0ganVzdCBpbXBsZW1lbnQgdGhlIGZ1bmN0aW9ucyBhcyAqLwotICAvKiAgICBlbXB0eSB0byByZXNvbHZlIHRoZSBsaW5rIGVycm9yLiAgQWxzbyB0aGUgYHBpY19pbml0JyBhbmQgICAgICAgICAgKi8KLSAgLyogICAgYHBpY19mcmVlJyBmdW5jdGlvbnMgc2hvdWxkIGJlIGRlY2xhcmVkIGluIGBwaWMuaCcsIHRvIGJlIHJlZmVycmVkICovCi0gIC8qICAgIGJ5IGRyaXZlciBkZWZpbml0aW9uIGNhbGxpbmcgYEZUX0RFRklORV9EUklWRVInIGluIGZvbGxvd2luZy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBub3QgZGVmaW5lZCB0aGUgc3RydWN0IHdpbGwgYmUgICAgICAgICovCi0gIC8qICAgIGFsbG9jYXRlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIChvciB0aGUgc2NvcGUgd2hlcmUgdGhlIG1hY3JvIGlzICAgICAqLwotICAvKiAgICB1c2VkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVDTEFSRV9EUklWRVIoIGNsYXNzXyApICBcCi0gIEZUX0NBTExCQUNLX1RBQkxFICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBGVF9Ecml2ZXJfQ2xhc3NSZWMgIGNsYXNzXzsKLQotI2RlZmluZSBGVF9ERUZJTkVfRFJJVkVSKCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZsYWdzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIG5hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHZlcnNpb25fLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJlcXVpcmVzXywgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGludGVyZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9pbnRlcmZhY2VfLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZhY2Vfb2JqZWN0X3NpemVfLCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNpemVfb2JqZWN0X3NpemVfLCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNsb3Rfb2JqZWN0X3NpemVfLCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfc2xvdF8sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfc2xvdF8sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfZ2x5cGhfLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9rZXJuaW5nXywgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGF0dGFjaF9maWxlXywgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9hZHZhbmNlc18sICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJlcXVlc3Rfc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNlbGVjdF9zaXplXyApICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBGVF9Ecml2ZXJfQ2xhc3NSZWMgIGNsYXNzXyA9ICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0RFRklORV9ST09UX01PRFVMRSggZmxhZ3NfLCAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV8sICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV8sICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbl8sICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZXNfLCAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlXywgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF8sICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZV8sICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2ludGVyZmFjZV8gKSAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZhY2Vfb2JqZWN0X3NpemVfLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNpemVfb2JqZWN0X3NpemVfLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNsb3Rfb2JqZWN0X3NpemVfLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGluaXRfZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRvbmVfZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGluaXRfc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRvbmVfc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGluaXRfc2xvdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRvbmVfc2xvdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxvYWRfZ2x5cGhfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldF9rZXJuaW5nXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGF0dGFjaF9maWxlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldF9hZHZhbmNlc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJlcXVlc3Rfc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNlbGVjdF9zaXplXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFQ0xBUkVfRFJJVkVSKCBjbGFzc18gKSAgRlRfREVDTEFSRV9NT0RVTEUoIGNsYXNzXyApCi0KLSNkZWZpbmUgRlRfREVGSU5FX0RSSVZFUiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZmxhZ3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIG5hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgdmVyc2lvbl8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByZXF1aXJlc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGludGVyZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9pbnRlcmZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZmFjZV9vYmplY3Rfc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzaXplX29iamVjdF9zaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNsb3Rfb2JqZWN0X3NpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW5pdF9mYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lX2ZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZG9uZV9zaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbml0X3Nsb3RfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfc2xvdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9nbHlwaF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfa2VybmluZ18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGF0dGFjaF9maWxlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X2FkdmFuY2VzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByZXF1ZXN0X3NpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNlbGVjdF9zaXplXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRGVzdHJveV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5LCAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01vZHVsZV9DbGFzcyogIGNsYXp6ICkgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgICAgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0RyaXZlcl9DbGFzcyAgZGNsYXp6ID0gKEZUX0RyaXZlcl9DbGFzcyljbGF6ejsgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXNzXyAjIyBfcGljX2ZyZWUoIGxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBkY2xhenogKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0ZSRUUoIGRjbGF6eiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0NyZWF0ZV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgbGlicmFyeSwgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01vZHVsZV9DbGFzcyoqICBvdXRwdXRfY2xhc3MgKSAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfRHJpdmVyX0NsYXNzICBjbGF6eiAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggRlRfQUxMT0MoIGNsYXp6LCBzaXplb2YgKCAqY2xhenogKSApICkgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVycm9yID0gY2xhc3NfICMjIF9waWNfaW5pdCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBlcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRfRlJFRSggY2xhenogKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfREVGSU5FX1JPT1RfTU9EVUxFKCBmbGFnc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2ludGVyZmFjZV8gKSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+ZmFjZV9vYmplY3Rfc2l6ZSA9IGZhY2Vfb2JqZWN0X3NpemVfOyAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5zaXplX29iamVjdF9zaXplID0gc2l6ZV9vYmplY3Rfc2l6ZV87ICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnNsb3Rfb2JqZWN0X3NpemUgPSBzbG90X29iamVjdF9zaXplXzsgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5pbml0X2ZhY2UgICAgICAgID0gaW5pdF9mYWNlXzsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmRvbmVfZmFjZSAgICAgICAgPSBkb25lX2ZhY2VfOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5pbml0X3NpemUgICAgICAgID0gaW5pdF9zaXplXzsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmRvbmVfc2l6ZSAgICAgICAgPSBkb25lX3NpemVfOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5pbml0X3Nsb3QgICAgICAgID0gaW5pdF9zbG90XzsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmRvbmVfc2xvdCAgICAgICAgPSBkb25lX3Nsb3RfOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX2dseXBoICAgICAgID0gbG9hZF9nbHlwaF87ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X2tlcm5pbmcgICAgICA9IGdldF9rZXJuaW5nXzsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5hdHRhY2hfZmlsZSAgICAgID0gYXR0YWNoX2ZpbGVfOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9hZHZhbmNlcyAgICAgPSBnZXRfYWR2YW5jZXNfOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5yZXF1ZXN0X3NpemUgICAgID0gcmVxdWVzdF9zaXplXzsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnNlbGVjdF9zaXplICAgICAgPSBzZWxlY3Rfc2l6ZV87ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICpvdXRwdXRfY2xhc3MgPSAoRlRfTW9kdWxlX0NsYXNzKiljbGF6ejsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlREUklWRVJfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL2Z0Z2xvYWRyLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL2Z0Z2xvYWRyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MDc3NGYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9mdGdsb2Fkci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Z2xvYWRyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgZ2x5cGggbG9hZGVyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMiwgMjAwMywgMjAwNSwgMjAwNiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUR0xPQURSX0hfXwotI2RlZmluZSBfX0ZUR0xPQURSX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhMb2FkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGdseXBoIGxvYWRlciBpcyBhbiBpbnRlcm5hbCBvYmplY3QgdXNlZCB0byBsb2FkIHNldmVyYWwgZ2x5cGhzICovCi0gIC8qICAgIHRvZ2V0aGVyIChmb3IgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgY29tcG9zaXRlcykuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBnbHlwaCBsb2FkZXIgaW1wbGVtZW50YXRpb24gaXMgbm90IHBhcnQgb2YgdGhlIGhpZ2gtbGV2ZWwgQVBJLCAqLwotICAvKiAgICBoZW5jZSB0aGUgZm9yd2FyZCBzdHJ1Y3R1cmUgZGVjbGFyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX0dseXBoTG9hZGVyUmVjXyogIEZUX0dseXBoTG9hZGVyIDsKLQotCi0jaWYgMCAgLyogbW92ZWQgdG8gZnJlZXR5cGUuaCBpbiB2ZXJzaW9uIDIuMiAqLwotI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHX0FSR1NfQVJFX1dPUkRTICAgICAgICAgIDEKLSNkZWZpbmUgRlRfU1VCR0xZUEhfRkxBR19BUkdTX0FSRV9YWV9WQUxVRVMgICAgICAyCi0jZGVmaW5lIEZUX1NVQkdMWVBIX0ZMQUdfUk9VTkRfWFlfVE9fR1JJRCAgICAgICAgNAotI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHX1NDQUxFICAgICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgRlRfU1VCR0xZUEhfRkxBR19YWV9TQ0FMRSAgICAgICAgICAgICAweDQwCi0jZGVmaW5lIEZUX1NVQkdMWVBIX0ZMQUdfMlgyICAgICAgICAgICAgICAgICAgMHg4MAotI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHX1VTRV9NWV9NRVRSSUNTICAgICAgMHgyMDAKLSNlbmRpZgotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1N1YkdseXBoUmVjXwotICB7Ci0gICAgRlRfSW50ICAgICBpbmRleDsKLSAgICBGVF9VU2hvcnQgIGZsYWdzOwotICAgIEZUX0ludCAgICAgYXJnMTsKLSAgICBGVF9JbnQgICAgIGFyZzI7Ci0gICAgRlRfTWF0cml4ICB0cmFuc2Zvcm07Ci0KLSAgfSBGVF9TdWJHbHlwaFJlYzsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9HbHlwaExvYWRSZWNfCi0gIHsKLSAgICBGVF9PdXRsaW5lICAgb3V0bGluZTsgICAgICAgLyogb3V0bGluZSAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX1ZlY3RvciogICBleHRyYV9wb2ludHM7ICAvKiBleHRyYSBwb2ludHMgdGFibGUgICAgICAgICovCi0gICAgRlRfVmVjdG9yKiAgIGV4dHJhX3BvaW50czI7IC8qIHNlY29uZCBleHRyYSBwb2ludHMgdGFibGUgKi8KLSAgICBGVF9VSW50ICAgICAgbnVtX3N1YmdseXBoczsgLyogbnVtYmVyIG9mIHN1YmdseXBocyAgICAgICAqLwotICAgIEZUX1N1YkdseXBoICBzdWJnbHlwaHM7ICAgICAvKiBzdWJnbHlwaHMgICAgICAgICAgICAgICAgICovCi0KLSAgfSBGVF9HbHlwaExvYWRSZWMsICpGVF9HbHlwaExvYWQ7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgRlRfR2x5cGhMb2FkZXJSZWNfCi0gIHsKLSAgICBGVF9NZW1vcnkgICAgICAgIG1lbW9yeTsKLSAgICBGVF9VSW50ICAgICAgICAgIG1heF9wb2ludHM7Ci0gICAgRlRfVUludCAgICAgICAgICBtYXhfY29udG91cnM7Ci0gICAgRlRfVUludCAgICAgICAgICBtYXhfc3ViZ2x5cGhzOwotICAgIEZUX0Jvb2wgICAgICAgICAgdXNlX2V4dHJhOwotCi0gICAgRlRfR2x5cGhMb2FkUmVjICBiYXNlOwotICAgIEZUX0dseXBoTG9hZFJlYyAgY3VycmVudDsKLQotICAgIHZvaWQqICAgICAgICAgICAgb3RoZXI7ICAgICAgICAgICAgLyogZm9yIHBvc3NpYmxlIGZ1dHVyZSBleHRlbnNpb24/ICovCi0KLSAgfSBGVF9HbHlwaExvYWRlclJlYzsKLQotCi0gIC8qIGNyZWF0ZSBuZXcgZW1wdHkgZ2x5cGggbG9hZGVyICovCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgRlRfR2x5cGhMb2FkZXJfTmV3KCBGVF9NZW1vcnkgICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaExvYWRlciAgKmFsb2FkZXIgKTsKLQotICAvKiBhZGQgYW4gZXh0cmEgcG9pbnRzIHRhYmxlIHRvIGEgZ2x5cGggbG9hZGVyICovCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgRlRfR2x5cGhMb2FkZXJfQ3JlYXRlRXh0cmEoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgKTsKLQotICAvKiBkZXN0cm95IGEgZ2x5cGggbG9hZGVyICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9HbHlwaExvYWRlcl9Eb25lKCBGVF9HbHlwaExvYWRlciAgbG9hZGVyICk7Ci0KLSAgLyogcmVzZXQgYSBnbHlwaCBsb2FkZXIgKGZyZWVzIGV2ZXJ5dGhpbmcgaW50IGl0KSAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfR2x5cGhMb2FkZXJfUmVzZXQoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgKTsKLQotICAvKiByZXdpbmQgYSBnbHlwaCBsb2FkZXIgKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIEZUX0dseXBoTG9hZGVyX1Jld2luZCggRlRfR2x5cGhMb2FkZXIgIGxvYWRlciApOwotCi0gIC8qIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIGFkZCBgbl9wb2ludHMnIGFuZCBgbl9jb250b3VycycgKi8KLSAgLyogdG8gdGhlIGdseXBoIGxvYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX0dseXBoTG9hZGVyX0NoZWNrUG9pbnRzKCBGVF9HbHlwaExvYWRlciAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIG5fcG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIG5fY29udG91cnMgKTsKLQotCi0jZGVmaW5lIEZUX0dMWVBITE9BREVSX0NIRUNLX1AoIF9sb2FkZXIsIF9jb3VudCApICAgICAgICAgICBcCi0gICggKF9jb3VudCkgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCi0gICAgKCAoX2xvYWRlciktPmJhc2Uub3V0bGluZS5uX3BvaW50cyAgICArICAgICAgICAgICAgICAgICBcCi0gICAgICAoX2xvYWRlciktPmN1cnJlbnQub3V0bGluZS5uX3BvaW50cyArICAgICAgICAgICAgICAgICBcCi0gICAgICAodW5zaWduZWQgbG9uZykoX2NvdW50KSApIDw9IChfbG9hZGVyKS0+bWF4X3BvaW50cyApCi0KLSNkZWZpbmUgRlRfR0xZUEhMT0FERVJfQ0hFQ0tfQyggX2xvYWRlciwgX2NvdW50ICkgICAgICAgICAgICBcCi0gICggKF9jb3VudCkgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAotICAgICggKF9sb2FkZXIpLT5iYXNlLm91dGxpbmUubl9jb250b3VycyAgICArICAgICAgICAgICAgICAgIFwKLSAgICAgIChfbG9hZGVyKS0+Y3VycmVudC5vdXRsaW5lLm5fY29udG91cnMgKyAgICAgICAgICAgICAgICBcCi0gICAgICAodW5zaWduZWQgbG9uZykoX2NvdW50KSkgPD0gKF9sb2FkZXIpLT5tYXhfY29udG91cnMgKQotCi0jZGVmaW5lIEZUX0dMWVBITE9BREVSX0NIRUNLX1BPSU5UUyggX2xvYWRlciwgX3BvaW50cywgX2NvbnRvdXJzICkgICAgICBcCi0gICggKCBGVF9HTFlQSExPQURFUl9DSEVDS19QKCBfbG9hZGVyLCBfcG9pbnRzICkgICAmJiAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVF9HTFlQSExPQURFUl9DSEVDS19DKCBfbG9hZGVyLCBfY29udG91cnMgKSApICAgICAgICAgICAgICAgICAgICBcCi0gICAgPyAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgOiBGVF9HbHlwaExvYWRlcl9DaGVja1BvaW50cyggKF9sb2FkZXIpLCAoX3BvaW50cyksIChfY29udG91cnMpICkgKQotCi0KLSAgLyogY2hlY2sgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgdG8gYWRkIGBuX3N1YnMnIHN1Yi1nbHlwaHMgdG8gKi8KLSAgLyogYSBnbHlwaCBsb2FkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9HbHlwaExvYWRlcl9DaGVja1N1YkdseXBocyggRlRfR2x5cGhMb2FkZXIgIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBuX3N1YnMgKTsKLQotICAvKiBwcmVwYXJlIGEgZ2x5cGggbG9hZGVyLCBpLmUuIGVtcHR5IHRoZSBjdXJyZW50IGdseXBoICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9HbHlwaExvYWRlcl9QcmVwYXJlKCBGVF9HbHlwaExvYWRlciAgbG9hZGVyICk7Ci0KLSAgLyogYWRkIHRoZSBjdXJyZW50IGdseXBoIHRvIHRoZSBiYXNlIGdseXBoICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9HbHlwaExvYWRlcl9BZGQoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgKTsKLQotICAvKiBjb3B5IHBvaW50cyBmcm9tIG9uZSBnbHlwaCBsb2FkZXIgdG8gYW5vdGhlciAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX0dseXBoTG9hZGVyX0NvcHlQb2ludHMoIEZUX0dseXBoTG9hZGVyICB0YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoTG9hZGVyICBzb3VyY2UgKTsKLQotIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVEdMT0FEUl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvZnRtZW1vcnkuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvZnRtZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q1MWFlZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL2Z0bWVtb3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRtZW1vcnkuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBtZW1vcnkgbWFuYWdlbWVudCBtYWNyb3MgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDIsIDIwMDQtMjAwNywgMjAxMCwgMjAxMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRNRU1PUllfSF9fCi0jZGVmaW5lIF9fRlRNRU1PUllfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9DT05GSUdfQ09ORklHX0gKLSNpbmNsdWRlIEZUX1RZUEVTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NFVF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBzZXQgYW4gaW1wbGljaXQgYGVycm9yJyB2YXJpYWJsZSB0byBhIGdpdmVuICAqLwotICAvKiAgICBleHByZXNzaW9uJ3MgdmFsdWUgKHVzdWFsbHkgYSBmdW5jdGlvbiBjYWxsKSwgYW5kIGNvbnZlcnQgaXQgdG8gYSAgKi8KLSAgLyogICAgYm9vbGVhbiB3aGljaCBpcyBzZXQgd2hlbmV2ZXIgdGhlIHZhbHVlIGlzICE9IDAuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9TRVRfRVJST1IKLSNkZWZpbmUgRlRfU0VUX0VSUk9SKCBleHByZXNzaW9uICkgXAotICAgICAgICAgICggKCBlcnJvciA9IChleHByZXNzaW9uKSApICE9IDAgKQotCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgTSBFIE0gTyBSIFkgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKgotICAgKiAgQysrIHJlZnVzZXMgdG8gaGFuZGxlIHN0YXRlbWVudHMgbGlrZSBwID0gKHZvaWQqKWFueXRoaW5nLCB3aXRoIGBwJyBhCi0gICAqICB0eXBlZCBwb2ludGVyLiAgU2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIGB0eXBlb2YnIG9wZXJhdG9yIGluIHN0YW5kYXJkCi0gICAqICBDKyssIHdlIGhhdmUgdG8gdXNlIGEgdGVtcGxhdGUgdG8gZW11bGF0ZSBpdC4KLSAgICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0gIGV4dGVybiAiQysrIgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gaW5saW5lIFQqCi0gIGNwbHVzcGx1c190eXBlb2YoICAgICAgICBUKiwKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgKnYgKQotICB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0IDxUKj4gKCB2ICk7Ci0gIH0KLQotI2RlZmluZSBGVF9BU1NJR05QKCBwLCB2YWwgKSAgKHApID0gY3BsdXNwbHVzX3R5cGVvZiggKHApLCAodmFsKSApCi0KLSNlbHNlCi0KLSNkZWZpbmUgRlRfQVNTSUdOUCggcCwgdmFsICkgIChwKSA9ICh2YWwpCi0KLSNlbmRpZgotCi0KLQotI2lmZGVmIEZUX0RFQlVHX01FTU9SWQotCi0gIEZUX0JBU0UoIGNvbnN0IGNoYXIqICkgIF9mdF9kZWJ1Z19maWxlOwotICBGVF9CQVNFKCBsb25nICkgICAgICAgICBfZnRfZGVidWdfbGluZW5vOwotCi0jZGVmaW5lIEZUX0RFQlVHX0lOTkVSKCBleHAgKSAgKCBfZnRfZGVidWdfZmlsZSAgID0gX19GSUxFX18sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mdF9kZWJ1Z19saW5lbm8gPSBfX0xJTkVfXywgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV4cCkgKQotCi0jZGVmaW5lIEZUX0FTU0lHTlBfSU5ORVIoIHAsIGV4cCApICAoIF9mdF9kZWJ1Z19maWxlICAgPSBfX0ZJTEVfXywgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZnRfZGVidWdfbGluZW5vID0gX19MSU5FX18sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQVNTSUdOUCggcCwgZXhwICkgKQotCi0jZWxzZSAvKiAhRlRfREVCVUdfTUVNT1JZICovCi0KLSNkZWZpbmUgRlRfREVCVUdfSU5ORVIoIGV4cCApICAgICAgIChleHApCi0jZGVmaW5lIEZUX0FTU0lHTlBfSU5ORVIoIHAsIGV4cCApICBGVF9BU1NJR05QKCBwLCBleHAgKQotCi0jZW5kaWYgLyogIUZUX0RFQlVHX01FTU9SWSAqLwotCi0KLSAgLyoKLSAgICogIFRoZSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyByZXR1cm4gYSBwb2ludGVyLCBhbmQgdGhlIGVycm9yIGNvZGUKLSAgICogIGlzIHdyaXR0ZW4gdG8gdGhyb3VnaCB0aGUgYHBfZXJyb3InIHBhcmFtZXRlci4gIFNlZSBiZWxvdyBmb3IKLSAgICogIGZvciBkb2N1bWVudGF0aW9uLgotICAgKi8KLQotICBGVF9CQVNFKCBGVF9Qb2ludGVyICkKLSAgZnRfbWVtX2FsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICBGVF9Mb25nICAgIHNpemUsCi0gICAgICAgICAgICAgICAgRlRfRXJyb3IgICpwX2Vycm9yICk7Ci0KLSAgRlRfQkFTRSggRlRfUG9pbnRlciApCi0gIGZ0X21lbV9xYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIHNpemUsCi0gICAgICAgICAgICAgICAgIEZUX0Vycm9yICAqcF9lcnJvciApOwotCi0gIEZUX0JBU0UoIEZUX1BvaW50ZXIgKQotICBmdF9tZW1fcmVhbGxvYyggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIGl0ZW1fc2l6ZSwKLSAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgY3VyX2NvdW50LAotICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBuZXdfY291bnQsCi0gICAgICAgICAgICAgICAgICB2b2lkKiAgICAgIGJsb2NrLAotICAgICAgICAgICAgICAgICAgRlRfRXJyb3IgICpwX2Vycm9yICk7Ci0KLSAgRlRfQkFTRSggRlRfUG9pbnRlciApCi0gIGZ0X21lbV9xcmVhbGxvYyggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBpdGVtX3NpemUsCi0gICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBjdXJfY291bnQsCi0gICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBuZXdfY291bnQsCi0gICAgICAgICAgICAgICAgICAgdm9pZCogICAgICBibG9jaywKLSAgICAgICAgICAgICAgICAgICBGVF9FcnJvciAgKnBfZXJyb3IgKTsKLQotICBGVF9CQVNFKCB2b2lkICkKLSAgZnRfbWVtX2ZyZWUoIEZUX01lbW9yeSAgICBtZW1vcnksCi0gICAgICAgICAgICAgICBjb25zdCB2b2lkKiAgUCApOwotCi0KLSNkZWZpbmUgRlRfTUVNX0FMTE9DKCBwdHIsIHNpemUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfQVNTSUdOUF9JTk5FUiggcHRyLCBmdF9tZW1fYWxsb2MoIG1lbW9yeSwgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykoc2l6ZSksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yICkgKQotCi0jZGVmaW5lIEZUX01FTV9GUkVFKCBwdHIgKSAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfQkVHSU5fU1RNTlQgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBmdF9tZW1fZnJlZSggbWVtb3J5LCAocHRyKSApOyBcCi0gICAgICAgICAgICAocHRyKSA9IE5VTEw7ICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfRU5EX1NUTU5UCi0KLSNkZWZpbmUgRlRfTUVNX05FVyggcHRyICkgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX0FMTE9DKCBwdHIsIHNpemVvZiAoICoocHRyKSApICkKLQotI2RlZmluZSBGVF9NRU1fUkVBTExPQyggcHRyLCBjdXJzeiwgbmV3c3ogKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9BU1NJR05QX0lOTkVSKCBwdHIsIGZ0X21lbV9yZWFsbG9jKCBtZW1vcnksICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShjdXJzeiksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykobmV3c3opLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciksICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciApICkKLQotI2RlZmluZSBGVF9NRU1fUUFMTE9DKCBwdHIsIHNpemUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfQVNTSUdOUF9JTk5FUiggcHRyLCBmdF9tZW1fcWFsbG9jKCBtZW1vcnksICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShzaXplKSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yICkgKQotCi0jZGVmaW5lIEZUX01FTV9RTkVXKCBwdHIgKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fUUFMTE9DKCBwdHIsIHNpemVvZiAoICoocHRyKSApICkKLQotI2RlZmluZSBGVF9NRU1fUVJFQUxMT0MoIHB0ciwgY3Vyc3osIG5ld3N6ICkgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfQVNTSUdOUF9JTk5FUiggcHRyLCBmdF9tZW1fcXJlYWxsb2MoIG1lbW9yeSwgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykoY3Vyc3opLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShuZXdzeiksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciksICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IgKSApCi0KLSNkZWZpbmUgRlRfTUVNX0FMTE9DX01VTFQoIHB0ciwgY291bnQsIGl0ZW1fc2l6ZSApICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0FTU0lHTlBfSU5ORVIoIHB0ciwgZnRfbWVtX3JlYWxsb2MoIG1lbW9yeSwgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKGl0ZW1fc2l6ZSksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShjb3VudCksICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IgKSApCi0KLSNkZWZpbmUgRlRfTUVNX1JFQUxMT0NfTVVMVCggcHRyLCBvbGRjbnQsIG5ld2NudCwgaXRtc3ogKSAgICAgICAgICAgXAotICAgICAgICAgIEZUX0FTU0lHTlBfSU5ORVIoIHB0ciwgZnRfbWVtX3JlYWxsb2MoIG1lbW9yeSwgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKGl0bXN6KSwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykob2xkY250KSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShuZXdjbnQpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciksICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IgKSApCi0KLSNkZWZpbmUgRlRfTUVNX1FBTExPQ19NVUxUKCBwdHIsIGNvdW50LCBpdGVtX3NpemUgKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9BU1NJR05QX0lOTkVSKCBwdHIsIGZ0X21lbV9xcmVhbGxvYyggbWVtb3J5LCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKGl0ZW1fc2l6ZSksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKGNvdW50KSwgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yICkgKQotCi0jZGVmaW5lIEZUX01FTV9RUkVBTExPQ19NVUxUKCBwdHIsIG9sZGNudCwgbmV3Y250LCBpdG1zeikgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfQVNTSUdOUF9JTk5FUiggcHRyLCBmdF9tZW1fcXJlYWxsb2MoIG1lbW9yeSwgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShpdG1zeiksICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShvbGRjbnQpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShuZXdjbnQpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIpLCAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciApICkKLQotCi0jZGVmaW5lIEZUX01FTV9TRVRfRVJST1IoIGNvbmQgKSAgKCAoY29uZCksIGVycm9yICE9IDAgKQotCi0KLSNkZWZpbmUgRlRfTUVNX1NFVCggZGVzdCwgYnl0ZSwgY291bnQgKSAgICAgZnRfbWVtc2V0KCBkZXN0LCBieXRlLCBjb3VudCApCi0KLSNkZWZpbmUgRlRfTUVNX0NPUFkoIGRlc3QsIHNvdXJjZSwgY291bnQgKSAgZnRfbWVtY3B5KCBkZXN0LCBzb3VyY2UsIGNvdW50ICkKLQotI2RlZmluZSBGVF9NRU1fTU9WRSggZGVzdCwgc291cmNlLCBjb3VudCApICBmdF9tZW1tb3ZlKCBkZXN0LCBzb3VyY2UsIGNvdW50ICkKLQotCi0jZGVmaW5lIEZUX01FTV9aRVJPKCBkZXN0LCBjb3VudCApICBGVF9NRU1fU0VUKCBkZXN0LCAwLCBjb3VudCApCi0KLSNkZWZpbmUgRlRfWkVSTyggcCApICAgICAgICAgICAgICAgIEZUX01FTV9aRVJPKCBwLCBzaXplb2YgKCAqKHApICkgKQotCi0KLSNkZWZpbmUgRlRfQVJSQVlfWkVSTyggZGVzdCwgY291bnQgKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fWkVSTyggZGVzdCwgKGNvdW50KSAqIHNpemVvZiAoICooZGVzdCkgKSApCi0KLSNkZWZpbmUgRlRfQVJSQVlfQ09QWSggZGVzdCwgc291cmNlLCBjb3VudCApICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX01FTV9DT1BZKCBkZXN0LCBzb3VyY2UsIChjb3VudCkgKiBzaXplb2YgKCAqKGRlc3QpICkgKQotCi0jZGVmaW5lIEZUX0FSUkFZX01PVkUoIGRlc3QsIHNvdXJjZSwgY291bnQgKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fTU9WRSggZGVzdCwgc291cmNlLCAoY291bnQpICogc2l6ZW9mICggKihkZXN0KSApICkKLQotCi0gIC8qCi0gICAqICBSZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGFkZHJlc3NhYmxlIGVsZW1lbnRzIGluIGFuIGFycmF5LgotICAgKiAgV2UgbGltaXQgb3Vyc2VsdmVzIHRvIElOVF9NQVgsIHJhdGhlciB0aGFuIFVJTlRfTUFYLCB0byBhdm9pZAotICAgKiAgYW55IHByb2JsZW1zLgotICAgKi8KLSNkZWZpbmUgRlRfQVJSQVlfTUFYKCBwdHIgKSAgICAgICAgICAgKCBGVF9JTlRfTUFYIC8gc2l6ZW9mICggKihwdHIpICkgKQotCi0jZGVmaW5lIEZUX0FSUkFZX0NIRUNLKCBwdHIsIGNvdW50ICkgICggKGNvdW50KSA8PSBGVF9BUlJBWV9NQVgoIHB0ciApICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbWFjcm9zIGV4cGVjdCB0aGF0IHRoZWlyIHBvaW50ZXIgYXJndW1lbnQgaXMgICovCi0gIC8qIF90eXBlZF8gaW4gb3JkZXIgdG8gYXV0b21hdGljYWxseSBjb21wdXRlIGFycmF5IGVsZW1lbnQgc2l6ZXMuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBGVF9NRU1fTkVXX0FSUkFZKCBwdHIsIGNvdW50ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfQVNTSUdOUF9JTk5FUiggcHRyLCBmdF9tZW1fcmVhbGxvYyggbWVtb3J5LCAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCAqKHB0cikgKSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKGNvdW50KSwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciApICkKLQotI2RlZmluZSBGVF9NRU1fUkVORVdfQVJSQVkoIHB0ciwgY3Vyc3osIG5ld3N6ICkgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfQVNTSUdOUF9JTk5FUiggcHRyLCBmdF9tZW1fcmVhbGxvYyggbWVtb3J5LCAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCAqKHB0cikgKSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShjdXJzeiksICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKG5ld3N6KSwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRyKSwgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciApICkKLQotI2RlZmluZSBGVF9NRU1fUU5FV19BUlJBWSggcHRyLCBjb3VudCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0FTU0lHTlBfSU5ORVIoIHB0ciwgZnRfbWVtX3FyZWFsbG9jKCBtZW1vcnksICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCAqKHB0cikgKSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykoY291bnQpLCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IgKSApCi0KLSNkZWZpbmUgRlRfTUVNX1FSRU5FV19BUlJBWSggcHRyLCBjdXJzeiwgbmV3c3ogKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9BU1NJR05QX0lOTkVSKCBwdHIsIGZ0X21lbV9xcmVhbGxvYyggbWVtb3J5LCAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggKihwdHIpICksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKGN1cnN6KSwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKG5ld3N6KSwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0ciksICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yICkgKQotCi0jZGVmaW5lIEZUX0FMTE9DKCBwdHIsIHNpemUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fQUxMT0MoIHB0ciwgc2l6ZSApICkKLQotI2RlZmluZSBGVF9SRUFMTE9DKCBwdHIsIGN1cnN6LCBuZXdzeiApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9SRUFMTE9DKCBwdHIsIGN1cnN6LCBuZXdzeiApICkKLQotI2RlZmluZSBGVF9BTExPQ19NVUxUKCBwdHIsIGNvdW50LCBpdGVtX3NpemUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fQUxMT0NfTVVMVCggcHRyLCBjb3VudCwgaXRlbV9zaXplICkgKQotCi0jZGVmaW5lIEZUX1JFQUxMT0NfTVVMVCggcHRyLCBvbGRjbnQsIG5ld2NudCwgaXRtc3ogKSAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9SRUFMTE9DX01VTFQoIHB0ciwgb2xkY250LCAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdjbnQsIGl0bXN6ICkgKQotCi0jZGVmaW5lIEZUX1FBTExPQyggcHRyLCBzaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX1FBTExPQyggcHRyLCBzaXplICkgKQotCi0jZGVmaW5lIEZUX1FSRUFMTE9DKCBwdHIsIGN1cnN6LCBuZXdzeiApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9RUkVBTExPQyggcHRyLCBjdXJzeiwgbmV3c3ogKSApCi0KLSNkZWZpbmUgRlRfUUFMTE9DX01VTFQoIHB0ciwgY291bnQsIGl0ZW1fc2l6ZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9RQUxMT0NfTVVMVCggcHRyLCBjb3VudCwgaXRlbV9zaXplICkgKQotCi0jZGVmaW5lIEZUX1FSRUFMTE9DX01VTFQoIHB0ciwgb2xkY250LCBuZXdjbnQsIGl0bXN6ICkgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fUVJFQUxMT0NfTVVMVCggcHRyLCBvbGRjbnQsICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdjbnQsIGl0bXN6ICkgKQotCi0jZGVmaW5lIEZUX0ZSRUUoIHB0ciApICBGVF9NRU1fRlJFRSggcHRyICkKLQotI2RlZmluZSBGVF9ORVcoIHB0ciApICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fTkVXKCBwdHIgKSApCi0KLSNkZWZpbmUgRlRfTkVXX0FSUkFZKCBwdHIsIGNvdW50ICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX05FV19BUlJBWSggcHRyLCBjb3VudCApICkKLQotI2RlZmluZSBGVF9SRU5FV19BUlJBWSggcHRyLCBjdXJjbnQsIG5ld2NudCApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9SRU5FV19BUlJBWSggcHRyLCBjdXJjbnQsIG5ld2NudCApICkKLQotI2RlZmluZSBGVF9RTkVXKCBwdHIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fUU5FVyggcHRyICkgKQotCi0jZGVmaW5lIEZUX1FORVdfQVJSQVkoIHB0ciwgY291bnQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9ORVdfQVJSQVkoIHB0ciwgY291bnQgKSApCi0KLSNkZWZpbmUgRlRfUVJFTkVXX0FSUkFZKCBwdHIsIGN1cmNudCwgbmV3Y250ICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fUkVORVdfQVJSQVkoIHB0ciwgY3VyY250LCBuZXdjbnQgKSApCi0KLQotICBGVF9CQVNFKCBGVF9Qb2ludGVyICkKLSAgZnRfbWVtX3N0cmR1cCggRlRfTWVtb3J5ICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHN0ciwKLSAgICAgICAgICAgICAgICAgRlRfRXJyb3IgICAgKnBfZXJyb3IgKTsKLQotICBGVF9CQVNFKCBGVF9Qb2ludGVyICkKLSAgZnRfbWVtX2R1cCggRlRfTWVtb3J5ICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgY29uc3Qgdm9pZCogIGFkZHJlc3MsCi0gICAgICAgICAgICAgIEZUX1VMb25nICAgICBzaXplLAotICAgICAgICAgICAgICBGVF9FcnJvciAgICAqcF9lcnJvciApOwotCi0KLSNkZWZpbmUgRlRfTUVNX1NUUkRVUCggZHN0LCBzdHIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIChkc3QpID0gKGNoYXIqKWZ0X21lbV9zdHJkdXAoIG1lbW9yeSwgKGNvbnN0IGNoYXIqKShzdHIpLCAmZXJyb3IgKQotCi0jZGVmaW5lIEZUX1NUUkRVUCggZHN0LCBzdHIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fU1RSRFVQKCBkc3QsIHN0ciApICkKLQotI2RlZmluZSBGVF9NRU1fRFVQKCBkc3QsIGFkZHJlc3MsIHNpemUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoZHN0KSA9IGZ0X21lbV9kdXAoIG1lbW9yeSwgKGFkZHJlc3MpLCAoRlRfVUxvbmcpKHNpemUpLCAmZXJyb3IgKQotCi0jZGVmaW5lIEZUX0RVUCggZHN0LCBhZGRyZXNzLCBzaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX0RVUCggZHN0LCBhZGRyZXNzLCBzaXplICkgKQotCi0KLSAgLyogUmV0dXJuID49IDEgaWYgYSB0cnVuY2F0aW9uIG9jY3Vycy4gICAgICAgICAgICAqLwotICAvKiBSZXR1cm4gMCBpZiB0aGUgc291cmNlIHN0cmluZyBmaXRzIHRoZSBidWZmZXIuICovCi0gIC8qIFRoaXMgaXMgKm5vdCogdGhlIHNhbWUgYXMgc3RybGNweSgpLiAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfSW50ICkKLSAgZnRfbWVtX3N0cmNweW4oIGNoYXIqICAgICAgICBkc3QsCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgc3JjLAotICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgIHNpemUgKTsKLQotI2RlZmluZSBGVF9TVFJDUFlOKCBkc3QsIHNyYywgc2l6ZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZnRfbWVtX3N0cmNweW4oIChjaGFyKilkc3QsIChjb25zdCBjaGFyKikoc3JjKSwgKEZUX1VMb25nKShzaXplKSApCi0KLSAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRNRU1PUllfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL2Z0b2Jqcy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9mdG9ianMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ1YTVlZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL2Z0b2Jqcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG9ianMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHByaXZhdGUgYmFzZSBjbGFzc2VzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwNiwgMjAwOCwgMjAxMCwgMjAxMi0yMDEzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIGFsbCBpbnRlcm5hbCBGcmVlVHlwZSBjbGFzc2VzLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVE9CSlNfSF9fCi0jZGVmaW5lIF9fRlRPQkpTX0hfXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX1JFTkRFUl9ICi0jaW5jbHVkZSBGVF9TSVpFU19ICi0jaW5jbHVkZSBGVF9MQ0RfRklMVEVSX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX01FTU9SWV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9HTFlQSF9MT0FERVJfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfRFJJVkVSX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0FVVE9ISU5UX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUElDX0gKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSNpbmNsdWRlIEZUX0lOQ1JFTUVOVEFMX0gKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTb21lIGdlbmVyaWMgZGVmaW5pdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZuZGVmIFRSVUUKLSNkZWZpbmUgVFJVRSAgMQotI2VuZGlmCi0KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgIDAKLSNlbmRpZgotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUgTlVMTCAgKHZvaWQqKTAKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWluIGFuZCBtYXggZnVuY3Rpb25zIG1pc3NpbmcgaW4gQy4gIEFzIHVzdWFsLCBiZSBjYXJlZnVsIG5vdCB0byAgKi8KLSAgLyogd3JpdGUgdGhpbmdzIGxpa2UgRlRfTUlOKCBhKyssIGIrKyApIHRvIGF2b2lkIHNpZGUgZWZmZWN0cy4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9NSU4oIGEsIGIgKSAgKCAoYSkgPCAoYikgPyAoYSkgOiAoYikgKQotI2RlZmluZSBGVF9NQVgoIGEsIGIgKSAgKCAoYSkgPiAoYikgPyAoYSkgOiAoYikgKQotCi0jZGVmaW5lIEZUX0FCUyggYSApICAgICAoIChhKSA8IDAgPyAtKGEpIDogKGEpICkKLQotICAvKgotICAgKiAgQXBwcm94aW1hdGUgc3FydCh4KngreSp5KSB1c2luZyB0aGUgYGFscGhhIG1heCBwbHVzIGJldGEgbWluJwotICAgKiAgYWxnb3JpdGhtLiAgV2UgdXNlIGFscGhhID0gMSwgYmV0YSA9IDMvOCwgZ2l2aW5nIHVzIHJlc3VsdHMgd2l0aCBhCi0gICAqICBsYXJnZXN0IGVycm9yIGxlc3MgdGhhbiA3JSBjb21wYXJlZCB0byB0aGUgZXhhY3QgdmFsdWUuCi0gICAqLwotI2RlZmluZSBGVF9IWVBPVCggeCwgeSApICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCB4ID0gRlRfQUJTKCB4ICksICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHkgPSBGVF9BQlMoIHkgKSwgICAgICAgICAgICAgXAotICAgICAgICAgICAgeCA+IHkgPyB4ICsgKCAzICogeSA+PiAzICkgICBcCi0gICAgICAgICAgICAgICAgICA6IHkgKyAoIDMgKiB4ID4+IDMgKSApCi0KLSNkZWZpbmUgRlRfUEFEX0ZMT09SKCB4LCBuICkgICggKHgpICYgfigobiktMSkgKQotI2RlZmluZSBGVF9QQURfUk9VTkQoIHgsIG4gKSAgRlRfUEFEX0ZMT09SKCAoeCkgKyAoKG4pLzIpLCBuICkKLSNkZWZpbmUgRlRfUEFEX0NFSUwoIHgsIG4gKSAgIEZUX1BBRF9GTE9PUiggKHgpICsgKChuKS0xKSwgbiApCi0KLSNkZWZpbmUgRlRfUElYX0ZMT09SKCB4ICkgICAgICggKHgpICYgfjYzICkKLSNkZWZpbmUgRlRfUElYX1JPVU5EKCB4ICkgICAgIEZUX1BJWF9GTE9PUiggKHgpICsgMzIgKQotI2RlZmluZSBGVF9QSVhfQ0VJTCggeCApICAgICAgRlRfUElYX0ZMT09SKCAoeCkgKyA2MyApCi0KLQotICAvKgotICAgKiAgY2hhcmFjdGVyIGNsYXNzaWZpY2F0aW9uIGZ1bmN0aW9ucyAtLSBzaW5jZSB0aGVzZSBhcmUgdXNlZCB0byBwYXJzZQotICAgKiAgZm9udCBmaWxlcywgd2UgbXVzdCBub3QgdXNlIHRob3NlIGluIDxjdHlwZXMuaD4gd2hpY2ggYXJlCi0gICAqICBsb2NhbGUtZGVwZW5kZW50Ci0gICAqLwotI2RlZmluZSAgZnRfaXNkaWdpdCggeCApICAgKCAoICh1bnNpZ25lZCkoeCkgLSAnMCcgKSA8IDEwVSApCi0KLSNkZWZpbmUgIGZ0X2lzeGRpZ2l0KCB4ICkgICggKCAodW5zaWduZWQpKHgpIC0gJzAnICkgPCAxMFUgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCkoeCkgLSAnYScgKSA8IDZVICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKHVuc2lnbmVkKSh4KSAtICdBJyApIDwgNlUgICkKLQotICAvKiB0aGUgbmV4dCB0d28gbWFjcm9zIGFzc3VtZSBBU0NJSSByZXByZXNlbnRhdGlvbiAqLwotI2RlZmluZSAgZnRfaXN1cHBlciggeCApICAoICggKHVuc2lnbmVkKSh4KSAtICdBJyApIDwgMjZVICkKLSNkZWZpbmUgIGZ0X2lzbG93ZXIoIHggKSAgKCAoICh1bnNpZ25lZCkoeCkgLSAnYScgKSA8IDI2VSApCi0KLSNkZWZpbmUgIGZ0X2lzYWxwaGEoIHggKSAgKCBmdF9pc3VwcGVyKCB4ICkgfHwgZnRfaXNsb3dlciggeCApICkKLSNkZWZpbmUgIGZ0X2lzYWxudW0oIHggKSAgKCBmdF9pc2RpZ2l0KCB4ICkgfHwgZnRfaXNhbHBoYSggeCApICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgIEMgSCBBIFIgTSBBIFAgUyAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiBoYW5kbGUgdG8gaW50ZXJuYWwgY2hhcm1hcCBvYmplY3QgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfQ01hcFJlY18qICAgICAgICAgICAgICBGVF9DTWFwOwotCi0gIC8qIGhhbmRsZSB0byBjaGFybWFwIGNsYXNzIHN0cnVjdHVyZSAqLwotICB0eXBlZGVmIGNvbnN0IHN0cnVjdCBGVF9DTWFwX0NsYXNzUmVjXyogIEZUX0NNYXBfQ2xhc3M7Ci0KLSAgLyogaW50ZXJuYWwgY2hhcm1hcCBvYmplY3Qgc3RydWN0dXJlICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9DTWFwUmVjXwotICB7Ci0gICAgRlRfQ2hhck1hcFJlYyAgY2hhcm1hcDsKLSAgICBGVF9DTWFwX0NsYXNzICBjbGF6ejsKLQotICB9IEZUX0NNYXBSZWM7Ci0KLSAgLyogdHlwZWNhc2UgYW55IHBvaW50ZXIgdG8gYSBjaGFybWFwIGhhbmRsZSAqLwotI2RlZmluZSBGVF9DTUFQKCB4ICkgICAgICAgICAgICAgICgoRlRfQ01hcCkoIHggKSkKLQotICAvKiBvYnZpb3VzIG1hY3JvcyAqLwotI2RlZmluZSBGVF9DTUFQX1BMQVRGT1JNX0lEKCB4ICkgIEZUX0NNQVAoIHggKS0+Y2hhcm1hcC5wbGF0Zm9ybV9pZAotI2RlZmluZSBGVF9DTUFQX0VOQ09ESU5HX0lEKCB4ICkgIEZUX0NNQVAoIHggKS0+Y2hhcm1hcC5lbmNvZGluZ19pZAotI2RlZmluZSBGVF9DTUFQX0VOQ09ESU5HKCB4ICkgICAgIEZUX0NNQVAoIHggKS0+Y2hhcm1hcC5lbmNvZGluZwotI2RlZmluZSBGVF9DTUFQX0ZBQ0UoIHggKSAgICAgICAgIEZUX0NNQVAoIHggKS0+Y2hhcm1hcC5mYWNlCi0KLQotICAvKiBjbGFzcyBtZXRob2QgZGVmaW5pdGlvbnMgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0NNYXBfSW5pdEZ1bmMpKCBGVF9DTWFwICAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBpbml0X2RhdGEgKTsKLQotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9DTWFwX0RvbmVGdW5jKSggRlRfQ01hcCAgY21hcCApOwotCi0gIHR5cGVkZWYgRlRfVUludAotICAoKkZUX0NNYXBfQ2hhckluZGV4RnVuYykoIEZUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIGNoYXJfY29kZSApOwotCi0gIHR5cGVkZWYgRlRfVUludAotICAoKkZUX0NNYXBfQ2hhck5leHRGdW5jKSggRlRfQ01hcCAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgKmFjaGFyX2NvZGUgKTsKLQotICB0eXBlZGVmIEZUX1VJbnQKLSAgKCpGVF9DTWFwX0NoYXJWYXJJbmRleEZ1bmMpKCBGVF9DTWFwICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQ01hcCAgICB1bmljb2RlX2NtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICBjaGFyX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICB2YXJpYW50X3NlbGVjdG9yICk7Ci0KLSAgdHlwZWRlZiBGVF9Cb29sCi0gICgqRlRfQ01hcF9DaGFyVmFySXNEZWZhdWx0RnVuYykoIEZUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICBjaGFyX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgdmFyaWFudF9zZWxlY3RvciApOwotCi0gIHR5cGVkZWYgRlRfVUludDMyICoKLSAgKCpGVF9DTWFwX1ZhcmlhbnRMaXN0RnVuYykoIEZUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtICk7Ci0KLSAgdHlwZWRlZiBGVF9VSW50MzIgKgotICAoKkZUX0NNYXBfQ2hhclZhcmlhbnRMaXN0RnVuYykoIEZUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIGNoYXJfY29kZSApOwotCi0gIHR5cGVkZWYgRlRfVUludDMyICoKLSAgKCpGVF9DTWFwX1ZhcmlhbnRDaGFyTGlzdEZ1bmMpKCBGVF9DTWFwICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICB2YXJpYW50X3NlbGVjdG9yICk7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgRlRfQ01hcF9DbGFzc1JlY18KLSAgewotICAgIEZUX1VMb25nICAgICAgICAgICAgICAgc2l6ZTsKLSAgICBGVF9DTWFwX0luaXRGdW5jICAgICAgIGluaXQ7Ci0gICAgRlRfQ01hcF9Eb25lRnVuYyAgICAgICBkb25lOwotICAgIEZUX0NNYXBfQ2hhckluZGV4RnVuYyAgY2hhcl9pbmRleDsKLSAgICBGVF9DTWFwX0NoYXJOZXh0RnVuYyAgIGNoYXJfbmV4dDsKLQotICAgIC8qIFN1YnNlcXVlbnQgZW50cmllcyBhcmUgc3BlY2lhbCBvbmVzIGZvciBmb3JtYXQgMTQgLS0gdGhlIHZhcmlhbnQgKi8KLSAgICAvKiBzZWxlY3RvciBzdWJ0YWJsZSB3aGljaCBiZWhhdmVzIGxpa2Ugbm8gb3RoZXIgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBGVF9DTWFwX0NoYXJWYXJJbmRleEZ1bmMgICAgICBjaGFyX3Zhcl9pbmRleDsKLSAgICBGVF9DTWFwX0NoYXJWYXJJc0RlZmF1bHRGdW5jICBjaGFyX3Zhcl9kZWZhdWx0OwotICAgIEZUX0NNYXBfVmFyaWFudExpc3RGdW5jICAgICAgIHZhcmlhbnRfbGlzdDsKLSAgICBGVF9DTWFwX0NoYXJWYXJpYW50TGlzdEZ1bmMgICBjaGFydmFyaWFudF9saXN0OwotICAgIEZUX0NNYXBfVmFyaWFudENoYXJMaXN0RnVuYyAgIHZhcmlhbnRjaGFyX2xpc3Q7Ci0KLSAgfSBGVF9DTWFwX0NsYXNzUmVjOwotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9ERUNMQVJFX0NNQVBfQ0xBU1MoIGNsYXNzXyApICAgICAgICAgICAgICBcCi0gIEZUX0NBTExCQUNLX1RBQkxFIGNvbnN0ICBGVF9DTWFwX0NsYXNzUmVjIGNsYXNzXzsKLQotI2RlZmluZSBGVF9ERUZJTkVfQ01BUF9DTEFTUyggICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNoYXJfaW5kZXhfLCAgICAgICAgICAgICAgXAotICAgICAgICAgIGNoYXJfbmV4dF8sICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNoYXJfdmFyX2luZGV4XywgICAgICAgICAgXAotICAgICAgICAgIGNoYXJfdmFyX2RlZmF1bHRfLCAgICAgICAgXAotICAgICAgICAgIHZhcmlhbnRfbGlzdF8sICAgICAgICAgICAgXAotICAgICAgICAgIGNoYXJ2YXJpYW50X2xpc3RfLCAgICAgICAgXAotICAgICAgICAgIHZhcmlhbnRjaGFyX2xpc3RfICkgICAgICAgXAotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYgICAgICAgICAgICAgXAotICBjb25zdCBGVF9DTWFwX0NsYXNzUmVjICBjbGFzc18gPSAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNoYXJfaW5kZXhfLCAgICAgICAgICAgICAgICAgICAgXAotICAgIGNoYXJfbmV4dF8sICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNoYXJfdmFyX2luZGV4XywgICAgICAgICAgICAgICAgXAotICAgIGNoYXJfdmFyX2RlZmF1bHRfLCAgICAgICAgICAgICAgXAotICAgIHZhcmlhbnRfbGlzdF8sICAgICAgICAgICAgICAgICAgXAotICAgIGNoYXJ2YXJpYW50X2xpc3RfLCAgICAgICAgICAgICAgXAotICAgIHZhcmlhbnRjaGFyX2xpc3RfICAgICAgICAgICAgICAgXAotICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFQ0xBUkVfQ01BUF9DTEFTUyggY2xhc3NfICkgICAgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgIGxpYnJhcnksICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQ01hcF9DbGFzc1JlYyogIGNsYXp6ICk7Ci0KLSNkZWZpbmUgRlRfREVGSU5FX0NNQVBfQ0xBU1MoICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbml0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjaGFyX2luZGV4XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjaGFyX25leHRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjaGFyX3Zhcl9pbmRleF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjaGFyX3Zhcl9kZWZhdWx0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB2YXJpYW50X2xpc3RfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjaGFydmFyaWFudF9saXN0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB2YXJpYW50Y2hhcl9saXN0XyApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgbGlicmFyeSwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9DTWFwX0NsYXNzUmVjKiAgY2xhenogKSAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9VTlVTRUQoIGxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+c2l6ZSAgICAgICAgICAgICA9IHNpemVfOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+aW5pdCAgICAgICAgICAgICA9IGluaXRfOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+ZG9uZSAgICAgICAgICAgICA9IGRvbmVfOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Y2hhcl9pbmRleCAgICAgICA9IGNoYXJfaW5kZXhfOyAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Y2hhcl9uZXh0ICAgICAgICA9IGNoYXJfbmV4dF87ICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Y2hhcl92YXJfaW5kZXggICA9IGNoYXJfdmFyX2luZGV4XzsgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Y2hhcl92YXJfZGVmYXVsdCA9IGNoYXJfdmFyX2RlZmF1bHRfOyAgICAgICAgIFwKLSAgICBjbGF6ei0+dmFyaWFudF9saXN0ICAgICA9IHZhcmlhbnRfbGlzdF87ICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Y2hhcnZhcmlhbnRfbGlzdCA9IGNoYXJ2YXJpYW50X2xpc3RfOyAgICAgICAgIFwKLSAgICBjbGF6ei0+dmFyaWFudGNoYXJfbGlzdCA9IHZhcmlhbnRjaGFyX2xpc3RfOyAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0gIC8qIGNyZWF0ZSBhIG5ldyBjaGFybWFwIGFuZCBhZGQgaXQgdG8gY2hhcm1hcC0+ZmFjZSAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX0NNYXBfTmV3KCBGVF9DTWFwX0NsYXNzICBjbGF6eiwKLSAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgICAgIGluaXRfZGF0YSwKLSAgICAgICAgICAgICAgIEZUX0NoYXJNYXAgICAgIGNoYXJtYXAsCi0gICAgICAgICAgICAgICBGVF9DTWFwICAgICAgICphY21hcCApOwotCi0gIC8qIGRlc3Ryb3kgYSBjaGFybWFwIGFuZCByZW1vdmUgaXQgZnJvbSBmYWNlJ3MgbGlzdCAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfQ01hcF9Eb25lKCBGVF9DTWFwICBjbWFwICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GYWNlX0ludGVybmFsUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgaW50ZXJuYWwgZmllbGRzIG9mIGVhY2ggRlRfRmFjZSAgICAgICAgKi8KLSAgLyogICAgb2JqZWN0LiAgVGhlc2UgZmllbGRzIG1heSBjaGFuZ2UgYmV0d2VlbiBkaWZmZXJlbnQgcmVsZWFzZXMgb2YgICAgICovCi0gIC8qICAgIEZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9wb2ludHMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwb2ludHMgdXNlZCB0byBzdG9yZSB0aGUgdmVjdG9yaWFsIG91dGxpbmUgKi8KLSAgLyogICAgICBvZiBhbnkgZ2x5cGggaW4gdGhpcyBmYWNlLiAgSWYgdGhpcyB2YWx1ZSBjYW5ub3QgYmUga25vd24gaW4gICAgICovCi0gIC8qICAgICAgYWR2YW5jZSwgb3IgaWYgdGhlIGZhY2UgaXNuJ3Qgc2NhbGFibGUsIHRoaXMgc2hvdWxkIGJlIHNldCB0byAwLiAqLwotICAvKiAgICAgIE9ubHkgcmVsZXZhbnQgZm9yIHNjYWxhYmxlIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9jb250b3VycyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb250b3VycyB1c2VkIHRvIHN0b3JlIHRoZSB2ZWN0b3JpYWwgICAgICAgKi8KLSAgLyogICAgICBvdXRsaW5lIG9mIGFueSBnbHlwaCBpbiB0aGlzIGZhY2UuICBJZiB0aGlzIHZhbHVlIGNhbm5vdCBiZSAgICAgICovCi0gIC8qICAgICAga25vd24gaW4gYWR2YW5jZSwgb3IgaWYgdGhlIGZhY2UgaXNuJ3Qgc2NhbGFibGUsIHRoaXMgc2hvdWxkIGJlICAqLwotICAvKiAgICAgIHNldCB0byAwLiAgT25seSByZWxldmFudCBmb3Igc2NhbGFibGUgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRyYW5zZm9ybV9tYXRyaXggOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgMngyIG1hdHJpeCBvZiAxNi4xNiBjb2VmZmljaWVudHMgdXNlZCB0byB0cmFuc2Zvcm0gZ2x5cGggICAgICAgKi8KLSAgLyogICAgICBvdXRsaW5lcyBhZnRlciB0aGV5IGFyZSBsb2FkZWQgZnJvbSB0aGUgZm9udC4gIE9ubHkgdXNlZCBieSB0aGUgICovCi0gIC8qICAgICAgY29udmVuaWVuY2UgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHJhbnNmb3JtX2RlbHRhIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSB0cmFuc2xhdGlvbiB2ZWN0b3IgdXNlZCB0byB0cmFuc2Zvcm0gZ2x5cGggb3V0bGluZXMgYWZ0ZXIgdGhleSAqLwotICAvKiAgICAgIGFyZSBsb2FkZWQgZnJvbSB0aGUgZm9udC4gIE9ubHkgdXNlZCBieSB0aGUgY29udmVuaWVuY2UgICAgICAgICAgKi8KLSAgLyogICAgICBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0cmFuc2Zvcm1fZmxhZ3MgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBTb21lIGZsYWdzIHVzZWQgdG8gY2xhc3NpZnkgdGhlIHRyYW5zZm9ybS4gIE9ubHkgdXNlZCBieSB0aGUgICAgICovCi0gIC8qICAgICAgY29udmVuaWVuY2UgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2VydmljZXMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSBjYWNoZSBmb3IgZnJlcXVlbnRseSB1c2VkIHNlcnZpY2VzLiAgSXQgc2hvdWxkIGJlIG9ubHkgICAgICAgICAqLwotICAvKiAgICAgIGFjY2Vzc2VkIHdpdGggdGhlIG1hY3JvIGBGVF9GQUNFX0xPT0tVUF9TRVJWSUNFJy4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGluY3JlbWVudGFsX2ludGVyZmFjZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIElmIG5vbi1udWxsLCB0aGUgaW50ZXJmYWNlIHRocm91Z2ggd2hpY2ggZ2x5cGggZGF0YSBhbmQgbWV0cmljcyAgKi8KLSAgLyogICAgICBhcmUgbG9hZGVkIGluY3JlbWVudGFsbHkgZm9yIGZhY2VzIHRoYXQgZG8gbm90IHByb3ZpZGUgYWxsIG9mICAgICovCi0gIC8qICAgICAgdGhpcyBkYXRhIHdoZW4gZmlyc3Qgb3BlbmVkLiAgVGhpcyBmaWVsZCBleGlzdHMgb25seSBpZiAgICAgICAgICAqLwotICAvKiAgICAgIEBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMIGlzIGRlZmluZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGlnbm9yZV91bnBhdGVudGVkX2hpbnRlciA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoaXMgYm9vbGVhbiBmbGFnIGluc3RydWN0cyB0aGUgZ2x5cGggbG9hZGVyIHRvIGlnbm9yZSB0aGUgICAgICAgKi8KLSAgLyogICAgICBuYXRpdmUgZm9udCBoaW50ZXIsIGlmIG9uZSBpcyBmb3VuZC4gIFRoaXMgaXMgZXhjbHVzaXZlbHkgdXNlZCAgICovCi0gIC8qICAgICAgaW4gdGhlIGNhc2Ugd2hlbiB0aGUgdW5wYXRlbnRlZCBoaW50ZXIgaXMgY29tcGlsZWQgd2l0aGluIHRoZSAgICAqLwotICAvKiAgICAgIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJlZmNvdW50IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgY291bnRlciBpbml0aWFsaXplZCB0b34xIGF0IHRoZSB0aW1lIGFuIEBGVF9GYWNlIHN0cnVjdHVyZSBpcyAgKi8KLSAgLyogICAgICBjcmVhdGVkLiAgQEZUX1JlZmVyZW5jZV9GYWNlIGluY3JlbWVudHMgdGhpcyBjb3VudGVyLCBhbmQgICAgICAgICovCi0gIC8qICAgICAgQEZUX0RvbmVfRmFjZSBvbmx5IGRlc3Ryb3lzIGEgZmFjZSBpZiB0aGUgY291bnRlciBpc34xLCAgICAgICAgICAqLwotICAvKiAgICAgIG90aGVyd2lzZSBpdCBzaW1wbHkgZGVjcmVtZW50cyBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9GYWNlX0ludGVybmFsUmVjXwotICB7Ci0gICAgRlRfTWF0cml4ICAgICAgICAgICB0cmFuc2Zvcm1fbWF0cml4OwotICAgIEZUX1ZlY3RvciAgICAgICAgICAgdHJhbnNmb3JtX2RlbHRhOwotICAgIEZUX0ludCAgICAgICAgICAgICAgdHJhbnNmb3JtX2ZsYWdzOwotCi0gICAgRlRfU2VydmljZUNhY2hlUmVjICBzZXJ2aWNlczsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSAgICBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2VSZWMqICBpbmNyZW1lbnRhbF9pbnRlcmZhY2U7Ci0jZW5kaWYKLQotICAgIEZUX0Jvb2wgICAgICAgICAgICAgaWdub3JlX3VucGF0ZW50ZWRfaGludGVyOwotICAgIEZUX0ludCAgICAgICAgICAgICAgcmVmY291bnQ7Ci0KLSAgfSBGVF9GYWNlX0ludGVybmFsUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2xvdF9JbnRlcm5hbFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGludGVybmFsIGZpZWxkcyBvZiBlYWNoIEZUX0dseXBoU2xvdCAgICovCi0gIC8qICAgIG9iamVjdC4gIFRoZXNlIGZpZWxkcyBtYXkgY2hhbmdlIGJldHdlZW4gZGlmZmVyZW50IHJlbGVhc2VzIG9mICAgICAqLwotICAvKiAgICBGcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkZXIgICAgICAgICAgICA6OiBUaGUgZ2x5cGggbG9hZGVyIG9iamVjdCB1c2VkIHRvIGxvYWQgb3V0bGluZXMgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgaW50byB0aGUgZ2x5cGggc2xvdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmbGFncyAgICAgICAgICAgICA6OiBQb3NzaWJsZSB2YWx1ZXMgYXJlIHplcm8gb3IgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgRlRfR0xZUEhfT1dOX0JJVE1BUC4gIFRoZSBsYXR0ZXIgaW5kaWNhdGVzICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgdGhlIEZUX0dseXBoU2xvdCBzdHJ1Y3R1cmUgb3ducyB0aGUgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXAgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX3RyYW5zZm9ybWVkIDo6IEJvb2xlYW4uICBTZXQgdG8gVFJVRSB3aGVuIHRoZSBsb2FkZWQgZ2x5cGggICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIHRyYW5zZm9ybWVkIHRocm91Z2ggYSBzcGVjaWZpYyAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZm9udCB0cmFuc2Zvcm1hdGlvbi4gIFRoaXMgaXMgX25vdF8gdGhlIHNhbWUgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGFzIHRoZSBmYWNlIHRyYW5zZm9ybSBzZXQgdGhyb3VnaCAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXRfVHJhbnNmb3JtKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX21hdHJpeCAgICAgIDo6IFRoZSAyeDIgbWF0cml4IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdseXBoICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbiwgaWYgbmVjZXNzYXJ5LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2RlbHRhICAgICAgIDo6IFRoZSAyZCB0cmFuc2xhdGlvbiB2ZWN0b3IgY29ycmVzcG9uZGluZyB0byAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZ2x5cGggdHJhbnNmb3JtYXRpb24sIGlmIG5lY2Vzc2FyeS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2hpbnRzICAgICAgIDo6IEZvcm1hdC1zcGVjaWZpYyBnbHlwaCBoaW50cyBtYW5hZ2VtZW50LiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBGVF9HTFlQSF9PV05fQklUTUFQICAweDEKLQotICB0eXBlZGVmIHN0cnVjdCAgRlRfU2xvdF9JbnRlcm5hbFJlY18KLSAgewotICAgIEZUX0dseXBoTG9hZGVyICBsb2FkZXI7Ci0gICAgRlRfVUludCAgICAgICAgIGZsYWdzOwotICAgIEZUX0Jvb2wgICAgICAgICBnbHlwaF90cmFuc2Zvcm1lZDsKLSAgICBGVF9NYXRyaXggICAgICAgZ2x5cGhfbWF0cml4OwotICAgIEZUX1ZlY3RvciAgICAgICBnbHlwaF9kZWx0YTsKLSAgICB2b2lkKiAgICAgICAgICAgZ2x5cGhfaGludHM7Ci0KLSAgfSBGVF9HbHlwaFNsb3RfSW50ZXJuYWxSZWM7Ci0KLQotI2lmIDAKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaXplX0ludGVybmFsUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgaW50ZXJuYWwgZmllbGRzIG9mIGVhY2ggRlRfU2l6ZSAgICAgICAgKi8KLSAgLyogICAgb2JqZWN0LiAgQ3VycmVudGx5LCBpdCdzIGVtcHR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIHN0cnVjdCAgRlRfU2l6ZV9JbnRlcm5hbFJlY18KLSAgewotICAgIC8qIGVtcHR5ICovCi0KLSAgfSBGVF9TaXplX0ludGVybmFsUmVjOwotCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgTSBPIEQgVSBMIEUgUyAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01vZHVsZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgbW9kdWxlIG9iamVjdCBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNsYXp6ICAgOjogQSBwb2ludGVyIHRvIHRoZSBtb2R1bGUncyBjbGFzcy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSB0byB0aGUgcGFyZW50IGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgIDo6IEEgaGFuZGxlIHRvIHRoZSBtZW1vcnkgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9Nb2R1bGVSZWNfCi0gIHsKLSAgICBGVF9Nb2R1bGVfQ2xhc3MqICBjbGF6ejsKLSAgICBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5OwotICAgIEZUX01lbW9yeSAgICAgICAgIG1lbW9yeTsKLQotICB9IEZUX01vZHVsZVJlYzsKLQotCi0gIC8qIHR5cGVjYXN0IGFuIG9iamVjdCB0byBhbiBGVF9Nb2R1bGUgKi8KLSNkZWZpbmUgRlRfTU9EVUxFKCB4ICkgICAgICAgICAgKChGVF9Nb2R1bGUpKCB4ICkpCi0jZGVmaW5lIEZUX01PRFVMRV9DTEFTUyggeCApICAgIEZUX01PRFVMRSggeCApLT5jbGF6egotI2RlZmluZSBGVF9NT0RVTEVfTElCUkFSWSggeCApICBGVF9NT0RVTEUoIHggKS0+bGlicmFyeQotI2RlZmluZSBGVF9NT0RVTEVfTUVNT1JZKCB4ICkgICBGVF9NT0RVTEUoIHggKS0+bWVtb3J5Ci0KLQotI2RlZmluZSBGVF9NT0RVTEVfSVNfRFJJVkVSKCB4ICkgICggRlRfTU9EVUxFX0NMQVNTKCB4ICktPm1vZHVsZV9mbGFncyAmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01PRFVMRV9GT05UX0RSSVZFUiApCi0KLSNkZWZpbmUgRlRfTU9EVUxFX0lTX1JFTkRFUkVSKCB4ICkgICggRlRfTU9EVUxFX0NMQVNTKCB4ICktPm1vZHVsZV9mbGFncyAmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTU9EVUxFX1JFTkRFUkVSICkKLQotI2RlZmluZSBGVF9NT0RVTEVfSVNfSElOVEVSKCB4ICkgICggRlRfTU9EVUxFX0NMQVNTKCB4ICktPm1vZHVsZV9mbGFncyAmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01PRFVMRV9ISU5URVIgKQotCi0jZGVmaW5lIEZUX01PRFVMRV9JU19TVFlMRVIoIHggKSAgKCBGVF9NT0RVTEVfQ0xBU1MoIHggKS0+bW9kdWxlX2ZsYWdzICYgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTU9EVUxFX1NUWUxFUiApCi0KLSNkZWZpbmUgRlRfRFJJVkVSX0lTX1NDQUxBQkxFKCB4ICkgICggRlRfTU9EVUxFX0NMQVNTKCB4ICktPm1vZHVsZV9mbGFncyAmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTU9EVUxFX0RSSVZFUl9TQ0FMQUJMRSApCi0KLSNkZWZpbmUgRlRfRFJJVkVSX1VTRVNfT1VUTElORVMoIHggKSAgISggRlRfTU9EVUxFX0NMQVNTKCB4ICktPm1vZHVsZV9mbGFncyAmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTU9EVUxFX0RSSVZFUl9OT19PVVRMSU5FUyApCi0KLSNkZWZpbmUgRlRfRFJJVkVSX0hBU19ISU5URVIoIHggKSAgKCBGVF9NT0RVTEVfQ0xBU1MoIHggKS0+bW9kdWxlX2ZsYWdzICYgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01PRFVMRV9EUklWRVJfSEFTX0hJTlRFUiApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfTW9kdWxlX0ludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaW5kcyBhIG1vZHVsZSBhbmQgcmV0dXJucyBpdHMgc3BlY2lmaWMgaW50ZXJmYWNlIGFzIGEgdHlwZWxlc3MgICAgKi8KLSAgLyogICAgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGVfbmFtZSA6OiBUaGUgbW9kdWxlJ3MgbmFtZSAoYXMgYW4gQVNDSUkgc3RyaW5nKS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIG1vZHVsZS1zcGVjaWZpYyBpbnRlcmZhY2UgaWYgYXZhaWxhYmxlLCAwIG90aGVyd2lzZS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3Ugc2hvdWxkIGJldHRlciBiZSBmYW1pbGlhciB3aXRoIEZyZWVUeXBlIGludGVybmFscyB0byBrbm93ICAgICAgKi8KLSAgLyogICAgd2hpY2ggbW9kdWxlIHRvIGxvb2sgZm9yLCBhbmQgd2hhdCBpdHMgaW50ZXJmYWNlIGlzIDotKSAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCBjb25zdCB2b2lkKiApCi0gIEZUX0dldF9Nb2R1bGVfSW50ZXJmYWNlKCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBtb2RfbmFtZSApOwotCi0gIEZUX0JBU0UoIEZUX1BvaW50ZXIgKQotICBmdF9tb2R1bGVfZ2V0X3NlcnZpY2UoIEZUX01vZHVsZSAgICBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHNlcnZpY2VfaWQgKTsKLQotICAvKiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgIEYgQSBDIEUsICAgUyBJIFogRSAgICYgICBHIEwgWSBQIEggICBTIEwgTyBUICAgTyBCIEogRSBDIFQgUyAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIGEgZmV3IG1hY3JvcyB1c2VkIHRvIHBlcmZvcm0gZWFzeSB0eXBlY2FzdHMgd2l0aCBtaW5pbWFsIGJyYWluIGRhbWFnZSAqLwotCi0jZGVmaW5lIEZUX0ZBQ0UoIHggKSAgICAgICAgICAoKEZUX0ZhY2UpKHgpKQotI2RlZmluZSBGVF9TSVpFKCB4ICkgICAgICAgICAgKChGVF9TaXplKSh4KSkKLSNkZWZpbmUgRlRfU0xPVCggeCApICAgICAgICAgICgoRlRfR2x5cGhTbG90KSh4KSkKLQotI2RlZmluZSBGVF9GQUNFX0RSSVZFUiggeCApICAgRlRfRkFDRSggeCApLT5kcml2ZXIKLSNkZWZpbmUgRlRfRkFDRV9MSUJSQVJZKCB4ICkgIEZUX0ZBQ0VfRFJJVkVSKCB4ICktPnJvb3QubGlicmFyeQotI2RlZmluZSBGVF9GQUNFX01FTU9SWSggeCApICAgRlRfRkFDRSggeCApLT5tZW1vcnkKLSNkZWZpbmUgRlRfRkFDRV9TVFJFQU0oIHggKSAgIEZUX0ZBQ0UoIHggKS0+c3RyZWFtCi0KLSNkZWZpbmUgRlRfU0laRV9GQUNFKCB4ICkgICAgIEZUX1NJWkUoIHggKS0+ZmFjZQotI2RlZmluZSBGVF9TTE9UX0ZBQ0UoIHggKSAgICAgRlRfU0xPVCggeCApLT5mYWNlCi0KLSNkZWZpbmUgRlRfRkFDRV9TTE9UKCB4ICkgICAgIEZUX0ZBQ0UoIHggKS0+Z2x5cGgKLSNkZWZpbmUgRlRfRkFDRV9TSVpFKCB4ICkgICAgIEZUX0ZBQ0UoIHggKS0+c2l6ZQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTmV3X0dseXBoU2xvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSXQgaXMgc29tZXRpbWVzIHVzZWZ1bCB0byBoYXZlIG1vcmUgdGhhbiBvbmUgZ2x5cGggc2xvdCBmb3IgYSAgICAgICovCi0gIC8qICAgIGdpdmVuIGZhY2Ugb2JqZWN0LiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhZGRpdGlvbmFsICAgICAqLwotICAvKiAgICBzbG90cy4gIEFsbCBvZiB0aGVtIGFyZSBhdXRvbWF0aWNhbGx5IGRpc2NhcmRlZCB3aGVuIHRoZSBmYWNlIGlzICAgKi8KLSAgLyogICAgZGVzdHJveWVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgOjogQSBoYW5kbGUgdG8gYSBwYXJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXNsb3QgOjogQSBoYW5kbGUgdG8gYSBuZXcgZ2x5cGggc2xvdCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX05ld19HbHlwaFNsb3QoIEZUX0ZhY2UgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgKmFzbG90ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Eb25lX0dseXBoU2xvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZXN0cm95cyBhIGdpdmVuIGdseXBoIHNsb3QuICBSZW1lbWJlciBob3dldmVyIHRoYXQgYWxsIHNsb3RzIGFyZSAgKi8KLSAgLyogICAgYXV0b21hdGljYWxseSBkZXN0cm95ZWQgd2l0aCBpdHMgcGFyZW50LiAgVXNpbmcgdGhpcyBmdW5jdGlvbiBpcyAgICovCi0gIC8qICAgIG5vdCBhbHdheXMgbWFuZGF0b3J5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNsb3QgOjogQSBoYW5kbGUgdG8gYSB0YXJnZXQgZ2x5cGggc2xvdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIEZUX0RvbmVfR2x5cGhTbG90KCBGVF9HbHlwaFNsb3QgIHNsb3QgKTsKLQotIC8qICovCi0KLSNkZWZpbmUgRlRfUkVRVUVTVF9XSURUSCggcmVxICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIChyZXEpLT5ob3JpUmVzb2x1dGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgPyAoRlRfUG9zKSggKHJlcSktPndpZHRoICogKHJlcSktPmhvcmlSZXNvbHV0aW9uICsgMzYgKSAvIDcyIFwKLSAgICAgICAgICAgICAgOiAocmVxKS0+d2lkdGggKQotCi0jZGVmaW5lIEZUX1JFUVVFU1RfSEVJR0hUKCByZXEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKHJlcSktPnZlcnRSZXNvbHV0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgPyAoRlRfUG9zKSggKHJlcSktPmhlaWdodCAqIChyZXEpLT52ZXJ0UmVzb2x1dGlvbiArIDM2ICkgLyA3MiBcCi0gICAgICAgICAgICAgIDogKHJlcSktPmhlaWdodCApCi0KLQotICAvKiBTZXQgdGhlIG1ldHJpY3MgYWNjb3JkaW5nIHRvIGEgYml0bWFwIHN0cmlrZS4gKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIEZUX1NlbGVjdF9NZXRyaWNzKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBzdHJpa2VfaW5kZXggKTsKLQotCi0gIC8qIFNldCB0aGUgbWV0cmljcyBhY2NvcmRpbmcgdG8gYSBzaXplIHJlcXVlc3QuICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9SZXF1ZXN0X01ldHJpY3MoIEZUX0ZhY2UgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9TaXplX1JlcXVlc3QgIHJlcSApOwotCi0KLSAgLyogTWF0Y2ggYSBzaXplIHJlcXVlc3QgYWdhaW5zdCBgYXZhaWxhYmxlX3NpemVzJy4gKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9NYXRjaF9TaXplKCBGVF9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgIEZUX1NpemVfUmVxdWVzdCAgcmVxLAotICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgIGlnbm9yZV93aWR0aCwKLSAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgICBzaXplX2luZGV4ICk7Ci0KLQotICAvKiBVc2UgdGhlIGhvcml6b250YWwgbWV0cmljcyB0byBzeW50aGVzaXplIHRoZSB2ZXJ0aWNhbCBtZXRyaWNzLiAqLwotICAvKiBJZiBgYWR2YW5jZScgaXMgemVybywgaXQgaXMgYWxzbyBzeW50aGVzaXplZC4gICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgZnRfc3ludGhlc2l6ZV92ZXJ0aWNhbF9tZXRyaWNzKCBGVF9HbHlwaF9NZXRyaWNzKiAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICAgICAgYWR2YW5jZSApOwotCi0KLSAgLyogRnJlZSB0aGUgYml0bWFwIG9mIGEgZ2l2ZW4gZ2x5cGhzbG90IHdoZW4gbmVlZGVkIChpLmUuLCBvbmx5IHdoZW4gaXQgKi8KLSAgLyogd2FzIGFsbG9jYXRlZCB3aXRoIGZ0X2dseXBoc2xvdF9hbGxvY19iaXRtYXApLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIGZ0X2dseXBoc2xvdF9mcmVlX2JpdG1hcCggRlRfR2x5cGhTbG90ICBzbG90ICk7Ci0KLQotICAvKiBBbGxvY2F0ZSBhIG5ldyBiaXRtYXAgYnVmZmVyIGluIGEgZ2x5cGggc2xvdC4gKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBmdF9nbHlwaHNsb3RfYWxsb2NfYml0bWFwKCBGVF9HbHlwaFNsb3QgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgc2l6ZSApOwotCi0KLSAgLyogU2V0IHRoZSBiaXRtYXAgYnVmZmVyIGluIGEgZ2x5cGggc2xvdCB0byBhIGdpdmVuIHBvaW50ZXIuICBUaGUgYnVmZmVyICovCi0gIC8qIHdpbGwgbm90IGJlIGZyZWVkIGJ5IGEgbGF0ZXIgY2FsbCB0byBmdF9nbHlwaHNsb3RfZnJlZV9iaXRtYXAuICAgICAgICAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgZnRfZ2x5cGhzbG90X3NldF9iaXRtYXAoIEZUX0dseXBoU2xvdCAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgYnVmZmVyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgUiBFIE4gRCBFIFIgRSBSIFMgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBGVF9SRU5ERVJFUiggeCApICAgICAgKChGVF9SZW5kZXJlcikoIHggKSkKLSNkZWZpbmUgRlRfR0xZUEgoIHggKSAgICAgICAgICgoRlRfR2x5cGgpKCB4ICkpCi0jZGVmaW5lIEZUX0JJVE1BUF9HTFlQSCggeCApICAoKEZUX0JpdG1hcEdseXBoKSggeCApKQotI2RlZmluZSBGVF9PVVRMSU5FX0dMWVBIKCB4ICkgKChGVF9PdXRsaW5lR2x5cGgpKCB4ICkpCi0KLQotICB0eXBlZGVmIHN0cnVjdCAgRlRfUmVuZGVyZXJSZWNfCi0gIHsKLSAgICBGVF9Nb2R1bGVSZWMgICAgICAgICAgICByb290OwotICAgIEZUX1JlbmRlcmVyX0NsYXNzKiAgICAgIGNsYXp6OwotICAgIEZUX0dseXBoX0Zvcm1hdCAgICAgICAgIGdseXBoX2Zvcm1hdDsKLSAgICBGVF9HbHlwaF9DbGFzcyAgICAgICAgICBnbHlwaF9jbGFzczsKLQotICAgIEZUX1Jhc3RlciAgICAgICAgICAgICAgIHJhc3RlcjsKLSAgICBGVF9SYXN0ZXJfUmVuZGVyX0Z1bmMgICByYXN0ZXJfcmVuZGVyOwotICAgIEZUX1JlbmRlcmVyX1JlbmRlckZ1bmMgIHJlbmRlcjsKLQotICB9IEZUX1JlbmRlcmVyUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgRiBPIE4gVCAgIEQgUiBJIFYgRSBSIFMgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogdHlwZWNhc3QgYSBtb2R1bGUgaW50byBhIGRyaXZlciBlYXNpbHkgKi8KLSNkZWZpbmUgRlRfRFJJVkVSKCB4ICkgICAgICAgICgoRlRfRHJpdmVyKSh4KSkKLQotICAvKiB0eXBlY2FzdCBhIG1vZHVsZSBhcyBhIGRyaXZlciwgYW5kIGdldCBpdHMgZHJpdmVyIGNsYXNzICovCi0jZGVmaW5lIEZUX0RSSVZFUl9DTEFTUyggeCApICBGVF9EUklWRVIoIHggKS0+Y2xhenoKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RyaXZlclJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByb290IGZvbnQgZHJpdmVyIGNsYXNzLiAgQSBmb250IGRyaXZlciBpcyByZXNwb25zaWJsZSBmb3IgICAgICAqLwotICAvKiAgICBtYW5hZ2luZyBhbmQgbG9hZGluZyBmb250IGZpbGVzIG9mIGEgZ2l2ZW4gZm9ybWF0LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgcm9vdCAgICAgICAgIDo6IENvbnRhaW5zIHRoZSBmaWVsZHMgb2YgdGhlIHJvb3QgbW9kdWxlIGNsYXNzLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBjbGF6eiAgICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBmb250IGRyaXZlcidzIGNsYXNzLiAgTm90ZSB0aGF0ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgTk9UIHJvb3QuY2xhenouICBgY2xhc3MnIHdhc24ndCB1c2VkICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBhcyBpdCBpcyBhIHJlc2VydmVkIHdvcmQgaW4gQysrLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgZmFjZXNfbGlzdCAgIDo6IFRoZSBsaXN0IG9mIGZhY2VzIGN1cnJlbnRseSBvcGVuZWQgYnkgdGhpcyAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBkcml2ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgZ2x5cGhfbG9hZGVyIDo6IFRoZSBnbHlwaCBsb2FkZXIgZm9yIGFsbCBmYWNlcyBtYW5hZ2VkIGJ5IHRoaXMgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBkcml2ZXIuICBUaGlzIG9iamVjdCBpc24ndCBkZWZpbmVkIGZvciB1bnNjYWxhYmxlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0RyaXZlclJlY18KLSAgewotICAgIEZUX01vZHVsZVJlYyAgICAgcm9vdDsKLSAgICBGVF9Ecml2ZXJfQ2xhc3MgIGNsYXp6OwotICAgIEZUX0xpc3RSZWMgICAgICAgZmFjZXNfbGlzdDsKLSAgICBGVF9HbHlwaExvYWRlciAgIGdseXBoX2xvYWRlcjsKLQotICB9IEZUX0RyaXZlclJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgIEwgSSBCIFIgQSBSIEkgRSBTICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIFRoaXMgaG9vayBpcyB1c2VkIGJ5IHRoZSBUcnVlVHlwZSBkZWJ1Z2dlci4gIEl0IG11c3QgYmUgc2V0IHRvIGFuICovCi0gIC8qIGFsdGVybmF0ZSB0cnVldHlwZSBieXRlY29kZSBpbnRlcnByZXRlciBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0RFQlVHX0hPT0tfVFJVRVRZUEUgICAgICAgICAgICAwCi0KLQotICAvKiBTZXQgdGhpcyBkZWJ1ZyBob29rIHRvIGEgbm9uLW51bGwgcG9pbnRlciB0byBmb3JjZSB1bnBhdGVudGVkIGhpbnRpbmcgKi8KLSAgLyogZm9yIGFsbCBmYWNlcyB3aGVuIGJvdGggVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSIGFuZCAgICAgICAgICAgICAgICovCi0gIC8qIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HIGFyZSBkZWZpbmVkLiAgVGhpcyBpcyBvbmx5IHVzZWQgICAqLwotICAvKiBkdXJpbmcgZGVidWdnaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfREVCVUdfSE9PS19VTlBBVEVOVEVEX0hJTlRJTkcgIDEKLQotCi0gIHR5cGVkZWYgdm9pZCAgKCpGVF9CaXRtYXBfTGNkRmlsdGVyRnVuYykoIEZUX0JpdG1hcCogICAgICBiaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICByZW5kZXJfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTGlicmFyeSAgICAgIGxpYnJhcnkgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpYnJhcnlSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBGcmVlVHlwZSBsaWJyYXJ5IGNsYXNzLiAgVGhpcyBpcyB0aGUgcm9vdCBvZiBhbGwgRnJlZVR5cGUgICAgICAqLwotICAvKiAgICBkYXRhLiAgVXNlIEZUX05ld19MaWJyYXJ5KCkgdG8gY3JlYXRlIGEgbGlicmFyeSBvYmplY3QsIGFuZCAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9MaWJyYXJ5KCkgdG8gZGlzY2FyZCBpdCBhbmQgYWxsIGNoaWxkIG9iamVjdHMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICAgICAgICAgICA6OiBUaGUgbGlicmFyeSdzIG1lbW9yeSBvYmplY3QuICBNYW5hZ2VzIG1lbW9yeSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVyc2lvbl9tYWpvciAgICA6OiBUaGUgbWFqb3IgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGxpYnJhcnkuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJzaW9uX21pbm9yICAgIDo6IFRoZSBtaW5vciB2ZXJzaW9uIG51bWJlciBvZiB0aGUgbGlicmFyeS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnNpb25fcGF0Y2ggICAgOjogVGhlIGN1cnJlbnQgcGF0Y2ggbGV2ZWwgb2YgdGhlIGxpYnJhcnkuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX21vZHVsZXMgICAgICA6OiBUaGUgbnVtYmVyIG9mIG1vZHVsZXMgY3VycmVudGx5IHJlZ2lzdGVyZWQgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgd2l0aGluIHRoaXMgbGlicmFyeS4gIFRoaXMgaXMgc2V0IHRvIDAgZm9yIG5ldyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcy4gIE5ldyBtb2R1bGVzIGFyZSBhZGRlZCB0aHJvdWdoIHRoZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBGVF9BZGRfTW9kdWxlKCkgQVBJIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGVzICAgICAgICAgIDo6IEEgdGFibGUgdXNlZCB0byBzdG9yZSBoYW5kbGVzIHRvIHRoZSBjdXJyZW50bHkgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlcmVkIG1vZHVsZXMuIE5vdGUgdGhhdCBlYWNoIGZvbnQgZHJpdmVyICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgYSBsaXN0IG9mIGl0cyBvcGVuZWQgZmFjZXMuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVuZGVyZXJzICAgICAgICA6OiBUaGUgbGlzdCBvZiByZW5kZXJlcnMgY3VycmVudGx5IHJlZ2lzdGVyZWQgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgd2l0aGluIHRoZSBsaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY3VyX3JlbmRlcmVyICAgICA6OiBUaGUgY3VycmVudCBvdXRsaW5lIHJlbmRlcmVyLiAgVGhpcyBpcyBhICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRjdXQgdXNlZCB0byBhdm9pZCBwYXJzaW5nIHRoZSBsaXN0IG9uICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggY2FsbCB0byBGVF9PdXRsaW5lX1JlbmRlcigpLiAgSXQgaXMgYSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUgdG8gdGhlIGN1cnJlbnQgcmVuZGVyZXIgZm9yIHRoZSAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgRlRfR0xZUEhfRk9STUFUX09VVExJTkUgZm9ybWF0LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXV0b19oaW50ZXIgICAgICA6OiBYWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXJfcG9vbCAgICAgIDo6IFRoZSByYXN0ZXIgb2JqZWN0J3MgcmVuZGVyIHBvb2wuICBUaGlzIGNhbiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBpZGVhbGx5IGJlIGNoYW5nZWQgZHluYW1pY2FsbHkgYXQgcnVuLXRpbWUuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXJfcG9vbF9zaXplIDo6IFRoZSBzaXplIG9mIHRoZSByZW5kZXIgcG9vbCBpbiBieXRlcy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlYnVnX2hvb2tzICAgICAgOjogWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGNkX2ZpbHRlciAgICAgICA6OiBJZiBzdWJwaXhlbCByZW5kZXJpbmcgaXMgYWN0aXZhdGVkLCB0aGUgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgTENEIGZpbHRlciBtb2RlLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGNkX2V4dHJhICAgICAgICA6OiBJZiBzdWJwaXhlbCByZW5kZXJpbmcgaXMgYWN0aXZhdGVkLCB0aGUgbnVtYmVyICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgb2YgZXh0cmEgcGl4ZWxzIG5lZWRlZCBmb3IgdGhlIExDRCBmaWx0ZXIuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGNkX3dlaWdodHMgICAgICA6OiBJZiBzdWJwaXhlbCByZW5kZXJpbmcgaXMgYWN0aXZhdGVkLCB0aGUgTENEICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyIHdlaWdodHMsIGlmIGFueS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGNkX2ZpbHRlcl9mdW5jICA6OiBJZiBzdWJwaXhlbCByZW5kZXJpbmcgaXMgYWN0aXZhdGVkLCB0aGUgTENEICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyaW5nIGNhbGxiYWNrIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGljX2NvbnRhaW5lciAgICA6OiBDb250YWlucyBnbG9iYWwgc3RydWN0cyBhbmQgdGFibGVzLCBpbnN0ZWFkICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgb2YgZGVmaW5pbmcgdGhlbSBnbG9iYWxsbHkuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVmY291bnQgICAgICAgICA6OiBBIGNvdW50ZXIgaW5pdGlhbGl6ZWQgdG9+MSBhdCB0aGUgdGltZSBhbiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgQEZUX0xpYnJhcnkgc3RydWN0dXJlIGlzIGNyZWF0ZWQuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIEBGVF9SZWZlcmVuY2VfTGlicmFyeSBpbmNyZW1lbnRzIHRoaXMgY291bnRlciwgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBhbmQgQEZUX0RvbmVfTGlicmFyeSBvbmx5IGRlc3Ryb3lzIGEgbGlicmFyeSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIGNvdW50ZXIgaXN+MSwgb3RoZXJ3aXNlIGl0IHNpbXBseSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGRlY3JlbWVudHMgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9MaWJyYXJ5UmVjXwotICB7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeTsgICAgICAgICAgIC8qIGxpYnJhcnkncyBtZW1vcnkgbWFuYWdlciAqLwotCi0gICAgRlRfSW50ICAgICAgICAgICAgIHZlcnNpb25fbWFqb3I7Ci0gICAgRlRfSW50ICAgICAgICAgICAgIHZlcnNpb25fbWlub3I7Ci0gICAgRlRfSW50ICAgICAgICAgICAgIHZlcnNpb25fcGF0Y2g7Ci0KLSAgICBGVF9VSW50ICAgICAgICAgICAgbnVtX21vZHVsZXM7Ci0gICAgRlRfTW9kdWxlICAgICAgICAgIG1vZHVsZXNbRlRfTUFYX01PRFVMRVNdOyAgLyogbW9kdWxlIG9iamVjdHMgICovCi0KLSAgICBGVF9MaXN0UmVjICAgICAgICAgcmVuZGVyZXJzOyAgICAgICAgLyogbGlzdCBvZiByZW5kZXJlcnMgICAgICAgICovCi0gICAgRlRfUmVuZGVyZXIgICAgICAgIGN1cl9yZW5kZXJlcjsgICAgIC8qIGN1cnJlbnQgb3V0bGluZSByZW5kZXJlciAqLwotICAgIEZUX01vZHVsZSAgICAgICAgICBhdXRvX2hpbnRlcjsKLQotICAgIEZUX0J5dGUqICAgICAgICAgICByYXN0ZXJfcG9vbDsgICAgICAvKiBzY2FuLWxpbmUgY29udmVyc2lvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZW5kZXIgcG9vbCAgICAgICAgICAqLwotICAgIEZUX1VMb25nICAgICAgICAgICByYXN0ZXJfcG9vbF9zaXplOyAvKiBzaXplIG9mIHJlbmRlciBwb29sIGluIGJ5dGVzICovCi0KLSAgICBGVF9EZWJ1Z0hvb2tfRnVuYyAgZGVidWdfaG9va3NbNF07Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORwotICAgIEZUX0xjZEZpbHRlciAgICAgICAgICAgICBsY2RfZmlsdGVyOwotICAgIEZUX0ludCAgICAgICAgICAgICAgICAgICBsY2RfZXh0cmE7ICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgcGl4ZWxzICovCi0gICAgRlRfQnl0ZSAgICAgICAgICAgICAgICAgIGxjZF93ZWlnaHRzWzddOyAgIC8qIGZpbHRlciB3ZWlnaHRzLCBpZiBhbnkgKi8KLSAgICBGVF9CaXRtYXBfTGNkRmlsdGVyRnVuYyAgbGNkX2ZpbHRlcl9mdW5jOyAgLyogZmlsdGVyaW5nIGNhbGxiYWNrICAgICAqLwotI2VuZGlmCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotICAgIEZUX1BJQ19Db250YWluZXIgICBwaWNfY29udGFpbmVyOwotI2VuZGlmCi0KLSAgICBGVF9JbnQgICAgICAgICAgICAgcmVmY291bnQ7Ci0KLSAgfSBGVF9MaWJyYXJ5UmVjOwotCi0KLSAgRlRfQkFTRSggRlRfUmVuZGVyZXIgKQotICBGVF9Mb29rdXBfUmVuZGVyZXIoIEZUX0xpYnJhcnkgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaF9Gb3JtYXQgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9MaXN0Tm9kZSogICAgIG5vZGUgKTsKLQotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX1JlbmRlcl9HbHlwaF9JbnRlcm5hbCggRlRfTGlicmFyeSAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgIHJlbmRlcl9tb2RlICk7Ci0KLSAgdHlwZWRlZiBjb25zdCBjaGFyKgotICAoKkZUX0ZhY2VfR2V0UG9zdHNjcmlwdE5hbWVGdW5jKSggRlRfRmFjZSAgZmFjZSApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9GYWNlX0dldEdseXBoTmFtZUZ1bmMpKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBidWZmZXJfbWF4ICk7Ci0KLSAgdHlwZWRlZiBGVF9VSW50Ci0gICgqRlRfRmFjZV9HZXRHbHlwaE5hbWVJbmRleEZ1bmMpKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyaW5nKiAgZ2x5cGhfbmFtZSApOwotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9OT19ERUZBVUxUX1NZU1RFTQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX05ld19NZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENyZWF0ZXMgYSBuZXcgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgcG9pbnRlciB0byB0aGUgbmV3IG1lbW9yeSBvYmplY3QuICAwIGluIGNhc2Ugb2YgZXJyb3IuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfTWVtb3J5ICkKLSAgRlRfTmV3X01lbW9yeSggdm9pZCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9NZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGlzY2FyZHMgbWVtb3J5IG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5IDo6IEEgaGFuZGxlIHRvIHRoZSBtZW1vcnkgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfRG9uZV9NZW1vcnkoIEZUX01lbW9yeSAgbWVtb3J5ICk7Ci0KLSNlbmRpZiAvKiAhRlRfQ09ORklHX09QVElPTl9OT19ERUZBVUxUX1NZU1RFTSAqLwotCi0KLSAgLyogRGVmaW5lIGRlZmF1bHQgcmFzdGVyJ3MgaW50ZXJmYWNlLiAgVGhlIGRlZmF1bHQgcmFzdGVyIGlzIGxvY2F0ZWQgaW4gICovCi0gIC8qIGBzcmMvYmFzZS9mdHJhc3Rlci5jJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ2xpZW50IGFwcGxpY2F0aW9ucyBjYW4gcmVnaXN0ZXIgbmV3IHJhc3RlcnMgdGhyb3VnaCB0aGUgICAgICAgICAgICAgICovCi0gIC8qIEZUX1NldF9SYXN0ZXIoKSBBUEkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWZuZGVmIEZUX05PX0RFRkFVTFRfUkFTVEVSCi0gIEZUX0VYUE9SVF9WQVIoIEZUX1Jhc3Rlcl9GdW5jcyApICBmdF9kZWZhdWx0X3Jhc3RlcjsKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICBQIEkgQyAgIFMgVSBQIFAgTyBSIFQgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogUElDIHN1cHBvcnQgbWFjcm9zIGZvciBmdGltYWdlLmggKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFRklORV9PVVRMSU5FX0ZVTkNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiBGVF9PdXRsaW5lX0Z1bmNzIHN0cnVjdC4gICAgICAgICAqLwotICAvKiAgICBXaGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQgYW4gaW5pdCBmdW50aW9uIHdpbGwgbmVlZCB0byAgKi8KLSAgLyogICAgYmUgY2FsbGVkIHdpdGggYSBwcmUtYWxsb2NhdGVkIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQuICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgbm90IGRlZmluZWQgdGhlIHN0cnVjdCB3aWxsIGJlICAgICAgICAqLwotICAvKiAgICBhbGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZSAob3IgdGhlIHNjb3BlIHdoZXJlIHRoZSBtYWNybyAgICAgICAgKi8KLSAgLyogICAgaXMgdXNlZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX0RFRklORV9PVVRMSU5FX0ZVTkNTKCAgICAgICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBtb3ZlX3RvXywgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbGluZV90b18sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNvbmljX3RvXywgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjdWJpY190b18sICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2hpZnRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRlbHRhXyApICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc3RhdGljIGNvbnN0ICBGVF9PdXRsaW5lX0Z1bmNzIGNsYXNzXyA9ICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIG1vdmVfdG9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaW5lX3RvXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uaWNfdG9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGN1YmljX3RvXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzaGlmdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZGVsdGFfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFRklORV9PVVRMSU5FX0ZVTkNTKCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIG1vdmVfdG9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbGluZV90b18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjb25pY190b18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGN1YmljX3RvXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2hpZnRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkZWx0YV8gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEluaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfT3V0bGluZV9GdW5jcyogIGNsYXp6ICkgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5tb3ZlX3RvICA9IG1vdmVfdG9fOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmxpbmVfdG8gID0gbGluZV90b187ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Y29uaWNfdG8gPSBjb25pY190b187ICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5jdWJpY190byA9IGN1YmljX3RvXzsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnNoaWZ0ICAgID0gc2hpZnRfOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+ZGVsdGEgICAgPSBkZWx0YV87ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIEZUX0Vycl9PazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFRklORV9SQVNURVJfRlVOQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiBGVF9SYXN0ZXJfRnVuY3Mgc3RydWN0LiAgICAgICAgICAqLwotICAvKiAgICBXaGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQgYW4gaW5pdCBmdW50aW9uIHdpbGwgbmVlZCB0byAgKi8KLSAgLyogICAgYmUgY2FsbGVkIHdpdGggYSBwcmUtYWxsb2NhdGVkIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQuICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgbm90IGRlZmluZWQgdGhlIHN0cnVjdCB3aWxsIGJlICAgICAgICAqLwotICAvKiAgICBhbGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZSAob3IgdGhlIHNjb3BlIHdoZXJlIHRoZSBtYWNybyAgICAgICAgKi8KLSAgLyogICAgaXMgdXNlZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX0RFRklORV9SQVNURVJfRlVOQ1MoICAgIFwKLSAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdseXBoX2Zvcm1hdF8sICAgICAgICAgICBcCi0gICAgICAgICAgcmFzdGVyX25ld18sICAgICAgICAgICAgIFwKLSAgICAgICAgICByYXN0ZXJfcmVzZXRfLCAgICAgICAgICAgXAotICAgICAgICAgIHJhc3Rlcl9zZXRfbW9kZV8sICAgICAgICBcCi0gICAgICAgICAgcmFzdGVyX3JlbmRlcl8sICAgICAgICAgIFwKLSAgICAgICAgICByYXN0ZXJfZG9uZV8gKSAgICAgICAgICAgXAotICBjb25zdCBGVF9SYXN0ZXJfRnVuY3MgIGNsYXNzXyA9ICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnbHlwaF9mb3JtYXRfLCAgICAgICAgICAgICAgICAgXAotICAgIHJhc3Rlcl9uZXdfLCAgICAgICAgICAgICAgICAgICBcCi0gICAgcmFzdGVyX3Jlc2V0XywgICAgICAgICAgICAgICAgIFwKLSAgICByYXN0ZXJfc2V0X21vZGVfLCAgICAgICAgICAgICAgXAotICAgIHJhc3Rlcl9yZW5kZXJfLCAgICAgICAgICAgICAgICBcCi0gICAgcmFzdGVyX2RvbmVfICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfUkFTVEVSX0ZVTkNTKCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2x5cGhfZm9ybWF0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJhc3Rlcl9uZXdfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByYXN0ZXJfcmVzZXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgcmFzdGVyX3NldF9tb2RlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJhc3Rlcl9yZW5kZXJfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByYXN0ZXJfZG9uZV8gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX1Jhc3Rlcl9GdW5jcyogIGNsYXp6ICkgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdseXBoX2Zvcm1hdCAgICA9IGdseXBoX2Zvcm1hdF87ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5yYXN0ZXJfbmV3ICAgICAgPSByYXN0ZXJfbmV3XzsgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cmFzdGVyX3Jlc2V0ICAgID0gcmFzdGVyX3Jlc2V0XzsgICAgICAgICAgICBcCi0gICAgY2xhenotPnJhc3Rlcl9zZXRfbW9kZSA9IHJhc3Rlcl9zZXRfbW9kZV87ICAgICAgICAgXAotICAgIGNsYXp6LT5yYXN0ZXJfcmVuZGVyICAgPSByYXN0ZXJfcmVuZGVyXzsgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cmFzdGVyX2RvbmUgICAgID0gcmFzdGVyX2RvbmVfOyAgICAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLQotICAvKiBQSUMgc3VwcG9ydCBtYWNyb3MgZm9yIGZ0cmVuZGVyLmggKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFRklORV9HTFlQSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiBGVF9HbHlwaF9DbGFzcyBzdHJ1Y3QuICAgICAgICAgICAqLwotICAvKiAgICBXaGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQgYW4gaW5pdCBmdW50aW9uIHdpbGwgbmVlZCB0byAgKi8KLSAgLyogICAgYmUgY2FsbGVkIHdpdGggYSBwcmUtYWxsb2NhdGVkIHN0Y3R1cmUgdG8gYmUgZmlsbGVkLiAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgbm90IGRlZmluZWQgdGhlIHN0cnVjdCB3aWxsIGJlICAgICAgICAqLwotICAvKiAgICBhbGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZSAob3IgdGhlIHNjb3BlIHdoZXJlIHRoZSBtYWNybyAgICAgICAgKi8KLSAgLyogICAgaXMgdXNlZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX0RFRklORV9HTFlQSCggICAgICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzaXplXywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZm9ybWF0XywgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lXywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY29weV8sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHRyYW5zZm9ybV8sICAgICAgICAgICAgIFwKLSAgICAgICAgICBiYm94XywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgcHJlcGFyZV8gKSAgICAgICAgICAgICAgXAotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYgICAgICAgICAgIFwKLSAgY29uc3QgRlRfR2x5cGhfQ2xhc3MgIGNsYXNzXyA9ICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3JtYXRfLCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb3B5XywgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdHJhbnNmb3JtXywgICAgICAgICAgICAgICAgICAgXAotICAgIGJib3hfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwcmVwYXJlXyAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVGSU5FX0dMWVBIKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBmb3JtYXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbml0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjb3B5XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB0cmFuc2Zvcm1fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBiYm94XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBwcmVwYXJlXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9HbHlwaF9DbGFzcyogIGNsYXp6ICkgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2x5cGhfc2l6ZSAgICAgID0gc2l6ZV87ICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2x5cGhfZm9ybWF0ICAgID0gZm9ybWF0XzsgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2x5cGhfaW5pdCAgICAgID0gaW5pdF87ICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2x5cGhfZG9uZSAgICAgID0gZG9uZV87ICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2x5cGhfY29weSAgICAgID0gY29weV87ICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2x5cGhfdHJhbnNmb3JtID0gdHJhbnNmb3JtXzsgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2x5cGhfYmJveCAgICAgID0gYmJveF87ICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2x5cGhfcHJlcGFyZSAgID0gcHJlcGFyZV87ICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFQ0xBUkVfUkVOREVSRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZWQgdG8gY3JlYXRlIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBhICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SZW5kZXJlcl9DbGFzcyBzdHJ1Y3QgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9ERUZJTkVfUkVOREVSRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2VkIHRvIGluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgRlRfUmVuZGVyZXJfQ2xhc3Mgc3RydWN0LiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgZGVmaW5lZCBhIGBjcmVhdGUnIGZ1bnRpb24gd2lsbCBuZWVkICAqLwotICAvKiAgICB0byBiZSBjYWxsZWQgd2l0aCBhIHBvaW50ZXIgd2hlcmUgdGhlIGFsbG9jYXRlZCBzdHJ1Y3R1cmUgaXMgICAgICAgKi8KLSAgLyogICAgcmV0dXJuZWQuICBBbmQgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkIGEgYGRlc3Ryb3knIGZ1bmN0aW9uICAgICovCi0gIC8qICAgIG5lZWRzIHRvIGJlIGNhbGxlZCB0byByZWxlYXNlIHRoYXQgYWxsb2NhdGlvbi4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBgZmNpbml0LmMnIChmdF9jcmVhdGVfZGVmYXVsdF9tb2R1bGVfY2xhc3NlcykgYWxyZWFkeSBjb250YWlucyAgICAgKi8KLSAgLyogICAgYSBtZWNoYW5pc20gdG8gY2FsbCB0aGVzZSBmdW5jdGlvbnMgZm9yIHRoZSBkZWZhdWx0IG1vZHVsZXMgICAgICAgICovCi0gIC8qICAgIGRlc2NyaWJlZCBpbiBgZnRtb2R1bGUuaCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90aWNlIHRoYXQgdGhlIGNyZWF0ZWQgYGNyZWF0ZScgYW5kIGBkZXN0cm95JyBmdW5jdGlvbnMgY2FsbCAgICAgICovCi0gIC8qICAgIGBwaWNfaW5pdCcgYW5kIGBwaWNfZnJlZScgdG8gYWxsb3cgeW91IHRvIG1hbnVhbGx5IGFsbG9jYXRlIGFuZCAgICAqLwotICAvKiAgICBpbml0aWFsaXplIGFueSBhZGRpdGlvbmFsIGdsb2JhbCBkYXRhLCBsaWtlIGEgbW9kdWxlIHNwZWNpZmljICAgICAgKi8KLSAgLyogICAgaW50ZXJmYWNlLCBhbmQgcHV0IHRoZW0gaW4gdGhlIGdsb2JhbCBwaWMgY29udGFpbmVyIGRlZmluZWQgaW4gICAgICovCi0gIC8qICAgIGBmdHBpYy5oJy4gIElmIHlvdSBkb24ndCBuZWVkIHRoZW0ganVzdCBpbXBsZW1lbnQgdGhlIGZ1bmN0aW9ucyBhcyAqLwotICAvKiAgICBlbXB0eSB0byByZXNvbHZlIHRoZSBsaW5rIGVycm9yLiAgQWxzbyB0aGUgYHBpY19pbml0JyBhbmQgICAgICAgICAgKi8KLSAgLyogICAgYHBpY19mcmVlJyBmdW5jdGlvbnMgc2hvdWxkIGJlIGRlY2xhcmVkIGluIGBwaWMuaCcsIHRvIGJlIHJlZmVycmVkICovCi0gIC8qICAgIGJ5IHRoZSByZW5kZXJlciBkZWZpbml0aW9uIGNhbGxpbmcgYEZUX0RFRklORV9SRU5ERVJFUicgaW4gdGhlICAgICAqLwotICAvKiAgICBmb2xsb3dpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgbm90IGRlZmluZWQgdGhlIHN0cnVjdCB3aWxsIGJlICAgICAgICAqLwotICAvKiAgICBhbGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZSAob3IgdGhlIHNjb3BlIHdoZXJlIHRoZSBtYWNybyAgICAgICAgKi8KLSAgLyogICAgaXMgdXNlZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX0RFQ0xBUkVfUkVOREVSRVIoIGNsYXNzXyApICAgICAgICAgICAgICAgXAotICBGVF9FWFBPUlRfVkFSKCBjb25zdCBGVF9SZW5kZXJlcl9DbGFzcyApIGNsYXNzXzsKLQotI2RlZmluZSBGVF9ERUZJTkVfUkVOREVSRVIoICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZsYWdzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIG5hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHZlcnNpb25fLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJlcXVpcmVzXywgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGludGVyZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9pbnRlcmZhY2VfLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdseXBoX2Zvcm1hdF8sICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJlbmRlcl9nbHlwaF8sICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHRyYW5zZm9ybV9nbHlwaF8sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9nbHlwaF9jYm94XywgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNldF9tb2RlXywgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJhc3Rlcl9jbGFzc18gKSAgICAgICAgICAgICAgICAgICAgXAotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBGVF9SZW5kZXJlcl9DbGFzcyAgY2xhc3NfID0gICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0RFRklORV9ST09UX01PRFVMRSggZmxhZ3NfLCAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV8sICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV8sICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbl8sICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZXNfLCAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlXywgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF8sICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZV8sICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2ludGVyZmFjZV8gKSAgXAotICAgIGdseXBoX2Zvcm1hdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJlbmRlcl9nbHlwaF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRyYW5zZm9ybV9nbHlwaF8sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldF9nbHlwaF9jYm94XywgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNldF9tb2RlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJhc3Rlcl9jbGFzc18gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFQ0xBUkVfUkVOREVSRVIoIGNsYXNzXyApICBGVF9ERUNMQVJFX01PRFVMRSggY2xhc3NfICkKLQotI2RlZmluZSBGVF9ERUZJTkVfUkVOREVSRVIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBmbGFnc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB2ZXJzaW9uXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJlcXVpcmVzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW50ZXJmYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbml0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X2ludGVyZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnbHlwaF9mb3JtYXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJlbmRlcl9nbHlwaF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgdHJhbnNmb3JtX2dseXBoXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfZ2x5cGhfY2JveF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNldF9tb2RlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgcmFzdGVyX2NsYXNzXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9EZXN0cm95X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgIGxpYnJhcnksICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTW9kdWxlX0NsYXNzKiAgY2xhenogKSAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1JlbmRlcmVyX0NsYXNzKiAgcmNsYXp6ID0gKEZUX1JlbmRlcmVyX0NsYXNzKiljbGF6ejsgICAgICBcCi0gICAgRlRfTWVtb3J5ICAgICAgICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhc3NfICMjIF9waWNfZnJlZSggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIHJjbGF6eiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRfRlJFRSggcmNsYXp6ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfQ3JlYXRlX0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICBsaWJyYXJ5LCAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTW9kdWxlX0NsYXNzKiogIG91dHB1dF9jbGFzcyApICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9SZW5kZXJlcl9DbGFzcyogIGNsYXp6ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0Vycm9yICAgICAgICAgICAgZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICAgICAgICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBGVF9BTExPQyggY2xhenosIHNpemVvZiAoICpjbGF6eiApICkgKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZXJyb3IgPSBjbGFzc18gIyMgX3BpY19pbml0KCBsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIGVycm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVF9GUkVFKCBjbGF6eiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9ERUZJTkVfUk9PVF9NT0RVTEUoIGZsYWdzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZXNfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfaW50ZXJmYWNlXyApICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nbHlwaF9mb3JtYXQgICAgPSBnbHlwaF9mb3JtYXRfOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cmVuZGVyX2dseXBoICAgID0gcmVuZGVyX2dseXBoXzsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT50cmFuc2Zvcm1fZ2x5cGggPSB0cmFuc2Zvcm1fZ2x5cGhfOyAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9nbHlwaF9jYm94ICA9IGdldF9nbHlwaF9jYm94XzsgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+c2V0X21vZGUgICAgICAgID0gc2V0X21vZGVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnJhc3Rlcl9jbGFzcyAgICA9IHJhc3Rlcl9jbGFzc187ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICpvdXRwdXRfY2xhc3MgPSAoRlRfTW9kdWxlX0NsYXNzKiljbGF6ejsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0KLSAgLyogUElDIHN1cHBvcnQgbWFjcm9zIGZvciBmdG1vZGFwaS5oICoqLwotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01vZHVsZV9DcmVhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBjcmVhdGUgKGFsbG9jYXRlKSBhIG5ldyBtb2R1bGUgY2xhc3Mgb2JqZWN0LiAgICAqLwotICAvKiAgICBUaGUgb2JqZWN0J3MgbWVtYmVycyBhcmUgaW5pdGlhbGl6ZWQsIGJ1dCB0aGUgbW9kdWxlIGl0c2VsZiBpcyAgICAgKi8KLSAgLyogICAgbm90LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBtZW1vcnkgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dHB1dF9jbGFzcyA6OiBJbml0aWFsaXplZCB3aXRoIHRoZSBuZXdseSBhbGxvY2F0ZWQgY2xhc3MuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX01vZHVsZV9DcmVhdG9yKSggRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX01vZHVsZV9DbGFzcyoqICBvdXRwdXRfY2xhc3MgKTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Nb2R1bGVfRGVzdHJveWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gZGVzdHJveSAoZGVhbGxvY2F0ZSkgYSBtb2R1bGUgY2xhc3Mgb2JqZWN0LiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgOjogQSBoYW5kbGUgdG8gdGhlIG1lbW9yeSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2xhenogIDo6IE1vZHVsZSBjbGFzcyB0byBkZXN0cm95LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9Nb2R1bGVfRGVzdHJveWVyKSggRlRfTWVtb3J5ICAgICAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Nb2R1bGVfQ2xhc3MqICBjbGF6eiApOwotCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFQ0xBUkVfTU9EVUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZWQgdG8gY3JlYXRlIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBhICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Nb2R1bGVfQ2xhc3Mgc3RydWN0IGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9ERUZJTkVfTU9EVUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2VkIHRvIGluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgYW4gRlRfTW9kdWxlX0NsYXNzIHN0cnVjdC4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgZGVmaW5lZCBhIGBjcmVhdGUnIGZ1bnRpb24gbmVlZHMgdG8gICAqLwotICAvKiAgICBiZSBjYWxsZWQgd2l0aCBhIHBvaW50ZXIgd2hlcmUgdGhlIGFsbG9jYXRlZCBzdHJ1Y3R1cmUgaXMgICAgICAgICAgKi8KLSAgLyogICAgcmV0dXJuZWQuICBBbmQgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkIGEgYGRlc3Ryb3knIGZ1bmN0aW9uICAgICovCi0gIC8qICAgIG5lZWRzIHRvIGJlIGNhbGxlZCB0byByZWxlYXNlIHRoYXQgYWxsb2NhdGlvbi4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBgZmNpbml0LmMnIChmdF9jcmVhdGVfZGVmYXVsdF9tb2R1bGVfY2xhc3NlcykgYWxyZWFkeSBjb250YWlucyAgICAgKi8KLSAgLyogICAgYSBtZWNoYW5pc20gdG8gY2FsbCB0aGVzZSBmdW5jdGlvbnMgZm9yIHRoZSBkZWZhdWx0IG1vZHVsZXMgICAgICAgICovCi0gIC8qICAgIGRlc2NyaWJlZCBpbiBgZnRtb2R1bGUuaCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90aWNlIHRoYXQgdGhlIGNyZWF0ZWQgYGNyZWF0ZScgYW5kIGBkZXN0cm95JyBmdW5jdGlvbnMgY2FsbCAgICAgICovCi0gIC8qICAgIGBwaWNfaW5pdCcgYW5kIGBwaWNfZnJlZScgdG8gYWxsb3cgeW91IHRvIG1hbnVhbGx5IGFsbG9jYXRlIGFuZCAgICAqLwotICAvKiAgICBpbml0aWFsaXplIGFueSBhZGRpdGlvbmFsIGdsb2JhbCBkYXRhLCBsaWtlIGEgbW9kdWxlIHNwZWNpZmljICAgICAgKi8KLSAgLyogICAgaW50ZXJmYWNlLCBhbmQgcHV0IHRoZW0gaW4gdGhlIGdsb2JhbCBwaWMgY29udGFpbmVyIGRlZmluZWQgaW4gICAgICovCi0gIC8qICAgIGBmdHBpYy5oJy4gIElmIHlvdSBkb24ndCBuZWVkIHRoZW0ganVzdCBpbXBsZW1lbnQgdGhlIGZ1bmN0aW9ucyBhcyAqLwotICAvKiAgICBlbXB0eSB0byByZXNvbHZlIHRoZSBsaW5rIGVycm9yLiAgQWxzbyB0aGUgYHBpY19pbml0JyBhbmQgICAgICAgICAgKi8KLSAgLyogICAgYHBpY19mcmVlJyBmdW5jdGlvbnMgc2hvdWxkIGJlIGRlY2xhcmVkIGluIGBwaWMuaCcsIHRvIGJlIHJlZmVycmVkICovCi0gIC8qICAgIGJ5IHRoZSBtb2R1bGUgZGVmaW5pdGlvbiBjYWxsaW5nIGBGVF9ERUZJTkVfTU9EVUxFJyBpbiB0aGUgICAgICAgICAqLwotICAvKiAgICBmb2xsb3dpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgbm90IGRlZmluZWQgdGhlIHN0cnVjdCB3aWxsIGJlICAgICAgICAqLwotICAvKiAgICBhbGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZSAob3IgdGhlIHNjb3BlIHdoZXJlIHRoZSBtYWNybyAgICAgICAgKi8KLSAgLyogICAgaXMgdXNlZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfREVGSU5FX1JPT1RfTU9EVUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlZCB0byBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIGFuIEZUX01vZHVsZV9DbGFzcyBzdHJ1Y3QgaW5zaWRlICovCi0gIC8qICAgIGFub3RoZXIgc3RydWN0IHRoYXQgY29udGFpbnMgaXQgb3IgaW4gYSBmdW5jdGlvbiB0aGF0IGluaXRpYWxpemVzICAqLwotICAvKiAgICB0aGF0IGNvbnRhaW5pbmcgc3RydWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVDTEFSRV9NT0RVTEUoIGNsYXNzXyApICBcCi0gIEZUX0NBTExCQUNLX1RBQkxFICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBGVF9Nb2R1bGVfQ2xhc3MgIGNsYXNzXzsKLQotI2RlZmluZSBGVF9ERUZJTkVfUk9PVF9NT0RVTEUoICBcCi0gICAgICAgICAgZmxhZ3NfLCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzaXplXywgICAgICAgICAgICAgICAgXAotICAgICAgICAgIG5hbWVfLCAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgdmVyc2lvbl8sICAgICAgICAgICAgIFwKLSAgICAgICAgICByZXF1aXJlc18sICAgICAgICAgICAgXAotICAgICAgICAgIGludGVyZmFjZV8sICAgICAgICAgICBcCi0gICAgICAgICAgaW5pdF8sICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lXywgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9pbnRlcmZhY2VfICkgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmbGFnc18sICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBuYW1lXywgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHZlcnNpb25fLCAgICAgICAgICAgICAgICAgICBcCi0gICAgcmVxdWlyZXNfLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludGVyZmFjZV8sICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbml0XywgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X2ludGVyZmFjZV8sICAgICAgICAgICAgIFwKLSAgfSwKLQotI2RlZmluZSBGVF9ERUZJTkVfTU9EVUxFKCAgICAgICAgIFwKLSAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZmxhZ3NfLCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBuYW1lXywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgdmVyc2lvbl8sICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJlcXVpcmVzXywgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbnRlcmZhY2VfLCAgICAgICAgICAgICBcCi0gICAgICAgICAgaW5pdF8sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfaW50ZXJmYWNlXyApICAgICAgICBcCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRiAgICAgICAgICAgXAotICBjb25zdCBGVF9Nb2R1bGVfQ2xhc3MgY2xhc3NfID0gIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmxhZ3NfLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHZlcnNpb25fLCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXF1aXJlc18sICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludGVyZmFjZV8sICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfaW50ZXJmYWNlXywgICAgICAgICAgICAgICBcCi0gIH07Ci0KLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUNMQVJFX01PRFVMRSggY2xhc3NfICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9DcmVhdGVfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgIGxpYnJhcnksICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTW9kdWxlX0NsYXNzKiogIG91dHB1dF9jbGFzcyApOyAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9EZXN0cm95X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgIGxpYnJhcnksICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01vZHVsZV9DbGFzcyogIGNsYXp6ICk7Ci0KLSNkZWZpbmUgRlRfREVGSU5FX1JPT1RfTU9EVUxFKCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZmxhZ3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBuYW1lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgdmVyc2lvbl8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJlcXVpcmVzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbnRlcmZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfaW50ZXJmYWNlXyApICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnJvb3QubW9kdWxlX2ZsYWdzICAgICA9IGZsYWdzXzsgICAgICAgICAgXAotICAgIGNsYXp6LT5yb290Lm1vZHVsZV9zaXplICAgICAgPSBzaXplXzsgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cm9vdC5tb2R1bGVfbmFtZSAgICAgID0gbmFtZV87ICAgICAgICAgICBcCi0gICAgY2xhenotPnJvb3QubW9kdWxlX3ZlcnNpb24gICA9IHZlcnNpb25fOyAgICAgICAgXAotICAgIGNsYXp6LT5yb290Lm1vZHVsZV9yZXF1aXJlcyAgPSByZXF1aXJlc187ICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnJvb3QubW9kdWxlX2ludGVyZmFjZSA9IGludGVyZmFjZV87ICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cm9vdC5tb2R1bGVfaW5pdCAgICAgID0gaW5pdF87ICAgICAgICAgICBcCi0gICAgY2xhenotPnJvb3QubW9kdWxlX2RvbmUgICAgICA9IGRvbmVfOyAgICAgICAgICAgXAotICAgIGNsYXp6LT5yb290LmdldF9pbnRlcmZhY2UgICAgPSBnZXRfaW50ZXJmYWNlXzsKLQotI2RlZmluZSBGVF9ERUZJTkVfTU9EVUxFKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBmbGFnc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB2ZXJzaW9uXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJlcXVpcmVzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW50ZXJmYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbml0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X2ludGVyZmFjZV8gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9EZXN0cm95X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgIGxpYnJhcnksICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTW9kdWxlX0NsYXNzKiAgY2xhenogKSAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXNzXyAjIyBfcGljX2ZyZWUoIGxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBjbGF6eiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0NyZWF0ZV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgbGlicmFyeSwgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01vZHVsZV9DbGFzcyoqICBvdXRwdXRfY2xhc3MgKSAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICAgICAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9Nb2R1bGVfQ2xhc3MqICBjbGF6eiAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0Vycm9yICAgICAgICAgIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggRlRfQUxMT0MoIGNsYXp6LCBzaXplb2YgKCAqY2xhenogKSApICkgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlcnJvciA9IGNsYXNzXyAjIyBfcGljX2luaXQoIGxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggZXJyb3IgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmV0dXJuIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5tb2R1bGVfZmxhZ3MgICAgID0gZmxhZ3NfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPm1vZHVsZV9zaXplICAgICAgPSBzaXplXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bW9kdWxlX25hbWUgICAgICA9IG5hbWVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5tb2R1bGVfdmVyc2lvbiAgID0gdmVyc2lvbl87ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPm1vZHVsZV9yZXF1aXJlcyAgPSByZXF1aXJlc187ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5tb2R1bGVfaW50ZXJmYWNlID0gaW50ZXJmYWNlXzsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bW9kdWxlX2luaXQgICAgICA9IGluaXRfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5tb2R1bGVfZG9uZSAgICAgID0gZG9uZV87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9pbnRlcmZhY2UgICAgPSBnZXRfaW50ZXJmYWNlXzsgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICpvdXRwdXRfY2xhc3MgPSBjbGF6ejsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRPQkpTX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9mdHBpYy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9mdHBpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODVjZTdhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvZnRwaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0cGljLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyAoZGVjbGFyYXRpb24pLiAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOSwgMjAxMiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgTW9kdWxlcyB0aGF0IG9yZGluYXJpbHkgaGF2ZSBjb25zdCBnbG9iYWwgZGF0YSB0aGF0IG5lZWQgYWRkcmVzcyAgICAgKi8KLSAgLyogIGNhbiBpbnN0ZWFkIGRlZmluZSBwb2ludGVycyBoZXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRQSUNfSF9fCi0jZGVmaW5lIF9fRlRQSUNfSF9fCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9QSUNfQ29udGFpbmVyXwotICB7Ci0gICAgLyogcGljIGNvbnRhaW5lcnMgZm9yIGJhc2UgKi8KLSAgICB2b2lkKiAgYmFzZTsKLQotICAgIC8qIHBpYyBjb250YWluZXJzIGZvciBtb2R1bGVzICovCi0gICAgdm9pZCogIGF1dG9maXQ7Ci0gICAgdm9pZCogIGNmZjsKLSAgICB2b2lkKiAgcHNoaW50ZXI7Ci0gICAgdm9pZCogIHBzbmFtZXM7Ci0gICAgdm9pZCogIHJhc3RlcjsKLSAgICB2b2lkKiAgc2ZudDsKLSAgICB2b2lkKiAgc21vb3RoOwotICAgIHZvaWQqICB0cnVldHlwZTsKLQotICB9IEZUX1BJQ19Db250YWluZXI7Ci0KLQotICAvKiBJbml0aWFsaXplIHRoZSB2YXJpb3VzIGZ1bmN0aW9uIHRhYmxlcywgc3RydWN0cywgZXRjLiAqLwotICAvKiBzdG9yZWQgaW4gdGhlIGNvbnRhaW5lci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIGZ0X3BpY19jb250YWluZXJfaW5pdCggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0KLSAgLyogRGVzdHJveSB0aGUgY29udGVudHMgb2YgdGhlIGNvbnRhaW5lci4gKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIGZ0X3BpY19jb250YWluZXJfZGVzdHJveSggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotIC8qICovCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRQSUNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL2Z0cmZvcmsuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvZnRyZm9yay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzUwY2JlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvZnRyZm9yay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0cmZvcmsuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBFbWJlZGRlZCByZXNvdXJjZSBmb3JrcyBhY2Nlc3NvciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNCwgMjAwNiwgMjAwNywgMjAxMiwgMjAxMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTWFzYXRha2UgWUFNQVRPIGFuZCBSZWRoYXQgSy5LLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBEZXZlbG9wbWVudCBvZiB0aGUgY29kZSBpbiB0aGlzIGZpbGUgaXMgc3VwcG9ydCBvZiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogSW5mb3JtYXRpb24tdGVjaG5vbG9neSBQcm9tb3Rpb24gQWdlbmN5LCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUUkZPUktfSF9fCi0jZGVmaW5lIF9fRlRSRk9SS19IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyogTnVtYmVyIG9mIGd1ZXNzaW5nIHJ1bGVzIHN1cHBvcnRlZCBpbiBgRlRfUmFjY2Vzc19HdWVzcycuICAgICAgICAgICAgKi8KLSAgLyogRG9uJ3QgZm9yZ2V0IHRvIGluY3JlbWVudCB0aGUgbnVtYmVyIGlmIHlvdSBhZGQgYSBuZXcgZ3Vlc3NpbmcgcnVsZS4gKi8KLSNkZWZpbmUgRlRfUkFDQ0VTU19OX1JVTEVTICA5Ci0KLQotICAvKiBBIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIHJlZmVyZW5jZSBpbiBhIHJlc291cmNlIGJ5IGl0cyByZXNvdXJjZSBJRCAqLwotICAvKiBhbmQgaW50ZXJuYWwgb2Zmc2V0LiAgVGhlIGBQT1NUJyByZXNvdXJjZSBleHBlY3RzIHRvIGJlIGNvbmNhdGVuYXRlZCAqLwotICAvKiBieSB0aGUgb3JkZXIgb2YgcmVzb3VyY2UgSURzIGluc3RlYWQgb2YgaXRzIGFwcGVhcmFuY2UgaW4gdGhlIGZpbGUuICAqLwotCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9SRm9ya19SZWZfCi0gIHsKLSAgICBGVF9VU2hvcnQgIHJlc19pZDsKLSAgICBGVF9VTG9uZyAgIG9mZnNldDsKLQotICB9IEZUX1JGb3JrX1JlZjsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fR1VFU1NJTkdfRU1CRURERURfUkZPUksKLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKmZ0X3JhY2Nlc3NfZ3Vlc3NfZnVuYykoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAqKnJlc3VsdF9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApOwotCi0gIHR5cGVkZWYgZW51bSAgRlRfUkZvcmtfUnVsZV8gewotICAgIEZUX1JGb3JrX1J1bGVfaW52YWxpZCA9IC0yLAotICAgIEZUX1JGb3JrX1J1bGVfdWtub3duLCAvKiAtMSAqLwotICAgIEZUX1JGb3JrX1J1bGVfYXBwbGVfZG91YmxlLAotICAgIEZUX1JGb3JrX1J1bGVfYXBwbGVfc2luZ2xlLAotICAgIEZUX1JGb3JrX1J1bGVfZGFyd2luX3Vmc19leHBvcnQsCi0gICAgRlRfUkZvcmtfUnVsZV9kYXJ3aW5fbmV3dmZzLAotICAgIEZUX1JGb3JrX1J1bGVfZGFyd2luX2hmc3BsdXMsCi0gICAgRlRfUkZvcmtfUnVsZV92ZmF0LAotICAgIEZUX1JGb3JrX1J1bGVfbGludXhfY2FwLAotICAgIEZUX1JGb3JrX1J1bGVfbGludXhfZG91YmxlLAotICAgIEZUX1JGb3JrX1J1bGVfbGludXhfbmV0YXRhbGsKLSAgfSBGVF9SRm9ya19SdWxlOwotCi0gIC8qIEZvciBmYXN0IHRyYW5zbGF0aW9uIGJldHdlZW4gcnVsZSBpbmRleCBhbmQgcnVsZSB0eXBlLAotICAgKiB0aGUgbWFjcm9zIEZUX1JGT1JLX3h4eCBzaG91bGQgYmUga2VwdCBjb25zaXN0ZW50IHdpdGgKLSAgICogdGhlIHJhY2Nlc3NfZ3Vlc3NfZnVuY3MgdGFibGUKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0IGZ0X3JhY2Nlc3NfZ3Vlc3NfcmVjXyB7Ci0gICAgZnRfcmFjY2Vzc19ndWVzc19mdW5jICBmdW5jOwotICAgIEZUX1JGb3JrX1J1bGUgICAgICAgICAgdHlwZTsKLSAgfSBmdF9yYWNjZXNzX2d1ZXNzX3JlYzsKLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0gIC8qIHRoaXMgYXJyYXkgaXMgYSBzdG9yYWdlIGluIG5vbi1QSUMgbW9kZSwgc28gOyBpcyBuZWVkZWQgaW4gRU5EICovCi0jZGVmaW5lIENPTlNUX0ZUX1JGT1JLX1JVTEVfQVJSQVlfQkVHSU4oIG5hbWUsIHR5cGUgKSAgXAotICAgICAgICAgIGNvbnN0IHR5cGUgbmFtZVtdID0gewotI2RlZmluZSBDT05TVF9GVF9SRk9SS19SVUxFX0FSUkFZX0VOVFJZKCBmdW5jX3N1ZmZpeCwgdHlwZV9zdWZmaXggKSAgXAotICAgICAgICAgIHsgcmFjY2Vzc19ndWVzc18gIyMgZnVuY19zdWZmaXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfUkZvcmtfUnVsZV8gIyMgdHlwZV9zdWZmaXggfSwKLSNkZWZpbmUgQ09OU1RfRlRfUkZPUktfUlVMRV9BUlJBWV9FTkQgIH07Ci0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSAgLyogdGhpcyBhcnJheSBpcyBhIGZ1bmN0aW9uIGluIFBJQyBtb2RlLCBzbyBubyA7IGlzIG5lZWRlZCBpbiBFTkQgKi8KLSNkZWZpbmUgQ09OU1RfRlRfUkZPUktfUlVMRV9BUlJBWV9CRUdJTiggbmFtZSwgdHlwZSApICBcCi0gICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0luaXRfVGFibGVfICMjIG5hbWUoIHR5cGUqICBzdG9yYWdlICkgICAgIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB0eXBlKiAgbG9jYWwgPSBzdG9yYWdlOyAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBpbnQgIGkgPSAwOwotI2RlZmluZSBDT05TVF9GVF9SRk9SS19SVUxFX0FSUkFZX0VOVFJZKCBmdW5jX3N1ZmZpeCwgdHlwZV9zdWZmaXggKSAgXAotICAgICAgICAgIGxvY2FsW2ldLmZ1bmMgPSByYWNjZXNzX2d1ZXNzXyAjIyBmdW5jX3N1ZmZpeDsgICAgICAgICAgICAgXAotICAgICAgICAgIGxvY2FsW2ldLnR5cGUgPSBGVF9SRm9ya19SdWxlXyAjIyB0eXBlX3N1ZmZpeDsgICAgICAgICAgICAgXAotICAgICAgICAgIGkrKzsKLSNkZWZpbmUgQ09OU1RfRlRfUkZPUktfUlVMRV9BUlJBWV9FTkQgIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX0dVRVNTSU5HX0VNQkVEREVEX1JGT1JLICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYWNjZXNzX0d1ZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHdWVzcyBhIGZpbGUgbmFtZSBhbmQgb2Zmc2V0IHdoZXJlIHRoZSBhY3R1YWwgcmVzb3VyY2UgZm9yayBpcyAgICAgKi8KLSAgLyogICAgc3RvcmVkLiAgVGhlIG1hY3JvIEZUX1JBQ0NFU1NfTl9SVUxFUyBob2xkcyB0aGUgbnVtYmVyIG9mICAgICAgICAgICovCi0gIC8qICAgIGd1ZXNzaW5nIHJ1bGVzOyAgdGhlIGd1ZXNzZWQgcmVzdWx0IGZvciB0aGUgTnRoIHJ1bGUgaXMgICAgICAgICAgICAqLwotICAvKiAgICByZXByZXNlbnRlZCBhcyBhIHRyaXBsZXQ6IGEgbmV3IGZpbGUgbmFtZSAobmV3X25hbWVzW05dKSwgYSBmaWxlICAgKi8KLSAgLyogICAgb2Zmc2V0IChvZmZzZXRzW05dKSwgYW5kIGFuIGVycm9yIGNvZGUgKGVycm9yc1tOXSkuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSBGcmVlVHlwZSBsaWJyYXJ5IGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSBmaWxlIHN0cmVhbSBjb250YWluaW5nIHRoZSByZXNvdXJjZSBmb3JrLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmFzZV9uYW1lIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIChiYXNlKSBmaWxlIG5hbWUgb2YgdGhlIHJlc291cmNlIGZvcmsgdXNlZCBmb3Igc29tZSAgICAgICAgICAqLwotICAvKiAgICAgIGd1ZXNzaW5nIHJ1bGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuZXdfbmFtZXMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBbiBhcnJheSBvZiBndWVzc2VkIGZpbGUgbmFtZXMgaW4gd2hpY2ggdGhlIHJlc291cmNlIGZvcmtzIG1heSAgICovCi0gIC8qICAgICAgZXhpc3QuICBJZiBgbmV3X25hbWVzW05dJyBpcyBOVUxMLCB0aGUgZ3Vlc3NlZCBmaWxlIG5hbWUgaXMgICAgICAqLwotICAvKiAgICAgIGVxdWFsIHRvIGBiYXNlX25hbWUnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG9mZnNldHMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEFuIGFycmF5IG9mIGd1ZXNzZWQgZmlsZSBvZmZzZXRzLiAgYG9mZnNldHNbTl0nIGhvbGRzIHRoZSBmaWxlICAgKi8KLSAgLyogICAgICBvZmZzZXQgb2YgdGhlIHBvc3NpYmxlIHN0YXJ0IG9mIHRoZSByZXNvdXJjZSBmb3JrIGluIGZpbGUgICAgICAgICovCi0gIC8qICAgICAgYG5ld19uYW1lc1tOXScuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZXJyb3JzIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQW4gYXJyYXkgb2YgRnJlZVR5cGUgZXJyb3IgY29kZXMuICBgZXJyb3JzW05dJyBpcyB0aGUgZXJyb3IgICAgICAqLwotICAvKiAgICAgIGNvZGUgb2YgTnRoIGd1ZXNzaW5nIHJ1bGUgZnVuY3Rpb24uICBJZiBgZXJyb3JzW05dJyBpcyBub3QgICAgICAgKi8KLSAgLyogICAgICBGVF9FcnJfT2ssIGBuZXdfbmFtZXNbTl0nIGFuZCBgb2Zmc2V0c1tOXScgYXJlIG1lYW5pbmdsZXNzLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfUmFjY2Vzc19HdWVzcyggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBjaGFyKiAgICAgICBiYXNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgIGNoYXIqKiAgICAgIG5ld19uYW1lcywKLSAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogICAgb2Zmc2V0cywKLSAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IqICAgZXJyb3JzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYWNjZXNzX0dldF9IZWFkZXJJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHZXQgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGhlYWRlciBvZiByZXNvdXJjZSBmb3JrLiAgVGhlICAgICAgICAgKi8KLSAgLyogICAgaW5mb3JtYXRpb24gaW5jbHVkZXMgdGhlIGZpbGUgb2Zmc2V0IHdoZXJlIHRoZSByZXNvdXJjZSBtYXAgICAgICAgICovCi0gIC8qICAgIHN0YXJ0cywgYW5kIHRoZSBmaWxlIG9mZnNldCB3aGVyZSB0aGUgcmVzb3VyY2UgZGF0YSBzdGFydHMuICAgICAgICAqLwotICAvKiAgICBgRlRfUmFjY2Vzc19HZXRfRGF0YU9mZnNldHMnIHJlcXVpcmVzIHRoZXNlIHR3byBkYXRhLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIEZyZWVUeXBlIGxpYnJhcnkgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIGZpbGUgc3RyZWFtIGNvbnRhaW5pbmcgdGhlIHJlc291cmNlIGZvcmsuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZm9ya19vZmZzZXQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZmlsZSBvZmZzZXQgd2hlcmUgdGhlIHJlc291cmNlIGZvcmsgc3RhcnRzLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWFwX29mZnNldCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGZpbGUgb2Zmc2V0IHdoZXJlIHRoZSByZXNvdXJjZSBtYXAgc3RhcnRzLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmRhdGFfcG9zIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGZpbGUgb2Zmc2V0IHdoZXJlIHRoZSByZXNvdXJjZSBkYXRhIHN0YXJ0cy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICBGVF9FcnJfT2sgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9SYWNjZXNzX0dldF9IZWFkZXJJbmZvKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgIHJmb3JrX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqbWFwX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmRhdGFfcG9zICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYWNjZXNzX0dldF9EYXRhT2Zmc2V0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHZXQgdGhlIGRhdGEgb2Zmc2V0cyBmb3IgYSB0YWcgaW4gYSByZXNvdXJjZSBmb3JrLiAgT2Zmc2V0cyBhcmUgICAgKi8KLSAgLyogICAgc3RvcmVkIGluIGFuIGFycmF5IGJlY2F1c2UsIGluIHNvbWUgY2FzZXMsIHJlc291cmNlcyBpbiBhIHJlc291cmNlICovCi0gIC8qICAgIGZvcmsgaGF2ZSB0aGUgc2FtZSB0YWcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgRnJlZVR5cGUgbGlicmFyeSBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgZmlsZSBzdHJlYW0gY29udGFpbmluZyB0aGUgcmVzb3VyY2UgZm9yay4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hcF9vZmZzZXQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBmaWxlIG9mZnNldCB3aGVyZSB0aGUgcmVzb3VyY2UgbWFwIHN0YXJ0cy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJkYXRhX3BvcyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBmaWxlIG9mZnNldCB3aGVyZSB0aGUgcmVzb3VyY2UgZGF0YSBzdGFydHMuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhZyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSByZXNvdXJjZSB0YWcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNvcnRfYnlfcmVzX2lkIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgQm9vbGVhbiB0byBzb3J0IHRoZSBmcmFnbWVudGVkIHJlc291cmNlIGJ5IHRoZWlyIGlkcy4gICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZnJhZ21lbnRlZCByZXNvdXJjZXMgZm9yIGBQT1NUJyByZXNvdXJjZSBzaG91bGQgYmUgc29ydGVkICAgICovCi0gIC8qICAgICAgdG8gcmVzdG9yZSBUeXBlMSBmb250IHByb3Blcmx5LiAgRm9yIGBzbmZ0JyByZXNvdXJjZXMsIHNvcnRpbmcgICAqLwotICAvKiAgICAgIG1heSBpbmR1Y2UgYSBkaWZmZXJlbnQgb3JkZXIgb2YgdGhlIGZhY2VzIGluIGNvbXBhcmlzb24gdG8gdGhhdCAgKi8KLSAgLyogICAgICBieSBRdWlja0RyYXcgQVBJLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb2Zmc2V0cyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIHN0cmVhbSBvZmZzZXRzIGZvciB0aGUgcmVzb3VyY2UgZGF0YSBzcGVjaWZpZWQgYnkgYHRhZycuICAgICAqLwotICAvKiAgICAgIFRoaXMgYXJyYXkgaXMgYWxsb2NhdGVkIGJ5IHRoZSBmdW5jdGlvbiwgc28geW91IGhhdmUgdG8gY2FsbCAgICAgKi8KLSAgLyogICAgICBAZnRfbWVtX2ZyZWUgYWZ0ZXIgdXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb3VudCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgbGVuZ3RoIG9mIG9mZnNldHMgYXJyYXkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIEZUX0Vycl9PayBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm9ybWFsbHkgeW91IHNob3VsZCB1c2UgYEZUX1JhY2Nlc3NfR2V0X0hlYWRlckluZm8nIHRvIGdldCB0aGUgICAgICovCi0gIC8qICAgIHZhbHVlIGZvciBgbWFwX29mZnNldCcgYW5kIGByZGF0YV9wb3MnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9SYWNjZXNzX0dldF9EYXRhT2Zmc2V0cyggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgIG1hcF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICByZGF0YV9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICB0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICBzb3J0X2J5X3Jlc19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAqKm9mZnNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpjb3VudCApOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRSRk9SS19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvZnRzZXJ2LmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL2Z0c2Vydi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjAzZWM4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvZnRzZXJ2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzZXJ2LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBzZXJ2aWNlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMDcsIDIwMDksIDIwMTIsIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBFYWNoIG1vZHVsZSBjYW4gZXhwb3J0IG9uZSBvciBtb3JlIGBzZXJ2aWNlcycuICBFYWNoIHNlcnZpY2UgaXMgICAgICAqLwotICAvKiAgaWRlbnRpZmllZCBieSBhIGNvbnN0YW50IHN0cmluZyBhbmQgbW9kZWxlZCBieSBhIHBvaW50ZXI7IHRoZSBsYXR0ZXIgKi8KLSAgLyogIGdlbmVyYWxseSBjb3JyZXNwb25kcyB0byBhIHN0cnVjdHVyZSBjb250YWluaW5nIGZ1bmN0aW9uIHBvaW50ZXJzLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgTm90ZSB0aGF0IGEgc2VydmljZSdzIGRhdGEgY2Fubm90IGJlIGEgbWVyZSBmdW5jdGlvbiBwb2ludGVyIGJlY2F1c2UgKi8KLSAgLyogIGluIEMgaXQgaXMgcG9zc2libGUgdGhhdCBmdW5jdGlvbiBwb2ludGVycyBtaWdodCBiZSBpbXBsZW1lbnRlZCAgICAgICovCi0gIC8qICBkaWZmZXJlbnRseSB0aGFuIGRhdGEgcG9pbnRlcnMgKGUuZy4gNDggYml0cyBpbnN0ZWFkIG9mIDMyKS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUU0VSVl9IX18KLSNkZWZpbmUgX19GVFNFUlZfSF9fCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgLyoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0ZBQ0VfRklORF9TRVJWSUNFCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gbG9vayB1cCBhIHNlcnZpY2UgZnJvbSBhIGZhY2UncyBkcml2ZXIgbW9kdWxlLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgZmFjZSA6OgotICAgKiAgICAgVGhlIHNvdXJjZSBmYWNlIGhhbmRsZS4KLSAgICoKLSAgICogICBpZCA6OgotICAgKiAgICAgQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgc2VydmljZSBhcyBkZWZpbmVkIGluIHRoZSBzZXJ2aWNlJ3MKLSAgICogICAgIGhlYWRlciBmaWxlcyAoZS5nLiBGVF9TRVJWSUNFX0lEX01VTFRJX01BU1RFUlMgd2hpY2ggZXhwYW5kcyB0bwotICAgKiAgICAgYG11bHRpLW1hc3RlcnMnKS4gIEl0IGlzIGF1dG9tYXRpY2FsbHkgcHJlZml4ZWQgd2l0aAotICAgKiAgICAgYEZUX1NFUlZJQ0VfSURfJy4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICBwdHIgOjoKLSAgICogICAgIEEgdmFyaWFibGUgdGhhdCByZWNlaXZlcyB0aGUgc2VydmljZSBwb2ludGVyLiAgV2lsbCBiZSBOVUxMCi0gICAqICAgICBpZiBub3QgZm91bmQuCi0gICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLSNkZWZpbmUgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHB0ciwgaWQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01vZHVsZSAgICBtb2R1bGUgPSBGVF9NT0RVTEUoIEZUX0ZBQ0UoIGZhY2UgKS0+ZHJpdmVyICk7ICAgICAgICAgICAgIFwKLSAgICBGVF9Qb2ludGVyICAgX3RtcF8gID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfUG9pbnRlciogIF9wcHRyXyA9IChGVF9Qb2ludGVyKikmKHB0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBtb2R1bGUtPmNsYXp6LT5nZXRfaW50ZXJmYWNlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgX3RtcF8gPSBtb2R1bGUtPmNsYXp6LT5nZXRfaW50ZXJmYWNlKCBtb2R1bGUsIEZUX1NFUlZJQ0VfSURfICMjIGlkICk7IFwKLSAgICAqX3BwdHJfID0gX3RtcF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0VORF9TVE1OVAotCi0jZWxzZSAvKiAhQysrICovCi0KLSNkZWZpbmUgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHB0ciwgaWQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01vZHVsZSAgIG1vZHVsZSA9IEZUX01PRFVMRSggRlRfRkFDRSggZmFjZSApLT5kcml2ZXIgKTsgICAgICAgICAgICAgIFwKLSAgICBGVF9Qb2ludGVyICBfdG1wXyAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggbW9kdWxlLT5jbGF6ei0+Z2V0X2ludGVyZmFjZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIF90bXBfID0gbW9kdWxlLT5jbGF6ei0+Z2V0X2ludGVyZmFjZSggbW9kdWxlLCBGVF9TRVJWSUNFX0lEXyAjIyBpZCApOyBcCi0gICAgcHRyID0gX3RtcF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FTkRfU1RNTlQKLQotI2VuZGlmIC8qICFDKysgKi8KLQotCi0gIC8qCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9GQUNFX0ZJTkRfR0xPQkFMX1NFUlZJQ0UKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBsb29rIHVwIGEgc2VydmljZSBmcm9tIGFsbCBtb2R1bGVzLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgZmFjZSA6OgotICAgKiAgICAgVGhlIHNvdXJjZSBmYWNlIGhhbmRsZS4KLSAgICoKLSAgICogICBpZCA6OgotICAgKiAgICAgQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgc2VydmljZSBhcyBkZWZpbmVkIGluIHRoZSBzZXJ2aWNlJ3MKLSAgICogICAgIGhlYWRlciBmaWxlcyAoZS5nLiBGVF9TRVJWSUNFX0lEX01VTFRJX01BU1RFUlMgd2hpY2ggZXhwYW5kcyB0bwotICAgKiAgICAgYG11bHRpLW1hc3RlcnMnKS4gIEl0IGlzIGF1dG9tYXRpY2FsbHkgcHJlZml4ZWQgd2l0aAotICAgKiAgICAgYEZUX1NFUlZJQ0VfSURfJy4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICBwdHIgOjoKLSAgICogICAgIEEgdmFyaWFibGUgdGhhdCByZWNlaXZlcyB0aGUgc2VydmljZSBwb2ludGVyLiAgV2lsbCBiZSBOVUxMCi0gICAqICAgICBpZiBub3QgZm91bmQuCi0gICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLSNkZWZpbmUgRlRfRkFDRV9GSU5EX0dMT0JBTF9TRVJWSUNFKCBmYWNlLCBwdHIsIGlkICkgICAgICAgICAgICAgICBcCi0gIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01vZHVsZSAgICBtb2R1bGUgPSBGVF9NT0RVTEUoIEZUX0ZBQ0UoIGZhY2UgKS0+ZHJpdmVyICk7ICAgIFwKLSAgICBGVF9Qb2ludGVyICAgX3RtcF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfUG9pbnRlciogIF9wcHRyXyA9IChGVF9Qb2ludGVyKikmKHB0cik7ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX3RtcF8gPSBmdF9tb2R1bGVfZ2V0X3NlcnZpY2UoIG1vZHVsZSwgRlRfU0VSVklDRV9JRF8gIyMgaWQgKTsgXAotICAgICpfcHB0cl8gPSBfdG1wXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRU5EX1NUTU5UCi0KLSNlbHNlIC8qICFDKysgKi8KLQotI2RlZmluZSBGVF9GQUNFX0ZJTkRfR0xPQkFMX1NFUlZJQ0UoIGZhY2UsIHB0ciwgaWQgKSAgICAgICAgICAgICAgIFwKLSAgRlRfQkVHSU5fU1RNTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTW9kdWxlICAgbW9kdWxlID0gRlRfTU9EVUxFKCBGVF9GQUNFKCBmYWNlICktPmRyaXZlciApOyAgICAgXAotICAgIEZUX1BvaW50ZXIgIF90bXBfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF90bXBfID0gZnRfbW9kdWxlX2dldF9zZXJ2aWNlKCBtb2R1bGUsIEZUX1NFUlZJQ0VfSURfICMjIGlkICk7IFwKLSAgICBwdHIgICA9IF90bXBfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0VORF9TVE1OVAotCi0jZW5kaWYgLyogIUMrKyAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgUyBFIFIgViBJIEMgRSAgIEQgRSBTIEMgUiBJIFAgVCBPIFIgUyAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoKLSAgICogIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGlzIHVzZWQgdG8gX2Rlc2NyaWJlXyBhIGdpdmVuIHNlcnZpY2UKLSAgICogIHRvIHRoZSBsaWJyYXJ5LiAgVGhpcyBpcyB1c2VmdWwgdG8gYnVpbGQgc2ltcGxlIHN0YXRpYyBzZXJ2aWNlIGxpc3RzLgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1NlcnZpY2VEZXNjUmVjXwotICB7Ci0gICAgY29uc3QgY2hhciogIHNlcnZfaWQ7ICAgICAvKiBzZXJ2aWNlIG5hbWUgICAgICAgICAqLwotICAgIGNvbnN0IHZvaWQqICBzZXJ2X2RhdGE7ICAgLyogc2VydmljZSBwb2ludGVyL2RhdGEgKi8KLQotICB9IEZUX1NlcnZpY2VEZXNjUmVjOwotCi0gIHR5cGVkZWYgY29uc3QgRlRfU2VydmljZURlc2NSZWMqICBGVF9TZXJ2aWNlRGVzYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBhcnJheSBvZiBGVF9TZXJ2aWNlRGVzY1JlYyBzdHJ1Y3R1cmVzLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkIGEgYGNyZWF0ZScgZnVuY3Rpb24gbmVlZHMgdG8gICovCi0gIC8qICAgIGJlIGNhbGxlZCB3aXRoIGEgcG9pbnRlciB0byByZXR1cm4gYW4gYWxsb2NhdGVkIGFycmF5LiAgQXMgc29vbiBhcyAqLwotICAvKiAgICBpdCBpcyBubyBsb25nZXIgbmVlZGVkLCBhIGBkZXN0cm95JyBmdW5jdGlvbiBuZWVkcyB0byBiZSBjYWxsZWQgdG8gKi8KLSAgLyogICAgcmVsZWFzZSB0aGF0IGFsbG9jYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIG1hbnVhbGx5IGNhbGxlZCBmcm9tIHRoZSBgcGljX2luaXQnIGFuZCAgKi8KLSAgLyogICAgYHBpY19mcmVlJyBmdW5jdGlvbnMgb2YgeW91ciBtb2R1bGUgKHNlZSBGVF9ERUZJTkVfTU9EVUxFKS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXaGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIG5vdCBkZWZpbmVkIHRoZSBhcnJheSB3aWxsIGJlICAgICAgICAgKi8KLSAgLyogICAgYWxsb2NhdGVkIGluIHRoZSBnbG9iYWwgc2NvcGUgKG9yIHRoZSBzY29wZSB3aGVyZSB0aGUgbWFjcm8gaXMgICAgICovCi0gIC8qICAgIHVzZWQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUMxKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSApICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlRGVzY1JlYyAgY2xhc3NfW10gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBOVUxMLCBOVUxMIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9OwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzIoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8yLCBzZXJ2X2RhdGFfMiApICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlRGVzY1JlYyAgY2xhc3NfW10gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgTlVMTCwgTlVMTCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUMzKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzMsIHNlcnZfZGF0YV8zICkgICAgICAgICAgICAgICAgIFwKLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VEZXNjUmVjICBjbGFzc19bXSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzMsIHNlcnZfZGF0YV8zIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgTlVMTCwgTlVMTCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM0KCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzMsIHNlcnZfZGF0YV8zLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF80LCBzZXJ2X2RhdGFfNCApICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlRGVzY1JlYyAgY2xhc3NfW10gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMyB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfNCwgc2Vydl9kYXRhXzQgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBOVUxMLCBOVUxMIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9OwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzUoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8yLCBzZXJ2X2RhdGFfMiwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMywgc2Vydl9kYXRhXzMsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzQsIHNlcnZfZGF0YV80LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF81LCBzZXJ2X2RhdGFfNSApICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlRGVzY1JlYyAgY2xhc3NfW10gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMyB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfNCwgc2Vydl9kYXRhXzQgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzUsIHNlcnZfZGF0YV81IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgTlVMTCwgTlVMTCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM2KCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzMsIHNlcnZfZGF0YV8zLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF80LCBzZXJ2X2RhdGFfNCwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNSwgc2Vydl9kYXRhXzUsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzYsIHNlcnZfZGF0YV82ICkgICAgICAgICAgICAgICAgIFwKLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VEZXNjUmVjICBjbGFzc19bXSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzMsIHNlcnZfZGF0YV8zIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF80LCBzZXJ2X2RhdGFfNCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfNSwgc2Vydl9kYXRhXzUgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzYsIHNlcnZfZGF0YV82IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgTlVMTCwgTlVMTCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM3KCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzMsIHNlcnZfZGF0YV8zLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF80LCBzZXJ2X2RhdGFfNCwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNSwgc2Vydl9kYXRhXzUsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzYsIHNlcnZfZGF0YV82LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF83LCBzZXJ2X2RhdGFfNyApICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlRGVzY1JlYyAgY2xhc3NfW10gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMyB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfNCwgc2Vydl9kYXRhXzQgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzUsIHNlcnZfZGF0YV81IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF82LCBzZXJ2X2RhdGFfNiB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfNywgc2Vydl9kYXRhXzcgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBOVUxMLCBOVUxMIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzEoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xICkgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Rlc3Ryb3lfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogKSAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBjbGF6eiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRfRlJFRSggY2xhenogKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfQ3JlYXRlX0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyoqICBvdXRwdXRfY2xhc3MgKSAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgICAgICAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggRlRfQUxMT0MoIGNsYXp6LCBzaXplb2YgKCAqY2xhenogKSAqIDIgKSApICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzBdLnNlcnZfaWQgICA9IHNlcnZfaWRfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elswXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMV0uc2Vydl9pZCAgID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzFdLnNlcnZfZGF0YSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKm91dHB1dF9jbGFzcyA9IGNsYXp6OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUMyKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIgKSAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRGVzdHJveV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiApICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIGNsYXp6ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVF9GUkVFKCBjbGF6eiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9DcmVhdGVfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiogIG91dHB1dF9jbGFzcyApICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9FcnJvciAgICAgICAgICAgIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICAgICAgICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBGVF9BTExPQyggY2xhenosIHNpemVvZiAoICpjbGF6eiApICogMyApICkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmV0dXJuIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMF0uc2Vydl9pZCAgID0gc2Vydl9pZF8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzBdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsxXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMV0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzJdLnNlcnZfaWQgICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsyXS5zZXJ2X2RhdGEgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICpvdXRwdXRfY2xhc3MgPSBjbGF6ejsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIEZUX0Vycl9PazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDMyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMyApICAgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9EZXN0cm95X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICkgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggY2xhenogKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0NyZWF0ZV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqKiAgb3V0cHV0X2NsYXNzICkgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0Vycm9yICAgICAgICAgICAgZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIEZUX0FMTE9DKCBjbGF6eiwgc2l6ZW9mICggKmNsYXp6ICkgKiA0ICkgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elswXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMF0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzFdLnNlcnZfaWQgICA9IHNlcnZfaWRfMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsxXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMl0uc2Vydl9pZCAgID0gc2Vydl9pZF8zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzJdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elszXS5zZXJ2X2lkICAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbM10uc2Vydl9kYXRhID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAqb3V0cHV0X2NsYXNzID0gY2xheno7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBGVF9FcnJfT2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzQoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8yLCBzZXJ2X2RhdGFfMiwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMywgc2Vydl9kYXRhXzMsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzQsIHNlcnZfZGF0YV80ICkgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Rlc3Ryb3lfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogKSAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBjbGF6eiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRfRlJFRSggY2xhenogKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfQ3JlYXRlX0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyoqICBvdXRwdXRfY2xhc3MgKSAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgICAgICAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggRlRfQUxMT0MoIGNsYXp6LCBzaXplb2YgKCAqY2xhenogKSAqIDUgKSApICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzBdLnNlcnZfaWQgICA9IHNlcnZfaWRfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elswXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMV0uc2Vydl9pZCAgID0gc2Vydl9pZF8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzFdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsyXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMl0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzNdLnNlcnZfaWQgICA9IHNlcnZfaWRfNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elszXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNF0uc2Vydl9pZCAgID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzRdLnNlcnZfZGF0YSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKm91dHB1dF9jbGFzcyA9IGNsYXp6OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM1KCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzMsIHNlcnZfZGF0YV8zLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF80LCBzZXJ2X2RhdGFfNCwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNSwgc2Vydl9kYXRhXzUgKSAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRGVzdHJveV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiApICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIGNsYXp6ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVF9GUkVFKCBjbGF6eiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9DcmVhdGVfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiogIG91dHB1dF9jbGFzcyApICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9FcnJvciAgICAgICAgICAgIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICAgICAgICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBGVF9BTExPQyggY2xhenosIHNpemVvZiAoICpjbGF6eiApICogNiApICkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmV0dXJuIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMF0uc2Vydl9pZCAgID0gc2Vydl9pZF8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzBdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsxXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMV0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzJdLnNlcnZfaWQgICA9IHNlcnZfaWRfMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsyXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbM10uc2Vydl9pZCAgID0gc2Vydl9pZF80OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzNdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV80OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els0XS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNF0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzVdLnNlcnZfaWQgICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els1XS5zZXJ2X2RhdGEgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICpvdXRwdXRfY2xhc3MgPSBjbGF6ejsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIEZUX0Vycl9PazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNiggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNCwgc2Vydl9kYXRhXzQsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzUsIHNlcnZfZGF0YV81LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF82LCBzZXJ2X2RhdGFfNiApICAgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9EZXN0cm95X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICkgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggY2xhenogKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0NyZWF0ZV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqKiAgb3V0cHV0X2NsYXNzKSAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0Vycm9yICAgICAgICAgICAgZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIEZUX0FMTE9DKCBjbGF6eiwgc2l6ZW9mICggKmNsYXp6ICkgKiA3ICkgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elswXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMF0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzFdLnNlcnZfaWQgICA9IHNlcnZfaWRfMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsxXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMl0uc2Vydl9pZCAgID0gc2Vydl9pZF8zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzJdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elszXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbM10uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzRdLnNlcnZfaWQgICA9IHNlcnZfaWRfNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els0XS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNV0uc2Vydl9pZCAgID0gc2Vydl9pZF82OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzVdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV82OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els2XS5zZXJ2X2lkICAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNl0uc2Vydl9kYXRhID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAqb3V0cHV0X2NsYXNzID0gY2xheno7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBGVF9FcnJfT2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzcoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8yLCBzZXJ2X2RhdGFfMiwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMywgc2Vydl9kYXRhXzMsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzQsIHNlcnZfZGF0YV80LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF81LCBzZXJ2X2RhdGFfNSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNiwgc2Vydl9kYXRhXzYsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzcsIHNlcnZfZGF0YV83ICkgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Rlc3Ryb3lfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogKSAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBjbGF6eiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRfRlJFRSggY2xhenogKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfQ3JlYXRlX0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyoqICBvdXRwdXRfY2xhc3MpICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgICAgICAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggRlRfQUxMT0MoIGNsYXp6LCBzaXplb2YgKCAqY2xhenogKSAqIDggKSApICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzBdLnNlcnZfaWQgICA9IHNlcnZfaWRfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elswXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMV0uc2Vydl9pZCAgID0gc2Vydl9pZF8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzFdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsyXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMl0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzNdLnNlcnZfaWQgICA9IHNlcnZfaWRfNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elszXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNF0uc2Vydl9pZCAgID0gc2Vydl9pZF81OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzRdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV81OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els1XS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNV0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzZdLnNlcnZfaWQgICA9IHNlcnZfaWRfNzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els2XS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfNzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbN10uc2Vydl9pZCAgID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzddLnNlcnZfZGF0YSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKm91dHB1dF9jbGFzcyA9IGNsYXp6OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLQotICAvKgotICAgKiAgUGFyc2UgYSBsaXN0IG9mIEZUX1NlcnZpY2VEZXNjUmVjIGRlc2NyaXB0b3JzIGFuZCBsb29rIGZvcgotICAgKiAgYSBzcGVjaWZpYyBzZXJ2aWNlIGJ5IElELiAgTm90ZSB0aGF0IHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlCi0gICAqICBhcnJheSBtdXN0IGJlIHsgTlVMTCwgTlVMTCB9LCBhbmQgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkCi0gICAqICByZXR1cm4gTlVMTCBpZiB0aGUgc2VydmljZSBpc24ndCBhdmFpbGFibGUuCi0gICAqCi0gICAqICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGJ5IG1vZHVsZXMgdG8gaW1wbGVtZW50IHRoZWlyCi0gICAqICBgZ2V0X3NlcnZpY2UnIG1ldGhvZC4KLSAgICovCi0gIEZUX0JBU0UoIEZUX1BvaW50ZXIgKQotICBmdF9zZXJ2aWNlX2xpc3RfbG9va3VwKCBGVF9TZXJ2aWNlRGVzYyAgc2VydmljZV9kZXNjcmlwdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICAgIHNlcnZpY2VfaWQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICBTIEUgUiBWIEkgQyBFIFMgICBDIEEgQyBIIEUgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qCi0gICAqICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHN0b3JlIGEgY2FjaGUgZm9yIHNldmVyYWwgZnJlcXVlbnRseSB1c2VkCi0gICAqICBzZXJ2aWNlcy4gIEl0IGlzIHRoZSB0eXBlIG9mIGBmYWNlLT5pbnRlcm5hbC0+c2VydmljZXMnLiAgWW91Ci0gICAqICBzaG91bGQgb25seSB1c2UgRlRfRkFDRV9MT09LVVBfU0VSVklDRSB0byBhY2Nlc3MgaXQuCi0gICAqCi0gICAqICBBbGwgZmllbGRzIHNob3VsZCBoYXZlIHRoZSB0eXBlIEZUX1BvaW50ZXIgdG8gcmVsYXggY29tcGlsYXRpb24KLSAgICogIGRlcGVuZGVuY2llcy4gIFdlIGFzc3VtZSB0aGUgZGV2ZWxvcGVyIGlzbid0IGNvbXBsZXRlbHkgc3R1cGlkLgotICAgKgotICAgKiAgRWFjaCBmaWVsZCBtdXN0IGJlIG5hbWVkIGBzZXJ2aWNlX1hYWFgnIHdoZXJlIGBYWFgnIGNvcnJlc3BvbmRzIHRvCi0gICAqICB0aGUgY29ycmVjdCBGVF9TRVJWSUNFX0lEX1hYWFggbWFjcm8uICBTZWUgdGhlIGRlZmluaXRpb24gb2YKLSAgICogIEZUX0ZBQ0VfTE9PS1VQX1NFUlZJQ0UgYmVsb3cgaG93IHRoaXMgaXMgaW1wbGVtZW50ZWQuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfU2VydmljZUNhY2hlUmVjXwotICB7Ci0gICAgRlRfUG9pbnRlciAgc2VydmljZV9QT1NUU0NSSVBUX0ZPTlRfTkFNRTsKLSAgICBGVF9Qb2ludGVyICBzZXJ2aWNlX01VTFRJX01BU1RFUlM7Ci0gICAgRlRfUG9pbnRlciAgc2VydmljZV9HTFlQSF9ESUNUOwotICAgIEZUX1BvaW50ZXIgIHNlcnZpY2VfUEZSX01FVFJJQ1M7Ci0gICAgRlRfUG9pbnRlciAgc2VydmljZV9XSU5GTlQ7Ci0KLSAgfSBGVF9TZXJ2aWNlQ2FjaGVSZWMsICpGVF9TZXJ2aWNlQ2FjaGU7Ci0KLQotICAvKgotICAgKiAgQSBtYWdpYyBudW1iZXIgdXNlZCB3aXRoaW4gdGhlIHNlcnZpY2VzIGNhY2hlLgotICAgKi8KLQotICAvKiBlbnN1cmUgdGhhdCB2YWx1ZSBgMScgaGFzIHRoZSBzYW1lIHdpZHRoIGFzIGEgcG9pbnRlciAqLwotI2RlZmluZSBGVF9TRVJWSUNFX1VOQVZBSUxBQkxFICAoKEZUX1BvaW50ZXIpfihGVF9QdHJEaXN0KTEpCi0KLQotICAvKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfRkFDRV9MT09LVVBfU0VSVklDRQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhpcyBtYWNybyBpcyB1c2VkIHRvIGxvb2t1cCBhIHNlcnZpY2UgZnJvbSBhIGZhY2UncyBkcml2ZXIgbW9kdWxlCi0gICAqICAgdXNpbmcgaXRzIGNhY2hlLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgZmFjZTo6Ci0gICAqICAgICBUaGUgc291cmNlIGZhY2UgaGFuZGxlIGNvbnRhaW5pbmcgdGhlIGNhY2hlLgotICAgKgotICAgKiAgIGZpZWxkIDo6Ci0gICAqICAgICBUaGUgZmllbGQgbmFtZSBpbiB0aGUgY2FjaGUuCi0gICAqCi0gICAqICAgaWQgOjoKLSAgICogICAgIFRoZSBzZXJ2aWNlIElELgotICAgKgotICAgKiBAb3V0cHV0OgotICAgKiAgIHB0ciA6OgotICAgKiAgICAgQSB2YXJpYWJsZSByZWNlaXZpbmcgdGhlIHNlcnZpY2UgZGF0YS4gIE5VTEwgaWYgbm90IGF2YWlsYWJsZS4KLSAgICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotI2RlZmluZSBGVF9GQUNFX0xPT0tVUF9TRVJWSUNFKCBmYWNlLCBwdHIsIGlkICkgICAgICAgICAgICAgICAgXAotICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1BvaW50ZXIgICBzdmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1BvaW50ZXIqICBQcHRyID0gKEZUX1BvaW50ZXIqKSYocHRyKTsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHN2YyA9IEZUX0ZBQ0UoIGZhY2UgKS0+aW50ZXJuYWwtPnNlcnZpY2VzLiBzZXJ2aWNlXyAjIyBpZDsgXAotICAgIGlmICggc3ZjID09IEZUX1NFUlZJQ0VfVU5BVkFJTEFCTEUgKSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgc3ZjID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVsc2UgaWYgKCBzdmMgPT0gTlVMTCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHN2YywgaWQgKTsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRfRkFDRSggZmFjZSApLT5pbnRlcm5hbC0+c2VydmljZXMuIHNlcnZpY2VfICMjIGlkID0gICAgXAotICAgICAgICAoRlRfUG9pbnRlcikoIHN2YyAhPSBOVUxMID8gc3ZjICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlRfU0VSVklDRV9VTkFWQUlMQUJMRSApOyAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICpQcHRyID0gc3ZjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FTkRfU1RNTlQKLQotI2Vsc2UgLyogIUMrKyAqLwotCi0jZGVmaW5lIEZUX0ZBQ0VfTE9PS1VQX1NFUlZJQ0UoIGZhY2UsIHB0ciwgaWQgKSAgICAgICAgICAgICAgICBcCi0gIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfUG9pbnRlciAgc3ZjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3ZjID0gRlRfRkFDRSggZmFjZSApLT5pbnRlcm5hbC0+c2VydmljZXMuIHNlcnZpY2VfICMjIGlkOyBcCi0gICAgaWYgKCBzdmMgPT0gRlRfU0VSVklDRV9VTkFWQUlMQUJMRSApICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBzdmMgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZSBpZiAoIHN2YyA9PSBOVUxMICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVF9GQUNFX0ZJTkRfU0VSVklDRSggZmFjZSwgc3ZjLCBpZCApOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVF9GQUNFKCBmYWNlICktPmludGVybmFsLT5zZXJ2aWNlcy4gc2VydmljZV8gIyMgaWQgPSAgICBcCi0gICAgICAgIChGVF9Qb2ludGVyKSggc3ZjICE9IE5VTEwgPyBzdmMgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGVF9TRVJWSUNFX1VOQVZBSUxBQkxFICk7ICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHRyID0gc3ZjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0VORF9TVE1OVAotCi0jZW5kaWYgLyogIUMrKyAqLwotCi0gIC8qCi0gICAqICBBIG1hY3JvIHVzZWQgdG8gZGVmaW5lIG5ldyBzZXJ2aWNlIHN0cnVjdHVyZSB0eXBlcy4KLSAgICovCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0UoIG5hbWUgKSAgICAgICAgICAgIFwKLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfU2VydmljZV8gIyMgbmFtZSAjIyBSZWNfIFwKLSAgICBGVF9TZXJ2aWNlXyAjIyBuYW1lICMjIFJlYyA7ICAgICAgICAgICAgIFwKLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfU2VydmljZV8gIyMgbmFtZSAjIyBSZWNfIFwKLSAgICBjb25zdCAqIEZUX1NlcnZpY2VfICMjIG5hbWUgOyAgICAgICAgICAgIFwKLSAgc3RydWN0IEZUX1NlcnZpY2VfICMjIG5hbWUgIyMgUmVjXwotCi0gIC8qICovCi0KLSAgLyoKLSAgICogIFRoZSBoZWFkZXIgZmlsZXMgY29udGFpbmluZyB0aGUgc2VydmljZXMuCi0gICAqLwotCi0jZGVmaW5lIEZUX1NFUlZJQ0VfQkRGX0ggICAgICAgICAgICAgICAgPGludGVybmFsL3NlcnZpY2VzL3N2YmRmLmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfQ0lEX0ggICAgICAgICAgICAgICAgPGludGVybmFsL3NlcnZpY2VzL3N2Y2lkLmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfR0xZUEhfRElDVF9IICAgICAgICAgPGludGVybmFsL3NlcnZpY2VzL3N2Z2xkaWN0Lmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfR1hfVkFMSURBVEVfSCAgICAgICAgPGludGVybmFsL3NlcnZpY2VzL3N2Z3h2YWwuaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9LRVJOSU5HX0ggICAgICAgICAgICA8aW50ZXJuYWwvc2VydmljZXMvc3ZrZXJuLmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfTVVMVElQTEVfTUFTVEVSU19IICAgPGludGVybmFsL3NlcnZpY2VzL3N2bW0uaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9PUEVOVFlQRV9WQUxJREFURV9IICA8aW50ZXJuYWwvc2VydmljZXMvc3ZvdHZhbC5oPgotI2RlZmluZSBGVF9TRVJWSUNFX1BGUl9IICAgICAgICAgICAgICAgIDxpbnRlcm5hbC9zZXJ2aWNlcy9zdnBmci5oPgotI2RlZmluZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSCAgIDxpbnRlcm5hbC9zZXJ2aWNlcy9zdnBzY21hcC5oPgotI2RlZmluZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfSU5GT19IICAgIDxpbnRlcm5hbC9zZXJ2aWNlcy9zdnBzaW5mby5oPgotI2RlZmluZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfTkFNRV9IICAgIDxpbnRlcm5hbC9zZXJ2aWNlcy9zdnBvc3RubS5oPgotI2RlZmluZSBGVF9TRVJWSUNFX1BST1BFUlRJRVNfSCAgICAgICAgIDxpbnRlcm5hbC9zZXJ2aWNlcy9zdnByb3AuaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9TRk5UX0ggICAgICAgICAgICAgICA8aW50ZXJuYWwvc2VydmljZXMvc3ZzZm50Lmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfVFJVRVRZUEVfRU5HSU5FX0ggICAgPGludGVybmFsL3NlcnZpY2VzL3N2dHRlbmcuaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9UVF9DTUFQX0ggICAgICAgICAgICA8aW50ZXJuYWwvc2VydmljZXMvc3Z0dGNtYXAuaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9XSU5GTlRfSCAgICAgICAgICAgICA8aW50ZXJuYWwvc2VydmljZXMvc3Z3aW5mbnQuaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9YRlJFRTg2X05BTUVfSCAgICAgICA8aW50ZXJuYWwvc2VydmljZXMvc3Z4Zjg2bm0uaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9UUlVFVFlQRV9HTFlGX0ggICAgICA8aW50ZXJuYWwvc2VydmljZXMvc3Z0dGdseWYuaD4KLQotIC8qICovCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRTRVJWX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9mdHN0cmVhbS5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9mdHN0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjYxODU4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvZnRzdHJlYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDUzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHN0cmVhbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgU3RyZWFtIGhhbmRsaW5nIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMiwgMjAwNC0yMDA2LCAyMDExLCAyMDEzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVFNUUkVBTV9IX18KLSNkZWZpbmUgX19GVFNUUkVBTV9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX1NZU1RFTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qIGZvcm1hdCBvZiBhbiA4LWJpdCBmcmFtZV9vcCB2YWx1ZTogICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIGJpdCAgNzY1NDMyMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgeHh4eHh4ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIHMgaXMgc2V0IHRvIDEgaWYgdGhlIHZhbHVlIGlzIHNpZ25lZC4gICAgICAgICovCi0gIC8qIGUgaXMgc2V0IHRvIDEgaWYgdGhlIHZhbHVlIGlzIGxpdHRsZS1lbmRpYW4uICovCi0gIC8qIHh4eCBpcyBhIGNvbW1hbmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgRlRfRlJBTUVfT1BfU0hJRlQgICAgICAgICAyCi0jZGVmaW5lIEZUX0ZSQU1FX09QX1NJR05FRCAgICAgICAgMQotI2RlZmluZSBGVF9GUkFNRV9PUF9MSVRUTEUgICAgICAgIDIKLSNkZWZpbmUgRlRfRlJBTUVfT1BfQ09NTUFORCggeCApICAoIHggPj4gRlRfRlJBTUVfT1BfU0hJRlQgKQotCi0jZGVmaW5lIEZUX01BS0VfRlJBTUVfT1AoIGNvbW1hbmQsIGxpdHRsZSwgc2lnbiApIFwKLSAgICAgICAgICAoICggY29tbWFuZCA8PCBGVF9GUkFNRV9PUF9TSElGVCApIHwgKCBsaXR0bGUgPDwgMSApIHwgc2lnbiApCi0KLSNkZWZpbmUgRlRfRlJBTUVfT1BfRU5EICAgIDAKLSNkZWZpbmUgRlRfRlJBTUVfT1BfU1RBUlQgIDEgIC8qIHN0YXJ0IGEgbmV3IGZyYW1lICAgICAqLwotI2RlZmluZSBGVF9GUkFNRV9PUF9CWVRFICAgMiAgLyogcmVhZCAxLWJ5dGUgdmFsdWUgICAgICovCi0jZGVmaW5lIEZUX0ZSQU1FX09QX1NIT1JUICAzICAvKiByZWFkIDItYnl0ZSB2YWx1ZSAgICAgKi8KLSNkZWZpbmUgRlRfRlJBTUVfT1BfTE9ORyAgIDQgIC8qIHJlYWQgNC1ieXRlIHZhbHVlICAgICAqLwotI2RlZmluZSBGVF9GUkFNRV9PUF9PRkYzICAgNSAgLyogcmVhZCAzLWJ5dGUgdmFsdWUgICAgICovCi0jZGVmaW5lIEZUX0ZSQU1FX09QX0JZVEVTICA2ICAvKiByZWFkIGEgYnl0ZXMgc2VxdWVuY2UgKi8KLQotCi0gIHR5cGVkZWYgZW51bSAgRlRfRnJhbWVfT3BfCi0gIHsKLSAgICBmdF9mcmFtZV9lbmQgICAgICAgPSAwLAotICAgIGZ0X2ZyYW1lX3N0YXJ0ICAgICA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX1NUQVJULCAwLCAwICksCi0KLSAgICBmdF9mcmFtZV9ieXRlICAgICAgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9CWVRFLCAgMCwgMCApLAotICAgIGZ0X2ZyYW1lX3NjaGFyICAgICA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX0JZVEUsICAwLCAxICksCi0KLSAgICBmdF9mcmFtZV91c2hvcnRfYmUgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9TSE9SVCwgMCwgMCApLAotICAgIGZ0X2ZyYW1lX3Nob3J0X2JlICA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX1NIT1JULCAwLCAxICksCi0gICAgZnRfZnJhbWVfdXNob3J0X2xlID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfU0hPUlQsIDEsIDAgKSwKLSAgICBmdF9mcmFtZV9zaG9ydF9sZSAgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9TSE9SVCwgMSwgMSApLAotCi0gICAgZnRfZnJhbWVfdWxvbmdfYmUgID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfTE9ORywgMCwgMCApLAotICAgIGZ0X2ZyYW1lX2xvbmdfYmUgICA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX0xPTkcsIDAsIDEgKSwKLSAgICBmdF9mcmFtZV91bG9uZ19sZSAgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9MT05HLCAxLCAwICksCi0gICAgZnRfZnJhbWVfbG9uZ19sZSAgID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfTE9ORywgMSwgMSApLAotCi0gICAgZnRfZnJhbWVfdW9mZjNfYmUgID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfT0ZGMywgMCwgMCApLAotICAgIGZ0X2ZyYW1lX29mZjNfYmUgICA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX09GRjMsIDAsIDEgKSwKLSAgICBmdF9mcmFtZV91b2ZmM19sZSAgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9PRkYzLCAxLCAwICksCi0gICAgZnRfZnJhbWVfb2ZmM19sZSAgID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfT0ZGMywgMSwgMSApLAotCi0gICAgZnRfZnJhbWVfYnl0ZXMgICAgID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfQllURVMsIDAsIDAgKSwKLSAgICBmdF9mcmFtZV9za2lwICAgICAgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9CWVRFUywgMCwgMSApCi0KLSAgfSBGVF9GcmFtZV9PcDsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9GcmFtZV9GaWVsZF8KLSAgewotICAgIEZUX0J5dGUgICAgdmFsdWU7Ci0gICAgRlRfQnl0ZSAgICBzaXplOwotICAgIEZUX1VTaG9ydCAgb2Zmc2V0OwotCi0gIH0gRlRfRnJhbWVfRmllbGQ7Ci0KLQotICAvKiBDb25zdHJ1Y3QgYW4gRlRfRnJhbWVfRmllbGQgb3V0IG9mIGEgc3RydWN0dXJlIHR5cGUgYW5kIGEgZmllbGQgbmFtZS4gKi8KLSAgLyogVGhlIHN0cnVjdHVyZSB0eXBlIG11c3QgYmUgc2V0IGluIHRoZSBGVF9TVFJVQ1RVUkUgbWFjcm8gYmVmb3JlICAgICAgICovCi0gIC8qIGNhbGxpbmcgdGhlIEZUX0ZSQU1FX1NUQVJUKCkgbWFjcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfRklFTERfU0laRSggZiApIFwKLSAgICAgICAgICAoRlRfQnl0ZSlzaXplb2YgKCAoKEZUX1NUUlVDVFVSRSopMCktPmYgKQotCi0jZGVmaW5lIEZUX0ZJRUxEX1NJWkVfREVMVEEoIGYgKSBcCi0gICAgICAgICAgKEZUX0J5dGUpc2l6ZW9mICggKChGVF9TVFJVQ1RVUkUqKTApLT5mWzBdICkKLQotI2RlZmluZSBGVF9GSUVMRF9PRkZTRVQoIGYgKSBcCi0gICAgICAgICAgKEZUX1VTaG9ydCkoIG9mZnNldG9mKCBGVF9TVFJVQ1RVUkUsIGYgKSApCi0KLSNkZWZpbmUgRlRfRlJBTUVfRklFTEQoIGZyYW1lX29wLCBmaWVsZCApIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGZyYW1lX29wLCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIEZUX0ZJRUxEX1NJWkUoIGZpZWxkICksICAgICAgIFwKLSAgICAgICAgICAgIEZUX0ZJRUxEX09GRlNFVCggZmllbGQgKSAgICAgIFwKLSAgICAgICAgICB9Ci0KLSNkZWZpbmUgRlRfTUFLRV9FTVBUWV9GSUVMRCggZnJhbWVfb3AgKSAgeyBmcmFtZV9vcCwgMCwgMCB9Ci0KLSNkZWZpbmUgRlRfRlJBTUVfU1RBUlQoIHNpemUgKSAgIHsgZnRfZnJhbWVfc3RhcnQsIDAsIHNpemUgfQotI2RlZmluZSBGVF9GUkFNRV9FTkQgICAgICAgICAgICAgeyBmdF9mcmFtZV9lbmQsIDAsIDAgfQotCi0jZGVmaW5lIEZUX0ZSQU1FX0xPTkcoIGYgKSAgICAgICBGVF9GUkFNRV9GSUVMRCggZnRfZnJhbWVfbG9uZ19iZSwgZiApCi0jZGVmaW5lIEZUX0ZSQU1FX1VMT05HKCBmICkgICAgICBGVF9GUkFNRV9GSUVMRCggZnRfZnJhbWVfdWxvbmdfYmUsIGYgKQotI2RlZmluZSBGVF9GUkFNRV9TSE9SVCggZiApICAgICAgRlRfRlJBTUVfRklFTEQoIGZ0X2ZyYW1lX3Nob3J0X2JlLCBmICkKLSNkZWZpbmUgRlRfRlJBTUVfVVNIT1JUKCBmICkgICAgIEZUX0ZSQU1FX0ZJRUxEKCBmdF9mcmFtZV91c2hvcnRfYmUsIGYgKQotI2RlZmluZSBGVF9GUkFNRV9PRkYzKCBmICkgICAgICAgRlRfRlJBTUVfRklFTEQoIGZ0X2ZyYW1lX29mZjNfYmUsIGYgKQotI2RlZmluZSBGVF9GUkFNRV9VT0ZGMyggZiApICAgICAgRlRfRlJBTUVfRklFTEQoIGZ0X2ZyYW1lX3VvZmYzX2JlLCBmICkKLSNkZWZpbmUgRlRfRlJBTUVfQllURSggZiApICAgICAgIEZUX0ZSQU1FX0ZJRUxEKCBmdF9mcmFtZV9ieXRlLCBmICkKLSNkZWZpbmUgRlRfRlJBTUVfQ0hBUiggZiApICAgICAgIEZUX0ZSQU1FX0ZJRUxEKCBmdF9mcmFtZV9zY2hhciwgZiApCi0KLSNkZWZpbmUgRlRfRlJBTUVfTE9OR19MRSggZiApICAgIEZUX0ZSQU1FX0ZJRUxEKCBmdF9mcmFtZV9sb25nX2xlLCBmICkKLSNkZWZpbmUgRlRfRlJBTUVfVUxPTkdfTEUoIGYgKSAgIEZUX0ZSQU1FX0ZJRUxEKCBmdF9mcmFtZV91bG9uZ19sZSwgZiApCi0jZGVmaW5lIEZUX0ZSQU1FX1NIT1JUX0xFKCBmICkgICBGVF9GUkFNRV9GSUVMRCggZnRfZnJhbWVfc2hvcnRfbGUsIGYgKQotI2RlZmluZSBGVF9GUkFNRV9VU0hPUlRfTEUoIGYgKSAgRlRfRlJBTUVfRklFTEQoIGZ0X2ZyYW1lX3VzaG9ydF9sZSwgZiApCi0jZGVmaW5lIEZUX0ZSQU1FX09GRjNfTEUoIGYgKSAgICBGVF9GUkFNRV9GSUVMRCggZnRfZnJhbWVfb2ZmM19sZSwgZiApCi0jZGVmaW5lIEZUX0ZSQU1FX1VPRkYzX0xFKCBmICkgICBGVF9GUkFNRV9GSUVMRCggZnRfZnJhbWVfdW9mZjNfbGUsIGYgKQotCi0jZGVmaW5lIEZUX0ZSQU1FX1NLSVBfTE9ORyAgICAgICB7IGZ0X2ZyYW1lX2xvbmdfYmUsIDAsIDAgfQotI2RlZmluZSBGVF9GUkFNRV9TS0lQX1NIT1JUICAgICAgeyBmdF9mcmFtZV9zaG9ydF9iZSwgMCwgMCB9Ci0jZGVmaW5lIEZUX0ZSQU1FX1NLSVBfQllURSAgICAgICB7IGZ0X2ZyYW1lX2J5dGUsIDAsIDAgfQotCi0jZGVmaW5lIEZUX0ZSQU1FX0JZVEVTKCBmaWVsZCwgY291bnQgKSBcCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBmdF9mcmFtZV9ieXRlcywgICAgICAgICAgICBcCi0gICAgICAgICAgICBjb3VudCwgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBGVF9GSUVMRF9PRkZTRVQoIGZpZWxkICkgICBcCi0gICAgICAgICAgfQotCi0jZGVmaW5lIEZUX0ZSQU1FX1NLSVBfQllURVMoIGNvdW50ICkgIHsgZnRfZnJhbWVfc2tpcCwgY291bnQsIDAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJbnRlZ2VyIGV4dHJhY3Rpb24gbWFjcm9zIC0tIHRoZSBgYnVmZmVyJyBwYXJhbWV0ZXIgbXVzdCBBTFdBWVMgYmUgb2YgKi8KLSAgLyogdHlwZSBgY2hhcionIG9yIGVxdWl2YWxlbnQgKDEtYnl0ZSBlbGVtZW50cykuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIEZUX0JZVEVfKCBwLCBpICkgICggKChjb25zdCBGVF9CeXRlKikocCkpWyhpKV0gKQotCi0jZGVmaW5lIEZUX0lOVDE2KCB4ICkgICAoIChGVF9JbnQxNikoeCkgICkKLSNkZWZpbmUgRlRfVUlOVDE2KCB4ICkgICggKEZUX1VJbnQxNikoeCkgKQotI2RlZmluZSBGVF9JTlQzMiggeCApICAgKCAoRlRfSW50MzIpKHgpICApCi0jZGVmaW5lIEZUX1VJTlQzMiggeCApICAoIChGVF9VSW50MzIpKHgpICkKLQotCi0jZGVmaW5lIEZUX0JZVEVfVTE2KCBwLCBpLCBzICkgICggRlRfVUlOVDE2KCBGVF9CWVRFXyggcCwgaSApICkgPDwgKHMpICkKLSNkZWZpbmUgRlRfQllURV9VMzIoIHAsIGksIHMgKSAgKCBGVF9VSU5UMzIoIEZUX0JZVEVfKCBwLCBpICkgKSA8PCAocykgKQotCi0KLSNkZWZpbmUgRlRfUEVFS19TSE9SVCggcCApICBGVF9JTlQxNiggRlRfQllURV9VMTYoIHAsIDAsIDgpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UxNiggcCwgMSwgMCkgKQotCi0jZGVmaW5lIEZUX1BFRUtfVVNIT1JUKCBwICkgIEZUX1VJTlQxNiggRlRfQllURV9VMTYoIHAsIDAsIDggKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UxNiggcCwgMSwgMCApICkKLQotI2RlZmluZSBGVF9QRUVLX0xPTkcoIHAgKSAgRlRfSU5UMzIoIEZUX0JZVEVfVTMyKCBwLCAwLCAyNCApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAxLCAxNiApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAyLCAgOCApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAzLCAgMCApICkKLQotI2RlZmluZSBGVF9QRUVLX1VMT05HKCBwICkgIEZUX1VJTlQzMiggRlRfQllURV9VMzIoIHAsIDAsIDI0ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMSwgMTYgKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAyLCAgOCApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDMsICAwICkgKQotCi0jZGVmaW5lIEZUX1BFRUtfT0ZGMyggcCApICBGVF9JTlQzMiggRlRfQllURV9VMzIoIHAsIDAsIDE2ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDEsICA4ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDIsICAwICkgKQotCi0jZGVmaW5lIEZUX1BFRUtfVU9GRjMoIHAgKSAgRlRfVUlOVDMyKCBGVF9CWVRFX1UzMiggcCwgMCwgMTYgKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAxLCAgOCApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDIsICAwICkgKQotCi0jZGVmaW5lIEZUX1BFRUtfU0hPUlRfTEUoIHAgKSAgRlRfSU5UMTYoIEZUX0JZVEVfVTE2KCBwLCAxLCA4ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTE2KCBwLCAwLCAwICkgKQotCi0jZGVmaW5lIEZUX1BFRUtfVVNIT1JUX0xFKCBwICkgIEZUX1VJTlQxNiggRlRfQllURV9VMTYoIHAsIDEsIDggKSB8ICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMTYoIHAsIDAsIDAgKSApCi0KLSNkZWZpbmUgRlRfUEVFS19MT05HX0xFKCBwICkgIEZUX0lOVDMyKCBGVF9CWVRFX1UzMiggcCwgMywgMjQgKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMiwgMTYgKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMSwgIDggKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMCwgIDAgKSApCi0KLSNkZWZpbmUgRlRfUEVFS19VTE9OR19MRSggcCApICBGVF9VSU5UMzIoIEZUX0JZVEVfVTMyKCBwLCAzLCAyNCApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDIsIDE2ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMSwgIDggKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAwLCAgMCApICkKLQotI2RlZmluZSBGVF9QRUVLX09GRjNfTEUoIHAgKSAgRlRfSU5UMzIoIEZUX0JZVEVfVTMyKCBwLCAyLCAxNiApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAxLCAgOCApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAwLCAgMCApICkKLQotI2RlZmluZSBGVF9QRUVLX1VPRkYzX0xFKCBwICkgIEZUX1VJTlQzMiggRlRfQllURV9VMzIoIHAsIDIsIDE2ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMSwgIDggKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAwLCAgMCApICkKLQotCi0jZGVmaW5lIEZUX05FWFRfQ0hBUiggYnVmZmVyICkgICAgICAgXAotICAgICAgICAgICggKHNpZ25lZCBjaGFyKSpidWZmZXIrKyApCi0KLSNkZWZpbmUgRlRfTkVYVF9CWVRFKCBidWZmZXIgKSAgICAgICAgIFwKLSAgICAgICAgICAoICh1bnNpZ25lZCBjaGFyKSpidWZmZXIrKyApCi0KLSNkZWZpbmUgRlRfTkVYVF9TSE9SVCggYnVmZmVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIChzaG9ydCkoIGJ1ZmZlciArPSAyLCBGVF9QRUVLX1NIT1JUKCBidWZmZXIgLSAyICkgKSApCi0KLSNkZWZpbmUgRlRfTkVYVF9VU0hPUlQoIGJ1ZmZlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAodW5zaWduZWQgc2hvcnQpKCBidWZmZXIgKz0gMiwgRlRfUEVFS19VU0hPUlQoIGJ1ZmZlciAtIDIgKSApICkKLQotI2RlZmluZSBGVF9ORVhUX09GRjMoIGJ1ZmZlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIChsb25nKSggYnVmZmVyICs9IDMsIEZUX1BFRUtfT0ZGMyggYnVmZmVyIC0gMyApICkgKQotCi0jZGVmaW5lIEZUX05FWFRfVU9GRjMoIGJ1ZmZlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSggYnVmZmVyICs9IDMsIEZUX1BFRUtfVU9GRjMoIGJ1ZmZlciAtIDMgKSApICkKLQotI2RlZmluZSBGVF9ORVhUX0xPTkcoIGJ1ZmZlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIChsb25nKSggYnVmZmVyICs9IDQsIEZUX1BFRUtfTE9ORyggYnVmZmVyIC0gNCApICkgKQotCi0jZGVmaW5lIEZUX05FWFRfVUxPTkcoIGJ1ZmZlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSggYnVmZmVyICs9IDQsIEZUX1BFRUtfVUxPTkcoIGJ1ZmZlciAtIDQgKSApICkKLQotCi0jZGVmaW5lIEZUX05FWFRfU0hPUlRfTEUoIGJ1ZmZlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAoc2hvcnQpKCBidWZmZXIgKz0gMiwgRlRfUEVFS19TSE9SVF9MRSggYnVmZmVyIC0gMiApICkgKQotCi0jZGVmaW5lIEZUX05FWFRfVVNIT1JUX0xFKCBidWZmZXIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKHVuc2lnbmVkIHNob3J0KSggYnVmZmVyICs9IDIsIEZUX1BFRUtfVVNIT1JUX0xFKCBidWZmZXIgLSAyICkgKSApCi0KLSNkZWZpbmUgRlRfTkVYVF9PRkYzX0xFKCBidWZmZXIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAobG9uZykoIGJ1ZmZlciArPSAzLCBGVF9QRUVLX09GRjNfTEUoIGJ1ZmZlciAtIDMgKSApICkKLQotI2RlZmluZSBGVF9ORVhUX1VPRkYzX0xFKCBidWZmZXIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAodW5zaWduZWQgbG9uZykoIGJ1ZmZlciArPSAzLCBGVF9QRUVLX1VPRkYzX0xFKCBidWZmZXIgLSAzICkgKSApCi0KLSNkZWZpbmUgRlRfTkVYVF9MT05HX0xFKCBidWZmZXIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAobG9uZykoIGJ1ZmZlciArPSA0LCBGVF9QRUVLX0xPTkdfTEUoIGJ1ZmZlciAtIDQgKSApICkKLQotI2RlZmluZSBGVF9ORVhUX1VMT05HX0xFKCBidWZmZXIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAodW5zaWduZWQgbG9uZykoIGJ1ZmZlciArPSA0LCBGVF9QRUVLX1VMT05HX0xFKCBidWZmZXIgLSA0ICkgKSApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEVhY2ggR0VUX3h4eHgoKSBtYWNybyB1c2VzIGFuIGltcGxpY2l0IGBzdHJlYW0nIHZhcmlhYmxlLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZiAwCi0jZGVmaW5lIEZUX0dFVF9NQUNSTyggdHlwZSApICAgIEZUX05FWFRfICMjIHR5cGUgKCBzdHJlYW0tPmN1cnNvciApCi0KLSNkZWZpbmUgRlRfR0VUX0NIQVIoKSAgICAgICBGVF9HRVRfTUFDUk8oIENIQVIgKQotI2RlZmluZSBGVF9HRVRfQllURSgpICAgICAgIEZUX0dFVF9NQUNSTyggQllURSApCi0jZGVmaW5lIEZUX0dFVF9TSE9SVCgpICAgICAgRlRfR0VUX01BQ1JPKCBTSE9SVCApCi0jZGVmaW5lIEZUX0dFVF9VU0hPUlQoKSAgICAgRlRfR0VUX01BQ1JPKCBVU0hPUlQgKQotI2RlZmluZSBGVF9HRVRfT0ZGMygpICAgICAgIEZUX0dFVF9NQUNSTyggT0ZGMyApCi0jZGVmaW5lIEZUX0dFVF9VT0ZGMygpICAgICAgRlRfR0VUX01BQ1JPKCBVT0ZGMyApCi0jZGVmaW5lIEZUX0dFVF9MT05HKCkgICAgICAgRlRfR0VUX01BQ1JPKCBMT05HICkKLSNkZWZpbmUgRlRfR0VUX1VMT05HKCkgICAgICBGVF9HRVRfTUFDUk8oIFVMT05HICkKLSNkZWZpbmUgRlRfR0VUX1RBRzQoKSAgICAgICBGVF9HRVRfTUFDUk8oIFVMT05HICkKLQotI2RlZmluZSBGVF9HRVRfU0hPUlRfTEUoKSAgIEZUX0dFVF9NQUNSTyggU0hPUlRfTEUgKQotI2RlZmluZSBGVF9HRVRfVVNIT1JUX0xFKCkgIEZUX0dFVF9NQUNSTyggVVNIT1JUX0xFICkKLSNkZWZpbmUgRlRfR0VUX0xPTkdfTEUoKSAgICBGVF9HRVRfTUFDUk8oIExPTkdfTEUgKQotI2RlZmluZSBGVF9HRVRfVUxPTkdfTEUoKSAgIEZUX0dFVF9NQUNSTyggVUxPTkdfTEUgKQotCi0jZWxzZQotI2RlZmluZSBGVF9HRVRfTUFDUk8oIGZ1bmMsIHR5cGUgKSAgICAgICAgKCAodHlwZSlmdW5jKCBzdHJlYW0gKSApCi0KLSNkZWZpbmUgRlRfR0VUX0NIQVIoKSAgICAgICBGVF9HRVRfTUFDUk8oIEZUX1N0cmVhbV9HZXRDaGFyLCBGVF9DaGFyICkKLSNkZWZpbmUgRlRfR0VUX0JZVEUoKSAgICAgICBGVF9HRVRfTUFDUk8oIEZUX1N0cmVhbV9HZXRDaGFyLCBGVF9CeXRlICkKLSNkZWZpbmUgRlRfR0VUX1NIT1JUKCkgICAgICBGVF9HRVRfTUFDUk8oIEZUX1N0cmVhbV9HZXRVU2hvcnQsIEZUX1Nob3J0ICkKLSNkZWZpbmUgRlRfR0VUX1VTSE9SVCgpICAgICBGVF9HRVRfTUFDUk8oIEZUX1N0cmVhbV9HZXRVU2hvcnQsIEZUX1VTaG9ydCApCi0jZGVmaW5lIEZUX0dFVF9PRkYzKCkgICAgICAgRlRfR0VUX01BQ1JPKCBGVF9TdHJlYW1fR2V0VU9mZnNldCwgRlRfTG9uZyApCi0jZGVmaW5lIEZUX0dFVF9VT0ZGMygpICAgICAgRlRfR0VUX01BQ1JPKCBGVF9TdHJlYW1fR2V0VU9mZnNldCwgRlRfVUxvbmcgKQotI2RlZmluZSBGVF9HRVRfTE9ORygpICAgICAgIEZUX0dFVF9NQUNSTyggRlRfU3RyZWFtX0dldFVMb25nLCBGVF9Mb25nICkKLSNkZWZpbmUgRlRfR0VUX1VMT05HKCkgICAgICBGVF9HRVRfTUFDUk8oIEZUX1N0cmVhbV9HZXRVTG9uZywgRlRfVUxvbmcgKQotI2RlZmluZSBGVF9HRVRfVEFHNCgpICAgICAgIEZUX0dFVF9NQUNSTyggRlRfU3RyZWFtX0dldFVMb25nLCBGVF9VTG9uZyApCi0KLSNkZWZpbmUgRlRfR0VUX1NIT1JUX0xFKCkgICBGVF9HRVRfTUFDUk8oIEZUX1N0cmVhbV9HZXRVU2hvcnRMRSwgRlRfU2hvcnQgKQotI2RlZmluZSBGVF9HRVRfVVNIT1JUX0xFKCkgIEZUX0dFVF9NQUNSTyggRlRfU3RyZWFtX0dldFVTaG9ydExFLCBGVF9VU2hvcnQgKQotI2RlZmluZSBGVF9HRVRfTE9OR19MRSgpICAgIEZUX0dFVF9NQUNSTyggRlRfU3RyZWFtX0dldFVMb25nTEUsIEZUX0xvbmcgKQotI2RlZmluZSBGVF9HRVRfVUxPTkdfTEUoKSAgIEZUX0dFVF9NQUNSTyggRlRfU3RyZWFtX0dldFVMb25nTEUsIEZUX1VMb25nICkKLSNlbmRpZgotCi0jZGVmaW5lIEZUX1JFQURfTUFDUk8oIGZ1bmMsIHR5cGUsIHZhciApICAgICAgICBcCi0gICAgICAgICAgKCB2YXIgPSAodHlwZSlmdW5jKCBzdHJlYW0sICZlcnJvciApLCBcCi0gICAgICAgICAgICBlcnJvciAhPSBGVF9FcnJfT2sgKQotCi0jZGVmaW5lIEZUX1JFQURfQllURSggdmFyICkgICAgICAgRlRfUkVBRF9NQUNSTyggRlRfU3RyZWFtX1JlYWRDaGFyLCBGVF9CeXRlLCB2YXIgKQotI2RlZmluZSBGVF9SRUFEX0NIQVIoIHZhciApICAgICAgIEZUX1JFQURfTUFDUk8oIEZUX1N0cmVhbV9SZWFkQ2hhciwgRlRfQ2hhciwgdmFyICkKLSNkZWZpbmUgRlRfUkVBRF9TSE9SVCggdmFyICkgICAgICBGVF9SRUFEX01BQ1JPKCBGVF9TdHJlYW1fUmVhZFVTaG9ydCwgRlRfU2hvcnQsIHZhciApCi0jZGVmaW5lIEZUX1JFQURfVVNIT1JUKCB2YXIgKSAgICAgRlRfUkVBRF9NQUNSTyggRlRfU3RyZWFtX1JlYWRVU2hvcnQsIEZUX1VTaG9ydCwgdmFyICkKLSNkZWZpbmUgRlRfUkVBRF9PRkYzKCB2YXIgKSAgICAgICBGVF9SRUFEX01BQ1JPKCBGVF9TdHJlYW1fUmVhZFVPZmZzZXQsIEZUX0xvbmcsIHZhciApCi0jZGVmaW5lIEZUX1JFQURfVU9GRjMoIHZhciApICAgICAgRlRfUkVBRF9NQUNSTyggRlRfU3RyZWFtX1JlYWRVT2Zmc2V0LCBGVF9VTG9uZywgdmFyICkKLSNkZWZpbmUgRlRfUkVBRF9MT05HKCB2YXIgKSAgICAgICBGVF9SRUFEX01BQ1JPKCBGVF9TdHJlYW1fUmVhZFVMb25nLCBGVF9Mb25nLCB2YXIgKQotI2RlZmluZSBGVF9SRUFEX1VMT05HKCB2YXIgKSAgICAgIEZUX1JFQURfTUFDUk8oIEZUX1N0cmVhbV9SZWFkVUxvbmcsIEZUX1VMb25nLCB2YXIgKQotCi0jZGVmaW5lIEZUX1JFQURfU0hPUlRfTEUoIHZhciApICAgRlRfUkVBRF9NQUNSTyggRlRfU3RyZWFtX1JlYWRVU2hvcnRMRSwgRlRfU2hvcnQsIHZhciApCi0jZGVmaW5lIEZUX1JFQURfVVNIT1JUX0xFKCB2YXIgKSAgRlRfUkVBRF9NQUNSTyggRlRfU3RyZWFtX1JlYWRVU2hvcnRMRSwgRlRfVVNob3J0LCB2YXIgKQotI2RlZmluZSBGVF9SRUFEX0xPTkdfTEUoIHZhciApICAgIEZUX1JFQURfTUFDUk8oIEZUX1N0cmVhbV9SZWFkVUxvbmdMRSwgRlRfTG9uZywgdmFyICkKLSNkZWZpbmUgRlRfUkVBRF9VTE9OR19MRSggdmFyICkgICBGVF9SRUFEX01BQ1JPKCBGVF9TdHJlYW1fUmVhZFVMb25nTEUsIEZUX1VMb25nLCB2YXIgKQotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9OT19ERUZBVUxUX1NZU1RFTQotCi0gIC8qIGluaXRpYWxpemUgYSBzdHJlYW0gZm9yIHJlYWRpbmcgYSByZWd1bGFyIHN5c3RlbSBzdHJlYW0gKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fT3BlbiggRlRfU3RyZWFtICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBmaWxlcGF0aG5hbWUgKTsKLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fTk9fREVGQVVMVF9TWVNURU0gKi8KLQotCi0gIC8qIGNyZWF0ZSBhIG5ldyAoaW5wdXQpIHN0cmVhbSBmcm9tIGFuIEZUX09wZW5fQXJncyBzdHJ1Y3R1cmUgKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fTmV3KCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICBjb25zdCBGVF9PcGVuX0FyZ3MqICBhcmdzLAotICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICAgICAgICphc3RyZWFtICk7Ci0KLSAgLyogZnJlZSBhIHN0cmVhbSAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfU3RyZWFtX0ZyZWUoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBleHRlcm5hbCApOwotCi0gIC8qIGluaXRpYWxpemUgYSBzdHJlYW0gZm9yIHJlYWRpbmcgaW4tbWVtb3J5IGRhdGEgKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIEZUX1N0cmVhbV9PcGVuTWVtb3J5KCBGVF9TdHJlYW0gICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfQnl0ZSogIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgc2l6ZSApOwotCi0gIC8qIGNsb3NlIGEgc3RyZWFtIChkb2VzIG5vdCBkZXN0cm95IHRoZSBzdHJlYW0gc3RydWN0dXJlKSAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfU3RyZWFtX0Nsb3NlKCBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0KLSAgLyogc2VlayB3aXRoaW4gYSBzdHJlYW0uIHBvc2l0aW9uIGlzIHJlbGF0aXZlIHRvIHN0YXJ0IG9mIHN0cmVhbSAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9TZWVrKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgcG9zICk7Ci0KLSAgLyogc2tpcCBieXRlcyBpbiBhIHN0cmVhbSAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9Ta2lwKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgZGlzdGFuY2UgKTsKLQotICAvKiByZXR1cm4gY3VycmVudCBzdHJlYW0gcG9zaXRpb24gKi8KLSAgRlRfQkFTRSggRlRfTG9uZyApCi0gIEZUX1N0cmVhbV9Qb3MoIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLSAgLyogcmVhZCBieXRlcyBmcm9tIGEgc3RyZWFtIGludG8gYSB1c2VyLWFsbG9jYXRlZCBidWZmZXIsIHJldHVybnMgYW4gKi8KLSAgLyogZXJyb3IgaWYgbm90IGFsbCBieXRlcyBjb3VsZCBiZSByZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fUmVhZCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKTsKLQotICAvKiByZWFkIGJ5dGVzIGZyb20gYSBzdHJlYW0gYXQgYSBnaXZlbiBwb3NpdGlvbiAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9SZWFkQXQoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHBvcywKLSAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKTsKLQotICAvKiB0cnkgdG8gcmVhZCBieXRlcyBhdCB0aGUgZW5kIG9mIGEgc3RyZWFtOyByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzICovCi0gIC8qIHJlYWxseSBhdmFpbGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfVUxvbmcgKQotICBGVF9TdHJlYW1fVHJ5UmVhZCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKTsKLQotICAvKiBFbnRlciBhIGZyYW1lIG9mIGBjb3VudCcgY29uc2VjdXRpdmUgYnl0ZXMgaW4gYSBzdHJlYW0uICBSZXR1cm5zIGFuICovCi0gIC8qIGVycm9yIGlmIHRoZSBmcmFtZSBjb3VsZCBub3QgYmUgcmVhZC9hY2Nlc3NlZC4gIFRoZSBjYWxsZXIgY2FuIHVzZSAgKi8KLSAgLyogdGhlIEZUX1N0cmVhbV9HZXRfWFhYIGZ1bmN0aW9ucyB0byByZXRyaWV2ZSBmcmFtZSBkYXRhIHdpdGhvdXQgICAgICAqLwotICAvKiBlcnJvciBjaGVja3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogWW91IG11c3QgX2Fsd2F5c18gY2FsbCBGVF9TdHJlYW1fRXhpdEZyYW1lKCkgb25jZSB5b3UgaGF2ZSBlbnRlcmVkICAqLwotICAvKiBhIHN0cmVhbSBmcmFtZSEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fRW50ZXJGcmFtZSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGNvdW50ICk7Ci0KLSAgLyogZXhpdCBhIHN0cmVhbSBmcmFtZSAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfU3RyZWFtX0V4aXRGcmFtZSggRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotICAvKiBFeHRyYWN0IGEgc3RyZWFtIGZyYW1lLiAgSWYgdGhlIHN0cmVhbSBpcyBkaXNrLWJhc2VkLCBhIGhlYXAgYmxvY2sgKi8KLSAgLyogaXMgYWxsb2NhdGVkIGFuZCB0aGUgZnJhbWUgYnl0ZXMgYXJlIHJlYWQgaW50byBpdC4gIElmIHRoZSBzdHJlYW0gICovCi0gIC8qIGlzIG1lbW9yeS1iYXNlZCwgdGhpcyBmdW5jdGlvbiBzaW1wbHkgc2V0IGEgcG9pbnRlciB0byB0aGUgZGF0YS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVXNlZnVsIHRvIG9wdGltaXplIGFjY2VzcyB0byBtZW1vcnktYmFzZWQgc3RyZWFtcyB0cmFuc3BhcmVudGx5LiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBbGwgZXh0cmFjdGVkIGZyYW1lcyBtdXN0IGJlIGBmcmVlZCcgd2l0aCBhIGNhbGwgdG8gdGhlIGZ1bmN0aW9uICAgKi8KLSAgLyogRlRfU3RyZWFtX1JlbGVhc2VGcmFtZSgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9FeHRyYWN0RnJhbWUoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogIHBieXRlcyApOwotCi0gIC8qIHJlbGVhc2UgYW4gZXh0cmFjdCBmcmFtZSAoc2VlIEZUX1N0cmVhbV9FeHRyYWN0RnJhbWUpICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9TdHJlYW1fUmVsZWFzZUZyYW1lKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSoqICBwYnl0ZXMgKTsKLQotICAvKiByZWFkIGEgYnl0ZSBmcm9tIGFuIGVudGVyZWQgZnJhbWUgKi8KLSAgRlRfQkFTRSggRlRfQ2hhciApCi0gIEZUX1N0cmVhbV9HZXRDaGFyKCBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0gIC8qIHJlYWQgYSAxNi1iaXQgYmlnLWVuZGlhbiB1bnNpZ25lZCBpbnRlZ2VyIGZyb20gYW4gZW50ZXJlZCBmcmFtZSAqLwotICBGVF9CQVNFKCBGVF9VU2hvcnQgKQotICBGVF9TdHJlYW1fR2V0VVNob3J0KCBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0gIC8qIHJlYWQgYSAyNC1iaXQgYmlnLWVuZGlhbiB1bnNpZ25lZCBpbnRlZ2VyIGZyb20gYW4gZW50ZXJlZCBmcmFtZSAqLwotICBGVF9CQVNFKCBGVF9VTG9uZyApCi0gIEZUX1N0cmVhbV9HZXRVT2Zmc2V0KCBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0gIC8qIHJlYWQgYSAzMi1iaXQgYmlnLWVuZGlhbiB1bnNpZ25lZCBpbnRlZ2VyIGZyb20gYW4gZW50ZXJlZCBmcmFtZSAqLwotICBGVF9CQVNFKCBGVF9VTG9uZyApCi0gIEZUX1N0cmVhbV9HZXRVTG9uZyggRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotICAvKiByZWFkIGEgMTYtYml0IGxpdHRsZS1lbmRpYW4gdW5zaWduZWQgaW50ZWdlciBmcm9tIGFuIGVudGVyZWQgZnJhbWUgKi8KLSAgRlRfQkFTRSggRlRfVVNob3J0ICkKLSAgRlRfU3RyZWFtX0dldFVTaG9ydExFKCBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0gIC8qIHJlYWQgYSAzMi1iaXQgbGl0dGxlLWVuZGlhbiB1bnNpZ25lZCBpbnRlZ2VyIGZyb20gYW4gZW50ZXJlZCBmcmFtZSAqLwotICBGVF9CQVNFKCBGVF9VTG9uZyApCi0gIEZUX1N0cmVhbV9HZXRVTG9uZ0xFKCBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0KLSAgLyogcmVhZCBhIGJ5dGUgZnJvbSBhIHN0cmVhbSAqLwotICBGVF9CQVNFKCBGVF9DaGFyICkKLSAgRlRfU3RyZWFtX1JlYWRDaGFyKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogIGVycm9yICk7Ci0KLSAgLyogcmVhZCBhIDE2LWJpdCBiaWctZW5kaWFuIHVuc2lnbmVkIGludGVnZXIgZnJvbSBhIHN0cmVhbSAqLwotICBGVF9CQVNFKCBGVF9VU2hvcnQgKQotICBGVF9TdHJlYW1fUmVhZFVTaG9ydCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogIGVycm9yICk7Ci0KLSAgLyogcmVhZCBhIDI0LWJpdCBiaWctZW5kaWFuIHVuc2lnbmVkIGludGVnZXIgZnJvbSBhIHN0cmVhbSAqLwotICBGVF9CQVNFKCBGVF9VTG9uZyApCi0gIEZUX1N0cmVhbV9SZWFkVU9mZnNldCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IqICBlcnJvciApOwotCi0gIC8qIHJlYWQgYSAzMi1iaXQgYmlnLWVuZGlhbiBpbnRlZ2VyIGZyb20gYSBzdHJlYW0gKi8KLSAgRlRfQkFTRSggRlRfVUxvbmcgKQotICBGVF9TdHJlYW1fUmVhZFVMb25nKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IqICBlcnJvciApOwotCi0gIC8qIHJlYWQgYSAxNi1iaXQgbGl0dGxlLWVuZGlhbiB1bnNpZ25lZCBpbnRlZ2VyIGZyb20gYSBzdHJlYW0gKi8KLSAgRlRfQkFTRSggRlRfVVNob3J0ICkKLSAgRlRfU3RyZWFtX1JlYWRVU2hvcnRMRSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IgKTsKLQotICAvKiByZWFkIGEgMzItYml0IGxpdHRsZS1lbmRpYW4gdW5zaWduZWQgaW50ZWdlciBmcm9tIGEgc3RyZWFtICovCi0gIEZUX0JBU0UoIEZUX1VMb25nICkKLSAgRlRfU3RyZWFtX1JlYWRVTG9uZ0xFKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogIGVycm9yICk7Ci0KLSAgLyogUmVhZCBhIHN0cnVjdHVyZSBmcm9tIGEgc3RyZWFtLiAgVGhlIHN0cnVjdHVyZSBtdXN0IGJlIGRlc2NyaWJlZCAqLwotICAvKiBieSBhbiBhcnJheSBvZiBGVF9GcmFtZV9GaWVsZCByZWNvcmRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX1JlYWRGaWVsZHMoIEZUX1N0cmVhbSAgICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfRnJhbWVfRmllbGQqICBmaWVsZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSApOwotCi0KLSNkZWZpbmUgRlRfU1RSRUFNX1BPUygpICAgICAgICAgICBcCi0gICAgICAgICAgRlRfU3RyZWFtX1Bvcyggc3RyZWFtICkKLQotI2RlZmluZSBGVF9TVFJFQU1fU0VFSyggcG9zaXRpb24gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfU0VUX0VSUk9SKCBGVF9TdHJlYW1fU2Vlayggc3RyZWFtLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUxvbmcpKHBvc2l0aW9uKSApICkKLQotI2RlZmluZSBGVF9TVFJFQU1fU0tJUCggZGlzdGFuY2UgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9TRVRfRVJST1IoIEZUX1N0cmVhbV9Ta2lwKCBzdHJlYW0sICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKGRpc3RhbmNlKSApICkKLQotI2RlZmluZSBGVF9TVFJFQU1fUkVBRCggYnVmZmVyLCBjb3VudCApICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfU0VUX0VSUk9SKCBGVF9TdHJlYW1fUmVhZCggc3RyZWFtLCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQnl0ZSopKGJ1ZmZlciksICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VTG9uZykoY291bnQpICkgKQotCi0jZGVmaW5lIEZUX1NUUkVBTV9SRUFEX0FUKCBwb3NpdGlvbiwgYnVmZmVyLCBjb3VudCApICAgICAgICAgICAgXAotICAgICAgICAgIEZUX1NFVF9FUlJPUiggRlRfU3RyZWFtX1JlYWRBdCggc3RyZWFtLCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VTG9uZykocG9zaXRpb24pLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQnl0ZSopYnVmZmVyLCAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VMb25nKShjb3VudCkgKSApCi0KLSNkZWZpbmUgRlRfU1RSRUFNX1JFQURfRklFTERTKCBmaWVsZHMsIG9iamVjdCApICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfU0VUX0VSUk9SKCBGVF9TdHJlYW1fUmVhZEZpZWxkcyggc3RyZWFtLCBmaWVsZHMsIG9iamVjdCApICkKLQotCi0jZGVmaW5lIEZUX0ZSQU1FX0VOVEVSKCBzaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX1NFVF9FUlJPUiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIEZUX0RFQlVHX0lOTkVSKCBGVF9TdHJlYW1fRW50ZXJGcmFtZSggc3RyZWFtLCAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VTG9uZykoc2l6ZSkgKSApICkKLQotI2RlZmluZSBGVF9GUkFNRV9FWElUKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9ERUJVR19JTk5FUiggRlRfU3RyZWFtX0V4aXRGcmFtZSggc3RyZWFtICkgKQotCi0jZGVmaW5lIEZUX0ZSQU1FX0VYVFJBQ1QoIHNpemUsIGJ5dGVzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfU0VUX0VSUk9SKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBGVF9ERUJVR19JTk5FUiggRlRfU3RyZWFtX0V4dHJhY3RGcmFtZSggc3RyZWFtLCAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VMb25nKShzaXplKSwgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0J5dGUqKikmKGJ5dGVzKSApICkgKQotCi0jZGVmaW5lIEZUX0ZSQU1FX1JFTEVBU0UoIGJ5dGVzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9ERUJVR19JTk5FUiggRlRfU3RyZWFtX1JlbGVhc2VGcmFtZSggc3RyZWFtLCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQnl0ZSoqKSYoYnl0ZXMpICkgKQotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRTVFJFQU1fSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL2Z0dHJhY2UuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvZnR0cmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTI1M2RiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvZnR0cmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0dHJhY2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcmFjaW5nIGhhbmRsaW5nIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMiwgMjAwNC0yMDA3LCAyMDA5LCAyMDExLTIwMTQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBkZWZpbml0aW9ucyBvZiB0cmFjZSBsZXZlbHMgZm9yIEZyZWVUeXBlIDIgKi8KLQotICAvKiB0aGUgZmlyc3QgbGV2ZWwgbXVzdCBhbHdheXMgYmUgYHRyYWNlX2FueScgKi8KLUZUX1RSQUNFX0RFRiggYW55ICkKLQotICAvKiBiYXNlIGNvbXBvbmVudHMgKi8KLUZUX1RSQUNFX0RFRiggY2FsYyApICAgICAgLyogY2FsY3VsYXRpb25zICAgICAgICAgICAgKGZ0Y2FsYy5jKSAgICovCi1GVF9UUkFDRV9ERUYoIG1lbW9yeSApICAgIC8qIG1lbW9yeSBtYW5hZ2VyICAgICAgICAgIChmdG9ianMuYykgICAqLwotRlRfVFJBQ0VfREVGKCBzdHJlYW0gKSAgICAvKiBzdHJlYW0gbWFuYWdlciAgICAgICAgICAoZnRzdHJlYW0uYykgKi8KLUZUX1RSQUNFX0RFRiggaW8gKSAgICAgICAgLyogaS9vIGludGVyZmFjZSAgICAgICAgICAgKGZ0c3lzdGVtLmMpICovCi1GVF9UUkFDRV9ERUYoIGxpc3QgKSAgICAgIC8qIGxpc3QgbWFuYWdlbWVudCAgICAgICAgIChmdGxpc3QuYykgICAqLwotRlRfVFJBQ0VfREVGKCBpbml0ICkgICAgICAvKiBpbml0aWFsaXphdGlvbiAgICAgICAgICAoZnRpbml0LmMpICAgKi8KLUZUX1RSQUNFX0RFRiggb2JqcyApICAgICAgLyogYmFzZSBvYmplY3RzICAgICAgICAgICAgKGZ0b2Jqcy5jKSAgICovCi1GVF9UUkFDRV9ERUYoIG91dGxpbmUgKSAgIC8qIG91dGxpbmUgbWFuYWdlbWVudCAgICAgIChmdG91dGxuLmMpICAqLwotRlRfVFJBQ0VfREVGKCBnbHlwaCApICAgICAvKiBnbHlwaCBtYW5hZ2VtZW50ICAgICAgICAoZnRnbHlwaC5jKSAgKi8KLUZUX1RSQUNFX0RFRiggZ2xvYWRlciApICAgLyogZ2x5cGggbG9hZGVyICAgICAgICAgICAgKGZ0Z2xvYWRyLmMpICovCi0KLUZUX1RSQUNFX0RFRiggcmFzdGVyICkgICAgLyogbW9ub2Nocm9tZSByYXN0ZXJpemVyICAgKGZ0cmFzdGVyLmMpICovCi1GVF9UUkFDRV9ERUYoIHNtb290aCApICAgIC8qIGFudGktYWxpYXNpbmcgcmFzdGVyICAgIChmdGdyYXlzLmMpICAqLwotRlRfVFJBQ0VfREVGKCBtbSApICAgICAgICAvKiBNTSBpbnRlcmZhY2UgICAgICAgICAgICAoZnRtbS5jKSAgICAgKi8KLUZUX1RSQUNFX0RFRiggcmFjY2VzcyApICAgLyogcmVzb3VyY2UgZm9yayBhY2Nlc3NvciAgKGZ0cmZvcmsuYykgICovCi1GVF9UUkFDRV9ERUYoIHN5bnRoICkgICAgIC8qIGJvbGQvc2xhbnQgc3ludGhlc2l6ZXIgIChmdHN5bnRoLmMpICAqLwotRlRfVFJBQ0VfREVGKCBiaXRtYXAgKSAgICAvKiBiaXRtYXAgY2hlY2tzdW0gICAgICAgICAoZnRvYmpzLmMpICAgKi8KLQotICAvKiBDYWNoZSBzdWItc3lzdGVtICovCi1GVF9UUkFDRV9ERUYoIGNhY2hlICkgICAgIC8qIGNhY2hlIHN1Yi1zeXN0ZW0gICAgICAgIChmdGNhY2hlLmMsIGV0Yy4pICovCi0KLSAgLyogU0ZOVCBkcml2ZXIgY29tcG9uZW50cyAqLwotRlRfVFJBQ0VfREVGKCBzZmRyaXZlciApICAvKiBTRk5UIGZvbnQgZHJpdmVyICAgICAgICAoc2Zkcml2ZXIuYykgKi8KLUZUX1RSQUNFX0RFRiggc2ZvYmpzICkgICAgLyogU0ZOVCBvYmplY3QgaGFuZGxlciAgICAgKHNmb2Jqcy5jKSAgICovCi1GVF9UUkFDRV9ERUYoIHR0Y21hcCApICAgIC8qIGNoYXJtYXAgaGFuZGxlciAgICAgICAgICh0dGNtYXAuYykgICAqLwotRlRfVFJBQ0VfREVGKCB0dGtlcm4gKSAgICAvKiBrZXJuaW5nIGhhbmRsZXIgICAgICAgICAodHRrZXJuLmMpICAgKi8KLUZUX1RSQUNFX0RFRiggdHRsb2FkICkgICAgLyogYmFzaWMgVHJ1ZVR5cGUgdGFibGVzICAgKHR0bG9hZC5jKSAgICovCi1GVF9UUkFDRV9ERUYoIHR0bXR4ICkgICAgIC8qIG1ldHJpY3MtcmVsYXRlZCB0YWJsZXMgICh0dG10eC5jKSAgICAqLwotRlRfVFJBQ0VfREVGKCB0dHBvc3QgKSAgICAvKiBQUyB0YWJsZSBwcm9jZXNzaW5nICAgICAodHRwb3N0LmMpICAgKi8KLUZUX1RSQUNFX0RFRiggdHRzYml0ICkgICAgLyogVHJ1ZVR5cGUgc2JpdCBoYW5kbGluZyAgKHR0c2JpdC5jKSAgICovCi1GVF9UUkFDRV9ERUYoIHR0YmRmICkgICAgIC8qIFRydWVUeXBlIGVtYmVkZGVkIEJERiAgICh0dGJkZi5jKSAgICAqLwotCi0gIC8qIFRydWVUeXBlIGRyaXZlciBjb21wb25lbnRzICovCi1GVF9UUkFDRV9ERUYoIHR0ZHJpdmVyICkgIC8qIFRUIGZvbnQgZHJpdmVyICAgICAgICAgICh0dGRyaXZlci5jKSAqLwotRlRfVFJBQ0VfREVGKCB0dGdsb2FkICkgICAvKiBUVCBnbHlwaCBsb2FkZXIgICAgICAgICAodHRnbG9hZC5jKSAgKi8KLUZUX1RSQUNFX0RFRiggdHRpbnRlcnAgKSAgLyogYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgICAgKHR0aW50ZXJwLmMpICovCi1GVF9UUkFDRV9ERUYoIHR0b2JqcyApICAgIC8qIFRUIG9iamVjdHMgbWFuYWdlciAgICAgICh0dG9ianMuYykgICAqLwotRlRfVFJBQ0VfREVGKCB0dHBsb2FkICkgICAvKiBUVCBkYXRhL3Byb2dyYW0gbG9hZGVyICAodHRwbG9hZC5jKSAgKi8KLUZUX1RSQUNFX0RFRiggdHRneHZhciApICAgLyogVHJ1ZVR5cGUgR1ggdmFyIGhhbmRsZXIgKHR0Z3h2YXIuYykgICovCi0KLSAgLyogVHlwZSAxIGRyaXZlciBjb21wb25lbnRzICovCi1GVF9UUkFDRV9ERUYoIHQxYWZtICkKLUZUX1RSQUNFX0RFRiggdDFkcml2ZXIgKQotRlRfVFJBQ0VfREVGKCB0MWdsb2FkICkKLUZUX1RSQUNFX0RFRiggdDFoaW50ICkKLUZUX1RSQUNFX0RFRiggdDFsb2FkICkKLUZUX1RSQUNFX0RFRiggdDFvYmpzICkKLUZUX1RSQUNFX0RFRiggdDFwYXJzZSApCi0KLSAgLyogUG9zdFNjcmlwdCBoZWxwZXIgbW9kdWxlIGBwc2F1eCcgKi8KLUZUX1RSQUNFX0RFRiggdDFkZWNvZGUgKQotRlRfVFJBQ0VfREVGKCBwc29ianMgKQotRlRfVFJBQ0VfREVGKCBwc2NvbnYgKQotCi0gIC8qIFBvc3RTY3JpcHQgaGludGluZyBtb2R1bGUgYHBzaGludGVyJyAqLwotRlRfVFJBQ0VfREVGKCBwc2hyZWMgKQotRlRfVFJBQ0VfREVGKCBwc2hhbGdvMSApCi1GVF9UUkFDRV9ERUYoIHBzaGFsZ28yICkKLQotICAvKiBUeXBlIDIgZHJpdmVyIGNvbXBvbmVudHMgKi8KLUZUX1RSQUNFX0RFRiggY2ZmZHJpdmVyICkKLUZUX1RSQUNFX0RFRiggY2ZmZ2xvYWQgKQotRlRfVFJBQ0VfREVGKCBjZmZsb2FkICkKLUZUX1RSQUNFX0RFRiggY2Zmb2JqcyApCi1GVF9UUkFDRV9ERUYoIGNmZnBhcnNlICkKLQotRlRfVFJBQ0VfREVGKCBjZjJibHVlcyApCi1GVF9UUkFDRV9ERUYoIGNmMmhpbnRzICkKLUZUX1RSQUNFX0RFRiggY2YyaW50ZXJwICkKLQotICAvKiBUeXBlIDQyIGRyaXZlciBjb21wb25lbnQgKi8KLUZUX1RSQUNFX0RFRiggdDQyICkKLQotICAvKiBDSUQgZHJpdmVyIGNvbXBvbmVudHMgKi8KLUZUX1RSQUNFX0RFRiggY2lkYWZtICkKLUZUX1RSQUNFX0RFRiggY2lkZHJpdmVyICkKLUZUX1RSQUNFX0RFRiggY2lkZ2xvYWQgKQotRlRfVFJBQ0VfREVGKCBjaWRsb2FkICkKLUZUX1RSQUNFX0RFRiggY2lkb2JqcyApCi1GVF9UUkFDRV9ERUYoIGNpZHBhcnNlICkKLQotICAvKiBXaW5kb3dzIGZvbnQgY29tcG9uZW50ICovCi1GVF9UUkFDRV9ERUYoIHdpbmZudCApCi0KLSAgLyogUENGIGZvbnQgY29tcG9uZW50cyAqLwotRlRfVFJBQ0VfREVGKCBwY2Zkcml2ZXIgKQotRlRfVFJBQ0VfREVGKCBwY2ZyZWFkICkKLQotICAvKiBCREYgZm9udCBjb21wb25lbnRzICovCi1GVF9UUkFDRV9ERUYoIGJkZmRyaXZlciApCi1GVF9UUkFDRV9ERUYoIGJkZmxpYiApCi0KLSAgLyogUEZSIGZvbnQgY29tcG9uZW50ICovCi1GVF9UUkFDRV9ERUYoIHBmciApCi0KLSAgLyogT3BlblR5cGUgdmFsaWRhdGlvbiBjb21wb25lbnRzICovCi1GVF9UUkFDRV9ERUYoIG90dm1vZHVsZSApCi1GVF9UUkFDRV9ERUYoIG90dmNvbW1vbiApCi1GVF9UUkFDRV9ERUYoIG90dmJhc2UgKQotRlRfVFJBQ0VfREVGKCBvdHZnZGVmICkKLUZUX1RSQUNFX0RFRiggb3R2Z3BvcyApCi1GVF9UUkFDRV9ERUYoIG90dmdzdWIgKQotRlRfVFJBQ0VfREVGKCBvdHZqc3RmICkKLUZUX1RSQUNFX0RFRiggb3R2bWF0aCApCi0KLSAgLyogVHJ1ZVR5cGVHWC9BQVQgdmFsaWRhdGlvbiBjb21wb25lbnRzICovCi1GVF9UUkFDRV9ERUYoIGd4dm1vZHVsZSApCi1GVF9UUkFDRV9ERUYoIGd4dmNvbW1vbiApCi1GVF9UUkFDRV9ERUYoIGd4dmZlYXQgKQotRlRfVFJBQ0VfREVGKCBneHZtb3J0ICkKLUZUX1RSQUNFX0RFRiggZ3h2bW9yeCApCi1GVF9UUkFDRV9ERUYoIGd4dmJzbG4gKQotRlRfVFJBQ0VfREVGKCBneHZqdXN0ICkKLUZUX1RSQUNFX0RFRiggZ3h2a2VybiApCi1GVF9UUkFDRV9ERUYoIGd4dm9wYmQgKQotRlRfVFJBQ0VfREVGKCBneHZ0cmFrICkKLUZUX1RSQUNFX0RFRiggZ3h2cHJvcCApCi1GVF9UUkFDRV9ERUYoIGd4dmxjYXIgKQotCi0gIC8qIGF1dG9maXQgY29tcG9uZW50cyAqLwotRlRfVFJBQ0VfREVGKCBhZm1vZHVsZSApCi1GVF9UUkFDRV9ERUYoIGFmaGludHMgKQotRlRfVFJBQ0VfREVGKCBhZmNqayApCi1GVF9UUkFDRV9ERUYoIGFmbGF0aW4gKQotRlRfVFJBQ0VfREVGKCBhZmxhdGluMiApCi1GVF9UUkFDRV9ERUYoIGFmd2FycCApCi1GVF9UUkFDRV9ERUYoIGFmaGFyZmJ1enogKQotRlRfVFJBQ0VfREVGKCBhZmdsb2JhbCApCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9mdHZhbGlkLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL2Z0dmFsaWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJhZDAzNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL2Z0dmFsaWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHZhbGlkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgdmFsaWRhdGlvbiBzdXBwb3J0IChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQsIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVFZBTElEX0hfXwotI2RlZmluZSBfX0ZUVkFMSURfSF9fCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfQ09ORklHX1NUQU5EQVJEX0xJQlJBUllfSCAgIC8qIGZvciBmdF9zZXRqbXAgYW5kIGZ0X2xvbmdqbXAgKi8KLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgIFYgQSBMIEkgRCBBIFQgSSBPIE4gICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiBoYW5kbGUgdG8gYSB2YWxpZGF0aW9uIG9iamVjdCAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9WYWxpZGF0b3JSZWNfIHZvbGF0aWxlKiAgRlRfVmFsaWRhdG9yOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVyZSBhcmUgdGhyZWUgZGlzdGluY3QgdmFsaWRhdGlvbiBsZXZlbHMgZGVmaW5lZCBoZXJlOiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZUX1ZBTElEQVRFX0RFRkFVTFQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEEgdGFibGUgdGhhdCBwYXNzZXMgdGhpcyB2YWxpZGF0aW9uIGxldmVsIGNhbiBiZSB1c2VkIHJlbGlhYmx5IGJ5ICAgKi8KLSAgLyogICBGcmVlVHlwZS4gIEl0IGdlbmVyYWxseSBtZWFucyB0aGF0IGFsbCBvZmZzZXRzIGhhdmUgYmVlbiBjaGVja2VkIHRvICovCi0gIC8qICAgcHJldmVudCBvdXQtb2YtYm91bmQgcmVhZHMsIHRoYXQgYXJyYXkgY291bnRzIGFyZSBjb3JyZWN0LCBldGMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRlRfVkFMSURBVEVfVElHSFQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQSB0YWJsZSB0aGF0IHBhc3NlcyB0aGlzIHZhbGlkYXRpb24gbGV2ZWwgY2FuIGJlIHVzZWQgcmVsaWFibHkgYW5kICAqLwotICAvKiAgIGRvZXNuJ3QgY29udGFpbiBpbnZhbGlkIGRhdGEuICBGb3IgZXhhbXBsZSwgYSBjaGFybWFwIHRhYmxlIHRoYXQgICAgKi8KLSAgLyogICByZXR1cm5zIGludmFsaWQgZ2x5cGggaW5kaWNlcyB3aWxsIG5vdCBwYXNzLCBldmVuIHRob3VnaCBpdCBjYW4gICAgICovCi0gIC8qICAgYmUgdXNlZCB3aXRoIEZyZWVUeXBlIGluIGRlZmF1bHQgbW9kZSAodGhlIGxpYnJhcnkgd2lsbCBzaW1wbHkgICAgICAqLwotICAvKiAgIHJldHVybiBhbiBlcnJvciBsYXRlciB3aGVuIHRyeWluZyB0byBsb2FkIHRoZSBnbHlwaCkuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSXQgYWxzbyBjaGVja3MgdGhhdCBmaWVsZHMgd2hpY2ggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIsIDQsIG9yIDgsICAqLwotICAvKiAgIGRvbid0IGhhdmUgaW5jb3JyZWN0IHZhbHVlcywgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZUX1ZBTElEQVRFX1BBUkFOT0lEIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE9ubHkgZm9yIGZvbnQgZGVidWdnaW5nLiAgQ2hlY2tzIHRoYXQgYSB0YWJsZSBmb2xsb3dzIHRoZSAgICAgICAgICAgKi8KLSAgLyogICBzcGVjaWZpY2F0aW9uIGJ5IDEwMCUuICBWZXJ5IGZldyBmb250cyB3aWxsIGJlIGFibGUgdG8gcGFzcyB0aGlzICAgICovCi0gIC8qICAgbGV2ZWwgYW55d2F5IGJ1dCBpdCBjYW4gYmUgdXNlZnVsIGZvciBjZXJ0YWluIHRvb2xzIGxpa2UgZm9udCAgICAgICAqLwotICAvKiAgIGVkaXRvcnMvY29udmVydGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgZW51bSAgRlRfVmFsaWRhdGlvbkxldmVsXwotICB7Ci0gICAgRlRfVkFMSURBVEVfREVGQVVMVCA9IDAsCi0gICAgRlRfVkFMSURBVEVfVElHSFQsCi0gICAgRlRfVkFMSURBVEVfUEFSQU5PSUQKLQotICB9IEZUX1ZhbGlkYXRpb25MZXZlbDsKLQotCi0jaWYgZGVmaW5lZCggX01TQ19WRVIgKSAgICAgIC8qIFZpc3VhbCBDKysgKGFuZCBJbnRlbCBDKyspICovCi0gIC8qIFdlIGRpc2FibGUgdGhlIHdhcm5pbmcgYHN0cnVjdHVyZSB3YXMgcGFkZGVkIGR1ZSB0byAgICovCi0gIC8qIF9fZGVjbHNwZWMoYWxpZ24oKSknIGluIG9yZGVyIHRvIGNvbXBpbGUgY2xlYW5seSB3aXRoICovCi0gIC8qIHRoZSBtYXhpbXVtIGxldmVsIG9mIHdhcm5pbmdzLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0jcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQotI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDMyNCApCi0jZW5kaWYgLyogX01TQ19WRVIgKi8KLQotICAvKiB2YWxpZGF0b3Igc3RydWN0dXJlICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9WYWxpZGF0b3JSZWNfCi0gIHsKLSAgICBjb25zdCBGVF9CeXRlKiAgICAgIGJhc2U7ICAgICAgICAvKiBhZGRyZXNzIG9mIHRhYmxlIGluIG1lbW9yeSAgICAgICAqLwotICAgIGNvbnN0IEZUX0J5dGUqICAgICAgbGltaXQ7ICAgICAgIC8qIGBiYXNlJyArIHNpemVvZih0YWJsZSkgaW4gbWVtb3J5ICovCi0gICAgRlRfVmFsaWRhdGlvbkxldmVsICBsZXZlbDsgICAgICAgLyogdmFsaWRhdGlvbiBsZXZlbCAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9FcnJvciAgICAgICAgICAgIGVycm9yOyAgICAgICAvKiBlcnJvciByZXR1cm5lZC4gMCBtZWFucyBzdWNjZXNzICAqLwotCi0gICAgZnRfam1wX2J1ZiAgICAgICAgICBqdW1wX2J1ZmZlcjsgLyogdXNlZCBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nICAgICAgKi8KLQotICB9IEZUX1ZhbGlkYXRvclJlYzsKLQotI2lmIGRlZmluZWQoIF9NU0NfVkVSICkKLSNwcmFnbWEgd2FybmluZyggcG9wICkKLSNlbmRpZgotCi0jZGVmaW5lIEZUX1ZBTElEQVRPUiggeCApICAoIChGVF9WYWxpZGF0b3IpKCB4ICkgKQotCi0KLSAgRlRfQkFTRSggdm9pZCApCi0gIGZ0X3ZhbGlkYXRvcl9pbml0KCBGVF9WYWxpZGF0b3IgICAgICAgIHZhbGlkLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfQnl0ZSogICAgICBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfQnl0ZSogICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1ZhbGlkYXRpb25MZXZlbCAgbGV2ZWwgKTsKLQotICAvKiBEbyBub3QgdXNlIHRoaXMuIEl0J3MgYnJva2VuIGFuZCB3aWxsIGNhdXNlIHlvdXIgdmFsaWRhdG9yIHRvIGNyYXNoICovCi0gIC8qIGlmIHlvdSBydW4gaXQgb24gYW4gaW52YWxpZCBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfSW50ICkKLSAgZnRfdmFsaWRhdG9yX3J1biggRlRfVmFsaWRhdG9yICB2YWxpZCApOwotCi0gIC8qIFNldHMgdGhlIGVycm9yIGZpZWxkIGluIGEgdmFsaWRhdG9yLCB0aGVuIGNhbGxzIGBsb25nam1wJyB0byByZXR1cm4gKi8KLSAgLyogdG8gaGlnaC1sZXZlbCBjYWxsZXIuICBVc2luZyBgc2V0am1wL2xvbmdqbXAnIGF2b2lkcyBtYW55IHN0dXBpZCAgICAqLwotICAvKiBlcnJvciBjaGVja3Mgd2l0aGluIHRoZSB2YWxpZGF0aW9uIHJvdXRpbmVzLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIGZ0X3ZhbGlkYXRvcl9lcnJvciggRlRfVmFsaWRhdG9yICB2YWxpZCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciAgICAgIGVycm9yICk7Ci0KLQotICAvKiBDYWxscyBmdF92YWxpZGF0ZV9lcnJvci4gIEFzc3VtZXMgdGhhdCB0aGUgYHZhbGlkJyBsb2NhbCB2YXJpYWJsZSAqLwotICAvKiBob2xkcyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgdmFsaWRhdG9yIG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBVc2UgcHJlcHJvY2Vzc29yIHByZXNjYW4gdG8gcGFzcyBGVF9FUlJfUFJFRklYLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9JTlZBTElEKCBfcHJlZml4LCBfZXJyb3IgKSAgRlRfSU5WQUxJRF8oIF9wcmVmaXgsIF9lcnJvciApCi0jZGVmaW5lIEZUX0lOVkFMSURfKCBfcHJlZml4LCBfZXJyb3IgKSBcCi0gICAgICAgICAgZnRfdmFsaWRhdG9yX2Vycm9yKCB2YWxpZCwgX3ByZWZpeCAjIyBfZXJyb3IgKQotCi0gIC8qIGNhbGxlZCB3aGVuIGEgYnJva2VuIHRhYmxlIGlzIGRldGVjdGVkICovCi0jZGVmaW5lIEZUX0lOVkFMSURfVE9PX1NIT1JUIFwKLSAgICAgICAgICBGVF9JTlZBTElEKCBGVF9FUlJfUFJFRklYLCBJbnZhbGlkX1RhYmxlICkKLQotICAvKiBjYWxsZWQgd2hlbiBhbiBpbnZhbGlkIG9mZnNldCBpcyBkZXRlY3RlZCAqLwotI2RlZmluZSBGVF9JTlZBTElEX09GRlNFVCBcCi0gICAgICAgICAgRlRfSU5WQUxJRCggRlRfRVJSX1BSRUZJWCwgSW52YWxpZF9PZmZzZXQgKQotCi0gIC8qIGNhbGxlZCB3aGVuIGFuIGludmFsaWQgZm9ybWF0L3ZhbHVlIGlzIGRldGVjdGVkICovCi0jZGVmaW5lIEZUX0lOVkFMSURfRk9STUFUIFwKLSAgICAgICAgICBGVF9JTlZBTElEKCBGVF9FUlJfUFJFRklYLCBJbnZhbGlkX1RhYmxlICkKLQotICAvKiBjYWxsZWQgd2hlbiBhbiBpbnZhbGlkIGdseXBoIGluZGV4IGlzIGRldGVjdGVkICovCi0jZGVmaW5lIEZUX0lOVkFMSURfR0xZUEhfSUQgXAotICAgICAgICAgIEZUX0lOVkFMSUQoIEZUX0VSUl9QUkVGSVgsIEludmFsaWRfR2x5cGhfSW5kZXggKQotCi0gIC8qIGNhbGxlZCB3aGVuIGFuIGludmFsaWQgZmllbGQgdmFsdWUgaXMgZGV0ZWN0ZWQgKi8KLSNkZWZpbmUgRlRfSU5WQUxJRF9EQVRBIFwKLSAgICAgICAgICBGVF9JTlZBTElEKCBGVF9FUlJfUFJFRklYLCBJbnZhbGlkX1RhYmxlICkKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUVkFMSURfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL2ludGVybmFsLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL2ludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZGRiMDYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9pbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaW50ZXJuYWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEludGVybmFsIGhlYWRlciBmaWxlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDQsIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgYnkgYGZ0MmJ1aWxkLmgnLiAgICAgICAgICAgICAgICAgICovCi0gIC8qIERvIG5vdCBpbmNsdWRlIGl0IG1hbnVhbGx5ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0ggICAgICAgICAgICAgPGludGVybmFsL2Z0b2Jqcy5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9QSUNfSCAgICAgICAgICAgICAgICAgPGludGVybmFsL2Z0cGljLmg+Ci0jZGVmaW5lIEZUX0lOVEVSTkFMX1NUUkVBTV9IICAgICAgICAgICAgICA8aW50ZXJuYWwvZnRzdHJlYW0uaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfTUVNT1JZX0ggICAgICAgICAgICAgIDxpbnRlcm5hbC9mdG1lbW9yeS5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9ERUJVR19IICAgICAgICAgICAgICAgPGludGVybmFsL2Z0ZGVidWcuaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfQ0FMQ19IICAgICAgICAgICAgICAgIDxpbnRlcm5hbC9mdGNhbGMuaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfRFJJVkVSX0ggICAgICAgICAgICAgIDxpbnRlcm5hbC9mdGRyaXZlci5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9UUkFDRV9IICAgICAgICAgICAgICAgPGludGVybmFsL2Z0dHJhY2UuaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfR0xZUEhfTE9BREVSX0ggICAgICAgIDxpbnRlcm5hbC9mdGdsb2Fkci5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9TRk5UX0ggICAgICAgICAgICAgICAgPGludGVybmFsL3NmbnQuaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfU0VSVklDRV9IICAgICAgICAgICAgIDxpbnRlcm5hbC9mdHNlcnYuaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfUkZPUktfSCAgICAgICAgICAgICAgIDxpbnRlcm5hbC9mdHJmb3JrLmg+Ci0jZGVmaW5lIEZUX0lOVEVSTkFMX1ZBTElEQVRFX0ggICAgICAgICAgICA8aW50ZXJuYWwvZnR2YWxpZC5oPgotCi0jZGVmaW5lIEZUX0lOVEVSTkFMX1RSVUVUWVBFX1RZUEVTX0ggICAgICA8aW50ZXJuYWwvdHR0eXBlcy5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9UWVBFMV9UWVBFU19IICAgICAgICAgPGludGVybmFsL3QxdHlwZXMuaD4KLQotI2RlZmluZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9IICAgICAgPGludGVybmFsL3BzYXV4Lmg+Ci0jZGVmaW5lIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfSElOVFNfSCAgICA8aW50ZXJuYWwvcHNoaW50cy5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0dMT0JBTFNfSCAgPGludGVybmFsL3BzZ2xvYmFsLmg+Ci0KLSNkZWZpbmUgRlRfSU5URVJOQUxfQVVUT0hJTlRfSCAgICAgICAgICAgIDxpbnRlcm5hbC9hdXRvaGludC5oPgotCi0KLSNpZiBkZWZpbmVkKCBfTVNDX1ZFUiApICAgICAgLyogVmlzdWFsIEMrKyAoYW5kIEludGVsIEMrKykgKi8KLQotICAvKiBXZSBkaXNhYmxlIHRoZSB3YXJuaW5nIGBjb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGNvbnN0YW50JyBoZXJlICovCi0gIC8qIGluIG9yZGVyIHRvIGNvbXBpbGUgY2xlYW5seSB3aXRoIHRoZSBtYXhpbXVtIGxldmVsIG9mIHdhcm5pbmdzLiAgKi8KLSAgLyogSW4gcGFydGljdWxhciwgdGhlIHdhcm5pbmcgY29tcGxhaW5zIGFib3V0IHN0dWZmIGxpa2UgYHdoaWxlKDApJyAqLwotICAvKiB3aGljaCBpcyB2ZXJ5IHVzZWZ1bCBpbiBtYWNybyBkZWZpbml0aW9ucy4gIFRoZXJlIGlzIG5vIGJlbmVmaXQgICovCi0gIC8qIGluIGhhdmluZyBpdCBlbmFibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQxMjcgKQotCi0jZW5kaWYgLyogX01TQ19WRVIgKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvcHNhdXguaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvcHNhdXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkwMzExNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3BzYXV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNhdXguaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1eGlsaWFyeSBmdW5jdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlcyByZWxhdGVkIHRvIFBvc3RTY3JpcHQgZm9udHMgICovCi0vKiAgICAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDA0LCAyMDA2LCAyMDA4LCAyMDA5LCAyMDEyIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1BTQVVYX0hfXwotI2RlZmluZSBfX1BTQVVYX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UWVBFMV9UWVBFU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICB0eXBlZGVmIHN0cnVjdCBQU19UYWJsZVJlY18qICAgICAgICAgICAgICBQU19UYWJsZTsKLSAgdHlwZWRlZiBjb25zdCBzdHJ1Y3QgUFNfVGFibGVfRnVuY3NSZWNfKiAgUFNfVGFibGVfRnVuY3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19UYWJsZV9GdW5jc1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNldCBvZiBmdW5jdGlvbiBwb2ludGVycyB0byBtYW5hZ2UgUFNfVGFibGUgb2JqZWN0cy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWJsZV9pbml0ICAgIDo6IFVzZWQgdG8gaW5pdGlhbGl6ZSBhIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhYmxlX2RvbmUgICAgOjogRmluYWxpemVzIHJlc3AuIGRlc3Ryb3kgYSBnaXZlbiB0YWJsZS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFibGVfYWRkICAgICA6OiBBZGRzIGEgbmV3IG9iamVjdCB0byBhIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWJsZV9yZWxlYXNlIDo6IFJlbGVhc2VzIHRhYmxlIGRhdGEsIHRoZW4gZmluYWxpemVzIGl0LiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU19UYWJsZV9GdW5jc1JlY18KLSAgewotICAgIEZUX0Vycm9yCi0gICAgKCppbml0KSggUFNfVGFibGUgICB0YWJsZSwKLSAgICAgICAgICAgICBGVF9JbnQgICAgIGNvdW50LAotICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICk7Ci0KLSAgICB2b2lkCi0gICAgKCpkb25lKSggUFNfVGFibGUgIHRhYmxlICk7Ci0KLSAgICBGVF9FcnJvcgotICAgICgqYWRkKSggUFNfVGFibGUgICAgdGFibGUsCi0gICAgICAgICAgICBGVF9JbnQgICAgICBpZHgsCi0gICAgICAgICAgICB2b2lkKiAgICAgICBvYmplY3QsCi0gICAgICAgICAgICBGVF9QdHJEaXN0ICBsZW5ndGggKTsKLQotICAgIHZvaWQKLSAgICAoKnJlbGVhc2UpKCBQU19UYWJsZSAgdGFibGUgKTsKLQotICB9IFBTX1RhYmxlX0Z1bmNzUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfVGFibGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBQU19UYWJsZSBpcyBhIHNpbXBsZSBvYmplY3QgdXNlZCB0byBzdG9yZSBhbiBhcnJheSBvZiBvYmplY3RzIGluICovCi0gIC8qICAgIGEgc2luZ2xlIG1lbW9yeSBibG9jay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJsb2NrICAgICA6OiBUaGUgYWRkcmVzcyBpbiBtZW1vcnkgb2YgdGhlIGdyb3doZWFwJ3MgYmxvY2suICBUaGlzICAqLwotICAvKiAgICAgICAgICAgICAgICAgY2FuIGNoYW5nZSBiZXR3ZWVuIHR3byBvYmplY3QgYWRkcywgZHVlIHRvICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIHJlYWxsb2NhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjdXJzb3IgICAgOjogVGhlIGN1cnJlbnQgdG9wIG9mIHRoZSBncm93IGhlYXAgd2l0aGluIGl0cyBibG9jay4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhcGFjaXR5ICA6OiBUaGUgY3VycmVudCBzaXplIG9mIHRoZSBoZWFwIGJsb2NrLiAgSW5jcmVtZW50cyBieSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgMWtCeXRlIGNodW5rcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGluaXQgICAgICA6OiBTZXQgdG8gMHhERUFEQkVFRiBpZiBgZWxlbWVudHMnIGFuZCBgbGVuZ3RocycgaGF2ZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgYmVlbiBhbGxvY2F0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9lbGVtcyA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGFibGUuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2VsZW1zIDo6IFRoZSBjdXJyZW50IG51bWJlciBvZiBlbGVtZW50cyBpbiB0YWJsZS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBlbGVtZW50cyAgOjogQSB0YWJsZSBvZiBlbGVtZW50IGFkZHJlc3NlcyB3aXRoaW4gdGhlIGJsb2NrLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlbmd0aHMgICA6OiBBIHRhYmxlIG9mIGVsZW1lbnQgc2l6ZXMgd2l0aGluIHRoZSBibG9jay4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICAgIDo6IFRoZSBvYmplY3QgdXNlZCBmb3IgbWVtb3J5IG9wZXJhdGlvbnMgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAoYWxsb2MvcmVhbGxvYykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnVuY3MgICAgIDo6IEEgdGFibGUgb2YgbWV0aG9kIHBvaW50ZXJzIGZvciB0aGlzIG9iamVjdC4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNfVGFibGVSZWNfCi0gIHsKLSAgICBGVF9CeXRlKiAgICAgICAgICAgYmxvY2s7ICAgICAgICAgIC8qIGN1cnJlbnQgbWVtb3J5IGJsb2NrICAgICAgICAgICAqLwotICAgIEZUX09mZnNldCAgICAgICAgICBjdXJzb3I7ICAgICAgICAgLyogY3VycmVudCBjdXJzb3IgaW4gbWVtb3J5IGJsb2NrICovCi0gICAgRlRfT2Zmc2V0ICAgICAgICAgIGNhcGFjaXR5OyAgICAgICAvKiBjdXJyZW50IHNpemUgb2YgbWVtb3J5IGJsb2NrICAgKi8KLSAgICBGVF9Mb25nICAgICAgICAgICAgaW5pdDsKLQotICAgIEZUX0ludCAgICAgICAgICAgICBtYXhfZWxlbXM7Ci0gICAgRlRfSW50ICAgICAgICAgICAgIG51bV9lbGVtczsKLSAgICBGVF9CeXRlKiogICAgICAgICAgZWxlbWVudHM7ICAgICAgIC8qIGFkZHJlc3NlcyBvZiB0YWJsZSBlbGVtZW50cyAqLwotICAgIEZUX1B0ckRpc3QqICAgICAgICBsZW5ndGhzOyAgICAgICAgLyogbGVuZ3RocyBvZiB0YWJsZSBlbGVtZW50cyAgICovCi0KLSAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5OwotICAgIFBTX1RhYmxlX0Z1bmNzUmVjICBmdW5jczsKLQotICB9IFBTX1RhYmxlUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICBUMSBGSUVMRFMgJiBUT0tFTlMgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgUFNfUGFyc2VyUmVjXyogIFBTX1BhcnNlcjsKLQotICB0eXBlZGVmIHN0cnVjdCBUMV9Ub2tlblJlY18qICAgVDFfVG9rZW47Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgVDFfRmllbGRSZWNfKiAgIFQxX0ZpZWxkOwotCi0KLSAgLyogc2ltcGxlIGVudW1lcmF0aW9uIHR5cGUgdXNlZCB0byBpZGVudGlmeSB0b2tlbiB0eXBlcyAqLwotICB0eXBlZGVmIGVudW0gIFQxX1Rva2VuVHlwZV8KLSAgewotICAgIFQxX1RPS0VOX1RZUEVfTk9ORSA9IDAsCi0gICAgVDFfVE9LRU5fVFlQRV9BTlksCi0gICAgVDFfVE9LRU5fVFlQRV9TVFJJTkcsCi0gICAgVDFfVE9LRU5fVFlQRV9BUlJBWSwKLSAgICBUMV9UT0tFTl9UWVBFX0tFWSwgLyogYWthIGBuYW1lJyAqLwotCi0gICAgLyogZG8gbm90IHJlbW92ZSAqLwotICAgIFQxX1RPS0VOX1RZUEVfTUFYCi0KLSAgfSBUMV9Ub2tlblR5cGU7Ci0KLQotICAvKiBhIHNpbXBsZSBzdHJ1Y3R1cmUgdXNlZCB0byBpZGVudGlmeSB0b2tlbnMgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFQxX1Rva2VuUmVjXwotICB7Ci0gICAgRlRfQnl0ZSogICAgICBzdGFydDsgICAvKiBmaXJzdCBjaGFyYWN0ZXIgb2YgdG9rZW4gaW4gaW5wdXQgc3RyZWFtICovCi0gICAgRlRfQnl0ZSogICAgICBsaW1pdDsgICAvKiBmaXJzdCBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIHRva2VuICAgICAgICAgICovCi0gICAgVDFfVG9rZW5UeXBlICB0eXBlOyAgICAvKiB0eXBlIG9mIHRva2VuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgfSBUMV9Ub2tlblJlYzsKLQotCi0gIC8qIGVudW1lcmF0aW9uIHR5cGUgdXNlZCB0byBpZGVudGlmeSBvYmplY3QgZmllbGRzICovCi0gIHR5cGVkZWYgZW51bSAgVDFfRmllbGRUeXBlXwotICB7Ci0gICAgVDFfRklFTERfVFlQRV9OT05FID0gMCwKLSAgICBUMV9GSUVMRF9UWVBFX0JPT0wsCi0gICAgVDFfRklFTERfVFlQRV9JTlRFR0VSLAotICAgIFQxX0ZJRUxEX1RZUEVfRklYRUQsCi0gICAgVDFfRklFTERfVFlQRV9GSVhFRF8xMDAwLAotICAgIFQxX0ZJRUxEX1RZUEVfU1RSSU5HLAotICAgIFQxX0ZJRUxEX1RZUEVfS0VZLAotICAgIFQxX0ZJRUxEX1RZUEVfQkJPWCwKLSAgICBUMV9GSUVMRF9UWVBFX01NX0JCT1gsCi0gICAgVDFfRklFTERfVFlQRV9JTlRFR0VSX0FSUkFZLAotICAgIFQxX0ZJRUxEX1RZUEVfRklYRURfQVJSQVksCi0gICAgVDFfRklFTERfVFlQRV9DQUxMQkFDSywKLQotICAgIC8qIGRvIG5vdCByZW1vdmUgKi8KLSAgICBUMV9GSUVMRF9UWVBFX01BWAotCi0gIH0gVDFfRmllbGRUeXBlOwotCi0KLSAgdHlwZWRlZiBlbnVtICBUMV9GaWVsZExvY2F0aW9uXwotICB7Ci0gICAgVDFfRklFTERfTE9DQVRJT05fQ0lEX0lORk8sCi0gICAgVDFfRklFTERfTE9DQVRJT05fRk9OVF9ESUNULAotICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX0ZPTlRfRVhUUkEsCi0gICAgVDFfRklFTERfTE9DQVRJT05fRk9OVF9JTkZPLAotICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX1BSSVZBVEUsCi0gICAgVDFfRklFTERfTE9DQVRJT05fQkJPWCwKLSAgICBUMV9GSUVMRF9MT0NBVElPTl9MT0FERVIsCi0gICAgVDFfRklFTERfTE9DQVRJT05fRkFDRSwKLSAgICBUMV9GSUVMRF9MT0NBVElPTl9CTEVORCwKLQotICAgIC8qIGRvIG5vdCByZW1vdmUgKi8KLSAgICBUMV9GSUVMRF9MT0NBVElPTl9NQVgKLQotICB9IFQxX0ZpZWxkTG9jYXRpb247Ci0KLQotICB0eXBlZGVmIHZvaWQKLSAgKCpUMV9GaWVsZF9QYXJzZUZ1bmMpKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgIHBhcnNlciApOwotCi0KLSAgLyogc3RydWN0dXJlIHR5cGUgdXNlZCB0byBtb2RlbCBvYmplY3QgZmllbGRzICovCi0gIHR5cGVkZWYgc3RydWN0ICBUMV9GaWVsZFJlY18KLSAgewotICAgIGNvbnN0IGNoYXIqICAgICAgICAgaWRlbnQ7ICAgICAgICAvKiBmaWVsZCBpZGVudGlmaWVyICAgICAgICAgICAgICAgKi8KLSAgICBUMV9GaWVsZExvY2F0aW9uICAgIGxvY2F0aW9uOwotICAgIFQxX0ZpZWxkVHlwZSAgICAgICAgdHlwZTsgICAgICAgICAvKiB0eXBlIG9mIGZpZWxkICAgICAgICAgICAgICAgICAgKi8KLSAgICBUMV9GaWVsZF9QYXJzZUZ1bmMgIHJlYWRlcjsKLSAgICBGVF9VSW50ICAgICAgICAgICAgIG9mZnNldDsgICAgICAgLyogb2Zmc2V0IG9mIGZpZWxkIGluIG9iamVjdCAgICAgICovCi0gICAgRlRfQnl0ZSAgICAgICAgICAgICBzaXplOyAgICAgICAgIC8qIHNpemUgb2YgZmllbGQgaW4gYnl0ZXMgICAgICAgICAqLwotICAgIEZUX1VJbnQgICAgICAgICAgICAgYXJyYXlfbWF4OyAgICAvKiBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBmb3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXJyYXkgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfVUludCAgICAgICAgICAgICBjb3VudF9vZmZzZXQ7IC8qIG9mZnNldCBvZiBlbGVtZW50IGNvdW50IGZvciAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcnJheXM7IG11c3Qgbm90IGJlIHplcm8gaWYgaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlIC0tIGluIG90aGVyIHdvcmRzLCBhICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGBudW1fRk9PJyBlbGVtZW50IG11c3Qgbm90ICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFydCB0aGUgdXNlZCBzdHJ1Y3R1cmUgaWYgd2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGFyc2UgYSBgRk9PJyBhcnJheSAgICAgICAgICAgICovCi0gICAgRlRfVUludCAgICAgICAgICAgICBkaWN0OyAgICAgICAgIC8qIHdoZXJlIHdlIGV4cGVjdCBpdCAgICAgICAgICAgICAqLwotICB9IFQxX0ZpZWxkUmVjOwotCi0jZGVmaW5lIFQxX0ZJRUxEX0RJQ1RfRk9OVERJQ1QgKCAxIDw8IDAgKSAvKiBhbHNvIEZvbnRJbmZvIGFuZCBGREFycmF5ICovCi0jZGVmaW5lIFQxX0ZJRUxEX0RJQ1RfUFJJVkFURSAgKCAxIDw8IDEgKQotCi0KLQotI2RlZmluZSBUMV9ORVdfU0lNUExFX0ZJRUxEKCBfaWRlbnQsIF90eXBlLCBfZm5hbWUsIF9kaWN0ICkgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgX2lkZW50LCBUMUNPREUsIF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfT0ZGU0VUKCBfZm5hbWUgKSwgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfU0laRSggX2ZuYW1lICksICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgX2RpY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0sCi0KLSNkZWZpbmUgVDFfTkVXX0NBTExCQUNLX0ZJRUxEKCBfaWRlbnQsIF9yZWFkZXIsIF9kaWN0ICkgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBfaWRlbnQsIFQxQ09ERSwgVDFfRklFTERfVFlQRV9DQUxMQkFDSywgICAgIFwKLSAgICAgICAgICAgIChUMV9GaWVsZF9QYXJzZUZ1bmMpX3JlYWRlciwgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIF9kaWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0sCi0KLSNkZWZpbmUgVDFfTkVXX1RBQkxFX0ZJRUxEKCBfaWRlbnQsIF90eXBlLCBfZm5hbWUsIF9tYXgsIF9kaWN0ICkgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBfaWRlbnQsIFQxQ09ERSwgX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfT0ZGU0VUKCBfZm5hbWUgKSwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBGVF9GSUVMRF9TSVpFX0RFTFRBKCBfZm5hbWUgKSwgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIF9tYXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfT0ZGU0VUKCBudW1fICMjIF9mbmFtZSApLCAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBfZGljdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9LAotCi0jZGVmaW5lIFQxX05FV19UQUJMRV9GSUVMRDIoIF9pZGVudCwgX3R5cGUsIF9mbmFtZSwgX21heCwgX2RpY3QgKSBcCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBfaWRlbnQsIFQxQ09ERSwgX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBGVF9GSUVMRF9PRkZTRVQoIF9mbmFtZSApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBGVF9GSUVMRF9TSVpFX0RFTFRBKCBfZm5hbWUgKSwgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBfbWF4LCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBfZGljdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgfSwKLQotCi0jZGVmaW5lIFQxX0ZJRUxEX0JPT0woIF9pZGVudCwgX2ZuYW1lLCBfZGljdCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgVDFfTkVXX1NJTVBMRV9GSUVMRCggX2lkZW50LCBUMV9GSUVMRF9UWVBFX0JPT0wsIF9mbmFtZSwgX2RpY3QgKQotCi0jZGVmaW5lIFQxX0ZJRUxEX05VTSggX2lkZW50LCBfZm5hbWUsIF9kaWN0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgVDFfTkVXX1NJTVBMRV9GSUVMRCggX2lkZW50LCBUMV9GSUVMRF9UWVBFX0lOVEVHRVIsIF9mbmFtZSwgX2RpY3QgKQotCi0jZGVmaW5lIFQxX0ZJRUxEX0ZJWEVEKCBfaWRlbnQsIF9mbmFtZSwgX2RpY3QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIFQxX05FV19TSU1QTEVfRklFTEQoIF9pZGVudCwgVDFfRklFTERfVFlQRV9GSVhFRCwgX2ZuYW1lLCBfZGljdCApCi0KLSNkZWZpbmUgVDFfRklFTERfRklYRURfMTAwMCggX2lkZW50LCBfZm5hbWUsIF9kaWN0ICkgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgVDFfTkVXX1NJTVBMRV9GSUVMRCggX2lkZW50LCBUMV9GSUVMRF9UWVBFX0ZJWEVEXzEwMDAsIF9mbmFtZSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kaWN0ICkKLQotI2RlZmluZSBUMV9GSUVMRF9TVFJJTkcoIF9pZGVudCwgX2ZuYW1lLCBfZGljdCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgVDFfTkVXX1NJTVBMRV9GSUVMRCggX2lkZW50LCBUMV9GSUVMRF9UWVBFX1NUUklORywgX2ZuYW1lLCBfZGljdCApCi0KLSNkZWZpbmUgVDFfRklFTERfS0VZKCBfaWRlbnQsIF9mbmFtZSwgX2RpY3QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIFQxX05FV19TSU1QTEVfRklFTEQoIF9pZGVudCwgVDFfRklFTERfVFlQRV9LRVksIF9mbmFtZSwgX2RpY3QgKQotCi0jZGVmaW5lIFQxX0ZJRUxEX0JCT1goIF9pZGVudCwgX2ZuYW1lLCBfZGljdCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgVDFfTkVXX1NJTVBMRV9GSUVMRCggX2lkZW50LCBUMV9GSUVMRF9UWVBFX0JCT1gsIF9mbmFtZSwgX2RpY3QgKQotCi0KLSNkZWZpbmUgVDFfRklFTERfTlVNX1RBQkxFKCBfaWRlbnQsIF9mbmFtZSwgX2ZtYXgsIF9kaWN0ICkgICAgICAgICBcCi0gICAgICAgICAgVDFfTkVXX1RBQkxFX0ZJRUxEKCBfaWRlbnQsIFQxX0ZJRUxEX1RZUEVfSU5URUdFUl9BUlJBWSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2ZuYW1lLCBfZm1heCwgX2RpY3QgKQotCi0jZGVmaW5lIFQxX0ZJRUxEX0ZJWEVEX1RBQkxFKCBfaWRlbnQsIF9mbmFtZSwgX2ZtYXgsIF9kaWN0ICkgICAgIFwKLSAgICAgICAgICBUMV9ORVdfVEFCTEVfRklFTEQoIF9pZGVudCwgVDFfRklFTERfVFlQRV9GSVhFRF9BUlJBWSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2ZuYW1lLCBfZm1heCwgX2RpY3QgKQotCi0jZGVmaW5lIFQxX0ZJRUxEX05VTV9UQUJMRTIoIF9pZGVudCwgX2ZuYW1lLCBfZm1heCwgX2RpY3QgKSAgICAgICAgIFwKLSAgICAgICAgICBUMV9ORVdfVEFCTEVfRklFTEQyKCBfaWRlbnQsIFQxX0ZJRUxEX1RZUEVfSU5URUdFUl9BUlJBWSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mbmFtZSwgX2ZtYXgsIF9kaWN0ICkKLQotI2RlZmluZSBUMV9GSUVMRF9GSVhFRF9UQUJMRTIoIF9pZGVudCwgX2ZuYW1lLCBfZm1heCwgX2RpY3QgKSAgICAgXAotICAgICAgICAgIFQxX05FV19UQUJMRV9GSUVMRDIoIF9pZGVudCwgVDFfRklFTERfVFlQRV9GSVhFRF9BUlJBWSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mbmFtZSwgX2ZtYXgsIF9kaWN0ICkKLQotI2RlZmluZSBUMV9GSUVMRF9DQUxMQkFDSyggX2lkZW50LCBfbmFtZSwgX2RpY3QgKSAgICAgICBcCi0gICAgICAgICAgVDFfTkVXX0NBTExCQUNLX0ZJRUxEKCBfaWRlbnQsIF9uYW1lLCBfZGljdCApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgVDEgUEFSU0VSICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIGNvbnN0IHN0cnVjdCBQU19QYXJzZXJfRnVuY3NSZWNfKiAgUFNfUGFyc2VyX0Z1bmNzOwotCi0gIHR5cGVkZWYgc3RydWN0ICBQU19QYXJzZXJfRnVuY3NSZWNfCi0gIHsKLSAgICB2b2lkCi0gICAgKCppbml0KSggUFNfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgRlRfQnl0ZSogICBiYXNlLAotICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQsCi0gICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKTsKLQotICAgIHZvaWQKLSAgICAoKmRvbmUpKCBQU19QYXJzZXIgIHBhcnNlciApOwotCi0gICAgdm9pZAotICAgICgqc2tpcF9zcGFjZXMpKCBQU19QYXJzZXIgIHBhcnNlciApOwotICAgIHZvaWQKLSAgICAoKnNraXBfUFNfdG9rZW4pKCBQU19QYXJzZXIgIHBhcnNlciApOwotCi0gICAgRlRfTG9uZwotICAgICgqdG9faW50KSggUFNfUGFyc2VyICBwYXJzZXIgKTsKLSAgICBGVF9GaXhlZAotICAgICgqdG9fZml4ZWQpKCBQU19QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBwb3dlcl90ZW4gKTsKLQotICAgIEZUX0Vycm9yCi0gICAgKCp0b19ieXRlcykoIFBTX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ5dGVzLAotICAgICAgICAgICAgICAgICBGVF9PZmZzZXQgIG1heF9ieXRlcywKLSAgICAgICAgICAgICAgICAgRlRfTG9uZyogICBwbnVtX2J5dGVzLAotICAgICAgICAgICAgICAgICBGVF9Cb29sICAgIGRlbGltaXRlcnMgKTsKLQotICAgIEZUX0ludAotICAgICgqdG9fY29vcmRfYXJyYXkpKCBQU19QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBtYXhfY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9TaG9ydCogIGNvb3JkcyApOwotICAgIEZUX0ludAotICAgICgqdG9fZml4ZWRfYXJyYXkpKCBQU19QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBtYXhfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIHZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBwb3dlcl90ZW4gKTsKLQotICAgIHZvaWQKLSAgICAoKnRvX3Rva2VuKSggUFNfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgIFQxX1Rva2VuICAgdG9rZW4gKTsKLSAgICB2b2lkCi0gICAgKCp0b190b2tlbl9hcnJheSkoIFBTX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICBUMV9Ub2tlbiAgIHRva2VucywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBtYXhfdG9rZW5zLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQqICAgIHBudW1fdG9rZW5zICk7Ci0KLSAgICBGVF9FcnJvcgotICAgICgqbG9hZF9maWVsZCkoIFBTX1BhcnNlciAgICAgICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgVDFfRmllbGQgIGZpZWxkLAotICAgICAgICAgICAgICAgICAgIHZvaWQqKiAgICAgICAgICBvYmplY3RzLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBtYXhfb2JqZWN0cywKLSAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgICAgcGZsYWdzICk7Ci0KLSAgICBGVF9FcnJvcgotICAgICgqbG9hZF9maWVsZF90YWJsZSkoIFBTX1BhcnNlciAgICAgICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDFfRmllbGQgIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiAgICAgICAgICBvYmplY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBtYXhfb2JqZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgICAgcGZsYWdzICk7Ci0KLSAgfSBQU19QYXJzZXJfRnVuY3NSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19QYXJzZXJSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIFBTX1BhcnNlciBpcyBhbiBvYmplY3QgdXNlZCB0byBwYXJzZSBhIFR5cGUgMSBmb250IHZlcnkgcXVpY2tseS4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjdXJzb3IgOjogVGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHRleHQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJhc2UgICA6OiBTdGFydCBvZiB0aGUgcHJvY2Vzc2VkIHRleHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGltaXQgIDo6IEVuZCBvZiB0aGUgcHJvY2Vzc2VkIHRleHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBlcnJvciAgOjogVGhlIGxhc3QgZXJyb3IgcmV0dXJuZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSA6OiBUaGUgb2JqZWN0IHVzZWQgZm9yIG1lbW9yeSBvcGVyYXRpb25zIChhbGxvYy9yZWFsbG9jKS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnVuY3MgIDo6IEEgdGFibGUgb2YgZnVuY3Rpb25zIGZvciB0aGUgcGFyc2VyLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNfUGFyc2VyUmVjXwotICB7Ci0gICAgRlRfQnl0ZSogICBjdXJzb3I7Ci0gICAgRlRfQnl0ZSogICBiYXNlOwotICAgIEZUX0J5dGUqICAgbGltaXQ7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLQotICAgIFBTX1BhcnNlcl9GdW5jc1JlYyAgZnVuY3M7Ci0KLSAgfSBQU19QYXJzZXJSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgVDEgQlVJTERFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIHR5cGVkZWYgc3RydWN0IFQxX0J1aWxkZXJSZWNfKiAgVDFfQnVpbGRlcjsKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUMV9CdWlsZGVyX0NoZWNrX1BvaW50c19GdW5jKSggVDFfQnVpbGRlciAgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgY291bnQgKTsKLQotICB0eXBlZGVmIHZvaWQKLSAgKCpUMV9CdWlsZGVyX0FkZF9Qb2ludF9GdW5jKSggVDFfQnVpbGRlciAgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSAgICAgZmxhZyApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUMV9CdWlsZGVyX0FkZF9Qb2ludDFfRnVuYykoIFQxX0J1aWxkZXIgIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeSApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUMV9CdWlsZGVyX0FkZF9Db250b3VyX0Z1bmMpKCBUMV9CdWlsZGVyICBidWlsZGVyICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlQxX0J1aWxkZXJfU3RhcnRfUG9pbnRfRnVuYykoIFQxX0J1aWxkZXIgIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB5ICk7Ci0KLSAgdHlwZWRlZiB2b2lkCi0gICgqVDFfQnVpbGRlcl9DbG9zZV9Db250b3VyX0Z1bmMpKCBUMV9CdWlsZGVyICBidWlsZGVyICk7Ci0KLQotICB0eXBlZGVmIGNvbnN0IHN0cnVjdCBUMV9CdWlsZGVyX0Z1bmNzUmVjXyogIFQxX0J1aWxkZXJfRnVuY3M7Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFQxX0J1aWxkZXJfRnVuY3NSZWNfCi0gIHsKLSAgICB2b2lkCi0gICAgKCppbml0KSggVDFfQnVpbGRlciAgICBidWlsZGVyLAotICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgZmFjZSwKLSAgICAgICAgICAgICBGVF9TaXplICAgICAgIHNpemUsCi0gICAgICAgICAgICAgRlRfR2x5cGhTbG90ICBzbG90LAotICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgaGludGluZyApOwotCi0gICAgdm9pZAotICAgICgqZG9uZSkoIFQxX0J1aWxkZXIgICBidWlsZGVyICk7Ci0KLSAgICBUMV9CdWlsZGVyX0NoZWNrX1BvaW50c19GdW5jICAgY2hlY2tfcG9pbnRzOwotICAgIFQxX0J1aWxkZXJfQWRkX1BvaW50X0Z1bmMgICAgICBhZGRfcG9pbnQ7Ci0gICAgVDFfQnVpbGRlcl9BZGRfUG9pbnQxX0Z1bmMgICAgIGFkZF9wb2ludDE7Ci0gICAgVDFfQnVpbGRlcl9BZGRfQ29udG91cl9GdW5jICAgIGFkZF9jb250b3VyOwotICAgIFQxX0J1aWxkZXJfU3RhcnRfUG9pbnRfRnVuYyAgICBzdGFydF9wb2ludDsKLSAgICBUMV9CdWlsZGVyX0Nsb3NlX0NvbnRvdXJfRnVuYyAgY2xvc2VfY29udG91cjsKLQotICB9IFQxX0J1aWxkZXJfRnVuY3NSZWM7Ci0KLQotICAvKiBhbiBlbnVtZXJhdGlvbiB0eXBlIHRvIGhhbmRsZSBjaGFyc3RyaW5nIHBhcnNpbmcgc3RhdGVzICovCi0gIHR5cGVkZWYgZW51bSAgVDFfUGFyc2VTdGF0ZV8KLSAgewotICAgIFQxX1BhcnNlX1N0YXJ0LAotICAgIFQxX1BhcnNlX0hhdmVfV2lkdGgsCi0gICAgVDFfUGFyc2VfSGF2ZV9Nb3ZldG8sCi0gICAgVDFfUGFyc2VfSGF2ZV9QYXRoCi0KLSAgfSBUMV9QYXJzZVN0YXRlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0dXJlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQnVpbGRlclJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIEEgc3RydWN0dXJlIHVzZWQgZHVyaW5nIGdseXBoIGxvYWRpbmcgdG8gc3RvcmUgaXRzIG91dGxpbmUuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICAgICAgIDo6IFRoZSBjdXJyZW50IG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICAgOjogVGhlIGN1cnJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoICAgICAgICA6OiBUaGUgY3VycmVudCBnbHlwaCBzbG90LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZGVyICAgICAgIDo6IFhYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiYXNlICAgICAgICAgOjogVGhlIGJhc2UgZ2x5cGggb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGN1cnJlbnQgICAgICA6OiBUaGUgY3VycmVudCBnbHlwaCBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4X3BvaW50cyAgIDo6IG1heGltdW0gcG9pbnRzIGluIGJ1aWxkZXIgb3V0bGluZSAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhfY29udG91cnMgOjogTWF4aW11bSBudW1iZXIgb2YgY29udG91cnMgaW4gYnVpbGRlciBvdXRsaW5lLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBvc194ICAgICAgICA6OiBUaGUgaG9yaXpvbnRhbCB0cmFuc2xhdGlvbiAoaWYgY29tcG9zaXRlIGdseXBoKS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9zX3kgICAgICAgIDo6IFRoZSB2ZXJ0aWNhbCB0cmFuc2xhdGlvbiAoaWYgY29tcG9zaXRlIGdseXBoKS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZWZ0X2JlYXJpbmcgOjogVGhlIGxlZnQgc2lkZSBiZWFyaW5nIHBvaW50LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFkdmFuY2UgICAgICA6OiBUaGUgaG9yaXpvbnRhbCBhZHZhbmNlIHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmJveCAgICAgICAgIDo6IFVudXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYXJzZV9zdGF0ZSAgOjogQW4gZW51bWVyYXRpb24gd2hpY2ggY29udHJvbHMgdGhlIGNoYXJzdHJpbmcgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHBhcnNpbmcgc3RhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkX3BvaW50cyAgOjogSWYgdGhpcyBmbGFnIGlzIG5vdCBzZXQsIG5vIHBvaW50cyBhcmUgbG9hZGVkLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5vX3JlY3Vyc2UgICA6OiBTZXQgYnV0IG5vdCB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWV0cmljc19vbmx5IDo6IEEgYm9vbGVhbiBpbmRpY2F0aW5nIHRoYXQgd2Ugb25seSB3YW50IHRvIGNvbXB1dGUgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICB0aGUgbWV0cmljcyBvZiBhIGdpdmVuIGdseXBoLCBub3QgbG9hZCBhbGwgb2YgaXRzICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgcG9pbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ1bmNzICAgICAgICA6OiBBbiBhcnJheSBvZiBmdW5jdGlvbiBwb2ludGVycyBmb3IgdGhlIGJ1aWxkZXIuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFQxX0J1aWxkZXJSZWNfCi0gIHsKLSAgICBGVF9NZW1vcnkgICAgICAgbWVtb3J5OwotICAgIEZUX0ZhY2UgICAgICAgICBmYWNlOwotICAgIEZUX0dseXBoU2xvdCAgICBnbHlwaDsKLSAgICBGVF9HbHlwaExvYWRlciAgbG9hZGVyOwotICAgIEZUX091dGxpbmUqICAgICBiYXNlOwotICAgIEZUX091dGxpbmUqICAgICBjdXJyZW50OwotCi0gICAgRlRfUG9zICAgICAgICAgIHBvc194OwotICAgIEZUX1BvcyAgICAgICAgICBwb3NfeTsKLQotICAgIEZUX1ZlY3RvciAgICAgICBsZWZ0X2JlYXJpbmc7Ci0gICAgRlRfVmVjdG9yICAgICAgIGFkdmFuY2U7Ci0KLSAgICBGVF9CQm94ICAgICAgICAgYmJveDsgICAgICAgICAgLyogYm91bmRpbmcgYm94ICovCi0gICAgVDFfUGFyc2VTdGF0ZSAgIHBhcnNlX3N0YXRlOwotICAgIEZUX0Jvb2wgICAgICAgICBsb2FkX3BvaW50czsKLSAgICBGVF9Cb29sICAgICAgICAgbm9fcmVjdXJzZTsKLQotICAgIEZUX0Jvb2wgICAgICAgICBtZXRyaWNzX29ubHk7Ci0KLSAgICB2b2lkKiAgICAgICAgICAgaGludHNfZnVuY3M7ICAgIC8qIGhpbnRlci1zcGVjaWZpYyAqLwotICAgIHZvaWQqICAgICAgICAgICBoaW50c19nbG9iYWxzOyAgLyogaGludGVyLXNwZWNpZmljICovCi0KLSAgICBUMV9CdWlsZGVyX0Z1bmNzUmVjICBmdW5jczsKLQotICB9IFQxX0J1aWxkZXJSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgVDEgREVDT0RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIDAKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFQxX01BWF9TVUJSU19DQUxMUyBkZXRhaWxzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBuZXN0ZWQgc3ViLXJvdXRpbmUgICAqLwotICAvKiBjYWxscyBkdXJpbmcgZ2x5cGggbG9hZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFQxX01BWF9TVUJSU19DQUxMUyAgOAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUMV9NQVhfQ0hBUlNUUklOR19PUEVSQU5EUyBpcyB0aGUgY2hhcnN0cmluZyBzdGFjaydzIGNhcGFjaXR5LiAgQSAgICAgKi8KLSAgLyogbWluaW11bSBvZiAxNiBpcyByZXF1aXJlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUMV9NQVhfQ0hBUlNUUklOR1NfT1BFUkFORFMgIDMyCi0KLSNlbmRpZiAvKiAwICovCi0KLQotICB0eXBlZGVmIHN0cnVjdCAgVDFfRGVjb2Rlcl9ab25lUmVjXwotICB7Ci0gICAgRlRfQnl0ZSogIGN1cnNvcjsKLSAgICBGVF9CeXRlKiAgYmFzZTsKLSAgICBGVF9CeXRlKiAgbGltaXQ7Ci0KLSAgfSBUMV9EZWNvZGVyX1pvbmVSZWMsICpUMV9EZWNvZGVyX1pvbmU7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCBUMV9EZWNvZGVyUmVjXyogICAgICAgICAgICAgIFQxX0RlY29kZXI7Ci0gIHR5cGVkZWYgY29uc3Qgc3RydWN0IFQxX0RlY29kZXJfRnVuY3NSZWNfKiAgVDFfRGVjb2Rlcl9GdW5jczsKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUMV9EZWNvZGVyX0NhbGxiYWNrKSggVDFfRGVjb2RlciAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgZ2x5cGhfaW5kZXggKTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBUMV9EZWNvZGVyX0Z1bmNzUmVjXwotICB7Ci0gICAgRlRfRXJyb3IKLSAgICAoKmluaXQpKCBUMV9EZWNvZGVyICAgICAgICAgICBkZWNvZGVyLAotICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgRlRfU2l6ZSAgICAgICAgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICAgICAgICBzbG90LAotICAgICAgICAgICAgIEZUX0J5dGUqKiAgICAgICAgICAgIGdseXBoX25hbWVzLAotICAgICAgICAgICAgIFBTX0JsZW5kICAgICAgICAgICAgIGJsZW5kLAotICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICAgICAgIGhpbnRpbmcsCi0gICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgICAgICAgaGludF9tb2RlLAotICAgICAgICAgICAgIFQxX0RlY29kZXJfQ2FsbGJhY2sgIGNhbGxiYWNrICk7Ci0KLSAgICB2b2lkCi0gICAgKCpkb25lKSggVDFfRGVjb2RlciAgZGVjb2RlciApOwotCi0gICAgRlRfRXJyb3IKLSAgICAoKnBhcnNlX2NoYXJzdHJpbmdzKSggVDFfRGVjb2RlciAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgbGVuICk7Ci0KLSAgfSBUMV9EZWNvZGVyX0Z1bmNzUmVjOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFQxX0RlY29kZXJSZWNfCi0gIHsKLSAgICBUMV9CdWlsZGVyUmVjICAgICAgICBidWlsZGVyOwotCi0gICAgRlRfTG9uZyAgICAgICAgICAgICAgc3RhY2tbVDFfTUFYX0NIQVJTVFJJTkdTX09QRVJBTkRTXTsKLSAgICBGVF9Mb25nKiAgICAgICAgICAgICB0b3A7Ci0KLSAgICBUMV9EZWNvZGVyX1pvbmVSZWMgICB6b25lc1tUMV9NQVhfU1VCUlNfQ0FMTFMgKyAxXTsKLSAgICBUMV9EZWNvZGVyX1pvbmUgICAgICB6b25lOwotCi0gICAgRlRfU2VydmljZV9Qc0NNYXBzICAgcHNuYW1lczsgICAgICAvKiBmb3Igc2VhYyAqLwotICAgIEZUX1VJbnQgICAgICAgICAgICAgIG51bV9nbHlwaHM7Ci0gICAgRlRfQnl0ZSoqICAgICAgICAgICAgZ2x5cGhfbmFtZXM7Ci0KLSAgICBGVF9JbnQgICAgICAgICAgICAgICBsZW5JVjsgICAgICAgIC8qIGludGVybmFsIGZvciBzdWIgcm91dGluZSBjYWxscyAqLwotICAgIEZUX1VJbnQgICAgICAgICAgICAgIG51bV9zdWJyczsKLSAgICBGVF9CeXRlKiogICAgICAgICAgICBzdWJyczsKLSAgICBGVF9QdHJEaXN0KiAgICAgICAgICBzdWJyc19sZW47ICAgIC8qIGFycmF5IG9mIHN1YnJzIGxlbmd0aCAob3B0aW9uYWwpICovCi0KLSAgICBGVF9NYXRyaXggICAgICAgICAgICBmb250X21hdHJpeDsKLSAgICBGVF9WZWN0b3IgICAgICAgICAgICBmb250X29mZnNldDsKLQotICAgIEZUX0ludCAgICAgICAgICAgICAgIGZsZXhfc3RhdGU7Ci0gICAgRlRfSW50ICAgICAgICAgICAgICAgbnVtX2ZsZXhfdmVjdG9yczsKLSAgICBGVF9WZWN0b3IgICAgICAgICAgICBmbGV4X3ZlY3RvcnNbN107Ci0KLSAgICBQU19CbGVuZCAgICAgICAgICAgICBibGVuZDsgICAgICAgLyogZm9yIG11bHRpcGxlIG1hc3RlciBzdXBwb3J0ICovCi0KLSAgICBGVF9SZW5kZXJfTW9kZSAgICAgICBoaW50X21vZGU7Ci0KLSAgICBUMV9EZWNvZGVyX0NhbGxiYWNrICBwYXJzZV9jYWxsYmFjazsKLSAgICBUMV9EZWNvZGVyX0Z1bmNzUmVjICBmdW5jczsKLQotICAgIEZUX0xvbmcqICAgICAgICAgICAgIGJ1aWxkY2hhcjsKLSAgICBGVF9VSW50ICAgICAgICAgICAgICBsZW5fYnVpbGRjaGFyOwotCi0gICAgRlRfQm9vbCAgICAgICAgICAgICAgc2VhYzsKLQotICB9IFQxX0RlY29kZXJSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZNIFBBUlNFUiAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIHN0cnVjdCBBRk1fUGFyc2VyUmVjXyogIEFGTV9QYXJzZXI7Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEFGTV9QYXJzZXJfRnVuY3NSZWNfCi0gIHsKLSAgICBGVF9FcnJvcgotICAgICgqaW5pdCkoIEFGTV9QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICBGVF9NZW1vcnkgICBtZW1vcnksCi0gICAgICAgICAgICAgRlRfQnl0ZSogICAgYmFzZSwKLSAgICAgICAgICAgICBGVF9CeXRlKiAgICBsaW1pdCApOwotCi0gICAgdm9pZAotICAgICgqZG9uZSkoIEFGTV9QYXJzZXIgIHBhcnNlciApOwotCi0gICAgRlRfRXJyb3IKLSAgICAoKnBhcnNlKSggQUZNX1BhcnNlciAgcGFyc2VyICk7Ci0KLSAgfSBBRk1fUGFyc2VyX0Z1bmNzUmVjOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgQUZNX1N0cmVhbVJlY18qICBBRk1fU3RyZWFtOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQUZNX1BhcnNlclJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gQUZNX1BhcnNlciBpcyBhIHBhcnNlciBmb3IgdGhlIEFGTSBmaWxlcy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICAgIDo6IFRoZSBvYmplY3QgdXNlZCBmb3IgbWVtb3J5IG9wZXJhdGlvbnMgKGFsbG9jIGFuZCAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICByZWFsbG9jKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtICAgIDo6IFRoaXMgaXMgYW4gb3BhcXVlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGb250SW5mbyAgOjogVGhlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZCBoZXJlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdldF9pbmRleCA6OiBBIHVzZXIgcHJvdmlkZWQgZnVuY3Rpb24gdG8gZ2V0IGEgZ2x5cGggaW5kZXggYnkgaXRzICAqLwotICAvKiAgICAgICAgICAgICAgICAgbmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBBRk1fUGFyc2VyUmVjXwotICB7Ci0gICAgRlRfTWVtb3J5ICAgICBtZW1vcnk7Ci0gICAgQUZNX1N0cmVhbSAgICBzdHJlYW07Ci0KLSAgICBBRk1fRm9udEluZm8gIEZvbnRJbmZvOwotCi0gICAgRlRfSW50Ci0gICAgKCpnZXRfaW5kZXgpKCBjb25zdCBjaGFyKiAgbmFtZSwKLSAgICAgICAgICAgICAgICAgIEZUX09mZnNldCAgICBsZW4sCi0gICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgdXNlcl9kYXRhICk7Ci0KLSAgICB2b2lkKiAgICAgICAgIHVzZXJfZGF0YTsKLQotICB9IEFGTV9QYXJzZXJSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICBUWVBFMSBDSEFSTUFQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIGNvbnN0IHN0cnVjdCBUMV9DTWFwX0NsYXNzZXNSZWNfKiAgVDFfQ01hcF9DbGFzc2VzOwotCi0gIHR5cGVkZWYgc3RydWN0IFQxX0NNYXBfQ2xhc3Nlc1JlY18KLSAgewotICAgIEZUX0NNYXBfQ2xhc3MgIHN0YW5kYXJkOwotICAgIEZUX0NNYXBfQ2xhc3MgIGV4cGVydDsKLSAgICBGVF9DTWFwX0NsYXNzICBjdXN0b207Ci0gICAgRlRfQ01hcF9DbGFzcyAgdW5pY29kZTsKLQotICB9IFQxX0NNYXBfQ2xhc3Nlc1JlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgIFBTQXV4IE1vZHVsZSBJbnRlcmZhY2UgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHR5cGVkZWYgc3RydWN0ICBQU0F1eF9TZXJ2aWNlUmVjXwotICB7Ci0gICAgLyogZG9uJ3QgdXNlIGBQU19UYWJsZV9GdW5jcycgYW5kIGZyaWVuZHMgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MgKi8KLSAgICBjb25zdCBQU19UYWJsZV9GdW5jc1JlYyogICAgcHNfdGFibGVfZnVuY3M7Ci0gICAgY29uc3QgUFNfUGFyc2VyX0Z1bmNzUmVjKiAgIHBzX3BhcnNlcl9mdW5jczsKLSAgICBjb25zdCBUMV9CdWlsZGVyX0Z1bmNzUmVjKiAgdDFfYnVpbGRlcl9mdW5jczsKLSAgICBjb25zdCBUMV9EZWNvZGVyX0Z1bmNzUmVjKiAgdDFfZGVjb2Rlcl9mdW5jczsKLQotICAgIHZvaWQKLSAgICAoKnQxX2RlY3J5cHQpKCBGVF9CeXRlKiAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICBGVF9PZmZzZXQgIGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgIHNlZWQgKTsKLQotICAgIFQxX0NNYXBfQ2xhc3NlcyAgdDFfY21hcF9jbGFzc2VzOwotCi0gICAgLyogZmllbGRzIGFmdGVyIHRoaXMgY29tbWVudCBsaW5lIHdlcmUgYWRkZWQgYWZ0ZXIgdmVyc2lvbiAyLjEuMTAgKi8KLSAgICBjb25zdCBBRk1fUGFyc2VyX0Z1bmNzUmVjKiAgYWZtX3BhcnNlcl9mdW5jczsKLQotICB9IFBTQXV4X1NlcnZpY2VSZWMsICpQU0F1eF9TZXJ2aWNlOwotCi0gIC8qIGJhY2t3YXJkcy1jb21wYXRpYmxlIHR5cGUgZGVmaW5pdGlvbiAqLwotICB0eXBlZGVmIFBTQXV4X1NlcnZpY2VSZWMgICBQU0F1eF9JbnRlcmZhY2U7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgIFNvbWUgY29udmVuaWVuY2UgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBJU19QU19ORVdMSU5FKCBjaCApIFwKLSAgKCAoY2gpID09ICdccicgfHwgICAgICAgICBcCi0gICAgKGNoKSA9PSAnXG4nICkKLQotI2RlZmluZSBJU19QU19TUEFDRSggY2ggKSAgXAotICAoIChjaCkgPT0gJyAnICAgICAgICAgfHwgXAotICAgIElTX1BTX05FV0xJTkUoIGNoICkgfHwgXAotICAgIChjaCkgPT0gJ1x0JyAgICAgICAgfHwgXAotICAgIChjaCkgPT0gJ1xmJyAgICAgICAgfHwgXAotICAgIChjaCkgPT0gJ1wwJyApCi0KLSNkZWZpbmUgSVNfUFNfU1BFQ0lBTCggY2ggKSAgICAgICBcCi0gICggKGNoKSA9PSAnLycgICAgICAgICAgICAgICAgfHwgXAotICAgIChjaCkgPT0gJygnIHx8IChjaCkgPT0gJyknIHx8IFwKLSAgICAoY2gpID09ICc8JyB8fCAoY2gpID09ICc+JyB8fCBcCi0gICAgKGNoKSA9PSAnWycgfHwgKGNoKSA9PSAnXScgfHwgXAotICAgIChjaCkgPT0gJ3snIHx8IChjaCkgPT0gJ30nIHx8IFwKLSAgICAoY2gpID09ICclJyAgICAgICAgICAgICAgICApCi0KLSNkZWZpbmUgSVNfUFNfREVMSU0oIGNoICkgIFwKLSAgKCBJU19QU19TUEFDRSggY2ggKSAgIHx8IFwKLSAgICBJU19QU19TUEVDSUFMKCBjaCApICkKLQotI2RlZmluZSBJU19QU19ESUdJVCggY2ggKSAgICAgICAgXAotICAoIChjaCkgPj0gJzAnICYmIChjaCkgPD0gJzknICkKLQotI2RlZmluZSBJU19QU19YRElHSVQoIGNoICkgICAgICAgICAgICBcCi0gICggSVNfUFNfRElHSVQoIGNoICkgICAgICAgICAgICAgIHx8IFwKLSAgICAoIChjaCkgPj0gJ0EnICYmIChjaCkgPD0gJ0YnICkgfHwgXAotICAgICggKGNoKSA+PSAnYScgJiYgKGNoKSA8PSAnZicgKSApCi0KLSNkZWZpbmUgSVNfUFNfQkFTRTg1KCBjaCApICAgICAgIFwKLSAgKCAoY2gpID49ICchJyAmJiAoY2gpIDw9ICd1JyApCi0KLSNkZWZpbmUgSVNfUFNfVE9LRU4oIGN1ciwgbGltaXQsIHRva2VuICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKCAoY2hhcikoY3VyKVswXSA9PSAodG9rZW4pWzBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFwKLSAgICAoIChjdXIpICsgc2l6ZW9mICggKHRva2VuKSApID09IChsaW1pdCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICggKGN1cikgKyBzaXplb2YoICh0b2tlbikgKSA8IChsaW1pdCkgICAgICAgICAgJiYgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgSVNfUFNfREVMSU0oIChjdXIpW3NpemVvZiAoICh0b2tlbikgKSAtIDFdICkgKSApICAgICAgICAgICAgICYmIFwKLSAgICBmdF9zdHJuY21wKCAoY2hhciopKGN1ciksICh0b2tlbiksIHNpemVvZiAoICh0b2tlbikgKSAtIDEgKSA9PSAwICkKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1BTQVVYX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9wc2hpbnRzLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3BzaGludHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA1ZWE2OC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3BzaGludHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2hpbnRzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSW50ZXJmYWNlIHRvIFBvc3RzY3JpcHQtc3BlY2lmaWMgKFR5cGUgMSBhbmQgVHlwZSAyKSBoaW50cyAgICAgICAgICAgKi8KLS8qICAgIHJlY29yZGVycyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gIFRoZXNlIGFyZSB1c2VkIHRvIHN1cHBvcnQgbmF0aXZlICAgICovCi0vKiAgICBUMS9UMiBoaW50cyBpbiB0aGUgYHR5cGUxJywgYGNpZCcsIGFuZCBgY2ZmJyBmb250IGRyaXZlcnMuICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDAzLCAyMDA1LTIwMDcsIDIwMDksIDIwMTIsIDIwMTQgYnkgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1BTSElOVFNfSF9fCi0jZGVmaW5lIF9fUFNISU5UU19IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX1RZUEUxX1RBQkxFU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICBJTlRFUk5BTCBSRVBSRVNFTlRBVElPTiBPRiBHTE9CQUxTICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIHN0cnVjdCBQU0hfR2xvYmFsc1JlY18qICBQU0hfR2xvYmFsczsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqUFNIX0dsb2JhbHNfTmV3RnVuYykoIEZUX01lbW9yeSAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Qcml2YXRlKiAgIHByaXZhdGVfZGljdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUFNIX0dsb2JhbHMqICBhZ2xvYmFscyApOwotCi0gIHR5cGVkZWYgdm9pZAotICAoKlBTSF9HbG9iYWxzX1NldFNjYWxlRnVuYykoIFBTSF9HbG9iYWxzICBnbG9iYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICB4X3NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICB5X3NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICB4X2RlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICB5X2RlbHRhICk7Ci0KLSAgdHlwZWRlZiB2b2lkCi0gICgqUFNIX0dsb2JhbHNfRGVzdHJveUZ1bmMpKCBQU0hfR2xvYmFscyAgZ2xvYmFscyApOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTSF9HbG9iYWxzX0Z1bmNzUmVjXwotICB7Ci0gICAgUFNIX0dsb2JhbHNfTmV3RnVuYyAgICAgICBjcmVhdGU7Ci0gICAgUFNIX0dsb2JhbHNfU2V0U2NhbGVGdW5jICBzZXRfc2NhbGU7Ci0gICAgUFNIX0dsb2JhbHNfRGVzdHJveUZ1bmMgICBkZXN0cm95OwotCi0gIH0gUFNIX0dsb2JhbHNfRnVuY3NSZWMsICpQU0hfR2xvYmFsc19GdW5jczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgIFBVQkxJQyBUWVBFIDEgSElOVFMgUkVDT1JERVIgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEB0eXBlOgotICAgKiAgIFQxX0hpbnRzCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGlzIGlzIGEgaGFuZGxlIHRvIGFuIG9wYXF1ZSBzdHJ1Y3R1cmUgdXNlZCB0byByZWNvcmQgZ2x5cGggaGludHMKLSAgICogICBmcm9tIGEgVHlwZSAxIGNoYXJhY3RlciBnbHlwaCBjaGFyYWN0ZXIgc3RyaW5nLgotICAgKgotICAgKiAgIFRoZSBtZXRob2RzIHVzZWQgdG8gb3BlcmF0ZSBvbiB0aGlzIG9iamVjdCBhcmUgZGVmaW5lZCBieSB0aGUKLSAgICogICBAVDFfSGludHNfRnVuY3NSZWMgc3RydWN0dXJlLiAgUmVjb3JkaW5nIGdseXBoIGhpbnRzIGlzIG5vcm1hbGx5Ci0gICAqICAgYWNoaWV2ZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHNjaGVtZToKLSAgICoKLSAgICogICAtIE9wZW4gYSBuZXcgaGludCByZWNvcmRpbmcgc2Vzc2lvbiBieSBjYWxsaW5nIHRoZSBgb3BlbicgbWV0aG9kLgotICAgKiAgICAgVGhpcyByZXdpbmRzIHRoZSByZWNvcmRlciBhbmQgcHJlcGFyZSBpdCBmb3IgbmV3IGlucHV0LgotICAgKgotICAgKiAgIC0gRm9yIGVhY2ggaGludCBmb3VuZCBpbiB0aGUgZ2x5cGggY2hhcnN0cmluZywgY2FsbCB0aGUgY29ycmVzcG9uZGluZwotICAgKiAgICAgbWV0aG9kIChgc3RlbScsIGBzdGVtMycsIG9yIGByZXNldCcpLiAgTm90ZSB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBkbwotICAgKiAgICAgbm90IHJldHVybiBhbiBlcnJvciBjb2RlLgotICAgKgotICAgKiAgIC0gQ2xvc2UgdGhlIHJlY29yZGluZyBzZXNzaW9uIGJ5IGNhbGxpbmcgdGhlIGBjbG9zZScgbWV0aG9kLiAgSXQKLSAgICogICAgIHJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGUgaGludHMgd2VyZSBpbnZhbGlkIG9yIHNvbWV0aGluZwotICAgKiAgICAgc3RyYW5nZSBoYXBwZW5lZCAoZS5nLiwgbWVtb3J5IHNob3J0YWdlKS4KLSAgICoKLSAgICogICBUaGUgaGludHMgYWNjdW11bGF0ZWQgaW4gdGhlIG9iamVjdCBjYW4gbGF0ZXIgYmUgdXNlZCBieSB0aGUKLSAgICogICBQb3N0U2NyaXB0IGhpbnRlci4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0IFQxX0hpbnRzUmVjXyogIFQxX0hpbnRzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHR5cGU6Ci0gICAqICAgVDFfSGludHNfRnVuY3MKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgcG9pbnRlciB0byB0aGUgQFQxX0hpbnRzX0Z1bmNzUmVjIHN0cnVjdHVyZSB0aGF0IGRlZmluZXMgdGhlIEFQSSBvZgotICAgKiAgIGEgZ2l2ZW4gQFQxX0hpbnRzIG9iamVjdC4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgY29uc3Qgc3RydWN0IFQxX0hpbnRzX0Z1bmNzUmVjXyogIFQxX0hpbnRzX0Z1bmNzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIFQxX0hpbnRzX09wZW5GdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1ldGhvZCBvZiB0aGUgQFQxX0hpbnRzIGNsYXNzIHVzZWQgdG8gcHJlcGFyZSBpdCBmb3IgYSBuZXcgVHlwZSAxCi0gICAqICAgaGludHMgcmVjb3JkaW5nIHNlc3Npb24uCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBoaW50cyA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFR5cGUgMSBoaW50cyByZWNvcmRlci4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgWW91IHNob3VsZCBhbHdheXMgY2FsbCB0aGUgQFQxX0hpbnRzX0Nsb3NlRnVuYyBtZXRob2QgaW4gb3JkZXIgdG8KLSAgICogICBjbG9zZSBhbiBvcGVuZWQgcmVjb3JkaW5nIHNlc3Npb24uCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpUMV9IaW50c19PcGVuRnVuYykoIFQxX0hpbnRzICBoaW50cyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIFQxX0hpbnRzX1NldFN0ZW1GdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1ldGhvZCBvZiB0aGUgQFQxX0hpbnRzIGNsYXNzIHVzZWQgdG8gcmVjb3JkIGEgbmV3IGhvcml6b250YWwgb3IKLSAgICogICB2ZXJ0aWNhbCBzdGVtLiAgVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgVHlwZSAxIGBoc3RlbScgYW5kIGB2c3RlbScKLSAgICogICBvcGVyYXRvcnMuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBoaW50cyA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFR5cGUgMSBoaW50cyByZWNvcmRlci4KLSAgICoKLSAgICogICBkaW1lbnNpb24gOjoKLSAgICogICAgIDAgZm9yIGhvcml6b250YWwgc3RlbXMgKGhzdGVtKSwgMSBmb3IgdmVydGljYWwgb25lcyAodnN0ZW0pLgotICAgKgotICAgKiAgIGNvb3JkcyA6OgotICAgKiAgICAgQXJyYXkgb2YgMiBjb29yZGluYXRlcyBpbiAxNi4xNiBmb3JtYXQsIHVzZWQgYXMgKHBvc2l0aW9uLGxlbmd0aCkKLSAgICogICAgIHN0ZW0gZGVzY3JpcHRvci4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVXNlIHZlcnRpY2FsIGNvb3JkaW5hdGVzICh5KSBmb3IgaG9yaXpvbnRhbCBzdGVtcyAoZGltPTApLiAgVXNlCi0gICAqICAgaG9yaXpvbnRhbCBjb29yZGluYXRlcyAoeCkgZm9yIHZlcnRpY2FsIHN0ZW1zIChkaW09MSkuCi0gICAqCi0gICAqICAgYGNvb3Jkc1swXScgaXMgdGhlIGFic29sdXRlIHN0ZW0gcG9zaXRpb24gKGxvd2VzdCBjb29yZGluYXRlKTsKLSAgICogICBgY29vcmRzWzFdJyBpcyB0aGUgbGVuZ3RoLgotICAgKgotICAgKiAgIFRoZSBsZW5ndGggY2FuIGJlIG5lZ2F0aXZlLCBpbiB3aGljaCBjYXNlIGl0IG11c3QgYmUgZWl0aGVyIC0yMCBvcgotICAgKiAgIC0yMS4gIEl0IGlzIGludGVycHJldGVkIGFzIGEgYGdob3N0JyBzdGVtLCBhY2NvcmRpbmcgdG8gdGhlIFR5cGUgMQotICAgKiAgIHNwZWNpZmljYXRpb24uCi0gICAqCi0gICAqICAgSWYgdGhlIGxlbmd0aCBpcyAtMjEgKGNvcnJlc3BvbmRpbmcgdG8gYSBib3R0b20gZ2hvc3Qgc3RlbSksIHRoZW4KLSAgICogICB0aGUgcmVhbCBzdGVtIHBvc2l0aW9uIGlzIGBjb29yZHNbMF0rY29vcmRzWzFdJy4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKlQxX0hpbnRzX1NldFN0ZW1GdW5jKSggVDFfSGludHMgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZGltZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdHlwZToKLSAgICogICBUMV9IaW50c19TZXRTdGVtM0Z1bmMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWV0aG9kIG9mIHRoZSBAVDFfSGludHMgY2xhc3MgdXNlZCB0byByZWNvcmQgdGhyZWUKLSAgICogICBjb3VudGVyLWNvbnRyb2xsZWQgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBzdGVtcyBhdCBvbmNlLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgaGludHMgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUeXBlIDEgaGludHMgcmVjb3JkZXIuCi0gICAqCi0gICAqICAgZGltZW5zaW9uIDo6Ci0gICAqICAgICAwIGZvciBob3Jpem9udGFsIHN0ZW1zLCAxIGZvciB2ZXJ0aWNhbCBvbmVzLgotICAgKgotICAgKiAgIGNvb3JkcyA6OgotICAgKiAgICAgQW4gYXJyYXkgb2YgNiB2YWx1ZXMgaW4gMTYuMTYgZm9ybWF0LCBob2xkaW5nIDMgKHBvc2l0aW9uLGxlbmd0aCkKLSAgICogICAgIHBhaXJzIGZvciB0aGUgY291bnRlci1jb250cm9sbGVkIHN0ZW1zLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBVc2UgdmVydGljYWwgY29vcmRpbmF0ZXMgKHkpIGZvciBob3Jpem9udGFsIHN0ZW1zIChkaW09MCkuICBVc2UKLSAgICogICBob3Jpem9udGFsIGNvb3JkaW5hdGVzICh4KSBmb3IgdmVydGljYWwgc3RlbXMgKGRpbT0xKS4KLSAgICoKLSAgICogICBUaGUgbGVuZ3RocyBjYW5ub3QgYmUgbmVnYXRpdmUgKGdob3N0IHN0ZW1zIGFyZSBuZXZlcgotICAgKiAgIGNvdW50ZXItY29udHJvbGxlZCkuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpUMV9IaW50c19TZXRTdGVtM0Z1bmMpKCBUMV9IaW50cyAgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZGltZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgVDFfSGludHNfUmVzZXRGdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1ldGhvZCBvZiB0aGUgQFQxX0hpbnRzIGNsYXNzIHVzZWQgdG8gcmVzZXQgdGhlIHN0ZW1zIGhpbnRzIGluIGEKLSAgICogICByZWNvcmRpbmcgc2Vzc2lvbi4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGhpbnRzIDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byB0aGUgVHlwZSAxIGhpbnRzIHJlY29yZGVyLgotICAgKgotICAgKiAgIGVuZF9wb2ludCA6OgotICAgKiAgICAgVGhlIGluZGV4IG9mIHRoZSBsYXN0IHBvaW50IGluIHRoZSBpbnB1dCBnbHlwaCBpbiB3aGljaCB0aGUKLSAgICogICAgIHByZXZpb3VzbHkgZGVmaW5lZCBoaW50cyBhcHBseS4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKlQxX0hpbnRzX1Jlc2V0RnVuYykoIFQxX0hpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZW5kX3BvaW50ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgVDFfSGludHNfQ2xvc2VGdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1ldGhvZCBvZiB0aGUgQFQxX0hpbnRzIGNsYXNzIHVzZWQgdG8gY2xvc2UgYSBoaW50IHJlY29yZGluZwotICAgKiAgIHNlc3Npb24uCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBoaW50cyA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFR5cGUgMSBoaW50cyByZWNvcmRlci4KLSAgICoKLSAgICogICBlbmRfcG9pbnQgOjoKLSAgICogICAgIFRoZSBpbmRleCBvZiB0aGUgbGFzdCBwb2ludCBpbiB0aGUgaW5wdXQgZ2x5cGguCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhlIGVycm9yIGNvZGUgaXMgc2V0IHRvIGluZGljYXRlIHRoYXQgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHRoZQotICAgKiAgIHJlY29yZGluZyBzZXNzaW9uLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlQxX0hpbnRzX0Nsb3NlRnVuYykoIFQxX0hpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZW5kX3BvaW50ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgVDFfSGludHNfQXBwbHlGdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1ldGhvZCBvZiB0aGUgQFQxX0hpbnRzIGNsYXNzIHVzZWQgdG8gYXBwbHkgaGludHMgdG8gdGhlCi0gICAqICAgY29ycmVzcG9uZGluZyBnbHlwaCBvdXRsaW5lLiAgTXVzdCBiZSBjYWxsZWQgb25jZSBhbGwgaGludHMgaGF2ZSBiZWVuCi0gICAqICAgcmVjb3JkZWQuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBoaW50cyA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFR5cGUgMSBoaW50cyByZWNvcmRlci4KLSAgICoKLSAgICogICBvdXRsaW5lIDo6Ci0gICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBvdXRsaW5lIGRlc2NyaXB0b3IuCi0gICAqCi0gICAqICAgZ2xvYmFscyA6OgotICAgKiAgICAgVGhlIGhpbnRlciBnbG9iYWxzIGZvciB0aGlzIGZvbnQuCi0gICAqCi0gICAqICAgaGludF9tb2RlIDo6Ci0gICAqICAgICBIaW50aW5nIGluZm9ybWF0aW9uLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIE9uIGlucHV0LCBhbGwgcG9pbnRzIHdpdGhpbiB0aGUgb3V0bGluZSBhcmUgaW4gZm9udCBjb29yZGluYXRlcy4gT24KLSAgICogICBvdXRwdXQsIHRoZXkgYXJlIGluIDEvNjR0aCBvZiBwaXhlbHMuCi0gICAqCi0gICAqICAgVGhlIHNjYWxpbmcgdHJhbnNmb3JtYXRpb24gaXMgdGFrZW4gZnJvbSB0aGUgYGdsb2JhbHMnIG9iamVjdCB3aGljaAotICAgKiAgIG11c3QgY29ycmVzcG9uZCB0byB0aGUgc2FtZSBmb250IGFzIHRoZSBnbHlwaC4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUMV9IaW50c19BcHBseUZ1bmMpKCBUMV9IaW50cyAgICAgICAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUFNIX0dsb2JhbHMgICAgIGdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgIGhpbnRfbW9kZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHN0cnVjdDoKLSAgICogICBUMV9IaW50c19GdW5jc1JlYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhlIHN0cnVjdHVyZSB1c2VkIHRvIHByb3ZpZGUgdGhlIEFQSSB0byBAVDFfSGludHMgb2JqZWN0cy4KLSAgICoKLSAgICogQGZpZWxkczoKLSAgICogICBoaW50cyA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFQxIEhpbnRzIHJlY29yZGVyLgotICAgKgotICAgKiAgIG9wZW4gOjoKLSAgICogICAgIFRoZSBmdW5jdGlvbiB0byBvcGVuIGEgcmVjb3JkaW5nIHNlc3Npb24uCi0gICAqCi0gICAqICAgY2xvc2UgOjoKLSAgICogICAgIFRoZSBmdW5jdGlvbiB0byBjbG9zZSBhIHJlY29yZGluZyBzZXNzaW9uLgotICAgKgotICAgKiAgIHN0ZW0gOjoKLSAgICogICAgIFRoZSBmdW5jdGlvbiB0byBzZXQgYSBzaW1wbGUgc3RlbS4KLSAgICoKLSAgICogICBzdGVtMyA6OgotICAgKiAgICAgVGhlIGZ1bmN0aW9uIHRvIHNldCBjb3VudGVyLWNvbnRyb2xsZWQgc3RlbXMuCi0gICAqCi0gICAqICAgcmVzZXQgOjoKLSAgICogICAgIFRoZSBmdW5jdGlvbiB0byByZXNldCBzdGVtIGhpbnRzLgotICAgKgotICAgKiAgIGFwcGx5IDo6Ci0gICAqICAgICBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgdGhlIGhpbnRzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGdseXBoIG91dGxpbmUuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVDFfSGludHNfRnVuY3NSZWNfCi0gIHsKLSAgICBUMV9IaW50cyAgICAgICAgICAgICAgIGhpbnRzOwotICAgIFQxX0hpbnRzX09wZW5GdW5jICAgICAgb3BlbjsKLSAgICBUMV9IaW50c19DbG9zZUZ1bmMgICAgIGNsb3NlOwotICAgIFQxX0hpbnRzX1NldFN0ZW1GdW5jICAgc3RlbTsKLSAgICBUMV9IaW50c19TZXRTdGVtM0Z1bmMgIHN0ZW0zOwotICAgIFQxX0hpbnRzX1Jlc2V0RnVuYyAgICAgcmVzZXQ7Ci0gICAgVDFfSGludHNfQXBwbHlGdW5jICAgICBhcHBseTsKLQotICB9IFQxX0hpbnRzX0Z1bmNzUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgUFVCTElDIFRZUEUgMiBISU5UUyBSRUNPUkRFUiAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHR5cGU6Ci0gICAqICAgVDJfSGludHMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoaXMgaXMgYSBoYW5kbGUgdG8gYW4gb3BhcXVlIHN0cnVjdHVyZSB1c2VkIHRvIHJlY29yZCBnbHlwaCBoaW50cwotICAgKiAgIGZyb20gYSBUeXBlIDIgY2hhcmFjdGVyIGdseXBoIGNoYXJhY3RlciBzdHJpbmcuCi0gICAqCi0gICAqICAgVGhlIG1ldGhvZHMgdXNlZCB0byBvcGVyYXRlIG9uIHRoaXMgb2JqZWN0IGFyZSBkZWZpbmVkIGJ5IHRoZQotICAgKiAgIEBUMl9IaW50c19GdW5jc1JlYyBzdHJ1Y3R1cmUuICBSZWNvcmRpbmcgZ2x5cGggaGludHMgaXMgbm9ybWFsbHkKLSAgICogICBhY2hpZXZlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgc2NoZW1lOgotICAgKgotICAgKiAgIC0gT3BlbiBhIG5ldyBoaW50IHJlY29yZGluZyBzZXNzaW9uIGJ5IGNhbGxpbmcgdGhlIGBvcGVuJyBtZXRob2QuCi0gICAqICAgICBUaGlzIHJld2luZHMgdGhlIHJlY29yZGVyIGFuZCBwcmVwYXJlIGl0IGZvciBuZXcgaW5wdXQuCi0gICAqCi0gICAqICAgLSBGb3IgZWFjaCBoaW50IGZvdW5kIGluIHRoZSBnbHlwaCBjaGFyc3RyaW5nLCBjYWxsIHRoZSBjb3JyZXNwb25kaW5nCi0gICAqICAgICBtZXRob2QgKGBzdGVtcycsIGBoaW50bWFzaycsIGBjb3VudGVycycpLiAgTm90ZSB0aGF0IHRoZXNlCi0gICAqICAgICBmdW5jdGlvbnMgZG8gbm90IHJldHVybiBhbiBlcnJvciBjb2RlLgotICAgKgotICAgKiAgIC0gQ2xvc2UgdGhlIHJlY29yZGluZyBzZXNzaW9uIGJ5IGNhbGxpbmcgdGhlIGBjbG9zZScgbWV0aG9kLiAgSXQKLSAgICogICAgIHJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGUgaGludHMgd2VyZSBpbnZhbGlkIG9yIHNvbWV0aGluZwotICAgKiAgICAgc3RyYW5nZSBoYXBwZW5lZCAoZS5nLiwgbWVtb3J5IHNob3J0YWdlKS4KLSAgICoKLSAgICogICBUaGUgaGludHMgYWNjdW11bGF0ZWQgaW4gdGhlIG9iamVjdCBjYW4gbGF0ZXIgYmUgdXNlZCBieSB0aGUKLSAgICogICBQb3N0c2NyaXB0IGhpbnRlci4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0IFQyX0hpbnRzUmVjXyogIFQyX0hpbnRzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHR5cGU6Ci0gICAqICAgVDJfSGludHNfRnVuY3MKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgcG9pbnRlciB0byB0aGUgQFQyX0hpbnRzX0Z1bmNzUmVjIHN0cnVjdHVyZSB0aGF0IGRlZmluZXMgdGhlIEFQSSBvZgotICAgKiAgIGEgZ2l2ZW4gQFQyX0hpbnRzIG9iamVjdC4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgY29uc3Qgc3RydWN0IFQyX0hpbnRzX0Z1bmNzUmVjXyogIFQyX0hpbnRzX0Z1bmNzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIFQyX0hpbnRzX09wZW5GdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1ldGhvZCBvZiB0aGUgQFQyX0hpbnRzIGNsYXNzIHVzZWQgdG8gcHJlcGFyZSBpdCBmb3IgYSBuZXcgVHlwZSAyCi0gICAqICAgaGludHMgcmVjb3JkaW5nIHNlc3Npb24uCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBoaW50cyA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFR5cGUgMiBoaW50cyByZWNvcmRlci4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgWW91IHNob3VsZCBhbHdheXMgY2FsbCB0aGUgQFQyX0hpbnRzX0Nsb3NlRnVuYyBtZXRob2QgaW4gb3JkZXIgdG8KLSAgICogICBjbG9zZSBhbiBvcGVuZWQgcmVjb3JkaW5nIHNlc3Npb24uCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpUMl9IaW50c19PcGVuRnVuYykoIFQyX0hpbnRzICBoaW50cyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIFQyX0hpbnRzX1N0ZW1zRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMl9IaW50cyBjbGFzcyB1c2VkIHRvIHNldCB0aGUgdGFibGUgb2Ygc3RlbXMgaW4KLSAgICogICBlaXRoZXIgdGhlIHZlcnRpY2FsIG9yIGhvcml6b250YWwgZGltZW5zaW9uLiAgRXF1aXZhbGVudCB0byB0aGUKLSAgICogICBgaHN0ZW0nLCBgdnN0ZW0nLCBgaHN0ZW1obScsIGFuZCBgdnN0ZW1obScgVHlwZSAyIG9wZXJhdG9ycy4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGhpbnRzIDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byB0aGUgVHlwZSAyIGhpbnRzIHJlY29yZGVyLgotICAgKgotICAgKiAgIGRpbWVuc2lvbiA6OgotICAgKiAgICAgMCBmb3IgaG9yaXpvbnRhbCBzdGVtcyAoaHN0ZW0pLCAxIGZvciB2ZXJ0aWNhbCBvbmVzICh2c3RlbSkuCi0gICAqCi0gICAqICAgY291bnQgOjoKLSAgICogICAgIFRoZSBudW1iZXIgb2Ygc3RlbXMuCi0gICAqCi0gICAqICAgY29vcmRzIDo6Ci0gICAqICAgICBBbiBhcnJheSBvZiBgY291bnQnIChwb3NpdGlvbixsZW5ndGgpIHBhaXJzIGluIDE2LjE2IGZvcm1hdC4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVXNlIHZlcnRpY2FsIGNvb3JkaW5hdGVzICh5KSBmb3IgaG9yaXpvbnRhbCBzdGVtcyAoZGltPTApLiAgVXNlCi0gICAqICAgaG9yaXpvbnRhbCBjb29yZGluYXRlcyAoeCkgZm9yIHZlcnRpY2FsIHN0ZW1zIChkaW09MSkuCi0gICAqCi0gICAqICAgVGhlcmUgYXJlIGAyKmNvdW50JyBlbGVtZW50cyBpbiB0aGUgYGNvb3JkcycgYXJyYXkuICBFYWNoIGV2ZW4KLSAgICogICBlbGVtZW50IGlzIGFuIGFic29sdXRlIHBvc2l0aW9uIGluIGZvbnQgdW5pdHMsIGVhY2ggb2RkIGVsZW1lbnQgaXMgYQotICAgKiAgIGxlbmd0aCBpbiBmb250IHVuaXRzLgotICAgKgotICAgKiAgIEEgbGVuZ3RoIGNhbiBiZSBuZWdhdGl2ZSwgaW4gd2hpY2ggY2FzZSBpdCBtdXN0IGJlIGVpdGhlciAtMjAgb3IKLSAgICogICAtMjEuICBJdCBpcyBpbnRlcnByZXRlZCBhcyBhIGBnaG9zdCcgc3RlbSwgYWNjb3JkaW5nIHRvIHRoZSBUeXBlIDEKLSAgICogICBzcGVjaWZpY2F0aW9uLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqVDJfSGludHNfU3RlbXNGdW5jKSggVDJfSGludHMgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGRpbWVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRpbmF0ZXMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdHlwZToKLSAgICogICBUMl9IaW50c19NYXNrRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMl9IaW50cyBjbGFzcyB1c2VkIHRvIHNldCBhIGdpdmVuIGhpbnRtYXNrICh0aGlzCi0gICAqICAgY29ycmVzcG9uZHMgdG8gdGhlIGBoaW50bWFzaycgVHlwZSAyIG9wZXJhdG9yKS4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGhpbnRzIDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byB0aGUgVHlwZSAyIGhpbnRzIHJlY29yZGVyLgotICAgKgotICAgKiAgIGVuZF9wb2ludCA6OgotICAgKiAgICAgVGhlIGdseXBoIGluZGV4IG9mIHRoZSBsYXN0IHBvaW50IHRvIHdoaWNoIHRoZSBwcmV2aW91c2x5IGRlZmluZWQKLSAgICogICAgIG9yIGFjdGl2YXRlZCBoaW50cyBhcHBseS4KLSAgICoKLSAgICogICBiaXRfY291bnQgOjoKLSAgICogICAgIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgaGludCBtYXNrLgotICAgKgotICAgKiAgIGJ5dGVzIDo6Ci0gICAqICAgICBBbiBhcnJheSBvZiBieXRlcyBtb2RlbGxpbmcgdGhlIGhpbnQgbWFzay4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgSWYgdGhlIGhpbnRtYXNrIHN0YXJ0cyB0aGUgY2hhcnN0cmluZyAoYmVmb3JlIGFueSBnbHlwaCBwb2ludAotICAgKiAgIGRlZmluaXRpb24pLCB0aGUgdmFsdWUgb2YgYGVuZF9wb2ludCcgc2hvdWxkIGJlIDAuCi0gICAqCi0gICAqICAgYGJpdF9jb3VudCcgaXMgdGhlIG51bWJlciBvZiBtZWFuaW5nZnVsIGJpdHMgaW4gdGhlIGBieXRlcycgYXJyYXk7IGl0Ci0gICAqICAgbXVzdCBiZSBlcXVhbCB0byB0aGUgdG90YWwgbnVtYmVyIG9mIGhpbnRzIGRlZmluZWQgc28gZmFyIChpLmUuLAotICAgKiAgIGhvcml6b250YWwrdmVydGljYWxzKS4KLSAgICoKLSAgICogICBUaGUgYGJ5dGVzJyBhcnJheSBjYW4gY29tZSBkaXJlY3RseSBmcm9tIHRoZSBUeXBlIDIgY2hhcnN0cmluZyBhbmQKLSAgICogICByZXNwZWN0cyB0aGUgc2FtZSBmb3JtYXQuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpUMl9IaW50c19NYXNrRnVuYykoIFQyX0hpbnRzICAgICAgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBlbmRfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgYml0X2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfQnl0ZSogIGJ5dGVzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgVDJfSGludHNfQ291bnRlckZ1bmMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWV0aG9kIG9mIHRoZSBAVDJfSGludHMgY2xhc3MgdXNlZCB0byBzZXQgYSBnaXZlbiBjb3VudGVyIG1hc2sKLSAgICogICAodGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYGhpbnRtYXNrJyBUeXBlIDIgb3BlcmF0b3IpLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgaGludHMgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUeXBlIDIgaGludHMgcmVjb3JkZXIuCi0gICAqCi0gICAqICAgZW5kX3BvaW50IDo6Ci0gICAqICAgICBBIGdseXBoIGluZGV4IG9mIHRoZSBsYXN0IHBvaW50IHRvIHdoaWNoIHRoZSBwcmV2aW91c2x5IGRlZmluZWQgb3IKLSAgICogICAgIGFjdGl2ZSBoaW50cyBhcHBseS4KLSAgICoKLSAgICogICBiaXRfY291bnQgOjoKLSAgICogICAgIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgaGludCBtYXNrLgotICAgKgotICAgKiAgIGJ5dGVzIDo6Ci0gICAqICAgICBBbiBhcnJheSBvZiBieXRlcyBtb2RlbGxpbmcgdGhlIGhpbnQgbWFzay4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgSWYgdGhlIGhpbnRtYXNrIHN0YXJ0cyB0aGUgY2hhcnN0cmluZyAoYmVmb3JlIGFueSBnbHlwaCBwb2ludAotICAgKiAgIGRlZmluaXRpb24pLCB0aGUgdmFsdWUgb2YgYGVuZF9wb2ludCcgc2hvdWxkIGJlIDAuCi0gICAqCi0gICAqICAgYGJpdF9jb3VudCcgaXMgdGhlIG51bWJlciBvZiBtZWFuaW5nZnVsIGJpdHMgaW4gdGhlIGBieXRlcycgYXJyYXk7IGl0Ci0gICAqICAgbXVzdCBiZSBlcXVhbCB0byB0aGUgdG90YWwgbnVtYmVyIG9mIGhpbnRzIGRlZmluZWQgc28gZmFyIChpLmUuLAotICAgKiAgIGhvcml6b250YWwrdmVydGljYWxzKS4KLSAgICoKLSAgICogICAgVGhlIGBieXRlcycgYXJyYXkgY2FuIGNvbWUgZGlyZWN0bHkgZnJvbSB0aGUgVHlwZSAyIGNoYXJzdHJpbmcgYW5kCi0gICAqICAgIHJlc3BlY3RzIHRoZSBzYW1lIGZvcm1hdC4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKlQyX0hpbnRzX0NvdW50ZXJGdW5jKSggVDJfSGludHMgICAgICAgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIGJpdF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICBieXRlcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIFQyX0hpbnRzX0Nsb3NlRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMl9IaW50cyBjbGFzcyB1c2VkIHRvIGNsb3NlIGEgaGludCByZWNvcmRpbmcKLSAgICogICBzZXNzaW9uLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgaGludHMgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUeXBlIDIgaGludHMgcmVjb3JkZXIuCi0gICAqCi0gICAqICAgZW5kX3BvaW50IDo6Ci0gICAqICAgICBUaGUgaW5kZXggb2YgdGhlIGxhc3QgcG9pbnQgaW4gdGhlIGlucHV0IGdseXBoLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoZSBlcnJvciBjb2RlIGlzIHNldCB0byBpbmRpY2F0ZSB0aGF0IGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUKLSAgICogICByZWNvcmRpbmcgc2Vzc2lvbi4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUMl9IaW50c19DbG9zZUZ1bmMpKCBUMl9IaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGVuZF9wb2ludCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIFQyX0hpbnRzX0FwcGx5RnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMl9IaW50cyBjbGFzcyB1c2VkIHRvIGFwcGx5IGhpbnRzIHRvIHRoZQotICAgKiAgIGNvcnJlc3BvbmRpbmcgZ2x5cGggb3V0bGluZS4gIE11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBgY2xvc2UnCi0gICAqICAgbWV0aG9kLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgaGludHMgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUeXBlIDIgaGludHMgcmVjb3JkZXIuCi0gICAqCi0gICAqICAgb3V0bGluZSA6OgotICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgb3V0bGluZSBkZXNjcmlwdG9yLgotICAgKgotICAgKiAgIGdsb2JhbHMgOjoKLSAgICogICAgIFRoZSBoaW50ZXIgZ2xvYmFscyBmb3IgdGhpcyBmb250LgotICAgKgotICAgKiAgIGhpbnRfbW9kZSA6OgotICAgKiAgICAgSGludGluZyBpbmZvcm1hdGlvbi4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBPbiBpbnB1dCwgYWxsIHBvaW50cyB3aXRoaW4gdGhlIG91dGxpbmUgYXJlIGluIGZvbnQgY29vcmRpbmF0ZXMuIE9uCi0gICAqICAgb3V0cHV0LCB0aGV5IGFyZSBpbiAxLzY0dGggb2YgcGl4ZWxzLgotICAgKgotICAgKiAgIFRoZSBzY2FsaW5nIHRyYW5zZm9ybWF0aW9uIGlzIHRha2VuIGZyb20gdGhlIGBnbG9iYWxzJyBvYmplY3Qgd2hpY2gKLSAgICogICBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIHNhbWUgZm9udCB0aGFuIHRoZSBnbHlwaC4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUMl9IaW50c19BcHBseUZ1bmMpKCBUMl9IaW50cyAgICAgICAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUFNIX0dsb2JhbHMgICAgIGdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgIGhpbnRfbW9kZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHN0cnVjdDoKLSAgICogICBUMl9IaW50c19GdW5jc1JlYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhlIHN0cnVjdHVyZSB1c2VkIHRvIHByb3ZpZGUgdGhlIEFQSSB0byBAVDJfSGludHMgb2JqZWN0cy4KLSAgICoKLSAgICogQGZpZWxkczoKLSAgICogICBoaW50cyA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFQyIGhpbnRzIHJlY29yZGVyIG9iamVjdC4KLSAgICoKLSAgICogICBvcGVuIDo6Ci0gICAqICAgICBUaGUgZnVuY3Rpb24gdG8gb3BlbiBhIHJlY29yZGluZyBzZXNzaW9uLgotICAgKgotICAgKiAgIGNsb3NlIDo6Ci0gICAqICAgICBUaGUgZnVuY3Rpb24gdG8gY2xvc2UgYSByZWNvcmRpbmcgc2Vzc2lvbi4KLSAgICoKLSAgICogICBzdGVtcyA6OgotICAgKiAgICAgVGhlIGZ1bmN0aW9uIHRvIHNldCB0aGUgZGltZW5zaW9uJ3Mgc3RlbXMgdGFibGUuCi0gICAqCi0gICAqICAgaGludG1hc2sgOjoKLSAgICogICAgIFRoZSBmdW5jdGlvbiB0byBzZXQgaGludCBtYXNrcy4KLSAgICoKLSAgICogICBjb3VudGVyIDo6Ci0gICAqICAgICBUaGUgZnVuY3Rpb24gdG8gc2V0IGNvdW50ZXIgbWFza3MuCi0gICAqCi0gICAqICAgYXBwbHkgOjoKLSAgICogICAgIFRoZSBmdW5jdGlvbiB0byBhcHBseSB0aGUgaGludHMgb24gdGhlIGNvcnJlc3BvbmRpbmcgZ2x5cGggb3V0bGluZS4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUMl9IaW50c19GdW5jc1JlY18KLSAgewotICAgIFQyX0hpbnRzICAgICAgICAgICAgICBoaW50czsKLSAgICBUMl9IaW50c19PcGVuRnVuYyAgICAgb3BlbjsKLSAgICBUMl9IaW50c19DbG9zZUZ1bmMgICAgY2xvc2U7Ci0gICAgVDJfSGludHNfU3RlbXNGdW5jICAgIHN0ZW1zOwotICAgIFQyX0hpbnRzX01hc2tGdW5jICAgICBoaW50bWFzazsKLSAgICBUMl9IaW50c19Db3VudGVyRnVuYyAgY291bnRlcjsKLSAgICBUMl9IaW50c19BcHBseUZ1bmMgICAgYXBwbHk7Ci0KLSAgfSBUMl9IaW50c19GdW5jc1JlYzsKLQotCi0gIC8qICovCi0KLQotICB0eXBlZGVmIHN0cnVjdCAgUFNIaW50ZXJfSW50ZXJmYWNlXwotICB7Ci0gICAgUFNIX0dsb2JhbHNfRnVuY3MgICgqZ2V0X2dsb2JhbHNfZnVuY3MpKCBGVF9Nb2R1bGUgIG1vZHVsZSApOwotICAgIFQxX0hpbnRzX0Z1bmNzICAgICAoKmdldF90MV9mdW5jcykgICAgICggRlRfTW9kdWxlICBtb2R1bGUgKTsKLSAgICBUMl9IaW50c19GdW5jcyAgICAgKCpnZXRfdDJfZnVuY3MpICAgICAoIEZUX01vZHVsZSAgbW9kdWxlICk7Ci0KLSAgfSBQU0hpbnRlcl9JbnRlcmZhY2U7Ci0KLSAgdHlwZWRlZiBQU0hpbnRlcl9JbnRlcmZhY2UqICBQU0hpbnRlcl9TZXJ2aWNlOwotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9ERUZJTkVfUFNISU5URVJfSU5URVJGQUNFKCAgICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9nbG9iYWxzX2Z1bmNzXywgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF90MV9mdW5jc18sICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF90Ml9mdW5jc18gKSAgICAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgY29uc3QgUFNIaW50ZXJfSW50ZXJmYWNlICBjbGFzc18gPSAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldF9nbG9iYWxzX2Z1bmNzXywgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldF90MV9mdW5jc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldF90Ml9mdW5jc18gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFRklORV9QU0hJTlRFUl9JTlRFUkZBQ0UoICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9nbG9iYWxzX2Z1bmNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X3QxX2Z1bmNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfdDJfZnVuY3NfICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU0hpbnRlcl9JbnRlcmZhY2UqICBjbGF6eiApICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfZ2xvYmFsc19mdW5jcyA9IGdldF9nbG9iYWxzX2Z1bmNzXzsgICAgICAgICBcCi0gICAgY2xhenotPmdldF90MV9mdW5jcyAgICAgID0gZ2V0X3QxX2Z1bmNzXzsgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X3QyX2Z1bmNzICAgICAgPSBnZXRfdDJfZnVuY3NfOyAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1BTSElOVFNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3NlcnZpY2VzL3N2YmRmLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3NlcnZpY2VzL3N2YmRmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NzQ3NTIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmJkZi5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3ZiZGYuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBCREYgc2VydmljZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLCAyMDA5LCAyMDEyIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fU1ZCREZfSF9fCi0jZGVmaW5lIF9fU1ZCREZfSF9fCi0KLSNpbmNsdWRlIEZUX0JERl9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0jZGVmaW5lIEZUX1NFUlZJQ0VfSURfQkRGICAiYmRmIgotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9CREZfR2V0Q2hhcnNldElkRnVuYykoIEZUX0ZhY2UgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAqYWNoYXJzZXRfZW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgKmFjaGFyc2V0X3JlZ2lzdHJ5ICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0JERl9HZXRQcm9wZXJ0eUZ1bmMpKCBGVF9GYWNlICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgICAgICBwcm9wX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJERl9Qcm9wZXJ0eVJlYyAgKmFwcm9wZXJ0eSApOwotCi0KLSAgRlRfREVGSU5FX1NFUlZJQ0UoIEJERiApCi0gIHsKLSAgICBGVF9CREZfR2V0Q2hhcnNldElkRnVuYyAgZ2V0X2NoYXJzZXRfaWQ7Ci0gICAgRlRfQkRGX0dldFByb3BlcnR5RnVuYyAgIGdldF9wcm9wZXJ0eTsKLSAgfTsKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfQkRGUmVjKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2NoYXJzZXRfaWRfLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9wcm9wZXJ0eV8gKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfQkRGUmVjICBjbGFzc18gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldF9jaGFyc2V0X2lkXywgZ2V0X3Byb3BlcnR5XyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9CREZSZWMoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfY2hhcnNldF9pZF8sICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Byb3BlcnR5XyApICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9TZXJ2aWNlX0JERlJlYyogIGNsYXp6ICkgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfY2hhcnNldF9pZCA9IGdldF9jaGFyc2V0X2lkXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X3Byb3BlcnR5ICAgPSBnZXRfcHJvcGVydHlfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIF9fU1ZCREZfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3NlcnZpY2VzL3N2Y2lkLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3NlcnZpY2VzL3N2Y2lkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZTNmOTMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmNpZC5oCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3ZjaWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBDSUQgZm9udCBzZXJ2aWNlcyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LCAyMDA5LCAyMDEyIGJ5IERlcmVrIENsZWdnLCBNaWNoYWVsIFRvZnRkYWwuICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19TVkNJRF9IX18KLSNkZWZpbmUgX19TVkNJRF9IX18KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotI2RlZmluZSBGVF9TRVJWSUNFX0lEX0NJRCAgIkNJRCIKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfQ0lEX0dldFJlZ2lzdHJ5T3JkZXJpbmdTdXBwbGVtZW50RnVuYykoIEZUX0ZhY2UgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICpyZWdpc3RyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICpvcmRlcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICpzdXBwbGVtZW50ICk7Ci0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9DSURfR2V0SXNJbnRlcm5hbGx5Q0lES2V5ZWRGdW5jKSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICppc19jaWQgKTsKLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0NJRF9HZXRDSURGcm9tR2x5cGhJbmRleEZ1bmMpKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAqY2lkICk7Ci0KLSAgRlRfREVGSU5FX1NFUlZJQ0UoIENJRCApCi0gIHsKLSAgICBGVF9DSURfR2V0UmVnaXN0cnlPcmRlcmluZ1N1cHBsZW1lbnRGdW5jICBnZXRfcm9zOwotICAgIEZUX0NJRF9HZXRJc0ludGVybmFsbHlDSURLZXllZEZ1bmMgICAgICAgIGdldF9pc19jaWQ7Ci0gICAgRlRfQ0lEX0dldENJREZyb21HbHlwaEluZGV4RnVuYyAgICAgICAgICAgZ2V0X2NpZF9mcm9tX2dseXBoX2luZGV4OwotICB9OwotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9DSURSRUMoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcm9zXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2lzX2NpZF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9jaWRfZnJvbV9nbHlwaF9pbmRleF8gKSAgICAgICAgICAgICAgIFwKLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfQ0lEUmVjIGNsYXNzXyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldF9yb3NfLCBnZXRfaXNfY2lkXywgZ2V0X2NpZF9mcm9tX2dseXBoX2luZGV4XyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9DSURSRUMoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcm9zXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2lzX2NpZF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9jaWRfZnJvbV9nbHlwaF9pbmRleF8gKSAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VfQ0lEUmVjKiAgY2xhenogKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X3JvcyAgICAgICAgICAgICAgICAgID0gZ2V0X3Jvc187ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9pc19jaWQgICAgICAgICAgICAgICA9IGdldF9pc19jaWRfOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfY2lkX2Zyb21fZ2x5cGhfaW5kZXggPSBnZXRfY2lkX2Zyb21fZ2x5cGhfaW5kZXhfOyAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19TVkNJRF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvc2VydmljZXMvc3ZnbGRpY3QuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvc2VydmljZXMvc3ZnbGRpY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQxMjUzNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3NlcnZpY2VzL3N2Z2xkaWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdmdsZGljdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIGdseXBoIGRpY3Rpb25hcnkgc2VydmljZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMsIDIwMDksIDIwMTIgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19TVkdMRElDVF9IX18KLSNkZWZpbmUgX19TVkdMRElDVF9IX18KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKgotICAgKiAgQSBzZXJ2aWNlIHVzZWQgdG8gcmV0cmlldmUgZ2x5cGggbmFtZXMsIGFzIHdlbGwgYXMgdG8gZmluZCB0aGUKLSAgICogIGluZGV4IG9mIGEgZ2l2ZW4gZ2x5cGggbmFtZSBpbiBhIGZvbnQuCi0gICAqCi0gICAqLwotCi0jZGVmaW5lIEZUX1NFUlZJQ0VfSURfR0xZUEhfRElDVCAgImdseXBoLWRpY3QiCi0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfR2x5cGhEaWN0X0dldE5hbWVGdW5jKSggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgYnVmZmVyX21heCApOwotCi0gIHR5cGVkZWYgRlRfVUludAotICAoKkZUX0dseXBoRGljdF9OYW1lSW5kZXhGdW5jKSggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmluZyogIGdseXBoX25hbWUgKTsKLQotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBHbHlwaERpY3QgKQotICB7Ci0gICAgRlRfR2x5cGhEaWN0X0dldE5hbWVGdW5jICAgIGdldF9uYW1lOwotICAgIEZUX0dseXBoRGljdF9OYW1lSW5kZXhGdW5jICBuYW1lX2luZGV4OyAgLyogb3B0aW9uYWwgKi8KLSAgfTsKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfR0xZUEhESUNUUkVDKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9uYW1lXywgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9pbmRleF8pICAgICAgICAgICAgICAgICAgIFwKLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfR2x5cGhEaWN0UmVjICBjbGFzc18gPSAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X25hbWVfLCBuYW1lX2luZGV4XyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9HTFlQSERJQ1RSRUMoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X25hbWVfLCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2luZGV4XykgICAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlX0dseXBoRGljdFJlYyogIGNsYXp6ICkgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfbmFtZSAgID0gZ2V0X25hbWVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPm5hbWVfaW5kZXggPSBuYW1lX2luZGV4XzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19TVkdMRElDVF9IX18gKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvc2VydmljZXMvc3ZneHZhbC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmd4dmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZGFiNTAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmd4dmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdmd4dmFsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciB2YWxpZGF0aW5nIFRydWVUeXBlR1gvQUFUIHRhYmxlcyAoc3BlY2lmaWNhdGlvbikuICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQsIDIwMDUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuICAgICAgICAqLwotLyogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5ICAgICAgKi8KLS8qIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fU1ZHWFZBTF9IX18KLSNkZWZpbmUgX19TVkdYVkFMX0hfXwotCi0jaW5jbHVkZSBGVF9HWF9WQUxJREFURV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9WQUxJREFURV9ICi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9HWF9WQUxJREFURSAgICAgICAgICAgInRydWV0eXBlZ3gtdmFsaWRhdGUiCi0jZGVmaW5lIEZUX1NFUlZJQ0VfSURfQ0xBU1NJQ0tFUk5fVkFMSURBVEUgICJjbGFzc2lja2Vybi12YWxpZGF0ZSIKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqZ3h2X3ZhbGlkYXRlX2Z1bmMpKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBneF9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICB0YWJsZXNbRlRfVkFMSURBVEVfR1hfTEVOR1RIXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICB0YWJsZV9sZW5ndGggKTsKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpja2Vybl92YWxpZGF0ZV9mdW5jKSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBja2Vybl9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICpja2Vybl90YWJsZSApOwotCi0KLSAgRlRfREVGSU5FX1NFUlZJQ0UoIEdYdmFsaWRhdGUgKQotICB7Ci0gICAgZ3h2X3ZhbGlkYXRlX2Z1bmMgIHZhbGlkYXRlOwotICB9OwotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBDS0VSTnZhbGlkYXRlICkKLSAgewotICAgIGNrZXJuX3ZhbGlkYXRlX2Z1bmMgIHZhbGlkYXRlOwotICB9OwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX1NWR1hWQUxfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3NlcnZpY2VzL3N2a2Vybi5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmtlcm4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ4OGFkZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3NlcnZpY2VzL3N2a2Vybi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3ZrZXJuLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBLZXJuaW5nIHNlcnZpY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA2IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fU1ZLRVJOX0hfXwotI2RlZmluZSBfX1NWS0VSTl9IX18KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUJMRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0jZGVmaW5lIEZUX1NFUlZJQ0VfSURfS0VSTklORyAgImtlcm5pbmciCi0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfS2VybmluZ19UcmFja0dldEZ1bmMpKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgIHBvaW50X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGRlZ3JlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgYWtlcm5pbmcgKTsKLQotICBGVF9ERUZJTkVfU0VSVklDRSggS2VybmluZyApCi0gIHsKLSAgICBGVF9LZXJuaW5nX1RyYWNrR2V0RnVuYyAgZ2V0X3RyYWNrOwotICB9OwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX1NWS0VSTl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtbS5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm1tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOGE2NjMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm1tLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3ZtbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBNdWx0aXBsZSBNYXN0ZXJzIGFuZCBHWCB2YXIgc2VydmljZXMgKHNwZWNpZmljYXRpb24pLiAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLCAyMDA0LCAyMDA5LCAyMDEyIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fU1ZNTV9IX18KLSNkZWZpbmUgX19TVk1NX0hfXwotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qCi0gICAqICBBIHNlcnZpY2UgdXNlZCB0byBtYW5hZ2UgbXVsdGlwbGUtbWFzdGVycyBkYXRhIGluIGEgZ2l2ZW4gZmFjZS4KLSAgICoKLSAgICogIFNlZSB0aGUgcmVsYXRlZCBBUElzIGluIGBmdG1tLmgnIChGVF9NVUxUSVBMRV9NQVNURVJTX0gpLgotICAgKgotICAgKi8KLQotI2RlZmluZSBGVF9TRVJWSUNFX0lEX01VTFRJX01BU1RFUlMgICJtdWx0aS1tYXN0ZXJzIgotCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0dldF9NTV9GdW5jKSggRlRfRmFjZSAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX011bHRpX01hc3RlciogIG1hc3RlciApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9HZXRfTU1fVmFyX0Z1bmMpKCBGVF9GYWNlICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NTV9WYXIqICAqbWFzdGVyICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX1NldF9NTV9EZXNpZ25fRnVuYykoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICBjb29yZHMgKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfU2V0X1Zhcl9EZXNpZ25fRnVuYykoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9TZXRfTU1fQmxlbmRfRnVuYykoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgY29vcmRzICk7Ci0KLQotICBGVF9ERUZJTkVfU0VSVklDRSggTXVsdGlNYXN0ZXJzICkKLSAgewotICAgIEZUX0dldF9NTV9GdW5jICAgICAgICAgIGdldF9tbTsKLSAgICBGVF9TZXRfTU1fRGVzaWduX0Z1bmMgICBzZXRfbW1fZGVzaWduOwotICAgIEZUX1NldF9NTV9CbGVuZF9GdW5jICAgIHNldF9tbV9ibGVuZDsKLSAgICBGVF9HZXRfTU1fVmFyX0Z1bmMgICAgICBnZXRfbW1fdmFyOwotICAgIEZUX1NldF9WYXJfRGVzaWduX0Z1bmMgIHNldF92YXJfZGVzaWduOwotICB9OwotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9NVUxUSU1BU1RFUlNSRUMoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbW1fLCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X21tX2Rlc2lnbl8sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9tbV9ibGVuZF8sICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbW1fdmFyXywgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3Zhcl9kZXNpZ25fICkgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZV9NdWx0aU1hc3RlcnNSZWMgIGNsYXNzXyA9ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X21tXywgc2V0X21tX2Rlc2lnbl8sIHNldF9tbV9ibGVuZF8sIGdldF9tbV92YXJfLCBzZXRfdmFyX2Rlc2lnbl8gICAgXAotICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX01VTFRJTUFTVEVSU1JFQyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9tbV8sICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfbW1fZGVzaWduXywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X21tX2JsZW5kXywgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9tbV92YXJfLCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfdmFyX2Rlc2lnbl8gKSAgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX1NlcnZpY2VfTXVsdGlNYXN0ZXJzUmVjKiAgY2xhenogKSAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9tbSAgICAgICAgID0gZ2V0X21tXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5zZXRfbW1fZGVzaWduICA9IHNldF9tbV9kZXNpZ25fOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+c2V0X21tX2JsZW5kICAgPSBzZXRfbW1fYmxlbmRfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9tbV92YXIgICAgID0gZ2V0X21tX3Zhcl87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5zZXRfdmFyX2Rlc2lnbiA9IHNldF92YXJfZGVzaWduXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fU1ZNTV9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvc2VydmljZXMvc3ZvdHZhbC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm90dmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MGJiZDUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm90dmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdm90dmFsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIE9wZW5UeXBlIHZhbGlkYXRpb24gc2VydmljZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQsIDIwMDYgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19TVk9UVkFMX0hfXwotI2RlZmluZSBfX1NWT1RWQUxfSF9fCi0KLSNpbmNsdWRlIEZUX09QRU5UWVBFX1ZBTElEQVRFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1ZBTElEQVRFX0gKLQotRlRfQkVHSU5fSEVBREVSCi0KLQotI2RlZmluZSBGVF9TRVJWSUNFX0lEX09QRU5UWVBFX1ZBTElEQVRFICAib3BlbnR5cGUtdmFsaWRhdGUiCi0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqb3R2X3ZhbGlkYXRlX2Z1bmMpKCBGVF9GYWNlIHZvbGF0aWxlICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgb3RfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICAgICpiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgICAqZ2RlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgICAgKmdwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICAgICpnc3ViLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgICAqanN0ZiApOwotCi0KLSAgRlRfREVGSU5FX1NFUlZJQ0UoIE9UdmFsaWRhdGUgKQotICB7Ci0gICAgb3R2X3ZhbGlkYXRlX2Z1bmMgIHZhbGlkYXRlOwotICB9OwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX1NWT1RWQUxfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3NlcnZpY2VzL3N2cGZyLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3NlcnZpY2VzL3N2cGZyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2Mjc4NmYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBmci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3ZwZnIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEludGVybmFsIFBGUiBzZXJ2aWNlIGZ1bmN0aW9ucyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLCAyMDA2IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fU1ZQRlJfSF9fCi0jZGVmaW5lIF9fU1ZQRlJfSF9fCi0KLSNpbmNsdWRlIEZUX1BGUl9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0jZGVmaW5lIEZUX1NFUlZJQ0VfSURfUEZSX01FVFJJQ1MgICJwZnItbWV0cmljcyIKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9QRlJfR2V0TWV0cmljc0Z1bmMpKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICphb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgKmFtZXRyaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAqYXhfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICpheV9zY2FsZSApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9QRlJfR2V0S2VybmluZ0Z1bmMpKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yICAqYXZlY3RvciApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9QRlJfR2V0QWR2YW5jZUZ1bmMpKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICphYWR2YW5jZSApOwotCi0KLSAgRlRfREVGSU5FX1NFUlZJQ0UoIFBmck1ldHJpY3MgKQotICB7Ci0gICAgRlRfUEZSX0dldE1ldHJpY3NGdW5jICBnZXRfbWV0cmljczsKLSAgICBGVF9QRlJfR2V0S2VybmluZ0Z1bmMgIGdldF9rZXJuaW5nOwotICAgIEZUX1BGUl9HZXRBZHZhbmNlRnVuYyAgZ2V0X2FkdmFuY2U7Ci0KLSAgfTsKLQotIC8qICovCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fU1ZQRlJfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3NlcnZpY2VzL3N2cG9zdG5tLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3NlcnZpY2VzL3N2cG9zdG5tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NmI0ZmUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBvc3RubS5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3Zwb3N0bm0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBQb3N0U2NyaXB0IG5hbWUgc2VydmljZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLCAyMDA3LCAyMDA5LCAyMDEyIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fU1ZQT1NUTk1fSF9fCi0jZGVmaW5lIF9fU1ZQT1NUTk1fSF9fCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0gIC8qCi0gICAqICBBIHRyaXZpYWwgc2VydmljZSB1c2VkIHRvIHJldHJpZXZlIHRoZSBQb3N0U2NyaXB0IG5hbWUgb2YgYSBnaXZlbgotICAgKiAgZm9udCB3aGVuIGF2YWlsYWJsZS4gIFRoZSBgZ2V0X25hbWUnIGZpZWxkIHNob3VsZCBuZXZlciBiZSBOVUxMLgotICAgKgotICAgKiAgVGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24gY2FuIHJldHVybiBOVUxMIHRvIGluZGljYXRlIHRoYXQgdGhlCi0gICAqICBQb3N0U2NyaXB0IG5hbWUgaXMgbm90IGF2YWlsYWJsZS4KLSAgICoKLSAgICogIFRoZSBuYW1lIGlzIG93bmVkIGJ5IHRoZSBmYWNlIGFuZCB3aWxsIGJlIGRlc3Ryb3llZCB3aXRoIGl0LgotICAgKi8KLQotI2RlZmluZSBGVF9TRVJWSUNFX0lEX1BPU1RTQ1JJUFRfRk9OVF9OQU1FICAicG9zdHNjcmlwdC1mb250LW5hbWUiCi0KLQotICB0eXBlZGVmIGNvbnN0IGNoYXIqCi0gICgqRlRfUHNOYW1lX0dldEZ1bmMpKCBGVF9GYWNlICBmYWNlICk7Ci0KLQotICBGVF9ERUZJTkVfU0VSVklDRSggUHNGb250TmFtZSApCi0gIHsKLSAgICBGVF9Qc05hbWVfR2V0RnVuYyAgZ2V0X3BzX2ZvbnRfbmFtZTsKLSAgfTsKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfUFNGT05UTkFNRVJFQyggY2xhc3NfLCBnZXRfcHNfZm9udF9uYW1lXyApIFwKLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfUHNGb250TmFtZVJlYyAgY2xhc3NfID0gICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfcHNfZm9udF9uYW1lXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9QU0ZPTlROQU1FUkVDKCBjbGFzc18sIGdldF9wc19mb250X25hbWVfICkgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgICAgICAgIGxpYnJhcnksICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VfUHNGb250TmFtZVJlYyogIGNsYXp6ICkgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfcHNfZm9udF9uYW1lID0gZ2V0X3BzX2ZvbnRfbmFtZV87ICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX1NWUE9TVE5NX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnByb3AuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwcm9wLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZGEwYmIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnByb3AuaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2cHJvcC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgcHJvcGVydHkgc2VydmljZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxMiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1NWUFJPUF9IX18KLSNkZWZpbmUgX19TVlBST1BfSF9fCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotI2RlZmluZSBGVF9TRVJWSUNFX0lEX1BST1BFUlRJRVMgICJwcm9wZXJ0aWVzIgotCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX1Byb3BlcnRpZXNfU2V0RnVuYykoIEZUX01vZHVsZSAgICBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHByb3BlcnR5X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogIHZhbHVlICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX1Byb3BlcnRpZXNfR2V0RnVuYykoIEZUX01vZHVsZSAgICBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHByb3BlcnR5X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIHZhbHVlICk7Ci0KLQotICBGVF9ERUZJTkVfU0VSVklDRSggUHJvcGVydGllcyApCi0gIHsKLSAgICBGVF9Qcm9wZXJ0aWVzX1NldEZ1bmMgIHNldF9wcm9wZXJ0eTsKLSAgICBGVF9Qcm9wZXJ0aWVzX0dldEZ1bmMgIGdldF9wcm9wZXJ0eTsKLSAgfTsKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfUFJPUEVSVElFU1JFQyggY2xhc3NfLCAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcm9wZXJ0eV8sICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcHJvcGVydHlfICkgIFwKLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfUHJvcGVydGllc1JlYyAgY2xhc3NfID0gICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNldF9wcm9wZXJ0eV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfcHJvcGVydHlfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfUFJPUEVSVElFU1JFQyggY2xhc3NfLCAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcm9wZXJ0eV8sICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcHJvcGVydHlfICkgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfU2VydmljZV9Qcm9wZXJ0aWVzUmVjKiAgY2xhenogKSAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+c2V0X3Byb3BlcnR5ID0gc2V0X3Byb3BlcnR5XzsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9wcm9wZXJ0eSA9IGdldF9wcm9wZXJ0eV87ICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX1NWUFJPUF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2NtYXAuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2NtYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMwOTQ4ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNjbWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3Zwc2NtYXAuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBQb3N0U2NyaXB0IGNoYXJtYXAgc2VydmljZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLCAyMDA2LCAyMDA5LCAyMDEyIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fU1ZQU0NNQVBfSF9fCi0jZGVmaW5lIF9fU1ZQU0NNQVBfSF9fCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0NNQVBTICAicG9zdHNjcmlwdC1jbWFwcyIKLQotCi0gIC8qCi0gICAqICBBZG9iZSBnbHlwaCBuYW1lIHRvIHVuaWNvZGUgdmFsdWUuCi0gICAqLwotICB0eXBlZGVmIEZUX1VJbnQzMgotICAoKlBTX1VuaWNvZGVfVmFsdWVGdW5jKSggY29uc3QgY2hhciogIGdseXBoX25hbWUgKTsKLQotICAvKgotICAgKiAgTWFjaW50b3NoIG5hbWUgaWQgdG8gZ2x5cGggbmFtZS4gIE5VTEwgaWYgaW52YWxpZCBpbmRleC4KLSAgICovCi0gIHR5cGVkZWYgY29uc3QgY2hhcioKLSAgKCpQU19NYWNpbnRvc2hfTmFtZUZ1bmMpKCBGVF9VSW50ICBuYW1lX2luZGV4ICk7Ci0KLSAgLyoKLSAgICogIEFkb2JlIHN0YW5kYXJkIHN0cmluZyBJRCB0byBnbHlwaCBuYW1lLiAgTlVMTCBpZiBpbnZhbGlkIGluZGV4LgotICAgKi8KLSAgdHlwZWRlZiBjb25zdCBjaGFyKgotICAoKlBTX0Fkb2JlX1N0ZF9TdHJpbmdzRnVuYykoIEZUX1VJbnQgIHN0cmluZ19pbmRleCApOwotCi0KLSAgLyoKLSAgICogIFNpbXBsZSB1bmljb2RlIC0+IGdseXBoIGluZGV4IGNoYXJtYXAgYnVpbHQgZnJvbSBmb250IGdseXBoIG5hbWVzCi0gICAqICB0YWJsZS4KLSAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU19VbmlNYXBfCi0gIHsKLSAgICBGVF9VSW50MzIgIHVuaWNvZGU7ICAgICAgLyogYml0IDMxIHNldDogaXMgZ2x5cGggdmFyaWFudCAqLwotICAgIEZUX1VJbnQgICAgZ2x5cGhfaW5kZXg7Ci0KLSAgfSBQU19VbmlNYXA7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCBQU19Vbmljb2Rlc1JlY18qICBQU19Vbmljb2RlczsKLQotICB0eXBlZGVmIHN0cnVjdCAgUFNfVW5pY29kZXNSZWNfCi0gIHsKLSAgICBGVF9DTWFwUmVjICBjbWFwOwotICAgIEZUX1VJbnQgICAgIG51bV9tYXBzOwotICAgIFBTX1VuaU1hcCogIG1hcHM7Ci0KLSAgfSBQU19Vbmljb2Rlc1JlYzsKLQotCi0gIC8qCi0gICAqICBBIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYSBnbHlwaCBuYW1lIGZvciBhIGdpdmVuIGluZGV4LiAgUmV0dXJucwotICAgKiAgTlVMTCBpZiBpbnZhbGlkIGluZGV4LgotICAgKi8KLSAgdHlwZWRlZiBjb25zdCBjaGFyKgotICAoKlBTX0dldEdseXBoTmFtZUZ1bmMpKCBGVF9Qb2ludGVyICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBzdHJpbmdfaW5kZXggKTsKLQotICAvKgotICAgKiAgQSBmdW5jdGlvbiB1c2VkIHRvIHJlbGVhc2UgdGhlIGdseXBoIG5hbWUgcmV0dXJuZWQgYnkKLSAgICogIFBTX0dldEdseXBoTmFtZUZ1bmMsIHdoZW4gbmVlZGVkCi0gICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpQU19GcmVlR2x5cGhOYW1lRnVuYykoIEZUX1BvaW50ZXIgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgbmFtZSApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpQU19Vbmljb2Rlc19Jbml0RnVuYykoIEZUX01lbW9yeSAgICAgICAgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQU19Vbmljb2RlcyAgICAgICAgICAgdW5pY29kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgICAgbnVtX2dseXBocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTX0dldEdseXBoTmFtZUZ1bmMgICBnZXRfZ2x5cGhfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTX0ZyZWVHbHlwaE5hbWVGdW5jICBmcmVlX2dseXBoX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICAgICAgICAgICAgZ2x5cGhfZGF0YSApOwotCi0gIHR5cGVkZWYgRlRfVUludAotICAoKlBTX1VuaWNvZGVzX0NoYXJJbmRleEZ1bmMpKCBQU19Vbmljb2RlcyAgdW5pY29kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgICB1bmljb2RlICk7Ci0KLSAgdHlwZWRlZiBGVF9VSW50MzIKLSAgKCpQU19Vbmljb2Rlc19DaGFyTmV4dEZ1bmMpKCBQU19Vbmljb2RlcyAgdW5pY29kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAgKnVuaWNvZGUgKTsKLQotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBQc0NNYXBzICkKLSAgewotICAgIFBTX1VuaWNvZGVfVmFsdWVGdW5jICAgICAgIHVuaWNvZGVfdmFsdWU7Ci0KLSAgICBQU19Vbmljb2Rlc19Jbml0RnVuYyAgICAgICB1bmljb2Rlc19pbml0OwotICAgIFBTX1VuaWNvZGVzX0NoYXJJbmRleEZ1bmMgIHVuaWNvZGVzX2NoYXJfaW5kZXg7Ci0gICAgUFNfVW5pY29kZXNfQ2hhck5leHRGdW5jICAgdW5pY29kZXNfY2hhcl9uZXh0OwotCi0gICAgUFNfTWFjaW50b3NoX05hbWVGdW5jICAgICAgbWFjaW50b3NoX25hbWU7Ci0gICAgUFNfQWRvYmVfU3RkX1N0cmluZ3NGdW5jICAgYWRvYmVfc3RkX3N0cmluZ3M7Ci0gICAgY29uc3QgdW5zaWduZWQgc2hvcnQqICAgICAgYWRvYmVfc3RkX2VuY29kaW5nOwotICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0KiAgICAgIGFkb2JlX2V4cGVydF9lbmNvZGluZzsKLSAgfTsKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfUFNDTUFQU1JFQyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGVfdmFsdWVfLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2Rlc19pbml0XywgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZXNfY2hhcl9pbmRleF8sICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGVzX2NoYXJfbmV4dF8sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNpbnRvc2hfbmFtZV8sICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRvYmVfc3RkX3N0cmluZ3NfLCAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkb2JlX3N0ZF9lbmNvZGluZ18sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZG9iZV9leHBlcnRfZW5jb2RpbmdfICkgICAgICAgICAgICAgIFwKLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfUHNDTWFwc1JlYyAgY2xhc3NfID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVuaWNvZGVfdmFsdWVfLCB1bmljb2Rlc19pbml0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1bmljb2Rlc19jaGFyX2luZGV4XywgdW5pY29kZXNfY2hhcl9uZXh0XywgbWFjaW50b3NoX25hbWVfLCAgICAgICAgICAgICBcCi0gICAgYWRvYmVfc3RkX3N0cmluZ3NfLCBhZG9iZV9zdGRfZW5jb2RpbmdfLCBhZG9iZV9leHBlcnRfZW5jb2RpbmdfICAgICAgICAgXAotICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX1BTQ01BUFNSRUMoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlX3ZhbHVlXywgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZXNfaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGVzX2NoYXJfaW5kZXhfLCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2Rlc19jaGFyX25leHRfLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjaW50b3NoX25hbWVfLCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkb2JlX3N0ZF9zdHJpbmdzXywgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZG9iZV9zdGRfZW5jb2RpbmdfLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRvYmVfZXhwZXJ0X2VuY29kaW5nXyApICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlX1BzQ01hcHNSZWMqICBjbGF6eiApICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnVuaWNvZGVfdmFsdWUgICAgICAgICA9IHVuaWNvZGVfdmFsdWVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT51bmljb2Rlc19pbml0ICAgICAgICAgPSB1bmljb2Rlc19pbml0XzsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+dW5pY29kZXNfY2hhcl9pbmRleCAgID0gdW5pY29kZXNfY2hhcl9pbmRleF87ICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnVuaWNvZGVzX2NoYXJfbmV4dCAgICA9IHVuaWNvZGVzX2NoYXJfbmV4dF87ICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5tYWNpbnRvc2hfbmFtZSAgICAgICAgPSBtYWNpbnRvc2hfbmFtZV87ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+YWRvYmVfc3RkX3N0cmluZ3MgICAgID0gYWRvYmVfc3RkX3N0cmluZ3NfOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmFkb2JlX3N0ZF9lbmNvZGluZyAgICA9IGFkb2JlX3N0ZF9lbmNvZGluZ187ICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5hZG9iZV9leHBlcnRfZW5jb2RpbmcgPSBhZG9iZV9leHBlcnRfZW5jb2RpbmdfOyAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19TVlBTQ01BUF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2luZm8uaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2luZm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJmYjUwNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNpbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3Zwc2luZm8uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBQb3N0U2NyaXB0IGluZm8gc2VydmljZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLCAyMDA0LCAyMDA5LCAyMDExLCAyMDEyIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fU1ZQU0lORk9fSF9fCi0jZGVmaW5lIF9fU1ZQU0lORk9fSF9fCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFlQRTFfVFlQRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0lORk8gICJwb3N0c2NyaXB0LWluZm8iCi0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqUFNfR2V0Rm9udEluZm9GdW5jKSggRlRfRmFjZSAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIFBTX0ZvbnRJbmZvUmVjKiAgYWZvbnRfaW5mbyApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpQU19HZXRGb250RXh0cmFGdW5jKSggRlRfRmFjZSAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUFNfRm9udEV4dHJhUmVjKiAgYWZvbnRfZXh0cmEgKTsKLQotICB0eXBlZGVmIEZUX0ludAotICAoKlBTX0hhc0dseXBoTmFtZXNGdW5jKSggRlRfRmFjZSAgZmFjZSApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpQU19HZXRGb250UHJpdmF0ZUZ1bmMpKCBGVF9GYWNlICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU19Qcml2YXRlUmVjKiAgYWZvbnRfcHJpdmF0ZSApOwotCi0gIHR5cGVkZWYgRlRfTG9uZwotICAoKlBTX0dldEZvbnRWYWx1ZUZ1bmMpKCBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBTX0RpY3RfS2V5cyAga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICB2YWx1ZV9sZW4gKTsKLQotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBQc0luZm8gKQotICB7Ci0gICAgUFNfR2V0Rm9udEluZm9GdW5jICAgICBwc19nZXRfZm9udF9pbmZvOwotICAgIFBTX0dldEZvbnRFeHRyYUZ1bmMgICAgcHNfZ2V0X2ZvbnRfZXh0cmE7Ci0gICAgUFNfSGFzR2x5cGhOYW1lc0Z1bmMgICBwc19oYXNfZ2x5cGhfbmFtZXM7Ci0gICAgUFNfR2V0Rm9udFByaXZhdGVGdW5jICBwc19nZXRfZm9udF9wcml2YXRlOwotICAgIFBTX0dldEZvbnRWYWx1ZUZ1bmMgICAgcHNfZ2V0X2ZvbnRfdmFsdWU7Ci0gIH07Ci0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX1BTSU5GT1JFQyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZm9udF9pbmZvXywgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2dldF9mb250X2V4dHJhXywgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2dseXBoX25hbWVzXywgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZm9udF9wcml2YXRlXywgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9mb250X3ZhbHVlXyApICAgICAgICAgICBcCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX1BzSW5mb1JlYyAgY2xhc3NfID0gICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldF9mb250X2luZm9fLCBwc19nZXRfZm9udF9leHRyYV8sIGhhc19nbHlwaF9uYW1lc18sICAgICAgICBcCi0gICAgZ2V0X2ZvbnRfcHJpdmF0ZV8sIGdldF9mb250X3ZhbHVlXyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9QU0lORk9SRUMoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2ZvbnRfaW5mb18sICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19nZXRfZm9udF9leHRyYV8sICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19nbHlwaF9uYW1lc18sICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2ZvbnRfcHJpdmF0ZV8sICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZm9udF92YWx1ZV8gKSAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgICBsaWJyYXJ5LCAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlX1BzSW5mb1JlYyogIGNsYXp6ICkgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5wc19nZXRfZm9udF9pbmZvICAgID0gZ2V0X2ZvbnRfaW5mb187ICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnBzX2dldF9mb250X2V4dHJhICAgPSBwc19nZXRfZm9udF9leHRyYV87ICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cHNfaGFzX2dseXBoX25hbWVzICA9IGhhc19nbHlwaF9uYW1lc187ICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5wc19nZXRfZm9udF9wcml2YXRlID0gZ2V0X2ZvbnRfcHJpdmF0ZV87ICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnBzX2dldF9mb250X3ZhbHVlICAgPSBnZXRfZm9udF92YWx1ZV87ICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19TVlBTSU5GT19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvc2VydmljZXMvc3ZzZm50LmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3NlcnZpY2VzL3N2c2ZudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzgzNWFhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvc2VydmljZXMvc3ZzZm50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3ZzZm50LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBTRk5UIHRhYmxlIGxvYWRpbmcgc2VydmljZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLCAyMDA0LCAyMDA5LCAyMDEyIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fU1ZTRk5UX0hfXwotI2RlZmluZSBfX1NWU0ZOVF9IX18KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUJMRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoKLSAgICogIFNGTlQgdGFibGUgbG9hZGluZyBzZXJ2aWNlLgotICAgKi8KLQotI2RlZmluZSBGVF9TRVJWSUNFX0lEX1NGTlRfVEFCTEUgICJzZm50LXRhYmxlIgotCi0KLSAgLyoKLSAgICogVXNlZCB0byBpbXBsZW1lbnQgRlRfTG9hZF9TZm50X1RhYmxlKCkuCi0gICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfU0ZOVF9UYWJsZUxvYWRGdW5jKSggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgbGVuZ3RoICk7Ci0KLSAgLyoKLSAgICogVXNlZCB0byBpbXBsZW1lbnQgRlRfR2V0X1NmbnRfVGFibGUoKS4KLSAgICovCi0gIHR5cGVkZWYgdm9pZCoKLSAgKCpGVF9TRk5UX1RhYmxlR2V0RnVuYykoIEZUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2ZudF9UYWcgIHRhZyApOwotCi0KLSAgLyoKLSAgICogVXNlZCB0byBpbXBsZW1lbnQgRlRfU2ZudF9UYWJsZV9JbmZvKCkuCi0gICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfU0ZOVF9UYWJsZUluZm9GdW5jKSggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAqdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAqb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAqbGVuZ3RoICk7Ci0KLQotICBGVF9ERUZJTkVfU0VSVklDRSggU0ZOVF9UYWJsZSApCi0gIHsKLSAgICBGVF9TRk5UX1RhYmxlTG9hZEZ1bmMgIGxvYWRfdGFibGU7Ci0gICAgRlRfU0ZOVF9UYWJsZUdldEZ1bmMgICBnZXRfdGFibGU7Ci0gICAgRlRfU0ZOVF9UYWJsZUluZm9GdW5jICB0YWJsZV9pbmZvOwotICB9OwotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9TRk5UX1RBQkxFUkVDKCBjbGFzc18sIGxvYWRfLCBnZXRfLCBpbmZvXyApICBcCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX1NGTlRfVGFibGVSZWMgIGNsYXNzXyA9ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxvYWRfLCBnZXRfLCBpbmZvXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfU0ZOVF9UQUJMRVJFQyggY2xhc3NfLCBsb2FkXywgZ2V0XywgaW5mb18gKSBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX1NlcnZpY2VfU0ZOVF9UYWJsZVJlYyogIGNsYXp6ICkgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfdGFibGUgPSBsb2FkXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfdGFibGUgID0gZ2V0XzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+dGFibGVfaW5mbyA9IGluZm9fOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIF9fU1ZTRk5UX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0Y21hcC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0Y21hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzcwZjRjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGNtYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdnR0Y21hcC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIFRydWVUeXBlL3NmbnQgY21hcCBleHRyYSBpbmZvcm1hdGlvbiBzZXJ2aWNlLiAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1hc2F0YWtlIFlBTUFUTywgUmVkaGF0IEsuSy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMsIDIwMDgsIDIwMDksIDIwMTIsIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBEZXZlbG9wbWVudCBvZiB0aGlzIHNlcnZpY2UgaXMgc3VwcG9ydCBvZgotICAgSW5mb3JtYXRpb24tdGVjaG5vbG9neSBQcm9tb3Rpb24gQWdlbmN5LCBKYXBhbi4gKi8KLQotI2lmbmRlZiBfX1NWVFRDTUFQX0hfXwotI2RlZmluZSBfX1NWVFRDTUFQX0hfXwotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBQkxFU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotI2RlZmluZSBGVF9TRVJWSUNFX0lEX1RUX0NNQVAgICJ0dC1jbWFwcyIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0NNYXBJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gc3RvcmUgVHJ1ZVR5cGUvc2ZudCBzcGVjaWZpYyBjbWFwIGluZm9ybWF0aW9uICAqLwotICAvKiAgICB3aGljaCBpcyBub3QgY292ZXJlZCBieSB0aGUgZ2VuZXJpYyBARlRfQ2hhck1hcCBzdHJ1Y3R1cmUuICBUaGlzICAgKi8KLSAgLyogICAgc3RydWN0dXJlIGNhbiBiZSBhY2Nlc3NlZCB3aXRoIHRoZSBARlRfR2V0X1RUX0NNYXBfSW5mbyBmdW5jdGlvbi4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGFuZ3VhZ2UgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGxhbmd1YWdlIElEIHVzZWQgaW4gTWFjIGZvbnRzLiAgRGVmaW5pdGlvbnMgb2YgdmFsdWVzIGFyZSBpbiAqLwotICAvKiAgICAgIGB0dG5hbWVpZC5oJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvcm1hdCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBjbWFwIGZvcm1hdC4gIE9wZW5UeXBlIDEuNSBkZWZpbmVzIHRoZSBmb3JtYXRzIDAgKGJ5dGUgICAgICAgKi8KLSAgLyogICAgICBlbmNvZGluZyB0YWJsZSksIDJ+KGhpZ2gtYnl0ZSBtYXBwaW5nIHRocm91Z2ggdGFibGUpLCA0fihzZWdtZW50ICovCi0gIC8qICAgICAgbWFwcGluZyB0byBkZWx0YSB2YWx1ZXMpLCA2fih0cmltbWVkIHRhYmxlIG1hcHBpbmcpLCA4fihtaXhlZCAgICAqLwotICAvKiAgICAgIDE2LWJpdCBhbmQgMzItYml0IGNvdmVyYWdlKSwgMTB+KHRyaW1tZWQgYXJyYXkpLCAxMn4oc2VnbWVudGVkICAgKi8KLSAgLyogICAgICBjb3ZlcmFnZSksIGFuZCAxNCAoVW5pY29kZSBWYXJpYXRpb24gU2VxdWVuY2VzKS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfQ01hcEluZm9fCi0gIHsKLSAgICBGVF9VTG9uZyAgbGFuZ3VhZ2U7Ci0gICAgRlRfTG9uZyAgIGZvcm1hdDsKLQotICB9IFRUX0NNYXBJbmZvOwotCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlRUX0NNYXBfSW5mb19HZXRGdW5jKSggRlRfQ2hhck1hcCAgICBjaGFybWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfQ01hcEluZm8gICpjbWFwX2luZm8gKTsKLQotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBUVENNYXBzICkKLSAgewotICAgIFRUX0NNYXBfSW5mb19HZXRGdW5jICBnZXRfY21hcF9pbmZvOwotICB9OwotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfVFRDTUFQU1JFQyggY2xhc3NfLCBnZXRfY21hcF9pbmZvXyApICBcCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX1RUQ01hcHNSZWMgIGNsYXNzXyA9ICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfY21hcF9pbmZvXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfVFRDTUFQU1JFQyggY2xhc3NfLCBnZXRfY21hcF9pbmZvXyApICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgICAgIGxpYnJhcnksICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlX1RUQ01hcHNSZWMqICBjbGF6eiApICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9jbWFwX2luZm8gPSBnZXRfY21hcF9pbmZvXzsgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19TVlRUQ01BUF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGVuZy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0ZW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZTAyYTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0ZW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdnR0ZW5nLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIFRydWVUeXBlIGVuZ2luZSBxdWVyeSBzZXJ2aWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDYgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19TVlRURU5HX0hfXwotI2RlZmluZSBfX1NWVFRFTkdfSF9fCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotI2luY2x1ZGUgRlRfTU9EVUxFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qCi0gICAqICBTRk5UIHRhYmxlIGxvYWRpbmcgc2VydmljZS4KLSAgICovCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9UUlVFVFlQRV9FTkdJTkUgICJ0cnVldHlwZS1lbmdpbmUiCi0KLSAgLyoKLSAgICogVXNlZCB0byBpbXBsZW1lbnQgRlRfR2V0X1RydWVUeXBlX0VuZ2luZV9UeXBlCi0gICAqLwotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBUcnVlVHlwZUVuZ2luZSApCi0gIHsKLSAgICBGVF9UcnVlVHlwZUVuZ2luZVR5cGUgIGVuZ2luZV90eXBlOwotICB9OwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX1NWVFRFTkdfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRnbHlmLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRnbHlmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2OWViODQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0Z2x5Zi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3Z0dGdseWYuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBUcnVlVHlwZSBnbHlwaCBzZXJ2aWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LCAyMDA5LCAyMDEyIGJ5IERhdmlkIFR1cm5lci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fU1ZUVEdMWUZfSF9fCi0jZGVmaW5lIF9fU1ZUVEdMWUZfSF9fCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFCTEVTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0jZGVmaW5lIEZUX1NFUlZJQ0VfSURfVFRfR0xZRiAgInR0LWdseWYiCi0KLQotICB0eXBlZGVmIEZUX1VMb25nCi0gICgqVFRfR2x5Zl9HZXRMb2NhdGlvbkZ1bmMpKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAqcHNpemUgKTsKLQotICBGVF9ERUZJTkVfU0VSVklDRSggVFRHbHlmICkKLSAgewotICAgIFRUX0dseWZfR2V0TG9jYXRpb25GdW5jICBnZXRfbG9jYXRpb247Ci0gIH07Ci0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX1RUR0xZRlJFQyggY2xhc3NfLCBnZXRfbG9jYXRpb25fICkgIFwKLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfVFRHbHlmUmVjICBjbGFzc18gPSAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X2xvY2F0aW9uXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9UVEdMWUZSRUMoIGNsYXNzXywgZ2V0X2xvY2F0aW9uXyApICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9TZXJ2aWNlX1RUR2x5ZlJlYyogIGNsYXp6ICkgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9sb2NhdGlvbiA9IGdldF9sb2NhdGlvbl87ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fU1ZUVEdMWUZfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3NlcnZpY2VzL3N2d2luZm50LmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3NlcnZpY2VzL3N2d2luZm50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Zjc3NjUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdndpbmZudC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3Z3aW5mbnQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBXaW5kb3dzIEZOVC9GT05UIHNlcnZpY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fU1ZXSU5GTlRfSF9fCi0jZGVmaW5lIF9fU1ZXSU5GTlRfSF9fCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotI2luY2x1ZGUgRlRfV0lORk9OVFNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9XSU5GTlQgICJ3aW5mb250cyIKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfV2luRm50X0dldEhlYWRlckZ1bmMpKCBGVF9GYWNlICAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1dpbkZOVF9IZWFkZXJSZWMgICphaGVhZGVyICk7Ci0KLQotICBGVF9ERUZJTkVfU0VSVklDRSggV2luRm50ICkKLSAgewotICAgIEZUX1dpbkZudF9HZXRIZWFkZXJGdW5jICBnZXRfaGVhZGVyOwotICB9OwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX1NWV0lORk5UX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnhmODZubS5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnhmODZubS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTVkODg0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvc2VydmljZXMvc3Z4Zjg2bm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2eGY4Nm5tLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgWEZyZWU4NiBzZXJ2aWNlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1NWWEY4Nk5NX0hfXwotI2RlZmluZSBfX1NWWEY4Nk5NX0hfXwotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qCi0gICAqICBBIHRyaXZpYWwgc2VydmljZSB1c2VkIHRvIHJldHVybiB0aGUgbmFtZSBvZiBhIGZhY2UncyBmb250IGRyaXZlciwKLSAgICogIGFjY29yZGluZyB0byB0aGUgWEZyZWU4NiBub21lbmNsYXR1cmUuICBOb3RlIHRoYXQgdGhlIHNlcnZpY2UgZGF0YQotICAgKiAgaXMgYSBzaW1wbGUgY29uc3RhbnQgc3RyaW5nIHBvaW50ZXIuCi0gICAqLwotCi0jZGVmaW5lIEZUX1NFUlZJQ0VfSURfWEY4Nl9OQU1FICAieGY4Ni1kcml2ZXItbmFtZSIKLQotI2RlZmluZSBGVF9YRjg2X0ZPUk1BVF9UUlVFVFlQRSAgIlRydWVUeXBlIgotI2RlZmluZSBGVF9YRjg2X0ZPUk1BVF9UWVBFXzEgICAgIlR5cGUgMSIKLSNkZWZpbmUgRlRfWEY4Nl9GT1JNQVRfQkRGICAgICAgICJCREYiCi0jZGVmaW5lIEZUX1hGODZfRk9STUFUX1BDRiAgICAgICAiUENGIgotI2RlZmluZSBGVF9YRjg2X0ZPUk1BVF9UWVBFXzQyICAgIlR5cGUgNDIiCi0jZGVmaW5lIEZUX1hGODZfRk9STUFUX0NJRCAgICAgICAiQ0lEIFR5cGUgMSIKLSNkZWZpbmUgRlRfWEY4Nl9GT1JNQVRfQ0ZGICAgICAgICJDRkYiCi0jZGVmaW5lIEZUX1hGODZfRk9STUFUX1BGUiAgICAgICAiUEZSIgotI2RlZmluZSBGVF9YRjg2X0ZPUk1BVF9XSU5GTlQgICAgIldpbmRvd3MgRk5UIgotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX1NWWEY4Nk5NX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9zZm50LmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3NmbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU1OGU4Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3NmbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzZm50LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSGlnaC1sZXZlbCBgc2ZudCcgZHJpdmVyIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwNiwgMjAwOSwgMjAxMi0yMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19TRk5UX0hfXwotI2RlZmluZSBfX1NGTlRfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9EUklWRVJfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFJVRVRZUEVfVFlQRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfSW5pdF9GYWNlX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRmlyc3QgcGFydCBvZiB0aGUgU0ZOVCBmYWNlIG9iamVjdCBpbml0aWFsaXphdGlvbi4gIFRoaXMgZmluZHMgICAgICovCi0gIC8qICAgIHRoZSBmYWNlIGluIGEgU0ZOVCBmaWxlIG9yIGNvbGxlY3Rpb24sIGFuZCBsb2FkIGl0cyBmb3JtYXQgdGFnIGluICAqLwotICAvKiAgICBmYWNlLT5mb3JtYXRfdGFnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIFRydWVUeXBlIGZvbnQsIGlmIHdlIGFyZSBvcGVuaW5nIGEgICovCi0gIC8qICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX3BhcmFtcyA6OiBUaGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYXJhbXMgICAgIDo6IE9wdGlvbmFsIGFkZGl0aW9uYWwgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgc3RyZWFtIGN1cnNvciBtdXN0IGJlIGF0IHRoZSBmb250IGZpbGUncyBvcmlnaW4uICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gcmVjb2duaXplcyBmb250cyBlbWJlZGRlZCBpbiBhIGBUcnVlVHlwZSAgICAgICAgICAgICAqLwotICAvKiAgICBjb2xsZWN0aW9uJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9uY2UgdGhlIGZvcm1hdCB0YWcgaGFzIGJlZW4gdmFsaWRhdGVkIGJ5IHRoZSBmb250IGRyaXZlciwgaXQgICAgICAqLwotICAvKiAgICBzaG91bGQgdGhlbiBjYWxsIHRoZSBUVF9Mb2FkX0ZhY2VfRnVuYygpIGNhbGxiYWNrIHRvIHJlYWQgdGhlIHJlc3QgKi8KLSAgLyogICAgb2YgdGhlIFNGTlQgdGFibGVzIGluIHRoZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfSW5pdF9GYWNlX0Z1bmMpKCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBUVF9GYWNlICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9QYXJhbWV0ZXIqICBwYXJhbXMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0xvYWRfRmFjZV9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlY29uZCBwYXJ0IG9mIHRoZSBTRk5UIGZhY2Ugb2JqZWN0IGluaXRpYWxpemF0aW9uLiAgVGhpcyBsb2FkcyAgICAqLwotICAvKiAgICB0aGUgY29tbW9uIFNGTlQgdGFibGVzIChoZWFkLCBPUy8yLCBtYXhwLCBtZXRyaWNzLCBldGMuKSBpbiB0aGUgICAgKi8KLSAgLyogICAgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtICAgICA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfaW5kZXggOjogVGhlIGluZGV4IG9mIHRoZSBUcnVlVHlwZSBmb250LCBpZiB3ZSBhcmUgb3BlbmluZyBhICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9wYXJhbXMgOjogVGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGFyYW1zICAgICA6OiBPcHRpb25hbCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZnRlciBUVF9Jbml0X0ZhY2VfRnVuYygpLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfTG9hZF9GYWNlX0Z1bmMpKCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBUVF9GYWNlICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9QYXJhbWV0ZXIqICBwYXJhbXMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0RvbmVfRmFjZV9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgY2FsbGJhY2sgdXNlZCB0byBkZWxldGUgdGhlIGNvbW1vbiBTRk5UIGRhdGEgZnJvbSBhIGZhY2UuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBOT1QgZGVzdHJveSB0aGUgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqVFRfRG9uZV9GYWNlX0Z1bmMpKCBUVF9GYWNlICBmYWNlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Mb2FkX0FueV9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkIGFueSBmb250IHRhYmxlIGludG8gY2xpZW50IG1lbW9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogVGhlIGZhY2Ugb2JqZWN0IHRvIGxvb2sgZm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhZyAgICA6OiBUaGUgdGFnIG9mIHRhYmxlIHRvIGxvYWQuICBVc2UgdGhlIHZhbHVlIDAgaWYgeW91IHdhbnQgICAqLwotICAvKiAgICAgICAgICAgICAgdG8gYWNjZXNzIHRoZSB3aG9sZSBmb250IGZpbGUsIGVsc2Ugc2V0IHRoaXMgcGFyYW1ldGVyICAgKi8KLSAgLyogICAgICAgICAgICAgIHRvIGEgdmFsaWQgVHJ1ZVR5cGUgdGFibGUgdGFnIHRoYXQgeW91IGNhbiBmb3JnZSB3aXRoICAgICovCi0gIC8qICAgICAgICAgICAgICB0aGUgTUFLRV9UVF9UQUcgbWFjcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb2Zmc2V0IDo6IFRoZSBzdGFydGluZyBvZmZzZXQgaW4gdGhlIHRhYmxlIChvciB0aGUgZmlsZSBpZiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICB0YWcgPT0gMCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGVuZ3RoIDo6IFRoZSBhZGRyZXNzIG9mIHRoZSBkZWNpc2lvbiB2YXJpYWJsZTogICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICBJZiBsZW5ndGggPT0gTlVMTDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBMb2FkcyB0aGUgd2hvbGUgdGFibGUuICBSZXR1cm5zIGFuIGVycm9yIGlmICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgYG9mZnNldCcgPT0gMCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgSWYgKmxlbmd0aCA9PSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgRXhpdHMgaW1tZWRpYXRlbHk7IHJldHVybmluZyB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiAqLwotICAvKiAgICAgICAgICAgICAgICAgIHRhYmxlIG9yIG9mIHRoZSBmb250IGZpbGUsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgKi8KLSAgLyogICAgICAgICAgICAgICAgICBgdGFnJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICBJZiAqbGVuZ3RoICE9IDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBMb2FkcyB0aGUgbmV4dCBgbGVuZ3RoJyBieXRlcyBvZiB0YWJsZSBvciBmb250LCAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgc3RhcnRpbmcgYXQgb2Zmc2V0IGBvZmZzZXQnIChpbiB0YWJsZSBvciBmb250IHRvbykuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJ1ZmZlciA6OiBUaGUgYWRkcmVzcyBvZiB0YXJnZXQgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlRUX0xvYWRfQW55X0Z1bmMpKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgdGFnLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSAgICpidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgbGVuZ3RoICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9GaW5kX1NCaXRfSW1hZ2VfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDaGVjayB3aGV0aGVyIGFuIGVtYmVkZGVkIGJpdG1hcCAoYW4gYHNiaXQnKSBleGlzdHMgZm9yIGEgZ2l2ZW4gICAgKi8KLSAgLyogICAgZ2x5cGgsIGF0IGEgZ2l2ZW4gc3RyaWtlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgICA6OiBUaGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9pbmRleCAgIDo6IFRoZSBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmlrZV9pbmRleCAgOjogVGhlIGN1cnJlbnQgc3RyaWtlIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFyYW5nZSAgICAgICAgOjogVGhlIFNCaXQgcmFuZ2UgY29udGFpbmluZyB0aGUgZ2x5cGggaW5kZXguICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXN0cmlrZSAgICAgICA6OiBUaGUgU0JpdCBzdHJpa2UgY29udGFpbmluZyB0aGUgZ2x5cGggaW5kZXguICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZ2x5cGhfb2Zmc2V0IDo6IFRoZSBvZmZzZXQgb2YgdGhlIGdseXBoIGRhdGEgaW4gYEVCRFQnIHRhYmxlLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgUmV0dXJucyAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU0ZOVF9FcnJfSW52YWxpZF9Bcmd1bWVudCBpZiBubyBzYml0IGV4aXN0cyBmb3IgdGhlIHJlcXVlc3RlZCAgICAgICovCi0gIC8qICAgIGdseXBoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlRUX0ZpbmRfU0JpdF9JbWFnZV9GdW5jKSggVFRfRmFjZSAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICAgc3RyaWtlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9SYW5nZSAgICphcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TQml0X1N0cmlrZSAgKmFzdHJpa2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgKmFnbHlwaF9vZmZzZXQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0xvYWRfU0JpdF9NZXRyaWNzX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdldCB0aGUgYmlnIG1ldHJpY3MgZm9yIGEgZ2l2ZW4gZW1iZWRkZWQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmFuZ2UgICAgICAgOjogVGhlIFNCaXQgcmFuZ2UgY29udGFpbmluZyB0aGUgZ2x5cGguICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmlnX21ldHJpY3MgOjogQSBiaWcgU0JpdCBtZXRyaWNzIHN0cnVjdHVyZSBmb3IgdGhlIGdseXBoLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHN0cmVhbSBjdXJzb3IgbXVzdCBiZSBwb3NpdGlvbmVkIGF0IHRoZSBnbHlwaCdzIG9mZnNldCB3aXRoaW4gICovCi0gIC8qICAgIHRoZSBgRUJEVCcgdGFibGUgYmVmb3JlIHRoZSBjYWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgdGhlIGltYWdlIGZvcm1hdCB1c2VzIHZhcmlhYmxlIG1ldHJpY3MsIHRoZSBzdHJlYW0gY3Vyc29yIGlzICAgICovCi0gIC8qICAgIHBvc2l0aW9uZWQganVzdCBhZnRlciB0aGUgbWV0cmljcyBoZWFkZXIgaW4gdGhlIGBFQkRUJyB0YWJsZSBvbiAgICAqLwotICAvKiAgICBmdW5jdGlvbiBleGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUVF9Mb2FkX1NCaXRfTWV0cmljc19GdW5jKSggRlRfU3RyZWFtICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfUmFuZ2UgICAgcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfTWV0cmljcyAgbWV0cmljcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZF9TQml0X0ltYWdlX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZCBhIGdpdmVuIGdseXBoIHNiaXQgaW1hZ2UgZnJvbSB0aGUgZm9udCByZXNvdXJjZS4gIFRoaXMgYWxzbyAgICovCi0gIC8qICAgIHJldHVybnMgaXRzIG1ldHJpY3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmlrZV9pbmRleCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBzdHJpa2UgaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2luZGV4IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBjdXJyZW50IGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfZmxhZ3MgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBjdXJyZW50IGxvYWQgZmxhZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbWFwIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgdGFyZ2V0IHBpeG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbWV0cmljcyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIGJpZyBzYml0IG1ldHJpY3Mgc3RydWN0dXJlIGZvciB0aGUgZ2x5cGggaW1hZ2UuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gIFJldHVybnMgYW4gZXJyb3IgaWYgbm8gICAgICovCi0gIC8qICAgIGdseXBoIHNiaXQgZXhpc3RzIGZvciB0aGUgaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBgbWFwLmJ1ZmZlcicgZmllbGQgaXMgYWx3YXlzIGZyZWVkIGJlZm9yZSB0aGUgZ2x5cGggaXMgbG9hZGVkLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlRUX0xvYWRfU0JpdF9JbWFnZV9GdW5jKSggVFRfRmFjZSAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICAgICAgIHN0cmlrZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgICAgbG9hZF9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCAgICAgICAgICAgKmFtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TQml0X01ldHJpY3NSZWMgICphbWV0cmljcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfU2V0X1NCaXRfU3RyaWtlX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VsZWN0IGFuIHNiaXQgc3RyaWtlIGZvciBhIGdpdmVuIHNpemUgcmVxdWVzdC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgICA6OiBUaGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZXEgICAgICAgICAgIDo6IFRoZSBzaXplIHJlcXVlc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhc3RyaWtlX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgc2JpdCBzdHJpa2UuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgUmV0dXJucyBhbiBlcnJvciBpZiBubyAgICAgKi8KLSAgLyogICAgc2JpdCBzdHJpa2UgZXhpc3RzIGZvciB0aGUgc2VsZWN0ZWQgcHBlbSB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfU2V0X1NCaXRfU3RyaWtlX0Z1bmMpKCBUVF9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TaXplX1JlcXVlc3QgIHJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICAgICAgYXN0cmlrZV9pbmRleCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZF9TdHJpa2VfTWV0cmljc19GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZCB0aGUgbWV0cmljcyBvZiBhIGdpdmVuIHN0cmlrZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgICA6OiBUaGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJpa2VfaW5kZXggIDo6IFRoZSBzdHJpa2UgaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZXRyaWNzICAgICAgIDo6IHRoZSBtZXRyaWNzIG9mIHRoZSBzdHJpa2UuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgUmV0dXJucyBhbiBlcnJvciBpZiBubyAgICAgKi8KLSAgLyogICAgc3VjaCBzYml0IHN0cmlrZSBleGlzdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfTG9hZF9TdHJpa2VfTWV0cmljc19GdW5jKSggVFRfRmFjZSAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgICBzdHJpa2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9NZXRyaWNzKiAgbWV0cmljcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfR2V0X1BTX05hbWVfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR2V0IHRoZSBQb3N0U2NyaXB0IGdseXBoIG5hbWUgb2YgYSBnbHlwaC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaWR4ICA6OiBUaGUgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU25hbWUgOjogVGhlIGFkZHJlc3Mgb2YgYSBzdHJpbmcgcG9pbnRlci4gIFdpbGwgYmUgTlVMTCBpbiBjYXNlICAgKi8KLSAgLyogICAgICAgICAgICAgIG9mIGVycm9yLCBvdGhlcndpc2UgaXQgaXMgYSBwb2ludGVyIHRvIHRoZSBnbHlwaCBuYW1lLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgWW91IG11c3Qgbm90IG1vZGlmeSB0aGUgcmV0dXJuZWQgc3RyaW5nISAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUVF9HZXRfUFNfTmFtZV9GdW5jKSggVFRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmluZyoqICBQU25hbWUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0xvYWRfTWV0cmljc19GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWQgYSBtZXRyaWNzIHRhYmxlLCB3aGljaCBpcyBhIHRhYmxlIHdpdGggYSBob3Jpem9udGFsIGFuZCBhICAgICAqLwotICAvKiAgICB2ZXJ0aWNhbCB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydGljYWwgOjogQSBib29sZWFuIGZsYWcuICBJZiBzZXQsIGxvYWQgdGhlIHZlcnRpY2FsIG9uZS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfTG9hZF9NZXRyaWNzX0Z1bmMpKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgdmVydGljYWwgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0dldF9NZXRyaWNzX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWQgdGhlIGhvcml6b250YWwgb3IgdmVydGljYWwgaGVhZGVyIGluIGEgZmFjZSBvYmplY3QuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydGljYWwgOjogQSBib29sZWFuIGZsYWcuICBJZiBzZXQsIGxvYWQgdmVydGljYWwgbWV0cmljcy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnaW5kZXggICA6OiBUaGUgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhYmVhcmluZyA6OiBUaGUgaG9yaXpvbnRhbCAob3IgdmVydGljYWwpIGJlYXJpbmcuICBTZXQgdG8gemVybyBpbiAgKi8KLSAgLyogICAgICAgICAgICAgICAgY2FzZSBvZiBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhYWR2YW5jZSA6OiBUaGUgaG9yaXpvbnRhbCAob3IgdmVydGljYWwpIGFkdmFuY2UuICBTZXQgdG8gemVybyBpbiAgKi8KLSAgLyogICAgICAgICAgICAgICAgY2FzZSBvZiBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpUVF9HZXRfTWV0cmljc19GdW5jKSggVFRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgdmVydGljYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2hvcnQqICAgYWJlYXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCogIGFhZHZhbmNlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkIGEgZ2l2ZW4gVHJ1ZVR5cGUgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmdW5jdGlvbiB1c2VzIGBmYWNlLT5nb3RvX3RhYmxlJyB0byBzZWVrIHRoZSBzdHJlYW0gdG8gdGhlICAgICAqLwotICAvKiAgICBzdGFydCBvZiB0aGUgdGFibGUsIGV4Y2VwdCB3aGlsZSBsb2FkaW5nIHRoZSBmb250IGRpcmVjdG9yeS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUVF9Mb2FkX1RhYmxlX0Z1bmMpKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0ZyZWVfVGFibGVfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWUgYSBnaXZlbiBUcnVlVHlwZSB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqVFRfRnJlZV9UYWJsZV9GdW5jKSggVFRfRmFjZSAgZmFjZSApOwotCi0KLSAgLyoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgICBUVF9GYWNlX0dldEtlcm5pbmdGdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICAgUmV0dXJuIHRoZSBob3Jpem9udGFsIGtlcm5pbmcgdmFsdWUgYmV0d2VlbiB0d28gZ2x5cGhzLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgIGZhY2UgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuCi0gICAqICAgIGxlZnRfZ2x5cGggIDo6IFRoZSBsZWZ0IGdseXBoIGluZGV4LgotICAgKiAgICByaWdodF9nbHlwaCA6OiBUaGUgcmlnaHQgZ2x5cGggaW5kZXguCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgIFRoZSBrZXJuaW5nIHZhbHVlIGluIGZvbnQgdW5pdHMuCi0gICAqLwotICB0eXBlZGVmIEZUX0ludAotICAoKlRUX0ZhY2VfR2V0S2VybmluZ0Z1bmMpKCBUVF9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBsZWZ0X2dseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICByaWdodF9nbHlwaCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU0ZOVF9JbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgcG9pbnRlcnMgdG8gdGhlIGZ1bmN0aW9ucyB1c2VkIHRvIGxvYWQgYW5kICAgICovCi0gIC8qICAgIGZyZWUgdGhlIGJhc2ljIHRhYmxlcyB0aGF0IGFyZSByZXF1aXJlZCBpbiBhIGBzZm50JyBmb250IGZpbGUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENoZWNrIHRoZSB2YXJpb3VzIHh4eF9GdW5jKCkgZGVzY3JpcHRpb25zIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFNGTlRfSW50ZXJmYWNlXwotICB7Ci0gICAgVFRfTG9hZGVyX0dvdG9UYWJsZUZ1bmMgICAgICBnb3RvX3RhYmxlOwotCi0gICAgVFRfSW5pdF9GYWNlX0Z1bmMgICAgICAgICAgICBpbml0X2ZhY2U7Ci0gICAgVFRfTG9hZF9GYWNlX0Z1bmMgICAgICAgICAgICBsb2FkX2ZhY2U7Ci0gICAgVFRfRG9uZV9GYWNlX0Z1bmMgICAgICAgICAgICBkb25lX2ZhY2U7Ci0gICAgRlRfTW9kdWxlX1JlcXVlc3RlciAgICAgICAgICBnZXRfaW50ZXJmYWNlOwotCi0gICAgVFRfTG9hZF9BbnlfRnVuYyAgICAgICAgICAgICBsb2FkX2FueTsKLQotICAgIC8qIHRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGJ5IGBsb2FkX2ZhY2UnIGJ1dCB0aGV5IGNhbiBhbHNvICAqLwotICAgIC8qIGJlIGNhbGxlZCBmcm9tIGV4dGVybmFsIG1vZHVsZXMsIGlmIHRoZXJlIGlzIGEgbmVlZCB0byBkbyBzbyAqLwotICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgICAgICAgbG9hZF9oZWFkOwotICAgIFRUX0xvYWRfTWV0cmljc19GdW5jICAgICAgICAgbG9hZF9oaGVhOwotICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgICAgICAgbG9hZF9jbWFwOwotICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgICAgICAgbG9hZF9tYXhwOwotICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgICAgICAgbG9hZF9vczI7Ci0gICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgICAgICBsb2FkX3Bvc3Q7Ci0KLSAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICAgICAgIGxvYWRfbmFtZTsKLSAgICBUVF9GcmVlX1RhYmxlX0Z1bmMgICAgICAgICAgIGZyZWVfbmFtZTsKLQotICAgIC8qIHRoaXMgZmllbGQgd2FzIGNhbGxlZCBgbG9hZF9rZXJuaW5nJyB1cCB0byB2ZXJzaW9uIDIuMS4xMCAqLwotICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgICAgICAgbG9hZF9rZXJuOwotCi0gICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgICAgICBsb2FkX2dhc3A7Ci0gICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgICAgICBsb2FkX3BjbHQ7Ci0KLSAgICAvKiBzZWUgYHR0bG9hZC5oJzsgdGhpcyBmaWVsZCB3YXMgY2FsbGVkIGBsb2FkX2JpdG1hcF9oZWFkZXInIHVwIHRvICovCi0gICAgLyogdmVyc2lvbiAyLjEuMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgICAgICAgbG9hZF9iaGVkOwotCi0gICAgVFRfTG9hZF9TQml0X0ltYWdlX0Z1bmMgICAgICBsb2FkX3NiaXRfaW1hZ2U7Ci0KLSAgICAvKiBzZWUgYHR0cG9zdC5oJyAqLwotICAgIFRUX0dldF9QU19OYW1lX0Z1bmMgICAgICAgICAgZ2V0X3BzbmFtZTsKLSAgICBUVF9GcmVlX1RhYmxlX0Z1bmMgICAgICAgICAgIGZyZWVfcHNuYW1lczsKLQotICAgIC8qIHN0YXJ0aW5nIGhlcmUsIHRoZSBzdHJ1Y3R1cmUgZGlmZmVycyBmcm9tIHZlcnNpb24gMi4xLjcgKi8KLQotICAgIC8qIHRoaXMgZmllbGQgd2FzIGludHJvZHVjZWQgaW4gdmVyc2lvbiAyLjEuOCwgbmFtZWQgYGdldF9wc25hbWUnICovCi0gICAgVFRfRmFjZV9HZXRLZXJuaW5nRnVuYyAgICAgICBnZXRfa2VybmluZzsKLQotICAgIC8qIG5ldyBlbGVtZW50cyBpbnRyb2R1Y2VkIGFmdGVyIHZlcnNpb24gMi4xLjEwICovCi0KLSAgICAvKiBsb2FkIHRoZSBmb250IGRpcmVjdG9yeSwgaS5lLiwgdGhlIG9mZnNldCB0YWJsZSBhbmQgKi8KLSAgICAvKiB0aGUgdGFibGUgZGlyZWN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICAgICAgIGxvYWRfZm9udF9kaXI7Ci0gICAgVFRfTG9hZF9NZXRyaWNzX0Z1bmMgICAgICAgICBsb2FkX2htdHg7Ci0KLSAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICAgICAgIGxvYWRfZWJsYzsKLSAgICBUVF9GcmVlX1RhYmxlX0Z1bmMgICAgICAgICAgIGZyZWVfZWJsYzsKLQotICAgIFRUX1NldF9TQml0X1N0cmlrZV9GdW5jICAgICAgc2V0X3NiaXRfc3RyaWtlOwotICAgIFRUX0xvYWRfU3RyaWtlX01ldHJpY3NfRnVuYyAgbG9hZF9zdHJpa2VfbWV0cmljczsKLQotICAgIFRUX0dldF9NZXRyaWNzX0Z1bmMgICAgICAgICAgZ2V0X21ldHJpY3M7Ci0KLSAgfSBTRk5UX0ludGVyZmFjZTsKLQotCi0gIC8qIHRyYW5zaXRpb25hbCAqLwotICB0eXBlZGVmIFNGTlRfSW50ZXJmYWNlKiAgIFNGTlRfU2VydmljZTsKLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX0RFRklORV9TRk5UX0lOVEVSRkFDRSggICAgICAgIFwKLSAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdvdG9fdGFibGVfLCAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW5pdF9mYWNlXywgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2ZhY2VfLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfZmFjZV8sICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X2ludGVyZmFjZV8sICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2FueV8sICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfaGVhZF8sICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9oaGVhXywgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2NtYXBfLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfbWF4cF8sICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9vczJfLCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX3Bvc3RfLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfbmFtZV8sICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZnJlZV9uYW1lXywgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2tlcm5fLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfZ2FzcF8sICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9wY2x0XywgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2JoZWRfLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfc2JpdF9pbWFnZV8sICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X3BzbmFtZV8sICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBmcmVlX3BzbmFtZXNfLCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9rZXJuaW5nXywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9mb250X2Rpcl8sICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2htdHhfLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfZWJsY18sICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZnJlZV9lYmxjXywgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzZXRfc2JpdF9zdHJpa2VfLCAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfc3RyaWtlX21ldHJpY3NfLCAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X21ldHJpY3NfICkgICAgICAgICAgICAgICAgIFwKLSAgc3RhdGljIGNvbnN0IFNGTlRfSW50ZXJmYWNlICBjbGFzc18gPSAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ290b190YWJsZV8sICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbml0X2ZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxvYWRfZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG9uZV9mYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfaW50ZXJmYWNlXywgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxvYWRfYW55XywgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbG9hZF9oZWFkXywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsb2FkX2hoZWFfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxvYWRfY21hcF8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbG9hZF9tYXhwXywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsb2FkX29zMl8sICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxvYWRfcG9zdF8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbG9hZF9uYW1lXywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmcmVlX25hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxvYWRfa2Vybl8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbG9hZF9nYXNwXywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsb2FkX3BjbHRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxvYWRfYmhlZF8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbG9hZF9zYml0X2ltYWdlXywgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfcHNuYW1lXywgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZyZWVfcHNuYW1lc18sICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X2tlcm5pbmdfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsb2FkX2ZvbnRfZGlyXywgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxvYWRfaG10eF8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbG9hZF9lYmxjXywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmcmVlX2VibGNfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNldF9zYml0X3N0cmlrZV8sICAgICAgICAgICAgICAgICAgICBcCi0gICAgbG9hZF9zdHJpa2VfbWV0cmljc18sICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfbWV0cmljc18sICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0lOVEVSTkFMKCBhLCBhXyApICBcCi0gICAgICAgICAgY2xhenotPmEgPSBhXzsKLQotI2RlZmluZSBGVF9ERUZJTkVfU0ZOVF9JTlRFUkZBQ0UoICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnb3RvX3RhYmxlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9mYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lX2ZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9pbnRlcmZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9hbnlfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2hlYWRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfaGhlYV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9jbWFwXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX21heHBfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfb3MyXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9wb3N0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX25hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZyZWVfbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9rZXJuXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2dhc3BfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfcGNsdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9iaGVkXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX3NiaXRfaW1hZ2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9wc25hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZnJlZV9wc25hbWVzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfa2VybmluZ18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfZm9udF9kaXJfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9obXR4XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2VibGNfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZyZWVfZWJsY18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2V0X3NiaXRfc3RyaWtlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX3N0cmlrZV9tZXRyaWNzXywgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9tZXRyaWNzXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgIGxpYnJhcnksICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNGTlRfSW50ZXJmYWNlKiAgY2xhenogKSAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9VTlVTRUQoIGxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdvdG9fdGFibGUgICAgICAgICAgPSBnb3RvX3RhYmxlXzsgICAgICAgICAgIFwKLSAgICBjbGF6ei0+aW5pdF9mYWNlICAgICAgICAgICA9IGluaXRfZmFjZV87ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX2ZhY2UgICAgICAgICAgID0gbG9hZF9mYWNlXzsgICAgICAgICAgICBcCi0gICAgY2xhenotPmRvbmVfZmFjZSAgICAgICAgICAgPSBkb25lX2ZhY2VfOyAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X2ludGVyZmFjZSAgICAgICA9IGdldF9pbnRlcmZhY2VfOyAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX2FueSAgICAgICAgICAgID0gbG9hZF9hbnlfOyAgICAgICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfaGVhZCAgICAgICAgICAgPSBsb2FkX2hlYWRfOyAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9oaGVhICAgICAgICAgICA9IGxvYWRfaGhlYV87ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX2NtYXAgICAgICAgICAgID0gbG9hZF9jbWFwXzsgICAgICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfbWF4cCAgICAgICAgICAgPSBsb2FkX21heHBfOyAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9vczIgICAgICAgICAgICA9IGxvYWRfb3MyXzsgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX3Bvc3QgICAgICAgICAgID0gbG9hZF9wb3N0XzsgICAgICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfbmFtZSAgICAgICAgICAgPSBsb2FkX25hbWVfOyAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+ZnJlZV9uYW1lICAgICAgICAgICA9IGZyZWVfbmFtZV87ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX2tlcm4gICAgICAgICAgID0gbG9hZF9rZXJuXzsgICAgICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfZ2FzcCAgICAgICAgICAgPSBsb2FkX2dhc3BfOyAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9wY2x0ICAgICAgICAgICA9IGxvYWRfcGNsdF87ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX2JoZWQgICAgICAgICAgID0gbG9hZF9iaGVkXzsgICAgICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfc2JpdF9pbWFnZSAgICAgPSBsb2FkX3NiaXRfaW1hZ2VfOyAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X3BzbmFtZSAgICAgICAgICA9IGdldF9wc25hbWVfOyAgICAgICAgICAgXAotICAgIGNsYXp6LT5mcmVlX3BzbmFtZXMgICAgICAgID0gZnJlZV9wc25hbWVzXzsgICAgICAgICBcCi0gICAgY2xhenotPmdldF9rZXJuaW5nICAgICAgICAgPSBnZXRfa2VybmluZ187ICAgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9mb250X2RpciAgICAgICA9IGxvYWRfZm9udF9kaXJfOyAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX2htdHggICAgICAgICAgID0gbG9hZF9obXR4XzsgICAgICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfZWJsYyAgICAgICAgICAgPSBsb2FkX2VibGNfOyAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+ZnJlZV9lYmxjICAgICAgICAgICA9IGZyZWVfZWJsY187ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5zZXRfc2JpdF9zdHJpa2UgICAgID0gc2V0X3NiaXRfc3RyaWtlXzsgICAgICBcCi0gICAgY2xhenotPmxvYWRfc3RyaWtlX21ldHJpY3MgPSBsb2FkX3N0cmlrZV9tZXRyaWNzXzsgIFwKLSAgICBjbGF6ei0+Z2V0X21ldHJpY3MgICAgICAgICA9IGdldF9tZXRyaWNzXzsgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1NGTlRfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3QxdHlwZXMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvdDF0eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjAyMzdjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvdDF0eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQxdHlwZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBCYXNpYyBUeXBlMS9UeXBlMiB0eXBlIGRlZmluaXRpb25zIGFuZCBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24gICAgICAqLwotLyogICAgb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwNCwgMjAwNiwgMjAwOCwgMjAwOSwgMjAxMSwgMjAxMyBieSAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19UMVRZUEVTX0hfXwotI2RlZmluZSBfX1QxVFlQRVNfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9UWVBFMV9UQUJMRVNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9ISU5UU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9DTUFQU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgIFJFUVVJUkVEIFRZUEUxL1RZUEUyIFRBQkxFUyBERUZJTklUSU9OUyAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9FbmNvZGluZ1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSBtb2RlbGluZyBhIGN1c3RvbSBlbmNvZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fY2hhcnMgIDo6IFRoZSBudW1iZXIgb2YgY2hhcmFjdGVyIGNvZGVzIGluIHRoZSBlbmNvZGluZy4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBVc3VhbGx5IDI1Ni4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb2RlX2ZpcnN0IDo6IFRoZSBsb3dlc3QgdmFsaWQgY2hhcmFjdGVyIGNvZGUgaW4gdGhlIGVuY29kaW5nLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvZGVfbGFzdCAgOjogVGhlIGhpZ2hlc3QgdmFsaWQgY2hhcmFjdGVyIGNvZGUgaW4gdGhlIGVuY29kaW5nICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICsgMS4gV2hlbiBlcXVhbCB0byBjb2RlX2ZpcnN0IHRoZXJlIGFyZSBubyB2YWxpZCAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgY29kZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyX2luZGV4IDo6IEFuIGFycmF5IG9mIGNvcnJlc3BvbmRpbmcgZ2x5cGggaW5kaWNlcy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJfbmFtZSAgOjogQW4gYXJyYXkgb2YgY29ycmVzcG9uZGluZyBnbHlwaCBuYW1lcy4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFQxX0VuY29kaW5nUmVjUmVjXwotICB7Ci0gICAgRlRfSW50ICAgICAgIG51bV9jaGFyczsKLSAgICBGVF9JbnQgICAgICAgY29kZV9maXJzdDsKLSAgICBGVF9JbnQgICAgICAgY29kZV9sYXN0OwotCi0gICAgRlRfVVNob3J0KiAgIGNoYXJfaW5kZXg7Ci0gICAgRlRfU3RyaW5nKiogIGNoYXJfbmFtZTsKLQotICB9IFQxX0VuY29kaW5nUmVjLCAqVDFfRW5jb2Rpbmc7Ci0KLQotICAvKiB1c2VkIHRvIGhvbGQgZXh0cmEgZGF0YSBvZiBQU19Gb250SW5mb1JlYyB0aGF0Ci0gICAqIGNhbm5vdCBiZSBzdG9yZWQgaW4gdGhlIHB1YmxpY2x5IGRlZmluZWQgc3RydWN0dXJlLgotICAgKgotICAgKiBOb3RlIHRoZXNlIGNhbid0IGJlIGJsZW5kZWQgd2l0aCBtdWx0aXBsZS1tYXN0ZXJzLgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTX0ZvbnRFeHRyYVJlY18KLSAgewotICAgIEZUX1VTaG9ydCAgZnNfdHlwZTsKLQotICB9IFBTX0ZvbnRFeHRyYVJlYzsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBUMV9Gb250UmVjXwotICB7Ci0gICAgUFNfRm9udEluZm9SZWMgICBmb250X2luZm87ICAgICAgICAgLyogZm9udCBpbmZvIGRpY3Rpb25hcnkgICAqLwotICAgIFBTX0ZvbnRFeHRyYVJlYyAgZm9udF9leHRyYTsgICAgICAgIC8qIGZvbnQgaW5mbyBleHRyYSBmaWVsZHMgKi8KLSAgICBQU19Qcml2YXRlUmVjICAgIHByaXZhdGVfZGljdDsgICAgICAvKiBwcml2YXRlIGRpY3Rpb25hcnkgICAgICovCi0gICAgRlRfU3RyaW5nKiAgICAgICBmb250X25hbWU7ICAgICAgICAgLyogdG9wLWxldmVsIGRpY3Rpb25hcnkgICAqLwotCi0gICAgVDFfRW5jb2RpbmdUeXBlICBlbmNvZGluZ190eXBlOwotICAgIFQxX0VuY29kaW5nUmVjICAgZW5jb2Rpbmc7Ci0KLSAgICBGVF9CeXRlKiAgICAgICAgIHN1YnJzX2Jsb2NrOwotICAgIEZUX0J5dGUqICAgICAgICAgY2hhcnN0cmluZ3NfYmxvY2s7Ci0gICAgRlRfQnl0ZSogICAgICAgICBnbHlwaF9uYW1lc19ibG9jazsKLQotICAgIEZUX0ludCAgICAgICAgICAgbnVtX3N1YnJzOwotICAgIEZUX0J5dGUqKiAgICAgICAgc3VicnM7Ci0gICAgRlRfUHRyRGlzdCogICAgICBzdWJyc19sZW47Ci0KLSAgICBGVF9JbnQgICAgICAgICAgIG51bV9nbHlwaHM7Ci0gICAgRlRfU3RyaW5nKiogICAgICBnbHlwaF9uYW1lczsgICAgICAgLyogYXJyYXkgb2YgZ2x5cGggbmFtZXMgICAgICAgKi8KLSAgICBGVF9CeXRlKiogICAgICAgIGNoYXJzdHJpbmdzOyAgICAgICAvKiBhcnJheSBvZiBnbHlwaCBjaGFyc3RyaW5ncyAqLwotICAgIEZUX1B0ckRpc3QqICAgICAgY2hhcnN0cmluZ3NfbGVuOwotCi0gICAgRlRfQnl0ZSAgICAgICAgICBwYWludF90eXBlOwotICAgIEZUX0J5dGUgICAgICAgICAgZm9udF90eXBlOwotICAgIEZUX01hdHJpeCAgICAgICAgZm9udF9tYXRyaXg7Ci0gICAgRlRfVmVjdG9yICAgICAgICBmb250X29mZnNldDsKLSAgICBGVF9CQm94ICAgICAgICAgIGZvbnRfYmJveDsKLSAgICBGVF9Mb25nICAgICAgICAgIGZvbnRfaWQ7Ci0KLSAgICBGVF9GaXhlZCAgICAgICAgIHN0cm9rZV93aWR0aDsKLQotICB9IFQxX0ZvbnRSZWMsICpUMV9Gb250OwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIENJRF9TdWJyc1JlY18KLSAgewotICAgIEZUX1VJbnQgICAgbnVtX3N1YnJzOwotICAgIEZUX0J5dGUqKiAgY29kZTsKLQotICB9IENJRF9TdWJyc1JlYywgKkNJRF9TdWJyczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICBBRk0gRk9OVCBJTkZPUk1BVElPTiBTVFJVQ1RVUkVTICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIHN0cnVjdCAgQUZNX1RyYWNrS2VyblJlY18KLSAgewotICAgIEZUX0ludCAgICBkZWdyZWU7Ci0gICAgRlRfRml4ZWQgIG1pbl9wdHNpemU7Ci0gICAgRlRfRml4ZWQgIG1pbl9rZXJuOwotICAgIEZUX0ZpeGVkICBtYXhfcHRzaXplOwotICAgIEZUX0ZpeGVkICBtYXhfa2VybjsKLQotICB9IEFGTV9UcmFja0tlcm5SZWMsICpBRk1fVHJhY2tLZXJuOwotCi0gIHR5cGVkZWYgc3RydWN0ICBBRk1fS2VyblBhaXJSZWNfCi0gIHsKLSAgICBGVF9JbnQgIGluZGV4MTsKLSAgICBGVF9JbnQgIGluZGV4MjsKLSAgICBGVF9JbnQgIHg7Ci0gICAgRlRfSW50ICB5OwotCi0gIH0gQUZNX0tlcm5QYWlyUmVjLCAqQUZNX0tlcm5QYWlyOwotCi0gIHR5cGVkZWYgc3RydWN0ICBBRk1fRm9udEluZm9SZWNfCi0gIHsKLSAgICBGVF9Cb29sICAgICAgICBJc0NJREZvbnQ7Ci0gICAgRlRfQkJveCAgICAgICAgRm9udEJCb3g7Ci0gICAgRlRfRml4ZWQgICAgICAgQXNjZW5kZXI7Ci0gICAgRlRfRml4ZWQgICAgICAgRGVzY2VuZGVyOwotICAgIEFGTV9UcmFja0tlcm4gIFRyYWNrS2VybnM7ICAgLyogZnJlZSBpZiBub24tTlVMTCAqLwotICAgIEZUX0ludCAgICAgICAgIE51bVRyYWNrS2VybjsKLSAgICBBRk1fS2VyblBhaXIgICBLZXJuUGFpcnM7ICAgIC8qIGZyZWUgaWYgbm9uLU5VTEwgKi8KLSAgICBGVF9JbnQgICAgICAgICBOdW1LZXJuUGFpcjsKLQotICB9IEFGTV9Gb250SW5mb1JlYywgKkFGTV9Gb250SW5mbzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICBPUklHSU5BTCBUMV9GQUNFIENMQVNTIERFRklOSVRJT04gICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIHR5cGVkZWYgc3RydWN0IFQxX0ZhY2VSZWNfKiAgIFQxX0ZhY2U7Ci0gIHR5cGVkZWYgc3RydWN0IENJRF9GYWNlUmVjXyogIENJRF9GYWNlOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFQxX0ZhY2VSZWNfCi0gIHsKLSAgICBGVF9GYWNlUmVjICAgICAgcm9vdDsKLSAgICBUMV9Gb250UmVjICAgICAgdHlwZTE7Ci0gICAgY29uc3Qgdm9pZCogICAgIHBzbmFtZXM7Ci0gICAgY29uc3Qgdm9pZCogICAgIHBzYXV4OwotICAgIGNvbnN0IHZvaWQqICAgICBhZm1fZGF0YTsKLSAgICBGVF9DaGFyTWFwUmVjICAgY2hhcm1hcHJlY3NbMl07Ci0gICAgRlRfQ2hhck1hcCAgICAgIGNoYXJtYXBzWzJdOwotCi0gICAgLyogc3VwcG9ydCBmb3IgTXVsdGlwbGUgTWFzdGVycyBmb250cyAqLwotICAgIFBTX0JsZW5kICAgICAgICBibGVuZDsKLQotICAgIC8qIHVuZG9jdW1lbnRlZCwgb3B0aW9uYWw6IGluZGljZXMgb2Ygc3Vicm91dGluZXMgdGhhdCBleHByZXNzICAgICAgKi8KLSAgICAvKiB0aGUgTm9ybWFsaXplRGVzaWduVmVjdG9yIGFuZCB0aGUgQ29udmVydERlc2lnblZlY3RvciBwcm9jZWR1cmUsICovCi0gICAgLyogcmVzcGVjdGl2ZWx5LCBhcyBUeXBlIDIgY2hhcnN0cmluZ3M7IC0xIGlmIGtleXdvcmRzIG5vdCBwcmVzZW50ICAqLwotICAgIEZUX0ludCAgICAgICAgICAgbmR2X2lkeDsKLSAgICBGVF9JbnQgICAgICAgICAgIGNkdl9pZHg7Ci0KLSAgICAvKiB1bmRvY3VtZW50ZWQsIG9wdGlvbmFsOiBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBsZW5fYnVpbGRjaGFyICovCi0gICAgLyogZm9yIFR5cGUgMiBmb250czsgbWFuaXB1bGF0ZWQgYnkgb3RoZXJzdWJycyAxOSwgMjQsIGFuZCAyNSAgICAqLwotICAgIEZUX1VJbnQgICAgICAgICAgbGVuX2J1aWxkY2hhcjsKLSAgICBGVF9Mb25nKiAgICAgICAgIGJ1aWxkY2hhcjsKLQotICAgIC8qIHNpbmNlIHZlcnNpb24gMi4xIC0gaW50ZXJmYWNlIHRvIFBvc3RTY3JpcHQgaGludGVyICovCi0gICAgY29uc3Qgdm9pZCogICAgIHBzaGludGVyOwotCi0gIH0gVDFfRmFjZVJlYzsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBDSURfRmFjZVJlY18KLSAgewotICAgIEZUX0ZhY2VSZWMgICAgICAgcm9vdDsKLSAgICB2b2lkKiAgICAgICAgICAgIHBzbmFtZXM7Ci0gICAgdm9pZCogICAgICAgICAgICBwc2F1eDsKLSAgICBDSURfRmFjZUluZm9SZWMgIGNpZDsKLSAgICBQU19Gb250RXh0cmFSZWMgIGZvbnRfZXh0cmE7Ci0jaWYgMAotICAgIHZvaWQqICAgICAgICAgICAgYWZtX2RhdGE7Ci0jZW5kaWYKLSAgICBDSURfU3VicnMgICAgICAgIHN1YnJzOwotCi0gICAgLyogc2luY2UgdmVyc2lvbiAyLjEgLSBpbnRlcmZhY2UgdG8gUG9zdFNjcmlwdCBoaW50ZXIgKi8KLSAgICB2b2lkKiAgICAgICAgICAgIHBzaGludGVyOwotCi0gICAgLyogc2luY2UgdmVyc2lvbiAyLjEuOCwgYnV0IHdhcyBvcmlnaW5hbGx5IHBvc2l0aW9uZWQgYWZ0ZXIgYGFmbV9kYXRhJyAqLwotICAgIEZUX0J5dGUqICAgICAgICAgYmluYXJ5X2RhdGE7IC8qIHVzZWQgaWYgaGV4IGRhdGEgaGFzIGJlZW4gY29udmVydGVkICovCi0gICAgRlRfU3RyZWFtICAgICAgICBjaWRfc3RyZWFtOwotCi0gIH0gQ0lEX0ZhY2VSZWM7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19UMVRZUEVTX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC90dHR5cGVzLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3R0dHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzMDJiOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ludGVybmFsL3R0dHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHR0eXBlcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEJhc2ljIFNGTlQvVHJ1ZVR5cGUgdHlwZSBkZWZpbml0aW9ucyBhbmQgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uICAgICovCi0vKiAgICBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAyLCAyMDA0LTIwMDgsIDIwMTItMjAxMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1RUVFlQRVNfSF9fCi0jZGVmaW5lIF9fVFRUWVBFU19IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBQkxFU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSNpbmNsdWRlIEZUX01VTFRJUExFX01BU1RFUlNfSAotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgUkVRVUlSRUQgVFJVRVRZUEUvT1BFTlRZUEUgVEFCTEVTIERFRklOSVRJT05TICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVENfSGVhZGVyUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUcnVlVHlwZSBjb2xsZWN0aW9uIGhlYWRlci4gIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIG9mZnNldHMgb2YgICAgKi8KLSAgLyogICAgdGhlIGZvbnQgaGVhZGVycyBvZiBlYWNoIGRpc3RpbmN0IFRydWVUeXBlIGZhY2UgaW4gdGhlIGZpbGUuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFnICAgICA6OiBNdXN0IGJlIGB0dGMgJyB0byBpbmRpY2F0ZSBhIFRydWVUeXBlIGNvbGxlY3Rpb24uICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJzaW9uIDo6IFRoZSB2ZXJzaW9uIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvdW50ICAgOjogVGhlIG51bWJlciBvZiBmYWNlcyBpbiB0aGUgY29sbGVjdGlvbi4gIFRoZSAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIHNwZWNpZmljYXRpb24gc2F5cyB0aGlzIHNob3VsZCBiZSBhbiB1bnNpZ25lZCBsb25nLCBidXQgKi8KLSAgLyogICAgICAgICAgICAgICB3ZSB1c2UgYSBzaWduZWQgbG9uZyBzaW5jZSB3ZSBuZWVkIHRoZSB2YWx1ZSAtMSBmb3IgICAgICovCi0gIC8qICAgICAgICAgICAgICAgc3BlY2lmaWMgcHVycG9zZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb2Zmc2V0cyA6OiBUaGUgb2Zmc2V0cyBvZiB0aGUgZm9udCBoZWFkZXJzLCBvbmUgcGVyIGZhY2UuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRDX0hlYWRlclJlY18KLSAgewotICAgIEZUX1VMb25nICAgdGFnOwotICAgIEZUX0ZpeGVkICAgdmVyc2lvbjsKLSAgICBGVF9Mb25nICAgIGNvdW50OwotICAgIEZUX1VMb25nKiAgb2Zmc2V0czsKLQotICB9IFRUQ19IZWFkZXJSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTRk5UX0hlYWRlclJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTRk5UIGZpbGUgZm9ybWF0IGhlYWRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb3JtYXRfdGFnICAgICA6OiBUaGUgZm9udCBmb3JtYXQgdGFnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV90YWJsZXMgICAgIDo6IFRoZSBudW1iZXIgb2YgdGFibGVzIGluIGZpbGUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2VhcmNoX3JhbmdlICAgOjogTXVzdCBiZSBgMTYgKiAobWF4IHBvd2VyIG9mIDIgPD0gbnVtX3RhYmxlcyknLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBlbnRyeV9zZWxlY3RvciA6OiBNdXN0IGJlIGxvZzIgb2YgYHNlYXJjaF9yYW5nZSAvIDE2Jy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhbmdlX3NoaWZ0ICAgIDo6IE11c3QgYmUgYG51bV90YWJsZXMgKiAxNiAtIHNlYXJjaF9yYW5nZScuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFNGTlRfSGVhZGVyUmVjXwotICB7Ci0gICAgRlRfVUxvbmcgICBmb3JtYXRfdGFnOwotICAgIEZUX1VTaG9ydCAgbnVtX3RhYmxlczsKLSAgICBGVF9VU2hvcnQgIHNlYXJjaF9yYW5nZTsKLSAgICBGVF9VU2hvcnQgIGVudHJ5X3NlbGVjdG9yOwotICAgIEZUX1VTaG9ydCAgcmFuZ2Vfc2hpZnQ7Ci0KLSAgICBGVF9VTG9uZyAgIG9mZnNldDsgIC8qIG5vdCBpbiBmaWxlICovCi0KLSAgfSBTRk5UX0hlYWRlclJlYywgKlNGTlRfSGVhZGVyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfVGFibGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGEgZ2l2ZW4gdGFibGUgb2YgYSBUcnVlVHlwZSBmb250LiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGFnICAgICAgOjogQSBmb3VyLWJ5dGVzIHRhZyBkZXNjcmliaW5nIHRoZSB0YWJsZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDaGVja1N1bSA6OiBUaGUgdGFibGUgY2hlY2tzdW0uICBUaGlzIHZhbHVlIGNhbiBiZSBpZ25vcmVkLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9mZnNldCAgIDo6IFRoZSBvZmZzZXQgb2YgdGhlIHRhYmxlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBUcnVlVHlwZSAqLwotICAvKiAgICAgICAgICAgICAgICBmb250IGluIGl0cyByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExlbmd0aCAgIDo6IFRoZSB0YWJsZSBsZW5ndGggKGluIGJ5dGVzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1RhYmxlUmVjXwotICB7Ci0gICAgRlRfVUxvbmcgIFRhZzsgICAgICAgIC8qICAgICAgICB0YWJsZSB0eXBlICovCi0gICAgRlRfVUxvbmcgIENoZWNrU3VtOyAgIC8qICAgIHRhYmxlIGNoZWNrc3VtICovCi0gICAgRlRfVUxvbmcgIE9mZnNldDsgICAgIC8qIHRhYmxlIGZpbGUgb2Zmc2V0ICovCi0gICAgRlRfVUxvbmcgIExlbmd0aDsgICAgIC8qICAgICAgdGFibGUgbGVuZ3RoICovCi0KLSAgfSBUVF9UYWJsZVJlYywgKlRUX1RhYmxlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV09GRl9IZWFkZXJSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV09GRiBmaWxlIGZvcm1hdCBoZWFkZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1dPRkYvI1dPRkZIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBXT0ZGX0hlYWRlclJlY18KLSAgewotICAgIEZUX1VMb25nICAgc2lnbmF0dXJlOwotICAgIEZUX1VMb25nICAgZmxhdm9yOwotICAgIEZUX1VMb25nICAgbGVuZ3RoOwotICAgIEZUX1VTaG9ydCAgbnVtX3RhYmxlczsKLSAgICBGVF9VU2hvcnQgIHJlc2VydmVkOwotICAgIEZUX1VMb25nICAgdG90YWxTZm50U2l6ZTsKLSAgICBGVF9VU2hvcnQgIG1ham9yVmVyc2lvbjsKLSAgICBGVF9VU2hvcnQgIG1pbm9yVmVyc2lvbjsKLSAgICBGVF9VTG9uZyAgIG1ldGFPZmZzZXQ7Ci0gICAgRlRfVUxvbmcgICBtZXRhTGVuZ3RoOwotICAgIEZUX1VMb25nICAgbWV0YU9yaWdMZW5ndGg7Ci0gICAgRlRfVUxvbmcgICBwcml2T2Zmc2V0OwotICAgIEZUX1VMb25nICAgcHJpdkxlbmd0aDsKLQotICB9IFdPRkZfSGVhZGVyUmVjLCAqV09GRl9IZWFkZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXT0ZGX1RhYmxlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBnaXZlbiB0YWJsZSBvZiBhIFdPRkYgZm9udC4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUYWcgICAgICAgIDo6IEEgZm91ci1ieXRlcyB0YWcgZGVzY3JpYmluZyB0aGUgdGFibGUuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9mZnNldCAgICAgOjogVGhlIG9mZnNldCBvZiB0aGUgdGFibGUgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIFdPRkYgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGZvbnQgaW4gaXRzIHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXBMZW5ndGggOjogQ29tcHJlc3NlZCB0YWJsZSBsZW5ndGggKGluIGJ5dGVzKS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT3JpZ0xlbmd0aCA6OiBVbm9tcHJlc3NlZCB0YWJsZSBsZW5ndGggKGluIGJ5dGVzKS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDaGVja1N1bSAgIDo6IFRoZSB0YWJsZSBjaGVja3N1bS4gIFRoaXMgdmFsdWUgY2FuIGJlIGlnbm9yZWQuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9yaWdPZmZzZXQgOjogVGhlIHVuY29tcHJlc3NlZCB0YWJsZSBmaWxlIG9mZnNldC4gIFRoaXMgdmFsdWUgZ2V0cyAqLwotICAvKiAgICAgICAgICAgICAgICAgIGNvbXB1dGVkIHdoaWxlIGNvbnN0cnVjdGluZyB0aGUgKHVuY29tcHJlc3NlZCkgU0ZOVCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBoZWFkZXIuICBJdCBpcyBub3QgY29udGFpbmVkIGluIHRoZSBXT0ZGIGZpbGUuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgV09GRl9UYWJsZVJlY18KLSAgewotICAgIEZUX1VMb25nICBUYWc7ICAgICAgICAgICAvKiB0YWJsZSBJRCAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfVUxvbmcgIE9mZnNldDsgICAgICAgIC8qIHRhYmxlIGZpbGUgb2Zmc2V0ICAgICAgICAgKi8KLSAgICBGVF9VTG9uZyAgQ29tcExlbmd0aDsgICAgLyogY29tcHJlc3NlZCB0YWJsZSBsZW5ndGggICAqLwotICAgIEZUX1VMb25nICBPcmlnTGVuZ3RoOyAgICAvKiB1bmNvbXByZXNzZWQgdGFibGUgbGVuZ3RoICovCi0gICAgRlRfVUxvbmcgIENoZWNrU3VtOyAgICAgIC8qIHVuY29tcHJlc3NlZCBjaGVja3N1bSAgICAgKi8KLQotICAgIEZUX1VMb25nICBPcmlnT2Zmc2V0OyAgICAvKiB1bmNvbXByZXNzZWQgdGFibGUgZmlsZSBvZmZzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG5vdCBpbiB0aGUgV09GRiBmaWxlKSAgICAgICAgICovCi0gIH0gV09GRl9UYWJsZVJlYywgKldPRkZfVGFibGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Mb25nTWV0cmljc1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSBtb2RlbGluZyB0aGUgbG9uZyBtZXRyaWNzIG9mIHRoZSBgaG10eCcgYW5kIGB2bXR4JyAgICAgKi8KLSAgLyogICAgVHJ1ZVR5cGUgdGFibGVzLiAgVGhlIHZhbHVlcyBhcmUgZXhwcmVzc2VkIGluIGZvbnQgdW5pdHMuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWR2YW5jZSA6OiBUaGUgYWR2YW5jZSB3aWR0aCBvciBoZWlnaHQgZm9yIHRoZSBnbHlwaC4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiZWFyaW5nIDo6IFRoZSBsZWZ0LXNpZGUgb3IgdG9wLXNpZGUgYmVhcmluZyBmb3IgdGhlIGdseXBoLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9Mb25nTWV0cmljc1JlY18KLSAgewotICAgIEZUX1VTaG9ydCAgYWR2YW5jZTsKLSAgICBGVF9TaG9ydCAgIGJlYXJpbmc7Ci0KLSAgfSBUVF9Mb25nTWV0cmljc1JlYywgKlRUX0xvbmdNZXRyaWNzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfU2hvcnRNZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzaW1wbGUgdHlwZSB0byBtb2RlbCB0aGUgc2hvcnQgbWV0cmljcyBvZiB0aGUgYGhtdHgnIGFuZCBgdm10eCcgICovCi0gIC8qICAgIHRhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9TaG9ydCAgVFRfU2hvcnRNZXRyaWNzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTmFtZUVudHJ5UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgbW9kZWxpbmcgVHJ1ZVR5cGUgbmFtZSByZWNvcmRzLiAgTmFtZSByZWNvcmRzIGFyZSB1c2VkICovCi0gIC8qICAgIHRvIHN0b3JlIGltcG9ydGFudCBzdHJpbmdzIGxpa2UgZmFtaWx5IG5hbWUsIHN0eWxlIG5hbWUsICAgICAgICAgICAqLwotICAvKiAgICBjb3B5cmlnaHQsIGV0Yy4gaW4gX2xvY2FsaXplZF8gdmVyc2lvbnMgKGkuZS4sIGxhbmd1YWdlLCBlbmNvZGluZywgKi8KLSAgLyogICAgZXRjKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGxhdGZvcm1JRCAgIDo6IFRoZSBJRCBvZiB0aGUgbmFtZSdzIGVuY29kaW5nIHBsYXRmb3JtLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBlbmNvZGluZ0lEICAgOjogVGhlIHBsYXRmb3JtLXNwZWNpZmljIElEIGZvciB0aGUgbmFtZSdzIGVuY29kaW5nLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxhbmd1YWdlSUQgICA6OiBUaGUgcGxhdGZvcm0tc3BlY2lmaWMgSUQgZm9yIHRoZSBuYW1lJ3MgbGFuZ3VhZ2UuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmFtZUlEICAgICAgIDo6IFRoZSBJRCBzcGVjaWZ5aW5nIHdoYXQga2luZCBvZiBuYW1lIHRoaXMgaXMuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJpbmdMZW5ndGggOjogVGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmluZ09mZnNldCA6OiBUaGUgb2Zmc2V0IHRvIHRoZSBzdHJpbmcgaW4gdGhlIGBuYW1lJyB0YWJsZS4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyaW5nICAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgc3RyaW5nJ3MgYnl0ZXMuICBOb3RlIHRoYXQgdGhlc2UgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBhcmUgdXN1YWxseSBVVEYtMTYgZW5jb2RlZCBjaGFyYWN0ZXJzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX05hbWVFbnRyeVJlY18KLSAgewotICAgIEZUX1VTaG9ydCAgcGxhdGZvcm1JRDsKLSAgICBGVF9VU2hvcnQgIGVuY29kaW5nSUQ7Ci0gICAgRlRfVVNob3J0ICBsYW5ndWFnZUlEOwotICAgIEZUX1VTaG9ydCAgbmFtZUlEOwotICAgIEZUX1VTaG9ydCAgc3RyaW5nTGVuZ3RoOwotICAgIEZUX1VMb25nICAgc3RyaW5nT2Zmc2V0OwotCi0gICAgLyogdGhpcyBsYXN0IGZpZWxkIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBzcGVjICovCi0gICAgLyogYnV0IHVzZWQgYnkgdGhlIEZyZWVUeXBlIGVuZ2luZSAgICAgICAgICAgICovCi0KLSAgICBGVF9CeXRlKiAgIHN0cmluZzsKLQotICB9IFRUX05hbWVFbnRyeVJlYywgKlRUX05hbWVFbnRyeTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX05hbWVUYWJsZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIG1vZGVsaW5nIHRoZSBUcnVlVHlwZSBuYW1lIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvcm1hdCAgICAgICAgIDo6IFRoZSBmb3JtYXQgb2YgdGhlIG5hbWUgdGFibGUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtTmFtZVJlY29yZHMgOjogVGhlIG51bWJlciBvZiBuYW1lcyBpbiB0YWJsZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdG9yYWdlT2Zmc2V0ICA6OiBUaGUgb2Zmc2V0IG9mIHRoZSBuYW1lIHRhYmxlIGluIHRoZSBgbmFtZScgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuYW1lcyAgICAgICAgICA6OiBBbiBhcnJheSBvZiBuYW1lIHJlY29yZHMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICAgICAgIDo6IHRoZSBmaWxlJ3MgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX05hbWVUYWJsZVJlY18KLSAgewotICAgIEZUX1VTaG9ydCAgICAgICAgIGZvcm1hdDsKLSAgICBGVF9VSW50ICAgICAgICAgICBudW1OYW1lUmVjb3JkczsKLSAgICBGVF9VSW50ICAgICAgICAgICBzdG9yYWdlT2Zmc2V0OwotICAgIFRUX05hbWVFbnRyeVJlYyogIG5hbWVzOwotICAgIEZUX1N0cmVhbSAgICAgICAgIHN0cmVhbTsKLQotICB9IFRUX05hbWVUYWJsZVJlYywgKlRUX05hbWVUYWJsZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICBPUFRJT05BTCBUUlVFVFlQRS9PUEVOVFlQRSBUQUJMRVMgREVGSU5JVElPTlMgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0dhc3BSYW5nZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdGlueSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIGdhc3AgcmFuZ2UgYWNjb3JkaW5nIHRvIHRoZSAgICAgICAqLwotICAvKiAgICBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhQUEVNICA6OiBUaGUgbWF4aW11bSBwcGVtIHZhbHVlIHRvIHdoaWNoIGBnYXNwRmxhZycgYXBwbGllcy4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdhc3BGbGFnIDo6IEEgZmxhZyBkZXNjcmliaW5nIHRoZSBncmlkLWZpdHRpbmcgYW5kIGFudGktYWxpYXNpbmcgICAqLwotICAvKiAgICAgICAgICAgICAgICBtb2RlcyB0byBiZSB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9HYXNwUmFuZ2VSZWNfCi0gIHsKLSAgICBGVF9VU2hvcnQgIG1heFBQRU07Ci0gICAgRlRfVVNob3J0ICBnYXNwRmxhZzsKLQotICB9IFRUX0dhc3BSYW5nZVJlYywgKlRUX0dhc3BSYW5nZTsKLQotCi0jZGVmaW5lIFRUX0dBU1BfR1JJREZJVCAgMHgwMQotI2RlZmluZSBUVF9HQVNQX0RPR1JBWSAgIDB4MDIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0dhc3BSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIG1vZGVsaW5nIHRoZSBUcnVlVHlwZSBgZ2FzcCcgdGFibGUgdXNlZCB0byBzcGVjaWZ5ICAgICAqLwotICAvKiAgICBncmlkLWZpdHRpbmcgYW5kIGFudGktYWxpYXNpbmcgYmVoYXZpb3VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJzaW9uICAgIDo6IFRoZSB2ZXJzaW9uIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bVJhbmdlcyAgOjogVGhlIG51bWJlciBvZiBnYXNwIHJhbmdlcyBpbiB0YWJsZS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2FzcFJhbmdlcyA6OiBBbiBhcnJheSBvZiBnYXNwIHJhbmdlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfR2FzcF8KLSAgewotICAgIEZUX1VTaG9ydCAgICAgdmVyc2lvbjsKLSAgICBGVF9VU2hvcnQgICAgIG51bVJhbmdlczsKLSAgICBUVF9HYXNwUmFuZ2UgIGdhc3BSYW5nZXM7Ci0KLSAgfSBUVF9HYXNwUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICBFTUJFRERFRCBCSVRNQVBTIFNVUFBPUlQgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfU0JpdF9NZXRyaWNzUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIHRoZSBiaWcgbWV0cmljcyBvZiBhIGdpdmVuIGdseXBoIGJpdG1hcCAgICovCi0gIC8qICAgIGluIGEgVHJ1ZVR5cGUgb3IgT3BlblR5cGUgZm9udC4gIFRoZXNlIGFyZSB1c3VhbGx5IGZvdW5kIGluIHRoZSAgICAqLwotICAvKiAgICBgRUJEVCcgKE1pY3Jvc29mdCkgb3IgYGJsb2MnIChBcHBsZSkgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZWlnaHQgICAgICAgOjogVGhlIGdseXBoIGhlaWdodCBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHdpZHRoICAgICAgICA6OiBUaGUgZ2x5cGggd2lkdGggaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaG9yaUJlYXJpbmdYIDo6IFRoZSBob3Jpem9udGFsIGxlZnQgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBob3JpQmVhcmluZ1kgOjogVGhlIGhvcml6b250YWwgdG9wIGJlYXJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhvcmlBZHZhbmNlICA6OiBUaGUgaG9yaXpvbnRhbCBhZHZhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydEJlYXJpbmdYIDo6IFRoZSB2ZXJ0aWNhbCBsZWZ0IGJlYXJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJ0QmVhcmluZ1kgOjogVGhlIHZlcnRpY2FsIHRvcCBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnRBZHZhbmNlICA6OiBUaGUgdmVydGljYWwgYWR2YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1NCaXRfTWV0cmljc1JlY18KLSAgewotICAgIEZUX1VTaG9ydCAgaGVpZ2h0OwotICAgIEZUX1VTaG9ydCAgd2lkdGg7Ci0KLSAgICBGVF9TaG9ydCAgIGhvcmlCZWFyaW5nWDsKLSAgICBGVF9TaG9ydCAgIGhvcmlCZWFyaW5nWTsKLSAgICBGVF9VU2hvcnQgIGhvcmlBZHZhbmNlOwotCi0gICAgRlRfU2hvcnQgICB2ZXJ0QmVhcmluZ1g7Ci0gICAgRlRfU2hvcnQgICB2ZXJ0QmVhcmluZ1k7Ci0gICAgRlRfVVNob3J0ICB2ZXJ0QWR2YW5jZTsKLQotICB9IFRUX1NCaXRfTWV0cmljc1JlYywgKlRUX1NCaXRfTWV0cmljczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1NCaXRfU21hbGxNZXRyaWNzUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCB0aGUgc21hbGwgbWV0cmljcyBvZiBhIGdpdmVuIGdseXBoIGJpdG1hcCAqLwotICAvKiAgICBpbiBhIFRydWVUeXBlIG9yIE9wZW5UeXBlIGZvbnQuICBUaGVzZSBhcmUgdXN1YWxseSBmb3VuZCBpbiB0aGUgICAgKi8KLSAgLyogICAgYEVCRFQnIChNaWNyb3NvZnQpIG9yIHRoZSBgYmRhdCcgKEFwcGxlKSB0YWJsZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGVpZ2h0ICAgOjogVGhlIGdseXBoIGhlaWdodCBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB3aWR0aCAgICA6OiBUaGUgZ2x5cGggd2lkdGggaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJlYXJpbmdYIDo6IFRoZSBsZWZ0LXNpZGUgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmVhcmluZ1kgOjogVGhlIHRvcC1zaWRlIGJlYXJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZHZhbmNlICA6OiBUaGUgYWR2YW5jZSB3aWR0aCBvciBoZWlnaHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9TQml0X1NtYWxsX01ldHJpY3NfCi0gIHsKLSAgICBGVF9CeXRlICBoZWlnaHQ7Ci0gICAgRlRfQnl0ZSAgd2lkdGg7Ci0KLSAgICBGVF9DaGFyICBiZWFyaW5nWDsKLSAgICBGVF9DaGFyICBiZWFyaW5nWTsKLSAgICBGVF9CeXRlICBhZHZhbmNlOwotCi0gIH0gVFRfU0JpdF9TbWFsbE1ldHJpY3NSZWMsICpUVF9TQml0X1NtYWxsTWV0cmljczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1NCaXRfTGluZU1ldHJpY3NSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHRleHQgbGluZSBtZXRyaWNzIG9mIGEgZ2l2ZW4gICAgICAqLwotICAvKiAgICBiaXRtYXAgc3RyaWtlLCBmb3IgZWl0aGVyIGEgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBsYXlvdXQuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhc2NlbmRlciAgICAgICAgICAgICAgICA6OiBUaGUgYXNjZW5kZXIgaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlc2NlbmRlciAgICAgICAgICAgICAgIDo6IFRoZSBkZXNjZW5kZXIgaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4X3dpZHRoICAgICAgICAgICAgICAgOjogVGhlIG1heGltdW0gZ2x5cGggd2lkdGggaW4gcGl4ZWxzLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjYXJldF9zbG9wZV9lbnVtZXJhdG9yICA6OiBSaXNlIG9mIHRoZSBjYXJldCBzbG9wZSwgdHlwaWNhbGx5IHNldCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gMSBmb3Igbm9uLWl0YWxpYyBmb250cy4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjYXJldF9zbG9wZV9kZW5vbWluYXRvciA6OiBSaXNlIG9mIHRoZSBjYXJldCBzbG9wZSwgdHlwaWNhbGx5IHNldCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gMCBmb3Igbm9uLWl0YWxpYyBmb250cy4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjYXJldF9vZmZzZXQgICAgICAgICAgICA6OiBPZmZzZXQgaW4gcGl4ZWxzIHRvIG1vdmUgdGhlIGNhcmV0IGZvciAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVyIHBvc2l0aW9uaW5nLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtaW5fb3JpZ2luX1NCICAgICAgICAgICA6OiBNaW5pbXVtIG9mIGhvcmlCZWFyaW5nWCAocmVzcC4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydEJlYXJpbmdZKS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1pbl9hZHZhbmNlX1NCICAgICAgICAgIDo6IE1pbmltdW0gb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsIGFkdmFuY2UgLSAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIGhvcmlCZWFyaW5nWCArIHdpZHRoICkgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGFkdmFuY2UgLSAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggdmVydEJlYXJpbmdZICsgaGVpZ2h0ICkgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhfYmVmb3JlX0JMICAgICAgICAgICA6OiBNYXhpbXVtIG9mIGhvcmlCZWFyaW5nWSAocmVzcC4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydEJlYXJpbmdZKS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtaW5fYWZ0ZXJfQkwgICAgICAgICAgICA6OiBNaW5pbXVtIG9mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yaUJlYXJpbmdZIC0gaGVpZ2h0ICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRCZWFyaW5nWCAtIHdpZHRoICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhZHMgICAgICAgICAgICAgICAgICAgIDo6IFVudXNlZCAodG8gbWFrZSB0aGUgc2l6ZSBvZiB0aGUgcmVjb3JkICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIG11bHRpcGxlIG9mIDMyIGJpdHMuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9TQml0X0xpbmVNZXRyaWNzUmVjXwotICB7Ci0gICAgRlRfQ2hhciAgYXNjZW5kZXI7Ci0gICAgRlRfQ2hhciAgZGVzY2VuZGVyOwotICAgIEZUX0J5dGUgIG1heF93aWR0aDsKLSAgICBGVF9DaGFyICBjYXJldF9zbG9wZV9udW1lcmF0b3I7Ci0gICAgRlRfQ2hhciAgY2FyZXRfc2xvcGVfZGVub21pbmF0b3I7Ci0gICAgRlRfQ2hhciAgY2FyZXRfb2Zmc2V0OwotICAgIEZUX0NoYXIgIG1pbl9vcmlnaW5fU0I7Ci0gICAgRlRfQ2hhciAgbWluX2FkdmFuY2VfU0I7Ci0gICAgRlRfQ2hhciAgbWF4X2JlZm9yZV9CTDsKLSAgICBGVF9DaGFyICBtaW5fYWZ0ZXJfQkw7Ci0gICAgRlRfQ2hhciAgcGFkc1syXTsKLQotICB9IFRUX1NCaXRfTGluZU1ldHJpY3NSZWMsICpUVF9TQml0X0xpbmVNZXRyaWNzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfU0JpdF9SYW5nZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBUcnVlVHlwZS9PcGVuVHlwZSBzdWJJbmRleFRhYmxlIGFzIGRlZmluZWQgaW4gdGhlIGBFQkxDJyAgICAgICAgICovCi0gIC8qICAgIChNaWNyb3NvZnQpIG9yIGBibG9jJyAoQXBwbGUpIHRhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZpcnN0X2dseXBoICAgOjogVGhlIGZpcnN0IGdseXBoIGluZGV4IGluIHRoZSByYW5nZS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGFzdF9nbHlwaCAgICA6OiBUaGUgbGFzdCBnbHlwaCBpbmRleCBpbiB0aGUgcmFuZ2UuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpbmRleF9mb3JtYXQgIDo6IFRoZSBmb3JtYXQgb2YgaW5kZXggdGFibGUuICBWYWxpZCB2YWx1ZXMgYXJlIDEgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICB0byA1LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpbWFnZV9mb3JtYXQgIDo6IFRoZSBmb3JtYXQgb2YgYEVCRFQnIGltYWdlIGRhdGEuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGltYWdlX29mZnNldCAgOjogVGhlIG9mZnNldCB0byBpbWFnZSBkYXRhIGluIGBFQkRUJy4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaW1hZ2Vfc2l6ZSAgICA6OiBGb3IgaW5kZXggZm9ybWF0cyAyIGFuZCA1LiAgVGhpcyBpcyB0aGUgc2l6ZSBpbiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgb2YgZWFjaCBnbHlwaCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmlnX21ldHJpY3MgICA6OiBGb3IgaW5kZXggZm9ybWF0cyAyIGFuZCA1LiAgVGhpcyBpcyB0aGUgYmlnICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgbWV0cmljcyBmb3IgZWFjaCBnbHlwaCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2dseXBocyAgICA6OiBGb3IgaW5kZXggZm9ybWF0cyA0IGFuZCA1LiAgVGhpcyBpcyB0aGUgbnVtYmVyIG9mICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgZ2x5cGhzIGluIHRoZSBjb2RlIGFycmF5LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfb2Zmc2V0cyA6OiBGb3IgaW5kZXggZm9ybWF0cyAxIGFuZCAzLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9jb2RlcyAgIDo6IEZvciBpbmRleCBmb3JtYXRzIDQgYW5kIDUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhYmxlX29mZnNldCAgOjogVGhlIG9mZnNldCBvZiB0aGUgaW5kZXggdGFibGUgaW4gdGhlIGBFQkxDJyAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgIHRhYmxlLiAgT25seSB1c2VkIGR1cmluZyBzdHJpa2UgbG9hZGluZy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9TQml0X1JhbmdlUmVjXwotICB7Ci0gICAgRlRfVVNob3J0ICAgICAgICAgICBmaXJzdF9nbHlwaDsKLSAgICBGVF9VU2hvcnQgICAgICAgICAgIGxhc3RfZ2x5cGg7Ci0KLSAgICBGVF9VU2hvcnQgICAgICAgICAgIGluZGV4X2Zvcm1hdDsKLSAgICBGVF9VU2hvcnQgICAgICAgICAgIGltYWdlX2Zvcm1hdDsKLSAgICBGVF9VTG9uZyAgICAgICAgICAgIGltYWdlX29mZnNldDsKLQotICAgIEZUX1VMb25nICAgICAgICAgICAgaW1hZ2Vfc2l6ZTsKLSAgICBUVF9TQml0X01ldHJpY3NSZWMgIG1ldHJpY3M7Ci0gICAgRlRfVUxvbmcgICAgICAgICAgICBudW1fZ2x5cGhzOwotCi0gICAgRlRfVUxvbmcqICAgICAgICAgICBnbHlwaF9vZmZzZXRzOwotICAgIEZUX1VTaG9ydCogICAgICAgICAgZ2x5cGhfY29kZXM7Ci0KLSAgICBGVF9VTG9uZyAgICAgICAgICAgIHRhYmxlX29mZnNldDsKLQotICB9IFRUX1NCaXRfUmFuZ2VSZWMsICpUVF9TQml0X1JhbmdlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfU0JpdF9TdHJpa2VSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCBkZXNjcmliZSBhIGdpdmVuIGJpdG1hcCBzdHJpa2UgaW4gdGhlIGBFQkxDJyAgICAgICovCi0gIC8qICAgIChNaWNyb3NvZnQpIG9yIGBibG9jJyAoQXBwbGUpIHRhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgbnVtX2luZGV4X3JhbmdlcyA6OiBUaGUgbnVtYmVyIG9mIGluZGV4IHJhbmdlcy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBpbmRleF9yYW5nZXMgICAgIDo6IEFuIGFycmF5IG9mIGdseXBoIGluZGV4IHJhbmdlcy4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGNvbG9yX3JlZiAgICAgICAgOjogVW51c2VkLiAgYGNvbG9yX3JlZicgaXMgcHV0IGluIGZvciBmdXR1cmUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIGVuaGFuY2VtZW50cywgYnV0IHRoZXNlIGZpZWxkcyBhcmUgYWxyZWFkeSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBpbiB1c2UgYnkgb3RoZXIgcGxhdGZvcm1zIChlLmcuIE5ld3RvbikuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgRm9yIGRldGFpbHMsIHBsZWFzZSBzZWUgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly9mb250cy5hcHBsZS5jb20vICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRSZWZNYW4vUk0wNi9DaGFwNmJsb2MuaHRtbCAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgaG9yaSAgICAgICAgICAgICA6OiBUaGUgbGluZSBtZXRyaWNzIGZvciBob3Jpem9udGFsIGxheW91dHMuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB2ZXJ0ICAgICAgICAgICAgIDo6IFRoZSBsaW5lIG1ldHJpY3MgZm9yIHZlcnRpY2FsIGxheW91dHMuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHN0YXJ0X2dseXBoICAgICAgOjogVGhlIGxvd2VzdCBnbHlwaCBpbmRleCBmb3IgdGhpcyBzdHJpa2UuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZW5kX2dseXBoICAgICAgICA6OiBUaGUgaGlnaGVzdCBnbHlwaCBpbmRleCBmb3IgdGhpcyBzdHJpa2UuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB4X3BwZW0gICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgaG9yaXpvbnRhbCBwaXhlbHMgcGVyIEVNLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHlfcHBlbSAgICAgICAgICAgOjogVGhlIG51bWJlciBvZiB2ZXJ0aWNhbCBwaXhlbHMgcGVyIEVNLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgYml0X2RlcHRoICAgICAgICA6OiBUaGUgYml0IGRlcHRoLiAgVmFsaWQgdmFsdWVzIGFyZSAxLCAyLCA0LCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgYW5kIDguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZmxhZ3MgICAgICAgICAgICA6OiBJcyB0aGlzIGEgdmVydGljYWwgb3IgaG9yaXpvbnRhbCBzdHJpa2U/ICBGb3IgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlscywgcGxlYXNlIHNlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly9mb250cy5hcHBsZS5jb20vICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRSZWZNYW4vUk0wNi9DaGFwNmJsb2MuaHRtbCAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9TQml0X1N0cmlrZVJlY18KLSAgewotICAgIEZUX0ludCAgICAgICAgICAgICAgICAgIG51bV9yYW5nZXM7Ci0gICAgVFRfU0JpdF9SYW5nZSAgICAgICAgICAgc2JpdF9yYW5nZXM7Ci0gICAgRlRfVUxvbmcgICAgICAgICAgICAgICAgcmFuZ2VzX29mZnNldDsKLQotICAgIEZUX1VMb25nICAgICAgICAgICAgICAgIGNvbG9yX3JlZjsKLQotICAgIFRUX1NCaXRfTGluZU1ldHJpY3NSZWMgIGhvcmk7Ci0gICAgVFRfU0JpdF9MaW5lTWV0cmljc1JlYyAgdmVydDsKLQotICAgIEZUX1VTaG9ydCAgICAgICAgICAgICAgIHN0YXJ0X2dseXBoOwotICAgIEZUX1VTaG9ydCAgICAgICAgICAgICAgIGVuZF9nbHlwaDsKLQotICAgIEZUX0J5dGUgICAgICAgICAgICAgICAgIHhfcHBlbTsKLSAgICBGVF9CeXRlICAgICAgICAgICAgICAgICB5X3BwZW07Ci0KLSAgICBGVF9CeXRlICAgICAgICAgICAgICAgICBiaXRfZGVwdGg7Ci0gICAgRlRfQ2hhciAgICAgICAgICAgICAgICAgZmxhZ3M7Ci0KLSAgfSBUVF9TQml0X1N0cmlrZVJlYywgKlRUX1NCaXRfU3RyaWtlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfU0JpdF9Db21wb25lbnRSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzaW1wbGUgc3RydWN0dXJlIHRvIGRlc2NyaWJlIGEgY29tcG91bmQgc2JpdCBlbGVtZW50LiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfY29kZSA6OiBUaGUgZWxlbWVudCdzIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4X29mZnNldCAgIDo6IFRoZSBlbGVtZW50J3MgbGVmdCBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHlfb2Zmc2V0ICAgOjogVGhlIGVsZW1lbnQncyB0b3AgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1NCaXRfQ29tcG9uZW50UmVjXwotICB7Ci0gICAgRlRfVVNob3J0ICBnbHlwaF9jb2RlOwotICAgIEZUX0NoYXIgICAgeF9vZmZzZXQ7Ci0gICAgRlRfQ2hhciAgICB5X29mZnNldDsKLQotICB9IFRUX1NCaXRfQ29tcG9uZW50UmVjLCAqVFRfU0JpdF9Db21wb25lbnQ7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9TQml0X1NjYWxlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIGRlc2NyaWJlIGEgZ2l2ZW4gYml0bWFwIHNjYWxpbmcgdGFibGUsIGFzIGRlZmluZWQgKi8KLSAgLyogICAgaW4gdGhlIGBFQlNDJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaG9yaSAgICAgICAgICAgICAgOjogVGhlIGhvcml6b250YWwgbGluZSBtZXRyaWNzLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJ0ICAgICAgICAgICAgICA6OiBUaGUgdmVydGljYWwgbGluZSBtZXRyaWNzLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHhfcHBlbSAgICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgaG9yaXpvbnRhbCBwaXhlbHMgcGVyIEVNLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeV9wcGVtICAgICAgICAgICAgOjogVGhlIG51bWJlciBvZiB2ZXJ0aWNhbCBwaXhlbHMgcGVyIEVNLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4X3BwZW1fc3Vic3RpdHV0ZSA6OiBTdWJzdGl0dXRpb24geF9wcGVtIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHlfcHBlbV9zdWJzdGl0dXRlIDo6IFN1YnN0aXR1dGlvbiB5X3BwZW0gdmFsdWUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1NCaXRfU2NhbGVSZWNfCi0gIHsKLSAgICBUVF9TQml0X0xpbmVNZXRyaWNzUmVjICBob3JpOwotICAgIFRUX1NCaXRfTGluZU1ldHJpY3NSZWMgIHZlcnQ7Ci0KLSAgICBGVF9CeXRlICAgICAgICAgICAgICAgICB4X3BwZW07Ci0gICAgRlRfQnl0ZSAgICAgICAgICAgICAgICAgeV9wcGVtOwotCi0gICAgRlRfQnl0ZSAgICAgICAgICAgICAgICAgeF9wcGVtX3N1YnN0aXR1dGU7Ci0gICAgRlRfQnl0ZSAgICAgICAgICAgICAgICAgeV9wcGVtX3N1YnN0aXR1dGU7Ci0KLSAgfSBUVF9TQml0X1NjYWxlUmVjLCAqVFRfU0JpdF9TY2FsZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgIFBPU1RTQ1JJUFQgR0xZUEggTkFNRVMgU1VQUE9SVCAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1Bvc3RfMjBSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBvc3RzY3JpcHQgbmFtZXMgc3ViLXRhYmxlLCBmb3JtYXQgMi4wLiAgU3RvcmVzIHRoZSBQUyBuYW1lIG9mICAgICAqLwotICAvKiAgICBlYWNoIGdseXBoIGluIHRoZSBmb250IGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fZ2x5cGhzICAgIDo6IFRoZSBudW1iZXIgb2YgbmFtZWQgZ2x5cGhzIGluIHRoZSB0YWJsZS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9uYW1lcyAgICAgOjogVGhlIG51bWJlciBvZiBQUyBuYW1lcyBzdG9yZWQgaW4gdGhlIHRhYmxlLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfaW5kaWNlcyA6OiBUaGUgaW5kaWNlcyBvZiB0aGUgZ2x5cGhzIGluIHRoZSBuYW1lcyBhcnJheXMuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9uYW1lcyAgIDo6IFRoZSBQUyBuYW1lcyBub3QgaW4gTWFjIEVuY29kaW5nLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9Qb3N0XzIwUmVjXwotICB7Ci0gICAgRlRfVVNob3J0ICAgbnVtX2dseXBoczsKLSAgICBGVF9VU2hvcnQgICBudW1fbmFtZXM7Ci0gICAgRlRfVVNob3J0KiAgZ2x5cGhfaW5kaWNlczsKLSAgICBGVF9DaGFyKiogICBnbHlwaF9uYW1lczsKLQotICB9IFRUX1Bvc3RfMjBSZWMsICpUVF9Qb3N0XzIwOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfUG9zdF8yNVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUG9zdHNjcmlwdCBuYW1lcyBzdWItdGFibGUsIGZvcm1hdCAyLjUuICBTdG9yZXMgdGhlIFBTIG5hbWUgb2YgICAgICovCi0gIC8qICAgIGVhY2ggZ2x5cGggaW4gdGhlIGZvbnQgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9nbHlwaHMgOjogVGhlIG51bWJlciBvZiBnbHlwaHMgaW4gdGhlIHRhYmxlLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb2Zmc2V0cyAgICA6OiBBbiBhcnJheSBvZiBzaWduZWQgb2Zmc2V0cyBpbiBhIG5vcm1hbCBNYWMgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgUG9zdHNjcmlwdCBuYW1lIGVuY29kaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1Bvc3RfMjVfCi0gIHsKLSAgICBGVF9VU2hvcnQgIG51bV9nbHlwaHM7Ci0gICAgRlRfQ2hhciogICBvZmZzZXRzOwotCi0gIH0gVFRfUG9zdF8yNVJlYywgKlRUX1Bvc3RfMjU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Qb3N0X05hbWVzUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQb3N0c2NyaXB0IG5hbWVzIHRhYmxlLCBlaXRoZXIgZm9ybWF0IDIuMCBvciAyLjUuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkZWQgICAgOjogQSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIFBTIG5hbWVzIGFyZSBsb2FkZWQuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvcm1hdF8yMCA6OiBUaGUgc3ViLXRhYmxlIHVzZWQgZm9yIGZvcm1hdCAyLjAuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9ybWF0XzI1IDo6IFRoZSBzdWItdGFibGUgdXNlZCBmb3IgZm9ybWF0IDIuNS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfUG9zdF9OYW1lc1JlY18KLSAgewotICAgIEZUX0Jvb2wgIGxvYWRlZDsKLQotICAgIHVuaW9uCi0gICAgewotICAgICAgVFRfUG9zdF8yMFJlYyAgZm9ybWF0XzIwOwotICAgICAgVFRfUG9zdF8yNVJlYyAgZm9ybWF0XzI1OwotCi0gICAgfSBuYW1lczsKLQotICB9IFRUX1Bvc3RfTmFtZXNSZWMsICpUVF9Qb3N0X05hbWVzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICBHWCBWQVJJQVRJT04gVEFCTEUgU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0gIHR5cGVkZWYgc3RydWN0IEdYX0JsZW5kUmVjXyAgKkdYX0JsZW5kOwotI2VuZGlmCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICBFTUJFRERFRCBCREYgUFJPUEVSVElFUyBUQUJMRSBTVVBQT1JUICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qCi0gICAqIFRoZXNlIHR5cGVzIGFyZSB1c2VkIHRvIHN1cHBvcnQgYSBgQkRGICcgdGFibGUgdGhhdCBpc24ndCBwYXJ0IG9mIHRoZQotICAgKiBvZmZpY2lhbCBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uLiAgSXQgaXMgbWFpbmx5IHVzZWQgaW4gU0ZOVC1iYXNlZAotICAgKiBiaXRtYXAgZm9udHMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBmcm9tIGEgc2V0IG9mIEJERiBmb250cy4KLSAgICoKLSAgICogVGhlIGZvcm1hdCBvZiB0aGUgdGFibGUgaXMgYXMgZm9sbG93cy4KLSAgICoKLSAgICogICBVU0hPUlQgICB2ZXJzaW9uICAgICAgYEJERiAnIHRhYmxlIHZlcnNpb24gbnVtYmVyLCBzaG91bGQgYmUgMHgwMDAxLgotICAgKiAgIFVTSE9SVCAgIHN0cmlrZUNvdW50ICBOdW1iZXIgb2Ygc3RyaWtlcyAoYml0bWFwIHNpemVzKSBpbiB0aGlzIHRhYmxlLgotICAgKiAgIFVMT05HICAgIHN0cmluZ1RhYmxlICBPZmZzZXQgKGZyb20gc3RhcnQgb2YgQkRGIHRhYmxlKSB0byBzdHJpbmcKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuCi0gICAqCi0gICAqIFRoaXMgaXMgZm9sbG93ZWQgYnkgYW4gYXJyYXkgb2YgYHN0cmlrZUNvdW50JyBkZXNjcmlwdG9ycywgaGF2aW5nIHRoZQotICAgKiBmb2xsb3dpbmcgZm9ybWF0LgotICAgKgotICAgKiAgIFVTSE9SVCAgIHBwZW0gICAgICAgICBWZXJ0aWNhbCBwaXhlbHMgcGVyIEVNIGZvciB0aGlzIHN0cmlrZS4KLSAgICogICBVU0hPUlQgICBudW1JdGVtcyAgICAgTnVtYmVyIG9mIGl0ZW1zIGZvciB0aGlzIHN0cmlrZSAocHJvcGVydGllcyBhbmQKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgYXRvbXMpLiAgTWF4aW11bSBpcyAyNTUuCi0gICAqCi0gICAqIFRoaXMgYXJyYXkgaW4gdHVybiBpcyBmb2xsb3dlZCBieSBgc3RyaWtlQ291bnQnIHZhbHVlIHNldHMuICBFYWNoCi0gICAqIGB2YWx1ZSBzZXQnIGlzIGFuIGFycmF5IG9mIGBudW1JdGVtcycgaXRlbXMgd2l0aCB0aGUgZm9sbG93aW5nIGZvcm1hdC4KLSAgICoKLSAgICogICBVTE9ORyAgICBpdGVtX25hbWUgICAgT2Zmc2V0IGluIHN0cmluZyB0YWJsZSB0byBpdGVtIG5hbWUuCi0gICAqICAgVVNIT1JUICAgaXRlbV90eXBlICAgIFRoZSBpdGVtIHR5cGUuICBQb3NzaWJsZSB2YWx1ZXMgYXJlCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPT4gc3RyaW5nIChlLmcuLCBDT01NRU5UKQotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0+IGF0b20gICAoZS5nLiwgRk9OVCBvciBldmVuIFNJWkUpCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgPT4gaW50MzIKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgMyA9PiB1aW50MzIKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgMHgxMCA9PiBBIGZsYWcgdG8gaW5kaWNhdGUgYSBwcm9wZXJ0aWVzLiAgVGhpcwotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIE9SZWQgd2l0aCB0aGUgYWJvdmUgdmFsdWVzLgotICAgKiAgIFVMT05HICAgIGl0ZW1fdmFsdWUgICBGb3Igc3RyaW5ncyAgPT4gT2Zmc2V0IGludG8gc3RyaW5nIHRhYmxlIHdpdGhvdXQKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIGRvdWJsZSBxdW90ZXMuCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBhdG9tcyAgICA9PiBPZmZzZXQgaW50byBzdHJpbmcgdGFibGUuCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBpbnRlZ2VycyA9PiBEaXJlY3QgdmFsdWUuCi0gICAqCi0gICAqIEFsbCBzdHJpbmdzIGluIHRoZSBzdHJpbmcgdGFibGUgY29uc2lzdCBvZiBieXRlcyBhbmQgYXJlCi0gICAqIHplcm8tdGVybWluYXRlZC4KLSAgICoKLSAgICovCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0JERgotCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9CREZSZWNfCi0gIHsKLSAgICBGVF9CeXRlKiAgIHRhYmxlOwotICAgIEZUX0J5dGUqICAgdGFibGVfZW5kOwotICAgIEZUX0J5dGUqICAgc3RyaW5nczsKLSAgICBGVF9VTG9uZyAgIHN0cmluZ3Nfc2l6ZTsKLSAgICBGVF9VSW50ICAgIG51bV9zdHJpa2VzOwotICAgIEZUX0Jvb2wgICAgbG9hZGVkOwotCi0gIH0gVFRfQkRGUmVjLCAqVFRfQkRGOwotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9CREYgKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICBPUklHSU5BTCBUVF9GQUNFIENMQVNTIERFRklOSVRJT04gICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgc3RydWN0dXJlL2NsYXNzIGlzIGRlZmluZWQgaGVyZSBiZWNhdXNlIGl0IGlzIGNvbW1vbiB0byB0aGUgICAgICAqLwotICAvKiBmb2xsb3dpbmcgZm9ybWF0czogVFRGLCBPcGVuVHlwZS1UVCwgYW5kIE9wZW5UeXBlLUNGRi4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUsIGhvd2V2ZXIsIHRoYXQgdGhlIGNsYXNzZXMgVFRfU2l6ZSBhbmQgVFRfR2x5cGhTbG90IGFyZSBub3QgICAgICAqLwotICAvKiBzaGFyZWQgYmV0d2VlbiBmb250IGRyaXZlcnMsIGFuZCBhcmUgdGh1cyBkZWZpbmVkIGluIGB0dG9ianMuaCcuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBUcnVlVHlwZSBmYWNlL2ZvbnQgb2JqZWN0LiAgQSBUVF9GYWNlIGVuY2Fwc3VsYXRlcyAgICovCi0gIC8qICAgIHRoZSByZXNvbHV0aW9uIGFuZCBzY2FsaW5nIGluZGVwZW5kZW50IHBhcnRzIG9mIGEgVHJ1ZVR5cGUgZm9udCAgICAqLwotICAvKiAgICByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgVFRfRmFjZSBzdHJ1Y3R1cmUgaXMgYWxzbyB1c2VkIGFzIGEgYHBhcmVudCBjbGFzcycgZm9yIHRoZSAgICAgKi8KLSAgLyogICAgT3BlblR5cGUtQ0ZGIGNsYXNzIChUMl9GYWNlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBUVF9GYWNlUmVjXyogIFRUX0ZhY2U7Ci0KLQotICAvKiBhIGZ1bmN0aW9uIHR5cGUgdXNlZCBmb3IgdGhlIHRydWV0eXBlIGJ5dGVjb2RlIGludGVycHJldGVyIGhvb2tzICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUVF9JbnRlcnByZXRlcikoIHZvaWQqICBleGVjX2NvbnRleHQgKTsKLQotICAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCi0gIHR5cGVkZWYgc3RydWN0IFRUX0xvYWRlclJlY18qICBUVF9Mb2FkZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Mb2FkZXJfR290b1RhYmxlRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWVrcyBhIHN0cmVhbSB0byB0aGUgc3RhcnQgb2YgYSBnaXZlbiBUcnVlVHlwZSB0YWJsZS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhZyAgICA6OiBBIDQtYnl0ZSB0YWcgdXNlZCB0byBuYW1lIHRoZSB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGVuZ3RoIDo6IFRoZSBsZW5ndGggb2YgdGhlIHRhYmxlIGluIGJ5dGVzLiAgU2V0IHRvIDAgaWYgbm90ICAgICAgICovCi0gIC8qICAgICAgICAgICAgICBuZWVkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBzdHJlYW0gY3Vyc29yIG11c3QgYmUgYXQgdGhlIGZvbnQgZmlsZSdzIG9yaWdpbi4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlRUX0xvYWRlcl9Hb3RvVGFibGVGdW5jKSggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICB0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgbGVuZ3RoICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Mb2FkZXJfU3RhcnRHbHlwaEZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWVrcyBhIHN0cmVhbSB0byB0aGUgc3RhcnQgb2YgYSBnaXZlbiBnbHlwaCBlbGVtZW50LCBhbmQgb3BlbnMgYSAgKi8KLSAgLyogICAgZnJhbWUgZm9yIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZGVyICAgICAgOjogVGhlIGN1cnJlbnQgVHJ1ZVR5cGUgZ2x5cGggbG9hZGVyIG9iamVjdC4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaCBpbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGdseXBoIHRvIGFjY2Vzcy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG9mZnNldCAgICAgIDo6IFRoZSBvZmZzZXQgb2YgdGhlIGdseXBoIGFjY29yZGluZyB0byB0aGUgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBgbG9jYXRpb25zJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJ5dGVfY291bnQgIDo6IFRoZSBzaXplIG9mIHRoZSBmcmFtZSBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgbm9ybWFsbHkgZXF1aXZhbGVudCB0byBGVF9TVFJFQU1fU0VFSyhvZmZzZXQpICAgICAqLwotICAvKiAgICBmb2xsb3dlZCBieSBGVF9GUkFNRV9FTlRFUihieXRlX2NvdW50KSB3aXRoIHRoZSBsb2FkZXIncyBzdHJlYW0sICAgKi8KLSAgLyogICAgYnV0IGFsdGVybmF0aXZlIGZvcm1hdHMgKGUuZy4gY29tcHJlc3NlZCBvbmVzKSBtaWdodCB1c2Ugc29tZXRoaW5nICovCi0gIC8qICAgIGRpZmZlcmVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlRUX0xvYWRlcl9TdGFydEdseXBoRnVuYykoIFRUX0xvYWRlciAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBieXRlX2NvdW50ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Mb2FkZXJfUmVhZEdseXBoRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZWFkcyBvbmUgZ2x5cGggZWxlbWVudCAoaXRzIGhlYWRlciwgYSBzaW1wbGUgZ2x5cGgsIG9yIGEgICAgICAgICAgKi8KLSAgLyogICAgY29tcG9zaXRlKSBmcm9tIHRoZSBsb2FkZXIncyBjdXJyZW50IHN0cmVhbSBmcmFtZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZGVyIDo6IFRoZSBjdXJyZW50IFRydWVUeXBlIGdseXBoIGxvYWRlciBvYmplY3QuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfTG9hZGVyX1JlYWRHbHlwaEZ1bmMpKCBUVF9Mb2FkZXIgIGxvYWRlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZGVyX0VuZEdseXBoRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ2xvc2VzIHRoZSBjdXJyZW50IGxvYWRlciBzdHJlYW0gZnJhbWUgZm9yIHRoZSBnbHlwaC4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZGVyIDo6IFRoZSBjdXJyZW50IFRydWVUeXBlIGdseXBoIGxvYWRlciBvYmplY3QuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpUVF9Mb2FkZXJfRW5kR2x5cGhGdW5jKSggVFRfTG9hZGVyICBsb2FkZXIgKTsKLQotCi0gIHR5cGVkZWYgZW51bSBUVF9TYml0VGFibGVUeXBlXwotICB7Ci0gICAgVFRfU0JJVF9UQUJMRV9UWVBFX05PTkUgPSAwLAotICAgIFRUX1NCSVRfVEFCTEVfVFlQRV9FQkxDLCAvKiBgRUJMQycgKE1pY3Jvc29mdCksICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGBibG9jJyAoQXBwbGUpICAgICAgKi8KLSAgICBUVF9TQklUX1RBQkxFX1RZUEVfQ0JMQywgLyogYENCTEMnIChHb29nbGUpICAgICAqLwotICAgIFRUX1NCSVRfVEFCTEVfVFlQRV9TQklYLCAvKiBgc2JpeCcgKEFwcGxlKSAgICAgICovCi0KLSAgICAvKiBkbyBub3QgcmVtb3ZlICovCi0gICAgVFRfU0JJVF9UQUJMRV9UWVBFX01BWAotCi0gIH0gVFRfU2JpdFRhYmxlVHlwZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUgRmFjZSBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIFRydWVUeXBlIGZhY2UgY2xhc3MuICBUaGVzZSBvYmplY3RzIG1vZGVsIHRoZSByZXNvbHV0aW9uIGFuZCAgICovCi0gIC8qICAgIHBvaW50LXNpemUgaW5kZXBlbmRlbnQgZGF0YSBmb3VuZCBpbiBhIFRydWVUeXBlIGZvbnQgZmlsZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJvb3QgICAgICAgICAgICAgICAgIDo6IFRoZSBiYXNlIEZUX0ZhY2Ugc3RydWN0dXJlLCBtYW5hZ2VkIGJ5IHRoZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlIGxheWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0Y19oZWFkZXIgICAgICAgICAgIDo6IFRoZSBUcnVlVHlwZSBjb2xsZWN0aW9uIGhlYWRlciwgdXNlZCB3aGVuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmlsZSBpcyBhIGB0dGMnIHJhdGhlciB0aGFuIGEgYHR0ZicuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIG9yZGluYXJ5IGZvbnQgZmlsZXMsIHRoZSBmaWVsZCAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB0dGNfaGVhZGVyLmNvdW50JyBpcyBzZXQgdG8gMC4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9ybWF0X3RhZyAgICAgICAgICAgOjogVGhlIGZvbnQgZm9ybWF0IHRhZy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fdGFibGVzICAgICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIFRydWVUeXBlIHRhYmxlcyBpbiB0aGlzIGZvbnQgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkaXJfdGFibGVzICAgICAgICAgICA6OiBUaGUgZGlyZWN0b3J5IG9mIFRydWVUeXBlIHRhYmxlcyBmb3IgdGhpcyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZWFkZXIgICAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIGZvbnQgaGVhZGVyIChgaGVhZCcgdGFibGUpLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZCBvbiBmb250IG9wZW5pbmcuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBob3Jpem9udGFsICAgICAgICAgICA6OiBUaGUgZm9udCdzIGhvcml6b250YWwgaGVhZGVyIChgaGhlYScgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUpLiAgVGhpcyBmaWVsZCBhbHNvIGNvbnRhaW5zIHRoZSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgaG9yaXpvbnRhbCBtZXRyaWNzIHRhYmxlICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYGhtdHgnKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9wcm9maWxlICAgICAgICAgIDo6IFRoZSBmb250J3MgbWF4aW11bSBwcm9maWxlIHRhYmxlLiAgUmVhZCBvbiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250IG9wZW5pbmcuICBOb3RlIHRoYXQgc29tZSBtYXhpbXVtICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzIGNhbm5vdCBiZSB0YWtlbiBkaXJlY3RseSBmcm9tIHRoaXMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLiAgV2UgdGh1cyBkZWZpbmUgYWRkaXRpb25hbCBmaWVsZHMgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWxvdyB0byBob2xkIHRoZSBjb21wdXRlZCBtYXhpbWEuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnRpY2FsX2luZm8gICAgICAgIDo6IEEgYm9vbGVhbiB3aGljaCBpcyBzZXQgd2hlbiB0aGUgZm9udCBmaWxlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucyB2ZXJ0aWNhbCBtZXRyaWNzLiAgSWYgbm90LCB0aGUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgdGhlIGB2ZXJ0aWNhbCcgZmllbGQgaXMgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydGljYWwgICAgICAgICAgICAgOjogVGhlIGZvbnQncyB2ZXJ0aWNhbCBoZWFkZXIgKGB2aGVhJyB0YWJsZSkuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgYWxzbyBjb250YWlucyB0aGUgYXNzb2NpYXRlZCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBtZXRyaWNzIHRhYmxlIChgdm10eCcpLCBpZiBmb3VuZC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1QT1JUQU5UOiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWVsZCBpcyAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCBpZiB0aGUgYHZlcnRpY2FsSW5mbycgZmllbGQgaXMgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9uYW1lcyAgICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgbmFtZSByZWNvcmRzIHdpdGhpbiB0aGlzICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlVHlwZSBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5hbWVfdGFibGUgICAgICAgICAgIDo6IFRoZSB0YWJsZSBvZiBuYW1lIHJlY29yZHMgKGBuYW1lJykuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3MyICAgICAgICAgICAgICAgICAgOjogVGhlIGZvbnQncyBPUy8yIHRhYmxlIChgT1MvMicpLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb3N0c2NyaXB0ICAgICAgICAgICA6OiBUaGUgZm9udCdzIFBvc3RTY3JpcHQgdGFibGUgKGBwb3N0JyAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUpLiAgVGhlIFBvc3RTY3JpcHQgZ2x5cGggbmFtZXMgYXJlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBsb2FkZWQgYnkgdGhlIGRyaXZlciBvbiBmYWNlIG9wZW5pbmcuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgdGhlIGB0dHBvc3QnIG1vZHVsZSBmb3IgbW9yZSBkZXRhaWxzLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNtYXBfdGFibGUgICAgICAgICAgIDo6IEFkZHJlc3Mgb2YgdGhlIGZhY2UncyBgY21hcCcgU0ZOVCB0YWJsZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBtZW1vcnkgKGl0J3MgYW4gZXh0cmFjdGVkIGZyYW1lKS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNtYXBfc2l6ZSAgICAgICAgICAgIDo6IFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBgY21hcF90YWJsZScgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmliZWQgYWJvdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdvdG9fdGFibGUgICAgICAgICAgIDo6IEEgZnVuY3Rpb24gY2FsbGVkIGJ5IGVhY2ggVHJ1ZVR5cGUgdGFibGUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXIgdG8gcG9zaXRpb24gYSBzdHJlYW0ncyBjdXJzb3IgdG8gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0YXJ0IG9mIGEgZ2l2ZW4gdGFibGUgYWNjb3JkaW5nIHRvICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cyB0YWcuICBJdCBkZWZhdWx0cyB0byBUVF9Hb3RvX0ZhY2UgYnV0ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgZGlmZmVyZW50IGZvciBzdHJhbmdlIGZvcm1hdHMgKGUuZy4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA0MikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhY2Nlc3NfZ2x5cGhfZnJhbWUgICA6OiBBIGZ1bmN0aW9uIHVzZWQgdG8gYWNjZXNzIHRoZSBmcmFtZSBvZiBhICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gZ2x5cGggd2l0aGluIHRoZSBmYWNlJ3MgZm9udCBmaWxlLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb3JnZXRfZ2x5cGhfZnJhbWUgICA6OiBBIGZ1bmN0aW9uIHVzZWQgdG8gZm9yZ2V0IHRoZSBmcmFtZSBvZiBhICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gZ2x5cGggd2hlbiBhbGwgZGF0YSBoYXMgYmVlbiBsb2FkZWQuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZWFkX2dseXBoX2hlYWRlciAgICA6OiBBIGZ1bmN0aW9uIHVzZWQgdG8gcmVhZCBhIGdseXBoIGhlYWRlci4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgbXVzdCBiZSBjYWxsZWQgYmV0d2VlbiBhbiBgYWNjZXNzJyBhbmQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBmb3JnZXQnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVhZF9zaW1wbGVfZ2x5cGggICAgOjogQSBmdW5jdGlvbiB1c2VkIHRvIHJlYWQgYSBzaW1wbGUgZ2x5cGguICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0IG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBoZWFkZXIgd2FzICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkLCBhbmQgYmVmb3JlIHRoZSBgZm9yZ2V0Jy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJlYWRfY29tcG9zaXRlX2dseXBoIDo6IEEgZnVuY3Rpb24gdXNlZCB0byByZWFkIGEgY29tcG9zaXRlIGdseXBoLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgaGVhZGVyIHdhcyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCwgYW5kIGJlZm9yZSB0aGUgYGZvcmdldCcuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzZm50ICAgICAgICAgICAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIFNGTlQgc2VydmljZS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBzbmFtZXMgICAgICAgICAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgUG9zdFNjcmlwdCBuYW1lcyBzZXJ2aWNlLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGRteCAgICAgICAgICAgICAgICAgOjogVGhlIGZhY2UncyBob3Jpem9udGFsIGRldmljZSBtZXRyaWNzICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIChgaGRteCcgdGFibGUpLiAgVGhpcyB0YWJsZSBpcyBvcHRpb25hbCBpbiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlVHlwZS9PcGVuVHlwZSBmb250cy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdhc3AgICAgICAgICAgICAgICAgIDo6IFRoZSBncmlkLWZpdHRpbmcgYW5kIHNjYWxpbmcgcHJvcGVydGllcyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSAoYGdhc3AnKS4gIFRoaXMgdGFibGUgaXMgb3B0aW9uYWwgaW4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUvT3BlblR5cGUgZm9udHMuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwY2x0ICAgICAgICAgICAgICAgICA6OiBUaGUgYHBjbHQnIFNGTlQgdGFibGUuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9zYml0X3NjYWxlcyAgICAgIDo6IFRoZSBudW1iZXIgb2Ygc2JpdCBzY2FsZXMgZm9yIHRoaXMgZm9udC4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2JpdF9zY2FsZXMgICAgICAgICAgOjogQXJyYXkgb2Ygc2JpdCBzY2FsZXMgZW1iZWRkZWQgaW4gdGhpcyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQuICBUaGlzIHRhYmxlIGlzIG9wdGlvbmFsIGluIGEgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlVHlwZS9PcGVuVHlwZSBmb250LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBvc3RzY3JpcHRfbmFtZXMgICAgIDo6IEEgdGFibGUgdXNlZCB0byBzdG9yZSB0aGUgUG9zdHNjcmlwdCBuYW1lcyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiAgdGhlIGdseXBocyBmb3IgdGhpcyBmb250LiAgU2VlIHRoZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSAgYHR0Y29uZmlnLmgnIGZvciBjb21tZW50cyBvbiB0aGUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUyBvcHRpb24uICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2xvY2F0aW9ucyAgICAgICAgOjogVGhlIG51bWJlciBvZiBnbHlwaCBsb2NhdGlvbnMgaW4gdGhpcyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlIGZpbGUuICBUaGlzIHNob3VsZCBiZSAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGljYWwgdG8gdGhlIG51bWJlciBvZiBnbHlwaHMuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgSWdub3JlZCBmb3IgVHlwZSAyIGZvbnRzLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9sb2NhdGlvbnMgICAgICA6OiBBbiBhcnJheSBvZiBsb25ncy4gIFRoZXNlIGFyZSBvZmZzZXRzIHRvICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGggZGF0YSB3aXRoaW4gdGhlIGBnbHlmJyB0YWJsZS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIElnbm9yZWQgZm9yIFR5cGUgMiBmb250IGZhY2VzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5Zl9sZW4gICAgICAgICAgICAgOjogVGhlIGxlbmd0aCBvZiB0aGUgYGdseWYnIHRhYmxlLiAgTmVlZGVkICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBtYWxmb3JtZWQgYGxvY2EnIHRhYmxlcy4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9udF9wcm9ncmFtX3NpemUgICAgOjogU2l6ZSBpbiBieXRlY29kZXMgb2YgdGhlIGZhY2UncyBmb250ICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0uICAwIGlmIG5vbmUgZGVmaW5lZC4gIElnbm9yZWQgZm9yICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIDIgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvbnRfcHJvZ3JhbSAgICAgICAgIDo6IFRoZSBmYWNlJ3MgZm9udCBwcm9ncmFtIChieXRlY29kZSBzdHJlYW0pICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZCBhdCBsb2FkIHRpbWUsIGFsc28gdXNlZCBkdXJpbmcgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGggcmVuZGVyaW5nLiAgQ29tZXMgZnJvbSB0aGUgYGZwZ20nICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLiAgSWdub3JlZCBmb3IgVHlwZSAyIGZvbnQgZm9udHMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY3Z0X3Byb2dyYW1fc2l6ZSAgICAgOjogVGhlIHNpemUgaW4gYnl0ZWNvZGVzIG9mIHRoZSBmYWNlJ3MgY3Z0ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0uICBJZ25vcmVkIGZvciBUeXBlIDIgZm9udHMuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY3Z0X3Byb2dyYW0gICAgICAgICAgOjogVGhlIGZhY2UncyBjdnQgcHJvZ3JhbSAoYnl0ZWNvZGUgc3RyZWFtKSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkIGVhY2ggdGltZSBhbiBpbnN0YW5jZS9zaXplIGlzICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkL3Jlc2V0LiAgQ29tZXMgZnJvbSB0aGUgYHByZXAnICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuICBJZ25vcmVkIGZvciBUeXBlIDIgZm9udHMuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjdnRfc2l6ZSAgICAgICAgICAgICA6OiBTaXplIG9mIHRoZSBjb250cm9sIHZhbHVlIHRhYmxlIChpbiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcykuICAgSWdub3JlZCBmb3IgVHlwZSAyIGZvbnRzLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjdnQgICAgICAgICAgICAgICAgICA6OiBUaGUgZmFjZSdzIG9yaWdpbmFsIGNvbnRyb2wgdmFsdWUgdGFibGUuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29vcmRpbmF0ZXMgYXJlIGV4cHJlc3NlZCBpbiB1bnNjYWxlZCBmb250ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzLiAgQ29tZXMgZnJvbSB0aGUgYGN2dCAnIHRhYmxlLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZ25vcmVkIGZvciBUeXBlIDIgZm9udHMuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9rZXJuX3BhaXJzICAgICAgIDo6IFRoZSBudW1iZXIgb2Yga2VybmluZyBwYWlycyBwcmVzZW50IGluIHRoZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250IGZpbGUuICBUaGUgZW5naW5lIG9ubHkgbG9hZHMgdGhlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgaG9yaXpvbnRhbCBmb3JtYXQgMCBrZXJuIHRhYmxlIGl0ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRzIGluIHRoZSBmb250IGZpbGUuICBJZ25vcmVkIGZvciAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIDIgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGtlcm5fdGFibGVfaW5kZXggICAgIDo6IFRoZSBpbmRleCBvZiB0aGUga2VybmluZyB0YWJsZSBpbiB0aGUgZm9udCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXJuaW5nIGRpcmVjdG9yeS4gIElnbm9yZWQgZm9yIFR5cGUgMiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpbnRlcnByZXRlciAgICAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIFRydWVUeXBlIGJ5dGVjb2RlICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwcmV0ZXJzIGZpZWxkIGlzIGFsc28gdXNlZCB0byBob29rICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkZWJ1Z2dlciBpbiBgdHRkZWJ1ZycuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdW5wYXRlbnRlZF9oaW50aW5nICAgOjogSWYgdHJ1ZSwgdXNlIG9ubHkgdW5wYXRlbnRlZCBtZXRob2RzIGluICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBieXRlY29kZSBpbnRlcnByZXRlci4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZG9ibGVuZCAgICAgICAgICAgICAgOjogQSBib29sZWFuIHdoaWNoIGlzIHNldCBpZiB0aGUgZm9udCBzaG91bGQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGJsZW5kZWQgKHRoaXMgaXMgZm9yIEdYIHZhcikuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmxlbmQgICAgICAgICAgICAgICAgOjogQ29udGFpbnMgdGhlIGRhdGEgbmVlZGVkIHRvIGNvbnRyb2wgR1ggICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhdGlvbiB0YWJsZXMgKHJhdGhlciBsaWtlIE11bHRpcGxlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXN0ZXIgZGF0YSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGV4dHJhICAgICAgICAgICAgICAgIDo6IFJlc2VydmVkIGZvciB0aGlyZC1wYXJ0eSBmb250IGRyaXZlcnMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9zdHNjcmlwdF9uYW1lICAgICAgOjogVGhlIFBTIG5hbWUgb2YgdGhlIGZvbnQuICBVc2VkIGJ5IHRoZSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RzY3JpcHQgbmFtZSBzZXJ2aWNlLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0ZhY2VSZWNfCi0gIHsKLSAgICBGVF9GYWNlUmVjICAgICAgICAgICAgcm9vdDsKLQotICAgIFRUQ19IZWFkZXJSZWMgICAgICAgICB0dGNfaGVhZGVyOwotCi0gICAgRlRfVUxvbmcgICAgICAgICAgICAgIGZvcm1hdF90YWc7Ci0gICAgRlRfVVNob3J0ICAgICAgICAgICAgIG51bV90YWJsZXM7Ci0gICAgVFRfVGFibGUgICAgICAgICAgICAgIGRpcl90YWJsZXM7Ci0KLSAgICBUVF9IZWFkZXIgICAgICAgICAgICAgaGVhZGVyOyAgICAgICAvKiBUcnVlVHlwZSBoZWFkZXIgdGFibGUgICAgICAgICAgKi8KLSAgICBUVF9Ib3JpSGVhZGVyICAgICAgICAgaG9yaXpvbnRhbDsgICAvKiBUcnVlVHlwZSBob3Jpem9udGFsIGhlYWRlciAgICAgKi8KLQotICAgIFRUX01heFByb2ZpbGUgICAgICAgICBtYXhfcHJvZmlsZTsKLQotICAgIEZUX0Jvb2wgICAgICAgICAgICAgICB2ZXJ0aWNhbF9pbmZvOwotICAgIFRUX1ZlcnRIZWFkZXIgICAgICAgICB2ZXJ0aWNhbDsgICAgIC8qIFRUIFZlcnRpY2FsIGhlYWRlciwgaWYgcHJlc2VudCAqLwotCi0gICAgRlRfVVNob3J0ICAgICAgICAgICAgIG51bV9uYW1lczsgICAgLyogbnVtYmVyIG9mIG5hbWUgcmVjb3JkcyAgKi8KLSAgICBUVF9OYW1lVGFibGVSZWMgICAgICAgbmFtZV90YWJsZTsgICAvKiBuYW1lIHRhYmxlICAgICAgICAgICAgICAqLwotCi0gICAgVFRfT1MyICAgICAgICAgICAgICAgIG9zMjsgICAgICAgICAgLyogVHJ1ZVR5cGUgT1MvMiB0YWJsZSAgICAgICAgICAgICovCi0gICAgVFRfUG9zdHNjcmlwdCAgICAgICAgIHBvc3RzY3JpcHQ7ICAgLyogVHJ1ZVR5cGUgUG9zdHNjcmlwdCB0YWJsZSAgICAgICovCi0KLSAgICBGVF9CeXRlKiAgICAgICAgICAgICAgY21hcF90YWJsZTsgICAvKiBleHRyYWN0ZWQgYGNtYXAnIHRhYmxlICovCi0gICAgRlRfVUxvbmcgICAgICAgICAgICAgIGNtYXBfc2l6ZTsKLQotICAgIFRUX0xvYWRlcl9Hb3RvVGFibGVGdW5jICAgZ290b190YWJsZTsKLQotICAgIFRUX0xvYWRlcl9TdGFydEdseXBoRnVuYyAgYWNjZXNzX2dseXBoX2ZyYW1lOwotICAgIFRUX0xvYWRlcl9FbmRHbHlwaEZ1bmMgICAgZm9yZ2V0X2dseXBoX2ZyYW1lOwotICAgIFRUX0xvYWRlcl9SZWFkR2x5cGhGdW5jICAgcmVhZF9nbHlwaF9oZWFkZXI7Ci0gICAgVFRfTG9hZGVyX1JlYWRHbHlwaEZ1bmMgICByZWFkX3NpbXBsZV9nbHlwaDsKLSAgICBUVF9Mb2FkZXJfUmVhZEdseXBoRnVuYyAgIHJlYWRfY29tcG9zaXRlX2dseXBoOwotCi0gICAgLyogYSB0eXBlbGVzcyBwb2ludGVyIHRvIHRoZSBTRk5UX0ludGVyZmFjZSB0YWJsZSB1c2VkIHRvIGxvYWQgKi8KLSAgICAvKiB0aGUgYmFzaWMgVHJ1ZVR5cGUgdGFibGVzIGluIHRoZSBmYWNlIG9iamVjdCAgICAgICAgICAgICAgICAqLwotICAgIHZvaWQqICAgICAgICAgICAgICAgICBzZm50OwotCi0gICAgLyogYSB0eXBlbGVzcyBwb2ludGVyIHRvIHRoZSBGVF9TZXJ2aWNlX1BzQ01hcHNSZWMgdGFibGUgdXNlZCB0byAqLwotICAgIC8qIGhhbmRsZSBnbHlwaCBuYW1lcyA8LT4gdW5pY29kZSAmIE1hYyB2YWx1ZXMgICAgICAgICAgICAgICAgICAgKi8KLSAgICB2b2lkKiAgICAgICAgICAgICAgICAgcHNuYW1lczsKLQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBPcHRpb25hbCBUcnVlVHlwZS9PcGVuVHlwZSB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIC8qIGdyaWQtZml0dGluZyBhbmQgc2NhbGluZyB0YWJsZSAqLwotICAgIFRUX0dhc3BSZWMgICAgICAgICAgICBnYXNwOyAgICAgICAgICAgICAgICAgLyogdGhlIGBnYXNwJyB0YWJsZSAqLwotCi0gICAgLyogUENMIDUgdGFibGUgKi8KLSAgICBUVF9QQ0xUICAgICAgICAgICAgICAgcGNsdDsKLQotICAgIC8qIGVtYmVkZGVkIGJpdG1hcHMgc3VwcG9ydCAqLwotICAgIEZUX1VMb25nICAgICAgICAgICAgICBudW1fc2JpdF9zY2FsZXM7Ci0gICAgVFRfU0JpdF9TY2FsZSAgICAgICAgIHNiaXRfc2NhbGVzOwotCi0gICAgLyogcG9zdHNjcmlwdCBuYW1lcyB0YWJsZSAqLwotICAgIFRUX1Bvc3RfTmFtZXNSZWMgICAgICBwb3N0c2NyaXB0X25hbWVzOwotCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIFRydWVUeXBlLXNwZWNpZmljIGZpZWxkcyAoaWdub3JlZCBieSB0aGUgT1RGLVR5cGUyIGRyaXZlcikgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgLyogdGhlIGZvbnQgcHJvZ3JhbSwgaWYgYW55ICovCi0gICAgRlRfVUxvbmcgICAgICAgICAgICAgIGZvbnRfcHJvZ3JhbV9zaXplOwotICAgIEZUX0J5dGUqICAgICAgICAgICAgICBmb250X3Byb2dyYW07Ci0KLSAgICAvKiB0aGUgY3Z0IHByb2dyYW0sIGlmIGFueSAqLwotICAgIEZUX1VMb25nICAgICAgICAgICAgICBjdnRfcHJvZ3JhbV9zaXplOwotICAgIEZUX0J5dGUqICAgICAgICAgICAgICBjdnRfcHJvZ3JhbTsKLQotICAgIC8qIHRoZSBvcmlnaW5hbCwgdW5zY2FsZWQsIGNvbnRyb2wgdmFsdWUgdGFibGUgKi8KLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAgY3Z0X3NpemU7Ci0gICAgRlRfU2hvcnQqICAgICAgICAgICAgIGN2dDsKLQotICAgIC8qIEEgcG9pbnRlciB0byB0aGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgdG8gdXNlLiAgVGhpcyBpcyBhbHNvICovCi0gICAgLyogdXNlZCB0byBob29rIHRoZSBkZWJ1Z2dlciBmb3IgdGhlIGB0dGRlYnVnJyB1dGlsaXR5LiAgICAgICAgKi8KLSAgICBUVF9JbnRlcnByZXRlciAgICAgICAgaW50ZXJwcmV0ZXI7Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1VOUEFURU5URURfSElOVElORwotICAgIC8qIFVzZSB1bnBhdGVudGVkIGhpbnRpbmcgb25seS4gKi8KLSAgICBGVF9Cb29sICAgICAgICAgICAgICAgdW5wYXRlbnRlZF9oaW50aW5nOwotI2VuZGlmCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIE90aGVyIHRhYmxlcyBvciBmaWVsZHMuIFRoaXMgaXMgdXNlZCBieSBkZXJpdmF0aXZlIGZvcm1hdHMgbGlrZSAgICAgKi8KLSAgICAvKiBPcGVuVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIEZUX0dlbmVyaWMgICAgICAgICAgICBleHRyYTsKLQotICAgIGNvbnN0IGNoYXIqICAgICAgICAgICBwb3N0c2NyaXB0X25hbWU7Ci0KLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAgZ2x5Zl9sZW47Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0gICAgRlRfQm9vbCAgICAgICAgICAgICAgIGRvYmxlbmQ7Ci0gICAgR1hfQmxlbmQgICAgICAgICAgICAgIGJsZW5kOwotI2VuZGlmCi0KLSAgICAvKiBzaW5jZSB2ZXJzaW9uIDIuMiAqLwotCi0gICAgRlRfQnl0ZSogICAgICAgICAgICAgIGhvcnpfbWV0cmljczsKLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAgaG9yel9tZXRyaWNzX3NpemU7Ci0KLSAgICBGVF9CeXRlKiAgICAgICAgICAgICAgdmVydF9tZXRyaWNzOwotICAgIEZUX1VMb25nICAgICAgICAgICAgICB2ZXJ0X21ldHJpY3Nfc2l6ZTsKLQotICAgIEZUX1VMb25nICAgICAgICAgICAgICBudW1fbG9jYXRpb25zOyAvKiBpbiBicm9rZW4gVFRGLCBnaWQgPiAweEZGRkYgKi8KLSAgICBGVF9CeXRlKiAgICAgICAgICAgICAgZ2x5cGhfbG9jYXRpb25zOwotCi0gICAgRlRfQnl0ZSogICAgICAgICAgICAgIGhkbXhfdGFibGU7Ci0gICAgRlRfVUxvbmcgICAgICAgICAgICAgIGhkbXhfdGFibGVfc2l6ZTsKLSAgICBGVF9VSW50ICAgICAgICAgICAgICAgaGRteF9yZWNvcmRfY291bnQ7Ci0gICAgRlRfVUxvbmcgICAgICAgICAgICAgIGhkbXhfcmVjb3JkX3NpemU7Ci0gICAgRlRfQnl0ZSogICAgICAgICAgICAgIGhkbXhfcmVjb3JkX3NpemVzOwotCi0gICAgRlRfQnl0ZSogICAgICAgICAgICAgIHNiaXRfdGFibGU7Ci0gICAgRlRfVUxvbmcgICAgICAgICAgICAgIHNiaXRfdGFibGVfc2l6ZTsKLSAgICBUVF9TYml0VGFibGVUeXBlICAgICAgc2JpdF90YWJsZV90eXBlOwotICAgIEZUX1VJbnQgICAgICAgICAgICAgICBzYml0X251bV9zdHJpa2VzOwotCi0gICAgRlRfQnl0ZSogICAgICAgICAgICAgIGtlcm5fdGFibGU7Ci0gICAgRlRfVUxvbmcgICAgICAgICAgICAgIGtlcm5fdGFibGVfc2l6ZTsKLSAgICBGVF9VSW50ICAgICAgICAgICAgICAgbnVtX2tlcm5fdGFibGVzOwotICAgIEZUX1VJbnQzMiAgICAgICAgICAgICBrZXJuX2F2YWlsX2JpdHM7Ci0gICAgRlRfVUludDMyICAgICAgICAgICAgIGtlcm5fb3JkZXJfYml0czsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fQkRGCi0gICAgVFRfQkRGUmVjICAgICAgICAgICAgIGJkZjsKLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX0JERiAqLwotCi0gICAgLyogc2luY2UgMi4zLjAgKi8KLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAgaG9yel9tZXRyaWNzX29mZnNldDsKLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAgdmVydF9tZXRyaWNzX29mZnNldDsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotICAgIC8qIHNpbmNlIDIuNC4xMiAqLwotICAgIEZUX1VMb25nICAgICAgICAgICAgICBzcGhfZm91bmRfZnVuY19mbGFnczsgLyogc3BlY2lhbCBmdW5jdGlvbnMgZm91bmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciB0aGlzIGZhY2UgICAgICAgICAgICovCi0gICAgRlRfQm9vbCAgICAgICAgICAgICAgIHNwaF9jb21wYXRpYmlsaXR5X21vZGU7Ci0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCi0KLSAgfSBUVF9GYWNlUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIFRUX0dseXBoWm9uZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIEEgZ2x5cGggem9uZSBpcyB1c2VkIHRvIGxvYWQsIHNjYWxlIGFuZCBoaW50IGdseXBoIG91dGxpbmUgICAgICAgICovCi0gIC8qICAgICBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBtZW1vcnkgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIG1lbW9yeSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIG1heF9wb2ludHMgICA6OiBUaGUgbWF4aW11bSBzaXplIGluIHBvaW50cyBvZiB0aGUgem9uZS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgbWF4X2NvbnRvdXJzIDo6IE1heCBzaXplIGluIGxpbmtzIGNvbnRvdXJzIG9mIHRoZSB6b25lLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBuX3BvaW50cyAgICAgOjogVGhlIGN1cnJlbnQgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgem9uZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIG5fY29udG91cnMgICA6OiBUaGUgY3VycmVudCBudW1iZXIgb2YgY29udG91cnMgaW4gdGhlIHpvbmUuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgb3JnICAgICAgICAgIDo6IFRoZSBvcmlnaW5hbCBnbHlwaCBjb29yZGluYXRlcyAoZm9udCAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICB1bml0cy9zY2FsZWQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgY3VyICAgICAgICAgIDo6IFRoZSBjdXJyZW50IGdseXBoIGNvb3JkaW5hdGVzIChzY2FsZWQvaGludGVkKS4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICB0YWdzICAgICAgICAgOjogVGhlIHBvaW50IGNvbnRyb2wgdGFncy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGNvbnRvdXJzICAgICA6OiBUaGUgY29udG91cnMgZW5kIHBvaW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgZmlyc3RfcG9pbnQgIDo6IE9mZnNldCBvZiB0aGUgY3VycmVudCBzdWJnbHlwaCdzIGZpcnN0IHBvaW50LiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9HbHlwaFpvbmVSZWNfCi0gIHsKLSAgICBGVF9NZW1vcnkgICBtZW1vcnk7Ci0gICAgRlRfVVNob3J0ICAgbWF4X3BvaW50czsKLSAgICBGVF9VU2hvcnQgICBtYXhfY29udG91cnM7Ci0gICAgRlRfVVNob3J0ICAgbl9wb2ludHM7ICAgIC8qIG51bWJlciBvZiBwb2ludHMgaW4gem9uZSAgICAqLwotICAgIEZUX1Nob3J0ICAgIG5fY29udG91cnM7ICAvKiBudW1iZXIgb2YgY29udG91cnMgICAgICAgICAgKi8KLQotICAgIEZUX1ZlY3RvciogIG9yZzsgICAgICAgICAvKiBvcmlnaW5hbCBwb2ludCBjb29yZGluYXRlcyAgKi8KLSAgICBGVF9WZWN0b3IqICBjdXI7ICAgICAgICAgLyogY3VycmVudCBwb2ludCBjb29yZGluYXRlcyAgICovCi0gICAgRlRfVmVjdG9yKiAgb3J1czsgICAgICAgIC8qIG9yaWdpbmFsICh1bnNjYWxlZCkgcG9pbnQgY29vcmRpbmF0ZXMgKi8KLQotICAgIEZUX0J5dGUqICAgIHRhZ3M7ICAgICAgICAvKiBjdXJyZW50IHRvdWNoIGZsYWdzICAgICAgICAgKi8KLSAgICBGVF9VU2hvcnQqICBjb250b3VyczsgICAgLyogY29udG91ciBlbmQgcG9pbnRzICAgICAgICAgICovCi0KLSAgICBGVF9VU2hvcnQgICBmaXJzdF9wb2ludDsgLyogb2Zmc2V0IG9mIGZpcnN0ICgjMCkgcG9pbnQgICovCi0KLSAgfSBUVF9HbHlwaFpvbmVSZWMsICpUVF9HbHlwaFpvbmU7Ci0KLQotICAvKiBoYW5kbGUgdG8gZXhlY3V0aW9uIGNvbnRleHQgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgVFRfRXhlY0NvbnRleHRSZWNfKiAgVFRfRXhlY0NvbnRleHQ7Ci0KLSAgLyogZ2x5cGggbG9hZGVyIHN0cnVjdHVyZSAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfTG9hZGVyUmVjXwotICB7Ci0gICAgRlRfRmFjZSAgICAgICAgICBmYWNlOwotICAgIEZUX1NpemUgICAgICAgICAgc2l6ZTsKLSAgICBGVF9HbHlwaFNsb3QgICAgIGdseXBoOwotICAgIEZUX0dseXBoTG9hZGVyICAgZ2xvYWRlcjsKLQotICAgIEZUX1VMb25nICAgICAgICAgbG9hZF9mbGFnczsKLSAgICBGVF9VSW50ICAgICAgICAgIGdseXBoX2luZGV4OwotCi0gICAgRlRfU3RyZWFtICAgICAgICBzdHJlYW07Ci0gICAgRlRfSW50ICAgICAgICAgICBieXRlX2xlbjsKLQotICAgIEZUX1Nob3J0ICAgICAgICAgbl9jb250b3VyczsKLSAgICBGVF9CQm94ICAgICAgICAgIGJib3g7Ci0gICAgRlRfSW50ICAgICAgICAgICBsZWZ0X2JlYXJpbmc7Ci0gICAgRlRfSW50ICAgICAgICAgICBhZHZhbmNlOwotICAgIEZUX0ludCAgICAgICAgICAgbGluZWFyOwotICAgIEZUX0Jvb2wgICAgICAgICAgbGluZWFyX2RlZjsKLSAgICBGVF9WZWN0b3IgICAgICAgIHBwMTsKLSAgICBGVF9WZWN0b3IgICAgICAgIHBwMjsKLQotICAgIEZUX1VMb25nICAgICAgICAgZ2x5Zl9vZmZzZXQ7Ci0KLSAgICAvKiB0aGUgem9uZSB3aGVyZSB3ZSBsb2FkIG91ciBnbHlwaHMgKi8KLSAgICBUVF9HbHlwaFpvbmVSZWMgIGJhc2U7Ci0gICAgVFRfR2x5cGhab25lUmVjICB6b25lOwotCi0gICAgVFRfRXhlY0NvbnRleHQgICBleGVjOwotICAgIEZUX0J5dGUqICAgICAgICAgaW5zdHJ1Y3Rpb25zOwotICAgIEZUX1VMb25nICAgICAgICAgaW5zX3BvczsKLQotICAgIC8qIGZvciBwb3NzaWJsZSBleHRlbnNpYmlsaXR5IGluIG90aGVyIGZvcm1hdHMgKi8KLSAgICB2b2lkKiAgICAgICAgICAgIG90aGVyOwotCi0gICAgLyogc2luY2UgdmVyc2lvbiAyLjEuOCAqLwotICAgIEZUX0ludCAgICAgICAgICAgdG9wX2JlYXJpbmc7Ci0gICAgRlRfSW50ICAgICAgICAgICB2YWR2YW5jZTsKLSAgICBGVF9WZWN0b3IgICAgICAgIHBwMzsKLSAgICBGVF9WZWN0b3IgICAgICAgIHBwNDsKLQotICAgIC8qIHNpbmNlIHZlcnNpb24gMi4yLjEgKi8KLSAgICBGVF9CeXRlKiAgICAgICAgIGN1cnNvcjsKLSAgICBGVF9CeXRlKiAgICAgICAgIGxpbWl0OwotCi0gIH0gVFRfTG9hZGVyUmVjOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fVFRUWVBFU19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvdDF0YWJsZXMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvdDF0YWJsZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFhZWZkZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL3QxdGFibGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDF0YWJsZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEJhc2ljIFR5cGUgMS9UeXBlIDIgdGFibGVzIGRlZmluaXRpb25zIGFuZCBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24gICovCi0vKiAgICBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDA0LCAyMDA2LCAyMDA4LCAyMDA5LCAyMDExLCAyMDE0IGJ5ICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1QxVEFCTEVTX0hfXwotI2RlZmluZSBfX1QxVEFCTEVTX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR5cGUxX3RhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFR5cGUgMSBUYWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFR5cGV+MSAoUG9zdFNjcmlwdCkgc3BlY2lmaWMgZm9udCB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBUeXBlIDEtc3BlY2lmaWMgdGFibGVzLCAgICAqLwotICAvKiAgICBpbmNsdWRpbmcgc3RydWN0dXJlcyByZWxhdGVkIHRvIG90aGVyIFBvc3RTY3JpcHQgZm9udCBmb3JtYXRzLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPcmRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19Gb250SW5mb1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRm9udEluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX1ByaXZhdGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19Qcml2YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENJRF9GYWNlRGljdFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDSURfRmFjZURpY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX0ZhY2VJbmZvUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENJRF9GYWNlSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSGFzX1BTX0dseXBoX05hbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9QU19Gb250X0luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfUFNfRm9udF9Qcml2YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X1BTX0ZvbnRfVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9CbGVuZF9GbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfRW5jb2RpbmdUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RpY3RfS2V5cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBOb3RlIHRoYXQgd2Ugc2VwYXJhdGUgZm9udCBkYXRhIGluIFBTX0ZvbnRJbmZvUmVjIGFuZCBQU19Qcml2YXRlUmVjICovCi0gIC8qIHN0cnVjdHVyZXMgaW4gb3JkZXIgdG8gc3VwcG9ydCBNdWx0aXBsZSBNYXN0ZXIgZm9udHMuICAgICAgICAgICAgICAgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0ZvbnRJbmZvUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBUeXBlfjEgb3IgVHlwZX4yIEZvbnRJbmZvIGRpY3Rpb25hcnkuICAqLwotICAvKiAgICBOb3RlIHRoYXQgZm9yIE11bHRpcGxlIE1hc3RlciBmb250cywgZWFjaCBpbnN0YW5jZSBoYXMgaXRzIG93biAgICAgKi8KLSAgLyogICAgRm9udEluZm8gZGljdGlvbmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNfRm9udEluZm9SZWNfCi0gIHsKLSAgICBGVF9TdHJpbmcqICB2ZXJzaW9uOwotICAgIEZUX1N0cmluZyogIG5vdGljZTsKLSAgICBGVF9TdHJpbmcqICBmdWxsX25hbWU7Ci0gICAgRlRfU3RyaW5nKiAgZmFtaWx5X25hbWU7Ci0gICAgRlRfU3RyaW5nKiAgd2VpZ2h0OwotICAgIEZUX0xvbmcgICAgIGl0YWxpY19hbmdsZTsKLSAgICBGVF9Cb29sICAgICBpc19maXhlZF9waXRjaDsKLSAgICBGVF9TaG9ydCAgICB1bmRlcmxpbmVfcG9zaXRpb247Ci0gICAgRlRfVVNob3J0ICAgdW5kZXJsaW5lX3RoaWNrbmVzczsKLQotICB9IFBTX0ZvbnRJbmZvUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRm9udEluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBAUFNfRm9udEluZm9SZWMgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBQU19Gb250SW5mb1JlY18qICBQU19Gb250SW5mbzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0ZvbnRJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgdHlwZSBpcyBlcXVpdmFsZW50IHRvIEBQU19Gb250SW5mb1JlYy4gIEl0IGlzIGRlcHJlY2F0ZWQgYnV0ICAqLwotICAvKiAgICBrZXB0IHRvIG1haW50YWluIHNvdXJjZSBjb21wYXRpYmlsaXR5IGJldHdlZW4gdmFyaW91cyB2ZXJzaW9ucyBvZiAgKi8KLSAgLyogICAgRnJlZVR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIFBTX0ZvbnRJbmZvUmVjICBUMV9Gb250SW5mbzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX1ByaXZhdGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBUeXBlfjEgb3IgVHlwZX4yIHByaXZhdGUgZGljdGlvbmFyeS4gICAqLwotICAvKiAgICBOb3RlIHRoYXQgZm9yIE11bHRpcGxlIE1hc3RlciBmb250cywgZWFjaCBpbnN0YW5jZSBoYXMgaXRzIG93biAgICAgKi8KLSAgLyogICAgUHJpdmF0ZSBkaWN0aW9uYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNfUHJpdmF0ZVJlY18KLSAgewotICAgIEZUX0ludCAgICAgdW5pcXVlX2lkOwotICAgIEZUX0ludCAgICAgbGVuSVY7Ci0KLSAgICBGVF9CeXRlICAgIG51bV9ibHVlX3ZhbHVlczsKLSAgICBGVF9CeXRlICAgIG51bV9vdGhlcl9ibHVlczsKLSAgICBGVF9CeXRlICAgIG51bV9mYW1pbHlfYmx1ZXM7Ci0gICAgRlRfQnl0ZSAgICBudW1fZmFtaWx5X290aGVyX2JsdWVzOwotCi0gICAgRlRfU2hvcnQgICBibHVlX3ZhbHVlc1sxNF07Ci0gICAgRlRfU2hvcnQgICBvdGhlcl9ibHVlc1sxMF07Ci0KLSAgICBGVF9TaG9ydCAgIGZhbWlseV9ibHVlcyAgICAgIFsxNF07Ci0gICAgRlRfU2hvcnQgICBmYW1pbHlfb3RoZXJfYmx1ZXNbMTBdOwotCi0gICAgRlRfRml4ZWQgICBibHVlX3NjYWxlOwotICAgIEZUX0ludCAgICAgYmx1ZV9zaGlmdDsKLSAgICBGVF9JbnQgICAgIGJsdWVfZnV6ejsKLQotICAgIEZUX1VTaG9ydCAgc3RhbmRhcmRfd2lkdGhbMV07Ci0gICAgRlRfVVNob3J0ICBzdGFuZGFyZF9oZWlnaHRbMV07Ci0KLSAgICBGVF9CeXRlICAgIG51bV9zbmFwX3dpZHRoczsKLSAgICBGVF9CeXRlICAgIG51bV9zbmFwX2hlaWdodHM7Ci0gICAgRlRfQm9vbCAgICBmb3JjZV9ib2xkOwotICAgIEZUX0Jvb2wgICAgcm91bmRfc3RlbV91cDsKLQotICAgIEZUX1Nob3J0ICAgc25hcF93aWR0aHMgWzEzXTsgIC8qIGluY2x1ZGluZyBzdGQgd2lkdGggICovCi0gICAgRlRfU2hvcnQgICBzbmFwX2hlaWdodHNbMTNdOyAgLyogaW5jbHVkaW5nIHN0ZCBoZWlnaHQgKi8KLQotICAgIEZUX0ZpeGVkICAgZXhwYW5zaW9uX2ZhY3RvcjsKLQotICAgIEZUX0xvbmcgICAgbGFuZ3VhZ2VfZ3JvdXA7Ci0gICAgRlRfTG9uZyAgICBwYXNzd29yZDsKLQotICAgIEZUX1Nob3J0ICAgbWluX2ZlYXR1cmVbMl07Ci0KLSAgfSBQU19Qcml2YXRlUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfUHJpdmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBAUFNfUHJpdmF0ZVJlYyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBQU19Qcml2YXRlUmVjXyogIFBTX1ByaXZhdGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9Qcml2YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoaXMgdHlwZSBpcyBlcXVpdmFsZW50IHRvIEBQU19Qcml2YXRlUmVjLiAgSXQgaXMgZGVwcmVjYXRlZCBidXQgICAgKi8KLSAgLyogICBrZXB0IHRvIG1haW50YWluIHNvdXJjZSBjb21wYXRpYmlsaXR5IGJldHdlZW4gdmFyaW91cyB2ZXJzaW9ucyBvZiAgICovCi0gIC8qICAgRnJlZVR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBQU19Qcml2YXRlUmVjICBUMV9Qcml2YXRlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQmxlbmRfRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzZXQgb2YgZmxhZ3MgdXNlZCB0byBpbmRpY2F0ZSB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gYSAgICAgICovCi0gIC8qICAgIGdpdmVuIGJsZW5kIGRpY3Rpb25hcnkgKGZvbnQgaW5mbyBvciBwcml2YXRlKS4gIFVzZWQgdG8gc3VwcG9ydCAgICAqLwotICAvKiAgICBNdWx0aXBsZSBNYXN0ZXJzIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9CTEVORF9VTkRFUkxJTkVfUE9TSVRJT04gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQkxFTkRfVU5ERVJMSU5FX1RISUNLTkVTUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0JMRU5EX0lUQUxJQ19BTkdMRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9CTEVORF9CTFVFX1ZBTFVFUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQkxFTkRfT1RIRVJfQkxVRVMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0JMRU5EX1NUQU5EQVJEX1dJRFRIIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9CTEVORF9TVEFOREFSRF9IRUlHSFQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQkxFTkRfU1RFTV9TTkFQX1dJRFRIUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0JMRU5EX1NURU1fU05BUF9IRUlHSFRTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9CTEVORF9CTFVFX1NDQUxFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQkxFTkRfQkxVRV9TSElGVCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0JMRU5EX0ZBTUlMWV9CTFVFUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9CTEVORF9GQU1JTFlfT1RIRVJfQkxVRVMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQkxFTkRfRk9SQ0VfQk9MRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGVudW0gIFQxX0JsZW5kX0ZsYWdzXwotICB7Ci0gICAgLyogcmVxdWlyZWQgZmllbGRzIGluIGEgRm9udEluZm8gYmxlbmQgZGljdGlvbmFyeSAqLwotICAgIFQxX0JMRU5EX1VOREVSTElORV9QT1NJVElPTiA9IDAsCi0gICAgVDFfQkxFTkRfVU5ERVJMSU5FX1RISUNLTkVTUywKLSAgICBUMV9CTEVORF9JVEFMSUNfQU5HTEUsCi0KLSAgICAvKiByZXF1aXJlZCBmaWVsZHMgaW4gYSBQcml2YXRlIGJsZW5kIGRpY3Rpb25hcnkgKi8KLSAgICBUMV9CTEVORF9CTFVFX1ZBTFVFUywKLSAgICBUMV9CTEVORF9PVEhFUl9CTFVFUywKLSAgICBUMV9CTEVORF9TVEFOREFSRF9XSURUSCwKLSAgICBUMV9CTEVORF9TVEFOREFSRF9IRUlHSFQsCi0gICAgVDFfQkxFTkRfU1RFTV9TTkFQX1dJRFRIUywKLSAgICBUMV9CTEVORF9TVEVNX1NOQVBfSEVJR0hUUywKLSAgICBUMV9CTEVORF9CTFVFX1NDQUxFLAotICAgIFQxX0JMRU5EX0JMVUVfU0hJRlQsCi0gICAgVDFfQkxFTkRfRkFNSUxZX0JMVUVTLAotICAgIFQxX0JMRU5EX0ZBTUlMWV9PVEhFUl9CTFVFUywKLSAgICBUMV9CTEVORF9GT1JDRV9CT0xELAotCi0gICAgVDFfQkxFTkRfTUFYICAgIC8qIGRvIG5vdCByZW1vdmUgKi8KLQotICB9IFQxX0JsZW5kX0ZsYWdzOwotCi0KLSAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgKi8KLSAgLyogYFQxX0JsZW5kX0ZsYWdzJyB2YWx1ZXMgaW5zdGVhZCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgdDFfYmxlbmRfdW5kZXJsaW5lX3Bvc2l0aW9uICAgVDFfQkxFTkRfVU5ERVJMSU5FX1BPU0lUSU9OCi0jZGVmaW5lIHQxX2JsZW5kX3VuZGVybGluZV90aGlja25lc3MgIFQxX0JMRU5EX1VOREVSTElORV9USElDS05FU1MKLSNkZWZpbmUgdDFfYmxlbmRfaXRhbGljX2FuZ2xlICAgICAgICAgVDFfQkxFTkRfSVRBTElDX0FOR0xFCi0jZGVmaW5lIHQxX2JsZW5kX2JsdWVfdmFsdWVzICAgICAgICAgIFQxX0JMRU5EX0JMVUVfVkFMVUVTCi0jZGVmaW5lIHQxX2JsZW5kX290aGVyX2JsdWVzICAgICAgICAgIFQxX0JMRU5EX09USEVSX0JMVUVTCi0jZGVmaW5lIHQxX2JsZW5kX3N0YW5kYXJkX3dpZHRocyAgICAgIFQxX0JMRU5EX1NUQU5EQVJEX1dJRFRICi0jZGVmaW5lIHQxX2JsZW5kX3N0YW5kYXJkX2hlaWdodCAgICAgIFQxX0JMRU5EX1NUQU5EQVJEX0hFSUdIVAotI2RlZmluZSB0MV9ibGVuZF9zdGVtX3NuYXBfd2lkdGhzICAgICBUMV9CTEVORF9TVEVNX1NOQVBfV0lEVEhTCi0jZGVmaW5lIHQxX2JsZW5kX3N0ZW1fc25hcF9oZWlnaHRzICAgIFQxX0JMRU5EX1NURU1fU05BUF9IRUlHSFRTCi0jZGVmaW5lIHQxX2JsZW5kX2JsdWVfc2NhbGUgICAgICAgICAgIFQxX0JMRU5EX0JMVUVfU0NBTEUKLSNkZWZpbmUgdDFfYmxlbmRfYmx1ZV9zaGlmdCAgICAgICAgICAgVDFfQkxFTkRfQkxVRV9TSElGVAotI2RlZmluZSB0MV9ibGVuZF9mYW1pbHlfYmx1ZXMgICAgICAgICBUMV9CTEVORF9GQU1JTFlfQkxVRVMKLSNkZWZpbmUgdDFfYmxlbmRfZmFtaWx5X290aGVyX2JsdWVzICAgVDFfQkxFTkRfRkFNSUxZX09USEVSX0JMVUVTCi0jZGVmaW5lIHQxX2JsZW5kX2ZvcmNlX2JvbGQgICAgICAgICAgIFQxX0JMRU5EX0ZPUkNFX0JPTEQKLSNkZWZpbmUgdDFfYmxlbmRfbWF4ICAgICAgICAgICAgICAgICAgVDFfQkxFTkRfTUFYCi0KLSAgLyogKi8KLQotCi0gIC8qIG1heGltdW0gbnVtYmVyIG9mIE11bHRpcGxlIE1hc3RlcnMgZGVzaWducywgYXMgZGVmaW5lZCBpbiB0aGUgc3BlYyAqLwotI2RlZmluZSBUMV9NQVhfTU1fREVTSUdOUyAgICAgMTYKLQotICAvKiBtYXhpbXVtIG51bWJlciBvZiBNdWx0aXBsZSBNYXN0ZXJzIGF4ZXMsIGFzIGRlZmluZWQgaW4gdGhlIHNwZWMgKi8KLSNkZWZpbmUgVDFfTUFYX01NX0FYSVMgICAgICAgIDQKLQotICAvKiBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIGRlc2lnbiBtYXAgKi8KLSNkZWZpbmUgVDFfTUFYX01NX01BUF9QT0lOVFMgIDIwCi0KLQotICAvKiB0aGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHN0b3JlIHRoZSBCbGVuZERlc2lnbk1hcCBlbnRyeSBmb3IgYW4gYXhpcyAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNfRGVzaWduTWFwXwotICB7Ci0gICAgRlRfQnl0ZSAgICBudW1fcG9pbnRzOwotICAgIEZUX0xvbmcqICAgZGVzaWduX3BvaW50czsKLSAgICBGVF9GaXhlZCogIGJsZW5kX3BvaW50czsKLQotICB9IFBTX0Rlc2lnbk1hcFJlYywgKlBTX0Rlc2lnbk1hcDsKLQotICAvKiBiYWNrd2FyZHMtY29tcGF0aWJsZSBkZWZpbml0aW9uICovCi0gIHR5cGVkZWYgUFNfRGVzaWduTWFwUmVjICBUMV9EZXNpZ25NYXA7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgUFNfQmxlbmRSZWNfCi0gIHsKLSAgICBGVF9VSW50ICAgICAgICAgIG51bV9kZXNpZ25zOwotICAgIEZUX1VJbnQgICAgICAgICAgbnVtX2F4aXM7Ci0KLSAgICBGVF9TdHJpbmcqICAgICAgIGF4aXNfbmFtZXNbVDFfTUFYX01NX0FYSVNdOwotICAgIEZUX0ZpeGVkKiAgICAgICAgZGVzaWduX3Bvc1tUMV9NQVhfTU1fREVTSUdOU107Ci0gICAgUFNfRGVzaWduTWFwUmVjICBkZXNpZ25fbWFwW1QxX01BWF9NTV9BWElTXTsKLQotICAgIEZUX0ZpeGVkKiAgICAgICAgd2VpZ2h0X3ZlY3RvcjsKLSAgICBGVF9GaXhlZCogICAgICAgIGRlZmF1bHRfd2VpZ2h0X3ZlY3RvcjsKLQotICAgIFBTX0ZvbnRJbmZvICAgICAgZm9udF9pbmZvc1tUMV9NQVhfTU1fREVTSUdOUyArIDFdOwotICAgIFBTX1ByaXZhdGUgICAgICAgcHJpdmF0ZXMgIFtUMV9NQVhfTU1fREVTSUdOUyArIDFdOwotCi0gICAgRlRfVUxvbmcgICAgICAgICBibGVuZF9iaXRmbGFnczsKLQotICAgIEZUX0JCb3gqICAgICAgICAgYmJveGVzICAgIFtUMV9NQVhfTU1fREVTSUdOUyArIDFdOwotCi0gICAgLyogc2luY2UgMi4zLjAgKi8KLQotICAgIC8qIHVuZG9jdW1lbnRlZCwgb3B0aW9uYWw6IHRoZSBkZWZhdWx0IGRlc2lnbiBpbnN0YW5jZTsgICAqLwotICAgIC8qIGNvcnJlc3BvbmRzIHRvIGRlZmF1bHRfd2VpZ2h0X3ZlY3RvciAtLSAgICAgICAgICAgICAgICAqLwotICAgIC8qIG51bV9kZWZhdWx0X2Rlc2lnbl92ZWN0b3IgPT0gMCBtZWFucyBpdCBpcyBub3QgcHJlc2VudCAqLwotICAgIC8qIGluIHRoZSBmb250IGFuZCBhc3NvY2lhdGVkIG1ldHJpY3MgZmlsZXMgICAgICAgICAgICAgICAqLwotICAgIEZUX1VJbnQgICAgICAgICAgZGVmYXVsdF9kZXNpZ25fdmVjdG9yW1QxX01BWF9NTV9ERVNJR05TXTsKLSAgICBGVF9VSW50ICAgICAgICAgIG51bV9kZWZhdWx0X2Rlc2lnbl92ZWN0b3I7Ci0KLSAgfSBQU19CbGVuZFJlYywgKlBTX0JsZW5kOwotCi0KLSAgLyogYmFja3dhcmRzLWNvbXBhdGlibGUgZGVmaW5pdGlvbiAqLwotICB0eXBlZGVmIFBTX0JsZW5kUmVjICBUMV9CbGVuZDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENJRF9GYWNlRGljdFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gcmVwcmVzZW50IGRhdGEgaW4gYSBDSUQgdG9wLWxldmVsIGRpY3Rpb25hcnkuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIENJRF9GYWNlRGljdFJlY18KLSAgewotICAgIFBTX1ByaXZhdGVSZWMgIHByaXZhdGVfZGljdDsKLQotICAgIEZUX1VJbnQgICAgICAgIGxlbl9idWlsZGNoYXI7Ci0gICAgRlRfRml4ZWQgICAgICAgZm9yY2Vib2xkX3RocmVzaG9sZDsKLSAgICBGVF9Qb3MgICAgICAgICBzdHJva2Vfd2lkdGg7Ci0gICAgRlRfRml4ZWQgICAgICAgZXhwYW5zaW9uX2ZhY3RvcjsKLQotICAgIEZUX0J5dGUgICAgICAgIHBhaW50X3R5cGU7Ci0gICAgRlRfQnl0ZSAgICAgICAgZm9udF90eXBlOwotICAgIEZUX01hdHJpeCAgICAgIGZvbnRfbWF0cml4OwotICAgIEZUX1ZlY3RvciAgICAgIGZvbnRfb2Zmc2V0OwotCi0gICAgRlRfVUludCAgICAgICAgbnVtX3N1YnJzOwotICAgIEZUX1VMb25nICAgICAgIHN1YnJtYXBfb2Zmc2V0OwotICAgIEZUX0ludCAgICAgICAgIHNkX2J5dGVzOwotCi0gIH0gQ0lEX0ZhY2VEaWN0UmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX0ZhY2VEaWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBAQ0lEX0ZhY2VEaWN0UmVjIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBDSURfRmFjZURpY3RSZWNfKiAgQ0lEX0ZhY2VEaWN0OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX0ZvbnREaWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQgdG8gQENJRF9GYWNlRGljdFJlYy4gIEl0IGlzIGRlcHJlY2F0ZWQgYnV0ICovCi0gIC8qICAgIGtlcHQgdG8gbWFpbnRhaW4gc291cmNlIGNvbXBhdGliaWxpdHkgYmV0d2VlbiB2YXJpb3VzIHZlcnNpb25zIG9mICAqLwotICAvKiAgICBGcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgQ0lEX0ZhY2VEaWN0UmVjICBDSURfRm9udERpY3Q7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDSURfRmFjZUluZm9SZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIHJlcHJlc2VudCBDSUQgRmFjZSBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBDSURfRmFjZUluZm9SZWNfCi0gIHsKLSAgICBGVF9TdHJpbmcqICAgICAgY2lkX2ZvbnRfbmFtZTsKLSAgICBGVF9GaXhlZCAgICAgICAgY2lkX3ZlcnNpb247Ci0gICAgRlRfSW50ICAgICAgICAgIGNpZF9mb250X3R5cGU7Ci0KLSAgICBGVF9TdHJpbmcqICAgICAgcmVnaXN0cnk7Ci0gICAgRlRfU3RyaW5nKiAgICAgIG9yZGVyaW5nOwotICAgIEZUX0ludCAgICAgICAgICBzdXBwbGVtZW50OwotCi0gICAgUFNfRm9udEluZm9SZWMgIGZvbnRfaW5mbzsKLSAgICBGVF9CQm94ICAgICAgICAgZm9udF9iYm94OwotICAgIEZUX1VMb25nICAgICAgICB1aWRfYmFzZTsKLQotICAgIEZUX0ludCAgICAgICAgICBudW1feHVpZDsKLSAgICBGVF9VTG9uZyAgICAgICAgeHVpZFsxNl07Ci0KLSAgICBGVF9VTG9uZyAgICAgICAgY2lkbWFwX29mZnNldDsKLSAgICBGVF9JbnQgICAgICAgICAgZmRfYnl0ZXM7Ci0gICAgRlRfSW50ICAgICAgICAgIGdkX2J5dGVzOwotICAgIEZUX1VMb25nICAgICAgICBjaWRfY291bnQ7Ci0KLSAgICBGVF9JbnQgICAgICAgICAgbnVtX2RpY3RzOwotICAgIENJRF9GYWNlRGljdCAgICBmb250X2RpY3RzOwotCi0gICAgRlRfVUxvbmcgICAgICAgIGRhdGFfb2Zmc2V0OwotCi0gIH0gQ0lEX0ZhY2VJbmZvUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX0ZhY2VJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBAQ0lEX0ZhY2VJbmZvUmVjIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBDSURfRmFjZUluZm9SZWNfKiAgQ0lEX0ZhY2VJbmZvOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX0luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGlzIHR5cGUgaXMgZXF1aXZhbGVudCB0byBAQ0lEX0ZhY2VJbmZvUmVjLiAgSXQgaXMgZGVwcmVjYXRlZCBidXQgICovCi0gIC8qICAga2VwdCB0byBtYWludGFpbiBzb3VyY2UgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHZhcmlvdXMgdmVyc2lvbnMgb2YgICAqLwotICAvKiAgIEZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgQ0lEX0ZhY2VJbmZvUmVjICBDSURfSW5mbzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgICBGVF9IYXNfUFNfR2x5cGhfTmFtZXMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICBSZXR1cm4gdHJ1ZSBpZiBhIGdpdmVuIGZhY2UgcHJvdmlkZXMgcmVsaWFibGUgUG9zdFNjcmlwdCBnbHlwaAotICAgKiAgICBuYW1lcy4gIFRoaXMgaXMgc2ltaWxhciB0byB1c2luZyB0aGUgQEZUX0hBU19HTFlQSF9OQU1FUyBtYWNybywKLSAgICogICAgZXhjZXB0IHRoYXQgY2VydGFpbiBmb250cyAobW9zdGx5IFRydWVUeXBlKSBjb250YWluIGluY29ycmVjdAotICAgKiAgICBnbHlwaCBuYW1lIHRhYmxlcy4KLSAgICoKLSAgICogICAgV2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwgdGhlIGNhbGxlciBpcyBzdXJlIHRoYXQgdGhlIGdseXBoCi0gICAqICAgIG5hbWVzIHJldHVybmVkIGJ5IEBGVF9HZXRfR2x5cGhfTmFtZSBhcmUgcmVsaWFibGUuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICAgZmFjZSA6OgotICAgKiAgICAgICBmYWNlIGhhbmRsZQotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgICBCb29sZWFuLiAgVHJ1ZSBpZiBnbHlwaCBuYW1lcyBhcmUgcmVsaWFibGUuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0ludCApCi0gIEZUX0hhc19QU19HbHlwaF9OYW1lcyggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgIEZUX0dldF9QU19Gb250X0luZm8KLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICBSZXRyaWV2ZSB0aGUgQFBTX0ZvbnRJbmZvUmVjIHN0cnVjdHVyZSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4KLSAgICogICAgUG9zdFNjcmlwdCBmb250LgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgIGZhY2UgOjoKLSAgICogICAgICAgUG9zdFNjcmlwdCBmYWNlIGhhbmRsZS4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICAgYWZvbnRfaW5mbyA6OgotICAgKiAgICAgICBPdXRwdXQgZm9udCBpbmZvIHN0cnVjdHVyZSBwb2ludGVyLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICAgVGhlIHN0cmluZyBwb2ludGVycyB3aXRoaW4gdGhlIGZvbnQgaW5mbyBzdHJ1Y3R1cmUgYXJlIG93bmVkIGJ5Ci0gICAqICAgIHRoZSBmYWNlIGFuZCBkb24ndCBuZWVkIHRvIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCi0gICAqCi0gICAqICAgIElmIHRoZSBmb250J3MgZm9ybWF0IGlzIG5vdCBQb3N0U2NyaXB0LWJhc2VkLCB0aGlzIGZ1bmN0aW9uIHdpbGwKLSAgICogICAgcmV0dXJuIHRoZSBgRlRfRXJyX0ludmFsaWRfQXJndW1lbnQnIGVycm9yIGNvZGUuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X1BTX0ZvbnRfSW5mbyggRlRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIFBTX0ZvbnRJbmZvICBhZm9udF9pbmZvICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICAgRlRfR2V0X1BTX0ZvbnRfUHJpdmF0ZQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgIFJldHJpZXZlIHRoZSBAUFNfUHJpdmF0ZVJlYyBzdHJ1Y3R1cmUgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuCi0gICAqICAgIFBvc3RTY3JpcHQgZm9udC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgICBmYWNlIDo6Ci0gICAqICAgICAgIFBvc3RTY3JpcHQgZmFjZSBoYW5kbGUuCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgIGFmb250X3ByaXZhdGUgOjoKLSAgICogICAgICAgT3V0cHV0IHByaXZhdGUgZGljdGlvbmFyeSBzdHJ1Y3R1cmUgcG9pbnRlci4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgIFRoZSBzdHJpbmcgcG9pbnRlcnMgd2l0aGluIHRoZSBAUFNfUHJpdmF0ZVJlYyBzdHJ1Y3R1cmUgYXJlIG93bmVkIGJ5Ci0gICAqICAgIHRoZSBmYWNlIGFuZCBkb24ndCBuZWVkIHRvIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCi0gICAqCi0gICAqICAgIElmIHRoZSBmb250J3MgZm9ybWF0IGlzIG5vdCBQb3N0U2NyaXB0LWJhc2VkLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKLSAgICogICAgdGhlIGBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudCcgZXJyb3IgY29kZS4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfUFNfRm9udF9Qcml2YXRlKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBQU19Qcml2YXRlICBhZm9udF9wcml2YXRlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9FbmNvZGluZ1R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBlbnVtZXJhdGlvbiBkZXNjcmliaW5nIHRoZSBgRW5jb2RpbmcnIGVudHJ5IGluIGEgVHlwZSAxICAgICAgICAgKi8KLSAgLyogICAgZGljdGlvbmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfRU5DT0RJTkdfVFlQRV9OT05FIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0VOQ09ESU5HX1RZUEVfQVJSQVkgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9FTkNPRElOR19UWVBFX1NUQU5EQVJEIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfRU5DT0RJTkdfVFlQRV9JU09MQVRJTjEgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0VOQ09ESU5HX1RZUEVfRVhQRVJUIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBlbnVtICBUMV9FbmNvZGluZ1R5cGVfCi0gIHsKLSAgICBUMV9FTkNPRElOR19UWVBFX05PTkUgPSAwLAotICAgIFQxX0VOQ09ESU5HX1RZUEVfQVJSQVksCi0gICAgVDFfRU5DT0RJTkdfVFlQRV9TVEFOREFSRCwKLSAgICBUMV9FTkNPRElOR19UWVBFX0lTT0xBVElOMSwKLSAgICBUMV9FTkNPRElOR19UWVBFX0VYUEVSVAotCi0gIH0gVDFfRW5jb2RpbmdUeXBlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRGljdF9LZXlzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gZW51bWVyYXRpb24gdXNlZCBpbiBjYWxscyB0byBARlRfR2V0X1BTX0ZvbnRfVmFsdWUgdG8gaWRlbnRpZnkgICovCi0gIC8qICAgIHRoZSBUeXBlfjEgZGljdGlvbmFyeSBlbnRyeSB0byByZXRyaWV2ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfRk9OVF9UWVBFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0ZPTlRfTUFUUklYIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9GT05UX0JCT1ggOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfUEFJTlRfVFlQRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0ZPTlRfTkFNRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9VTklRVUVfSUQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfTlVNX0NIQVJfU1RSSU5HUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0NIQVJfU1RSSU5HX0tFWSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9DSEFSX1NUUklORyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfRU5DT0RJTkdfVFlQRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0VOQ09ESU5HX0VOVFJZIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9OVU1fU1VCUlMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfU1VCUiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX1NURF9IVyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9TVERfVlcgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfTlVNX0JMVUVfVkFMVUVTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0JMVUVfVkFMVUUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9CTFVFX0ZVWlogOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfTlVNX09USEVSX0JMVUVTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX09USEVSX0JMVUUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9OVU1fRkFNSUxZX0JMVUVTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfRkFNSUxZX0JMVUUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX05VTV9GQU1JTFlfT1RIRVJfQkxVRVMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9GQU1JTFlfT1RIRVJfQkxVRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfQkxVRV9TQ0FMRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0JMVUVfU0hJRlQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9OVU1fU1RFTV9TTkFQX0ggOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfU1RFTV9TTkFQX0ggOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX05VTV9TVEVNX1NOQVBfViA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9TVEVNX1NOQVBfViA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfRk9SQ0VfQk9MRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX1JORF9TVEVNX1VQIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9NSU5fRkVBVFVSRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfTEVOX0lWIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX1BBU1NXT1JEIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9MQU5HVUFHRV9HUk9VUCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfVkVSU0lPTiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX05PVElDRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9GVUxMX05BTUUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfRkFNSUxZX05BTUUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX1dFSUdIVCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9JU19GSVhFRF9QSVRDSCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfVU5ERVJMSU5FX1BPU0lUSU9OIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX1VOREVSTElORV9USElDS05FU1MgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9GU19UWVBFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfSVRBTElDX0FOR0xFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBlbnVtICBQU19EaWN0X0tleXNfCi0gIHsKLSAgICAvKiBjb252ZW50aW9uYWxseSBpbiB0aGUgZm9udCBkaWN0aW9uYXJ5ICovCi0gICAgUFNfRElDVF9GT05UX1RZUEUsICAgICAgICAgICAgICAvKiBGVF9CeXRlICAgICAgICAgKi8KLSAgICBQU19ESUNUX0ZPTlRfTUFUUklYLCAgICAgICAgICAgIC8qIEZUX0ZpeGVkICAgICAgICAqLwotICAgIFBTX0RJQ1RfRk9OVF9CQk9YLCAgICAgICAgICAgICAgLyogRlRfRml4ZWQgICAgICAgICovCi0gICAgUFNfRElDVF9QQUlOVF9UWVBFLCAgICAgICAgICAgICAvKiBGVF9CeXRlICAgICAgICAgKi8KLSAgICBQU19ESUNUX0ZPTlRfTkFNRSwgICAgICAgICAgICAgIC8qIEZUX1N0cmluZyogICAgICAqLwotICAgIFBTX0RJQ1RfVU5JUVVFX0lELCAgICAgICAgICAgICAgLyogRlRfSW50ICAgICAgICAgICovCi0gICAgUFNfRElDVF9OVU1fQ0hBUl9TVFJJTkdTLCAgICAgICAvKiBGVF9JbnQgICAgICAgICAgKi8KLSAgICBQU19ESUNUX0NIQVJfU1RSSU5HX0tFWSwgICAgICAgIC8qIEZUX1N0cmluZyogICAgICAqLwotICAgIFBTX0RJQ1RfQ0hBUl9TVFJJTkcsICAgICAgICAgICAgLyogRlRfU3RyaW5nKiAgICAgICovCi0gICAgUFNfRElDVF9FTkNPRElOR19UWVBFLCAgICAgICAgICAvKiBUMV9FbmNvZGluZ1R5cGUgKi8KLSAgICBQU19ESUNUX0VOQ09ESU5HX0VOVFJZLCAgICAgICAgIC8qIEZUX1N0cmluZyogICAgICAqLwotCi0gICAgLyogY29udmVudGlvbmFsbHkgaW4gdGhlIGZvbnQgUHJpdmF0ZSBkaWN0aW9uYXJ5ICovCi0gICAgUFNfRElDVF9OVU1fU1VCUlMsICAgICAgICAgICAgICAvKiBGVF9JbnQgICAgICovCi0gICAgUFNfRElDVF9TVUJSLCAgICAgICAgICAgICAgICAgICAvKiBGVF9TdHJpbmcqICovCi0gICAgUFNfRElDVF9TVERfSFcsICAgICAgICAgICAgICAgICAvKiBGVF9VU2hvcnQgICovCi0gICAgUFNfRElDVF9TVERfVlcsICAgICAgICAgICAgICAgICAvKiBGVF9VU2hvcnQgICovCi0gICAgUFNfRElDVF9OVU1fQkxVRV9WQUxVRVMsICAgICAgICAvKiBGVF9CeXRlICAgICovCi0gICAgUFNfRElDVF9CTFVFX1ZBTFVFLCAgICAgICAgICAgICAvKiBGVF9TaG9ydCAgICovCi0gICAgUFNfRElDVF9CTFVFX0ZVWlosICAgICAgICAgICAgICAvKiBGVF9JbnQgICAgICovCi0gICAgUFNfRElDVF9OVU1fT1RIRVJfQkxVRVMsICAgICAgICAvKiBGVF9CeXRlICAgICovCi0gICAgUFNfRElDVF9PVEhFUl9CTFVFLCAgICAgICAgICAgICAvKiBGVF9TaG9ydCAgICovCi0gICAgUFNfRElDVF9OVU1fRkFNSUxZX0JMVUVTLCAgICAgICAvKiBGVF9CeXRlICAgICovCi0gICAgUFNfRElDVF9GQU1JTFlfQkxVRSwgICAgICAgICAgICAvKiBGVF9TaG9ydCAgICovCi0gICAgUFNfRElDVF9OVU1fRkFNSUxZX09USEVSX0JMVUVTLCAvKiBGVF9CeXRlICAgICovCi0gICAgUFNfRElDVF9GQU1JTFlfT1RIRVJfQkxVRSwgICAgICAvKiBGVF9TaG9ydCAgICovCi0gICAgUFNfRElDVF9CTFVFX1NDQUxFLCAgICAgICAgICAgICAvKiBGVF9GaXhlZCAgICovCi0gICAgUFNfRElDVF9CTFVFX1NISUZULCAgICAgICAgICAgICAvKiBGVF9JbnQgICAgICovCi0gICAgUFNfRElDVF9OVU1fU1RFTV9TTkFQX0gsICAgICAgICAvKiBGVF9CeXRlICAgICovCi0gICAgUFNfRElDVF9TVEVNX1NOQVBfSCwgICAgICAgICAgICAvKiBGVF9TaG9ydCAgICovCi0gICAgUFNfRElDVF9OVU1fU1RFTV9TTkFQX1YsICAgICAgICAvKiBGVF9CeXRlICAgICovCi0gICAgUFNfRElDVF9TVEVNX1NOQVBfViwgICAgICAgICAgICAvKiBGVF9TaG9ydCAgICovCi0gICAgUFNfRElDVF9GT1JDRV9CT0xELCAgICAgICAgICAgICAvKiBGVF9Cb29sICAgICovCi0gICAgUFNfRElDVF9STkRfU1RFTV9VUCwgICAgICAgICAgICAvKiBGVF9Cb29sICAgICovCi0gICAgUFNfRElDVF9NSU5fRkVBVFVSRSwgICAgICAgICAgICAvKiBGVF9TaG9ydCAgICovCi0gICAgUFNfRElDVF9MRU5fSVYsICAgICAgICAgICAgICAgICAvKiBGVF9JbnQgICAgICovCi0gICAgUFNfRElDVF9QQVNTV09SRCwgICAgICAgICAgICAgICAvKiBGVF9Mb25nICAgICovCi0gICAgUFNfRElDVF9MQU5HVUFHRV9HUk9VUCwgICAgICAgICAvKiBGVF9Mb25nICAgICovCi0KLSAgICAvKiBjb252ZW50aW9uYWxseSBpbiB0aGUgZm9udCBGb250SW5mbyBkaWN0aW9uYXJ5ICovCi0gICAgUFNfRElDVF9WRVJTSU9OLCAgICAgICAgICAgICAgICAvKiBGVF9TdHJpbmcqICovCi0gICAgUFNfRElDVF9OT1RJQ0UsICAgICAgICAgICAgICAgICAvKiBGVF9TdHJpbmcqICovCi0gICAgUFNfRElDVF9GVUxMX05BTUUsICAgICAgICAgICAgICAvKiBGVF9TdHJpbmcqICovCi0gICAgUFNfRElDVF9GQU1JTFlfTkFNRSwgICAgICAgICAgICAvKiBGVF9TdHJpbmcqICovCi0gICAgUFNfRElDVF9XRUlHSFQsICAgICAgICAgICAgICAgICAvKiBGVF9TdHJpbmcqICovCi0gICAgUFNfRElDVF9JU19GSVhFRF9QSVRDSCwgICAgICAgICAvKiBGVF9Cb29sICAgICovCi0gICAgUFNfRElDVF9VTkRFUkxJTkVfUE9TSVRJT04sICAgICAvKiBGVF9TaG9ydCAgICovCi0gICAgUFNfRElDVF9VTkRFUkxJTkVfVEhJQ0tORVNTLCAgICAvKiBGVF9VU2hvcnQgICovCi0gICAgUFNfRElDVF9GU19UWVBFLCAgICAgICAgICAgICAgICAvKiBGVF9VU2hvcnQgICovCi0gICAgUFNfRElDVF9JVEFMSUNfQU5HTEUsICAgICAgICAgICAvKiBGVF9Mb25nICAgICovCi0KLSAgICBQU19ESUNUX01BWCA9IFBTX0RJQ1RfSVRBTElDX0FOR0xFCi0KLSAgfSBQU19EaWN0X0tleXM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICAgRlRfR2V0X1BTX0ZvbnRfVmFsdWUKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICBSZXRyaWV2ZSB0aGUgdmFsdWUgZm9yIHRoZSBzdXBwbGllZCBrZXkgZnJvbSBhIFBvc3RTY3JpcHQgZm9udC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgICBmYWNlIDo6Ci0gICAqICAgICAgIFBvc3RTY3JpcHQgZmFjZSBoYW5kbGUuCi0gICAqCi0gICAqICAgIGtleSA6OgotICAgKiAgICAgICBBbiBlbnVtZXJhdGlvbiB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGRpY3Rpb25hcnkga2V5IHRvIHJldHJpZXZlLgotICAgKgotICAgKiAgICBpZHggOjoKLSAgICogICAgICAgRm9yIGFycmF5IHZhbHVlcywgdGhpcyBzcGVjaWZpZXMgdGhlIGluZGV4IHRvIGJlIHJldHVybmVkLgotICAgKgotICAgKiAgICB2YWx1ZSA6OgotICAgKiAgICAgICBBIHBvaW50ZXIgdG8gbWVtb3J5IGludG8gd2hpY2ggdG8gd3JpdGUgdGhlIHZhbHVlLgotICAgKgotICAgKiAgICB2YWxlbl9sZW4gOjoKLSAgICogICAgICAgVGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgbWVtb3J5IHN1cHBsaWVkIGZvciB0aGUgdmFsdWUuCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgIHZhbHVlIDo6Ci0gICAqICAgICAgIFRoZSB2YWx1ZSBtYXRjaGluZyB0aGUgYWJvdmUga2V5LCBpZiBpdCBleGlzdHMuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgIFRoZSBhbW91bnQgb2YgbWVtb3J5IChpbiBieXRlcykgcmVxdWlyZWQgdG8gaG9sZCB0aGUgcmVxdWVzdGVkCi0gICAqICAgIHZhbHVlIChpZiBpdCBleGlzdHMsIC0xIG90aGVyd2lzZSkuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgICBUaGUgdmFsdWVzIHJldHVybmVkIGFyZSBub3QgcG9pbnRlcnMgaW50byB0aGUgaW50ZXJuYWwgc3RydWN0dXJlcyBvZgotICAgKiAgICB0aGUgZmFjZSwgYnV0IGFyZSBgZnJlc2gnIGNvcGllcywgc28gdGhhdCB0aGUgbWVtb3J5IGNvbnRhaW5pbmcgdGhlbQotICAgKiAgICBiZWxvbmdzIHRvIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLiAgVGhpcyBhbHNvIGVuZm9yY2VzIHRoZQotICAgKiAgICBgcmVhZC1vbmx5JyBuYXR1cmUgb2YgdGhlc2UgdmFsdWVzLCBpLmUuLCB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZQotICAgKiAgICB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIGZhY2UuCi0gICAqCi0gICAqICAgIGB2YWx1ZScgaXMgYSB2b2lkIHBvaW50ZXIgYmVjYXVzZSB0aGUgdmFsdWVzIHJldHVybmVkIGNhbiBiZSBvZgotICAgKiAgICB2YXJpb3VzIHR5cGVzLgotICAgKgotICAgKiAgICBJZiBlaXRoZXIgYHZhbHVlJyBpcyBOVUxMIG9yIGB2YWx1ZV9sZW4nIGlzIHRvbyBzbWFsbCwganVzdCB0aGUKLSAgICogICAgcmVxdWlyZWQgbWVtb3J5IHNpemUgZm9yIHRoZSByZXF1ZXN0ZWQgZW50cnkgaXMgcmV0dXJuZWQuCi0gICAqCi0gICAqICAgIFRoZSBgaWR4JyBwYXJhbWV0ZXIgaXMgdXNlZCwgbm90IG9ubHkgdG8gcmV0cmlldmUgZWxlbWVudHMgb2YsIGZvcgotICAgKiAgICBleGFtcGxlLCB0aGUgRm9udE1hdHJpeCBvciBGb250QkJveCwgYnV0IGFsc28gdG8gcmV0cmlldmUgbmFtZSBrZXlzCi0gICAqICAgIGZyb20gdGhlIENoYXJTdHJpbmdzIGRpY3Rpb25hcnksIGFuZCB0aGUgY2hhcnN0cmluZ3MgdGhlbXNlbHZlcy4gIEl0Ci0gICAqICAgIGlzIGlnbm9yZWQgZm9yIGF0b21pYyB2YWx1ZXMuCi0gICAqCi0gICAqICAgIFBTX0RJQ1RfQkxVRV9TQ0FMRSByZXR1cm5zIGEgdmFsdWUgdGhhdCBpcyBzY2FsZWQgdXAgYnkgMTAwMC4gIFRvCi0gICAqICAgIGdldCB0aGUgdmFsdWUgYXMgaW4gdGhlIGZvbnQgc3RyZWFtLCB5b3UgbmVlZCB0byBkaXZpZGUgYnkKLSAgICogICAgNjU1MzYwMDAuMCAodG8gcmVtb3ZlIHRoZSBGVF9GaXhlZCBzY2FsZSwgYW5kIHRoZSB4MTAwMCBzY2FsZSkuCi0gICAqCi0gICAqICAgIElNUE9SVEFOVDogT25seSBrZXkvdmFsdWUgcGFpcnMgcmVhZCBieSB0aGUgRnJlZVR5cGUgaW50ZXJwcmV0ZXIgY2FuCi0gICAqICAgIGJlIHJldHJpZXZlZC4gIFNvLCBmb3IgZXhhbXBsZSwgUG9zdFNjcmlwdCBwcm9jZWR1cmVzIHN1Y2ggYXMgTlAsCi0gICAqICAgIE5ELCBhbmQgUkQgYXJlIG5vdCBhdmFpbGFibGUuICBBcmJpdHJhcnkga2V5cyBhcmUsIG9idmlvdXNseSwgbm90IGJlCi0gICAqICAgIGF2YWlsYWJsZSBlaXRoZXIuCi0gICAqCi0gICAqICAgIElmIHRoZSBmb250J3MgZm9ybWF0IGlzIG5vdCBQb3N0U2NyaXB0LWJhc2VkLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKLSAgICogICAgdGhlIGBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudCcgZXJyb3IgY29kZS4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfTG9uZyApCi0gIEZUX0dldF9QU19Gb250X1ZhbHVlKCBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBQU19EaWN0X0tleXMgIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgdmFsdWVfbGVuICk7Ci0KLSAgLyogKi8KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19UMVRBQkxFU19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvdHRuYW1laWQuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvdHRuYW1laWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcxMWQxZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL3R0bmFtZWlkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0bmFtZWlkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBuYW1lIElEIGRlZmluaXRpb25zIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDA0LCAyMDA2LTIwMDgsIDIwMTIsIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1RUTkFNRUlEX0hfXwotI2RlZmluZSBfX1RUTkFNRUlEX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHJ1ZXR5cGVfdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBQb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBgcGxhdGZvcm0nIGlkZW50aWZpZXIgY29kZSBpbiB0aGUgbmFtZSAgICAgICAgKi8KLSAgLyogcmVjb3JkcyBvZiB0aGUgVFRGIGBuYW1lJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZW51bToKLSAgICogICBUVF9QTEFURk9STV9YWFgKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbGlzdCBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBgcGxhdGZvcm1faWQnIGlkZW50aWZpZXIgY29kZSBpbgotICAgKiAgIEBGVF9DaGFyTWFwUmVjIGFuZCBARlRfU2ZudE5hbWUgc3RydWN0dXJlcy4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBUVF9QTEFURk9STV9BUFBMRV9VTklDT0RFIDo6Ci0gICAqICAgICBVc2VkIGJ5IEFwcGxlIHRvIGluZGljYXRlIGEgVW5pY29kZSBjaGFyYWN0ZXIgbWFwIGFuZC9vciBuYW1lIGVudHJ5LgotICAgKiAgICAgU2VlIEBUVF9BUFBMRV9JRF9YWFggZm9yIGNvcnJlc3BvbmRpbmcgYGVuY29kaW5nX2lkJyB2YWx1ZXMuICBOb3RlCi0gICAqICAgICB0aGF0IG5hbWUgZW50cmllcyBpbiB0aGlzIGZvcm1hdCBhcmUgY29kZWQgYXMgYmlnLWVuZGlhbiBVQ1MtMgotICAgKiAgICAgY2hhcmFjdGVyIGNvZGVzIF9vbmx5Xy4KLSAgICoKLSAgICogICBUVF9QTEFURk9STV9NQUNJTlRPU0ggOjoKLSAgICogICAgIFVzZWQgYnkgQXBwbGUgdG8gaW5kaWNhdGUgYSBNYWNPUy1zcGVjaWZpYyBjaGFybWFwIGFuZC9vciBuYW1lIGVudHJ5LgotICAgKiAgICAgU2VlIEBUVF9NQUNfSURfWFhYIGZvciBjb3JyZXNwb25kaW5nIGBlbmNvZGluZ19pZCcgdmFsdWVzLiAgTm90ZSB0aGF0Ci0gICAqICAgICBtb3N0IFRydWVUeXBlIGZvbnRzIGNvbnRhaW4gYW4gQXBwbGUgcm9tYW4gY2hhcm1hcCB0byBiZSB1c2FibGUgb24KLSAgICogICAgIE1hY09TIHN5c3RlbXMgKGV2ZW4gaWYgdGhleSBjb250YWluIGEgTWljcm9zb2Z0IGNoYXJtYXAgYXMgd2VsbCkuCi0gICAqCi0gICAqICAgVFRfUExBVEZPUk1fSVNPIDo6Ci0gICAqICAgICBUaGlzIHZhbHVlIHdhcyB1c2VkIHRvIHNwZWNpZnkgSVNPL0lFQyAxMDY0NiBjaGFybWFwcy4gIEl0IGlzIGhvd2V2ZXIKLSAgICogICAgIG5vdyBkZXByZWNhdGVkLiAgU2VlIEBUVF9JU09fSURfWFhYIGZvciBhIGxpc3Qgb2YgY29ycmVzcG9uZGluZwotICAgKiAgICAgYGVuY29kaW5nX2lkJyB2YWx1ZXMuCi0gICAqCi0gICAqICAgVFRfUExBVEZPUk1fTUlDUk9TT0ZUIDo6Ci0gICAqICAgICBVc2VkIGJ5IE1pY3Jvc29mdCB0byBpbmRpY2F0ZSBXaW5kb3dzLXNwZWNpZmljIGNoYXJtYXBzLiAgU2VlCi0gICAqICAgICBAVFRfTVNfSURfWFhYIGZvciBhIGxpc3Qgb2YgY29ycmVzcG9uZGluZyBgZW5jb2RpbmdfaWQnIHZhbHVlcy4KLSAgICogICAgIE5vdGUgdGhhdCBtb3N0IGZvbnRzIGNvbnRhaW4gYSBVbmljb2RlIGNoYXJtYXAgdXNpbmcKLSAgICogICAgIChUVF9QTEFURk9STV9NSUNST1NPRlQsIEBUVF9NU19JRF9VTklDT0RFX0NTKS4KLSAgICoKLSAgICogICBUVF9QTEFURk9STV9DVVNUT00gOjoKLSAgICogICAgIFVzZWQgdG8gaW5kaWNhdGUgYXBwbGljYXRpb24tc3BlY2lmaWMgY2hhcm1hcHMuCi0gICAqCi0gICAqICAgVFRfUExBVEZPUk1fQURPQkUgOjoKLSAgICogICAgIFRoaXMgdmFsdWUgaXNuJ3QgcGFydCBvZiBhbnkgZm9udCBmb3JtYXQgc3BlY2lmaWNhdGlvbiwgYnV0IGlzIHVzZWQKLSAgICogICAgIGJ5IEZyZWVUeXBlIHRvIHJlcG9ydCBBZG9iZS1zcGVjaWZpYyBjaGFybWFwcyBpbiBhbiBARlRfQ2hhck1hcFJlYwotICAgKiAgICAgc3RydWN0dXJlLiAgU2VlIEBUVF9BRE9CRV9JRF9YWFguCi0gICAqLwotCi0jZGVmaW5lIFRUX1BMQVRGT1JNX0FQUExFX1VOSUNPREUgIDAKLSNkZWZpbmUgVFRfUExBVEZPUk1fTUFDSU5UT1NIICAgICAgMQotI2RlZmluZSBUVF9QTEFURk9STV9JU08gICAgICAgICAgICAyIC8qIGRlcHJlY2F0ZWQgKi8KLSNkZWZpbmUgVFRfUExBVEZPUk1fTUlDUk9TT0ZUICAgICAgMwotI2RlZmluZSBUVF9QTEFURk9STV9DVVNUT00gICAgICAgICA0Ci0jZGVmaW5lIFRUX1BMQVRGT1JNX0FET0JFICAgICAgICAgIDcgLyogYXJ0aWZpY2lhbCAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIFRUX0FQUExFX0lEX1hYWAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBsaXN0IG9mIHZhbGlkIHZhbHVlcyBmb3IgdGhlIGBlbmNvZGluZ19pZCcgZm9yCi0gICAqICAgQFRUX1BMQVRGT1JNX0FQUExFX1VOSUNPREUgY2hhcm1hcHMgYW5kIG5hbWUgZW50cmllcy4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBUVF9BUFBMRV9JRF9ERUZBVUxUIDo6Ci0gICAqICAgICBVbmljb2RlIHZlcnNpb24gMS4wLgotICAgKgotICAgKiAgIFRUX0FQUExFX0lEX1VOSUNPREVfMV8xIDo6Ci0gICAqICAgICBVbmljb2RlIDEuMTsgc3BlY2lmaWVzIEhhbmd1bCBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0IFUrMzR4eC4KLSAgICoKLSAgICogICBUVF9BUFBMRV9JRF9JU09fMTA2NDYgOjoKLSAgICogICAgIERlcHJlY2F0ZWQgKGlkZW50aWNhbCB0byBwcmVjZWRpbmcpLgotICAgKgotICAgKiAgIFRUX0FQUExFX0lEX1VOSUNPREVfMl8wIDo6Ci0gICAqICAgICBVbmljb2RlIDIuMCBhbmQgYmV5b25kIChVVEYtMTYgQk1QIG9ubHkpLgotICAgKgotICAgKiAgIFRUX0FQUExFX0lEX1VOSUNPREVfMzIgOjoKLSAgICogICAgIFVuaWNvZGUgMy4xIGFuZCBiZXlvbmQsIHVzaW5nIFVURi0zMi4KLSAgICoKLSAgICogICBUVF9BUFBMRV9JRF9WQVJJQU5UX1NFTEVDVE9SIDo6Ci0gICAqICAgICBGcm9tIEFkb2JlLCBub3QgQXBwbGUuICBOb3QgYSBub3JtYWwgY21hcC4gIFNwZWNpZmllcyB2YXJpYXRpb25zCi0gICAqICAgICBvbiBhIHJlYWwgY21hcC4KLSAgICovCi0KLSNkZWZpbmUgVFRfQVBQTEVfSURfREVGQVVMVCAgICAgICAgICAgMCAvKiBVbmljb2RlIDEuMCAqLwotI2RlZmluZSBUVF9BUFBMRV9JRF9VTklDT0RFXzFfMSAgICAgICAxIC8qIHNwZWNpZnkgSGFuZ3VsIGF0IFUrMzR4eCAqLwotI2RlZmluZSBUVF9BUFBMRV9JRF9JU09fMTA2NDYgICAgICAgICAyIC8qIGRlcHJlY2F0ZWQgKi8KLSNkZWZpbmUgVFRfQVBQTEVfSURfVU5JQ09ERV8yXzAgICAgICAgMyAvKiBvciBsYXRlciAqLwotI2RlZmluZSBUVF9BUFBMRV9JRF9VTklDT0RFXzMyICAgICAgICA0IC8qIDIuMCBvciBsYXRlciwgZnVsbCByZXBlcnRvaXJlICovCi0jZGVmaW5lIFRUX0FQUExFX0lEX1ZBUklBTlRfU0VMRUNUT1IgIDUgLyogdmFyaWF0aW9uIHNlbGVjdG9yIGRhdGEgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZW51bToKLSAgICogICBUVF9NQUNfSURfWFhYCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGxpc3Qgb2YgdmFsaWQgdmFsdWVzIGZvciB0aGUgYGVuY29kaW5nX2lkJyBmb3IKLSAgICogICBAVFRfUExBVEZPUk1fTUFDSU5UT1NIIGNoYXJtYXBzIGFuZCBuYW1lIGVudHJpZXMuCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgVFRfTUFDX0lEX1JPTUFOIDo6Ci0gICAqICAgVFRfTUFDX0lEX0pBUEFORVNFIDo6Ci0gICAqICAgVFRfTUFDX0lEX1RSQURJVElPTkFMX0NISU5FU0UgOjoKLSAgICogICBUVF9NQUNfSURfS09SRUFOIDo6Ci0gICAqICAgVFRfTUFDX0lEX0FSQUJJQyA6OgotICAgKiAgIFRUX01BQ19JRF9IRUJSRVcgOjoKLSAgICogICBUVF9NQUNfSURfR1JFRUsgOjoKLSAgICogICBUVF9NQUNfSURfUlVTU0lBTiA6OgotICAgKiAgIFRUX01BQ19JRF9SU1lNQk9MIDo6Ci0gICAqICAgVFRfTUFDX0lEX0RFVkFOQUdBUkkgOjoKLSAgICogICBUVF9NQUNfSURfR1VSTVVLSEkgOjoKLSAgICogICBUVF9NQUNfSURfR1VKQVJBVEkgOjoKLSAgICogICBUVF9NQUNfSURfT1JJWUEgOjoKLSAgICogICBUVF9NQUNfSURfQkVOR0FMSSA6OgotICAgKiAgIFRUX01BQ19JRF9UQU1JTCA6OgotICAgKiAgIFRUX01BQ19JRF9URUxVR1UgOjoKLSAgICogICBUVF9NQUNfSURfS0FOTkFEQSA6OgotICAgKiAgIFRUX01BQ19JRF9NQUxBWUFMQU0gOjoKLSAgICogICBUVF9NQUNfSURfU0lOSEFMRVNFIDo6Ci0gICAqICAgVFRfTUFDX0lEX0JVUk1FU0UgOjoKLSAgICogICBUVF9NQUNfSURfS0hNRVIgOjoKLSAgICogICBUVF9NQUNfSURfVEhBSSA6OgotICAgKiAgIFRUX01BQ19JRF9MQU9USUFOIDo6Ci0gICAqICAgVFRfTUFDX0lEX0dFT1JHSUFOIDo6Ci0gICAqICAgVFRfTUFDX0lEX0FSTUVOSUFOIDo6Ci0gICAqICAgVFRfTUFDX0lEX01BTERJVklBTiA6OgotICAgKiAgIFRUX01BQ19JRF9TSU1QTElGSUVEX0NISU5FU0UgOjoKLSAgICogICBUVF9NQUNfSURfVElCRVRBTiA6OgotICAgKiAgIFRUX01BQ19JRF9NT05HT0xJQU4gOjoKLSAgICogICBUVF9NQUNfSURfR0VFWiA6OgotICAgKiAgIFRUX01BQ19JRF9TTEFWSUMgOjoKLSAgICogICBUVF9NQUNfSURfVklFVE5BTUVTRSA6OgotICAgKiAgIFRUX01BQ19JRF9TSU5ESEkgOjoKLSAgICogICBUVF9NQUNfSURfVU5JTlRFUlAgOjoKLSAgICovCi0KLSNkZWZpbmUgVFRfTUFDX0lEX1JPTUFOICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFRUX01BQ19JRF9KQVBBTkVTRSAgICAgICAgICAgICAgMQotI2RlZmluZSBUVF9NQUNfSURfVFJBRElUSU9OQUxfQ0hJTkVTRSAgIDIKLSNkZWZpbmUgVFRfTUFDX0lEX0tPUkVBTiAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIFRUX01BQ19JRF9BUkFCSUMgICAgICAgICAgICAgICAgNAotI2RlZmluZSBUVF9NQUNfSURfSEVCUkVXICAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgVFRfTUFDX0lEX0dSRUVLICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIFRUX01BQ19JRF9SVVNTSUFOICAgICAgICAgICAgICAgNwotI2RlZmluZSBUVF9NQUNfSURfUlNZTUJPTCAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgVFRfTUFDX0lEX0RFVkFOQUdBUkkgICAgICAgICAgICA5Ci0jZGVmaW5lIFRUX01BQ19JRF9HVVJNVUtISSAgICAgICAgICAgICAxMAotI2RlZmluZSBUVF9NQUNfSURfR1VKQVJBVEkgICAgICAgICAgICAgMTEKLSNkZWZpbmUgVFRfTUFDX0lEX09SSVlBICAgICAgICAgICAgICAgIDEyCi0jZGVmaW5lIFRUX01BQ19JRF9CRU5HQUxJICAgICAgICAgICAgICAxMwotI2RlZmluZSBUVF9NQUNfSURfVEFNSUwgICAgICAgICAgICAgICAgMTQKLSNkZWZpbmUgVFRfTUFDX0lEX1RFTFVHVSAgICAgICAgICAgICAgIDE1Ci0jZGVmaW5lIFRUX01BQ19JRF9LQU5OQURBICAgICAgICAgICAgICAxNgotI2RlZmluZSBUVF9NQUNfSURfTUFMQVlBTEFNICAgICAgICAgICAgMTcKLSNkZWZpbmUgVFRfTUFDX0lEX1NJTkhBTEVTRSAgICAgICAgICAgIDE4Ci0jZGVmaW5lIFRUX01BQ19JRF9CVVJNRVNFICAgICAgICAgICAgICAxOQotI2RlZmluZSBUVF9NQUNfSURfS0hNRVIgICAgICAgICAgICAgICAgMjAKLSNkZWZpbmUgVFRfTUFDX0lEX1RIQUkgICAgICAgICAgICAgICAgIDIxCi0jZGVmaW5lIFRUX01BQ19JRF9MQU9USUFOICAgICAgICAgICAgICAyMgotI2RlZmluZSBUVF9NQUNfSURfR0VPUkdJQU4gICAgICAgICAgICAgMjMKLSNkZWZpbmUgVFRfTUFDX0lEX0FSTUVOSUFOICAgICAgICAgICAgIDI0Ci0jZGVmaW5lIFRUX01BQ19JRF9NQUxESVZJQU4gICAgICAgICAgICAyNQotI2RlZmluZSBUVF9NQUNfSURfU0lNUExJRklFRF9DSElORVNFICAgMjUKLSNkZWZpbmUgVFRfTUFDX0lEX1RJQkVUQU4gICAgICAgICAgICAgIDI2Ci0jZGVmaW5lIFRUX01BQ19JRF9NT05HT0xJQU4gICAgICAgICAgICAyNwotI2RlZmluZSBUVF9NQUNfSURfR0VFWiAgICAgICAgICAgICAgICAgMjgKLSNkZWZpbmUgVFRfTUFDX0lEX1NMQVZJQyAgICAgICAgICAgICAgIDI5Ci0jZGVmaW5lIFRUX01BQ19JRF9WSUVUTkFNRVNFICAgICAgICAgICAzMAotI2RlZmluZSBUVF9NQUNfSURfU0lOREhJICAgICAgICAgICAgICAgMzEKLSNkZWZpbmUgVFRfTUFDX0lEX1VOSU5URVJQICAgICAgICAgICAgIDMyCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGVudW06Ci0gICAqICAgVFRfSVNPX0lEX1hYWAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBsaXN0IG9mIHZhbGlkIHZhbHVlcyBmb3IgdGhlIGBlbmNvZGluZ19pZCcgZm9yCi0gICAqICAgQFRUX1BMQVRGT1JNX0lTTyBjaGFybWFwcyBhbmQgbmFtZSBlbnRyaWVzLgotICAgKgotICAgKiAgIFRoZWlyIHVzZSBpcyBub3cgZGVwcmVjYXRlZC4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBUVF9JU09fSURfN0JJVF9BU0NJSSA6OgotICAgKiAgICAgQVNDSUkuCi0gICAqICAgVFRfSVNPX0lEXzEwNjQ2IDo6Ci0gICAqICAgICBJU08vMTA2NDYuCi0gICAqICAgVFRfSVNPX0lEXzg4NTlfMSA6OgotICAgKiAgICAgQWxzbyBrbm93biBhcyBMYXRpbi0xLgotICAgKi8KLQotI2RlZmluZSBUVF9JU09fSURfN0JJVF9BU0NJSSAgMAotI2RlZmluZSBUVF9JU09fSURfMTA2NDYgICAgICAgMQotI2RlZmluZSBUVF9JU09fSURfODg1OV8xICAgICAgMgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIFRUX01TX0lEX1hYWAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBsaXN0IG9mIHZhbGlkIHZhbHVlcyBmb3IgdGhlIGBlbmNvZGluZ19pZCcgZm9yCi0gICAqICAgQFRUX1BMQVRGT1JNX01JQ1JPU09GVCBjaGFybWFwcyBhbmQgbmFtZSBlbnRyaWVzLgotICAgKgotICAgKiBAdmFsdWVzOgotICAgKiAgIFRUX01TX0lEX1NZTUJPTF9DUyA6OgotICAgKiAgICAgQ29ycmVzcG9uZHMgdG8gTWljcm9zb2Z0IHN5bWJvbCBlbmNvZGluZy4gU2VlCi0gICAqICAgICBARlRfRU5DT0RJTkdfTVNfU1lNQk9MLgotICAgKgotICAgKiAgIFRUX01TX0lEX1VOSUNPREVfQ1MgOjoKLSAgICogICAgIENvcnJlc3BvbmRzIHRvIGEgTWljcm9zb2Z0IFdHTDQgY2hhcm1hcCwgbWF0Y2hpbmcgVW5pY29kZS4gIFNlZQotICAgKiAgICAgQEZUX0VOQ09ESU5HX1VOSUNPREUuCi0gICAqCi0gICAqICAgVFRfTVNfSURfU0pJUyA6OgotICAgKiAgICAgQ29ycmVzcG9uZHMgdG8gU0pJUyBKYXBhbmVzZSBlbmNvZGluZy4gIFNlZSBARlRfRU5DT0RJTkdfU0pJUy4KLSAgICoKLSAgICogICBUVF9NU19JRF9HQjIzMTIgOjoKLSAgICogICAgIENvcnJlc3BvbmRzIHRvIFNpbXBsaWZpZWQgQ2hpbmVzZSBhcyB1c2VkIGluIE1haW5sYW5kIENoaW5hLiAgU2VlCi0gICAqICAgICBARlRfRU5DT0RJTkdfR0IyMzEyLgotICAgKgotICAgKiAgIFRUX01TX0lEX0JJR181IDo6Ci0gICAqICAgICBDb3JyZXNwb25kcyB0byBUcmFkaXRpb25hbCBDaGluZXNlIGFzIHVzZWQgaW4gVGFpd2FuIGFuZCBIb25nIEtvbmcuCi0gICAqICAgICBTZWUgQEZUX0VOQ09ESU5HX0JJRzUuCi0gICAqCi0gICAqICAgVFRfTVNfSURfV0FOU1VORyA6OgotICAgKiAgICAgQ29ycmVzcG9uZHMgdG8gS29yZWFuIFdhbnN1bmcgZW5jb2RpbmcuICBTZWUgQEZUX0VOQ09ESU5HX1dBTlNVTkcuCi0gICAqCi0gICAqICAgVFRfTVNfSURfSk9IQUIgOjoKLSAgICogICAgIENvcnJlc3BvbmRzIHRvIEpvaGFiIGVuY29kaW5nLiAgU2VlIEBGVF9FTkNPRElOR19KT0hBQi4KLSAgICoKLSAgICogICBUVF9NU19JRF9VQ1NfNCA6OgotICAgKiAgICAgQ29ycmVzcG9uZHMgdG8gVUNTLTQgb3IgVVRGLTMyIGNoYXJtYXBzLiAgVGhpcyBoYXMgYmVlbiBhZGRlZCB0bwotICAgKiAgICAgdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjQgKG1pZC0yMDAxLikKLSAgICovCi0KLSNkZWZpbmUgVFRfTVNfSURfU1lNQk9MX0NTICAgIDAKLSNkZWZpbmUgVFRfTVNfSURfVU5JQ09ERV9DUyAgIDEKLSNkZWZpbmUgVFRfTVNfSURfU0pJUyAgICAgICAgIDIKLSNkZWZpbmUgVFRfTVNfSURfR0IyMzEyICAgICAgIDMKLSNkZWZpbmUgVFRfTVNfSURfQklHXzUgICAgICAgIDQKLSNkZWZpbmUgVFRfTVNfSURfV0FOU1VORyAgICAgIDUKLSNkZWZpbmUgVFRfTVNfSURfSk9IQUIgICAgICAgIDYKLSNkZWZpbmUgVFRfTVNfSURfVUNTXzQgICAgICAgMTAKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZW51bToKLSAgICogICBUVF9BRE9CRV9JRF9YWFgKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbGlzdCBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBgZW5jb2RpbmdfaWQnIGZvcgotICAgKiAgIEBUVF9QTEFURk9STV9BRE9CRSBjaGFybWFwcy4gIFRoaXMgaXMgYSBGcmVlVHlwZS1zcGVjaWZpYyBleHRlbnNpb24hCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgVFRfQURPQkVfSURfU1RBTkRBUkQgOjoKLSAgICogICAgIEFkb2JlIHN0YW5kYXJkIGVuY29kaW5nLgotICAgKiAgIFRUX0FET0JFX0lEX0VYUEVSVCA6OgotICAgKiAgICAgQWRvYmUgZXhwZXJ0IGVuY29kaW5nLgotICAgKiAgIFRUX0FET0JFX0lEX0NVU1RPTSA6OgotICAgKiAgICAgQWRvYmUgY3VzdG9tIGVuY29kaW5nLgotICAgKiAgIFRUX0FET0JFX0lEX0xBVElOXzEgOjoKLSAgICogICAgIEFkb2JlIExhdGlufjEgZW5jb2RpbmcuCi0gICAqLwotCi0jZGVmaW5lIFRUX0FET0JFX0lEX1NUQU5EQVJEICAwCi0jZGVmaW5lIFRUX0FET0JFX0lEX0VYUEVSVCAgICAxCi0jZGVmaW5lIFRUX0FET0JFX0lEX0NVU1RPTSAgICAyCi0jZGVmaW5lIFRUX0FET0JFX0lEX0xBVElOXzEgICAzCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgbGFuZ3VhZ2UgaWRlbnRpZmllciBmaWVsZCBpbiB0aGUgbmFtZSByZWNvcmRzICAqLwotICAvKiBvZiB0aGUgVFRGIGBuYW1lJyB0YWJsZSBpZiB0aGUgYHBsYXRmb3JtJyBpZGVudGlmaWVyIGNvZGUgaXMgICAgICAgICAgKi8KLSAgLyogVFRfUExBVEZPUk1fTUFDSU5UT1NILiAgVGhlc2UgdmFsdWVzIGFyZSBhbHNvIHVzZWQgYXMgcmV0dXJuIHZhbHVlcyAgICovCi0gIC8qIGZvciBmdW5jdGlvbiBARlRfR2V0X0NNYXBfTGFuZ3VhZ2VfSUQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGNhbm9uaWNhbCBzb3VyY2UgZm9yIHRoZSBBcHBsZSBhc3NpZ25lZCBMYW5ndWFnZSBJRCdzIGlzIGF0ICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9mb250cy9UVFJlZk1hbi9STTA2L0NoYXA2bmFtZS5odG1sICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfRU5HTElTSCAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0ZSRU5DSCAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HRVJNQU4gICAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfSVRBTElBTiAgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0RVVENIICAgICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TV0VESVNIICAgICAgICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfU1BBTklTSCAgICAgICAgICAgICAgICAgICAgICAgNgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0RBTklTSCAgICAgICAgICAgICAgICAgICAgICAgIDcKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9QT1JUVUdVRVNFICAgICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfTk9SV0VHSUFOICAgICAgICAgICAgICAgICAgICAgOQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0hFQlJFVyAgICAgICAgICAgICAgICAgICAgICAgMTAKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9KQVBBTkVTRSAgICAgICAgICAgICAgICAgICAgIDExCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfQVJBQklDICAgICAgICAgICAgICAgICAgICAgICAxMgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0ZJTk5JU0ggICAgICAgICAgICAgICAgICAgICAgMTMKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HUkVFSyAgICAgICAgICAgICAgICAgICAgICAgIDE0Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfSUNFTEFORElDICAgICAgICAgICAgICAgICAgICAxNQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX01BTFRFU0UgICAgICAgICAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9UVVJLSVNIICAgICAgICAgICAgICAgICAgICAgIDE3Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfQ1JPQVRJQU4gICAgICAgICAgICAgICAgICAgICAxOAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0NISU5FU0VfVFJBRElUSU9OQUwgICAgICAgICAgMTkKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9VUkRVICAgICAgICAgICAgICAgICAgICAgICAgIDIwCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfSElOREkgICAgICAgICAgICAgICAgICAgICAgICAyMQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RIQUkgICAgICAgICAgICAgICAgICAgICAgICAgMjIKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9LT1JFQU4gICAgICAgICAgICAgICAgICAgICAgIDIzCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfTElUSFVBTklBTiAgICAgICAgICAgICAgICAgICAyNAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1BPTElTSCAgICAgICAgICAgICAgICAgICAgICAgMjUKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9IVU5HQVJJQU4gICAgICAgICAgICAgICAgICAgIDI2Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfRVNUT05JQU4gICAgICAgICAgICAgICAgICAgICAyNwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0xFVFRJU0ggICAgICAgICAgICAgICAgICAgICAgMjgKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TQUFNSVNLICAgICAgICAgICAgICAgICAgICAgIDI5Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfRkFFUk9FU0UgICAgICAgICAgICAgICAgICAgICAzMAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0ZBUlNJICAgICAgICAgICAgICAgICAgICAgICAgMzEKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9SVVNTSUFOICAgICAgICAgICAgICAgICAgICAgIDMyCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfQ0hJTkVTRV9TSU1QTElGSUVEICAgICAgICAgICAzMwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0ZMRU1JU0ggICAgICAgICAgICAgICAgICAgICAgMzQKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9JUklTSCAgICAgICAgICAgICAgICAgICAgICAgIDM1Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfQUxCQU5JQU4gICAgICAgICAgICAgICAgICAgICAzNgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1JPTUFOSUFOICAgICAgICAgICAgICAgICAgICAgMzcKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9DWkVDSCAgICAgICAgICAgICAgICAgICAgICAgIDM4Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfU0xPVkFLICAgICAgICAgICAgICAgICAgICAgICAzOQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NMT1ZFTklBTiAgICAgICAgICAgICAgICAgICAgNDAKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9ZSURESVNIICAgICAgICAgICAgICAgICAgICAgIDQxCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfU0VSQklBTiAgICAgICAgICAgICAgICAgICAgICA0MgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX01BQ0VET05JQU4gICAgICAgICAgICAgICAgICAgNDMKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9CVUxHQVJJQU4gICAgICAgICAgICAgICAgICAgIDQ0Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfVUtSQUlOSUFOICAgICAgICAgICAgICAgICAgICA0NQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0JZRUxPUlVTU0lBTiAgICAgICAgICAgICAgICAgNDYKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9VWkJFSyAgICAgICAgICAgICAgICAgICAgICAgIDQ3Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfS0FaQUtIICAgICAgICAgICAgICAgICAgICAgICA0OAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FaRVJCQUlKQU5JICAgICAgICAgICAgICAgICAgNDkKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9BWkVSQkFJSkFOSV9DWVJJTExJQ19TQ1JJUFQgIDQ5Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfQVpFUkJBSUpBTklfQVJBQklDX1NDUklQVCAgICA1MAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FSTUVOSUFOICAgICAgICAgICAgICAgICAgICAgNTEKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HRU9SR0lBTiAgICAgICAgICAgICAgICAgICAgIDUyCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfTU9MREFWSUFOICAgICAgICAgICAgICAgICAgICA1MwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0tJUkdISVogICAgICAgICAgICAgICAgICAgICAgNTQKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9UQUpJS0kgICAgICAgICAgICAgICAgICAgICAgIDU1Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfVFVSS01FTiAgICAgICAgICAgICAgICAgICAgICA1NgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX01PTkdPTElBTiAgICAgICAgICAgICAgICAgICAgNTcKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NT05HT0xJQU5fTU9OR09MSUFOX1NDUklQVCAgIDU3Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfTU9OR09MSUFOX0NZUklMTElDX1NDUklQVCAgICA1OAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1BBU0hUTyAgICAgICAgICAgICAgICAgICAgICAgNTkKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9LVVJESVNIICAgICAgICAgICAgICAgICAgICAgIDYwCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfS0FTSE1JUkkgICAgICAgICAgICAgICAgICAgICA2MQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NJTkRISSAgICAgICAgICAgICAgICAgICAgICAgNjIKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9USUJFVEFOICAgICAgICAgICAgICAgICAgICAgIDYzCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfTkVQQUxJICAgICAgICAgICAgICAgICAgICAgICA2NAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NBTlNLUklUICAgICAgICAgICAgICAgICAgICAgNjUKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQVJBVEhJICAgICAgICAgICAgICAgICAgICAgIDY2Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfQkVOR0FMSSAgICAgICAgICAgICAgICAgICAgICA2NwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FTU0FNRVNFICAgICAgICAgICAgICAgICAgICAgNjgKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HVUpBUkFUSSAgICAgICAgICAgICAgICAgICAgIDY5Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfUFVOSkFCSSAgICAgICAgICAgICAgICAgICAgICA3MAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX09SSVlBICAgICAgICAgICAgICAgICAgICAgICAgNzEKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQUxBWUFMQU0gICAgICAgICAgICAgICAgICAgIDcyCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfS0FOTkFEQSAgICAgICAgICAgICAgICAgICAgICA3MwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RBTUlMICAgICAgICAgICAgICAgICAgICAgICAgNzQKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9URUxVR1UgICAgICAgICAgICAgICAgICAgICAgIDc1Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfU0lOSEFMRVNFICAgICAgICAgICAgICAgICAgICA3NgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0JVUk1FU0UgICAgICAgICAgICAgICAgICAgICAgNzcKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9LSE1FUiAgICAgICAgICAgICAgICAgICAgICAgIDc4Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfTEFPICAgICAgICAgICAgICAgICAgICAgICAgICA3OQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1ZJRVROQU1FU0UgICAgICAgICAgICAgICAgICAgODAKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9JTkRPTkVTSUFOICAgICAgICAgICAgICAgICAgIDgxCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfVEFHQUxPRyAgICAgICAgICAgICAgICAgICAgICA4MgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX01BTEFZX1JPTUFOX1NDUklQVCAgICAgICAgICAgODMKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQUxBWV9BUkFCSUNfU0NSSVBUICAgICAgICAgIDg0Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfQU1IQVJJQyAgICAgICAgICAgICAgICAgICAgICA4NQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RJR1JJTllBICAgICAgICAgICAgICAgICAgICAgODYKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HQUxMQSAgICAgICAgICAgICAgICAgICAgICAgIDg3Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfU09NQUxJICAgICAgICAgICAgICAgICAgICAgICA4OAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NXQUhJTEkgICAgICAgICAgICAgICAgICAgICAgODkKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9SVUFOREEgICAgICAgICAgICAgICAgICAgICAgIDkwCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfUlVOREkgICAgICAgICAgICAgICAgICAgICAgICA5MQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0NIRVdBICAgICAgICAgICAgICAgICAgICAgICAgOTIKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQUxBR0FTWSAgICAgICAgICAgICAgICAgICAgIDkzCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfRVNQRVJBTlRPICAgICAgICAgICAgICAgICAgICA5NAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1dFTFNIICAgICAgICAgICAgICAgICAgICAgICAxMjgKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9CQVNRVUUgICAgICAgICAgICAgICAgICAgICAgMTI5Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfQ0FUQUxBTiAgICAgICAgICAgICAgICAgICAgIDEzMAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0xBVElOICAgICAgICAgICAgICAgICAgICAgICAxMzEKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9RVUVDSFVBICAgICAgICAgICAgICAgICAgICAgMTMyCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfR1VBUkFOSSAgICAgICAgICAgICAgICAgICAgIDEzMwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FZTUFSQSAgICAgICAgICAgICAgICAgICAgICAxMzQKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9UQVRBUiAgICAgICAgICAgICAgICAgICAgICAgMTM1Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfVUlHSFVSICAgICAgICAgICAgICAgICAgICAgIDEzNgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0RaT05HS0hBICAgICAgICAgICAgICAgICAgICAxMzcKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9KQVZBTkVTRSAgICAgICAgICAgICAgICAgICAgMTM4Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfU1VOREFORVNFICAgICAgICAgICAgICAgICAgIDEzOQotCi0KLSNpZiAwICAvKiB0aGVzZSBzZWVtIHRvIGJlIGVycm9ycyB0aGF0IGhhdmUgYmVlbiBkcm9wcGVkICovCi0KLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TQ09UVElTSF9HQUVMSUMgICAgICAgICAgICAgMTQwCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfSVJJU0hfR0FFTElDICAgICAgICAgICAgICAgIDE0MQotCi0jZW5kaWYKLQotCi0gIC8qIFRoZSBmb2xsb3dpbmcgY29kZXMgYXJlIG5ldyBhcyBvZiAyMDAwLTAzLTEwICovCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfR0FMSUNJQU4gICAgICAgICAgICAgICAgICAgIDE0MAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FGUklLQUFOUyAgICAgICAgICAgICAgICAgICAxNDEKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9CUkVUT04gICAgICAgICAgICAgICAgICAgICAgMTQyCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfSU5VS1RJVFVUICAgICAgICAgICAgICAgICAgIDE0MwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NDT1RUSVNIX0dBRUxJQyAgICAgICAgICAgICAxNDQKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQU5YX0dBRUxJQyAgICAgICAgICAgICAgICAgMTQ1Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfSVJJU0hfR0FFTElDICAgICAgICAgICAgICAgIDE0NgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RPTkdBTiAgICAgICAgICAgICAgICAgICAgICAxNDcKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HUkVFS19QT0xZVE9OSUMgICAgICAgICAgICAgMTQ4Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfR1JFRUxBTkRJQyAgICAgICAgICAgICAgICAgIDE0OQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FaRVJCQUlKQU5JX1JPTUFOX1NDUklQVCAgICAxNTAKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBsYW5ndWFnZSBpZGVudGlmaWVyIGZpZWxkIGluIHRoZSBuYW1lIHJlY29yZHMgICovCi0gIC8qIG9mIHRoZSBUVEYgYG5hbWUnIHRhYmxlIGlmIHRoZSBgcGxhdGZvcm0nIGlkZW50aWZpZXIgY29kZSBpcyAgICAgICAgICAqLwotICAvKiBUVF9QTEFURk9STV9NSUNST1NPRlQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBjYW5vbmljYWwgc291cmNlIGZvciB0aGUgTVMgYXNzaWduZWQgTENJRHMgaXMgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vZ2xvYmFsZGV2L3JlZmVyZW5jZS9sY2lkLWFsbC5tc3B4ICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfR0VORVJBTCAgICAgICAgICAgICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfU0FVRElfQVJBQklBICAgICAgICAgICAgICAgMHgwNDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfSVJBUSAgICAgICAgICAgICAgICAgICAgICAgMHgwODAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfRUdZUFQgICAgICAgICAgICAgICAgICAgICAgMHgwYzAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfTElCWUEgICAgICAgICAgICAgICAgICAgICAgMHgxMDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfQUxHRVJJQSAgICAgICAgICAgICAgICAgICAgMHgxNDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfTU9ST0NDTyAgICAgICAgICAgICAgICAgICAgMHgxODAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfVFVOSVNJQSAgICAgICAgICAgICAgICAgICAgMHgxYzAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfT01BTiAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfWUVNRU4gICAgICAgICAgICAgICAgICAgICAgMHgyNDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfU1lSSUEgICAgICAgICAgICAgICAgICAgICAgMHgyODAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfSk9SREFOICAgICAgICAgICAgICAgICAgICAgMHgyYzAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfTEVCQU5PTiAgICAgICAgICAgICAgICAgICAgMHgzMDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfS1VXQUlUICAgICAgICAgICAgICAgICAgICAgMHgzNDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfVUFFICAgICAgICAgICAgICAgICAgICAgICAgMHgzODAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfQkFIUkFJTiAgICAgICAgICAgICAgICAgICAgMHgzYzAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfUUFUQVIgICAgICAgICAgICAgICAgICAgICAgMHg0MDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9CVUxHQVJJQU5fQlVMR0FSSUEgICAgICAgICAgICAgICAgMHgwNDAyCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9DQVRBTEFOX1NQQUlOICAgICAgICAgICAgICAgICAgICAgMHgwNDAzCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9DSElORVNFX0dFTkVSQUwgICAgICAgICAgICAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9DSElORVNFX1RBSVdBTiAgICAgICAgICAgICAgICAgICAgMHgwNDA0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9DSElORVNFX1BSQyAgICAgICAgICAgICAgICAgICAgICAgMHgwODA0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9DSElORVNFX0hPTkdfS09ORyAgICAgICAgICAgICAgICAgMHgwYzA0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9DSElORVNFX1NJTkdBUE9SRSAgICAgICAgICAgICAgICAgMHgxMDA0Ci0KLSNpZiAxICAvKiB0aGlzIGxvb2tzIGxpa2UgdGhlIGNvcnJlY3QgdmFsdWUgKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0NISU5FU0VfTUFDQVUgICAgICAgICAgICAgICAgICAgICAweDE0MDQKLSNlbHNlICAvKiBidXQgYmV3YXJlLCBNaWNyb3NvZnQgbWF5IGNoYW5nZSBpdHMgbWluZC4uLgotICAgICAgICAgIHRoZSBtb3N0IHJlY2VudCBXb3JkIHJlZmVyZW5jZSBoYXMgdGhlIGZvbGxvd2luZzogKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0NISU5FU0VfTUFDQVUgIFRUX01TX0xBTkdJRF9DSElORVNFX0hPTkdfS09ORwotI2VuZGlmCi0KLSNpZiAwICAvKiB1c2VkIG9ubHkgd2l0aCAuTkVUIGBjdWx0dXJlcyc7IGNvbW1lbnRlZCBvdXQgKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0NISU5FU0VfVFJBRElUSU9OQUwgICAgICAgICAgICAgICAweDdDMDQKLSNlbmRpZgotCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9DWkVDSF9DWkVDSF9SRVBVQkxJQyAgICAgICAgICAgICAgMHgwNDA1Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9EQU5JU0hfREVOTUFSSyAgICAgICAgICAgICAgICAgICAgMHgwNDA2Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9HRVJNQU5fR0VSTUFOWSAgICAgICAgICAgICAgICAgICAgMHgwNDA3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9HRVJNQU5fU1dJVFpFUkxBTkQgICAgICAgICAgICAgICAgMHgwODA3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9HRVJNQU5fQVVTVFJJQSAgICAgICAgICAgICAgICAgICAgMHgwYzA3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9HRVJNQU5fTFVYRU1CT1VSRyAgICAgICAgICAgICAgICAgMHgxMDA3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9HRVJNQU5fTElFQ0hURU5TVEVJICAgICAgICAgICAgICAgMHgxNDA3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9HUkVFS19HUkVFQ0UgICAgICAgICAgICAgICAgICAgICAgMHgwNDA4Ci0KLSAgLyogZG9uJ3QgYXNrIHdoYXQgdGhpcyBvbmUgbWVhbnMuLi4gSXQgaXMgY29tbWVudGVkIG91dCBjdXJyZW50bHkuICovCi0jaWYgMAotI2RlZmluZSBUVF9NU19MQU5HSURfR1JFRUtfR1JFRUNFMiAgICAgICAgICAgICAgICAgICAgIDB4MjAwOAotI2VuZGlmCi0KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfR0VORVJBTCAgICAgICAgICAgICAgICAgICAweDAwMDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfVU5JVEVEX1NUQVRFUyAgICAgICAgICAgICAweDA0MDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfVU5JVEVEX0tJTkdET00gICAgICAgICAgICAweDA4MDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfQVVTVFJBTElBICAgICAgICAgICAgICAgICAweDBjMDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfQ0FOQURBICAgICAgICAgICAgICAgICAgICAweDEwMDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfTkVXX1pFQUxBTkQgICAgICAgICAgICAgICAweDE0MDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfSVJFTEFORCAgICAgICAgICAgICAgICAgICAweDE4MDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfU09VVEhfQUZSSUNBICAgICAgICAgICAgICAweDFjMDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfSkFNQUlDQSAgICAgICAgICAgICAgICAgICAweDIwMDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfQ0FSSUJCRUFOICAgICAgICAgICAgICAgICAweDI0MDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfQkVMSVpFICAgICAgICAgICAgICAgICAgICAweDI4MDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfVFJJTklEQUQgICAgICAgICAgICAgICAgICAweDJjMDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfWklNQkFCV0UgICAgICAgICAgICAgICAgICAweDMwMDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfUEhJTElQUElORVMgICAgICAgICAgICAgICAweDM0MDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfSU5ET05FU0lBICAgICAgICAgICAgICAgICAweDM4MDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfSE9OR19LT05HICAgICAgICAgICAgICAgICAweDNjMDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfSU5ESUEgICAgICAgICAgICAgICAgICAgICAweDQwMDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfTUFMQVlTSUEgICAgICAgICAgICAgICAgICAweDQ0MDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfU0lOR0FQT1JFICAgICAgICAgICAgICAgICAweDQ4MDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfU1BBSU5fVFJBRElUSU9OQUxfU09SVCAgICAweDA0MGEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfTUVYSUNPICAgICAgICAgICAgICAgICAgICAweDA4MGEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfU1BBSU5fSU5URVJOQVRJT05BTF9TT1JUICAweDBjMGEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfR1VBVEVNQUxBICAgICAgICAgICAgICAgICAweDEwMGEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfQ09TVEFfUklDQSAgICAgICAgICAgICAgICAweDE0MGEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfUEFOQU1BICAgICAgICAgICAgICAgICAgICAweDE4MGEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfRE9NSU5JQ0FOX1JFUFVCTElDICAgICAgICAweDFjMGEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfVkVORVpVRUxBICAgICAgICAgICAgICAgICAweDIwMGEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfQ09MT01CSUEgICAgICAgICAgICAgICAgICAweDI0MGEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfUEVSVSAgICAgICAgICAgICAgICAgICAgICAweDI4MGEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfQVJHRU5USU5BICAgICAgICAgICAgICAgICAweDJjMGEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfRUNVQURPUiAgICAgICAgICAgICAgICAgICAweDMwMGEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfQ0hJTEUgICAgICAgICAgICAgICAgICAgICAweDM0MGEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfVVJVR1VBWSAgICAgICAgICAgICAgICAgICAweDM4MGEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfUEFSQUdVQVkgICAgICAgICAgICAgICAgICAweDNjMGEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfQk9MSVZJQSAgICAgICAgICAgICAgICAgICAweDQwMGEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfRUxfU0FMVkFET1IgICAgICAgICAgICAgICAweDQ0MGEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfSE9ORFVSQVMgICAgICAgICAgICAgICAgICAweDQ4MGEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfTklDQVJBR1VBICAgICAgICAgICAgICAgICAweDRjMGEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfUFVFUlRPX1JJQ08gICAgICAgICAgICAgICAweDUwMGEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfVU5JVEVEX1NUQVRFUyAgICAgICAgICAgICAweDU0MGEKLSAgLyogVGhlIGZvbGxvd2luZyBJRCBibGF0YW50bHkgdmlvbGF0ZSBNUyBzcGVjcyBieSB1c2luZyBhICovCi0gIC8qIHN1Ymxhbmd1YWdlID4gMHgxRi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9MQVRJTl9BTUVSSUNBICAgICAgICAgICAgIDB4RTQwYVUKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZJTk5JU0hfRklOTEFORCAgICAgICAgICAgICAgICAgICAweDA0MGIKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9GUkFOQ0UgICAgICAgICAgICAgICAgICAgICAweDA0MGMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9CRUxHSVVNICAgICAgICAgICAgICAgICAgICAweDA4MGMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9DQU5BREEgICAgICAgICAgICAgICAgICAgICAweDBjMGMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9TV0lUWkVSTEFORCAgICAgICAgICAgICAgICAweDEwMGMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9MVVhFTUJPVVJHICAgICAgICAgICAgICAgICAweDE0MGMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9NT05BQ08gICAgICAgICAgICAgICAgICAgICAweDE4MGMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9XRVNUX0lORElFUyAgICAgICAgICAgICAgICAweDFjMGMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9SRVVOSU9OICAgICAgICAgICAgICAgICAgICAweDIwMGMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9DT05HTyAgICAgICAgICAgICAgICAgICAgICAweDI0MGMKLSAgLyogd2hpY2ggd2FzIGZvcm1lcmx5OiAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfRlJFTkNIX1pBSVJFICBUVF9NU19MQU5HSURfRlJFTkNIX0NPTkdPCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfU0VORUdBTCAgICAgICAgICAgICAgICAgICAgMHgyODBjCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfQ0FNRVJPT04gICAgICAgICAgICAgICAgICAgMHgyYzBjCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfQ09URV9EX0lWT0lSRSAgICAgICAgICAgICAgMHgzMDBjCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfTUFMSSAgICAgICAgICAgICAgICAgICAgICAgMHgzNDBjCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfTU9ST0NDTyAgICAgICAgICAgICAgICAgICAgMHgzODBjCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfSEFJVEkgICAgICAgICAgICAgICAgICAgICAgMHgzYzBjCi0gIC8qIGFuZCBhbm90aGVyIHZpb2xhdGlvbiBvZiB0aGUgc3BlYyAoc2VlIDB4RTQwYVUpICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfTk9SVEhfQUZSSUNBICAgICAgICAgICAgICAgMHhFNDBjVQotI2RlZmluZSBUVF9NU19MQU5HSURfSEVCUkVXX0lTUkFFTCAgICAgICAgICAgICAgICAgICAgIDB4MDQwZAotI2RlZmluZSBUVF9NU19MQU5HSURfSFVOR0FSSUFOX0hVTkdBUlkgICAgICAgICAgICAgICAgIDB4MDQwZQotI2RlZmluZSBUVF9NU19MQU5HSURfSUNFTEFORElDX0lDRUxBTkQgICAgICAgICAgICAgICAgIDB4MDQwZgotI2RlZmluZSBUVF9NU19MQU5HSURfSVRBTElBTl9JVEFMWSAgICAgICAgICAgICAgICAgICAgIDB4MDQxMAotI2RlZmluZSBUVF9NU19MQU5HSURfSVRBTElBTl9TV0lUWkVSTEFORCAgICAgICAgICAgICAgIDB4MDgxMAotI2RlZmluZSBUVF9NU19MQU5HSURfSkFQQU5FU0VfSkFQQU4gICAgICAgICAgICAgICAgICAgIDB4MDQxMQotI2RlZmluZSBUVF9NU19MQU5HSURfS09SRUFOX0VYVEVOREVEX1dBTlNVTkdfS09SRUEgICAgIDB4MDQxMgotI2RlZmluZSBUVF9NU19MQU5HSURfS09SRUFOX0pPSEFCX0tPUkVBICAgICAgICAgICAgICAgIDB4MDgxMgotI2RlZmluZSBUVF9NU19MQU5HSURfRFVUQ0hfTkVUSEVSTEFORFMgICAgICAgICAgICAgICAgIDB4MDQxMwotI2RlZmluZSBUVF9NU19MQU5HSURfRFVUQ0hfQkVMR0lVTSAgICAgICAgICAgICAgICAgICAgIDB4MDgxMwotI2RlZmluZSBUVF9NU19MQU5HSURfTk9SV0VHSUFOX05PUldBWV9CT0tNQUwgICAgICAgICAgIDB4MDQxNAotI2RlZmluZSBUVF9NU19MQU5HSURfTk9SV0VHSUFOX05PUldBWV9OWU5PUlNLICAgICAgICAgIDB4MDgxNAotI2RlZmluZSBUVF9NU19MQU5HSURfUE9MSVNIX1BPTEFORCAgICAgICAgICAgICAgICAgICAgIDB4MDQxNQotI2RlZmluZSBUVF9NU19MQU5HSURfUE9SVFVHVUVTRV9CUkFaSUwgICAgICAgICAgICAgICAgIDB4MDQxNgotI2RlZmluZSBUVF9NU19MQU5HSURfUE9SVFVHVUVTRV9QT1JUVUdBTCAgICAgICAgICAgICAgIDB4MDgxNgotI2RlZmluZSBUVF9NU19MQU5HSURfUkhBRVRPX1JPTUFOSUNfU1dJVFpFUkxBTkQgICAgICAgIDB4MDQxNwotI2RlZmluZSBUVF9NU19MQU5HSURfUk9NQU5JQU5fUk9NQU5JQSAgICAgICAgICAgICAgICAgIDB4MDQxOAotI2RlZmluZSBUVF9NU19MQU5HSURfTU9MREFWSUFOX01PTERBVklBICAgICAgICAgICAgICAgIDB4MDgxOAotI2RlZmluZSBUVF9NU19MQU5HSURfUlVTU0lBTl9SVVNTSUEgICAgICAgICAgICAgICAgICAgIDB4MDQxOQotI2RlZmluZSBUVF9NU19MQU5HSURfUlVTU0lBTl9NT0xEQVZJQSAgICAgICAgICAgICAgICAgIDB4MDgxOQotI2RlZmluZSBUVF9NU19MQU5HSURfQ1JPQVRJQU5fQ1JPQVRJQSAgICAgICAgICAgICAgICAgIDB4MDQxYQotI2RlZmluZSBUVF9NU19MQU5HSURfU0VSQklBTl9TRVJCSUFfTEFUSU4gICAgICAgICAgICAgIDB4MDgxYQotI2RlZmluZSBUVF9NU19MQU5HSURfU0VSQklBTl9TRVJCSUFfQ1lSSUxMSUMgICAgICAgICAgIDB4MGMxYQotCi0jaWYgMCAgLyogdGhpcyB1c2VkIHRvIGJlIHRoaXMgdmFsdWUsIGJ1dCBpdCBsb29rcyBsaWtlIHdlIHdlcmUgd3JvbmcgKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0JPU05JQU5fQk9TTklBX0hFUlpFR09WSU5BICAgICAgICAweDEwMWEKLSNlbHNlICAvKiBjdXJyZW50IHNvdXJjZXMgc2F5ICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9DUk9BVElBTl9CT1NOSUFfSEVSWkVHT1ZJTkEgICAgICAgMHgxMDFhCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9CT1NOSUFOX0JPU05JQV9IRVJaRUdPVklOQSAgICAgICAgMHgxNDFhCi0gICAgICAgLyogYW5kIFhQc3AyIFBsYXRmb3JtIFNESyBhZGRlZCAoMjAwNC0wNy0yNikgKi8KLSAgICAgICAvKiBOYW1lcyBhcmUgc2hvcnRlbmVkIHRvIGJlIHNpZ25pZmljYW50IHdpdGhpbiA0MCBjaGFycy4gKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NFUkJJQU5fQk9TTklBX0hFUlpfTEFUSU4gICAgICAgICAweDE4MWEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NFUkJJQU5fQk9TTklBX0hFUlpfQ1lSSUxMSUMgICAgICAweDE4MWEKLSNlbmRpZgotCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TTE9WQUtfU0xPVkFLSUEgICAgICAgICAgICAgICAgICAgMHgwNDFiCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BTEJBTklBTl9BTEJBTklBICAgICAgICAgICAgICAgICAgMHgwNDFjCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TV0VESVNIX1NXRURFTiAgICAgICAgICAgICAgICAgICAgMHgwNDFkCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TV0VESVNIX0ZJTkxBTkQgICAgICAgICAgICAgICAgICAgMHgwODFkCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9USEFJX1RIQUlMQU5EICAgICAgICAgICAgICAgICAgICAgMHgwNDFlCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9UVVJLSVNIX1RVUktFWSAgICAgICAgICAgICAgICAgICAgMHgwNDFmCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9VUkRVX1BBS0lTVEFOICAgICAgICAgICAgICAgICAgICAgMHgwNDIwCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9VUkRVX0lORElBICAgICAgICAgICAgICAgICAgICAgICAgMHgwODIwCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9JTkRPTkVTSUFOX0lORE9ORVNJQSAgICAgICAgICAgICAgMHgwNDIxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9VS1JBSU5JQU5fVUtSQUlORSAgICAgICAgICAgICAgICAgMHgwNDIyCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9CRUxBUlVTSUFOX0JFTEFSVVMgICAgICAgICAgICAgICAgMHgwNDIzCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TTE9WRU5FX1NMT1ZFTklBICAgICAgICAgICAgICAgICAgMHgwNDI0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9FU1RPTklBTl9FU1RPTklBICAgICAgICAgICAgICAgICAgMHgwNDI1Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9MQVRWSUFOX0xBVFZJQSAgICAgICAgICAgICAgICAgICAgMHgwNDI2Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9MSVRIVUFOSUFOX0xJVEhVQU5JQSAgICAgICAgICAgICAgMHgwNDI3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9DTEFTU0lDX0xJVEhVQU5JQU5fTElUSFVBTklBICAgICAgMHgwODI3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9UQUpJS19UQUpJS0lTVEFOICAgICAgICAgICAgICAgICAgMHgwNDI4Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9GQVJTSV9JUkFOICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDI5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9WSUVUTkFNRVNFX1ZJRVRfTkFNICAgICAgICAgICAgICAgMHgwNDJhCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUk1FTklBTl9BUk1FTklBICAgICAgICAgICAgICAgICAgMHgwNDJiCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BWkVSSV9BWkVSQkFJSkFOX0xBVElOICAgICAgICAgICAgMHgwNDJjCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BWkVSSV9BWkVSQkFJSkFOX0NZUklMTElDICAgICAgICAgMHgwODJjCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9CQVNRVUVfU1BBSU4gICAgICAgICAgICAgICAgICAgICAgMHgwNDJkCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TT1JCSUFOX0dFUk1BTlkgICAgICAgICAgICAgICAgICAgMHgwNDJlCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9NQUNFRE9OSUFOX01BQ0VET05JQSAgICAgICAgICAgICAgMHgwNDJmCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TVVRVX1NPVVRIX0FGUklDQSAgICAgICAgICAgICAgICAgMHgwNDMwCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9UU09OR0FfU09VVEhfQUZSSUNBICAgICAgICAgICAgICAgMHgwNDMxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9UU1dBTkFfU09VVEhfQUZSSUNBICAgICAgICAgICAgICAgMHgwNDMyCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9WRU5EQV9TT1VUSF9BRlJJQ0EgICAgICAgICAgICAgICAgMHgwNDMzCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9YSE9TQV9TT1VUSF9BRlJJQ0EgICAgICAgICAgICAgICAgMHgwNDM0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9aVUxVX1NPVVRIX0FGUklDQSAgICAgICAgICAgICAgICAgMHgwNDM1Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9BRlJJS0FBTlNfU09VVEhfQUZSSUNBICAgICAgICAgICAgMHgwNDM2Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9HRU9SR0lBTl9HRU9SR0lBICAgICAgICAgICAgICAgICAgMHgwNDM3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9GQUVST0VTRV9GQUVST0VfSVNMQU5EUyAgICAgICAgICAgMHgwNDM4Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9ISU5ESV9JTkRJQSAgICAgICAgICAgICAgICAgICAgICAgMHgwNDM5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9NQUxURVNFX01BTFRBICAgICAgICAgICAgICAgICAgICAgMHgwNDNhCi0gIC8qIEFkZGVkIGJ5IFhQc3AyIFBsYXRmb3JtIFNESyAoMjAwNC0wNy0yNikgKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfTk9SVEhFUk5fTk9SV0FZICAgICAgICAgICAgICAweDA0M2IKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfTk9SVEhFUk5fU1dFREVOICAgICAgICAgICAgICAweDA4M2IKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfTk9SVEhFUk5fRklOTEFORCAgICAgICAgICAgICAweDBDM2IKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfTFVMRV9OT1JXQVkgICAgICAgICAgICAgICAgICAweDEwM2IKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfTFVMRV9TV0VERU4gICAgICAgICAgICAgICAgICAweDE0M2IKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfU09VVEhFUk5fTk9SV0FZICAgICAgICAgICAgICAweDE4M2IKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfU09VVEhFUk5fU1dFREVOICAgICAgICAgICAgICAweDFDM2IKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfU0tPTFRfRklOTEFORCAgICAgICAgICAgICAgICAweDIwM2IKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfSU5BUklfRklOTEFORCAgICAgICAgICAgICAgICAweDI0M2IKLSAgLyogLi4uIGFuZCB3ZSBhbHNvIGtlZXAgb3VyIG9sZCBpZGVudGlmaWVyLi4uICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TQUFNSV9MQVBPTklBICAgICAgICAgICAgICAgICAgICAgMHgwNDNiCi0KLSNpZiAwIC8qIHRoaXMgc2VlbXMgdG8gYmUgYSBwcmV2aW91cyBpbnZlcnNpb24gKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0lSSVNIX0dBRUxJQ19JUkVMQU5EICAgICAgICAgICAgICAweDA0M2MKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NDT1RUSVNIX0dBRUxJQ19VTklURURfS0lOR0RPTSAgICAweDA4M2MKLSNlbHNlCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TQ09UVElTSF9HQUVMSUNfVU5JVEVEX0tJTkdET00gICAgMHgwODNjCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9JUklTSF9HQUVMSUNfSVJFTEFORCAgICAgICAgICAgICAgMHgwNDNjCi0jZW5kaWYKLQotI2RlZmluZSBUVF9NU19MQU5HSURfWUlERElTSF9HRVJNQU5ZICAgICAgICAgICAgICAgICAgIDB4MDQzZAotI2RlZmluZSBUVF9NU19MQU5HSURfTUFMQVlfTUFMQVlTSUEgICAgICAgICAgICAgICAgICAgIDB4MDQzZQotI2RlZmluZSBUVF9NU19MQU5HSURfTUFMQVlfQlJVTkVJX0RBUlVTU0FMQU0gICAgICAgICAgIDB4MDgzZQotI2RlZmluZSBUVF9NU19MQU5HSURfS0FaQUtfS0FaQUtTVEFOICAgICAgICAgICAgICAgICAgIDB4MDQzZgotI2RlZmluZSBUVF9NU19MQU5HSURfS0lSR0hJWl9LSVJHSElaU1RBTiAvKiBDeXJpbGxpYyovIDB4MDQ0MAotICAvKiBhbGlhcyBkZWNsYXJlZCBpbiBXaW5kb3dzIDIwMDAgKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0tJUkdISVpfS0lSR0hJWl9SRVBVQkxJQyBcCi0gICAgICAgICAgVFRfTVNfTEFOR0lEX0tJUkdISVpfS0lSR0hJWlNUQU4KLQotI2RlZmluZSBUVF9NU19MQU5HSURfU1dBSElMSV9LRU5ZQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ0MQotI2RlZmluZSBUVF9NU19MQU5HSURfVFVSS01FTl9UVVJLTUVOSVNUQU4gICAgICAgICAgICAgIDB4MDQ0MgotI2RlZmluZSBUVF9NU19MQU5HSURfVVpCRUtfVVpCRUtJU1RBTl9MQVRJTiAgICAgICAgICAgIDB4MDQ0MwotI2RlZmluZSBUVF9NU19MQU5HSURfVVpCRUtfVVpCRUtJU1RBTl9DWVJJTExJQyAgICAgICAgIDB4MDg0MwotI2RlZmluZSBUVF9NU19MQU5HSURfVEFUQVJfVEFUQVJTVEFOICAgICAgICAgICAgICAgICAgIDB4MDQ0NAotI2RlZmluZSBUVF9NU19MQU5HSURfQkVOR0FMSV9JTkRJQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ0NQotI2RlZmluZSBUVF9NU19MQU5HSURfQkVOR0FMSV9CQU5HTEFERVNIICAgICAgICAgICAgICAgIDB4MDg0NQotI2RlZmluZSBUVF9NU19MQU5HSURfUFVOSkFCSV9JTkRJQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ0NgotI2RlZmluZSBUVF9NU19MQU5HSURfUFVOSkFCSV9BUkFCSUNfUEFLSVNUQU4gICAgICAgICAgIDB4MDg0NgotI2RlZmluZSBUVF9NU19MQU5HSURfR1VKQVJBVElfSU5ESUEgICAgICAgICAgICAgICAgICAgIDB4MDQ0NwotI2RlZmluZSBUVF9NU19MQU5HSURfT1JJWUFfSU5ESUEgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ0OAotI2RlZmluZSBUVF9NU19MQU5HSURfVEFNSUxfSU5ESUEgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ0OQotI2RlZmluZSBUVF9NU19MQU5HSURfVEVMVUdVX0lORElBICAgICAgICAgICAgICAgICAgICAgIDB4MDQ0YQotI2RlZmluZSBUVF9NU19MQU5HSURfS0FOTkFEQV9JTkRJQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ0YgotI2RlZmluZSBUVF9NU19MQU5HSURfTUFMQVlBTEFNX0lORElBICAgICAgICAgICAgICAgICAgIDB4MDQ0YwotI2RlZmluZSBUVF9NU19MQU5HSURfQVNTQU1FU0VfSU5ESUEgICAgICAgICAgICAgICAgICAgIDB4MDQ0ZAotI2RlZmluZSBUVF9NU19MQU5HSURfTUFSQVRISV9JTkRJQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ0ZQotI2RlZmluZSBUVF9NU19MQU5HSURfU0FOU0tSSVRfSU5ESUEgICAgICAgICAgICAgICAgICAgIDB4MDQ0ZgotI2RlZmluZSBUVF9NU19MQU5HSURfTU9OR09MSUFOX01PTkdPTElBIC8qIEN5cmlsbGljICovIDB4MDQ1MAotI2RlZmluZSBUVF9NU19MQU5HSURfTU9OR09MSUFOX01PTkdPTElBX01PTkdPTElBTiAgICAgIDB4MDg1MAotI2RlZmluZSBUVF9NU19MQU5HSURfVElCRVRBTl9DSElOQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ1MQotICAvKiBEb24ndCB1c2UgdGhlIG5leHQgY29uc3RhbnQhICBJdCBoYXMgICAgICAgICAgICAqLwotICAvKiAgICgxKSB0aGUgd3Jvbmcgc3BlbGxpbmcgKER6b25naGthKSAgICAgICAgICAgICAqLwotICAvKiAgICgyKSBNaWNyb3NvZnQgZG9lc24ndCBvZmZpY2lhbGx5IGRlZmluZSBpdCAtLSAqLwotICAvKiAgICAgICBhdCBsZWFzdCBpdCBpcyBub3QgaW4gdGhlIExpc3Qgb2YgTG9jYWwgICAqLwotICAvKiAgICAgICBJRCBWYWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICgzKSBEem9uZ2toYSBpcyBub3QgdGhlIHNhbWUgbGFuZ3VhZ2UgYXMgICAgICAqLwotICAvKiAgICAgICBUaWJldGFuLCBzbyBtZXJnaW5nIGl0IGlzIHdyb25nIGFueXdheS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUVF9NU19MQU5HSURfVElCRVRBTl9CSFVUQU4gaXMgY29ycmVjdCwgQlRXLiAgICAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfRFpPTkdIS0FfQkhVVEFOICAgICAgICAgICAgICAgICAgIDB4MDg1MQotCi0jaWYgMAotICAvKiB0aGUgZm9sbG93aW5nIHVzZWQgdG8gYmUgZGVmaW5lZCAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfVElCRVRBTl9CSFVUQU4gICAgICAgICAgICAgICAgICAgIDB4MDQ1MQotICAvKiAuLi4gYnV0IGl0IHdhcyBjaGFuZ2VkOyAqLwotI2Vsc2UKLSAgLyogU28gd2Ugd2lsbCBjb250aW51ZSB0byAjZGVmaW5lIGl0LCBidXQgd2l0aCB0aGUgY29ycmVjdCB2YWx1ZSAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfVElCRVRBTl9CSFVUQU4gICBUVF9NU19MQU5HSURfRFpPTkdIS0FfQkhVVEFOCi0jZW5kaWYKLQotI2RlZmluZSBUVF9NU19MQU5HSURfV0VMU0hfV0FMRVMgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ1MgotI2RlZmluZSBUVF9NU19MQU5HSURfS0hNRVJfQ0FNQk9ESUEgICAgICAgICAgICAgICAgICAgIDB4MDQ1MwotI2RlZmluZSBUVF9NU19MQU5HSURfTEFPX0xBT1MgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ1NAotI2RlZmluZSBUVF9NU19MQU5HSURfQlVSTUVTRV9NWUFOTUFSICAgICAgICAgICAgICAgICAgIDB4MDQ1NQotI2RlZmluZSBUVF9NU19MQU5HSURfR0FMSUNJQU5fU1BBSU4gICAgICAgICAgICAgICAgICAgIDB4MDQ1NgotI2RlZmluZSBUVF9NU19MQU5HSURfS09OS0FOSV9JTkRJQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ1NwotI2RlZmluZSBUVF9NU19MQU5HSURfTUFOSVBVUklfSU5ESUEgIC8qIEJlbmdhbGkgKi8gICAgIDB4MDQ1OAotI2RlZmluZSBUVF9NU19MQU5HSURfU0lOREhJX0lORElBIC8qIEFyYWJpYyAqLyAgICAgICAgIDB4MDQ1OQotI2RlZmluZSBUVF9NU19MQU5HSURfU0lOREhJX1BBS0lTVEFOICAgICAgICAgICAgICAgICAgIDB4MDg1OQotICAvKiBNaXNzaW5nIGEgTENJRCBmb3IgU2luZGhpIGluIERldmFuYWdhcmkgc2NyaXB0ICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TWVJJQUNfU1lSSUEgICAgICAgICAgICAgICAgICAgICAgMHgwNDVhCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TSU5IQUxFU0VfU1JJX0xBTktBICAgICAgICAgICAgICAgMHgwNDViCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9DSEVST0tFRV9VTklURURfU1RBVEVTICAgICAgICAgICAgMHgwNDVjCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9JTlVLVElUVVRfQ0FOQURBICAgICAgICAgICAgICAgICAgMHgwNDVkCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BTUhBUklDX0VUSElPUElBICAgICAgICAgICAgICAgICAgMHgwNDVlCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9UQU1BWklHSFRfTU9ST0NDTyAvKiBBcmFiaWMgKi8gICAgMHgwNDVmCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9UQU1BWklHSFRfTU9ST0NDT19MQVRJTiAgICAgICAgICAgMHgwODVmCi0gIC8qIE1pc3NpbmcgYSBMQ0lEIGZvciBUaWZpbmFnaCBzY3JpcHQgKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0tBU0hNSVJJX1BBS0lTVEFOIC8qIEFyYWJpYyAqLyAgICAweDA0NjAKLSAgLyogU3BlbGxlZCB0aGlzIHdheSBieSBYUHNwMiBQbGF0Zm9ybSBTREsgKDIwMDQtMDctMjYpICovCi0gIC8qIHNjcmlwdCBpcyB5ZXQgdW5jbGVhci4uLiBtaWdodCBiZSBBcmFiaWMsIE5hZ2FyaSBvciBTaGFyYWRhICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9LQVNITUlSSV9TQVNJQSAgICAgICAgICAgICAgICAgICAgMHgwODYwCi0gIC8qIC4uLiBhbmQgYWxpYXNlZCAoYnkgTVMpIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9LQVNITUlSSV9JTkRJQSBUVF9NU19MQU5HSURfS0FTSE1JUklfU0FTSUEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX05FUEFMSV9ORVBBTCAgICAgICAgICAgICAgICAgICAgICAweDA0NjEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX05FUEFMSV9JTkRJQSAgICAgICAgICAgICAgICAgICAgICAweDA4NjEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSSVNJQU5fTkVUSEVSTEFORFMgICAgICAgICAgICAgICAweDA0NjIKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1BBU0hUT19BRkdIQU5JU1RBTiAgICAgICAgICAgICAgICAweDA0NjMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZJTElQSU5PX1BISUxJUFBJTkVTICAgICAgICAgICAgICAweDA0NjQKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0RISVZFSElfTUFMRElWRVMgICAgICAgICAgICAgICAgICAweDA0NjUKLSAgLyogYWxpYXMgZGVjbGFyZWQgaW4gV2luZG93cyAyMDAwICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9ESVZFSElfTUFMRElWRVMgIFRUX01TX0xBTkdJRF9ESElWRUhJX01BTERJVkVTCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9FRE9fTklHRVJJQSAgICAgICAgICAgICAgICAgICAgICAgMHgwNDY2Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9GVUxGVUxERV9OSUdFUklBICAgICAgICAgICAgICAgICAgMHgwNDY3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9IQVVTQV9OSUdFUklBICAgICAgICAgICAgICAgICAgICAgMHgwNDY4Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9JQklCSU9fTklHRVJJQSAgICAgICAgICAgICAgICAgICAgMHgwNDY5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9ZT1JVQkFfTklHRVJJQSAgICAgICAgICAgICAgICAgICAgMHgwNDZhCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9RVUVDSFVBX0JPTElWSUEgICAgICAgICAgICAgICAgICAgMHgwNDZiCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9RVUVDSFVBX0VDVUFET1IgICAgICAgICAgICAgICAgICAgMHgwODZiCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9RVUVDSFVBX1BFUlUgICAgICAgICAgICAgICAgICAgICAgMHgwYzZiCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TRVBFRElfU09VVEhfQUZSSUNBICAgICAgICAgICAgICAgMHgwNDZjCi0gIC8qIEFsc28gc3BlbGxlZCBieSBYUHNwMiBQbGF0Zm9ybSBTREsgKDIwMDQtMDctMjYpICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TT1RIT19TT1VUSEVSTl9TT1VUSF9BRlJJQ0EgXAotICAgICAgICAgIFRUX01TX0xBTkdJRF9TRVBFRElfU09VVEhfQUZSSUNBCi0gIC8qIGxhbmd1YWdlIGNvZGVzIDB4MDQ2ZCwgMHgwNDZlIGFuZCAweDA0NmYgYXJlIChzdGlsbCkgdW5rbm93bi4gKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0lHQk9fTklHRVJJQSAgICAgICAgICAgICAgICAgICAgICAweDA0NzAKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0tBTlVSSV9OSUdFUklBICAgICAgICAgICAgICAgICAgICAweDA0NzEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX09ST01PX0VUSElPUElBICAgICAgICAgICAgICAgICAgICAweDA0NzIKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1RJR1JJR05BX0VUSElPUElBICAgICAgICAgICAgICAgICAweDA0NzMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1RJR1JJR05BX0VSWVRIUkVBICAgICAgICAgICAgICAgICAweDA4NzMKLSAgLyogYWxzbyBzcGVsbGVkIGluIHRoZSBgUGFzc3BvcnQgU0RLJyBsaXN0IGFzOiAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfVElHUklHTkFfRVJZVFJFQSAgVFRfTVNfTEFOR0lEX1RJR1JJR05BX0VSWVRIUkVBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9HVUFSQU5JX1BBUkFHVUFZICAgICAgICAgICAgICAgICAgMHgwNDc0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9IQVdBSUlBTl9VTklURURfU1RBVEVTICAgICAgICAgICAgMHgwNDc1Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9MQVRJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDc2Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9TT01BTElfU09NQUxJQSAgICAgICAgICAgICAgICAgICAgMHgwNDc3Ci0gIC8qIE5vdGU6IFlpIGRvZXMgbm90IGhhdmUgYSAocHJvcGVyKSBJU08gNjM5LTIgY29kZSwgc2luY2UgaXQgaXMgbW9zdGx5ICovCi0gIC8qICAgICAgIG5vdCB3cml0dGVuIChidXQgT1RPSCB0aGUgcGVjdWxpYXIgd3JpdGluZyBzeXN0ZW0gaXMgd29ydGggICAgICovCi0gIC8qICAgICAgIHN0dWR5aW5nKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9ZSV9DSElOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDc4Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9QQVBJQU1FTlRVX05FVEhFUkxBTkRTX0FOVElMTEVTICAgMHgwNDc5Ci0gIC8qIGxhbmd1YWdlIGNvZGVzIGZyb20gMHgwNDdhIHRvIDB4MDQ3ZiBhcmUgKHN0aWxsKSB1bmtub3duLiAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfVUlHSFVSX0NISU5BICAgICAgICAgICAgICAgICAgICAgIDB4MDQ4MAotI2RlZmluZSBUVF9NU19MQU5HSURfTUFPUklfTkVXX1pFQUxBTkQgICAgICAgICAgICAgICAgIDB4MDQ4MQotCi0jaWYgMCAgLyogbm90IGRlZW1lZCB1c2VmdWwgZm9yIGZvbnRzICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9IVU1BTl9JTlRFUkZBQ0VfREVWSUNFICAgICAgICAgICAgMHgwNGZmCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBgbmFtZScgaWRlbnRpZmllciBmaWVsZCBpbiB0aGUgbmFtZSByZWNvcmRzIG9mICovCi0gIC8qIHRoZSBUVEYgYG5hbWUnIHRhYmxlLiAgVGhlc2UgdmFsdWVzIGFyZSBwbGF0Zm9ybSBpbmRlcGVuZGVudC4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVFRfTkFNRV9JRF9DT1BZUklHSFQgICAgICAgICAgICAwCi0jZGVmaW5lIFRUX05BTUVfSURfRk9OVF9GQU1JTFkgICAgICAgICAgMQotI2RlZmluZSBUVF9OQU1FX0lEX0ZPTlRfU1VCRkFNSUxZICAgICAgIDIKLSNkZWZpbmUgVFRfTkFNRV9JRF9VTklRVUVfSUQgICAgICAgICAgICAzCi0jZGVmaW5lIFRUX05BTUVfSURfRlVMTF9OQU1FICAgICAgICAgICAgNAotI2RlZmluZSBUVF9OQU1FX0lEX1ZFUlNJT05fU1RSSU5HICAgICAgIDUKLSNkZWZpbmUgVFRfTkFNRV9JRF9QU19OQU1FICAgICAgICAgICAgICA2Ci0jZGVmaW5lIFRUX05BTUVfSURfVFJBREVNQVJLICAgICAgICAgICAgNwotCi0gIC8qIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBmcm9tIHRoZSBPcGVuVHlwZSBzcGVjICovCi0jZGVmaW5lIFRUX05BTUVfSURfTUFOVUZBQ1RVUkVSICAgICAgICAgOAotI2RlZmluZSBUVF9OQU1FX0lEX0RFU0lHTkVSICAgICAgICAgICAgIDkKLSNkZWZpbmUgVFRfTkFNRV9JRF9ERVNDUklQVElPTiAgICAgICAgICAxMAotI2RlZmluZSBUVF9OQU1FX0lEX1ZFTkRPUl9VUkwgICAgICAgICAgIDExCi0jZGVmaW5lIFRUX05BTUVfSURfREVTSUdORVJfVVJMICAgICAgICAgMTIKLSNkZWZpbmUgVFRfTkFNRV9JRF9MSUNFTlNFICAgICAgICAgICAgICAxMwotI2RlZmluZSBUVF9OQU1FX0lEX0xJQ0VOU0VfVVJMICAgICAgICAgIDE0Ci0gIC8qIG51bWJlciAxNSBpcyByZXNlcnZlZCAqLwotI2RlZmluZSBUVF9OQU1FX0lEX1BSRUZFUlJFRF9GQU1JTFkgICAgIDE2Ci0jZGVmaW5lIFRUX05BTUVfSURfUFJFRkVSUkVEX1NVQkZBTUlMWSAgMTcKLSNkZWZpbmUgVFRfTkFNRV9JRF9NQUNfRlVMTF9OQU1FICAgICAgICAxOAotCi0gIC8qIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBuZXcgYXMgb2YgMjAwMC0wMS0yMSAqLwotI2RlZmluZSBUVF9OQU1FX0lEX1NBTVBMRV9URVhUICAgICAgICAgIDE5Ci0KLSAgLyogVGhpcyBpcyBuZXcgaW4gT3BlblR5cGUgMS4zICovCi0jZGVmaW5lIFRUX05BTUVfSURfQ0lEX0ZJTkRGT05UX05BTUUgICAgMjAKLQotICAvKiBUaGlzIGlzIG5ldyBpbiBPcGVuVHlwZSAxLjUgKi8KLSNkZWZpbmUgVFRfTkFNRV9JRF9XV1NfRkFNSUxZICAgICAgICAgICAyMQotI2RlZmluZSBUVF9OQU1FX0lEX1dXU19TVUJGQU1JTFkgICAgICAgIDIyCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEJpdCBtYXNrIHZhbHVlcyBmb3IgdGhlIFVuaWNvZGUgUmFuZ2VzIGZyb20gdGhlIFRURiBgT1MyICcgdGFibGUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVXBkYXRlZCAwOC1Ob3YtMjAwOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIEJpdCAgMCAgIEJhc2ljIExhdGluICovCi0jZGVmaW5lIFRUX1VDUl9CQVNJQ19MQVRJTiAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgMCkgLyogVSswMDIwLVUrMDA3RSAqLwotICAvKiBCaXQgIDEgICBDMSBDb250cm9scyBhbmQgTGF0aW4tMSBTdXBwbGVtZW50ICovCi0jZGVmaW5lIFRUX1VDUl9MQVRJTjFfU1VQUExFTUVOVCAgICAgICAgICAgICAgICgxTCA8PCAgMSkgLyogVSswMDgwLVUrMDBGRiAqLwotICAvKiBCaXQgIDIgICBMYXRpbiBFeHRlbmRlZC1BICovCi0jZGVmaW5lIFRUX1VDUl9MQVRJTl9FWFRFTkRFRF9BICAgICAgICAgICAgICAgICgxTCA8PCAgMikgLyogVSswMTAwLVUrMDE3RiAqLwotICAvKiBCaXQgIDMgICBMYXRpbiBFeHRlbmRlZC1CICovCi0jZGVmaW5lIFRUX1VDUl9MQVRJTl9FWFRFTkRFRF9CICAgICAgICAgICAgICAgICgxTCA8PCAgMykgLyogVSswMTgwLVUrMDI0RiAqLwotICAvKiBCaXQgIDQgICBJUEEgRXh0ZW5zaW9ucyAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgUGhvbmV0aWMgRXh0ZW5zaW9ucyAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIFBob25ldGljIEV4dGVuc2lvbnMgU3VwcGxlbWVudCAqLwotI2RlZmluZSBUVF9VQ1JfSVBBX0VYVEVOU0lPTlMgICAgICAgICAgICAgICAgICAoMUwgPDwgIDQpIC8qIFUrMDI1MC1VKzAyQUYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzFEMDAtVSsxRDdGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsxRDgwLVUrMURCRiAqLwotICAvKiBCaXQgIDUgICBTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMgKi8KLSAgLyogICAgICAgICAgTW9kaWZpZXIgVG9uZSBMZXR0ZXJzICAgICovCi0jZGVmaW5lIFRUX1VDUl9TUEFDSU5HX01PRElGSUVSICAgICAgICAgICAgICAgICgxTCA8PCAgNSkgLyogVSswMkIwLVUrMDJGRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrQTcwMC1VK0E3MUYgKi8KLSAgLyogQml0ICA2ICAgQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzIFN1cHBsZW1lbnQgKi8KLSNkZWZpbmUgVFRfVUNSX0NPTUJJTklOR19ESUFDUklUSUNTICAgICAgICAgICAgKDFMIDw8ICA2KSAvKiBVKzAzMDAtVSswMzZGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsxREMwLVUrMURGRiAqLwotICAvKiBCaXQgIDcgICBHcmVlayBhbmQgQ29wdGljICovCi0jZGVmaW5lIFRUX1VDUl9HUkVFSyAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgNykgLyogVSswMzcwLVUrMDNGRiAqLwotICAvKiBCaXQgIDggICBDb3B0aWMgKi8KLSNkZWZpbmUgVFRfVUNSX0NPUFRJQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA4KSAvKiBVKzJDODAtVSsyQ0ZGICovCi0gIC8qIEJpdCAgOSAgIEN5cmlsbGljICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgQ3lyaWxsaWMgU3VwcGxlbWVudCAqLwotICAvKiAgICAgICAgICBDeXJpbGxpYyBFeHRlbmRlZC1BICovCi0gIC8qICAgICAgICAgIEN5cmlsbGljIEV4dGVuZGVkLUIgKi8KLSNkZWZpbmUgVFRfVUNSX0NZUklMTElDICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA5KSAvKiBVKzA0MDAtVSswNEZGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSswNTAwLVUrMDUyRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMkRFMC1VKzJERkYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVK0E2NDAtVStBNjlGICovCi0gIC8qIEJpdCAxMCAgIEFybWVuaWFuICovCi0jZGVmaW5lIFRUX1VDUl9BUk1FTklBTiAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxMCkgLyogVSswNTMwLVUrMDU4RiAqLwotICAvKiBCaXQgMTEgICBIZWJyZXcgKi8KLSNkZWZpbmUgVFRfVUNSX0hFQlJFVyAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDExKSAvKiBVKzA1OTAtVSswNUZGICovCi0gIC8qIEJpdCAxMiAgIFZhaSAqLwotI2RlZmluZSBUVF9VQ1JfVkFJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTIpIC8qIFUrQTUwMC1VK0E2M0YgKi8KLSAgLyogQml0IDEzICAgQXJhYmljICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgQXJhYmljIFN1cHBsZW1lbnQgKi8KLSNkZWZpbmUgVFRfVUNSX0FSQUJJQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDEzKSAvKiBVKzA2MDAtVSswNkZGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSswNzUwLVUrMDc3RiAqLwotICAvKiBCaXQgMTQgICBOS28gKi8KLSNkZWZpbmUgVFRfVUNSX05LTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE0KSAvKiBVKzA3QzAtVSswN0ZGICovCi0gIC8qIEJpdCAxNSAgIERldmFuYWdhcmkgKi8KLSNkZWZpbmUgVFRfVUNSX0RFVkFOQUdBUkkgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE1KSAvKiBVKzA5MDAtVSswOTdGICovCi0gIC8qIEJpdCAxNiAgIEJlbmdhbGkgKi8KLSNkZWZpbmUgVFRfVUNSX0JFTkdBTEkgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE2KSAvKiBVKzA5ODAtVSswOUZGICovCi0gIC8qIEJpdCAxNyAgIEd1cm11a2hpICovCi0jZGVmaW5lIFRUX1VDUl9HVVJNVUtISSAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxNykgLyogVSswQTAwLVUrMEE3RiAqLwotICAvKiBCaXQgMTggICBHdWphcmF0aSAqLwotI2RlZmluZSBUVF9VQ1JfR1VKQVJBVEkgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTgpIC8qIFUrMEE4MC1VKzBBRkYgKi8KLSAgLyogQml0IDE5ICAgT3JpeWEgKi8KLSNkZWZpbmUgVFRfVUNSX09SSVlBICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE5KSAvKiBVKzBCMDAtVSswQjdGICovCi0gIC8qIEJpdCAyMCAgIFRhbWlsICovCi0jZGVmaW5lIFRUX1VDUl9UQU1JTCAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMCkgLyogVSswQjgwLVUrMEJGRiAqLwotICAvKiBCaXQgMjEgICBUZWx1Z3UgKi8KLSNkZWZpbmUgVFRfVUNSX1RFTFVHVSAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDIxKSAvKiBVKzBDMDAtVSswQzdGICovCi0gIC8qIEJpdCAyMiAgIEthbm5hZGEgKi8KLSNkZWZpbmUgVFRfVUNSX0tBTk5BREEgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDIyKSAvKiBVKzBDODAtVSswQ0ZGICovCi0gIC8qIEJpdCAyMyAgIE1hbGF5YWxhbSAqLwotI2RlZmluZSBUVF9VQ1JfTUFMQVlBTEFNICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjMpIC8qIFUrMEQwMC1VKzBEN0YgKi8KLSAgLyogQml0IDI0ICAgVGhhaSAqLwotI2RlZmluZSBUVF9VQ1JfVEhBSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjQpIC8qIFUrMEUwMC1VKzBFN0YgKi8KLSAgLyogQml0IDI1ICAgTGFvICovCi0jZGVmaW5lIFRUX1VDUl9MQU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyNSkgLyogVSswRTgwLVUrMEVGRiAqLwotICAvKiBCaXQgMjYgICBHZW9yZ2lhbiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIEdlb3JnaWFuIFN1cHBsZW1lbnQgKi8KLSNkZWZpbmUgVFRfVUNSX0dFT1JHSUFOICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI2KSAvKiBVKzEwQTAtVSsxMEZGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsyRDAwLVUrMkQyRiAqLwotICAvKiBCaXQgMjcgICBCYWxpbmVzZSAqLwotI2RlZmluZSBUVF9VQ1JfQkFMSU5FU0UgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjcpIC8qIFUrMUIwMC1VKzFCN0YgKi8KLSAgLyogQml0IDI4ICAgSGFuZ3VsIEphbW8gKi8KLSNkZWZpbmUgVFRfVUNSX0hBTkdVTF9KQU1PICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI4KSAvKiBVKzExMDAtVSsxMUZGICovCi0gIC8qIEJpdCAyOSAgIExhdGluIEV4dGVuZGVkIEFkZGl0aW9uYWwgKi8KLSAgLyogICAgICAgICAgTGF0aW4gRXh0ZW5kZWQtQyAgICAgICAgICAqLwotICAvKiAgICAgICAgICBMYXRpbiBFeHRlbmRlZC1EICAgICAgICAgICovCi0jZGVmaW5lIFRUX1VDUl9MQVRJTl9FWFRFTkRFRF9BRERJVElPTkFMICAgICAgICgxTCA8PCAyOSkgLyogVSsxRTAwLVUrMUVGRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMkM2MC1VKzJDN0YgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVK0E3MjAtVStBN0ZGICovCi0gIC8qIEJpdCAzMCAgIEdyZWVrIEV4dGVuZGVkICovCi0jZGVmaW5lIFRUX1VDUl9HUkVFS19FWFRFTkRFRCAgICAgICAgICAgICAgICAgICgxTCA8PCAzMCkgLyogVSsxRjAwLVUrMUZGRiAqLwotICAvKiBCaXQgMzEgICBHZW5lcmFsIFB1bmN0dWF0aW9uICAgICAgKi8KLSAgLyogICAgICAgICAgU3VwcGxlbWVudGFsIFB1bmN0dWF0aW9uICovCi0jZGVmaW5lIFRUX1VDUl9HRU5FUkFMX1BVTkNUVUFUSU9OICAgICAgICAgICAgICgxTCA8PCAzMSkgLyogVSsyMDAwLVUrMjA2RiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMkUwMC1VKzJFN0YgKi8KLSAgLyogQml0IDMyICAgU3VwZXJzY3JpcHRzIEFuZCBTdWJzY3JpcHRzICovCi0jZGVmaW5lIFRUX1VDUl9TVVBFUlNDUklQVFNfU1VCU0NSSVBUUyAgICAgICAgICgxTCA8PCAgMCkgLyogVSsyMDcwLVUrMjA5RiAqLwotICAvKiBCaXQgMzMgICBDdXJyZW5jeSBTeW1ib2xzICovCi0jZGVmaW5lIFRUX1VDUl9DVVJSRU5DWV9TWU1CT0xTICAgICAgICAgICAgICAgICgxTCA8PCAgMSkgLyogVSsyMEEwLVUrMjBDRiAqLwotICAvKiBCaXQgMzQgICBDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3MgRm9yIFN5bWJvbHMgKi8KLSNkZWZpbmUgVFRfVUNSX0NPTUJJTklOR19ESUFDUklUSUNTX1NZTUIgICAgICAgKDFMIDw8ICAyKSAvKiBVKzIwRDAtVSsyMEZGICovCi0gIC8qIEJpdCAzNSAgIExldHRlcmxpa2UgU3ltYm9scyAqLwotI2RlZmluZSBUVF9VQ1JfTEVUVEVSTElLRV9TWU1CT0xTICAgICAgICAgICAgICAoMUwgPDwgIDMpIC8qIFUrMjEwMC1VKzIxNEYgKi8KLSAgLyogQml0IDM2ICAgTnVtYmVyIEZvcm1zICovCi0jZGVmaW5lIFRUX1VDUl9OVU1CRVJfRk9STVMgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgNCkgLyogVSsyMTUwLVUrMjE4RiAqLwotICAvKiBCaXQgMzcgICBBcnJvd3MgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBTdXBwbGVtZW50YWwgQXJyb3dzLUEgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBTdXBwbGVtZW50YWwgQXJyb3dzLUIgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBNaXNjZWxsYW5lb3VzIFN5bWJvbHMgYW5kIEFycm93cyAqLwotI2RlZmluZSBUVF9VQ1JfQVJST1dTICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDUpIC8qIFUrMjE5MC1VKzIxRkYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzI3RjAtVSsyN0ZGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsyOTAwLVUrMjk3RiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMkIwMC1VKzJCRkYgKi8KLSAgLyogQml0IDM4ICAgTWF0aGVtYXRpY2FsIE9wZXJhdG9ycyAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIFN1cHBsZW1lbnRhbCBNYXRoZW1hdGljYWwgT3BlcmF0b3JzICAqLwotICAvKiAgICAgICAgICBNaXNjZWxsYW5lb3VzIE1hdGhlbWF0aWNhbCBTeW1ib2xzLUEgKi8KLSAgLyogICAgICAgICAgTWlzY2VsbGFuZW91cyBNYXRoZW1hdGljYWwgU3ltYm9scy1CICovCi0jZGVmaW5lIFRUX1VDUl9NQVRIRU1BVElDQUxfT1BFUkFUT1JTICAgICAgICAgICgxTCA8PCAgNikgLyogVSsyMjAwLVUrMjJGRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMkEwMC1VKzJBRkYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzI3QzAtVSsyN0VGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsyOTgwLVUrMjlGRiAqLwotICAvKiBCaXQgMzkgTWlzY2VsbGFuZW91cyBUZWNobmljYWwgKi8KLSNkZWZpbmUgVFRfVUNSX01JU0NFTExBTkVPVVNfVEVDSE5JQ0FMICAgICAgICAgKDFMIDw8ICA3KSAvKiBVKzIzMDAtVSsyM0ZGICovCi0gIC8qIEJpdCA0MCAgIENvbnRyb2wgUGljdHVyZXMgKi8KLSNkZWZpbmUgVFRfVUNSX0NPTlRST0xfUElDVFVSRVMgICAgICAgICAgICAgICAgKDFMIDw8ICA4KSAvKiBVKzI0MDAtVSsyNDNGICovCi0gIC8qIEJpdCA0MSAgIE9wdGljYWwgQ2hhcmFjdGVyIFJlY29nbml0aW9uICovCi0jZGVmaW5lIFRUX1VDUl9PQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgOSkgLyogVSsyNDQwLVUrMjQ1RiAqLwotICAvKiBCaXQgNDIgICBFbmNsb3NlZCBBbHBoYW51bWVyaWNzICovCi0jZGVmaW5lIFRUX1VDUl9FTkNMT1NFRF9BTFBIQU5VTUVSSUNTICAgICAgICAgICgxTCA8PCAxMCkgLyogVSsyNDYwLVUrMjRGRiAqLwotICAvKiBCaXQgNDMgICBCb3ggRHJhd2luZyAqLwotI2RlZmluZSBUVF9VQ1JfQk9YX0RSQVdJTkcgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTEpIC8qIFUrMjUwMC1VKzI1N0YgKi8KLSAgLyogQml0IDQ0ICAgQmxvY2sgRWxlbWVudHMgKi8KLSNkZWZpbmUgVFRfVUNSX0JMT0NLX0VMRU1FTlRTICAgICAgICAgICAgICAgICAgKDFMIDw8IDEyKSAvKiBVKzI1ODAtVSsyNTlGICovCi0gIC8qIEJpdCA0NSAgIEdlb21ldHJpYyBTaGFwZXMgKi8KLSNkZWZpbmUgVFRfVUNSX0dFT01FVFJJQ19TSEFQRVMgICAgICAgICAgICAgICAgKDFMIDw8IDEzKSAvKiBVKzI1QTAtVSsyNUZGICovCi0gIC8qIEJpdCA0NiAgIE1pc2NlbGxhbmVvdXMgU3ltYm9scyAqLwotI2RlZmluZSBUVF9VQ1JfTUlTQ0VMTEFORU9VU19TWU1CT0xTICAgICAgICAgICAoMUwgPDwgMTQpIC8qIFUrMjYwMC1VKzI2RkYgKi8KLSAgLyogQml0IDQ3ICAgRGluZ2JhdHMgKi8KLSNkZWZpbmUgVFRfVUNSX0RJTkdCQVRTICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE1KSAvKiBVKzI3MDAtVSsyN0JGICovCi0gIC8qIEJpdCA0OCAgIENKSyBTeW1ib2xzIGFuZCBQdW5jdHVhdGlvbiAqLwotI2RlZmluZSBUVF9VQ1JfQ0pLX1NZTUJPTFMgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTYpIC8qIFUrMzAwMC1VKzMwM0YgKi8KLSAgLyogQml0IDQ5ICAgSGlyYWdhbmEgKi8KLSNkZWZpbmUgVFRfVUNSX0hJUkFHQU5BICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE3KSAvKiBVKzMwNDAtVSszMDlGICovCi0gIC8qIEJpdCA1MCAgIEthdGFrYW5hICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgS2F0YWthbmEgUGhvbmV0aWMgRXh0ZW5zaW9ucyAqLwotI2RlZmluZSBUVF9VQ1JfS0FUQUtBTkEgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTgpIC8qIFUrMzBBMC1VKzMwRkYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzMxRjAtVSszMUZGICovCi0gIC8qIEJpdCA1MSAgIEJvcG9tb2ZvICAgICAgICAgICovCi0gIC8qICAgICAgICAgIEJvcG9tb2ZvIEV4dGVuZGVkICovCi0jZGVmaW5lIFRUX1VDUl9CT1BPTU9GTyAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxOSkgLyogVSszMTAwLVUrMzEyRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMzFBMC1VKzMxQkYgKi8KLSAgLyogQml0IDUyICAgSGFuZ3VsIENvbXBhdGliaWxpdHkgSmFtbyAqLwotI2RlZmluZSBUVF9VQ1JfSEFOR1VMX0NPTVBBVElCSUxJVFlfSkFNTyAgICAgICAoMUwgPDwgMjApIC8qIFUrMzEzMC1VKzMxOEYgKi8KLSAgLyogQml0IDUzICAgUGhhZ3MtUGEgKi8KLSNkZWZpbmUgVFRfVUNSX0NKS19NSVNDICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDIxKSAvKiBVK0E4NDAtVStBODdGICovCi0jZGVmaW5lIFRUX1VDUl9LQU5CVU4gIFRUX1VDUl9DSktfTUlTQyAvKiBkZXByZWNhdGVkICovCi0jZGVmaW5lIFRUX1VDUl9QSEFHU1BBCi0gIC8qIEJpdCA1NCAgIEVuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHMgKi8KLSNkZWZpbmUgVFRfVUNSX0VOQ0xPU0VEX0NKS19MRVRURVJTX01PTlRIUyAgICAgKDFMIDw8IDIyKSAvKiBVKzMyMDAtVSszMkZGICovCi0gIC8qIEJpdCA1NSAgIENKSyBDb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIFRUX1VDUl9DSktfQ09NUEFUSUJJTElUWSAgICAgICAgICAgICAgICgxTCA8PCAyMykgLyogVSszMzAwLVUrMzNGRiAqLwotICAvKiBCaXQgNTYgICBIYW5ndWwgU3lsbGFibGVzICovCi0jZGVmaW5lIFRUX1VDUl9IQU5HVUwgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyNCkgLyogVStBQzAwLVUrRDdBMyAqLwotICAvKiBCaXQgNTcgICBIaWdoIFN1cnJvZ2F0ZXMgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIEhpZ2ggUHJpdmF0ZSBVc2UgU3Vycm9nYXRlcyAgKi8KLSAgLyogICAgICAgICAgTG93IFN1cnJvZ2F0ZXMgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFjY29yZGluZyB0byBPcGVuVHlwZSBzcGVjcyB2LjEuMyssICAgKi8KLSAgLyogc2V0dGluZyBiaXQgNTcgaW1wbGllcyB0aGF0IHRoZXJlIGlzICAqLwotICAvKiBhdCBsZWFzdCBvbmUgY29kZXBvaW50IGJleW9uZCB0aGUgICAgICovCi0gIC8qIEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZSB0aGF0IGlzICAgICAgKi8KLSAgLyogc3VwcG9ydGVkIGJ5IHRoaXMgZm9udC4gIFNvIGl0IHJlYWxseSAqLwotICAvKiBtZWFucyA+PSBVKzEwMDAwICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRUX1VDUl9TVVJST0dBVEVTICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyNSkgLyogVStEODAwLVUrREI3RiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrREI4MC1VK0RCRkYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVK0RDMDAtVStERkZGICovCi0jZGVmaW5lIFRUX1VDUl9OT05fUExBTkVfMCAgVFRfVUNSX1NVUlJPR0FURVMKLSAgLyogQml0IDU4ICBQaG9lbmljaWFuICovCi0jZGVmaW5lIFRUX1VDUl9QSE9FTklDSUFOICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyNikgLypVKzEwOTAwLVUrMTA5MUYqLwotICAvKiBCaXQgNTkgICBDSksgVW5pZmllZCBJZGVvZ3JhcGhzICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIENKSyBSYWRpY2FscyBTdXBwbGVtZW50ICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgS2FuZ3hpIFJhZGljYWxzICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBJZGVvZ3JhcGhpYyBEZXNjcmlwdGlvbiBDaGFyYWN0ZXJzICovCi0gIC8qICAgICAgICAgIENKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEEgKi8KLSAgLyogICAgICAgICAgQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQiAqLwotICAvKiAgICAgICAgICBLYW5idW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRUX1VDUl9DSktfVU5JRklFRF9JREVPR1JBUEhTICAgICAgICAgICgxTCA8PCAyNykgLyogVSs0RTAwLVUrOUZGRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMkU4MC1VKzJFRkYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzJGMDAtVSsyRkRGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsyRkYwLVUrMkZGRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMzQwMC1VKzREQjUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlUrMjAwMDAtVSsyQTZERiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSszMTkwLVUrMzE5RiAqLwotICAvKiBCaXQgNjAgICBQcml2YXRlIFVzZSAqLwotI2RlZmluZSBUVF9VQ1JfUFJJVkFURV9VU0UgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjgpIC8qIFUrRTAwMC1VK0Y4RkYgKi8KLSAgLyogQml0IDYxICAgQ0pLIFN0cm9rZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIENKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBDSksgQ29tcGF0aWJpbGl0eSBJZGVvZ3JhcGhzIFN1cHBsZW1lbnQgKi8KLSNkZWZpbmUgVFRfVUNSX0NKS19DT01QQVRJQklMSVRZX0lERU9HUkFQSFMgICAgKDFMIDw8IDI5KSAvKiBVKzMxQzAtVSszMUVGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVStGOTAwLVUrRkFGRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVSsyRjgwMC1VKzJGQTFGKi8KLSAgLyogQml0IDYyICAgQWxwaGFiZXRpYyBQcmVzZW50YXRpb24gRm9ybXMgKi8KLSNkZWZpbmUgVFRfVUNSX0FMUEhBQkVUSUNfUFJFU0VOVEFUSU9OX0ZPUk1TICAgKDFMIDw8IDMwKSAvKiBVK0ZCMDAtVStGQjRGICovCi0gIC8qIEJpdCA2MyAgIEFyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQSAqLwotI2RlZmluZSBUVF9VQ1JfQVJBQklDX1BSRVNFTlRBVElPTlNfQSAgICAgICAgICAoMUwgPDwgMzEpIC8qIFUrRkI1MC1VK0ZERkYgKi8KLSAgLyogQml0IDY0ICAgQ29tYmluaW5nIEhhbGYgTWFya3MgKi8KLSNkZWZpbmUgVFRfVUNSX0NPTUJJTklOR19IQUxGX01BUktTICAgICAgICAgICAgKDFMIDw8ICAwKSAvKiBVK0ZFMjAtVStGRTJGICovCi0gIC8qIEJpdCA2NSAgIFZlcnRpY2FsIGZvcm1zICAgICAgICAgICovCi0gIC8qICAgICAgICAgIENKSyBDb21wYXRpYmlsaXR5IEZvcm1zICovCi0jZGVmaW5lIFRUX1VDUl9DSktfQ09NUEFUSUJJTElUWV9GT1JNUyAgICAgICAgICgxTCA8PCAgMSkgLyogVStGRTEwLVUrRkUxRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrRkUzMC1VK0ZFNEYgKi8KLSAgLyogQml0IDY2ICAgU21hbGwgRm9ybSBWYXJpYW50cyAqLwotI2RlZmluZSBUVF9VQ1JfU01BTExfRk9STV9WQVJJQU5UUyAgICAgICAgICAgICAoMUwgPDwgIDIpIC8qIFUrRkU1MC1VK0ZFNkYgKi8KLSAgLyogQml0IDY3ICAgQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1CICovCi0jZGVmaW5lIFRUX1VDUl9BUkFCSUNfUFJFU0VOVEFUSU9OU19CICAgICAgICAgICgxTCA8PCAgMykgLyogVStGRTcwLVUrRkVGRSAqLwotICAvKiBCaXQgNjggICBIYWxmd2lkdGggYW5kIEZ1bGx3aWR0aCBGb3JtcyAqLwotI2RlZmluZSBUVF9VQ1JfSEFMRldJRFRIX0ZVTExXSURUSF9GT1JNUyAgICAgICAoMUwgPDwgIDQpIC8qIFUrRkYwMC1VK0ZGRUYgKi8KLSAgLyogQml0IDY5ICAgU3BlY2lhbHMgKi8KLSNkZWZpbmUgVFRfVUNSX1NQRUNJQUxTICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA1KSAvKiBVK0ZGRjAtVStGRkZEICovCi0gIC8qIEJpdCA3MCAgIFRpYmV0YW4gKi8KLSNkZWZpbmUgVFRfVUNSX1RJQkVUQU4gICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA2KSAvKiBVKzBGMDAtVSswRkZGICovCi0gIC8qIEJpdCA3MSAgIFN5cmlhYyAqLwotI2RlZmluZSBUVF9VQ1JfU1lSSUFDICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDcpIC8qIFUrMDcwMC1VKzA3NEYgKi8KLSAgLyogQml0IDcyICAgVGhhYW5hICovCi0jZGVmaW5lIFRUX1VDUl9USEFBTkEgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgOCkgLyogVSswNzgwLVUrMDdCRiAqLwotICAvKiBCaXQgNzMgICBTaW5oYWxhICovCi0jZGVmaW5lIFRUX1VDUl9TSU5IQUxBICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgOSkgLyogVSswRDgwLVUrMERGRiAqLwotICAvKiBCaXQgNzQgICBNeWFubWFyICovCi0jZGVmaW5lIFRUX1VDUl9NWUFOTUFSICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxMCkgLyogVSsxMDAwLVUrMTA5RiAqLwotICAvKiBCaXQgNzUgICBFdGhpb3BpYyAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIEV0aGlvcGljIFN1cHBsZW1lbnQgKi8KLSAgLyogICAgICAgICAgRXRoaW9waWMgRXh0ZW5kZWQgICAqLwotI2RlZmluZSBUVF9VQ1JfRVRISU9QSUMgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTEpIC8qIFUrMTIwMC1VKzEzN0YgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzEzODAtVSsxMzlGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsyRDgwLVUrMkRERiAqLwotICAvKiBCaXQgNzYgICBDaGVyb2tlZSAqLwotI2RlZmluZSBUVF9VQ1JfQ0hFUk9LRUUgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTIpIC8qIFUrMTNBMC1VKzEzRkYgKi8KLSAgLyogQml0IDc3ICAgVW5pZmllZCBDYW5hZGlhbiBBYm9yaWdpbmFsIFN5bGxhYmljcyAqLwotI2RlZmluZSBUVF9VQ1JfQ0FOQURJQU5fQUJPUklHSU5BTF9TWUxMQUJJQ1MgICAoMUwgPDwgMTMpIC8qIFUrMTQwMC1VKzE2N0YgKi8KLSAgLyogQml0IDc4ICAgT2doYW0gKi8KLSNkZWZpbmUgVFRfVUNSX09HSEFNICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE0KSAvKiBVKzE2ODAtVSsxNjlGICovCi0gIC8qIEJpdCA3OSAgIFJ1bmljICovCi0jZGVmaW5lIFRUX1VDUl9SVU5JQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxNSkgLyogVSsxNkEwLVUrMTZGRiAqLwotICAvKiBCaXQgODAgICBLaG1lciAgICAgICAgICovCi0gIC8qICAgICAgICAgIEtobWVyIFN5bWJvbHMgKi8KLSNkZWZpbmUgVFRfVUNSX0tITUVSICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE2KSAvKiBVKzE3ODAtVSsxN0ZGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsxOUUwLVUrMTlGRiAqLwotICAvKiBCaXQgODEgICBNb25nb2xpYW4gKi8KLSNkZWZpbmUgVFRfVUNSX01PTkdPTElBTiAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE3KSAvKiBVKzE4MDAtVSsxOEFGICovCi0gIC8qIEJpdCA4MiAgIEJyYWlsbGUgUGF0dGVybnMgKi8KLSNkZWZpbmUgVFRfVUNSX0JSQUlMTEUgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE4KSAvKiBVKzI4MDAtVSsyOEZGICovCi0gIC8qIEJpdCA4MyAgIFlpIFN5bGxhYmxlcyAqLwotICAvKiAgICAgICAgICBZaSBSYWRpY2FscyAgKi8KLSNkZWZpbmUgVFRfVUNSX1lJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE5KSAvKiBVK0EwMDAtVStBNDhGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVStBNDkwLVUrQTRDRiAqLwotICAvKiBCaXQgODQgICBUYWdhbG9nICAqLwotICAvKiAgICAgICAgICBIYW51bm9vICAqLwotICAvKiAgICAgICAgICBCdWhpZCAgICAqLwotICAvKiAgICAgICAgICBUYWdiYW53YSAqLwotI2RlZmluZSBUVF9VQ1JfUEhJTElQUElORSAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjApIC8qIFUrMTcwMC1VKzE3MUYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzE3MjAtVSsxNzNGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsxNzQwLVUrMTc1RiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMTc2MC1VKzE3N0YgKi8KLSAgLyogQml0IDg1ICAgT2xkIEl0YWxpYyAqLwotI2RlZmluZSBUVF9VQ1JfT0xEX0lUQUxJQyAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjEpIC8qVSsxMDMwMC1VKzEwMzJGKi8KLSAgLyogQml0IDg2ICAgR290aGljICovCi0jZGVmaW5lIFRUX1VDUl9HT1RISUMgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMikgLypVKzEwMzMwLVUrMTAzNEYqLwotICAvKiBCaXQgODcgICBEZXNlcmV0ICovCi0jZGVmaW5lIFRUX1VDUl9ERVNFUkVUICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMykgLypVKzEwNDAwLVUrMTA0NEYqLwotICAvKiBCaXQgODggICBCeXphbnRpbmUgTXVzaWNhbCBTeW1ib2xzICAgICAgKi8KLSAgLyogICAgICAgICAgTXVzaWNhbCBTeW1ib2xzICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIEFuY2llbnQgR3JlZWsgTXVzaWNhbCBOb3RhdGlvbiAqLwotI2RlZmluZSBUVF9VQ1JfTVVTSUNBTF9TWU1CT0xTICAgICAgICAgICAgICAgICAoMUwgPDwgMjQpIC8qVSsxRDAwMC1VKzFEMEZGKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlUrMUQxMDAtVSsxRDFGRiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypVKzFEMjAwLVUrMUQyNEYqLwotICAvKiBCaXQgODkgICBNYXRoZW1hdGljYWwgQWxwaGFudW1lcmljIFN5bWJvbHMgKi8KLSNkZWZpbmUgVFRfVUNSX01BVEhfQUxQSEFOVU1FUklDX1NZTUJPTFMgICAgICAgKDFMIDw8IDI1KSAvKlUrMUQ0MDAtVSsxRDdGRiovCi0gIC8qIEJpdCA5MCAgIFByaXZhdGUgVXNlIChwbGFuZSAxNSkgKi8KLSAgLyogICAgICAgICAgUHJpdmF0ZSBVc2UgKHBsYW5lIDE2KSAqLwotI2RlZmluZSBUVF9VQ1JfUFJJVkFURV9VU0VfU1VQUExFTUVOVEFSWSAgICAgICAoMUwgPDwgMjYpIC8qVStGMDAwMC1VK0ZGRkZEKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypVKzEwMDAwMC1VKzEwRkZGRCovCi0gIC8qIEJpdCA5MSAgIFZhcmlhdGlvbiBTZWxlY3RvcnMgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBWYXJpYXRpb24gU2VsZWN0b3JzIFN1cHBsZW1lbnQgKi8KLSNkZWZpbmUgVFRfVUNSX1ZBUklBVElPTl9TRUxFQ1RPUlMgICAgICAgICAgICAgKDFMIDw8IDI3KSAvKiBVK0ZFMDAtVStGRTBGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypVK0UwMTAwLVUrRTAxRUYqLwotICAvKiBCaXQgOTIgICBUYWdzICovCi0jZGVmaW5lIFRUX1VDUl9UQUdTICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyOCkgLypVK0UwMDAwLVUrRTAwN0YqLwotICAvKiBCaXQgOTMgICBMaW1idSAqLwotI2RlZmluZSBUVF9VQ1JfTElNQlUgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjkpIC8qIFUrMTkwMC1VKzE5NEYgKi8KLSAgLyogQml0IDk0ICAgVGFpIExlICovCi0jZGVmaW5lIFRUX1VDUl9UQUlfTEUgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAzMCkgLyogVSsxOTUwLVUrMTk3RiAqLwotICAvKiBCaXQgOTUgICBOZXcgVGFpIEx1ZSAqLwotI2RlZmluZSBUVF9VQ1JfTkVXX1RBSV9MVUUgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMzEpIC8qIFUrMTk4MC1VKzE5REYgKi8KLSAgLyogQml0IDk2ICAgQnVnaW5lc2UgKi8KLSNkZWZpbmUgVFRfVUNSX0JVR0lORVNFICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICAwKSAvKiBVKzFBMDAtVSsxQTFGICovCi0gIC8qIEJpdCA5NyAgIEdsYWdvbGl0aWMgKi8KLSNkZWZpbmUgVFRfVUNSX0dMQUdPTElUSUMgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICAxKSAvKiBVKzJDMDAtVSsyQzVGICovCi0gIC8qIEJpdCA5OCAgIFRpZmluYWdoICovCi0jZGVmaW5lIFRUX1VDUl9USUZJTkFHSCAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgMikgLyogVSsyRDMwLVUrMkQ3RiAqLwotICAvKiBCaXQgOTkgICBZaWppbmcgSGV4YWdyYW0gU3ltYm9scyAqLwotI2RlZmluZSBUVF9VQ1JfWUlKSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDMpIC8qIFUrNERDMC1VKzRERkYgKi8KLSAgLyogQml0IDEwMCAgU3lsb3RpIE5hZ3JpICovCi0jZGVmaW5lIFRUX1VDUl9TWUxPVElfTkFHUkkgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgNCkgLyogVStBODAwLVUrQTgyRiAqLwotICAvKiBCaXQgMTAxICBMaW5lYXIgQiBTeWxsYWJhcnkgKi8KLSAgLyogICAgICAgICAgTGluZWFyIEIgSWRlb2dyYW1zICovCi0gIC8qICAgICAgICAgIEFlZ2VhbiBOdW1iZXJzICAgICAqLwotI2RlZmluZSBUVF9VQ1JfTElORUFSX0IgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDUpIC8qVSsxMDAwMC1VKzEwMDdGKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlUrMTAwODAtVSsxMDBGRiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypVKzEwMTAwLVUrMTAxM0YqLwotICAvKiBCaXQgMTAyICBBbmNpZW50IEdyZWVrIE51bWJlcnMgKi8KLSNkZWZpbmUgVFRfVUNSX0FOQ0lFTlRfR1JFRUtfTlVNQkVSUyAgICAgICAgICAgKDFMIDw8ICA2KSAvKlUrMTAxNDAtVSsxMDE4RiovCi0gIC8qIEJpdCAxMDMgIFVnYXJpdGljICovCi0jZGVmaW5lIFRUX1VDUl9VR0FSSVRJQyAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgNykgLypVKzEwMzgwLVUrMTAzOUYqLwotICAvKiBCaXQgMTA0ICBPbGQgUGVyc2lhbiAqLwotI2RlZmluZSBUVF9VQ1JfT0xEX1BFUlNJQU4gICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDgpIC8qVSsxMDNBMC1VKzEwM0RGKi8KLSAgLyogQml0IDEwNSAgU2hhdmlhbiAqLwotI2RlZmluZSBUVF9VQ1JfU0hBVklBTiAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDkpIC8qVSsxMDQ1MC1VKzEwNDdGKi8KLSAgLyogQml0IDEwNiAgT3NtYW55YSAqLwotI2RlZmluZSBUVF9VQ1JfT1NNQU5ZQSAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTApIC8qVSsxMDQ4MC1VKzEwNEFGKi8KLSAgLyogQml0IDEwNyAgQ3lwcmlvdCBTeWxsYWJhcnkgKi8KLSNkZWZpbmUgVFRfVUNSX0NZUFJJT1RfU1lMTEFCQVJZICAgICAgICAgICAgICAgKDFMIDw8IDExKSAvKlUrMTA4MDAtVSsxMDgzRiovCi0gIC8qIEJpdCAxMDggIEtoYXJvc2h0aGkgKi8KLSNkZWZpbmUgVFRfVUNSX0tIQVJPU0hUSEkgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDEyKSAvKlUrMTBBMDAtVSsxMEE1RiovCi0gIC8qIEJpdCAxMDkgIFRhaSBYdWFuIEppbmcgU3ltYm9scyAqLwotI2RlZmluZSBUVF9VQ1JfVEFJX1hVQU5fSklORyAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTMpIC8qVSsxRDMwMC1VKzFEMzVGKi8KLSAgLyogQml0IDExMCAgQ3VuZWlmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIEN1bmVpZm9ybSBOdW1iZXJzIGFuZCBQdW5jdHVhdGlvbiAqLwotI2RlZmluZSBUVF9VQ1JfQ1VORUlGT1JNICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTQpIC8qVSsxMjAwMC1VKzEyM0ZGKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlUrMTI0MDAtVSsxMjQ3RiovCi0gIC8qIEJpdCAxMTEgIENvdW50aW5nIFJvZCBOdW1lcmFscyAqLwotI2RlZmluZSBUVF9VQ1JfQ09VTlRJTkdfUk9EX05VTUVSQUxTICAgICAgICAgICAoMUwgPDwgMTUpIC8qVSsxRDM2MC1VKzFEMzdGKi8KLSAgLyogQml0IDExMiAgU3VuZGFuZXNlICovCi0jZGVmaW5lIFRUX1VDUl9TVU5EQU5FU0UgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxNikgLyogVSsxQjgwLVUrMUJCRiAqLwotICAvKiBCaXQgMTEzICBMZXBjaGEgKi8KLSNkZWZpbmUgVFRfVUNSX0xFUENIQSAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE3KSAvKiBVKzFDMDAtVSsxQzRGICovCi0gIC8qIEJpdCAxMTQgIE9sIENoaWtpICovCi0jZGVmaW5lIFRUX1VDUl9PTF9DSElLSSAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxOCkgLyogVSsxQzUwLVUrMUM3RiAqLwotICAvKiBCaXQgMTE1ICBTYXVyYXNodHJhICovCi0jZGVmaW5lIFRUX1VDUl9TQVVSQVNIVFJBICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxOSkgLyogVStBODgwLVUrQThERiAqLwotICAvKiBCaXQgMTE2ICBLYXlhaCBMaSAqLwotI2RlZmluZSBUVF9VQ1JfS0FZQUhfTEkgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjApIC8qIFUrQTkwMC1VK0E5MkYgKi8KLSAgLyogQml0IDExNyAgUmVqYW5nICovCi0jZGVmaW5lIFRUX1VDUl9SRUpBTkcgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMSkgLyogVStBOTMwLVUrQTk1RiAqLwotICAvKiBCaXQgMTE4ICBDaGFtICovCi0jZGVmaW5lIFRUX1VDUl9DSEFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMikgLyogVStBQTAwLVUrQUE1RiAqLwotICAvKiBCaXQgMTE5ICBBbmNpZW50IFN5bWJvbHMgKi8KLSNkZWZpbmUgVFRfVUNSX0FOQ0lFTlRfU1lNQk9MUyAgICAgICAgICAgICAgICAgKDFMIDw8IDIzKSAvKlUrMTAxOTAtVSsxMDFDRiovCi0gIC8qIEJpdCAxMjAgIFBoYWlzdG9zIERpc2MgKi8KLSNkZWZpbmUgVFRfVUNSX1BIQUlTVE9TX0RJU0MgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI0KSAvKlUrMTAxRDAtVSsxMDFGRiovCi0gIC8qIEJpdCAxMjEgIENhcmlhbiAqLwotICAvKiAgICAgICAgICBMeWNpYW4gKi8KLSAgLyogICAgICAgICAgTHlkaWFuICovCi0jZGVmaW5lIFRUX1VDUl9PTERfQU5BVE9MSUFOICAgICAgICAgICAgICAgICAgICgxTCA8PCAyNSkgLypVKzEwMkEwLVUrMTAyREYqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVSsxMDI4MC1VKzEwMjlGKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlUrMTA5MjAtVSsxMDkzRiovCi0gIC8qIEJpdCAxMjIgIERvbWlubyBUaWxlcyAgKi8KLSAgLyogICAgICAgICAgTWFoam9uZyBUaWxlcyAqLwotI2RlZmluZSBUVF9VQ1JfR0FNRV9USUxFUyAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjYpIC8qVSsxRjAzMC1VKzFGMDlGKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlUrMUYwMDAtVSsxRjAyRiovCi0gIC8qIEJpdCAxMjMtMTI3IFJlc2VydmVkIGZvciBwcm9jZXNzLWludGVybmFsIHVzYWdlICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNvbWUgY29tcGlsZXJzIGhhdmUgYSB2ZXJ5IGxpbWl0ZWQgbGVuZ3RoIG9mIGlkZW50aWZpZXJzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZiBkZWZpbmVkKCBfX1RVUkJPQ19fICkgJiYgX19UVVJCT0NfXyA8IDB4MDQxMCB8fCBkZWZpbmVkKCBfX1BBQ0lGSUNfXyApCi0jZGVmaW5lIEhBVkVfTElNSVRfT05fSURFTlRTCi0jZW5kaWYKLQotCi0jaWZuZGVmIEhBVkVfTElNSVRfT05fSURFTlRTCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEhlcmUgc29tZSBhbGlhcyAjZGVmaW5lcyBpbiBvcmRlciB0byBiZSBjbGVhcmVyLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlc2UgYXJlIG5vdCBhbHdheXMgI2RlZmluZWQgdG8gc3RheSB3aXRoaW4gdGhlIDMxfmNoYXJhY3RlciBsaW1pdCwgICovCi0gIC8qIHdoaWNoIHNvbWUgY29tcGlsZXJzIGhhdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ3JlZGl0cyBnbyB0byBEYXZlIEhvbyA8ZGhvb0BmbGFzaC5uZXQ+IGZvciBwb2ludGluZyBvdXQgdGhhdCBtb2Rlcm4gICovCi0gIC8qIEJvcmxhbmQgY29tcGlsZXJzIChyZWFkOiBmcm9tIEJDKysgMy4xIG9uKSBjYW4gaW5jcmVhc2UgdGhpcyBsaW1pdC4gICAqLwotICAvKiBJZiB5b3UgZ2V0IGEgd2FybmluZyB3aXRoIHN1Y2ggYSBjb21waWxlciwgdXNlIHRoZSAtaTQwIHN3aXRjaC4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRUX1VDUl9BUkFCSUNfUFJFU0VOVEFUSU9OX0ZPUk1TX0EgICAgICBcCi0gICAgICAgICBUVF9VQ1JfQVJBQklDX1BSRVNFTlRBVElPTlNfQQotI2RlZmluZSBUVF9VQ1JfQVJBQklDX1BSRVNFTlRBVElPTl9GT1JNU19CICAgICAgXAotICAgICAgICAgVFRfVUNSX0FSQUJJQ19QUkVTRU5UQVRJT05TX0IKLQotI2RlZmluZSBUVF9VQ1JfQ09NQklOSU5HX0RJQUNSSVRJQ0FMX01BUktTICAgICAgXAotICAgICAgICAgVFRfVUNSX0NPTUJJTklOR19ESUFDUklUSUNTCi0jZGVmaW5lIFRUX1VDUl9DT01CSU5JTkdfRElBQ1JJVElDQUxfTUFSS1NfU1lNQiBcCi0gICAgICAgICBUVF9VQ1JfQ09NQklOSU5HX0RJQUNSSVRJQ1NfU1lNQgotCi0KLSNlbmRpZiAvKiAhSEFWRV9MSU1JVF9PTl9JREVOVFMgKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1RUTkFNRUlEX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS90dHRhYmxlcy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS90dHRhYmxlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWQ4YjA1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvdHR0YWJsZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dHRhYmxlcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQmFzaWMgU0ZOVC9UcnVlVHlwZSB0YWJsZXMgZGVmaW5pdGlvbnMgYW5kIGludGVyZmFjZSAgICAgICAgICAgICAgICAgKi8KLS8qICAgIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDUsIDIwMDgtMjAxNCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fVFRUQUJMRVNfSF9fCi0jZGVmaW5lIF9fVFRUQUJMRVNfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRydWV0eXBlX3RhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRydWVUeXBlIFRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRydWVUeXBlIHNwZWNpZmljIHRhYmxlIHR5cGVzIGFuZCBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBUcnVlVHlwZS1zcGVjaWZpYyB0YWJsZXMgICAqLwotICAvKiAgICBhcyB3ZWxsIGFzIHNvbWUgcm91dGluZXMgdXNlZCB0byBhY2Nlc3MgYW5kIHByb2Nlc3MgdGhlbS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPcmRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9IZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfSG9yaUhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1ZlcnRIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9PUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfUG9zdHNjcmlwdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1BDTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9NYXhQcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NmbnRfVGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfU2ZudF9UYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTG9hZF9TZm50X1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NmbnRfVGFibGVfSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0NNYXBfTGFuZ3VhZ2VfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9DTWFwX0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUEFSQU1fVEFHX1VOUEFURU5URURfSElOVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0hlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBUcnVlVHlwZSBmb250IGhlYWRlciB0YWJsZS4gIEFsbCAgICAgICAqLwotICAvKiAgICBmaWVsZHMgZm9sbG93IHRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9IZWFkZXJfCi0gIHsKLSAgICBGVF9GaXhlZCAgIFRhYmxlX1ZlcnNpb247Ci0gICAgRlRfRml4ZWQgICBGb250X1JldmlzaW9uOwotCi0gICAgRlRfTG9uZyAgICBDaGVja1N1bV9BZGp1c3Q7Ci0gICAgRlRfTG9uZyAgICBNYWdpY19OdW1iZXI7Ci0KLSAgICBGVF9VU2hvcnQgIEZsYWdzOwotICAgIEZUX1VTaG9ydCAgVW5pdHNfUGVyX0VNOwotCi0gICAgRlRfTG9uZyAgICBDcmVhdGVkIFsyXTsKLSAgICBGVF9Mb25nICAgIE1vZGlmaWVkWzJdOwotCi0gICAgRlRfU2hvcnQgICB4TWluOwotICAgIEZUX1Nob3J0ICAgeU1pbjsKLSAgICBGVF9TaG9ydCAgIHhNYXg7Ci0gICAgRlRfU2hvcnQgICB5TWF4OwotCi0gICAgRlRfVVNob3J0ICBNYWNfU3R5bGU7Ci0gICAgRlRfVVNob3J0ICBMb3dlc3RfUmVjX1BQRU07Ci0KLSAgICBGVF9TaG9ydCAgIEZvbnRfRGlyZWN0aW9uOwotICAgIEZUX1Nob3J0ICAgSW5kZXhfVG9fTG9jX0Zvcm1hdDsKLSAgICBGVF9TaG9ydCAgIEdseXBoX0RhdGFfRm9ybWF0OwotCi0gIH0gVFRfSGVhZGVyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfSG9yaUhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIFRydWVUeXBlIGhvcml6b250YWwgaGVhZGVyLCB0aGUgYGhoZWEnICovCi0gIC8qICAgIHRhYmxlLCBhcyB3ZWxsIGFzIHRoZSBjb3JyZXNwb25kaW5nIGhvcml6b250YWwgbWV0cmljcyB0YWJsZSwgICAgICAqLwotICAvKiAgICBpLmUuLCB0aGUgYGhtdHgnIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBWZXJzaW9uICAgICAgICAgICAgICAgIDo6IFRoZSB0YWJsZSB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFzY2VuZGVyICAgICAgICAgICAgICAgOjogVGhlIGZvbnQncyBhc2NlbmRlciwgaS5lLiwgdGhlIGRpc3RhbmNlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIGJhc2VsaW5lIHRvIHRoZSB0b3AtbW9zdCBvZiBhbGwgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaCBwb2ludHMgZm91bmQgaW4gdGhlIGZvbnQuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgaW52YWxpZCBpbiBtYW55IGZvbnRzLCBhcyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyB1c3VhbGx5IHNldCBieSB0aGUgZm9udCBkZXNpZ25lciwgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG9mdGVuIHJlZmxlY3RzIG9ubHkgYSBwb3J0aW9uIG9mIHRoZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocyBmb3VuZCBpbiB0aGUgZm9udCAobWF5YmUgQVNDSUkpLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91IHNob3VsZCB1c2UgdGhlIGBzVHlwb0FzY2VuZGVyJyBmaWVsZCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBPUy8yIHRhYmxlIGluc3RlYWQgaWYgeW91IHdhbnQgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ycmVjdCBvbmUuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZXNjZW5kZXIgICAgICAgICAgICAgIDo6IFRoZSBmb250J3MgZGVzY2VuZGVyLCBpLmUuLCB0aGUgZGlzdGFuY2UgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBiYXNlbGluZSB0byB0aGUgYm90dG9tLW1vc3Qgb2YgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIGdseXBoIHBvaW50cyBmb3VuZCBpbiB0aGUgZm9udC4gIEl0ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5lZ2F0aXZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBpbnZhbGlkIGluIG1hbnkgZm9udHMsIGFzICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIHVzdWFsbHkgc2V0IGJ5IHRoZSBmb250IGRlc2lnbmVyLCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgb2Z0ZW4gcmVmbGVjdHMgb25seSBhIHBvcnRpb24gb2YgdGhlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhzIGZvdW5kIGluIHRoZSBmb250IChtYXliZSBBU0NJSSkuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3Ugc2hvdWxkIHVzZSB0aGUgYHNUeXBvRGVzY2VuZGVyJyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgb2YgdGhlIE9TLzIgdGFibGUgaW5zdGVhZCBpZiB5b3UgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnQgdGhlIGNvcnJlY3Qgb25lLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExpbmVfR2FwICAgICAgICAgICAgICAgOjogVGhlIGZvbnQncyBsaW5lIGdhcCwgaS5lLiwgdGhlIGRpc3RhbmNlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFkZCB0byB0aGUgYXNjZW5kZXIgYW5kIGRlc2NlbmRlciB0byAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQgdGhlIEJUQiwgaS5lLiwgdGhlICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWxpbmUtdG8tYmFzZWxpbmUgZGlzdGFuY2UgZm9yIHRoZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFkdmFuY2VfV2lkdGhfTWF4ICAgICAgOjogVGhpcyBmaWVsZCBpcyB0aGUgbWF4aW11bSBvZiBhbGwgYWR2YW5jZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocyBmb3VuZCBpbiB0aGUgZm9udC4gIEl0IGNhbiBiZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGNvbXB1dGUgdGhlIG1heGltdW0gd2lkdGggb2YgYW4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJiaXRyYXJ5IHN0cmluZyBvZiB0ZXh0LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWluX0xlZnRfU2lkZV9CZWFyaW5nICA6OiBUaGUgbWluaW11bSBsZWZ0IHNpZGUgYmVhcmluZyBvZiBhbGwgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhzIHdpdGhpbiB0aGUgZm9udC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWluX1JpZ2h0X1NpZGVfQmVhcmluZyA6OiBUaGUgbWluaW11bSByaWdodCBzaWRlIGJlYXJpbmcgb2YgYWxsICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhzIHdpdGhpbiB0aGUgZm9udC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeE1heF9FeHRlbnQgICAgICAgICAgICA6OiBUaGUgbWF4aW11bSBob3Jpem9udGFsIGV4dGVudCAoaS5lLiwgdGhlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYHdpZHRoJyBvZiBhIGdseXBoJ3MgYm91bmRpbmcgYm94KSBmb3IgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCBnbHlwaHMgaW4gdGhlIGZvbnQuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhcmV0X1Nsb3BlX1Jpc2UgICAgICAgOjogVGhlIHJpc2UgY29lZmZpY2llbnQgb2YgdGhlIGN1cnNvcidzICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3BlIG9mIHRoZSBjdXJzb3IgKHNsb3BlPXJpc2UvcnVuKS4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhcmV0X1Nsb3BlX1J1biAgICAgICAgOjogVGhlIHJ1biBjb2VmZmljaWVudCBvZiB0aGUgY3Vyc29yJ3MgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3BlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlc2VydmVkICAgICAgICAgICAgICAgOjogOH5yZXNlcnZlZCBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWV0cmljX0RhdGFfRm9ybWF0ICAgICA6OiBBbHdheXN+MC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1iZXJfT2ZfSE1ldHJpY3MgICAgIDo6IE51bWJlciBvZiBITWV0cmljcyBlbnRyaWVzIGluIHRoZSBgaG10eCcgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSAtLSB0aGlzIHZhbHVlIGNhbiBiZSBzbWFsbGVyIHRoYW4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRvdGFsIG51bWJlciBvZiBnbHlwaHMgaW4gdGhlIGZvbnQuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9uZ19tZXRyaWNzICAgICAgICAgICA6OiBBIHBvaW50ZXIgaW50byB0aGUgYGhtdHgnIHRhYmxlLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaG9ydF9tZXRyaWNzICAgICAgICAgIDo6IEEgcG9pbnRlciBpbnRvIHRoZSBgaG10eCcgdGFibGUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJTVBPUlRBTlQ6IFRoZSBUVF9Ib3JpSGVhZGVyIGFuZCBUVF9WZXJ0SGVhZGVyIHN0cnVjdHVyZXMgc2hvdWxkICAgKi8KLSAgLyogICAgICAgICAgICAgICBiZSBpZGVudGljYWwgZXhjZXB0IGZvciB0aGUgbmFtZXMgb2YgdGhlaXIgZmllbGRzLCAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgd2hpY2ggYXJlIGRpZmZlcmVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBUaGlzIGVuc3VyZXMgdGhhdCBhIHNpbmdsZSBmdW5jdGlvbiBpbiB0aGUgYHR0bG9hZCcgICAgICovCi0gIC8qICAgICAgICAgICAgICAgbW9kdWxlIGlzIGFibGUgdG8gcmVhZCBib3RoIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCAqLwotICAvKiAgICAgICAgICAgICAgIGhlYWRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9Ib3JpSGVhZGVyXwotICB7Ci0gICAgRlRfRml4ZWQgICBWZXJzaW9uOwotICAgIEZUX1Nob3J0ICAgQXNjZW5kZXI7Ci0gICAgRlRfU2hvcnQgICBEZXNjZW5kZXI7Ci0gICAgRlRfU2hvcnQgICBMaW5lX0dhcDsKLQotICAgIEZUX1VTaG9ydCAgYWR2YW5jZV9XaWR0aF9NYXg7ICAgICAgLyogYWR2YW5jZSB3aWR0aCBtYXhpbXVtICovCi0KLSAgICBGVF9TaG9ydCAgIG1pbl9MZWZ0X1NpZGVfQmVhcmluZzsgIC8qIG1pbmltdW0gbGVmdC1zYiAgICAgICAqLwotICAgIEZUX1Nob3J0ICAgbWluX1JpZ2h0X1NpZGVfQmVhcmluZzsgLyogbWluaW11bSByaWdodC1zYiAgICAgICovCi0gICAgRlRfU2hvcnQgICB4TWF4X0V4dGVudDsgICAgICAgICAgICAvKiB4bWF4IGV4dGVudHMgICAgICAgICAgKi8KLSAgICBGVF9TaG9ydCAgIGNhcmV0X1Nsb3BlX1Jpc2U7Ci0gICAgRlRfU2hvcnQgICBjYXJldF9TbG9wZV9SdW47Ci0gICAgRlRfU2hvcnQgICBjYXJldF9PZmZzZXQ7Ci0KLSAgICBGVF9TaG9ydCAgIFJlc2VydmVkWzRdOwotCi0gICAgRlRfU2hvcnQgICBtZXRyaWNfRGF0YV9Gb3JtYXQ7Ci0gICAgRlRfVVNob3J0ICBudW1iZXJfT2ZfSE1ldHJpY3M7Ci0KLSAgICAvKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgbm90IGRlZmluZWQgYnkgdGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24gKi8KLSAgICAvKiBidXQgdGhleSBhcmUgdXNlZCB0byBjb25uZWN0IHRoZSBtZXRyaWNzIGhlYWRlciB0byB0aGUgcmVsZXZhbnQgICAgKi8KLSAgICAvKiBgSE1UWCcgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIHZvaWQqICAgICAgbG9uZ19tZXRyaWNzOwotICAgIHZvaWQqICAgICAgc2hvcnRfbWV0cmljczsKLQotICB9IFRUX0hvcmlIZWFkZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9WZXJ0SGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgVHJ1ZVR5cGUgdmVydGljYWwgaGVhZGVyLCB0aGUgYHZoZWEnICAgKi8KLSAgLyogICAgdGFibGUsIGFzIHdlbGwgYXMgdGhlIGNvcnJlc3BvbmRpbmcgdmVydGljYWwgbWV0cmljcyB0YWJsZSwgaS5lLiwgICovCi0gIC8qICAgIHRoZSBgdm10eCcgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFZlcnNpb24gICAgICAgICAgICAgICAgIDo6IFRoZSB0YWJsZSB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQXNjZW5kZXIgICAgICAgICAgICAgICAgOjogVGhlIGZvbnQncyBhc2NlbmRlciwgaS5lLiwgdGhlIGRpc3RhbmNlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIGJhc2VsaW5lIHRvIHRoZSB0b3AtbW9zdCBvZiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgZ2x5cGggcG9pbnRzIGZvdW5kIGluIHRoZSBmb250LiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgaW52YWxpZCBpbiBtYW55IGZvbnRzLCBhcyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyB1c3VhbGx5IHNldCBieSB0aGUgZm9udCBkZXNpZ25lciwgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG9mdGVuIHJlZmxlY3RzIG9ubHkgYSBwb3J0aW9uIG9mICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBnbHlwaHMgZm91bmQgaW4gdGhlIGZvbnQgKG1heWJlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0NJSSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBzaG91bGQgdXNlIHRoZSBgc1R5cG9Bc2NlbmRlcicgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBvZiB0aGUgT1MvMiB0YWJsZSBpbnN0ZWFkIGlmIHlvdSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudCB0aGUgY29ycmVjdCBvbmUuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZXNjZW5kZXIgICAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIGRlc2NlbmRlciwgaS5lLiwgdGhlICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgZnJvbSB0aGUgYmFzZWxpbmUgdG8gdGhlICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbS1tb3N0IG9mIGFsbCBnbHlwaCBwb2ludHMgZm91bmQgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgZm9udC4gIEl0IGlzIG5lZ2F0aXZlLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgaW52YWxpZCBpbiBtYW55IGZvbnRzLCBhcyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyB1c3VhbGx5IHNldCBieSB0aGUgZm9udCBkZXNpZ25lciwgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG9mdGVuIHJlZmxlY3RzIG9ubHkgYSBwb3J0aW9uIG9mICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBnbHlwaHMgZm91bmQgaW4gdGhlIGZvbnQgKG1heWJlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0NJSSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBzaG91bGQgdXNlIHRoZSBgc1R5cG9EZXNjZW5kZXInICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBvZiB0aGUgT1MvMiB0YWJsZSBpbnN0ZWFkIGlmIHlvdSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudCB0aGUgY29ycmVjdCBvbmUuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMaW5lX0dhcCAgICAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIGxpbmUgZ2FwLCBpLmUuLCB0aGUgZGlzdGFuY2UgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWRkIHRvIHRoZSBhc2NlbmRlciBhbmQgZGVzY2VuZGVyIHRvICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCB0aGUgQlRCLCBpLmUuLCB0aGUgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlbGluZS10by1iYXNlbGluZSBkaXN0YW5jZSBmb3IgdGhlICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZHZhbmNlX0hlaWdodF9NYXggICAgICA6OiBUaGlzIGZpZWxkIGlzIHRoZSBtYXhpbXVtIG9mIGFsbCAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSBoZWlnaHRzIGZvdW5kIGluIHRoZSBmb250LiAgSXQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSB1c2VkIHRvIGNvbXB1dGUgdGhlIG1heGltdW0gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgb2YgYW4gYXJiaXRyYXJ5IHN0cmluZyBvZiB0ZXh0LiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1pbl9Ub3BfU2lkZV9CZWFyaW5nICAgIDo6IFRoZSBtaW5pbXVtIHRvcCBzaWRlIGJlYXJpbmcgb2YgYWxsICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHMgd2l0aGluIHRoZSBmb250LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1pbl9Cb3R0b21fU2lkZV9CZWFyaW5nIDo6IFRoZSBtaW5pbXVtIGJvdHRvbSBzaWRlIGJlYXJpbmcgb2YgYWxsICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHMgd2l0aGluIHRoZSBmb250LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHlNYXhfRXh0ZW50ICAgICAgICAgICAgIDo6IFRoZSBtYXhpbXVtIHZlcnRpY2FsIGV4dGVudCAoaS5lLiwgdGhlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgaGVpZ2h0JyBvZiBhIGdseXBoJ3MgYm91bmRpbmcgYm94KSBmb3IgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIGdseXBocyBpbiB0aGUgZm9udC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjYXJldF9TbG9wZV9SaXNlICAgICAgICA6OiBUaGUgcmlzZSBjb2VmZmljaWVudCBvZiB0aGUgY3Vyc29yJ3MgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvcGUgb2YgdGhlIGN1cnNvciAoc2xvcGU9cmlzZS9ydW4pLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjYXJldF9TbG9wZV9SdW4gICAgICAgICA6OiBUaGUgcnVuIGNvZWZmaWNpZW50IG9mIHRoZSBjdXJzb3IncyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvcGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjYXJldF9PZmZzZXQgICAgICAgICAgICA6OiBUaGUgY3Vyc29yJ3Mgb2Zmc2V0IGZvciBzbGFudGVkIGZvbnRzLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBgcmVzZXJ2ZWQnIGluIHZtdHggICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gMS4wLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVzZXJ2ZWQgICAgICAgICAgICAgICAgOjogOH5yZXNlcnZlZCBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZXRyaWNfRGF0YV9Gb3JtYXQgICAgICA6OiBBbHdheXN+MC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bWJlcl9PZl9ITWV0cmljcyAgICAgIDo6IE51bWJlciBvZiBWTWV0cmljcyBlbnRyaWVzIGluIHRoZSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgdm10eCcgdGFibGUgLS0gdGhpcyB2YWx1ZSBjYW4gYmUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxlciB0aGFuIHRoZSB0b3RhbCBudW1iZXIgb2YgZ2x5cGhzICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9uZ19tZXRyaWNzICAgICAgICAgICA6OiBBIHBvaW50ZXIgaW50byB0aGUgYHZtdHgnIHRhYmxlLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaG9ydF9tZXRyaWNzICAgICAgICAgIDo6IEEgcG9pbnRlciBpbnRvIHRoZSBgdm10eCcgdGFibGUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJTVBPUlRBTlQ6IFRoZSBUVF9Ib3JpSGVhZGVyIGFuZCBUVF9WZXJ0SGVhZGVyIHN0cnVjdHVyZXMgc2hvdWxkICAgKi8KLSAgLyogICAgICAgICAgICAgICBiZSBpZGVudGljYWwgZXhjZXB0IGZvciB0aGUgbmFtZXMgb2YgdGhlaXIgZmllbGRzLCAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgd2hpY2ggYXJlIGRpZmZlcmVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBUaGlzIGVuc3VyZXMgdGhhdCBhIHNpbmdsZSBmdW5jdGlvbiBpbiB0aGUgYHR0bG9hZCcgICAgICovCi0gIC8qICAgICAgICAgICAgICAgbW9kdWxlIGlzIGFibGUgdG8gcmVhZCBib3RoIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCAqLwotICAvKiAgICAgICAgICAgICAgIGhlYWRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9WZXJ0SGVhZGVyXwotICB7Ci0gICAgRlRfRml4ZWQgICBWZXJzaW9uOwotICAgIEZUX1Nob3J0ICAgQXNjZW5kZXI7Ci0gICAgRlRfU2hvcnQgICBEZXNjZW5kZXI7Ci0gICAgRlRfU2hvcnQgICBMaW5lX0dhcDsKLQotICAgIEZUX1VTaG9ydCAgYWR2YW5jZV9IZWlnaHRfTWF4OyAgICAgIC8qIGFkdmFuY2UgaGVpZ2h0IG1heGltdW0gKi8KLQotICAgIEZUX1Nob3J0ICAgbWluX1RvcF9TaWRlX0JlYXJpbmc7ICAgIC8qIG1pbmltdW0gbGVmdC1zYiBvciB0b3Atc2IgICAgICAgKi8KLSAgICBGVF9TaG9ydCAgIG1pbl9Cb3R0b21fU2lkZV9CZWFyaW5nOyAvKiBtaW5pbXVtIHJpZ2h0LXNiIG9yIGJvdHRvbS1zYiAgICovCi0gICAgRlRfU2hvcnQgICB5TWF4X0V4dGVudDsgICAgICAgICAgICAgLyogeG1heCBvciB5bWF4IGV4dGVudHMgICAgICAgICAgICAqLwotICAgIEZUX1Nob3J0ICAgY2FyZXRfU2xvcGVfUmlzZTsKLSAgICBGVF9TaG9ydCAgIGNhcmV0X1Nsb3BlX1J1bjsKLSAgICBGVF9TaG9ydCAgIGNhcmV0X09mZnNldDsKLQotICAgIEZUX1Nob3J0ICAgUmVzZXJ2ZWRbNF07Ci0KLSAgICBGVF9TaG9ydCAgIG1ldHJpY19EYXRhX0Zvcm1hdDsKLSAgICBGVF9VU2hvcnQgIG51bWJlcl9PZl9WTWV0cmljczsKLQotICAgIC8qIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBub3QgZGVmaW5lZCBieSB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiAqLwotICAgIC8qIGJ1dCB0aGV5J3JlIHVzZWQgdG8gY29ubmVjdCB0aGUgbWV0cmljcyBoZWFkZXIgdG8gdGhlIHJlbGV2YW50ICAgICAqLwotICAgIC8qIGBITVRYJyBvciBgVk1UWCcgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgdm9pZCogICAgICBsb25nX21ldHJpY3M7Ci0gICAgdm9pZCogICAgICBzaG9ydF9tZXRyaWNzOwotCi0gIH0gVFRfVmVydEhlYWRlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX09TMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBUcnVlVHlwZSBPUy8yIHRhYmxlLiAgQWxsIGZpZWxkcyAgICAgICAqLwotICAvKiAgICBjb21wbHkgdG8gdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgdGhhdCB3ZSBub3cgc3VwcG9ydCBvbGQgTWFjIGZvbnRzIHRoYXQgZG8gbm90IGluY2x1ZGUgYW4gT1MvMiAqLwotICAvKiAgICB0YWJsZS4gIEluIHRoaXMgY2FzZSwgdGhlIGB2ZXJzaW9uJyBmaWVsZCBpcyBhbHdheXMgc2V0IHRvIDB4RkZGRi4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9PUzJfCi0gIHsKLSAgICBGVF9VU2hvcnQgIHZlcnNpb247ICAgICAgICAgICAgICAgIC8qIDB4MDAwMSAtIG1vcmUgb3IgMHhGRkZGICovCi0gICAgRlRfU2hvcnQgICB4QXZnQ2hhcldpZHRoOwotICAgIEZUX1VTaG9ydCAgdXNXZWlnaHRDbGFzczsKLSAgICBGVF9VU2hvcnQgIHVzV2lkdGhDbGFzczsKLSAgICBGVF9TaG9ydCAgIGZzVHlwZTsKLSAgICBGVF9TaG9ydCAgIHlTdWJzY3JpcHRYU2l6ZTsKLSAgICBGVF9TaG9ydCAgIHlTdWJzY3JpcHRZU2l6ZTsKLSAgICBGVF9TaG9ydCAgIHlTdWJzY3JpcHRYT2Zmc2V0OwotICAgIEZUX1Nob3J0ICAgeVN1YnNjcmlwdFlPZmZzZXQ7Ci0gICAgRlRfU2hvcnQgICB5U3VwZXJzY3JpcHRYU2l6ZTsKLSAgICBGVF9TaG9ydCAgIHlTdXBlcnNjcmlwdFlTaXplOwotICAgIEZUX1Nob3J0ICAgeVN1cGVyc2NyaXB0WE9mZnNldDsKLSAgICBGVF9TaG9ydCAgIHlTdXBlcnNjcmlwdFlPZmZzZXQ7Ci0gICAgRlRfU2hvcnQgICB5U3RyaWtlb3V0U2l6ZTsKLSAgICBGVF9TaG9ydCAgIHlTdHJpa2VvdXRQb3NpdGlvbjsKLSAgICBGVF9TaG9ydCAgIHNGYW1pbHlDbGFzczsKLQotICAgIEZUX0J5dGUgICAgcGFub3NlWzEwXTsKLQotICAgIEZUX1VMb25nICAgdWxVbmljb2RlUmFuZ2UxOyAgICAgICAgLyogQml0cyAwLTMxICAgKi8KLSAgICBGVF9VTG9uZyAgIHVsVW5pY29kZVJhbmdlMjsgICAgICAgIC8qIEJpdHMgMzItNjMgICovCi0gICAgRlRfVUxvbmcgICB1bFVuaWNvZGVSYW5nZTM7ICAgICAgICAvKiBCaXRzIDY0LTk1ICAqLwotICAgIEZUX1VMb25nICAgdWxVbmljb2RlUmFuZ2U0OyAgICAgICAgLyogQml0cyA5Ni0xMjcgKi8KLQotICAgIEZUX0NoYXIgICAgYWNoVmVuZElEWzRdOwotCi0gICAgRlRfVVNob3J0ICBmc1NlbGVjdGlvbjsKLSAgICBGVF9VU2hvcnQgIHVzRmlyc3RDaGFySW5kZXg7Ci0gICAgRlRfVVNob3J0ICB1c0xhc3RDaGFySW5kZXg7Ci0gICAgRlRfU2hvcnQgICBzVHlwb0FzY2VuZGVyOwotICAgIEZUX1Nob3J0ICAgc1R5cG9EZXNjZW5kZXI7Ci0gICAgRlRfU2hvcnQgICBzVHlwb0xpbmVHYXA7Ci0gICAgRlRfVVNob3J0ICB1c1dpbkFzY2VudDsKLSAgICBGVF9VU2hvcnQgIHVzV2luRGVzY2VudDsKLQotICAgIC8qIG9ubHkgdmVyc2lvbiAxIGFuZCBoaWdoZXI6ICovCi0KLSAgICBGVF9VTG9uZyAgIHVsQ29kZVBhZ2VSYW5nZTE7ICAgICAgIC8qIEJpdHMgMC0zMSAgICovCi0gICAgRlRfVUxvbmcgICB1bENvZGVQYWdlUmFuZ2UyOyAgICAgICAvKiBCaXRzIDMyLTYzICAqLwotCi0gICAgLyogb25seSB2ZXJzaW9uIDIgYW5kIGhpZ2hlcjogKi8KLQotICAgIEZUX1Nob3J0ICAgc3hIZWlnaHQ7Ci0gICAgRlRfU2hvcnQgICBzQ2FwSGVpZ2h0OwotICAgIEZUX1VTaG9ydCAgdXNEZWZhdWx0Q2hhcjsKLSAgICBGVF9VU2hvcnQgIHVzQnJlYWtDaGFyOwotICAgIEZUX1VTaG9ydCAgdXNNYXhDb250ZXh0OwotCi0gICAgLyogb25seSB2ZXJzaW9uIDUgYW5kIGhpZ2hlcjogKi8KLQotICAgIEZUX1VTaG9ydCAgdXNMb3dlck9wdGljYWxQb2ludFNpemU7ICAgICAgIC8qIGluIHR3aXBzICgxLzIwdGggcG9pbnRzKSAqLwotICAgIEZUX1VTaG9ydCAgdXNVcHBlck9wdGljYWxQb2ludFNpemU7ICAgICAgIC8qIGluIHR3aXBzICgxLzIwdGggcG9pbnRzKSAqLwotCi0gIH0gVFRfT1MyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfUG9zdHNjcmlwdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIFRydWVUeXBlIFBvc3RTY3JpcHQgdGFibGUuICBBbGwgZmllbGRzICovCi0gIC8qICAgIGNvbXBseSB0byB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbi4gIFRoaXMgc3RydWN0dXJlIGRvZXMgbm90ICAgICAqLwotICAvKiAgICByZWZlcmVuY2UgdGhlIFBvc3RTY3JpcHQgZ2x5cGggbmFtZXMsIHdoaWNoIGNhbiBiZSBuZXZlcnRoZWxlc3MgICAgKi8KLSAgLyogICAgYWNjZXNzZWQgd2l0aCB0aGUgYHR0cG9zdCcgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfUG9zdHNjcmlwdF8KLSAgewotICAgIEZUX0ZpeGVkICBGb3JtYXRUeXBlOwotICAgIEZUX0ZpeGVkICBpdGFsaWNBbmdsZTsKLSAgICBGVF9TaG9ydCAgdW5kZXJsaW5lUG9zaXRpb247Ci0gICAgRlRfU2hvcnQgIHVuZGVybGluZVRoaWNrbmVzczsKLSAgICBGVF9VTG9uZyAgaXNGaXhlZFBpdGNoOwotICAgIEZUX1VMb25nICBtaW5NZW1UeXBlNDI7Ci0gICAgRlRfVUxvbmcgIG1heE1lbVR5cGU0MjsKLSAgICBGVF9VTG9uZyAgbWluTWVtVHlwZTE7Ci0gICAgRlRfVUxvbmcgIG1heE1lbVR5cGUxOwotCi0gICAgLyogR2x5cGggbmFtZXMgZm9sbG93IGluIHRoZSBmaWxlLCBidXQgd2UgZG9uJ3QgICAqLwotICAgIC8qIGxvYWQgdGhlbSBieSBkZWZhdWx0LiAgU2VlIHRoZSB0dHBvc3QuYyBmaWxlLiAgKi8KLQotICB9IFRUX1Bvc3RzY3JpcHQ7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9QQ0xUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgVHJ1ZVR5cGUgUENMVCB0YWJsZS4gIEFsbCBmaWVsZHMgICAgICAgKi8KLSAgLyogICAgY29tcGx5IHRvIHRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfUENMVF8KLSAgewotICAgIEZUX0ZpeGVkICAgVmVyc2lvbjsKLSAgICBGVF9VTG9uZyAgIEZvbnROdW1iZXI7Ci0gICAgRlRfVVNob3J0ICBQaXRjaDsKLSAgICBGVF9VU2hvcnQgIHhIZWlnaHQ7Ci0gICAgRlRfVVNob3J0ICBTdHlsZTsKLSAgICBGVF9VU2hvcnQgIFR5cGVGYW1pbHk7Ci0gICAgRlRfVVNob3J0ICBDYXBIZWlnaHQ7Ci0gICAgRlRfVVNob3J0ICBTeW1ib2xTZXQ7Ci0gICAgRlRfQ2hhciAgICBUeXBlRmFjZVsxNl07Ci0gICAgRlRfQ2hhciAgICBDaGFyYWN0ZXJDb21wbGVtZW50WzhdOwotICAgIEZUX0NoYXIgICAgRmlsZU5hbWVbNl07Ci0gICAgRlRfQ2hhciAgICBTdHJva2VXZWlnaHQ7Ci0gICAgRlRfQ2hhciAgICBXaWR0aFR5cGU7Ci0gICAgRlRfQnl0ZSAgICBTZXJpZlN0eWxlOwotICAgIEZUX0J5dGUgICAgUmVzZXJ2ZWQ7Ci0KLSAgfSBUVF9QQ0xUOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTWF4UHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIG1heGltdW0gcHJvZmlsZSBpcyBhIHRhYmxlIGNvbnRhaW5pbmcgbWFueSBtYXggdmFsdWVzLCB3aGljaCAgICovCi0gIC8qICAgIGNhbiBiZSB1c2VkIHRvIHByZS1hbGxvY2F0ZSBhcnJheXMuICBUaGlzIGVuc3VyZXMgdGhhdCBubyBtZW1vcnkgICAqLwotICAvKiAgICBhbGxvY2F0aW9uIG9jY3VycyBkdXJpbmcgYSBnbHlwaCBsb2FkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJzaW9uICAgICAgICAgICAgICAgOjogVGhlIHZlcnNpb24gbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bUdseXBocyAgICAgICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGdseXBocyBpbiB0aGlzIFRydWVUeXBlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heFBvaW50cyAgICAgICAgICAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcG9pbnRzIGluIGEgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uLWNvbXBvc2l0ZSBUcnVlVHlwZSBnbHlwaC4gIFNlZSBhbHNvICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdHJ1Y3R1cmUgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgbWF4Q29tcG9zaXRlUG9pbnRzJy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4Q29udG91cnMgICAgICAgICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb250b3VycyBpbiBhICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub24tY29tcG9zaXRlIFRydWVUeXBlIGdseXBoLiAgU2VlIGFsc28gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0cnVjdHVyZSBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBtYXhDb21wb3NpdGVDb250b3VycycuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhDb21wb3NpdGVQb2ludHMgICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBvaW50cyBpbiBhICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZSBUcnVlVHlwZSBnbHlwaC4gIFNlZSBhbHNvIHRoZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgZWxlbWVudCBgbWF4UG9pbnRzJy4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4Q29tcG9zaXRlQ29udG91cnMgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb250b3VycyBpbiBhICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUgVHJ1ZVR5cGUgZ2x5cGguICBTZWUgYWxzbyB0aGUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIGVsZW1lbnQgYG1heENvbnRvdXJzJy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heFpvbmVzICAgICAgICAgICAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygem9uZXMgdXNlZCBmb3IgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGggaGludGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heFR3aWxpZ2h0UG9pbnRzICAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdpbGlnaHQgem9uZSB1c2VkIGZvciBnbHlwaCBoaW50aW5nLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heFN0b3JhZ2UgICAgICAgICAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZSBhcmVhIHVzZWQgZm9yIGdseXBoIGhpbnRpbmcuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heEZ1bmN0aW9uRGVmcyAgICAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZnVuY3Rpb24gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbnMgaW4gdGhlIFRydWVUeXBlIGJ5dGVjb2RlIGZvciAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhJbnN0cnVjdGlvbkRlZnMgICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIGluc3RydWN0aW9uICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25zIGluIHRoZSBUcnVlVHlwZSBieXRlY29kZSBmb3IgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4U3RhY2tFbGVtZW50cyAgICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBlbGVtZW50cyB1c2VkICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJpbmcgYnl0ZWNvZGUgaW50ZXJwcmV0YXRpb24uICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBUcnVlVHlwZSBvcGNvZGVzICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGZvciBnbHlwaCBoaW50aW5nLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4Q29tcG9uZW50RWxlbWVudHMgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBzaW1wbGUgKGkuZS4sIG5vbi0gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUpIGdseXBocyBpbiBhIGNvbXBvc2l0ZSBnbHlwaC4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4Q29tcG9uZW50RGVwdGggICAgIDo6IFRoZSBtYXhpbXVtIG5lc3RpbmcgZGVwdGggb2YgY29tcG9zaXRlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIGlzIG9ubHkgdXNlZCBkdXJpbmcgZm9udCBsb2FkaW5nLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX01heFByb2ZpbGVfCi0gIHsKLSAgICBGVF9GaXhlZCAgIHZlcnNpb247Ci0gICAgRlRfVVNob3J0ICBudW1HbHlwaHM7Ci0gICAgRlRfVVNob3J0ICBtYXhQb2ludHM7Ci0gICAgRlRfVVNob3J0ICBtYXhDb250b3VyczsKLSAgICBGVF9VU2hvcnQgIG1heENvbXBvc2l0ZVBvaW50czsKLSAgICBGVF9VU2hvcnQgIG1heENvbXBvc2l0ZUNvbnRvdXJzOwotICAgIEZUX1VTaG9ydCAgbWF4Wm9uZXM7Ci0gICAgRlRfVVNob3J0ICBtYXhUd2lsaWdodFBvaW50czsKLSAgICBGVF9VU2hvcnQgIG1heFN0b3JhZ2U7Ci0gICAgRlRfVVNob3J0ICBtYXhGdW5jdGlvbkRlZnM7Ci0gICAgRlRfVVNob3J0ICBtYXhJbnN0cnVjdGlvbkRlZnM7Ci0gICAgRlRfVVNob3J0ICBtYXhTdGFja0VsZW1lbnRzOwotICAgIEZUX1VTaG9ydCAgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zOwotICAgIEZUX1VTaG9ydCAgbWF4Q29tcG9uZW50RWxlbWVudHM7Ci0gICAgRlRfVVNob3J0ICBtYXhDb21wb25lbnREZXB0aDsKLQotICB9IFRUX01heFByb2ZpbGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZm50X1RhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBlbnVtZXJhdGlvbiB1c2VkIHRvIHNwZWNpZnkgdGhlIGluZGV4IG9mIGFuIFNGTlQgdGFibGUuICAgICAgICAgKi8KLSAgLyogICAgVXNlZCBpbiB0aGUgQEZUX0dldF9TZm50X1RhYmxlIEFQSSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU0ZOVF9IRUFEIDo6IFRvIGFjY2VzcyB0aGUgZm9udCdzIEBUVF9IZWFkZXIgc3RydWN0dXJlLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TRk5UX01BWFAgOjogVG8gYWNjZXNzIHRoZSBmb250J3MgQFRUX01heFByb2ZpbGUgc3RydWN0dXJlLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NGTlRfT1MyICA6OiBUbyBhY2Nlc3MgdGhlIGZvbnQncyBAVFRfT1MyIHN0cnVjdHVyZS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU0ZOVF9ISEVBIDo6IFRvIGFjY2VzcyB0aGUgZm9udCdzIEBUVF9Ib3JpSGVhZGVyIHN0cnVjdHVyZS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TRk5UX1ZIRUEgOjogVG8gYWNjZXNzIHRoZSBmb250J3MgQFRUX1ZlcnRIZWFkZXIgc3RydXR1cmUuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NGTlRfUE9TVCA6OiBUbyBhY2Nlc3MgdGhlIGZvbnQncyBAVFRfUG9zdHNjcmlwdCBzdHJ1Y3R1cmUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU0ZOVF9QQ0xUIDo6IFRvIGFjY2VzcyB0aGUgZm9udCdzIEBUVF9QQ0xUIHN0cnVjdHVyZS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGVudW0gIEZUX1NmbnRfVGFnXwotICB7Ci0gICAgRlRfU0ZOVF9IRUFELAotICAgIEZUX1NGTlRfTUFYUCwKLSAgICBGVF9TRk5UX09TMiwKLSAgICBGVF9TRk5UX0hIRUEsCi0gICAgRlRfU0ZOVF9WSEVBLAotICAgIEZUX1NGTlRfUE9TVCwKLSAgICBGVF9TRk5UX1BDTFQsCi0KLSAgICBGVF9TRk5UX01BWAotCi0gIH0gRlRfU2ZudF9UYWc7Ci0KLSAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgYEZUX1NmbnRfVGFnJyAqLwotICAvKiB2YWx1ZXMgaW5zdGVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIGZ0X3NmbnRfaGVhZCAgRlRfU0ZOVF9IRUFECi0jZGVmaW5lIGZ0X3NmbnRfbWF4cCAgRlRfU0ZOVF9NQVhQCi0jZGVmaW5lIGZ0X3NmbnRfb3MyICAgRlRfU0ZOVF9PUzIKLSNkZWZpbmUgZnRfc2ZudF9oaGVhICBGVF9TRk5UX0hIRUEKLSNkZWZpbmUgZnRfc2ZudF92aGVhICBGVF9TRk5UX1ZIRUEKLSNkZWZpbmUgZnRfc2ZudF9wb3N0ICBGVF9TRk5UX1BPU1QKLSNkZWZpbmUgZnRfc2ZudF9wY2x0ICBGVF9TRk5UX1BDTFQKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9TZm50X1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiBhIHBvaW50ZXIgdG8gYSBnaXZlbiBTRk5UIHRhYmxlIHdpdGhpbiBhIGZhY2UuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFnICA6OiBUaGUgaW5kZXggb2YgdGhlIFNGTlQgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlLWxlc3MgcG9pbnRlciB0byB0aGUgdGFibGUuICBUaGlzIHdpbGwgYmV+MCBpbiBjYXNlIG9mICAgICAgICovCi0gIC8qICAgIGVycm9yLCBvciBpZiB0aGUgY29ycmVzcG9uZGluZyB0YWJsZSB3YXMgbm90IGZvdW5kICpPUiogbG9hZGVkICAgICAqLwotICAvKiAgICBmcm9tIHRoZSBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZSBhIHR5cGVjYXN0IGFjY29yZGluZyB0byBgdGFnJyB0byBhY2Nlc3MgdGhlIHN0cnVjdHVyZSAgICAgICAgICAqLwotICAvKiAgICBlbGVtZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgdGFibGUgaXMgb3duZWQgYnkgdGhlIGZhY2Ugb2JqZWN0IGFuZCBkaXNhcHBlYXJzIHdpdGggaXQuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VmdWwgdG8gYWNjZXNzIFNGTlQgdGFibGVzIHRoYXQgYXJlIGxvYWRlZCAqLwotICAvKiAgICBieSB0aGUgc2ZudCwgdHJ1ZXR5cGUsIGFuZCBvcGVudHlwZSBkcml2ZXJzLiAgU2VlIEBGVF9TZm50X1RhZyBmb3IgKi8KLSAgLyogICAgYSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBIZXJlIGFuIGV4YW1wbGUgaG93IHRvIGFjY2VzcyB0aGUgYHZoZWEnIHRhYmxlOiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRUX1ZlcnRIZWFkZXIqICB2ZXJ0X2hlYWRlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHZlcnRfaGVhZGVyID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIChUVF9WZXJ0SGVhZGVyKilGVF9HZXRfU2ZudF9UYWJsZSggZmFjZSwgRlRfU0ZOVF9WSEVBICk7ICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkKiApCi0gIEZUX0dldF9TZm50X1RhYmxlKCBGVF9GYWNlICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1NmbnRfVGFnICB0YWcgKTsKLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICBGVF9Mb2FkX1NmbnRfVGFibGUKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgIExvYWQgYW55IGZvbnQgdGFibGUgaW50byBjbGllbnQgbWVtb3J5LgotICAqCi0gICogQGlucHV0OgotICAqICAgZmFjZSA6OgotICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuCi0gICoKLSAgKiAgIHRhZyA6OgotICAqICAgICBUaGUgZm91ci1ieXRlIHRhZyBvZiB0aGUgdGFibGUgdG8gbG9hZC4gIFVzZSB0aGUgdmFsdWV+MCBpZiB5b3Ugd2FudAotICAqICAgICB0byBhY2Nlc3MgdGhlIHdob2xlIGZvbnQgZmlsZS4gIE90aGVyd2lzZSwgeW91IGNhbiB1c2Ugb25lIG9mIHRoZQotICAqICAgICBkZWZpbml0aW9ucyBmb3VuZCBpbiB0aGUgQEZUX1RSVUVUWVBFX1RBR1NfSCBmaWxlLCBvciBmb3JnZSBhIG5ldwotICAqICAgICBvbmUgd2l0aCBARlRfTUFLRV9UQUcuCi0gICoKLSAgKiAgIG9mZnNldCA6OgotICAqICAgICBUaGUgc3RhcnRpbmcgb2Zmc2V0IGluIHRoZSB0YWJsZSAob3IgZmlsZSBpZiB0YWcgPT0gMCkuCi0gICoKLSAgKiBAb3V0cHV0OgotICAqICAgYnVmZmVyIDo6Ci0gICogICAgIFRoZSB0YXJnZXQgYnVmZmVyIGFkZHJlc3MuICBUaGUgY2xpZW50IG11c3QgZW5zdXJlIHRoYXQgdGhlIG1lbW9yeQotICAqICAgICBhcnJheSBpcyBiaWcgZW5vdWdoIHRvIGhvbGQgdGhlIGRhdGEuCi0gICoKLSAgKiBAaW5vdXQ6Ci0gICogICBsZW5ndGggOjoKLSAgKiAgICAgSWYgdGhlIGBsZW5ndGgnIHBhcmFtZXRlciBpcyBOVUxMLCB0aGVuIHRyeSB0byBsb2FkIHRoZSB3aG9sZSB0YWJsZS4KLSAgKiAgICAgUmV0dXJuIGFuIGVycm9yIGNvZGUgaWYgaXQgZmFpbHMuCi0gICoKLSAgKiAgICAgRWxzZSwgaWYgYCpsZW5ndGgnIGlzfjAsIGV4aXQgaW1tZWRpYXRlbHkgd2hpbGUgcmV0dXJuaW5nIHRoZQotICAqICAgICB0YWJsZSdzIChvciBmaWxlKSBmdWxsIHNpemUgaW4gaXQuCi0gICoKLSAgKiAgICAgRWxzZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgdGFibGUgb3IgZmlsZSwgZnJvbSB0aGUKLSAgKiAgICAgc3RhcnRpbmcgb2Zmc2V0LgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIElmIHlvdSBuZWVkIHRvIGRldGVybWluZSB0aGUgdGFibGUncyBsZW5ndGggeW91IHNob3VsZCBmaXJzdCBjYWxsIHRoaXMKLSAgKiAgIGZ1bmN0aW9uIHdpdGggYCpsZW5ndGgnIHNldCB0b34wLCBhcyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6Ci0gICoKLSAgKiAgICAgewotICAqICAgICAgIEZUX1VMb25nICBsZW5ndGggPSAwOwotICAqCi0gICoKLSAgKiAgICAgICBlcnJvciA9IEZUX0xvYWRfU2ZudF9UYWJsZSggZmFjZSwgdGFnLCAwLCBOVUxMLCAmbGVuZ3RoICk7Ci0gICogICAgICAgaWYgKCBlcnJvciApIHsgLi4uIHRhYmxlIGRvZXMgbm90IGV4aXN0IC4uLiB9Ci0gICoKLSAgKiAgICAgICBidWZmZXIgPSBtYWxsb2MoIGxlbmd0aCApOwotICAqICAgICAgIGlmICggYnVmZmVyID09IE5VTEwgKSB7IC4uLiBub3QgZW5vdWdoIG1lbW9yeSAuLi4gfQotICAqCi0gICogICAgICAgZXJyb3IgPSBGVF9Mb2FkX1NmbnRfVGFibGUoIGZhY2UsIHRhZywgMCwgYnVmZmVyLCAmbGVuZ3RoICk7Ci0gICogICAgICAgaWYgKCBlcnJvciApIHsgLi4uIGNvdWxkIG5vdCBsb2FkIHRhYmxlIC4uLiB9Ci0gICogICAgIH0KLSAgKgotICAqICAgTm90ZSB0aGF0IHN0cnVjdHVyZXMgbGlrZSBAVFRfSGVhZGVyIG9yIEBUVF9PUzIgY2FuJ3QgYmUgdXNlZCB3aXRoCi0gICogICB0aGlzIGZ1bmN0aW9uOyB0aGV5IGFyZSBsaW1pdGVkIHRvIEBGVF9HZXRfU2ZudF9UYWJsZS4gIFJlYXNvbiBpcyB0aGF0Ci0gICogICB0aG9zZSBzdHJ1Y3R1cmVzIGRlcGVuZCBvbiB0aGUgcHJvY2Vzc29yIGFyY2hpdGVjdHVyZSwgd2l0aCB2YXJ5aW5nCi0gICogICBzaXplIChlLmcuIDMyYml0IHZzLiA2NGJpdCkgb3Igb3JkZXIgKGJpZyBlbmRpYW4gdnMuIGxpdHRsZSBlbmRpYW4pLgotICAqCi0gICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9Mb2FkX1NmbnRfVGFibGUoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHRhZywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIGxlbmd0aCApOwotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgIEZUX1NmbnRfVGFibGVfSW5mbwotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgUmV0dXJuIGluZm9ybWF0aW9uIG9uIGFuIFNGTlQgdGFibGUuCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICBmYWNlIDo6Ci0gICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZS4KLSAgKgotICAqICAgdGFibGVfaW5kZXggOjoKLSAgKiAgICAgVGhlIGluZGV4IG9mIGFuIFNGTlQgdGFibGUuICBUaGUgZnVuY3Rpb24gcmV0dXJucwotICAqICAgICBGVF9FcnJfVGFibGVfTWlzc2luZyBmb3IgYW4gaW52YWxpZCB2YWx1ZS4KLSAgKgotICAqIEBpbm91dDoKLSAgKiAgIHRhZyA6OgotICAqICAgICBUaGUgbmFtZSB0YWcgb2YgdGhlIFNGTlQgdGFibGUuICBJZiB0aGUgdmFsdWUgaXMgTlVMTCwgYHRhYmxlX2luZGV4JwotICAqICAgICBpcyBpZ25vcmVkLCBhbmQgYGxlbmd0aCcgcmV0dXJucyB0aGUgbnVtYmVyIG9mIFNGTlQgdGFibGVzIGluIHRoZQotICAqICAgICBmb250LgotICAqCi0gICogQG91dHB1dDoKLSAgKiAgIGxlbmd0aCA6OgotICAqICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBTRk5UIHRhYmxlIChvciB0aGUgbnVtYmVyIG9mIFNGTlQgdGFibGVzLCBkZXBlbmRpbmcKLSAgKiAgICAgb24gYHRhZycpLgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFdoaWxlIHBhcnNpbmcgZm9udHMsIEZyZWVUeXBlIGhhbmRsZXMgU0ZOVCB0YWJsZXMgd2l0aCBsZW5ndGggemVybyBhcwotICAqICAgbWlzc2luZy4KLSAgKgotICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU2ZudF9UYWJsZV9JbmZvKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICB0YWJsZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgKnRhZywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgKmxlbmd0aCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0NNYXBfTGFuZ3VhZ2VfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIFRydWVUeXBlL3NmbnQgc3BlY2lmaWMgY21hcCBsYW5ndWFnZSBJRC4gIERlZmluaXRpb25zIG9mICAgICovCi0gIC8qICAgIGxhbmd1YWdlIElEIHZhbHVlcyBhcmUgaW4gYHR0bmFtZWlkLmgnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJtYXAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSB0YXJnZXQgY2hhcm1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbGFuZ3VhZ2UgSUQgb2YgYGNoYXJtYXAnLiAgSWYgYGNoYXJtYXAnIGRvZXNuJ3QgYmVsb25nIHRvIGEgICAgKi8KLSAgLyogICAgVHJ1ZVR5cGUvc2ZudCBmYWNlLCBqdXN0IHJldHVybn4wIGFzIHRoZSBkZWZhdWx0IHZhbHVlLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGb3IgYSBmb3JtYXR+MTQgY21hcCAodG8gYWNjZXNzIFVuaWNvZGUgSVZTKSwgdGhlIHJldHVybiB2YWx1ZSBpcyAgKi8KLSAgLyogICAgMHhGRkZGRkZGRi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX1VMb25nICkKLSAgRlRfR2V0X0NNYXBfTGFuZ3VhZ2VfSUQoIEZUX0NoYXJNYXAgIGNoYXJtYXAgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9DTWFwX0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiBUcnVlVHlwZS9zZm50IHNwZWNpZmljIGNtYXAgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJtYXAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSB0YXJnZXQgY2hhcm1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZm9ybWF0IG9mIGBjaGFybWFwJy4gIElmIGBjaGFybWFwJyBkb2Vzbid0IGJlbG9uZyB0byBhICAgICAgICAgKi8KLSAgLyogICAgVHJ1ZVR5cGUvc2ZudCBmYWNlLCByZXR1cm4gLTEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0xvbmcgKQotICBGVF9HZXRfQ01hcF9Gb3JtYXQoIEZUX0NoYXJNYXAgIGNoYXJtYXAgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fVFRUQUJMRVNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL3R0dGFncy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS90dHRhZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU5YWExOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL3R0dGFncy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0dGFncy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUYWdzIGZvciBUcnVlVHlwZSBhbmQgT3BlblR5cGUgdGFibGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDA0LCAyMDA1LCAyMDA3LCAyMDA4LCAyMDEzIGJ5ICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1RUQUdTX0hfXwotI2RlZmluZSBfX1RUQUdTX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0jZGVmaW5lIFRUQUdfYXZhciAgRlRfTUFLRV9UQUcoICdhJywgJ3YnLCAnYScsICdyJyApCi0jZGVmaW5lIFRUQUdfQkFTRSAgRlRfTUFLRV9UQUcoICdCJywgJ0EnLCAnUycsICdFJyApCi0jZGVmaW5lIFRUQUdfYmRhdCAgRlRfTUFLRV9UQUcoICdiJywgJ2QnLCAnYScsICd0JyApCi0jZGVmaW5lIFRUQUdfQkRGICAgRlRfTUFLRV9UQUcoICdCJywgJ0QnLCAnRicsICcgJyApCi0jZGVmaW5lIFRUQUdfYmhlZCAgRlRfTUFLRV9UQUcoICdiJywgJ2gnLCAnZScsICdkJyApCi0jZGVmaW5lIFRUQUdfYmxvYyAgRlRfTUFLRV9UQUcoICdiJywgJ2wnLCAnbycsICdjJyApCi0jZGVmaW5lIFRUQUdfYnNsbiAgRlRfTUFLRV9UQUcoICdiJywgJ3MnLCAnbCcsICduJyApCi0jZGVmaW5lIFRUQUdfQ0JEVCAgRlRfTUFLRV9UQUcoICdDJywgJ0InLCAnRCcsICdUJyApCi0jZGVmaW5lIFRUQUdfQ0JMQyAgRlRfTUFLRV9UQUcoICdDJywgJ0InLCAnTCcsICdDJyApCi0jZGVmaW5lIFRUQUdfQ0ZGICAgRlRfTUFLRV9UQUcoICdDJywgJ0YnLCAnRicsICcgJyApCi0jZGVmaW5lIFRUQUdfQ0lEICAgRlRfTUFLRV9UQUcoICdDJywgJ0knLCAnRCcsICcgJyApCi0jZGVmaW5lIFRUQUdfY21hcCAgRlRfTUFLRV9UQUcoICdjJywgJ20nLCAnYScsICdwJyApCi0jZGVmaW5lIFRUQUdfY3ZhciAgRlRfTUFLRV9UQUcoICdjJywgJ3YnLCAnYScsICdyJyApCi0jZGVmaW5lIFRUQUdfY3Z0ICAgRlRfTUFLRV9UQUcoICdjJywgJ3YnLCAndCcsICcgJyApCi0jZGVmaW5lIFRUQUdfRFNJRyAgRlRfTUFLRV9UQUcoICdEJywgJ1MnLCAnSScsICdHJyApCi0jZGVmaW5lIFRUQUdfRUJEVCAgRlRfTUFLRV9UQUcoICdFJywgJ0InLCAnRCcsICdUJyApCi0jZGVmaW5lIFRUQUdfRUJMQyAgRlRfTUFLRV9UQUcoICdFJywgJ0InLCAnTCcsICdDJyApCi0jZGVmaW5lIFRUQUdfRUJTQyAgRlRfTUFLRV9UQUcoICdFJywgJ0InLCAnUycsICdDJyApCi0jZGVmaW5lIFRUQUdfZmVhdCAgRlRfTUFLRV9UQUcoICdmJywgJ2UnLCAnYScsICd0JyApCi0jZGVmaW5lIFRUQUdfRk9ORCAgRlRfTUFLRV9UQUcoICdGJywgJ08nLCAnTicsICdEJyApCi0jZGVmaW5lIFRUQUdfZnBnbSAgRlRfTUFLRV9UQUcoICdmJywgJ3AnLCAnZycsICdtJyApCi0jZGVmaW5lIFRUQUdfZnZhciAgRlRfTUFLRV9UQUcoICdmJywgJ3YnLCAnYScsICdyJyApCi0jZGVmaW5lIFRUQUdfZ2FzcCAgRlRfTUFLRV9UQUcoICdnJywgJ2EnLCAncycsICdwJyApCi0jZGVmaW5lIFRUQUdfR0RFRiAgRlRfTUFLRV9UQUcoICdHJywgJ0QnLCAnRScsICdGJyApCi0jZGVmaW5lIFRUQUdfZ2x5ZiAgRlRfTUFLRV9UQUcoICdnJywgJ2wnLCAneScsICdmJyApCi0jZGVmaW5lIFRUQUdfR1BPUyAgRlRfTUFLRV9UQUcoICdHJywgJ1AnLCAnTycsICdTJyApCi0jZGVmaW5lIFRUQUdfR1NVQiAgRlRfTUFLRV9UQUcoICdHJywgJ1MnLCAnVScsICdCJyApCi0jZGVmaW5lIFRUQUdfZ3ZhciAgRlRfTUFLRV9UQUcoICdnJywgJ3YnLCAnYScsICdyJyApCi0jZGVmaW5lIFRUQUdfaGRteCAgRlRfTUFLRV9UQUcoICdoJywgJ2QnLCAnbScsICd4JyApCi0jZGVmaW5lIFRUQUdfaGVhZCAgRlRfTUFLRV9UQUcoICdoJywgJ2UnLCAnYScsICdkJyApCi0jZGVmaW5lIFRUQUdfaGhlYSAgRlRfTUFLRV9UQUcoICdoJywgJ2gnLCAnZScsICdhJyApCi0jZGVmaW5lIFRUQUdfaG10eCAgRlRfTUFLRV9UQUcoICdoJywgJ20nLCAndCcsICd4JyApCi0jZGVmaW5lIFRUQUdfSlNURiAgRlRfTUFLRV9UQUcoICdKJywgJ1MnLCAnVCcsICdGJyApCi0jZGVmaW5lIFRUQUdfanVzdCAgRlRfTUFLRV9UQUcoICdqJywgJ3UnLCAncycsICd0JyApCi0jZGVmaW5lIFRUQUdfa2VybiAgRlRfTUFLRV9UQUcoICdrJywgJ2UnLCAncicsICduJyApCi0jZGVmaW5lIFRUQUdfbGNhciAgRlRfTUFLRV9UQUcoICdsJywgJ2MnLCAnYScsICdyJyApCi0jZGVmaW5lIFRUQUdfbG9jYSAgRlRfTUFLRV9UQUcoICdsJywgJ28nLCAnYycsICdhJyApCi0jZGVmaW5lIFRUQUdfTFRTSCAgRlRfTUFLRV9UQUcoICdMJywgJ1QnLCAnUycsICdIJyApCi0jZGVmaW5lIFRUQUdfTFdGTiAgRlRfTUFLRV9UQUcoICdMJywgJ1cnLCAnRicsICdOJyApCi0jZGVmaW5lIFRUQUdfTUFUSCAgRlRfTUFLRV9UQUcoICdNJywgJ0EnLCAnVCcsICdIJyApCi0jZGVmaW5lIFRUQUdfbWF4cCAgRlRfTUFLRV9UQUcoICdtJywgJ2EnLCAneCcsICdwJyApCi0jZGVmaW5lIFRUQUdfTUVUQSAgRlRfTUFLRV9UQUcoICdNJywgJ0UnLCAnVCcsICdBJyApCi0jZGVmaW5lIFRUQUdfTU1GWCAgRlRfTUFLRV9UQUcoICdNJywgJ00nLCAnRicsICdYJyApCi0jZGVmaW5lIFRUQUdfTU1TRCAgRlRfTUFLRV9UQUcoICdNJywgJ00nLCAnUycsICdEJyApCi0jZGVmaW5lIFRUQUdfbW9ydCAgRlRfTUFLRV9UQUcoICdtJywgJ28nLCAncicsICd0JyApCi0jZGVmaW5lIFRUQUdfbW9yeCAgRlRfTUFLRV9UQUcoICdtJywgJ28nLCAncicsICd4JyApCi0jZGVmaW5lIFRUQUdfbmFtZSAgRlRfTUFLRV9UQUcoICduJywgJ2EnLCAnbScsICdlJyApCi0jZGVmaW5lIFRUQUdfb3BiZCAgRlRfTUFLRV9UQUcoICdvJywgJ3AnLCAnYicsICdkJyApCi0jZGVmaW5lIFRUQUdfT1MyICAgRlRfTUFLRV9UQUcoICdPJywgJ1MnLCAnLycsICcyJyApCi0jZGVmaW5lIFRUQUdfT1RUTyAgRlRfTUFLRV9UQUcoICdPJywgJ1QnLCAnVCcsICdPJyApCi0jZGVmaW5lIFRUQUdfUENMVCAgRlRfTUFLRV9UQUcoICdQJywgJ0MnLCAnTCcsICdUJyApCi0jZGVmaW5lIFRUQUdfUE9TVCAgRlRfTUFLRV9UQUcoICdQJywgJ08nLCAnUycsICdUJyApCi0jZGVmaW5lIFRUQUdfcG9zdCAgRlRfTUFLRV9UQUcoICdwJywgJ28nLCAncycsICd0JyApCi0jZGVmaW5lIFRUQUdfcHJlcCAgRlRfTUFLRV9UQUcoICdwJywgJ3InLCAnZScsICdwJyApCi0jZGVmaW5lIFRUQUdfcHJvcCAgRlRfTUFLRV9UQUcoICdwJywgJ3InLCAnbycsICdwJyApCi0jZGVmaW5lIFRUQUdfc2JpeCAgRlRfTUFLRV9UQUcoICdzJywgJ2InLCAnaScsICd4JyApCi0jZGVmaW5lIFRUQUdfc2ZudCAgRlRfTUFLRV9UQUcoICdzJywgJ2YnLCAnbicsICd0JyApCi0jZGVmaW5lIFRUQUdfU0lORyAgRlRfTUFLRV9UQUcoICdTJywgJ0knLCAnTicsICdHJyApCi0jZGVmaW5lIFRUQUdfdHJhayAgRlRfTUFLRV9UQUcoICd0JywgJ3InLCAnYScsICdrJyApCi0jZGVmaW5lIFRUQUdfdHJ1ZSAgRlRfTUFLRV9UQUcoICd0JywgJ3InLCAndScsICdlJyApCi0jZGVmaW5lIFRUQUdfdHRjICAgRlRfTUFLRV9UQUcoICd0JywgJ3QnLCAnYycsICcgJyApCi0jZGVmaW5lIFRUQUdfdHRjZiAgRlRfTUFLRV9UQUcoICd0JywgJ3QnLCAnYycsICdmJyApCi0jZGVmaW5lIFRUQUdfVFlQMSAgRlRfTUFLRV9UQUcoICdUJywgJ1knLCAnUCcsICcxJyApCi0jZGVmaW5lIFRUQUdfdHlwMSAgRlRfTUFLRV9UQUcoICd0JywgJ3knLCAncCcsICcxJyApCi0jZGVmaW5lIFRUQUdfVkRNWCAgRlRfTUFLRV9UQUcoICdWJywgJ0QnLCAnTScsICdYJyApCi0jZGVmaW5lIFRUQUdfdmhlYSAgRlRfTUFLRV9UQUcoICd2JywgJ2gnLCAnZScsICdhJyApCi0jZGVmaW5lIFRUQUdfdm10eCAgRlRfTUFLRV9UQUcoICd2JywgJ20nLCAndCcsICd4JyApCi0jZGVmaW5lIFRUQUdfd09GRiAgRlRfTUFLRV9UQUcoICd3JywgJ08nLCAnRicsICdGJyApCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19UVEFHU19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvdHR1bnBhdC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS90dHVucGF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNTNkZGQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS90dHVucGF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dHVucGF0LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRGVmaW5pdGlvbnMgZm9yIHRoZSB1bnBhdGVudGVkIFRydWVUeXBlIGhpbnRpbmcgc3lzdGVtICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMsIDIwMDYgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV3JpdHRlbiBieSBHcmFoYW0gQXNoZXIgPGdyYWhhbS5hc2hlckBidGludGVybmV0LmNvbT4gICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1RUVU5QQVRfSF9fCi0jZGVmaW5lIF9fVFRVTlBBVF9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBjb25zdGFudDoKLSAgKiAgIEZUX1BBUkFNX1RBR19VTlBBVEVOVEVEX0hJTlRJTkcKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgIEEgY29uc3RhbnQgdXNlZCBhcyB0aGUgdGFnIG9mIGFuIEBGVF9QYXJhbWV0ZXIgc3RydWN0dXJlIHRvIGluZGljYXRlCi0gICogICB0aGF0IHVucGF0ZW50ZWQgbWV0aG9kcyBvbmx5IHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBUcnVlVHlwZSBieXRlY29kZQotICAqICAgaW50ZXJwcmV0ZXIgZm9yIGEgdHlwZWZhY2Ugb3BlbmVkIGJ5IEBGVF9PcGVuX0ZhY2UuCi0gICoKLSAgKi8KLSNkZWZpbmUgRlRfUEFSQU1fVEFHX1VOUEFURU5URURfSElOVElORyAgRlRfTUFLRV9UQUcoICd1JywgJ24nLCAncCcsICdhJyApCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIF9fVFRVTlBBVF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL0phbWZpbGUgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9KYW1maWxlCmluZGV4IDgzMmU4YjguLmUzOWZiMDkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL0phbWZpbGUKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvSmFtZmlsZQpAQCAtMSw2ICsxLDYgQEAKICMgRnJlZVR5cGUgMiBzcmMvYmFzZSBKYW1maWxlCiAjCi0jIENvcHlyaWdodCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5IGJ5CisjIENvcHlyaWdodCAyMDAxLTIwMTUgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApAQCAtMTcsMTAgKzE3LDE5IEBACiAKICAgaWYgJChGVDJfTVVMVEkpCiAgIHsKLSAgICBfc291cmNlcyA9IGZ0YWR2YW5jIGZ0Y2FsYyAgIGZ0ZGJnbWVtIGZ0Z2xvYWRyCi0gICAgICAgICAgICAgICBmdG9ianMgICBmdG91dGxuICBmdHJmb3JrICBmdHNuYW1lcwotICAgICAgICAgICAgICAgZnRzdHJlYW0gZnR0cmlnb24gZnR1dGlsCi0gICAgICAgICAgICAgICBiYXNlcGljICBmdHBpYworICAgIF9zb3VyY2VzID0gYmFzZXBpYworICAgICAgICAgICAgICAgZnRhZHZhbmMKKyAgICAgICAgICAgICAgIGZ0Y2FsYworICAgICAgICAgICAgICAgZnRkYmdtZW0KKyAgICAgICAgICAgICAgIGZ0Z2xvYWRyCisgICAgICAgICAgICAgICBmdG9ianMKKyAgICAgICAgICAgICAgIGZ0b3V0bG4KKyAgICAgICAgICAgICAgIGZ0cGljCisgICAgICAgICAgICAgICBmdHJmb3JrCisgICAgICAgICAgICAgICBmdHNuYW1lcworICAgICAgICAgICAgICAgZnRzdHJlYW0KKyAgICAgICAgICAgICAgIGZ0dHJpZ29uCisgICAgICAgICAgICAgICBmdHV0aWwKICAgICAgICAgICAgICAgIDsKICAgfQogICBlbHNlCkBAIC0zNCwxMyArNDMsMzEgQEAKICMgQWRkIHRoZSBvcHRpb25hbC9yZXBsYWNlYWJsZSBmaWxlcy4KICMKIHsKLSAgbG9jYWwgIF9zb3VyY2VzID0gYmJveCAgIGJkZiAgICBiaXRtYXAgZGVidWcgIGdhc3AKLSAgICAgICAgICAgICAgICAgICAgZ2x5cGggIGd4dmFsICBpbml0ICAgbGNkZmlsIG1tCi0gICAgICAgICAgICAgICAgICAgIG90dmFsICBwZnIgICAgc3Ryb2tlIHN5bnRoICBzeXN0ZW0KLSAgICAgICAgICAgICAgICAgICAgdHlwZTEgIHdpbmZudCB4Zjg2ICAgcGF0ZW50CisgIGxvY2FsICBfc291cmNlcyA9IGZ0YXBpCisgICAgICAgICAgICAgICAgICAgIGZ0YmJveAorICAgICAgICAgICAgICAgICAgICBmdGJkZgorICAgICAgICAgICAgICAgICAgICBmdGJpdG1hcAorICAgICAgICAgICAgICAgICAgICBmdGNpZAorICAgICAgICAgICAgICAgICAgICBmdGRlYnVnCisgICAgICAgICAgICAgICAgICAgIGZ0Zm50Zm10CisgICAgICAgICAgICAgICAgICAgIGZ0ZnN0eXBlCisgICAgICAgICAgICAgICAgICAgIGZ0Z2FzcAorICAgICAgICAgICAgICAgICAgICBmdGdseXBoCisgICAgICAgICAgICAgICAgICAgIGZ0Z3h2YWwKKyAgICAgICAgICAgICAgICAgICAgZnRpbml0CisgICAgICAgICAgICAgICAgICAgIGZ0bGNkZmlsCisgICAgICAgICAgICAgICAgICAgIGZ0bW0KKyAgICAgICAgICAgICAgICAgICAgZnRvdHZhbAorICAgICAgICAgICAgICAgICAgICBmdHBhdGVudAorICAgICAgICAgICAgICAgICAgICBmdHBmcgorICAgICAgICAgICAgICAgICAgICBmdHN0cm9rZQorICAgICAgICAgICAgICAgICAgICBmdHN5bnRoCisgICAgICAgICAgICAgICAgICAgIGZ0c3lzdGVtCisgICAgICAgICAgICAgICAgICAgIGZ0dHlwZTEKKyAgICAgICAgICAgICAgICAgICAgZnR3aW5mbnQKICAgICAgICAgICAgICAgICAgICAgOwogCi0gIExpYnJhcnkgICQoRlQyX0xJQikgOiBmdCQoX3NvdXJjZXMpLmMgOworICBMaWJyYXJ5ICAkKEZUMl9MSUIpIDogJChfc291cmNlcykuYyA7CiB9CiAKICMgQWRkIE1hY2ludG9zaC1zcGVjaWZpYyBmaWxlIHRvIHRoZSBsaWJyYXJ5IHdoZW4gbmVjZXNzYXJ5LgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvYmFzZXBpYy5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvYmFzZXBpYy5jCmluZGV4IGFlYjZmZDUuLjk4NTBlZDkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Jhc2VwaWMuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9iYXNlcGljLmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgZm9yIGJhc2UuICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDksIDIwMTIsIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDA5LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBPcmFuIEFncmEgYW5kIE1pY2tleSBHYWJlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Jhc2VwaWMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Jhc2VwaWMuaAppbmRleCAzMjlkN2M4Li5jNWQ3Y2JmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9iYXNlcGljLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvYmFzZXBpYy5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFRoZSBGcmVlVHlwZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHNlcnZpY2VzIGZvciBiYXNlLiAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwOS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC0yMCwxMCArMjAsOSBAQAogI2RlZmluZSBfX0JBU0VQSUNfSF9fCiAKIAotRlRfQkVHSU5fSEVBREVSCi0KICNpbmNsdWRlIEZUX0lOVEVSTkFMX1BJQ19ICiAKKwogI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwogCiAjZGVmaW5lIEZUX09VVExJTkVfR0xZUEhfQ0xBU1NfR0VUICAmZnRfb3V0bGluZV9nbHlwaF9jbGFzcwpAQCAtNDMsNiArNDIsOCBAQAogI2VuZGlmCiAKIAorRlRfQkVHSU5fSEVBREVSCisKICAgdHlwZWRlZiBzdHJ1Y3QgIEJhc2VQSUNfCiAgIHsKICAgICBGVF9Nb2R1bGVfQ2xhc3MqKiAgZGVmYXVsdF9tb2R1bGVfY2xhc3NlczsKQEAgLTc4LDEyICs3OSwxMiBAQAogICBGVF9FcnJvcgogICBmdF9iYXNlX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7CiAKK0ZUX0VORF9IRUFERVIKKwogI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCiAKICAgLyogKi8KIAotRlRfRU5EX0hFQURFUgotCiAjZW5kaWYgLyogX19CQVNFUElDX0hfXyAqLwogCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0YWR2YW5jLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGFkdmFuYy5jCmluZGV4IDE4ODg0ZWYuLmYxMjkwOGYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0YWR2YW5jLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRhZHZhbmMuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBRdWljayBjb21wdXRhdGlvbiBvZiBhZHZhbmNlIHdpZHRocyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOCwgMjAwOSwgMjAxMSwgMjAxMywgMjAxNCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDgtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRhcGkuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0YXBpLmMKaW5kZXggODkxNGQxZi4uZjIyYTE4MSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRhcGkuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGFwaS5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFRoZSBGcmVlVHlwZSBjb21wYXRpYmlsaXR5IGZ1bmN0aW9ucyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwMi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGJhc2UuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0YmFzZS5jCmluZGV4IDVlNWQ3MGUuLjI1M2RmYjcgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0YmFzZS5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0YmFzZS5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFNpbmdsZSBvYmplY3QgbGlicmFyeSBjb21wb25lbnQgKGJvZHkgb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgYnkgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGJhc2UuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0YmFzZS5oCmluZGV4IDUxYTFkYjEuLmUzN2ZlZmEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0YmFzZS5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0YmFzZS5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFRoZSBGcmVlVHlwZSBwcml2YXRlIGZ1bmN0aW9ucyB1c2VkIGluIGJhc2UgbW9kdWxlIChzcGVjaWZpY2F0aW9uKS4gICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA4LCAyMDEwIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwOC0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgV2VybmVyIExlbWJlcmcsIGFuZCBzdXp1a2kgdG9zaGl5YS4gICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC0yNyw2ICsyNywxMSBAQAogRlRfQkVHSU5fSEVBREVSCiAKIAorICAvKiBNYWNPUyByZXNvdXJjZSBmb3JrIGNhbm5vdCBleGNlZWQgMTZNQiBhdCBsZWFzdCBmb3IgQ2FyYm9uIGNvZGU7ICovCisgIC8qIHNlZSBodHRwczovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9lbi11cy9rYi8xMzA0MzcgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfTUFDX1JGT1JLX01BWF9MRU4gIDB4MDBGRkZGRkZVTAorCisKICAgLyogQXNzdW1lIHRoZSBzdHJlYW0gaXMgc2ZudC13cmFwcGVkIFBTIFR5cGUxIG9yIHNmbnQtd3JhcHBlZCBDSUQta2V5ZWQgKi8KICAgLyogZm9udCwgYW5kIHRyeSB0byBsb2FkIGEgZmFjZSBzcGVjaWZpZWQgYnkgdGhlIGZhY2VfaW5kZXguICAgICAgICAgICAgKi8KICAgRlRfTE9DQUwoIEZUX0Vycm9yICkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0YmJveC5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRiYm94LmMKaW5kZXggYzc3NWQ1Yy4uMTBkZjk4ZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRiYm94LmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRiYm94LmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgRnJlZVR5cGUgYmJveCBjb21wdXRhdGlvbiAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMiwgMjAwNCwgMjAwNiwgMjAxMCwgMjAxMywgMjAxNCBieSAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KQEAgLTQyLDIyICs0MiwyMiBAQAogICB9IFRCQm94X1JlYzsKIAogCi0jZGVmaW5lIEZUX1VQREFURV9CQk9YKHAsIGJib3gpICAgICAgIFwKLSAgRlRfQkVHSU5fU1RNTlQgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggcC0+eCA8IGJib3gueE1pbiApICAgICAgICAgICBcCi0gICAgICBiYm94LnhNaW4gPSBwLT54OyAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIHAtPnggPiBiYm94LnhNYXggKSAgICAgICAgICAgXAotICAgICAgYmJveC54TWF4ID0gcC0+eDsgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBwLT55IDwgYmJveC55TWluICkgICAgICAgICAgIFwKLSAgICAgIGJib3gueU1pbiA9IHAtPnk7ICAgICAgICAgICAgICAgXAotICAgIGlmICggcC0+eSA+IGJib3gueU1heCApICAgICAgICAgICBcCi0gICAgICBiYm94LnlNYXggPSBwLT55OyAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgRlRfVVBEQVRFX0JCT1goIHAsIGJib3ggKSBcCisgIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggcC0+eCA8IGJib3gueE1pbiApICAgICAgIFwKKyAgICAgIGJib3gueE1pbiA9IHAtPng7ICAgICAgICAgICBcCisgICAgaWYgKCBwLT54ID4gYmJveC54TWF4ICkgICAgICAgXAorICAgICAgYmJveC54TWF4ID0gcC0+eDsgICAgICAgICAgIFwKKyAgICBpZiAoIHAtPnkgPCBiYm94LnlNaW4gKSAgICAgICBcCisgICAgICBiYm94LnlNaW4gPSBwLT55OyAgICAgICAgICAgXAorICAgIGlmICggcC0+eSA+IGJib3gueU1heCApICAgICAgIFwKKyAgICAgIGJib3gueU1heCA9IHAtPnk7ICAgICAgICAgICBcCiAgIEZUX0VORF9TVE1OVAogCi0jZGVmaW5lIENIRUNLX1goIHAsIGJib3ggKSAgXAorI2RlZmluZSBDSEVDS19YKCBwLCBiYm94ICkgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICggcC0+eCA8IGJib3gueE1pbiB8fCBwLT54ID4gYmJveC54TWF4ICkKIAotI2RlZmluZSBDSEVDS19ZKCBwLCBiYm94ICkgIFwKKyNkZWZpbmUgQ0hFQ0tfWSggcCwgYmJveCApICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAoIHAtPnkgPCBiYm94LnlNaW4gfHwgcC0+eSA+IGJib3gueU1heCApCiAKIApAQCAtMjU1LDYgKzI1NSw3IEBACiAgICAgRlRfUG9zICBwZWFrID0gMDsKICAgICBGVF9JbnQgIHNoaWZ0OwogCisKICAgICAvKiBUaGlzIGZ1bmN0aW9uIGZpbmRzIGEgcGVhayBvZiBhIGN1YmljIHNlZ21lbnQgaWYgaXQgaXMgYWJvdmUgMCAgICAqLwogICAgIC8qIHVzaW5nIGl0ZXJhdGl2ZSBiaXNlY3Rpb24gb2YgdGhlIHNlZ21lbnQsIG9yIHJldHVybnMgMC4gICAgICAgICAgICovCiAgICAgLyogVGhlIGZpeGVkLXBvaW50IGFyaXRobWV0aWMgb2YgYmlzZWN0aW9uIGlzIGluaGVyZW50bHkgc3RhYmxlICAgICAgKi8KQEAgLTI2NCw4ICsyNjUsMTAgQEAKICAgICAvKiBJdCBpcyBjYWxsZWQgd2l0aCBlaXRoZXIgcTIgb3IgcTMgcG9zaXRpdmUsIHdoaWNoIGlzIG5lY2Vzc2FyeSAgICAqLwogICAgIC8qIGZvciB0aGUgcGVhayB0byBleGlzdCBhbmQgYXZvaWRzIHVuZGVmaW5lZCBGVF9NU0IuICAgICAgICAgICAgICAgICovCiAKLSAgICBzaGlmdCA9IDI3IC0KLSAgICAgIEZUX01TQiggRlRfQUJTKCBxMSApIHwgRlRfQUJTKCBxMiApIHwgRlRfQUJTKCBxMyApIHwgRlRfQUJTKCBxNCApICk7CisgICAgc2hpZnQgPSAyNyAtIEZUX01TQiggKEZUX1VJbnQzMikoIEZUX0FCUyggcTEgKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0FCUyggcTIgKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0FCUyggcTMgKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0FCUyggcTQgKSApICk7CiAKICAgICBpZiAoIHNoaWZ0ID4gMCApCiAgICAgewpAQCAtNDE5LDcgKzQyMiw4IEBACiAgICAgcmV0dXJuIDA7CiAgIH0KIAotRlRfREVGSU5FX09VVExJTkVfRlVOQ1MoYmJveF9pbnRlcmZhY2UsCisKKyAgRlRfREVGSU5FX09VVExJTkVfRlVOQ1MoYmJveF9pbnRlcmZhY2UsCiAgICAgKEZUX091dGxpbmVfTW92ZVRvX0Z1bmMpIEJCb3hfTW92ZV9UbywKICAgICAoRlRfT3V0bGluZV9MaW5lVG9fRnVuYykgQkJveF9MaW5lX1RvLAogICAgIChGVF9PdXRsaW5lX0NvbmljVG9fRnVuYylCQm94X0NvbmljX1RvLApAQCAtNDI3LDE0ICs0MzEsMTcgQEAKICAgICAwLCAwCiAgICkKIAorCiAgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRiYm94LmggKi8KIAogICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCiAgIEZUX091dGxpbmVfR2V0X0JCb3goIEZUX091dGxpbmUqICBvdXRsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICBGVF9CQm94ICAgICAqYWJib3ggKQogICB7Ci0gICAgRlRfQkJveCAgICAgY2JveCA9IHsgMHg3RkZGRkZGRiwgMHg3RkZGRkZGRiwgLTB4N0ZGRkZGRkYsIC0weDdGRkZGRkZGIH07Ci0gICAgRlRfQkJveCAgICAgYmJveCA9IHsgMHg3RkZGRkZGRiwgMHg3RkZGRkZGRiwgLTB4N0ZGRkZGRkYsIC0weDdGRkZGRkZGIH07CisgICAgRlRfQkJveCAgICAgY2JveCA9IHsgIDB4N0ZGRkZGRkZMLCAgMHg3RkZGRkZGRkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgLTB4N0ZGRkZGRkZMLCAtMHg3RkZGRkZGRkwgfTsKKyAgICBGVF9CQm94ICAgICBiYm94ID0geyAgMHg3RkZGRkZGRkwsICAweDdGRkZGRkZGTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAtMHg3RkZGRkZGRkwsIC0weDdGRkZGRkZGTCB9OwogICAgIEZUX1ZlY3RvciogIHZlYzsKICAgICBGVF9VU2hvcnQgICBuOwogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGJkZi5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRiZGYuYwppbmRleCBkOWRjYmFkLi5hYTcyZGRjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGJkZi5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0YmRmLmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgRnJlZVR5cGUgQVBJIGZvciBhY2Nlc3NpbmcgQkRGLXNwZWNpZmljIHN0cmluZ3MgKGJvZHkpLiAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAwNCwgMjAxMywgMjAxNCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAyLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0Yml0bWFwLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGJpdG1hcC5jCmluZGV4IDVkZDMzYTIuLmE1NDU3MmEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0Yml0bWFwLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRiaXRtYXAuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBGcmVlVHlwZSB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgYml0bWFwcyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDA5LCAyMDExLCAyMDEzLCAyMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDQtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtMzEsNiArMzEsMTYgQEAKICAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGJpdG1hcC5oICovCiAKICAgRlRfRVhQT1JUX0RFRiggdm9pZCApCisgIEZUX0JpdG1hcF9Jbml0KCBGVF9CaXRtYXAgICphYml0bWFwICkKKyAgeworICAgIGlmICggYWJpdG1hcCApCisgICAgICAqYWJpdG1hcCA9IG51bGxfYml0bWFwOworICB9CisKKworICAvKiBkZXByZWNhdGVkIGZ1bmN0aW9uIG5hbWU7IHJldGFpbmVkIGZvciBBQkkgY29tcGF0aWJpbGl0eSAqLworCisgIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQogICBGVF9CaXRtYXBfTmV3KCBGVF9CaXRtYXAgICphYml0bWFwICkKICAgewogICAgIGlmICggYWJpdG1hcCApCkBAIC0xMTcsNyArMTI3LDcgQEAKICAgICAgICAgRlRfQnl0ZSogIHQgPSB0YXJnZXQtPmJ1ZmZlcjsKIAogCi0gICAgICAgIHQgKz0gcGl0Y2ggKiAoIHRhcmdldC0+cm93cyAtIDEgKTsKKyAgICAgICAgdCArPSAoRlRfVUxvbmcpcGl0Y2ggKiAoIHRhcmdldC0+cm93cyAtIDEgKTsKIAogICAgICAgICBmb3IgKCBpID0gdGFyZ2V0LT5yb3dzOyBpID4gMDsgaS0tICkKICAgICAgICAgewpAQCAtMTYwLDIxICsxNzAsMjEgQEAKICAgICB7CiAgICAgY2FzZSBGVF9QSVhFTF9NT0RFX01PTk86CiAgICAgICBicHAgICAgICAgPSAxOwotICAgICAgbmV3X3BpdGNoID0gKCB3aWR0aCArIHhwaXhlbHMgKyA3ICkgPj4gMzsKKyAgICAgIG5ld19waXRjaCA9IChpbnQpKCAoIHdpZHRoICsgeHBpeGVscyArIDcgKSA+PiAzICk7CiAgICAgICBicmVhazsKICAgICBjYXNlIEZUX1BJWEVMX01PREVfR1JBWTI6CiAgICAgICBicHAgICAgICAgPSAyOwotICAgICAgbmV3X3BpdGNoID0gKCB3aWR0aCArIHhwaXhlbHMgKyAzICkgPj4gMjsKKyAgICAgIG5ld19waXRjaCA9IChpbnQpKCAoIHdpZHRoICsgeHBpeGVscyArIDMgKSA+PiAyICk7CiAgICAgICBicmVhazsKICAgICBjYXNlIEZUX1BJWEVMX01PREVfR1JBWTQ6CiAgICAgICBicHAgICAgICAgPSA0OwotICAgICAgbmV3X3BpdGNoID0gKCB3aWR0aCArIHhwaXhlbHMgKyAxICkgPj4gMTsKKyAgICAgIG5ld19waXRjaCA9IChpbnQpKCAoIHdpZHRoICsgeHBpeGVscyArIDEgKSA+PiAxICk7CiAgICAgICBicmVhazsKICAgICBjYXNlIEZUX1BJWEVMX01PREVfR1JBWToKICAgICBjYXNlIEZUX1BJWEVMX01PREVfTENEOgogICAgIGNhc2UgRlRfUElYRUxfTU9ERV9MQ0RfVjoKICAgICAgIGJwcCAgICAgICA9IDg7Ci0gICAgICBuZXdfcGl0Y2ggPSAoIHdpZHRoICsgeHBpeGVscyApOworICAgICAgbmV3X3BpdGNoID0gKGludCkoIHdpZHRoICsgeHBpeGVscyApOwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9HbHlwaF9Gb3JtYXQgKTsKQEAgLTE4NCw3ICsxOTQsNyBAQAogICAgIGlmICggeXBpeGVscyA9PSAwICYmIG5ld19waXRjaCA8PSBwaXRjaCApCiAgICAgewogICAgICAgLyogemVybyB0aGUgcGFkZGluZyAqLwotICAgICAgRlRfVUludCAgYml0X3dpZHRoID0gcGl0Y2ggKiA4OworICAgICAgRlRfVUludCAgYml0X3dpZHRoID0gKEZUX1VJbnQpcGl0Y2ggKiA4OwogICAgICAgRlRfVUludCAgYml0X2xhc3QgID0gKCB3aWR0aCArIHhwaXhlbHMgKSAqIGJwcDsKIAogCkBAIC0yMjcsOCArMjM3LDkgQEAKIAogCiAgICAgICBmb3IgKCBpID0gMDsgaSA8IGJpdG1hcC0+cm93czsgaSsrICkKLSAgICAgICAgRlRfTUVNX0NPUFkoIGJ1ZmZlciArIG5ld19waXRjaCAqICggeXBpeGVscyArIGkgKSwKLSAgICAgICAgICAgICAgICAgICAgIGJpdG1hcC0+YnVmZmVyICsgcGl0Y2ggKiBpLCBsZW4gKTsKKyAgICAgICAgRlRfTUVNX0NPUFkoIGJ1ZmZlciArIChGVF9VSW50KW5ld19waXRjaCAqICggeXBpeGVscyArIGkgKSwKKyAgICAgICAgICAgICAgICAgICAgIGJpdG1hcC0+YnVmZmVyICsgKEZUX1VJbnQpcGl0Y2ggKiBpLAorICAgICAgICAgICAgICAgICAgICAgbGVuICk7CiAgICAgfQogICAgIGVsc2UKICAgICB7CkBAIC0yMzYsOCArMjQ3LDkgQEAKIAogCiAgICAgICBmb3IgKCBpID0gMDsgaSA8IGJpdG1hcC0+cm93czsgaSsrICkKLSAgICAgICAgRlRfTUVNX0NPUFkoIGJ1ZmZlciArIG5ld19waXRjaCAqIGksCi0gICAgICAgICAgICAgICAgICAgICBiaXRtYXAtPmJ1ZmZlciArIHBpdGNoICogaSwgbGVuICk7CisgICAgICAgIEZUX01FTV9DT1BZKCBidWZmZXIgKyAoRlRfVUludCluZXdfcGl0Y2ggKiBpLAorICAgICAgICAgICAgICAgICAgICAgYml0bWFwLT5idWZmZXIgKyAoRlRfVUludClwaXRjaCAqIGksCisgICAgICAgICAgICAgICAgICAgICBsZW4gKTsKICAgICB9CiAKICAgICBGVF9GUkVFKCBiaXRtYXAtPmJ1ZmZlciApOwpAQCAtMjk1LDcgKzMwNyw3IEBACiAKIAogICAgICAgICAvKiBjb252ZXJ0IHRvIDhicHAgKi8KLSAgICAgICAgRlRfQml0bWFwX05ldyggJnRtcCApOworICAgICAgICBGVF9CaXRtYXBfSW5pdCggJnRtcCApOwogICAgICAgICBlcnJvciA9IEZUX0JpdG1hcF9Db252ZXJ0KCBsaWJyYXJ5LCBiaXRtYXAsICZ0bXAsIDEgKTsKICAgICAgICAgaWYgKCBlcnJvciApCiAgICAgICAgICAgcmV0dXJuIGVycm9yOwpAQCAtMzIzLDcgKzMzNSw4IEBACiAgICAgICByZXR1cm4gRlRfRXJyX09rOwogICAgIH0KIAotICAgIGVycm9yID0gZnRfYml0bWFwX2Fzc3VyZV9idWZmZXIoIGxpYnJhcnktPm1lbW9yeSwgYml0bWFwLCB4c3RyLCB5c3RyICk7CisgICAgZXJyb3IgPSBmdF9iaXRtYXBfYXNzdXJlX2J1ZmZlciggbGlicmFyeS0+bWVtb3J5LCBiaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpeHN0ciwgKEZUX1VJbnQpeXN0ciApOwogICAgIGlmICggZXJyb3IgKQogICAgICAgcmV0dXJuIGVycm9yOwogCkBAIC0zMzQsNyArMzQ3LDcgQEAKICAgICBlbHNlCiAgICAgewogICAgICAgcGl0Y2ggPSAtcGl0Y2g7Ci0gICAgICBwID0gYml0bWFwLT5idWZmZXIgKyBwaXRjaCAqICggYml0bWFwLT5yb3dzIC0gMSApOworICAgICAgcCA9IGJpdG1hcC0+YnVmZmVyICsgKEZUX1VJbnQpcGl0Y2ggKiAoIGJpdG1hcC0+cm93cyAtIDEgKTsKICAgICB9CiAKICAgICAvKiBmb3IgZWFjaCByb3cgKi8KQEAgLTM2Myw3ICszNzYsNyBAQAogICAgICAgICAgICAgICBwW3hdIHw9IHBbeCAtIDFdIDw8ICggOCAtIGkgKTsKIAogI2lmIDAKLSAgICAgICAgICAgIGlmICggcFt4XSA9PSAweGZmICkKKyAgICAgICAgICAgIGlmICggcFt4XSA9PSAweEZGICkKICAgICAgICAgICAgICAgYnJlYWs7CiAjZW5kaWYKICAgICAgICAgICB9CkBAIC00MDcsOCArNDIwLDggQEAKICAgICAgIHAgKz0gYml0bWFwLT5waXRjaDsKICAgICB9CiAKLSAgICBiaXRtYXAtPndpZHRoICs9IHhzdHI7Ci0gICAgYml0bWFwLT5yb3dzICs9IHlzdHI7CisgICAgYml0bWFwLT53aWR0aCArPSAoRlRfVUludCl4c3RyOworICAgIGJpdG1hcC0+cm93cyArPSAoRlRfVUludCl5c3RyOwogCiAgICAgcmV0dXJuIEZUX0Vycl9PazsKICAgfQpAQCAtNTAxLDcgKzUxNCw3IEBACiAgICAgICAgIGlmICggb2xkX3RhcmdldF9waXRjaCA8IDAgKQogICAgICAgICAgIG9sZF90YXJnZXRfcGl0Y2ggPSAtb2xkX3RhcmdldF9waXRjaDsKIAotICAgICAgICBvbGRfc2l6ZSA9IHRhcmdldC0+cm93cyAqIG9sZF90YXJnZXRfcGl0Y2g7CisgICAgICAgIG9sZF9zaXplID0gdGFyZ2V0LT5yb3dzICogKEZUX1VJbnQpb2xkX3RhcmdldF9waXRjaDsKIAogICAgICAgICB0YXJnZXQtPnBpeGVsX21vZGUgPSBGVF9QSVhFTF9NT0RFX0dSQVk7CiAgICAgICAgIHRhcmdldC0+cm93cyAgICAgICA9IHNvdXJjZS0+cm93czsKQEAgLTUxMCwyMCArNTIzLDIwIEBACiAgICAgICAgIHBhZCA9IDA7CiAgICAgICAgIGlmICggYWxpZ25tZW50ID4gMCApCiAgICAgICAgIHsKLSAgICAgICAgICBwYWQgPSBzb3VyY2UtPndpZHRoICUgYWxpZ25tZW50OworICAgICAgICAgIHBhZCA9IChGVF9JbnQpc291cmNlLT53aWR0aCAlIGFsaWdubWVudDsKICAgICAgICAgICBpZiAoIHBhZCAhPSAwICkKICAgICAgICAgICAgIHBhZCA9IGFsaWdubWVudCAtIHBhZDsKICAgICAgICAgfQogCi0gICAgICAgIHRhcmdldF9waXRjaCA9IHNvdXJjZS0+d2lkdGggKyBwYWQ7CisgICAgICAgIHRhcmdldF9waXRjaCA9IChGVF9JbnQpc291cmNlLT53aWR0aCArIHBhZDsKIAotICAgICAgICBpZiAoIHRhcmdldF9waXRjaCA+IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAoRlRfVUxvbmcpdGFyZ2V0LT5yb3dzID4gRlRfVUxPTkdfTUFYIC8gdGFyZ2V0X3BpdGNoICkKKyAgICAgICAgaWYgKCB0YXJnZXRfcGl0Y2ggPiAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgIChGVF9VTG9uZyl0YXJnZXQtPnJvd3MgPiBGVF9VTE9OR19NQVggLyAoRlRfVUxvbmcpdGFyZ2V0X3BpdGNoICkKICAgICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKIAotICAgICAgICBpZiAoIHRhcmdldC0+cm93cyAqIHRhcmdldF9waXRjaCA+IG9sZF9zaXplICAgICAgICAgICAgICAgJiYKKyAgICAgICAgaWYgKCB0YXJnZXQtPnJvd3MgKiAoRlRfVUxvbmcpdGFyZ2V0X3BpdGNoID4gb2xkX3NpemUgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgRlRfUVJFQUxMT0MoIHRhcmdldC0+YnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfc2l6ZSwgdGFyZ2V0LT5yb3dzICogdGFyZ2V0X3BpdGNoICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfc2l6ZSwgdGFyZ2V0LT5yb3dzICogKEZUX1VJbnQpdGFyZ2V0X3BpdGNoICkgKQogICAgICAgICAgIHJldHVybiBlcnJvcjsKIAogICAgICAgICB0YXJnZXQtPnBpdGNoID0gdGFyZ2V0LT5waXRjaCA8IDAgPyAtdGFyZ2V0X3BpdGNoIDogdGFyZ2V0X3BpdGNoOwpAQCAtNTM5LDkgKzU1Miw5IEBACiAKICAgICAvKiB0YWtlIGNhcmUgb2YgYml0bWFwIGZsb3cgKi8KICAgICBpZiAoIHNvdXJjZS0+cGl0Y2ggPCAwICkKLSAgICAgIHMgLT0gc291cmNlLT5waXRjaCAqICggc291cmNlLT5yb3dzIC0gMSApOworICAgICAgcyAtPSBzb3VyY2UtPnBpdGNoICogKEZUX0ludCkoIHNvdXJjZS0+cm93cyAtIDEgKTsKICAgICBpZiAoIHRhcmdldC0+cGl0Y2ggPCAwICkKLSAgICAgIHQgLT0gdGFyZ2V0LT5waXRjaCAqICggdGFyZ2V0LT5yb3dzIC0gMSApOworICAgICAgdCAtPSB0YXJnZXQtPnBpdGNoICogKEZUX0ludCkoIHRhcmdldC0+cm93cyAtIDEgKTsKIAogICAgIHN3aXRjaCAoIHNvdXJjZS0+cGl4ZWxfbW9kZSApCiAgICAgewpAQCAtNjA0LDcgKzYxNyw3IEBACiAgICAgY2FzZSBGVF9QSVhFTF9NT0RFX0xDRDoKICAgICBjYXNlIEZUX1BJWEVMX01PREVfTENEX1Y6CiAgICAgICB7Ci0gICAgICAgIEZUX0ludCAgIHdpZHRoID0gc291cmNlLT53aWR0aDsKKyAgICAgICAgRlRfVUludCAgd2lkdGggPSBzb3VyY2UtPndpZHRoOwogICAgICAgICBGVF9VSW50ICBpOwogCiAKQEAgLTc1Niw3ICs3NjksNyBAQAogICAgICAgRlRfRXJyb3IgICBlcnJvcjsKIAogCi0gICAgICBGVF9CaXRtYXBfTmV3KCAmYml0bWFwICk7CisgICAgICBGVF9CaXRtYXBfSW5pdCggJmJpdG1hcCApOwogICAgICAgZXJyb3IgPSBGVF9CaXRtYXBfQ29weSggc2xvdC0+bGlicmFyeSwgJnNsb3QtPmJpdG1hcCwgJmJpdG1hcCApOwogICAgICAgaWYgKCBlcnJvciApCiAgICAgICAgIHJldHVybiBlcnJvcjsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0Y2FsYy5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRjYWxjLmMKaW5kZXggZjNlZjhjNS4uNjE5YTA4YiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRjYWxjLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRjYWxjLmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgQXJpdGhtZXRpYyBjb21wdXRhdGlvbnMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwNiwgMjAwOCwgMjAxMi0yMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KQEAgLTg2LDggKzg2LDcgQEAKICAgRlRfRVhQT1JUX0RFRiggRlRfRml4ZWQgKQogICBGVF9Sb3VuZEZpeCggRlRfRml4ZWQgIGEgKQogICB7Ci0gICAgcmV0dXJuICggYSA+PSAwICkgPyAgICggYSArIDB4ODAwMEwgKSAmIH4weEZGRkZMCi0gICAgICAgICAgICAgICAgICAgICAgOiAtKCgtYSArIDB4ODAwMEwgKSAmIH4weEZGRkZMICk7CisgICAgcmV0dXJuICggYSArIDB4ODAwMEwgLSAoIGEgPCAwICkgKSAmIH4weEZGRkZMOwogICB9CiAKIApAQCAtOTYsOCArOTUsNyBAQAogICBGVF9FWFBPUlRfREVGKCBGVF9GaXhlZCApCiAgIEZUX0NlaWxGaXgoIEZUX0ZpeGVkICBhICkKICAgewotICAgIHJldHVybiAoIGEgPj0gMCApID8gICAoIGEgKyAweEZGRkZMICkgJiB+MHhGRkZGTAotICAgICAgICAgICAgICAgICAgICAgIDogLSgoLWEgKyAweEZGRkZMICkgJiB+MHhGRkZGTCApOworICAgIHJldHVybiAoIGEgKyAweEZGRkZMICkgJiB+MHhGRkZGTDsKICAgfQogCiAKQEAgLTEwNiw4ICsxMDQsNyBAQAogICBGVF9FWFBPUlRfREVGKCBGVF9GaXhlZCApCiAgIEZUX0Zsb29yRml4KCBGVF9GaXhlZCAgYSApCiAgIHsKLSAgICByZXR1cm4gKCBhID49IDAgKSA/ICAgYSAmIH4weEZGRkZMCi0gICAgICAgICAgICAgICAgICAgICAgOiAtKCgtYSkgJiB+MHhGRkZGTCApOworICAgIHJldHVybiBhICYgfjB4RkZGRkw7CiAgIH0KIAogI2lmbmRlZiBGVF9NU0IKQEAgLTExNSwzMCArMTEyLDMxIEBACiAgIEZUX0JBU0VfREVGICggRlRfSW50ICkKICAgRlRfTVNCKCBGVF9VSW50MzIgeiApCiAgIHsKLSAgICBGVF9JbnQgc2hpZnQgPSAwOworICAgIEZUX0ludCAgc2hpZnQgPSAwOworCiAKICAgICAvKiBkZXRlcm1pbmUgbXNiIGJpdCBpbmRleCBpbiBgc2hpZnQnICovCi0gICAgaWYgKCB6ICYgMHhGRkZGMDAwMFUgKQorICAgIGlmICggeiAmIDB4RkZGRjAwMDBVTCApCiAgICAgewogICAgICAgeiAgICAgPj49IDE2OwogICAgICAgc2hpZnQgICs9IDE2OwogICAgIH0KLSAgICBpZiAoIHogJiAweDAwMDBGRjAwVSApCisgICAgaWYgKCB6ICYgMHgwMDAwRkYwMFVMICkKICAgICB7CiAgICAgICB6ICAgICA+Pj0gODsKICAgICAgIHNoaWZ0ICArPSA4OwogICAgIH0KLSAgICBpZiAoIHogJiAweDAwMDAwMEYwVSApCisgICAgaWYgKCB6ICYgMHgwMDAwMDBGMFVMICkKICAgICB7CiAgICAgICB6ICAgICA+Pj0gNDsKICAgICAgIHNoaWZ0ICArPSA0OwogICAgIH0KLSAgICBpZiAoIHogJiAweDAwMDAwMDBDVSApCisgICAgaWYgKCB6ICYgMHgwMDAwMDAwQ1VMICkKICAgICB7CiAgICAgICB6ICAgICA+Pj0gMjsKICAgICAgIHNoaWZ0ICArPSAyOwogICAgIH0KLSAgICBpZiAoIHogJiAweDAwMDAwMDAyVSApCisgICAgaWYgKCB6ICYgMHgwMDAwMDAwMlVMICkKICAgICB7CiAgICAvKiB6ICAgICA+Pj0gMTsgKi8KICAgICAgIHNoaWZ0ICArPSAxOwpAQCAtMTcyLDY5ICsxNzAsNzcgQEAKICAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCiAKICAgRlRfRVhQT1JUX0RFRiggRlRfTG9uZyApCi0gIEZUX011bERpdiggRlRfTG9uZyAgYSwKLSAgICAgICAgICAgICBGVF9Mb25nICBiLAotICAgICAgICAgICAgIEZUX0xvbmcgIGMgKQorICBGVF9NdWxEaXYoIEZUX0xvbmcgIGFfLAorICAgICAgICAgICAgIEZUX0xvbmcgIGJfLAorICAgICAgICAgICAgIEZUX0xvbmcgIGNfICkKICAgewotICAgIEZUX0ludCAgIHMgPSAxOwotICAgIEZUX0xvbmcgIGQ7CisgICAgRlRfSW50ICAgICBzID0gMTsKKyAgICBGVF9VSW50NjQgIGEsIGIsIGMsIGQ7CisgICAgRlRfTG9uZyAgICBkXzsKIAogCi0gICAgRlRfTU9WRV9TSUdOKCBhLCBzICk7Ci0gICAgRlRfTU9WRV9TSUdOKCBiLCBzICk7Ci0gICAgRlRfTU9WRV9TSUdOKCBjLCBzICk7CisgICAgRlRfTU9WRV9TSUdOKCBhXywgcyApOworICAgIEZUX01PVkVfU0lHTiggYl8sIHMgKTsKKyAgICBGVF9NT1ZFX1NJR04oIGNfLCBzICk7CiAKLSAgICBkID0gKEZUX0xvbmcpKCBjID4gMCA/ICggKEZUX0ludDY0KWEgKiBiICsgKCBjID4+IDEgKSApIC8gYwotICAgICAgICAgICAgICAgICAgICAgICAgIDogMHg3RkZGRkZGRkwgKTsKKyAgICBhID0gKEZUX1VJbnQ2NClhXzsKKyAgICBiID0gKEZUX1VJbnQ2NCliXzsKKyAgICBjID0gKEZUX1VJbnQ2NCljXzsKIAotICAgIHJldHVybiAoIHMgPiAwICkgPyBkIDogLWQ7CisgICAgZCA9IGMgPiAwID8gKCBhICogYiArICggYyA+PiAxICkgKSAvIGMKKyAgICAgICAgICAgICAgOiAweDdGRkZGRkZGVUw7CisKKyAgICBkXyA9IChGVF9Mb25nKWQ7CisKKyAgICByZXR1cm4gcyA8IDAgPyAtZF8gOiBkXzsKICAgfQogCiAKICAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGNhbGMuaCAqLwogCiAgIEZUX0JBU0VfREVGKCBGVF9Mb25nICkKLSAgRlRfTXVsRGl2X05vX1JvdW5kKCBGVF9Mb25nICBhLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgIGIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgYyApCisgIEZUX011bERpdl9Ob19Sb3VuZCggRlRfTG9uZyAgYV8sCisgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgYl8sCisgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgY18gKQogICB7Ci0gICAgRlRfSW50ICAgcyA9IDE7Ci0gICAgRlRfTG9uZyAgZDsKKyAgICBGVF9JbnQgICAgIHMgPSAxOworICAgIEZUX1VJbnQ2NCAgYSwgYiwgYywgZDsKKyAgICBGVF9Mb25nICAgIGRfOwogCiAKLSAgICBGVF9NT1ZFX1NJR04oIGEsIHMgKTsKLSAgICBGVF9NT1ZFX1NJR04oIGIsIHMgKTsKLSAgICBGVF9NT1ZFX1NJR04oIGMsIHMgKTsKKyAgICBGVF9NT1ZFX1NJR04oIGFfLCBzICk7CisgICAgRlRfTU9WRV9TSUdOKCBiXywgcyApOworICAgIEZUX01PVkVfU0lHTiggY18sIHMgKTsKIAotICAgIGQgPSAoRlRfTG9uZykoIGMgPiAwID8gKEZUX0ludDY0KWEgKiBiIC8gYwotICAgICAgICAgICAgICAgICAgICAgICAgIDogMHg3RkZGRkZGRkwgKTsKKyAgICBhID0gKEZUX1VJbnQ2NClhXzsKKyAgICBiID0gKEZUX1VJbnQ2NCliXzsKKyAgICBjID0gKEZUX1VJbnQ2NCljXzsKIAotICAgIHJldHVybiAoIHMgPiAwICkgPyBkIDogLWQ7CisgICAgZCA9IGMgPiAwID8gYSAqIGIgLyBjCisgICAgICAgICAgICAgIDogMHg3RkZGRkZGRlVMOworCisgICAgZF8gPSAoRlRfTG9uZylkOworCisgICAgcmV0dXJuIHMgPCAwID8gLWRfIDogZF87CiAgIH0KIAogCiAgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwogCiAgIEZUX0VYUE9SVF9ERUYoIEZUX0xvbmcgKQotICBGVF9NdWxGaXgoIEZUX0xvbmcgIGEsCi0gICAgICAgICAgICAgRlRfTG9uZyAgYiApCisgIEZUX011bEZpeCggRlRfTG9uZyAgYV8sCisgICAgICAgICAgICAgRlRfTG9uZyAgYl8gKQogICB7CiAjaWZkZWYgRlRfTVVMRklYX0FTU0VNQkxFUgogCi0gICAgcmV0dXJuIEZUX01VTEZJWF9BU1NFTUJMRVIoIGEsIGIgKTsKKyAgICByZXR1cm4gRlRfTVVMRklYX0FTU0VNQkxFUiggYV8sIGJfICk7CiAKICNlbHNlCiAKLSAgICBGVF9JbnQgICBzID0gMTsKLSAgICBGVF9Mb25nICBjOworICAgIEZUX0ludDY0ICBhYiA9IChGVF9JbnQ2NClhXyAqIChGVF9JbnQ2NCliXzsKIAotCi0gICAgRlRfTU9WRV9TSUdOKCBhLCBzICk7Ci0gICAgRlRfTU9WRV9TSUdOKCBiLCBzICk7Ci0KLSAgICBjID0gKEZUX0xvbmcpKCAoIChGVF9JbnQ2NClhICogYiArIDB4ODAwMEwgKSA+PiAxNiApOwotCi0gICAgcmV0dXJuICggcyA+IDAgKSA/IGMgOiAtYzsKKyAgICAvKiB0aGlzIHJlcXVpcmVzIGFyaXRobWV0aWMgcmlnaHQgc2hpZnQgb2Ygc2lnbmVkIG51bWJlcnMgKi8KKyAgICByZXR1cm4gKEZUX0xvbmcpKCAoIGFiICsgMHg4MDAwTCAtICggYWIgPCAwICkgKSA+PiAxNiApOwogCiAjZW5kaWYgLyogRlRfTVVMRklYX0FTU0VNQkxFUiAqLwogICB9CkBAIC0yNDMsMjAgKzI0OSwyNiBAQAogICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KIAogICBGVF9FWFBPUlRfREVGKCBGVF9Mb25nICkKLSAgRlRfRGl2Rml4KCBGVF9Mb25nICBhLAotICAgICAgICAgICAgIEZUX0xvbmcgIGIgKQorICBGVF9EaXZGaXgoIEZUX0xvbmcgIGFfLAorICAgICAgICAgICAgIEZUX0xvbmcgIGJfICkKICAgewotICAgIEZUX0ludCAgIHMgPSAxOwotICAgIEZUX0xvbmcgIHE7CisgICAgRlRfSW50ICAgICBzID0gMTsKKyAgICBGVF9VSW50NjQgIGEsIGIsIHE7CisgICAgRlRfTG9uZyAgICBxXzsKIAogCi0gICAgRlRfTU9WRV9TSUdOKCBhLCBzICk7Ci0gICAgRlRfTU9WRV9TSUdOKCBiLCBzICk7CisgICAgRlRfTU9WRV9TSUdOKCBhXywgcyApOworICAgIEZUX01PVkVfU0lHTiggYl8sIHMgKTsKIAotICAgIHEgPSAoRlRfTG9uZykoIGIgPiAwID8gKCAoIChGVF9VSW50NjQpYSA8PCAxNiApICsgKCBiID4+IDEgKSApIC8gYgotICAgICAgICAgICAgICAgICAgICAgICAgIDogMHg3RkZGRkZGRkwgKTsKKyAgICBhID0gKEZUX1VJbnQ2NClhXzsKKyAgICBiID0gKEZUX1VJbnQ2NCliXzsKIAotICAgIHJldHVybiAoIHMgPCAwID8gLXEgOiBxICk7CisgICAgcSA9IGIgPiAwID8gKCAoIGEgPDwgMTYgKSArICggYiA+PiAxICkgKSAvIGIKKyAgICAgICAgICAgICAgOiAweDdGRkZGRkZGVUw7CisKKyAgICBxXyA9IChGVF9Mb25nKXE7CisKKyAgICByZXR1cm4gcyA8IDAgPyAtcV8gOiBxXzsKICAgfQogCiAKQEAgLTQwMCwyNiArNDEyLDI5IEBACiAgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwogCiAgIEZUX0VYUE9SVF9ERUYoIEZUX0xvbmcgKQotICBGVF9NdWxEaXYoIEZUX0xvbmcgIGEsCi0gICAgICAgICAgICAgRlRfTG9uZyAgYiwKLSAgICAgICAgICAgICBGVF9Mb25nICBjICkKKyAgRlRfTXVsRGl2KCBGVF9Mb25nICBhXywKKyAgICAgICAgICAgICBGVF9Mb25nICBiXywKKyAgICAgICAgICAgICBGVF9Mb25nICBjXyApCiAgIHsKLSAgICBGVF9JbnQgIHMgPSAxOworICAgIEZUX0ludCAgICAgcyA9IDE7CisgICAgRlRfVUludDMyICBhLCBiLCBjOwogCiAKICAgICAvKiBYWFg6IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWxsb3cgNjQtYml0IGFyZ3VtZW50cyAqLwotICAgIGlmICggYSA9PSAwIHx8IGIgPT0gYyApCi0gICAgICByZXR1cm4gYTsKIAotICAgIEZUX01PVkVfU0lHTiggYSwgcyApOwotICAgIEZUX01PVkVfU0lHTiggYiwgcyApOwotICAgIEZUX01PVkVfU0lHTiggYywgcyApOworICAgIEZUX01PVkVfU0lHTiggYV8sIHMgKTsKKyAgICBGVF9NT1ZFX1NJR04oIGJfLCBzICk7CisgICAgRlRfTU9WRV9TSUdOKCBjXywgcyApOworCisgICAgYSA9IChGVF9VSW50MzIpYV87CisgICAgYiA9IChGVF9VSW50MzIpYl87CisgICAgYyA9IChGVF9VSW50MzIpY187CiAKICAgICBpZiAoIGMgPT0gMCApCi0gICAgICBhID0gMHg3RkZGRkZGRkw7CisgICAgICBhID0gMHg3RkZGRkZGRlVMOwogCi0gICAgZWxzZSBpZiAoIChGVF9VTG9uZylhICsgYiA8PSAxMjk4OTRVTCAtICggYyA+PiAxNyApICkKLSAgICAgIGEgPSAoIChGVF9VTG9uZylhICogYiArICggYyA+PiAxICkgKSAvIGM7CisgICAgZWxzZSBpZiAoIGEgKyBiIDw9IDEyOTg5NFVMIC0gKCBjID4+IDE3ICkgKQorICAgICAgYSA9ICggYSAqIGIgKyAoIGMgPj4gMSApICkgLyBjOwogCiAgICAgZWxzZQogICAgIHsKQEAgLTQzOCwzMCArNDUzLDM2IEBACiAgICAgICAgICAgICAgICAgICAgICAgIDogZnRfZGl2NjRieTMyKCB0ZW1wLmhpLCB0ZW1wLmxvLCBjICk7CiAgICAgfQogCi0gICAgcmV0dXJuICggcyA8IDAgPyAtYSA6IGEgKTsKKyAgICBhXyA9IChGVF9Mb25nKWE7CisKKyAgICByZXR1cm4gcyA8IDAgPyAtYV8gOiBhXzsKICAgfQogCiAKICAgRlRfQkFTRV9ERUYoIEZUX0xvbmcgKQotICBGVF9NdWxEaXZfTm9fUm91bmQoIEZUX0xvbmcgIGEsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgYiwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICBjICkKKyAgRlRfTXVsRGl2X05vX1JvdW5kKCBGVF9Mb25nICBhXywKKyAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICBiXywKKyAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICBjXyApCiAgIHsKLSAgICBGVF9JbnQgIHMgPSAxOworICAgIEZUX0ludCAgICAgcyA9IDE7CisgICAgRlRfVUludDMyICBhLCBiLCBjOwogCiAKLSAgICBpZiAoIGEgPT0gMCB8fCBiID09IGMgKQotICAgICAgcmV0dXJuIGE7CisgICAgLyogWFhYOiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFsbG93IDY0LWJpdCBhcmd1bWVudHMgKi8KIAotICAgIEZUX01PVkVfU0lHTiggYSwgcyApOwotICAgIEZUX01PVkVfU0lHTiggYiwgcyApOwotICAgIEZUX01PVkVfU0lHTiggYywgcyApOworICAgIEZUX01PVkVfU0lHTiggYV8sIHMgKTsKKyAgICBGVF9NT1ZFX1NJR04oIGJfLCBzICk7CisgICAgRlRfTU9WRV9TSUdOKCBjXywgcyApOworCisgICAgYSA9IChGVF9VSW50MzIpYV87CisgICAgYiA9IChGVF9VSW50MzIpYl87CisgICAgYyA9IChGVF9VSW50MzIpY187CiAKICAgICBpZiAoIGMgPT0gMCApCi0gICAgICBhID0gMHg3RkZGRkZGRkw7CisgICAgICBhID0gMHg3RkZGRkZGRlVMOwogCi0gICAgZWxzZSBpZiAoIChGVF9VTG9uZylhICsgYiA8PSAxMzEwNzFVTCApCi0gICAgICBhID0gKEZUX1VMb25nKWEgKiBiIC8gYzsKKyAgICBlbHNlIGlmICggYSArIGIgPD0gMTMxMDcxVUwgKQorICAgICAgYSA9IGEgKiBiIC8gYzsKIAogICAgIGVsc2UKICAgICB7CkBAIC00NzUsMTkgKzQ5NiwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICA6IGZ0X2RpdjY0YnkzMiggdGVtcC5oaSwgdGVtcC5sbywgYyApOwogICAgIH0KIAotICAgIHJldHVybiAoIHMgPCAwID8gLWEgOiBhICk7CisgICAgYV8gPSAoRlRfTG9uZylhOworCisgICAgcmV0dXJuIHMgPCAwID8gLWFfIDogYV87CiAgIH0KIAogCiAgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwogCiAgIEZUX0VYUE9SVF9ERUYoIEZUX0xvbmcgKQotICBGVF9NdWxGaXgoIEZUX0xvbmcgIGEsCi0gICAgICAgICAgICAgRlRfTG9uZyAgYiApCisgIEZUX011bEZpeCggRlRfTG9uZyAgYV8sCisgICAgICAgICAgICAgRlRfTG9uZyAgYl8gKQogICB7CiAjaWZkZWYgRlRfTVVMRklYX0FTU0VNQkxFUgogCi0gICAgcmV0dXJuIEZUX01VTEZJWF9BU1NFTUJMRVIoIGEsIGIgKTsKKyAgICByZXR1cm4gRlRfTVVMRklYX0FTU0VNQkxFUiggYV8sIGJfICk7CiAKICNlbGlmIDAKIApAQCAtNDk4LDEzICs1MjEsMTAgQEAKICAgICAgKiAgdGhlIGxlZnRtb3N0IGJpdHMgYnkgY29weWluZyB0aGUgc2lnbiBiaXQsIGl0IG1pZ2h0IGJlIGZhc3Rlci4KICAgICAgKi8KIAotICAgIEZUX0xvbmcgICBzYSwgc2I7Ci0gICAgRlRfVUxvbmcgIHVhLCB1YjsKKyAgICBGVF9Mb25nICAgIHNhLCBzYjsKKyAgICBGVF9VSW50MzIgIGEsIGI7CiAKIAotICAgIGlmICggYSA9PSAwIHx8IGIgPT0gMHgxMDAwMEwgKQotICAgICAgcmV0dXJuIGE7Ci0KICAgICAvKgogICAgICAqICBUaGlzIGlzIGEgY2xldmVyIHdheSBvZiBjb252ZXJ0aW5nIGEgc2lnbmVkIG51bWJlciBgYScgaW50byBpdHMKICAgICAgKiAgYWJzb2x1dGUgdmFsdWUgKHN0b3JlZCBiYWNrIGludG8gYGEnKSBhbmQgaXRzIHNpZ24uICBUaGUgc2lnbiBpcwpAQCAtNTIzLDU3ICs1NDMsNTggQEAKICAgICAgKiAgd2l0aCB0aGUgdmFsdWUgMSByYXRoZXIgdGhhbiAtMS4gIEFmdGVyIHRoYXQsIGV2ZXJ5dGhpbmcgZWxzZSBnb2VzCiAgICAgICogIHdyb25nLgogICAgICAqLwotICAgIHNhID0gKCBhID4+ICggc2l6ZW9mICggYSApICogOCAtIDEgKSApOwotICAgIGEgID0gKCBhIF4gc2EgKSAtIHNhOwotICAgIHNiID0gKCBiID4+ICggc2l6ZW9mICggYiApICogOCAtIDEgKSApOwotICAgIGIgID0gKCBiIF4gc2IgKSAtIHNiOworICAgIHNhID0gKCBhXyA+PiAoIHNpemVvZiAoIGFfICkgKiA4IC0gMSApICk7CisgICAgYSAgPSAoIGFfIF4gc2EgKSAtIHNhOworICAgIHNiID0gKCBiXyA+PiAoIHNpemVvZiAoIGJfICkgKiA4IC0gMSApICk7CisgICAgYiAgPSAoIGJfIF4gc2IgKSAtIHNiOwogCi0gICAgdWEgPSAoRlRfVUxvbmcpYTsKLSAgICB1YiA9IChGVF9VTG9uZyliOworICAgIGEgPSAoRlRfVUludDMyKWFfOworICAgIGIgPSAoRlRfVUludDMyKWJfOwogCi0gICAgaWYgKCB1YSArICggdWIgPj4gOCApIDw9IDgxOTBVTCApCi0gICAgICB1YSA9ICggdWEgKiB1YiArIDB4ODAwMFUgKSA+PiAxNjsKKyAgICBpZiAoIGEgKyAoIGIgPj4gOCApIDw9IDgxOTBVTCApCisgICAgICBhID0gKCBhICogYiArIDB4ODAwMFUgKSA+PiAxNjsKICAgICBlbHNlCiAgICAgewotICAgICAgRlRfVUxvbmcgIGFsID0gdWEgJiAweEZGRkZVOworICAgICAgRlRfVUludDMyICBhbCA9IGEgJiAweEZGRkZVTDsKIAogCi0gICAgICB1YSA9ICggdWEgPj4gMTYgKSAqIHViICsgIGFsICogKCB1YiA+PiAxNiApICsKLSAgICAgICAgICAgKCAoIGFsICogKCB1YiAmIDB4RkZGRlUgKSArIDB4ODAwMFUgKSA+PiAxNiApOworICAgICAgYSA9ICggYSA+PiAxNiApICogYiArIGFsICogKCBiID4+IDE2ICkgKworICAgICAgICAgICggKCBhbCAqICggYiAmIDB4RkZGRlVMICkgKyAweDgwMDBVTCApID4+IDE2ICk7CiAgICAgfQogCi0gICAgc2EgXj0gc2IsCi0gICAgdWEgID0gKEZUX1VMb25nKSgoIHVhIF4gc2EgKSAtIHNhKTsKKyAgICBzYSBePSBzYjsKKyAgICBhICAgPSAoIGEgXiBzYSApIC0gc2E7CiAKLSAgICByZXR1cm4gKEZUX0xvbmcpdWE7CisgICAgcmV0dXJuIChGVF9Mb25nKWE7CiAKICNlbHNlIC8qIDAgKi8KIAotICAgIEZUX0ludCAgICBzID0gMTsKLSAgICBGVF9VTG9uZyAgdWEsIHViOworICAgIEZUX0ludCAgICAgcyA9IDE7CisgICAgRlRfVUludDMyICBhLCBiOwogCiAKLSAgICBpZiAoIGEgPT0gMCB8fCBiID09IDB4MTAwMDBMICkKLSAgICAgIHJldHVybiBhOworICAgIC8qIFhYWDogdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhbGxvdyA2NC1iaXQgYXJndW1lbnRzICovCiAKLSAgICBGVF9NT1ZFX1NJR04oIGEsIHMgKTsKLSAgICBGVF9NT1ZFX1NJR04oIGIsIHMgKTsKKyAgICBGVF9NT1ZFX1NJR04oIGFfLCBzICk7CisgICAgRlRfTU9WRV9TSUdOKCBiXywgcyApOwogCi0gICAgdWEgPSAoRlRfVUxvbmcpYTsKLSAgICB1YiA9IChGVF9VTG9uZyliOworICAgIGEgPSAoRlRfVUludDMyKWFfOworICAgIGIgPSAoRlRfVUludDMyKWJfOwogCi0gICAgaWYgKCB1YSArICggdWIgPj4gOCApIDw9IDgxOTBVTCApCi0gICAgICB1YSA9ICggdWEgKiB1YiArIDB4ODAwMFVMICkgPj4gMTY7CisgICAgaWYgKCBhICsgKCBiID4+IDggKSA8PSA4MTkwVUwgKQorICAgICAgYSA9ICggYSAqIGIgKyAweDgwMDBVTCApID4+IDE2OwogICAgIGVsc2UKICAgICB7Ci0gICAgICBGVF9VTG9uZyAgYWwgPSB1YSAmIDB4RkZGRlVMOworICAgICAgRlRfVUludDMyICBhbCA9IGEgJiAweEZGRkZVTDsKIAogCi0gICAgICB1YSA9ICggdWEgPj4gMTYgKSAqIHViICsgIGFsICogKCB1YiA+PiAxNiApICsKLSAgICAgICAgICAgKCAoIGFsICogKCB1YiAmIDB4RkZGRlVMICkgKyAweDgwMDBVTCApID4+IDE2ICk7CisgICAgICBhID0gKCBhID4+IDE2ICkgKiBiICsgYWwgKiAoIGIgPj4gMTYgKSArCisgICAgICAgICAgKCAoIGFsICogKCBiICYgMHhGRkZGVUwgKSArIDB4ODAwMFVMICkgPj4gMTYgKTsKICAgICB9CiAKLSAgICByZXR1cm4gKCBzIDwgMCA/IC0oRlRfTG9uZyl1YSA6IChGVF9Mb25nKXVhICk7CisgICAgYV8gPSAoRlRfTG9uZylhOworCisgICAgcmV0dXJuIHMgPCAwID8gLWFfIDogYV87CiAKICNlbmRpZiAvKiAwICovCiAKQEAgLTU4MywyNyArNjA0LDMxIEBACiAgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwogCiAgIEZUX0VYUE9SVF9ERUYoIEZUX0xvbmcgKQotICBGVF9EaXZGaXgoIEZUX0xvbmcgIGEsCi0gICAgICAgICAgICAgRlRfTG9uZyAgYiApCisgIEZUX0RpdkZpeCggRlRfTG9uZyAgYV8sCisgICAgICAgICAgICAgRlRfTG9uZyAgYl8gKQogICB7Ci0gICAgRlRfSW50ICAgcyA9IDE7Ci0gICAgRlRfTG9uZyAgcTsKKyAgICBGVF9JbnQgICAgIHMgPSAxOworICAgIEZUX1VJbnQzMiAgYSwgYiwgcTsKKyAgICBGVF9Mb25nICAgIHFfOwogCiAKICAgICAvKiBYWFg6IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWxsb3cgNjQtYml0IGFyZ3VtZW50cyAqLwogCi0gICAgRlRfTU9WRV9TSUdOKCBhLCBzICk7Ci0gICAgRlRfTU9WRV9TSUdOKCBiLCBzICk7CisgICAgRlRfTU9WRV9TSUdOKCBhXywgcyApOworICAgIEZUX01PVkVfU0lHTiggYl8sIHMgKTsKKworICAgIGEgPSAoRlRfVUludDMyKWFfOworICAgIGIgPSAoRlRfVUludDMyKWJfOwogCiAgICAgaWYgKCBiID09IDAgKQogICAgIHsKICAgICAgIC8qIGNoZWNrIGZvciBkaXZpc2lvbiBieSAwICovCi0gICAgICBxID0gMHg3RkZGRkZGRkw7CisgICAgICBxID0gMHg3RkZGRkZGRlVMOwogICAgIH0KLSAgICBlbHNlIGlmICggYSA8PSA2NTUzNUwgLSAoIGIgPj4gMTcgKSApCisgICAgZWxzZSBpZiAoIGEgPD0gNjU1MzVVTCAtICggYiA+PiAxNyApICkKICAgICB7CiAgICAgICAvKiBjb21wdXRlIHJlc3VsdCBkaXJlY3RseSAqLwotICAgICAgcSA9IChGVF9Mb25nKSggKCAoIChGVF9VTG9uZylhIDw8IDE2ICkgKyAoIGIgPj4gMSApICkgLyBiICk7CisgICAgICBxID0gKCAoIGEgPDwgMTYgKSArICggYiA+PiAxICkgKSAvIGI7CiAgICAgfQogICAgIGVsc2UKICAgICB7CkBAIC02MTcsMTQgKzY0MiwxNiBAQAogICAgICAgdGVtcDIubG8gPSBiID4+IDE7CiAKICAgICAgIEZUX0FkZDY0KCAmdGVtcCwgJnRlbXAyLCAmdGVtcCApOwotICAgICAgcSA9IChGVF9Mb25nKWZ0X2RpdjY0YnkzMiggdGVtcC5oaSwgdGVtcC5sbywgYiApOworICAgICAgcSA9IGZ0X2RpdjY0YnkzMiggdGVtcC5oaSwgdGVtcC5sbywgYiApOwogICAgIH0KIAotICAgIHJldHVybiAoIHMgPCAwID8gLXEgOiBxICk7CisgICAgcV8gPSAoRlRfTG9uZylxOworCisgICAgcmV0dXJuIHMgPCAwID8gLXFfIDogcV87CiAgIH0KIAogCi0jZW5kaWYgLyogRlRfTE9ORzY0ICovCisjZW5kaWYgLyogIUZUX0xPTkc2NCAqLwogCiAKICAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGdseXBoLmggKi8KQEAgLTczMSw2ICs3NTgsMTAyIEBACiAgIH0KIAogCisgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRjYWxjLmggKi8KKworICBGVF9CQVNFX0RFRiggRlRfVUludDMyICkKKyAgRlRfVmVjdG9yX05vcm1MZW4oIEZUX1ZlY3RvciogIHZlY3RvciApCisgIHsKKyAgICBGVF9JbnQzMiAgIHhfID0gdmVjdG9yLT54OworICAgIEZUX0ludDMyICAgeV8gPSB2ZWN0b3ItPnk7CisgICAgRlRfSW50MzIgICBiLCB6OworICAgIEZUX1VJbnQzMiAgeCwgeSwgdSwgdiwgbDsKKyAgICBGVF9JbnQgICAgIHN4ID0gMSwgc3kgPSAxLCBzaGlmdDsKKworCisgICAgRlRfTU9WRV9TSUdOKCB4Xywgc3ggKTsKKyAgICBGVF9NT1ZFX1NJR04oIHlfLCBzeSApOworCisgICAgeCA9IChGVF9VSW50MzIpeF87CisgICAgeSA9IChGVF9VSW50MzIpeV87CisKKyAgICAvKiB0cml2aWFsIGNhc2VzICovCisgICAgaWYgKCB4ID09IDAgKQorICAgIHsKKyAgICAgIGlmICggeSA+IDAgKQorICAgICAgICB2ZWN0b3ItPnkgPSBzeSAqIDB4MTAwMDA7CisgICAgICByZXR1cm4geTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHkgPT0gMCApCisgICAgeworICAgICAgaWYgKCB4ID4gMCApCisgICAgICAgIHZlY3Rvci0+eCA9IHN4ICogMHgxMDAwMDsKKyAgICAgIHJldHVybiB4OworICAgIH0KKworICAgIC8qIEVzdGltYXRlIGxlbmd0aCBhbmQgcHJlbm9ybWFsaXplIGJ5IHNoaWZ0aW5nIHNvIHRoYXQgKi8KKyAgICAvKiB0aGUgbmV3IGFwcHJveGltYXRlIGxlbmd0aCBpcyBiZXR3ZWVuIDIvMyBhbmQgNC8zLiAgICovCisgICAgLyogVGhlIG1hZ2ljIGNvbnN0YW50IDB4QUFBQUFBQUFVTCAoMi8zIG9mIDJeMzIpIGhlbHBzICAqLworICAgIC8qIGFjaGlldmUgdGhpcyBpbiAxNi4xNiBmaXhlZC1wb2ludCByZXByZXNlbnRhdGlvbi4gICAgKi8KKyAgICBsID0geCA+IHkgPyB4ICsgKCB5ID4+IDEgKQorICAgICAgICAgICAgICA6IHkgKyAoIHggPj4gMSApOworCisgICAgc2hpZnQgID0gMzEgLSBGVF9NU0IoIGwgKTsKKyAgICBzaGlmdCAtPSAxNSArICggbCA+PSAoIDB4QUFBQUFBQUFVTCA+PiBzaGlmdCApICk7CisKKyAgICBpZiAoIHNoaWZ0ID4gMCApCisgICAgeworICAgICAgeCA8PD0gc2hpZnQ7CisgICAgICB5IDw8PSBzaGlmdDsKKworICAgICAgLyogcmUtZXN0aW1hdGUgbGVuZ3RoIGZvciB0aW55IHZlY3RvcnMgKi8KKyAgICAgIGwgPSB4ID4geSA/IHggKyAoIHkgPj4gMSApCisgICAgICAgICAgICAgICAgOiB5ICsgKCB4ID4+IDEgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHggPj49IC1zaGlmdDsKKyAgICAgIHkgPj49IC1zaGlmdDsKKyAgICAgIGwgPj49IC1zaGlmdDsKKyAgICB9CisKKyAgICAvKiBsb3dlciBsaW5lYXIgYXBwcm94aW1hdGlvbiBmb3IgcmVjaXByb2NhbCBsZW5ndGggbWludXMgb25lICovCisgICAgYiA9IDB4MTAwMDAgLSAoRlRfSW50MzIpbDsKKworICAgIHhfID0gKEZUX0ludDMyKXg7CisgICAgeV8gPSAoRlRfSW50MzIpeTsKKworICAgIC8qIE5ld3RvbidzIGl0ZXJhdGlvbnMgKi8KKyAgICBkbworICAgIHsKKyAgICAgIHUgPSAoRlRfVUludDMyKSggeF8gKyAoIHhfICogYiA+PiAxNiApICk7CisgICAgICB2ID0gKEZUX1VJbnQzMikoIHlfICsgKCB5XyAqIGIgPj4gMTYgKSApOworCisgICAgICAvKiBOb3JtYWxpemVkIHNxdWFyZWQgbGVuZ3RoIGluIHRoZSBwYXJlbnRoZXNlcyBhcHByb2FjaGVzIDJeMzIuICovCisgICAgICAvKiBPbiB0d28ncyBjb21wbGVtZW50IHN5c3RlbXMsIGNvbnZlcnRpbmcgdG8gc2lnbmVkIGdpdmVzIHRoZSAgICovCisgICAgICAvKiBkaWZmZXJlbmNlIHdpdGggMl4zMiBldmVuIGlmIHRoZSBleHByZXNzaW9uIHdyYXBzIGFyb3VuZC4gICAgICovCisgICAgICB6ID0gLShGVF9JbnQzMikoIHUgKiB1ICsgdiAqIHYgKSAvIDB4MjAwOworICAgICAgeiA9IHogKiAoICggMHgxMDAwMCArIGIgKSA+PiA4ICkgLyAweDEwMDAwOworCisgICAgICBiICs9IHo7CisKKyAgICB9IHdoaWxlICggeiA+IDAgKTsKKworICAgIHZlY3Rvci0+eCA9IHN4IDwgMCA/IC0oRlRfUG9zKXUgOiAoRlRfUG9zKXU7CisgICAgdmVjdG9yLT55ID0gc3kgPCAwID8gLShGVF9Qb3MpdiA6IChGVF9Qb3MpdjsKKworICAgIC8qIENvbnZlcnNpb24gdG8gc2lnbmVkIGhlbHBzIHRvIHJlY292ZXIgZnJvbSBsaWtlbHkgd3JhcCBhcm91bmQgKi8KKyAgICAvKiBpbiBjYWxjdWxhdGluZyB0aGUgcHJlbm9ybWFsaXplZCBsZW5ndGgsIGJlY2F1c2UgaXQgZ2l2ZXMgdGhlICovCisgICAgLyogY29ycmVjdCBkaWZmZXJlbmNlIHdpdGggMl4zMiBvbiB0d28ncyBjb21wbGVtZW50IHN5c3RlbXMuICAgICAqLworICAgIGwgPSAoRlRfVUludDMyKSggMHgxMDAwMCArIChGVF9JbnQzMikoIHUgKiB4ICsgdiAqIHkgKSAvIDB4MTAwMDAgKTsKKyAgICBpZiAoIHNoaWZ0ID4gMCApCisgICAgICBsID0gKCBsICsgKCAxIDw8ICggc2hpZnQgLSAxICkgKSApID4+IHNoaWZ0OworICAgIGVsc2UKKyAgICAgIGwgPDw9IC1zaGlmdDsKKworICAgIHJldHVybiBsOworICB9CisKKwogI2lmIDAKIAogICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Y2FsYy5oICovCkBAIC03NDcsNyArODcwLDcgQEAKICAgICBpZiAoIHggPiAwICkKICAgICB7CiAgICAgICByZW1faGkgPSAwOwotICAgICAgcmVtX2xvID0geDsKKyAgICAgIHJlbV9sbyA9IChGVF9VSW50MzIpeDsKICAgICAgIGNvdW50ICA9IDI0OwogICAgICAgZG8KICAgICAgIHsKQEAgLTc3OCw1OCArOTAxLDQwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBvdXRfeCwKICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIG91dF95ICkKICAgewotICAgIEZUX0xvbmcgIHJlc3VsdDsgLyogYXZvaWQgb3ZlcmZsb3cgb24gMTYtYml0IHN5c3RlbSAqLwotCi0KLSAgICAvKiBkZWFsIHdpdGggdGhlIHRyaXZpYWwgY2FzZXMgcXVpY2tseSAqLwotICAgIGlmICggaW5feSA9PSAwICkKLSAgICB7Ci0gICAgICBpZiAoIGluX3ggPj0gMCApCi0gICAgICAgIHJlc3VsdCA9IG91dF95OwotICAgICAgZWxzZQotICAgICAgICByZXN1bHQgPSAtb3V0X3k7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBpbl94ID09IDAgKQotICAgIHsKLSAgICAgIGlmICggaW5feSA+PSAwICkKLSAgICAgICAgcmVzdWx0ID0gLW91dF94OwotICAgICAgZWxzZQotICAgICAgICByZXN1bHQgPSBvdXRfeDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIG91dF95ID09IDAgKQotICAgIHsKLSAgICAgIGlmICggb3V0X3ggPj0gMCApCi0gICAgICAgIHJlc3VsdCA9IGluX3k7Ci0gICAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9IC1pbl95OwotICAgIH0KLSAgICBlbHNlIGlmICggb3V0X3ggPT0gMCApCi0gICAgewotICAgICAgaWYgKCBvdXRfeSA+PSAwICkKLSAgICAgICAgcmVzdWx0ID0gLWluX3g7Ci0gICAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9ICBpbl94OwotICAgIH0KLSAgICBlbHNlIC8qIGdlbmVyYWwgY2FzZSAqLwotICAgIHsKICNpZmRlZiBGVF9MT05HNjQKIAotICAgICAgRlRfSW50NjQgIGRlbHRhID0gKEZUX0ludDY0KWluX3ggKiBvdXRfeSAtIChGVF9JbnQ2NClpbl95ICogb3V0X3g7CisgICAgRlRfSW50NjQgIGRlbHRhID0gKEZUX0ludDY0KWluX3ggKiBvdXRfeSAtIChGVF9JbnQ2NClpbl95ICogb3V0X3g7CiAKIAotICAgICAgaWYgKCBkZWx0YSA9PSAwICkKLSAgICAgICAgcmVzdWx0ID0gMDsKLSAgICAgIGVsc2UKLSAgICAgICAgcmVzdWx0ID0gMSAtIDIgKiAoIGRlbHRhIDwgMCApOworICAgIHJldHVybiAoIGRlbHRhID4gMCApIC0gKCBkZWx0YSA8IDAgKTsKIAogI2Vsc2UKIAorICAgIEZUX0ludCAgcmVzdWx0OworCisKKyAgICBpZiAoIChGVF9VTG9uZylGVF9BQlMoIGluX3ggKSArIChGVF9VTG9uZylGVF9BQlMoIG91dF95ICkgPD0gMTMxMDcxVUwgJiYKKyAgICAgICAgIChGVF9VTG9uZylGVF9BQlMoIGluX3kgKSArIChGVF9VTG9uZylGVF9BQlMoIG91dF94ICkgPD0gMTMxMDcxVUwgKQorICAgIHsKKyAgICAgIEZUX0xvbmcgIHoxID0gaW5feCAqIG91dF95OworICAgICAgRlRfTG9uZyAgejIgPSBpbl95ICogb3V0X3g7CisKKworICAgICAgaWYgKCB6MSA+IHoyICkKKyAgICAgICAgcmVzdWx0ID0gKzE7CisgICAgICBlbHNlIGlmICggejEgPCB6MiApCisgICAgICAgIHJlc3VsdCA9IC0xOworICAgICAgZWxzZQorICAgICAgICByZXN1bHQgPSAwOworICAgIH0KKyAgICBlbHNlIC8qIHByb2R1Y3RzIG1pZ2h0IG92ZXJmbG93IDMyIGJpdHMgKi8KKyAgICB7CiAgICAgICBGVF9JbnQ2NCAgejEsIHoyOwogCiAKICAgICAgIC8qIFhYWDogdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhbGxvdyA2NC1iaXQgYXJndW1lbnRzICovCi0gICAgICBmdF9tdWx0bzY0KCAoRlRfSW50MzIpaW5feCwgKEZUX0ludDMyKW91dF95LCAmejEgKTsKLSAgICAgIGZ0X211bHRvNjQoIChGVF9JbnQzMilpbl95LCAoRlRfSW50MzIpb3V0X3gsICZ6MiApOworICAgICAgZnRfbXVsdG82NCggKEZUX1VJbnQzMilpbl94LCAoRlRfVUludDMyKW91dF95LCAmejEgKTsKKyAgICAgIGZ0X211bHRvNjQoIChGVF9VSW50MzIpaW5feSwgKEZUX1VJbnQzMilvdXRfeCwgJnoyICk7CiAKICAgICAgIGlmICggejEuaGkgPiB6Mi5oaSApCiAgICAgICAgIHJlc3VsdCA9ICsxOwpAQCAtODQxLDEyICs5NDYsMTIgQEAKICAgICAgICAgcmVzdWx0ID0gLTE7CiAgICAgICBlbHNlCiAgICAgICAgIHJlc3VsdCA9IDA7Ci0KLSNlbmRpZgogICAgIH0KIAogICAgIC8qIFhYWDogb25seSB0aGUgc2lnbiBvZiByZXR1cm4gdmFsdWUsICsxLzAvLTEgbXVzdCBiZSB1c2VkICovCi0gICAgcmV0dXJuIChGVF9JbnQpcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CisKKyNlbmRpZgogICB9CiAKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRjaWQuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0Y2lkLmMKaW5kZXggNzQxODc5ZC4uMDczNDg4MSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRjaWQuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGNpZC5jCkBAIC00LDcgKzQsOCBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEZyZWVUeXBlIEFQSSBmb3IgYWNjZXNzaW5nIENJRCBmb250IGluZm9ybWF0aW9uLiAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LCAyMDA5LCAyMDEzIGJ5IERlcmVrIENsZWdnLCBNaWNoYWVsIFRvZnRkYWwuICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwNy0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGVyZWsgQ2xlZ2cgYW5kIE1pY2hhZWwgVG9mdGRhbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCiAvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRkYmdtZW0uYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0ZGJnbWVtLmMKaW5kZXggNmZiODZmZS4uNmYyMDMxMyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRkYmdtZW0uYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGRiZ21lbS5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIE1lbW9yeSBkZWJ1Z2dlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMDYsIDIwMDksIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwMS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC0zNSw3ICszNSw3IEBACiAKICNpbmNsdWRlIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0gKIAotICBGVF9CQVNFX0RFRiggY29uc3QgY2hhciogKSAgX2Z0X2RlYnVnX2ZpbGUgICA9IDA7CisgIEZUX0JBU0VfREVGKCBjb25zdCBjaGFyKiApICBfZnRfZGVidWdfZmlsZSAgID0gTlVMTDsKICAgRlRfQkFTRV9ERUYoIGxvbmcgKSAgICAgICAgIF9mdF9kZWJ1Z19saW5lbm8gPSAwOwogCiAgIGV4dGVybiB2b2lkCkBAIC00Nyw3ICs0Nyw3IEBACiAgIHR5cGVkZWYgc3RydWN0IEZUX01lbVRhYmxlUmVjXyogICBGVF9NZW1UYWJsZTsKIAogCi0jZGVmaW5lIEZUX01FTV9WQUwoIGFkZHIgKSAgKChGVF9QdHJEaXN0KShGVF9Qb2ludGVyKSggYWRkciApKQorI2RlZmluZSBGVF9NRU1fVkFMKCBhZGRyICkgICggKEZUX1B0ckRpc3QpKEZUX1BvaW50ZXIpKCBhZGRyICkgKQogCiAgIC8qCiAgICAqICBUaGlzIHN0cnVjdHVyZSBob2xkcyBzdGF0aXN0aWNzIGZvciBhIHNpbmdsZSBhbGxvY2F0aW9uL3JlbGVhc2UKQEAgLTc2LDcgKzc2LDcgQEAKIAogCiAgIC8qCi0gICAqICBXZSBkb24ndCBuZWVkIGEgcmVzaXphYmxlIGFycmF5IGZvciB0aGUgbWVtb3J5IHNvdXJjZXMsIGJlY2F1c2UKKyAgICogIFdlIGRvbid0IG5lZWQgYSByZXNpemFibGUgYXJyYXkgZm9yIHRoZSBtZW1vcnkgc291cmNlcyBiZWNhdXNlCiAgICAqICB0aGVpciBudW1iZXIgaXMgcHJldHR5IGxpbWl0ZWQgd2l0aGluIEZyZWVUeXBlLgogICAgKi8KICNkZWZpbmUgRlRfTUVNX1NPVVJDRV9CVUNLRVRTICAxMjgKQEAgLTg1LDggKzg1LDggQEAKICAgICogIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gYSBzaW5nbGUgYWxsb2NhdGVkCiAgICAqICBtZW1vcnkgYmxvY2suICBJZiBLRUVQQUxJVkUgaXMgZGVmaW5lZCwgYmxvY2tzIHRoYXQgYXJlIGZyZWVkIGJ5CiAgICAqICBGcmVlVHlwZSBhcmUgbmV2ZXIgcmVsZWFzZWQgdG8gdGhlIHN5c3RlbS4gIEluc3RlYWQsIHRoZWlyIGBzaXplJwotICAgKiAgZmllbGQgaXMgc2V0IHRvIC1zaXplLiAgVGhpcyBpcyBtYWlubHkgdXNlZnVsIHRvIGRldGVjdCBkb3VibGUgZnJlZXMsCi0gICAqICBhdCB0aGUgcHJpY2Ugb2YgbGFyZ2UgbWVtb3J5IGZvb3RwcmludCBkdXJpbmcgZXhlY3V0aW9uLgorICAgKiAgZmllbGQgaXMgc2V0IHRvIGAtc2l6ZScuICBUaGlzIGlzIG1haW5seSB1c2VmdWwgdG8gZGV0ZWN0IGRvdWJsZQorICAgKiAgZnJlZXMsIGF0IHRoZSBwcmljZSBvZiBhIGxhcmdlIG1lbW9yeSBmb290cHJpbnQgZHVyaW5nIGV4ZWN1dGlvbi4KICAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBGVF9NZW1Ob2RlUmVjXwogICB7CkBAIC0xMTEsMjAgKzExMSwyMCBAQAogICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIEZUX01lbVRhYmxlUmVjXwogICB7Ci0gICAgRlRfVUxvbmcgICAgICAgICBzaXplOwotICAgIEZUX1VMb25nICAgICAgICAgbm9kZXM7CisgICAgRlRfTG9uZyAgICAgICAgICBzaXplOworICAgIEZUX0xvbmcgICAgICAgICAgbm9kZXM7CiAgICAgRlRfTWVtTm9kZSogICAgICBidWNrZXRzOwogCi0gICAgRlRfVUxvbmcgICAgICAgICBhbGxvY190b3RhbDsKLSAgICBGVF9VTG9uZyAgICAgICAgIGFsbG9jX2N1cnJlbnQ7Ci0gICAgRlRfVUxvbmcgICAgICAgICBhbGxvY19tYXg7Ci0gICAgRlRfVUxvbmcgICAgICAgICBhbGxvY19jb3VudDsKKyAgICBGVF9Mb25nICAgICAgICAgIGFsbG9jX3RvdGFsOworICAgIEZUX0xvbmcgICAgICAgICAgYWxsb2NfY3VycmVudDsKKyAgICBGVF9Mb25nICAgICAgICAgIGFsbG9jX21heDsKKyAgICBGVF9Mb25nICAgICAgICAgIGFsbG9jX2NvdW50OwogCiAgICAgRlRfQm9vbCAgICAgICAgICBib3VuZF90b3RhbDsKLSAgICBGVF9VTG9uZyAgICAgICAgIGFsbG9jX3RvdGFsX21heDsKKyAgICBGVF9Mb25nICAgICAgICAgIGFsbG9jX3RvdGFsX21heDsKIAogICAgIEZUX0Jvb2wgICAgICAgICAgYm91bmRfY291bnQ7Ci0gICAgRlRfVUxvbmcgICAgICAgICBhbGxvY19jb3VudF9tYXg7CisgICAgRlRfTG9uZyAgICAgICAgICBhbGxvY19jb3VudF9tYXg7CiAKICAgICBGVF9NZW1Tb3VyY2UgICAgIHNvdXJjZXNbRlRfTUVNX1NPVVJDRV9CVUNLRVRTXTsKIApAQCAtMTQyLDE0ICsxNDIsMTQgQEAKICNkZWZpbmUgRlRfTUVNX1NJWkVfTUlOICA3CiAjZGVmaW5lIEZUX01FTV9TSVpFX01BWCAgMTM4NDUxNjMKIAotI2RlZmluZSBGVF9GSUxFTkFNRSggeCApICAoKHgpID8gKHgpIDogInVua25vd24gZmlsZSIpCisjZGVmaW5lIEZUX0ZJTEVOQU1FKCB4ICkgICggKHgpID8gKHgpIDogInVua25vd24gZmlsZSIgKQogCiAKICAgLyoKICAgICogIFByaW1lIG51bWJlcnMgYXJlIHVnbHkgdG8gaGFuZGxlLiAgSXQgd291bGQgYmUgYmV0dGVyIHRvIGltcGxlbWVudAogICAgKiAgTC1IYXNoaW5nLCB3aGljaCBpcyAxMCUgZmFzdGVyIGFuZCBkb2Vzbid0IHJlcXVpcmUgZGl2aXNpb25zLgogICAgKi8KLSAgc3RhdGljIGNvbnN0IEZUX1VJbnQgIGZ0X21lbV9wcmltZXNbXSA9CisgIHN0YXRpYyBjb25zdCBGVF9JbnQgIGZ0X21lbV9wcmltZXNbXSA9CiAgIHsKICAgICA3LAogICAgIDExLApAQCAtMTg5LDEwICsxODksMTAgQEAKICAgfTsKIAogCi0gIHN0YXRpYyBGVF9VTG9uZwotICBmdF9tZW1fY2xvc2VzdF9wcmltZSggRlRfVUxvbmcgIG51bSApCisgIHN0YXRpYyBGVF9Mb25nCisgIGZ0X21lbV9jbG9zZXN0X3ByaW1lKCBGVF9Mb25nICBudW0gKQogICB7Ci0gICAgRlRfVUludCAgaTsKKyAgICBzaXplX3QgIGk7CiAKIAogICAgIGZvciAoIGkgPSAwOwpAQCAtMjA0LDcgKzIwNCw3IEBACiAgIH0KIAogCi0gIGV4dGVybiB2b2lkCisgIHN0YXRpYyB2b2lkCiAgIGZ0X21lbV9kZWJ1Z19wYW5pYyggY29uc3QgY2hhciogIGZtdCwKICAgICAgICAgICAgICAgICAgICAgICAuLi4gKQogICB7CkBAIC0yNTQsMTkgKzI1NCwyMCBAQAogICBzdGF0aWMgdm9pZAogICBmdF9tZW1fdGFibGVfcmVzaXplKCBGVF9NZW1UYWJsZSAgdGFibGUgKQogICB7Ci0gICAgRlRfVUxvbmcgIG5ld19zaXplOworICAgIEZUX0xvbmcgIG5ld19zaXplOwogCiAKICAgICBuZXdfc2l6ZSA9IGZ0X21lbV9jbG9zZXN0X3ByaW1lKCB0YWJsZS0+bm9kZXMgKTsKICAgICBpZiAoIG5ld19zaXplICE9IHRhYmxlLT5zaXplICkKICAgICB7CiAgICAgICBGVF9NZW1Ob2RlKiAgbmV3X2J1Y2tldHM7Ci0gICAgICBGVF9VTG9uZyAgICAgaTsKKyAgICAgIEZUX0xvbmcgICAgICBpOwogCiAKICAgICAgIG5ld19idWNrZXRzID0gKEZUX01lbU5vZGUgKikKLSAgICAgICAgICAgICAgICAgICAgICBmdF9tZW1fdGFibGVfYWxsb2MoIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3NpemUgKiBzaXplb2YgKCBGVF9NZW1Ob2RlICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICBmdF9tZW1fdGFibGVfYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zaXplICogKEZUX0xvbmcpc2l6ZW9mICggRlRfTWVtTm9kZSApICk7CiAgICAgICBpZiAoIG5ld19idWNrZXRzID09IE5VTEwgKQogICAgICAgICByZXR1cm47CiAKQEAgLTI4Miw3ICsyODMsNyBAQAogICAgICAgICB3aGlsZSAoIG5vZGUgKQogICAgICAgICB7CiAgICAgICAgICAgbmV4dCAgPSBub2RlLT5saW5rOwotICAgICAgICAgIGhhc2ggID0gRlRfTUVNX1ZBTCggbm9kZS0+YWRkcmVzcyApICUgbmV3X3NpemU7CisgICAgICAgICAgaGFzaCAgPSBGVF9NRU1fVkFMKCBub2RlLT5hZGRyZXNzICkgJSAoRlRfUHRyRGlzdCluZXdfc2l6ZTsKICAgICAgICAgICBwbm9kZSA9IG5ld19idWNrZXRzICsgaGFzaDsKIAogICAgICAgICAgIG5vZGUtPmxpbmsgPSBwbm9kZVswXTsKQEAgLTMyNSw4ICszMjYsOSBAQAogICAgIHRhYmxlLT5mcmVlICAgID0gbWVtb3J5LT5mcmVlOwogCiAgICAgdGFibGUtPmJ1Y2tldHMgPSAoRlRfTWVtTm9kZSAqKQotICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnktPmFsbG9jKCBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLT5zaXplICogc2l6ZW9mICggRlRfTWVtTm9kZSApICk7CisgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeS0+YWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLT5zaXplICogKEZUX0xvbmcpc2l6ZW9mICggRlRfTWVtTm9kZSApICk7CiAgICAgaWYgKCB0YWJsZS0+YnVja2V0cyApCiAgICAgICBGVF9BUlJBWV9aRVJPKCB0YWJsZS0+YnVja2V0cywgdGFibGUtPnNpemUgKTsKICAgICBlbHNlCkBAIC0zNDMsOSArMzQ1LDkgQEAKICAgc3RhdGljIHZvaWQKICAgZnRfbWVtX3RhYmxlX2Rlc3Ryb3koIEZUX01lbVRhYmxlICB0YWJsZSApCiAgIHsKLSAgICBGVF9VTG9uZyAgaTsKLSAgICBGVF9Mb25nICAgbGVha19jb3VudCA9IDA7Ci0gICAgRlRfVUxvbmcgIGxlYWtzICAgICAgPSAwOworICAgIEZUX0xvbmcgIGk7CisgICAgRlRfTG9uZyAgbGVha19jb3VudCA9IDA7CisgICAgRlRfTG9uZyAgbGVha3MgICAgICA9IDA7CiAKIAogICAgIEZUX0R1bXBNZW1vcnkoIHRhYmxlLT5tZW1vcnkgKTsKQEAgLTM1OSw3ICszNjEsNyBAQAogICAgICAgd2hpbGUgKCBub2RlICkKICAgICAgIHsKICAgICAgICAgbmV4dCAgICAgICA9IG5vZGUtPmxpbms7Ci0gICAgICAgIG5vZGUtPmxpbmsgPSAwOworICAgICAgICBub2RlLT5saW5rID0gTlVMTDsKIAogICAgICAgICBpZiAoIG5vZGUtPnNpemUgPiAwICkKICAgICAgICAgewpAQCAtMzgxLDcgKzM4Myw3IEBACiAgICAgICAgIGZ0X21lbV90YWJsZV9mcmVlKCB0YWJsZSwgbm9kZSApOwogICAgICAgICBub2RlID0gbmV4dDsKICAgICAgIH0KLSAgICAgIHRhYmxlLT5idWNrZXRzW2ldID0gMDsKKyAgICAgIHRhYmxlLT5idWNrZXRzW2ldID0gTlVMTDsKICAgICB9CiAKICAgICBmdF9tZW1fdGFibGVfZnJlZSggdGFibGUsIHRhYmxlLT5idWNrZXRzICk7CkBAIC00MzAsNyArNDMyLDcgQEAKIAogCiAgICAgaGFzaCAgPSBGVF9NRU1fVkFMKCBhZGRyZXNzICk7Ci0gICAgcG5vZGUgPSB0YWJsZS0+YnVja2V0cyArICggaGFzaCAlIHRhYmxlLT5zaXplICk7CisgICAgcG5vZGUgPSB0YWJsZS0+YnVja2V0cyArICggaGFzaCAlIChGVF9QdHJEaXN0KXRhYmxlLT5zaXplICk7CiAKICAgICBmb3IgKDs7KQogICAgIHsKQEAgLTQ2Niw4ICs0NjgsOCBAQAogICAgICAgaWYgKCBub2RlID09IE5VTEwgKQogICAgICAgICBicmVhazsKIAotICAgICAgaWYgKCBub2RlLT5maWxlX25hbWUgPT0gX2Z0X2RlYnVnX2ZpbGUgJiYKLSAgICAgICAgICAgbm9kZS0+bGluZV9ubyAgID09IF9mdF9kZWJ1Z19saW5lbm8gICApCisgICAgICBpZiAoIG5vZGUtPmZpbGVfbmFtZSA9PSBfZnRfZGVidWdfZmlsZSAgICYmCisgICAgICAgICAgIG5vZGUtPmxpbmVfbm8gICA9PSBfZnRfZGVidWdfbGluZW5vICkKICAgICAgICAgZ290byBFeGl0OwogCiAgICAgICBwbm9kZSA9ICZub2RlLT5saW5rOwpAQCAtNDg1LDExICs0ODcsMTEgQEAKICAgICBub2RlLT5tYXhfYmxvY2tzID0gMDsKICAgICBub2RlLT5hbGxfYmxvY2tzID0gMDsKIAotICAgIG5vZGUtPmN1cl9zaXplICAgPSAwOwotICAgIG5vZGUtPm1heF9zaXplICAgPSAwOwotICAgIG5vZGUtPmFsbF9zaXplICAgPSAwOworICAgIG5vZGUtPmN1cl9zaXplID0gMDsKKyAgICBub2RlLT5tYXhfc2l6ZSA9IDA7CisgICAgbm9kZS0+YWxsX3NpemUgPSAwOwogCi0gICAgbm9kZS0+Y3VyX21heCAgICA9IDA7CisgICAgbm9kZS0+Y3VyX21heCA9IDA7CiAKICAgICBub2RlLT5saW5rID0gTlVMTDsKICAgICBub2RlLT5oYXNoID0gaGFzaDsKQEAgLTUwMyw3ICs1MDUsNyBAQAogICBzdGF0aWMgdm9pZAogICBmdF9tZW1fdGFibGVfc2V0KCBGVF9NZW1UYWJsZSAgdGFibGUsCiAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgIHNpemUsCiAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICBkZWx0YSApCiAgIHsKICAgICBGVF9NZW1Ob2RlICAqcG5vZGUsIG5vZGU7CkBAIC01NTgsNyArNTYwLDcgQEAKICAgICAgICAgICBzb3VyY2UtPm1heF9ibG9ja3MgPSBzb3VyY2UtPmN1cl9ibG9ja3M7CiAgICAgICB9CiAKLSAgICAgIGlmICggc2l6ZSA+IChGVF9VTG9uZylzb3VyY2UtPmN1cl9tYXggKQorICAgICAgaWYgKCBzaXplID4gc291cmNlLT5jdXJfbWF4ICkKICAgICAgICAgc291cmNlLT5jdXJfbWF4ID0gc2l6ZTsKIAogICAgICAgaWYgKCBkZWx0YSAhPSAwICkKQEAgLTY3MSw3ICs2NzMsNyBAQAogICB9CiAKIAotICBleHRlcm4gRlRfUG9pbnRlcgorICBzdGF0aWMgRlRfUG9pbnRlcgogICBmdF9tZW1fZGVidWdfYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAogICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgc2l6ZSApCiAgIHsKQEAgLTY4OCwxNCArNjkwLDE0IEBACiAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIC8qIHJldHVybiBOVUxMIGlmIHRoaXMgYWxsb2NhdGlvbiB3b3VsZCBvdmVyZmxvdyB0aGUgbWF4aW11bSBoZWFwIHNpemUgKi8KLSAgICBpZiAoIHRhYmxlLT5ib3VuZF90b3RhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICB0YWJsZS0+YWxsb2NfdG90YWxfbWF4IC0gdGFibGUtPmFsbG9jX2N1cnJlbnQgPiAoRlRfVUxvbmcpc2l6ZSApCisgICAgaWYgKCB0YWJsZS0+Ym91bmRfdG90YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICB0YWJsZS0+YWxsb2NfdG90YWxfbWF4IC0gdGFibGUtPmFsbG9jX2N1cnJlbnQgPiBzaXplICkKICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgYmxvY2sgPSAoRlRfQnl0ZSAqKWZ0X21lbV90YWJsZV9hbGxvYyggdGFibGUsIHNpemUgKTsKICAgICBpZiAoIGJsb2NrICkKICAgICB7Ci0gICAgICBmdF9tZW1fdGFibGVfc2V0KCB0YWJsZSwgYmxvY2ssIChGVF9VTG9uZylzaXplLCAwICk7CisgICAgICBmdF9tZW1fdGFibGVfc2V0KCB0YWJsZSwgYmxvY2ssIHNpemUsIDAgKTsKIAogICAgICAgdGFibGUtPmFsbG9jX2NvdW50Kys7CiAgICAgfQpAQCAtNzA3LDcgKzcwOSw3IEBACiAgIH0KIAogCi0gIGV4dGVybiB2b2lkCisgIHN0YXRpYyB2b2lkCiAgIGZ0X21lbV9kZWJ1Z19mcmVlKCBGVF9NZW1vcnkgICBtZW1vcnksCiAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBibG9jayApCiAgIHsKQEAgLTczMSw3ICs3MzMsNyBAQAogICB9CiAKIAotICBleHRlcm4gRlRfUG9pbnRlcgorICBzdGF0aWMgRlRfUG9pbnRlcgogICBmdF9tZW1fZGVidWdfcmVhbGxvYyggRlRfTWVtb3J5ICAgbWVtb3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgY3VyX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICBuZXdfc2l6ZSwKQEAgLTc4NywyMSArNzg5LDIyIEBACiAgICAgICAgICB0YWJsZS0+YWxsb2NfY291bnQgPj0gdGFibGUtPmFsbG9jX2NvdW50X21heCApCiAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIGRlbHRhID0gKEZUX0xvbmcpKCBuZXdfc2l6ZSAtIGN1cl9zaXplICk7CisgICAgZGVsdGEgPSBuZXdfc2l6ZSAtIGN1cl9zaXplOwogCiAgICAgLyogcmV0dXJuIE5VTEwgaWYgdGhpcyBhbGxvY2F0aW9uIHdvdWxkIG92ZXJmbG93IHRoZSBtYXhpbXVtIGhlYXAgc2l6ZSAqLwotICAgIGlmICggZGVsdGEgPiAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICB0YWJsZS0+Ym91bmRfdG90YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIHRhYmxlLT5hbGxvY19jdXJyZW50ICsgKEZUX1VMb25nKWRlbHRhID4gdGFibGUtPmFsbG9jX3RvdGFsX21heCApCisgICAgaWYgKCBkZWx0YSA+IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgdGFibGUtPmJvdW5kX3RvdGFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgIHRhYmxlLT5hbGxvY19jdXJyZW50ICsgZGVsdGEgPiB0YWJsZS0+YWxsb2NfdG90YWxfbWF4ICkKICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgbmV3X2Jsb2NrID0gKEZUX0J5dGUgKilmdF9tZW1fdGFibGVfYWxsb2MoIHRhYmxlLCBuZXdfc2l6ZSApOworICAgIG5ld19ibG9jayA9IChGVF9Qb2ludGVyKWZ0X21lbV90YWJsZV9hbGxvYyggdGFibGUsIG5ld19zaXplICk7CiAgICAgaWYgKCBuZXdfYmxvY2sgPT0gTlVMTCApCiAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGZ0X21lbV90YWJsZV9zZXQoIHRhYmxlLCAoRlRfQnl0ZSopbmV3X2Jsb2NrLCBuZXdfc2l6ZSwgZGVsdGEgKTsKIAotICAgIGZ0X21lbWNweSggbmV3X2Jsb2NrLCBibG9jaywgY3VyX3NpemUgPCBuZXdfc2l6ZSA/IGN1cl9zaXplIDogbmV3X3NpemUgKTsKKyAgICBmdF9tZW1jcHkoIG5ld19ibG9jaywgYmxvY2ssIGN1cl9zaXplIDwgbmV3X3NpemUgPyAoc2l6ZV90KWN1cl9zaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHNpemVfdCluZXdfc2l6ZSApOwogCiAgICAgZnRfbWVtX3RhYmxlX3JlbW92ZSggdGFibGUsIChGVF9CeXRlKilibG9jaywgZGVsdGEgKTsKIApAQCAtODQ0LDcgKzg0Nyw3IEBACiAgICAgICAgICAgaWYgKCB0b3RhbF9tYXggPiAwICkKICAgICAgICAgICB7CiAgICAgICAgICAgICB0YWJsZS0+Ym91bmRfdG90YWwgICAgID0gMTsKLSAgICAgICAgICAgIHRhYmxlLT5hbGxvY190b3RhbF9tYXggPSAoRlRfVUxvbmcpdG90YWxfbWF4OworICAgICAgICAgICAgdGFibGUtPmFsbG9jX3RvdGFsX21heCA9IHRvdGFsX21heDsKICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtODU3LDcgKzg2MCw3IEBACiAgICAgICAgICAgaWYgKCB0b3RhbF9jb3VudCA+IDAgKQogICAgICAgICAgIHsKICAgICAgICAgICAgIHRhYmxlLT5ib3VuZF9jb3VudCAgICAgPSAxOwotICAgICAgICAgICAgdGFibGUtPmFsbG9jX2NvdW50X21heCA9IChGVF9VTG9uZyl0b3RhbF9jb3VudDsKKyAgICAgICAgICAgIHRhYmxlLT5hbGxvY19jb3VudF9tYXggPSB0b3RhbF9jb3VudDsKICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtODk2LDcgKzg5OSw2IEBACiAgIH0KIAogCi0KICAgc3RhdGljIGludAogICBmdF9tZW1fc291cmNlX2NvbXBhcmUoIGNvbnN0IHZvaWQqICBwMSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiAgcDIgKQpAQCAtOTI1LDcgKzkyNyw3IEBACiAgICAgICBGVF9NZW1Tb3VyY2UqICBidWNrZXQgPSB0YWJsZS0+c291cmNlczsKICAgICAgIEZUX01lbVNvdXJjZSogIGxpbWl0ICA9IGJ1Y2tldCArIEZUX01FTV9TT1VSQ0VfQlVDS0VUUzsKICAgICAgIEZUX01lbVNvdXJjZSogIHNvdXJjZXM7Ci0gICAgICBGVF9VSW50ICAgICAgICBubiwgY291bnQ7CisgICAgICBGVF9JbnQgICAgICAgICBubiwgY291bnQ7CiAgICAgICBjb25zdCBjaGFyKiAgICBmbXQ7CiAKIApAQCAtOTM5LDggKzk0MSw5IEBACiAgICAgICAgICAgY291bnQrKzsKICAgICAgIH0KIAotICAgICAgc291cmNlcyA9IChGVF9NZW1Tb3VyY2UqKWZ0X21lbV90YWJsZV9hbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLCBzaXplb2YgKCAqc291cmNlcyApICogY291bnQgKTsKKyAgICAgIHNvdXJjZXMgPSAoRlRfTWVtU291cmNlKikKKyAgICAgICAgICAgICAgICAgIGZ0X21lbV90YWJsZV9hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgdGFibGUsIGNvdW50ICogKEZUX0xvbmcpc2l6ZW9mICggKnNvdXJjZXMgKSApOwogCiAgICAgICBjb3VudCA9IDA7CiAgICAgICBmb3IgKCBidWNrZXQgPSB0YWJsZS0+c291cmNlczsgYnVja2V0IDwgbGltaXQ7IGJ1Y2tldCsrICkKQEAgLTk1Miw3ICs5NTUsMTAgQEAKICAgICAgICAgICBzb3VyY2VzW2NvdW50KytdID0gc291cmNlOwogICAgICAgfQogCi0gICAgICBmdF9xc29ydCggc291cmNlcywgY291bnQsIHNpemVvZiAoICpzb3VyY2VzICksIGZ0X21lbV9zb3VyY2VfY29tcGFyZSApOworICAgICAgZnRfcXNvcnQoIHNvdXJjZXMsCisgICAgICAgICAgICAgICAgKHNpemVfdCljb3VudCwKKyAgICAgICAgICAgICAgICBzaXplb2YgKCAqc291cmNlcyApLAorICAgICAgICAgICAgICAgIGZ0X21lbV9zb3VyY2VfY29tcGFyZSApOwogCiAgICAgICBwcmludGYoICJGcmVlVHlwZSBNZW1vcnkgRHVtcDogIgogICAgICAgICAgICAgICAiY3VycmVudD0lbGQgbWF4PSVsZCB0b3RhbD0lbGQgY291bnQ9JWxkXG4iLApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRkZWJ1Zy5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRkZWJ1Zy5jCmluZGV4IDM5YWM2YWQuLjAzZTE4YTggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0ZGVidWcuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGRlYnVnLmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgRGVidWdnaW5nIGFuZCBsb2dnaW5nIGNvbXBvbmVudCAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwNCwgMjAwOCwgMjAxMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KQEAgLTE1Miw4ICsxNTIsOCBAQAogICAvKiB0aGUgbWVtb3J5IGFuZCBzdHJlYW0gY29tcG9uZW50cyB3aGljaCBhcmUgc2V0IHRvIDcgYW5kIDUsICAgICAgICAgICAgKi8KICAgLyogcmVzcGVjdGl2ZWx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTZWUgdGhlIGZpbGUgPGluY2x1ZGUvaW50ZXJuYWwvZnR0cmFjZS5oPiBmb3IgZGV0YWlscyBvZiB0aGUgICAgICAgICAgKi8KLSAgLyogYXZhaWxhYmxlIHRvZ2dsZSBuYW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNlZSB0aGUgZmlsZSBgaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHRyYWNlLmgnIGZvciBkZXRhaWxzIG9mICAgICAqLworICAvKiB0aGUgYXZhaWxhYmxlIHRvZ2dsZSBuYW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qIFRoZSBsZXZlbCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNzsgMCBtZWFucyBxdWlldCAoZXhjZXB0IGZvciBzZXJpb3VzICAqLwogICAvKiBydW50aW1lIGVycm9ycyksIGFuZCA3IG1lYW5zIF92ZXJ5XyB2ZXJib3NlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0Zm50Zm10LmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGZudGZtdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZTc0MzEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGZudGZtdC5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0Zm50Zm10LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGcmVlVHlwZSB1dGlsaXR5IGZpbGUgZm9yIGZvbnQgZm9ybWF0cyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwMi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CisjaW5jbHVkZSBGVF9GT05UX0ZPUk1BVFNfSAorI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICisjaW5jbHVkZSBGVF9TRVJWSUNFX0ZPTlRfRk9STUFUX0gKKworCisgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRmbnRmbXQuaCAqLworCisgIEZUX0VYUE9SVF9ERUYoIGNvbnN0IGNoYXIqICkKKyAgRlRfR2V0X0ZvbnRfRm9ybWF0KCBGVF9GYWNlICBmYWNlICkKKyAgeworICAgIGNvbnN0IGNoYXIqICByZXN1bHQgPSBOVUxMOworCisKKyAgICBpZiAoIGZhY2UgKQorICAgICAgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHJlc3VsdCwgRk9OVF9GT1JNQVQgKTsKKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworCisgIC8qIGRlcHJlY2F0ZWQgZnVuY3Rpb24gbmFtZTsgcmV0YWluZWQgZm9yIEFCSSBjb21wYXRpYmlsaXR5ICovCisKKyAgRlRfRVhQT1JUX0RFRiggY29uc3QgY2hhciogKQorICBGVF9HZXRfWDExX0ZvbnRfRm9ybWF0KCBGVF9GYWNlICBmYWNlICkKKyAgeworICAgIGNvbnN0IGNoYXIqICByZXN1bHQgPSBOVUxMOworCisKKyAgICBpZiAoIGZhY2UgKQorICAgICAgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHJlc3VsdCwgRk9OVF9GT1JNQVQgKTsKKworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0ZnN0eXBlLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGZzdHlwZS5jCmluZGV4IDZiNDllZjguLmNkMzQ1OGYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0ZnN0eXBlLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRmc3R5cGUuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBGcmVlVHlwZSB1dGlsaXR5IGZpbGUgdG8gYWNjZXNzIEZTVHlwZSBkYXRhIChib2R5KS4gICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOCwgMjAwOSwgMjAxNCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDgtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRnYXNwLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGdhc3AuYwppbmRleCA4NDg1ZDI5Li5iYmQyNTdjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGdhc3AuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGdhc3AuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBBY2Nlc3Mgb2YgVHJ1ZVR5cGUncyBgZ2FzcCcgdGFibGUgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDctMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRnbG9hZHIuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0Z2xvYWRyLmMKaW5kZXggM2NjNWM3YS4uN2UyODYzOCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRnbG9hZHIuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGdsb2Fkci5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFRoZSBGcmVlVHlwZSBnbHlwaCBsb2FkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMDYsIDIwMTAsIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwMi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC0yMTIsNyArMjEyLDggQEAKIAogCiAgICAgLyogY2hlY2sgcG9pbnRzICYgdGFncyAqLwotICAgIG5ld19tYXggPSBiYXNlLT5uX3BvaW50cyArIGN1cnJlbnQtPm5fcG9pbnRzICsgbl9wb2ludHM7CisgICAgbmV3X21heCA9IChGVF9VSW50KWJhc2UtPm5fcG9pbnRzICsgKEZUX1VJbnQpY3VycmVudC0+bl9wb2ludHMgKworICAgICAgICAgICAgICBuX3BvaW50czsKICAgICBvbGRfbWF4ID0gbG9hZGVyLT5tYXhfcG9pbnRzOwogCiAgICAgaWYgKCBuZXdfbWF4ID4gb2xkX21heCApCkBAIC0yNDUsNyArMjQ2LDcgQEAKIAogICAgIC8qIGNoZWNrIGNvbnRvdXJzICovCiAgICAgb2xkX21heCA9IGxvYWRlci0+bWF4X2NvbnRvdXJzOwotICAgIG5ld19tYXggPSBiYXNlLT5uX2NvbnRvdXJzICsgY3VycmVudC0+bl9jb250b3VycyArCisgICAgbmV3X21heCA9IChGVF9VSW50KWJhc2UtPm5fY29udG91cnMgKyAoRlRfVUludCljdXJyZW50LT5uX2NvbnRvdXJzICsKICAgICAgICAgICAgICAgbl9jb250b3VyczsKICAgICBpZiAoIG5ld19tYXggPiBvbGRfbWF4ICkKICAgICB7CkBAIC0zMjksOSArMzMwLDkgQEAKICAgICBGVF9HbHlwaExvYWQgIGJhc2U7CiAgICAgRlRfR2x5cGhMb2FkICBjdXJyZW50OwogCi0gICAgRlRfVUludCAgICAgICBuX2N1cnJfY29udG91cnM7Ci0gICAgRlRfVUludCAgICAgICBuX2Jhc2VfcG9pbnRzOwotICAgIEZUX1VJbnQgICAgICAgbjsKKyAgICBGVF9JbnQgICAgICAgIG5fY3Vycl9jb250b3VyczsKKyAgICBGVF9JbnQgICAgICAgIG5fYmFzZV9wb2ludHM7CisgICAgRlRfSW50ICAgICAgICBuOwogCiAKICAgICBpZiAoICFsb2FkZXIgKQpAQCAtMzY1LDggKzM2Niw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoTG9hZGVyICBzb3VyY2UgKQogICB7CiAgICAgRlRfRXJyb3IgIGVycm9yOwotICAgIEZUX1VJbnQgICBudW1fcG9pbnRzICAgPSBzb3VyY2UtPmJhc2Uub3V0bGluZS5uX3BvaW50czsKLSAgICBGVF9VSW50ICAgbnVtX2NvbnRvdXJzID0gc291cmNlLT5iYXNlLm91dGxpbmUubl9jb250b3VyczsKKyAgICBGVF9VSW50ICAgbnVtX3BvaW50cyAgID0gKEZUX1VJbnQpc291cmNlLT5iYXNlLm91dGxpbmUubl9wb2ludHM7CisgICAgRlRfVUludCAgIG51bV9jb250b3VycyA9IChGVF9VSW50KXNvdXJjZS0+YmFzZS5vdXRsaW5lLm5fY29udG91cnM7CiAKIAogICAgIGVycm9yID0gRlRfR2x5cGhMb2FkZXJfQ2hlY2tQb2ludHMoIHRhcmdldCwgbnVtX3BvaW50cywgbnVtX2NvbnRvdXJzICk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGdseXBoLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGdseXBoLmMKaW5kZXggYWMxNzhjNC4uY2I3ZmMzNyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRnbHlwaC5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0Z2x5cGguYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBGcmVlVHlwZSBjb252ZW5pZW5jZSBmdW5jdGlvbnMgdG8gaGFuZGxlIGdseXBocyAoYm9keSkuICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDA1LCAyMDA3LCAyMDA4LCAyMDEwLCAyMDEyLTIwMTQgYnkgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtODIsNyArODIsNyBAQAogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgRlRfQml0bWFwX05ldyggJmdseXBoLT5iaXRtYXAgKTsKKyAgICAgIEZUX0JpdG1hcF9Jbml0KCAmZ2x5cGgtPmJpdG1hcCApOwogICAgICAgZXJyb3IgPSBGVF9CaXRtYXBfQ29weSggbGlicmFyeSwgJnNsb3QtPmJpdG1hcCwgJmdseXBoLT5iaXRtYXAgKTsKICAgICB9CiAKQEAgLTEyNiw5ICsxMjYsOSBAQAogCiAKICAgICBjYm94LT54TWluID0gZ2x5cGgtPmxlZnQgPDwgNjsKLSAgICBjYm94LT54TWF4ID0gY2JveC0+eE1pbiArICggZ2x5cGgtPmJpdG1hcC53aWR0aCA8PCA2ICk7CisgICAgY2JveC0+eE1heCA9IGNib3gtPnhNaW4gKyAoRlRfUG9zKSggZ2x5cGgtPmJpdG1hcC53aWR0aCA8PCA2ICk7CiAgICAgY2JveC0+eU1heCA9IGdseXBoLT50b3AgPDwgNjsKLSAgICBjYm94LT55TWluID0gY2JveC0+eU1heCAtICggZ2x5cGgtPmJpdG1hcC5yb3dzIDw8IDYgKTsKKyAgICBjYm94LT55TWluID0gY2JveC0+eU1heCAtIChGVF9Qb3MpKCBnbHlwaC0+Yml0bWFwLnJvd3MgPDwgNiApOwogICB9CiAKIApAQCAtMTczLDcgKzE3Myw5IEBACiAgICAgfQogCiAgICAgLyogYWxsb2NhdGUgbmV3IG91dGxpbmUgKi8KLSAgICBlcnJvciA9IEZUX091dGxpbmVfTmV3KCBsaWJyYXJ5LCBzb3VyY2UtPm5fcG9pbnRzLCBzb3VyY2UtPm5fY29udG91cnMsCisgICAgZXJyb3IgPSBGVF9PdXRsaW5lX05ldyggbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludClzb3VyY2UtPm5fcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+bl9jb250b3VycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2x5cGgtPm91dGxpbmUgKTsKICAgICBpZiAoIGVycm9yICkKICAgICAgIGdvdG8gRXhpdDsKQEAgLTIwNSw4ICsyMDcsMTAgQEAKICAgICBGVF9MaWJyYXJ5ICAgICAgIGxpYnJhcnkgPSBGVF9HTFlQSCggc291cmNlICktPmxpYnJhcnk7CiAKIAotICAgIGVycm9yID0gRlRfT3V0bGluZV9OZXcoIGxpYnJhcnksIHNvdXJjZS0+b3V0bGluZS5uX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UtPm91dGxpbmUubl9jb250b3VycywgJnRhcmdldC0+b3V0bGluZSApOworICAgIGVycm9yID0gRlRfT3V0bGluZV9OZXcoIGxpYnJhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpc291cmNlLT5vdXRsaW5lLm5fcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+b3V0bGluZS5uX2NvbnRvdXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQtPm91dGxpbmUgKTsKICAgICBpZiAoICFlcnJvciApCiAgICAgICBGVF9PdXRsaW5lX0NvcHkoICZzb3VyY2UtPm91dGxpbmUsICZ0YXJnZXQtPm91dGxpbmUgKTsKIApAQCAtMjg3LDcgKzI5MSw3IEBACiAgICAgIEZUX0dseXBoICAgZ2x5cGggID0gTlVMTDsKIAogCi0gICAgICphZ2x5cGggPSAwOworICAgICAqYWdseXBoID0gTlVMTDsKIAogICAgICBpZiAoICFGVF9BTExPQyggZ2x5cGgsIGNsYXp6LT5nbHlwaF9zaXplICkgKQogICAgICB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGd4dmFsLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGd4dmFsLmMKaW5kZXggYTY1ZjRjOC4uNTg4NjhmMiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRneHZhbC5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0Z3h2YWwuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBGcmVlVHlwZSBBUEkgZm9yIHZhbGlkYXRpbmcgVHJ1ZVR5ZXBHWC9BQVQgdGFibGVzIChib2R5KS4gICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDA2LCAyMDEwLCAyMDEzLCAyMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDQtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIE1hc2F0YWtlIFlBTUFUTywgUmVkaGF0IEsuSywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRpbml0LmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGluaXQuYwppbmRleCBjNGM4ODIwLi5iNjVhOTFkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGluaXQuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGluaXQuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBGcmVlVHlwZSBpbml0aWFsaXphdGlvbiBsYXllciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAyLCAyMDA1LCAyMDA3LCAyMDA5LCAyMDEyLTIwMTQgYnkgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtMjMsOCArMjMsOCBAQAogICAvKiAgRlRfQWRkX0RlZmF1bHRfTW9kdWxlcygpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhZGQgdGhlIHNldCBvZiBkZWZhdWx0IG1vZHVsZXMgdG8gYSAgICAgICovCiAgIC8qICAgICBmcmVzaCBuZXcgbGlicmFyeSBvYmplY3QuICBUaGUgc2V0IGlzIHRha2VuIGZyb20gdGhlIGhlYWRlciBmaWxlICAqLwotICAvKiAgICAgYGNvbmZpZy9mdG1vZHVsZS5oJy4gIFNlZSB0aGUgZG9jdW1lbnQgYEZyZWVUeXBlIDIuMCBCdWlsZCAgICAgICAgKi8KLSAgLyogICAgIFN5c3RlbScgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBgZnJlZXR5cGUvY29uZmlnL2Z0bW9kdWxlLmgnLiAgU2VlIHRoZSBkb2N1bWVudCBgRnJlZVR5cGUgMi4wICAgICAqLworICAvKiAgICAgQnVpbGQgU3lzdGVtJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICBGVF9Jbml0X0ZyZWVUeXBlKCk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgc3lzdGVtIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0sICAgKi8KQEAgLTEzOCw3ICsxMzgsNyBAQAogI2luY2x1ZGUgRlRfQ09ORklHX01PRFVMRVNfSAogCiAgICAgRlRfRlJFRSggY2xhc3NlcyApOwotICAgIHBpY19jb250YWluZXItPmRlZmF1bHRfbW9kdWxlX2NsYXNzZXMgPSAwOworICAgIHBpY19jb250YWluZXItPmRlZmF1bHRfbW9kdWxlX2NsYXNzZXMgPSBOVUxMOwogICB9CiAKIApAQCAtMTY0LDcgKzE2NCw3IEBACiAKICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7CiAKLSAgICBwaWNfY29udGFpbmVyLT5kZWZhdWx0X21vZHVsZV9jbGFzc2VzID0gMDsKKyAgICBwaWNfY29udGFpbmVyLT5kZWZhdWx0X21vZHVsZV9jbGFzc2VzID0gTlVMTDsKIAogICAgIGlmICggRlRfQUxMT0MoIGNsYXNzZXMsIHNpemVvZiAoIEZUX01vZHVsZV9DbGFzcyogKSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIEZUX05VTV9NT0RVTEVfQ0xBU1NFUyArIDEgKSApICkKQEAgLTE3Miw4ICsxNzIsOCBAQAogCiAgICAgLyogaW5pdGlhbGl6ZSBhbGwgcG9pbnRlcnMgdG8gMCwgZXNwZWNpYWxseSB0aGUgbGFzdCBvbmUgKi8KICAgICBmb3IgKCBpID0gMDsgaSA8IEZUX05VTV9NT0RVTEVfQ0xBU1NFUzsgaSsrICkKLSAgICAgIGNsYXNzZXNbaV0gPSAwOwotICAgIGNsYXNzZXNbRlRfTlVNX01PRFVMRV9DTEFTU0VTXSA9IDA7CisgICAgICBjbGFzc2VzW2ldID0gTlVMTDsKKyAgICBjbGFzc2VzW0ZUX05VTV9NT0RVTEVfQ0xBU1NFU10gPSBOVUxMOwogCiAgICAgaSA9IDA7CiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0bGNkZmlsLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGxjZGZpbC5jCmluZGV4IGQ4YmNiYmYuLmZmNmY3ZTkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0bGNkZmlsLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRsY2RmaWwuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBGcmVlVHlwZSBBUEkgZm9yIGNvbG9yIGZpbHRlcmluZyBvZiBzdWJwaXhlbCBiaXRtYXAgZ2x5cGhzIChib2R5KS4gICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNiwgMjAwOC0yMDEwLCAyMDEzLCAyMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtNDgsNyArNDgsNyBAQAogCiAgICAgICAvKiB0YWtlIGNhcmUgb2YgYml0bWFwIGZsb3cgKi8KICAgICAgIGlmICggYml0bWFwLT5waXRjaCA8IDAgKQotICAgICAgICBsaW5lIC09IGJpdG1hcC0+cGl0Y2ggKiAoIGJpdG1hcC0+cm93cyAtIDEgKTsKKyAgICAgICAgbGluZSAtPSBiaXRtYXAtPnBpdGNoICogKEZUX0ludCkoIGJpdG1hcC0+cm93cyAtIDEgKTsKIAogICAgICAgLyogYGZpcicgYW5kIGBwaXgnIG11c3QgYmUgYXQgbGVhc3QgMzIgYml0IHdpZGUsIHNpbmNlIHRoZSBzdW0gb2YgKi8KICAgICAgIC8qIHRoZSB2YWx1ZXMgaW4gYHdlaWdodHMnIGNhbiBleGNlZWQgMHhGRiAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMTIsNyArMTEyLDcgQEAKIAogICAgICAgLyogdGFrZSBjYXJlIG9mIGJpdG1hcCBmbG93ICovCiAgICAgICBpZiAoIGJpdG1hcC0+cGl0Y2ggPCAwICkKLSAgICAgICAgY29sdW1uIC09IGJpdG1hcC0+cGl0Y2ggKiAoIGJpdG1hcC0+cm93cyAtIDEgKTsKKyAgICAgICAgY29sdW1uIC09IGJpdG1hcC0+cGl0Y2ggKiAoRlRfSW50KSggYml0bWFwLT5yb3dzIC0gMSApOwogCiAgICAgICBmb3IgKCA7IHdpZHRoID4gMDsgd2lkdGgtLSwgY29sdW1uKysgKQogICAgICAgewpAQCAtMTgyLDcgKzE4Miw3IEBACiAgICAgRlRfVUludCAgaGVpZ2h0ID0gKEZUX1VJbnQpYml0bWFwLT5yb3dzOwogICAgIEZUX0ludCAgIHBpdGNoICA9IGJpdG1hcC0+cGl0Y2g7CiAKLSAgICBzdGF0aWMgY29uc3QgaW50ICBmaWx0ZXJzWzNdWzNdID0KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50ICBmaWx0ZXJzWzNdWzNdID0KICAgICB7CiAgICAgICB7IDY1NTM4ICogOS8xMywgNjU1MzggKiAxLzYsIDY1NTM4ICogMS8xMyB9LAogICAgICAgeyA2NTUzOCAqIDMvMTMsIDY1NTM4ICogNC82LCA2NTUzOCAqIDMvMTMgfSwKQEAgLTIwMCw3ICsyMDAsNyBAQAogCiAgICAgICAvKiB0YWtlIGNhcmUgb2YgYml0bWFwIGZsb3cgKi8KICAgICAgIGlmICggYml0bWFwLT5waXRjaCA8IDAgKQotICAgICAgICBsaW5lIC09IGJpdG1hcC0+cGl0Y2ggKiAoIGJpdG1hcC0+cm93cyAtIDEgKTsKKyAgICAgICAgbGluZSAtPSBiaXRtYXAtPnBpdGNoICogKEZUX0ludCkoIGJpdG1hcC0+cm93cyAtIDEgKTsKIAogICAgICAgZm9yICggOyBoZWlnaHQgPiAwOyBoZWlnaHQtLSwgbGluZSArPSBwaXRjaCApCiAgICAgICB7CkBAIC0yNDMsMTIgKzI0MywxMiBAQAogCiAgICAgICAvKiB0YWtlIGNhcmUgb2YgYml0bWFwIGZsb3cgKi8KICAgICAgIGlmICggYml0bWFwLT5waXRjaCA8IDAgKQotICAgICAgICBjb2x1bW4gLT0gYml0bWFwLT5waXRjaCAqICggYml0bWFwLT5yb3dzIC0gMSApOworICAgICAgICBjb2x1bW4gLT0gYml0bWFwLT5waXRjaCAqIChGVF9JbnQpKCBiaXRtYXAtPnJvd3MgLSAxICk7CiAKICAgICAgIGZvciAoIDsgd2lkdGggPiAwOyB3aWR0aC0tLCBjb2x1bW4rKyApCiAgICAgICB7CiAgICAgICAgIEZUX0J5dGUqICBjb2wgICAgID0gY29sdW1uOwotICAgICAgICBGVF9CeXRlKiAgY29sX2VuZCA9IGNvbCArIGhlaWdodCAqIHBpdGNoOworICAgICAgICBGVF9CeXRlKiAgY29sX2VuZCA9IGNvbCArIChGVF9JbnQpaGVpZ2h0ICogcGl0Y2g7CiAKIAogICAgICAgICBmb3IgKCA7IGNvbCA8IGNvbF9lbmQ7IGNvbCArPSAzICogcGl0Y2ggKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRtYWMuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0bWFjLmMKaW5kZXggNTMwMWFiNC4uMTE0YmJiNiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRtYWMuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdG1hYy5jCkBAIC04LDcgKzgsNyBAQAogLyogIFRoaXMgZmlsZSBpcyBmb3IgTWFjIE9TIFggb25seTsgc2VlIGJ1aWxkcy9tYWMvZnRvbGRtYWMuYyBmb3IgICAgICAgICAgKi8KIC8qICBjbGFzc2ljIHBsYXRmb3JtcyBidWlsdCBieSBNUFcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDksIDIwMTMsIDIwMTQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgSnVzdCB2YW4gUm9zc3VtLCBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC02MTgsMTEgKzYxOCwxMSBAQAogICAgICAgICAgIHRvdGFsX3NpemUgKz0gNjsgLyogY29kZSArIDQgYnl0ZXMgY2h1bmsgbGVuZ3RoICovCiAgICAgICB9CiAKLSAgICAgIHRvdGFsX3NpemUgKz0gR2V0SGFuZGxlU2l6ZSggcG9zdF9kYXRhICkgLSAyOworICAgICAgdG90YWxfc2l6ZSArPSAoRlRfVUxvbmcpR2V0SGFuZGxlU2l6ZSggcG9zdF9kYXRhICkgLSAyOwogICAgICAgbGFzdF9jb2RlID0gY29kZTsKIAotICAgICAgLyogZGV0ZWN0IGludGVnZXIgb3ZlcmZsb3dzICovCi0gICAgICBpZiAoIHRvdGFsX3NpemUgPCBvbGRfdG90YWxfc2l6ZSApCisgICAgICAvKiBkZXRlY3QgcmVzb3VyY2UgZm9yayBvdmVyZmxvdyAqLworICAgICAgaWYgKCBGVF9NQUNfUkZPUktfTUFYX0xFTiA8IHRvdGFsX3NpemUgKQogICAgICAgewogICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBBcnJheV9Ub29fTGFyZ2UgKTsKICAgICAgICAgZ290byBFcnJvcjsKQEAgLTc0Nyw2ICs3NDcsMTEgQEAKICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9IYW5kbGUgKTsKIAogICAgIHNmbnRfc2l6ZSA9IChGVF9VTG9uZylHZXRIYW5kbGVTaXplKCBzZm50ICk7CisKKyAgICAvKiBkZXRlY3QgcmVzb3VyY2UgZm9yayBvdmVyZmxvdyAqLworICAgIGlmICggRlRfTUFDX1JGT1JLX01BWF9MRU4gPCBzZm50X3NpemUgKQorICAgICAgcmV0dXJuIEZUX1RIUk9XKCBBcnJheV9Ub29fTGFyZ2UgKTsKKwogICAgIGlmICggRlRfQUxMT0MoIHNmbnRfZGF0YSwgKEZUX0xvbmcpc2ZudF9zaXplICkgKQogICAgIHsKICAgICAgIFJlbGVhc2VSZXNvdXJjZSggc2ZudCApOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRtbS5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRtbS5jCmluZGV4IDA1NjY4MGIuLjdjMDEyYWEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0bW0uYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdG1tLmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgTXVsdGlwbGUgTWFzdGVyIGZvbnQgc3VwcG9ydCAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMywgMjAwNCwgMjAwOSwgMjAxMywgMjAxNCBieSAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0b2Jqcy5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRvYmpzLmMKaW5kZXggMzJhMzcyYi4uZjBjMmU3NyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRvYmpzLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRvYmpzLmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgVGhlIEZyZWVUeXBlIHByaXZhdGUgYmFzZSBjbGFzc2VzIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KQEAgLTE1OCw3ICsxNTgsNyBAQAogICAgIEZUX1N0cmVhbSAgc3RyZWFtID0gTlVMTDsKIAogCi0gICAgKmFzdHJlYW0gPSAwOworICAgICphc3RyZWFtID0gTlVMTDsKIAogICAgIGlmICggIWxpYnJhcnkgKQogICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0xpYnJhcnlfSGFuZGxlICk7CkBAIC0xNzgsNyArMTc4LDcgQEAKICAgICAgIC8qIGNyZWF0ZSBhIG1lbW9yeS1iYXNlZCBzdHJlYW0gKi8KICAgICAgIEZUX1N0cmVhbV9PcGVuTWVtb3J5KCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IEZUX0J5dGUqKWFyZ3MtPm1lbW9yeV9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MtPm1lbW9yeV9zaXplICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VMb25nKWFyZ3MtPm1lbW9yeV9zaXplICk7CiAgICAgfQogCiAjaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fRElTQUJMRV9TVFJFQU1fU1VQUE9SVApAQCAtMzUzLDEwICszNTMsMTAgQEAKICAgICBzbG90LT5iaXRtYXBfbGVmdCAgID0gMDsKICAgICBzbG90LT5iaXRtYXBfdG9wICAgID0gMDsKICAgICBzbG90LT5udW1fc3ViZ2x5cGhzID0gMDsKLSAgICBzbG90LT5zdWJnbHlwaHMgICAgID0gMDsKLSAgICBzbG90LT5jb250cm9sX2RhdGEgID0gMDsKKyAgICBzbG90LT5zdWJnbHlwaHMgICAgID0gTlVMTDsKKyAgICBzbG90LT5jb250cm9sX2RhdGEgID0gTlVMTDsKICAgICBzbG90LT5jb250cm9sX2xlbiAgID0gMDsKLSAgICBzbG90LT5vdGhlciAgICAgICAgID0gMDsKKyAgICBzbG90LT5vdGhlciAgICAgICAgID0gTlVMTDsKICAgICBzbG90LT5mb3JtYXQgICAgICAgID0gRlRfR0xZUEhfRk9STUFUX05PTkU7CiAKICAgICBzbG90LT5saW5lYXJIb3JpQWR2YW5jZSA9IDA7CkBAIC0zODcsNyArMzg3LDcgQEAKICAgICAgIGlmICggRlRfRFJJVkVSX1VTRVNfT1VUTElORVMoIGRyaXZlciApICkKICAgICAgIHsKICAgICAgICAgRlRfR2x5cGhMb2FkZXJfRG9uZSggc2xvdC0+aW50ZXJuYWwtPmxvYWRlciApOwotICAgICAgICBzbG90LT5pbnRlcm5hbC0+bG9hZGVyID0gMDsKKyAgICAgICAgc2xvdC0+aW50ZXJuYWwtPmxvYWRlciA9IE5VTEw7CiAgICAgICB9CiAKICAgICAgIEZUX0ZSRUUoIHNsb3QtPmludGVybmFsICk7CkBAIC00MzgsNyArNDM4LDcgQEAKICAgICAgICAgKmFzbG90ID0gc2xvdDsKICAgICB9CiAgICAgZWxzZSBpZiAoIGFzbG90ICkKLSAgICAgICphc2xvdCA9IDA7CisgICAgICAqYXNsb3QgPSBOVUxMOwogCiAKICAgRXhpdDoKQEAgLTkzMiw3ICs5MzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIChGVF9MaXN0X0Rlc3RydWN0b3IpZGVzdHJveV9zaXplLAogICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXIgKTsKLSAgICBmYWNlLT5zaXplID0gMDsKKyAgICBmYWNlLT5zaXplID0gTlVMTDsKIAogICAgIC8qIG5vdyBkaXNjYXJkIGNsaWVudCBkYXRhICovCiAgICAgaWYgKCBmYWNlLT5nZW5lcmljLmZpbmFsaXplciApCkBAIC05NTAsNyArOTUwLDcgQEAKICAgICAgIGZhY2UtPnN0cmVhbSwKICAgICAgICggZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19FWFRFUk5BTF9TVFJFQU0gKSAhPSAwICk7CiAKLSAgICBmYWNlLT5zdHJlYW0gPSAwOworICAgIGZhY2UtPnN0cmVhbSA9IE5VTEw7CiAKICAgICAvKiBnZXQgcmlkIG9mIGl0ICovCiAgICAgaWYgKCBmYWNlLT5pbnRlcm5hbCApCkBAIC05NjgsMTAgKzk2OCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xpc3RfRGVzdHJ1Y3RvcilkZXN0cm95X2ZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5yb290Lm1lbW9yeSwKICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXIgKTsKLQotICAgIC8qIGNoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBkcm9wIHRoZSBkcml2ZXIncyBnbHlwaCBsb2FkZXIgKi8KLSAgICBpZiAoIEZUX0RSSVZFUl9VU0VTX09VVExJTkVTKCBkcml2ZXIgKSApCi0gICAgICBGVF9HbHlwaExvYWRlcl9Eb25lKCBkcml2ZXItPmdseXBoX2xvYWRlciApOwogICB9CiAKIApAQCAtMTE1Nyw3ICsxMTUzLDcgQEAKICAgICAgIGludCAgaTsKIAogCi0gICAgICBmYWNlLT5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlID0gMDsKKyAgICAgIGZhY2UtPmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UgPSBOVUxMOwogICAgICAgZm9yICggaSA9IDA7IGkgPCBudW1fcGFyYW1zICYmICFmYWNlLT5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlOwogICAgICAgICAgICAgaSsrICkKICAgICAgICAgaWYgKCBwYXJhbXNbaV0udGFnID09IEZUX1BBUkFNX1RBR19JTkNSRU1FTlRBTCApCkBAIC0xMTk5LDcgKzExOTUsNyBAQAogICAgICAgICBjbGF6ei0+ZG9uZV9mYWNlKCBmYWNlICk7CiAgICAgICBGVF9GUkVFKCBpbnRlcm5hbCApOwogICAgICAgRlRfRlJFRSggZmFjZSApOwotICAgICAgKmFmYWNlID0gMDsKKyAgICAgICphZmFjZSA9IE5VTEw7CiAgICAgfQogCiAgICAgcmV0dXJuIGVycm9yOwpAQCAtMTMwMiw4ICsxMjk4LDggQEAKICAgICBGVF9GUkVFKCBzdHJlYW0tPmJhc2UgKTsKIAogICAgIHN0cmVhbS0+c2l6ZSAgPSAwOwotICAgIHN0cmVhbS0+YmFzZSAgPSAwOwotICAgIHN0cmVhbS0+Y2xvc2UgPSAwOworICAgIHN0cmVhbS0+YmFzZSAgPSBOVUxMOworICAgIHN0cmVhbS0+Y2xvc2UgPSBOVUxMOwogICB9CiAKIApAQCAtMTMyNyw3ICsxMzIzLDcgQEAKICAgICBpZiAoICFiYXNlICkKICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwogCi0gICAgKmFzdHJlYW0gPSAwOworICAgICphc3RyZWFtID0gTlVMTDsKICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7CiAgICAgaWYgKCBGVF9ORVcoIHN0cmVhbSApICkKICAgICAgIGdvdG8gRXhpdDsKQEAgLTEzNzksMTMgKzEzNzUsMTMgQEAKICAgICB9CiAKICNpZmRlZiBGVF9NQUNJTlRPU0gKLSAgICAvKiBBdCB0aGlzIHBvaW50LCBmYWNlX2luZGV4IGhhcyBzZXJ2ZWQgaXRzIHB1cnBvc2U7ICAgICAgKi8KKyAgICAvKiBBdCB0aGlzIHBvaW50LCB0aGUgZmFjZSBpbmRleCBoYXMgc2VydmVkIGl0cyBwdXJwb3NlOyAgKi8KICAgICAvKiB3aG9ldmVyIGNhbGxzIHRoaXMgZnVuY3Rpb24gaGFzIGFscmVhZHkgdXNlZCBpdCB0byAgICAgKi8KICAgICAvKiBsb2NhdGUgdGhlIGNvcnJlY3QgZm9udCBkYXRhLiAgV2Ugc2hvdWxkIG5vdCBwcm9wYWdhdGUgKi8KICAgICAvKiB0aGlzIGluZGV4IHRvIEZUX09wZW5fRmFjZSgpICh1bmxlc3MgaXQgaXMgbmVnYXRpdmUpLiAgKi8KIAogICAgIGlmICggZmFjZV9pbmRleCA+IDAgKQotICAgICAgZmFjZV9pbmRleCA9IDA7CisgICAgICBmYWNlX2luZGV4ICY9IDB4N0ZGRjAwMDBMOyAvKiByZXRhaW4gR1ggZGF0YSAqLwogI2VuZGlmCiAKICAgICBlcnJvciA9IEZUX09wZW5fRmFjZSggbGlicmFyeSwgJmFyZ3MsIGZhY2VfaW5kZXgsIGFmYWNlICk7CkBAIC0xNDkxLDcgKzE0ODcsNyBAQAogICAgIEZUX0Vycm9yICAgZXJyb3I7CiAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7CiAgICAgRlRfVUxvbmcgICBvZmZzZXQsIGxlbmd0aDsKLSAgICBGVF9Mb25nICAgIHBvczsKKyAgICBGVF9VTG9uZyAgIHBvczsKICAgICBGVF9Cb29sICAgIGlzX3NmbnRfY2lkOwogICAgIEZUX0J5dGUqICAgc2ZudF9wcyA9IE5VTEw7CiAKQEAgLTE0OTksNyArMTQ5NSwxMSBAQAogICAgIEZUX1VOVVNFRCggcGFyYW1zICk7CiAKIAotICAgIHBvcyA9IEZUX1N0cmVhbV9Qb3MoIHN0cmVhbSApOworICAgIC8qIGlnbm9yZSBHWCBzdHVmZiAqLworICAgIGlmICggZmFjZV9pbmRleCA+IDAgKQorICAgICAgZmFjZV9pbmRleCAmPSAweEZGRkZMOworCisgICAgcG9zID0gRlRfU1RSRUFNX1BPUygpOwogCiAgICAgZXJyb3IgPSBmdF9sb29rdXBfUFNfaW5fc2ZudF9zdHJlYW0oIHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZV9pbmRleCwKQEAgLTE1MTYsOCArMTUxNiwxMCBAQAogICAgICAgZ290byBFeGl0OwogCiAgICAgZXJyb3IgPSBGVF9TdHJlYW1fUmVhZCggc3RyZWFtLCAoRlRfQnl0ZSAqKXNmbnRfcHMsIGxlbmd0aCApOwotICAgIGlmICggZXJyb3IgKQorICAgIGlmICggZXJyb3IgKSB7CisgICAgICBGVF9GUkVFKCBzZm50X3BzICk7CiAgICAgICBnb3RvIEV4aXQ7CisgICAgfQogCiAgICAgZXJyb3IgPSBvcGVuX2ZhY2VfZnJvbV9idWZmZXIoIGxpYnJhcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmbnRfcHMsCkBAIC0xNTc3LDcgKzE1NzksNyBAQAogICAgIHBmYl9sZW4gPSAwOwogICAgIGZvciAoIGkgPSAwOyBpIDwgcmVzb3VyY2VfY250OyArK2kgKQogICAgIHsKLSAgICAgIGVycm9yID0gRlRfU3RyZWFtX1NlZWsoIHN0cmVhbSwgb2Zmc2V0c1tpXSApOworICAgICAgZXJyb3IgPSBGVF9TdHJlYW1fU2Vlayggc3RyZWFtLCAoRlRfVUxvbmcpb2Zmc2V0c1tpXSApOwogICAgICAgaWYgKCBlcnJvciApCiAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgIGlmICggRlRfUkVBRF9VTE9ORyggdGVtcCApICkKQEAgLTE1ODYsMTIgKzE1ODgsMTQgQEAKICAgICAgIC8qIEZUMiBhbGxvY2F0b3IgdGFrZXMgc2lnbmVkIGxvbmcgYnVmZmVyIGxlbmd0aCwKICAgICAgICAqIHRvbyBsYXJnZSB2YWx1ZSBjYXVzaW5nIG92ZXJmbG93IHNob3VsZCBiZSBjaGVja2VkCiAgICAgICAgKi8KLSAgICAgIEZUX1RSQUNFNCgoICIgICAgICAgICAgICAgICAgIFBPU1QgZnJhZ21lbnQgIyVkOiBsZW5ndGg9MHglMDh4XG4iLAotICAgICAgICAgICAgICAgICAgaSwgdGVtcCkpOwotICAgICAgaWYgKCAweDdGRkZGRkZGVUwgPCB0ZW1wIHx8IHBmYl9sZW4gKyB0ZW1wICsgNiA8IHBmYl9sZW4gKQorICAgICAgRlRfVFJBQ0U0KCggIiAgICAgICAgICAgICAgICAgUE9TVCBmcmFnbWVudCAjJWQ6IGxlbmd0aD0weCUwOHgiCisgICAgICAgICAgICAgICAgICAiIHRvdGFsIHBmYl9sZW49MHglMDh4XG4iLAorICAgICAgICAgICAgICAgICAgaSwgdGVtcCwgcGZiX2xlbiArIHRlbXAgKyA2KSk7CisgICAgICBpZiAoIEZUX01BQ19SRk9SS19NQVhfTEVOIDwgdGVtcCAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgIEZUX01BQ19SRk9SS19NQVhfTEVOIC0gdGVtcCA8IHBmYl9sZW4gKyA2ICkKICAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UyKCggIiAgICAgICAgICAgICB0b28gbG9uZyBmcmFnbWVudCBsZW5ndGggbWFrZXMiCi0gICAgICAgICAgICAgICAgICAgICIgcGZiX2xlbiBjb25mdXNlZDogdGVtcD0weCUwOHhcbiIsIHRlbXAgKSk7CisgICAgICAgIEZUX1RSQUNFMigoICIgICAgICAgICAgICAgTWFjT1MgcmVzb3VyY2UgbGVuZ3RoIGNhbm5vdCBleGNlZWQiCisgICAgICAgICAgICAgICAgICAgICIgMHglMDh4XG4iLCBGVF9NQUNfUkZPUktfTUFYX0xFTiApKTsKICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9PZmZzZXQgKTsKICAgICAgICAgZ290byBFeGl0OwogICAgICAgfQpAQCAtMTYyNCw3ICsxNjI4LDcgQEAKICAgICB0eXBlID0gMTsKICAgICBmb3IgKCBpID0gMDsgaSA8IHJlc291cmNlX2NudDsgKytpICkKICAgICB7Ci0gICAgICBlcnJvciA9IEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIG9mZnNldHNbaV0gKTsKKyAgICAgIGVycm9yID0gRlRfU3RyZWFtX1NlZWsoIHN0cmVhbSwgKEZUX1VMb25nKW9mZnNldHNbaV0gKTsKICAgICAgIGlmICggZXJyb3IgKQogICAgICAgICBnb3RvIEV4aXQyOwogICAgICAgaWYgKCBGVF9SRUFEX1VMT05HKCBybGVuICkgKQpAQCAtMTY2NCw3ICsxNjY4LDcgQEAKICAgICAgIGVsc2UKICAgICAgIHsKICAgICAgICAgRlRfVFJBQ0UzKCggIiAgICBXcml0ZSBQT1NUIGZyYWdtZW50ICMlZCBoZWFkZXIgKDQtYnl0ZSkgdG8gYnVmZmVyIgotICAgICAgICAgICAgICAgICAgICAiIDB4JXAgKyAweCUwOHhcbiIsIGksIHBmYl9kYXRhLCBwZmJfbGVucG9zICkpOworICAgICAgICAgICAgICAgICAgICAiICVwICsgMHglMDh4XG4iLCBpLCBwZmJfZGF0YSwgcGZiX2xlbnBvcyApKTsKICAgICAgICAgaWYgKCBwZmJfbGVucG9zICsgMyA+IHBmYl9sZW4gKyAyICkKICAgICAgICAgICBnb3RvIEV4aXQyOwogICAgICAgICBwZmJfZGF0YVtwZmJfbGVucG9zICAgIF0gPSAoRlRfQnl0ZSkoIGxlbiApOwpAQCAtMTY3Niw3ICsxNjgwLDcgQEAKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBGVF9UUkFDRTMoKCAiICAgIFdyaXRlIFBPU1QgZnJhZ21lbnQgIyVkIGhlYWRlciAoNi1ieXRlKSB0byBidWZmZXIiCi0gICAgICAgICAgICAgICAgICAgICIgMHglcCArIDB4JTA4eFxuIiwgaSwgcGZiX2RhdGEsIHBmYl9wb3MgKSk7CisgICAgICAgICAgICAgICAgICAgICIgJXAgKyAweCUwOHhcbiIsIGksIHBmYl9kYXRhLCBwZmJfcG9zICkpOwogICAgICAgICBpZiAoIHBmYl9wb3MgKyA2ID4gcGZiX2xlbiArIDIgKQogICAgICAgICAgIGdvdG8gRXhpdDI7CiAgICAgICAgIHBmYl9kYXRhW3BmYl9wb3MrK10gPSAweDgwOwpAQCAtMTY5Niw3ICsxNzAwLDcgQEAKICAgICAgICAgZ290byBFeGl0MjsKIAogICAgICAgRlRfVFJBQ0UzKCggIiAgICBMb2FkIFBPU1QgZnJhZ21lbnQgIyVkICglZCBieXRlKSB0byBidWZmZXIiCi0gICAgICAgICAgICAgICAgICAiIDB4JXAgKyAweCUwOHhcbiIsIGksIHJsZW4sIHBmYl9kYXRhLCBwZmJfcG9zICkpOworICAgICAgICAgICAgICAgICAgIiAlcCArIDB4JTA4eFxuIiwgaSwgcmxlbiwgcGZiX2RhdGEsIHBmYl9wb3MgKSk7CiAgICAgICBlcnJvciA9IEZUX1N0cmVhbV9SZWFkKCBzdHJlYW0sIChGVF9CeXRlICopcGZiX2RhdGEgKyBwZmJfcG9zLCBybGVuICk7CiAgICAgICBpZiAoIGVycm9yICkKICAgICAgICAgZ290byBFeGl0MjsKQEAgLTE3NDEsNyArMTc0NSw3IEBACiAgIC8qIFRoZSByZXNvdXJjZSBoZWFkZXIgc2F5cyB3ZSd2ZSBnb3QgcmVzb3VyY2VfY250IGBzZm50JyAgICAgICovCiAgIC8qIChUcnVlVHlwZS9PcGVuVHlwZSkgcmVzb3VyY2VzIGluIHRoaXMgZmlsZS4gIExvb2sgdGhyb3VnaCAgICovCiAgIC8qIHRoZW0gZm9yIHRoZSBvbmUgaW5kaWNhdGVkIGJ5IGZhY2VfaW5kZXgsIGxvYWQgaXQgaW50byBtZW0sICovCi0gIC8qIHBhc3MgaXQgb24gdGhlIHRoZSB0cnVldHlwZSBkcml2ZXIgYW5kIHJldHVybiBpdC4gICAgICAgICAgICovCisgIC8qIHBhc3MgaXQgb24gdG8gdGhlIHRydWV0eXBlIGRyaXZlciwgYW5kIHJldHVybiBpdC4gICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyBGVF9FcnJvcgogICBNYWNfUmVhZF9zZm50X1Jlc291cmNlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LApAQCAtMTc1NCw3ICsxNzU4LDcgQEAKICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKICAgICBGVF9CeXRlKiAgIHNmbnRfZGF0YSA9IE5VTEw7CiAgICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9Mb25nICAgIGZsYWdfb2Zmc2V0OworICAgIEZUX1VMb25nICAgZmxhZ19vZmZzZXQ7CiAgICAgRlRfTG9uZyAgICBybGVuOwogICAgIGludCAgICAgICAgaXNfY2ZmOwogICAgIEZUX0xvbmcgICAgZmFjZV9pbmRleF9pbl9yZXNvdXJjZSA9IDA7CkBAIC0xNzY1LDcgKzE3NjksNyBAQAogICAgIGlmICggZmFjZV9pbmRleCA+PSByZXNvdXJjZV9jbnQgKQogICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSApOwogCi0gICAgZmxhZ19vZmZzZXQgPSBvZmZzZXRzW2ZhY2VfaW5kZXhdOworICAgIGZsYWdfb2Zmc2V0ID0gKEZUX1VMb25nKW9mZnNldHNbZmFjZV9pbmRleF07CiAgICAgZXJyb3IgPSBGVF9TdHJlYW1fU2Vlayggc3RyZWFtLCBmbGFnX29mZnNldCApOwogICAgIGlmICggZXJyb3IgKQogICAgICAgZ290byBFeGl0OwpAQCAtMTc3NCw2ICsxNzc4LDggQEAKICAgICAgIGdvdG8gRXhpdDsKICAgICBpZiAoIHJsZW4gPT0gLTEgKQogICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSApOworICAgIGlmICggKEZUX1VMb25nKXJsZW4gPiBGVF9NQUNfUkZPUktfTUFYX0xFTiApCisgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfT2Zmc2V0ICk7CiAKICAgICBlcnJvciA9IG9wZW5fZmFjZV9QU19mcm9tX3NmbnRfc3RyZWFtKCBsaWJyYXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKQEAgLTE3ODcsMTYgKzE3OTMsMTggQEAKICAgICBpZiAoIEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIGZsYWdfb2Zmc2V0ICsgNCApICkKICAgICAgIGdvdG8gRXhpdDsKIAotICAgIGlmICggRlRfQUxMT0MoIHNmbnRfZGF0YSwgKEZUX0xvbmcpcmxlbiApICkKKyAgICBpZiAoIEZUX0FMTE9DKCBzZm50X2RhdGEsIHJsZW4gKSApCiAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgZXJyb3IgPSBGVF9TdHJlYW1fUmVhZCggc3RyZWFtLCAoRlRfQnl0ZSAqKXNmbnRfZGF0YSwgcmxlbiApOwotICAgIGlmICggZXJyb3IgKQorICAgIGVycm9yID0gRlRfU3RyZWFtX1JlYWQoIHN0cmVhbSwgKEZUX0J5dGUgKilzZm50X2RhdGEsIChGVF9VTG9uZylybGVuICk7CisgICAgaWYgKCBlcnJvciApIHsKKyAgICAgIEZUX0ZSRUUoIHNmbnRfZGF0YSApOwogICAgICAgZ290byBFeGl0OworICAgIH0KIAogICAgIGlzX2NmZiA9IHJsZW4gPiA0ICYmICFmdF9tZW1jbXAoIHNmbnRfZGF0YSwgIk9UVE8iLCA0ICk7CiAgICAgZXJyb3IgPSBvcGVuX2ZhY2VfZnJvbV9idWZmZXIoIGxpYnJhcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmbnRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VMb25nKXJsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VfaW5kZXhfaW5fcmVzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2NmZiA/ICJjZmYiIDogInRydWV0eXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZhY2UgKTsKQEAgLTE4OTMsMTMgKzE5MDEsMTQgQEAKICAgICBpZiAoIGVycm9yICkKICAgICAgIGdvdG8gRXhpdDsKIAotICAgIGlmICggICAgICAgICAgICBoZWFkZXJbIDBdICE9ICAwIHx8Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlcls3NF0gIT0gIDAgfHwKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzgyXSAhPSAgMCB8fAotICAgICAgICAgICAgICAgICAgICBoZWFkZXJbIDFdID09ICAwIHx8Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlclsgMV0gPiAgMzMgfHwKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzYzXSAhPSAgMCB8fAotICAgICAgICAgaGVhZGVyWzIgKyBoZWFkZXJbMV1dICE9ICAwICkKKyAgICBpZiAoICAgICAgICAgICAgaGVhZGVyWyAwXSAhPSAgIDAgfHwKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzc0XSAhPSAgIDAgfHwKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzgyXSAhPSAgIDAgfHwKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyWyAxXSA9PSAgIDAgfHwKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyWyAxXSA+ICAgMzMgfHwKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzYzXSAhPSAgIDAgfHwKKyAgICAgICAgIGhlYWRlclsyICsgaGVhZGVyWzFdXSAhPSAgIDAgfHwKKyAgICAgICAgICAgICAgICAgIGhlYWRlclsweDUzXSA+IDB4N0YgKQogICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7CiAKICAgICBkbGVuID0gKCBoZWFkZXJbMHg1M10gPDwgMjQgKSB8CkBAIC0xOTEwLDcgKzE5MTksNyBAQAogICAgIHJsZW4gPSAoIGhlYWRlclsweDU3XSA8PCAyNCApIHwKICAgICAgICAgICAgKCBoZWFkZXJbMHg1OF0gPDwgMTYgKSB8CiAgICAgICAgICAgICggaGVhZGVyWzB4NTldIDw8ICA4ICkgfAotICAgICAgICAgICAgIGhlYWRlclsweDVhXTsKKyAgICAgICAgICAgICBoZWFkZXJbMHg1QV07CiAjZW5kaWYgLyogMCAqLwogICAgIG9mZnNldCA9IDEyOCArICggKCBkbGVuICsgMTI3ICkgJiB+MTI3ICk7CiAKQEAgLTE5MzQsNyArMTk0Myw3IEBACiAKICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKICAgICBGVF9FcnJvciAgIGVycm9yICA9IEZUX0VSUiggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotICAgIGludCAgICAgICAgaTsKKyAgICBGVF9VSW50ICAgIGk7CiAKICAgICBjaGFyICogICAgIGZpbGVfbmFtZXNbRlRfUkFDQ0VTU19OX1JVTEVTXTsKICAgICBGVF9Mb25nICAgIG9mZnNldHNbRlRfUkFDQ0VTU19OX1JVTEVTXTsKQEAgLTE5NDIsNyArMTk1MSw3IEBACiAgICAgRlRfQm9vbCAgICBpc19kYXJ3aW5fdmZzLCB2ZnNfcmZvcmtfaGFzX25vX2ZvbnQgPSBGQUxTRTsgLyogbm90IHRlc3RlZCAqLwogCiAgICAgRlRfT3Blbl9BcmdzICBhcmdzMjsKLSAgICBGVF9TdHJlYW0gICAgIHN0cmVhbTIgPSAwOworICAgIEZUX1N0cmVhbSAgICAgc3RyZWFtMiA9IE5VTEw7CiAKIAogICAgIEZUX1JhY2Nlc3NfR3Vlc3MoIGxpYnJhcnksIHN0cmVhbSwKQEAgLTIwMzYsNyArMjA0NSwxMSBAQAogI3VuZGVmICBGVF9DT01QT05FTlQKICNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9yYWNjZXNzCiAKLSAgICAgIEZUX1RSQUNFMygoICJUcnkgYXMgZGZvbnQ6ICVzIC4uLiIsIGFyZ3MtPnBhdGhuYW1lICkpOworI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCisgICAgICBGVF9UUkFDRTMoKCAiVHJ5IGFzIGRmb250OiAiICkpOworICAgICAgaWYgKCAhKCBhcmdzLT5mbGFncyAmIEZUX09QRU5fTUVNT1JZICkgKQorICAgICAgICBGVF9UUkFDRTMoKCAiJXMgLi4uIiwgYXJncy0+cGF0aG5hbWUgKSk7CisjZW5kaWYKIAogICAgICAgZXJyb3IgPSBJc01hY1Jlc291cmNlKCBsaWJyYXJ5LCBzdHJlYW0sIDAsIGZhY2VfaW5kZXgsIGFmYWNlICk7CiAKQEAgLTIxMDMsNyArMjExNiw3IEBACiAgICAgICBpZiAoIEZUX01PRFVMRV9JU19EUklWRVIoIGRyaXZlciApICkKICAgICAgIHsKICAgICAgICAgRlRfSW50ICAgICAgICAgbnVtX3BhcmFtcyA9IDA7Ci0gICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcyAgICAgPSAwOworICAgICAgICBGVF9QYXJhbWV0ZXIqICBwYXJhbXMgICAgID0gTlVMTDsKIAogCiAgICAgICAgIGlmICggYXJncy0+ZmxhZ3MgJiBGVF9PUEVOX1BBUkFNUyApCkBAIC0yMTM3LDcgKzIxNTAsNyBAQAogICAgICAgICBpZiAoIEZUX01PRFVMRV9JU19EUklWRVIoIGN1clswXSApICkKICAgICAgICAgewogICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMgPSAwOwotICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcyAgICAgPSAwOworICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcyAgICAgPSBOVUxMOwogCiAKICAgICAgICAgICBkcml2ZXIgPSBGVF9EUklWRVIoIGN1clswXSApOwpAQCAtMjQ0OCw4ICsyNDYxLDggQEAKICAgICBGVF9Ecml2ZXIgICAgICAgIGRyaXZlcjsKICAgICBGVF9Ecml2ZXJfQ2xhc3MgIGNsYXp6OwogCi0gICAgRlRfU2l6ZSAgICAgICAgICBzaXplID0gMDsKLSAgICBGVF9MaXN0Tm9kZSAgICAgIG5vZGUgPSAwOworICAgIEZUX1NpemUgICAgICAgICAgc2l6ZSA9IE5VTEw7CisgICAgRlRfTGlzdE5vZGUgICAgICBub2RlID0gTlVMTDsKIAogCiAgICAgaWYgKCAhZmFjZSApCkBAIC0yNDYxLDcgKzI0NzQsNyBAQAogICAgIGlmICggIWZhY2UtPmRyaXZlciApCiAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRHJpdmVyX0hhbmRsZSApOwogCi0gICAgKmFzaXplID0gMDsKKyAgICAqYXNpemUgPSBOVUxMOwogCiAgICAgZHJpdmVyID0gZmFjZS0+ZHJpdmVyOwogICAgIGNsYXp6ICA9IGRyaXZlci0+Y2xheno7CkBAIC0yNDc0LDcgKzI0ODcsNyBAQAogICAgIHNpemUtPmZhY2UgPSBmYWNlOwogCiAgICAgLyogZm9yIG5vdywgZG8gbm90IHVzZSBhbnkgaW50ZXJuYWwgZmllbGRzIGluIHNpemUgb2JqZWN0cyAqLwotICAgIHNpemUtPmludGVybmFsID0gMDsKKyAgICBzaXplLT5pbnRlcm5hbCA9IE5VTEw7CiAKICAgICBpZiAoIGNsYXp6LT5pbml0X3NpemUgKQogICAgICAgZXJyb3IgPSBjbGF6ei0+aW5pdF9zaXplKCBzaXplICk7CkBAIC0yNTMyLDcgKzI1NDUsNyBAQAogCiAgICAgICBpZiAoIGZhY2UtPnNpemUgPT0gc2l6ZSApCiAgICAgICB7Ci0gICAgICAgIGZhY2UtPnNpemUgPSAwOworICAgICAgICBmYWNlLT5zaXplID0gTlVMTDsKICAgICAgICAgaWYgKCBmYWNlLT5zaXplc19saXN0LmhlYWQgKQogICAgICAgICAgIGZhY2UtPnNpemUgPSAoRlRfU2l6ZSkoZmFjZS0+c2l6ZXNfbGlzdC5oZWFkLT5kYXRhKTsKICAgICAgIH0KQEAgLTMwMTgsMTQgKzMwMzEsMTQgQEAKICAgICAgIHBpeGVsX2hlaWdodCA9IDE7CiAKICAgICAvKiB1c2UgYD49JyB0byBhdm9pZCBwb3RlbnRpYWwgY29tcGlsZXIgd2FybmluZyBvbiAxNmJpdCBwbGF0Zm9ybXMgKi8KLSAgICBpZiAoIHBpeGVsX3dpZHRoICA+PSAweEZGRkZVICkKLSAgICAgIHBpeGVsX3dpZHRoICA9IDB4RkZGRlU7CisgICAgaWYgKCBwaXhlbF93aWR0aCA+PSAweEZGRkZVICkKKyAgICAgIHBpeGVsX3dpZHRoID0gMHhGRkZGVTsKICAgICBpZiAoIHBpeGVsX2hlaWdodCA+PSAweEZGRkZVICkKICAgICAgIHBpeGVsX2hlaWdodCA9IDB4RkZGRlU7CiAKICAgICByZXEudHlwZSAgICAgICAgICAgPSBGVF9TSVpFX1JFUVVFU1RfVFlQRV9OT01JTkFMOwotICAgIHJlcS53aWR0aCAgICAgICAgICA9IHBpeGVsX3dpZHRoIDw8IDY7Ci0gICAgcmVxLmhlaWdodCAgICAgICAgID0gcGl4ZWxfaGVpZ2h0IDw8IDY7CisgICAgcmVxLndpZHRoICAgICAgICAgID0gKEZUX0xvbmcpKCBwaXhlbF93aWR0aCA8PCA2ICk7CisgICAgcmVxLmhlaWdodCAgICAgICAgID0gKEZUX0xvbmcpKCBwaXhlbF9oZWlnaHQgPDwgNiApOwogICAgIHJlcS5ob3JpUmVzb2x1dGlvbiA9IDA7CiAgICAgcmVxLnZlcnRSZXNvbHV0aW9uID0gMDsKIApAQCAtMzA3MiwxOCArMzA4NSwzNyBAQAogCiAgICAgICAgICAgaWYgKCBrZXJuX21vZGUgIT0gRlRfS0VSTklOR19VTkZJVFRFRCApCiAgICAgICAgICAgeworICAgICAgICAgICAgRlRfUG9zICBvcmlnX3ggPSBha2VybmluZy0+eDsKKyAgICAgICAgICAgIEZUX1BvcyAgb3JpZ195ID0gYWtlcm5pbmctPnk7CisKKwogICAgICAgICAgICAgLyogd2Ugc2NhbGUgZG93biBrZXJuaW5nIHZhbHVlcyBmb3Igc21hbGwgcHBlbSB2YWx1ZXMgKi8KICAgICAgICAgICAgIC8qIHRvIGF2b2lkIHRoYXQgcm91bmRpbmcgbWFrZXMgdGhlbSB0b28gYmlnLiAgICAgICAgICovCiAgICAgICAgICAgICAvKiBgMjUnIGhhcyBiZWVuIGRldGVybWluZWQgaGV1cmlzdGljYWxseS4gICAgICAgICAgICAqLwogICAgICAgICAgICAgaWYgKCBmYWNlLT5zaXplLT5tZXRyaWNzLnhfcHBlbSA8IDI1ICkKLSAgICAgICAgICAgICAgYWtlcm5pbmctPnggPSBGVF9NdWxEaXYoIGFrZXJuaW5nLT54LAorICAgICAgICAgICAgICBha2VybmluZy0+eCA9IEZUX011bERpdiggb3JpZ194LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+c2l6ZS0+bWV0cmljcy54X3BwZW0sIDI1ICk7CiAgICAgICAgICAgICBpZiAoIGZhY2UtPnNpemUtPm1ldHJpY3MueV9wcGVtIDwgMjUgKQotICAgICAgICAgICAgICBha2VybmluZy0+eSA9IEZUX011bERpdiggYWtlcm5pbmctPnksCisgICAgICAgICAgICAgIGFrZXJuaW5nLT55ID0gRlRfTXVsRGl2KCBvcmlnX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5zaXplLT5tZXRyaWNzLnlfcHBlbSwgMjUgKTsKIAogICAgICAgICAgICAgYWtlcm5pbmctPnggPSBGVF9QSVhfUk9VTkQoIGFrZXJuaW5nLT54ICk7CiAgICAgICAgICAgICBha2VybmluZy0+eSA9IEZUX1BJWF9ST1VORCggYWtlcm5pbmctPnkgKTsKKworI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEZUX1BvcyAgb3JpZ194X3JvdW5kZWQgPSBGVF9QSVhfUk9VTkQoIG9yaWdfeCApOworICAgICAgICAgICAgICBGVF9Qb3MgIG9yaWdfeV9yb3VuZGVkID0gRlRfUElYX1JPVU5EKCBvcmlnX3kgKTsKKworCisgICAgICAgICAgICAgIGlmICggYWtlcm5pbmctPnggIT0gb3JpZ194X3JvdW5kZWQgfHwKKyAgICAgICAgICAgICAgICAgICBha2VybmluZy0+eSAhPSBvcmlnX3lfcm91bmRlZCApCisgICAgICAgICAgICAgICAgRlRfVFJBQ0U1KCggIkZUX0dldF9LZXJuaW5nOiBob3Jpem9udGFsIGtlcm5pbmciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoJWQsICVkKSBzY2FsZWQgZG93biB0byAoJWQsICVkKSBwaXhlbHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ194X3JvdW5kZWQgLyA2NCwgb3JpZ195X3JvdW5kZWQgLyA2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBha2VybmluZy0+eCAvIDY0LCBha2VybmluZy0+eSAvIDY0ICkpOworICAgICAgICAgICAgfQorI2VuZGlmCiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CkBAIC0zMzU0LDggKzMzODYsMTIgQEAKICAgICAgICAgRlRfVFJBQ0UxKCggIkZUX0dldF9DaGFyX0luZGV4OiB0b28gbGFyZ2UgY2hhcmNvZGUiICkpOwogICAgICAgICBGVF9UUkFDRTEoKCAiIDB4JXggaXMgdHJ1bmNhdGVkXG4iLCBjaGFyY29kZSApKTsKICAgICAgIH0KKwogICAgICAgcmVzdWx0ID0gY21hcC0+Y2xhenotPmNoYXJfaW5kZXgoIGNtYXAsIChGVF9VSW50MzIpY2hhcmNvZGUgKTsKKyAgICAgIGlmICggcmVzdWx0ID49IChGVF9VSW50KWZhY2UtPm51bV9nbHlwaHMgKQorICAgICAgICByZXN1bHQgPSAwOwogICAgIH0KKwogICAgIHJldHVybiByZXN1bHQ7CiAgIH0KIApAQCAtMzM3NCw3ICszNDEwLDcgQEAKICAgICBpZiAoIGZhY2UgJiYgZmFjZS0+Y2hhcm1hcCAmJiBmYWNlLT5udW1fZ2x5cGhzICkKICAgICB7CiAgICAgICBnaW5kZXggPSBGVF9HZXRfQ2hhcl9JbmRleCggZmFjZSwgMCApOwotICAgICAgaWYgKCBnaW5kZXggPT0gMCB8fCBnaW5kZXggPj0gKEZUX1VJbnQpZmFjZS0+bnVtX2dseXBocyApCisgICAgICBpZiAoIGdpbmRleCA9PSAwICkKICAgICAgICAgcmVzdWx0ID0gRlRfR2V0X05leHRfQ2hhciggZmFjZSwgMCwgJmdpbmRleCApOwogICAgIH0KIApAQCAtMzY0OCw4ICszNjg0LDEwIEBACiAgICAgLyogY2xlYW4gdXAgYnVmZmVyICovCiAgICAgKChGVF9CeXRlKilidWZmZXIpWzBdID0gJ1wwJzsKIAotICAgIGlmICggKEZUX0xvbmcpZ2x5cGhfaW5kZXggPiBmYWNlLT5udW1fZ2x5cGhzIHx8Ci0gICAgICAgICAhRlRfSEFTX0dMWVBIX05BTUVTKCBmYWNlICkgICAgICAgICAgICAgKQorICAgIGlmICggKEZUX0xvbmcpZ2x5cGhfaW5kZXggPj0gZmFjZS0+bnVtX2dseXBocyApCisgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfR2x5cGhfSW5kZXggKTsKKworICAgIGlmICggIUZUX0hBU19HTFlQSF9OQU1FUyggZmFjZSApICkKICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwogCiAgICAgRlRfRkFDRV9MT09LVVBfU0VSVklDRSggZmFjZSwgc2VydmljZSwgR0xZUEhfRElDVCApOwpAQCAtMzg1MCw3ICszODg4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICBGVF9MaXN0Tm9kZSogICAgIG5vZGUgKQogICB7CiAgICAgRlRfTGlzdE5vZGUgIGN1cjsKLSAgICBGVF9SZW5kZXJlciAgcmVzdWx0ID0gMDsKKyAgICBGVF9SZW5kZXJlciAgcmVzdWx0ID0gTlVMTDsKIAogCiAgICAgaWYgKCAhbGlicmFyeSApCkBAIC0zODYyLDcgKzM5MDAsNyBAQAogICAgIHsKICAgICAgIGlmICggKm5vZGUgKQogICAgICAgICBjdXIgPSAoKm5vZGUpLT5uZXh0OwotICAgICAgKm5vZGUgPSAwOworICAgICAgKm5vZGUgPSBOVUxMOwogICAgIH0KIAogICAgIHdoaWxlICggY3VyICkKQEAgLTQwODIsOCArNDEyMCw3IEBACiAKICAgICBkZWZhdWx0OgogICAgICAgewotICAgICAgICBGVF9MaXN0Tm9kZSAgbm9kZSAgID0gMDsKLSAgICAgICAgRlRfQm9vbCAgICAgIHVwZGF0ZSA9IDA7CisgICAgICAgIEZUX0xpc3ROb2RlICBub2RlID0gTlVMTDsKIAogCiAgICAgICAgIC8qIHNtYWxsIHNob3J0Y3V0IGZvciB0aGUgdmVyeSBjb21tb24gY2FzZSAqLwpAQCAtNDExMCwxNiArNDE0Nyw2IEBACiAgICAgICAgICAgLyogbm93LCBsb29rIGZvciBhbm90aGVyIHJlbmRlcmVyIHRoYXQgc3VwcG9ydHMgdGhlIHNhbWUgKi8KICAgICAgICAgICAvKiBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgIHJlbmRlcmVyID0gRlRfTG9va3VwX1JlbmRlcmVyKCBsaWJyYXJ5LCBzbG90LT5mb3JtYXQsICZub2RlICk7Ci0gICAgICAgICAgdXBkYXRlICAgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogaWYgd2UgY2hhbmdlZCB0aGUgY3VycmVudCByZW5kZXJlciBmb3IgdGhlIGdseXBoIGltYWdlIGZvcm1hdCAqLwotICAgICAgICAvKiB3ZSBuZWVkIHRvIHNlbGVjdCBpdCBhcyB0aGUgbmV4dCBjdXJyZW50IG9uZSAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggIWVycm9yICYmIHVwZGF0ZSAmJiByZW5kZXJlciApCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IEZUX1NldF9SZW5kZXJlciggbGlicmFyeSwgcmVuZGVyZXIsIDAsIDAgKTsKLSAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtNDEzNiw3ICs0MTYzLDcgQEAKICAgICAgIEZUX0Vycm9yICAgZXJyOwogCiAKLSAgICAgIEZUX0JpdG1hcF9OZXcoICZiaXRtYXAgKTsKKyAgICAgIEZUX0JpdG1hcF9Jbml0KCAmYml0bWFwICk7CiAKICAgICAgIC8qIHRoaXMgYWxzbyBjb252ZXJ0cyB0aGUgYml0bWFwIGZsb3cgdG8gYGRvd24nIChpLmUuLCBwaXRjaCA+IDApICovCiAgICAgICBlcnIgPSBGVF9CaXRtYXBfQ29udmVydCggbGlicmFyeSwgJnNsb3QtPmJpdG1hcCwgJmJpdG1hcCwgMSApOwpAQCAtNDE0NSwxNSArNDE3MiwxNyBAQAogICAgICAgICBNRDVfQ1RYICAgICAgICBjdHg7CiAgICAgICAgIHVuc2lnbmVkIGNoYXIgIG1kNVsxNl07CiAgICAgICAgIGludCAgICAgICAgICAgIGk7CisgICAgICAgIHVuc2lnbmVkIGludCAgIHJvd3MgID0gYml0bWFwLnJvd3M7CisgICAgICAgIHVuc2lnbmVkIGludCAgIHBpdGNoID0gKHVuc2lnbmVkIGludCliaXRtYXAucGl0Y2g7CiAKIAotICAgICAgICBNRDVfSW5pdCggJmN0eCk7Ci0gICAgICAgIE1ENV9VcGRhdGUoICZjdHgsIGJpdG1hcC5idWZmZXIsIGJpdG1hcC5yb3dzICogYml0bWFwLnBpdGNoICk7CisgICAgICAgIE1ENV9Jbml0KCAmY3R4ICk7CisgICAgICAgIE1ENV9VcGRhdGUoICZjdHgsIGJpdG1hcC5idWZmZXIsIHJvd3MgKiBwaXRjaCApOwogICAgICAgICBNRDVfRmluYWwoIG1kNSwgJmN0eCApOwogCiAgICAgICAgIEZUX1RSQUNFMygoICJNRDUgY2hlY2tzdW0gZm9yICVkeCVkIGJpdG1hcDpcbiIKICAgICAgICAgICAgICAgICAgICAgIiAgIiwKLSAgICAgICAgICAgICAgICAgICAgYml0bWFwLnJvd3MsIGJpdG1hcC5waXRjaCApKTsKKyAgICAgICAgICAgICAgICAgICAgcm93cywgcGl0Y2ggKSk7CiAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgMTY7IGkrKyApCiAgICAgICAgICAgRlRfVFJBQ0UzKCggIiUwMlgiLCBtZDVbaV0gKSk7CiAgICAgICAgIEZUX1RSQUNFMygoICJcbiIgKSk7CkBAIC00MjI2LDcgKzQyNTUsNyBAQAogCiAKICAgICBpZiAoIGxpYnJhcnkgJiYgbGlicmFyeS0+YXV0b19oaW50ZXIgPT0gbW9kdWxlICkKLSAgICAgIGxpYnJhcnktPmF1dG9faGludGVyID0gMDsKKyAgICAgIGxpYnJhcnktPmF1dG9faGludGVyID0gTlVMTDsKIAogICAgIC8qIGlmIHRoZSBtb2R1bGUgaXMgYSByZW5kZXJlciAqLwogICAgIGlmICggRlRfTU9EVUxFX0lTX1JFTkRFUkVSKCBtb2R1bGUgKSApCkBAIC00MzIyLDE3ICs0MzUxLDEwIEBACiAgICAgLyogaWYgdGhlIG1vZHVsZSBpcyBhIGZvbnQgZHJpdmVyICovCiAgICAgaWYgKCBGVF9NT0RVTEVfSVNfRFJJVkVSKCBtb2R1bGUgKSApCiAgICAgewotICAgICAgLyogYWxsb2NhdGUgZ2x5cGggbG9hZGVyIGlmIG5lZWRlZCAqLwogICAgICAgRlRfRHJpdmVyICBkcml2ZXIgPSBGVF9EUklWRVIoIG1vZHVsZSApOwogCiAKICAgICAgIGRyaXZlci0+Y2xhenogPSAoRlRfRHJpdmVyX0NsYXNzKW1vZHVsZS0+Y2xheno7Ci0gICAgICBpZiAoIEZUX0RSSVZFUl9VU0VTX09VVExJTkVTKCBkcml2ZXIgKSApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gRlRfR2x5cGhMb2FkZXJfTmV3KCBtZW1vcnksICZkcml2ZXItPmdseXBoX2xvYWRlciApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9CiAgICAgfQogCiAgICAgaWYgKCBjbGF6ei0+bW9kdWxlX2luaXQgKQpAQCAtNDM0OSwxNSArNDM3MSw2IEBACiAgICAgcmV0dXJuIGVycm9yOwogCiAgIEZhaWw6Ci0gICAgaWYgKCBGVF9NT0RVTEVfSVNfRFJJVkVSKCBtb2R1bGUgKSApCi0gICAgewotICAgICAgRlRfRHJpdmVyICBkcml2ZXIgPSBGVF9EUklWRVIoIG1vZHVsZSApOwotCi0KLSAgICAgIGlmICggRlRfRFJJVkVSX1VTRVNfT1VUTElORVMoIGRyaXZlciApICkKLSAgICAgICAgRlRfR2x5cGhMb2FkZXJfRG9uZSggZHJpdmVyLT5nbHlwaF9sb2FkZXIgKTsKLSAgICB9Ci0KICAgICBpZiAoIEZUX01PRFVMRV9JU19SRU5ERVJFUiggbW9kdWxlICkgKQogICAgIHsKICAgICAgIEZUX1JlbmRlcmVyICByZW5kZXJlciA9IEZUX1JFTkRFUkVSKCBtb2R1bGUgKTsKQEAgLTQ0OTIsNyArNDUwNSw3IEBACiAgICAgICAgICAgICBjdXJbMF0gPSBjdXJbMV07CiAgICAgICAgICAgICBjdXIrKzsKICAgICAgICAgICB9Ci0gICAgICAgICAgbGltaXRbMF0gPSAwOworICAgICAgICAgIGxpbWl0WzBdID0gTlVMTDsKIAogICAgICAgICAgIC8qIGRlc3Ryb3kgdGhlIG1vZHVsZSAqLwogICAgICAgICAgIERlc3Ryb3lfTW9kdWxlKCBtb2R1bGUgKTsKQEAgLTQ2NzUsMTIgKzQ2ODgsOSBAQAogICAgICAgZ290byBGYWlsOwogI2VuZGlmCiAKLSAgICAvKiBhbGxvY2F0ZSB0aGUgcmVuZGVyIHBvb2wgKi8KLSAgICBsaWJyYXJ5LT5yYXN0ZXJfcG9vbF9zaXplID0gRlRfUkVOREVSX1BPT0xfU0laRTsKLSNpZiBGVF9SRU5ERVJfUE9PTF9TSVpFID4gMAotICAgIGlmICggRlRfQUxMT0MoIGxpYnJhcnktPnJhc3Rlcl9wb29sLCBGVF9SRU5ERVJfUE9PTF9TSVpFICkgKQotICAgICAgZ290byBGYWlsOwotI2VuZGlmCisgICAgLyogd2UgZG9uJ3QgdXNlIHJhc3Rlcl9wb29sIGFueW1vcmUuICovCisgICAgbGlicmFyeS0+cmFzdGVyX3Bvb2xfc2l6ZSA9IDA7CisgICAgbGlicmFyeS0+cmFzdGVyX3Bvb2wgICAgICA9IE5VTEw7CiAKICAgICBsaWJyYXJ5LT52ZXJzaW9uX21ham9yID0gRlJFRVRZUEVfTUFKT1I7CiAgICAgbGlicmFyeS0+dmVyc2lvbl9taW5vciA9IEZSRUVUWVBFX01JTk9SOwpAQCAtNDY5Myw4ICs0NzAzLDggQEAKIAogICAgIHJldHVybiBGVF9FcnJfT2s7CiAKLSAgRmFpbDoKICNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQworICBGYWlsOgogICAgIGZ0X3BpY19jb250YWluZXJfZGVzdHJveSggbGlicmFyeSApOwogI2VuZGlmCiAgICAgRlRfRlJFRSggbGlicmFyeSApOwpAQCAtNDgyMywxNiArNDgzMywxMiBAQAogICAgICAgICBpZiAoIG1vZHVsZSApCiAgICAgICAgIHsKICAgICAgICAgICBEZXN0cm95X01vZHVsZSggbW9kdWxlICk7Ci0gICAgICAgICAgbGlicmFyeS0+bW9kdWxlc1tuXSA9IDA7CisgICAgICAgICAgbGlicmFyeS0+bW9kdWxlc1tuXSA9IE5VTEw7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAjZW5kaWYKIAotICAgIC8qIERlc3Ryb3kgcmFzdGVyIG9iamVjdHMgKi8KLSAgICBGVF9GUkVFKCBsaWJyYXJ5LT5yYXN0ZXJfcG9vbCApOwotICAgIGxpYnJhcnktPnJhc3Rlcl9wb29sX3NpemUgPSAwOwotCiAjaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKICAgICAvKiBEZXN0cm95IHBpYyBjb250YWluZXIgY29udGVudHMgKi8KICAgICBmdF9waWNfY29udGFpbmVyX2Rlc3Ryb3koIGxpYnJhcnkgKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0b3R2YWwuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0b3R2YWwuYwppbmRleCA1ZmM3M2Q3Li43ODY0NTdiIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdG90dmFsLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRvdHZhbC5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEZyZWVUeXBlIEFQSSBmb3IgdmFsaWRhdGluZyBPcGVuVHlwZSB0YWJsZXMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LCAyMDA2LCAyMDA4LCAyMDEwLCAyMDEzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwNC0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdG91dGxuLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdG91dGxuLmMKaW5kZXggODc0OWQ2NC4uMzVjYzlmNSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRvdXRsbi5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0b3V0bG4uYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBGcmVlVHlwZSBvdXRsaW5lIG1hbmFnZW1lbnQgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDA4LCAyMDEwLCAyMDEyLTIwMTQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtNTIsOCArNTIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfT3V0bGluZV9GdW5jcyogIGZ1bmNfaW50ZXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgIHVzZXIgKQogICB7Ci0jdW5kZWYgU0NBTEVECi0jZGVmaW5lIFNDQUxFRCggeCApICAoICggKHgpIDw8IHNoaWZ0ICkgLSBkZWx0YSApCisjdW5kZWYgIFNDQUxFRAorI2RlZmluZSBTQ0FMRUQoIHggKSAgKCAoICh4KSA8IDAgPyAtKCAtKHgpIDw8IHNoaWZ0ICkgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgKCAgKHgpIDw8IHNoaWZ0ICkgKSAtIGRlbHRhICkKIAogICAgIEZUX1ZlY3RvciAgIHZfbGFzdDsKICAgICBGVF9WZWN0b3IgICB2X2NvbnRyb2w7CkBAIC0yNzksNyArMjgwLDcgQEAKICAgICAgIGlmICggZXJyb3IgKQogICAgICAgICBnb3RvIEV4aXQ7CiAKLSAgICAgIGZpcnN0ID0gbGFzdCArIDE7CisgICAgICBmaXJzdCA9IChGVF9VSW50KWxhc3QgKyAxOwogICAgIH0KIAogICAgIEZUX1RSQUNFNSgoICJGVF9PdXRsaW5lX0RlY29tcG9zZTogRG9uZVxuIiwgbiApKTsKQEAgLTMyMCw3ICszMjEsNyBAQAogICAgICAgICAgRlRfTkVXX0FSUkFZKCBhbm91dGxpbmUtPmNvbnRvdXJzLCBudW1Db250b3VycyApICkKICAgICAgIGdvdG8gRmFpbDsKIAotICAgIGFub3V0bGluZS0+bl9wb2ludHMgICAgPSAoRlRfVVNob3J0KW51bVBvaW50czsKKyAgICBhbm91dGxpbmUtPm5fcG9pbnRzICAgID0gKEZUX1Nob3J0KW51bVBvaW50czsKICAgICBhbm91dGxpbmUtPm5fY29udG91cnMgID0gKEZUX1Nob3J0KW51bUNvbnRvdXJzOwogICAgIGFub3V0bGluZS0+ZmxhZ3MgICAgICB8PSBGVF9PVVRMSU5FX09XTkVSOwogCkBAIC02MTIsNyArNjEzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgIEZUX1Jhc3Rlcl9QYXJhbXMqICBwYXJhbXMgKQogICB7CiAgICAgRlRfRXJyb3IgICAgIGVycm9yOwotICAgIEZUX0Jvb2wgICAgICB1cGRhdGUgPSBGQUxTRTsKICAgICBGVF9SZW5kZXJlciAgcmVuZGVyZXI7CiAgICAgRlRfTGlzdE5vZGUgIG5vZGU7CiAKQEAgLTY0NiwxNCArNjQ2LDggQEAKICAgICAgIC8qIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICByZW5kZXJlciA9IEZUX0xvb2t1cF9SZW5kZXJlciggbGlicmFyeSwgRlRfR0xZUEhfRk9STUFUX09VVExJTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vZGUgKTsKLSAgICAgIHVwZGF0ZSAgID0gVFJVRTsKICAgICB9CiAKLSAgICAvKiBpZiB3ZSBjaGFuZ2VkIHRoZSBjdXJyZW50IHJlbmRlcmVyIGZvciB0aGUgZ2x5cGggaW1hZ2UgZm9ybWF0ICovCi0gICAgLyogd2UgbmVlZCB0byBzZWxlY3QgaXQgYXMgdGhlIG5leHQgY3VycmVudCBvbmUgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggIWVycm9yICYmIHVwZGF0ZSAmJiByZW5kZXJlciApCi0gICAgICBlcnJvciA9IEZUX1NldF9SZW5kZXJlciggbGlicmFyeSwgcmVuZGVyZXIsIDAsIDAgKTsKLQogICAgIHJldHVybiBlcnJvcjsKICAgfQogCkBAIC05MTQsOCArOTA4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgeXN0cmVuZ3RoICkKICAgewogICAgIEZUX1ZlY3RvciogIHBvaW50czsKLSAgICBGVF9WZWN0b3IgICB2X3ByZXYsIHZfZmlyc3QsIHZfbmV4dCwgdl9jdXI7Ci0gICAgRlRfSW50ICAgICAgYywgbiwgZmlyc3Q7CisgICAgRlRfSW50ICAgICAgYywgZmlyc3QsIGxhc3Q7CiAgICAgRlRfSW50ICAgICAgb3JpZW50YXRpb247CiAKIApAQCAtOTQxLDg3ICs5MzQsOTUgQEAKICAgICBmaXJzdCA9IDA7CiAgICAgZm9yICggYyA9IDA7IGMgPCBvdXRsaW5lLT5uX2NvbnRvdXJzOyBjKysgKQogICAgIHsKLSAgICAgIEZUX1ZlY3RvciAgaW4sIG91dCwgc2hpZnQ7Ci0gICAgICBGVF9GaXhlZCAgIGxfaW4sIGxfb3V0LCBsLCBxLCBkOwotICAgICAgaW50ICAgICAgICBsYXN0ID0gb3V0bGluZS0+Y29udG91cnNbY107CisgICAgICBGVF9WZWN0b3IgIGluLCBvdXQsIGFuY2hvciwgc2hpZnQ7CisgICAgICBGVF9GaXhlZCAgIGxfaW4sIGxfb3V0LCBsX2FuY2hvciA9IDAsIGwsIHEsIGQ7CisgICAgICBGVF9JbnQgICAgIGksIGosIGs7CiAKIAotICAgICAgdl9maXJzdCA9IHBvaW50c1tmaXJzdF07Ci0gICAgICB2X3ByZXYgID0gcG9pbnRzW2xhc3RdOwotICAgICAgdl9jdXIgICA9IHZfZmlyc3Q7CisgICAgICBsX2luID0gMDsKKyAgICAgIGxhc3QgPSBvdXRsaW5lLT5jb250b3Vyc1tjXTsKIAotICAgICAgLyogY29tcHV0ZSBpbmNvbWluZyBub3JtYWxpemVkIHZlY3RvciAqLwotICAgICAgaW4ueCA9IHZfY3VyLnggLSB2X3ByZXYueDsKLSAgICAgIGluLnkgPSB2X2N1ci55IC0gdl9wcmV2Lnk7Ci0gICAgICBsX2luID0gRlRfVmVjdG9yX0xlbmd0aCggJmluICk7Ci0gICAgICBpZiAoIGxfaW4gKQorICAgICAgLyogQ291bnRlciBqIGN5Y2xlcyB0aG91Z2ggdGhlIHBvaW50czsgY291bnRlciBpIGFkdmFuY2VzIG9ubHkgICovCisgICAgICAvKiB3aGVuIHBvaW50cyBhcmUgbW92ZWQ7IGFuY2hvciBrIG1hcmtzIHRoZSBmaXJzdCBtb3ZlZCBwb2ludC4gKi8KKyAgICAgIGZvciAoIGkgPSBsYXN0LCBqID0gZmlyc3QsIGsgPSAtMTsKKyAgICAgICAgICAgIGogIT0gaSAmJiBpICE9IGs7CisgICAgICAgICAgICBqID0gaiA8IGxhc3QgPyBqICsgMSA6IGZpcnN0ICkKICAgICAgIHsKLSAgICAgICAgaW4ueCA9IEZUX0RpdkZpeCggaW4ueCwgbF9pbiApOwotICAgICAgICBpbi55ID0gRlRfRGl2Rml4KCBpbi55LCBsX2luICk7Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoIG4gPSBmaXJzdDsgbiA8PSBsYXN0OyBuKysgKQotICAgICAgewotICAgICAgICBpZiAoIG4gPCBsYXN0ICkKLSAgICAgICAgICB2X25leHQgPSBwb2ludHNbbiArIDFdOwotICAgICAgICBlbHNlCi0gICAgICAgICAgdl9uZXh0ID0gdl9maXJzdDsKLQotICAgICAgICAvKiBjb21wdXRlIG91dGdvaW5nIG5vcm1hbGl6ZWQgdmVjdG9yICovCi0gICAgICAgIG91dC54ID0gdl9uZXh0LnggLSB2X2N1ci54OwotICAgICAgICBvdXQueSA9IHZfbmV4dC55IC0gdl9jdXIueTsKLSAgICAgICAgbF9vdXQgPSBGVF9WZWN0b3JfTGVuZ3RoKCAmb3V0ICk7Ci0gICAgICAgIGlmICggbF9vdXQgKQorICAgICAgICBpZiAoIGogIT0gayApCiAgICAgICAgIHsKLSAgICAgICAgICBvdXQueCA9IEZUX0RpdkZpeCggb3V0LngsIGxfb3V0ICk7Ci0gICAgICAgICAgb3V0LnkgPSBGVF9EaXZGaXgoIG91dC55LCBsX291dCApOwotICAgICAgICB9CisgICAgICAgICAgb3V0LnggPSBwb2ludHNbal0ueCAtIHBvaW50c1tpXS54OworICAgICAgICAgIG91dC55ID0gcG9pbnRzW2pdLnkgLSBwb2ludHNbaV0ueTsKKyAgICAgICAgICBsX291dCA9IChGVF9GaXhlZClGVF9WZWN0b3JfTm9ybUxlbiggJm91dCApOwogCi0gICAgICAgIGQgPSBGVF9NdWxGaXgoIGluLngsIG91dC54ICkgKyBGVF9NdWxGaXgoIGluLnksIG91dC55ICk7Ci0KLSAgICAgICAgLyogc2hpZnQgb25seSBpZiB0dXJuIGlzIGxlc3MgdGhhbiB+MTYwIGRlZ3JlZXMgKi8KLSAgICAgICAgaWYgKCBkID4gLTB4RjAwMEwgKQotICAgICAgICB7Ci0gICAgICAgICAgZCA9IGQgKyAweDEwMDAwTDsKLQotICAgICAgICAgIC8qIHNoaWZ0IGNvbXBvbmVudHMgYXJlIGFsaWduZWQgYWxvbmcgbGF0ZXJhbCBiaXNlY3RvciAqLwotICAgICAgICAgIC8qIGFuZCBkaXJlY3RlZCBhY2NvcmRpbmcgdG8gdGhlIG91dGxpbmUgb3JpZW50YXRpb24uICAqLwotICAgICAgICAgIHNoaWZ0LnggPSBpbi55ICsgb3V0Lnk7Ci0gICAgICAgICAgc2hpZnQueSA9IGluLnggKyBvdXQueDsKLQotICAgICAgICAgIGlmICggb3JpZW50YXRpb24gPT0gRlRfT1JJRU5UQVRJT05fVFJVRVRZUEUgKQotICAgICAgICAgICAgc2hpZnQueCA9IC1zaGlmdC54OwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNoaWZ0LnkgPSAtc2hpZnQueTsKLQotICAgICAgICAgIC8qIHJlc3RyaWN0IHNoaWZ0IG1hZ25pdHVkZSB0byBiZXR0ZXIgaGFuZGxlIGNvbGxhcHNpbmcgc2VnbWVudHMgKi8KLSAgICAgICAgICBxID0gRlRfTXVsRml4KCBvdXQueCwgaW4ueSApIC0gRlRfTXVsRml4KCBvdXQueSwgaW4ueCApOwotICAgICAgICAgIGlmICggb3JpZW50YXRpb24gPT0gRlRfT1JJRU5UQVRJT05fVFJVRVRZUEUgKQotICAgICAgICAgICAgcSA9IC1xOwotCi0gICAgICAgICAgbCA9IEZUX01JTiggbF9pbiwgbF9vdXQgKTsKLQotICAgICAgICAgIC8qIG5vbi1zdHJpY3QgaW5lcXVhbGl0aWVzIGF2b2lkIGRpdmlkZS1ieS16ZXJvIHdoZW4gcSA9PSBsID09IDAgKi8KLSAgICAgICAgICBpZiAoIEZUX011bEZpeCggeHN0cmVuZ3RoLCBxICkgPD0gRlRfTXVsRml4KCBkLCBsICkgKQotICAgICAgICAgICAgc2hpZnQueCA9IEZUX011bERpdiggc2hpZnQueCwgeHN0cmVuZ3RoLCBkICk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc2hpZnQueCA9IEZUX011bERpdiggc2hpZnQueCwgbCwgcSApOwotCi0KLSAgICAgICAgICBpZiAoIEZUX011bEZpeCggeXN0cmVuZ3RoLCBxICkgPD0gRlRfTXVsRml4KCBkLCBsICkgKQotICAgICAgICAgICAgc2hpZnQueSA9IEZUX011bERpdiggc2hpZnQueSwgeXN0cmVuZ3RoLCBkICk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc2hpZnQueSA9IEZUX011bERpdiggc2hpZnQueSwgbCwgcSApOworICAgICAgICAgIGlmICggbF9vdXQgPT0gMCApCisgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBlbHNlCi0gICAgICAgICAgc2hpZnQueCA9IHNoaWZ0LnkgPSAwOworICAgICAgICB7CisgICAgICAgICAgb3V0ICAgPSBhbmNob3I7CisgICAgICAgICAgbF9vdXQgPSBsX2FuY2hvcjsKKyAgICAgICAgfQogCi0gICAgICAgIG91dGxpbmUtPnBvaW50c1tuXS54ID0gdl9jdXIueCArIHhzdHJlbmd0aCArIHNoaWZ0Lng7Ci0gICAgICAgIG91dGxpbmUtPnBvaW50c1tuXS55ID0gdl9jdXIueSArIHlzdHJlbmd0aCArIHNoaWZ0Lnk7CisgICAgICAgIGlmICggbF9pbiAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgIGlmICggayA8IDAgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGsgICAgICAgID0gaTsKKyAgICAgICAgICAgIGFuY2hvciAgID0gaW47CisgICAgICAgICAgICBsX2FuY2hvciA9IGxfaW47CisgICAgICAgICAgfQogCi0gICAgICAgIGluICAgID0gb3V0OwotICAgICAgICBsX2luICA9IGxfb3V0OwotICAgICAgICB2X2N1ciA9IHZfbmV4dDsKKyAgICAgICAgICBkID0gRlRfTXVsRml4KCBpbi54LCBvdXQueCApICsgRlRfTXVsRml4KCBpbi55LCBvdXQueSApOworCisgICAgICAgICAgLyogc2hpZnQgb25seSBpZiB0dXJuIGlzIGxlc3MgdGhhbiB+MTYwIGRlZ3JlZXMgKi8KKyAgICAgICAgICBpZiAoIGQgPiAtMHhGMDAwTCApCisgICAgICAgICAgeworICAgICAgICAgICAgZCA9IGQgKyAweDEwMDAwTDsKKworICAgICAgICAgICAgLyogc2hpZnQgY29tcG9uZW50cyBhbG9uZyBsYXRlcmFsIGJpc2VjdG9yIGluIHByb3BlciBvcmllbnRhdGlvbiAqLworICAgICAgICAgICAgc2hpZnQueCA9IGluLnkgKyBvdXQueTsKKyAgICAgICAgICAgIHNoaWZ0LnkgPSBpbi54ICsgb3V0Lng7CisKKyAgICAgICAgICAgIGlmICggb3JpZW50YXRpb24gPT0gRlRfT1JJRU5UQVRJT05fVFJVRVRZUEUgKQorICAgICAgICAgICAgICBzaGlmdC54ID0gLXNoaWZ0Lng7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHNoaWZ0LnkgPSAtc2hpZnQueTsKKworICAgICAgICAgICAgLyogcmVzdHJpY3Qgc2hpZnQgbWFnbml0dWRlIHRvIGJldHRlciBoYW5kbGUgY29sbGFwc2luZyBzZWdtZW50cyAqLworICAgICAgICAgICAgcSA9IEZUX011bEZpeCggb3V0LngsIGluLnkgKSAtIEZUX011bEZpeCggb3V0LnksIGluLnggKTsKKyAgICAgICAgICAgIGlmICggb3JpZW50YXRpb24gPT0gRlRfT1JJRU5UQVRJT05fVFJVRVRZUEUgKQorICAgICAgICAgICAgICBxID0gLXE7CisKKyAgICAgICAgICAgIGwgPSBGVF9NSU4oIGxfaW4sIGxfb3V0ICk7CisKKyAgICAgICAgICAgIC8qIG5vbi1zdHJpY3QgaW5lcXVhbGl0aWVzIGF2b2lkIGRpdmlkZS1ieS16ZXJvIHdoZW4gcSA9PSBsID09IDAgKi8KKyAgICAgICAgICAgIGlmICggRlRfTXVsRml4KCB4c3RyZW5ndGgsIHEgKSA8PSBGVF9NdWxGaXgoIGwsIGQgKSApCisgICAgICAgICAgICAgIHNoaWZ0LnggPSBGVF9NdWxEaXYoIHNoaWZ0LngsIHhzdHJlbmd0aCwgZCApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBzaGlmdC54ID0gRlRfTXVsRGl2KCBzaGlmdC54LCBsLCBxICk7CisKKworICAgICAgICAgICAgaWYgKCBGVF9NdWxGaXgoIHlzdHJlbmd0aCwgcSApIDw9IEZUX011bEZpeCggbCwgZCApICkKKyAgICAgICAgICAgICAgc2hpZnQueSA9IEZUX011bERpdiggc2hpZnQueSwgeXN0cmVuZ3RoLCBkICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHNoaWZ0LnkgPSBGVF9NdWxEaXYoIHNoaWZ0LnksIGwsIHEgKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgc2hpZnQueCA9IHNoaWZ0LnkgPSAwOworCisgICAgICAgICAgZm9yICggOworICAgICAgICAgICAgICAgIGkgIT0gajsKKyAgICAgICAgICAgICAgICBpID0gaSA8IGxhc3QgPyBpICsgMSA6IGZpcnN0ICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBwb2ludHNbaV0ueCArPSB4c3RyZW5ndGggKyBzaGlmdC54OworICAgICAgICAgICAgcG9pbnRzW2ldLnkgKz0geXN0cmVuZ3RoICsgc2hpZnQueTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIGkgPSBqOworCisgICAgICAgIGluICAgPSBvdXQ7CisgICAgICAgIGxfaW4gPSBsX291dDsKICAgICAgIH0KIAogICAgICAgZmlyc3QgPSBsYXN0ICsgMTsKQEAgLTEwNTAsNyArMTA1MSw3IEBACiAgICAgLyogV2UgdXNlIHRoZSBub256ZXJvIHdpbmRpbmcgcnVsZSB0byBmaW5kIHRoZSBvcmllbnRhdGlvbi4gICAgICAgKi8KICAgICAvKiBTaW5jZSBnbHlwaCBvdXRsaW5lcyBiZWhhdmUgbXVjaCBtb3JlIGByZWd1bGFyJyB0aGFuIGFyYml0cmFyeSAqLwogICAgIC8qIGN1YmljIG9yIHF1YWRyYXRpYyBjdXJ2ZXMsIHRoaXMgdGVzdCBkZWFscyB3aXRoIHRoZSBwb2x5Z29uICAgICovCi0gICAgLyogb25seSB3aGljaCBpcyBzcGFubmVkIHVwIGJ5IHRoZSBjb250cm9sIHBvaW50cy4gICAgICAgICAgICAgICAgKi8KKyAgICAvKiBvbmx5IHRoYXQgaXMgc3Bhbm5lZCB1cCBieSB0aGUgY29udHJvbCBwb2ludHMuICAgICAgICAgICAgICAgICAqLwogCiAgICAgRlRfT3V0bGluZV9HZXRfQ0JveCggb3V0bGluZSwgJmNib3ggKTsKIApAQCAtMTA1OCwxMCArMTA1OSwxMSBAQAogICAgIGlmICggY2JveC54TWluID09IGNib3gueE1heCB8fCBjYm94LnlNaW4gPT0gY2JveC55TWF4ICkKICAgICAgIHJldHVybiBGVF9PUklFTlRBVElPTl9OT05FOwogCi0gICAgeHNoaWZ0ID0gRlRfTVNCKCBGVF9BQlMoIGNib3gueE1heCApIHwgRlRfQUJTKCBjYm94LnhNaW4gKSApIC0gMTQ7CisgICAgeHNoaWZ0ID0gRlRfTVNCKCAoRlRfVUludDMyKSggRlRfQUJTKCBjYm94LnhNYXggKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQUJTKCBjYm94LnhNaW4gKSApICkgLSAxNDsKICAgICB4c2hpZnQgPSBGVF9NQVgoIHhzaGlmdCwgMCApOwogCi0gICAgeXNoaWZ0ID0gRlRfTVNCKCBjYm94LnlNYXggLSBjYm94LnlNaW4gKSAtIDE0OworICAgIHlzaGlmdCA9IEZUX01TQiggKEZUX1VJbnQzMikoIGNib3gueU1heCAtIGNib3gueU1pbiApICkgLSAxNDsKICAgICB5c2hpZnQgPSBGVF9NQVgoIHlzaGlmdCwgMCApOwogCiAgICAgcG9pbnRzID0gb3V0bGluZS0+cG9pbnRzOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRwYXRlbnQuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0cGF0ZW50LmMKaW5kZXggODJiNDJmMC4uYmYyYjA4NSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRwYXRlbnQuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHBhdGVudC5jCkBAIC01LDcgKzUsOCBAQAogLyogICAgRnJlZVR5cGUgQVBJIGZvciBjaGVja2luZyBwYXRlbnRlZCBUcnVlVHlwZSBieXRlY29kZSBpbnN0cnVjdGlvbnMgICAgKi8KIC8qICAgIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LCAyMDA4LCAyMDEwIGJ5IERhdmlkIFR1cm5lci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwNy0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCiAvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRwZnIuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0cGZyLmMKaW5kZXggNzQyNWFiZS4uMzlmMDg5ZSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRwZnIuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHBmci5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEZyZWVUeXBlIEFQSSBmb3IgYWNjZXNzaW5nIFBGUi1zcGVjaWZpYyBkYXRhIChib2R5KS4gICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMDQsIDIwMDgsIDIwMTAsIDIwMTMsIDIwMTQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwMi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHBpYy5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRwaWMuYwppbmRleCA5YmQ5MmY3Li42YzRiMWNkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHBpYy5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0cGljLmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgKGJvZHkpLiAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDksIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDA5LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBPcmFuIEFncmEgYW5kIE1pY2tleSBHYWJlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0cmZvcmsuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0cmZvcmsuYwppbmRleCA1MzUyOTcwLi5jMzBjNzY2IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHJmb3JrLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRyZm9yay5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEVtYmVkZGVkIHJlc291cmNlIGZvcmtzIGFjY2Vzc29yIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTAsIDIwMTMsIDIwMTQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwNC0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTWFzYXRha2UgWUFNQVRPIGFuZCBSZWRoYXQgSy5LLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBGVF9SYWNjZXNzX0dldF9IZWFkZXJJbmZvKCkgYW5kIHJhY2Nlc3NfZ3Vlc3NfZGFyd2luX2hmc3BsdXMoKSBhcmUgICAgICovCkBAIC02Myw3ICs2Myw3IEBACiAgICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7CiAKIAotICAgIGVycm9yID0gRlRfU3RyZWFtX1NlZWsoIHN0cmVhbSwgcmZvcmtfb2Zmc2V0ICk7CisgICAgZXJyb3IgPSBGVF9TdHJlYW1fU2Vlayggc3RyZWFtLCAoRlRfVUxvbmcpcmZvcmtfb2Zmc2V0ICk7CiAgICAgaWYgKCBlcnJvciApCiAgICAgICByZXR1cm4gZXJyb3I7CiAKQEAgLTcxLDI1ICs3MSwzNiBAQAogICAgIGlmICggZXJyb3IgKQogICAgICAgcmV0dXJuIGVycm9yOwogCi0gICAgKnJkYXRhX3BvcyA9IHJmb3JrX29mZnNldCArICggKCBoZWFkWzBdIDw8IDI0ICkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggaGVhZFsxXSA8PCAxNiApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIGhlYWRbMl0gPDwgIDggKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkWzNdICAgICAgICAgKTsKLSAgICBtYXBfcG9zICAgID0gcmZvcmtfb2Zmc2V0ICsgKCAoIGhlYWRbNF0gPDwgMjQgKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBoZWFkWzVdIDw8IDE2ICkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggaGVhZFs2XSA8PCAgOCApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRbN10gICAgICAgICApOwotICAgIHJkYXRhX2xlbiA9ICggaGVhZFsgOF0gPDwgMjQgKSB8Ci0gICAgICAgICAgICAgICAgKCBoZWFkWyA5XSA8PCAxNiApIHwKLSAgICAgICAgICAgICAgICAoIGhlYWRbMTBdIDw8ICA4ICkgfAotICAgICAgICAgICAgICAgICAgaGVhZFsxMV07CisgICAgLyogZW5zdXJlIHBvc2l0aXZlIHZhbHVlcyAqLworICAgIGlmICggaGVhZFswXSA+PSAweDgwIHx8IGhlYWRbNF0gPj0gMHg4MCB8fCBoZWFkWzhdID49IDB4ODAgKQorICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7CisKKyAgICAqcmRhdGFfcG9zID0gKCBoZWFkWyAwXSA8PCAyNCApIHwKKyAgICAgICAgICAgICAgICAgKCBoZWFkWyAxXSA8PCAxNiApIHwKKyAgICAgICAgICAgICAgICAgKCBoZWFkWyAyXSA8PCAgOCApIHwKKyAgICAgICAgICAgICAgICAgICBoZWFkWyAzXTsKKyAgICBtYXBfcG9zICAgID0gKCBoZWFkWyA0XSA8PCAyNCApIHwKKyAgICAgICAgICAgICAgICAgKCBoZWFkWyA1XSA8PCAxNiApIHwKKyAgICAgICAgICAgICAgICAgKCBoZWFkWyA2XSA8PCAgOCApIHwKKyAgICAgICAgICAgICAgICAgICBoZWFkWyA3XTsKKyAgICByZGF0YV9sZW4gID0gKCBoZWFkWyA4XSA8PCAyNCApIHwKKyAgICAgICAgICAgICAgICAgKCBoZWFkWyA5XSA8PCAxNiApIHwKKyAgICAgICAgICAgICAgICAgKCBoZWFkWzEwXSA8PCAgOCApIHwKKyAgICAgICAgICAgICAgICAgICBoZWFkWzExXTsKIAogICAgIC8qIG1hcF9sZW4gPSBoZWFkWzEyXSAuLiBoZWFkWzE1XSAqLwogCi0gICAgaWYgKCAqcmRhdGFfcG9zICsgcmRhdGFfbGVuICE9IG1hcF9wb3MgfHwgbWFwX3BvcyA9PSByZm9ya19vZmZzZXQgKQorICAgIGlmICggKnJkYXRhX3BvcyAhPSBtYXBfcG9zIC0gcmRhdGFfbGVuIHx8IG1hcF9wb3MgPT0gMCApCiAgICAgICByZXR1cm4gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKIAotICAgIGVycm9yID0gRlRfU3RyZWFtX1NlZWsoIHN0cmVhbSwgbWFwX3BvcyApOworICAgIGlmICggRlRfTE9OR19NQVggLSByZm9ya19vZmZzZXQgPCAqcmRhdGFfcG9zIHx8CisgICAgICAgICBGVF9MT05HX01BWCAtIHJmb3JrX29mZnNldCA8IG1hcF9wb3MgICAgKQorICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7CisKKyAgICAqcmRhdGFfcG9zICs9IHJmb3JrX29mZnNldDsKKyAgICBtYXBfcG9zICAgICs9IHJmb3JrX29mZnNldDsKKworICAgIGVycm9yID0gRlRfU3RyZWFtX1NlZWsoIHN0cmVhbSwgKEZUX1VMb25nKW1hcF9wb3MgKTsKICAgICBpZiAoIGVycm9yICkKICAgICAgIHJldHVybiBlcnJvcjsKIApAQCAtMTI0LDcgKzEzNSw3IEBACiAgICAgaWYgKCB0eXBlX2xpc3QgPT0gLTEgKQogICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7CiAKLSAgICBlcnJvciA9IEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIG1hcF9wb3MgKyB0eXBlX2xpc3QgKTsKKyAgICBlcnJvciA9IEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIChGVF9VTG9uZykoIG1hcF9wb3MgKyB0eXBlX2xpc3QgKSApOwogICAgIGlmICggZXJyb3IgKQogICAgICAgcmV0dXJuIGVycm9yOwogCkBAIC0xNjYsNyArMTc3LDcgQEAKIAogCiAgICAgRlRfVFJBQ0UzKCggIlxuIiApKTsKLSAgICBlcnJvciA9IEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIG1hcF9vZmZzZXQgKTsKKyAgICBlcnJvciA9IEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIChGVF9VTG9uZyltYXBfb2Zmc2V0ICk7CiAgICAgaWYgKCBlcnJvciApCiAgICAgICByZXR1cm4gZXJyb3I7CiAKQEAgLTE4MiwxMCArMTkzLDEwIEBACiAgICAgICAgIHJldHVybiBlcnJvcjsKIAogICAgICAgRlRfVFJBQ0UyKCggIlJlc291cmNlIHRhZ3M6ICVjJWMlYyVjXG4iLAotICAgICAgICAgICAgICAgICAgKGNoYXIpKCAweGZmICYgKCB0YWdfaW50ZXJuYWwgPj4gMjQgKSApLAotICAgICAgICAgICAgICAgICAgKGNoYXIpKCAweGZmICYgKCB0YWdfaW50ZXJuYWwgPj4gMTYgKSApLAotICAgICAgICAgICAgICAgICAgKGNoYXIpKCAweGZmICYgKCB0YWdfaW50ZXJuYWwgPj4gIDggKSApLAotICAgICAgICAgICAgICAgICAgKGNoYXIpKCAweGZmICYgKCB0YWdfaW50ZXJuYWwgPj4gIDAgKSApICkpOworICAgICAgICAgICAgICAgICAgKGNoYXIpKCAweEZGICYgKCB0YWdfaW50ZXJuYWwgPj4gMjQgKSApLAorICAgICAgICAgICAgICAgICAgKGNoYXIpKCAweEZGICYgKCB0YWdfaW50ZXJuYWwgPj4gMTYgKSApLAorICAgICAgICAgICAgICAgICAgKGNoYXIpKCAweEZGICYgKCB0YWdfaW50ZXJuYWwgPj4gIDggKSApLAorICAgICAgICAgICAgICAgICAgKGNoYXIpKCAweEZGICYgKCB0YWdfaW50ZXJuYWwgPj4gIDAgKSApICkpOwogICAgICAgRlRfVFJBQ0UzKCggIiAgICAgICAgICAgICA6IHN1YmNvdW50PSVkLCBzdWJvZmZzZXQ9MHglMDR4XG4iLAogICAgICAgICAgICAgICAgICAgc3ViY250LCBycG9zICkpOwogCkBAIC0xOTQsNyArMjA1LDcgQEAKICAgICAgICAgKmNvdW50ID0gc3ViY250ICsgMTsKICAgICAgICAgcnBvcyAgKz0gbWFwX29mZnNldDsKIAotICAgICAgICBlcnJvciA9IEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIHJwb3MgKTsKKyAgICAgICAgZXJyb3IgPSBGVF9TdHJlYW1fU2Vlayggc3RyZWFtLCAoRlRfVUxvbmcpcnBvcyApOwogICAgICAgICBpZiAoIGVycm9yICkKICAgICAgICAgICByZXR1cm4gZXJyb3I7CiAKQEAgLTIyMCw3ICsyMzEsNyBAQAogCiAgICAgICAgIGlmIChzb3J0X2J5X3Jlc19pZCkKICAgICAgICAgewotICAgICAgICAgIGZ0X3Fzb3J0KCByZWYsICpjb3VudCwgc2l6ZW9mICggRlRfUkZvcmtfUmVmICksCisgICAgICAgICAgZnRfcXNvcnQoIHJlZiwgKHNpemVfdCkqY291bnQsIHNpemVvZiAoIEZUX1JGb3JrX1JlZiApLAogICAgICAgICAgICAgICAgICAgICAoIGludCgqKShjb25zdCB2b2lkKiwgY29uc3Qgdm9pZCopICkKICAgICAgICAgICAgICAgICAgICAgZnRfcmFjY2Vzc19zb3J0X3JlZl9ieV9pZCApOwogCkBAIC03MTMsOSArNzI0LDkgQEAKICAgICBGVF9VU2hvcnQgIG5fb2ZfZW50cmllczsKIAogICAgIGludCAgICAgICAgaTsKLSAgICBGVF9VSW50MzIgIGVudHJ5X2lkLCBlbnRyeV9vZmZzZXQsIGVudHJ5X2xlbmd0aCA9IDA7CisgICAgRlRfSW50MzIgICBlbnRyeV9pZCwgZW50cnlfb2Zmc2V0LCBlbnRyeV9sZW5ndGggPSAwOwogCi0gICAgY29uc3QgRlRfVUludDMyICByZXNvdXJjZV9mb3JrX2VudHJ5X2lkID0gMHgyOworICAgIGNvbnN0IEZUX0ludDMyICByZXNvdXJjZV9mb3JrX2VudHJ5X2lkID0gMHgyOwogCiAgICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7CiAgICAgRlRfVU5VU0VEKCBiYXNlX2ZpbGVfbmFtZSApOwpAQCAtODEzLDcgKzgyNCw5IEBACiAgICAgdG1wID0gZnRfc3RycmNociggb3JpZ2luYWxfbmFtZSwgJy8nICk7CiAgICAgaWYgKCB0bXAgKQogICAgIHsKLSAgICAgIGZ0X3N0cm5jcHkoIG5ld19uYW1lLCBvcmlnaW5hbF9uYW1lLCB0bXAgLSBvcmlnaW5hbF9uYW1lICsgMSApOworICAgICAgZnRfc3RybmNweSggbmV3X25hbWUsCisgICAgICAgICAgICAgICAgICBvcmlnaW5hbF9uYW1lLAorICAgICAgICAgICAgICAgICAgKHNpemVfdCkoIHRtcCAtIG9yaWdpbmFsX25hbWUgKyAxICkgKTsKICAgICAgIG5ld19uYW1lW3RtcCAtIG9yaWdpbmFsX25hbWUgKyAxXSA9ICdcMCc7CiAgICAgICBzbGFzaCA9IHRtcCArIDE7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRzbmFtZXMuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0c25hbWVzLmMKaW5kZXggMjYwZTkxYy4uODAzMDRlNSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRzbmFtZXMuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHNuYW1lcy5jCkBAIC03LDcgKzcsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFRoaXMgaXMgX25vdF8gdXNlZCB0byByZXRyaWV2ZSBnbHlwaCBuYW1lcyEgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHN0cmVhbS5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRzdHJlYW0uYwppbmRleCA3NTlmZDhmLi5iNjhmM2Y4IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHN0cmVhbS5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0c3RyZWFtLmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgSS9PIHN0cmVhbSBzdXBwb3J0IChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDAtMjAwMiwgMjAwNC0yMDA2LCAyMDA4LTIwMTEsIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAwLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KQEAgLTM5LDkgKzM5LDkgQEAKICAgICBzdHJlYW0tPmJhc2UgICA9IChGVF9CeXRlKikgYmFzZTsKICAgICBzdHJlYW0tPnNpemUgICA9IHNpemU7CiAgICAgc3RyZWFtLT5wb3MgICAgPSAwOwotICAgIHN0cmVhbS0+Y3Vyc29yID0gMDsKLSAgICBzdHJlYW0tPnJlYWQgICA9IDA7Ci0gICAgc3RyZWFtLT5jbG9zZSAgPSAwOworICAgIHN0cmVhbS0+Y3Vyc29yID0gTlVMTDsKKyAgICBzdHJlYW0tPnJlYWQgICA9IE5VTEw7CisgICAgc3RyZWFtLT5jbG9zZSAgPSBOVUxMOwogICB9CiAKIApAQCAtOTUsMTEgKzk1LDExIEBACiAgICAgaWYgKCBkaXN0YW5jZSA8IDAgKQogICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1N0cmVhbV9PcGVyYXRpb24gKTsKIAotICAgIHJldHVybiBGVF9TdHJlYW1fU2Vlayggc3RyZWFtLCAoRlRfVUxvbmcpKCBzdHJlYW0tPnBvcyArIGRpc3RhbmNlICkgKTsKKyAgICByZXR1cm4gRlRfU3RyZWFtX1NlZWsoIHN0cmVhbSwgc3RyZWFtLT5wb3MgKyAoRlRfVUxvbmcpZGlzdGFuY2UgKTsKICAgfQogCiAKLSAgRlRfQkFTRV9ERUYoIEZUX0xvbmcgKQorICBGVF9CQVNFX0RFRiggRlRfVUxvbmcgKQogICBGVF9TdHJlYW1fUG9zKCBGVF9TdHJlYW0gIHN0cmVhbSApCiAgIHsKICAgICByZXR1cm4gc3RyZWFtLT5wb3M7CkBAIC0yMDMsOCArMjAzLDggQEAKICAgICAgICpwYnl0ZXMgPSAoRlRfQnl0ZSopc3RyZWFtLT5jdXJzb3I7CiAKICAgICAgIC8qIGVxdWl2YWxlbnQgdG8gRlRfU3RyZWFtX0V4aXRGcmFtZSgpLCB3aXRoIG5vIG1lbW9yeSBibG9jayByZWxlYXNlICovCi0gICAgICBzdHJlYW0tPmN1cnNvciA9IDA7Ci0gICAgICBzdHJlYW0tPmxpbWl0ICA9IDA7CisgICAgICBzdHJlYW0tPmN1cnNvciA9IE5VTEw7CisgICAgICBzdHJlYW0tPmxpbWl0ICA9IE5VTEw7CiAgICAgfQogCiAgICAgcmV0dXJuIGVycm9yOwpAQCAtMjI2LDcgKzIyNiw3IEBACiAgICAgICBGVF9GUkVFKCAqcGJ5dGVzICk7CiAjZW5kaWYKICAgICB9Ci0gICAgKnBieXRlcyA9IDA7CisgICAgKnBieXRlcyA9IE5VTEw7CiAgIH0KIAogCkBAIC0yNjAsNyArMjYwLDkgQEAKIAogI2lmZGVmIEZUX0RFQlVHX01FTU9SWQogICAgICAgLyogYXNzdW1lIF9mdF9kZWJ1Z19maWxlIGFuZCBfZnRfZGVidWdfbGluZW5vIGFyZSBhbHJlYWR5IHNldCAqLwotICAgICAgc3RyZWFtLT5iYXNlID0gKHVuc2lnbmVkIGNoYXIqKWZ0X21lbV9xYWxsb2MoIG1lbW9yeSwgY291bnQsICZlcnJvciApOworICAgICAgc3RyZWFtLT5iYXNlID0gKHVuc2lnbmVkIGNoYXIqKWZ0X21lbV9xYWxsb2MoIG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZyljb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IgKTsKICAgICAgIGlmICggZXJyb3IgKQogICAgICAgICBnb3RvIEV4aXQ7CiAjZWxzZQpAQCAtMzMzLDggKzMzNSw4IEBACiAgICAgICBGVF9GUkVFKCBzdHJlYW0tPmJhc2UgKTsKICNlbmRpZgogICAgIH0KLSAgICBzdHJlYW0tPmN1cnNvciA9IDA7Ci0gICAgc3RyZWFtLT5saW1pdCAgPSAwOworICAgIHN0cmVhbS0+Y3Vyc29yID0gTlVMTDsKKyAgICBzdHJlYW0tPmxpbWl0ICA9IE5VTEw7CiAgIH0KIAogCkBAIC0zNDgsNyArMzUwLDcgQEAKIAogICAgIHJlc3VsdCA9IDA7CiAgICAgaWYgKCBzdHJlYW0tPmN1cnNvciA8IHN0cmVhbS0+bGltaXQgKQotICAgICAgcmVzdWx0ID0gKnN0cmVhbS0+Y3Vyc29yKys7CisgICAgICByZXN1bHQgPSAoRlRfQ2hhcikqc3RyZWFtLT5jdXJzb3IrKzsKIAogICAgIHJldHVybiByZXN1bHQ7CiAgIH0KQEAgLTM1Nyw4ICszNTksOCBAQAogICBGVF9CQVNFX0RFRiggRlRfVVNob3J0ICkKICAgRlRfU3RyZWFtX0dldFVTaG9ydCggRlRfU3RyZWFtICBzdHJlYW0gKQogICB7Ci0gICAgRlRfQnl0ZSogIHA7Ci0gICAgRlRfU2hvcnQgIHJlc3VsdDsKKyAgICBGVF9CeXRlKiAgIHA7CisgICAgRlRfVVNob3J0ICByZXN1bHQ7CiAKIAogICAgIEZUX0FTU0VSVCggc3RyZWFtICYmIHN0cmVhbS0+Y3Vyc29yICk7CkBAIC0zNzYsOCArMzc4LDggQEAKICAgRlRfQkFTRV9ERUYoIEZUX1VTaG9ydCApCiAgIEZUX1N0cmVhbV9HZXRVU2hvcnRMRSggRlRfU3RyZWFtICBzdHJlYW0gKQogICB7Ci0gICAgRlRfQnl0ZSogIHA7Ci0gICAgRlRfU2hvcnQgIHJlc3VsdDsKKyAgICBGVF9CeXRlKiAgIHA7CisgICAgRlRfVVNob3J0ICByZXN1bHQ7CiAKIAogICAgIEZUX0FTU0VSVCggc3RyZWFtICYmIHN0cmVhbS0+Y3Vyc29yICk7CkBAIC0zOTYsNyArMzk4LDcgQEAKICAgRlRfU3RyZWFtX0dldFVPZmZzZXQoIEZUX1N0cmVhbSAgc3RyZWFtICkKICAgewogICAgIEZUX0J5dGUqICBwOwotICAgIEZUX0xvbmcgICByZXN1bHQ7CisgICAgRlRfVUxvbmcgIHJlc3VsdDsKIAogCiAgICAgRlRfQVNTRVJUKCBzdHJlYW0gJiYgc3RyZWFtLT5jdXJzb3IgKTsKQEAgLTQxNCw3ICs0MTYsNyBAQAogICBGVF9TdHJlYW1fR2V0VUxvbmcoIEZUX1N0cmVhbSAgc3RyZWFtICkKICAgewogICAgIEZUX0J5dGUqICBwOwotICAgIEZUX0xvbmcgICByZXN1bHQ7CisgICAgRlRfVUxvbmcgIHJlc3VsdDsKIAogCiAgICAgRlRfQVNTRVJUKCBzdHJlYW0gJiYgc3RyZWFtLT5jdXJzb3IgKTsKQEAgLTQzMiw3ICs0MzQsNyBAQAogICBGVF9TdHJlYW1fR2V0VUxvbmdMRSggRlRfU3RyZWFtICBzdHJlYW0gKQogICB7CiAgICAgRlRfQnl0ZSogIHA7Ci0gICAgRlRfTG9uZyAgIHJlc3VsdDsKKyAgICBGVF9VTG9uZyAgcmVzdWx0OwogCiAKICAgICBGVF9BU1NFUlQoIHN0cmVhbSAmJiBzdHJlYW0tPmN1cnNvciApOwpAQCAtNDcxLDcgKzQ3Myw3IEBACiAgICAgfQogICAgIHN0cmVhbS0+cG9zKys7CiAKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiAoRlRfQ2hhcilyZXN1bHQ7CiAKICAgRmFpbDoKICAgICAqZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uICk7CkBAIC00ODUsMTEgKzQ4NywxMSBAQAogCiAgIEZUX0JBU0VfREVGKCBGVF9VU2hvcnQgKQogICBGVF9TdHJlYW1fUmVhZFVTaG9ydCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IgKQorICAgICAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IqICBlcnJvciApCiAgIHsKLSAgICBGVF9CeXRlICAgcmVhZHNbMl07Ci0gICAgRlRfQnl0ZSogIHAgPSAwOwotICAgIEZUX1Nob3J0ICByZXN1bHQgPSAwOworICAgIEZUX0J5dGUgICAgcmVhZHNbMl07CisgICAgRlRfQnl0ZSogICBwICAgICAgPSAwOworICAgIEZUX1VTaG9ydCAgcmVzdWx0ID0gMDsKIAogCiAgICAgRlRfQVNTRVJUKCBzdHJlYW0gKTsKQEAgLTUwNiw5ICs1MDgsNyBAQAogICAgICAgICBwID0gcmVhZHM7CiAgICAgICB9CiAgICAgICBlbHNlCi0gICAgICB7CiAgICAgICAgIHAgPSBzdHJlYW0tPmJhc2UgKyBzdHJlYW0tPnBvczsKLSAgICAgIH0KIAogICAgICAgaWYgKCBwICkKICAgICAgICAgcmVzdWx0ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKQEAgLTUzMiwxMSArNTMyLDExIEBACiAKICAgRlRfQkFTRV9ERUYoIEZUX1VTaG9ydCApCiAgIEZUX1N0cmVhbV9SZWFkVVNob3J0TEUoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IgKQorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogIGVycm9yICkKICAgewotICAgIEZUX0J5dGUgICByZWFkc1syXTsKLSAgICBGVF9CeXRlKiAgcCA9IDA7Ci0gICAgRlRfU2hvcnQgIHJlc3VsdCA9IDA7CisgICAgRlRfQnl0ZSAgICByZWFkc1syXTsKKyAgICBGVF9CeXRlKiAgIHAgICAgICA9IDA7CisgICAgRlRfVVNob3J0ICByZXN1bHQgPSAwOwogCiAKICAgICBGVF9BU1NFUlQoIHN0cmVhbSApOwpAQCAtNTUzLDkgKzU1Myw3IEBACiAgICAgICAgIHAgPSByZWFkczsKICAgICAgIH0KICAgICAgIGVsc2UKLSAgICAgIHsKICAgICAgICAgcCA9IHN0cmVhbS0+YmFzZSArIHN0cmVhbS0+cG9zOwotICAgICAgfQogCiAgICAgICBpZiAoIHAgKQogICAgICAgICByZXN1bHQgPSBGVF9ORVhUX1VTSE9SVF9MRSggcCApOwpAQCAtNTc5LDExICs1NzcsMTEgQEAKIAogICBGVF9CQVNFX0RFRiggRlRfVUxvbmcgKQogICBGVF9TdHJlYW1fUmVhZFVPZmZzZXQoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IqICBlcnJvciApCisgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IqICBlcnJvciApCiAgIHsKICAgICBGVF9CeXRlICAgcmVhZHNbM107Ci0gICAgRlRfQnl0ZSogIHAgPSAwOwotICAgIEZUX0xvbmcgICByZXN1bHQgPSAwOworICAgIEZUX0J5dGUqICBwICAgICAgPSAwOworICAgIEZUX1VMb25nICByZXN1bHQgPSAwOwogCiAKICAgICBGVF9BU1NFUlQoIHN0cmVhbSApOwpAQCAtNjAwLDkgKzU5OCw3IEBACiAgICAgICAgIHAgPSByZWFkczsKICAgICAgIH0KICAgICAgIGVsc2UKLSAgICAgIHsKICAgICAgICAgcCA9IHN0cmVhbS0+YmFzZSArIHN0cmVhbS0+cG9zOwotICAgICAgfQogCiAgICAgICBpZiAoIHAgKQogICAgICAgICByZXN1bHQgPSBGVF9ORVhUX1VPRkYzKCBwICk7CkBAIC02MjYsMTEgKzYyMiwxMSBAQAogCiAgIEZUX0JBU0VfREVGKCBGVF9VTG9uZyApCiAgIEZUX1N0cmVhbV9SZWFkVUxvbmcoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IgKQorICAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogIGVycm9yICkKICAgewogICAgIEZUX0J5dGUgICByZWFkc1s0XTsKLSAgICBGVF9CeXRlKiAgcCA9IDA7Ci0gICAgRlRfTG9uZyAgIHJlc3VsdCA9IDA7CisgICAgRlRfQnl0ZSogIHAgICAgICA9IDA7CisgICAgRlRfVUxvbmcgIHJlc3VsdCA9IDA7CiAKIAogICAgIEZUX0FTU0VSVCggc3RyZWFtICk7CkBAIC02NDcsOSArNjQzLDcgQEAKICAgICAgICAgcCA9IHJlYWRzOwogICAgICAgfQogICAgICAgZWxzZQotICAgICAgewogICAgICAgICBwID0gc3RyZWFtLT5iYXNlICsgc3RyZWFtLT5wb3M7Ci0gICAgICB9CiAKICAgICAgIGlmICggcCApCiAgICAgICAgIHJlc3VsdCA9IEZUX05FWFRfVUxPTkcoIHAgKTsKQEAgLTY3MywxMSArNjY3LDExIEBACiAKICAgRlRfQkFTRV9ERUYoIEZUX1VMb25nICkKICAgRlRfU3RyZWFtX1JlYWRVTG9uZ0xFKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IgKQorICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IgKQogICB7CiAgICAgRlRfQnl0ZSAgIHJlYWRzWzRdOwotICAgIEZUX0J5dGUqICBwID0gMDsKLSAgICBGVF9Mb25nICAgcmVzdWx0ID0gMDsKKyAgICBGVF9CeXRlKiAgcCAgICAgID0gMDsKKyAgICBGVF9VTG9uZyAgcmVzdWx0ID0gMDsKIAogCiAgICAgRlRfQVNTRVJUKCBzdHJlYW0gKTsKQEAgLTY5NCw5ICs2ODgsNyBAQAogICAgICAgICBwID0gcmVhZHM7CiAgICAgICB9CiAgICAgICBlbHNlCi0gICAgICB7CiAgICAgICAgIHAgPSBzdHJlYW0tPmJhc2UgKyBzdHJlYW0tPnBvczsKLSAgICAgIH0KIAogICAgICAgaWYgKCBwICkKICAgICAgICAgcmVzdWx0ID0gRlRfTkVYVF9VTE9OR19MRSggcCApOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRzdHJva2UuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0c3Ryb2tlLmMKaW5kZXggZDEyM2UwMi4uZmVjYjNjYyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRzdHJva2UuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHN0cm9rZS5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEZyZWVUeXBlIHBhdGggc3Ryb2tlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMDYsIDIwMDgtMjAxMSwgMjAxMywgMjAxNCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwMi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC0yNCw2ICsyNCwxNiBAQAogI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAogI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICiAKKyNpbmNsdWRlICJiYXNlcGljLmgiCisKKworICAvKiBkZWNsYXJlIGFuIGV4dGVybiB0byBhY2Nlc3MgYGZ0X291dGxpbmVfZ2x5cGhfY2xhc3MnIGdsb2JhbGx5ICAgICAqLworICAvKiBhbGxvY2F0ZWQgIGluIGBmdGdseXBoLmMnLCBhbmQgdXNlIHRoZSBGVF9PVVRMSU5FX0dMWVBIX0NMQVNTX0dFVCAqLworICAvKiBtYWNybyB0byBhY2Nlc3MgaXQgd2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkICAgICAgICAgICAqLworI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQworICBGVF9DQUxMQkFDS19UQUJMRSBjb25zdCBGVF9HbHlwaF9DbGFzcyAgZnRfb3V0bGluZV9nbHlwaF9jbGFzczsKKyNlbmRpZgorCiAKICAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHN0cm9rZS5oICovCiAKQEAgLTM0Nyw3ICszNTcsNyBAQAogICBmdF9zdHJva2VfYm9yZGVyX2Nsb3NlKCBGVF9TdHJva2VCb3JkZXIgIGJvcmRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgICByZXZlcnNlICkKICAgewotICAgIEZUX1VJbnQgIHN0YXJ0ID0gYm9yZGVyLT5zdGFydDsKKyAgICBGVF9VSW50ICBzdGFydCA9IChGVF9VSW50KWJvcmRlci0+c3RhcnQ7CiAgICAgRlRfVUludCAgY291bnQgPSBib3JkZXItPm51bV9wb2ludHM7CiAKIApAQCAtNTk5LDcgKzYwOSw3IEBACiAgICAgaWYgKCBib3JkZXItPnN0YXJ0ID49IDAgKQogICAgICAgZnRfc3Ryb2tlX2JvcmRlcl9jbG9zZSggYm9yZGVyLCBGQUxTRSApOwogCi0gICAgYm9yZGVyLT5zdGFydCA9IGJvcmRlci0+bnVtX3BvaW50czsKKyAgICBib3JkZXItPnN0YXJ0ID0gKEZUX0ludClib3JkZXItPm51bV9wb2ludHM7CiAgICAgYm9yZGVyLT5tb3ZhYmxlID0gRkFMU0U7CiAKICAgICByZXR1cm4gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgdG8sIEZBTFNFICk7CkBAIC03NDIsNyArNzUyLDcgQEAKICAgICAgIH0KICAgICB9CiAKLSAgICBvdXRsaW5lLT5uX3BvaW50cyA9IChzaG9ydCkoIG91dGxpbmUtPm5fcG9pbnRzICsgYm9yZGVyLT5udW1fcG9pbnRzICk7CisgICAgb3V0bGluZS0+bl9wb2ludHMgKz0gKHNob3J0KWJvcmRlci0+bnVtX3BvaW50czsKIAogICAgIEZUX0FTU0VSVCggRlRfT3V0bGluZV9DaGVjayggb3V0bGluZSApID09IDAgKTsKICAgfQpAQCAtODM0LDggKzg0NCw4IEBACiAgICAgc3Ryb2tlci0+bWl0ZXJfbGltaXQgPSBtaXRlcl9saW1pdDsKIAogICAgIC8qIGVuc3VyZSBtaXRlciBsaW1pdCBoYXMgc2Vuc2libGUgdmFsdWUgKi8KLSAgICBpZiAoIHN0cm9rZXItPm1pdGVyX2xpbWl0IDwgMHgxMDAwMCApCi0gICAgICBzdHJva2VyLT5taXRlcl9saW1pdCA9IDB4MTAwMDA7CisgICAgaWYgKCBzdHJva2VyLT5taXRlcl9saW1pdCA8IDB4MTAwMDBMICkKKyAgICAgIHN0cm9rZXItPm1pdGVyX2xpbWl0ID0gMHgxMDAwMEw7CiAKICAgICAvKiBzYXZlIGxpbmUgam9pbiBzdHlsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAvKiBsaW5lIGpvaW4gc3R5bGUgY2FuIGJlIHRlbXBvcmFyaWx5IGNoYW5nZWQgd2hlbiBzdHJva2luZyBjdXJ2ZXMgKi8KQEAgLTk5OSw3ICsxMDA5LDkgQEAKIAogICAgIC8qIE9ubHkgaW50ZXJzZWN0IGJvcmRlcnMgaWYgYmV0d2VlbiB0d28gbGluZXRvJ3MgYW5kIGJvdGggKi8KICAgICAvKiBsaW5lcyBhcmUgbG9uZyBlbm91Z2ggKGxpbmVfbGVuZ3RoIGlzIHplcm8gZm9yIGN1cnZlcykuICovCi0gICAgaWYgKCAhYm9yZGVyLT5tb3ZhYmxlIHx8IGxpbmVfbGVuZ3RoID09IDAgKQorICAgIC8qIEFsc28gYXZvaWQgVS10dXJucyBvZiBuZWFybHkgMTgwIGRlZ3JlZS4gICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoICFib3JkZXItPm1vdmFibGUgfHwgbGluZV9sZW5ndGggPT0gMCAgfHwKKyAgICAgICAgIHRoZXRhID4gMHg1OUMwMDAgfHwgdGhldGEgPCAtMHg1OUMwMDAgKQogICAgICAgaW50ZXJzZWN0ID0gRkFMU0U7CiAgICAgZWxzZQogICAgIHsKQEAgLTEyMjAsMTEgKzEyMzIsOCBAQAogICAgICAgZ290byBFeGl0OwogCiAgICAgLyogd2hlbiB3ZSB0dXJuIHRvIHRoZSByaWdodCwgdGhlIGluc2lkZSBzaWRlIGlzIDAgKi8KLSAgICBpbnNpZGVfc2lkZSA9IDA7Ci0KICAgICAvKiBvdGhlcndpc2UsIHRoZSBpbnNpZGUgc2lkZSBpcyAxICovCi0gICAgaWYgKCB0dXJuIDwgMCApCi0gICAgICBpbnNpZGVfc2lkZSA9IDE7CisgICAgaW5zaWRlX3NpZGUgPSAoIHR1cm4gPCAwICk7CiAKICAgICAvKiBwcm9jZXNzIHRoZSBpbnNpZGUgc2lkZSAqLwogICAgIGVycm9yID0gZnRfc3Ryb2tlcl9pbnNpZGUoIHN0cm9rZXIsIGluc2lkZV9zaWRlLCBsaW5lX2xlbmd0aCApOwpAQCAtMTIzMiw3ICsxMjQxLDcgQEAKICAgICAgIGdvdG8gRXhpdDsKIAogICAgIC8qIHByb2Nlc3MgdGhlIG91dHNpZGUgc2lkZSAqLwotICAgIGVycm9yID0gZnRfc3Ryb2tlcl9vdXRzaWRlKCBzdHJva2VyLCAxIC0gaW5zaWRlX3NpZGUsIGxpbmVfbGVuZ3RoICk7CisgICAgZXJyb3IgPSBmdF9zdHJva2VyX291dHNpZGUoIHN0cm9rZXIsICFpbnNpZGVfc2lkZSwgbGluZV9sZW5ndGggKTsKIAogICBFeGl0OgogICAgIHJldHVybiBlcnJvcjsKQEAgLTE4MjIsNyArMTgzMSw3IEBACiAKICAgICBGVF9BU1NFUlQoIGxlZnQtPnN0YXJ0ID49IDAgKTsKIAotICAgIG5ld19wb2ludHMgPSBsZWZ0LT5udW1fcG9pbnRzIC0gbGVmdC0+c3RhcnQ7CisgICAgbmV3X3BvaW50cyA9IChGVF9JbnQpbGVmdC0+bnVtX3BvaW50cyAtIGxlZnQtPnN0YXJ0OwogICAgIGlmICggbmV3X3BvaW50cyA+IDAgKQogICAgIHsKICAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9ncm93KCByaWdodCwgKEZUX1VJbnQpbmV3X3BvaW50cyApOwpAQCAtMTg2Miw4ICsxODcxLDggQEAKICAgICAgICAgfQogICAgICAgfQogCi0gICAgICBsZWZ0LT5udW1fcG9pbnRzICAgPSBsZWZ0LT5zdGFydDsKLSAgICAgIHJpZ2h0LT5udW1fcG9pbnRzICs9IG5ld19wb2ludHM7CisgICAgICBsZWZ0LT5udW1fcG9pbnRzICAgPSAoRlRfVUludClsZWZ0LT5zdGFydDsKKyAgICAgIHJpZ2h0LT5udW1fcG9pbnRzICs9IChGVF9VSW50KW5ld19wb2ludHM7CiAKICAgICAgIHJpZ2h0LT5tb3ZhYmxlID0gRkFMU0U7CiAgICAgICBsZWZ0LT5tb3ZhYmxlICA9IEZBTFNFOwpAQCAtMTk0MSwxMSArMTk1MCw4IEBACiAgICAgICBpZiAoIHR1cm4gIT0gMCApCiAgICAgICB7CiAgICAgICAgIC8qIHdoZW4gd2UgdHVybiB0byB0aGUgcmlnaHQsIHRoZSBpbnNpZGUgc2lkZSBpcyAwICovCi0gICAgICAgIGluc2lkZV9zaWRlID0gMDsKLQogICAgICAgICAvKiBvdGhlcndpc2UsIHRoZSBpbnNpZGUgc2lkZSBpcyAxICovCi0gICAgICAgIGlmICggdHVybiA8IDAgKQotICAgICAgICAgIGluc2lkZV9zaWRlID0gMTsKKyAgICAgICAgaW5zaWRlX3NpZGUgPSAoIHR1cm4gPCAwICk7CiAKICAgICAgICAgZXJyb3IgPSBmdF9zdHJva2VyX2luc2lkZSggc3Ryb2tlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlX3NpZGUsCkBAIC0xOTU1LDcgKzE5NjEsNyBAQAogCiAgICAgICAgIC8qIHByb2Nlc3MgdGhlIG91dHNpZGUgc2lkZSAqLwogICAgICAgICBlcnJvciA9IGZ0X3N0cm9rZXJfb3V0c2lkZSggc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBpbnNpZGVfc2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpbnNpZGVfc2lkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZXItPnN1YnBhdGhfbGluZV9sZW5ndGggKTsKICAgICAgICAgaWYgKCBlcnJvciApCiAgICAgICAgICAgZ290byBFeGl0OwpAQCAtMjExOCw3ICsyMTI0LDcgQEAKICAgICAgIEZUX1VJbnQgIGxhc3Q7ICAvKiBpbmRleCBvZiBsYXN0IHBvaW50IGluIGNvbnRvdXIgKi8KIAogCi0gICAgICBsYXN0ICA9IG91dGxpbmUtPmNvbnRvdXJzW25dOworICAgICAgbGFzdCAgPSAoRlRfVUludClvdXRsaW5lLT5jb250b3Vyc1tuXTsKICAgICAgIGxpbWl0ID0gb3V0bGluZS0+cG9pbnRzICsgbGFzdDsKIAogICAgICAgLyogc2tpcCBlbXB0eSBwb2ludHM7IHdlIGRvbid0IHN0cm9rZSB0aGVzZSAqLwpAQCAtMjI4OSwxNSArMjI5NSw2IEBACiAgIH0KIAogCi0gIC8qIGRlY2xhcmUgYW4gZXh0ZXJuIHRvIGFjY2VzcyBgZnRfb3V0bGluZV9nbHlwaF9jbGFzcycgZ2xvYmFsbHkgICAgICovCi0gIC8qIGFsbG9jYXRlZCAgaW4gYGZ0Z2x5cGguYycsIGFuZCB1c2UgdGhlIEZUX09VVExJTkVfR0xZUEhfQ0xBU1NfR0VUICovCi0gIC8qIG1hY3JvIHRvIGFjY2VzcyBpdCB3aGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQgICAgICAgICAgICovCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0gIGV4dGVybiBjb25zdCBGVF9HbHlwaF9DbGFzcyAgZnRfb3V0bGluZV9nbHlwaF9jbGFzczsKLSNlbmRpZgotI2luY2x1ZGUgImJhc2VwaWMuaCIKLQotCiAgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzdHJva2UuaCAqLwogCiAgIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKQEAgLTIzNDcsNyArMjM0NCw5IEBACiAgICAgICBGVF9PdXRsaW5lX0RvbmUoIGdseXBoLT5saWJyYXJ5LCBvdXRsaW5lICk7CiAKICAgICAgIGVycm9yID0gRlRfT3V0bGluZV9OZXcoIGdseXBoLT5saWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BvaW50cywgbnVtX2NvbnRvdXJzLCBvdXRsaW5lICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0ludCludW1fY29udG91cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lICk7CiAgICAgICBpZiAoIGVycm9yICkKICAgICAgICAgZ290byBGYWlsOwogCkBAIC0yNDM3LDcgKzI0MzYsNyBAQAogCiAgICAgICBlcnJvciA9IEZUX091dGxpbmVfTmV3KCBnbHlwaC0+bGlicmFyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fY29udG91cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfSW50KW51bV9jb250b3VycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmUgKTsKICAgICAgIGlmICggZXJyb3IgKQogICAgICAgICBnb3RvIEZhaWw7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHN5bnRoLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHN5bnRoLmMKaW5kZXggMDU2N2JkNS4uY2Q2ODUzMyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRzeW50aC5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0c3ludGguYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBGcmVlVHlwZSBzeW50aGVzaXppbmcgY29kZSBmb3IgZW1ib2xkZW5pbmcgYW5kIHNsYW50aW5nIChib2R5KS4gICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDA2LCAyMDEwLCAyMDEyLTIwMTQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDAtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRzeXN0ZW0uYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0c3lzdGVtLmMKaW5kZXggMmM2ZGRhYy4uMTkzOGZkOCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRzeXN0ZW0uYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHN5c3RlbS5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEFOU0ktc3BlY2lmaWMgRnJlZVR5cGUgbG93LWxldmVsIHN5c3RlbSBpbnRlcmZhY2UgKGJvZHkpLiAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDIsIDIwMDYsIDIwMDgtMjAxMSwgMjAxMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC03MSw3ICs3MSw3IEBACiAgIHsKICAgICBGVF9VTlVTRUQoIG1lbW9yeSApOwogCi0gICAgcmV0dXJuIGZ0X3NtYWxsb2MoIHNpemUgKTsKKyAgICByZXR1cm4gZnRfc21hbGxvYyggKHNpemVfdClzaXplICk7CiAgIH0KIAogCkBAIC0xMDQsNyArMTA0LDcgQEAKICAgICBGVF9VTlVTRUQoIG1lbW9yeSApOwogICAgIEZUX1VOVVNFRCggY3VyX3NpemUgKTsKIAotICAgIHJldHVybiBmdF9zcmVhbGxvYyggYmxvY2ssIG5ld19zaXplICk7CisgICAgcmV0dXJuIGZ0X3NyZWFsbG9jKCBibG9jaywgKHNpemVfdCluZXdfc2l6ZSApOwogICB9CiAKIApAQCAtMTcxLDcgKzE3MSw3IEBACiAKICAgICBzdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlciA9IE5VTEw7CiAgICAgc3RyZWFtLT5zaXplICAgICAgICAgICAgICAgPSAwOwotICAgIHN0cmVhbS0+YmFzZSAgICAgICAgICAgICAgID0gMDsKKyAgICBzdHJlYW0tPmJhc2UgICAgICAgICAgICAgICA9IE5VTEw7CiAgIH0KIAogCkBAIC0yMTIsNyArMjEyLDcgQEAKICAgICBmaWxlID0gU1RSRUFNX0ZJTEUoIHN0cmVhbSApOwogCiAgICAgaWYgKCBzdHJlYW0tPnBvcyAhPSBvZmZzZXQgKQotICAgICAgZnRfZnNlZWsoIGZpbGUsIG9mZnNldCwgU0VFS19TRVQgKTsKKyAgICAgIGZ0X2ZzZWVrKCBmaWxlLCAobG9uZylvZmZzZXQsIFNFRUtfU0VUICk7CiAKICAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpZnRfZnJlYWQoIGJ1ZmZlciwgMSwgY291bnQsIGZpbGUgKTsKICAgfQpAQCAtMjMyLDcgKzIzMiw3IEBACiAKICAgICBzdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlciA9IE5VTEw7CiAgICAgc3RyZWFtLT5wYXRobmFtZS5wb2ludGVyICAgPSAoY2hhciopZmlsZXBhdGhuYW1lOwotICAgIHN0cmVhbS0+YmFzZSAgICAgICAgICAgICAgID0gMDsKKyAgICBzdHJlYW0tPmJhc2UgICAgICAgICAgICAgICA9IE5VTEw7CiAgICAgc3RyZWFtLT5wb3MgICAgICAgICAgICAgICAgPSAwOwogICAgIHN0cmVhbS0+cmVhZCAgICAgICAgICAgICAgID0gTlVMTDsKICAgICBzdHJlYW0tPmNsb3NlICAgICAgICAgICAgICA9IE5VTEw7CkBAIC0yNDcsNyArMjQ3LDcgQEAKICAgICB9CiAKICAgICBmdF9mc2VlayggZmlsZSwgMCwgU0VFS19FTkQgKTsKLSAgICBzdHJlYW0tPnNpemUgPSBmdF9mdGVsbCggZmlsZSApOworICAgIHN0cmVhbS0+c2l6ZSA9ICh1bnNpZ25lZCBsb25nKWZ0X2Z0ZWxsKCBmaWxlICk7CiAgICAgaWYgKCAhc3RyZWFtLT5zaXplICkKICAgICB7CiAgICAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fT3BlbjoiICkpOwpAQCAtMjkyLDcgKzI5Miw3IEBACiAgICAgbWVtb3J5ID0gKEZUX01lbW9yeSlmdF9zbWFsbG9jKCBzaXplb2YgKCAqbWVtb3J5ICkgKTsKICAgICBpZiAoIG1lbW9yeSApCiAgICAgewotICAgICAgbWVtb3J5LT51c2VyICAgID0gMDsKKyAgICAgIG1lbW9yeS0+dXNlciAgICA9IE5VTEw7CiAgICAgICBtZW1vcnktPmFsbG9jICAgPSBmdF9hbGxvYzsKICAgICAgIG1lbW9yeS0+cmVhbGxvYyA9IGZ0X3JlYWxsb2M7CiAgICAgICBtZW1vcnktPmZyZWUgICAgPSBmdF9mcmVlOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnR0cmlnb24uYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0dHJpZ29uLmMKaW5kZXggOWIyY2NkNS4uNWIyNDMwNCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnR0cmlnb24uYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHRyaWdvbi5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEZyZWVUeXBlIHRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMDUsIDIwMTItMjAxNCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwMS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC03Myw3ICs3Myw3IEBACiAgICAgLyogYW5kIENPUkRJQyBoeXBvdGVudXNlLCBzbyBpdCBtaW5pbWl6ZXMgdGhlIGVycm9yICAgICAgICovCiAgICAgdmFsID0gKEZUX0ZpeGVkKSggKCAoRlRfSW50NjQpdmFsICogRlRfVFJJR19TQ0FMRSArIDB4NDAwMDAwMDBVTCApID4+IDMyICk7CiAKLSAgICByZXR1cm4gKCBzID49IDAgKSA/IHZhbCA6IC12YWw7CisgICAgcmV0dXJuIHMgPCAwID8gLXZhbCA6IHZhbDsKICAgfQogCiAjZWxzZSAvKiAhRlRfTE9ORzY0ICovCkBAIC05Miw4ICs5Miw4IEBACiAgICAgICAgcyA9IC0xOwogICAgIH0KIAotICAgIGxvMSA9IHZhbCAmIDB4MDAwMEZGRkZVOwotICAgIGhpMSA9IHZhbCA+PiAxNjsKKyAgICBsbzEgPSAoRlRfVUludDMyKXZhbCAmIDB4MDAwMEZGRkZVOworICAgIGhpMSA9IChGVF9VSW50MzIpdmFsID4+IDE2OwogICAgIGxvMiA9IEZUX1RSSUdfU0NBTEUgJiAweDAwMDBGRkZGVTsKICAgICBoaTIgPSBGVF9UUklHX1NDQUxFID4+IDE2OwogCkBAIC0xMTcsMTIgKzExNywxMiBAQAogICAgIC8qIGFuZCBDT1JESUMgaHlwb3RlbnVzZSwgc28gaXQgbWluaW1pemVzIHRoZSBlcnJvciAgICAgICAqLwogCiAgICAgLyogQ2hlY2sgY2Fycnkgb3ZlcmZsb3cgb2YgbG8gKyAweDQwMDAwMDAwICovCi0gICAgbG8gKz0gMHg0MDAwMDAwMFU7Ci0gICAgaGkgKz0gKCBsbyA8IDB4NDAwMDAwMDBVICk7CisgICAgbG8gKz0gMHg0MDAwMDAwMFVMOworICAgIGhpICs9ICggbG8gPCAweDQwMDAwMDAwVUwgKTsKIAotICAgIHZhbCAgPSAoRlRfRml4ZWQpaGk7CisgICAgdmFsID0gKEZUX0ZpeGVkKWhpOwogCi0gICAgcmV0dXJuICggcyA+PSAwICkgPyB2YWwgOiAtdmFsOworICAgIHJldHVybiBzIDwgMCA/IC12YWwgOiB2YWw7CiAgIH0KIAogI2VuZGlmIC8qICFGVF9MT05HNjQgKi8KQEAgLTEzOSw3ICsxMzksNyBAQAogICAgIHggPSB2ZWMtPng7CiAgICAgeSA9IHZlYy0+eTsKIAotICAgIHNoaWZ0ID0gRlRfTVNCKCBGVF9BQlMoIHggKSB8IEZUX0FCUyggeSApICk7CisgICAgc2hpZnQgPSBGVF9NU0IoIChGVF9VSW50MzIpKCBGVF9BQlMoIHggKSB8IEZUX0FCUyggeSApICkgKTsKIAogICAgIGlmICggc2hpZnQgPD0gRlRfVFJJR19TQUZFX01TQiApCiAgICAgewpAQCAtMjk5LDExICsyOTksOSBAQAogICAgIEZUX1ZlY3RvciAgdjsKIAogCi0gICAgdi54ID0gRlRfVFJJR19TQ0FMRSA+PiA4OwotICAgIHYueSA9IDA7Ci0gICAgZnRfdHJpZ19wc2V1ZG9fcm90YXRlKCAmdiwgYW5nbGUgKTsKKyAgICBGVF9WZWN0b3JfVW5pdCggJnYsIGFuZ2xlICk7CiAKLSAgICByZXR1cm4gKCB2LnggKyAweDgwTCApID4+IDg7CisgICAgcmV0dXJuIHYueDsKICAgfQogCiAKQEAgLTMxMiw3ICszMTAsMTIgQEAKICAgRlRfRVhQT1JUX0RFRiggRlRfRml4ZWQgKQogICBGVF9TaW4oIEZUX0FuZ2xlICBhbmdsZSApCiAgIHsKLSAgICByZXR1cm4gRlRfQ29zKCBGVF9BTkdMRV9QSTIgLSBhbmdsZSApOworICAgIEZUX1ZlY3RvciAgdjsKKworCisgICAgRlRfVmVjdG9yX1VuaXQoICZ2LCBhbmdsZSApOworCisgICAgcmV0dXJuIHYueTsKICAgfQogCiAKQEAgLTMyNCw5ICszMjcsNyBAQAogICAgIEZUX1ZlY3RvciAgdjsKIAogCi0gICAgdi54ID0gRlRfVFJJR19TQ0FMRSA+PiA4OwotICAgIHYueSA9IDA7Ci0gICAgZnRfdHJpZ19wc2V1ZG9fcm90YXRlKCAmdiwgYW5nbGUgKTsKKyAgICBGVF9WZWN0b3JfVW5pdCggJnYsIGFuZ2xlICk7CiAKICAgICByZXR1cm4gRlRfRGl2Rml4KCB2LnksIHYueCApOwogICB9CkBAIC0zODgsMzMgKzM4OSwzMiBAQAogICAgIEZUX1ZlY3RvciAgdjsKIAogCi0gICAgaWYgKCAhdmVjICkKKyAgICBpZiAoICF2ZWMgfHwgIWFuZ2xlICkKICAgICAgIHJldHVybjsKIAotICAgIHYueCAgID0gdmVjLT54OwotICAgIHYueSAgID0gdmVjLT55OworICAgIHYgPSAqdmVjOwogCi0gICAgaWYgKCBhbmdsZSAmJiAoIHYueCAhPSAwIHx8IHYueSAhPSAwICkgKQorICAgIGlmICggdi54ID09IDAgJiYgdi55ID09IDAgKQorICAgICAgcmV0dXJuOworCisgICAgc2hpZnQgPSBmdF90cmlnX3ByZW5vcm0oICZ2ICk7CisgICAgZnRfdHJpZ19wc2V1ZG9fcm90YXRlKCAmdiwgYW5nbGUgKTsKKyAgICB2LnggPSBmdF90cmlnX2Rvd25zY2FsZSggdi54ICk7CisgICAgdi55ID0gZnRfdHJpZ19kb3duc2NhbGUoIHYueSApOworCisgICAgaWYgKCBzaGlmdCA+IDAgKQogICAgIHsKLSAgICAgIHNoaWZ0ID0gZnRfdHJpZ19wcmVub3JtKCAmdiApOwotICAgICAgZnRfdHJpZ19wc2V1ZG9fcm90YXRlKCAmdiwgYW5nbGUgKTsKLSAgICAgIHYueCA9IGZ0X3RyaWdfZG93bnNjYWxlKCB2LnggKTsKLSAgICAgIHYueSA9IGZ0X3RyaWdfZG93bnNjYWxlKCB2LnkgKTsKLQotICAgICAgaWYgKCBzaGlmdCA+IDAgKQotICAgICAgewotICAgICAgICBGVF9JbnQzMiAgaGFsZiA9IChGVF9JbnQzMikxTCA8PCAoIHNoaWZ0IC0gMSApOworICAgICAgRlRfSW50MzIgIGhhbGYgPSAoRlRfSW50MzIpMUwgPDwgKCBzaGlmdCAtIDEgKTsKIAogCi0gICAgICAgIHZlYy0+eCA9ICggdi54ICsgaGFsZiArIEZUX1NJR05fTE9ORyggdi54ICkgKSA+PiBzaGlmdDsKLSAgICAgICAgdmVjLT55ID0gKCB2LnkgKyBoYWxmICsgRlRfU0lHTl9MT05HKCB2LnkgKSApID4+IHNoaWZ0OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzaGlmdCAgPSAtc2hpZnQ7Ci0gICAgICAgIHZlYy0+eCA9IChGVF9Qb3MpKCAoRlRfVUxvbmcpdi54IDw8IHNoaWZ0ICk7Ci0gICAgICAgIHZlYy0+eSA9IChGVF9Qb3MpKCAoRlRfVUxvbmcpdi55IDw8IHNoaWZ0ICk7Ci0gICAgICB9CisgICAgICB2ZWMtPnggPSAoIHYueCArIGhhbGYgKyBGVF9TSUdOX0xPTkcoIHYueCApICkgPj4gc2hpZnQ7CisgICAgICB2ZWMtPnkgPSAoIHYueSArIGhhbGYgKyBGVF9TSUdOX0xPTkcoIHYueSApICkgPj4gc2hpZnQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzaGlmdCAgPSAtc2hpZnQ7CisgICAgICB2ZWMtPnggPSAoRlRfUG9zKSggKEZUX1VMb25nKXYueCA8PCBzaGlmdCApOworICAgICAgdmVjLT55ID0gKEZUX1BvcykoIChGVF9VTG9uZyl2LnkgPDwgc2hpZnQgKTsKICAgICB9CiAgIH0KIApAQCAtNDUwLDcgKzQ1MCw3IEBACiAgICAgdi54ID0gZnRfdHJpZ19kb3duc2NhbGUoIHYueCApOwogCiAgICAgaWYgKCBzaGlmdCA+IDAgKQotICAgICAgcmV0dXJuICggdi54ICsgKCAxIDw8ICggc2hpZnQgLSAxICkgKSApID4+IHNoaWZ0OworICAgICAgcmV0dXJuICggdi54ICsgKCAxTCA8PCAoIHNoaWZ0IC0gMSApICkgKSA+PiBzaGlmdDsKIAogICAgIHJldHVybiAoRlRfRml4ZWQpKCAoRlRfVUludDMyKXYueCA8PCAtc2hpZnQgKTsKICAgfQpAQCAtNDgwLDggKzQ4MCw4IEBACiAKICAgICB2LnggPSBmdF90cmlnX2Rvd25zY2FsZSggdi54ICk7CiAKLSAgICAqbGVuZ3RoID0gKCBzaGlmdCA+PSAwICkgPyAgICAgICAgICAgICAgICAgICAgICAoIHYueCA+PiAgc2hpZnQgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChGVF9GaXhlZCkoIChGVF9VSW50MzIpdi54IDw8IC1zaGlmdCApOworICAgICpsZW5ndGggPSBzaGlmdCA+PSAwID8gICAgICAgICAgICAgICAgICAgICAgKCB2LnggPj4gIHNoaWZ0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICA6IChGVF9GaXhlZCkoIChGVF9VSW50MzIpdi54IDw8IC1zaGlmdCApOwogICAgICphbmdsZSAgPSB2Lnk7CiAgIH0KIApAQCAtNTEyLDExICs1MTIsMTAgQEAKICAgICBGVF9BbmdsZSAgZGVsdGEgPSBhbmdsZTIgLSBhbmdsZTE7CiAKIAotICAgIGRlbHRhICU9IEZUX0FOR0xFXzJQSTsKLSAgICBpZiAoIGRlbHRhIDwgMCApCisgICAgd2hpbGUgKCBkZWx0YSA8PSAtRlRfQU5HTEVfUEkgKQogICAgICAgZGVsdGEgKz0gRlRfQU5HTEVfMlBJOwogCi0gICAgaWYgKCBkZWx0YSA+IEZUX0FOR0xFX1BJICkKKyAgICB3aGlsZSAoIGRlbHRhID4gRlRfQU5HTEVfUEkgKQogICAgICAgZGVsdGEgLT0gRlRfQU5HTEVfMlBJOwogCiAgICAgcmV0dXJuIGRlbHRhOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnR0eXBlMS5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnR0eXBlMS5jCmluZGV4IDQ3YWYxOWEuLmM1NDkzODIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0dHlwZTEuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHR5cGUxLmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgRnJlZVR5cGUgdXRpbGl0eSBmaWxlIGZvciBQUyBuYW1lcyBzdXBwb3J0IChib2R5KS4gICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAwNCwgMjAxMSwgMjAxNCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAyLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0dXRpbC5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnR1dGlsLmMKaW5kZXggNTZlMjgwMC4uZjViNzJkYiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnR1dGlsLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnR1dGlsLmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgRnJlZVR5cGUgdXRpbGl0eSBmaWxlIGZvciBtZW1vcnkgYW5kIGxpc3QgbWFuYWdlbWVudCAoYm9keSkuICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDIsIDIwMDQtMjAwNywgMjAxMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAyLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KQEAgLTE4MCw3ICsxODAsNyBAQAogICAgICAgICAgICAgICBGVF9FcnJvciAgICAqcF9lcnJvciApCiAgIHsKICAgICBGVF9FcnJvciAgICBlcnJvcjsKLSAgICBGVF9Qb2ludGVyICBwID0gZnRfbWVtX3FhbGxvYyggbWVtb3J5LCBzaXplLCAmZXJyb3IgKTsKKyAgICBGVF9Qb2ludGVyICBwID0gZnRfbWVtX3FhbGxvYyggbWVtb3J5LCAoRlRfTG9uZylzaXplLCAmZXJyb3IgKTsKIAogCiAgICAgaWYgKCAhZXJyb3IgJiYgYWRkcmVzcyApCkBAIC0yNzUsNyArMjc1LDcgQEAKIAogICAgIGJlZm9yZSA9IGxpc3QtPnRhaWw7CiAKLSAgICBub2RlLT5uZXh0ID0gMDsKKyAgICBub2RlLT5uZXh0ID0gTlVMTDsKICAgICBub2RlLT5wcmV2ID0gYmVmb3JlOwogCiAgICAgaWYgKCBiZWZvcmUgKQpAQCAtMzAyLDcgKzMwMiw3IEBACiAgICAgYWZ0ZXIgPSBsaXN0LT5oZWFkOwogCiAgICAgbm9kZS0+bmV4dCA9IGFmdGVyOwotICAgIG5vZGUtPnByZXYgPSAwOworICAgIG5vZGUtPnByZXYgPSBOVUxMOwogCiAgICAgaWYgKCAhYWZ0ZXIgKQogICAgICAgbGlzdC0+dGFpbCA9IG5vZGU7CkBAIC0zNjYsNyArMzY2LDcgQEAKICAgICBlbHNlCiAgICAgICBsaXN0LT50YWlsID0gYmVmb3JlOwogCi0gICAgbm9kZS0+cHJldiAgICAgICA9IDA7CisgICAgbm9kZS0+cHJldiAgICAgICA9IE5VTEw7CiAgICAgbm9kZS0+bmV4dCAgICAgICA9IGxpc3QtPmhlYWQ7CiAgICAgbGlzdC0+aGVhZC0+cHJldiA9IG5vZGU7CiAgICAgbGlzdC0+aGVhZCAgICAgICA9IG5vZGU7CkBAIC00MzMsOCArNDMzLDggQEAKICAgICAgIGN1ciA9IG5leHQ7CiAgICAgfQogCi0gICAgbGlzdC0+aGVhZCA9IDA7Ci0gICAgbGlzdC0+dGFpbCA9IDA7CisgICAgbGlzdC0+aGVhZCA9IE5VTEw7CisgICAgbGlzdC0+dGFpbCA9IE5VTEw7CiAgIH0KIAogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHdpbmZudC5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnR3aW5mbnQuYwppbmRleCA4ZTMzN2ZiLi43NmExOWFmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHdpbmZudC5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0d2luZm50LmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgRnJlZVR5cGUgQVBJIGZvciBhY2Nlc3NpbmcgV2luZG93cyBGTlQgc3BlY2lmaWMgaW5mbyAoYm9keSkuICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMsIDIwMDQsIDIwMTQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAzLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0eGY4Ni5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnR4Zjg2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YmY3NjcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnR4Zjg2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHhmODYuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgdXRpbGl0eSBmaWxlIGZvciBYMTEgc3VwcG9ydCAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDIsIDIwMDMsIDIwMDQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfWEZSRUU4Nl9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfWEZSRUU4Nl9OQU1FX0gKLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnR4Zjg2LmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBjb25zdCBjaGFyKiApCi0gIEZUX0dldF9YMTFfRm9udF9Gb3JtYXQoIEZUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgY29uc3QgY2hhciogIHJlc3VsdCA9IE5VTEw7Ci0KLQotICAgIGlmICggZmFjZSApCi0gICAgICBGVF9GQUNFX0ZJTkRfU0VSVklDRSggZmFjZSwgcmVzdWx0LCBYRjg2X05BTUUgKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvSmFtZmlsZSBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvSmFtZmlsZQppbmRleCA2NzA1ZDNjLi5kZWVjMDc5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL0phbWZpbGUKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9KYW1maWxlCkBAIC0xLDYgKzEsNiBAQAogIyBGcmVlVHlwZSAyIHNyYy9jZmYgSmFtZmlsZQogIwotIyBDb3B5cmlnaHQgMjAwMSwgMjAwMiBieQorIyBDb3B5cmlnaHQgMjAwMS0yMDE1IGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKQEAgLTE2LDcgKzE2LDIzIEBACiAKICAgaWYgJChGVDJfTVVMVEkpCiAgIHsKLSAgICBfc291cmNlcyA9IGNmZmRyaXZyIGNmZmdsb2FkIGNmZmxvYWQgY2Zmb2JqcyBjZmZwYXJzZSBjZmZjbWFwIGNmZnBpYyA7CisgICAgX3NvdXJjZXMgPSBjZmZjbWFwCisgICAgICAgICAgICAgICBjZmZkcml2cgorICAgICAgICAgICAgICAgY2ZmZ2xvYWQKKyAgICAgICAgICAgICAgIGNmZmxvYWQKKyAgICAgICAgICAgICAgIGNmZm9ianMKKyAgICAgICAgICAgICAgIGNmZnBhcnNlCisgICAgICAgICAgICAgICBjZmZwaWMKKyAgICAgICAgICAgICAgIGNmMmFycnN0CisgICAgICAgICAgICAgICBjZjJibHVlcworICAgICAgICAgICAgICAgY2YyZXJyb3IKKyAgICAgICAgICAgICAgIGNmMmZvbnQKKyAgICAgICAgICAgICAgIGNmMmZ0CisgICAgICAgICAgICAgICBjZjJoaW50cworICAgICAgICAgICAgICAgY2YyaW50cnAKKyAgICAgICAgICAgICAgIGNmMnJlYWQKKyAgICAgICAgICAgICAgIGNmMnN0YWNrCisgICAgICAgICAgICAgICA7CiAgIH0KICAgZWxzZQogICB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMmFycnN0LmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMmFycnN0LmMKaW5kZXggYzhkNmYxMy4uODlmM2U5ZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJhcnJzdC5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyYXJyc3QuYwpAQCAtMTAxLDEwICsxMDEsMTAgQEAKICAgICAgIEZUX0Vycm9yICAgZXJyb3IgID0gRlRfRXJyX09rOyAgICAgICAgLyogZm9yIEZUX1JFQUxMT0MgKi8KICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gYXJyc3RhY2stPm1lbW9yeTsgLyogZm9yIEZUX1JFQUxMT0MgKi8KIAotICAgICAgRlRfTG9uZyAgbmV3U2l6ZSA9IChGVF9Mb25nKSggbnVtRWxlbWVudHMgKiBhcnJzdGFjay0+c2l6ZUl0ZW0gKTsKKyAgICAgIHNpemVfdCAgbmV3U2l6ZSA9IG51bUVsZW1lbnRzICogYXJyc3RhY2stPnNpemVJdGVtOwogCiAKLSAgICAgIGlmICggbnVtRWxlbWVudHMgPiBMT05HX01BWCAvIGFycnN0YWNrLT5zaXplSXRlbSApCisgICAgICBpZiAoIG51bUVsZW1lbnRzID4gRlRfTE9OR19NQVggLyBhcnJzdGFjay0+c2l6ZUl0ZW0gKQogICAgICAgICBnb3RvIGV4aXQ7CiAKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJmaXhlZC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJmaXhlZC5oCmluZGV4IGVkMTQ1MmEuLmQ2ZDlmYWYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyZml4ZWQuaAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMmZpeGVkLmgKQEAgLTU3LDIyICs1NywyMiBAQAogICAvKiBpbiBDIDg5LCBsZWZ0IGFuZCByaWdodCBzaGlmdCBvZiBuZWdhdGl2ZSBudW1iZXJzIGlzICAqLwogICAvKiBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBiZWhhdmlvdXIgaW4gdGhlIGdlbmVyYWwgY2FzZSAqLwogCi0jZGVmaW5lIGNmMl9pbnRUb0ZpeGVkKCBpICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIGNmMl9pbnRUb0ZpeGVkKCBpICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICggKENGMl9GaXhlZCkoIChGVF9VSW50MzIpKGkpIDw8IDE2ICkgKQotI2RlZmluZSBjZjJfZml4ZWRUb0ludCggeCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBjZjJfZml4ZWRUb0ludCggeCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAoIChGVF9TaG9ydCkoICggKEZUX1VJbnQzMikoeCkgKyAweDgwMDBVICkgPj4gMTYgKSApCi0jZGVmaW5lIGNmMl9maXhlZFJvdW5kKCB4ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAoQ0YyX0ZpeGVkKSggKCAoeCkgKyAweDgwMDAgKSAmIDB4RkZGRjAwMDBMICkgKQotI2RlZmluZSBjZjJfZmxvYXRUb0ZpeGVkKCBmICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBjZjJfZml4ZWRSb3VuZCggeCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoIChDRjJfRml4ZWQpKCAoIChGVF9VSW50MzIpKHgpICsgMHg4MDAwVSApICYgMHhGRkZGMDAwMFVMICkgKQorI2RlZmluZSBjZjJfZmxvYXRUb0ZpeGVkKCBmICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAoIChDRjJfRml4ZWQpKCAoZikgKiA2NTUzNi4wICsgMC41ICkgKQotI2RlZmluZSBjZjJfZml4ZWRBYnMoIHggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBjZjJfZml4ZWRBYnMoIHggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAoICh4KSA8IDAgPyAtKHgpIDogKHgpICkKLSNkZWZpbmUgY2YyX2ZpeGVkRmxvb3IoIHggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIChDRjJfRml4ZWQpKCAoeCkgJiAweEZGRkYwMDAwTCApICkKLSNkZWZpbmUgY2YyX2ZpeGVkRnJhY3Rpb24oIHggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgY2YyX2ZpeGVkRmxvb3IoIHggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKCAoQ0YyX0ZpeGVkKSggKEZUX1VJbnQzMikoeCkgJiAweEZGRkYwMDAwVUwgKSApCisjZGVmaW5lIGNmMl9maXhlZEZyYWN0aW9uKCB4ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICggKHgpIC0gY2YyX2ZpeGVkRmxvb3IoIHggKSApCi0jZGVmaW5lIGNmMl9mcmFjVG9GaXhlZCggeCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAoeCkgPCAwID8gLSggKCAtKHgpICsgMHgyMDAwICkgPj4gMTQgKSAgICAgICAgICAgICBcCisjZGVmaW5lIGNmMl9mcmFjVG9GaXhlZCggeCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICggKHgpIDwgMCA/IC0oICggLSh4KSArIDB4MjAwMCApID4+IDE0ICkgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgOiAgKCAoICAoeCkgKyAweDIwMDAgKSA+PiAxNCApICkKIAogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMmZvbnQuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyZm9udC5jCmluZGV4IGE0NmI3NDguLjgzZmQzNDggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyZm9udC5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyZm9udC5jCkBAIC0xNTAsOCArMTUwLDggQEAKICAgICAgIC8qIGxvZ2FyaXRobXM7IHJlbWVtYmVyaW5nIHRoYXQgdGhlIDE2IGxvd2VzdCBiaXRzIG9mIHRoZSBmcmFjdGlvbiAqLwogICAgICAgLyogYXJlIGRyb3BwZWQgdGhpcyBpcyBjb3JyZWN0IHRvIHdpdGhpbiBhIGZhY3RvciBvZiBhbG1vc3QgNC4gICAgICovCiAgICAgICAvKiBGb3IgZXhhbXBsZSwgMHg4MC4wMDAwICogMHg4MC4wMDAwID0gMHg0MDAwLjAwMDAgaXMgMjMrMjMgYW5kICAgKi8KLSAgICAgIC8qIGlzIGZsYWdnZWQgYXMgcG9zc2libGUgb3ZlcmZsb3cgYmVjYXVzZSAweGZmLmZmZmYgKiAweGZmLmZmZmYgPSAqLwotICAgICAgLyogMHhmZmZmLmZlMDAgaXMgYWxzbyAyMysyMy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiBpcyBmbGFnZ2VkIGFzIHBvc3NpYmxlIG92ZXJmbG93IGJlY2F1c2UgMHhGRi5GRkZGICogMHhGRi5GRkZGID0gKi8KKyAgICAgIC8qIDB4RkZGRi5GRTAwIGlzIGFsc28gMjMrMjMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCiAgICAgICBsb2dCYXNlMiA9IEZUX01TQiggKEZUX1VJbnQzMilzdGVtV2lkdGhQZXIxMDAwICkgKwogICAgICAgICAgICAgICAgICAgIEZUX01TQiggKEZUX1VJbnQzMilwcGVtICk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMmZvbnQuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyZm9udC5oCmluZGV4IGQ4ODYwY2UuLjg2Y2YwMmYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyZm9udC5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyZm9udC5oCkBAIC00OCw3ICs0OCwxMiBAQAogCiAKICNkZWZpbmUgQ0YyX09QRVJBTkRfU1RBQ0tfU0laRSAgNDgKLSNkZWZpbmUgQ0YyX01BWF9TVUJSICAgICAgICAgICAgMTAgLyogbWF4aW11bSBzdWJyb3V0aW5lIG5lc3RpbmcgKi8KKyNkZWZpbmUgQ0YyX01BWF9TVUJSICAgICAgICAgICAgMTYgLyogbWF4aW11bSBzdWJyb3V0aW5lIG5lc3Rpbmc7ICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb25seSAxMCBhcmUgYWxsb3dlZCBidXQgdGhlcmUgZXhpc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9udHMgbGlrZSBgSGlyYUtha3VQcm9OLVczLnR0ZicgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKEhpcmFnaW5vIEtha3UgR290aGljIFByb04gVzM7ICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOC4yZDZlMTsgMjAxNC0xMi0xOSkgdGhhdCBleGNlZWQgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBsaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogCiAgIC8qIHR5cGVkZWYgaXMgaW4gYGNmMmdsdWUuaCcgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyZnQuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyZnQuYwppbmRleCBlYmJhNDY5Li5kMjU0NGEyIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMmZ0LmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJmdC5jCkBAIC01NTEsNyArNTUxLDcgQEAKIAogICAgIEZUX1pFUk8oIGJ1ZiApOwogCi0gICAgaWR4ICs9IGRlY29kZXItPmdsb2JhbHNfYmlhczsKKyAgICBpZHggKz0gKENGMl9VSW50KWRlY29kZXItPmdsb2JhbHNfYmlhczsKICAgICBpZiAoIGlkeCA+PSBkZWNvZGVyLT5udW1fZ2xvYmFscyApCiAgICAgICByZXR1cm4gVFJVRTsgICAgIC8qIGVycm9yICovCiAKQEAgLTU2OSw3ICs1NjksNyBAQAogICAvKiB1c2VkIGZvciBzZWFjIGNvbXBvbmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQogICBjZjJfZ2V0U2VhY0NvbXBvbmVudCggQ0ZGX0RlY29kZXIqICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX1VJbnQgICAgICBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ludCAgICAgICBjb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0J1ZmZlciAgICBidWYgKQogICB7CiAgICAgQ0YyX0ludCAgIGdpZDsKQEAgLTU4MiwxMiArNTgyLDIxIEBACiAKICAgICBGVF9aRVJPKCBidWYgKTsKIAotICAgIGdpZCA9IGNmZl9sb29rdXBfZ2x5cGhfYnlfc3RkY2hhcmNvZGUoIGRlY29kZXItPmNmZiwgY29kZSApOwotICAgIGlmICggZ2lkIDwgMCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfR2x5cGhfRm9ybWF0ICk7CisjaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAorICAgIC8qIEluY3JlbWVudGFsIGZvbnRzIGRvbid0IG5lY2Vzc2FyaWx5IGhhdmUgdmFsaWQgY2hhcnNldHMuICAgICAgICAqLworICAgIC8qIFRoZXkgdXNlIHRoZSBjaGFyYWN0ZXIgY29kZSwgbm90IHRoZSBnbHlwaCBpbmRleCwgaW4gdGhpcyBjYXNlLiAqLworICAgIGlmICggZGVjb2Rlci0+YnVpbGRlci5mYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UgKQorICAgICAgZ2lkID0gY29kZTsKKyAgICBlbHNlCisjZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTCAqLworICAgIHsKKyAgICAgIGdpZCA9IGNmZl9sb29rdXBfZ2x5cGhfYnlfc3RkY2hhcmNvZGUoIGRlY29kZXItPmNmZiwgY29kZSApOworICAgICAgaWYgKCBnaWQgPCAwICkKKyAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0dseXBoX0Zvcm1hdCApOworICAgIH0KIAogICAgIGVycm9yID0gY2ZmX2dldF9nbHlwaF9kYXRhKCBkZWNvZGVyLT5idWlsZGVyLmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGMl9VSW50KWdpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYXJzdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4gKTsKICAgICAvKiBUT0RPOiBmb3Igbm93LCBqdXN0IHBhc3MgdGhlIEZyZWVUeXBlIGVycm9yIHRocm91Z2ggKi8KQEAgLTYyNiw3ICs2MzUsNyBAQAogCiAgICAgRlRfWkVSTyggYnVmICk7CiAKLSAgICBpZHggKz0gZGVjb2Rlci0+bG9jYWxzX2JpYXM7CisgICAgaWR4ICs9IChDRjJfVUludClkZWNvZGVyLT5sb2NhbHNfYmlhczsKICAgICBpZiAoIGlkeCA+PSBkZWNvZGVyLT5udW1fbG9jYWxzICkKICAgICAgIHJldHVybiBUUlVFOyAgICAgLyogZXJyb3IgKi8KIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJmdC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJmdC5oCmluZGV4IDczMWRhM2MuLjMwNzNkZjMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyZnQuaAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMmZ0LmgKQEAgLTEwMyw3ICsxMDMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0J1ZmZlciAgICBidWYgKTsKICAgRlRfTE9DQUwoIEZUX0Vycm9yICkKICAgY2YyX2dldFNlYWNDb21wb25lbnQoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGMl9VSW50ICAgICAgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENGMl9JbnQgICAgICAgY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9CdWZmZXIgICAgYnVmICk7CiAgIEZUX0xPQ0FMKCB2b2lkICkKICAgY2YyX2ZyZWVTZWFjQ29tcG9uZW50KCBDRkZfRGVjb2RlciogIGRlY29kZXIsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMmhpbnRzLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMmhpbnRzLmMKaW5kZXggMDQwZDE5My4uMGUyNzAwMCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJoaW50cy5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyaGludHMuYwpAQCAtNjk3LDEwICs2OTcsMTAgQEAKIAogICAgIC8qIG1ha2Ugcm9vbSB0byBpbnNlcnQgKi8KICAgICB7Ci0gICAgICBDRjJfSW50ICBpU3JjID0gaGludG1hcC0+Y291bnQgLSAxOwotICAgICAgQ0YyX0ludCAgaURzdCA9IGlzUGFpciA/IGhpbnRtYXAtPmNvdW50ICsgMSA6IGhpbnRtYXAtPmNvdW50OworICAgICAgQ0YyX1VJbnQgIGlTcmMgPSBoaW50bWFwLT5jb3VudCAtIDE7CisgICAgICBDRjJfVUludCAgaURzdCA9IGlzUGFpciA/IGhpbnRtYXAtPmNvdW50ICsgMSA6IGhpbnRtYXAtPmNvdW50OwogCi0gICAgICBDRjJfSW50ICBjb3VudCA9IGhpbnRtYXAtPmNvdW50IC0gaW5kZXhJbnNlcnQ7CisgICAgICBDRjJfVUludCAgY291bnQgPSBoaW50bWFwLT5jb3VudCAtIGluZGV4SW5zZXJ0OwogCiAKICAgICAgIGlmICggaURzdCA+PSBDRjJfTUFYX0hJTlRfRURHRVMgKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJpbnRycC5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJpbnRycC5jCmluZGV4IGEyNjk2MDYuLmZmM2ZhOWEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyaW50cnAuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMmludHJwLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlICJjZjJmb250LmgiCiAjaW5jbHVkZSAiY2Yyc3RhY2suaCIKICNpbmNsdWRlICJjZjJoaW50cy5oIgorI2luY2x1ZGUgImNmMmludHJwLmgiCiAKICNpbmNsdWRlICJjZjJlcnJvci5oIgogCkBAIC03NjAsMTYgKzc2MSwxOSBAQAogCiAgICAgICAgICAgLyogcHVzaCBvdXIgY3VycmVudCBDRkYgY2hhcnN0cmluZyByZWdpb24gb24gc3ViclN0YWNrICovCiAgICAgICAgICAgY2hhcnN0cmluZyA9IChDRjJfQnVmZmVyKQotICAgICAgICAgICAgICAgICAgICAgICAgIGNmMl9hcnJzdGFja19nZXRQb2ludGVyKCAmc3ViclN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc3RyaW5nSW5kZXggKyAxICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgY2YyX2FycnN0YWNrX2dldFBvaW50ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ViclN0YWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCljaGFyc3RyaW5nSW5kZXggKyAxICk7CiAKICAgICAgICAgICAvKiBzZXQgdXAgdGhlIG5ldyBDRkYgcmVnaW9uIGFuZCBwb2ludGVyICovCi0gICAgICAgICAgc3VickluZGV4ID0gY2YyX3N0YWNrX3BvcEludCggb3BTdGFjayApOworICAgICAgICAgIHN1YnJJbmRleCA9IChDRjJfVUludCljZjJfc3RhY2tfcG9wSW50KCBvcFN0YWNrICk7CiAKICAgICAgICAgICBzd2l0Y2ggKCBvcDEgKQogICAgICAgICAgIHsKICAgICAgICAgICBjYXNlIGNmMl9jbWRDQUxMR1NVQlI6Ci0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiKCVkKVxuIiwgc3VickluZGV4ICsgZGVjb2Rlci0+Z2xvYmFsc19iaWFzICkpOworICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiAoaWR4ICVkLCBlbnRlcmluZyBsZXZlbCAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdWJySW5kZXggKyAoQ0YyX1VJbnQpZGVjb2Rlci0+Z2xvYmFsc19iaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnN0cmluZ0luZGV4ICsgMSApKTsKIAogICAgICAgICAgICAgaWYgKCBjZjJfaW5pdEdsb2JhbFJlZ2lvbkJ1ZmZlciggZGVjb2RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJJbmRleCwKQEAgLTc4Miw3ICs3ODYsOSBAQAogCiAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIC8qIGNmMl9jbWRDQUxMU1VCUiAqLwotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiglZClcbiIsIHN1YnJJbmRleCArIGRlY29kZXItPmxvY2Fsc19iaWFzICkpOworICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiAoaWR4ICVkLCBlbnRlcmluZyBsZXZlbCAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdWJySW5kZXggKyAoQ0YyX1VJbnQpZGVjb2Rlci0+bG9jYWxzX2JpYXMsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc3RyaW5nSW5kZXggKyAxICkpOwogCiAgICAgICAgICAgICBpZiAoIGNmMl9pbml0TG9jYWxSZWdpb25CdWZmZXIoIGRlY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJJbmRleCwKQEAgLTc5OCw3ICs4MDQsNyBAQAogICAgICAgICBjb250aW51ZTsgLyogZG8gbm90IGNsZWFyIHRoZSBzdGFjayAqLwogCiAgICAgICBjYXNlIGNmMl9jbWRSRVRVUk46Ci0gICAgICAgIEZUX1RSQUNFNCgoICIgcmV0dXJuXG4iICkpOworICAgICAgICBGVF9UUkFDRTQoKCAiIHJldHVybiAobGVhdmluZyBsZXZlbCAlZClcbiIsIGNoYXJzdHJpbmdJbmRleCApKTsKIAogICAgICAgICBpZiAoIGNoYXJzdHJpbmdJbmRleCA8IDEgKQogICAgICAgICB7CkBAIC04MDksOCArODE1LDkgQEAKIAogICAgICAgICAvKiByZXN0b3JlIHBvc2l0aW9uIGluIHByZXZpb3VzIGNoYXJzdHJpbmcgKi8KICAgICAgICAgY2hhcnN0cmluZyA9IChDRjJfQnVmZmVyKQotICAgICAgICAgICAgICAgICAgICAgICBjZjJfYXJyc3RhY2tfZ2V0UG9pbnRlciggJnN1YnJTdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tY2hhcnN0cmluZ0luZGV4ICk7CisgICAgICAgICAgICAgICAgICAgICAgIGNmMl9hcnJzdGFja19nZXRQb2ludGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICZzdWJyU3RhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgKENGMl9VSW50KS0tY2hhcnN0cmluZ0luZGV4ICk7CiAgICAgICAgIGNvbnRpbnVlOyAgICAgLyogZG8gbm90IGNsZWFyIHRoZSBzdGFjayAqLwogCiAgICAgICBjYXNlIGNmMl9jbWRFU0M6CkBAIC0xMDg4LDggKzEwOTUsOCBAQAogICAgICAgICAgIC8qIG11c3QgYmUgZWl0aGVyIDQgb3IgNSAtLSAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAvKiB0aGlzIGlzIGEgKGRlcHJlY2F0ZWQpIGltcGxpZWQgYHNlYWMnIG9wZXJhdG9yICovCiAKLSAgICAgICAgICBDRjJfVUludCAgICAgICBhY2hhcjsKLSAgICAgICAgICBDRjJfVUludCAgICAgICBiY2hhcjsKKyAgICAgICAgICBDRjJfSW50ICAgICAgICBhY2hhcjsKKyAgICAgICAgICBDRjJfSW50ICAgICAgICBiY2hhcjsKICAgICAgICAgICBDRjJfQnVmZmVyUmVjICBjb21wb25lbnQ7CiAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgZHVtbXlXaWR0aDsgICAvKiBpZ25vcmUgY29tcG9uZW50IHdpZHRoICovCiAgICAgICAgICAgRlRfRXJyb3IgICAgICAgZXJyb3IyOwpAQCAtMTI5MSwxMCArMTI5OCwxNiBAQAogCiAgICAgICBjYXNlIGNmMl9jbWRWVkNVUlZFVE86CiAgICAgICAgIHsKLSAgICAgICAgICBDRjJfVUludCAgY291bnQgPSBjZjJfc3RhY2tfY291bnQoIG9wU3RhY2sgKTsKKyAgICAgICAgICBDRjJfVUludCAgY291bnQsIGNvdW50MSA9IGNmMl9zdGFja19jb3VudCggb3BTdGFjayApOwogICAgICAgICAgIENGMl9VSW50ICBpbmRleCA9IDA7CiAKIAorICAgICAgICAgIC8qIGlmIGBjZjJfc3RhY2tfY291bnQnIGlzbid0IG9mIHRoZSBmb3JtIDRuIG9yIDRuKzEsICovCisgICAgICAgICAgLyogd2UgZW5mb3JjZSBpdCBieSBjbGVhcmluZyB0aGUgc2Vjb25kIGJpdCAgICAgICAgICAgKi8KKyAgICAgICAgICAvKiAoYW5kIHNvcnRpbmcgdGhlIHN0YWNrIGluZGV4aW5nIHRvIHN1aXQpICAgICAgICAgICAqLworICAgICAgICAgIGNvdW50ICA9IGNvdW50MSAmIH4yVTsKKyAgICAgICAgICBpbmRleCArPSBjb3VudDEgLSBjb3VudDsKKwogICAgICAgICAgIEZUX1RSQUNFNCgoICIgdnZjdXJ2ZXRvXG4iICkpOwogCiAgICAgICAgICAgd2hpbGUgKCBpbmRleCA8IGNvdW50ICkKQEAgLTEzMzAsMTAgKzEzNDMsMTYgQEAKIAogICAgICAgY2FzZSBjZjJfY21kSEhDVVJWRVRPOgogICAgICAgICB7Ci0gICAgICAgICAgQ0YyX1VJbnQgIGNvdW50ID0gY2YyX3N0YWNrX2NvdW50KCBvcFN0YWNrICk7CisgICAgICAgICAgQ0YyX1VJbnQgIGNvdW50LCBjb3VudDEgPSBjZjJfc3RhY2tfY291bnQoIG9wU3RhY2sgKTsKICAgICAgICAgICBDRjJfVUludCAgaW5kZXggPSAwOwogCiAKKyAgICAgICAgICAvKiBpZiBgY2YyX3N0YWNrX2NvdW50JyBpc24ndCBvZiB0aGUgZm9ybSA0biBvciA0bisxLCAqLworICAgICAgICAgIC8qIHdlIGVuZm9yY2UgaXQgYnkgY2xlYXJpbmcgdGhlIHNlY29uZCBiaXQgICAgICAgICAgICovCisgICAgICAgICAgLyogKGFuZCBzb3J0aW5nIHRoZSBzdGFjayBpbmRleGluZyB0byBzdWl0KSAgICAgICAgICAgKi8KKyAgICAgICAgICBjb3VudCAgPSBjb3VudDEgJiB+MlU7CisgICAgICAgICAgaW5kZXggKz0gY291bnQxIC0gY291bnQ7CisKICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGhoY3VydmV0b1xuIiApKTsKIAogICAgICAgICAgIHdoaWxlICggaW5kZXggPCBjb3VudCApCkBAIC0xMzcwLDEyICsxMzg5LDE5IEBACiAgICAgICBjYXNlIGNmMl9jbWRWSENVUlZFVE86CiAgICAgICBjYXNlIGNmMl9jbWRIVkNVUlZFVE86CiAgICAgICAgIHsKLSAgICAgICAgICBDRjJfVUludCAgY291bnQgPSBjZjJfc3RhY2tfY291bnQoIG9wU3RhY2sgKTsKKyAgICAgICAgICBDRjJfVUludCAgY291bnQsIGNvdW50MSA9IGNmMl9zdGFja19jb3VudCggb3BTdGFjayApOwogICAgICAgICAgIENGMl9VSW50ICBpbmRleCA9IDA7CiAKICAgICAgICAgICBGVF9Cb29sICBhbHRlcm5hdGUgPSBvcDEgPT0gY2YyX2NtZEhWQ1VSVkVUTzsKIAogCisgICAgICAgICAgLyogaWYgYGNmMl9zdGFja19jb3VudCcgaXNuJ3Qgb2YgdGhlIGZvcm0gOG4sIDhuKzEsICovCisgICAgICAgICAgLyogOG4rNCwgb3IgOG4rNSwgd2UgZW5mb3JjZSBpdCBieSBjbGVhcmluZyB0aGUgICAgICovCisgICAgICAgICAgLyogc2Vjb25kIGJpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgLyogKGFuZCBzb3J0aW5nIHRoZSBzdGFjayBpbmRleGluZyB0byBzdWl0KSAgICAgICAgICovCisgICAgICAgICAgY291bnQgID0gY291bnQxICYgfjJVOworICAgICAgICAgIGluZGV4ICs9IGNvdW50MSAtIGNvdW50OworCiAgICAgICAgICAgRlRfVFJBQ0U0KCggYWx0ZXJuYXRlID8gIiBodmN1cnZldG9cbiIgOiAiIHZoY3VydmV0b1xuIiApKTsKIAogICAgICAgICAgIHdoaWxlICggaW5kZXggPCBjb3VudCApCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZi5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmYuYwppbmRleCBjMzg0MGI1Li5iYjJjZmI1IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZi5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmLmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgRnJlZVR5cGUgT3BlblR5cGUgZHJpdmVyIGNvbXBvbmVudCAoYm9keSBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAxMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmY21hcC5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZjbWFwLmMKaW5kZXggNTIyNDhiMi4uZTc1MzhlOSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZjbWFwLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZjbWFwLmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgQ0ZGIGNoYXJhY3RlciBtYXBwaW5nIHRhYmxlIChjbWFwKSBzdXBwb3J0IChib2R5KS4gICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAwNywgMjAxMCwgMjAxMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAyLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmY21hcC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZjbWFwLmgKaW5kZXggM2Y3ZjY3Yi4uNmVhZWQ2MyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZjbWFwLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZjbWFwLmgKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgQ0ZGIGNoYXJhY3RlciBtYXBwaW5nIHRhYmxlIChjbWFwKSBzdXBwb3J0IChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDIsIDIwMDMsIDIwMDYgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAyLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmZHJpdnIuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmZHJpdnIuYwppbmRleCBkZGU3ZDQ0Li5hNzE4YjdhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZmRyaXZyLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZkcml2ci5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIE9wZW5UeXBlIGZvbnQgZHJpdmVyIGltcGxlbWVudGF0aW9uIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC0zNSw3ICszNSw3IEBACiAjaW5jbHVkZSAiY2ZmZXJycy5oIgogI2luY2x1ZGUgImNmZnBpYy5oIgogCi0jaW5jbHVkZSBGVF9TRVJWSUNFX1hGUkVFODZfTkFNRV9ICisjaW5jbHVkZSBGVF9TRVJWSUNFX0ZPTlRfRk9STUFUX0gKICNpbmNsdWRlIEZUX1NFUlZJQ0VfR0xZUEhfRElDVF9ICiAjaW5jbHVkZSBGVF9TRVJWSUNFX1BST1BFUlRJRVNfSAogI2luY2x1ZGUgRlRfQ0ZGX0RSSVZFUl9ICkBAIC02NCwxMSArNjQsNiBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi0jdW5kZWYgIFBBSVJfVEFHCi0jZGVmaW5lIFBBSVJfVEFHKCBsZWZ0LCByaWdodCApICAoICggKEZUX1VMb25nKWxlZnQgPDwgMTYgKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUxvbmcpcmlnaHQgICAgICAgICkKLQotCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMjEsOSArMTE2LDYgQEAKICAgfQogCiAKLSN1bmRlZiBQQUlSX1RBRwotCi0KICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTIwMyw2ICsxOTUsNjggQEAKICAgICBGVF9HbHlwaFNsb3QgIHNsb3QgID0gZmFjZS0+Z2x5cGg7CiAKIAorICAgIGlmICggRlRfSVNfU0ZOVCggZmFjZSApICkKKyAgICB7CisgICAgICAvKiBPcGVuVHlwZSAxLjcgbWFuZGF0ZXMgdGhhdCB0aGUgZGF0YSBmcm9tIGBobXR4JyB0YWJsZSBiZSB1c2VkOyAqLworICAgICAgLyogaXQgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0aGF0IHRob3NlIHZhbHVlcyBhcmUgaWRlbnRpY2FsIHRvICAgKi8KKyAgICAgIC8qIHRoZSB2YWx1ZXMgaW4gdGhlIGBDRkYnIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgIFRUX0ZhY2UgICB0dGZhY2UgPSAoVFRfRmFjZSlmYWNlOworICAgICAgRlRfU2hvcnQgIGR1bW15OworCisKKyAgICAgIGlmICggZmxhZ3MgJiBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCApCisgICAgICB7CisgICAgICAgIC8qIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSBkYXRhIGZyb20gdGhlIGB2bXR4JyB0YWJsZSBhdCBhbGw7ICovCisgICAgICAgIC8qIG90aGVyd2lzZSB3ZSBleHRyYWN0IHRoZSBpbmZvIGZyb20gdGhlIENGRiBnbHlwaHN0cmluZ3MgICovCisgICAgICAgIC8qIChpbnN0ZWFkIG9mIHN5bnRoZXNpemluZyBhIGdsb2JhbCB2YWx1ZSB1c2luZyB0aGUgYE9TLzInICovCisgICAgICAgIC8qIHRhYmxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIGlmICggIXR0ZmFjZS0+dmVydGljYWxfaW5mbyApCisgICAgICAgICAgZ290byBNaXNzaW5nX1RhYmxlOworCisgICAgICAgIGZvciAoIG5uID0gMDsgbm4gPCBjb3VudDsgbm4rKyApCisgICAgICAgIHsKKyAgICAgICAgICBGVF9VU2hvcnQgIGFoOworCisKKyAgICAgICAgICAoIChTRk5UX1NlcnZpY2UpdHRmYWNlLT5zZm50ICktPmdldF9tZXRyaWNzKCB0dGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIG5uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdW1teSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWggKTsKKworICAgICAgICAgIEZUX1RSQUNFNSgoICIgIGlkeCAlZDogYWR2YW5jZSBoZWlnaHQgJWQgZm9udCB1bml0c1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIG5uLCBhaCApKTsKKyAgICAgICAgICBhZHZhbmNlc1tubl0gPSBhaDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvKiBjaGVjayB3aGV0aGVyIHdlIGhhdmUgZGF0YSBmcm9tIHRoZSBgaG10eCcgdGFibGUgYXQgYWxsICovCisgICAgICAgIGlmICggIXR0ZmFjZS0+aG9yaXpvbnRhbC5udW1iZXJfT2ZfSE1ldHJpY3MgKQorICAgICAgICAgIGdvdG8gTWlzc2luZ19UYWJsZTsKKworICAgICAgICBmb3IgKCBubiA9IDA7IG5uIDwgY291bnQ7IG5uKysgKQorICAgICAgICB7CisgICAgICAgICAgRlRfVVNob3J0ICBhdzsKKworCisgICAgICAgICAgKCAoU0ZOVF9TZXJ2aWNlKXR0ZmFjZS0+c2ZudCApLT5nZXRfbWV0cmljcyggdHRmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVtbXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF3ICk7CisKKyAgICAgICAgICBGVF9UUkFDRTUoKCAiICBpZHggJWQ6IGFkdmFuY2Ugd2lkdGggJWQgZm9udCB1bml0c1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIG5uLCBhdyApKTsKKyAgICAgICAgICBhZHZhbmNlc1tubl0gPSBhdzsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gZXJyb3I7CisgICAgfQorCisgIE1pc3NpbmdfVGFibGU6CiAgICAgZmxhZ3MgfD0gKEZUX1VJbnQzMilGVF9MT0FEX0FEVkFOQ0VfT05MWTsKIAogICAgIGZvciAoIG5uID0gMDsgbm4gPCBjb3VudDsgbm4rKyApCkBAIC0zNTIsNyArNDA2LDcgQEAKICAgICAgIGZvbnRfaW5mby0+aXRhbGljX2FuZ2xlICAgICAgICA9IGRpY3QtPml0YWxpY19hbmdsZTsKICAgICAgIGZvbnRfaW5mby0+aXNfZml4ZWRfcGl0Y2ggICAgICA9IGRpY3QtPmlzX2ZpeGVkX3BpdGNoOwogICAgICAgZm9udF9pbmZvLT51bmRlcmxpbmVfcG9zaXRpb24gID0gKEZUX1Nob3J0KWRpY3QtPnVuZGVybGluZV9wb3NpdGlvbjsKLSAgICAgIGZvbnRfaW5mby0+dW5kZXJsaW5lX3RoaWNrbmVzcyA9IChGVF9TaG9ydClkaWN0LT51bmRlcmxpbmVfdGhpY2tuZXNzOworICAgICAgZm9udF9pbmZvLT51bmRlcmxpbmVfdGhpY2tuZXNzID0gKEZUX1VTaG9ydClkaWN0LT51bmRlcmxpbmVfdGhpY2tuZXNzOwogCiAgICAgICBjZmYtPmZvbnRfaW5mbyA9IGZvbnRfaW5mbzsKICAgICB9CkBAIC0zODMsOSArNDM3LDI3IEBACiAgIHN0YXRpYyBjb25zdCBjaGFyKgogICBjZmZfZ2V0X3BzX25hbWUoIENGRl9GYWNlICBmYWNlICkKICAgewotICAgIENGRl9Gb250ICBjZmYgPSAoQ0ZGX0ZvbnQpZmFjZS0+ZXh0cmEuZGF0YTsKKyAgICBDRkZfRm9udCAgICAgIGNmZiAgPSAoQ0ZGX0ZvbnQpZmFjZS0+ZXh0cmEuZGF0YTsKKyAgICBTRk5UX1NlcnZpY2UgIHNmbnQgPSAoU0ZOVF9TZXJ2aWNlKWZhY2UtPnNmbnQ7CiAKIAorICAgIC8qIGZvbGxvd2luZyB0aGUgT3BlblR5cGUgc3BlY2lmaWNhdGlvbiAxLjcsIHdlIHJldHVybiB0aGUgbmFtZSBzdG9yZWQgKi8KKyAgICAvKiBpbiB0aGUgYG5hbWUnIHRhYmxlIGZvciBhIENGRiB3cmFwcGVkIGludG8gYW4gU0ZOVCBjb250YWluZXIgICAgICAgICovCisKKyAgICBpZiAoIHNmbnQgKQorICAgIHsKKyAgICAgIEZUX0xpYnJhcnkgICAgICAgICAgICAgbGlicmFyeSAgICAgPSBGVF9GQUNFX0xJQlJBUlkoIGZhY2UgKTsKKyAgICAgIEZUX01vZHVsZSAgICAgICAgICAgICAgc2ZudF9tb2R1bGUgPSBGVF9HZXRfTW9kdWxlKCBsaWJyYXJ5LCAic2ZudCIgKTsKKyAgICAgIEZUX1NlcnZpY2VfUHNGb250TmFtZSAgc2VydmljZSAgICAgPQorICAgICAgICAoRlRfU2VydmljZV9Qc0ZvbnROYW1lKWZ0X21vZHVsZV9nZXRfc2VydmljZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmbnRfbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0ZPTlRfTkFNRSApOworCisKKyAgICAgIGlmICggc2VydmljZSAmJiBzZXJ2aWNlLT5nZXRfcHNfZm9udF9uYW1lICkKKyAgICAgICAgcmV0dXJuIHNlcnZpY2UtPmdldF9wc19mb250X25hbWUoIEZUX0ZBQ0UoIGZhY2UgKSApOworICAgIH0KKwogICAgIHJldHVybiAoY29uc3QgY2hhciopY2ZmLT5mb250X25hbWU7CiAgIH0KIApAQCAtNzIzLDcgKzc5NSw3IEBACiAjaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fTk9fR0xZUEhfTkFNRVMKICAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNygKICAgICBjZmZfc2VydmljZXMsCi0gICAgRlRfU0VSVklDRV9JRF9YRjg2X05BTUUsICAgICAgICAgICAgRlRfWEY4Nl9GT1JNQVRfQ0ZGLAorICAgIEZUX1NFUlZJQ0VfSURfRk9OVF9GT1JNQVQsICAgICAgICAgIEZUX0ZPTlRfRk9STUFUX0NGRiwKICAgICBGVF9TRVJWSUNFX0lEX1BPU1RTQ1JJUFRfSU5GTywgICAgICAmQ0ZGX1NFUlZJQ0VfUFNfSU5GT19HRVQsCiAgICAgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0ZPTlRfTkFNRSwgJkNGRl9TRVJWSUNFX1BTX05BTUVfR0VULAogICAgIEZUX1NFUlZJQ0VfSURfR0xZUEhfRElDVCwgICAgICAgICAgICZDRkZfU0VSVklDRV9HTFlQSF9ESUNUX0dFVCwKQEAgLTczNCw3ICs4MDYsNyBAQAogI2Vsc2UKICAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNigKICAgICBjZmZfc2VydmljZXMsCi0gICAgRlRfU0VSVklDRV9JRF9YRjg2X05BTUUsICAgICAgICAgICAgRlRfWEY4Nl9GT1JNQVRfQ0ZGLAorICAgIEZUX1NFUlZJQ0VfSURfRk9OVF9GT1JNQVQsICAgICAgICAgIEZUX0ZPTlRfRk9STUFUX0NGRiwKICAgICBGVF9TRVJWSUNFX0lEX1BPU1RTQ1JJUFRfSU5GTywgICAgICAmQ0ZGX1NFUlZJQ0VfUFNfSU5GT19HRVQsCiAgICAgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0ZPTlRfTkFNRSwgJkNGRl9TRVJWSUNFX1BTX05BTUVfR0VULAogICAgIEZUX1NFUlZJQ0VfSURfVFRfQ01BUCwgICAgICAgICAgICAgICZDRkZfU0VSVklDRV9HRVRfQ01BUF9JTkZPX0dFVCwKQEAgLTc1Myw3ICs4MjUsNyBAQAogICAgIEZUX01vZHVsZV9JbnRlcmZhY2UgIHJlc3VsdDsKIAogCi0gICAgLyogQ0ZGX1NFUlZJQ0VTX0dFVCBkZXJlZmVycyBgbGlicmFyeScgaW4gUElDIG1vZGUgKi8KKyAgICAvKiBDRkZfU0VSVklDRVNfR0VUIGRlcmVmZXJlbmNlcyBgbGlicmFyeScgaW4gUElDIG1vZGUgKi8KICNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwogICAgIGlmICggIWRyaXZlciApCiAgICAgICByZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmZHJpdnIuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmZHJpdnIuaAppbmRleCA1MGU4MTM4Li45NTI3ZjVlIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZmRyaXZyLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZkcml2ci5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEhpZ2gtbGV2ZWwgT3BlblR5cGUgZHJpdmVyIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZmVycnMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmZXJycy5oCmluZGV4IDgwMWQ3M2UuLjU0M2JkYjAgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmZXJycy5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmZXJycy5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIENGRiBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLCAyMDEyIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwMS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZmdsb2FkLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZmdsb2FkLmMKaW5kZXggNzU4YTNkMy4uNWY1NzQwMyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZnbG9hZC5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmZ2xvYWQuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBPcGVuVHlwZSBHbHlwaCBMb2FkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtMjczLDggKzI3Myw4IEBACiAgICAgICBidWlsZGVyLT5jdXJyZW50ID0gJmxvYWRlci0+Y3VycmVudC5vdXRsaW5lOwogICAgICAgRlRfR2x5cGhMb2FkZXJfUmV3aW5kKCBsb2FkZXIgKTsKIAotICAgICAgYnVpbGRlci0+aGludHNfZ2xvYmFscyA9IDA7Ci0gICAgICBidWlsZGVyLT5oaW50c19mdW5jcyAgID0gMDsKKyAgICAgIGJ1aWxkZXItPmhpbnRzX2dsb2JhbHMgPSBOVUxMOworICAgICAgYnVpbGRlci0+aGludHNfZnVuY3MgICA9IE5VTEw7CiAKICAgICAgIGlmICggaGludGluZyAmJiBzaXplICkKICAgICAgIHsKQEAgLTY0Niw3ICs2NDYsNyBAQAogICAgIGZvciAoIG4gPSAwOyBuIDwgY2ZmLT5udW1fZ2x5cGhzOyBuKysgKQogICAgIHsKICAgICAgIGlmICggY2ZmLT5jaGFyc2V0LnNpZHNbbl0gPT0gZ2x5cGhfc2lkICkKLSAgICAgICAgcmV0dXJuIG47CisgICAgICAgIHJldHVybiAoRlRfSW50KW47CiAgICAgfQogCiAgICAgcmV0dXJuIC0xOwpAQCAtNjcyLDcgKzY3Miw3IEBACiAKIAogICAgICAgKnBvaW50ZXIgPSAoRlRfQnl0ZSopZGF0YS5wb2ludGVyOwotICAgICAgKmxlbmd0aCA9IGRhdGEubGVuZ3RoOworICAgICAgKmxlbmd0aCAgPSAoRlRfVUxvbmcpZGF0YS5sZW5ndGg7CiAKICAgICAgIHJldHVybiBlcnJvcjsKICAgICB9CkBAIC03MDcsNyArNzA3LDcgQEAKIAogCiAgICAgICBkYXRhLnBvaW50ZXIgPSAqcG9pbnRlcjsKLSAgICAgIGRhdGEubGVuZ3RoICA9IGxlbmd0aDsKKyAgICAgIGRhdGEubGVuZ3RoICA9IChGVF9JbnQpbGVuZ3RoOwogCiAgICAgICBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPmZ1bmNzLT5mcmVlX2dseXBoX2RhdGEoCiAgICAgICAgIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZS0+b2JqZWN0LCAmZGF0YSApOwpAQCAtODE5LDcgKzgxOSw3IEBACiAgICAgRlRfR2x5cGhMb2FkZXJfUHJlcGFyZSggYnVpbGRlci0+bG9hZGVyICk7CiAKICAgICAvKiBGaXJzdCBsb2FkIGBiY2hhcicgaW4gYnVpbGRlciAqLwotICAgIGVycm9yID0gY2ZmX2dldF9nbHlwaF9kYXRhKCBmYWNlLCBiY2hhcl9pbmRleCwKKyAgICBlcnJvciA9IGNmZl9nZXRfZ2x5cGhfZGF0YSggZmFjZSwgKEZUX1VJbnQpYmNoYXJfaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFyc3RyaW5nLCAmY2hhcnN0cmluZ19sZW4gKTsKICAgICBpZiAoICFlcnJvciApCiAgICAgewpAQCAtODQ5LDcgKzg0OSw3IEBACiAgICAgYnVpbGRlci0+cG9zX3kgPSBhZHk7CiAKICAgICAvKiBOb3cgbG9hZCBgYWNoYXInIG9uIHRvcCBvZiB0aGUgYmFzZSBvdXRsaW5lLiAqLwotICAgIGVycm9yID0gY2ZmX2dldF9nbHlwaF9kYXRhKCBmYWNlLCBhY2hhcl9pbmRleCwKKyAgICBlcnJvciA9IGNmZl9nZXRfZ2x5cGhfZGF0YSggZmFjZSwgKEZUX1VJbnQpYWNoYXJfaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFyc3RyaW5nLCAmY2hhcnN0cmluZ19sZW4gKTsKICAgICBpZiAoICFlcnJvciApCiAgICAgewpAQCAtOTIyLDEwICs5MjIsMTAgQEAKICAgICBkZWNvZGVyLT5yZWFkX3dpZHRoID0gMTsKIAogICAgIC8qIGNvbXB1dGUgcmFuZG9tIHNlZWQgZnJvbSBzdGFjayBhZGRyZXNzIG9mIHBhcmFtZXRlciAqLwotICAgIHNlZWQgPSAoRlRfRml4ZWQpKCAoIChGVF9QdHJEaXN0KShjaGFyKikmc2VlZCAgICAgICAgICAgICAgXgotICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9QdHJEaXN0KShjaGFyKikmZGVjb2RlciAgICAgICAgICAgXgotICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9QdHJEaXN0KShjaGFyKikmY2hhcnN0cmluZ19iYXNlICkgJgotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMT05HX01BWCApIDsKKyAgICBzZWVkID0gKEZUX0ZpeGVkKSggKCAoRlRfT2Zmc2V0KShjaGFyKikmc2VlZCAgICAgICAgICAgIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfT2Zmc2V0KShjaGFyKikmZGVjb2RlciAgICAgICAgIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfT2Zmc2V0KShjaGFyKikmY2hhcnN0cmluZ19iYXNlICkgJgorICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMT05HX01BWCAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgIHNlZWQgPSAoIHNlZWQgXiAoIHNlZWQgPj4gMTAgKSBeICggc2VlZCA+PiAyMCApICkgJiAweEZGRkZMOwogICAgIGlmICggc2VlZCA9PSAwICkKICAgICAgIHNlZWQgPSAweDczODQ7CkBAIC0xMzczLDEyICsxMzczLDEyIEBACiAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBvcCA9PSBjZmZfb3BfaGludG1hc2sgKQogICAgICAgICAgICAgICBoaW50ZXItPmhpbnRtYXNrKCBoaW50ZXItPmhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLT5jdXJyZW50LT5uX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci0+bnVtX2hpbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludClidWlsZGVyLT5jdXJyZW50LT5uX3BvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpZGVjb2Rlci0+bnVtX2hpbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcCApOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICBoaW50ZXItPmNvdW50ZXIoIGhpbnRlci0+aGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci0+bnVtX2hpbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50KWRlY29kZXItPm51bV9oaW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcCApOwogICAgICAgICAgIH0KIApAQCAtMTk5NSw3ICsxOTk1LDcgQEAKICAgICAgICAgICAgIGlmICggaGludGVyICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgaWYgKCBoaW50ZXItPmNsb3NlKCBoaW50ZXItPmhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXItPmN1cnJlbnQtPm5fcG9pbnRzICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50KWJ1aWxkZXItPmN1cnJlbnQtPm5fcG9pbnRzICkgKQogICAgICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwogCiAgICAgICAgICAgICAgIC8qIGFwcGx5IGhpbnRzIHRvIHRoZSBsb2FkZWQgZ2x5cGggb3V0bGluZSBub3cgKi8KQEAgLTIzODksNyArMjM4OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXItPmxvY2Fsc19iaWFzICk7CiAKIAotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBjYWxsc3ViciglZClcbiIsIGlkeCApKTsKKyAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgY2FsbHN1YnIgKGlkeCAlZCwgZW50ZXJpbmcgbGV2ZWwgJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgem9uZSAtIGRlY29kZXItPnpvbmVzICsgMSApKTsKIAogICAgICAgICAgICAgaWYgKCBpZHggPj0gZGVjb2Rlci0+bnVtX2xvY2FscyApCiAgICAgICAgICAgICB7CkBAIC0yNDMxLDcgKzI0MzMsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLT5nbG9iYWxzX2JpYXMgKTsKIAogCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGNhbGxnc3ViciglZClcbiIsIGlkeCApKTsKKyAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgY2FsbGdzdWJyIChpZHggJWQsIGVudGVyaW5nIGxldmVsICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHpvbmUgLSBkZWNvZGVyLT56b25lcyArIDEgKSk7CiAKICAgICAgICAgICAgIGlmICggaWR4ID49IGRlY29kZXItPm51bV9nbG9iYWxzICkKICAgICAgICAgICAgIHsKQEAgLTI0NjgsNyArMjQ3Miw4IEBACiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBjZmZfb3BfcmV0dXJuOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgcmV0dXJuXG4iICkpOworICAgICAgICAgIEZUX1RSQUNFNCgoICIgcmV0dXJuIChsZWF2aW5nIGxldmVsICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLT56b25lIC0gZGVjb2Rlci0+em9uZXMgKSk7CiAKICAgICAgICAgICBpZiAoIGRlY29kZXItPnpvbmUgPD0gZGVjb2Rlci0+em9uZXMgKQogICAgICAgICAgIHsKQEAgLTI2NjksNyArMjY3NCw3IEBACiAgICAgICAgIGVycm9yID0gc2ZudC0+bG9hZF9zYml0X2ltYWdlKCBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS0+c3RyaWtlX2luZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfSW50KWxvYWRfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludClsb2FkX2ZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdseXBoLT5yb290LmJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXRyaWNzICk7CkBAIC0yNzIwLDcgKzI3MjUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT52ZXJ0aWNhbF9pbmZvICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnZlcnRpY2FsLm51bWJlcl9PZl9WTWV0cmljcyA+IDAgKTsKIAotICAgICAgICAgIC8qIGdldCB0aGUgdmVydGljYWwgbWV0cmljcyBmcm9tIHRoZSB2dG14IHRhYmxlIGlmIHdlIGhhdmUgb25lICovCisgICAgICAgICAgLyogZ2V0IHRoZSB2ZXJ0aWNhbCBtZXRyaWNzIGZyb20gdGhlIHZtdHggdGFibGUgaWYgd2UgaGF2ZSBvbmUgKi8KICAgICAgICAgICBpZiAoIGhhc192ZXJ0aWNhbF9pbmZvICkKICAgICAgICAgICB7CiAgICAgICAgICAgICAodm9pZCkoIChTRk5UX1NlcnZpY2UpZmFjZS0+c2ZudCApLT5nZXRfbWV0cmljcyggZmFjZSwgMSwKQEAgLTI3NTcsMTYgKzI3NjIsMTYgQEAKICAgICAvKiB0aGlzIHNjYWxpbmcgaXMgb25seSByZWxldmFudCBpZiB0aGUgUFMgaGludGVyIGlzbid0IGFjdGl2ZSAqLwogICAgIGlmICggY2ZmLT5udW1fc3ViZm9udHMgKQogICAgIHsKLSAgICAgIEZUX1VMb25nICB0b3BfdXBtLCBzdWJfdXBtOwotICAgICAgRlRfQnl0ZSAgIGZkX2luZGV4ID0gY2ZmX2ZkX3NlbGVjdF9nZXQoICZjZmYtPmZkX3NlbGVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCApOworICAgICAgRlRfTG9uZyAgdG9wX3VwbSwgc3ViX3VwbTsKKyAgICAgIEZUX0J5dGUgIGZkX2luZGV4ID0gY2ZmX2ZkX3NlbGVjdF9nZXQoICZjZmYtPmZkX3NlbGVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4ICk7CiAKIAogICAgICAgaWYgKCBmZF9pbmRleCA+PSBjZmYtPm51bV9zdWJmb250cyApCiAgICAgICAgIGZkX2luZGV4ID0gKEZUX0J5dGUpKCBjZmYtPm51bV9zdWJmb250cyAtIDEgKTsKIAotICAgICAgdG9wX3VwbSA9IGNmZi0+dG9wX2ZvbnQuZm9udF9kaWN0LnVuaXRzX3Blcl9lbTsKLSAgICAgIHN1Yl91cG0gPSBjZmYtPnN1YmZvbnRzW2ZkX2luZGV4XS0+Zm9udF9kaWN0LnVuaXRzX3Blcl9lbTsKKyAgICAgIHRvcF91cG0gPSAoRlRfTG9uZyljZmYtPnRvcF9mb250LmZvbnRfZGljdC51bml0c19wZXJfZW07CisgICAgICBzdWJfdXBtID0gKEZUX0xvbmcpY2ZmLT5zdWJmb250c1tmZF9pbmRleF0tPmZvbnRfZGljdC51bml0c19wZXJfZW07CiAKIAogICAgICAgZm9udF9tYXRyaXggPSBjZmYtPnN1YmZvbnRzW2ZkX2luZGV4XS0+Zm9udF9kaWN0LmZvbnRfbWF0cml4OwpAQCAtMjg2Nyw3ICsyODcyLDcgQEAKICAgICAgIC8qIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgaWYgKCBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UgKQogICAgICAgewotICAgICAgICBnbHlwaC0+cm9vdC5jb250cm9sX2RhdGEgPSAwOworICAgICAgICBnbHlwaC0+cm9vdC5jb250cm9sX2RhdGEgPSBOVUxMOwogICAgICAgICBnbHlwaC0+cm9vdC5jb250cm9sX2xlbiA9IDA7CiAgICAgICB9CiAgICAgICBlbHNlCkBAIC0yODg0LDcgKzI4ODksNyBAQAogICAgICAgICB7CiAgICAgICAgICAgZ2x5cGgtPnJvb3QuY29udHJvbF9kYXRhID0gY3NpbmRleC0+Ynl0ZXMgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzaW5kZXgtPm9mZnNldHNbZ2x5cGhfaW5kZXhdIC0gMTsKLSAgICAgICAgICBnbHlwaC0+cm9vdC5jb250cm9sX2xlbiAgPSBjaGFyc3RyaW5nX2xlbjsKKyAgICAgICAgICBnbHlwaC0+cm9vdC5jb250cm9sX2xlbiAgPSAoRlRfTG9uZyljaGFyc3RyaW5nX2xlbjsKICAgICAgICAgfQogICAgICAgfQogCkBAIC0yOTQ0LDI5ICsyOTQ5LDQ2IEBACiAgICAgICB7CiAgICAgICAgIEZUX0JCb3ggICAgICAgICAgICBjYm94OwogICAgICAgICBGVF9HbHlwaF9NZXRyaWNzKiAgbWV0cmljcyA9ICZnbHlwaC0+cm9vdC5tZXRyaWNzOwotICAgICAgICBGVF9WZWN0b3IgICAgICAgICAgYWR2YW5jZTsKICAgICAgICAgRlRfQm9vbCAgICAgICAgICAgIGhhc192ZXJ0aWNhbF9pbmZvOwogCiAKLSAgICAgICAgLyogY29weSB0aGUgX3Vuc2NhbGVkXyBhZHZhbmNlIHdpZHRoICovCi0gICAgICAgIG1ldHJpY3MtPmhvcmlBZHZhbmNlICAgICAgICAgICAgICAgICAgICA9IGRlY29kZXIuZ2x5cGhfd2lkdGg7Ci0gICAgICAgIGdseXBoLT5yb290LmxpbmVhckhvcmlBZHZhbmNlICAgICAgICAgICA9IGRlY29kZXIuZ2x5cGhfd2lkdGg7CisgICAgICAgIGlmICggZmFjZS0+aG9yaXpvbnRhbC5udW1iZXJfT2ZfSE1ldHJpY3MgKQorICAgICAgICB7CisgICAgICAgICAgRlRfU2hvcnQgICBob3JpQmVhcmluZ1ggPSAwOworICAgICAgICAgIEZUX1VTaG9ydCAgaG9yaUFkdmFuY2UgID0gMDsKKworCisgICAgICAgICAgKCAoU0ZOVF9TZXJ2aWNlKWZhY2UtPnNmbnQgKS0+Z2V0X21ldHJpY3MoIGZhY2UsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaG9yaUJlYXJpbmdYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaG9yaUFkdmFuY2UgKTsKKyAgICAgICAgICBtZXRyaWNzLT5ob3JpQWR2YW5jZSAgICAgICAgICA9IGhvcmlBZHZhbmNlOworICAgICAgICAgIG1ldHJpY3MtPmhvcmlCZWFyaW5nWCAgICAgICAgID0gaG9yaUJlYXJpbmdYOworICAgICAgICAgIGdseXBoLT5yb290LmxpbmVhckhvcmlBZHZhbmNlID0gaG9yaUFkdmFuY2U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgLyogY29weSB0aGUgX3Vuc2NhbGVkXyBhZHZhbmNlIHdpZHRoICovCisgICAgICAgICAgbWV0cmljcy0+aG9yaUFkdmFuY2UgICAgICAgICAgPSBkZWNvZGVyLmdseXBoX3dpZHRoOworICAgICAgICAgIGdseXBoLT5yb290LmxpbmVhckhvcmlBZHZhbmNlID0gZGVjb2Rlci5nbHlwaF93aWR0aDsKKyAgICAgICAgfQorCiAgICAgICAgIGdseXBoLT5yb290LmludGVybmFsLT5nbHlwaF90cmFuc2Zvcm1lZCA9IDA7CiAKICAgICAgICAgaGFzX3ZlcnRpY2FsX2luZm8gPSBGVF9CT09MKCBmYWNlLT52ZXJ0aWNhbF9pbmZvICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+dmVydGljYWwubnVtYmVyX09mX1ZNZXRyaWNzID4gMCApOwogCi0gICAgICAgIC8qIGdldCB0aGUgdmVydGljYWwgbWV0cmljcyBmcm9tIHRoZSB2dG14IHRhYmxlIGlmIHdlIGhhdmUgb25lICovCisgICAgICAgIC8qIGdldCB0aGUgdmVydGljYWwgbWV0cmljcyBmcm9tIHRoZSB2bXR4IHRhYmxlIGlmIHdlIGhhdmUgb25lICovCiAgICAgICAgIGlmICggaGFzX3ZlcnRpY2FsX2luZm8gKQogICAgICAgICB7CiAgICAgICAgICAgRlRfU2hvcnQgICB2ZXJ0QmVhcmluZ1kgPSAwOwogICAgICAgICAgIEZUX1VTaG9ydCAgdmVydEFkdmFuY2UgID0gMDsKIAogCi0gICAgICAgICAgKHZvaWQpKCAoU0ZOVF9TZXJ2aWNlKWZhY2UtPnNmbnQgKS0+Z2V0X21ldHJpY3MoIGZhY2UsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmVydEJlYXJpbmdZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmVydEFkdmFuY2UgKTsKKyAgICAgICAgICAoIChTRk5UX1NlcnZpY2UpZmFjZS0+c2ZudCApLT5nZXRfbWV0cmljcyggZmFjZSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZXJ0QmVhcmluZ1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZXJ0QWR2YW5jZSApOwogICAgICAgICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWSA9IHZlcnRCZWFyaW5nWTsKICAgICAgICAgICBtZXRyaWNzLT52ZXJ0QWR2YW5jZSAgPSB2ZXJ0QWR2YW5jZTsKICAgICAgICAgfQpAQCAtMjk5MSwyNiArMzAxMywyNyBAQAogCiAgICAgICAgIGdseXBoLT5yb290Lm91dGxpbmUuZmxhZ3MgfD0gRlRfT1VUTElORV9SRVZFUlNFX0ZJTEw7CiAKLSAgICAgICAgaWYgKCAhKCBmb250X21hdHJpeC54eCA9PSAweDEwMDAwTCAmJgotICAgICAgICAgICAgICAgIGZvbnRfbWF0cml4Lnl5ID09IDB4MTAwMDBMICYmCi0gICAgICAgICAgICAgICAgZm9udF9tYXRyaXgueHkgPT0gMCAgICAgICAgJiYKLSAgICAgICAgICAgICAgICBmb250X21hdHJpeC55eCA9PSAwICAgICAgICApICkKKyAgICAgICAgLyogYXBwbHkgdGhlIGZvbnQgbWF0cml4LCBpZiBhbnkgKi8KKyAgICAgICAgaWYgKCBmb250X21hdHJpeC54eCAhPSAweDEwMDAwTCB8fCBmb250X21hdHJpeC55eSAhPSAweDEwMDAwTCB8fAorICAgICAgICAgICAgIGZvbnRfbWF0cml4Lnh5ICE9IDAgICAgICAgIHx8IGZvbnRfbWF0cml4Lnl4ICE9IDAgICAgICAgICkKKyAgICAgICAgewogICAgICAgICAgIEZUX091dGxpbmVfVHJhbnNmb3JtKCAmZ2x5cGgtPnJvb3Qub3V0bGluZSwgJmZvbnRfbWF0cml4ICk7CiAKLSAgICAgICAgaWYgKCAhKCBmb250X29mZnNldC54ID09IDAgJiYKLSAgICAgICAgICAgICAgICBmb250X29mZnNldC55ID09IDAgKSApCisgICAgICAgICAgbWV0cmljcy0+aG9yaUFkdmFuY2UgPSBGVF9NdWxGaXgoIG1ldHJpY3MtPmhvcmlBZHZhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X21hdHJpeC54eCApOworICAgICAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlID0gRlRfTXVsRml4KCBtZXRyaWNzLT52ZXJ0QWR2YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udF9tYXRyaXgueXkgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggZm9udF9vZmZzZXQueCB8fCBmb250X29mZnNldC55ICkKKyAgICAgICAgewogICAgICAgICAgIEZUX091dGxpbmVfVHJhbnNsYXRlKCAmZ2x5cGgtPnJvb3Qub3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udF9vZmZzZXQueCwgZm9udF9vZmZzZXQueSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X29mZnNldC54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X29mZnNldC55ICk7CiAKLSAgICAgICAgYWR2YW5jZS54ID0gbWV0cmljcy0+aG9yaUFkdmFuY2U7Ci0gICAgICAgIGFkdmFuY2UueSA9IDA7Ci0gICAgICAgIEZUX1ZlY3Rvcl9UcmFuc2Zvcm0oICZhZHZhbmNlLCAmZm9udF9tYXRyaXggKTsKLSAgICAgICAgbWV0cmljcy0+aG9yaUFkdmFuY2UgPSBhZHZhbmNlLnggKyBmb250X29mZnNldC54OwotCi0gICAgICAgIGFkdmFuY2UueCA9IDA7Ci0gICAgICAgIGFkdmFuY2UueSA9IG1ldHJpY3MtPnZlcnRBZHZhbmNlOwotICAgICAgICBGVF9WZWN0b3JfVHJhbnNmb3JtKCAmYWR2YW5jZSwgJmZvbnRfbWF0cml4ICk7Ci0gICAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlID0gYWR2YW5jZS55ICsgZm9udF9vZmZzZXQueTsKKyAgICAgICAgICBtZXRyaWNzLT5ob3JpQWR2YW5jZSArPSBmb250X29mZnNldC54OworICAgICAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlICs9IGZvbnRfb2Zmc2V0Lnk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoICggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fU0NBTEUgKSA9PSAwIHx8IGZvcmNlX3NjYWxpbmcgKQogICAgICAgICB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZmdsb2FkLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZmdsb2FkLmgKaW5kZXggNDFkZjdkYi4uNWYyNjU1ZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZnbG9hZC5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmZ2xvYWQuaApAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBPcGVuVHlwZSBHbHlwaCBMb2FkZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDA0LCAyMDA2LTIwMDksIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtMjksNyArMjksMTIgQEAKIAogCiAjZGVmaW5lIENGRl9NQVhfT1BFUkFORFMgICAgICAgIDQ4Ci0jZGVmaW5lIENGRl9NQVhfU1VCUlNfQ0FMTFMgICAgIDMyCisjZGVmaW5lIENGRl9NQVhfU1VCUlNfQ0FMTFMgICAgIDE2ICAvKiBtYXhpbXVtIHN1YnJvdXRpbmUgbmVzdGluZzsgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb25seSAxMCBhcmUgYWxsb3dlZCBidXQgdGhlcmUgZXhpc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvbnRzIGxpa2UgYEhpcmFLYWt1UHJvTi1XMy50dGYnICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoSGlyYWdpbm8gS2FrdSBHb3RoaWMgUHJvTiBXMzsgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOC4yZDZlMTsgMjAxNC0xMi0xOSkgdGhhdCBleGNlZWQgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgbGltaXQgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIENGRl9NQVhfVFJBTlNfRUxFTUVOVFMgIDMyCiAKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZsb2FkLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZmxvYWQuYwppbmRleCBkOWJlYzU5Li5jNjEyMjJkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZmxvYWQuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZmxvYWQuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBPcGVuVHlwZSBhbmQgQ0ZGIGRhdGEvcHJvZ3JhbSB0YWJsZXMgbG9hZGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtMzU3LDcgKzM1Nyw3IEBACiAKICAgICAgIGNhc2UgMzoKICAgICAgICAgZm9yICggOyBwIDwgcF9lbmQ7IHAgKz0gMywgcG9mZisrICkKLSAgICAgICAgICBwb2ZmWzBdID0gRlRfUEVFS19PRkYzKCBwICk7CisgICAgICAgICAgcG9mZlswXSA9IEZUX1BFRUtfVU9GRjMoIHAgKTsKICAgICAgICAgYnJlYWs7CiAKICAgICAgIGRlZmF1bHQ6CkBAIC04MDksNyArODA5LDcgQEAKICAgICAvKiBXaGVuIG11bHRpcGxlIEdJRHMgbWFwIHRvIHRoZSBzYW1lIENJRCwgd2UgY2hvb3NlIHRoZSBsb3dlc3QgKi8KICAgICAvKiBHSUQuICBUaGlzIGlzIG5vdCBkZXNjcmliZWQgaW4gYW55IHNwZWMsIGJ1dCBpdCBtYXRjaGVzIHRoZSAgKi8KICAgICAvKiBiZWhhdmlvdXIgb2YgcmVjZW50IEFjcm9yZWFkIHZlcnNpb25zLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBmb3IgKCBqID0gbnVtX2dseXBocyAtIDE7IGogPj0gMCA7IGotLSApCisgICAgZm9yICggaiA9IChGVF9Mb25nKW51bV9nbHlwaHMgLSAxOyBqID49IDAgOyBqLS0gKQogICAgICAgY2hhcnNldC0+Y2lkc1tjaGFyc2V0LT5zaWRzW2pdXSA9IChGVF9VU2hvcnQpajsKIAogICAgIGNoYXJzZXQtPm1heF9jaWQgICAgPSBtYXhfY2lkOwpAQCAtMTQ0Nyw3ICsxNDQ3LDcgQEAKICAgICBGVF9VTG9uZyAgICAgICAgIGJhc2Vfb2Zmc2V0OwogICAgIENGRl9Gb250UmVjRGljdCAgZGljdDsKICAgICBDRkZfSW5kZXhSZWMgICAgIHN0cmluZ19pbmRleDsKLSAgICBGVF9JbnQgICAgICAgICAgIHN1YmZvbnRfaW5kZXg7CisgICAgRlRfVUludCAgICAgICAgICBzdWJmb250X2luZGV4OwogCiAKICAgICBGVF9aRVJPKCBmb250ICk7CkBAIC0xNDk1LDkgKzE0OTUsOSBAQAogICAgIGlmICggcHVyZV9jZmYgKQogICAgIHsKICAgICAgIC8qIHdlbGwsIHdlIGRvbid0IHJlYWxseSBmb3JnZXQgdGhlIGBkaXNhYmxlZCcgZm9udHMuLi4gKi8KLSAgICAgIHN1YmZvbnRfaW5kZXggPSBmYWNlX2luZGV4OworICAgICAgc3ViZm9udF9pbmRleCA9IChGVF9VSW50KSggZmFjZV9pbmRleCAmIDB4RkZGRiApOwogCi0gICAgICBpZiAoIHN1YmZvbnRfaW5kZXggPj0gKEZUX0ludClmb250LT5uYW1lX2luZGV4LmNvdW50ICkKKyAgICAgIGlmICggZmFjZV9pbmRleCA+IDAgJiYgc3ViZm9udF9pbmRleCA+PSBmb250LT5uYW1lX2luZGV4LmNvdW50ICkKICAgICAgIHsKICAgICAgICAgRlRfRVJST1IoKCAiY2ZmX2ZvbnRfbG9hZDoiCiAgICAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIHN1YmZvbnQgaW5kZXggZm9yIHB1cmUgQ0ZGIGZvbnQgKCVkKVxuIiwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmbG9hZC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZsb2FkLmgKaW5kZXggODA0OTYxOS4uNDU5ZTdiMCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZsb2FkLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZsb2FkLmgKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgT3BlblR5cGUgJiBDRkYgZGF0YS9wcm9ncmFtIHRhYmxlcyBsb2FkZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwMywgMjAwNywgMjAwOCwgMjAxMCBieSAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2Zmb2Jqcy5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZvYmpzLmMKaW5kZXggZGEzZDAxOS4uMGUwZDViMCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZvYmpzLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZvYmpzLmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgT3BlblR5cGUgb2JqZWN0cyBtYW5hZ2VyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KQEAgLTIyNiw4ICsyMjYsOCBAQAogICAgICAgQ0ZGX0ZvbnQgICAgICBmb250ICAgICA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwogICAgICAgQ0ZGX0ludGVybmFsICBpbnRlcm5hbCA9IChDRkZfSW50ZXJuYWwpc2l6ZS0+aW50ZXJuYWw7CiAKLSAgICAgIEZUX1VMb25nICB0b3BfdXBtICA9IGZvbnQtPnRvcF9mb250LmZvbnRfZGljdC51bml0c19wZXJfZW07Ci0gICAgICBGVF9VSW50ICAgaTsKKyAgICAgIEZUX0xvbmcgIHRvcF91cG0gID0gKEZUX0xvbmcpZm9udC0+dG9wX2ZvbnQuZm9udF9kaWN0LnVuaXRzX3Blcl9lbTsKKyAgICAgIEZUX1VJbnQgIGk7CiAKIAogICAgICAgZnVuY3MtPnNldF9zY2FsZSggaW50ZXJuYWwtPnRvcGZvbnQsCkBAIC0yMzcsNyArMjM3LDcgQEAKICAgICAgIGZvciAoIGkgPSBmb250LT5udW1fc3ViZm9udHM7IGkgPiAwOyBpLS0gKQogICAgICAgewogICAgICAgICBDRkZfU3ViRm9udCAgc3ViICAgICA9IGZvbnQtPnN1YmZvbnRzW2kgLSAxXTsKLSAgICAgICAgRlRfVUxvbmcgICAgIHN1Yl91cG0gPSBzdWItPmZvbnRfZGljdC51bml0c19wZXJfZW07CisgICAgICAgIEZUX0xvbmcgICAgICBzdWJfdXBtID0gKEZUX0xvbmcpc3ViLT5mb250X2RpY3QudW5pdHNfcGVyX2VtOwogICAgICAgICBGVF9Qb3MgICAgICAgeF9zY2FsZSwgeV9zY2FsZTsKIAogCkBAIC0yOTgsOCArMjk4LDggQEAKICAgICAgIENGRl9Gb250ICAgICAgZm9udCAgICAgPSAoQ0ZGX0ZvbnQpY2ZmZmFjZS0+ZXh0cmEuZGF0YTsKICAgICAgIENGRl9JbnRlcm5hbCAgaW50ZXJuYWwgPSAoQ0ZGX0ludGVybmFsKXNpemUtPmludGVybmFsOwogCi0gICAgICBGVF9VTG9uZyAgdG9wX3VwbSAgPSBmb250LT50b3BfZm9udC5mb250X2RpY3QudW5pdHNfcGVyX2VtOwotICAgICAgRlRfVUludCAgIGk7CisgICAgICBGVF9Mb25nICB0b3BfdXBtICA9IChGVF9Mb25nKWZvbnQtPnRvcF9mb250LmZvbnRfZGljdC51bml0c19wZXJfZW07CisgICAgICBGVF9VSW50ICBpOwogCiAKICAgICAgIGZ1bmNzLT5zZXRfc2NhbGUoIGludGVybmFsLT50b3Bmb250LApAQCAtMzA5LDcgKzMwOSw3IEBACiAgICAgICBmb3IgKCBpID0gZm9udC0+bnVtX3N1YmZvbnRzOyBpID4gMDsgaS0tICkKICAgICAgIHsKICAgICAgICAgQ0ZGX1N1YkZvbnQgIHN1YiAgICAgPSBmb250LT5zdWJmb250c1tpIC0gMV07Ci0gICAgICAgIEZUX1VMb25nICAgICBzdWJfdXBtID0gc3ViLT5mb250X2RpY3QudW5pdHNfcGVyX2VtOworICAgICAgICBGVF9Mb25nICAgICAgc3ViX3VwbSA9IChGVF9Mb25nKXN1Yi0+Zm9udF9kaWN0LnVuaXRzX3Blcl9lbTsKICAgICAgICAgRlRfUG9zICAgICAgIHhfc2NhbGUsIHlfc2NhbGU7CiAKIApAQCAtMzQyLDcgKzM0Miw3IEBACiAgIEZUX0xPQ0FMX0RFRiggdm9pZCApCiAgIGNmZl9zbG90X2RvbmUoIEZUX0dseXBoU2xvdCAgc2xvdCApCiAgIHsKLSAgICBzbG90LT5pbnRlcm5hbC0+Z2x5cGhfaGludHMgPSAwOworICAgIHNsb3QtPmludGVybmFsLT5nbHlwaF9oaW50cyA9IE5VTEw7CiAgIH0KIAogCkBAIC01ODMsMTYgKzU4MywyMSBAQAogICAgICAgaWYgKCBlcnJvciApCiAgICAgICAgIGdvdG8gRXhpdDsKIAorICAgICAgLyogaWYgd2UgYXJlIHBlcmZvcm1pbmcgYSBzaW1wbGUgZm9udCBmb3JtYXQgY2hlY2ssIGV4aXQgaW1tZWRpYXRlbHkgKi8KKyAgICAgIC8qICh0aGlzIGlzIGhlcmUgZm9yIHB1cmUgQ0ZGKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBpZiAoIGZhY2VfaW5kZXggPCAwICkKKyAgICAgICAgcmV0dXJuIEZUX0Vycl9PazsKKwogICAgICAgY2ZmLT5wc2hpbnRlciA9IHBzaGludGVyOwogICAgICAgY2ZmLT5wc25hbWVzICA9IHBzbmFtZXM7CiAKLSAgICAgIGNmZmZhY2UtPmZhY2VfaW5kZXggPSBmYWNlX2luZGV4OworICAgICAgY2ZmZmFjZS0+ZmFjZV9pbmRleCA9IGZhY2VfaW5kZXggJiAweEZGRkY7CiAKICAgICAgIC8qIENvbXBsZW1lbnQgdGhlIHJvb3QgZmxhZ3Mgd2l0aCBzb21lIGludGVyZXN0aW5nIGluZm9ybWF0aW9uLiAqLwogICAgICAgLyogTm90ZSB0aGF0IHRoaXMgaXMgb25seSBuZWNlc3NhcnkgZm9yIHB1cmUgQ0ZGIGFuZCBDRUYgZm9udHM7ICovCiAgICAgICAvKiBTRk5UIGJhc2VkIGZvbnRzIHVzZSB0aGUgYG5hbWUnIHRhYmxlIGluc3RlYWQuICAgICAgICAgICAgICAgKi8KIAotICAgICAgY2ZmZmFjZS0+bnVtX2dseXBocyA9IGNmZi0+bnVtX2dseXBoczsKKyAgICAgIGNmZmZhY2UtPm51bV9nbHlwaHMgPSAoRlRfTG9uZyljZmYtPm51bV9nbHlwaHM7CiAKICAgICAgIGRpY3QgPSAmY2ZmLT50b3BfZm9udC5mb250X2RpY3Q7CiAKQEAgLTYyOSw3ICs2MzQsNyBAQAogICAgICAgaWYgKCAhZGljdC0+aGFzX2ZvbnRfbWF0cml4ICkKICAgICAgICAgZGljdC0+dW5pdHNfcGVyX2VtID0gcHVyZV9jZmYgPyAxMDAwIDogZmFjZS0+cm9vdC51bml0c19wZXJfRU07CiAKLSAgICAgIC8qIE5vcm1hbGl6ZSB0aGUgZm9udCBtYXRyaXggc28gdGhhdCBgbWF0cml4LT54eCcgaXMgMTsgdGhlICovCisgICAgICAvKiBOb3JtYWxpemUgdGhlIGZvbnQgbWF0cml4IHNvIHRoYXQgYG1hdHJpeC0+eXknIGlzIDE7IHRoZSAqLwogICAgICAgLyogc2NhbGluZyBpcyBkb25lIHdpdGggYHVuaXRzX3Blcl9lbScgdGhlbiAoYXQgdGhpcyBwb2ludCwgKi8KICAgICAgIC8qIGl0IGFscmVhZHkgY29udGFpbnMgdGhlIHNjYWxpbmcgZmFjdG9yLCBidXQgd2l0aG91dCAgICAgICovCiAgICAgICAvKiBub3JtYWxpemF0aW9uIG9mIHRoZSBtYXRyaXgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjQ2LDcgKzY1MSw3IEBACiAKICAgICAgICAgaWYgKCB0ZW1wICE9IDB4MTAwMDBMICkKICAgICAgICAgewotICAgICAgICAgICp1cG0gPSBGVF9EaXZGaXgoICp1cG0sIHRlbXAgKTsKKyAgICAgICAgICAqdXBtID0gKEZUX1VMb25nKUZUX0RpdkZpeCggKEZUX0xvbmcpKnVwbSwgdGVtcCApOwogCiAgICAgICAgICAgbWF0cml4LT54eCA9IEZUX0RpdkZpeCggbWF0cml4LT54eCwgdGVtcCApOwogICAgICAgICAgIG1hdHJpeC0+eXggPSBGVF9EaXZGaXgoIG1hdHJpeC0+eXgsIHRlbXAgKTsKQEAgLTY4Miw3ICs2ODcsOCBAQAogICAgICAgICAgIGlmICggdG9wLT5oYXNfZm9udF9tYXRyaXggKQogICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggdG9wLT51bml0c19wZXJfZW0gPiAxICYmIHN1Yi0+dW5pdHNfcGVyX2VtID4gMSApCi0gICAgICAgICAgICAgIHNjYWxpbmcgPSBGVF9NSU4oIHRvcC0+dW5pdHNfcGVyX2VtLCBzdWItPnVuaXRzX3Blcl9lbSApOworICAgICAgICAgICAgICBzY2FsaW5nID0gKEZUX0xvbmcpRlRfTUlOKCB0b3AtPnVuaXRzX3Blcl9lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLT51bml0c19wZXJfZW0gKTsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgc2NhbGluZyA9IDE7CiAKQEAgLTY5Myw5ICs2OTksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9wLT5mb250X21hdHJpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsaW5nICk7CiAKLSAgICAgICAgICAgIHN1Yi0+dW5pdHNfcGVyX2VtID0gRlRfTXVsRGl2KCBzdWItPnVuaXRzX3Blcl9lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AtPnVuaXRzX3Blcl9lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsaW5nICk7CisgICAgICAgICAgICBzdWItPnVuaXRzX3Blcl9lbSA9IChGVF9VTG9uZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxEaXYoIChGVF9Mb25nKXN1Yi0+dW5pdHNfcGVyX2VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpdG9wLT51bml0c19wZXJfZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsaW5nICk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UKQEAgLTcxMyw3ICs3MjAsNyBAQAogCiAgICAgICAgIGlmICggdGVtcCAhPSAweDEwMDAwTCApCiAgICAgICAgIHsKLSAgICAgICAgICAqdXBtID0gRlRfRGl2Rml4KCAqdXBtLCB0ZW1wICk7CisgICAgICAgICAgKnVwbSA9IChGVF9VTG9uZylGVF9EaXZGaXgoIChGVF9Mb25nKSp1cG0sIHRlbXAgKTsKIAogICAgICAgICAgIG1hdHJpeC0+eHggPSBGVF9EaXZGaXgoIG1hdHJpeC0+eHgsIHRlbXAgKTsKICAgICAgICAgICBtYXRyaXgtPnl4ID0gRlRfRGl2Rml4KCBtYXRyaXgtPnl4LCB0ZW1wICk7CkBAIC03MzMsMTMgKzc0MCwxMyBAQAogCiAKICAgICAgICAgLyogc2V0IHVwIG51bV9mYWNlcyAqLwotICAgICAgICBjZmZmYWNlLT5udW1fZmFjZXMgPSBjZmYtPm51bV9mYWNlczsKKyAgICAgICAgY2ZmZmFjZS0+bnVtX2ZhY2VzID0gKEZUX0xvbmcpY2ZmLT5udW1fZmFjZXM7CiAKICAgICAgICAgLyogY29tcHV0ZSBudW1iZXIgb2YgZ2x5cGhzICovCiAgICAgICAgIGlmICggZGljdC0+Y2lkX3JlZ2lzdHJ5ICE9IDB4RkZGRlUgKQotICAgICAgICAgIGNmZmZhY2UtPm51bV9nbHlwaHMgPSBjZmYtPmNoYXJzZXQubWF4X2NpZCArIDE7CisgICAgICAgICAgY2ZmZmFjZS0+bnVtX2dseXBocyA9IChGVF9Mb25nKSggY2ZmLT5jaGFyc2V0Lm1heF9jaWQgKyAxICk7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICBjZmZmYWNlLT5udW1fZ2x5cGhzID0gY2ZmLT5jaGFyc3RyaW5nc19pbmRleC5jb3VudDsKKyAgICAgICAgICBjZmZmYWNlLT5udW1fZ2x5cGhzID0gKEZUX0xvbmcpY2ZmLT5jaGFyc3RyaW5nc19pbmRleC5jb3VudDsKIAogICAgICAgICAvKiBzZXQgZ2xvYmFsIGJib3gsIGFzIHdlbGwgYXMgRU0gc2l6ZSAqLwogICAgICAgICBjZmZmYWNlLT5iYm94LnhNaW4gPSAgIGRpY3QtPmZvbnRfYmJveC54TWluICAgICAgICAgICAgPj4gMTY7CkBAIC03NjMsNyArNzcwLDkgQEAKICAgICAgICAgICAoRlRfU2hvcnQpKCBkaWN0LT51bmRlcmxpbmVfdGhpY2tuZXNzID4+IDE2ICk7CiAKICAgICAgICAgLyogcmV0cmlldmUgZm9udCBmYW1pbHkgJiBzdHlsZSBuYW1lICovCi0gICAgICAgIGNmZmZhY2UtPmZhbWlseV9uYW1lID0gY2ZmX2luZGV4X2dldF9uYW1lKCBjZmYsIGZhY2VfaW5kZXggKTsKKyAgICAgICAgY2ZmZmFjZS0+ZmFtaWx5X25hbWUgPSBjZmZfaW5kZXhfZ2V0X25hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludCkoIGZhY2VfaW5kZXggJiAweEZGRkYgKSApOwogICAgICAgICBpZiAoIGNmZmZhY2UtPmZhbWlseV9uYW1lICkKICAgICAgICAgewogICAgICAgICAgIGNoYXIqICBmdWxsICAgPSBjZmZfaW5kZXhfZ2V0X3NpZF9zdHJpbmcoIGNmZiwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2Zmb2Jqcy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZvYmpzLmgKaW5kZXggZGZiZjlhOS4uM2NjOTUzMSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZvYmpzLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZvYmpzLmgKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgT3BlblR5cGUgb2JqZWN0cyBtYW5hZ2VyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwNCwgMjAwNi0yMDA4LCAyMDEzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmcGFyc2UuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmcGFyc2UuYwppbmRleCA5MWJkNTMyLi4wNjNiMzUxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZnBhcnNlLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZwYXJzZS5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIENGRiB0b2tlbiBzdHJlYW0gcGFyc2VyIChib2R5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDQsIDIwMDctMjAxNCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC0xMjksNyArMTI5LDcgQEAKICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICBzY2FsaW5nICkKICAgewogICAgIEZUX0J5dGUqICBwID0gc3RhcnQ7Ci0gICAgRlRfVUludCAgIG5pYjsKKyAgICBGVF9JbnQgICAgbmliOwogICAgIEZUX1VJbnQgICBwaGFzZTsKIAogICAgIEZUX0xvbmcgICByZXN1bHQsIG51bWJlciwgZXhwb25lbnQ7CkBAIC0xNjYsNyArMTY2LDcgQEAKICAgICAgIH0KIAogICAgICAgLyogR2V0IHRoZSBuaWJibGUuICovCi0gICAgICBuaWIgICA9ICggcFswXSA+PiBwaGFzZSApICYgMHhGOworICAgICAgbmliICAgPSAoRlRfSW50KSggcFswXSA+PiBwaGFzZSApICYgMHhGOwogICAgICAgcGhhc2UgPSA0IC0gcGhhc2U7CiAKICAgICAgIGlmICggbmliID09IDB4RSApCkBAIC0xODgsNyArMTg4LDcgQEAKICAgICB9CiAKICAgICAvKiBSZWFkIGZyYWN0aW9uIHBhcnQsIGlmIGFueS4gKi8KLSAgICBpZiAoIG5pYiA9PSAweGEgKQorICAgIGlmICggbmliID09IDB4QSApCiAgICAgICBmb3IgKDs7KQogICAgICAgewogICAgICAgICAvKiBJZiB3ZSBlbnRlcmVkIHRoaXMgaXRlcmF0aW9uIHdpdGggcGhhc2UgPT0gNCwgd2UgbmVlZCAqLwpAQCAtNTU5LDcgKzU1OSw3IEBACiAgICAgICBvZmZzZXQtPnggID0gY2ZmX3BhcnNlX2ZpeGVkX3NjYWxlZCggZGF0YSsrLCBzY2FsaW5nICk7CiAgICAgICBvZmZzZXQtPnkgID0gY2ZmX3BhcnNlX2ZpeGVkX3NjYWxlZCggZGF0YSwgICBzY2FsaW5nICk7CiAKLSAgICAgICp1cG0gPSBwb3dlcl90ZW5zW3NjYWxpbmddOworICAgICAgKnVwbSA9IChGVF9VTG9uZylwb3dlcl90ZW5zW3NjYWxpbmddOwogCiAgICAgICBGVF9UUkFDRTQoKCAiIFslZiAlZiAlZiAlZiAlZiAlZl1cbiIsCiAgICAgICAgICAgICAgICAgICAoZG91YmxlKW1hdHJpeC0+eHggLyAqdXBtIC8gNjU1MzYsCkBAIC02MTcsMTQgKzYxNywzNCBAQAogCiAgICAgaWYgKCBwYXJzZXItPnRvcCA+PSBwYXJzZXItPnN0YWNrICsgMiApCiAgICAgewotICAgICAgZGljdC0+cHJpdmF0ZV9zaXplICAgPSBjZmZfcGFyc2VfbnVtKCBkYXRhKysgKTsKLSAgICAgIGRpY3QtPnByaXZhdGVfb2Zmc2V0ID0gY2ZmX3BhcnNlX251bSggZGF0YSAgICk7CisgICAgICBGVF9Mb25nICB0bXA7CisKKworICAgICAgdG1wID0gY2ZmX3BhcnNlX251bSggZGF0YSsrICk7CisgICAgICBpZiAoIHRtcCA8IDAgKQorICAgICAgeworICAgICAgICBGVF9FUlJPUigoICJjZmZfcGFyc2VfcHJpdmF0ZV9kaWN0OiBJbnZhbGlkIGRpY3Rpb25hcnkgc2l6ZVxuIiApKTsKKyAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOworICAgICAgICBnb3RvIEZhaWw7CisgICAgICB9CisgICAgICBkaWN0LT5wcml2YXRlX3NpemUgPSAoRlRfVUxvbmcpdG1wOworCisgICAgICB0bXAgPSBjZmZfcGFyc2VfbnVtKCBkYXRhICk7CisgICAgICBpZiAoIHRtcCA8IDAgKQorICAgICAgeworICAgICAgICBGVF9FUlJPUigoICJjZmZfcGFyc2VfcHJpdmF0ZV9kaWN0OiBJbnZhbGlkIGRpY3Rpb25hcnkgb2Zmc2V0XG4iICkpOworICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7CisgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgIH0KKyAgICAgIGRpY3QtPnByaXZhdGVfb2Zmc2V0ID0gKEZUX1VMb25nKXRtcDsKKwogICAgICAgRlRfVFJBQ0U0KCggIiAlbHUgJWx1XG4iLAogICAgICAgICAgICAgICAgICAgZGljdC0+cHJpdmF0ZV9zaXplLCBkaWN0LT5wcml2YXRlX29mZnNldCApKTsKIAogICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7CiAgICAgfQogCisgIEZhaWw6CiAgICAgcmV0dXJuIGVycm9yOwogICB9CiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmcGFyc2UuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmcGFyc2UuaAppbmRleCA2MWQ5MWVkLi44YWQwMmVhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZnBhcnNlLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZwYXJzZS5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIENGRiB0b2tlbiBzdHJlYW0gcGFyc2VyIChzcGVjaWZpY2F0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDMsIDIwMTEgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZnBpYy5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZwaWMuYwppbmRleCBmMjJlNGYwLi5kNDBkZWM1IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZnBpYy5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmcGljLmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgZm9yIGNmZiBtb2R1bGUuICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDksIDIwMTAsIDIwMTIsIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDA5LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBPcmFuIEFncmEgYW5kIE1pY2tleSBHYWJlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmcGljLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZnBpYy5oCmluZGV4IDUwYmFiNGMuLjlhMjIxYTcgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmcGljLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZwaWMuaApAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyBmb3IgY2ZmIG1vZHVsZS4gICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOSwgMjAxMiwgMjAxMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDktMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtMjAsOCArMjAsNiBAQAogI2RlZmluZSBfX0NGRlBJQ19IX18KIAogCi1GVF9CRUdJTl9IRUFERVIKLQogI2luY2x1ZGUgRlRfSU5URVJOQUxfUElDX0gKIAogCkBAIC00OSw2ICs0Nyw4IEBACiAjaW5jbHVkZSBGVF9TRVJWSUNFX1BST1BFUlRJRVNfSAogCiAKK0ZUX0JFR0lOX0hFQURFUgorCiAgIHR5cGVkZWYgc3RydWN0ICBDZmZNb2R1bGVQSUNfCiAgIHsKICAgICBGVF9TZXJ2aWNlRGVzY1JlYyogICAgICAgIGNmZl9zZXJ2aWNlczsKQEAgLTk2LDEyICs5NiwxMiBAQAogICBGVF9FcnJvcgogICBjZmZfZHJpdmVyX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7CiAKK0ZUX0VORF9IRUFERVIKKwogI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCiAKICAvKiAqLwogCi1GVF9FTkRfSEVBREVSCi0KICNlbmRpZiAvKiBfX0NGRlBJQ19IX18gKi8KIAogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZnRva2VuLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZnRva2VuLmgKaW5kZXggYmNiNDI3Ni4uNWIzMjA3NiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZ0b2tlbi5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmdG9rZW4uaApAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBDRkYgdG9rZW4gZGVmaW5pdGlvbnMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAzLCAyMDExIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZ0eXBlcy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZ0eXBlcy5oCmluZGV4IDg3Mjc0NDYuLmRlOGE1ZWUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmdHlwZXMuaAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZnR5cGVzLmgKQEAgLTUsNyArNSw3IEBACiAvKiAgICBCYXNpYyBPcGVuVHlwZS9DRkYgdHlwZSBkZWZpbml0aW9ucyBhbmQgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uICAgICAqLwogLyogICAgb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMywgMjAwNi0yMDA4LCAyMDEwLTIwMTEsIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvSmFtZmlsZSBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvSmFtZmlsZQppbmRleCBlYmVhZWQ1Li42NGUxNTIzIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL0phbWZpbGUKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC9KYW1maWxlCkBAIC0xLDYgKzEsNiBAQAogIyBGcmVlVHlwZSAyIHNyYy9jaWQgSmFtZmlsZQogIwotIyBDb3B5cmlnaHQgMjAwMSBieQorIyBDb3B5cmlnaHQgMjAwMS0yMDE1IGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKQEAgLTE2LDcgKzE2LDEyIEBACiAKICAgaWYgJChGVDJfTVVMVEkpCiAgIHsKLSAgICBfc291cmNlcyA9IGNpZG9ianMgY2lkbG9hZCBjaWRnbG9hZCBjaWRyaXZlciBjaWRwYXJzZSA7CisgICAgX3NvdXJjZXMgPSBjaWRnbG9hZAorICAgICAgICAgICAgICAgY2lkbG9hZAorICAgICAgICAgICAgICAgY2lkb2JqcworICAgICAgICAgICAgICAgY2lkcGFyc2UKKyAgICAgICAgICAgICAgIGNpZHJpdmVyCisgICAgICAgICAgICAgICA7CiAgIH0KICAgZWxzZQogICB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZGVycnMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkZXJycy5oCmluZGV4IGVmMTMxNTUuLjVlMGU3NzYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkZXJycy5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkZXJycy5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIENJRCBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLCAyMDEyIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwMS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZGdsb2FkLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZGdsb2FkLmMKaW5kZXggN2ZlYmFiOC4uZDAwNjc0ZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC9jaWRnbG9hZC5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkZ2xvYWQuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBDSUQta2V5ZWQgVHlwZTEgR2x5cGggTG9hZGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDA3LCAyMDA5LCAyMDEwLCAyMDEzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtNDQsMTAgKzQ0LDEwIEBACiAgICAgQ0lEX0ZhY2UgICAgICAgZmFjZSA9IChDSURfRmFjZSlkZWNvZGVyLT5idWlsZGVyLmZhY2U7CiAgICAgQ0lEX0ZhY2VJbmZvICAgY2lkICA9ICZmYWNlLT5jaWQ7CiAgICAgRlRfQnl0ZSogICAgICAgcDsKLSAgICBGVF9VSW50ICAgICAgICBmZF9zZWxlY3Q7CisgICAgRlRfVUxvbmcgICAgICAgZmRfc2VsZWN0OwogICAgIEZUX1N0cmVhbSAgICAgIHN0cmVhbSAgICAgICA9IGZhY2UtPmNpZF9zdHJlYW07CiAgICAgRlRfRXJyb3IgICAgICAgZXJyb3IgICAgICAgID0gRlRfRXJyX09rOwotICAgIEZUX0J5dGUqICAgICAgIGNoYXJzdHJpbmcgICA9IDA7CisgICAgRlRfQnl0ZSogICAgICAgY2hhcnN0cmluZyAgID0gTlVMTDsKICAgICBGVF9NZW1vcnkgICAgICBtZW1vcnkgICAgICAgPSBmYWNlLT5yb290Lm1lbW9yeTsKICAgICBGVF9VTG9uZyAgICAgICBnbHlwaF9sZW5ndGggPSAwOwogICAgIFBTQXV4X1NlcnZpY2UgIHBzYXV4ICAgICAgICA9IChQU0F1eF9TZXJ2aWNlKWZhY2UtPnBzYXV4OwpAQCAtNzUsMTEgKzc1LDExIEBACiAgICAgICAgIGdvdG8gRXhpdDsKIAogICAgICAgcCAgICAgICAgID0gKEZUX0J5dGUqKWdseXBoX2RhdGEucG9pbnRlcjsKLSAgICAgIGZkX3NlbGVjdCA9IChGVF9VSW50KWNpZF9nZXRfb2Zmc2V0KCAmcCwgKEZUX0J5dGUpY2lkLT5mZF9ieXRlcyApOworICAgICAgZmRfc2VsZWN0ID0gY2lkX2dldF9vZmZzZXQoICZwLCAoRlRfQnl0ZSljaWQtPmZkX2J5dGVzICk7CiAKICAgICAgIGlmICggZ2x5cGhfZGF0YS5sZW5ndGggIT0gMCApCiAgICAgICB7Ci0gICAgICAgIGdseXBoX2xlbmd0aCA9IGdseXBoX2RhdGEubGVuZ3RoIC0gY2lkLT5mZF9ieXRlczsKKyAgICAgICAgZ2x5cGhfbGVuZ3RoID0gKEZUX1VMb25nKSggZ2x5cGhfZGF0YS5sZW5ndGggLSBjaWQtPmZkX2J5dGVzICk7CiAgICAgICAgICh2b2lkKUZUX0FMTE9DKCBjaGFyc3RyaW5nLCBnbHlwaF9sZW5ndGggKTsKICAgICAgICAgaWYgKCAhZXJyb3IgKQogICAgICAgICAgIGZ0X21lbWNweSggY2hhcnN0cmluZywgZ2x5cGhfZGF0YS5wb2ludGVyICsgY2lkLT5mZF9ieXRlcywKQEAgLTk5LDcgKzk5LDcgQEAKICAgICAvKiBGb3Igb3JkaW5hcnkgZm9udHMgcmVhZCB0aGUgQ0lEIGZvbnQgZGljdGlvbmFyeSBpbmRleCAqLwogICAgIC8qIGFuZCBjaGFyc3RyaW5nIG9mZnNldCBmcm9tIHRoZSBDSURNYXAuICAgICAgICAgICAgICAgICovCiAgICAgewotICAgICAgRlRfVUludCAgIGVudHJ5X2xlbiA9IGNpZC0+ZmRfYnl0ZXMgKyBjaWQtPmdkX2J5dGVzOworICAgICAgRlRfVUludCAgIGVudHJ5X2xlbiA9IChGVF9VSW50KSggY2lkLT5mZF9ieXRlcyArIGNpZC0+Z2RfYnl0ZXMgKTsKICAgICAgIEZUX1VMb25nICBvZmYxOwogCiAKQEAgLTEwOSwxMyArMTA5LDEzIEBACiAgICAgICAgIGdvdG8gRXhpdDsKIAogICAgICAgcCAgICAgICAgICAgID0gKEZUX0J5dGUqKXN0cmVhbS0+Y3Vyc29yOwotICAgICAgZmRfc2VsZWN0ICAgID0gKEZUX1VJbnQpIGNpZF9nZXRfb2Zmc2V0KCAmcCwgKEZUX0J5dGUpY2lkLT5mZF9ieXRlcyApOwotICAgICAgb2ZmMSAgICAgICAgID0gKEZUX1VMb25nKWNpZF9nZXRfb2Zmc2V0KCAmcCwgKEZUX0J5dGUpY2lkLT5nZF9ieXRlcyApOworICAgICAgZmRfc2VsZWN0ICAgID0gY2lkX2dldF9vZmZzZXQoICZwLCAoRlRfQnl0ZSljaWQtPmZkX2J5dGVzICk7CisgICAgICBvZmYxICAgICAgICAgPSBjaWRfZ2V0X29mZnNldCggJnAsIChGVF9CeXRlKWNpZC0+Z2RfYnl0ZXMgKTsKICAgICAgIHAgICAgICAgICAgICs9IGNpZC0+ZmRfYnl0ZXM7CiAgICAgICBnbHlwaF9sZW5ndGggPSBjaWRfZ2V0X29mZnNldCggJnAsIChGVF9CeXRlKWNpZC0+Z2RfYnl0ZXMgKSAtIG9mZjE7CiAgICAgICBGVF9GUkFNRV9FWElUKCk7CiAKLSAgICAgIGlmICggZmRfc2VsZWN0ID49IChGVF9VSW50KWNpZC0+bnVtX2RpY3RzICkKKyAgICAgIGlmICggZmRfc2VsZWN0ID49IChGVF9VTG9uZyljaWQtPm51bV9kaWN0cyApCiAgICAgICB7CiAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfT2Zmc2V0ICk7CiAgICAgICAgIGdvdG8gRXhpdDsKQEAgLTEzMyw3ICsxMzMsNyBAQAogICAgIHsKICAgICAgIENJRF9GYWNlRGljdCAgZGljdDsKICAgICAgIENJRF9TdWJycyAgICAgY2lkX3N1YnJzID0gZmFjZS0+c3VicnMgKyBmZF9zZWxlY3Q7Ci0gICAgICBGVF9JbnQgICAgICAgIGNzX29mZnNldDsKKyAgICAgIEZUX1VJbnQgICAgICAgY3Nfb2Zmc2V0OwogCiAKICAgICAgIC8qIFNldCB1cCBzdWJycyAqLwpAQCAtMTUxLDcgKzE1MSw3IEBACiAgICAgICAvKiBEZWNvZGUgdGhlIGNoYXJzdHJpbmcuICovCiAKICAgICAgIC8qIEFkanVzdG1lbnQgZm9yIHNlZWQgYnl0ZXMuICovCi0gICAgICBjc19vZmZzZXQgPSAoIGRlY29kZXItPmxlbklWID49IDAgPyBkZWNvZGVyLT5sZW5JViA6IDAgKTsKKyAgICAgIGNzX29mZnNldCA9IGRlY29kZXItPmxlbklWID49IDAgPyAoRlRfVUludClkZWNvZGVyLT5sZW5JViA6IDA7CiAKICAgICAgIC8qIERlY3J5cHQgb25seSBpZiBsZW5JViA+PSAwLiAqLwogICAgICAgaWYgKCBkZWNvZGVyLT5sZW5JViA+PSAwICkKQEAgLTE1OSw3ICsxNTksNyBAQAogCiAgICAgICBlcnJvciA9IGRlY29kZXItPmZ1bmNzLnBhcnNlX2NoYXJzdHJpbmdzKAogICAgICAgICAgICAgICAgIGRlY29kZXIsIGNoYXJzdHJpbmcgKyBjc19vZmZzZXQsCi0gICAgICAgICAgICAgICAgKEZUX0ludClnbHlwaF9sZW5ndGggLSBjc19vZmZzZXQgKTsKKyAgICAgICAgICAgICAgICBnbHlwaF9sZW5ndGggLSBjc19vZmZzZXQgKTsKICAgICB9CiAKICAgICBGVF9GUkVFKCBjaGFyc3RyaW5nICk7CkBAIC0zNTcsNyArMzU3LDYgQEAKICAgICB7CiAgICAgICBGVF9CQm94ICAgICAgICAgICAgY2JveDsKICAgICAgIEZUX0dseXBoX01ldHJpY3MqICBtZXRyaWNzID0gJmNpZGdseXBoLT5tZXRyaWNzOwotICAgICAgRlRfVmVjdG9yICAgICAgICAgIGFkdmFuY2U7CiAKIAogICAgICAgLyogY29weSB0aGUgX3Vuc2NhbGVkXyBhZHZhbmNlIHdpZHRoICovCkBAIC0zNzcsMjIgKzM3NiwyNyBAQAogICAgICAgaWYgKCBjaWRzaXplLT5tZXRyaWNzLnlfcHBlbSA8IDI0ICkKICAgICAgICAgY2lkZ2x5cGgtPm91dGxpbmUuZmxhZ3MgfD0gRlRfT1VUTElORV9ISUdIX1BSRUNJU0lPTjsKIAotICAgICAgLyogYXBwbHkgdGhlIGZvbnQgbWF0cml4ICovCi0gICAgICBGVF9PdXRsaW5lX1RyYW5zZm9ybSggJmNpZGdseXBoLT5vdXRsaW5lLCAmZm9udF9tYXRyaXggKTsKKyAgICAgIC8qIGFwcGx5IHRoZSBmb250IG1hdHJpeCwgaWYgYW55ICovCisgICAgICBpZiAoIGZvbnRfbWF0cml4Lnh4ICE9IDB4MTAwMDBMIHx8IGZvbnRfbWF0cml4Lnl5ICE9IDB4MTAwMDBMIHx8CisgICAgICAgICAgIGZvbnRfbWF0cml4Lnh5ICE9IDAgICAgICAgIHx8IGZvbnRfbWF0cml4Lnl4ICE9IDAgICAgICAgICkKKyAgICAgIHsKKyAgICAgICAgRlRfT3V0bGluZV9UcmFuc2Zvcm0oICZjaWRnbHlwaC0+b3V0bGluZSwgJmZvbnRfbWF0cml4ICk7CiAKLSAgICAgIEZUX091dGxpbmVfVHJhbnNsYXRlKCAmY2lkZ2x5cGgtPm91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udF9vZmZzZXQueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X29mZnNldC55ICk7CisgICAgICAgIG1ldHJpY3MtPmhvcmlBZHZhbmNlID0gRlRfTXVsRml4KCBtZXRyaWNzLT5ob3JpQWR2YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRfbWF0cml4Lnh4ICk7CisgICAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlID0gRlRfTXVsRml4KCBtZXRyaWNzLT52ZXJ0QWR2YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRfbWF0cml4Lnl5ICk7CisgICAgICB9CiAKLSAgICAgIGFkdmFuY2UueCA9IG1ldHJpY3MtPmhvcmlBZHZhbmNlOwotICAgICAgYWR2YW5jZS55ID0gMDsKLSAgICAgIEZUX1ZlY3Rvcl9UcmFuc2Zvcm0oICZhZHZhbmNlLCAmZm9udF9tYXRyaXggKTsKLSAgICAgIG1ldHJpY3MtPmhvcmlBZHZhbmNlID0gYWR2YW5jZS54ICsgZm9udF9vZmZzZXQueDsKKyAgICAgIGlmICggZm9udF9vZmZzZXQueCB8fCBmb250X29mZnNldC55ICkKKyAgICAgIHsKKyAgICAgICAgRlRfT3V0bGluZV9UcmFuc2xhdGUoICZjaWRnbHlwaC0+b3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRfb2Zmc2V0LngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X29mZnNldC55ICk7CiAKLSAgICAgIGFkdmFuY2UueCA9IDA7Ci0gICAgICBhZHZhbmNlLnkgPSBtZXRyaWNzLT52ZXJ0QWR2YW5jZTsKLSAgICAgIEZUX1ZlY3Rvcl9UcmFuc2Zvcm0oICZhZHZhbmNlLCAmZm9udF9tYXRyaXggKTsKLSAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlID0gYWR2YW5jZS55ICsgZm9udF9vZmZzZXQueTsKKyAgICAgICAgbWV0cmljcy0+aG9yaUFkdmFuY2UgKz0gZm9udF9vZmZzZXQueDsKKyAgICAgICAgbWV0cmljcy0+dmVydEFkdmFuY2UgKz0gZm9udF9vZmZzZXQueTsKKyAgICAgIH0KIAogICAgICAgaWYgKCAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkgPT0gMCApCiAgICAgICB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZGdsb2FkLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZGdsb2FkLmgKaW5kZXggYTBhOTFiZi4uNGExMGNlNSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC9jaWRnbG9hZC5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkZ2xvYWQuaApAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBPcGVuVHlwZSBHbHlwaCBMb2FkZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDA0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC9jaWRsb2FkLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZGxvYWQuYwppbmRleCAxY2RhMGVlLi5lMjNiODJmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZGxvYWQuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZGxvYWQuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBDSUQta2V5ZWQgVHlwZTEgZm9udCBsb2FkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDA2LCAyMDA5LCAyMDExLTIwMTQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtMzgsNyArMzgsNyBAQAogCiAKICAgLyogcmVhZCBhIHNpbmdsZSBvZmZzZXQgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9Mb25nICkKKyAgRlRfTE9DQUxfREVGKCBGVF9VTG9uZyApCiAgIGNpZF9nZXRfb2Zmc2V0KCBGVF9CeXRlKiAgKnN0YXJ0LAogICAgICAgICAgICAgICAgICAgRlRfQnl0ZSAgICBvZmZzaXplICkKICAgewpAQCAtNTMsNyArNTMsNyBAQAogICAgIH0KIAogICAgICpzdGFydCA9IHA7Ci0gICAgcmV0dXJuIChGVF9Mb25nKXJlc3VsdDsKKyAgICByZXR1cm4gcmVzdWx0OwogICB9CiAKIApAQCAtMTY3LDYgKzE2Nyw3IEBACiAgICAgICBtYXRyaXggPSAmZGljdC0+Zm9udF9tYXRyaXg7CiAgICAgICBvZmZzZXQgPSAmZGljdC0+Zm9udF9vZmZzZXQ7CiAKKyAgICAgIC8qIGlucHV0IGlzIHNjYWxlZCBieSAxMDAwIHRvIGFjY29tbW9kYXRlIGRlZmF1bHQgRm9udE1hdHJpeCAqLwogICAgICAgcmVzdWx0ID0gY2lkX3BhcnNlcl90b19maXhlZF9hcnJheSggcGFyc2VyLCA2LCB0ZW1wLCAzICk7CiAKICAgICAgIGlmICggcmVzdWx0IDwgNiApCkBAIC0xODAsMTUgKzE4MSwxMiBAQAogICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKICAgICAgIH0KIAotICAgICAgLyogU2V0IFVuaXRzIHBlciBFTSBiYXNlZCBvbiBGb250TWF0cml4IHZhbHVlcy4gIFdlIHNldCB0aGUgdmFsdWUgdG8gKi8KLSAgICAgIC8qIDEwMDAgLyB0ZW1wX3NjYWxlLCBiZWNhdXNlIHRlbXBfc2NhbGUgd2FzIGFscmVhZHkgbXVsdGlwbGllZCBieSAgICovCi0gICAgICAvKiAxMDAwIChpbiB0MV90b2ZpeGVkLCBmcm9tIHBzb2Jqcy5jKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICByb290LT51bml0c19wZXJfRU0gPSAoRlRfVVNob3J0KUZUX0RpdkZpeCggMTAwMCwgdGVtcF9zY2FsZSApOwotCi0gICAgICAvKiB3ZSBuZWVkIHRvIHNjYWxlIHRoZSB2YWx1ZXMgYnkgMS4wL3RlbXBbM10gKi8KKyAgICAgIC8qIGF0eXBpY2FsIGNhc2UgKi8KICAgICAgIGlmICggdGVtcF9zY2FsZSAhPSAweDEwMDAwTCApCiAgICAgICB7CisgICAgICAgIC8qIHNldCB1bml0cyBwZXIgRU0gYmFzZWQgb24gRm9udE1hdHJpeCB2YWx1ZXMgKi8KKyAgICAgICAgcm9vdC0+dW5pdHNfcGVyX0VNID0gKEZUX1VTaG9ydClGVF9EaXZGaXgoIDEwMDAsIHRlbXBfc2NhbGUgKTsKKwogICAgICAgICB0ZW1wWzBdID0gRlRfRGl2Rml4KCB0ZW1wWzBdLCB0ZW1wX3NjYWxlICk7CiAgICAgICAgIHRlbXBbMV0gPSBGVF9EaXZGaXgoIHRlbXBbMV0sIHRlbXBfc2NhbGUgKTsKICAgICAgICAgdGVtcFsyXSA9IEZUX0RpdkZpeCggdGVtcFsyXSwgdGVtcF9zY2FsZSApOwpAQCAtMjIyLDYgKzIyMCwxMiBAQAogCiAKICAgICBudW1fZGljdHMgPSBjaWRfcGFyc2VyX3RvX2ludCggcGFyc2VyICk7CisgICAgaWYgKCBudW1fZGljdHMgPCAwICkKKyAgICB7CisgICAgICBGVF9FUlJPUigoICJwYXJzZV9mZF9hcnJheTogaW52YWxpZCBudW1iZXIgb2YgZGljdGlvbmFyaWVzXG4iICkpOworICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOworICAgICAgZ290byBFeGl0OworICAgIH0KIAogICAgIGlmICggIWNpZC0+Zm9udF9kaWN0cyApCiAgICAgewpAQCAtMjMxLDcgKzIzNSw3IEBACiAgICAgICBpZiAoIEZUX05FV19BUlJBWSggY2lkLT5mb250X2RpY3RzLCBudW1fZGljdHMgKSApCiAgICAgICAgIGdvdG8gRXhpdDsKIAotICAgICAgY2lkLT5udW1fZGljdHMgPSAoRlRfVUludCludW1fZGljdHM7CisgICAgICBjaWQtPm51bV9kaWN0cyA9IG51bV9kaWN0czsKIAogICAgICAgLyogZG9uJ3QgZm9yZ2V0IHRvIHNldCBhIGZldyBkZWZhdWx0cyAqLwogICAgICAgZm9yICggbiA9IDA7IG4gPCBjaWQtPm51bV9kaWN0czsgbisrICkKQEAgLTI5MCw3ICsyOTQsNyBAQAogICBjaWRfcGFyc2VfZGljdCggQ0lEX0ZhY2UgICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICBDSURfTG9hZGVyKiAgbG9hZGVyLAogICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgIGJhc2UsCi0gICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgc2l6ZSApCisgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgc2l6ZSApCiAgIHsKICAgICBDSURfUGFyc2VyKiAgcGFyc2VyID0gJmxvYWRlci0+cGFyc2VyOwogCkBAIC0zNDIsMTEgKzM0NiwxMSBAQAogICAgICAgICAvKiBsb29rIGZvciBpbW1lZGlhdGVzICovCiAgICAgICAgIGlmICggKmN1ciA9PSAnLycgJiYgY3VyICsgMiA8IGxpbWl0ICkKICAgICAgICAgewotICAgICAgICAgIEZUX1B0ckRpc3QgIGxlbjsKKyAgICAgICAgICBGVF9VSW50ICBsZW47CiAKIAogICAgICAgICAgIGN1cisrOwotICAgICAgICAgIGxlbiA9IHBhcnNlci0+cm9vdC5jdXJzb3IgLSBjdXI7CisgICAgICAgICAgbGVuID0gKEZUX1VJbnQpKCBwYXJzZXItPnJvb3QuY3Vyc29yIC0gY3VyICk7CiAKICAgICAgICAgICBpZiAoIGxlbiA+IDAgJiYgbGVuIDwgMjIgKQogICAgICAgICAgIHsKQEAgLTM2MywxMCArMzY3LDEwIEBACiAgICAgICAgICAgICAgIGlmICggIW5hbWUgKQogICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICAgIGlmICggY3VyWzBdID09IG5hbWVbMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgIGxlbiA9PSAoRlRfUHRyRGlzdClmdF9zdHJsZW4oIChjb25zdCBjaGFyKiluYW1lICkgKQorICAgICAgICAgICAgICBpZiAoIGN1clswXSA9PSBuYW1lWzBdICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgICAgICAgICBsZW4gPT0gZnRfc3RybGVuKCAoY29uc3QgY2hhciopbmFtZSApICkKICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZUX1B0ckRpc3QgIG47CisgICAgICAgICAgICAgICAgRlRfVUludCAgbjsKIAogCiAgICAgICAgICAgICAgICAgZm9yICggbiA9IDE7IG4gPCBsZW47IG4rKyApCkBAIC00MDcsNyArNDExLDcgQEAKICAgICBGVF9JbnQgICAgICAgICBuOwogICAgIENJRF9TdWJycyAgICAgIHN1YnI7CiAgICAgRlRfVUludCAgICAgICAgbWF4X29mZnNldHMgPSAwOwotICAgIEZUX1VMb25nKiAgICAgIG9mZnNldHMgPSAwOworICAgIEZUX1VMb25nKiAgICAgIG9mZnNldHMgPSBOVUxMOwogICAgIFBTQXV4X1NlcnZpY2UgIHBzYXV4ID0gKFBTQXV4X1NlcnZpY2UpZmFjZS0+cHNhdXg7CiAKIApAQCAtNDUwLDggKzQ1NCw4IEBACiAgICAgICB9CiAKICAgICAgIC8qIHJlYWQgdGhlIHN1YnJtYXAncyBvZmZzZXRzICovCi0gICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBjaWQtPmRhdGFfb2Zmc2V0ICsgZGljdC0+c3Vicm1hcF9vZmZzZXQgKSB8fAotICAgICAgICAgICBGVF9GUkFNRV9FTlRFUiggKCBudW1fc3VicnMgKyAxICkgKiBkaWN0LT5zZF9ieXRlcyApICAgICAgKQorICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggY2lkLT5kYXRhX29mZnNldCArIGRpY3QtPnN1YnJtYXBfb2Zmc2V0ICkgICAgIHx8CisgICAgICAgICAgIEZUX0ZSQU1FX0VOVEVSKCAoIG51bV9zdWJycyArIDEgKSAqIChGVF9VSW50KWRpY3QtPnNkX2J5dGVzICkgKQogICAgICAgICBnb3RvIEZhaWw7CiAKICAgICAgIHAgPSAoRlRfQnl0ZSopc3RyZWFtLT5jdXJzb3I7CkBAIC01MDAsNyArNTA0LDcgQEAKICAgICAgICAgfQogICAgICAgfQogCi0gICAgICBzdWJyLT5udW1fc3VicnMgPSBudW1fc3VicnM7CisgICAgICBzdWJyLT5udW1fc3VicnMgPSAoRlRfSW50KW51bV9zdWJyczsKICAgICB9CiAKICAgRXhpdDoKQEAgLTU0Niw3ICs1NTAsNyBAQAogCiAgIHN0YXRpYyBGVF9FcnJvcgogICBjaWRfaGV4X3RvX2JpbmFyeSggRlRfQnl0ZSogIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgZGF0YV9sZW4sCisgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgZGF0YV9sZW4sCiAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgQ0lEX0ZhY2UgIGZhY2UgKQogICB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZGxvYWQuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkbG9hZC5oCmluZGV4IDhjMTcyZmYuLmQ3Nzc2ZDIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkbG9hZC5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkbG9hZC5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIENJRC1rZXllZCBUeXBlMSBmb250IGxvYWRlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDMsIDIwMDQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC0zNiw3ICszNiw3IEBACiAgIH0gQ0lEX0xvYWRlcjsKIAogCi0gIEZUX0xPQ0FMKCBGVF9Mb25nICkKKyAgRlRfTE9DQUwoIEZUX1VMb25nICkKICAgY2lkX2dldF9vZmZzZXQoIEZUX0J5dGUqKiAgc3RhcnQsCiAgICAgICAgICAgICAgICAgICBGVF9CeXRlICAgIG9mZnNpemUgKTsKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC9jaWRvYmpzLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZG9ianMuYwppbmRleCA1OTMyZmZhLi5iZjE1MTliIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZG9ianMuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZG9ianMuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBDSUQgb2JqZWN0cyBtYW5hZ2VyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDA2LCAyMDA4LCAyMDEwLTIwMTEsIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtNDksNyArNDksNyBAQAogICBGVF9MT0NBTF9ERUYoIHZvaWQgKQogICBjaWRfc2xvdF9kb25lKCBGVF9HbHlwaFNsb3QgIHNsb3QgKQogICB7Ci0gICAgc2xvdC0+aW50ZXJuYWwtPmdseXBoX2hpbnRzID0gMDsKKyAgICBzbG90LT5pbnRlcm5hbC0+Z2x5cGhfaGludHMgPSBOVUxMOwogICB9CiAKIApAQCAtMTIyLDcgKzEyMiw3IEBACiAgICAgICBpZiAoIGZ1bmNzICkKICAgICAgICAgZnVuY3MtPmRlc3Ryb3koIChQU0hfR2xvYmFscyljaWRzaXplLT5pbnRlcm5hbCApOwogCi0gICAgICBjaWRzaXplLT5pbnRlcm5hbCA9IDA7CisgICAgICBjaWRzaXplLT5pbnRlcm5hbCA9IE5VTEw7CiAgICAgfQogICB9CiAKQEAgLTI0Myw4ICsyNDMsOCBAQAogICAgIEZUX0ZSRUUoIGNpZC0+cmVnaXN0cnkgKTsKICAgICBGVF9GUkVFKCBjaWQtPm9yZGVyaW5nICk7CiAKLSAgICBjaWRmYWNlLT5mYW1pbHlfbmFtZSA9IDA7Ci0gICAgY2lkZmFjZS0+c3R5bGVfbmFtZSAgPSAwOworICAgIGNpZGZhY2UtPmZhbWlseV9uYW1lID0gTlVMTDsKKyAgICBjaWRmYWNlLT5zdHlsZV9uYW1lICA9IE5VTEw7CiAKICAgICBGVF9GUkVFKCBmYWNlLT5iaW5hcnlfZGF0YSApOwogICAgIEZUX0ZSRUUoIGZhY2UtPmNpZF9zdHJlYW0gKTsKQEAgLTMzNCw3ICszMzQsNyBAQAogCiAgICAgLyogY2hlY2sgdGhlIGZhY2UgaW5kZXggKi8KICAgICAvKiBYWFg6IGhhbmRsZSBDSUQgZm9udHMgd2l0aCBtb3JlIHRoYW4gYSBzaW5nbGUgZmFjZSAqLwotICAgIGlmICggZmFjZV9pbmRleCAhPSAwICkKKyAgICBpZiAoICggZmFjZV9pbmRleCAmIDB4RkZGRiApICE9IDAgKQogICAgIHsKICAgICAgIEZUX0VSUk9SKCggImNpZF9mYWNlX2luaXQ6IGludmFsaWQgZmFjZSBpbmRleFxuIiApKTsKICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKQEAgLTM1MSwxMCArMzUxLDEwIEBACiAgICAgICBQU19Gb250SW5mbyAgIGluZm8gPSAmY2lkLT5mb250X2luZm87CiAKIAotICAgICAgY2lkZmFjZS0+bnVtX2dseXBocyAgID0gY2lkLT5jaWRfY291bnQ7CisgICAgICBjaWRmYWNlLT5udW1fZ2x5cGhzICAgPSAoRlRfTG9uZyljaWQtPmNpZF9jb3VudDsKICAgICAgIGNpZGZhY2UtPm51bV9jaGFybWFwcyA9IDA7CiAKLSAgICAgIGNpZGZhY2UtPmZhY2VfaW5kZXggPSBmYWNlX2luZGV4OworICAgICAgY2lkZmFjZS0+ZmFjZV9pbmRleCA9IGZhY2VfaW5kZXggJiAweEZGRkY7CiAKICAgICAgIGNpZGZhY2UtPmZhY2VfZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX1NDQUxBQkxFICAgfCAvKiBzY2FsYWJsZSBvdXRsaW5lcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GQUNFX0ZMQUdfSE9SSVpPTlRBTCB8IC8qIGhvcml6b250YWwgZGF0YSAgICovCkBAIC00MjEsNyArNDIxLDcgQEAKIAogICAgICAgLyogbm8gZW1iZWRkZWQgYml0bWFwIHN1cHBvcnQgKi8KICAgICAgIGNpZGZhY2UtPm51bV9maXhlZF9zaXplcyA9IDA7Ci0gICAgICBjaWRmYWNlLT5hdmFpbGFibGVfc2l6ZXMgPSAwOworICAgICAgY2lkZmFjZS0+YXZhaWxhYmxlX3NpemVzID0gTlVMTDsKIAogICAgICAgY2lkZmFjZS0+YmJveC54TWluID0gICBjaWQtPmZvbnRfYmJveC54TWluICAgICAgICAgICAgPj4gMTY7CiAgICAgICBjaWRmYWNlLT5iYm94LnlNaW4gPSAgIGNpZC0+Zm9udF9iYm94LnlNaW4gICAgICAgICAgICA+PiAxNjsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkb2Jqcy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC9jaWRvYmpzLmgKaW5kZXggYWVlMzQ2ZC4uZTkwOTVjYSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC9jaWRvYmpzLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC9jaWRvYmpzLmgKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgQ0lEIG9iamVjdHMgbWFuYWdlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwNCwgMjAwNiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkcGFyc2UuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkcGFyc2UuYwppbmRleCBkODQ3NmNkLi5jMjc2OTQ5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZHBhcnNlLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC9jaWRwYXJzZS5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIENJRC1rZXllZCBUeXBlMSBwYXJzZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDcsIDIwMDksIDIwMTMsIDIwMTQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC04NiwxMyArODYsMTMgQEAKICAgICAvKiBgU3RhcnREYXRhJyBvciBgL3NmbnRzJyAgICAgICAgICAgICAgICAgICAgICAqLwogICAgIHsKICAgICAgIEZUX0J5dGUgICBidWZmZXJbMjU2ICsgMTBdOwotICAgICAgRlRfTG9uZyAgIHJlYWRfbGVuID0gMjU2ICsgMTA7IC8qIHNhbWUgYXMgc2lnbmVkIEZUX1N0cmVhbS0+c2l6ZSAqLworICAgICAgRlRfVUxvbmcgIHJlYWRfbGVuID0gMjU2ICsgMTA7CiAgICAgICBGVF9CeXRlKiAgcCAgICAgICAgPSBidWZmZXI7CiAKIAogICAgICAgZm9yICggb2Zmc2V0ID0gRlRfU1RSRUFNX1BPUygpOyA7IG9mZnNldCArPSAyNTYgKQogICAgICAgewotICAgICAgICBGVF9Mb25nICBzdHJlYW1fbGVuOyAvKiBzYW1lIGFzIHNpZ25lZCBGVF9TdHJlYW0tPnNpemUgKi8KKyAgICAgICAgRlRfVUxvbmcgIHN0cmVhbV9sZW47CiAKIAogICAgICAgICBzdHJlYW1fbGVuID0gc3RyZWFtLT5zaXplIC0gRlRfU1RSRUFNX1BPUygpOwpAQCAtMTc2LDcgKzE3NiwxOCBAQAogICAgICAgaWYgKCBjdXJbMF0gPT0gJ1MnICYmIGZ0X3N0cm5jbXAoIChjaGFyKiljdXIsICJTdGFydERhdGEiLCA5ICkgPT0gMCApCiAgICAgICB7CiAgICAgICAgIGlmICggZnRfc3RybmNtcCggKGNoYXIqKWFyZzEsICIoSGV4KSIsIDUgKSA9PSAwICkKLSAgICAgICAgICBwYXJzZXItPmJpbmFyeV9sZW5ndGggPSBmdF9hdG9sKCAoY29uc3QgY2hhciAqKWFyZzIgKTsKKyAgICAgICAgeworICAgICAgICAgIEZUX0xvbmcgIHRtcCA9IGZ0X2F0b2woIChjb25zdCBjaGFyICopYXJnMiApOworCisKKyAgICAgICAgICBpZiAoIHRtcCA8IDAgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIEZUX0VSUk9SKCggImNpZF9wYXJzZXJfbmV3OiBpbnZhbGlkIGxlbmd0aCBvZiBoZXggZGF0YVxuIiApKTsKKyAgICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcGFyc2VyLT5iaW5hcnlfbGVuZ3RoID0gKEZUX1VMb25nKXRtcDsKKyAgICAgICAgfQogCiAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkcGFyc2UuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkcGFyc2UuaAppbmRleCBmMjdiZTY1Li5mNTgxYmI0IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZHBhcnNlLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC9jaWRwYXJzZS5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIENJRC1rZXllZCBUeXBlMSBwYXJzZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDQsIDIwMTQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC02NCwxMSArNjQsMTEgQEAKICAgICBGVF9TdHJlYW0gICAgIHN0cmVhbTsKIAogICAgIEZUX0J5dGUqICAgICAgcG9zdHNjcmlwdDsKLSAgICBGVF9Mb25nICAgICAgIHBvc3RzY3JpcHRfbGVuOworICAgIEZUX1VMb25nICAgICAgcG9zdHNjcmlwdF9sZW47CiAKICAgICBGVF9VTG9uZyAgICAgIGRhdGFfb2Zmc2V0OwogCi0gICAgRlRfTG9uZyAgICAgICBiaW5hcnlfbGVuZ3RoOworICAgIEZUX1VMb25nICAgICAgYmluYXJ5X2xlbmd0aDsKIAogICAgIENJRF9GYWNlSW5mbyAgY2lkOwogICAgIEZUX0ludCAgICAgICAgbnVtX2RpY3Q7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZHJpdmVyLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZHJpdmVyLmMKaW5kZXggNjEzMmEyNy4uMDdjNGNjNCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC9jaWRyaXZlci5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkcml2ZXIuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBDSUQgZHJpdmVyIGludGVyZmFjZSAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDA0LCAyMDA2LCAyMDA4LCAyMDA5LCAyMDExLCAyMDEzIGJ5ICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgImNpZGVycnMuaCIKIAogI2luY2x1ZGUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX05BTUVfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9YRlJFRTg2X05BTUVfSAorI2luY2x1ZGUgRlRfU0VSVklDRV9GT05UX0ZPUk1BVF9ICiAjaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfSU5GT19ICiAjaW5jbHVkZSBGVF9TRVJWSUNFX0NJRF9ICiAKQEAgLTE2OCw3ICsxNjgsNyBAQAogCiAgIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlRGVzY1JlYyAgY2lkX3NlcnZpY2VzW10gPQogICB7Ci0gICAgeyBGVF9TRVJWSUNFX0lEX1hGODZfTkFNRSwgICAgICAgICAgICBGVF9YRjg2X0ZPUk1BVF9DSUQgfSwKKyAgICB7IEZUX1NFUlZJQ0VfSURfRk9OVF9GT1JNQVQsICAgICAgICAgIEZUX0ZPTlRfRk9STUFUX0NJRCB9LAogICAgIHsgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0ZPTlRfTkFNRSwgJmNpZF9zZXJ2aWNlX3BzX25hbWUgfSwKICAgICB7IEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9JTkZPLCAgICAgICZjaWRfc2VydmljZV9wc19pbmZvIH0sCiAgICAgeyBGVF9TRVJWSUNFX0lEX0NJRCwgICAgICAgICAgICAgICAgICAmY2lkX3NlcnZpY2VfY2lkX2luZm8gfSwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkcml2ZXIuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkcml2ZXIuaAppbmRleCAzYzQ1ZTA2Li5lNWI4Njc4IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZHJpdmVyLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC9jaWRyaXZlci5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEhpZ2gtbGV2ZWwgQ0lEIGRyaXZlciBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZHRva2VuLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZHRva2VuLmgKaW5kZXggOTA0Y2IwOS4uODJlYWUwYyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC9jaWR0b2tlbi5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkdG9rZW4uaApAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBDSUQgdG9rZW4gZGVmaW5pdGlvbnMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDAzLCAyMDA2LCAyMDA4LCAyMDA5IGJ5ICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC90eXBlMWNpZC5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC90eXBlMWNpZC5jCmluZGV4IDBiODY2ZTkuLjBkNTRjYTcgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvdHlwZTFjaWQuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL3R5cGUxY2lkLmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgRnJlZVR5cGUgT3BlblR5cGUgZHJpdmVyIGNvbXBvbmVudCAoYm9keSBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC9KYW1maWxlIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L0phbWZpbGUKaW5kZXggZmFlZGVkOS4uNjc5M2YwZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L0phbWZpbGUKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L0phbWZpbGUKQEAgLTEsNiArMSw2IEBACiAjIEZyZWVUeXBlIDIgc3JjL3BzYXV4IEphbWZpbGUKICMKLSMgQ29weXJpZ2h0IDIwMDEsIDIwMDIgYnkKKyMgQ29weXJpZ2h0IDIwMDEtMjAxNSBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC0xNiw4ICsxNiwxMiBAQAogCiAgIGlmICQoRlQyX01VTFRJKQogICB7Ci0gICAgX3NvdXJjZXMgPSBwc2F1eG1vZCBwc29ianMgICB0MWRlY29kZSB0MWNtYXAKLSAgICAgICAgICAgICAgIHBzY29udiAgIGFmbXBhcnNlCisgICAgX3NvdXJjZXMgPSBhZm1wYXJzZQorICAgICAgICAgICAgICAgcHNhdXhtb2QKKyAgICAgICAgICAgICAgIHBzY29udgorICAgICAgICAgICAgICAgcHNvYmpzCisgICAgICAgICAgICAgICB0MWNtYXAKKyAgICAgICAgICAgICAgIHQxZGVjb2RlCiAgICAgICAgICAgICAgICA7CiAgIH0KICAgZWxzZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L2FmbXBhcnNlLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvYWZtcGFyc2UuYwppbmRleCA2YTQwZTExLi4zYWQ0NGVjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvYWZtcGFyc2UuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvYWZtcGFyc2UuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBBRk0gcGFyc2VyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNi0yMDEwLCAyMDEyLCAyMDEzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtNzUsOCArNzUsOCBAQAogI2RlZmluZSBBRk1fU1RSRUFNX0tFWV9CRUdJTiggc3RyZWFtICkgICAgXAogICAgICAgICAgIChjaGFyKikoIChzdHJlYW0pLT5jdXJzb3IgLSAxICkKIAotI2RlZmluZSBBRk1fU1RSRUFNX0tFWV9MRU4oIHN0cmVhbSwga2V5ICkgICAgICAgXAotICAgICAgICAgICggKGNoYXIqKShzdHJlYW0pLT5jdXJzb3IgLSBrZXkgLSAxICkKKyNkZWZpbmUgQUZNX1NUUkVBTV9LRVlfTEVOKCBzdHJlYW0sIGtleSApICAgICAgICAgICBcCisgICAgICAgICAgKEZUX09mZnNldCkoIChjaGFyKikoc3RyZWFtKS0+Y3Vyc29yIC0ga2V5IC0gMSApCiAKICNkZWZpbmUgQUZNX1NUQVRVU19FT0MoIHN0cmVhbSApIFwKICAgICAgICAgICAoIChzdHJlYW0pLT5zdGF0dXMgPj0gQUZNX1NUUkVBTV9TVEFUVVNfRU9DICkKQEAgLTM2OSwxMSArMzY5LDExIEBACiAgIEZUX0xPQ0FMX0RFRiggRlRfSW50ICkKICAgYWZtX3BhcnNlcl9yZWFkX3ZhbHMoIEFGTV9QYXJzZXIgIHBhcnNlciwKICAgICAgICAgICAgICAgICAgICAgICAgIEFGTV9WYWx1ZSAgIHZhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBuICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIG4gKQogICB7CiAgICAgQUZNX1N0cmVhbSAgc3RyZWFtID0gcGFyc2VyLT5zdHJlYW07CiAgICAgY2hhciogICAgICAgc3RyOwotICAgIEZUX1VJbnQgICAgIGk7CisgICAgRlRfSW50ICAgICAgaTsKIAogCiAgICAgaWYgKCBuID4gQUZNX01BWF9BUkdVTUVOVFMgKQpAQCAtNDQ2LDcgKzQ0Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIEZUX09mZnNldCogIGxlbiApCiAgIHsKICAgICBBRk1fU3RyZWFtICBzdHJlYW0gPSBwYXJzZXItPnN0cmVhbTsKLSAgICBjaGFyKiAgICAgICBrZXkgICAgPSAwOyAgLyogbWFrZSBzdHVwaWQgY29tcGlsZXIgaGFwcHkgKi8KKyAgICBjaGFyKiAgICAgICBrZXkgICAgPSBOVUxMOyAgLyogbWFrZSBzdHVwaWQgY29tcGlsZXIgaGFwcHkgKi8KIAogCiAgICAgaWYgKCBsaW5lICkKQEAgLTU2Miw3ICs1NjIsNyBAQAogICB9CiAKIAotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKKyAgc3RhdGljIEZUX0Vycm9yCiAgIGFmbV9wYXJzZXJfcmVhZF9pbnQoIEFGTV9QYXJzZXIgIHBhcnNlciwKICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50KiAgICAgYWludCApCiAgIHsKQEAgLTU5MCwxMSArNTkwLDE3IEBACiAgICAgY2hhciogICAgICAgICAga2V5OwogICAgIEZUX09mZnNldCAgICAgIGxlbjsKICAgICBpbnQgICAgICAgICAgICBuID0gLTE7CisgICAgRlRfSW50ICAgICAgICAgdG1wOwogCiAKLSAgICBpZiAoIGFmbV9wYXJzZXJfcmVhZF9pbnQoIHBhcnNlciwgJmZpLT5OdW1UcmFja0tlcm4gKSApCisgICAgaWYgKCBhZm1fcGFyc2VyX3JlYWRfaW50KCBwYXJzZXIsICZ0bXAgKSApCiAgICAgICAgIGdvdG8gRmFpbDsKIAorICAgIGlmICggdG1wIDwgMCApCisgICAgICBnb3RvIEZhaWw7CisKKyAgICBmaS0+TnVtVHJhY2tLZXJuID0gKEZUX1VJbnQpdG1wOworCiAgICAgaWYgKCBmaS0+TnVtVHJhY2tLZXJuICkKICAgICB7CiAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHBhcnNlci0+bWVtb3J5OwpAQCAtNjE1LDcgKzYyMSw3IEBACiAgICAgICBjYXNlIEFGTV9UT0tFTl9UUkFDS0tFUk46CiAgICAgICAgIG4rKzsKIAotICAgICAgICBpZiAoIG4gPj0gZmktPk51bVRyYWNrS2VybiApCisgICAgICAgIGlmICggbiA+PSAoaW50KWZpLT5OdW1UcmFja0tlcm4gKQogICAgICAgICAgIGdvdG8gRmFpbDsKIAogICAgICAgICB0ayA9IGZpLT5UcmFja0tlcm5zICsgbjsKQEAgLTYzOSw3ICs2NDUsNyBAQAogICAgICAgY2FzZSBBRk1fVE9LRU5fRU5EVFJBQ0tLRVJOOgogICAgICAgY2FzZSBBRk1fVE9LRU5fRU5ES0VSTkRBVEE6CiAgICAgICBjYXNlIEFGTV9UT0tFTl9FTkRGT05UTUVUUklDUzoKLSAgICAgICAgZmktPk51bVRyYWNrS2VybiA9IG4gKyAxOworICAgICAgICBmaS0+TnVtVHJhY2tLZXJuID0gKEZUX1VJbnQpKCBuICsgMSApOwogICAgICAgICByZXR1cm4gRlRfRXJyX09rOwogCiAgICAgICBjYXNlIEFGTV9UT0tFTl9VTktOT1dOOgpAQCAtNjg4LDExICs2OTQsMTcgQEAKICAgICBjaGFyKiAgICAgICAgIGtleTsKICAgICBGVF9PZmZzZXQgICAgIGxlbjsKICAgICBpbnQgICAgICAgICAgIG4gPSAtMTsKKyAgICBGVF9JbnQgICAgICAgIHRtcDsKIAogCi0gICAgaWYgKCBhZm1fcGFyc2VyX3JlYWRfaW50KCBwYXJzZXIsICZmaS0+TnVtS2VyblBhaXIgKSApCisgICAgaWYgKCBhZm1fcGFyc2VyX3JlYWRfaW50KCBwYXJzZXIsICZ0bXAgKSApCiAgICAgICBnb3RvIEZhaWw7CiAKKyAgICBpZiAoIHRtcCA8IDAgKQorICAgICAgZ290byBGYWlsOworCisgICAgZmktPk51bUtlcm5QYWlyID0gKEZUX1VJbnQpdG1wOworCiAgICAgaWYgKCBmaS0+TnVtS2VyblBhaXIgKQogICAgIHsKICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gcGFyc2VyLT5tZW1vcnk7CkBAIC03MjAsNyArNzMyLDcgQEAKIAogICAgICAgICAgIG4rKzsKIAotICAgICAgICAgIGlmICggbiA+PSBmaS0+TnVtS2VyblBhaXIgKQorICAgICAgICAgIGlmICggbiA+PSAoaW50KWZpLT5OdW1LZXJuUGFpciApCiAgICAgICAgICAgICBnb3RvIEZhaWw7CiAKICAgICAgICAgICBrcCA9IGZpLT5LZXJuUGFpcnMgKyBuOwpAQCAtNzMzLDggKzc0NSw5IEBACiAgICAgICAgICAgaWYgKCByIDwgMyApCiAgICAgICAgICAgICBnb3RvIEZhaWw7CiAKLSAgICAgICAgICBrcC0+aW5kZXgxID0gc2hhcmVkX3ZhbHNbMF0udS5pOwotICAgICAgICAgIGtwLT5pbmRleDIgPSBzaGFyZWRfdmFsc1sxXS51Lmk7CisgICAgICAgICAgLyogaW5kZXggdmFsdWVzIGNhbid0IGJlIG5lZ2F0aXZlICovCisgICAgICAgICAga3AtPmluZGV4MSA9IHNoYXJlZF92YWxzWzBdLnUudTsKKyAgICAgICAgICBrcC0+aW5kZXgyID0gc2hhcmVkX3ZhbHNbMV0udS51OwogICAgICAgICAgIGlmICggdG9rZW4gPT0gQUZNX1RPS0VOX0tQWSApCiAgICAgICAgICAgewogICAgICAgICAgICAga3AtPnggPSAwOwpAQCAtNzUyLDcgKzc2NSw3IEBACiAgICAgICBjYXNlIEFGTV9UT0tFTl9FTkRLRVJOUEFJUlM6CiAgICAgICBjYXNlIEFGTV9UT0tFTl9FTkRLRVJOREFUQToKICAgICAgIGNhc2UgQUZNX1RPS0VOX0VOREZPTlRNRVRSSUNTOgotICAgICAgICBmaS0+TnVtS2VyblBhaXIgPSBuICsgMTsKKyAgICAgICAgZmktPk51bUtlcm5QYWlyID0gKEZUX1VJbnQpKCBuICsgMSApOwogICAgICAgICBmdF9xc29ydCggZmktPktlcm5QYWlycywgZmktPk51bUtlcm5QYWlyLAogICAgICAgICAgICAgICAgICAgc2l6ZW9mICggQUZNX0tlcm5QYWlyUmVjICksCiAgICAgICAgICAgICAgICAgICBhZm1fY29tcGFyZV9rZXJuX3BhaXJzICk7CkBAIC04MTUsNyArODI4LDcgQEAKIAogICBzdGF0aWMgRlRfRXJyb3IKICAgYWZtX3BhcnNlcl9za2lwX3NlY3Rpb24oIEFGTV9QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZNX1Rva2VuICAgZW5kX3NlY3Rpb24gKQogICB7CiAgICAgY2hhciogICAgICBrZXk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvYWZtcGFyc2UuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC9hZm1wYXJzZS5oCmluZGV4IDM1ZDk2MDQuLmY5MjJjNGUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC9hZm1wYXJzZS5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC9hZm1wYXJzZS5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEFGTSBwYXJzZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA2IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwNi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC02MSw2ICs2MSw3IEBACiAgICAgICBjaGFyKiAgICAgczsKICAgICAgIEZUX0ZpeGVkICBmOwogICAgICAgRlRfSW50ICAgIGk7CisgICAgICBGVF9VSW50ICAgdTsKICAgICAgIEZUX0Jvb2wgICBiOwogCiAgICAgfSB1OwpAQCAtNzIsNyArNzMsNyBAQAogICBGVF9MT0NBTCggRlRfSW50ICkKICAgYWZtX3BhcnNlcl9yZWFkX3ZhbHMoIEFGTV9QYXJzZXIgIHBhcnNlciwKICAgICAgICAgICAgICAgICAgICAgICAgIEFGTV9WYWx1ZSAgIHZhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBuICk7CisgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICBuICk7CiAKICAgLyogcmVhZCB0aGUgbmV4dCBrZXkgZnJvbSB0aGUgbmV4dCBsaW5lIG9yIGNvbHVtbiAqLwogICBGVF9MT0NBTCggY2hhciogKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L3BzYXV4LmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvcHNhdXguYwppbmRleCBhNGI5YzVjLi43ZjFkOWFhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvcHNhdXguYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvcHNhdXguYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBGcmVlVHlwZSBhdXhpbGlhcnkgUG9zdFNjcmlwdCBkcml2ZXIgY29tcG9uZW50IChib2R5IG9ubHkpLiAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDA2IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L3BzYXV4ZXJyLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvcHNhdXhlcnIuaAppbmRleCBkNTIzNzVmLi45NzcxMmYwIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvcHNhdXhlcnIuaAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvcHNhdXhlcnIuaApAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBQUyBhdXhpbGlhcnkgbW9kdWxlIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMSwgMjAxMiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDEtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L3BzYXV4bW9kLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvcHNhdXhtb2QuYwppbmRleCA0YjEyNDlkLi4wNmZjYWIwIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvcHNhdXhtb2QuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvcHNhdXhtb2QuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBGcmVlVHlwZSBhdXhpbGlhcnkgUG9zdFNjcmlwdCBtb2R1bGUgaW1wbGVtZW50YXRpb24gKGJvZHkpLiAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDAxLCAyMDAyLCAyMDAzLCAyMDA2IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDAtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L3BzYXV4bW9kLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvcHNhdXhtb2QuaAppbmRleCAxMjE3MjM2Li5hZTZhOGY5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvcHNhdXhtb2QuaAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvcHNhdXhtb2QuaApAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBGcmVlVHlwZSBhdXhpbGlhcnkgUG9zdFNjcmlwdCBtb2R1bGUgaW1wbGVtZW50YXRpb24gKHNwZWNpZmljYXRpb24pLiAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDAxIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDAtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L3BzY29udi5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L3BzY29udi5jCmluZGV4IDc3OTJhNjIuLmFjYTc0MTIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC9wc2NvbnYuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvcHNjb252LmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgU29tZSBjb252ZW5pZW5jZSBjb252ZXJzaW9ucyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDYsIDIwMDgsIDIwMDksIDIwMTItMjAxMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDA2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KQEAgLTEyNCw3ICsxMjQsNyBAQAogICAgICAgaWYgKCBJU19QU19TUEFDRSggKnAgKSB8fCAqcCBPUCAweDgwICkKICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGMgPSBmdF9jaGFyX3RhYmxlWypwICYgMHg3Zl07CisgICAgICBjID0gZnRfY2hhcl90YWJsZVsqcCAmIDB4N0ZdOwogCiAgICAgICBpZiAoIGMgPCAwIHx8IGMgPj0gYmFzZSApCiAgICAgICAgIGJyZWFrOwpAQCAtMjQ1LDcgKzI0NSw3IEBACiAgICAgICAgIGlmICggSVNfUFNfU1BBQ0UoICpwICkgfHwgKnAgT1AgMHg4MCApCiAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgYyA9IGZ0X2NoYXJfdGFibGVbKnAgJiAweDdmXTsKKyAgICAgICAgYyA9IGZ0X2NoYXJfdGFibGVbKnAgJiAweDdGXTsKIAogICAgICAgICBpZiAoIGMgPCAwIHx8IGMgPj0gMTAgKQogICAgICAgICAgIGJyZWFrOwpAQCAtNDg5LDggKzQ4OSw4IEBACiAgICAgICBpZiAoIGMgT1AgMHg4MCApCiAgICAgICAgIGJyZWFrOwogCi0gICAgICBjID0gZnRfY2hhcl90YWJsZVtjICYgMHg3Rl07Ci0gICAgICBpZiAoICh1bnNpZ25lZCljID49IDE2ICkKKyAgICAgIGMgPSAoRlRfVUludClmdF9jaGFyX3RhYmxlW2MgJiAweDdGXTsKKyAgICAgIGlmICggYyA+PSAxNiApCiAgICAgICAgIGJyZWFrOwogCiAgICAgICBwYWQgPSAoIHBhZCA8PCA0ICkgfCBjOwpAQCAtNTIxLDcgKzUyMSw3IEBACiAgICAgICBpZiAoICpwIE9QIDB4ODAgKQogICAgICAgICBicmVhazsKIAotICAgICAgYyA9IGZ0X2NoYXJfdGFibGVbKnAgJiAweDdmXTsKKyAgICAgIGMgPSBmdF9jaGFyX3RhYmxlWypwICYgMHg3Rl07CiAKICAgICAgIGlmICggKHVuc2lnbmVkKWMgPj0gMTYgKQogICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC9wc2NvbnYuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC9wc2NvbnYuaAppbmRleCBkOTFjNzYyLi4xMGYxZmY3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvcHNjb252LmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L3BzY29udi5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFNvbWUgY29udmVuaWVuY2UgY29udmVyc2lvbnMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA2LCAyMDEyIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwNi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvcHNvYmpzLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvcHNvYmpzLmMKaW5kZXggN2VjM2I0Yy4uMWQzYzdlNiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L3Bzb2Jqcy5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC9wc29ianMuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBBdXhpbGlhcnkgZnVuY3Rpb25zIGZvciBQb3N0U2NyaXB0IGZvbnRzIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtODEsNyArODEsNyBAQAogICAgIHRhYmxlLT5tYXhfZWxlbXMgPSBjb3VudDsKICAgICB0YWJsZS0+aW5pdCAgICAgID0gMHhERUFEQkVFRlVMOwogICAgIHRhYmxlLT5udW1fZWxlbXMgPSAwOwotICAgIHRhYmxlLT5ibG9jayAgICAgPSAwOworICAgIHRhYmxlLT5ibG9jayAgICAgPSBOVUxMOwogICAgIHRhYmxlLT5jYXBhY2l0eSAgPSAwOwogICAgIHRhYmxlLT5jdXJzb3IgICAgPSAwOwogCkBAIC0xNjUsMTAgKzE2NSwxMCBAQAogICAvKiAgICByZWFsbG9jYXRpb24gZmFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBwc190YWJsZV9hZGQoIFBTX1RhYmxlICAgIHRhYmxlLAotICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIGlkeCwKLSAgICAgICAgICAgICAgICB2b2lkKiAgICAgICBvYmplY3QsCi0gICAgICAgICAgICAgICAgRlRfUHRyRGlzdCAgbGVuZ3RoICkKKyAgcHNfdGFibGVfYWRkKCBQU19UYWJsZSAgdGFibGUsCisgICAgICAgICAgICAgICAgRlRfSW50ICAgIGlkeCwKKyAgICAgICAgICAgICAgICB2b2lkKiAgICAgb2JqZWN0LAorICAgICAgICAgICAgICAgIEZUX1VJbnQgICBsZW5ndGggKQogICB7CiAgICAgaWYgKCBpZHggPCAwIHx8IGlkeCA+PSB0YWJsZS0+bWF4X2VsZW1zICkKICAgICB7CkBAIC0xNzYsMTIgKzE3Niw2IEBACiAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKICAgICB9CiAKLSAgICBpZiAoIGxlbmd0aCA8IDAgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggInBzX3RhYmxlX2FkZDogaW52YWxpZCBsZW5ndGhcbiIgKSk7Ci0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICB9Ci0KICAgICAvKiBncm93IHRoZSBiYXNlIGJsb2NrIGlmIG5lZWRlZCAqLwogICAgIGlmICggdGFibGUtPmN1cnNvciArIGxlbmd0aCA+IHRhYmxlLT5jYXBhY2l0eSApCiAgICAgewpAQCAtNjAwLDYgKzU5NCw5IEBACiAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7CiAgICAgfQogCisgICAgaWYgKCBjdXIgPiBsaW1pdCApCisgICAgICBjdXIgPSBsaW1pdDsKKwogICAgIHBhcnNlci0+ZXJyb3IgID0gZXJyb3I7CiAgICAgcGFyc2VyLT5jdXJzb3IgPSBjdXI7CiAgIH0KQEAgLTYyNSw4ICs2MjIsOCBAQAogCiAKICAgICB0b2tlbi0+dHlwZSAgPSBUMV9UT0tFTl9UWVBFX05PTkU7Ci0gICAgdG9rZW4tPnN0YXJ0ID0gMDsKLSAgICB0b2tlbi0+bGltaXQgPSAwOworICAgIHRva2VuLT5zdGFydCA9IE5VTEw7CisgICAgdG9rZW4tPmxpbWl0ID0gTlVMTDsKIAogICAgIC8qIGZpcnN0IG9mIGFsbCwgc2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KICAgICBwc19wYXJzZXJfc2tpcF9zcGFjZXMoIHBhcnNlciApOwpAQCAtNzA3LDcgKzcwNCw3IEBACiAKICAgICBpZiAoICF0b2tlbi0+bGltaXQgKQogICAgIHsKLSAgICAgIHRva2VuLT5zdGFydCA9IDA7CisgICAgICB0b2tlbi0+c3RhcnQgPSBOVUxMOwogICAgICAgdG9rZW4tPnR5cGUgID0gVDFfVE9LRU5fVFlQRV9OT05FOwogICAgIH0KIApAQCAtOTMyLDcgKzkyOSw3IEBACiAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSApCiAgIHsKICAgICBGVF9CeXRlKiAgICBjdXIgPSAqY3Vyc29yOwotICAgIEZUX1B0ckRpc3QgIGxlbiA9IDA7CisgICAgRlRfVUludCAgICAgbGVuID0gMDsKICAgICBGVF9JbnQgICAgICBjb3VudDsKICAgICBGVF9TdHJpbmcqICByZXN1bHQ7CiAgICAgRlRfRXJyb3IgICAgZXJyb3I7CkBAIC05NzIsNyArOTY5LDcgQEAKICAgICAgIH0KICAgICB9CiAKLSAgICBsZW4gPSBjdXIgLSAqY3Vyc29yOworICAgIGxlbiA9IChGVF9VSW50KSggY3VyIC0gKmN1cnNvciApOwogICAgIGlmICggY3VyID49IGxpbWl0IHx8IEZUX0FMTE9DKCByZXN1bHQsIGxlbiArIDEgKSApCiAgICAgICByZXR1cm4gMDsKIApAQCAtMTIzMCwyMCArMTIyNywyMiBAQAogCiAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCA0OyBpKysgKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHBzX3RvZml4ZWRhcnJheSggJmN1ciwgbGltaXQsIG1heF9vYmplY3RzLAorICAgICAgICAgICAgcmVzdWx0ID0gcHNfdG9maXhlZGFycmF5KCAmY3VyLCBsaW1pdCwgKEZUX0ludCltYXhfb2JqZWN0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCArIGkgKiBtYXhfb2JqZWN0cywgMCApOwogICAgICAgICAgICAgaWYgKCByZXN1bHQgPCAwIHx8IChGVF9VSW50KXJlc3VsdCA8IG1heF9vYmplY3RzICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgRlRfRVJST1IoKCAicHNfcGFyc2VyX2xvYWRfZmllbGQ6IgotICAgICAgICAgICAgICAgICAgICAgICAgICIgZXhwZWN0ZWQgJWQgaW50ZWdlcnMgaW4gdGhlICVzIHN1YmFycmF5XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIiBleHBlY3RlZCAlZCBpbnRlZ2VyJXMgaW4gdGhlICVzIHN1YmFycmF5XG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICIKICAgICAgICAgICAgICAgICAgICAgICAgICAiIG9mIC9Gb250QkJveCBpbiB0aGUgL0JsZW5kIGRpY3Rpb25hcnlcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4X29iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X29iamVjdHMsIG1heF9vYmplY3RzID4gMSA/ICJzIiA6ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGkgPT0gMCA/ICJmaXJzdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoIGkgPT0gMSA/ICJzZWNvbmQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoIGkgPT0gMiA/ICJ0aGlyZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogImZvdXJ0aCIgKSApICkpOwogICAgICAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7CisKKyAgICAgICAgICAgICAgRlRfRlJFRSggdGVtcCApOwogICAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgICAgICB9CiAKQEAgLTEzMjEsNyArMTMyMCw3IEBACiAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogICAgIGlmICggKEZUX1VJbnQpbnVtX2VsZW1lbnRzID4gZmllbGQtPmFycmF5X21heCApCi0gICAgICBudW1fZWxlbWVudHMgPSBmaWVsZC0+YXJyYXlfbWF4OworICAgICAgbnVtX2VsZW1lbnRzID0gKEZUX0ludClmaWVsZC0+YXJyYXlfbWF4OwogCiAgICAgb2xkX2N1cnNvciA9IHBhcnNlci0+Y3Vyc29yOwogICAgIG9sZF9saW1pdCAgPSBwYXJzZXItPmxpbWl0OwpAQCAtMTM3OSw3ICsxMzc4LDcgQEAKICAgcHNfcGFyc2VyX3RvX2J5dGVzKCBQU19QYXJzZXIgIHBhcnNlciwKICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ5dGVzLAogICAgICAgICAgICAgICAgICAgICAgIEZUX09mZnNldCAgbWF4X2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgcG51bV9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIHBudW1fYnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICBkZWxpbWl0ZXJzICkKICAgewogICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKQEAgLTE1NTMsNyArMTU1Miw3IEBACiAgICAgICBGVF9HbHlwaExvYWRlcl9SZXdpbmQoIGxvYWRlciApOwogCiAgICAgICBidWlsZGVyLT5oaW50c19nbG9iYWxzID0gc2l6ZS0+aW50ZXJuYWw7Ci0gICAgICBidWlsZGVyLT5oaW50c19mdW5jcyAgID0gMDsKKyAgICAgIGJ1aWxkZXItPmhpbnRzX2Z1bmNzICAgPSBOVUxMOwogCiAgICAgICBpZiAoIGhpbnRpbmcgKQogICAgICAgICBidWlsZGVyLT5oaW50c19mdW5jcyA9IGdseXBoLT5pbnRlcm5hbC0+Z2x5cGhfaGludHM7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvcHNvYmpzLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvcHNvYmpzLmgKaW5kZXggZTM4MGM2MC4uYmY4NzljMSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L3Bzb2Jqcy5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC9wc29ianMuaApAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBBdXhpbGlhcnkgZnVuY3Rpb25zIGZvciBQb3N0U2NyaXB0IGZvbnRzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDAzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtNTIsMTAgKzUyLDEwIEBACiAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKTsKIAogICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBwc190YWJsZV9hZGQoIFBTX1RhYmxlICAgIHRhYmxlLAotICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIGlkeCwKLSAgICAgICAgICAgICAgICB2b2lkKiAgICAgICBvYmplY3QsCi0gICAgICAgICAgICAgICAgRlRfUHRyRGlzdCAgbGVuZ3RoICk7CisgIHBzX3RhYmxlX2FkZCggUFNfVGFibGUgIHRhYmxlLAorICAgICAgICAgICAgICAgIEZUX0ludCAgICBpZHgsCisgICAgICAgICAgICAgICAgdm9pZCogICAgIG9iamVjdCwKKyAgICAgICAgICAgICAgICBGVF9VSW50ICAgbGVuZ3RoICk7CiAKICAgRlRfTE9DQUwoIHZvaWQgKQogICBwc190YWJsZV9kb25lKCBQU19UYWJsZSAgdGFibGUgKTsKQEAgLTExMiw3ICsxMTIsNyBAQAogICBwc19wYXJzZXJfdG9fYnl0ZXMoIFBTX1BhcnNlciAgcGFyc2VyLAogICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgYnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgRlRfT2Zmc2V0ICBtYXhfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogICBwbnVtX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgcG51bV9ieXRlcywKICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgIGRlbGltaXRlcnMgKTsKIAogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvdDFjbWFwLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvdDFjbWFwLmMKaW5kZXggZmIxMzUzYS4uMmUyZDQzMyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L3QxY21hcC5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC90MWNtYXAuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBUeXBlIDEgY2hhcmFjdGVyIG1hcCBzdXBwb3J0IChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMiwgMjAwMywgMjAwNiwgMjAwNywgMjAxMiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDItMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtMzksNyArMzksNyBAQAogICAgIEZUX1NlcnZpY2VfUHNDTWFwcyAgcHNuYW1lcyA9IChGVF9TZXJ2aWNlX1BzQ01hcHMpZmFjZS0+cHNuYW1lczsKIAogCi0gICAgY21hcC0+bnVtX2dseXBocyAgICA9IGZhY2UtPnR5cGUxLm51bV9nbHlwaHM7CisgICAgY21hcC0+bnVtX2dseXBocyAgICA9IChGVF9VSW50KWZhY2UtPnR5cGUxLm51bV9nbHlwaHM7CiAgICAgY21hcC0+Z2x5cGhfbmFtZXMgICA9IChjb25zdCBjaGFyKiBjb25zdCopZmFjZS0+dHlwZTEuZ2x5cGhfbmFtZXM7CiAgICAgY21hcC0+c2lkX3RvX3N0cmluZyA9IHBzbmFtZXMtPmFkb2JlX3N0ZF9zdHJpbmdzOwogICAgIGNtYXAtPmNvZGVfdG9fc2lkICAgPSBpc19leHBlcnQgPyBwc25hbWVzLT5hZG9iZV9leHBlcnRfZW5jb2RpbmcKQEAgLTE4OSw4ICsxODksOCBAQAogICAgIEZUX1VOVVNFRCggcG9pbnRlciApOwogCiAKLSAgICBjbWFwLT5maXJzdCAgID0gZW5jb2RpbmctPmNvZGVfZmlyc3Q7Ci0gICAgY21hcC0+Y291bnQgICA9IChGVF9VSW50KSggZW5jb2RpbmctPmNvZGVfbGFzdCAtIGNtYXAtPmZpcnN0ICk7CisgICAgY21hcC0+Zmlyc3QgICA9IChGVF9VSW50KWVuY29kaW5nLT5jb2RlX2ZpcnN0OworICAgIGNtYXAtPmNvdW50ICAgPSAoRlRfVUludCllbmNvZGluZy0+Y29kZV9sYXN0IC0gY21hcC0+Zmlyc3Q7CiAgICAgY21hcC0+aW5kaWNlcyA9IGVuY29kaW5nLT5jaGFyX2luZGV4OwogCiAgICAgRlRfQVNTRVJUKCBjbWFwLT5pbmRpY2VzICE9IE5VTEwgKTsKQEAgLTI5NSw3ICsyOTUsNyBAQAogCiAgICAgcmV0dXJuIHBzbmFtZXMtPnVuaWNvZGVzX2luaXQoIG1lbW9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnR5cGUxLm51bV9nbHlwaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50KWZhY2UtPnR5cGUxLm51bV9nbHlwaHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQU19HZXRHbHlwaE5hbWVGdW5jKSZwc2F1eF9nZXRfZ2x5cGhfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBTX0ZyZWVHbHlwaE5hbWVGdW5jKU5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Qb2ludGVyKWZhY2UgKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC90MWNtYXAuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC90MWNtYXAuaAppbmRleCA3YWU2NWQyLi5iOGJhMDZjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvdDFjbWFwLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L3QxY21hcC5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFR5cGUgMSBjaGFyYWN0ZXIgbWFwIHN1cHBvcnQgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLCAyMDAzLCAyMDA2IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwMi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvdDFkZWNvZGUuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC90MWRlY29kZS5jCmluZGV4IGQ2N2EwNWUuLjJlMTk5MjggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC90MWRlY29kZS5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC90MWRlY29kZS5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFBvc3RTY3JpcHQgVHlwZSAxIGRlY29kaW5nIHJvdXRpbmVzIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAwLTIwMTQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwMC0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC0xNTAsNyArMTUwLDcgQEAKICAgICAgIGlmICggbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgogICAgICAgICAgICBuYW1lWzBdID09IGdseXBoX25hbWVbMF0gICAgICAgICAgICYmCiAgICAgICAgICAgIGZ0X3N0cmNtcCggbmFtZSwgZ2x5cGhfbmFtZSApID09IDAgKQotICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgcmV0dXJuIChGVF9JbnQpbjsKICAgICB9CiAKICAgICByZXR1cm4gLTE7CkBAIC0yOTgsNyArMjk4LDcgQEAKIAogICAgIC8qIHRoZSBzZWFjIG9wZXJhdG9yIG11c3Qgbm90IGJlIG5lc3RlZCAqLwogICAgIGRlY29kZXItPnNlYWMgPSBUUlVFOwotICAgIGVycm9yID0gdDFfZGVjb2Rlcl9wYXJzZV9nbHlwaCggZGVjb2RlciwgYmNoYXJfaW5kZXggKTsKKyAgICBlcnJvciA9IHQxX2RlY29kZXJfcGFyc2VfZ2x5cGgoIGRlY29kZXIsIChGVF9VSW50KWJjaGFyX2luZGV4ICk7CiAgICAgZGVjb2Rlci0+c2VhYyA9IEZBTFNFOwogICAgIGlmICggZXJyb3IgKQogICAgICAgZ290byBFeGl0OwpAQCAtMzIwLDcgKzMyMCw3IEBACiAKICAgICAvKiB0aGUgc2VhYyBvcGVyYXRvciBtdXN0IG5vdCBiZSBuZXN0ZWQgKi8KICAgICBkZWNvZGVyLT5zZWFjID0gVFJVRTsKLSAgICBlcnJvciA9IHQxX2RlY29kZXJfcGFyc2VfZ2x5cGgoIGRlY29kZXIsIGFjaGFyX2luZGV4ICk7CisgICAgZXJyb3IgPSB0MV9kZWNvZGVyX3BhcnNlX2dseXBoKCBkZWNvZGVyLCAoRlRfVUludClhY2hhcl9pbmRleCApOwogICAgIGRlY29kZXItPnNlYWMgPSBGQUxTRTsKICAgICBpZiAoIGVycm9yICkKICAgICAgIGdvdG8gRXhpdDsKQEAgLTM4MSwxMCArMzgxLDEwIEBACiAKIAogICAgIC8qIGNvbXB1dGUgcmFuZG9tIHNlZWQgZnJvbSBzdGFjayBhZGRyZXNzIG9mIHBhcmFtZXRlciAqLwotICAgIHNlZWQgPSAoRlRfRml4ZWQpKCAoIChGVF9QdHJEaXN0KShjaGFyKikmc2VlZCAgICAgICAgICAgICAgXgotICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9QdHJEaXN0KShjaGFyKikmZGVjb2RlciAgICAgICAgICAgXgotICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9QdHJEaXN0KShjaGFyKikmY2hhcnN0cmluZ19iYXNlICkgJgotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMT05HX01BWCApIDsKKyAgICBzZWVkID0gKEZUX0ZpeGVkKSggKCAoRlRfT2Zmc2V0KShjaGFyKikmc2VlZCAgICAgICAgICAgIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfT2Zmc2V0KShjaGFyKikmZGVjb2RlciAgICAgICAgIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfT2Zmc2V0KShjaGFyKikmY2hhcnN0cmluZ19iYXNlICkgJgorICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMT05HX01BWCAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgIHNlZWQgPSAoIHNlZWQgXiAoIHNlZWQgPj4gMTAgKSBeICggc2VlZCA+PiAyMCApICkgJiAweEZGRkZMOwogICAgIGlmICggc2VlZCA9PSAwICkKICAgICAgIHNlZWQgPSAweDczODQ7CkBAIC03OTYsNyArNzk2LDggQEAKICAgICAgICAgICBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9IDE7CiAKICAgICAgICAgICBpZiAoIGhpbnRlciApCi0gICAgICAgICAgICBoaW50ZXItPnJlc2V0KCBoaW50ZXItPmhpbnRzLCBidWlsZGVyLT5jdXJyZW50LT5uX3BvaW50cyApOworICAgICAgICAgICAgaGludGVyLT5yZXNldCggaGludGVyLT5oaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50KWJ1aWxkZXItPmN1cnJlbnQtPm5fcG9pbnRzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAxMjoKQEAgLTg2MSw3ICs4NjIsNyBAQAogICAgICAgICAgICAgICAqdmFsdWVzKysgPSB0bXA7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGtub3duX290aGVyc3Vicl9yZXN1bHRfY250ID0gbnVtX3BvaW50czsKKyAgICAgICAgICAgIGtub3duX290aGVyc3Vicl9yZXN1bHRfY250ID0gKEZUX0ludCludW1fcG9pbnRzOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgfQogCkBAIC04NzksOCArODgwLDggQEAKIAogICAgICAgICAgICAgaWR4ID0gRml4MkludCggdG9wWzBdICk7CiAKLSAgICAgICAgICAgIGlmICggaWR4IDwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICBpZHggKyBibGVuZC0+bnVtX2Rlc2lnbnMgPiBkZWNvZGVyLT5sZW5fYnVpbGRjaGFyICkKKyAgICAgICAgICAgIGlmICggaWR4IDwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgICAgICAoRlRfVUludClpZHggKyBibGVuZC0+bnVtX2Rlc2lnbnMgPiBkZWNvZGVyLT5sZW5fYnVpbGRjaGFyICkKICAgICAgICAgICAgICAgZ290byBVbmV4cGVjdGVkX090aGVyU3VicjsKIAogICAgICAgICAgICAgZnRfbWVtY3B5KCAmZGVjb2Rlci0+YnVpbGRjaGFyW2lkeF0sCkBAIC0xMDk0LDcgKzEwOTUsOCBAQAogICAgICAgICAgIC8qIGNsb3NlIGhpbnRzIHJlY29yZGluZyBzZXNzaW9uICovCiAgICAgICAgICAgaWYgKCBoaW50ZXIgKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggaGludGVyLT5jbG9zZSggaGludGVyLT5oaW50cywgYnVpbGRlci0+Y3VycmVudC0+bl9wb2ludHMgKSApCisgICAgICAgICAgICBpZiAoIGhpbnRlci0+Y2xvc2UoIGhpbnRlci0+aGludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50KWJ1aWxkZXItPmN1cnJlbnQtPm5fcG9pbnRzICkgKQogICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKIAogICAgICAgICAgICAgLyogYXBwbHkgaGludHMgdG8gdGhlIGxvYWRlZCBnbHlwaCBvdXRsaW5lIG5vdyAqLwpAQCAtMTM0Niw3ICsxMzQ4LDcgQEAKICAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgY2FsbHN1YnIiICkpOwogCiAgICAgICAgICAgICBpZHggPSBGaXgySW50KCB0b3BbMF0gKTsKLSAgICAgICAgICAgIGlmICggaWR4IDwgMCB8fCBpZHggPj0gKEZUX0ludClkZWNvZGVyLT5udW1fc3VicnMgKQorICAgICAgICAgICAgaWYgKCBpZHggPCAwIHx8IGlkeCA+PSBkZWNvZGVyLT5udW1fc3VicnMgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiIKICAgICAgICAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgc3VicnMgaW5kZXhcbiIgKSk7CkBAIC0xNTc5LDcgKzE1ODEsNyBAQAogCiAgICAgLyogcmV0cmlldmUgUFNOYW1lcyBpbnRlcmZhY2UgZnJvbSBsaXN0IG9mIGN1cnJlbnQgbW9kdWxlcyAqLwogICAgIHsKLSAgICAgIEZUX1NlcnZpY2VfUHNDTWFwcyAgcHNuYW1lcyA9IDA7CisgICAgICBGVF9TZXJ2aWNlX1BzQ01hcHMgIHBzbmFtZXM7CiAKIAogICAgICAgRlRfRkFDRV9GSU5EX0dMT0JBTF9TRVJWSUNFKCBmYWNlLCBwc25hbWVzLCBQT1NUU0NSSVBUX0NNQVBTICk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvdDFkZWNvZGUuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC90MWRlY29kZS5oCmluZGV4IDAwNzI4ZGIuLmU4MzA3OGYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC90MWRlY29kZS5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC90MWRlY29kZS5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFBvc3RTY3JpcHQgVHlwZSAxIGRlY29kaW5nIHJvdXRpbmVzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAwLTIwMDEsIDIwMDIsIDIwMDMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwMC0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNoaW50ZXIvSmFtZmlsZSBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9KYW1maWxlCmluZGV4IDc3OWYxYjAuLjZmYjNiZTEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9KYW1maWxlCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9KYW1maWxlCkBAIC0xLDYgKzEsNiBAQAogIyBGcmVlVHlwZSAyIHNyYy9wc2hpbnRlciBKYW1maWxlCiAjCi0jIENvcHlyaWdodCAyMDAxLCAyMDAzIGJ5CisjIENvcHlyaWdodCAyMDAxLTIwMTUgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApAQCAtMTYsNyArMTYsMTIgQEAKIAogICBpZiAkKEZUMl9NVUxUSSkKICAgewotICAgIF9zb3VyY2VzID0gcHNocmVjIHBzaGdsb2IgcHNoYWxnbyBwc2htb2QgcHNocGljIDsKKyAgICBfc291cmNlcyA9IHBzaGFsZ28KKyAgICAgICAgICAgICAgIHBzaGdsb2IKKyAgICAgICAgICAgICAgIHBzaG1vZAorICAgICAgICAgICAgICAgcHNocGljCisgICAgICAgICAgICAgICBwc2hyZWMKKyAgICAgICAgICAgICAgIDsKICAgfQogICBlbHNlCiAgIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hhbGdvLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNoaW50ZXIvcHNoYWxnby5jCmluZGV4IDY0NGM3NmQuLjZlNjU0Y2IgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hhbGdvLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaGFsZ28uYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBQb3N0U2NyaXB0IGhpbnRpbmcgYWxnb3JpdGhtIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDEwLCAyMDEyLTIwMTQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDEtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLwpAQCAtMzAsMTYgKzMwLDE0IEBACiAKIAogI2lmZGVmIERFQlVHX0hJTlRFUgotICBQU0hfSGludF9UYWJsZSAgcHNfZGVidWdfaGludF90YWJsZSA9IDA7Ci0gIFBTSF9IaW50RnVuYyAgICBwc19kZWJ1Z19oaW50X2Z1bmMgID0gMDsKLSAgUFNIX0dseXBoICAgICAgIHBzX2RlYnVnX2dseXBoICAgICAgPSAwOworICBQU0hfSGludF9UYWJsZSAgcHNfZGVidWdfaGludF90YWJsZSA9IE5VTEw7CisgIFBTSF9IaW50RnVuYyAgICBwc19kZWJ1Z19oaW50X2Z1bmMgID0gTlVMTDsKKyAgUFNIX0dseXBoICAgICAgIHBzX2RlYnVnX2dseXBoICAgICAgPSBOVUxMOwogI2VuZGlmCiAKIAogI2RlZmluZSAgQ09NUFVURV9JTkZMRVhTICAvKiBjb21wdXRlIGluZmxlY3Rpb24gcG9pbnRzIHRvIG9wdGltaXplIGBTJyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgc2ltaWxhciBnbHlwaHMgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSAgU1RST05HRVIgICAgICAgICAvKiBzbGlnaHRseSBpbmNyZWFzZSB0aGUgY29udHJhc3Qgb2Ygc21vb3RoICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBoaW50aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCiAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC02NywxMyArNjUsMTMgQEAKICAgewogICAgIEZUX0ZSRUUoIHRhYmxlLT56b25lcyApOwogICAgIHRhYmxlLT5udW1fem9uZXMgPSAwOwotICAgIHRhYmxlLT56b25lICAgICAgPSAwOworICAgIHRhYmxlLT56b25lICAgICAgPSBOVUxMOwogCiAgICAgRlRfRlJFRSggdGFibGUtPnNvcnQgKTsKICAgICBGVF9GUkVFKCB0YWJsZS0+aGludHMgKTsKICAgICB0YWJsZS0+bnVtX2hpbnRzICAgPSAwOwogICAgIHRhYmxlLT5tYXhfaGludHMgICA9IDA7Ci0gICAgdGFibGUtPnNvcnRfZ2xvYmFsID0gMDsKKyAgICB0YWJsZS0+c29ydF9nbG9iYWwgPSBOVUxMOwogICB9CiAKIApAQCAtMTIxLDcgKzExOSw3IEBACiAgICAgICBQU0hfSGludCAgIGhpbnQyOwogCiAKLSAgICAgIGhpbnQtPnBhcmVudCA9IDA7CisgICAgICBoaW50LT5wYXJlbnQgPSBOVUxMOwogICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHNvcnRlZCsrICkKICAgICAgIHsKICAgICAgICAgaGludDIgPSBzb3J0ZWRbMF07CkBAIC0xOTQsNyArMTkyLDcgQEAKICAgICB0YWJsZS0+c29ydF9nbG9iYWwgPSB0YWJsZS0+c29ydCArIGNvdW50OwogICAgIHRhYmxlLT5udW1faGludHMgICA9IDA7CiAgICAgdGFibGUtPm51bV96b25lcyAgID0gMDsKLSAgICB0YWJsZS0+em9uZSAgICAgICAgPSAwOworICAgIHRhYmxlLT56b25lICAgICAgICA9IE5VTEw7CiAKICAgICAvKiBpbml0aWFsaXplIHRoZSBgdGFibGUtPmhpbnRzJyBhcnJheSAqLwogICAgIHsKQEAgLTg5MCw5ICs4ODgsNiBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgUFNIX1pPTkVfTUlOICAtMzIwMDAwMEwKLSNkZWZpbmUgUFNIX1pPTkVfTUFYICArMzIwMDAwMEwKLQogI2RlZmluZSB4eERFQlVHX1pPTkVTCiAKIApAQCAtOTEwLDEwICs5MDUsNiBAQAogICAgICAgICAgICAgIHpvbmUtPm1heCApOwogICB9CiAKLSNlbHNlCi0KLSNkZWZpbmUgcHNoX3ByaW50X3pvbmUoIHggKSAgZG8geyB9IHdoaWxlICggMCApCi0KICNlbmRpZiAvKiBERUJVR19aT05FUyAqLwogCiAKQEAgLTkyNSwxMDMgKzkxNiw5IEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmIDEKLQogI2RlZmluZSAgcHNoX2Nvcm5lcl9pc19mbGF0ICAgICAgZnRfY29ybmVyX2lzX2ZsYXQKICNkZWZpbmUgIHBzaF9jb3JuZXJfb3JpZW50YXRpb24gIGZ0X2Nvcm5lcl9vcmllbnRhdGlvbgogCi0jZWxzZQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfSW50ICkKLSAgcHNoX2Nvcm5lcl9pc19mbGF0KCBGVF9Qb3MgIHhfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICB5X2luLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgeF9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICB5X291dCApCi0gIHsKLSAgICBGVF9Qb3MgIGF4ID0geF9pbjsKLSAgICBGVF9Qb3MgIGF5ID0geV9pbjsKLQotICAgIEZUX1BvcyAgZF9pbiwgZF9vdXQsIGRfY29ybmVyOwotCi0KLSAgICBpZiAoIGF4IDwgMCApCi0gICAgICBheCA9IC1heDsKLSAgICBpZiAoIGF5IDwgMCApCi0gICAgICBheSA9IC1heTsKLSAgICBkX2luID0gYXggKyBheTsKLQotICAgIGF4ID0geF9vdXQ7Ci0gICAgaWYgKCBheCA8IDAgKQotICAgICAgYXggPSAtYXg7Ci0gICAgYXkgPSB5X291dDsKLSAgICBpZiAoIGF5IDwgMCApCi0gICAgICBheSA9IC1heTsKLSAgICBkX291dCA9IGF4ICsgYXk7Ci0KLSAgICBheCA9IHhfb3V0ICsgeF9pbjsKLSAgICBpZiAoIGF4IDwgMCApCi0gICAgICBheCA9IC1heDsKLSAgICBheSA9IHlfb3V0ICsgeV9pbjsKLSAgICBpZiAoIGF5IDwgMCApCi0gICAgICBheSA9IC1heTsKLSAgICBkX2Nvcm5lciA9IGF4ICsgYXk7Ci0KLSAgICByZXR1cm4gKCBkX2luICsgZF9vdXQgLSBkX2Nvcm5lciApIDwgKCBkX2Nvcm5lciA+PiA0ICk7Ci0gIH0KLQotICBzdGF0aWMgRlRfSW50Ci0gIHBzaF9jb3JuZXJfb3JpZW50YXRpb24oIEZUX1BvcyAgaW5feCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBpbl95LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIG91dF94LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIG91dF95ICkKLSAgewotICAgIEZUX0ludCAgcmVzdWx0OwotCi0KLSAgICAvKiBkZWFsIHdpdGggdGhlIHRyaXZpYWwgY2FzZXMgcXVpY2tseSAqLwotICAgIGlmICggaW5feSA9PSAwICkKLSAgICB7Ci0gICAgICBpZiAoIGluX3ggPj0gMCApCi0gICAgICAgIHJlc3VsdCA9IG91dF95OwotICAgICAgZWxzZQotICAgICAgICByZXN1bHQgPSAtb3V0X3k7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBpbl94ID09IDAgKQotICAgIHsKLSAgICAgIGlmICggaW5feSA+PSAwICkKLSAgICAgICAgcmVzdWx0ID0gLW91dF94OwotICAgICAgZWxzZQotICAgICAgICByZXN1bHQgPSBvdXRfeDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIG91dF95ID09IDAgKQotICAgIHsKLSAgICAgIGlmICggb3V0X3ggPj0gMCApCi0gICAgICAgIHJlc3VsdCA9IGluX3k7Ci0gICAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9IC1pbl95OwotICAgIH0KLSAgICBlbHNlIGlmICggb3V0X3ggPT0gMCApCi0gICAgewotICAgICAgaWYgKCBvdXRfeSA+PSAwICkKLSAgICAgICAgcmVzdWx0ID0gLWluX3g7Ci0gICAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9ICBpbl94OwotICAgIH0KLSAgICBlbHNlIC8qIGdlbmVyYWwgY2FzZSAqLwotICAgIHsKLSAgICAgIGxvbmcgbG9uZyAgZGVsdGEgPSAobG9uZyBsb25nKWluX3ggKiBvdXRfeSAtIChsb25nIGxvbmcpaW5feSAqIG91dF94OwotCi0gICAgICBpZiAoIGRlbHRhID09IDAgKQotICAgICAgICByZXN1bHQgPSAwOwotICAgICAgZWxzZQotICAgICAgICByZXN1bHQgPSAxIC0gMiAqICggZGVsdGEgPCAwICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0jZW5kaWYgLyogITEgKi8KLQogCiAjaWZkZWYgQ09NUFVURV9JTkZMRVhTCiAKQEAgLTExNDksNyArMTA0Niw3IEBACiAgICAgZ2x5cGgtPm51bV9wb2ludHMgICA9IDA7CiAgICAgZ2x5cGgtPm51bV9jb250b3VycyA9IDA7CiAKLSAgICBnbHlwaC0+bWVtb3J5ID0gMDsKKyAgICBnbHlwaC0+bWVtb3J5ID0gTlVMTDsKICAgfQogCiAKQEAgLTEyNzQsOCArMTE3MSw4IEBACiAgICAgICAgICBGVF9ORVdfQVJSQVkoIGdseXBoLT5jb250b3Vycywgb3V0bGluZS0+bl9jb250b3VycyApICkKICAgICAgIGdvdG8gRXhpdDsKIAotICAgIGdseXBoLT5udW1fcG9pbnRzICAgPSBvdXRsaW5lLT5uX3BvaW50czsKLSAgICBnbHlwaC0+bnVtX2NvbnRvdXJzID0gb3V0bGluZS0+bl9jb250b3VyczsKKyAgICBnbHlwaC0+bnVtX3BvaW50cyAgID0gKEZUX1VJbnQpb3V0bGluZS0+bl9wb2ludHM7CisgICAgZ2x5cGgtPm51bV9jb250b3VycyA9IChGVF9VSW50KW91dGxpbmUtPm5fY29udG91cnM7CiAKICAgICB7CiAgICAgICBGVF9VSW50ICAgICAgZmlyc3QgPSAwLCBuZXh0LCBuOwpAQCAtMTI4NSwxNSArMTE4MiwxNSBAQAogCiAgICAgICBmb3IgKCBuID0gMDsgbiA8IGdseXBoLT5udW1fY29udG91cnM7IG4rKyApCiAgICAgICB7Ci0gICAgICAgIEZUX0ludCAgICAgY291bnQ7CisgICAgICAgIEZUX1VJbnQgICAgY291bnQ7CiAgICAgICAgIFBTSF9Qb2ludCAgcG9pbnQ7CiAKIAotICAgICAgICBuZXh0ICA9IG91dGxpbmUtPmNvbnRvdXJzW25dICsgMTsKKyAgICAgICAgbmV4dCAgPSAoRlRfVUludClvdXRsaW5lLT5jb250b3Vyc1tuXSArIDE7CiAgICAgICAgIGNvdW50ID0gbmV4dCAtIGZpcnN0OwogCiAgICAgICAgIGNvbnRvdXItPnN0YXJ0ID0gcG9pbnRzICsgZmlyc3Q7Ci0gICAgICAgIGNvbnRvdXItPmNvdW50ID0gKEZUX1VJbnQpY291bnQ7CisgICAgICAgIGNvbnRvdXItPmNvdW50ID0gY291bnQ7CiAKICAgICAgICAgaWYgKCBjb3VudCA+IDAgKQogICAgICAgICB7CkBAIC0xNjk2LDE2ICsxNTkzLDEyIEBACiAgICAgICBtYXNrKys7CiAgICAgICBmb3IgKCA7IG51bV9tYXNrcyA+IDE7IG51bV9tYXNrcy0tLCBtYXNrKysgKQogICAgICAgewotICAgICAgICBGVF9VSW50ICBuZXh0OwotICAgICAgICBGVF9JbnQgICBjb3VudDsKKyAgICAgICAgRlRfVUludCAgbmV4dCA9IEZUX01JTiggbWFzay0+ZW5kX3BvaW50LCBnbHlwaC0+bnVtX3BvaW50cyApOwogCiAKLSAgICAgICAgbmV4dCAgPSBtYXNrLT5lbmRfcG9pbnQgPiBnbHlwaC0+bnVtX3BvaW50cwotICAgICAgICAgICAgICAgICAgPyBnbHlwaC0+bnVtX3BvaW50cwotICAgICAgICAgICAgICAgICAgOiBtYXNrLT5lbmRfcG9pbnQ7Ci0gICAgICAgIGNvdW50ID0gbmV4dCAtIGZpcnN0OwotICAgICAgICBpZiAoIGNvdW50ID4gMCApCisgICAgICAgIGlmICggbmV4dCA+IGZpcnN0ICkKICAgICAgICAgeworICAgICAgICAgIEZUX1VJbnQgICAgY291bnQgPSBuZXh0IC0gZmlyc3Q7CiAgICAgICAgICAgUFNIX1BvaW50ICBwb2ludCA9IGdseXBoLT5wb2ludHMgKyBmaXJzdDsKIAogCkBAIC0yMDQ4LDcgKzE5NDEsNyBAQAogICAgICAgLyogY291bnQgdGhlIG51bWJlciBvZiBzdHJvbmcgcG9pbnRzIGluIHRoaXMgY29udG91ciAqLwogICAgICAgbmV4dCAgICAgID0gc3RhcnQgKyBjb250b3VyLT5jb3VudDsKICAgICAgIGZpdF9jb3VudCA9IDA7Ci0gICAgICBmaXJzdCAgICAgPSAwOworICAgICAgZmlyc3QgICAgID0gTlVMTDsKIAogICAgICAgZm9yICggcG9pbnQgPSBzdGFydDsgcG9pbnQgPCBuZXh0OyBwb2ludCsrICkKICAgICAgICAgaWYgKCBwc2hfcG9pbnRfaXNfZml0dGVkKCBwb2ludCApICkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hhbGdvLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNoaW50ZXIvcHNoYWxnby5oCmluZGV4IGM3MGYzMWUuLjgzNzNlNWUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hhbGdvLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaGFsZ28uaApAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBQb3N0U2NyaXB0IGhpbnRpbmcgYWxnb3JpdGhtIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDAzLCAyMDA4LCAyMDEzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDEtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtMzAsMTUgKzMwLDEyIEBACiAgIC8qIGhhbmRsZSB0byBIaW50IHN0cnVjdHVyZSAqLwogICB0eXBlZGVmIHN0cnVjdCBQU0hfSGludFJlY18qICBQU0hfSGludDsKIAotICAvKiBoaW50IGJpdC1mbGFncyAqLwotICB0eXBlZGVmIGVudW0gIFBTSF9IaW50X0ZsYWdzXwotICB7Ci0gICAgUFNIX0hJTlRfR0hPU1QgID0gUFNfSElOVF9GTEFHX0dIT1NULAotICAgIFBTSF9ISU5UX0JPVFRPTSA9IFBTX0hJTlRfRkxBR19CT1RUT00sCi0gICAgUFNIX0hJTlRfQUNUSVZFID0gNCwKLSAgICBQU0hfSElOVF9GSVRURUQgPSA4CiAKLSAgfSBQU0hfSGludF9GbGFnczsKKyAgLyogaGludCBiaXQtZmxhZ3MgKi8KKyNkZWZpbmUgUFNIX0hJTlRfR0hPU1QgICBQU19ISU5UX0ZMQUdfR0hPU1QKKyNkZWZpbmUgUFNIX0hJTlRfQk9UVE9NICBQU19ISU5UX0ZMQUdfQk9UVE9NCisjZGVmaW5lIFBTSF9ISU5UX0FDVElWRSAgNFUKKyNkZWZpbmUgUFNIX0hJTlRfRklUVEVEICA4VQogCiAKICNkZWZpbmUgcHNoX2hpbnRfaXNfYWN0aXZlKCB4ICkgICggKCAoeCktPmZsYWdzICYgUFNIX0hJTlRfQUNUSVZFICkgIT0gMCApCkBAIC00OSw2ICs0Niw3IEBACiAjZGVmaW5lIHBzaF9oaW50X2RlYWN0aXZhdGUoIHggKSAgKHgpLT5mbGFncyAmPSB+UFNIX0hJTlRfQUNUSVZFCiAjZGVmaW5lIHBzaF9oaW50X3NldF9maXR0ZWQoIHggKSAgKHgpLT5mbGFncyB8PSAgUFNIX0hJTlRfRklUVEVECiAKKwogICAvKiBoaW50IHN0cnVjdHVyZSAqLwogICB0eXBlZGVmIHN0cnVjdCAgUFNIX0hpbnRSZWNfCiAgIHsKQEAgLTExMiwxNCArMTEwLDEyIEBACiAjZGVmaW5lIFBTSF9ESVJfSVNfVkVSVElDQUwoIGQgKSAgICBQU0hfRElSX0NPTVBBUkUoIGQsIFBTSF9ESVJfVkVSVElDQUwgKQogCiAKLSAvKiB0aGUgZm9sbG93aW5nIGJpdC1mbGFncyBhcmUgY29tcHV0ZWQgb25jZSBieSB0aGUgZ2x5cGggKi8KLSAvKiBhbmFseXplciwgZm9yIGJvdGggZGltZW5zaW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgZW51bQotICB7Ci0gICAgUFNIX1BPSU5UX09GRiAgICA9IDEsICAgLyogcG9pbnQgaXMgb2ZmIHRoZSBjdXJ2ZSAqLwotICAgIFBTSF9QT0lOVF9TTU9PVEggPSAyLCAgIC8qIHBvaW50IGlzIHNtb290aCAgICAgICAgKi8KLSAgICBQU0hfUE9JTlRfSU5GTEVYID0gNCAgICAvKiBwb2ludCBpcyBpbmZsZWN0aW9uICAgICovCi0gIH07CisgIC8qIHRoZSBmb2xsb3dpbmcgYml0LWZsYWdzIGFyZSBjb21wdXRlZCBvbmNlIGJ5IHRoZSBnbHlwaCAqLworICAvKiBhbmFseXplciwgZm9yIGJvdGggZGltZW5zaW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUFNIX1BPSU5UX09GRiAgICAgMVUgICAgICAvKiBwb2ludCBpcyBvZmYgdGhlIGN1cnZlICovCisjZGVmaW5lIFBTSF9QT0lOVF9TTU9PVEggIDJVICAgICAgLyogcG9pbnQgaXMgc21vb3RoICAgICAgICAqLworI2RlZmluZSBQU0hfUE9JTlRfSU5GTEVYICA0VSAgICAgIC8qIHBvaW50IGlzIGluZmxlY3Rpb24gICAgKi8KKwogCiAjZGVmaW5lIHBzaF9wb2ludF9pc19zbW9vdGgoIHAgKSAgKCAocCktPmZsYWdzICYgUFNIX1BPSU5UX1NNT09USCApCiAjZGVmaW5lIHBzaF9wb2ludF9pc19vZmYoIHAgKSAgICAgKCAocCktPmZsYWdzICYgUFNIX1BPSU5UX09GRiAgICApCkBAIC0xMjksMTcgKzEyNSwxNiBAQAogI2RlZmluZSBwc2hfcG9pbnRfc2V0X29mZiggcCApICAgICAocCktPmZsYWdzIHw9IFBTSF9QT0lOVF9PRkYKICNkZWZpbmUgcHNoX3BvaW50X3NldF9pbmZsZXgoIHAgKSAgKHApLT5mbGFncyB8PSBQU0hfUE9JTlRfSU5GTEVYCiAKKwogICAvKiB0aGUgZm9sbG93aW5nIGJpdC1mbGFncyBhcmUgcmUtY29tcHV0ZWQgZm9yIGVhY2ggZGltZW5zaW9uICovCi0gIGVudW0KLSAgewotICAgIFBTSF9QT0lOVF9TVFJPTkcgICA9IDE2LCAgIC8qIHBvaW50IGlzIHN0cm9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgUFNIX1BPSU5UX0ZJVFRFRCAgID0gMzIsICAgLyogcG9pbnQgaXMgYWxyZWFkeSBmaXR0ZWQgICAgICAgICAgICAgICAgICAgKi8KLSAgICBQU0hfUE9JTlRfRVhUUkVNVU0gPSA2NCwgICAvKiBwb2ludCBpcyBsb2NhbCBleHRyZW11bSAgICAgICAgICAgICAgICAgICAqLwotICAgIFBTSF9QT0lOVF9QT1NJVElWRSA9IDEyOCwgIC8qIGV4dHJlbXVtIGhhcyBwb3NpdGl2ZSBjb250b3VyIGZsb3cgICAgICAgICovCi0gICAgUFNIX1BPSU5UX05FR0FUSVZFID0gMjU2LCAgLyogZXh0cmVtdW0gaGFzIG5lZ2F0aXZlIGNvbnRvdXIgZmxvdyAgICAgICAgKi8KLSAgICBQU0hfUE9JTlRfRURHRV9NSU4gPSA1MTIsICAvKiBwb2ludCBpcyBhbGlnbmVkIHRvIGxlZnQvYm90dG9tIHN0ZW0gZWRnZSAqLwotICAgIFBTSF9QT0lOVF9FREdFX01BWCA9IDEwMjQgIC8qIHBvaW50IGlzIGFsaWduZWQgdG8gdG9wL3JpZ2h0IHN0ZW0gZWRnZSAgICovCi0gIH07CisjZGVmaW5lIFBTSF9QT0lOVF9TVFJPTkcgICAgICAxNlUgLyogcG9pbnQgaXMgc3Ryb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUFNIX1BPSU5UX0ZJVFRFRCAgICAgIDMyVSAvKiBwb2ludCBpcyBhbHJlYWR5IGZpdHRlZCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBQU0hfUE9JTlRfRVhUUkVNVU0gICAgNjRVIC8qIHBvaW50IGlzIGxvY2FsIGV4dHJlbXVtICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBTSF9QT0lOVF9QT1NJVElWRSAgIDEyOFUgLyogZXh0cmVtdW0gaGFzIHBvc2l0aXZlIGNvbnRvdXIgZmxvdyAgICAgICAgKi8KKyNkZWZpbmUgUFNIX1BPSU5UX05FR0FUSVZFICAgMjU2VSAvKiBleHRyZW11bSBoYXMgbmVnYXRpdmUgY29udG91ciBmbG93ICAgICAgICAqLworI2RlZmluZSBQU0hfUE9JTlRfRURHRV9NSU4gICA1MTJVIC8qIHBvaW50IGlzIGFsaWduZWQgdG8gbGVmdC9ib3R0b20gc3RlbSBlZGdlICovCisjZGVmaW5lIFBTSF9QT0lOVF9FREdFX01BWCAgMTAyNFUgLyogcG9pbnQgaXMgYWxpZ25lZCB0byB0b3AvcmlnaHQgc3RlbSBlZGdlICAgKi8KKwogCiAjZGVmaW5lIHBzaF9wb2ludF9pc19zdHJvbmcoIHAgKSAgICAoIChwKS0+ZmxhZ3MyICYgUFNIX1BPSU5UX1NUUk9ORyApCiAjZGVmaW5lIHBzaF9wb2ludF9pc19maXR0ZWQoIHAgKSAgICAoIChwKS0+ZmxhZ3MyICYgUFNIX1BPSU5UX0ZJVFRFRCApCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNoaW50ZXIvcHNoZ2xvYi5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaGdsb2IuYwppbmRleCAxYmNjNDgxLi40NjE2YmRjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNoaW50ZXIvcHNoZ2xvYi5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hnbG9iLmMKQEAgLTUsNyArNSw3IEBACiAvKiAgICBQb3N0U2NyaXB0IGhpbnRlciBnbG9iYWwgaGludGluZyBtYW5hZ2VtZW50IChib2R5KS4gICAgICAgICAgICAgICAgICAqLwogLyogICAgSW5zcGlyZWQgYnkgdGhlIG5ldyBhdXRvLWhpbnRlciBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEtMjAwNCwgMjAwNiwgMjAxMCwgMjAxMi0yMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAxLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlICJwc2hnbG9iLmgiCiAKICNpZmRlZiBERUJVR19ISU5URVIKLSAgUFNIX0dsb2JhbHMgIHBzX2RlYnVnX2dsb2JhbHMgPSAwOworICBQU0hfR2xvYmFscyAgcHNfZGVidWdfZ2xvYmFscyA9IE5VTEw7CiAjZW5kaWYKIAogCkBAIC0yNDAsNyArMjQwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBmYW1pbHkgKQogICB7CiAgICAgUFNIX0JsdWVfVGFibGUgIHRvcF90YWJsZSwgYm90X3RhYmxlOwotICAgIEZUX0ludCAgICAgICAgICBjb3VudF90b3AsIGNvdW50X2JvdDsKKyAgICBGVF9VSW50ICAgICAgICAgY291bnRfdG9wLCBjb3VudF9ib3Q7CiAKIAogICAgIGlmICggZmFtaWx5ICkKQEAgLTMzOSw3ICszMzksNyBAQAogICAgICAgICAgICAgYm90ICAgPSB6b25lWzFdLm9yZ19ib3R0b207CiAgICAgICAgICAgICBkZWx0YSA9IGJvdCAtIHRvcDsKIAotICAgICAgICAgICAgaWYgKCBkZWx0YSA8IDIgKiBmdXp6ICkKKyAgICAgICAgICAgIGlmICggZGVsdGEgLyAyIDwgZnV6eiApCiAgICAgICAgICAgICAgIHpvbmVbMF0ub3JnX3RvcCA9IHpvbmVbMV0ub3JnX2JvdHRvbSA9IHRvcCArIGRlbHRhIC8gMjsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKQEAgLTM2OSw3ICszNjksNyBAQAogICB7CiAgICAgRlRfVUludCAgICAgICAgIGNvdW50OwogICAgIEZUX1VJbnQgICAgICAgICBudW07Ci0gICAgUFNIX0JsdWVfVGFibGUgIHRhYmxlID0gMDsKKyAgICBQU0hfQmx1ZV9UYWJsZSAgdGFibGUgPSBOVUxMOwogCiAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgd2UgbmVlZCB0byBzdXBwcmVzcyBvdmVyc2hvb3RzIG9yICAgICovCkBAIC02MzUsNyArNjM1LDcgQEAKICAgICAgIEZUX0ZSRUUoIGdsb2JhbHMgKTsKIAogI2lmZGVmIERFQlVHX0hJTlRFUgotICAgICAgcHNfZGVidWdfZ2xvYmFscyA9IDA7CisgICAgICBwc19kZWJ1Z19nbG9iYWxzID0gTlVMTDsKICNlbmRpZgogICAgIH0KICAgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaGdsb2IuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hnbG9iLmgKaW5kZXggOTRkOTcyYS4uYzM3NmRmNyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaGdsb2IuaAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNoaW50ZXIvcHNoZ2xvYi5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFBvc3RTY3JpcHQgaGludGVyIGdsb2JhbCBoaW50aW5nIG1hbmFnZW1lbnQuICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLCAyMDAyLCAyMDAzLCAyMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwMS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNoaW50ZXIvcHNoaW50ZXIuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hpbnRlci5jCmluZGV4IGIzNWEyYTkuLjllNjVmZTIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hpbnRlci5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hpbnRlci5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEZyZWVUeXBlIFBvc3RTY3JpcHQgSGludGluZyBtb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLCAyMDAzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwMS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNoaW50ZXIvcHNobW9kLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNoaW50ZXIvcHNobW9kLmMKaW5kZXggY2RlYWNhMS4uOTYxYjQ2OCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaG1vZC5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2htb2QuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBGcmVlVHlwZSBQb3N0U2NyaXB0IGhpbnRlciBtb2R1bGUgaW1wbGVtZW50YXRpb24gKGJvZHkpLiAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMSwgMjAwMiwgMjAwNywgMjAwOSwgMjAxMiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDEtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaG1vZC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaG1vZC5oCmluZGV4IDBhZTdlOTYuLmE1OGQ4NTYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2htb2QuaAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNoaW50ZXIvcHNobW9kLmgKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgUG9zdFNjcmlwdCBoaW50ZXIgbW9kdWxlIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAxLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hudGVyci5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaG50ZXJyLmgKaW5kZXggN2NjMTgwZi4uY2U3OTBhOCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaG50ZXJyLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaG50ZXJyLmgKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgUFMgSGludGVyIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMsIDIwMTIgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAzLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hwaWMuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hwaWMuYwppbmRleCA1NjhmNGFjLi5hZmQ4ZmI5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNoaW50ZXIvcHNocGljLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaHBpYy5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFRoZSBGcmVlVHlwZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHNlcnZpY2VzIGZvciBwc2hpbnRlciBtb2R1bGUuICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA5LCAyMDEwLCAyMDEyLCAyMDEzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwOS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNoaW50ZXIvcHNocGljLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNoaW50ZXIvcHNocGljLmgKaW5kZXggYjQ2Zjg1My4uY2EzNWNkNiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaHBpYy5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hwaWMuaApAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyBmb3IgcHNoaW50ZXIgbW9kdWxlLiAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOSwgMjAxMiwgMjAxMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDktMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtMjAsOCArMjAsNiBAQAogI2RlZmluZSBfX1BTSFBJQ19IX18KIAogCi1GVF9CRUdJTl9IRUFERVIKLQogI2luY2x1ZGUgRlRfSU5URVJOQUxfUElDX0gKIAogCkBAIC0zMyw2ICszMSw4IEBACiAKICNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfSElOVFNfSAogCitGVF9CRUdJTl9IRUFERVIKKwogICB0eXBlZGVmIHN0cnVjdCAgUFNIaW50ZXJQSUNfCiAgIHsKICAgICBQU0hpbnRlcl9JbnRlcmZhY2UgIHBzaGludGVyX2ludGVyZmFjZTsKQEAgLTUxLDEyICs1MSwxMiBAQAogICBGVF9FcnJvcgogICBwc2hpbnRlcl9tb2R1bGVfY2xhc3NfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKIAorRlRfRU5EX0hFQURFUgorCiAjZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KIAogIC8qICovCiAKLUZUX0VORF9IRUFERVIKLQogI2VuZGlmIC8qIF9fUFNIUElDX0hfXyAqLwogCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hyZWMuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hyZWMuYwppbmRleCA3M2ExOGZmLi5mODg5NWZjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNoaW50ZXIvcHNocmVjLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaHJlYy5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEZyZWVUeXBlIFBvc3RTY3JpcHQgaGludHMgcmVjb3JkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMDQsIDIwMDcsIDIwMDksIDIwMTMsIDIwMTQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwMS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC0zMSw3ICszMSw3IEBACiAjZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfcHNocmVjCiAKICNpZmRlZiBERUJVR19ISU5URVIKLSAgUFNfSGludHMgIHBzX2RlYnVnX2hpbnRzICAgICAgICAgPSAwOworICBQU19IaW50cyAgcHNfZGVidWdfaGludHMgICAgICAgICA9IE5VTEw7CiAgIGludCAgICAgICBwc19kZWJ1Z19ub19ob3J6X2hpbnRzID0gMDsKICAgaW50ICAgICAgIHBzX2RlYnVnX25vX3ZlcnRfaGludHMgPSAwOwogI2VuZGlmCkBAIC04NSw3ICs4NSw3IEBACiAgIHsKICAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7CiAgICAgRlRfVUludCAgIGNvdW50OwotICAgIFBTX0hpbnQgICBoaW50ID0gMDsKKyAgICBQU19IaW50ICAgaGludCA9IE5VTEw7CiAKIAogICAgIGNvdW50ID0gdGFibGUtPm51bV9oaW50czsKQEAgLTE2NywxMiArMTY3LDEyIEBACiAgIC8qIGNsZWFyIGEgZ2l2ZW4gYml0ICovCiAgIHN0YXRpYyB2b2lkCiAgIHBzX21hc2tfY2xlYXJfYml0KCBQU19NYXNrICBtYXNrLAotICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgaWR4ICkKKyAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgIGlkeCApCiAgIHsKICAgICBGVF9CeXRlKiAgcDsKIAogCi0gICAgaWYgKCAoRlRfVUludClpZHggPj0gbWFzay0+bnVtX2JpdHMgKQorICAgIGlmICggaWR4ID49IG1hc2stPm51bV9iaXRzICkKICAgICAgIHJldHVybjsKIAogICAgIHAgICAgPSBtYXNrLT5ieXRlcyArICggaWR4ID4+IDMgKTsKQEAgLTE4MywxNyArMTgzLDE0IEBACiAgIC8qIHNldCBhIGdpdmVuIGJpdCwgcG9zc2libHkgZ3JvdyB0aGUgbWFzayAqLwogICBzdGF0aWMgRlRfRXJyb3IKICAgcHNfbWFza19zZXRfYml0KCBQU19NYXNrICAgIG1hc2ssCi0gICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBpZHgsCisgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBpZHgsCiAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKQogICB7CiAgICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwogICAgIEZUX0J5dGUqICBwOwogCiAKLSAgICBpZiAoIGlkeCA8IDAgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCAoRlRfVUludClpZHggPj0gbWFzay0+bnVtX2JpdHMgKQorICAgIGlmICggaWR4ID49IG1hc2stPm51bV9iaXRzICkKICAgICB7CiAgICAgICBlcnJvciA9IHBzX21hc2tfZW5zdXJlKCBtYXNrLCBpZHggKyAxLCBtZW1vcnkgKTsKICAgICAgIGlmICggZXJyb3IgKQpAQCAtMjU3LDcgKzI1NCw3IEBACiAgIHsKICAgICBGVF9VSW50ICAgY291bnQ7CiAgICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotICAgIFBTX01hc2sgICBtYXNrICA9IDA7CisgICAgUFNfTWFzayAgIG1hc2sgID0gTlVMTDsKIAogCiAgICAgY291bnQgPSB0YWJsZS0+bnVtX21hc2tzOwpAQCAtMzcyLDggKzM2OSw4IEBACiAgIC8qIHRlc3Qgd2hldGhlciB0d28gbWFza3MgaW4gYSB0YWJsZSBpbnRlcnNlY3QgKi8KICAgc3RhdGljIEZUX0ludAogICBwc19tYXNrX3RhYmxlX3Rlc3RfaW50ZXJzZWN0KCBQU19NYXNrX1RhYmxlICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgaW5kZXgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBpbmRleDIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICBpbmRleDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgIGluZGV4MiApCiAgIHsKICAgICBQU19NYXNrICAgbWFzazEgID0gdGFibGUtPm1hc2tzICsgaW5kZXgxOwogICAgIFBTX01hc2sgICBtYXNrMiAgPSB0YWJsZS0+bWFza3MgKyBpbmRleDI7CkBAIC00MDQsMjMgKzQwMSwyNSBAQAogICAvKiBtZXJnZSB0d28gbWFza3MsIHVzZWQgYnkgcHNfbWFza190YWJsZV9tZXJnZV9hbGwgKi8KICAgc3RhdGljIEZUX0Vycm9yCiAgIHBzX21hc2tfdGFibGVfbWVyZ2UoIFBTX01hc2tfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBpbmRleDEsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGluZGV4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgaW5kZXgxLAorICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICBpbmRleDIsCiAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSApCiAgIHsKLSAgICBGVF9VSW50ICAgdGVtcDsKICAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7CiAKIAogICAgIC8qIHN3YXAgaW5kZXgxIGFuZCBpbmRleDIgc28gdGhhdCBpbmRleDEgPCBpbmRleDIgKi8KICAgICBpZiAoIGluZGV4MSA+IGluZGV4MiApCiAgICAgeworICAgICAgRlRfVUludCAgdGVtcDsKKworCiAgICAgICB0ZW1wICAgPSBpbmRleDE7CiAgICAgICBpbmRleDEgPSBpbmRleDI7CiAgICAgICBpbmRleDIgPSB0ZW1wOwogICAgIH0KIAotICAgIGlmICggaW5kZXgxIDwgaW5kZXgyICYmIGluZGV4MSA+PSAwICYmIGluZGV4MiA8IChGVF9JbnQpdGFibGUtPm51bV9tYXNrcyApCisgICAgaWYgKCBpbmRleDEgPCBpbmRleDIgJiYgaW5kZXgyIDwgdGFibGUtPm51bV9tYXNrcyApCiAgICAgewogICAgICAgLyogd2UgbmVlZCB0byBtZXJnZSB0aGUgYml0c2V0cyBvZiBpbmRleDEgYW5kIGluZGV4MiB3aXRoIGEgKi8KICAgICAgIC8qIHNpbXBsZSB1bmlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC00NTMsNyArNDUyLDcgQEAKICAgICAgICAgLyogbWVyZ2UgKHVuaXRlKSB0aGUgYml0c2V0cyAqLwogICAgICAgICByZWFkICA9IG1hc2syLT5ieXRlczsKICAgICAgICAgd3JpdGUgPSBtYXNrMS0+Ynl0ZXM7Ci0gICAgICAgIHBvcyAgID0gKEZUX1VJbnQpKCAoIGNvdW50MiArIDcgKSA+PiAzICk7CisgICAgICAgIHBvcyAgID0gKCBjb3VudDIgKyA3ICkgPj4gMzsKIAogICAgICAgICBmb3IgKCA7IHBvcyA+IDA7IHBvcy0tICkKICAgICAgICAgewpAQCAtNDY4LDE0ICs0NjcsMTcgQEAKICAgICAgIG1hc2syLT5udW1fYml0cyAgPSAwOwogICAgICAgbWFzazItPmVuZF9wb2ludCA9IDA7CiAKLSAgICAgIGRlbHRhID0gdGFibGUtPm51bV9tYXNrcyAtIDEgLSBpbmRleDI7IC8qIG51bWJlciBvZiBtYXNrcyB0byBtb3ZlICovCisgICAgICAvKiBudW1iZXIgb2YgbWFza3MgdG8gbW92ZSAqLworICAgICAgZGVsdGEgPSAoRlRfSW50KSggdGFibGUtPm51bV9tYXNrcyAtIDEgLSBpbmRleDIgKTsKICAgICAgIGlmICggZGVsdGEgPiAwICkKICAgICAgIHsKICAgICAgICAgLyogbW92ZSB0byBlbmQgb2YgdGFibGUgZm9yIHJldXNlICovCiAgICAgICAgIFBTX01hc2tSZWMgIGR1bW15ID0gKm1hc2syOwogCiAKLSAgICAgICAgZnRfbWVtbW92ZSggbWFzazIsIG1hc2syICsgMSwgZGVsdGEgKiBzaXplb2YgKCBQU19NYXNrUmVjICkgKTsKKyAgICAgICAgZnRfbWVtbW92ZSggbWFzazIsCisgICAgICAgICAgICAgICAgICAgIG1hc2syICsgMSwKKyAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpZGVsdGEgKiBzaXplb2YgKCBQU19NYXNrUmVjICkgKTsKIAogICAgICAgICBtYXNrMltkZWx0YV0gPSBkdW1teTsKICAgICAgIH0KQEAgLTUwMiwxMyArNTA0LDE5IEBACiAgICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwogCiAKLSAgICBmb3IgKCBpbmRleDEgPSB0YWJsZS0+bnVtX21hc2tzIC0gMTsgaW5kZXgxID4gMDsgaW5kZXgxLS0gKQorICAgIC8qIGJvdGggbG9vcHMgZ28gZG93biB0byAwLCB0aHVzIEZUX0ludCBmb3IgaW5kZXgxIGFuZCBpbmRleDIgKi8KKyAgICBmb3IgKCBpbmRleDEgPSAoRlRfSW50KXRhYmxlLT5udW1fbWFza3MgLSAxOyBpbmRleDEgPiAwOyBpbmRleDEtLSApCiAgICAgewogICAgICAgZm9yICggaW5kZXgyID0gaW5kZXgxIC0gMTsgaW5kZXgyID49IDA7IGluZGV4Mi0tICkKICAgICAgIHsKLSAgICAgICAgaWYgKCBwc19tYXNrX3RhYmxlX3Rlc3RfaW50ZXJzZWN0KCB0YWJsZSwgaW5kZXgxLCBpbmRleDIgKSApCisgICAgICAgIGlmICggcHNfbWFza190YWJsZV90ZXN0X2ludGVyc2VjdCggdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpaW5kZXgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50KWluZGV4MiApICkKICAgICAgICAgewotICAgICAgICAgIGVycm9yID0gcHNfbWFza190YWJsZV9tZXJnZSggdGFibGUsIGluZGV4MiwgaW5kZXgxLCBtZW1vcnkgKTsKKyAgICAgICAgICBlcnJvciA9IHBzX21hc2tfdGFibGVfbWVyZ2UoIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpaW5kZXgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpaW5kZXgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5ICk7CiAgICAgICAgICAgaWYgKCBlcnJvciApCiAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAKQEAgLTY3MCw4ICs2NzgsOCBAQAogICAgIHsKICAgICAgIFBTX01hc2sgIG1hc2s7CiAgICAgICBGVF9VSW50ICBpZHg7Ci0gICAgICBGVF9VSW50ICBtYXggICA9IGRpbS0+aGludHMubnVtX2hpbnRzOwotICAgICAgUFNfSGludCAgaGludCAgPSBkaW0tPmhpbnRzLmhpbnRzOworICAgICAgRlRfVUludCAgbWF4ICA9IGRpbS0+aGludHMubnVtX2hpbnRzOworICAgICAgUFNfSGludCAgaGludCA9IGRpbS0+aGludHMuaGludHM7CiAKIAogICAgICAgZm9yICggaWR4ID0gMDsgaWR4IDwgbWF4OyBpZHgrKywgaGludCsrICkKQEAgLTc0MiwxNyArNzUwLDI2IEBACiAgICAgfQogCiAgICAgLyogbm93LCBzZXQgdGhlIGJpdHMgZm9yIG91ciBoaW50cyBpbiB0aGUgY291bnRlciBtYXNrICovCi0gICAgZXJyb3IgPSBwc19tYXNrX3NldF9iaXQoIGNvdW50ZXIsIGhpbnQxLCBtZW1vcnkgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKKyAgICBpZiAoIGhpbnQxID49IDAgKQorICAgIHsKKyAgICAgIGVycm9yID0gcHNfbWFza19zZXRfYml0KCBjb3VudGVyLCAoRlRfVUludCloaW50MSwgbWVtb3J5ICk7CisgICAgICBpZiAoIGVycm9yICkKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KIAotICAgIGVycm9yID0gcHNfbWFza19zZXRfYml0KCBjb3VudGVyLCBoaW50MiwgbWVtb3J5ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7CisgICAgaWYgKCBoaW50MiA+PSAwICkKKyAgICB7CisgICAgICBlcnJvciA9IHBzX21hc2tfc2V0X2JpdCggY291bnRlciwgKEZUX1VJbnQpaGludDIsIG1lbW9yeSApOworICAgICAgaWYgKCBlcnJvciApCisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CiAKLSAgICBlcnJvciA9IHBzX21hc2tfc2V0X2JpdCggY291bnRlciwgaGludDMsIG1lbW9yeSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OworICAgIGlmICggaGludDMgPj0gMCApCisgICAgeworICAgICAgZXJyb3IgPSBwc19tYXNrX3NldF9iaXQoIGNvdW50ZXIsIChGVF9VSW50KWhpbnQzLCBtZW1vcnkgKTsKKyAgICAgIGlmICggZXJyb3IgKQorICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQogCiAgIEV4aXQ6CiAgICAgcmV0dXJuIGVycm9yOwpAQCAtNzkzLDcgKzgxMCw3IEBACiAgICAgcHNfZGltZW5zaW9uX2RvbmUoICZoaW50cy0+ZGltZW5zaW9uWzFdLCBtZW1vcnkgKTsKIAogICAgIGhpbnRzLT5lcnJvciAgPSBGVF9FcnJfT2s7Ci0gICAgaGludHMtPm1lbW9yeSA9IDA7CisgICAgaGludHMtPm1lbW9yeSA9IE5VTEw7CiAgIH0KIAogCkBAIC04MTEsNzggKzgyOCw1NyBAQAogICBwc19oaW50c19vcGVuKCBQU19IaW50cyAgICAgIGhpbnRzLAogICAgICAgICAgICAgICAgICBQU19IaW50X1R5cGUgIGhpbnRfdHlwZSApCiAgIHsKLSAgICBzd2l0Y2ggKCBoaW50X3R5cGUgKQotICAgIHsKLSAgICBjYXNlIFBTX0hJTlRfVFlQRV8xOgotICAgIGNhc2UgUFNfSElOVF9UWVBFXzI6Ci0gICAgICBoaW50cy0+ZXJyb3IgICAgID0gRlRfRXJyX09rOwotICAgICAgaGludHMtPmhpbnRfdHlwZSA9IGhpbnRfdHlwZTsKKyAgICBoaW50cy0+ZXJyb3IgICAgID0gRlRfRXJyX09rOworICAgIGhpbnRzLT5oaW50X3R5cGUgPSBoaW50X3R5cGU7CiAKLSAgICAgIHBzX2RpbWVuc2lvbl9pbml0KCAmaGludHMtPmRpbWVuc2lvblswXSApOwotICAgICAgcHNfZGltZW5zaW9uX2luaXQoICZoaW50cy0+ZGltZW5zaW9uWzFdICk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBoaW50cy0+ZXJyb3IgICAgID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGhpbnRzLT5oaW50X3R5cGUgPSBoaW50X3R5cGU7Ci0KLSAgICAgIEZUX1RSQUNFMCgoICJwc19oaW50c19vcGVuOiBpbnZhbGlkIGNoYXJzdHJpbmcgdHlwZVxuIiApKTsKLSAgICAgIGJyZWFrOwotICAgIH0KKyAgICBwc19kaW1lbnNpb25faW5pdCggJmhpbnRzLT5kaW1lbnNpb25bMF0gKTsKKyAgICBwc19kaW1lbnNpb25faW5pdCggJmhpbnRzLT5kaW1lbnNpb25bMV0gKTsKICAgfQogCiAKICAgLyogYWRkIG9uZSBvciBtb3JlIHN0ZW1zIHRvIHRoZSBjdXJyZW50IGhpbnRzIHRhYmxlICovCiAgIHN0YXRpYyB2b2lkCiAgIHBzX2hpbnRzX3N0ZW0oIFBTX0hpbnRzICBoaW50cywKLSAgICAgICAgICAgICAgICAgRlRfSW50ICAgIGRpbWVuc2lvbiwKLSAgICAgICAgICAgICAgICAgRlRfVUludCAgIGNvdW50LAorICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZGltZW5zaW9uLAorICAgICAgICAgICAgICAgICBGVF9JbnQgICAgY291bnQsCiAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICBzdGVtcyApCiAgIHsKLSAgICBpZiAoICFoaW50cy0+ZXJyb3IgKQorICAgIFBTX0RpbWVuc2lvbiAgZGltOworCisKKyAgICBpZiAoIGhpbnRzLT5lcnJvciApCisgICAgICByZXR1cm47CisKKyAgICAvKiBsaW1pdCAiZGltZW5zaW9uIiB0byAwLi4xICovCisgICAgaWYgKCBkaW1lbnNpb24gPiAxICkKICAgICB7Ci0gICAgICAvKiBsaW1pdCAiZGltZW5zaW9uIiB0byAwLi4xICovCi0gICAgICBpZiAoIGRpbWVuc2lvbiA8IDAgfHwgZGltZW5zaW9uID4gMSApCisgICAgICBGVF9UUkFDRTAoKCAicHNfaGludHNfc3RlbTogaW52YWxpZCBkaW1lbnNpb24gKCVkKSB1c2VkXG4iLAorICAgICAgICAgICAgICAgICAgZGltZW5zaW9uICkpOworICAgICAgZGltZW5zaW9uID0gKCBkaW1lbnNpb24gIT0gMCApOworICAgIH0KKworICAgIC8qIHJlY29yZCB0aGUgc3RlbXMgaW4gdGhlIGN1cnJlbnQgaGludHMvbWFza3MgdGFibGUgKi8KKyAgICAvKiAoVHlwZSAxICYgMidzIGBoc3RlbScgb3IgYHZzdGVtJyBvcGVyYXRvcnMpICAgICAgICovCisgICAgZGltID0gJmhpbnRzLT5kaW1lbnNpb25bZGltZW5zaW9uXTsKKworICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBzdGVtcyArPSAyICkKKyAgICB7CisgICAgICBGVF9FcnJvciAgIGVycm9yOworICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBoaW50cy0+bWVtb3J5OworCisKKyAgICAgIGVycm9yID0gcHNfZGltZW5zaW9uX2FkZF90MXN0ZW0oIGRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9JbnQpc3RlbXNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfSW50KXN0ZW1zWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCApOworICAgICAgaWYgKCBlcnJvciApCiAgICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMCgoICJwc19oaW50c19zdGVtOiBpbnZhbGlkIGRpbWVuc2lvbiAoJWQpIHVzZWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbiApKTsKLSAgICAgICAgZGltZW5zaW9uID0gKCBkaW1lbnNpb24gIT0gMCApOwotICAgICAgfQorICAgICAgICBGVF9FUlJPUigoICJwc19oaW50c19zdGVtOiBjb3VsZCBub3QgYWRkIHN0ZW0iCisgICAgICAgICAgICAgICAgICAgIiAoJWQsJWQpIHRvIGhpbnRzIHRhYmxlXG4iLCBzdGVtc1swXSwgc3RlbXNbMV0gKSk7CiAKLSAgICAgIC8qIHJlY29yZCB0aGUgc3RlbXMgaW4gdGhlIGN1cnJlbnQgaGludHMvbWFza3MgdGFibGUgKi8KLSAgICAgIHN3aXRjaCAoIGhpbnRzLT5oaW50X3R5cGUgKQotICAgICAgewotICAgICAgY2FzZSBQU19ISU5UX1RZUEVfMTogIC8qIFR5cGUgMSAiaHN0ZW0iIG9yICJ2c3RlbSIgb3BlcmF0b3IgKi8KLSAgICAgIGNhc2UgUFNfSElOVF9UWVBFXzI6ICAvKiBUeXBlIDIgImhzdGVtIiBvciAidnN0ZW0iIG9wZXJhdG9yICovCi0gICAgICAgIHsKLSAgICAgICAgICBQU19EaW1lbnNpb24gIGRpbSA9ICZoaW50cy0+ZGltZW5zaW9uW2RpbWVuc2lvbl07Ci0KLQotICAgICAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBzdGVtcyArPSAyICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9FcnJvciAgIGVycm9yOwotICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBoaW50cy0+bWVtb3J5OwotCi0KLSAgICAgICAgICAgIGVycm9yID0gcHNfZGltZW5zaW9uX2FkZF90MXN0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgZGltLCAoRlRfSW50KXN0ZW1zWzBdLCAoRlRfSW50KXN0ZW1zWzFdLAotICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwgTlVMTCApOwotICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX0VSUk9SKCggInBzX2hpbnRzX3N0ZW06IGNvdWxkIG5vdCBhZGQgc3RlbSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiICglZCwlZCkgdG8gaGludHMgdGFibGVcbiIsIHN0ZW1zWzBdLCBzdGVtc1sxXSApKTsKLQotICAgICAgICAgICAgICBoaW50cy0+ZXJyb3IgPSBlcnJvcjsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBGVF9UUkFDRTAoKCAicHNfaGludHNfc3RlbTogY2FsbGVkIHdpdGggaW52YWxpZCBoaW50IHR5cGUgKCVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgaGludHMtPmhpbnRfdHlwZSApKTsKLSAgICAgICAgYnJlYWs7CisgICAgICAgIGhpbnRzLT5lcnJvciA9IGVycm9yOworICAgICAgICByZXR1cm47CiAgICAgICB9CiAgICAgfQogICB9CkBAIC04OTEsNyArODg3LDcgQEAKICAgLyogYWRkIG9uZSBUeXBlMSBjb3VudGVyIHN0ZW0gdG8gdGhlIGN1cnJlbnQgaGludHMgdGFibGUgKi8KICAgc3RhdGljIHZvaWQKICAgcHNfaGludHNfdDFzdGVtMyggUFNfSGludHMgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBkaW1lbnNpb24sCisgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZGltZW5zaW9uLAogICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIHN0ZW1zICkKICAgewogICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKQEAgLTkwNiw3ICs5MDIsNyBAQAogCiAKICAgICAgIC8qIGxpbWl0ICJkaW1lbnNpb24iIHRvIDAuLjEgKi8KLSAgICAgIGlmICggZGltZW5zaW9uIDwgMCB8fCBkaW1lbnNpb24gPiAxICkKKyAgICAgIGlmICggZGltZW5zaW9uID4gMSApCiAgICAgICB7CiAgICAgICAgIEZUX1RSQUNFMCgoICJwc19oaW50c190MXN0ZW0zOiBpbnZhbGlkIGRpbWVuc2lvbiAoJWQpIHVzZWRcbiIsCiAgICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbiApKTsKQEAgLTExMjgsNyArMTEyNCw3IEBACiAKICAgc3RhdGljIHZvaWQKICAgdDFfaGludHNfc3RlbSggVDFfSGludHMgICBoaW50cywKLSAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBkaW1lbnNpb24sCisgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZGltZW5zaW9uLAogICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApCiAgIHsKICAgICBGVF9Qb3MgIHN0ZW1zWzJdOwpAQCAtMTE3MiwxMiArMTE2OCwxMiBAQAogCiAgIHN0YXRpYyB2b2lkCiAgIHQyX2hpbnRzX3N0ZW1zKCBUMl9IaW50cyAgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBkaW1lbnNpb24sCisgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGRpbWVuc2lvbiwKICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgY291bnQsCiAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApCiAgIHsKLSAgICBGVF9Qb3MgIHN0ZW1zWzMyXSwgeSwgbjsKLSAgICBGVF9JbnQgIHRvdGFsID0gY291bnQ7CisgICAgRlRfUG9zICBzdGVtc1szMl0sIHk7CisgICAgRlRfSW50ICB0b3RhbCA9IGNvdW50LCBuOwogCiAKICAgICB5ID0gMDsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hyZWMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hyZWMuaAppbmRleCBhODhmZTZlLi4yYjFhZDk0IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNoaW50ZXIvcHNocmVjLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaHJlYy5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFBvc3RzY3JpcHQgKFR5cGUxL1R5cGUyKSBoaW50cyByZWNvcmRlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA2LCAyMDA4LCAyMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwMS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC02MSwxMiArNjEsOCBAQAogCiAKICAgLyogaGludCBmbGFncyAqLwotICB0eXBlZGVmIGVudW0gIFBTX0hpbnRfRmxhZ3NfCi0gIHsKLSAgICBQU19ISU5UX0ZMQUdfR0hPU1QgID0gMSwKLSAgICBQU19ISU5UX0ZMQUdfQk9UVE9NID0gMgotCi0gIH0gUFNfSGludF9GbGFnczsKKyNkZWZpbmUgUFNfSElOVF9GTEFHX0dIT1NUICAgMVUKKyNkZWZpbmUgUFNfSElOVF9GTEFHX0JPVFRPTSAgMlUKIAogCiAgIC8qIGhpbnQgZGVzY3JpcHRvciAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzbmFtZXMvSmFtZmlsZSBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc25hbWVzL0phbWZpbGUKaW5kZXggMDZjMGRkYS4uNmRjYzhiOCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzbmFtZXMvSmFtZmlsZQorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNuYW1lcy9KYW1maWxlCkBAIC0xLDYgKzEsNiBAQAogIyBGcmVlVHlwZSAyIHNyYy9wc25hbWVzIEphbWZpbGUKICMKLSMgQ29weXJpZ2h0IDIwMDEgYnkKKyMgQ29weXJpZ2h0IDIwMDEtMjAxNSBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC0xNiw3ICsxNiw5IEBACiAKICAgaWYgJChGVDJfTVVMVEkpCiAgIHsKLSAgICBfc291cmNlcyA9IHBzbW9kdWxlIHBzcGljIDsKKyAgICBfc291cmNlcyA9IHBzbW9kdWxlCisgICAgICAgICAgICAgICBwc3BpYworICAgICAgICAgICAgICAgOwogICB9CiAgIGVsc2UKICAgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzbmFtZXMvcHNtb2R1bGUuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc25hbWVzL3BzbW9kdWxlLmMKaW5kZXggMGE1YmNiNy4uMGYwNGMyZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzbmFtZXMvcHNtb2R1bGUuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNuYW1lcy9wc21vZHVsZS5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFBTTmFtZXMgbW9kdWxlIGltcGxlbWVudGF0aW9uIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDMsIDIwMDUtMjAwOCwgMjAxMiwgMjAxMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC0zMTIsNyArMzEyLDcgQEAKIAogICAgIC8qIHdlIGZpcnN0IGFsbG9jYXRlIHRoZSB0YWJsZSAqLwogICAgIHRhYmxlLT5udW1fbWFwcyA9IDA7Ci0gICAgdGFibGUtPm1hcHMgICAgID0gMDsKKyAgICB0YWJsZS0+bWFwcyAgICAgPSBOVUxMOwogCiAgICAgaWYgKCAhRlRfTkVXX0FSUkFZKCB0YWJsZS0+bWFwcywgbnVtX2dseXBocyArIEVYVFJBX0dMWVBIX0xJU1RfU0laRSApICkKICAgICB7CkBAIC01NjMsNyArNTYzLDcgQEAKICAgcHNuYW1lc19nZXRfc2VydmljZSggRlRfTW9kdWxlICAgIG1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHNlcnZpY2VfaWQgKQogICB7Ci0gICAgLyogUFNDTUFQU19TRVJWSUNFU19HRVQgZGVyZWZlcnMgYGxpYnJhcnknIGluIFBJQyBtb2RlICovCisgICAgLyogUFNDTUFQU19TRVJWSUNFU19HRVQgZGVyZWZlcmVuY2VzIGBsaWJyYXJ5JyBpbiBQSUMgbW9kZSAqLwogI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCiAgICAgRlRfTGlicmFyeSAgbGlicmFyeTsKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzbmFtZXMvcHNtb2R1bGUuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc25hbWVzL3BzbW9kdWxlLmgKaW5kZXggMjhmYTE0OC4uZjg1ZjMyMiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzbmFtZXMvcHNtb2R1bGUuaAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNuYW1lcy9wc21vZHVsZS5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEhpZ2gtbGV2ZWwgUFNOYW1lcyBtb2R1bGUgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNuYW1lcy9wc25hbWVyci5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzbmFtZXMvcHNuYW1lcnIuaAppbmRleCBhY2RhN2Y5Li4wOWNjMjQ3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNuYW1lcy9wc25hbWVyci5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc25hbWVzL3BzbmFtZXJyLmgKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgUFMgbmFtZXMgbW9kdWxlIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEsIDIwMTIgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAxLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc25hbWVzL3BzbmFtZXMuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc25hbWVzL3BzbmFtZXMuYwppbmRleCAxZWRlMjI1Li5hNDM4NTk2IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNuYW1lcy9wc25hbWVzLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzbmFtZXMvcHNuYW1lcy5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEZyZWVUeXBlIFBTTmFtZXMgbW9kdWxlIGNvbXBvbmVudCAoYm9keSBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNuYW1lcy9wc3BpYy5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzbmFtZXMvcHNwaWMuYwppbmRleCAzODIwZjY1Li4xMzk0Zjk3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNuYW1lcy9wc3BpYy5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc25hbWVzL3BzcGljLmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgZm9yIHBzbmFtZXMgbW9kdWxlLiAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDksIDIwMTAsIDIwMTIsIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDA5LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBPcmFuIEFncmEgYW5kIE1pY2tleSBHYWJlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc25hbWVzL3BzcGljLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNuYW1lcy9wc3BpYy5oCmluZGV4IDZmZjAwMmMuLjQ0MzIyNWEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc25hbWVzL3BzcGljLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzbmFtZXMvcHNwaWMuaApAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyBmb3IgcHNuYW1lcyBtb2R1bGUuICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOSwgMjAxMiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDktMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtMjAsMTAgKzIwLDkgQEAKICNkZWZpbmUgX19QU1BJQ19IX18KIAogCi1GVF9CRUdJTl9IRUFERVIKLQogI2luY2x1ZGUgRlRfSU5URVJOQUxfUElDX0gKIAorCiAjaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCiAKICNkZWZpbmUgUFNDTUFQU19TRVJWSUNFU19HRVQgICBwc2NtYXBzX3NlcnZpY2VzCkBAIC0zMyw2ICszMiw5IEBACiAKICNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9DTUFQU19ICiAKKworRlRfQkVHSU5fSEVBREVSCisKICAgdHlwZWRlZiBzdHJ1Y3QgIFBTTW9kdWxlUElDXwogICB7CiAgICAgRlRfU2VydmljZURlc2NSZWMqICAgICBwc2NtYXBzX3NlcnZpY2VzOwpAQCAtNTQsMTIgKzU2LDEyIEBACiAgIEZUX0Vycm9yCiAgIHBzbmFtZXNfbW9kdWxlX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7CiAKK0ZUX0VORF9IRUFERVIKKwogI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCiAKICAvKiAqLwogCi1GVF9FTkRfSEVBREVSCi0KICNlbmRpZiAvKiBfX1BTUElDX0hfXyAqLwogCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc25hbWVzL3BzdGFibGVzLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNuYW1lcy9wc3RhYmxlcy5oCmluZGV4IDBhNjYzN2YuLjNmMzFjMzEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc25hbWVzL3BzdGFibGVzLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzbmFtZXMvcHN0YWJsZXMuaApAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBQb3N0U2NyaXB0IGdseXBoIG5hbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNSwgMjAwOCwgMjAxMSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDUtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9KYW1maWxlIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9KYW1maWxlCmluZGV4IDRmNjBlODcuLjcxZGY1NjggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9yYXN0ZXIvSmFtZmlsZQorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL0phbWZpbGUKQEAgLTEsNiArMSw2IEBACiAjIEZyZWVUeXBlIDIgc3JjL3Jhc3RlciBKYW1maWxlCiAjCi0jIENvcHlyaWdodCAyMDAxIGJ5CisjIENvcHlyaWdodCAyMDAxLTIwMTUgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApAQCAtMTYsNyArMTYsMTAgQEAKIAogICBpZiAkKEZUMl9NVUxUSSkKICAgewotICAgIF9zb3VyY2VzID0gZnRyYXN0ZXIgZnRyZW5kMSByYXN0cGljIDsKKyAgICBfc291cmNlcyA9IGZ0cmFzdGVyCisgICAgICAgICAgICAgICBmdHJlbmQxCisgICAgICAgICAgICAgICByYXN0cGljCisgICAgICAgICAgICAgICA7CiAgIH0KICAgZWxzZQogICB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL2Z0bWlzYy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9mdG1pc2MuaAppbmRleCA3MDMxNTVhLi5iODdlMGI2IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL2Z0bWlzYy5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9yYXN0ZXIvZnRtaXNjLmgKQEAgLTUsNyArNSw3IEBACiAvKiAgICBNaXNjZWxsYW5lb3VzIG1hY3JvcyBmb3Igc3RhbmQtYWxvbmUgcmFzdGVyaXplciAoc3BlY2lmaWNhdGlvbiAgICAgICAqLwogLyogICAgb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDUsIDIwMDksIDIwMTAgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDA1LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KQEAgLTM3LDcgKzM3LDcgQEAKICNkZWZpbmUgRlRfTE9DQUxfREVGKCB4ICkgICBzdGF0aWMgeAogCiAKLSAgLyogZnJvbSBpbmNsdWRlL2ZyZWV0eXBlMi9mdHR5cGVzLmggKi8KKyAgLyogZnJvbSBpbmNsdWRlL2ZyZWV0eXBlL2Z0dHlwZXMuaCAqLwogCiAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgRlRfQnl0ZTsKICAgdHlwZWRlZiBzaWduZWQgaW50ICAgICBGVF9JbnQ7CkBAIC01NCw3ICs1NCw3IEBACiAgICAgICAgICAgICAgIChGVF9VTG9uZylfeDQgICAgICAgICApCiAKIAotICAvKiBmcm9tIGluY2x1ZGUvZnJlZXR5cGUyL2Z0c3lzdGVtLmggKi8KKyAgLyogZnJvbSBpbmNsdWRlL2ZyZWV0eXBlL2Z0c3lzdGVtLmggKi8KIAogICB0eXBlZGVmIHN0cnVjdCBGVF9NZW1vcnlSZWNfKiAgRlRfTWVtb3J5OwogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL2Z0cmFzdGVyLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL2Z0cmFzdGVyLmMKaW5kZXggYjA2YWMzMy4uZTRiYWI5OCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9mdHJhc3Rlci5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9yYXN0ZXIvZnRyYXN0ZXIuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBUaGUgRnJlZVR5cGUgZ2x5cGggcmFzdGVyaXplciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAzLCAyMDA1LCAyMDA3LTIwMTQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtMjQsOCArMjQsOCBAQAogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogLSBjb3B5IGBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMnICh0aGlzIGZpbGUpIHRvIHlvdXIgY3VycmVudCBkaXJlY3RvcnkgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIGNvcHkgYGluY2x1ZGUvZnRpbWFnZS5oJyBhbmQgYHNyYy9yYXN0ZXIvZnRtaXNjLmgnIHRvIHlvdXIgY3VycmVudCAgKi8KLSAgLyogICBkaXJlY3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIC0gY29weSBgaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmgnIGFuZCBgc3JjL3Jhc3Rlci9mdG1pc2MuaCcgdG8geW91ciAqLworICAvKiAgIGN1cnJlbnQgZGlyZWN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qIC0gY29tcGlsZSBgZnRyYXN0ZXInIHdpdGggdGhlIF9TVEFOREFMT05FXyBtYWNybyBkZWZpbmVkLCBhcyBpbiAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQ5LDYgKzQ5LDEwIEBACiAKICNpZmRlZiBfU1RBTkRBTE9ORV8KIAorICAvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVuZGVyIHBvb2wgdXNlZCBieSB0aGUgc2Nhbi1saW5lIGNvbnZlcnRlciAgKi8KKyAgLyogdG8gZG8gYWxsIG9mIGl0cyB3b3JrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX1JFTkRFUl9QT09MX1NJWkUgIDE2Mzg0TAorCiAjZGVmaW5lIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0ggIDxzdGRsaWIuaD4KIAogI2luY2x1ZGUgPHN0cmluZy5oPiAgICAgICAgICAgLyogZm9yIG1lbXNldCAqLwpAQCAtMTUwLDE0ICsxNTQsNiBAQAogICAvKiBkZWZpbmUgREVCVUdfUkFTVEVSIGlmIHlvdSB3YW50IHRvIGNvbXBpbGUgYSBkZWJ1Z2dpbmcgdmVyc2lvbiAqLwogLyogI2RlZmluZSBERUJVR19SQVNURVIgKi8KIAotICAvKiBkZWZpbmUgRlRfUkFTVEVSX09QVElPTl9BTlRJX0FMSUFTSU5HIGlmIHlvdSB3YW50IHRvIHN1cHBvcnQgKi8KLSAgLyogNS1sZXZlbHMgYW50aS1hbGlhc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIEZUX1JBU1RFUl9PUFRJT05fQU5USV9BTElBU0lORyAqLwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSB0d28tbGluZXMgaW50ZXJtZWRpYXRlIGJpdG1hcCB1c2VkICovCi0gIC8qIGZvciBhbnRpLWFsaWFzaW5nLCBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFJBU1RFUl9HUkFZX0xJTkVTICAyMDQ4Ci0KIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xODMsNiArMTc5LDggQEAKICNkZWZpbmUgRlRfRVJSX1hDQVQoIHgsIHkgKSAgeCAjIyB5CiAjZGVmaW5lIEZUX0VSUl9DQVQoIHgsIHkgKSAgIEZUX0VSUl9YQ0FUKCB4LCB5ICkKIAorI2RlZmluZSBGVF9NQVgoIGEsIGIgKSAgKCAoYSkgPiAoYikgPyAoYSkgOiAoYikgKQorCiAgIC8qIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGEgZnVuY3Rpb24gcGFyYW1ldGVyIGlzIHVudXNlZC4gKi8KICAgLyogSXRzIHB1cnBvc2UgaXMgc2ltcGx5IHRvIHJlZHVjZSBjb21waWxlciB3YXJuaW5ncy4gIE5vdGUgYWxzbyB0aGF0ICAqLwogICAvKiBzaW1wbHkgZGVmaW5pbmcgaXQgYXMgYCh2b2lkKXgnIGRvZXNuJ3QgYXZvaWQgd2FybmluZ3Mgd2l0aCBjZXJ0YWluICovCkBAIC0xOTksNiArMTk3LDcgQEAKICNkZWZpbmUgRlRfVFJBQ0UoIHggKSAgIGRvIHsgfSB3aGlsZSAoIDAgKSAgICAvKiBub3RoaW5nICovCiAjZGVmaW5lIEZUX1RSQUNFMSggeCApICBkbyB7IH0gd2hpbGUgKCAwICkgICAgLyogbm90aGluZyAqLwogI2RlZmluZSBGVF9UUkFDRTYoIHggKSAgZG8geyB9IHdoaWxlICggMCApICAgIC8qIG5vdGhpbmcgKi8KKyNkZWZpbmUgRlRfVFJBQ0U3KCB4ICkgIGRvIHsgfSB3aGlsZSAoIDAgKSAgICAvKiBub3RoaW5nICovCiAjZW5kaWYKIAogI2lmbmRlZiBGVF9USFJPVwpAQCAtMzE4LDcgKzMxNyw3IEBACiAKICAgdHlwZWRlZiB1bmlvbiAgQWxpZ25tZW50XwogICB7Ci0gICAgbG9uZyAgICBsOworICAgIExvbmcgICAgbDsKICAgICB2b2lkKiAgIHA7CiAgICAgdm9pZCAgKCpmKSh2b2lkKTsKIApAQCAtMzM0LDkgKzMzMyw5IEBACiAKIAogICAvKiB2YWx1ZXMgZm9yIHRoZSBgZmxhZ3MnIGJpdCBmaWVsZCAqLwotI2RlZmluZSBGbG93X1VwICAgICAgICAgICAweDgKLSNkZWZpbmUgT3ZlcnNob290X1RvcCAgICAgMHgxMAotI2RlZmluZSBPdmVyc2hvb3RfQm90dG9tICAweDIwCisjZGVmaW5lIEZsb3dfVXAgICAgICAgICAgIDB4MDhVCisjZGVmaW5lIE92ZXJzaG9vdF9Ub3AgICAgIDB4MTBVCisjZGVmaW5lIE92ZXJzaG9vdF9Cb3R0b20gIDB4MjBVCiAKIAogICAvKiBTdGF0ZXMgb2YgZWFjaCBsaW5lLCBhcmMsIGFuZCBwcm9maWxlICovCkBAIC0zNTgsMTQgKzM1NywxNCBAQAogICAgIEZUX0YyNkRvdDYgIFg7ICAgICAgICAgICAvKiBjdXJyZW50IGNvb3JkaW5hdGUgZHVyaW5nIHN3ZWVwICAgICAgICAgICovCiAgICAgUFByb2ZpbGUgICAgbGluazsgICAgICAgIC8qIGxpbmsgdG8gbmV4dCBwcm9maWxlICh2YXJpb3VzIHB1cnBvc2VzKSAgKi8KICAgICBQTG9uZyAgICAgICBvZmZzZXQ7ICAgICAgLyogc3RhcnQgb2YgcHJvZmlsZSdzIGRhdGEgaW4gcmVuZGVyIHBvb2wgICAqLwotICAgIHVuc2lnbmVkICAgIGZsYWdzOyAgICAgICAvKiBCaXQgMC0yOiBkcm9wLW91dCBtb2RlICAgICAgICAgICAgICAgICAgICovCisgICAgVVNob3J0ICAgICAgZmxhZ3M7ICAgICAgIC8qIEJpdCAwLTI6IGRyb3Atb3V0IG1vZGUgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQml0IDM6IHByb2ZpbGUgb3JpZW50YXRpb24gKHVwL2Rvd24pICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCaXQgNDogaXMgdG9wIHByb2ZpbGU/ICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJpdCA1OiBpcyBib3R0b20gcHJvZmlsZT8gICAgICAgICAgICAgICAgKi8KLSAgICBsb25nICAgICAgICBoZWlnaHQ7ICAgICAgLyogcHJvZmlsZSdzIGhlaWdodCBpbiBzY2FubGluZXMgICAgICAgICAgICAqLwotICAgIGxvbmcgICAgICAgIHN0YXJ0OyAgICAgICAvKiBwcm9maWxlJ3Mgc3RhcnRpbmcgc2NhbmxpbmUgICAgICAgICAgICAgICovCisgICAgTG9uZyAgICAgICAgaGVpZ2h0OyAgICAgIC8qIHByb2ZpbGUncyBoZWlnaHQgaW4gc2NhbmxpbmVzICAgICAgICAgICAgKi8KKyAgICBMb25nICAgICAgICBzdGFydDsgICAgICAgLyogcHJvZmlsZSdzIHN0YXJ0aW5nIHNjYW5saW5lICAgICAgICAgICAgICAqLwogCi0gICAgdW5zaWduZWQgICAgY291bnRMOyAgICAgIC8qIG51bWJlciBvZiBsaW5lcyB0byBzdGVwIGJlZm9yZSB0aGlzICAgICAgKi8KKyAgICBJbnQgICAgICAgICBjb3VudEw7ICAgICAgLyogbnVtYmVyIG9mIGxpbmVzIHRvIHN0ZXAgYmVmb3JlIHRoaXMgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm9maWxlIGJlY29tZXMgZHJhd2FibGUgICAgICAgICAgICAgICAgICovCiAKICAgICBQUHJvZmlsZSAgICBuZXh0OyAgICAgICAgLyogbmV4dCBwcm9maWxlIGluIHNhbWUgY29udG91ciwgdXNlZCAgICAgICAqLwpAQCAtMzg3LDcgKzM4Niw3IEBACiAKIAogI2RlZmluZSBBbGlnblByb2ZpbGVTaXplIFwKLSAgKCAoIHNpemVvZiAoIFRQcm9maWxlICkgKyBzaXplb2YgKCBBbGlnbm1lbnQgKSAtIDEgKSAvIHNpemVvZiAoIGxvbmcgKSApCisgICggKCBzaXplb2YgKCBUUHJvZmlsZSApICsgc2l6ZW9mICggQWxpZ25tZW50ICkgLSAxICkgLyBzaXplb2YgKCBMb25nICkgKQogCiAKICN1bmRlZiBSQVNfQVJHCkBAIC00NTEsNyArNDUwLDkgQEAKICNkZWZpbmUgQ0VJTElORyggeCApICAoICggKHgpICsgcmFzLnByZWNpc2lvbiAtIDEgKSAmIC1yYXMucHJlY2lzaW9uICkKICNkZWZpbmUgVFJVTkMoIHggKSAgICAoIChMb25nKSh4KSA+PiByYXMucHJlY2lzaW9uX2JpdHMgKQogI2RlZmluZSBGUkFDKCB4ICkgICAgICggKHgpICYgKCByYXMucHJlY2lzaW9uIC0gMSApICkKLSNkZWZpbmUgU0NBTEVEKCB4ICkgICAoICggKFVMb25nKSh4KSA8PCByYXMuc2NhbGVfc2hpZnQgKSAtIHJhcy5wcmVjaXNpb25faGFsZiApCisjZGVmaW5lIFNDQUxFRCggeCApICAgKCAoICh4KSA8IDAgPyAtKCAtKHgpIDw8IHJhcy5zY2FsZV9zaGlmdCApICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICggICh4KSA8PCByYXMuc2NhbGVfc2hpZnQgKSApIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIC0gcmFzLnByZWNpc2lvbl9oYWxmICkKIAogI2RlZmluZSBJU19CT1RUT01fT1ZFUlNIT09UKCB4ICkgXAogICAgICAgICAgIChCb29sKSggQ0VJTElORyggeCApIC0geCA+PSByYXMucHJlY2lzaW9uX2hhbGYgKQpAQCAtNTE0LDkgKzUxNSw2IEBACiAKICAgICBTaG9ydCAgICAgICB0cmFjZUluY3I7ICAgICAgICAgIC8qIHN3ZWVwJ3MgaW5jcmVtZW50IGluIHRhcmdldCBiaXRtYXAgICovCiAKLSAgICBTaG9ydCAgICAgICBncmF5X21pbl94OyAgICAgICAgIC8qIGN1cnJlbnQgbWluIHggZHVyaW5nIGdyYXkgcmVuZGVyaW5nICovCi0gICAgU2hvcnQgICAgICAgZ3JheV9tYXhfeDsgICAgICAgICAvKiBjdXJyZW50IG1heCB4IGR1cmluZyBncmF5IHJlbmRlcmluZyAqLwotCiAgICAgLyogZGlzcGF0Y2ggdmFyaWFibGVzICovCiAKICAgICBGdW5jdGlvbl9Td2VlcF9Jbml0KiAgUHJvY19Td2VlcF9Jbml0OwpAQCAtNTI5LDQ1ICs1MjcsMTkgQEAKICAgICBCb29sICAgICAgICBzZWNvbmRfcGFzczsgICAgICAgIC8qIGluZGljYXRlcyB3aGV0aGVyIGEgaG9yaXpvbnRhbCBwYXNzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaG91bGQgYmUgcGVyZm9ybWVkIHRvIGNvbnRyb2wgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHJvcC1vdXQgYWNjdXJhdGVseSB3aGVuIGNhbGxpbmcgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlbmRlcl9HbHlwaC4gIE5vdGUgdGhhdCB0aGVyZSBpcyAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBob3Jpem9udGFsIHBhc3MgZHVyaW5nIGdyYXkgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVuZGVyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlbmRlcl9HbHlwaC4gICAgICAgICAgICAgICAgICAgICAgICovCiAKICAgICBUUG9pbnQgICAgICBhcmNzWzMgKiBNYXhCZXppZXIgKyAxXTsgLyogVGhlIEJlemllciBzdGFjayAgICAgICAgICAgICAgICovCiAKICAgICBibGFja19UQmFuZCAgYmFuZF9zdGFja1sxNl07ICAgIC8qIGJhbmQgc3RhY2sgdXNlZCBmb3Igc3ViLWJhbmRpbmcgICAgICovCiAgICAgSW50ICAgICAgICAgIGJhbmRfdG9wOyAgICAgICAgICAvKiBiYW5kIHN0YWNrIHRvcCAgICAgICAgICAgICAgICAgICAgICAqLwogCi0jaWZkZWYgRlRfUkFTVEVSX09QVElPTl9BTlRJX0FMSUFTSU5HCi0KLSAgICBCeXRlKiAgICAgICBncmF5czsKLQotICAgIEJ5dGUgICAgICAgIGdyYXlfbGluZXNbUkFTVEVSX0dSQVlfTElORVNdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnRlcm1lZGlhdGUgdGFibGUgdXNlZCB0byByZW5kZXIgdGhlICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ3JheWxldmVscyBwaXhtYXBzLiAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdyYXlfbGluZXMgaXMgYSBidWZmZXIgaG9sZGluZyB0d28gICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb25vY2hyb21lIHNjYW5saW5lcyAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIFNob3J0ICAgICAgIGdyYXlfd2lkdGg7ICAgICAvKiB3aWR0aCBpbiBieXRlcyBvZiBvbmUgbW9ub2Nocm9tZSAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50ZXJtZWRpYXRlIHNjYW5saW5lIG9mIGdyYXlfbGluZXMuICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVhY2ggZ3JheSBwaXhlbCB0YWtlcyAyIGJpdHMgbG9uZyB0aGVyZSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBncmF5X2xpbmVzIG11c3QgaG9sZCAyIGxpbmVzLCB0aHVzIHdpdGggc2l6ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAvKiBpbiBieXRlcyBvZiBhdCBsZWFzdCBgZ3JheV93aWR0aCoyJy4gICAgICAgICAgICAgKi8KLQotI2VuZGlmIC8qIEZUX1JBU1RFUl9BTlRJX0FMSUFTSU5HICovCi0KICAgfTsKIAogCiAgIHR5cGVkZWYgc3RydWN0ICBibGFja19UUmFzdGVyXwogICB7Ci0gICAgY2hhciogICAgICAgICAgYnVmZmVyOwotICAgIGxvbmcgICAgICAgICAgIGJ1ZmZlcl9zaXplOwogICAgIHZvaWQqICAgICAgICAgIG1lbW9yeTsKLSAgICBibGFja19QV29ya2VyICB3b3JrZXI7Ci0gICAgQnl0ZSAgICAgICAgICAgZ3JheXNbNV07Ci0gICAgU2hvcnQgICAgICAgICAgZ3JheV93aWR0aDsKIAogICB9IGJsYWNrX1RSYXN0ZXIsICpibGFja19QUmFzdGVyOwogCkBAIC01ODMsNzAgKzU1NSw2IEBACiAjZW5kaWYgLyogIUZUX1NUQVRJQ19SQVNURVIgKi8KIAogCi0jaWZkZWYgRlRfUkFTVEVSX09QVElPTl9BTlRJX0FMSUFTSU5HCi0KLSAgLyogQSBsb29rdXAgdGFibGUgdXNlZCB0byBxdWlja2x5IGNvdW50IHNldCBiaXRzIGluIGZvdXIgZ3JheSAyeDIgKi8KLSAgLyogY2VsbHMuICBUaGUgdmFsdWVzIG9mIHRoZSB0YWJsZSBoYXZlIGJlZW4gcHJvZHVjZWQgd2l0aCB0aGUgICAgKi8KLSAgLyogZm9sbG93aW5nIGNvZGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBmb3IgKCBpID0gMDsgaSA8IDI1NjsgaSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGwgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGogPSBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGZvciAoIGMgPSAwOyBjIDwgNDsgYysrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgbCA8PD0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgaWYgKCBqICYgMHg4MCApIGwrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgaWYgKCBqICYgMHg0MCApIGwrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgaiA9ICggaiA8PCAyICkgJiAweEZGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIHByaW50ZiggIjB4JTA0WCIsIGwgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBzdGF0aWMgY29uc3Qgc2hvcnQgIGNvdW50X3RhYmxlWzI1Nl0gPQotICB7Ci0gICAgMHgwMDAwLCAweDAwMDEsIDB4MDAwMSwgMHgwMDAyLCAweDAwMTAsIDB4MDAxMSwgMHgwMDExLCAweDAwMTIsCi0gICAgMHgwMDEwLCAweDAwMTEsIDB4MDAxMSwgMHgwMDEyLCAweDAwMjAsIDB4MDAyMSwgMHgwMDIxLCAweDAwMjIsCi0gICAgMHgwMTAwLCAweDAxMDEsIDB4MDEwMSwgMHgwMTAyLCAweDAxMTAsIDB4MDExMSwgMHgwMTExLCAweDAxMTIsCi0gICAgMHgwMTEwLCAweDAxMTEsIDB4MDExMSwgMHgwMTEyLCAweDAxMjAsIDB4MDEyMSwgMHgwMTIxLCAweDAxMjIsCi0gICAgMHgwMTAwLCAweDAxMDEsIDB4MDEwMSwgMHgwMTAyLCAweDAxMTAsIDB4MDExMSwgMHgwMTExLCAweDAxMTIsCi0gICAgMHgwMTEwLCAweDAxMTEsIDB4MDExMSwgMHgwMTEyLCAweDAxMjAsIDB4MDEyMSwgMHgwMTIxLCAweDAxMjIsCi0gICAgMHgwMjAwLCAweDAyMDEsIDB4MDIwMSwgMHgwMjAyLCAweDAyMTAsIDB4MDIxMSwgMHgwMjExLCAweDAyMTIsCi0gICAgMHgwMjEwLCAweDAyMTEsIDB4MDIxMSwgMHgwMjEyLCAweDAyMjAsIDB4MDIyMSwgMHgwMjIxLCAweDAyMjIsCi0gICAgMHgxMDAwLCAweDEwMDEsIDB4MTAwMSwgMHgxMDAyLCAweDEwMTAsIDB4MTAxMSwgMHgxMDExLCAweDEwMTIsCi0gICAgMHgxMDEwLCAweDEwMTEsIDB4MTAxMSwgMHgxMDEyLCAweDEwMjAsIDB4MTAyMSwgMHgxMDIxLCAweDEwMjIsCi0gICAgMHgxMTAwLCAweDExMDEsIDB4MTEwMSwgMHgxMTAyLCAweDExMTAsIDB4MTExMSwgMHgxMTExLCAweDExMTIsCi0gICAgMHgxMTEwLCAweDExMTEsIDB4MTExMSwgMHgxMTEyLCAweDExMjAsIDB4MTEyMSwgMHgxMTIxLCAweDExMjIsCi0gICAgMHgxMTAwLCAweDExMDEsIDB4MTEwMSwgMHgxMTAyLCAweDExMTAsIDB4MTExMSwgMHgxMTExLCAweDExMTIsCi0gICAgMHgxMTEwLCAweDExMTEsIDB4MTExMSwgMHgxMTEyLCAweDExMjAsIDB4MTEyMSwgMHgxMTIxLCAweDExMjIsCi0gICAgMHgxMjAwLCAweDEyMDEsIDB4MTIwMSwgMHgxMjAyLCAweDEyMTAsIDB4MTIxMSwgMHgxMjExLCAweDEyMTIsCi0gICAgMHgxMjEwLCAweDEyMTEsIDB4MTIxMSwgMHgxMjEyLCAweDEyMjAsIDB4MTIyMSwgMHgxMjIxLCAweDEyMjIsCi0gICAgMHgxMDAwLCAweDEwMDEsIDB4MTAwMSwgMHgxMDAyLCAweDEwMTAsIDB4MTAxMSwgMHgxMDExLCAweDEwMTIsCi0gICAgMHgxMDEwLCAweDEwMTEsIDB4MTAxMSwgMHgxMDEyLCAweDEwMjAsIDB4MTAyMSwgMHgxMDIxLCAweDEwMjIsCi0gICAgMHgxMTAwLCAweDExMDEsIDB4MTEwMSwgMHgxMTAyLCAweDExMTAsIDB4MTExMSwgMHgxMTExLCAweDExMTIsCi0gICAgMHgxMTEwLCAweDExMTEsIDB4MTExMSwgMHgxMTEyLCAweDExMjAsIDB4MTEyMSwgMHgxMTIxLCAweDExMjIsCi0gICAgMHgxMTAwLCAweDExMDEsIDB4MTEwMSwgMHgxMTAyLCAweDExMTAsIDB4MTExMSwgMHgxMTExLCAweDExMTIsCi0gICAgMHgxMTEwLCAweDExMTEsIDB4MTExMSwgMHgxMTEyLCAweDExMjAsIDB4MTEyMSwgMHgxMTIxLCAweDExMjIsCi0gICAgMHgxMjAwLCAweDEyMDEsIDB4MTIwMSwgMHgxMjAyLCAweDEyMTAsIDB4MTIxMSwgMHgxMjExLCAweDEyMTIsCi0gICAgMHgxMjEwLCAweDEyMTEsIDB4MTIxMSwgMHgxMjEyLCAweDEyMjAsIDB4MTIyMSwgMHgxMjIxLCAweDEyMjIsCi0gICAgMHgyMDAwLCAweDIwMDEsIDB4MjAwMSwgMHgyMDAyLCAweDIwMTAsIDB4MjAxMSwgMHgyMDExLCAweDIwMTIsCi0gICAgMHgyMDEwLCAweDIwMTEsIDB4MjAxMSwgMHgyMDEyLCAweDIwMjAsIDB4MjAyMSwgMHgyMDIxLCAweDIwMjIsCi0gICAgMHgyMTAwLCAweDIxMDEsIDB4MjEwMSwgMHgyMTAyLCAweDIxMTAsIDB4MjExMSwgMHgyMTExLCAweDIxMTIsCi0gICAgMHgyMTEwLCAweDIxMTEsIDB4MjExMSwgMHgyMTEyLCAweDIxMjAsIDB4MjEyMSwgMHgyMTIxLCAweDIxMjIsCi0gICAgMHgyMTAwLCAweDIxMDEsIDB4MjEwMSwgMHgyMTAyLCAweDIxMTAsIDB4MjExMSwgMHgyMTExLCAweDIxMTIsCi0gICAgMHgyMTEwLCAweDIxMTEsIDB4MjExMSwgMHgyMTEyLCAweDIxMjAsIDB4MjEyMSwgMHgyMTIxLCAweDIxMjIsCi0gICAgMHgyMjAwLCAweDIyMDEsIDB4MjIwMSwgMHgyMjAyLCAweDIyMTAsIDB4MjIxMSwgMHgyMjExLCAweDIyMTIsCi0gICAgMHgyMjEwLCAweDIyMTEsIDB4MjIxMSwgMHgyMjEyLCAweDIyMjAsIDB4MjIyMSwgMHgyMjIxLCAweDIyMjIKLSAgfTsKLQotI2VuZGlmIC8qIEZUX1JBU1RFUl9PUFRJT05fQU5USV9BTElBU0lORyAqLwotCi0KLQogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgIC8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwpAQCAtNjc3LDExICs1ODUsMTEgQEAKICAgICAgKiBhcHByb3hpbWF0aW5nIGl0IGFzIGEgc3RyYWlnaHQgc2VnbWVudC4gIFRoZSBkZWZhdWx0IHZhbHVlIG9mIDMyIChmb3IKICAgICAgKiBsb3cgYWNjdXJhY3kpIGNvcnJlc3BvbmRzIHRvCiAgICAgICoKLSAgICAgKiAgIDMyIC8gNjQgPT0gMC41IHBpeGVscyAsCisgICAgICogICAzMiAvIDY0ID09IDAuNSBwaXhlbHMsCiAgICAgICoKICAgICAgKiB3aGlsZSBmb3IgdGhlIGhpZ2ggYWNjdXJhY3kgY2FzZSB3ZSBoYXZlCiAgICAgICoKLSAgICAgKiAgIDI1Ni8gKDEgPDwgMTIpID0gMC4wNjI1IHBpeGVscyAuCisgICAgICogICAyNTYgLyAoMSA8PCAxMikgPSAwLjA2MjUgcGl4ZWxzLgogICAgICAqCiAgICAgICogYHByZWNpc2lvbl9qaXR0ZXInIGlzIGFuIGVwc2lsb24gdGhyZXNob2xkIHVzZWQgaW4KICAgICAgKiBgVmVydGljYWxfU3dlZXBfU3BhbicgdG8gZGVhbCB3aXRoIHNtYWxsIGltcGVyZmVjdGlvbnMgaW4gdGhlIEJlemllcgpAQCAtNzY0LDEzICs2NzIsMTMgQEAKICAgICAgIGlmICggb3ZlcnNob290ICkKICAgICAgICAgcmFzLmNQcm9maWxlLT5mbGFncyB8PSBPdmVyc2hvb3RfQm90dG9tOwogCi0gICAgICBGVF9UUkFDRTYoKCAiTmV3IGFzY2VuZGluZyBwcm9maWxlID0gJXBcbiIsIHJhcy5jUHJvZmlsZSApKTsKKyAgICAgIEZUX1RSQUNFNigoICIgIG5ldyBhc2NlbmRpbmcgcHJvZmlsZSA9ICVwXG4iLCByYXMuY1Byb2ZpbGUgKSk7CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgRGVzY2VuZGluZ19TdGF0ZToKICAgICAgIGlmICggb3ZlcnNob290ICkKICAgICAgICAgcmFzLmNQcm9maWxlLT5mbGFncyB8PSBPdmVyc2hvb3RfVG9wOwotICAgICAgRlRfVFJBQ0U2KCggIk5ldyBkZXNjZW5kaW5nIHByb2ZpbGUgPSAlcFxuIiwgcmFzLmNQcm9maWxlICkpOworICAgICAgRlRfVFJBQ0U2KCggIiAgbmV3IGRlc2NlbmRpbmcgcHJvZmlsZSA9ICVwXG4iLCByYXMuY1Byb2ZpbGUgKSk7CiAgICAgICBicmVhazsKIAogICAgIGRlZmF1bHQ6CkBAIC04MjUsNyArNzMzLDcgQEAKICAgICAgIFBQcm9maWxlICBvbGRQcm9maWxlOwogCiAKLSAgICAgIEZUX1RSQUNFNigoICJFbmRpbmcgcHJvZmlsZSAlcCwgc3RhcnQgPSAlbGQsIGhlaWdodCA9ICVsZFxuIiwKKyAgICAgIEZUX1RSQUNFNigoICIgIGVuZGluZyBwcm9maWxlICVwLCBzdGFydCA9ICVsZCwgaGVpZ2h0ID0gJWxkXG4iLAogICAgICAgICAgICAgICAgICAgcmFzLmNQcm9maWxlLCByYXMuY1Byb2ZpbGUtPnN0YXJ0LCBoICkpOwogCiAgICAgICByYXMuY1Byb2ZpbGUtPmhlaWdodCA9IGg7CkBAIC04OTMsMTUgKzgwMSwxNCBAQAogCiAgICAgLyogaWYgaXQgaXMgPCwgc2ltcGx5IGluc2VydCBpdCwgaWdub3JlIGlmID09ICovCiAgICAgaWYgKCBuID49IDAgJiYgeSA+IHlfdHVybnNbbl0gKQotICAgICAgd2hpbGUgKCBuID49IDAgKQorICAgICAgZG8KICAgICAgIHsKICAgICAgICAgSW50ICB5MiA9IChJbnQpeV90dXJuc1tuXTsKIAogCiAgICAgICAgIHlfdHVybnNbbl0gPSB5OwogICAgICAgICB5ID0geTI7Ci0gICAgICAgIG4tLTsKLSAgICAgIH0KKyAgICAgIH0gd2hpbGUgKCAtLW4gPj0gMCApOwogCiAgICAgaWYgKCBuIDwgMCApCiAgICAgewpAQCAtOTQyLDcgKzg0OSw3IEBACiAKICAgICBpZiAoIG4gPiAxICYmIHAgKQogICAgIHsKLSAgICAgIHdoaWxlICggbiA+IDAgKQorICAgICAgZG8KICAgICAgIHsKICAgICAgICAgSW50ICBib3R0b20sIHRvcDsKIApAQCAtOTcwLDggKzg3Nyw3IEBACiAgICAgICAgICAgcmV0dXJuIEZBSUxVUkU7CiAKICAgICAgICAgcCA9IHAtPmxpbms7Ci0gICAgICAgIG4tLTsKLSAgICAgIH0KKyAgICAgIH0gd2hpbGUgKCAtLW4gKTsKICAgICB9CiAgICAgZWxzZQogICAgICAgcmFzLmZQcm9maWxlID0gTlVMTDsKQEAgLTEzNDIsNyArMTI0OCw3IEBACiAKICAgICBzdGFydF9hcmMgPSBhcmM7CiAKLSAgICB3aGlsZSAoIGFyYyA+PSBzdGFydF9hcmMgJiYgZSA8PSBlMiApCisgICAgZG8KICAgICB7CiAgICAgICByYXMuam9pbnQgPSBGQUxTRTsKIApAQCAtMTM3NSw3ICsxMjgxLDcgQEAKICAgICAgICAgfQogICAgICAgICBhcmMgLT0gZGVncmVlOwogICAgICAgfQotICAgIH0KKyAgICB9IHdoaWxlICggYXJjID49IHN0YXJ0X2FyYyAmJiBlIDw9IGUyICk7CiAKICAgRmluOgogICAgIHJhcy50b3AgID0gdG9wOwpAQCAtMTgxMyw3ICsxNzE5LDcgQEAKICAgc3RhdGljIEJvb2wKICAgRGVjb21wb3NlX0N1cnZlKCBSQVNfQVJHUyBVU2hvcnQgIGZpcnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTaG9ydCAgbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgIGZsaXBwZWQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludCAgICAgZmxpcHBlZCApCiAgIHsKICAgICBGVF9WZWN0b3IgICB2X2xhc3Q7CiAgICAgRlRfVmVjdG9yICAgdl9jb250cm9sOwpAQCAtMTgyNCw3ICsxNzMwLDcgQEAKICAgICBGVF9WZWN0b3IqICBsaW1pdDsKICAgICBjaGFyKiAgICAgICB0YWdzOwogCi0gICAgdW5zaWduZWQgICAgdGFnOyAgICAgICAvKiBjdXJyZW50IHBvaW50J3Mgc3RhdGUgICAgICAgICAgICovCisgICAgVUludCAgICAgICAgdGFnOyAgICAgICAvKiBjdXJyZW50IHBvaW50J3Mgc3RhdGUgICAgICAgICAgICovCiAKIAogICAgIHBvaW50cyA9IHJhcy5vdXRsaW5lLnBvaW50czsKQEAgLTIwMzUsMTAgKzE5NDEsMTAgQEAKICAgLyogICAgcmVuZGVyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgQm9vbAotICBDb252ZXJ0X0dseXBoKCBSQVNfQVJHUyBpbnQgIGZsaXBwZWQgKQorICBDb252ZXJ0X0dseXBoKCBSQVNfQVJHUyBJbnQgIGZsaXBwZWQgKQogICB7Ci0gICAgaW50ICAgICAgIGk7Ci0gICAgdW5zaWduZWQgIHN0YXJ0OworICAgIEludCAgIGk7CisgICAgVUludCAgc3RhcnQ7CiAKIAogICAgIHJhcy5mUHJvZmlsZSA9IE5VTEw7CkBAIC0yMDY0LDEyICsxOTcwLDEyIEBACiAgICAgICByYXMuc3RhdGUgICAgPSBVbmtub3duX1N0YXRlOwogICAgICAgcmFzLmdQcm9maWxlID0gTlVMTDsKIAotICAgICAgaWYgKCBEZWNvbXBvc2VfQ3VydmUoIFJBU19WQVJTICh1bnNpZ25lZCBzaG9ydClzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXMub3V0bGluZS5jb250b3Vyc1tpXSwKKyAgICAgIGlmICggRGVjb21wb3NlX0N1cnZlKCBSQVNfVkFSUyAoVVNob3J0KXN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVU2hvcnQpcmFzLm91dGxpbmUuY29udG91cnNbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxpcHBlZCApICkKICAgICAgICAgcmV0dXJuIEZBSUxVUkU7CiAKLSAgICAgIHN0YXJ0ID0gcmFzLm91dGxpbmUuY29udG91cnNbaV0gKyAxOworICAgICAgc3RhcnQgPSAoVVNob3J0KXJhcy5vdXRsaW5lLmNvbnRvdXJzW2ldICsgMTsKIAogICAgICAgLyogd2UgbXVzdCBub3cgY2hlY2sgd2hldGhlciB0aGUgZXh0cmVtZSBhcmNzIGpvaW4gb3Igbm90ICovCiAgICAgICBpZiAoIEZSQUMoIHJhcy5sYXN0WSApID09IDAgJiYKQEAgLTIwODMsNyArMTk4OSw4IEBACiAgICAgICAgIC8qIHRvIGJlIGRyYXduLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKICAgICAgIGxhc3RQcm9maWxlID0gcmFzLmNQcm9maWxlOwotICAgICAgaWYgKCByYXMuY1Byb2ZpbGUtPmZsYWdzICYgRmxvd19VcCApCisgICAgICBpZiAoIHJhcy50b3AgIT0gcmFzLmNQcm9maWxlLT5vZmZzZXQgJiYKKyAgICAgICAgICAgKCByYXMuY1Byb2ZpbGUtPmZsYWdzICYgRmxvd19VcCApICkKICAgICAgICAgbyA9IElTX1RPUF9PVkVSU0hPT1QoIHJhcy5sYXN0WSApOwogICAgICAgZWxzZQogICAgICAgICBvID0gSVNfQk9UVE9NX09WRVJTSE9PVCggcmFzLmxhc3RZICk7CkBAIC0yMjA3LDcgKzIxMTQsNyBAQAogICAgIHdoaWxlICggY3VycmVudCApCiAgICAgewogICAgICAgY3VycmVudC0+WCAgICAgICA9ICpjdXJyZW50LT5vZmZzZXQ7Ci0gICAgICBjdXJyZW50LT5vZmZzZXQgKz0gY3VycmVudC0+ZmxhZ3MgJiBGbG93X1VwID8gMSA6IC0xOworICAgICAgY3VycmVudC0+b2Zmc2V0ICs9ICggY3VycmVudC0+ZmxhZ3MgJiBGbG93X1VwICkgPyAxIDogLTE7CiAgICAgICBjdXJyZW50LT5oZWlnaHQtLTsKICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5saW5rOwogICAgIH0KQEAgLTIyNjcsMTAgKzIxNzQsNyBAQAogICAgIHJhcy50cmFjZUluY3IgPSAoU2hvcnQpLXBpdGNoOwogICAgIHJhcy50cmFjZU9mcyAgPSAtKm1pbiAqIHBpdGNoOwogICAgIGlmICggcGl0Y2ggPiAwICkKLSAgICAgIHJhcy50cmFjZU9mcyArPSAoIHJhcy50YXJnZXQucm93cyAtIDEgKSAqIHBpdGNoOwotCi0gICAgcmFzLmdyYXlfbWluX3ggPSAwOwotICAgIHJhcy5ncmF5X21heF94ID0gMDsKKyAgICAgIHJhcy50cmFjZU9mcyArPSAoTG9uZykoIHJhcy50YXJnZXQucm93cyAtIDEgKSAqIHBpdGNoOwogICB9CiAKIApAQCAtMjI5MSw2ICsyMTk1LDE0IEBACiAgICAgRlRfVU5VU0VEKCByaWdodCApOwogCiAKKyAgICAvKiBpbiBoaWdoLXByZWNpc2lvbiBtb2RlLCB3ZSBuZWVkIDEyIGRpZ2l0cyBhZnRlciB0aGUgY29tbWEgdG8gKi8KKyAgICAvKiByZXByZXNlbnQgbXVsdGlwbGVzIG9mIDEvKDE8PDEyKSA9IDEvNDA5NiAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBGVF9UUkFDRTcoKCAiICB5PSVkIHg9WyUuMTJmOyUuMTJmXSwgZHJvcC1vdXQ9JWQiLAorICAgICAgICAgICAgICAgIHksCisgICAgICAgICAgICAgICAgeDEgLyAoZG91YmxlKXJhcy5wcmVjaXNpb24sCisgICAgICAgICAgICAgICAgeDIgLyAoZG91YmxlKXJhcy5wcmVjaXNpb24sCisgICAgICAgICAgICAgICAgZHJvcE91dENvbnRyb2wgKSk7CisKICAgICAvKiBEcm9wLW91dCBjb250cm9sICovCiAKICAgICBlMSA9IFRSVU5DKCBDRUlMSU5HKCB4MSApICk7CkBAIC0yMzAzLDcgKzIyMTUsNyBAQAogCiAgICAgaWYgKCBlMiA+PSAwICYmIGUxIDwgcmFzLmJXaWR0aCApCiAgICAgewotICAgICAgaW50ICAgYzEsIGMyOworICAgICAgSW50ICAgYzEsIGMyOwogICAgICAgQnl0ZSAgZjEsIGYyOwogCiAKQEAgLTIzMTIsMTcgKzIyMjQsMTQgQEAKICAgICAgIGlmICggZTIgPj0gcmFzLmJXaWR0aCApCiAgICAgICAgIGUyID0gcmFzLmJXaWR0aCAtIDE7CiAKKyAgICAgIEZUX1RSQUNFNygoICIgLT4geD1bJWQ7JWRdIiwgZTEsIGUyICkpOworCiAgICAgICBjMSA9IChTaG9ydCkoIGUxID4+IDMgKTsKICAgICAgIGMyID0gKFNob3J0KSggZTIgPj4gMyApOwogCiAgICAgICBmMSA9IChCeXRlKSAgKCAweEZGID4+ICggZTEgJiA3ICkgKTsKICAgICAgIGYyID0gKEJ5dGUpIH4oIDB4N0YgPj4gKCBlMiAmIDcgKSApOwogCi0gICAgICBpZiAoIHJhcy5ncmF5X21pbl94ID4gYzEgKQotICAgICAgICByYXMuZ3JheV9taW5feCA9IChzaG9ydCljMTsKLSAgICAgIGlmICggcmFzLmdyYXlfbWF4X3ggPCBjMiApCi0gICAgICAgIHJhcy5ncmF5X21heF94ID0gKHNob3J0KWMyOwotCiAgICAgICB0YXJnZXQgPSByYXMuYlRhcmdldCArIHJhcy50cmFjZU9mcyArIGMxOwogICAgICAgYzIgLT0gYzE7CiAKQEAgLTIzNDQsNiArMjI1Myw4IEBACiAgICAgICBlbHNlCiAgICAgICAgICp0YXJnZXQgfD0gKCBmMSAmIGYyICk7CiAgICAgfQorCisgICAgRlRfVFJBQ0U3KCggIlxuIiApKTsKICAgfQogCiAKQEAgLTIzNTgsNiArMjI2OSwxMSBAQAogICAgIFNob3J0ICBjMSwgZjE7CiAKIAorICAgIEZUX1RSQUNFNygoICIgIHk9JWQgeD1bJS4xMmY7JS4xMmZdIiwKKyAgICAgICAgICAgICAgICB5LAorICAgICAgICAgICAgICAgIHgxIC8gKGRvdWJsZSlyYXMucHJlY2lzaW9uLAorICAgICAgICAgICAgICAgIHgyIC8gKGRvdWJsZSlyYXMucHJlY2lzaW9uICkpOworCiAgICAgLyogRHJvcC1vdXQgY29udHJvbCAqLwogCiAgICAgLyogICBlMiAgICAgICAgICAgIHgyICAgICAgICAgICAgICAgICAgICB4MSAgICAgICAgICAgZTEgICAqLwpAQCAtMjM5MCw2ICsyMzA2LDggQEAKICAgICAgIEludCAgZHJvcE91dENvbnRyb2wgPSBsZWZ0LT5mbGFncyAmIDc7CiAKIAorICAgICAgRlRfVFJBQ0U3KCggIiwgZHJvcC1vdXQ9JWQiLCBkcm9wT3V0Q29udHJvbCApKTsKKwogICAgICAgaWYgKCBlMSA9PSBlMiArIHJhcy5wcmVjaXNpb24gKQogICAgICAgewogICAgICAgICBzd2l0Y2ggKCBkcm9wT3V0Q29udHJvbCApCkBAIC0yNDM2LDE0ICsyMzU0LDE0IEBACiAgICAgICAgICAgICAgICBsZWZ0LT5oZWlnaHQgPD0gMCAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAhKCBsZWZ0LT5mbGFncyAmIE92ZXJzaG9vdF9Ub3AgICAmJgogICAgICAgICAgICAgICAgICAgeDIgLSB4MSA+PSByYXMucHJlY2lzaW9uX2hhbGYgKSApCi0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBnb3RvIEV4aXQ7CiAKICAgICAgICAgICAvKiBsb3dlciBzdHViIHRlc3QgKi8KICAgICAgICAgICBpZiAoIHJpZ2h0LT5uZXh0ID09IGxlZnQgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICBsZWZ0LT5zdGFydCA9PSB5ICAgICAgICAgICAgICAgICAgICAmJgogICAgICAgICAgICAgICAgISggbGVmdC0+ZmxhZ3MgJiBPdmVyc2hvb3RfQm90dG9tICYmCiAgICAgICAgICAgICAgICAgICB4MiAtIHgxID49IHJhcy5wcmVjaXNpb25faGFsZiAgKSApCi0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBnb3RvIEV4aXQ7CiAKICAgICAgICAgICBpZiAoIGRyb3BPdXRDb250cm9sID09IDEgKQogICAgICAgICAgICAgcHhsID0gZTI7CkBAIC0yNDUyLDcgKzIzNzAsNyBAQAogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6IC8qIG1vZGVzIDIsIDMsIDYsIDcgKi8KLSAgICAgICAgICByZXR1cm47ICAvKiBubyBkcm9wLW91dCBjb250cm9sICovCisgICAgICAgICAgZ290byBFeGl0OyAgLyogbm8gZHJvcC1vdXQgY29udHJvbCAqLwogICAgICAgICB9CiAKICAgICAgICAgLyogdW5kb2N1bWVudGVkIGJ1dCBjb25maXJtZWQ6IElmIHRoZSBkcm9wLW91dCB3b3VsZCByZXN1bHQgaW4gYSAgKi8KQEAgLTI0NzMsMjYgKzIzOTEsMjYgQEAKIAogICAgICAgICBpZiAoIGUxID49IDAgJiYgZTEgPCByYXMuYldpZHRoICAgICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgcmFzLmJUYXJnZXRbcmFzLnRyYWNlT2ZzICsgYzFdICYgKCAweDgwID4+IGYxICkgKQotICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICB9CiAgICAgICBlbHNlCi0gICAgICAgIHJldHVybjsKKyAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAogICAgIGUxID0gVFJVTkMoIHB4bCApOwogCiAgICAgaWYgKCBlMSA+PSAwICYmIGUxIDwgcmFzLmJXaWR0aCApCiAgICAgeworICAgICAgRlRfVFJBQ0U3KCggIiAtPiB4PSVkIChkcm9wLW91dCkiLCBlMSApKTsKKwogICAgICAgYzEgPSAoU2hvcnQpKCBlMSA+PiAzICk7CiAgICAgICBmMSA9IChTaG9ydCkoIGUxICYgNyApOwogCi0gICAgICBpZiAoIHJhcy5ncmF5X21pbl94ID4gYzEgKQotICAgICAgICByYXMuZ3JheV9taW5feCA9IGMxOwotICAgICAgaWYgKCByYXMuZ3JheV9tYXhfeCA8IGMxICkKLSAgICAgICAgcmFzLmdyYXlfbWF4X3ggPSBjMTsKLQogICAgICAgcmFzLmJUYXJnZXRbcmFzLnRyYWNlT2ZzICsgYzFdIHw9IChjaGFyKSggMHg4MCA+PiBmMSApOwogICAgIH0KKworICBFeGl0OgorICAgIEZUX1RSQUNFNygoICJcbiIgKSk7CiAgIH0KIAogCkBAIC0yNTM5LDMyICsyNDU3LDM5IEBACiAgICAgICBMb25nICBlMSwgZTI7CiAKIAorICAgICAgRlRfVFJBQ0U3KCggIiAgeD0lZCB5PVslLjEyZjslLjEyZl0iLAorICAgICAgICAgICAgICAgICAgeSwKKyAgICAgICAgICAgICAgICAgIHgxIC8gKGRvdWJsZSlyYXMucHJlY2lzaW9uLAorICAgICAgICAgICAgICAgICAgeDIgLyAoZG91YmxlKXJhcy5wcmVjaXNpb24gKSk7CisKICAgICAgIGUxID0gQ0VJTElORyggeDEgKTsKICAgICAgIGUyID0gRkxPT1IgICggeDIgKTsKIAogICAgICAgaWYgKCBlMSA9PSBlMiApCiAgICAgICB7Ci0gICAgICAgIEJ5dGUgICBmMTsKLSAgICAgICAgUEJ5dGUgIGJpdHM7Ci0KLQotICAgICAgICBiaXRzID0gcmFzLmJUYXJnZXQgKyAoIHkgPj4gMyApOwotICAgICAgICBmMSAgID0gKEJ5dGUpKCAweDgwID4+ICggeSAmIDcgKSApOwotCiAgICAgICAgIGUxID0gVFJVTkMoIGUxICk7CiAKICAgICAgICAgaWYgKCBlMSA+PSAwICYmIChVTG9uZyllMSA8IHJhcy50YXJnZXQucm93cyApCiAgICAgICAgIHsKKyAgICAgICAgICBCeXRlICAgZjE7CisgICAgICAgICAgUEJ5dGUgIGJpdHM7CiAgICAgICAgICAgUEJ5dGUgIHA7CiAKIAotICAgICAgICAgIHAgPSBiaXRzIC0gZTEgKiByYXMudGFyZ2V0LnBpdGNoOworICAgICAgICAgIEZUX1RSQUNFNygoICIgLT4geT0lZCAoZHJvcC1vdXQpIiwgZTEgKSk7CisKKyAgICAgICAgICBiaXRzID0gcmFzLmJUYXJnZXQgKyAoIHkgPj4gMyApOworICAgICAgICAgIGYxICAgPSAoQnl0ZSkoIDB4ODAgPj4gKCB5ICYgNyApICk7CisgICAgICAgICAgcCAgICA9IGJpdHMgLSBlMSAqIHJhcy50YXJnZXQucGl0Y2g7CisKICAgICAgICAgICBpZiAoIHJhcy50YXJnZXQucGl0Y2ggPiAwICkKLSAgICAgICAgICAgIHAgKz0gKCByYXMudGFyZ2V0LnJvd3MgLSAxICkgKiByYXMudGFyZ2V0LnBpdGNoOworICAgICAgICAgICAgcCArPSAoTG9uZykoIHJhcy50YXJnZXQucm93cyAtIDEgKSAqIHJhcy50YXJnZXQucGl0Y2g7CiAKICAgICAgICAgICBwWzBdIHw9IGYxOwogICAgICAgICB9CiAgICAgICB9CisKKyAgICAgIEZUX1RSQUNFNygoICJcbiIgKSk7CiAgICAgfQogICB9CiAKQEAgLTI1ODEsNiArMjUwNiwxMSBAQAogICAgIEJ5dGUgICBmMTsKIAogCisgICAgRlRfVFJBQ0U3KCggIiAgeD0lZCB5PVslLjEyZjslLjEyZl0iLAorICAgICAgICAgICAgICAgIHksCisgICAgICAgICAgICAgICAgeDEgLyAoZG91YmxlKXJhcy5wcmVjaXNpb24sCisgICAgICAgICAgICAgICAgeDIgLyAoZG91YmxlKXJhcy5wcmVjaXNpb24gKSk7CisKICAgICAvKiBEdXJpbmcgdGhlIGhvcml6b250YWwgc3dlZXAsIHdlIG9ubHkgdGFrZSBjYXJlIG9mIGRyb3Atb3V0cyAqLwogCiAgICAgLyogZTEgICAgICsgICAgICAgPC0tIHBpeGVsIGNlbnRlciAqLwpAQCAtMjYwMiw2ICsyNTMyLDggQEAKICAgICAgIEludCAgZHJvcE91dENvbnRyb2wgPSBsZWZ0LT5mbGFncyAmIDc7CiAKIAorICAgICAgRlRfVFJBQ0U3KCggIiwgZHJvcG91dD0lZCIsIGRyb3BPdXRDb250cm9sICkpOworCiAgICAgICBpZiAoIGUxID09IGUyICsgcmFzLnByZWNpc2lvbiApCiAgICAgICB7CiAgICAgICAgIHN3aXRjaCAoIGRyb3BPdXRDb250cm9sICkKQEAgLTI2MjMsMTQgKzI1NTUsMTQgQEAKICAgICAgICAgICAgICAgIGxlZnQtPmhlaWdodCA8PSAwICAgICAgICAgICAgICAgICAgJiYKICAgICAgICAgICAgICAgICEoIGxlZnQtPmZsYWdzICYgT3ZlcnNob290X1RvcCAgICYmCiAgICAgICAgICAgICAgICAgICB4MiAtIHgxID49IHJhcy5wcmVjaXNpb25faGFsZiApICkKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKIAogICAgICAgICAgIC8qIGxlZnRtb3N0IHN0dWIgdGVzdCAqLwogICAgICAgICAgIGlmICggcmlnaHQtPm5leHQgPT0gbGVmdCAgICAgICAgICAgICAgICAgJiYKICAgICAgICAgICAgICAgIGxlZnQtPnN0YXJ0ID09IHkgICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAhKCBsZWZ0LT5mbGFncyAmIE92ZXJzaG9vdF9Cb3R0b20gJiYKICAgICAgICAgICAgICAgICAgIHgyIC0geDEgPj0gcmFzLnByZWNpc2lvbl9oYWxmICApICkKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKIAogICAgICAgICAgIGlmICggZHJvcE91dENvbnRyb2wgPT0gMSApCiAgICAgICAgICAgICBweGwgPSBlMjsKQEAgLTI2MzksNyArMjU3MSw3IEBACiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDogLyogbW9kZXMgMiwgMywgNiwgNyAqLwotICAgICAgICAgIHJldHVybjsgIC8qIG5vIGRyb3Atb3V0IGNvbnRyb2wgKi8KKyAgICAgICAgICBnb3RvIEV4aXQ7ICAvKiBubyBkcm9wLW91dCBjb250cm9sICovCiAgICAgICAgIH0KIAogICAgICAgICAvKiB1bmRvY3VtZW50ZWQgYnV0IGNvbmZpcm1lZDogSWYgdGhlIGRyb3Atb3V0IHdvdWxkIHJlc3VsdCBpbiBhICAqLwpAQCAtMjY2MCwzMCArMjU5MiwzNSBAQAogCiAgICAgICAgIGJpdHMgLT0gZTEgKiByYXMudGFyZ2V0LnBpdGNoOwogICAgICAgICBpZiAoIHJhcy50YXJnZXQucGl0Y2ggPiAwICkKLSAgICAgICAgICBiaXRzICs9ICggcmFzLnRhcmdldC5yb3dzIC0gMSApICogcmFzLnRhcmdldC5waXRjaDsKKyAgICAgICAgICBiaXRzICs9IChMb25nKSggcmFzLnRhcmdldC5yb3dzIC0gMSApICogcmFzLnRhcmdldC5waXRjaDsKIAogICAgICAgICBpZiAoIGUxID49IDAgICAgICAgICAgICAgICAgICAgICAmJgogICAgICAgICAgICAgIChVTG9uZyllMSA8IHJhcy50YXJnZXQucm93cyAmJgogICAgICAgICAgICAgICpiaXRzICYgZjEgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgcmV0dXJuOworICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgIH0KICAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuOworICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCi0gICAgYml0cyA9IHJhcy5iVGFyZ2V0ICsgKCB5ID4+IDMgKTsKLSAgICBmMSAgID0gKEJ5dGUpKCAweDgwID4+ICggeSAmIDcgKSApOwotCiAgICAgZTEgPSBUUlVOQyggcHhsICk7CiAKICAgICBpZiAoIGUxID49IDAgJiYgKFVMb25nKWUxIDwgcmFzLnRhcmdldC5yb3dzICkKICAgICB7CisgICAgICBGVF9UUkFDRTcoKCAiIC0+IHk9JWQgKGRyb3Atb3V0KSIsIGUxICkpOworCisgICAgICBiaXRzICA9IHJhcy5iVGFyZ2V0ICsgKCB5ID4+IDMgKTsKKyAgICAgIGYxICAgID0gKEJ5dGUpKCAweDgwID4+ICggeSAmIDcgKSApOwogICAgICAgYml0cyAtPSBlMSAqIHJhcy50YXJnZXQucGl0Y2g7CisKICAgICAgIGlmICggcmFzLnRhcmdldC5waXRjaCA+IDAgKQotICAgICAgICBiaXRzICs9ICggcmFzLnRhcmdldC5yb3dzIC0gMSApICogcmFzLnRhcmdldC5waXRjaDsKKyAgICAgICAgYml0cyArPSAoTG9uZykoIHJhcy50YXJnZXQucm93cyAtIDEgKSAqIHJhcy50YXJnZXQucGl0Y2g7CiAKICAgICAgIGJpdHNbMF0gfD0gZjE7CiAgICAgfQorCisgIEV4aXQ6CisgICAgRlRfVFJBQ0U3KCggIlxuIiApKTsKICAgfQogCiAKQEAgLTI2OTUsMjQ5ICsyNjMyLDYgQEAKICAgfQogCiAKLSNpZmRlZiBGVF9SQVNURVJfT1BUSU9OX0FOVElfQUxJQVNJTkcKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIFZlcnRpY2FsIEdyYXkgU3dlZXAgUHJvY2VkdXJlIFNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVGhlc2UgdHdvIHJvdXRpbmVzIGFyZSB1c2VkIGR1cmluZyB0aGUgdmVydGljYWwgZ3JheS1sZXZlbHMgc3dlZXAgICAgKi8KLSAgLyogIHBoYXNlIGJ5IHRoZSBnZW5lcmljIERyYXdfU3dlZXAoKSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAtIFRoZSB0YXJnZXQgcGl4bWFwJ3Mgd2lkdGggKm11c3QqIGJlIGEgbXVsdGlwbGUgb2YgNC4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIC0gWW91IGhhdmUgdG8gdXNlIHRoZSBmdW5jdGlvbiBWZXJ0aWNhbF9Td2VlcF9TcGFuKCkgZm9yIHRoZSBncmF5ICAgICovCi0gIC8qICAgIHNwYW4gY2FsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgc3RhdGljIHZvaWQKLSAgVmVydGljYWxfR3JheV9Td2VlcF9Jbml0KCBSQVNfQVJHUyBTaG9ydCogIG1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG9ydCogIG1heCApCi0gIHsKLSAgICBMb25nICBwaXRjaCwgYnl0ZV9sZW47Ci0KLQotICAgICptaW4gPSAqbWluICYgLTI7Ci0gICAgKm1heCA9ICggKm1heCArIDMgKSAmIC0yOwotCi0gICAgcmFzLnRyYWNlT2ZzICA9IDA7Ci0gICAgcGl0Y2ggICAgICAgICA9IHJhcy50YXJnZXQucGl0Y2g7Ci0gICAgYnl0ZV9sZW4gICAgICA9IC1waXRjaDsKLSAgICByYXMudHJhY2VJbmNyID0gKFNob3J0KWJ5dGVfbGVuOwotICAgIHJhcy50cmFjZUcgICAgPSAoICptaW4gLyAyICkgKiBieXRlX2xlbjsKLQotICAgIGlmICggcGl0Y2ggPiAwICkKLSAgICB7Ci0gICAgICByYXMudHJhY2VHICs9ICggcmFzLnRhcmdldC5yb3dzIC0gMSApICogcGl0Y2g7Ci0gICAgICBieXRlX2xlbiAgICA9IC1ieXRlX2xlbjsKLSAgICB9Ci0KLSAgICByYXMuZ3JheV9taW5feCA9ICAoU2hvcnQpYnl0ZV9sZW47Ci0gICAgcmFzLmdyYXlfbWF4X3ggPSAtKFNob3J0KWJ5dGVfbGVuOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBWZXJ0aWNhbF9HcmF5X1N3ZWVwX1N0ZXAoIFJBU19BUkcgKQotICB7Ci0gICAgc2hvcnQqICBjb3VudCA9IChzaG9ydCopY291bnRfdGFibGU7Ci0gICAgQnl0ZSogICBncmF5czsKLQotCi0gICAgcmFzLnRyYWNlT2ZzICs9IHJhcy5ncmF5X3dpZHRoOwotCi0gICAgaWYgKCByYXMudHJhY2VPZnMgPiByYXMuZ3JheV93aWR0aCApCi0gICAgewotICAgICAgUEJ5dGUgIHBpeDsKLQotCi0gICAgICBwaXggICA9IHJhcy5nVGFyZ2V0ICsgcmFzLnRyYWNlRyArIHJhcy5ncmF5X21pbl94ICogNDsKLSAgICAgIGdyYXlzID0gcmFzLmdyYXlzOwotCi0gICAgICBpZiAoIHJhcy5ncmF5X21heF94ID49IDAgKQotICAgICAgewotICAgICAgICBMb25nICBsYXN0X3BpeGVsID0gcmFzLnRhcmdldC53aWR0aCAtIDE7Ci0gICAgICAgIEludCAgIGxhc3RfY2VsbCAgPSBsYXN0X3BpeGVsID4+IDI7Ci0gICAgICAgIEludCAgIGxhc3RfYml0ICAgPSBsYXN0X3BpeGVsICYgMzsKLSAgICAgICAgQm9vbCAgb3ZlciAgICAgICA9IDA7Ci0KLSAgICAgICAgSW50ICAgIGMxLCBjMjsKLSAgICAgICAgUEJ5dGUgIGJpdCwgYml0MjsKLQotCi0gICAgICAgIGlmICggcmFzLmdyYXlfbWF4X3ggPj0gbGFzdF9jZWxsICYmIGxhc3RfYml0ICE9IDMgKQotICAgICAgICB7Ci0gICAgICAgICAgcmFzLmdyYXlfbWF4X3ggPSBsYXN0X2NlbGwgLSAxOwotICAgICAgICAgIG92ZXIgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCByYXMuZ3JheV9taW5feCA8IDAgKQotICAgICAgICAgIHJhcy5ncmF5X21pbl94ID0gMDsKLQotICAgICAgICBiaXQgID0gcmFzLmJUYXJnZXQgKyByYXMuZ3JheV9taW5feDsKLSAgICAgICAgYml0MiA9IGJpdCArIHJhcy5ncmF5X3dpZHRoOwotCi0gICAgICAgIGMxID0gcmFzLmdyYXlfbWF4X3ggLSByYXMuZ3JheV9taW5feDsKLQotICAgICAgICB3aGlsZSAoIGMxID49IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgYzIgPSBjb3VudFsqYml0XSArIGNvdW50WypiaXQyXTsKLQotICAgICAgICAgIGlmICggYzIgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBpeFswXSA9IGdyYXlzWyhjMiA+PiAxMikgJiAweDAwMEZdOwotICAgICAgICAgICAgcGl4WzFdID0gZ3JheXNbKGMyID4+IDggKSAmIDB4MDAwRl07Ci0gICAgICAgICAgICBwaXhbMl0gPSBncmF5c1soYzIgPj4gNCApICYgMHgwMDBGXTsKLSAgICAgICAgICAgIHBpeFszXSA9IGdyYXlzWyBjMiAgICAgICAgJiAweDAwMEZdOwotCi0gICAgICAgICAgICAqYml0ICA9IDA7Ci0gICAgICAgICAgICAqYml0MiA9IDA7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgYml0Kys7Ci0gICAgICAgICAgYml0MisrOwotICAgICAgICAgIHBpeCArPSA0OwotICAgICAgICAgIGMxLS07Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIG92ZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgYzIgPSBjb3VudFsqYml0XSArIGNvdW50WypiaXQyXTsKLSAgICAgICAgICBpZiAoIGMyICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCBsYXN0X2JpdCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgIHBpeFsyXSA9IGdyYXlzWyhjMiA+PiA0ICkgJiAweDAwMEZdOwotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICBwaXhbMV0gPSBncmF5c1soYzIgPj4gOCApICYgMHgwMDBGXTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIHBpeFswXSA9IGdyYXlzWyhjMiA+PiAxMikgJiAweDAwMEZdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAqYml0ICA9IDA7Ci0gICAgICAgICAgICAqYml0MiA9IDA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHJhcy50cmFjZU9mcyA9IDA7Ci0gICAgICByYXMudHJhY2VHICArPSByYXMudHJhY2VJbmNyOwotCi0gICAgICByYXMuZ3JheV9taW5feCA9ICAzMjAwMDsKLSAgICAgIHJhcy5ncmF5X21heF94ID0gLTMyMDAwOwotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgSG9yaXpvbnRhbF9HcmF5X1N3ZWVwX1NwYW4oIFJBU19BUkdTIFNob3J0ICAgICAgIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICB4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFByb2ZpbGUgICAgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQcm9maWxlICAgIHJpZ2h0ICkKLSAgewotICAgIC8qIG5vdGhpbmcsIHJlYWxseSAqLwotICAgIEZUX1VOVVNFRF9SQVNURVI7Ci0gICAgRlRfVU5VU0VEKCB5ICk7Ci0gICAgRlRfVU5VU0VEKCB4MSApOwotICAgIEZUX1VOVVNFRCggeDIgKTsKLSAgICBGVF9VTlVTRUQoIGxlZnQgKTsKLSAgICBGVF9VTlVTRUQoIHJpZ2h0ICk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIEhvcml6b250YWxfR3JheV9Td2VlcF9Ecm9wKCBSQVNfQVJHUyBTaG9ydCAgICAgICB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICB4MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQcm9maWxlICAgIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUHJvZmlsZSAgICByaWdodCApCi0gIHsKLSAgICBMb25nICAgZTEsIGUyOwotICAgIFBCeXRlICBwaXhlbDsKLQotCi0gICAgLyogRHVyaW5nIHRoZSBob3Jpem9udGFsIHN3ZWVwLCB3ZSBvbmx5IHRha2UgY2FyZSBvZiBkcm9wLW91dHMgKi8KLQotICAgIGUxID0gQ0VJTElORyggeDEgKTsKLSAgICBlMiA9IEZMT09SICAoIHgyICk7Ci0KLSAgICBpZiAoIGUxID4gZTIgKQotICAgIHsKLSAgICAgIEludCAgZHJvcE91dENvbnRyb2wgPSBsZWZ0LT5mbGFncyAmIDc7Ci0KLQotICAgICAgaWYgKCBlMSA9PSBlMiArIHJhcy5wcmVjaXNpb24gKQotICAgICAgewotICAgICAgICBzd2l0Y2ggKCBkcm9wT3V0Q29udHJvbCApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAwOiAvKiBzaW1wbGUgZHJvcC1vdXRzIGluY2x1ZGluZyBzdHVicyAqLwotICAgICAgICAgIGUxID0gZTI7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA0OiAvKiBzbWFydCBkcm9wLW91dHMgaW5jbHVkaW5nIHN0dWJzICovCi0gICAgICAgICAgZTEgPSBGTE9PUiggKCB4MSArIHgyIC0gMSApIC8gMiArIHJhcy5wcmVjaXNpb25faGFsZiApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMTogLyogc2ltcGxlIGRyb3Atb3V0cyBleGNsdWRpbmcgc3R1YnMgKi8KLSAgICAgICAgY2FzZSA1OiAvKiBzbWFydCBkcm9wLW91dHMgZXhjbHVkaW5nIHN0dWJzICAqLwotICAgICAgICAgIC8qIHNlZSBWZXJ0aWNhbF9Td2VlcF9Ecm9wIGZvciBkZXRhaWxzICovCi0KLSAgICAgICAgICAvKiByaWdodG1vc3Qgc3R1YiB0ZXN0ICovCi0gICAgICAgICAgaWYgKCBsZWZ0LT5uZXh0ID09IHJpZ2h0ICYmIGxlZnQtPmhlaWdodCA8PSAwICkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgIC8qIGxlZnRtb3N0IHN0dWIgdGVzdCAqLwotICAgICAgICAgIGlmICggcmlnaHQtPm5leHQgPT0gbGVmdCAmJiBsZWZ0LT5zdGFydCA9PSB5ICkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgIGlmICggZHJvcE91dENvbnRyb2wgPT0gMSApCi0gICAgICAgICAgICBlMSA9IGUyOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGUxID0gRkxPT1IoICggeDEgKyB4MiAtIDEgKSAvIDIgKyByYXMucHJlY2lzaW9uX2hhbGYgKTsKLQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6IC8qIG1vZGVzIDIsIDMsIDYsIDcgKi8KLSAgICAgICAgICByZXR1cm47ICAvKiBubyBkcm9wLW91dCBjb250cm9sICovCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICggZTEgPj0gMCApCi0gICAgewotICAgICAgQnl0ZSAgY29sb3I7Ci0KLQotICAgICAgaWYgKCB4MiAtIHgxID49IHJhcy5wcmVjaXNpb25faGFsZiApCi0gICAgICAgIGNvbG9yID0gcmFzLmdyYXlzWzJdOwotICAgICAgZWxzZQotICAgICAgICBjb2xvciA9IHJhcy5ncmF5c1sxXTsKLQotICAgICAgZTEgPSBUUlVOQyggZTEgKSAvIDI7Ci0gICAgICBpZiAoIGUxIDwgcmFzLnRhcmdldC5yb3dzICkKLSAgICAgIHsKLSAgICAgICAgcGl4ZWwgPSByYXMuZ1RhcmdldCAtIGUxICogcmFzLnRhcmdldC5waXRjaCArIHkgLyAyOwotICAgICAgICBpZiAoIHJhcy50YXJnZXQucGl0Y2ggPiAwICkKLSAgICAgICAgICBwaXhlbCArPSAoIHJhcy50YXJnZXQucm93cyAtIDEgKSAqIHJhcy50YXJnZXQucGl0Y2g7Ci0KLSAgICAgICAgaWYgKCBwaXhlbFswXSA9PSByYXMuZ3JheXNbMF0gKQotICAgICAgICAgIHBpeGVsWzBdID0gY29sb3I7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotI2VuZGlmIC8qIEZUX1JBU1RFUl9PUFRJT05fQU5USV9BTElBU0lORyAqLwotCi0KICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgR2VuZXJpYyBTd2VlcCBEcmF3aW5nIHJvdXRpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTMwMDcsNyArMjcwMSw3IEBACiAKICAgICB3aGlsZSAoIFAgKQogICAgIHsKLSAgICAgIFAtPmNvdW50TCA9IChVU2hvcnQpKCBQLT5zdGFydCAtIG1pbl9ZICk7CisgICAgICBQLT5jb3VudEwgPSBQLT5zdGFydCAtIG1pbl9ZOwogICAgICAgUCA9IFAtPmxpbms7CiAgICAgfQogCkBAIC0zMjcwLDcgKzI5NjQsNyBAQAogICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKKyAgc3RhdGljIEZUX0Vycm9yCiAgIFJlbmRlcl9HbHlwaCggUkFTX0FSRyApCiAgIHsKICAgICBGVF9FcnJvciAgZXJyb3I7CkBAIC0zMjkzLDEwICsyOTg3LDEyIEBACiAgICAgICAgIHJhcy5kcm9wT3V0Q29udHJvbCArPSAxOwogICAgIH0KIAotICAgIHJhcy5zZWNvbmRfcGFzcyA9IChGVF9CeXRlKSggISggcmFzLm91dGxpbmUuZmxhZ3MgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT1VUTElORV9TSU5HTEVfUEFTUyApICk7CisgICAgcmFzLnNlY29uZF9wYXNzID0gKEJvb2wpKCAhKCByYXMub3V0bGluZS5mbGFncyAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX09VVExJTkVfU0lOR0xFX1BBU1MgKSApOwogCiAgICAgLyogVmVydGljYWwgU3dlZXAgKi8KKyAgICBGVF9UUkFDRTcoKCAiVmVydGljYWwgcGFzcyAoZnRyYXN0ZXIpXG4iICkpOworCiAgICAgcmFzLlByb2NfU3dlZXBfSW5pdCA9IFZlcnRpY2FsX1N3ZWVwX0luaXQ7CiAgICAgcmFzLlByb2NfU3dlZXBfU3BhbiA9IFZlcnRpY2FsX1N3ZWVwX1NwYW47CiAgICAgcmFzLlByb2NfU3dlZXBfRHJvcCA9IFZlcnRpY2FsX1N3ZWVwX0Ryb3A7CkBAIC0zMzA0LDkgKzMwMDAsOSBAQAogCiAgICAgcmFzLmJhbmRfdG9wICAgICAgICAgICAgPSAwOwogICAgIHJhcy5iYW5kX3N0YWNrWzBdLnlfbWluID0gMDsKLSAgICByYXMuYmFuZF9zdGFja1swXS55X21heCA9IChzaG9ydCkoIHJhcy50YXJnZXQucm93cyAtIDEgKTsKKyAgICByYXMuYmFuZF9zdGFja1swXS55X21heCA9IChTaG9ydCkoIHJhcy50YXJnZXQucm93cyAtIDEgKTsKIAotICAgIHJhcy5iV2lkdGggID0gKHVuc2lnbmVkIHNob3J0KXJhcy50YXJnZXQud2lkdGg7CisgICAgcmFzLmJXaWR0aCAgPSAoVVNob3J0KXJhcy50YXJnZXQud2lkdGg7CiAgICAgcmFzLmJUYXJnZXQgPSAoQnl0ZSopcmFzLnRhcmdldC5idWZmZXI7CiAKICAgICBpZiAoICggZXJyb3IgPSBSZW5kZXJfU2luZ2xlX1Bhc3MoIFJBU19WQVJTIDAgKSApICE9IDAgKQpAQCAtMzMxNSw2ICszMDExLDggQEAKICAgICAvKiBIb3Jpem9udGFsIFN3ZWVwICovCiAgICAgaWYgKCByYXMuc2Vjb25kX3Bhc3MgJiYgcmFzLmRyb3BPdXRDb250cm9sICE9IDIgKQogICAgIHsKKyAgICAgIEZUX1RSQUNFNygoICJIb3Jpem9udGFsIHBhc3MgKGZ0cmFzdGVyKVxuIiApKTsKKwogICAgICAgcmFzLlByb2NfU3dlZXBfSW5pdCA9IEhvcml6b250YWxfU3dlZXBfSW5pdDsKICAgICAgIHJhcy5Qcm9jX1N3ZWVwX1NwYW4gPSBIb3Jpem9udGFsX1N3ZWVwX1NwYW47CiAgICAgICByYXMuUHJvY19Td2VlcF9Ecm9wID0gSG9yaXpvbnRhbF9Td2VlcF9Ecm9wOwpAQCAtMzMyMiw3ICszMDIwLDcgQEAKIAogICAgICAgcmFzLmJhbmRfdG9wICAgICAgICAgICAgPSAwOwogICAgICAgcmFzLmJhbmRfc3RhY2tbMF0ueV9taW4gPSAwOwotICAgICAgcmFzLmJhbmRfc3RhY2tbMF0ueV9tYXggPSAoc2hvcnQpKCByYXMudGFyZ2V0LndpZHRoIC0gMSApOworICAgICAgcmFzLmJhbmRfc3RhY2tbMF0ueV9tYXggPSAoU2hvcnQpKCByYXMudGFyZ2V0LndpZHRoIC0gMSApOwogCiAgICAgICBpZiAoICggZXJyb3IgPSBSZW5kZXJfU2luZ2xlX1Bhc3MoIFJBU19WQVJTIDEgKSApICE9IDAgKQogICAgICAgICByZXR1cm4gZXJyb3I7CkBAIC0zMzMyLDExOCArMzAzMCwxMCBAQAogICB9CiAKIAotI2lmZGVmIEZUX1JBU1RFUl9PUFRJT05fQU5USV9BTElBU0lORwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlbmRlcl9HcmF5X0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlbmRlciBhIGdseXBoIHdpdGggZ3JheXNjYWxpbmcuICBTdWItYmFuZGluZyBpZiBuZWVkZWQuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIFJlbmRlcl9HcmF5X0dseXBoKCBSQVNfQVJHICkKLSAgewotICAgIExvbmcgICAgICBwaXhlbF93aWR0aDsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIFNldF9IaWdoX1ByZWNpc2lvbiggUkFTX1ZBUlMgcmFzLm91dGxpbmUuZmxhZ3MgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT1VUTElORV9ISUdIX1BSRUNJU0lPTiApOwotICAgIHJhcy5zY2FsZV9zaGlmdCA9IHJhcy5wcmVjaXNpb25fc2hpZnQgKyAxOwotCi0gICAgaWYgKCByYXMub3V0bGluZS5mbGFncyAmIEZUX09VVExJTkVfSUdOT1JFX0RST1BPVVRTICkKLSAgICAgIHJhcy5kcm9wT3V0Q29udHJvbCA9IDI7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICggcmFzLm91dGxpbmUuZmxhZ3MgJiBGVF9PVVRMSU5FX1NNQVJUX0RST1BPVVRTICkKLSAgICAgICAgcmFzLmRyb3BPdXRDb250cm9sID0gNDsKLSAgICAgIGVsc2UKLSAgICAgICAgcmFzLmRyb3BPdXRDb250cm9sID0gMDsKLQotICAgICAgaWYgKCAhKCByYXMub3V0bGluZS5mbGFncyAmIEZUX09VVExJTkVfSU5DTFVERV9TVFVCUyApICkKLSAgICAgICAgcmFzLmRyb3BPdXRDb250cm9sICs9IDE7Ci0gICAgfQotCi0gICAgcmFzLnNlY29uZF9wYXNzID0gISggcmFzLm91dGxpbmUuZmxhZ3MgJiBGVF9PVVRMSU5FX1NJTkdMRV9QQVNTICk7Ci0KLSAgICAvKiBWZXJ0aWNhbCBTd2VlcCAqLwotCi0gICAgcmFzLmJhbmRfdG9wICAgICAgICAgICAgPSAwOwotICAgIHJhcy5iYW5kX3N0YWNrWzBdLnlfbWluID0gMDsKLSAgICByYXMuYmFuZF9zdGFja1swXS55X21heCA9IDIgKiByYXMudGFyZ2V0LnJvd3MgLSAxOwotCi0gICAgcmFzLmJXaWR0aCAgPSByYXMuZ3JheV93aWR0aDsKLSAgICBwaXhlbF93aWR0aCA9IDIgKiAoICggcmFzLnRhcmdldC53aWR0aCArIDMgKSA+PiAyICk7Ci0KLSAgICBpZiAoIHJhcy5iV2lkdGggPiBwaXhlbF93aWR0aCApCi0gICAgICByYXMuYldpZHRoID0gcGl4ZWxfd2lkdGg7Ci0KLSAgICByYXMuYldpZHRoICA9IHJhcy5iV2lkdGggKiA4OwotICAgIHJhcy5iVGFyZ2V0ID0gKEJ5dGUqKXJhcy5ncmF5X2xpbmVzOwotICAgIHJhcy5nVGFyZ2V0ID0gKEJ5dGUqKXJhcy50YXJnZXQuYnVmZmVyOwotCi0gICAgcmFzLlByb2NfU3dlZXBfSW5pdCA9IFZlcnRpY2FsX0dyYXlfU3dlZXBfSW5pdDsKLSAgICByYXMuUHJvY19Td2VlcF9TcGFuID0gVmVydGljYWxfU3dlZXBfU3BhbjsKLSAgICByYXMuUHJvY19Td2VlcF9Ecm9wID0gVmVydGljYWxfU3dlZXBfRHJvcDsKLSAgICByYXMuUHJvY19Td2VlcF9TdGVwID0gVmVydGljYWxfR3JheV9Td2VlcF9TdGVwOwotCi0gICAgZXJyb3IgPSBSZW5kZXJfU2luZ2xlX1Bhc3MoIFJBU19WQVJTIDAgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIC8qIEhvcml6b250YWwgU3dlZXAgKi8KLSAgICBpZiAoIHJhcy5zZWNvbmRfcGFzcyAmJiByYXMuZHJvcE91dENvbnRyb2wgIT0gMiApCi0gICAgewotICAgICAgcmFzLlByb2NfU3dlZXBfSW5pdCA9IEhvcml6b250YWxfU3dlZXBfSW5pdDsKLSAgICAgIHJhcy5Qcm9jX1N3ZWVwX1NwYW4gPSBIb3Jpem9udGFsX0dyYXlfU3dlZXBfU3BhbjsKLSAgICAgIHJhcy5Qcm9jX1N3ZWVwX0Ryb3AgPSBIb3Jpem9udGFsX0dyYXlfU3dlZXBfRHJvcDsKLSAgICAgIHJhcy5Qcm9jX1N3ZWVwX1N0ZXAgPSBIb3Jpem9udGFsX1N3ZWVwX1N0ZXA7Ci0KLSAgICAgIHJhcy5iYW5kX3RvcCAgICAgICAgICAgID0gMDsKLSAgICAgIHJhcy5iYW5kX3N0YWNrWzBdLnlfbWluID0gMDsKLSAgICAgIHJhcy5iYW5kX3N0YWNrWzBdLnlfbWF4ID0gcmFzLnRhcmdldC53aWR0aCAqIDIgLSAxOwotCi0gICAgICBlcnJvciA9IFJlbmRlcl9TaW5nbGVfUGFzcyggUkFTX1ZBUlMgMSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0KLSAgICByZXR1cm4gUmFzdGVyX0Vycl9Ob25lOwotICB9Ci0KLSNlbHNlIC8qICFGVF9SQVNURVJfT1BUSU9OX0FOVElfQUxJQVNJTkcgKi8KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgUmVuZGVyX0dyYXlfR2x5cGgoIFJBU19BUkcgKQotICB7Ci0gICAgRlRfVU5VU0VEX1JBU1RFUjsKLQotICAgIHJldHVybiBGVF9USFJPVyggVW5zdXBwb3J0ZWQgKTsKLSAgfQotCi0jZW5kaWYgLyogIUZUX1JBU1RFUl9PUFRJT05fQU5USV9BTElBU0lORyAqLwotCi0KICAgc3RhdGljIHZvaWQKICAgZnRfYmxhY2tfaW5pdCggYmxhY2tfUFJhc3RlciAgcmFzdGVyICkKICAgewotI2lmZGVmIEZUX1JBU1RFUl9PUFRJT05fQU5USV9BTElBU0lORwotICAgIEZUX1VJbnQgIG47Ci0KLQotICAgIC8qIHNldCBkZWZhdWx0IDUtbGV2ZWxzIGdyYXkgcGFsZXR0ZSAqLwotICAgIGZvciAoIG4gPSAwOyBuIDwgNTsgbisrICkKLSAgICAgIHJhc3Rlci0+Z3JheXNbbl0gPSBuICogMjU1IC8gNDsKLQotICAgIHJhc3Rlci0+Z3JheV93aWR0aCA9IFJBU1RFUl9HUkFZX0xJTkVTIC8gMjsKLSNlbHNlCiAgICAgRlRfVU5VU0VEKCByYXN0ZXIgKTsKLSNlbmRpZgogICB9CiAKIApAQCAtMzUxOCw1NSArMzEwOCwyMyBAQAogICBzdGF0aWMgdm9pZAogICBmdF9ibGFja19yZXNldCggYmxhY2tfUFJhc3RlciAgcmFzdGVyLAogICAgICAgICAgICAgICAgICAgY2hhciogICAgICAgICAgcG9vbF9iYXNlLAotICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICAgICAgcG9vbF9zaXplICkKKyAgICAgICAgICAgICAgICAgIExvbmcgICAgICAgICAgIHBvb2xfc2l6ZSApCiAgIHsKLSAgICBpZiAoIHJhc3RlciApCi0gICAgewotICAgICAgaWYgKCBwb29sX2Jhc2UgJiYgcG9vbF9zaXplID49IChsb25nKXNpemVvZiAoIGJsYWNrX1RXb3JrZXIgKSArIDIwNDggKQotICAgICAgewotICAgICAgICBibGFja19QV29ya2VyICB3b3JrZXIgPSAoYmxhY2tfUFdvcmtlcilwb29sX2Jhc2U7Ci0KLQotICAgICAgICByYXN0ZXItPmJ1ZmZlciAgICAgID0gcG9vbF9iYXNlICsgKCAoIHNpemVvZiAoICp3b3JrZXIgKSArIDcgKSAmIH43ICk7Ci0gICAgICAgIHJhc3Rlci0+YnVmZmVyX3NpemUgPSAobG9uZykoIHBvb2xfYmFzZSArIHBvb2xfc2l6ZSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKXJhc3Rlci0+YnVmZmVyICk7Ci0gICAgICAgIHJhc3Rlci0+d29ya2VyICAgICAgPSB3b3JrZXI7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJhc3Rlci0+YnVmZmVyICAgICAgPSBOVUxMOwotICAgICAgICByYXN0ZXItPmJ1ZmZlcl9zaXplID0gMDsKLSAgICAgICAgcmFzdGVyLT53b3JrZXIgICAgICA9IE5VTEw7Ci0gICAgICB9Ci0gICAgfQorICAgIEZUX1VOVVNFRCggcmFzdGVyICk7CisgICAgRlRfVU5VU0VEKCBwb29sX2Jhc2UgKTsKKyAgICBGVF9VTlVTRUQoIHBvb2xfc2l6ZSApOwogICB9CiAKIAogICBzdGF0aWMgaW50CiAgIGZ0X2JsYWNrX3NldF9tb2RlKCBibGFja19QUmFzdGVyICByYXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgVUxvbmcgICAgICAgICAgbW9kZSwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgIHBhbGV0dGUgKQogICB7Ci0jaWZkZWYgRlRfUkFTVEVSX09QVElPTl9BTlRJX0FMSUFTSU5HCi0KLSAgICBpZiAoIG1vZGUgPT0gRlRfTUFLRV9UQUcoICdwJywgJ2EnLCAnbCcsICc1JyApICkKLSAgICB7Ci0gICAgICAvKiBzZXQgNS1sZXZlbHMgZ3JheSBwYWxldHRlICovCi0gICAgICByYXN0ZXItPmdyYXlzWzBdID0gcGFsZXR0ZVswXTsKLSAgICAgIHJhc3Rlci0+Z3JheXNbMV0gPSBwYWxldHRlWzFdOwotICAgICAgcmFzdGVyLT5ncmF5c1syXSA9IHBhbGV0dGVbMl07Ci0gICAgICByYXN0ZXItPmdyYXlzWzNdID0gcGFsZXR0ZVszXTsKLSAgICAgIHJhc3Rlci0+Z3JheXNbNF0gPSBwYWxldHRlWzRdOwotICAgIH0KLQotI2Vsc2UKLQogICAgIEZUX1VOVVNFRCggcmFzdGVyICk7CiAgICAgRlRfVU5VU0VEKCBtb2RlICk7CiAgICAgRlRfVU5VU0VEKCBwYWxldHRlICk7CiAKLSNlbmRpZgotCiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMzU3NywxMCArMzEzNSwxMyBAQAogICB7CiAgICAgY29uc3QgRlRfT3V0bGluZSogIG91dGxpbmUgICAgPSAoY29uc3QgRlRfT3V0bGluZSopcGFyYW1zLT5zb3VyY2U7CiAgICAgY29uc3QgRlRfQml0bWFwKiAgIHRhcmdldF9tYXAgPSBwYXJhbXMtPnRhcmdldDsKLSAgICBibGFja19QV29ya2VyICAgICAgd29ya2VyOworCisgICAgYmxhY2tfVFdvcmtlciAgd29ya2VyWzFdOworCisgICAgTG9uZyAgYnVmZmVyW0ZUX01BWCggRlRfUkVOREVSX1BPT0xfU0laRSwgMjA0OCApIC8gc2l6ZW9mICggTG9uZyApXTsKIAogCi0gICAgaWYgKCAhcmFzdGVyIHx8ICFyYXN0ZXItPmJ1ZmZlciB8fCAhcmFzdGVyLT5idWZmZXJfc2l6ZSApCisgICAgaWYgKCAhcmFzdGVyICkKICAgICAgIHJldHVybiBGVF9USFJPVyggTm90X0luaSApOwogCiAgICAgaWYgKCAhb3V0bGluZSApCkBAIC0zNTk3LDEyICszMTU4LDEzIEBACiAgICAgICAgICAgIG91dGxpbmUtPmNvbnRvdXJzW291dGxpbmUtPm5fY29udG91cnMgLSAxXSArIDEgKQogICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkICk7CiAKLSAgICB3b3JrZXIgPSByYXN0ZXItPndvcmtlcjsKLQogICAgIC8qIHRoaXMgdmVyc2lvbiBvZiB0aGUgcmFzdGVyIGRvZXMgbm90IHN1cHBvcnQgZGlyZWN0IHJlbmRlcmluZywgc29ycnkgKi8KICAgICBpZiAoIHBhcmFtcy0+ZmxhZ3MgJiBGVF9SQVNURVJfRkxBR19ESVJFQ1QgKQogICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbnN1cHBvcnRlZCApOwogCisgICAgaWYgKCBwYXJhbXMtPmZsYWdzICYgRlRfUkFTVEVSX0ZMQUdfQUEgKQorICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbnN1cHBvcnRlZCApOworCiAgICAgaWYgKCAhdGFyZ2V0X21hcCApCiAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWQgKTsKIApAQCAtMzYxNiwzMCArMzE3OCwyMyBAQAogICAgIHJhcy5vdXRsaW5lID0gKm91dGxpbmU7CiAgICAgcmFzLnRhcmdldCAgPSAqdGFyZ2V0X21hcDsKIAotICAgIHdvcmtlci0+YnVmZiAgICAgICA9IChQTG9uZykgcmFzdGVyLT5idWZmZXI7Ci0gICAgd29ya2VyLT5zaXplQnVmZiAgID0gd29ya2VyLT5idWZmICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlci0+YnVmZmVyX3NpemUgLyBzaXplb2YgKCBMb25nICk7Ci0jaWZkZWYgRlRfUkFTVEVSX09QVElPTl9BTlRJX0FMSUFTSU5HCi0gICAgd29ya2VyLT5ncmF5cyAgICAgID0gcmFzdGVyLT5ncmF5czsKLSAgICB3b3JrZXItPmdyYXlfd2lkdGggPSByYXN0ZXItPmdyYXlfd2lkdGg7CisgICAgd29ya2VyLT5idWZmICAgICA9IGJ1ZmZlcjsKKyAgICB3b3JrZXItPnNpemVCdWZmID0gKCZidWZmZXIpWzFdOyAvKiBQb2ludHMgdG8gcmlnaHQgYWZ0ZXIgYnVmZmVyLiAqLwogCi0gICAgRlRfTUVNX1pFUk8oIHdvcmtlci0+Z3JheV9saW5lcywgd29ya2VyLT5ncmF5X3dpZHRoICogMiApOwotI2VuZGlmCi0KLSAgICByZXR1cm4gKCBwYXJhbXMtPmZsYWdzICYgRlRfUkFTVEVSX0ZMQUdfQUEgKQotICAgICAgICAgICA/IFJlbmRlcl9HcmF5X0dseXBoKCBSQVNfVkFSICkKLSAgICAgICAgICAgOiBSZW5kZXJfR2x5cGgoIFJBU19WQVIgKTsKKyAgICByZXR1cm4gUmVuZGVyX0dseXBoKCBSQVNfVkFSICk7CiAgIH0KIAogCi0gIEZUX0RFRklORV9SQVNURVJfRlVOQ1MoIGZ0X3N0YW5kYXJkX3Jhc3RlciwKKyAgRlRfREVGSU5FX1JBU1RFUl9GVU5DUygKKyAgICBmdF9zdGFuZGFyZF9yYXN0ZXIsCisKICAgICBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSwKKwogICAgIChGVF9SYXN0ZXJfTmV3X0Z1bmMpICAgICBmdF9ibGFja19uZXcsCiAgICAgKEZUX1Jhc3Rlcl9SZXNldF9GdW5jKSAgIGZ0X2JsYWNrX3Jlc2V0LAogICAgIChGVF9SYXN0ZXJfU2V0X01vZGVfRnVuYylmdF9ibGFja19zZXRfbW9kZSwKICAgICAoRlRfUmFzdGVyX1JlbmRlcl9GdW5jKSAgZnRfYmxhY2tfcmVuZGVyLAotICAgIChGVF9SYXN0ZXJfRG9uZV9GdW5jKSAgICBmdF9ibGFja19kb25lCi0gICkKKyAgICAoRlRfUmFzdGVyX0RvbmVfRnVuYykgICAgZnRfYmxhY2tfZG9uZSApCiAKIAogLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL2Z0cmFzdGVyLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL2Z0cmFzdGVyLmgKaW5kZXggODBmZTQ2ZC4uYTI3MGQ0OCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9mdHJhc3Rlci5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9yYXN0ZXIvZnRyYXN0ZXIuaApAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBUaGUgRnJlZVR5cGUgZ2x5cGggcmFzdGVyaXplciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9mdHJlbmQxLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL2Z0cmVuZDEuYwppbmRleCBhYTdmNmQ1Li5mMzE0MzkyIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL2Z0cmVuZDEuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL2Z0cmVuZDEuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBUaGUgRnJlZVR5cGUgZ2x5cGggcmFzdGVyaXplciBpbnRlcmZhY2UgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAzLCAyMDA1LCAyMDA2LCAyMDExLCAyMDEzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtMTA0LDcgKzEwNCw3IEBACiAgIHsKICAgICBGVF9FcnJvciAgICAgZXJyb3I7CiAgICAgRlRfT3V0bGluZSogIG91dGxpbmU7Ci0gICAgRlRfQkJveCAgICAgIGNib3g7CisgICAgRlRfQkJveCAgICAgIGNib3gsIGNib3gwOwogICAgIEZUX1VJbnQgICAgICB3aWR0aCwgaGVpZ2h0LCBwaXRjaDsKICAgICBGVF9CaXRtYXAqICAgYml0bWFwOwogICAgIEZUX01lbW9yeSAgICBtZW1vcnk7CkBAIC0xMjAsMzggKzEyMCwxMSBAQAogICAgIH0KIAogICAgIC8qIGNoZWNrIHJlbmRlcmluZyBtb2RlICovCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCiAgICAgaWYgKCBtb2RlICE9IEZUX1JFTkRFUl9NT0RFX01PTk8gKQogICAgIHsKICAgICAgIC8qIHJhc3RlcjEgaXMgb25seSBjYXBhYmxlIG9mIHByb2R1Y2luZyBtb25vY2hyb21lIGJpdG1hcHMgKi8KLSAgICAgIGlmICggcmVuZGVyLT5jbGF6eiA9PSAmZnRfcmFzdGVyMV9yZW5kZXJlcl9jbGFzcyApCi0gICAgICAgIHJldHVybiBGVF9USFJPVyggQ2Fubm90X1JlbmRlcl9HbHlwaCApOworICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfUmVuZGVyX0dseXBoICk7CiAgICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiByYXN0ZXI1IGlzIG9ubHkgY2FwYWJsZSBvZiBwcm9kdWNpbmcgNS1ncmF5LWxldmVscyBiaXRtYXBzICovCi0gICAgICBpZiAoIHJlbmRlci0+Y2xhenogPT0gJmZ0X3Jhc3RlcjVfcmVuZGVyZXJfY2xhc3MgKQotICAgICAgICByZXR1cm4gRlRfVEhST1coIENhbm5vdF9SZW5kZXJfR2x5cGggKTsKLSAgICB9Ci0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotICAgIC8qIFdoZW4gUElDIGlzIGVuYWJsZWQsIHdlIGNhbm5vdCBnZXQgdG8gdGhlIGNsYXNzIG9iamVjdCAgICAgICovCi0gICAgLyogc28gaW5zdGVhZCB3ZSBjaGVjayB0aGUgZmluYWwgY2hhcmFjdGVyIGluIHRoZSBjbGFzcyBuYW1lICAgKi8KLSAgICAvKiAoInJhc3RlcjUiIG9yICJyYXN0ZXIxIikuIFllcyB0aGlzIGlzIGEgaGFjay4gICAgICAgICAgICAgICAqLwotICAgIC8qIFRoZSAiY29ycmVjdCIgdGhpbmcgdG8gZG8gaXMgaGF2ZSBkaWZmZXJlbnQgcmVuZGVyIGZ1bmN0aW9uICovCi0gICAgLyogZm9yIGVhY2ggb2YgdGhlIGNsYXNzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIG1vZGUgIT0gRlRfUkVOREVSX01PREVfTU9OTyApCi0gICAgewotICAgICAgLyogcmFzdGVyMSBpcyBvbmx5IGNhcGFibGUgb2YgcHJvZHVjaW5nIG1vbm9jaHJvbWUgYml0bWFwcyAqLwotICAgICAgaWYgKCByZW5kZXItPmNsYXp6LT5yb290Lm1vZHVsZV9uYW1lWzZdID09ICcxJyApCi0gICAgICAgIHJldHVybiBGVF9USFJPVyggQ2Fubm90X1JlbmRlcl9HbHlwaCApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogcmFzdGVyNSBpcyBvbmx5IGNhcGFibGUgb2YgcHJvZHVjaW5nIDUtZ3JheS1sZXZlbHMgYml0bWFwcyAqLwotICAgICAgaWYgKCByZW5kZXItPmNsYXp6LT5yb290Lm1vZHVsZV9uYW1lWzZdID09ICc1JyApCi0gICAgICAgIHJldHVybiBGVF9USFJPVyggQ2Fubm90X1JlbmRlcl9HbHlwaCApOwotICAgIH0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwogCiAgICAgb3V0bGluZSA9ICZzbG90LT5vdXRsaW5lOwogCkBAIC0xNjAsMTQgKzEzMywxNCBAQAogICAgICAgRlRfT3V0bGluZV9UcmFuc2xhdGUoIG91dGxpbmUsIG9yaWdpbi0+eCwgb3JpZ2luLT55ICk7CiAKICAgICAvKiBjb21wdXRlIHRoZSBjb250cm9sIGJveCwgYW5kIGdyaWQgZml0IGl0ICovCi0gICAgRlRfT3V0bGluZV9HZXRfQ0JveCggb3V0bGluZSwgJmNib3ggKTsKKyAgICBGVF9PdXRsaW5lX0dldF9DQm94KCBvdXRsaW5lLCAmY2JveDAgKTsKIAogICAgIC8qIHVuZG9jdW1lbnRlZCBidXQgY29uZmlybWVkOiBiYm94IHZhbHVlcyBnZXQgcm91bmRlZCAqLwogI2lmIDEKLSAgICBjYm94LnhNaW4gPSBGVF9QSVhfUk9VTkQoIGNib3gueE1pbiApOwotICAgIGNib3gueU1pbiA9IEZUX1BJWF9ST1VORCggY2JveC55TWluICk7Ci0gICAgY2JveC54TWF4ID0gRlRfUElYX1JPVU5EKCBjYm94LnhNYXggKTsKLSAgICBjYm94LnlNYXggPSBGVF9QSVhfUk9VTkQoIGNib3gueU1heCApOworICAgIGNib3gueE1pbiA9IEZUX1BJWF9ST1VORCggY2JveDAueE1pbiApOworICAgIGNib3gueU1pbiA9IEZUX1BJWF9ST1VORCggY2JveDAueU1pbiApOworICAgIGNib3gueE1heCA9IEZUX1BJWF9ST1VORCggY2JveDAueE1heCApOworICAgIGNib3gueU1heCA9IEZUX1BJWF9ST1VORCggY2JveDAueU1heCApOwogI2Vsc2UKICAgICBjYm94LnhNaW4gPSBGVF9QSVhfRkxPT1IoIGNib3gueE1pbiApOwogICAgIGNib3gueU1pbiA9IEZUX1BJWF9GTE9PUiggY2JveC55TWluICk7CkBAIC0xNzUsOCArMTQ4LDI4IEBACiAgICAgY2JveC55TWF4ID0gRlRfUElYX0NFSUwoIGNib3gueU1heCApOwogI2VuZGlmCiAKKyAgICAvKiBJZiBlaXRoZXIgYHdpZHRoJyBvciBgaGVpZ2h0JyByb3VuZCB0byAwLCB0cnkgICAgKi8KKyAgICAvKiBleHBsaWNpdGx5IHJvdW5kaW5nIHVwL2Rvd24uICBJbiB0aGUgY2FzZSBvZiAgICAgKi8KKyAgICAvKiBnbHlwaHMgY29udGFpbmluZyBvbmx5IG9uZSB2ZXJ5IG5hcnJvdyBmZWF0dXJlLCAgKi8KKyAgICAvKiB0aGlzIGdpdmVzIHRoZSBkcm9wLW91dCBjb21wZW5zYXRpb24gaW4gdGhlIHNjYW4gKi8KKyAgICAvKiBjb252ZXJzaW9uIGNvZGUgYSBjaGFuY2UgdG8gZG8gaXRzIHN0dWZmLiAgICAgICAgKi8KICAgICB3aWR0aCAgPSAoRlRfVUludCkoICggY2JveC54TWF4IC0gY2JveC54TWluICkgPj4gNiApOworICAgIGlmICggd2lkdGggPT0gMCApCisgICAgeworICAgICAgY2JveC54TWluID0gRlRfUElYX0ZMT09SKCBjYm94MC54TWluICk7CisgICAgICBjYm94LnhNYXggPSBGVF9QSVhfQ0VJTCggY2JveDAueE1heCApOworCisgICAgICB3aWR0aCA9IChGVF9VSW50KSggKCBjYm94LnhNYXggLSBjYm94LnhNaW4gKSA+PiA2ICk7CisgICAgfQorCiAgICAgaGVpZ2h0ID0gKEZUX1VJbnQpKCAoIGNib3gueU1heCAtIGNib3gueU1pbiApID4+IDYgKTsKKyAgICBpZiAoIGhlaWdodCA9PSAwICkKKyAgICB7CisgICAgICBjYm94LnlNaW4gPSBGVF9QSVhfRkxPT1IoIGNib3gwLnlNaW4gKTsKKyAgICAgIGNib3gueU1heCA9IEZUX1BJWF9DRUlMKCBjYm94MC55TWF4ICk7CisKKyAgICAgIGhlaWdodCA9IChGVF9VSW50KSggKCBjYm94LnlNYXggLSBjYm94LnlNaW4gKSA+PiA2ICk7CisgICAgfQogCiAgICAgaWYgKCB3aWR0aCA+IEZUX1VTSE9SVF9NQVggfHwgaGVpZ2h0ID4gRlRfVVNIT1JUX01BWCApCiAgICAgewpAQCAtMTk0LDIzICsxODcsMTIgQEAKICAgICAgIHNsb3QtPmludGVybmFsLT5mbGFncyAmPSB+RlRfR0xZUEhfT1dOX0JJVE1BUDsKICAgICB9CiAKLSAgICAvKiBhbGxvY2F0ZSBuZXcgb25lLCBkZXBlbmRzIG9uIHBpeGVsIGZvcm1hdCAqLwotICAgIGlmICggISggbW9kZSAmIEZUX1JFTkRFUl9NT0RFX01PTk8gKSApCi0gICAgewotICAgICAgLyogd2UgcGFkIHRvIDMyIGJpdHMsIG9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggRlQgMS54ICovCi0gICAgICBwaXRjaCAgICAgICAgICAgICAgPSBGVF9QQURfQ0VJTCggd2lkdGgsIDQgKTsKLSAgICAgIGJpdG1hcC0+cGl4ZWxfbW9kZSA9IEZUX1BJWEVMX01PREVfR1JBWTsKLSAgICAgIGJpdG1hcC0+bnVtX2dyYXlzICA9IDI1NjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHBpdGNoICAgICAgICAgICAgICA9ICggKCB3aWR0aCArIDE1ICkgPj4gNCApIDw8IDE7Ci0gICAgICBiaXRtYXAtPnBpeGVsX21vZGUgPSBGVF9QSVhFTF9NT0RFX01PTk87Ci0gICAgfQorICAgIHBpdGNoICAgICAgICAgICAgICA9ICggKCB3aWR0aCArIDE1ICkgPj4gNCApIDw8IDE7CisgICAgYml0bWFwLT5waXhlbF9tb2RlID0gRlRfUElYRUxfTU9ERV9NT05POwogCiAgICAgYml0bWFwLT53aWR0aCA9IHdpZHRoOwogICAgIGJpdG1hcC0+cm93cyAgPSBoZWlnaHQ7Ci0gICAgYml0bWFwLT5waXRjaCA9IHBpdGNoOworICAgIGJpdG1hcC0+cGl0Y2ggPSAoaW50KXBpdGNoOwogCiAgICAgaWYgKCBGVF9BTExPQ19NVUxUKCBiaXRtYXAtPmJ1ZmZlciwgcGl0Y2gsIGhlaWdodCApICkKICAgICAgIGdvdG8gRXhpdDsKQEAgLTIyNSw5ICsyMDcsNiBAQAogICAgIHBhcmFtcy5zb3VyY2UgPSBvdXRsaW5lOwogICAgIHBhcmFtcy5mbGFncyAgPSAwOwogCi0gICAgaWYgKCBiaXRtYXAtPnBpeGVsX21vZGUgPT0gRlRfUElYRUxfTU9ERV9HUkFZICkKLSAgICAgIHBhcmFtcy5mbGFncyB8PSBGVF9SQVNURVJfRkxBR19BQTsKLQogICAgIC8qIHJlbmRlciBvdXRsaW5lIGludG8gdGhlIGJpdG1hcCAqLwogICAgIGVycm9yID0gcmVuZGVyLT5yYXN0ZXJfcmVuZGVyKCByZW5kZXItPnJhc3RlciwgJnBhcmFtcyApOwogCkBAIC0yNzIsMzUgKzI1MSw0IEBACiAgICkKIAogCi0gIC8qIFRoaXMgcmVuZGVyZXIgaXMgX05PVF8gcGFydCBvZiB0aGUgZGVmYXVsdCBtb2R1bGVzOyB5b3Ugd2lsbCBuZWVkICovCi0gIC8qIHRvIHJlZ2lzdGVyIGl0IGJ5IGhhbmQgaW4geW91ciBhcHBsaWNhdGlvbi4gIEl0IHNob3VsZCBvbmx5IGJlICAgICovCi0gIC8qIHVzZWQgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHdpdGggRlQgMS54IGFueXdheS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0RFRklORV9SRU5ERVJFUiggZnRfcmFzdGVyNV9yZW5kZXJlcl9jbGFzcywKLQotICAgICAgRlRfTU9EVUxFX1JFTkRFUkVSLAotICAgICAgc2l6ZW9mICggRlRfUmVuZGVyZXJSZWMgKSwKLQotICAgICAgInJhc3RlcjUiLAotICAgICAgMHgxMDAwMEwsCi0gICAgICAweDIwMDAwTCwKLQotICAgICAgMCwgICAgLyogbW9kdWxlIHNwZWNpZmljIGludGVyZmFjZSAqLwotCi0gICAgICAoRlRfTW9kdWxlX0NvbnN0cnVjdG9yKWZ0X3Jhc3RlcjFfaW5pdCwKLSAgICAgIChGVF9Nb2R1bGVfRGVzdHJ1Y3RvcikgMCwKLSAgICAgIChGVF9Nb2R1bGVfUmVxdWVzdGVyKSAgMAotICAgICwKLQotICAgIEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FLAotCi0gICAgKEZUX1JlbmRlcmVyX1JlbmRlckZ1bmMpICAgZnRfcmFzdGVyMV9yZW5kZXIsCi0gICAgKEZUX1JlbmRlcmVyX1RyYW5zZm9ybUZ1bmMpZnRfcmFzdGVyMV90cmFuc2Zvcm0sCi0gICAgKEZUX1JlbmRlcmVyX0dldENCb3hGdW5jKSAgZnRfcmFzdGVyMV9nZXRfY2JveCwKLSAgICAoRlRfUmVuZGVyZXJfU2V0TW9kZUZ1bmMpICBmdF9yYXN0ZXIxX3NldF9tb2RlLAotCi0gICAgKEZUX1Jhc3Rlcl9GdW5jcyopICAgICZGVF9TVEFOREFSRF9SQVNURVJfR0VUCi0gICkKLQotCiAvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9yYXN0ZXIvZnRyZW5kMS5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9mdHJlbmQxLmgKaW5kZXggNGNmMTI4Ni4uZWRjNWQxMyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9mdHJlbmQxLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9mdHJlbmQxLmgKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgVGhlIEZyZWVUeXBlIGdseXBoIHJhc3Rlcml6ZXIgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KQEAgLTI5LDEyICsyOSw2IEBACiAKICAgRlRfREVDTEFSRV9SRU5ERVJFUiggZnRfcmFzdGVyMV9yZW5kZXJlcl9jbGFzcyApCiAKLSAgLyogdGhpcyByZW5kZXJlciBpcyBfTk9UXyBwYXJ0IG9mIHRoZSBkZWZhdWx0IG1vZHVsZXMsIHlvdSdsbCBuZWVkICovCi0gIC8qIHRvIHJlZ2lzdGVyIGl0IGJ5IGhhbmQgaW4geW91ciBhcHBsaWNhdGlvbi4gIEl0IHNob3VsZCBvbmx5IGJlICAqLwotICAvKiB1c2VkIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB3aXRoIEZUIDEueCBhbnl3YXkuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0RFQ0xBUkVfUkVOREVSRVIoIGZ0X3Jhc3RlcjVfcmVuZGVyZXJfY2xhc3MgKQotCiAKIEZUX0VORF9IRUFERVIKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9yYXN0ZXIuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9yYXN0ZXIvcmFzdGVyLmMKaW5kZXggMTIwMmExMS4uMjFiYjE2ZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9yYXN0ZXIuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL3Jhc3Rlci5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEZyZWVUeXBlIG1vbm9jaHJvbWUgcmFzdGVyZXIgbW9kdWxlIGNvbXBvbmVudCAoYm9keSBvbmx5KS4gICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL3Jhc3RlcnJzLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL3Jhc3RlcnJzLmgKaW5kZXggYWI4NWMwMC4uZTdmMDBiYyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9yYXN0ZXJycy5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9yYXN0ZXIvcmFzdGVycnMuaApAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBtb25vY2hyb21lIHJlbmRlcmVyIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMSwgMjAxMiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDEtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9yYXN0cGljLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL3Jhc3RwaWMuYwppbmRleCA1ZTlmN2NjLi43N2U3ZWMzIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL3Jhc3RwaWMuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL3Jhc3RwaWMuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyBmb3IgcmFzdGVyIG1vZHVsZS4gICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOSwgMjAxMCwgMjAxMiwgMjAxMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDktMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtNTksOCArNTksOSBAQAogICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgICAgICAgID0gbGlicmFyeS0+bWVtb3J5OwogCiAKLSAgICAvKiBzaW5jZSB0aGlzIGZ1bmN0aW9uIGFsc28gc2VydmVzIHJhc3RlcjUgcmVuZGVyZXIsICovCi0gICAgLyogaXQgaW1wbGVtZW50cyByZWZlcmVuY2UgY291bnRpbmcgICAgICAgICAgICAgICAgICAqLworICAgIC8qIFhYWDogc2luY2UgdGhpcyBmdW5jdGlvbiBhbHNvIHNlcnZlZCB0aGUgbm8gbG9uZ2VyIGF2YWlsYWJsZSAgKi8KKyAgICAvKiAgICAgIHJhc3RlcjUgcmVuZGVyZXIgaXQgdXNlcyByZWZlcmVuY2UgY291bnRpbmcsIHdoaWNoIGNvdWxkICovCisgICAgLyogICAgICBiZSByZW1vdmVkIG5vdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgIGlmICggcGljX2NvbnRhaW5lci0+cmFzdGVyICkKICAgICB7CiAgICAgICAoKFJhc3RlclBJQyopcGljX2NvbnRhaW5lci0+cmFzdGVyKS0+cmVmX2NvdW50Kys7CkBAIC04MiwyMSArODMsNiBAQAogICAgIHJldHVybiBlcnJvcjsKICAgfQogCi0KLSAgLyogcmUtcm91dGUgdGhlc2UgaW5pdCBhbmQgZnJlZSBmdW5jdGlvbnMgdG8gdGhlIGFib3ZlIGZ1bmN0aW9ucyAqLwotICBGVF9FcnJvcgotICBmdF9yYXN0ZXI1X3JlbmRlcmVyX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIHJldHVybiBmdF9yYXN0ZXIxX3JlbmRlcmVyX2NsYXNzX3BpY19pbml0KCBsaWJyYXJ5ICk7Ci0gIH0KLQotCi0gIHZvaWQKLSAgZnRfcmFzdGVyNV9yZW5kZXJlcl9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBmdF9yYXN0ZXIxX3JlbmRlcmVyX2NsYXNzX3BpY19mcmVlKCBsaWJyYXJ5ICk7Ci0gIH0KLQogI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCiAKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9yYXN0cGljLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL3Jhc3RwaWMuaAppbmRleCBlMGRkYmE2Li40MDg5OTZhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL3Jhc3RwaWMuaAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL3Jhc3RwaWMuaApAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyBmb3IgcmFzdGVyIG1vZHVsZS4gICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDktMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtMjAsMTEgKzIwLDExIEBACiAjZGVmaW5lIF9fUkFTVFBJQ19IX18KIAogCi1GVF9CRUdJTl9IRUFERVIKLQogI2luY2x1ZGUgRlRfSU5URVJOQUxfUElDX0gKIAogCitGVF9CRUdJTl9IRUFERVIKKwogI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwogCiAjZGVmaW5lIEZUX1NUQU5EQVJEX1JBU1RFUl9HRVQgIGZ0X3N0YW5kYXJkX3Jhc3RlcgpAQCAtNDgsMTUgKzQ4LDkgQEAKICAgdm9pZAogICBmdF9yYXN0ZXIxX3JlbmRlcmVyX2NsYXNzX3BpY19mcmVlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7CiAKLSAgdm9pZAotICBmdF9yYXN0ZXI1X3JlbmRlcmVyX2NsYXNzX3BpY19mcmVlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KICAgRlRfRXJyb3IKICAgZnRfcmFzdGVyMV9yZW5kZXJlcl9jbGFzc19waWNfaW5pdCggRlRfTGlicmFyeSAgbGlicmFyeSApOwogCi0gIEZUX0Vycm9yCi0gIGZ0X3Jhc3RlcjVfcmVuZGVyZXJfY2xhc3NfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQogI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCiAKICAvKiAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvSmFtZmlsZSBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L0phbWZpbGUKaW5kZXggY2IyMGIxYi4uY2M5OGQxMCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvSmFtZmlsZQorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC9KYW1maWxlCkBAIC0xLDYgKzEsNiBAQAogIyBGcmVlVHlwZSAyIHNyYy9zZm50IEphbWZpbGUKICMKLSMgQ29weXJpZ2h0IDIwMDEsIDIwMDIsIDIwMDQsIDIwMDUgYnkKKyMgQ29weXJpZ2h0IDIwMDEtMjAxNSBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC0xNiw3ICsxNiwxOCBAQAogCiAgIGlmICQoRlQyX01VTFRJKQogICB7Ci0gICAgX3NvdXJjZXMgPSBzZm9ianMgc2Zkcml2ZXIgdHRjbWFwIHR0bXR4IHR0cG9zdCB0dGxvYWQgdHRzYml0IHR0a2VybiB0dGJkZiBzZm50cGljIDsKKyAgICBfc291cmNlcyA9IHBuZ3NoaW0KKyAgICAgICAgICAgICAgIHNmZHJpdmVyCisgICAgICAgICAgICAgICBzZm50cGljCisgICAgICAgICAgICAgICBzZm9ianMKKyAgICAgICAgICAgICAgIHR0YmRmCisgICAgICAgICAgICAgICB0dGNtYXAKKyAgICAgICAgICAgICAgIHR0a2VybgorICAgICAgICAgICAgICAgdHRsb2FkCisgICAgICAgICAgICAgICB0dG10eAorICAgICAgICAgICAgICAgdHRwb3N0CisgICAgICAgICAgICAgICB0dHNiaXQKKyAgICAgICAgICAgICAgIDsKICAgfQogICBlbHNlCiAgIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3BuZ3NoaW0uYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3BuZ3NoaW0uYwppbmRleCA5YmZjYzJhLi5lYTYwNDUyIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC9wbmdzaGltLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvcG5nc2hpbS5jCkBAIC00LDcgKzQsOCBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFBORyBCaXRtYXAgZ2x5cGggc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDEzLCAyMDE0IGJ5IEdvb2dsZSwgSW5jLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAxMy0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgR29vZ2xlLCBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFdyaXR0ZW4gYnkgU3R1YXJ0IEdpbGwgYW5kIEJlaGRhZCBFc2ZhaGJvZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtMzYsMTEgKzM3LDExIEBACiAgIC8qIFRoaXMgY29kZSBpcyBmcmVlbHkgYmFzZWQgb24gY2Fpcm8tcG5nLmMuICBUaGVyZSdzIHNvIG1hbnkgd2F5cyAqLwogICAvKiB0byBjYWxsIGxpYnBuZywgYW5kIHRoZSB3YXkgY2Fpcm8gZG9lcyBpdCBpcyBkZWZhY3RvIHN0YW5kYXJkLiAgKi8KIAotICBzdGF0aWMgaW50Ci0gIG11bHRpcGx5X2FscGhhKCBpbnQgIGFscGhhLAotICAgICAgICAgICAgICAgICAgaW50ICBjb2xvciApCisgIHN0YXRpYyB1bnNpZ25lZCBpbnQKKyAgbXVsdGlwbHlfYWxwaGEoIHVuc2lnbmVkIGludCAgYWxwaGEsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIGNvbG9yICkKICAgewotICAgIGludCAgdGVtcCA9ICggYWxwaGEgKiBjb2xvciApICsgMHg4MDsKKyAgICB1bnNpZ25lZCBpbnQgIHRlbXAgPSBhbHBoYSAqIGNvbG9yICsgMHg4MDsKIAogCiAgICAgcmV0dXJuICggdGVtcCArICggdGVtcCA+PiA4ICkgKSA+PiA4OwpAQCAtODEsMTAgKzgyLDEwIEBACiAgICAgICAgICAgYmx1ZSAgPSBtdWx0aXBseV9hbHBoYSggYWxwaGEsIGJsdWUgICk7CiAgICAgICAgIH0KIAotICAgICAgICBiYXNlWzBdID0gYmx1ZTsKLSAgICAgICAgYmFzZVsxXSA9IGdyZWVuOwotICAgICAgICBiYXNlWzJdID0gcmVkOwotICAgICAgICBiYXNlWzNdID0gYWxwaGE7CisgICAgICAgIGJhc2VbMF0gPSAodW5zaWduZWQgY2hhcilibHVlOworICAgICAgICBiYXNlWzFdID0gKHVuc2lnbmVkIGNoYXIpZ3JlZW47CisgICAgICAgIGJhc2VbMl0gPSAodW5zaWduZWQgY2hhcilyZWQ7CisgICAgICAgIGJhc2VbM10gPSAodW5zaWduZWQgY2hhcilhbHBoYTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTEwOSw5ICsxMTAsOSBAQAogICAgICAgdW5zaWduZWQgaW50ICAgIGJsdWUgID0gYmFzZVsyXTsKIAogCi0gICAgICBiYXNlWzBdID0gYmx1ZTsKLSAgICAgIGJhc2VbMV0gPSBncmVlbjsKLSAgICAgIGJhc2VbMl0gPSByZWQ7CisgICAgICBiYXNlWzBdID0gKHVuc2lnbmVkIGNoYXIpYmx1ZTsKKyAgICAgIGJhc2VbMV0gPSAodW5zaWduZWQgY2hhcilncmVlbjsKKyAgICAgIGJhc2VbMl0gPSAodW5zaWduZWQgY2hhcilyZWQ7CiAgICAgICBiYXNlWzNdID0gMHhGRjsKICAgICB9CiAgIH0KQEAgLTI1NywxNiArMjU4LDE2IEBACiAKICAgICBpZiAoIHBvcHVsYXRlX21hcF9hbmRfbWV0cmljcyApCiAgICAgewotICAgICAgRlRfTG9uZyAgc2l6ZTsKKyAgICAgIEZUX1VMb25nICBzaXplOwogCiAKLSAgICAgIG1ldHJpY3MtPndpZHRoICA9IChGVF9JbnQpaW1nV2lkdGg7Ci0gICAgICBtZXRyaWNzLT5oZWlnaHQgPSAoRlRfSW50KWltZ0hlaWdodDsKKyAgICAgIG1ldHJpY3MtPndpZHRoICA9IChGVF9VU2hvcnQpaW1nV2lkdGg7CisgICAgICBtZXRyaWNzLT5oZWlnaHQgPSAoRlRfVVNob3J0KWltZ0hlaWdodDsKIAogICAgICAgbWFwLT53aWR0aCAgICAgID0gbWV0cmljcy0+d2lkdGg7CiAgICAgICBtYXAtPnJvd3MgICAgICAgPSBtZXRyaWNzLT5oZWlnaHQ7CiAgICAgICBtYXAtPnBpeGVsX21vZGUgPSBGVF9QSVhFTF9NT0RFX0JHUkE7Ci0gICAgICBtYXAtPnBpdGNoICAgICAgPSBtYXAtPndpZHRoICogNDsKKyAgICAgIG1hcC0+cGl0Y2ggICAgICA9IChpbnQpKCBtYXAtPndpZHRoICogNCApOwogICAgICAgbWFwLT5udW1fZ3JheXMgID0gMjU2OwogCiAgICAgICAvKiByZWplY3QgdG9vIGxhcmdlIGJpdG1hcHMgc2ltaWxhcmx5IHRvIHRoZSByYXN0ZXJpemVyICovCkBAIC0yNzcsNyArMjc4LDcgQEAKICAgICAgIH0KIAogICAgICAgLyogdGhpcyBkb2Vzbid0IG92ZXJmbG93OiAweDdGRkYgKiAweDdGRkYgKiA0IDwgMl4zMiAqLwotICAgICAgc2l6ZSA9IG1hcC0+cm93cyAqIG1hcC0+cGl0Y2g7CisgICAgICBzaXplID0gbWFwLT5yb3dzICogKEZUX1VMb25nKW1hcC0+cGl0Y2g7CiAKICAgICAgIGVycm9yID0gZnRfZ2x5cGhzbG90X2FsbG9jX2JpdG1hcCggc2xvdCwgc2l6ZSApOwogICAgICAgaWYgKCBlcnJvciApCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC9wbmdzaGltLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC9wbmdzaGltLmgKaW5kZXggZGM5ZWNhZi4uNGNjNWMyYiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvcG5nc2hpbS5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3BuZ3NoaW0uaApAQCAtNCw3ICs0LDggQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBQTkcgQml0bWFwIGdseXBoIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxMyBieSBHb29nbGUsIEluYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMTMtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEdvb2dsZSwgSW5jLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBXcml0dGVuIGJ5IFN0dWFydCBHaWxsIGFuZCBCZWhkYWQgRXNmYWhib2QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3NmZHJpdmVyLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC9zZmRyaXZlci5jCmluZGV4IGJkOGRkMmUuLjZhM2YwZDkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3NmZHJpdmVyLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvc2Zkcml2ZXIuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBIaWdoLWxldmVsIFNGTlQgZHJpdmVyIGludGVyZmFjZSAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDA3LCAyMDA5LTIwMTQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtMjY2LDcgKzI2Niw3IEBACiAgICAgICB7CiAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSA9IGZhY2UtPm5hbWVfdGFibGUuc3RyZWFtOwogICAgICAgICBGVF9TdHJpbmcqICByICAgICAgPSAoRlRfU3RyaW5nKilyZXN1bHQ7Ci0gICAgICAgIEZUX0J5dGUqICAgIHA7CisgICAgICAgIEZUX0NoYXIqICAgIHA7CiAKIAogICAgICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBuYW1lLT5zdHJpbmdPZmZzZXQgKSB8fApAQCAtMjgwLDExICsyODAsMTEgQEAKICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KIAotICAgICAgICBwID0gKEZUX0J5dGUqKXN0cmVhbS0+Y3Vyc29yOworICAgICAgICBwID0gKEZUX0NoYXIqKXN0cmVhbS0+Y3Vyc29yOwogCiAgICAgICAgIGZvciAoIDsgbGVuID4gMDsgbGVuLS0sIHAgKz0gMiApCiAgICAgICAgIHsKLSAgICAgICAgICBpZiAoIHBbMF0gPT0gMCAmJiBwWzFdID49IDMyICYmIHBbMV0gPCAxMjggKQorICAgICAgICAgIGlmICggcFswXSA9PSAwICYmIHBbMV0gPj0gMzIgKQogICAgICAgICAgICAgKnIrKyA9IHBbMV07CiAgICAgICAgIH0KICAgICAgICAgKnIgPSAnXDAnOwpAQCAtNDI3LDcgKzQyNyw3IEBACiAgIHNmbnRfZ2V0X2ludGVyZmFjZSggRlRfTW9kdWxlICAgIG1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgbW9kdWxlX2ludGVyZmFjZSApCiAgIHsKLSAgICAvKiBTRk5UX1NFUlZJQ0VTX0dFVCBkZXJlZmVycyBgbGlicmFyeScgaW4gUElDIG1vZGUgKi8KKyAgICAvKiBTRk5UX1NFUlZJQ0VTX0dFVCBkZXJlZmVyZW5jZXMgYGxpYnJhcnknIGluIFBJQyBtb2RlICovCiAjaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKICAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5OwogCkBAIC01MDUsNyArNTA1LDkgQEAKICAgICBQVVRfRU1CRURERURfQklUTUFQUyggdHRfZmFjZV9zZXRfc2JpdF9zdHJpa2UgICAgICksCiAgICAgUFVUX0VNQkVEREVEX0JJVE1BUFMoIHR0X2ZhY2VfbG9hZF9zdHJpa2VfbWV0cmljcyApLAogCi0gICAgdHRfZmFjZV9nZXRfbWV0cmljcworICAgIHR0X2ZhY2VfZ2V0X21ldHJpY3MsCisKKyAgICB0dF9mYWNlX2dldF9uYW1lCiAgICkKIAogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC9zZmRyaXZlci5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvc2Zkcml2ZXIuaAppbmRleCA1ZGUyNWQ1Li45NDQxMTljIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC9zZmRyaXZlci5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3NmZHJpdmVyLmgKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgSGlnaC1sZXZlbCBTRk5UIGRyaXZlciBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3NmZXJyb3JzLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC9zZmVycm9ycy5oCmluZGV4IGU5ODFlMWQuLmUzYmVmM2YgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3NmZXJyb3JzLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvc2ZlcnJvcnMuaApAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBTRk5UIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMSwgMjAwNCwgMjAxMiwgMjAxMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDEtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvc2ZudC5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvc2ZudC5jCmluZGV4IGQ2MmVkNGUuLjBiOGI1ZjQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3NmbnQuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC9zZm50LmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgU2luZ2xlIG9iamVjdCBsaWJyYXJ5IGNvbXBvbmVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwNiwgMjAxMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3NmbnRwaWMuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3NmbnRwaWMuYwppbmRleCBiM2ZiMjRiLi4yYWFmNGJjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC9zZm50cGljLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvc2ZudHBpYy5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFRoZSBGcmVlVHlwZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHNlcnZpY2VzIGZvciBzZm50IG1vZHVsZS4gICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA5LCAyMDEwLCAyMDEyLCAyMDEzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwOS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC9zZm50cGljLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC9zZm50cGljLmgKaW5kZXggYjA5YTkxNC4uZDk5YmU2YSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvc2ZudHBpYy5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3NmbnRwaWMuaApAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyBmb3Igc2ZudCBtb2R1bGUuICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOSwgMjAxMiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDktMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtMjAsOCArMjAsNiBAQAogI2RlZmluZSBfX1NGTlRQSUNfSF9fCiAKIAotRlRfQkVHSU5fSEVBREVSCi0KICNpbmNsdWRlIEZUX0lOVEVSTkFMX1BJQ19ICiAKIApAQCAtMzEsNyArMjksNiBAQAogI2RlZmluZSBTRk5UX1NFUlZJQ0VfR0xZUEhfRElDVF9HRVQgIHNmbnRfc2VydmljZV9nbHlwaF9kaWN0CiAjZGVmaW5lIFNGTlRfU0VSVklDRV9QU19OQU1FX0dFVCAgICAgc2ZudF9zZXJ2aWNlX3BzX25hbWUKICNkZWZpbmUgVFRfU0VSVklDRV9DTUFQX0lORk9fR0VUICAgICB0dF9zZXJ2aWNlX2dldF9jbWFwX2luZm8KLSNkZWZpbmUgU0ZOVF9TRVJWSUNFU19HRVQgICAgICAgICAgICBzZm50X3NlcnZpY2VzCiAjZGVmaW5lIFRUX0NNQVBfQ0xBU1NFU19HRVQgICAgICAgICAgdHRfY21hcF9jbGFzc2VzCiAjZGVmaW5lIFNGTlRfU0VSVklDRV9TRk5UX1RBQkxFX0dFVCAgc2ZudF9zZXJ2aWNlX3NmbnRfdGFibGUKICNkZWZpbmUgU0ZOVF9TRVJWSUNFX0JERl9HRVQgICAgICAgICBzZm50X3NlcnZpY2VfYmRmCkBAIC01Niw2ICs1Myw4IEBACiAjaW5jbHVkZSAidHRjbWFwLmgiCiAKIAorRlRfQkVHSU5fSEVBREVSCisKICAgdHlwZWRlZiBzdHJ1Y3QgIHNmbnRNb2R1bGVQSUNfCiAgIHsKICAgICBGVF9TZXJ2aWNlRGVzY1JlYyogICAgICAgIHNmbnRfc2VydmljZXM7CkBAIC04Myw4ICs4Miw2IEBACiAgICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPnNmbnRfc2VydmljZV9wc19uYW1lICkKICNkZWZpbmUgVFRfU0VSVklDRV9DTUFQX0lORk9fR0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT50dF9zZXJ2aWNlX2dldF9jbWFwX2luZm8gKQotI2RlZmluZSBTRk5UX1NFUlZJQ0VTX0dFVCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT5zZm50X3NlcnZpY2VzICkKICNkZWZpbmUgVFRfQ01BUF9DTEFTU0VTX0dFVCAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT50dF9jbWFwX2NsYXNzZXMgKQogI2RlZmluZSBTRk5UX1NFUlZJQ0VfU0ZOVF9UQUJMRV9HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTEwMiwxMiArOTksMTMgQEAKICAgRlRfRXJyb3IKICAgc2ZudF9tb2R1bGVfY2xhc3NfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKIAorCitGVF9FTkRfSEVBREVSCisKICNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwogCiAgIC8qICovCiAKLUZUX0VORF9IRUFERVIKLQogI2VuZGlmIC8qIF9fU0ZOVFBJQ19IX18gKi8KIAogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC9zZm9ianMuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3Nmb2Jqcy5jCmluZGV4IDcwYjk4OGQuLjE0ZDNhZGUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3Nmb2Jqcy5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3Nmb2Jqcy5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFNGTlQgb2JqZWN0IG1hbmFnZW1lbnQgKGJhc2UpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDgsIDIwMTAtMjAxNCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC0xMjAsMjcgKzEyMCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9nZXRfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJucyBhIGdpdmVuIEVOR0xJU0ggbmFtZSByZWNvcmQgaW4gQVNDSUkuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuYW1laWQgOjogVGhlIG5hbWUgaWQgb2YgdGhlIG5hbWUgcmVjb3JkIHRvIHJldHVybi4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuYW1lICAgOjogVGhlIGFkZHJlc3Mgb2YgYSBzdHJpbmcgcG9pbnRlci4gIE5VTEwgaWYgbm8gbmFtZSBpcyAgICAgKi8KLSAgLyogICAgICAgICAgICAgIHByZXNlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKKyAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBzZm50LmggKi8KKworICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKICAgdHRfZmFjZV9nZXRfbmFtZSggVFRfRmFjZSAgICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICBuYW1laWQsCiAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmluZyoqICBuYW1lICkKQEAgLTM3Niw4ICszNTgsOCBAQAogICAgIEZUX0ZSRUUoIHN0cmVhbS0+YmFzZSApOwogCiAgICAgc3RyZWFtLT5zaXplICA9IDA7Ci0gICAgc3RyZWFtLT5iYXNlICA9IDA7Ci0gICAgc3RyZWFtLT5jbG9zZSA9IDA7CisgICAgc3RyZWFtLT5iYXNlICA9IE5VTEw7CisgICAgc3RyZWFtLT5jbG9zZSA9IE5VTEw7CiAgIH0KIAogCkBAIC01ODAsOCArNTYyLDggQEAKICAgICAgIHRhYmxlLT5PcmlnT2Zmc2V0ID0gc2ZudF9vZmZzZXQ7CiAKICAgICAgIC8qIFRoZSBvZmZzZXRzIG11c3QgYmUgbXVsdGlwbGVzIG9mIDQuICovCi0gICAgICB3b2ZmX29mZnNldCArPSAoIHRhYmxlLT5Db21wTGVuZ3RoICsgMyApICYgfjM7Ci0gICAgICBzZm50X29mZnNldCArPSAoIHRhYmxlLT5PcmlnTGVuZ3RoICsgMyApICYgfjM7CisgICAgICB3b2ZmX29mZnNldCArPSAoIHRhYmxlLT5Db21wTGVuZ3RoICsgMyApICYgfjNVOworICAgICAgc2ZudF9vZmZzZXQgKz0gKCB0YWJsZS0+T3JpZ0xlbmd0aCArIDMgKSAmIH4zVTsKICAgICB9CiAKICAgICAvKgpAQCAtNjA5LDcgKzU5MSw3IEBACiAgICAgaWYgKCB3b2ZmLnByaXZPZmZzZXQgKQogICAgIHsKICAgICAgIC8qIC4uLiBpZiBpdCBpc24ndCB0aGUgbGFzdCBibG9jay4gKi8KLSAgICAgIHdvZmZfb2Zmc2V0ID0gKCB3b2ZmX29mZnNldCArIDMgKSAmIH4zOworICAgICAgd29mZl9vZmZzZXQgPSAoIHdvZmZfb2Zmc2V0ICsgMyApICYgfjNVOwogCiAgICAgICBpZiAoIHdvZmYucHJpdk9mZnNldCAhPSB3b2ZmX29mZnNldCAgICAgICAgICAgICAgICAgIHx8CiAgICAgICAgICAgIHdvZmYucHJpdk9mZnNldCArIHdvZmYucHJpdkxlbmd0aCA+IHdvZmYubGVuZ3RoICkKQEAgLTgzOSwxMyArODIxLDE0IEBACiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQogICBzZm50X2luaXRfZmFjZSggRlRfU3RyZWFtICAgICAgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGZhY2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBmYWNlX2luc3RhbmNlX2luZGV4LAogICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgbnVtX3BhcmFtcywKICAgICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcyApCiAgIHsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3I7Ci0gICAgRlRfTGlicmFyeSAgICAgIGxpYnJhcnkgPSBmYWNlLT5yb290LmRyaXZlci0+cm9vdC5saWJyYXJ5OwotICAgIFNGTlRfU2VydmljZSAgICBzZm50OworICAgIEZUX0Vycm9yICAgICAgZXJyb3I7CisgICAgRlRfTGlicmFyeSAgICBsaWJyYXJ5ID0gZmFjZS0+cm9vdC5kcml2ZXItPnJvb3QubGlicmFyeTsKKyAgICBTRk5UX1NlcnZpY2UgIHNmbnQ7CisgICAgRlRfSW50ICAgICAgICBmYWNlX2luZGV4OwogCiAKICAgICAvKiBmb3Igbm93LCBwYXJhbWV0ZXJzIGFyZSB1bnVzZWQgKi8KQEAgLTg3OCwyMiArODYxLDY1IEBACiAgICAgLyogU3RyZWFtIG1heSBoYXZlIGNoYW5nZWQgaW4gc2ZudF9vcGVuX2ZvbnQuICovCiAgICAgc3RyZWFtID0gZmFjZS0+cm9vdC5zdHJlYW07CiAKLSAgICBGVF9UUkFDRTIoKCAic2ZudF9pbml0X2ZhY2U6ICUwOHAsICVsZFxuIiwgZmFjZSwgZmFjZV9pbmRleCApKTsKKyAgICBGVF9UUkFDRTIoKCAic2ZudF9pbml0X2ZhY2U6ICUwOHAsICVsZFxuIiwgZmFjZSwgZmFjZV9pbnN0YW5jZV9pbmRleCApKTsKIAotICAgIGlmICggZmFjZV9pbmRleCA8IDAgKQotICAgICAgZmFjZV9pbmRleCA9IDA7CisgICAgZmFjZV9pbmRleCA9IEZUX0FCUyggZmFjZV9pbnN0YW5jZV9pbmRleCApICYgMHhGRkZGOwogCiAgICAgaWYgKCBmYWNlX2luZGV4ID49IGZhY2UtPnR0Y19oZWFkZXIuY291bnQgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7CisgICAgeworICAgICAgaWYgKCBmYWNlX2luc3RhbmNlX2luZGV4ID49IDAgKQorICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZmFjZV9pbmRleCA9IDA7CisgICAgfQogCiAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggZmFjZS0+dHRjX2hlYWRlci5vZmZzZXRzW2ZhY2VfaW5kZXhdICkgKQogICAgICAgcmV0dXJuIGVycm9yOwogCi0gICAgLyogY2hlY2sgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgVHJ1ZVR5cGUgZmlsZSAqLworICAgIC8qIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSBhIHZhbGlkIFRydWVUeXBlIGZpbGUgKi8KICAgICBlcnJvciA9IHNmbnQtPmxvYWRfZm9udF9kaXIoIGZhY2UsIHN0cmVhbSApOwogICAgIGlmICggZXJyb3IgKQogICAgICAgcmV0dXJuIGVycm9yOwogCisjaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAorICAgIHsKKyAgICAgIEZUX1VMb25nICAgZnZhcl9sZW47CisgICAgICBGVF9VU2hvcnQgIG51bV9pbnN0YW5jZXM7CisgICAgICBGVF9JbnQgICAgIGluc3RhbmNlX2luZGV4OworCisKKyAgICAgIGluc3RhbmNlX2luZGV4ID0gRlRfQUJTKCBmYWNlX2luc3RhbmNlX2luZGV4ICkgPj4gMTY7CisKKyAgICAgIC8qIHRlc3Qgd2hldGhlciBjdXJyZW50IGZhY2UgaXMgYSBHWCBmb250IHdpdGggbmFtZWQgaW5zdGFuY2VzICovCisgICAgICBpZiAoIGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfZnZhciwgc3RyZWFtLCAmZnZhcl9sZW4gKSB8fAorICAgICAgICAgICBmdmFyX2xlbiA8IDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgRlRfU1RSRUFNX1NLSVAoIDEyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgIEZUX1JFQURfVVNIT1JUKCBudW1faW5zdGFuY2VzICkgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgIG51bV9pbnN0YW5jZXMgPSAwOworCisgICAgICAvKiB3ZSBzdXBwb3J0IGF0IG1vc3QgMl4xNSAtIDEgaW5zdGFuY2VzICovCisgICAgICBpZiAoIG51bV9pbnN0YW5jZXMgPj0gKCAxVSA8PCAxNSApIC0gMSApCisgICAgICB7CisgICAgICAgIGlmICggZmFjZV9pbnN0YW5jZV9pbmRleCA+PSAwICkKKyAgICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIG51bV9pbnN0YW5jZXMgPSAwOworICAgICAgfQorCisgICAgICAvKiBpbnN0YW5jZSBpbmRpY2VzIGluIGBmYWNlX2luc3RhbmNlX2luZGV4JyBzdGFydCB3aXRoIGluZGV4IDEsICovCisgICAgICAvKiB0aHVzIGA+JyBhbmQgbm90IGA+PScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBpZiAoIGluc3RhbmNlX2luZGV4ID4gbnVtX2luc3RhbmNlcyApCisgICAgICB7CisgICAgICAgIGlmICggZmFjZV9pbnN0YW5jZV9pbmRleCA+PSAwICkKKyAgICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIG51bV9pbnN0YW5jZXMgPSAwOworICAgICAgfQorCisgICAgICBmYWNlLT5yb290LnN0eWxlX2ZsYWdzID0gKEZUX0xvbmcpbnVtX2luc3RhbmNlcyA8PCAxNjsKKyAgICB9CisjZW5kaWYKKwogICAgIGZhY2UtPnJvb3QubnVtX2ZhY2VzICA9IGZhY2UtPnR0Y19oZWFkZXIuY291bnQ7CiAgICAgZmFjZS0+cm9vdC5mYWNlX2luZGV4ID0gZmFjZV9pbmRleDsKIApAQCAtOTQ2LDcgKzk3Miw3IEBACiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQogICBzZm50X2xvYWRfZmFjZSggRlRfU3RyZWFtICAgICAgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGZhY2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBmYWNlX2luc3RhbmNlX2luZGV4LAogICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgbnVtX3BhcmFtcywKICAgICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcyApCiAgIHsKQEAgLTk2Miw3ICs5ODgsNyBAQAogCiAgICAgU0ZOVF9TZXJ2aWNlICBzZm50ID0gKFNGTlRfU2VydmljZSlmYWNlLT5zZm50OwogCi0gICAgRlRfVU5VU0VEKCBmYWNlX2luZGV4ICk7CisgICAgRlRfVU5VU0VEKCBmYWNlX2luc3RhbmNlX2luZGV4ICk7CiAKIAogICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KQEAgLTEyODQsNyArMTMxMCw3IEBACiAgICAgICAgICAgZmxhZ3MgfD0gRlRfU1RZTEVfRkxBR19JVEFMSUM7CiAgICAgICB9CiAKLSAgICAgIHJvb3QtPnN0eWxlX2ZsYWdzID0gZmxhZ3M7CisgICAgICByb290LT5zdHlsZV9mbGFncyB8PSBmbGFnczsKIAogICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNDMxLDggKzE0NTcsOCBAQAogICAgICAgICByb290LT5hc2NlbmRlciAgPSBmYWNlLT5ob3Jpem9udGFsLkFzY2VuZGVyOwogICAgICAgICByb290LT5kZXNjZW5kZXIgPSBmYWNlLT5ob3Jpem9udGFsLkRlc2NlbmRlcjsKIAotICAgICAgICByb290LT5oZWlnaHQgPSAoRlRfU2hvcnQpKCByb290LT5hc2NlbmRlciAtIHJvb3QtPmRlc2NlbmRlciArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmhvcml6b250YWwuTGluZV9HYXAgKTsKKyAgICAgICAgcm9vdC0+aGVpZ2h0ID0gcm9vdC0+YXNjZW5kZXIgLSByb290LT5kZXNjZW5kZXIgKworICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5ob3Jpem9udGFsLkxpbmVfR2FwOwogCiAgICAgICAgIGlmICggISggcm9vdC0+YXNjZW5kZXIgfHwgcm9vdC0+ZGVzY2VuZGVyICkgKQogICAgICAgICB7CkBAIC0xNDQzLDIzICsxNDY5LDI0IEBACiAgICAgICAgICAgICAgIHJvb3QtPmFzY2VuZGVyICA9IGZhY2UtPm9zMi5zVHlwb0FzY2VuZGVyOwogICAgICAgICAgICAgICByb290LT5kZXNjZW5kZXIgPSBmYWNlLT5vczIuc1R5cG9EZXNjZW5kZXI7CiAKLSAgICAgICAgICAgICAgcm9vdC0+aGVpZ2h0ID0gKEZUX1Nob3J0KSggcm9vdC0+YXNjZW5kZXIgLSByb290LT5kZXNjZW5kZXIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5vczIuc1R5cG9MaW5lR2FwICk7CisgICAgICAgICAgICAgIHJvb3QtPmhlaWdodCA9IHJvb3QtPmFzY2VuZGVyIC0gcm9vdC0+ZGVzY2VuZGVyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+b3MyLnNUeXBvTGluZUdhcDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgcm9vdC0+YXNjZW5kZXIgID0gIChGVF9TaG9ydClmYWNlLT5vczIudXNXaW5Bc2NlbnQ7CiAgICAgICAgICAgICAgIHJvb3QtPmRlc2NlbmRlciA9IC0oRlRfU2hvcnQpZmFjZS0+b3MyLnVzV2luRGVzY2VudDsKIAotICAgICAgICAgICAgICByb290LT5oZWlnaHQgPSAoRlRfVVNob3J0KSggcm9vdC0+YXNjZW5kZXIgLSByb290LT5kZXNjZW5kZXIgKTsKKyAgICAgICAgICAgICAgcm9vdC0+aGVpZ2h0ID0gcm9vdC0+YXNjZW5kZXIgLSByb290LT5kZXNjZW5kZXI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcm9vdC0+bWF4X2FkdmFuY2Vfd2lkdGggID0gZmFjZS0+aG9yaXpvbnRhbC5hZHZhbmNlX1dpZHRoX01heDsKLSAgICAgICAgcm9vdC0+bWF4X2FkdmFuY2VfaGVpZ2h0ID0gKEZUX1Nob3J0KSggZmFjZS0+dmVydGljYWxfaW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZmFjZS0+dmVydGljYWwuYWR2YW5jZV9IZWlnaHRfTWF4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByb290LT5oZWlnaHQgKTsKKyAgICAgICAgcm9vdC0+bWF4X2FkdmFuY2Vfd2lkdGggID0KKyAgICAgICAgICAoRlRfU2hvcnQpZmFjZS0+aG9yaXpvbnRhbC5hZHZhbmNlX1dpZHRoX01heDsKKyAgICAgICAgcm9vdC0+bWF4X2FkdmFuY2VfaGVpZ2h0ID0KKyAgICAgICAgICAoRlRfU2hvcnQpKCBmYWNlLT52ZXJ0aWNhbF9pbmZvID8gZmFjZS0+dmVydGljYWwuYWR2YW5jZV9IZWlnaHRfTWF4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJvb3QtPmhlaWdodCApOwogCiAgICAgICAgIC8qIFNlZSBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vT3BlblR5cGUvT1RTcGVjL3Bvc3QuaHRtIC0tICovCiAgICAgICAgIC8qIEFkanVzdCB1bmRlcmxpbmUgcG9zaXRpb24gZnJvbSB0b3AgZWRnZSB0byBjZW50cmUgb2YgICAgICovCkBAIC0xNTY5LDcgKzE1OTYsNyBAQAogCiAgICAgRlRfRlJFRSggZmFjZS0+cG9zdHNjcmlwdF9uYW1lICk7CiAKLSAgICBmYWNlLT5zZm50ID0gMDsKKyAgICBmYWNlLT5zZm50ID0gTlVMTDsKICAgfQogCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3Nmb2Jqcy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvc2ZvYmpzLmgKaW5kZXggNjI0MWM5My4uNDU1Zjg2NyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvc2ZvYmpzLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvc2ZvYmpzLmgKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgU0ZOVCBvYmplY3QgbWFuYWdlbWVudCAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KQEAgLTMxLDIwICszMSwyNSBAQAogICBGVF9MT0NBTCggRlRfRXJyb3IgKQogICBzZm50X2luaXRfZmFjZSggRlRfU3RyZWFtICAgICAgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGZhY2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBmYWNlX2luc3RhbmNlX2luZGV4LAogICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgbnVtX3BhcmFtcywKICAgICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcyApOwogCiAgIEZUX0xPQ0FMKCBGVF9FcnJvciApCiAgIHNmbnRfbG9hZF9mYWNlKCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICBUVF9GYWNlICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgZmFjZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGZhY2VfaW5zdGFuY2VfaW5kZXgsCiAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBudW1fcGFyYW1zLAogICAgICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICk7CiAKICAgRlRfTE9DQUwoIHZvaWQgKQogICBzZm50X2RvbmVfZmFjZSggVFRfRmFjZSAgZmFjZSApOwogCisgIEZUX0xPQ0FMKCBGVF9FcnJvciApCisgIHR0X2ZhY2VfZ2V0X25hbWUoIFRUX0ZhY2UgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgbmFtZWlkLAorICAgICAgICAgICAgICAgICAgICBGVF9TdHJpbmcqKiAgbmFtZSApOworCiAKIEZUX0VORF9IRUFERVIKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRiZGYuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0YmRmLmMKaW5kZXggOTQwMWRhZS4uMDk4Yjc4MSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRiZGYuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dGJkZi5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFRydWVUeXBlIGFuZCBPcGVuVHlwZSBlbWJlZGRlZCBCREYgcHJvcGVydGllcyAoYm9keSkuICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LCAyMDA2LCAyMDEwLCAyMDEzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwNS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dGJkZi5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRiZGYuaAppbmRleCA0OGExMGQ2Li5mZTRiYTQ4IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dGJkZi5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0YmRmLmgKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGVtYmVkZGVkIEJERiBwcm9wZXJ0aWVzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDA1LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0Y21hcC5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRjbWFwLmMKaW5kZXggZWNlOWVmMS4uYzRkOWFiZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRjbWFwLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRjbWFwLmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgVHJ1ZVR5cGUgY2hhcmFjdGVyIG1hcHBpbmcgdGFibGUgKGNtYXApIHN1cHBvcnQgKGJvZHkpLiAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxMCwgMjAxMi0yMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAyLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KQEAgLTUxLDYgKzUxLDEzIEBACiAjZGVmaW5lIFRUX05FWFRfVUxPTkcgICBGVF9ORVhUX1VMT05HCiAKIAorICAvKiBUb28gbGFyZ2UgZ2x5cGggaW5kZXggcmV0dXJuIHZhbHVlcyBhcmUgY2F1Z2h0IGluIGBGVF9HZXRfQ2hhcl9JbmRleCcgKi8KKyAgLyogYW5kIGBGVF9HZXRfTmV4dF9DaGFyJyAodGhlIGxhdHRlciBjYWxscyB0aGUgaW50ZXJuYWwgYG5leHQnIGZ1bmN0aW9uICovCisgIC8qIGFnYWluIGluIHRoaXMgY2FzZSkuICBUbyBtYXJrIGNoYXJhY3RlciBjb2RlIHJldHVybiB2YWx1ZXMgYXMgaW52YWxpZCAqLworICAvKiBpdCBpcyBzdWZmaWNpZW50IHRvIHNldCB0aGUgY29ycmVzcG9uZGluZyBnbHlwaCBpbmRleCByZXR1cm4gdmFsdWUgdG8gKi8KKyAgLyogemVyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKwogICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKICAgdHRfY21hcF9pbml0KCBUVF9DTWFwICAgY21hcCwKICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgdGFibGUgKQpAQCAtMTk5LDcgKzIwNiw3IEBACiAgIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgRk9STUFUIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KICAgLyoqKioqIFRoaXMgaXMgdXNlZCBmb3IgY2VydGFpbiBDSksgZW5jb2RpbmdzIHRoYXQgZW5jb2RlIHRleHQgaW4gYSAgKioqKiovCi0gIC8qKioqKiBtaXhlZCA4LzE2IGJpdHMgZW5jb2RpbmcgYWxvbmcgdGhlIGZvbGxvd2luZyBsaW5lczogICAgICAgICAgICoqKioqLworICAvKioqKiogbWl4ZWQgOC8xNiBiaXRzIGVuY29kaW5nIGFsb25nIHRoZSBmb2xsb3dpbmcgbGluZXMuICAgICAgICAgICAqKioqKi8KICAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAgIC8qKioqKiAqIENlcnRhaW4gYnl0ZSB2YWx1ZXMgY29ycmVzcG9uZCB0byBhbiA4LWJpdCBjaGFyYWN0ZXIgY29kZSAgICoqKioqLwogICAvKioqKiogICAodHlwaWNhbGx5IGluIHRoZSByYW5nZSAwLi4xMjcgZm9yIEFTQ0lJIGNvbXBhdGliaWxpdHkpLiAgICAqKioqKi8KQEAgLTIwOSwxOSArMjE2LDE5IEBACiAgIC8qKioqKiAgIHNlY29uZCBieXRlIG9mIGEgMi1ieXRlIGNoYXJhY3RlcikuICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KICAgLyoqKioqIFRoZSBmb2xsb3dpbmcgY2hhcm1hcCBsb29rdXAgYW5kIGl0ZXJhdGlvbiBmdW5jdGlvbnMgYWxsICAgICAgKioqKiovCi0gIC8qKioqKiBhc3N1bWUgdGhhdCB0aGUgdmFsdWUgImNoYXJjb2RlIiBjb3JyZXNwb25kIHRvIGZvbGxvd2luZzogICAgICoqKioqLworICAvKioqKiogYXNzdW1lIHRoYXQgdGhlIHZhbHVlIGBjaGFyY29kZScgZnVsZmlsbHMgdGhlIGZvbGxvd2luZy4gICAgICAqKioqKi8KICAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgIC0gRm9yIG9uZSBieXRlIGNoYXJhY3RlcnMsICJjaGFyY29kZSIgaXMgc2ltcGx5IHRoZSAgICAgICAgICoqKioqLworICAvKioqKiogICAtIEZvciBvbmUgYnl0ZSBjaGFyYWN0ZXJzLCBgY2hhcmNvZGUnIGlzIHNpbXBseSB0aGUgICAgICAgICAqKioqKi8KICAgLyoqKioqICAgICBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAgIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAtIEZvciB0d28gYnl0ZSBjaGFyYWN0ZXJzLCAiY2hhcmNvZGUiIGlzIHRoZSAyLWJ5dGUgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICBjaGFyYWN0ZXIgY29kZSBpbiBiaWcgZW5kaWFuIGZvcm1hdC4gIE1vcmUgZXhhY3RseTogICAgICAgKioqKiovCisgIC8qKioqKiAgIC0gRm9yIHR3byBieXRlIGNoYXJhY3RlcnMsIGBjaGFyY29kZScgaXMgdGhlIDItYnl0ZSAgICAgICAgICoqKioqLworICAvKioqKiogICAgIGNoYXJhY3RlciBjb2RlIGluIGJpZyBlbmRpYW4gZm9ybWF0LiAgTW9yZSBwcmVjaXNlbHk6ICAgICAqKioqKi8KICAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAgIC8qKioqKiAgICAgICAoY2hhcmNvZGUgPj4gOCkgICAgaXMgdGhlIGZpcnN0IGJ5dGUgdmFsdWUgICAgICAgICAgICAgICoqKioqLwogICAvKioqKiogICAgICAgKGNoYXJjb2RlICYgMHhGRikgIGlzIHRoZSBzZWNvbmQgYnl0ZSB2YWx1ZSAgICAgICAgICAgICAqKioqKi8KICAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiBOb3RlIHRoYXQgbm90IGFsbCB2YWx1ZXMgb2YgImNoYXJjb2RlIiBhcmUgdmFsaWQgYWNjb3JkaW5nICAgICoqKioqLwotICAvKioqKiogdG8gdGhlc2UgcnVsZXMsIGFuZCB0aGUgZnVuY3Rpb24gbW9kZXJhdGVseSBjaGVjayB0aGUgICAgICAgICAqKioqKi8KKyAgLyoqKioqIE5vdGUgdGhhdCBub3QgYWxsIHZhbHVlcyBvZiBgY2hhcmNvZGUnIGFyZSB2YWxpZCBhY2NvcmRpbmcgICAgKioqKiovCisgIC8qKioqKiB0byB0aGVzZSBydWxlcywgYW5kIHRoZSBmdW5jdGlvbiBtb2RlcmF0ZWx5IGNoZWNrcyB0aGUgICAgICAgICoqKioqLwogICAvKioqKiogYXJndW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KICAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjQ5LDcgKzI1Niw3IEBACiAgIC8qIHRhYmxlLCBpLmUuLCBpdCBpcyB0aGUgY29ycmVzcG9uZGluZyBzdWItaGVhZGVyIGluZGV4IG11bHRpcGxpZWQgICAgICAqLwogICAvKiBieSA4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEVhY2ggc3ViLWhlYWRlciBoYXMgdGhlIGZvbGxvd2luZyBmb3JtYXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBFYWNoIHN1Yi1oZWFkZXIgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgTkFNRSAgICAgICAgT0ZGU0VUICAgICAgVFlQRSAgICAgICAgICAgIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTI2NCwxMSArMjcxLDExIEBACiAgIC8qIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogSWYgYSBjaGFyYWN0ZXIgY29kZSBpcyBjb250YWluZWQgd2l0aGluIGEgZ2l2ZW4gc3ViLWhlYWRlciwgdGhlbiAgICAgICovCi0gIC8qIG1hcHBpbmcgaXQgdG8gYSBnbHlwaCBpbmRleCBpcyBkb25lIGFzIGZvbGxvd3M6ICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBtYXBwaW5nIGl0IHRvIGEgZ2x5cGggaW5kZXggaXMgZG9uZSBhcyBmb2xsb3dzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICogVGhlIHZhbHVlIG9mIGBvZmZzZXQnIGlzIHJlYWQuICBUaGlzIGlzIGEgX2J5dGVfIGRpc3RhbmNlIGZyb20gdGhlICAqLwogICAvKiAgIGxvY2F0aW9uIG9mIHRoZSBgb2Zmc2V0JyBmaWVsZCBpdHNlbGYgaW50byBhIHNsaWNlIG9mIHRoZSAgICAgICAgICAgKi8KLSAgLyogICBgZ2x5cGhfaWRzJyB0YWJsZS4gIExldCdzIGNhbGwgaXQgYHNsaWNlJyAoaXQgaXMgYSBVU0hPUlRbXSB0b28pLiAgICovCisgIC8qICAgYGdseXBoX2lkcycgdGFibGUuICBMZXQncyBjYWxsIGl0IGBzbGljZScgKGl0IGlzIGEgVVNIT1JUW10sIHRvbykuICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogKiBUaGUgdmFsdWUgYHNsaWNlW2NoYXIubG8gLSBmaXJzdF0nIGlzIHJlYWQuICBJZiBpdCBpcyAwLCB0aGVyZSBpcyAgICovCiAgIC8qICAgbm8gZ2x5cGggZm9yIHRoZSBjaGFyY29kZS4gIE90aGVyd2lzZSwgdGhlIHZhbHVlIG9mIGBkZWx0YScgaXMgICAgICAqLwpAQCAtMzI2LDcgKzMzMyw3IEBACiAgICAgRlRfQVNTRVJUKCBwID09IHRhYmxlICsgNTE4ICk7CiAKICAgICBzdWJzICAgICAgPSBwOwotICAgIGdseXBoX2lkcyA9IHN1YnMgKyAobWF4X3N1YnMgKyAxKSAqIDg7CisgICAgZ2x5cGhfaWRzID0gc3VicyArICggbWF4X3N1YnMgKyAxICkgKiA4OwogICAgIGlmICggZ2x5cGhfaWRzID4gdmFsaWQtPmxpbWl0ICkKICAgICAgIEZUX0lOVkFMSURfVE9PX1NIT1JUOwogCkBAIC0zNjAsNyArMzY3LDcgQEAKIAogCiAgICAgICAgIGlkcyA9IHAgLSAyICsgb2Zmc2V0OwotICAgICAgICBpZiAoIGlkcyA8IGdseXBoX2lkcyB8fCBpZHMgKyBjb2RlX2NvdW50KjIgPiB0YWJsZSArIGxlbmd0aCApCisgICAgICAgIGlmICggaWRzIDwgZ2x5cGhfaWRzIHx8IGlkcyArIGNvZGVfY291bnQgKiAyID4gdGFibGUgKyBsZW5ndGggKQogICAgICAgICAgIEZUX0lOVkFMSURfT0ZGU0VUOwogCiAgICAgICAgIC8qIGNoZWNrIGdseXBoIElEcyAqLwpAQCAtMzc1LDcgKzM4Miw3IEBACiAgICAgICAgICAgICBpZHggPSBUVF9ORVhUX1VTSE9SVCggcCApOwogICAgICAgICAgICAgaWYgKCBpZHggIT0gMCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlkeCA9ICggaWR4ICsgZGVsdGEgKSAmIDB4RkZGRlU7CisgICAgICAgICAgICAgIGlkeCA9IChGVF9VSW50KSggKEZUX0ludClpZHggKyBkZWx0YSApICYgMHhGRkZGVTsKICAgICAgICAgICAgICAgaWYgKCBpZHggPj0gVFRfVkFMSURfR0xZUEhfQ09VTlQoIHZhbGlkICkgKQogICAgICAgICAgICAgICAgIEZUX0lOVkFMSURfR0xZUEhfSUQ7CiAgICAgICAgICAgICB9CkBAIC00MzYsNiArNDQzLDcgQEAKICAgICAgIH0KICAgICAgIHJlc3VsdCA9IHN1YjsKICAgICB9CisKICAgRXhpdDoKICAgICByZXR1cm4gcmVzdWx0OwogICB9CkBAIC00NzIsOSArNDgwLDEwIEBACiAgICAgICAgIGlkeCA9IFRUX1BFRUtfVVNIT1JUKCBwICk7CiAKICAgICAgICAgaWYgKCBpZHggIT0gMCApCi0gICAgICAgICAgcmVzdWx0ID0gKEZUX1VJbnQpKCBpZHggKyBkZWx0YSApICYgMHhGRkZGVTsKKyAgICAgICAgICByZXN1bHQgPSAoRlRfVUludCkoIChGVF9JbnQpaWR4ICsgZGVsdGEgKSAmIDB4RkZGRlU7CiAgICAgICB9CiAgICAgfQorCiAgICAgcmV0dXJuIHJlc3VsdDsKICAgfQogCkBAIC01MjQsNyArNTMzLDcgQEAKIAogICAgICAgICAgIGlmICggaWR4ICE9IDAgKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIGdpbmRleCA9ICggaWR4ICsgZGVsdGEgKSAmIDB4RkZGRlU7CisgICAgICAgICAgICBnaW5kZXggPSAoRlRfVUludCkoIChGVF9JbnQpaWR4ICsgZGVsdGEgKSAmIDB4RkZGRlU7CiAgICAgICAgICAgICBpZiAoIGdpbmRleCAhPSAwICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgcmVzdWx0ID0gY2hhcmNvZGU7CkBAIC03ODYsNyArNzk1LDcgQEAKIAogICAgICAgICAgICAgaWYgKCBnaW5kZXggIT0gMCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGdpbmRleCA9IChGVF9VSW50KSggKCBnaW5kZXggKyBkZWx0YSApICYgMHhGRkZGVSApOworICAgICAgICAgICAgICBnaW5kZXggPSAoRlRfVUludCkoIChGVF9JbnQpZ2luZGV4ICsgZGVsdGEgKSAmIDB4RkZGRlU7CiAgICAgICAgICAgICAgIGlmICggZ2luZGV4ICE9IDAgKQogICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgY21hcC0+Y3VyX2NoYXJjb2RlID0gY2hhcmNvZGU7CkBAIC04MDAsNyArODA5LDcgQEAKICAgICAgICAgewogICAgICAgICAgIGRvCiAgICAgICAgICAgewotICAgICAgICAgICAgRlRfVUludCAgZ2luZGV4ID0gKEZUX1VJbnQpKCAoIGNoYXJjb2RlICsgZGVsdGEgKSAmIDB4RkZGRlUgKTsKKyAgICAgICAgICAgIEZUX1VJbnQgIGdpbmRleCA9IChGVF9VSW50KSggKEZUX0ludCljaGFyY29kZSArIGRlbHRhICkgJiAweEZGRkZVOwogCiAKICAgICAgICAgICAgIGlmICggZ2luZGV4ICE9IDAgKQpAQCAtOTczLDcgKzk4Miw3IEBACiAgICAgICAgICAgLyogc2VnbWVudCBpZiBpdCBjb250YWlucyBvbmx5IGEgc2luZ2xlIGNoYXJhY3Rlci4gICAgICovCiAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgLyogV2UgdGh1cyBvbWl0IHRoZSB0ZXN0IGhlcmUsIGRlbGF5aW5nIGl0IHRvIHRoZSAgICAgICovCi0gICAgICAgICAgLyogcm91dGluZXMgd2hpY2ggYWN0dWFsbHkgYWNjZXNzIHRoZSBjbWFwLiAgICAgICAgICAgICovCisgICAgICAgICAgLyogcm91dGluZXMgdGhhdCBhY3R1YWxseSBhY2Nlc3MgdGhlIGNtYXAuICAgICAgICAgICAgICovCiAgICAgICAgICAgZWxzZSBpZiAoIG4gIT0gbnVtX3NlZ3MgLSAxICAgICAgICAgICAgICAgICAgICAgICB8fAogICAgICAgICAgICAgICAgICAgICAhKCBzdGFydCA9PSAweEZGRkZVICYmIGVuZCA9PSAweEZGRkZVICkgKQogICAgICAgICAgIHsKQEAgLTk5Myw3ICsxMDAyLDcgQEAKICAgICAgICAgICAgICAgaWR4ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKICAgICAgICAgICAgICAgaWYgKCBpZHggIT0gMCApCiAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZHggPSAoRlRfVUludCkoIGlkeCArIGRlbHRhICkgJiAweEZGRkZVOworICAgICAgICAgICAgICAgIGlkeCA9IChGVF9VSW50KSggKEZUX0ludClpZHggKyBkZWx0YSApICYgMHhGRkZGVTsKIAogICAgICAgICAgICAgICAgIGlmICggaWR4ID49IFRUX1ZBTElEX0dMWVBIX0NPVU5UKCB2YWxpZCApICkKICAgICAgICAgICAgICAgICAgIEZUX0lOVkFMSURfR0xZUEhfSUQ7CkBAIC0xMDI2LDEyICsxMDM1LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyKiAgcGNoYXJjb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgIG5leHQgKQogICB7CisgICAgVFRfRmFjZSAgIGZhY2UgID0gKFRUX0ZhY2UpY21hcC0+Y21hcC5jaGFybWFwLmZhY2U7CisgICAgRlRfQnl0ZSogIGxpbWl0ID0gZmFjZS0+Y21hcF90YWJsZSArIGZhY2UtPmNtYXBfc2l6ZTsKKworCiAgICAgRlRfVUludCAgICBudW1fc2VnczIsIHN0YXJ0LCBlbmQsIG9mZnNldDsKICAgICBGVF9JbnQgICAgIGRlbHRhOwogICAgIEZUX1VJbnQgICAgaSwgbnVtX3NlZ3M7CiAgICAgRlRfVUludDMyICBjaGFyY29kZSA9ICpwY2hhcmNvZGU7CiAgICAgRlRfVUludCAgICBnaW5kZXggICA9IDA7CiAgICAgRlRfQnl0ZSogICBwOworICAgIEZUX0J5dGUqICAgcTsKIAogCiAgICAgcCA9IGNtYXAtPmRhdGEgKyA2OwpAQCAtMTA0NSw2NSArMTA1OSwxMDYgQEAKICAgICBpZiAoIG5leHQgKQogICAgICAgY2hhcmNvZGUrKzsKIAorICAgIGlmICggY2hhcmNvZGUgPiAweEZGRkZVICkKKyAgICAgIHJldHVybiAwOworCiAgICAgLyogbGluZWFyIHNlYXJjaCAqLwotICAgIGZvciAoIDsgY2hhcmNvZGUgPD0gMHhGRkZGVTsgY2hhcmNvZGUrKyApCisgICAgcCA9IGNtYXAtPmRhdGEgKyAxNDsgICAgICAgICAgICAgICAvKiBlbmRzIHRhYmxlICAgKi8KKyAgICBxID0gY21hcC0+ZGF0YSArIDE2ICsgbnVtX3NlZ3MyOyAgIC8qIHN0YXJ0cyB0YWJsZSAqLworCisgICAgZm9yICggaSA9IDA7IGkgPCBudW1fc2VnczsgaSsrICkKICAgICB7Ci0gICAgICBGVF9CeXRlKiAgcTsKKyAgICAgIGVuZCAgID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKKyAgICAgIHN0YXJ0ID0gVFRfTkVYVF9VU0hPUlQoIHEgKTsKIAotCi0gICAgICBwID0gY21hcC0+ZGF0YSArIDE0OyAgICAgICAgICAgICAgIC8qIGVuZHMgdGFibGUgICAqLwotICAgICAgcSA9IGNtYXAtPmRhdGEgKyAxNiArIG51bV9zZWdzMjsgICAvKiBzdGFydHMgdGFibGUgKi8KLQotICAgICAgZm9yICggaSA9IDA7IGkgPCBudW1fc2VnczsgaSsrICkKKyAgICAgIGlmICggY2hhcmNvZGUgPCBzdGFydCApCiAgICAgICB7Ci0gICAgICAgIGVuZCAgID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgICAgc3RhcnQgPSBUVF9ORVhUX1VTSE9SVCggcSApOwotCi0gICAgICAgIGlmICggY2hhcmNvZGUgPj0gc3RhcnQgJiYgY2hhcmNvZGUgPD0gZW5kICkKLSAgICAgICAgewotICAgICAgICAgIHAgICAgICAgPSBxIC0gMiArIG51bV9zZWdzMjsKLSAgICAgICAgICBkZWx0YSAgID0gVFRfUEVFS19TSE9SVCggcCApOwotICAgICAgICAgIHAgICAgICArPSBudW1fc2VnczI7Ci0gICAgICAgICAgb2Zmc2V0ICA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0KLSAgICAgICAgICAvKiBzb21lIGZvbnRzIGhhdmUgYW4gaW5jb3JyZWN0IGxhc3Qgc2VnbWVudDsgKi8KLSAgICAgICAgICAvKiB3ZSBoYXZlIHRvIGNhdGNoIGl0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAoIGkgPj0gbnVtX3NlZ3MgLSAxICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgIHN0YXJ0ID09IDB4RkZGRlUgJiYgZW5kID09IDB4RkZGRlUgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFRUX0ZhY2UgICBmYWNlICA9IChUVF9GYWNlKWNtYXAtPmNtYXAuY2hhcm1hcC5mYWNlOwotICAgICAgICAgICAgRlRfQnl0ZSogIGxpbWl0ID0gZmFjZS0+Y21hcF90YWJsZSArIGZhY2UtPmNtYXBfc2l6ZTsKLQotCi0gICAgICAgICAgICBpZiAoIG9mZnNldCAmJiBwICsgb2Zmc2V0ICsgMiA+IGxpbWl0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZGVsdGEgID0gMTsKLSAgICAgICAgICAgICAgb2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoIG9mZnNldCA9PSAweEZGRkZVICkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgaWYgKCBvZmZzZXQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHAgKz0gb2Zmc2V0ICsgKCBjaGFyY29kZSAtIHN0YXJ0ICkgKiAyOwotICAgICAgICAgICAgZ2luZGV4ID0gVFRfUEVFS19VU0hPUlQoIHAgKTsKLSAgICAgICAgICAgIGlmICggZ2luZGV4ICE9IDAgKQotICAgICAgICAgICAgICBnaW5kZXggPSAoRlRfVUludCkoIGdpbmRleCArIGRlbHRhICkgJiAweEZGRkZVOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBnaW5kZXggPSAoRlRfVUludCkoIGNoYXJjb2RlICsgZGVsdGEgKSAmIDB4RkZGRlU7Ci0KKyAgICAgICAgaWYgKCBuZXh0ICkKKyAgICAgICAgICBjaGFyY29kZSA9IHN0YXJ0OworICAgICAgICBlbHNlCiAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KICAgICAgIH0KIAotICAgICAgaWYgKCAhbmV4dCB8fCBnaW5kZXggKQorICAgIEFnYWluOgorICAgICAgaWYgKCBjaGFyY29kZSA8PSBlbmQgKQorICAgICAgeworICAgICAgICBGVF9CeXRlKiAgcjsKKworCisgICAgICAgIHIgICAgICAgPSBxIC0gMiArIG51bV9zZWdzMjsKKyAgICAgICAgZGVsdGEgICA9IFRUX1BFRUtfU0hPUlQoIHIgKTsKKyAgICAgICAgciAgICAgICs9IG51bV9zZWdzMjsKKyAgICAgICAgb2Zmc2V0ICA9IFRUX1BFRUtfVVNIT1JUKCByICk7CisKKyAgICAgICAgLyogc29tZSBmb250cyBoYXZlIGFuIGluY29ycmVjdCBsYXN0IHNlZ21lbnQ7ICovCisgICAgICAgIC8qIHdlIGhhdmUgdG8gY2F0Y2ggaXQgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBpZiAoIGkgPj0gbnVtX3NlZ3MgLSAxICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgICBzdGFydCA9PSAweEZGRkZVICYmIGVuZCA9PSAweEZGRkZVICkKKyAgICAgICAgeworICAgICAgICAgIGlmICggb2Zmc2V0ICYmIHIgKyBvZmZzZXQgKyAyID4gbGltaXQgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGRlbHRhICA9IDE7CisgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggb2Zmc2V0ID09IDB4RkZGRlUgKQorICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmICggb2Zmc2V0ICkKKyAgICAgICAgeworICAgICAgICAgIHIgKz0gb2Zmc2V0ICsgKCBjaGFyY29kZSAtIHN0YXJ0ICkgKiAyOworCisgICAgICAgICAgLyogaWYgciA+IGxpbWl0LCB0aGUgd2hvbGUgc2VnbWVudCBpcyBpbnZhbGlkICovCisgICAgICAgICAgaWYgKCBuZXh0ICYmIHIgPiBsaW1pdCApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIGdpbmRleCA9IFRUX1BFRUtfVVNIT1JUKCByICk7CisgICAgICAgICAgaWYgKCBnaW5kZXggKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGdpbmRleCA9IChGVF9VSW50KSggKEZUX0ludClnaW5kZXggKyBkZWx0YSApICYgMHhGRkZGVTsKKyAgICAgICAgICAgIGlmICggZ2luZGV4ID49IChGVF9VSW50KWZhY2UtPnJvb3QubnVtX2dseXBocyApCisgICAgICAgICAgICAgIGdpbmRleCA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGdpbmRleCA9IChGVF9VSW50KSggKEZUX0ludCljaGFyY29kZSArIGRlbHRhICkgJiAweEZGRkZVOworCisgICAgICAgICAgaWYgKCBuZXh0ICYmIGdpbmRleCA+PSAoRlRfVUludClmYWNlLT5yb290Lm51bV9nbHlwaHMgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHdlIGhhdmUgYW4gaW52YWxpZCBnbHlwaCBpbmRleDsgaWYgdGhlcmUgaXMgYW4gb3ZlcmZsb3csICovCisgICAgICAgICAgICAvKiB3ZSBjYW4gYWRqdXN0IGBjaGFyY29kZScsIG90aGVyd2lzZSB0aGUgd2hvbGUgc2VnbWVudCBpcyAqLworICAgICAgICAgICAgLyogaW52YWxpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGdpbmRleCA9IDA7CisKKyAgICAgICAgICAgIGlmICggKEZUX0ludCljaGFyY29kZSArIGRlbHRhIDwgMCAmJgorICAgICAgICAgICAgICAgICAoRlRfSW50KWVuZCArIGRlbHRhID49IDAgICAgICkKKyAgICAgICAgICAgICAgY2hhcmNvZGUgPSAoRlRfVUludCkoIC1kZWx0YSApOworCisgICAgICAgICAgICBlbHNlIGlmICggKEZUX0ludCljaGFyY29kZSArIGRlbHRhIDwgMHgxMDAwMEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAoRlRfSW50KWVuZCArIGRlbHRhID49IDB4MTAwMDBMICAgICApCisgICAgICAgICAgICAgIGNoYXJjb2RlID0gKEZUX1VJbnQpKCAweDEwMDAwTCAtIGRlbHRhICk7CisKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCBuZXh0ICYmICFnaW5kZXggKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCBjaGFyY29kZSA+PSAweEZGRkZVICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2hhcmNvZGUrKzsKKyAgICAgICAgICBnb3RvIEFnYWluOworICAgICAgICB9CisKICAgICAgICAgYnJlYWs7CisgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCBuZXh0ICYmIGdpbmRleCApCisgICAgaWYgKCBuZXh0ICkKICAgICAgICpwY2hhcmNvZGUgPSBjaGFyY29kZTsKIAogICAgIHJldHVybiBnaW5kZXg7CkBAIC0xMjk0LDEwICsxMzQ5LDEwIEBACiAgICAgICAgICAgcCArPSBvZmZzZXQgKyAoIGNoYXJjb2RlIC0gc3RhcnQgKSAqIDI7CiAgICAgICAgICAgZ2luZGV4ID0gVFRfUEVFS19VU0hPUlQoIHAgKTsKICAgICAgICAgICBpZiAoIGdpbmRleCAhPSAwICkKLSAgICAgICAgICAgIGdpbmRleCA9IChGVF9VSW50KSggZ2luZGV4ICsgZGVsdGEgKSAmIDB4RkZGRlU7CisgICAgICAgICAgICBnaW5kZXggPSAoRlRfVUludCkoIChGVF9JbnQpZ2luZGV4ICsgZGVsdGEgKSAmIDB4RkZGRlU7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQotICAgICAgICAgIGdpbmRleCA9IChGVF9VSW50KSggY2hhcmNvZGUgKyBkZWx0YSApICYgMHhGRkZGVTsKKyAgICAgICAgICBnaW5kZXggPSAoRlRfVUludCkoIChGVF9JbnQpY2hhcmNvZGUgKyBkZWx0YSApICYgMHhGRkZGVTsKIAogICAgICAgICBicmVhazsKICAgICAgIH0KQEAgLTEzMTAsNyArMTM2NSw2IEBACiAKICAgICAgIC8qIGlmIGBjaGFyY29kZScgaXMgbm90IGluIGFueSBzZWdtZW50LCB0aGVuIGBtaWQnIGlzICovCiAgICAgICAvKiB0aGUgc2VnbWVudCBuZWFyZXN0IHRvIGBjaGFyY29kZScgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogICAgICAgaWYgKCBjaGFyY29kZSA+IGVuZCApCiAgICAgICB7CkBAIC0xNDQzLDcgKzE0OTcsNyBAQAogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICBOQU1FICAgICAgICBPRkZTRVQgICAgICAgICAgVFlQRSAgICAgICAgICAgICBERVNDUklQVElPTiAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGZvcm1hdCAgICAgICAwICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgIG11c3QgYmUgNCAgICAgICAgICAgICAgKi8KKyAgLyogICBmb3JtYXQgICAgICAgMCAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICBtdXN0IGJlIDYgICAgICAgICAgICAgICovCiAgIC8qICAgbGVuZ3RoICAgICAgIDIgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgdGFibGUgbGVuZ3RoIGluIGJ5dGVzICAqLwogICAvKiAgIGxhbmd1YWdlICAgICA0ICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgIE1hYyBsYW5ndWFnZSBjb2RlICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNTExLDYgKzE1NjUsNyBAQAogICAgICAgcCArPSAyICogaWR4OwogICAgICAgcmVzdWx0ID0gVFRfUEVFS19VU0hPUlQoIHAgKTsKICAgICB9CisKICAgICByZXR1cm4gcmVzdWx0OwogICB9CiAKQEAgLTE1MzEsNyArMTU4Niw3IEBACiAKIAogICAgIGlmICggY2hhcl9jb2RlID49IDB4MTAwMDBVTCApCi0gICAgICBnb3RvIEV4aXQ7CisgICAgICByZXR1cm4gMDsKIAogICAgIGlmICggY2hhcl9jb2RlIDwgc3RhcnQgKQogICAgICAgY2hhcl9jb2RlID0gc3RhcnQ7CkBAIC0xNTQ3LDEwICsxNjAyLDEzIEBACiAgICAgICAgIHJlc3VsdCA9IGNoYXJfY29kZTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CisKKyAgICAgIGlmICggY2hhcl9jb2RlID49IDB4RkZGRlUgKQorICAgICAgICByZXR1cm4gMDsKKwogICAgICAgY2hhcl9jb2RlKys7CiAgICAgfQogCi0gIEV4aXQ6CiAgICAgKnBjaGFyX2NvZGUgPSByZXN1bHQ7CiAgICAgcmV0dXJuIGdpbmRleDsKICAgfQpAQCAtMTYwMiw3ICsxNjYwLDcgQEAKICAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAgIC8qKioqKiBUaGUgcHVycG9zZSBvZiB0aGlzIGZvcm1hdCBpcyB0byBlYXNpbHkgbWFwIFVURi0xNiB0ZXh0IHRvICAgICoqKioqLwogICAvKioqKiogZ2x5cGggaW5kaWNlcy4gIEJhc2ljYWxseSwgdGhlIGBjaGFyX2NvZGUnIG11c3QgYmUgaW4gb25lIG9mICAqKioqKi8KLSAgLyoqKioqIHRoZSBmb2xsb3dpbmcgZm9ybWF0czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCisgIC8qKioqKiB0aGUgZm9sbG93aW5nIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KICAgLyoqKioqICAgLSBBIDE2LWJpdCB2YWx1ZSB0aGF0IGlzbid0IHBhcnQgb2YgdGhlIFVuaWNvZGUgU3Vycm9nYXRlcyAgKioqKiovCiAgIC8qKioqKiAgICAgQXJlYSAoaS5lLiBVK0Q4MDAtVStERkZGKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwpAQCAtMTYxNSw3ICsxNjczLDcgQEAKICAgLyoqKioqIFRoZSBgaXMzMicgdGFibGUgZW1iZWRkZWQgaW4gdGhlIGNoYXJtYXAgaW5kaWNhdGVzIHdoZXRoZXIgYSAgKioqKiovCiAgIC8qKioqKiBnaXZlbiAxNi1iaXQgdmFsdWUgaXMgaW4gdGhlIHN1cnJvZ2F0ZXMgYXJlYSBvciBub3QuICAgICAgICAgICoqKioqLwogICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqIFNvLCBmb3IgYW55IGdpdmVuIGBjaGFyX2NvZGUnLCB3ZSBjYW4gYXNzZXJ0IHRoZSBmb2xsb3dpbmc6ICAgKioqKiovCisgIC8qKioqKiBTbywgZm9yIGFueSBnaXZlbiBgY2hhcl9jb2RlJywgd2UgY2FuIGFzc2VydCB0aGUgZm9sbG93aW5nLiAgICoqKioqLwogICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KICAgLyoqKioqICAgSWYgYGNoYXJfaGkgPT0gMCcgdGhlbiB3ZSBtdXN0IGhhdmUgYGlzMzJbY2hhcl9sb10gPT0gMCcuICAgKioqKiovCiAgIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwpAQCAtMTc3MCw3ICsxODI4LDEwIEBACiAKICAgICAgIGlmICggY2hhcl9jb2RlIDw9IGVuZCApCiAgICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IChGVF9VSW50KSggc3RhcnRfaWQgKyBjaGFyX2NvZGUgLSBzdGFydCApOworICAgICAgICBpZiAoIHN0YXJ0X2lkID4gMHhGRkZGRkZGRlVMIC0gKCBjaGFyX2NvZGUgLSBzdGFydCApICkKKyAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICByZXN1bHQgPSAoRlRfVUludCkoIHN0YXJ0X2lkICsgKCBjaGFyX2NvZGUgLSBzdGFydCApICk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KQEAgLTE3ODIsOCArMTg0Myw5IEBACiAgIHR0X2NtYXA4X2NoYXJfbmV4dCggVFRfQ01hcCAgICAgY21hcCwKICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICpwY2hhcl9jb2RlICkKICAgeworICAgIEZUX0ZhY2UgICAgZmFjZSAgICAgICA9IGNtYXAtPmNtYXAuY2hhcm1hcC5mYWNlOwogICAgIEZUX1VJbnQzMiAgcmVzdWx0ICAgICA9IDA7Ci0gICAgRlRfVUludDMyICBjaGFyX2NvZGUgID0gKnBjaGFyX2NvZGUgKyAxOworICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlOwogICAgIEZUX1VJbnQgICAgZ2luZGV4ICAgICA9IDA7CiAgICAgRlRfQnl0ZSogICB0YWJsZSAgICAgID0gY21hcC0+ZGF0YTsKICAgICBGVF9CeXRlKiAgIHAgICAgICAgICAgPSB0YWJsZSArIDgyMDQ7CkBAIC0xNzkxLDYgKzE4NTMsMTEgQEAKICAgICBGVF9VSW50MzIgIHN0YXJ0LCBlbmQsIHN0YXJ0X2lkOwogCiAKKyAgICBpZiAoICpwY2hhcl9jb2RlID49IDB4RkZGRkZGRkZVTCApCisgICAgICByZXR1cm4gMDsKKworICAgIGNoYXJfY29kZSA9ICpwY2hhcl9jb2RlICsgMTsKKwogICAgIHAgPSB0YWJsZSArIDgyMDg7CiAKICAgICBmb3IgKCA7IG51bV9ncm91cHMgPiAwOyBudW1fZ3JvdXBzLS0gKQpAQCAtMTgwMiwxOCArMTg2OSwzNSBAQAogICAgICAgaWYgKCBjaGFyX2NvZGUgPCBzdGFydCApCiAgICAgICAgIGNoYXJfY29kZSA9IHN0YXJ0OwogCisgICAgQWdhaW46CiAgICAgICBpZiAoIGNoYXJfY29kZSA8PSBlbmQgKQogICAgICAgewotICAgICAgICBnaW5kZXggPSAoRlRfVUludCkoIGNoYXJfY29kZSAtIHN0YXJ0ICsgc3RhcnRfaWQgKTsKLSAgICAgICAgaWYgKCBnaW5kZXggIT0gMCApCisgICAgICAgIC8qIGlnbm9yZSBpbnZhbGlkIGdyb3VwICovCisgICAgICAgIGlmICggc3RhcnRfaWQgPiAweEZGRkZGRkZGVUwgLSAoIGNoYXJfY29kZSAtIHN0YXJ0ICkgKQorICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGdpbmRleCA9IChGVF9VSW50KSggc3RhcnRfaWQgKyAoIGNoYXJfY29kZSAtIHN0YXJ0ICkgKTsKKworICAgICAgICAvKiBkb2VzIGZpcnN0IGVsZW1lbnQgb2YgZ3JvdXAgcG9pbnQgdG8gYC5ub3RkZWYnIGdseXBoPyAqLworICAgICAgICBpZiAoIGdpbmRleCA9PSAwICkKICAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IGNoYXJfY29kZTsKLSAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgICAgaWYgKCBjaGFyX2NvZGUgPj0gMHhGRkZGRkZGRlVMICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2hhcl9jb2RlKys7CisgICAgICAgICAgZ290byBBZ2FpbjsKICAgICAgICAgfQorCisgICAgICAgIC8qIGlmIGBnaW5kZXgnIGlzIGludmFsaWQsIHRoZSByZW1haW5pbmcgdmFsdWVzICovCisgICAgICAgIC8qIGluIHRoaXMgZ3JvdXAgYXJlIGludmFsaWQsIHRvbyAgICAgICAgICAgICAgICovCisgICAgICAgIGlmICggZ2luZGV4ID49IChGVF9VSW50KWZhY2UtPm51bV9nbHlwaHMgKQorICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHJlc3VsdCA9IGNoYXJfY29kZTsKKyAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogCi0gIEV4aXQ6CiAgICAgKnBjaGFyX2NvZGUgPSByZXN1bHQ7CiAgICAgcmV0dXJuIGdpbmRleDsKICAgfQpAQCAtMTkzMCwxNCArMjAxNCwyMCBAQAogICAgIEZUX0J5dGUqICAgcCAgICAgID0gdGFibGUgKyAxMjsKICAgICBGVF9VSW50MzIgIHN0YXJ0ICA9IFRUX05FWFRfVUxPTkcoIHAgKTsKICAgICBGVF9VSW50MzIgIGNvdW50ICA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICBGVF9VSW50MzIgIGlkeCAgICA9IChGVF9VTG9uZykoIGNoYXJfY29kZSAtIHN0YXJ0ICk7CisgICAgRlRfVUludDMyICBpZHg7CiAKIAorICAgIGlmICggY2hhcl9jb2RlIDwgc3RhcnQgKQorICAgICAgcmV0dXJuIDA7CisKKyAgICBpZHggPSBjaGFyX2NvZGUgLSBzdGFydDsKKwogICAgIGlmICggaWR4IDwgY291bnQgKQogICAgIHsKICAgICAgIHAgICAgICs9IDIgKiBpZHg7CiAgICAgICByZXN1bHQgPSBUVF9QRUVLX1VTSE9SVCggcCApOwogICAgIH0KKwogICAgIHJldHVybiByZXN1bHQ7CiAgIH0KIApAQCAtMTk0Nyw3ICsyMDM3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAqcGNoYXJfY29kZSApCiAgIHsKICAgICBGVF9CeXRlKiAgIHRhYmxlICAgICA9IGNtYXAtPmRhdGE7Ci0gICAgRlRfVUludDMyICBjaGFyX2NvZGUgPSAqcGNoYXJfY29kZSArIDE7CisgICAgRlRfVUludDMyICBjaGFyX2NvZGU7CiAgICAgRlRfVUludCAgICBnaW5kZXggICAgPSAwOwogICAgIEZUX0J5dGUqICAgcCAgICAgICAgID0gdGFibGUgKyAxMjsKICAgICBGVF9VSW50MzIgIHN0YXJ0ICAgICA9IFRUX05FWFRfVUxPTkcoIHAgKTsKQEAgLTE5NTUsMTAgKzIwNDUsMTUgQEAKICAgICBGVF9VSW50MzIgIGlkeDsKIAogCisgICAgaWYgKCAqcGNoYXJfY29kZSA+PSAweEZGRkZGRkZGVUwgKQorICAgICAgcmV0dXJuIDA7CisKKyAgICBjaGFyX2NvZGUgPSAqcGNoYXJfY29kZSArIDE7CisKICAgICBpZiAoIGNoYXJfY29kZSA8IHN0YXJ0ICkKICAgICAgIGNoYXJfY29kZSA9IHN0YXJ0OwogCi0gICAgaWR4ID0gKEZUX1VJbnQzMikoIGNoYXJfY29kZSAtIHN0YXJ0ICk7CisgICAgaWR4ID0gY2hhcl9jb2RlIC0gc3RhcnQ7CiAgICAgcCAgKz0gMiAqIGlkeDsKIAogICAgIGZvciAoIDsgaWR4IDwgY291bnQ7IGlkeCsrICkKQEAgLTE5NjYsNiArMjA2MSwxMCBAQAogICAgICAgZ2luZGV4ID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKICAgICAgIGlmICggZ2luZGV4ICE9IDAgKQogICAgICAgICBicmVhazsKKworICAgICAgaWYgKCBjaGFyX2NvZGUgPj0gMHhGRkZGRkZGRlVMICkKKyAgICAgICAgcmV0dXJuIDA7CisKICAgICAgIGNoYXJfY29kZSsrOwogICAgIH0KIApAQCAtMjEzNCw2ICsyMjMzLDcgQEAKICAgc3RhdGljIHZvaWQKICAgdHRfY21hcDEyX25leHQoIFRUX0NNYXAxMiAgY21hcCApCiAgIHsKKyAgICBGVF9GYWNlICAgZmFjZSA9IGNtYXAtPmNtYXAuY21hcC5jaGFybWFwLmZhY2U7CiAgICAgRlRfQnl0ZSogIHA7CiAgICAgRlRfVUxvbmcgIHN0YXJ0LCBlbmQsIHN0YXJ0X2lkLCBjaGFyX2NvZGU7CiAgICAgRlRfVUxvbmcgIG47CkBAIC0yMTU1LDE4ICsyMjU1LDM1IEBACiAgICAgICBpZiAoIGNoYXJfY29kZSA8IHN0YXJ0ICkKICAgICAgICAgY2hhcl9jb2RlID0gc3RhcnQ7CiAKLSAgICAgIGZvciAoIDsgY2hhcl9jb2RlIDw9IGVuZDsgY2hhcl9jb2RlKysgKQorICAgIEFnYWluOgorICAgICAgaWYgKCBjaGFyX2NvZGUgPD0gZW5kICkKICAgICAgIHsKLSAgICAgICAgZ2luZGV4ID0gKEZUX1VJbnQpKCBzdGFydF9pZCArIGNoYXJfY29kZSAtIHN0YXJ0ICk7CisgICAgICAgIC8qIGlnbm9yZSBpbnZhbGlkIGdyb3VwICovCisgICAgICAgIGlmICggc3RhcnRfaWQgPiAweEZGRkZGRkZGVUwgLSAoIGNoYXJfY29kZSAtIHN0YXJ0ICkgKQorICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgIGlmICggZ2luZGV4ICkKKyAgICAgICAgZ2luZGV4ID0gKEZUX1VJbnQpKCBzdGFydF9pZCArICggY2hhcl9jb2RlIC0gc3RhcnQgKSApOworCisgICAgICAgIC8qIGRvZXMgZmlyc3QgZWxlbWVudCBvZiBncm91cCBwb2ludCB0byBgLm5vdGRlZicgZ2x5cGg/ICovCisgICAgICAgIGlmICggZ2luZGV4ID09IDAgKQogICAgICAgICB7Ci0gICAgICAgICAgY21hcC0+Y3VyX2NoYXJjb2RlID0gY2hhcl9jb2RlOzsKLSAgICAgICAgICBjbWFwLT5jdXJfZ2luZGV4ICAgPSBnaW5kZXg7Ci0gICAgICAgICAgY21hcC0+Y3VyX2dyb3VwICAgID0gbjsKKyAgICAgICAgICBpZiAoIGNoYXJfY29kZSA+PSAweEZGRkZGRkZGVUwgKQorICAgICAgICAgICAgZ290byBGYWlsOwogCi0gICAgICAgICAgcmV0dXJuOworICAgICAgICAgIGNoYXJfY29kZSsrOworICAgICAgICAgIGdvdG8gQWdhaW47CiAgICAgICAgIH0KKworICAgICAgICAvKiBpZiBgZ2luZGV4JyBpcyBpbnZhbGlkLCB0aGUgcmVtYWluaW5nIHZhbHVlcyAqLworICAgICAgICAvKiBpbiB0aGlzIGdyb3VwIGFyZSBpbnZhbGlkLCB0b28gICAgICAgICAgICAgICAqLworICAgICAgICBpZiAoIGdpbmRleCA+PSAoRlRfVUludClmYWNlLT5udW1fZ2x5cGhzICkKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBjbWFwLT5jdXJfY2hhcmNvZGUgPSBjaGFyX2NvZGU7CisgICAgICAgIGNtYXAtPmN1cl9naW5kZXggICA9IGdpbmRleDsKKyAgICAgICAgY21hcC0+Y3VyX2dyb3VwICAgID0gbjsKKworICAgICAgICByZXR1cm47CiAgICAgICB9CiAgICAgfQogCkBAIC0yMTk2LDcgKzIzMTMsMTIgQEAKICAgICBlbmQgPSAweEZGRkZGRkZGVUw7CiAKICAgICBpZiAoIG5leHQgKQorICAgIHsKKyAgICAgIGlmICggY2hhcl9jb2RlID49IDB4RkZGRkZGRkZVTCApCisgICAgICAgIHJldHVybiAwOworCiAgICAgICBjaGFyX2NvZGUrKzsKKyAgICB9CiAKICAgICBtaW4gPSAwOwogICAgIG1heCA9IG51bV9ncm91cHM7CkBAIC0yMjE3LDIwICsyMzM5LDI0IEBACiAgICAgICBlbHNlCiAgICAgICB7CiAgICAgICAgIHN0YXJ0X2lkID0gVFRfUEVFS19VTE9ORyggcCApOwotICAgICAgICBnaW5kZXggPSAoRlRfVUludCkoIHN0YXJ0X2lkICsgY2hhcl9jb2RlIC0gc3RhcnQgKTsKIAorICAgICAgICAvKiByZWplY3QgaW52YWxpZCBnbHlwaCBpbmRleCAqLworICAgICAgICBpZiAoIHN0YXJ0X2lkID4gMHhGRkZGRkZGRlVMIC0gKCBjaGFyX2NvZGUgLSBzdGFydCApICkKKyAgICAgICAgICBnaW5kZXggPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgZ2luZGV4ID0gKEZUX1VJbnQpKCBzdGFydF9pZCArICggY2hhcl9jb2RlIC0gc3RhcnQgKSApOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoIG5leHQgKQogICAgIHsKKyAgICAgIEZUX0ZhY2UgICAgZmFjZSAgID0gY21hcC0+Y21hcC5jaGFybWFwLmZhY2U7CiAgICAgICBUVF9DTWFwMTIgIGNtYXAxMiA9IChUVF9DTWFwMTIpY21hcDsKIAogCiAgICAgICAvKiBpZiBgY2hhcl9jb2RlJyBpcyBub3QgaW4gYW55IGdyb3VwLCB0aGVuIGBtaWQnIGlzICovCiAgICAgICAvKiB0aGUgZ3JvdXAgbmVhcmVzdCB0byBgY2hhcl9jb2RlJyAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKICAgICAgIGlmICggY2hhcl9jb2RlID4gZW5kICkKICAgICAgIHsKQEAgLTIyNDMsNiArMjM2OSw5IEBACiAgICAgICBjbWFwMTItPmN1cl9jaGFyY29kZSA9IGNoYXJfY29kZTsKICAgICAgIGNtYXAxMi0+Y3VyX2dyb3VwICAgID0gbWlkOwogCisgICAgICBpZiAoIGdpbmRleCA+PSAoRlRfVUludClmYWNlLT5udW1fZ2x5cGhzICkKKyAgICAgICAgZ2luZGV4ID0gMDsKKwogICAgICAgaWYgKCAhZ2luZGV4ICkKICAgICAgIHsKICAgICAgICAgdHRfY21hcDEyX25leHQoIGNtYXAxMiApOwpAQCAtMjI1Myw4ICsyMzgyLDcgQEAKICAgICAgIGVsc2UKICAgICAgICAgY21hcDEyLT5jdXJfZ2luZGV4ID0gZ2luZGV4OwogCi0gICAgICBpZiAoIGdpbmRleCApCi0gICAgICAgICpwY2hhcl9jb2RlID0gY21hcDEyLT5jdXJfY2hhcmNvZGU7CisgICAgICAqcGNoYXJfY29kZSA9IGNtYXAxMi0+Y3VyX2NoYXJjb2RlOwogICAgIH0KIAogICAgIHJldHVybiBnaW5kZXg7CkBAIC0yMjc0LDIzICsyNDAyLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgKnBjaGFyX2NvZGUgKQogICB7CiAgICAgVFRfQ01hcDEyICBjbWFwMTIgPSAoVFRfQ01hcDEyKWNtYXA7Ci0gICAgRlRfVUxvbmcgICBnaW5kZXg7CisgICAgRlRfVUludCAgICBnaW5kZXg7CiAKIAotICAgIGlmICggY21hcDEyLT5jdXJfY2hhcmNvZGUgPj0gMHhGRkZGRkZGRlVMICkKLSAgICAgIHJldHVybiAwOwotCiAgICAgLyogbm8gbmVlZCB0byBzZWFyY2ggKi8KICAgICBpZiAoIGNtYXAxMi0+dmFsaWQgJiYgY21hcDEyLT5jdXJfY2hhcmNvZGUgPT0gKnBjaGFyX2NvZGUgKQogICAgIHsKICAgICAgIHR0X2NtYXAxMl9uZXh0KCBjbWFwMTIgKTsKICAgICAgIGlmICggY21hcDEyLT52YWxpZCApCiAgICAgICB7Ci0gICAgICAgIGdpbmRleCA9IGNtYXAxMi0+Y3VyX2dpbmRleDsKLQotICAgICAgICAvKiBYWFg6IGNoZWNrIGN1cl9jaGFyY29kZSBvdmVyZmxvdyBpcyBleHBlY3RlZCAqLwotICAgICAgICBpZiAoIGdpbmRleCApCi0gICAgICAgICAgKnBjaGFyX2NvZGUgPSAoRlRfVUludDMyKWNtYXAxMi0+Y3VyX2NoYXJjb2RlOworICAgICAgICBnaW5kZXggICAgICA9IGNtYXAxMi0+Y3VyX2dpbmRleDsKKyAgICAgICAgKnBjaGFyX2NvZGUgPSAoRlRfVUludDMyKWNtYXAxMi0+Y3VyX2NoYXJjb2RlOwogICAgICAgfQogICAgICAgZWxzZQogICAgICAgICBnaW5kZXggPSAwOwpAQCAtMjI5OCw4ICsyNDIwLDcgQEAKICAgICBlbHNlCiAgICAgICBnaW5kZXggPSB0dF9jbWFwMTJfY2hhcl9tYXBfYmluYXJ5KCBjbWFwLCBwY2hhcl9jb2RlLCAxICk7CiAKLSAgICAvKiBYWFg6IGNoZWNrIGdpbmRleCBvdmVyZmxvdyBpcyBleHBlY3RlZCAqLwotICAgIHJldHVybiAoRlRfVUludDMyKWdpbmRleDsKKyAgICByZXR1cm4gZ2luZGV4OwogICB9CiAKIApAQCAtMjQ1OCw2ICsyNTc5LDcgQEAKICAgc3RhdGljIHZvaWQKICAgdHRfY21hcDEzX25leHQoIFRUX0NNYXAxMyAgY21hcCApCiAgIHsKKyAgICBGVF9GYWNlICAgZmFjZSA9IGNtYXAtPmNtYXAuY21hcC5jaGFybWFwLmZhY2U7CiAgICAgRlRfQnl0ZSogIHA7CiAgICAgRlRfVUxvbmcgIHN0YXJ0LCBlbmQsIGdseXBoX2lkLCBjaGFyX2NvZGU7CiAgICAgRlRfVUxvbmcgIG47CkBAIC0yNDgzLDkgKzI2MDUsOSBAQAogICAgICAgewogICAgICAgICBnaW5kZXggPSAoRlRfVUludClnbHlwaF9pZDsKIAotICAgICAgICBpZiAoIGdpbmRleCApCisgICAgICAgIGlmICggZ2luZGV4ICYmIGdpbmRleCA8IChGVF9VSW50KWZhY2UtPm51bV9nbHlwaHMgKQogICAgICAgICB7Ci0gICAgICAgICAgY21hcC0+Y3VyX2NoYXJjb2RlID0gY2hhcl9jb2RlOzsKKyAgICAgICAgICBjbWFwLT5jdXJfY2hhcmNvZGUgPSBjaGFyX2NvZGU7CiAgICAgICAgICAgY21hcC0+Y3VyX2dpbmRleCAgID0gZ2luZGV4OwogICAgICAgICAgIGNtYXAtPmN1cl9ncm91cCAgICA9IG47CiAKQEAgLTI1MjAsNyArMjY0MiwxMiBAQAogICAgIGVuZCA9IDB4RkZGRkZGRkZVTDsKIAogICAgIGlmICggbmV4dCApCisgICAgeworICAgICAgaWYgKCBjaGFyX2NvZGUgPj0gMHhGRkZGRkZGRlVMICkKKyAgICAgICAgcmV0dXJuIDA7CisKICAgICAgIGNoYXJfY29kZSsrOworICAgIH0KIAogICAgIG1pbiA9IDA7CiAgICAgbWF4ID0gbnVtX2dyb3VwczsKQEAgLTI1NDgsNiArMjY3NSw3IEBACiAKICAgICBpZiAoIG5leHQgKQogICAgIHsKKyAgICAgIEZUX0ZhY2UgICAgZmFjZSAgID0gY21hcC0+Y21hcC5jaGFybWFwLmZhY2U7CiAgICAgICBUVF9DTWFwMTMgIGNtYXAxMyA9IChUVF9DTWFwMTMpY21hcDsKIAogCkBAIC0yNTY1LDYgKzI2OTMsOSBAQAogICAgICAgY21hcDEzLT5jdXJfY2hhcmNvZGUgPSBjaGFyX2NvZGU7CiAgICAgICBjbWFwMTMtPmN1cl9ncm91cCAgICA9IG1pZDsKIAorICAgICAgaWYgKCBnaW5kZXggPj0gKEZUX1VJbnQpZmFjZS0+bnVtX2dseXBocyApCisgICAgICAgIGdpbmRleCA9IDA7CisKICAgICAgIGlmICggIWdpbmRleCApCiAgICAgICB7CiAgICAgICAgIHR0X2NtYXAxM19uZXh0KCBjbWFwMTMgKTsKQEAgLTI1NzUsOCArMjcwNiw3IEBACiAgICAgICBlbHNlCiAgICAgICAgIGNtYXAxMy0+Y3VyX2dpbmRleCA9IGdpbmRleDsKIAotICAgICAgaWYgKCBnaW5kZXggKQotICAgICAgICAqcGNoYXJfY29kZSA9IGNtYXAxMy0+Y3VyX2NoYXJjb2RlOworICAgICAgKnBjaGFyX2NvZGUgPSBjbWFwMTMtPmN1cl9jaGFyY29kZTsKICAgICB9CiAKICAgICByZXR1cm4gZ2luZGV4OwpAQCAtMjU5OSwxOCArMjcyOSwxNCBAQAogICAgIEZUX1VJbnQgICAgZ2luZGV4OwogCiAKLSAgICBpZiAoIGNtYXAxMy0+Y3VyX2NoYXJjb2RlID49IDB4RkZGRkZGRkZVTCApCi0gICAgICByZXR1cm4gMDsKLQogICAgIC8qIG5vIG5lZWQgdG8gc2VhcmNoICovCiAgICAgaWYgKCBjbWFwMTMtPnZhbGlkICYmIGNtYXAxMy0+Y3VyX2NoYXJjb2RlID09ICpwY2hhcl9jb2RlICkKICAgICB7CiAgICAgICB0dF9jbWFwMTNfbmV4dCggY21hcDEzICk7CiAgICAgICBpZiAoIGNtYXAxMy0+dmFsaWQgKQogICAgICAgewotICAgICAgICBnaW5kZXggPSBjbWFwMTMtPmN1cl9naW5kZXg7Ci0gICAgICAgIGlmICggZ2luZGV4ICkKLSAgICAgICAgICAqcGNoYXJfY29kZSA9IGNtYXAxMy0+Y3VyX2NoYXJjb2RlOworICAgICAgICBnaW5kZXggICAgICA9IGNtYXAxMy0+Y3VyX2dpbmRleDsKKyAgICAgICAgKnBjaGFyX2NvZGUgPSBjbWFwMTMtPmN1cl9jaGFyY29kZTsKICAgICAgIH0KICAgICAgIGVsc2UKICAgICAgICAgZ2luZGV4ID0gMDsKQEAgLTM0OTYsNyArMzYyMiw3IEBACiAgICAgewogICAgICAgRlRfRVJST1IoKCAidHRfZmFjZV9idWlsZF9jbWFwczoiCiAgICAgICAgICAgICAgICAgICIgdW5zdXBwb3J0ZWQgYGNtYXAnIHRhYmxlIGZvcm1hdCA9ICVkXG4iLAotICAgICAgICAgICAgICAgICBUVF9QRUVLX1VTSE9SVCggcCAtIDIpICkpOworICAgICAgICAgICAgICAgICBUVF9QRUVLX1VTSE9SVCggcCAtIDIgKSApKTsKICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRjbWFwLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dGNtYXAuaAppbmRleCAwZmRlMTY3Li5iN2VhOGVlIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dGNtYXAuaAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dGNtYXAuaApAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBUcnVlVHlwZSBjaGFyYWN0ZXIgbWFwcGluZyB0YWJsZSAoY21hcCkgc3VwcG9ydCAoc3BlY2lmaWNhdGlvbikuICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDA1LCAyMDA5LCAyMDEyIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDItMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRjbWFwYy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRjbWFwYy5oCmluZGV4IDJlYTIwNDMuLjRhNDg5NDAgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0Y21hcGMuaAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dGNtYXBjLmgKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgVFQgQ01BUCBjbGFzc2VzIGRlZmluaXRpb25zIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDkgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDA5LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBPcmFuIEFncmEgYW5kIE1pY2tleSBHYWJlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0a2Vybi5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRrZXJuLmMKaW5kZXggNDU1ZTdiNS4uNGZjY2M1MyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRrZXJuLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRrZXJuLmMKQEAgLTUsNyArNSw3IEBACiAvKiAgICBMb2FkIHRoZSBiYXNpYyBUcnVlVHlwZSBrZXJuaW5nIHRhYmxlLiAgVGhpcyBkb2Vzbid0IGhhbmRsZSAgICAgICAgICAqLwogLyogICAga2VybmluZyBkYXRhIHdpdGhpbiB0aGUgR1BPUyB0YWJsZSBhdCB0aGUgbW9tZW50LiAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwNywgMjAwOSwgMjAxMCwgMjAxMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KQEAgLTEwOCw4ICsxMDgsOCBAQAogICAgICAgICBwX25leHQgPSBwX2xpbWl0OwogCiAgICAgICAvKiBvbmx5IHVzZSBob3Jpem9udGFsIGtlcm5pbmcgdGFibGVzICovCi0gICAgICBpZiAoICggY292ZXJhZ2UgJiB+OCApICE9IDB4MDAwMSB8fAotICAgICAgICAgICBwICsgOCA+IHBfbGltaXQgICAgICAgICAgICAgKQorICAgICAgaWYgKCAoIGNvdmVyYWdlICYgfjhVICkgIT0gMHgwMDAxIHx8CisgICAgICAgICAgIHAgKyA4ID4gcF9saW1pdCAgICAgICAgICAgICAgKQogICAgICAgICBnb3RvIE5leHRUYWJsZTsKIAogICAgICAgbnVtX3BhaXJzID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0a2Vybi5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRrZXJuLmgKaW5kZXggZGYxZGE5Yi4uODljYjI0ZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRrZXJuLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRrZXJuLmgKQEAgLTUsNyArNSw3IEBACiAvKiAgICBMb2FkIHRoZSBiYXNpYyBUcnVlVHlwZSBrZXJuaW5nIHRhYmxlLiAgVGhpcyBkb2Vzbid0IGhhbmRsZSAgICAgICAgICAqLwogLyogICAga2VybmluZyBkYXRhIHdpdGhpbiB0aGUgR1BPUyB0YWJsZSBhdCB0aGUgbW9tZW50LiAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwNSwgMjAwNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0bG9hZC5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRsb2FkLmMKaW5kZXggODMzODE1MC4uYzFiZDdmMCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRsb2FkLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRsb2FkLmMKQEAgLTUsNyArNSw3IEBACiAvKiAgICBMb2FkIHRoZSBiYXNpYyBUcnVlVHlwZSB0YWJsZXMsIGkuZS4sIHRhYmxlcyB0aGF0IGNhbiBiZSBlaXRoZXIgaW4gICAqLwogLyogICAgVFRGIG9yIE9URiBmb250cyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxMCwgMjAxMi0yMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KQEAgLTE1MSw3ICsxNTEsOCBAQAogCiAgIC8qIEhlcmUsIHdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIGNoZWNrIHRoYXQgYG51bV90YWJsZXMnIGlzIHZhbGlkIChhbmQgYWRqdXN0IGl0IGlmIG5lY2Vzc2FyeSkgICovCisgIC8qIC0gY2hlY2sgdGhhdCBgbnVtX3RhYmxlcycgaXMgdmFsaWQgKGFuZCBhZGp1c3QgaXQgaWYgbmVjZXNzYXJ5KTsgKi8KKyAgLyogICBhbHNvIHJldHVybiB0aGUgbnVtYmVyIG9mIHZhbGlkIHRhYmxlIGVudHJpZXMgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qIC0gbG9vayBmb3IgYSBgaGVhZCcgdGFibGUsIGNoZWNrIGl0cyBzaXplLCBhbmQgcGFyc2UgaXQgdG8gY2hlY2sgKi8KICAgLyogICB3aGV0aGVyIGl0cyBgbWFnaWMnIGZpZWxkIGlzIGNvcnJlY3RseSBzZXQgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTY3LDcgKzE2OCw4IEBACiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIEZUX0Vycm9yCiAgIGNoZWNrX3RhYmxlX2RpciggU0ZOVF9IZWFkZXIgIHNmbnQsCi0gICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgIHN0cmVhbSApCisgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICAgdmFsaWQgKQogICB7CiAgICAgRlRfRXJyb3IgICBlcnJvcjsKICAgICBGVF9VU2hvcnQgIG5uLCB2YWxpZF9lbnRyaWVzID0gMDsKQEAgLTIwOCwxMyArMjEwLDI3IEBACiAKICAgICAgIC8qIHdlIGlnbm9yZSBpbnZhbGlkIHRhYmxlcyAqLwogCi0gICAgICAvKiB0YWJsZS5PZmZzZXQgKyB0YWJsZS5MZW5ndGggPiBzdHJlYW0tPnNpemUgPyAqLwotICAgICAgaWYgKCB0YWJsZS5MZW5ndGggPiBzdHJlYW0tPnNpemUgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgdGFibGUuT2Zmc2V0ID4gc3RyZWFtLT5zaXplIC0gdGFibGUuTGVuZ3RoICkKKyAgICAgIGlmICggdGFibGUuT2Zmc2V0ID4gc3RyZWFtLT5zaXplICkKICAgICAgIHsKICAgICAgICAgRlRfVFJBQ0UyKCggImNoZWNrX3RhYmxlX2RpcjogdGFibGUgZW50cnkgJWQgaW52YWxpZFxuIiwgbm4gKSk7CiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQorICAgICAgZWxzZSBpZiAoIHRhYmxlLkxlbmd0aCA+IHN0cmVhbS0+c2l6ZSAtIHRhYmxlLk9mZnNldCApCisgICAgICB7CisgICAgICAgIC8qIFNvbWUgdGFibGVzIGhhdmUgc3VjaCBhIHNpbXBsZSBzdHJ1Y3R1cmUgdGhhdCBjbGlwcGluZyBpdHMgICAgICovCisgICAgICAgIC8qIGNvbnRlbnRzIGlzIGhhcm1sZXNzLiAgVGhpcyBhbHNvIG1ha2VzIEZyZWVUeXBlIGxlc3Mgc2Vuc2l0aXZlICovCisgICAgICAgIC8qIHRvIGludmFsaWQgdGFibGUgbGVuZ3RocyAod2hpY2ggcHJvZ3JhbXMgbGlrZSBBY3JvcmVhZCBzZWVtIHRvICovCisgICAgICAgIC8qIGlnbm9yZSBpbiBnZW5lcmFsKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgaWYgKCB0YWJsZS5UYWcgPT0gVFRBR19obXR4IHx8CisgICAgICAgICAgICAgdGFibGUuVGFnID09IFRUQUdfdm10eCApCisgICAgICAgICAgdmFsaWRfZW50cmllcysrOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBGVF9UUkFDRTIoKCAiY2hlY2tfdGFibGVfZGlyOiB0YWJsZSBlbnRyeSAlZCBpbnZhbGlkXG4iLCBubiApKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQogICAgICAgZWxzZQogICAgICAgICB2YWxpZF9lbnRyaWVzKys7CiAKQEAgLTI2MiwxMSArMjc4LDExIEBACiAgICAgICAgIGhhc19tZXRhID0gMTsKICAgICB9CiAKLSAgICBzZm50LT5udW1fdGFibGVzID0gdmFsaWRfZW50cmllczsKKyAgICAqdmFsaWQgPSB2YWxpZF9lbnRyaWVzOwogCi0gICAgaWYgKCBzZm50LT5udW1fdGFibGVzID09IDAgKQorICAgIGlmICggIXZhbGlkX2VudHJpZXMgKQogICAgIHsKLSAgICAgIEZUX1RSQUNFMigoICJjaGVja190YWJsZV9kaXI6IG5vIHRhYmxlcyBmb3VuZFxuIiApKTsKKyAgICAgIEZUX1RSQUNFMigoICJjaGVja190YWJsZV9kaXI6IG5vIHZhbGlkIHRhYmxlcyBmb3VuZFxuIiApKTsKICAgICAgIGVycm9yID0gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKICAgICAgIGdvdG8gRXhpdDsKICAgICB9CkBAIC0zMjIsOCArMzM4LDcgQEAKICAgICBTRk5UX0hlYWRlclJlYyAgc2ZudDsKICAgICBGVF9FcnJvciAgICAgICAgZXJyb3I7CiAgICAgRlRfTWVtb3J5ICAgICAgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotICAgIFRUX1RhYmxlUmVjKiAgICBlbnRyeTsKLSAgICBGVF9JbnQgICAgICAgICAgbm47CisgICAgRlRfVVNob3J0ICAgICAgIG5uLCB2YWxpZF9lbnRyaWVzOwogCiAgICAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICBvZmZzZXRfdGFibGVfZmllbGRzW10gPQogICAgIHsKQEAgLTM2NCw1OSArMzc5LDExNCBAQAogICAgIGlmICggc2ZudC5mb3JtYXRfdGFnICE9IFRUQUdfT1RUTyApCiAgICAgewogICAgICAgLyogY2hlY2sgZmlyc3QgKi8KLSAgICAgIGVycm9yID0gY2hlY2tfdGFibGVfZGlyKCAmc2ZudCwgc3RyZWFtICk7CisgICAgICBlcnJvciA9IGNoZWNrX3RhYmxlX2RpciggJnNmbnQsIHN0cmVhbSwgJnZhbGlkX2VudHJpZXMgKTsKICAgICAgIGlmICggZXJyb3IgKQogICAgICAgewogICAgICAgICBGVF9UUkFDRTIoKCAidHRfZmFjZV9sb2FkX2ZvbnRfZGlyOiIKICAgICAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIHRhYmxlIGRpcmVjdG9yeSBmb3IgVHJ1ZVR5cGVcbiIgKSk7Ci0KICAgICAgICAgZ290byBFeGl0OwogICAgICAgfQogICAgIH0KKyAgICBlbHNlCisgICAgICB2YWxpZF9lbnRyaWVzID0gc2ZudC5udW1fdGFibGVzOwogCi0gICAgZmFjZS0+bnVtX3RhYmxlcyA9IHNmbnQubnVtX3RhYmxlczsKKyAgICBmYWNlLT5udW1fdGFibGVzID0gdmFsaWRfZW50cmllczsKICAgICBmYWNlLT5mb3JtYXRfdGFnID0gc2ZudC5mb3JtYXRfdGFnOwogCiAgICAgaWYgKCBGVF9RTkVXX0FSUkFZKCBmYWNlLT5kaXJfdGFibGVzLCBmYWNlLT5udW1fdGFibGVzICkgKQogICAgICAgZ290byBFeGl0OwogCi0gICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggc2ZudC5vZmZzZXQgKyAxMiApICAgICAgIHx8Ci0gICAgICAgICBGVF9GUkFNRV9FTlRFUiggZmFjZS0+bnVtX3RhYmxlcyAqIDE2TCApICkKKyAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBzZm50Lm9mZnNldCArIDEyICkgICAgICB8fAorICAgICAgICAgRlRfRlJBTUVfRU5URVIoIHNmbnQubnVtX3RhYmxlcyAqIDE2TCApICkKICAgICAgIGdvdG8gRXhpdDsKIAotICAgIGVudHJ5ID0gZmFjZS0+ZGlyX3RhYmxlczsKLQogICAgIEZUX1RSQUNFMigoICJcbiIKICAgICAgICAgICAgICAgICAiICB0YWcgICAgb2Zmc2V0ICAgIGxlbmd0aCAgIGNoZWNrc3VtXG4iCiAgICAgICAgICAgICAgICAgIiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApKTsKIAorICAgIHZhbGlkX2VudHJpZXMgPSAwOwogICAgIGZvciAoIG5uID0gMDsgbm4gPCBzZm50Lm51bV90YWJsZXM7IG5uKysgKQogICAgIHsKLSAgICAgIGVudHJ5LT5UYWcgICAgICA9IEZUX0dFVF9UQUc0KCk7Ci0gICAgICBlbnRyeS0+Q2hlY2tTdW0gPSBGVF9HRVRfVUxPTkcoKTsKLSAgICAgIGVudHJ5LT5PZmZzZXQgICA9IEZUX0dFVF9VTE9ORygpOwotICAgICAgZW50cnktPkxlbmd0aCAgID0gRlRfR0VUX1VMT05HKCk7CisgICAgICBUVF9UYWJsZVJlYyAgZW50cnk7CisgICAgICBGVF9VU2hvcnQgICAgaTsKKyAgICAgIEZUX0Jvb2wgICAgICBkdXBsaWNhdGU7CiAKLSAgICAgIC8qIGlnbm9yZSBpbnZhbGlkIHRhYmxlcyAqLwogCi0gICAgICAvKiBlbnRyeS0+T2Zmc2V0ICsgZW50cnktPkxlbmd0aCA+IHN0cmVhbS0+c2l6ZSA/ICovCi0gICAgICBpZiAoIGVudHJ5LT5MZW5ndGggPiBzdHJlYW0tPnNpemUgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIGVudHJ5LT5PZmZzZXQgPiBzdHJlYW0tPnNpemUgLSBlbnRyeS0+TGVuZ3RoICkKKyAgICAgIGVudHJ5LlRhZyAgICAgID0gRlRfR0VUX1RBRzQoKTsKKyAgICAgIGVudHJ5LkNoZWNrU3VtID0gRlRfR0VUX1VMT05HKCk7CisgICAgICBlbnRyeS5PZmZzZXQgICA9IEZUX0dFVF9VTE9ORygpOworICAgICAgZW50cnkuTGVuZ3RoICAgPSBGVF9HRVRfVUxPTkcoKTsKKworICAgICAgLyogaWdub3JlIGludmFsaWQgdGFibGVzIHRoYXQgY2FuJ3QgYmUgc2FuaXRpemVkICovCisKKyAgICAgIGlmICggZW50cnkuT2Zmc2V0ID4gc3RyZWFtLT5zaXplICkKICAgICAgICAgY29udGludWU7CisgICAgICBlbHNlIGlmICggZW50cnkuTGVuZ3RoID4gc3RyZWFtLT5zaXplIC0gZW50cnkuT2Zmc2V0ICkKKyAgICAgIHsKKyAgICAgICAgaWYgKCBlbnRyeS5UYWcgPT0gVFRBR19obXR4IHx8CisgICAgICAgICAgICAgZW50cnkuVGFnID09IFRUQUdfdm10eCApCisgICAgICAgIHsKKyNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQorICAgICAgICAgIEZUX1VMb25nICBvbGRfbGVuZ3RoID0gZW50cnkuTGVuZ3RoOworI2VuZGlmCisKKworICAgICAgICAgIC8qIG1ha2UgbWV0cmljcyB0YWJsZSBsZW5ndGggYSBtdWx0aXBsZSBvZiA0ICovCisgICAgICAgICAgZW50cnkuTGVuZ3RoID0gKCBzdHJlYW0tPnNpemUgLSBlbnRyeS5PZmZzZXQgKSAmIH4zVTsKKworICAgICAgICAgIEZUX1RSQUNFMigoICIgICVjJWMlYyVjICAlMDhseCAgJTA4bHggICUwOGx4IgorICAgICAgICAgICAgICAgICAgICAgICIgKHNhbml0aXplZDsgb3JpZ2luYWwgbGVuZ3RoICUwOGx4KSIsCisgICAgICAgICAgICAgICAgICAgICAgKEZUX0NoYXIpKCBlbnRyeS5UYWcgPj4gMjQgKSwKKyAgICAgICAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIGVudHJ5LlRhZyA+PiAxNiApLAorICAgICAgICAgICAgICAgICAgICAgIChGVF9DaGFyKSggZW50cnkuVGFnID4+IDggICksCisgICAgICAgICAgICAgICAgICAgICAgKEZUX0NoYXIpKCBlbnRyeS5UYWcgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgZW50cnkuTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LkNoZWNrU3VtLAorICAgICAgICAgICAgICAgICAgICAgIG9sZF9sZW5ndGggKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCisgICAgICBlbHNlCisgICAgICAgIEZUX1RSQUNFMigoICIgICVjJWMlYyVjICAlMDhseCAgJTA4bHggICUwOGx4IiwKKyAgICAgICAgICAgICAgICAgICAgKEZUX0NoYXIpKCBlbnRyeS5UYWcgPj4gMjQgKSwKKyAgICAgICAgICAgICAgICAgICAgKEZUX0NoYXIpKCBlbnRyeS5UYWcgPj4gMTYgKSwKKyAgICAgICAgICAgICAgICAgICAgKEZUX0NoYXIpKCBlbnRyeS5UYWcgPj4gOCAgKSwKKyAgICAgICAgICAgICAgICAgICAgKEZUX0NoYXIpKCBlbnRyeS5UYWcgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBlbnRyeS5MZW5ndGgsCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LkNoZWNrU3VtICkpOworI2VuZGlmCisKKyAgICAgIC8qIGlnbm9yZSBkdXBsaWNhdGUgdGFibGVzIOKAkyB0aGUgZmlyc3Qgb25lIHdpbnMgKi8KKyAgICAgIGR1cGxpY2F0ZSA9IDA7CisgICAgICBmb3IgKCBpID0gMDsgaSA8IHZhbGlkX2VudHJpZXM7IGkrKyApCisgICAgICB7CisgICAgICAgIGlmICggZmFjZS0+ZGlyX3RhYmxlc1tpXS5UYWcgPT0gZW50cnkuVGFnICkKKyAgICAgICAgeworICAgICAgICAgIGR1cGxpY2F0ZSA9IDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICggZHVwbGljYXRlICkKKyAgICAgIHsKKyAgICAgICAgRlRfVFJBQ0UyKCggIiAgKGR1cGxpY2F0ZSwgaWdub3JlZClcbiIgKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQogICAgICAgZWxzZQogICAgICAgewotICAgICAgICBGVF9UUkFDRTIoKCAiICAlYyVjJWMlYyAgJTA4bHggICUwOGx4ICAlMDhseFxuIiwKLSAgICAgICAgICAgICAgICAgICAgKEZUX0NoYXIpKCBlbnRyeS0+VGFnID4+IDI0ICksCi0gICAgICAgICAgICAgICAgICAgIChGVF9DaGFyKSggZW50cnktPlRhZyA+PiAxNiApLAotICAgICAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIGVudHJ5LT5UYWcgPj4gOCAgKSwKLSAgICAgICAgICAgICAgICAgICAgKEZUX0NoYXIpKCBlbnRyeS0+VGFnICAgICAgICksCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5LT5PZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5LT5MZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5LT5DaGVja1N1bSApKTsKLSAgICAgICAgZW50cnkrKzsKKyAgICAgICAgRlRfVFJBQ0UyKCggIlxuIiApKTsKKworICAgICAgICAvKiB3ZSBmaW5hbGx5IGhhdmUgYSB2YWxpZCBlbnRyeSAqLworICAgICAgICBmYWNlLT5kaXJfdGFibGVzW3ZhbGlkX2VudHJpZXMrK10gPSBlbnRyeTsKICAgICAgIH0KICAgICB9CiAKKyAgICAvKiBmaW5hbCBhZGp1c3RtZW50IHRvIG51bWJlciBvZiB0YWJsZXMgKi8KKyAgICBmYWNlLT5udW1fdGFibGVzID0gdmFsaWRfZW50cmllczsKKwogICAgIEZUX0ZSQU1FX0VYSVQoKTsKIAogICAgIEZUX1RSQUNFMigoICJ0YWJsZSBkaXJlY3RvcnkgbG9hZGVkXG5cbiIgKSk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dGxvYWQuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0bG9hZC5oCmluZGV4IDQ5YTFhZWUuLmE2ZDkxYzUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0bG9hZC5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0bG9hZC5oCkBAIC01LDcgKzUsNyBAQAogLyogICAgTG9hZCB0aGUgYmFzaWMgVHJ1ZVR5cGUgdGFibGVzLCBpLmUuLCB0YWJsZXMgdGhhdCBjYW4gYmUgZWl0aGVyIGluICAgKi8KIC8qICAgIFRURiBvciBPVEYgZm9udHMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDUsIDIwMDYgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dG10eC5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRtdHguYwppbmRleCBiYjMxOTU3Li41ODMwOWFhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dG10eC5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0bXR4LmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgTG9hZCB0aGUgbWV0cmljcyB0YWJsZXMgY29tbW9uIHRvIFRURiBhbmQgT1RGIGZvbnRzIChib2R5KS4gICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDYtMjAwOSwgMjAxMS0yMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDA2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0bXR4LmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dG10eC5oCmluZGV4IGZiMDQwMzkuLjA5NmVlMDYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0bXR4LmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRtdHguaApAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBMb2FkIHRoZSBtZXRyaWNzIHRhYmxlcyBjb21tb24gdG8gVFRGIGFuZCBPVEYgZm9udHMgKHNwZWNpZmljYXRpb24pLiAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNiwgMjAxNCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRwb3N0LmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dHBvc3QuYwppbmRleCA5OWQ4MDA1Li44ZDI5ZDFlIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dHBvc3QuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dHBvc3QuYwpAQCAtNSw3ICs1LDcgQEAKIC8qICAgIFBvc3RjcmlwdCBuYW1lIHRhYmxlIHByb2Nlc3NpbmcgZm9yIFRydWVUeXBlIGFuZCBPcGVuVHlwZSBmb250cyAgICAgICovCiAvKiAgICAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAzLCAyMDA2LTIwMTAsIDIwMTMsIDIwMTQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtNTIsNyArNTIsNyBAQAogCiAjaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSAogCi0jZGVmaW5lIE1BQ19OQU1FKCB4ICkgICggKEZUX1N0cmluZyopcHNuYW1lcy0+bWFjaW50b3NoX25hbWUoIHggKSApCisjZGVmaW5lIE1BQ19OQU1FKCB4ICkgIChGVF9TdHJpbmcqKXBzbmFtZXMtPm1hY2ludG9zaF9uYW1lKCAoRlRfVUludCkoeCkgKQogCiAKICNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUyAqLwpAQCAtNjIsNyArNjIsNyBAQAogICAgLyogdGFibGUgb2YgTWFjIG5hbWVzLiAgVGh1cywgaXQgaXMgcG9zc2libGUgdG8gYnVpbGQgYSB2ZXJzaW9uIG9mICovCiAgICAvKiBGcmVlVHlwZSB3aXRob3V0IHRoZSBUeXBlIDEgZHJpdmVyICYgUFNOYW1lcyBtb2R1bGUuICAgICAgICAgICAgKi8KIAotI2RlZmluZSBNQUNfTkFNRSggeCApICAoIChGVF9TdHJpbmcqKXR0X3Bvc3RfZGVmYXVsdF9uYW1lc1t4XSApCisjZGVmaW5lIE1BQ19OQU1FKCB4ICkgIChGVF9TdHJpbmcqKXR0X3Bvc3RfZGVmYXVsdF9uYW1lc1t4XQogCiAgIC8qIHRoZSAyNTggZGVmYXVsdCBNYWMgUFMgZ2x5cGggbmFtZXM7IHNlZSBmaWxlIGB0b29scy9nbG5hbWVzLnB5JyAqLwogCkBAIC0xNTUsNyArMTU1LDcgQEAKICAgc3RhdGljIEZUX0Vycm9yCiAgIGxvYWRfZm9ybWF0XzIwKCBUVF9GYWNlICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgcG9zdF9saW1pdCApCisgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHBvc3RfbGltaXQgKQogICB7CiAgICAgRlRfTWVtb3J5ICAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7CiAgICAgRlRfRXJyb3IgICAgZXJyb3I7CkBAIC0xNjMsOCArMTYzLDggQEAKICAgICBGVF9JbnQgICAgICBudW1fZ2x5cGhzOwogICAgIEZUX1VTaG9ydCAgIG51bV9uYW1lczsKIAotICAgIEZUX1VTaG9ydCogIGdseXBoX2luZGljZXMgPSAwOwotICAgIEZUX0NoYXIqKiAgIG5hbWVfc3RyaW5ncyAgPSAwOworICAgIEZUX1VTaG9ydCogIGdseXBoX2luZGljZXMgPSBOVUxMOworICAgIEZUX0NoYXIqKiAgIG5hbWVfc3RyaW5ncyAgPSBOVUxMOwogCiAKICAgICBpZiAoIEZUX1JFQURfVVNIT1JUKCBudW1fZ2x5cGhzICkgKQpAQCAtMjQzLDE0ICsyNDMsMTcgQEAKICAgICAgICAgICAgIGdvdG8gRmFpbDE7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIChGVF9JbnQpbGVuID4gcG9zdF9saW1pdCAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgIEZUX1NUUkVBTV9QT1MoKSA+IHBvc3RfbGltaXQgLSAoRlRfSW50KWxlbiApCisgICAgICAgIGlmICggbGVuID4gcG9zdF9saW1pdCAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgIEZUX1NUUkVBTV9QT1MoKSA+IHBvc3RfbGltaXQgLSBsZW4gKQogICAgICAgICB7CisgICAgICAgICAgRlRfSW50ICBkID0gKEZUX0ludClwb3N0X2xpbWl0IC0gKEZUX0ludClGVF9TVFJFQU1fUE9TKCk7CisKKwogICAgICAgICAgIEZUX0VSUk9SKCggImxvYWRfZm9ybWF0XzIwOiIKICAgICAgICAgICAgICAgICAgICAgICIgZXhjZWVkaW5nIHN0cmluZyBsZW5ndGggKCVkKSwiCiAgICAgICAgICAgICAgICAgICAgICAiIHRydW5jYXRpbmcgYXQgZW5kIG9mIHBvc3QgdGFibGUgKCVkIGJ5dGUgbGVmdClcbiIsCi0gICAgICAgICAgICAgICAgICAgICBsZW4sIHBvc3RfbGltaXQgLSBGVF9TVFJFQU1fUE9TKCkgKSk7Ci0gICAgICAgICAgbGVuID0gRlRfTUFYKCAwLCBwb3N0X2xpbWl0IC0gRlRfU1RSRUFNX1BPUygpICk7CisgICAgICAgICAgICAgICAgICAgICBsZW4sIGQgKSk7CisgICAgICAgICAgbGVuID0gKEZUX1VJbnQpRlRfTUFYKCAwLCBkICk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIEZUX05FV19BUlJBWSggbmFtZV9zdHJpbmdzW25dLCBsZW4gKyAxICkgfHwKQEAgLTMwNywxMyArMzEwLDEzIEBACiAgIHN0YXRpYyBGVF9FcnJvcgogICBsb2FkX2Zvcm1hdF8yNSggVFRfRmFjZSAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIHBvc3RfbGltaXQgKQorICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBwb3N0X2xpbWl0ICkKICAgewogICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7CiAgICAgRlRfRXJyb3IgICBlcnJvcjsKIAogICAgIEZUX0ludCAgICAgbnVtX2dseXBoczsKLSAgICBGVF9DaGFyKiAgIG9mZnNldF90YWJsZSA9IDA7CisgICAgRlRfQ2hhciogICBvZmZzZXRfdGFibGUgPSBOVUxMOwogCiAgICAgRlRfVU5VU0VEKCBwb3N0X2xpbWl0ICk7CiAKQEAgLTM3Nyw3ICszODAsNyBAQAogICAgIEZUX0Vycm9yICAgZXJyb3I7CiAgICAgRlRfRml4ZWQgICBmb3JtYXQ7CiAgICAgRlRfVUxvbmcgICBwb3N0X2xlbjsKLSAgICBGVF9Mb25nICAgIHBvc3RfbGltaXQ7CisgICAgRlRfVUxvbmcgICBwb3N0X2xpbWl0OwogCiAKICAgICAvKiBnZXQgYSBzdHJlYW0gZm9yIHRoZSBmYWNlJ3MgcmVzb3VyY2UgKi8KQEAgLTU0NywxMCArNTUwLDcgQEAKICAgICAgIH0KIAogICAgICAgaWYgKCBpZHggPCAoRlRfVUludCl0YWJsZS0+bnVtX2dseXBocyApICAgIC8qIHBhcmFub2lkIGNoZWNraW5nICovCi0gICAgICB7Ci0gICAgICAgIGlkeCAgICArPSB0YWJsZS0+b2Zmc2V0c1tpZHhdOwotICAgICAgICAqUFNuYW1lID0gTUFDX05BTUUoIGlkeCApOwotICAgICAgfQorICAgICAgICAqUFNuYW1lID0gTUFDX05BTUUoIChGVF9JbnQpaWR4ICsgdGFibGUtPm9mZnNldHNbaWR4XSApOwogICAgIH0KIAogICAgIC8qIG5vdGhpbmcgdG8gZG8gZm9yIGZvcm1hdCA9PSAweDAwMDMwMDAwTCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRwb3N0LmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dHBvc3QuaAppbmRleCA2ZjA2ZDc1Li5lM2VjYTAyIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dHBvc3QuaAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dHBvc3QuaApAQCAtNSw3ICs1LDcgQEAKIC8qICAgIFBvc3RjcmlwdCBuYW1lIHRhYmxlIHByb2Nlc3NpbmcgZm9yIFRydWVUeXBlIGFuZCBPcGVuVHlwZSBmb250cyAgICAgICovCiAvKiAgICAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRzYml0LmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dHNiaXQuYwppbmRleCBjMmRiOTZjLi4zYjM1MWVjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dHNiaXQuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dHNiaXQuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBUcnVlVHlwZSBhbmQgT3BlblR5cGUgZW1iZWRkZWQgYml0bWFwIHN1cHBvcnQgKGJvZHkpLiAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNS0yMDA5LCAyMDEzLCAyMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDUtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgQ29weXJpZ2h0IDIwMTMgYnkgR29vZ2xlLCBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTAxLDEwICsxMDEsMTAgQEAKIAogICAgICAgICBwID0gZmFjZS0+c2JpdF90YWJsZTsKIAotICAgICAgICB2ZXJzaW9uICAgICA9IEZUX05FWFRfVUxPTkcoIHAgKTsKKyAgICAgICAgdmVyc2lvbiAgICAgPSBGVF9ORVhUX0xPTkcoIHAgKTsKICAgICAgICAgbnVtX3N0cmlrZXMgPSBGVF9ORVhUX1VMT05HKCBwICk7CiAKLSAgICAgICAgaWYgKCAoIHZlcnNpb24gJiAweEZGRkYwMDAwVUwgKSAhPSAweDAwMDIwMDAwVUwgKQorICAgICAgICBpZiAoICggKEZUX1VMb25nKXZlcnNpb24gJiAweEZGRkYwMDAwVUwgKSAhPSAweDAwMDIwMDAwVUwgKQogICAgICAgICB7CiAgICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwogICAgICAgICAgIGdvdG8gRXhpdDsKQEAgLTI1NCwxNSArMjU0LDE1IEBACiAgICAgICAgIG1ldHJpY3MtPnhfcHBlbSA9IChGVF9VU2hvcnQpc3RyaWtlWzQ0XTsKICAgICAgICAgbWV0cmljcy0+eV9wcGVtID0gKEZUX1VTaG9ydClzdHJpa2VbNDVdOwogCi0gICAgICAgIG1ldHJpY3MtPmFzY2VuZGVyICA9IChGVF9DaGFyKXN0cmlrZVsxNl0gPDwgNjsgIC8qIGhvcmkuYXNjZW5kZXIgICovCi0gICAgICAgIG1ldHJpY3MtPmRlc2NlbmRlciA9IChGVF9DaGFyKXN0cmlrZVsxN10gPDwgNjsgIC8qIGhvcmkuZGVzY2VuZGVyICovCisgICAgICAgIG1ldHJpY3MtPmFzY2VuZGVyICA9IChGVF9DaGFyKXN0cmlrZVsxNl0gKiA2NDsgIC8qIGhvcmkuYXNjZW5kZXIgICovCisgICAgICAgIG1ldHJpY3MtPmRlc2NlbmRlciA9IChGVF9DaGFyKXN0cmlrZVsxN10gKiA2NDsgIC8qIGhvcmkuZGVzY2VuZGVyICovCiAgICAgICAgIG1ldHJpY3MtPmhlaWdodCAgICA9IG1ldHJpY3MtPmFzY2VuZGVyIC0gbWV0cmljcy0+ZGVzY2VuZGVyOwogCiAgICAgICAgIC8qIElzIHRoaXMgY29ycmVjdD8gKi8KICAgICAgICAgbWV0cmljcy0+bWF4X2FkdmFuY2UgPSAoIChGVF9DaGFyKXN0cmlrZVsyMl0gKyAvKiBtaW5fb3JpZ2luX1NCICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWtlWzE4XSArIC8qIG1heF93aWR0aCAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQ2hhcilzdHJpa2VbMjNdICAgLyogbWluX2FkdmFuY2VfU0IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA8PCA2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICogNjQ7CiAgICAgICAgIHJldHVybiBGVF9FcnJfT2s7CiAgICAgICB9CiAKQEAgLTI3Myw2ICsyNzMsNyBAQAogICAgICAgICBGVF9VU2hvcnQgICAgICAgcHBlbSwgcmVzb2x1dGlvbjsKICAgICAgICAgVFRfSG9yaUhlYWRlciAgKmhvcmk7CiAgICAgICAgIEZUX1VMb25nICAgICAgICB0YWJsZV9zaXplOworICAgICAgICBGVF9Qb3MgICAgICAgICAgcHBlbV8sIHVwZW1fOyAvKiB0byByZWR1Y2UgY2FzdHMgKi8KIAogICAgICAgICBGVF9FcnJvciAgZXJyb3I7CiAgICAgICAgIEZUX0J5dGUqICBwOwpAQCAtMzA1LDEyICszMDYsMTUgQEAKICAgICAgICAgbWV0cmljcy0+eF9wcGVtID0gcHBlbTsKICAgICAgICAgbWV0cmljcy0+eV9wcGVtID0gcHBlbTsKIAotICAgICAgICBtZXRyaWNzLT5hc2NlbmRlciAgICA9IHBwZW0gKiBob3JpLT5Bc2NlbmRlciAqIDY0IC8gdXBlbTsKLSAgICAgICAgbWV0cmljcy0+ZGVzY2VuZGVyICAgPSBwcGVtICogaG9yaS0+RGVzY2VuZGVyICogNjQgLyB1cGVtOwotICAgICAgICBtZXRyaWNzLT5oZWlnaHQgICAgICA9IHBwZW0gKiAoIGhvcmktPkFzY2VuZGVyIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3JpLT5EZXNjZW5kZXIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcmktPkxpbmVfR2FwICkgKiA2NCAvIHVwZW07Ci0gICAgICAgIG1ldHJpY3MtPm1heF9hZHZhbmNlID0gcHBlbSAqIGhvcmktPmFkdmFuY2VfV2lkdGhfTWF4ICogNjQgLyB1cGVtOworICAgICAgICBwcGVtXyA9IChGVF9Qb3MpcHBlbTsKKyAgICAgICAgdXBlbV8gPSAoRlRfUG9zKXVwZW07CisKKyAgICAgICAgbWV0cmljcy0+YXNjZW5kZXIgICAgPSBwcGVtXyAqIGhvcmktPkFzY2VuZGVyICogNjQgLyB1cGVtXzsKKyAgICAgICAgbWV0cmljcy0+ZGVzY2VuZGVyICAgPSBwcGVtXyAqIGhvcmktPkRlc2NlbmRlciAqIDY0IC8gdXBlbV87CisgICAgICAgIG1ldHJpY3MtPmhlaWdodCAgICAgID0gcHBlbV8gKiAoIGhvcmktPkFzY2VuZGVyIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yaS0+RGVzY2VuZGVyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yaS0+TGluZV9HYXAgKSAqIDY0IC8gdXBlbV87CisgICAgICAgIG1ldHJpY3MtPm1heF9hZHZhbmNlID0gcHBlbV8gKiBob3JpLT5hZHZhbmNlX1dpZHRoX01heCAqIDY0IC8gdXBlbV87CiAKICAgICAgICAgcmV0dXJuIGVycm9yOwogICAgICAgfQpAQCAtNDIwLDcgKzQyNCw3IEBACiAgICAgRlRfRXJyb3IgICAgZXJyb3IgPSBGVF9FcnJfT2s7CiAgICAgRlRfVUludCAgICAgd2lkdGgsIGhlaWdodDsKICAgICBGVF9CaXRtYXAqICBtYXAgPSBkZWNvZGVyLT5iaXRtYXA7Ci0gICAgRlRfTG9uZyAgICAgc2l6ZTsKKyAgICBGVF9VTG9uZyAgICBzaXplOwogCiAKICAgICBpZiAoICFkZWNvZGVyLT5tZXRyaWNzX2xvYWRlZCApCkBAIC00MzIsMzggKzQzNiwzOCBAQAogICAgIHdpZHRoICA9IGRlY29kZXItPm1ldHJpY3MtPndpZHRoOwogICAgIGhlaWdodCA9IGRlY29kZXItPm1ldHJpY3MtPmhlaWdodDsKIAotICAgIG1hcC0+d2lkdGggPSAoaW50KXdpZHRoOwotICAgIG1hcC0+cm93cyAgPSAoaW50KWhlaWdodDsKKyAgICBtYXAtPndpZHRoID0gd2lkdGg7CisgICAgbWFwLT5yb3dzICA9IGhlaWdodDsKIAogICAgIHN3aXRjaCAoIGRlY29kZXItPmJpdF9kZXB0aCApCiAgICAgewogICAgIGNhc2UgMToKICAgICAgIG1hcC0+cGl4ZWxfbW9kZSA9IEZUX1BJWEVMX01PREVfTU9OTzsKLSAgICAgIG1hcC0+cGl0Y2ggICAgICA9ICggbWFwLT53aWR0aCArIDcgKSA+PiAzOworICAgICAgbWFwLT5waXRjaCAgICAgID0gKGludCkoICggbWFwLT53aWR0aCArIDcgKSA+PiAzICk7CiAgICAgICBtYXAtPm51bV9ncmF5cyAgPSAyOwogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDI6CiAgICAgICBtYXAtPnBpeGVsX21vZGUgPSBGVF9QSVhFTF9NT0RFX0dSQVkyOwotICAgICAgbWFwLT5waXRjaCAgICAgID0gKCBtYXAtPndpZHRoICsgMyApID4+IDI7CisgICAgICBtYXAtPnBpdGNoICAgICAgPSAoaW50KSggKCBtYXAtPndpZHRoICsgMyApID4+IDIgKTsKICAgICAgIG1hcC0+bnVtX2dyYXlzICA9IDQ7CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgNDoKICAgICAgIG1hcC0+cGl4ZWxfbW9kZSA9IEZUX1BJWEVMX01PREVfR1JBWTQ7Ci0gICAgICBtYXAtPnBpdGNoICAgICAgPSAoIG1hcC0+d2lkdGggKyAxICkgPj4gMTsKKyAgICAgIG1hcC0+cGl0Y2ggICAgICA9IChpbnQpKCAoIG1hcC0+d2lkdGggKyAxICkgPj4gMSApOwogICAgICAgbWFwLT5udW1fZ3JheXMgID0gMTY7CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgODoKICAgICAgIG1hcC0+cGl4ZWxfbW9kZSA9IEZUX1BJWEVMX01PREVfR1JBWTsKLSAgICAgIG1hcC0+cGl0Y2ggICAgICA9IG1hcC0+d2lkdGg7CisgICAgICBtYXAtPnBpdGNoICAgICAgPSAoaW50KSggbWFwLT53aWR0aCApOwogICAgICAgbWFwLT5udW1fZ3JheXMgID0gMjU2OwogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDMyOgogICAgICAgbWFwLT5waXhlbF9tb2RlID0gRlRfUElYRUxfTU9ERV9CR1JBOwotICAgICAgbWFwLT5waXRjaCAgICAgID0gbWFwLT53aWR0aCAqIDQ7CisgICAgICBtYXAtPnBpdGNoICAgICAgPSAoaW50KSggbWFwLT53aWR0aCAqIDQgKTsKICAgICAgIG1hcC0+bnVtX2dyYXlzICA9IDI1NjsKICAgICAgIGJyZWFrOwogCkBAIC00NzIsNyArNDc2LDcgQEAKICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKLSAgICBzaXplID0gbWFwLT5yb3dzICogbWFwLT5waXRjaDsKKyAgICBzaXplID0gbWFwLT5yb3dzICogKEZUX1VMb25nKW1hcC0+cGl0Y2g7CiAKICAgICAvKiBjaGVjayB0aGF0IHRoZXJlIGlzIG5vIGVtcHR5IGltYWdlICovCiAgICAgaWYgKCBzaXplID09IDAgKQpAQCAtNTYxLDcgKzU2NSw4IEBACiAgIHsKICAgICBGVF9FcnJvciAgICBlcnJvciA9IEZUX0Vycl9PazsKICAgICBGVF9CeXRlKiAgICBsaW5lOwotICAgIEZUX0ludCAgICAgIGJpdF9oZWlnaHQsIGJpdF93aWR0aCwgcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIGxpbmVfYml0cywgaDsKKyAgICBGVF9JbnQgICAgICBwaXRjaCwgd2lkdGgsIGhlaWdodCwgbGluZV9iaXRzLCBoOworICAgIEZUX1VJbnQgICAgIGJpdF9oZWlnaHQsIGJpdF93aWR0aDsKICAgICBGVF9CaXRtYXAqICBiaXRtYXA7CiAKIApAQCAtNTc3LDggKzU4Miw4IEBACiAKICAgICBsaW5lX2JpdHMgPSB3aWR0aCAqIGRlY29kZXItPmJpdF9kZXB0aDsKIAotICAgIGlmICggeF9wb3MgPCAwIHx8IHhfcG9zICsgd2lkdGggPiBiaXRfd2lkdGggICB8fAotICAgICAgICAgeV9wb3MgPCAwIHx8IHlfcG9zICsgaGVpZ2h0ID4gYml0X2hlaWdodCApCisgICAgaWYgKCB4X3BvcyA8IDAgfHwgKEZUX1VJbnQpKCB4X3BvcyArIHdpZHRoICkgPiBiaXRfd2lkdGggICB8fAorICAgICAgICAgeV9wb3MgPCAwIHx8IChGVF9VSW50KSggeV9wb3MgKyBoZWlnaHQgKSA+IGJpdF9oZWlnaHQgKQogICAgIHsKICAgICAgIEZUX1RSQUNFMSgoICJ0dF9zYml0X2RlY29kZXJfbG9hZF9ieXRlX2FsaWduZWQ6IgogICAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIGJpdG1hcCBkaW1lbnNpb25zXG4iICkpOwpAQCAtNjk5LDcgKzcwNCw4IEBACiAgIHsKICAgICBGVF9FcnJvciAgICBlcnJvciA9IEZUX0Vycl9PazsKICAgICBGVF9CeXRlKiAgICBsaW5lOwotICAgIEZUX0ludCAgICAgIGJpdF9oZWlnaHQsIGJpdF93aWR0aCwgcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIGxpbmVfYml0cywgaCwgbmJpdHM7CisgICAgRlRfSW50ICAgICAgcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIGxpbmVfYml0cywgaCwgbmJpdHM7CisgICAgRlRfVUludCAgICAgYml0X2hlaWdodCwgYml0X3dpZHRoOwogICAgIEZUX0JpdG1hcCogIGJpdG1hcDsKICAgICBGVF9VU2hvcnQgICBydmFsOwogCkBAIC03MTYsOCArNzIyLDggQEAKIAogICAgIGxpbmVfYml0cyA9IHdpZHRoICogZGVjb2Rlci0+Yml0X2RlcHRoOwogCi0gICAgaWYgKCB4X3BvcyA8IDAgfHwgeF9wb3MgKyB3aWR0aCAgPiBiaXRfd2lkdGggIHx8Ci0gICAgICAgICB5X3BvcyA8IDAgfHwgeV9wb3MgKyBoZWlnaHQgPiBiaXRfaGVpZ2h0ICkKKyAgICBpZiAoIHhfcG9zIDwgMCB8fCAoRlRfVUludCkoIHhfcG9zICsgd2lkdGggKSA+IGJpdF93aWR0aCAgIHx8CisgICAgICAgICB5X3BvcyA8IDAgfHwgKEZUX1VJbnQpKCB5X3BvcyArIGhlaWdodCApID4gYml0X2hlaWdodCApCiAgICAgewogICAgICAgRlRfVFJBQ0UxKCggInR0X3NiaXRfZGVjb2Rlcl9sb2FkX2JpdF9hbGlnbmVkOiIKICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBiaXRtYXAgZGltZW5zaW9uc1xuIiApKTsKQEAgLTEzNzksOSArMTM4NSw5IEBACiAKICAgICAgIG1ldHJpY3MtPmhvcmlCZWFyaW5nWCA9IChGVF9TaG9ydClvcmlnaW5PZmZzZXRYOwogICAgICAgbWV0cmljcy0+aG9yaUJlYXJpbmdZID0gKEZUX1Nob3J0KSggLW9yaWdpbk9mZnNldFkgKyBtZXRyaWNzLT5oZWlnaHQgKTsKLSAgICAgIG1ldHJpY3MtPmhvcmlBZHZhbmNlICA9IChGVF9TaG9ydCkoIGFhZHZhbmNlICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnJvb3Quc2l6ZS0+bWV0cmljcy54X3BwZW0gLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+aGVhZGVyLlVuaXRzX1Blcl9FTSApOworICAgICAgbWV0cmljcy0+aG9yaUFkdmFuY2UgID0gKEZUX1VTaG9ydCkoIGFhZHZhbmNlICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5yb290LnNpemUtPm1ldHJpY3MueF9wcGVtIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5oZWFkZXIuVW5pdHNfUGVyX0VNICk7CiAgICAgfQogCiAgICAgcmV0dXJuIGVycm9yOwpAQCAtMTQ0Miw3ICsxNDQ4LDcgQEAKICAgICAgIEZUX0xpYnJhcnkgIGxpYnJhcnkgPSBmYWNlLT5yb290LmdseXBoLT5saWJyYXJ5OwogCiAKLSAgICAgIEZUX0JpdG1hcF9OZXcoICZuZXdfbWFwICk7CisgICAgICBGVF9CaXRtYXBfSW5pdCggJm5ld19tYXAgKTsKIAogICAgICAgLyogQ29udmVydCB0byA4Yml0IGdyYXlzY2FsZS4gKi8KICAgICAgIGVycm9yID0gRlRfQml0bWFwX0NvbnZlcnQoIGxpYnJhcnksIG1hcCwgJm5ld19tYXAsIDEgKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0c2JpdC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRzYml0LmgKaW5kZXggNjk1ZDBkOC4uZDRlMTNhZSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRzYml0LmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRzYml0LmgKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGVtYmVkZGVkIGJpdG1hcCBzdXBwb3J0IChzcGVjaWZpY2F0aW9uKS4gICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwOCwgMjAxMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvSmFtZmlsZSBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvSmFtZmlsZQppbmRleCBhODQ5NmFhLi5iMTg4N2MyIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc21vb3RoL0phbWZpbGUKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Ntb290aC9KYW1maWxlCkBAIC0xLDYgKzEsNiBAQAogIyBGcmVlVHlwZSAyIHNyYy9zbW9vdGggSmFtZmlsZQogIwotIyBDb3B5cmlnaHQgMjAwMSBieQorIyBDb3B5cmlnaHQgMjAwMS0yMDE1IGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKQEAgLTE2LDcgKzE2LDEwIEBACiAKICAgaWYgJChGVDJfTVVMVEkpCiAgIHsKLSAgICBfc291cmNlcyA9IGZ0Z3JheXMgZnRzbW9vdGggZnRzcGljIDsKKyAgICBfc291cmNlcyA9IGZ0Z3JheXMKKyAgICAgICAgICAgICAgIGZ0c21vb3RoCisgICAgICAgICAgICAgICBmdHNwaWMKKyAgICAgICAgICAgICAgIDsKICAgfQogICBlbHNlCiAgIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvZnRncmF5cy5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Ntb290aC9mdGdyYXlzLmMKaW5kZXggOWQzN2Q2NC4uYmEyOTQ0NSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Ntb290aC9mdGdyYXlzLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Ntb290aC9mdGdyYXlzLmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgQSBuZXcgYHBlcmZlY3QnIGFudGktYWxpYXNpbmcgcmVuZGVyZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDAtMjAwMywgMjAwNS0yMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAwLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KQEAgLTI0LDggKzI0LDggQEAKICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qIC0gY29weSBgc3JjL3Ntb290aC9mdGdyYXlzLmMnICh0aGlzIGZpbGUpIHRvIHlvdXIgY3VycmVudCBkaXJlY3RvcnkgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSBjb3B5IGBpbmNsdWRlL2Z0aW1hZ2UuaCcgYW5kIGBzcmMvc21vb3RoL2Z0Z3JheXMuaCcgdG8gdGhlIHNhbWUgICAgICovCi0gIC8qICAgZGlyZWN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAtIGNvcHkgYGluY2x1ZGUvZnJlZXR5cGUvZnRpbWFnZS5oJyBhbmQgYHNyYy9zbW9vdGgvZnRncmF5cy5oJyB0byB0aGUgKi8KKyAgLyogICBzYW1lIGRpcmVjdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAtIGNvbXBpbGUgYGZ0Z3JheXMnIHdpdGggdGhlIF9TVEFOREFMT05FXyBtYWNybyBkZWZpbmVkLCBhcyBpbiAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC05NCw2ICs5NCwxMSBAQAogI2lmZGVmIF9TVEFOREFMT05FXwogCiAKKyAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlbmRlciBwb29sIHVzZWQgYnkgdGhlIHNjYW4tbGluZSBjb252ZXJ0ZXIgICovCisgIC8qIHRvIGRvIGFsbCBvZiBpdHMgd29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9SRU5ERVJfUE9PTF9TSVpFICAxNjM4NEwKKworCiAgIC8qIEF1eGlsaWFyeSBtYWNyb3MgZm9yIHRva2VuIGNvbmNhdGVuYXRpb24uICovCiAjZGVmaW5lIEZUX0VSUl9YQ0FUKCB4LCB5ICkgIHggIyMgeQogI2RlZmluZSBGVF9FUlJfQ0FUKCB4LCB5ICkgICBGVF9FUlJfWENBVCggeCwgeSApCkBAIC0xMDEsNiArMTA2LDIxIEBACiAjZGVmaW5lIEZUX0JFR0lOX1NUTU5UICBkbyB7CiAjZGVmaW5lIEZUX0VORF9TVE1OVCAgICB9IHdoaWxlICggMCApCiAKKyNkZWZpbmUgRlRfTUFYKCBhLCBiICkgICggKGEpID4gKGIpID8gKGEpIDogKGIpICkKKyNkZWZpbmUgRlRfQUJTKCBhICkgICAgICggKGEpIDwgMCA/IC0oYSkgOiAoYSkgKQorCisKKyAgLyoKKyAgICogIEFwcHJveGltYXRlIHNxcnQoeCp4K3kqeSkgdXNpbmcgdGhlIGBhbHBoYSBtYXggcGx1cyBiZXRhIG1pbicKKyAgICogIGFsZ29yaXRobS4gIFdlIHVzZSBhbHBoYSA9IDEsIGJldGEgPSAzLzgsIGdpdmluZyB1cyByZXN1bHRzIHdpdGggYQorICAgKiAgbGFyZ2VzdCBlcnJvciBsZXNzIHRoYW4gNyUgY29tcGFyZWQgdG8gdGhlIGV4YWN0IHZhbHVlLgorICAgKi8KKyNkZWZpbmUgRlRfSFlQT1QoIHgsIHkgKSAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICggeCA9IEZUX0FCUyggeCApLCAgICAgICAgICAgICBcCisgICAgICAgICAgICB5ID0gRlRfQUJTKCB5ICksICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHggPiB5ID8geCArICggMyAqIHkgPj4gMyApICAgXAorICAgICAgICAgICAgICAgICAgOiB5ICsgKCAzICogeCA+PiAzICkgKQorCiAKICAgLyogZGVmaW5lIHRoaXMgdG8gZHVtcCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKi8KIC8qICNkZWZpbmUgRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KQEAgLTI5Nyw3ICszMTcsNiBAQAogI3VuZGVmIFNDQUxFRAogCiAjZGVmaW5lIE9ORV9QSVhFTCAgICAgICAoIDFMIDw8IFBJWEVMX0JJVFMgKQotI2RlZmluZSBQSVhFTF9NQVNLICAgICAgKCAtMUwgPDwgUElYRUxfQklUUyApCiAjZGVmaW5lIFRSVU5DKCB4ICkgICAgICAoIChUQ29vcmQpKCAoeCkgPj4gUElYRUxfQklUUyApICkKICNkZWZpbmUgU1VCUElYRUxTKCB4ICkgICggKFRQb3MpKHgpIDw8IFBJWEVMX0JJVFMgKQogI2RlZmluZSBGTE9PUiggeCApICAgICAgKCAoeCkgJiAtT05FX1BJWEVMICkKQEAgLTQwNSw2ICs0MjQsOCBAQAogCiAgIHR5cGVkZWYgc3RydWN0ICBncmF5X1RXb3JrZXJfCiAgIHsKKyAgICBmdF9qbXBfYnVmICBqdW1wX2J1ZmZlcjsKKwogICAgIFRDb29yZCAgZXgsIGV5OwogICAgIFRQb3MgICAgbWluX2V4LCBtYXhfZXg7CiAgICAgVFBvcyAgICBtaW5fZXksIG1heF9leTsKQEAgLTQxOCwxMSArNDM5LDggQEAKICAgICBGVF9QdHJEaXN0ICBtYXhfY2VsbHM7CiAgICAgRlRfUHRyRGlzdCAgbnVtX2NlbGxzOwogCi0gICAgVENvb3JkICBjeCwgY3k7CiAgICAgVFBvcyAgICB4LCAgeTsKIAotICAgIFRQb3MgICAgbGFzdF9leTsKLQogICAgIEZUX1ZlY3RvciAgIGJlel9zdGFja1szMiAqIDMgKyAxXTsKICAgICBpbnQgICAgICAgICBsZXZfc3RhY2tbMzJdOwogCkBAIC00NDAsOCArNDU4LDYgQEAKICAgICBpbnQgIGJhbmRfc2l6ZTsKICAgICBpbnQgIGJhbmRfc2hvb3Q7CiAKLSAgICBmdF9qbXBfYnVmICBqdW1wX2J1ZmZlcjsKLQogICAgIHZvaWQqICAgICAgIGJ1ZmZlcjsKICAgICBsb25nICAgICAgICBidWZmZXJfc2l6ZTsKIApAQCAtNDY0LDExICs0ODAsNyBAQAogCiAgIHR5cGVkZWYgc3RydWN0IGdyYXlfVFJhc3Rlcl8KICAgewotICAgIHZvaWQqICAgICAgICAgYnVmZmVyOwotICAgIGxvbmcgICAgICAgICAgYnVmZmVyX3NpemU7Ci0gICAgaW50ICAgICAgICAgICBiYW5kX3NpemU7CiAgICAgdm9pZCogICAgICAgICBtZW1vcnk7Ci0gICAgZ3JheV9QV29ya2VyICB3b3JrZXI7CiAKICAgfSBncmF5X1RSYXN0ZXIsICpncmF5X1BSYXN0ZXI7CiAKQEAgLTQ4MCw3ICs0OTIsNyBAQAogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKICAgZ3JheV9pbml0X2NlbGxzKCBSQVNfQVJHXyB2b2lkKiAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgICBieXRlX3NpemUgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICBieXRlX3NpemUgKQogICB7CiAgICAgcmFzLmJ1ZmZlciAgICAgID0gYnVmZmVyOwogICAgIHJhcy5idWZmZXJfc2l6ZSA9IGJ5dGVfc2l6ZTsKQEAgLTYzOCw4ICs2NTAsOCBAQAogICAgICAgcmFzLmV5ICAgID0gZXk7CiAgICAgfQogCi0gICAgcmFzLmludmFsaWQgPSAoICh1bnNpZ25lZClleSA+PSAodW5zaWduZWQpcmFzLmNvdW50X2V5IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleCA+PSByYXMuY291bnRfZXggICAgICAgICAgICk7CisgICAgcmFzLmludmFsaWQgPSAoICh1bnNpZ25lZCBpbnQpZXkgPj0gKHVuc2lnbmVkIGludClyYXMuY291bnRfZXkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleCA+PSByYXMuY291bnRfZXggICAgICAgICAgICAgICApOwogICB9CiAKIApAQCAtNjYxLDcgKzY3Myw2IEBACiAgICAgcmFzLmNvdmVyICAgPSAwOwogICAgIHJhcy5leCAgICAgID0gZXggLSByYXMubWluX2V4OwogICAgIHJhcy5leSAgICAgID0gZXkgLSByYXMubWluX2V5OwotICAgIHJhcy5sYXN0X2V5ID0gU1VCUElYRUxTKCBleSApOwogICAgIHJhcy5pbnZhbGlkID0gMDsKIAogICAgIGdyYXlfc2V0X2NlbGwoIFJBU19WQVJfIGV4LCBleSApOwpAQCAtNzQyLDcgKzc1Myw3IEBACiAKICAgICAgIG1vZCAtPSAoaW50KWR4OwogCi0gICAgICB3aGlsZSAoIGV4MSAhPSBleDIgKQorICAgICAgZG8KICAgICAgIHsKICAgICAgICAgZGVsdGEgPSBsaWZ0OwogICAgICAgICBtb2QgICs9IHJlbTsKQEAgLTc1Nyw3ICs3NjgsNyBAQAogICAgICAgICB5MSAgICAgICAgKz0gZGVsdGE7CiAgICAgICAgIGV4MSAgICAgICArPSBpbmNyOwogICAgICAgICBncmF5X3NldF9jZWxsKCBSQVNfVkFSXyBleDEsIGV5ICk7Ci0gICAgICB9CisgICAgICB9IHdoaWxlICggZXgxICE9IGV4MiApOwogICAgIH0KIAogICAgIGRlbHRhICAgICAgPSB5MiAtIHkxOwpAQCAtNzgwLDI5ICs3OTEsMTggQEAKICAgICBpbnQgICAgIGRlbHRhLCByZW0sIGxpZnQsIGluY3I7CiAKIAotICAgIGV5MSA9IFRSVU5DKCByYXMubGFzdF9leSApOworICAgIGV5MSA9IFRSVU5DKCByYXMueSApOwogICAgIGV5MiA9IFRSVU5DKCB0b195ICk7ICAgICAvKiBpZiAoZXkyID49IHJhcy5tYXhfZXkpIGV5MiA9IHJhcy5tYXhfZXktMTsgKi8KLSAgICBmeTEgPSAoVENvb3JkKSggcmFzLnkgLSByYXMubGFzdF9leSApOworICAgIGZ5MSA9IChUQ29vcmQpKCByYXMueSAtIFNVQlBJWEVMUyggZXkxICkgKTsKICAgICBmeTIgPSAoVENvb3JkKSggdG9feSAtIFNVQlBJWEVMUyggZXkyICkgKTsKIAogICAgIGR4ID0gdG9feCAtIHJhcy54OwogICAgIGR5ID0gdG9feSAtIHJhcy55OwogCiAgICAgLyogcGVyZm9ybSB2ZXJ0aWNhbCBjbGlwcGluZyAqLwotICAgIHsKLSAgICAgIFRDb29yZCAgbWluLCBtYXg7Ci0KLQotICAgICAgbWluID0gZXkxOwotICAgICAgbWF4ID0gZXkyOwotICAgICAgaWYgKCBleTEgPiBleTIgKQotICAgICAgewotICAgICAgICBtaW4gPSBleTI7Ci0gICAgICAgIG1heCA9IGV5MTsKLSAgICAgIH0KLSAgICAgIGlmICggbWluID49IHJhcy5tYXhfZXkgfHwgbWF4IDwgcmFzLm1pbl9leSApCi0gICAgICAgIGdvdG8gRW5kOwotICAgIH0KKyAgICBpZiAoICggZXkxID49IHJhcy5tYXhfZXkgJiYgZXkyID49IHJhcy5tYXhfZXkgKSB8fAorICAgICAgICAgKCBleTEgPCAgcmFzLm1pbl9leSAmJiBleTIgPCAgcmFzLm1pbl9leSApICkKKyAgICAgIGdvdG8gRW5kOwogCiAgICAgLyogZXZlcnl0aGluZyBpcyBvbiBhIHNpbmdsZSBzY2FubGluZSAqLwogICAgIGlmICggZXkxID09IGV5MiApCkBAIC04ODAsNyArODgwLDcgQEAKICAgICAgIEZUX0RJVl9NT0QoIGludCwgcCwgZHksIGxpZnQsIHJlbSApOwogICAgICAgbW9kIC09IChpbnQpZHk7CiAKLSAgICAgIHdoaWxlICggZXkxICE9IGV5MiApCisgICAgICBkbwogICAgICAgewogICAgICAgICBkZWx0YSA9IGxpZnQ7CiAgICAgICAgIG1vZCAgKz0gcmVtOwpAQCAtODk4LDcgKzg5OCw3IEBACiAKICAgICAgICAgZXkxICs9IGluY3I7CiAgICAgICAgIGdyYXlfc2V0X2NlbGwoIFJBU19WQVJfIFRSVU5DKCB4ICksIGV5MSApOwotICAgICAgfQorICAgICAgfSB3aGlsZSAoIGV5MSAhPSBleTIgKTsKICAgICB9CiAKICAgICBncmF5X3JlbmRlcl9zY2FubGluZSggUkFTX1ZBUl8gZXkxLCB4LApAQCAtOTA4LDcgKzkwOCw2IEBACiAgIEVuZDoKICAgICByYXMueCAgICAgICA9IHRvX3g7CiAgICAgcmFzLnkgICAgICAgPSB0b195OwotICAgIHJhcy5sYXN0X2V5ID0gU1VCUElYRUxTKCBleTIgKTsKICAgfQogCiAKQEAgLTEyMTIsNyArMTIxMSw3IEBACiAgICAgLyogZmlyc3Qgb2YgYWxsLCBjb21wdXRlIHRoZSBzY2FubGluZSBvZmZzZXQgKi8KICAgICBwID0gKHVuc2lnbmVkIGNoYXIqKW1hcC0+YnVmZmVyIC0geSAqIG1hcC0+cGl0Y2g7CiAgICAgaWYgKCBtYXAtPnBpdGNoID49IDAgKQotICAgICAgcCArPSAodW5zaWduZWQpKCAoIG1hcC0+cm93cyAtIDEgKSAqIG1hcC0+cGl0Y2ggKTsKKyAgICAgIHAgKz0gKCBtYXAtPnJvd3MgLSAxICkgKiAodW5zaWduZWQgaW50KW1hcC0+cGl0Y2g7CiAKICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgc3BhbnMrKyApCiAgICAgewpAQCAtMTc0NCwxNCArMTc0MywxNyBAQAogCiAgIH0gZ3JheV9UQmFuZDsKIAotICAgIEZUX0RFRklORV9PVVRMSU5FX0ZVTkNTKGZ1bmNfaW50ZXJmYWNlLAotICAgICAgKEZUX091dGxpbmVfTW92ZVRvX0Z1bmMpIGdyYXlfbW92ZV90bywKLSAgICAgIChGVF9PdXRsaW5lX0xpbmVUb19GdW5jKSBncmF5X2xpbmVfdG8sCi0gICAgICAoRlRfT3V0bGluZV9Db25pY1RvX0Z1bmMpZ3JheV9jb25pY190bywKLSAgICAgIChGVF9PdXRsaW5lX0N1YmljVG9fRnVuYylncmF5X2N1YmljX3RvLAotICAgICAgMCwKLSAgICAgIDAKLSAgICApCisKKyAgRlRfREVGSU5FX09VVExJTkVfRlVOQ1MoCisgICAgZnVuY19pbnRlcmZhY2UsCisKKyAgICAoRlRfT3V0bGluZV9Nb3ZlVG9fRnVuYykgZ3JheV9tb3ZlX3RvLAorICAgIChGVF9PdXRsaW5lX0xpbmVUb19GdW5jKSBncmF5X2xpbmVfdG8sCisgICAgKEZUX091dGxpbmVfQ29uaWNUb19GdW5jKWdyYXlfY29uaWNfdG8sCisgICAgKEZUX091dGxpbmVfQ3ViaWNUb19GdW5jKWdyYXlfY3ViaWNfdG8sCisgICAgMCwKKyAgICAwICkKKwogCiAgIHN0YXRpYyBpbnQKICAgZ3JheV9jb252ZXJ0X2dseXBoX2lubmVyKCBSQVNfQVJHICkKQEAgLTE4MjgsNyArMTgzMCw3IEBACiAgICAgICBiYW5kc1swXS5tYXggPSBtYXg7CiAgICAgICBiYW5kICAgICAgICAgPSBiYW5kczsKIAotICAgICAgd2hpbGUgKCBiYW5kID49IGJhbmRzICkKKyAgICAgIGRvCiAgICAgICB7CiAgICAgICAgIFRQb3MgIGJvdHRvbSwgdG9wLCBtaWRkbGU7CiAgICAgICAgIGludCAgIGVycm9yOwpAQCAtMTg0MiwxMyArMTg0NCwxMyBAQAogICAgICAgICAgIHJhcy55Y2VsbHMgPSAoUENlbGwqKXJhcy5idWZmZXI7CiAgICAgICAgICAgcmFzLnljb3VudCA9IGJhbmQtPm1heCAtIGJhbmQtPm1pbjsKIAotICAgICAgICAgIGNlbGxfc3RhcnQgPSBzaXplb2YgKCBQQ2VsbCApICogcmFzLnljb3VudDsKLSAgICAgICAgICBjZWxsX21vZCAgID0gY2VsbF9zdGFydCAlIHNpemVvZiAoIFRDZWxsICk7CisgICAgICAgICAgY2VsbF9zdGFydCA9IChsb25nKXNpemVvZiAoIFBDZWxsICkgKiByYXMueWNvdW50OworICAgICAgICAgIGNlbGxfbW9kICAgPSBjZWxsX3N0YXJ0ICUgKGxvbmcpc2l6ZW9mICggVENlbGwgKTsKICAgICAgICAgICBpZiAoIGNlbGxfbW9kID4gMCApCi0gICAgICAgICAgICBjZWxsX3N0YXJ0ICs9IHNpemVvZiAoIFRDZWxsICkgLSBjZWxsX21vZDsKKyAgICAgICAgICAgIGNlbGxfc3RhcnQgKz0gKGxvbmcpc2l6ZW9mICggVENlbGwgKSAtIGNlbGxfbW9kOwogCiAgICAgICAgICAgY2VsbF9lbmQgID0gcmFzLmJ1ZmZlcl9zaXplOwotICAgICAgICAgIGNlbGxfZW5kIC09IGNlbGxfZW5kICUgc2l6ZW9mICggVENlbGwgKTsKKyAgICAgICAgICBjZWxsX2VuZCAtPSBjZWxsX2VuZCAlIChsb25nKXNpemVvZiAoIFRDZWxsICk7CiAKICAgICAgICAgICBjZWxsc19tYXggPSAoUENlbGwpKCAoY2hhciopcmFzLmJ1ZmZlciArIGNlbGxfZW5kICk7CiAgICAgICAgICAgcmFzLmNlbGxzID0gKFBDZWxsKSggKGNoYXIqKXJhcy5idWZmZXIgKyBjZWxsX3N0YXJ0ICk7CkBAIC0xOTA0LDcgKzE5MDYsNyBAQAogICAgICAgICBiYW5kWzBdLm1pbiA9IG1pZGRsZTsKICAgICAgICAgYmFuZFswXS5tYXggPSB0b3A7CiAgICAgICAgIGJhbmQrKzsKLSAgICAgIH0KKyAgICAgIH0gd2hpbGUgKCBiYW5kID49IGJhbmRzICk7CiAgICAgfQogCiAgICAgaWYgKCByYXMuYmFuZF9zaG9vdCA+IDggJiYgcmFzLmJhbmRfc2l6ZSA+IDE2ICkKQEAgLTE5MTgsMTIgKzE5MjAsMTggQEAKICAgZ3JheV9yYXN0ZXJfcmVuZGVyKCBncmF5X1BSYXN0ZXIgICAgICAgICAgICAgcmFzdGVyLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1Jhc3Rlcl9QYXJhbXMqICBwYXJhbXMgKQogICB7Ci0gICAgY29uc3QgRlRfT3V0bGluZSogIG91dGxpbmUgICAgPSAoY29uc3QgRlRfT3V0bGluZSopcGFyYW1zLT5zb3VyY2U7Ci0gICAgY29uc3QgRlRfQml0bWFwKiAgIHRhcmdldF9tYXAgPSBwYXJhbXMtPnRhcmdldDsKLSAgICBncmF5X1BXb3JrZXIgICAgICAgd29ya2VyOworICAgIGNvbnN0IEZUX091dGxpbmUqICBvdXRsaW5lICAgICA9IChjb25zdCBGVF9PdXRsaW5lKilwYXJhbXMtPnNvdXJjZTsKKyAgICBjb25zdCBGVF9CaXRtYXAqICAgdGFyZ2V0X21hcCAgPSBwYXJhbXMtPnRhcmdldDsKKworICAgIGdyYXlfVFdvcmtlciAgd29ya2VyWzFdOworCisgICAgVENlbGwgIGJ1ZmZlcltGVF9NQVgoIEZUX1JFTkRFUl9QT09MX1NJWkUsIDIwNDggKSAvIHNpemVvZiAoIFRDZWxsICldOworICAgIGxvbmcgICBidWZmZXJfc2l6ZSA9IHNpemVvZiAoIGJ1ZmZlciApOworICAgIGludCAgICBiYW5kX3NpemUgICA9IChpbnQpKCBidWZmZXJfc2l6ZSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKSggc2l6ZW9mICggVENlbGwgKSAqIDggKSApOwogCiAKLSAgICBpZiAoICFyYXN0ZXIgfHwgIXJhc3Rlci0+YnVmZmVyIHx8ICFyYXN0ZXItPmJ1ZmZlcl9zaXplICkKKyAgICBpZiAoICFyYXN0ZXIgKQogICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7CiAKICAgICBpZiAoICFvdXRsaW5lICkKQEAgLTE5NDAsOCArMTk0OCw2IEBACiAgICAgICAgICAgIG91dGxpbmUtPmNvbnRvdXJzW291dGxpbmUtPm5fY29udG91cnMgLSAxXSArIDEgKQogICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX091dGxpbmUgKTsKIAotICAgIHdvcmtlciA9IHJhc3Rlci0+d29ya2VyOwotCiAgICAgLyogaWYgZGlyZWN0IG1vZGUgaXMgbm90IHNldCwgd2UgbXVzdCBoYXZlIGEgdGFyZ2V0IGJpdG1hcCAqLwogICAgIGlmICggISggcGFyYW1zLT5mbGFncyAmIEZUX1JBU1RFUl9GTEFHX0RJUkVDVCApICkKICAgICB7CkBAIC0xOTY2LDggKzE5NzIsOCBAQAogICAgICAgLyogY29tcHV0ZSBjbGlwIGJveCBmcm9tIHRhcmdldCBwaXhtYXAgKi8KICAgICAgIHJhcy5jbGlwX2JveC54TWluID0gMDsKICAgICAgIHJhcy5jbGlwX2JveC55TWluID0gMDsKLSAgICAgIHJhcy5jbGlwX2JveC54TWF4ID0gdGFyZ2V0X21hcC0+d2lkdGg7Ci0gICAgICByYXMuY2xpcF9ib3gueU1heCA9IHRhcmdldF9tYXAtPnJvd3M7CisgICAgICByYXMuY2xpcF9ib3gueE1heCA9IChGVF9Qb3MpdGFyZ2V0X21hcC0+d2lkdGg7CisgICAgICByYXMuY2xpcF9ib3gueU1heCA9IChGVF9Qb3MpdGFyZ2V0X21hcC0+cm93czsKICAgICB9CiAgICAgZWxzZSBpZiAoIHBhcmFtcy0+ZmxhZ3MgJiBGVF9SQVNURVJfRkxBR19DTElQICkKICAgICAgIHJhcy5jbGlwX2JveCA9IHBhcmFtcy0+Y2xpcF9ib3g7CkBAIC0xOTc5LDEzICsxOTg1LDE0IEBACiAgICAgICByYXMuY2xpcF9ib3gueU1heCA9ICAzMjc2N0w7CiAgICAgfQogCi0gICAgZ3JheV9pbml0X2NlbGxzKCBSQVNfVkFSXyByYXN0ZXItPmJ1ZmZlciwgcmFzdGVyLT5idWZmZXJfc2l6ZSApOworICAgIGdyYXlfaW5pdF9jZWxscyggUkFTX1ZBUl8gYnVmZmVyLCBidWZmZXJfc2l6ZSApOwogCiAgICAgcmFzLm91dGxpbmUgICAgICAgID0gKm91dGxpbmU7CiAgICAgcmFzLm51bV9jZWxscyAgICAgID0gMDsKICAgICByYXMuaW52YWxpZCAgICAgICAgPSAxOwotICAgIHJhcy5iYW5kX3NpemUgICAgICA9IHJhc3Rlci0+YmFuZF9zaXplOworICAgIHJhcy5iYW5kX3NpemUgICAgICA9IGJhbmRfc2l6ZTsKICAgICByYXMubnVtX2dyYXlfc3BhbnMgPSAwOworICAgIHJhcy5zcGFuX3kgICAgICAgICA9IDA7CiAKICAgICBpZiAoIHBhcmFtcy0+ZmxhZ3MgJiBGVF9SQVNURVJfRkxBR19ESVJFQ1QgKQogICAgIHsKQEAgLTIwNjksMzQgKzIwNzYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICBwb29sX2Jhc2UsCiAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgIHBvb2xfc2l6ZSApCiAgIHsKLSAgICBncmF5X1BSYXN0ZXIgIHJhc3QgPSAoZ3JheV9QUmFzdGVyKXJhc3RlcjsKLQotCi0gICAgaWYgKCByYXN0ZXIgKQotICAgIHsKLSAgICAgIGlmICggcG9vbF9iYXNlICYmIHBvb2xfc2l6ZSA+PSAobG9uZylzaXplb2YgKCBncmF5X1RXb3JrZXIgKSArIDIwNDggKQotICAgICAgewotICAgICAgICBncmF5X1BXb3JrZXIgIHdvcmtlciA9IChncmF5X1BXb3JrZXIpcG9vbF9iYXNlOwotCi0KLSAgICAgICAgcmFzdC0+d29ya2VyICAgICAgPSB3b3JrZXI7Ci0gICAgICAgIHJhc3QtPmJ1ZmZlciAgICAgID0gcG9vbF9iYXNlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKCBzaXplb2YgKCBncmF5X1RXb3JrZXIgKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggVENlbGwgKSAtIDEgKSAgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCBzaXplb2YgKCBUQ2VsbCApIC0gMSApICk7Ci0gICAgICAgIHJhc3QtPmJ1ZmZlcl9zaXplID0gKGxvbmcpKCAoIHBvb2xfYmFzZSArIHBvb2xfc2l6ZSApIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKilyYXN0LT5idWZmZXIgKSAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oIHNpemVvZiAoIFRDZWxsICkgLSAxICk7Ci0gICAgICAgIHJhc3QtPmJhbmRfc2l6ZSAgID0gKGludCkoIHJhc3QtPmJ1ZmZlcl9zaXplIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHNpemVvZiAoIFRDZWxsICkgKiA4ICkgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmFzdC0+YnVmZmVyICAgICAgPSBOVUxMOwotICAgICAgICByYXN0LT5idWZmZXJfc2l6ZSA9IDA7Ci0gICAgICAgIHJhc3QtPndvcmtlciAgICAgID0gTlVMTDsKLSAgICAgIH0KLSAgICB9CisgICAgRlRfVU5VU0VEKCByYXN0ZXIgKTsKKyAgICBGVF9VTlVTRUQoIHBvb2xfYmFzZSApOworICAgIEZUX1VOVVNFRCggcG9vbF9zaXplICk7CiAgIH0KIAogCkBAIC0yMTE0LDE1ICsyMDk2LDE2IEBACiAgIH0KIAogCi0gIEZUX0RFRklORV9SQVNURVJfRlVOQ1MoZnRfZ3JheXNfcmFzdGVyLAorICBGVF9ERUZJTkVfUkFTVEVSX0ZVTkNTKAorICAgIGZ0X2dyYXlzX3Jhc3RlciwKKwogICAgIEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FLAogCiAgICAgKEZUX1Jhc3Rlcl9OZXdfRnVuYykgICAgIGdyYXlfcmFzdGVyX25ldywKICAgICAoRlRfUmFzdGVyX1Jlc2V0X0Z1bmMpICAgZ3JheV9yYXN0ZXJfcmVzZXQsCiAgICAgKEZUX1Jhc3Rlcl9TZXRfTW9kZV9GdW5jKWdyYXlfcmFzdGVyX3NldF9tb2RlLAogICAgIChGVF9SYXN0ZXJfUmVuZGVyX0Z1bmMpICBncmF5X3Jhc3Rlcl9yZW5kZXIsCi0gICAgKEZUX1Jhc3Rlcl9Eb25lX0Z1bmMpICAgIGdyYXlfcmFzdGVyX2RvbmUKLSAgKQorICAgIChGVF9SYXN0ZXJfRG9uZV9GdW5jKSAgICBncmF5X3Jhc3Rlcl9kb25lICkKIAogCiAvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvZnRncmF5cy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Ntb290aC9mdGdyYXlzLmgKaW5kZXggZjIwZjU1Zi4uMWI1NzYwMyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Ntb290aC9mdGdyYXlzLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Ntb290aC9mdGdyYXlzLmgKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgRnJlZVR5cGUgc21vb3RoIHJlbmRlcmVyIGRlY2xhcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvZnRzbWVycnMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvZnRzbWVycnMuaAppbmRleCA0MTNkMmYxLi5jYzM4YWExIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc21vb3RoL2Z0c21lcnJzLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Ntb290aC9mdHNtZXJycy5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIHNtb290aCByZW5kZXJlciBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLCAyMDEyIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwMS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc21vb3RoL2Z0c21vb3RoLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc21vb3RoL2Z0c21vb3RoLmMKaW5kZXggNGUyZGVlNS4uMzYyMDU1MCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Ntb290aC9mdHNtb290aC5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvZnRzbW9vdGguYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBBbnRpLWFsaWFzaW5nIHJlbmRlcmVyIGludGVyZmFjZSAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDA2LCAyMDA5LTIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDAtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtMjMwLDcgKzIzMCw3IEBACiAgICAgfQogCiAgICAgLyogYWxsb2NhdGUgbmV3IG9uZSAqLwotICAgIGlmICggRlRfQUxMT0MoIGJpdG1hcC0+YnVmZmVyLCAoRlRfVUxvbmcpcGl0Y2ggKiBoZWlnaHQgKSApCisgICAgaWYgKCBGVF9BTExPQyggYml0bWFwLT5idWZmZXIsIChGVF9VTG9uZykoIHBpdGNoICogaGVpZ2h0ICkgKSApCiAgICAgICBnb3RvIEV4aXQ7CiAgICAgZWxzZQogICAgICAgaGF2ZV9idWZmZXIgPSBUUlVFOwpAQCAtMjQzLDggKzI0Myw4IEBACiAKICAgICBiaXRtYXAtPnBpeGVsX21vZGUgPSBGVF9QSVhFTF9NT0RFX0dSQVk7CiAgICAgYml0bWFwLT5udW1fZ3JheXMgID0gMjU2OwotICAgIGJpdG1hcC0+d2lkdGggICAgICA9IHdpZHRoOwotICAgIGJpdG1hcC0+cm93cyAgICAgICA9IGhlaWdodDsKKyAgICBiaXRtYXAtPndpZHRoICAgICAgPSAodW5zaWduZWQgaW50KXdpZHRoOworICAgIGJpdG1hcC0+cm93cyAgICAgICA9ICh1bnNpZ25lZCBpbnQpaGVpZ2h0OwogICAgIGJpdG1hcC0+cGl0Y2ggICAgICA9IHBpdGNoOwogCiAgICAgLyogdHJhbnNsYXRlIG91dGxpbmUgdG8gcmVuZGVyIGl0IGludG8gdGhlIGJpdG1hcCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Ntb290aC9mdHNtb290aC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Ntb290aC9mdHNtb290aC5oCmluZGV4IDM3MDg3OTAuLjc2NTAxOGMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvZnRzbW9vdGguaAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc21vb3RoL2Z0c21vb3RoLmgKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgQW50aS1hbGlhc2luZyByZW5kZXJlciBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvZnRzcGljLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc21vb3RoL2Z0c3BpYy5jCmluZGV4IDY3YTJiODMuLjhlNmVkNTcgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvZnRzcGljLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Ntb290aC9mdHNwaWMuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyBmb3Igc21vb3RoIG1vZHVsZS4gICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOSwgMjAxMCwgMjAxMiwgMjAxMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDktMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Ntb290aC9mdHNwaWMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvZnRzcGljLmgKaW5kZXggMzM0YjUxYy4uMDcxYWZjZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Ntb290aC9mdHNwaWMuaAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc21vb3RoL2Z0c3BpYy5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFRoZSBGcmVlVHlwZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHNlcnZpY2VzIGZvciBzbW9vdGggbW9kdWxlLiAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA5IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMjAwOS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC0yMCwxMCArMjAsMTEgQEAKICNkZWZpbmUgX19GVFNQSUNfSF9fCiAKIAotRlRfQkVHSU5fSEVBREVSCi0KICNpbmNsdWRlIEZUX0lOVEVSTkFMX1BJQ19ICiAKKworRlRfQkVHSU5fSEVBREVSCisKICNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKIAogI2RlZmluZSBGVF9HUkFZU19SQVNURVJfR0VUICBmdF9ncmF5c19yYXN0ZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvc21vb3RoLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc21vb3RoL3Ntb290aC5jCmluZGV4IGE4YWM1MWYuLjRjYTQzNDQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvc21vb3RoLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Ntb290aC9zbW9vdGguYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBGcmVlVHlwZSBhbnRpLWFsaWFzaW5nIHJhc3RlcmVyIG1vZHVsZSBjb21wb25lbnQgKGJvZHkgb25seSkuICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL0phbWZpbGUgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvSmFtZmlsZQppbmRleCBhOGNjY2ZlLi44OGNjMjZmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvSmFtZmlsZQorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvSmFtZmlsZQpAQCAtMSw2ICsxLDYgQEAKICMgRnJlZVR5cGUgMiBzcmMvdHJ1ZXR5cGUgSmFtZmlsZQogIwotIyBDb3B5cmlnaHQgMjAwMSwgMjAwNCBieQorIyBDb3B5cmlnaHQgMjAwMS0yMDE1IGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKQEAgLTE2LDcgKzE2LDE1IEBACiAKICAgaWYgJChGVDJfTVVMVEkpCiAgIHsKLSAgICBfc291cmNlcyA9IHR0ZHJpdmVyIHR0b2JqcyB0dHBsb2FkIHR0Z2xvYWQgdHRpbnRlcnAgdHRneHZhciB0dHBpYyA7CisgICAgX3NvdXJjZXMgPSB0dGRyaXZlcgorICAgICAgICAgICAgICAgdHRnbG9hZAorICAgICAgICAgICAgICAgdHRneHZhcgorICAgICAgICAgICAgICAgdHRpbnRlcnAKKyAgICAgICAgICAgICAgIHR0b2JqcworICAgICAgICAgICAgICAgdHRwaWMKKyAgICAgICAgICAgICAgIHR0cGxvYWQKKyAgICAgICAgICAgICAgIHR0c3VicGl4CisgICAgICAgICAgICAgICA7CiAgIH0KICAgZWxzZQogICB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHJ1ZXR5cGUuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90cnVldHlwZS5jCmluZGV4IDU3NjkxMmIuLmY5Mjk0MzcgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90cnVldHlwZS5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90cnVldHlwZS5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEZyZWVUeXBlIFRydWVUeXBlIGRyaXZlciBjb21wb25lbnQgKGJvZHkgb25seSkuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDQsIDIwMDYsIDIwMTIgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dGRyaXZlci5jCmluZGV4IDY0ZTQzM2QuLjA4YjMwYzkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dGRyaXZlci5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dGRyaXZlci5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFRydWVUeXBlIGZvbnQgZHJpdmVyIGltcGxlbWVudGF0aW9uIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICiAjaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAogI2luY2x1ZGUgRlRfSU5URVJOQUxfU0ZOVF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1hGUkVFODZfTkFNRV9ICisjaW5jbHVkZSBGVF9TRVJWSUNFX0ZPTlRfRk9STUFUX0gKIAogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKICNpbmNsdWRlIEZUX01VTFRJUExFX01BU1RFUlNfSApAQCAtMTM0LDExICsxMzQsNiBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi0jdW5kZWYgIFBBSVJfVEFHCi0jZGVmaW5lIFBBSVJfVEFHKCBsZWZ0LCByaWdodCApICAoICggKEZUX1VMb25nKWxlZnQgPDwgMTYgKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUxvbmcpcmlnaHQgICAgICAgICkKLQotCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xOTEsOSArMTg2LDYgQEAKICAgfQogCiAKLSN1bmRlZiBQQUlSX1RBRwotCi0KICAgc3RhdGljIEZUX0Vycm9yCiAgIHR0X2dldF9hZHZhbmNlcyggRlRfRmFjZSAgICB0dGZhY2UsCiAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBzdGFydCwKQEAgLTQ1Niw3ICs0NDgsNyBAQAogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKICAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNSgKICAgICB0dF9zZXJ2aWNlcywKLSAgICBGVF9TRVJWSUNFX0lEX1hGODZfTkFNRSwgICAgICAgRlRfWEY4Nl9GT1JNQVRfVFJVRVRZUEUsCisgICAgRlRfU0VSVklDRV9JRF9GT05UX0ZPUk1BVCwgICAgIEZUX0ZPTlRfRk9STUFUX1RSVUVUWVBFLAogICAgIEZUX1NFUlZJQ0VfSURfTVVMVElfTUFTVEVSUywgICAmVFRfU0VSVklDRV9HWF9NVUxUSV9NQVNURVJTX0dFVCwKICAgICBGVF9TRVJWSUNFX0lEX1RSVUVUWVBFX0VOR0lORSwgJnR0X3NlcnZpY2VfdHJ1ZXR5cGVfZW5naW5lLAogICAgIEZUX1NFUlZJQ0VfSURfVFRfR0xZRiwgICAgICAgICAmVFRfU0VSVklDRV9UUlVFVFlQRV9HTFlGX0dFVCwKQEAgLTQ2NCw3ICs0NTYsNyBAQAogI2Vsc2UKICAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNCgKICAgICB0dF9zZXJ2aWNlcywKLSAgICBGVF9TRVJWSUNFX0lEX1hGODZfTkFNRSwgICAgICAgRlRfWEY4Nl9GT1JNQVRfVFJVRVRZUEUsCisgICAgRlRfU0VSVklDRV9JRF9GT05UX0ZPUk1BVCwgICAgIEZUX0ZPTlRfRk9STUFUX1RSVUVUWVBFLAogICAgIEZUX1NFUlZJQ0VfSURfVFJVRVRZUEVfRU5HSU5FLCAmdHRfc2VydmljZV90cnVldHlwZV9lbmdpbmUsCiAgICAgRlRfU0VSVklDRV9JRF9UVF9HTFlGLCAgICAgICAgICZUVF9TRVJWSUNFX1RSVUVUWVBFX0dMWUZfR0VULAogICAgIEZUX1NFUlZJQ0VfSURfUFJPUEVSVElFUywgICAgICAmVFRfU0VSVklDRV9QUk9QRVJUSUVTX0dFVCApCkBAIC00ODEsNyArNDczLDcgQEAKICAgICBTRk5UX1NlcnZpY2UgICAgICAgICBzZm50OwogCiAKLSAgICAvKiBUVF9TRVJWSUNFU19HRVQgZGVyZWZlcnMgYGxpYnJhcnknIGluIFBJQyBtb2RlICovCisgICAgLyogVFRfU0VSVklDRVNfR0VUIGRlcmVmZXJlbmNlcyBgbGlicmFyeScgaW4gUElDIG1vZGUgKi8KICNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwogICAgIGlmICggIWRyaXZlciApCiAgICAgICByZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dGRyaXZlci5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmgKaW5kZXggYWFlMDBmMi4uNmNhY2Q2MCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmgKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgSGlnaC1sZXZlbCBUcnVlVHlwZSBkcml2ZXIgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dGVycm9ycy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0ZXJyb3JzLmgKaW5kZXggNzhkMTM4Zi4uYmEzMmNmNyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0ZXJyb3JzLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0ZXJyb3JzLmgKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEsIDIwMTIgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDAxLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dGdsb2FkLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jCmluZGV4IGM1ODQxYzMuLmE3OTJhZDQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dGdsb2FkLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0Z2xvYWQuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBUcnVlVHlwZSBHbHlwaCBMb2FkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtMTAwLDEzICsxMDAsMTUgQEAKICAgICBlbHNlIGlmICggZmFjZS0+b3MyLnZlcnNpb24gIT0gMHhGRkZGVSApCiAgICAgewogICAgICAgKnRzYiA9IChGVF9TaG9ydCkoIGZhY2UtPm9zMi5zVHlwb0FzY2VuZGVyIC0geU1heCApOwotICAgICAgKmFoICA9IGZhY2UtPm9zMi5zVHlwb0FzY2VuZGVyIC0gZmFjZS0+b3MyLnNUeXBvRGVzY2VuZGVyOworICAgICAgKmFoICA9IChGVF9VU2hvcnQpRlRfQUJTKCBmYWNlLT5vczIuc1R5cG9Bc2NlbmRlciAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm9zMi5zVHlwb0Rlc2NlbmRlciApOwogICAgIH0KIAogICAgIGVsc2UKICAgICB7CiAgICAgICAqdHNiID0gKEZUX1Nob3J0KSggZmFjZS0+aG9yaXpvbnRhbC5Bc2NlbmRlciAtIHlNYXggKTsKLSAgICAgICphaCAgPSBmYWNlLT5ob3Jpem9udGFsLkFzY2VuZGVyIC0gZmFjZS0+aG9yaXpvbnRhbC5EZXNjZW5kZXI7CisgICAgICAqYWggID0gKEZUX1VTaG9ydClGVF9BQlMoIGZhY2UtPmhvcml6b250YWwuQXNjZW5kZXIgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5ob3Jpem9udGFsLkRlc2NlbmRlciApOwogICAgIH0KIAogICAgIEZUX1RSQUNFNSgoICIgIGFkdmFuY2UgaGVpZ2h0IChmb250IHVuaXRzKTogJWRcbiIsICphaCApKTsKQEAgLTExOCw3ICsxMjAsNyBAQAogICB0dF9nZXRfbWV0cmljcyggVFRfTG9hZGVyICBsb2FkZXIsCiAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGdseXBoX2luZGV4ICkKICAgewotICAgIFRUX0ZhY2UgICAgZmFjZSAgID0gKFRUX0ZhY2UpbG9hZGVyLT5mYWNlOworICAgIFRUX0ZhY2UgICAgZmFjZSAgID0gbG9hZGVyLT5mYWNlOwogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwogICAgIFRUX0RyaXZlciAgZHJpdmVyID0gKFRUX0RyaXZlcilGVF9GQUNFX0RSSVZFUiggZmFjZSApOwogI2VuZGlmCkBAIC0xNTEsMTQgKzE1MywxNiBAQAogICAgIGxvYWRlci0+dmFkdmFuY2UgICAgID0gYWR2YW5jZV9oZWlnaHQ7CiAKICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSAgICBpZiAoIGRyaXZlci0+aW50ZXJwcmV0ZXJfdmVyc2lvbiA9PSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzM4ICkKKyAgICBpZiAoIGRyaXZlci0+aW50ZXJwcmV0ZXJfdmVyc2lvbiA9PSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzM4ICYmCisgICAgICAgICBsb2FkZXItPmV4ZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgewotICAgICAgaWYgKCBsb2FkZXItPmV4ZWMgKQotICAgICAgICBsb2FkZXItPmV4ZWMtPnNwaF90d2Vha19mbGFncyA9IDA7CisgICAgICBsb2FkZXItPmV4ZWMtPnNwaF90d2Vha19mbGFncyA9IDA7CiAKLSAgICAgIC8qIHRoaXMgbWF5IG5vdCBiZSB0aGUgcmlnaHQgcGxhY2UgZm9yIHRoaXMsIGJ1dCBpdCB3b3JrcyAqLwotICAgICAgaWYgKCBsb2FkZXItPmV4ZWMgJiYgbG9hZGVyLT5leGVjLT5pZ25vcmVfeF9tb2RlICkKLSAgICAgICAgc3BoX3NldF90d2Vha3MoIGxvYWRlciwgZ2x5cGhfaW5kZXggKTsKKyAgICAgIC8qIFRoaXMgbWF5IG5vdCBiZSB0aGUgcmlnaHQgcGxhY2UgZm9yIHRoaXMsIGJ1dCBpdCB3b3Jrcy4uLiAgKi8KKyAgICAgIC8qIE5vdGUgdGhhdCB3ZSBoYXZlIHRvIHVuY29uZGl0aW9uYWxseSBsb2FkIHRoZSB0d2Vha3Mgc2luY2UgKi8KKyAgICAgIC8qIGl0IGlzIHBvc3NpYmxlIHRoYXQgZ2x5cGhzIGluZGl2aWR1YWxseSBzd2l0Y2ggQ2xlYXJUeXBlJ3MgKi8KKyAgICAgIC8qIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG1vZGUgb24gYW5kIG9mZi4gICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIHNwaF9zZXRfdHdlYWtzKCBsb2FkZXIsIGdseXBoX2luZGV4ICk7CiAgICAgfQogI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwogCkBAIC0xNzgsNyArMTgyLDcgQEAKICAgdHRfZ2V0X21ldHJpY3NfaW5jcl9vdmVycmlkZXMoIFRUX0xvYWRlciAgbG9hZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBnbHlwaF9pbmRleCApCiAgIHsKLSAgICBUVF9GYWNlICBmYWNlID0gKFRUX0ZhY2UpbG9hZGVyLT5mYWNlOworICAgIFRUX0ZhY2UgIGZhY2UgPSBsb2FkZXItPmZhY2U7CiAKICAgICBGVF9TaG9ydCAgIGxlZnRfYmVhcmluZyA9IDAsIHRvcF9iZWFyaW5nID0gMDsKICAgICBGVF9VU2hvcnQgIGFkdmFuY2Vfd2lkdGggPSAwLCBhZHZhbmNlX2hlaWdodCA9IDA7CkBAIC0yNDYsMjkgKzI1MCw2IEBACiAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUcmFuc2xhdGVzIGFuIGFycmF5IG9mIGNvb3JkaW5hdGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIHRyYW5zbGF0ZV9hcnJheSggRlRfVUludCAgICAgbiwKLSAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBjb29yZHMsCi0gICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgZGVsdGFfeCwKLSAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICBkZWx0YV95ICkKLSAgewotICAgIEZUX1VJbnQgIGs7Ci0KLQotICAgIGlmICggZGVsdGFfeCApCi0gICAgICBmb3IgKCBrID0gMDsgayA8IG47IGsrKyApCi0gICAgICAgIGNvb3Jkc1trXS54ICs9IGRlbHRhX3g7Ci0KLSAgICBpZiAoIGRlbHRhX3kgKQotICAgICAgZm9yICggayA9IDA7IGsgPCBuOyBrKysgKQotICAgICAgICBjb29yZHNba10ueSArPSBkZWx0YV95OwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSB1c2VkIGJ5IGRlZmF1bHQgd2l0aCBUcnVlVHlwZSBmb250cy4gICAgICAqLwogICAvKiBIb3dldmVyLCB0aGV5IGNhbiBiZSByZXBsYWNlZCBieSBhbHRlcm5hdGl2ZXMgaWYgd2UgbmVlZCB0byBzdXBwb3J0ICAgKi8KICAgLyogVHJ1ZVR5cGUtY29tcHJlc3NlZCBmb3JtYXRzIChsaWtlIE1pY3JvVHlwZSkgaW4gdGhlIGZ1dHVyZS4gICAgICAgICAgICovCkBAIC00MDcsNyArMzg4LDcgQEAKIAogICAgIC8qIHJlYWRpbmcgdGhlIGJ5dGVjb2RlIGluc3RydWN0aW9ucyAqLwogICAgIGxvYWQtPmdseXBoLT5jb250cm9sX2xlbiAgPSAwOwotICAgIGxvYWQtPmdseXBoLT5jb250cm9sX2RhdGEgPSAwOworICAgIGxvYWQtPmdseXBoLT5jb250cm9sX2RhdGEgPSBOVUxMOwogCiAgICAgaWYgKCBwICsgMiA+IGxpbWl0ICkKICAgICAgIGdvdG8gSW52YWxpZF9PdXRsaW5lOwpAQCAtNTU1LDggKzUzNiw4IEBACiAgICAgICAqZmxhZyAgPSAoRlRfQnl0ZSkoIGYgJiBGVF9DVVJWRV9UQUdfT04gKTsKICAgICB9CiAKLSAgICBvdXRsaW5lLT5uX3BvaW50cyAgID0gKEZUX1VTaG9ydCluX3BvaW50czsKLSAgICBvdXRsaW5lLT5uX2NvbnRvdXJzID0gKEZUX1Nob3J0KSBuX2NvbnRvdXJzOworICAgIG91dGxpbmUtPm5fcG9pbnRzICAgPSAoRlRfU2hvcnQpbl9wb2ludHM7CisgICAgb3V0bGluZS0+bl9jb250b3VycyA9IChGVF9TaG9ydCluX2NvbnRvdXJzOwogCiAgICAgbG9hZC0+Y3Vyc29yID0gcDsKIApAQCAtNjE5LDE1ICs2MDAsMzEgQEAKICAgICAgICAgZ290byBJbnZhbGlkX0NvbXBvc2l0ZTsKIAogICAgICAgLyogcmVhZCBhcmd1bWVudHMgKi8KLSAgICAgIGlmICggc3ViZ2x5cGgtPmZsYWdzICYgQVJHU19BUkVfV09SRFMgKQorICAgICAgaWYgKCBzdWJnbHlwaC0+ZmxhZ3MgJiBBUkdTX0FSRV9YWV9WQUxVRVMgKQogICAgICAgewotICAgICAgICBzdWJnbHlwaC0+YXJnMSA9IEZUX05FWFRfU0hPUlQoIHAgKTsKLSAgICAgICAgc3ViZ2x5cGgtPmFyZzIgPSBGVF9ORVhUX1NIT1JUKCBwICk7CisgICAgICAgIGlmICggc3ViZ2x5cGgtPmZsYWdzICYgQVJHU19BUkVfV09SRFMgKQorICAgICAgICB7CisgICAgICAgICAgc3ViZ2x5cGgtPmFyZzEgPSBGVF9ORVhUX1NIT1JUKCBwICk7CisgICAgICAgICAgc3ViZ2x5cGgtPmFyZzIgPSBGVF9ORVhUX1NIT1JUKCBwICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgc3ViZ2x5cGgtPmFyZzEgPSBGVF9ORVhUX0NIQVIoIHAgKTsKKyAgICAgICAgICBzdWJnbHlwaC0+YXJnMiA9IEZUX05FWFRfQ0hBUiggcCApOworICAgICAgICB9CiAgICAgICB9CiAgICAgICBlbHNlCiAgICAgICB7Ci0gICAgICAgIHN1YmdseXBoLT5hcmcxID0gRlRfTkVYVF9DSEFSKCBwICk7Ci0gICAgICAgIHN1YmdseXBoLT5hcmcyID0gRlRfTkVYVF9DSEFSKCBwICk7CisgICAgICAgIGlmICggc3ViZ2x5cGgtPmZsYWdzICYgQVJHU19BUkVfV09SRFMgKQorICAgICAgICB7CisgICAgICAgICAgc3ViZ2x5cGgtPmFyZzEgPSAoRlRfSW50KUZUX05FWFRfVVNIT1JUKCBwICk7CisgICAgICAgICAgc3ViZ2x5cGgtPmFyZzIgPSAoRlRfSW50KUZUX05FWFRfVVNIT1JUKCBwICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgc3ViZ2x5cGgtPmFyZzEgPSAoRlRfSW50KUZUX05FWFRfQllURSggcCApOworICAgICAgICAgIHN1YmdseXBoLT5hcmcyID0gKEZUX0ludClGVF9ORVhUX0JZVEUoIHAgKTsKKyAgICAgICAgfQogICAgICAgfQogCiAgICAgICAvKiByZWFkIHRyYW5zZm9ybSAqLwpAQCAtNjM2LDIwICs2MzMsMjAgQEAKIAogICAgICAgaWYgKCBzdWJnbHlwaC0+ZmxhZ3MgJiBXRV9IQVZFX0FfU0NBTEUgKQogICAgICAgewotICAgICAgICB4eCA9IChGVF9GaXhlZClGVF9ORVhUX1NIT1JUKCBwICkgPDwgMjsKKyAgICAgICAgeHggPSAoRlRfRml4ZWQpRlRfTkVYVF9TSE9SVCggcCApICogNDsKICAgICAgICAgeXkgPSB4eDsKICAgICAgIH0KICAgICAgIGVsc2UgaWYgKCBzdWJnbHlwaC0+ZmxhZ3MgJiBXRV9IQVZFX0FOX1hZX1NDQUxFICkKICAgICAgIHsKLSAgICAgICAgeHggPSAoRlRfRml4ZWQpRlRfTkVYVF9TSE9SVCggcCApIDw8IDI7Ci0gICAgICAgIHl5ID0gKEZUX0ZpeGVkKUZUX05FWFRfU0hPUlQoIHAgKSA8PCAyOworICAgICAgICB4eCA9IChGVF9GaXhlZClGVF9ORVhUX1NIT1JUKCBwICkgKiA0OworICAgICAgICB5eSA9IChGVF9GaXhlZClGVF9ORVhUX1NIT1JUKCBwICkgKiA0OwogICAgICAgfQogICAgICAgZWxzZSBpZiAoIHN1YmdseXBoLT5mbGFncyAmIFdFX0hBVkVfQV8yWDIgKQogICAgICAgewotICAgICAgICB4eCA9IChGVF9GaXhlZClGVF9ORVhUX1NIT1JUKCBwICkgPDwgMjsKLSAgICAgICAgeXggPSAoRlRfRml4ZWQpRlRfTkVYVF9TSE9SVCggcCApIDw8IDI7Ci0gICAgICAgIHh5ID0gKEZUX0ZpeGVkKUZUX05FWFRfU0hPUlQoIHAgKSA8PCAyOwotICAgICAgICB5eSA9IChGVF9GaXhlZClGVF9ORVhUX1NIT1JUKCBwICkgPDwgMjsKKyAgICAgICAgeHggPSAoRlRfRml4ZWQpRlRfTkVYVF9TSE9SVCggcCApICogNDsKKyAgICAgICAgeXggPSAoRlRfRml4ZWQpRlRfTkVYVF9TSE9SVCggcCApICogNDsKKyAgICAgICAgeHkgPSAoRlRfRml4ZWQpRlRfTkVYVF9TSE9SVCggcCApICogNDsKKyAgICAgICAgeXkgPSAoRlRfRml4ZWQpRlRfTkVYVF9TSE9SVCggcCApICogNDsKICAgICAgIH0KIAogICAgICAgc3ViZ2x5cGgtPnRyYW5zZm9ybS54eCA9IHh4OwpAQCAtNzA3LDkgKzcwNCwxMCBAQAogICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgc3RhcnRfcG9pbnQsCiAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBzdGFydF9jb250b3VyICkKICAgewotICAgIHpvbmUtPm5fcG9pbnRzICAgID0gKEZUX1VTaG9ydCkoIGxvYWQtPm91dGxpbmUubl9wb2ludHMgLSBzdGFydF9wb2ludCApOwotICAgIHpvbmUtPm5fY29udG91cnMgID0gKEZUX1Nob3J0KSAoIGxvYWQtPm91dGxpbmUubl9jb250b3VycyAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9jb250b3VyICk7CisgICAgem9uZS0+bl9wb2ludHMgICAgPSAoRlRfVVNob3J0KWxvYWQtPm91dGxpbmUubl9wb2ludHMgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVVNob3J0KXN0YXJ0X3BvaW50OworICAgIHpvbmUtPm5fY29udG91cnMgID0gbG9hZC0+b3V0bGluZS5uX2NvbnRvdXJzIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1Nob3J0KXN0YXJ0X2NvbnRvdXI7CiAgICAgem9uZS0+b3JnICAgICAgICAgPSBsb2FkLT5leHRyYV9wb2ludHMgKyBzdGFydF9wb2ludDsKICAgICB6b25lLT5jdXIgICAgICAgICA9IGxvYWQtPm91dGxpbmUucG9pbnRzICsgc3RhcnRfcG9pbnQ7CiAgICAgem9uZS0+b3J1cyAgICAgICAgPSBsb2FkLT5leHRyYV9wb2ludHMyICsgc3RhcnRfcG9pbnQ7CkBAIC03MzMsMTQgKzczMSwxNCBAQAogICAgICAgICAgICAgICAgICBGVF9Cb29sICAgIGlzX2NvbXBvc2l0ZSApCiAgIHsKICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSAgICBUVF9GYWNlICAgIGZhY2UgICA9IChUVF9GYWNlKWxvYWRlci0+ZmFjZTsKKyAgICBUVF9GYWNlICAgIGZhY2UgICA9IGxvYWRlci0+ZmFjZTsKICAgICBUVF9Ecml2ZXIgIGRyaXZlciA9IChUVF9Ecml2ZXIpRlRfRkFDRV9EUklWRVIoIGZhY2UgKTsKICNlbmRpZgogCiAgICAgVFRfR2x5cGhab25lICB6b25lID0gJmxvYWRlci0+em9uZTsKIAogI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotICAgIEZUX1VJbnQgICAgICAgbl9pbnM7CisgICAgRlRfTG9uZyAgICAgICBuX2luczsKICNlbHNlCiAgICAgRlRfVU5VU0VEKCBpc19jb21wb3NpdGUgKTsKICNlbmRpZgpAQCAtNzUzLDE0ICs3NTEsMTQgQEAKICAgICAgIEZUX1RSQUNFMSgoICIgKDB4JWx4IGJ5dGUpIGlzIHRydW5jYXRlZFxuIiwKICAgICAgICAgICAgICAgICAgbG9hZGVyLT5nbHlwaC0+Y29udHJvbF9sZW4gKSk7CiAgICAgfQotICAgIG5faW5zID0gKEZUX1VJbnQpKCBsb2FkZXItPmdseXBoLT5jb250cm9sX2xlbiApOworICAgIG5faW5zID0gbG9hZGVyLT5nbHlwaC0+Y29udHJvbF9sZW47CiAKICAgICAvKiBzYXZlIG9yaWdpbmFsIHBvaW50IHBvc2l0aW9uIGluIG9yZyAqLwogICAgIGlmICggbl9pbnMgPiAwICkKICAgICAgIEZUX0FSUkFZX0NPUFkoIHpvbmUtPm9yZywgem9uZS0+Y3VyLCB6b25lLT5uX3BvaW50cyApOwogCiAgICAgLyogUmVzZXQgZ3JhcGhpY3Mgc3RhdGUuICovCi0gICAgbG9hZGVyLT5leGVjLT5HUyA9ICgoVFRfU2l6ZSlsb2FkZXItPnNpemUpLT5HUzsKKyAgICBsb2FkZXItPmV4ZWMtPkdTID0gbG9hZGVyLT5zaXplLT5HUzsKIAogICAgIC8qIFhYWDogVU5ET0NVTUVOVEVEISBIaW50aW5nIGluc3RydWN0aW9ucyBvZiBhIGNvbXBvc2l0ZSBnbHlwaCAqLwogICAgIC8qICAgICAgY29tcGxldGVseSByZWZlciB0byB0aGUgKGFscmVhZHkpIGhpbnRlZCBzdWJnbHlwaHMuICAgICAqLwpAQCAtNzczLDEwICs3NzEsOCBAQAogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgbG9hZGVyLT5leGVjLT5tZXRyaWNzLnhfc2NhbGUgPQotICAgICAgICAoKFRUX1NpemUpbG9hZGVyLT5zaXplKS0+bWV0cmljcy54X3NjYWxlOwotICAgICAgbG9hZGVyLT5leGVjLT5tZXRyaWNzLnlfc2NhbGUgPQotICAgICAgICAoKFRUX1NpemUpbG9hZGVyLT5zaXplKS0+bWV0cmljcy55X3NjYWxlOworICAgICAgbG9hZGVyLT5leGVjLT5tZXRyaWNzLnhfc2NhbGUgPSBsb2FkZXItPnNpemUtPm1ldHJpY3MueF9zY2FsZTsKKyAgICAgIGxvYWRlci0+ZXhlYy0+bWV0cmljcy55X3NjYWxlID0gbG9hZGVyLT5zaXplLT5tZXRyaWNzLnlfc2NhbGU7CiAgICAgfQogI2VuZGlmCiAKQEAgLTc5NCw3ICs3OTAsNiBAQAogCiAgICAgaWYgKCBuX2lucyA+IDAgKQogICAgIHsKLSAgICAgIEZUX0Jvb2wgICBkZWJ1ZzsKICAgICAgIEZUX0Vycm9yICBlcnJvcjsKIAogICAgICAgRlRfR2x5cGhMb2FkZXIgIGdsb2FkZXIgICAgICAgICA9IGxvYWRlci0+Z2xvYWRlcjsKQEAgLTgwNywxMCArODAyLDcgQEAKICAgICAgIGxvYWRlci0+ZXhlYy0+aXNfY29tcG9zaXRlID0gaXNfY29tcG9zaXRlOwogICAgICAgbG9hZGVyLT5leGVjLT5wdHMgICAgICAgICAgPSAqem9uZTsKIAotICAgICAgZGVidWcgPSBGVF9CT09MKCAhKCBsb2FkZXItPmxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgKChUVF9TaXplKWxvYWRlci0+c2l6ZSktPmRlYnVnICAgICAgICAgICAgICk7Ci0KLSAgICAgIGVycm9yID0gVFRfUnVuX0NvbnRleHQoIGxvYWRlci0+ZXhlYywgZGVidWcgKTsKKyAgICAgIGVycm9yID0gVFRfUnVuX0NvbnRleHQoIGxvYWRlci0+ZXhlYyApOwogICAgICAgaWYgKCBlcnJvciAmJiBsb2FkZXItPmV4ZWMtPnBlZGFudGljX2hpbnRpbmcgKQogICAgICAgICByZXR1cm4gZXJyb3I7CiAKQEAgLTg4MCwyOCArODcyLDE1IEBACiAKICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCiAKLSAgICBpZiAoICgoVFRfRmFjZSlsb2FkZXItPmZhY2UpLT5kb2JsZW5kICkKKyAgICBpZiAoIGxvYWRlci0+ZmFjZS0+ZG9ibGVuZCApCiAgICAgewogICAgICAgLyogRGVsdGFzIGFwcGx5IHRvIHRoZSB1bnNjYWxlZCBkYXRhLiAqLwotICAgICAgRlRfVmVjdG9yKiAgZGVsdGFzOwotICAgICAgRlRfTWVtb3J5ICAgbWVtb3J5ID0gbG9hZGVyLT5mYWNlLT5tZW1vcnk7Ci0gICAgICBGVF9JbnQgICAgICBpOwotCi0KLSAgICAgIGVycm9yID0gVFRfVmFyeV9HZXRfR2x5cGhfRGVsdGFzKCAoVFRfRmFjZSkobG9hZGVyLT5mYWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXItPmdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWx0YXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9wb2ludHMgKTsKKyAgICAgIGVycm9yID0gVFRfVmFyeV9BcHBseV9HbHlwaF9EZWx0YXMoIGxvYWRlci0+ZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci0+Z2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpbl9wb2ludHMgKTsKICAgICAgIGlmICggZXJyb3IgKQogICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgbl9wb2ludHM7ICsraSApCi0gICAgICB7Ci0gICAgICAgIG91dGxpbmUtPnBvaW50c1tpXS54ICs9IGRlbHRhc1tpXS54OwotICAgICAgICBvdXRsaW5lLT5wb2ludHNbaV0ueSArPSBkZWx0YXNbaV0ueTsKLSAgICAgIH0KLQotICAgICAgRlRfRlJFRSggZGVsdGFzICk7CiAgICAgfQogCiAjZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVCAqLwpAQCAtOTE2LDEzICs4OTUsMTMgQEAKIAogICAgIHsKICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSAgICAgIFRUX0ZhY2UgICAgZmFjZSAgID0gKFRUX0ZhY2UpbG9hZGVyLT5mYWNlOworICAgICAgVFRfRmFjZSAgICBmYWNlICAgPSBsb2FkZXItPmZhY2U7CiAgICAgICBUVF9Ecml2ZXIgIGRyaXZlciA9IChUVF9Ecml2ZXIpRlRfRkFDRV9EUklWRVIoIGZhY2UgKTsKIAogICAgICAgRlRfU3RyaW5nKiAgZmFtaWx5ICAgICAgICAgPSBmYWNlLT5yb290LmZhbWlseV9uYW1lOwotICAgICAgRlRfSW50ICAgICAgcHBlbSAgICAgICAgICAgPSBsb2FkZXItPnNpemUtPm1ldHJpY3MueF9wcGVtOworICAgICAgRlRfVUludCAgICAgcHBlbSAgICAgICAgICAgPSBsb2FkZXItPnNpemUtPm1ldHJpY3MueF9wcGVtOwogICAgICAgRlRfU3RyaW5nKiAgc3R5bGUgICAgICAgICAgPSBmYWNlLT5yb290LnN0eWxlX25hbWU7Ci0gICAgICBGVF9JbnQgICAgICB4X3NjYWxlX2ZhY3RvciA9IDEwMDA7CisgICAgICBGVF9VSW50ICAgICB4X3NjYWxlX2ZhY3RvciA9IDEwMDA7CiAjZW5kaWYKIAogICAgICAgRlRfVmVjdG9yKiAgdmVjICAgPSBvdXRsaW5lLT5wb2ludHM7CkBAIC05NDksOSArOTI4LDkgQEAKICAgICAgICAgaWYgKCAoIGxvYWRlci0+bG9hZF9mbGFncyAmIEZUX0xPQURfTk9fU0NBTEUgKSA9PSAwIHx8CiAgICAgICAgICAgICAgeF9zY2FsZV9mYWN0b3IgIT0gMTAwMCAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgIHsKLSAgICAgICAgICB4X3NjYWxlID0gRlRfTXVsRGl2KCAoKFRUX1NpemUpbG9hZGVyLT5zaXplKS0+bWV0cmljcy54X3NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfc2NhbGVfZmFjdG9yLCAxMDAwICk7Ci0gICAgICAgICAgeV9zY2FsZSA9ICgoVFRfU2l6ZSlsb2FkZXItPnNpemUpLT5tZXRyaWNzLnlfc2NhbGU7CisgICAgICAgICAgeF9zY2FsZSA9IEZUX011bERpdiggbG9hZGVyLT5zaXplLT5tZXRyaWNzLnhfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpeF9zY2FsZV9mYWN0b3IsIDEwMDAgKTsKKyAgICAgICAgICB5X3NjYWxlID0gbG9hZGVyLT5zaXplLT5tZXRyaWNzLnlfc2NhbGU7CiAKICAgICAgICAgICAvKiBjb21wZW5zYXRlIGZvciBhbnkgc2NhbGluZyBieSBkZS9lbWJvbGRlbmluZzsgKi8KICAgICAgICAgICAvKiB0aGUgYW1vdW50IHdhcyBkZXRlcm1pbmVkIHZpYSBleHBlcmltZW50YXRpb24gKi8KQEAgLTk3MSw4ICs5NTAsOCBAQAogICAgICAgICAvKiBzY2FsZSB0aGUgZ2x5cGggKi8KICAgICAgICAgaWYgKCAoIGxvYWRlci0+bG9hZF9mbGFncyAmIEZUX0xPQURfTk9fU0NBTEUgKSA9PSAwICkKICAgICAgICAgewotICAgICAgICAgIHhfc2NhbGUgPSAoKFRUX1NpemUpbG9hZGVyLT5zaXplKS0+bWV0cmljcy54X3NjYWxlOwotICAgICAgICAgIHlfc2NhbGUgPSAoKFRUX1NpemUpbG9hZGVyLT5zaXplKS0+bWV0cmljcy55X3NjYWxlOworICAgICAgICAgIHhfc2NhbGUgPSBsb2FkZXItPnNpemUtPm1ldHJpY3MueF9zY2FsZTsKKyAgICAgICAgICB5X3NjYWxlID0gbG9hZGVyLT5zaXplLT5tZXRyaWNzLnlfc2NhbGU7CiAKICAgICAgICAgICBkb19zY2FsZSA9IFRSVUU7CiAgICAgICAgIH0KQEAgLTEwMTksMzIgKzk5OCwzMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBzdGFydF9wb2ludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgbnVtX2Jhc2VfcG9pbnRzICkKICAgewotICAgIEZUX0dseXBoTG9hZGVyICBnbG9hZGVyICAgID0gbG9hZGVyLT5nbG9hZGVyOwotICAgIEZUX1ZlY3RvciogICAgICBiYXNlX3ZlYyAgID0gZ2xvYWRlci0+YmFzZS5vdXRsaW5lLnBvaW50czsKLSAgICBGVF9VSW50ICAgICAgICAgbnVtX3BvaW50cyA9IGdsb2FkZXItPmJhc2Uub3V0bGluZS5uX3BvaW50czsKKyAgICBGVF9HbHlwaExvYWRlciAgZ2xvYWRlciA9IGxvYWRlci0+Z2xvYWRlcjsKKyAgICBGVF9PdXRsaW5lICAgICAgY3VycmVudDsKICAgICBGVF9Cb29sICAgICAgICAgaGF2ZV9zY2FsZTsKICAgICBGVF9Qb3MgICAgICAgICAgeCwgeTsKIAogCisgICAgY3VycmVudC5wb2ludHMgICA9IGdsb2FkZXItPmJhc2Uub3V0bGluZS5wb2ludHMgKworICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9iYXNlX3BvaW50czsKKyAgICBjdXJyZW50Lm5fcG9pbnRzID0gZ2xvYWRlci0+YmFzZS5vdXRsaW5lLm5fcG9pbnRzIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAoc2hvcnQpbnVtX2Jhc2VfcG9pbnRzOworCiAgICAgaGF2ZV9zY2FsZSA9IEZUX0JPT0woIHN1YmdseXBoLT5mbGFncyAmICggV0VfSEFWRV9BX1NDQUxFICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VfSEFWRV9BTl9YWV9TQ0FMRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VfSEFWRV9BXzJYMiAgICAgICApICk7CiAKICAgICAvKiBwZXJmb3JtIHRoZSB0cmFuc2Zvcm0gcmVxdWlyZWQgZm9yIHRoaXMgc3ViZ2x5cGggKi8KICAgICBpZiAoIGhhdmVfc2NhbGUgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIGk7Ci0KLQotICAgICAgZm9yICggaSA9IG51bV9iYXNlX3BvaW50czsgaSA8IG51bV9wb2ludHM7IGkrKyApCi0gICAgICAgIEZUX1ZlY3Rvcl9UcmFuc2Zvcm0oIGJhc2VfdmVjICsgaSwgJnN1YmdseXBoLT50cmFuc2Zvcm0gKTsKLSAgICB9CisgICAgICBGVF9PdXRsaW5lX1RyYW5zZm9ybSggJmN1cnJlbnQsICZzdWJnbHlwaC0+dHJhbnNmb3JtICk7CiAKICAgICAvKiBnZXQgb2Zmc2V0ICovCiAgICAgaWYgKCAhKCBzdWJnbHlwaC0+ZmxhZ3MgJiBBUkdTX0FSRV9YWV9WQUxVRVMgKSApCiAgICAgewotICAgICAgRlRfVUludCAgICAgayA9IHN1YmdseXBoLT5hcmcxOwotICAgICAgRlRfVUludCAgICAgbCA9IHN1YmdseXBoLT5hcmcyOworICAgICAgRlRfVUludCAgICAgbnVtX3BvaW50cyA9IChGVF9VSW50KWdsb2FkZXItPmJhc2Uub3V0bGluZS5uX3BvaW50czsKKyAgICAgIEZUX1VJbnQgICAgIGsgPSAoRlRfVUludClzdWJnbHlwaC0+YXJnMTsKKyAgICAgIEZUX1VJbnQgICAgIGwgPSAoRlRfVUludClzdWJnbHlwaC0+YXJnMjsKICAgICAgIEZUX1ZlY3RvciogIHAxOwogICAgICAgRlRfVmVjdG9yKiAgcDI7CiAKQEAgLTExMzEsOCArMTEwOSw4IEBACiAKICAgICAgIGlmICggISggbG9hZGVyLT5sb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSApICkKICAgICAgIHsKLSAgICAgICAgRlRfRml4ZWQgIHhfc2NhbGUgPSAoKFRUX1NpemUpbG9hZGVyLT5zaXplKS0+bWV0cmljcy54X3NjYWxlOwotICAgICAgICBGVF9GaXhlZCAgeV9zY2FsZSA9ICgoVFRfU2l6ZSlsb2FkZXItPnNpemUpLT5tZXRyaWNzLnlfc2NhbGU7CisgICAgICAgIEZUX0ZpeGVkICB4X3NjYWxlID0gbG9hZGVyLT5zaXplLT5tZXRyaWNzLnhfc2NhbGU7CisgICAgICAgIEZUX0ZpeGVkICB5X3NjYWxlID0gbG9hZGVyLT5zaXplLT5tZXRyaWNzLnlfc2NhbGU7CiAKIAogICAgICAgICB4ID0gRlRfTXVsRml4KCB4LCB4X3NjYWxlICk7CkBAIC0xMTQ3LDkgKzExMjUsNyBAQAogICAgIH0KIAogICAgIGlmICggeCB8fCB5ICkKLSAgICAgIHRyYW5zbGF0ZV9hcnJheSggbnVtX3BvaW50cyAtIG51bV9iYXNlX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgYmFzZV92ZWMgKyBudW1fYmFzZV9wb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgIHgsIHkgKTsKKyAgICAgIEZUX091dGxpbmVfVHJhbnNsYXRlKCAmY3VycmVudCwgeCwgeSApOwogCiAgICAgcmV0dXJuIEZUX0Vycl9PazsKICAgfQpAQCAtMTIxMSw3ICsxMTg3LDcgQEAKICAgICAgIEZUX1RSQUNFNSgoICIgIEluc3RydWN0aW9ucyBzaXplID0gJWRcbiIsIG5faW5zICkpOwogCiAgICAgICAvKiBjaGVjayBpdCAqLwotICAgICAgbWF4X2lucyA9ICgoVFRfRmFjZSlsb2FkZXItPmZhY2UpLT5tYXhfcHJvZmlsZS5tYXhTaXplT2ZJbnN0cnVjdGlvbnM7CisgICAgICBtYXhfaW5zID0gbG9hZGVyLT5mYWNlLT5tYXhfcHJvZmlsZS5tYXhTaXplT2ZJbnN0cnVjdGlvbnM7CiAgICAgICBpZiAoIG5faW5zID4gbWF4X2lucyApCiAgICAgICB7CiAgICAgICAgIC8qIGRvbid0IHRydXN0IGBtYXhTaXplT2ZJbnN0cnVjdGlvbnMnOyAqLwpAQCAtMTM1MCwxMSArMTMyNiwxNCBAQAogI2RlZmluZSBUVF9MT0FERVJfU0VUX1BQKCBsb2FkZXIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfQm9vbCAgc3VicGl4ZWxfICA9IGxvYWRlci0+ZXhlYyA/IGxvYWRlci0+ZXhlYy0+c3VicGl4ZWwgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBGVF9Cb29sICBncmF5c2NhbGVfID0gbG9hZGVyLT5leGVjID8gbG9hZGVyLT5leGVjLT5ncmF5c2NhbGUgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIEZUX0Jvb2wgIHVzZV9hd18yXyAgPSAoRlRfQm9vbCkoIHN1YnBpeGVsXyAmJiBncmF5c2NhbGVfICk7ICAgICBcCisgICAgICAgICAgICBGVF9Cb29sICBzdWJwaXhlbF9oaW50aW5nXyA9IGxvYWRlci0+ZXhlYyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbG9hZGVyLT5leGVjLT5zdWJwaXhlbF9oaW50aW5nIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBGVF9Cb29sICBncmF5c2NhbGVfICAgICAgICA9IGxvYWRlci0+ZXhlYyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbG9hZGVyLT5leGVjLT5ncmF5c2NhbGUgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBGVF9Cb29sICB1c2VfYXdfMl8gICAgICAgICA9IChGVF9Cb29sKSggc3VicGl4ZWxfaGludGluZ18gJiYgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXlzY2FsZV8gICAgICAgICk7ICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgKGxvYWRlciktPnBwMS54ID0gKGxvYWRlciktPmJib3gueE1pbiAtIChsb2FkZXIpLT5sZWZ0X2JlYXJpbmc7IFwKQEAgLTE0MDUsMTQgKzEzODQsMTAgQEAKICAgICBGVF9FcnJvciAgICAgICAgZXJyb3IgICAgICAgID0gRlRfRXJyX09rOwogICAgIEZUX0ZpeGVkICAgICAgICB4X3NjYWxlLCB5X3NjYWxlOwogICAgIEZUX1VMb25nICAgICAgICBvZmZzZXQ7Ci0gICAgVFRfRmFjZSAgICAgICAgIGZhY2UgICAgICAgICA9IChUVF9GYWNlKWxvYWRlci0+ZmFjZTsKKyAgICBUVF9GYWNlICAgICAgICAgZmFjZSAgICAgICAgID0gbG9hZGVyLT5mYWNlOwogICAgIEZUX0dseXBoTG9hZGVyICBnbG9hZGVyICAgICAgPSBsb2FkZXItPmdsb2FkZXI7CiAgICAgRlRfQm9vbCAgICAgICAgIG9wZW5lZF9mcmFtZSA9IDA7CiAKLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0gICAgRlRfVmVjdG9yKiAgICAgIGRlbHRhcyAgICAgICA9IE5VTEw7Ci0jZW5kaWYKLQogI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKICAgICBGVF9TdHJlYW1SZWMgICAgaW5jX3N0cmVhbTsKICAgICBGVF9EYXRhICAgICAgICAgZ2x5cGhfZGF0YTsKQEAgLTE0MjksMTkgKzE0MDQsMjEgQEAKICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKKyNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAogICAgIC8qIGNoZWNrIGdseXBoIGluZGV4ICovCiAgICAgaWYgKCBnbHlwaF9pbmRleCA+PSAoRlRfVUludClmYWNlLT5yb290Lm51bV9nbHlwaHMgKQogICAgIHsKICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfR2x5cGhfSW5kZXggKTsKICAgICAgIGdvdG8gRXhpdDsKICAgICB9CisjZW5kaWYKIAogICAgIGxvYWRlci0+Z2x5cGhfaW5kZXggPSBnbHlwaF9pbmRleDsKIAogICAgIGlmICggKCBsb2FkZXItPmxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkgPT0gMCApCiAgICAgewotICAgICAgeF9zY2FsZSA9ICgoVFRfU2l6ZSlsb2FkZXItPnNpemUpLT5tZXRyaWNzLnhfc2NhbGU7Ci0gICAgICB5X3NjYWxlID0gKChUVF9TaXplKWxvYWRlci0+c2l6ZSktPm1ldHJpY3MueV9zY2FsZTsKKyAgICAgIHhfc2NhbGUgPSBsb2FkZXItPnNpemUtPm1ldHJpY3MueF9zY2FsZTsKKyAgICAgIHlfc2NhbGUgPSBsb2FkZXItPnNpemUtPm1ldHJpY3MueV9zY2FsZTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKQEAgLTE0NzIsNyArMTQ0OSw4IEBACiAKICAgICAgIEZUX01FTV9aRVJPKCAmaW5jX3N0cmVhbSwgc2l6ZW9mICggaW5jX3N0cmVhbSApICk7CiAgICAgICBGVF9TdHJlYW1fT3Blbk1lbW9yeSggJmluY19zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfZGF0YS5wb2ludGVyLCBnbHlwaF9kYXRhLmxlbmd0aCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2RhdGEucG9pbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUxvbmcpZ2x5cGhfZGF0YS5sZW5ndGggKTsKIAogICAgICAgbG9hZGVyLT5zdHJlYW0gPSAmaW5jX3N0cmVhbTsKICAgICB9CkBAIC0xNTAwLDcgKzE0NzgsNyBAQAogCiAgICAgICBlcnJvciA9IGZhY2UtPmFjY2Vzc19nbHlwaF9mcmFtZSggbG9hZGVyLCBnbHlwaF9pbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXItPmdseWZfb2Zmc2V0ICsgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci0+Ynl0ZV9sZW4gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludClsb2FkZXItPmJ5dGVfbGVuICk7CiAgICAgICBpZiAoIGVycm9yICkKICAgICAgICAgZ290byBFeGl0OwogCkBAIC0xNTQ2LDI4ICsxNTI0LDQ5IEBACiAKICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCiAKLSAgICAgIGlmICggKChUVF9GYWNlKShsb2FkZXItPmZhY2UpKS0+ZG9ibGVuZCApCisgICAgICBpZiAoIGxvYWRlci0+ZmFjZS0+ZG9ibGVuZCApCiAgICAgICB7CisgICAgICAgIC8qIGEgc21hbGwgb3V0bGluZSBzdHJ1Y3R1cmUgd2l0aCBmb3VyIGVsZW1lbnRzIGZvciAqLworICAgICAgICAvKiBjb21tdW5pY2F0aW9uIHdpdGggYFRUX1ZhcnlfQXBwbHlfR2x5cGhfRGVsdGFzJyAgKi8KKyAgICAgICAgRlRfVmVjdG9yICAgcG9pbnRzWzRdOworICAgICAgICBjaGFyICAgICAgICB0YWdzWzRdICAgICA9IHsgMSwgMSwgMSwgMSB9OworICAgICAgICBzaG9ydCAgICAgICBjb250b3Vyc1s0XSA9IHsgMCwgMSwgMiwgMyB9OworICAgICAgICBGVF9PdXRsaW5lICBvdXRsaW5lOworCisKKyAgICAgICAgcG9pbnRzWzBdLnggPSBsb2FkZXItPnBwMS54OworICAgICAgICBwb2ludHNbMF0ueSA9IGxvYWRlci0+cHAxLnk7CisgICAgICAgIHBvaW50c1sxXS54ID0gbG9hZGVyLT5wcDIueDsKKyAgICAgICAgcG9pbnRzWzFdLnkgPSBsb2FkZXItPnBwMi55OworCisgICAgICAgIHBvaW50c1syXS54ID0gbG9hZGVyLT5wcDMueDsKKyAgICAgICAgcG9pbnRzWzJdLnkgPSBsb2FkZXItPnBwMy55OworICAgICAgICBwb2ludHNbM10ueCA9IGxvYWRlci0+cHA0Lng7CisgICAgICAgIHBvaW50c1szXS55ID0gbG9hZGVyLT5wcDQueTsKKworICAgICAgICBvdXRsaW5lLm5fcG9pbnRzICAgPSA0OworICAgICAgICBvdXRsaW5lLm5fY29udG91cnMgPSA0OworICAgICAgICBvdXRsaW5lLnBvaW50cyAgICAgPSBwb2ludHM7CisgICAgICAgIG91dGxpbmUudGFncyAgICAgICA9IHRhZ3M7CisgICAgICAgIG91dGxpbmUuY29udG91cnMgICA9IGNvbnRvdXJzOworCiAgICAgICAgIC8qIHRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSBzY2FsaW5nICovCi0gICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbG9hZGVyLT5mYWNlLT5tZW1vcnk7Ci0KLQotICAgICAgICBlcnJvciA9IFRUX1ZhcnlfR2V0X0dseXBoX0RlbHRhcyggKFRUX0ZhY2UpKGxvYWRlci0+ZmFjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwgJmRlbHRhcywgNCApOworICAgICAgICBlcnJvciA9IFRUX1ZhcnlfQXBwbHlfR2x5cGhfRGVsdGFzKCBsb2FkZXItPmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpb3V0bGluZS5uX3BvaW50cyApOwogICAgICAgICBpZiAoIGVycm9yICkKICAgICAgICAgICBnb3RvIEV4aXQ7CiAKLSAgICAgICAgbG9hZGVyLT5wcDEueCArPSBkZWx0YXNbMF0ueDsKLSAgICAgICAgbG9hZGVyLT5wcDEueSArPSBkZWx0YXNbMF0ueTsKLSAgICAgICAgbG9hZGVyLT5wcDIueCArPSBkZWx0YXNbMV0ueDsKLSAgICAgICAgbG9hZGVyLT5wcDIueSArPSBkZWx0YXNbMV0ueTsKKyAgICAgICAgbG9hZGVyLT5wcDEueCA9IHBvaW50c1swXS54OworICAgICAgICBsb2FkZXItPnBwMS55ID0gcG9pbnRzWzBdLnk7CisgICAgICAgIGxvYWRlci0+cHAyLnggPSBwb2ludHNbMV0ueDsKKyAgICAgICAgbG9hZGVyLT5wcDIueSA9IHBvaW50c1sxXS55OwogCi0gICAgICAgIGxvYWRlci0+cHAzLnggKz0gZGVsdGFzWzJdLng7Ci0gICAgICAgIGxvYWRlci0+cHAzLnkgKz0gZGVsdGFzWzJdLnk7Ci0gICAgICAgIGxvYWRlci0+cHA0LnggKz0gZGVsdGFzWzNdLng7Ci0gICAgICAgIGxvYWRlci0+cHA0LnkgKz0gZGVsdGFzWzNdLnk7Ci0KLSAgICAgICAgRlRfRlJFRSggZGVsdGFzICk7CisgICAgICAgIGxvYWRlci0+cHAzLnggPSBwb2ludHNbMl0ueDsKKyAgICAgICAgbG9hZGVyLT5wcDMueSA9IHBvaW50c1syXS55OworICAgICAgICBsb2FkZXItPnBwNC54ID0gcG9pbnRzWzNdLng7CisgICAgICAgIGxvYWRlci0+cHA0LnkgPSBwb2ludHNbM10ueTsKICAgICAgIH0KIAogI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQgKi8KQEAgLTE2MzMsOCArMTYzMiw4IEBACiAgICAgICBGVF9VTG9uZyAgaW5zX3BvczsgIC8qIHBvc2l0aW9uIG9mIGNvbXBvc2l0ZSBpbnN0cnVjdGlvbnMsIGlmIGFueSAqLwogCiAKLSAgICAgIHN0YXJ0X3BvaW50ICAgPSBnbG9hZGVyLT5iYXNlLm91dGxpbmUubl9wb2ludHM7Ci0gICAgICBzdGFydF9jb250b3VyID0gZ2xvYWRlci0+YmFzZS5vdXRsaW5lLm5fY29udG91cnM7CisgICAgICBzdGFydF9wb2ludCAgID0gKEZUX1VJbnQpZ2xvYWRlci0+YmFzZS5vdXRsaW5lLm5fcG9pbnRzOworICAgICAgc3RhcnRfY29udG91ciA9IChGVF9VSW50KWdsb2FkZXItPmJhc2Uub3V0bGluZS5uX2NvbnRvdXJzOwogCiAgICAgICAvKiBmb3IgZWFjaCBzdWJnbHlwaCwgcmVhZCBjb21wb3NpdGUgaGVhZGVyICovCiAgICAgICBlcnJvciA9IGZhY2UtPnJlYWRfY29tcG9zaXRlX2dseXBoKCBsb2FkZXIgKTsKQEAgLTE2NTIsNDcgKzE2NTEsMTA2IEBACiAKICAgICAgIGlmICggZmFjZS0+ZG9ibGVuZCApCiAgICAgICB7Ci0gICAgICAgIEZUX0ludCAgICAgICBpLCBsaW1pdDsKKyAgICAgICAgc2hvcnQgICAgICAgIGksIGxpbWl0OwogICAgICAgICBGVF9TdWJHbHlwaCAgc3ViZ2x5cGg7Ci0gICAgICAgIEZUX01lbW9yeSAgICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKKworICAgICAgICBGVF9PdXRsaW5lICBvdXRsaW5lOworICAgICAgICBGVF9WZWN0b3IqICBwb2ludHMgICA9IE5VTEw7CisgICAgICAgIGNoYXIqICAgICAgIHRhZ3MgICAgID0gTlVMTDsKKyAgICAgICAgc2hvcnQqICAgICAgY29udG91cnMgPSBOVUxMOworCisgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7CiAKIAotICAgICAgICAvKiB0aGlzIHByb3ZpZGVzIGFkZGl0aW9uYWwgb2Zmc2V0cyAqLwotICAgICAgICAvKiBmb3IgZWFjaCBjb21wb25lbnQncyB0cmFuc2xhdGlvbiAqLworICAgICAgICBsaW1pdCA9IChzaG9ydClnbG9hZGVyLT5jdXJyZW50Lm51bV9zdWJnbHlwaHM7CiAKLSAgICAgICAgaWYgKCAoIGVycm9yID0gVFRfVmFyeV9HZXRfR2x5cGhfRGVsdGFzKAotICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJmRlbHRhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBnbG9hZGVyLT5jdXJyZW50Lm51bV9zdWJnbHlwaHMgKyA0ICkgKSAhPSAwICkKLSAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIC8qIGNvbnN0cnVjdCBhbiBvdXRsaW5lIHN0cnVjdHVyZSBmb3IgICAgICAgICAgICAgICovCisgICAgICAgIC8qIGNvbW11bmljYXRpb24gd2l0aCBgVFRfVmFyeV9BcHBseV9HbHlwaF9EZWx0YXMnICovCisgICAgICAgIG91dGxpbmUubl9wb2ludHMgICA9IChzaG9ydCkoIGdsb2FkZXItPmN1cnJlbnQubnVtX3N1YmdseXBocyArIDQgKTsKKyAgICAgICAgb3V0bGluZS5uX2NvbnRvdXJzID0gb3V0bGluZS5uX3BvaW50czsKIAotICAgICAgICBzdWJnbHlwaCA9IGdsb2FkZXItPmN1cnJlbnQuc3ViZ2x5cGhzICsgZ2xvYWRlci0+YmFzZS5udW1fc3ViZ2x5cGhzOwotICAgICAgICBsaW1pdCAgICA9IGdsb2FkZXItPmN1cnJlbnQubnVtX3N1YmdseXBoczsKKyAgICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIHBvaW50cywgb3V0bGluZS5uX3BvaW50cyApICAgfHwKKyAgICAgICAgICAgICBGVF9ORVdfQVJSQVkoIHRhZ3MsIG91dGxpbmUubl9wb2ludHMgKSAgICAgfHwKKyAgICAgICAgICAgICBGVF9ORVdfQVJSQVkoIGNvbnRvdXJzLCBvdXRsaW5lLm5fcG9pbnRzICkgKQorICAgICAgICAgIGdvdG8gRXhpdDE7CiAKLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCBsaW1pdDsgKytpLCArK3N1YmdseXBoICkKKyAgICAgICAgc3ViZ2x5cGggPSBnbG9hZGVyLT5jdXJyZW50LnN1YmdseXBoczsKKworICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGxpbWl0OyBpKyssIHN1YmdseXBoKysgKQogICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBzdWJnbHlwaC0+ZmxhZ3MgJiBBUkdTX0FSRV9YWV9WQUxVRVMgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIFhYWDogb3ZlcmZsb3cgY2hlY2sgZm9yIHN1YmdseXBoLT57YXJnMSxhcmcyfS4gICAqLwotICAgICAgICAgICAgLyogZGVsdGFzW2ldLnt4LHl9IG11c3QgYmUgd2l0aGluIHNpZ25lZCAxNi1iaXQsICAgICovCi0gICAgICAgICAgICAvKiBidXQgdGhlIHJlc3RyaWN0aW9uIG9mIHN1bW1lZCBkZWx0YSBpcyBub3QgY2xlYXIgKi8KLSAgICAgICAgICAgIHN1YmdseXBoLT5hcmcxICs9IChGVF9JbnQxNilkZWx0YXNbaV0ueDsKLSAgICAgICAgICAgIHN1YmdseXBoLT5hcmcyICs9IChGVF9JbnQxNilkZWx0YXNbaV0ueTsKLSAgICAgICAgICB9CisgICAgICAgICAgLyogYXBwbHlpbmcgZGVsdGFzIGZvciBhbmNob3IgcG9pbnRzIGRvZXNuJ3QgbWFrZSBzZW5zZSwgKi8KKyAgICAgICAgICAvKiBidXQgd2UgZG9uJ3QgaGF2ZSB0byBzcGVjaWFsbHkgY2hlY2sgdGhpcyBzaW5jZSAgICAgICAqLworICAgICAgICAgIC8qIHVudXNlZCBkZWx0YSB2YWx1ZXMgYXJlIHplcm8gYW55d2F5cyAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgcG9pbnRzW2ldLnggPSBzdWJnbHlwaC0+YXJnMTsKKyAgICAgICAgICBwb2ludHNbaV0ueSA9IHN1YmdseXBoLT5hcmcyOworICAgICAgICAgIHRhZ3NbaV0gICAgID0gMTsKKyAgICAgICAgICBjb250b3Vyc1tpXSA9IGk7CiAgICAgICAgIH0KIAotICAgICAgICBsb2FkZXItPnBwMS54ICs9IGRlbHRhc1tpICsgMF0ueDsKLSAgICAgICAgbG9hZGVyLT5wcDEueSArPSBkZWx0YXNbaSArIDBdLnk7Ci0gICAgICAgIGxvYWRlci0+cHAyLnggKz0gZGVsdGFzW2kgKyAxXS54OwotICAgICAgICBsb2FkZXItPnBwMi55ICs9IGRlbHRhc1tpICsgMV0ueTsKKyAgICAgICAgcG9pbnRzW2ldLnggPSBsb2FkZXItPnBwMS54OworICAgICAgICBwb2ludHNbaV0ueSA9IGxvYWRlci0+cHAxLnk7CisgICAgICAgIHRhZ3NbaV0gICAgID0gMTsKKyAgICAgICAgY29udG91cnNbaV0gPSBpOwogCi0gICAgICAgIGxvYWRlci0+cHAzLnggKz0gZGVsdGFzW2kgKyAyXS54OwotICAgICAgICBsb2FkZXItPnBwMy55ICs9IGRlbHRhc1tpICsgMl0ueTsKLSAgICAgICAgbG9hZGVyLT5wcDQueCArPSBkZWx0YXNbaSArIDNdLng7Ci0gICAgICAgIGxvYWRlci0+cHA0LnkgKz0gZGVsdGFzW2kgKyAzXS55OworICAgICAgICBpKys7CisgICAgICAgIHBvaW50c1tpXS54ID0gbG9hZGVyLT5wcDIueDsKKyAgICAgICAgcG9pbnRzW2ldLnkgPSBsb2FkZXItPnBwMi55OworICAgICAgICB0YWdzW2ldICAgICA9IDE7CisgICAgICAgIGNvbnRvdXJzW2ldID0gaTsKIAotICAgICAgICBGVF9GUkVFKCBkZWx0YXMgKTsKKyAgICAgICAgaSsrOworICAgICAgICBwb2ludHNbaV0ueCA9IGxvYWRlci0+cHAzLng7CisgICAgICAgIHBvaW50c1tpXS55ID0gbG9hZGVyLT5wcDMueTsKKyAgICAgICAgdGFnc1tpXSAgICAgPSAxOworICAgICAgICBjb250b3Vyc1tpXSA9IGk7CisKKyAgICAgICAgaSsrOworICAgICAgICBwb2ludHNbaV0ueCA9IGxvYWRlci0+cHA0Lng7CisgICAgICAgIHBvaW50c1tpXS55ID0gbG9hZGVyLT5wcDQueTsKKyAgICAgICAgdGFnc1tpXSAgICAgPSAxOworICAgICAgICBjb250b3Vyc1tpXSA9IGk7CisKKyAgICAgICAgb3V0bGluZS5wb2ludHMgICA9IHBvaW50czsKKyAgICAgICAgb3V0bGluZS50YWdzICAgICA9IHRhZ3M7CisgICAgICAgIG91dGxpbmUuY29udG91cnMgPSBjb250b3VyczsKKworICAgICAgICAvKiB0aGlzIGNhbGwgcHJvdmlkZXMgYWRkaXRpb25hbCBvZmZzZXRzICovCisgICAgICAgIC8qIGZvciBlYWNoIGNvbXBvbmVudCdzIHRyYW5zbGF0aW9uICAgICAgKi8KKyAgICAgICAgaWYgKCAoIGVycm9yID0gVFRfVmFyeV9BcHBseV9HbHlwaF9EZWx0YXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludClvdXRsaW5lLm5fcG9pbnRzICkgKSAhPSAwICkKKyAgICAgICAgICBnb3RvIEV4aXQxOworCisgICAgICAgIHN1YmdseXBoID0gZ2xvYWRlci0+Y3VycmVudC5zdWJnbHlwaHM7CisKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBsaW1pdDsgaSsrLCBzdWJnbHlwaCsrICkKKyAgICAgICAgeworICAgICAgICAgIC8qIFhYWDogb3ZlcmZsb3cgY2hlY2sgZm9yIHN1YmdseXBoLT57YXJnMSxhcmcyfS4gICAgICAgICAqLworICAgICAgICAgIC8qICAgICAgRGVsdGFzIG11c3QgYmUgd2l0aGluIHNpZ25lZCAxNi1iaXQsICAgICAgICAgICAgICAqLworICAgICAgICAgIC8qICAgICAgYnV0IHRoZSByZXN0cmljdGlvbiBvZiBzdW1tZWQgZGVsdGFzIGlzIG5vdCBjbGVhciAqLworICAgICAgICAgIHN1YmdseXBoLT5hcmcxID0gKEZUX0ludDE2KXBvaW50c1tpXS54OworICAgICAgICAgIHN1YmdseXBoLT5hcmcyID0gKEZUX0ludDE2KXBvaW50c1tpXS55OworICAgICAgICB9CisKKyAgICAgICAgbG9hZGVyLT5wcDEueCA9IHBvaW50c1tpICsgMF0ueDsKKyAgICAgICAgbG9hZGVyLT5wcDEueSA9IHBvaW50c1tpICsgMF0ueTsKKyAgICAgICAgbG9hZGVyLT5wcDIueCA9IHBvaW50c1tpICsgMV0ueDsKKyAgICAgICAgbG9hZGVyLT5wcDIueSA9IHBvaW50c1tpICsgMV0ueTsKKworICAgICAgICBsb2FkZXItPnBwMy54ID0gcG9pbnRzW2kgKyAyXS54OworICAgICAgICBsb2FkZXItPnBwMy55ID0gcG9pbnRzW2kgKyAyXS55OworICAgICAgICBsb2FkZXItPnBwNC54ID0gcG9pbnRzW2kgKyAzXS54OworICAgICAgICBsb2FkZXItPnBwNC55ID0gcG9pbnRzW2kgKyAzXS55OworCisgICAgICBFeGl0MToKKyAgICAgICAgRlRfRlJFRSggb3V0bGluZS5wb2ludHMgKTsKKyAgICAgICAgRlRfRlJFRSggb3V0bGluZS50YWdzICk7CisgICAgICAgIEZUX0ZSRUUoIG91dGxpbmUuY29udG91cnMgKTsKKworICAgICAgICBpZiAoIGVycm9yICkKKyAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICB9CiAKICNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUICovCkBAIC0xNzI4LDcgKzE3ODYsNyBAQAogCiAgICAgICB7CiAgICAgICAgIEZUX1VJbnQgICAgICBuLCBudW1fYmFzZV9wb2ludHM7Ci0gICAgICAgIEZUX1N1YkdseXBoICBzdWJnbHlwaCAgICAgICA9IDA7CisgICAgICAgIEZUX1N1YkdseXBoICBzdWJnbHlwaCAgICAgICA9IE5VTEw7CiAKICAgICAgICAgRlRfVUludCAgICAgIG51bV9wb2ludHMgICAgID0gc3RhcnRfcG9pbnQ7CiAgICAgICAgIEZUX1VJbnQgICAgICBudW1fc3ViZ2x5cGhzICA9IGdsb2FkZXItPmN1cnJlbnQubnVtX3N1YmdseXBoczsKQEAgLTE3NTcsMTAgKzE4MTUsMTIgQEAKICAgICAgICAgICBwcFsyXSA9IGxvYWRlci0+cHAzOwogICAgICAgICAgIHBwWzNdID0gbG9hZGVyLT5wcDQ7CiAKLSAgICAgICAgICBudW1fYmFzZV9wb2ludHMgPSBnbG9hZGVyLT5iYXNlLm91dGxpbmUubl9wb2ludHM7CisgICAgICAgICAgbnVtX2Jhc2VfcG9pbnRzID0gKEZUX1VJbnQpZ2xvYWRlci0+YmFzZS5vdXRsaW5lLm5fcG9pbnRzOwogCi0gICAgICAgICAgZXJyb3IgPSBsb2FkX3RydWV0eXBlX2dseXBoKCBsb2FkZXIsIHN1YmdseXBoLT5pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2VfY291bnQgKyAxLCBGQUxTRSApOworICAgICAgICAgIGVycm9yID0gbG9hZF90cnVldHlwZV9nbHlwaCggbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpc3ViZ2x5cGgtPmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZV9jb3VudCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSApOwogICAgICAgICAgIGlmICggZXJyb3IgKQogICAgICAgICAgICAgZ290byBFeGl0OwogCkBAIC0xNzc2LDcgKzE4MzYsNyBAQAogICAgICAgICAgICAgbG9hZGVyLT5wcDQgPSBwcFszXTsKICAgICAgICAgICB9CiAKLSAgICAgICAgICBudW1fcG9pbnRzID0gZ2xvYWRlci0+YmFzZS5vdXRsaW5lLm5fcG9pbnRzOworICAgICAgICAgIG51bV9wb2ludHMgPSAoRlRfVUludClnbG9hZGVyLT5iYXNlLm91dGxpbmUubl9wb2ludHM7CiAKICAgICAgICAgICBpZiAoIG51bV9wb2ludHMgPT0gbnVtX2Jhc2VfcG9pbnRzICkKICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMTg0Nyw3ICsxOTA3LDcgQEAKICAgY29tcHV0ZV9nbHlwaF9tZXRyaWNzKCBUVF9Mb2FkZXIgIGxvYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGdseXBoX2luZGV4ICkKICAgewotICAgIFRUX0ZhY2UgICAgZmFjZSAgID0gKFRUX0ZhY2UpbG9hZGVyLT5mYWNlOworICAgIFRUX0ZhY2UgICAgZmFjZSAgID0gbG9hZGVyLT5mYWNlOwogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwogICAgIFRUX0RyaXZlciAgZHJpdmVyID0gKFRUX0RyaXZlcilGVF9GQUNFX0RSSVZFUiggZmFjZSApOwogI2VuZGlmCkBAIC0xODU1LDcgKzE5MTUsNyBAQAogICAgIEZUX0JCb3ggICAgICAgYmJveDsKICAgICBGVF9GaXhlZCAgICAgIHlfc2NhbGU7CiAgICAgVFRfR2x5cGhTbG90ICBnbHlwaCA9IGxvYWRlci0+Z2x5cGg7Ci0gICAgVFRfU2l6ZSAgICAgICBzaXplICA9IChUVF9TaXplKWxvYWRlci0+c2l6ZTsKKyAgICBUVF9TaXplICAgICAgIHNpemUgID0gbG9hZGVyLT5zaXplOwogCiAKICAgICB5X3NjYWxlID0gMHgxMDAwMEw7CkBAIC0xODc2LDggKzE5MzYsMTAgQEAKICAgICBnbHlwaC0+bWV0cmljcy5ob3JpQWR2YW5jZSAgPSBsb2FkZXItPnBwMi54IC0gbG9hZGVyLT5wcDEueDsKIAogICAgIC8qIGFkanVzdCBhZHZhbmNlIHdpZHRoIHRvIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIGhkbXggdGFibGUgKi8KLSAgICBpZiAoICFmYWNlLT5wb3N0c2NyaXB0LmlzRml4ZWRQaXRjaCAgJiYKLSAgICAgICAgIElTX0hJTlRFRCggbG9hZGVyLT5sb2FkX2ZsYWdzICkgKQorICAgIC8qIHVubGVzcyBGVF9MT0FEX0NPTVBVVEVfTUVUUklDUyBpcyBzZXQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoICFmYWNlLT5wb3N0c2NyaXB0LmlzRml4ZWRQaXRjaCAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgIElTX0hJTlRFRCggbG9hZGVyLT5sb2FkX2ZsYWdzICkgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICEoIGxvYWRlci0+bG9hZF9mbGFncyAmIEZUX0xPQURfQ09NUFVURV9NRVRSSUNTICkgKQogICAgIHsKICAgICAgIEZUX0J5dGUqICB3aWR0aHA7CiAKQEAgLTE5MDAsNyArMTk2Miw3IEBACiAgICAgICAgICAgICAgKCAoIGlnbm9yZV94X21vZGUgJiYgbG9hZGVyLT5leGVjLT5jb21wYXRpYmxlX3dpZHRocyApIHx8CiAgICAgICAgICAgICAgICAgIWlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CiAgICAgICAgICAgICAgICAgU1BIX09QVElPTl9CSVRNQVBfV0lEVEhTICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKQotICAgICAgICAgIGdseXBoLT5tZXRyaWNzLmhvcmlBZHZhbmNlID0gKndpZHRocCA8PCA2OworICAgICAgICAgIGdseXBoLT5tZXRyaWNzLmhvcmlBZHZhbmNlID0gKndpZHRocCAqIDY0OwogICAgICAgfQogICAgICAgZWxzZQogCkBAIC0xOTA4LDcgKzE5NzAsNyBAQAogCiAgICAgICB7CiAgICAgICAgIGlmICggd2lkdGhwICkKLSAgICAgICAgICBnbHlwaC0+bWV0cmljcy5ob3JpQWR2YW5jZSA9ICp3aWR0aHAgPDwgNjsKKyAgICAgICAgICBnbHlwaC0+bWV0cmljcy5ob3JpQWR2YW5jZSA9ICp3aWR0aHAgKiA2NDsKICAgICAgIH0KICAgICB9CiAKQEAgLTIwMzksNyArMjEwMSw3IEBACiAgICAgZXJyb3IgPSBzZm50LT5sb2FkX3NiaXRfaW1hZ2UoIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUtPnN0cmlrZV9pbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9JbnQpbG9hZF9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpbG9hZF9mbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2x5cGgtPmJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1ldHJpY3MgKTsKQEAgLTIwNDgsMTYgKzIxMTAsMTYgQEAKICAgICAgIGdseXBoLT5vdXRsaW5lLm5fcG9pbnRzICAgPSAwOwogICAgICAgZ2x5cGgtPm91dGxpbmUubl9jb250b3VycyA9IDA7CiAKLSAgICAgIGdseXBoLT5tZXRyaWNzLndpZHRoICA9IChGVF9Qb3MpbWV0cmljcy53aWR0aCAgPDwgNjsKLSAgICAgIGdseXBoLT5tZXRyaWNzLmhlaWdodCA9IChGVF9Qb3MpbWV0cmljcy5oZWlnaHQgPDwgNjsKKyAgICAgIGdseXBoLT5tZXRyaWNzLndpZHRoICA9IChGVF9Qb3MpbWV0cmljcy53aWR0aCAgKiA2NDsKKyAgICAgIGdseXBoLT5tZXRyaWNzLmhlaWdodCA9IChGVF9Qb3MpbWV0cmljcy5oZWlnaHQgKiA2NDsKIAotICAgICAgZ2x5cGgtPm1ldHJpY3MuaG9yaUJlYXJpbmdYID0gKEZUX1BvcyltZXRyaWNzLmhvcmlCZWFyaW5nWCA8PCA2OwotICAgICAgZ2x5cGgtPm1ldHJpY3MuaG9yaUJlYXJpbmdZID0gKEZUX1BvcyltZXRyaWNzLmhvcmlCZWFyaW5nWSA8PCA2OwotICAgICAgZ2x5cGgtPm1ldHJpY3MuaG9yaUFkdmFuY2UgID0gKEZUX1BvcyltZXRyaWNzLmhvcmlBZHZhbmNlICA8PCA2OworICAgICAgZ2x5cGgtPm1ldHJpY3MuaG9yaUJlYXJpbmdYID0gKEZUX1BvcyltZXRyaWNzLmhvcmlCZWFyaW5nWCAqIDY0OworICAgICAgZ2x5cGgtPm1ldHJpY3MuaG9yaUJlYXJpbmdZID0gKEZUX1BvcyltZXRyaWNzLmhvcmlCZWFyaW5nWSAqIDY0OworICAgICAgZ2x5cGgtPm1ldHJpY3MuaG9yaUFkdmFuY2UgID0gKEZUX1BvcyltZXRyaWNzLmhvcmlBZHZhbmNlICAqIDY0OwogCi0gICAgICBnbHlwaC0+bWV0cmljcy52ZXJ0QmVhcmluZ1ggPSAoRlRfUG9zKW1ldHJpY3MudmVydEJlYXJpbmdYIDw8IDY7Ci0gICAgICBnbHlwaC0+bWV0cmljcy52ZXJ0QmVhcmluZ1kgPSAoRlRfUG9zKW1ldHJpY3MudmVydEJlYXJpbmdZIDw8IDY7Ci0gICAgICBnbHlwaC0+bWV0cmljcy52ZXJ0QWR2YW5jZSAgPSAoRlRfUG9zKW1ldHJpY3MudmVydEFkdmFuY2UgIDw8IDY7CisgICAgICBnbHlwaC0+bWV0cmljcy52ZXJ0QmVhcmluZ1ggPSAoRlRfUG9zKW1ldHJpY3MudmVydEJlYXJpbmdYICogNjQ7CisgICAgICBnbHlwaC0+bWV0cmljcy52ZXJ0QmVhcmluZ1kgPSAoRlRfUG9zKW1ldHJpY3MudmVydEJlYXJpbmdZICogNjQ7CisgICAgICBnbHlwaC0+bWV0cmljcy52ZXJ0QWR2YW5jZSAgPSAoRlRfUG9zKW1ldHJpY3MudmVydEFkdmFuY2UgICogNjQ7CiAKICAgICAgIGdseXBoLT5mb3JtYXQgPSBGVF9HTFlQSF9GT1JNQVRfQklUTUFQOwogCkBAIC0yMTExLDE0ICsyMTczLDE2IEBACiAjaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCiAgICAgICBUVF9Ecml2ZXIgIGRyaXZlciA9IChUVF9Ecml2ZXIpRlRfRkFDRV9EUklWRVIoIGZhY2UgKTsKIAotICAgICAgRlRfQm9vbCAgc3VicGl4ZWwgPSBGQUxTRTsKKyAgICAgIEZUX0Jvb2wgIHN1YnBpeGVsX2hpbnRpbmcgPSBGQUxTRTsKIAogI2lmIDAKICAgICAgIC8qIG5vdCB1c2VkIHlldCAqLwogICAgICAgRlRfQm9vbCAgY29tcGF0aWJsZV93aWR0aHM7CiAgICAgICBGVF9Cb29sICBzeW1tZXRyaWNhbF9zbW9vdGhpbmc7CiAgICAgICBGVF9Cb29sICBiZ3I7CisgICAgICBGVF9Cb29sICB2ZXJ0aWNhbF9sY2Q7CiAgICAgICBGVF9Cb29sICBzdWJwaXhlbF9wb3NpdGlvbmVkOworICAgICAgRlRfQm9vbCAgZ3JheV9jbGVhcnR5cGU7CiAjZW5kaWYKICNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KIApAQCAtMjEzNyw4ICsyMjAxLDcgQEAKICAgICAgICAgcmV0dXJuIHNpemUtPmN2dF9yZWFkeTsKIAogICAgICAgLyogcXVlcnkgbmV3IGV4ZWN1dGlvbiBjb250ZXh0ICovCi0gICAgICBleGVjID0gc2l6ZS0+ZGVidWcgPyBzaXplLT5jb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgOiAoIChUVF9Ecml2ZXIpRlRfRkFDRV9EUklWRVIoIGZhY2UgKSApLT5jb250ZXh0OworICAgICAgZXhlYyA9IHNpemUtPmNvbnRleHQ7CiAgICAgICBpZiAoICFleGVjICkKICAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDb3VsZF9Ob3RfRmluZF9Db250ZXh0ICk7CiAKQEAgLTIxNDYsMzMgKzIyMDksMzUgQEAKIAogICAgICAgaWYgKCBkcml2ZXItPmludGVycHJldGVyX3ZlcnNpb24gPT0gVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zOCApCiAgICAgICB7Ci0gICAgICAgIHN1YnBpeGVsID0gRlRfQk9PTCggKCBGVF9MT0FEX1RBUkdFVF9NT0RFKCBsb2FkX2ZsYWdzICkgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JFTkRFUl9NT0RFX01PTk8gICAgICAgICAgICAgICApICAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSF9PUFRJT05fU0VUX1NVQlBJWEVMICAgICAgICAgICAgICAgICk7CisgICAgICAgIHN1YnBpeGVsX2hpbnRpbmcgPSBGVF9CT09MKCAoIEZUX0xPQURfVEFSR0VUX01PREUoIGxvYWRfZmxhZ3MgKSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9SRU5ERVJfTU9ERV9NT05PICAgICAgICAgICAgICAgKSAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSF9PUFRJT05fU0VUX1NVQlBJWEVMICAgICAgICAgICAgICAgICk7CiAKLSAgICAgICAgaWYgKCBzdWJwaXhlbCApCisgICAgICAgIGlmICggc3VicGl4ZWxfaGludGluZyApCiAgICAgICAgICAgZ3JheXNjYWxlID0gRkFMU0U7CiAgICAgICAgIGVsc2UgaWYgKCBTUEhfT1BUSU9OX1NFVF9HUkFZU0NBTEUgKQogICAgICAgICB7Ci0gICAgICAgICAgZ3JheXNjYWxlID0gVFJVRTsKLSAgICAgICAgICBzdWJwaXhlbCAgPSBGQUxTRTsKKyAgICAgICAgICBncmF5c2NhbGUgICAgICAgID0gVFJVRTsKKyAgICAgICAgICBzdWJwaXhlbF9oaW50aW5nID0gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICAgIGdyYXlzY2FsZSA9IEZBTFNFOwogCiAgICAgICAgIGlmICggRlRfSVNfVFJJQ0tZKCBnbHlwaC0+ZmFjZSApICkKLSAgICAgICAgICBzdWJwaXhlbCA9IEZBTFNFOworICAgICAgICAgIHN1YnBpeGVsX2hpbnRpbmcgPSBGQUxTRTsKIAotICAgICAgICBleGVjLT5pZ25vcmVfeF9tb2RlICAgICAgPSBzdWJwaXhlbCB8fCBncmF5c2NhbGU7CisgICAgICAgIGV4ZWMtPmlnbm9yZV94X21vZGUgICAgICA9IHN1YnBpeGVsX2hpbnRpbmcgfHwgZ3JheXNjYWxlOwogICAgICAgICBleGVjLT5yYXN0ZXJpemVyX3ZlcnNpb24gPSBTUEhfT1BUSU9OX1NFVF9SQVNURVJJWkVSX1ZFUlNJT047CiAgICAgICAgIGlmICggZXhlYy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX1JBU1RFUklaRVJfMzUgKQogICAgICAgICAgIGV4ZWMtPnJhc3Rlcml6ZXJfdmVyc2lvbiA9IFRUX0lOVEVSUFJFVEVSX1ZFUlNJT05fMzU7CiAKICNpZiAxCiAgICAgICAgIGV4ZWMtPmNvbXBhdGlibGVfd2lkdGhzICAgICA9IFNQSF9PUFRJT05fU0VUX0NPTVBBVElCTEVfV0lEVEhTOwotICAgICAgICBleGVjLT5zeW1tZXRyaWNhbF9zbW9vdGhpbmcgPSBGQUxTRTsKKyAgICAgICAgZXhlYy0+c3ltbWV0cmljYWxfc21vb3RoaW5nID0gVFJVRTsKICAgICAgICAgZXhlYy0+YmdyICAgICAgICAgICAgICAgICAgID0gRkFMU0U7CisgICAgICAgIGV4ZWMtPnZlcnRpY2FsX2xjZCAgICAgICAgICA9IEZBTFNFOwogICAgICAgICBleGVjLT5zdWJwaXhlbF9wb3NpdGlvbmVkICAgPSBUUlVFOworICAgICAgICBleGVjLT5ncmF5X2NsZWFydHlwZSAgICAgICAgPSBGQUxTRTsKICNlbHNlIC8qIDAgKi8KICAgICAgICAgZXhlYy0+Y29tcGF0aWJsZV93aWR0aHMgPQogICAgICAgICAgIEZUX0JPT0woIEZUX0xPQURfVEFSR0VUX01PREUoIGxvYWRfZmxhZ3MgKSAhPQpAQCAtMjE4Myw5ICsyMjQ4LDE1IEBACiAgICAgICAgIGV4ZWMtPmJnciA9CiAgICAgICAgICAgRlRfQk9PTCggRlRfTE9BRF9UQVJHRVRfTU9ERSggbG9hZF9mbGFncyApICE9CiAgICAgICAgICAgICAgICAgICAgVFRfTE9BRF9CR1IgKTsKKyAgICAgICAgZXhlYy0+dmVydGljYWxfbGNkID0KKyAgICAgICAgICBGVF9CT09MKCBGVF9MT0FEX1RBUkdFVF9NT0RFKCBsb2FkX2ZsYWdzICkgIT0KKyAgICAgICAgICAgICAgICAgICBUVF9MT0FEX1ZFUlRJQ0FMX0xDRCApOwogICAgICAgICBleGVjLT5zdWJwaXhlbF9wb3NpdGlvbmVkID0KICAgICAgICAgICBGVF9CT09MKCBGVF9MT0FEX1RBUkdFVF9NT0RFKCBsb2FkX2ZsYWdzICkgIT0KICAgICAgICAgICAgICAgICAgICBUVF9MT0FEX1NVQlBJWEVMX1BPU0lUSU9ORUQgKTsKKyAgICAgICAgZXhlYy0+Z3JheV9jbGVhcnR5cGUgPQorICAgICAgICAgIEZUX0JPT0woIEZUX0xPQURfVEFSR0VUX01PREUoIGxvYWRfZmxhZ3MgKSAhPQorICAgICAgICAgICAgICAgICAgIFRUX0xPQURfR1JBWV9DTEVBUlRZUEUgKTsKICNlbmRpZiAvKiAwICovCiAKICAgICAgIH0KQEAgLTIyMDgsMTMgKzIyNzksMTMgQEAKICAgICAgIHsKICAgICAgICAgLyogYSBjaGFuZ2UgZnJvbSBtb25vIHRvIHN1YnBpeGVsIHJlbmRlcmluZyAoYW5kIHZpY2UgdmVyc2EpICovCiAgICAgICAgIC8qIHJlcXVpcmVzIGEgcmUtZXhlY3V0aW9uIG9mIHRoZSBDVlQgcHJvZ3JhbSAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIHN1YnBpeGVsICE9IGV4ZWMtPnN1YnBpeGVsICkKKyAgICAgICAgaWYgKCBzdWJwaXhlbF9oaW50aW5nICE9IGV4ZWMtPnN1YnBpeGVsX2hpbnRpbmcgKQogICAgICAgICB7CiAgICAgICAgICAgRlRfVFJBQ0U0KCggInR0X2xvYWRlcl9pbml0OiBzdWJwaXhlbCBoaW50aW5nIGNoYW5nZSwiCiAgICAgICAgICAgICAgICAgICAgICAgIiByZS1leGVjdXRpbmcgYHByZXAnIHRhYmxlXG4iICkpOwogCi0gICAgICAgICAgZXhlYy0+c3VicGl4ZWwgPSBzdWJwaXhlbDsKLSAgICAgICAgICByZWV4ZWN1dGUgICAgICA9IFRSVUU7CisgICAgICAgICAgZXhlYy0+c3VicGl4ZWxfaGludGluZyA9IHN1YnBpeGVsX2hpbnRpbmc7CisgICAgICAgICAgcmVleGVjdXRlICAgICAgICAgICAgICA9IFRSVUU7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBhIGNoYW5nZSBmcm9tIG1vbm8gdG8gZ3JheXNjYWxlIHJlbmRlcmluZyAoYW5kIHZpY2UgdmVyc2EpICovCkBAIC0yMjM3LDcgKzIzMDgsNyBAQAogICAgICAgICAvKiByZXF1aXJlcyBhIHJlLWV4ZWN1dGlvbiBvZiB0aGUgQ1ZUIHByb2dyYW0gICAgICAgICAgICAgICAgICovCiAgICAgICAgIGlmICggZ3JheXNjYWxlICE9IGV4ZWMtPmdyYXlzY2FsZSApCiAgICAgICAgIHsKLSAgICAgICAgICBGVF9UUkFDRTQoKCAidHRfbG9hZGVyX2luaXQ6IGdyYXlzY2FsZSBjaGFuZ2UsIgorICAgICAgICAgIEZUX1RSQUNFNCgoICJ0dF9sb2FkZXJfaW5pdDogZ3JheXNjYWxlIGhpbnRpbmcgY2hhbmdlLCIKICAgICAgICAgICAgICAgICAgICAgICAiIHJlLWV4ZWN1dGluZyBgcHJlcCcgdGFibGVcbiIgKSk7CiAKICAgICAgICAgICBleGVjLT5ncmF5c2NhbGUgPSBncmF5c2NhbGU7CkBAIC0yMjU3LDcgKzIzMjgsNyBAQAogICAgICAgICAgIHJldHVybiBlcnJvcjsKICAgICAgIH0KIAotICAgICAgLyogc2VlIHdoZXRoZXIgdGhlIGN2dCBwcm9ncmFtIGhhcyBkaXNhYmxlZCBoaW50aW5nICovCisgICAgICAvKiBjaGVjayB3aGV0aGVyIHRoZSBjdnQgcHJvZ3JhbSBoYXMgZGlzYWJsZWQgaGludGluZyAqLwogICAgICAgaWYgKCBleGVjLT5HUy5pbnN0cnVjdF9jb250cm9sICYgMSApCiAgICAgICAgIGxvYWRfZmxhZ3MgfD0gRlRfTE9BRF9OT19ISU5USU5HOwogCkBAIC0yMjY1LDYgKzIzMzYsMTMgQEAKICAgICAgIGlmICggZXhlYy0+R1MuaW5zdHJ1Y3RfY29udHJvbCAmIDIgKQogICAgICAgICBleGVjLT5HUyA9IHR0X2RlZmF1bHRfZ3JhcGhpY3Nfc3RhdGU7CiAKKyNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKKyAgICAgIC8qIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSBhIGZvbnQgaGludGVkIGZvciBDbGVhclR5cGUgLS0gICAgICAgICAgICovCisgICAgICAvKiBub3RlIHRoYXQgdGhpcyBmbGFnIGNhbiBhbHNvIGJlIG1vZGlmaWVkIGluIGEgZ2x5cGgncyBieXRlY29kZSAqLworICAgICAgaWYgKCBleGVjLT5HUy5pbnN0cnVjdF9jb250cm9sICYgNCApCisgICAgICAgIGV4ZWMtPmlnbm9yZV94X21vZGUgPSAwOworI2VuZGlmCisKICAgICAgIGV4ZWMtPnBlZGFudGljX2hpbnRpbmcgPSBGVF9CT09MKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9QRURBTlRJQyApOwogICAgICAgbG9hZGVyLT5leGVjID0gZXhlYzsKICAgICAgIGxvYWRlci0+aW5zdHJ1Y3Rpb25zID0gZXhlYy0+Z2x5cGhJbnM7CkBAIC0yMzA4LDEwICsyMzg2LDEwIEBACiAgICAgICBsb2FkZXItPmdsb2FkZXIgPSBnbG9hZGVyOwogICAgIH0KIAotICAgIGxvYWRlci0+bG9hZF9mbGFncyA9IGxvYWRfZmxhZ3M7CisgICAgbG9hZGVyLT5sb2FkX2ZsYWdzID0gKEZUX1VMb25nKWxvYWRfZmxhZ3M7CiAKLSAgICBsb2FkZXItPmZhY2UgICA9IChGVF9GYWNlKWZhY2U7Ci0gICAgbG9hZGVyLT5zaXplICAgPSAoRlRfU2l6ZSlzaXplOworICAgIGxvYWRlci0+ZmFjZSAgID0gZmFjZTsKKyAgICBsb2FkZXItPnNpemUgICA9IHNpemU7CiAgICAgbG9hZGVyLT5nbHlwaCAgPSAoRlRfR2x5cGhTbG90KWdseXBoOwogICAgIGxvYWRlci0+c3RyZWFtID0gc3RyZWFtOwogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRnbG9hZC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0Z2xvYWQuaAppbmRleCAzZjE2OTllLi44ZTMyNTVlIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRnbG9hZC5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dGdsb2FkLmgKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgVHJ1ZVR5cGUgR2x5cGggTG9hZGVyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwNiwgMjAwOCwgMjAxMSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dGd4dmFyLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRneHZhci5jCmluZGV4IDFiMzU1MzkuLmRkOWUyNTAgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dGd4dmFyLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0Z3h2YXIuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBUcnVlVHlwZSBHWCBGb250IFZhcmlhdGlvbiBsb2FkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDQtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIFdlcm5lciBMZW1iZXJnLCBhbmQgR2VvcmdlIFdpbGxpYW1zLiAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtMjAsNyArMjAsNyBAQAogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogQXBwbGUgZG9jdW1lbnRzIHRoZSBgZnZhcicsIGBndmFyJywgYGN2YXInLCBhbmQgYGF2YXInIHRhYmxlcyBhdCAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2ZvbnRzL1RUUmVmTWFuL1JNMDYvQ2hhcDZbZmdjYV12YXIuaHRtbCAgKi8KKyAgLyogICBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZm9udHMvVHJ1ZVR5cGUtUmVmZXJlbmNlLU1hbnVhbC9STTA2L0NoYXA2W2ZnY2FddmFyLmh0bWwgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qIFRoZSBkb2N1bWVudGF0aW9uIGZvciBgZnZhcicgaXMgaW5jb25zaXN0ZW50LiAgQXQgb25lIHBvaW50IGl0IHNheXMgICAqLwogICAvKiB0aGF0IGBjb3VudFNpemVQYWlycycgc2hvdWxkIGJlIDMsIGF0IGFub3RoZXIgcG9pbnQgMi4gIEl0IHNob3VsZCAgICAgKi8KQEAgLTYwLDkgKzYwLDkgQEAKICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCiAKIAotI2RlZmluZSBGVF9TdHJlYW1fRlRlbGwoIHN0cmVhbSApICBcCisjZGVmaW5lIEZUX1N0cmVhbV9GVGVsbCggc3RyZWFtICkgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIChGVF9VTG9uZykoIChzdHJlYW0pLT5jdXJzb3IgLSAoc3RyZWFtKS0+YmFzZSApCi0jZGVmaW5lIEZUX1N0cmVhbV9TZWVrU2V0KCBzdHJlYW0sIG9mZiApIFwKKyNkZWZpbmUgRlRfU3RyZWFtX1NlZWtTZXQoIHN0cmVhbSwgb2ZmICkgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgKCAoc3RyZWFtKS0+Y3Vyc29yID0gKHN0cmVhbSktPmJhc2UgKyAob2ZmKSApCiAKIApAQCAtOTYsOCArOTYsOCBAQAogI2RlZmluZSBBTExfUE9JTlRTICAoRlRfVVNob3J0Kil+KEZUX1B0ckRpc3QpMAogCiAKLSNkZWZpbmUgR1hfUFRfUE9JTlRTX0FSRV9XT1JEUyAgICAgIDB4ODAKLSNkZWZpbmUgR1hfUFRfUE9JTlRfUlVOX0NPVU5UX01BU0sgIDB4N0YKKyNkZWZpbmUgR1hfUFRfUE9JTlRTX0FSRV9XT1JEUyAgICAgIDB4ODBVCisjZGVmaW5lIEdYX1BUX1BPSU5UX1JVTl9DT1VOVF9NQVNLICAweDdGVQogCiAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMjYsNTIgKzEyNiw2NyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICpwb2ludF9jbnQgKQogICB7CiAgICAgRlRfVVNob3J0ICpwb2ludHMgPSBOVUxMOwotICAgIEZUX0ludCAgICAgbjsKLSAgICBGVF9JbnQgICAgIHJ1bmNudDsKLSAgICBGVF9JbnQgICAgIGk7Ci0gICAgRlRfSW50ICAgICBqOwotICAgIEZUX0ludCAgICAgZmlyc3Q7CisgICAgRlRfVUludCAgICBuOworICAgIEZUX1VJbnQgICAgcnVuY250OworICAgIEZUX1VJbnQgICAgaSwgajsKKyAgICBGVF9VU2hvcnQgIGZpcnN0OwogICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7CiAgICAgRlRfRXJyb3IgICBlcnJvciAgPSBGVF9FcnJfT2s7CiAKICAgICBGVF9VTlVTRUQoIGVycm9yICk7CiAKIAotICAgICpwb2ludF9jbnQgPSBuID0gRlRfR0VUX0JZVEUoKTsKKyAgICAqcG9pbnRfY250ID0gMDsKKworICAgIG4gPSBGVF9HRVRfQllURSgpOwogICAgIGlmICggbiA9PSAwICkKICAgICAgIHJldHVybiBBTExfUE9JTlRTOwogCiAgICAgaWYgKCBuICYgR1hfUFRfUE9JTlRTX0FSRV9XT1JEUyApCi0gICAgICBuID0gRlRfR0VUX0JZVEUoKSB8ICggKCBuICYgR1hfUFRfUE9JTlRfUlVOX0NPVU5UX01BU0sgKSA8PCA4ICk7CisgICAgeworICAgICAgbiAgJj0gR1hfUFRfUE9JTlRfUlVOX0NPVU5UX01BU0s7CisgICAgICBuIDw8PSA4OworICAgICAgbiAgfD0gRlRfR0VUX0JZVEUoKTsKKyAgICB9CiAKICAgICBpZiAoIEZUX05FV19BUlJBWSggcG9pbnRzLCBuICkgKQogICAgICAgcmV0dXJuIE5VTEw7CiAKKyAgICAqcG9pbnRfY250ID0gbjsKKwogICAgIGkgPSAwOwogICAgIHdoaWxlICggaSA8IG4gKQogICAgIHsKICAgICAgIHJ1bmNudCA9IEZUX0dFVF9CWVRFKCk7CiAgICAgICBpZiAoIHJ1bmNudCAmIEdYX1BUX1BPSU5UU19BUkVfV09SRFMgKQogICAgICAgewotICAgICAgICBydW5jbnQgPSBydW5jbnQgJiBHWF9QVF9QT0lOVF9SVU5fQ09VTlRfTUFTSzsKLSAgICAgICAgZmlyc3QgID0gcG9pbnRzW2krK10gPSBGVF9HRVRfVVNIT1JUKCk7CisgICAgICAgIHJ1bmNudCAgICAgJj0gR1hfUFRfUE9JTlRfUlVOX0NPVU5UX01BU0s7CisgICAgICAgIGZpcnN0ICAgICAgID0gRlRfR0VUX1VTSE9SVCgpOworICAgICAgICBwb2ludHNbaSsrXSA9IGZpcnN0OwogCi0gICAgICAgIGlmICggcnVuY250IDwgMSB8fCBpICsgcnVuY250ID49IG4gKQorICAgICAgICBpZiAoIHJ1bmNudCA8IDEgfHwgaSArIHJ1bmNudCA+IG4gKQogICAgICAgICAgIGdvdG8gRXhpdDsKIAotICAgICAgICAvKiBmaXJzdCBwb2ludCBub3QgaW5jbHVkZWQgaW4gcnVuY291bnQgKi8KLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBydW5jbnQ7ICsraiApCi0gICAgICAgICAgcG9pbnRzW2krK10gPSAoRlRfVVNob3J0KSggZmlyc3QgKz0gRlRfR0VUX1VTSE9SVCgpICk7CisgICAgICAgIC8qIGZpcnN0IHBvaW50IG5vdCBpbmNsdWRlZCBpbiBydW4gY291bnQgKi8KKyAgICAgICAgZm9yICggaiA9IDA7IGogPCBydW5jbnQ7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICBmaXJzdCAgICAgICs9IEZUX0dFVF9VU0hPUlQoKTsKKyAgICAgICAgICBwb2ludHNbaSsrXSA9IGZpcnN0OworICAgICAgICB9CiAgICAgICB9CiAgICAgICBlbHNlCiAgICAgICB7Ci0gICAgICAgIGZpcnN0ID0gcG9pbnRzW2krK10gPSBGVF9HRVRfQllURSgpOworICAgICAgICBmaXJzdCAgICAgICA9IEZUX0dFVF9CWVRFKCk7CisgICAgICAgIHBvaW50c1tpKytdID0gZmlyc3Q7CiAKLSAgICAgICAgaWYgKCBydW5jbnQgPCAxIHx8IGkgKyBydW5jbnQgPj0gbiApCisgICAgICAgIGlmICggcnVuY250IDwgMSB8fCBpICsgcnVuY250ID4gbiApCiAgICAgICAgICAgZ290byBFeGl0OwogCi0gICAgICAgIGZvciAoIGogPSAwOyBqIDwgcnVuY250OyArK2ogKQotICAgICAgICAgIHBvaW50c1tpKytdID0gKEZUX1VTaG9ydCkoIGZpcnN0ICs9IEZUX0dFVF9CWVRFKCkgKTsKKyAgICAgICAgZm9yICggaiA9IDA7IGogPCBydW5jbnQ7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICBmaXJzdCAgICAgICs9IEZUX0dFVF9CWVRFKCk7CisgICAgICAgICAgcG9pbnRzW2krK10gPSBmaXJzdDsKKyAgICAgICAgfQogICAgICAgfQogICAgIH0KIApAQCAtMTgwLDEyICsxOTUsOSBAQAogICB9CiAKIAotICBlbnVtCi0gIHsKLSAgICBHWF9EVF9ERUxUQVNfQVJFX1pFUk8gICAgICA9IDB4ODAsCi0gICAgR1hfRFRfREVMVEFTX0FSRV9XT1JEUyAgICAgPSAweDQwLAotICAgIEdYX0RUX0RFTFRBX1JVTl9DT1VOVF9NQVNLID0gMHgzRgotICB9OworI2RlZmluZSBHWF9EVF9ERUxUQVNfQVJFX1pFUk8gICAgICAgMHg4MFUKKyNkZWZpbmUgR1hfRFRfREVMVEFTX0FSRV9XT1JEUyAgICAgIDB4NDBVCisjZGVmaW5lIEdYX0RUX0RFTFRBX1JVTl9DT1VOVF9NQVNLICAweDNGVQogCiAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMDAsNyArMjEyLDcgQEAKICAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgIHN0cmVhbSAgICA6OiBUaGUgZGF0YSBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVsdGFfY250IDo6IFRoZSBudW1iZXIgb2YgdG8gYmUgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgIGRlbHRhX2NudCA6OiBUaGUgbnVtYmVyIG9mIGRlbHRhcyB0byBiZSByZWFkLiAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgIEFuIGFycmF5IG9mIEZUX1Nob3J0IGNvbnRhaW5pbmcgdGhlIGRlbHRhcyBmb3IgdGhlIGFmZmVjdGVkICAgICAgICAqLwpAQCAtMjEwLDEyICsyMjIsMTEgQEAKICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyBGVF9TaG9ydCoKICAgZnRfdmFyX3JlYWRwYWNrZWRkZWx0YXMoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT2Zmc2V0ICBkZWx0YV9jbnQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBkZWx0YV9jbnQgKQogICB7CiAgICAgRlRfU2hvcnQgICpkZWx0YXMgPSBOVUxMOwotICAgIEZUX1VJbnQgICAgcnVuY250OwotICAgIEZUX09mZnNldCAgaTsKLSAgICBGVF9VSW50ICAgIGo7CisgICAgRlRfVUludCAgICBydW5jbnQsIGNudDsKKyAgICBGVF9VSW50ICAgIGksIGo7CiAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKICAgICBGVF9FcnJvciAgIGVycm9yICA9IEZUX0Vycl9PazsKIApAQCAtMjI5LDM0ICsyNDAsMzAgQEAKICAgICB3aGlsZSAoIGkgPCBkZWx0YV9jbnQgKQogICAgIHsKICAgICAgIHJ1bmNudCA9IEZUX0dFVF9CWVRFKCk7CisgICAgICBjbnQgICAgPSBydW5jbnQgJiBHWF9EVF9ERUxUQV9SVU5fQ09VTlRfTUFTSzsKKwogICAgICAgaWYgKCBydW5jbnQgJiBHWF9EVF9ERUxUQVNfQVJFX1pFUk8gKQogICAgICAgewotICAgICAgICAvKiBydW5jbnQgemVyb2VzIGdldCBhZGRlZCAqLwotICAgICAgICBmb3IgKCBqID0gMDsKLSAgICAgICAgICAgICAgaiA8PSAoIHJ1bmNudCAmIEdYX0RUX0RFTFRBX1JVTl9DT1VOVF9NQVNLICkgJiYgaSA8IGRlbHRhX2NudDsKLSAgICAgICAgICAgICAgKytqICkKKyAgICAgICAgLyogYHJ1bmNudCcgemVyb2VzIGdldCBhZGRlZCAqLworICAgICAgICBmb3IgKCBqID0gMDsgaiA8PSBjbnQgJiYgaSA8IGRlbHRhX2NudDsgaisrICkKICAgICAgICAgICBkZWx0YXNbaSsrXSA9IDA7CiAgICAgICB9CiAgICAgICBlbHNlIGlmICggcnVuY250ICYgR1hfRFRfREVMVEFTX0FSRV9XT1JEUyApCiAgICAgICB7Ci0gICAgICAgIC8qIHJ1bmNudCBzaG9ydHMgZnJvbSB0aGUgc3RhY2sgKi8KLSAgICAgICAgZm9yICggaiA9IDA7Ci0gICAgICAgICAgICAgIGogPD0gKCBydW5jbnQgJiBHWF9EVF9ERUxUQV9SVU5fQ09VTlRfTUFTSyApICYmIGkgPCBkZWx0YV9jbnQ7Ci0gICAgICAgICAgICAgICsraiApCisgICAgICAgIC8qIGBydW5jbnQnIHNob3J0cyBmcm9tIHRoZSBzdGFjayAqLworICAgICAgICBmb3IgKCBqID0gMDsgaiA8PSBjbnQgJiYgaSA8IGRlbHRhX2NudDsgaisrICkKICAgICAgICAgICBkZWx0YXNbaSsrXSA9IEZUX0dFVF9TSE9SVCgpOwogICAgICAgfQogICAgICAgZWxzZQogICAgICAgewotICAgICAgICAvKiBydW5jbnQgc2lnbmVkIGJ5dGVzIGZyb20gdGhlIHN0YWNrICovCi0gICAgICAgIGZvciAoIGogPSAwOwotICAgICAgICAgICAgICBqIDw9ICggcnVuY250ICYgR1hfRFRfREVMVEFfUlVOX0NPVU5UX01BU0sgKSAmJiBpIDwgZGVsdGFfY250OwotICAgICAgICAgICAgICArK2ogKQorICAgICAgICAvKiBgcnVuY250JyBzaWduZWQgYnl0ZXMgZnJvbSB0aGUgc3RhY2sgKi8KKyAgICAgICAgZm9yICggaiA9IDA7IGogPD0gY250ICYmIGkgPCBkZWx0YV9jbnQ7IGorKyApCiAgICAgICAgICAgZGVsdGFzW2krK10gPSBGVF9HRVRfQ0hBUigpOwogICAgICAgfQogCi0gICAgICBpZiAoIGogPD0gKCBydW5jbnQgJiBHWF9EVF9ERUxUQV9SVU5fQ09VTlRfTUFTSyApICkKKyAgICAgIGlmICggaiA8PSBjbnQgKQogICAgICAgewotICAgICAgICAvKiBCYWQgZm9ybWF0ICovCisgICAgICAgIC8qIGJhZCBmb3JtYXQgKi8KICAgICAgICAgRlRfRlJFRSggZGVsdGFzICk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgfQpAQCAtMjgxLDEyICsyODgsMTIgQEAKICAgc3RhdGljIHZvaWQKICAgZnRfdmFyX2xvYWRfYXZhciggVFRfRmFjZSAgZmFjZSApCiAgIHsKLSAgICBGVF9TdHJlYW0gICAgICAgc3RyZWFtID0gRlRfRkFDRV9TVFJFQU0oZmFjZSk7CisgICAgRlRfU3RyZWFtICAgICAgIHN0cmVhbSA9IEZUX0ZBQ0VfU1RSRUFNKCBmYWNlICk7CiAgICAgRlRfTWVtb3J5ICAgICAgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwogICAgIEdYX0JsZW5kICAgICAgICBibGVuZCAgPSBmYWNlLT5ibGVuZDsKICAgICBHWF9BVmFyU2VnbWVudCAgc2VnbWVudDsKICAgICBGVF9FcnJvciAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfVUxvbmcgICAgICAgIHZlcnNpb247CisgICAgRlRfTG9uZyAgICAgICAgIHZlcnNpb247CiAgICAgRlRfTG9uZyAgICAgICAgIGF4aXNDb3VudDsKICAgICBGVF9JbnQgICAgICAgICAgaSwgajsKICAgICBGVF9VTG9uZyAgICAgICAgdGFibGVfbGVuOwpAQCAtMjk0LDkgKzMwMSwxNSBAQAogICAgIEZUX1VOVVNFRCggZXJyb3IgKTsKIAogCisgICAgRlRfVFJBQ0UyKCggIkFWQVIgIiApKTsKKwogICAgIGJsZW5kLT5hdmFyX2NoZWNrZWQgPSBUUlVFOwotICAgIGlmICggKGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19hdmFyLCBzdHJlYW0sICZ0YWJsZV9sZW4gKSkgIT0gMCApCisgICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX2F2YXIsIHN0cmVhbSwgJnRhYmxlX2xlbiApOworICAgIGlmICggZXJyb3IgKQorICAgIHsKKyAgICAgIEZUX1RSQUNFMigoICJpcyBtaXNzaW5nXG4iICkpOwogICAgICAgcmV0dXJuOworICAgIH0KIAogICAgIGlmICggRlRfRlJBTUVfRU5URVIoIHRhYmxlX2xlbiApICkKICAgICAgIHJldHVybjsKQEAgLTMwNCwyMyArMzE3LDM2IEBACiAgICAgdmVyc2lvbiAgID0gRlRfR0VUX0xPTkcoKTsKICAgICBheGlzQ291bnQgPSBGVF9HRVRfTE9ORygpOwogCi0gICAgaWYgKCB2ZXJzaW9uICE9IDB4MDAwMTAwMDBMICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgYXhpc0NvdW50ICE9IChGVF9Mb25nKWJsZW5kLT5tbXZhci0+bnVtX2F4aXMgKQorICAgIGlmICggdmVyc2lvbiAhPSAweDAwMDEwMDAwTCApCisgICAgeworICAgICAgRlRfVFJBQ0UyKCggImJhZCB0YWJsZSB2ZXJzaW9uXG4iICkpOwogICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIEZUX1RSQUNFMigoICJsb2FkZWRcbiIgKSk7CisKKyAgICBpZiAoIGF4aXNDb3VudCAhPSAoRlRfTG9uZylibGVuZC0+bW12YXItPm51bV9heGlzICkKKyAgICB7CisgICAgICBGVF9UUkFDRTIoKCAiZnRfdmFyX2xvYWRfYXZhcjogbnVtYmVyIG9mIGF4ZXMgaW4gYGF2YXInIGFuZCBgY3ZhcidcbiIKKyAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICB0YWJsZSBhcmUgZGlmZmVyZW50XG4iICkpOworICAgICAgZ290byBFeGl0OworICAgIH0KIAogICAgIGlmICggRlRfTkVXX0FSUkFZKCBibGVuZC0+YXZhcl9zZWdtZW50LCBheGlzQ291bnQgKSApCiAgICAgICBnb3RvIEV4aXQ7CiAKICAgICBzZWdtZW50ID0gJmJsZW5kLT5hdmFyX3NlZ21lbnRbMF07Ci0gICAgZm9yICggaSA9IDA7IGkgPCBheGlzQ291bnQ7ICsraSwgKytzZWdtZW50ICkKKyAgICBmb3IgKCBpID0gMDsgaSA8IGF4aXNDb3VudDsgaSsrLCBzZWdtZW50KysgKQogICAgIHsKKyAgICAgIEZUX1RSQUNFNSgoICIgIGF4aXMgJWQ6XG4iLCBpICkpOworCiAgICAgICBzZWdtZW50LT5wYWlyQ291bnQgPSBGVF9HRVRfVVNIT1JUKCk7CiAgICAgICBpZiAoIEZUX05FV19BUlJBWSggc2VnbWVudC0+Y29ycmVzcG9uZGVuY2UsIHNlZ21lbnQtPnBhaXJDb3VudCApICkKICAgICAgIHsKICAgICAgICAgLyogRmFpbHVyZS4gIEZyZWUgZXZlcnl0aGluZyB3ZSBoYXZlIGRvbmUgc28gZmFyLiAgV2UgbXVzdCBkbyAqLwogICAgICAgICAvKiBpdCByaWdodCBub3cgc2luY2UgbG9hZGluZyB0aGUgYGF2YXInIHRhYmxlIGlzIG9wdGlvbmFsLiAgICovCiAKLSAgICAgICAgZm9yICggaiA9IGkgLSAxOyBqID49IDA7IC0taiApCisgICAgICAgIGZvciAoIGogPSBpIC0gMTsgaiA+PSAwOyBqLS0gKQogICAgICAgICAgIEZUX0ZSRUUoIGJsZW5kLT5hdmFyX3NlZ21lbnRbal0uY29ycmVzcG9uZGVuY2UgKTsKIAogICAgICAgICBGVF9GUkVFKCBibGVuZC0+YXZhcl9zZWdtZW50ICk7CkBAIC0zMjgsMTMgKzM1NCwxOCBAQAogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICB9CiAKLSAgICAgIGZvciAoIGogPSAwOyBqIDwgc2VnbWVudC0+cGFpckNvdW50OyArK2ogKQorICAgICAgZm9yICggaiA9IDA7IGogPCBzZWdtZW50LT5wYWlyQ291bnQ7IGorKyApCiAgICAgICB7Ci0gICAgICAgIHNlZ21lbnQtPmNvcnJlc3BvbmRlbmNlW2pdLmZyb21Db29yZCA9Ci0gICAgICAgICAgRlRfR0VUX1NIT1JUKCkgPDwgMjsgICAgLyogY29udmVydCB0byBGaXhlZCAqLwotICAgICAgICBzZWdtZW50LT5jb3JyZXNwb25kZW5jZVtqXS50b0Nvb3JkID0KLSAgICAgICAgICBGVF9HRVRfU0hPUlQoKTw8MjsgICAgLyogY29udmVydCB0byBGaXhlZCAqLworICAgICAgICAvKiBjb252ZXJ0IHRvIEZpeGVkICovCisgICAgICAgIHNlZ21lbnQtPmNvcnJlc3BvbmRlbmNlW2pdLmZyb21Db29yZCA9IEZUX0dFVF9TSE9SVCgpICogNDsKKyAgICAgICAgc2VnbWVudC0+Y29ycmVzcG9uZGVuY2Vbal0udG9Db29yZCAgID0gRlRfR0VUX1NIT1JUKCkgKiA0OworCisgICAgICAgIEZUX1RSQUNFNSgoICIgICAgbWFwcGluZyAlLjRmIHRvICUuNGZcbiIsCisgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQtPmNvcnJlc3BvbmRlbmNlW2pdLmZyb21Db29yZCAvIDY1NTM2LjAsCisgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQtPmNvcnJlc3BvbmRlbmNlW2pdLnRvQ29vcmQgLyA2NTUzNi4wICkpOwogICAgICAgfQorCisgICAgICBGVF9UUkFDRTUoKCAiXG4iICkpOwogICAgIH0KIAogICBFeGl0OgpAQCAtMzYxLDggKzM5Miw4IEBACiAgIC8qICAgIGZ0X3Zhcl9sb2FkX2d2YXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBhcnNlcyB0aGUgYGd2YXInIHRhYmxlIGlmIHByZXNlbnQuICBJZiBgZnZhcicgaXMgdGhlcmUsIGBndmFyJyAgICAqLwotICAvKiAgICBoYWQgYmV0dGVyIGJlIHRoZXJlIHRvby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgUGFyc2UgdGhlIGBndmFyJyB0YWJsZSBpZiBwcmVzZW50LiAgSWYgYGZ2YXInIGlzIHRoZXJlLCBgZ3ZhcicgaGFkICovCisgIC8qICAgIGJldHRlciBiZSB0aGVyZSB0b28uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgIGZhY2UgOjogVGhlIGZvbnQgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzczLDcgKzQwNCw3IEBACiAgIHN0YXRpYyBGVF9FcnJvcgogICBmdF92YXJfbG9hZF9ndmFyKCBUVF9GYWNlICBmYWNlICkKICAgewotICAgIEZUX1N0cmVhbSAgICAgc3RyZWFtID0gRlRfRkFDRV9TVFJFQU0oZmFjZSk7CisgICAgRlRfU3RyZWFtICAgICBzdHJlYW0gPSBGVF9GQUNFX1NUUkVBTSggZmFjZSApOwogICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7CiAgICAgR1hfQmxlbmQgICAgICBibGVuZCAgPSBmYWNlLT5ibGVuZDsKICAgICBGVF9FcnJvciAgICAgIGVycm9yOwpAQCAtNDAwLDggKzQzMSwxNyBAQAogICAgICAgRlRfRlJBTUVfRU5ECiAgICAgfTsKIAotICAgIGlmICggKGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19ndmFyLCBzdHJlYW0sICZ0YWJsZV9sZW4gKSkgIT0gMCApCisKKyAgICBGVF9UUkFDRTIoKCAiR1ZBUiAiICkpOworCisgICAgaWYgKCAoIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVEFHX2d2YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YWJsZV9sZW4gKSApICE9IDAgKQorICAgIHsKKyAgICAgIEZUX1RSQUNFMigoICJpcyBtaXNzaW5nXG4iICkpOwogICAgICAgZ290byBFeGl0OworICAgIH0KIAogICAgIGd2YXJfc3RhcnQgPSBGVF9TVFJFQU1fUE9TKCApOwogICAgIGlmICggRlRfU1RSRUFNX1JFQURfRklFTERTKCBndmFyX2ZpZWxkcywgJmd2YXJfaGVhZCApICkKQEAgLTQxMSwxMyArNDUxLDI2IEBACiAgICAgYmxlbmQtPmd2X2dseXBoY250ID0gZ3Zhcl9oZWFkLmdseXBoQ291bnQ7CiAgICAgb2Zmc2V0VG9EYXRhICAgICAgID0gZ3Zhcl9zdGFydCArIGd2YXJfaGVhZC5vZmZzZXRUb0RhdGE7CiAKLSAgICBpZiAoIGd2YXJfaGVhZC52ZXJzaW9uICAgIT0gKEZUX0xvbmcpMHgwMDAxMDAwMEwgICAgICAgICAgICAgIHx8Ci0gICAgICAgICBndmFyX2hlYWQuYXhpc0NvdW50ICE9IChGVF9VU2hvcnQpYmxlbmQtPm1tdmFyLT5udW1fYXhpcyApCisgICAgaWYgKCBndmFyX2hlYWQudmVyc2lvbiAhPSAweDAwMDEwMDAwTCApCiAgICAgeworICAgICAgRlRfVFJBQ0UxKCggImJhZCB0YWJsZSB2ZXJzaW9uXG4iICkpOwogICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwogICAgICAgZ290byBFeGl0OwogICAgIH0KIAorICAgIEZUX1RSQUNFMigoICJsb2FkZWRcbiIgKSk7CisKKyAgICBpZiAoIGd2YXJfaGVhZC5heGlzQ291bnQgIT0gKEZUX1VTaG9ydClibGVuZC0+bW12YXItPm51bV9heGlzICkKKyAgICB7CisgICAgICBGVF9UUkFDRTEoKCAiZnRfdmFyX2xvYWRfZ3ZhcjogbnVtYmVyIG9mIGF4ZXMgaW4gYGd2YXInIGFuZCBgY3ZhcidcbiIKKyAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICB0YWJsZSBhcmUgZGlmZmVyZW50XG4iICkpOworICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOworICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIEZUX1RSQUNFNSgoICJndmFyOiB0aGVyZSBhcmUgJWQgc2hhcmVkIGNvb3JkaW5hdGVzOlxuIiwKKyAgICAgICAgICAgICAgICBibGVuZC0+dHVwbGVjb3VudCApKTsKKwogICAgIGlmICggRlRfTkVXX0FSUkFZKCBibGVuZC0+Z2x5cGhvZmZzZXRzLCBibGVuZC0+Z3ZfZ2x5cGhjbnQgKyAxICkgKQogICAgICAgZ290byBFeGl0OwogCkBAIC00MjcsOCArNDgwLDggQEAKICAgICAgIGlmICggRlRfRlJBTUVfRU5URVIoICggYmxlbmQtPmd2X2dseXBoY250ICsgMSApICogNEwgKSApCiAgICAgICAgIGdvdG8gRXhpdDsKIAotICAgICAgZm9yICggaSA9IDA7IGkgPD0gYmxlbmQtPmd2X2dseXBoY250OyArK2kgKQotICAgICAgICBibGVuZC0+Z2x5cGhvZmZzZXRzW2ldID0gb2Zmc2V0VG9EYXRhICsgRlRfR0VUX0xPTkcoKTsKKyAgICAgIGZvciAoIGkgPSAwOyBpIDw9IGJsZW5kLT5ndl9nbHlwaGNudDsgaSsrICkKKyAgICAgICAgYmxlbmQtPmdseXBob2Zmc2V0c1tpXSA9IG9mZnNldFRvRGF0YSArIEZUX0dFVF9VTE9ORygpOwogCiAgICAgICBGVF9GUkFNRV9FWElUKCk7CiAgICAgfQpAQCAtNDM4LDkgKzQ5MSw5IEBACiAgICAgICBpZiAoIEZUX0ZSQU1FX0VOVEVSKCAoIGJsZW5kLT5ndl9nbHlwaGNudCArIDEgKSAqIDJMICkgKQogICAgICAgICBnb3RvIEV4aXQ7CiAKLSAgICAgIGZvciAoIGkgPSAwOyBpIDw9IGJsZW5kLT5ndl9nbHlwaGNudDsgKytpICkKKyAgICAgIGZvciAoIGkgPSAwOyBpIDw9IGJsZW5kLT5ndl9nbHlwaGNudDsgaSsrICkKICAgICAgICAgYmxlbmQtPmdseXBob2Zmc2V0c1tpXSA9IG9mZnNldFRvRGF0YSArIEZUX0dFVF9VU0hPUlQoKSAqIDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWFhYOiBVbmRvY3VtZW50ZWQ6IGAqMichICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFhYWDogVW5kb2N1bWVudGVkOiBgKjInISAqLwogCiAgICAgICBGVF9GUkFNRV9FWElUKCk7CiAgICAgfQpAQCAtNDUxLDE0ICs1MDQsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBndmFyX2hlYWQuYXhpc0NvdW50ICogYmxlbmQtPnR1cGxlY291bnQgKSApCiAgICAgICAgIGdvdG8gRXhpdDsKIAotICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggZ3Zhcl9zdGFydCArIGd2YXJfaGVhZC5vZmZzZXRUb0Nvb3JkICkgICAgICAgfHwKLSAgICAgICAgICAgRlRfRlJBTUVfRU5URVIoIGJsZW5kLT50dXBsZWNvdW50ICogZ3Zhcl9oZWFkLmF4aXNDb3VudCAqIDJMICkgICAgICAgICAgICAgICAgICAgKQorICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggZ3Zhcl9zdGFydCArIGd2YXJfaGVhZC5vZmZzZXRUb0Nvb3JkICkgICAgICAgICB8fAorICAgICAgICAgICBGVF9GUkFNRV9FTlRFUiggYmxlbmQtPnR1cGxlY291bnQgKiBndmFyX2hlYWQuYXhpc0NvdW50ICogMkwgKSApCiAgICAgICAgIGdvdG8gRXhpdDsKIAotICAgICAgZm9yICggaSA9IDA7IGkgPCBibGVuZC0+dHVwbGVjb3VudDsgKytpICkKLSAgICAgICAgZm9yICggaiA9IDAgOyBqIDwgKEZUX1VJbnQpZ3Zhcl9oZWFkLmF4aXNDb3VudDsgKytqICkKKyAgICAgIGZvciAoIGkgPSAwOyBpIDwgYmxlbmQtPnR1cGxlY291bnQ7IGkrKyApCisgICAgICB7CisgICAgICAgIEZUX1RSQUNFNSgoICIgIFsgIiApKTsKKyAgICAgICAgZm9yICggaiA9IDAgOyBqIDwgKEZUX1VJbnQpZ3Zhcl9oZWFkLmF4aXNDb3VudDsgaisrICkKKyAgICAgICAgewogICAgICAgICAgIGJsZW5kLT50dXBsZWNvb3Jkc1tpICogZ3Zhcl9oZWFkLmF4aXNDb3VudCArIGpdID0KLSAgICAgICAgICAgIEZUX0dFVF9TSE9SVCgpIDw8IDI7ICAgICAgICAgICAgICAgIC8qIGNvbnZlcnQgdG8gRlRfRml4ZWQgKi8KKyAgICAgICAgICAgIEZUX0dFVF9TSE9SVCgpICogNDsgICAgICAgICAgICAgICAgIC8qIGNvbnZlcnQgdG8gRlRfRml4ZWQgKi8KKyAgICAgICAgICBGVF9UUkFDRTUoKCAiJS40ZiAiLAorICAgICAgICAgICAgYmxlbmQtPnR1cGxlY29vcmRzW2kgKiBndmFyX2hlYWQuYXhpc0NvdW50ICsgal0gLyA2NTUzNi4wICkpOworICAgICAgICB9CisgICAgICAgIEZUX1RSQUNFNSgoICJdXG4iICkpOworICAgICAgfQorCisgICAgICBGVF9UUkFDRTUoKCAiXG4iICkpOwogCiAgICAgICBGVF9GUkFNRV9FWElUKCk7CiAgICAgfQpAQCAtNTA2LDQ4ICs1NjksODMgQEAKICAgICBGVF9GaXhlZCAgYXBwbHkgPSAweDEwMDAwTDsKIAogCi0gICAgZm9yICggaSA9IDA7IGkgPCBibGVuZC0+bnVtX2F4aXM7ICsraSApCisgICAgZm9yICggaSA9IDA7IGkgPCBibGVuZC0+bnVtX2F4aXM7IGkrKyApCiAgICAgewotICAgICAgaWYgKCB0dXBsZV9jb29yZHNbaV0gPT0gMCApCi0gICAgICAgIC8qIEl0J3Mgbm90IGNsZWFyIHdoeSAoZm9yIGludGVybWVkaWF0ZSB0dXBsZXMpIHdlIGRvbid0IG5lZWQgICAgICovCi0gICAgICAgIC8qIHRvIGNoZWNrIGFnYWluc3Qgc3RhcnQvZW5kIC0tIHRoZSBkb2N1bWVudGF0aW9uIHNheXMgd2UgZG9uJ3QuICovCi0gICAgICAgIC8qIFNpbWlsYXJseSwgaXQncyB1bmNsZWFyIHdoeSB3ZSBkb24ndCBuZWVkIHRvIHNjYWxlIGFsb25nIHRoZSAgICovCi0gICAgICAgIC8qIGF4aXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGNvbnRpbnVlOworICAgICAgRlRfVFJBQ0U2KCggIiAgICBheGlzIGNvb3JkaW5hdGUgJWQgKCUuNGYpOlxuIiwKKyAgICAgICAgICAgICAgICAgIGksIGJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2ldIC8gNjU1MzYuMCApKTsKIAotICAgICAgZWxzZSBpZiAoIGJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2ldID09IDAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICggYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV0gPCAwICYmIHR1cGxlX2Nvb3Jkc1tpXSA+IDAgKSB8fAorICAgICAgLyogSXQncyBub3QgY2xlYXIgd2h5IChmb3IgaW50ZXJtZWRpYXRlIHR1cGxlcykgd2UgZG9uJ3QgbmVlZCAgICAgKi8KKyAgICAgIC8qIHRvIGNoZWNrIGFnYWluc3Qgc3RhcnQvZW5kIC0tIHRoZSBkb2N1bWVudGF0aW9uIHNheXMgd2UgZG9uJ3QuICovCisgICAgICAvKiBTaW1pbGFybHksIGl0J3MgdW5jbGVhciB3aHkgd2UgZG9uJ3QgbmVlZCB0byBzY2FsZSBhbG9uZyB0aGUgICAqLworICAgICAgLyogYXhpcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgaWYgKCB0dXBsZV9jb29yZHNbaV0gPT0gMCApCisgICAgICB7CisgICAgICAgIEZUX1RSQUNFNigoICIgICAgICB0dXBsZSBjb29yZGluYXRlIGlzIHplcm8sIGlnbm9yZWRcbiIsIGkgKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBlbHNlIGlmICggYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV0gPT0gMCApCisgICAgICB7CisgICAgICAgIEZUX1RSQUNFNigoICIgICAgICBheGlzIGNvb3JkaW5hdGUgaXMgemVybywgc3RvcFxuIiApKTsKKyAgICAgICAgYXBwbHkgPSAwOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZWxzZSBpZiAoICggYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV0gPCAwICYmIHR1cGxlX2Nvb3Jkc1tpXSA+IDAgKSB8fAogICAgICAgICAgICAgICAgICggYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV0gPiAwICYmIHR1cGxlX2Nvb3Jkc1tpXSA8IDAgKSApCiAgICAgICB7CisgICAgICAgIEZUX1RSQUNFNigoICIgICAgICB0dXBsZSBjb29yZGluYXRlIHZhbHVlICUuNGYgaXMgZXhjZWVkZWQsIHN0b3BcbiIsCisgICAgICAgICAgICAgICAgICAgIHR1cGxlX2Nvb3Jkc1tpXSAvIDY1NTM2LjAgKSk7CiAgICAgICAgIGFwcGx5ID0gMDsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAKICAgICAgIGVsc2UgaWYgKCAhKCB0dXBsZUluZGV4ICYgR1hfVElfSU5URVJNRURJQVRFX1RVUExFICkgKQorICAgICAgeworICAgICAgICBGVF9UUkFDRTYoKCAiICAgICAgdHVwbGUgY29vcmRpbmF0ZSB2YWx1ZSAlLjRmIGZpdHNcbiIsCisgICAgICAgICAgICAgICAgICAgIHR1cGxlX2Nvb3Jkc1tpXSAvIDY1NTM2LjAgKSk7CiAgICAgICAgIC8qIG5vdCBhbiBpbnRlcm1lZGlhdGUgdHVwbGUgKi8KICAgICAgICAgYXBwbHkgPSBGVF9NdWxGaXgoIGFwcGx5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV0gPiAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAtYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV0gKTsKKyAgICAgIH0KIAotICAgICAgZWxzZSBpZiAoIGJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2ldIDw9IGltX3N0YXJ0X2Nvb3Jkc1tpXSB8fAotICAgICAgICAgICAgICAgIGJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2ldID49IGltX2VuZF9jb29yZHNbaV0gICApCisgICAgICBlbHNlIGlmICggYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV0gPCBpbV9zdGFydF9jb29yZHNbaV0gfHwKKyAgICAgICAgICAgICAgICBibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tpXSA+IGltX2VuZF9jb29yZHNbaV0gICApCiAgICAgICB7CisgICAgICAgIEZUX1RSQUNFNigoICIgICAgICBpbnRlcm1lZGlhdGUgdHVwbGUgcmFuZ2UgWyUuNGY7JS40Zl0gaXMgZXhjZWVkZWQsIgorICAgICAgICAgICAgICAgICAgICAiIHN0b3BcbiIsCisgICAgICAgICAgICAgICAgICAgIGltX3N0YXJ0X2Nvb3Jkc1tpXSAvIDY1NTM2LjAsCisgICAgICAgICAgICAgICAgICAgIGltX2VuZF9jb29yZHNbaV0gLyA2NTUzNi4wICkpOwogICAgICAgICBhcHBseSA9IDA7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogCiAgICAgICBlbHNlIGlmICggYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV0gPCB0dXBsZV9jb29yZHNbaV0gKQorICAgICAgeworICAgICAgICBGVF9UUkFDRTYoKCAiICAgICAgaW50ZXJtZWRpYXRlIHR1cGxlIHJhbmdlIFslLjRmOyUuNGZdIGZpdHNcbiIsCisgICAgICAgICAgICAgICAgICAgIGltX3N0YXJ0X2Nvb3Jkc1tpXSAvIDY1NTM2LjAsCisgICAgICAgICAgICAgICAgICAgIGltX2VuZF9jb29yZHNbaV0gLyA2NTUzNi4wICkpOwogICAgICAgICBhcHBseSA9IEZUX011bERpdiggYXBwbHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tpXSAtIGltX3N0YXJ0X2Nvb3Jkc1tpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cGxlX2Nvb3Jkc1tpXSAtIGltX3N0YXJ0X2Nvb3Jkc1tpXSApOworICAgICAgfQogCiAgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIEZUX1RSQUNFNigoICIgICAgICBpbnRlcm1lZGlhdGUgdHVwbGUgcmFuZ2UgWyUuNGY7JS40Zl0gZml0c1xuIiwKKyAgICAgICAgICAgICAgICAgICAgaW1fc3RhcnRfY29vcmRzW2ldIC8gNjU1MzYuMCwKKyAgICAgICAgICAgICAgICAgICAgaW1fZW5kX2Nvb3Jkc1tpXSAvIDY1NTM2LjAgKSk7CiAgICAgICAgIGFwcGx5ID0gRlRfTXVsRGl2KCBhcHBseSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltX2VuZF9jb29yZHNbaV0gLSBibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltX2VuZF9jb29yZHNbaV0gLSB0dXBsZV9jb29yZHNbaV0gKTsKKyAgICAgIH0KICAgICB9CiAKKyAgICBGVF9UUkFDRTYoKCAiICAgIGFwcGx5IGZhY3RvciBpcyAlLjRmXG4iLCBhcHBseSAvIDY1NTM2LjAgKSk7CisKICAgICByZXR1cm4gYXBwbHk7CiAgIH0KIApAQCAtNTc3LDkgKzY3NSw5IEBACiAgIHR5cGVkZWYgc3RydWN0ICBmdmFyX2F4aXNfCiAgIHsKICAgICBGVF9VTG9uZyAgIGF4aXNUYWc7Ci0gICAgRlRfVUxvbmcgICBtaW5WYWx1ZTsKLSAgICBGVF9VTG9uZyAgIGRlZmF1bHRWYWx1ZTsKLSAgICBGVF9VTG9uZyAgIG1heFZhbHVlOworICAgIEZUX0ZpeGVkICAgbWluVmFsdWU7CisgICAgRlRfRml4ZWQgICBkZWZhdWx0VmFsdWU7CisgICAgRlRfRml4ZWQgICBtYXhWYWx1ZTsKICAgICBGVF9VU2hvcnQgIGZsYWdzOwogICAgIEZUX1VTaG9ydCAgbmFtZUlEOwogCkBAIC02MDAsNyArNjk4LDggQEAKICAgLyogICAgICAgICAgICAgIFRUX0dldF9NTV9WYXIgaW5pdGlhbGl6ZXMgdGhlIGJsZW5kIHN0cnVjdHVyZS4gICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWFzdGVyIDo6IFRoZSBgZnZhcicgZGF0YSAobXVzdCBiZSBmcmVlZCBieSBjYWxsZXIpLiAgICAgICAgICAgICAgICovCisgIC8qICAgIG1hc3RlciA6OiBUaGUgYGZ2YXInIGRhdGEgKG11c3QgYmUgZnJlZWQgYnkgY2FsbGVyKS4gIENhbiBiZSBOVUxMLCAqLworICAvKiAgICAgICAgICAgICAgd2hpY2ggbWFrZXMgdGhpcyBmdW5jdGlvbiBzaW1wbHkgbG9hZCBNTSBzdXBwb3J0LiAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTY0NywyNSArNzQ2LDM3IEBACiAKICAgICAgIEZUX0ZSQU1FX1NUQVJUKCAyMCApLAogICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIGF4aXNUYWcgKSwKLSAgICAgICAgRlRfRlJBTUVfVUxPTkcgKCBtaW5WYWx1ZSApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIGRlZmF1bHRWYWx1ZSApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIG1heFZhbHVlICksCisgICAgICAgIEZUX0ZSQU1FX0xPTkcgICggbWluVmFsdWUgKSwKKyAgICAgICAgRlRfRlJBTUVfTE9ORyAgKCBkZWZhdWx0VmFsdWUgKSwKKyAgICAgICAgRlRfRlJBTUVfTE9ORyAgKCBtYXhWYWx1ZSApLAogICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIGZsYWdzICksCiAgICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggbmFtZUlEICksCiAgICAgICBGVF9GUkFNRV9FTkQKICAgICB9OwogCiAKKyAgICAvKiByZWFkIHRoZSBmb250IGRhdGEgYW5kIHNldCB1cCB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gKi8KKyAgICAvKiBpZiBub3QgYWxyZWFkeSBkb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwogICAgIGlmICggZmFjZS0+YmxlbmQgPT0gTlVMTCApCiAgICAgewotICAgICAgLyogYm90aCBgZnZhcicgYW5kIGBndmFyJyBtdXN0IGJlIHByZXNlbnQgKi8KLSAgICAgIGlmICggKGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19ndmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sICZ0YWJsZV9sZW4gKSkgIT0gMCApCi0gICAgICAgIGdvdG8gRXhpdDsKKyAgICAgIEZUX1RSQUNFMigoICJGVkFSICIgKSk7CiAKLSAgICAgIGlmICggKGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19mdmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sICZ0YWJsZV9sZW4gKSkgIT0gMCApCisgICAgICAvKiBib3RoIGBmdmFyJyBhbmQgYGd2YXInIG11c3QgYmUgcHJlc2VudCAqLworICAgICAgaWYgKCAoIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19ndmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCAmdGFibGVfbGVuICkgKSAhPSAwICkKKyAgICAgIHsKKyAgICAgICAgRlRfVFJBQ0UxKCggIlxuIgorICAgICAgICAgICAgICAgICAgICAiVFRfR2V0X01NX1ZhcjogYGd2YXInIHRhYmxlIGlzIG1pc3NpbmdcbiIgKSk7CiAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgIH0KKworICAgICAgaWYgKCAoIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19mdmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCAmdGFibGVfbGVuICkgKSAhPSAwICkKKyAgICAgIHsKKyAgICAgICAgRlRfVFJBQ0UxKCggImlzIG1pc3NpbmdcbiIgKSk7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgIH0KIAogICAgICAgZnZhcl9zdGFydCA9IEZUX1NUUkVBTV9QT1MoICk7CiAKQEAgLTY3Myw3ICs3ODQsMTIgQEAKICAgICAgICAgZ290byBFeGl0OwogCiAgICAgICBpZiAoIGZ2YXJfaGVhZC52ZXJzaW9uICE9IChGVF9Mb25nKTB4MDAwMTAwMDBMICAgICAgICAgICAgICAgICAgICAgIHx8CisjaWYgMAorICAgICAgICAgICAvKiBmb250cyBsaWtlIGBKYW1SZWd1bGFyLnR0ZicgaGF2ZSBhbiBpbmNvcnJlY3QgdmFsdWUgZm9yICovCisgICAgICAgICAgIC8qIGBjb3VudFNpemVQYWlycyc7IHNpbmNlIHZhbHVlIDIgaXMgaGFyZC1jb2RlZCBpbiBgZnZhcicgKi8KKyAgICAgICAgICAgLyogdmVyc2lvbiAxLjAsIHdlIHNpbXBseSBpZ25vcmUgaXQgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICBmdmFyX2hlYWQuY291bnRTaXplUGFpcnMgIT0gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorI2VuZGlmCiAgICAgICAgICAgIGZ2YXJfaGVhZC5heGlzU2l6ZSAhPSAyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CiAgICAgICAgICAgIC8qIGF4aXNDb3VudCBsaW1pdCBpbXBsaWVkIGJ5IDE2LWJpdCBpbnN0YW5jZVNpemUgKi8KICAgICAgICAgICAgZnZhcl9oZWFkLmF4aXNDb3VudCA+IDB4M0ZGRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKQEAgLTY4MywxMCArNzk5LDE2IEBACiAgICAgICAgICAgIGZ2YXJfaGVhZC5vZmZzZXRUb0RhdGEgKyBmdmFyX2hlYWQuYXhpc0NvdW50ICogMjBVICsKICAgICAgICAgICAgICBmdmFyX2hlYWQuaW5zdGFuY2VDb3VudCAqIGZ2YXJfaGVhZC5pbnN0YW5jZVNpemUgPiB0YWJsZV9sZW4gKQogICAgICAgeworICAgICAgICBGVF9UUkFDRTEoKCAiXG4iCisgICAgICAgICAgICAgICAgICAgICJUVF9HZXRfTU1fVmFyOiBpbnZhbGlkIGBmdmFyJyBoZWFkZXJcbiIgKSk7CiAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKICAgICAgICAgZ290byBFeGl0OwogICAgICAgfQogCisgICAgICBGVF9UUkFDRTIoKCAibG9hZGVkXG4iICkpOworCisgICAgICBGVF9UUkFDRTUoKCAibnVtYmVyIG9mIEdYIHN0eWxlIGF4ZXM6ICVkXG4iLCBmdmFyX2hlYWQuYXhpc0NvdW50ICkpOworCiAgICAgICBpZiAoIEZUX05FVyggZmFjZS0+YmxlbmQgKSApCiAgICAgICAgIGdvdG8gRXhpdDsKIApAQCAtNzAyLDYgKzgyNCw5IEBACiAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgIGZhY2UtPmJsZW5kLT5tbXZhciA9IG1tdmFyOwogCisgICAgICAvKiBzZXQgdXAgcG9pbnRlcnMgYW5kIG9mZnNldHMgaW50byB0aGUgYG1tdmFyJyBhcnJheTsgKi8KKyAgICAgIC8qIHRoZSBkYXRhIGdldHMgZmlsbGVkIGluIGxhdGVyIG9uICAgICAgICAgICAgICAgICAgICAqLworCiAgICAgICBtbXZhci0+bnVtX2F4aXMgPQogICAgICAgICBmdmFyX2hlYWQuYXhpc0NvdW50OwogICAgICAgbW12YXItPm51bV9kZXNpZ25zID0KQEAgLTcxMSwzMCArODM2LDMyIEBACiAgICAgICBtbXZhci0+bnVtX25hbWVkc3R5bGVzID0KICAgICAgICAgZnZhcl9oZWFkLmluc3RhbmNlQ291bnQ7CiAgICAgICBtbXZhci0+YXhpcyA9Ci0gICAgICAgIChGVF9WYXJfQXhpcyopJihtbXZhclsxXSk7CisgICAgICAgIChGVF9WYXJfQXhpcyopJiggbW12YXJbMV0gKTsKICAgICAgIG1tdmFyLT5uYW1lZHN0eWxlID0KLSAgICAgICAgKEZUX1Zhcl9OYW1lZF9TdHlsZSopJihtbXZhci0+YXhpc1tmdmFyX2hlYWQuYXhpc0NvdW50XSk7CisgICAgICAgIChGVF9WYXJfTmFtZWRfU3R5bGUqKSYoIG1tdmFyLT5heGlzW2Z2YXJfaGVhZC5heGlzQ291bnRdICk7CiAKICAgICAgIG5leHRfY29vcmRzID0KLSAgICAgICAgKEZUX0ZpeGVkKikmKG1tdmFyLT5uYW1lZHN0eWxlW2Z2YXJfaGVhZC5pbnN0YW5jZUNvdW50XSk7Ci0gICAgICBmb3IgKCBpID0gMDsgaSA8IGZ2YXJfaGVhZC5pbnN0YW5jZUNvdW50OyArK2kgKQorICAgICAgICAoRlRfRml4ZWQqKSYoIG1tdmFyLT5uYW1lZHN0eWxlW2Z2YXJfaGVhZC5pbnN0YW5jZUNvdW50XSApOworICAgICAgZm9yICggaSA9IDA7IGkgPCBmdmFyX2hlYWQuaW5zdGFuY2VDb3VudDsgaSsrICkKICAgICAgIHsKICAgICAgICAgbW12YXItPm5hbWVkc3R5bGVbaV0uY29vcmRzICA9IG5leHRfY29vcmRzOwogICAgICAgICBuZXh0X2Nvb3JkcyAgICAgICAgICAgICAgICAgKz0gZnZhcl9oZWFkLmF4aXNDb3VudDsKICAgICAgIH0KIAogICAgICAgbmV4dF9uYW1lID0gKEZUX1N0cmluZyopbmV4dF9jb29yZHM7Ci0gICAgICBmb3IgKCBpID0gMDsgaSA8IGZ2YXJfaGVhZC5heGlzQ291bnQ7ICsraSApCisgICAgICBmb3IgKCBpID0gMDsgaSA8IGZ2YXJfaGVhZC5heGlzQ291bnQ7IGkrKyApCiAgICAgICB7CiAgICAgICAgIG1tdmFyLT5heGlzW2ldLm5hbWUgID0gbmV4dF9uYW1lOwogICAgICAgICBuZXh0X25hbWUgICAgICAgICAgICs9IDU7CiAgICAgICB9CiAKKyAgICAgIC8qIG5vdyBmaWxsIGluIHRoZSBkYXRhICovCisKICAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGZ2YXJfc3RhcnQgKyBmdmFyX2hlYWQub2Zmc2V0VG9EYXRhICkgKQogICAgICAgICBnb3RvIEV4aXQ7CiAKICAgICAgIGEgPSBtbXZhci0+YXhpczsKLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgZnZhcl9oZWFkLmF4aXNDb3VudDsgKytpICkKKyAgICAgIGZvciAoIGkgPSAwOyBpIDwgZnZhcl9oZWFkLmF4aXNDb3VudDsgaSsrICkKICAgICAgIHsKICAgICAgICAgR1hfRlZhcl9BeGlzICBheGlzX3JlYzsKIApAQCAtNzQyLDIyICs4NjksMzAgQEAKICAgICAgICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIGZ2YXJheGlzX2ZpZWxkcywgJmF4aXNfcmVjICkgKQogICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgYS0+dGFnICAgICA9IGF4aXNfcmVjLmF4aXNUYWc7Ci0gICAgICAgIGEtPm1pbmltdW0gPSBheGlzX3JlYy5taW5WYWx1ZTsgICAgIC8qIEEgRml4ZWQgKi8KLSAgICAgICAgYS0+ZGVmICAgICA9IGF4aXNfcmVjLmRlZmF1bHRWYWx1ZTsgLyogQSBGaXhlZCAqLwotICAgICAgICBhLT5tYXhpbXVtID0gYXhpc19yZWMubWF4VmFsdWU7ICAgICAvKiBBIEZpeGVkICovCisgICAgICAgIGEtPm1pbmltdW0gPSBheGlzX3JlYy5taW5WYWx1ZTsKKyAgICAgICAgYS0+ZGVmICAgICA9IGF4aXNfcmVjLmRlZmF1bHRWYWx1ZTsKKyAgICAgICAgYS0+bWF4aW11bSA9IGF4aXNfcmVjLm1heFZhbHVlOwogICAgICAgICBhLT5zdHJpZCAgID0gYXhpc19yZWMubmFtZUlEOwogCiAgICAgICAgIGEtPm5hbWVbMF0gPSAoRlRfU3RyaW5nKSggICBhLT50YWcgPj4gMjQgKTsKICAgICAgICAgYS0+bmFtZVsxXSA9IChGVF9TdHJpbmcpKCAoIGEtPnRhZyA+PiAxNiApICYgMHhGRiApOwogICAgICAgICBhLT5uYW1lWzJdID0gKEZUX1N0cmluZykoICggYS0+dGFnID4+ICA4ICkgJiAweEZGICk7CiAgICAgICAgIGEtPm5hbWVbM10gPSAoRlRfU3RyaW5nKSggKCBhLT50YWcgICAgICAgKSAmIDB4RkYgKTsKLSAgICAgICAgYS0+bmFtZVs0XSA9IDA7CisgICAgICAgIGEtPm5hbWVbNF0gPSAnXDAnOwogCi0gICAgICAgICsrYTsKKyAgICAgICAgRlRfVFJBQ0U1KCggIiAgXCIlc1wiOiBtaW5pbXVtPSUuNGYsIGRlZmF1bHQ9JS40ZiwgbWF4aW11bT0lLjRmXG4iLAorICAgICAgICAgICAgICAgICAgICBhLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICBhLT5taW5pbXVtIC8gNjU1MzYuMCwKKyAgICAgICAgICAgICAgICAgICAgYS0+ZGVmIC8gNjU1MzYuMCwKKyAgICAgICAgICAgICAgICAgICAgYS0+bWF4aW11bSAvIDY1NTM2LjAgKSk7CisKKyAgICAgICAgYSsrOwogICAgICAgfQogCisgICAgICBGVF9UUkFDRTUoKCAiXG4iICkpOworCiAgICAgICBucyA9IG1tdmFyLT5uYW1lZHN0eWxlOwotICAgICAgZm9yICggaSA9IDA7IGkgPCBmdmFyX2hlYWQuaW5zdGFuY2VDb3VudDsgKytpLCArK25zICkKKyAgICAgIGZvciAoIGkgPSAwOyBpIDwgZnZhcl9oZWFkLmluc3RhbmNlQ291bnQ7IGkrKywgbnMrKyApCiAgICAgICB7CiAgICAgICAgIGlmICggRlRfRlJBTUVfRU5URVIoIDRMICsgNEwgKiBmdmFyX2hlYWQuYXhpc0NvdW50ICkgKQogICAgICAgICAgIGdvdG8gRXhpdDsKQEAgLTc2NSwxMyArOTAwLDE1IEBACiAgICAgICAgIG5zLT5zdHJpZCAgICAgICA9ICAgIEZUX0dFVF9VU0hPUlQoKTsKICAgICAgICAgKHZvaWQpIC8qIGZsYWdzID0gKi8gRlRfR0VUX1VTSE9SVCgpOwogCi0gICAgICAgIGZvciAoIGogPSAwOyBqIDwgZnZhcl9oZWFkLmF4aXNDb3VudDsgKytqICkKLSAgICAgICAgICBucy0+Y29vcmRzW2pdID0gRlRfR0VUX1VMT05HKCk7ICAgICAvKiBBIEZpeGVkICovCisgICAgICAgIGZvciAoIGogPSAwOyBqIDwgZnZhcl9oZWFkLmF4aXNDb3VudDsgaisrICkKKyAgICAgICAgICBucy0+Y29vcmRzW2pdID0gRlRfR0VUX0xPTkcoKTsKIAogICAgICAgICBGVF9GUkFNRV9FWElUKCk7CiAgICAgICB9CiAgICAgfQogCisgICAgLyogZmlsbCB0aGUgb3V0cHV0IGFycmF5IGlmIHJlcXVlc3RlZCAqLworCiAgICAgaWYgKCBtYXN0ZXIgIT0gTlVMTCApCiAgICAgewogICAgICAgRlRfVUludCAgbjsKQEAgLTc4MiwzNiArOTE5LDM2IEBACiAgICAgICBGVF9NRU1fQ09QWSggbW12YXIsIGZhY2UtPmJsZW5kLT5tbXZhciwgZmFjZS0+YmxlbmQtPm1tdmFyX2xlbiApOwogCiAgICAgICBtbXZhci0+YXhpcyA9Ci0gICAgICAgIChGVF9WYXJfQXhpcyopJihtbXZhclsxXSk7CisgICAgICAgIChGVF9WYXJfQXhpcyopJiggbW12YXJbMV0gKTsKICAgICAgIG1tdmFyLT5uYW1lZHN0eWxlID0KLSAgICAgICAgKEZUX1Zhcl9OYW1lZF9TdHlsZSopJihtbXZhci0+YXhpc1ttbXZhci0+bnVtX2F4aXNdKTsKKyAgICAgICAgKEZUX1Zhcl9OYW1lZF9TdHlsZSopJiggbW12YXItPmF4aXNbbW12YXItPm51bV9heGlzXSApOwogICAgICAgbmV4dF9jb29yZHMgPQotICAgICAgICAoRlRfRml4ZWQqKSYobW12YXItPm5hbWVkc3R5bGVbbW12YXItPm51bV9uYW1lZHN0eWxlc10pOworICAgICAgICAoRlRfRml4ZWQqKSYoIG1tdmFyLT5uYW1lZHN0eWxlW21tdmFyLT5udW1fbmFtZWRzdHlsZXNdICk7CiAKLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgbW12YXItPm51bV9uYW1lZHN0eWxlczsgKytuICkKKyAgICAgIGZvciAoIG4gPSAwOyBuIDwgbW12YXItPm51bV9uYW1lZHN0eWxlczsgbisrICkKICAgICAgIHsKICAgICAgICAgbW12YXItPm5hbWVkc3R5bGVbbl0uY29vcmRzICA9IG5leHRfY29vcmRzOwogICAgICAgICBuZXh0X2Nvb3JkcyAgICAgICAgICAgICAgICAgKz0gbW12YXItPm51bV9heGlzOwogICAgICAgfQogCi0gICAgICBhID0gbW12YXItPmF4aXM7CisgICAgICBhICAgICAgICAgPSBtbXZhci0+YXhpczsKICAgICAgIG5leHRfbmFtZSA9IChGVF9TdHJpbmcqKW5leHRfY29vcmRzOwotICAgICAgZm9yICggbiA9IDA7IG4gPCBtbXZhci0+bnVtX2F4aXM7ICsrbiApCisgICAgICBmb3IgKCBuID0gMDsgbiA8IG1tdmFyLT5udW1fYXhpczsgbisrICkKICAgICAgIHsKICAgICAgICAgYS0+bmFtZSA9IG5leHRfbmFtZTsKIAogICAgICAgICAvKiBzdGFuZGFyZCBQb3N0U2NyaXB0IG5hbWVzIGZvciBzb21lIHN0YW5kYXJkIGFwcGxlIHRhZ3MgKi8KICAgICAgICAgaWYgKCBhLT50YWcgPT0gVFRBR193Z2h0ICkKLSAgICAgICAgICBhLT5uYW1lID0gKGNoYXIgKikiV2VpZ2h0IjsKKyAgICAgICAgICBhLT5uYW1lID0gKGNoYXIqKSJXZWlnaHQiOwogICAgICAgICBlbHNlIGlmICggYS0+dGFnID09IFRUQUdfd2R0aCApCi0gICAgICAgICAgYS0+bmFtZSA9IChjaGFyICopIldpZHRoIjsKKyAgICAgICAgICBhLT5uYW1lID0gKGNoYXIqKSJXaWR0aCI7CiAgICAgICAgIGVsc2UgaWYgKCBhLT50YWcgPT0gVFRBR19vcHN6ICkKLSAgICAgICAgICBhLT5uYW1lID0gKGNoYXIgKikiT3B0aWNhbFNpemUiOworICAgICAgICAgIGEtPm5hbWUgPSAoY2hhciopIk9wdGljYWxTaXplIjsKICAgICAgICAgZWxzZSBpZiAoIGEtPnRhZyA9PSBUVEFHX3NsbnQgKQotICAgICAgICAgIGEtPm5hbWUgPSAoY2hhciAqKSJTbGFudCI7CisgICAgICAgICAgYS0+bmFtZSA9IChjaGFyKikiU2xhbnQiOwogCiAgICAgICAgIG5leHRfbmFtZSArPSA1OwotICAgICAgICArK2E7CisgICAgICAgIGErKzsKICAgICAgIH0KIAogICAgICAgKm1hc3RlciA9IG1tdmFyOwpAQCAtODM3LDkgKzk3NCwxMiBAQAogICAvKiAgICAgICAgICAgICAgICAgIEluaXRpYWxpemUgdGhlIGJsZW5kIHN0cnVjdHVyZSB3aXRoIGBndmFyJyBkYXRhLiAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fY29vcmRzIDo6IE11c3QgYmUgdGhlIGF4aXMgY291bnQgb2YgdGhlIGZvbnQuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgbnVtX2Nvb3JkcyA6OiBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjb29yZGluYXRlcy4gIElmIGl0IGlzICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBheGVzLCBpZ25vcmUgdGhlIGV4Y2VzcyAgICAqLworICAvKiAgICAgICAgICAgICAgICAgIHZhbHVlcy4gIElmIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGF4ZXMsICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgKDApIGZvciB0aGUgcmVtYWluaW5nIGF4ZXMuICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb29yZHMgICAgIDo6IEFuIGFycmF5IG9mIG51bV9jb29yZHMsIGVhY2ggYmV0d2VlbiBbLTEsMV0uICAgICAgICAgKi8KKyAgLyogICAgY29vcmRzICAgICA6OiBBbiBhcnJheSBvZiBgbnVtX2Nvb3JkcycsIGVhY2ggYmV0d2VlbiBbLTEsMV0uICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC04NjgsMzMgKzEwMDgsNDQgQEAKIAogICAgIGlmICggZmFjZS0+YmxlbmQgPT0gTlVMTCApCiAgICAgewotICAgICAgaWYgKCAoZXJyb3IgPSBUVF9HZXRfTU1fVmFyKCBmYWNlLCBOVUxMKSkgIT0gMCApCisgICAgICBpZiAoICggZXJyb3IgPSBUVF9HZXRfTU1fVmFyKCBmYWNlLCBOVUxMICkgKSAhPSAwICkKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAogICAgIGJsZW5kID0gZmFjZS0+YmxlbmQ7CiAgICAgbW12YXIgPSBibGVuZC0+bW12YXI7CiAKLSAgICBpZiAoIG51bV9jb29yZHMgIT0gbW12YXItPm51bV9heGlzICkKKyAgICBpZiAoIG51bV9jb29yZHMgPiBtbXZhci0+bnVtX2F4aXMgKQogICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKKyAgICAgIEZUX1RSQUNFMigoICJUVF9TZXRfTU1fQmxlbmQ6IG9ubHkgdXNpbmcgZmlyc3QgJWQgb2YgJWQgY29vcmRpbmF0ZXNcbiIsCisgICAgICAgICAgICAgICAgICBtbXZhci0+bnVtX2F4aXMsIG51bV9jb29yZHMgKSk7CisgICAgICBudW1fY29vcmRzID0gbW12YXItPm51bV9heGlzOwogICAgIH0KIAotICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtX2Nvb3JkczsgKytpICkKKyAgICBGVF9UUkFDRTUoKCAibm9ybWFsaXplZCBkZXNpZ24gY29vcmRpbmF0ZXM6XG4iICkpOworCisgICAgZm9yICggaSA9IDA7IGkgPCBudW1fY29vcmRzOyBpKysgKQorICAgIHsKKyAgICAgIEZUX1RSQUNFNSgoICIgICUuNGZcbiIsIGNvb3Jkc1tpXSAvIDY1NTM2LjAgKSk7CiAgICAgICBpZiAoIGNvb3Jkc1tpXSA8IC0weDAwMDEwMDAwTCB8fCBjb29yZHNbaV0gPiAweDAwMDEwMDAwTCApCiAgICAgICB7CisgICAgICAgIEZUX1RSQUNFMSgoICJUVF9TZXRfTU1fQmxlbmQ6IG5vcm1hbGl6ZWQgZGVzaWduIGNvb3JkaW5hdGUgJS40ZlxuIgorICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICBpcyBvdXQgb2YgcmFuZ2UgWy0xOzFdXG4iLAorICAgICAgICAgICAgICAgICAgICBjb29yZHNbaV0gLyA2NTUzNi4wICkpOwogICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgIH0KKyAgICB9CisKKyAgICBGVF9UUkFDRTUoKCAiXG4iICkpOwogCiAgICAgaWYgKCBibGVuZC0+Z2x5cGhvZmZzZXRzID09IE5VTEwgKQotICAgICAgaWYgKCAoZXJyb3IgPSBmdF92YXJfbG9hZF9ndmFyKCBmYWNlICkpICE9IDAgKQorICAgICAgaWYgKCAoIGVycm9yID0gZnRfdmFyX2xvYWRfZ3ZhciggZmFjZSApICkgIT0gMCApCiAgICAgICAgIGdvdG8gRXhpdDsKIAogICAgIGlmICggYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHMgPT0gTlVMTCApCiAgICAgewotICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIGJsZW5kLT5ub3JtYWxpemVkY29vcmRzLCBudW1fY29vcmRzICkgKQorICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIGJsZW5kLT5ub3JtYWxpemVkY29vcmRzLCBtbXZhci0+bnVtX2F4aXMgKSApCiAgICAgICAgIGdvdG8gRXhpdDsKIAogICAgICAgbWFuYWdlQ3Z0ID0gbWN2dF9tb2RpZnk7CkBAIC05MDYsNyArMTA1Nyw4IEBACiAgICAgZWxzZQogICAgIHsKICAgICAgIG1hbmFnZUN2dCA9IG1jdnRfcmV0YWluOwotICAgICAgZm9yICggaSA9IDA7IGkgPCBudW1fY29vcmRzOyArK2kgKQorCisgICAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9jb29yZHM7IGkrKyApCiAgICAgICB7CiAgICAgICAgIGlmICggYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV0gIT0gY29vcmRzW2ldICkKICAgICAgICAgewpAQCAtOTE1LDEzICsxMDY3LDIyIEBACiAgICAgICAgIH0KICAgICAgIH0KIAorICAgICAgZm9yICggOyBpIDwgbW12YXItPm51bV9heGlzOyBpKysgKQorICAgICAgeworICAgICAgICBpZiAoIGJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2ldICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgbWFuYWdlQ3Z0ID0gbWN2dF9sb2FkOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKICAgICAgIC8qIElmIHdlIGRvbid0IGNoYW5nZSB0aGUgYmxlbmQgY29vcmRzIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBkbyAgKi8KICAgICAgIC8qIGFueXRoaW5nIHRvIHRoZSBjdnQgdGFibGUuICBJdCB3aWxsIGJlIGNvcnJlY3QuICBPdGhlcndpc2Ugd2UgKi8KICAgICAgIC8qIG5vIGxvbmdlciBoYXZlIHRoZSBvcmlnaW5hbCBjdnQgKGl0IHdhcyBtb2RpZmllZCB3aGVuIHdlIHNldCAgKi8KICAgICAgIC8qIHRoZSBibGVuZCBsYXN0IHRpbWUpLCBzbyB3ZSBtdXN0IHJlbG9hZCBhbmQgdGhlbiBtb2RpZnkgaXQuICAgKi8KICAgICB9CiAKLSAgICBibGVuZC0+bnVtX2F4aXMgPSBudW1fY29vcmRzOworICAgIGJsZW5kLT5udW1fYXhpcyA9IG1tdmFyLT5udW1fYXhpczsKICAgICBGVF9NRU1fQ09QWSggYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHMsCiAgICAgICAgICAgICAgICAgIGNvb3JkcywKICAgICAgICAgICAgICAgICAgbnVtX2Nvb3JkcyAqIHNpemVvZiAoIEZUX0ZpeGVkICkgKTsKQEAgLTk3Myw3ICsxMTM0LDEwIEBACiAgIC8qICAgICAgICAgICAgICAgICAgSW5pdGlhbGl6ZSB0aGUgYmxlbmQgc3RydWN0IHdpdGggYGd2YXInIGRhdGEuICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9jb29yZHMgOjogVGhpcyBtdXN0IGJlIHRoZSBheGlzIGNvdW50IG9mIHRoZSBmb250LiAgICAgICAgICAgICAqLworICAvKiAgICBudW1fY29vcmRzIDo6IFRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGNvb3JkaW5hdGVzLiAgSWYgaXQgaXMgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGF4ZXMsIGlnbm9yZSB0aGUgZXhjZXNzICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgdmFsdWVzLiAgSWYgaXQgaXMgc21hbGxlciB0aGFuIHRoZSBudW1iZXIgb2YgYXhlcywgICAqLworICAvKiAgICAgICAgICAgICAgICAgIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSByZW1haW5pbmcgYXhlcy4gICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgIGNvb3JkcyAgICAgOjogQSBjb29yZGluYXRlIGFycmF5IHdpdGggYG51bV9jb29yZHMnIGVsZW1lbnRzLiAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTk5NywxNyArMTE2MSwxOSBAQAogCiAgICAgaWYgKCBmYWNlLT5ibGVuZCA9PSBOVUxMICkKICAgICB7Ci0gICAgICBpZiAoIChlcnJvciA9IFRUX0dldF9NTV9WYXIoIGZhY2UsIE5VTEwgKSkgIT0gMCApCisgICAgICBpZiAoICggZXJyb3IgPSBUVF9HZXRfTU1fVmFyKCBmYWNlLCBOVUxMICkgKSAhPSAwICkKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAogICAgIGJsZW5kID0gZmFjZS0+YmxlbmQ7CiAgICAgbW12YXIgPSBibGVuZC0+bW12YXI7CiAKLSAgICBpZiAoIG51bV9jb29yZHMgIT0gbW12YXItPm51bV9heGlzICkKKyAgICBpZiAoIG51bV9jb29yZHMgPiBtbXZhci0+bnVtX2F4aXMgKQogICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKKyAgICAgIEZUX1RSQUNFMigoICJUVF9TZXRfVmFyX0Rlc2lnbjoiCisgICAgICAgICAgICAgICAgICAiIG9ubHkgdXNpbmcgZmlyc3QgJWQgb2YgJWQgY29vcmRpbmF0ZXNcbiIsCisgICAgICAgICAgICAgICAgICBtbXZhci0+bnVtX2F4aXMsIG51bV9jb29yZHMgKSk7CisgICAgICBudW1fY29vcmRzID0gbW12YXItPm51bV9heGlzOwogICAgIH0KIAogICAgIC8qIEF4aXMgbm9ybWFsaXphdGlvbiBpcyBhIHR3byBzdGFnZSBwcm9jZXNzLiAgRmlyc3Qgd2Ugbm9ybWFsaXplICovCkBAIC0xMDE3LDMyICsxMTgzLDUyIEBACiAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIG5vcm1hbGl6ZWQsIG1tdmFyLT5udW1fYXhpcyApICkKICAgICAgIGdvdG8gRXhpdDsKIAorICAgIEZUX1RSQUNFNSgoICJkZXNpZ24gY29vcmRpbmF0ZXM6XG4iICkpOworCiAgICAgYSA9IG1tdmFyLT5heGlzOwotICAgIGZvciAoIGkgPSAwOyBpIDwgbW12YXItPm51bV9heGlzOyArK2ksICsrYSApCisgICAgZm9yICggaSA9IDA7IGkgPCBudW1fY29vcmRzOyBpKyssIGErKyApCiAgICAgeworICAgICAgRlRfVFJBQ0U1KCggIiAgJS40ZlxuIiwgY29vcmRzW2ldIC8gNjU1MzYuMCApKTsKICAgICAgIGlmICggY29vcmRzW2ldID4gYS0+bWF4aW11bSB8fCBjb29yZHNbaV0gPCBhLT5taW5pbXVtICkKICAgICAgIHsKKyAgICAgICAgRlRfVFJBQ0UxKCggIlRUX1NldF9WYXJfRGVzaWduOiBub3JtYWxpemVkIGRlc2lnbiBjb29yZGluYXRlICUuNGZcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICBpcyBvdXQgb2YgcmFuZ2UgWyUuNGY7JS40Zl1cbiIsCisgICAgICAgICAgICAgICAgICAgIGNvb3Jkc1tpXSAvIDY1NTM2LjAsCisgICAgICAgICAgICAgICAgICAgIGEtPm1pbmltdW0gLyA2NTUzNi4wLAorICAgICAgICAgICAgICAgICAgICBhLT5tYXhpbXVtIC8gNjU1MzYuMCApKTsKICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICB9CiAKICAgICAgIGlmICggY29vcmRzW2ldIDwgYS0+ZGVmICkKLSAgICAgICAgbm9ybWFsaXplZFtpXSA9IC1GVF9EaXZGaXgoIGNvb3Jkc1tpXSAtIGEtPmRlZiwgYS0+bWluaW11bSAtIGEtPmRlZiApOworICAgICAgICBub3JtYWxpemVkW2ldID0gLUZUX0RpdkZpeCggY29vcmRzW2ldIC0gYS0+ZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+bWluaW11bSAtIGEtPmRlZiApOwogICAgICAgZWxzZSBpZiAoIGEtPm1heGltdW0gPT0gYS0+ZGVmICkKICAgICAgICAgbm9ybWFsaXplZFtpXSA9IDA7CiAgICAgICBlbHNlCi0gICAgICAgIG5vcm1hbGl6ZWRbaV0gPSBGVF9EaXZGaXgoIGNvb3Jkc1tpXSAtIGEtPmRlZiwgYS0+bWF4aW11bSAtIGEtPmRlZiApOworICAgICAgICBub3JtYWxpemVkW2ldID0gRlRfRGl2Rml4KCBjb29yZHNbaV0gLSBhLT5kZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPm1heGltdW0gLSBhLT5kZWYgKTsKICAgICB9CiAKKyAgICBGVF9UUkFDRTUoKCAiXG4iICkpOworCisgICAgZm9yICggOyBpIDwgbW12YXItPm51bV9heGlzOyBpKysgKQorICAgICAgbm9ybWFsaXplZFtpXSA9IDA7CisKICAgICBpZiAoICFibGVuZC0+YXZhcl9jaGVja2VkICkKICAgICAgIGZ0X3Zhcl9sb2FkX2F2YXIoIGZhY2UgKTsKIAogICAgIGlmICggYmxlbmQtPmF2YXJfc2VnbWVudCAhPSBOVUxMICkKICAgICB7CisgICAgICBGVF9UUkFDRTUoKCAibm9ybWFsaXplZCBkZXNpZ24gY29vcmRpbmF0ZXMiCisgICAgICAgICAgICAgICAgICAiIGJlZm9yZSBhcHBseWluZyBgYXZhcicgZGF0YTpcbiIgKSk7CisKICAgICAgIGF2ID0gYmxlbmQtPmF2YXJfc2VnbWVudDsKLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgbW12YXItPm51bV9heGlzOyArK2ksICsrYXYgKQorICAgICAgZm9yICggaSA9IDA7IGkgPCBtbXZhci0+bnVtX2F4aXM7IGkrKywgYXYrKyApCiAgICAgICB7Ci0gICAgICAgIGZvciAoIGogPSAxOyBqIDwgKEZUX1VJbnQpYXYtPnBhaXJDb3VudDsgKytqICkKKyAgICAgICAgZm9yICggaiA9IDE7IGogPCAoRlRfVUludClhdi0+cGFpckNvdW50OyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgRlRfVFJBQ0U1KCggIiAgJS40ZlxuIiwgbm9ybWFsaXplZFtpXSAvIDY1NTM2LjAgKSk7CiAgICAgICAgICAgaWYgKCBub3JtYWxpemVkW2ldIDwgYXYtPmNvcnJlc3BvbmRlbmNlW2pdLmZyb21Db29yZCApCiAgICAgICAgICAgewogICAgICAgICAgICAgbm9ybWFsaXplZFtpXSA9CkBAIC0xMDU0LDEwICsxMjQwLDExIEBACiAgICAgICAgICAgICAgIGF2LT5jb3JyZXNwb25kZW5jZVtqIC0gMV0udG9Db29yZDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgfQogICAgIH0KIAotICAgIGVycm9yID0gVFRfU2V0X01NX0JsZW5kKCBmYWNlLCBudW1fY29vcmRzLCBub3JtYWxpemVkICk7CisgICAgZXJyb3IgPSBUVF9TZXRfTU1fQmxlbmQoIGZhY2UsIG1tdmFyLT5udW1fYXhpcywgbm9ybWFsaXplZCApOwogCiAgIEV4aXQ6CiAgICAgRlRfRlJFRSggbm9ybWFsaXplZCApOwpAQCAtMTEyMCwxNiArMTMwNywxNiBAQAogCiAgICAgaWYgKCBibGVuZCA9PSBOVUxMICkKICAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAidHRfZmFjZV92YXJ5X2N2dDogbm8gYmxlbmQgc3BlY2lmaWVkXG4iICkpOwotCisgICAgICBGVF9UUkFDRTIoKCAiXG4iCisgICAgICAgICAgICAgICAgICAidHRfZmFjZV92YXJ5X2N2dDogbm8gYmxlbmQgc3BlY2lmaWVkXG4iICkpOwogICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7CiAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCiAgICAgaWYgKCBmYWNlLT5jdnQgPT0gTlVMTCApCiAgICAgewotICAgICAgRlRfVFJBQ0UyKCggInR0X2ZhY2VfdmFyeV9jdnQ6IG5vIGBjdnQgJyB0YWJsZVxuIiApKTsKLQorICAgICAgRlRfVFJBQ0UyKCggIlxuIgorICAgICAgICAgICAgICAgICAgInR0X2ZhY2VfdmFyeV9jdnQ6IG5vIGBjdnQgJyB0YWJsZVxuIiApKTsKICAgICAgIGVycm9yID0gRlRfRXJyX09rOwogICAgICAgZ290byBFeGl0OwogICAgIH0KQEAgLTExNTgsNiArMTM0NSw4IEBACiAgICAgICBnb3RvIEZFeGl0OwogICAgIH0KIAorICAgIEZUX1RSQUNFMigoICJsb2FkZWRcbiIgKSk7CisKICAgICBpZiAoIEZUX05FV19BUlJBWSggdHVwbGVfY29vcmRzLCBibGVuZC0+bnVtX2F4aXMgKSAgICB8fAogICAgICAgICAgRlRfTkVXX0FSUkFZKCBpbV9zdGFydF9jb29yZHMsIGJsZW5kLT5udW1fYXhpcyApIHx8CiAgICAgICAgICBGVF9ORVdfQVJSQVkoIGltX2VuZF9jb29yZHMsIGJsZW5kLT5udW1fYXhpcyApICAgKQpAQCAtMTE3MCwxMyArMTM1OSwxNyBAQAogICAgIC8qIHR1cGxlY291bnQsIGJ1dCBKb2huIEplbmtpbnMgc2F5cyB0aGF0IHNoYXJlZCBwb2ludHMgZG9uJ3QgYXBwbHkgKi8KICAgICAvKiB0byBgY3ZhcicsIGFuZCBubyBvdGhlciBmbGFncyBhcmUgZGVmaW5lZC4gICAgICAgICAgICAgICAgICAgICAgICovCiAKLSAgICBmb3IgKCBpID0gMDsgaSA8ICggdHVwbGVDb3VudCAmIDB4RkZGICk7ICsraSApCisgICAgRlRfVFJBQ0U1KCggImN2YXI6IHRoZXJlIGFyZSAlZCB0dXBsZXM6XG4iLCB0dXBsZUNvdW50ICkpOworCisgICAgZm9yICggaSA9IDA7IGkgPCAoIHR1cGxlQ291bnQgJiAweEZGRiApOyBpKysgKQogICAgIHsKICAgICAgIEZUX1VJbnQgICB0dXBsZURhdGFTaXplOwogICAgICAgRlRfVUludCAgIHR1cGxlSW5kZXg7CiAgICAgICBGVF9GaXhlZCAgYXBwbHk7CiAKIAorICAgICAgRlRfVFJBQ0U2KCggIiAgdHVwbGUgJWQ6XG4iLCBpICkpOworCiAgICAgICB0dXBsZURhdGFTaXplID0gRlRfR0VUX1VTSE9SVCgpOwogICAgICAgdHVwbGVJbmRleCAgICA9IEZUX0dFVF9VU0hPUlQoKTsKIApAQCAtMTE4NSw4ICsxMzc4LDggQEAKIAogICAgICAgaWYgKCB0dXBsZUluZGV4ICYgR1hfVElfRU1CRURERURfVFVQTEVfQ09PUkQgKQogICAgICAgewotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGJsZW5kLT5udW1fYXhpczsgKytqICkKLSAgICAgICAgICB0dXBsZV9jb29yZHNbal0gPSBGVF9HRVRfU0hPUlQoKSA8PCAyOyAvKiBjb252ZXJ0IGZyb20gICAgICAgICovCisgICAgICAgIGZvciAoIGogPSAwOyBqIDwgYmxlbmQtPm51bV9heGlzOyBqKysgKQorICAgICAgICAgIHR1cGxlX2Nvb3Jkc1tqXSA9IEZUX0dFVF9TSE9SVCgpICogNDsgIC8qIGNvbnZlcnQgZnJvbSAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaG9ydCBmcmFjIHRvIGZpeGVkICovCiAgICAgICB9CiAgICAgICBlbHNlCkBAIC0xMTk0LDcgKzEzODcsNyBAQAogICAgICAgICAvKiBza2lwIHRoaXMgdHVwbGU7IGl0IG1ha2VzIG5vIHNlbnNlICovCiAKICAgICAgICAgaWYgKCB0dXBsZUluZGV4ICYgR1hfVElfSU5URVJNRURJQVRFX1RVUExFICkKLSAgICAgICAgICBmb3IgKCBqID0gMDsgaiA8IDIgKiBibGVuZC0+bnVtX2F4aXM7ICsraiApCisgICAgICAgICAgZm9yICggaiA9IDA7IGogPCAyICogYmxlbmQtPm51bV9heGlzOyBqKysgKQogICAgICAgICAgICAgKHZvaWQpRlRfR0VUX1NIT1JUKCk7CiAKICAgICAgICAgb2Zmc2V0VG9EYXRhICs9IHR1cGxlRGF0YVNpemU7CkBAIC0xMjAzLDEwICsxMzk2LDEwIEBACiAKICAgICAgIGlmICggdHVwbGVJbmRleCAmIEdYX1RJX0lOVEVSTUVESUFURV9UVVBMRSApCiAgICAgICB7Ci0gICAgICAgIGZvciAoIGogPSAwOyBqIDwgYmxlbmQtPm51bV9heGlzOyArK2ogKQotICAgICAgICAgIGltX3N0YXJ0X2Nvb3Jkc1tqXSA9IEZUX0dFVF9TSE9SVCgpIDw8IDI7Ci0gICAgICAgIGZvciAoIGogPSAwOyBqIDwgYmxlbmQtPm51bV9heGlzOyArK2ogKQotICAgICAgICAgIGltX2VuZF9jb29yZHNbal0gPSBGVF9HRVRfU0hPUlQoKSA8PCAyOworICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGJsZW5kLT5udW1fYXhpczsgaisrICkKKyAgICAgICAgICBpbV9zdGFydF9jb29yZHNbal0gPSBGVF9HRVRfU0hPUlQoKSAqIDQ7CisgICAgICAgIGZvciAoIGogPSAwOyBqIDwgYmxlbmQtPm51bV9heGlzOyBqKysgKQorICAgICAgICAgIGltX2VuZF9jb29yZHNbal0gPSBGVF9HRVRfU0hPUlQoKSAqIDQ7CiAgICAgICB9CiAKICAgICAgIGFwcGx5ID0gZnRfdmFyX2FwcGx5X3R1cGxlKCBibGVuZCwKQEAgLTEyMzMsMjUgKzE0MjYsNzQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2NvdW50ID09IDAgPyBmYWNlLT5jdnRfc2l6ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBvaW50X2NvdW50ICk7CiAgICAgICBpZiAoIGxvY2FscG9pbnRzID09IE5VTEwgfHwgZGVsdGFzID09IE5VTEwgKQotICAgICAgICAvKiBmYWlsdXJlLCBpZ25vcmUgaXQgKi87CisgICAgICAgIDsgLyogZmFpbHVyZSwgaWdub3JlIGl0ICovCiAKICAgICAgIGVsc2UgaWYgKCBsb2NhbHBvaW50cyA9PSBBTExfUE9JTlRTICkKICAgICAgIHsKKyNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQorICAgICAgICBpbnQgIGNvdW50ID0gMDsKKyNlbmRpZgorCisKKyAgICAgICAgRlRfVFJBQ0U3KCggIiAgICBDVlQgZGVsdGFzOlxuIiApKTsKKwogICAgICAgICAvKiB0aGlzIG1lYW5zIHRoYXQgdGhlcmUgYXJlIGRlbHRhcyBmb3IgZXZlcnkgZW50cnkgaW4gY3Z0ICovCi0gICAgICAgIGZvciAoIGogPSAwOyBqIDwgZmFjZS0+Y3Z0X3NpemU7ICsraiApCi0gICAgICAgICAgZmFjZS0+Y3Z0W2pdID0gKEZUX1Nob3J0KSggZmFjZS0+Y3Z0W2pdICsKKyAgICAgICAgZm9yICggaiA9IDA7IGogPCBmYWNlLT5jdnRfc2l6ZTsgaisrICkKKyAgICAgICAgeworICAgICAgICAgIEZUX0xvbmcgIG9yaWdfY3Z0ID0gZmFjZS0+Y3Z0W2pdOworCisKKyAgICAgICAgICBmYWNlLT5jdnRbal0gPSAoRlRfU2hvcnQpKCBvcmlnX2N2dCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsRml4KCBkZWx0YXNbal0sIGFwcGx5ICkgKTsKKworI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCisgICAgICAgICAgaWYgKCBvcmlnX2N2dCAhPSBmYWNlLT5jdnRbal0gKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIEZUX1RSQUNFNygoICIgICAgICAlZDogJWQgLT4gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBqLCBvcmlnX2N2dCwgZmFjZS0+Y3Z0W2pdICkpOworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorCisjaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKKyAgICAgICAgaWYgKCAhY291bnQgKQorICAgICAgICAgIEZUX1RSQUNFNygoICIgICAgICBub25lXG4iICkpOworI2VuZGlmCiAgICAgICB9CiAKICAgICAgIGVsc2UKICAgICAgIHsKLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBwb2ludF9jb3VudDsgKytqICkKLSAgICAgICAgewotICAgICAgICAgIGludCAgcGluZGV4ID0gbG9jYWxwb2ludHNbal07CisjaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKKyAgICAgICAgaW50ICBjb3VudCA9IDA7CisjZW5kaWYKIAotICAgICAgICAgIGZhY2UtPmN2dFtwaW5kZXhdID0gKEZUX1Nob3J0KSggZmFjZS0+Y3Z0W3BpbmRleF0gKworCisgICAgICAgIEZUX1RSQUNFNygoICIgICAgQ1ZUIGRlbHRhczpcbiIgKSk7CisKKyAgICAgICAgZm9yICggaiA9IDA7IGogPCBwb2ludF9jb3VudDsgaisrICkKKyAgICAgICAgeworICAgICAgICAgIGludCAgICAgIHBpbmRleCAgID0gbG9jYWxwb2ludHNbal07CisgICAgICAgICAgRlRfTG9uZyAgb3JpZ19jdnQgPSBmYWNlLT5jdnRbcGluZGV4XTsKKworCisgICAgICAgICAgZmFjZS0+Y3Z0W3BpbmRleF0gPSAoRlRfU2hvcnQpKCBvcmlnX2N2dCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxGaXgoIGRlbHRhc1tqXSwgYXBwbHkgKSApOworCisjaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKKyAgICAgICAgICBpZiAoIG9yaWdfY3Z0ICE9IGZhY2UtPmN2dFtwaW5kZXhdICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBGVF9UUkFDRTcoKCAiICAgICAgJWQ6ICVkIC0+ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcGluZGV4LCBvcmlnX2N2dCwgZmFjZS0+Y3Z0W3BpbmRleF0gKSk7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgIH0KKyNlbmRpZgogICAgICAgICB9CisKKyNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQorICAgICAgICBpZiAoICFjb3VudCApCisgICAgICAgICAgRlRfVFJBQ0U3KCggIiAgICAgIG5vbmVcbiIgKSk7CisjZW5kaWYKICAgICAgIH0KIAogICAgICAgaWYgKCBsb2NhbHBvaW50cyAhPSBBTExfUE9JTlRTICkKQEAgLTEyNjMsNiArMTUwNSw4IEBACiAgICAgICBGVF9TdHJlYW1fU2Vla1NldCggc3RyZWFtLCBoZXJlICk7CiAgICAgfQogCisgICAgRlRfVFJBQ0U1KCggIlxuIiApKTsKKwogICBGRXhpdDoKICAgICBGVF9GUkFNRV9FWElUKCk7CiAKQEAgLTEyNzUsMTMgKzE1MTksMjMwIEBACiAgIH0KIAogCisgIC8qIFNoaWZ0IHRoZSBvcmlnaW5hbCBjb29yZGluYXRlcyBvZiBhbGwgcG9pbnRzIGJldHdlZW4gaW5kaWNlcyBgcDEnICovCisgIC8qIGFuZCBgcDInLCB1c2luZyB0aGUgc2FtZSBkaWZmZXJlbmNlIGFzIGdpdmVuIGJ5IGluZGV4IGByZWYnLiAgICAgICovCisKKyAgLyogbW9kZWxlZCBhZnRlciBgYWZfaXVwX3NoaWZ0JyAqLworCisgIHN0YXRpYyB2b2lkCisgIHR0X2RlbHRhX3NoaWZ0KCBpbnQgICAgICAgICBwMSwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIHAyLAorICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgcmVmLAorICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgaW5fcG9pbnRzLAorICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgb3V0X3BvaW50cyApCisgIHsKKyAgICBpbnQgICAgICAgIHA7CisgICAgRlRfVmVjdG9yICBkZWx0YTsKKworCisgICAgZGVsdGEueCA9IG91dF9wb2ludHNbcmVmXS54IC0gaW5fcG9pbnRzW3JlZl0ueDsKKyAgICBkZWx0YS55ID0gb3V0X3BvaW50c1tyZWZdLnkgLSBpbl9wb2ludHNbcmVmXS55OworCisgICAgaWYgKCBkZWx0YS54ID09IDAgJiYgZGVsdGEueSA9PSAwICkKKyAgICAgIHJldHVybjsKKworICAgIGZvciAoIHAgPSBwMTsgcCA8IHJlZjsgcCsrICkKKyAgICB7CisgICAgICBvdXRfcG9pbnRzW3BdLnggKz0gZGVsdGEueDsKKyAgICAgIG91dF9wb2ludHNbcF0ueSArPSBkZWx0YS55OworICAgIH0KKworICAgIGZvciAoIHAgPSByZWYgKyAxOyBwIDw9IHAyOyBwKysgKQorICAgIHsKKyAgICAgIG91dF9wb2ludHNbcF0ueCArPSBkZWx0YS54OworICAgICAgb3V0X3BvaW50c1twXS55ICs9IGRlbHRhLnk7CisgICAgfQorICB9CisKKworICAvKiBJbnRlcnBvbGF0ZSB0aGUgb3JpZ2luYWwgY29vcmRpbmF0ZXMgb2YgYWxsIHBvaW50cyB3aXRoIGluZGljZXMgKi8KKyAgLyogYmV0d2VlbiBgcDEnIGFuZCBgcDInLCB1c2luZyBgcmVmMScgYW5kIGByZWYyJyBhcyB0aGUgcmVmZXJlbmNlICovCisgIC8qIHBvaW50IGluZGljZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIC8qIG1vZGVsZWQgYWZ0ZXIgYGFmX2l1cF9pbnRlcnAnLCBgX2l1cF93b3JrZXJfaW50ZXJwb2xhdGUnLCBhbmQgKi8KKyAgLyogYEluc19JVVAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIHN0YXRpYyB2b2lkCisgIHR0X2RlbHRhX2ludGVycG9sYXRlKCBpbnQgICAgICAgICBwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIHAyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgcmVmMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIHJlZjIsCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBpbl9wb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBvdXRfcG9pbnRzICkKKyAgeworICAgIGludCAgcCwgaTsKKworICAgIEZUX1BvcyAgb3V0LCBpbjEsIGluMiwgb3V0MSwgb3V0MiwgZDEsIGQyOworCisKKyAgICBpZiAoIHAxID4gcDIgKQorICAgICAgcmV0dXJuOworCisgICAgLyogaGFuZGxlIGJvdGggaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgY29vcmRpbmF0ZXMgKi8KKyAgICBmb3IgKCBpID0gMDsgaSA8PSAxOyBpKysgKQorICAgIHsKKyAgICAgIC8qIHNoaWZ0IGFycmF5IHBvaW50ZXJzIHNvIHRoYXQgd2UgY2FuIGFjY2VzcyBgZm9vLnknIGFzIGBmb28ueCcgKi8KKyAgICAgIGluX3BvaW50cyAgPSAoRlRfVmVjdG9yKikoIChGVF9Qb3MqKWluX3BvaW50cyArIGkgKTsKKyAgICAgIG91dF9wb2ludHMgPSAoRlRfVmVjdG9yKikoIChGVF9Qb3MqKW91dF9wb2ludHMgKyBpICk7CisKKyAgICAgIGlmICggaW5fcG9pbnRzW3JlZjFdLnggPiBpbl9wb2ludHNbcmVmMl0ueCApCisgICAgICB7CisgICAgICAgIHAgICAgPSByZWYxOworICAgICAgICByZWYxID0gcmVmMjsKKyAgICAgICAgcmVmMiA9IHA7CisgICAgICB9CisKKyAgICAgIGluMSAgPSBpbl9wb2ludHNbcmVmMV0ueDsKKyAgICAgIGluMiAgPSBpbl9wb2ludHNbcmVmMl0ueDsKKyAgICAgIG91dDEgPSBvdXRfcG9pbnRzW3JlZjFdLng7CisgICAgICBvdXQyID0gb3V0X3BvaW50c1tyZWYyXS54OworICAgICAgZDEgICA9IG91dDEgLSBpbjE7CisgICAgICBkMiAgID0gb3V0MiAtIGluMjsKKworICAgICAgaWYgKCBvdXQxID09IG91dDIgfHwgaW4xID09IGluMiApCisgICAgICB7CisgICAgICAgIGZvciAoIHAgPSBwMTsgcCA8PSBwMjsgcCsrICkKKyAgICAgICAgeworICAgICAgICAgIG91dCA9IGluX3BvaW50c1twXS54OworCisgICAgICAgICAgaWYgKCBvdXQgPD0gaW4xICkKKyAgICAgICAgICAgIG91dCArPSBkMTsKKyAgICAgICAgICBlbHNlIGlmICggb3V0ID49IGluMiApCisgICAgICAgICAgICBvdXQgKz0gZDI7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0ID0gb3V0MTsKKworICAgICAgICAgIG91dF9wb2ludHNbcF0ueCA9IG91dDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBGVF9GaXhlZCAgc2NhbGUgPSBGVF9EaXZGaXgoIG91dDIgLSBvdXQxLCBpbjIgLSBpbjEgKTsKKworCisgICAgICAgIGZvciAoIHAgPSBwMTsgcCA8PSBwMjsgcCsrICkKKyAgICAgICAgeworICAgICAgICAgIG91dCA9IGluX3BvaW50c1twXS54OworCisgICAgICAgICAgaWYgKCBvdXQgPD0gaW4xICkKKyAgICAgICAgICAgIG91dCArPSBkMTsKKyAgICAgICAgICBlbHNlIGlmICggb3V0ID49IGluMiApCisgICAgICAgICAgICBvdXQgKz0gZDI7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgb3V0ID0gb3V0MSArIEZUX011bEZpeCggb3V0IC0gaW4xLCBzY2FsZSApOworCisgICAgICAgICAgb3V0X3BvaW50c1twXS54ID0gb3V0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKworICAvKiBJbnRlcnBvbGF0ZSBwb2ludHMgd2l0aG91dCBkZWx0YSB2YWx1ZXMsIHNpbWlsYXIgdG8gKi8KKyAgLyogdGhlIGBJVVAnIGhpbnRpbmcgaW5zdHJ1Y3Rpb24uICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgLyogbW9kZWxlZCBhZnRlciBgSW5zX0lVUCAqLworCisgIHN0YXRpYyB2b2lkCisgIHR0X2hhbmRsZV9kZWx0YXMoIEZUX091dGxpbmUqICBvdXRsaW5lLAorICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICAgaW5fcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICBGVF9Cb29sKiAgICAgaGFzX2RlbHRhICkKKyAgeworICAgIEZUX1ZlY3RvciogIG91dF9wb2ludHM7CisKKyAgICBGVF9JbnQgIGZpcnN0X3BvaW50OworICAgIEZUX0ludCAgZW5kX3BvaW50OworCisgICAgRlRfSW50ICBmaXJzdF9kZWx0YTsKKyAgICBGVF9JbnQgIGN1cl9kZWx0YTsKKworICAgIEZUX0ludCAgICBwb2ludDsKKyAgICBGVF9TaG9ydCAgY29udG91cjsKKworCisgICAgLyogaWdub3JlIGVtcHR5IG91dGxpbmVzICovCisgICAgaWYgKCAhb3V0bGluZS0+bl9jb250b3VycyApCisgICAgICByZXR1cm47CisKKyAgICBvdXRfcG9pbnRzID0gb3V0bGluZS0+cG9pbnRzOworCisgICAgY29udG91ciA9IDA7CisgICAgcG9pbnQgICA9IDA7CisKKyAgICBkbworICAgIHsKKyAgICAgIGVuZF9wb2ludCAgID0gb3V0bGluZS0+Y29udG91cnNbY29udG91cl07CisgICAgICBmaXJzdF9wb2ludCA9IHBvaW50OworCisgICAgICAvKiBzZWFyY2ggZmlyc3QgcG9pbnQgdGhhdCBoYXMgYSBkZWx0YSAqLworICAgICAgd2hpbGUgKCBwb2ludCA8PSBlbmRfcG9pbnQgJiYgIWhhc19kZWx0YVtwb2ludF0gKQorICAgICAgICBwb2ludCsrOworCisgICAgICBpZiAoIHBvaW50IDw9IGVuZF9wb2ludCApCisgICAgICB7CisgICAgICAgIGZpcnN0X2RlbHRhID0gcG9pbnQ7CisgICAgICAgIGN1cl9kZWx0YSAgID0gcG9pbnQ7CisKKyAgICAgICAgcG9pbnQrKzsKKworICAgICAgICB3aGlsZSAoIHBvaW50IDw9IGVuZF9wb2ludCApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBzZWFyY2ggbmV4dCBwb2ludCB0aGF0IGhhcyBhIGRlbHRhICAqLworICAgICAgICAgIC8qIGFuZCBpbnRlcnBvbGF0ZSBpbnRlcm1lZGlhdGUgcG9pbnRzICovCisgICAgICAgICAgaWYgKCBoYXNfZGVsdGFbcG9pbnRdICkKKyAgICAgICAgICB7CisgICAgICAgICAgICB0dF9kZWx0YV9pbnRlcnBvbGF0ZSggY3VyX2RlbHRhICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2RlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX3BvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfcG9pbnRzICk7CisgICAgICAgICAgICBjdXJfZGVsdGEgPSBwb2ludDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBwb2ludCsrOworICAgICAgICB9CisKKyAgICAgICAgLyogc2hpZnQgY29udG91ciBpZiB3ZSBvbmx5IGhhdmUgYSBzaW5nbGUgZGVsdGEgKi8KKyAgICAgICAgaWYgKCBjdXJfZGVsdGEgPT0gZmlyc3RfZGVsdGEgKQorICAgICAgICAgIHR0X2RlbHRhX3NoaWZ0KCBmaXJzdF9wb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX3BvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfZGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluX3BvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X3BvaW50cyApOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBvdGhlcndpc2UgaGFuZGxlIHJlbWFpbmluZyBwb2ludHMgICAgICAgKi8KKyAgICAgICAgICAvKiBhdCB0aGUgZW5kIGFuZCBiZWdpbm5pbmcgb2YgdGhlIGNvbnRvdXIgKi8KKyAgICAgICAgICB0dF9kZWx0YV9pbnRlcnBvbGF0ZSggY3VyX2RlbHRhICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX3BvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfZGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2RlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9wb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9wb2ludHMgKTsKKworICAgICAgICAgIGlmICggZmlyc3RfZGVsdGEgPiAwICkKKyAgICAgICAgICAgIHR0X2RlbHRhX2ludGVycG9sYXRlKCBmaXJzdF9wb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9kZWx0YSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2RlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2RlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX3BvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfcG9pbnRzICk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNvbnRvdXIrKzsKKworICAgIH0gd2hpbGUgKCBjb250b3VyIDwgb3V0bGluZS0+bl9jb250b3VycyApOworICB9CisKKwogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9WYXJ5X0dldF9HbHlwaF9EZWx0YXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVFRfVmFyeV9BcHBseV9HbHlwaF9EZWx0YXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZCB0aGUgYXBwcm9wcmlhdGUgZGVsdGFzIGZvciB0aGUgY3VycmVudCBnbHlwaC4gICAgICAgICAgICAgICAgICovCisgIC8qICAgIEFwcGx5IHRoZSBhcHByb3ByaWF0ZSBkZWx0YXMgdG8gdGhlIGN1cnJlbnQgZ2x5cGguICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgIGZhY2UgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAqLwpAQCAtMTI5MSwyMiArMTc1MiwyNCBAQAogICAvKiAgICBuX3BvaW50cyAgICA6OiBUaGUgbnVtYmVyIG9mIHRoZSBwb2ludHMgaW4gdGhlIGdseXBoLCBpbmNsdWRpbmcgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgcGhhbnRvbSBwb2ludHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVsdGFzICAgICAgOjogVGhlIGFycmF5IG9mIHBvaW50cyB0byBjaGFuZ2UuICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBvdXRsaW5lICAgICA6OiBUaGUgb3V0bGluZSB0byBjaGFuZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUVF9WYXJ5X0dldF9HbHlwaF9EZWx0YXMoIFRUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICAqZGVsdGFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBuX3BvaW50cyApCisgIFRUX1ZhcnlfQXBwbHlfR2x5cGhfRGVsdGFzKCBUVF9GYWNlICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICBvdXRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIG5fcG9pbnRzICkKICAgewogICAgIEZUX1N0cmVhbSAgIHN0cmVhbSA9IGZhY2UtPnJvb3Quc3RyZWFtOwogICAgIEZUX01lbW9yeSAgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwogICAgIEdYX0JsZW5kICAgIGJsZW5kICA9IGZhY2UtPmJsZW5kOwotICAgIEZUX1ZlY3RvciogIGRlbHRhX3h5ID0gTlVMTDsKKworICAgIEZUX1ZlY3RvciogIHBvaW50c19vcmcgPSBOVUxMOworICAgIEZUX0Jvb2wqICAgIGhhc19kZWx0YSAgPSBOVUxMOwogCiAgICAgRlRfRXJyb3IgICAgZXJyb3I7CiAgICAgRlRfVUxvbmcgICAgZ2x5cGhfc3RhcnQ7CkBAIC0xMzI3LDE1ICsxNzkwLDE4IEBACiAgICAgaWYgKCAhZmFjZS0+ZG9ibGVuZCB8fCBibGVuZCA9PSBOVUxMICkKICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwogCi0gICAgLyogdG8gYmUgZnJlZWQgYnkgdGhlIGNhbGxlciAqLwotICAgIGlmICggRlRfTkVXX0FSUkFZKCBkZWx0YV94eSwgbl9wb2ludHMgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0gICAgKmRlbHRhcyA9IGRlbHRhX3h5OwotCiAgICAgaWYgKCBnbHlwaF9pbmRleCA+PSBibGVuZC0+Z3ZfZ2x5cGhjbnQgICAgICB8fAogICAgICAgICAgYmxlbmQtPmdseXBob2Zmc2V0c1tnbHlwaF9pbmRleF0gPT0KICAgICAgICAgICAgYmxlbmQtPmdseXBob2Zmc2V0c1tnbHlwaF9pbmRleCArIDFdICkKLSAgICAgIHJldHVybiBGVF9FcnJfT2s7ICAgICAgICAgICAgICAgLyogbm8gdmFyaWF0aW9uIGRhdGEgZm9yIHRoaXMgZ2x5cGggKi8KKyAgICB7CisgICAgICBGVF9UUkFDRTIoKCAiVFRfVmFyeV9BcHBseV9HbHlwaF9EZWx0YXM6IgorICAgICAgICAgICAgICAgICAgIiBubyB2YXJpYXRpb24gZGF0YSBmb3IgdGhpcyBnbHlwaFxuIiApKTsKKyAgICAgIHJldHVybiBGVF9FcnJfT2s7CisgICAgfQorCisgICAgaWYgKCBGVF9ORVdfQVJSQVkoIHBvaW50c19vcmcsIG5fcG9pbnRzICkgfHwKKyAgICAgICAgIEZUX05FV19BUlJBWSggaGFzX2RlbHRhLCBuX3BvaW50cyApICApCisgICAgICBnb3RvIEZhaWwxOwogCiAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggYmxlbmQtPmdseXBob2Zmc2V0c1tnbHlwaF9pbmRleF0gKSAgIHx8CiAgICAgICAgICBGVF9GUkFNRV9FTlRFUiggYmxlbmQtPmdseXBob2Zmc2V0c1tnbHlwaF9pbmRleCArIDFdIC0KQEAgLTEzNjcsNDEgKzE4MzMsNDMgQEAKICAgICAgIEZUX1N0cmVhbV9TZWVrU2V0KCBzdHJlYW0sIGhlcmUgKTsKICAgICB9CiAKLSAgICBmb3IgKCBpID0gMDsgaSA8ICggdHVwbGVDb3VudCAmIEdYX1RDX1RVUExFX0NPVU5UX01BU0sgKTsgKytpICkKKyAgICBGVF9UUkFDRTUoKCAiZ3ZhcjogdGhlcmUgYXJlICVkIHR1cGxlczpcbiIsIHR1cGxlQ291bnQgKSk7CisKKyAgICBmb3IgKCBpID0gMDsgaSA8ICggdHVwbGVDb3VudCAmIEdYX1RDX1RVUExFX0NPVU5UX01BU0sgKTsgaSsrICkKICAgICB7CiAgICAgICBGVF9VSW50ICAgdHVwbGVEYXRhU2l6ZTsKICAgICAgIEZUX1VJbnQgICB0dXBsZUluZGV4OwogICAgICAgRlRfRml4ZWQgIGFwcGx5OwogCiAKKyAgICAgIEZUX1RSQUNFNigoICIgIHR1cGxlICVkOlxuIiwgaSApKTsKKwogICAgICAgdHVwbGVEYXRhU2l6ZSA9IEZUX0dFVF9VU0hPUlQoKTsKICAgICAgIHR1cGxlSW5kZXggICAgPSBGVF9HRVRfVVNIT1JUKCk7CiAKICAgICAgIGlmICggdHVwbGVJbmRleCAmIEdYX1RJX0VNQkVEREVEX1RVUExFX0NPT1JEICkKICAgICAgIHsKLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBibGVuZC0+bnVtX2F4aXM7ICsraiApCi0gICAgICAgICAgdHVwbGVfY29vcmRzW2pdID0gRlRfR0VUX1NIT1JUKCkgPDwgMjsgIC8qIGNvbnZlcnQgZnJvbSAgICAgICAgKi8KKyAgICAgICAgZm9yICggaiA9IDA7IGogPCBibGVuZC0+bnVtX2F4aXM7IGorKyApCisgICAgICAgICAgdHVwbGVfY29vcmRzW2pdID0gRlRfR0VUX1NIT1JUKCkgKiA0OyAgIC8qIGNvbnZlcnQgZnJvbSAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hvcnQgZnJhYyB0byBmaXhlZCAqLwogICAgICAgfQogICAgICAgZWxzZSBpZiAoICggdHVwbGVJbmRleCAmIEdYX1RJX1RVUExFX0lOREVYX01BU0sgKSA+PSBibGVuZC0+dHVwbGVjb3VudCApCiAgICAgICB7CiAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICAgICAgZ290byBGYWlsMzsKKyAgICAgICAgZ290byBGYWlsMjsKICAgICAgIH0KICAgICAgIGVsc2UKLSAgICAgIHsKICAgICAgICAgRlRfTUVNX0NPUFkoCiAgICAgICAgICAgdHVwbGVfY29vcmRzLAotICAgICAgICAgICZibGVuZC0+dHVwbGVjb29yZHNbKHR1cGxlSW5kZXggJiAweEZGRikgKiBibGVuZC0+bnVtX2F4aXNdLAorICAgICAgICAgICZibGVuZC0+dHVwbGVjb29yZHNbKCB0dXBsZUluZGV4ICYgMHhGRkYgKSAqIGJsZW5kLT5udW1fYXhpc10sCiAgICAgICAgICAgYmxlbmQtPm51bV9heGlzICogc2l6ZW9mICggRlRfRml4ZWQgKSApOwotICAgICAgfQogCiAgICAgICBpZiAoIHR1cGxlSW5kZXggJiBHWF9USV9JTlRFUk1FRElBVEVfVFVQTEUgKQogICAgICAgewotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGJsZW5kLT5udW1fYXhpczsgKytqICkKLSAgICAgICAgICBpbV9zdGFydF9jb29yZHNbal0gPSBGVF9HRVRfU0hPUlQoKSA8PCAyOwotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGJsZW5kLT5udW1fYXhpczsgKytqICkKLSAgICAgICAgICBpbV9lbmRfY29vcmRzW2pdID0gRlRfR0VUX1NIT1JUKCkgPDwgMjsKKyAgICAgICAgZm9yICggaiA9IDA7IGogPCBibGVuZC0+bnVtX2F4aXM7IGorKyApCisgICAgICAgICAgaW1fc3RhcnRfY29vcmRzW2pdID0gRlRfR0VUX1NIT1JUKCkgKiA0OworICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGJsZW5kLT5udW1fYXhpczsgaisrICkKKyAgICAgICAgICBpbV9lbmRfY29vcmRzW2pdID0gRlRfR0VUX1NIT1JUKCkgKiA0OwogICAgICAgfQogCiAgICAgICBhcHBseSA9IGZ0X3Zhcl9hcHBseV90dXBsZSggYmxlbmQsCkBAIC0xNDQzLDI0ICsxOTExLDEwMSBAQAogCiAgICAgICBlbHNlIGlmICggcG9pbnRzID09IEFMTF9QT0lOVFMgKQogICAgICAgeworI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCisgICAgICAgIGludCAgY291bnQgPSAwOworI2VuZGlmCisKKworICAgICAgICBGVF9UUkFDRTcoKCAiICAgIHBvaW50IGRlbHRhczpcbiIgKSk7CisKICAgICAgICAgLyogdGhpcyBtZWFucyB0aGF0IHRoZXJlIGFyZSBkZWx0YXMgZm9yIGV2ZXJ5IHBvaW50IGluIHRoZSBnbHlwaCAqLwotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IG5fcG9pbnRzOyArK2ogKQorICAgICAgICBmb3IgKCBqID0gMDsgaiA8IG5fcG9pbnRzOyBqKysgKQogICAgICAgICB7Ci0gICAgICAgICAgZGVsdGFfeHlbal0ueCArPSBGVF9NdWxGaXgoIGRlbHRhc194W2pdLCBhcHBseSApOwotICAgICAgICAgIGRlbHRhX3h5W2pdLnkgKz0gRlRfTXVsRml4KCBkZWx0YXNfeVtqXSwgYXBwbHkgKTsKKyNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQorICAgICAgICAgIEZUX1ZlY3RvciAgcG9pbnRfb3JnID0gb3V0bGluZS0+cG9pbnRzW2pdOworI2VuZGlmCisKKworICAgICAgICAgIG91dGxpbmUtPnBvaW50c1tqXS54ICs9IEZUX011bEZpeCggZGVsdGFzX3hbal0sIGFwcGx5ICk7CisgICAgICAgICAgb3V0bGluZS0+cG9pbnRzW2pdLnkgKz0gRlRfTXVsRml4KCBkZWx0YXNfeVtqXSwgYXBwbHkgKTsKKworI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCisgICAgICAgICAgaWYgKCAoIHBvaW50X29yZy54ICE9IG91dGxpbmUtPnBvaW50c1tqXS54ICkgfHwKKyAgICAgICAgICAgICAgICggcG9pbnRfb3JnLnkgIT0gb3V0bGluZS0+cG9pbnRzW2pdLnkgKSApCisgICAgICAgICAgeworICAgICAgICAgICAgRlRfVFJBQ0U3KCggIiAgICAgICVkOiAoJWQsICVkKSAtPiAoJWQsICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGosCisgICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9vcmcueCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50X29yZy55LAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZS0+cG9pbnRzW2pdLngsCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lLT5wb2ludHNbal0ueSApKTsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgfQorI2VuZGlmCiAgICAgICAgIH0KKworI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCisgICAgICAgIGlmICggIWNvdW50ICkKKyAgICAgICAgICBGVF9UUkFDRTcoKCAiICAgICAgbm9uZVxuIiApKTsKKyNlbmRpZgogICAgICAgfQogCiAgICAgICBlbHNlCiAgICAgICB7Ci0gICAgICAgIGZvciAoIGogPSAwOyBqIDwgcG9pbnRfY291bnQ7ICsraiApCisjaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKKyAgICAgICAgaW50ICBjb3VudCA9IDA7CisjZW5kaWYKKworCisgICAgICAgIC8qIHdlIGhhdmUgdG8gaW50ZXJwb2xhdGUgdGhlIG1pc3NpbmcgZGVsdGFzIHNpbWlsYXIgdG8gdGhlICovCisgICAgICAgIC8qIElVUCBieXRlY29kZSBpbnN0cnVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIGZvciAoIGogPSAwOyBqIDwgbl9wb2ludHM7IGorKyApCiAgICAgICAgIHsKLSAgICAgICAgICBpZiAoIGxvY2FscG9pbnRzW2pdID49IG5fcG9pbnRzICkKKyAgICAgICAgICBwb2ludHNfb3JnW2pdID0gb3V0bGluZS0+cG9pbnRzW2pdOworICAgICAgICAgIGhhc19kZWx0YVtqXSAgPSBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoIGogPSAwOyBqIDwgcG9pbnRfY291bnQ7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICBGVF9VU2hvcnQgIGlkeCA9IGxvY2FscG9pbnRzW2pdOworCisKKyAgICAgICAgICBpZiAoIGlkeCA+PSBuX3BvaW50cyApCiAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICAgIGRlbHRhX3h5W2xvY2FscG9pbnRzW2pdXS54ICs9IEZUX011bEZpeCggZGVsdGFzX3hbal0sIGFwcGx5ICk7Ci0gICAgICAgICAgZGVsdGFfeHlbbG9jYWxwb2ludHNbal1dLnkgKz0gRlRfTXVsRml4KCBkZWx0YXNfeVtqXSwgYXBwbHkgKTsKKyAgICAgICAgICBoYXNfZGVsdGFbaWR4XSA9IFRSVUU7CisKKyAgICAgICAgICBvdXRsaW5lLT5wb2ludHNbaWR4XS54ICs9IEZUX011bEZpeCggZGVsdGFzX3hbal0sIGFwcGx5ICk7CisgICAgICAgICAgb3V0bGluZS0+cG9pbnRzW2lkeF0ueSArPSBGVF9NdWxGaXgoIGRlbHRhc195W2pdLCBhcHBseSApOwogICAgICAgICB9CisKKyAgICAgICAgLyogbm8gbmVlZCB0byBoYW5kbGUgcGhhbnRvbSBwb2ludHMgaGVyZSwgICAgICAqLworICAgICAgICAvKiBzaW5jZSBzb2xpdGFyeSBwb2ludHMgY2FuJ3QgYmUgaW50ZXJwb2xhdGVkICovCisgICAgICAgIHR0X2hhbmRsZV9kZWx0YXMoIG91dGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50c19vcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19kZWx0YSApOworCisjaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKKyAgICAgICAgRlRfVFJBQ0U3KCggIiAgICBwb2ludCBkZWx0YXM6XG4iICkpOworCisgICAgICAgIGZvciAoIGogPSAwOyBqIDwgbl9wb2ludHM7IGorKykKKyAgICAgICAgeworICAgICAgICAgIGlmICggKCBwb2ludHNfb3JnW2pdLnggIT0gb3V0bGluZS0+cG9pbnRzW2pdLnggKSB8fAorICAgICAgICAgICAgICAgKCBwb2ludHNfb3JnW2pdLnkgIT0gb3V0bGluZS0+cG9pbnRzW2pdLnkgKSApCisgICAgICAgICAgeworICAgICAgICAgICAgRlRfVFJBQ0U3KCggIiAgICAgICVkOiAoJWQsICVkKSAtPiAoJWQsICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGosCisgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHNfb3JnW2pdLngsCisgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHNfb3JnW2pdLnksCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lLT5wb2ludHNbal0ueCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmUtPnBvaW50c1tqXS55ICkpOworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoICFjb3VudCApCisgICAgICAgICAgRlRfVFJBQ0U3KCggIiAgICAgIG5vbmVcbiIgKSk7CisjZW5kaWYKICAgICAgIH0KIAogICAgICAgaWYgKCBsb2NhbHBvaW50cyAhPSBBTExfUE9JTlRTICkKQEAgLTE0NzMsMjIgKzIwMTgsMTkgQEAKICAgICAgIEZUX1N0cmVhbV9TZWVrU2V0KCBzdHJlYW0sIGhlcmUgKTsKICAgICB9CiAKLSAgRmFpbDM6CisgICAgRlRfVFJBQ0U1KCggIlxuIiApKTsKKworICBGYWlsMjoKICAgICBGVF9GUkVFKCB0dXBsZV9jb29yZHMgKTsKICAgICBGVF9GUkVFKCBpbV9zdGFydF9jb29yZHMgKTsKICAgICBGVF9GUkVFKCBpbV9lbmRfY29vcmRzICk7CiAKLSAgRmFpbDI6CiAgICAgRlRfRlJBTUVfRVhJVCgpOwogCiAgIEZhaWwxOgotICAgIGlmICggZXJyb3IgKQotICAgIHsKLSAgICAgIEZUX0ZSRUUoIGRlbHRhX3h5ICk7Ci0gICAgICAqZGVsdGFzID0gTlVMTDsKLSAgICB9CisgICAgRlRfRlJFRSggcG9pbnRzX29yZyApOworICAgIEZUX0ZSRUUoIGhhc19kZWx0YSApOwogCi0gIEV4aXQ6CiAgICAgcmV0dXJuIGVycm9yOwogICB9CiAKQEAgLTE0OTksNyArMjA0MSw3IEBACiAgIC8qICAgIHR0X2RvbmVfYmxlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVzIHRoZSBibGVuZCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGcmVlIHRoZSBibGVuZCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIEZUX0xPQ0FMX0RFRiggdm9pZCApCiAgIHR0X2RvbmVfYmxlbmQoIEZUX01lbW9yeSAgbWVtb3J5LApAQCAtMTUxNSw3ICsyMDU3LDcgQEAKIAogICAgICAgaWYgKCBibGVuZC0+YXZhcl9zZWdtZW50ICE9IE5VTEwgKQogICAgICAgewotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGJsZW5kLT5udW1fYXhpczsgKytpICkKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBibGVuZC0+bnVtX2F4aXM7IGkrKyApCiAgICAgICAgICAgRlRfRlJFRSggYmxlbmQtPmF2YXJfc2VnbWVudFtpXS5jb3JyZXNwb25kZW5jZSApOwogICAgICAgICBGVF9GUkVFKCBibGVuZC0+YXZhcl9zZWdtZW50ICk7CiAgICAgICB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRneHZhci5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0Z3h2YXIuaAppbmRleCA4MmRmYzQ0Li4wNjBkNGQ2IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRneHZhci5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dGd4dmFyLmgKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgVHJ1ZVR5cGUgR1ggRm9udCBWYXJpYXRpb24gbG9hZGVyIChzcGVjaWZpY2F0aW9uKSAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDA0LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBXZXJuZXIgTGVtYmVyZyBhbmQgR2VvcmdlIFdpbGxpYW1zLiAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KQEAgLTE2MiwxMCArMTYyLDEwIEBACiAKIAogICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBUVF9WYXJ5X0dldF9HbHlwaF9EZWx0YXMoIFRUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICAqZGVsdGFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBuX3BvaW50cyApOworICBUVF9WYXJ5X0FwcGx5X0dseXBoX0RlbHRhcyggVFRfRmFjZSAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBuX3BvaW50cyApOwogCiAKICAgRlRfTE9DQUwoIHZvaWQgKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYwppbmRleCA2YmRmZmJjLi5hZTJhODJhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYwpAQCAtNCw4ICs0LDggQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBUcnVlVHlwZSBieXRlY29kZSBpbnRlcnByZXRlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYnkgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KIC8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCkBAIC00NCw2ICs0NCw3IEBACiAjdW5kZWYgIEZUX0NPTVBPTkVOVAogI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3R0aW50ZXJwCiAKKwogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qIEluIG9yZGVyIHRvIGRldGVjdCBpbmZpbml0ZSBsb29wcyBpbiB0aGUgY29kZSwgd2Ugc2V0IHVwIGEgY291bnRlciAgICAqLwpAQCAtNTMsMTc0ICs1NCwzMCBAQAogI2RlZmluZSBNQVhfUlVOTkFCTEVfT1BDT0RFUyAgMTAwMDAwMEwKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlcmUgYXJlIHR3byBraW5kcyBvZiBpbXBsZW1lbnRhdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBhLiBzdGF0aWMgaW1wbGVtZW50YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0IGlzIGEgc3RhdGljIHZhcmlhYmxlLCB3aGljaCBmaWVsZHMgICAqLwotICAvKiAgICBhcmUgYWNjZXNzZWQgZGlyZWN0bHkgYnkgdGhlIGludGVycHJldGVyIGR1cmluZyBleGVjdXRpb24uICBUaGUgICAgKi8KLSAgLyogICAgY29udGV4dCBpcyBuYW1lZCBgY3VyJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHZlcnNpb24gaXMgbm9uLXJlZW50cmFudCwgb2YgY291cnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIGIuIGluZGlyZWN0IGltcGxlbWVudGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGN1cnJlbnQgZXhlY3V0aW9uIGNvbnRleHQgaXMgcGFzc2VkIHRvIF9lYWNoXyBmdW5jdGlvbiBhcyBpdHMgICovCi0gIC8qICAgIGZpcnN0IGFyZ3VtZW50LCBhbmQgZWFjaCBmaWVsZCBpcyB0aHVzIGFjY2Vzc2VkIGluZGlyZWN0bHkuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyB2ZXJzaW9uIGlzIGZ1bGx5IHJlLWVudHJhbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgaWRlYSBpcyB0aGF0IGFuIGluZGlyZWN0IGltcGxlbWVudGF0aW9uIG1heSBiZSBzbG93ZXIgdG8gZXhlY3V0ZSAgKi8KLSAgLyogb24gbG93LWVuZCBwcm9jZXNzb3JzIHRoYXQgYXJlIHVzZWQgaW4gc29tZSBzeXN0ZW1zIChsaWtlIDM4NnMgb3IgICAgICovCi0gIC8qIGV2ZW4gNDg2cykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQXMgYSBjb25zZXF1ZW5jZSwgdGhlIGluZGlyZWN0IGltcGxlbWVudGF0aW9uIGlzIG5vdyB0aGUgZGVmYXVsdCwgYXMgICovCi0gIC8qIGl0cyBwZXJmb3JtYW5jZSBjb3N0cyBjYW4gYmUgY29uc2lkZXJlZCBuZWdsaWdpYmxlIGluIG91ciBjb250ZXh0LiAgICAqLwotICAvKiBOb3RlLCBob3dldmVyLCB0aGF0IHdlIGtlcHQgdGhlIHNhbWUgc291cmNlIHdpdGggbWFjcm9zIGJlY2F1c2U6ICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gVGhlIGNvZGUgaXMga2VwdCB2ZXJ5IGNsb3NlIGluIGRlc2lnbiB0byB0aGUgUGFzY2FsIGNvZGUgdXNlZCBmb3IgICAqLwotICAvKiAgIGRldmVsb3BtZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gSXQncyBtdWNoIG1vcmUgcmVhZGFibGUgdGhhdCB3YXkhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSBJdCdzIHN0aWxsIG9wZW4gdG8gZXhwZXJpbWVudGF0aW9uIGFuZCB0dW5pbmcuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIFRUX0NPTkZJR19PUFRJT05fU1RBVElDX0lOVEVSUFJFVEVSICAgICAvKiBpbmRpcmVjdCBpbXBsZW1lbnRhdGlvbiAqLwotCi0jZGVmaW5lIENVUiAgKCpleGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZWUgdHRvYmpzLmggKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgbWFjcm8gaXMgdXNlZCB3aGVuZXZlciBgZXhlYycgaXMgdW51c2VkIGluIGEgZnVuY3Rpb24sIHRvIGF2b2lkICAqLwotICAvKiBzdHVwaWQgd2FybmluZ3MgZnJvbSBwZWRhbnRpYyBjb21waWxlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX1VOVVNFRF9FWEVDICBGVF9VTlVTRUQoIGV4YyApCi0KLSNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXRpYyBpbXBsZW1lbnRhdGlvbiAqLwotCi0jZGVmaW5lIENVUiAgY3VyCi0KLSNkZWZpbmUgRlRfVU5VU0VEX0VYRUMgIGludCAgX19kdW1teSA9IF9fZHVtbXkKLQotICBzdGF0aWMKLSAgVFRfRXhlY0NvbnRleHRSZWMgIGN1cjsgICAvKiBzdGF0aWMgZXhlYy4gY29udGV4dCB2YXJpYWJsZSAqLwotCi0gIC8qIGFwcGFyZW50bHksIHdlIGhhdmUgYSBfbG90XyBvZiBkaXJlY3QgaW5kZXhpbmcgd2hlbiBhY2Nlc3NpbmcgICovCi0gIC8qIHRoZSBzdGF0aWMgYGN1cicsIHdoaWNoIG1ha2VzIHRoZSBjb2RlIGJpZ2dlciAoZHVlIHRvIGFsbCB0aGUgICovCi0gIC8qIGZvdXIgYnl0ZXMgYWRkcmVzc2VzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NUQVRJQ19JTlRFUlBSRVRFUiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgaW5zdHJ1Y3Rpb24gYXJndW1lbnQgc3RhY2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIElOU19BUkcgIEVYRUNfT1BfIEZUX0xvbmcqICBhcmdzICAgIC8qIHNlZSB0dG9ianMuaCBmb3IgRVhFQ19PUF8gKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBtYWNybyBpcyB1c2VkIHdoZW5ldmVyIGBhcmdzJyBpcyB1bnVzZWQgaW4gYSBmdW5jdGlvbiwgdG8gYXZvaWQgICovCi0gIC8qIHN0dXBpZCB3YXJuaW5ncyBmcm9tIHBlZGFudGljIGNvbXBpbGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfVU5VU0VEX0FSRyAgRlRfVU5VU0VEX0VYRUM7IEZUX1VOVVNFRCggYXJncyApCi0KLQotI2RlZmluZSBTVUJQSVhFTF9ISU5USU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoICgoVFRfRHJpdmVyKUZUX0ZBQ0VfRFJJVkVSKCBDVVIuZmFjZSApKS0+aW50ZXJwcmV0ZXJfdmVyc2lvbiA9PSBcCisjZGVmaW5lIFNVQlBJWEVMX0hJTlRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoICgoVFRfRHJpdmVyKUZUX0ZBQ0VfRFJJVkVSKCBleGMtPmZhY2UgKSktPmludGVycHJldGVyX3ZlcnNpb24gPT0gXAogICAgICAgICAgICAgVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zOCApCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGhpZGUgdGhlIHVzZSBvZiBFWEVDX0FSRyBhbmQgRVhFQ19BUkdfIHRvICAgICAgICAqLwotICAvKiBpbmNyZWFzZSByZWFkYWJpbGl0eSBvZiB0aGUgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQUk9KRUNUKCB2MSwgdjIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBleGMtPmZ1bmNfcHJvamVjdCggZXhjLCAodjEpLT54IC0gKHYyKS0+eCwgKHYxKS0+eSAtICh2MiktPnkgKQogCisjZGVmaW5lIERVQUxQUk9KKCB2MSwgdjIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBleGMtPmZ1bmNfZHVhbHByb2ooIGV4YywgKHYxKS0+eCAtICh2MiktPngsICh2MSktPnkgLSAodjIpLT55ICkKIAotI2RlZmluZSBTS0lQX0NvZGUoKSBcCi0gICAgICAgICAgU2tpcENvZGUoIEVYRUNfQVJHICkKKyNkZWZpbmUgRkFTVF9QUk9KRUNUKCB2ICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBleGMtPmZ1bmNfcHJvamVjdCggZXhjLCAodiktPngsICh2KS0+eSApCiAKLSNkZWZpbmUgR0VUX1Nob3J0SW5zKCkgXAotICAgICAgICAgIEdldFNob3J0SW5zKCBFWEVDX0FSRyApCi0KLSNkZWZpbmUgTk9STWFsaXplKCB4LCB5LCB2ICkgXAotICAgICAgICAgIE5vcm1hbGl6ZSggRVhFQ19BUkdfIHgsIHksIHYgKQotCi0jZGVmaW5lIFNFVF9TdXBlclJvdW5kKCBzY2FsZSwgZmxhZ3MgKSBcCi0gICAgICAgICAgU2V0U3VwZXJSb3VuZCggRVhFQ19BUkdfIHNjYWxlLCBmbGFncyApCi0KLSNkZWZpbmUgUk9VTkRfTm9uZSggZCwgYyApIFwKLSAgICAgICAgICBSb3VuZF9Ob25lKCBFWEVDX0FSR18gZCwgYyApCi0KLSNkZWZpbmUgSU5TX0dvdG9fQ29kZVJhbmdlKCByYW5nZSwgaXAgKSBcCi0gICAgICAgICAgSW5zX0dvdG9fQ29kZVJhbmdlKCBFWEVDX0FSR18gcmFuZ2UsIGlwICkKLQotI2RlZmluZSBDVVJfRnVuY19tb3ZlKCB6LCBwLCBkICkgXAotICAgICAgICAgIENVUi5mdW5jX21vdmUoIEVYRUNfQVJHXyB6LCBwLCBkICkKLQotI2RlZmluZSBDVVJfRnVuY19tb3ZlX29yaWcoIHosIHAsIGQgKSBcCi0gICAgICAgICAgQ1VSLmZ1bmNfbW92ZV9vcmlnKCBFWEVDX0FSR18geiwgcCwgZCApCi0KLSNkZWZpbmUgQ1VSX0Z1bmNfcm91bmQoIGQsIGMgKSBcCi0gICAgICAgICAgQ1VSLmZ1bmNfcm91bmQoIEVYRUNfQVJHXyBkLCBjICkKLQotI2RlZmluZSBDVVJfRnVuY19jdXJfcHBlbSgpIFwKLSAgICAgICAgICBDVVIuZnVuY19jdXJfcHBlbSggRVhFQ19BUkcgKQotCi0jZGVmaW5lIENVUl9GdW5jX3JlYWRfY3Z0KCBpbmRleCApIFwKLSAgICAgICAgICBDVVIuZnVuY19yZWFkX2N2dCggRVhFQ19BUkdfIGluZGV4ICkKLQotI2RlZmluZSBDVVJfRnVuY193cml0ZV9jdnQoIGluZGV4LCB2YWwgKSBcCi0gICAgICAgICAgQ1VSLmZ1bmNfd3JpdGVfY3Z0KCBFWEVDX0FSR18gaW5kZXgsIHZhbCApCi0KLSNkZWZpbmUgQ1VSX0Z1bmNfbW92ZV9jdnQoIGluZGV4LCB2YWwgKSBcCi0gICAgICAgICAgQ1VSLmZ1bmNfbW92ZV9jdnQoIEVYRUNfQVJHXyBpbmRleCwgdmFsICkKLQotI2RlZmluZSBDVVJSRU5UX1JhdGlvKCkgXAotICAgICAgICAgIEN1cnJlbnRfUmF0aW8oIEVYRUNfQVJHICkKLQotI2RlZmluZSBJTlNfU3hWVEwoIGEsIGIsIGMsIGQgKSBcCi0gICAgICAgICAgSW5zX1N4VlRMKCBFWEVDX0FSR18gYSwgYiwgYywgZCApCi0KLSNkZWZpbmUgQ09NUFVURV9GdW5jcygpIFwKLSAgICAgICAgICBDb21wdXRlX0Z1bmNzKCBFWEVDX0FSRyApCi0KLSNkZWZpbmUgQ09NUFVURV9Sb3VuZCggYSApIFwKLSAgICAgICAgICBDb21wdXRlX1JvdW5kKCBFWEVDX0FSR18gYSApCi0KLSNkZWZpbmUgQ09NUFVURV9Qb2ludF9EaXNwbGFjZW1lbnQoIGEsIGIsIGMsIGQgKSBcCi0gICAgICAgICAgQ29tcHV0ZV9Qb2ludF9EaXNwbGFjZW1lbnQoIEVYRUNfQVJHXyBhLCBiLCBjLCBkICkKLQotI2RlZmluZSBNT1ZFX1pwMl9Qb2ludCggYSwgYiwgYywgdCApIFwKLSAgICAgICAgICBNb3ZlX1pwMl9Qb2ludCggRVhFQ19BUkdfIGEsIGIsIGMsIHQgKQotCi0KLSNkZWZpbmUgQ1VSX0Z1bmNfcHJvamVjdCggdjEsIHYyICkgIFwKLSAgICAgICAgICBDVVIuZnVuY19wcm9qZWN0KCBFWEVDX0FSR18gKHYxKS0+eCAtICh2MiktPngsICh2MSktPnkgLSAodjIpLT55ICkKLQotI2RlZmluZSBDVVJfRnVuY19kdWFscHJvaiggdjEsIHYyICkgIFwKLSAgICAgICAgICBDVVIuZnVuY19kdWFscHJvaiggRVhFQ19BUkdfICh2MSktPnggLSAodjIpLT54LCAodjEpLT55IC0gKHYyKS0+eSApCi0KLSNkZWZpbmUgQ1VSX2Zhc3RfcHJvamVjdCggdiApIFwKLSAgICAgICAgICBDVVIuZnVuY19wcm9qZWN0KCBFWEVDX0FSR18gKHYpLT54LCAodiktPnkgKQotCi0jZGVmaW5lIENVUl9mYXN0X2R1YWxwcm9qKCB2ICkgXAotICAgICAgICAgIENVUi5mdW5jX2R1YWxwcm9qKCBFWEVDX0FSR18gKHYpLT54LCAodiktPnkgKQorI2RlZmluZSBGQVNUX0RVQUxQUk9KKCB2ICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBleGMtPmZ1bmNfZHVhbHByb2ooIGV4YywgKHYpLT54LCAodiktPnkgKQogCiAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiBJbnN0cnVjdGlvbiBkaXNwYXRjaCBmdW5jdGlvbiwgYXMgdXNlZCBieSB0aGUgaW50ZXJwcmV0ZXIuICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdm9pZCAgKCpUSW5zdHJ1Y3Rpb25fRnVuY3Rpb24pKCBJTlNfQVJHICk7CisgIHR5cGVkZWYgdm9pZCAgKCpUSW5zdHJ1Y3Rpb25fRnVuY3Rpb24pKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKTsKIAogCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjMwLDEzICs4Nyw2IEBACiAjZGVmaW5lIEJPVU5EUyggeCwgbiApICAgKCAoRlRfVUludCkoeCkgID49IChGVF9VSW50KShuKSAgKQogI2RlZmluZSBCT1VORFNMKCB4LCBuICkgICggKEZUX1VMb25nKSh4KSA+PSAoRlRfVUxvbmcpKG4pICkKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgbWFjcm8gY29tcHV0ZXMgKGEqMl4xNCkvYiBhbmQgY29tcGxlbWVudHMgVFRfTXVsRml4MTQuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVFRfRGl2Rml4MTQoIGEsIGIgKSBcCi0gICAgICAgICAgRlRfRGl2Rml4KCBhLCAoYikgPDwgMiApCi0KIAogI3VuZGVmICBTVUNDRVNTCiAjZGVmaW5lIFNVQ0NFU1MgIDAKQEAgLTI0NSwxNiArOTUsMjAgQEAKICNkZWZpbmUgRkFJTFVSRSAgMQogCiAjaWZkZWYgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcKLSNkZWZpbmUgR1VFU1NfVkVDVE9SKCBWICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKCBDVVIuZmFjZS0+dW5wYXRlbnRlZF9oaW50aW5nICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDVVIuR1MuVi54ID0gKEZUX0YyRG90MTQpKCBDVVIuR1MuYm90aF94X2F4aXMgPyAweDQwMDAgOiAwICk7IFwKLSAgICBDVVIuR1MuVi55ID0gKEZUX0YyRG90MTQpKCBDVVIuR1MuYm90aF94X2F4aXMgPyAwIDogMHg0MDAwICk7IFwKLSAgfQorI2RlZmluZSBHVUVTU19WRUNUT1IoIFYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggZXhjLT5mYWNlLT51bnBhdGVudGVkX2hpbnRpbmcgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBleGMtPkdTLlYueCA9IChGVF9GMkRvdDE0KSggZXhjLT5HUy5ib3RoX3hfYXhpcyA/IDB4NDAwMCA6IDAgKTsgXAorICAgICAgZXhjLT5HUy5WLnkgPSAoRlRfRjJEb3QxNCkoIGV4Yy0+R1MuYm90aF94X2F4aXMgPyAwIDogMHg0MDAwICk7IFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCiAjZWxzZQotI2RlZmluZSBHVUVTU19WRUNUT1IoIFYgKQorI2RlZmluZSBHVUVTU19WRUNUT1IoIFYgKSAgZG8geyB9IHdoaWxlICgwKQogI2VuZGlmCiAKKwogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgQ09ERVJBTkdFIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjk3LDcgKzE1MSw3IEBACiAgICAgLyogICAgICAgd2hpY2ggd2lsbCByZXR1cm4gdG8gdGhlIGZpcnN0IGJ5dGUgKmFmdGVyKiB0aGUgY29kZSAgICAqLwogICAgIC8qICAgICAgIHJhbmdlLCB3ZSB0ZXN0IGZvciBJUCA8PSBTaXplIGluc3RlYWQgb2YgSVAgPCBTaXplLiAgICAgKi8KICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfQVNTRVJUKCAoRlRfVUxvbmcpSVAgPD0gY29kZXJhbmdlLT5zaXplICk7CisgICAgRlRfQVNTRVJUKCBJUCA8PSBjb2RlcmFuZ2UtPnNpemUgKTsKIAogICAgIGV4ZWMtPmNvZGUgICAgID0gY29kZXJhbmdlLT5iYXNlOwogICAgIGV4ZWMtPmNvZGVTaXplID0gY29kZXJhbmdlLT5zaXplOwpAQCAtNDk4LDcgKzM1Miw3IEBACiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQogICBVcGRhdGVfTWF4KCBGVF9NZW1vcnkgIG1lbW9yeSwKICAgICAgICAgICAgICAgRlRfVUxvbmcqICBzaXplLAotICAgICAgICAgICAgICBGVF9Mb25nICAgIG11bHRpcGxpZXIsCisgICAgICAgICAgICAgIEZUX1VMb25nICAgbXVsdGlwbGllciwKICAgICAgICAgICAgICAgdm9pZCogICAgICBfcGJ1ZmYsCiAgICAgICAgICAgICAgIEZUX1VMb25nICAgbmV3X21heCApCiAgIHsKQEAgLTU5MSwxMyArNDQ1LDEzIEBACiAKICAgICAvKiBYWFg6IFdlIHJlc2VydmUgYSBsaXR0bGUgbW9yZSBlbGVtZW50cyBvbiB0aGUgc3RhY2sgdG8gZGVhbCBzYWZlbHkgKi8KICAgICAvKiAgICAgIHdpdGggYnJva2VuIGZvbnRzIGxpa2UgYXJpYWxicywgY291cmJzLCB0aW1lc2JzLCBldGMuICAgICAgICAgKi8KLSAgICB0bXAgPSBleGVjLT5zdGFja1NpemU7CisgICAgdG1wID0gKEZUX1VMb25nKWV4ZWMtPnN0YWNrU2l6ZTsKICAgICBlcnJvciA9IFVwZGF0ZV9NYXgoIGV4ZWMtPm1lbW9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXAsCiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCBGVF9GMjZEb3Q2ICksCiAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopJmV4ZWMtPnN0YWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgbWF4cC0+bWF4U3RhY2tFbGVtZW50cyArIDMyICk7Ci0gICAgZXhlYy0+c3RhY2tTaXplID0gKEZUX1VJbnQpdG1wOworICAgIGV4ZWMtPnN0YWNrU2l6ZSA9IChGVF9Mb25nKXRtcDsKICAgICBpZiAoIGVycm9yICkKICAgICAgIHJldHVybiBlcnJvcjsKIApAQCAtNjgzLDEyICs1MzcsOCBAQAogICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT25seSB0aGUgZ2x5cGggbG9hZGVyIGFuZCBkZWJ1Z2dlciBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVFRfUnVuX0NvbnRleHQoIFRUX0V4ZWNDb250ZXh0ICBleGVjLAotICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgIGRlYnVnICkKKyAgVFRfUnVuX0NvbnRleHQoIFRUX0V4ZWNDb250ZXh0ICBleGVjICkKICAgewogICAgIFRUX0dvdG9fQ29kZVJhbmdlKCBleGVjLCB0dF9jb2RlcmFuZ2VfZ2x5cGgsIDAgKTsKIApAQCAtNzE4LDE2ICs1NjgsNyBAQAogICAgIGV4ZWMtPnRvcCAgICAgPSAwOwogICAgIGV4ZWMtPmNhbGxUb3AgPSAwOwogCi0jaWYgMQotICAgIEZUX1VOVVNFRCggZGVidWcgKTsKLQogICAgIHJldHVybiBleGVjLT5mYWNlLT5pbnRlcnByZXRlciggZXhlYyApOwotI2Vsc2UKLSAgICBpZiAoICFkZWJ1ZyApCi0gICAgICByZXR1cm4gVFRfUnVuSW5zKCBleGVjICk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLSNlbmRpZgogICB9CiAKIApAQCAtNzYxLDYgKzYwMiw5IEBACiAgIFRUX05ld19Db250ZXh0KCBUVF9Ecml2ZXIgIGRyaXZlciApCiAgIHsKICAgICBGVF9NZW1vcnkgIG1lbW9yeTsKKyAgICBGVF9FcnJvciAgIGVycm9yOworCisgICAgVFRfRXhlY0NvbnRleHQgIGV4ZWMgPSBOVUxMOwogCiAKICAgICBpZiAoICFkcml2ZXIgKQpAQCAtNzY4LDI2ICs2MTIsMTYgQEAKIAogICAgIG1lbW9yeSA9IGRyaXZlci0+cm9vdC5yb290Lm1lbW9yeTsKIAotICAgIGlmICggIWRyaXZlci0+Y29udGV4dCApCi0gICAgewotICAgICAgRlRfRXJyb3IgICAgICAgIGVycm9yOwotICAgICAgVFRfRXhlY0NvbnRleHQgIGV4ZWM7CisgICAgLyogYWxsb2NhdGUgb2JqZWN0ICovCisgICAgaWYgKCBGVF9ORVcoIGV4ZWMgKSApCisgICAgICBnb3RvIEZhaWw7CiAKKyAgICAvKiBpbml0aWFsaXplIGl0OyBpbiBjYXNlIG9mIGVycm9yIHRoaXMgZGVhbGxvY2F0ZXMgYGV4ZWMnIHRvbyAqLworICAgIGVycm9yID0gSW5pdF9Db250ZXh0KCBleGVjLCBtZW1vcnkgKTsKKyAgICBpZiAoIGVycm9yICkKKyAgICAgIGdvdG8gRmFpbDsKIAotICAgICAgLyogYWxsb2NhdGUgb2JqZWN0ICovCi0gICAgICBpZiAoIEZUX05FVyggZXhlYyApICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAvKiBpbml0aWFsaXplIGl0OyBpbiBjYXNlIG9mIGVycm9yIHRoaXMgZGVhbGxvY2F0ZXMgYGV4ZWMnIHRvbyAqLwotICAgICAgZXJyb3IgPSBJbml0X0NvbnRleHQoIGV4ZWMsIG1lbW9yeSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgLyogc3RvcmUgaXQgaW50byB0aGUgZHJpdmVyICovCi0gICAgICBkcml2ZXItPmNvbnRleHQgPSBleGVjOwotICAgIH0KLQotICAgIHJldHVybiBkcml2ZXItPmNvbnRleHQ7CisgICAgcmV0dXJuIGV4ZWM7CiAKICAgRmFpbDoKICAgICByZXR1cm4gTlVMTDsKQEAgLTgzNCw4ICs2NjgsOCBAQAogICAgIC8qICBTRnZUTCArICAgKi8gIFBBQ0soIDIsIDAgKSwKICAgICAvKiAgU1B2RlMgICAgICovICBQQUNLKCAyLCAwICksCiAgICAgLyogIFNGdkZTICAgICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBHUFYgICAgICAgKi8gIFBBQ0soIDAsIDIgKSwKLSAgICAvKiAgR0ZWICAgICAgICovICBQQUNLKCAwLCAyICksCisgICAgLyogIEdQdiAgICAgICAqLyAgUEFDSyggMCwgMiApLAorICAgIC8qICBHRnYgICAgICAgKi8gIFBBQ0soIDAsIDIgKSwKICAgICAvKiAgU0Z2VFB2ICAgICovICBQQUNLKCAwLCAwICksCiAgICAgLyogIElTRUNUICAgICAqLyAgUEFDSyggNSwgMCApLAogCkBAIC05NjQsOCArNzk4LDggQEAKICAgICAvKiAgSU5TXyQ4MyAgICovICBQQUNLKCAwLCAwICksCiAgICAgLyogIElOU18kODQgICAqLyAgUEFDSyggMCwgMCApLAogICAgIC8qICBTY2FuQ1RSTCAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgU0RQVlRMWzBdICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIFNEUFZUTFsxXSAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBTRFB2VExbMF0gKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgU0RQdlRMWzFdICovICBQQUNLKCAyLCAwICksCiAgICAgLyogIEdldElORk8gICAqLyAgUEFDSyggMSwgMSApLAogICAgIC8qICBJREVGICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKICAgICAvKiAgUk9MTCAgICAgICovICBQQUNLKCAzLCAzICksCkBAIC0xMDk4LDI4MCArOTMyLDI4NCBAQAogCiAjaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKIAorICAvKiB0aGUgZmlyc3QgaGV4IGRpZ2l0IGdpdmVzIHRoZSBsZW5ndGggb2YgdGhlIG9wY29kZSBuYW1lOyB0aGUgc3BhY2UgKi8KKyAgLyogYWZ0ZXIgdGhlIGRpZ2l0IGlzIGhlcmUganVzdCB0byBpbmNyZWFzZSByZWFkYWJpbGl0eSBvZiB0aGUgc291cmNlICovCisgIC8qIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCiAgIHN0YXRpYwogICBjb25zdCBjaGFyKiAgY29uc3Qgb3Bjb2RlX25hbWVbMjU2XSA9CiAgIHsKLSAgICAiU1ZUQ0EgeSIsCi0gICAgIlNWVENBIHgiLAotICAgICJTUHZUQ0EgeSIsCi0gICAgIlNQdlRDQSB4IiwKLSAgICAiU0Z2VENBIHkiLAotICAgICJTRnZUQ0EgeCIsCi0gICAgIlNQdlRMIHx8IiwKLSAgICAiU1B2VEwgKyIsCi0gICAgIlNGdlRMIHx8IiwKLSAgICAiU0Z2VEwgKyIsCi0gICAgIlNQdkZTIiwKLSAgICAiU0Z2RlMiLAotICAgICJHUFYiLAotICAgICJHRlYiLAotICAgICJTRnZUUHYiLAotICAgICJJU0VDVCIsCisgICAgIjcgU1ZUQ0EgeSIsCisgICAgIjcgU1ZUQ0EgeCIsCisgICAgIjggU1B2VENBIHkiLAorICAgICI4IFNQdlRDQSB4IiwKKyAgICAiOCBTRnZUQ0EgeSIsCisgICAgIjggU0Z2VENBIHgiLAorICAgICI4IFNQdlRMIHx8IiwKKyAgICAiNyBTUHZUTCArIiwKKyAgICAiOCBTRnZUTCB8fCIsCisgICAgIjcgU0Z2VEwgKyIsCisgICAgIjUgU1B2RlMiLAorICAgICI1IFNGdkZTIiwKKyAgICAiMyBHUHYiLAorICAgICIzIEdGdiIsCisgICAgIjYgU0Z2VFB2IiwKKyAgICAiNSBJU0VDVCIsCiAKLSAgICAiU1JQMCIsCi0gICAgIlNSUDEiLAotICAgICJTUlAyIiwKLSAgICAiU1pQMCIsCi0gICAgIlNaUDEiLAotICAgICJTWlAyIiwKLSAgICAiU1pQUyIsCi0gICAgIlNMT09QIiwKLSAgICAiUlRHIiwKLSAgICAiUlRIRyIsCi0gICAgIlNNRCIsCi0gICAgIkVMU0UiLAotICAgICJKTVBSIiwKLSAgICAiU0N2VENpIiwKLSAgICAiU1N3Q2kiLAotICAgICJTU1ciLAorICAgICI0IFNSUDAiLAorICAgICI0IFNSUDEiLAorICAgICI0IFNSUDIiLAorICAgICI0IFNaUDAiLAorICAgICI0IFNaUDEiLAorICAgICI0IFNaUDIiLAorICAgICI0IFNaUFMiLAorICAgICI1IFNMT09QIiwKKyAgICAiMyBSVEciLAorICAgICI0IFJUSEciLAorICAgICIzIFNNRCIsCisgICAgIjQgRUxTRSIsCisgICAgIjQgSk1QUiIsCisgICAgIjYgU0N2VENpIiwKKyAgICAiNSBTU3dDaSIsCisgICAgIjMgU1NXIiwKIAotICAgICJEVVAiLAotICAgICJQT1AiLAotICAgICJDTEVBUiIsCi0gICAgIlNXQVAiLAotICAgICJERVBUSCIsCi0gICAgIkNJTkRFWCIsCi0gICAgIk1JTkRFWCIsCi0gICAgIkFsaWduUFRTIiwKLSAgICAiSU5TXyQyOCIsCi0gICAgIlVUUCIsCi0gICAgIkxPT1BDQUxMIiwKLSAgICAiQ0FMTCIsCi0gICAgIkZERUYiLAotICAgICJFTkRGIiwKLSAgICAiTURBUFswXSIsCi0gICAgIk1EQVBbMV0iLAorICAgICIzIERVUCIsCisgICAgIjMgUE9QIiwKKyAgICAiNSBDTEVBUiIsCisgICAgIjQgU1dBUCIsCisgICAgIjUgREVQVEgiLAorICAgICI2IENJTkRFWCIsCisgICAgIjYgTUlOREVYIiwKKyAgICAiOCBBbGlnblBUUyIsCisgICAgIjcgSU5TXyQyOCIsCisgICAgIjMgVVRQIiwKKyAgICAiOCBMT09QQ0FMTCIsCisgICAgIjQgQ0FMTCIsCisgICAgIjQgRkRFRiIsCisgICAgIjQgRU5ERiIsCisgICAgIjcgTURBUFswXSIsCisgICAgIjcgTURBUFsxXSIsCiAKLSAgICAiSVVQWzBdIiwKLSAgICAiSVVQWzFdIiwKLSAgICAiU0hQWzBdIiwKLSAgICAiU0hQWzFdIiwKLSAgICAiU0hDWzBdIiwKLSAgICAiU0hDWzFdIiwKLSAgICAiU0haWzBdIiwKLSAgICAiU0haWzFdIiwKLSAgICAiU0hQSVgiLAotICAgICJJUCIsCi0gICAgIk1TSVJQWzBdIiwKLSAgICAiTVNJUlBbMV0iLAotICAgICJBbGlnblJQIiwKLSAgICAiUlRERyIsCi0gICAgIk1JQVBbMF0iLAotICAgICJNSUFQWzFdIiwKKyAgICAiNiBJVVBbMF0iLAorICAgICI2IElVUFsxXSIsCisgICAgIjYgU0hQWzBdIiwKKyAgICAiNiBTSFBbMV0iLAorICAgICI2IFNIQ1swXSIsCisgICAgIjYgU0hDWzFdIiwKKyAgICAiNiBTSFpbMF0iLAorICAgICI2IFNIWlsxXSIsCisgICAgIjUgU0hQSVgiLAorICAgICIyIElQIiwKKyAgICAiOCBNU0lSUFswXSIsCisgICAgIjggTVNJUlBbMV0iLAorICAgICI3IEFsaWduUlAiLAorICAgICI0IFJUREciLAorICAgICI3IE1JQVBbMF0iLAorICAgICI3IE1JQVBbMV0iLAogCi0gICAgIk5QdXNoQiIsCi0gICAgIk5QdXNoVyIsCi0gICAgIldTIiwKLSAgICAiUlMiLAotICAgICJXQ3Z0UCIsCi0gICAgIlJDdnQiLAotICAgICJHQ1swXSIsCi0gICAgIkdDWzFdIiwKLSAgICAiU0NGUyIsCi0gICAgIk1EWzBdIiwKLSAgICAiTURbMV0iLAotICAgICJNUFBFTSIsCi0gICAgIk1QUyIsCi0gICAgIkZsaXBPTiIsCi0gICAgIkZsaXBPRkYiLAotICAgICJERUJVRyIsCisgICAgIjYgTlB1c2hCIiwKKyAgICAiNiBOUHVzaFciLAorICAgICIyIFdTIiwKKyAgICAiMiBSUyIsCisgICAgIjUgV0N2dFAiLAorICAgICI0IFJDdnQiLAorICAgICI1IEdDWzBdIiwKKyAgICAiNSBHQ1sxXSIsCisgICAgIjQgU0NGUyIsCisgICAgIjUgTURbMF0iLAorICAgICI1IE1EWzFdIiwKKyAgICAiNSBNUFBFTSIsCisgICAgIjMgTVBTIiwKKyAgICAiNiBGbGlwT04iLAorICAgICI3IEZsaXBPRkYiLAorICAgICI1IERFQlVHIiwKIAotICAgICJMVCIsCi0gICAgIkxURVEiLAotICAgICJHVCIsCi0gICAgIkdURVEiLAotICAgICJFUSIsCi0gICAgIk5FUSIsCi0gICAgIk9ERCIsCi0gICAgIkVWRU4iLAotICAgICJJRiIsCi0gICAgIkVJRiIsCi0gICAgIkFORCIsCi0gICAgIk9SIiwKLSAgICAiTk9UIiwKLSAgICAiRGVsdGFQMSIsCi0gICAgIlNEQiIsCi0gICAgIlNEUyIsCisgICAgIjIgTFQiLAorICAgICI0IExURVEiLAorICAgICIyIEdUIiwKKyAgICAiNCBHVEVRIiwKKyAgICAiMiBFUSIsCisgICAgIjMgTkVRIiwKKyAgICAiMyBPREQiLAorICAgICI0IEVWRU4iLAorICAgICIyIElGIiwKKyAgICAiMyBFSUYiLAorICAgICIzIEFORCIsCisgICAgIjIgT1IiLAorICAgICIzIE5PVCIsCisgICAgIjcgRGVsdGFQMSIsCisgICAgIjMgU0RCIiwKKyAgICAiMyBTRFMiLAogCi0gICAgIkFERCIsCi0gICAgIlNVQiIsCi0gICAgIkRJViIsCi0gICAgIk1VTCIsCi0gICAgIkFCUyIsCi0gICAgIk5FRyIsCi0gICAgIkZMT09SIiwKLSAgICAiQ0VJTElORyIsCi0gICAgIlJPVU5EWzBdIiwKLSAgICAiUk9VTkRbMV0iLAotICAgICJST1VORFsyXSIsCi0gICAgIlJPVU5EWzNdIiwKLSAgICAiTlJPVU5EWzBdIiwKLSAgICAiTlJPVU5EWzFdIiwKLSAgICAiTlJPVU5EWzJdIiwKLSAgICAiTlJPVU5EWzNdIiwKKyAgICAiMyBBREQiLAorICAgICIzIFNVQiIsCisgICAgIjMgRElWIiwKKyAgICAiMyBNVUwiLAorICAgICIzIEFCUyIsCisgICAgIjMgTkVHIiwKKyAgICAiNSBGTE9PUiIsCisgICAgIjcgQ0VJTElORyIsCisgICAgIjggUk9VTkRbMF0iLAorICAgICI4IFJPVU5EWzFdIiwKKyAgICAiOCBST1VORFsyXSIsCisgICAgIjggUk9VTkRbM10iLAorICAgICI5IE5ST1VORFswXSIsCisgICAgIjkgTlJPVU5EWzFdIiwKKyAgICAiOSBOUk9VTkRbMl0iLAorICAgICI5IE5ST1VORFszXSIsCiAKLSAgICAiV0N2dEYiLAotICAgICJEZWx0YVAyIiwKLSAgICAiRGVsdGFQMyIsCi0gICAgIkRlbHRhQ25bMF0iLAotICAgICJEZWx0YUNuWzFdIiwKLSAgICAiRGVsdGFDblsyXSIsCi0gICAgIlNST1VORCIsCi0gICAgIlM0NVJvdW5kIiwKLSAgICAiSlJPVCIsCi0gICAgIkpST0YiLAotICAgICJST0ZGIiwKLSAgICAiSU5TXyQ3QiIsCi0gICAgIlJVVEciLAotICAgICJSRFRHIiwKLSAgICAiU0FOR1ciLAotICAgICJBQSIsCisgICAgIjUgV0N2dEYiLAorICAgICI3IERlbHRhUDIiLAorICAgICI3IERlbHRhUDMiLAorICAgICJBIERlbHRhQ25bMF0iLAorICAgICJBIERlbHRhQ25bMV0iLAorICAgICJBIERlbHRhQ25bMl0iLAorICAgICI2IFNST1VORCIsCisgICAgIjggUzQ1Um91bmQiLAorICAgICI0IEpST1QiLAorICAgICI0IEpST0YiLAorICAgICI0IFJPRkYiLAorICAgICI3IElOU18kN0IiLAorICAgICI0IFJVVEciLAorICAgICI0IFJEVEciLAorICAgICI1IFNBTkdXIiwKKyAgICAiMiBBQSIsCiAKLSAgICAiRmxpcFBUIiwKLSAgICAiRmxpcFJnT04iLAotICAgICJGbGlwUmdPRkYiLAotICAgICJJTlNfJDgzIiwKLSAgICAiSU5TXyQ4NCIsCi0gICAgIlNjYW5DVFJMIiwKLSAgICAiU0RWUFRMWzBdIiwKLSAgICAiU0RWUFRMWzFdIiwKLSAgICAiR2V0SU5GTyIsCi0gICAgIklERUYiLAotICAgICJST0xMIiwKLSAgICAiTUFYIiwKLSAgICAiTUlOIiwKLSAgICAiU2NhblRZUEUiLAotICAgICJJbnN0Q1RSTCIsCi0gICAgIklOU18kOEYiLAorICAgICI2IEZsaXBQVCIsCisgICAgIjggRmxpcFJnT04iLAorICAgICI5IEZsaXBSZ09GRiIsCisgICAgIjcgSU5TXyQ4MyIsCisgICAgIjcgSU5TXyQ4NCIsCisgICAgIjggU2NhbkNUUkwiLAorICAgICI5IFNEUHZUTFswXSIsCisgICAgIjkgU0RQdlRMWzFdIiwKKyAgICAiNyBHZXRJTkZPIiwKKyAgICAiNCBJREVGIiwKKyAgICAiNCBST0xMIiwKKyAgICAiMyBNQVgiLAorICAgICIzIE1JTiIsCisgICAgIjggU2NhblRZUEUiLAorICAgICI4IEluc3RDVFJMIiwKKyAgICAiNyBJTlNfJDhGIiwKIAotICAgICJJTlNfJDkwIiwKLSAgICAiSU5TXyQ5MSIsCi0gICAgIklOU18kOTIiLAotICAgICJJTlNfJDkzIiwKLSAgICAiSU5TXyQ5NCIsCi0gICAgIklOU18kOTUiLAotICAgICJJTlNfJDk2IiwKLSAgICAiSU5TXyQ5NyIsCi0gICAgIklOU18kOTgiLAotICAgICJJTlNfJDk5IiwKLSAgICAiSU5TXyQ5QSIsCi0gICAgIklOU18kOUIiLAotICAgICJJTlNfJDlDIiwKLSAgICAiSU5TXyQ5RCIsCi0gICAgIklOU18kOUUiLAotICAgICJJTlNfJDlGIiwKKyAgICAiNyBJTlNfJDkwIiwKKyAgICAiNyBJTlNfJDkxIiwKKyAgICAiNyBJTlNfJDkyIiwKKyAgICAiNyBJTlNfJDkzIiwKKyAgICAiNyBJTlNfJDk0IiwKKyAgICAiNyBJTlNfJDk1IiwKKyAgICAiNyBJTlNfJDk2IiwKKyAgICAiNyBJTlNfJDk3IiwKKyAgICAiNyBJTlNfJDk4IiwKKyAgICAiNyBJTlNfJDk5IiwKKyAgICAiNyBJTlNfJDlBIiwKKyAgICAiNyBJTlNfJDlCIiwKKyAgICAiNyBJTlNfJDlDIiwKKyAgICAiNyBJTlNfJDlEIiwKKyAgICAiNyBJTlNfJDlFIiwKKyAgICAiNyBJTlNfJDlGIiwKIAotICAgICJJTlNfJEEwIiwKLSAgICAiSU5TXyRBMSIsCi0gICAgIklOU18kQTIiLAotICAgICJJTlNfJEEzIiwKLSAgICAiSU5TXyRBNCIsCi0gICAgIklOU18kQTUiLAotICAgICJJTlNfJEE2IiwKLSAgICAiSU5TXyRBNyIsCi0gICAgIklOU18kQTgiLAotICAgICJJTlNfJEE5IiwKLSAgICAiSU5TXyRBQSIsCi0gICAgIklOU18kQUIiLAotICAgICJJTlNfJEFDIiwKLSAgICAiSU5TXyRBRCIsCi0gICAgIklOU18kQUUiLAotICAgICJJTlNfJEFGIiwKKyAgICAiNyBJTlNfJEEwIiwKKyAgICAiNyBJTlNfJEExIiwKKyAgICAiNyBJTlNfJEEyIiwKKyAgICAiNyBJTlNfJEEzIiwKKyAgICAiNyBJTlNfJEE0IiwKKyAgICAiNyBJTlNfJEE1IiwKKyAgICAiNyBJTlNfJEE2IiwKKyAgICAiNyBJTlNfJEE3IiwKKyAgICAiNyBJTlNfJEE4IiwKKyAgICAiNyBJTlNfJEE5IiwKKyAgICAiNyBJTlNfJEFBIiwKKyAgICAiNyBJTlNfJEFCIiwKKyAgICAiNyBJTlNfJEFDIiwKKyAgICAiNyBJTlNfJEFEIiwKKyAgICAiNyBJTlNfJEFFIiwKKyAgICAiNyBJTlNfJEFGIiwKIAotICAgICJQdXNoQlswXSIsCi0gICAgIlB1c2hCWzFdIiwKLSAgICAiUHVzaEJbMl0iLAotICAgICJQdXNoQlszXSIsCi0gICAgIlB1c2hCWzRdIiwKLSAgICAiUHVzaEJbNV0iLAotICAgICJQdXNoQls2XSIsCi0gICAgIlB1c2hCWzddIiwKLSAgICAiUHVzaFdbMF0iLAotICAgICJQdXNoV1sxXSIsCi0gICAgIlB1c2hXWzJdIiwKLSAgICAiUHVzaFdbM10iLAotICAgICJQdXNoV1s0XSIsCi0gICAgIlB1c2hXWzVdIiwKLSAgICAiUHVzaFdbNl0iLAotICAgICJQdXNoV1s3XSIsCisgICAgIjggUHVzaEJbMF0iLAorICAgICI4IFB1c2hCWzFdIiwKKyAgICAiOCBQdXNoQlsyXSIsCisgICAgIjggUHVzaEJbM10iLAorICAgICI4IFB1c2hCWzRdIiwKKyAgICAiOCBQdXNoQls1XSIsCisgICAgIjggUHVzaEJbNl0iLAorICAgICI4IFB1c2hCWzddIiwKKyAgICAiOCBQdXNoV1swXSIsCisgICAgIjggUHVzaFdbMV0iLAorICAgICI4IFB1c2hXWzJdIiwKKyAgICAiOCBQdXNoV1szXSIsCisgICAgIjggUHVzaFdbNF0iLAorICAgICI4IFB1c2hXWzVdIiwKKyAgICAiOCBQdXNoV1s2XSIsCisgICAgIjggUHVzaFdbN10iLAogCi0gICAgIk1EUlBbMDBdIiwKLSAgICAiTURSUFswMV0iLAotICAgICJNRFJQWzAyXSIsCi0gICAgIk1EUlBbMDNdIiwKLSAgICAiTURSUFswNF0iLAotICAgICJNRFJQWzA1XSIsCi0gICAgIk1EUlBbMDZdIiwKLSAgICAiTURSUFswN10iLAotICAgICJNRFJQWzA4XSIsCi0gICAgIk1EUlBbMDldIiwKLSAgICAiTURSUFsxMF0iLAotICAgICJNRFJQWzExXSIsCi0gICAgIk1EUlBbMTJdIiwKLSAgICAiTURSUFsxM10iLAotICAgICJNRFJQWzE0XSIsCi0gICAgIk1EUlBbMTVdIiwKKyAgICAiOCBNRFJQWzAwXSIsCisgICAgIjggTURSUFswMV0iLAorICAgICI4IE1EUlBbMDJdIiwKKyAgICAiOCBNRFJQWzAzXSIsCisgICAgIjggTURSUFswNF0iLAorICAgICI4IE1EUlBbMDVdIiwKKyAgICAiOCBNRFJQWzA2XSIsCisgICAgIjggTURSUFswN10iLAorICAgICI4IE1EUlBbMDhdIiwKKyAgICAiOCBNRFJQWzA5XSIsCisgICAgIjggTURSUFsxMF0iLAorICAgICI4IE1EUlBbMTFdIiwKKyAgICAiOCBNRFJQWzEyXSIsCisgICAgIjggTURSUFsxM10iLAorICAgICI4IE1EUlBbMTRdIiwKKyAgICAiOCBNRFJQWzE1XSIsCiAKLSAgICAiTURSUFsxNl0iLAotICAgICJNRFJQWzE3XSIsCi0gICAgIk1EUlBbMThdIiwKLSAgICAiTURSUFsxOV0iLAotICAgICJNRFJQWzIwXSIsCi0gICAgIk1EUlBbMjFdIiwKLSAgICAiTURSUFsyMl0iLAotICAgICJNRFJQWzIzXSIsCi0gICAgIk1EUlBbMjRdIiwKLSAgICAiTURSUFsyNV0iLAotICAgICJNRFJQWzI2XSIsCi0gICAgIk1EUlBbMjddIiwKLSAgICAiTURSUFsyOF0iLAotICAgICJNRFJQWzI5XSIsCi0gICAgIk1EUlBbMzBdIiwKLSAgICAiTURSUFszMV0iLAorICAgICI4IE1EUlBbMTZdIiwKKyAgICAiOCBNRFJQWzE3XSIsCisgICAgIjggTURSUFsxOF0iLAorICAgICI4IE1EUlBbMTldIiwKKyAgICAiOCBNRFJQWzIwXSIsCisgICAgIjggTURSUFsyMV0iLAorICAgICI4IE1EUlBbMjJdIiwKKyAgICAiOCBNRFJQWzIzXSIsCisgICAgIjggTURSUFsyNF0iLAorICAgICI4IE1EUlBbMjVdIiwKKyAgICAiOCBNRFJQWzI2XSIsCisgICAgIjggTURSUFsyN10iLAorICAgICI4IE1EUlBbMjhdIiwKKyAgICAiOCBNRFJQWzI5XSIsCisgICAgIjggTURSUFszMF0iLAorICAgICI4IE1EUlBbMzFdIiwKIAotICAgICJNSVJQWzAwXSIsCi0gICAgIk1JUlBbMDFdIiwKLSAgICAiTUlSUFswMl0iLAotICAgICJNSVJQWzAzXSIsCi0gICAgIk1JUlBbMDRdIiwKLSAgICAiTUlSUFswNV0iLAotICAgICJNSVJQWzA2XSIsCi0gICAgIk1JUlBbMDddIiwKLSAgICAiTUlSUFswOF0iLAotICAgICJNSVJQWzA5XSIsCi0gICAgIk1JUlBbMTBdIiwKLSAgICAiTUlSUFsxMV0iLAotICAgICJNSVJQWzEyXSIsCi0gICAgIk1JUlBbMTNdIiwKLSAgICAiTUlSUFsxNF0iLAotICAgICJNSVJQWzE1XSIsCisgICAgIjggTUlSUFswMF0iLAorICAgICI4IE1JUlBbMDFdIiwKKyAgICAiOCBNSVJQWzAyXSIsCisgICAgIjggTUlSUFswM10iLAorICAgICI4IE1JUlBbMDRdIiwKKyAgICAiOCBNSVJQWzA1XSIsCisgICAgIjggTUlSUFswNl0iLAorICAgICI4IE1JUlBbMDddIiwKKyAgICAiOCBNSVJQWzA4XSIsCisgICAgIjggTUlSUFswOV0iLAorICAgICI4IE1JUlBbMTBdIiwKKyAgICAiOCBNSVJQWzExXSIsCisgICAgIjggTUlSUFsxMl0iLAorICAgICI4IE1JUlBbMTNdIiwKKyAgICAiOCBNSVJQWzE0XSIsCisgICAgIjggTUlSUFsxNV0iLAogCi0gICAgIk1JUlBbMTZdIiwKLSAgICAiTUlSUFsxN10iLAotICAgICJNSVJQWzE4XSIsCi0gICAgIk1JUlBbMTldIiwKLSAgICAiTUlSUFsyMF0iLAotICAgICJNSVJQWzIxXSIsCi0gICAgIk1JUlBbMjJdIiwKLSAgICAiTUlSUFsyM10iLAotICAgICJNSVJQWzI0XSIsCi0gICAgIk1JUlBbMjVdIiwKLSAgICAiTUlSUFsyNl0iLAotICAgICJNSVJQWzI3XSIsCi0gICAgIk1JUlBbMjhdIiwKLSAgICAiTUlSUFsyOV0iLAotICAgICJNSVJQWzMwXSIsCi0gICAgIk1JUlBbMzFdIgorICAgICI4IE1JUlBbMTZdIiwKKyAgICAiOCBNSVJQWzE3XSIsCisgICAgIjggTUlSUFsxOF0iLAorICAgICI4IE1JUlBbMTldIiwKKyAgICAiOCBNSVJQWzIwXSIsCisgICAgIjggTUlSUFsyMV0iLAorICAgICI4IE1JUlBbMjJdIiwKKyAgICAiOCBNSVJQWzIzXSIsCisgICAgIjggTUlSUFsyNF0iLAorICAgICI4IE1JUlBbMjVdIiwKKyAgICAiOCBNSVJQWzI2XSIsCisgICAgIjggTUlSUFsyN10iLAorICAgICI4IE1JUlBbMjhdIiwKKyAgICAiOCBNSVJQWzI5XSIsCisgICAgIjggTUlSUFszMF0iLAorICAgICI4IE1JUlBbMzFdIgogICB9OwogCiAjZW5kaWYgLyogRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KQEAgLTE2MzcsNTUgKzE0NzUsNTUgQEAKICAgLyogICAgVGhlIGFzcGVjdCByYXRpbyBpbiAxNi4xNiBmb3JtYXQsIGFsd2F5cyA8PSAxLjAgLiAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgRlRfTG9uZwotICBDdXJyZW50X1JhdGlvKCBFWEVDX09QICkKKyAgQ3VycmVudF9SYXRpbyggVFRfRXhlY0NvbnRleHQgIGV4YyApCiAgIHsKLSAgICBpZiAoICFDVVIudHRfbWV0cmljcy5yYXRpbyApCisgICAgaWYgKCAhZXhjLT50dF9tZXRyaWNzLnJhdGlvICkKICAgICB7CiAjaWZkZWYgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcKLSAgICAgIGlmICggQ1VSLmZhY2UtPnVucGF0ZW50ZWRfaGludGluZyApCisgICAgICBpZiAoIGV4Yy0+ZmFjZS0+dW5wYXRlbnRlZF9oaW50aW5nICkKICAgICAgIHsKLSAgICAgICAgaWYgKCBDVVIuR1MuYm90aF94X2F4aXMgKQotICAgICAgICAgIENVUi50dF9tZXRyaWNzLnJhdGlvID0gQ1VSLnR0X21ldHJpY3MueF9yYXRpbzsKKyAgICAgICAgaWYgKCBleGMtPkdTLmJvdGhfeF9heGlzICkKKyAgICAgICAgICBleGMtPnR0X21ldHJpY3MucmF0aW8gPSBleGMtPnR0X21ldHJpY3MueF9yYXRpbzsKICAgICAgICAgZWxzZQotICAgICAgICAgIENVUi50dF9tZXRyaWNzLnJhdGlvID0gQ1VSLnR0X21ldHJpY3MueV9yYXRpbzsKKyAgICAgICAgICBleGMtPnR0X21ldHJpY3MucmF0aW8gPSBleGMtPnR0X21ldHJpY3MueV9yYXRpbzsKICAgICAgIH0KICAgICAgIGVsc2UKICNlbmRpZgogICAgICAgewotICAgICAgICBpZiAoIENVUi5HUy5wcm9qVmVjdG9yLnkgPT0gMCApCi0gICAgICAgICAgQ1VSLnR0X21ldHJpY3MucmF0aW8gPSBDVVIudHRfbWV0cmljcy54X3JhdGlvOworICAgICAgICBpZiAoIGV4Yy0+R1MucHJvalZlY3Rvci55ID09IDAgKQorICAgICAgICAgIGV4Yy0+dHRfbWV0cmljcy5yYXRpbyA9IGV4Yy0+dHRfbWV0cmljcy54X3JhdGlvOwogCi0gICAgICAgIGVsc2UgaWYgKCBDVVIuR1MucHJvalZlY3Rvci54ID09IDAgKQotICAgICAgICAgIENVUi50dF9tZXRyaWNzLnJhdGlvID0gQ1VSLnR0X21ldHJpY3MueV9yYXRpbzsKKyAgICAgICAgZWxzZSBpZiAoIGV4Yy0+R1MucHJvalZlY3Rvci54ID09IDAgKQorICAgICAgICAgIGV4Yy0+dHRfbWV0cmljcy5yYXRpbyA9IGV4Yy0+dHRfbWV0cmljcy55X3JhdGlvOwogCiAgICAgICAgIGVsc2UKICAgICAgICAgewogICAgICAgICAgIEZUX0YyNkRvdDYgIHgsIHk7CiAKIAotICAgICAgICAgIHggPSBUVF9NdWxGaXgxNCggQ1VSLnR0X21ldHJpY3MueF9yYXRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi5HUy5wcm9qVmVjdG9yLnggKTsKLSAgICAgICAgICB5ID0gVFRfTXVsRml4MTQoIENVUi50dF9tZXRyaWNzLnlfcmF0aW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIuR1MucHJvalZlY3Rvci55ICk7Ci0gICAgICAgICAgQ1VSLnR0X21ldHJpY3MucmF0aW8gPSBGVF9IeXBvdCggeCwgeSApOworICAgICAgICAgIHggPSBUVF9NdWxGaXgxNCggZXhjLT50dF9tZXRyaWNzLnhfcmF0aW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLnByb2pWZWN0b3IueCApOworICAgICAgICAgIHkgPSBUVF9NdWxGaXgxNCggZXhjLT50dF9tZXRyaWNzLnlfcmF0aW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLnByb2pWZWN0b3IueSApOworICAgICAgICAgIGV4Yy0+dHRfbWV0cmljcy5yYXRpbyA9IEZUX0h5cG90KCB4LCB5ICk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIENVUi50dF9tZXRyaWNzLnJhdGlvOworICAgIHJldHVybiBleGMtPnR0X21ldHJpY3MucmF0aW87CiAgIH0KIAogCiAgIEZUX0NBTExCQUNLX0RFRiggRlRfTG9uZyApCi0gIEN1cnJlbnRfUHBlbSggRVhFQ19PUCApCisgIEN1cnJlbnRfUHBlbSggVFRfRXhlY0NvbnRleHQgIGV4YyApCiAgIHsKLSAgICByZXR1cm4gQ1VSLnR0X21ldHJpY3MucHBlbTsKKyAgICByZXR1cm4gZXhjLT50dF9tZXRyaWNzLnBwZW07CiAgIH0KIAogCiAgIEZUX0NBTExCQUNLX0RFRiggRlRfTG9uZyApCi0gIEN1cnJlbnRfUHBlbV9TdHJldGNoZWQoIEVYRUNfT1AgKQorICBDdXJyZW50X1BwZW1fU3RyZXRjaGVkKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKICAgewotICAgIHJldHVybiBGVF9NdWxGaXgoIENVUi50dF9tZXRyaWNzLnBwZW0sIENVUlJFTlRfUmF0aW8oKSApOworICAgIHJldHVybiBGVF9NdWxGaXgoIGV4Yy0+dHRfbWV0cmljcy5wcGVtLCBDdXJyZW50X1JhdGlvKCBleGMgKSApOwogICB9CiAKIApAQCAtMTY5Nyw0OCArMTUzNSw1NCBAQAogCiAKICAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9GMjZEb3Q2ICkKLSAgUmVhZF9DVlQoIEVYRUNfT1BfIEZUX1VMb25nICBpZHggKQorICBSZWFkX0NWVCggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgIEZUX1VMb25nICAgICAgICBpZHggKQogICB7Ci0gICAgcmV0dXJuIENVUi5jdnRbaWR4XTsKKyAgICByZXR1cm4gZXhjLT5jdnRbaWR4XTsKICAgfQogCiAKICAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9GMjZEb3Q2ICkKLSAgUmVhZF9DVlRfU3RyZXRjaGVkKCBFWEVDX09QXyBGVF9VTG9uZyAgaWR4ICkKKyAgUmVhZF9DVlRfU3RyZXRjaGVkKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICBpZHggKQogICB7Ci0gICAgcmV0dXJuIEZUX011bEZpeCggQ1VSLmN2dFtpZHhdLCBDVVJSRU5UX1JhdGlvKCkgKTsKKyAgICByZXR1cm4gRlRfTXVsRml4KCBleGMtPmN2dFtpZHhdLCBDdXJyZW50X1JhdGlvKCBleGMgKSApOwogICB9CiAKIAogICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICBXcml0ZV9DVlQoIEVYRUNfT1BfIEZUX1VMb25nICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICB2YWx1ZSApCisgIFdyaXRlX0NWVCggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgaWR4LAorICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICB2YWx1ZSApCiAgIHsKLSAgICBDVVIuY3Z0W2lkeF0gPSB2YWx1ZTsKKyAgICBleGMtPmN2dFtpZHhdID0gdmFsdWU7CiAgIH0KIAogCiAgIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIFdyaXRlX0NWVF9TdHJldGNoZWQoIEVYRUNfT1BfIEZUX1VMb25nICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgdmFsdWUgKQorICBXcml0ZV9DVlRfU3RyZXRjaGVkKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgaWR4LAorICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgdmFsdWUgKQogICB7Ci0gICAgQ1VSLmN2dFtpZHhdID0gRlRfRGl2Rml4KCB2YWx1ZSwgQ1VSUkVOVF9SYXRpbygpICk7CisgICAgZXhjLT5jdnRbaWR4XSA9IEZUX0RpdkZpeCggdmFsdWUsIEN1cnJlbnRfUmF0aW8oIGV4YyApICk7CiAgIH0KIAogCiAgIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIE1vdmVfQ1ZUKCBFWEVDX09QXyBGVF9VTG9uZyAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICB2YWx1ZSApCisgIE1vdmVfQ1ZUKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgIGlkeCwKKyAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICB2YWx1ZSApCiAgIHsKLSAgICBDVVIuY3Z0W2lkeF0gKz0gdmFsdWU7CisgICAgZXhjLT5jdnRbaWR4XSArPSB2YWx1ZTsKICAgfQogCiAKICAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKLSAgTW92ZV9DVlRfU3RyZXRjaGVkKCBFWEVDX09QXyBGVF9VTG9uZyAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgdmFsdWUgKQorICBNb3ZlX0NWVF9TdHJldGNoZWQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgIGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgdmFsdWUgKQogICB7Ci0gICAgQ1VSLmN2dFtpZHhdICs9IEZUX0RpdkZpeCggdmFsdWUsIENVUlJFTlRfUmF0aW8oKSApOworICAgIGV4Yy0+Y3Z0W2lkeF0gKz0gRlRfRGl2Rml4KCB2YWx1ZSwgQ3VycmVudF9SYXRpbyggZXhjICkgKTsKICAgfQogCiAKQEAgLTE3NTgsMTIgKzE2MDIsMTIgQEAKICAgLyogICAgVGhpcyBvbmUgY291bGQgYmVjb21lIGEgbWFjcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgRlRfU2hvcnQKLSAgR2V0U2hvcnRJbnMoIEVYRUNfT1AgKQorICBHZXRTaG9ydElucyggVFRfRXhlY0NvbnRleHQgIGV4YyApCiAgIHsKICAgICAvKiBSZWFkaW5nIGEgYnl0ZSBzdHJlYW0gc28gdGhlcmUgaXMgbm8gZW5kaWFuZXNzIChEYXZlUCkgKi8KLSAgICBDVVIuSVAgKz0gMjsKLSAgICByZXR1cm4gKEZUX1Nob3J0KSggKCBDVVIuY29kZVtDVVIuSVAgLSAyXSA8PCA4ICkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIENVUi5jb2RlW0NVUi5JUCAtIDFdICAgICAgKTsKKyAgICBleGMtPklQICs9IDI7CisgICAgcmV0dXJuIChGVF9TaG9ydCkoICggZXhjLT5jb2RlW2V4Yy0+SVAgLSAyXSA8PCA4ICkgKworICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+Y29kZVtleGMtPklQIC0gMV0gICAgICApOwogICB9CiAKIApAQCAtMTc4NCwyMyArMTYyOCwyNCBAQAogICAvKiAgICBTVUNDRVNTIG9yIEZBSUxVUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyBGVF9Cb29sCi0gIEluc19Hb3RvX0NvZGVSYW5nZSggRVhFQ19PUF8gRlRfSW50ICAgIGFSYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgYUlQICkKKyAgSW5zX0dvdG9fQ29kZVJhbmdlKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICBhUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgIGFJUCApCiAgIHsKICAgICBUVF9Db2RlUmFuZ2UqICByYW5nZTsKIAogCiAgICAgaWYgKCBhUmFuZ2UgPCAxIHx8IGFSYW5nZSA+IDMgKQogICAgIHsKLSAgICAgIENVUi5lcnJvciA9IEZUX1RIUk9XKCBCYWRfQXJndW1lbnQgKTsKKyAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggQmFkX0FyZ3VtZW50ICk7CiAgICAgICByZXR1cm4gRkFJTFVSRTsKICAgICB9CiAKLSAgICByYW5nZSA9ICZDVVIuY29kZVJhbmdlVGFibGVbYVJhbmdlIC0gMV07CisgICAgcmFuZ2UgPSAmZXhjLT5jb2RlUmFuZ2VUYWJsZVthUmFuZ2UgLSAxXTsKIAogICAgIGlmICggcmFuZ2UtPmJhc2UgPT0gTlVMTCApICAgICAvKiBpbnZhbGlkIGNvZGVyYW5nZSAqLwogICAgIHsKLSAgICAgIENVUi5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0NvZGVSYW5nZSApOworICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0NvZGVSYW5nZSApOwogICAgICAgcmV0dXJuIEZBSUxVUkU7CiAgICAgfQogCkBAIC0xODEwLDE0ICsxNjU1LDE0IEBACiAKICAgICBpZiAoIGFJUCA+IHJhbmdlLT5zaXplICkKICAgICB7Ci0gICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggQ29kZV9PdmVyZmxvdyApOworICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBDb2RlX092ZXJmbG93ICk7CiAgICAgICByZXR1cm4gRkFJTFVSRTsKICAgICB9CiAKLSAgICBDVVIuY29kZSAgICAgPSByYW5nZS0+YmFzZTsKLSAgICBDVVIuY29kZVNpemUgPSByYW5nZS0+c2l6ZTsKLSAgICBDVVIuSVAgICAgICAgPSBhSVA7Ci0gICAgQ1VSLmN1clJhbmdlID0gYVJhbmdlOworICAgIGV4Yy0+Y29kZSAgICAgPSByYW5nZS0+YmFzZTsKKyAgICBleGMtPmNvZGVTaXplID0gcmFuZ2UtPnNpemU7CisgICAgZXhjLT5JUCAgICAgICA9IGFJUDsKKyAgICBleGMtPmN1clJhbmdlID0gYVJhbmdlOwogCiAgICAgcmV0dXJuIFNVQ0NFU1M7CiAgIH0KQEAgLTE4NDEsMzYgKzE2ODYsMzcgQEAKICAgLyogICAgem9uZSAgICAgOjogVGhlIGFmZmVjdGVkIGdseXBoIHpvbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgdm9pZAotICBEaXJlY3RfTW92ZSggRVhFQ19PUF8gVFRfR2x5cGhab25lICB6b25lLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICBwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgZGlzdGFuY2UgKQorICBEaXJlY3RfTW92ZSggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgICAgIFRUX0dseXBoWm9uZSAgICB6b25lLAorICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgIHBvaW50LAorICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGRpc3RhbmNlICkKICAgewogICAgIEZUX0YyNkRvdDYgIHY7CiAKIAogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HCi0gICAgRlRfQVNTRVJUKCAhQ1VSLmZhY2UtPnVucGF0ZW50ZWRfaGludGluZyApOworICAgIEZUX0FTU0VSVCggIWV4Yy0+ZmFjZS0+dW5wYXRlbnRlZF9oaW50aW5nICk7CiAjZW5kaWYKIAotICAgIHYgPSBDVVIuR1MuZnJlZVZlY3Rvci54OworICAgIHYgPSBleGMtPkdTLmZyZWVWZWN0b3IueDsKIAogICAgIGlmICggdiAhPSAwICkKICAgICB7CiAjaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCi0gICAgICBpZiAoICFTVUJQSVhFTF9ISU5USU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICggIUNVUi5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICggQ1VSLnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19BTExPV19YX0RNT1ZFICkgKSApCisgICAgICBpZiAoICFTVUJQSVhFTF9ISU5USU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAoICFleGMtPmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19BTExPV19YX0RNT1ZFICkgKSApCiAjZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCi0gICAgICAgIHpvbmUtPmN1cltwb2ludF0ueCArPSBGVF9NdWxEaXYoIGRpc3RhbmNlLCB2LCBDVVIuRl9kb3RfUCApOworICAgICAgICB6b25lLT5jdXJbcG9pbnRdLnggKz0gRlRfTXVsRGl2KCBkaXN0YW5jZSwgdiwgZXhjLT5GX2RvdF9QICk7CiAKICAgICAgIHpvbmUtPnRhZ3NbcG9pbnRdIHw9IEZUX0NVUlZFX1RBR19UT1VDSF9YOwogICAgIH0KIAotICAgIHYgPSBDVVIuR1MuZnJlZVZlY3Rvci55OworICAgIHYgPSBleGMtPkdTLmZyZWVWZWN0b3IueTsKIAogICAgIGlmICggdiAhPSAwICkKICAgICB7Ci0gICAgICB6b25lLT5jdXJbcG9pbnRdLnkgKz0gRlRfTXVsRGl2KCBkaXN0YW5jZSwgdiwgQ1VSLkZfZG90X1AgKTsKKyAgICAgIHpvbmUtPmN1cltwb2ludF0ueSArPSBGVF9NdWxEaXYoIGRpc3RhbmNlLCB2LCBleGMtPkZfZG90X1AgKTsKIAogICAgICAgem9uZS0+dGFnc1twb2ludF0gfD0gRlRfQ1VSVkVfVEFHX1RPVUNIX1k7CiAgICAgfQpAQCAtMTg5NSwyNiArMTc0MSwyNyBAQAogICAvKiAgICB6b25lICAgICA6OiBUaGUgYWZmZWN0ZWQgZ2x5cGggem9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIERpcmVjdF9Nb3ZlX09yaWcoIEVYRUNfT1BfIFRUX0dseXBoWm9uZSAgem9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICBwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICBkaXN0YW5jZSApCisgIERpcmVjdF9Nb3ZlX09yaWcoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICAgICAgICAgIFRUX0dseXBoWm9uZSAgICB6b25lLAorICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICAgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBkaXN0YW5jZSApCiAgIHsKICAgICBGVF9GMjZEb3Q2ICB2OwogCiAKICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1VOUEFURU5URURfSElOVElORwotICAgIEZUX0FTU0VSVCggIUNVUi5mYWNlLT51bnBhdGVudGVkX2hpbnRpbmcgKTsKKyAgICBGVF9BU1NFUlQoICFleGMtPmZhY2UtPnVucGF0ZW50ZWRfaGludGluZyApOwogI2VuZGlmCiAKLSAgICB2ID0gQ1VSLkdTLmZyZWVWZWN0b3IueDsKKyAgICB2ID0gZXhjLT5HUy5mcmVlVmVjdG9yLng7CiAKICAgICBpZiAoIHYgIT0gMCApCi0gICAgICB6b25lLT5vcmdbcG9pbnRdLnggKz0gRlRfTXVsRGl2KCBkaXN0YW5jZSwgdiwgQ1VSLkZfZG90X1AgKTsKKyAgICAgIHpvbmUtPm9yZ1twb2ludF0ueCArPSBGVF9NdWxEaXYoIGRpc3RhbmNlLCB2LCBleGMtPkZfZG90X1AgKTsKIAotICAgIHYgPSBDVVIuR1MuZnJlZVZlY3Rvci55OworICAgIHYgPSBleGMtPkdTLmZyZWVWZWN0b3IueTsKIAogICAgIGlmICggdiAhPSAwICkKLSAgICAgIHpvbmUtPm9yZ1twb2ludF0ueSArPSBGVF9NdWxEaXYoIGRpc3RhbmNlLCB2LCBDVVIuRl9kb3RfUCApOworICAgICAgem9uZS0+b3JnW3BvaW50XS55ICs9IEZUX011bERpdiggZGlzdGFuY2UsIHYsIGV4Yy0+Rl9kb3RfUCApOwogICB9CiAKIApAQCAtMTkyOSwxNSArMTc3NiwxNiBAQAogCiAKICAgc3RhdGljIHZvaWQKLSAgRGlyZWN0X01vdmVfWCggRVhFQ19PUF8gVFRfR2x5cGhab25lICB6b25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgIHBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgIGRpc3RhbmNlICkKKyAgRGlyZWN0X01vdmVfWCggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgICAgICAgVFRfR2x5cGhab25lICAgIHpvbmUsCisgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgICBwb2ludCwKKyAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGRpc3RhbmNlICkKICAgewotICAgIEZUX1VOVVNFRF9FWEVDOworICAgIEZUX1VOVVNFRCggZXhjICk7CiAKICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSAgICBpZiAoICFTVUJQSVhFTF9ISU5USU5HICB8fAotICAgICAgICAgIUNVUi5pZ25vcmVfeF9tb2RlICkKKyAgICBpZiAoICFTVUJQSVhFTF9ISU5USU5HICAgfHwKKyAgICAgICAgICFleGMtPmlnbm9yZV94X21vZGUgKQogI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwogICAgICAgem9uZS0+Y3VyW3BvaW50XS54ICs9IGRpc3RhbmNlOwogCkBAIC0xOTQ2LDExICsxNzk0LDEyIEBACiAKIAogICBzdGF0aWMgdm9pZAotICBEaXJlY3RfTW92ZV9ZKCBFWEVDX09QXyBUVF9HbHlwaFpvbmUgIHpvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgZGlzdGFuY2UgKQorICBEaXJlY3RfTW92ZV9ZKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgICAgICBUVF9HbHlwaFpvbmUgICAgem9uZSwKKyAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgIHBvaW50LAorICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgZGlzdGFuY2UgKQogICB7Ci0gICAgRlRfVU5VU0VEX0VYRUM7CisgICAgRlRfVU5VU0VEKCBleGMgKTsKIAogICAgIHpvbmUtPmN1cltwb2ludF0ueSArPSBkaXN0YW5jZTsKICAgICB6b25lLT50YWdzW3BvaW50XSAgfD0gRlRfQ1VSVkVfVEFHX1RPVUNIX1k7CkBAIC0xOTY4LDIyICsxODE3LDI0IEBACiAKIAogICBzdGF0aWMgdm9pZAotICBEaXJlY3RfTW92ZV9PcmlnX1goIEVYRUNfT1BfIFRUX0dseXBoWm9uZSAgem9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgIHBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgZGlzdGFuY2UgKQorICBEaXJlY3RfTW92ZV9PcmlnX1goIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICAgICAgICAgICAgVFRfR2x5cGhab25lICAgIHpvbmUsCisgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBkaXN0YW5jZSApCiAgIHsKLSAgICBGVF9VTlVTRURfRVhFQzsKKyAgICBGVF9VTlVTRUQoIGV4YyApOwogCiAgICAgem9uZS0+b3JnW3BvaW50XS54ICs9IGRpc3RhbmNlOwogICB9CiAKIAogICBzdGF0aWMgdm9pZAotICBEaXJlY3RfTW92ZV9PcmlnX1koIEVYRUNfT1BfIFRUX0dseXBoWm9uZSAgem9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgIHBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgZGlzdGFuY2UgKQorICBEaXJlY3RfTW92ZV9PcmlnX1koIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICAgICAgICAgICAgVFRfR2x5cGhab25lICAgIHpvbmUsCisgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBkaXN0YW5jZSApCiAgIHsKLSAgICBGVF9VTlVTRURfRVhFQzsKKyAgICBGVF9VTlVTRUQoIGV4YyApOwogCiAgICAgem9uZS0+b3JnW3BvaW50XS55ICs9IGRpc3RhbmNlOwogICB9CkBAIC0yMDEyLDEyICsxODYzLDEzIEBACiAgIC8qICAgIGJlZm9yZSByb3VuZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIEZUX0YyNkRvdDYKLSAgUm91bmRfTm9uZSggRVhFQ19PUF8gRlRfRjI2RG90NiAgZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIGNvbXBlbnNhdGlvbiApCisgIFJvdW5kX05vbmUoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBkaXN0YW5jZSwKKyAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGNvbXBlbnNhdGlvbiApCiAgIHsKICAgICBGVF9GMjZEb3Q2ICB2YWw7CiAKLSAgICBGVF9VTlVTRURfRVhFQzsKKyAgICBGVF9VTlVTRUQoIGV4YyApOwogCiAKICAgICBpZiAoIGRpc3RhbmNlID49IDAgKQpAQCAtMjA1MywxMiArMTkwNSwxMyBAQAogICAvKiAgICBSb3VuZGVkIGRpc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyBGVF9GMjZEb3Q2Ci0gIFJvdW5kX1RvX0dyaWQoIEVYRUNfT1BfIEZUX0YyNkRvdDYgIGRpc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICBjb21wZW5zYXRpb24gKQorICBSb3VuZF9Ub19HcmlkKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgZGlzdGFuY2UsCisgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBjb21wZW5zYXRpb24gKQogICB7CiAgICAgRlRfRjI2RG90NiAgdmFsOwogCi0gICAgRlRfVU5VU0VEX0VYRUM7CisgICAgRlRfVU5VU0VEKCBleGMgKTsKIAogCiAgICAgaWYgKCBkaXN0YW5jZSA+PSAwICkKQEAgLTIwNzQsNyArMTkyNyw3IEBACiAgICAgICAgIHZhbCA9IDA7CiAgICAgfQogCi0gICAgcmV0dXJuICB2YWw7CisgICAgcmV0dXJuIHZhbDsKICAgfQogCiAKQEAgLTIwOTUsMTIgKzE5NDgsMTMgQEAKICAgLyogICAgUm91bmRlZCBkaXN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgRlRfRjI2RG90NgotICBSb3VuZF9Ub19IYWxmX0dyaWQoIEVYRUNfT1BfIEZUX0YyNkRvdDYgIGRpc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIGNvbXBlbnNhdGlvbiApCisgIFJvdW5kX1RvX0hhbGZfR3JpZCggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgZGlzdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGNvbXBlbnNhdGlvbiApCiAgIHsKICAgICBGVF9GMjZEb3Q2ICB2YWw7CiAKLSAgICBGVF9VTlVTRURfRVhFQzsKKyAgICBGVF9VTlVTRUQoIGV4YyApOwogCiAKICAgICBpZiAoIGRpc3RhbmNlID49IDAgKQpAQCAtMjEzNywxMiArMTk5MSwxMyBAQAogICAvKiAgICBSb3VuZGVkIGRpc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyBGVF9GMjZEb3Q2Ci0gIFJvdW5kX0Rvd25fVG9fR3JpZCggRVhFQ19PUF8gRlRfRjI2RG90NiAgZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgY29tcGVuc2F0aW9uICkKKyAgUm91bmRfRG93bl9Ub19HcmlkKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBkaXN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgY29tcGVuc2F0aW9uICkKICAgewogICAgIEZUX0YyNkRvdDYgIHZhbDsKIAotICAgIEZUX1VOVVNFRF9FWEVDOworICAgIEZUX1VOVVNFRCggZXhjICk7CiAKIAogICAgIGlmICggZGlzdGFuY2UgPj0gMCApCkBAIC0yMTc5LDEyICsyMDM0LDEzIEBACiAgIC8qICAgIFJvdW5kZWQgZGlzdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIEZUX0YyNkRvdDYKLSAgUm91bmRfVXBfVG9fR3JpZCggRVhFQ19PUF8gRlRfRjI2RG90NiAgZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIGNvbXBlbnNhdGlvbiApCisgIFJvdW5kX1VwX1RvX0dyaWQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBkaXN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGNvbXBlbnNhdGlvbiApCiAgIHsKICAgICBGVF9GMjZEb3Q2ICB2YWw7CiAKLSAgICBGVF9VTlVTRURfRVhFQzsKKyAgICBGVF9VTlVTRUQoIGV4YyApOwogCiAKICAgICBpZiAoIGRpc3RhbmNlID49IDAgKQpAQCAtMjIyMSwxMiArMjA3NywxMyBAQAogICAvKiAgICBSb3VuZGVkIGRpc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyBGVF9GMjZEb3Q2Ci0gIFJvdW5kX1RvX0RvdWJsZV9HcmlkKCBFWEVDX09QXyBGVF9GMjZEb3Q2ICBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIGNvbXBlbnNhdGlvbiApCisgIFJvdW5kX1RvX0RvdWJsZV9HcmlkKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGRpc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGNvbXBlbnNhdGlvbiApCiAgIHsKICAgICBGVF9GMjZEb3Q2IHZhbDsKIAotICAgIEZUX1VOVVNFRF9FWEVDOworICAgIEZUX1VOVVNFRCggZXhjICk7CiAKIAogICAgIGlmICggZGlzdGFuY2UgPj0gMCApCkBAIC0yMjY5LDI3ICsyMTI2LDI4IEBACiAgIC8qICAgIGJlZm9yZSByb3VuZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIEZUX0YyNkRvdDYKLSAgUm91bmRfU3VwZXIoIEVYRUNfT1BfIEZUX0YyNkRvdDYgIGRpc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgY29tcGVuc2F0aW9uICkKKyAgUm91bmRfU3VwZXIoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgZGlzdGFuY2UsCisgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgY29tcGVuc2F0aW9uICkKICAgewogICAgIEZUX0YyNkRvdDYgIHZhbDsKIAogCiAgICAgaWYgKCBkaXN0YW5jZSA+PSAwICkKICAgICB7Ci0gICAgICB2YWwgPSAoIGRpc3RhbmNlIC0gQ1VSLnBoYXNlICsgQ1VSLnRocmVzaG9sZCArIGNvbXBlbnNhdGlvbiApICYKLSAgICAgICAgICAgICAgLUNVUi5wZXJpb2Q7Ci0gICAgICB2YWwgKz0gQ1VSLnBoYXNlOworICAgICAgdmFsID0gKCBkaXN0YW5jZSAtIGV4Yy0+cGhhc2UgKyBleGMtPnRocmVzaG9sZCArIGNvbXBlbnNhdGlvbiApICYKKyAgICAgICAgICAgICAgLWV4Yy0+cGVyaW9kOworICAgICAgdmFsICs9IGV4Yy0+cGhhc2U7CiAgICAgICBpZiAoIHZhbCA8IDAgKQotICAgICAgICB2YWwgPSBDVVIucGhhc2U7CisgICAgICAgIHZhbCA9IGV4Yy0+cGhhc2U7CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICB2YWwgPSAtKCAoIENVUi50aHJlc2hvbGQgLSBDVVIucGhhc2UgLSBkaXN0YW5jZSArIGNvbXBlbnNhdGlvbiApICYKLSAgICAgICAgICAgICAgIC1DVVIucGVyaW9kICk7Ci0gICAgICB2YWwgLT0gQ1VSLnBoYXNlOworICAgICAgdmFsID0gLSggKCBleGMtPnRocmVzaG9sZCAtIGV4Yy0+cGhhc2UgLSBkaXN0YW5jZSArIGNvbXBlbnNhdGlvbiApICYKKyAgICAgICAgICAgICAgIC1leGMtPnBlcmlvZCApOworICAgICAgdmFsIC09IGV4Yy0+cGhhc2U7CiAgICAgICBpZiAoIHZhbCA+IDAgKQotICAgICAgICB2YWwgPSAtQ1VSLnBoYXNlOworICAgICAgICB2YWwgPSAtZXhjLT5waGFzZTsKICAgICB9CiAKICAgICByZXR1cm4gdmFsOwpAQCAtMjMxNywyNyArMjE3NSwyOCBAQAogICAvKiAgICBncmVhdGVyIHByZWNpc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyBGVF9GMjZEb3Q2Ci0gIFJvdW5kX1N1cGVyXzQ1KCBFWEVDX09QXyBGVF9GMjZEb3Q2ICBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIGNvbXBlbnNhdGlvbiApCisgIFJvdW5kX1N1cGVyXzQ1KCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGRpc3RhbmNlLAorICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGNvbXBlbnNhdGlvbiApCiAgIHsKICAgICBGVF9GMjZEb3Q2ICB2YWw7CiAKIAogICAgIGlmICggZGlzdGFuY2UgPj0gMCApCiAgICAgewotICAgICAgdmFsID0gKCAoIGRpc3RhbmNlIC0gQ1VSLnBoYXNlICsgQ1VSLnRocmVzaG9sZCArIGNvbXBlbnNhdGlvbiApIC8KLSAgICAgICAgICAgICAgICBDVVIucGVyaW9kICkgKiBDVVIucGVyaW9kOwotICAgICAgdmFsICs9IENVUi5waGFzZTsKKyAgICAgIHZhbCA9ICggKCBkaXN0YW5jZSAtIGV4Yy0+cGhhc2UgKyBleGMtPnRocmVzaG9sZCArIGNvbXBlbnNhdGlvbiApIC8KKyAgICAgICAgICAgICAgICBleGMtPnBlcmlvZCApICogZXhjLT5wZXJpb2Q7CisgICAgICB2YWwgKz0gZXhjLT5waGFzZTsKICAgICAgIGlmICggdmFsIDwgMCApCi0gICAgICAgIHZhbCA9IENVUi5waGFzZTsKKyAgICAgICAgdmFsID0gZXhjLT5waGFzZTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgIHZhbCA9IC0oICggKCBDVVIudGhyZXNob2xkIC0gQ1VSLnBoYXNlIC0gZGlzdGFuY2UgKyBjb21wZW5zYXRpb24gKSAvCi0gICAgICAgICAgICAgICAgICAgQ1VSLnBlcmlvZCApICogQ1VSLnBlcmlvZCApOwotICAgICAgdmFsIC09IENVUi5waGFzZTsKKyAgICAgIHZhbCA9IC0oICggKCBleGMtPnRocmVzaG9sZCAtIGV4Yy0+cGhhc2UgLSBkaXN0YW5jZSArIGNvbXBlbnNhdGlvbiApIC8KKyAgICAgICAgICAgICAgICAgICBleGMtPnBlcmlvZCApICogZXhjLT5wZXJpb2QgKTsKKyAgICAgIHZhbCAtPSBleGMtPnBoYXNlOwogICAgICAgaWYgKCB2YWwgPiAwICkKLSAgICAgICAgdmFsID0gLUNVUi5waGFzZTsKKyAgICAgICAgdmFsID0gLWV4Yy0+cGhhc2U7CiAgICAgfQogCiAgICAgcmV0dXJuIHZhbDsKQEAgLTIzNTYsNDAgKzIyMTUsNDEgQEAKICAgLyogICAgcm91bmRfbW9kZSA6OiBUaGUgcm91bmRpbmcgbW9kZSB0byBiZSB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgdm9pZAotICBDb21wdXRlX1JvdW5kKCBFWEVDX09QXyBGVF9CeXRlICByb3VuZF9tb2RlICkKKyAgQ29tcHV0ZV9Sb3VuZCggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgICAgICAgRlRfQnl0ZSAgICAgICAgIHJvdW5kX21vZGUgKQogICB7CiAgICAgc3dpdGNoICggcm91bmRfbW9kZSApCiAgICAgewogICAgIGNhc2UgVFRfUm91bmRfT2ZmOgotICAgICAgQ1VSLmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9Ob25lOworICAgICAgZXhjLT5mdW5jX3JvdW5kID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfTm9uZTsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBUVF9Sb3VuZF9Ub19HcmlkOgotICAgICAgQ1VSLmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9Ub19HcmlkOworICAgICAgZXhjLT5mdW5jX3JvdW5kID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfVG9fR3JpZDsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBUVF9Sb3VuZF9VcF9Ub19HcmlkOgotICAgICAgQ1VSLmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9VcF9Ub19HcmlkOworICAgICAgZXhjLT5mdW5jX3JvdW5kID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfVXBfVG9fR3JpZDsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBUVF9Sb3VuZF9Eb3duX1RvX0dyaWQ6Ci0gICAgICBDVVIuZnVuY19yb3VuZCA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX0Rvd25fVG9fR3JpZDsKKyAgICAgIGV4Yy0+ZnVuY19yb3VuZCA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX0Rvd25fVG9fR3JpZDsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBUVF9Sb3VuZF9Ub19IYWxmX0dyaWQ6Ci0gICAgICBDVVIuZnVuY19yb3VuZCA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX1RvX0hhbGZfR3JpZDsKKyAgICAgIGV4Yy0+ZnVuY19yb3VuZCA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX1RvX0hhbGZfR3JpZDsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBUVF9Sb3VuZF9Ub19Eb3VibGVfR3JpZDoKLSAgICAgIENVUi5mdW5jX3JvdW5kID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfVG9fRG91YmxlX0dyaWQ7CisgICAgICBleGMtPmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9Ub19Eb3VibGVfR3JpZDsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBUVF9Sb3VuZF9TdXBlcjoKLSAgICAgIENVUi5mdW5jX3JvdW5kID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfU3VwZXI7CisgICAgICBleGMtPmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9TdXBlcjsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBUVF9Sb3VuZF9TdXBlcl80NToKLSAgICAgIENVUi5mdW5jX3JvdW5kID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfU3VwZXJfNDU7CisgICAgICBleGMtPmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9TdXBlcl80NTsKICAgICAgIGJyZWFrOwogICAgIH0KICAgfQpAQCAtMjQwOSw1NyArMjI2OSw1OCBAQAogICAvKiAgICBzZWxlY3RvciAgIDo6IFRoZSBTUk9VTkQgb3Bjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIFNldFN1cGVyUm91bmQoIEVYRUNfT1BfIEZUX0YyNkRvdDYgIEdyaWRQZXJpb2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgIHNlbGVjdG9yICkKKyAgU2V0U3VwZXJSb3VuZCggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgICAgICAgRlRfRjJEb3QxNCAgICAgIEdyaWRQZXJpb2QsCisgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgICBzZWxlY3RvciApCiAgIHsKICAgICBzd2l0Y2ggKCAoRlRfSW50KSggc2VsZWN0b3IgJiAweEMwICkgKQogICAgIHsKICAgICAgIGNhc2UgMDoKLSAgICAgICAgQ1VSLnBlcmlvZCA9IEdyaWRQZXJpb2QgLyAyOworICAgICAgICBleGMtPnBlcmlvZCA9IEdyaWRQZXJpb2QgLyAyOwogICAgICAgICBicmVhazsKIAogICAgICAgY2FzZSAweDQwOgotICAgICAgICBDVVIucGVyaW9kID0gR3JpZFBlcmlvZDsKKyAgICAgICAgZXhjLT5wZXJpb2QgPSBHcmlkUGVyaW9kOwogICAgICAgICBicmVhazsKIAogICAgICAgY2FzZSAweDgwOgotICAgICAgICBDVVIucGVyaW9kID0gR3JpZFBlcmlvZCAqIDI7CisgICAgICAgIGV4Yy0+cGVyaW9kID0gR3JpZFBlcmlvZCAqIDI7CiAgICAgICAgIGJyZWFrOwogCiAgICAgICAvKiBUaGlzIG9wY29kZSBpcyByZXNlcnZlZCwgYnV0Li4uICovCi0KICAgICAgIGNhc2UgMHhDMDoKLSAgICAgICAgQ1VSLnBlcmlvZCA9IEdyaWRQZXJpb2Q7CisgICAgICAgIGV4Yy0+cGVyaW9kID0gR3JpZFBlcmlvZDsKICAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgc3dpdGNoICggKEZUX0ludCkoIHNlbGVjdG9yICYgMHgzMCApICkKICAgICB7CiAgICAgY2FzZSAwOgotICAgICAgQ1VSLnBoYXNlID0gMDsKKyAgICAgIGV4Yy0+cGhhc2UgPSAwOwogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4MTA6Ci0gICAgICBDVVIucGhhc2UgPSBDVVIucGVyaW9kIC8gNDsKKyAgICAgIGV4Yy0+cGhhc2UgPSBleGMtPnBlcmlvZCAvIDQ7CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHgyMDoKLSAgICAgIENVUi5waGFzZSA9IENVUi5wZXJpb2QgLyAyOworICAgICAgZXhjLT5waGFzZSA9IGV4Yy0+cGVyaW9kIC8gMjsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDMwOgotICAgICAgQ1VSLnBoYXNlID0gQ1VSLnBlcmlvZCAqIDMgLyA0OworICAgICAgZXhjLT5waGFzZSA9IGV4Yy0+cGVyaW9kICogMyAvIDQ7CiAgICAgICBicmVhazsKICAgICB9CiAKICAgICBpZiAoICggc2VsZWN0b3IgJiAweDBGICkgPT0gMCApCi0gICAgICBDVVIudGhyZXNob2xkID0gQ1VSLnBlcmlvZCAtIDE7CisgICAgICBleGMtPnRocmVzaG9sZCA9IGV4Yy0+cGVyaW9kIC0gMTsKICAgICBlbHNlCi0gICAgICBDVVIudGhyZXNob2xkID0gKCAoRlRfSW50KSggc2VsZWN0b3IgJiAweDBGICkgLSA0ICkgKiBDVVIucGVyaW9kIC8gODsKKyAgICAgIGV4Yy0+dGhyZXNob2xkID0gKCAoRlRfSW50KSggc2VsZWN0b3IgJiAweDBGICkgLSA0ICkgKiBleGMtPnBlcmlvZCAvIDg7CiAKLSAgICBDVVIucGVyaW9kICAgIC89IDI1NjsKLSAgICBDVVIucGhhc2UgICAgIC89IDI1NjsKLSAgICBDVVIudGhyZXNob2xkIC89IDI1NjsKKyAgICAvKiBjb252ZXJ0IHRvIEYyNkRvdDYgZm9ybWF0ICovCisgICAgZXhjLT5wZXJpb2QgICAgPj49IDg7CisgICAgZXhjLT5waGFzZSAgICAgPj49IDg7CisgICAgZXhjLT50aHJlc2hvbGQgPj49IDg7CiAgIH0KIAogCkBAIC0yNDgwLDE2ICsyMzQxLDE3IEBACiAgIC8qICAgIFRoZSBkaXN0YW5jZSBpbiBGMjZkb3Q2IGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIEZUX0YyNkRvdDYKLSAgUHJvamVjdCggRVhFQ19PUF8gRlRfUG9zICBkeCwKLSAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBkeSApCisgIFByb2plY3QoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgIEZUX1BvcyAgICAgICAgICBkeCwKKyAgICAgICAgICAgRlRfUG9zICAgICAgICAgIGR5ICkKICAgewogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HCi0gICAgRlRfQVNTRVJUKCAhQ1VSLmZhY2UtPnVucGF0ZW50ZWRfaGludGluZyApOworICAgIEZUX0FTU0VSVCggIWV4Yy0+ZmFjZS0+dW5wYXRlbnRlZF9oaW50aW5nICk7CiAjZW5kaWYKIAotICAgIHJldHVybiBUVF9Eb3RGaXgxNCggKEZUX1VJbnQzMilkeCwgKEZUX1VJbnQzMilkeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENVUi5HUy5wcm9qVmVjdG9yLngsCi0gICAgICAgICAgICAgICAgICAgICAgICBDVVIuR1MucHJvalZlY3Rvci55ICk7CisgICAgcmV0dXJuIFRUX0RvdEZpeDE0KCBkeCwgZHksCisgICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLnByb2pWZWN0b3IueCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+R1MucHJvalZlY3Rvci55ICk7CiAgIH0KIAogCkBAIC0yNTEwLDEyICsyMzcyLDEzIEBACiAgIC8qICAgIFRoZSBkaXN0YW5jZSBpbiBGMjZkb3Q2IGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIEZUX0YyNkRvdDYKLSAgRHVhbF9Qcm9qZWN0KCBFWEVDX09QXyBGVF9Qb3MgIGR4LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgZHkgKQorICBEdWFsX1Byb2plY3QoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICAgIGR4LAorICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgICBkeSApCiAgIHsKLSAgICByZXR1cm4gVFRfRG90Rml4MTQoIChGVF9VSW50MzIpZHgsIChGVF9VSW50MzIpZHksCi0gICAgICAgICAgICAgICAgICAgICAgICBDVVIuR1MuZHVhbFZlY3Rvci54LAotICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLkdTLmR1YWxWZWN0b3IueSApOworICAgIHJldHVybiBUVF9Eb3RGaXgxNCggZHgsIGR5LAorICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT5HUy5kdWFsVmVjdG9yLngsCisgICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLmR1YWxWZWN0b3IueSApOwogICB9CiAKIApAQCAtMjUzNiwxMCArMjM5OSwxMSBAQAogICAvKiAgICBUaGUgZGlzdGFuY2UgaW4gRjI2ZG90NiBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyBGVF9GMjZEb3Q2Ci0gIFByb2plY3RfeCggRVhFQ19PUF8gRlRfUG9zICBkeCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIGR5ICkKKyAgUHJvamVjdF94KCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgICBkeCwKKyAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICAgZHkgKQogICB7Ci0gICAgRlRfVU5VU0VEX0VYRUM7CisgICAgRlRfVU5VU0VEKCBleGMgKTsKICAgICBGVF9VTlVTRUQoIGR5ICk7CiAKICAgICByZXR1cm4gZHg7CkBAIC0yNTYzLDEwICsyNDI3LDExIEBACiAgIC8qICAgIFRoZSBkaXN0YW5jZSBpbiBGMjZkb3Q2IGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIEZUX0YyNkRvdDYKLSAgUHJvamVjdF95KCBFWEVDX09QXyBGVF9Qb3MgIGR4LAotICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgZHkgKQorICBQcm9qZWN0X3koIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICAgRlRfUG9zICAgICAgICAgIGR4LAorICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgICBkeSApCiAgIHsKLSAgICBGVF9VTlVTRURfRVhFQzsKKyAgICBGVF9VTlVTRUQoIGV4YyApOwogICAgIEZUX1VOVVNFRCggZHggKTsKIAogICAgIHJldHVybiBkeTsKQEAgLTI1ODMsMTAxICsyNDQ4LDEwMSBAQAogICAvKiAgICB0byB0aGUgY3VycmVudCBncmFwaGljcyBzdGF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIENvbXB1dGVfRnVuY3MoIEVYRUNfT1AgKQorICBDb21wdXRlX0Z1bmNzKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKICAgewogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HCi0gICAgaWYgKCBDVVIuZmFjZS0+dW5wYXRlbnRlZF9oaW50aW5nICkKKyAgICBpZiAoIGV4Yy0+ZmFjZS0+dW5wYXRlbnRlZF9oaW50aW5nICkKICAgICB7Ci0gICAgICAvKiBJZiBib3RoIHZlY3RvcnMgcG9pbnQgcmlnaHR3YXJkcyBhbG9uZyB0aGUgeCBheGlzLCBzZXQgICAgICAgICAgICAgKi8KLSAgICAgIC8qIGBib3RoLXgtYXhpcycgdHJ1ZSwgb3RoZXJ3aXNlIHNldCBpdCBmYWxzZS4gIFRoZSB4IHZhbHVlcyBvbmx5ICAgICAqLwotICAgICAgLyogbmVlZCBiZSB0ZXN0ZWQgYmVjYXVzZSB0aGUgdmVjdG9yIGhhcyBiZWVuIG5vcm1hbGlzZWQgdG8gYSB1bml0ICAgICovCi0gICAgICAvKiB2ZWN0b3Igb2YgbGVuZ3RoIDB4NDAwMCA9IHVuaXR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIENVUi5HUy5ib3RoX3hfYXhpcyA9IChGVF9Cb29sKSggQ1VSLkdTLnByb2pWZWN0b3IueCA9PSAweDQwMDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLkdTLmZyZWVWZWN0b3IueCA9PSAweDQwMDAgKTsKKyAgICAgIC8qIElmIGJvdGggdmVjdG9ycyBwb2ludCByaWdodHdhcmRzIGFsb25nIHRoZSB4IGF4aXMsIHNldCAgICAgICAgICAqLworICAgICAgLyogYGJvdGgteC1heGlzJyB0cnVlLCBvdGhlcndpc2Ugc2V0IGl0IGZhbHNlLiAgVGhlIHggdmFsdWVzIG9ubHkgICovCisgICAgICAvKiBuZWVkIGJlIHRlc3RlZCBiZWNhdXNlIHRoZSB2ZWN0b3IgaGFzIGJlZW4gbm9ybWFsaXNlZCB0byBhIHVuaXQgKi8KKyAgICAgIC8qIHZlY3RvciBvZiBsZW5ndGggMHg0MDAwID0gdW5pdHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgZXhjLT5HUy5ib3RoX3hfYXhpcyA9IChGVF9Cb29sKSggZXhjLT5HUy5wcm9qVmVjdG9yLnggPT0gMHg0MDAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCA9PSAweDQwMDAgKTsKIAogICAgICAgLyogVGhyb3cgYXdheSBwcm9qZWN0aW9uIGFuZCBmcmVlZG9tIHZlY3RvciBpbmZvcm1hdGlvbiAqLwogICAgICAgLyogYmVjYXVzZSB0aGUgcGF0ZW50cyBkb24ndCBhbGxvdyB0aGVtIHRvIGJlIHN0b3JlZC4gICAqLwogICAgICAgLyogVGhlIHJlbGV2YW50IFVTIFBhdGVudHMgYXJlIDUxNTU4MDUgYW5kIDUzMjU0NzkuICAgICAqLwotICAgICAgQ1VSLkdTLnByb2pWZWN0b3IueCA9IDA7Ci0gICAgICBDVVIuR1MucHJvalZlY3Rvci55ID0gMDsKLSAgICAgIENVUi5HUy5mcmVlVmVjdG9yLnggPSAwOwotICAgICAgQ1VSLkdTLmZyZWVWZWN0b3IueSA9IDA7CisgICAgICBleGMtPkdTLnByb2pWZWN0b3IueCA9IDA7CisgICAgICBleGMtPkdTLnByb2pWZWN0b3IueSA9IDA7CisgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCA9IDA7CisgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueSA9IDA7CiAKLSAgICAgIGlmICggQ1VSLkdTLmJvdGhfeF9heGlzICkKKyAgICAgIGlmICggZXhjLT5HUy5ib3RoX3hfYXhpcyApCiAgICAgICB7Ci0gICAgICAgIENVUi5mdW5jX3Byb2plY3QgICA9IFByb2plY3RfeDsKLSAgICAgICAgQ1VSLmZ1bmNfbW92ZSAgICAgID0gRGlyZWN0X01vdmVfWDsKLSAgICAgICAgQ1VSLmZ1bmNfbW92ZV9vcmlnID0gRGlyZWN0X01vdmVfT3JpZ19YOworICAgICAgICBleGMtPmZ1bmNfcHJvamVjdCAgID0gUHJvamVjdF94OworICAgICAgICBleGMtPmZ1bmNfbW92ZSAgICAgID0gRGlyZWN0X01vdmVfWDsKKyAgICAgICAgZXhjLT5mdW5jX21vdmVfb3JpZyA9IERpcmVjdF9Nb3ZlX09yaWdfWDsKICAgICAgIH0KICAgICAgIGVsc2UKICAgICAgIHsKLSAgICAgICAgQ1VSLmZ1bmNfcHJvamVjdCAgID0gUHJvamVjdF95OwotICAgICAgICBDVVIuZnVuY19tb3ZlICAgICAgPSBEaXJlY3RfTW92ZV9ZOwotICAgICAgICBDVVIuZnVuY19tb3ZlX29yaWcgPSBEaXJlY3RfTW92ZV9PcmlnX1k7CisgICAgICAgIGV4Yy0+ZnVuY19wcm9qZWN0ICAgPSBQcm9qZWN0X3k7CisgICAgICAgIGV4Yy0+ZnVuY19tb3ZlICAgICAgPSBEaXJlY3RfTW92ZV9ZOworICAgICAgICBleGMtPmZ1bmNfbW92ZV9vcmlnID0gRGlyZWN0X01vdmVfT3JpZ19ZOwogICAgICAgfQogCi0gICAgICBpZiAoIENVUi5HUy5kdWFsVmVjdG9yLnggPT0gMHg0MDAwICkKLSAgICAgICAgQ1VSLmZ1bmNfZHVhbHByb2ogPSBQcm9qZWN0X3g7Ci0gICAgICBlbHNlIGlmICggQ1VSLkdTLmR1YWxWZWN0b3IueSA9PSAweDQwMDAgKQotICAgICAgICBDVVIuZnVuY19kdWFscHJvaiA9IFByb2plY3RfeTsKKyAgICAgIGlmICggZXhjLT5HUy5kdWFsVmVjdG9yLnggPT0gMHg0MDAwICkKKyAgICAgICAgZXhjLT5mdW5jX2R1YWxwcm9qID0gUHJvamVjdF94OworICAgICAgZWxzZSBpZiAoIGV4Yy0+R1MuZHVhbFZlY3Rvci55ID09IDB4NDAwMCApCisgICAgICAgIGV4Yy0+ZnVuY19kdWFscHJvaiA9IFByb2plY3RfeTsKICAgICAgIGVsc2UKLSAgICAgICAgQ1VSLmZ1bmNfZHVhbHByb2ogPSBEdWFsX1Byb2plY3Q7CisgICAgICAgIGV4Yy0+ZnVuY19kdWFscHJvaiA9IER1YWxfUHJvamVjdDsKIAogICAgICAgLyogRm9yY2UgcmVjYWxjdWxhdGlvbiBvZiBjYWNoZWQgYXNwZWN0IHJhdGlvICovCi0gICAgICBDVVIudHRfbWV0cmljcy5yYXRpbyA9IDA7CisgICAgICBleGMtPnR0X21ldHJpY3MucmF0aW8gPSAwOwogCiAgICAgICByZXR1cm47CiAgICAgfQogI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HICovCiAKLSAgICBpZiAoIENVUi5HUy5mcmVlVmVjdG9yLnggPT0gMHg0MDAwICkKLSAgICAgIENVUi5GX2RvdF9QID0gQ1VSLkdTLnByb2pWZWN0b3IueDsKLSAgICBlbHNlIGlmICggQ1VSLkdTLmZyZWVWZWN0b3IueSA9PSAweDQwMDAgKQotICAgICAgQ1VSLkZfZG90X1AgPSBDVVIuR1MucHJvalZlY3Rvci55OworICAgIGlmICggZXhjLT5HUy5mcmVlVmVjdG9yLnggPT0gMHg0MDAwICkKKyAgICAgIGV4Yy0+Rl9kb3RfUCA9IGV4Yy0+R1MucHJvalZlY3Rvci54OworICAgIGVsc2UgaWYgKCBleGMtPkdTLmZyZWVWZWN0b3IueSA9PSAweDQwMDAgKQorICAgICAgZXhjLT5GX2RvdF9QID0gZXhjLT5HUy5wcm9qVmVjdG9yLnk7CiAgICAgZWxzZQotICAgICAgQ1VSLkZfZG90X1AgPSAoIChGVF9Mb25nKUNVUi5HUy5wcm9qVmVjdG9yLnggKiBDVVIuR1MuZnJlZVZlY3Rvci54ICsKLSAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZylDVVIuR1MucHJvalZlY3Rvci55ICogQ1VSLkdTLmZyZWVWZWN0b3IueSApID4+Ci0gICAgICAgICAgICAgICAgICAgIDE0OworICAgICAgZXhjLT5GX2RvdF9QID0KKyAgICAgICAgKCAoRlRfTG9uZylleGMtPkdTLnByb2pWZWN0b3IueCAqIGV4Yy0+R1MuZnJlZVZlY3Rvci54ICsKKyAgICAgICAgICAoRlRfTG9uZylleGMtPkdTLnByb2pWZWN0b3IueSAqIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICkgPj4gMTQ7CiAKLSAgICBpZiAoIENVUi5HUy5wcm9qVmVjdG9yLnggPT0gMHg0MDAwICkKLSAgICAgIENVUi5mdW5jX3Byb2plY3QgPSAoVFRfUHJvamVjdF9GdW5jKVByb2plY3RfeDsKLSAgICBlbHNlIGlmICggQ1VSLkdTLnByb2pWZWN0b3IueSA9PSAweDQwMDAgKQotICAgICAgQ1VSLmZ1bmNfcHJvamVjdCA9IChUVF9Qcm9qZWN0X0Z1bmMpUHJvamVjdF95OworICAgIGlmICggZXhjLT5HUy5wcm9qVmVjdG9yLnggPT0gMHg0MDAwICkKKyAgICAgIGV4Yy0+ZnVuY19wcm9qZWN0ID0gKFRUX1Byb2plY3RfRnVuYylQcm9qZWN0X3g7CisgICAgZWxzZSBpZiAoIGV4Yy0+R1MucHJvalZlY3Rvci55ID09IDB4NDAwMCApCisgICAgICBleGMtPmZ1bmNfcHJvamVjdCA9IChUVF9Qcm9qZWN0X0Z1bmMpUHJvamVjdF95OwogICAgIGVsc2UKLSAgICAgIENVUi5mdW5jX3Byb2plY3QgPSAoVFRfUHJvamVjdF9GdW5jKVByb2plY3Q7CisgICAgICBleGMtPmZ1bmNfcHJvamVjdCA9IChUVF9Qcm9qZWN0X0Z1bmMpUHJvamVjdDsKIAotICAgIGlmICggQ1VSLkdTLmR1YWxWZWN0b3IueCA9PSAweDQwMDAgKQotICAgICAgQ1VSLmZ1bmNfZHVhbHByb2ogPSAoVFRfUHJvamVjdF9GdW5jKVByb2plY3RfeDsKLSAgICBlbHNlIGlmICggQ1VSLkdTLmR1YWxWZWN0b3IueSA9PSAweDQwMDAgKQotICAgICAgQ1VSLmZ1bmNfZHVhbHByb2ogPSAoVFRfUHJvamVjdF9GdW5jKVByb2plY3RfeTsKKyAgICBpZiAoIGV4Yy0+R1MuZHVhbFZlY3Rvci54ID09IDB4NDAwMCApCisgICAgICBleGMtPmZ1bmNfZHVhbHByb2ogPSAoVFRfUHJvamVjdF9GdW5jKVByb2plY3RfeDsKKyAgICBlbHNlIGlmICggZXhjLT5HUy5kdWFsVmVjdG9yLnkgPT0gMHg0MDAwICkKKyAgICAgIGV4Yy0+ZnVuY19kdWFscHJvaiA9IChUVF9Qcm9qZWN0X0Z1bmMpUHJvamVjdF95OwogICAgIGVsc2UKLSAgICAgIENVUi5mdW5jX2R1YWxwcm9qID0gKFRUX1Byb2plY3RfRnVuYylEdWFsX1Byb2plY3Q7CisgICAgICBleGMtPmZ1bmNfZHVhbHByb2ogPSAoVFRfUHJvamVjdF9GdW5jKUR1YWxfUHJvamVjdDsKIAotICAgIENVUi5mdW5jX21vdmUgICAgICA9IChUVF9Nb3ZlX0Z1bmMpRGlyZWN0X01vdmU7Ci0gICAgQ1VSLmZ1bmNfbW92ZV9vcmlnID0gKFRUX01vdmVfRnVuYylEaXJlY3RfTW92ZV9PcmlnOworICAgIGV4Yy0+ZnVuY19tb3ZlICAgICAgPSAoVFRfTW92ZV9GdW5jKURpcmVjdF9Nb3ZlOworICAgIGV4Yy0+ZnVuY19tb3ZlX29yaWcgPSAoVFRfTW92ZV9GdW5jKURpcmVjdF9Nb3ZlX09yaWc7CiAKLSAgICBpZiAoIENVUi5GX2RvdF9QID09IDB4NDAwMEwgKQorICAgIGlmICggZXhjLT5GX2RvdF9QID09IDB4NDAwMEwgKQogICAgIHsKLSAgICAgIGlmICggQ1VSLkdTLmZyZWVWZWN0b3IueCA9PSAweDQwMDAgKQorICAgICAgaWYgKCBleGMtPkdTLmZyZWVWZWN0b3IueCA9PSAweDQwMDAgKQogICAgICAgewotICAgICAgICBDVVIuZnVuY19tb3ZlICAgICAgPSAoVFRfTW92ZV9GdW5jKURpcmVjdF9Nb3ZlX1g7Ci0gICAgICAgIENVUi5mdW5jX21vdmVfb3JpZyA9IChUVF9Nb3ZlX0Z1bmMpRGlyZWN0X01vdmVfT3JpZ19YOworICAgICAgICBleGMtPmZ1bmNfbW92ZSAgICAgID0gKFRUX01vdmVfRnVuYylEaXJlY3RfTW92ZV9YOworICAgICAgICBleGMtPmZ1bmNfbW92ZV9vcmlnID0gKFRUX01vdmVfRnVuYylEaXJlY3RfTW92ZV9PcmlnX1g7CiAgICAgICB9Ci0gICAgICBlbHNlIGlmICggQ1VSLkdTLmZyZWVWZWN0b3IueSA9PSAweDQwMDAgKQorICAgICAgZWxzZSBpZiAoIGV4Yy0+R1MuZnJlZVZlY3Rvci55ID09IDB4NDAwMCApCiAgICAgICB7Ci0gICAgICAgIENVUi5mdW5jX21vdmUgICAgICA9IChUVF9Nb3ZlX0Z1bmMpRGlyZWN0X01vdmVfWTsKLSAgICAgICAgQ1VSLmZ1bmNfbW92ZV9vcmlnID0gKFRUX01vdmVfRnVuYylEaXJlY3RfTW92ZV9PcmlnX1k7CisgICAgICAgIGV4Yy0+ZnVuY19tb3ZlICAgICAgPSAoVFRfTW92ZV9GdW5jKURpcmVjdF9Nb3ZlX1k7CisgICAgICAgIGV4Yy0+ZnVuY19tb3ZlX29yaWcgPSAoVFRfTW92ZV9GdW5jKURpcmVjdF9Nb3ZlX09yaWdfWTsKICAgICAgIH0KICAgICB9CiAKICAgICAvKiBhdCBzbWFsbCBzaXplcywgRl9kb3RfUCBjYW4gYmVjb21lIHRvbyBzbWFsbCwgcmVzdWx0aW5nICAgKi8KICAgICAvKiBpbiBvdmVyZmxvd3MgYW5kIGBzcGlrZXMnIGluIGEgbnVtYmVyIG9mIGdseXBocyBsaWtlIGB3Jy4gKi8KIAotICAgIGlmICggRlRfQUJTKCBDVVIuRl9kb3RfUCApIDwgMHg0MDBMICkKLSAgICAgIENVUi5GX2RvdF9QID0gMHg0MDAwTDsKKyAgICBpZiAoIEZUX0FCUyggZXhjLT5GX2RvdF9QICkgPCAweDQwMEwgKQorICAgICAgZXhjLT5GX2RvdF9QID0gMHg0MDAwTDsKIAogICAgIC8qIERpc2FibGUgY2FjaGVkIGFzcGVjdCByYXRpbyAqLwotICAgIENVUi50dF9tZXRyaWNzLnJhdGlvID0gMDsKKyAgICBleGMtPnR0X21ldHJpY3MucmF0aW8gPSAwOwogICB9CiAKIApAQCAtMjcwMCwzNiArMjU2NSwzMSBAQAogICAvKiAgICBSZXR1cm5zIEZBSUxVUkUgaWYgYSB2ZWN0b3IgcGFyYW1ldGVyIGlzIHplcm8uICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbiBjYXNlIFZ4IGFuZCBWeSBhcmUgYm90aCB6ZXJvLCBOb3JtYWxpemUoKSByZXR1cm5zIFNVQ0NFU1MsIGFuZCAgKi8KKyAgLyogICAgSW4gY2FzZSBWeCBhbmQgVnkgYXJlIGJvdGggemVybywgYE5vcm1hbGl6ZScgcmV0dXJucyBTVUNDRVNTLCBhbmQgICovCiAgIC8qICAgIFIgaXMgdW5kZWZpbmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIEZUX0Jvb2wKLSAgTm9ybWFsaXplKCBFWEVDX09QXyBGVF9GMjZEb3Q2ICAgICAgVngsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIFZ5LAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VuaXRWZWN0b3IqICBSICkKKyAgTm9ybWFsaXplKCBGVF9GMjZEb3Q2ICAgICAgVngsCisgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIFZ5LAorICAgICAgICAgICAgIEZUX1VuaXRWZWN0b3IqICBSICkKICAgewotICAgIEZUX0YyNkRvdDYgIFc7Ci0KLSAgICBGVF9VTlVTRURfRVhFQzsKKyAgICBGVF9WZWN0b3IgVjsKIAogCi0gICAgaWYgKCBGVF9BQlMoIFZ4ICkgPCAweDQwMDBMICYmIEZUX0FCUyggVnkgKSA8IDB4NDAwMEwgKQorICAgIGlmICggVnggPT0gMCAmJiBWeSA9PSAwICkKICAgICB7Ci0gICAgICBpZiAoIFZ4ID09IDAgJiYgVnkgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIC8qIFhYWDogVU5ET0NVTUVOVEVEISBJdCBzZWVtcyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIHRyeSAgICovCi0gICAgICAgIC8qICAgICAgdG8gbm9ybWFsaXplIHRoZSB2ZWN0b3IgKDAsMCkuICBSZXR1cm4gaW1tZWRpYXRlbHkuICovCi0gICAgICAgIHJldHVybiBTVUNDRVNTOwotICAgICAgfQotCi0gICAgICBWeCAqPSAweDQwMDA7Ci0gICAgICBWeSAqPSAweDQwMDA7CisgICAgICAvKiBYWFg6IFVORE9DVU1FTlRFRCEgSXQgc2VlbXMgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byB0cnkgICAqLworICAgICAgLyogICAgICB0byBub3JtYWxpemUgdGhlIHZlY3RvciAoMCwwKS4gIFJldHVybiBpbW1lZGlhdGVseS4gKi8KKyAgICAgIHJldHVybiBTVUNDRVNTOwogICAgIH0KIAotICAgIFcgPSBGVF9IeXBvdCggVngsIFZ5ICk7CisgICAgVi54ID0gVng7CisgICAgVi55ID0gVnk7CiAKLSAgICBSLT54ID0gKEZUX0YyRG90MTQpVFRfRGl2Rml4MTQoIFZ4LCBXICk7Ci0gICAgUi0+eSA9IChGVF9GMkRvdDE0KVRUX0RpdkZpeDE0KCBWeSwgVyApOworICAgIEZUX1ZlY3Rvcl9Ob3JtTGVuKCAmViApOworCisgICAgUi0+eCA9IChGVF9GMkRvdDE0KSggVi54IC8gNCApOworICAgIFItPnkgPSAoRlRfRjJEb3QxNCkoIFYueSAvIDQgKTsKIAogICAgIHJldHVybiBTVUNDRVNTOwogICB9CkBAIC0yNzQyLDEwNjUgKzI2MDIsMTIgQEAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAotICBzdGF0aWMgRlRfQm9vbAotICBJbnNfU3hWVEwoIEVYRUNfT1BfIEZUX1VTaG9ydCAgICAgICBhSWR4MSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICAgYUlkeDIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIGFPcGMsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVW5pdFZlY3RvciogIFZlYyApCi0gIHsKLSAgICBGVF9Mb25nICAgICBBLCBCLCBDOwotICAgIEZUX1ZlY3RvciogIHAxOwotICAgIEZUX1ZlY3RvciogIHAyOwotCi0KLSAgICBpZiAoIEJPVU5EUyggYUlkeDEsIENVUi56cDIubl9wb2ludHMgKSB8fAotICAgICAgICAgQk9VTkRTKCBhSWR4MiwgQ1VSLnpwMS5uX3BvaW50cyApICkKLSAgICB7Ci0gICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICByZXR1cm4gRkFJTFVSRTsKLSAgICB9Ci0KLSAgICBwMSA9IENVUi56cDEuY3VyICsgYUlkeDI7Ci0gICAgcDIgPSBDVVIuenAyLmN1ciArIGFJZHgxOwotCi0gICAgQSA9IHAxLT54IC0gcDItPng7Ci0gICAgQiA9IHAxLT55IC0gcDItPnk7Ci0KLSAgICAvKiBJZiBwMSA9PSBwMiwgU1BWVEwgYW5kIFNGVlRMIGJlaGF2ZSB0aGUgc2FtZSBhcyAqLwotICAgIC8qIFNQVlRDQVtYXSBhbmQgU0ZWVENBW1hdLCByZXNwZWN0aXZlbHkuICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBDb25maXJtZWQgYnkgR3JlZyBIaXRjaGNvY2suICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgaWYgKCBBID09IDAgJiYgQiA9PSAwICkKLSAgICB7Ci0gICAgICBBICAgID0gMHg0MDAwOwotICAgICAgYU9wYyA9IDA7Ci0gICAgfQotCi0gICAgaWYgKCAoIGFPcGMgJiAxICkgIT0gMCApCi0gICAgewotICAgICAgQyA9ICBCOyAgIC8qIGNvdW50ZXIgY2xvY2t3aXNlIHJvdGF0aW9uICovCi0gICAgICBCID0gIEE7Ci0gICAgICBBID0gLUM7Ci0gICAgfQotCi0gICAgTk9STWFsaXplKCBBLCBCLCBWZWMgKTsKLQotICAgIHJldHVybiBTVUNDRVNTOwotICB9Ci0KLQotICAvKiBXaGVuIG5vdCB1c2luZyB0aGUgYmlnIHN3aXRjaCBzdGF0ZW1lbnRzLCB0aGUgaW50ZXJwcmV0ZXIgdXNlcyBhICovCi0gIC8qIGNhbGwgdGFibGUgZGVmaW5lZCBsYXRlciBiZWxvdyBpbiB0aGlzIHNvdXJjZS4gIEVhY2ggb3Bjb2RlIG11c3QgKi8KLSAgLyogdGh1cyBoYXZlIGEgY29ycmVzcG9uZGluZyBmdW5jdGlvbiwgZXZlbiB0cml2aWFsIG9uZXMuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZXkgYXJlIGFsbCBkZWZpbmVkIHRoZXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBET19TVlRDQSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9TaG9ydCAgQSwgQjsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBBID0gKEZUX1Nob3J0KSggQ1VSLm9wY29kZSAmIDEgKSA8PCAxNDsgXAotICAgIEIgPSBBIF4gKEZUX1Nob3J0KTB4NDAwMDsgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDVVIuR1MuZnJlZVZlY3Rvci54ID0gQTsgICAgICAgICAgICAgICAgXAotICAgIENVUi5HUy5wcm9qVmVjdG9yLnggPSBBOyAgICAgICAgICAgICAgICBcCi0gICAgQ1VSLkdTLmR1YWxWZWN0b3IueCA9IEE7ICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENVUi5HUy5mcmVlVmVjdG9yLnkgPSBCOyAgICAgICAgICAgICAgICBcCi0gICAgQ1VSLkdTLnByb2pWZWN0b3IueSA9IEI7ICAgICAgICAgICAgICAgIFwKLSAgICBDVVIuR1MuZHVhbFZlY3Rvci55ID0gQjsgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ09NUFVURV9GdW5jcygpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0KLSNkZWZpbmUgRE9fU1BWVENBICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfU2hvcnQgIEEsIEI7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQSA9IChGVF9TaG9ydCkoIENVUi5vcGNvZGUgJiAxICkgPDwgMTQ7IFwKLSAgICBCID0gQSBeIChGVF9TaG9ydCkweDQwMDA7ICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ1VSLkdTLnByb2pWZWN0b3IueCA9IEE7ICAgICAgICAgICAgICAgIFwKLSAgICBDVVIuR1MuZHVhbFZlY3Rvci54ID0gQTsgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ1VSLkdTLnByb2pWZWN0b3IueSA9IEI7ICAgICAgICAgICAgICAgIFwKLSAgICBDVVIuR1MuZHVhbFZlY3Rvci55ID0gQjsgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgR1VFU1NfVkVDVE9SKCBmcmVlVmVjdG9yICk7ICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENPTVBVVEVfRnVuY3MoKTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotCi0jZGVmaW5lIERPX1NGVlRDQSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1Nob3J0ICBBLCBCOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEEgPSAoRlRfU2hvcnQpKCBDVVIub3Bjb2RlICYgMSApIDw8IDE0OyBcCi0gICAgQiA9IEEgXiAoRlRfU2hvcnQpMHg0MDAwOyAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENVUi5HUy5mcmVlVmVjdG9yLnggPSBBOyAgICAgICAgICAgICAgICBcCi0gICAgQ1VSLkdTLmZyZWVWZWN0b3IueSA9IEI7ICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEdVRVNTX1ZFQ1RPUiggcHJvalZlY3RvciApOyAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDT01QVVRFX0Z1bmNzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLQotI2RlZmluZSBET19TUFZUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggSU5TX1N4VlRMKCAoRlRfVVNob3J0KWFyZ3NbMV0sICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAoRlRfVVNob3J0KWFyZ3NbMF0sICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICBDVVIub3Bjb2RlLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAmQ1VSLkdTLnByb2pWZWN0b3IgKSA9PSBTVUNDRVNTICkgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQ1VSLkdTLmR1YWxWZWN0b3IgPSBDVVIuR1MucHJvalZlY3RvcjsgICAgICAgICAgXAotICAgICAgR1VFU1NfVkVDVE9SKCBmcmVlVmVjdG9yICk7ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQ09NUFVURV9GdW5jcygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KLQotCi0jZGVmaW5lIERPX1NGVlRMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBJTlNfU3hWVEwoIChGVF9VU2hvcnQpYXJnc1sxXSwgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgIChGVF9VU2hvcnQpYXJnc1swXSwgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgIENVUi5vcGNvZGUsICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICZDVVIuR1MuZnJlZVZlY3RvciApID09IFNVQ0NFU1MgKSBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBHVUVTU19WRUNUT1IoIHByb2pWZWN0b3IgKTsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBDT01QVVRFX0Z1bmNzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotCi0KLSNkZWZpbmUgRE9fU0ZWVFBWICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgR1VFU1NfVkVDVE9SKCBwcm9qVmVjdG9yICk7ICAgICAgICAgICAgXAotICAgIENVUi5HUy5mcmVlVmVjdG9yID0gQ1VSLkdTLnByb2pWZWN0b3I7IFwKLSAgICBDT01QVVRFX0Z1bmNzKCk7Ci0KLQotI2RlZmluZSBET19TUFZGUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1Nob3J0ICBTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0xvbmcgICBYLCBZOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIC8qIE9ubHkgdXNlIGxvdyAxNmJpdHMsIHRoZW4gc2lnbiBleHRlbmQgKi8gXAotICAgIFMgPSAoRlRfU2hvcnQpYXJnc1sxXTsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFkgPSAoRlRfTG9uZylTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFMgPSAoRlRfU2hvcnQpYXJnc1swXTsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFggPSAoRlRfTG9uZylTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE5PUk1hbGl6ZSggWCwgWSwgJkNVUi5HUy5wcm9qVmVjdG9yICk7ICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENVUi5HUy5kdWFsVmVjdG9yID0gQ1VSLkdTLnByb2pWZWN0b3I7ICAgICAgXAotICAgIEdVRVNTX1ZFQ1RPUiggZnJlZVZlY3RvciApOyAgICAgICAgICAgICAgICAgXAotICAgIENPTVBVVEVfRnVuY3MoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLQotI2RlZmluZSBET19TRlZGUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1Nob3J0ICBTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0xvbmcgICBYLCBZOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIC8qIE9ubHkgdXNlIGxvdyAxNmJpdHMsIHRoZW4gc2lnbiBleHRlbmQgKi8gXAotICAgIFMgPSAoRlRfU2hvcnQpYXJnc1sxXTsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFkgPSAoRlRfTG9uZylTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFMgPSAoRlRfU2hvcnQpYXJnc1swXTsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFggPSBTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE5PUk1hbGl6ZSggWCwgWSwgJkNVUi5HUy5mcmVlVmVjdG9yICk7ICAgICAgXAotICAgIEdVRVNTX1ZFQ1RPUiggcHJvalZlY3RvciApOyAgICAgICAgICAgICAgICAgXAotICAgIENPTVBVVEVfRnVuY3MoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HCi0jZGVmaW5lIERPX0dQViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggQ1VSLmZhY2UtPnVucGF0ZW50ZWRfaGludGluZyApICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBhcmdzWzBdID0gQ1VSLkdTLmJvdGhfeF9heGlzID8gMHg0MDAwIDogMDsgXAotICAgICAgYXJnc1sxXSA9IENVUi5HUy5ib3RoX3hfYXhpcyA/IDAgOiAweDQwMDA7IFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGFyZ3NbMF0gPSBDVVIuR1MucHJvalZlY3Rvci54OyAgICAgICAgICAgICBcCi0gICAgICBhcmdzWzFdID0gQ1VSLkdTLnByb2pWZWN0b3IueTsgICAgICAgICAgICAgXAotICAgIH0KLSNlbHNlCi0jZGVmaW5lIERPX0dQViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGFyZ3NbMF0gPSBDVVIuR1MucHJvalZlY3Rvci54OyAgICAgICAgICAgICAgIFwKLSAgICBhcmdzWzFdID0gQ1VSLkdTLnByb2pWZWN0b3IueTsKLSNlbmRpZgotCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1VOUEFURU5URURfSElOVElORwotI2RlZmluZSBET19HRlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIENVUi5mYWNlLT51bnBhdGVudGVkX2hpbnRpbmcgKSAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgYXJnc1swXSA9IENVUi5HUy5ib3RoX3hfYXhpcyA/IDB4NDAwMCA6IDA7IFwKLSAgICAgIGFyZ3NbMV0gPSBDVVIuR1MuYm90aF94X2F4aXMgPyAwIDogMHg0MDAwOyBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBhcmdzWzBdID0gQ1VSLkdTLmZyZWVWZWN0b3IueDsgICAgICAgICAgICAgXAotICAgICAgYXJnc1sxXSA9IENVUi5HUy5mcmVlVmVjdG9yLnk7ICAgICAgICAgICAgIFwKLSAgICB9Ci0jZWxzZQotI2RlZmluZSBET19HRlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhcmdzWzBdID0gQ1VSLkdTLmZyZWVWZWN0b3IueDsgICAgICAgICAgICAgICBcCi0gICAgYXJnc1sxXSA9IENVUi5HUy5mcmVlVmVjdG9yLnk7Ci0jZW5kaWYKLQotCi0jZGVmaW5lIERPX1NSUDAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENVUi5HUy5ycDAgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0KLQotI2RlZmluZSBET19TUlAxICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDVVIuR1MucnAxID0gKEZUX1VTaG9ydClhcmdzWzBdOwotCi0KLSNkZWZpbmUgRE9fU1JQMiAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ1VSLkdTLnJwMiA9IChGVF9VU2hvcnQpYXJnc1swXTsKLQotCi0jZGVmaW5lIERPX1JUSEcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDVVIuR1Mucm91bmRfc3RhdGUgPSBUVF9Sb3VuZF9Ub19IYWxmX0dyaWQ7ICAgICAgICAgXAotICAgIENVUi5mdW5jX3JvdW5kID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfVG9fSGFsZl9HcmlkOwotCi0KLSNkZWZpbmUgRE9fUlRHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDVVIuR1Mucm91bmRfc3RhdGUgPSBUVF9Sb3VuZF9Ub19HcmlkOyAgICAgICAgIFwKLSAgICBDVVIuZnVuY19yb3VuZCA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX1RvX0dyaWQ7Ci0KLQotI2RlZmluZSBET19SVERHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDVVIuR1Mucm91bmRfc3RhdGUgPSBUVF9Sb3VuZF9Ub19Eb3VibGVfR3JpZDsgICAgICAgICBcCi0gICAgQ1VSLmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9Ub19Eb3VibGVfR3JpZDsKLQotCi0jZGVmaW5lIERPX1JVVEcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ1VSLkdTLnJvdW5kX3N0YXRlID0gVFRfUm91bmRfVXBfVG9fR3JpZDsgICAgICAgICBcCi0gICAgQ1VSLmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9VcF9Ub19HcmlkOwotCi0KLSNkZWZpbmUgRE9fUkRURyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENVUi5HUy5yb3VuZF9zdGF0ZSA9IFRUX1JvdW5kX0Rvd25fVG9fR3JpZDsgICAgICAgICBcCi0gICAgQ1VSLmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9Eb3duX1RvX0dyaWQ7Ci0KLQotI2RlZmluZSBET19ST0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENVUi5HUy5yb3VuZF9zdGF0ZSA9IFRUX1JvdW5kX09mZjsgICAgICAgICAgXAotICAgIENVUi5mdW5jX3JvdW5kID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfTm9uZTsKLQotCi0jZGVmaW5lIERPX1NST1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFNFVF9TdXBlclJvdW5kKCAweDQwMDAsIGFyZ3NbMF0gKTsgICAgICAgICAgIFwKLSAgICBDVVIuR1Mucm91bmRfc3RhdGUgPSBUVF9Sb3VuZF9TdXBlcjsgICAgICAgICBcCi0gICAgQ1VSLmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9TdXBlcjsKLQotCi0jZGVmaW5lIERPX1M0NVJPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFNFVF9TdXBlclJvdW5kKCAweDJENDEsIGFyZ3NbMF0gKTsgICAgICAgICAgICAgIFwKLSAgICBDVVIuR1Mucm91bmRfc3RhdGUgPSBUVF9Sb3VuZF9TdXBlcl80NTsgICAgICAgICBcCi0gICAgQ1VSLmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9TdXBlcl80NTsKLQotCi0jZGVmaW5lIERPX1NMT09QICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIGFyZ3NbMF0gPCAwICkgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIEJhZF9Bcmd1bWVudCApOyBcCi0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIENVUi5HUy5sb29wID0gYXJnc1swXTsKLQotCi0jZGVmaW5lIERPX1NNRCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ1VSLkdTLm1pbmltdW1fZGlzdGFuY2UgPSBhcmdzWzBdOwotCi0KLSNkZWZpbmUgRE9fU0NWVENJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDVVIuR1MuY29udHJvbF92YWx1ZV9jdXRpbiA9IChGVF9GMjZEb3Q2KWFyZ3NbMF07Ci0KLQotI2RlZmluZSBET19TU1dDSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ1VSLkdTLnNpbmdsZV93aWR0aF9jdXRpbiA9IChGVF9GMjZEb3Q2KWFyZ3NbMF07Ci0KLQotI2RlZmluZSBET19TU1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDVVIuR1Muc2luZ2xlX3dpZHRoX3ZhbHVlID0gRlRfTXVsRml4KCBhcmdzWzBdLCAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLnR0X21ldHJpY3Muc2NhbGUgKTsKLQotCi0jZGVmaW5lIERPX0ZMSVBPTiAgICAgICAgICAgIFwKLSAgICBDVVIuR1MuYXV0b19mbGlwID0gVFJVRTsKLQotCi0jZGVmaW5lIERPX0ZMSVBPRkYgICAgICAgICAgICBcCi0gICAgQ1VSLkdTLmF1dG9fZmxpcCA9IEZBTFNFOwotCi0KLSNkZWZpbmUgRE9fU0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENVUi5HUy5kZWx0YV9iYXNlID0gKEZUX1VTaG9ydClhcmdzWzBdOwotCi0KLSNkZWZpbmUgRE9fU0RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggKEZUX1VMb25nKWFyZ3NbMF0gPiA2VUwgKSAgICAgICAgICAgICBcCi0gICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggQmFkX0FyZ3VtZW50ICk7ICAgIFwKLSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQ1VSLkdTLmRlbHRhX3NoaWZ0ID0gKEZUX1VTaG9ydClhcmdzWzBdOwotCi0KLSNkZWZpbmUgRE9fTUQgIC8qIG5vdGhpbmcgKi8KLQotCi0jZGVmaW5lIERPX01QUEVNICAgICAgICAgICAgICBcCi0gICAgYXJnc1swXSA9IENVUl9GdW5jX2N1cl9wcGVtKCk7Ci0KLQotICAvKiBOb3RlOiBUaGUgcG9pbnRTaXplIHNob3VsZCBiZSBpcnJlbGV2YW50IGluIGEgZ2l2ZW4gZm9udCBwcm9ncmFtOyAqLwotICAvKiAgICAgICB3ZSB0aHVzIGRlY2lkZSB0byByZXR1cm4gb25seSB0aGUgcHBlbS4gICAgICAgICAgICAgICAgICAgICAqLwotI2lmIDAKLQotI2RlZmluZSBET19NUFMgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhcmdzWzBdID0gQ1VSLm1ldHJpY3MucG9pbnRTaXplOwotCi0jZWxzZQotCi0jZGVmaW5lIERPX01QUyAgICAgICAgICAgICAgICBcCi0gICAgYXJnc1swXSA9IENVUl9GdW5jX2N1cl9wcGVtKCk7Ci0KLSNlbmRpZiAvKiAwICovCi0KLQotI2RlZmluZSBET19EVVAgICAgICAgICBcCi0gICAgYXJnc1sxXSA9IGFyZ3NbMF07Ci0KLQotI2RlZmluZSBET19DTEVBUiAgICAgXAotICAgIENVUi5uZXdfdG9wID0gMDsKLQotCi0jZGVmaW5lIERPX1NXQVAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0xvbmcgIEw7ICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEwgICAgICAgPSBhcmdzWzBdOyBcCi0gICAgYXJnc1swXSA9IGFyZ3NbMV07IFwKLSAgICBhcmdzWzFdID0gTDsgICAgICAgXAotICB9Ci0KLQotI2RlZmluZSBET19ERVBUSCAgICAgICBcCi0gICAgYXJnc1swXSA9IENVUi50b3A7Ci0KLQotI2RlZmluZSBET19DSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0xvbmcgIEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEwgPSBhcmdzWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggTCA8PSAwIHx8IEwgPiBDVVIuYXJncyApICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApICAgICAgICAgICAgICAgICAgXAotICAgICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsgXAotICAgICAgYXJnc1swXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgYXJnc1swXSA9IENVUi5zdGFja1tDVVIuYXJncyAtIExdOyAgICAgICAgICAgXAotICB9Ci0KLQotI2RlZmluZSBET19KUk9UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIGFyZ3NbMV0gIT0gMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKCBhcmdzWzBdID09IDAgJiYgQ1VSLmFyZ3MgPT0gMCApICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIEJhZF9Bcmd1bWVudCApOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBDVVIuSVAgKz0gYXJnc1swXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKCBDVVIuSVAgPCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKLSAgICAgICAgICAgKCBDVVIuY2FsbFRvcCA+IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgICBcCi0gICAgICAgICAgICAgQ1VSLklQID4gQ1VSLmNhbGxTdGFja1tDVVIuY2FsbFRvcCAtIDFdLkRlZi0+ZW5kICkgKSAgXAotICAgICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggQmFkX0FyZ3VtZW50ICk7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIENVUi5zdGVwX2lucyA9IEZBTFNFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotCi0KLSNkZWZpbmUgRE9fSk1QUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggYXJnc1swXSA9PSAwICYmIENVUi5hcmdzID09IDAgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggQmFkX0FyZ3VtZW50ICk7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDVVIuSVAgKz0gYXJnc1swXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggQ1VSLklQIDwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCi0gICAgICAgICAoIENVUi5jYWxsVG9wID4gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAgIFwKLSAgICAgICAgICAgQ1VSLklQID4gQ1VSLmNhbGxTdGFja1tDVVIuY2FsbFRvcCAtIDFdLkRlZi0+ZW5kICkgKSAgXAotICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIEJhZF9Bcmd1bWVudCApOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ1VSLnN0ZXBfaW5zID0gRkFMU0U7Ci0KLQotI2RlZmluZSBET19KUk9GICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIGFyZ3NbMV0gPT0gMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKCBhcmdzWzBdID09IDAgJiYgQ1VSLmFyZ3MgPT0gMCApICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIEJhZF9Bcmd1bWVudCApOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBDVVIuSVAgKz0gYXJnc1swXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKCBDVVIuSVAgPCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKLSAgICAgICAgICAgKCBDVVIuY2FsbFRvcCA+IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgICBcCi0gICAgICAgICAgICAgQ1VSLklQID4gQ1VSLmNhbGxTdGFja1tDVVIuY2FsbFRvcCAtIDFdLkRlZi0+ZW5kICkgKSAgXAotICAgICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggQmFkX0FyZ3VtZW50ICk7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIENVUi5zdGVwX2lucyA9IEZBTFNFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotCi0KLSNkZWZpbmUgRE9fTFQgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXJnc1swXSA9ICggYXJnc1swXSA8IGFyZ3NbMV0gKTsKLQotCi0jZGVmaW5lIERPX0xURVEgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhcmdzWzBdID0gKCBhcmdzWzBdIDw9IGFyZ3NbMV0gKTsKLQotCi0jZGVmaW5lIERPX0dUICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGFyZ3NbMF0gPSAoIGFyZ3NbMF0gPiBhcmdzWzFdICk7Ci0KLQotI2RlZmluZSBET19HVEVRICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXJnc1swXSA9ICggYXJnc1swXSA+PSBhcmdzWzFdICk7Ci0KLQotI2RlZmluZSBET19FUSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXJnc1swXSA9ICggYXJnc1swXSA9PSBhcmdzWzFdICk7Ci0KLQotI2RlZmluZSBET19ORVEgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXJnc1swXSA9ICggYXJnc1swXSAhPSBhcmdzWzFdICk7Ci0KLQotI2RlZmluZSBET19PREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhcmdzWzBdID0gKCAoIENVUl9GdW5jX3JvdW5kKCBhcmdzWzBdLCAwICkgJiAxMjcgKSA9PSA2NCApOwotCi0KLSNkZWZpbmUgRE9fRVZFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhcmdzWzBdID0gKCAoIENVUl9GdW5jX3JvdW5kKCBhcmdzWzBdLCAwICkgJiAxMjcgKSA9PSAwICk7Ci0KLQotI2RlZmluZSBET19BTkQgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXJnc1swXSA9ICggYXJnc1swXSAmJiBhcmdzWzFdICk7Ci0KLQotI2RlZmluZSBET19PUiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXJnc1swXSA9ICggYXJnc1swXSB8fCBhcmdzWzFdICk7Ci0KLQotI2RlZmluZSBET19OT1QgICAgICAgICAgXAotICAgIGFyZ3NbMF0gPSAhYXJnc1swXTsKLQotCi0jZGVmaW5lIERPX0FERCAgICAgICAgICBcCi0gICAgYXJnc1swXSArPSBhcmdzWzFdOwotCi0KLSNkZWZpbmUgRE9fU1VCICAgICAgICAgIFwKLSAgICBhcmdzWzBdIC09IGFyZ3NbMV07Ci0KLQotI2RlZmluZSBET19ESVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIGFyZ3NbMV0gPT0gMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggRGl2aWRlX0J5X1plcm8gKTsgICAgICAgICAgICAgICAgXAotICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGFyZ3NbMF0gPSBGVF9NdWxEaXZfTm9fUm91bmQoIGFyZ3NbMF0sIDY0TCwgYXJnc1sxXSApOwotCi0KLSNkZWZpbmUgRE9fTVVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGFyZ3NbMF0gPSBGVF9NdWxEaXYoIGFyZ3NbMF0sIGFyZ3NbMV0sIDY0TCApOwotCi0KLSNkZWZpbmUgRE9fQUJTICAgICAgICAgICAgICAgICAgIFwKLSAgICBhcmdzWzBdID0gRlRfQUJTKCBhcmdzWzBdICk7Ci0KLQotI2RlZmluZSBET19ORUcgICAgICAgICAgXAotICAgIGFyZ3NbMF0gPSAtYXJnc1swXTsKLQotCi0jZGVmaW5lIERPX0ZMT09SICAgIFwKLSAgICBhcmdzWzBdID0gRlRfUElYX0ZMT09SKCBhcmdzWzBdICk7Ci0KLQotI2RlZmluZSBET19DRUlMSU5HICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXJnc1swXSA9IEZUX1BJWF9DRUlMKCBhcmdzWzBdICk7Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLQotI2RlZmluZSBET19SUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIEZUX1VMb25nICBJID0gKEZUX1VMb25nKWFyZ3NbMF07ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIGlmICggQk9VTkRTTCggSSwgQ1VSLnN0b3JlU2l6ZSApICkgICAgICAgICAgICAgICAgICAgXAotICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBBUlJBWV9CT1VORF9FUlJPUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIGFyZ3NbMF0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgLyogc3VicGl4ZWwgaGludGluZyAtIGF2b2lkIFR5cGVtYW4gRHN0cm9rZSBhbmQgKi8gXAotICAgICAgIC8qIElTdHJva2UgYW5kIFZhY3Vmb3JtIHJvdW5kcyAgICAgICAgICAgICAgICAgICovIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgXAotICAgICAgICAgICAgQ1VSLmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFwKLSAgICAgICAgICAgICggKCBJID09IDI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICAgICBcCi0gICAgICAgICAgICAgICAgKCBDVVIuZmFjZS0+c3BoX2ZvdW5kX2Z1bmNfZmxhZ3MgJiAgICAgICAgXAotICAgICAgICAgICAgICAgICAgKCBTUEhfRkRFRl9TUEFDSU5HXzEgfCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgU1BIX0ZERUZfU1BBQ0lOR18yICkgICAgICAgICApICkgfHwgICBcCi0gICAgICAgICAgICAgICggSSA9PSAyMiAgICAgICAgICAgICAgICAgICAgICAmJiAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICggQ1VSLnNwaF9pbl9mdW5jX2ZsYWdzICAgICYgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgIFNQSF9GREVGX1RZUEVNQU5fU1RST0tFUyApICkgICAgICAgfHwgICBcCi0gICAgICAgICAgICAgICggSSA9PSA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAgICAgXAotICAgICAgICAgICAgICAgICggQ1VSLmZhY2UtPnNwaF9mb3VuZF9mdW5jX2ZsYWdzICYgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgIFNQSF9GREVGX1ZBQ1VGT1JNX1JPVU5EXzEgICAgICApICYmICAgICBcCi0gICAgICAgICAgICAgICAgICBDVVIuaXVwX2NhbGxlZCAgICAgICAgICAgICAgICAgICApICkgKSAgXAotICAgICAgICAgYXJnc1swXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBhcmdzWzBdID0gQ1VSLnN0b3JhZ2VbSV07ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIH0KLQotI2Vsc2UgLyogIVRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwotCi0jZGVmaW5lIERPX1JTICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgRlRfVUxvbmcgIEkgPSAoRlRfVUxvbmcpYXJnc1swXTsgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgaWYgKCBCT1VORFNMKCBJLCBDVVIuc3RvcmVTaXplICkgKSBcCi0gICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKSAgICAgIFwKLSAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBBUlJBWV9CT1VORF9FUlJPUjsgICAgICAgICAgICAgXAotICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBhcmdzWzBdID0gMDsgICAgICAgICAgICAgICAgICAgXAotICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgYXJnc1swXSA9IENVUi5zdG9yYWdlW0ldOyAgICAgICAgXAotICAgfQotCi0jZW5kaWYgLyogIVRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwotCi0KLSNkZWZpbmUgRE9fV1MgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBGVF9VTG9uZyAgSSA9IChGVF9VTG9uZylhcmdzWzBdOyAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBpZiAoIEJPVU5EU0woIEksIENVUi5zdG9yZVNpemUgKSApIFwKLSAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApICAgICAgXAotICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIEFSUkFZX0JPVU5EX0VSUk9SOyAgICAgICAgICAgICBcCi0gICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgQ1VSLnN0b3JhZ2VbSV0gPSBhcmdzWzFdOyAgICAgICAgXAotICAgfQotCi0KLSNkZWZpbmUgRE9fUkNWVCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIEZUX1VMb25nICBJID0gKEZUX1VMb25nKWFyZ3NbMF07ICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIGlmICggQk9VTkRTTCggSSwgQ1VSLmN2dFNpemUgKSApICAgIFwKLSAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKSAgICAgICBcCi0gICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIEFSUkFZX0JPVU5EX0VSUk9SOyAgICAgICAgICAgICAgXAotICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIGFyZ3NbMF0gPSAwOyAgICAgICAgICAgICAgICAgICAgXAotICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBhcmdzWzBdID0gQ1VSX0Z1bmNfcmVhZF9jdnQoIEkgKTsgXAotICAgfQotCi0KLSNkZWZpbmUgRE9fV0NWVFAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIEZUX1VMb25nICBJID0gKEZUX1VMb25nKWFyZ3NbMF07ICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIGlmICggQk9VTkRTTCggSSwgQ1VSLmN2dFNpemUgKSApICAgIFwKLSAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKSAgICAgICBcCi0gICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIEFSUkFZX0JPVU5EX0VSUk9SOyAgICAgICAgICAgICAgXAotICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIENVUl9GdW5jX3dyaXRlX2N2dCggSSwgYXJnc1sxXSApOyBcCi0gICB9Ci0KLQotI2RlZmluZSBET19XQ1ZURiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIEZUX1VMb25nICBJID0gKEZUX1VMb25nKWFyZ3NbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIGlmICggQk9VTkRTTCggSSwgQ1VSLmN2dFNpemUgKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgQVJSQVlfQk9VTkRfRVJST1I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBDVVIuY3Z0W0ldID0gRlRfTXVsRml4KCBhcmdzWzFdLCBDVVIudHRfbWV0cmljcy5zY2FsZSApOyBcCi0gICB9Ci0KLQotI2RlZmluZSBET19ERUJVRyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENVUi5lcnJvciA9IEZUX1RIUk9XKCBEZWJ1Z19PcENvZGUgKTsKLQotCi0jZGVmaW5lIERPX1JPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGFyZ3NbMF0gPSBDVVJfRnVuY19yb3VuZCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBhcmdzWzBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgQ1VSLnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1tDVVIub3Bjb2RlIC0gMHg2OF0gKTsKLQotCi0jZGVmaW5lIERPX05ST1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhcmdzWzBdID0gUk9VTkRfTm9uZSggYXJnc1swXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIudHRfbWV0cmljcy5jb21wZW5zYXRpb25zW0NVUi5vcGNvZGUgLSAweDZDXSApOwotCi0KLSNkZWZpbmUgRE9fTUFYICAgICAgICAgICAgICAgXAotICAgIGlmICggYXJnc1sxXSA+IGFyZ3NbMF0gKSBcCi0gICAgICBhcmdzWzBdID0gYXJnc1sxXTsKLQotCi0jZGVmaW5lIERPX01JTiAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIGFyZ3NbMV0gPCBhcmdzWzBdICkgXAotICAgICAgYXJnc1swXSA9IGFyZ3NbMV07Ci0KLQotI2lmbmRlZiBUVF9DT05GSUdfT1BUSU9OX0lOVEVSUFJFVEVSX1NXSVRDSAotCi0KLSN1bmRlZiAgQVJSQVlfQk9VTkRfRVJST1IKLSNkZWZpbmUgQVJSQVlfQk9VTkRfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7IFwKLSAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTVlRDQVthXTogICAgIFNldCAoRiBhbmQgUCkgVmVjdG9ycyB0byBDb29yZGluYXRlIEF4aXMgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDAwLTB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NWVENBKCBJTlNfQVJHICkKLSAgewotICAgIERPX1NWVENBCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1BWVENBW2FdOiAgICBTZXQgUFZlY3RvciB0byBDb29yZGluYXRlIEF4aXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgwMi0weDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TUFZUQ0EoIElOU19BUkcgKQotICB7Ci0gICAgRE9fU1BWVENBCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0ZWVENBW2FdOiAgICBTZXQgRlZlY3RvciB0byBDb29yZGluYXRlIEF4aXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgwNC0weDA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TRlZUQ0EoIElOU19BUkcgKQotICB7Ci0gICAgRE9fU0ZWVENBCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1BWVExbYV06ICAgICBTZXQgUFZlY3RvciBUbyBMaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgwNi0weDA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TUFZUTCggSU5TX0FSRyApCi0gIHsKLSAgICBET19TUFZUTAotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNGVlRMW2FdOiAgICAgU2V0IEZWZWN0b3IgVG8gTGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MDgtMHgwOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0ZWVEwoIElOU19BUkcgKQotICB7Ci0gICAgRE9fU0ZWVEwKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTRlZUUFZbXTogICAgIFNldCBGVmVjdG9yIFRvIFBWZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NGVlRQViggSU5TX0FSRyApCi0gIHsKLSAgICBET19TRlZUUFYKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTUFZGU1tdOiAgICAgIFNldCBQVmVjdG9yIEZyb20gU3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDBBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZjIuMTQgZjIuMTQgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NQVkZTKCBJTlNfQVJHICkKLSAgewotICAgIERPX1NQVkZTCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0ZWRlNbXTogICAgICBTZXQgRlZlY3RvciBGcm9tIFN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgwQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyLjE0IGYyLjE0IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TRlZGUyggSU5TX0FSRyApCi0gIHsKLSAgICBET19TRlZGUwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEdQVltdOiAgICAgICAgR2V0IFByb2plY3Rpb24gVmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBlZjIuMTQgLS0+IGVmMi4xNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfR1BWKCBJTlNfQVJHICkKLSAgewotICAgIERPX0dQVgotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogR0ZWW106ICAgICAgICBHZXQgRnJlZWRvbSBWZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgwRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGVmMi4xNCAtLT4gZWYyLjE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19HRlYoIElOU19BUkcgKQotICB7Ci0gICAgRE9fR0ZWCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1JQMFtdOiAgICAgICBTZXQgUmVmZXJlbmNlIFBvaW50IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TUlAwKCBJTlNfQVJHICkKLSAgewotICAgIERPX1NSUDAKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTUlAxW106ICAgICAgIFNldCBSZWZlcmVuY2UgUG9pbnQgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NSUDEoIElOU19BUkcgKQotICB7Ci0gICAgRE9fU1JQMQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNSUDJbXTogICAgICAgU2V0IFJlZmVyZW5jZSBQb2ludCAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU1JQMiggSU5TX0FSRyApCi0gIHsKLSAgICBET19TUlAyCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUlRIR1tdOiAgICAgICBSb3VuZCBUbyBIYWxmIEdyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19SVEhHKCBJTlNfQVJHICkKLSAgewotICAgIERPX1JUSEcKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBSVEdbXTogICAgICAgIFJvdW5kIFRvIEdyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1JURyggSU5TX0FSRyApCi0gIHsKLSAgICBET19SVEcKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qIFJUREdbXTogICAgICAgUm91bmQgVG8gRG91YmxlIEdyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4M0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfUlRERyggSU5TX0FSRyApCi0gIHsKLSAgICBET19SVERHCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiBSVVRHW106ICAgICAgIFJvdW5kIFVwIFRvIEdyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDdDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1JVVEcoIElOU19BUkcgKQotICB7Ci0gICAgRE9fUlVURwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJEVEdbXTogICAgICAgUm91bmQgRG93biBUbyBHcmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4N0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfUkRURyggSU5TX0FSRyApCi0gIHsKLSAgICBET19SRFRHCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUk9GRltdOiAgICAgICBSb3VuZCBPRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg3QSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19ST0ZGKCBJTlNfQVJHICkKLSAgewotICAgIERPX1JPRkYKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTUk9VTkRbXTogICAgIFN1cGVyIFJPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgRWludDggLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NST1VORCggSU5TX0FSRyApCi0gIHsKLSAgICBET19TUk9VTkQKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTNDVST1VORFtdOiAgIFN1cGVyIFJPVU5EIDQ1IGRlZ3JlZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDc3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1M0NVJPVU5EKCBJTlNfQVJHICkKLSAgewotICAgIERPX1M0NVJPVU5ECi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0xPT1BbXTogICAgICBTZXQgTE9PUCB2YXJpYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGludDMyPyAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TTE9PUCggSU5TX0FSRyApCi0gIHsKLSAgICBET19TTE9PUAotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNNRFtdOiAgICAgICAgU2V0IE1pbmltdW0gRGlzdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU01EKCBJTlNfQVJHICkKLSAgewotICAgIERPX1NNRAotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNDVlRDSVtdOiAgICAgU2V0IENvbnRyb2wgVmFsdWUgVGFibGUgQ3V0IEluICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0NWVENJKCBJTlNfQVJHICkKLSAgewotICAgIERPX1NDVlRDSQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNTV0NJW106ICAgICAgU2V0IFNpbmdsZSBXaWR0aCBDdXQgSW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU1NXQ0koIElOU19BUkcgKQotICB7Ci0gICAgRE9fU1NXQ0kKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTU1dbXTogICAgICAgIFNldCBTaW5nbGUgV2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDFGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgaW50MzI/IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NTVyggSU5TX0FSRyApCi0gIHsKLSAgICBET19TU1cKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGTElQT05bXTogICAgIFNldCBhdXRvLUZMSVAgdG8gT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0ZMSVBPTiggSU5TX0FSRyApCi0gIHsKLSAgICBET19GTElQT04KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGTElQT0ZGW106ICAgIFNldCBhdXRvLUZMSVAgdG8gT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0ZMSVBPRkYoIElOU19BUkcgKQotICB7Ci0gICAgRE9fRkxJUE9GRgotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNBTkdXW106ICAgICAgU2V0IEFOR2xlIFdlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4N0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0FOR1coIElOU19BUkcgKQotICB7Ci0gICAgLyogaW5zdHJ1Y3Rpb24gbm90IHN1cHBvcnRlZCBhbnltb3JlICovCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0RCW106ICAgICAgICBTZXQgRGVsdGEgQmFzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg1RSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TREIoIElOU19BUkcgKQotICB7Ci0gICAgRE9fU0RCCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0RTW106ICAgICAgICBTZXQgRGVsdGEgU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg1RiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TRFMoIElOU19BUkcgKQotICB7Ci0gICAgRE9fU0RTCi0gIH0KKyNkZWZpbmUgQVJSQVlfQk9VTkRfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsgXAorICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKIAogCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzgxMCw5ICsyNjE3LDEwIEBACiAgIC8qIFN0YWNrOiAgICAgICAgLS0+IEV1aW50MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX01QUEVNKCBJTlNfQVJHICkKKyAgSW5zX01QUEVNKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKICAgewotICAgIERPX01QUEVNCisgICAgYXJnc1swXSA9IGV4Yy0+ZnVuY19jdXJfcHBlbSggZXhjICk7CiAgIH0KIAogCkBAIC0zODIzLDIyICsyNjMxLDI5IEBACiAgIC8qIFN0YWNrOiAgICAgICAgLS0+IEV1aW50MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX01QUyggSU5TX0FSRyApCisgIEluc19NUFMoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKICAgewotICAgIERPX01QUworICAgIC8qIE5vdGU6IFRoZSBwb2ludCBzaXplIHNob3VsZCBiZSBpcnJlbGV2YW50IGluIGEgZ2l2ZW4gZm9udCBwcm9ncmFtOyAqLworICAgIC8qICAgICAgIHdlIHRodXMgZGVjaWRlIHRvIHJldHVybiBvbmx5IHRoZSBQUEVNIHZhbHVlLiAgICAgICAgICAgICAgICAqLworI2lmIDAKKyAgICBhcmdzWzBdID0gZXhjLT5tZXRyaWNzLnBvaW50U2l6ZTsKKyNlbHNlCisgICAgYXJnc1swXSA9IGV4Yy0+ZnVuY19jdXJfcHBlbSggZXhjICk7CisjZW5kaWYKICAgfQogCiAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEVVBbXTogICAgICAgIERVUGxpY2F0ZSB0aGUgdG9wIHN0YWNrJ3MgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRFVQW106ICAgICAgICBEVVBsaWNhdGUgdGhlIHN0YWNrJ3MgdG9wIGVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qIE9wY29kZSByYW5nZTogMHgyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiBTdGFjazogICAgICAgIFN0a0VsdCAtLT4gU3RrRWx0IFN0a0VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIEluc19EVVAoIElOU19BUkcgKQorICBJbnNfRFVQKCBGVF9Mb25nKiAgYXJncyApCiAgIHsKLSAgICBET19EVVAKKyAgICBhcmdzWzFdID0gYXJnc1swXTsKICAgfQogCiAKQEAgLTM4NDksNyArMjY2NCw3IEBACiAgIC8qIFN0YWNrOiAgICAgICAgU3RrRWx0IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX1BPUCggSU5TX0FSRyApCisgIEluc19QT1AoIHZvaWQgKQogICB7CiAgICAgLyogbm90aGluZyB0byBkbyAqLwogICB9CkBAIC0zODYyLDkgKzI2NzcsOSBAQAogICAvKiBTdGFjazogICAgICAgIFN0a0VsdC4uLiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIEluc19DTEVBUiggSU5TX0FSRyApCisgIEluc19DTEVBUiggVFRfRXhlY0NvbnRleHQgIGV4YyApCiAgIHsKLSAgICBET19DTEVBUgorICAgIGV4Yy0+bmV3X3RvcCA9IDA7CiAgIH0KIAogCkBAIC0zODc1LDkgKzI2OTAsMTQgQEAKICAgLyogU3RhY2s6ICAgICAgICAyICogU3RrRWx0IC0tPiAyICogU3RrRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgdm9pZAotICBJbnNfU1dBUCggSU5TX0FSRyApCisgIEluc19TV0FQKCBGVF9Mb25nKiAgYXJncyApCiAgIHsKLSAgICBET19TV0FQCisgICAgRlRfTG9uZyAgTDsKKworCisgICAgTCAgICAgICA9IGFyZ3NbMF07CisgICAgYXJnc1swXSA9IGFyZ3NbMV07CisgICAgYXJnc1sxXSA9IEw7CiAgIH0KIAogCkBAIC0zODg4LDc0ICsyNzA4LDEwIEBACiAgIC8qIFN0YWNrOiAgICAgICAgLS0+IHVpbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX0RFUFRIKCBJTlNfQVJHICkKKyAgSW5zX0RFUFRIKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKICAgewotICAgIERPX0RFUFRICi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ0lOREVYW106ICAgICBDb3B5IElOREVYZWQgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGludDMyIC0tPiBTdGtFbHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19DSU5ERVgoIElOU19BUkcgKQotICB7Ci0gICAgRE9fQ0lOREVYCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRUlGW106ICAgICAgICBFbmQgSUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg1OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19FSUYoIElOU19BUkcgKQotICB7Ci0gICAgLyogbm90aGluZyB0byBkbyAqLwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEpST1RbXTogICAgICAgSnVtcCBSZWxhdGl2ZSBPbiBUcnVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBTdGtFbHQgaW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfSlJPVCggSU5TX0FSRyApCi0gIHsKLSAgICBET19KUk9UCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSk1QUltdOiAgICAgICBKdU1QIFJlbGF0aXZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgxQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19KTVBSKCBJTlNfQVJHICkKLSAgewotICAgIERPX0pNUFIKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBKUk9GW106ICAgICAgIEp1bXAgUmVsYXRpdmUgT24gRmFsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDc5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgU3RrRWx0IGludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0pST0YoIElOU19BUkcgKQotICB7Ci0gICAgRE9fSlJPRgorICAgIGFyZ3NbMF0gPSBleGMtPnRvcDsKICAgfQogCiAKQEAgLTM5NjYsOSArMjcyMiw5IEBACiAgIC8qIFN0YWNrOiAgICAgICAgaW50MzI/IGludDMyPyAtLT4gYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX0xUKCBJTlNfQVJHICkKKyAgSW5zX0xUKCBGVF9Mb25nKiAgYXJncyApCiAgIHsKLSAgICBET19MVAorICAgIGFyZ3NbMF0gPSAoIGFyZ3NbMF0gPCBhcmdzWzFdICk7CiAgIH0KIAogCkBAIC0zOTc5LDkgKzI3MzUsOSBAQAogICAvKiBTdGFjazogICAgICAgIGludDMyPyBpbnQzMj8gLS0+IGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIEluc19MVEVRKCBJTlNfQVJHICkKKyAgSW5zX0xURVEoIEZUX0xvbmcqICBhcmdzICkKICAgewotICAgIERPX0xURVEKKyAgICBhcmdzWzBdID0gKCBhcmdzWzBdIDw9IGFyZ3NbMV0gKTsKICAgfQogCiAKQEAgLTM5OTIsOSArMjc0OCw5IEBACiAgIC8qIFN0YWNrOiAgICAgICAgaW50MzI/IGludDMyPyAtLT4gYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX0dUKCBJTlNfQVJHICkKKyAgSW5zX0dUKCBGVF9Mb25nKiAgYXJncyApCiAgIHsKLSAgICBET19HVAorICAgIGFyZ3NbMF0gPSAoIGFyZ3NbMF0gPiBhcmdzWzFdICk7CiAgIH0KIAogCkBAIC00MDA1LDkgKzI3NjEsOSBAQAogICAvKiBTdGFjazogICAgICAgIGludDMyPyBpbnQzMj8gLS0+IGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIEluc19HVEVRKCBJTlNfQVJHICkKKyAgSW5zX0dURVEoIEZUX0xvbmcqICBhcmdzICkKICAgewotICAgIERPX0dURVEKKyAgICBhcmdzWzBdID0gKCBhcmdzWzBdID49IGFyZ3NbMV0gKTsKICAgfQogCiAKQEAgLTQwMTgsOSArMjc3NCw5IEBACiAgIC8qIFN0YWNrOiAgICAgICAgU3RrRWx0IFN0a0VsdCAtLT4gYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX0VRKCBJTlNfQVJHICkKKyAgSW5zX0VRKCBGVF9Mb25nKiAgYXJncyApCiAgIHsKLSAgICBET19FUQorICAgIGFyZ3NbMF0gPSAoIGFyZ3NbMF0gPT0gYXJnc1sxXSApOwogICB9CiAKIApAQCAtNDAzMSw5ICsyNzg3LDkgQEAKICAgLyogU3RhY2s6ICAgICAgICBTdGtFbHQgU3RrRWx0IC0tPiBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgdm9pZAotICBJbnNfTkVRKCBJTlNfQVJHICkKKyAgSW5zX05FUSggRlRfTG9uZyogIGFyZ3MgKQogICB7Ci0gICAgRE9fTkVRCisgICAgYXJnc1swXSA9ICggYXJnc1swXSAhPSBhcmdzWzFdICk7CiAgIH0KIAogCkBAIC00MDQ0LDkgKzI4MDAsMTAgQEAKICAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgdm9pZAotICBJbnNfT0REKCBJTlNfQVJHICkKKyAgSW5zX09ERCggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQogICB7Ci0gICAgRE9fT0RECisgICAgYXJnc1swXSA9ICggKCBleGMtPmZ1bmNfcm91bmQoIGV4YywgYXJnc1swXSwgMCApICYgMTI3ICkgPT0gNjQgKTsKICAgfQogCiAKQEAgLTQwNTcsOSArMjgxNCwxMCBAQAogICAvKiBTdGFjazogICAgICAgIGYyNi42IC0tPiBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIEluc19FVkVOKCBJTlNfQVJHICkKKyAgSW5zX0VWRU4oIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCiAgIHsKLSAgICBET19FVkVOCisgICAgYXJnc1swXSA9ICggKCBleGMtPmZ1bmNfcm91bmQoIGV4YywgYXJnc1swXSwgMCApICYgMTI3ICkgPT0gMCApOwogICB9CiAKIApAQCAtNDA3MCw5ICsyODI4LDkgQEAKICAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiB1aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgdm9pZAotICBJbnNfQU5EKCBJTlNfQVJHICkKKyAgSW5zX0FORCggRlRfTG9uZyogIGFyZ3MgKQogICB7Ci0gICAgRE9fQU5ECisgICAgYXJnc1swXSA9ICggYXJnc1swXSAmJiBhcmdzWzFdICk7CiAgIH0KIAogCkBAIC00MDgzLDkgKzI4NDEsOSBAQAogICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+IHVpbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIEluc19PUiggSU5TX0FSRyApCisgIEluc19PUiggRlRfTG9uZyogIGFyZ3MgKQogICB7Ci0gICAgRE9fT1IKKyAgICBhcmdzWzBdID0gKCBhcmdzWzBdIHx8IGFyZ3NbMV0gKTsKICAgfQogCiAKQEAgLTQwOTYsOSArMjg1NCw5IEBACiAgIC8qIFN0YWNrOiAgICAgICAgU3RrRWx0IC0tPiB1aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX05PVCggSU5TX0FSRyApCisgIEluc19OT1QoIEZUX0xvbmcqICBhcmdzICkKICAgewotICAgIERPX05PVAorICAgIGFyZ3NbMF0gPSAhYXJnc1swXTsKICAgfQogCiAKQEAgLTQxMDksOSArMjg2Nyw5IEBACiAgIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgZjI2LjYgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX0FERCggSU5TX0FSRyApCisgIEluc19BREQoIEZUX0xvbmcqICBhcmdzICkKICAgewotICAgIERPX0FERAorICAgIGFyZ3NbMF0gKz0gYXJnc1sxXTsKICAgfQogCiAKQEAgLTQxMjIsOSArMjg4MCw5IEBACiAgIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgZjI2LjYgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX1NVQiggSU5TX0FSRyApCisgIEluc19TVUIoIEZUX0xvbmcqICBhcmdzICkKICAgewotICAgIERPX1NVQgorICAgIGFyZ3NbMF0gLT0gYXJnc1sxXTsKICAgfQogCiAKQEAgLTQxMzUsOSArMjg5MywxMyBAQAogICAvKiBTdGFjazogICAgICAgIGYyNi42IGYyNi42IC0tPiBmMjYuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIEluc19ESVYoIElOU19BUkcgKQorICBJbnNfRElWKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCiAgIHsKLSAgICBET19ESVYKKyAgICBpZiAoIGFyZ3NbMV0gPT0gMCApCisgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIERpdmlkZV9CeV9aZXJvICk7CisgICAgZWxzZQorICAgICAgYXJnc1swXSA9IEZUX011bERpdl9Ob19Sb3VuZCggYXJnc1swXSwgNjRMLCBhcmdzWzFdICk7CiAgIH0KIAogCkBAIC00MTQ4LDkgKzI5MTAsOSBAQAogICAvKiBTdGFjazogICAgICAgIGYyNi42IGYyNi42IC0tPiBmMjYuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIEluc19NVUwoIElOU19BUkcgKQorICBJbnNfTVVMKCBGVF9Mb25nKiAgYXJncyApCiAgIHsKLSAgICBET19NVUwKKyAgICBhcmdzWzBdID0gRlRfTXVsRGl2KCBhcmdzWzBdLCBhcmdzWzFdLCA2NEwgKTsKICAgfQogCiAKQEAgLTQxNjEsOSArMjkyMyw5IEBACiAgIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX0FCUyggSU5TX0FSRyApCisgIEluc19BQlMoIEZUX0xvbmcqICBhcmdzICkKICAgewotICAgIERPX0FCUworICAgIGFyZ3NbMF0gPSBGVF9BQlMoIGFyZ3NbMF0gKTsKICAgfQogCiAKQEAgLTQxNzQsOSArMjkzNiw5IEBACiAgIC8qIFN0YWNrOiBmMjYuNiAtLT4gZjI2LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX05FRyggSU5TX0FSRyApCisgIEluc19ORUcoIEZUX0xvbmcqICBhcmdzICkKICAgewotICAgIERPX05FRworICAgIGFyZ3NbMF0gPSAtYXJnc1swXTsKICAgfQogCiAKQEAgLTQxODcsOSArMjk0OSw5IEBACiAgIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX0ZMT09SKCBJTlNfQVJHICkKKyAgSW5zX0ZMT09SKCBGVF9Mb25nKiAgYXJncyApCiAgIHsKLSAgICBET19GTE9PUgorICAgIGFyZ3NbMF0gPSBGVF9QSVhfRkxPT1IoIGFyZ3NbMF0gKTsKICAgfQogCiAKQEAgLTQyMDAsOSArMjk2Miw5IEBACiAgIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX0NFSUxJTkcoIElOU19BUkcgKQorICBJbnNfQ0VJTElORyggRlRfTG9uZyogIGFyZ3MgKQogICB7Ci0gICAgRE9fQ0VJTElORworICAgIGFyZ3NbMF0gPSBGVF9QSVhfQ0VJTCggYXJnc1swXSApOwogICB9CiAKIApAQCAtNDIxMyw5ICsyOTc1LDU5IEBACiAgIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiB1aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX1JTKCBJTlNfQVJHICkKKyAgSW5zX1JTKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKICAgewotICAgIERPX1JTCisjaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCisKKyAgICBGVF9VTG9uZyAgSSA9IChGVF9VTG9uZylhcmdzWzBdOworCisKKyAgICBpZiAoIEJPVU5EU0woIEksIGV4Yy0+c3RvcmVTaXplICkgKQorICAgIHsKKyAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgICAgQVJSQVlfQk9VTkRfRVJST1I7CisgICAgICBlbHNlCisgICAgICAgIGFyZ3NbMF0gPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogc3VicGl4ZWwgaGludGluZyAtIGF2b2lkIFR5cGVtYW4gRHN0cm9rZSBhbmQgKi8KKyAgICAgIC8qIElTdHJva2UgYW5kIFZhY3Vmb3JtIHJvdW5kcyAgICAgICAgICAgICAgICAgICovCisgICAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAoICggSSA9PSAyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgICAgICggZXhjLT5mYWNlLT5zcGhfZm91bmRfZnVuY19mbGFncyAmCisgICAgICAgICAgICAgICAgICggU1BIX0ZERUZfU1BBQ0lOR18xIHwKKyAgICAgICAgICAgICAgICAgICBTUEhfRkRFRl9TUEFDSU5HXzIgKSAgICAgICAgICApICkgfHwKKyAgICAgICAgICAgICAoIEkgPT0gMjIgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgICAgICggZXhjLT5zcGhfaW5fZnVuY19mbGFncyAgICYKKyAgICAgICAgICAgICAgICAgU1BIX0ZERUZfVFlQRU1BTl9TVFJPS0VTICkgKSAgICAgICAgfHwKKyAgICAgICAgICAgICAoIEkgPT0gOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAgICAoIGV4Yy0+ZmFjZS0+c3BoX2ZvdW5kX2Z1bmNfZmxhZ3MgJgorICAgICAgICAgICAgICAgICBTUEhfRkRFRl9WQUNVRk9STV9ST1VORF8xICAgICAgICkgJiYKKyAgICAgICAgICAgICAgIGV4Yy0+aXVwX2NhbGxlZCAgICAgICAgICAgICAgICAgICAgICkgKSApCisgICAgICAgIGFyZ3NbMF0gPSAwOworICAgICAgZWxzZQorICAgICAgICBhcmdzWzBdID0gZXhjLT5zdG9yYWdlW0ldOworICAgIH0KKworI2Vsc2UgLyogIVRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLworCisgICAgRlRfVUxvbmcgIEkgPSAoRlRfVUxvbmcpYXJnc1swXTsKKworCisgICAgaWYgKCBCT1VORFNMKCBJLCBleGMtPnN0b3JlU2l6ZSApICkKKyAgICB7CisgICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCisgICAgICAgIEFSUkFZX0JPVU5EX0VSUk9SOworICAgICAgZWxzZQorICAgICAgICBhcmdzWzBdID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgYXJnc1swXSA9IGV4Yy0+c3RvcmFnZVtJXTsKKworI2VuZGlmIC8qICFUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KICAgfQogCiAKQEAgLTQyMjYsOSArMzAzOCwxOSBAQAogICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIEluc19XUyggSU5TX0FSRyApCisgIEluc19XUyggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCiAgIHsKLSAgICBET19XUworICAgIEZUX1VMb25nICBJID0gKEZUX1VMb25nKWFyZ3NbMF07CisKKworICAgIGlmICggQk9VTkRTTCggSSwgZXhjLT5zdG9yZVNpemUgKSApCisgICAgeworICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBBUlJBWV9CT1VORF9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgICAgZXhjLT5zdG9yYWdlW0ldID0gYXJnc1sxXTsKICAgfQogCiAKQEAgLTQyMzksOSArMzA2MSwxOSBAQAogICAvKiBTdGFjazogICAgICAgIGYyNi42IHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIEluc19XQ1ZUUCggSU5TX0FSRyApCisgIEluc19XQ1ZUUCggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCiAgIHsKLSAgICBET19XQ1ZUUAorICAgIEZUX1VMb25nICBJID0gKEZUX1VMb25nKWFyZ3NbMF07CisKKworICAgIGlmICggQk9VTkRTTCggSSwgZXhjLT5jdnRTaXplICkgKQorICAgIHsKKyAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgICAgQVJSQVlfQk9VTkRfRVJST1I7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGV4Yy0+ZnVuY193cml0ZV9jdnQoIGV4YywgSSwgYXJnc1sxXSApOwogICB9CiAKIApAQCAtNDI1Miw5ICszMDg0LDE5IEBACiAgIC8qIFN0YWNrOiAgICAgICAgdWludDMyIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX1dDVlRGKCBJTlNfQVJHICkKKyAgSW5zX1dDVlRGKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKICAgewotICAgIERPX1dDVlRGCisgICAgRlRfVUxvbmcgIEkgPSAoRlRfVUxvbmcpYXJnc1swXTsKKworCisgICAgaWYgKCBCT1VORFNMKCBJLCBleGMtPmN2dFNpemUgKSApCisgICAgeworICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBBUlJBWV9CT1VORF9FUlJPUjsKKyAgICB9CisgICAgZWxzZQorICAgICAgZXhjLT5jdnRbSV0gPSBGVF9NdWxGaXgoIGFyZ3NbMV0sIGV4Yy0+dHRfbWV0cmljcy5zY2FsZSApOwogICB9CiAKIApAQCAtNDI2NSw5ICszMTA3LDIxIEBACiAgIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiBmMjYuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX1JDVlQoIElOU19BUkcgKQorICBJbnNfUkNWVCggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKICAgewotICAgIERPX1JDVlQKKyAgICBGVF9VTG9uZyAgSSA9IChGVF9VTG9uZylhcmdzWzBdOworCisKKyAgICBpZiAoIEJPVU5EU0woIEksIGV4Yy0+Y3Z0U2l6ZSApICkKKyAgICB7CisgICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCisgICAgICAgIEFSUkFZX0JPVU5EX0VSUk9SOworICAgICAgZWxzZQorICAgICAgICBhcmdzWzBdID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgYXJnc1swXSA9IGV4Yy0+ZnVuY19yZWFkX2N2dCggZXhjLCBJICk7CiAgIH0KIAogCkBAIC00Mjc4LDcgKzMxMzIsNyBAQAogICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIEluc19BQSggSU5TX0FSRyApCisgIEluc19BQSggdm9pZCApCiAgIHsKICAgICAvKiBpbnRlbnRpb25hbGx5IG5vIGxvbmdlciBzdXBwb3J0ZWQgKi8KICAgfQpAQCAtNDI5Myw5ICszMTQ3LDkgQEAKICAgLyogTm90ZTogVGhlIG9yaWdpbmFsIGluc3RydWN0aW9uIHBvcHMgYSB2YWx1ZSBmcm9tIHRoZSBzdGFjay4gICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgdm9pZAotICBJbnNfREVCVUcoIElOU19BUkcgKQorICBJbnNfREVCVUcoIFRUX0V4ZWNDb250ZXh0ICBleGMgKQogICB7Ci0gICAgRE9fREVCVUcKKyAgICBleGMtPmVycm9yID0gRlRfVEhST1coIERlYnVnX09wQ29kZSApOwogICB9CiAKIApAQCAtNDMwNiw5ICszMTYwLDEzIEBACiAgIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX1JPVU5EKCBJTlNfQVJHICkKKyAgSW5zX1JPVU5EKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKICAgewotICAgIERPX1JPVU5ECisgICAgYXJnc1swXSA9IGV4Yy0+ZnVuY19yb3VuZCgKKyAgICAgICAgICAgICAgICBleGMsCisgICAgICAgICAgICAgICAgYXJnc1swXSwKKyAgICAgICAgICAgICAgICBleGMtPnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1tleGMtPm9wY29kZSAtIDB4NjhdICk7CiAgIH0KIAogCkBAIC00MzE5LDkgKzMxNzcsMTMgQEAKICAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gZjI2LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgdm9pZAotICBJbnNfTlJPVU5EKCBJTlNfQVJHICkKKyAgSW5zX05ST1VORCggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQogICB7Ci0gICAgRE9fTlJPVU5ECisgICAgYXJnc1swXSA9IFJvdW5kX05vbmUoCisgICAgICAgICAgICAgICAgZXhjLAorICAgICAgICAgICAgICAgIGFyZ3NbMF0sCisgICAgICAgICAgICAgICAgZXhjLT50dF9tZXRyaWNzLmNvbXBlbnNhdGlvbnNbZXhjLT5vcGNvZGUgLSAweDZDXSApOwogICB9CiAKIApAQCAtNDMzMiw5ICszMTk0LDEwIEBACiAgIC8qIFN0YWNrOiAgICAgICAgaW50MzI/IGludDMyPyAtLT4gaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX01BWCggSU5TX0FSRyApCisgIEluc19NQVgoIEZUX0xvbmcqICBhcmdzICkKICAgewotICAgIERPX01BWAorICAgIGlmICggYXJnc1sxXSA+IGFyZ3NbMF0gKQorICAgICAgYXJnc1swXSA9IGFyZ3NbMV07CiAgIH0KIAogCkBAIC00MzQ1LDIyICszMjA4LDEzIEBACiAgIC8qIFN0YWNrOiAgICAgICAgaW50MzI/IGludDMyPyAtLT4gaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX01JTiggSU5TX0FSRyApCisgIEluc19NSU4oIEZUX0xvbmcqICBhcmdzICkKICAgewotICAgIERPX01JTgorICAgIGlmICggYXJnc1sxXSA8IGFyZ3NbMF0gKQorICAgICAgYXJnc1swXSA9IGFyZ3NbMV07CiAgIH0KIAogCi0jZW5kaWYgIC8qICFUVF9DT05GSUdfT1BUSU9OX0lOVEVSUFJFVEVSX1NXSVRDSCAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGFzIGlzIHdpdGhpbiB0aGUgc3dpdGNoIHN0YXRlbWVudC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiBNSU5ERVhbXTogICAgIE1vdmUgSU5ERVhlZCBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQzNjgsNDQgKzMyMjIsNjkgQEAKICAgLyogU3RhY2s6ICAgICAgICBpbnQzMj8gLS0+IFN0a0VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgdm9pZAotICBJbnNfTUlOREVYKCBJTlNfQVJHICkKKyAgSW5zX01JTkRFWCggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQogICB7CiAgICAgRlRfTG9uZyAgTCwgSzsKIAogCiAgICAgTCA9IGFyZ3NbMF07CiAKLSAgICBpZiAoIEwgPD0gMCB8fCBMID4gQ1VSLmFyZ3MgKQorICAgIGlmICggTCA8PSAwIHx8IEwgPiBleGMtPmFyZ3MgKQogICAgIHsKLSAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKKyAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgSyA9IENVUi5zdGFja1tDVVIuYXJncyAtIExdOworICAgICAgSyA9IGV4Yy0+c3RhY2tbZXhjLT5hcmdzIC0gTF07CiAKLSAgICAgIEZUX0FSUkFZX01PVkUoICZDVVIuc3RhY2tbQ1VSLmFyZ3MgLSBMICAgIF0sCi0gICAgICAgICAgICAgICAgICAgICAmQ1VSLnN0YWNrW0NVUi5hcmdzIC0gTCArIDFdLAorICAgICAgRlRfQVJSQVlfTU9WRSggJmV4Yy0+c3RhY2tbZXhjLT5hcmdzIC0gTCAgICBdLAorICAgICAgICAgICAgICAgICAgICAgJmV4Yy0+c3RhY2tbZXhjLT5hcmdzIC0gTCArIDFdLAogICAgICAgICAgICAgICAgICAgICAgKCBMIC0gMSApICk7CiAKLSAgICAgIENVUi5zdGFja1tDVVIuYXJncyAtIDFdID0gSzsKKyAgICAgIGV4Yy0+c3RhY2tbZXhjLT5hcmdzIC0gMV0gPSBLOwogICAgIH0KICAgfQogCiAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBDSU5ERVhbXTogICAgIENvcHkgSU5ERVhlZCBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgaW50MzIgLS0+IFN0a0VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljIHZvaWQKKyAgSW5zX0NJTkRFWCggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQorICB7CisgICAgRlRfTG9uZyAgTDsKKworCisgICAgTCA9IGFyZ3NbMF07CisKKyAgICBpZiAoIEwgPD0gMCB8fCBMID4gZXhjLT5hcmdzICkKKyAgICB7CisgICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCisgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKKyAgICAgIGFyZ3NbMF0gPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgICBhcmdzWzBdID0gZXhjLT5zdGFja1tleGMtPmFyZ3MgLSBMXTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiBST0xMW106ICAgICAgIFJPTEwgdG9wIHRocmVlIGVsZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogT3Bjb2RlIHJhbmdlOiAweDhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qIFN0YWNrOiAgICAgICAgMyAqIFN0a0VsdCAtLT4gMyAqIFN0a0VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX1JPTEwoIElOU19BUkcgKQorICBJbnNfUk9MTCggRlRfTG9uZyogIGFyZ3MgKQogICB7CiAgICAgRlRfTG9uZyAgQSwgQiwgQzsKIAotICAgIEZUX1VOVVNFRF9FWEVDOwotCiAKICAgICBBID0gYXJnc1syXTsKICAgICBCID0gYXJnc1sxXTsKQEAgLTQ0MjEsMzQgKzMzMDAsNDkgQEAKICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qIE1BTkFHSU5HIFRIRSBGTE9XIE9GIENPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBJbnN0cnVjdGlvbnMgYXBwZWFyIGluIHRoZSBzcGVjaWZpY2F0aW9uJ3Mgb3JkZXIuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi0gIHN0YXRpYyBGVF9Cb29sCi0gIFNraXBDb2RlKCBFWEVDX09QICkKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTTE9PUFtdOiAgICAgIFNldCBMT09QIHZhcmlhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgaW50MzI/IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljIHZvaWQKKyAgSW5zX1NMT09QKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKICAgewotICAgIENVUi5JUCArPSBDVVIubGVuZ3RoOworICAgIGlmICggYXJnc1swXSA8IDAgKQorICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBCYWRfQXJndW1lbnQgKTsKKyAgICBlbHNlCisgICAgICBleGMtPkdTLmxvb3AgPSBhcmdzWzBdOworICB9CiAKLSAgICBpZiAoIENVUi5JUCA8IENVUi5jb2RlU2l6ZSApCisKKyAgc3RhdGljIEZUX0Jvb2wKKyAgU2tpcENvZGUoIFRUX0V4ZWNDb250ZXh0ICBleGMgKQorICB7CisgICAgZXhjLT5JUCArPSBleGMtPmxlbmd0aDsKKworICAgIGlmICggZXhjLT5JUCA8IGV4Yy0+Y29kZVNpemUgKQogICAgIHsKLSAgICAgIENVUi5vcGNvZGUgPSBDVVIuY29kZVtDVVIuSVBdOworICAgICAgZXhjLT5vcGNvZGUgPSBleGMtPmNvZGVbZXhjLT5JUF07CiAKLSAgICAgIENVUi5sZW5ndGggPSBvcGNvZGVfbGVuZ3RoW0NVUi5vcGNvZGVdOwotICAgICAgaWYgKCBDVVIubGVuZ3RoIDwgMCApCisgICAgICBleGMtPmxlbmd0aCA9IG9wY29kZV9sZW5ndGhbZXhjLT5vcGNvZGVdOworICAgICAgaWYgKCBleGMtPmxlbmd0aCA8IDAgKQogICAgICAgewotICAgICAgICBpZiAoIENVUi5JUCArIDEgPj0gQ1VSLmNvZGVTaXplICkKKyAgICAgICAgaWYgKCBleGMtPklQICsgMSA+PSBleGMtPmNvZGVTaXplICkKICAgICAgICAgICBnb3RvIEZhaWxfT3ZlcmZsb3c7Ci0gICAgICAgIENVUi5sZW5ndGggPSAyIC0gQ1VSLmxlbmd0aCAqIENVUi5jb2RlW0NVUi5JUCArIDFdOworICAgICAgICBleGMtPmxlbmd0aCA9IDIgLSBleGMtPmxlbmd0aCAqIGV4Yy0+Y29kZVtleGMtPklQICsgMV07CiAgICAgICB9CiAKLSAgICAgIGlmICggQ1VSLklQICsgQ1VSLmxlbmd0aCA8PSBDVVIuY29kZVNpemUgKQorICAgICAgaWYgKCBleGMtPklQICsgZXhjLT5sZW5ndGggPD0gZXhjLT5jb2RlU2l6ZSApCiAgICAgICAgIHJldHVybiBTVUNDRVNTOwogICAgIH0KIAogICBGYWlsX092ZXJmbG93OgotICAgIENVUi5lcnJvciA9IEZUX1RIUk9XKCBDb2RlX092ZXJmbG93ICk7CisgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBDb2RlX092ZXJmbG93ICk7CiAgICAgcmV0dXJuIEZBSUxVUkU7CiAgIH0KIApAQCAtNDQ2MCw3ICszMzU0LDggQEAKICAgLyogU3RhY2s6ICAgICAgICBTdGtFbHQgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgdm9pZAotICBJbnNfSUYoIElOU19BUkcgKQorICBJbnNfSUYoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQogICB7CiAgICAgRlRfSW50ICAgbklmczsKICAgICBGVF9Cb29sICBPdXQ7CkBAIC00NDc0LDEwICszMzY5LDEwIEBACiAKICAgICBkbwogICAgIHsKLSAgICAgIGlmICggU0tJUF9Db2RlKCkgPT0gRkFJTFVSRSApCisgICAgICBpZiAoIFNraXBDb2RlKCBleGMgKSA9PSBGQUlMVVJFICkKICAgICAgICAgcmV0dXJuOwogCi0gICAgICBzd2l0Y2ggKCBDVVIub3Bjb2RlICkKKyAgICAgIHN3aXRjaCAoIGV4Yy0+b3Bjb2RlICkKICAgICAgIHsKICAgICAgIGNhc2UgMHg1ODogICAgICAvKiBJRiAqLwogICAgICAgICBuSWZzKys7CkBAIC00NTAzLDIxICszMzk4LDE5IEBACiAgIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX0VMU0UoIElOU19BUkcgKQorICBJbnNfRUxTRSggVFRfRXhlY0NvbnRleHQgIGV4YyApCiAgIHsKICAgICBGVF9JbnQgIG5JZnM7CiAKLSAgICBGVF9VTlVTRURfQVJHOwotCiAKICAgICBuSWZzID0gMTsKIAogICAgIGRvCiAgICAgewotICAgICAgaWYgKCBTS0lQX0NvZGUoKSA9PSBGQUlMVVJFICkKKyAgICAgIGlmICggU2tpcENvZGUoIGV4YyApID09IEZBSUxVUkUgKQogICAgICAgICByZXR1cm47CiAKLSAgICAgIHN3aXRjaCAoIENVUi5vcGNvZGUgKQorICAgICAgc3dpdGNoICggZXhjLT5vcGNvZGUgKQogICAgICAgewogICAgICAgY2FzZSAweDU4OiAgICAvKiBJRiAqLwogICAgICAgICBuSWZzKys7CkBAIC00NTMzLDkgKzM0MjYsNzEgQEAKIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERFRklOSU5HIEFORCBVU0lORyBGVU5DVElPTlMgQU5EIElOU1RSVUNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBFSUZbXTogICAgICAgIEVuZCBJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBJbnN0cnVjdGlvbnMgYXBwZWFyIGluIHRoZSBzcGVjaWZpY2F0aW9uJ3Mgb3JkZXIuICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYyB2b2lkCisgIEluc19FSUYoIHZvaWQgKQorICB7CisgICAgLyogbm90aGluZyB0byBkbyAqLworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEpNUFJbXTogICAgICAgSnVNUCBSZWxhdGl2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4MUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICBpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMgdm9pZAorICBJbnNfSk1QUiggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKKyAgeworICAgIGlmICggYXJnc1swXSA9PSAwICYmIGV4Yy0+YXJncyA9PSAwICkKKyAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggQmFkX0FyZ3VtZW50ICk7CisgICAgZXhjLT5JUCArPSBhcmdzWzBdOworICAgIGlmICggZXhjLT5JUCA8IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgKCBleGMtPmNhbGxUb3AgPiAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgZXhjLT5JUCA+IGV4Yy0+Y2FsbFN0YWNrW2V4Yy0+Y2FsbFRvcCAtIDFdLkRlZi0+ZW5kICkgKQorICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBCYWRfQXJndW1lbnQgKTsKKyAgICBleGMtPnN0ZXBfaW5zID0gRkFMU0U7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSlJPVFtdOiAgICAgICBKdW1wIFJlbGF0aXZlIE9uIFRydWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg3OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIFN0a0VsdCBpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYyB2b2lkCisgIEluc19KUk9UKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQorICB7CisgICAgaWYgKCBhcmdzWzFdICE9IDAgKQorICAgICAgSW5zX0pNUFIoIGV4YywgYXJncyApOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEpST0ZbXTogICAgICAgSnVtcCBSZWxhdGl2ZSBPbiBGYWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4NzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICBTdGtFbHQgaW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMgdm9pZAorICBJbnNfSlJPRiggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKKyAgeworICAgIGlmICggYXJnc1sxXSA9PSAwICkKKyAgICAgIEluc19KTVBSKCBleGMsIGFyZ3MgKTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBERUZJTklORyBBTkQgVVNJTkcgRlVOQ1RJT05TIEFORCBJTlNUUlVDVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC00NTQ3LDcgKzM1MDIsOCBAQAogICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIEluc19GREVGKCBJTlNfQVJHICkKKyAgSW5zX0ZERUYoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCiAgIHsKICAgICBGVF9VTG9uZyAgICAgICBuOwogICAgIFRUX0RlZlJlY29yZCogIHJlYzsKQEAgLTQ2NTcsOSArMzYxMyw5IEBACiAgICAgLyogc29tZSBmb250IHByb2dyYW1zIGFyZSBicm9rZW4gZW5vdWdoIHRvIHJlZGVmaW5lIGZ1bmN0aW9ucyEgKi8KICAgICAvKiBXZSB3aWxsIHRoZW4gcGFyc2UgdGhlIGN1cnJlbnQgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAqLwogCi0gICAgcmVjICAgPSBDVVIuRkRlZnM7Ci0gICAgbGltaXQgPSByZWMgKyBDVVIubnVtRkRlZnM7Ci0gICAgbiAgICAgPSBhcmdzWzBdOworICAgIHJlYyAgID0gZXhjLT5GRGVmczsKKyAgICBsaW1pdCA9IHJlYyArIGV4Yy0+bnVtRkRlZnM7CisgICAgbiAgICAgPSAoRlRfVUxvbmcpYXJnc1swXTsKIAogICAgIGZvciAoIDsgcmVjIDwgbGltaXQ7IHJlYysrICkKICAgICB7CkBAIC00NjcwLDMxICszNjI2LDMxIEBACiAgICAgaWYgKCByZWMgPT0gbGltaXQgKQogICAgIHsKICAgICAgIC8qIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHJvb20gZm9yIG5ldyBmdW5jdGlvbnMgKi8KLSAgICAgIGlmICggQ1VSLm51bUZEZWZzID49IENVUi5tYXhGRGVmcyApCisgICAgICBpZiAoIGV4Yy0+bnVtRkRlZnMgPj0gZXhjLT5tYXhGRGVmcyApCiAgICAgICB7Ci0gICAgICAgIENVUi5lcnJvciA9IEZUX1RIUk9XKCBUb29fTWFueV9GdW5jdGlvbl9EZWZzICk7CisgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggVG9vX01hbnlfRnVuY3Rpb25fRGVmcyApOwogICAgICAgICByZXR1cm47CiAgICAgICB9Ci0gICAgICBDVVIubnVtRkRlZnMrKzsKKyAgICAgIGV4Yy0+bnVtRkRlZnMrKzsKICAgICB9CiAKICAgICAvKiBBbHRob3VnaCBGREVGIHRha2VzIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLCAgKi8KICAgICAvKiBmdW5jICMgbXVzdCBiZSB3aXRoaW4gdW5zaWduZWQgMTYtYml0IGludGVnZXIgKi8KICAgICBpZiAoIG4gPiAweEZGRkZVICkKICAgICB7Ci0gICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggVG9vX01hbnlfRnVuY3Rpb25fRGVmcyApOworICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBUb29fTWFueV9GdW5jdGlvbl9EZWZzICk7CiAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgcmVjLT5yYW5nZSAgICAgICAgICA9IENVUi5jdXJSYW5nZTsKKyAgICByZWMtPnJhbmdlICAgICAgICAgID0gZXhjLT5jdXJSYW5nZTsKICAgICByZWMtPm9wYyAgICAgICAgICAgID0gKEZUX1VJbnQxNiluOwotICAgIHJlYy0+c3RhcnQgICAgICAgICAgPSBDVVIuSVAgKyAxOworICAgIHJlYy0+c3RhcnQgICAgICAgICAgPSBleGMtPklQICsgMTsKICAgICByZWMtPmFjdGl2ZSAgICAgICAgID0gVFJVRTsKICAgICByZWMtPmlubGluZV9kZWx0YSAgID0gRkFMU0U7CiAgICAgcmVjLT5zcGhfZmRlZl9mbGFncyA9IDB4MDAwMDsKIAotICAgIGlmICggbiA+IENVUi5tYXhGdW5jICkKLSAgICAgIENVUi5tYXhGdW5jID0gKEZUX1VJbnQxNiluOworICAgIGlmICggbiA+IGV4Yy0+bWF4RnVuYyApCisgICAgICBleGMtPm1heEZ1bmMgPSAoRlRfVUludDE2KW47CiAKICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKICAgICAvKiBXZSBkb24ndCBrbm93IGZvciBzdXJlIHRoZXNlIGFyZSB0eXBlbWFuIGZ1bmN0aW9ucywgKi8KQEAgLTQ3MDYsNyArMzY2Miw3IEBACiAgICAgLyogTm93IHNraXAgdGhlIHdob2xlIGZ1bmN0aW9uIGRlZmluaXRpb24uICovCiAgICAgLyogV2UgZG9uJ3QgYWxsb3cgbmVzdGVkIElERUZTICYgRkRFRnMuICAgICovCiAKLSAgICB3aGlsZSAoIFNLSVBfQ29kZSgpID09IFNVQ0NFU1MgKQorICAgIHdoaWxlICggU2tpcENvZGUoIGV4YyApID09IFNVQ0NFU1MgKQogICAgIHsKIAogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwpAQCAtNDcxNSwyOCArMzY3MSwyOCBAQAogICAgICAgewogICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG9wY29kZV9wYXR0ZXJuczsgaSsrICkKICAgICAgICAgewotICAgICAgICAgIGlmICggb3Bjb2RlX3BvaW50ZXJbaV0gPCBvcGNvZGVfc2l6ZVtpXSAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgIENVUi5vcGNvZGUgPT0gb3Bjb2RlX3BhdHRlcm5baV1bb3Bjb2RlX3BvaW50ZXJbaV1dICkKKyAgICAgICAgICBpZiAoIG9wY29kZV9wb2ludGVyW2ldIDwgb3Bjb2RlX3NpemVbaV0gICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgICAgZXhjLT5vcGNvZGUgPT0gb3Bjb2RlX3BhdHRlcm5baV1bb3Bjb2RlX3BvaW50ZXJbaV1dICkKICAgICAgICAgICB7CiAgICAgICAgICAgICBvcGNvZGVfcG9pbnRlcltpXSArPSAxOwogCiAgICAgICAgICAgICBpZiAoIG9wY29kZV9wb2ludGVyW2ldID09IG9wY29kZV9zaXplW2ldICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfVFJBQ0U3KCggInNwaDogRnVuY3Rpb24gJWQsIG9wY29kZSBwdHJuOiAlZCwgJXMgJXNcbiIsCisgICAgICAgICAgICAgIEZUX1RSQUNFNigoICJzcGg6IEZ1bmN0aW9uICVkLCBvcGNvZGUgcHRybjogJWQsICVzICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIuZmFjZS0+cm9vdC5mYW1pbHlfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLmZhY2UtPnJvb3Quc3R5bGVfbmFtZSApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT5mYWNlLT5yb290LmZhbWlseV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPmZhY2UtPnJvb3Quc3R5bGVfbmFtZSApKTsKIAogICAgICAgICAgICAgICBzd2l0Y2ggKCBpICkKICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgcmVjLT5zcGhfZmRlZl9mbGFncyAgICAgICAgICAgIHw9IFNQSF9GREVGX0lOTElORV9ERUxUQV8xOwotICAgICAgICAgICAgICAgIENVUi5mYWNlLT5zcGhfZm91bmRfZnVuY19mbGFncyB8PSBTUEhfRkRFRl9JTkxJTkVfREVMVEFfMTsKKyAgICAgICAgICAgICAgICByZWMtPnNwaF9mZGVmX2ZsYWdzICAgICAgICAgICAgIHw9IFNQSF9GREVGX0lOTElORV9ERUxUQV8xOworICAgICAgICAgICAgICAgIGV4Yy0+ZmFjZS0+c3BoX2ZvdW5kX2Z1bmNfZmxhZ3MgfD0gU1BIX0ZERUZfSU5MSU5FX0RFTFRBXzE7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIHJlYy0+c3BoX2ZkZWZfZmxhZ3MgICAgICAgICAgICB8PSBTUEhfRkRFRl9JTkxJTkVfREVMVEFfMjsKLSAgICAgICAgICAgICAgICBDVVIuZmFjZS0+c3BoX2ZvdW5kX2Z1bmNfZmxhZ3MgfD0gU1BIX0ZERUZfSU5MSU5FX0RFTFRBXzI7CisgICAgICAgICAgICAgICAgcmVjLT5zcGhfZmRlZl9mbGFncyAgICAgICAgICAgICB8PSBTUEhfRkRFRl9JTkxJTkVfREVMVEFfMjsKKyAgICAgICAgICAgICAgICBleGMtPmZhY2UtPnNwaF9mb3VuZF9mdW5jX2ZsYWdzIHw9IFNQSF9GREVGX0lOTElORV9ERUxUQV8yOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgIGNhc2UgMjoKQEAgLTQ3NDQsOCArMzcwMCw4IEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgLyogbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQgc3RpbGwgKi8KICAgICAgICAgICAgICAgICBjYXNlIDU4OgotICAgICAgICAgICAgICAgICAgcmVjLT5zcGhfZmRlZl9mbGFncyAgICAgICAgICAgIHw9IFNQSF9GREVGX0RJQUdPTkFMX1NUUk9LRTsKLSAgICAgICAgICAgICAgICAgIENVUi5mYWNlLT5zcGhfZm91bmRfZnVuY19mbGFncyB8PSBTUEhfRkRFRl9ESUFHT05BTF9TVFJPS0U7CisgICAgICAgICAgICAgICAgICByZWMtPnNwaF9mZGVmX2ZsYWdzICAgICAgICAgICAgIHw9IFNQSF9GREVGX0RJQUdPTkFMX1NUUk9LRTsKKyAgICAgICAgICAgICAgICAgIGV4Yy0+ZmFjZS0+c3BoX2ZvdW5kX2Z1bmNfZmxhZ3MgfD0gU1BIX0ZERUZfRElBR09OQUxfU1RST0tFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtNDc1MywxNSArMzcwOSwxNSBAQAogICAgICAgICAgICAgICAgIHN3aXRjaCAoIG4gKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICByZWMtPnNwaF9mZGVmX2ZsYWdzICAgICAgICAgICAgfD0gU1BIX0ZERUZfVkFDVUZPUk1fUk9VTkRfMTsKLSAgICAgICAgICAgICAgICAgIENVUi5mYWNlLT5zcGhfZm91bmRfZnVuY19mbGFncyB8PSBTUEhfRkRFRl9WQUNVRk9STV9ST1VORF8xOworICAgICAgICAgICAgICAgICAgcmVjLT5zcGhfZmRlZl9mbGFncyAgICAgICAgICAgICB8PSBTUEhfRkRFRl9WQUNVRk9STV9ST1VORF8xOworICAgICAgICAgICAgICAgICAgZXhjLT5mYWNlLT5zcGhfZm91bmRfZnVuY19mbGFncyB8PSBTUEhfRkRFRl9WQUNVRk9STV9ST1VORF8xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgLyogcHJvYmFibHkgbm90IG5lY2Vzc2FyeSB0byBkZXRlY3QgYW55bW9yZSAqLwotICAgICAgICAgICAgICAgIHJlYy0+c3BoX2ZkZWZfZmxhZ3MgICAgICAgICAgICB8PSBTUEhfRkRFRl9UVEZBVVRPSElOVF8xOwotICAgICAgICAgICAgICAgIENVUi5mYWNlLT5zcGhfZm91bmRfZnVuY19mbGFncyB8PSBTUEhfRkRFRl9UVEZBVVRPSElOVF8xOworICAgICAgICAgICAgICAgIHJlYy0+c3BoX2ZkZWZfZmxhZ3MgICAgICAgICAgICAgfD0gU1BIX0ZERUZfVFRGQVVUT0hJTlRfMTsKKyAgICAgICAgICAgICAgICBleGMtPmZhY2UtPnNwaF9mb3VuZF9mdW5jX2ZsYWdzIHw9IFNQSF9GREVGX1RURkFVVE9ISU5UXzE7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgY2FzZSA1OgpAQCAtNDc3Myw4ICszNzI5LDggQEAKICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgICAgICAgIHJlYy0+c3BoX2ZkZWZfZmxhZ3MgICAgICAgICAgICB8PSBTUEhfRkRFRl9TUEFDSU5HXzE7Ci0gICAgICAgICAgICAgICAgICBDVVIuZmFjZS0+c3BoX2ZvdW5kX2Z1bmNfZmxhZ3MgfD0gU1BIX0ZERUZfU1BBQ0lOR18xOworICAgICAgICAgICAgICAgICAgcmVjLT5zcGhfZmRlZl9mbGFncyAgICAgICAgICAgICB8PSBTUEhfRkRFRl9TUEFDSU5HXzE7CisgICAgICAgICAgICAgICAgICBleGMtPmZhY2UtPnNwaF9mb3VuZF9mdW5jX2ZsYWdzIHw9IFNQSF9GREVGX1NQQUNJTkdfMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTQ3ODcsMjAgKzM3NDMsMjAgQEAKICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgICAgICAgIHJlYy0+c3BoX2ZkZWZfZmxhZ3MgICAgICAgICAgICB8PSBTUEhfRkRFRl9TUEFDSU5HXzI7Ci0gICAgICAgICAgICAgICAgICBDVVIuZmFjZS0+c3BoX2ZvdW5kX2Z1bmNfZmxhZ3MgfD0gU1BIX0ZERUZfU1BBQ0lOR18yOworICAgICAgICAgICAgICAgICAgcmVjLT5zcGhfZmRlZl9mbGFncyAgICAgICAgICAgICB8PSBTUEhfRkRFRl9TUEFDSU5HXzI7CisgICAgICAgICAgICAgICAgICBleGMtPmZhY2UtPnNwaF9mb3VuZF9mdW5jX2ZsYWdzIHw9IFNQSF9GREVGX1NQQUNJTkdfMjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICAgcmVjLT5zcGhfZmRlZl9mbGFncyAgICAgICAgICAgIHw9IFNQSF9GREVGX1RZUEVNQU5fRElBR0VORENUUkw7Ci0gICAgICAgICAgICAgICAgIENVUi5mYWNlLT5zcGhfZm91bmRfZnVuY19mbGFncyB8PSBTUEhfRkRFRl9UWVBFTUFOX0RJQUdFTkRDVFJMOworICAgICAgICAgICAgICAgICByZWMtPnNwaF9mZGVmX2ZsYWdzICAgICAgICAgICAgIHw9IFNQSF9GREVGX1RZUEVNQU5fRElBR0VORENUUkw7CisgICAgICAgICAgICAgICAgIGV4Yy0+ZmFjZS0+c3BoX2ZvdW5kX2Z1bmNfZmxhZ3MgfD0gU1BIX0ZERUZfVFlQRU1BTl9ESUFHRU5EQ1RSTDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgIGNhc2UgODoKICNpZiAwCi0gICAgICAgICAgICAgICAgIHJlYy0+c3BoX2ZkZWZfZmxhZ3MgICAgICAgICAgICB8PSBTUEhfRkRFRl9UWVBFTUFOX0RJQUdFTkRDVFJMOwotICAgICAgICAgICAgICAgICBDVVIuZmFjZS0+c3BoX2ZvdW5kX2Z1bmNfZmxhZ3MgfD0gU1BIX0ZERUZfVFlQRU1BTl9ESUFHRU5EQ1RSTDsKKyAgICAgICAgICAgICAgICAgcmVjLT5zcGhfZmRlZl9mbGFncyAgICAgICAgICAgICB8PSBTUEhfRkRFRl9UWVBFTUFOX0RJQUdFTkRDVFJMOworICAgICAgICAgICAgICAgICBleGMtPmZhY2UtPnNwaF9mb3VuZF9mdW5jX2ZsYWdzIHw9IFNQSF9GREVGX1RZUEVNQU5fRElBR0VORENUUkw7CiAjZW5kaWYKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgIH0KQEAgLTQ4MTMsMjIgKzM3NjksMjIgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qIFNldCBzcGhfY29tcGF0aWJpbGl0eV9tb2RlIG9ubHkgd2hlbiBkZWx0YXMgYXJlIGRldGVjdGVkICovCi0gICAgICAgIENVUi5mYWNlLT5zcGhfY29tcGF0aWJpbGl0eV9tb2RlID0KLSAgICAgICAgICAoICggQ1VSLmZhY2UtPnNwaF9mb3VuZF9mdW5jX2ZsYWdzICYgU1BIX0ZERUZfSU5MSU5FX0RFTFRBXzEgKSB8Ci0gICAgICAgICAgICAoIENVUi5mYWNlLT5zcGhfZm91bmRfZnVuY19mbGFncyAmIFNQSF9GREVGX0lOTElORV9ERUxUQV8yICkgKTsKKyAgICAgICAgZXhjLT5mYWNlLT5zcGhfY29tcGF0aWJpbGl0eV9tb2RlID0KKyAgICAgICAgICAoICggZXhjLT5mYWNlLT5zcGhfZm91bmRfZnVuY19mbGFncyAmIFNQSF9GREVGX0lOTElORV9ERUxUQV8xICkgfAorICAgICAgICAgICAgKCBleGMtPmZhY2UtPnNwaF9mb3VuZF9mdW5jX2ZsYWdzICYgU1BIX0ZERUZfSU5MSU5FX0RFTFRBXzIgKSApOwogICAgICAgfQogCiAjZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCiAKLSAgICAgIHN3aXRjaCAoIENVUi5vcGNvZGUgKQorICAgICAgc3dpdGNoICggZXhjLT5vcGNvZGUgKQogICAgICAgewogICAgICAgY2FzZSAweDg5OiAgICAvKiBJREVGICovCiAgICAgICBjYXNlIDB4MkM6ICAgIC8qIEZERUYgKi8KLSAgICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIE5lc3RlZF9ERUZTICk7CisgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggTmVzdGVkX0RFRlMgKTsKICAgICAgICAgcmV0dXJuOwogCiAgICAgICBjYXNlIDB4MkQ6ICAgLyogRU5ERiAqLwotICAgICAgICByZWMtPmVuZCA9IENVUi5JUDsKKyAgICAgICAgcmVjLT5lbmQgPSBleGMtPklQOwogICAgICAgICByZXR1cm47CiAgICAgICB9CiAgICAgfQpAQCAtNDg0Miw0MCArMzc5OCwzNyBAQAogICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIEluc19FTkRGKCBJTlNfQVJHICkKKyAgSW5zX0VOREYoIFRUX0V4ZWNDb250ZXh0ICBleGMgKQogICB7CiAgICAgVFRfQ2FsbFJlYyogIHBSZWM7CiAKLSAgICBGVF9VTlVTRURfQVJHOwotCiAKICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSAgICBDVVIuc3BoX2luX2Z1bmNfZmxhZ3MgPSAweDAwMDA7CisgICAgZXhjLT5zcGhfaW5fZnVuY19mbGFncyA9IDB4MDAwMDsKICNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KIAotICAgIGlmICggQ1VSLmNhbGxUb3AgPD0gMCApICAgICAvKiBXZSBlbmNvdW50ZXJlZCBhbiBFTkRGIHdpdGhvdXQgYSBjYWxsICovCisgICAgaWYgKCBleGMtPmNhbGxUb3AgPD0gMCApICAgICAvKiBXZSBlbmNvdW50ZXJlZCBhbiBFTkRGIHdpdGhvdXQgYSBjYWxsICovCiAgICAgewotICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIEVOREZfSW5fRXhlY19TdHJlYW0gKTsKKyAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggRU5ERl9Jbl9FeGVjX1N0cmVhbSApOwogICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIENVUi5jYWxsVG9wLS07CisgICAgZXhjLT5jYWxsVG9wLS07CiAKLSAgICBwUmVjID0gJkNVUi5jYWxsU3RhY2tbQ1VSLmNhbGxUb3BdOworICAgIHBSZWMgPSAmZXhjLT5jYWxsU3RhY2tbZXhjLT5jYWxsVG9wXTsKIAogICAgIHBSZWMtPkN1cl9Db3VudC0tOwogCi0gICAgQ1VSLnN0ZXBfaW5zID0gRkFMU0U7CisgICAgZXhjLT5zdGVwX2lucyA9IEZBTFNFOwogCiAgICAgaWYgKCBwUmVjLT5DdXJfQ291bnQgPiAwICkKICAgICB7Ci0gICAgICBDVVIuY2FsbFRvcCsrOwotICAgICAgQ1VSLklQID0gcFJlYy0+RGVmLT5zdGFydDsKKyAgICAgIGV4Yy0+Y2FsbFRvcCsrOworICAgICAgZXhjLT5JUCA9IHBSZWMtPkRlZi0+c3RhcnQ7CiAgICAgfQogICAgIGVsc2UKICAgICAgIC8qIExvb3AgdGhyb3VnaCB0aGUgY3VycmVudCBmdW5jdGlvbiAqLwotICAgICAgSU5TX0dvdG9fQ29kZVJhbmdlKCBwUmVjLT5DYWxsZXJfUmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBSZWMtPkNhbGxlcl9JUCApOworICAgICAgSW5zX0dvdG9fQ29kZVJhbmdlKCBleGMsIHBSZWMtPkNhbGxlcl9SYW5nZSwgcFJlYy0+Q2FsbGVyX0lQICk7CiAKICAgICAvKiBFeGl0IHRoZSBjdXJyZW50IGNhbGwgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICovCiAKQEAgLTQ4OTQsNyArMzg0Nyw4IEBACiAgIC8qIFN0YWNrOiAgICAgICAgdWludDMyPyAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX0NBTEwoIElOU19BUkcgKQorICBJbnNfQ0FMTCggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKICAgewogICAgIEZUX1VMb25nICAgICAgIEY7CiAgICAgVFRfQ2FsbFJlYyogICAgcENyZWM7CkBAIC00OTAzLDI4ICszODU3LDI4IEBACiAKICAgICAvKiBmaXJzdCBvZiBhbGwsIGNoZWNrIHRoZSBpbmRleCAqLwogCi0gICAgRiA9IGFyZ3NbMF07Ci0gICAgaWYgKCBCT1VORFNMKCBGLCBDVVIubWF4RnVuYyArIDEgKSApCisgICAgRiA9IChGVF9VTG9uZylhcmdzWzBdOworICAgIGlmICggQk9VTkRTTCggRiwgZXhjLT5tYXhGdW5jICsgMSApICkKICAgICAgIGdvdG8gRmFpbDsKIAogICAgIC8qIEV4Y2VwdCBmb3Igc29tZSBvbGQgQXBwbGUgZm9udHMsIGFsbCBmdW5jdGlvbnMgaW4gYSBUcnVlVHlwZSAqLwogICAgIC8qIGZvbnQgYXJlIGRlZmluZWQgaW4gaW5jcmVhc2luZyBvcmRlciwgc3RhcnRpbmcgZnJvbSAwLiAgVGhpcyAqLwogICAgIC8qIG1lYW5zIHRoYXQgd2Ugbm9ybWFsbHkgaGF2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgIENVUi5tYXhGdW5jKzEgPT0gQ1VSLm51bUZEZWZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgIENVUi5GRGVmc1tuXS5vcGMgPT0gbiBmb3IgbiBpbiAwLi5DVVIubWF4RnVuYyAgICAgICAgICAgICAqLworICAgIC8qICAgIGV4Yy0+bWF4RnVuYysxID09IGV4Yy0+bnVtRkRlZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgIGV4Yy0+RkRlZnNbbl0ub3BjID09IG4gZm9yIG4gaW4gMC4uZXhjLT5tYXhGdW5jICAgICAgICAgICAqLwogICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgIC8qIElmIHRoaXMgaXNuJ3QgdHJ1ZSwgd2UgbmVlZCB0byBsb29rIHVwIHRoZSBmdW5jdGlvbiB0YWJsZS4gICAqLwogCi0gICAgZGVmID0gQ1VSLkZEZWZzICsgRjsKLSAgICBpZiAoIENVUi5tYXhGdW5jICsgMSAhPSBDVVIubnVtRkRlZnMgfHwgZGVmLT5vcGMgIT0gRiApCisgICAgZGVmID0gZXhjLT5GRGVmcyArIEY7CisgICAgaWYgKCBleGMtPm1heEZ1bmMgKyAxICE9IGV4Yy0+bnVtRkRlZnMgfHwgZGVmLT5vcGMgIT0gRiApCiAgICAgewogICAgICAgLyogbG9vayB1cCB0aGUgRkRlZnMgdGFibGUgKi8KICAgICAgIFRUX0RlZlJlY29yZCogIGxpbWl0OwogCiAKLSAgICAgIGRlZiAgID0gQ1VSLkZEZWZzOwotICAgICAgbGltaXQgPSBkZWYgKyBDVVIubnVtRkRlZnM7CisgICAgICBkZWYgICA9IGV4Yy0+RkRlZnM7CisgICAgICBsaW1pdCA9IGRlZiArIGV4Yy0+bnVtRkRlZnM7CiAKICAgICAgIHdoaWxlICggZGVmIDwgbGltaXQgJiYgZGVmLT5vcGMgIT0gRiApCiAgICAgICAgIGRlZisrOwpAQCAtNDkzOCw0MSArMzg5Miw0MCBAQAogICAgICAgZ290byBGYWlsOwogCiAjaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCi0gICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBDVVIuaWdub3JlX3hfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAoICggQ1VSLml1cF9jYWxsZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAoIENVUi5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfTk9fQ0FMTF9BRlRFUl9JVVAgKSApIHx8Ci0gICAgICAgICAgICggZGVmLT5zcGhfZmRlZl9mbGFncyAmIFNQSF9GREVGX1ZBQ1VGT1JNX1JPVU5EXzEgKSAgICAgICApICkKKyAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICBleGMtPmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgKCAoIGV4Yy0+aXVwX2NhbGxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfTk9fQ0FMTF9BRlRFUl9JVVAgKSApIHx8CisgICAgICAgICAgICggZGVmLT5zcGhfZmRlZl9mbGFncyAmIFNQSF9GREVGX1ZBQ1VGT1JNX1JPVU5EXzEgKSAgICAgICAgKSApCiAgICAgICBnb3RvIEZhaWw7CiAgICAgZWxzZQotICAgICAgQ1VSLnNwaF9pbl9mdW5jX2ZsYWdzID0gZGVmLT5zcGhfZmRlZl9mbGFnczsKKyAgICAgIGV4Yy0+c3BoX2luX2Z1bmNfZmxhZ3MgPSBkZWYtPnNwaF9mZGVmX2ZsYWdzOwogI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwogCiAgICAgLyogY2hlY2sgdGhlIGNhbGwgc3RhY2sgKi8KLSAgICBpZiAoIENVUi5jYWxsVG9wID49IENVUi5jYWxsU2l6ZSApCisgICAgaWYgKCBleGMtPmNhbGxUb3AgPj0gZXhjLT5jYWxsU2l6ZSApCiAgICAgewotICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIFN0YWNrX092ZXJmbG93ICk7CisgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIFN0YWNrX092ZXJmbG93ICk7CiAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgcENyZWMgPSBDVVIuY2FsbFN0YWNrICsgQ1VSLmNhbGxUb3A7CisgICAgcENyZWMgPSBleGMtPmNhbGxTdGFjayArIGV4Yy0+Y2FsbFRvcDsKIAotICAgIHBDcmVjLT5DYWxsZXJfUmFuZ2UgPSBDVVIuY3VyUmFuZ2U7Ci0gICAgcENyZWMtPkNhbGxlcl9JUCAgICA9IENVUi5JUCArIDE7CisgICAgcENyZWMtPkNhbGxlcl9SYW5nZSA9IGV4Yy0+Y3VyUmFuZ2U7CisgICAgcENyZWMtPkNhbGxlcl9JUCAgICA9IGV4Yy0+SVAgKyAxOwogICAgIHBDcmVjLT5DdXJfQ291bnQgICAgPSAxOwogICAgIHBDcmVjLT5EZWYgICAgICAgICAgPSBkZWY7CiAKLSAgICBDVVIuY2FsbFRvcCsrOworICAgIGV4Yy0+Y2FsbFRvcCsrOwogCi0gICAgSU5TX0dvdG9fQ29kZVJhbmdlKCBkZWYtPnJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVmLT5zdGFydCApOworICAgIEluc19Hb3RvX0NvZGVSYW5nZSggZXhjLCBkZWYtPnJhbmdlLCBkZWYtPnN0YXJ0ICk7CiAKLSAgICBDVVIuc3RlcF9pbnMgPSBGQUxTRTsKKyAgICBleGMtPnN0ZXBfaW5zID0gRkFMU0U7CiAKICAgICByZXR1cm47CiAKICAgRmFpbDoKLSAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKKyAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CiAgIH0KIAogCkBAIC00OTgzLDcgKzM5MzYsOCBAQAogICAvKiBTdGFjazogICAgICAgIHVpbnQzMj8gRWludDE2PyAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIEluc19MT09QQ0FMTCggSU5TX0FSRyApCisgIEluc19MT09QQ0FMTCggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCiAgIHsKICAgICBGVF9VTG9uZyAgICAgICBGOwogICAgIFRUX0NhbGxSZWMqICAgIHBDcmVjOwpAQCAtNDk5MSwyOCArMzk0NSwyOCBAQAogCiAKICAgICAvKiBmaXJzdCBvZiBhbGwsIGNoZWNrIHRoZSBpbmRleCAqLwotICAgIEYgPSBhcmdzWzFdOwotICAgIGlmICggQk9VTkRTTCggRiwgQ1VSLm1heEZ1bmMgKyAxICkgKQorICAgIEYgPSAoRlRfVUxvbmcpYXJnc1sxXTsKKyAgICBpZiAoIEJPVU5EU0woIEYsIGV4Yy0+bWF4RnVuYyArIDEgKSApCiAgICAgICBnb3RvIEZhaWw7CiAKICAgICAvKiBFeGNlcHQgZm9yIHNvbWUgb2xkIEFwcGxlIGZvbnRzLCBhbGwgZnVuY3Rpb25zIGluIGEgVHJ1ZVR5cGUgKi8KICAgICAvKiBmb250IGFyZSBkZWZpbmVkIGluIGluY3JlYXNpbmcgb3JkZXIsIHN0YXJ0aW5nIGZyb20gMC4gIFRoaXMgKi8KICAgICAvKiBtZWFucyB0aGF0IHdlIG5vcm1hbGx5IGhhdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICBDVVIubWF4RnVuYysxID09IENVUi5udW1GRGVmcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICBDVVIuRkRlZnNbbl0ub3BjID09IG4gZm9yIG4gaW4gMC4uQ1VSLm1heEZ1bmMgICAgICAgICAgICAgKi8KKyAgICAvKiAgICBleGMtPm1heEZ1bmMrMSA9PSBleGMtPm51bUZEZWZzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICBleGMtPkZEZWZzW25dLm9wYyA9PSBuIGZvciBuIGluIDAuLmV4Yy0+bWF4RnVuYyAgICAgICAgICAgKi8KICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAvKiBJZiB0aGlzIGlzbid0IHRydWUsIHdlIG5lZWQgdG8gbG9vayB1cCB0aGUgZnVuY3Rpb24gdGFibGUuICAgKi8KIAotICAgIGRlZiA9IENVUi5GRGVmcyArIEY7Ci0gICAgaWYgKCBDVVIubWF4RnVuYyArIDEgIT0gQ1VSLm51bUZEZWZzIHx8IGRlZi0+b3BjICE9IEYgKQorICAgIGRlZiA9IGV4Yy0+RkRlZnMgKyBGOworICAgIGlmICggZXhjLT5tYXhGdW5jICsgMSAhPSBleGMtPm51bUZEZWZzIHx8IGRlZi0+b3BjICE9IEYgKQogICAgIHsKICAgICAgIC8qIGxvb2sgdXAgdGhlIEZEZWZzIHRhYmxlICovCiAgICAgICBUVF9EZWZSZWNvcmQqICBsaW1pdDsKIAogCi0gICAgICBkZWYgICA9IENVUi5GRGVmczsKLSAgICAgIGxpbWl0ID0gZGVmICsgQ1VSLm51bUZEZWZzOworICAgICAgZGVmICAgPSBleGMtPkZEZWZzOworICAgICAgbGltaXQgPSBkZWYgKyBleGMtPm51bUZEZWZzOwogCiAgICAgICB3aGlsZSAoIGRlZiA8IGxpbWl0ICYmIGRlZi0+b3BjICE9IEYgKQogICAgICAgICBkZWYrKzsKQEAgLTUwMjcsNDAgKzM5ODEsNDAgQEAKIAogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwogICAgIGlmICggU1VCUElYRUxfSElOVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBDVVIuaWdub3JlX3hfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgogICAgICAgICAgKCBkZWYtPnNwaF9mZGVmX2ZsYWdzICYgU1BIX0ZERUZfVkFDVUZPUk1fUk9VTkRfMSApICkKICAgICAgIGdvdG8gRmFpbDsKICAgICBlbHNlCi0gICAgICBDVVIuc3BoX2luX2Z1bmNfZmxhZ3MgPSBkZWYtPnNwaF9mZGVmX2ZsYWdzOworICAgICAgZXhjLT5zcGhfaW5fZnVuY19mbGFncyA9IGRlZi0+c3BoX2ZkZWZfZmxhZ3M7CiAjZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCiAKICAgICAvKiBjaGVjayBzdGFjayAqLwotICAgIGlmICggQ1VSLmNhbGxUb3AgPj0gQ1VSLmNhbGxTaXplICkKKyAgICBpZiAoIGV4Yy0+Y2FsbFRvcCA+PSBleGMtPmNhbGxTaXplICkKICAgICB7Ci0gICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggU3RhY2tfT3ZlcmZsb3cgKTsKKyAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggU3RhY2tfT3ZlcmZsb3cgKTsKICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBpZiAoIGFyZ3NbMF0gPiAwICkKICAgICB7Ci0gICAgICBwQ3JlYyA9IENVUi5jYWxsU3RhY2sgKyBDVVIuY2FsbFRvcDsKKyAgICAgIHBDcmVjID0gZXhjLT5jYWxsU3RhY2sgKyBleGMtPmNhbGxUb3A7CiAKLSAgICAgIHBDcmVjLT5DYWxsZXJfUmFuZ2UgPSBDVVIuY3VyUmFuZ2U7Ci0gICAgICBwQ3JlYy0+Q2FsbGVyX0lQICAgID0gQ1VSLklQICsgMTsKKyAgICAgIHBDcmVjLT5DYWxsZXJfUmFuZ2UgPSBleGMtPmN1clJhbmdlOworICAgICAgcENyZWMtPkNhbGxlcl9JUCAgICA9IGV4Yy0+SVAgKyAxOwogICAgICAgcENyZWMtPkN1cl9Db3VudCAgICA9IChGVF9JbnQpYXJnc1swXTsKICAgICAgIHBDcmVjLT5EZWYgICAgICAgICAgPSBkZWY7CiAKLSAgICAgIENVUi5jYWxsVG9wKys7CisgICAgICBleGMtPmNhbGxUb3ArKzsKIAotICAgICAgSU5TX0dvdG9fQ29kZVJhbmdlKCBkZWYtPnJhbmdlLCBkZWYtPnN0YXJ0ICk7CisgICAgICBJbnNfR290b19Db2RlUmFuZ2UoIGV4YywgZGVmLT5yYW5nZSwgZGVmLT5zdGFydCApOwogCi0gICAgICBDVVIuc3RlcF9pbnMgPSBGQUxTRTsKKyAgICAgIGV4Yy0+c3RlcF9pbnMgPSBGQUxTRTsKICAgICB9CiAKICAgICByZXR1cm47CiAKICAgRmFpbDoKLSAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKKyAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CiAgIH0KIAogCkBAIC01MDcxLDcgKzQwMjUsOCBAQAogICAvKiBTdGFjazogICAgICAgIEVpbnQ4IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIEluc19JREVGKCBJTlNfQVJHICkKKyAgSW5zX0lERUYoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCiAgIHsKICAgICBUVF9EZWZSZWNvcmQqICBkZWY7CiAgICAgVFRfRGVmUmVjb3JkKiAgbGltaXQ7CkBAIC01MDc5LDggKzQwMzQsOCBAQAogCiAgICAgLyogIEZpcnN0IG9mIGFsbCwgbG9vayBmb3IgdGhlIHNhbWUgZnVuY3Rpb24gaW4gb3VyIHRhYmxlICovCiAKLSAgICBkZWYgICA9IENVUi5JRGVmczsKLSAgICBsaW1pdCA9IGRlZiArIENVUi5udW1JRGVmczsKKyAgICBkZWYgICA9IGV4Yy0+SURlZnM7CisgICAgbGltaXQgPSBkZWYgKyBleGMtPm51bUlEZWZzOwogCiAgICAgZm9yICggOyBkZWYgPCBsaW1pdDsgZGVmKysgKQogICAgICAgaWYgKCBkZWYtPm9wYyA9PSAoRlRfVUxvbmcpYXJnc1swXSApCkBAIC01MDg5LDM5ICs0MDQ0LDM5IEBACiAgICAgaWYgKCBkZWYgPT0gbGltaXQgKQogICAgIHsKICAgICAgIC8qIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHJvb20gZm9yIGEgbmV3IGluc3RydWN0aW9uICovCi0gICAgICBpZiAoIENVUi5udW1JRGVmcyA+PSBDVVIubWF4SURlZnMgKQorICAgICAgaWYgKCBleGMtPm51bUlEZWZzID49IGV4Yy0+bWF4SURlZnMgKQogICAgICAgewotICAgICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggVG9vX01hbnlfSW5zdHJ1Y3Rpb25fRGVmcyApOworICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIFRvb19NYW55X0luc3RydWN0aW9uX0RlZnMgKTsKICAgICAgICAgcmV0dXJuOwogICAgICAgfQotICAgICAgQ1VSLm51bUlEZWZzKys7CisgICAgICBleGMtPm51bUlEZWZzKys7CiAgICAgfQogCiAgICAgLyogb3Bjb2RlIG11c3QgYmUgdW5zaWduZWQgOC1iaXQgaW50ZWdlciAqLwogICAgIGlmICggMCA+IGFyZ3NbMF0gfHwgYXJnc1swXSA+IDB4MDBGRiApCiAgICAgewotICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIFRvb19NYW55X0luc3RydWN0aW9uX0RlZnMgKTsKKyAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggVG9vX01hbnlfSW5zdHJ1Y3Rpb25fRGVmcyApOwogICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIGRlZi0+b3BjICAgID0gKEZUX0J5dGUpYXJnc1swXTsKLSAgICBkZWYtPnN0YXJ0ICA9IENVUi5JUCArIDE7Ci0gICAgZGVmLT5yYW5nZSAgPSBDVVIuY3VyUmFuZ2U7CisgICAgZGVmLT5zdGFydCAgPSBleGMtPklQICsgMTsKKyAgICBkZWYtPnJhbmdlICA9IGV4Yy0+Y3VyUmFuZ2U7CiAgICAgZGVmLT5hY3RpdmUgPSBUUlVFOwogCi0gICAgaWYgKCAoRlRfVUxvbmcpYXJnc1swXSA+IENVUi5tYXhJbnMgKQotICAgICAgQ1VSLm1heElucyA9IChGVF9CeXRlKWFyZ3NbMF07CisgICAgaWYgKCAoRlRfVUxvbmcpYXJnc1swXSA+IGV4Yy0+bWF4SW5zICkKKyAgICAgIGV4Yy0+bWF4SW5zID0gKEZUX0J5dGUpYXJnc1swXTsKIAogICAgIC8qIE5vdyBza2lwIHRoZSB3aG9sZSBmdW5jdGlvbiBkZWZpbml0aW9uLiAqLwogICAgIC8qIFdlIGRvbid0IGFsbG93IG5lc3RlZCBJREVGcyAmIEZERUZzLiAgICAqLwogCi0gICAgd2hpbGUgKCBTS0lQX0NvZGUoKSA9PSBTVUNDRVNTICkKKyAgICB3aGlsZSAoIFNraXBDb2RlKCBleGMgKSA9PSBTVUNDRVNTICkKICAgICB7Ci0gICAgICBzd2l0Y2ggKCBDVVIub3Bjb2RlICkKKyAgICAgIHN3aXRjaCAoIGV4Yy0+b3Bjb2RlICkKICAgICAgIHsKICAgICAgIGNhc2UgMHg4OTogICAvKiBJREVGICovCiAgICAgICBjYXNlIDB4MkM6ICAgLyogRkRFRiAqLwotICAgICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggTmVzdGVkX0RFRlMgKTsKKyAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBOZXN0ZWRfREVGUyApOwogICAgICAgICByZXR1cm47CiAgICAgICBjYXNlIDB4MkQ6ICAgLyogRU5ERiAqLwogICAgICAgICByZXR1cm47CkBAIC01MTM0LDggKzQwODksNiBAQAogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogUFVTSElORyBEQVRBIE9OVE8gVEhFIElOVEVSUFJFVEVSIFNUQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEluc3RydWN0aW9ucyBhcHBlYXIgaW4gdGhlIHNwZWNpZmljYXRpb24ncyBvcmRlci4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKQEAgLTUxNDYsMjMgKzQwOTksMjQgQEAKICAgLyogU3RhY2s6ICAgICAgICAtLT4gdWludDMyLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgdm9pZAotICBJbnNfTlBVU0hCKCBJTlNfQVJHICkKKyAgSW5zX05QVVNIQiggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQogICB7CiAgICAgRlRfVVNob3J0ICBMLCBLOwogCiAKLSAgICBMID0gKEZUX1VTaG9ydClDVVIuY29kZVtDVVIuSVAgKyAxXTsKKyAgICBMID0gKEZUX1VTaG9ydClleGMtPmNvZGVbZXhjLT5JUCArIDFdOwogCi0gICAgaWYgKCBCT1VORFMoIEwsIENVUi5zdGFja1NpemUgKyAxIC0gQ1VSLnRvcCApICkKKyAgICBpZiAoIEJPVU5EUyggTCwgZXhjLT5zdGFja1NpemUgKyAxIC0gZXhjLT50b3AgKSApCiAgICAgewotICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIFN0YWNrX092ZXJmbG93ICk7CisgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIFN0YWNrX092ZXJmbG93ICk7CiAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgZm9yICggSyA9IDE7IEsgPD0gTDsgSysrICkKLSAgICAgIGFyZ3NbSyAtIDFdID0gQ1VSLmNvZGVbQ1VSLklQICsgSyArIDFdOworICAgICAgYXJnc1tLIC0gMV0gPSBleGMtPmNvZGVbZXhjLT5JUCArIEsgKyAxXTsKIAotICAgIENVUi5uZXdfdG9wICs9IEw7CisgICAgZXhjLT5uZXdfdG9wICs9IEw7CiAgIH0KIAogCkBAIC01MTczLDI2ICs0MTI3LDI3IEBACiAgIC8qIFN0YWNrOiAgICAgICAgLS0+IGludDMyLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX05QVVNIVyggSU5TX0FSRyApCisgIEluc19OUFVTSFcoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKICAgewogICAgIEZUX1VTaG9ydCAgTCwgSzsKIAogCi0gICAgTCA9IChGVF9VU2hvcnQpQ1VSLmNvZGVbQ1VSLklQICsgMV07CisgICAgTCA9IChGVF9VU2hvcnQpZXhjLT5jb2RlW2V4Yy0+SVAgKyAxXTsKIAotICAgIGlmICggQk9VTkRTKCBMLCBDVVIuc3RhY2tTaXplICsgMSAtIENVUi50b3AgKSApCisgICAgaWYgKCBCT1VORFMoIEwsIGV4Yy0+c3RhY2tTaXplICsgMSAtIGV4Yy0+dG9wICkgKQogICAgIHsKLSAgICAgIENVUi5lcnJvciA9IEZUX1RIUk9XKCBTdGFja19PdmVyZmxvdyApOworICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBTdGFja19PdmVyZmxvdyApOwogICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIENVUi5JUCArPSAyOworICAgIGV4Yy0+SVAgKz0gMjsKIAogICAgIGZvciAoIEsgPSAwOyBLIDwgTDsgSysrICkKLSAgICAgIGFyZ3NbS10gPSBHRVRfU2hvcnRJbnMoKTsKKyAgICAgIGFyZ3NbS10gPSBHZXRTaG9ydElucyggZXhjICk7CiAKLSAgICBDVVIuc3RlcF9pbnMgPSBGQUxTRTsKLSAgICBDVVIubmV3X3RvcCArPSBMOworICAgIGV4Yy0+c3RlcF9pbnMgPSBGQUxTRTsKKyAgICBleGMtPm5ld190b3AgKz0gTDsKICAgfQogCiAKQEAgLTUyMDMsMjEgKzQxNTgsMjIgQEAKICAgLyogU3RhY2s6ICAgICAgICAtLT4gdWludDMyLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgdm9pZAotICBJbnNfUFVTSEIoIElOU19BUkcgKQorICBJbnNfUFVTSEIoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQogICB7CiAgICAgRlRfVVNob3J0ICBMLCBLOwogCiAKLSAgICBMID0gKEZUX1VTaG9ydCkoIENVUi5vcGNvZGUgLSAweEIwICsgMSApOworICAgIEwgPSAoRlRfVVNob3J0KSggZXhjLT5vcGNvZGUgLSAweEIwICsgMSApOwogCi0gICAgaWYgKCBCT1VORFMoIEwsIENVUi5zdGFja1NpemUgKyAxIC0gQ1VSLnRvcCApICkKKyAgICBpZiAoIEJPVU5EUyggTCwgZXhjLT5zdGFja1NpemUgKyAxIC0gZXhjLT50b3AgKSApCiAgICAgewotICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIFN0YWNrX092ZXJmbG93ICk7CisgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIFN0YWNrX092ZXJmbG93ICk7CiAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgZm9yICggSyA9IDE7IEsgPD0gTDsgSysrICkKLSAgICAgIGFyZ3NbSyAtIDFdID0gQ1VSLmNvZGVbQ1VSLklQICsgS107CisgICAgICBhcmdzW0sgLSAxXSA9IGV4Yy0+Y29kZVtleGMtPklQICsgS107CiAgIH0KIAogCkBAIC01MjI4LDI1ICs0MTg0LDI2IEBACiAgIC8qIFN0YWNrOiAgICAgICAgLS0+IGludDMyLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX1BVU0hXKCBJTlNfQVJHICkKKyAgSW5zX1BVU0hXKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKICAgewogICAgIEZUX1VTaG9ydCAgTCwgSzsKIAogCi0gICAgTCA9IChGVF9VU2hvcnQpKCBDVVIub3Bjb2RlIC0gMHhCOCArIDEgKTsKKyAgICBMID0gKEZUX1VTaG9ydCkoIGV4Yy0+b3Bjb2RlIC0gMHhCOCArIDEgKTsKIAotICAgIGlmICggQk9VTkRTKCBMLCBDVVIuc3RhY2tTaXplICsgMSAtIENVUi50b3AgKSApCisgICAgaWYgKCBCT1VORFMoIEwsIGV4Yy0+c3RhY2tTaXplICsgMSAtIGV4Yy0+dG9wICkgKQogICAgIHsKLSAgICAgIENVUi5lcnJvciA9IEZUX1RIUk9XKCBTdGFja19PdmVyZmxvdyApOworICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBTdGFja19PdmVyZmxvdyApOwogICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIENVUi5JUCsrOworICAgIGV4Yy0+SVArKzsKIAogICAgIGZvciAoIEsgPSAwOyBLIDwgTDsgSysrICkKLSAgICAgIGFyZ3NbS10gPSBHRVRfU2hvcnRJbnMoKTsKKyAgICAgIGFyZ3NbS10gPSBHZXRTaG9ydElucyggZXhjICk7CiAKLSAgICBDVVIuc3RlcF9pbnMgPSBGQUxTRTsKKyAgICBleGMtPnN0ZXBfaW5zID0gRkFMU0U7CiAgIH0KIAogCkBAIC01MjU0LDExICs0MjExLDU2MSBAQAogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogTUFOQUdJTkcgVEhFIEdSQVBISUNTIFNUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgSW5zdHJ1Y3Rpb25zIGFwcGVhciBpbiB0aGUgc3BlY3MnIG9yZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKKyAgc3RhdGljIEZUX0Jvb2wKKyAgSW5zX1N4VlRMKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgICBhSWR4MSwKKyAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICAgYUlkeDIsCisgICAgICAgICAgICAgRlRfVW5pdFZlY3RvciogIFZlYyApCisgIHsKKyAgICBGVF9Mb25nICAgICBBLCBCLCBDOworICAgIEZUX1ZlY3RvciogIHAxOworICAgIEZUX1ZlY3RvciogIHAyOworCisgICAgRlRfQnl0ZSAgb3Bjb2RlID0gZXhjLT5vcGNvZGU7CisKKworICAgIGlmICggQk9VTkRTKCBhSWR4MSwgZXhjLT56cDIubl9wb2ludHMgKSB8fAorICAgICAgICAgQk9VTkRTKCBhSWR4MiwgZXhjLT56cDEubl9wb2ludHMgKSApCisgICAgeworICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CisgICAgICByZXR1cm4gRkFJTFVSRTsKKyAgICB9CisKKyAgICBwMSA9IGV4Yy0+enAxLmN1ciArIGFJZHgyOworICAgIHAyID0gZXhjLT56cDIuY3VyICsgYUlkeDE7CisKKyAgICBBID0gcDEtPnggLSBwMi0+eDsKKyAgICBCID0gcDEtPnkgLSBwMi0+eTsKKworICAgIC8qIElmIHAxID09IHAyLCBTUHZUTCBhbmQgU0Z2VEwgYmVoYXZlIHRoZSBzYW1lIGFzICovCisgICAgLyogU1B2VENBW1hdIGFuZCBTRnZUQ0FbWF0sIHJlc3BlY3RpdmVseS4gICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIENvbmZpcm1lZCBieSBHcmVnIEhpdGNoY29jay4gICAgICAgICAgICAgICAgICAgICovCisKKyAgICBpZiAoIEEgPT0gMCAmJiBCID09IDAgKQorICAgIHsKKyAgICAgIEEgICAgICA9IDB4NDAwMDsKKyAgICAgIG9wY29kZSA9IDA7CisgICAgfQorCisgICAgaWYgKCAoIG9wY29kZSAmIDEgKSAhPSAwICkKKyAgICB7CisgICAgICBDID0gIEI7ICAgLyogY291bnRlciBjbG9ja3dpc2Ugcm90YXRpb24gKi8KKyAgICAgIEIgPSAgQTsKKyAgICAgIEEgPSAtQzsKKyAgICB9CisKKyAgICBOb3JtYWxpemUoIEEsIEIsIFZlYyApOworCisgICAgcmV0dXJuIFNVQ0NFU1M7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU1ZUQ0FbYV06ICAgICBTZXQgKEYgYW5kIFApIFZlY3RvcnMgdG8gQ29vcmRpbmF0ZSBBeGlzICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHgwMC0weDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNQdlRDQVthXTogICAgU2V0IFBWZWN0b3IgdG8gQ29vcmRpbmF0ZSBBeGlzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4MDItMHgwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTRnZUQ0FbYV06ICAgIFNldCBGVmVjdG9yIHRvIENvb3JkaW5hdGUgQXhpcyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDA0LTB4MDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljIHZvaWQKKyAgSW5zX1N4eVRDQSggVFRfRXhlY0NvbnRleHQgIGV4YyApCisgIHsKKyAgICBGVF9TaG9ydCAgQUEsIEJCOworCisgICAgRlRfQnl0ZSAgb3Bjb2RlID0gZXhjLT5vcGNvZGU7CisKKworICAgIEFBID0gKEZUX1Nob3J0KSggKCBvcGNvZGUgJiAxICkgPDwgMTQgKTsKKyAgICBCQiA9IChGVF9TaG9ydCkoIEFBIF4gMHg0MDAwICk7CisKKyAgICBpZiAoIG9wY29kZSA8IDQgKQorICAgIHsKKyAgICAgIGV4Yy0+R1MucHJvalZlY3Rvci54ID0gQUE7CisgICAgICBleGMtPkdTLnByb2pWZWN0b3IueSA9IEJCOworCisgICAgICBleGMtPkdTLmR1YWxWZWN0b3IueCA9IEFBOworICAgICAgZXhjLT5HUy5kdWFsVmVjdG9yLnkgPSBCQjsKKyAgICB9CisgICAgZWxzZQorICAgICAgR1VFU1NfVkVDVE9SKCBwcm9qVmVjdG9yICk7CisKKyAgICBpZiAoICggb3Bjb2RlICYgMiApID09IDAgKQorICAgIHsKKyAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci54ID0gQUE7CisgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueSA9IEJCOworICAgIH0KKyAgICBlbHNlCisgICAgICBHVUVTU19WRUNUT1IoIGZyZWVWZWN0b3IgKTsKKworICAgIENvbXB1dGVfRnVuY3MoIGV4YyApOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNQdlRMW2FdOiAgICAgU2V0IFBWZWN0b3IgVG8gTGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4MDYtMHgwNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMgdm9pZAorICBJbnNfU1BWVEwoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQorICB7CisgICAgaWYgKCBJbnNfU3hWVEwoIGV4YywKKyAgICAgICAgICAgICAgICAgICAgKEZUX1VTaG9ydClhcmdzWzFdLAorICAgICAgICAgICAgICAgICAgICAoRlRfVVNob3J0KWFyZ3NbMF0sCisgICAgICAgICAgICAgICAgICAgICZleGMtPkdTLnByb2pWZWN0b3IgKSA9PSBTVUNDRVNTICkKKyAgICB7CisgICAgICBleGMtPkdTLmR1YWxWZWN0b3IgPSBleGMtPkdTLnByb2pWZWN0b3I7CisgICAgICBHVUVTU19WRUNUT1IoIGZyZWVWZWN0b3IgKTsKKyAgICAgIENvbXB1dGVfRnVuY3MoIGV4YyApOworICAgIH0KKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTRnZUTFthXTogICAgIFNldCBGVmVjdG9yIFRvIExpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDA4LTB4MDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgdWludDMyIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljIHZvaWQKKyAgSW5zX1NGVlRMKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKKyAgeworICAgIGlmICggSW5zX1N4VlRMKCBleGMsCisgICAgICAgICAgICAgICAgICAgIChGVF9VU2hvcnQpYXJnc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgKEZUX1VTaG9ydClhcmdzWzBdLAorICAgICAgICAgICAgICAgICAgICAmZXhjLT5HUy5mcmVlVmVjdG9yICkgPT0gU1VDQ0VTUyApCisgICAgeworICAgICAgR1VFU1NfVkVDVE9SKCBwcm9qVmVjdG9yICk7CisgICAgICBDb21wdXRlX0Z1bmNzKCBleGMgKTsKKyAgICB9CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU0Z2VFB2W106ICAgICBTZXQgRlZlY3RvciBUbyBQVmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHgwRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYyB2b2lkCisgIEluc19TRlZUUFYoIFRUX0V4ZWNDb250ZXh0ICBleGMgKQorICB7CisgICAgR1VFU1NfVkVDVE9SKCBwcm9qVmVjdG9yICk7CisgICAgZXhjLT5HUy5mcmVlVmVjdG9yID0gZXhjLT5HUy5wcm9qVmVjdG9yOworICAgIENvbXB1dGVfRnVuY3MoIGV4YyApOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNQdkZTW106ICAgICAgU2V0IFBWZWN0b3IgRnJvbSBTdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4MEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICBmMi4xNCBmMi4xNCAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMgdm9pZAorICBJbnNfU1BWRlMoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQorICB7CisgICAgRlRfU2hvcnQgIFM7CisgICAgRlRfTG9uZyAgIFgsIFk7CisKKworICAgIC8qIE9ubHkgdXNlIGxvdyAxNmJpdHMsIHRoZW4gc2lnbiBleHRlbmQgKi8KKyAgICBTID0gKEZUX1Nob3J0KWFyZ3NbMV07CisgICAgWSA9IChGVF9Mb25nKVM7CisgICAgUyA9IChGVF9TaG9ydClhcmdzWzBdOworICAgIFggPSAoRlRfTG9uZylTOworCisgICAgTm9ybWFsaXplKCBYLCBZLCAmZXhjLT5HUy5wcm9qVmVjdG9yICk7CisKKyAgICBleGMtPkdTLmR1YWxWZWN0b3IgPSBleGMtPkdTLnByb2pWZWN0b3I7CisgICAgR1VFU1NfVkVDVE9SKCBmcmVlVmVjdG9yICk7CisgICAgQ29tcHV0ZV9GdW5jcyggZXhjICk7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU0Z2RlNbXTogICAgICBTZXQgRlZlY3RvciBGcm9tIFN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHgwQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIGYyLjE0IGYyLjE0IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYyB2b2lkCisgIEluc19TRlZGUyggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCisgIHsKKyAgICBGVF9TaG9ydCAgUzsKKyAgICBGVF9Mb25nICAgWCwgWTsKKworCisgICAgLyogT25seSB1c2UgbG93IDE2Yml0cywgdGhlbiBzaWduIGV4dGVuZCAqLworICAgIFMgPSAoRlRfU2hvcnQpYXJnc1sxXTsKKyAgICBZID0gKEZUX0xvbmcpUzsKKyAgICBTID0gKEZUX1Nob3J0KWFyZ3NbMF07CisgICAgWCA9IFM7CisKKyAgICBOb3JtYWxpemUoIFgsIFksICZleGMtPkdTLmZyZWVWZWN0b3IgKTsKKyAgICBHVUVTU19WRUNUT1IoIHByb2pWZWN0b3IgKTsKKyAgICBDb21wdXRlX0Z1bmNzKCBleGMgKTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBHUHZbXTogICAgICAgIEdldCBQcm9qZWN0aW9uIFZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDBDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgZWYyLjE0IC0tPiBlZjIuMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljIHZvaWQKKyAgSW5zX0dQViggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQorICB7CisjaWZkZWYgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcKKyAgICBpZiAoIGV4Yy0+ZmFjZS0+dW5wYXRlbnRlZF9oaW50aW5nICkKKyAgICB7CisgICAgICBhcmdzWzBdID0gZXhjLT5HUy5ib3RoX3hfYXhpcyA/IDB4NDAwMCA6IDA7CisgICAgICBhcmdzWzFdID0gZXhjLT5HUy5ib3RoX3hfYXhpcyA/IDAgOiAweDQwMDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBhcmdzWzBdID0gZXhjLT5HUy5wcm9qVmVjdG9yLng7CisgICAgICBhcmdzWzFdID0gZXhjLT5HUy5wcm9qVmVjdG9yLnk7CisgICAgfQorI2Vsc2UKKyAgICBhcmdzWzBdID0gZXhjLT5HUy5wcm9qVmVjdG9yLng7CisgICAgYXJnc1sxXSA9IGV4Yy0+R1MucHJvalZlY3Rvci55OworI2VuZGlmCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogR0Z2W106ICAgICAgICBHZXQgRnJlZWRvbSBWZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHgwRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIGVmMi4xNCAtLT4gZWYyLjE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYyB2b2lkCisgIEluc19HRlYoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKKyAgeworI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HCisgICAgaWYgKCBleGMtPmZhY2UtPnVucGF0ZW50ZWRfaGludGluZyApCisgICAgeworICAgICAgYXJnc1swXSA9IGV4Yy0+R1MuYm90aF94X2F4aXMgPyAweDQwMDAgOiAwOworICAgICAgYXJnc1sxXSA9IGV4Yy0+R1MuYm90aF94X2F4aXMgPyAwIDogMHg0MDAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgYXJnc1swXSA9IGV4Yy0+R1MuZnJlZVZlY3Rvci54OworICAgICAgYXJnc1sxXSA9IGV4Yy0+R1MuZnJlZVZlY3Rvci55OworICAgIH0KKyNlbHNlCisgICAgYXJnc1swXSA9IGV4Yy0+R1MuZnJlZVZlY3Rvci54OworICAgIGFyZ3NbMV0gPSBleGMtPkdTLmZyZWVWZWN0b3IueTsKKyNlbmRpZgorICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNSUDBbXTogICAgICAgU2V0IFJlZmVyZW5jZSBQb2ludCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4MTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMgdm9pZAorICBJbnNfU1JQMCggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKKyAgeworICAgIGV4Yy0+R1MucnAwID0gKEZUX1VTaG9ydClhcmdzWzBdOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNSUDFbXTogICAgICAgU2V0IFJlZmVyZW5jZSBQb2ludCAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMgdm9pZAorICBJbnNfU1JQMSggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKKyAgeworICAgIGV4Yy0+R1MucnAxID0gKEZUX1VTaG9ydClhcmdzWzBdOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNSUDJbXTogICAgICAgU2V0IFJlZmVyZW5jZSBQb2ludCAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4MTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMgdm9pZAorICBJbnNfU1JQMiggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKKyAgeworICAgIGV4Yy0+R1MucnAyID0gKEZUX1VTaG9ydClhcmdzWzBdOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNNRFtdOiAgICAgICAgU2V0IE1pbmltdW0gRGlzdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4MUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMgdm9pZAorICBJbnNfU01EKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCisgIHsKKyAgICBleGMtPkdTLm1pbmltdW1fZGlzdGFuY2UgPSBhcmdzWzBdOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNDVlRDSVtdOiAgICAgU2V0IENvbnRyb2wgVmFsdWUgVGFibGUgQ3V0IEluICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4MUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMgdm9pZAorICBJbnNfU0NWVENJKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCisgIHsKKyAgICBleGMtPkdTLmNvbnRyb2xfdmFsdWVfY3V0aW4gPSAoRlRfRjI2RG90NilhcmdzWzBdOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNTV0NJW106ICAgICAgU2V0IFNpbmdsZSBXaWR0aCBDdXQgSW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4MUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMgdm9pZAorICBJbnNfU1NXQ0koIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQorICB7CisgICAgZXhjLT5HUy5zaW5nbGVfd2lkdGhfY3V0aW4gPSAoRlRfRjI2RG90NilhcmdzWzBdOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNTV1tdOiAgICAgICAgU2V0IFNpbmdsZSBXaWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4MUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICBpbnQzMj8gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMgdm9pZAorICBJbnNfU1NXKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCisgIHsKKyAgICBleGMtPkdTLnNpbmdsZV93aWR0aF92YWx1ZSA9IEZUX011bEZpeCggYXJnc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT50dF9tZXRyaWNzLnNjYWxlICk7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRkxJUE9OW106ICAgICBTZXQgYXV0by1GTElQIHRvIE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg0RCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYyB2b2lkCisgIEluc19GTElQT04oIFRUX0V4ZWNDb250ZXh0ICBleGMgKQorICB7CisgICAgZXhjLT5HUy5hdXRvX2ZsaXAgPSBUUlVFOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEZMSVBPRkZbXTogICAgU2V0IGF1dG8tRkxJUCB0byBPRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4NEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMgdm9pZAorICBJbnNfRkxJUE9GRiggVFRfRXhlY0NvbnRleHQgIGV4YyApCisgIHsKKyAgICBleGMtPkdTLmF1dG9fZmxpcCA9IEZBTFNFOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNBTkdXW106ICAgICAgU2V0IEFOR2xlIFdlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4N0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMgdm9pZAorICBJbnNfU0FOR1coIHZvaWQgKQorICB7CisgICAgLyogaW5zdHJ1Y3Rpb24gbm90IHN1cHBvcnRlZCBhbnltb3JlICovCisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU0RCW106ICAgICAgICBTZXQgRGVsdGEgQmFzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg1RSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYyB2b2lkCisgIEluc19TREIoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKKyAgeworICAgIGV4Yy0+R1MuZGVsdGFfYmFzZSA9IChGVF9VU2hvcnQpYXJnc1swXTsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTRFNbXTogICAgICAgIFNldCBEZWx0YSBTaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDVGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljIHZvaWQKKyAgSW5zX1NEUyggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQorICB7CisgICAgaWYgKCAoRlRfVUxvbmcpYXJnc1swXSA+IDZVTCApCisgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEJhZF9Bcmd1bWVudCApOworICAgIGVsc2UKKyAgICAgIGV4Yy0+R1MuZGVsdGFfc2hpZnQgPSAoRlRfVVNob3J0KWFyZ3NbMF07CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUlRIR1tdOiAgICAgICBSb3VuZCBUbyBIYWxmIEdyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHgxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYyB2b2lkCisgIEluc19SVEhHKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKKyAgeworICAgIGV4Yy0+R1Mucm91bmRfc3RhdGUgPSBUVF9Sb3VuZF9Ub19IYWxmX0dyaWQ7CisgICAgZXhjLT5mdW5jX3JvdW5kICAgICA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX1RvX0hhbGZfR3JpZDsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBSVEdbXTogICAgICAgIFJvdW5kIFRvIEdyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljIHZvaWQKKyAgSW5zX1JURyggVFRfRXhlY0NvbnRleHQgIGV4YyApCisgIHsKKyAgICBleGMtPkdTLnJvdW5kX3N0YXRlID0gVFRfUm91bmRfVG9fR3JpZDsKKyAgICBleGMtPmZ1bmNfcm91bmQgICAgID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfVG9fR3JpZDsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qIFJUREdbXTogICAgICAgUm91bmQgVG8gRG91YmxlIEdyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4M0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMgdm9pZAorICBJbnNfUlRERyggVFRfRXhlY0NvbnRleHQgIGV4YyApCisgIHsKKyAgICBleGMtPkdTLnJvdW5kX3N0YXRlID0gVFRfUm91bmRfVG9fRG91YmxlX0dyaWQ7CisgICAgZXhjLT5mdW5jX3JvdW5kICAgICA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX1RvX0RvdWJsZV9HcmlkOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogUlVUR1tdOiAgICAgICBSb3VuZCBVcCBUbyBHcmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg3QyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYyB2b2lkCisgIEluc19SVVRHKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKKyAgeworICAgIGV4Yy0+R1Mucm91bmRfc3RhdGUgPSBUVF9Sb3VuZF9VcF9Ub19HcmlkOworICAgIGV4Yy0+ZnVuY19yb3VuZCAgICAgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9VcF9Ub19HcmlkOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFJEVEdbXTogICAgICAgUm91bmQgRG93biBUbyBHcmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4N0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMgdm9pZAorICBJbnNfUkRURyggVFRfRXhlY0NvbnRleHQgIGV4YyApCisgIHsKKyAgICBleGMtPkdTLnJvdW5kX3N0YXRlID0gVFRfUm91bmRfRG93bl9Ub19HcmlkOworICAgIGV4Yy0+ZnVuY19yb3VuZCAgICAgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9Eb3duX1RvX0dyaWQ7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUk9GRltdOiAgICAgICBSb3VuZCBPRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg3QSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYyB2b2lkCisgIEluc19ST0ZGKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKKyAgeworICAgIGV4Yy0+R1Mucm91bmRfc3RhdGUgPSBUVF9Sb3VuZF9PZmY7CisgICAgZXhjLT5mdW5jX3JvdW5kICAgICA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX05vbmU7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU1JPVU5EW106ICAgICBTdXBlciBST1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wY29kZSByYW5nZTogMHg3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdGFjazogICAgICAgIEVpbnQ4IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0YXRpYyB2b2lkCisgIEluc19TUk9VTkQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKKyAgeworICAgIFNldFN1cGVyUm91bmQoIGV4YywgMHg0MDAwLCBhcmdzWzBdICk7CisKKyAgICBleGMtPkdTLnJvdW5kX3N0YXRlID0gVFRfUm91bmRfU3VwZXI7CisgICAgZXhjLT5mdW5jX3JvdW5kICAgICA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX1N1cGVyOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFM0NVJPVU5EW106ICAgU3VwZXIgUk9VTkQgNDUgZGVncmVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBPcGNvZGUgcmFuZ2U6IDB4NzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBzdGF0aWMgdm9pZAorICBJbnNfUzQ1Uk9VTkQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQorICB7CisgICAgU2V0U3VwZXJSb3VuZCggZXhjLCAweDJENDEsIGFyZ3NbMF0gKTsKKworICAgIGV4Yy0+R1Mucm91bmRfc3RhdGUgPSBUVF9Sb3VuZF9TdXBlcl80NTsKKyAgICBleGMtPmZ1bmNfcm91bmQgICAgID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfU3VwZXJfNDU7CisgIH0KKworCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogR0NbYV06ICAgICAgICBHZXQgQ29vcmRpbmF0ZSBwcm9qZWN0ZWQgb250byAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01MjY5LDcgKzQ3NzYsOCBAQAogICAvKiAgICAgIGFsb25nIHRoZSBkdWFsIHByb2plY3Rpb24gdmVjdG9yISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIEluc19HQyggSU5TX0FSRyApCisgIEluc19HQyggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCiAgIHsKICAgICBGVF9VTG9uZyAgICBMOwogICAgIEZUX0YyNkRvdDYgIFI7CkBAIC01Mjc3LDE4ICs0Nzg1LDE4IEBACiAKICAgICBMID0gKEZUX1VMb25nKWFyZ3NbMF07CiAKLSAgICBpZiAoIEJPVU5EU0woIEwsIENVUi56cDIubl9wb2ludHMgKSApCisgICAgaWYgKCBCT1VORFNMKCBMLCBleGMtPnpwMi5uX3BvaW50cyApICkKICAgICB7Ci0gICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CisgICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCisgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKICAgICAgIFIgPSAwOwogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgaWYgKCBDVVIub3Bjb2RlICYgMSApCi0gICAgICAgIFIgPSBDVVJfZmFzdF9kdWFscHJvaiggJkNVUi56cDIub3JnW0xdICk7CisgICAgICBpZiAoIGV4Yy0+b3Bjb2RlICYgMSApCisgICAgICAgIFIgPSBGQVNUX0RVQUxQUk9KKCAmZXhjLT56cDIub3JnW0xdICk7CiAgICAgICBlbHNlCi0gICAgICAgIFIgPSBDVVJfZmFzdF9wcm9qZWN0KCAmQ1VSLnpwMi5jdXJbTF0gKTsKKyAgICAgICAgUiA9IEZBU1RfUFJPSkVDVCggJmV4Yy0+enAyLmN1cltMXSApOwogICAgIH0KIAogICAgIGFyZ3NbMF0gPSBSOwpAQCAtNTMwNiw3ICs0ODE0LDggQEAKICAgLyogICBPQSA6PSBPQSArICggdmFsdWUgLSBPQS5wICkvKCBmLnAgKSAqIGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgdm9pZAotICBJbnNfU0NGUyggSU5TX0FSRyApCisgIEluc19TQ0ZTKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQogICB7CiAgICAgRlRfTG9uZyAgICBLOwogICAgIEZUX1VTaG9ydCAgTDsKQEAgLTUzMTQsMjEgKzQ4MjMsMjEgQEAKIAogICAgIEwgPSAoRlRfVVNob3J0KWFyZ3NbMF07CiAKLSAgICBpZiAoIEJPVU5EUyggTCwgQ1VSLnpwMi5uX3BvaW50cyApICkKKyAgICBpZiAoIEJPVU5EUyggTCwgZXhjLT56cDIubl9wb2ludHMgKSApCiAgICAgewotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIENVUi5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOworICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CiAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgSyA9IENVUl9mYXN0X3Byb2plY3QoICZDVVIuenAyLmN1cltMXSApOworICAgIEsgPSBGQVNUX1BST0pFQ1QoICZleGMtPnpwMi5jdXJbTF0gKTsKIAotICAgIENVUl9GdW5jX21vdmUoICZDVVIuenAyLCBMLCBhcmdzWzFdIC0gSyApOworICAgIGV4Yy0+ZnVuY19tb3ZlKCBleGMsICZleGMtPnpwMiwgTCwgYXJnc1sxXSAtIEsgKTsKIAogICAgIC8qIFVORE9DVU1FTlRFRCEgIFRoZSBNUyByYXN0ZXJpemVyIGRvZXMgdGhhdCB3aXRoICovCiAgICAgLyogdHdpbGlnaHQgcG9pbnRzIChjb25maXJtZWQgYnkgR3JlZyBIaXRjaGNvY2spICAgKi8KLSAgICBpZiAoIENVUi5HUy5nZXAyID09IDAgKQotICAgICAgQ1VSLnpwMi5vcmdbTF0gPSBDVVIuenAyLmN1cltMXTsKKyAgICBpZiAoIGV4Yy0+R1MuZ2VwMiA9PSAwICkKKyAgICAgIGV4Yy0+enAyLm9yZ1tMXSA9IGV4Yy0+enAyLmN1cltMXTsKICAgfQogCiAKQEAgLTUzNDgsNyArNDg1Nyw4IEBACiAgIC8qIFhYWDogVU5ET0NVTUVOVEVEOiBgenAwIC0genAxJywgYW5kIG5vdCBgenAyIC0genAxISAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX01EKCBJTlNfQVJHICkKKyAgSW5zX01EKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKICAgewogICAgIEZUX1VTaG9ydCAgIEssIEw7CiAgICAgRlRfRjI2RG90NiAgRDsKQEAgLTUzNTcsNTAgKzQ4NjcsNTAgQEAKICAgICBLID0gKEZUX1VTaG9ydClhcmdzWzFdOwogICAgIEwgPSAoRlRfVVNob3J0KWFyZ3NbMF07CiAKLSAgICBpZiAoIEJPVU5EUyggTCwgQ1VSLnpwMC5uX3BvaW50cyApIHx8Ci0gICAgICAgICBCT1VORFMoIEssIENVUi56cDEubl9wb2ludHMgKSApCisgICAgaWYgKCBCT1VORFMoIEwsIGV4Yy0+enAwLm5fcG9pbnRzICkgfHwKKyAgICAgICAgIEJPVU5EUyggSywgZXhjLT56cDEubl9wb2ludHMgKSApCiAgICAgewotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIENVUi5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOworICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CiAgICAgICBEID0gMDsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgIGlmICggQ1VSLm9wY29kZSAmIDEgKQotICAgICAgICBEID0gQ1VSX0Z1bmNfcHJvamVjdCggQ1VSLnpwMC5jdXIgKyBMLCBDVVIuenAxLmN1ciArIEsgKTsKKyAgICAgIGlmICggZXhjLT5vcGNvZGUgJiAxICkKKyAgICAgICAgRCA9IFBST0pFQ1QoIGV4Yy0+enAwLmN1ciArIEwsIGV4Yy0+enAxLmN1ciArIEsgKTsKICAgICAgIGVsc2UKICAgICAgIHsKICAgICAgICAgLyogWFhYOiBVTkRPQ1VNRU5URUQ6IHR3aWxpZ2h0IHpvbmUgc3BlY2lhbCBjYXNlICovCiAKLSAgICAgICAgaWYgKCBDVVIuR1MuZ2VwMCA9PSAwIHx8IENVUi5HUy5nZXAxID09IDAgKQorICAgICAgICBpZiAoIGV4Yy0+R1MuZ2VwMCA9PSAwIHx8IGV4Yy0+R1MuZ2VwMSA9PSAwICkKICAgICAgICAgewotICAgICAgICAgIEZUX1ZlY3RvciogIHZlYzEgPSBDVVIuenAwLm9yZyArIEw7Ci0gICAgICAgICAgRlRfVmVjdG9yKiAgdmVjMiA9IENVUi56cDEub3JnICsgSzsKKyAgICAgICAgICBGVF9WZWN0b3IqICB2ZWMxID0gZXhjLT56cDAub3JnICsgTDsKKyAgICAgICAgICBGVF9WZWN0b3IqICB2ZWMyID0gZXhjLT56cDEub3JnICsgSzsKIAogCi0gICAgICAgICAgRCA9IENVUl9GdW5jX2R1YWxwcm9qKCB2ZWMxLCB2ZWMyICk7CisgICAgICAgICAgRCA9IERVQUxQUk9KKCB2ZWMxLCB2ZWMyICk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7Ci0gICAgICAgICAgRlRfVmVjdG9yKiAgdmVjMSA9IENVUi56cDAub3J1cyArIEw7Ci0gICAgICAgICAgRlRfVmVjdG9yKiAgdmVjMiA9IENVUi56cDEub3J1cyArIEs7CisgICAgICAgICAgRlRfVmVjdG9yKiAgdmVjMSA9IGV4Yy0+enAwLm9ydXMgKyBMOworICAgICAgICAgIEZUX1ZlY3RvciogIHZlYzIgPSBleGMtPnpwMS5vcnVzICsgSzsKIAogCi0gICAgICAgICAgaWYgKCBDVVIubWV0cmljcy54X3NjYWxlID09IENVUi5tZXRyaWNzLnlfc2NhbGUgKQorICAgICAgICAgIGlmICggZXhjLT5tZXRyaWNzLnhfc2NhbGUgPT0gZXhjLT5tZXRyaWNzLnlfc2NhbGUgKQogICAgICAgICAgIHsKICAgICAgICAgICAgIC8qIHRoaXMgc2hvdWxkIGJlIGZhc3RlciAqLwotICAgICAgICAgICAgRCA9IENVUl9GdW5jX2R1YWxwcm9qKCB2ZWMxLCB2ZWMyICk7Ci0gICAgICAgICAgICBEID0gRlRfTXVsRml4KCBELCBDVVIubWV0cmljcy54X3NjYWxlICk7CisgICAgICAgICAgICBEID0gRFVBTFBST0ooIHZlYzEsIHZlYzIgKTsKKyAgICAgICAgICAgIEQgPSBGVF9NdWxGaXgoIEQsIGV4Yy0+bWV0cmljcy54X3NjYWxlICk7CiAgICAgICAgICAgfQogICAgICAgICAgIGVsc2UKICAgICAgICAgICB7CiAgICAgICAgICAgICBGVF9WZWN0b3IgIHZlYzsKIAogCi0gICAgICAgICAgICB2ZWMueCA9IEZUX011bEZpeCggdmVjMS0+eCAtIHZlYzItPngsIENVUi5tZXRyaWNzLnhfc2NhbGUgKTsKLSAgICAgICAgICAgIHZlYy55ID0gRlRfTXVsRml4KCB2ZWMxLT55IC0gdmVjMi0+eSwgQ1VSLm1ldHJpY3MueV9zY2FsZSApOworICAgICAgICAgICAgdmVjLnggPSBGVF9NdWxGaXgoIHZlYzEtPnggLSB2ZWMyLT54LCBleGMtPm1ldHJpY3MueF9zY2FsZSApOworICAgICAgICAgICAgdmVjLnkgPSBGVF9NdWxGaXgoIHZlYzEtPnkgLSB2ZWMyLT55LCBleGMtPm1ldHJpY3MueV9zY2FsZSApOwogCi0gICAgICAgICAgICBEID0gQ1VSX2Zhc3RfZHVhbHByb2ooICZ2ZWMgKTsKKyAgICAgICAgICAgIEQgPSBGQVNUX0RVQUxQUk9KKCAmdmVjICk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CkBAIC01NDA4LDggKzQ5MTgsOSBAQAogCiAjaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCiAgICAgLyogRGlzYWJsZSBUeXBlIDIgVmFjdWZvcm0gUm91bmRzIC0gZS5nLiBBcmlhbCBOYXJyb3cgKi8KLSAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkcgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBDVVIuaWdub3JlX3hfbW9kZSAmJiBGVF9BQlMoIEQgKSA9PSA2NCApCisgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICAgJiYKKyAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSAmJgorICAgICAgICAgRlRfQUJTKCBEICkgPT0gNjQgICkKICAgICAgIEQgKz0gMTsKICNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KIApAQCAtNTQxOSw2MSArNDkzMCw2MyBAQAogCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0RQVlRMW2FdOiAgICBTZXQgRHVhbCBQVmVjdG9yIHRvIExpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFNEUHZUTFthXTogICAgU2V0IER1YWwgUFZlY3RvciB0byBMaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiBPcGNvZGUgcmFuZ2U6IDB4ODYtMHg4NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgdm9pZAotICBJbnNfU0RQVlRMKCBJTlNfQVJHICkKKyAgSW5zX1NEUFZUTCggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQogICB7CiAgICAgRlRfTG9uZyAgICBBLCBCLCBDOwogICAgIEZUX1VTaG9ydCAgcDEsIHAyOyAgICAgICAgICAgIC8qIHdhcyBGVF9JbnQgaW4gcGFzIHR5cGUgRVJST1IgKi8KLSAgICBGVF9JbnQgICAgIGFPcGMgPSBDVVIub3Bjb2RlOworCisgICAgRlRfQnl0ZSAgb3Bjb2RlID0gZXhjLT5vcGNvZGU7CiAKIAogICAgIHAxID0gKEZUX1VTaG9ydClhcmdzWzFdOwogICAgIHAyID0gKEZUX1VTaG9ydClhcmdzWzBdOwogCi0gICAgaWYgKCBCT1VORFMoIHAyLCBDVVIuenAxLm5fcG9pbnRzICkgfHwKLSAgICAgICAgIEJPVU5EUyggcDEsIENVUi56cDIubl9wb2ludHMgKSApCisgICAgaWYgKCBCT1VORFMoIHAyLCBleGMtPnpwMS5uX3BvaW50cyApIHx8CisgICAgICAgICBCT1VORFMoIHAxLCBleGMtPnpwMi5uX3BvaW50cyApICkKICAgICB7Ci0gICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CisgICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCisgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICB7Ci0gICAgICBGVF9WZWN0b3IqIHYxID0gQ1VSLnpwMS5vcmcgKyBwMjsKLSAgICAgIEZUX1ZlY3RvciogdjIgPSBDVVIuenAyLm9yZyArIHAxOworICAgICAgRlRfVmVjdG9yKiB2MSA9IGV4Yy0+enAxLm9yZyArIHAyOworICAgICAgRlRfVmVjdG9yKiB2MiA9IGV4Yy0+enAyLm9yZyArIHAxOwogCiAKICAgICAgIEEgPSB2MS0+eCAtIHYyLT54OwogICAgICAgQiA9IHYxLT55IC0gdjItPnk7CiAKLSAgICAgIC8qIElmIHYxID09IHYyLCBTRFBWVEwgYmVoYXZlcyB0aGUgc2FtZSBhcyAqLworICAgICAgLyogSWYgdjEgPT0gdjIsIFNEUHZUTCBiZWhhdmVzIHRoZSBzYW1lIGFzICovCiAgICAgICAvKiBTVlRDQVtYXSwgcmVzcGVjdGl2ZWx5LiAgICAgICAgICAgICAgICAgKi8KICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgLyogQ29uZmlybWVkIGJ5IEdyZWcgSGl0Y2hjb2NrLiAgICAgICAgICAgICovCiAKICAgICAgIGlmICggQSA9PSAwICYmIEIgPT0gMCApCiAgICAgICB7Ci0gICAgICAgIEEgICAgPSAweDQwMDA7Ci0gICAgICAgIGFPcGMgPSAwOworICAgICAgICBBICAgICAgPSAweDQwMDA7CisgICAgICAgIG9wY29kZSA9IDA7CiAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCAoIGFPcGMgJiAxICkgIT0gMCApCisgICAgaWYgKCAoIG9wY29kZSAmIDEgKSAhPSAwICkKICAgICB7CiAgICAgICBDID0gIEI7ICAgLyogY291bnRlciBjbG9ja3dpc2Ugcm90YXRpb24gKi8KICAgICAgIEIgPSAgQTsKICAgICAgIEEgPSAtQzsKICAgICB9CiAKLSAgICBOT1JNYWxpemUoIEEsIEIsICZDVVIuR1MuZHVhbFZlY3RvciApOworICAgIE5vcm1hbGl6ZSggQSwgQiwgJmV4Yy0+R1MuZHVhbFZlY3RvciApOwogCiAgICAgewotICAgICAgRlRfVmVjdG9yKiAgdjEgPSBDVVIuenAxLmN1ciArIHAyOwotICAgICAgRlRfVmVjdG9yKiAgdjIgPSBDVVIuenAyLmN1ciArIHAxOworICAgICAgRlRfVmVjdG9yKiAgdjEgPSBleGMtPnpwMS5jdXIgKyBwMjsKKyAgICAgIEZUX1ZlY3RvciogIHYyID0gZXhjLT56cDIuY3VyICsgcDE7CiAKIAogICAgICAgQSA9IHYxLT54IC0gdjItPng7CkBAIC01NDgxLDIzICs0OTk0LDIxIEBACiAKICAgICAgIGlmICggQSA9PSAwICYmIEIgPT0gMCApCiAgICAgICB7Ci0gICAgICAgIEEgICAgPSAweDQwMDA7Ci0gICAgICAgIGFPcGMgPSAwOworICAgICAgICBBICAgICAgPSAweDQwMDA7CisgICAgICAgIG9wY29kZSA9IDA7CiAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCAoIGFPcGMgJiAxICkgIT0gMCApCisgICAgaWYgKCAoIG9wY29kZSAmIDEgKSAhPSAwICkKICAgICB7CiAgICAgICBDID0gIEI7ICAgLyogY291bnRlciBjbG9ja3dpc2Ugcm90YXRpb24gKi8KICAgICAgIEIgPSAgQTsKICAgICAgIEEgPSAtQzsKICAgICB9CiAKLSAgICBOT1JNYWxpemUoIEEsIEIsICZDVVIuR1MucHJvalZlY3RvciApOwotCisgICAgTm9ybWFsaXplKCBBLCBCLCAmZXhjLT5HUy5wcm9qVmVjdG9yICk7CiAgICAgR1VFU1NfVkVDVE9SKCBmcmVlVmVjdG9yICk7Ci0KLSAgICBDT01QVVRFX0Z1bmNzKCk7CisgICAgQ29tcHV0ZV9GdW5jcyggZXhjICk7CiAgIH0KIAogCkBAIC01NTA4LDI1ICs1MDE5LDI2IEBACiAgIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX1NaUDAoIElOU19BUkcgKQorICBJbnNfU1pQMCggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKICAgewogICAgIHN3aXRjaCAoIChGVF9JbnQpYXJnc1swXSApCiAgICAgewogICAgIGNhc2UgMDoKLSAgICAgIENVUi56cDAgPSBDVVIudHdpbGlnaHQ7CisgICAgICBleGMtPnpwMCA9IGV4Yy0+dHdpbGlnaHQ7CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgMToKLSAgICAgIENVUi56cDAgPSBDVVIucHRzOworICAgICAgZXhjLT56cDAgPSBleGMtPnB0czsKICAgICAgIGJyZWFrOwogCiAgICAgZGVmYXVsdDoKLSAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKKyAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwogICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIENVUi5HUy5nZXAwID0gKEZUX1VTaG9ydClhcmdzWzBdOworICAgIGV4Yy0+R1MuZ2VwMCA9IChGVF9VU2hvcnQpYXJnc1swXTsKICAgfQogCiAKQEAgLTU1MzcsMjUgKzUwNDksMjYgQEAKICAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgdm9pZAotICBJbnNfU1pQMSggSU5TX0FSRyApCisgIEluc19TWlAxKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQogICB7CiAgICAgc3dpdGNoICggKEZUX0ludClhcmdzWzBdICkKICAgICB7CiAgICAgY2FzZSAwOgotICAgICAgQ1VSLnpwMSA9IENVUi50d2lsaWdodDsKKyAgICAgIGV4Yy0+enAxID0gZXhjLT50d2lsaWdodDsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAxOgotICAgICAgQ1VSLnpwMSA9IENVUi5wdHM7CisgICAgICBleGMtPnpwMSA9IGV4Yy0+cHRzOwogICAgICAgYnJlYWs7CiAKICAgICBkZWZhdWx0OgotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIENVUi5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOworICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CiAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgQ1VSLkdTLmdlcDEgPSAoRlRfVVNob3J0KWFyZ3NbMF07CisgICAgZXhjLT5HUy5nZXAxID0gKEZUX1VTaG9ydClhcmdzWzBdOwogICB9CiAKIApAQCAtNTU2NiwyNSArNTA3OSwyNiBAQAogICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIEluc19TWlAyKCBJTlNfQVJHICkKKyAgSW5zX1NaUDIoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCiAgIHsKICAgICBzd2l0Y2ggKCAoRlRfSW50KWFyZ3NbMF0gKQogICAgIHsKICAgICBjYXNlIDA6Ci0gICAgICBDVVIuenAyID0gQ1VSLnR3aWxpZ2h0OworICAgICAgZXhjLT56cDIgPSBleGMtPnR3aWxpZ2h0OwogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDE6Ci0gICAgICBDVVIuenAyID0gQ1VSLnB0czsKKyAgICAgIGV4Yy0+enAyID0gZXhjLT5wdHM7CiAgICAgICBicmVhazsKIAogICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CisgICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCisgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBDVVIuR1MuZ2VwMiA9IChGVF9VU2hvcnQpYXJnc1swXTsKKyAgICBleGMtPkdTLmdlcDIgPSAoRlRfVVNob3J0KWFyZ3NbMF07CiAgIH0KIAogCkBAIC01NTk1LDYwICs1MTA5LDgyIEBACiAgIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX1NaUFMoIElOU19BUkcgKQorICBJbnNfU1pQUyggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKICAgewogICAgIHN3aXRjaCAoIChGVF9JbnQpYXJnc1swXSApCiAgICAgewogICAgIGNhc2UgMDoKLSAgICAgIENVUi56cDAgPSBDVVIudHdpbGlnaHQ7CisgICAgICBleGMtPnpwMCA9IGV4Yy0+dHdpbGlnaHQ7CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgMToKLSAgICAgIENVUi56cDAgPSBDVVIucHRzOworICAgICAgZXhjLT56cDAgPSBleGMtPnB0czsKICAgICAgIGJyZWFrOwogCiAgICAgZGVmYXVsdDoKLSAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKKyAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwogICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIENVUi56cDEgPSBDVVIuenAwOwotICAgIENVUi56cDIgPSBDVVIuenAwOworICAgIGV4Yy0+enAxID0gZXhjLT56cDA7CisgICAgZXhjLT56cDIgPSBleGMtPnpwMDsKIAotICAgIENVUi5HUy5nZXAwID0gKEZUX1VTaG9ydClhcmdzWzBdOwotICAgIENVUi5HUy5nZXAxID0gKEZUX1VTaG9ydClhcmdzWzBdOwotICAgIENVUi5HUy5nZXAyID0gKEZUX1VTaG9ydClhcmdzWzBdOworICAgIGV4Yy0+R1MuZ2VwMCA9IChGVF9VU2hvcnQpYXJnc1swXTsKKyAgICBleGMtPkdTLmdlcDEgPSAoRlRfVVNob3J0KWFyZ3NbMF07CisgICAgZXhjLT5HUy5nZXAyID0gKEZUX1VTaG9ydClhcmdzWzBdOwogICB9CiAKIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qIElOU1RDVFJMW106ICAgSU5TVHJ1Y3Rpb24gQ29uVFJvTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4OGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogT3Bjb2RlIHJhbmdlOiAweDhFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qIFN0YWNrOiAgICAgICAgaW50MzIgaW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX0lOU1RDVFJMKCBJTlNfQVJHICkKKyAgSW5zX0lOU1RDVFJMKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKICAgewotICAgIEZUX0xvbmcgIEssIEw7CisgICAgRlRfVUxvbmcgIEssIEwsIEtmOwogCiAKLSAgICBLID0gYXJnc1sxXTsKLSAgICBMID0gYXJnc1swXTsKKyAgICBLID0gKEZUX1VMb25nKWFyZ3NbMV07CisgICAgTCA9IChGVF9VTG9uZylhcmdzWzBdOwogCi0gICAgaWYgKCBLIDwgMSB8fCBLID4gMiApCisgICAgLyogc2VsZWN0b3IgdmFsdWVzIGNhbm5vdCBiZSBgT1InZWQ7ICAgICAgICAgICAgICAgICAqLworICAgIC8qIHRoZXkgYXJlIGluZGljZXMgc3RhcnRpbmcgd2l0aCBpbmRleCAxLCBub3QgZmxhZ3MgKi8KKyAgICBpZiAoIEsgPCAxIHx8IEsgPiAzICkKICAgICB7Ci0gICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CisgICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCisgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAoIEwgIT0gMCApCi0gICAgICAgIEwgPSBLOworICAgIC8qIGNvbnZlcnQgaW5kZXggdG8gZmxhZyB2YWx1ZSAqLworICAgIEtmID0gMSA8PCAoIEsgLSAxICk7CiAKLSAgICBDVVIuR1MuaW5zdHJ1Y3RfY29udHJvbCA9IEZUX0JPT0woCi0gICAgICAoIChGVF9CeXRlKUNVUi5HUy5pbnN0cnVjdF9jb250cm9sICYgfihGVF9CeXRlKUsgKSB8IChGVF9CeXRlKUwgKTsKKyAgICBpZiAoIEwgIT0gMCApCisgICAgeworICAgICAgLyogYXJndW1lbnRzIHRvIHNlbGVjdG9ycyBsb29rIGxpa2UgZmxhZyB2YWx1ZXMgKi8KKyAgICAgIGlmICggTCAhPSBLZiApCisgICAgICB7CisgICAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBleGMtPkdTLmluc3RydWN0X2NvbnRyb2wgJj0gfihGVF9CeXRlKUtmOworICAgIGV4Yy0+R1MuaW5zdHJ1Y3RfY29udHJvbCB8PSAoRlRfQnl0ZSlMOworCisjaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCisgICAgLyogSU5TVENUUkwgbW9kaWZ5aW5nIGZsYWcgMyBhbHNvIGhhcyBhbiBlZmZlY3QgKi8KKyAgICAvKiBvdXRzaWRlIG9mIHRoZSBDVlQgcHJvZ3JhbSAgICAgICAgICAgICAgICAgICAqLworICAgIGlmICggSyA9PSAzICkKKyAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSA9IEZUX0JPT0woIEwgPT0gNCApOworI2VuZGlmCiAgIH0KIAogCkBAIC01NjU5LDcgKzUxOTUsOCBAQAogICAvKiBTdGFjazogICAgICAgIHVpbnQzMj8gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIEluc19TQ0FOQ1RSTCggSU5TX0FSRyApCisgIEluc19TQ0FOQ1RSTCggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCiAgIHsKICAgICBGVF9JbnQgIEE7CiAKQEAgLTU2NjksMzIgKzUyMDYsMzIgQEAKIAogICAgIGlmICggQSA9PSAweEZGICkKICAgICB7Ci0gICAgICBDVVIuR1Muc2Nhbl9jb250cm9sID0gVFJVRTsKKyAgICAgIGV4Yy0+R1Muc2Nhbl9jb250cm9sID0gVFJVRTsKICAgICAgIHJldHVybjsKICAgICB9CiAgICAgZWxzZSBpZiAoIEEgPT0gMCApCiAgICAgewotICAgICAgQ1VSLkdTLnNjYW5fY29udHJvbCA9IEZBTFNFOworICAgICAgZXhjLT5HUy5zY2FuX2NvbnRyb2wgPSBGQUxTRTsKICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAoICggYXJnc1swXSAmIDB4MTAwICkgIT0gMCAmJiBDVVIudHRfbWV0cmljcy5wcGVtIDw9IEEgKQotICAgICAgQ1VSLkdTLnNjYW5fY29udHJvbCA9IFRSVUU7CisgICAgaWYgKCAoIGFyZ3NbMF0gJiAweDEwMCApICE9IDAgJiYgZXhjLT50dF9tZXRyaWNzLnBwZW0gPD0gQSApCisgICAgICBleGMtPkdTLnNjYW5fY29udHJvbCA9IFRSVUU7CiAKLSAgICBpZiAoICggYXJnc1swXSAmIDB4MjAwICkgIT0gMCAmJiBDVVIudHRfbWV0cmljcy5yb3RhdGVkICkKLSAgICAgIENVUi5HUy5zY2FuX2NvbnRyb2wgPSBUUlVFOworICAgIGlmICggKCBhcmdzWzBdICYgMHgyMDAgKSAhPSAwICYmIGV4Yy0+dHRfbWV0cmljcy5yb3RhdGVkICkKKyAgICAgIGV4Yy0+R1Muc2Nhbl9jb250cm9sID0gVFJVRTsKIAotICAgIGlmICggKCBhcmdzWzBdICYgMHg0MDAgKSAhPSAwICYmIENVUi50dF9tZXRyaWNzLnN0cmV0Y2hlZCApCi0gICAgICBDVVIuR1Muc2Nhbl9jb250cm9sID0gVFJVRTsKKyAgICBpZiAoICggYXJnc1swXSAmIDB4NDAwICkgIT0gMCAmJiBleGMtPnR0X21ldHJpY3Muc3RyZXRjaGVkICkKKyAgICAgIGV4Yy0+R1Muc2Nhbl9jb250cm9sID0gVFJVRTsKIAotICAgIGlmICggKCBhcmdzWzBdICYgMHg4MDAgKSAhPSAwICYmIENVUi50dF9tZXRyaWNzLnBwZW0gPiBBICkKLSAgICAgIENVUi5HUy5zY2FuX2NvbnRyb2wgPSBGQUxTRTsKKyAgICBpZiAoICggYXJnc1swXSAmIDB4ODAwICkgIT0gMCAmJiBleGMtPnR0X21ldHJpY3MucHBlbSA+IEEgKQorICAgICAgZXhjLT5HUy5zY2FuX2NvbnRyb2wgPSBGQUxTRTsKIAotICAgIGlmICggKCBhcmdzWzBdICYgMHgxMDAwICkgIT0gMCAmJiBDVVIudHRfbWV0cmljcy5yb3RhdGVkICkKLSAgICAgIENVUi5HUy5zY2FuX2NvbnRyb2wgPSBGQUxTRTsKKyAgICBpZiAoICggYXJnc1swXSAmIDB4MTAwMCApICE9IDAgJiYgZXhjLT50dF9tZXRyaWNzLnJvdGF0ZWQgKQorICAgICAgZXhjLT5HUy5zY2FuX2NvbnRyb2wgPSBGQUxTRTsKIAotICAgIGlmICggKCBhcmdzWzBdICYgMHgyMDAwICkgIT0gMCAmJiBDVVIudHRfbWV0cmljcy5zdHJldGNoZWQgKQotICAgICAgQ1VSLkdTLnNjYW5fY29udHJvbCA9IEZBTFNFOworICAgIGlmICggKCBhcmdzWzBdICYgMHgyMDAwICkgIT0gMCAmJiBleGMtPnR0X21ldHJpY3Muc3RyZXRjaGVkICkKKyAgICAgIGV4Yy0+R1Muc2Nhbl9jb250cm9sID0gRkFMU0U7CiAgIH0KIAogCkBAIC01NzA1LDEwICs1MjQyLDExIEBACiAgIC8qIFN0YWNrOiAgICAgICAgdWludDMyPyAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX1NDQU5UWVBFKCBJTlNfQVJHICkKKyAgSW5zX1NDQU5UWVBFKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKICAgewogICAgIGlmICggYXJnc1swXSA+PSAwICkKLSAgICAgIENVUi5HUy5zY2FuX3R5cGUgPSAoRlRfSW50KWFyZ3NbMF07CisgICAgICBleGMtPkdTLnNjYW5fdHlwZSA9IChGVF9JbnQpYXJnc1swXTsKICAgfQogCiAKQEAgLTU3MTYsOCArNTI1NCw2IEBACiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiBNQU5BR0lORyBPVVRMSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSW5zdHJ1Y3Rpb25zIGFwcGVhciBpbiB0aGUgc3BlY2lmaWNhdGlvbidzIG9yZGVyLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIApAQCAtNTcyOCw0MyArNTI2NCw0MSBAQAogICAvKiBTdGFjazogICAgICAgIHVpbnQzMi4uLiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIEluc19GTElQUFQoIElOU19BUkcgKQorICBJbnNfRkxJUFBUKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKICAgewogICAgIEZUX1VTaG9ydCAgcG9pbnQ7CiAKLSAgICBGVF9VTlVTRURfQVJHOwogCi0KLSAgICBpZiAoIENVUi50b3AgPCBDVVIuR1MubG9vcCApCisgICAgaWYgKCBleGMtPnRvcCA8IGV4Yy0+R1MubG9vcCApCiAgICAgewotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIENVUi5lcnJvciA9IEZUX1RIUk9XKCBUb29fRmV3X0FyZ3VtZW50cyApOworICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIFRvb19GZXdfQXJndW1lbnRzICk7CiAgICAgICBnb3RvIEZhaWw7CiAgICAgfQogCi0gICAgd2hpbGUgKCBDVVIuR1MubG9vcCA+IDAgKQorICAgIHdoaWxlICggZXhjLT5HUy5sb29wID4gMCApCiAgICAgewotICAgICAgQ1VSLmFyZ3MtLTsKKyAgICAgIGV4Yy0+YXJncy0tOwogCi0gICAgICBwb2ludCA9IChGVF9VU2hvcnQpQ1VSLnN0YWNrW0NVUi5hcmdzXTsKKyAgICAgIHBvaW50ID0gKEZUX1VTaG9ydClleGMtPnN0YWNrW2V4Yy0+YXJnc107CiAKLSAgICAgIGlmICggQk9VTkRTKCBwb2ludCwgQ1VSLnB0cy5uX3BvaW50cyApICkKKyAgICAgIGlmICggQk9VTkRTKCBwb2ludCwgZXhjLT5wdHMubl9wb2ludHMgKSApCiAgICAgICB7Ci0gICAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCiAgICAgICAgIHsKLSAgICAgICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKKyAgICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CiAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBlbHNlCi0gICAgICAgIENVUi5wdHMudGFnc1twb2ludF0gXj0gRlRfQ1VSVkVfVEFHX09OOworICAgICAgICBleGMtPnB0cy50YWdzW3BvaW50XSBePSBGVF9DVVJWRV9UQUdfT047CiAKLSAgICAgIENVUi5HUy5sb29wLS07CisgICAgICBleGMtPkdTLmxvb3AtLTsKICAgICB9CiAKICAgRmFpbDoKLSAgICBDVVIuR1MubG9vcCA9IDE7Ci0gICAgQ1VSLm5ld190b3AgPSBDVVIuYXJnczsKKyAgICBleGMtPkdTLmxvb3AgPSAxOworICAgIGV4Yy0+bmV3X3RvcCA9IGV4Yy0+YXJnczsKICAgfQogCiAKQEAgLTU3NzUsNyArNTMwOSw4IEBACiAgIC8qIFN0YWNrOiAgICAgICAgdWludDMyIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX0ZMSVBSR09OKCBJTlNfQVJHICkKKyAgSW5zX0ZMSVBSR09OKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKICAgewogICAgIEZUX1VTaG9ydCAgSSwgSywgTDsKIApAQCAtNTc4MywxNiArNTMxOCwxNiBAQAogICAgIEsgPSAoRlRfVVNob3J0KWFyZ3NbMV07CiAgICAgTCA9IChGVF9VU2hvcnQpYXJnc1swXTsKIAotICAgIGlmICggQk9VTkRTKCBLLCBDVVIucHRzLm5fcG9pbnRzICkgfHwKLSAgICAgICAgIEJPVU5EUyggTCwgQ1VSLnB0cy5uX3BvaW50cyApICkKKyAgICBpZiAoIEJPVU5EUyggSywgZXhjLT5wdHMubl9wb2ludHMgKSB8fAorICAgICAgICAgQk9VTkRTKCBMLCBleGMtPnB0cy5uX3BvaW50cyApICkKICAgICB7Ci0gICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CisgICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCisgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBmb3IgKCBJID0gTDsgSSA8PSBLOyBJKysgKQotICAgICAgQ1VSLnB0cy50YWdzW0ldIHw9IEZUX0NVUlZFX1RBR19PTjsKKyAgICAgIGV4Yy0+cHRzLnRhZ3NbSV0gfD0gRlRfQ1VSVkVfVEFHX09OOwogICB9CiAKIApAQCAtNTgwMyw3ICs1MzM4LDggQEAKICAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgdm9pZAotICBJbnNfRkxJUFJHT0ZGKCBJTlNfQVJHICkKKyAgSW5zX0ZMSVBSR09GRiggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQogICB7CiAgICAgRlRfVVNob3J0ICBJLCBLLCBMOwogCkBAIC01ODExLDQ1ICs1MzQ3LDQ2IEBACiAgICAgSyA9IChGVF9VU2hvcnQpYXJnc1sxXTsKICAgICBMID0gKEZUX1VTaG9ydClhcmdzWzBdOwogCi0gICAgaWYgKCBCT1VORFMoIEssIENVUi5wdHMubl9wb2ludHMgKSB8fAotICAgICAgICAgQk9VTkRTKCBMLCBDVVIucHRzLm5fcG9pbnRzICkgKQorICAgIGlmICggQk9VTkRTKCBLLCBleGMtPnB0cy5uX3BvaW50cyApIHx8CisgICAgICAgICBCT1VORFMoIEwsIGV4Yy0+cHRzLm5fcG9pbnRzICkgKQogICAgIHsKLSAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKKyAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwogICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIGZvciAoIEkgPSBMOyBJIDw9IEs7IEkrKyApCi0gICAgICBDVVIucHRzLnRhZ3NbSV0gJj0gfkZUX0NVUlZFX1RBR19PTjsKKyAgICAgIGV4Yy0+cHRzLnRhZ3NbSV0gJj0gfkZUX0NVUlZFX1RBR19PTjsKICAgfQogCiAKICAgc3RhdGljIEZUX0Jvb2wKLSAgQ29tcHV0ZV9Qb2ludF9EaXNwbGFjZW1lbnQoIEVYRUNfT1BfIEZUX0YyNkRvdDYqICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYqICAgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0dseXBoWm9uZSAgem9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCogICAgcmVmcCApCisgIENvbXB1dGVfUG9pbnRfRGlzcGxhY2VtZW50KCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiogICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2KiAgICAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0dseXBoWm9uZSAgICB6b25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgICAgIHJlZnAgKQogICB7CiAgICAgVFRfR2x5cGhab25lUmVjICB6cDsKICAgICBGVF9VU2hvcnQgICAgICAgIHA7CiAgICAgRlRfRjI2RG90NiAgICAgICBkOwogCiAKLSAgICBpZiAoIENVUi5vcGNvZGUgJiAxICkKKyAgICBpZiAoIGV4Yy0+b3Bjb2RlICYgMSApCiAgICAgewotICAgICAgenAgPSBDVVIuenAwOwotICAgICAgcCAgPSBDVVIuR1MucnAxOworICAgICAgenAgPSBleGMtPnpwMDsKKyAgICAgIHAgID0gZXhjLT5HUy5ycDE7CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICB6cCA9IENVUi56cDE7Ci0gICAgICBwICA9IENVUi5HUy5ycDI7CisgICAgICB6cCA9IGV4Yy0+enAxOworICAgICAgcCAgPSBleGMtPkdTLnJwMjsKICAgICB9CiAKICAgICBpZiAoIEJPVU5EUyggcCwgenAubl9wb2ludHMgKSApCiAgICAgewotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIENVUi5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOworICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CiAgICAgICAqcmVmcCA9IDA7CiAgICAgICByZXR1cm4gRkFJTFVSRTsKICAgICB9CkBAIC01ODU3LDEyICs1Mzk0LDEyIEBACiAgICAgKnpvbmUgPSB6cDsKICAgICAqcmVmcCA9IHA7CiAKLSAgICBkID0gQ1VSX0Z1bmNfcHJvamVjdCggenAuY3VyICsgcCwgenAub3JnICsgcCApOworICAgIGQgPSBQUk9KRUNUKCB6cC5jdXIgKyBwLCB6cC5vcmcgKyBwICk7CiAKICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1VOUEFURU5URURfSElOVElORwotICAgIGlmICggQ1VSLmZhY2UtPnVucGF0ZW50ZWRfaGludGluZyApCisgICAgaWYgKCBleGMtPmZhY2UtPnVucGF0ZW50ZWRfaGludGluZyApCiAgICAgewotICAgICAgaWYgKCBDVVIuR1MuYm90aF94X2F4aXMgKQorICAgICAgaWYgKCBleGMtPkdTLmJvdGhfeF9heGlzICkKICAgICAgIHsKICAgICAgICAgKnggPSBkOwogICAgICAgICAqeSA9IDA7CkBAIC01ODc2LDggKzU0MTMsOCBAQAogICAgIGVsc2UKICNlbmRpZgogICAgIHsKLSAgICAgICp4ID0gRlRfTXVsRGl2KCBkLCAoRlRfTG9uZylDVVIuR1MuZnJlZVZlY3Rvci54LCBDVVIuRl9kb3RfUCApOwotICAgICAgKnkgPSBGVF9NdWxEaXYoIGQsIChGVF9Mb25nKUNVUi5HUy5mcmVlVmVjdG9yLnksIENVUi5GX2RvdF9QICk7CisgICAgICAqeCA9IEZUX011bERpdiggZCwgKEZUX0xvbmcpZXhjLT5HUy5mcmVlVmVjdG9yLngsIGV4Yy0+Rl9kb3RfUCApOworICAgICAgKnkgPSBGVF9NdWxEaXYoIGQsIChGVF9Mb25nKWV4Yy0+R1MuZnJlZVZlY3Rvci55LCBleGMtPkZfZG90X1AgKTsKICAgICB9CiAKICAgICByZXR1cm4gU1VDQ0VTUzsKQEAgLTU4ODUsNDIgKzU0MjIsNDMgQEAKIAogCiAgIHN0YXRpYyB2b2lkCi0gIE1vdmVfWnAyX1BvaW50KCBFWEVDX09QXyBGVF9VU2hvcnQgICBwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIGR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICB0b3VjaCApCisgIE1vdmVfWnAyX1BvaW50KCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgIHBvaW50LAorICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGR4LAorICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGR5LAorICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgIHRvdWNoICkKICAgewogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HCi0gICAgaWYgKCBDVVIuZmFjZS0+dW5wYXRlbnRlZF9oaW50aW5nICkKKyAgICBpZiAoIGV4Yy0+ZmFjZS0+dW5wYXRlbnRlZF9oaW50aW5nICkKICAgICB7Ci0gICAgICBpZiAoIENVUi5HUy5ib3RoX3hfYXhpcyApCisgICAgICBpZiAoIGV4Yy0+R1MuYm90aF94X2F4aXMgKQogICAgICAgewotICAgICAgICBDVVIuenAyLmN1cltwb2ludF0ueCArPSBkeDsKKyAgICAgICAgZXhjLT56cDIuY3VyW3BvaW50XS54ICs9IGR4OwogICAgICAgICBpZiAoIHRvdWNoICkKLSAgICAgICAgICBDVVIuenAyLnRhZ3NbcG9pbnRdIHw9IEZUX0NVUlZFX1RBR19UT1VDSF9YOworICAgICAgICAgIGV4Yy0+enAyLnRhZ3NbcG9pbnRdIHw9IEZUX0NVUlZFX1RBR19UT1VDSF9YOwogICAgICAgfQogICAgICAgZWxzZQogICAgICAgewotICAgICAgICBDVVIuenAyLmN1cltwb2ludF0ueSArPSBkeTsKKyAgICAgICAgZXhjLT56cDIuY3VyW3BvaW50XS55ICs9IGR5OwogICAgICAgICBpZiAoIHRvdWNoICkKLSAgICAgICAgICBDVVIuenAyLnRhZ3NbcG9pbnRdIHw9IEZUX0NVUlZFX1RBR19UT1VDSF9ZOworICAgICAgICAgIGV4Yy0+enAyLnRhZ3NbcG9pbnRdIHw9IEZUX0NVUlZFX1RBR19UT1VDSF9ZOwogICAgICAgfQogICAgICAgcmV0dXJuOwogICAgIH0KICNlbmRpZgogCi0gICAgaWYgKCBDVVIuR1MuZnJlZVZlY3Rvci54ICE9IDAgKQorICAgIGlmICggZXhjLT5HUy5mcmVlVmVjdG9yLnggIT0gMCApCiAgICAgewotICAgICAgQ1VSLnpwMi5jdXJbcG9pbnRdLnggKz0gZHg7CisgICAgICBleGMtPnpwMi5jdXJbcG9pbnRdLnggKz0gZHg7CiAgICAgICBpZiAoIHRvdWNoICkKLSAgICAgICAgQ1VSLnpwMi50YWdzW3BvaW50XSB8PSBGVF9DVVJWRV9UQUdfVE9VQ0hfWDsKKyAgICAgICAgZXhjLT56cDIudGFnc1twb2ludF0gfD0gRlRfQ1VSVkVfVEFHX1RPVUNIX1g7CiAgICAgfQogCi0gICAgaWYgKCBDVVIuR1MuZnJlZVZlY3Rvci55ICE9IDAgKQorICAgIGlmICggZXhjLT5HUy5mcmVlVmVjdG9yLnkgIT0gMCApCiAgICAgewotICAgICAgQ1VSLnpwMi5jdXJbcG9pbnRdLnkgKz0gZHk7CisgICAgICBleGMtPnpwMi5jdXJbcG9pbnRdLnkgKz0gZHk7CiAgICAgICBpZiAoIHRvdWNoICkKLSAgICAgICAgQ1VSLnpwMi50YWdzW3BvaW50XSB8PSBGVF9DVVJWRV9UQUdfVE9VQ0hfWTsKKyAgICAgICAgZXhjLT56cDIudGFnc1twb2ludF0gfD0gRlRfQ1VSVkVfVEFHX1RPVUNIX1k7CiAgICAgfQogICB9CiAKQEAgLTU5MzIsNTcgKzU0NzAsNTQgQEAKICAgLyogU3RhY2s6ICAgICAgICB1aW50MzIuLi4gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgdm9pZAotICBJbnNfU0hQKCBJTlNfQVJHICkKKyAgSW5zX1NIUCggVFRfRXhlY0NvbnRleHQgIGV4YyApCiAgIHsKICAgICBUVF9HbHlwaFpvbmVSZWMgIHpwOwogICAgIEZUX1VTaG9ydCAgICAgICAgcmVmcDsKIAotICAgIEZUX0YyNkRvdDYgICAgICAgZHgsCi0gICAgICAgICAgICAgICAgICAgICBkeTsKKyAgICBGVF9GMjZEb3Q2ICAgICAgIGR4LCBkeTsKICAgICBGVF9VU2hvcnQgICAgICAgIHBvaW50OwogCi0gICAgRlRfVU5VU0VEX0FSRzsKIAotCi0gICAgaWYgKCBDVVIudG9wIDwgQ1VSLkdTLmxvb3AgKQorICAgIGlmICggZXhjLT50b3AgPCBleGMtPkdTLmxvb3AgKQogICAgIHsKLSAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKKyAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwogICAgICAgZ290byBGYWlsOwogICAgIH0KIAotICAgIGlmICggQ09NUFVURV9Qb2ludF9EaXNwbGFjZW1lbnQoICZkeCwgJmR5LCAmenAsICZyZWZwICkgKQorICAgIGlmICggQ29tcHV0ZV9Qb2ludF9EaXNwbGFjZW1lbnQoIGV4YywgJmR4LCAmZHksICZ6cCwgJnJlZnAgKSApCiAgICAgICByZXR1cm47CiAKLSAgICB3aGlsZSAoIENVUi5HUy5sb29wID4gMCApCisgICAgd2hpbGUgKCBleGMtPkdTLmxvb3AgPiAwICkKICAgICB7Ci0gICAgICBDVVIuYXJncy0tOwotICAgICAgcG9pbnQgPSAoRlRfVVNob3J0KUNVUi5zdGFja1tDVVIuYXJnc107CisgICAgICBleGMtPmFyZ3MtLTsKKyAgICAgIHBvaW50ID0gKEZUX1VTaG9ydClleGMtPnN0YWNrW2V4Yy0+YXJnc107CiAKLSAgICAgIGlmICggQk9VTkRTKCBwb2ludCwgQ1VSLnpwMi5uX3BvaW50cyApICkKKyAgICAgIGlmICggQk9VTkRTKCBwb2ludCwgZXhjLT56cDIubl9wb2ludHMgKSApCiAgICAgICB7Ci0gICAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCiAgICAgICAgIHsKLSAgICAgICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKKyAgICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CiAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBlbHNlCiAjaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCiAgICAgICAvKiBkb2Vzbid0IGZvbGxvdyBDbGVhcnR5cGUgc3BlYyBidXQgcHJvZHVjZXMgYmV0dGVyIHJlc3VsdCAqLwotICAgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICAmJgotICAgICAgICAgICBDVVIuaWdub3JlX3hfbW9kZSApCi0gICAgICAgIE1PVkVfWnAyX1BvaW50KCBwb2ludCwgMCwgZHksIFRSVUUgKTsKKyAgICAgIGlmICggU1VCUElYRUxfSElOVElORyAgICYmCisgICAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSApCisgICAgICAgIE1vdmVfWnAyX1BvaW50KCBleGMsIHBvaW50LCAwLCBkeSwgVFJVRSApOwogICAgICAgZWxzZQogI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwotICAgICAgICBNT1ZFX1pwMl9Qb2ludCggcG9pbnQsIGR4LCBkeSwgVFJVRSApOworICAgICAgICBNb3ZlX1pwMl9Qb2ludCggZXhjLCBwb2ludCwgZHgsIGR5LCBUUlVFICk7CiAKLSAgICAgIENVUi5HUy5sb29wLS07CisgICAgICBleGMtPkdTLmxvb3AtLTsKICAgICB9CiAKICAgRmFpbDoKLSAgICBDVVIuR1MubG9vcCA9IDE7Ci0gICAgQ1VSLm5ld190b3AgPSBDVVIuYXJnczsKKyAgICBleGMtPkdTLmxvb3AgPSAxOworICAgIGV4Yy0+bmV3X3RvcCA9IGV4Yy0+YXJnczsKICAgfQogCiAKQEAgLTU5OTcsNyArNTUzMiw4IEBACiAgIC8qICAgICAgICAgICAgICAgemVybyB3aGljaCBpbmNsdWRlcyBhbGwgcG9pbnRzIG9mIGl0LiAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX1NIQyggSU5TX0FSRyApCisgIEluc19TSEMoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKICAgewogICAgIFRUX0dseXBoWm9uZVJlYyAgenA7CiAgICAgRlRfVVNob3J0ICAgICAgICByZWZwOwpAQCAtNjAwNywzNiArNTU0MywzNiBAQAogICAgIEZUX1VTaG9ydCAgICAgICAgc3RhcnQsIGxpbWl0LCBpOwogCiAKLSAgICBjb250b3VyID0gKEZUX1VTaG9ydClhcmdzWzBdOwotICAgIGJvdW5kcyAgPSAoIENVUi5HUy5nZXAyID09IDAgKSA/IDEgOiBDVVIuenAyLm5fY29udG91cnM7CisgICAgY29udG91ciA9IChGVF9TaG9ydClhcmdzWzBdOworICAgIGJvdW5kcyAgPSAoIGV4Yy0+R1MuZ2VwMiA9PSAwICkgPyAxIDogZXhjLT56cDIubl9jb250b3VyczsKIAogICAgIGlmICggQk9VTkRTKCBjb250b3VyLCBib3VuZHMgKSApCiAgICAgewotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIENVUi5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOworICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CiAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKCBDT01QVVRFX1BvaW50X0Rpc3BsYWNlbWVudCggJmR4LCAmZHksICZ6cCwgJnJlZnAgKSApCisgICAgaWYgKCBDb21wdXRlX1BvaW50X0Rpc3BsYWNlbWVudCggZXhjLCAmZHgsICZkeSwgJnpwLCAmcmVmcCApICkKICAgICAgIHJldHVybjsKIAogICAgIGlmICggY29udG91ciA9PSAwICkKICAgICAgIHN0YXJ0ID0gMDsKICAgICBlbHNlCi0gICAgICBzdGFydCA9IChGVF9VU2hvcnQpKCBDVVIuenAyLmNvbnRvdXJzW2NvbnRvdXIgLSAxXSArIDEgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLnpwMi5maXJzdF9wb2ludCApOworICAgICAgc3RhcnQgPSAoRlRfVVNob3J0KSggZXhjLT56cDIuY29udG91cnNbY29udG91ciAtIDFdICsgMSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPnpwMi5maXJzdF9wb2ludCApOwogCiAgICAgLyogd2UgdXNlIHRoZSBudW1iZXIgb2YgcG9pbnRzIGlmIGluIHRoZSB0d2lsaWdodCB6b25lICovCi0gICAgaWYgKCBDVVIuR1MuZ2VwMiA9PSAwICkKLSAgICAgIGxpbWl0ID0gQ1VSLnpwMi5uX3BvaW50czsKKyAgICBpZiAoIGV4Yy0+R1MuZ2VwMiA9PSAwICkKKyAgICAgIGxpbWl0ID0gZXhjLT56cDIubl9wb2ludHM7CiAgICAgZWxzZQotICAgICAgbGltaXQgPSAoRlRfVVNob3J0KSggQ1VSLnpwMi5jb250b3Vyc1tjb250b3VyXSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIuenAyLmZpcnN0X3BvaW50ICsgMSApOworICAgICAgbGltaXQgPSAoRlRfVVNob3J0KSggZXhjLT56cDIuY29udG91cnNbY29udG91cl0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT56cDIuZmlyc3RfcG9pbnQgKyAxICk7CiAKICAgICBmb3IgKCBpID0gc3RhcnQ7IGkgPCBsaW1pdDsgaSsrICkKICAgICB7Ci0gICAgICBpZiAoIHpwLmN1ciAhPSBDVVIuenAyLmN1ciB8fCByZWZwICE9IGkgKQotICAgICAgICBNT1ZFX1pwMl9Qb2ludCggaSwgZHgsIGR5LCBUUlVFICk7CisgICAgICBpZiAoIHpwLmN1ciAhPSBleGMtPnpwMi5jdXIgfHwgcmVmcCAhPSBpICkKKyAgICAgICAgTW92ZV9acDJfUG9pbnQoIGV4YywgaSwgZHgsIGR5LCBUUlVFICk7CiAgICAgfQogICB9CiAKQEAgLTYwNDgsNyArNTU4NCw4IEBACiAgIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX1NIWiggSU5TX0FSRyApCisgIEluc19TSFooIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKICAgewogICAgIFRUX0dseXBoWm9uZVJlYyAgenA7CiAgICAgRlRfVVNob3J0ICAgICAgICByZWZwOwpAQCAtNjA2MCwzMCArNTU5NywzMCBAQAogCiAgICAgaWYgKCBCT1VORFMoIGFyZ3NbMF0sIDIgKSApCiAgICAgewotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIENVUi5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOworICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CiAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKCBDT01QVVRFX1BvaW50X0Rpc3BsYWNlbWVudCggJmR4LCAmZHksICZ6cCwgJnJlZnAgKSApCisgICAgaWYgKCBDb21wdXRlX1BvaW50X0Rpc3BsYWNlbWVudCggZXhjLCAmZHgsICZkeSwgJnpwLCAmcmVmcCApICkKICAgICAgIHJldHVybjsKIAogICAgIC8qIFhYWDogVU5ET0NVTUVOVEVEISBTSFogZG9lc24ndCBtb3ZlIHRoZSBwaGFudG9tIHBvaW50cy4gICAgICovCiAgICAgLyogICAgICBUd2lsaWdodCB6b25lIGhhcyBubyByZWFsIGNvbnRvdXJzLCBzbyB1c2UgYG5fcG9pbnRzJy4gKi8KICAgICAvKiAgICAgIE5vcm1hbCB6b25lJ3MgYG5fcG9pbnRzJyBpbmNsdWRlcyBwaGFudG9tcywgc28gbXVzdCAgICAqLwogICAgIC8qICAgICAgdXNlIGVuZCBvZiBsYXN0IGNvbnRvdXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBDVVIuR1MuZ2VwMiA9PSAwICkKLSAgICAgIGxpbWl0ID0gKEZUX1VTaG9ydClDVVIuenAyLm5fcG9pbnRzOwotICAgIGVsc2UgaWYgKCBDVVIuR1MuZ2VwMiA9PSAxICYmIENVUi56cDIubl9jb250b3VycyA+IDAgKQotICAgICAgbGltaXQgPSAoRlRfVVNob3J0KSggQ1VSLnpwMi5jb250b3Vyc1tDVVIuenAyLm5fY29udG91cnMgLSAxXSArIDEgKTsKKyAgICBpZiAoIGV4Yy0+R1MuZ2VwMiA9PSAwICkKKyAgICAgIGxpbWl0ID0gKEZUX1VTaG9ydClleGMtPnpwMi5uX3BvaW50czsKKyAgICBlbHNlIGlmICggZXhjLT5HUy5nZXAyID09IDEgJiYgZXhjLT56cDIubl9jb250b3VycyA+IDAgKQorICAgICAgbGltaXQgPSAoRlRfVVNob3J0KSggZXhjLT56cDIuY29udG91cnNbZXhjLT56cDIubl9jb250b3VycyAtIDFdICsgMSApOwogICAgIGVsc2UKICAgICAgIGxpbWl0ID0gMDsKIAogICAgIC8qIFhYWDogVU5ET0NVTUVOVEVEISBTSFogZG9lc24ndCB0b3VjaCB0aGUgcG9pbnRzICovCiAgICAgZm9yICggaSA9IDA7IGkgPCBsaW1pdDsgaSsrICkKICAgICB7Ci0gICAgICBpZiAoIHpwLmN1ciAhPSBDVVIuenAyLmN1ciB8fCByZWZwICE9IGkgKQotICAgICAgICBNT1ZFX1pwMl9Qb2ludCggaSwgZHgsIGR5LCBGQUxTRSApOworICAgICAgaWYgKCB6cC5jdXIgIT0gZXhjLT56cDIuY3VyIHx8IHJlZnAgIT0gaSApCisgICAgICAgIE1vdmVfWnAyX1BvaW50KCBleGMsIGksIGR4LCBkeSwgRkFMU0UgKTsKICAgICB9CiAgIH0KIApAQCAtNjA5NSw3ICs1NjMyLDggQEAKICAgLyogU3RhY2s6ICAgICAgICBmMjYuNiB1aW50MzIuLi4gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgdm9pZAotICBJbnNfU0hQSVgoIElOU19BUkcgKQorICBJbnNfU0hQSVgoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQogICB7CiAgICAgRlRfRjI2RG90NiAgZHgsIGR5OwogICAgIEZUX1VTaG9ydCAgIHBvaW50OwpAQCAtNjEwNCwxNyArNTY0MiwxNyBAQAogI2VuZGlmCiAKIAotICAgIGlmICggQ1VSLnRvcCA8IENVUi5HUy5sb29wICsgMSApCisgICAgaWYgKCBleGMtPnRvcCA8IGV4Yy0+R1MubG9vcCArIDEgKQogICAgIHsKLSAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKKyAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwogICAgICAgZ290byBGYWlsOwogICAgIH0KIAogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HCi0gICAgaWYgKCBDVVIuZmFjZS0+dW5wYXRlbnRlZF9oaW50aW5nICkKKyAgICBpZiAoIGV4Yy0+ZmFjZS0+dW5wYXRlbnRlZF9oaW50aW5nICkKICAgICB7Ci0gICAgICBpZiAoIENVUi5HUy5ib3RoX3hfYXhpcyApCisgICAgICBpZiAoIGV4Yy0+R1MuYm90aF94X2F4aXMgKQogICAgICAgewogICAgICAgICBkeCA9IChGVF9VSW50MzIpYXJnc1swXTsKICAgICAgICAgZHkgPSAwOwpAQCAtNjEyOCwxMTUgKzU2NjYsMTE1IEBACiAgICAgZWxzZQogI2VuZGlmCiAgICAgewotICAgICAgZHggPSBUVF9NdWxGaXgxNCggKEZUX1VJbnQzMilhcmdzWzBdLCBDVVIuR1MuZnJlZVZlY3Rvci54ICk7Ci0gICAgICBkeSA9IFRUX011bEZpeDE0KCAoRlRfVUludDMyKWFyZ3NbMF0sIENVUi5HUy5mcmVlVmVjdG9yLnkgKTsKKyAgICAgIGR4ID0gVFRfTXVsRml4MTQoIGFyZ3NbMF0sIGV4Yy0+R1MuZnJlZVZlY3Rvci54ICk7CisgICAgICBkeSA9IFRUX011bEZpeDE0KCBhcmdzWzBdLCBleGMtPkdTLmZyZWVWZWN0b3IueSApOwogICAgIH0KIAotICAgIHdoaWxlICggQ1VSLkdTLmxvb3AgPiAwICkKKyAgICB3aGlsZSAoIGV4Yy0+R1MubG9vcCA+IDAgKQogICAgIHsKLSAgICAgIENVUi5hcmdzLS07CisgICAgICBleGMtPmFyZ3MtLTsKIAotICAgICAgcG9pbnQgPSAoRlRfVVNob3J0KUNVUi5zdGFja1tDVVIuYXJnc107CisgICAgICBwb2ludCA9IChGVF9VU2hvcnQpZXhjLT5zdGFja1tleGMtPmFyZ3NdOwogCi0gICAgICBpZiAoIEJPVU5EUyggcG9pbnQsIENVUi56cDIubl9wb2ludHMgKSApCisgICAgICBpZiAoIEJPVU5EUyggcG9pbnQsIGV4Yy0+enAyLm5fcG9pbnRzICkgKQogICAgICAgewotICAgICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQogICAgICAgICB7Ci0gICAgICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CisgICAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwogICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgfQogICAgICAgZWxzZQogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwogICAgICAgewotICAgICAgICAvKiAgSWYgbm90IHVzaW5nIGlnbm9yZV94X21vZGUgcmVuZGVyaW5nLCBhbGxvdyBaUDIgbW92ZS4gICAgICAgICAgKi8KLSAgICAgICAgLyogIElmIGlubGluZSBkZWx0YXMgYXJlbid0IGFsbG93ZWQsIHNraXAgWlAyIG1vdmUuICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICBJZiB1c2luZyBpZ25vcmVfeF9tb2RlIHJlbmRlcmluZywgYWxsb3cgWlAyIHBvaW50IG1vdmUgaWY6ICAgICAqLwotICAgICAgICAvKiAgIC0gZnJlZWRvbSB2ZWN0b3IgaXMgeSBhbmQgc3BoX2NvbXBhdGliaWxpdHlfbW9kZSBpcyBvZmYgICAgICAgKi8KLSAgICAgICAgLyogICAtIHRoZSBnbHlwaCBpcyBjb21wb3NpdGUgYW5kIHRoZSBtb3ZlIGlzIGluIHRoZSBZIGRpcmVjdGlvbiAgICovCi0gICAgICAgIC8qICAgLSB0aGUgZ2x5cGggaXMgc3BlY2lmaWNhbGx5IHNldCB0byBhbGxvdyBTSFBJWCBtb3ZlcyAgICAgICAgICAqLwotICAgICAgICAvKiAgIC0gdGhlIG1vdmUgaXMgb24gYSBwcmV2aW91c2x5IFktdG91Y2hlZCBwb2ludCAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogIElmIG5vdCB1c2luZyBpZ25vcmVfeF9tb2RlIHJlbmRlcmluZywgYWxsb3cgWlAyIG1vdmUuICAgICAgICAqLworICAgICAgICAvKiAgSWYgaW5saW5lIGRlbHRhcyBhcmVuJ3QgYWxsb3dlZCwgc2tpcCBaUDIgbW92ZS4gICAgICAgICAgICAgICovCisgICAgICAgIC8qICBJZiB1c2luZyBpZ25vcmVfeF9tb2RlIHJlbmRlcmluZywgYWxsb3cgWlAyIHBvaW50IG1vdmUgaWY6ICAgKi8KKyAgICAgICAgLyogICAtIGZyZWVkb20gdmVjdG9yIGlzIHkgYW5kIHNwaF9jb21wYXRpYmlsaXR5X21vZGUgaXMgb2ZmICAgICAqLworICAgICAgICAvKiAgIC0gdGhlIGdseXBoIGlzIGNvbXBvc2l0ZSBhbmQgdGhlIG1vdmUgaXMgaW4gdGhlIFkgZGlyZWN0aW9uICovCisgICAgICAgIC8qICAgLSB0aGUgZ2x5cGggaXMgc3BlY2lmaWNhbGx5IHNldCB0byBhbGxvdyBTSFBJWCBtb3ZlcyAgICAgICAgKi8KKyAgICAgICAgLyogICAtIHRoZSBtb3ZlIGlzIG9uIGEgcHJldmlvdXNseSBZLXRvdWNoZWQgcG9pbnQgICAgICAgICAgICAgICAqLwogCi0gICAgICAgIGlmICggU1VCUElYRUxfSElOVElORyAgJiYKLSAgICAgICAgICAgICBDVVIuaWdub3JlX3hfbW9kZSApCisgICAgICAgIGlmICggU1VCUElYRUxfSElOVElORyAgICYmCisgICAgICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICkKICAgICAgICAgewogICAgICAgICAgIC8qIHNhdmUgcG9pbnQgZm9yIGxhdGVyIGNvbXBhcmlzb24gKi8KLSAgICAgICAgICBpZiAoIENVUi5HUy5mcmVlVmVjdG9yLnkgIT0gMCApCi0gICAgICAgICAgICBCMSA9IENVUi56cDIuY3VyW3BvaW50XS55OworICAgICAgICAgIGlmICggZXhjLT5HUy5mcmVlVmVjdG9yLnkgIT0gMCApCisgICAgICAgICAgICBCMSA9IGV4Yy0+enAyLmN1cltwb2ludF0ueTsKICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBCMSA9IENVUi56cDIuY3VyW3BvaW50XS54OworICAgICAgICAgICAgQjEgPSBleGMtPnpwMi5jdXJbcG9pbnRdLng7CiAKLSAgICAgICAgICBpZiAoICFDVVIuZmFjZS0+c3BoX2NvbXBhdGliaWxpdHlfbW9kZSAmJgotICAgICAgICAgICAgICAgQ1VSLkdTLmZyZWVWZWN0b3IueSAhPSAwICAgICAgICAgICkKKyAgICAgICAgICBpZiAoICFleGMtPmZhY2UtPnNwaF9jb21wYXRpYmlsaXR5X21vZGUgJiYKKyAgICAgICAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICE9IDAgICAgICAgICAgKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIE1PVkVfWnAyX1BvaW50KCBwb2ludCwgZHgsIGR5LCBUUlVFICk7CisgICAgICAgICAgICBNb3ZlX1pwMl9Qb2ludCggZXhjLCBwb2ludCwgZHgsIGR5LCBUUlVFICk7CiAKICAgICAgICAgICAgIC8qIHNhdmUgbmV3IHBvaW50ICovCi0gICAgICAgICAgICBpZiAoIENVUi5HUy5mcmVlVmVjdG9yLnkgIT0gMCApCisgICAgICAgICAgICBpZiAoIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICE9IDAgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICBCMiA9IENVUi56cDIuY3VyW3BvaW50XS55OworICAgICAgICAgICAgICBCMiA9IGV4Yy0+enAyLmN1cltwb2ludF0ueTsKIAogICAgICAgICAgICAgICAvKiByZXZlcnNlIGFueSBkaXNhbGxvd2VkIG1vdmVzICovCi0gICAgICAgICAgICAgIGlmICggKCBDVVIuc3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX1NLSVBfTk9OUElYRUxfWV9NT1ZFUyApICYmCi0gICAgICAgICAgICAgICAgICAgKCBCMSAmIDYzICkgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgKCBCMiAmIDYzICkgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgIEIxICE9IEIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICBNT1ZFX1pwMl9Qb2ludCggcG9pbnQsIC1keCwgLWR5LCBUUlVFICk7CisgICAgICAgICAgICAgIGlmICggKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19TS0lQX05PTlBJWEVMX1lfTU9WRVMgKSAmJgorICAgICAgICAgICAgICAgICAgICggQjEgJiA2MyApICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgICAgICAgICAoIEIyICYgNjMgKSAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAgICAgICAgQjEgIT0gQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgTW92ZV9acDJfUG9pbnQoIGV4YywgcG9pbnQsIC1keCwgLWR5LCBUUlVFICk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKCBDVVIuZmFjZS0+c3BoX2NvbXBhdGliaWxpdHlfbW9kZSApCisgICAgICAgICAgZWxzZSBpZiAoIGV4Yy0+ZmFjZS0+c3BoX2NvbXBhdGliaWxpdHlfbW9kZSApCiAgICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBDVVIuc3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX1JPVU5EX05PTlBJWEVMX1lfTU9WRVMgKQorICAgICAgICAgICAgaWYgKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19ST1VORF9OT05QSVhFTF9ZX01PVkVTICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgZHggPSBGVF9QSVhfUk9VTkQoIEIxICsgZHggKSAtIEIxOwogICAgICAgICAgICAgICBkeSA9IEZUX1BJWF9ST1VORCggQjEgKyBkeSApIC0gQjE7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qIHNraXAgcG9zdC1pdXAgZGVsdGFzICovCi0gICAgICAgICAgICBpZiAoIENVUi5pdXBfY2FsbGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgKCAoIENVUi5zcGhfaW5fZnVuY19mbGFncyAmIFNQSF9GREVGX0lOTElORV9ERUxUQV8xICkgfHwKLSAgICAgICAgICAgICAgICAgICAoIENVUi5zcGhfaW5fZnVuY19mbGFncyAmIFNQSF9GREVGX0lOTElORV9ERUxUQV8yICkgKSApCisgICAgICAgICAgICBpZiAoIGV4Yy0+aXVwX2NhbGxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAgICAgICggKCBleGMtPnNwaF9pbl9mdW5jX2ZsYWdzICYgU1BIX0ZERUZfSU5MSU5FX0RFTFRBXzEgKSB8fAorICAgICAgICAgICAgICAgICAgICggZXhjLT5zcGhfaW5fZnVuY19mbGFncyAmIFNQSF9GREVGX0lOTElORV9ERUxUQV8yICkgKSApCiAgICAgICAgICAgICAgIGdvdG8gU2tpcDsKIAotICAgICAgICAgICAgaWYgKCAhKCBDVVIuc3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX0FMV0FZU19TS0lQX0RFTFRBUCApICYmCi0gICAgICAgICAgICAgICAgICAoICggQ1VSLmlzX2NvbXBvc2l0ZSAmJiBDVVIuR1MuZnJlZVZlY3Rvci55ICE9IDAgKSB8fAotICAgICAgICAgICAgICAgICAgICAoIENVUi56cDIudGFnc1twb2ludF0gJiBGVF9DVVJWRV9UQUdfVE9VQ0hfWSApICAgfHwKLSAgICAgICAgICAgICAgICAgICAgKCBDVVIuc3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX0RPX1NIUElYICkgICAgICkgICApCi0gICAgICAgICAgICAgIE1PVkVfWnAyX1BvaW50KCBwb2ludCwgMCwgZHksIFRSVUUgKTsKKyAgICAgICAgICAgIGlmICggISggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfQUxXQVlTX1NLSVBfREVMVEFQICkgJiYKKyAgICAgICAgICAgICAgICAgICggKCBleGMtPmlzX2NvbXBvc2l0ZSAmJiBleGMtPkdTLmZyZWVWZWN0b3IueSAhPSAwICkgfHwKKyAgICAgICAgICAgICAgICAgICAgKCBleGMtPnpwMi50YWdzW3BvaW50XSAmIEZUX0NVUlZFX1RBR19UT1VDSF9ZICkgICAgfHwKKyAgICAgICAgICAgICAgICAgICAgKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19ET19TSFBJWCApICAgICAgKSAgKQorICAgICAgICAgICAgICBNb3ZlX1pwMl9Qb2ludCggZXhjLCBwb2ludCwgMCwgZHksIFRSVUUgKTsKIAogICAgICAgICAgICAgLyogc2F2ZSBuZXcgcG9pbnQgKi8KLSAgICAgICAgICAgIGlmICggQ1VSLkdTLmZyZWVWZWN0b3IueSAhPSAwICkKKyAgICAgICAgICAgIGlmICggZXhjLT5HUy5mcmVlVmVjdG9yLnkgIT0gMCApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEIyID0gQ1VSLnpwMi5jdXJbcG9pbnRdLnk7CisgICAgICAgICAgICAgIEIyID0gZXhjLT56cDIuY3VyW3BvaW50XS55OwogCiAgICAgICAgICAgICAgIC8qIHJldmVyc2UgYW55IGRpc2FsbG93ZWQgbW92ZXMgKi8KICAgICAgICAgICAgICAgaWYgKCAoIEIxICYgNjMgKSA9PSAwICYmCiAgICAgICAgICAgICAgICAgICAgKCBCMiAmIDYzICkgIT0gMCAmJgogICAgICAgICAgICAgICAgICAgIEIxICE9IEIyICAgICAgICAgKQotICAgICAgICAgICAgICAgIE1PVkVfWnAyX1BvaW50KCBwb2ludCwgMCwgLWR5LCBUUlVFICk7CisgICAgICAgICAgICAgICAgTW92ZV9acDJfUG9pbnQoIGV4YywgcG9pbnQsIDAsIC1keSwgVFJVRSApOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICggQ1VSLnNwaF9pbl9mdW5jX2ZsYWdzICYgU1BIX0ZERUZfVFlQRU1BTl9ESUFHRU5EQ1RSTCApCi0gICAgICAgICAgICBNT1ZFX1pwMl9Qb2ludCggcG9pbnQsIGR4LCBkeSwgVFJVRSApOworICAgICAgICAgIGVsc2UgaWYgKCBleGMtPnNwaF9pbl9mdW5jX2ZsYWdzICYgU1BIX0ZERUZfVFlQRU1BTl9ESUFHRU5EQ1RSTCApCisgICAgICAgICAgICBNb3ZlX1pwMl9Qb2ludCggZXhjLCBwb2ludCwgZHgsIGR5LCBUUlVFICk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQotICAgICAgICAgIE1PVkVfWnAyX1BvaW50KCBwb2ludCwgZHgsIGR5LCBUUlVFICk7CisgICAgICAgICAgTW92ZV9acDJfUG9pbnQoIGV4YywgcG9pbnQsIGR4LCBkeSwgVFJVRSApOwogICAgICAgfQogCiAgICAgU2tpcDoKIAogI2Vsc2UgLyogIVRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwogCi0gICAgICAgIE1PVkVfWnAyX1BvaW50KCBwb2ludCwgZHgsIGR5LCBUUlVFICk7CisgICAgICBNb3ZlX1pwMl9Qb2ludCggZXhjLCBwb2ludCwgZHgsIGR5LCBUUlVFICk7CiAKICNlbmRpZiAvKiAhVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCiAKLSAgICAgIENVUi5HUy5sb29wLS07CisgICAgICBleGMtPkdTLmxvb3AtLTsKICAgICB9CiAKICAgRmFpbDoKLSAgICBDVVIuR1MubG9vcCA9IDE7Ci0gICAgQ1VSLm5ld190b3AgPSBDVVIuYXJnczsKKyAgICBleGMtPkdTLmxvb3AgPSAxOworICAgIGV4Yy0+bmV3X3RvcCA9IGV4Yy0+YXJnczsKICAgfQogCiAKQEAgLTYyNDcsNyArNTc4NSw4IEBACiAgIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX01TSVJQKCBJTlNfQVJHICkKKyAgSW5zX01TSVJQKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKICAgewogICAgIEZUX1VTaG9ydCAgIHBvaW50OwogICAgIEZUX0YyNkRvdDYgIGRpc3RhbmNlOwpAQCAtNjI1OCwxMSArNTc5NywxMSBAQAogCiAgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICkKICAgICB7Ci0gICAgICBjb250cm9sX3ZhbHVlX2N1dGluID0gQ1VSLkdTLmNvbnRyb2xfdmFsdWVfY3V0aW47CisgICAgICBjb250cm9sX3ZhbHVlX2N1dGluID0gZXhjLT5HUy5jb250cm9sX3ZhbHVlX2N1dGluOwogCi0gICAgICBpZiAoIENVUi5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgQ1VSLkdTLmZyZWVWZWN0b3IueCAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAhKCBDVVIuc3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX05PUk1BTF9ST1VORCApICkKKyAgICAgIGlmICggZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgZXhjLT5HUy5mcmVlVmVjdG9yLnggIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgISggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfTk9STUFMX1JPVU5EICkgKQogICAgICAgICBjb250cm9sX3ZhbHVlX2N1dGluID0gMDsKICAgICB9CiAKQEAgLTYyNzAsNDIgKzU4MDksNDEgQEAKIAogICAgIHBvaW50ID0gKEZUX1VTaG9ydClhcmdzWzBdOwogCi0gICAgaWYgKCBCT1VORFMoIHBvaW50LCAgICAgIENVUi56cDEubl9wb2ludHMgKSB8fAotICAgICAgICAgQk9VTkRTKCBDVVIuR1MucnAwLCBDVVIuenAwLm5fcG9pbnRzICkgKQorICAgIGlmICggQk9VTkRTKCBwb2ludCwgICAgICAgZXhjLT56cDEubl9wb2ludHMgKSB8fAorICAgICAgICAgQk9VTkRTKCBleGMtPkdTLnJwMCwgZXhjLT56cDAubl9wb2ludHMgKSApCiAgICAgewotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIENVUi5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOworICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CiAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgLyogVU5ET0NVTUVOVEVEISAgVGhlIE1TIHJhc3Rlcml6ZXIgZG9lcyB0aGF0IHdpdGggKi8KICAgICAvKiB0d2lsaWdodCBwb2ludHMgKGNvbmZpcm1lZCBieSBHcmVnIEhpdGNoY29jaykgICAqLwotICAgIGlmICggQ1VSLkdTLmdlcDEgPT0gMCApCisgICAgaWYgKCBleGMtPkdTLmdlcDEgPT0gMCApCiAgICAgewotICAgICAgQ1VSLnpwMS5vcmdbcG9pbnRdID0gQ1VSLnpwMC5vcmdbQ1VSLkdTLnJwMF07Ci0gICAgICBDVVJfRnVuY19tb3ZlX29yaWcoICZDVVIuenAxLCBwb2ludCwgYXJnc1sxXSApOwotICAgICAgQ1VSLnpwMS5jdXJbcG9pbnRdID0gQ1VSLnpwMS5vcmdbcG9pbnRdOworICAgICAgZXhjLT56cDEub3JnW3BvaW50XSA9IGV4Yy0+enAwLm9yZ1tleGMtPkdTLnJwMF07CisgICAgICBleGMtPmZ1bmNfbW92ZV9vcmlnKCBleGMsICZleGMtPnpwMSwgcG9pbnQsIGFyZ3NbMV0gKTsKKyAgICAgIGV4Yy0+enAxLmN1cltwb2ludF0gPSBleGMtPnpwMS5vcmdbcG9pbnRdOwogICAgIH0KIAotICAgIGRpc3RhbmNlID0gQ1VSX0Z1bmNfcHJvamVjdCggQ1VSLnpwMS5jdXIgKyBwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi56cDAuY3VyICsgQ1VSLkdTLnJwMCApOworICAgIGRpc3RhbmNlID0gUFJPSkVDVCggZXhjLT56cDEuY3VyICsgcG9pbnQsIGV4Yy0+enAwLmN1ciArIGV4Yy0+R1MucnAwICk7CiAKICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKICAgICAvKiBzdWJwaXhlbCBoaW50aW5nIC0gbWFrZSBNU0lSUCByZXNwZWN0IENWVCBjdXQtaW47ICovCiAgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIENVUi5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgQ1VSLkdTLmZyZWVWZWN0b3IueCAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICBleGMtPmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci54ICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgogICAgICAgICAgRlRfQUJTKCBkaXN0YW5jZSAtIGFyZ3NbMV0gKSA+PSBjb250cm9sX3ZhbHVlX2N1dGluICkKICAgICAgIGRpc3RhbmNlID0gYXJnc1sxXTsKICNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KIAotICAgIENVUl9GdW5jX21vdmUoICZDVVIuenAxLCBwb2ludCwgYXJnc1sxXSAtIGRpc3RhbmNlICk7CisgICAgZXhjLT5mdW5jX21vdmUoIGV4YywgJmV4Yy0+enAxLCBwb2ludCwgYXJnc1sxXSAtIGRpc3RhbmNlICk7CiAKLSAgICBDVVIuR1MucnAxID0gQ1VSLkdTLnJwMDsKLSAgICBDVVIuR1MucnAyID0gcG9pbnQ7CisgICAgZXhjLT5HUy5ycDEgPSBleGMtPkdTLnJwMDsKKyAgICBleGMtPkdTLnJwMiA9IHBvaW50OwogCi0gICAgaWYgKCAoIENVUi5vcGNvZGUgJiAxICkgIT0gMCApCi0gICAgICBDVVIuR1MucnAwID0gcG9pbnQ7CisgICAgaWYgKCAoIGV4Yy0+b3Bjb2RlICYgMSApICE9IDAgKQorICAgICAgZXhjLT5HUy5ycDAgPSBwb2ludDsKICAgfQogCiAKQEAgLTYzMTYsNyArNTg1NCw4IEBACiAgIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX01EQVAoIElOU19BUkcgKQorICBJbnNfTURBUCggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKICAgewogICAgIEZUX1VTaG9ydCAgIHBvaW50OwogICAgIEZUX0YyNkRvdDYgIGN1cl9kaXN0OwpAQCAtNjMyNSwzNiArNTg2NCwzOCBAQAogCiAgICAgcG9pbnQgPSAoRlRfVVNob3J0KWFyZ3NbMF07CiAKLSAgICBpZiAoIEJPVU5EUyggcG9pbnQsIENVUi56cDAubl9wb2ludHMgKSApCisgICAgaWYgKCBCT1VORFMoIHBvaW50LCBleGMtPnpwMC5uX3BvaW50cyApICkKICAgICB7Ci0gICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CisgICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCisgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAoICggQ1VSLm9wY29kZSAmIDEgKSAhPSAwICkKKyAgICBpZiAoICggZXhjLT5vcGNvZGUgJiAxICkgIT0gMCApCiAgICAgewotICAgICAgY3VyX2Rpc3QgPSBDVVJfZmFzdF9wcm9qZWN0KCAmQ1VSLnpwMC5jdXJbcG9pbnRdICk7CisgICAgICBjdXJfZGlzdCA9IEZBU1RfUFJPSkVDVCggJmV4Yy0+enAwLmN1cltwb2ludF0gKTsKICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSAgICAgIGlmICggU1VCUElYRUxfSElOVElORyAgICAgICAgICYmCi0gICAgICAgICAgIENVUi5pZ25vcmVfeF9tb2RlICAgICAgICAmJgotICAgICAgICAgICBDVVIuR1MuZnJlZVZlY3Rvci54ICE9IDAgKQotICAgICAgICBkaXN0YW5jZSA9IFJPVU5EX05vbmUoCisgICAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkcgICAgICAgICAgJiYKKyAgICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAmJgorICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCAhPSAwICkKKyAgICAgICAgZGlzdGFuY2UgPSBSb3VuZF9Ob25lKAorICAgICAgICAgICAgICAgICAgICAgZXhjLAogICAgICAgICAgICAgICAgICAgICAgY3VyX2Rpc3QsCi0gICAgICAgICAgICAgICAgICAgICBDVVIudHRfbWV0cmljcy5jb21wZW5zYXRpb25zWzBdICkgLSBjdXJfZGlzdDsKKyAgICAgICAgICAgICAgICAgICAgIGV4Yy0+dHRfbWV0cmljcy5jb21wZW5zYXRpb25zWzBdICkgLSBjdXJfZGlzdDsKICAgICAgIGVsc2UKICNlbmRpZgotICAgICAgICBkaXN0YW5jZSA9IENVUl9GdW5jX3JvdW5kKAorICAgICAgICBkaXN0YW5jZSA9IGV4Yy0+ZnVuY19yb3VuZCgKKyAgICAgICAgICAgICAgICAgICAgIGV4YywKICAgICAgICAgICAgICAgICAgICAgIGN1cl9kaXN0LAotICAgICAgICAgICAgICAgICAgICAgQ1VSLnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1swXSApIC0gY3VyX2Rpc3Q7CisgICAgICAgICAgICAgICAgICAgICBleGMtPnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1swXSApIC0gY3VyX2Rpc3Q7CiAgICAgfQogICAgIGVsc2UKICAgICAgIGRpc3RhbmNlID0gMDsKIAotICAgIENVUl9GdW5jX21vdmUoICZDVVIuenAwLCBwb2ludCwgZGlzdGFuY2UgKTsKKyAgICBleGMtPmZ1bmNfbW92ZSggZXhjLCAmZXhjLT56cDAsIHBvaW50LCBkaXN0YW5jZSApOwogCi0gICAgQ1VSLkdTLnJwMCA9IHBvaW50OwotICAgIENVUi5HUy5ycDEgPSBwb2ludDsKKyAgICBleGMtPkdTLnJwMCA9IHBvaW50OworICAgIGV4Yy0+R1MucnAxID0gcG9pbnQ7CiAgIH0KIAogCkBAIC02MzY1LDcgKzU5MDYsOCBAQAogICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIEluc19NSUFQKCBJTlNfQVJHICkKKyAgSW5zX01JQVAoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCiAgIHsKICAgICBGVF9VTG9uZyAgICBjdnRFbnRyeTsKICAgICBGVF9VU2hvcnQgICBwb2ludDsKQEAgLTYzNzQsMjQgKzU5MTYsMjQgQEAKICAgICBGVF9GMjZEb3Q2ICBjb250cm9sX3ZhbHVlX2N1dGluOwogCiAKLSAgICBjb250cm9sX3ZhbHVlX2N1dGluID0gQ1VSLkdTLmNvbnRyb2xfdmFsdWVfY3V0aW47CisgICAgY29udHJvbF92YWx1ZV9jdXRpbiA9IGV4Yy0+R1MuY29udHJvbF92YWx1ZV9jdXRpbjsKICAgICBjdnRFbnRyeSAgICAgICAgICAgID0gKEZUX1VMb25nKWFyZ3NbMV07CiAgICAgcG9pbnQgICAgICAgICAgICAgICA9IChGVF9VU2hvcnQpYXJnc1swXTsKIAogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotICAgIGlmICggU1VCUElYRUxfSElOVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgQ1VSLmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgQ1VSLkdTLmZyZWVWZWN0b3IueCAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgQ1VSLkdTLmZyZWVWZWN0b3IueSA9PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgISggQ1VSLnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19OT1JNQUxfUk9VTkQgKSApCisgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci54ICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueSA9PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgISggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfTk9STUFMX1JPVU5EICkgKQogICAgICAgY29udHJvbF92YWx1ZV9jdXRpbiA9IDA7CiAjZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCiAKLSAgICBpZiAoIEJPVU5EUyggcG9pbnQsICAgICBDVVIuenAwLm5fcG9pbnRzICkgfHwKLSAgICAgICAgIEJPVU5EU0woIGN2dEVudHJ5LCBDVVIuY3Z0U2l6ZSApICAgICAgKQorICAgIGlmICggQk9VTkRTKCBwb2ludCwgICAgIGV4Yy0+enAwLm5fcG9pbnRzICkgfHwKKyAgICAgICAgIEJPVU5EU0woIGN2dEVudHJ5LCBleGMtPmN2dFNpemUgKSAgICAgICkKICAgICB7Ci0gICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CisgICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCisgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKICAgICAgIGdvdG8gRmFpbDsKICAgICB9CiAKQEAgLTY0MTUsNTYgKzU5NTcsNTggQEAKICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAvKiBDb25maXJtZWQgYnkgR3JlZyBIaXRjaGNvY2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAotICAgIGRpc3RhbmNlID0gQ1VSX0Z1bmNfcmVhZF9jdnQoIGN2dEVudHJ5ICk7CisgICAgZGlzdGFuY2UgPSBleGMtPmZ1bmNfcmVhZF9jdnQoIGV4YywgY3Z0RW50cnkgKTsKIAotICAgIGlmICggQ1VSLkdTLmdlcDAgPT0gMCApICAgLyogSWYgaW4gdHdpbGlnaHQgem9uZSAqLworICAgIGlmICggZXhjLT5HUy5nZXAwID09IDAgKSAgIC8qIElmIGluIHR3aWxpZ2h0IHpvbmUgKi8KICAgICB7CiAjaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCiAgICAgICAvKiBPbmx5IGFkanVzdCBpZiBub3QgaW4gc3BoX2NvbXBhdGliaWxpdHlfbW9kZSBvciBpZ25vcmVfeF9tb2RlLiAqLwogICAgICAgLyogRGV0ZXJtaW5lZCB2aWEgZXhwZXJpbWVudGF0aW9uIGFuZCBtYXkgYmUgaW5jb3JyZWN0Li4uICAgICAgICAgKi8KLSAgICAgIGlmICggIVNVQlBJWEVMX0hJTlRJTkcgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAoICFDVVIuaWdub3JlX3hfbW9kZSAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICFDVVIuZmFjZS0+c3BoX2NvbXBhdGliaWxpdHlfbW9kZSApICkKKyAgICAgIGlmICggIVNVQlBJWEVMX0hJTlRJTkcgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgKCAhZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgIWV4Yy0+ZmFjZS0+c3BoX2NvbXBhdGliaWxpdHlfbW9kZSApICkKICNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KLSAgICAgICAgQ1VSLnpwMC5vcmdbcG9pbnRdLnggPSBUVF9NdWxGaXgxNCggKEZUX1VJbnQzMilkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLkdTLmZyZWVWZWN0b3IueCApOwotICAgICAgQ1VSLnpwMC5vcmdbcG9pbnRdLnkgPSBUVF9NdWxGaXgxNCggKEZUX1VJbnQzMilkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi5HUy5mcmVlVmVjdG9yLnkgKSwKLSAgICAgIENVUi56cDAuY3VyW3BvaW50XSAgID0gQ1VSLnpwMC5vcmdbcG9pbnRdOworICAgICAgICBleGMtPnpwMC5vcmdbcG9pbnRdLnggPSBUVF9NdWxGaXgxNCggZGlzdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCApOworICAgICAgZXhjLT56cDAub3JnW3BvaW50XS55ID0gVFRfTXVsRml4MTQoIGRpc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICksCisgICAgICBleGMtPnpwMC5jdXJbcG9pbnRdICAgPSBleGMtPnpwMC5vcmdbcG9pbnRdOwogICAgIH0KICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgQ1VSLmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAoIENVUi5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfTUlBUF9IQUNLICkgJiYKLSAgICAgICAgIGRpc3RhbmNlID4gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgQ1VSLkdTLmZyZWVWZWN0b3IueSAhPSAwICAgICAgICAgICAgICAgICAgICAgICkKKyAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfTUlBUF9IQUNLICkgJiYKKyAgICAgICAgIGRpc3RhbmNlID4gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICE9IDAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgZGlzdGFuY2UgPSAwOwogI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwogCi0gICAgb3JnX2Rpc3QgPSBDVVJfZmFzdF9wcm9qZWN0KCAmQ1VSLnpwMC5jdXJbcG9pbnRdICk7CisgICAgb3JnX2Rpc3QgPSBGQVNUX1BST0pFQ1QoICZleGMtPnpwMC5jdXJbcG9pbnRdICk7CiAKLSAgICBpZiAoICggQ1VSLm9wY29kZSAmIDEgKSAhPSAwICkgICAvKiByb3VuZGluZyBhbmQgY29udHJvbCBjdXQtaW4gZmxhZyAqLworICAgIGlmICggKCBleGMtPm9wY29kZSAmIDEgKSAhPSAwICkgICAvKiByb3VuZGluZyBhbmQgY29udHJvbCBjdXQtaW4gZmxhZyAqLwogICAgIHsKICAgICAgIGlmICggRlRfQUJTKCBkaXN0YW5jZSAtIG9yZ19kaXN0ICkgPiBjb250cm9sX3ZhbHVlX2N1dGluICkKICAgICAgICAgZGlzdGFuY2UgPSBvcmdfZGlzdDsKIAogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotICAgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICAgICAgICAgJiYKLSAgICAgICAgICAgQ1VSLmlnbm9yZV94X21vZGUgICAgICAgICYmCi0gICAgICAgICAgIENVUi5HUy5mcmVlVmVjdG9yLnggIT0gMCApCi0gICAgICAgIGRpc3RhbmNlID0gUk9VTkRfTm9uZSggZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1swXSApOworICAgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICAgICAgICAgICYmCisgICAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgJiYKKyAgICAgICAgICAgZXhjLT5HUy5mcmVlVmVjdG9yLnggIT0gMCApCisgICAgICAgIGRpc3RhbmNlID0gUm91bmRfTm9uZSggZXhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+dHRfbWV0cmljcy5jb21wZW5zYXRpb25zWzBdICk7CiAgICAgICBlbHNlCiAjZW5kaWYKLSAgICAgICAgZGlzdGFuY2UgPSBDVVJfRnVuY19yb3VuZCggZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi50dF9tZXRyaWNzLmNvbXBlbnNhdGlvbnNbMF0gKTsKKyAgICAgICAgZGlzdGFuY2UgPSBleGMtPmZ1bmNfcm91bmQoIGV4YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT50dF9tZXRyaWNzLmNvbXBlbnNhdGlvbnNbMF0gKTsKICAgICB9CiAKLSAgICBDVVJfRnVuY19tb3ZlKCAmQ1VSLnpwMCwgcG9pbnQsIGRpc3RhbmNlIC0gb3JnX2Rpc3QgKTsKKyAgICBleGMtPmZ1bmNfbW92ZSggZXhjLCAmZXhjLT56cDAsIHBvaW50LCBkaXN0YW5jZSAtIG9yZ19kaXN0ICk7CiAKICAgRmFpbDoKLSAgICBDVVIuR1MucnAwID0gcG9pbnQ7Ci0gICAgQ1VSLkdTLnJwMSA9IHBvaW50OworICAgIGV4Yy0+R1MucnAwID0gcG9pbnQ7CisgICAgZXhjLT5HUy5ycDEgPSBwb2ludDsKICAgfQogCiAKQEAgLTY0NzUsMjkgKzYwMTksMzAgQEAKICAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgdm9pZAotICBJbnNfTURSUCggSU5TX0FSRyApCisgIEluc19NRFJQKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQogICB7CiAgICAgRlRfVVNob3J0ICAgcG9pbnQ7CiAgICAgRlRfRjI2RG90NiAgb3JnX2Rpc3QsIGRpc3RhbmNlLCBtaW5pbXVtX2Rpc3RhbmNlOwogCiAKLSAgICBtaW5pbXVtX2Rpc3RhbmNlID0gQ1VSLkdTLm1pbmltdW1fZGlzdGFuY2U7CisgICAgbWluaW11bV9kaXN0YW5jZSA9IGV4Yy0+R1MubWluaW11bV9kaXN0YW5jZTsKIAogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotICAgIGlmICggU1VCUElYRUxfSElOVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgQ1VSLmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgQ1VSLkdTLmZyZWVWZWN0b3IueCAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgISggQ1VSLnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19OT1JNQUxfUk9VTkQgKSApCisgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci54ICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAhKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19OT1JNQUxfUk9VTkQgKSApCiAgICAgICBtaW5pbXVtX2Rpc3RhbmNlID0gMDsKICNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KIAogICAgIHBvaW50ID0gKEZUX1VTaG9ydClhcmdzWzBdOwogCi0gICAgaWYgKCBCT1VORFMoIHBvaW50LCAgICAgIENVUi56cDEubl9wb2ludHMgKSB8fAotICAgICAgICAgQk9VTkRTKCBDVVIuR1MucnAwLCBDVVIuenAwLm5fcG9pbnRzICkgKQorICAgIGlmICggQk9VTkRTKCBwb2ludCwgICAgICAgZXhjLT56cDEubl9wb2ludHMgKSB8fAorICAgICAgICAgQk9VTkRTKCBleGMtPkdTLnJwMCwgZXhjLT56cDAubl9wb2ludHMgKSApCiAgICAgewotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIENVUi5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOworICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CiAgICAgICBnb3RvIEZhaWw7CiAgICAgfQogCkBAIC02NTA2LDc0ICs2MDUxLDc3IEBACiAKICAgICAvKiBYWFg6IFVORE9DVU1FTlRFRDogdHdpbGlnaHQgem9uZSBzcGVjaWFsIGNhc2UgKi8KIAotICAgIGlmICggQ1VSLkdTLmdlcDAgPT0gMCB8fCBDVVIuR1MuZ2VwMSA9PSAwICkKKyAgICBpZiAoIGV4Yy0+R1MuZ2VwMCA9PSAwIHx8IGV4Yy0+R1MuZ2VwMSA9PSAwICkKICAgICB7Ci0gICAgICBGVF9WZWN0b3IqICB2ZWMxID0gJkNVUi56cDEub3JnW3BvaW50XTsKLSAgICAgIEZUX1ZlY3RvciogIHZlYzIgPSAmQ1VSLnpwMC5vcmdbQ1VSLkdTLnJwMF07CisgICAgICBGVF9WZWN0b3IqICB2ZWMxID0gJmV4Yy0+enAxLm9yZ1twb2ludF07CisgICAgICBGVF9WZWN0b3IqICB2ZWMyID0gJmV4Yy0+enAwLm9yZ1tleGMtPkdTLnJwMF07CiAKIAotICAgICAgb3JnX2Rpc3QgPSBDVVJfRnVuY19kdWFscHJvaiggdmVjMSwgdmVjMiApOworICAgICAgb3JnX2Rpc3QgPSBEVUFMUFJPSiggdmVjMSwgdmVjMiApOwogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgRlRfVmVjdG9yKiAgdmVjMSA9ICZDVVIuenAxLm9ydXNbcG9pbnRdOwotICAgICAgRlRfVmVjdG9yKiAgdmVjMiA9ICZDVVIuenAwLm9ydXNbQ1VSLkdTLnJwMF07CisgICAgICBGVF9WZWN0b3IqICB2ZWMxID0gJmV4Yy0+enAxLm9ydXNbcG9pbnRdOworICAgICAgRlRfVmVjdG9yKiAgdmVjMiA9ICZleGMtPnpwMC5vcnVzW2V4Yy0+R1MucnAwXTsKIAogCi0gICAgICBpZiAoIENVUi5tZXRyaWNzLnhfc2NhbGUgPT0gQ1VSLm1ldHJpY3MueV9zY2FsZSApCisgICAgICBpZiAoIGV4Yy0+bWV0cmljcy54X3NjYWxlID09IGV4Yy0+bWV0cmljcy55X3NjYWxlICkKICAgICAgIHsKICAgICAgICAgLyogdGhpcyBzaG91bGQgYmUgZmFzdGVyICovCi0gICAgICAgIG9yZ19kaXN0ID0gQ1VSX0Z1bmNfZHVhbHByb2ooIHZlYzEsIHZlYzIgKTsKLSAgICAgICAgb3JnX2Rpc3QgPSBGVF9NdWxGaXgoIG9yZ19kaXN0LCBDVVIubWV0cmljcy54X3NjYWxlICk7CisgICAgICAgIG9yZ19kaXN0ID0gRFVBTFBST0ooIHZlYzEsIHZlYzIgKTsKKyAgICAgICAgb3JnX2Rpc3QgPSBGVF9NdWxGaXgoIG9yZ19kaXN0LCBleGMtPm1ldHJpY3MueF9zY2FsZSApOwogICAgICAgfQogICAgICAgZWxzZQogICAgICAgewogICAgICAgICBGVF9WZWN0b3IgIHZlYzsKIAogCi0gICAgICAgIHZlYy54ID0gRlRfTXVsRml4KCB2ZWMxLT54IC0gdmVjMi0+eCwgQ1VSLm1ldHJpY3MueF9zY2FsZSApOwotICAgICAgICB2ZWMueSA9IEZUX011bEZpeCggdmVjMS0+eSAtIHZlYzItPnksIENVUi5tZXRyaWNzLnlfc2NhbGUgKTsKKyAgICAgICAgdmVjLnggPSBGVF9NdWxGaXgoIHZlYzEtPnggLSB2ZWMyLT54LCBleGMtPm1ldHJpY3MueF9zY2FsZSApOworICAgICAgICB2ZWMueSA9IEZUX011bEZpeCggdmVjMS0+eSAtIHZlYzItPnksIGV4Yy0+bWV0cmljcy55X3NjYWxlICk7CiAKLSAgICAgICAgb3JnX2Rpc3QgPSBDVVJfZmFzdF9kdWFscHJvaiggJnZlYyApOworICAgICAgICBvcmdfZGlzdCA9IEZBU1RfRFVBTFBST0ooICZ2ZWMgKTsKICAgICAgIH0KICAgICB9CiAKICAgICAvKiBzaW5nbGUgd2lkdGggY3V0LWluIHRlc3QgKi8KIAotICAgIGlmICggRlRfQUJTKCBvcmdfZGlzdCAtIENVUi5HUy5zaW5nbGVfd2lkdGhfdmFsdWUgKSA8Ci0gICAgICAgICBDVVIuR1Muc2luZ2xlX3dpZHRoX2N1dGluICkKKyAgICBpZiAoIEZUX0FCUyggb3JnX2Rpc3QgLSBleGMtPkdTLnNpbmdsZV93aWR0aF92YWx1ZSApIDwKKyAgICAgICAgIGV4Yy0+R1Muc2luZ2xlX3dpZHRoX2N1dGluICkKICAgICB7CiAgICAgICBpZiAoIG9yZ19kaXN0ID49IDAgKQotICAgICAgICBvcmdfZGlzdCA9IENVUi5HUy5zaW5nbGVfd2lkdGhfdmFsdWU7CisgICAgICAgIG9yZ19kaXN0ID0gZXhjLT5HUy5zaW5nbGVfd2lkdGhfdmFsdWU7CiAgICAgICBlbHNlCi0gICAgICAgIG9yZ19kaXN0ID0gLUNVUi5HUy5zaW5nbGVfd2lkdGhfdmFsdWU7CisgICAgICAgIG9yZ19kaXN0ID0gLWV4Yy0+R1Muc2luZ2xlX3dpZHRoX3ZhbHVlOwogICAgIH0KIAogICAgIC8qIHJvdW5kIGZsYWcgKi8KIAotICAgIGlmICggKCBDVVIub3Bjb2RlICYgNCApICE9IDAgKQorICAgIGlmICggKCBleGMtPm9wY29kZSAmIDQgKSAhPSAwICkKICAgICB7CiAjaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCi0gICAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkcgICAgICAgICAmJgotICAgICAgICAgICBDVVIuaWdub3JlX3hfbW9kZSAgICAgICAgJiYKLSAgICAgICAgICAgQ1VSLkdTLmZyZWVWZWN0b3IueCAhPSAwICkKLSAgICAgICAgZGlzdGFuY2UgPSBST1VORF9Ob25lKAorICAgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICAgICAgICAgICYmCisgICAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgJiYKKyAgICAgICAgICAgZXhjLT5HUy5mcmVlVmVjdG9yLnggIT0gMCApCisgICAgICAgIGRpc3RhbmNlID0gUm91bmRfTm9uZSgKKyAgICAgICAgICAgICAgICAgICAgIGV4YywKICAgICAgICAgICAgICAgICAgICAgIG9yZ19kaXN0LAotICAgICAgICAgICAgICAgICAgICAgQ1VSLnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1tDVVIub3Bjb2RlICYgM10gKTsKKyAgICAgICAgICAgICAgICAgICAgIGV4Yy0+dHRfbWV0cmljcy5jb21wZW5zYXRpb25zW2V4Yy0+b3Bjb2RlICYgM10gKTsKICAgICAgIGVsc2UKICNlbmRpZgotICAgICAgZGlzdGFuY2UgPSBDVVJfRnVuY19yb3VuZCgKLSAgICAgICAgICAgICAgICAgICBvcmdfZGlzdCwKLSAgICAgICAgICAgICAgICAgICBDVVIudHRfbWV0cmljcy5jb21wZW5zYXRpb25zW0NVUi5vcGNvZGUgJiAzXSApOworICAgICAgICBkaXN0YW5jZSA9IGV4Yy0+ZnVuY19yb3VuZCgKKyAgICAgICAgICAgICAgICAgICAgIGV4YywKKyAgICAgICAgICAgICAgICAgICAgIG9yZ19kaXN0LAorICAgICAgICAgICAgICAgICAgICAgZXhjLT50dF9tZXRyaWNzLmNvbXBlbnNhdGlvbnNbZXhjLT5vcGNvZGUgJiAzXSApOwogICAgIH0KICAgICBlbHNlCi0gICAgICBkaXN0YW5jZSA9IFJPVU5EX05vbmUoCisgICAgICBkaXN0YW5jZSA9IFJvdW5kX05vbmUoCisgICAgICAgICAgICAgICAgICAgZXhjLAogICAgICAgICAgICAgICAgICAgIG9yZ19kaXN0LAotICAgICAgICAgICAgICAgICAgIENVUi50dF9tZXRyaWNzLmNvbXBlbnNhdGlvbnNbQ1VSLm9wY29kZSAmIDNdICk7CisgICAgICAgICAgICAgICAgICAgZXhjLT50dF9tZXRyaWNzLmNvbXBlbnNhdGlvbnNbZXhjLT5vcGNvZGUgJiAzXSApOwogCiAgICAgLyogbWluaW11bSBkaXN0YW5jZSBmbGFnICovCiAKLSAgICBpZiAoICggQ1VSLm9wY29kZSAmIDggKSAhPSAwICkKKyAgICBpZiAoICggZXhjLT5vcGNvZGUgJiA4ICkgIT0gMCApCiAgICAgewogICAgICAgaWYgKCBvcmdfZGlzdCA+PSAwICkKICAgICAgIHsKQEAgLTY1ODksMTcgKzYxMzcsMTYgQEAKIAogICAgIC8qIG5vdyBtb3ZlIHRoZSBwb2ludCAqLwogCi0gICAgb3JnX2Rpc3QgPSBDVVJfRnVuY19wcm9qZWN0KCBDVVIuenAxLmN1ciArIHBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLnpwMC5jdXIgKyBDVVIuR1MucnAwICk7CisgICAgb3JnX2Rpc3QgPSBQUk9KRUNUKCBleGMtPnpwMS5jdXIgKyBwb2ludCwgZXhjLT56cDAuY3VyICsgZXhjLT5HUy5ycDAgKTsKIAotICAgIENVUl9GdW5jX21vdmUoICZDVVIuenAxLCBwb2ludCwgZGlzdGFuY2UgLSBvcmdfZGlzdCApOworICAgIGV4Yy0+ZnVuY19tb3ZlKCBleGMsICZleGMtPnpwMSwgcG9pbnQsIGRpc3RhbmNlIC0gb3JnX2Rpc3QgKTsKIAogICBGYWlsOgotICAgIENVUi5HUy5ycDEgPSBDVVIuR1MucnAwOwotICAgIENVUi5HUy5ycDIgPSBwb2ludDsKKyAgICBleGMtPkdTLnJwMSA9IGV4Yy0+R1MucnAwOworICAgIGV4Yy0+R1MucnAyID0gcG9pbnQ7CiAKLSAgICBpZiAoICggQ1VSLm9wY29kZSAmIDE2ICkgIT0gMCApCi0gICAgICBDVVIuR1MucnAwID0gcG9pbnQ7CisgICAgaWYgKCAoIGV4Yy0+b3Bjb2RlICYgMTYgKSAhPSAwICkKKyAgICAgIGV4Yy0+R1MucnAwID0gcG9pbnQ7CiAgIH0KIAogCkBAIC02NjEwLDcgKzYxNTcsOCBAQAogICAvKiBTdGFjazogICAgICAgIGludDMyPyB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIEluc19NSVJQKCBJTlNfQVJHICkKKyAgSW5zX01JUlAoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCiAgIHsKICAgICBGVF9VU2hvcnQgICBwb2ludDsKICAgICBGVF9VTG9uZyAgICBjdnRFbnRyeTsKQEAgLTY2MjgsNzcgKzYxNzYsNzUgQEAKICNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KIAogCi0gICAgbWluaW11bV9kaXN0YW5jZSAgICA9IENVUi5HUy5taW5pbXVtX2Rpc3RhbmNlOwotICAgIGNvbnRyb2xfdmFsdWVfY3V0aW4gPSBDVVIuR1MuY29udHJvbF92YWx1ZV9jdXRpbjsKKyAgICBtaW5pbXVtX2Rpc3RhbmNlICAgID0gZXhjLT5HUy5taW5pbXVtX2Rpc3RhbmNlOworICAgIGNvbnRyb2xfdmFsdWVfY3V0aW4gPSBleGMtPkdTLmNvbnRyb2xfdmFsdWVfY3V0aW47CiAgICAgcG9pbnQgICAgICAgICAgICAgICA9IChGVF9VU2hvcnQpYXJnc1swXTsKICAgICBjdnRFbnRyeSAgICAgICAgICAgID0gKEZUX1VMb25nKSggYXJnc1sxXSArIDEgKTsKIAogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotICAgIGlmICggU1VCUElYRUxfSElOVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgQ1VSLmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgQ1VSLkdTLmZyZWVWZWN0b3IueCAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgISggQ1VSLnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19OT1JNQUxfUk9VTkQgKSApCisgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci54ICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAhKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19OT1JNQUxfUk9VTkQgKSApCiAgICAgICBjb250cm9sX3ZhbHVlX2N1dGluID0gbWluaW11bV9kaXN0YW5jZSA9IDA7CiAjZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCiAKICAgICAvKiBYWFg6IFVORE9DVU1FTlRFRCEgY3Z0Wy0xXSA9IDAgYWx3YXlzICovCiAKLSAgICBpZiAoIEJPVU5EUyggcG9pbnQsICAgICAgQ1VSLnpwMS5uX3BvaW50cyApIHx8Ci0gICAgICAgICBCT1VORFNMKCBjdnRFbnRyeSwgIENVUi5jdnRTaXplICsgMSApICB8fAotICAgICAgICAgQk9VTkRTKCBDVVIuR1MucnAwLCBDVVIuenAwLm5fcG9pbnRzICkgKQorICAgIGlmICggQk9VTkRTKCBwb2ludCwgICAgICAgZXhjLT56cDEubl9wb2ludHMgKSB8fAorICAgICAgICAgQk9VTkRTTCggY3Z0RW50cnksICAgZXhjLT5jdnRTaXplICsgMSApICB8fAorICAgICAgICAgQk9VTkRTKCBleGMtPkdTLnJwMCwgZXhjLT56cDAubl9wb2ludHMgKSApCiAgICAgewotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIENVUi5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOworICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CiAgICAgICBnb3RvIEZhaWw7CiAgICAgfQogCiAgICAgaWYgKCAhY3Z0RW50cnkgKQogICAgICAgY3Z0X2Rpc3QgPSAwOwogICAgIGVsc2UKLSAgICAgIGN2dF9kaXN0ID0gQ1VSX0Z1bmNfcmVhZF9jdnQoIGN2dEVudHJ5IC0gMSApOworICAgICAgY3Z0X2Rpc3QgPSBleGMtPmZ1bmNfcmVhZF9jdnQoIGV4YywgY3Z0RW50cnkgLSAxICk7CiAKICAgICAvKiBzaW5nbGUgd2lkdGggdGVzdCAqLwogCi0gICAgaWYgKCBGVF9BQlMoIGN2dF9kaXN0IC0gQ1VSLkdTLnNpbmdsZV93aWR0aF92YWx1ZSApIDwKLSAgICAgICAgIENVUi5HUy5zaW5nbGVfd2lkdGhfY3V0aW4gKQorICAgIGlmICggRlRfQUJTKCBjdnRfZGlzdCAtIGV4Yy0+R1Muc2luZ2xlX3dpZHRoX3ZhbHVlICkgPAorICAgICAgICAgZXhjLT5HUy5zaW5nbGVfd2lkdGhfY3V0aW4gKQogICAgIHsKICAgICAgIGlmICggY3Z0X2Rpc3QgPj0gMCApCi0gICAgICAgIGN2dF9kaXN0ID0gIENVUi5HUy5zaW5nbGVfd2lkdGhfdmFsdWU7CisgICAgICAgIGN2dF9kaXN0ID0gIGV4Yy0+R1Muc2luZ2xlX3dpZHRoX3ZhbHVlOwogICAgICAgZWxzZQotICAgICAgICBjdnRfZGlzdCA9IC1DVVIuR1Muc2luZ2xlX3dpZHRoX3ZhbHVlOworICAgICAgICBjdnRfZGlzdCA9IC1leGMtPkdTLnNpbmdsZV93aWR0aF92YWx1ZTsKICAgICB9CiAKICAgICAvKiBVTkRPQ1VNRU5URUQhICBUaGUgTVMgcmFzdGVyaXplciBkb2VzIHRoYXQgd2l0aCAqLwogICAgIC8qIHR3aWxpZ2h0IHBvaW50cyAoY29uZmlybWVkIGJ5IEdyZWcgSGl0Y2hjb2NrKSAgICovCi0gICAgaWYgKCBDVVIuR1MuZ2VwMSA9PSAwICkKKyAgICBpZiAoIGV4Yy0+R1MuZ2VwMSA9PSAwICkKICAgICB7Ci0gICAgICBDVVIuenAxLm9yZ1twb2ludF0ueCA9IENVUi56cDAub3JnW0NVUi5HUy5ycDBdLnggKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9NdWxGaXgxNCggKEZUX1VJbnQzMiljdnRfZGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi5HUy5mcmVlVmVjdG9yLnggKTsKLSAgICAgIENVUi56cDEub3JnW3BvaW50XS55ID0gQ1VSLnpwMC5vcmdbQ1VSLkdTLnJwMF0ueSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX011bEZpeDE0KCAoRlRfVUludDMyKWN2dF9kaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLkdTLmZyZWVWZWN0b3IueSApOwotICAgICAgQ1VSLnpwMS5jdXJbcG9pbnRdICAgPSBDVVIuenAxLm9yZ1twb2ludF07CisgICAgICBleGMtPnpwMS5vcmdbcG9pbnRdLnggPSBleGMtPnpwMC5vcmdbZXhjLT5HUy5ycDBdLnggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTXVsRml4MTQoIGN2dF9kaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci54ICk7CisgICAgICBleGMtPnpwMS5vcmdbcG9pbnRdLnkgPSBleGMtPnpwMC5vcmdbZXhjLT5HUy5ycDBdLnkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTXVsRml4MTQoIGN2dF9kaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICk7CisgICAgICBleGMtPnpwMS5jdXJbcG9pbnRdICAgPSBleGMtPnpwMS5vcmdbcG9pbnRdOwogICAgIH0KIAotICAgIG9yZ19kaXN0ID0gQ1VSX0Z1bmNfZHVhbHByb2ooICZDVVIuenAxLm9yZ1twb2ludF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNVUi56cDAub3JnW0NVUi5HUy5ycDBdICk7Ci0gICAgY3VyX2Rpc3QgPSBDVVJfRnVuY19wcm9qZWN0ICggJkNVUi56cDEuY3VyW3BvaW50XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ1VSLnpwMC5jdXJbQ1VSLkdTLnJwMF0gKTsKKyAgICBvcmdfZGlzdCA9IERVQUxQUk9KKCAmZXhjLT56cDEub3JnW3BvaW50XSwgJmV4Yy0+enAwLm9yZ1tleGMtPkdTLnJwMF0gKTsKKyAgICBjdXJfZGlzdCA9IFBST0pFQ1QgKCAmZXhjLT56cDEuY3VyW3BvaW50XSwgJmV4Yy0+enAwLmN1cltleGMtPkdTLnJwMF0gKTsKIAogICAgIC8qIGF1dG8tZmxpcCB0ZXN0ICovCiAKLSAgICBpZiAoIENVUi5HUy5hdXRvX2ZsaXAgKQorICAgIGlmICggZXhjLT5HUy5hdXRvX2ZsaXAgKQogICAgIHsKICAgICAgIGlmICggKCBvcmdfZGlzdCBeIGN2dF9kaXN0ICkgPCAwICkKICAgICAgICAgY3Z0X2Rpc3QgPSAtY3Z0X2Rpc3Q7CiAgICAgfQogCiAjaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCi0gICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgQ1VSLmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIENVUi5HUy5mcmVlVmVjdG9yLnkgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAoIENVUi5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfVElNRVNfTkVXX1JPTUFOX0hBQ0sgKSApCisgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgZXhjLT5HUy5mcmVlVmVjdG9yLnkgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAoIGV4Yy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX1RJTUVTX05FV19ST01BTl9IQUNLICkgKQogICAgIHsKICAgICAgIGlmICggY3VyX2Rpc3QgPCAtNjQgKQogICAgICAgICBjdnRfZGlzdCAtPSAxNjsKQEAgLTY3MDksMTIgKzYyNTUsMTIgQEAKIAogICAgIC8qIGNvbnRyb2wgdmFsdWUgY3V0LWluIGFuZCByb3VuZCAqLwogCi0gICAgaWYgKCAoIENVUi5vcGNvZGUgJiA0ICkgIT0gMCApCisgICAgaWYgKCAoIGV4Yy0+b3Bjb2RlICYgNCApICE9IDAgKQogICAgIHsKICAgICAgIC8qIFhYWDogVU5ET0NVTUVOVEVEISAgT25seSBwZXJmb3JtIGN1dC1pbiB0ZXN0IHdoZW4gYm90aCBwb2ludHMgKi8KICAgICAgIC8qICAgICAgcmVmZXIgdG8gdGhlIHNhbWUgem9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAotICAgICAgaWYgKCBDVVIuR1MuZ2VwMCA9PSBDVVIuR1MuZ2VwMSApCisgICAgICBpZiAoIGV4Yy0+R1MuZ2VwMCA9PSBleGMtPkdTLmdlcDEgKQogICAgICAgewogICAgICAgICAvKiBYWFg6IEFjY29yZGluZyB0byBHcmVnIEhpdGNoY29jaywgdGhlIGZvbGxvd2luZyB3b3JkaW5nIGlzICovCiAgICAgICAgIC8qICAgICAgdGhlIHJpZ2h0IG9uZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTY3MzIsMzIgKzYyNzgsMzQgQEAKICAgICAgICAgICBjdnRfZGlzdCA9IG9yZ19kaXN0OwogICAgICAgfQogCi0gICAgICBkaXN0YW5jZSA9IENVUl9GdW5jX3JvdW5kKAorICAgICAgZGlzdGFuY2UgPSBleGMtPmZ1bmNfcm91bmQoCisgICAgICAgICAgICAgICAgICAgZXhjLAogICAgICAgICAgICAgICAgICAgIGN2dF9kaXN0LAotICAgICAgICAgICAgICAgICAgIENVUi50dF9tZXRyaWNzLmNvbXBlbnNhdGlvbnNbQ1VSLm9wY29kZSAmIDNdICk7CisgICAgICAgICAgICAgICAgICAgZXhjLT50dF9tZXRyaWNzLmNvbXBlbnNhdGlvbnNbZXhjLT5vcGNvZGUgJiAzXSApOwogICAgIH0KICAgICBlbHNlCiAgICAgewogCiAjaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCiAgICAgICAvKiBkbyBjdnQgY3V0LWluIGFsd2F5cyBpbiBNSVJQIGZvciBzcGggKi8KLSAgICAgIGlmICggU1VCUElYRUxfSElOVElORyAgICAgICAgICAgJiYKLSAgICAgICAgICAgQ1VSLmlnbm9yZV94X21vZGUgICAgICAgICAgJiYKLSAgICAgICAgICAgQ1VSLkdTLmdlcDAgPT0gQ1VSLkdTLmdlcDEgKQorICAgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICAgICAgICAgICAgICYmCisgICAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgICAgJiYKKyAgICAgICAgICAgZXhjLT5HUy5nZXAwID09IGV4Yy0+R1MuZ2VwMSApCiAgICAgICB7CiAgICAgICAgIGlmICggRlRfQUJTKCBjdnRfZGlzdCAtIG9yZ19kaXN0ICkgPiBjb250cm9sX3ZhbHVlX2N1dGluICkKICAgICAgICAgICBjdnRfZGlzdCA9IG9yZ19kaXN0OwogICAgICAgfQogI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwogCi0gICAgICBkaXN0YW5jZSA9IFJPVU5EX05vbmUoCisgICAgICBkaXN0YW5jZSA9IFJvdW5kX05vbmUoCisgICAgICAgICAgICAgICAgICAgZXhjLAogICAgICAgICAgICAgICAgICAgIGN2dF9kaXN0LAotICAgICAgICAgICAgICAgICAgIENVUi50dF9tZXRyaWNzLmNvbXBlbnNhdGlvbnNbQ1VSLm9wY29kZSAmIDNdICk7CisgICAgICAgICAgICAgICAgICAgZXhjLT50dF9tZXRyaWNzLmNvbXBlbnNhdGlvbnNbZXhjLT5vcGNvZGUgJiAzXSApOwogICAgIH0KIAogICAgIC8qIG1pbmltdW0gZGlzdGFuY2UgdGVzdCAqLwogCi0gICAgaWYgKCAoIENVUi5vcGNvZGUgJiA4ICkgIT0gMCApCisgICAgaWYgKCAoIGV4Yy0+b3Bjb2RlICYgOCApICE9IDAgKQogICAgIHsKICAgICAgIGlmICggb3JnX2Rpc3QgPj0gMCApCiAgICAgICB7CkBAIC02Nzc0LDU5ICs2MzIyLDU5IEBACiAjaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCiAgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICkKICAgICB7Ci0gICAgICBCMSA9IENVUi56cDEuY3VyW3BvaW50XS55OworICAgICAgQjEgPSBleGMtPnpwMS5jdXJbcG9pbnRdLnk7CiAKICAgICAgIC8qIFJvdW5kIG1vdmVzIGlmIG5lY2Vzc2FyeSAqLwotICAgICAgaWYgKCBDVVIuaWdub3JlX3hfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgIENVUi5HUy5mcmVlVmVjdG9yLnkgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgKCBDVVIuc3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX1JPVU5EX05PTlBJWEVMX1lfTU9WRVMgKSApCisgICAgICBpZiAoIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfUk9VTkRfTk9OUElYRUxfWV9NT1ZFUyApICkKICAgICAgICAgZGlzdGFuY2UgPSBGVF9QSVhfUk9VTkQoIEIxICsgZGlzdGFuY2UgLSBjdXJfZGlzdCApIC0gQjEgKyBjdXJfZGlzdDsKIAotICAgICAgaWYgKCBDVVIuaWdub3JlX3hfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgQ1VSLkdTLmZyZWVWZWN0b3IueSAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICggQ1VSLm9wY29kZSAmIDE2ICkgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAoIENVUi5vcGNvZGUgJiA4ICkgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgKCBDVVIuc3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX0NPVVJJRVJfTkVXXzJfSEFDSyApICkKKyAgICAgIGlmICggZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueSAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICggZXhjLT5vcGNvZGUgJiAxNiApID09IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgKCBleGMtPm9wY29kZSAmIDggKSA9PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAoIGV4Yy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX0NPVVJJRVJfTkVXXzJfSEFDSyApICkKICAgICAgICAgZGlzdGFuY2UgKz0gNjQ7CiAgICAgfQogI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwogCi0gICAgQ1VSX0Z1bmNfbW92ZSggJkNVUi56cDEsIHBvaW50LCBkaXN0YW5jZSAtIGN1cl9kaXN0ICk7CisgICAgZXhjLT5mdW5jX21vdmUoIGV4YywgJmV4Yy0+enAxLCBwb2ludCwgZGlzdGFuY2UgLSBjdXJfZGlzdCApOwogCiAjaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCiAgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICkKICAgICB7Ci0gICAgICBCMiA9IENVUi56cDEuY3VyW3BvaW50XS55OworICAgICAgQjIgPSBleGMtPnpwMS5jdXJbcG9pbnRdLnk7CiAKICAgICAgIC8qIFJldmVyc2UgbW92ZSBpZiBuZWNlc3NhcnkgKi8KLSAgICAgIGlmICggQ1VSLmlnbm9yZV94X21vZGUgKQorICAgICAgaWYgKCBleGMtPmlnbm9yZV94X21vZGUgKQogICAgICAgewotICAgICAgICBpZiAoIENVUi5mYWNlLT5zcGhfY29tcGF0aWJpbGl0eV9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIENVUi5HUy5mcmVlVmVjdG9yLnkgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICggQjEgJiA2MyApID09IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICggQjIgJiA2MyApICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgIGlmICggZXhjLT5mYWNlLT5zcGhfY29tcGF0aWJpbGl0eV9tb2RlICYmCisgICAgICAgICAgICAgZXhjLT5HUy5mcmVlVmVjdG9yLnkgIT0gMCAgICAgICAgICYmCisgICAgICAgICAgICAgKCBCMSAmIDYzICkgPT0gMCAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAgKCBCMiAmIDYzICkgIT0gMCAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICByZXZlcnNlX21vdmUgPSBUUlVFOwogCi0gICAgICAgIGlmICggKCBDVVIuc3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX1NLSVBfTk9OUElYRUxfWV9NT1ZFUyApICYmCi0gICAgICAgICAgICAgQ1VSLkdTLmZyZWVWZWN0b3IueSAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgKCBCMiAmIDYzICkgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgKCBCMSAmIDYzICkgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgaWYgKCAoIGV4Yy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX1NLSVBfTk9OUElYRUxfWV9NT1ZFUyApICYmCisgICAgICAgICAgICAgZXhjLT5HUy5mcmVlVmVjdG9yLnkgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgICggQjIgJiA2MyApICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgICAoIEIxICYgNjMgKSAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICByZXZlcnNlX21vdmUgPSBUUlVFOwogICAgICAgfQogCiAgICAgICBpZiAoIHJldmVyc2VfbW92ZSApCi0gICAgICAgIENVUl9GdW5jX21vdmUoICZDVVIuenAxLCBwb2ludCwgLSggZGlzdGFuY2UgLSBjdXJfZGlzdCApICk7CisgICAgICAgIGV4Yy0+ZnVuY19tb3ZlKCBleGMsICZleGMtPnpwMSwgcG9pbnQsIC0oIGRpc3RhbmNlIC0gY3VyX2Rpc3QgKSApOwogICAgIH0KIAogI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwogCiAgIEZhaWw6Ci0gICAgQ1VSLkdTLnJwMSA9IENVUi5HUy5ycDA7CisgICAgZXhjLT5HUy5ycDEgPSBleGMtPkdTLnJwMDsKIAotICAgIGlmICggKCBDVVIub3Bjb2RlICYgMTYgKSAhPSAwICkKLSAgICAgIENVUi5HUy5ycDAgPSBwb2ludDsKKyAgICBpZiAoICggZXhjLT5vcGNvZGUgJiAxNiApICE9IDAgKQorICAgICAgZXhjLT5HUy5ycDAgPSBwb2ludDsKIAotICAgIENVUi5HUy5ycDIgPSBwb2ludDsKKyAgICBleGMtPkdTLnJwMiA9IHBvaW50OwogICB9CiAKIApAQCAtNjgzNyw2MSArNjM4NSw1OSBAQAogICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIuLi4gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIEluc19BTElHTlJQKCBJTlNfQVJHICkKKyAgSW5zX0FMSUdOUlAoIFRUX0V4ZWNDb250ZXh0ICBleGMgKQogICB7CiAgICAgRlRfVVNob3J0ICAgcG9pbnQ7CiAgICAgRlRfRjI2RG90NiAgZGlzdGFuY2U7CiAKLSAgICBGVF9VTlVTRURfQVJHOwotCiAKICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBDVVIuaWdub3JlX3hfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgQ1VSLml1cF9jYWxsZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICggQ1VSLnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19OT19BTElHTlJQX0FGVEVSX0lVUCApICkKKyAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICBleGMtPml1cF9jYWxsZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfTk9fQUxJR05SUF9BRlRFUl9JVVAgKSApCiAgICAgewotICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CisgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CiAgICAgICBnb3RvIEZhaWw7CiAgICAgfQogI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwogCi0gICAgaWYgKCBDVVIudG9wIDwgQ1VSLkdTLmxvb3AgfHwKLSAgICAgICAgIEJPVU5EUyggQ1VSLkdTLnJwMCwgQ1VSLnpwMC5uX3BvaW50cyApICkKKyAgICBpZiAoIGV4Yy0+dG9wIDwgZXhjLT5HUy5sb29wICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgIEJPVU5EUyggZXhjLT5HUy5ycDAsIGV4Yy0+enAwLm5fcG9pbnRzICkgKQogICAgIHsKLSAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKKyAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwogICAgICAgZ290byBGYWlsOwogICAgIH0KIAotICAgIHdoaWxlICggQ1VSLkdTLmxvb3AgPiAwICkKKyAgICB3aGlsZSAoIGV4Yy0+R1MubG9vcCA+IDAgKQogICAgIHsKLSAgICAgIENVUi5hcmdzLS07CisgICAgICBleGMtPmFyZ3MtLTsKIAotICAgICAgcG9pbnQgPSAoRlRfVVNob3J0KUNVUi5zdGFja1tDVVIuYXJnc107CisgICAgICBwb2ludCA9IChGVF9VU2hvcnQpZXhjLT5zdGFja1tleGMtPmFyZ3NdOwogCi0gICAgICBpZiAoIEJPVU5EUyggcG9pbnQsIENVUi56cDEubl9wb2ludHMgKSApCisgICAgICBpZiAoIEJPVU5EUyggcG9pbnQsIGV4Yy0+enAxLm5fcG9pbnRzICkgKQogICAgICAgewotICAgICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQogICAgICAgICB7Ci0gICAgICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CisgICAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwogICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgfQogICAgICAgZWxzZQogICAgICAgewotICAgICAgICBkaXN0YW5jZSA9IENVUl9GdW5jX3Byb2plY3QoIENVUi56cDEuY3VyICsgcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLnpwMC5jdXIgKyBDVVIuR1MucnAwICk7CisgICAgICAgIGRpc3RhbmNlID0gUFJPSkVDVCggZXhjLT56cDEuY3VyICsgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT56cDAuY3VyICsgZXhjLT5HUy5ycDAgKTsKIAotICAgICAgICBDVVJfRnVuY19tb3ZlKCAmQ1VSLnpwMSwgcG9pbnQsIC1kaXN0YW5jZSApOworICAgICAgICBleGMtPmZ1bmNfbW92ZSggZXhjLCAmZXhjLT56cDEsIHBvaW50LCAtZGlzdGFuY2UgKTsKICAgICAgIH0KIAotICAgICAgQ1VSLkdTLmxvb3AtLTsKKyAgICAgIGV4Yy0+R1MubG9vcC0tOwogICAgIH0KIAogICBGYWlsOgotICAgIENVUi5HUy5sb29wID0gMTsKLSAgICBDVVIubmV3X3RvcCA9IENVUi5hcmdzOworICAgIGV4Yy0+R1MubG9vcCA9IDE7CisgICAgZXhjLT5uZXdfdG9wID0gZXhjLT5hcmdzOwogICB9CiAKIApAQCAtNjkwMiw3ICs2NDQ4LDggQEAKICAgLyogU3RhY2s6ICAgICAgICA1ICogdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgdm9pZAotICBJbnNfSVNFQ1QoIElOU19BUkcgKQorICBJbnNfSVNFQ1QoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQogICB7CiAgICAgRlRfVVNob3J0ICAgcG9pbnQsCiAgICAgICAgICAgICAgICAgYTAsIGExLApAQCAtNjkyNiwyOSArNjQ3MywyNyBAQAogICAgIGIwID0gKEZUX1VTaG9ydClhcmdzWzNdOwogICAgIGIxID0gKEZUX1VTaG9ydClhcmdzWzRdOwogCi0gICAgaWYgKCBCT1VORFMoIGIwLCBDVVIuenAwLm5fcG9pbnRzICkgIHx8Ci0gICAgICAgICBCT1VORFMoIGIxLCBDVVIuenAwLm5fcG9pbnRzICkgIHx8Ci0gICAgICAgICBCT1VORFMoIGEwLCBDVVIuenAxLm5fcG9pbnRzICkgIHx8Ci0gICAgICAgICBCT1VORFMoIGExLCBDVVIuenAxLm5fcG9pbnRzICkgIHx8Ci0gICAgICAgICBCT1VORFMoIHBvaW50LCBDVVIuenAyLm5fcG9pbnRzICkgKQorICAgIGlmICggQk9VTkRTKCBiMCwgICAgZXhjLT56cDAubl9wb2ludHMgKSB8fAorICAgICAgICAgQk9VTkRTKCBiMSwgICAgZXhjLT56cDAubl9wb2ludHMgKSB8fAorICAgICAgICAgQk9VTkRTKCBhMCwgICAgZXhjLT56cDEubl9wb2ludHMgKSB8fAorICAgICAgICAgQk9VTkRTKCBhMSwgICAgZXhjLT56cDEubl9wb2ludHMgKSB8fAorICAgICAgICAgQk9VTkRTKCBwb2ludCwgZXhjLT56cDIubl9wb2ludHMgKSApCiAgICAgewotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIENVUi5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOworICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CiAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgLyogQ3JhbWVyJ3MgcnVsZSAqLwogCi0gICAgZGJ4ID0gQ1VSLnpwMC5jdXJbYjFdLnggLSBDVVIuenAwLmN1cltiMF0ueDsKLSAgICBkYnkgPSBDVVIuenAwLmN1cltiMV0ueSAtIENVUi56cDAuY3VyW2IwXS55OworICAgIGRieCA9IGV4Yy0+enAwLmN1cltiMV0ueCAtIGV4Yy0+enAwLmN1cltiMF0ueDsKKyAgICBkYnkgPSBleGMtPnpwMC5jdXJbYjFdLnkgLSBleGMtPnpwMC5jdXJbYjBdLnk7CiAKLSAgICBkYXggPSBDVVIuenAxLmN1clthMV0ueCAtIENVUi56cDEuY3VyW2EwXS54OwotICAgIGRheSA9IENVUi56cDEuY3VyW2ExXS55IC0gQ1VSLnpwMS5jdXJbYTBdLnk7CisgICAgZGF4ID0gZXhjLT56cDEuY3VyW2ExXS54IC0gZXhjLT56cDEuY3VyW2EwXS54OworICAgIGRheSA9IGV4Yy0+enAxLmN1clthMV0ueSAtIGV4Yy0+enAxLmN1clthMF0ueTsKIAotICAgIGR4ID0gQ1VSLnpwMC5jdXJbYjBdLnggLSBDVVIuenAxLmN1clthMF0ueDsKLSAgICBkeSA9IENVUi56cDAuY3VyW2IwXS55IC0gQ1VSLnpwMS5jdXJbYTBdLnk7Ci0KLSAgICBDVVIuenAyLnRhZ3NbcG9pbnRdIHw9IEZUX0NVUlZFX1RBR19UT1VDSF9CT1RIOworICAgIGR4ID0gZXhjLT56cDAuY3VyW2IwXS54IC0gZXhjLT56cDEuY3VyW2EwXS54OworICAgIGR5ID0gZXhjLT56cDAuY3VyW2IwXS55IC0gZXhjLT56cDEuY3VyW2EwXS55OwogCiAgICAgZGlzY3JpbWluYW50ID0gRlRfTXVsRGl2KCBkYXgsIC1kYnksIDB4NDAgKSArCiAgICAgICAgICAgICAgICAgICAgRlRfTXVsRGl2KCBkYXksIGRieCwgMHg0MCApOwpAQCAtNjk3MCwyMiArNjUxNSwyNCBAQAogICAgICAgUi54ID0gRlRfTXVsRGl2KCB2YWwsIGRheCwgZGlzY3JpbWluYW50ICk7CiAgICAgICBSLnkgPSBGVF9NdWxEaXYoIHZhbCwgZGF5LCBkaXNjcmltaW5hbnQgKTsKIAotICAgICAgQ1VSLnpwMi5jdXJbcG9pbnRdLnggPSBDVVIuenAxLmN1clthMF0ueCArIFIueDsKLSAgICAgIENVUi56cDIuY3VyW3BvaW50XS55ID0gQ1VSLnpwMS5jdXJbYTBdLnkgKyBSLnk7CisgICAgICBleGMtPnpwMi5jdXJbcG9pbnRdLnggPSBleGMtPnpwMS5jdXJbYTBdLnggKyBSLng7CisgICAgICBleGMtPnpwMi5jdXJbcG9pbnRdLnkgPSBleGMtPnpwMS5jdXJbYTBdLnkgKyBSLnk7CiAgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICAvKiBlbHNlLCB0YWtlIHRoZSBtaWRkbGUgb2YgdGhlIG1pZGRsZXMgb2YgQSBhbmQgQiAqLwogCi0gICAgICBDVVIuenAyLmN1cltwb2ludF0ueCA9ICggQ1VSLnpwMS5jdXJbYTBdLnggKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi56cDEuY3VyW2ExXS54ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIuenAwLmN1cltiMF0ueCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLnpwMC5jdXJbYjFdLnggKSAvIDQ7Ci0gICAgICBDVVIuenAyLmN1cltwb2ludF0ueSA9ICggQ1VSLnpwMS5jdXJbYTBdLnkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi56cDEuY3VyW2ExXS55ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIuenAwLmN1cltiMF0ueSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLnpwMC5jdXJbYjFdLnkgKSAvIDQ7CisgICAgICBleGMtPnpwMi5jdXJbcG9pbnRdLnggPSAoIGV4Yy0+enAxLmN1clthMF0ueCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+enAxLmN1clthMV0ueCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+enAwLmN1cltiMF0ueCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+enAwLmN1cltiMV0ueCApIC8gNDsKKyAgICAgIGV4Yy0+enAyLmN1cltwb2ludF0ueSA9ICggZXhjLT56cDEuY3VyW2EwXS55ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT56cDEuY3VyW2ExXS55ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT56cDAuY3VyW2IwXS55ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT56cDAuY3VyW2IxXS55ICkgLyA0OwogICAgIH0KKworICAgIGV4Yy0+enAyLnRhZ3NbcG9pbnRdIHw9IEZUX0NVUlZFX1RBR19UT1VDSF9CT1RIOwogICB9CiAKIApAQCAtNjk5Niw3ICs2NTQzLDggQEAKICAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgdm9pZAotICBJbnNfQUxJR05QVFMoIElOU19BUkcgKQorICBJbnNfQUxJR05QVFMoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQogICB7CiAgICAgRlRfVVNob3J0ICAgcDEsIHAyOwogICAgIEZUX0YyNkRvdDYgIGRpc3RhbmNlOwpAQCAtNzAwNSwxOSArNjU1MywxOCBAQAogICAgIHAxID0gKEZUX1VTaG9ydClhcmdzWzBdOwogICAgIHAyID0gKEZUX1VTaG9ydClhcmdzWzFdOwogCi0gICAgaWYgKCBCT1VORFMoIHAxLCBDVVIuenAxLm5fcG9pbnRzICkgfHwKLSAgICAgICAgIEJPVU5EUyggcDIsIENVUi56cDAubl9wb2ludHMgKSApCisgICAgaWYgKCBCT1VORFMoIHAxLCBleGMtPnpwMS5uX3BvaW50cyApIHx8CisgICAgICAgICBCT1VORFMoIHAyLCBleGMtPnpwMC5uX3BvaW50cyApICkKICAgICB7Ci0gICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CisgICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCisgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBkaXN0YW5jZSA9IENVUl9GdW5jX3Byb2plY3QoIENVUi56cDAuY3VyICsgcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIuenAxLmN1ciArIHAxICkgLyAyOworICAgIGRpc3RhbmNlID0gUFJPSkVDVCggZXhjLT56cDAuY3VyICsgcDIsIGV4Yy0+enAxLmN1ciArIHAxICkgLyAyOwogCi0gICAgQ1VSX0Z1bmNfbW92ZSggJkNVUi56cDEsIHAxLCBkaXN0YW5jZSApOwotICAgIENVUl9GdW5jX21vdmUoICZDVVIuenAwLCBwMiwgLWRpc3RhbmNlICk7CisgICAgZXhjLT5mdW5jX21vdmUoIGV4YywgJmV4Yy0+enAxLCBwMSwgZGlzdGFuY2UgKTsKKyAgICBleGMtPmZ1bmNfbW92ZSggZXhjLCAmZXhjLT56cDAsIHAyLCAtZGlzdGFuY2UgKTsKICAgfQogCiAKQEAgLTcwMzEsNTAgKzY1NzgsNDggQEAKICAgLyogU09NRVRJTUVTLCBEVU1CRVIgQ09ERSBJUyBCRVRURVIgQ09ERSAqLwogCiAgIHN0YXRpYyB2b2lkCi0gIEluc19JUCggSU5TX0FSRyApCisgIEluc19JUCggVFRfRXhlY0NvbnRleHQgIGV4YyApCiAgIHsKICAgICBGVF9GMjZEb3Q2ICBvbGRfcmFuZ2UsIGN1cl9yYW5nZTsKICAgICBGVF9WZWN0b3IqICBvcnVzX2Jhc2U7CiAgICAgRlRfVmVjdG9yKiAgY3VyX2Jhc2U7CiAgICAgRlRfSW50ICAgICAgdHdpbGlnaHQ7CiAKLSAgICBGVF9VTlVTRURfQVJHOwogCi0KLSAgICBpZiAoIENVUi50b3AgPCBDVVIuR1MubG9vcCApCisgICAgaWYgKCBleGMtPnRvcCA8IGV4Yy0+R1MubG9vcCApCiAgICAgewotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIENVUi5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOworICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CiAgICAgICBnb3RvIEZhaWw7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBXZSBuZWVkIHRvIGRlYWwgaW4gYSBzcGVjaWFsIHdheSB3aXRoIHRoZSB0d2lsaWdodCB6b25lLgotICAgICAqIE90aGVyd2lzZSwgYnkgZGVmaW5pdGlvbiwgdGhlIHZhbHVlIG9mIENVUi50d2lsaWdodC5vcnVzW25dIGlzICgwLDApLAorICAgICAqIE90aGVyd2lzZSwgYnkgZGVmaW5pdGlvbiwgdGhlIHZhbHVlIG9mIGV4Yy0+dHdpbGlnaHQub3J1c1tuXSBpcyAoMCwwKSwKICAgICAgKiBmb3IgZXZlcnkgbi4KICAgICAgKi8KLSAgICB0d2lsaWdodCA9IENVUi5HUy5nZXAwID09IDAgfHwgQ1VSLkdTLmdlcDEgPT0gMCB8fCBDVVIuR1MuZ2VwMiA9PSAwOworICAgIHR3aWxpZ2h0ID0gZXhjLT5HUy5nZXAwID09IDAgfHwgZXhjLT5HUy5nZXAxID09IDAgfHwgZXhjLT5HUy5nZXAyID09IDA7CiAKLSAgICBpZiAoIEJPVU5EUyggQ1VSLkdTLnJwMSwgQ1VSLnpwMC5uX3BvaW50cyApICkKKyAgICBpZiAoIEJPVU5EUyggZXhjLT5HUy5ycDEsIGV4Yy0+enAwLm5fcG9pbnRzICkgKQogICAgIHsKLSAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKKyAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwogICAgICAgZ290byBGYWlsOwogICAgIH0KIAogICAgIGlmICggdHdpbGlnaHQgKQotICAgICAgb3J1c19iYXNlID0gJkNVUi56cDAub3JnW0NVUi5HUy5ycDFdOworICAgICAgb3J1c19iYXNlID0gJmV4Yy0+enAwLm9yZ1tleGMtPkdTLnJwMV07CiAgICAgZWxzZQotICAgICAgb3J1c19iYXNlID0gJkNVUi56cDAub3J1c1tDVVIuR1MucnAxXTsKKyAgICAgIG9ydXNfYmFzZSA9ICZleGMtPnpwMC5vcnVzW2V4Yy0+R1MucnAxXTsKIAotICAgIGN1cl9iYXNlID0gJkNVUi56cDAuY3VyW0NVUi5HUy5ycDFdOworICAgIGN1cl9iYXNlID0gJmV4Yy0+enAwLmN1cltleGMtPkdTLnJwMV07CiAKICAgICAvKiBYWFg6IFRoZXJlIGFyZSBzb21lIGdseXBocyBpbiBzb21lIGJyYWluZGVhZCBidXQgcG9wdWxhciAqLwogICAgIC8qICAgICAgZm9udHMgb3V0IHRoZXJlIChlLmcuIFthZXVdZ3JhdmUgaW4gbW9ub3R5cGUudHRmKSAgICovCiAgICAgLyogICAgICBjYWxsaW5nIElQW10gd2l0aCBiYWQgdmFsdWVzIG9mIHJwWzEyXS4gICAgICAgICAgICAgKi8KICAgICAvKiAgICAgIERvIHNvbWV0aGluZyBzYW5lIHdoZW4gdGhpcyBvZGQgdGhpbmcgaGFwcGVucy4gICAgICAqLwotICAgIGlmICggQk9VTkRTKCBDVVIuR1MucnAxLCBDVVIuenAwLm5fcG9pbnRzICkgfHwKLSAgICAgICAgIEJPVU5EUyggQ1VSLkdTLnJwMiwgQ1VSLnpwMS5uX3BvaW50cyApICkKKyAgICBpZiAoIEJPVU5EUyggZXhjLT5HUy5ycDEsIGV4Yy0+enAwLm5fcG9pbnRzICkgfHwKKyAgICAgICAgIEJPVU5EUyggZXhjLT5HUy5ycDIsIGV4Yy0+enAxLm5fcG9pbnRzICkgKQogICAgIHsKICAgICAgIG9sZF9yYW5nZSA9IDA7CiAgICAgICBjdXJfcmFuZ2UgPSAwOwpAQCAtNzA4Miw2MiArNjYyNyw2MCBAQAogICAgIGVsc2UKICAgICB7CiAgICAgICBpZiAoIHR3aWxpZ2h0ICkKLSAgICAgICAgb2xkX3JhbmdlID0gQ1VSX0Z1bmNfZHVhbHByb2ooICZDVVIuenAxLm9yZ1tDVVIuR1MucnAyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ydXNfYmFzZSApOwotICAgICAgZWxzZSBpZiAoIENVUi5tZXRyaWNzLnhfc2NhbGUgPT0gQ1VSLm1ldHJpY3MueV9zY2FsZSApCi0gICAgICAgIG9sZF9yYW5nZSA9IENVUl9GdW5jX2R1YWxwcm9qKCAmQ1VSLnpwMS5vcnVzW0NVUi5HUy5ycDJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3J1c19iYXNlICk7CisgICAgICAgIG9sZF9yYW5nZSA9IERVQUxQUk9KKCAmZXhjLT56cDEub3JnW2V4Yy0+R1MucnAyXSwgb3J1c19iYXNlICk7CisgICAgICBlbHNlIGlmICggZXhjLT5tZXRyaWNzLnhfc2NhbGUgPT0gZXhjLT5tZXRyaWNzLnlfc2NhbGUgKQorICAgICAgICBvbGRfcmFuZ2UgPSBEVUFMUFJPSiggJmV4Yy0+enAxLm9ydXNbZXhjLT5HUy5ycDJdLCBvcnVzX2Jhc2UgKTsKICAgICAgIGVsc2UKICAgICAgIHsKICAgICAgICAgRlRfVmVjdG9yICB2ZWM7CiAKIAotICAgICAgICB2ZWMueCA9IEZUX011bEZpeCggQ1VSLnpwMS5vcnVzW0NVUi5HUy5ycDJdLnggLSBvcnVzX2Jhc2UtPngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIubWV0cmljcy54X3NjYWxlICk7Ci0gICAgICAgIHZlYy55ID0gRlRfTXVsRml4KCBDVVIuenAxLm9ydXNbQ1VSLkdTLnJwMl0ueSAtIG9ydXNfYmFzZS0+eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUi5tZXRyaWNzLnlfc2NhbGUgKTsKKyAgICAgICAgdmVjLnggPSBGVF9NdWxGaXgoIGV4Yy0+enAxLm9ydXNbZXhjLT5HUy5ycDJdLnggLSBvcnVzX2Jhc2UtPngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPm1ldHJpY3MueF9zY2FsZSApOworICAgICAgICB2ZWMueSA9IEZUX011bEZpeCggZXhjLT56cDEub3J1c1tleGMtPkdTLnJwMl0ueSAtIG9ydXNfYmFzZS0+eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+bWV0cmljcy55X3NjYWxlICk7CiAKLSAgICAgICAgb2xkX3JhbmdlID0gQ1VSX2Zhc3RfZHVhbHByb2ooICZ2ZWMgKTsKKyAgICAgICAgb2xkX3JhbmdlID0gRkFTVF9EVUFMUFJPSiggJnZlYyApOwogICAgICAgfQogCi0gICAgICBjdXJfcmFuZ2UgPSBDVVJfRnVuY19wcm9qZWN0ICggJkNVUi56cDEuY3VyW0NVUi5HUy5ycDJdLCBjdXJfYmFzZSApOworICAgICAgY3VyX3JhbmdlID0gUFJPSkVDVCggJmV4Yy0+enAxLmN1cltleGMtPkdTLnJwMl0sIGN1cl9iYXNlICk7CiAgICAgfQogCi0gICAgZm9yICggOyBDVVIuR1MubG9vcCA+IDA7IC0tQ1VSLkdTLmxvb3AgKQorICAgIGZvciAoIDsgZXhjLT5HUy5sb29wID4gMDsgLS1leGMtPkdTLmxvb3AgKQogICAgIHsKLSAgICAgIEZUX1VJbnQgICAgIHBvaW50ID0gKEZUX1VJbnQpQ1VSLnN0YWNrWy0tQ1VSLmFyZ3NdOworICAgICAgRlRfVUludCAgICAgcG9pbnQgPSAoRlRfVUludClleGMtPnN0YWNrWy0tZXhjLT5hcmdzXTsKICAgICAgIEZUX0YyNkRvdDYgIG9yZ19kaXN0LCBjdXJfZGlzdCwgbmV3X2Rpc3Q7CiAKIAogICAgICAgLyogY2hlY2sgcG9pbnQgYm91bmRzICovCi0gICAgICBpZiAoIEJPVU5EUyggcG9pbnQsIENVUi56cDIubl9wb2ludHMgKSApCisgICAgICBpZiAoIEJPVU5EUyggcG9pbnQsIGV4Yy0+enAyLm5fcG9pbnRzICkgKQogICAgICAgewotICAgICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQogICAgICAgICB7Ci0gICAgICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CisgICAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwogICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KIAogICAgICAgaWYgKCB0d2lsaWdodCApCi0gICAgICAgIG9yZ19kaXN0ID0gQ1VSX0Z1bmNfZHVhbHByb2ooICZDVVIuenAyLm9yZ1twb2ludF0sIG9ydXNfYmFzZSApOwotICAgICAgZWxzZSBpZiAoIENVUi5tZXRyaWNzLnhfc2NhbGUgPT0gQ1VSLm1ldHJpY3MueV9zY2FsZSApCi0gICAgICAgIG9yZ19kaXN0ID0gQ1VSX0Z1bmNfZHVhbHByb2ooICZDVVIuenAyLm9ydXNbcG9pbnRdLCBvcnVzX2Jhc2UgKTsKKyAgICAgICAgb3JnX2Rpc3QgPSBEVUFMUFJPSiggJmV4Yy0+enAyLm9yZ1twb2ludF0sIG9ydXNfYmFzZSApOworICAgICAgZWxzZSBpZiAoIGV4Yy0+bWV0cmljcy54X3NjYWxlID09IGV4Yy0+bWV0cmljcy55X3NjYWxlICkKKyAgICAgICAgb3JnX2Rpc3QgPSBEVUFMUFJPSiggJmV4Yy0+enAyLm9ydXNbcG9pbnRdLCBvcnVzX2Jhc2UgKTsKICAgICAgIGVsc2UKICAgICAgIHsKICAgICAgICAgRlRfVmVjdG9yICB2ZWM7CiAKIAotICAgICAgICB2ZWMueCA9IEZUX011bEZpeCggQ1VSLnpwMi5vcnVzW3BvaW50XS54IC0gb3J1c19iYXNlLT54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLm1ldHJpY3MueF9zY2FsZSApOwotICAgICAgICB2ZWMueSA9IEZUX011bEZpeCggQ1VSLnpwMi5vcnVzW3BvaW50XS55IC0gb3J1c19iYXNlLT55LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLm1ldHJpY3MueV9zY2FsZSApOworICAgICAgICB2ZWMueCA9IEZUX011bEZpeCggZXhjLT56cDIub3J1c1twb2ludF0ueCAtIG9ydXNfYmFzZS0+eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+bWV0cmljcy54X3NjYWxlICk7CisgICAgICAgIHZlYy55ID0gRlRfTXVsRml4KCBleGMtPnpwMi5vcnVzW3BvaW50XS55IC0gb3J1c19iYXNlLT55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT5tZXRyaWNzLnlfc2NhbGUgKTsKIAotICAgICAgICBvcmdfZGlzdCA9IENVUl9mYXN0X2R1YWxwcm9qKCAmdmVjICk7CisgICAgICAgIG9yZ19kaXN0ID0gRkFTVF9EVUFMUFJPSiggJnZlYyApOwogICAgICAgfQogCi0gICAgICBjdXJfZGlzdCA9IENVUl9GdW5jX3Byb2plY3QoICZDVVIuenAyLmN1cltwb2ludF0sIGN1cl9iYXNlICk7CisgICAgICBjdXJfZGlzdCA9IFBST0pFQ1QoICZleGMtPnpwMi5jdXJbcG9pbnRdLCBjdXJfYmFzZSApOwogCiAgICAgICBpZiAoIG9yZ19kaXN0ICkKICAgICAgIHsKQEAgLTcxNjcsMTIgKzY3MTAsMTUgQEAKICAgICAgIGVsc2UKICAgICAgICAgbmV3X2Rpc3QgPSAwOwogCi0gICAgICBDVVJfRnVuY19tb3ZlKCAmQ1VSLnpwMiwgKEZUX1VTaG9ydClwb2ludCwgbmV3X2Rpc3QgLSBjdXJfZGlzdCApOworICAgICAgZXhjLT5mdW5jX21vdmUoIGV4YywKKyAgICAgICAgICAgICAgICAgICAgICAmZXhjLT56cDIsCisgICAgICAgICAgICAgICAgICAgICAgKEZUX1VTaG9ydClwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICBuZXdfZGlzdCAtIGN1cl9kaXN0ICk7CiAgICAgfQogCiAgIEZhaWw6Ci0gICAgQ1VSLkdTLmxvb3AgPSAxOwotICAgIENVUi5uZXdfdG9wID0gQ1VSLmFyZ3M7CisgICAgZXhjLT5HUy5sb29wID0gMTsKKyAgICBleGMtPm5ld190b3AgPSBleGMtPmFyZ3M7CiAgIH0KIAogCkBAIC03MTgzLDcgKzY3MjksOCBAQAogICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIEluc19VVFAoIElOU19BUkcgKQorICBJbnNfVVRQKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCiAgIHsKICAgICBGVF9VU2hvcnQgIHBvaW50OwogICAgIEZUX0J5dGUgICAgbWFzazsKQEAgLTcxOTEsMjIgKzY3MzgsMjIgQEAKIAogICAgIHBvaW50ID0gKEZUX1VTaG9ydClhcmdzWzBdOwogCi0gICAgaWYgKCBCT1VORFMoIHBvaW50LCBDVVIuenAwLm5fcG9pbnRzICkgKQorICAgIGlmICggQk9VTkRTKCBwb2ludCwgZXhjLT56cDAubl9wb2ludHMgKSApCiAgICAgewotICAgICAgaWYgKCBDVVIucGVkYW50aWNfaGludGluZyApCi0gICAgICAgIENVUi5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOworICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CiAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgbWFzayA9IDB4RkY7CiAKLSAgICBpZiAoIENVUi5HUy5mcmVlVmVjdG9yLnggIT0gMCApCisgICAgaWYgKCBleGMtPkdTLmZyZWVWZWN0b3IueCAhPSAwICkKICAgICAgIG1hc2sgJj0gfkZUX0NVUlZFX1RBR19UT1VDSF9YOwogCi0gICAgaWYgKCBDVVIuR1MuZnJlZVZlY3Rvci55ICE9IDAgKQorICAgIGlmICggZXhjLT5HUy5mcmVlVmVjdG9yLnkgIT0gMCApCiAgICAgICBtYXNrICY9IH5GVF9DVVJWRV9UQUdfVE9VQ0hfWTsKIAotICAgIENVUi56cDAudGFnc1twb2ludF0gJj0gbWFzazsKKyAgICBleGMtPnpwMC50YWdzW3BvaW50XSAmPSBtYXNrOwogICB9CiAKIApAQCAtNzI1MSw3ICs2Nzk4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHJlZjIgKQogICB7CiAgICAgRlRfVUludCAgICAgaTsKLSAgICBGVF9GMjZEb3Q2ICBvcnVzMSwgb3J1czIsIG9yZzEsIG9yZzIsIGRlbHRhMSwgZGVsdGEyOworICAgIEZUX0YyNkRvdDYgIG9ydXMxLCBvcnVzMiwgb3JnMSwgb3JnMiwgY3VyMSwgY3VyMiwgZGVsdGExLCBkZWx0YTI7CiAKIAogICAgIGlmICggcDEgPiBwMiApCkBAIC03MjgxLDEyICs2ODI4LDE1IEBACiAKICAgICBvcmcxICAgPSB3b3JrZXItPm9yZ3NbcmVmMV0ueDsKICAgICBvcmcyICAgPSB3b3JrZXItPm9yZ3NbcmVmMl0ueDsKLSAgICBkZWx0YTEgPSB3b3JrZXItPmN1cnNbcmVmMV0ueCAtIG9yZzE7Ci0gICAgZGVsdGEyID0gd29ya2VyLT5jdXJzW3JlZjJdLnggLSBvcmcyOworICAgIGN1cjEgICA9IHdvcmtlci0+Y3Vyc1tyZWYxXS54OworICAgIGN1cjIgICA9IHdvcmtlci0+Y3Vyc1tyZWYyXS54OworICAgIGRlbHRhMSA9IGN1cjEgLSBvcmcxOworICAgIGRlbHRhMiA9IGN1cjIgLSBvcmcyOwogCi0gICAgaWYgKCBvcnVzMSA9PSBvcnVzMiApCisgICAgaWYgKCBjdXIxID09IGN1cjIgfHwgb3J1czEgPT0gb3J1czIgKQogICAgIHsKLSAgICAgIC8qIHNpbXBsZSBzaGlmdCBvZiB1bnRvdWNoZWQgcG9pbnRzICovCisKKyAgICAgIC8qIHRyaXZpYWwgc25hcCBvciBzaGlmdCBvZiB1bnRvdWNoZWQgcG9pbnRzICovCiAgICAgICBmb3IgKCBpID0gcDE7IGkgPD0gcDI7IGkrKyApCiAgICAgICB7CiAgICAgICAgIEZUX0YyNkRvdDYgIHggPSB3b3JrZXItPm9yZ3NbaV0ueDsKQEAgLTcyOTQsOSArNjg0NCwxMyBAQAogCiAgICAgICAgIGlmICggeCA8PSBvcmcxICkKICAgICAgICAgICB4ICs9IGRlbHRhMTsKLSAgICAgICAgZWxzZQorCisgICAgICAgIGVsc2UgaWYgKCB4ID49IG9yZzIgKQogICAgICAgICAgIHggKz0gZGVsdGEyOwogCisgICAgICAgIGVsc2UKKyAgICAgICAgICB4ID0gY3VyMTsKKwogICAgICAgICB3b3JrZXItPmN1cnNbaV0ueCA9IHg7CiAgICAgICB9CiAgICAgfQpAQCAtNzMyMywxMiArNjg3NywxMCBAQAogICAgICAgICAgIGlmICggIXNjYWxlX3ZhbGlkICkKICAgICAgICAgICB7CiAgICAgICAgICAgICBzY2FsZV92YWxpZCA9IDE7Ci0gICAgICAgICAgICBzY2FsZSAgICAgICA9IEZUX0RpdkZpeCggb3JnMiArIGRlbHRhMiAtICggb3JnMSArIGRlbHRhMSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ydXMyIC0gb3J1czEgKTsKKyAgICAgICAgICAgIHNjYWxlICAgICAgID0gRlRfRGl2Rml4KCBjdXIyIC0gY3VyMSwgb3J1czIgLSBvcnVzMSApOwogICAgICAgICAgIH0KIAotICAgICAgICAgIHggPSAoIG9yZzEgKyBkZWx0YTEgKSArCi0gICAgICAgICAgICAgIEZUX011bEZpeCggd29ya2VyLT5vcnVzW2ldLnggLSBvcnVzMSwgc2NhbGUgKTsKKyAgICAgICAgICB4ID0gY3VyMSArIEZUX011bEZpeCggd29ya2VyLT5vcnVzW2ldLnggLSBvcnVzMSwgc2NhbGUgKTsKICAgICAgICAgfQogICAgICAgICB3b3JrZXItPmN1cnNbaV0ueCA9IHg7CiAgICAgICB9CkBAIC03MzQzLDcgKzY4OTUsNyBAQAogICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIEluc19JVVAoIElOU19BUkcgKQorICBJbnNfSVVQKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKICAgewogICAgIElVUF9Xb3JrZXJSZWMgIFY7CiAgICAgRlRfQnl0ZSAgICAgICAgbWFzazsKQEAgLTczNTcsNTEgKzY5MDksNDkgQEAKICAgICBGVF9VSW50ICAgcG9pbnQ7ICAgICAgICAgLyogY3VycmVudCBwb2ludCAgICovCiAgICAgRlRfU2hvcnQgIGNvbnRvdXI7ICAgICAgIC8qIGN1cnJlbnQgY29udG91ciAqLwogCi0gICAgRlRfVU5VU0VEX0FSRzsKLQogCiAgICAgLyogaWdub3JlIGVtcHR5IG91dGxpbmVzICovCi0gICAgaWYgKCBDVVIucHRzLm5fY29udG91cnMgPT0gMCApCisgICAgaWYgKCBleGMtPnB0cy5uX2NvbnRvdXJzID09IDAgKQogICAgICAgcmV0dXJuOwogCi0gICAgaWYgKCBDVVIub3Bjb2RlICYgMSApCisgICAgaWYgKCBleGMtPm9wY29kZSAmIDEgKQogICAgIHsKICAgICAgIG1hc2sgICA9IEZUX0NVUlZFX1RBR19UT1VDSF9YOwotICAgICAgVi5vcmdzID0gQ1VSLnB0cy5vcmc7Ci0gICAgICBWLmN1cnMgPSBDVVIucHRzLmN1cjsKLSAgICAgIFYub3J1cyA9IENVUi5wdHMub3J1czsKKyAgICAgIFYub3JncyA9IGV4Yy0+cHRzLm9yZzsKKyAgICAgIFYuY3VycyA9IGV4Yy0+cHRzLmN1cjsKKyAgICAgIFYub3J1cyA9IGV4Yy0+cHRzLm9ydXM7CiAgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICBtYXNrICAgPSBGVF9DVVJWRV9UQUdfVE9VQ0hfWTsKLSAgICAgIFYub3JncyA9IChGVF9WZWN0b3IqKSggKEZUX1BvcyopQ1VSLnB0cy5vcmcgKyAxICk7Ci0gICAgICBWLmN1cnMgPSAoRlRfVmVjdG9yKikoIChGVF9Qb3MqKUNVUi5wdHMuY3VyICsgMSApOwotICAgICAgVi5vcnVzID0gKEZUX1ZlY3RvciopKCAoRlRfUG9zKilDVVIucHRzLm9ydXMgKyAxICk7CisgICAgICBWLm9yZ3MgPSAoRlRfVmVjdG9yKikoIChGVF9Qb3MqKWV4Yy0+cHRzLm9yZyArIDEgKTsKKyAgICAgIFYuY3VycyA9IChGVF9WZWN0b3IqKSggKEZUX1BvcyopZXhjLT5wdHMuY3VyICsgMSApOworICAgICAgVi5vcnVzID0gKEZUX1ZlY3RvciopKCAoRlRfUG9zKilleGMtPnB0cy5vcnVzICsgMSApOwogICAgIH0KLSAgICBWLm1heF9wb2ludHMgPSBDVVIucHRzLm5fcG9pbnRzOworICAgIFYubWF4X3BvaW50cyA9IGV4Yy0+cHRzLm5fcG9pbnRzOwogCiAgICAgY29udG91ciA9IDA7CiAgICAgcG9pbnQgICA9IDA7CiAKICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkcgICYmCi0gICAgICAgICBDVVIuaWdub3JlX3hfbW9kZSApCisgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICAgJiYKKyAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSApCiAgICAgewotICAgICAgQ1VSLml1cF9jYWxsZWQgPSBUUlVFOwotICAgICAgaWYgKCBDVVIuc3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX1NLSVBfSVVQICkKKyAgICAgIGV4Yy0+aXVwX2NhbGxlZCA9IFRSVUU7CisgICAgICBpZiAoIGV4Yy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX1NLSVBfSVVQICkKICAgICAgICAgcmV0dXJuOwogICAgIH0KICNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KIAogICAgIGRvCiAgICAgewotICAgICAgZW5kX3BvaW50ICAgPSBDVVIucHRzLmNvbnRvdXJzW2NvbnRvdXJdIC0gQ1VSLnB0cy5maXJzdF9wb2ludDsKKyAgICAgIGVuZF9wb2ludCAgID0gZXhjLT5wdHMuY29udG91cnNbY29udG91cl0gLSBleGMtPnB0cy5maXJzdF9wb2ludDsKICAgICAgIGZpcnN0X3BvaW50ID0gcG9pbnQ7CiAKLSAgICAgIGlmICggQk9VTkRTICggZW5kX3BvaW50LCBDVVIucHRzLm5fcG9pbnRzICkgKQotICAgICAgICBlbmRfcG9pbnQgPSBDVVIucHRzLm5fcG9pbnRzIC0gMTsKKyAgICAgIGlmICggQk9VTkRTKCBlbmRfcG9pbnQsIGV4Yy0+cHRzLm5fcG9pbnRzICkgKQorICAgICAgICBlbmRfcG9pbnQgPSBleGMtPnB0cy5uX3BvaW50cyAtIDE7CiAKLSAgICAgIHdoaWxlICggcG9pbnQgPD0gZW5kX3BvaW50ICYmICggQ1VSLnB0cy50YWdzW3BvaW50XSAmIG1hc2sgKSA9PSAwICkKKyAgICAgIHdoaWxlICggcG9pbnQgPD0gZW5kX3BvaW50ICYmICggZXhjLT5wdHMudGFnc1twb2ludF0gJiBtYXNrICkgPT0gMCApCiAgICAgICAgIHBvaW50Kys7CiAKICAgICAgIGlmICggcG9pbnQgPD0gZW5kX3BvaW50ICkKQEAgLTc0MTMsNyArNjk2Myw3IEBACiAKICAgICAgICAgd2hpbGUgKCBwb2ludCA8PSBlbmRfcG9pbnQgKQogICAgICAgICB7Ci0gICAgICAgICAgaWYgKCAoIENVUi5wdHMudGFnc1twb2ludF0gJiBtYXNrICkgIT0gMCApCisgICAgICAgICAgaWYgKCAoIGV4Yy0+cHRzLnRhZ3NbcG9pbnRdICYgbWFzayApICE9IDAgKQogICAgICAgICAgIHsKICAgICAgICAgICAgIF9pdXBfd29ya2VyX2ludGVycG9sYXRlKCAmViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfdG91Y2hlZCArIDEsCkBAIC03NDQ1LDcgKzY5OTUsNyBAQAogICAgICAgICB9CiAgICAgICB9CiAgICAgICBjb250b3VyKys7Ci0gICAgfSB3aGlsZSAoIGNvbnRvdXIgPCBDVVIucHRzLm5fY29udG91cnMgKTsKKyAgICB9IHdoaWxlICggY29udG91ciA8IGV4Yy0+cHRzLm5fY29udG91cnMgKTsKICAgfQogCiAKQEAgLTc0NTYsNyArNzAwNiw4IEBACiAgIC8qIFN0YWNrOiAgICAgICAgdWludDMyICgyICogdWludDMyKS4uLiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgc3RhdGljIHZvaWQKLSAgSW5zX0RFTFRBUCggSU5TX0FSRyApCisgIEluc19ERUxUQVAoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKICAgewogICAgIEZUX1VMb25nICAgbnVtcCwgazsKICAgICBGVF9VU2hvcnQgIEE7CkBAIC03NDY2LDUyICs3MDE3LDUyIEBACiAgICAgRlRfVVNob3J0ICBCMSwgQjI7CiAKIAotICAgIGlmICggU1VCUElYRUxfSElOVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgQ1VSLmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgQ1VSLml1cF9jYWxsZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgKCBDVVIuc3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX05PX0RFTFRBUF9BRlRFUl9JVVAgKSApCisgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgIGV4Yy0+aXVwX2NhbGxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAoIGV4Yy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX05PX0RFTFRBUF9BRlRFUl9JVVAgKSApCiAgICAgICBnb3RvIEZhaWw7CiAjZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCiAKIAogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HCiAgICAgLyogRGVsdGEgaGludGluZyBpcyBjb3ZlcmVkIGJ5IFVTIFBhdGVudCA1MTU5NjY4LiAqLwotICAgIGlmICggQ1VSLmZhY2UtPnVucGF0ZW50ZWRfaGludGluZyApCisgICAgaWYgKCBleGMtPmZhY2UtPnVucGF0ZW50ZWRfaGludGluZyApCiAgICAgewogICAgICAgRlRfTG9uZyAgbiA9IGFyZ3NbMF0gKiAyOwogCiAKLSAgICAgIGlmICggQ1VSLmFyZ3MgPCBuICkKKyAgICAgIGlmICggZXhjLT5hcmdzIDwgbiApCiAgICAgICB7Ci0gICAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICAgIENVUi5lcnJvciA9IEZUX1RIUk9XKCBUb29fRmV3X0FyZ3VtZW50cyApOwotICAgICAgICBuID0gQ1VSLmFyZ3M7CisgICAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIFRvb19GZXdfQXJndW1lbnRzICk7CisgICAgICAgIG4gPSBleGMtPmFyZ3M7CiAgICAgICB9CiAKLSAgICAgIENVUi5hcmdzIC09IG47Ci0gICAgICBDVVIubmV3X3RvcCA9IENVUi5hcmdzOworICAgICAgZXhjLT5hcmdzIC09IG47CisgICAgICBleGMtPm5ld190b3AgPSBleGMtPmFyZ3M7CiAgICAgICByZXR1cm47CiAgICAgfQogI2VuZGlmCiAKLSAgICBQID0gKEZUX1VMb25nKUNVUl9GdW5jX2N1cl9wcGVtKCk7CisgICAgUCAgICA9IChGVF9VTG9uZylleGMtPmZ1bmNfY3VyX3BwZW0oIGV4YyApOwogICAgIG51bXAgPSAoRlRfVUxvbmcpYXJnc1swXTsgICAvKiBzb21lIHBvaW50cyB0aGVvcmV0aWNhbGx5IG1heSBvY2N1ciBtb3JlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gb25jZSwgdGh1cyBVU2hvcnQgaXNuJ3QgZW5vdWdoICovCiAKICAgICBmb3IgKCBrID0gMTsgayA8PSBudW1wOyBrKysgKQogICAgIHsKLSAgICAgIGlmICggQ1VSLmFyZ3MgPCAyICkKKyAgICAgIGlmICggZXhjLT5hcmdzIDwgMiApCiAgICAgICB7Ci0gICAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICAgIENVUi5lcnJvciA9IEZUX1RIUk9XKCBUb29fRmV3X0FyZ3VtZW50cyApOwotICAgICAgICBDVVIuYXJncyA9IDA7CisgICAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIFRvb19GZXdfQXJndW1lbnRzICk7CisgICAgICAgIGV4Yy0+YXJncyA9IDA7CiAgICAgICAgIGdvdG8gRmFpbDsKICAgICAgIH0KIAotICAgICAgQ1VSLmFyZ3MgLT0gMjsKKyAgICAgIGV4Yy0+YXJncyAtPSAyOwogCi0gICAgICBBID0gKEZUX1VTaG9ydClDVVIuc3RhY2tbQ1VSLmFyZ3MgKyAxXTsKLSAgICAgIEIgPSBDVVIuc3RhY2tbQ1VSLmFyZ3NdOworICAgICAgQSA9IChGVF9VU2hvcnQpZXhjLT5zdGFja1tleGMtPmFyZ3MgKyAxXTsKKyAgICAgIEIgPSBleGMtPnN0YWNrW2V4Yy0+YXJnc107CiAKICAgICAgIC8qIFhYWDogQmVjYXVzZSBzb21lIHBvcHVsYXIgZm9udHMgY29udGFpbiBzb21lIGludmFsaWQgRGVsdGFQICovCiAgICAgICAvKiAgICAgIGluc3RydWN0aW9ucywgd2Ugc2ltcGx5IGlnbm9yZSB0aGVtIHdoZW4gdGhlIHN0YWNrZWQgICAqLwpAQCAtNzUxOSwxMSArNzA3MCwxMSBAQAogICAgICAgLyogICAgICBlcnJvci4gIEFzIGEgZGVsdGEgaW5zdHJ1Y3Rpb24gZG9lc24ndCBjaGFuZ2UgYSBnbHlwaCAgKi8KICAgICAgIC8qICAgICAgaW4gZ3JlYXQgd2F5cywgdGhpcyBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtLiAgICAgICAgICAgICovCiAKLSAgICAgIGlmICggIUJPVU5EUyggQSwgQ1VSLnpwMC5uX3BvaW50cyApICkKKyAgICAgIGlmICggIUJPVU5EUyggQSwgZXhjLT56cDAubl9wb2ludHMgKSApCiAgICAgICB7CiAgICAgICAgIEMgPSAoIChGVF9VTG9uZylCICYgMHhGMCApID4+IDQ7CiAKLSAgICAgICAgc3dpdGNoICggQ1VSLm9wY29kZSApCisgICAgICAgIHN3aXRjaCAoIGV4Yy0+b3Bjb2RlICkKICAgICAgICAgewogICAgICAgICBjYXNlIDB4NUQ6CiAgICAgICAgICAgYnJlYWs7CkBAIC03NTM3LDE0ICs3MDg4LDE0IEBACiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBDICs9IENVUi5HUy5kZWx0YV9iYXNlOworICAgICAgICBDICs9IGV4Yy0+R1MuZGVsdGFfYmFzZTsKIAogICAgICAgICBpZiAoIFAgPT0gQyApCiAgICAgICAgIHsKICAgICAgICAgICBCID0gKCAoRlRfVUxvbmcpQiAmIDB4RiApIC0gODsKICAgICAgICAgICBpZiAoIEIgPj0gMCApCiAgICAgICAgICAgICBCKys7Ci0gICAgICAgICAgQiAqPSAxTCA8PCAoIDYgLSBDVVIuR1MuZGVsdGFfc2hpZnQgKTsKKyAgICAgICAgICBCICo9IDFMIDw8ICggNiAtIGV4Yy0+R1MuZGVsdGFfc2hpZnQgKTsKIAogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwogCkBAIC03NTU4LDY1ICs3MTA5LDY1IEBACiAgICAgICAgICAgICAgKiAgLSBnbHlwaCBpcyBjb21wb3NpdGUgYW5kIGZyZWVkb20gdmVjdG9yIGlzIG5vdCBpbiBzdWJwaXhlbAogICAgICAgICAgICAgICogICAgZGlyZWN0aW9uLgogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoICFDVVIuaWdub3JlX3hfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgKCBDVVIuc3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX0FMV0FZU19ET19ERUxUQVAgKSB8fAotICAgICAgICAgICAgICAgICAoIENVUi5pc19jb21wb3NpdGUgJiYgQ1VSLkdTLmZyZWVWZWN0b3IueSAhPSAwICkgICAgICkKLSAgICAgICAgICAgICAgQ1VSX0Z1bmNfbW92ZSggJkNVUi56cDAsIEEsIEIgKTsKKyAgICAgICAgICAgIGlmICggIWV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICAgICAgKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19BTFdBWVNfRE9fREVMVEFQICkgfHwKKyAgICAgICAgICAgICAgICAgKCBleGMtPmlzX2NvbXBvc2l0ZSAmJiBleGMtPkdTLmZyZWVWZWN0b3IueSAhPSAwICkgICAgKQorICAgICAgICAgICAgICBleGMtPmZ1bmNfbW92ZSggZXhjLCAmZXhjLT56cDAsIEEsIEIgKTsKIAogICAgICAgICAgICAgLyogT3RoZXJ3aXNlLCBhcHBseSBzdWJwaXhlbCBoaW50aW5nIGFuZCBjb21wYXRpYmlsaXR5IG1vZGUgKi8KICAgICAgICAgICAgIC8qIHJ1bGVzLCBhbHdheXMgc2tpcHBpbmcgZGVsdGFzIGluIHN1YnBpeGVsIGRpcmVjdGlvbi4gICAgICovCi0gICAgICAgICAgICBlbHNlIGlmICggQ1VSLmlnbm9yZV94X21vZGUgJiYgQ1VSLkdTLmZyZWVWZWN0b3IueSAhPSAwICkKKyAgICAgICAgICAgIGVsc2UgaWYgKCBleGMtPmlnbm9yZV94X21vZGUgJiYgZXhjLT5HUy5mcmVlVmVjdG9yLnkgIT0gMCApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgIC8qIHNhdmUgdGhlIHkgdmFsdWUgb2YgdGhlIHBvaW50IG5vdzsgY29tcGFyZSBhZnRlciBtb3ZlICovCi0gICAgICAgICAgICAgIEIxID0gKEZUX1VTaG9ydClDVVIuenAwLmN1cltBXS55OworICAgICAgICAgICAgICBCMSA9IChGVF9VU2hvcnQpZXhjLT56cDAuY3VyW0FdLnk7CiAKICAgICAgICAgICAgICAgLyogU3RhbmRhcmQgc3VicGl4ZWwgaGludGluZzogQWxsb3cgeSBtb3ZlIGZvciB5LXRvdWNoZWQgKi8KICAgICAgICAgICAgICAgLyogcG9pbnRzLiAgVGhpcyBtZXNzZXMgdXAgRGVqYVZ1IC4uLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgaWYgKCAhQ1VSLmZhY2UtPnNwaF9jb21wYXRpYmlsaXR5X21vZGUgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAoIENVUi56cDAudGFnc1tBXSAmIEZUX0NVUlZFX1RBR19UT1VDSF9ZICkgKQotICAgICAgICAgICAgICAgIENVUl9GdW5jX21vdmUoICZDVVIuenAwLCBBLCBCICk7CisgICAgICAgICAgICAgIGlmICggIWV4Yy0+ZmFjZS0+c3BoX2NvbXBhdGliaWxpdHlfbW9kZSAgICAgICAgICAmJgorICAgICAgICAgICAgICAgICAgICggZXhjLT56cDAudGFnc1tBXSAmIEZUX0NVUlZFX1RBR19UT1VDSF9ZICkgKQorICAgICAgICAgICAgICAgIGV4Yy0+ZnVuY19tb3ZlKCBleGMsICZleGMtPnpwMCwgQSwgQiApOwogCiAgICAgICAgICAgICAgIC8qIGNvbXBhdGliaWxpdHkgbW9kZSAqLwotICAgICAgICAgICAgICBlbHNlIGlmICggQ1VSLmZhY2UtPnNwaF9jb21wYXRpYmlsaXR5X21vZGUgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICEoIENVUi5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfQUxXQVlTX1NLSVBfREVMVEFQICkgKQorICAgICAgICAgICAgICBlbHNlIGlmICggZXhjLT5mYWNlLT5zcGhfY29tcGF0aWJpbGl0eV9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICEoIGV4Yy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX0FMV0FZU19TS0lQX0RFTFRBUCApICkKICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICggQ1VSLnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19ST1VORF9OT05QSVhFTF9ZX01PVkVTICkKKyAgICAgICAgICAgICAgICBpZiAoIGV4Yy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX1JPVU5EX05PTlBJWEVMX1lfTU9WRVMgKQogICAgICAgICAgICAgICAgICAgQiA9IEZUX1BJWF9ST1VORCggQjEgKyBCICkgLSBCMTsKIAogICAgICAgICAgICAgICAgIC8qIEFsbG93IGRlbHRhIG1vdmUgaWYgdXNpbmcgc3BoX2NvbXBhdGliaWxpdHlfbW9kZSwgICAqLwogICAgICAgICAgICAgICAgIC8qIElVUCBoYXMgbm90IGJlZW4gY2FsbGVkLCBhbmQgcG9pbnQgaXMgdG91Y2hlZCBvbiBZLiAqLwotICAgICAgICAgICAgICAgIGlmICggIUNVUi5pdXBfY2FsbGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAoIENVUi56cDAudGFnc1tBXSAmIEZUX0NVUlZFX1RBR19UT1VDSF9ZICkgKQotICAgICAgICAgICAgICAgICAgQ1VSX0Z1bmNfbW92ZSggJkNVUi56cDAsIEEsIEIgKTsKKyAgICAgICAgICAgICAgICBpZiAoICFleGMtPml1cF9jYWxsZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgICAgICAgICAgICggZXhjLT56cDAudGFnc1tBXSAmIEZUX0NVUlZFX1RBR19UT1VDSF9ZICkgKQorICAgICAgICAgICAgICAgICAgZXhjLT5mdW5jX21vdmUoIGV4YywgJmV4Yy0+enAwLCBBLCBCICk7CiAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICBCMiA9IChGVF9VU2hvcnQpQ1VSLnpwMC5jdXJbQV0ueTsKKyAgICAgICAgICAgICAgQjIgPSAoRlRfVVNob3J0KWV4Yy0+enAwLmN1cltBXS55OwogCiAgICAgICAgICAgICAgIC8qIFJldmVyc2UgdGhpcyBtb3ZlIGlmIGl0IHJlc3VsdHMgaW4gYSBkaXNhbGxvd2VkIG1vdmUgKi8KLSAgICAgICAgICAgICAgaWYgKCBDVVIuR1MuZnJlZVZlY3Rvci55ICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgICggKCBDVVIuZmFjZS0+c3BoX2NvbXBhdGliaWxpdHlfbW9kZSAgICAgICAgICAgJiYKKyAgICAgICAgICAgICAgaWYgKCBleGMtPkdTLmZyZWVWZWN0b3IueSAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgICAgICAgICggKCBleGMtPmZhY2UtPnNwaF9jb21wYXRpYmlsaXR5X21vZGUgICAgICAgICAgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKCBCMSAmIDYzICkgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAgICAgICAgICggQjIgJiA2MyApICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAoICggQ1VSLnNwaF90d2Vha19mbGFncyAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgKCAoIGV4Yy0+c3BoX3R3ZWFrX2ZsYWdzICAgICAgICAgICAgICAgICAgICYKICAgICAgICAgICAgICAgICAgICAgICAgICBTUEhfVFdFQUtfU0tJUF9OT05QSVhFTF9ZX01PVkVTX0RFTFRBUCApICYmCiAgICAgICAgICAgICAgICAgICAgICAgICggQjEgJiA2MyApICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgogICAgICAgICAgICAgICAgICAgICAgICAoIEIyICYgNjMgKSAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgKSApICkKLSAgICAgICAgICAgICAgICBDVVJfRnVuY19tb3ZlKCAmQ1VSLnpwMCwgQSwgLUIgKTsKKyAgICAgICAgICAgICAgICBleGMtPmZ1bmNfbW92ZSggZXhjLCAmZXhjLT56cDAsIEEsIC1CICk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICAgIGVsc2UKICNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KIAotICAgICAgICAgICAgQ1VSX0Z1bmNfbW92ZSggJkNVUi56cDAsIEEsIEIgKTsKKyAgICAgICAgICAgIGV4Yy0+ZnVuY19tb3ZlKCBleGMsICZleGMtPnpwMCwgQSwgQiApOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBlbHNlCi0gICAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICAgIENVUi5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOworICAgICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCisgICAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwogICAgIH0KIAogICBGYWlsOgotICAgIENVUi5uZXdfdG9wID0gQ1VSLmFyZ3M7CisgICAgZXhjLT5uZXdfdG9wID0gZXhjLT5hcmdzOwogICB9CiAKIApAQCAtNzYyNyw3ICs3MTc4LDggQEAKICAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgKDIgKiB1aW50MzIpLi4uIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBzdGF0aWMgdm9pZAotICBJbnNfREVMVEFDKCBJTlNfQVJHICkKKyAgSW5zX0RFTFRBQyggVFRfRXhlY0NvbnRleHQgIGV4YywKKyAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQogICB7CiAgICAgRlRfVUxvbmcgIG51bXAsIGs7CiAgICAgRlRfVUxvbmcgIEEsIEMsIFA7CkBAIC03NjM2LDQ3ICs3MTg4LDQ3IEBACiAKICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1VOUEFURU5URURfSElOVElORwogICAgIC8qIERlbHRhIGhpbnRpbmcgaXMgY292ZXJlZCBieSBVUyBQYXRlbnQgNTE1OTY2OC4gKi8KLSAgICBpZiAoIENVUi5mYWNlLT51bnBhdGVudGVkX2hpbnRpbmcgKQorICAgIGlmICggZXhjLT5mYWNlLT51bnBhdGVudGVkX2hpbnRpbmcgKQogICAgIHsKICAgICAgIEZUX0xvbmcgIG4gPSBhcmdzWzBdICogMjsKIAogCi0gICAgICBpZiAoIENVUi5hcmdzIDwgbiApCisgICAgICBpZiAoIGV4Yy0+YXJncyA8IG4gKQogICAgICAgewotICAgICAgICBpZiAoIENVUi5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggVG9vX0Zld19Bcmd1bWVudHMgKTsKLSAgICAgICAgbiA9IENVUi5hcmdzOworICAgICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCisgICAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBUb29fRmV3X0FyZ3VtZW50cyApOworICAgICAgICBuID0gZXhjLT5hcmdzOwogICAgICAgfQogCi0gICAgICBDVVIuYXJncyAtPSBuOwotICAgICAgQ1VSLm5ld190b3AgPSBDVVIuYXJnczsKKyAgICAgIGV4Yy0+YXJncyAtPSBuOworICAgICAgZXhjLT5uZXdfdG9wID0gZXhjLT5hcmdzOwogICAgICAgcmV0dXJuOwogICAgIH0KICNlbmRpZgogCi0gICAgUCA9IChGVF9VTG9uZylDVVJfRnVuY19jdXJfcHBlbSgpOworICAgIFAgICAgPSAoRlRfVUxvbmcpZXhjLT5mdW5jX2N1cl9wcGVtKCBleGMgKTsKICAgICBudW1wID0gKEZUX1VMb25nKWFyZ3NbMF07CiAKICAgICBmb3IgKCBrID0gMTsgayA8PSBudW1wOyBrKysgKQogICAgIHsKLSAgICAgIGlmICggQ1VSLmFyZ3MgPCAyICkKKyAgICAgIGlmICggZXhjLT5hcmdzIDwgMiApCiAgICAgICB7Ci0gICAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICAgIENVUi5lcnJvciA9IEZUX1RIUk9XKCBUb29fRmV3X0FyZ3VtZW50cyApOwotICAgICAgICBDVVIuYXJncyA9IDA7CisgICAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKKyAgICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIFRvb19GZXdfQXJndW1lbnRzICk7CisgICAgICAgIGV4Yy0+YXJncyA9IDA7CiAgICAgICAgIGdvdG8gRmFpbDsKICAgICAgIH0KIAotICAgICAgQ1VSLmFyZ3MgLT0gMjsKKyAgICAgIGV4Yy0+YXJncyAtPSAyOwogCi0gICAgICBBID0gKEZUX1VMb25nKUNVUi5zdGFja1tDVVIuYXJncyArIDFdOwotICAgICAgQiA9IENVUi5zdGFja1tDVVIuYXJnc107CisgICAgICBBID0gKEZUX1VMb25nKWV4Yy0+c3RhY2tbZXhjLT5hcmdzICsgMV07CisgICAgICBCID0gZXhjLT5zdGFja1tleGMtPmFyZ3NdOwogCi0gICAgICBpZiAoIEJPVU5EU0woIEEsIENVUi5jdnRTaXplICkgKQorICAgICAgaWYgKCBCT1VORFNMKCBBLCBleGMtPmN2dFNpemUgKSApCiAgICAgICB7Ci0gICAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCiAgICAgICAgIHsKLSAgICAgICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKKyAgICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CiAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICB9CkBAIC03Njg0LDcgKzcyMzYsNyBAQAogICAgICAgewogICAgICAgICBDID0gKCAoRlRfVUxvbmcpQiAmIDB4RjAgKSA+PiA0OwogCi0gICAgICAgIHN3aXRjaCAoIENVUi5vcGNvZGUgKQorICAgICAgICBzd2l0Y2ggKCBleGMtPm9wY29kZSApCiAgICAgICAgIHsKICAgICAgICAgY2FzZSAweDczOgogICAgICAgICAgIGJyZWFrOwpAQCAtNzY5OCwyMiArNzI1MCwyMiBAQAogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgQyArPSBDVVIuR1MuZGVsdGFfYmFzZTsKKyAgICAgICAgQyArPSBleGMtPkdTLmRlbHRhX2Jhc2U7CiAKICAgICAgICAgaWYgKCBQID09IEMgKQogICAgICAgICB7CiAgICAgICAgICAgQiA9ICggKEZUX1VMb25nKUIgJiAweEYgKSAtIDg7CiAgICAgICAgICAgaWYgKCBCID49IDAgKQogICAgICAgICAgICAgQisrOwotICAgICAgICAgIEIgKj0gMUwgPDwgKCA2IC0gQ1VSLkdTLmRlbHRhX3NoaWZ0ICk7CisgICAgICAgICAgQiAqPSAxTCA8PCAoIDYgLSBleGMtPkdTLmRlbHRhX3NoaWZ0ICk7CiAKLSAgICAgICAgICBDVVJfRnVuY19tb3ZlX2N2dCggQSwgQiApOworICAgICAgICAgIGV4Yy0+ZnVuY19tb3ZlX2N2dCggZXhjLCBBLCBCICk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAKICAgRmFpbDoKLSAgICBDVVIubmV3X3RvcCA9IENVUi5hcmdzOworICAgIGV4Yy0+bmV3X3RvcCA9IGV4Yy0+YXJnczsKICAgfQogCiAKQEAgLTc3MzAsOCArNzI4MiwxNyBAQAogICAvKiBPcGNvZGUgcmFuZ2U6IDB4ODggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+IHVpbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBYWFg6IFVORE9DVU1FTlRFRDogU2VsZWN0b3IgYml0cyBoaWdoZXIgdGhhbiA5IGFyZSBjdXJyZW50bHkgKE1heSAgICAgKi8KKyAgLyogICAgICAyMDE1KSBub3QgZG9jdW1lbnRlZCBpbiB0aGUgT3BlblR5cGUgc3BlY2lmaWNhdGlvbi4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgIFNlbGVjdG9yIGJpdCAxMSBpcyBpbmNvcnJlY3RseSBkZXNjcmliZWQgYXMgYml0IDgsIHdoaWxlIHRoZSAgICAgKi8KKyAgLyogICAgICByZWFsIG1lYW5pbmcgb2YgYml0IDggKHZlcnRpY2FsIExDRCBzdWJwaXhlbHMpIHN0YXlzICAgICAgICAgICAgICovCisgIC8qICAgICAgdW5kb2N1bWVudGVkLiAgVGhlIHNhbWUgbWlzdGFrZSBjYW4gYmUgZm91bmQgaW4gR3JlZyBIaXRjaGNvY2sncyAqLworICAvKiAgICAgIHdoaXRlcGFwZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHN0YXRpYyB2b2lkCi0gIEluc19HRVRJTkZPKCBJTlNfQVJHICkKKyAgSW5zX0dFVElORk8oIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCiAgIHsKICAgICBGVF9Mb25nICBLOwogCkBAIC03NzQ0LDEzICs3MzA1LDIwIEBACiAgICAgLyogU2VsZWN0b3IgQml0OiAgMCAgICAgICAgICAgICAqLwogICAgIC8qIFJldHVybiBCaXQocyk6IDAtNyAgICAgICAgICAgKi8KICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICAgICAmJgotICAgICAgICAgKCBhcmdzWzBdICYgMSApICE9IDAgJiYKLSAgICAgICAgIENVUi5pZ25vcmVfeF9tb2RlICAgICkKKyAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkcgICAgICAmJgorICAgICAgICAgKCBhcmdzWzBdICYgMSApICE9IDAgICYmCisgICAgICAgICBleGMtPnN1YnBpeGVsX2hpbnRpbmcgKQogICAgIHsKLSAgICAgIEsgPSBDVVIucmFzdGVyaXplcl92ZXJzaW9uOwotICAgICAgRlRfVFJBQ0U3KCggIlNldHRpbmcgcmFzdGVyaXplciB2ZXJzaW9uICVkXG4iLAotICAgICAgICAgICAgICAgICAgQ1VSLnJhc3Rlcml6ZXJfdmVyc2lvbiApKTsKKyAgICAgIGlmICggZXhjLT5pZ25vcmVfeF9tb2RlICkKKyAgICAgIHsKKyAgICAgICAgLyogaWYgaW4gQ2xlYXJUeXBlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG1vZGUsICAgICAgICAqLworICAgICAgICAvKiB3ZSBzb21ldGltZXMgY2hhbmdlIHRoZSBUcnVlVHlwZSB2ZXJzaW9uIGR5bmFtaWNhbGx5ICovCisgICAgICAgIEsgPSBleGMtPnJhc3Rlcml6ZXJfdmVyc2lvbjsKKyAgICAgICAgRlRfVFJBQ0U2KCggIlNldHRpbmcgcmFzdGVyaXplciB2ZXJzaW9uICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBleGMtPnJhc3Rlcml6ZXJfdmVyc2lvbiApKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgSyA9IFRUX0lOVEVSUFJFVEVSX1ZFUlNJT05fMzg7CiAgICAgfQogICAgIGVsc2UKICNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KQEAgLTc3NjIsNyArNzMzMCw3IEBACiAgICAgLyogU2VsZWN0b3IgQml0OiAgMSAgICAgICAgICAgICAqLwogICAgIC8qIFJldHVybiBCaXQocyk6IDggICAgICAgICAgICAgKi8KICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCAoIGFyZ3NbMF0gJiAyICkgIT0gMCAmJiBDVVIudHRfbWV0cmljcy5yb3RhdGVkICkKKyAgICBpZiAoICggYXJnc1swXSAmIDIgKSAhPSAwICYmIGV4Yy0+dHRfbWV0cmljcy5yb3RhdGVkICkKICAgICAgIEsgfD0gMHg4MDsKIAogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTc3NzAsNyArNzMzOCw3IEBACiAgICAgLyogU2VsZWN0b3IgQml0OiAgMiAgICAgICAgICAgICAqLwogICAgIC8qIFJldHVybiBCaXQocyk6IDkgICAgICAgICAgICAgKi8KICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCAoIGFyZ3NbMF0gJiA0ICkgIT0gMCAmJiBDVVIudHRfbWV0cmljcy5zdHJldGNoZWQgKQorICAgIGlmICggKCBhcmdzWzBdICYgNCApICE9IDAgJiYgZXhjLT50dF9tZXRyaWNzLnN0cmV0Y2hlZCApCiAgICAgICBLIHw9IDEgPDwgODsKIAogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTc3NzgsMjQgKzczNDYsMjMgQEAKICAgICAvKiBTZWxlY3RvciBCaXQ6ICA1ICAgICAgICAgICAgICovCiAgICAgLyogUmV0dXJuIEJpdChzKTogMTIgICAgICAgICAgICAqLwogICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoICggYXJnc1swXSAmIDMyICkgIT0gMCAmJiBDVVIuZ3JheXNjYWxlICkKKyAgICBpZiAoICggYXJnc1swXSAmIDMyICkgIT0gMCAmJiBleGMtPmdyYXlzY2FsZSApCiAgICAgICBLIHw9IDEgPDwgMTI7CiAKICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKIAotICAgIGlmICggU1VCUElYRUxfSElOVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBDVVIuaWdub3JlX3hfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIENVUi5yYXN0ZXJpemVyX3ZlcnNpb24gPj0gVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zNSApCisgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICBleGMtPnJhc3Rlcml6ZXJfdmVyc2lvbiA+PSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzM1ICkKICAgICB7CiAKLSAgICAgIGlmICggQ1VSLnJhc3Rlcml6ZXJfdmVyc2lvbiA+PSAzNyApCisgICAgICBpZiAoIGV4Yy0+cmFzdGVyaXplcl92ZXJzaW9uID49IDM3ICkKICAgICAgIHsKICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgICAgICAvKiBISU5USU5HIEZPUiBTVUJQSVhFTCAgICAgICAgICovCiAgICAgICAgIC8qIFNlbGVjdG9yIEJpdDogIDYgICAgICAgICAgICAgKi8KICAgICAgICAgLyogUmV0dXJuIEJpdChzKTogMTMgICAgICAgICAgICAqLwogICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggKCBhcmdzWzBdICYgNjQgKSAhPSAwICYmIENVUi5zdWJwaXhlbCApCisgICAgICAgIGlmICggKCBhcmdzWzBdICYgNjQgKSAhPSAwICYmIGV4Yy0+c3VicGl4ZWxfaGludGluZyApCiAgICAgICAgICAgSyB8PSAxIDw8IDEzOwogCiAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTc4MDQsMTYgKzczNzEsMTYgQEAKICAgICAgICAgLyogUmV0dXJuIEJpdChzKTogMTQgICAgICAgICAgICAqLwogICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgIC8qIEZ1bmN0aW9uYWxpdHkgc3RpbGwgbmVlZHMgdG8gYmUgYWRkZWQgKi8KLSAgICAgICAgaWYgKCAoIGFyZ3NbMF0gJiAxMjggKSAhPSAwICYmIENVUi5jb21wYXRpYmxlX3dpZHRocyApCisgICAgICAgIGlmICggKCBhcmdzWzBdICYgMTI4ICkgIT0gMCAmJiBleGMtPmNvbXBhdGlibGVfd2lkdGhzICkKICAgICAgICAgICBLIHw9IDEgPDwgMTQ7CiAKICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiBTWU1NRVRSSUNBTCBTTU9PVEhJTkcgICAgICAgICovCisgICAgICAgIC8qIFZFUlRJQ0FMIExDRCBTVUJQSVhFTFM/ICAgICAgKi8KICAgICAgICAgLyogU2VsZWN0b3IgQml0OiAgOCAgICAgICAgICAgICAqLwogICAgICAgICAvKiBSZXR1cm4gQml0KHMpOiAxNSAgICAgICAgICAgICovCiAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgLyogRnVuY3Rpb25hbGl0eSBzdGlsbCBuZWVkcyB0byBiZSBhZGRlZCAqLwotICAgICAgICBpZiAoICggYXJnc1swXSAmIDI1NiApICE9IDAgJiYgQ1VSLnN5bW1ldHJpY2FsX3Ntb290aGluZyApCisgICAgICAgIGlmICggKCBhcmdzWzBdICYgMjU2ICkgIT0gMCAmJiBleGMtPnZlcnRpY2FsX2xjZCApCiAgICAgICAgICAgSyB8PSAxIDw8IDE1OwogCiAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTc4MjIsMTAgKzczODksMTAgQEAKICAgICAgICAgLyogUmV0dXJuIEJpdChzKTogMTYgICAgICAgICAgICAqLwogICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgIC8qIEZ1bmN0aW9uYWxpdHkgc3RpbGwgbmVlZHMgdG8gYmUgYWRkZWQgKi8KLSAgICAgICAgaWYgKCAoIGFyZ3NbMF0gJiA1MTIgKSAhPSAwICYmIENVUi5iZ3IgKQorICAgICAgICBpZiAoICggYXJnc1swXSAmIDUxMiApICE9IDAgJiYgZXhjLT5iZ3IgKQogICAgICAgICAgIEsgfD0gMSA8PCAxNjsKIAotICAgICAgICBpZiAoIENVUi5yYXN0ZXJpemVyX3ZlcnNpb24gPj0gMzggKQorICAgICAgICBpZiAoIGV4Yy0+cmFzdGVyaXplcl92ZXJzaW9uID49IDM4ICkKICAgICAgICAgewogICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgICAgICAvKiBTVUJQSVhFTCBQT1NJVElPTkVEPyAgICAgICAgICovCkBAIC03ODMzLDggKzc0MDAsMjYgQEAKICAgICAgICAgICAvKiBSZXR1cm4gQml0KHMpOiAxNyAgICAgICAgICAgICovCiAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgIC8qIEZ1bmN0aW9uYWxpdHkgc3RpbGwgbmVlZHMgdG8gYmUgYWRkZWQgKi8KLSAgICAgICAgICBpZiAoICggYXJnc1swXSAmIDEwMjQgKSAhPSAwICYmIENVUi5zdWJwaXhlbF9wb3NpdGlvbmVkICkKKyAgICAgICAgICBpZiAoICggYXJnc1swXSAmIDEwMjQgKSAhPSAwICYmIGV4Yy0+c3VicGl4ZWxfcG9zaXRpb25lZCApCiAgICAgICAgICAgICBLIHw9IDEgPDwgMTc7CisKKyAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgLyogU1lNTUVUUklDQUwgU01PT1RISU5HICAgICAgICAqLworICAgICAgICAgIC8qIFNlbGVjdG9yIEJpdDogIDExICAgICAgICAgICAgKi8KKyAgICAgICAgICAvKiBSZXR1cm4gQml0KHMpOiAxOCAgICAgICAgICAgICovCisgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgIC8qIEZ1bmN0aW9uYWxpdHkgc3RpbGwgbmVlZHMgdG8gYmUgYWRkZWQgKi8KKyAgICAgICAgICBpZiAoICggYXJnc1swXSAmIDIwNDggKSAhPSAwICYmIGV4Yy0+c3ltbWV0cmljYWxfc21vb3RoaW5nICkKKyAgICAgICAgICAgIEsgfD0gMSA8PCAxODsKKworICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAvKiBHUkFZIENMRUFSVFlQRSAgICAgICAgICAgICAgICovCisgICAgICAgICAgLyogU2VsZWN0b3IgQml0OiAgMTIgICAgICAgICAgICAqLworICAgICAgICAgIC8qIFJldHVybiBCaXQocyk6IDE5ICAgICAgICAgICAgKi8KKyAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgLyogRnVuY3Rpb25hbGl0eSBzdGlsbCBuZWVkcyB0byBiZSBhZGRlZCAqLworICAgICAgICAgIGlmICggKCBhcmdzWzBdICYgNDA5NiApICE9IDAgJiYgZXhjLT5ncmF5X2NsZWFydHlwZSApCisgICAgICAgICAgICBLIHw9IDEgPDwgMTk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC03ODQ2LDMzMSArNzQzMSw0MyBAQAogCiAKICAgc3RhdGljIHZvaWQKLSAgSW5zX1VOS05PV04oIElOU19BUkcgKQorICBJbnNfVU5LTk9XTiggVFRfRXhlY0NvbnRleHQgIGV4YyApCiAgIHsKLSAgICBUVF9EZWZSZWNvcmQqICBkZWYgICA9IENVUi5JRGVmczsKLSAgICBUVF9EZWZSZWNvcmQqICBsaW1pdCA9IGRlZiArIENVUi5udW1JRGVmczsKLQotICAgIEZUX1VOVVNFRF9BUkc7CisgICAgVFRfRGVmUmVjb3JkKiAgZGVmICAgPSBleGMtPklEZWZzOworICAgIFRUX0RlZlJlY29yZCogIGxpbWl0ID0gZGVmICsgZXhjLT5udW1JRGVmczsKIAogCiAgICAgZm9yICggOyBkZWYgPCBsaW1pdDsgZGVmKysgKQogICAgIHsKLSAgICAgIGlmICggKEZUX0J5dGUpZGVmLT5vcGMgPT0gQ1VSLm9wY29kZSAmJiBkZWYtPmFjdGl2ZSApCisgICAgICBpZiAoIChGVF9CeXRlKWRlZi0+b3BjID09IGV4Yy0+b3Bjb2RlICYmIGRlZi0+YWN0aXZlICkKICAgICAgIHsKICAgICAgICAgVFRfQ2FsbFJlYyogIGNhbGw7CiAKIAotICAgICAgICBpZiAoIENVUi5jYWxsVG9wID49IENVUi5jYWxsU2l6ZSApCisgICAgICAgIGlmICggZXhjLT5jYWxsVG9wID49IGV4Yy0+Y2FsbFNpemUgKQogICAgICAgICB7Ci0gICAgICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIFN0YWNrX092ZXJmbG93ICk7CisgICAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBTdGFja19PdmVyZmxvdyApOwogICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGNhbGwgPSBDVVIuY2FsbFN0YWNrICsgQ1VSLmNhbGxUb3ArKzsKKyAgICAgICAgY2FsbCA9IGV4Yy0+Y2FsbFN0YWNrICsgZXhjLT5jYWxsVG9wKys7CiAKLSAgICAgICAgY2FsbC0+Q2FsbGVyX1JhbmdlID0gQ1VSLmN1clJhbmdlOwotICAgICAgICBjYWxsLT5DYWxsZXJfSVAgICAgPSBDVVIuSVAgKyAxOworICAgICAgICBjYWxsLT5DYWxsZXJfUmFuZ2UgPSBleGMtPmN1clJhbmdlOworICAgICAgICBjYWxsLT5DYWxsZXJfSVAgICAgPSBleGMtPklQICsgMTsKICAgICAgICAgY2FsbC0+Q3VyX0NvdW50ICAgID0gMTsKICAgICAgICAgY2FsbC0+RGVmICAgICAgICAgID0gZGVmOwogCi0gICAgICAgIElOU19Hb3RvX0NvZGVSYW5nZSggZGVmLT5yYW5nZSwgZGVmLT5zdGFydCApOworICAgICAgICBJbnNfR290b19Db2RlUmFuZ2UoIGV4YywgZGVmLT5yYW5nZSwgZGVmLT5zdGFydCApOwogCi0gICAgICAgIENVUi5zdGVwX2lucyA9IEZBTFNFOworICAgICAgICBleGMtPnN0ZXBfaW5zID0gRkFMU0U7CiAgICAgICAgIHJldHVybjsKICAgICAgIH0KICAgICB9CiAKLSAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9PcGNvZGUgKTsKKyAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfT3Bjb2RlICk7CiAgIH0KIAogCi0jaWZuZGVmIFRUX0NPTkZJR19PUFRJT05fSU5URVJQUkVURVJfU1dJVENICi0KLQotICBzdGF0aWMKLSAgVEluc3RydWN0aW9uX0Z1bmN0aW9uICBJbnN0cnVjdF9EaXNwYXRjaFsyNTZdID0KLSAgewotICAgIC8qIE9wY29kZXMgYXJlIGdhdGhlcmVkIGluIGdyb3VwcyBvZiAxNi4gKi8KLSAgICAvKiBQbGVhc2Uga2VlcCB0aGUgc3BhY2VzIGFzIHRoZXkgYXJlLiAgICovCi0KLSAgICAvKiAgU1ZUQ0EgIHkgICovICBJbnNfU1ZUQ0EsCi0gICAgLyogIFNWVENBICB4ICAqLyAgSW5zX1NWVENBLAotICAgIC8qICBTUHZUQ0EgeSAgKi8gIEluc19TUFZUQ0EsCi0gICAgLyogIFNQdlRDQSB4ICAqLyAgSW5zX1NQVlRDQSwKLSAgICAvKiAgU0Z2VENBIHkgICovICBJbnNfU0ZWVENBLAotICAgIC8qICBTRnZUQ0EgeCAgKi8gIEluc19TRlZUQ0EsCi0gICAgLyogIFNQdlRMIC8vICAqLyAgSW5zX1NQVlRMLAotICAgIC8qICBTUHZUTCArICAgKi8gIEluc19TUFZUTCwKLSAgICAvKiAgU0Z2VEwgLy8gICovICBJbnNfU0ZWVEwsCi0gICAgLyogIFNGdlRMICsgICAqLyAgSW5zX1NGVlRMLAotICAgIC8qICBTUHZGUyAgICAgKi8gIEluc19TUFZGUywKLSAgICAvKiAgU0Z2RlMgICAgICovICBJbnNfU0ZWRlMsCi0gICAgLyogIEdQViAgICAgICAqLyAgSW5zX0dQViwKLSAgICAvKiAgR0ZWICAgICAgICovICBJbnNfR0ZWLAotICAgIC8qICBTRnZUUHYgICAgKi8gIEluc19TRlZUUFYsCi0gICAgLyogIElTRUNUICAgICAqLyAgSW5zX0lTRUNULAotCi0gICAgLyogIFNSUDAgICAgICAqLyAgSW5zX1NSUDAsCi0gICAgLyogIFNSUDEgICAgICAqLyAgSW5zX1NSUDEsCi0gICAgLyogIFNSUDIgICAgICAqLyAgSW5zX1NSUDIsCi0gICAgLyogIFNaUDAgICAgICAqLyAgSW5zX1NaUDAsCi0gICAgLyogIFNaUDEgICAgICAqLyAgSW5zX1NaUDEsCi0gICAgLyogIFNaUDIgICAgICAqLyAgSW5zX1NaUDIsCi0gICAgLyogIFNaUFMgICAgICAqLyAgSW5zX1NaUFMsCi0gICAgLyogIFNMT09QICAgICAqLyAgSW5zX1NMT09QLAotICAgIC8qICBSVEcgICAgICAgKi8gIEluc19SVEcsCi0gICAgLyogIFJUSEcgICAgICAqLyAgSW5zX1JUSEcsCi0gICAgLyogIFNNRCAgICAgICAqLyAgSW5zX1NNRCwKLSAgICAvKiAgRUxTRSAgICAgICovICBJbnNfRUxTRSwKLSAgICAvKiAgSk1QUiAgICAgICovICBJbnNfSk1QUiwKLSAgICAvKiAgU0N2VENpICAgICovICBJbnNfU0NWVENJLAotICAgIC8qICBTU3dDaSAgICAgKi8gIEluc19TU1dDSSwKLSAgICAvKiAgU1NXICAgICAgICovICBJbnNfU1NXLAotCi0gICAgLyogIERVUCAgICAgICAqLyAgSW5zX0RVUCwKLSAgICAvKiAgUE9QICAgICAgICovICBJbnNfUE9QLAotICAgIC8qICBDTEVBUiAgICAgKi8gIEluc19DTEVBUiwKLSAgICAvKiAgU1dBUCAgICAgICovICBJbnNfU1dBUCwKLSAgICAvKiAgREVQVEggICAgICovICBJbnNfREVQVEgsCi0gICAgLyogIENJTkRFWCAgICAqLyAgSW5zX0NJTkRFWCwKLSAgICAvKiAgTUlOREVYICAgICovICBJbnNfTUlOREVYLAotICAgIC8qICBBbGlnblBUUyAgKi8gIEluc19BTElHTlBUUywKLSAgICAvKiAgSU5TXzB4MjggICovICBJbnNfVU5LTk9XTiwKLSAgICAvKiAgVVRQICAgICAgICovICBJbnNfVVRQLAotICAgIC8qICBMT09QQ0FMTCAgKi8gIEluc19MT09QQ0FMTCwKLSAgICAvKiAgQ0FMTCAgICAgICovICBJbnNfQ0FMTCwKLSAgICAvKiAgRkRFRiAgICAgICovICBJbnNfRkRFRiwKLSAgICAvKiAgRU5ERiAgICAgICovICBJbnNfRU5ERiwKLSAgICAvKiAgTURBUFswXSAgICovICBJbnNfTURBUCwKLSAgICAvKiAgTURBUFsxXSAgICovICBJbnNfTURBUCwKLQotICAgIC8qICBJVVBbMF0gICAgKi8gIEluc19JVVAsCi0gICAgLyogIElVUFsxXSAgICAqLyAgSW5zX0lVUCwKLSAgICAvKiAgU0hQWzBdICAgICovICBJbnNfU0hQLAotICAgIC8qICBTSFBbMV0gICAgKi8gIEluc19TSFAsCi0gICAgLyogIFNIQ1swXSAgICAqLyAgSW5zX1NIQywKLSAgICAvKiAgU0hDWzFdICAgICovICBJbnNfU0hDLAotICAgIC8qICBTSFpbMF0gICAgKi8gIEluc19TSFosCi0gICAgLyogIFNIWlsxXSAgICAqLyAgSW5zX1NIWiwKLSAgICAvKiAgU0hQSVggICAgICovICBJbnNfU0hQSVgsCi0gICAgLyogIElQICAgICAgICAqLyAgSW5zX0lQLAotICAgIC8qICBNU0lSUFswXSAgKi8gIEluc19NU0lSUCwKLSAgICAvKiAgTVNJUlBbMV0gICovICBJbnNfTVNJUlAsCi0gICAgLyogIEFsaWduUlAgICAqLyAgSW5zX0FMSUdOUlAsCi0gICAgLyogIFJUREcgICAgICAqLyAgSW5zX1JUREcsCi0gICAgLyogIE1JQVBbMF0gICAqLyAgSW5zX01JQVAsCi0gICAgLyogIE1JQVBbMV0gICAqLyAgSW5zX01JQVAsCi0KLSAgICAvKiAgTlB1c2hCICAgICovICBJbnNfTlBVU0hCLAotICAgIC8qICBOUHVzaFcgICAgKi8gIEluc19OUFVTSFcsCi0gICAgLyogIFdTICAgICAgICAqLyAgSW5zX1dTLAotICAgIC8qICBSUyAgICAgICAgKi8gIEluc19SUywKLSAgICAvKiAgV0N2dFAgICAgICovICBJbnNfV0NWVFAsCi0gICAgLyogIFJDdnQgICAgICAqLyAgSW5zX1JDVlQsCi0gICAgLyogIEdDWzBdICAgICAqLyAgSW5zX0dDLAotICAgIC8qICBHQ1sxXSAgICAgKi8gIEluc19HQywKLSAgICAvKiAgU0NGUyAgICAgICovICBJbnNfU0NGUywKLSAgICAvKiAgTURbMF0gICAgICovICBJbnNfTUQsCi0gICAgLyogIE1EWzFdICAgICAqLyAgSW5zX01ELAotICAgIC8qICBNUFBFTSAgICAgKi8gIEluc19NUFBFTSwKLSAgICAvKiAgTVBTICAgICAgICovICBJbnNfTVBTLAotICAgIC8qICBGbGlwT04gICAgKi8gIEluc19GTElQT04sCi0gICAgLyogIEZsaXBPRkYgICAqLyAgSW5zX0ZMSVBPRkYsCi0gICAgLyogIERFQlVHICAgICAqLyAgSW5zX0RFQlVHLAotCi0gICAgLyogIExUICAgICAgICAqLyAgSW5zX0xULAotICAgIC8qICBMVEVRICAgICAgKi8gIEluc19MVEVRLAotICAgIC8qICBHVCAgICAgICAgKi8gIEluc19HVCwKLSAgICAvKiAgR1RFUSAgICAgICovICBJbnNfR1RFUSwKLSAgICAvKiAgRVEgICAgICAgICovICBJbnNfRVEsCi0gICAgLyogIE5FUSAgICAgICAqLyAgSW5zX05FUSwKLSAgICAvKiAgT0REICAgICAgICovICBJbnNfT0RELAotICAgIC8qICBFVkVOICAgICAgKi8gIEluc19FVkVOLAotICAgIC8qICBJRiAgICAgICAgKi8gIEluc19JRiwKLSAgICAvKiAgRUlGICAgICAgICovICBJbnNfRUlGLAotICAgIC8qICBBTkQgICAgICAgKi8gIEluc19BTkQsCi0gICAgLyogIE9SICAgICAgICAqLyAgSW5zX09SLAotICAgIC8qICBOT1QgICAgICAgKi8gIEluc19OT1QsCi0gICAgLyogIERlbHRhUDEgICAqLyAgSW5zX0RFTFRBUCwKLSAgICAvKiAgU0RCICAgICAgICovICBJbnNfU0RCLAotICAgIC8qICBTRFMgICAgICAgKi8gIEluc19TRFMsCi0KLSAgICAvKiAgQUREICAgICAgICovICBJbnNfQURELAotICAgIC8qICBTVUIgICAgICAgKi8gIEluc19TVUIsCi0gICAgLyogIERJViAgICAgICAqLyAgSW5zX0RJViwKLSAgICAvKiAgTVVMICAgICAgICovICBJbnNfTVVMLAotICAgIC8qICBBQlMgICAgICAgKi8gIEluc19BQlMsCi0gICAgLyogIE5FRyAgICAgICAqLyAgSW5zX05FRywKLSAgICAvKiAgRkxPT1IgICAgICovICBJbnNfRkxPT1IsCi0gICAgLyogIENFSUxJTkcgICAqLyAgSW5zX0NFSUxJTkcsCi0gICAgLyogIFJPVU5EWzBdICAqLyAgSW5zX1JPVU5ELAotICAgIC8qICBST1VORFsxXSAgKi8gIEluc19ST1VORCwKLSAgICAvKiAgUk9VTkRbMl0gICovICBJbnNfUk9VTkQsCi0gICAgLyogIFJPVU5EWzNdICAqLyAgSW5zX1JPVU5ELAotICAgIC8qICBOUk9VTkRbMF0gKi8gIEluc19OUk9VTkQsCi0gICAgLyogIE5ST1VORFsxXSAqLyAgSW5zX05ST1VORCwKLSAgICAvKiAgTlJPVU5EWzJdICovICBJbnNfTlJPVU5ELAotICAgIC8qICBOUk9VTkRbM10gKi8gIEluc19OUk9VTkQsCi0KLSAgICAvKiAgV0N2dEYgICAgICovICBJbnNfV0NWVEYsCi0gICAgLyogIERlbHRhUDIgICAqLyAgSW5zX0RFTFRBUCwKLSAgICAvKiAgRGVsdGFQMyAgICovICBJbnNfREVMVEFQLAotICAgIC8qICBEZWx0YUNuWzBdICovIEluc19ERUxUQUMsCi0gICAgLyogIERlbHRhQ25bMV0gKi8gSW5zX0RFTFRBQywKLSAgICAvKiAgRGVsdGFDblsyXSAqLyBJbnNfREVMVEFDLAotICAgIC8qICBTUk9VTkQgICAgKi8gIEluc19TUk9VTkQsCi0gICAgLyogIFM0NVJvdW5kICAqLyAgSW5zX1M0NVJPVU5ELAotICAgIC8qICBKUk9UICAgICAgKi8gIEluc19KUk9ULAotICAgIC8qICBKUk9GICAgICAgKi8gIEluc19KUk9GLAotICAgIC8qICBST0ZGICAgICAgKi8gIEluc19ST0ZGLAotICAgIC8qICBJTlNfMHg3QiAgKi8gIEluc19VTktOT1dOLAotICAgIC8qICBSVVRHICAgICAgKi8gIEluc19SVVRHLAotICAgIC8qICBSRFRHICAgICAgKi8gIEluc19SRFRHLAotICAgIC8qICBTQU5HVyAgICAgKi8gIEluc19TQU5HVywKLSAgICAvKiAgQUEgICAgICAgICovICBJbnNfQUEsCi0KLSAgICAvKiAgRmxpcFBUICAgICovICBJbnNfRkxJUFBULAotICAgIC8qICBGbGlwUmdPTiAgKi8gIEluc19GTElQUkdPTiwKLSAgICAvKiAgRmxpcFJnT0ZGICovICBJbnNfRkxJUFJHT0ZGLAotICAgIC8qICBJTlNfMHg4MyAgKi8gIEluc19VTktOT1dOLAotICAgIC8qICBJTlNfMHg4NCAgKi8gIEluc19VTktOT1dOLAotICAgIC8qICBTY2FuQ1RSTCAgKi8gIEluc19TQ0FOQ1RSTCwKLSAgICAvKiAgU0RQVlRMWzBdICovICBJbnNfU0RQVlRMLAotICAgIC8qICBTRFBWVExbMV0gKi8gIEluc19TRFBWVEwsCi0gICAgLyogIEdldElORk8gICAqLyAgSW5zX0dFVElORk8sCi0gICAgLyogIElERUYgICAgICAqLyAgSW5zX0lERUYsCi0gICAgLyogIFJPTEwgICAgICAqLyAgSW5zX1JPTEwsCi0gICAgLyogIE1BWCAgICAgICAqLyAgSW5zX01BWCwKLSAgICAvKiAgTUlOICAgICAgICovICBJbnNfTUlOLAotICAgIC8qICBTY2FuVFlQRSAgKi8gIEluc19TQ0FOVFlQRSwKLSAgICAvKiAgSW5zdENUUkwgICovICBJbnNfSU5TVENUUkwsCi0gICAgLyogIElOU18weDhGICAqLyAgSW5zX1VOS05PV04sCi0KLSAgICAvKiAgSU5TXzB4OTAgICovICAgSW5zX1VOS05PV04sCi0gICAgLyogIElOU18weDkxICAqLyAgIEluc19VTktOT1dOLAotICAgIC8qICBJTlNfMHg5MiAgKi8gICBJbnNfVU5LTk9XTiwKLSAgICAvKiAgSU5TXzB4OTMgICovICAgSW5zX1VOS05PV04sCi0gICAgLyogIElOU18weDk0ICAqLyAgIEluc19VTktOT1dOLAotICAgIC8qICBJTlNfMHg5NSAgKi8gICBJbnNfVU5LTk9XTiwKLSAgICAvKiAgSU5TXzB4OTYgICovICAgSW5zX1VOS05PV04sCi0gICAgLyogIElOU18weDk3ICAqLyAgIEluc19VTktOT1dOLAotICAgIC8qICBJTlNfMHg5OCAgKi8gICBJbnNfVU5LTk9XTiwKLSAgICAvKiAgSU5TXzB4OTkgICovICAgSW5zX1VOS05PV04sCi0gICAgLyogIElOU18weDlBICAqLyAgIEluc19VTktOT1dOLAotICAgIC8qICBJTlNfMHg5QiAgKi8gICBJbnNfVU5LTk9XTiwKLSAgICAvKiAgSU5TXzB4OUMgICovICAgSW5zX1VOS05PV04sCi0gICAgLyogIElOU18weDlEICAqLyAgIEluc19VTktOT1dOLAotICAgIC8qICBJTlNfMHg5RSAgKi8gICBJbnNfVU5LTk9XTiwKLSAgICAvKiAgSU5TXzB4OUYgICovICAgSW5zX1VOS05PV04sCi0KLSAgICAvKiAgSU5TXzB4QTAgICovICAgSW5zX1VOS05PV04sCi0gICAgLyogIElOU18weEExICAqLyAgIEluc19VTktOT1dOLAotICAgIC8qICBJTlNfMHhBMiAgKi8gICBJbnNfVU5LTk9XTiwKLSAgICAvKiAgSU5TXzB4QTMgICovICAgSW5zX1VOS05PV04sCi0gICAgLyogIElOU18weEE0ICAqLyAgIEluc19VTktOT1dOLAotICAgIC8qICBJTlNfMHhBNSAgKi8gICBJbnNfVU5LTk9XTiwKLSAgICAvKiAgSU5TXzB4QTYgICovICAgSW5zX1VOS05PV04sCi0gICAgLyogIElOU18weEE3ICAqLyAgIEluc19VTktOT1dOLAotICAgIC8qICBJTlNfMHhBOCAgKi8gICBJbnNfVU5LTk9XTiwKLSAgICAvKiAgSU5TXzB4QTkgICovICAgSW5zX1VOS05PV04sCi0gICAgLyogIElOU18weEFBICAqLyAgIEluc19VTktOT1dOLAotICAgIC8qICBJTlNfMHhBQiAgKi8gICBJbnNfVU5LTk9XTiwKLSAgICAvKiAgSU5TXzB4QUMgICovICAgSW5zX1VOS05PV04sCi0gICAgLyogIElOU18weEFEICAqLyAgIEluc19VTktOT1dOLAotICAgIC8qICBJTlNfMHhBRSAgKi8gICBJbnNfVU5LTk9XTiwKLSAgICAvKiAgSU5TXzB4QUYgICovICAgSW5zX1VOS05PV04sCi0KLSAgICAvKiAgUHVzaEJbMF0gICovICBJbnNfUFVTSEIsCi0gICAgLyogIFB1c2hCWzFdICAqLyAgSW5zX1BVU0hCLAotICAgIC8qICBQdXNoQlsyXSAgKi8gIEluc19QVVNIQiwKLSAgICAvKiAgUHVzaEJbM10gICovICBJbnNfUFVTSEIsCi0gICAgLyogIFB1c2hCWzRdICAqLyAgSW5zX1BVU0hCLAotICAgIC8qICBQdXNoQls1XSAgKi8gIEluc19QVVNIQiwKLSAgICAvKiAgUHVzaEJbNl0gICovICBJbnNfUFVTSEIsCi0gICAgLyogIFB1c2hCWzddICAqLyAgSW5zX1BVU0hCLAotICAgIC8qICBQdXNoV1swXSAgKi8gIEluc19QVVNIVywKLSAgICAvKiAgUHVzaFdbMV0gICovICBJbnNfUFVTSFcsCi0gICAgLyogIFB1c2hXWzJdICAqLyAgSW5zX1BVU0hXLAotICAgIC8qICBQdXNoV1szXSAgKi8gIEluc19QVVNIVywKLSAgICAvKiAgUHVzaFdbNF0gICovICBJbnNfUFVTSFcsCi0gICAgLyogIFB1c2hXWzVdICAqLyAgSW5zX1BVU0hXLAotICAgIC8qICBQdXNoV1s2XSAgKi8gIEluc19QVVNIVywKLSAgICAvKiAgUHVzaFdbN10gICovICBJbnNfUFVTSFcsCi0KLSAgICAvKiAgTURSUFswMF0gICovICBJbnNfTURSUCwKLSAgICAvKiAgTURSUFswMV0gICovICBJbnNfTURSUCwKLSAgICAvKiAgTURSUFswMl0gICovICBJbnNfTURSUCwKLSAgICAvKiAgTURSUFswM10gICovICBJbnNfTURSUCwKLSAgICAvKiAgTURSUFswNF0gICovICBJbnNfTURSUCwKLSAgICAvKiAgTURSUFswNV0gICovICBJbnNfTURSUCwKLSAgICAvKiAgTURSUFswNl0gICovICBJbnNfTURSUCwKLSAgICAvKiAgTURSUFswN10gICovICBJbnNfTURSUCwKLSAgICAvKiAgTURSUFswOF0gICovICBJbnNfTURSUCwKLSAgICAvKiAgTURSUFswOV0gICovICBJbnNfTURSUCwKLSAgICAvKiAgTURSUFsxMF0gICovICBJbnNfTURSUCwKLSAgICAvKiAgTURSUFsxMV0gICovICBJbnNfTURSUCwKLSAgICAvKiAgTURSUFsxMl0gICovICBJbnNfTURSUCwKLSAgICAvKiAgTURSUFsxM10gICovICBJbnNfTURSUCwKLSAgICAvKiAgTURSUFsxNF0gICovICBJbnNfTURSUCwKLSAgICAvKiAgTURSUFsxNV0gICovICBJbnNfTURSUCwKLQotICAgIC8qICBNRFJQWzE2XSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzE3XSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzE4XSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzE5XSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzIwXSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzIxXSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzIyXSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzIzXSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzI0XSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzI1XSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzI2XSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzI3XSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzI4XSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzI5XSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzMwXSAgKi8gIEluc19NRFJQLAotICAgIC8qICBNRFJQWzMxXSAgKi8gIEluc19NRFJQLAotCi0gICAgLyogIE1JUlBbMDBdICAqLyAgSW5zX01JUlAsCi0gICAgLyogIE1JUlBbMDFdICAqLyAgSW5zX01JUlAsCi0gICAgLyogIE1JUlBbMDJdICAqLyAgSW5zX01JUlAsCi0gICAgLyogIE1JUlBbMDNdICAqLyAgSW5zX01JUlAsCi0gICAgLyogIE1JUlBbMDRdICAqLyAgSW5zX01JUlAsCi0gICAgLyogIE1JUlBbMDVdICAqLyAgSW5zX01JUlAsCi0gICAgLyogIE1JUlBbMDZdICAqLyAgSW5zX01JUlAsCi0gICAgLyogIE1JUlBbMDddICAqLyAgSW5zX01JUlAsCi0gICAgLyogIE1JUlBbMDhdICAqLyAgSW5zX01JUlAsCi0gICAgLyogIE1JUlBbMDldICAqLyAgSW5zX01JUlAsCi0gICAgLyogIE1JUlBbMTBdICAqLyAgSW5zX01JUlAsCi0gICAgLyogIE1JUlBbMTFdICAqLyAgSW5zX01JUlAsCi0gICAgLyogIE1JUlBbMTJdICAqLyAgSW5zX01JUlAsCi0gICAgLyogIE1JUlBbMTNdICAqLyAgSW5zX01JUlAsCi0gICAgLyogIE1JUlBbMTRdICAqLyAgSW5zX01JUlAsCi0gICAgLyogIE1JUlBbMTVdICAqLyAgSW5zX01JUlAsCi0KLSAgICAvKiAgTUlSUFsxNl0gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFsxN10gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFsxOF0gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFsxOV0gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFsyMF0gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFsyMV0gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFsyMl0gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFsyM10gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFsyNF0gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFsyNV0gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFsyNl0gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFsyN10gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFsyOF0gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFsyOV0gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFszMF0gICovICBJbnNfTUlSUCwKLSAgICAvKiAgTUlSUFszMV0gICovICBJbnNfTUlSUAotICB9OwotCi0KLSNlbmRpZiAvKiAhVFRfQ09ORklHX09QVElPTl9JTlRFUlBSRVRFUl9TV0lUQ0ggKi8KLQotCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogUlVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC04MTk4LDggKzc0OTUsNiBAQAogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogVEhJUyBJUyBUSEUgSU5URVJQUkVURVInUyBNQUlOIExPT1AuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgSW5zdHJ1Y3Rpb25zIGFwcGVhciBpbiB0aGUgc3BlY2lmaWNhdGlvbidzIG9yZGVyLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKQEAgLTgyMjUsOTAgKzc1MjAsMTAwIEBACiAjZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCiAKIAotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1RBVElDX1JBU1RFUgotICAgIGlmICggIWV4YyApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGN1ciA9ICpleGM7Ci0jZW5kaWYKLQogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotICAgIENVUi5pdXBfY2FsbGVkID0gRkFMU0U7CisgICAgZXhjLT5pdXBfY2FsbGVkID0gRkFMU0U7CiAjZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCiAKICAgICAvKiBzZXQgUFBFTSBhbmQgQ1ZUIGZ1bmN0aW9ucyAqLwotICAgIENVUi50dF9tZXRyaWNzLnJhdGlvID0gMDsKLSAgICBpZiAoIENVUi5tZXRyaWNzLnhfcHBlbSAhPSBDVVIubWV0cmljcy55X3BwZW0gKQorICAgIGV4Yy0+dHRfbWV0cmljcy5yYXRpbyA9IDA7CisgICAgaWYgKCBleGMtPm1ldHJpY3MueF9wcGVtICE9IGV4Yy0+bWV0cmljcy55X3BwZW0gKQogICAgIHsKICAgICAgIC8qIG5vbi1zcXVhcmUgcGl4ZWxzLCB1c2UgdGhlIHN0cmV0Y2hlZCByb3V0aW5lcyAqLwotICAgICAgQ1VSLmZ1bmNfY3VyX3BwZW0gID0gQ3VycmVudF9QcGVtX1N0cmV0Y2hlZDsKLSAgICAgIENVUi5mdW5jX3JlYWRfY3Z0ICA9IFJlYWRfQ1ZUX1N0cmV0Y2hlZDsKLSAgICAgIENVUi5mdW5jX3dyaXRlX2N2dCA9IFdyaXRlX0NWVF9TdHJldGNoZWQ7Ci0gICAgICBDVVIuZnVuY19tb3ZlX2N2dCAgPSBNb3ZlX0NWVF9TdHJldGNoZWQ7CisgICAgICBleGMtPmZ1bmNfY3VyX3BwZW0gID0gQ3VycmVudF9QcGVtX1N0cmV0Y2hlZDsKKyAgICAgIGV4Yy0+ZnVuY19yZWFkX2N2dCAgPSBSZWFkX0NWVF9TdHJldGNoZWQ7CisgICAgICBleGMtPmZ1bmNfd3JpdGVfY3Z0ID0gV3JpdGVfQ1ZUX1N0cmV0Y2hlZDsKKyAgICAgIGV4Yy0+ZnVuY19tb3ZlX2N2dCAgPSBNb3ZlX0NWVF9TdHJldGNoZWQ7CiAgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICAvKiBzcXVhcmUgcGl4ZWxzLCB1c2Ugbm9ybWFsIHJvdXRpbmVzICovCi0gICAgICBDVVIuZnVuY19jdXJfcHBlbSAgPSBDdXJyZW50X1BwZW07Ci0gICAgICBDVVIuZnVuY19yZWFkX2N2dCAgPSBSZWFkX0NWVDsKLSAgICAgIENVUi5mdW5jX3dyaXRlX2N2dCA9IFdyaXRlX0NWVDsKLSAgICAgIENVUi5mdW5jX21vdmVfY3Z0ICA9IE1vdmVfQ1ZUOworICAgICAgZXhjLT5mdW5jX2N1cl9wcGVtICA9IEN1cnJlbnRfUHBlbTsKKyAgICAgIGV4Yy0+ZnVuY19yZWFkX2N2dCAgPSBSZWFkX0NWVDsKKyAgICAgIGV4Yy0+ZnVuY193cml0ZV9jdnQgPSBXcml0ZV9DVlQ7CisgICAgICBleGMtPmZ1bmNfbW92ZV9jdnQgID0gTW92ZV9DVlQ7CiAgICAgfQogCi0gICAgQ09NUFVURV9GdW5jcygpOwotICAgIENPTVBVVEVfUm91bmQoIChGVF9CeXRlKWV4Yy0+R1Mucm91bmRfc3RhdGUgKTsKKyAgICBDb21wdXRlX0Z1bmNzKCBleGMgKTsKKyAgICBDb21wdXRlX1JvdW5kKCBleGMsIChGVF9CeXRlKWV4Yy0+R1Mucm91bmRfc3RhdGUgKTsKIAogICAgIGRvCiAgICAgewotICAgICAgQ1VSLm9wY29kZSA9IENVUi5jb2RlW0NVUi5JUF07CisgICAgICBleGMtPm9wY29kZSA9IGV4Yy0+Y29kZVtleGMtPklQXTsKIAotICAgICAgRlRfVFJBQ0U3KCggIiAgIiApKTsKLSAgICAgIEZUX1RSQUNFNygoIG9wY29kZV9uYW1lW0NVUi5vcGNvZGVdICkpOwotICAgICAgRlRfVFJBQ0U3KCggIlxuIiApKTsKLQotICAgICAgaWYgKCAoIENVUi5sZW5ndGggPSBvcGNvZGVfbGVuZ3RoW0NVUi5vcGNvZGVdICkgPCAwICkKKyNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQogICAgICAgewotICAgICAgICBpZiAoIENVUi5JUCArIDEgPj0gQ1VSLmNvZGVTaXplICkKKyAgICAgICAgRlRfTG9uZyAgY250ID0gRlRfTUlOKCA4LCBleGMtPnRvcCApOworICAgICAgICBGVF9Mb25nICBuOworCisKKyAgICAgICAgLyogaWYgdHJhY2luZyBsZXZlbCBpcyA3LCBzaG93IGN1cnJlbnQgY29kZSBwb3NpdGlvbiAqLworICAgICAgICAvKiBhbmQgdGhlIGZpcnN0IGZldyBzdGFjayBlbGVtZW50cyBhbHNvICAgICAgICAgICAgICovCisgICAgICAgIEZUX1RSQUNFNigoICIgICIgKSk7CisgICAgICAgIEZUX1RSQUNFNygoICIlMDZkICIsIGV4Yy0+SVAgKSk7CisgICAgICAgIEZUX1RSQUNFNigoIG9wY29kZV9uYW1lW2V4Yy0+b3Bjb2RlXSArIDIgKSk7CisgICAgICAgIEZUX1RSQUNFNygoICIlKnMiLCAqb3Bjb2RlX25hbWVbZXhjLT5vcGNvZGVdID09ICdBJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDEyIC0gKCAqb3Bjb2RlX25hbWVbZXhjLT5vcGNvZGVdIC0gJzAnICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIyIgKSk7CisgICAgICAgIGZvciAoIG4gPSAwOyBuIDwgY250OyBuKysgKQorICAgICAgICAgIEZUX1RSQUNFNygoICIgJWQiLCBleGMtPnN0YWNrW2V4Yy0+dG9wIC0gbl0gKSk7CisgICAgICAgIEZUX1RSQUNFNigoICJcbiIgKSk7CisgICAgICB9CisjZW5kaWYgLyogRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KKworICAgICAgaWYgKCAoIGV4Yy0+bGVuZ3RoID0gb3Bjb2RlX2xlbmd0aFtleGMtPm9wY29kZV0gKSA8IDAgKQorICAgICAgeworICAgICAgICBpZiAoIGV4Yy0+SVAgKyAxID49IGV4Yy0+Y29kZVNpemUgKQogICAgICAgICAgIGdvdG8gTEVycm9yQ29kZU92ZXJmbG93XzsKIAotICAgICAgICBDVVIubGVuZ3RoID0gMiAtIENVUi5sZW5ndGggKiBDVVIuY29kZVtDVVIuSVAgKyAxXTsKKyAgICAgICAgZXhjLT5sZW5ndGggPSAyIC0gZXhjLT5sZW5ndGggKiBleGMtPmNvZGVbZXhjLT5JUCArIDFdOwogICAgICAgfQogCi0gICAgICBpZiAoIENVUi5JUCArIENVUi5sZW5ndGggPiBDVVIuY29kZVNpemUgKQorICAgICAgaWYgKCBleGMtPklQICsgZXhjLT5sZW5ndGggPiBleGMtPmNvZGVTaXplICkKICAgICAgICAgZ290byBMRXJyb3JDb2RlT3ZlcmZsb3dfOwogCiAgICAgICAvKiBGaXJzdCwgbGV0J3MgY2hlY2sgZm9yIGVtcHR5IHN0YWNrIGFuZCBvdmVyZmxvdyAqLwotICAgICAgQ1VSLmFyZ3MgPSBDVVIudG9wIC0gKCBQb3BfUHVzaF9Db3VudFtDVVIub3Bjb2RlXSA+PiA0ICk7CisgICAgICBleGMtPmFyZ3MgPSBleGMtPnRvcCAtICggUG9wX1B1c2hfQ291bnRbZXhjLT5vcGNvZGVdID4+IDQgKTsKIAogICAgICAgLyogYGFyZ3MnIGlzIHRoZSB0b3Agb2YgdGhlIHN0YWNrIG9uY2UgYXJndW1lbnRzIGhhdmUgYmVlbiBwb3BwZWQuICovCiAgICAgICAvKiBPbmUgY2FuIGFsc28gaW50ZXJwcmV0IGl0IGFzIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBhcmd1bWVudC4gICAgKi8KLSAgICAgIGlmICggQ1VSLmFyZ3MgPCAwICkKKyAgICAgIGlmICggZXhjLT5hcmdzIDwgMCApCiAgICAgICB7Ci0gICAgICAgIGlmICggQ1VSLnBlZGFudGljX2hpbnRpbmcgKQorICAgICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCiAgICAgICAgIHsKLSAgICAgICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggVG9vX0Zld19Bcmd1bWVudHMgKTsKKyAgICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIFRvb19GZXdfQXJndW1lbnRzICk7CiAgICAgICAgICAgZ290byBMRXJyb3JMYWJlbF87CiAgICAgICAgIH0KIAogICAgICAgICAvKiBwdXNoIHplcm9lcyBvbnRvIHRoZSBzdGFjayAqLwotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IFBvcF9QdXNoX0NvdW50W0NVUi5vcGNvZGVdID4+IDQ7IGkrKyApCi0gICAgICAgICAgQ1VSLnN0YWNrW2ldID0gMDsKLSAgICAgICAgQ1VSLmFyZ3MgPSAwOworICAgICAgICBmb3IgKCBpID0gMDsgaSA8IFBvcF9QdXNoX0NvdW50W2V4Yy0+b3Bjb2RlXSA+PiA0OyBpKysgKQorICAgICAgICAgIGV4Yy0+c3RhY2tbaV0gPSAwOworICAgICAgICBleGMtPmFyZ3MgPSAwOwogICAgICAgfQogCi0gICAgICBDVVIubmV3X3RvcCA9IENVUi5hcmdzICsgKCBQb3BfUHVzaF9Db3VudFtDVVIub3Bjb2RlXSAmIDE1ICk7CisgICAgICBleGMtPm5ld190b3AgPSBleGMtPmFyZ3MgKyAoIFBvcF9QdXNoX0NvdW50W2V4Yy0+b3Bjb2RlXSAmIDE1ICk7CiAKICAgICAgIC8qIGBuZXdfdG9wJyBpcyB0aGUgbmV3IHRvcCBvZiB0aGUgc3RhY2ssIGFmdGVyIHRoZSBpbnN0cnVjdGlvbidzICovCiAgICAgICAvKiBleGVjdXRpb24uICBgdG9wJyB3aWxsIGJlIHNldCB0byBgbmV3X3RvcCcgYWZ0ZXIgdGhlIGBzd2l0Y2gnICAqLwogICAgICAgLyogc3RhdGVtZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggQ1VSLm5ld190b3AgPiBDVVIuc3RhY2tTaXplICkKKyAgICAgIGlmICggZXhjLT5uZXdfdG9wID4gZXhjLT5zdGFja1NpemUgKQogICAgICAgewotICAgICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggU3RhY2tfT3ZlcmZsb3cgKTsKKyAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBTdGFja19PdmVyZmxvdyApOwogICAgICAgICBnb3RvIExFcnJvckxhYmVsXzsKICAgICAgIH0KIAotICAgICAgQ1VSLnN0ZXBfaW5zID0gVFJVRTsKLSAgICAgIENVUi5lcnJvciAgICA9IEZUX0Vycl9PazsKKyAgICAgIGV4Yy0+c3RlcF9pbnMgPSBUUlVFOworICAgICAgZXhjLT5lcnJvciAgICA9IEZUX0Vycl9PazsKIAogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwogCkBAIC04MzE2LDE3ICs3NjIxLDE3IEBACiAgICAgICB7CiAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgb3Bjb2RlX3BhdHRlcm5zOyBpKysgKQogICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBvcGNvZGVfcG9pbnRlcltpXSA8IG9wY29kZV9zaXplW2ldICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgQ1VSLm9wY29kZSA9PSBvcGNvZGVfcGF0dGVybltpXVtvcGNvZGVfcG9pbnRlcltpXV0gKQorICAgICAgICAgIGlmICggb3Bjb2RlX3BvaW50ZXJbaV0gPCBvcGNvZGVfc2l6ZVtpXSAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAgICBleGMtPm9wY29kZSA9PSBvcGNvZGVfcGF0dGVybltpXVtvcGNvZGVfcG9pbnRlcltpXV0gKQogICAgICAgICAgIHsKICAgICAgICAgICAgIG9wY29kZV9wb2ludGVyW2ldICs9IDE7CiAKICAgICAgICAgICAgIGlmICggb3Bjb2RlX3BvaW50ZXJbaV0gPT0gb3Bjb2RlX3NpemVbaV0gKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9UUkFDRTcoKCAic3BoOiBvcGNvZGUgcHRybjogJWQsICVzICVzXG4iLAorICAgICAgICAgICAgICBGVF9UUkFDRTYoKCAic3BoOiBvcGNvZGUgcHRybjogJWQsICVzICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDVVIuZmFjZS0+cm9vdC5mYW1pbHlfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSLmZhY2UtPnJvb3Quc3R5bGVfbmFtZSApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT5mYWNlLT5yb290LmZhbWlseV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPmZhY2UtPnJvb3Quc3R5bGVfbmFtZSApKTsKIAogICAgICAgICAgICAgICBzd2l0Y2ggKCBpICkKICAgICAgICAgICAgICAgewpAQCAtODM0MywxNSArNzY0OCw5IEBACiAKICNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KIAotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fSU5URVJQUkVURVJfU1dJVENICi0KICAgICAgIHsKLSAgICAgICAgRlRfTG9uZyogIGFyZ3MgICA9IENVUi5zdGFjayArIENVUi5hcmdzOwotICAgICAgICBGVF9CeXRlICAgb3Bjb2RlID0gQ1VSLm9wY29kZTsKLQotCi0jdW5kZWYgIEFSUkFZX0JPVU5EX0VSUk9SCi0jZGVmaW5lIEFSUkFZX0JPVU5EX0VSUk9SICBnb3RvIFNldF9JbnZhbGlkX1JlZgorICAgICAgICBGVF9Mb25nKiAgYXJncyAgID0gZXhjLT5zdGFjayArIGV4Yy0+YXJnczsKKyAgICAgICAgRlRfQnl0ZSAgIG9wY29kZSA9IGV4Yy0+b3Bjb2RlOwogCiAKICAgICAgICAgc3dpdGNoICggb3Bjb2RlICkKQEAgLTgzNjIsNTgwICs3NjYxLDU0MyBAQAogICAgICAgICBjYXNlIDB4MDM6ICAvKiBTUHZUQ0EgeCAqLwogICAgICAgICBjYXNlIDB4MDQ6ICAvKiBTRnZUQ0EgeSAqLwogICAgICAgICBjYXNlIDB4MDU6ICAvKiBTRnZUQ0EgeCAqLwotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1Nob3J0ICBBQSwgQkI7Ci0KLQotICAgICAgICAgICAgQUEgPSAoRlRfU2hvcnQpKCAoIG9wY29kZSAmIDEgKSA8PCAxNCApOwotICAgICAgICAgICAgQkIgPSAoRlRfU2hvcnQpKCBBQSBeIDB4NDAwMCApOwotCi0gICAgICAgICAgICBpZiAoIG9wY29kZSA8IDQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBDVVIuR1MucHJvalZlY3Rvci54ID0gQUE7Ci0gICAgICAgICAgICAgIENVUi5HUy5wcm9qVmVjdG9yLnkgPSBCQjsKLQotICAgICAgICAgICAgICBDVVIuR1MuZHVhbFZlY3Rvci54ID0gQUE7Ci0gICAgICAgICAgICAgIENVUi5HUy5kdWFsVmVjdG9yLnkgPSBCQjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgR1VFU1NfVkVDVE9SKCBwcm9qVmVjdG9yICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggKCBvcGNvZGUgJiAyICkgPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIENVUi5HUy5mcmVlVmVjdG9yLnggPSBBQTsKLSAgICAgICAgICAgICAgQ1VSLkdTLmZyZWVWZWN0b3IueSA9IEJCOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBHVUVTU19WRUNUT1IoIGZyZWVWZWN0b3IgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ09NUFVURV9GdW5jcygpOwotICAgICAgICAgIH0KKyAgICAgICAgICBJbnNfU3h5VENBKCBleGMgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4MDY6ICAvKiBTUHZUTCAvLyAqLwogICAgICAgICBjYXNlIDB4MDc6ICAvKiBTUHZUTCArICAqLwotICAgICAgICAgIERPX1NQVlRMCisgICAgICAgICAgSW5zX1NQVlRMKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4MDg6ICAvKiBTRnZUTCAvLyAqLwogICAgICAgICBjYXNlIDB4MDk6ICAvKiBTRnZUTCArICAqLwotICAgICAgICAgIERPX1NGVlRMCisgICAgICAgICAgSW5zX1NGVlRMKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4MEE6ICAvKiBTUHZGUyAqLwotICAgICAgICAgIERPX1NQVkZTCisgICAgICAgICAgSW5zX1NQVkZTKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4MEI6ICAvKiBTRnZGUyAqLwotICAgICAgICAgIERPX1NGVkZTCisgICAgICAgICAgSW5zX1NGVkZTKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIDB4MEM6ICAvKiBHUFYgKi8KLSAgICAgICAgICBET19HUFYKKyAgICAgICAgY2FzZSAweDBDOiAgLyogR1B2ICovCisgICAgICAgICAgSW5zX0dQViggZXhjLCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSAweDBEOiAgLyogR0ZWICovCi0gICAgICAgICAgRE9fR0ZWCisgICAgICAgIGNhc2UgMHgwRDogIC8qIEdGdiAqLworICAgICAgICAgIEluc19HRlYoIGV4YywgYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHgwRTogIC8qIFNGdlRQdiAqLwotICAgICAgICAgIERPX1NGVlRQVgorICAgICAgICAgIEluc19TRlZUUFYoIGV4YyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHgwRjogIC8qIElTRUNUICAqLwotICAgICAgICAgIEluc19JU0VDVCggRVhFQ19BUkdfIGFyZ3MgKTsKKyAgICAgICAgICBJbnNfSVNFQ1QoIGV4YywgYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHgxMDogIC8qIFNSUDAgKi8KLSAgICAgICAgICBET19TUlAwCisgICAgICAgICAgSW5zX1NSUDAoIGV4YywgYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHgxMTogIC8qIFNSUDEgKi8KLSAgICAgICAgICBET19TUlAxCisgICAgICAgICAgSW5zX1NSUDEoIGV4YywgYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHgxMjogIC8qIFNSUDIgKi8KLSAgICAgICAgICBET19TUlAyCisgICAgICAgICAgSW5zX1NSUDIoIGV4YywgYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHgxMzogIC8qIFNaUDAgKi8KLSAgICAgICAgICBJbnNfU1pQMCggRVhFQ19BUkdfIGFyZ3MgKTsKKyAgICAgICAgICBJbnNfU1pQMCggZXhjLCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDE0OiAgLyogU1pQMSAqLwotICAgICAgICAgIEluc19TWlAxKCBFWEVDX0FSR18gYXJncyApOworICAgICAgICAgIEluc19TWlAxKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4MTU6ICAvKiBTWlAyICovCi0gICAgICAgICAgSW5zX1NaUDIoIEVYRUNfQVJHXyBhcmdzICk7CisgICAgICAgICAgSW5zX1NaUDIoIGV4YywgYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHgxNjogIC8qIFNaUFMgKi8KLSAgICAgICAgICBJbnNfU1pQUyggRVhFQ19BUkdfIGFyZ3MgKTsKKyAgICAgICAgICBJbnNfU1pQUyggZXhjLCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDE3OiAgLyogU0xPT1AgKi8KLSAgICAgICAgICBET19TTE9PUAorICAgICAgICAgIEluc19TTE9PUCggZXhjLCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDE4OiAgLyogUlRHICovCi0gICAgICAgICAgRE9fUlRHCisgICAgICAgICAgSW5zX1JURyggZXhjICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDE5OiAgLyogUlRIRyAqLwotICAgICAgICAgIERPX1JUSEcKKyAgICAgICAgICBJbnNfUlRIRyggZXhjICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDFBOiAgLyogU01EICovCi0gICAgICAgICAgRE9fU01ECisgICAgICAgICAgSW5zX1NNRCggZXhjLCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDFCOiAgLyogRUxTRSAqLwotICAgICAgICAgIEluc19FTFNFKCBFWEVDX0FSR18gYXJncyApOworICAgICAgICAgIEluc19FTFNFKCBleGMgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4MUM6ICAvKiBKTVBSICovCi0gICAgICAgICAgRE9fSk1QUgorICAgICAgICAgIEluc19KTVBSKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4MUQ6ICAvKiBTQ1ZUQ0kgKi8KLSAgICAgICAgICBET19TQ1ZUQ0kKKyAgICAgICAgICBJbnNfU0NWVENJKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4MUU6ICAvKiBTU1dDSSAqLwotICAgICAgICAgIERPX1NTV0NJCisgICAgICAgICAgSW5zX1NTV0NJKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4MUY6ICAvKiBTU1cgKi8KLSAgICAgICAgICBET19TU1cKKyAgICAgICAgICBJbnNfU1NXKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4MjA6ICAvKiBEVVAgKi8KLSAgICAgICAgICBET19EVVAKKyAgICAgICAgICBJbnNfRFVQKCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDIxOiAgLyogUE9QICovCi0gICAgICAgICAgLyogbm90aGluZyA6LSkgKi8KKyAgICAgICAgICBJbnNfUE9QKCk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDIyOiAgLyogQ0xFQVIgKi8KLSAgICAgICAgICBET19DTEVBUgorICAgICAgICAgIEluc19DTEVBUiggZXhjICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDIzOiAgLyogU1dBUCAqLwotICAgICAgICAgIERPX1NXQVAKKyAgICAgICAgICBJbnNfU1dBUCggYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHgyNDogIC8qIERFUFRIICovCi0gICAgICAgICAgRE9fREVQVEgKKyAgICAgICAgICBJbnNfREVQVEgoIGV4YywgYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHgyNTogIC8qIENJTkRFWCAqLwotICAgICAgICAgIERPX0NJTkRFWAorICAgICAgICAgIEluc19DSU5ERVgoIGV4YywgYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHgyNjogIC8qIE1JTkRFWCAqLwotICAgICAgICAgIEluc19NSU5ERVgoIEVYRUNfQVJHXyBhcmdzICk7CisgICAgICAgICAgSW5zX01JTkRFWCggZXhjLCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDI3OiAgLyogQUxJR05QVFMgKi8KLSAgICAgICAgICBJbnNfQUxJR05QVFMoIEVYRUNfQVJHXyBhcmdzICk7CisgICAgICAgICAgSW5zX0FMSUdOUFRTKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4Mjg6ICAvKiA/Pz8/ICovCi0gICAgICAgICAgSW5zX1VOS05PV04oIEVYRUNfQVJHXyBhcmdzICk7CisgICAgICAgICAgSW5zX1VOS05PV04oIGV4YyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHgyOTogIC8qIFVUUCAqLwotICAgICAgICAgIEluc19VVFAoIEVYRUNfQVJHXyBhcmdzICk7CisgICAgICAgICAgSW5zX1VUUCggZXhjLCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDJBOiAgLyogTE9PUENBTEwgKi8KLSAgICAgICAgICBJbnNfTE9PUENBTEwoIEVYRUNfQVJHXyBhcmdzICk7CisgICAgICAgICAgSW5zX0xPT1BDQUxMKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4MkI6ICAvKiBDQUxMICovCi0gICAgICAgICAgSW5zX0NBTEwoIEVYRUNfQVJHXyBhcmdzICk7CisgICAgICAgICAgSW5zX0NBTEwoIGV4YywgYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHgyQzogIC8qIEZERUYgKi8KLSAgICAgICAgICBJbnNfRkRFRiggRVhFQ19BUkdfIGFyZ3MgKTsKKyAgICAgICAgICBJbnNfRkRFRiggZXhjLCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDJEOiAgLyogRU5ERiAqLwotICAgICAgICAgIEluc19FTkRGKCBFWEVDX0FSR18gYXJncyApOworICAgICAgICAgIEluc19FTkRGKCBleGMgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4MkU6ICAvKiBNREFQICovCiAgICAgICAgIGNhc2UgMHgyRjogIC8qIE1EQVAgKi8KLSAgICAgICAgICBJbnNfTURBUCggRVhFQ19BUkdfIGFyZ3MgKTsKKyAgICAgICAgICBJbnNfTURBUCggZXhjLCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDMwOiAgLyogSVVQICovCiAgICAgICAgIGNhc2UgMHgzMTogIC8qIElVUCAqLwotICAgICAgICAgIEluc19JVVAoIEVYRUNfQVJHXyBhcmdzICk7CisgICAgICAgICAgSW5zX0lVUCggZXhjICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDMyOiAgLyogU0hQICovCiAgICAgICAgIGNhc2UgMHgzMzogIC8qIFNIUCAqLwotICAgICAgICAgIEluc19TSFAoIEVYRUNfQVJHXyBhcmdzICk7CisgICAgICAgICAgSW5zX1NIUCggZXhjICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDM0OiAgLyogU0hDICovCiAgICAgICAgIGNhc2UgMHgzNTogIC8qIFNIQyAqLwotICAgICAgICAgIEluc19TSEMoIEVYRUNfQVJHXyBhcmdzICk7CisgICAgICAgICAgSW5zX1NIQyggZXhjLCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDM2OiAgLyogU0haICovCiAgICAgICAgIGNhc2UgMHgzNzogIC8qIFNIWiAqLwotICAgICAgICAgIEluc19TSFooIEVYRUNfQVJHXyBhcmdzICk7CisgICAgICAgICAgSW5zX1NIWiggZXhjLCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDM4OiAgLyogU0hQSVggKi8KLSAgICAgICAgICBJbnNfU0hQSVgoIEVYRUNfQVJHXyBhcmdzICk7CisgICAgICAgICAgSW5zX1NIUElYKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4Mzk6ICAvKiBJUCAgICAqLwotICAgICAgICAgIEluc19JUCggRVhFQ19BUkdfIGFyZ3MgKTsKKyAgICAgICAgICBJbnNfSVAoIGV4YyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHgzQTogIC8qIE1TSVJQICovCiAgICAgICAgIGNhc2UgMHgzQjogIC8qIE1TSVJQICovCi0gICAgICAgICAgSW5zX01TSVJQKCBFWEVDX0FSR18gYXJncyApOworICAgICAgICAgIEluc19NU0lSUCggZXhjLCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDNDOiAgLyogQWxpZ25SUCAqLwotICAgICAgICAgIEluc19BTElHTlJQKCBFWEVDX0FSR18gYXJncyApOworICAgICAgICAgIEluc19BTElHTlJQKCBleGMgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4M0Q6ICAvKiBSVERHICovCi0gICAgICAgICAgRE9fUlRERworICAgICAgICAgIEluc19SVERHKCBleGMgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4M0U6ICAvKiBNSUFQICovCiAgICAgICAgIGNhc2UgMHgzRjogIC8qIE1JQVAgKi8KLSAgICAgICAgICBJbnNfTUlBUCggRVhFQ19BUkdfIGFyZ3MgKTsKKyAgICAgICAgICBJbnNfTUlBUCggZXhjLCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDQwOiAgLyogTlBVU0hCICovCi0gICAgICAgICAgSW5zX05QVVNIQiggRVhFQ19BUkdfIGFyZ3MgKTsKKyAgICAgICAgICBJbnNfTlBVU0hCKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4NDE6ICAvKiBOUFVTSFcgKi8KLSAgICAgICAgICBJbnNfTlBVU0hXKCBFWEVDX0FSR18gYXJncyApOworICAgICAgICAgIEluc19OUFVTSFcoIGV4YywgYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHg0MjogIC8qIFdTICovCi0gICAgICAgICAgRE9fV1MKLSAgICAgICAgICBicmVhazsKLQotICAgICAgU2V0X0ludmFsaWRfUmVmOgotICAgICAgICAgICAgQ1VSLmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7CisgICAgICAgICAgSW5zX1dTKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4NDM6ICAvKiBSUyAqLwotICAgICAgICAgIERPX1JTCisgICAgICAgICAgSW5zX1JTKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4NDQ6ICAvKiBXQ1ZUUCAqLwotICAgICAgICAgIERPX1dDVlRQCisgICAgICAgICAgSW5zX1dDVlRQKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4NDU6ICAvKiBSQ1ZUICovCi0gICAgICAgICAgRE9fUkNWVAorICAgICAgICAgIEluc19SQ1ZUKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4NDY6ICAvKiBHQyAqLwogICAgICAgICBjYXNlIDB4NDc6ICAvKiBHQyAqLwotICAgICAgICAgIEluc19HQyggRVhFQ19BUkdfIGFyZ3MgKTsKKyAgICAgICAgICBJbnNfR0MoIGV4YywgYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHg0ODogIC8qIFNDRlMgKi8KLSAgICAgICAgICBJbnNfU0NGUyggRVhFQ19BUkdfIGFyZ3MgKTsKKyAgICAgICAgICBJbnNfU0NGUyggZXhjLCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDQ5OiAgLyogTUQgKi8KICAgICAgICAgY2FzZSAweDRBOiAgLyogTUQgKi8KLSAgICAgICAgICBJbnNfTUQoIEVYRUNfQVJHXyBhcmdzICk7CisgICAgICAgICAgSW5zX01EKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4NEI6ICAvKiBNUFBFTSAqLwotICAgICAgICAgIERPX01QUEVNCisgICAgICAgICAgSW5zX01QUEVNKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4NEM6ICAvKiBNUFMgKi8KLSAgICAgICAgICBET19NUFMKKyAgICAgICAgICBJbnNfTVBTKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4NEQ6ICAvKiBGTElQT04gKi8KLSAgICAgICAgICBET19GTElQT04KKyAgICAgICAgICBJbnNfRkxJUE9OKCBleGMgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4NEU6ICAvKiBGTElQT0ZGICovCi0gICAgICAgICAgRE9fRkxJUE9GRgorICAgICAgICAgIEluc19GTElQT0ZGKCBleGMgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4NEY6ICAvKiBERUJVRyAqLwotICAgICAgICAgIERPX0RFQlVHCisgICAgICAgICAgSW5zX0RFQlVHKCBleGMgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4NTA6ICAvKiBMVCAqLwotICAgICAgICAgIERPX0xUCisgICAgICAgICAgSW5zX0xUKCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDUxOiAgLyogTFRFUSAqLwotICAgICAgICAgIERPX0xURVEKKyAgICAgICAgICBJbnNfTFRFUSggYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHg1MjogIC8qIEdUICovCi0gICAgICAgICAgRE9fR1QKKyAgICAgICAgICBJbnNfR1QoIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4NTM6ICAvKiBHVEVRICovCi0gICAgICAgICAgRE9fR1RFUQorICAgICAgICAgIEluc19HVEVRKCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDU0OiAgLyogRVEgKi8KLSAgICAgICAgICBET19FUQorICAgICAgICAgIEluc19FUSggYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHg1NTogIC8qIE5FUSAqLwotICAgICAgICAgIERPX05FUQorICAgICAgICAgIEluc19ORVEoIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4NTY6ICAvKiBPREQgKi8KLSAgICAgICAgICBET19PREQKKyAgICAgICAgICBJbnNfT0REKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4NTc6ICAvKiBFVkVOICovCi0gICAgICAgICAgRE9fRVZFTgorICAgICAgICAgIEluc19FVkVOKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4NTg6ICAvKiBJRiAqLwotICAgICAgICAgIEluc19JRiggRVhFQ19BUkdfIGFyZ3MgKTsKKyAgICAgICAgICBJbnNfSUYoIGV4YywgYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHg1OTogIC8qIEVJRiAqLwotICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICAgICAgICBJbnNfRUlGKCk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDVBOiAgLyogQU5EICovCi0gICAgICAgICAgRE9fQU5ECisgICAgICAgICAgSW5zX0FORCggYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHg1QjogIC8qIE9SICovCi0gICAgICAgICAgRE9fT1IKKyAgICAgICAgICBJbnNfT1IoIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4NUM6ICAvKiBOT1QgKi8KLSAgICAgICAgICBET19OT1QKKyAgICAgICAgICBJbnNfTk9UKCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDVEOiAgLyogREVMVEFQMSAqLwotICAgICAgICAgIEluc19ERUxUQVAoIEVYRUNfQVJHXyBhcmdzICk7CisgICAgICAgICAgSW5zX0RFTFRBUCggZXhjLCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDVFOiAgLyogU0RCICovCi0gICAgICAgICAgRE9fU0RCCisgICAgICAgICAgSW5zX1NEQiggZXhjLCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDVGOiAgLyogU0RTICovCi0gICAgICAgICAgRE9fU0RTCisgICAgICAgICAgSW5zX1NEUyggZXhjLCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDYwOiAgLyogQUREICovCi0gICAgICAgICAgRE9fQURECisgICAgICAgICAgSW5zX0FERCggYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHg2MTogIC8qIFNVQiAqLwotICAgICAgICAgIERPX1NVQgorICAgICAgICAgIEluc19TVUIoIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4NjI6ICAvKiBESVYgKi8KLSAgICAgICAgICBET19ESVYKKyAgICAgICAgICBJbnNfRElWKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4NjM6ICAvKiBNVUwgKi8KLSAgICAgICAgICBET19NVUwKKyAgICAgICAgICBJbnNfTVVMKCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDY0OiAgLyogQUJTICovCi0gICAgICAgICAgRE9fQUJTCisgICAgICAgICAgSW5zX0FCUyggYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHg2NTogIC8qIE5FRyAqLwotICAgICAgICAgIERPX05FRworICAgICAgICAgIEluc19ORUcoIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4NjY6ICAvKiBGTE9PUiAqLwotICAgICAgICAgIERPX0ZMT09SCisgICAgICAgICAgSW5zX0ZMT09SKCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDY3OiAgLyogQ0VJTElORyAqLwotICAgICAgICAgIERPX0NFSUxJTkcKKyAgICAgICAgICBJbnNfQ0VJTElORyggYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHg2ODogIC8qIFJPVU5EICovCiAgICAgICAgIGNhc2UgMHg2OTogIC8qIFJPVU5EICovCiAgICAgICAgIGNhc2UgMHg2QTogIC8qIFJPVU5EICovCiAgICAgICAgIGNhc2UgMHg2QjogIC8qIFJPVU5EICovCi0gICAgICAgICAgRE9fUk9VTkQKKyAgICAgICAgICBJbnNfUk9VTkQoIGV4YywgYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHg2QzogIC8qIE5ST1VORCAqLwogICAgICAgICBjYXNlIDB4NkQ6ICAvKiBOUk9VTkQgKi8KICAgICAgICAgY2FzZSAweDZFOiAgLyogTlJSVU5EICovCiAgICAgICAgIGNhc2UgMHg2RjogIC8qIE5ST1VORCAqLwotICAgICAgICAgIERPX05ST1VORAorICAgICAgICAgIEluc19OUk9VTkQoIGV4YywgYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHg3MDogIC8qIFdDVlRGICovCi0gICAgICAgICAgRE9fV0NWVEYKKyAgICAgICAgICBJbnNfV0NWVEYoIGV4YywgYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHg3MTogIC8qIERFTFRBUDIgKi8KICAgICAgICAgY2FzZSAweDcyOiAgLyogREVMVEFQMyAqLwotICAgICAgICAgIEluc19ERUxUQVAoIEVYRUNfQVJHXyBhcmdzICk7CisgICAgICAgICAgSW5zX0RFTFRBUCggZXhjLCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDczOiAgLyogREVMVEFDMCAqLwogICAgICAgICBjYXNlIDB4NzQ6ICAvKiBERUxUQUMxICovCiAgICAgICAgIGNhc2UgMHg3NTogIC8qIERFTFRBQzIgKi8KLSAgICAgICAgICBJbnNfREVMVEFDKCBFWEVDX0FSR18gYXJncyApOworICAgICAgICAgIEluc19ERUxUQUMoIGV4YywgYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHg3NjogIC8qIFNST1VORCAqLwotICAgICAgICAgIERPX1NST1VORAorICAgICAgICAgIEluc19TUk9VTkQoIGV4YywgYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHg3NzogIC8qIFM0NVJvdW5kICovCi0gICAgICAgICAgRE9fUzQ1Uk9VTkQKKyAgICAgICAgICBJbnNfUzQ1Uk9VTkQoIGV4YywgYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHg3ODogIC8qIEpST1QgKi8KLSAgICAgICAgICBET19KUk9UCisgICAgICAgICAgSW5zX0pST1QoIGV4YywgYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHg3OTogIC8qIEpST0YgKi8KLSAgICAgICAgICBET19KUk9GCisgICAgICAgICAgSW5zX0pST0YoIGV4YywgYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHg3QTogIC8qIFJPRkYgKi8KLSAgICAgICAgICBET19ST0ZGCisgICAgICAgICAgSW5zX1JPRkYoIGV4YyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHg3QjogIC8qID8/Pz8gKi8KLSAgICAgICAgICBJbnNfVU5LTk9XTiggRVhFQ19BUkdfIGFyZ3MgKTsKKyAgICAgICAgICBJbnNfVU5LTk9XTiggZXhjICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDdDOiAgLyogUlVURyAqLwotICAgICAgICAgIERPX1JVVEcKKyAgICAgICAgICBJbnNfUlVURyggZXhjICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDdEOiAgLyogUkRURyAqLwotICAgICAgICAgIERPX1JEVEcKKyAgICAgICAgICBJbnNfUkRURyggZXhjICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDdFOiAgLyogU0FOR1cgKi8KLSAgICAgICAgY2FzZSAweDdGOiAgLyogQUEgICAgKi8KLSAgICAgICAgICAvKiBub3RoaW5nIC0gb2Jzb2xldGUgKi8KKyAgICAgICAgICBJbnNfU0FOR1coKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4N0Y6ICAvKiBBQSAqLworICAgICAgICAgIEluc19BQSgpOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHg4MDogIC8qIEZMSVBQVCAqLwotICAgICAgICAgIEluc19GTElQUFQoIEVYRUNfQVJHXyBhcmdzICk7CisgICAgICAgICAgSW5zX0ZMSVBQVCggZXhjICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDgxOiAgLyogRkxJUFJHT04gKi8KLSAgICAgICAgICBJbnNfRkxJUFJHT04oIEVYRUNfQVJHXyBhcmdzICk7CisgICAgICAgICAgSW5zX0ZMSVBSR09OKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4ODI6ICAvKiBGTElQUkdPRkYgKi8KLSAgICAgICAgICBJbnNfRkxJUFJHT0ZGKCBFWEVDX0FSR18gYXJncyApOworICAgICAgICAgIEluc19GTElQUkdPRkYoIGV4YywgYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHg4MzogIC8qIFVOS05PV04gKi8KICAgICAgICAgY2FzZSAweDg0OiAgLyogVU5LTk9XTiAqLwotICAgICAgICAgIEluc19VTktOT1dOKCBFWEVDX0FSR18gYXJncyApOworICAgICAgICAgIEluc19VTktOT1dOKCBleGMgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4ODU6ICAvKiBTQ0FOQ1RSTCAqLwotICAgICAgICAgIEluc19TQ0FOQ1RSTCggRVhFQ19BUkdfIGFyZ3MgKTsKKyAgICAgICAgICBJbnNfU0NBTkNUUkwoIGV4YywgYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgMHg4NjogIC8qIFNEUFZUTCAqLwotICAgICAgICBjYXNlIDB4ODc6ICAvKiBTRFBWVEwgKi8KLSAgICAgICAgICBJbnNfU0RQVlRMKCBFWEVDX0FSR18gYXJncyApOworICAgICAgICBjYXNlIDB4ODY6ICAvKiBTRFB2VEwgKi8KKyAgICAgICAgY2FzZSAweDg3OiAgLyogU0RQdlRMICovCisgICAgICAgICAgSW5zX1NEUFZUTCggZXhjLCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDg4OiAgLyogR0VUSU5GTyAqLwotICAgICAgICAgIEluc19HRVRJTkZPKCBFWEVDX0FSR18gYXJncyApOworICAgICAgICAgIEluc19HRVRJTkZPKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4ODk6ICAvKiBJREVGICovCi0gICAgICAgICAgSW5zX0lERUYoIEVYRUNfQVJHXyBhcmdzICk7CisgICAgICAgICAgSW5zX0lERUYoIGV4YywgYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHg4QTogIC8qIFJPTEwgKi8KLSAgICAgICAgICBJbnNfUk9MTCggRVhFQ19BUkdfIGFyZ3MgKTsKKyAgICAgICAgICBJbnNfUk9MTCggYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHg4QjogIC8qIE1BWCAqLwotICAgICAgICAgIERPX01BWAorICAgICAgICAgIEluc19NQVgoIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4OEM6ICAvKiBNSU4gKi8KLSAgICAgICAgICBET19NSU4KKyAgICAgICAgICBJbnNfTUlOKCBhcmdzICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDhEOiAgLyogU0NBTlRZUEUgKi8KLSAgICAgICAgICBJbnNfU0NBTlRZUEUoIEVYRUNfQVJHXyBhcmdzICk7CisgICAgICAgICAgSW5zX1NDQU5UWVBFKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDB4OEU6ICAvKiBJTlNUQ1RSTCAqLwotICAgICAgICAgIEluc19JTlNUQ1RSTCggRVhFQ19BUkdfIGFyZ3MgKTsKKyAgICAgICAgICBJbnNfSU5TVENUUkwoIGV4YywgYXJncyApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMHg4RjoKLSAgICAgICAgICBJbnNfVU5LTk9XTiggRVhFQ19BUkdfIGFyZ3MgKTsKKyAgICAgICAgICBJbnNfVU5LTk9XTiggZXhjICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICBpZiAoIG9wY29kZSA+PSAweEUwICkKLSAgICAgICAgICAgIEluc19NSVJQKCBFWEVDX0FSR18gYXJncyApOworICAgICAgICAgICAgSW5zX01JUlAoIGV4YywgYXJncyApOwogICAgICAgICAgIGVsc2UgaWYgKCBvcGNvZGUgPj0gMHhDMCApCi0gICAgICAgICAgICBJbnNfTURSUCggRVhFQ19BUkdfIGFyZ3MgKTsKKyAgICAgICAgICAgIEluc19NRFJQKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBlbHNlIGlmICggb3Bjb2RlID49IDB4QjggKQotICAgICAgICAgICAgSW5zX1BVU0hXKCBFWEVDX0FSR18gYXJncyApOworICAgICAgICAgICAgSW5zX1BVU0hXKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBlbHNlIGlmICggb3Bjb2RlID49IDB4QjAgKQotICAgICAgICAgICAgSW5zX1BVU0hCKCBFWEVDX0FSR18gYXJncyApOworICAgICAgICAgICAgSW5zX1BVU0hCKCBleGMsIGFyZ3MgKTsKICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBJbnNfVU5LTk9XTiggRVhFQ19BUkdfIGFyZ3MgKTsKKyAgICAgICAgICAgIEluc19VTktOT1dOKCBleGMgKTsKICAgICAgICAgfQotCiAgICAgICB9CiAKLSNlbHNlCi0KLSAgICAgIEluc3RydWN0X0Rpc3BhdGNoW0NVUi5vcGNvZGVdKCBFWEVDX0FSR18gJkNVUi5zdGFja1tDVVIuYXJnc10gKTsKLQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fSU5URVJQUkVURVJfU1dJVENIICovCi0KLSAgICAgIGlmICggQ1VSLmVycm9yICkKKyAgICAgIGlmICggZXhjLT5lcnJvciApCiAgICAgICB7Ci0gICAgICAgIHN3aXRjaCAoIENVUi5lcnJvciApCisgICAgICAgIHN3aXRjaCAoIGV4Yy0+ZXJyb3IgKQogICAgICAgICB7CiAgICAgICAgICAgLyogbG9va2luZyBmb3IgcmVkZWZpbmVkIGluc3RydWN0aW9ucyAqLwogICAgICAgICBjYXNlIEZUX0VSUiggSW52YWxpZF9PcGNvZGUgKToKICAgICAgICAgICB7Ci0gICAgICAgICAgICBUVF9EZWZSZWNvcmQqICBkZWYgICA9IENVUi5JRGVmczsKLSAgICAgICAgICAgIFRUX0RlZlJlY29yZCogIGxpbWl0ID0gZGVmICsgQ1VSLm51bUlEZWZzOworICAgICAgICAgICAgVFRfRGVmUmVjb3JkKiAgZGVmICAgPSBleGMtPklEZWZzOworICAgICAgICAgICAgVFRfRGVmUmVjb3JkKiAgbGltaXQgPSBkZWYgKyBleGMtPm51bUlEZWZzOwogCiAKICAgICAgICAgICAgIGZvciAoIDsgZGVmIDwgbGltaXQ7IGRlZisrICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCBkZWYtPmFjdGl2ZSAmJiBDVVIub3Bjb2RlID09IChGVF9CeXRlKWRlZi0+b3BjICkKKyAgICAgICAgICAgICAgaWYgKCBkZWYtPmFjdGl2ZSAmJiBleGMtPm9wY29kZSA9PSAoRlRfQnl0ZSlkZWYtPm9wYyApCiAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBUVF9DYWxsUmVjKiAgY2FsbHJlYzsKIAogCi0gICAgICAgICAgICAgICAgaWYgKCBDVVIuY2FsbFRvcCA+PSBDVVIuY2FsbFNpemUgKQorICAgICAgICAgICAgICAgIGlmICggZXhjLT5jYWxsVG9wID49IGV4Yy0+Y2FsbFNpemUgKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIENVUi5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOworICAgICAgICAgICAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwogICAgICAgICAgICAgICAgICAgZ290byBMRXJyb3JMYWJlbF87CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgY2FsbHJlYyA9ICZDVVIuY2FsbFN0YWNrW0NVUi5jYWxsVG9wXTsKKyAgICAgICAgICAgICAgICBjYWxscmVjID0gJmV4Yy0+Y2FsbFN0YWNrW2V4Yy0+Y2FsbFRvcF07CiAKLSAgICAgICAgICAgICAgICBjYWxscmVjLT5DYWxsZXJfUmFuZ2UgPSBDVVIuY3VyUmFuZ2U7Ci0gICAgICAgICAgICAgICAgY2FsbHJlYy0+Q2FsbGVyX0lQICAgID0gQ1VSLklQICsgMTsKKyAgICAgICAgICAgICAgICBjYWxscmVjLT5DYWxsZXJfUmFuZ2UgPSBleGMtPmN1clJhbmdlOworICAgICAgICAgICAgICAgIGNhbGxyZWMtPkNhbGxlcl9JUCAgICA9IGV4Yy0+SVAgKyAxOwogICAgICAgICAgICAgICAgIGNhbGxyZWMtPkN1cl9Db3VudCAgICA9IDE7CiAgICAgICAgICAgICAgICAgY2FsbHJlYy0+RGVmICAgICAgICAgID0gZGVmOwogCi0gICAgICAgICAgICAgICAgaWYgKCBJTlNfR290b19Db2RlUmFuZ2UoIGRlZi0+cmFuZ2UsIGRlZi0+c3RhcnQgKSA9PSBGQUlMVVJFICkKKyAgICAgICAgICAgICAgICBpZiAoIEluc19Hb3RvX0NvZGVSYW5nZSggZXhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYtPnJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYtPnN0YXJ0ICkgPT0gRkFJTFVSRSApCiAgICAgICAgICAgICAgICAgICBnb3RvIExFcnJvckxhYmVsXzsKIAogICAgICAgICAgICAgICAgIGdvdG8gTFN1aXRlTGFiZWxfOwpAQCAtODk0Myw3ICs4MjA1LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAKLSAgICAgICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9PcGNvZGUgKTsKKyAgICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfT3Bjb2RlICk7CiAgICAgICAgICAgZ290byBMRXJyb3JMYWJlbF87CiAKICNpZiAwCkBAIC04OTYxLDEwICs4MjIzLDEwIEBACiAgICAgICAgIH0KICAgICAgIH0KIAotICAgICAgQ1VSLnRvcCA9IENVUi5uZXdfdG9wOworICAgICAgZXhjLT50b3AgPSBleGMtPm5ld190b3A7CiAKLSAgICAgIGlmICggQ1VSLnN0ZXBfaW5zICkKLSAgICAgICAgQ1VSLklQICs9IENVUi5sZW5ndGg7CisgICAgICBpZiAoIGV4Yy0+c3RlcF9pbnMgKQorICAgICAgICBleGMtPklQICs9IGV4Yy0+bGVuZ3RoOwogCiAgICAgICAvKiBpbmNyZW1lbnQgaW5zdHJ1Y3Rpb24gY291bnRlciBhbmQgY2hlY2sgaWYgd2UgZGlkbid0ICovCiAgICAgICAvKiBydW4gdGhpcyBwcm9ncmFtIGZvciB0b28gbG9uZyAoZS5nLiBpbmZpbml0ZSBsb29wcykuICovCkBAIC04OTcyLDQ4ICs4MjM0LDM4IEBACiAgICAgICAgIHJldHVybiBGVF9USFJPVyggRXhlY3V0aW9uX1Rvb19Mb25nICk7CiAKICAgICBMU3VpdGVMYWJlbF86Ci0gICAgICBpZiAoIENVUi5JUCA+PSBDVVIuY29kZVNpemUgKQorICAgICAgaWYgKCBleGMtPklQID49IGV4Yy0+Y29kZVNpemUgKQogICAgICAgewotICAgICAgICBpZiAoIENVUi5jYWxsVG9wID4gMCApCisgICAgICAgIGlmICggZXhjLT5jYWxsVG9wID4gMCApCiAgICAgICAgIHsKLSAgICAgICAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggQ29kZV9PdmVyZmxvdyApOworICAgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggQ29kZV9PdmVyZmxvdyApOwogICAgICAgICAgIGdvdG8gTEVycm9yTGFiZWxfOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgICBnb3RvIExOb19FcnJvcl87CiAgICAgICB9Ci0gICAgfSB3aGlsZSAoICFDVVIuaW5zdHJ1Y3Rpb25fdHJhcCApOworICAgIH0gd2hpbGUgKCAhZXhjLT5pbnN0cnVjdGlvbl90cmFwICk7CiAKICAgTE5vX0Vycm9yXzoKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1RBVElDX1JBU1RFUgotICAgICpleGMgPSBjdXI7Ci0jZW5kaWYKLQogICAgIHJldHVybiBGVF9FcnJfT2s7CiAKICAgTEVycm9yQ29kZU92ZXJmbG93XzoKLSAgICBDVVIuZXJyb3IgPSBGVF9USFJPVyggQ29kZV9PdmVyZmxvdyApOworICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggQ29kZV9PdmVyZmxvdyApOwogCiAgIExFcnJvckxhYmVsXzoKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1RBVElDX1JBU1RFUgotICAgICpleGMgPSBjdXI7Ci0jZW5kaWYKLQogICAgIC8qIElmIGFueSBlcnJvcnMgaGF2ZSBvY2N1cnJlZCwgZnVuY3Rpb24gdGFibGVzIG1heSBiZSBicm9rZW4uICovCiAgICAgLyogRm9yY2UgYSByZS1leGVjdXRpb24gb2YgYHByZXAnIGFuZCBgZnBnbScgdGFibGVzIGlmIG5vICAgICAgKi8KICAgICAvKiBieXRlY29kZSBkZWJ1Z2dlciBpcyBydW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggQ1VSLmVycm9yCi0gICAgICAgICAmJiAhQ1VSLmluc3RydWN0aW9uX3RyYXAKLSAgICAgICAgICYmIENVUi5jdXJSYW5nZSA9PSB0dF9jb2RlcmFuZ2VfZ2x5cGggKQorICAgIGlmICggZXhjLT5lcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICFleGMtPmluc3RydWN0aW9uX3RyYXAgICAgICAgICAgICAgICYmCisgICAgICAgICBleGMtPmN1clJhbmdlID09IHR0X2NvZGVyYW5nZV9nbHlwaCApCiAgICAgewotICAgICAgRlRfVFJBQ0UxKCggIiAgVGhlIGludGVycHJldGVyIHJldHVybmVkIGVycm9yIDB4JXhcbiIsIENVUi5lcnJvciApKTsKKyAgICAgIEZUX1RSQUNFMSgoICIgIFRoZSBpbnRlcnByZXRlciByZXR1cm5lZCBlcnJvciAweCV4XG4iLCBleGMtPmVycm9yICkpOwogICAgICAgZXhjLT5zaXplLT5ieXRlY29kZV9yZWFkeSA9IC0xOwogICAgICAgZXhjLT5zaXplLT5jdnRfcmVhZHkgICAgICA9IC0xOwogICAgIH0KIAotICAgIHJldHVybiBDVVIuZXJyb3I7CisgICAgcmV0dXJuIGV4Yy0+ZXJyb3I7CiAgIH0KIAogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dGludGVycC5oCmluZGV4IDMzM2RlY2MuLjMyNzA2ZDAgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dGludGVycC5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dGludGVycC5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFRydWVUeXBlIGJ5dGVjb2RlIGludGVycHJldGVyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDcsIDIwMTAsIDIwMTItMjAxNCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC0yNiwyMyArMjYsNiBAQAogRlRfQkVHSU5fSEVBREVSCiAKIAotI2lmbmRlZiBUVF9DT05GSUdfT1BUSU9OX1NUQVRJQ19JTlRFUlBSRVRFUiAvKiBpbmRpcmVjdCBpbXBsZW1lbnRhdGlvbiAqLwotCi0jZGVmaW5lIEVYRUNfT1BfICAgVFRfRXhlY0NvbnRleHQgIGV4YywKLSNkZWZpbmUgRVhFQ19PUCAgICBUVF9FeGVjQ29udGV4dCAgZXhjCi0jZGVmaW5lIEVYRUNfQVJHXyAgZXhjLAotI2RlZmluZSBFWEVDX0FSRyAgIGV4YwotCi0jZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXRpYyBpbXBsZW1lbnRhdGlvbiAqLwotCi0jZGVmaW5lIEVYRUNfT1BfICAgLyogdm9pZCAqLwotI2RlZmluZSBFWEVDX09QICAgIC8qIHZvaWQgKi8KLSNkZWZpbmUgRVhFQ19BUkdfICAvKiB2b2lkICovCi0jZGVmaW5lIEVYRUNfQVJHICAgLyogdm9pZCAqLwotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVEFUSUNfSU5URVJQUkVURVIgKi8KLQotCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogUm91bmRpbmcgbW9kZSBjb25zdGFudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02NywzMyArNTAsMzggQEAKIAogICAvKiBSb3VuZGluZyBmdW5jdGlvbiAqLwogICB0eXBlZGVmIEZUX0YyNkRvdDYKLSAgKCpUVF9Sb3VuZF9GdW5jKSggRVhFQ19PUF8gRlRfRjI2RG90NiAgZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIGNvbXBlbnNhdGlvbiApOworICAoKlRUX1JvdW5kX0Z1bmMpKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgZGlzdGFuY2UsCisgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBjb21wZW5zYXRpb24gKTsKIAogICAvKiBQb2ludCBkaXNwbGFjZW1lbnQgYWxvbmcgdGhlIGZyZWVkb20gdmVjdG9yIHJvdXRpbmUgKi8KICAgdHlwZWRlZiB2b2lkCi0gICgqVFRfTW92ZV9GdW5jKSggRVhFQ19PUF8gVFRfR2x5cGhab25lICB6b25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICBkaXN0YW5jZSApOworICAoKlRUX01vdmVfRnVuYykoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICAgICAgICAgVFRfR2x5cGhab25lICAgIHpvbmUsCisgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgIHBvaW50LAorICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBkaXN0YW5jZSApOwogCiAgIC8qIERpc3RhbmNlIHByb2plY3Rpb24gYWxvbmcgb25lIG9mIHRoZSBwcm9qZWN0aW9uIHZlY3RvcnMgKi8KICAgdHlwZWRlZiBGVF9GMjZEb3Q2Ci0gICgqVFRfUHJvamVjdF9GdW5jKSggRVhFQ19PUF8gRlRfUG9zICAgZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgZHkgKTsKKyAgKCpUVF9Qcm9qZWN0X0Z1bmMpKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgICBkeCwKKyAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICAgZHkgKTsKIAogICAvKiBnZXR0aW5nIGN1cnJlbnQgcHBlbS4gIFRha2UgY2FyZSBvZiBub24tc3F1YXJlIHBpeGVscyBpZiBuZWNlc3NhcnkgKi8KICAgdHlwZWRlZiBGVF9Mb25nCi0gICgqVFRfQ3VyX1BwZW1fRnVuYykoIEVYRUNfT1AgKTsKKyAgKCpUVF9DdXJfUHBlbV9GdW5jKSggVFRfRXhlY0NvbnRleHQgIGV4YyApOwogCiAgIC8qIHJlYWRpbmcgYSBjdnQgdmFsdWUuICBUYWtlIGNhcmUgb2Ygbm9uLXNxdWFyZSBwaXhlbHMgaWYgbmVjZXNzYXJ5ICovCiAgIHR5cGVkZWYgRlRfRjI2RG90NgotICAoKlRUX0dldF9DVlRfRnVuYykoIEVYRUNfT1BfIEZUX1VMb25nICBpZHggKTsKKyAgKCpUVF9HZXRfQ1ZUX0Z1bmMpKCBUVF9FeGVjQ29udGV4dCAgZXhjLAorICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICBpZHggKTsKIAogICAvKiBzZXR0aW5nIG9yIG1vdmluZyBhIGN2dCB2YWx1ZS4gIFRha2UgY2FyZSBvZiBub24tc3F1YXJlIHBpeGVscyAgKi8KICAgLyogaWYgbmVjZXNzYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIHR5cGVkZWYgdm9pZAotICAoKlRUX1NldF9DVlRfRnVuYykoIEVYRUNfT1BfIEZUX1VMb25nICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICB2YWx1ZSApOworICAoKlRUX1NldF9DVlRfRnVuYykoIFRUX0V4ZWNDb250ZXh0ICBleGMsCisgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgIGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgdmFsdWUgKTsKIAogCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTcwLDExICsxNTgsMTEgQEAKIAogICAgIEZUX0xvbmcgICAgICAgICAgICB0b3A7ICAgICAgICAvKiB0b3Agb2YgZXhlYy4gc3RhY2sgICAqLwogCi0gICAgRlRfVUludCAgICAgICAgICAgIHN0YWNrU2l6ZTsgIC8qIHNpemUgb2YgZXhlYy4gc3RhY2sgICovCisgICAgRlRfTG9uZyAgICAgICAgICAgIHN0YWNrU2l6ZTsgIC8qIHNpemUgb2YgZXhlYy4gc3RhY2sgICovCiAgICAgRlRfTG9uZyogICAgICAgICAgIHN0YWNrOyAgICAgIC8qIGN1cnJlbnQgZXhlYy4gc3RhY2sgICovCiAKICAgICBGVF9Mb25nICAgICAgICAgICAgYXJnczsKLSAgICBGVF9VSW50ICAgICAgICAgICAgbmV3X3RvcDsgICAgLyogbmV3IHRvcCBhZnRlciBleGVjLiAgKi8KKyAgICBGVF9Mb25nICAgICAgICAgICAgbmV3X3RvcDsgICAgLyogbmV3IHRvcCBhZnRlciBleGVjLiAgKi8KIAogICAgIFRUX0dseXBoWm9uZVJlYyAgICB6cDAsICAgICAgICAvKiB6b25lIHJlY29yZHMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgenAxLApAQCAtMjY0LDE4ICsyNTIsMjIgQEAKICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKICAgICBUVF9Sb3VuZF9GdW5jICAgICAgZnVuY19yb3VuZF9zcGhuOyAgIC8qIHN1YnBpeGVsIHJvdW5kaW5nIGZ1bmN0aW9uICovCiAKLSAgICBGVF9Cb29sICAgICAgICAgICAgc3VicGl4ZWw7ICAgICAgICAgIC8qIFVzaW5nIHN1YnBpeGVsIGhpbnRpbmc/ICAgICAgICovCisgICAgRlRfQm9vbCAgICAgICAgICAgIHN1YnBpeGVsX2hpbnRpbmc7ICAvKiBVc2luZyBzdWJwaXhlbCBoaW50aW5nPyAgICAgICAqLwogICAgIEZUX0Jvb2wgICAgICAgICAgICBpZ25vcmVfeF9tb2RlOyAgICAgLyogU3RhbmRhcmQgcmVuZGVyaW5nIG1vZGUgZm9yICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1YnBpeGVsIGhpbnRpbmcuICBPbiBpZiBncmF5ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvciBzdWJwaXhlbCBoaW50aW5nIGlzIG9uLiAgICAqLwogCi0gICAgLyogVGhlIGZvbGxvd2luZyA0IGFyZW4ndCBmdWxseSBpbXBsZW1lbnRlZCBidXQgaGVyZSBmb3IgTVMgcmFzdGVyaXplciAqLworICAgIC8qIFRoZSBmb2xsb3dpbmcgNiBhcmVuJ3QgZnVsbHkgaW1wbGVtZW50ZWQgYnV0IGhlcmUgZm9yIE1TIHJhc3Rlcml6ZXIgKi8KICAgICAvKiBjb21wYXRpYmlsaXR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgRlRfQm9vbCAgICAgICAgICAgIGNvbXBhdGlibGVfd2lkdGhzOyAgICAgLyogY29tcGF0aWJsZSB3aWR0aHM/ICAgICAgICAqLwogICAgIEZUX0Jvb2wgICAgICAgICAgICBzeW1tZXRyaWNhbF9zbW9vdGhpbmc7IC8qIHN5bW1ldHJpY2FsX3Ntb290aGluZz8gICAgKi8KICAgICBGVF9Cb29sICAgICAgICAgICAgYmdyOyAgICAgICAgICAgICAgICAgICAvKiBiZ3IgaW5zdGVhZCBvZiByZ2I/ICAgICAgICovCisgICAgRlRfQm9vbCAgICAgICAgICAgIHZlcnRpY2FsX2xjZDsgICAgICAgICAgLyogbG9uZyBzaWRlIG9mIExDRCBzdWJwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlY3RhbmdsZXMgaXMgaG9yaXpvbnRhbCAgKi8KICAgICBGVF9Cb29sICAgICAgICAgICAgc3VicGl4ZWxfcG9zaXRpb25lZDsgICAvKiBzdWJwaXhlbCBwb3NpdGlvbmVkICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKERpcmVjdFdyaXRlIENsZWFyVHlwZSk/ICAqLworICAgIEZUX0Jvb2wgICAgICAgICAgICBncmF5X2NsZWFydHlwZTsgICAgICAgIC8qIENsZWFyVHlwZSBoaW50aW5nIGJ1dCAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBncmF5c2NhbGUgcmVuZGVyaW5nICAgICAgICovCiAKICAgICBGVF9JbnQgICAgICAgICAgICAgcmFzdGVyaXplcl92ZXJzaW9uOyAgICAvKiBNUyByYXN0ZXJpemVyIHZlcnNpb24gICAgICovCiAKQEAgLTMxNSw3ICszMDcsNyBAQAogICBGVF9MT0NBTCggRlRfRXJyb3IgKQogICBVcGRhdGVfTWF4KCBGVF9NZW1vcnkgIG1lbW9yeSwKICAgICAgICAgICAgICAgRlRfVUxvbmcqICBzaXplLAotICAgICAgICAgICAgICBGVF9Mb25nICAgIG11bHRpcGxpZXIsCisgICAgICAgICAgICAgIEZUX1VMb25nICAgbXVsdGlwbGllciwKICAgICAgICAgICAgICAgdm9pZCogICAgICBfcGJ1ZmYsCiAgICAgICAgICAgICAgIEZUX1VMb25nICAgbmV3X21heCApOwogI2VuZGlmIC8qIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwpAQCAtMzM5LDYgKzMzMSw3IEBACiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgT25seSB0aGUgZ2x5cGggbG9hZGVyIGFuZCBkZWJ1Z2dlciBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uLiAgICAgICovCisgIC8qICAgIChBbmQgcmlnaHQgbm93IG9ubHkgdGhlIGdseXBoIGxvYWRlciB1c2VzIGl0LikgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgRlRfRVhQT1JUKCBUVF9FeGVjQ29udGV4dCApCiAgIFRUX05ld19Db250ZXh0KCBUVF9Ecml2ZXIgIGRyaXZlciApOwpAQCAtMzU4LDggKzM1MSw3IEBACiAgICAgICAgICAgICAgICAgICAgVFRfU2l6ZSAgICAgICAgIGlucyApOwogCiAgIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFRUX1J1bl9Db250ZXh0KCBUVF9FeGVjQ29udGV4dCAgZXhlYywKLSAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICBkZWJ1ZyApOworICBUVF9SdW5fQ29udGV4dCggVFRfRXhlY0NvbnRleHQgIGV4ZWMgKTsKICNlbmRpZiAvKiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIgKi8KIAogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRvYmpzLmMKaW5kZXggYTczNTI5ZC4uNjA2MGQ2ZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0b2Jqcy5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dG9ianMuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBPYmplY3RzIG1hbmFnZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtMTkxLDcgKzE5MSw3IEBACiAgIHsKICAgICBGVF9FcnJvciAgIGVycm9yOwogICAgIEZUX1VJbnQzMiAgY2hlY2tzdW0gPSAwOwotICAgIGludCAgICAgICAgaTsKKyAgICBGVF9VSW50ICAgIGk7CiAKIAogICAgIGlmICggRlRfRlJBTUVfRU5URVIoIGxlbmd0aCApICkKQEAgLTIwMCw4ICsyMDAsOCBAQAogICAgIGZvciAoIDsgbGVuZ3RoID4gMzsgbGVuZ3RoIC09IDQgKQogICAgICAgY2hlY2tzdW0gKz0gKEZUX1VJbnQzMilGVF9HRVRfVUxPTkcoKTsKIAotICAgIGZvciAoIGkgPSAzOyBsZW5ndGggPiAwOyBsZW5ndGggLS0sIGktLSApCi0gICAgICBjaGVja3N1bSArPSAoRlRfVUludDMyKSggRlRfR0VUX0JZVEUoKSA8PCAoIGkgKiA4ICkgKTsKKyAgICBmb3IgKCBpID0gMzsgbGVuZ3RoID4gMDsgbGVuZ3RoLS0sIGktLSApCisgICAgICBjaGVja3N1bSArPSAoRlRfVUludDMyKUZUX0dFVF9CWVRFKCkgPDwgKCBpICogOCApOwogCiAgICAgRlRfRlJBTUVfRVhJVCgpOwogCkBAIC0yNTYsODkgKzI1Niw4OSBAQAogI2RlZmluZSBUUklDS19TRk5UX0lEX3ByZXAgIDIKIAogICAgICAgeyAvKiBNaW5nTGlVIDE5OTUgKi8KLSAgICAgICAgeyAweDA1YmNmMDU4LCAweDAwMDAwMmU0IH0sIC8qIGN2dCAgKi8KLSAgICAgICAgeyAweDI4MjMzYmYxLCAweDAwMDA4N2M0IH0sIC8qIGZwZ20gKi8KLSAgICAgICAgeyAweGEzNDRhMWVhLCAweDAwMDAwMWUxIH0gIC8qIHByZXAgKi8KKyAgICAgICAgeyAweDA1QkNGMDU4VUwsIDB4MDAwMDAyRTRVTCB9LCAvKiBjdnQgICovCisgICAgICAgIHsgMHgyODIzM0JGMVVMLCAweDAwMDA4N0M0VUwgfSwgLyogZnBnbSAqLworICAgICAgICB7IDB4QTM0NEExRUFVTCwgMHgwMDAwMDFFMVVMIH0gIC8qIHByZXAgKi8KICAgICAgIH0sCiAgICAgICB7IC8qIE1pbmdMaVUgMTk5Ni0gKi8KLSAgICAgICAgeyAweDA1YmNmMDU4LCAweDAwMDAwMmU0IH0sIC8qIGN2dCAgKi8KLSAgICAgICAgeyAweDI4MjMzYmYxLCAweDAwMDA4N2M0IH0sIC8qIGZwZ20gKi8KLSAgICAgICAgeyAweGEzNDRhMWViLCAweDAwMDAwMWUxIH0gIC8qIHByZXAgKi8KKyAgICAgICAgeyAweDA1QkNGMDU4VUwsIDB4MDAwMDAyRTRVTCB9LCAvKiBjdnQgICovCisgICAgICAgIHsgMHgyODIzM0JGMVVMLCAweDAwMDA4N0M0VUwgfSwgLyogZnBnbSAqLworICAgICAgICB7IDB4QTM0NEExRUJVTCwgMHgwMDAwMDFFMVVMIH0gIC8qIHByZXAgKi8KICAgICAgIH0sCiAgICAgICB7IC8qIERGS2FpU2h1ICovCi0gICAgICAgIHsgMHgxMWU1ZWFkNCwgMHgwMDAwMDM1MCB9LCAvKiBjdnQgICovCi0gICAgICAgIHsgMHg1YTMwY2EzYiwgMHgwMDAwOTA2MyB9LCAvKiBmcGdtICovCi0gICAgICAgIHsgMHgxM2E0MjYwMiwgMHgwMDAwMDA3ZSB9ICAvKiBwcmVwICovCisgICAgICAgIHsgMHgxMUU1RUFENFVMLCAweDAwMDAwMzUwVUwgfSwgLyogY3Z0ICAqLworICAgICAgICB7IDB4NUEzMENBM0JVTCwgMHgwMDAwOTA2M1VMIH0sIC8qIGZwZ20gKi8KKyAgICAgICAgeyAweDEzQTQyNjAyVUwsIDB4MDAwMDAwN0VVTCB9ICAvKiBwcmVwICovCiAgICAgICB9LAogICAgICAgeyAvKiBIdWFUaWFuS2FpVGkgKi8KLSAgICAgICAgeyAweGZmZmJmZmZjLCAweDAwMDAwMDA4IH0sIC8qIGN2dCAgKi8KLSAgICAgICAgeyAweDljOWU0OGI4LCAweDAwMDBiZWEyIH0sIC8qIGZwZ20gKi8KLSAgICAgICAgeyAweDcwMDIwMTEyLCAweDAwMDAwMDA4IH0gIC8qIHByZXAgKi8KKyAgICAgICAgeyAweEZGRkJGRkZDVUwsIDB4MDAwMDAwMDhVTCB9LCAvKiBjdnQgICovCisgICAgICAgIHsgMHg5QzlFNDhCOFVMLCAweDAwMDBCRUEyVUwgfSwgLyogZnBnbSAqLworICAgICAgICB7IDB4NzAwMjAxMTJVTCwgMHgwMDAwMDAwOFVMIH0gIC8qIHByZXAgKi8KICAgICAgIH0sCiAgICAgICB7IC8qIEh1YVRpYW5Tb25nVGkgKi8KLSAgICAgICAgeyAweGZmZmJmZmZjLCAweDAwMDAwMDA4IH0sIC8qIGN2dCAgKi8KLSAgICAgICAgeyAweDBhNWEwNDgzLCAweDAwMDE3YzM5IH0sIC8qIGZwZ20gKi8KLSAgICAgICAgeyAweDcwMDIwMTEyLCAweDAwMDAwMDA4IH0gIC8qIHByZXAgKi8KKyAgICAgICAgeyAweEZGRkJGRkZDVUwsIDB4MDAwMDAwMDhVTCB9LCAvKiBjdnQgICovCisgICAgICAgIHsgMHgwQTVBMDQ4M1VMLCAweDAwMDE3QzM5VUwgfSwgLyogZnBnbSAqLworICAgICAgICB7IDB4NzAwMjAxMTJVTCwgMHgwMDAwMDAwOFVMIH0gIC8qIHByZXAgKi8KICAgICAgIH0sCiAgICAgICB7IC8qIE5FQyBmYWRwb3A3LnR0ZiAqLwotICAgICAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwgLyogY3Z0ICAqLwotICAgICAgICB7IDB4NDBjOTI1NTUsIDB4MDAwMDAwZTUgfSwgLyogZnBnbSAqLwotICAgICAgICB7IDB4YTM5YjU4ZTMsIDB4MDAwMDExN2MgfSAgLyogcHJlcCAqLworICAgICAgICB7IDB4MDAwMDAwMDBVTCwgMHgwMDAwMDAwMFVMIH0sIC8qIGN2dCAgKi8KKyAgICAgICAgeyAweDQwQzkyNTU1VUwsIDB4MDAwMDAwRTVVTCB9LCAvKiBmcGdtICovCisgICAgICAgIHsgMHhBMzlCNThFM1VMLCAweDAwMDAxMTdDVUwgfSAgLyogcHJlcCAqLwogICAgICAgfSwKICAgICAgIHsgLyogTkVDIGZhZHJlaTUudHRmICovCi0gICAgICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LCAvKiBjdnQgICovCi0gICAgICAgIHsgMHgzM2M0MTY1MiwgMHgwMDAwMDBlNSB9LCAvKiBmcGdtICovCi0gICAgICAgIHsgMHgyNmQ2YzUyYSwgMHgwMDAwMGY2YSB9ICAvKiBwcmVwICovCisgICAgICAgIHsgMHgwMDAwMDAwMFVMLCAweDAwMDAwMDAwVUwgfSwgLyogY3Z0ICAqLworICAgICAgICB7IDB4MzNDNDE2NTJVTCwgMHgwMDAwMDBFNVVMIH0sIC8qIGZwZ20gKi8KKyAgICAgICAgeyAweDI2RDZDNTJBVUwsIDB4MDAwMDBGNkFVTCB9ICAvKiBwcmVwICovCiAgICAgICB9LAogICAgICAgeyAvKiBORUMgZmFuZ290Ny50dGYgKi8KLSAgICAgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0sIC8qIGN2dCAgKi8KLSAgICAgICAgeyAweDZkYjE2NTFkLCAweDAwMDAwMTlkIH0sIC8qIGZwZ20gKi8KLSAgICAgICAgeyAweDZjNmU0YjAzLCAweDAwMDAyNDkyIH0gIC8qIHByZXAgKi8KKyAgICAgICAgeyAweDAwMDAwMDAwVUwsIDB4MDAwMDAwMDBVTCB9LCAvKiBjdnQgICovCisgICAgICAgIHsgMHg2REIxNjUxRFVMLCAweDAwMDAwMTlEVUwgfSwgLyogZnBnbSAqLworICAgICAgICB7IDB4NkM2RTRCMDNVTCwgMHgwMDAwMjQ5MlVMIH0gIC8qIHByZXAgKi8KICAgICAgIH0sCiAgICAgICB7IC8qIE5FQyBmYW5neW81LnR0ZiAqLwotICAgICAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwgLyogY3Z0ICAqLwotICAgICAgICB7IDB4NDBjOTI1NTUsIDB4MDAwMDAwZTUgfSwgLyogZnBnbSAqLwotICAgICAgICB7IDB4ZGU1MWZhZDAsIDB4MDAwMDExN2MgfSAgLyogcHJlcCAqLworICAgICAgICB7IDB4MDAwMDAwMDBVTCwgMHgwMDAwMDAwMFVMIH0sIC8qIGN2dCAgKi8KKyAgICAgICAgeyAweDQwQzkyNTU1VUwsIDB4MDAwMDAwRTVVTCB9LCAvKiBmcGdtICovCisgICAgICAgIHsgMHhERTUxRkFEMFVMLCAweDAwMDAxMTdDVUwgfSAgLyogcHJlcCAqLwogICAgICAgfSwKICAgICAgIHsgLyogTkVDIGZhbmt5bzUudHRmICovCi0gICAgICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LCAvKiBjdnQgICovCi0gICAgICAgIHsgMHg4NWU0NzY2NCwgMHgwMDAwMDBlNSB9LCAvKiBmcGdtICovCi0gICAgICAgIHsgMHhhNmM2MjgzMSwgMHgwMDAwMWNhYSB9ICAvKiBwcmVwICovCisgICAgICAgIHsgMHgwMDAwMDAwMFVMLCAweDAwMDAwMDAwVUwgfSwgLyogY3Z0ICAqLworICAgICAgICB7IDB4ODVFNDc2NjRVTCwgMHgwMDAwMDBFNVVMIH0sIC8qIGZwZ20gKi8KKyAgICAgICAgeyAweEE2QzYyODMxVUwsIDB4MDAwMDFDQUFVTCB9ICAvKiBwcmVwICovCiAgICAgICB9LAogICAgICAgeyAvKiBORUMgZmFucmdvNS50dGYgKi8KLSAgICAgICAgeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0sIC8qIGN2dCAgKi8KLSAgICAgICAgeyAweDJkODkxY2ZkLCAweDAwMDAwMTlkIH0sIC8qIGZwZ20gKi8KLSAgICAgICAgeyAweGEwNjA0NjMzLCAweDAwMDAxZGU4IH0gIC8qIHByZXAgKi8KKyAgICAgICAgeyAweDAwMDAwMDAwVUwsIDB4MDAwMDAwMDBVTCB9LCAvKiBjdnQgICovCisgICAgICAgIHsgMHgyRDg5MUNGRFVMLCAweDAwMDAwMTlEVUwgfSwgLyogZnBnbSAqLworICAgICAgICB7IDB4QTA2MDQ2MzNVTCwgMHgwMDAwMURFOFVMIH0gIC8qIHByZXAgKi8KICAgICAgIH0sCiAgICAgICB7IC8qIE5FQyBmYW5nb3Q1LnR0YyAqLwotICAgICAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwgLyogY3Z0ICAqLwotICAgICAgICB7IDB4NDBhYTc3NGMsIDB4MDAwMDAxY2IgfSwgLyogZnBnbSAqLwotICAgICAgICB7IDB4OWI1Y2FhOTYsIDB4MDAwMDFmOWEgfSAgLyogcHJlcCAqLworICAgICAgICB7IDB4MDAwMDAwMDBVTCwgMHgwMDAwMDAwMFVMIH0sIC8qIGN2dCAgKi8KKyAgICAgICAgeyAweDQwQUE3NzRDVUwsIDB4MDAwMDAxQ0JVTCB9LCAvKiBmcGdtICovCisgICAgICAgIHsgMHg5QjVDQUE5NlVMLCAweDAwMDAxRjlBVUwgfSAgLyogcHJlcCAqLwogICAgICAgfSwKICAgICAgIHsgLyogTkVDIGZhbm1pbjMudHRjICovCi0gICAgICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LCAvKiBjdnQgICovCi0gICAgICAgIHsgMHgwZDNkZTljYiwgMHgwMDAwMDE0MSB9LCAvKiBmcGdtICovCi0gICAgICAgIHsgMHhkNDEyNzc2NiwgMHgwMDAwMjI4MCB9ICAvKiBwcmVwICovCisgICAgICAgIHsgMHgwMDAwMDAwMFVMLCAweDAwMDAwMDAwVUwgfSwgLyogY3Z0ICAqLworICAgICAgICB7IDB4MEQzREU5Q0JVTCwgMHgwMDAwMDE0MVVMIH0sIC8qIGZwZ20gKi8KKyAgICAgICAgeyAweEQ0MTI3NzY2VUwsIDB4MDAwMDIyODBVTCB9ICAvKiBwcmVwICovCiAgICAgICB9LAogICAgICAgeyAvKiBORUMgRkEtR290aGljLCAxOTk2ICovCi0gICAgICAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCB9LCAvKiBjdnQgICovCi0gICAgICAgIHsgMHg0YTY5MjY5OCwgMHgwMDAwMDFmMCB9LCAvKiBmcGdtICovCi0gICAgICAgIHsgMHgzNDBkNDM0NiwgMHgwMDAwMWZjYSB9ICAvKiBwcmVwICovCisgICAgICAgIHsgMHgwMDAwMDAwMFVMLCAweDAwMDAwMDAwVUwgfSwgLyogY3Z0ICAqLworICAgICAgICB7IDB4NEE2OTI2OThVTCwgMHgwMDAwMDFGMFVMIH0sIC8qIGZwZ20gKi8KKyAgICAgICAgeyAweDM0MEQ0MzQ2VUwsIDB4MDAwMDFGQ0FVTCB9ICAvKiBwcmVwICovCiAgICAgICB9LAogICAgICAgeyAvKiBORUMgRkEtTWluY2hvdSwgMTk5NiAqLwotICAgICAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwgLyogY3Z0ICAqLwotICAgICAgICB7IDB4Y2QzNGM2MDQsIDB4MDAwMDAxNjYgfSwgLyogZnBnbSAqLwotICAgICAgICB7IDB4NmNmMzEwNDYsIDB4MDAwMDIyYjAgfSAgLyogcHJlcCAqLworICAgICAgICB7IDB4MDAwMDAwMDBVTCwgMHgwMDAwMDAwMFVMIH0sIC8qIGN2dCAgKi8KKyAgICAgICAgeyAweENEMzRDNjA0VUwsIDB4MDAwMDAxNjZVTCB9LCAvKiBmcGdtICovCisgICAgICAgIHsgMHg2Q0YzMTA0NlVMLCAweDAwMDAyMkIwVUwgfSAgLyogcHJlcCAqLwogICAgICAgfSwKICAgICAgIHsgLyogTkVDIEZBLVJvdW5kR290aGljQiwgMTk5NiAqLwotICAgICAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwgLyogY3Z0ICAqLwotICAgICAgICB7IDB4NWRhNzUzMTUsIDB4MDAwMDAxOWQgfSwgLyogZnBnbSAqLwotICAgICAgICB7IDB4NDA3NDVhNWYsIDB4MDAwMDIyZTAgfSAgLyogcHJlcCAqLworICAgICAgICB7IDB4MDAwMDAwMDBVTCwgMHgwMDAwMDAwMFVMIH0sIC8qIGN2dCAgKi8KKyAgICAgICAgeyAweDVEQTc1MzE1VUwsIDB4MDAwMDAxOURVTCB9LCAvKiBmcGdtICovCisgICAgICAgIHsgMHg0MDc0NUE1RlVMLCAweDAwMDAyMkUwVUwgfSAgLyogcHJlcCAqLwogICAgICAgfSwKICAgICAgIHsgLyogTkVDIEZBLVJvdW5kR290aGljTSwgMTk5NiAqLwotICAgICAgICB7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAgfSwgLyogY3Z0ICAqLwotICAgICAgICB7IDB4ZjA1NWZjNDgsIDB4MDAwMDAxYzIgfSwgLyogZnBnbSAqLwotICAgICAgICB7IDB4MzkwMGRlZDMsIDB4MDAwMDFlMTggfSAgLyogcHJlcCAqLworICAgICAgICB7IDB4MDAwMDAwMDBVTCwgMHgwMDAwMDAwMFVMIH0sIC8qIGN2dCAgKi8KKyAgICAgICAgeyAweEYwNTVGQzQ4VUwsIDB4MDAwMDAxQzJVTCB9LCAvKiBmcGdtICovCisgICAgICAgIHsgMHgzOTAwREVEM1VMLCAweDAwMDAxRTE4VUwgfSAgLyogcHJlcCAqLwogICAgICAgfQogICAgIH07CiAKQEAgLTQ5MCw3ICs0OTAsMTAgQEAKICAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgIHN0cmVhbSAgICAgOjogVGhlIHNvdXJjZSBmb250IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGZvbnQgZmFjZSBpbiB0aGUgcmVzb3VyY2UuICAgICAgICAgICovCisgIC8qICAgIGZhY2VfaW5kZXggOjogVGhlIGluZGV4IG9mIHRoZSBUcnVlVHlwZSBmb250LCBpZiB3ZSBhcmUgb3BlbmluZyBhICAqLworICAvKiAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24sIGluIGJpdHMgMC0xNS4gIFRoZSBudW1iZXJlZCBpbnN0YW5jZSAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICBpbmRleH4rfjEgb2YgYSBHWCAoc3ViKWZvbnQsIGlmIGFwcGxpY2FibGUsIGluIGJpdHMgICovCisgIC8qICAgICAgICAgICAgICAgICAgMTYtMzAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgbnVtX3BhcmFtcyA6OiBOdW1iZXIgb2YgYWRkaXRpb25hbCBnZW5lcmljIHBhcmFtZXRlcnMuICBJZ25vcmVkLiAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTk5LDcgKzYwMiw3IEBACiAgICAgICAgIHR0ZmFjZS0+ZmFjZV9mbGFncyAmPSB+RlRfRkFDRV9GTEFHX1NDQUxBQkxFOwogICAgICAgfQogCi0jZWxzZQorI2Vsc2UgLyogIUZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwgKi8KIAogICAgICAgaWYgKCAhZXJyb3IgKQogICAgICAgICBlcnJvciA9IHR0X2ZhY2VfbG9hZF9sb2NhKCBmYWNlLCBzdHJlYW0gKTsKQEAgLTYyMywxMCArNjI2LDU2IEBACiAgICAgICAgIHR0ZmFjZS0+ZmFjZV9mbGFncyAmPSB+RlRfRkFDRV9GTEFHX1NDQUxBQkxFOwogICAgICAgfQogCi0jZW5kaWYKKyNlbmRpZiAvKiAhRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTCAqLwogCiAgICAgfQogCisjaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAorCisgICAgeworICAgICAgRlRfSW50ICBpbnN0YW5jZV9pbmRleCA9IGZhY2VfaW5kZXggPj4gMTY7CisKKworICAgICAgaWYgKCBGVF9IQVNfTVVMVElQTEVfTUFTVEVSUyggdHRmYWNlICkgJiYKKyAgICAgICAgICAgaW5zdGFuY2VfaW5kZXggPiAwICAgICAgICAgICAgICAgICkKKyAgICAgIHsKKyAgICAgICAgZXJyb3IgPSBUVF9HZXRfTU1fVmFyKCBmYWNlLCBOVUxMICk7CisgICAgICAgIGlmICggZXJyb3IgKQorICAgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgICBpZiAoIGZhY2UtPmJsZW5kLT5tbXZhci0+bmFtZWRzdHlsZSApCisgICAgICAgIHsKKyAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHR0ZmFjZS0+bWVtb3J5OworCisgICAgICAgICAgRlRfVmFyX05hbWVkX1N0eWxlKiAgbmFtZWRfc3R5bGU7CisgICAgICAgICAgRlRfU3RyaW5nKiAgICAgICAgICAgc3R5bGVfbmFtZTsKKworCisgICAgICAgICAgLyogaW4gYGZhY2VfaW5kZXgnLCB0aGUgaW5zdGFuY2UgaW5kZXggc3RhcnRzIHdpdGggdmFsdWUgMSAqLworICAgICAgICAgIG5hbWVkX3N0eWxlID0gZmFjZS0+YmxlbmQtPm1tdmFyLT5uYW1lZHN0eWxlICsgaW5zdGFuY2VfaW5kZXggLSAxOworICAgICAgICAgIGVycm9yID0gc2ZudC0+Z2V0X25hbWUoIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VTaG9ydCluYW1lZF9zdHlsZS0+c3RyaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0eWxlX25hbWUgKTsKKyAgICAgICAgICBpZiAoIGVycm9yICkKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgICAgIC8qIHNldCBzdHlsZSBuYW1lOyBpZiBhbHJlYWR5IHNldCwgcmVwbGFjZSBpdCAqLworICAgICAgICAgIGlmICggZmFjZS0+cm9vdC5zdHlsZV9uYW1lICkKKyAgICAgICAgICAgIEZUX0ZSRUUoIGZhY2UtPnJvb3Quc3R5bGVfbmFtZSApOworICAgICAgICAgIGZhY2UtPnJvb3Quc3R5bGVfbmFtZSA9IHN0eWxlX25hbWU7CisKKyAgICAgICAgICAvKiBmaW5hbGx5LCBzZWxlY3QgdGhlIG5hbWVkIGluc3RhbmNlICovCisgICAgICAgICAgZXJyb3IgPSBUVF9TZXRfVmFyX0Rlc2lnbiggZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5ibGVuZC0+bW12YXItPm51bV9heGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVkX3N0eWxlLT5jb29yZHMgKTsKKyAgICAgICAgICBpZiAoIGVycm9yICkKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQgKi8KKwogI2lmIGRlZmluZWQoIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HICAgICkgJiYgXAogICAgICFkZWZpbmVkKCBUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSICkKIApAQCAtNzUxLDE0ICs4MDAsNyBAQAogICAgIEZUX0Vycm9yICAgICAgICBlcnJvcjsKIAogCi0gICAgLyogZGVidWdnaW5nIGluc3RhbmNlcyBoYXZlIHRoZWlyIG93biBjb250ZXh0ICovCi0gICAgaWYgKCBzaXplLT5kZWJ1ZyApCi0gICAgICBleGVjID0gc2l6ZS0+Y29udGV4dDsKLSAgICBlbHNlCi0gICAgICBleGVjID0gKCAoVFRfRHJpdmVyKUZUX0ZBQ0VfRFJJVkVSKCBmYWNlICkgKS0+Y29udGV4dDsKLQotICAgIGlmICggIWV4ZWMgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDb3VsZF9Ob3RfRmluZF9Db250ZXh0ICk7CisgICAgZXhlYyA9IHNpemUtPmNvbnRleHQ7CiAKICAgICBlcnJvciA9IFRUX0xvYWRfQ29udGV4dCggZXhlYywgZmFjZSwgc2l6ZSApOwogICAgIGlmICggZXJyb3IgKQpAQCAtNzk1LDcgKzgzNyw3IEBACiAgICAgVFRfU2V0X0NvZGVSYW5nZSggZXhlYywKICAgICAgICAgICAgICAgICAgICAgICB0dF9jb2RlcmFuZ2VfZm9udCwKICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5mb250X3Byb2dyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgZmFjZS0+Zm9udF9wcm9ncmFtX3NpemUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZylmYWNlLT5mb250X3Byb2dyYW1fc2l6ZSApOwogCiAgICAgLyogZGlzYWJsZSBDVlQgYW5kIGdseXBoIHByb2dyYW1zIGNvZGVyYW5nZSAqLwogICAgIFRUX0NsZWFyX0NvZGVSYW5nZSggZXhlYywgdHRfY29kZXJhbmdlX2N2dCApOwpAQCAtODQ1LDE0ICs4ODcsNyBAQAogICAgIEZUX0Vycm9yICAgICAgICBlcnJvcjsKIAogCi0gICAgLyogZGVidWdnaW5nIGluc3RhbmNlcyBoYXZlIHRoZWlyIG93biBjb250ZXh0ICovCi0gICAgaWYgKCBzaXplLT5kZWJ1ZyApCi0gICAgICBleGVjID0gc2l6ZS0+Y29udGV4dDsKLSAgICBlbHNlCi0gICAgICBleGVjID0gKCAoVFRfRHJpdmVyKUZUX0ZBQ0VfRFJJVkVSKCBmYWNlICkgKS0+Y29udGV4dDsKLQotICAgIGlmICggIWV4ZWMgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDb3VsZF9Ob3RfRmluZF9Db250ZXh0ICk7CisgICAgZXhlYyA9IHNpemUtPmNvbnRleHQ7CiAKICAgICBlcnJvciA9IFRUX0xvYWRfQ29udGV4dCggZXhlYywgZmFjZSwgc2l6ZSApOwogICAgIGlmICggZXJyb3IgKQpAQCAtODY4LDcgKzkwMyw3IEBACiAgICAgVFRfU2V0X0NvZGVSYW5nZSggZXhlYywKICAgICAgICAgICAgICAgICAgICAgICB0dF9jb2RlcmFuZ2VfY3Z0LAogICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmN2dF9wcm9ncmFtLAotICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmN2dF9wcm9ncmFtX3NpemUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZylmYWNlLT5jdnRfcHJvZ3JhbV9zaXplICk7CiAKICAgICBUVF9DbGVhcl9Db2RlUmFuZ2UoIGV4ZWMsIHR0X2NvZGVyYW5nZV9nbHlwaCApOwogCkBAIC04NzYsMTIgKzkxMSw5IEBACiAgICAgewogICAgICAgVFRfR290b19Db2RlUmFuZ2UoIGV4ZWMsIHR0X2NvZGVyYW5nZV9jdnQsIDAgKTsKIAotICAgICAgaWYgKCAhc2l6ZS0+ZGVidWcgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTQoKCAiRXhlY3V0aW5nIGBwcmVwJyB0YWJsZS5cbiIgKSk7CisgICAgICBGVF9UUkFDRTQoKCAiRXhlY3V0aW5nIGBwcmVwJyB0YWJsZS5cbiIgKSk7CiAKLSAgICAgICAgZXJyb3IgPSBmYWNlLT5pbnRlcnByZXRlciggZXhlYyApOwotICAgICAgfQorICAgICAgZXJyb3IgPSBmYWNlLT5pbnRlcnByZXRlciggZXhlYyApOwogICAgIH0KICAgICBlbHNlCiAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKQEAgLTkyNCwxMiArOTU2LDEwIEBACiAgICAgVFRfRmFjZSAgICBmYWNlICAgPSAoVFRfRmFjZSlmdHNpemUtPmZhY2U7CiAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKIAotCi0gICAgaWYgKCBzaXplLT5kZWJ1ZyApCisgICAgaWYgKCBzaXplLT5jb250ZXh0ICkKICAgICB7Ci0gICAgICAvKiB0aGUgZGVidWcgY29udGV4dCBtdXN0IGJlIGRlbGV0ZWQgYnkgdGhlIGRlYnVnZ2VyIGl0c2VsZiAqLworICAgICAgVFRfRG9uZV9Db250ZXh0KCBzaXplLT5jb250ZXh0ICk7CiAgICAgICBzaXplLT5jb250ZXh0ID0gTlVMTDsKLSAgICAgIHNpemUtPmRlYnVnICAgPSBGQUxTRTsKICAgICB9CiAKICAgICBGVF9GUkVFKCBzaXplLT5jdnQgKTsKQEAgLTk3Myw5ICsxMDAzLDIxIEBACiAgICAgVFRfTWF4UHJvZmlsZSogIG1heHAgPSAmZmFjZS0+bWF4X3Byb2ZpbGU7CiAKIAorICAgIC8qIGNsZWFuIHVwIGJ5dGVjb2RlIHJlbGF0ZWQgZGF0YSAqLworICAgIEZUX0ZSRUUoIHNpemUtPmZ1bmN0aW9uX2RlZnMgKTsKKyAgICBGVF9GUkVFKCBzaXplLT5pbnN0cnVjdGlvbl9kZWZzICk7CisgICAgRlRfRlJFRSggc2l6ZS0+Y3Z0ICk7CisgICAgRlRfRlJFRSggc2l6ZS0+c3RvcmFnZSApOworCisgICAgaWYgKCBzaXplLT5jb250ZXh0ICkKKyAgICAgIFRUX0RvbmVfQ29udGV4dCggc2l6ZS0+Y29udGV4dCApOworICAgIHR0X2dseXBoem9uZV9kb25lKCAmc2l6ZS0+dHdpbGlnaHQgKTsKKwogICAgIHNpemUtPmJ5dGVjb2RlX3JlYWR5ID0gLTE7CiAgICAgc2l6ZS0+Y3Z0X3JlYWR5ICAgICAgPSAtMTsKIAorICAgIHNpemUtPmNvbnRleHQgPSBUVF9OZXdfQ29udGV4dCggKFRUX0RyaXZlcilmYWNlLT5yb290LmRyaXZlciApOworCiAgICAgc2l6ZS0+bWF4X2Z1bmN0aW9uX2RlZnMgICAgPSBtYXhwLT5tYXhGdW5jdGlvbkRlZnM7CiAgICAgc2l6ZS0+bWF4X2luc3RydWN0aW9uX2RlZnMgPSBtYXhwLT5tYXhJbnN0cnVjdGlvbkRlZnM7CiAKQEAgLTExMTYsNiArMTE1OCw3IEBACiAgICAgVFRfU2l6ZSAgIHNpemUgID0gKFRUX1NpemUpdHRzaXplOwogICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKIAorCiAjaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCiAgICAgc2l6ZS0+Ynl0ZWNvZGVfcmVhZHkgPSAtMTsKICAgICBzaXplLT5jdnRfcmVhZHkgICAgICA9IC0xOwpAQCAtMTE0Niw4ICsxMTg5LDcgQEAKIAogCiAjaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0gICAgaWYgKCBzaXplLT5ieXRlY29kZV9yZWFkeSA+PSAwICkKLSAgICAgIHR0X3NpemVfZG9uZV9ieXRlY29kZSggdHRzaXplICk7CisgICAgdHRfc2l6ZV9kb25lX2J5dGVjb2RlKCB0dHNpemUgKTsKICNlbmRpZgogCiAgICAgc2l6ZS0+dHRtZXRyaWNzLnZhbGlkID0gRkFMU0U7CkBAIC0xMjU5LDEwICsxMzAxLDYgQEAKIAogICAgIFRUX0RyaXZlciAgZHJpdmVyID0gKFRUX0RyaXZlcil0dGRyaXZlcjsKIAotCi0gICAgaWYgKCAhVFRfTmV3X0NvbnRleHQoIGRyaXZlciApICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggQ291bGRfTm90X0ZpbmRfQ29udGV4dCApOwotCiAjaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCiAgICAgZHJpdmVyLT5pbnRlcnByZXRlcl92ZXJzaW9uID0gVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zODsKICNlbHNlCkBAIC0xMjkzLDIwICsxMzMxLDcgQEAKICAgRlRfTE9DQUxfREVGKCB2b2lkICkKICAgdHRfZHJpdmVyX2RvbmUoIEZUX01vZHVsZSAgdHRkcml2ZXIgKSAgICAgLyogVFRfRHJpdmVyICovCiAgIHsKLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLSAgICBUVF9Ecml2ZXIgIGRyaXZlciA9IChUVF9Ecml2ZXIpdHRkcml2ZXI7Ci0KLQotICAgIC8qIGRlc3Ryb3kgdGhlIGV4ZWN1dGlvbiBjb250ZXh0ICovCi0gICAgaWYgKCBkcml2ZXItPmNvbnRleHQgKQotICAgIHsKLSAgICAgIFRUX0RvbmVfQ29udGV4dCggZHJpdmVyLT5jb250ZXh0ICk7Ci0gICAgICBkcml2ZXItPmNvbnRleHQgPSBOVUxMOwotICAgIH0KLSNlbHNlCiAgICAgRlRfVU5VU0VEKCB0dGRyaXZlciApOwotI2VuZGlmCi0KICAgfQogCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dG9ianMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dG9ianMuaAppbmRleCA4NTkxNjRmLi45Mzk2MDg5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRvYmpzLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0b2Jqcy5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIE9iamVjdHMgbWFuYWdlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDksIDIwMTEtMjAxNCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC00MiwxNyArNDIsNiBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9JbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIFRydWVUeXBlIHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IFRUX1NpemVSZWNfKiAgVFRfU2l6ZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgIFRUX0dseXBoU2xvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNjAsNyArMTQ5LDcgQEAKICAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0NvZGVSYW5nZV8KICAgewogICAgIEZUX0J5dGUqICBiYXNlOwotICAgIEZUX1VMb25nICBzaXplOworICAgIEZUX0xvbmcgICBzaXplOwogCiAgIH0gVFRfQ29kZVJhbmdlOwogCkBAIC0zMjQsMTMgKzMxMyw2IEBACiAKICAgICBUVF9HbHlwaFpvbmVSZWMgICAgdHdpbGlnaHQ7ICAgICAvKiBUaGUgaW5zdGFuY2UncyB0d2lsaWdodCB6b25lICAgICovCiAKLSAgICAvKiBkZWJ1Z2dpbmcgdmFyaWFibGVzICovCi0KLSAgICAvKiBXaGVuIHVzaW5nIHRoZSBkZWJ1Z2dlciwgd2UgbXVzdCBrZWVwIHRoZSAqLwotICAgIC8qIGV4ZWN1dGlvbiBjb250ZXh0IHRpZWQgdG8gdGhlIGluc3RhbmNlICAgICovCi0gICAgLyogb2JqZWN0IHJhdGhlciB0aGFuIGFza2luZyBpdCBvbiBkZW1hbmQuICAgKi8KLQotICAgIEZUX0Jvb2wgICAgICAgICAgICBkZWJ1ZzsKICAgICBUVF9FeGVjQ29udGV4dCAgICAgY29udGV4dDsKIAogICAgIC8qIGlmIG5lZ2F0aXZlLCBgZnBnbScgKHJlc3AuIGBwcmVwJyksIHdhc24ndCBleGVjdXRlZCB5ZXQ7ICovCkBAIC0zNTEsNyArMzMzLDYgQEAKICAgewogICAgIEZUX0RyaXZlclJlYyAgcm9vdDsKIAotICAgIFRUX0V4ZWNDb250ZXh0ICAgY29udGV4dDsgIC8qIGV4ZWN1dGlvbiBjb250ZXh0ICAgICAgICAqLwogICAgIFRUX0dseXBoWm9uZVJlYyAgem9uZTsgICAgIC8qIGdseXBoIGxvYWRlciBwb2ludHMgem9uZSAqLwogCiAgICAgRlRfVUludCAgaW50ZXJwcmV0ZXJfdmVyc2lvbjsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dHBpYy5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0cGljLmMKaW5kZXggZWRlZmFlNy4uMjQyYTZiNyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0cGljLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0cGljLmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgZm9yIHRydWV0eXBlIG1vZHVsZS4gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDksIDIwMTAsIDIwMTIsIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDA5LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBPcmFuIEFncmEgYW5kIE1pY2tleSBHYWJlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dHBpYy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0cGljLmgKaW5kZXggY2ZiNGVlNi4uMDc2YWU1NiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0cGljLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0cGljLmgKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgZm9yIHRydWV0eXBlIG1vZHVsZS4gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDksIDIwMTIsIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAyMDA5LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBPcmFuIEFncmEgYW5kIE1pY2tleSBHYWJlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KQEAgLTIwLDcgKzIwLDggQEAKICNkZWZpbmUgX19UVFBJQ19IX18KIAogCi1GVF9CRUdJTl9IRUFERVIKKyNpbmNsdWRlIEZUX0lOVEVSTkFMX1BJQ19ICisKIAogI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwogCkBAIC0zNyw2ICszOCw4IEBACiAjaW5jbHVkZSBGVF9TRVJWSUNFX1BST1BFUlRJRVNfSAogCiAKK0ZUX0JFR0lOX0hFQURFUgorCiAgIHR5cGVkZWYgc3RydWN0ICBUVE1vZHVsZVBJQ18KICAgewogICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgICAgICAgICB0dF9zZXJ2aWNlczsKQEAgLTY4LDEzICs3MSwxMiBAQAogICBGVF9FcnJvcgogICB0dF9kcml2ZXJfY2xhc3NfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKIAorRlRfRU5EX0hFQURFUgorCiAjZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KIAogIC8qICovCiAKLQotRlRfRU5EX0hFQURFUgotCiAjZW5kaWYgLyogX19UVFBJQ19IX18gKi8KIAogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRwbG9hZC5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0cGxvYWQuYwppbmRleCA5OTkxOTI1Li40NjQ3YzkzIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRwbG9hZC5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dHBsb2FkLmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgVHJ1ZVR5cGUtc3BlY2lmaWMgdGFibGVzIGxvYWRlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMiwgMjAwNC0yMDEzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KQEAgLTExOCwyMCArMTE4LDIwIEBACiAgICAgICAvKiB3ZSBvbmx5IGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBgbWF4cCcgZ2l2ZXMgYSBsYXJnZXIgdmFsdWUgKi8KICAgICAgIGlmICggZmFjZS0+bnVtX2xvY2F0aW9ucyA8PSAoRlRfVUxvbmcpZmFjZS0+cm9vdC5udW1fZ2x5cGhzICkKICAgICAgIHsKLSAgICAgICAgRlRfTG9uZyAgIG5ld19sb2NhX2xlbiA9Ci0gICAgICAgICAgICAgICAgICAgICggKEZUX0xvbmcpKCBmYWNlLT5yb290Lm51bV9nbHlwaHMgKSArIDEgKSA8PCBzaGlmdDsKKyAgICAgICAgRlRfVUxvbmcgIG5ld19sb2NhX2xlbiA9CisgICAgICAgICAgICAgICAgICAgICggKEZUX1VMb25nKWZhY2UtPnJvb3QubnVtX2dseXBocyArIDEgKSA8PCBzaGlmdDsKIAogICAgICAgICBUVF9UYWJsZSAgZW50cnkgPSBmYWNlLT5kaXJfdGFibGVzOwogICAgICAgICBUVF9UYWJsZSAgbGltaXQgPSBlbnRyeSArIGZhY2UtPm51bV90YWJsZXM7CiAKLSAgICAgICAgRlRfTG9uZyAgIHBvcyAgPSBGVF9TdHJlYW1fUG9zKCBzdHJlYW0gKTsKKyAgICAgICAgRlRfTG9uZyAgIHBvcyAgPSAoRlRfTG9uZylGVF9TVFJFQU1fUE9TKCk7CiAgICAgICAgIEZUX0xvbmcgICBkaXN0ID0gMHg3RkZGRkZGRkw7CiAKIAogICAgICAgICAvKiBjb21wdXRlIHRoZSBkaXN0YW5jZSB0byBuZXh0IHRhYmxlIGluIGZvbnQgZmlsZSAqLwogICAgICAgICBmb3IgKCA7IGVudHJ5IDwgbGltaXQ7IGVudHJ5KysgKQogICAgICAgICB7Ci0gICAgICAgICAgRlRfTG9uZyAgZGlmZiA9IGVudHJ5LT5PZmZzZXQgLSBwb3M7CisgICAgICAgICAgRlRfTG9uZyAgZGlmZiA9IChGVF9Mb25nKWVudHJ5LT5PZmZzZXQgLSBwb3M7CiAKIAogICAgICAgICAgIGlmICggZGlmZiA+IDAgJiYgZGlmZiA8IGRpc3QgKQpAQCAtMTQxLDE3ICsxNDEsMjUgQEAKICAgICAgICAgaWYgKCBlbnRyeSA9PSBsaW1pdCApCiAgICAgICAgIHsKICAgICAgICAgICAvKiBgbG9jYScgaXMgdGhlIGxhc3QgdGFibGUgKi8KLSAgICAgICAgICBkaXN0ID0gc3RyZWFtLT5zaXplIC0gcG9zOworICAgICAgICAgIGRpc3QgPSAoRlRfTG9uZylzdHJlYW0tPnNpemUgLSBwb3M7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIG5ld19sb2NhX2xlbiA8PSBkaXN0ICkKKyAgICAgICAgaWYgKCBuZXdfbG9jYV9sZW4gPD0gKEZUX1VMb25nKWRpc3QgKQogICAgICAgICB7Ci0gICAgICAgICAgZmFjZS0+bnVtX2xvY2F0aW9ucyA9IGZhY2UtPnJvb3QubnVtX2dseXBocyArIDE7CisgICAgICAgICAgZmFjZS0+bnVtX2xvY2F0aW9ucyA9IChGVF9VTG9uZylmYWNlLT5yb290Lm51bV9nbHlwaHMgKyAxOwogICAgICAgICAgIHRhYmxlX2xlbiAgICAgICAgICAgPSBuZXdfbG9jYV9sZW47CiAKICAgICAgICAgICBGVF9UUkFDRTIoKCAiYWRqdXN0aW5nIG51bV9sb2NhdGlvbnMgdG8gJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+bnVtX2xvY2F0aW9ucyApKTsKICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBmYWNlLT5yb290Lm51bV9nbHlwaHMgPSBmYWNlLT5udW1fbG9jYXRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChGVF9Mb25nKWZhY2UtPm51bV9sb2NhdGlvbnMgLSAxIDogMDsKKworICAgICAgICAgIEZUX1RSQUNFMigoICJhZGp1c3RpbmcgbnVtX2dseXBocyB0byAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5yb290Lm51bV9nbHlwaHMgKSk7CisgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dHBsb2FkLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRwbG9hZC5oCmluZGV4IGY2MWFjMDcuLmJjOTIzNjkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dHBsb2FkLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0cGxvYWQuaApAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBUcnVlVHlwZS1zcGVjaWZpYyB0YWJsZXMgbG9hZGVyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyLCAyMDA1LCAyMDA2IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0c3VicGl4LmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRzdWJwaXguYwppbmRleCBjYTYwNDUxLi4wZDM5MWU5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRzdWJwaXguYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRzdWJwaXguYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBUcnVlVHlwZSBTdWJwaXhlbCBIaW50aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxMC0yMDEzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMTAtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtNjMsOCArNjMsOCBAQAogICAvKiBydWxlcyBiZWxvdy4gIEEgYmxhbmsgZW50cnkgIiIgaXMgcmVxdWlyZWQgYXQgdGhlIGVuZCBvZiB0aGVzZSEgICAgICAgKi8KICNkZWZpbmUgRkFNSUxZX0NMQVNTX1JVTEVTX1NJWkUgIDcKIAotICBzdGF0aWMgY29uc3QgU1BIX0ZvbnRfQ2xhc3MgRkFNSUxZX0NMQVNTX1J1bGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRkFNSUxZX0NMQVNTX1JVTEVTX1NJWkVdID0KKyAgc3RhdGljIGNvbnN0IFNQSF9Gb250X0NsYXNzICBGQU1JTFlfQ0xBU1NfUnVsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRkFNSUxZX0NMQVNTX1JVTEVTX1NJWkVdID0KICAgewogICAgIHsgIk1TIExlZ2FjeSBGb250cyIsCiAgICAgICB7ICJBaGFyb25pIiwKQEAgLTIyMyw4ICsyMjMsOCBAQAogICAvKiBydWxlcyBiZWxvdy4gIEEgYmxhbmsgZW50cnkgIiIgaXMgcmVxdWlyZWQgYXQgdGhlIGVuZCBvZiB0aGVzZSEgICAgICAgKi8KICNkZWZpbmUgU1RZTEVfQ0xBU1NfUlVMRVNfU0laRSAgNQogCi0gIGNvbnN0IFNQSF9Gb250X0NsYXNzIFNUWUxFX0NMQVNTX1J1bGVzCi0gICAgICAgICAgICAgICAgICAgICAgIFtTVFlMRV9DTEFTU19SVUxFU19TSVpFXSA9CisgIHN0YXRpYyBjb25zdCBTUEhfRm9udF9DbGFzcyAgU1RZTEVfQ0xBU1NfUnVsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU1RZTEVfQ0xBU1NfUlVMRVNfU0laRV0gPQogICB7CiAgICAgeyAiUmVndWxhciBDbGFzcyIsCiAgICAgICB7ICJSZWd1bGFyIiwKQEAgLTI3OSw4ICsyNzksOCBAQAogICAvKiBGb3JjZSBzcGVjaWFsIGxlZ2FjeSBmaXhlcyBmb3IgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgQ09NUEFUSUJJTElUWV9NT0RFX1JVTEVTX1NJWkUgIDEKIAotICBjb25zdCBTUEhfVHdlYWtSdWxlICBDT01QQVRJQklMSVRZX01PREVfUnVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgW0NPTVBBVElCSUxJVFlfTU9ERV9SVUxFU19TSVpFXSA9CisgIHN0YXRpYyBjb25zdCBTUEhfVHdlYWtSdWxlICBDT01QQVRJQklMSVRZX01PREVfUnVsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtDT01QQVRJQklMSVRZX01PREVfUlVMRVNfU0laRV0gPQogICB7CiAgICAgeyAiVmVyZGFuYSBDbG9uZXMiLCAwLCAiIiwgMCB9LAogICB9OwpAQCAtMjg5LDggKzI4OSw4IEBACiAgIC8qIERvbid0IGRvIHN1YnBpeGVsIChpZ25vcmVfeF9tb2RlKSBoaW50aW5nOyBkbyBub3JtYWwgaGludGluZy4gICAgICAgICAqLwogI2RlZmluZSBQSVhFTF9ISU5USU5HX1JVTEVTX1NJWkUgIDIKIAotICBjb25zdCBTUEhfVHdlYWtSdWxlICBQSVhFTF9ISU5USU5HX1J1bGVzCi0gICAgICAgICAgICAgICAgICAgICAgIFtQSVhFTF9ISU5USU5HX1JVTEVTX1NJWkVdID0KKyAgc3RhdGljIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIFBJWEVMX0hJTlRJTkdfUnVsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQSVhFTF9ISU5USU5HX1JVTEVTX1NJWkVdID0KICAgewogICAgIC8qIHRoZXNlIGNoYXJhY3RlcnMgYXJlIGFsbW9zdCBhbHdheXMgc2FmZSAqLwogICAgIHsgIkNvdXJpZXIgTmV3IiwgMTIsICJJdGFsaWMiLCAneicgfSwKQEAgLTMwMSw4ICszMDEsOCBAQAogICAvKiBTdWJwaXhlbCBoaW50aW5nIGlnbm9yZXMgU0hQSVggcnVsZXMgb24gWC4gIEZvcmNlIFNIUElYIGZvciB0aGVzZS4gICAgKi8KICNkZWZpbmUgRE9fU0hQSVhfUlVMRVNfU0laRSAgMQogCi0gIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIERPX1NIUElYX1J1bGVzCi0gICAgICAgICAgICAgICAgICAgICAgIFtET19TSFBJWF9SVUxFU19TSVpFXSA9CisgIHN0YXRpYyBjb25zdCBTUEhfVHdlYWtSdWxlICBET19TSFBJWF9SdWxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0RPX1NIUElYX1JVTEVTX1NJWkVdID0KICAgewogICAgIHsgIi0iLCAwLCAiIiwgMCB9LAogICB9OwpAQCAtMzEyLDggKzMxMiw4IEBACiAgIC8qIGJvdW5kYXJ5IGFuZCBkb24ndCBtb3ZlIHRoYXQgcG9pbnQgdG8gYSBZIHBpeGVsIGJvdW5kYXJ5LiAgICAgICAgICAgICAqLwogI2RlZmluZSBTS0lQX05PTlBJWEVMX1lfTU9WRVNfUlVMRVNfU0laRSAgNAogCi0gIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIFNLSVBfTk9OUElYRUxfWV9NT1ZFU19SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICBbU0tJUF9OT05QSVhFTF9ZX01PVkVTX1JVTEVTX1NJWkVdID0KKyAgc3RhdGljIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIFNLSVBfTk9OUElYRUxfWV9NT1ZFU19SdWxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NLSVBfTk9OUElYRUxfWV9NT1ZFU19SVUxFU19TSVpFXSA9CiAgIHsKICAgICAvKiBmaXggdnd4eXogdGhpbm5lc3MqLwogICAgIHsgIkNvbnNvbGFzIiwgMCwgIiIsIDAgfSwKQEAgLTMyOCw4ICszMjgsOCBAQAogCiAjZGVmaW5lIFNLSVBfTk9OUElYRUxfWV9NT1ZFU19SVUxFU19FWENFUFRJT05TX1NJWkUgIDEKIAotICBjb25zdCBTUEhfVHdlYWtSdWxlICBTS0lQX05PTlBJWEVMX1lfTU9WRVNfUnVsZXNfRXhjZXB0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICBbU0tJUF9OT05QSVhFTF9ZX01PVkVTX1JVTEVTX0VYQ0VQVElPTlNfU0laRV0gPQorICBzdGF0aWMgY29uc3QgU1BIX1R3ZWFrUnVsZSAgU0tJUF9OT05QSVhFTF9ZX01PVkVTX1J1bGVzX0V4Y2VwdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTS0lQX05PTlBJWEVMX1lfTU9WRVNfUlVMRVNfRVhDRVBUSU9OU19TSVpFXSA9CiAgIHsKICAgICAvKiBGaXhlcyA8IGFuZCA+ICovCiAgICAgeyAiQ291cmllciBOZXciLCAwLCAiUmVndWxhciIsIDAgfSwKQEAgLTM0MCw4ICszNDAsOCBAQAogICAvKiBib3VuZGFyeSBhbmQgZG9uJ3QgbW92ZSB0aGF0IHBvaW50IHRvIGEgWSBwaXhlbCBib3VuZGFyeS4gICAgICAgICAgICAgKi8KICNkZWZpbmUgU0tJUF9OT05QSVhFTF9ZX01PVkVTX0RFTFRBUF9SVUxFU19TSVpFICAyCiAKLSAgY29uc3QgU1BIX1R3ZWFrUnVsZSAgU0tJUF9OT05QSVhFTF9ZX01PVkVTX0RFTFRBUF9SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICBbU0tJUF9OT05QSVhFTF9ZX01PVkVTX0RFTFRBUF9SVUxFU19TSVpFXSA9CisgIHN0YXRpYyBjb25zdCBTUEhfVHdlYWtSdWxlICBTS0lQX05PTlBJWEVMX1lfTU9WRVNfREVMVEFQX1J1bGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0tJUF9OT05QSVhFTF9ZX01PVkVTX0RFTFRBUF9SVUxFU19TSVpFXSA9CiAgIHsKICAgICAvKiBNYWludGFpbiB0aGlja25lc3Mgb2YgZGlhZ29uYWwgaW4gJ04nICovCiAgICAgeyAiVGltZXMgTmV3IFJvbWFuIiwgMCwgIlJlZ3VsYXIvQm9sZCBDbGFzcyIsICdOJyB9LApAQCAtMzUyLDggKzM1Miw4IEBACiAgIC8qIFNraXAgWSBtb3ZlcyB0aGF0IG1vdmUgYSBwb2ludCBvZmYgYSBZIHBpeGVsIGJvdW5kYXJ5LiAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBTS0lQX09GRlBJWEVMX1lfTU9WRVNfUlVMRVNfU0laRSAgMQogCi0gIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIFNLSVBfT0ZGUElYRUxfWV9NT1ZFU19SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICBbU0tJUF9PRkZQSVhFTF9ZX01PVkVTX1JVTEVTX1NJWkVdID0KKyAgc3RhdGljIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIFNLSVBfT0ZGUElYRUxfWV9NT1ZFU19SdWxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NLSVBfT0ZGUElYRUxfWV9NT1ZFU19SVUxFU19TSVpFXSA9CiAgIHsKICAgICB7ICItIiwgMCwgIiIsIDAgfSwKICAgfTsKQEAgLTM2MSw4ICszNjEsOCBAQAogCiAjZGVmaW5lIFNLSVBfT0ZGUElYRUxfWV9NT1ZFU19SVUxFU19FWENFUFRJT05TX1NJWkUgIDEKIAotICBjb25zdCBTUEhfVHdlYWtSdWxlICBTS0lQX09GRlBJWEVMX1lfTU9WRVNfUnVsZXNfRXhjZXB0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICBbU0tJUF9PRkZQSVhFTF9ZX01PVkVTX1JVTEVTX0VYQ0VQVElPTlNfU0laRV0gPQorICBzdGF0aWMgY29uc3QgU1BIX1R3ZWFrUnVsZSAgU0tJUF9PRkZQSVhFTF9ZX01PVkVTX1J1bGVzX0V4Y2VwdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTS0lQX09GRlBJWEVMX1lfTU9WRVNfUlVMRVNfRVhDRVBUSU9OU19TSVpFXSA9CiAgIHsKICAgICB7ICItIiwgMCwgIiIsIDAgfSwKICAgfTsKQEAgLTM3MSw4ICszNzEsOCBAQAogICAvKiBSb3VuZCBtb3ZlcyB0aGF0IGRvbid0IG1vdmUgYSBwb2ludCB0byBhIFkgcGl4ZWwgYm91bmRhcnkuICAgICAgICAgICAgKi8KICNkZWZpbmUgUk9VTkRfTk9OUElYRUxfWV9NT1ZFU19SVUxFU19TSVpFICAyCiAKLSAgY29uc3QgU1BIX1R3ZWFrUnVsZSAgUk9VTkRfTk9OUElYRUxfWV9NT1ZFU19SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICBbUk9VTkRfTk9OUElYRUxfWV9NT1ZFU19SVUxFU19TSVpFXSA9CisgIHN0YXRpYyBjb25zdCBTUEhfVHdlYWtSdWxlICBST1VORF9OT05QSVhFTF9ZX01PVkVTX1J1bGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUk9VTkRfTk9OUElYRUxfWV9NT1ZFU19SVUxFU19TSVpFXSA9CiAgIHsKICAgICAvKiBEcm9pZCBmb250IGluc3RydWN0aW9ucyBkb24ndCBzbmFwIFkgdG8gcGl4ZWxzICovCiAgICAgeyAiRHJvaWQgU2FucyIsIDAsICJSZWd1bGFyL0l0YWxpYyBDbGFzcyIsIDAgfSwKQEAgLTM4Miw4ICszODIsOCBAQAogCiAjZGVmaW5lIFJPVU5EX05PTlBJWEVMX1lfTU9WRVNfUlVMRVNfRVhDRVBUSU9OU19TSVpFICAxCiAKLSAgY29uc3QgU1BIX1R3ZWFrUnVsZSAgUk9VTkRfTk9OUElYRUxfWV9NT1ZFU19SdWxlc19FeGNlcHRpb25zCi0gICAgICAgICAgICAgICAgICAgICAgIFtST1VORF9OT05QSVhFTF9ZX01PVkVTX1JVTEVTX0VYQ0VQVElPTlNfU0laRV0gPQorICBzdGF0aWMgY29uc3QgU1BIX1R3ZWFrUnVsZSAgUk9VTkRfTk9OUElYRUxfWV9NT1ZFU19SdWxlc19FeGNlcHRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUk9VTkRfTk9OUElYRUxfWV9NT1ZFU19SVUxFU19FWENFUFRJT05TX1NJWkVdID0KICAgewogICAgIHsgIi0iLCAwLCAiIiwgMCB9LAogICB9OwpAQCAtMzkyLDggKzM5Miw4IEBACiAgIC8qIEFsbG93IGEgRGlyZWN0X01vdmUgYWxvbmcgWCBmcmVlZG9tIHZlY3RvciBpZiBtYXRjaGVkLiAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBBTExPV19YX0RNT1ZFX1JVTEVTX1NJWkUgIDEKIAotICBjb25zdCBTUEhfVHdlYWtSdWxlICBBTExPV19YX0RNT1ZFX1J1bGVzCi0gICAgICAgICAgICAgICAgICAgICAgIFtBTExPV19YX0RNT1ZFX1JVTEVTX1NJWkVdID0KKyAgc3RhdGljIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIEFMTE9XX1hfRE1PVkVfUnVsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBTExPV19YX0RNT1ZFX1JVTEVTX1NJWkVdID0KICAgewogICAgIC8qIEZpeGVzIHZhbmlzaGluZyBkaWFnb25hbCBpbiA0ICovCiAgICAgeyAiVmVyZGFuYSIsIDAsICJSZWd1bGFyIiwgJzQnIH0sCkBAIC00MDMsOCArNDAzLDggQEAKICAgLyogUmV0dXJuIE1TIHJhc3Rlcml6ZXIgdmVyc2lvbiAzNSBpZiBtYXRjaGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIFJBU1RFUklaRVJfMzVfUlVMRVNfU0laRSAgOAogCi0gIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIFJBU1RFUklaRVJfMzVfUnVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgW1JBU1RFUklaRVJfMzVfUlVMRVNfU0laRV0gPQorICBzdGF0aWMgY29uc3QgU1BIX1R3ZWFrUnVsZSAgUkFTVEVSSVpFUl8zNV9SdWxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1JBU1RFUklaRVJfMzVfUlVMRVNfU0laRV0gPQogICB7CiAgICAgLyogVGhpcyBzZWVtcyB0byBiZSB0aGUgb25seSB3YXkgdG8gbWFrZSB0aGVzZSBsb29rIGdvb2QgKi8KICAgICB7ICJUaW1lcyBOZXcgUm9tYW4iLCAwLCAiUmVndWxhciIsICdpJyB9LApAQCAtNDIxLDggKzQyMSw4IEBACiAgIC8qIERvbid0IHJvdW5kIHRvIHRoZSBzdWJwaXhlbCBncmlkLiAgUm91bmQgdG8gcGl4ZWwgZ3JpZC4gICAgICAgICAgICAgICAqLwogI2RlZmluZSBOT1JNQUxfUk9VTkRfUlVMRVNfU0laRSAgMQogCi0gIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIE5PUk1BTF9ST1VORF9SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICBbTk9STUFMX1JPVU5EX1JVTEVTX1NJWkVdID0KKyAgc3RhdGljIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIE5PUk1BTF9ST1VORF9SdWxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05PUk1BTF9ST1VORF9SVUxFU19TSVpFXSA9CiAgIHsKICAgICAvKiBGaXggc2VyaWYgdGhpY2tuZXNzIGZvciBjZXJ0YWluIHBwZW1zICovCiAgICAgLyogQ2FuIHByb2JhYmx5IGJlIGdlbmVyYWxpemVkIHNvbWVob3cgICAqLwpAQCAtNDMzLDggKzQzMyw4IEBACiAgIC8qIFNraXAgSVVQIGluc3RydWN0aW9ucyBpZiBtYXRjaGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBTS0lQX0lVUF9SVUxFU19TSVpFICAxCiAKLSAgY29uc3QgU1BIX1R3ZWFrUnVsZSAgU0tJUF9JVVBfUnVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgW1NLSVBfSVVQX1JVTEVTX1NJWkVdID0KKyAgc3RhdGljIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIFNLSVBfSVVQX1J1bGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0tJUF9JVVBfUlVMRVNfU0laRV0gPQogICB7CiAgICAgeyAiQXJpYWwiLCAxMywgIlJlZ3VsYXIiLCAnYScgfSwKICAgfTsKQEAgLTQ0Myw4ICs0NDMsOCBAQAogICAvKiBTa2lwIE1JQVAgVHdpbGlnaHQgaGFjayBpZiBtYXRjaGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgTUlBUF9IQUNLX1JVTEVTX1NJWkUgIDEKIAotICBjb25zdCBTUEhfVHdlYWtSdWxlICBNSUFQX0hBQ0tfUnVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgW01JQVBfSEFDS19SVUxFU19TSVpFXSA9CisgIHN0YXRpYyBjb25zdCBTUEhfVHdlYWtSdWxlICBNSUFQX0hBQ0tfUnVsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtNSUFQX0hBQ0tfUlVMRVNfU0laRV0gPQogICB7CiAgICAgeyAiR2VuZXZhIiwgMTIsICIiLCAwIH0sCiAgIH07CkBAIC00NTMsOCArNDUzLDggQEAKICAgLyogU2tpcCBERUxUQVAgaW5zdHJ1Y3Rpb25zIGlmIG1hdGNoZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEFMV0FZU19TS0lQX0RFTFRBUF9SVUxFU19TSVpFICAyMwogCi0gIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIEFMV0FZU19TS0lQX0RFTFRBUF9SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICBbQUxXQVlTX1NLSVBfREVMVEFQX1JVTEVTX1NJWkVdID0KKyAgc3RhdGljIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIEFMV0FZU19TS0lQX0RFTFRBUF9SdWxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0FMV0FZU19TS0lQX0RFTFRBUF9SVUxFU19TSVpFXSA9CiAgIHsKICAgICB7ICJHZW9yZ2lhIiwgMCwgIlJlZ3VsYXIiLCAnaycgfSwKICAgICAvKiBmaXggdmFyaW91cyBwcm9ibGVtcyB3aXRoIGUgaW4gZGlmZmVyZW50IHZlcnNpb25zICovCkBAIC00ODksOCArNDg5LDggQEAKICAgLyogQWx3YXlzIGRvIERFTFRBUCBpbnN0cnVjdGlvbnMgaWYgbWF0Y2hlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEFMV0FZU19ET19ERUxUQVBfUlVMRVNfU0laRSAgMQogCi0gIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIEFMV0FZU19ET19ERUxUQVBfUnVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgW0FMV0FZU19ET19ERUxUQVBfUlVMRVNfU0laRV0gPQorICBzdGF0aWMgY29uc3QgU1BIX1R3ZWFrUnVsZSAgQUxXQVlTX0RPX0RFTFRBUF9SdWxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0FMV0FZU19ET19ERUxUQVBfUlVMRVNfU0laRV0gPQogICB7CiAgICAgeyAiLSIsIDAsICIiLCAwIH0sCiAgIH07CkBAIC03NDQsNyArNzQ0LDcgQEAKICNlbmRpZiAvKiBGT1JDRV9OQVRVUkFMX1dJRFRIUyAqLwogCiAKLSAgRlRfTE9DQUxfREVGKCBGVF9Cb29sICkKKyAgc3RhdGljIEZUX0Jvb2wKICAgaXNfbWVtYmVyX29mX2ZhbWlseV9jbGFzcyggY29uc3QgRlRfU3RyaW5nKiAgZGV0ZWN0ZWRfZm9udF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICBydWxlX2ZvbnRfbmFtZSApCiAgIHsKQEAgLTc3OSw3ICs3NzksNyBAQAogICB9CiAKIAotICBGVF9MT0NBTF9ERUYoIEZUX0Jvb2wgKQorICBzdGF0aWMgRlRfQm9vbAogICBpc19tZW1iZXJfb2Zfc3R5bGVfY2xhc3MoIGNvbnN0IEZUX1N0cmluZyogIGRldGVjdGVkX2ZvbnRfc3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgcnVsZV9mb250X3N0eWxlICkKICAgewpAQCAtOTAzLDkgKzkwMyw5IEBACiAgIHNwaF9zZXRfdHdlYWtzKCBUVF9Mb2FkZXIgIGxvYWRlciwKICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZ2x5cGhfaW5kZXggKQogICB7Ci0gICAgVFRfRmFjZSAgICAgZmFjZSAgID0gKFRUX0ZhY2UpbG9hZGVyLT5mYWNlOworICAgIFRUX0ZhY2UgICAgIGZhY2UgICA9IGxvYWRlci0+ZmFjZTsKICAgICBGVF9TdHJpbmcqICBmYW1pbHkgPSBmYWNlLT5yb290LmZhbWlseV9uYW1lOwotICAgIGludCAgICAgICAgIHBwZW0gICA9IGxvYWRlci0+c2l6ZS0+bWV0cmljcy54X3BwZW07CisgICAgRlRfVUludCAgICAgcHBlbSAgID0gbG9hZGVyLT5zaXplLT5tZXRyaWNzLnhfcHBlbTsKICAgICBGVF9TdHJpbmcqICBzdHlsZSAgPSBmYWNlLT5yb290LnN0eWxlX25hbWU7CiAKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0c3VicGl4LmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRzdWJwaXguaAppbmRleCA4YTU0ZmM3Li45MTUxYWEzIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRzdWJwaXguaAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRzdWJwaXguaApAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBUcnVlVHlwZSBTdWJwaXhlbCBIaW50aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxMC0yMDEzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMTAtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtNTAsMjYgKzUwLDI2IEBACiAgIC8qIFR3ZWFrIGZsYWdzIHRoYXQgYXJlIHNldCBmb3IgZWFjaCBnbHlwaCBieSB0aGUgYmVsb3cgcnVsZXMuICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNQSF9UV0VBS19BTExPV19YX0RNT1ZFICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMQotI2RlZmluZSBTUEhfVFdFQUtfQUxXQVlTX0RPX0RFTFRBUCAgICAgICAgICAgICAgICAweDAwMDAwMDIKLSNkZWZpbmUgU1BIX1RXRUFLX0FMV0FZU19TS0lQX0RFTFRBUCAgICAgICAgICAgICAgMHgwMDAwMDA0Ci0jZGVmaW5lIFNQSF9UV0VBS19DT1VSSUVSX05FV18yX0hBQ0sgICAgICAgICAgICAgIDB4MDAwMDAwOAotI2RlZmluZSBTUEhfVFdFQUtfREVFTUJPTERFTiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAKLSNkZWZpbmUgU1BIX1RXRUFLX0RPX1NIUElYICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwCi0jZGVmaW5lIFNQSF9UV0VBS19FTUJPTERFTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MAotI2RlZmluZSBTUEhfVFdFQUtfTUlBUF9IQUNLICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAKLSNkZWZpbmUgU1BIX1RXRUFLX05PUk1BTF9ST1VORCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwCi0jZGVmaW5lIFNQSF9UV0VBS19OT19BTElHTlJQX0FGVEVSX0lVUCAgICAgICAgICAgIDB4MDAwMDIwMAotI2RlZmluZSBTUEhfVFdFQUtfTk9fQ0FMTF9BRlRFUl9JVVAgICAgICAgICAgICAgICAweDAwMDA0MDAKLSNkZWZpbmUgU1BIX1RXRUFLX05PX0RFTFRBUF9BRlRFUl9JVVAgICAgICAgICAgICAgMHgwMDAwODAwCi0jZGVmaW5lIFNQSF9UV0VBS19QSVhFTF9ISU5USU5HICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMAotI2RlZmluZSBTUEhfVFdFQUtfUkFTVEVSSVpFUl8zNSAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAKLSNkZWZpbmUgU1BIX1RXRUFLX1JPVU5EX05PTlBJWEVMX1lfTU9WRVMgICAgICAgICAgMHgwMDA0MDAwCi0jZGVmaW5lIFNQSF9UV0VBS19TS0lQX0lVUCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMAotI2RlZmluZSBTUEhfVFdFQUtfU0tJUF9OT05QSVhFTF9ZX01PVkVTICAgICAgICAgICAweDAwMTAwMDAKLSNkZWZpbmUgU1BIX1RXRUFLX1NLSVBfT0ZGUElYRUxfWV9NT1ZFUyAgICAgICAgICAgMHgwMDIwMDAwCi0jZGVmaW5lIFNQSF9UV0VBS19USU1FU19ORVdfUk9NQU5fSEFDSyAgICAgICAgICAgIDB4MDA0MDAwMAotI2RlZmluZSBTUEhfVFdFQUtfU0tJUF9OT05QSVhFTF9ZX01PVkVTX0RFTFRBUCAgICAweDAwODAwMDAKKyNkZWZpbmUgU1BIX1RXRUFLX0FMTE9XX1hfRE1PVkUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxVUwKKyNkZWZpbmUgU1BIX1RXRUFLX0FMV0FZU19ET19ERUxUQVAgICAgICAgICAgICAgICAgMHgwMDAwMDAyVUwKKyNkZWZpbmUgU1BIX1RXRUFLX0FMV0FZU19TS0lQX0RFTFRBUCAgICAgICAgICAgICAgMHgwMDAwMDA0VUwKKyNkZWZpbmUgU1BIX1RXRUFLX0NPVVJJRVJfTkVXXzJfSEFDSyAgICAgICAgICAgICAgMHgwMDAwMDA4VUwKKyNkZWZpbmUgU1BIX1RXRUFLX0RFRU1CT0xERU4gICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwVUwKKyNkZWZpbmUgU1BIX1RXRUFLX0RPX1NIUElYICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwVUwKKyNkZWZpbmUgU1BIX1RXRUFLX0VNQk9MREVOICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwVUwKKyNkZWZpbmUgU1BIX1RXRUFLX01JQVBfSEFDSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDgwVUwKKyNkZWZpbmUgU1BIX1RXRUFLX05PUk1BTF9ST1VORCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwVUwKKyNkZWZpbmUgU1BIX1RXRUFLX05PX0FMSUdOUlBfQUZURVJfSVVQICAgICAgICAgICAgMHgwMDAwMjAwVUwKKyNkZWZpbmUgU1BIX1RXRUFLX05PX0NBTExfQUZURVJfSVVQICAgICAgICAgICAgICAgMHgwMDAwNDAwVUwKKyNkZWZpbmUgU1BIX1RXRUFLX05PX0RFTFRBUF9BRlRFUl9JVVAgICAgICAgICAgICAgMHgwMDAwODAwVUwKKyNkZWZpbmUgU1BIX1RXRUFLX1BJWEVMX0hJTlRJTkcgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwVUwKKyNkZWZpbmUgU1BIX1RXRUFLX1JBU1RFUklaRVJfMzUgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwVUwKKyNkZWZpbmUgU1BIX1RXRUFLX1JPVU5EX05PTlBJWEVMX1lfTU9WRVMgICAgICAgICAgMHgwMDA0MDAwVUwKKyNkZWZpbmUgU1BIX1RXRUFLX1NLSVBfSVVQICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwVUwKKyNkZWZpbmUgU1BIX1RXRUFLX1NLSVBfTk9OUElYRUxfWV9NT1ZFUyAgICAgICAgICAgMHgwMDEwMDAwVUwKKyNkZWZpbmUgU1BIX1RXRUFLX1NLSVBfT0ZGUElYRUxfWV9NT1ZFUyAgICAgICAgICAgMHgwMDIwMDAwVUwKKyNkZWZpbmUgU1BIX1RXRUFLX1RJTUVTX05FV19ST01BTl9IQUNLICAgICAgICAgICAgMHgwMDQwMDAwVUwKKyNkZWZpbmUgU1BIX1RXRUFLX1NLSVBfTk9OUElYRUxfWV9NT1ZFU19ERUxUQVAgICAgMHgwMDgwMDAwVUwKIAogCiAgIEZUX0xPQ0FMKCBGVF9Cb29sICkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS9KYW1maWxlIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL0phbWZpbGUKaW5kZXggOGUzNjZiYS4uZDFhM2FmNSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL0phbWZpbGUKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL0phbWZpbGUKQEAgLTEsNiArMSw2IEBACiAjIEZyZWVUeXBlIDIgc3JjL3R5cGUxIEphbWZpbGUKICMKLSMgQ29weXJpZ2h0IDIwMDEgYnkKKyMgQ29weXJpZ2h0IDIwMDEtMjAxNSBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC0xNiw3ICsxNiwxMyBAQAogCiAgIGlmICQoRlQyX01VTFRJKQogICB7Ci0gICAgX3NvdXJjZXMgPSB0MWFmbSB0MWRyaXZlciB0MW9ianMgdDFsb2FkIHQxZ2xvYWQgdDFwYXJzZSA7CisgICAgX3NvdXJjZXMgPSB0MWFmbQorICAgICAgICAgICAgICAgdDFkcml2ZXIKKyAgICAgICAgICAgICAgIHQxZ2xvYWQKKyAgICAgICAgICAgICAgIHQxbG9hZAorICAgICAgICAgICAgICAgdDFvYmpzCisgICAgICAgICAgICAgICB0MXBhcnNlCisgICAgICAgICAgICAgICA7CiAgIH0KICAgZWxzZQogICB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFhZm0uYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MWFmbS5jCmluZGV4IGRlOWMxOTkuLjdmMzIwNTkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MWFmbS5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MWFmbS5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEFGTSBzdXBwb3J0IGZvciBUeXBlIDEgZm9udHMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTEsIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC0xNjksOCArMTY5LDggQEAKICAgICAgIGdvdG8gRXhpdDsKIAogICAgIC8qIG5vdywgcmVhZCBlYWNoIGtlcm4gcGFpciAqLwotICAgIGtwICAgICAgICAgICAgID0gZmktPktlcm5QYWlyczsKLSAgICBsaW1pdCAgICAgICAgICA9IHAgKyA0ICogZmktPk51bUtlcm5QYWlyOworICAgIGtwICAgID0gZmktPktlcm5QYWlyczsKKyAgICBsaW1pdCA9IHAgKyA0ICogZmktPk51bUtlcm5QYWlyOwogCiAgICAgLyogUEZNIGtlcm5pbmcgZGF0YSBhcmUgc3RvcmVkIGJ5IGVuY29kaW5nIHJhdGhlciB0aGFuIGdseXBoIGluZGV4LCAqLwogICAgIC8qIHNvIGZpbmQgdGhlIFBvc3RTY3JpcHQgY2hhcm1hcCBvZiB0aGlzIGZvbnQgYW5kIGluc3RhbGwgaXQgICAgICAgKi8KQEAgLTM2Miw3ICszNjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBrZXJuaW5nICkKICAgewogICAgIEFGTV9Gb250SW5mbyAgZmkgPSAoQUZNX0ZvbnRJbmZvKSggKFQxX0ZhY2UpZmFjZSApLT5hZm1fZGF0YTsKLSAgICBGVF9JbnQgICAgICAgIGk7CisgICAgRlRfVUludCAgICAgICBpOwogCiAKICAgICBpZiAoICFmaSApCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFhZm0uaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MWFmbS5oCmluZGV4IDhlYjE3NjQuLjBmNDJmM2UgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MWFmbS5oCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MWFmbS5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEFGTSBzdXBwb3J0IGZvciBUeXBlIDEgZm9udHMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDYgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFkcml2ZXIuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MWRyaXZlci5jCmluZGV4IDI2MDJiZGIuLjU3MWYyZDIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MWRyaXZlci5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MWRyaXZlci5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFR5cGUgMSBkcml2ZXIgaW50ZXJmYWNlIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDQsIDIwMDYsIDIwMDcsIDIwMDksIDIwMTEsIDIwMTMsIDIwMTQgYnkgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC0zMiw3ICszMiw3IEBACiAKICNpbmNsdWRlIEZUX1NFUlZJQ0VfTVVMVElQTEVfTUFTVEVSU19ICiAjaW5jbHVkZSBGVF9TRVJWSUNFX0dMWVBIX0RJQ1RfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9YRlJFRTg2X05BTUVfSAorI2luY2x1ZGUgRlRfU0VSVklDRV9GT05UX0ZPUk1BVF9ICiAjaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfTkFNRV9ICiAjaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSAogI2luY2x1ZGUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX0lORk9fSApAQCAtMTc2LDkgKzE3NiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgUFNfRGljdF9LZXlzICBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGlkeCwKICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgIHZhbHVlX2xlbiApCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgIHZhbHVlX2xlbl8gKQogICB7Ci0gICAgRlRfTG9uZyAgcmV0dmFsID0gLTE7CisgICAgRlRfVUxvbmcgIHJldHZhbCAgICA9IDA7IC8qIGFsd2F5cyA+PSAxIGlmIHZhbGlkICovCisgICAgRlRfVUxvbmcgIHZhbHVlX2xlbiA9IHZhbHVlX2xlbl8gPCAwID8gMCA6IChGVF9VTG9uZyl2YWx1ZV9sZW5fOworCiAgICAgVDFfRmFjZSAgdDFmYWNlID0gKFQxX0ZhY2UpZmFjZTsKICAgICBUMV9Gb250ICB0eXBlMSAgPSAmdDFmYWNlLT50eXBlMTsKIApAQCAtMjI1LDcgKzIyNyw3IEBACiAgICAgICBpZiAoIGlkeCA8IHNpemVvZiAoIHR5cGUxLT5mb250X2Jib3ggKSAvCiAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggdHlwZTEtPmZvbnRfYmJveC54TWluICkgKQogICAgICAgewotICAgICAgICBGVF9GaXhlZCB2YWwgPSAwOworICAgICAgICBGVF9GaXhlZCAgdmFsID0gMDsKIAogCiAgICAgICAgIHJldHZhbCA9IHNpemVvZiAoIHZhbCApOwpAQCAtMjU4LDcgKzI2MCw3IEBACiAgICAgICBicmVhazsKIAogICAgIGNhc2UgUFNfRElDVF9GT05UX05BTUU6Ci0gICAgICByZXR2YWwgPSAoRlRfTG9uZykoIGZ0X3N0cmxlbiggdHlwZTEtPmZvbnRfbmFtZSApICsgMSApOworICAgICAgcmV0dmFsID0gZnRfc3RybGVuKCB0eXBlMS0+Zm9udF9uYW1lICkgKyAxOwogICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKICAgICAgICAgZnRfbWVtY3B5KCB2YWx1ZSwgKHZvaWQgKikoIHR5cGUxLT5mb250X25hbWUgKSwgcmV0dmFsICk7CiAgICAgICBicmVhazsKQEAgLTI3OCw3ICsyODAsNyBAQAogICAgIGNhc2UgUFNfRElDVF9DSEFSX1NUUklOR19LRVk6CiAgICAgICBpZiAoIGlkeCA8IChGVF9VSW50KXR5cGUxLT5udW1fZ2x5cGhzICkKICAgICAgIHsKLSAgICAgICAgcmV0dmFsID0gKEZUX0xvbmcpKCBmdF9zdHJsZW4oIHR5cGUxLT5nbHlwaF9uYW1lc1tpZHhdICkgKyAxICk7CisgICAgICAgIHJldHZhbCA9IGZ0X3N0cmxlbiggdHlwZTEtPmdseXBoX25hbWVzW2lkeF0gKSArIDE7CiAgICAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCiAgICAgICAgIHsKICAgICAgICAgICBmdF9tZW1jcHkoIHZhbHVlLCAodm9pZCAqKSggdHlwZTEtPmdseXBoX25hbWVzW2lkeF0gKSwgcmV0dmFsICk7CkBAIC0yOTAsNyArMjkyLDcgQEAKICAgICBjYXNlIFBTX0RJQ1RfQ0hBUl9TVFJJTkc6CiAgICAgICBpZiAoIGlkeCA8IChGVF9VSW50KXR5cGUxLT5udW1fZ2x5cGhzICkKICAgICAgIHsKLSAgICAgICAgcmV0dmFsID0gKEZUX0xvbmcpKCB0eXBlMS0+Y2hhcnN0cmluZ3NfbGVuW2lkeF0gKyAxICk7CisgICAgICAgIHJldHZhbCA9IHR5cGUxLT5jaGFyc3RyaW5nc19sZW5baWR4XSArIDE7CiAgICAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCiAgICAgICAgIHsKICAgICAgICAgICBmdF9tZW1jcHkoIHZhbHVlLCAodm9pZCAqKSggdHlwZTEtPmNoYXJzdHJpbmdzW2lkeF0gKSwKQEAgLTMxMCw3ICszMTIsNyBAQAogICAgICAgaWYgKCB0eXBlMS0+ZW5jb2RpbmdfdHlwZSA9PSBUMV9FTkNPRElOR19UWVBFX0FSUkFZICYmCiAgICAgICAgICAgIGlkeCA8IChGVF9VSW50KXR5cGUxLT5lbmNvZGluZy5udW1fY2hhcnMgICAgICAgKQogICAgICAgewotICAgICAgICByZXR2YWwgPSAoRlRfTG9uZykoIGZ0X3N0cmxlbiggdHlwZTEtPmVuY29kaW5nLmNoYXJfbmFtZVtpZHhdICkgKyAxICk7CisgICAgICAgIHJldHZhbCA9IGZ0X3N0cmxlbiggdHlwZTEtPmVuY29kaW5nLmNoYXJfbmFtZVtpZHhdICkgKyAxOwogICAgICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQogICAgICAgICB7CiAgICAgICAgICAgZnRfbWVtY3B5KCB2YWx1ZSwgKHZvaWQgKikoIHR5cGUxLT5lbmNvZGluZy5jaGFyX25hbWVbaWR4XSApLApAQCAtMzI5LDcgKzMzMSw3IEBACiAgICAgY2FzZSBQU19ESUNUX1NVQlI6CiAgICAgICBpZiAoIGlkeCA8IChGVF9VSW50KXR5cGUxLT5udW1fc3VicnMgKQogICAgICAgewotICAgICAgICByZXR2YWwgPSAoRlRfTG9uZykoIHR5cGUxLT5zdWJyc19sZW5baWR4XSArIDEgKTsKKyAgICAgICAgcmV0dmFsID0gdHlwZTEtPnN1YnJzX2xlbltpZHhdICsgMTsKICAgICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKICAgICAgICAgewogICAgICAgICAgIGZ0X21lbWNweSggdmFsdWUsICh2b2lkICopKCB0eXBlMS0+c3VicnNbaWR4XSApLCByZXR2YWwgLSAxICk7CkBAIC01MjMsMzEgKzUyNSwzMSBAQAogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIFBTX0RJQ1RfVkVSU0lPTjoKLSAgICAgIHJldHZhbCA9IChGVF9Mb25nKSggZnRfc3RybGVuKCB0eXBlMS0+Zm9udF9pbmZvLnZlcnNpb24gKSArIDEgKTsKKyAgICAgIHJldHZhbCA9IGZ0X3N0cmxlbiggdHlwZTEtPmZvbnRfaW5mby52ZXJzaW9uICkgKyAxOwogICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKICAgICAgICAgZnRfbWVtY3B5KCB2YWx1ZSwgKHZvaWQgKikoIHR5cGUxLT5mb250X2luZm8udmVyc2lvbiApLCByZXR2YWwgKTsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBQU19ESUNUX05PVElDRToKLSAgICAgIHJldHZhbCA9IChGVF9Mb25nKSggZnRfc3RybGVuKCB0eXBlMS0+Zm9udF9pbmZvLm5vdGljZSApICsgMSApOworICAgICAgcmV0dmFsID0gZnRfc3RybGVuKCB0eXBlMS0+Zm9udF9pbmZvLm5vdGljZSApICsgMTsKICAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCiAgICAgICAgIGZ0X21lbWNweSggdmFsdWUsICh2b2lkICopKCB0eXBlMS0+Zm9udF9pbmZvLm5vdGljZSApLCByZXR2YWwgKTsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBQU19ESUNUX0ZVTExfTkFNRToKLSAgICAgIHJldHZhbCA9IChGVF9Mb25nKSggZnRfc3RybGVuKCB0eXBlMS0+Zm9udF9pbmZvLmZ1bGxfbmFtZSApICsgMSApOworICAgICAgcmV0dmFsID0gZnRfc3RybGVuKCB0eXBlMS0+Zm9udF9pbmZvLmZ1bGxfbmFtZSApICsgMTsKICAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCiAgICAgICAgIGZ0X21lbWNweSggdmFsdWUsICh2b2lkICopKCB0eXBlMS0+Zm9udF9pbmZvLmZ1bGxfbmFtZSApLCByZXR2YWwgKTsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBQU19ESUNUX0ZBTUlMWV9OQU1FOgotICAgICAgcmV0dmFsID0gKEZUX0xvbmcpKCBmdF9zdHJsZW4oIHR5cGUxLT5mb250X2luZm8uZmFtaWx5X25hbWUgKSArIDEgKTsKKyAgICAgIHJldHZhbCA9IGZ0X3N0cmxlbiggdHlwZTEtPmZvbnRfaW5mby5mYW1pbHlfbmFtZSApICsgMTsKICAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCiAgICAgICAgIGZ0X21lbWNweSggdmFsdWUsICh2b2lkICopKCB0eXBlMS0+Zm9udF9pbmZvLmZhbWlseV9uYW1lICksIHJldHZhbCApOwogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIFBTX0RJQ1RfV0VJR0hUOgotICAgICAgcmV0dmFsID0gKEZUX0xvbmcpKCBmdF9zdHJsZW4oIHR5cGUxLT5mb250X2luZm8ud2VpZ2h0ICkgKyAxICk7CisgICAgICByZXR2YWwgPSBmdF9zdHJsZW4oIHR5cGUxLT5mb250X2luZm8ud2VpZ2h0ICkgKyAxOwogICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKICAgICAgICAgZnRfbWVtY3B5KCB2YWx1ZSwgKHZvaWQgKikoIHR5cGUxLT5mb250X2luZm8ud2VpZ2h0ICksIHJldHZhbCApOwogICAgICAgYnJlYWs7CkBAIC01NTksNyArNTYxLDcgQEAKICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIHJldHVybiByZXR2YWw7CisgICAgcmV0dXJuIHJldHZhbCA9PSAwID8gLTEgOiAoRlRfTG9uZylyZXR2YWw7CiAgIH0KIAogCkBAIC01OTAsNyArNTkyLDcgQEAKICAgewogICAgIHsgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0ZPTlRfTkFNRSwgJnQxX3NlcnZpY2VfcHNfbmFtZSB9LAogICAgIHsgRlRfU0VSVklDRV9JRF9HTFlQSF9ESUNULCAgICAgICAgICAgJnQxX3NlcnZpY2VfZ2x5cGhfZGljdCB9LAotICAgIHsgRlRfU0VSVklDRV9JRF9YRjg2X05BTUUsICAgICAgICAgICAgRlRfWEY4Nl9GT1JNQVRfVFlQRV8xIH0sCisgICAgeyBGVF9TRVJWSUNFX0lEX0ZPTlRfRk9STUFULCAgICAgICAgICBGVF9GT05UX0ZPUk1BVF9UWVBFXzEgfSwKICAgICB7IEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9JTkZPLCAgICAgICZ0MV9zZXJ2aWNlX3BzX2luZm8gfSwKIAogI2lmbmRlZiBUMV9DT05GSUdfT1BUSU9OX05PX0FGTQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3QxZHJpdmVyLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFkcml2ZXIuaAppbmRleCA2MzljZDRhLi4zNGJjZjgxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFkcml2ZXIuaAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFkcml2ZXIuaApAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBIaWdoLWxldmVsIFR5cGUgMSBkcml2ZXIgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDAxLCAyMDAyIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3QxZXJyb3JzLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFlcnJvcnMuaAppbmRleCA4NzQwNTMwLi5mYzdhOWJkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFlcnJvcnMuaAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFlcnJvcnMuaApAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBUeXBlIDEgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMSwgMjAxMiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDEtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3QxZ2xvYWQuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MWdsb2FkLmMKaW5kZXggYWYxMDJmZC4uODVhZGEyZSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3QxZ2xvYWQuYworKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFnbG9hZC5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFR5cGUgMSBHbHlwaCBMb2FkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDYsIDIwMDgtMjAxMCwgMjAxMywgMjAxNCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC01NCw3ICs1NCw3IEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCisgIHN0YXRpYyBGVF9FcnJvcgogICBUMV9QYXJzZV9HbHlwaF9BbmRfR2V0X0NoYXJfU3RyaW5nKCBUMV9EZWNvZGVyICBkZWNvZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnbHlwaF9pbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRGF0YSogICAgY2hhcl9zdHJpbmcgKQpAQCAtOTIsNyArOTIsNyBAQAogICAgIGlmICggIWVycm9yICkKICAgICAgIGVycm9yID0gZGVjb2Rlci0+ZnVuY3MucGFyc2VfY2hhcnN0cmluZ3MoCiAgICAgICAgICAgICAgICAgZGVjb2RlciwgKEZUX0J5dGUqKWNoYXJfc3RyaW5nLT5wb2ludGVyLAotICAgICAgICAgICAgICAgIGNoYXJfc3RyaW5nLT5sZW5ndGggKTsKKyAgICAgICAgICAgICAgICAoRlRfVUludCljaGFyX3N0cmluZy0+bGVuZ3RoICk7CiAKICNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCiAKQEAgLTE5NCw3ICsxOTQsNyBAQAogICAgIGZvciAoIGdseXBoX2luZGV4ID0gMDsgZ2x5cGhfaW5kZXggPCB0eXBlMS0+bnVtX2dseXBoczsgZ2x5cGhfaW5kZXgrKyApCiAgICAgewogICAgICAgLyogbm93IGdldCBsb2FkIHRoZSB1bnNjYWxlZCBvdXRsaW5lICovCi0gICAgICAodm9pZClUMV9QYXJzZV9HbHlwaCggJmRlY29kZXIsIGdseXBoX2luZGV4ICk7CisgICAgICAodm9pZClUMV9QYXJzZV9HbHlwaCggJmRlY29kZXIsIChGVF9VSW50KWdseXBoX2luZGV4ICk7CiAgICAgICBpZiAoIGdseXBoX2luZGV4ID09IDAgfHwgZGVjb2Rlci5idWlsZGVyLmFkdmFuY2UueCA+ICptYXhfYWR2YW5jZSApCiAgICAgICAgICptYXhfYWR2YW5jZSA9IGRlY29kZXIuYnVpbGRlci5hZHZhbmNlLng7CiAKQEAgLTM5NSw3ICszOTUsNiBAQAogICAgICAgewogICAgICAgICBGVF9CQm94ICAgICAgICAgICAgY2JveDsKICAgICAgICAgRlRfR2x5cGhfTWV0cmljcyogIG1ldHJpY3MgPSAmdDFnbHlwaC0+bWV0cmljczsKLSAgICAgICAgRlRfVmVjdG9yICAgICAgICAgIGFkdmFuY2U7CiAKIAogICAgICAgICAvKiBjb3B5IHRoZSBfdW5zY2FsZWRfIGFkdmFuY2Ugd2lkdGggKi8KQEAgLTQyNywyMyArNDI2LDI2IEBACiAKICNpZiAxCiAgICAgICAgIC8qIGFwcGx5IHRoZSBmb250IG1hdHJpeCwgaWYgYW55ICovCi0gICAgICAgIGlmICggZm9udF9tYXRyaXgueHggIT0gMHgxMDAwMEwgfHwgZm9udF9tYXRyaXgueXkgIT0gZm9udF9tYXRyaXgueHggfHwKLSAgICAgICAgICAgICBmb250X21hdHJpeC54eSAhPSAwICAgICAgICB8fCBmb250X21hdHJpeC55eCAhPSAwICAgICAgICAgICAgICApCisgICAgICAgIGlmICggZm9udF9tYXRyaXgueHggIT0gMHgxMDAwMEwgfHwgZm9udF9tYXRyaXgueXkgIT0gMHgxMDAwMEwgfHwKKyAgICAgICAgICAgICBmb250X21hdHJpeC54eSAhPSAwICAgICAgICB8fCBmb250X21hdHJpeC55eCAhPSAwICAgICAgICApCisgICAgICAgIHsKICAgICAgICAgICBGVF9PdXRsaW5lX1RyYW5zZm9ybSggJnQxZ2x5cGgtPm91dGxpbmUsICZmb250X21hdHJpeCApOwogCisgICAgICAgICAgbWV0cmljcy0+aG9yaUFkdmFuY2UgPSBGVF9NdWxGaXgoIG1ldHJpY3MtPmhvcmlBZHZhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X21hdHJpeC54eCApOworICAgICAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlID0gRlRfTXVsRml4KCBtZXRyaWNzLT52ZXJ0QWR2YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udF9tYXRyaXgueXkgKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmICggZm9udF9vZmZzZXQueCB8fCBmb250X29mZnNldC55ICkKKyAgICAgICAgewogICAgICAgICAgIEZUX091dGxpbmVfVHJhbnNsYXRlKCAmdDFnbHlwaC0+b3V0bGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udF9vZmZzZXQueCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udF9vZmZzZXQueSApOwogCi0gICAgICAgIGFkdmFuY2UueCA9IG1ldHJpY3MtPmhvcmlBZHZhbmNlOwotICAgICAgICBhZHZhbmNlLnkgPSAwOwotICAgICAgICBGVF9WZWN0b3JfVHJhbnNmb3JtKCAmYWR2YW5jZSwgJmZvbnRfbWF0cml4ICk7Ci0gICAgICAgIG1ldHJpY3MtPmhvcmlBZHZhbmNlID0gYWR2YW5jZS54ICsgZm9udF9vZmZzZXQueDsKLSAgICAgICAgYWR2YW5jZS54ID0gMDsKLSAgICAgICAgYWR2YW5jZS55ID0gbWV0cmljcy0+dmVydEFkdmFuY2U7Ci0gICAgICAgIEZUX1ZlY3Rvcl9UcmFuc2Zvcm0oICZhZHZhbmNlLCAmZm9udF9tYXRyaXggKTsKLSAgICAgICAgbWV0cmljcy0+dmVydEFkdmFuY2UgPSBhZHZhbmNlLnkgKyBmb250X29mZnNldC55OworICAgICAgICAgIG1ldHJpY3MtPmhvcmlBZHZhbmNlICs9IGZvbnRfb2Zmc2V0Lng7CisgICAgICAgICAgbWV0cmljcy0+dmVydEFkdmFuY2UgKz0gZm9udF9vZmZzZXQueTsKKyAgICAgICAgfQogI2VuZGlmCiAKICAgICAgICAgaWYgKCAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkgPT0gMCApCkBAIC01MDQsNyArNTA2LDcgQEAKIAogICAgICAgLyogU2V0IHRoZSBjb250cm9sIGRhdGEgdG8gbnVsbCAtIGl0IGlzIG5vIGxvbmdlciBhdmFpbGFibGUgaWYgICAqLwogICAgICAgLyogbG9hZGVkIGluY3JlbWVudGFsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgdDFnbHlwaC0+Y29udHJvbF9kYXRhID0gMDsKKyAgICAgIHQxZ2x5cGgtPmNvbnRyb2xfZGF0YSA9IE5VTEw7CiAgICAgICB0MWdseXBoLT5jb250cm9sX2xlbiAgPSAwOwogICAgIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3QxZ2xvYWQuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MWdsb2FkLmgKaW5kZXggMGJkZWEzYS4uMDVmNjBkNSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3QxZ2xvYWQuaAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFnbG9hZC5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFR5cGUgMSBHbHlwaCBMb2FkZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDMsIDIwMDgsIDIwMTEgYnkgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFsb2FkLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFsb2FkLmMKaW5kZXggMjJiM2Y2Yi4uZGJmNGVhZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3QxbG9hZC5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MWxvYWQuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBUeXBlIDEgZm9udCBsb2FkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtMjI2LDcgKzIyNiw3IEBACiAgIC8qIEdpdmVuIGEgbm9ybWFsaXplZCAoYmxlbmQpIGNvb3JkaW5hdGUsIGZpZ3VyZSBvdXQgdGhlIGRlc2lnbiAgICAgICAgICAqLwogICAvKiBjb29yZGluYXRlIGFwcHJvcHJpYXRlIGZvciB0aGF0IHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRml4ZWQgKQorICBzdGF0aWMgRlRfRml4ZWQKICAgbW1fYXhpc191bm1hcCggUFNfRGVzaWduTWFwICBheGlzbWFwLAogICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICAgIG5jdiApCiAgIHsKQEAgLTI1NSw3ICsyNTUsNyBAQAogICAvKiBHaXZlbiBhIHZlY3RvciBvZiB3ZWlnaHRzLCBvbmUgZm9yIGVhY2ggZGVzaWduLCBmaWd1cmUgb3V0IHRoZSAgICAgICAgKi8KICAgLyogbm9ybWFsaXplZCBheGlzIGNvb3JkaW5hdGVzIHdoaWNoIGdhdmUgcmlzZSB0byB0aG9zZSB3ZWlnaHRzLiAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQorICBzdGF0aWMgdm9pZAogICBtbV93ZWlnaHRzX3VubWFwKCBGVF9GaXhlZCogIHdlaWdodHMsCiAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgYXhpc2Nvb3JkcywKICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBheGlzX2NvdW50ICkKQEAgLTM2OCw0NCArMzY4LDQzIEBACiAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMgKQogICB7CiAgICAgUFNfQmxlbmQgIGJsZW5kID0gZmFjZS0+YmxlbmQ7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwogICAgIEZUX1VJbnQgICBuLCBtOwogCiAKLSAgICBlcnJvciA9IEZUX0VSUiggSW52YWxpZF9Bcmd1bWVudCApOworICAgIGlmICggIWJsZW5kICkKKyAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwogCi0gICAgaWYgKCBibGVuZCAmJiBibGVuZC0+bnVtX2F4aXMgPT0gbnVtX2Nvb3JkcyApCisgICAgaWYgKCBudW1fY29vcmRzID4gYmxlbmQtPm51bV9heGlzICkKKyAgICAgIG51bV9jb29yZHMgPSBibGVuZC0+bnVtX2F4aXM7CisKKyAgICAvKiByZWNvbXB1dGUgdGhlIHdlaWdodCB2ZWN0b3IgZnJvbSB0aGUgYmxlbmQgY29vcmRpbmF0ZXMgKi8KKyAgICBmb3IgKCBuID0gMDsgbiA8IGJsZW5kLT5udW1fZGVzaWduczsgbisrICkKICAgICB7Ci0gICAgICAvKiByZWNvbXB1dGUgdGhlIHdlaWdodCB2ZWN0b3IgZnJvbSB0aGUgYmxlbmQgY29vcmRpbmF0ZXMgKi8KLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgYmxlbmQtPm51bV9kZXNpZ25zOyBuKysgKQorICAgICAgRlRfRml4ZWQgIHJlc3VsdCA9IDB4MTAwMDBMOyAgLyogMS4wIGZpeGVkICovCisKKworICAgICAgZm9yICggbSA9IDA7IG0gPCBibGVuZC0+bnVtX2F4aXM7IG0rKyApCiAgICAgICB7Ci0gICAgICAgIEZUX0ZpeGVkICByZXN1bHQgPSAweDEwMDAwTDsgIC8qIDEuMCBmaXhlZCAqLworICAgICAgICBGVF9GaXhlZCAgZmFjdG9yOwogCiAKLSAgICAgICAgZm9yICggbSA9IDA7IG0gPCBibGVuZC0+bnVtX2F4aXM7IG0rKyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9GaXhlZCAgZmFjdG9yOworICAgICAgICAvKiBnZXQgY3VycmVudCBibGVuZCBheGlzIHBvc2l0aW9uOyAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qIHVzZSBhIGRlZmF1bHQgdmFsdWUgaWYgd2UgZG9uJ3QgaGF2ZSBhIGNvb3JkaW5hdGUgKi8KKyAgICAgICAgZmFjdG9yID0gbSA8IG51bV9jb29yZHMgPyBjb29yZHNbbV0gOiAweDgwMDA7CisgICAgICAgIGlmICggZmFjdG9yIDwgMCApCisgICAgICAgICAgZmFjdG9yID0gMDsKKyAgICAgICAgaWYgKCBmYWN0b3IgPiAweDEwMDAwTCApCisgICAgICAgICAgZmFjdG9yID0gMHgxMDAwMEw7CiAKKyAgICAgICAgaWYgKCAoIG4gJiAoIDEgPDwgbSApICkgPT0gMCApCisgICAgICAgICAgZmFjdG9yID0gMHgxMDAwMEwgLSBmYWN0b3I7CiAKLSAgICAgICAgICAvKiBnZXQgY3VycmVudCBibGVuZCBheGlzIHBvc2l0aW9uICovCi0gICAgICAgICAgZmFjdG9yID0gY29vcmRzW21dOwotICAgICAgICAgIGlmICggZmFjdG9yIDwgMCApCi0gICAgICAgICAgICBmYWN0b3IgPSAwOwotICAgICAgICAgIGlmICggZmFjdG9yID4gMHgxMDAwMEwgKQotICAgICAgICAgICAgZmFjdG9yID0gMHgxMDAwMEw7Ci0KLSAgICAgICAgICBpZiAoICggbiAmICggMSA8PCBtICkgKSA9PSAwICkKLSAgICAgICAgICAgIGZhY3RvciA9IDB4MTAwMDBMIC0gZmFjdG9yOwotCi0gICAgICAgICAgcmVzdWx0ID0gRlRfTXVsRml4KCByZXN1bHQsIGZhY3RvciApOwotICAgICAgICB9Ci0gICAgICAgIGJsZW5kLT53ZWlnaHRfdmVjdG9yW25dID0gcmVzdWx0OworICAgICAgICByZXN1bHQgPSBGVF9NdWxGaXgoIHJlc3VsdCwgZmFjdG9yICk7CiAgICAgICB9Ci0KLSAgICAgIGVycm9yID0gRlRfRXJyX09rOworICAgICAgYmxlbmQtPndlaWdodF92ZWN0b3Jbbl0gPSByZXN1bHQ7CiAgICAgfQogCi0gICAgcmV0dXJuIGVycm9yOworICAgIHJldHVybiBGVF9FcnJfT2s7CiAgIH0KIAogCkBAIC00MTUsNjggKzQxNCw3MiBAQAogICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgY29vcmRzICkKICAgewogICAgIFBTX0JsZW5kICBibGVuZCA9IGZhY2UtPmJsZW5kOwotICAgIEZUX0Vycm9yICBlcnJvcjsKICAgICBGVF9VSW50ICAgbiwgcDsKKyAgICBGVF9GaXhlZCAgZmluYWxfYmxlbmRzW1QxX01BWF9NTV9ERVNJR05TXTsKIAogCi0gICAgZXJyb3IgPSBGVF9FUlIoIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICBpZiAoIGJsZW5kICYmIGJsZW5kLT5udW1fYXhpcyA9PSBudW1fY29vcmRzICkKKyAgICBpZiAoICFibGVuZCApCisgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKKworICAgIGlmICggbnVtX2Nvb3JkcyA+IGJsZW5kLT5udW1fYXhpcyApCisgICAgICBudW1fY29vcmRzID0gYmxlbmQtPm51bV9heGlzOworCisgICAgLyogY29tcHV0ZSB0aGUgYmxlbmQgY29vcmRpbmF0ZXMgdGhyb3VnaCB0aGUgYmxlbmQgZGVzaWduIG1hcCAqLworCisgICAgZm9yICggbiA9IDA7IG4gPCBibGVuZC0+bnVtX2F4aXM7IG4rKyApCiAgICAgewotICAgICAgLyogY29tcHV0ZSB0aGUgYmxlbmQgY29vcmRpbmF0ZXMgdGhyb3VnaCB0aGUgYmxlbmQgZGVzaWduIG1hcCAqLwotICAgICAgRlRfRml4ZWQgIGZpbmFsX2JsZW5kc1tUMV9NQVhfTU1fREVTSUdOU107CisgICAgICBGVF9Mb25nICAgICAgIGRlc2lnbjsKKyAgICAgIEZUX0ZpeGVkICAgICAgdGhlX2JsZW5kOworICAgICAgUFNfRGVzaWduTWFwICBtYXAgICAgID0gYmxlbmQtPmRlc2lnbl9tYXAgKyBuOworICAgICAgRlRfTG9uZyogICAgICBkZXNpZ25zID0gbWFwLT5kZXNpZ25fcG9pbnRzOworICAgICAgRlRfRml4ZWQqICAgICBibGVuZHMgID0gbWFwLT5ibGVuZF9wb2ludHM7CisgICAgICBGVF9JbnQgICAgICAgIGJlZm9yZSAgPSAtMSwgYWZ0ZXIgPSAtMTsKIAogCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IGJsZW5kLT5udW1fYXhpczsgbisrICkKKyAgICAgIC8qIHVzZSBhIGRlZmF1bHQgdmFsdWUgaWYgd2UgZG9uJ3QgaGF2ZSBhIGNvb3JkaW5hdGUgKi8KKyAgICAgIGlmICggbiA8IG51bV9jb29yZHMgKQorICAgICAgICBkZXNpZ24gPSBjb29yZHNbbl07CisgICAgICBlbHNlCisgICAgICAgIGRlc2lnbiA9ICggZGVzaWduc1ttYXAtPm51bV9wb2ludHMgLSAxXSAtIGRlc2lnbnNbMF0gKSAvIDI7CisKKyAgICAgIGZvciAoIHAgPSAwOyBwIDwgKEZUX1VJbnQpbWFwLT5udW1fcG9pbnRzOyBwKysgKQogICAgICAgewotICAgICAgICBGVF9Mb25nICAgICAgIGRlc2lnbiAgPSBjb29yZHNbbl07Ci0gICAgICAgIEZUX0ZpeGVkICAgICAgdGhlX2JsZW5kOwotICAgICAgICBQU19EZXNpZ25NYXAgIG1hcCAgICAgPSBibGVuZC0+ZGVzaWduX21hcCArIG47Ci0gICAgICAgIEZUX0xvbmcqICAgICAgZGVzaWducyA9IG1hcC0+ZGVzaWduX3BvaW50czsKLSAgICAgICAgRlRfRml4ZWQqICAgICBibGVuZHMgID0gbWFwLT5ibGVuZF9wb2ludHM7Ci0gICAgICAgIEZUX0ludCAgICAgICAgYmVmb3JlICA9IC0xLCBhZnRlciA9IC0xOworICAgICAgICBGVF9Mb25nICBwX2Rlc2lnbiA9IGRlc2lnbnNbcF07CiAKIAotICAgICAgICBmb3IgKCBwID0gMDsgcCA8IChGVF9VSW50KW1hcC0+bnVtX3BvaW50czsgcCsrICkKKyAgICAgICAgLyogZXhhY3QgbWF0Y2g/ICovCisgICAgICAgIGlmICggZGVzaWduID09IHBfZGVzaWduICkKICAgICAgICAgewotICAgICAgICAgIEZUX0xvbmcgIHBfZGVzaWduID0gZGVzaWduc1twXTsKLQotCi0gICAgICAgICAgLyogZXhhY3QgbWF0Y2g/ICovCi0gICAgICAgICAgaWYgKCBkZXNpZ24gPT0gcF9kZXNpZ24gKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRoZV9ibGVuZCA9IGJsZW5kc1twXTsKLSAgICAgICAgICAgIGdvdG8gRm91bmQ7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCBkZXNpZ24gPCBwX2Rlc2lnbiApCi0gICAgICAgICAgewotICAgICAgICAgICAgYWZ0ZXIgPSBwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgYmVmb3JlID0gcDsKKyAgICAgICAgICB0aGVfYmxlbmQgPSBibGVuZHNbcF07CisgICAgICAgICAgZ290byBGb3VuZDsKICAgICAgICAgfQogCi0gICAgICAgIC8qIG5vdyBpbnRlcnBvbGF0ZSBpZiBuZWNlc3NhcnkgKi8KLSAgICAgICAgaWYgKCBiZWZvcmUgPCAwICkKLSAgICAgICAgICB0aGVfYmxlbmQgPSBibGVuZHNbMF07CisgICAgICAgIGlmICggZGVzaWduIDwgcF9kZXNpZ24gKQorICAgICAgICB7CisgICAgICAgICAgYWZ0ZXIgPSAoRlRfSW50KXA7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotICAgICAgICBlbHNlIGlmICggYWZ0ZXIgPCAwICkKLSAgICAgICAgICB0aGVfYmxlbmQgPSBibGVuZHNbbWFwLT5udW1fcG9pbnRzIC0gMV07Ci0KLSAgICAgICAgZWxzZQotICAgICAgICAgIHRoZV9ibGVuZCA9IEZUX011bERpdiggZGVzaWduICAgICAgICAgLSBkZXNpZ25zW2JlZm9yZV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZHMgW2FmdGVyXSAtIGJsZW5kcyBbYmVmb3JlXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lnbnNbYWZ0ZXJdIC0gZGVzaWduc1tiZWZvcmVdICk7Ci0KLSAgICAgIEZvdW5kOgotICAgICAgICBmaW5hbF9ibGVuZHNbbl0gPSB0aGVfYmxlbmQ7CisgICAgICAgIGJlZm9yZSA9IChGVF9JbnQpcDsKICAgICAgIH0KIAotICAgICAgZXJyb3IgPSBUMV9TZXRfTU1fQmxlbmQoIGZhY2UsIG51bV9jb29yZHMsIGZpbmFsX2JsZW5kcyApOworICAgICAgLyogbm93IGludGVycG9sYXRlIGlmIG5lY2Vzc2FyeSAqLworICAgICAgaWYgKCBiZWZvcmUgPCAwICkKKyAgICAgICAgdGhlX2JsZW5kID0gYmxlbmRzWzBdOworCisgICAgICBlbHNlIGlmICggYWZ0ZXIgPCAwICkKKyAgICAgICAgdGhlX2JsZW5kID0gYmxlbmRzW21hcC0+bnVtX3BvaW50cyAtIDFdOworCisgICAgICBlbHNlCisgICAgICAgIHRoZV9ibGVuZCA9IEZUX011bERpdiggZGVzaWduICAgICAgICAgLSBkZXNpZ25zW2JlZm9yZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRzIFthZnRlcl0gLSBibGVuZHMgW2JlZm9yZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaWduc1thZnRlcl0gLSBkZXNpZ25zW2JlZm9yZV0gKTsKKworICAgIEZvdW5kOgorICAgICAgZmluYWxfYmxlbmRzW25dID0gdGhlX2JsZW5kOwogICAgIH0KIAotICAgIHJldHVybiBlcnJvcjsKKyAgICByZXR1cm4gVDFfU2V0X01NX0JsZW5kKCBmYWNlLCBibGVuZC0+bnVtX2F4aXMsIGZpbmFsX2JsZW5kcyApOwogICB9CiAKIApAQCAtNDkwLDIwICs0OTMsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICkKICAgewotICAgICBGVF9Mb25nICAgbGNvb3Jkc1s0XTsgICAgICAgICAgLyogbWF4aW11bSBheGlzIGNvdW50IGlzIDQgKi8KLSAgICAgRlRfVUludCAgIGk7Ci0gICAgIEZUX0Vycm9yICBlcnJvcjsKKyAgICAgRlRfTG9uZyAgbGNvb3Jkc1tUMV9NQVhfTU1fQVhJU107CisgICAgIEZUX1VJbnQgIGk7CiAKIAotICAgICBlcnJvciA9IEZUX0VSUiggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICBpZiAoIG51bV9jb29yZHMgPD0gNCAmJiBudW1fY29vcmRzID4gMCApCi0gICAgIHsKLSAgICAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9jb29yZHM7ICsraSApCi0gICAgICAgICBsY29vcmRzW2ldID0gRklYRURfVE9fSU5UKCBjb29yZHNbaV0gKTsKLSAgICAgICBlcnJvciA9IFQxX1NldF9NTV9EZXNpZ24oIGZhY2UsIG51bV9jb29yZHMsIGxjb29yZHMgKTsKLSAgICAgfQorICAgICBpZiAoIG51bV9jb29yZHMgPiBUMV9NQVhfTU1fQVhJUyApCisgICAgICAgbnVtX2Nvb3JkcyA9IFQxX01BWF9NTV9BWElTOwogCi0gICAgIHJldHVybiBlcnJvcjsKKyAgICAgZm9yICggaSA9IDA7IGkgPCBudW1fY29vcmRzOyArK2kgKQorICAgICAgIGxjb29yZHNbaV0gPSBGSVhFRF9UT19JTlQoIGNvb3Jkc1tpXSApOworCisgICAgIHJldHVybiBUMV9TZXRfTU1fRGVzaWduKCBmYWNlLCBudW1fY29vcmRzLCBsY29vcmRzICk7CiAgIH0KIAogCkBAIC01OTksMjMgKzU5OSwzMiBAQAogICAgIC8qIGVhY2ggdG9rZW4gaXMgYW4gaW1tZWRpYXRlIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGF4aXMgKi8KICAgICBmb3IgKCBuID0gMDsgbiA8IG51bV9heGlzOyBuKysgKQogICAgIHsKLSAgICAgIFQxX1Rva2VuICAgIHRva2VuID0gYXhpc190b2tlbnMgKyBuOwotICAgICAgRlRfQnl0ZSogICAgbmFtZTsKLSAgICAgIEZUX1B0ckRpc3QgIGxlbjsKKyAgICAgIFQxX1Rva2VuICB0b2tlbiA9IGF4aXNfdG9rZW5zICsgbjsKKyAgICAgIEZUX0J5dGUqICBuYW1lOworICAgICAgRlRfVUludCAgIGxlbjsKIAogCiAgICAgICAvKiBza2lwIGZpcnN0IHNsYXNoLCBpZiBhbnkgKi8KICAgICAgIGlmICggdG9rZW4tPnN0YXJ0WzBdID09ICcvJyApCiAgICAgICAgIHRva2VuLT5zdGFydCsrOwogCi0gICAgICBsZW4gPSB0b2tlbi0+bGltaXQgLSB0b2tlbi0+c3RhcnQ7CisgICAgICBsZW4gPSAoRlRfVUludCkoIHRva2VuLT5saW1pdCAtIHRva2VuLT5zdGFydCApOwogICAgICAgaWYgKCBsZW4gPT0gMCApCiAgICAgICB7CiAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKICAgICAgICAgZ290byBFeGl0OwogICAgICAgfQogCi0gICAgICBpZiAoIEZUX0FMTE9DKCBibGVuZC0+YXhpc19uYW1lc1tuXSwgKEZUX0xvbmcpKCBsZW4gKyAxICkgKSApCisgICAgICBuYW1lID0gKEZUX0J5dGUqKWJsZW5kLT5heGlzX25hbWVzW25dOworICAgICAgaWYgKCBuYW1lICkKKyAgICAgIHsKKyAgICAgICAgRlRfVFJBQ0UwKCggInBhcnNlX2JsZW5kX2F4aXNfdHlwZXM6IgorICAgICAgICAgICAgICAgICAgICAiIG92ZXJ3cml0aW5nIGF4aXMgbmFtZSBgJXMnIHdpdGggYCUqLnMnXG4iLAorICAgICAgICAgICAgICAgICAgICBuYW1lLCBsZW4sIHRva2VuLT5zdGFydCApKTsKKyAgICAgICAgRlRfRlJFRSggbmFtZSApOworICAgICAgfQorCisgICAgICBpZiAoIEZUX0FMTE9DKCBibGVuZC0+YXhpc19uYW1lc1tuXSwgbGVuICsgMSApICkKICAgICAgICAgZ290byBFeGl0OwogCiAgICAgICBuYW1lID0gKEZUX0J5dGUqKWJsZW5kLT5heGlzX25hbWVzW25dOwpAQCAtNjkyLDcgKzcwMSw5IEBACiAgICAgICAgICAgfQogCiAgICAgICAgICAgbnVtX2F4aXMgPSBuX2F4aXM7Ci0gICAgICAgICAgZXJyb3IgPSB0MV9hbGxvY2F0ZV9ibGVuZCggZmFjZSwgbnVtX2Rlc2lnbnMsIG51bV9heGlzICk7CisgICAgICAgICAgZXJyb3IgPSB0MV9hbGxvY2F0ZV9ibGVuZCggZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludCludW1fZGVzaWducywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludCludW1fYXhpcyApOwogICAgICAgICAgIGlmICggZXJyb3IgKQogICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICAgIGJsZW5kID0gZmFjZS0+YmxlbmQ7CkBAIC03NTcsNyArNzY4LDcgQEAKICAgICBvbGRfY3Vyc29yID0gcGFyc2VyLT5yb290LmN1cnNvcjsKICAgICBvbGRfbGltaXQgID0gcGFyc2VyLT5yb290LmxpbWl0OwogCi0gICAgZXJyb3IgPSB0MV9hbGxvY2F0ZV9ibGVuZCggZmFjZSwgMCwgbnVtX2F4aXMgKTsKKyAgICBlcnJvciA9IHQxX2FsbG9jYXRlX2JsZW5kKCBmYWNlLCAwLCAoRlRfVUludCludW1fYXhpcyApOwogICAgIGlmICggZXJyb3IgKQogICAgICAgZ290byBFeGl0OwogICAgIGJsZW5kID0gZmFjZS0+YmxlbmQ7CkBAIC03ODUsNiArNzk2LDEzIEBACiAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgIH0KIAorICAgICAgaWYgKCBtYXAtPmRlc2lnbl9wb2ludHMgKQorICAgICAgeworICAgICAgICBGVF9FUlJPUigoICJwYXJzZV9ibGVuZF9kZXNpZ25fbWFwOiBkdXBsaWNhdGUgdGFibGVcbiIgKSk7CisgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKKyAgICAgICAgZ290byBFeGl0OworICAgICAgfQorCiAgICAgICAvKiBhbGxvY2F0ZSBkZXNpZ24gbWFwIGRhdGEgKi8KICAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBtYXAtPmRlc2lnbl9wb2ludHMsIG51bV9wb2ludHMgKiAyICkgKQogICAgICAgICBnb3RvIEV4aXQ7CkBAIC04NDgsNyArODY2LDcgQEAKIAogICAgIGlmICggIWJsZW5kIHx8ICFibGVuZC0+bnVtX2Rlc2lnbnMgKQogICAgIHsKLSAgICAgIGVycm9yID0gdDFfYWxsb2NhdGVfYmxlbmQoIGZhY2UsIG51bV9kZXNpZ25zLCAwICk7CisgICAgICBlcnJvciA9IHQxX2FsbG9jYXRlX2JsZW5kKCBmYWNlLCAoRlRfVUludCludW1fZGVzaWducywgMCApOwogICAgICAgaWYgKCBlcnJvciApCiAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgIGJsZW5kID0gZmFjZS0+YmxlbmQ7CkBAIC04OTAsOCArOTA4LDggQEAKICAgcGFyc2VfYnVpbGRjaGFyKCBUMV9GYWNlICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgVDFfTG9hZGVyICBsb2FkZXIgKQogICB7Ci0gICAgZmFjZS0+bGVuX2J1aWxkY2hhciA9IFQxX1RvRml4ZWRBcnJheSggJmxvYWRlci0+cGFyc2VyLCAwLCBOVUxMLCAwICk7Ci0KKyAgICBmYWNlLT5sZW5fYnVpbGRjaGFyID0gKEZUX1VJbnQpVDFfVG9GaXhlZEFycmF5KCAmbG9hZGVyLT5wYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCwgMCApOwogICAgIHJldHVybjsKICAgfQogCkBAIC0xMDM4LDkgKzEwNTYsMTEgQEAKICAgfQogCiAKKyAgLyogcmV0dXJuIDEgaW4gY2FzZSBvZiBzdWNjZXNzICovCisKICAgc3RhdGljIGludAogICByZWFkX2JpbmFyeV9kYXRhKCBUMV9QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogICBzaXplLAorICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIHNpemUsCiAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqKiAgYmFzZSwKICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICBpbmNyZW1lbnRhbCApCiAgIHsKQEAgLTEwNzIsNyArMTA5Miw3IEBACiAgICAgICBpZiAoIHMgPj0gMCAmJiBzIDwgbGltaXQgLSAqYmFzZSApCiAgICAgICB7CiAgICAgICAgIHBhcnNlci0+cm9vdC5jdXJzb3IgKz0gcyArIDE7Ci0gICAgICAgICpzaXplID0gczsKKyAgICAgICAgKnNpemUgPSAoRlRfVUxvbmcpczsKICAgICAgICAgcmV0dXJuICFwYXJzZXItPnJvb3QuZXJyb3I7CiAgICAgICB9CiAgICAgfQpAQCAtMTEwMyw2ICsxMTIzLDcgQEAKICAgICBGVF9JbnQgICAgICByZXN1bHQ7CiAKIAorICAgIC8qIGlucHV0IGlzIHNjYWxlZCBieSAxMDAwIHRvIGFjY29tbW9kYXRlIGRlZmF1bHQgRm9udE1hdHJpeCAqLwogICAgIHJlc3VsdCA9IFQxX1RvRml4ZWRBcnJheSggcGFyc2VyLCA2LCB0ZW1wLCAzICk7CiAKICAgICBpZiAoIHJlc3VsdCA8IDYgKQpAQCAtMTEyMCwxNSArMTE0MSwxMiBAQAogICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8qIFNldCBVbml0cyBwZXIgRU0gYmFzZWQgb24gRm9udE1hdHJpeCB2YWx1ZXMuICBXZSBzZXQgdGhlIHZhbHVlIHRvICovCi0gICAgLyogMTAwMCAvIHRlbXBfc2NhbGUsIGJlY2F1c2UgdGVtcF9zY2FsZSB3YXMgYWxyZWFkeSBtdWx0aXBsaWVkIGJ5ICAgKi8KLSAgICAvKiAxMDAwIChpbiB0MV90b2ZpeGVkLCBmcm9tIHBzb2Jqcy5jKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgcm9vdC0+dW5pdHNfcGVyX0VNID0gKEZUX1VTaG9ydClGVF9EaXZGaXgoIDEwMDAsIHRlbXBfc2NhbGUgKTsKLQotICAgIC8qIHdlIG5lZWQgdG8gc2NhbGUgdGhlIHZhbHVlcyBieSAxLjAvdGVtcF9zY2FsZSAqLworICAgIC8qIGF0eXBpY2FsIGNhc2UgKi8KICAgICBpZiAoIHRlbXBfc2NhbGUgIT0gMHgxMDAwMEwgKQogICAgIHsKKyAgICAgIC8qIHNldCB1bml0cyBwZXIgRU0gYmFzZWQgb24gRm9udE1hdHJpeCB2YWx1ZXMgKi8KKyAgICAgIHJvb3QtPnVuaXRzX3Blcl9FTSA9IChGVF9VU2hvcnQpRlRfRGl2Rml4KCAxMDAwLCB0ZW1wX3NjYWxlICk7CisKICAgICAgIHRlbXBbMF0gPSBGVF9EaXZGaXgoIHRlbXBbMF0sIHRlbXBfc2NhbGUgKTsKICAgICAgIHRlbXBbMV0gPSBGVF9EaXZGaXgoIHRlbXBbMV0sIHRlbXBfc2NhbGUgKTsKICAgICAgIHRlbXBbMl0gPSBGVF9EaXZGaXgoIHRlbXBbMl0sIHRlbXBfc2NhbGUgKTsKQEAgLTExOTAsMTAgKzEyMDgsMjcgQEAKICAgICAgIGVsc2UKICAgICAgICAgY291bnQgPSAoRlRfSW50KVQxX1RvSW50KCBwYXJzZXIgKTsKIAorICAgICAgLyogb25seSBjb21wb3NpdGUgZm9udHMgKHdoaWNoIHdlIGRvbid0IHN1cHBvcnQpICovCisgICAgICAvKiBjYW4gaGF2ZSBsYXJnZXIgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIGlmICggY291bnQgPiAyNTYgKQorICAgICAgeworICAgICAgICBGVF9FUlJPUigoICJwYXJzZV9lbmNvZGluZzogaW52YWxpZCBlbmNvZGluZyBhcnJheSBzaXplXG4iICkpOworICAgICAgICBwYXJzZXItPnJvb3QuZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOworICAgICAgICByZXR1cm47CisgICAgICB9CisKICAgICAgIFQxX1NraXBfU3BhY2VzKCBwYXJzZXIgKTsKICAgICAgIGlmICggcGFyc2VyLT5yb290LmN1cnNvciA+PSBsaW1pdCApCiAgICAgICAgIHJldHVybjsKIAorICAgICAgLyogUG9zdFNjcmlwdCBoYXBwaWx5IGFsbG93cyBvdmVyd3JpdGluZyBvZiBlbmNvZGluZyBhcnJheXMgKi8KKyAgICAgIGlmICggZW5jb2RlLT5jaGFyX2luZGV4ICkKKyAgICAgIHsKKyAgICAgICAgRlRfRlJFRSggZW5jb2RlLT5jaGFyX2luZGV4ICk7CisgICAgICAgIEZUX0ZSRUUoIGVuY29kZS0+Y2hhcl9uYW1lICk7CisgICAgICAgIFQxX1JlbGVhc2VfVGFibGUoIGNoYXJfdGFibGUgKTsKKyAgICAgIH0KKwogICAgICAgLyogd2UgdXNlIGEgVDFfVGFibGUgdG8gc3RvcmUgb3VyIGNoYXJuYW1lcyAqLwogICAgICAgbG9hZGVyLT5udW1fY2hhcnMgPSBlbmNvZGUtPm51bV9jaGFycyA9IGNvdW50OwogICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIGVuY29kZS0+Y2hhcl9pbmRleCwgY291bnQgKSAgICAgfHwKQEAgLTEyODUsNyArMTMyMCw3IEBACiAKICAgICAgICAgICBpZiAoIGN1ciArIDIgPCBsaW1pdCAmJiAqY3VyID09ICcvJyAmJiBuIDwgY291bnQgKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1B0ckRpc3QgIGxlbjsKKyAgICAgICAgICAgIEZUX1VJbnQgIGxlbjsKIAogCiAgICAgICAgICAgICBjdXIrKzsKQEAgLTEyOTcsNyArMTMzMiw3IEBACiAgICAgICAgICAgICBpZiAoIHBhcnNlci0+cm9vdC5lcnJvciApCiAgICAgICAgICAgICAgIHJldHVybjsKIAotICAgICAgICAgICAgbGVuID0gcGFyc2VyLT5yb290LmN1cnNvciAtIGN1cjsKKyAgICAgICAgICAgIGxlbiA9IChGVF9VSW50KSggcGFyc2VyLT5yb290LmN1cnNvciAtIGN1ciApOwogCiAgICAgICAgICAgICBwYXJzZXItPnJvb3QuZXJyb3IgPSBUMV9BZGRfVGFibGUoIGNoYXJfdGFibGUsIGNoYXJjb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXIsIGxlbiArIDEgKTsKQEAgLTE0MDcsNyArMTQ0Miw4IEBACiAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICBmb3IgKDs7KQogICAgIHsKLSAgICAgIEZUX0xvbmcgICBpZHgsIHNpemU7CisgICAgICBGVF9Mb25nICAgaWR4OworICAgICAgRlRfVUxvbmcgIHNpemU7CiAgICAgICBGVF9CeXRlKiAgYmFzZTsKIAogCkBAIC0xNDU3LDcgKzE0OTMsNyBAQAogICAgICAgICAvKiBzb21lIGZvbnRzIGRlZmluZSBlbXB0eSBzdWJyIHJlY29yZHMgLS0gdGhpcyBpcyBub3QgdG90YWxseSAqLwogICAgICAgICAvKiBjb21wbGlhbnQgdG8gdGhlIHNwZWNpZmljYXRpb24gKHdoaWNoIHNheXMgdGhleSBzaG91bGQgYXQgICAqLwogICAgICAgICAvKiBsZWFzdCBjb250YWluIGEgYHJldHVybicpLCBidXQgd2Ugc3VwcG9ydCB0aGVtIGFueXdheSAgICAgICAqLwotICAgICAgICBpZiAoIHNpemUgPCBmYWNlLT50eXBlMS5wcml2YXRlX2RpY3QubGVuSVYgKQorICAgICAgICBpZiAoIHNpemUgPCAoRlRfVUxvbmcpZmFjZS0+dHlwZTEucHJpdmF0ZV9kaWN0LmxlbklWICkKICAgICAgICAgewogICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKICAgICAgICAgICBnb3RvIEZhaWw7CkBAIC0xNDY4LDcgKzE1MDQsNyBAQAogICAgICAgICAgIGdvdG8gRmFpbDsKICAgICAgICAgRlRfTUVNX0NPUFkoIHRlbXAsIGJhc2UsIHNpemUgKTsKICAgICAgICAgcHNhdXgtPnQxX2RlY3J5cHQoIHRlbXAsIHNpemUsIDQzMzAgKTsKLSAgICAgICAgc2l6ZSAtPSBmYWNlLT50eXBlMS5wcml2YXRlX2RpY3QubGVuSVY7CisgICAgICAgIHNpemUgLT0gKEZUX1VMb25nKWZhY2UtPnR5cGUxLnByaXZhdGVfZGljdC5sZW5JVjsKICAgICAgICAgZXJyb3IgPSBUMV9BZGRfVGFibGUoIHRhYmxlLCAoRlRfSW50KWlkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgKyBmYWNlLT50eXBlMS5wcml2YXRlX2RpY3QubGVuSVYsIHNpemUgKTsKICAgICAgICAgRlRfRlJFRSggdGVtcCApOwpAQCAtMTUwNSwxMCArMTU0MSwxMCBAQAogCiAgICAgUFNBdXhfU2VydmljZSAgcHNhdXggICAgICAgID0gKFBTQXV4X1NlcnZpY2UpZmFjZS0+cHNhdXg7CiAKLSAgICBGVF9CeXRlKiAgICAgICBjdXI7CisgICAgRlRfQnl0ZSogICAgICAgY3VyICAgICAgICAgID0gcGFyc2VyLT5yb290LmN1cnNvcjsKICAgICBGVF9CeXRlKiAgICAgICBsaW1pdCAgICAgICAgPSBwYXJzZXItPnJvb3QubGltaXQ7CiAgICAgRlRfSW50ICAgICAgICAgbiwgbnVtX2dseXBoczsKLSAgICBGVF9VSW50ICAgICAgICBub3RkZWZfaW5kZXggPSAwOworICAgIEZUX0ludCAgICAgICAgIG5vdGRlZl9pbmRleCA9IDA7CiAgICAgRlRfQnl0ZSAgICAgICAgbm90ZGVmX2ZvdW5kID0gMDsKIAogCkBAIC0xNTE5LDYgKzE1NTUsMTUgQEAKICAgICAgIGdvdG8gRmFpbDsKICAgICB9CiAKKyAgICAvKiB3ZSBjZXJ0YWlubHkgbmVlZCBtb3JlIHRoYW4gOCBieXRlcyBwZXIgZ2x5cGggKi8KKyAgICBpZiAoIG51bV9nbHlwaHMgPiAoIGxpbWl0IC0gY3VyICkgPj4gMyApCisgICAgeworICAgICAgRlRfVFJBQ0UwKCggInBhcnNlX2NoYXJzdHJpbmdzOiBhZGp1c3RpbmcgbnVtYmVyIG9mIGdseXBocyIKKyAgICAgICAgICAgICAgICAgICIgKGZyb20gJWQgdG8gJWQpXG4iLAorICAgICAgICAgICAgICAgICAgbnVtX2dseXBocywgKCBsaW1pdCAtIGN1ciApID4+IDMgKSk7CisgICAgICBudW1fZ2x5cGhzID0gKCBsaW1pdCAtIGN1ciApID4+IDM7CisgICAgfQorCiAgICAgLyogc29tZSBmb250cyBsaWtlIE9wdGltYS1PYmxpcXVlIG5vdCBvbmx5IGRlZmluZSB0aGUgL0NoYXJTdHJpbmdzICovCiAgICAgLyogYXJyYXkgYnV0IGFjY2VzcyBpdCBhbHNvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgaWYgKCBudW1fZ2x5cGhzID09IDAgfHwgcGFyc2VyLT5yb290LmVycm9yICkKQEAgLTE1NTUsNyArMTYwMCw3IEBACiAKICAgICBmb3IgKDs7KQogICAgIHsKLSAgICAgIEZUX0xvbmcgICBzaXplOworICAgICAgRlRfVUxvbmcgIHNpemU7CiAgICAgICBGVF9CeXRlKiAgYmFzZTsKIAogCkBAIC0xNjA2LDcgKzE2NTEsNyBAQAogCiAgICAgICBpZiAoICpjdXIgPT0gJy8nICkKICAgICAgIHsKLSAgICAgICAgRlRfUHRyRGlzdCAgbGVuOworICAgICAgICBGVF9VSW50ICBsZW47CiAKIAogICAgICAgICBpZiAoIGN1ciArIDIgPj0gbGltaXQgKQpAQCAtMTYxNiw3ICsxNjYxLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGN1cisrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNraXAgYC8nICovCi0gICAgICAgIGxlbiA9IHBhcnNlci0+cm9vdC5jdXJzb3IgLSBjdXI7CisgICAgICAgIGxlbiA9IChGVF9VSW50KSggcGFyc2VyLT5yb290LmN1cnNvciAtIGN1ciApOwogCiAgICAgICAgIGlmICggIXJlYWRfYmluYXJ5X2RhdGEoIHBhcnNlciwgJnNpemUsICZiYXNlLCBJU19JTkNSRU1FTlRBTCApICkKICAgICAgICAgICByZXR1cm47CkBAIC0xNjQ5LDcgKzE2OTQsNyBAQAogICAgICAgICAgIEZUX0J5dGUqICB0ZW1wOwogCiAKLSAgICAgICAgICBpZiAoIHNpemUgPD0gZmFjZS0+dHlwZTEucHJpdmF0ZV9kaWN0LmxlbklWICkKKyAgICAgICAgICBpZiAoIHNpemUgPD0gKEZUX1VMb25nKWZhY2UtPnR5cGUxLnByaXZhdGVfZGljdC5sZW5JViApCiAgICAgICAgICAgewogICAgICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwogICAgICAgICAgICAgZ290byBGYWlsOwpAQCAtMTY2MCw3ICsxNzA1LDcgQEAKICAgICAgICAgICAgIGdvdG8gRmFpbDsKICAgICAgICAgICBGVF9NRU1fQ09QWSggdGVtcCwgYmFzZSwgc2l6ZSApOwogICAgICAgICAgIHBzYXV4LT50MV9kZWNyeXB0KCB0ZW1wLCBzaXplLCA0MzMwICk7Ci0gICAgICAgICAgc2l6ZSAtPSBmYWNlLT50eXBlMS5wcml2YXRlX2RpY3QubGVuSVY7CisgICAgICAgICAgc2l6ZSAtPSAoRlRfVUxvbmcpZmFjZS0+dHlwZTEucHJpdmF0ZV9kaWN0LmxlbklWOwogICAgICAgICAgIGVycm9yID0gVDFfQWRkX1RhYmxlKCBjb2RlX3RhYmxlLCBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wICsgZmFjZS0+dHlwZTEucHJpdmF0ZV9kaWN0LmxlbklWLCBzaXplICk7CiAgICAgICAgICAgRlRfRlJFRSggdGVtcCApOwpAQCAtMTgzOCwxNSArMTg4MywxMSBAQAogICB9OwogCiAKLSNkZWZpbmUgVDFfRklFTERfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggc2l6ZW9mICggdDFfa2V5d29yZHMgKSAvIHNpemVvZiAoIHQxX2tleXdvcmRzWzBdICkgKQotCi0KICAgc3RhdGljIEZUX0Vycm9yCiAgIHBhcnNlX2RpY3QoIFQxX0ZhY2UgICAgZmFjZSwKICAgICAgICAgICAgICAgVDFfTG9hZGVyICBsb2FkZXIsCiAgICAgICAgICAgICAgIEZUX0J5dGUqICAgYmFzZSwKLSAgICAgICAgICAgICAgRlRfTG9uZyAgICBzaXplICkKKyAgICAgICAgICAgICAgRlRfVUxvbmcgICBzaXplICkKICAgewogICAgIFQxX1BhcnNlciAgcGFyc2VyID0gJmxvYWRlci0+cGFyc2VyOwogICAgIEZUX0J5dGUgICAqbGltaXQsICpzdGFydF9iaW5hcnkgPSBOVUxMOwpAQCAtMTkwMiw3ICsxOTQzLDcgQEAKICAgICAgIGVsc2UgaWYgKCAqY3VyID09ICdSJyAmJiBjdXIgKyA2IDwgbGltaXQgJiYgKihjdXIgKyAxKSA9PSAnRCcgJiYKICAgICAgICAgICAgICAgICBoYXZlX2ludGVnZXIgKQogICAgICAgewotICAgICAgICBGVF9Mb25nICAgczsKKyAgICAgICAgRlRfVUxvbmcgIHM7CiAgICAgICAgIEZUX0J5dGUqICBiOwogCiAKQEAgLTE5MTUsNyArMTk1Niw3IEBACiAgICAgICBlbHNlIGlmICggKmN1ciA9PSAnLScgJiYgY3VyICsgNiA8IGxpbWl0ICYmICooY3VyICsgMSkgPT0gJ3wnICYmCiAgICAgICAgICAgICAgICAgaGF2ZV9pbnRlZ2VyICkKICAgICAgIHsKLSAgICAgICAgRlRfTG9uZyAgIHM7CisgICAgICAgIEZUX1VMb25nICBzOwogICAgICAgICBGVF9CeXRlKiAgYjsKIAogCkBAIC0xOTI4LDcgKzE5NjksNyBAQAogICAgICAgLyogbG9vayBmb3IgaW1tZWRpYXRlcyAqLwogICAgICAgZWxzZSBpZiAoICpjdXIgPT0gJy8nICYmIGN1ciArIDIgPCBsaW1pdCApCiAgICAgICB7Ci0gICAgICAgIEZUX1B0ckRpc3QgIGxlbjsKKyAgICAgICAgRlRfVUludCAgbGVuOwogCiAKICAgICAgICAgY3VyKys7CkBAIC0xOTM4LDcgKzE5NzksNyBAQAogICAgICAgICBpZiAoIHBhcnNlci0+cm9vdC5lcnJvciApCiAgICAgICAgICAgZ290byBFeGl0OwogCi0gICAgICAgIGxlbiA9IHBhcnNlci0+cm9vdC5jdXJzb3IgLSBjdXI7CisgICAgICAgIGxlbiA9IChGVF9VSW50KSggcGFyc2VyLT5yb290LmN1cnNvciAtIGN1ciApOwogCiAgICAgICAgIGlmICggbGVuID4gMCAmJiBsZW4gPCAyMiAmJiBwYXJzZXItPnJvb3QuY3Vyc29yIDwgbGltaXQgKQogICAgICAgICB7CkBAIC0xOTU1LDkgKzE5OTYsOSBAQAogICAgICAgICAgICAgaWYgKCAhbmFtZSApCiAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICBpZiAoIGN1clswXSA9PSBuYW1lWzBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgIGxlbiA9PSAoRlRfUHRyRGlzdClmdF9zdHJsZW4oIChjb25zdCBjaGFyICopbmFtZSApICYmCi0gICAgICAgICAgICAgICAgIGZ0X21lbWNtcCggY3VyLCBuYW1lLCBsZW4gKSA9PSAwICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGlmICggY3VyWzBdID09IG5hbWVbMF0gICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgICAgICAgbGVuID09IGZ0X3N0cmxlbiggKGNvbnN0IGNoYXIgKiluYW1lICkgJiYKKyAgICAgICAgICAgICAgICAgZnRfbWVtY21wKCBjdXIsIG5hbWUsIGxlbiApID09IDAgICAgICAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAvKiBXZSBmb3VuZCBpdCAtLSBydW4gdGhlIHBhcnNpbmcgY2FsbGJhY2shICAgICAqLwogICAgICAgICAgICAgICAvKiBXZSByZWNvcmQgZXZlcnkgaW5zdGFuY2Ugb2YgZXZlcnkgZmllbGQgICAgICAqLwpAQCAtMjIxMiw4ICsyMjUzLDggQEAKICAgICAvKiB0aGUgYGxlbmd0aHMnIGZpZWxkIG11c3QgYmUgcmVsZWFzZWQgbGF0ZXIgICAgICAgICAgICAgKi8KICAgICB0eXBlMS0+Z2x5cGhfbmFtZXNfYmxvY2sgICAgPSBsb2FkZXIuZ2x5cGhfbmFtZXMuYmxvY2s7CiAgICAgdHlwZTEtPmdseXBoX25hbWVzICAgICAgICAgID0gKEZUX1N0cmluZyoqKWxvYWRlci5nbHlwaF9uYW1lcy5lbGVtZW50czsKLSAgICBsb2FkZXIuZ2x5cGhfbmFtZXMuYmxvY2sgICAgPSAwOwotICAgIGxvYWRlci5nbHlwaF9uYW1lcy5lbGVtZW50cyA9IDA7CisgICAgbG9hZGVyLmdseXBoX25hbWVzLmJsb2NrICAgID0gTlVMTDsKKyAgICBsb2FkZXIuZ2x5cGhfbmFtZXMuZWxlbWVudHMgPSBOVUxMOwogCiAgICAgLyogd2UgbXVzdCBub3cgYnVpbGQgdHlwZTEuZW5jb2Rpbmcgd2hlbiB3ZSBoYXZlIGEgY3VzdG9tIGFycmF5ICovCiAgICAgaWYgKCB0eXBlMS0+ZW5jb2RpbmdfdHlwZSA9PSBUMV9FTkNPRElOR19UWVBFX0FSUkFZICkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MWxvYWQuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MWxvYWQuaAppbmRleCA1NDZmYzMzLi5kZTQyMmU3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFsb2FkLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3QxbG9hZC5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFR5cGUgMSBmb250IGxvYWRlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDQsIDIwMDYsIDIwMDcgYnkgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFvYmpzLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFvYmpzLmMKaW5kZXggZTExNzcwZi4uZDkyMTA2MyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3Qxb2Jqcy5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MW9ianMuYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBUeXBlIDEgb2JqZWN0cyBtYW5hZ2VyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDA5LCAyMDExLCAyMDEzIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtODYsNyArODYsNyBAQAogICAgICAgaWYgKCBmdW5jcyApCiAgICAgICAgIGZ1bmNzLT5kZXN0cm95KCAoUFNIX0dsb2JhbHMpc2l6ZS0+cm9vdC5pbnRlcm5hbCApOwogCi0gICAgICBzaXplLT5yb290LmludGVybmFsID0gMDsKKyAgICAgIHNpemUtPnJvb3QuaW50ZXJuYWwgPSBOVUxMOwogICAgIH0KICAgfQogCkBAIC0xNDQsNyArMTQ0LDcgQEAKICAgRlRfTE9DQUxfREVGKCB2b2lkICkKICAgVDFfR2x5cGhTbG90X0RvbmUoIEZUX0dseXBoU2xvdCAgc2xvdCApCiAgIHsKLSAgICBzbG90LT5pbnRlcm5hbC0+Z2x5cGhfaGludHMgPSAwOworICAgIHNsb3QtPmludGVybmFsLT5nbHlwaF9oaW50cyA9IE5VTEw7CiAgIH0KIAogCkBAIC0yMjQsNyArMjI0LDcgQEAKICAgICB9CiAKICAgICBUMV9Eb25lX0JsZW5kKCBmYWNlICk7Ci0gICAgZmFjZS0+YmxlbmQgPSAwOworICAgIGZhY2UtPmJsZW5kID0gTlVMTDsKICNlbmRpZgogCiAgICAgLyogcmVsZWFzZSBmb250IGluZm8gc3RyaW5ncyAqLwpAQCAtMzQ1LDcgKzM0NSw3IEBACiAgICAgICBnb3RvIEV4aXQ7CiAKICAgICAvKiBjaGVjayB0aGUgZmFjZSBpbmRleCAqLwotICAgIGlmICggZmFjZV9pbmRleCA+IDAgKQorICAgIGlmICggKCBmYWNlX2luZGV4ICYgMHhGRkZGICkgPiAwICkKICAgICB7CiAgICAgICBGVF9FUlJPUigoICJUMV9GYWNlX0luaXQ6IGludmFsaWQgZmFjZSBpbmRleFxuIiApKTsKICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKQEAgLTM3NSw5ICszNzUsNiBAQAogICAgICAgaWYgKCBmYWNlLT5ibGVuZCApCiAgICAgICAgIHJvb3QtPmZhY2VfZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX01VTFRJUExFX01BU1RFUlM7CiAKLSAgICAgIC8qIFhYWDogVE9ETyAtLSBhZGQga2VybmluZyB3aXRoIC5hZm0gc3VwcG9ydCAqLwotCi0KICAgICAgIC8qIFRoZSBmb2xsb3dpbmcgY29kZSB0byBleHRyYWN0IHRoZSBmYW1pbHkgYW5kIHRoZSBzdHlsZSBpcyB2ZXJ5ICAgKi8KICAgICAgIC8qIHNpbXBsaXN0aWMgYW5kIG1pZ2h0IGdldCBzb21lIHRoaW5ncyB3cm9uZy4gIEZvciBhIGZ1bGwtZmVhdHVyZWQgKi8KICAgICAgIC8qIGFsZ29yaXRobSB5b3UgbWlnaHQgaGF2ZSBhIGxvb2sgYXQgdGhlIHdoaXRlcGFwZXIgZ2l2ZW4gYXQgICAgICAgKi8KQEAgLTQ1Nyw3ICs0NTQsNyBAQAogCiAgICAgICAvKiBubyBlbWJlZGRlZCBiaXRtYXAgc3VwcG9ydCAqLwogICAgICAgcm9vdC0+bnVtX2ZpeGVkX3NpemVzID0gMDsKLSAgICAgIHJvb3QtPmF2YWlsYWJsZV9zaXplcyA9IDA7CisgICAgICByb290LT5hdmFpbGFibGVfc2l6ZXMgPSBOVUxMOwogCiAgICAgICByb290LT5iYm94LnhNaW4gPSAgIHR5cGUxLT5mb250X2Jib3gueE1pbiAgICAgICAgICAgID4+IDE2OwogICAgICAgcm9vdC0+YmJveC55TWluID0gICB0eXBlMS0+Zm9udF9iYm94LnlNaW4gICAgICAgICAgICA+PiAxNjsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MW9ianMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MW9ianMuaAppbmRleCA1NGNjYmI5Li42YjRmM2NiIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFvYmpzLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3Qxb2Jqcy5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFR5cGUgMSBvYmplY3RzIG1hbmFnZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDYsIDIwMTEgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFwYXJzZS5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3QxcGFyc2UuYwppbmRleCBjY2Y5ZjRjLi4wYjY4NTAyIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFwYXJzZS5jCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MXBhcnNlLmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgVHlwZSAxIHBhcnNlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwNSwgMjAwOCwgMjAwOSwgMjAxMi0yMDE0IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KQEAgLTE0MywxMyArMTQzLDEzIEBACiAgICAgRlRfVUxvbmcgICBzaXplOwogCiAKLSAgICBwc2F1eC0+cHNfcGFyc2VyX2Z1bmNzLT5pbml0KCAmcGFyc2VyLT5yb290LCAwLCAwLCBtZW1vcnkgKTsKKyAgICBwc2F1eC0+cHNfcGFyc2VyX2Z1bmNzLT5pbml0KCAmcGFyc2VyLT5yb290LCBOVUxMLCBOVUxMLCBtZW1vcnkgKTsKIAogICAgIHBhcnNlci0+c3RyZWFtICAgICAgID0gc3RyZWFtOwogICAgIHBhcnNlci0+YmFzZV9sZW4gICAgID0gMDsKLSAgICBwYXJzZXItPmJhc2VfZGljdCAgICA9IDA7CisgICAgcGFyc2VyLT5iYXNlX2RpY3QgICAgPSBOVUxMOwogICAgIHBhcnNlci0+cHJpdmF0ZV9sZW4gID0gMDsKLSAgICBwYXJzZXItPnByaXZhdGVfZGljdCA9IDA7CisgICAgcGFyc2VyLT5wcml2YXRlX2RpY3QgPSBOVUxMOwogICAgIHBhcnNlci0+aW5fcGZiICAgICAgID0gMDsKICAgICBwYXJzZXItPmluX21lbW9yeSAgICA9IDA7CiAgICAgcGFyc2VyLT5zaW5nbGVfYmxvY2sgPSAwOwpAQCAtMjczLDcgKzI3Myw3IEBACiAgICAgICAvKiBtYWRlIG9mIHNldmVyYWwgc2VnbWVudHMuICBXZSB0aHVzIGZpcnN0IHJlYWQgdGhlIG51bWJlciBvZiAgICovCiAgICAgICAvKiBzZWdtZW50cyB0byBjb21wdXRlIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBwcml2YXRlIGRpY3Rpb25hcnkgICovCiAgICAgICAvKiB0aGVuIHJlLXJlYWQgdGhlbSBpbnRvIG1lbW9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBGVF9Mb25nICAgIHN0YXJ0X3BvcyA9IEZUX1NUUkVBTV9QT1MoKTsKKyAgICAgIEZUX1VMb25nICAgc3RhcnRfcG9zID0gRlRfU1RSRUFNX1BPUygpOwogICAgICAgRlRfVVNob3J0ICB0YWc7CiAKIApAQCAtMzM0LDcgKzMzNCw2IEBACiAgICAgICAvKiBmaXJzdCBvZiBhbGwsIGxvb2sgYXQgdGhlIGBlZXhlYycga2V5d29yZCAqLwogICAgICAgRlRfQnl0ZSogICAgY3VyICAgPSBwYXJzZXItPmJhc2VfZGljdDsKICAgICAgIEZUX0J5dGUqICAgIGxpbWl0ID0gY3VyICsgcGFyc2VyLT5iYXNlX2xlbjsKLSAgICAgIEZUX0J5dGUgICAgIGM7CiAgICAgICBGVF9Qb2ludGVyICBwb3NfbGY7CiAgICAgICBGVF9Cb29sICAgICB0ZXN0X2NyOwogCkBAIC0zNDIsOSArMzQxLDkgQEAKICAgICBBZ2FpbjoKICAgICAgIGZvciAoOzspCiAgICAgICB7Ci0gICAgICAgIGMgPSBjdXJbMF07Ci0gICAgICAgIGlmICggYyA9PSAnZScgJiYgY3VyICsgOSA8IGxpbWl0ICkgIC8qIDkgPSA1IGxldHRlcnMgZm9yIGBlZXhlYycgKyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aGl0ZXNwYWNlICsgNCBjaGFycyAgICAgICAgKi8KKyAgICAgICAgaWYgKCBjdXJbMF0gPT0gJ2UnICAgJiYKKyAgICAgICAgICAgICBjdXIgKyA5IDwgbGltaXQgKSAgICAgIC8qIDkgPSA1IGxldHRlcnMgZm9yIGBlZXhlYycgKyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2hpdGVzcGFjZSArIDQgY2hhcnMgICAgICAgICovCiAgICAgICAgIHsKICAgICAgICAgICBpZiAoIGN1clsxXSA9PSAnZScgJiYKICAgICAgICAgICAgICAgIGN1clsyXSA9PSAneCcgJiYKQEAgLTM3NCw4ICszNzMsMTUgQEAKIAogICAgICAgd2hpbGUgKCBjdXIgPCBsaW1pdCApCiAgICAgICB7Ci0gICAgICAgIGlmICggKmN1ciA9PSAnZScgJiYgZnRfc3RybmNtcCggKGNoYXIqKWN1ciwgImVleGVjIiwgNSApID09IDAgKQotICAgICAgICAgIGdvdG8gRm91bmQ7CisgICAgICAgIGlmICggY3VyWzBdID09ICdlJyAgICYmCisgICAgICAgICAgICAgY3VyICsgNSA8IGxpbWl0ICkKKyAgICAgICAgeworICAgICAgICAgIGlmICggY3VyWzFdID09ICdlJyAmJgorICAgICAgICAgICAgICAgY3VyWzJdID09ICd4JyAmJgorICAgICAgICAgICAgICAgY3VyWzNdID09ICdlJyAmJgorICAgICAgICAgICAgICAgY3VyWzRdID09ICdjJyApCisgICAgICAgICAgICBnb3RvIEZvdW5kOworICAgICAgICB9CiAKICAgICAgICAgVDFfU2tpcF9QU19Ub2tlbiggcGFyc2VyICk7CiAgICAgICAgIGlmICggcGFyc2VyLT5yb290LmVycm9yICkKQEAgLTM4OSw2ICszOTUsMTUgQEAKIAogICAgICAgY3VyICAgPSBsaW1pdDsKICAgICAgIGxpbWl0ID0gcGFyc2VyLT5iYXNlX2RpY3QgKyBwYXJzZXItPmJhc2VfbGVuOworCisgICAgICBpZiAoIGN1ciA+PSBsaW1pdCApCisgICAgICB7CisgICAgICAgIEZUX0VSUk9SKCggIlQxX0dldF9Qcml2YXRlX0RpY3Q6IgorICAgICAgICAgICAgICAgICAgICIgcHJlbWF0dXJlIGVuZCBpbiBwcml2YXRlIGRpY3Rpb25hcnlcbiIgKSk7CisgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKKyAgICAgICAgZ290byBFeGl0OworICAgICAgfQorCiAgICAgICBnb3RvIEFnYWluOwogCiAgICAgICAvKiBub3cgZGV0ZXJtaW5lIHdoZXJlIHRvIHdyaXRlIHRoZSBfZW5jcnlwdGVkXyBiaW5hcnkgcHJpdmF0ZSAgKi8KQEAgLTQxMSw5ICs0MjYsMTEgQEAKICAgICAgIC8qIGZpbmUgdGhhdCBhcmUgdmlvbGF0aW5nIHRoaXMgbGltaXRhdGlvbiwgc28gd2UgYWRkIGEgaGV1cmlzdGljICAqLwogICAgICAgLyogdGVzdCB0byBzdG9wIGF0IFxyIG9ubHkgaWYgaXQgaXMgbm90IHVzZWQgZm9yIEVPTC4gICAgICAgICAgICAgICovCiAKLSAgICAgIHBvc19sZiAgPSBmdF9tZW1jaHIoIGN1ciwgJ1xuJywgbGltaXQgLSBjdXIgKTsKLSAgICAgIHRlc3RfY3IgPSBGVF9CT09MKCAhcG9zX2xmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIHBvc19sZiA+IGZ0X21lbWNociggY3VyLCAnXHInLCBsaW1pdCAtIGN1ciApICk7CisgICAgICBwb3NfbGYgID0gZnRfbWVtY2hyKCBjdXIsICdcbicsIChzaXplX3QpKCBsaW1pdCAtIGN1ciApICk7CisgICAgICB0ZXN0X2NyID0gRlRfQk9PTCggIXBvc19sZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgcG9zX2xmID4gZnRfbWVtY2hyKCBjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCkoIGxpbWl0IC0gY3VyICkgKSApOwogCiAgICAgICB3aGlsZSAoIGN1ciA8IGxpbWl0ICAgICAgICAgICAgICAgICAgICAmJgogICAgICAgICAgICAgICAoICpjdXIgPT0gJyAnICAgICAgICAgICAgICAgIHx8CkBAIC00MjksNyArNDQ2LDcgQEAKICAgICAgICAgZ290byBFeGl0OwogICAgICAgfQogCi0gICAgICBzaXplID0gKEZUX1VMb25nKSggcGFyc2VyLT5iYXNlX2xlbiAtICggY3VyIC0gcGFyc2VyLT5iYXNlX2RpY3QgKSApOworICAgICAgc2l6ZSA9IHBhcnNlci0+YmFzZV9sZW4gLSAoRlRfVUxvbmcpKCBjdXIgLSBwYXJzZXItPmJhc2VfZGljdCApOwogCiAgICAgICBpZiAoIHBhcnNlci0+aW5fbWVtb3J5ICkKICAgICAgIHsKQEAgLTQ0Myw3ICs0NjAsNyBAQAogICAgICAgICBwYXJzZXItPnNpbmdsZV9ibG9jayA9IDE7CiAgICAgICAgIHBhcnNlci0+cHJpdmF0ZV9kaWN0ID0gcGFyc2VyLT5iYXNlX2RpY3Q7CiAgICAgICAgIHBhcnNlci0+cHJpdmF0ZV9sZW4gID0gc2l6ZTsKLSAgICAgICAgcGFyc2VyLT5iYXNlX2RpY3QgICAgPSAwOworICAgICAgICBwYXJzZXItPmJhc2VfZGljdCAgICA9IE5VTEw7CiAgICAgICAgIHBhcnNlci0+YmFzZV9sZW4gICAgID0gMDsKICAgICAgIH0KIApAQCAtNDU5LDcgKzQ3Niw3IEBACiAgICAgICAgICAgIGZ0X2lzeGRpZ2l0KCBjdXJbMl0gKSAmJiBmdF9pc3hkaWdpdCggY3VyWzNdICkgKQogICAgICAgewogICAgICAgICAvKiBBU0NJSSBoZXhhZGVjaW1hbCBlbmNvZGluZyAqLwotICAgICAgICBGVF9Mb25nICBsZW47CisgICAgICAgIEZUX1VMb25nICBsZW47CiAKIAogICAgICAgICBwYXJzZXItPnJvb3QuY3Vyc29yID0gY3VyOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3QxcGFyc2UuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MXBhcnNlLmgKaW5kZXggZmIxYzhhOC4uOTNiMDJlMyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3QxcGFyc2UuaAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFwYXJzZS5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFR5cGUgMSBwYXJzZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDMsIDIwMDggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC03NywxMiArNzcsNiBAQAogCiAKICNkZWZpbmUgVDFfQWRkX1RhYmxlKCBwLCBpLCBvLCBsICkgIChwKS0+ZnVuY3MuYWRkKCAocCksIGksIG8sIGwgKQotI2RlZmluZSBUMV9Eb25lX1RhYmxlKCBwICkgICAgICAgICAgXAotICAgICAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaWYgKCAocCktPmZ1bmNzLmRvbmUgKSAgXAotICAgICAgICAgICAgICAocCktPmZ1bmNzLmRvbmUoIHAgKTsgXAotICAgICAgICAgIH0gd2hpbGUgKCAwICkKICNkZWZpbmUgVDFfUmVsZWFzZV9UYWJsZSggcCApICAgICAgICAgIFwKICAgICAgICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MXRva2Vucy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3QxdG9rZW5zLmgKaW5kZXggZTM3Mjc2Yi4uMzk5MjY1MiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3QxdG9rZW5zLmgKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3QxdG9rZW5zLmgKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgVHlwZSAxIHRva2VuaXplciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNiwgMjAwOCwgMjAwOSBieSAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90eXBlMS5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3R5cGUxLmMKaW5kZXggY2NjMTJiZS4uNGM3MGVhNyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3R5cGUxLmMKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3R5cGUxLmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgRnJlZVR5cGUgVHlwZSAxIGRyaXZlciBjb21wb25lbnQgKGJvZHkgb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAwMSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvbGNtczItMi42L2luY2x1ZGUvbGNtczIuaCBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9pbmNsdWRlL2xjbXMyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvbGNtczIvbGNtczItMi42L2luY2x1ZGUvbGNtczIuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGNtczItMi42L2luY2x1ZGUvbGNtczIuaApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9sY21zMi0yLjYvaW5jbHVkZS9sY21zMl9wbHVnaW4uaCBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9pbmNsdWRlL2xjbXMyX3BsdWdpbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2xjbXMyL2xjbXMyLTIuNi9pbmNsdWRlL2xjbXMyX3BsdWdpbi5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9sY21zMi0yLjYvaW5jbHVkZS9sY21zMl9wbHVnaW4uaApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9sY21zMi0yLjYvc3JjL2Ntc2NhbTAyLmMgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2NhbTAyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvbGNtczIvbGNtczItMi42L3NyYy9jbXNjYW0wMi5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2NhbTAyLmMKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvbGNtczItMi42L3NyYy9jbXNjZ2F0cy5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNjZ2F0cy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2xjbXMyL2xjbXMyLTIuNi9zcmMvY21zY2dhdHMuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNjZ2F0cy5jCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL2xjbXMyLTIuNi9zcmMvY21zY252cnQuYyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zY252cnQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9sY21zMi9sY21zMi0yLjYvc3JjL2Ntc2NudnJ0LmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zY252cnQuYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNlcnIuYyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zZXJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZhZDRjOQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zZXJyLmMKQEAgLTAsMCArMSw3MDcgQEAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQorLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDEyIE1hcnRpIE1hcmlhIFNhZ3VlcgorLy8KKy8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorLy8gdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorLy8gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisvLyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUKKy8vIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisvLworLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKy8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorLy8KKy8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPCisvLyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQorLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisvLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaW5jbHVkZSAibGNtczJfaW50ZXJuYWwuaCIKKworLy8gSSBhbSBzbyB0aXJlZCBhYm91dCBpbmNvbXBhdGliaWxpdGllcyBvbiB0aG9zZSBmdW5jdGlvbnMgdGhhdCBoZXJlIGFyZSBzb21lIHJlcGxhY2VtZW50cworLy8gdGhhdCBob3BlZnVsbHkgd291bGQgYmUgZnVsbHkgcG9ydGFibGUuCisKKy8vIGNvbXBhcmUgdHdvIHN0cmluZ3MgaWdub3JpbmcgY2FzZQoraW50IENNU0VYUE9SVCBjbXNzdHJjYXNlY21wKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikKK3sKKyAgICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICp1czEgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnVzMiA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopczI7CisKKyAgICB3aGlsZSAodG91cHBlcigqdXMxKSA9PSB0b3VwcGVyKCp1czIrKykpCisgICAgICAgIGlmICgqdXMxKysgPT0gJ1wwJykKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuICh0b3VwcGVyKCp1czEpIC0gdG91cHBlcigqLS11czIpKTsKK30KKworLy8gbG9uZyBpbnQgYmVjYXVzZSBDOTkgc3BlY2lmaWVzIGZ0ZWxsIGluIHN1Y2ggd2F5ICg3LjE5LjkuMikKK2xvbmcgaW50IENNU0VYUE9SVCBjbXNmaWxlbGVuZ3RoKEZJTEUqIGYpCit7CisgICAgbG9uZyBpbnQgcCAsIG47CisKKyAgICBwID0gZnRlbGwoZik7IC8vIHJlZ2lzdGVyIGN1cnJlbnQgZmlsZSBwb3NpdGlvbgorCisgICAgaWYgKGZzZWVrKGYsIDAsIFNFRUtfRU5EKSAhPSAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBuID0gZnRlbGwoZik7CisgICAgZnNlZWsoZiwgcCwgU0VFS19TRVQpOyAvLyBmaWxlIHBvc2l0aW9uIHJlc3RvcmVkCisKKyAgICByZXR1cm4gbjsKK30KKworI2lmIDAKKy8vIE1lbW9yeSBoYW5kbGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgdG8gbG93LWxldmVsIG1lbW9yeSBtYW5hZ2VtZW50IHJvdXRpbmVzLiBCeSBkZWZhdWx0IGEgc2ltcGxlCisvLyB3cmFwcGluZyB0byBtYWxsb2MvZnJlZS9yZWFsbG9jIGlzIHByb3ZpZGVkLCBhbHRob3VnaCB0aGVyZSBpcyBhIGxpbWl0IG9uIHRoZSBtYXgKKy8vIGFtb3VudCBvZiBtZW1veSB0aGF0IGNhbiBiZSByZWNsYWltZWQuIFRoaXMgaXMgbW9zdGx5IGFzIGEgc2FmZXR5IGZlYXR1cmUgdG8gcHJldmVudCAKKy8vIGJvZ3VzIG9yIGV2aWwgY29kZSB0byBhbGxvY2F0ZSBodWdlIGJsb2NrcyB0aGF0IG90aGVyd2lzZSBsY21zIHdvdWxkIG5ldmVyIG5lZWQuCisKKyNkZWZpbmUgTUFYX01FTU9SWV9GT1JfQUxMT0MgICgoY21zVUludDMyTnVtYmVyKSgxMDI0VSoxMDI0VSo1MTJVKSkKKworLy8gVXNlciBtYXkgb3ZlcnJpZGUgdGhpcyBiZWhhdmlvdXIgYnkgdXNpbmcgYSBtZW1vcnkgcGx1Zy1pbiwgd2hpY2ggYmFzaWNhbGx5IHJlcGxhY2VzCisvLyB0aGUgZGVmYXVsdCBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMuIEluIHRoaXMgY2FzZSwgbm8gY2hlY2sgaXMgcGVyZm9ybWVkIGFuZCBpdAorLy8gaXMgdXAgdG8gdGhlIHBsdWctaW4gd3JpdHRlciB0byBrZWVwIGluIHRoZSBzYWZlIHNpZGUuIFRoZXJlIGFyZSBvbmx5IHRocmVlIGZ1bmN0aW9ucworLy8gcmVxdWlyZWQgdG8gYmUgaW1wbGVtZW50ZWQ6IG1hbGxvYywgcmVhbGxvYyBhbmQgZnJlZSwgYWx0aG91Z2ggdGhlIHVzZXIgbWF5IHdhbnQgdG8KKy8vIHJlcGxhY2UgdGhlIG9wdGlvbmFsIG1hbGxvY1plcm8sIGNhbGxvYyBhbmQgZHVwIGFzIHdlbGwuCisKK2Ntc0Jvb2wgICBfY21zUmVnaXN0ZXJNZW1IYW5kbGVyUGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOworCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbi4gSXQgZG9lcyBhIHZlcnkgY29hcnNlCisvLyBjaGVjayBvZiBhbW91dCBvZiBtZW1vcnksIGp1c3QgdG8gcHJldmVudCBleHBsb2l0cworc3RhdGljCit2b2lkKiBfY21zTWFsbG9jRGVmYXVsdEZuKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgc2l6ZSkKK3sKKyAgICBpZiAoc2l6ZSA+IE1BWF9NRU1PUllfRk9SX0FMTE9DKSByZXR1cm4gTlVMTDsgIC8vIE5ldmVyIGFsbG93IG92ZXIgbWF4aW11bQorCisgICAgcmV0dXJuICh2b2lkKikgbWFsbG9jKHNpemUpOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihDb250ZXh0SUQpOworfQorCisvLyBHZW5lcmljIGFsbG9jYXRlICYgemVybworc3RhdGljCit2b2lkKiBfY21zTWFsbG9jWmVyb0RlZmF1bHRGbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIHNpemUpCit7CisgICAgdm9pZCAqcHQgPSBfY21zTWFsbG9jKENvbnRleHRJRCwgc2l6ZSk7CisgICAgaWYgKHB0ID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgbWVtc2V0KHB0LCAwLCBzaXplKTsKKyAgICByZXR1cm4gcHQ7Cit9CisKKworLy8gVGhlIGRlZmF1bHQgZnJlZSBmdW5jdGlvbi4gVGhlIG9ubHkgY2hlY2sgcHJvZm9ybWVkIGlzIGFnYWluc3QgTlVMTCBwb2ludGVycworc3RhdGljCit2b2lkIF9jbXNGcmVlRGVmYXVsdEZuKGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkICpQdHIpCit7CisgICAgLy8gZnJlZShOVUxMKSBpcyBkZWZpbmVkIGEgbm8tb3AgYnkgQzk5LCB0aGVyZWZvcmUgaXQgaXMgc2FmZSB0bworICAgIC8vIGF2b2lkIHRoZSBjaGVjaywgYnV0IGl0IGlzIGhlcmUganVzdCBpbiBjYXNlLi4uCisKKyAgICBpZiAoUHRyKSBmcmVlKFB0cik7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKENvbnRleHRJRCk7Cit9CisKKy8vIFRoZSBkZWZhdWx0IHJlYWxsb2MgZnVuY3Rpb24uIEFnYWluIGl0IGNoZWNrcyBmb3IgZXhwbG9pdHMuIElmIFB0ciBpcyBOVUxMLAorLy8gcmVhbGxvYyBiZWhhdmVzIHRoZSBzYW1lIHdheSBhcyBtYWxsb2MgYW5kIGFsbG9jYXRlcyBhIG5ldyBibG9jayBvZiBzaXplIGJ5dGVzLgorc3RhdGljCit2b2lkKiBfY21zUmVhbGxvY0RlZmF1bHRGbihjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgc2l6ZSkKK3sKKworICAgIGlmIChzaXplID4gTUFYX01FTU9SWV9GT1JfQUxMT0MpIHJldHVybiBOVUxMOyAgLy8gTmV2ZXIgcmVhbGxvYyBvdmVyIDUxMk1iCisKKyAgICByZXR1cm4gcmVhbGxvYyhQdHIsIHNpemUpOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihDb250ZXh0SUQpOworfQorCisKKy8vIFRoZSBkZWZhdWx0IGNhbGxvYyBmdW5jdGlvbi4gQWxsb2NhdGVzIGFuIGFycmF5IG9mIG51bSBlbGVtZW50cywgZWFjaCBvbmUgb2Ygc2l6ZSBieXRlcworLy8gYWxsIG1lbW9yeSBpcyBpbml0aWFsaXplZCB0byB6ZXJvLgorc3RhdGljCit2b2lkKiBfY21zQ2FsbG9jRGVmYXVsdEZuKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgbnVtLCBjbXNVSW50MzJOdW1iZXIgc2l6ZSkKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgVG90YWwgPSBudW0gKiBzaXplOworCisgICAgLy8gUHJlc2VydmUgY2FsbG9jIGJlaGF2aW91cgorICAgIGlmIChUb3RhbCA9PSAwKSByZXR1cm4gTlVMTDsKKworICAgIC8vIFNhZmUgY2hlY2sgZm9yIG92ZXJmbG93LgorICAgIGlmIChudW0gPj0gVUlOVF9NQVggLyBzaXplKSByZXR1cm4gTlVMTDsKKworICAgIC8vIENoZWNrIGZvciBvdmVyZmxvdworICAgIGlmIChUb3RhbCA8IG51bSB8fCBUb3RhbCA8IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKFRvdGFsID4gTUFYX01FTU9SWV9GT1JfQUxMT0MpIHJldHVybiBOVUxMOyAgLy8gTmV2ZXIgYWxsb2Mgb3ZlciA1MTJNYgorCisgICAgcmV0dXJuIF9jbXNNYWxsb2NaZXJvKENvbnRleHRJRCwgVG90YWwpOworfQorCisvLyBHZW5lcmljIGJsb2NrIGR1cGxpY2F0aW9uCitzdGF0aWMKK3ZvaWQqIF9jbXNEdXBEZWZhdWx0Rm4oY21zQ29udGV4dCBDb250ZXh0SUQsIGNvbnN0IHZvaWQqIE9yZywgY21zVUludDMyTnVtYmVyIHNpemUpCit7CisgICAgdm9pZCogbWVtOworCisgICAgaWYgKHNpemUgPiBNQVhfTUVNT1JZX0ZPUl9BTExPQykgcmV0dXJuIE5VTEw7ICAvLyBOZXZlciBkdXAgb3ZlciA1MTJNYgorCisgICAgbWVtID0gX2Ntc01hbGxvYyhDb250ZXh0SUQsIHNpemUpOworCisgICAgaWYgKG1lbSAhPSBOVUxMICYmIE9yZyAhPSBOVUxMKQorICAgICAgICBtZW1tb3ZlKG1lbSwgT3JnLCBzaXplKTsKKworICAgIHJldHVybiBtZW07Cit9CisKKworLy8gUG9pbnRlcnMgdG8gbWVtb3J5IG1hbmFnZXIgZnVuY3Rpb25zIGluIENvbnRleHQwCitfY21zTWVtUGx1Z2luQ2h1bmtUeXBlIF9jbXNNZW1QbHVnaW5DaHVuayA9IHsgX2Ntc01hbGxvY0RlZmF1bHRGbiwgX2Ntc01hbGxvY1plcm9EZWZhdWx0Rm4sIF9jbXNGcmVlRGVmYXVsdEZuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY21zUmVhbGxvY0RlZmF1bHRGbiwgX2Ntc0NhbGxvY0RlZmF1bHRGbiwgICAgX2Ntc0R1cERlZmF1bHRGbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisKKy8vIFJlc2V0IGFuZCBkdXBsaWNhdGUgbWVtb3J5IG1hbmFnZXIKK3ZvaWQgX2Ntc0FsbG9jTWVtUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpCit7CisgICAgX2Ntc0Fzc2VydChjdHggIT0gTlVMTCk7CisKKyAgICBpZiAoc3JjICE9IE5VTEwpIHsgICAgCisKKyAgICAgICAgLy8gRHVwbGljYXRlCisgICAgICAgIGN0eCAtPmNodW5rc1tNZW1QbHVnaW5dID0gX2Ntc1N1YkFsbG9jRHVwKGN0eCAtPk1lbVBvb2wsIHNyYyAtPmNodW5rc1tNZW1QbHVnaW5dLCBzaXplb2YoX2Ntc01lbVBsdWdpbkNodW5rVHlwZSkpOyAgCisgICAgfQorICAgIGVsc2UgeworCisgICAgICAgIC8vIFRvIHJlc2V0IGl0LCB3ZSB1c2UgdGhlIGRlZmF1bHQgYWxsb2NhdG9ycywgd2hpY2ggY2Fubm90IGJlIG92ZXJyaWRlbgorICAgICAgICBjdHggLT5jaHVua3NbTWVtUGx1Z2luXSA9ICZjdHggLT5EZWZhdWx0TWVtb3J5TWFuYWdlcjsKKyAgICB9IAorfQorCisvLyBBdXhpbGlhciB0byBmaWxsIG1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9ucyBmcm9tIHBsdWdpbiAob3IgY29udGV4dCAwIGRlZmF1bHRzKQordm9pZCBfY21zSW5zdGFsbEFsbG9jRnVuY3Rpb25zKGNtc1BsdWdpbk1lbUhhbmRsZXIqIFBsdWdpbiwgX2Ntc01lbVBsdWdpbkNodW5rVHlwZSogcHRyKQoreworICAgIGlmIChQbHVnaW4gPT0gTlVMTCkgeworCisgICAgICAgIG1lbWNweShwdHIsICZfY21zTWVtUGx1Z2luQ2h1bmssIHNpemVvZihfY21zTWVtUGx1Z2luQ2h1bmspKTsKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgcHRyIC0+TWFsbG9jUHRyICA9IFBsdWdpbiAtPiBNYWxsb2NQdHI7CisgICAgICAgIHB0ciAtPkZyZWVQdHIgICAgPSBQbHVnaW4gLT4gRnJlZVB0cjsKKyAgICAgICAgcHRyIC0+UmVhbGxvY1B0ciA9IFBsdWdpbiAtPiBSZWFsbG9jUHRyOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSByZXZlcnQgdG8gZGVmYXVsdHMKKyAgICAgICAgcHRyIC0+TWFsbG9jWmVyb1B0cj0gX2Ntc01hbGxvY1plcm9EZWZhdWx0Rm47CisgICAgICAgIHB0ciAtPkNhbGxvY1B0ciAgICA9IF9jbXNDYWxsb2NEZWZhdWx0Rm47CisgICAgICAgIHB0ciAtPkR1cFB0ciAgICAgICA9IF9jbXNEdXBEZWZhdWx0Rm47CisgICAgICAKKyAgICAgICAgaWYgKFBsdWdpbiAtPk1hbGxvY1plcm9QdHIgIT0gTlVMTCkgcHRyIC0+TWFsbG9jWmVyb1B0ciA9IFBsdWdpbiAtPiBNYWxsb2NaZXJvUHRyOworICAgICAgICBpZiAoUGx1Z2luIC0+Q2FsbG9jUHRyICE9IE5VTEwpICAgICBwdHIgLT5DYWxsb2NQdHIgICAgID0gUGx1Z2luIC0+IENhbGxvY1B0cjsKKyAgICAgICAgaWYgKFBsdWdpbiAtPkR1cFB0ciAhPSBOVUxMKSAgICAgICAgcHRyIC0+RHVwUHRyICAgICAgICA9IFBsdWdpbiAtPiBEdXBQdHI7CisgICAgICAgIAorICAgIH0KK30KKworCisvLyBQbHVnLWluIHJlcGxhY2VtZW50IGVudHJ5CitjbXNCb29sICBfY21zUmVnaXN0ZXJNZW1IYW5kbGVyUGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlICpEYXRhKQoreworICAgIGNtc1BsdWdpbk1lbUhhbmRsZXIqIFBsdWdpbiA9IChjbXNQbHVnaW5NZW1IYW5kbGVyKikgRGF0YTsgICAgIAorICAgIF9jbXNNZW1QbHVnaW5DaHVua1R5cGUqIHB0cjsKKworICAgIC8vIE5VTEwgZm9yY2VzIHRvIHJlc2V0IHRvIGRlZmF1bHRzLiBJbiB0aGlzIHNwZWNpYWwgY2FzZSwgdGhlIGRlZmF1bHRzIGFyZSBzdG9yZWQgaW4gdGhlIGNvbnRleHQgc3RydWN0dXJlLiAKKyAgICAvLyBSZW1haW5pbmcgcGx1Zy1pbnMgZG9lcyBOT1QgaGF2ZSBhbnkgY29weSBpbiB0aGUgY29udGV4dCBzdHJ1Y3R1cmUsIGJ1dCB0aGlzIGlzIHNvbWVob3cgc3BlY2lhbCBhcyB0aGUKKyAgICAvLyBjb250ZXh0IGludGVybmFsIGRhdGEgc2hvdWxkIGJlIG1hbGxvY2UnZCBieSB1c2luZyB0aG9zZSBmdW5jdGlvbnMuIAorICAgIGlmIChEYXRhID09IE5VTEwpIHsKKworICAgICAgIHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCA9ICggc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCopIENvbnRleHRJRDsKKworICAgICAgIC8vIFJldHVybiB0byB0aGUgZGVmYXVsdCBhbGxvY2F0b3JzCisgICAgICAgIGlmIChDb250ZXh0SUQgIT0gTlVMTCkgeworICAgICAgICAgICAgY3R4LT5jaHVua3NbTWVtUGx1Z2luXSA9ICh2b2lkKikgJmN0eC0+RGVmYXVsdE1lbW9yeU1hbmFnZXI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIGNhbGxiYWNrcworICAgIGlmIChQbHVnaW4gLT4gTWFsbG9jUHRyID09IE5VTEwgfHwKKyAgICAgICAgUGx1Z2luIC0+IEZyZWVQdHIgPT0gTlVMTCB8fAorICAgICAgICBQbHVnaW4gLT4gUmVhbGxvY1B0ciA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKyAgICAvLyBTZXQgcmVwbGFjZW1lbnQgZnVuY3Rpb25zCisgICAgcHRyID0gKF9jbXNNZW1QbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgTWVtUGx1Z2luKTsKKyAgICBpZiAocHRyID09IE5VTEwpIAorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBfY21zSW5zdGFsbEFsbG9jRnVuY3Rpb25zKFBsdWdpbiwgcHRyKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKyNlbHNlCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X21lbW9yeS5oIgorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaCIKKworY21zQm9vbCAgX2Ntc1JlZ2lzdGVyTWVtSGFuZGxlclBsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogUGx1Z2luKQoreworCXJldHVybiBUUlVFOworfQorCisvLyBHZW5lcmljIGFsbG9jYXRlCit2b2lkKiBDTVNFWFBPUlQgX2Ntc01hbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIHNpemUpCit7CisgICAgcmV0dXJuIEZYTUVNX0RlZmF1bHRBbGxvYyhzaXplLCAxKTsKK30KKworLy8gR2VuZXJpYyBhbGxvY2F0ZSAmIHplcm8KK3ZvaWQqIENNU0VYUE9SVCBfY21zTWFsbG9jWmVybyhjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIHNpemUpCit7CisJdm9pZCogcCA9IEZYTUVNX0RlZmF1bHRBbGxvYyhzaXplLCAxKTsKKwlpZiAocCkgRlhTWVNfbWVtc2V0KHAsIDAsIHNpemUpOworCXJldHVybiBwOworfQorCisvLyBHZW5lcmljIGNhbGxvYwordm9pZCogQ01TRVhQT1JUIF9jbXNDYWxsb2MoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBudW0sIGNtc1VJbnQzMk51bWJlciBzaXplKQoreworCWNtc1VJbnQzMk51bWJlciB0b3RhbCA9IG51bSAqIHNpemU7CisJaWYgKHRvdGFsID09IDAgfHwgdG90YWwgLyBzaXplICE9IG51bSB8fCB0b3RhbCA+PSA1MTIgKiAxMDI0ICogMTAyNCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gX2Ntc01hbGxvY1plcm8oQ29udGV4dElELCBudW0gKiBzaXplKTsKK30KKworLy8gR2VuZXJpYyByZWFsbG9jYXRlCit2b2lkKiBDTVNFWFBPUlQgX2Ntc1JlYWxsb2MoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIHNpemUpCit7CisJcmV0dXJuIEZYTUVNX0RlZmF1bHRSZWFsbG9jKFB0ciwgc2l6ZSwgMSk7Cit9CisKKy8vIEdlbmVyaWMgZnJlZSBtZW1vcnkKK3ZvaWQgQ01TRVhQT1JUIF9jbXNGcmVlKGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkKiBQdHIpCit7CisJaWYgKFB0ciAhPSBOVUxMKSBGWE1FTV9EZWZhdWx0RnJlZShQdHIsIDApOworfQorCisvLyBHZW5lcmljIGJsb2NrIGR1cGxpY2F0aW9uCit2b2lkKiBDTVNFWFBPUlQgX2Ntc0R1cE1lbShjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3Qgdm9pZCogT3JnLCBjbXNVSW50MzJOdW1iZXIgc2l6ZSkKK3sKKwl2b2lkKiBwID0gRlhNRU1fRGVmYXVsdEFsbG9jKHNpemUsIDEpOworCUZYU1lTX21lbW1vdmUocCwgT3JnLCBzaXplKTsKKwlyZXR1cm4gcDsKK30KKworX2Ntc01lbVBsdWdpbkNodW5rVHlwZSBfY21zTWVtUGx1Z2luQ2h1bmsgPSB7X2Ntc01hbGxvYywgX2Ntc01hbGxvY1plcm8sIF9jbXNGcmVlLCAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jbXNSZWFsbG9jLCBfY21zQ2FsbG9jLCAgICBfY21zRHVwTWVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKK3ZvaWQgX2Ntc0FsbG9jTWVtUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpCit7CisJX2Ntc0Fzc2VydChjdHggIT0gTlVMTCk7CisKKwlpZiAoc3JjICE9IE5VTEwpIHsgICAgCisKKwkJLy8gRHVwbGljYXRlCisJCWN0eCAtPmNodW5rc1tNZW1QbHVnaW5dID0gX2Ntc1N1YkFsbG9jRHVwKGN0eCAtPk1lbVBvb2wsIHNyYyAtPmNodW5rc1tNZW1QbHVnaW5dLCBzaXplb2YoX2Ntc01lbVBsdWdpbkNodW5rVHlwZSkpOyAgCisJfQorCWVsc2UgeworCisJCS8vIFRvIHJlc2V0IGl0LCB3ZSB1c2UgdGhlIGRlZmF1bHQgYWxsb2NhdG9ycywgd2hpY2ggY2Fubm90IGJlIG92ZXJyaWRlbgorCQljdHggLT5jaHVua3NbTWVtUGx1Z2luXSA9ICZjdHggLT5EZWZhdWx0TWVtb3J5TWFuYWdlcjsKKwl9IAorfQorCit2b2lkIF9jbXNJbnN0YWxsQWxsb2NGdW5jdGlvbnMoY21zUGx1Z2luTWVtSGFuZGxlciogUGx1Z2luLCBfY21zTWVtUGx1Z2luQ2h1bmtUeXBlKiBwdHIpCit7CisJaWYgKFBsdWdpbiA9PSBOVUxMKSB7CisKKwkJbWVtY3B5KHB0ciwgJl9jbXNNZW1QbHVnaW5DaHVuaywgc2l6ZW9mKF9jbXNNZW1QbHVnaW5DaHVuaykpOworCX0KKwllbHNlIHsKKworCQlwdHIgLT5NYWxsb2NQdHIgID0gUGx1Z2luIC0+IE1hbGxvY1B0cjsKKwkJcHRyIC0+RnJlZVB0ciAgICA9IFBsdWdpbiAtPiBGcmVlUHRyOworCQlwdHIgLT5SZWFsbG9jUHRyID0gUGx1Z2luIC0+IFJlYWxsb2NQdHI7CisKKwkJLy8gTWFrZSBzdXJlIHdlIHJldmVydCB0byBkZWZhdWx0cworCQlwdHIgLT5NYWxsb2NaZXJvUHRyPSBfY21zTWFsbG9jWmVybzsKKwkJcHRyIC0+Q2FsbG9jUHRyICAgID0gX2Ntc0NhbGxvYzsKKwkJcHRyIC0+RHVwUHRyICAgICAgID0gX2Ntc0R1cE1lbTsKKworCQlpZiAoUGx1Z2luIC0+TWFsbG9jWmVyb1B0ciAhPSBOVUxMKSBwdHIgLT5NYWxsb2NaZXJvUHRyID0gUGx1Z2luIC0+IE1hbGxvY1plcm9QdHI7CisJCWlmIChQbHVnaW4gLT5DYWxsb2NQdHIgIT0gTlVMTCkgICAgIHB0ciAtPkNhbGxvY1B0ciAgICAgPSBQbHVnaW4gLT4gQ2FsbG9jUHRyOworCQlpZiAoUGx1Z2luIC0+RHVwUHRyICE9IE5VTEwpICAgICAgICBwdHIgLT5EdXBQdHIgICAgICAgID0gUGx1Z2luIC0+IER1cFB0cjsKKworCX0KK30KKyNlbmRpZgorCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisvLyBTdWIgYWxsb2NhdGlvbiB0YWtlcyBjYXJlIG9mIG1hbnkgcG9pbnRlcnMgb2Ygc21hbGwgc2l6ZS4gVGhlIG1lbW9yeSBhbGxvY2F0ZWQgaW4KKy8vIHRoaXMgd2F5IGhhdmUgYmUgZnJlZWQgYXQgb25jZS4gTmV4dCBmdW5jdGlvbiBhbGxvY2F0ZXMgYSBzaW5nbGUgY2h1bmsgZm9yIGxpbmtlZCBsaXN0CisvLyBJIHByZWZlciB0aGlzIG1ldGhvZCBvdmVyIHJlYWxsb2MgZHVlIHRvIHRoZSBiaWcgaW5wYWN0IG9uIHhwdXQgcmVhbGxvYyBtYXkgaGF2ZSBpZgorLy8gbWVtb3J5IGlzIGJlaW5nIHN3YXBwZWQgdG8gZGlzay4gVGhpcyBhcHByb2FjaCBpcyBzYWZlciAoYWx0aG91Z2ggdGhhdCBtYXkgbm90IGJlIHRydWUgb24gYWxsIHBsYXRmb3JtcykKK3N0YXRpYworX2Ntc1N1YkFsbG9jYXRvcl9jaHVuayogX2Ntc0NyZWF0ZVN1YkFsbG9jQ2h1bmsoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBJbml0aWFsKQoreworICAgIF9jbXNTdWJBbGxvY2F0b3JfY2h1bmsqIGNodW5rOworCisgICAgLy8gMjBLIGJ5IGRlZmF1bHQKKyAgICBpZiAoSW5pdGlhbCA9PSAwKQorICAgICAgICBJbml0aWFsID0gMjAqMTAyNDsKKworICAgIC8vIENyZWF0ZSB0aGUgY29udGFpbmVyCisgICAgY2h1bmsgPSAoX2Ntc1N1YkFsbG9jYXRvcl9jaHVuayopIF9jbXNNYWxsb2NaZXJvKENvbnRleHRJRCwgc2l6ZW9mKF9jbXNTdWJBbGxvY2F0b3JfY2h1bmspKTsKKyAgICBpZiAoY2h1bmsgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICAvLyBJbml0aWFsaXplIHZhbHVlcworICAgIGNodW5rIC0+QmxvY2sgICAgID0gKGNtc1VJbnQ4TnVtYmVyKikgX2Ntc01hbGxvYyhDb250ZXh0SUQsIEluaXRpYWwpOworICAgIGlmIChjaHVuayAtPkJsb2NrID09IE5VTEwpIHsKKworICAgICAgICAvLyBTb21ldGhpbmcgd2VudCB3cm9uZworICAgICAgICBfY21zRnJlZShDb250ZXh0SUQsIGNodW5rKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY2h1bmsgLT5CbG9ja1NpemUgPSBJbml0aWFsOworICAgIGNodW5rIC0+VXNlZCAgICAgID0gMDsKKyAgICBjaHVuayAtPm5leHQgICAgICA9IE5VTEw7CisKKyAgICByZXR1cm4gY2h1bms7Cit9CisKKy8vIFRoZSBzdWJhbGxvY2F0ZWQgaXMgbm90aGluZyBidXQgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBsaXN0LiBXZSBhbHNvIGtlZXAKKy8vIHRoZSB0aHJlYWQgSUQgaW4gdGhpcyBzdHJ1Y3R1cmUuCitfY21zU3ViQWxsb2NhdG9yKiBfY21zQ3JlYXRlU3ViQWxsb2MoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBJbml0aWFsKQoreworICAgIF9jbXNTdWJBbGxvY2F0b3IqIHN1YjsKKworICAgIC8vIENyZWF0ZSB0aGUgY29udGFpbmVyCisgICAgc3ViID0gKF9jbXNTdWJBbGxvY2F0b3IqKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihfY21zU3ViQWxsb2NhdG9yKSk7CisgICAgaWYgKHN1YiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIHN1YiAtPkNvbnRleHRJRCA9IENvbnRleHRJRDsKKworICAgIHN1YiAtPmggPSBfY21zQ3JlYXRlU3ViQWxsb2NDaHVuayhDb250ZXh0SUQsIEluaXRpYWwpOworICAgIGlmIChzdWIgLT5oID09IE5VTEwpIHsKKyAgICAgICAgX2Ntc0ZyZWUoQ29udGV4dElELCBzdWIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gc3ViOworfQorCisKKy8vIEdldCByaWQgb2Ygd2hvbGUgbGlua2VkIGxpc3QKK3ZvaWQgX2Ntc1N1YkFsbG9jRGVzdHJveShfY21zU3ViQWxsb2NhdG9yKiBzdWIpCit7CisgICAgX2Ntc1N1YkFsbG9jYXRvcl9jaHVuayAqY2h1bmssICpuOworCisgICAgZm9yIChjaHVuayA9IHN1YiAtPmg7IGNodW5rICE9IE5VTEw7IGNodW5rID0gbikgeworCisgICAgICAgIG4gPSBjaHVuay0+bmV4dDsKKyAgICAgICAgaWYgKGNodW5rLT5CbG9jayAhPSBOVUxMKSBfY21zRnJlZShzdWIgLT5Db250ZXh0SUQsIGNodW5rLT5CbG9jayk7CisgICAgICAgIF9jbXNGcmVlKHN1YiAtPkNvbnRleHRJRCwgY2h1bmspOworICAgIH0KKworICAgIC8vIEZyZWUgdGhlIGhlYWRlcgorICAgIF9jbXNGcmVlKHN1YiAtPkNvbnRleHRJRCwgc3ViKTsKK30KKworCisvLyBHZXQgYSBwb2ludGVyIHRvIHNtYWxsIG1lbW9yeSBibG9jay4KK3ZvaWQqICBfY21zU3ViQWxsb2MoX2Ntc1N1YkFsbG9jYXRvciogc3ViLCBjbXNVSW50MzJOdW1iZXIgc2l6ZSkKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgRnJlZSA9IHN1YiAtPiBoIC0+QmxvY2tTaXplIC0gc3ViIC0+IGggLT4gVXNlZDsKKyAgICBjbXNVSW50OE51bWJlciogcHRyOworCisgICAgc2l6ZSA9IF9jbXNBTElHTk1FTShzaXplKTsKKworICAgIC8vIENoZWNrIGZvciBtZW1vcnkuIElmIHRoZXJlIGlzIG5vIHJvb20sIGFsbG9jYXRlIGEgbmV3IGNodW5rIG9mIGRvdWJsZSBtZW1vcnkgc2l6ZS4KKyAgICBpZiAoc2l6ZSA+IEZyZWUpIHsKKworICAgICAgICBfY21zU3ViQWxsb2NhdG9yX2NodW5rKiBjaHVuazsKKyAgICAgICAgY21zVUludDMyTnVtYmVyIG5ld1NpemU7CisKKyAgICAgICAgbmV3U2l6ZSA9IHN1YiAtPiBoIC0+QmxvY2tTaXplICogMjsKKyAgICAgICAgaWYgKG5ld1NpemUgPCBzaXplKSBuZXdTaXplID0gc2l6ZTsKKworICAgICAgICBjaHVuayA9IF9jbXNDcmVhdGVTdWJBbGxvY0NodW5rKHN1YiAtPiBDb250ZXh0SUQsIG5ld1NpemUpOworICAgICAgICBpZiAoY2h1bmsgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgLy8gTGluayBsaXN0CisgICAgICAgIGNodW5rIC0+bmV4dCA9IHN1YiAtPmg7CisgICAgICAgIHN1YiAtPmggICAgPSBjaHVuazsKKworICAgIH0KKworICAgIHB0ciA9ICBzdWIgLT4gaCAtPkJsb2NrICsgc3ViIC0+IGggLT5Vc2VkOworICAgIHN1YiAtPiBoIC0+IFVzZWQgKz0gc2l6ZTsKKworICAgIHJldHVybiAodm9pZCopIHB0cjsKK30KKworLy8gRHVwbGljYXRlIGluIHBvb2wKK3ZvaWQqIF9jbXNTdWJBbGxvY0R1cChfY21zU3ViQWxsb2NhdG9yKiBzLCBjb25zdCB2b2lkICpwdHIsIGNtc1VJbnQzMk51bWJlciBzaXplKQoreworICAgIHZvaWQgKk5ld1B0cjsKKyAgICAKKyAgICAvLyBEdXAgb2YgbnVsbCBwb2ludGVyIGlzIGFsc28gTlVMTAorICAgIGlmIChwdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBOZXdQdHIgPSBfY21zU3ViQWxsb2Mocywgc2l6ZSk7CisKKyAgICBpZiAocHRyICE9IE5VTEwgJiYgTmV3UHRyICE9IE5VTEwpIHsKKyAgICAgICAgbWVtY3B5KE5ld1B0ciwgcHRyLCBzaXplKTsKKyAgICB9CisKKyAgICByZXR1cm4gTmV3UHRyOworfQorCisKKworLy8gRXJyb3IgbG9nZ2luZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworLy8gVGhlcmUgaXMgbm8gZXJyb3IgaGFuZGxpbmcgYXQgYWxsLiBXaGVuIGEgZnVudGlvbiBmYWlscywgaXQgcmV0dXJucyBwcm9wZXIgdmFsdWUuCisvLyBGb3IgZXhhbXBsZSwgYWxsIGNyZWF0ZSBmdW5jdGlvbnMgZG9lcyByZXR1cm4gTlVMTCBvbiBmYWlsdXJlLiBPdGhlciByZXR1cm4gRkFMU0UKKy8vIEl0IG1heSBiZSBpbnRlcmVzdGluZywgZm9yIHRoZSBkZXZlbG9wZXIsIHRvIGtub3cgd2h5IHRoZSBmdW5jdGlvbiBpcyBmYWlsaW5nLgorLy8gZm9yIHRoYXQgcmVhc29uLCBsY21zMiBkb2VzIG9mZmVyIGEgbG9nZ2luZyBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiBkb2VzIHJlY2l2ZQorLy8gYSBFTkdMSVNIIHN0cmluZyB3aXRoIHNvbWUgY2x1ZXMgb24gd2hhdCBpcyBnb2luZyB3cm9uZy4gWW91IGNhbiBzaG93IHRoaXMKKy8vIGluZm8gdG8gdGhlIGVuZCB1c2VyLCBvciBqdXN0IGNyZWF0ZSBzb21lIHNvcnQgb2YgbG9nLgorLy8gVGhlIGxvZ2dpbmcgZnVuY3Rpb24gc2hvdWxkIE5PVCB0ZXJtaW5hdGUgdGhlIHByb2dyYW0sIGFzIHRoaXMgb2J2aW91c2x5IGNhbiBsZWF2ZQorLy8gcmVzb3VyY2VzLiBJdCBpcyB0aGUgcHJvZ3JhbW1lcidzIHJlc3BvbnNhYmlsaXR5IHRvIGNoZWNrIGVhY2ggZnVuY3Rpb24gcmV0dXJuIGNvZGUKKy8vIHRvIG1ha2Ugc3VyZSBpdCBkaWRuJ3QgZmFpbC4KKworLy8gRXJyb3IgbWVzc2FnZXMgYXJlIGxpbWl0ZWQgdG8gTUFYX0VSUk9SX01FU1NBR0VfTEVOCisKKyNkZWZpbmUgTUFYX0VSUk9SX01FU1NBR0VfTEVOICAgMTAyNAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVGhpcyBpcyBvdXIgZGVmYXVsdCBsb2cgZXJyb3IKK3N0YXRpYyB2b2lkIERlZmF1bHRMb2dFcnJvckhhbmRsZXJGdW5jdGlvbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIEVycm9yQ29kZSwgY29uc3QgY2hhciAqVGV4dCk7CisKKy8vIENvbnRleHQwIHN0b3JhZ2UsIHdoaWNoIGlzIGdsb2JhbAorX2Ntc0xvZ0Vycm9yQ2h1bmtUeXBlIF9jbXNMb2dFcnJvckNodW5rID0geyBEZWZhdWx0TG9nRXJyb3JIYW5kbGVyRnVuY3Rpb24gfTsKKworLy8gQWxsb2NhdGVzIGFuZCBpbml0cyBlcnJvciBsb2dnZXIgY29udGFpbmVyIGZvciBhIGdpdmVuIGNvbnRleHQuIElmIHNyYyBpcyBOVUxMLCBvbmx5IGluaXRpYWxpemVzIHRoZSB2YWx1ZQorLy8gdG8gdGhlIGRlZmF1bHQuIE90aGVyd2lzZSwgaXQgZHVwbGljYXRlcyB0aGUgdmFsdWUuIFRoZSBpbnRlcmZhY2UgaXMgc3RhbmRhcmQgYWNyb3NzIGFsbCBjb250ZXh0IGNsaWVudHMKK3ZvaWQgX2Ntc0FsbG9jTG9nRXJyb3JDaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYykKK3sgICAgCisgICAgc3RhdGljIF9jbXNMb2dFcnJvckNodW5rVHlwZSBMb2dFcnJvckNodW5rID0geyBEZWZhdWx0TG9nRXJyb3JIYW5kbGVyRnVuY3Rpb24gfTsKKyAgICB2b2lkKiBmcm9tOworICAgICAKKyAgICAgaWYgKHNyYyAhPSBOVUxMKSB7CisgICAgICAgIGZyb20gPSBzcmMgLT5jaHVua3NbTG9nZ2VyXTsgICAgICAgCisgICAgfQorICAgIGVsc2UgeworICAgICAgIGZyb20gPSAmTG9nRXJyb3JDaHVuazsKKyAgICB9CisgICAgCisgICAgY3R4IC0+Y2h1bmtzW0xvZ2dlcl0gPSBfY21zU3ViQWxsb2NEdXAoY3R4IC0+TWVtUG9vbCwgZnJvbSwgc2l6ZW9mKF9jbXNMb2dFcnJvckNodW5rVHlwZSkpOyAgIAorfQorCisvLyBUaGUgZGVmYXVsdCBlcnJvciBsb2dnZXIgZG9lcyBub3RoaW5nLgorc3RhdGljCit2b2lkIERlZmF1bHRMb2dFcnJvckhhbmRsZXJGdW5jdGlvbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIEVycm9yQ29kZSwgY29uc3QgY2hhciAqVGV4dCkKK3sKKyAgICAvLyBmcHJpbnRmKHN0ZGVyciwgIltsY21zXTogJXNcbiIsIFRleHQpOworICAgIC8vIGZmbHVzaChzdGRlcnIpOworCisgICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoQ29udGV4dElEKTsKKyAgICAgY21zVU5VU0VEX1BBUkFNRVRFUihFcnJvckNvZGUpOworICAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFRleHQpOworfQorCisvLyBDaGFuZ2UgbG9nIGVycm9yLCBjb250ZXh0IGJhc2VkCit2b2lkIENNU0VYUE9SVCBjbXNTZXRMb2dFcnJvckhhbmRsZXJUSFIoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc0xvZ0Vycm9ySGFuZGxlckZ1bmN0aW9uIEZuKQoreworICAgIF9jbXNMb2dFcnJvckNodW5rVHlwZSogbGhnID0gKF9jbXNMb2dFcnJvckNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBMb2dnZXIpOworCisgICAgaWYgKGxoZyAhPSBOVUxMKSB7CisKKyAgICAgICAgaWYgKEZuID09IE5VTEwpCisgICAgICAgICAgICBsaGcgLT4gTG9nRXJyb3JIYW5kbGVyID0gRGVmYXVsdExvZ0Vycm9ySGFuZGxlckZ1bmN0aW9uOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsaGcgLT4gTG9nRXJyb3JIYW5kbGVyID0gRm47CisgICAgfQorfQorCisvLyBDaGFuZ2UgbG9nIGVycm9yLCBsZWdhY3kKK3ZvaWQgQ01TRVhQT1JUIGNtc1NldExvZ0Vycm9ySGFuZGxlcihjbXNMb2dFcnJvckhhbmRsZXJGdW5jdGlvbiBGbikKK3sKKyAgICBjbXNTZXRMb2dFcnJvckhhbmRsZXJUSFIoTlVMTCwgRm4pOyAgICAKK30KKworLy8gTG9nIGFuIGVycm9yCisvLyBFcnJvclRleHQgaXMgYSB0ZXh0IGhvbGRpbmcgYW4gZW5nbGlzaCBkZXNjcmlwdGlvbiBvZiBlcnJvci4KK3ZvaWQgQ01TRVhQT1JUIGNtc1NpZ25hbEVycm9yKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgRXJyb3JDb2RlLCBjb25zdCBjaGFyICpFcnJvclRleHQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgY2hhciBCdWZmZXJbTUFYX0VSUk9SX01FU1NBR0VfTEVOXTsKKyAgICBfY21zTG9nRXJyb3JDaHVua1R5cGUqIGxoZzsKKworCisgICAgdmFfc3RhcnQoYXJncywgRXJyb3JUZXh0KTsKKyAgICB2c25wcmludGYoQnVmZmVyLCBNQVhfRVJST1JfTUVTU0FHRV9MRU4tMSwgRXJyb3JUZXh0LCBhcmdzKTsKKyAgICB2YV9lbmQoYXJncyk7CisKKyAgICAvLyBDaGVjayBmb3IgdGhlIGNvbnRleHQsIGlmIHNwZWNpZmllZCBnbyB0aGVyZS4gSWYgbm90LCBnbyBmb3IgdGhlIGdsb2JhbAorICAgIGxoZyA9IChfY21zTG9nRXJyb3JDaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgTG9nZ2VyKTsKKyAgICBpZiAobGhnIC0+TG9nRXJyb3JIYW5kbGVyKSB7CisgICAgICAgIGxoZyAtPkxvZ0Vycm9ySGFuZGxlcihDb250ZXh0SUQsIEVycm9yQ29kZSwgQnVmZmVyKTsKKyAgICB9ICAgCit9CisKKy8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gcHJpbnQgc2lnbmF0dXJlcwordm9pZCBfY21zVGFnU2lnbmF0dXJlMlN0cmluZyhjaGFyIFN0cmluZ1s1XSwgY21zVGFnU2lnbmF0dXJlIHNpZykKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgYmU7CisKKyAgICAvLyBDb252ZXJ0IHRvIGJpZyBlbmRpYW4KKyAgICBiZSA9IF9jbXNBZGp1c3RFbmRpYW5lc3MzMigoY21zVUludDMyTnVtYmVyKSBzaWcpOworCisgICAgLy8gTW92ZSBjaGFycworICAgIG1lbW1vdmUoU3RyaW5nLCAmYmUsIDQpOworCisgICAgLy8gTWFrZSBzdXJlIG9mIHRlcm1pbmF0b3IKKyAgICBTdHJpbmdbNF0gPSAwOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworc3RhdGljCit2b2lkKiBkZWZNdHhDcmVhdGUoY21zQ29udGV4dCBpZCkKK3sKKyAgICBfY21zTXV0ZXgqIHB0cl9tdXRleCA9IChfY21zTXV0ZXgqKSBfY21zTWFsbG9jKGlkLCBzaXplb2YoX2Ntc011dGV4KSk7CisgICAgX2Ntc0luaXRNdXRleFByaW1pdGl2ZShwdHJfbXV0ZXgpOworICAgIHJldHVybiAodm9pZCopIHB0cl9tdXRleDsgICAKK30KKworc3RhdGljCit2b2lkIGRlZk10eERlc3Ryb3koY21zQ29udGV4dCBpZCwgdm9pZCogbXR4KQoreworICAgIF9jbXNEZXN0cm95TXV0ZXhQcmltaXRpdmUoKF9jbXNNdXRleCAqKSBtdHgpOyAKKyAgICBfY21zRnJlZShpZCwgbXR4KTsKK30KKworc3RhdGljCitjbXNCb29sIGRlZk10eExvY2soY21zQ29udGV4dCBpZCwgdm9pZCogbXR4KQoreworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaWQpOworICAgIHJldHVybiBfY21zTG9ja1ByaW1pdGl2ZSgoX2Ntc011dGV4ICopIG10eCkgPT0gMDsgICAgIAorfQorCitzdGF0aWMKK3ZvaWQgZGVmTXR4VW5sb2NrKGNtc0NvbnRleHQgaWQsIHZvaWQqIG10eCkKK3sKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGlkKTsKKyAgICBfY21zVW5sb2NrUHJpbWl0aXZlKChfY21zTXV0ZXggKikgbXR4KTsgCit9CisKKworCisvLyBQb2ludGVycyB0byBtZW1vcnkgbWFuYWdlciBmdW5jdGlvbnMgaW4gQ29udGV4dDAKK19jbXNNdXRleFBsdWdpbkNodW5rVHlwZSBfY21zTXV0ZXhQbHVnaW5DaHVuayA9IHsgZGVmTXR4Q3JlYXRlLCBkZWZNdHhEZXN0cm95LCBkZWZNdHhMb2NrLCBkZWZNdHhVbmxvY2sgfTsKKworLy8gQWxsb2NhdGUgYW5kIGluaXQgbXV0ZXggY29udGFpbmVyLgordm9pZCBfY21zQWxsb2NNdXRleFBsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKQoreworICAgIHN0YXRpYyBfY21zTXV0ZXhQbHVnaW5DaHVua1R5cGUgTXV0ZXhDaHVuayA9IHtkZWZNdHhDcmVhdGUsIGRlZk10eERlc3Ryb3ksIGRlZk10eExvY2ssIGRlZk10eFVubG9jayB9OworICAgIHZvaWQqIGZyb207CisgICAgIAorICAgICBpZiAoc3JjICE9IE5VTEwpIHsKKyAgICAgICAgZnJvbSA9IHNyYyAtPmNodW5rc1tNdXRleFBsdWdpbl07ICAgICAgIAorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICBmcm9tID0gJk11dGV4Q2h1bms7CisgICAgfQorICAgIAorICAgIGN0eCAtPmNodW5rc1tNdXRleFBsdWdpbl0gPSBfY21zU3ViQWxsb2NEdXAoY3R4IC0+TWVtUG9vbCwgZnJvbSwgc2l6ZW9mKF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSkpOyAgIAorfQorCisvLyBSZWdpc3RlciBuZXcgd2F5cyB0byB0cmFuc2Zvcm0KK2Ntc0Jvb2wgIF9jbXNSZWdpc3Rlck11dGV4UGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBEYXRhKQoreworICAgIGNtc1BsdWdpbk11dGV4KiBQbHVnaW4gPSAoY21zUGx1Z2luTXV0ZXgqKSBEYXRhOworICAgIF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSogY3R4ID0gKCBfY21zTXV0ZXhQbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgTXV0ZXhQbHVnaW4pOworCisgICAgaWYgKERhdGEgPT0gTlVMTCkgeworCisgICAgICAgIC8vIE5vIGxvY2sgcm91dGluZXMKKyAgICAgICAgY3R4LT5DcmVhdGVNdXRleFB0ciA9IE5VTEw7IAorICAgICAgICBjdHgtPkRlc3Ryb3lNdXRleFB0ciA9IE5VTEw7IAorICAgICAgICBjdHgtPkxvY2tNdXRleFB0ciA9IE5VTEw7CisgICAgICAgIGN0eCAtPlVubG9ja011dGV4UHRyID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgLy8gRmFjdG9yeSBjYWxsYmFjayBpcyByZXF1aXJlZAorICAgIGlmIChQbHVnaW4gLT5DcmVhdGVNdXRleFB0ciA9PSBOVUxMIHx8IFBsdWdpbiAtPkRlc3Ryb3lNdXRleFB0ciA9PSBOVUxMIHx8IAorICAgICAgICBQbHVnaW4gLT5Mb2NrTXV0ZXhQdHIgPT0gTlVMTCB8fCBQbHVnaW4gLT5VbmxvY2tNdXRleFB0ciA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKworICAgIGN0eC0+Q3JlYXRlTXV0ZXhQdHIgID0gUGx1Z2luLT5DcmVhdGVNdXRleFB0cjsKKyAgICBjdHgtPkRlc3Ryb3lNdXRleFB0ciA9IFBsdWdpbiAtPkRlc3Ryb3lNdXRleFB0cjsKKyAgICBjdHggLT5Mb2NrTXV0ZXhQdHIgICA9IFBsdWdpbiAtPkxvY2tNdXRleFB0cjsKKyAgICBjdHggLT5VbmxvY2tNdXRleFB0ciA9IFBsdWdpbiAtPlVubG9ja011dGV4UHRyOworCisgICAgLy8gQWxsIGlzIG9rCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8vIEdlbmVyaWMgTXV0ZXggZm5zCit2b2lkKiBDTVNFWFBPUlQgX2Ntc0NyZWF0ZU11dGV4KGNtc0NvbnRleHQgQ29udGV4dElEKQoreworICAgIF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSogcHRyID0gKF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBNdXRleFBsdWdpbik7CisKKyAgICBpZiAocHRyIC0+Q3JlYXRlTXV0ZXhQdHIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gcHRyIC0+Q3JlYXRlTXV0ZXhQdHIoQ29udGV4dElEKTsKK30KKwordm9pZCBDTVNFWFBPUlQgX2Ntc0Rlc3Ryb3lNdXRleChjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogbXR4KQoreworICAgIF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSogcHRyID0gKF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBNdXRleFBsdWdpbik7CisKKyAgICBpZiAocHRyIC0+RGVzdHJveU11dGV4UHRyICE9IE5VTEwpIHsKKworICAgICAgICBwdHIgLT5EZXN0cm95TXV0ZXhQdHIoQ29udGV4dElELCBtdHgpOworICAgIH0KK30KKworY21zQm9vbCBDTVNFWFBPUlQgX2Ntc0xvY2tNdXRleChjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogbXR4KQoreworICAgIF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSogcHRyID0gKF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBNdXRleFBsdWdpbik7CisKKyAgICBpZiAocHRyIC0+TG9ja011dGV4UHRyID09IE5VTEwpIHJldHVybiBUUlVFOworCisgICAgcmV0dXJuIHB0ciAtPkxvY2tNdXRleFB0cihDb250ZXh0SUQsIG10eCk7Cit9CisKK3ZvaWQgQ01TRVhQT1JUIF9jbXNVbmxvY2tNdXRleChjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogbXR4KQoreworICAgIF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSogcHRyID0gKF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBNdXRleFBsdWdpbik7CisKKyAgICBpZiAocHRyIC0+VW5sb2NrTXV0ZXhQdHIgIT0gTlVMTCkgeworCisgICAgICAgIHB0ciAtPlVubG9ja011dGV4UHRyKENvbnRleHRJRCwgbXR4KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL2xjbXMyLTIuNi9zcmMvY21zZ2FtbWEuYyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zZ2FtbWEuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9sY21zMi9sY21zMi0yLjYvc3JjL2Ntc2dhbW1hLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zZ2FtbWEuYwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9sY21zMi0yLjYvc3JjL2Ntc2dtdC5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNnbXQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9sY21zMi9sY21zMi0yLjYvc3JjL2Ntc2dtdC5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2dtdC5jCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL2xjbXMyLTIuNi9zcmMvY21zaGFsZi5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNoYWxmLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvbGNtczIvbGNtczItMi42L3NyYy9jbXNoYWxmLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zaGFsZi5jCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL2xjbXMyLTIuNi9zcmMvY21zaW50cnAuYyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zaW50cnAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9sY21zMi9sY21zMi0yLjYvc3JjL2Ntc2ludHJwLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zaW50cnAuYwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9sY21zMi0yLjYvc3JjL2Ntc2lvMC5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNpbzAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9sY21zMi9sY21zMi0yLjYvc3JjL2Ntc2lvMC5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2lvMC5jCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL2xjbXMyLTIuNi9zcmMvY21zaW8xLmMgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2lvMS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2xjbXMyL2xjbXMyLTIuNi9zcmMvY21zaW8xLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zaW8xLmMKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvbGNtczItMi42L3NyYy9jbXNsdXQuYyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zbHV0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvbGNtczIvbGNtczItMi42L3NyYy9jbXNsdXQuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNsdXQuYwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9sY21zMi0yLjYvc3JjL2Ntc21kNS5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNtZDUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9sY21zMi9sY21zMi0yLjYvc3JjL2Ntc21kNS5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc21kNS5jCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL2xjbXMyLTIuNi9zcmMvY21zbXRyeC5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNtdHJ4LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvbGNtczIvbGNtczItMi42L3NyYy9jbXNtdHJ4LmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zbXRyeC5jCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL2xjbXMyLTIuNi9zcmMvY21zbmFtZWQuYyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zbmFtZWQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9sY21zMi9sY21zMi0yLjYvc3JjL2Ntc25hbWVkLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zbmFtZWQuYwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9sY21zMi0yLjYvc3JjL2Ntc29wdC5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNvcHQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9sY21zMi9sY21zMi0yLjYvc3JjL2Ntc29wdC5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc29wdC5jCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL2xjbXMyLTIuNi9zcmMvY21zcGFjay5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNwYWNrLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvbGNtczIvbGNtczItMi42L3NyYy9jbXNwYWNrLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zcGFjay5jCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL2xjbXMyLTIuNi9zcmMvY21zcGNzLmMgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3Bjcy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2xjbXMyL2xjbXMyLTIuNi9zcmMvY21zcGNzLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zcGNzLmMKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvbGNtczItMi42L3NyYy9jbXNwbHVnaW4uYyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zcGx1Z2luLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvbGNtczIvbGNtczItMi42L3NyYy9jbXNwbHVnaW4uYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNwbHVnaW4uYwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9sY21zMi0yLjYvc3JjL2Ntc3BzMi5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNwczIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9sY21zMi9sY21zMi0yLjYvc3JjL2Ntc3BzMi5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3BzMi5jCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL2xjbXMyLTIuNi9zcmMvY21zc2FtcC5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNzYW1wLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvbGNtczIvbGNtczItMi42L3NyYy9jbXNzYW1wLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zc2FtcC5jCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL2xjbXMyLTIuNi9zcmMvY21zc20uYyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zc20uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9sY21zMi9sY21zMi0yLjYvc3JjL2Ntc3NtLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zc20uYwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9sY21zMi9sY21zMi0yLjYvc3JjL2Ntc3R5cGVzLmMgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3R5cGVzLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvbGNtczIvbGNtczItMi42L3NyYy9jbXN0eXBlcy5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3R5cGVzLmMKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvbGNtczItMi42L3NyYy9jbXN2aXJ0LmMgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3ZpcnQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9sY21zMi9sY21zMi0yLjYvc3JjL2Ntc3ZpcnQuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN2aXJ0LmMKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGNtczIvbGNtczItMi42L3NyYy9jbXN3dHBudC5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN3dHBudC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2xjbXMyL2xjbXMyLTIuNi9zcmMvY21zd3RwbnQuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN3dHBudC5jCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xjbXMyL2xjbXMyLTIuNi9zcmMvY21zeGZvcm0uYyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zeGZvcm0uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9sY21zMi9sY21zMi0yLjYvc3JjL2Ntc3hmb3JtLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zeGZvcm0uYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9sY21zMl9pbnRlcm5hbC5oIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9sY21zMl9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MTdlOTIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2xjbXMyX2ludGVybmFsLmgKQEAgLTAsMCArMSwxMDMyIEBACisvLzw8PCsrK09QRU5TT1VSQ0UKKy8vPDw8KysrT1BFTlNPVVJDRV9NVVNUX0JFR0lOIENPTU1FTlQ9PVRSVUUKKy8vCisvLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCisvLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTQgTWFydGkgTWFyaWEgU2FndWVyCisvLworLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisvLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisvLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisvLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKy8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQorLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKy8vCisvLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisvLworLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisvLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KKy8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisvLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCisvLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisvLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKy8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworCisjaWZuZGVmIF9sY21zX2ludGVybmFsX0gKKworLy8gSW5jbHVkZSBwbHVnLWluIGZvdW5kYXRpb24KKyNpZm5kZWYgX2xjbXNfcGx1Z2luX0gKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9sY21zMi0yLjYvaW5jbHVkZS9sY21zMl9wbHVnaW4uaCIKKyNlbmRpZgorCisvLyBjdHlwZSBpcyBwYXJ0IG9mIEM5OSBhcyBwZXIgNy4xLjIKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisvLyBhc3NlcnQgbWFjcm8gaXMgcGFydCBvZiBDOTkgYXMgcGVyIDcuMgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisvLyBTb21lIG5lZWRlZCBjb25zdGFudHMKKyNpZm5kZWYgTV9QSQorIyAgICAgICBkZWZpbmUgTV9QSSAgICAgICAgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgorI2VuZGlmCisKKyNpZm5kZWYgTV9MT0cxMEUKKyMgICAgICAgZGVmaW5lIE1fTE9HMTBFICAgIDAuNDM0Mjk0NDgxOTAzMjUxODI3NjUxCisjZW5kaWYKKworLy8gQm9ybGFuZEMgNS41LCBWQzIwMDMgYXJlIGJyb2tlbiBvbiB0aGF0CisjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IChfTVNDX1ZFUiA8IDE0MDApIC8vIDE0MDAgPT0gVkMrKyA4LjAKKyNkZWZpbmUgc2luZih4KSAoZmxvYXQpc2luKChmbG9hdCl4KQorI2RlZmluZSBzcXJ0Zih4KSAoZmxvYXQpc3FydCgoZmxvYXQpeCkKKyNlbmRpZgorCisKKy8vIEFsaWdubWVudCBvZiBJQ0MgZmlsZSBmb3JtYXQgdXNlcyA0IGJ5dGVzIChjbXNVSW50MzJOdW1iZXIpCisjZGVmaW5lIF9jbXNBTElHTkxPTkcoeCkgKCgoeCkrKHNpemVvZihjbXNVSW50MzJOdW1iZXIpLTEpKSAmIH4oc2l6ZW9mKGNtc1VJbnQzMk51bWJlciktMSkpCisKKy8vIEFsaWdubWVudCB0byBtZW1vcnkgcG9pbnRlcgorI2RlZmluZSBfY21zQUxJR05NRU0oeCkgICgoKHgpKyhzaXplb2Yodm9pZCAqKSAtIDEpKSAmIH4oc2l6ZW9mKHZvaWQgKikgLSAxKSkKKworLy8gTWF4aW11bSBlbmNvZGVhYmxlIHZhbHVlcyBpbiBmbG9hdGluZyBwb2ludAorI2RlZmluZSBNQVhfRU5DT0RFQUJMRV9YWVogICgxLjAgKyAzMjc2Ny4wLzMyNzY4LjApCisjZGVmaW5lIE1JTl9FTkNPREVBQkxFX2FiMiAgKC0xMjguMCkKKyNkZWZpbmUgTUFYX0VOQ09ERUFCTEVfYWIyICAoKDY1NTM1LjAvMjU2LjApIC0gMTI4LjApCisjZGVmaW5lIE1JTl9FTkNPREVBQkxFX2FiNCAgKC0xMjguMCkKKyNkZWZpbmUgTUFYX0VOQ09ERUFCTEVfYWI0ICAoMTI3LjApCisKKy8vIE1heGltdW0gb2YgY2hhbm5lbHMgZm9yIGludGVybmFsIHBpcGVsaW5lIGV2YWx1YXRpb24KKyNkZWZpbmUgTUFYX1NUQUdFX0NIQU5ORUxTICAxMjgKKworLy8gVW51c2VkIHBhcmFtZXRlciB3YXJuaW5nIHN1cHJlc3Npb24KKyNkZWZpbmUgY21zVU5VU0VEX1BBUkFNRVRFUih4KSAoKHZvaWQpeCkKKworLy8gVGhlIHNwZWNpZmljYXRpb24gZm9yICJpbmxpbmUiIGlzIHNlY3Rpb24gNi43LjQgb2YgdGhlIEM5OSBzdGFuZGFyZCAoSVNPL0lFQyA5ODk5OjE5OTkpLgorLy8gdW5mb3J0dW5hdGVseSBWaXN1YWxDKysgZG9lcyBub3QgY29uZm9ybSB0aGF0CisjaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0JPUkxBTkRDX18pCisjICAgZGVmaW5lIGNtc0lOTElORSBfX2lubGluZQorI2Vsc2UKKyMgICBkZWZpbmUgY21zSU5MSU5FIHN0YXRpYyBpbmxpbmUKKyNlbmRpZgorCisvLyBPdGhlciByZXBsYWNlbWVudCBmdW5jdGlvbnMKKyNpZmRlZiBfTVNDX1ZFUgorIyBpZm5kZWYgc25wcmludGYKKyMgICAgICAgZGVmaW5lIHNucHJpbnRmICBfc25wcmludGYKKyMgZW5kaWYKKyMgaWZuZGVmIHZzbnByaW50ZgorIyAgICAgICBkZWZpbmUgdnNucHJpbnRmICBfdnNucHJpbnRmCisjIGVuZGlmCisjZW5kaWYKKworCisvLyBBIGZhc3Qgd2F5IHRvIGNvbnZlcnQgZnJvbS90byAxNiA8LT4gOCBiaXRzCisjZGVmaW5lIEZST01fOF9UT18xNihyZ2IpIChjbXNVSW50MTZOdW1iZXIpICgoKChjbXNVSW50MTZOdW1iZXIpIChyZ2IpKSA8PCA4KXwocmdiKSkKKyNkZWZpbmUgRlJPTV8xNl9UT184KHJnYikgKGNtc1VJbnQ4TnVtYmVyKSAoKCgocmdiKSAqIDY1MjgxICsgODM4ODYwOCkgPj4gMjQpICYgMHhGRikKKworLy8gQ29kZSBhbmFseXNpcyBpcyBicm9rZW4gb24gYXNzZXJ0cworI2lmZGVmIF9NU0NfVkVSCisjICAgIGlmIChfTVNDX1ZFUiA+PSAxNTAwKQorIyAgICAgICAgICAgIGRlZmluZSBfY21zQXNzZXJ0KGEpICB7IGFzc2VydCgoYSkpOyBfX2FuYWx5c2lzX2Fzc3VtZSgoYSkpOyB9CisjICAgICBlbHNlCisjICAgICAgICAgICAgZGVmaW5lIF9jbXNBc3NlcnQoYSkgICBhc3NlcnQoKGEpKQorIyAgICAgZW5kaWYKKyNlbHNlCisjICAgICAgZGVmaW5lIF9jbXNBc3NlcnQoYSkgICBhc3NlcnQoKGEpKQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIERldGVybWluYW50IGxvd2VyIHRoYW4gdGhhdCBhcmUgYXNzdW1lZCB6ZXJvICh1c2VkIG9uIG1hdHJpeCBpbnZlcnQpCisjZGVmaW5lIE1BVFJJWF9ERVRfVE9MRVJBTkNFICAgIDAuMDAwMQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBGaXhlZCBwb2ludAorI2RlZmluZSBGSVhFRF9UT19JTlQoeCkgICAgICAgICAoKHgpPj4xNikKKyNkZWZpbmUgRklYRURfUkVTVF9UT19JTlQoeCkgICAgKCh4KSYweEZGRkZVKQorI2RlZmluZSBST1VORF9GSVhFRF9UT19JTlQoeCkgICAoKCh4KSsweDgwMDApPj4xNikKKworY21zSU5MSU5FIGNtc1MxNUZpeGVkMTZOdW1iZXIgX2Ntc1RvRml4ZWREb21haW4oaW50IGEpICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGEgKyAoKGEgKyAweDdmZmYpIC8gMHhmZmZmKTsgfQorY21zSU5MSU5FIGludCAgICAgICAgICAgICAgICAgX2Ntc0Zyb21GaXhlZERvbWFpbihjbXNTMTVGaXhlZDE2TnVtYmVyIGEpIHsgcmV0dXJuIGEgLSAoKGEgKyAweDdmZmYpID4+IDE2KTsgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBGYXN0IGZsb29yIGNvbnZlcnNpb24gbG9naWMuIFRoYW5rcyB0byBTcmVlIEtvdGF5IGFuZCBTdHVhcnQgTml4b24KKy8vIG5vdGUgdGhhbiB0aGlzIG9ubHkgd29ya3MgaW4gdGhlIHJhbmdlIC4uLTMyNzY3Li4uKzMyNzY3IGJlY2F1c2UKKy8vIG1hbnRpc3NhIGlzIGludGVycHJldGVkIGFzIDE1LjE2IGZpeGVkIHBvaW50LgorLy8gVGhlIHVuaW9uIGlzIHRvIGF2b2lkIHBvaW50ZXIgYWxpYXNpbmcgb3Zlcm9wdGltaXphdGlvbi4KK2Ntc0lOTElORSBpbnQgX2Ntc1F1aWNrRmxvb3IoY21zRmxvYXQ2NE51bWJlciB2YWwpCit7CisjaWZkZWYgQ01TX0RPTlRfVVNFX0ZBU1RfRkxPT1IKKyAgICByZXR1cm4gKGludCkgZmxvb3IodmFsKTsKKyNlbHNlCisgICAgY29uc3QgY21zRmxvYXQ2NE51bWJlciBfbGNtc19kb3VibGUyZml4bWFnaWMgPSA2ODcxOTQ3NjczNi4wICogMS41OyAgLy8gMl4zNiAqIDEuNSwgKDUyLTE2PTM2KSB1c2VzIGxpbWl0ZWQgcHJlY2lzaW9uIHRvIGZsb29yCisgICAgdW5pb24geworICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIHZhbDsKKyAgICAgICAgaW50IGhhbHZlc1syXTsKKyAgICB9IHRlbXA7CisKKyAgICB0ZW1wLnZhbCA9IHZhbCArIF9sY21zX2RvdWJsZTJmaXhtYWdpYzsKKworI2lmZGVmIENNU19VU0VfQklHX0VORElBTgorICAgIHJldHVybiB0ZW1wLmhhbHZlc1sxXSA+PiAxNjsKKyNlbHNlCisgICAgcmV0dXJuIHRlbXAuaGFsdmVzWzBdID4+IDE2OworI2VuZGlmCisjZW5kaWYKK30KKworLy8gRmFzdCBmbG9vciByZXN0cmljdGVkIHRvIDAuLjY1NTM1LjAKK2Ntc0lOTElORSBjbXNVSW50MTZOdW1iZXIgX2Ntc1F1aWNrRmxvb3JXb3JkKGNtc0Zsb2F0NjROdW1iZXIgZCkKK3sKKyAgICByZXR1cm4gKGNtc1VJbnQxNk51bWJlcikgX2Ntc1F1aWNrRmxvb3IoZCAtIDMyNzY3LjApICsgMzI3NjdVOworfQorCisvLyBGbG9vciB0byB3b3JkLCB0YWtpbmcgY2FyZSBvZiBzYXR1cmF0aW9uCitjbXNJTkxJTkUgY21zVUludDE2TnVtYmVyIF9jbXNRdWlja1NhdHVyYXRlV29yZChjbXNGbG9hdDY0TnVtYmVyIGQpCit7CisgICAgZCArPSAwLjU7CisgICAgaWYgKGQgPD0gMCkgcmV0dXJuIDA7CisgICAgaWYgKGQgPj0gNjU1MzUuMCkgcmV0dXJuIDB4ZmZmZjsKKworICAgIHJldHVybiBfY21zUXVpY2tGbG9vcldvcmQoZCk7Cit9CisKKworLy8gUHRocmVhZCBzdXBwb3J0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZuZGVmIENNU19OT19QVEhSRUFEUworCisvLyBUaGlzIGlzIHRoZSB0aHJlYWRpbmcgc3VwcG9ydC4gVW5mb3J0dW5hdGVseSwgaXQgaGFzIHRvIGJlIHBsYXRmb3JtLWRlcGVuZGVudCBiZWNhdXNlIAorLy8gd2luZG93cyBkb2VzIG5vdCBzdXBwb3J0IHB0aHJlYWRzLiAKKworI2lmZGVmIENNU19JU19XSU5ET1dTXworCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gMQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworCisvLyBGcm9tOiBodHRwOi8vbG9ja2xlc3NpbmMuY29tL2FydGljbGVzL3B0aHJlYWRzX29uX3dpbmRvd3MvCisvLyBUaGUgcHRocmVhZHMgQVBJIGhhcyBhbiBpbml0aWFsaXphdGlvbiBtYWNybyB0aGF0IGhhcyBubyBjb3JyZXNwb25kZW5jZSB0byBhbnl0aGluZyBpbiAKKy8vIHRoZSB3aW5kb3dzIEFQSS4gQnkgaW52ZXN0aWdhdGluZyB0aGUgaW50ZXJuYWwgZGVmaW5pdGlvbiBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbiB0eXBlLCAKKy8vIG9uZSBtYXkgd29yayBvdXQgaG93IHRvIGluaXRpYWxpemUgb25lIHdpdGhvdXQgY2FsbGluZyBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCkuIAorLy8gVGhlIHRyaWNrIGhlcmUgaXMgdGhhdCBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCkgaXMgbm90IGFsbG93ZWQgdG8gZmFpbC4gSXQgdHJpZXMgCisvLyB0byBhbGxvY2F0ZSBhIGNyaXRpY2FsIHNlY3Rpb24gZGVidWcgb2JqZWN0LCBidXQgaWYgbm8gbWVtb3J5IGlzIGF2YWlsYWJsZSwgaXQgc2V0cyAKKy8vIHRoZSBwb2ludGVyIHRvIGEgc3BlY2lmaWMgdmFsdWUuIChPbmUgd291bGQgZXhwZWN0IHRoYXQgdmFsdWUgdG8gYmUgTlVMTCwgYnV0IGl0IGlzIAorLy8gYWN0dWFsbHkgKHZvaWQgKiktMSBmb3Igc29tZSByZWFzb24uKSBUaHVzIHdlIGNhbiB1c2UgdGhpcyBzcGVjaWFsIHZhbHVlIGZvciB0aGF0IAorLy8gcG9pbnRlciwgYW5kIHRoZSBjcml0aWNhbCBzZWN0aW9uIGNvZGUgd2lsbCB3b3JrLgorCisvLyBUaGUgb3RoZXIgaW1wb3J0YW50IHBhcnQgb2YgdGhlIGNyaXRpY2FsIHNlY3Rpb24gdHlwZSB0byBpbml0aWFsaXplIGlzIHRoZSBudW1iZXIgCisvLyBvZiB3YWl0ZXJzLiBUaGlzIGNvbnRyb2xzIHdoZXRoZXIgb3Igbm90IHRoZSBtdXRleCBpcyBsb2NrZWQuIEZvcnR1bmF0ZWx5LCB0aGlzIAorLy8gcGFydCBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbiBpcyB1bmxpa2VseSB0byBjaGFuZ2UuIEFwcGFyZW50bHksIG1hbnkgcHJvZ3JhbXMgCisvLyBhbHJlYWR5IHRlc3QgY3JpdGljYWwgc2VjdGlvbnMgdG8gc2VlIGlmIHRoZXkgYXJlIGxvY2tlZCB1c2luZyB0aGlzIHZhbHVlLCBzbyAKKy8vIE1pY3Jvc29mdCBmZWx0IHRoYXQgaXQgd2FzIG5lY2Vzc2FyeSB0byBrZWVwIGl0IHNldCBhdCAtMSBmb3IgYW4gdW5sb2NrZWQgY3JpdGljYWwKKy8vIHNlY3Rpb24sIGV2ZW4gd2hlbiB0aGV5IGNoYW5nZWQgdGhlIHVuZGVybHlpbmcgYWxnb3JpdGhtIHRvIGJlIG1vcmUgc2NhbGFibGUuIAorLy8gVGhlIGZpbmFsIHBhcnRzIG9mIHRoZSBjcml0aWNhbCBzZWN0aW9uIG9iamVjdCBhcmUgdW5pbXBvcnRhbnQsIGFuZCBjYW4gYmUgc2V0IAorLy8gdG8gemVybyBmb3IgdGhlaXIgZGVmYXVsdHMuIFRoaXMgeWllbGRzIGFuIGluaXRpYWxpemF0aW9uIG1hY3JvOgorCit0eXBlZGVmIENSSVRJQ0FMX1NFQ1RJT04gX2Ntc011dGV4OworCisjZGVmaW5lIENNU19NVVRFWF9JTklUSUFMSVpFUiB7KHZvaWQqKSAtMSwtMSwwLDAsMCwwfQorCitjbXNJTkxJTkUgaW50IF9jbXNMb2NrUHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKK3sKKwlFbnRlckNyaXRpY2FsU2VjdGlvbihtKTsKKwlyZXR1cm4gMDsKK30KKworY21zSU5MSU5FIGludCBfY21zVW5sb2NrUHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKK3sKKwlMZWF2ZUNyaXRpY2FsU2VjdGlvbihtKTsKKwlyZXR1cm4gMDsKK30KKwkKK2Ntc0lOTElORSBpbnQgX2Ntc0luaXRNdXRleFByaW1pdGl2ZShfY21zTXV0ZXggKm0pCit7CisJSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihtKTsKKwlyZXR1cm4gMDsKK30KKworY21zSU5MSU5FIGludCBfY21zRGVzdHJveU11dGV4UHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKK3sKKwlEZWxldGVDcml0aWNhbFNlY3Rpb24obSk7CisJcmV0dXJuIDA7Cit9CisKK2Ntc0lOTElORSBpbnQgX2Ntc0VudGVyQ3JpdGljYWxTZWN0aW9uUHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKK3sKKwlFbnRlckNyaXRpY2FsU2VjdGlvbihtKTsKKwlyZXR1cm4gMDsKK30KKworY21zSU5MSU5FIGludCBfY21zTGVhdmVDcml0aWNhbFNlY3Rpb25QcmltaXRpdmUoX2Ntc011dGV4ICptKQoreworCUxlYXZlQ3JpdGljYWxTZWN0aW9uKG0pOworCXJldHVybiAwOworfQorCisjZWxzZQorCisvLyBSZXN0IG9mIHRoZSB3aWRlIHdvcmxkCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjZGVmaW5lIENNU19NVVRFWF9JTklUSUFMSVpFUiBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSCit0eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCBfY21zTXV0ZXg7CisKKworY21zSU5MSU5FIGludCBfY21zTG9ja1ByaW1pdGl2ZShfY21zTXV0ZXggKm0pCit7CisJcmV0dXJuIHB0aHJlYWRfbXV0ZXhfbG9jayhtKTsKK30KKworY21zSU5MSU5FIGludCBfY21zVW5sb2NrUHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKK3sKKwlyZXR1cm4gcHRocmVhZF9tdXRleF91bmxvY2sobSk7Cit9CisJCitjbXNJTkxJTkUgaW50IF9jbXNJbml0TXV0ZXhQcmltaXRpdmUoX2Ntc011dGV4ICptKQoreworCXJldHVybiBwdGhyZWFkX211dGV4X2luaXQobSwgTlVMTCk7Cit9CisKK2Ntc0lOTElORSBpbnQgX2Ntc0Rlc3Ryb3lNdXRleFByaW1pdGl2ZShfY21zTXV0ZXggKm0pCit7CisJcmV0dXJuIHB0aHJlYWRfbXV0ZXhfZGVzdHJveShtKTsKK30KKworY21zSU5MSU5FIGludCBfY21zRW50ZXJDcml0aWNhbFNlY3Rpb25QcmltaXRpdmUoX2Ntc011dGV4ICptKQoreworCXJldHVybiBwdGhyZWFkX211dGV4X2xvY2sobSk7Cit9CisKK2Ntc0lOTElORSBpbnQgX2Ntc0xlYXZlQ3JpdGljYWxTZWN0aW9uUHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKK3sKKwlyZXR1cm4gcHRocmVhZF9tdXRleF91bmxvY2sobSk7Cit9CisKKyNlbmRpZgorI2Vsc2UKKworI2RlZmluZSBDTVNfTVVURVhfSU5JVElBTElaRVIgMAordHlwZWRlZiBpbnQgX2Ntc011dGV4OworCisKK2Ntc0lOTElORSBpbnQgX2Ntc0xvY2tQcmltaXRpdmUoX2Ntc011dGV4ICptKQoreworCXJldHVybiAwOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobSk7Cit9CisKK2Ntc0lOTElORSBpbnQgX2Ntc1VubG9ja1ByaW1pdGl2ZShfY21zTXV0ZXggKm0pCit7CisJcmV0dXJuIDA7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihtKTsKK30KKwkKK2Ntc0lOTElORSBpbnQgX2Ntc0luaXRNdXRleFByaW1pdGl2ZShfY21zTXV0ZXggKm0pCit7CisJcmV0dXJuIDA7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihtKTsKK30KKworY21zSU5MSU5FIGludCBfY21zRGVzdHJveU11dGV4UHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKK3sKKwlyZXR1cm4gMDsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG0pOworfQorCitjbXNJTkxJTkUgaW50IF9jbXNFbnRlckNyaXRpY2FsU2VjdGlvblByaW1pdGl2ZShfY21zTXV0ZXggKm0pCit7CisJcmV0dXJuIDA7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihtKTsKK30KKworY21zSU5MSU5FIGludCBfY21zTGVhdmVDcml0aWNhbFNlY3Rpb25QcmltaXRpdmUoX2Ntc011dGV4ICptKQoreworCXJldHVybiAwOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobSk7Cit9CisjZW5kaWYKKworLy8gUGx1Zy1JbiByZWdpc3RyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFNwZWNpYWxpemVkIGZ1bmN0aW9uIGZvciBwbHVnLWluIG1lbW9yeSBtYW5hZ2VtZW50LiBObyBwYWlyaW5nIGZyZWUoKSBzaW5jZSB3aG9sZSBwb29sIGlzIGZyZWVkIGF0IG9uY2UuCit2b2lkKiBfY21zUGx1Z2luTWFsbG9jKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgc2l6ZSk7CisKKy8vIE1lbW9yeSBtYW5hZ2VtZW50CitjbXNCb29sICAgX2Ntc1JlZ2lzdGVyTWVtSGFuZGxlclBsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogUGx1Z2luKTsKKworLy8gSW50ZXJwb2xhdGlvbgorY21zQm9vbCAgX2Ntc1JlZ2lzdGVySW50ZXJwUGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOworCisvLyBQYXJhbWV0cmljIGN1cnZlcworY21zQm9vbCAgX2Ntc1JlZ2lzdGVyUGFyYW1ldHJpY0N1cnZlc1BsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogUGx1Z2luKTsKKworLy8gRm9ybWF0dGVycyBtYW5hZ2VtZW50CitjbXNCb29sICBfY21zUmVnaXN0ZXJGb3JtYXR0ZXJzUGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOworCisvLyBUYWcgdHlwZSBtYW5hZ2VtZW50CitjbXNCb29sICBfY21zUmVnaXN0ZXJUYWdUeXBlUGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOworCisvLyBUYWcgbWFuYWdlbWVudAorY21zQm9vbCAgX2Ntc1JlZ2lzdGVyVGFnUGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOworCisvLyBJbnRlbnQgbWFuYWdlbWVudAorY21zQm9vbCAgX2Ntc1JlZ2lzdGVyUmVuZGVyaW5nSW50ZW50UGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOworCisvLyBNdWx0aSBQcm9jZXNzIGVsZW1lbnRzCitjbXNCb29sICBfY21zUmVnaXN0ZXJNdWx0aVByb2Nlc3NFbGVtZW50UGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOworCisvLyBPcHRpbWl6YXRpb24KK2Ntc0Jvb2wgIF9jbXNSZWdpc3Rlck9wdGltaXphdGlvblBsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogUGx1Z2luKTsKKworLy8gVHJhbnNmb3JtCitjbXNCb29sICBfY21zUmVnaXN0ZXJUcmFuc2Zvcm1QbHVnaW4oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1BsdWdpbkJhc2UqIFBsdWdpbik7CisKKy8vIE11dGV4CitjbXNCb29sIF9jbXNSZWdpc3Rlck11dGV4UGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gU3ViYWxsb2NhdG9ycy4gCit0eXBlZGVmIHN0cnVjdCBfY21zU3ViQWxsb2NhdG9yX2NodW5rX3N0IHsKKworICAgIGNtc1VJbnQ4TnVtYmVyKiBCbG9jazsKKyAgICBjbXNVSW50MzJOdW1iZXIgQmxvY2tTaXplOworICAgIGNtc1VJbnQzMk51bWJlciBVc2VkOworCisgICAgc3RydWN0IF9jbXNTdWJBbGxvY2F0b3JfY2h1bmtfc3QqIG5leHQ7CisKK30gX2Ntc1N1YkFsbG9jYXRvcl9jaHVuazsKKworCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICBjbXNDb250ZXh0IENvbnRleHRJRDsKKyAgICBfY21zU3ViQWxsb2NhdG9yX2NodW5rKiBoOworCit9IF9jbXNTdWJBbGxvY2F0b3I7CisKKworX2Ntc1N1YkFsbG9jYXRvciogX2Ntc0NyZWF0ZVN1YkFsbG9jKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgSW5pdGlhbCk7Cit2b2lkICAgICAgICAgICAgICBfY21zU3ViQWxsb2NEZXN0cm95KF9jbXNTdWJBbGxvY2F0b3IqIHMpOwordm9pZCogICAgICAgICAgICAgX2Ntc1N1YkFsbG9jKF9jbXNTdWJBbGxvY2F0b3IqIHMsIGNtc1VJbnQzMk51bWJlciBzaXplKTsKK3ZvaWQqICAgICAgICAgICAgIF9jbXNTdWJBbGxvY0R1cChfY21zU3ViQWxsb2NhdG9yKiBzLCBjb25zdCB2b2lkICpwdHIsIGNtc1VJbnQzMk51bWJlciBzaXplKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGUgY29udGV4dCBjbGllbnRzLiAKK3R5cGVkZWYgZW51bSB7CisKKyAgICBVc2VyUHRyLCAgICAgICAgICAgIC8vIFVzZXItZGVmaW5lZCBwb2ludGVyCisgICAgTG9nZ2VyLAorICAgIEFsYXJtQ29kZXNDb250ZXh0LAorICAgIEFkYXB0YXRpb25TdGF0ZUNvbnRleHQsIAorICAgIE1lbVBsdWdpbiwKKyAgICBJbnRlcnBQbHVnaW4sCisgICAgQ3VydmVzUGx1Z2luLAorICAgIEZvcm1hdHRlcnNQbHVnaW4sCisgICAgVGFnVHlwZVBsdWdpbiwKKyAgICBUYWdQbHVnaW4sCisgICAgSW50ZW50UGx1Z2luLAorICAgIE1QRVBsdWdpbiwKKyAgICBPcHRpbWl6YXRpb25QbHVnaW4sCisgICAgVHJhbnNmb3JtUGx1Z2luLAorICAgIE11dGV4UGx1Z2luLAorCisgICAgLy8gTGFzdCBpbiBsaXN0CisgICAgTWVtb3J5Q2xpZW50TWF4CisKK30gX2Ntc01lbW9yeUNsaWVudDsKKworCisvLyBDb250YWluZXIgZm9yIG1lbW9yeSBtYW5hZ2VtZW50IHBsdWctaW4uCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICBfY21zTWFsbG9jRm5QdHJUeXBlICAgICBNYWxsb2NQdHI7ICAgIAorICAgIF9jbXNNYWxsb1plcm9jRm5QdHJUeXBlIE1hbGxvY1plcm9QdHI7CisgICAgX2Ntc0ZyZWVGblB0clR5cGUgICAgICAgRnJlZVB0cjsKKyAgICBfY21zUmVhbGxvY0ZuUHRyVHlwZSAgICBSZWFsbG9jUHRyOworICAgIF9jbXNDYWxsb2NGblB0clR5cGUgICAgIENhbGxvY1B0cjsKKyAgICBfY21zRHVwRm5QdHJUeXBlICAgICAgICBEdXBQdHI7CisKK30gX2Ntc01lbVBsdWdpbkNodW5rVHlwZTsKKworLy8gQ29weSBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbiBwb2ludGVycyBmcm9tIHBsdWctaW4gdG8gY2h1bmssIHRha2luZyBjYXJlIG9mIG1pc3Npbmcgcm91dGluZXMKK3ZvaWQgIF9jbXNJbnN0YWxsQWxsb2NGdW5jdGlvbnMoY21zUGx1Z2luTWVtSGFuZGxlciogUGx1Z2luLCBfY21zTWVtUGx1Z2luQ2h1bmtUeXBlKiBwdHIpOworCisvLyBJbnRlcm5hbCBzdHJ1Y3R1cmUgZm9yIGNvbnRleHQKK3N0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QgeworICAgIAorICAgIHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIE5leHQ7ICAvLyBQb2ludHMgdG8gbmV4dCBjb250ZXh0IGluIHRoZSBuZXcgc3R5bGUKKyAgICBfY21zU3ViQWxsb2NhdG9yKiBNZW1Qb29sOyAgICAgICAgLy8gVGhlIG1lbW9yeSBwb29sIHRoYXQgc3RvcmVzIGNvbnRleHQgZGF0YQorICAgIAorICAgIHZvaWQqIGNodW5rc1tNZW1vcnlDbGllbnRNYXhdOyAgICAvLyBhcnJheSBvZiBwb2ludGVycyB0byBjbGllbnQgY2h1bmtzLiBNZW1vcnkgaXRzZWxmIGlzIGhvbGQgaW4gdGhlIHN1YmFsbG9jYXRvci4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIE5VTEwsIHRoZW4gaXQgcmV2ZXJ0cyB0byBnbG9iYWwgQ29udGV4dDAKKworICAgIF9jbXNNZW1QbHVnaW5DaHVua1R5cGUgRGVmYXVsdE1lbW9yeU1hbmFnZXI7ICAvLyBUaGUgYWxsb2NhdG9ycyB1c2VkIGZvciBjcmVhdGluZyB0aGUgY29udGV4dCBpdHNlbGYuIENhbm5vdCBiZSBvdmVycmlkZW4KK307CisKKy8vIFJldHVybnMgYSBwb2ludGVyIHRvIGEgdmFsaWQgY29udGV4dCBzdHJ1Y3R1cmUsIGluY2x1ZGluZyB0aGUgZ2xvYmFsIG9uZSBpZiBpZCBpcyB6ZXJvLiAKKy8vIFZlcmlmaWVzIHRoZSBtYWdpYyBudW1iZXIuCitzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBfY21zR2V0Q29udGV4dChjbXNDb250ZXh0IENvbnRleHRJRCk7CisKKy8vIFJldHVybnMgdGhlIGJsb2NrIGFzc2lnbmVkIHRvIHRoZSBzcGVjaWZpYyB6b25lLiAKK3ZvaWQqICAgICBfY21zQ29udGV4dEdldENsaWVudENodW5rKGNtc0NvbnRleHQgaWQsIF9jbXNNZW1vcnlDbGllbnQgbWMpOworCisKKy8vIENodW5rcyBvZiBjb250ZXh0IG1lbW9yeSBieSBwbHVnLWluIGNsaWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRob3NlIHN0cnVjdHVyZXMgZW5jYXBzdWxhdGVzIGFsbCB2YXJpYWJsZXMgbmVlZGVkIGJ5IHRoZSBzZXZlcmFsIGNvbnRleHQgY2xpZW50cyAobW9zdGx5IHBsdWctaW5zKQorCisvLyBDb250YWluZXIgZm9yIGVycm9yIGxvZ2dlciAtLSBub3QgYSBwbHVnLWluCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICBjbXNMb2dFcnJvckhhbmRsZXJGdW5jdGlvbiBMb2dFcnJvckhhbmRsZXI7ICAvLyBTZXQgdG8gTlVMTCBmb3IgQ29udGV4dDAgZmFsbGJhY2sKKworfSBfY21zTG9nRXJyb3JDaHVua1R5cGU7CisKKy8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3IgZXJyb3IgbG9nZ2VyCitleHRlcm4gIF9jbXNMb2dFcnJvckNodW5rVHlwZSAgX2Ntc0xvZ0Vycm9yQ2h1bms7CisKKy8vIEFsbG9jYXRlIGFuZCBpbml0IGVycm9yIGxvZ2dlciBjb250YWluZXIuIAordm9pZCBfY21zQWxsb2NMb2dFcnJvckNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKTsKKworLy8gQ29udGFpbmVyIGZvciBhbGFybSBjb2RlcyAtLSBub3QgYSBwbHVnLWluCit0eXBlZGVmIHN0cnVjdCB7CisgICAKKyAgICBjbXNVSW50MTZOdW1iZXIgQWxhcm1Db2Rlc1tjbXNNQVhDSEFOTkVMU107CisKK30gX2Ntc0FsYXJtQ29kZXNDaHVua1R5cGU7CisKKy8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3IgYWxhcm0gY29kZXMKK2V4dGVybiAgX2Ntc0FsYXJtQ29kZXNDaHVua1R5cGUgX2Ntc0FsYXJtQ29kZXNDaHVuazsKKworLy8gQWxsb2NhdGUgYW5kIGluaXQgYWxhcm0gY29kZXMgY29udGFpbmVyLiAKK3ZvaWQgX2Ntc0FsbG9jQWxhcm1Db2Rlc0NodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKTsKKworLy8gQ29udGFpbmVyIGZvciBhZGFwdGF0aW9uIHN0YXRlIC0tIG5vdCBhIHBsdWctaW4KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAKKyAgICBjbXNGbG9hdDY0TnVtYmVyICBBZGFwdGF0aW9uU3RhdGU7CisKK30gX2Ntc0FkYXB0YXRpb25TdGF0ZUNodW5rVHlwZTsKKworLy8gVGhlIGdsb2JhbCBDb250ZXh0MCBzdG9yYWdlIGZvciBhZGFwdGF0aW9uIHN0YXRlCitleHRlcm4gIF9jbXNBZGFwdGF0aW9uU3RhdGVDaHVua1R5cGUgICAgX2Ntc0FkYXB0YXRpb25TdGF0ZUNodW5rOworCisvLyBBbGxvY2F0ZSBhbmQgaW5pdCBhZGFwdGF0aW9uIHN0YXRlIGNvbnRhaW5lci4KK3ZvaWQgX2Ntc0FsbG9jQWRhcHRhdGlvblN0YXRlQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKTsKKworCisvLyBUaGUgZ2xvYmFsIENvbnRleHQwIHN0b3JhZ2UgZm9yIG1lbW9yeSBtYW5hZ2VtZW50CitleHRlcm4gIF9jbXNNZW1QbHVnaW5DaHVua1R5cGUgX2Ntc01lbVBsdWdpbkNodW5rOworCisvLyBBbGxvY2F0ZSBhbmQgaW5pdCBtZW1vcnkgbWFuYWdlbWVudCBjb250YWluZXIuCit2b2lkIF9jbXNBbGxvY01lbVBsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYyk7CisKKy8vIENvbnRhaW5lciBmb3IgaW50ZXJwb2xhdGlvbiBwbHVnLWluCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICBjbXNJbnRlcnBGbkZhY3RvcnkgSW50ZXJwb2xhdG9yczsKKworfSBfY21zSW50ZXJwUGx1Z2luQ2h1bmtUeXBlOworCisvLyBUaGUgZ2xvYmFsIENvbnRleHQwIHN0b3JhZ2UgZm9yIGludGVycG9sYXRpb24gcGx1Zy1pbgorZXh0ZXJuICBfY21zSW50ZXJwUGx1Z2luQ2h1bmtUeXBlIF9jbXNJbnRlcnBQbHVnaW5DaHVuazsKKworLy8gQWxsb2NhdGUgYW5kIGluaXQgaW50ZXJwb2xhdGlvbiBjb250YWluZXIuCit2b2lkIF9jbXNBbGxvY0ludGVycFBsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYyk7CisKKy8vIENvbnRhaW5lciBmb3IgcGFyYW1ldHJpYyBjdXJ2ZXMgcGx1Zy1pbgordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgc3RydWN0IF9jbXNQYXJhbWV0cmljQ3VydmVzQ29sbGVjdGlvbl9zdCogUGFyYW1ldHJpY0N1cnZlczsKKworfSBfY21zQ3VydmVzUGx1Z2luQ2h1bmtUeXBlOworCisvLyBUaGUgZ2xvYmFsIENvbnRleHQwIHN0b3JhZ2UgZm9yIHRvbmUgY3VydmVzIHBsdWctaW4KK2V4dGVybiAgX2Ntc0N1cnZlc1BsdWdpbkNodW5rVHlwZSBfY21zQ3VydmVzUGx1Z2luQ2h1bms7CisKKy8vIEFsbG9jYXRlIGFuZCBpbml0IHBhcmFtZXRyaWMgY3VydmVzIGNvbnRhaW5lci4KK3ZvaWQgX2Ntc0FsbG9jQ3VydmVzUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYyk7CisKKy8vIENvbnRhaW5lciBmb3IgZm9ybWF0dGVycyBwbHVnLWluCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICBzdHJ1Y3QgX2Ntc19mb3JtYXR0ZXJzX2ZhY3RvcnlfbGlzdCogRmFjdG9yeUxpc3Q7CisKK30gX2Ntc0Zvcm1hdHRlcnNQbHVnaW5DaHVua1R5cGU7CisKKy8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3IgZm9ybWF0dGVycyBwbHVnLWluCitleHRlcm4gIF9jbXNGb3JtYXR0ZXJzUGx1Z2luQ2h1bmtUeXBlIF9jbXNGb3JtYXR0ZXJzUGx1Z2luQ2h1bms7CisKKy8vIEFsbG9jYXRlIGFuZCBpbml0IGZvcm1hdHRlcnMgY29udGFpbmVyLgordm9pZCBfY21zQWxsb2NGb3JtYXR0ZXJzUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpOworCisvLyBUaGlzIGNodW5rIHR5cGUgaXMgc2hhcmVkIGJ5IFRhZ1R5cGUgcGx1Zy1pbiBhbmQgTVBFIFBsdWctaW4KK3R5cGVkZWYgc3RydWN0IHsKKworICAgIHN0cnVjdCBfY21zVGFnVHlwZUxpbmtlZExpc3Rfc3QqIFRhZ1R5cGVzOworCit9IF9jbXNUYWdUeXBlUGx1Z2luQ2h1bmtUeXBlOworCisKKy8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3IgdGFnIHR5cGVzIHBsdWctaW4KK2V4dGVybiAgX2Ntc1RhZ1R5cGVQbHVnaW5DaHVua1R5cGUgICAgICBfY21zVGFnVHlwZVBsdWdpbkNodW5rOworCisKKy8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3IgbXVsdCBwcm9jZXNzIGVsZW1lbnRzIHBsdWctaW4KK2V4dGVybiAgX2Ntc1RhZ1R5cGVQbHVnaW5DaHVua1R5cGUgICAgICBfY21zTVBFVHlwZVBsdWdpbkNodW5rOworCisvLyBBbGxvY2F0ZSBhbmQgaW5pdCBUYWcgdHlwZXMgY29udGFpbmVyLgordm9pZCBfY21zQWxsb2NUYWdUeXBlUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKTsKKy8vIEFsbG9jYXRlIGFuZCBpbml0IE1QRSBjb250YWluZXIuCit2b2lkIF9jbXNBbGxvY01QRVR5cGVQbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpOworLy8gQ29udGFpbmVyIGZvciB0YWcgcGx1Zy1pbgordHlwZWRlZiBzdHJ1Y3QgeworICAgCisgICAgc3RydWN0IF9jbXNUYWdMaW5rZWRMaXN0X3N0KiBUYWc7CisKK30gX2Ntc1RhZ1BsdWdpbkNodW5rVHlwZTsKKworCisvLyBUaGUgZ2xvYmFsIENvbnRleHQwIHN0b3JhZ2UgZm9yIHRhZyBwbHVnLWluCitleHRlcm4gIF9jbXNUYWdQbHVnaW5DaHVua1R5cGUgX2Ntc1RhZ1BsdWdpbkNodW5rOworCisvLyBBbGxvY2F0ZSBhbmQgaW5pdCBUYWcgY29udGFpbmVyLgordm9pZCBfY21zQWxsb2NUYWdQbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKTsgCisKKy8vIENvbnRhaW5lciBmb3IgaW50ZW50cyBwbHVnLWluCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICBzdHJ1Y3QgX2Ntc19pbnRlbnRzX2xpc3QqIEludGVudHM7CisKK30gX2Ntc0ludGVudHNQbHVnaW5DaHVua1R5cGU7CisKKworLy8gVGhlIGdsb2JhbCBDb250ZXh0MCBzdG9yYWdlIGZvciBpbnRlbnRzIHBsdWctaW4KK2V4dGVybiAgX2Ntc0ludGVudHNQbHVnaW5DaHVua1R5cGUgX2Ntc0ludGVudHNQbHVnaW5DaHVuazsKKworLy8gQWxsb2NhdGUgYW5kIGluaXQgaW50ZW50cyBjb250YWluZXIuCit2b2lkIF9jbXNBbGxvY0ludGVudHNQbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpOyAKKworLy8gQ29udGFpbmVyIGZvciBvcHRpbWl6YXRpb24gcGx1Zy1pbgordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgc3RydWN0IF9jbXNPcHRpbWl6YXRpb25Db2xsZWN0aW9uX3N0KiBPcHRpbWl6YXRpb25Db2xsZWN0aW9uOworCit9IF9jbXNPcHRpbWl6YXRpb25QbHVnaW5DaHVua1R5cGU7CisKKworLy8gVGhlIGdsb2JhbCBDb250ZXh0MCBzdG9yYWdlIGZvciBvcHRpbWl6ZXJzIHBsdWctaW4KK2V4dGVybiAgX2Ntc09wdGltaXphdGlvblBsdWdpbkNodW5rVHlwZSBfY21zT3B0aW1pemF0aW9uUGx1Z2luQ2h1bms7CisKKy8vIEFsbG9jYXRlIGFuZCBpbml0IG9wdGltaXplcnMgY29udGFpbmVyLgordm9pZCBfY21zQWxsb2NPcHRpbWl6YXRpb25QbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpOworCisvLyBDb250YWluZXIgZm9yIHRyYW5zZm9ybSBwbHVnLWluCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICBzdHJ1Y3QgX2Ntc1RyYW5zZm9ybUNvbGxlY3Rpb25fc3QqIFRyYW5zZm9ybUNvbGxlY3Rpb247CisKK30gX2Ntc1RyYW5zZm9ybVBsdWdpbkNodW5rVHlwZTsKKworLy8gVGhlIGdsb2JhbCBDb250ZXh0MCBzdG9yYWdlIGZvciBmdWxsLXRyYW5zZm9ybSByZXBsYWNlbWVudCBwbHVnLWluCitleHRlcm4gIF9jbXNUcmFuc2Zvcm1QbHVnaW5DaHVua1R5cGUgX2Ntc1RyYW5zZm9ybVBsdWdpbkNodW5rOworCisvLyBBbGxvY2F0ZSBhbmQgaW5pdCB0cmFuc2Zvcm0gY29udGFpbmVyLgordm9pZCBfY21zQWxsb2NUcmFuc2Zvcm1QbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYyk7CisKKy8vIENvbnRhaW5lciBmb3IgbXV0ZXggcGx1Zy1pbgordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgX2Ntc0NyZWF0ZU11dGV4Rm5QdHJUeXBlICBDcmVhdGVNdXRleFB0cjsKKyAgICBfY21zRGVzdHJveU11dGV4Rm5QdHJUeXBlIERlc3Ryb3lNdXRleFB0cjsKKyAgICBfY21zTG9ja011dGV4Rm5QdHJUeXBlICAgIExvY2tNdXRleFB0cjsKKyAgICBfY21zVW5sb2NrTXV0ZXhGblB0clR5cGUgIFVubG9ja011dGV4UHRyOworCit9IF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZTsKKworLy8gVGhlIGdsb2JhbCBDb250ZXh0MCBzdG9yYWdlIGZvciBtdXRleCBwbHVnLWluCitleHRlcm4gIF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSBfY21zTXV0ZXhQbHVnaW5DaHVuazsKKworLy8gQWxsb2NhdGUgYW5kIGluaXQgbXV0ZXggY29udGFpbmVyLgordm9pZCBfY21zQWxsb2NNdXRleFBsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTUxVIGludGVybmFsIHJlcHJlc2VudGF0aW9uCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICBjbXNVSW50MTZOdW1iZXIgTGFuZ3VhZ2U7CisgICAgY21zVUludDE2TnVtYmVyIENvdW50cnk7CisKKyAgICBjbXNVSW50MzJOdW1iZXIgU3RyVzsgICAgICAgLy8gT2Zmc2V0IHRvIGN1cnJlbnQgdW5pY29kZSBzdHJpbmcKKyAgICBjbXNVSW50MzJOdW1iZXIgTGVuOyAgICAgICAgLy8gTGVuZ3RoIGluIGJ5dGVzCisKK30gX2Ntc01MVWVudHJ5OworCitzdHJ1Y3QgX2Ntc19NTFVfc3RydWN0IHsKKworICAgIGNtc0NvbnRleHQgQ29udGV4dElEOworCisgICAgLy8gVGhlIGRpcmVjdG9yeQorICAgIGludCBBbGxvY2F0ZWRFbnRyaWVzOworICAgIGludCBVc2VkRW50cmllczsKKyAgICBfY21zTUxVZW50cnkqIEVudHJpZXM7ICAgICAvLyBBcnJheSBvZiBwb2ludGVycyB0byBzdHJpbmdzIGFsbG9jYXRlZCBpbiBNZW1Qb29sCisKKyAgICAvLyBUaGUgUG9vbAorICAgIGNtc1VJbnQzMk51bWJlciBQb29sU2l6ZTsgIC8vIFRoZSBtYXhpbXVtIGFsbG9jYXRlZCBzaXplCisgICAgY21zVUludDMyTnVtYmVyIFBvb2xVc2VkOyAgLy8gVGhlIHVzZWQgc2l6ZQorICAgIHZvaWQqICBNZW1Qb29sOyAgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gYmVnaW4gb2YgbWVtb3J5IHBvb2wKK307CisKKy8vIE5hbWVkIGNvbG9yIGxpc3QgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24KK3R5cGVkZWYgc3RydWN0IHsKKworICAgIGNoYXIgTmFtZVtjbXNNQVhfUEFUSF07CisgICAgY21zVUludDE2TnVtYmVyIFBDU1szXTsKKyAgICBjbXNVSW50MTZOdW1iZXIgRGV2aWNlQ29sb3JhbnRbY21zTUFYQ0hBTk5FTFNdOworCit9IF9jbXNOQU1FRENPTE9SOworCitzdHJ1Y3QgX2Ntc19OQU1FRENPTE9STElTVF9zdHJ1Y3QgeworCisgICAgY21zVUludDMyTnVtYmVyIG5Db2xvcnM7CisgICAgY21zVUludDMyTnVtYmVyIEFsbG9jYXRlZDsKKyAgICBjbXNVSW50MzJOdW1iZXIgQ29sb3JhbnRDb3VudDsKKworICAgIGNoYXIgUHJlZml4WzMzXTsgICAgICAvLyBQcmVmaXggYW5kIHN1ZmZpeCBhcmUgZGVmaW5lZCB0byBiZSAzMiBjaGFyYWN0ZXJzIGF0IG1vc3QKKyAgICBjaGFyIFN1ZmZpeFszM107CisKKyAgICBfY21zTkFNRURDT0xPUiogTGlzdDsKKworICAgIGNtc0NvbnRleHQgQ29udGV4dElEOworfTsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoaXMgaXMgdGhlIGludGVybmFsIHN0cnVjdCBob2xkaW5nIHByb2ZpbGUgZGV0YWlscy4KKworLy8gTWF4aW11bSBzdXBwb3J0ZWQgdGFncyBpbiBhIHByb2ZpbGUKKyNkZWZpbmUgTUFYX1RBQkxFX1RBRyAgICAgICAxMDAKKwordHlwZWRlZiBzdHJ1Y3QgX2Ntc19pY2Nwcm9maWxlX3N0cnVjdCB7CisKKyAgICAvLyBJL08gaGFuZGxlcgorICAgIGNtc0lPSEFORExFUiogICAgICAgICAgICBJT2hhbmRsZXI7CisKKyAgICAvLyBUaGUgdGhyZWFkIElECisgICAgY21zQ29udGV4dCAgICAgICAgICAgICAgIENvbnRleHRJRDsKKworICAgIC8vIENyZWF0aW9uIHRpbWUKKyAgICBzdHJ1Y3QgdG0gICAgICAgICAgICAgICAgQ3JlYXRlZDsKKworICAgIC8vIE9ubHkgbW9zdCBpbXBvcnRhbnQgaXRlbXMgZm91bmQgaW4gSUNDIHByb2ZpbGVzCisgICAgY21zVUludDMyTnVtYmVyICAgICAgICAgIFZlcnNpb247CisgICAgY21zUHJvZmlsZUNsYXNzU2lnbmF0dXJlIERldmljZUNsYXNzOworICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgICBDb2xvclNwYWNlOworICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgICBQQ1M7CisgICAgY21zVUludDMyTnVtYmVyICAgICAgICAgIFJlbmRlcmluZ0ludGVudDsKKworICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgICBmbGFnczsKKyAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgICAgbWFudWZhY3R1cmVyLCBtb2RlbDsKKyAgICBjbXNVSW50NjROdW1iZXIgICAgICAgICAgYXR0cmlidXRlczsKKyAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgICAgY3JlYXRvcjsKKworICAgIGNtc1Byb2ZpbGVJRCAgICAgICAgICAgICBQcm9maWxlSUQ7CisKKyAgICAvLyBEaWN0aW9uYXJ5CisgICAgY21zVUludDMyTnVtYmVyICAgICAgICAgIFRhZ0NvdW50OworICAgIGNtc1RhZ1NpZ25hdHVyZSAgICAgICAgICBUYWdOYW1lc1tNQVhfVEFCTEVfVEFHXTsKKyAgICBjbXNUYWdTaWduYXR1cmUgICAgICAgICAgVGFnTGlua2VkW01BWF9UQUJMRV9UQUddOyAgICAgICAgICAgLy8gVGhlIHRhZyB0byB3aWNoIGlzIGxpbmtlZCAoMD1ub25lKQorICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgICBUYWdTaXplc1tNQVhfVEFCTEVfVEFHXTsgICAgICAgICAgICAvLyBTaXplIG9uIGRpc2sKKyAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgICAgVGFnT2Zmc2V0c1tNQVhfVEFCTEVfVEFHXTsKKyAgICBjbXNCb29sICAgICAgICAgICAgICAgICAgVGFnU2F2ZUFzUmF3W01BWF9UQUJMRV9UQUddOyAgICAgICAgLy8gVHJ1ZSB0byB3cml0ZSB1bmNvb2tlZAorICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgICBUYWdQdHJzW01BWF9UQUJMRV9UQUddOworICAgIGNtc1RhZ1R5cGVIYW5kbGVyKiAgICAgICBUYWdUeXBlSGFuZGxlcnNbTUFYX1RBQkxFX1RBR107ICAgICAvLyBTYW1lIHN0cnVjdHVyZSBtYXkgYmUgc2VyaWFsaXplZCBvbiBkaWZmZXJlbnQgdHlwZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVwZW5kaW5nIG9uIHByb2ZpbGUgdmVyc2lvbiwgc28gd2Uga2VlcCB0cmFjayBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSBoYW5kbGVyIGZvciBlYWNoIHRhZyBpbiB0aGUgbGlzdC4KKyAgICAvLyBTcGVjaWFsCisgICAgY21zQm9vbCAgICAgICAgICAgICAgICAgIElzV3JpdGU7CisKKyAgICAvLyBLZWVwIGEgbXV0ZXggZm9yIGNtc1JlYWRUYWcgLS0gTm90ZSB0aGF0IHRoaXMgb25seSB3b3JrcyBpZiB0aGUgdXNlciBpbmNsdWRlcyBhIG11dGV4IHBsdWdpbgorICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgICBVc3JNdXRleDsKKworfSBfY21zSUNDUFJPRklMRTsKKworLy8gSU8gaGVscGVycyBmb3IgcHJvZmlsZXMKK2Ntc0Jvb2wgICAgICAgICAgICAgIF9jbXNSZWFkSGVhZGVyKF9jbXNJQ0NQUk9GSUxFKiBJY2MpOworY21zQm9vbCAgICAgICAgICAgICAgX2Ntc1dyaXRlSGVhZGVyKF9jbXNJQ0NQUk9GSUxFKiBJY2MsIGNtc1VJbnQzMk51bWJlciBVc2VkU3BhY2UpOworaW50ICAgICAgICAgICAgICAgICAgX2Ntc1NlYXJjaFRhZyhfY21zSUNDUFJPRklMRSogSWNjLCBjbXNUYWdTaWduYXR1cmUgc2lnLCBjbXNCb29sIGxGb2xsb3dMaW5rcyk7CisKKy8vIFRhZyB0eXBlcworY21zVGFnVHlwZUhhbmRsZXIqICAgX2Ntc0dldFRhZ1R5cGVIYW5kbGVyKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNUYWdUeXBlU2lnbmF0dXJlIHNpZyk7CitjbXNUYWdUeXBlU2lnbmF0dXJlICBfY21zR2V0VGFnVHJ1ZVR5cGUoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1RhZ1NpZ25hdHVyZSBzaWcpOworY21zVGFnRGVzY3JpcHRvciogICAgX2Ntc0dldFRhZ0Rlc2NyaXB0b3IoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1RhZ1NpZ25hdHVyZSBzaWcpOworCisvLyBFcnJvciBsb2dnaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkICAgICAgICAgICAgICAgICBfY21zVGFnU2lnbmF0dXJlMlN0cmluZyhjaGFyIFN0cmluZ1s1XSwgY21zVGFnU2lnbmF0dXJlIHNpZyk7CisKKy8vIEludGVycG9sYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2Ntc0ludGVycFBhcmFtcyogICAgIF9jbXNDb21wdXRlSW50ZXJwUGFyYW1zKGNtc0NvbnRleHQgQ29udGV4dElELCBpbnQgblNhbXBsZXMsIGludCBJbnB1dENoYW4sIGludCBPdXRwdXRDaGFuLCBjb25zdCB2b2lkKiBUYWJsZSwgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOworY21zSW50ZXJwUGFyYW1zKiAgICAgX2Ntc0NvbXB1dGVJbnRlcnBQYXJhbXNFeChjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3QgY21zVUludDMyTnVtYmVyIG5TYW1wbGVzW10sIGludCBJbnB1dENoYW4sIGludCBPdXRwdXRDaGFuLCBjb25zdCB2b2lkKiBUYWJsZSwgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOwordm9pZCAgICAgICAgICAgICAgICAgX2Ntc0ZyZWVJbnRlcnBQYXJhbXMoY21zSW50ZXJwUGFyYW1zKiBwKTsKK2Ntc0Jvb2wgICAgICAgICAgICAgIF9jbXNTZXRJbnRlcnBvbGF0aW9uUm91dGluZShjbXNDb250ZXh0IENvbnRleHRJRCwgY21zSW50ZXJwUGFyYW1zKiBwKTsKKworLy8gQ3VydmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVGhpcyBzdHJ1Y3QgaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgYSBzZWdtZW50LCBwbHVzIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzIHRoZSBldmFsdWF0aW9uLgorLy8gSW4gdGhlIGNhc2Ugb2YgdGFibGUtYmFzZWQsIEV2YWwgcG9pbnRlciBpcyBzZXQgdG8gTlVMTAorCisvLyBUaGUgZ2FtbWEgZnVuY3Rpb24gbWFpbiBzdHJ1Y3R1cmUKK3N0cnVjdCBfY21zX2N1cnZlX3N0cnVjdCB7CisKKyAgICBjbXNJbnRlcnBQYXJhbXMqICBJbnRlcnBQYXJhbXM7ICAvLyBQcml2YXRlIG9wdGltaXphdGlvbnMgZm9yIGludGVycG9sYXRpb24KKworICAgIGNtc1VJbnQzMk51bWJlciAgIG5TZWdtZW50czsgICAgIC8vIE51bWJlciBvZiBzZWdtZW50cyBpbiB0aGUgY3VydmUuIFplcm8gZm9yIGEgMTYtYml0IGJhc2VkIHRhYmxlcworICAgIGNtc0N1cnZlU2VnbWVudCogIFNlZ21lbnRzOyAgICAgIC8vIFRoZSBzZWdtZW50cworICAgIGNtc0ludGVycFBhcmFtcyoqIFNlZ0ludGVycDsgICAgIC8vIEFycmF5IG9mIHByaXZhdGUgb3B0aW1pemF0aW9ucyBmb3IgaW50ZXJwb2xhdGlvbiBpbiB0YWJsZS1iYXNlZCBzZWdtZW50cworCisgICAgY21zUGFyYW1ldHJpY0N1cnZlRXZhbHVhdG9yKiBFdmFsczsgIC8vIEV2YWx1YXRvcnMgKG9uZSBwZXIgc2VnbWVudCkKKworICAgIC8vIDE2IGJpdCBUYWJsZS1iYXNlZCByZXByZXNlbnRhdGlvbiBmb2xsb3dzCisgICAgY21zVUludDMyTnVtYmVyICAgIG5FbnRyaWVzOyAgICAgIC8vIE51bWJlciBvZiB0YWJsZSBlbGVtZW50cworICAgIGNtc1VJbnQxNk51bWJlciogICBUYWJsZTE2OyAgICAgICAvLyBUaGUgdGFibGUgaXRzZWxmLgorfTsKKworCisvLyAgUGlwZWxpbmVzICYgU3RhZ2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBBIHNpbmdsZSBzdGFnZQorc3RydWN0IF9jbXNTdGFnZV9zdHJ1Y3QgeworCisgICAgY21zQ29udGV4dCAgICAgICAgICBDb250ZXh0SUQ7CisKKyAgICBjbXNTdGFnZVNpZ25hdHVyZSAgIFR5cGU7ICAgICAgICAgICAvLyBJZGVudGlmaWVzIHRoZSBzdGFnZQorICAgIGNtc1N0YWdlU2lnbmF0dXJlICAgSW1wbGVtZW50czsgICAgIC8vIElkZW50aWZpZXMgdGhlICpmdW5jdGlvbiogb2YgdGhlIHN0YWdlIChmb3Igb3B0aW1pemF0aW9ucykKKworICAgIGNtc1VJbnQzMk51bWJlciAgICAgSW5wdXRDaGFubmVsczsgIC8vIElucHV0IGNoYW5uZWxzIC0tIGZvciBvcHRpbWl6YXRpb24gcHVycG9zZXMKKyAgICBjbXNVSW50MzJOdW1iZXIgICAgIE91dHB1dENoYW5uZWxzOyAvLyBPdXRwdXQgY2hhbm5lbHMgLS0gZm9yIG9wdGltaXphdGlvbiBwdXJwb3NlcworCisgICAgX2Ntc1N0YWdlRXZhbEZuICAgICBFdmFsUHRyOyAgICAgICAgLy8gUG9pbnRzIHRvIGZuIHRoYXQgZXZhbHVhdGVzIHRoZSBzdGFnZSAoYWx3YXlzIGluIGZsb2F0aW5nIHBvaW50KQorICAgIF9jbXNTdGFnZUR1cEVsZW1GbiAgRHVwRWxlbVB0cjsgICAgIC8vIFBvaW50cyB0byBhIGZuIHRoYXQgZHVwbGljYXRlcyB0aGUgKmRhdGEqIG9mIHRoZSBzdGFnZQorICAgIF9jbXNTdGFnZUZyZWVFbGVtRm4gRnJlZVB0cjsgICAgICAgIC8vIFBvaW50cyB0byBhIGZuIHRoYXQgc2V0cyB0aGUgKmRhdGEqIG9mIHRoZSBzdGFnZSBmcmVlCisKKyAgICAvLyBBIGdlbmVyaWMgcG9pbnRlciB0byB3aGF0ZXZlciBtZW1vcnkgbmVlZGVkIGJ5IHRoZSBzdGFnZQorICAgIHZvaWQqICAgICAgICAgICAgICAgRGF0YTsKKworICAgIC8vIE1haW50YWlucyBsaW5rZWQgbGlzdCAodXNlZCBpbnRlcm5hbGx5KQorICAgIHN0cnVjdCBfY21zU3RhZ2Vfc3RydWN0KiBOZXh0OworfTsKKworCisvLyBTcGVjaWFsIFN0YWdlcyAoY2Fubm90IGJlIHNhdmVkKQorY21zU3RhZ2UqICAgICAgICBfY21zU3RhZ2VBbGxvY0xhYjJYWVooY21zQ29udGV4dCBDb250ZXh0SUQpOworY21zU3RhZ2UqICAgICAgICBfY21zU3RhZ2VBbGxvY1hZWjJMYWIoY21zQ29udGV4dCBDb250ZXh0SUQpOworY21zU3RhZ2UqICAgICAgICBfY21zU3RhZ2VBbGxvY0xhYlByZWxpbihjbXNDb250ZXh0IENvbnRleHRJRCk7CitjbXNTdGFnZSogICAgICAgIF9jbXNTdGFnZUFsbG9jTGFiVjJUb1Y0KGNtc0NvbnRleHQgQ29udGV4dElEKTsKK2Ntc1N0YWdlKiAgICAgICAgX2Ntc1N0YWdlQWxsb2NMYWJWMlRvVjRjdXJ2ZXMoY21zQ29udGV4dCBDb250ZXh0SUQpOworY21zU3RhZ2UqICAgICAgICBfY21zU3RhZ2VBbGxvY0xhYlY0VG9WMihjbXNDb250ZXh0IENvbnRleHRJRCk7CitjbXNTdGFnZSogICAgICAgIF9jbXNTdGFnZUFsbG9jTmFtZWRDb2xvcihjbXNOQU1FRENPTE9STElTVCogTmFtZWRDb2xvckxpc3QsIGNtc0Jvb2wgVXNlUENTKTsKK2Ntc1N0YWdlKiAgICAgICAgX2Ntc1N0YWdlQWxsb2NJZGVudGl0eUN1cnZlcyhjbXNDb250ZXh0IENvbnRleHRJRCwgaW50IG5DaGFubmVscyk7CitjbXNTdGFnZSogICAgICAgIF9jbXNTdGFnZUFsbG9jSWRlbnRpdHlDTHV0KGNtc0NvbnRleHQgQ29udGV4dElELCBpbnQgbkNoYW4pOworY21zU3RhZ2UqICAgICAgICBfY21zU3RhZ2VOb3JtYWxpemVGcm9tTGFiRmxvYXQoY21zQ29udGV4dCBDb250ZXh0SUQpOworY21zU3RhZ2UqICAgICAgICBfY21zU3RhZ2VOb3JtYWxpemVGcm9tWHl6RmxvYXQoY21zQ29udGV4dCBDb250ZXh0SUQpOworY21zU3RhZ2UqICAgICAgICBfY21zU3RhZ2VOb3JtYWxpemVUb0xhYkZsb2F0KGNtc0NvbnRleHQgQ29udGV4dElEKTsKK2Ntc1N0YWdlKiAgICAgICAgX2Ntc1N0YWdlTm9ybWFsaXplVG9YeXpGbG9hdChjbXNDb250ZXh0IENvbnRleHRJRCk7CisKKy8vIEZvciBjdXJ2ZSBzZXQgb25seQorY21zVG9uZUN1cnZlKiogICAgIF9jbXNTdGFnZUdldFB0clRvQ3VydmVTZXQoY29uc3QgY21zU3RhZ2UqIG1wZSk7CisKKworLy8gUGlwZWxpbmUgRXZhbHVhdG9yIChpbiBmbG9hdGluZyBwb2ludCkKK3R5cGVkZWYgdm9pZCAoKiBfY21zUGlwZWxpbmVFdmFsRmxvYXRGbikoY29uc3QgY21zRmxvYXQzMk51bWJlciBJbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIE91dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBEYXRhKTsKKworc3RydWN0IF9jbXNQaXBlbGluZV9zdHJ1Y3QgeworCisgICAgY21zU3RhZ2UqIEVsZW1lbnRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUG9pbnRzIHRvIGVsZW1lbnRzIGNoYWluCisgICAgY21zVUludDMyTnVtYmVyIElucHV0Q2hhbm5lbHMsIE91dHB1dENoYW5uZWxzOworCisgICAgLy8gRGF0YSAmIGV2YWx1YXRvcnMKKyAgICB2b2lkICpEYXRhOworCisgICBfY21zT1BUZXZhbDE2Rm4gICAgICAgICBFdmFsMTZGbjsKKyAgIF9jbXNQaXBlbGluZUV2YWxGbG9hdEZuIEV2YWxGbG9hdEZuOworICAgX2Ntc0ZyZWVVc2VyRGF0YUZuICAgICAgRnJlZURhdGFGbjsKKyAgIF9jbXNEdXBVc2VyRGF0YUZuICAgICAgIER1cERhdGFGbjsKKworICAgIGNtc0NvbnRleHQgQ29udGV4dElEOyAgICAgICAgICAgIC8vIEVudmlyb25tZW50CisKKyAgICBjbXNCb29sICBTYXZlQXM4Qml0czsgICAgICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbi1zcGVjaWZpYzogc2F2ZSBhcyA4IGJpdHMgaWYgcG9zc2libGUKK307CisKKy8vIExVVCByZWFkaW5nICYgY3JlYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBSZWFkIHRhZ3MgdXNpbmcgbG93LWxldmVsIGZ1bmN0aW9uLCBwcm92aWRlIG5lY2Vzc2FyeSBnbHVlIGNvZGUgdG8gYWRhcHQgdmVyc2lvbnMsIGV0Yy4gQWxsIHRob3NlIHJldHVybiBhIGJyYW5kIG5ldyBjb3B5CisvLyBvZiB0aGUgTFVUUywgc2luY2Ugb3duZXJzaGlwIG9mIG9yaWdpbmFsIGlzIHVwIHRvIHRoZSBwcm9maWxlLiBUaGUgdXNlciBzaG91bGQgZnJlZSBhbGxvY2F0ZWQgcmVzb3VyY2VzLgorCitjbXNQaXBlbGluZSogICAgICBfY21zUmVhZElucHV0TFVUKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBpbnQgSW50ZW50KTsKK2Ntc1BpcGVsaW5lKiAgICAgIF9jbXNSZWFkT3V0cHV0TFVUKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBpbnQgSW50ZW50KTsKK2Ntc1BpcGVsaW5lKiAgICAgIF9jbXNSZWFkRGV2aWNlbGlua0xVVChjbXNIUFJPRklMRSBoUHJvZmlsZSwgaW50IEludGVudCk7CisKKy8vIFNwZWNpYWwgdmFsdWVzCitjbXNCb29sICAgICAgICAgICBfY21zUmVhZE1lZGlhV2hpdGVQb2ludChjbXNDSUVYWVoqIERlc3QsIGNtc0hQUk9GSUxFIGhQcm9maWxlKTsKK2Ntc0Jvb2wgICAgICAgICAgIF9jbXNSZWFkQ0hBRChjbXNNQVQzKiBEZXN0LCBjbXNIUFJPRklMRSBoUHJvZmlsZSk7CisKKy8vIFByb2ZpbGUgbGlua2VyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2Ntc1BpcGVsaW5lKiBfY21zTGlua1Byb2ZpbGVzKGNtc0NvbnRleHQgICAgICAgICBDb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgICAgblByb2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgIFRoZUludGVudHNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFICAgICAgICBoUHJvZmlsZXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Jvb2wgICAgICAgICAgICBCUENbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgICBBZGFwdGF0aW9uU3RhdGVzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgICAgZHdGbGFncyk7CisKKy8vIFNlcXVlbmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2Ntc1NFUSogX2Ntc1JlYWRQcm9maWxlU2VxdWVuY2UoY21zSFBST0ZJTEUgaFByb2ZpbGUpOworY21zQm9vbCBfY21zV3JpdGVQcm9maWxlU2VxdWVuY2UoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNvbnN0IGNtc1NFUSogc2VxKTsKK2Ntc1NFUSogX2Ntc0NvbXBpbGVQcm9maWxlU2VxdWVuY2UoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBuUHJvZmlsZXMsIGNtc0hQUk9GSUxFIGhQcm9maWxlc1tdKTsKKworCisvLyBMVVQgb3B0aW1pemF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbXNVSW50MTZOdW1iZXIgIF9jbXNRdWFudGl6ZVZhbChjbXNGbG9hdDY0TnVtYmVyIGksIGludCBNYXhTYW1wbGVzKTsKK2ludCAgICAgICAgICAgICAgX2Ntc1JlYXNvbmFibGVHcmlkcG9pbnRzQnlDb2xvcnNwYWNlKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgQ29sb3JzcGFjZSwgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOworCitjbXNCb29sICAgICAgICAgIF9jbXNFbmRQb2ludHNCeVNwYWNlKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQxNk51bWJlciAqKldoaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MTZOdW1iZXIgKipCbGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICpuT3V0cHV0cyk7CisKK2Ntc0Jvb2wgICAgICAgICAgX2Ntc09wdGltaXplUGlwZWxpbmUoY21zQ29udGV4dCBDb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1BpcGVsaW5lKiogICAgTHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIEludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyKiBJbnB1dEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyKiBPdXRwdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciogZHdGbGFncyApOworCisKKy8vIEhpIGxldmVsIExVVCBidWlsZGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2Ntc1BpcGVsaW5lKiAgICAgX2Ntc0NyZWF0ZUdhbXV0Q2hlY2tQaXBlbGluZShjbXNDb250ZXh0IENvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSBoUHJvZmlsZXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNCb29sICBCUENbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW50ZW50c1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgQWRhcHRhdGlvblN0YXRlc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBuR2FtdXRQQ1Nwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSBoR2FtdXQpOworCisKKy8vIEZvcm1hdHRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgY21zRkxBR1NfQ0FOX0NIQU5HRV9GT1JNQVRURVIgICAgIDB4MDIwMDAwMDAgICAvLyBBbGxvdyBjaGFuZ2UgYnVmZmVyIGZvcm1hdAorCitjbXNCb29sICAgICAgICAgX2Ntc0Zvcm1hdHRlcklzRmxvYXQoY21zVUludDMyTnVtYmVyIFR5cGUpOworY21zQm9vbCAgICAgICAgIF9jbXNGb3JtYXR0ZXJJczhiaXQoY21zVUludDMyTnVtYmVyIFR5cGUpOworCitjbXNGb3JtYXR0ZXIgICAgX2Ntc0dldEZvcm1hdHRlcihjbXNDb250ZXh0IENvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBUeXBlLCAgICAgICAgICAvLyBTcGVjaWZpYyB0eXBlLCBpLmUuIFRZUEVfUkdCXzgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zvcm1hdHRlckRpcmVjdGlvbiBEaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncyk7CisKKworI2lmbmRlZiBDTVNfTk9fSEFMRl9TVVBQT1JUIAorCisvLyBIYWxmIGZsb2F0CitjbXNGbG9hdDMyTnVtYmVyIF9jbXNIYWxmMkZsb2F0KGNtc1VJbnQxNk51bWJlciBoKTsKK2Ntc1VJbnQxNk51bWJlciAgX2Ntc0Zsb2F0MkhhbGYoY21zRmxvYXQzMk51bWJlciBmbHQpOworCisjZW5kaWYKKworLy8gVHJhbnNmb3JtIGxvZ2ljIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdHJ1Y3QgX2Ntc3RyYW5zZm9ybV9zdHJ1Y3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKworICAgIC8vIDEtcGl4ZWwgY2FjaGUgKDE2IGJpdHMgb25seSkKKyAgICBjbXNVSW50MTZOdW1iZXIgQ2FjaGVJbltjbXNNQVhDSEFOTkVMU107CisgICAgY21zVUludDE2TnVtYmVyIENhY2hlT3V0W2Ntc01BWENIQU5ORUxTXTsKKworfSBfY21zQ0FDSEU7CisKKworCisvLyBUcmFuc2Zvcm1hdGlvbgordHlwZWRlZiBzdHJ1Y3QgX2Ntc3RyYW5zZm9ybV9zdHJ1Y3QgeworCisgICAgY21zVUludDMyTnVtYmVyIElucHV0Rm9ybWF0LCBPdXRwdXRGb3JtYXQ7IC8vIEtlZXAgZm9ybWF0cyBmb3IgZnVydGhlciByZWZlcmVuY2UKKworICAgIC8vIFBvaW50cyB0byB0cmFuc2Zvcm0gY29kZQorICAgIF9jbXNUcmFuc2Zvcm1GbiB4Zm9ybTsKKworICAgIC8vIEZvcm1hdHRlcnMsIGNhbm5vdCBiZSBlbWJlZGRlZCBpbnRvIExVVCBiZWNhdXNlIGNhY2hlCisgICAgY21zRm9ybWF0dGVyMTYgRnJvbUlucHV0OworICAgIGNtc0Zvcm1hdHRlcjE2IFRvT3V0cHV0OworCisgICAgY21zRm9ybWF0dGVyRmxvYXQgRnJvbUlucHV0RmxvYXQ7CisgICAgY21zRm9ybWF0dGVyRmxvYXQgVG9PdXRwdXRGbG9hdDsKKworICAgIC8vIDEtcGl4ZWwgY2FjaGUgc2VlZCBmb3IgemVybyBhcyBpbnB1dCAoMTYgYml0cywgcmVhZCBvbmx5KQorICAgIF9jbXNDQUNIRSBDYWNoZTsKKworICAgIC8vIEEgUGlwZWxpbmUgaG9sZGluZyB0aGUgZnVsbCAob3B0aW1pemVkKSB0cmFuc2Zvcm0KKyAgICBjbXNQaXBlbGluZSogTHV0OworCisgICAgLy8gQSBQaXBlbGluZSBob2xkaW5nIHRoZSBnYW11dCBjaGVjay4gSXQgZ29lcyBmcm9tIHRoZSBpbnB1dCBzcGFjZSB0byBiaWxldmVsCisgICAgY21zUGlwZWxpbmUqIEdhbXV0Q2hlY2s7CisKKyAgICAvLyBDb2xvcmFudCB0YWJsZXMKKyAgICBjbXNOQU1FRENPTE9STElTVCogSW5wdXRDb2xvcmFudDsgICAgICAgLy8gSW5wdXQgQ29sb3JhbnQgdGFibGUKKyAgICBjbXNOQU1FRENPTE9STElTVCogT3V0cHV0Q29sb3JhbnQ7ICAgICAgLy8gQ29sb3JhbnQgdGFibGUgKGZvciBuIGNoYW5zID4gQ01ZSykKKworICAgIC8vIEluZm9ybWF0aW9uYWwgb25seQorICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgRW50cnlDb2xvclNwYWNlOworICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgRXhpdENvbG9yU3BhY2U7CisKKyAgICAvLyBXaGl0ZSBwb2ludHMgKGluZm9ybWF0aXZlIG9ubHkpCisgICAgY21zQ0lFWFlaIEVudHJ5V2hpdGVQb2ludDsKKyAgICBjbXNDSUVYWVogRXhpdFdoaXRlUG9pbnQ7CisKKyAgICAvLyBQcm9maWxlcyB1c2VkIHRvIGNyZWF0ZSB0aGUgdHJhbnNmb3JtCisgICAgY21zU0VRKiBTZXF1ZW5jZTsKKworICAgIGNtc1VJbnQzMk51bWJlciAgZHdPcmlnaW5hbEZsYWdzOworICAgIGNtc0Zsb2F0NjROdW1iZXIgQWRhcHRhdGlvblN0YXRlOworCisgICAgLy8gVGhlIGludGVudCBvZiB0aGlzIHRyYW5zZm9ybS4gVGhhdCBpcyB1c3VhbGx5IHRoZSBsYXN0IGludGVudCBpbiB0aGUgcHJvZmlsZWNoYWluLCBidXQgbWF5IGRpZmZlcgorICAgIGNtc1VJbnQzMk51bWJlciBSZW5kZXJpbmdJbnRlbnQ7CisKKyAgICAvLyBBbiBpZCB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHJ1bm5pbmcgY29udGV4dC4gTWF5IGJlIG51bGwuCisgICAgY21zQ29udGV4dCBDb250ZXh0SUQ7CisKKyAgICAvLyBBIHVzZXItZGVmaW5lZCBwb2ludGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgZGF0YSBmb3IgdHJhbnNmb3JtIHBsdWctaW5zCisgICAgdm9pZCogVXNlckRhdGE7CisgICAgX2Ntc0ZyZWVVc2VyRGF0YUZuIEZyZWVVc2VyRGF0YTsKKworfSBfY21zVFJBTlNGT1JNOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbXNIVFJBTlNGT1JNIF9jbXNDaGFpbjJMYWIoY21zQ29udGV4dCAgICAgICAgICAgICBDb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgICAgICBuUHJvZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgICAgICBJbnB1dEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgIE91dHB1dEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNVSW50MzJOdW1iZXIgIEludGVudHNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNIUFJPRklMRSAgICAgIGhQcm9maWxlc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0Jvb2wgICAgICAgICAgQlBDW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zRmxvYXQ2NE51bWJlciBBZGFwdGF0aW9uU3RhdGVzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgICAgICBkd0ZsYWdzKTsKKworCitjbXNUb25lQ3VydmUqIF9jbXNCdWlsZEtUb25lQ3VydmUoY21zQ29udGV4dCAgICAgICBDb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgICAgICBuUG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgblByb2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc1VJbnQzMk51bWJlciAgSW50ZW50c1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0hQUk9GSUxFICAgICAgaFByb2ZpbGVzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zQm9vbCAgICAgICAgICBCUENbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNGbG9hdDY0TnVtYmVyIEFkYXB0YXRpb25TdGF0ZXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgIGR3RmxhZ3MpOworCitjbXNCb29sICAgX2Ntc0FkYXB0YXRpb25NYXRyaXgoY21zTUFUMyogciwgY29uc3QgY21zTUFUMyogQ29uZU1hdHJpeCwgY29uc3QgY21zQ0lFWFlaKiBGcm9tSWxsLCBjb25zdCBjbXNDSUVYWVoqIFRvSWxsKTsKKworY21zQm9vbCAgIF9jbXNCdWlsZFJHQjJYWVp0cmFuc2Zlck1hdHJpeChjbXNNQVQzKiByLCBjb25zdCBjbXNDSUV4eVkqIFdoaXRlUG9pbnQsIGNvbnN0IGNtc0NJRXh5WVRSSVBMRSogUHJpbWFyaWVzKTsKKworCisjZGVmaW5lIF9sY21zX2ludGVybmFsX0gKKyNlbmRpZgorLy88PDwrKytPUEVOU09VUkNFX01VU1RfRU5ECmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvY2RlcnJvci5oIGIvdGhpcmRfcGFydHkvbGlianBlZy9jZGVycm9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9jZGVycm9yLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmpwZWcvY2RlcnJvci5oCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvY2RqcGVnLmggYi90aGlyZF9wYXJ0eS9saWJqcGVnL2NkanBlZy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvY2RqcGVnLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmpwZWcvY2RqcGVnLmgKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY2FwaW1pbi5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjYXBpbWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRmYjhjNQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY2FwaW1pbi5jCkBAIC0wLDAgKzEsMjgwIEBACisvKgorICogamNhcGltaW4uYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGFwcGxpY2F0aW9uIGludGVyZmFjZSBjb2RlIGZvciB0aGUgY29tcHJlc3Npb24gaGFsZgorICogb2YgdGhlIEpQRUcgbGlicmFyeS4gIFRoZXNlIGFyZSB0aGUgIm1pbmltdW0iIEFQSSByb3V0aW5lcyB0aGF0IG1heSBiZQorICogbmVlZGVkIGluIGVpdGhlciB0aGUgbm9ybWFsIGZ1bGwtY29tcHJlc3Npb24gY2FzZSBvciB0aGUgdHJhbnNjb2Rpbmctb25seQorICogY2FzZS4KKyAqCisgKiBNb3N0IG9mIHRoZSByb3V0aW5lcyBpbnRlbmRlZCB0byBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgYW4gYXBwbGljYXRpb24KKyAqIGFyZSBpbiB0aGlzIGZpbGUgb3IgaW4gamNhcGlzdGQuYy4gIEJ1dCBhbHNvIHNlZSBqY3BhcmFtLmMgZm9yCisgKiBwYXJhbWV0ZXItc2V0dXAgaGVscGVyIHJvdXRpbmVzLCBqY29tYXBpLmMgZm9yIHJvdXRpbmVzIHNoYXJlZCBieQorICogY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24sIGFuZCBqY3RyYW5zLmMgZm9yIHRoZSB0cmFuc2NvZGluZyBjYXNlLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKgorICogSW5pdGlhbGl6YXRpb24gb2YgYSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdC4KKyAqIFRoZSBlcnJvciBtYW5hZ2VyIG11c3QgYWxyZWFkeSBiZSBzZXQgdXAgKGluIGNhc2UgbWVtb3J5IG1hbmFnZXIgZmFpbHMpLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19DcmVhdGVDb21wcmVzcyAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB2ZXJzaW9uLCBzaXplX3Qgc3RydWN0c2l6ZSkKK3sKKyAgaW50IGk7CisKKyAgLyogR3VhcmQgYWdhaW5zdCB2ZXJzaW9uIG1pc21hdGNoZXMgYmV0d2VlbiBsaWJyYXJ5IGFuZCBjYWxsZXIuICovCisgIGNpbmZvLT5tZW0gPSBOVUxMOwkJLyogc28ganBlZ19kZXN0cm95IGtub3dzIG1lbSBtZ3Igbm90IGNhbGxlZCAqLworICBpZiAodmVyc2lvbiAhPSBKUEVHX0xJQl9WRVJTSU9OKQorICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0JBRF9MSUJfVkVSU0lPTiwgSlBFR19MSUJfVkVSU0lPTiwgdmVyc2lvbik7CisgIGlmIChzdHJ1Y3RzaXplICE9IFNJWkVPRihzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QpKQorICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0JBRF9TVFJVQ1RfU0laRSwgCisJICAgICAoaW50KSBTSVpFT0Yoc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0KSwgKGludCkgc3RydWN0c2l6ZSk7CisKKyAgLyogRm9yIGRlYnVnZ2luZyBwdXJwb3Nlcywgd2UgemVybyB0aGUgd2hvbGUgbWFzdGVyIHN0cnVjdHVyZS4KKyAgICogQnV0IHRoZSBhcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBzZXQgdGhlIGVyciBwb2ludGVyLCBhbmQgbWF5IGhhdmUgc2V0CisgICAqIGNsaWVudF9kYXRhLCBzbyB3ZSBoYXZlIHRvIHNhdmUgYW5kIHJlc3RvcmUgdGhvc2UgZmllbGRzLgorICAgKiBOb3RlOiBpZiBhcHBsaWNhdGlvbiBoYXNuJ3Qgc2V0IGNsaWVudF9kYXRhLCB0b29scyBsaWtlIFB1cmlmeSBtYXkKKyAgICogY29tcGxhaW4gaGVyZS4KKyAgICovCisgIHsKKyAgICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKiBlcnIgPSBjaW5mby0+ZXJyOworICAgIHZvaWQgKiBjbGllbnRfZGF0YSA9IGNpbmZvLT5jbGllbnRfZGF0YTsgLyogaWdub3JlIFB1cmlmeSBjb21wbGFpbnQgaGVyZSAqLworICAgIE1FTVpFUk8oY2luZm8sIFNJWkVPRihzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QpKTsKKyAgICBjaW5mby0+ZXJyID0gZXJyOworICAgIGNpbmZvLT5jbGllbnRfZGF0YSA9IGNsaWVudF9kYXRhOworICB9CisgIGNpbmZvLT5pc19kZWNvbXByZXNzb3IgPSBGQUxTRTsKKworICAvKiBJbml0aWFsaXplIGEgbWVtb3J5IG1hbmFnZXIgaW5zdGFuY2UgZm9yIHRoaXMgb2JqZWN0ICovCisgIGppbml0X21lbW9yeV9tZ3IoKGpfY29tbW9uX3B0cikgY2luZm8pOworCisgIC8qIFplcm8gb3V0IHBvaW50ZXJzIHRvIHBlcm1hbmVudCBzdHJ1Y3R1cmVzLiAqLworICBjaW5mby0+cHJvZ3Jlc3MgPSBOVUxMOworICBjaW5mby0+ZGVzdCA9IE5VTEw7CisKKyAgY2luZm8tPmNvbXBfaW5mbyA9IE5VTEw7CisKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9RVUFOVF9UQkxTOyBpKyspCisgICAgY2luZm8tPnF1YW50X3RibF9wdHJzW2ldID0gTlVMTDsKKworICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7CisgICAgY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbaV0gPSBOVUxMOworICAgIGNpbmZvLT5hY19odWZmX3RibF9wdHJzW2ldID0gTlVMTDsKKyAgfQorCisgIGNpbmZvLT5zY3JpcHRfc3BhY2UgPSBOVUxMOworCisgIGNpbmZvLT5pbnB1dF9nYW1tYSA9IDEuMDsJLyogaW4gY2FzZSBhcHBsaWNhdGlvbiBmb3JnZXRzICovCisKKyAgLyogT0ssIEknbSByZWFkeSAqLworICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gQ1NUQVRFX1NUQVJUOworfQorCisKKy8qCisgKiBEZXN0cnVjdGlvbiBvZiBhIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0CisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2Rlc3Ryb3lfY29tcHJlc3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBqcGVnX2Rlc3Ryb3koKGpfY29tbW9uX3B0cikgY2luZm8pOyAvKiB1c2UgY29tbW9uIHJvdXRpbmUgKi8KK30KKworCisvKgorICogQWJvcnQgcHJvY2Vzc2luZyBvZiBhIEpQRUcgY29tcHJlc3Npb24gb3BlcmF0aW9uLAorICogYnV0IGRvbid0IGRlc3Ryb3kgdGhlIG9iamVjdCBpdHNlbGYuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2Fib3J0X2NvbXByZXNzIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAganBlZ19hYm9ydCgoal9jb21tb25fcHRyKSBjaW5mbyk7IC8qIHVzZSBjb21tb24gcm91dGluZSAqLworfQorCisKKy8qCisgKiBGb3JjaWJseSBzdXBwcmVzcyBvciB1bi1zdXBwcmVzcyBhbGwgcXVhbnRpemF0aW9uIGFuZCBIdWZmbWFuIHRhYmxlcy4KKyAqIE1hcmtzIGFsbCBjdXJyZW50bHkgZGVmaW5lZCB0YWJsZXMgYXMgYWxyZWFkeSB3cml0dGVuIChpZiBzdXBwcmVzcykKKyAqIG9yIG5vdCB3cml0dGVuIChpZiAhc3VwcHJlc3MpLiAgVGhpcyB3aWxsIGNvbnRyb2wgd2hldGhlciB0aGV5IGdldCBlbWl0dGVkCisgKiBieSBhIHN1YnNlcXVlbnQganBlZ19zdGFydF9jb21wcmVzcyBjYWxsLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBleHBvcnRlZCBmb3IgdXNlIGJ5IGFwcGxpY2F0aW9ucyB0aGF0IHdhbnQgdG8gcHJvZHVjZQorICogYWJicmV2aWF0ZWQgSlBFRyBkYXRhc3RyZWFtcy4gIEl0IGxvZ2ljYWxseSBiZWxvbmdzIGluIGpjcGFyYW0uYywgYnV0CisgKiBzaW5jZSBpdCBpcyBjYWxsZWQgYnkganBlZ19zdGFydF9jb21wcmVzcywgd2UgcHV0IGl0IGhlcmUgLS0tIG90aGVyd2lzZQorICogamNwYXJhbS5vIHdvdWxkIGJlIGxpbmtlZCB3aGV0aGVyIHRoZSBhcHBsaWNhdGlvbiB1c2VkIGl0IG9yIG5vdC4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfc3VwcHJlc3NfdGFibGVzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBzdXBwcmVzcykKK3sKKyAgaW50IGk7CisgIEpRVUFOVF9UQkwgKiBxdGJsOworICBKSFVGRl9UQkwgKiBodGJsOworCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fUVVBTlRfVEJMUzsgaSsrKSB7CisgICAgaWYgKChxdGJsID0gY2luZm8tPnF1YW50X3RibF9wdHJzW2ldKSAhPSBOVUxMKQorICAgICAgcXRibC0+c2VudF90YWJsZSA9IHN1cHByZXNzOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgeworICAgIGlmICgoaHRibCA9IGNpbmZvLT5kY19odWZmX3RibF9wdHJzW2ldKSAhPSBOVUxMKQorICAgICAgaHRibC0+c2VudF90YWJsZSA9IHN1cHByZXNzOworICAgIGlmICgoaHRibCA9IGNpbmZvLT5hY19odWZmX3RibF9wdHJzW2ldKSAhPSBOVUxMKQorICAgICAgaHRibC0+c2VudF90YWJsZSA9IHN1cHByZXNzOworICB9Cit9CisKKworLyoKKyAqIEZpbmlzaCBKUEVHIGNvbXByZXNzaW9uLgorICoKKyAqIElmIGEgbXVsdGlwYXNzIG9wZXJhdGluZyBtb2RlIHdhcyBzZWxlY3RlZCwgdGhpcyBtYXkgZG8gYSBncmVhdCBkZWFsIG9mCisgKiB3b3JrIGluY2x1ZGluZyBtb3N0IG9mIHRoZSBhY3R1YWwgb3V0cHV0LgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19maW5pc2hfY29tcHJlc3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBKRElNRU5TSU9OIGlNQ1Vfcm93OworCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IENTVEFURV9TQ0FOTklORyB8fAorICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBDU1RBVEVfUkFXX09LKSB7CisgICAgLyogVGVybWluYXRlIGZpcnN0IHBhc3MgKi8KKyAgICBpZiAoY2luZm8tPm5leHRfc2NhbmxpbmUgPCBjaW5mby0+aW1hZ2VfaGVpZ2h0KQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9UT09fTElUVExFX0RBVEEpOworICAgICgqY2luZm8tPm1hc3Rlci0+ZmluaXNoX3Bhc3MpIChjaW5mbyk7CisgIH0gZWxzZSBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfV1JDT0VGUykKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICAvKiBQZXJmb3JtIGFueSByZW1haW5pbmcgcGFzc2VzICovCisgIHdoaWxlICghIGNpbmZvLT5tYXN0ZXItPmlzX2xhc3RfcGFzcykgeworICAgICgqY2luZm8tPm1hc3Rlci0+cHJlcGFyZV9mb3JfcGFzcykgKGNpbmZvKTsKKyAgICBmb3IgKGlNQ1Vfcm93ID0gMDsgaU1DVV9yb3cgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzOyBpTUNVX3JvdysrKSB7CisgICAgICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpIHsKKwljaW5mby0+cHJvZ3Jlc3MtPnBhc3NfY291bnRlciA9IChsb25nKSBpTUNVX3JvdzsKKwljaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPnRvdGFsX2lNQ1Vfcm93czsKKwkoKmNpbmZvLT5wcm9ncmVzcy0+cHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgICAgIH0KKyAgICAgIC8qIFdlIGJ5cGFzcyB0aGUgbWFpbiBjb250cm9sbGVyIGFuZCBpbnZva2UgY29lZiBjb250cm9sbGVyIGRpcmVjdGx5OworICAgICAgICogYWxsIHdvcmsgaXMgYmVpbmcgZG9uZSBmcm9tIHRoZSBjb2VmZmljaWVudCBidWZmZXIuCisgICAgICAgKi8KKyAgICAgIGlmICghICgqY2luZm8tPmNvZWYtPmNvbXByZXNzX2RhdGEpIChjaW5mbywgKEpTQU1QSU1BR0UpIE5VTEwpKQorCUVSUkVYSVQoY2luZm8sIEpFUlJfQ0FOVF9TVVNQRU5EKTsKKyAgICB9CisgICAgKCpjaW5mby0+bWFzdGVyLT5maW5pc2hfcGFzcykgKGNpbmZvKTsKKyAgfQorICAvKiBXcml0ZSBFT0ksIGRvIGZpbmFsIGNsZWFudXAgKi8KKyAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9maWxlX3RyYWlsZXIpIChjaW5mbyk7CisgICgqY2luZm8tPmRlc3QtPnRlcm1fZGVzdGluYXRpb24pIChjaW5mbyk7CisgIC8qIFdlIGNhbiB1c2UganBlZ19hYm9ydCB0byByZWxlYXNlIG1lbW9yeSBhbmQgcmVzZXQgZ2xvYmFsX3N0YXRlICovCisgIGpwZWdfYWJvcnQoKGpfY29tbW9uX3B0cikgY2luZm8pOworfQorCisKKy8qCisgKiBXcml0ZSBhIHNwZWNpYWwgbWFya2VyLgorICogVGhpcyBpcyBvbmx5IHJlY29tbWVuZGVkIGZvciB3cml0aW5nIENPTSBvciBBUFBuIG1hcmtlcnMuCisgKiBNdXN0IGJlIGNhbGxlZCBhZnRlciBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgYW5kIGJlZm9yZQorICogZmlyc3QgY2FsbCB0byBqcGVnX3dyaXRlX3NjYW5saW5lcygpIG9yIGpwZWdfd3JpdGVfcmF3X2RhdGEoKS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfd3JpdGVfbWFya2VyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlciwKKwkJICAgY29uc3QgSk9DVEVUICpkYXRhcHRyLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKK3sKKyAgSk1FVEhPRCh2b2lkLCB3cml0ZV9tYXJrZXJfYnl0ZSwgKGpfY29tcHJlc3NfcHRyIGluZm8sIGludCB2YWwpKTsKKworICBpZiAoY2luZm8tPm5leHRfc2NhbmxpbmUgIT0gMCB8fAorICAgICAgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NDQU5OSU5HICYmCisgICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfUkFXX09LICYmCisgICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfV1JDT0VGUykpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKworICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX21hcmtlcl9oZWFkZXIpIChjaW5mbywgbWFya2VyLCBkYXRhbGVuKTsKKyAgd3JpdGVfbWFya2VyX2J5dGUgPSBjaW5mby0+bWFya2VyLT53cml0ZV9tYXJrZXJfYnl0ZTsJLyogY29weSBmb3Igc3BlZWQgKi8KKyAgd2hpbGUgKGRhdGFsZW4tLSkgeworICAgICgqd3JpdGVfbWFya2VyX2J5dGUpIChjaW5mbywgKmRhdGFwdHIpOworICAgIGRhdGFwdHIrKzsKKyAgfQorfQorCisvKiBTYW1lLCBidXQgcGllY2VtZWFsLiAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfd3JpdGVfbV9oZWFkZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKK3sKKyAgaWYgKGNpbmZvLT5uZXh0X3NjYW5saW5lICE9IDAgfHwKKyAgICAgIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TQ0FOTklORyAmJgorICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1JBV19PSyAmJgorICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1dSQ09FRlMpKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisKKyAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9tYXJrZXJfaGVhZGVyKSAoY2luZm8sIG1hcmtlciwgZGF0YWxlbik7Cit9CisKK0dMT0JBTCh2b2lkKQoranBlZ193cml0ZV9tX2J5dGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgdmFsKQoreworICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX21hcmtlcl9ieXRlKSAoY2luZm8sIHZhbCk7Cit9CisKKworLyoKKyAqIEFsdGVybmF0ZSBjb21wcmVzc2lvbiBmdW5jdGlvbjoganVzdCB3cml0ZSBhbiBhYmJyZXZpYXRlZCB0YWJsZSBmaWxlLgorICogQmVmb3JlIGNhbGxpbmcgdGhpcywgYWxsIHBhcmFtZXRlcnMgYW5kIGEgZGF0YSBkZXN0aW5hdGlvbiBtdXN0IGJlIHNldCB1cC4KKyAqCisgKiBUbyBwcm9kdWNlIGEgcGFpciBvZiBmaWxlcyBjb250YWluaW5nIGFiYnJldmlhdGVkIHRhYmxlcyBhbmQgYWJicmV2aWF0ZWQKKyAqIGltYWdlIGRhdGEsIG9uZSB3b3VsZCBwcm9jZWVkIGFzIGZvbGxvd3M6CisgKgorICoJCWluaXRpYWxpemUgSlBFRyBvYmplY3QKKyAqCQlzZXQgSlBFRyBwYXJhbWV0ZXJzCisgKgkJc2V0IGRlc3RpbmF0aW9uIHRvIHRhYmxlIGZpbGUKKyAqCQlqcGVnX3dyaXRlX3RhYmxlcyhjaW5mbyk7CisgKgkJc2V0IGRlc3RpbmF0aW9uIHRvIGltYWdlIGZpbGUKKyAqCQlqcGVnX3N0YXJ0X2NvbXByZXNzKGNpbmZvLCBGQUxTRSk7CisgKgkJd3JpdGUgZGF0YS4uLgorICoJCWpwZWdfZmluaXNoX2NvbXByZXNzKGNpbmZvKTsKKyAqCisgKiBqcGVnX3dyaXRlX3RhYmxlcyBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIG1hcmtpbmcgYWxsIHRhYmxlcyB3cml0dGVuCisgKiAoc2FtZSBhcyBqcGVnX3N1cHByZXNzX3RhYmxlcyguLi4sIFRSVUUpKS4gIFRodXMgYSBzdWJzZXF1ZW50IHN0YXJ0X2NvbXByZXNzCisgKiB3aWxsIG5vdCByZS1lbWl0IHRoZSB0YWJsZXMgdW5sZXNzIGl0IGlzIHBhc3NlZCB3cml0ZV9hbGxfdGFibGVzPVRSVUUuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3dyaXRlX3RhYmxlcyAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TVEFSVCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworCisgIC8qIChSZSlpbml0aWFsaXplIGVycm9yIG1nciBhbmQgZGVzdGluYXRpb24gbW9kdWxlcyAqLworICAoKmNpbmZvLT5lcnItPnJlc2V0X2Vycm9yX21ncikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgKCpjaW5mby0+ZGVzdC0+aW5pdF9kZXN0aW5hdGlvbikgKGNpbmZvKTsKKyAgLyogSW5pdGlhbGl6ZSB0aGUgbWFya2VyIHdyaXRlciAuLi4gYml0IG9mIGEgY3JvY2sgdG8gZG8gaXQgaGVyZS4gKi8KKyAgamluaXRfbWFya2VyX3dyaXRlcihjaW5mbyk7CisgIC8qIFdyaXRlIHRoZW0gdGFibGVzISAqLworICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX3RhYmxlc19vbmx5KSAoY2luZm8pOworICAvKiBBbmQgY2xlYW4gdXAuICovCisgICgqY2luZm8tPmRlc3QtPnRlcm1fZGVzdGluYXRpb24pIChjaW5mbyk7CisgIC8qCisgICAqIEluIGxpYnJhcnkgcmVsZWFzZXMgdXAgdGhyb3VnaCB2NmEsIHdlIGNhbGxlZCBqcGVnX2Fib3J0KCkgaGVyZSB0byBmcmVlCisgICAqIGFueSB3b3JraW5nIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhlIGRlc3RpbmF0aW9uIG1hbmFnZXIgYW5kIG1hcmtlcgorICAgKiB3cml0ZXIuICBTb21lIGFwcGxpY2F0aW9ucyBoYWQgYSBwcm9ibGVtIHdpdGggdGhhdDogdGhleSBhbGxvY2F0ZWQgc3BhY2UKKyAgICogb2YgdGhlaXIgb3duIGZyb20gdGhlIGxpYnJhcnkgbWVtb3J5IG1hbmFnZXIsIGFuZCBkaWRuJ3Qgd2FudCBpdCB0byBnbworICAgKiBhd2F5IGR1cmluZyB3cml0ZV90YWJsZXMuICBTbyBub3cgd2UgZG8gbm90aGluZy4gIFRoaXMgd2lsbCBjYXVzZSBhCisgICAqIG1lbW9yeSBsZWFrIGlmIGFuIGFwcCBjYWxscyB3cml0ZV90YWJsZXMgcmVwZWF0ZWRseSB3aXRob3V0IGRvaW5nIGEgZnVsbAorICAgKiBjb21wcmVzc2lvbiBjeWNsZSBvciBvdGhlcndpc2UgcmVzZXR0aW5nIHRoZSBKUEVHIG9iamVjdC4gIEhvd2V2ZXIsIHRoYXQKKyAgICogc2VlbXMgbGVzcyBiYWQgdGhhbiB1bmV4cGVjdGVkbHkgZnJlZWluZyBtZW1vcnkgaW4gdGhlIG5vcm1hbCBjYXNlLgorICAgKiBBbiBhcHAgdGhhdCBwcmVmZXJzIHRoZSBvbGQgYmVoYXZpb3IgY2FuIGNhbGwganBlZ19hYm9ydCBmb3IgaXRzZWxmIGFmdGVyCisgICAqIGVhY2ggY2FsbCB0byBqcGVnX3dyaXRlX3RhYmxlcygpLgorICAgKi8KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY2FwaXN0ZC5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjYXBpc3RkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAzMjBiMQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY2FwaXN0ZC5jCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogamNhcGlzdGQuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGFwcGxpY2F0aW9uIGludGVyZmFjZSBjb2RlIGZvciB0aGUgY29tcHJlc3Npb24gaGFsZgorICogb2YgdGhlIEpQRUcgbGlicmFyeS4gIFRoZXNlIGFyZSB0aGUgInN0YW5kYXJkIiBBUEkgcm91dGluZXMgdGhhdCBhcmUKKyAqIHVzZWQgaW4gdGhlIG5vcm1hbCBmdWxsLWNvbXByZXNzaW9uIGNhc2UuICBUaGV5IGFyZSBub3QgdXNlZCBieSBhCisgKiB0cmFuc2NvZGluZy1vbmx5IGFwcGxpY2F0aW9uLiAgTm90ZSB0aGF0IGlmIGFuIGFwcGxpY2F0aW9uIGxpbmtzIGluCisgKiBqcGVnX3N0YXJ0X2NvbXByZXNzLCBpdCB3aWxsIGVuZCB1cCBsaW5raW5nIGluIHRoZSBlbnRpcmUgY29tcHJlc3Nvci4KKyAqIFdlIHRodXMgbXVzdCBzZXBhcmF0ZSB0aGlzIGZpbGUgZnJvbSBqY2FwaW1pbi5jIHRvIGF2b2lkIGxpbmtpbmcgdGhlCisgKiB3aG9sZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGludG8gYSB0cmFuc2NvZGVyLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKgorICogQ29tcHJlc3Npb24gaW5pdGlhbGl6YXRpb24uCisgKiBCZWZvcmUgY2FsbGluZyB0aGlzLCBhbGwgcGFyYW1ldGVycyBhbmQgYSBkYXRhIGRlc3RpbmF0aW9uIG11c3QgYmUgc2V0IHVwLgorICoKKyAqIFdlIHJlcXVpcmUgYSB3cml0ZV9hbGxfdGFibGVzIHBhcmFtZXRlciBhcyBhIGZhaWxzYWZlIGNoZWNrIHdoZW4gd3JpdGluZworICogbXVsdGlwbGUgZGF0YXN0cmVhbXMgZnJvbSB0aGUgc2FtZSBjb21wcmVzc2lvbiBvYmplY3QuICBTaW5jZSBwcmlvciBydW5zCisgKiB3aWxsIGhhdmUgbGVmdCBhbGwgdGhlIHRhYmxlcyBtYXJrZWQgc2VudF90YWJsZT1UUlVFLCBhIHN1YnNlcXVlbnQgcnVuCisgKiB3b3VsZCBlbWl0IGFuIGFiYnJldmlhdGVkIHN0cmVhbSAobm8gdGFibGVzKSBieSBkZWZhdWx0LiAgVGhpcyBtYXkgYmUgd2hhdAorICogaXMgd2FudGVkLCBidXQgZm9yIHNhZmV0eSdzIHNha2UgaXQgc2hvdWxkIG5vdCBiZSB0aGUgZGVmYXVsdCBiZWhhdmlvcjoKKyAqIHByb2dyYW1tZXJzIHNob3VsZCBoYXZlIHRvIG1ha2UgYSBkZWxpYmVyYXRlIGNob2ljZSB0byBlbWl0IGFiYnJldmlhdGVkCisgKiBpbWFnZXMuICBUaGVyZWZvcmUgdGhlIGRvY3VtZW50YXRpb24gYW5kIGV4YW1wbGVzIHNob3VsZCBlbmNvdXJhZ2UgcGVvcGxlCisgKiB0byBwYXNzIHdyaXRlX2FsbF90YWJsZXM9VFJVRTsgdGhlbiBpdCB3aWxsIHRha2UgYWN0aXZlIHRob3VnaHQgdG8gZG8gdGhlCisgKiB3cm9uZyB0aGluZy4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfc3RhcnRfY29tcHJlc3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIHdyaXRlX2FsbF90YWJsZXMpCit7CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TVEFSVCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworCisgIGlmICh3cml0ZV9hbGxfdGFibGVzKQorICAgIGpwZWdfc3VwcHJlc3NfdGFibGVzKGNpbmZvLCBGQUxTRSk7CS8qIG1hcmsgYWxsIHRhYmxlcyB0byBiZSB3cml0dGVuICovCisKKyAgLyogKFJlKWluaXRpYWxpemUgZXJyb3IgbWdyIGFuZCBkZXN0aW5hdGlvbiBtb2R1bGVzICovCisgICgqY2luZm8tPmVyci0+cmVzZXRfZXJyb3JfbWdyKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICAoKmNpbmZvLT5kZXN0LT5pbml0X2Rlc3RpbmF0aW9uKSAoY2luZm8pOworICAvKiBQZXJmb3JtIG1hc3RlciBzZWxlY3Rpb24gb2YgYWN0aXZlIG1vZHVsZXMgKi8KKyAgamluaXRfY29tcHJlc3NfbWFzdGVyKGNpbmZvKTsKKyAgLyogU2V0IHVwIGZvciB0aGUgZmlyc3QgcGFzcyAqLworICAoKmNpbmZvLT5tYXN0ZXItPnByZXBhcmVfZm9yX3Bhc3MpIChjaW5mbyk7CisgIC8qIFJlYWR5IGZvciBhcHBsaWNhdGlvbiB0byBkcml2ZSBmaXJzdCBwYXNzIHRocm91Z2gganBlZ193cml0ZV9zY2FubGluZXMKKyAgICogb3IganBlZ193cml0ZV9yYXdfZGF0YS4KKyAgICovCisgIGNpbmZvLT5uZXh0X3NjYW5saW5lID0gMDsKKyAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IChjaW5mby0+cmF3X2RhdGFfaW4gPyBDU1RBVEVfUkFXX09LIDogQ1NUQVRFX1NDQU5OSU5HKTsKK30KKworCisvKgorICogV3JpdGUgc29tZSBzY2FubGluZXMgb2YgZGF0YSB0byB0aGUgSlBFRyBjb21wcmVzc29yLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSB0aGUgbnVtYmVyIG9mIGxpbmVzIGFjdHVhbGx5IHdyaXR0ZW4uCisgKiBUaGlzIHNob3VsZCBiZSBsZXNzIHRoYW4gdGhlIHN1cHBsaWVkIG51bV9saW5lcyBvbmx5IGluIGNhc2UgdGhhdAorICogdGhlIGRhdGEgZGVzdGluYXRpb24gbW9kdWxlIGhhcyByZXF1ZXN0ZWQgc3VzcGVuc2lvbiBvZiB0aGUgY29tcHJlc3NvciwKKyAqIG9yIGlmIG1vcmUgdGhhbiBpbWFnZV9oZWlnaHQgc2NhbmxpbmVzIGFyZSBwYXNzZWQgaW4uCisgKgorICogTm90ZTogd2Ugd2FybiBhYm91dCBleGNlc3MgY2FsbHMgdG8ganBlZ193cml0ZV9zY2FubGluZXMoKSBzaW5jZQorICogdGhpcyBsaWtlbHkgc2lnbmFscyBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtbWVyIGVycm9yLiAgSG93ZXZlciwKKyAqIGV4Y2VzcyBzY2FubGluZXMgcGFzc2VkIGluIHRoZSBsYXN0IHZhbGlkIGNhbGwgYXJlICpzaWxlbnRseSogaWdub3JlZCwKKyAqIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIG5lZWQgbm90IGFkanVzdCBudW1fbGluZXMgZm9yIGVuZC1vZi1pbWFnZQorICogd2hlbiB1c2luZyBhIG11bHRpcGxlLXNjYW5saW5lIGJ1ZmZlci4KKyAqLworCitHTE9CQUwoSkRJTUVOU0lPTikKK2pwZWdfd3JpdGVfc2NhbmxpbmVzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBzY2FubGluZXMsCisJCSAgICAgIEpESU1FTlNJT04gbnVtX2xpbmVzKQoreworICBKRElNRU5TSU9OIHJvd19jdHIsIHJvd3NfbGVmdDsKKworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU0NBTk5JTkcpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKyAgaWYgKGNpbmZvLT5uZXh0X3NjYW5saW5lID49IGNpbmZvLT5pbWFnZV9oZWlnaHQpCisgICAgV0FSTk1TKGNpbmZvLCBKV1JOX1RPT19NVUNIX0RBVEEpOworCisgIC8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KKyAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAobG9uZykgY2luZm8tPm5leHRfc2NhbmxpbmU7CisgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQ7CisgICAgKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgIH0KKworICAvKiBHaXZlIG1hc3RlciBjb250cm9sIG1vZHVsZSBhbm90aGVyIGNoYW5jZSBpZiB0aGlzIGlzIGZpcnN0IGNhbGwgdG8KKyAgICoganBlZ193cml0ZV9zY2FubGluZXMuICBUaGlzIGxldHMgb3V0cHV0IG9mIHRoZSBmcmFtZS9zY2FuIGhlYWRlcnMgYmUKKyAgICogZGVsYXllZCBzbyB0aGF0IGFwcGxpY2F0aW9uIGNhbiB3cml0ZSBDT00sIGV0YywgbWFya2VycyBiZXR3ZWVuCisgICAqIGpwZWdfc3RhcnRfY29tcHJlc3MgYW5kIGpwZWdfd3JpdGVfc2NhbmxpbmVzLgorICAgKi8KKyAgaWYgKGNpbmZvLT5tYXN0ZXItPmNhbGxfcGFzc19zdGFydHVwKQorICAgICgqY2luZm8tPm1hc3Rlci0+cGFzc19zdGFydHVwKSAoY2luZm8pOworCisgIC8qIElnbm9yZSBhbnkgZXh0cmEgc2NhbmxpbmVzIGF0IGJvdHRvbSBvZiBpbWFnZS4gKi8KKyAgcm93c19sZWZ0ID0gY2luZm8tPmltYWdlX2hlaWdodCAtIGNpbmZvLT5uZXh0X3NjYW5saW5lOworICBpZiAobnVtX2xpbmVzID4gcm93c19sZWZ0KQorICAgIG51bV9saW5lcyA9IHJvd3NfbGVmdDsKKworICByb3dfY3RyID0gMDsKKyAgKCpjaW5mby0+bWFpbi0+cHJvY2Vzc19kYXRhKSAoY2luZm8sIHNjYW5saW5lcywgJnJvd19jdHIsIG51bV9saW5lcyk7CisgIGNpbmZvLT5uZXh0X3NjYW5saW5lICs9IHJvd19jdHI7CisgIHJldHVybiByb3dfY3RyOworfQorCisKKy8qCisgKiBBbHRlcm5hdGUgZW50cnkgcG9pbnQgdG8gd3JpdGUgcmF3IGRhdGEuCisgKiBQcm9jZXNzZXMgZXhhY3RseSBvbmUgaU1DVSByb3cgcGVyIGNhbGwsIHVubGVzcyBzdXNwZW5kZWQuCisgKi8KKworR0xPQkFMKEpESU1FTlNJT04pCitqcGVnX3dyaXRlX3Jhd19kYXRhIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBkYXRhLAorCQkgICAgIEpESU1FTlNJT04gbnVtX2xpbmVzKQoreworICBKRElNRU5TSU9OIGxpbmVzX3Blcl9pTUNVX3JvdzsKKworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfUkFXX09LKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisgIGlmIChjaW5mby0+bmV4dF9zY2FubGluZSA+PSBjaW5mby0+aW1hZ2VfaGVpZ2h0KSB7CisgICAgV0FSTk1TKGNpbmZvLCBKV1JOX1RPT19NVUNIX0RBVEEpOworICAgIHJldHVybiAwOworICB9CisKKyAgLyogQ2FsbCBwcm9ncmVzcyBtb25pdG9yIGhvb2sgaWYgcHJlc2VudCAqLworICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpIHsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfY291bnRlciA9IChsb25nKSBjaW5mby0+bmV4dF9zY2FubGluZTsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPmltYWdlX2hlaWdodDsKKyAgICAoKmNpbmZvLT5wcm9ncmVzcy0+cHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgfQorCisgIC8qIEdpdmUgbWFzdGVyIGNvbnRyb2wgbW9kdWxlIGFub3RoZXIgY2hhbmNlIGlmIHRoaXMgaXMgZmlyc3QgY2FsbCB0bworICAgKiBqcGVnX3dyaXRlX3Jhd19kYXRhLiAgVGhpcyBsZXRzIG91dHB1dCBvZiB0aGUgZnJhbWUvc2NhbiBoZWFkZXJzIGJlCisgICAqIGRlbGF5ZWQgc28gdGhhdCBhcHBsaWNhdGlvbiBjYW4gd3JpdGUgQ09NLCBldGMsIG1hcmtlcnMgYmV0d2VlbgorICAgKiBqcGVnX3N0YXJ0X2NvbXByZXNzIGFuZCBqcGVnX3dyaXRlX3Jhd19kYXRhLgorICAgKi8KKyAgaWYgKGNpbmZvLT5tYXN0ZXItPmNhbGxfcGFzc19zdGFydHVwKQorICAgICgqY2luZm8tPm1hc3Rlci0+cGFzc19zdGFydHVwKSAoY2luZm8pOworCisgIC8qIFZlcmlmeSB0aGF0IGF0IGxlYXN0IG9uZSBpTUNVIHJvdyBoYXMgYmVlbiBwYXNzZWQuICovCisgIGxpbmVzX3Blcl9pTUNVX3JvdyA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkU7CisgIGlmIChudW1fbGluZXMgPCBsaW5lc19wZXJfaU1DVV9yb3cpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CVUZGRVJfU0laRSk7CisKKyAgLyogRGlyZWN0bHkgY29tcHJlc3MgdGhlIHJvdy4gKi8KKyAgaWYgKCEgKCpjaW5mby0+Y29lZi0+Y29tcHJlc3NfZGF0YSkgKGNpbmZvLCBkYXRhKSkgeworICAgIC8qIElmIGNvbXByZXNzb3IgZGlkIG5vdCBjb25zdW1lIHRoZSB3aG9sZSByb3csIHN1c3BlbmQgcHJvY2Vzc2luZy4gKi8KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8qIE9LLCB3ZSBwcm9jZXNzZWQgb25lIGlNQ1Ugcm93LiAqLworICBjaW5mby0+bmV4dF9zY2FubGluZSArPSBsaW5lc19wZXJfaU1DVV9yb3c7CisgIHJldHVybiBsaW5lc19wZXJfaU1DVV9yb3c7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamNjb2VmY3QuYyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY2NvZWZjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NjNkZGIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamNjb2VmY3QuYwpAQCAtMCwwICsxLDQ0OSBAQAorLyoKKyAqIGpjY29lZmN0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29lZmZpY2llbnQgYnVmZmVyIGNvbnRyb2xsZXIgZm9yIGNvbXByZXNzaW9uLgorICogVGhpcyBjb250cm9sbGVyIGlzIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIEpQRUcgY29tcHJlc3NvciBwcm9wZXIuCisgKiBUaGUgY29lZmZpY2llbnQgYnVmZmVyIGxpZXMgYmV0d2VlbiBmb3J3YXJkLURDVCBhbmQgZW50cm9weSBlbmNvZGluZyBzdGVwcy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyogV2UgdXNlIGEgZnVsbC1pbWFnZSBjb2VmZmljaWVudCBidWZmZXIgd2hlbiBkb2luZyBIdWZmbWFuIG9wdGltaXphdGlvbiwKKyAqIGFuZCBhbHNvIGZvciB3cml0aW5nIG11bHRpcGxlLXNjYW4gSlBFRyBmaWxlcy4gIEluIGFsbCBjYXNlcywgdGhlIERDVAorICogc3RlcCBpcyBydW4gZHVyaW5nIHRoZSBmaXJzdCBwYXNzLCBhbmQgc3Vic2VxdWVudCBwYXNzZXMgbmVlZCBvbmx5IHJlYWQKKyAqIHRoZSBidWZmZXJlZCBjb2VmZmljaWVudHMuCisgKi8KKyNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKKyNkZWZpbmUgRlVMTF9DT0VGX0JVRkZFUl9TVVBQT1JURUQKKyNlbHNlCisjaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisjZGVmaW5lIEZVTExfQ09FRl9CVUZGRVJfU1VQUE9SVEVECisjZW5kaWYKKyNlbmRpZgorCisKKy8qIFByaXZhdGUgYnVmZmVyIGNvbnRyb2xsZXIgb2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfY19jb2VmX2NvbnRyb2xsZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgSkRJTUVOU0lPTiBpTUNVX3Jvd19udW07CS8qIGlNQ1Ugcm93ICMgd2l0aGluIGltYWdlICovCisgIEpESU1FTlNJT04gbWN1X2N0cjsJCS8qIGNvdW50cyBNQ1VzIHByb2Nlc3NlZCBpbiBjdXJyZW50IHJvdyAqLworICBpbnQgTUNVX3ZlcnRfb2Zmc2V0OwkJLyogY291bnRzIE1DVSByb3dzIHdpdGhpbiBpTUNVIHJvdyAqLworICBpbnQgTUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OwkvKiBudW1iZXIgb2Ygc3VjaCByb3dzIG5lZWRlZCAqLworCisgIC8qIEZvciBzaW5nbGUtcGFzcyBjb21wcmVzc2lvbiwgaXQncyBzdWZmaWNpZW50IHRvIGJ1ZmZlciBqdXN0IG9uZSBNQ1UKKyAgICogKGFsdGhvdWdoIHRoaXMgbWF5IHByb3ZlIGEgYml0IHNsb3cgaW4gcHJhY3RpY2UpLiAgV2UgYWxsb2NhdGUgYQorICAgKiB3b3Jrc3BhY2Ugb2YgQ19NQVhfQkxPQ0tTX0lOX01DVSBjb2VmZmljaWVudCBibG9ja3MsIGFuZCByZXVzZSBpdCBmb3IgZWFjaAorICAgKiBNQ1UgY29uc3RydWN0ZWQgYW5kIHNlbnQuICAoT24gODB4ODYsIHRoZSB3b3Jrc3BhY2UgaXMgRkFSIGV2ZW4gdGhvdWdoCisgICAqIGl0J3Mgbm90IHJlYWxseSB2ZXJ5IGJpZzsgdGhpcyBpcyB0byBrZWVwIHRoZSBtb2R1bGUgaW50ZXJmYWNlcyB1bmNoYW5nZWQKKyAgICogd2hlbiBhIGxhcmdlIGNvZWZmaWNpZW50IGJ1ZmZlciBpcyBuZWNlc3NhcnkuKQorICAgKiBJbiBtdWx0aS1wYXNzIG1vZGVzLCB0aGlzIGFycmF5IHBvaW50cyB0byB0aGUgY3VycmVudCBNQ1UncyBibG9ja3MKKyAgICogd2l0aGluIHRoZSB2aXJ0dWFsIGFycmF5cy4KKyAgICovCisgIEpCTE9DS1JPVyBNQ1VfYnVmZmVyW0NfTUFYX0JMT0NLU19JTl9NQ1VdOworCisgIC8qIEluIG11bHRpLXBhc3MgbW9kZXMsIHdlIG5lZWQgYSB2aXJ0dWFsIGJsb2NrIGFycmF5IGZvciBlYWNoIGNvbXBvbmVudC4gKi8KKyAganZpcnRfYmFycmF5X3B0ciB3aG9sZV9pbWFnZVtNQVhfQ09NUE9ORU5UU107Cit9IG15X2NvZWZfY29udHJvbGxlcjsKKwordHlwZWRlZiBteV9jb2VmX2NvbnRyb2xsZXIgKiBteV9jb2VmX3B0cjsKKworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworTUVUSE9EREVGKGJvb2xlYW4pIGNvbXByZXNzX2RhdGEKKyAgICBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGlucHV0X2J1ZikpOworI2lmZGVmIEZVTExfQ09FRl9CVUZGRVJfU1VQUE9SVEVECitNRVRIT0RERUYoYm9vbGVhbikgY29tcHJlc3NfZmlyc3RfcGFzcworICAgIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgaW5wdXRfYnVmKSk7CitNRVRIT0RERUYoYm9vbGVhbikgY29tcHJlc3Nfb3V0cHV0CisgICAgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpKTsKKyNlbmRpZgorCisKK0xPQ0FMKHZvaWQpCitzdGFydF9pTUNVX3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8pCisvKiBSZXNldCB3aXRoaW4taU1DVS1yb3cgY291bnRlcnMgZm9yIGEgbmV3IHJvdyAqLworeworICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKKworICAvKiBJbiBhbiBpbnRlcmxlYXZlZCBzY2FuLCBhbiBNQ1Ugcm93IGlzIHRoZSBzYW1lIGFzIGFuIGlNQ1Ugcm93LgorICAgKiBJbiBhIG5vbmludGVybGVhdmVkIHNjYW4sIGFuIGlNQ1Ugcm93IGhhcyB2X3NhbXBfZmFjdG9yIE1DVSByb3dzLgorICAgKiBCdXQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UsIHByb2Nlc3Mgb25seSB3aGF0J3MgbGVmdC4KKyAgICovCisgIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiA+IDEpIHsKKyAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSAxOworICB9IGVsc2UgeworICAgIGlmIChjb2VmLT5pTUNVX3Jvd19udW0gPCAoY2luZm8tPnRvdGFsX2lNQ1Vfcm93cy0xKSkKKyAgICAgIGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdyA9IGNpbmZvLT5jdXJfY29tcF9pbmZvWzBdLT52X3NhbXBfZmFjdG9yOworICAgIGVsc2UKKyAgICAgIGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdyA9IGNpbmZvLT5jdXJfY29tcF9pbmZvWzBdLT5sYXN0X3Jvd19oZWlnaHQ7CisgIH0KKworICBjb2VmLT5tY3VfY3RyID0gMDsKKyAgY29lZi0+TUNVX3ZlcnRfb2Zmc2V0ID0gMDsKK30KKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBwcm9jZXNzaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX2NvZWYgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkKK3sKKyAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7CisKKyAgY29lZi0+aU1DVV9yb3dfbnVtID0gMDsKKyAgc3RhcnRfaU1DVV9yb3coY2luZm8pOworCisgIHN3aXRjaCAocGFzc19tb2RlKSB7CisgIGNhc2UgSkJVRl9QQVNTX1RIUlU6CisgICAgaWYgKGNvZWYtPndob2xlX2ltYWdlWzBdICE9IE5VTEwpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisgICAgY29lZi0+cHViLmNvbXByZXNzX2RhdGEgPSBjb21wcmVzc19kYXRhOworICAgIGJyZWFrOworI2lmZGVmIEZVTExfQ09FRl9CVUZGRVJfU1VQUE9SVEVECisgIGNhc2UgSkJVRl9TQVZFX0FORF9QQVNTOgorICAgIGlmIChjb2VmLT53aG9sZV9pbWFnZVswXSA9PSBOVUxMKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOworICAgIGNvZWYtPnB1Yi5jb21wcmVzc19kYXRhID0gY29tcHJlc3NfZmlyc3RfcGFzczsKKyAgICBicmVhazsKKyAgY2FzZSBKQlVGX0NSQU5LX0RFU1Q6CisgICAgaWYgKGNvZWYtPndob2xlX2ltYWdlWzBdID09IE5VTEwpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisgICAgY29lZi0+cHViLmNvbXByZXNzX2RhdGEgPSBjb21wcmVzc19vdXRwdXQ7CisgICAgYnJlYWs7CisjZW5kaWYKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisgICAgYnJlYWs7CisgIH0KK30KKworCisvKgorICogUHJvY2VzcyBzb21lIGRhdGEgaW4gdGhlIHNpbmdsZS1wYXNzIGNhc2UuCisgKiBXZSBwcm9jZXNzIHRoZSBlcXVpdmFsZW50IG9mIG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93ICgiaU1DVSIgcm93KQorICogcGVyIGNhbGwsIGllLCB2X3NhbXBfZmFjdG9yIGJsb2NrIHJvd3MgZm9yIGVhY2ggY29tcG9uZW50IGluIHRoZSBpbWFnZS4KKyAqIFJldHVybnMgVFJVRSBpZiB0aGUgaU1DVSByb3cgaXMgY29tcGxldGVkLCBGQUxTRSBpZiBzdXNwZW5kZWQuCisgKgorICogTkI6IGlucHV0X2J1ZiBjb250YWlucyBhIHBsYW5lIGZvciBlYWNoIGNvbXBvbmVudCBpbiBpbWFnZSwKKyAqIHdoaWNoIHdlIGluZGV4IGFjY29yZGluZyB0byB0aGUgY29tcG9uZW50J3MgU09GIHBvc2l0aW9uLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorY29tcHJlc3NfZGF0YSAoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgaW5wdXRfYnVmKQoreworICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKKyAgSkRJTUVOU0lPTiBNQ1VfY29sX251bTsJLyogaW5kZXggb2YgY3VycmVudCBNQ1Ugd2l0aGluIHJvdyAqLworICBKRElNRU5TSU9OIGxhc3RfTUNVX2NvbCA9IGNpbmZvLT5NQ1VzX3Blcl9yb3cgLSAxOworICBKRElNRU5TSU9OIGxhc3RfaU1DVV9yb3cgPSBjaW5mby0+dG90YWxfaU1DVV9yb3dzIC0gMTsKKyAgaW50IGJsa24sIGJpLCBjaSwgeWluZGV4LCB5b2Zmc2V0LCBibG9ja2NudDsKKyAgSkRJTUVOU0lPTiB5cG9zLCB4cG9zOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworCisgIC8qIExvb3AgdG8gd3JpdGUgYXMgbXVjaCBhcyBvbmUgd2hvbGUgaU1DVSByb3cgKi8KKyAgZm9yICh5b2Zmc2V0ID0gY29lZi0+TUNVX3ZlcnRfb2Zmc2V0OyB5b2Zmc2V0IDwgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OworICAgICAgIHlvZmZzZXQrKykgeworICAgIGZvciAoTUNVX2NvbF9udW0gPSBjb2VmLT5tY3VfY3RyOyBNQ1VfY29sX251bSA8PSBsYXN0X01DVV9jb2w7CisJIE1DVV9jb2xfbnVtKyspIHsKKyAgICAgIC8qIERldGVybWluZSB3aGVyZSBkYXRhIGNvbWVzIGZyb20gaW4gaW5wdXRfYnVmIGFuZCBkbyB0aGUgRENUIHRoaW5nLgorICAgICAgICogRWFjaCBjYWxsIG9uIGZvcndhcmRfRENUIHByb2Nlc3NlcyBhIGhvcml6b250YWwgcm93IG9mIERDVCBibG9ja3MKKyAgICAgICAqIGFzIHdpZGUgYXMgYW4gTUNVOyB3ZSByZWx5IG9uIGhhdmluZyBhbGxvY2F0ZWQgdGhlIE1DVV9idWZmZXJbXSBibG9ja3MKKyAgICAgICAqIHNlcXVlbnRpYWxseS4gIER1bW15IGJsb2NrcyBhdCB0aGUgcmlnaHQgb3IgYm90dG9tIGVkZ2UgYXJlIGZpbGxlZCBpbgorICAgICAgICogc3BlY2lhbGx5LiAgVGhlIGRhdGEgaW4gdGhlbSBkb2VzIG5vdCBtYXR0ZXIgZm9yIGltYWdlIHJlY29uc3RydWN0aW9uLAorICAgICAgICogc28gd2UgZmlsbCB0aGVtIHdpdGggdmFsdWVzIHRoYXQgd2lsbCBlbmNvZGUgdG8gdGhlIHNtYWxsZXN0IGFtb3VudCBvZgorICAgICAgICogZGF0YSwgdml6OiBhbGwgemVyb2VzIGluIHRoZSBBQyBlbnRyaWVzLCBEQyBlbnRyaWVzIGVxdWFsIHRvIHByZXZpb3VzCisgICAgICAgKiBibG9jaydzIERDIHZhbHVlLiAgKFRoYW5rcyB0byBUaG9tYXMgS2luc21hbiBmb3IgdGhpcyBpZGVhLikKKyAgICAgICAqLworICAgICAgYmxrbiA9IDA7CisgICAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgeworCWNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisJYmxvY2tjbnQgPSAoTUNVX2NvbF9udW0gPCBsYXN0X01DVV9jb2wpID8gY29tcHB0ci0+TUNVX3dpZHRoCisJCQkJCQk6IGNvbXBwdHItPmxhc3RfY29sX3dpZHRoOworCXhwb3MgPSBNQ1VfY29sX251bSAqIGNvbXBwdHItPk1DVV9zYW1wbGVfd2lkdGg7CisJeXBvcyA9IHlvZmZzZXQgKiBEQ1RTSVpFOyAvKiB5cG9zID09ICh5b2Zmc2V0K3lpbmRleCkgKiBEQ1RTSVpFICovCisJZm9yICh5aW5kZXggPSAwOyB5aW5kZXggPCBjb21wcHRyLT5NQ1VfaGVpZ2h0OyB5aW5kZXgrKykgeworCSAgaWYgKGNvZWYtPmlNQ1Vfcm93X251bSA8IGxhc3RfaU1DVV9yb3cgfHwKKwkgICAgICB5b2Zmc2V0K3lpbmRleCA8IGNvbXBwdHItPmxhc3Rfcm93X2hlaWdodCkgeworCSAgICAoKmNpbmZvLT5mZGN0LT5mb3J3YXJkX0RDVCkgKGNpbmZvLCBjb21wcHRyLAorCQkJCQkgaW5wdXRfYnVmW2NvbXBwdHItPmNvbXBvbmVudF9pbmRleF0sCisJCQkJCSBjb2VmLT5NQ1VfYnVmZmVyW2Jsa25dLAorCQkJCQkgeXBvcywgeHBvcywgKEpESU1FTlNJT04pIGJsb2NrY250KTsKKwkgICAgaWYgKGJsb2NrY250IDwgY29tcHB0ci0+TUNVX3dpZHRoKSB7CisJICAgICAgLyogQ3JlYXRlIHNvbWUgZHVtbXkgYmxvY2tzIGF0IHRoZSByaWdodCBlZGdlIG9mIHRoZSBpbWFnZS4gKi8KKwkgICAgICBqemVyb19mYXIoKHZvaWQgRkFSICopIGNvZWYtPk1DVV9idWZmZXJbYmxrbiArIGJsb2NrY250XSwKKwkJCShjb21wcHRyLT5NQ1Vfd2lkdGggLSBibG9ja2NudCkgKiBTSVpFT0YoSkJMT0NLKSk7CisJICAgICAgZm9yIChiaSA9IGJsb2NrY250OyBiaSA8IGNvbXBwdHItPk1DVV93aWR0aDsgYmkrKykgeworCQljb2VmLT5NQ1VfYnVmZmVyW2Jsa24rYmldWzBdWzBdID0gY29lZi0+TUNVX2J1ZmZlcltibGtuK2JpLTFdWzBdWzBdOworCSAgICAgIH0KKwkgICAgfQorCSAgfSBlbHNlIHsKKwkgICAgLyogQ3JlYXRlIGEgcm93IG9mIGR1bW15IGJsb2NrcyBhdCB0aGUgYm90dG9tIG9mIHRoZSBpbWFnZS4gKi8KKwkgICAganplcm9fZmFyKCh2b2lkIEZBUiAqKSBjb2VmLT5NQ1VfYnVmZmVyW2Jsa25dLAorCQkgICAgICBjb21wcHRyLT5NQ1Vfd2lkdGggKiBTSVpFT0YoSkJMT0NLKSk7CisJICAgIGZvciAoYmkgPSAwOyBiaSA8IGNvbXBwdHItPk1DVV93aWR0aDsgYmkrKykgeworCSAgICAgIGNvZWYtPk1DVV9idWZmZXJbYmxrbitiaV1bMF1bMF0gPSBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24tMV1bMF1bMF07CisJICAgIH0KKwkgIH0KKwkgIGJsa24gKz0gY29tcHB0ci0+TUNVX3dpZHRoOworCSAgeXBvcyArPSBEQ1RTSVpFOworCX0KKyAgICAgIH0KKyAgICAgIC8qIFRyeSB0byB3cml0ZSB0aGUgTUNVLiAgSW4gZXZlbnQgb2YgYSBzdXNwZW5zaW9uIGZhaWx1cmUsIHdlIHdpbGwKKyAgICAgICAqIHJlLURDVCB0aGUgTUNVIG9uIHJlc3RhcnQgKGEgYml0IGluZWZmaWNpZW50LCBjb3VsZCBiZSBmaXhlZC4uLikKKyAgICAgICAqLworICAgICAgaWYgKCEgKCpjaW5mby0+ZW50cm9weS0+ZW5jb2RlX21jdSkgKGNpbmZvLCBjb2VmLT5NQ1VfYnVmZmVyKSkgeworCS8qIFN1c3BlbnNpb24gZm9yY2VkOyB1cGRhdGUgc3RhdGUgY291bnRlcnMgYW5kIGV4aXQgKi8KKwljb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSB5b2Zmc2V0OworCWNvZWYtPm1jdV9jdHIgPSBNQ1VfY29sX251bTsKKwlyZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgfQorICAgIC8qIENvbXBsZXRlZCBhbiBNQ1Ugcm93LCBidXQgcGVyaGFwcyBub3QgYW4gaU1DVSByb3cgKi8KKyAgICBjb2VmLT5tY3VfY3RyID0gMDsKKyAgfQorICAvKiBDb21wbGV0ZWQgdGhlIGlNQ1Ugcm93LCBhZHZhbmNlIGNvdW50ZXJzIGZvciBuZXh0IG9uZSAqLworICBjb2VmLT5pTUNVX3Jvd19udW0rKzsKKyAgc3RhcnRfaU1DVV9yb3coY2luZm8pOworICByZXR1cm4gVFJVRTsKK30KKworCisjaWZkZWYgRlVMTF9DT0VGX0JVRkZFUl9TVVBQT1JURUQKKworLyoKKyAqIFByb2Nlc3Mgc29tZSBkYXRhIGluIHRoZSBmaXJzdCBwYXNzIG9mIGEgbXVsdGktcGFzcyBjYXNlLgorICogV2UgcHJvY2VzcyB0aGUgZXF1aXZhbGVudCBvZiBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykKKyAqIHBlciBjYWxsLCBpZSwgdl9zYW1wX2ZhY3RvciBibG9jayByb3dzIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgaW1hZ2UuCisgKiBUaGlzIGFtb3VudCBvZiBkYXRhIGlzIHJlYWQgZnJvbSB0aGUgc291cmNlIGJ1ZmZlciwgRENUJ2QgYW5kIHF1YW50aXplZCwKKyAqIGFuZCBzYXZlZCBpbnRvIHRoZSB2aXJ0dWFsIGFycmF5cy4gIFdlIGFsc28gZ2VuZXJhdGUgc3VpdGFibGUgZHVtbXkgYmxvY2tzCisgKiBhcyBuZWVkZWQgYXQgdGhlIHJpZ2h0IGFuZCBsb3dlciBlZGdlcy4gIChUaGUgZHVtbXkgYmxvY2tzIGFyZSBjb25zdHJ1Y3RlZAorICogaW4gdGhlIHZpcnR1YWwgYXJyYXlzLCB3aGljaCBoYXZlIGJlZW4gcGFkZGVkIGFwcHJvcHJpYXRlbHkuKSAgVGhpcyBtYWtlcworICogaXQgcG9zc2libGUgZm9yIHN1YnNlcXVlbnQgcGFzc2VzIG5vdCB0byB3b3JyeSBhYm91dCByZWFsIHZzLiBkdW1teSBibG9ja3MuCisgKgorICogV2UgbXVzdCBhbHNvIGVtaXQgdGhlIGRhdGEgdG8gdGhlIGVudHJvcHkgZW5jb2Rlci4gIFRoaXMgaXMgY29udmVuaWVudGx5CisgKiBkb25lIGJ5IGNhbGxpbmcgY29tcHJlc3Nfb3V0cHV0KCkgYWZ0ZXIgd2UndmUgbG9hZGVkIHRoZSBjdXJyZW50IHN0cmlwCisgKiBvZiB0aGUgdmlydHVhbCBhcnJheXMuCisgKgorICogTkI6IGlucHV0X2J1ZiBjb250YWlucyBhIHBsYW5lIGZvciBlYWNoIGNvbXBvbmVudCBpbiBpbWFnZS4gIEFsbAorICogY29tcG9uZW50cyBhcmUgRENUJ2QgYW5kIGxvYWRlZCBpbnRvIHRoZSB2aXJ0dWFsIGFycmF5cyBpbiB0aGlzIHBhc3MuCisgKiBIb3dldmVyLCBpdCBtYXkgYmUgdGhhdCBvbmx5IGEgc3Vic2V0IG9mIHRoZSBjb21wb25lbnRzIGFyZSBlbWl0dGVkIHRvCisgKiB0aGUgZW50cm9weSBlbmNvZGVyIGR1cmluZyB0aGlzIGZpcnN0IHBhc3M7IGJlIGNhcmVmdWwgYWJvdXQgbG9va2luZworICogYXQgdGhlIHNjYW4tZGVwZW5kZW50IHZhcmlhYmxlcyAoTUNVIGRpbWVuc2lvbnMsIGV0YykuCisgKi8KKworTUVUSE9EREVGKGJvb2xlYW4pCitjb21wcmVzc19maXJzdF9wYXNzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworICBKRElNRU5TSU9OIGxhc3RfaU1DVV9yb3cgPSBjaW5mby0+dG90YWxfaU1DVV9yb3dzIC0gMTsKKyAgSkRJTUVOU0lPTiBibG9ja3NfYWNyb3NzLCBNQ1VzX2Fjcm9zcywgTUNVaW5kZXg7CisgIGludCBiaSwgY2ksIGhfc2FtcF9mYWN0b3IsIGJsb2NrX3JvdywgYmxvY2tfcm93cywgbmR1bW15OworICBKQ09FRiBsYXN0REM7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIEpCTE9DS0FSUkFZIGJ1ZmZlcjsKKyAgSkJMT0NLUk9XIHRoaXNibG9ja3JvdywgbGFzdGJsb2Nrcm93OworCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgLyogQWxpZ24gdGhlIHZpcnR1YWwgYnVmZmVyIGZvciB0aGlzIGNvbXBvbmVudC4gKi8KKyAgICBidWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY2ldLAorICAgICAgIGNvZWYtPmlNQ1Vfcm93X251bSAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCisgICAgICAgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIFRSVUUpOworICAgIC8qIENvdW50IG5vbi1kdW1teSBEQ1QgYmxvY2sgcm93cyBpbiB0aGlzIGlNQ1Ugcm93LiAqLworICAgIGlmIChjb2VmLT5pTUNVX3Jvd19udW0gPCBsYXN0X2lNQ1Vfcm93KQorICAgICAgYmxvY2tfcm93cyA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CisgICAgZWxzZSB7CisgICAgICAvKiBOQjogY2FuJ3QgdXNlIGxhc3Rfcm93X2hlaWdodCBoZXJlLCBzaW5jZSBtYXkgbm90IGJlIHNldCEgKi8KKyAgICAgIGJsb2NrX3Jvd3MgPSAoaW50KSAoY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyAlIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOworICAgICAgaWYgKGJsb2NrX3Jvd3MgPT0gMCkgYmxvY2tfcm93cyA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CisgICAgfQorICAgIGJsb2Nrc19hY3Jvc3MgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7CisgICAgaF9zYW1wX2ZhY3RvciA9IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7CisgICAgLyogQ291bnQgbnVtYmVyIG9mIGR1bW15IGJsb2NrcyB0byBiZSBhZGRlZCBhdCB0aGUgcmlnaHQgbWFyZ2luLiAqLworICAgIG5kdW1teSA9IChpbnQpIChibG9ja3NfYWNyb3NzICUgaF9zYW1wX2ZhY3Rvcik7CisgICAgaWYgKG5kdW1teSA+IDApCisgICAgICBuZHVtbXkgPSBoX3NhbXBfZmFjdG9yIC0gbmR1bW15OworICAgIC8qIFBlcmZvcm0gRENUIGZvciBhbGwgbm9uLWR1bW15IGJsb2NrcyBpbiB0aGlzIGlNQ1Ugcm93LiAgRWFjaCBjYWxsCisgICAgICogb24gZm9yd2FyZF9EQ1QgcHJvY2Vzc2VzIGEgY29tcGxldGUgaG9yaXpvbnRhbCByb3cgb2YgRENUIGJsb2Nrcy4KKyAgICAgKi8KKyAgICBmb3IgKGJsb2NrX3JvdyA9IDA7IGJsb2NrX3JvdyA8IGJsb2NrX3Jvd3M7IGJsb2NrX3JvdysrKSB7CisgICAgICB0aGlzYmxvY2tyb3cgPSBidWZmZXJbYmxvY2tfcm93XTsKKyAgICAgICgqY2luZm8tPmZkY3QtPmZvcndhcmRfRENUKSAoY2luZm8sIGNvbXBwdHIsCisJCQkJICAgaW5wdXRfYnVmW2NpXSwgdGhpc2Jsb2Nrcm93LAorCQkJCSAgIChKRElNRU5TSU9OKSAoYmxvY2tfcm93ICogRENUU0laRSksCisJCQkJICAgKEpESU1FTlNJT04pIDAsIGJsb2Nrc19hY3Jvc3MpOworICAgICAgaWYgKG5kdW1teSA+IDApIHsKKwkvKiBDcmVhdGUgZHVtbXkgYmxvY2tzIGF0IHRoZSByaWdodCBlZGdlIG9mIHRoZSBpbWFnZS4gKi8KKwl0aGlzYmxvY2tyb3cgKz0gYmxvY2tzX2Fjcm9zczsgLyogPT4gZmlyc3QgZHVtbXkgYmxvY2sgKi8KKwlqemVyb19mYXIoKHZvaWQgRkFSICopIHRoaXNibG9ja3JvdywgbmR1bW15ICogU0laRU9GKEpCTE9DSykpOworCWxhc3REQyA9IHRoaXNibG9ja3Jvd1stMV1bMF07CisJZm9yIChiaSA9IDA7IGJpIDwgbmR1bW15OyBiaSsrKSB7CisJICB0aGlzYmxvY2tyb3dbYmldWzBdID0gbGFzdERDOworCX0KKyAgICAgIH0KKyAgICB9CisgICAgLyogSWYgYXQgZW5kIG9mIGltYWdlLCBjcmVhdGUgZHVtbXkgYmxvY2sgcm93cyBhcyBuZWVkZWQuCisgICAgICogVGhlIHRyaWNreSBwYXJ0IGhlcmUgaXMgdGhhdCB3aXRoaW4gZWFjaCBNQ1UsIHdlIHdhbnQgdGhlIERDIHZhbHVlcworICAgICAqIG9mIHRoZSBkdW1teSBibG9ja3MgdG8gbWF0Y2ggdGhlIGxhc3QgcmVhbCBibG9jaydzIERDIHZhbHVlLgorICAgICAqIFRoaXMgc3F1ZWV6ZXMgYSBmZXcgbW9yZSBieXRlcyBvdXQgb2YgdGhlIHJlc3VsdGluZyBmaWxlLi4uCisgICAgICovCisgICAgaWYgKGNvZWYtPmlNQ1Vfcm93X251bSA9PSBsYXN0X2lNQ1Vfcm93KSB7CisgICAgICBibG9ja3NfYWNyb3NzICs9IG5kdW1teTsJLyogaW5jbHVkZSBsb3dlciByaWdodCBjb3JuZXIgKi8KKyAgICAgIE1DVXNfYWNyb3NzID0gYmxvY2tzX2Fjcm9zcyAvIGhfc2FtcF9mYWN0b3I7CisgICAgICBmb3IgKGJsb2NrX3JvdyA9IGJsb2NrX3Jvd3M7IGJsb2NrX3JvdyA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CisJICAgYmxvY2tfcm93KyspIHsKKwl0aGlzYmxvY2tyb3cgPSBidWZmZXJbYmxvY2tfcm93XTsKKwlsYXN0YmxvY2tyb3cgPSBidWZmZXJbYmxvY2tfcm93LTFdOworCWp6ZXJvX2Zhcigodm9pZCBGQVIgKikgdGhpc2Jsb2Nrcm93LAorCQkgIChzaXplX3QpIChibG9ja3NfYWNyb3NzICogU0laRU9GKEpCTE9DSykpKTsKKwlmb3IgKE1DVWluZGV4ID0gMDsgTUNVaW5kZXggPCBNQ1VzX2Fjcm9zczsgTUNVaW5kZXgrKykgeworCSAgbGFzdERDID0gbGFzdGJsb2Nrcm93W2hfc2FtcF9mYWN0b3ItMV1bMF07CisJICBmb3IgKGJpID0gMDsgYmkgPCBoX3NhbXBfZmFjdG9yOyBiaSsrKSB7CisJICAgIHRoaXNibG9ja3Jvd1tiaV1bMF0gPSBsYXN0REM7CisJICB9CisJICB0aGlzYmxvY2tyb3cgKz0gaF9zYW1wX2ZhY3RvcjsgLyogYWR2YW5jZSB0byBuZXh0IE1DVSBpbiByb3cgKi8KKwkgIGxhc3RibG9ja3JvdyArPSBoX3NhbXBfZmFjdG9yOworCX0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLyogTkI6IGNvbXByZXNzX291dHB1dCB3aWxsIGluY3JlbWVudCBpTUNVX3Jvd19udW0gaWYgc3VjY2Vzc2Z1bC4KKyAgICogQSBzdXNwZW5zaW9uIHJldHVybiB3aWxsIHJlc3VsdCBpbiByZWRvaW5nIGFsbCB0aGUgd29yayBhYm92ZSBuZXh0IHRpbWUuCisgICAqLworCisgIC8qIEVtaXQgZGF0YSB0byB0aGUgZW50cm9weSBlbmNvZGVyLCBzaGFyaW5nIGNvZGUgd2l0aCBzdWJzZXF1ZW50IHBhc3NlcyAqLworICByZXR1cm4gY29tcHJlc3Nfb3V0cHV0KGNpbmZvLCBpbnB1dF9idWYpOworfQorCisKKy8qCisgKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiBzdWJzZXF1ZW50IHBhc3NlcyBvZiBhIG11bHRpLXBhc3MgY2FzZS4KKyAqIFdlIHByb2Nlc3MgdGhlIGVxdWl2YWxlbnQgb2Ygb25lIGZ1bGx5IGludGVybGVhdmVkIE1DVSByb3cgKCJpTUNVIiByb3cpCisgKiBwZXIgY2FsbCwgaWUsIHZfc2FtcF9mYWN0b3IgYmxvY2sgcm93cyBmb3IgZWFjaCBjb21wb25lbnQgaW4gdGhlIHNjYW4uCisgKiBUaGUgZGF0YSBpcyBvYnRhaW5lZCBmcm9tIHRoZSB2aXJ0dWFsIGFycmF5cyBhbmQgZmVkIHRvIHRoZSBlbnRyb3B5IGNvZGVyLgorICogUmV0dXJucyBUUlVFIGlmIHRoZSBpTUNVIHJvdyBpcyBjb21wbGV0ZWQsIEZBTFNFIGlmIHN1c3BlbmRlZC4KKyAqCisgKiBOQjogaW5wdXRfYnVmIGlzIGlnbm9yZWQ7IGl0IGlzIGxpa2VseSB0byBiZSBhIE5VTEwgcG9pbnRlci4KKyAqLworCitNRVRIT0RERUYoYm9vbGVhbikKK2NvbXByZXNzX291dHB1dCAoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgaW5wdXRfYnVmKQoreworICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKKyAgSkRJTUVOU0lPTiBNQ1VfY29sX251bTsJLyogaW5kZXggb2YgY3VycmVudCBNQ1Ugd2l0aGluIHJvdyAqLworICBpbnQgYmxrbiwgY2ksIHhpbmRleCwgeWluZGV4LCB5b2Zmc2V0OworICBKRElNRU5TSU9OIHN0YXJ0X2NvbDsKKyAgSkJMT0NLQVJSQVkgYnVmZmVyW01BWF9DT01QU19JTl9TQ0FOXTsKKyAgSkJMT0NLUk9XIGJ1ZmZlcl9wdHI7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgLyogQWxpZ24gdGhlIHZpcnR1YWwgYnVmZmVycyBmb3IgdGhlIGNvbXBvbmVudHMgdXNlZCBpbiB0aGlzIHNjYW4uCisgICAqIE5COiBkdXJpbmcgZmlyc3QgcGFzcywgdGhpcyBpcyBzYWZlIG9ubHkgYmVjYXVzZSB0aGUgYnVmZmVycyB3aWxsCisgICAqIGFscmVhZHkgYmUgYWxpZ25lZCBwcm9wZXJseSwgc28gam1lbW1nci5jIHdvbid0IG5lZWQgdG8gZG8gYW55IEkvTy4KKyAgICovCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICBidWZmZXJbY2ldID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIGNvZWYtPndob2xlX2ltYWdlW2NvbXBwdHItPmNvbXBvbmVudF9pbmRleF0sCisgICAgICAgY29lZi0+aU1DVV9yb3dfbnVtICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKKyAgICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgRkFMU0UpOworICB9CisKKyAgLyogTG9vcCB0byBwcm9jZXNzIG9uZSB3aG9sZSBpTUNVIHJvdyAqLworICBmb3IgKHlvZmZzZXQgPSBjb2VmLT5NQ1VfdmVydF9vZmZzZXQ7IHlvZmZzZXQgPCBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3c7CisgICAgICAgeW9mZnNldCsrKSB7CisgICAgZm9yIChNQ1VfY29sX251bSA9IGNvZWYtPm1jdV9jdHI7IE1DVV9jb2xfbnVtIDwgY2luZm8tPk1DVXNfcGVyX3JvdzsKKwkgTUNVX2NvbF9udW0rKykgeworICAgICAgLyogQ29uc3RydWN0IGxpc3Qgb2YgcG9pbnRlcnMgdG8gRENUIGJsb2NrcyBiZWxvbmdpbmcgdG8gdGhpcyBNQ1UgKi8KKyAgICAgIGJsa24gPSAwOwkJCS8qIGluZGV4IG9mIGN1cnJlbnQgRENUIGJsb2NrIHdpdGhpbiBNQ1UgKi8KKyAgICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisJY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKwlzdGFydF9jb2wgPSBNQ1VfY29sX251bSAqIGNvbXBwdHItPk1DVV93aWR0aDsKKwlmb3IgKHlpbmRleCA9IDA7IHlpbmRleCA8IGNvbXBwdHItPk1DVV9oZWlnaHQ7IHlpbmRleCsrKSB7CisJICBidWZmZXJfcHRyID0gYnVmZmVyW2NpXVt5aW5kZXgreW9mZnNldF0gKyBzdGFydF9jb2w7CisJICBmb3IgKHhpbmRleCA9IDA7IHhpbmRleCA8IGNvbXBwdHItPk1DVV93aWR0aDsgeGluZGV4KyspIHsKKwkgICAgY29lZi0+TUNVX2J1ZmZlcltibGtuKytdID0gYnVmZmVyX3B0cisrOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIC8qIFRyeSB0byB3cml0ZSB0aGUgTUNVLiAqLworICAgICAgaWYgKCEgKCpjaW5mby0+ZW50cm9weS0+ZW5jb2RlX21jdSkgKGNpbmZvLCBjb2VmLT5NQ1VfYnVmZmVyKSkgeworCS8qIFN1c3BlbnNpb24gZm9yY2VkOyB1cGRhdGUgc3RhdGUgY291bnRlcnMgYW5kIGV4aXQgKi8KKwljb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSB5b2Zmc2V0OworCWNvZWYtPm1jdV9jdHIgPSBNQ1VfY29sX251bTsKKwlyZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgfQorICAgIC8qIENvbXBsZXRlZCBhbiBNQ1Ugcm93LCBidXQgcGVyaGFwcyBub3QgYW4gaU1DVSByb3cgKi8KKyAgICBjb2VmLT5tY3VfY3RyID0gMDsKKyAgfQorICAvKiBDb21wbGV0ZWQgdGhlIGlNQ1Ugcm93LCBhZHZhbmNlIGNvdW50ZXJzIGZvciBuZXh0IG9uZSAqLworICBjb2VmLT5pTUNVX3Jvd19udW0rKzsKKyAgc3RhcnRfaU1DVV9yb3coY2luZm8pOworICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIEZVTExfQ09FRl9CVUZGRVJfU1VQUE9SVEVEICovCisKKworLyoKKyAqIEluaXRpYWxpemUgY29lZmZpY2llbnQgYnVmZmVyIGNvbnRyb2xsZXIuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9jX2NvZWZfY29udHJvbGxlciAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikKK3sKKyAgbXlfY29lZl9wdHIgY29lZjsKKworICBjb2VmID0gKG15X2NvZWZfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKG15X2NvZWZfY29udHJvbGxlcikpOworICBjaW5mby0+Y29lZiA9IChzdHJ1Y3QganBlZ19jX2NvZWZfY29udHJvbGxlciAqKSBjb2VmOworICBjb2VmLT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfY29lZjsKKworICAvKiBDcmVhdGUgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlci4gKi8KKyAgaWYgKG5lZWRfZnVsbF9idWZmZXIpIHsKKyNpZmRlZiBGVUxMX0NPRUZfQlVGRkVSX1NVUFBPUlRFRAorICAgIC8qIEFsbG9jYXRlIGEgZnVsbC1pbWFnZSB2aXJ0dWFsIGFycmF5IGZvciBlYWNoIGNvbXBvbmVudCwgKi8KKyAgICAvKiBwYWRkZWQgdG8gYSBtdWx0aXBsZSBvZiBzYW1wX2ZhY3RvciBEQ1QgYmxvY2tzIGluIGVhY2ggZGlyZWN0aW9uLiAqLworICAgIGludCBjaTsKKyAgICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworCisgICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKwkgY2krKywgY29tcHB0cisrKSB7CisgICAgICBjb2VmLT53aG9sZV9pbWFnZVtjaV0gPSAoKmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9iYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgRkFMU0UsCisJIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcywKKwkJCQkobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciksCisJIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MsCisJCQkJKGxvbmcpIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpLAorCSAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7CisgICAgfQorI2Vsc2UKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisjZW5kaWYKKyAgfSBlbHNlIHsKKyAgICAvKiBXZSBvbmx5IG5lZWQgYSBzaW5nbGUtTUNVIGJ1ZmZlci4gKi8KKyAgICBKQkxPQ0tST1cgYnVmZmVyOworICAgIGludCBpOworCisgICAgYnVmZmVyID0gKEpCTE9DS1JPVykKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICBDX01BWF9CTE9DS1NfSU5fTUNVICogU0laRU9GKEpCTE9DSykpOworICAgIGZvciAoaSA9IDA7IGkgPCBDX01BWF9CTE9DS1NfSU5fTUNVOyBpKyspIHsKKyAgICAgIGNvZWYtPk1DVV9idWZmZXJbaV0gPSBidWZmZXIgKyBpOworICAgIH0KKyAgICBjb2VmLT53aG9sZV9pbWFnZVswXSA9IE5VTEw7IC8qIGZsYWcgZm9yIG5vIHZpcnR1YWwgYXJyYXlzICovCisgIH0KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY2NvbG9yLmMgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamNjb2xvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOGE0YjUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamNjb2xvci5jCkBAIC0wLDAgKzEsNDU5IEBACisvKgorICogamNjb2xvci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgaW5wdXQgY29sb3JzcGFjZSBjb252ZXJzaW9uIHJvdXRpbmVzLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKiBQcml2YXRlIHN1Ym9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2NvbG9yX2NvbnZlcnRlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBQcml2YXRlIHN0YXRlIGZvciBSR0ItPllDQyBjb252ZXJzaW9uICovCisgIElOVDMyICogcmdiX3ljY190YWI7CQkvKiA9PiB0YWJsZSBmb3IgUkdCIHRvIFlDYkNyIGNvbnZlcnNpb24gKi8KK30gbXlfY29sb3JfY29udmVydGVyOworCit0eXBlZGVmIG15X2NvbG9yX2NvbnZlcnRlciAqIG15X2Njb252ZXJ0X3B0cjsKKworCisvKioqKioqKioqKioqKioqKiBSR0IgLT4gWUNiQ3IgY29udmVyc2lvbjogbW9zdCBjb21tb24gY2FzZSAqKioqKioqKioqKioqKi8KKworLyoKKyAqIFlDYkNyIGlzIGRlZmluZWQgcGVyIENDSVIgNjAxLTEsIGV4Y2VwdCB0aGF0IENiIGFuZCBDciBhcmUKKyAqIG5vcm1hbGl6ZWQgdG8gdGhlIHJhbmdlIDAuLk1BWEpTQU1QTEUgcmF0aGVyIHRoYW4gLTAuNSAuLiAwLjUuCisgKiBUaGUgY29udmVyc2lvbiBlcXVhdGlvbnMgdG8gYmUgaW1wbGVtZW50ZWQgYXJlIHRoZXJlZm9yZQorICoJWSAgPSAgMC4yOTkwMCAqIFIgKyAwLjU4NzAwICogRyArIDAuMTE0MDAgKiBCCisgKglDYiA9IC0wLjE2ODc0ICogUiAtIDAuMzMxMjYgKiBHICsgMC41MDAwMCAqIEIgICsgQ0VOVEVSSlNBTVBMRQorICoJQ3IgPSAgMC41MDAwMCAqIFIgLSAwLjQxODY5ICogRyAtIDAuMDgxMzEgKiBCICArIENFTlRFUkpTQU1QTEUKKyAqIChUaGVzZSBudW1iZXJzIGFyZSBkZXJpdmVkIGZyb20gVElGRiA2LjAgc2VjdGlvbiAyMSwgZGF0ZWQgMy1KdW5lLTkyLikKKyAqIE5vdGU6IG9sZGVyIHZlcnNpb25zIG9mIHRoZSBJSkcgY29kZSB1c2VkIGEgemVybyBvZmZzZXQgb2YgTUFYSlNBTVBMRS8yLAorICogcmF0aGVyIHRoYW4gQ0VOVEVSSlNBTVBMRSwgZm9yIENiIGFuZCBDci4gIFRoaXMgZ2F2ZSBlcXVhbCBwb3NpdGl2ZSBhbmQKKyAqIG5lZ2F0aXZlIHN3aW5ncyBmb3IgQ2IvQ3IsIGJ1dCBtZWFudCB0aGF0IGdyYXlzY2FsZSB2YWx1ZXMgKENiPUNyPTApCisgKiB3ZXJlIG5vdCByZXByZXNlbnRlZCBleGFjdGx5LiAgTm93IHdlIHNhY3JpZmljZSBleGFjdCByZXByZXNlbnRhdGlvbiBvZgorICogbWF4aW11bSByZWQgYW5kIG1heGltdW0gYmx1ZSBpbiBvcmRlciB0byBnZXQgZXhhY3QgZ3JheXNjYWxlcy4KKyAqCisgKiBUbyBhdm9pZCBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljLCB3ZSByZXByZXNlbnQgdGhlIGZyYWN0aW9uYWwgY29uc3RhbnRzCisgKiBhcyBpbnRlZ2VycyBzY2FsZWQgdXAgYnkgMl4xNiAoYWJvdXQgNCBkaWdpdHMgcHJlY2lzaW9uKTsgd2UgaGF2ZSB0byBkaXZpZGUKKyAqIHRoZSBwcm9kdWN0cyBieSAyXjE2LCB3aXRoIGFwcHJvcHJpYXRlIHJvdW5kaW5nLCB0byBnZXQgdGhlIGNvcnJlY3QgYW5zd2VyLgorICoKKyAqIEZvciBldmVuIG1vcmUgc3BlZWQsIHdlIGF2b2lkIGRvaW5nIGFueSBtdWx0aXBsaWNhdGlvbnMgaW4gdGhlIGlubmVyIGxvb3AKKyAqIGJ5IHByZWNhbGN1bGF0aW5nIHRoZSBjb25zdGFudHMgdGltZXMgUixHLEIgZm9yIGFsbCBwb3NzaWJsZSB2YWx1ZXMuCisgKiBGb3IgOC1iaXQgSlNBTVBMRXMgdGhpcyBpcyB2ZXJ5IHJlYXNvbmFibGUgKG9ubHkgMjU2IGVudHJpZXMgcGVyIHRhYmxlKTsKKyAqIGZvciAxMi1iaXQgc2FtcGxlcyBpdCBpcyBzdGlsbCBhY2NlcHRhYmxlLiAgSXQncyBub3QgdmVyeSByZWFzb25hYmxlIGZvcgorICogMTYtYml0IHNhbXBsZXMsIGJ1dCBpZiB5b3Ugd2FudCBsb3NzbGVzcyBzdG9yYWdlIHlvdSBzaG91bGRuJ3QgYmUgY2hhbmdpbmcKKyAqIGNvbG9yc3BhY2UgYW55d2F5LgorICogVGhlIENFTlRFUkpTQU1QTEUgb2Zmc2V0cyBhbmQgdGhlIHJvdW5kaW5nIGZ1ZGdlLWZhY3RvciBvZiAwLjUgYXJlIGluY2x1ZGVkCisgKiBpbiB0aGUgdGFibGVzIHRvIHNhdmUgYWRkaW5nIHRoZW0gc2VwYXJhdGVseSBpbiB0aGUgaW5uZXIgbG9vcC4KKyAqLworCisjZGVmaW5lIFNDQUxFQklUUwkxNgkvKiBzcGVlZGllc3QgcmlnaHQtc2hpZnQgb24gc29tZSBtYWNoaW5lcyAqLworI2RlZmluZSBDQkNSX09GRlNFVAkoKElOVDMyKSBDRU5URVJKU0FNUExFIDw8IFNDQUxFQklUUykKKyNkZWZpbmUgT05FX0hBTEYJKChJTlQzMikgMSA8PCAoU0NBTEVCSVRTLTEpKQorI2RlZmluZSBGSVgoeCkJCSgoSU5UMzIpICgoeCkgKiAoMUw8PFNDQUxFQklUUykgKyAwLjUpKQorCisvKiBXZSBhbGxvY2F0ZSBvbmUgYmlnIHRhYmxlIGFuZCBkaXZpZGUgaXQgdXAgaW50byBlaWdodCBwYXJ0cywgaW5zdGVhZCBvZgorICogZG9pbmcgZWlnaHQgYWxsb2Nfc21hbGwgcmVxdWVzdHMuICBUaGlzIGxldHMgdXMgdXNlIGEgc2luZ2xlIHRhYmxlIGJhc2UKKyAqIGFkZHJlc3MsIHdoaWNoIGNhbiBiZSBoZWxkIGluIGEgcmVnaXN0ZXIgaW4gdGhlIGlubmVyIGxvb3BzIG9uIG1hbnkKKyAqIG1hY2hpbmVzIChtb3JlIHRoYW4gY2FuIGhvbGQgYWxsIGVpZ2h0IGFkZHJlc3NlcywgYW55d2F5KS4KKyAqLworCisjZGVmaW5lIFJfWV9PRkYJCTAJCQkvKiBvZmZzZXQgdG8gUiA9PiBZIHNlY3Rpb24gKi8KKyNkZWZpbmUgR19ZX09GRgkJKDEqKE1BWEpTQU1QTEUrMSkpCS8qIG9mZnNldCB0byBHID0+IFkgc2VjdGlvbiAqLworI2RlZmluZSBCX1lfT0ZGCQkoMiooTUFYSlNBTVBMRSsxKSkJLyogZXRjLiAqLworI2RlZmluZSBSX0NCX09GRgkoMyooTUFYSlNBTVBMRSsxKSkKKyNkZWZpbmUgR19DQl9PRkYJKDQqKE1BWEpTQU1QTEUrMSkpCisjZGVmaW5lIEJfQ0JfT0ZGCSg1KihNQVhKU0FNUExFKzEpKQorI2RlZmluZSBSX0NSX09GRglCX0NCX09GRgkJLyogQj0+Q2IsIFI9PkNyIGFyZSB0aGUgc2FtZSAqLworI2RlZmluZSBHX0NSX09GRgkoNiooTUFYSlNBTVBMRSsxKSkKKyNkZWZpbmUgQl9DUl9PRkYJKDcqKE1BWEpTQU1QTEUrMSkpCisjZGVmaW5lIFRBQkxFX1NJWkUJKDgqKE1BWEpTQU1QTEUrMSkpCisKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIFJHQi0+WUNDIGNvbG9yc3BhY2UgY29udmVyc2lvbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3JnYl95Y2Nfc3RhcnQgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7CisgIElOVDMyICogcmdiX3ljY190YWI7CisgIElOVDMyIGk7CisKKyAgLyogQWxsb2NhdGUgYW5kIGZpbGwgaW4gdGhlIGNvbnZlcnNpb24gdGFibGVzLiAqLworICBjY29udmVydC0+cmdiX3ljY190YWIgPSByZ2JfeWNjX3RhYiA9IChJTlQzMiAqKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJKFRBQkxFX1NJWkUgKiBTSVpFT0YoSU5UMzIpKSk7CisKKyAgZm9yIChpID0gMDsgaSA8PSBNQVhKU0FNUExFOyBpKyspIHsKKyAgICByZ2JfeWNjX3RhYltpK1JfWV9PRkZdID0gRklYKDAuMjk5MDApICogaTsKKyAgICByZ2JfeWNjX3RhYltpK0dfWV9PRkZdID0gRklYKDAuNTg3MDApICogaTsKKyAgICByZ2JfeWNjX3RhYltpK0JfWV9PRkZdID0gRklYKDAuMTE0MDApICogaSAgICAgKyBPTkVfSEFMRjsKKyAgICByZ2JfeWNjX3RhYltpK1JfQ0JfT0ZGXSA9ICgtRklYKDAuMTY4NzQpKSAqIGk7CisgICAgcmdiX3ljY190YWJbaStHX0NCX09GRl0gPSAoLUZJWCgwLjMzMTI2KSkgKiBpOworICAgIC8qIFdlIHVzZSBhIHJvdW5kaW5nIGZ1ZGdlLWZhY3RvciBvZiAwLjUtZXBzaWxvbiBmb3IgQ2IgYW5kIENyLgorICAgICAqIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBtYXhpbXVtIG91dHB1dCB3aWxsIHJvdW5kIHRvIE1BWEpTQU1QTEUKKyAgICAgKiBub3QgTUFYSlNBTVBMRSsxLCBhbmQgdGh1cyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gcmFuZ2UtbGltaXQuCisgICAgICovCisgICAgcmdiX3ljY190YWJbaStCX0NCX09GRl0gPSBGSVgoMC41MDAwMCkgKiBpICAgICsgQ0JDUl9PRkZTRVQgKyBPTkVfSEFMRi0xOworLyogIEI9PkNiIGFuZCBSPT5DciB0YWJsZXMgYXJlIHRoZSBzYW1lCisgICAgcmdiX3ljY190YWJbaStSX0NSX09GRl0gPSBGSVgoMC41MDAwMCkgKiBpICAgICsgQ0JDUl9PRkZTRVQgKyBPTkVfSEFMRi0xOworKi8KKyAgICByZ2JfeWNjX3RhYltpK0dfQ1JfT0ZGXSA9ICgtRklYKDAuNDE4NjkpKSAqIGk7CisgICAgcmdiX3ljY190YWJbaStCX0NSX09GRl0gPSAoLUZJWCgwLjA4MTMxKSkgKiBpOworICB9Cit9CisKKworLyoKKyAqIENvbnZlcnQgc29tZSByb3dzIG9mIHNhbXBsZXMgdG8gdGhlIEpQRUcgY29sb3JzcGFjZS4KKyAqCisgKiBOb3RlIHRoYXQgd2UgY2hhbmdlIGZyb20gdGhlIGFwcGxpY2F0aW9uJ3MgaW50ZXJsZWF2ZWQtcGl4ZWwgZm9ybWF0CisgKiB0byBvdXIgaW50ZXJuYWwgbm9uaW50ZXJsZWF2ZWQsIG9uZS1wbGFuZS1wZXItY29tcG9uZW50IGZvcm1hdC4KKyAqIFRoZSBpbnB1dCBidWZmZXIgaXMgdGhlcmVmb3JlIHRocmVlIHRpbWVzIGFzIHdpZGUgYXMgdGhlIG91dHB1dCBidWZmZXIuCisgKgorICogQSBzdGFydGluZyByb3cgb2Zmc2V0IGlzIHByb3ZpZGVkIG9ubHkgZm9yIHRoZSBvdXRwdXQgYnVmZmVyLiAgVGhlIGNhbGxlcgorICogY2FuIGVhc2lseSBhZGp1c3QgdGhlIHBhc3NlZCBpbnB1dF9idWYgdmFsdWUgdG8gYWNjb21tb2RhdGUgYW55IHJvdworICogb2Zmc2V0IHJlcXVpcmVkIG9uIHRoYXQgc2lkZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3JnYl95Y2NfY29udmVydCAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCSBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAorCQkgSkRJTUVOU0lPTiBvdXRwdXRfcm93LCBpbnQgbnVtX3Jvd3MpCit7CisgIG15X2Njb252ZXJ0X3B0ciBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpIGNpbmZvLT5jY29udmVydDsKKyAgcmVnaXN0ZXIgaW50IHIsIGcsIGI7CisgIHJlZ2lzdGVyIElOVDMyICogY3RhYiA9IGNjb252ZXJ0LT5yZ2JfeWNjX3RhYjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjAsIG91dHB0cjEsIG91dHB0cjI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPmltYWdlX3dpZHRoOworCisgIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKKyAgICBpbnB0ciA9ICppbnB1dF9idWYrKzsKKyAgICBvdXRwdHIwID0gb3V0cHV0X2J1ZlswXVtvdXRwdXRfcm93XTsKKyAgICBvdXRwdHIxID0gb3V0cHV0X2J1ZlsxXVtvdXRwdXRfcm93XTsKKyAgICBvdXRwdHIyID0gb3V0cHV0X2J1ZlsyXVtvdXRwdXRfcm93XTsKKyAgICBvdXRwdXRfcm93Kys7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKKyAgICAgIHIgPSBHRVRKU0FNUExFKGlucHRyW1JHQl9SRURdKTsKKyAgICAgIGcgPSBHRVRKU0FNUExFKGlucHRyW1JHQl9HUkVFTl0pOworICAgICAgYiA9IEdFVEpTQU1QTEUoaW5wdHJbUkdCX0JMVUVdKTsKKyAgICAgIGlucHRyICs9IFJHQl9QSVhFTFNJWkU7CisgICAgICAvKiBJZiB0aGUgaW5wdXRzIGFyZSAwLi5NQVhKU0FNUExFLCB0aGUgb3V0cHV0cyBvZiB0aGVzZSBlcXVhdGlvbnMKKyAgICAgICAqIG11c3QgYmUgdG9vOyB3ZSBkbyBub3QgbmVlZCBhbiBleHBsaWNpdCByYW5nZS1saW1pdGluZyBvcGVyYXRpb24uCisgICAgICAgKiBIZW5jZSB0aGUgdmFsdWUgYmVpbmcgc2hpZnRlZCBpcyBuZXZlciBuZWdhdGl2ZSwgYW5kIHdlIGRvbid0CisgICAgICAgKiBuZWVkIHRoZSBnZW5lcmFsIFJJR0hUX1NISUZUIG1hY3JvLgorICAgICAgICovCisgICAgICAvKiBZICovCisgICAgICBvdXRwdHIwW2NvbF0gPSAoSlNBTVBMRSkKKwkJKChjdGFiW3IrUl9ZX09GRl0gKyBjdGFiW2crR19ZX09GRl0gKyBjdGFiW2IrQl9ZX09GRl0pCisJCSA+PiBTQ0FMRUJJVFMpOworICAgICAgLyogQ2IgKi8KKyAgICAgIG91dHB0cjFbY29sXSA9IChKU0FNUExFKQorCQkoKGN0YWJbcitSX0NCX09GRl0gKyBjdGFiW2crR19DQl9PRkZdICsgY3RhYltiK0JfQ0JfT0ZGXSkKKwkJID4+IFNDQUxFQklUUyk7CisgICAgICAvKiBDciAqLworICAgICAgb3V0cHRyMltjb2xdID0gKEpTQU1QTEUpCisJCSgoY3RhYltyK1JfQ1JfT0ZGXSArIGN0YWJbZytHX0NSX09GRl0gKyBjdGFiW2IrQl9DUl9PRkZdKQorCQkgPj4gU0NBTEVCSVRTKTsKKyAgICB9CisgIH0KK30KKworCisvKioqKioqKioqKioqKioqKiBDYXNlcyBvdGhlciB0aGFuIFJHQiAtPiBZQ2JDciAqKioqKioqKioqKioqKi8KKworCisvKgorICogQ29udmVydCBzb21lIHJvd3Mgb2Ygc2FtcGxlcyB0byB0aGUgSlBFRyBjb2xvcnNwYWNlLgorICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgUkdCLT5ncmF5c2NhbGUgY29udmVyc2lvbiwgd2hpY2ggaXMgdGhlIHNhbWUKKyAqIGFzIHRoZSBSR0ItPlkgcG9ydGlvbiBvZiBSR0ItPllDYkNyLgorICogV2UgYXNzdW1lIHJnYl95Y2Nfc3RhcnQgaGFzIGJlZW4gY2FsbGVkICh3ZSBvbmx5IHVzZSB0aGUgWSB0YWJsZXMpLgorICovCisKK01FVEhPRERFRih2b2lkKQorcmdiX2dyYXlfY29udmVydCAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCSAgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKKwkJICBKRElNRU5TSU9OIG91dHB1dF9yb3csIGludCBudW1fcm93cykKK3sKKyAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OworICByZWdpc3RlciBpbnQgciwgZywgYjsKKyAgcmVnaXN0ZXIgSU5UMzIgKiBjdGFiID0gY2NvbnZlcnQtPnJnYl95Y2NfdGFiOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5pbWFnZV93aWR0aDsKKworICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7CisgICAgaW5wdHIgPSAqaW5wdXRfYnVmKys7CisgICAgb3V0cHRyID0gb3V0cHV0X2J1ZlswXVtvdXRwdXRfcm93XTsKKyAgICBvdXRwdXRfcm93Kys7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKKyAgICAgIHIgPSBHRVRKU0FNUExFKGlucHRyW1JHQl9SRURdKTsKKyAgICAgIGcgPSBHRVRKU0FNUExFKGlucHRyW1JHQl9HUkVFTl0pOworICAgICAgYiA9IEdFVEpTQU1QTEUoaW5wdHJbUkdCX0JMVUVdKTsKKyAgICAgIGlucHRyICs9IFJHQl9QSVhFTFNJWkU7CisgICAgICAvKiBZICovCisgICAgICBvdXRwdHJbY29sXSA9IChKU0FNUExFKQorCQkoKGN0YWJbcitSX1lfT0ZGXSArIGN0YWJbZytHX1lfT0ZGXSArIGN0YWJbYitCX1lfT0ZGXSkKKwkJID4+IFNDQUxFQklUUyk7CisgICAgfQorICB9Cit9CisKKworLyoKKyAqIENvbnZlcnQgc29tZSByb3dzIG9mIHNhbXBsZXMgdG8gdGhlIEpQRUcgY29sb3JzcGFjZS4KKyAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIEFkb2JlLXN0eWxlIENNWUstPllDQ0sgY29udmVyc2lvbiwKKyAqIHdoZXJlIHdlIGNvbnZlcnQgUj0xLUMsIEc9MS1NLCBhbmQgQj0xLVkgdG8gWUNiQ3IgdXNpbmcgdGhlIHNhbWUKKyAqIGNvbnZlcnNpb24gYXMgYWJvdmUsIHdoaWxlIHBhc3NpbmcgSyAoYmxhY2spIHVuY2hhbmdlZC4KKyAqIFdlIGFzc3VtZSByZ2JfeWNjX3N0YXJ0IGhhcyBiZWVuIGNhbGxlZC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2NteWtfeWNja19jb252ZXJ0IChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJICAgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKKwkJICAgSkRJTUVOU0lPTiBvdXRwdXRfcm93LCBpbnQgbnVtX3Jvd3MpCit7CisgIG15X2Njb252ZXJ0X3B0ciBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpIGNpbmZvLT5jY29udmVydDsKKyAgcmVnaXN0ZXIgaW50IHIsIGcsIGI7CisgIHJlZ2lzdGVyIElOVDMyICogY3RhYiA9IGNjb252ZXJ0LT5yZ2JfeWNjX3RhYjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjAsIG91dHB0cjEsIG91dHB0cjIsIG91dHB0cjM7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPmltYWdlX3dpZHRoOworCisgIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKKyAgICBpbnB0ciA9ICppbnB1dF9idWYrKzsKKyAgICBvdXRwdHIwID0gb3V0cHV0X2J1ZlswXVtvdXRwdXRfcm93XTsKKyAgICBvdXRwdHIxID0gb3V0cHV0X2J1ZlsxXVtvdXRwdXRfcm93XTsKKyAgICBvdXRwdHIyID0gb3V0cHV0X2J1ZlsyXVtvdXRwdXRfcm93XTsKKyAgICBvdXRwdHIzID0gb3V0cHV0X2J1ZlszXVtvdXRwdXRfcm93XTsKKyAgICBvdXRwdXRfcm93Kys7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKKyAgICAgIHIgPSBNQVhKU0FNUExFIC0gR0VUSlNBTVBMRShpbnB0clswXSk7CisgICAgICBnID0gTUFYSlNBTVBMRSAtIEdFVEpTQU1QTEUoaW5wdHJbMV0pOworICAgICAgYiA9IE1BWEpTQU1QTEUgLSBHRVRKU0FNUExFKGlucHRyWzJdKTsKKyAgICAgIC8qIEsgcGFzc2VzIHRocm91Z2ggYXMtaXMgKi8KKyAgICAgIG91dHB0cjNbY29sXSA9IGlucHRyWzNdOwkvKiBkb24ndCBuZWVkIEdFVEpTQU1QTEUgaGVyZSAqLworICAgICAgaW5wdHIgKz0gNDsKKyAgICAgIC8qIElmIHRoZSBpbnB1dHMgYXJlIDAuLk1BWEpTQU1QTEUsIHRoZSBvdXRwdXRzIG9mIHRoZXNlIGVxdWF0aW9ucworICAgICAgICogbXVzdCBiZSB0b287IHdlIGRvIG5vdCBuZWVkIGFuIGV4cGxpY2l0IHJhbmdlLWxpbWl0aW5nIG9wZXJhdGlvbi4KKyAgICAgICAqIEhlbmNlIHRoZSB2YWx1ZSBiZWluZyBzaGlmdGVkIGlzIG5ldmVyIG5lZ2F0aXZlLCBhbmQgd2UgZG9uJ3QKKyAgICAgICAqIG5lZWQgdGhlIGdlbmVyYWwgUklHSFRfU0hJRlQgbWFjcm8uCisgICAgICAgKi8KKyAgICAgIC8qIFkgKi8KKyAgICAgIG91dHB0cjBbY29sXSA9IChKU0FNUExFKQorCQkoKGN0YWJbcitSX1lfT0ZGXSArIGN0YWJbZytHX1lfT0ZGXSArIGN0YWJbYitCX1lfT0ZGXSkKKwkJID4+IFNDQUxFQklUUyk7CisgICAgICAvKiBDYiAqLworICAgICAgb3V0cHRyMVtjb2xdID0gKEpTQU1QTEUpCisJCSgoY3RhYltyK1JfQ0JfT0ZGXSArIGN0YWJbZytHX0NCX09GRl0gKyBjdGFiW2IrQl9DQl9PRkZdKQorCQkgPj4gU0NBTEVCSVRTKTsKKyAgICAgIC8qIENyICovCisgICAgICBvdXRwdHIyW2NvbF0gPSAoSlNBTVBMRSkKKwkJKChjdGFiW3IrUl9DUl9PRkZdICsgY3RhYltnK0dfQ1JfT0ZGXSArIGN0YWJbYitCX0NSX09GRl0pCisJCSA+PiBTQ0FMRUJJVFMpOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBDb252ZXJ0IHNvbWUgcm93cyBvZiBzYW1wbGVzIHRvIHRoZSBKUEVHIGNvbG9yc3BhY2UuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyBncmF5c2NhbGUgb3V0cHV0IHdpdGggbm8gY29udmVyc2lvbi4KKyAqIFRoZSBzb3VyY2UgY2FuIGJlIGVpdGhlciBwbGFpbiBncmF5c2NhbGUgb3IgWUNiQ3IgKHNpbmNlIFkgPT0gZ3JheSkuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitncmF5c2NhbGVfY29udmVydCAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCSAgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUElNQUdFIG91dHB1dF9idWYsCisJCSAgIEpESU1FTlNJT04gb3V0cHV0X3JvdywgaW50IG51bV9yb3dzKQoreworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5pbWFnZV93aWR0aDsKKyAgaW50IGluc3RyaWRlID0gY2luZm8tPmlucHV0X2NvbXBvbmVudHM7CisKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIGlucHRyID0gKmlucHV0X2J1ZisrOworICAgIG91dHB0ciA9IG91dHB1dF9idWZbMF1bb3V0cHV0X3Jvd107CisgICAgb3V0cHV0X3JvdysrOworICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7CisgICAgICBvdXRwdHJbY29sXSA9IGlucHRyWzBdOwkvKiBkb24ndCBuZWVkIEdFVEpTQU1QTEUoKSBoZXJlICovCisgICAgICBpbnB0ciArPSBpbnN0cmlkZTsKKyAgICB9CisgIH0KK30KKworCisvKgorICogQ29udmVydCBzb21lIHJvd3Mgb2Ygc2FtcGxlcyB0byB0aGUgSlBFRyBjb2xvcnNwYWNlLgorICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgbXVsdGktY29tcG9uZW50IGNvbG9yc3BhY2VzIHdpdGhvdXQgY29udmVyc2lvbi4KKyAqIFdlIGFzc3VtZSBpbnB1dF9jb21wb25lbnRzID09IG51bV9jb21wb25lbnRzLgorICovCisKK01FVEhPRERFRih2b2lkKQorbnVsbF9jb252ZXJ0IChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkgICAgICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAorCSAgICAgIEpESU1FTlNJT04gb3V0cHV0X3JvdywgaW50IG51bV9yb3dzKQoreworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKyAgcmVnaXN0ZXIgaW50IGNpOworICBpbnQgbmMgPSBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7CisKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIC8qIEl0IHNlZW1zIGZhc3Rlc3QgdG8gbWFrZSBhIHNlcGFyYXRlIHBhc3MgZm9yIGVhY2ggY29tcG9uZW50LiAqLworICAgIGZvciAoY2kgPSAwOyBjaSA8IG5jOyBjaSsrKSB7CisgICAgICBpbnB0ciA9ICppbnB1dF9idWY7CisgICAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2NpXVtvdXRwdXRfcm93XTsKKyAgICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7CisJb3V0cHRyW2NvbF0gPSBpbnB0cltjaV07IC8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSgpIGhlcmUgKi8KKwlpbnB0ciArPSBuYzsKKyAgICAgIH0KKyAgICB9CisgICAgaW5wdXRfYnVmKys7CisgICAgb3V0cHV0X3JvdysrOworICB9Cit9CisKKworLyoKKyAqIEVtcHR5IG1ldGhvZCBmb3Igc3RhcnRfcGFzcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK251bGxfbWV0aG9kIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgLyogbm8gd29yayBuZWVkZWQgKi8KK30KKworCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIGlucHV0IGNvbG9yc3BhY2UgY29udmVyc2lvbi4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X2NvbG9yX2NvbnZlcnRlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2Njb252ZXJ0X3B0ciBjY29udmVydDsKKworICBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YobXlfY29sb3JfY29udmVydGVyKSk7CisgIGNpbmZvLT5jY29udmVydCA9IChzdHJ1Y3QganBlZ19jb2xvcl9jb252ZXJ0ZXIgKikgY2NvbnZlcnQ7CisgIC8qIHNldCBzdGFydF9wYXNzIHRvIG51bGwgbWV0aG9kIHVudGlsIHdlIGZpbmQgb3V0IGRpZmZlcmVudGx5ICovCisgIGNjb252ZXJ0LT5wdWIuc3RhcnRfcGFzcyA9IG51bGxfbWV0aG9kOworCisgIC8qIE1ha2Ugc3VyZSBpbnB1dF9jb21wb25lbnRzIGFncmVlcyB3aXRoIGluX2NvbG9yX3NwYWNlICovCisgIHN3aXRjaCAoY2luZm8tPmluX2NvbG9yX3NwYWNlKSB7CisgIGNhc2UgSkNTX0dSQVlTQ0FMRToKKyAgICBpZiAoY2luZm8tPmlucHV0X2NvbXBvbmVudHMgIT0gMSkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0lOX0NPTE9SU1BBQ0UpOworICAgIGJyZWFrOworCisgIGNhc2UgSkNTX1JHQjoKKyNpZiBSR0JfUElYRUxTSVpFICE9IDMKKyAgICBpZiAoY2luZm8tPmlucHV0X2NvbXBvbmVudHMgIT0gUkdCX1BJWEVMU0laRSkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0lOX0NPTE9SU1BBQ0UpOworICAgIGJyZWFrOworI2VuZGlmIC8qIGVsc2Ugc2hhcmUgY29kZSB3aXRoIFlDYkNyICovCisKKyAgY2FzZSBKQ1NfWUNiQ3I6CisgICAgaWYgKGNpbmZvLT5pbnB1dF9jb21wb25lbnRzICE9IDMpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9JTl9DT0xPUlNQQUNFKTsKKyAgICBicmVhazsKKworICBjYXNlIEpDU19DTVlLOgorICBjYXNlIEpDU19ZQ0NLOgorICAgIGlmIChjaW5mby0+aW5wdXRfY29tcG9uZW50cyAhPSA0KQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSU5fQ09MT1JTUEFDRSk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoJCQkvKiBKQ1NfVU5LTk9XTiBjYW4gYmUgYW55dGhpbmcgKi8KKyAgICBpZiAoY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPCAxKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSU5fQ09MT1JTUEFDRSk7CisgICAgYnJlYWs7CisgIH0KKworICAvKiBDaGVjayBudW1fY29tcG9uZW50cywgc2V0IGNvbnZlcnNpb24gbWV0aG9kIGJhc2VkIG9uIHJlcXVlc3RlZCBzcGFjZSAqLworICBzd2l0Y2ggKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlKSB7CisgIGNhc2UgSkNTX0dSQVlTQ0FMRToKKyAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDEpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOworICAgIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSkKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IGdyYXlzY2FsZV9jb252ZXJ0OworICAgIGVsc2UgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7CisgICAgICBjY29udmVydC0+cHViLnN0YXJ0X3Bhc3MgPSByZ2JfeWNjX3N0YXJ0OworICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gcmdiX2dyYXlfY29udmVydDsKKyAgICB9IGVsc2UgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpCisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBncmF5c2NhbGVfY29udmVydDsKKyAgICBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBKQ1NfUkdCOgorICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gMykKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7CisgICAgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCICYmIFJHQl9QSVhFTFNJWkUgPT0gMykKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKKyAgICBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBKQ1NfWUNiQ3I6CisgICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyAhPSAzKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKKyAgICBpZiAoY2luZm8tPmluX2NvbG9yX3NwYWNlID09IEpDU19SR0IpIHsKKyAgICAgIGNjb252ZXJ0LT5wdWIuc3RhcnRfcGFzcyA9IHJnYl95Y2Nfc3RhcnQ7CisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSByZ2JfeWNjX2NvbnZlcnQ7CisgICAgfSBlbHNlIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyKQorICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gbnVsbF9jb252ZXJ0OworICAgIGVsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKKyAgICBicmVhazsKKworICBjYXNlIEpDU19DTVlLOgorICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gNCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7CisgICAgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfQ01ZSykKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKKyAgICBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBKQ1NfWUNDSzoKKyAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDQpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOworICAgIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX0NNWUspIHsKKyAgICAgIGNjb252ZXJ0LT5wdWIuc3RhcnRfcGFzcyA9IHJnYl95Y2Nfc3RhcnQ7CisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBjbXlrX3ljY2tfY29udmVydDsKKyAgICB9IGVsc2UgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfWUNDSykKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKKyAgICBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoJCQkvKiBhbGxvdyBudWxsIGNvbnZlcnNpb24gb2YgSkNTX1VOS05PV04gKi8KKyAgICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgIT0gY2luZm8tPmluX2NvbG9yX3NwYWNlIHx8CisJY2luZm8tPm51bV9jb21wb25lbnRzICE9IGNpbmZvLT5pbnB1dF9jb21wb25lbnRzKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOworICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKKyAgICBicmVhazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjZGN0bWdyLmMgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamNkY3RtZ3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWZhNzliCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjZGN0bWdyLmMKQEAgLTAsMCArMSwzODcgQEAKKy8qCisgKiBqY2RjdG1nci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGZvcndhcmQtRENUIG1hbmFnZW1lbnQgbG9naWMuCisgKiBUaGlzIGNvZGUgc2VsZWN0cyBhIHBhcnRpY3VsYXIgRENUIGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQsCisgKiBhbmQgaXQgcGVyZm9ybXMgcmVsYXRlZCBob3VzZWtlZXBpbmcgY2hvcmVzIGluY2x1ZGluZyBjb2VmZmljaWVudAorICogcXVhbnRpemF0aW9uLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLworCisKKy8qIFByaXZhdGUgc3Vib2JqZWN0IGZvciB0aGlzIG1vZHVsZSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2ZvcndhcmRfZGN0IHB1YjsJLyogcHVibGljIGZpZWxkcyAqLworCisgIC8qIFBvaW50ZXIgdG8gdGhlIERDVCByb3V0aW5lIGFjdHVhbGx5IGluIHVzZSAqLworICBmb3J3YXJkX0RDVF9tZXRob2RfcHRyIGRvX2RjdDsKKworICAvKiBUaGUgYWN0dWFsIHBvc3QtRENUIGRpdmlzb3JzIC0tLSBub3QgaWRlbnRpY2FsIHRvIHRoZSBxdWFudCB0YWJsZQorICAgKiBlbnRyaWVzLCBiZWNhdXNlIG9mIHNjYWxpbmcgKGVzcGVjaWFsbHkgZm9yIGFuIHVubm9ybWFsaXplZCBEQ1QpLgorICAgKiBFYWNoIHRhYmxlIGlzIGdpdmVuIGluIG5vcm1hbCBhcnJheSBvcmRlci4KKyAgICovCisgIERDVEVMRU0gKiBkaXZpc29yc1tOVU1fUVVBTlRfVEJMU107CisKKyNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECisgIC8qIFNhbWUgYXMgYWJvdmUgZm9yIHRoZSBmbG9hdGluZy1wb2ludCBjYXNlLiAqLworICBmbG9hdF9EQ1RfbWV0aG9kX3B0ciBkb19mbG9hdF9kY3Q7CisgIEZBU1RfRkxPQVQgKiBmbG9hdF9kaXZpc29yc1tOVU1fUVVBTlRfVEJMU107CisjZW5kaWYKK30gbXlfZmRjdF9jb250cm9sbGVyOworCit0eXBlZGVmIG15X2ZkY3RfY29udHJvbGxlciAqIG15X2ZkY3RfcHRyOworCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhIHByb2Nlc3NpbmcgcGFzcy4KKyAqIFZlcmlmeSB0aGF0IGFsbCByZWZlcmVuY2VkIFEtdGFibGVzIGFyZSBwcmVzZW50LCBhbmQgc2V0IHVwCisgKiB0aGUgZGl2aXNvciB0YWJsZSBmb3IgZWFjaCBvbmUuCisgKiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgRENUIG9mIGFsbCBjb21wb25lbnRzIGlzIGRvbmUgZHVyaW5nCisgKiB0aGUgZmlyc3QgcGFzcywgZXZlbiBpZiBvbmx5IHNvbWUgY29tcG9uZW50cyB3aWxsIGJlIG91dHB1dCBpbiB0aGUKKyAqIGZpcnN0IHNjYW4uICBIZW5jZSBhbGwgY29tcG9uZW50cyBzaG91bGQgYmUgZXhhbWluZWQgaGVyZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X3Bhc3NfZmRjdG1nciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2ZkY3RfcHRyIGZkY3QgPSAobXlfZmRjdF9wdHIpIGNpbmZvLT5mZGN0OworICBpbnQgY2ksIHF0YmxubywgaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgSlFVQU5UX1RCTCAqIHF0Ymw7CisgIERDVEVMRU0gKiBkdGJsOworCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgcXRibG5vID0gY29tcHB0ci0+cXVhbnRfdGJsX25vOworICAgIC8qIE1ha2Ugc3VyZSBzcGVjaWZpZWQgcXVhbnRpemF0aW9uIHRhYmxlIGlzIHByZXNlbnQgKi8KKyAgICBpZiAocXRibG5vIDwgMCB8fCBxdGJsbm8gPj0gTlVNX1FVQU5UX1RCTFMgfHwKKwljaW5mby0+cXVhbnRfdGJsX3B0cnNbcXRibG5vXSA9PSBOVUxMKQorICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fUVVBTlRfVEFCTEUsIHF0Ymxubyk7CisgICAgcXRibCA9IGNpbmZvLT5xdWFudF90YmxfcHRyc1txdGJsbm9dOworICAgIC8qIENvbXB1dGUgZGl2aXNvcnMgZm9yIHRoaXMgcXVhbnQgdGFibGUgKi8KKyAgICAvKiBXZSBtYXkgZG8gdGhpcyBtb3JlIHRoYW4gb25jZSBmb3Igc2FtZSB0YWJsZSwgYnV0IGl0J3Mgbm90IGEgYmlnIGRlYWwgKi8KKyAgICBzd2l0Y2ggKGNpbmZvLT5kY3RfbWV0aG9kKSB7CisjaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAorICAgIGNhc2UgSkRDVF9JU0xPVzoKKyAgICAgIC8qIEZvciBMTCZNIElEQ1QgbWV0aG9kLCBkaXZpc29ycyBhcmUgZXF1YWwgdG8gcmF3IHF1YW50aXphdGlvbgorICAgICAgICogY29lZmZpY2llbnRzIG11bHRpcGxpZWQgYnkgOCAodG8gY291bnRlcmFjdCBzY2FsaW5nKS4KKyAgICAgICAqLworICAgICAgaWYgKGZkY3QtPmRpdmlzb3JzW3F0Ymxub10gPT0gTlVMTCkgeworCWZkY3QtPmRpdmlzb3JzW3F0Ymxub10gPSAoRENURUxFTSAqKQorCSAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgICAgICBEQ1RTSVpFMiAqIFNJWkVPRihEQ1RFTEVNKSk7CisgICAgICB9CisgICAgICBkdGJsID0gZmRjdC0+ZGl2aXNvcnNbcXRibG5vXTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7CisJZHRibFtpXSA9ICgoRENURUxFTSkgcXRibC0+cXVhbnR2YWxbaV0pIDw8IDM7CisgICAgICB9CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKKyAgICBjYXNlIEpEQ1RfSUZBU1Q6CisgICAgICB7CisJLyogRm9yIEFBJk4gSURDVCBtZXRob2QsIGRpdmlzb3JzIGFyZSBlcXVhbCB0byBxdWFudGl6YXRpb24KKwkgKiBjb2VmZmljaWVudHMgc2NhbGVkIGJ5IHNjYWxlZmFjdG9yW3Jvd10qc2NhbGVmYWN0b3JbY29sXSwgd2hlcmUKKwkgKiAgIHNjYWxlZmFjdG9yWzBdID0gMQorCSAqICAgc2NhbGVmYWN0b3Jba10gPSBjb3MoaypQSS8xNikgKiBzcXJ0KDIpICAgIGZvciBrPTEuLjcKKwkgKiBXZSBhcHBseSBhIGZ1cnRoZXIgc2NhbGUgZmFjdG9yIG9mIDguCisJICovCisjZGVmaW5lIENPTlNUX0JJVFMgMTQKKwlzdGF0aWMgY29uc3QgSU5UMTYgYWFuc2NhbGVzW0RDVFNJWkUyXSA9IHsKKwkgIC8qIHByZWNvbXB1dGVkIHZhbHVlcyBzY2FsZWQgdXAgYnkgMTQgYml0cyAqLworCSAgMTYzODQsIDIyNzI1LCAyMTQwNywgMTkyNjYsIDE2Mzg0LCAxMjg3MywgIDg4NjcsICA0NTIwLAorCSAgMjI3MjUsIDMxNTIxLCAyOTY5MiwgMjY3MjIsIDIyNzI1LCAxNzg1NSwgMTIyOTksICA2MjcwLAorCSAgMjE0MDcsIDI5NjkyLCAyNzk2OSwgMjUxNzIsIDIxNDA3LCAxNjgxOSwgMTE1ODUsICA1OTA2LAorCSAgMTkyNjYsIDI2NzIyLCAyNTE3MiwgMjI2NTQsIDE5MjY2LCAxNTEzNywgMTA0MjYsICA1MzE1LAorCSAgMTYzODQsIDIyNzI1LCAyMTQwNywgMTkyNjYsIDE2Mzg0LCAxMjg3MywgIDg4NjcsICA0NTIwLAorCSAgMTI4NzMsIDE3ODU1LCAxNjgxOSwgMTUxMzcsIDEyODczLCAxMDExNCwgIDY5NjcsICAzNTUyLAorCSAgIDg4NjcsIDEyMjk5LCAxMTU4NSwgMTA0MjYsICA4ODY3LCAgNjk2NywgIDQ3OTksICAyNDQ2LAorCSAgIDQ1MjAsICA2MjcwLCAgNTkwNiwgIDUzMTUsICA0NTIwLCAgMzU1MiwgIDI0NDYsICAxMjQ3CisJfTsKKwlTSElGVF9URU1QUworCisJaWYgKGZkY3QtPmRpdmlzb3JzW3F0Ymxub10gPT0gTlVMTCkgeworCSAgZmRjdC0+ZGl2aXNvcnNbcXRibG5vXSA9IChEQ1RFTEVNICopCisJICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJCURDVFNJWkUyICogU0laRU9GKERDVEVMRU0pKTsKKwl9CisJZHRibCA9IGZkY3QtPmRpdmlzb3JzW3F0Ymxub107CisJZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKKwkgIGR0YmxbaV0gPSAoRENURUxFTSkKKwkgICAgREVTQ0FMRShNVUxUSVBMWTE2VjE2KChJTlQzMikgcXRibC0+cXVhbnR2YWxbaV0sCisJCQkJICAoSU5UMzIpIGFhbnNjYWxlc1tpXSksCisJCSAgICBDT05TVF9CSVRTLTMpOworCX0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAorICAgIGNhc2UgSkRDVF9GTE9BVDoKKyAgICAgIHsKKwkvKiBGb3IgZmxvYXQgQUEmTiBJRENUIG1ldGhvZCwgZGl2aXNvcnMgYXJlIGVxdWFsIHRvIHF1YW50aXphdGlvbgorCSAqIGNvZWZmaWNpZW50cyBzY2FsZWQgYnkgc2NhbGVmYWN0b3Jbcm93XSpzY2FsZWZhY3Rvcltjb2xdLCB3aGVyZQorCSAqICAgc2NhbGVmYWN0b3JbMF0gPSAxCisJICogICBzY2FsZWZhY3RvcltrXSA9IGNvcyhrKlBJLzE2KSAqIHNxcnQoMikgICAgZm9yIGs9MS4uNworCSAqIFdlIGFwcGx5IGEgZnVydGhlciBzY2FsZSBmYWN0b3Igb2YgOC4KKwkgKiBXaGF0J3MgYWN0dWFsbHkgc3RvcmVkIGlzIDEvZGl2aXNvciBzbyB0aGF0IHRoZSBpbm5lciBsb29wIGNhbgorCSAqIHVzZSBhIG11bHRpcGxpY2F0aW9uIHJhdGhlciB0aGFuIGEgZGl2aXNpb24uCisJICovCisJRkFTVF9GTE9BVCAqIGZkdGJsOworCWludCByb3csIGNvbDsKKwlzdGF0aWMgY29uc3QgZG91YmxlIGFhbnNjYWxlZmFjdG9yW0RDVFNJWkVdID0geworCSAgMS4wLCAxLjM4NzAzOTg0NSwgMS4zMDY1NjI5NjUsIDEuMTc1ODc1NjAyLAorCSAgMS4wLCAwLjc4NTY5NDk1OCwgMC41NDExOTYxMDAsIDAuMjc1ODk5Mzc5CisJfTsKKworCWlmIChmZGN0LT5mbG9hdF9kaXZpc29yc1txdGJsbm9dID09IE5VTEwpIHsKKwkgIGZkY3QtPmZsb2F0X2Rpdmlzb3JzW3F0Ymxub10gPSAoRkFTVF9GTE9BVCAqKQorCSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCQlEQ1RTSVpFMiAqIFNJWkVPRihGQVNUX0ZMT0FUKSk7CisJfQorCWZkdGJsID0gZmRjdC0+ZmxvYXRfZGl2aXNvcnNbcXRibG5vXTsKKwlpID0gMDsKKwlmb3IgKHJvdyA9IDA7IHJvdyA8IERDVFNJWkU7IHJvdysrKSB7CisJICBmb3IgKGNvbCA9IDA7IGNvbCA8IERDVFNJWkU7IGNvbCsrKSB7CisJICAgIGZkdGJsW2ldID0gKEZBU1RfRkxPQVQpCisJICAgICAgKDEuMCAvICgoKGRvdWJsZSkgcXRibC0+cXVhbnR2YWxbaV0gKgorCQkgICAgICAgYWFuc2NhbGVmYWN0b3Jbcm93XSAqIGFhbnNjYWxlZmFjdG9yW2NvbF0gKiA4LjApKSk7CisJICAgIGkrKzsKKwkgIH0KKwl9CisgICAgICB9CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworCisvKgorICogUGVyZm9ybSBmb3J3YXJkIERDVCBvbiBvbmUgb3IgbW9yZSBibG9ja3Mgb2YgYSBjb21wb25lbnQuCisgKgorICogVGhlIGlucHV0IHNhbXBsZXMgYXJlIHRha2VuIGZyb20gdGhlIHNhbXBsZV9kYXRhW10gYXJyYXkgc3RhcnRpbmcgYXQKKyAqIHBvc2l0aW9uIHN0YXJ0X3Jvdy9zdGFydF9jb2wsIGFuZCBtb3ZpbmcgdG8gdGhlIHJpZ2h0IGZvciBhbnkgYWRkaXRpb25hbAorICogYmxvY2tzLiBUaGUgcXVhbnRpemVkIGNvZWZmaWNpZW50cyBhcmUgcmV0dXJuZWQgaW4gY29lZl9ibG9ja3NbXS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZvcndhcmRfRENUIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJICAgICBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKQkxPQ0tST1cgY29lZl9ibG9ja3MsCisJICAgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywgSkRJTUVOU0lPTiBzdGFydF9jb2wsCisJICAgICBKRElNRU5TSU9OIG51bV9ibG9ja3MpCisvKiBUaGlzIHZlcnNpb24gaXMgdXNlZCBmb3IgaW50ZWdlciBEQ1QgaW1wbGVtZW50YXRpb25zLiAqLworeworICAvKiBUaGlzIHJvdXRpbmUgaXMgaGVhdmlseSB1c2VkLCBzbyBpdCdzIHdvcnRoIGNvZGluZyBpdCB0aWdodGx5LiAqLworICBteV9mZGN0X3B0ciBmZGN0ID0gKG15X2ZkY3RfcHRyKSBjaW5mby0+ZmRjdDsKKyAgZm9yd2FyZF9EQ1RfbWV0aG9kX3B0ciBkb19kY3QgPSBmZGN0LT5kb19kY3Q7CisgIERDVEVMRU0gKiBkaXZpc29ycyA9IGZkY3QtPmRpdmlzb3JzW2NvbXBwdHItPnF1YW50X3RibF9ub107CisgIERDVEVMRU0gd29ya3NwYWNlW0RDVFNJWkUyXTsJLyogd29yayBhcmVhIGZvciBGRENUIHN1YnJvdXRpbmUgKi8KKyAgSkRJTUVOU0lPTiBiaTsKKworICBzYW1wbGVfZGF0YSArPSBzdGFydF9yb3c7CS8qIGZvbGQgaW4gdGhlIHZlcnRpY2FsIG9mZnNldCBvbmNlICovCisKKyAgZm9yIChiaSA9IDA7IGJpIDwgbnVtX2Jsb2NrczsgYmkrKywgc3RhcnRfY29sICs9IERDVFNJWkUpIHsKKyAgICAvKiBMb2FkIGRhdGEgaW50byB3b3Jrc3BhY2UsIGFwcGx5aW5nIHVuc2lnbmVkLT5zaWduZWQgY29udmVyc2lvbiAqLworICAgIHsgcmVnaXN0ZXIgRENURUxFTSAqd29ya3NwYWNlcHRyOworICAgICAgcmVnaXN0ZXIgSlNBTVBST1cgZWxlbXB0cjsKKyAgICAgIHJlZ2lzdGVyIGludCBlbGVtcjsKKworICAgICAgd29ya3NwYWNlcHRyID0gd29ya3NwYWNlOworICAgICAgZm9yIChlbGVtciA9IDA7IGVsZW1yIDwgRENUU0laRTsgZWxlbXIrKykgeworCWVsZW1wdHIgPSBzYW1wbGVfZGF0YVtlbGVtcl0gKyBzdGFydF9jb2w7CisjaWYgRENUU0laRSA9PSA4CQkvKiB1bnJvbGwgdGhlIGlubmVyIGxvb3AgKi8KKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKyNlbHNlCisJeyByZWdpc3RlciBpbnQgZWxlbWM7CisJICBmb3IgKGVsZW1jID0gRENUU0laRTsgZWxlbWMgPiAwOyBlbGVtYy0tKSB7CisJICAgICp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOworCSAgfQorCX0KKyNlbmRpZgorICAgICAgfQorICAgIH0KKworICAgIC8qIFBlcmZvcm0gdGhlIERDVCAqLworICAgICgqZG9fZGN0KSAod29ya3NwYWNlKTsKKworICAgIC8qIFF1YW50aXplL2Rlc2NhbGUgdGhlIGNvZWZmaWNpZW50cywgYW5kIHN0b3JlIGludG8gY29lZl9ibG9ja3NbXSAqLworICAgIHsgcmVnaXN0ZXIgRENURUxFTSB0ZW1wLCBxdmFsOworICAgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgICByZWdpc3RlciBKQ09FRlBUUiBvdXRwdXRfcHRyID0gY29lZl9ibG9ja3NbYmldOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgeworCXF2YWwgPSBkaXZpc29yc1tpXTsKKwl0ZW1wID0gd29ya3NwYWNlW2ldOworCS8qIERpdmlkZSB0aGUgY29lZmZpY2llbnQgdmFsdWUgYnkgcXZhbCwgZW5zdXJpbmcgcHJvcGVyIHJvdW5kaW5nLgorCSAqIFNpbmNlIEMgZG9lcyBub3Qgc3BlY2lmeSB0aGUgZGlyZWN0aW9uIG9mIHJvdW5kaW5nIGZvciBuZWdhdGl2ZQorCSAqIHF1b3RpZW50cywgd2UgaGF2ZSB0byBmb3JjZSB0aGUgZGl2aWRlbmQgcG9zaXRpdmUgZm9yIHBvcnRhYmlsaXR5LgorCSAqCisJICogSW4gbW9zdCBmaWxlcywgYXQgbGVhc3QgaGFsZiBvZiB0aGUgb3V0cHV0IHZhbHVlcyB3aWxsIGJlIHplcm8KKwkgKiAoYXQgZGVmYXVsdCBxdWFudGl6YXRpb24gc2V0dGluZ3MsIG1vcmUgbGlrZSB0aHJlZS1xdWFydGVycy4uLikKKwkgKiBzbyB3ZSBzaG91bGQgZW5zdXJlIHRoYXQgdGhpcyBjYXNlIGlzIGZhc3QuICBPbiBtYW55IG1hY2hpbmVzLAorCSAqIGEgY29tcGFyaXNvbiBpcyBlbm91Z2ggY2hlYXBlciB0aGFuIGEgZGl2aWRlIHRvIG1ha2UgYSBzcGVjaWFsIHRlc3QKKwkgKiBhIHdpbi4gIFNpbmNlIGJvdGggaW5wdXRzIHdpbGwgYmUgbm9ubmVnYXRpdmUsIHdlIG5lZWQgb25seSB0ZXN0CisJICogZm9yIGEgPCBiIHRvIGRpc2NvdmVyIHdoZXRoZXIgYS9iIGlzIDAuCisJICogSWYgeW91ciBtYWNoaW5lJ3MgZGl2aXNpb24gaXMgZmFzdCBlbm91Z2gsIGRlZmluZSBGQVNUX0RJVklERS4KKwkgKi8KKyNpZmRlZiBGQVNUX0RJVklERQorI2RlZmluZSBESVZJREVfQlkoYSxiKQlhIC89IGIKKyNlbHNlCisjZGVmaW5lIERJVklERV9CWShhLGIpCWlmIChhID49IGIpIGEgLz0gYjsgZWxzZSBhID0gMAorI2VuZGlmCisJaWYgKHRlbXAgPCAwKSB7CisJICB0ZW1wID0gLXRlbXA7CisJICB0ZW1wICs9IHF2YWw+PjE7CS8qIGZvciByb3VuZGluZyAqLworCSAgRElWSURFX0JZKHRlbXAsIHF2YWwpOworCSAgdGVtcCA9IC10ZW1wOworCX0gZWxzZSB7CisJICB0ZW1wICs9IHF2YWw+PjE7CS8qIGZvciByb3VuZGluZyAqLworCSAgRElWSURFX0JZKHRlbXAsIHF2YWwpOworCX0KKwlvdXRwdXRfcHRyW2ldID0gKEpDT0VGKSB0ZW1wOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKKyNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECisKK01FVEhPRERFRih2b2lkKQorZm9yd2FyZF9EQ1RfZmxvYXQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkJICAgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkJMT0NLUk9XIGNvZWZfYmxvY2tzLAorCQkgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywgSkRJTUVOU0lPTiBzdGFydF9jb2wsCisJCSAgIEpESU1FTlNJT04gbnVtX2Jsb2NrcykKKy8qIFRoaXMgdmVyc2lvbiBpcyB1c2VkIGZvciBmbG9hdGluZy1wb2ludCBEQ1QgaW1wbGVtZW50YXRpb25zLiAqLworeworICAvKiBUaGlzIHJvdXRpbmUgaXMgaGVhdmlseSB1c2VkLCBzbyBpdCdzIHdvcnRoIGNvZGluZyBpdCB0aWdodGx5LiAqLworICBteV9mZGN0X3B0ciBmZGN0ID0gKG15X2ZkY3RfcHRyKSBjaW5mby0+ZmRjdDsKKyAgZmxvYXRfRENUX21ldGhvZF9wdHIgZG9fZGN0ID0gZmRjdC0+ZG9fZmxvYXRfZGN0OworICBGQVNUX0ZMT0FUICogZGl2aXNvcnMgPSBmZGN0LT5mbG9hdF9kaXZpc29yc1tjb21wcHRyLT5xdWFudF90Ymxfbm9dOworICBGQVNUX0ZMT0FUIHdvcmtzcGFjZVtEQ1RTSVpFMl07IC8qIHdvcmsgYXJlYSBmb3IgRkRDVCBzdWJyb3V0aW5lICovCisgIEpESU1FTlNJT04gYmk7CisKKyAgc2FtcGxlX2RhdGEgKz0gc3RhcnRfcm93OwkvKiBmb2xkIGluIHRoZSB2ZXJ0aWNhbCBvZmZzZXQgb25jZSAqLworCisgIGZvciAoYmkgPSAwOyBiaSA8IG51bV9ibG9ja3M7IGJpKyssIHN0YXJ0X2NvbCArPSBEQ1RTSVpFKSB7CisgICAgLyogTG9hZCBkYXRhIGludG8gd29ya3NwYWNlLCBhcHBseWluZyB1bnNpZ25lZC0+c2lnbmVkIGNvbnZlcnNpb24gKi8KKyAgICB7IHJlZ2lzdGVyIEZBU1RfRkxPQVQgKndvcmtzcGFjZXB0cjsKKyAgICAgIHJlZ2lzdGVyIEpTQU1QUk9XIGVsZW1wdHI7CisgICAgICByZWdpc3RlciBpbnQgZWxlbXI7CisKKyAgICAgIHdvcmtzcGFjZXB0ciA9IHdvcmtzcGFjZTsKKyAgICAgIGZvciAoZWxlbXIgPSAwOyBlbGVtciA8IERDVFNJWkU7IGVsZW1yKyspIHsKKwllbGVtcHRyID0gc2FtcGxlX2RhdGFbZWxlbXJdICsgc3RhcnRfY29sOworI2lmIERDVFNJWkUgPT0gOAkJLyogdW5yb2xsIHRoZSBpbm5lciBsb29wICovCisJKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKKwkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOworCSp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7CisJKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKKwkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOworCSp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7CisJKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKKwkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOworI2Vsc2UKKwl7IHJlZ2lzdGVyIGludCBlbGVtYzsKKwkgIGZvciAoZWxlbWMgPSBEQ1RTSVpFOyBlbGVtYyA+IDA7IGVsZW1jLS0pIHsKKwkgICAgKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpCisJICAgICAgKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKKwkgIH0KKwl9CisjZW5kaWYKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQZXJmb3JtIHRoZSBEQ1QgKi8KKyAgICAoKmRvX2RjdCkgKHdvcmtzcGFjZSk7CisKKyAgICAvKiBRdWFudGl6ZS9kZXNjYWxlIHRoZSBjb2VmZmljaWVudHMsIGFuZCBzdG9yZSBpbnRvIGNvZWZfYmxvY2tzW10gKi8KKyAgICB7IHJlZ2lzdGVyIEZBU1RfRkxPQVQgdGVtcDsKKyAgICAgIHJlZ2lzdGVyIGludCBpOworICAgICAgcmVnaXN0ZXIgSkNPRUZQVFIgb3V0cHV0X3B0ciA9IGNvZWZfYmxvY2tzW2JpXTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKKwkvKiBBcHBseSB0aGUgcXVhbnRpemF0aW9uIGFuZCBzY2FsaW5nIGZhY3RvciAqLworCXRlbXAgPSB3b3Jrc3BhY2VbaV0gKiBkaXZpc29yc1tpXTsKKwkvKiBSb3VuZCB0byBuZWFyZXN0IGludGVnZXIuCisJICogU2luY2UgQyBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBkaXJlY3Rpb24gb2Ygcm91bmRpbmcgZm9yIG5lZ2F0aXZlCisJICogcXVvdGllbnRzLCB3ZSBoYXZlIHRvIGZvcmNlIHRoZSBkaXZpZGVuZCBwb3NpdGl2ZSBmb3IgcG9ydGFiaWxpdHkuCisJICogVGhlIG1heGltdW0gY29lZmZpY2llbnQgc2l6ZSBpcyArLTE2SyAoZm9yIDEyLWJpdCBkYXRhKSwgc28gdGhpcworCSAqIGNvZGUgc2hvdWxkIHdvcmsgZm9yIGVpdGhlciAxNi1iaXQgb3IgMzItYml0IGludHMuCisJICovCisJb3V0cHV0X3B0cltpXSA9IChKQ09FRikgKChpbnQpICh0ZW1wICsgKEZBU1RfRkxPQVQpIDE2Mzg0LjUpIC0gMTYzODQpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisjZW5kaWYgLyogRENUX0ZMT0FUX1NVUFBPUlRFRCAqLworCisKKy8qCisgKiBJbml0aWFsaXplIEZEQ1QgbWFuYWdlci4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X2ZvcndhcmRfZGN0IChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfZmRjdF9wdHIgZmRjdDsKKyAgaW50IGk7CisKKyAgZmRjdCA9IChteV9mZGN0X3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9mZGN0X2NvbnRyb2xsZXIpKTsKKyAgY2luZm8tPmZkY3QgPSAoc3RydWN0IGpwZWdfZm9yd2FyZF9kY3QgKikgZmRjdDsKKyAgZmRjdC0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX2ZkY3RtZ3I7CisKKyAgc3dpdGNoIChjaW5mby0+ZGN0X21ldGhvZCkgeworI2lmZGVmIERDVF9JU0xPV19TVVBQT1JURUQKKyAgY2FzZSBKRENUX0lTTE9XOgorICAgIGZkY3QtPnB1Yi5mb3J3YXJkX0RDVCA9IGZvcndhcmRfRENUOworICAgIGZkY3QtPmRvX2RjdCA9IGpwZWdfZmRjdF9pc2xvdzsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKKyAgY2FzZSBKRENUX0lGQVNUOgorICAgIGZkY3QtPnB1Yi5mb3J3YXJkX0RDVCA9IGZvcndhcmRfRENUOworICAgIGZkY3QtPmRvX2RjdCA9IGpwZWdfZmRjdF9pZmFzdDsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKKyAgY2FzZSBKRENUX0ZMT0FUOgorICAgIGZkY3QtPnB1Yi5mb3J3YXJkX0RDVCA9IGZvcndhcmRfRENUX2Zsb2F0OworICAgIGZkY3QtPmRvX2Zsb2F0X2RjdCA9IGpwZWdfZmRjdF9mbG9hdDsKKyAgICBicmVhazsKKyNlbmRpZgorICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyAgICBicmVhazsKKyAgfQorCisgIC8qIE1hcmsgZGl2aXNvciB0YWJsZXMgdW5hbGxvY2F0ZWQgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5VTV9RVUFOVF9UQkxTOyBpKyspIHsKKyAgICBmZGN0LT5kaXZpc29yc1tpXSA9IE5VTEw7CisjaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAorICAgIGZkY3QtPmZsb2F0X2Rpdmlzb3JzW2ldID0gTlVMTDsKKyNlbmRpZgorICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamNodWZmLmMgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamNodWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJkOTFlMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY2h1ZmYuYwpAQCAtMCwwICsxLDkxMiBAQAorLyoKKyAqIGpjaHVmZi5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgSHVmZm1hbiBlbnRyb3B5IGVuY29kaW5nIHJvdXRpbmVzLgorICoKKyAqIE11Y2ggb2YgdGhlIGNvbXBsZXhpdHkgaGVyZSBoYXMgdG8gZG8gd2l0aCBzdXBwb3J0aW5nIG91dHB1dCBzdXNwZW5zaW9uLgorICogSWYgdGhlIGRhdGEgZGVzdGluYXRpb24gbW9kdWxlIGRlbWFuZHMgc3VzcGVuc2lvbiwgd2Ugd2FudCB0byBiZSBhYmxlIHRvCisgKiBiYWNrIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBNQ1UuICBUbyBkbyB0aGlzLCB3ZSBjb3B5IHN0YXRlCisgKiB2YXJpYWJsZXMgaW50byBsb2NhbCB3b3JraW5nIHN0b3JhZ2UsIGFuZCB1cGRhdGUgdGhlbSBiYWNrIHRvIHRoZQorICogcGVybWFuZW50IEpQRUcgb2JqZWN0cyBvbmx5IHVwb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIGFuIE1DVS4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiamNodWZmLmgiCQkvKiBEZWNsYXJhdGlvbnMgc2hhcmVkIHdpdGggamNwaHVmZi5jICovCisKKyNpZmRlZiBfRlhfTUFOQUdFRF9DT0RFXworI2RlZmluZSBzYXZhYmxlX3N0YXRlCXNhdmFibGVfc3RhdGVfYworI2VuZGlmCisKKy8qIEV4cGFuZGVkIGVudHJvcHkgZW5jb2RlciBvYmplY3QgZm9yIEh1ZmZtYW4gZW5jb2RpbmcuCisgKgorICogVGhlIHNhdmFibGVfc3RhdGUgc3VicmVjb3JkIGNvbnRhaW5zIGZpZWxkcyB0aGF0IGNoYW5nZSB3aXRoaW4gYW4gTUNVLAorICogYnV0IG11c3Qgbm90IGJlIHVwZGF0ZWQgcGVybWFuZW50bHkgdW50aWwgd2UgY29tcGxldGUgdGhlIE1DVS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIElOVDMyIHB1dF9idWZmZXI7CQkvKiBjdXJyZW50IGJpdC1hY2N1bXVsYXRpb24gYnVmZmVyICovCisgIGludCBwdXRfYml0czsJCQkvKiAjIG9mIGJpdHMgbm93IGluIGl0ICovCisgIGludCBsYXN0X2RjX3ZhbFtNQVhfQ09NUFNfSU5fU0NBTl07IC8qIGxhc3QgREMgY29lZiBmb3IgZWFjaCBjb21wb25lbnQgKi8KK30gc2F2YWJsZV9zdGF0ZTsKKworLyogVGhpcyBtYWNybyBpcyB0byB3b3JrIGFyb3VuZCBjb21waWxlcnMgd2l0aCBtaXNzaW5nIG9yIGJyb2tlbgorICogc3RydWN0dXJlIGFzc2lnbm1lbnQuICBZb3UnbGwgbmVlZCB0byBmaXggdGhpcyBjb2RlIGlmIHlvdSBoYXZlCisgKiBzdWNoIGEgY29tcGlsZXIgYW5kIHlvdSBjaGFuZ2UgTUFYX0NPTVBTX0lOX1NDQU4uCisgKi8KKworI2lmbmRlZiBOT19TVFJVQ1RfQVNTSUdOCisjZGVmaW5lIEFTU0lHTl9TVEFURShkZXN0LHNyYykgICgoZGVzdCkgPSAoc3JjKSkKKyNlbHNlCisjaWYgTUFYX0NPTVBTX0lOX1NDQU4gPT0gNAorI2RlZmluZSBBU1NJR05fU1RBVEUoZGVzdCxzcmMpICBcCisJKChkZXN0KS5wdXRfYnVmZmVyID0gKHNyYykucHV0X2J1ZmZlciwgXAorCSAoZGVzdCkucHV0X2JpdHMgPSAoc3JjKS5wdXRfYml0cywgXAorCSAoZGVzdCkubGFzdF9kY192YWxbMF0gPSAoc3JjKS5sYXN0X2RjX3ZhbFswXSwgXAorCSAoZGVzdCkubGFzdF9kY192YWxbMV0gPSAoc3JjKS5sYXN0X2RjX3ZhbFsxXSwgXAorCSAoZGVzdCkubGFzdF9kY192YWxbMl0gPSAoc3JjKS5sYXN0X2RjX3ZhbFsyXSwgXAorCSAoZGVzdCkubGFzdF9kY192YWxbM10gPSAoc3JjKS5sYXN0X2RjX3ZhbFszXSkKKyNlbmRpZgorI2VuZGlmCisKKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19lbnRyb3B5X2VuY29kZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgc2F2YWJsZV9zdGF0ZSBzYXZlZDsJCS8qIEJpdCBidWZmZXIgJiBEQyBzdGF0ZSBhdCBzdGFydCBvZiBNQ1UgKi8KKworICAvKiBUaGVzZSBmaWVsZHMgYXJlIE5PVCBsb2FkZWQgaW50byBsb2NhbCB3b3JraW5nIHN0YXRlLiAqLworICB1bnNpZ25lZCBpbnQgcmVzdGFydHNfdG9fZ287CS8qIE1DVXMgbGVmdCBpbiB0aGlzIHJlc3RhcnQgaW50ZXJ2YWwgKi8KKyAgaW50IG5leHRfcmVzdGFydF9udW07CQkvKiBuZXh0IHJlc3RhcnQgbnVtYmVyIHRvIHdyaXRlICgwLTcpICovCisKKyAgLyogUG9pbnRlcnMgdG8gZGVyaXZlZCB0YWJsZXMgKHRoZXNlIHdvcmtzcGFjZXMgaGF2ZSBpbWFnZSBsaWZlc3BhbikgKi8KKyAgY19kZXJpdmVkX3RibCAqIGRjX2Rlcml2ZWRfdGJsc1tOVU1fSFVGRl9UQkxTXTsKKyAgY19kZXJpdmVkX3RibCAqIGFjX2Rlcml2ZWRfdGJsc1tOVU1fSFVGRl9UQkxTXTsKKworI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAkvKiBTdGF0aXN0aWNzIHRhYmxlcyBmb3Igb3B0aW1pemF0aW9uICovCisgIGxvbmcgKiBkY19jb3VudF9wdHJzW05VTV9IVUZGX1RCTFNdOworICBsb25nICogYWNfY291bnRfcHRyc1tOVU1fSFVGRl9UQkxTXTsKKyNlbmRpZgorfSBodWZmX2VudHJvcHlfZW5jb2RlcjsKKwordHlwZWRlZiBodWZmX2VudHJvcHlfZW5jb2RlciAqIGh1ZmZfZW50cm9weV9wdHI7CisKKy8qIFdvcmtpbmcgc3RhdGUgd2hpbGUgd3JpdGluZyBhbiBNQ1UuCisgKiBUaGlzIHN0cnVjdCBjb250YWlucyBhbGwgdGhlIGZpZWxkcyB0aGF0IGFyZSBuZWVkZWQgYnkgc3Vicm91dGluZXMuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBKT0NURVQgKiBuZXh0X291dHB1dF9ieXRlOwkvKiA9PiBuZXh0IGJ5dGUgdG8gd3JpdGUgaW4gYnVmZmVyICovCisgIHNpemVfdCBmcmVlX2luX2J1ZmZlcjsJLyogIyBvZiBieXRlIHNwYWNlcyByZW1haW5pbmcgaW4gYnVmZmVyICovCisgIHNhdmFibGVfc3RhdGUgY3VyOwkJLyogQ3VycmVudCBiaXQgYnVmZmVyICYgREMgc3RhdGUgKi8KKyAgal9jb21wcmVzc19wdHIgY2luZm87CQkvKiBkdW1wX2J1ZmZlciBuZWVkcyBhY2Nlc3MgdG8gdGhpcyAqLworfSB3b3JraW5nX3N0YXRlOworCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitNRVRIT0RERUYoYm9vbGVhbikgZW5jb2RlX21jdV9odWZmIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJCUpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKK01FVEhPRERFRih2b2lkKSBmaW5pc2hfcGFzc19odWZmIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKyNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKK01FVEhPRERFRihib29sZWFuKSBlbmNvZGVfbWN1X2dhdGhlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKK01FVEhPRERFRih2b2lkKSBmaW5pc2hfcGFzc19nYXRoZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworI2VuZGlmCisKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIGEgSHVmZm1hbi1jb21wcmVzc2VkIHNjYW4uCisgKiBJZiBnYXRoZXJfc3RhdGlzdGljcyBpcyBUUlVFLCB3ZSBkbyBub3Qgb3V0cHV0IGFueXRoaW5nIGR1cmluZyB0aGUgc2NhbiwKKyAqIGp1c3QgY291bnQgdGhlIEh1ZmZtYW4gc3ltYm9scyB1c2VkIGFuZCBnZW5lcmF0ZSBIdWZmbWFuIGNvZGUgdGFibGVzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19odWZmIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBnYXRoZXJfc3RhdGlzdGljcykKK3sKKyAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBpbnQgY2ksIGRjdGJsLCBhY3RibDsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgaWYgKGdhdGhlcl9zdGF0aXN0aWNzKSB7CisjaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECisgICAgZW50cm9weS0+cHViLmVuY29kZV9tY3UgPSBlbmNvZGVfbWN1X2dhdGhlcjsKKyAgICBlbnRyb3B5LT5wdWIuZmluaXNoX3Bhc3MgPSBmaW5pc2hfcGFzc19nYXRoZXI7CisjZWxzZQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIGVudHJvcHktPnB1Yi5lbmNvZGVfbWN1ID0gZW5jb2RlX21jdV9odWZmOworICAgIGVudHJvcHktPnB1Yi5maW5pc2hfcGFzcyA9IGZpbmlzaF9wYXNzX2h1ZmY7CisgIH0KKworICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgeworICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgZGN0YmwgPSBjb21wcHRyLT5kY190Ymxfbm87CisgICAgYWN0YmwgPSBjb21wcHRyLT5hY190Ymxfbm87CisgICAgaWYgKGdhdGhlcl9zdGF0aXN0aWNzKSB7CisjaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECisgICAgICAvKiBDaGVjayBmb3IgaW52YWxpZCB0YWJsZSBpbmRleGVzICovCisgICAgICAvKiAobWFrZV9jX2Rlcml2ZWRfdGJsIGRvZXMgdGhpcyBpbiB0aGUgb3RoZXIgcGF0aCkgKi8KKyAgICAgIGlmIChkY3RibCA8IDAgfHwgZGN0YmwgPj0gTlVNX0hVRkZfVEJMUykKKwlFUlJFWElUMShjaW5mbywgSkVSUl9OT19IVUZGX1RBQkxFLCBkY3RibCk7CisgICAgICBpZiAoYWN0YmwgPCAwIHx8IGFjdGJsID49IE5VTV9IVUZGX1RCTFMpCisJRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fSFVGRl9UQUJMRSwgYWN0YmwpOworICAgICAgLyogQWxsb2NhdGUgYW5kIHplcm8gdGhlIHN0YXRpc3RpY3MgdGFibGVzICovCisgICAgICAvKiBOb3RlIHRoYXQganBlZ19nZW5fb3B0aW1hbF90YWJsZSBleHBlY3RzIDI1NyBlbnRyaWVzIGluIGVhY2ggdGFibGUhICovCisgICAgICBpZiAoZW50cm9weS0+ZGNfY291bnRfcHRyc1tkY3RibF0gPT0gTlVMTCkKKwllbnRyb3B5LT5kY19jb3VudF9wdHJzW2RjdGJsXSA9IChsb25nICopCisJICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgICAgIDI1NyAqIFNJWkVPRihsb25nKSk7CisgICAgICBNRU1aRVJPKGVudHJvcHktPmRjX2NvdW50X3B0cnNbZGN0YmxdLCAyNTcgKiBTSVpFT0YobG9uZykpOworICAgICAgaWYgKGVudHJvcHktPmFjX2NvdW50X3B0cnNbYWN0YmxdID09IE5VTEwpCisJZW50cm9weS0+YWNfY291bnRfcHRyc1thY3RibF0gPSAobG9uZyAqKQorCSAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgICAgICAyNTcgKiBTSVpFT0YobG9uZykpOworICAgICAgTUVNWkVSTyhlbnRyb3B5LT5hY19jb3VudF9wdHJzW2FjdGJsXSwgMjU3ICogU0laRU9GKGxvbmcpKTsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAvKiBDb21wdXRlIGRlcml2ZWQgdmFsdWVzIGZvciBIdWZmbWFuIHRhYmxlcyAqLworICAgICAgLyogV2UgbWF5IGRvIHRoaXMgbW9yZSB0aGFuIG9uY2UgZm9yIGEgdGFibGUsIGJ1dCBpdCdzIG5vdCBleHBlbnNpdmUgKi8KKyAgICAgIGpwZWdfbWFrZV9jX2Rlcml2ZWRfdGJsKGNpbmZvLCBUUlVFLCBkY3RibCwKKwkJCSAgICAgICYgZW50cm9weS0+ZGNfZGVyaXZlZF90YmxzW2RjdGJsXSk7CisgICAgICBqcGVnX21ha2VfY19kZXJpdmVkX3RibChjaW5mbywgRkFMU0UsIGFjdGJsLAorCQkJICAgICAgJiBlbnRyb3B5LT5hY19kZXJpdmVkX3RibHNbYWN0YmxdKTsKKyAgICB9CisgICAgLyogSW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCisgICAgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldID0gMDsKKyAgfQorCisgIC8qIEluaXRpYWxpemUgYml0IGJ1ZmZlciB0byBlbXB0eSAqLworICBlbnRyb3B5LT5zYXZlZC5wdXRfYnVmZmVyID0gMDsKKyAgZW50cm9weS0+c2F2ZWQucHV0X2JpdHMgPSAwOworCisgIC8qIEluaXRpYWxpemUgcmVzdGFydCBzdHVmZiAqLworICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOworICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtID0gMDsKK30KKworCisvKgorICogQ29tcHV0ZSB0aGUgZGVyaXZlZCB2YWx1ZXMgZm9yIGEgSHVmZm1hbiB0YWJsZS4KKyAqIFRoaXMgcm91dGluZSBhbHNvIHBlcmZvcm1zIHNvbWUgdmFsaWRhdGlvbiBjaGVja3Mgb24gdGhlIHRhYmxlLgorICoKKyAqIE5vdGUgdGhpcyBpcyBhbHNvIHVzZWQgYnkgamNwaHVmZi5jLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19tYWtlX2NfZGVyaXZlZF90YmwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGlzREMsIGludCB0YmxubywKKwkJCSBjX2Rlcml2ZWRfdGJsICoqIHBkdGJsKQoreworICBKSFVGRl9UQkwgKmh0Ymw7CisgIGNfZGVyaXZlZF90YmwgKmR0Ymw7CisgIGludCBwLCBpLCBsLCBsYXN0cCwgX3NpLCBtYXhzeW1ib2w7CisgIGNoYXIgaHVmZnNpemVbMjU3XTsKKyAgdW5zaWduZWQgaW50IGh1ZmZjb2RlWzI1N107CisgIHVuc2lnbmVkIGludCBjb2RlOworCisgIC8qIE5vdGUgdGhhdCBodWZmc2l6ZVtdIGFuZCBodWZmY29kZVtdIGFyZSBmaWxsZWQgaW4gY29kZS1sZW5ndGggb3JkZXIsCisgICAqIHBhcmFsbGVsaW5nIHRoZSBvcmRlciBvZiB0aGUgc3ltYm9scyB0aGVtc2VsdmVzIGluIGh0YmwtPmh1ZmZ2YWxbXS4KKyAgICovCisKKyAgLyogRmluZCB0aGUgaW5wdXQgSHVmZm1hbiB0YWJsZSAqLworICBpZiAodGJsbm8gPCAwIHx8IHRibG5vID49IE5VTV9IVUZGX1RCTFMpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fSFVGRl9UQUJMRSwgdGJsbm8pOworICBodGJsID0KKyAgICBpc0RDID8gY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbdGJsbm9dIDogY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbdGJsbm9dOworICBpZiAoaHRibCA9PSBOVUxMKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIHRibG5vKTsKKworICAvKiBBbGxvY2F0ZSBhIHdvcmtzcGFjZSBpZiB3ZSBoYXZlbid0IGFscmVhZHkgZG9uZSBzby4gKi8KKyAgaWYgKCpwZHRibCA9PSBOVUxMKQorICAgICpwZHRibCA9IChjX2Rlcml2ZWRfdGJsICopCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgU0laRU9GKGNfZGVyaXZlZF90YmwpKTsKKyAgZHRibCA9ICpwZHRibDsKKyAgCisgIC8qIEZpZ3VyZSBDLjE6IG1ha2UgdGFibGUgb2YgSHVmZm1hbiBjb2RlIGxlbmd0aCBmb3IgZWFjaCBzeW1ib2wgKi8KKworICBwID0gMDsKKyAgZm9yIChsID0gMTsgbCA8PSAxNjsgbCsrKSB7CisgICAgaSA9IChpbnQpIGh0YmwtPmJpdHNbbF07CisgICAgaWYgKGkgPCAwIHx8IHAgKyBpID4gMjU2KQkvKiBwcm90ZWN0IGFnYWluc3QgdGFibGUgb3ZlcnJ1biAqLworICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSFVGRl9UQUJMRSk7CisgICAgd2hpbGUgKGktLSkKKyAgICAgIGh1ZmZzaXplW3ArK10gPSAoY2hhcikgbDsKKyAgfQorICBodWZmc2l6ZVtwXSA9IDA7CisgIGxhc3RwID0gcDsKKyAgCisgIC8qIEZpZ3VyZSBDLjI6IGdlbmVyYXRlIHRoZSBjb2RlcyB0aGVtc2VsdmVzICovCisgIC8qIFdlIGFsc28gdmFsaWRhdGUgdGhhdCB0aGUgY291bnRzIHJlcHJlc2VudCBhIGxlZ2FsIEh1ZmZtYW4gY29kZSB0cmVlLiAqLworCisgIGNvZGUgPSAwOworICBfc2kgPSBodWZmc2l6ZVswXTsKKyAgcCA9IDA7CisgIHdoaWxlIChodWZmc2l6ZVtwXSkgeworICAgIHdoaWxlICgoKGludCkgaHVmZnNpemVbcF0pID09IF9zaSkgeworICAgICAgaHVmZmNvZGVbcCsrXSA9IGNvZGU7CisgICAgICBjb2RlKys7CisgICAgfQorICAgIC8qIGNvZGUgaXMgbm93IDEgbW9yZSB0aGFuIHRoZSBsYXN0IGNvZGUgdXNlZCBmb3IgY29kZWxlbmd0aCBzaTsgYnV0CisgICAgICogaXQgbXVzdCBzdGlsbCBmaXQgaW4gc2kgYml0cywgc2luY2Ugbm8gY29kZSBpcyBhbGxvd2VkIHRvIGJlIGFsbCBvbmVzLgorICAgICAqLworICAgIGlmICgoKElOVDMyKSBjb2RlKSA+PSAoKChJTlQzMikgMSkgPDwgX3NpKSkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0hVRkZfVEFCTEUpOworICAgIGNvZGUgPDw9IDE7CisgICAgX3NpKys7CisgIH0KKyAgCisgIC8qIEZpZ3VyZSBDLjM6IGdlbmVyYXRlIGVuY29kaW5nIHRhYmxlcyAqLworICAvKiBUaGVzZSBhcmUgY29kZSBhbmQgc2l6ZSBpbmRleGVkIGJ5IHN5bWJvbCB2YWx1ZSAqLworCisgIC8qIFNldCBhbGwgY29kZWxlc3Mgc3ltYm9scyB0byBoYXZlIGNvZGUgbGVuZ3RoIDA7CisgICAqIHRoaXMgbGV0cyB1cyBkZXRlY3QgZHVwbGljYXRlIFZBTCBlbnRyaWVzIGhlcmUsIGFuZCBsYXRlcgorICAgKiBhbGxvd3MgZW1pdF9iaXRzIHRvIGRldGVjdCBhbnkgYXR0ZW1wdCB0byBlbWl0IHN1Y2ggc3ltYm9scy4KKyAgICovCisgIE1FTVpFUk8oZHRibC0+ZWh1ZnNpLCBTSVpFT0YoZHRibC0+ZWh1ZnNpKSk7CisKKyAgLyogVGhpcyBpcyBhbHNvIGEgY29udmVuaWVudCBwbGFjZSB0byBjaGVjayBmb3Igb3V0LW9mLXJhbmdlCisgICAqIGFuZCBkdXBsaWNhdGVkIFZBTCBlbnRyaWVzLiAgV2UgYWxsb3cgMC4uMjU1IGZvciBBQyBzeW1ib2xzCisgICAqIGJ1dCBvbmx5IDAuLjE1IGZvciBEQy4gIChXZSBjb3VsZCBjb25zdHJhaW4gdGhlbSBmdXJ0aGVyCisgICAqIGJhc2VkIG9uIGRhdGEgZGVwdGggYW5kIG1vZGUsIGJ1dCB0aGlzIHNlZW1zIGVub3VnaC4pCisgICAqLworICBtYXhzeW1ib2wgPSBpc0RDID8gMTUgOiAyNTU7CisKKyAgZm9yIChwID0gMDsgcCA8IGxhc3RwOyBwKyspIHsKKyAgICBpID0gaHRibC0+aHVmZnZhbFtwXTsKKyAgICBpZiAoaSA8IDAgfHwgaSA+IG1heHN5bWJvbCB8fCBkdGJsLT5laHVmc2lbaV0pCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKKyAgICBkdGJsLT5laHVmY29baV0gPSBodWZmY29kZVtwXTsKKyAgICBkdGJsLT5laHVmc2lbaV0gPSBodWZmc2l6ZVtwXTsKKyAgfQorfQorCisKKy8qIE91dHB1dHRpbmcgYnl0ZXMgdG8gdGhlIGZpbGUgKi8KKworLyogRW1pdCBhIGJ5dGUsIHRha2luZyAnYWN0aW9uJyBpZiBtdXN0IHN1c3BlbmQuICovCisjZGVmaW5lIGVtaXRfYnl0ZShzdGF0ZSx2YWwsYWN0aW9uKSAgXAorCXsgKihzdGF0ZSktPm5leHRfb3V0cHV0X2J5dGUrKyA9IChKT0NURVQpICh2YWwpOyAgXAorCSAgaWYgKC0tKHN0YXRlKS0+ZnJlZV9pbl9idWZmZXIgPT0gMCkgIFwKKwkgICAgaWYgKCEgZHVtcF9idWZmZXIoc3RhdGUpKSAgXAorCSAgICAgIHsgYWN0aW9uOyB9IH0KKworCitMT0NBTChib29sZWFuKQorZHVtcF9idWZmZXIgKHdvcmtpbmdfc3RhdGUgKiBzdGF0ZSkKKy8qIEVtcHR5IHRoZSBvdXRwdXQgYnVmZmVyOyByZXR1cm4gVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBpZiBtdXN0IHN1c3BlbmQgKi8KK3sKKyAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyICogZGVzdCA9IHN0YXRlLT5jaW5mby0+ZGVzdDsKKworICBpZiAoISAoKmRlc3QtPmVtcHR5X291dHB1dF9idWZmZXIpIChzdGF0ZS0+Y2luZm8pKQorICAgIHJldHVybiBGQUxTRTsKKyAgLyogQWZ0ZXIgYSBzdWNjZXNzZnVsIGJ1ZmZlciBkdW1wLCBtdXN0IHJlc2V0IGJ1ZmZlciBwb2ludGVycyAqLworICBzdGF0ZS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGRlc3QtPm5leHRfb3V0cHV0X2J5dGU7CisgIHN0YXRlLT5mcmVlX2luX2J1ZmZlciA9IGRlc3QtPmZyZWVfaW5fYnVmZmVyOworICByZXR1cm4gVFJVRTsKK30KKworCisvKiBPdXRwdXR0aW5nIGJpdHMgdG8gdGhlIGZpbGUgKi8KKworLyogT25seSB0aGUgcmlnaHQgMjQgYml0cyBvZiBwdXRfYnVmZmVyIGFyZSB1c2VkOyB0aGUgdmFsaWQgYml0cyBhcmUKKyAqIGxlZnQtanVzdGlmaWVkIGluIHRoaXMgcGFydC4gIEF0IG1vc3QgMTYgYml0cyBjYW4gYmUgcGFzc2VkIHRvIGVtaXRfYml0cworICogaW4gb25lIGNhbGwsIGFuZCB3ZSBuZXZlciByZXRhaW4gbW9yZSB0aGFuIDcgYml0cyBpbiBwdXRfYnVmZmVyCisgKiBiZXR3ZWVuIGNhbGxzLCBzbyAyNCBiaXRzIGFyZSBzdWZmaWNpZW50LgorICovCisKK0lOTElORQorTE9DQUwoYm9vbGVhbikKK2VtaXRfYml0cyAod29ya2luZ19zdGF0ZSAqIHN0YXRlLCB1bnNpZ25lZCBpbnQgY29kZSwgaW50IHNpemUpCisvKiBFbWl0IHNvbWUgYml0czsgcmV0dXJuIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgRkFMU0UgaWYgbXVzdCBzdXNwZW5kICovCit7CisgIC8qIFRoaXMgcm91dGluZSBpcyBoZWF2aWx5IHVzZWQsIHNvIGl0J3Mgd29ydGggY29kaW5nIHRpZ2h0bHkuICovCisgIHJlZ2lzdGVyIElOVDMyIHB1dF9idWZmZXIgPSAoSU5UMzIpIGNvZGU7CisgIHJlZ2lzdGVyIGludCBwdXRfYml0cyA9IHN0YXRlLT5jdXIucHV0X2JpdHM7CisKKyAgLyogaWYgc2l6ZSBpcyAwLCBjYWxsZXIgdXNlZCBhbiBpbnZhbGlkIEh1ZmZtYW4gdGFibGUgZW50cnkgKi8KKyAgaWYgKHNpemUgPT0gMCkKKyAgICBFUlJFWElUKHN0YXRlLT5jaW5mbywgSkVSUl9IVUZGX01JU1NJTkdfQ09ERSk7CisKKyAgcHV0X2J1ZmZlciAmPSAoKChJTlQzMikgMSk8PHNpemUpIC0gMTsgLyogbWFzayBvZmYgYW55IGV4dHJhIGJpdHMgaW4gY29kZSAqLworICAKKyAgcHV0X2JpdHMgKz0gc2l6ZTsJCS8qIG5ldyBudW1iZXIgb2YgYml0cyBpbiBidWZmZXIgKi8KKyAgCisgIHB1dF9idWZmZXIgPDw9IDI0IC0gcHV0X2JpdHM7IC8qIGFsaWduIGluY29taW5nIGJpdHMgKi8KKworICBwdXRfYnVmZmVyIHw9IHN0YXRlLT5jdXIucHV0X2J1ZmZlcjsgLyogYW5kIG1lcmdlIHdpdGggb2xkIGJ1ZmZlciBjb250ZW50cyAqLworICAKKyAgd2hpbGUgKHB1dF9iaXRzID49IDgpIHsKKyAgICBpbnQgYyA9IChpbnQpICgocHV0X2J1ZmZlciA+PiAxNikgJiAweEZGKTsKKyAgICAKKyAgICBlbWl0X2J5dGUoc3RhdGUsIGMsIHJldHVybiBGQUxTRSk7CisgICAgaWYgKGMgPT0gMHhGRikgewkJLyogbmVlZCB0byBzdHVmZiBhIHplcm8gYnl0ZT8gKi8KKyAgICAgIGVtaXRfYnl0ZShzdGF0ZSwgMCwgcmV0dXJuIEZBTFNFKTsKKyAgICB9CisgICAgcHV0X2J1ZmZlciA8PD0gODsKKyAgICBwdXRfYml0cyAtPSA4OworICB9CisKKyAgc3RhdGUtPmN1ci5wdXRfYnVmZmVyID0gcHV0X2J1ZmZlcjsgLyogdXBkYXRlIHN0YXRlIHZhcmlhYmxlcyAqLworICBzdGF0ZS0+Y3VyLnB1dF9iaXRzID0gcHV0X2JpdHM7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworTE9DQUwoYm9vbGVhbikKK2ZsdXNoX2JpdHMgKHdvcmtpbmdfc3RhdGUgKiBzdGF0ZSkKK3sKKyAgaWYgKCEgZW1pdF9iaXRzKHN0YXRlLCAweDdGLCA3KSkgLyogZmlsbCBhbnkgcGFydGlhbCBieXRlIHdpdGggb25lcyAqLworICAgIHJldHVybiBGQUxTRTsKKyAgc3RhdGUtPmN1ci5wdXRfYnVmZmVyID0gMDsJLyogYW5kIHJlc2V0IGJpdC1idWZmZXIgdG8gZW1wdHkgKi8KKyAgc3RhdGUtPmN1ci5wdXRfYml0cyA9IDA7CisgIHJldHVybiBUUlVFOworfQorCisKKy8qIEVuY29kZSBhIHNpbmdsZSBibG9jaydzIHdvcnRoIG9mIGNvZWZmaWNpZW50cyAqLworCitMT0NBTChib29sZWFuKQorZW5jb2RlX29uZV9ibG9jayAod29ya2luZ19zdGF0ZSAqIHN0YXRlLCBKQ09FRlBUUiBibG9jaywgaW50IGxhc3RfZGNfdmFsLAorCQkgIGNfZGVyaXZlZF90YmwgKmRjdGJsLCBjX2Rlcml2ZWRfdGJsICphY3RibCkKK3sKKyAgcmVnaXN0ZXIgaW50IHRlbXAsIHRlbXAyOworICByZWdpc3RlciBpbnQgbmJpdHM7CisgIHJlZ2lzdGVyIGludCBrLCByLCBpOworICAKKyAgLyogRW5jb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlIHBlciBzZWN0aW9uIEYuMS4yLjEgKi8KKyAgCisgIHRlbXAgPSB0ZW1wMiA9IGJsb2NrWzBdIC0gbGFzdF9kY192YWw7CisKKyAgaWYgKHRlbXAgPCAwKSB7CisgICAgdGVtcCA9IC10ZW1wOwkJLyogdGVtcCBpcyBhYnMgdmFsdWUgb2YgaW5wdXQgKi8KKyAgICAvKiBGb3IgYSBuZWdhdGl2ZSBpbnB1dCwgd2FudCB0ZW1wMiA9IGJpdHdpc2UgY29tcGxlbWVudCBvZiBhYnMoaW5wdXQpICovCisgICAgLyogVGhpcyBjb2RlIGFzc3VtZXMgd2UgYXJlIG9uIGEgdHdvJ3MgY29tcGxlbWVudCBtYWNoaW5lICovCisgICAgdGVtcDItLTsKKyAgfQorICAKKyAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLworICBuYml0cyA9IDA7CisgIHdoaWxlICh0ZW1wKSB7CisgICAgbmJpdHMrKzsKKyAgICB0ZW1wID4+PSAxOworICB9CisgIC8qIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgY29lZmZpY2llbnQgdmFsdWVzLgorICAgKiBTaW5jZSB3ZSdyZSBlbmNvZGluZyBhIGRpZmZlcmVuY2UsIHRoZSByYW5nZSBsaW1pdCBpcyB0d2ljZSBhcyBtdWNoLgorICAgKi8KKyAgaWYgKG5iaXRzID4gTUFYX0NPRUZfQklUUysxKQorICAgIEVSUkVYSVQoc3RhdGUtPmNpbmZvLCBKRVJSX0JBRF9EQ1RfQ09FRik7CisgIAorICAvKiBFbWl0IHRoZSBIdWZmbWFuLWNvZGVkIHN5bWJvbCBmb3IgdGhlIG51bWJlciBvZiBiaXRzICovCisgIGlmICghIGVtaXRfYml0cyhzdGF0ZSwgZGN0YmwtPmVodWZjb1tuYml0c10sIGRjdGJsLT5laHVmc2lbbmJpdHNdKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogRW1pdCB0aGF0IG51bWJlciBvZiBiaXRzIG9mIHRoZSB2YWx1ZSwgaWYgcG9zaXRpdmUsICovCisgIC8qIG9yIHRoZSBjb21wbGVtZW50IG9mIGl0cyBtYWduaXR1ZGUsIGlmIG5lZ2F0aXZlLiAqLworICBpZiAobmJpdHMpCQkJLyogZW1pdF9iaXRzIHJlamVjdHMgY2FsbHMgd2l0aCBzaXplIDAgKi8KKyAgICBpZiAoISBlbWl0X2JpdHMoc3RhdGUsICh1bnNpZ25lZCBpbnQpIHRlbXAyLCBuYml0cykpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogRW5jb2RlIHRoZSBBQyBjb2VmZmljaWVudHMgcGVyIHNlY3Rpb24gRi4xLjIuMiAqLworICAKKyAgciA9IDA7CQkJLyogciA9IHJ1biBsZW5ndGggb2YgemVyb3MgKi8KKyAgCisgIGZvciAoayA9IDE7IGsgPCBEQ1RTSVpFMjsgaysrKSB7CisgICAgaWYgKCh0ZW1wID0gYmxvY2tbanBlZ19uYXR1cmFsX29yZGVyW2tdXSkgPT0gMCkgeworICAgICAgcisrOworICAgIH0gZWxzZSB7CisgICAgICAvKiBpZiBydW4gbGVuZ3RoID4gMTUsIG11c3QgZW1pdCBzcGVjaWFsIHJ1bi1sZW5ndGgtMTYgY29kZXMgKDB4RjApICovCisgICAgICB3aGlsZSAociA+IDE1KSB7CisJaWYgKCEgZW1pdF9iaXRzKHN0YXRlLCBhY3RibC0+ZWh1ZmNvWzB4RjBdLCBhY3RibC0+ZWh1ZnNpWzB4RjBdKSkKKwkgIHJldHVybiBGQUxTRTsKKwlyIC09IDE2OworICAgICAgfQorCisgICAgICB0ZW1wMiA9IHRlbXA7CisgICAgICBpZiAodGVtcCA8IDApIHsKKwl0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLworCS8qIFRoaXMgY29kZSBhc3N1bWVzIHdlIGFyZSBvbiBhIHR3bydzIGNvbXBsZW1lbnQgbWFjaGluZSAqLworCXRlbXAyLS07CisgICAgICB9CisgICAgICAKKyAgICAgIC8qIEZpbmQgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCBmb3IgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY29lZmZpY2llbnQgKi8KKyAgICAgIG5iaXRzID0gMTsJCS8qIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIDEgYml0ICovCisgICAgICB3aGlsZSAoKHRlbXAgPj49IDEpKQorCW5iaXRzKys7CisgICAgICAvKiBDaGVjayBmb3Igb3V0LW9mLXJhbmdlIGNvZWZmaWNpZW50IHZhbHVlcyAqLworICAgICAgaWYgKG5iaXRzID4gTUFYX0NPRUZfQklUUykKKwlFUlJFWElUKHN0YXRlLT5jaW5mbywgSkVSUl9CQURfRENUX0NPRUYpOworICAgICAgCisgICAgICAvKiBFbWl0IEh1ZmZtYW4gc3ltYm9sIGZvciBydW4gbGVuZ3RoIC8gbnVtYmVyIG9mIGJpdHMgKi8KKyAgICAgIGkgPSAociA8PCA0KSArIG5iaXRzOworICAgICAgaWYgKCEgZW1pdF9iaXRzKHN0YXRlLCBhY3RibC0+ZWh1ZmNvW2ldLCBhY3RibC0+ZWh1ZnNpW2ldKSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICAgIC8qIEVtaXQgdGhhdCBudW1iZXIgb2YgYml0cyBvZiB0aGUgdmFsdWUsIGlmIHBvc2l0aXZlLCAqLworICAgICAgLyogb3IgdGhlIGNvbXBsZW1lbnQgb2YgaXRzIG1hZ25pdHVkZSwgaWYgbmVnYXRpdmUuICovCisgICAgICBpZiAoISBlbWl0X2JpdHMoc3RhdGUsICh1bnNpZ25lZCBpbnQpIHRlbXAyLCBuYml0cykpCisJcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICByID0gMDsKKyAgICB9CisgIH0KKworICAvKiBJZiB0aGUgbGFzdCBjb2VmKHMpIHdlcmUgemVybywgZW1pdCBhbiBlbmQtb2YtYmxvY2sgY29kZSAqLworICBpZiAociA+IDApCisgICAgaWYgKCEgZW1pdF9iaXRzKHN0YXRlLCBhY3RibC0+ZWh1ZmNvWzBdLCBhY3RibC0+ZWh1ZnNpWzBdKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogRW1pdCBhIHJlc3RhcnQgbWFya2VyICYgcmVzeW5jaHJvbml6ZSBwcmVkaWN0aW9ucy4KKyAqLworCitMT0NBTChib29sZWFuKQorZW1pdF9yZXN0YXJ0ICh3b3JraW5nX3N0YXRlICogc3RhdGUsIGludCByZXN0YXJ0X251bSkKK3sKKyAgaW50IGNpOworCisgIGlmICghIGZsdXNoX2JpdHMoc3RhdGUpKQorICAgIHJldHVybiBGQUxTRTsKKworICBlbWl0X2J5dGUoc3RhdGUsIDB4RkYsIHJldHVybiBGQUxTRSk7CisgIGVtaXRfYnl0ZShzdGF0ZSwgSlBFR19SU1QwICsgcmVzdGFydF9udW0sIHJldHVybiBGQUxTRSk7CisKKyAgLyogUmUtaW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCisgIGZvciAoY2kgPSAwOyBjaSA8IHN0YXRlLT5jaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykKKyAgICBzdGF0ZS0+Y3VyLmxhc3RfZGNfdmFsW2NpXSA9IDA7CisKKyAgLyogVGhlIHJlc3RhcnQgY291bnRlciBpcyBub3QgdXBkYXRlZCB1bnRpbCB3ZSBzdWNjZXNzZnVsbHkgd3JpdGUgdGhlIE1DVS4gKi8KKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogRW5jb2RlIGFuZCBvdXRwdXQgb25lIE1DVSdzIHdvcnRoIG9mIEh1ZmZtYW4tY29tcHJlc3NlZCBjb2VmZmljaWVudHMuCisgKi8KKworTUVUSE9EREVGKGJvb2xlYW4pCitlbmNvZGVfbWN1X2h1ZmYgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIHdvcmtpbmdfc3RhdGUgc3RhdGU7CisgIGludCBibGtuLCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgLyogTG9hZCB1cCB3b3JraW5nIHN0YXRlICovCisgIHN0YXRlLm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgc3RhdGUuZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7CisgIEFTU0lHTl9TVEFURShzdGF0ZS5jdXIsIGVudHJvcHktPnNhdmVkKTsKKyAgc3RhdGUuY2luZm8gPSBjaW5mbzsKKworICAvKiBFbWl0IHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZCAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKKyAgICAgIGlmICghIGVtaXRfcmVzdGFydCgmc3RhdGUsIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0pKQorCXJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIEVuY29kZSB0aGUgTUNVIGRhdGEgYmxvY2tzICovCisgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7CisgICAgY2kgPSBjaW5mby0+TUNVX21lbWJlcnNoaXBbYmxrbl07CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICBpZiAoISBlbmNvZGVfb25lX2Jsb2NrKCZzdGF0ZSwKKwkJCSAgIE1DVV9kYXRhW2Jsa25dWzBdLCBzdGF0ZS5jdXIubGFzdF9kY192YWxbY2ldLAorCQkJICAgZW50cm9weS0+ZGNfZGVyaXZlZF90YmxzW2NvbXBwdHItPmRjX3RibF9ub10sCisJCQkgICBlbnRyb3B5LT5hY19kZXJpdmVkX3RibHNbY29tcHB0ci0+YWNfdGJsX25vXSkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgLyogVXBkYXRlIGxhc3RfZGNfdmFsICovCisgICAgc3RhdGUuY3VyLmxhc3RfZGNfdmFsW2NpXSA9IE1DVV9kYXRhW2Jsa25dWzBdWzBdOworICB9CisKKyAgLyogQ29tcGxldGVkIE1DVSwgc28gdXBkYXRlIHN0YXRlICovCisgIGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlID0gc3RhdGUubmV4dF9vdXRwdXRfYnl0ZTsKKyAgY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyID0gc3RhdGUuZnJlZV9pbl9idWZmZXI7CisgIEFTU0lHTl9TVEFURShlbnRyb3B5LT5zYXZlZCwgc3RhdGUuY3VyKTsKKworICAvKiBVcGRhdGUgcmVzdGFydC1pbnRlcnZhbCBzdGF0ZSB0b28gKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApIHsKKyAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKys7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtICY9IDc7CisgICAgfQorICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgYSBIdWZmbWFuLWNvbXByZXNzZWQgc2Nhbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZpbmlzaF9wYXNzX2h1ZmYgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIHdvcmtpbmdfc3RhdGUgc3RhdGU7CisKKyAgLyogTG9hZCB1cCB3b3JraW5nIHN0YXRlIC4uLiBmbHVzaF9iaXRzIG5lZWRzIGl0ICovCisgIHN0YXRlLm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgc3RhdGUuZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7CisgIEFTU0lHTl9TVEFURShzdGF0ZS5jdXIsIGVudHJvcHktPnNhdmVkKTsKKyAgc3RhdGUuY2luZm8gPSBjaW5mbzsKKworICAvKiBGbHVzaCBvdXQgdGhlIGxhc3QgZGF0YSAqLworICBpZiAoISBmbHVzaF9iaXRzKCZzdGF0ZSkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DQU5UX1NVU1BFTkQpOworCisgIC8qIFVwZGF0ZSBzdGF0ZSAqLworICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IHN0YXRlLm5leHRfb3V0cHV0X2J5dGU7CisgIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IHN0YXRlLmZyZWVfaW5fYnVmZmVyOworICBBU1NJR05fU1RBVEUoZW50cm9weS0+c2F2ZWQsIHN0YXRlLmN1cik7Cit9CisKKworLyoKKyAqIEh1ZmZtYW4gY29kaW5nIG9wdGltaXphdGlvbi4KKyAqCisgKiBXZSBmaXJzdCBzY2FuIHRoZSBzdXBwbGllZCBkYXRhIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIHVzZXMgb2YgZWFjaCBzeW1ib2wKKyAqIHRoYXQgaXMgdG8gYmUgSHVmZm1hbi1jb2RlZC4gKFRoaXMgcHJvY2VzcyBNVVNUIGFncmVlIHdpdGggdGhlIGNvZGUgYWJvdmUuKQorICogVGhlbiB3ZSBidWlsZCBhIEh1ZmZtYW4gY29kaW5nIHRyZWUgZm9yIHRoZSBvYnNlcnZlZCBjb3VudHMuCisgKiBTeW1ib2xzIHdoaWNoIGFyZSBub3QgbmVlZGVkIGF0IGFsbCBmb3IgdGhlIHBhcnRpY3VsYXIgaW1hZ2UgYXJlIG5vdAorICogYXNzaWduZWQgYW55IGNvZGUsIHdoaWNoIHNhdmVzIHNwYWNlIGluIHRoZSBESFQgbWFya2VyIGFzIHdlbGwgYXMgaW4KKyAqIHRoZSBjb21wcmVzc2VkIGRhdGEuCisgKi8KKworI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAorCisKKy8qIFByb2Nlc3MgYSBzaW5nbGUgYmxvY2sncyB3b3J0aCBvZiBjb2VmZmljaWVudHMgKi8KKworTE9DQUwodm9pZCkKK2h0ZXN0X29uZV9ibG9jayAoal9jb21wcmVzc19wdHIgY2luZm8sIEpDT0VGUFRSIGJsb2NrLCBpbnQgbGFzdF9kY192YWwsCisJCSBsb25nIGRjX2NvdW50c1tdLCBsb25nIGFjX2NvdW50c1tdKQoreworICByZWdpc3RlciBpbnQgdGVtcDsKKyAgcmVnaXN0ZXIgaW50IG5iaXRzOworICByZWdpc3RlciBpbnQgaywgcjsKKyAgCisgIC8qIEVuY29kZSB0aGUgREMgY29lZmZpY2llbnQgZGlmZmVyZW5jZSBwZXIgc2VjdGlvbiBGLjEuMi4xICovCisgIAorICB0ZW1wID0gYmxvY2tbMF0gLSBsYXN0X2RjX3ZhbDsKKyAgaWYgKHRlbXAgPCAwKQorICAgIHRlbXAgPSAtdGVtcDsKKyAgCisgIC8qIEZpbmQgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCBmb3IgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY29lZmZpY2llbnQgKi8KKyAgbmJpdHMgPSAwOworICB3aGlsZSAodGVtcCkgeworICAgIG5iaXRzKys7CisgICAgdGVtcCA+Pj0gMTsKKyAgfQorICAvKiBDaGVjayBmb3Igb3V0LW9mLXJhbmdlIGNvZWZmaWNpZW50IHZhbHVlcy4KKyAgICogU2luY2Ugd2UncmUgZW5jb2RpbmcgYSBkaWZmZXJlbmNlLCB0aGUgcmFuZ2UgbGltaXQgaXMgdHdpY2UgYXMgbXVjaC4KKyAgICovCisgIGlmIChuYml0cyA+IE1BWF9DT0VGX0JJVFMrMSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9EQ1RfQ09FRik7CisKKyAgLyogQ291bnQgdGhlIEh1ZmZtYW4gc3ltYm9sIGZvciB0aGUgbnVtYmVyIG9mIGJpdHMgKi8KKyAgZGNfY291bnRzW25iaXRzXSsrOworICAKKyAgLyogRW5jb2RlIHRoZSBBQyBjb2VmZmljaWVudHMgcGVyIHNlY3Rpb24gRi4xLjIuMiAqLworICAKKyAgciA9IDA7CQkJLyogciA9IHJ1biBsZW5ndGggb2YgemVyb3MgKi8KKyAgCisgIGZvciAoayA9IDE7IGsgPCBEQ1RTSVpFMjsgaysrKSB7CisgICAgaWYgKCh0ZW1wID0gYmxvY2tbanBlZ19uYXR1cmFsX29yZGVyW2tdXSkgPT0gMCkgeworICAgICAgcisrOworICAgIH0gZWxzZSB7CisgICAgICAvKiBpZiBydW4gbGVuZ3RoID4gMTUsIG11c3QgZW1pdCBzcGVjaWFsIHJ1bi1sZW5ndGgtMTYgY29kZXMgKDB4RjApICovCisgICAgICB3aGlsZSAociA+IDE1KSB7CisJYWNfY291bnRzWzB4RjBdKys7CisJciAtPSAxNjsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLworICAgICAgaWYgKHRlbXAgPCAwKQorCXRlbXAgPSAtdGVtcDsKKyAgICAgIAorICAgICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLworICAgICAgbmJpdHMgPSAxOwkJLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgMSBiaXQgKi8KKyAgICAgIHdoaWxlICgodGVtcCA+Pj0gMSkpCisJbmJpdHMrKzsKKyAgICAgIC8qIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgY29lZmZpY2llbnQgdmFsdWVzICovCisgICAgICBpZiAobmJpdHMgPiBNQVhfQ09FRl9CSVRTKQorCUVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0RDVF9DT0VGKTsKKyAgICAgIAorICAgICAgLyogQ291bnQgSHVmZm1hbiBzeW1ib2wgZm9yIHJ1biBsZW5ndGggLyBudW1iZXIgb2YgYml0cyAqLworICAgICAgYWNfY291bnRzWyhyIDw8IDQpICsgbmJpdHNdKys7CisgICAgICAKKyAgICAgIHIgPSAwOworICAgIH0KKyAgfQorCisgIC8qIElmIHRoZSBsYXN0IGNvZWYocykgd2VyZSB6ZXJvLCBlbWl0IGFuIGVuZC1vZi1ibG9jayBjb2RlICovCisgIGlmIChyID4gMCkKKyAgICBhY19jb3VudHNbMF0rKzsKK30KKworCisvKgorICogVHJpYWwtZW5jb2RlIG9uZSBNQ1UncyB3b3J0aCBvZiBIdWZmbWFuLWNvbXByZXNzZWQgY29lZmZpY2llbnRzLgorICogTm8gZGF0YSBpcyBhY3R1YWxseSBvdXRwdXQsIHNvIG5vIHN1c3BlbnNpb24gcmV0dXJuIGlzIHBvc3NpYmxlLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZW5jb2RlX21jdV9nYXRoZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBibGtuLCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgLyogVGFrZSBjYXJlIG9mIHJlc3RhcnQgaW50ZXJ2YWxzIGlmIG5lZWRlZCAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkgeworICAgICAgLyogUmUtaW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCisgICAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykKKwllbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSAwOworICAgICAgLyogVXBkYXRlIHJlc3RhcnQgc3RhdGUgKi8KKyAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgICAgfQorICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisgIH0KKworICBmb3IgKGJsa24gPSAwOyBibGtuIDwgY2luZm8tPmJsb2Nrc19pbl9NQ1U7IGJsa24rKykgeworICAgIGNpID0gY2luZm8tPk1DVV9tZW1iZXJzaGlwW2Jsa25dOworICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgaHRlc3Rfb25lX2Jsb2NrKGNpbmZvLCBNQ1VfZGF0YVtibGtuXVswXSwgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldLAorCQkgICAgZW50cm9weS0+ZGNfY291bnRfcHRyc1tjb21wcHRyLT5kY190Ymxfbm9dLAorCQkgICAgZW50cm9weS0+YWNfY291bnRfcHRyc1tjb21wcHRyLT5hY190Ymxfbm9dKTsKKyAgICBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSBNQ1VfZGF0YVtibGtuXVswXVswXTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBHZW5lcmF0ZSB0aGUgYmVzdCBIdWZmbWFuIGNvZGUgdGFibGUgZm9yIHRoZSBnaXZlbiBjb3VudHMsIGZpbGwgaHRibC4KKyAqIE5vdGUgdGhpcyBpcyBhbHNvIHVzZWQgYnkgamNwaHVmZi5jLgorICoKKyAqIFRoZSBKUEVHIHN0YW5kYXJkIHJlcXVpcmVzIHRoYXQgbm8gc3ltYm9sIGJlIGFzc2lnbmVkIGEgY29kZXdvcmQgb2YgYWxsCisgKiBvbmUgYml0cyAoc28gdGhhdCBwYWRkaW5nIGJpdHMgYWRkZWQgYXQgdGhlIGVuZCBvZiBhIGNvbXByZXNzZWQgc2VnbWVudAorICogY2FuJ3QgbG9vayBsaWtlIGEgdmFsaWQgY29kZSkuICBCZWNhdXNlIG9mIHRoZSBjYW5vbmljYWwgb3JkZXJpbmcgb2YKKyAqIGNvZGV3b3JkcywgdGhpcyBqdXN0IG1lYW5zIHRoYXQgdGhlcmUgbXVzdCBiZSBhbiB1bnVzZWQgc2xvdCBpbiB0aGUKKyAqIGxvbmdlc3QgY29kZXdvcmQgbGVuZ3RoIGNhdGVnb3J5LiAgU2VjdGlvbiBLLjIgb2YgdGhlIEpQRUcgc3BlYyBzdWdnZXN0cworICogcmVzZXJ2aW5nIHN1Y2ggYSBzbG90IGJ5IHByZXRlbmRpbmcgdGhhdCBzeW1ib2wgMjU2IGlzIGEgdmFsaWQgc3ltYm9sCisgKiB3aXRoIGNvdW50IDEuICBJbiB0aGVvcnkgdGhhdCdzIG5vdCBvcHRpbWFsOyBnaXZpbmcgaXQgY291bnQgemVybyBidXQKKyAqIGluY2x1ZGluZyBpdCBpbiB0aGUgc3ltYm9sIHNldCBhbnl3YXkgc2hvdWxkIGdpdmUgYSBiZXR0ZXIgSHVmZm1hbiBjb2RlLgorICogQnV0IHRoZSB0aGVvcmV0aWNhbGx5IGJldHRlciBjb2RlIGFjdHVhbGx5IHNlZW1zIHRvIGNvbWUgb3V0IHdvcnNlIGluCisgKiBwcmFjdGljZSwgYmVjYXVzZSBpdCBwcm9kdWNlcyBtb3JlIGFsbC1vbmVzIGJ5dGVzICh3aGljaCBpbmN1ciBzdHVmZmVkCisgKiB6ZXJvIGJ5dGVzIGluIHRoZSBmaW5hbCBmaWxlKS4gIEluIGFueSBjYXNlIHRoZSBkaWZmZXJlbmNlIGlzIHRpbnkuCisgKgorICogVGhlIEpQRUcgc3RhbmRhcmQgcmVxdWlyZXMgSHVmZm1hbiBjb2RlcyB0byBiZSBubyBtb3JlIHRoYW4gMTYgYml0cyBsb25nLgorICogSWYgc29tZSBzeW1ib2xzIGhhdmUgYSB2ZXJ5IHNtYWxsIGJ1dCBub256ZXJvIHByb2JhYmlsaXR5LCB0aGUgSHVmZm1hbiB0cmVlCisgKiBtdXN0IGJlIGFkanVzdGVkIHRvIG1lZXQgdGhlIGNvZGUgbGVuZ3RoIHJlc3RyaWN0aW9uLiAgV2UgY3VycmVudGx5IHVzZQorICogdGhlIGFkanVzdG1lbnQgbWV0aG9kIHN1Z2dlc3RlZCBpbiBKUEVHIHNlY3Rpb24gSy4yLiAgVGhpcyBtZXRob2QgaXMgKm5vdCoKKyAqIG9wdGltYWw7IGl0IG1heSBub3QgY2hvb3NlIHRoZSBiZXN0IHBvc3NpYmxlIGxpbWl0ZWQtbGVuZ3RoIGNvZGUuICBCdXQKKyAqIHR5cGljYWxseSBvbmx5IHZlcnktbG93LWZyZXF1ZW5jeSBzeW1ib2xzIHdpbGwgYmUgZ2l2ZW4gbGVzcy10aGFuLW9wdGltYWwKKyAqIGxlbmd0aHMsIHNvIHRoZSBjb2RlIGlzIGFsbW9zdCBvcHRpbWFsLiAgRXhwZXJpbWVudGFsIGNvbXBhcmlzb25zIGFnYWluc3QKKyAqIGFuIG9wdGltYWwgbGltaXRlZC1sZW5ndGgtY29kZSBhbGdvcml0aG0gaW5kaWNhdGUgdGhhdCB0aGUgZGlmZmVyZW5jZSBpcworICogbWljcm9zY29waWMgLS0tIHVzdWFsbHkgbGVzcyB0aGFuIGEgaHVuZHJlZHRoIG9mIGEgcGVyY2VudCBvZiB0b3RhbCBzaXplLgorICogU28gdGhlIGV4dHJhIGNvbXBsZXhpdHkgb2YgYW4gb3B0aW1hbCBhbGdvcml0aG0gZG9lc24ndCBzZWVtIHdvcnRod2hpbGUuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2dlbl9vcHRpbWFsX3RhYmxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkhVRkZfVEJMICogaHRibCwgbG9uZyBmcmVxW10pCit7CisjZGVmaW5lIE1BWF9DTEVOIDMyCQkvKiBhc3N1bWVkIG1heGltdW0gaW5pdGlhbCBjb2RlIGxlbmd0aCAqLworICBVSU5UOCBiaXRzW01BWF9DTEVOKzFdOwkvKiBiaXRzW2tdID0gIyBvZiBzeW1ib2xzIHdpdGggY29kZSBsZW5ndGggayAqLworICBpbnQgY29kZXNpemVbMjU3XTsJCS8qIGNvZGVzaXplW2tdID0gY29kZSBsZW5ndGggb2Ygc3ltYm9sIGsgKi8KKyAgaW50IG90aGVyc1syNTddOwkJLyogbmV4dCBzeW1ib2wgaW4gY3VycmVudCBicmFuY2ggb2YgdHJlZSAqLworICBpbnQgYzEsIGMyOworICBpbnQgcCwgaSwgajsKKyAgbG9uZyB2OworCisgIC8qIFRoaXMgYWxnb3JpdGhtIGlzIGV4cGxhaW5lZCBpbiBzZWN0aW9uIEsuMiBvZiB0aGUgSlBFRyBzdGFuZGFyZCAqLworCisgIE1FTVpFUk8oYml0cywgU0laRU9GKGJpdHMpKTsKKyAgTUVNWkVSTyhjb2Rlc2l6ZSwgU0laRU9GKGNvZGVzaXplKSk7CisgIGZvciAoaSA9IDA7IGkgPCAyNTc7IGkrKykKKyAgICBvdGhlcnNbaV0gPSAtMTsJCS8qIGluaXQgbGlua3MgdG8gZW1wdHkgKi8KKyAgCisgIGZyZXFbMjU2XSA9IDE7CQkvKiBtYWtlIHN1cmUgMjU2IGhhcyBhIG5vbnplcm8gY291bnQgKi8KKyAgLyogSW5jbHVkaW5nIHRoZSBwc2V1ZG8tc3ltYm9sIDI1NiBpbiB0aGUgSHVmZm1hbiBwcm9jZWR1cmUgZ3VhcmFudGVlcworICAgKiB0aGF0IG5vIHJlYWwgc3ltYm9sIGlzIGdpdmVuIGNvZGUtdmFsdWUgb2YgYWxsIG9uZXMsIGJlY2F1c2UgMjU2CisgICAqIHdpbGwgYmUgcGxhY2VkIGxhc3QgaW4gdGhlIGxhcmdlc3QgY29kZXdvcmQgY2F0ZWdvcnkuCisgICAqLworCisgIC8qIEh1ZmZtYW4ncyBiYXNpYyBhbGdvcml0aG0gdG8gYXNzaWduIG9wdGltYWwgY29kZSBsZW5ndGhzIHRvIHN5bWJvbHMgKi8KKworICBmb3IgKDs7KSB7CisgICAgLyogRmluZCB0aGUgc21hbGxlc3Qgbm9uemVybyBmcmVxdWVuY3ksIHNldCBjMSA9IGl0cyBzeW1ib2wgKi8KKyAgICAvKiBJbiBjYXNlIG9mIHRpZXMsIHRha2UgdGhlIGxhcmdlciBzeW1ib2wgbnVtYmVyICovCisgICAgYzEgPSAtMTsKKyAgICB2ID0gMTAwMDAwMDAwMEw7CisgICAgZm9yIChpID0gMDsgaSA8PSAyNTY7IGkrKykgeworICAgICAgaWYgKGZyZXFbaV0gJiYgZnJlcVtpXSA8PSB2KSB7CisJdiA9IGZyZXFbaV07CisJYzEgPSBpOworICAgICAgfQorICAgIH0KKworICAgIC8qIEZpbmQgdGhlIG5leHQgc21hbGxlc3Qgbm9uemVybyBmcmVxdWVuY3ksIHNldCBjMiA9IGl0cyBzeW1ib2wgKi8KKyAgICAvKiBJbiBjYXNlIG9mIHRpZXMsIHRha2UgdGhlIGxhcmdlciBzeW1ib2wgbnVtYmVyICovCisgICAgYzIgPSAtMTsKKyAgICB2ID0gMTAwMDAwMDAwMEw7CisgICAgZm9yIChpID0gMDsgaSA8PSAyNTY7IGkrKykgeworICAgICAgaWYgKGZyZXFbaV0gJiYgZnJlcVtpXSA8PSB2ICYmIGkgIT0gYzEpIHsKKwl2ID0gZnJlcVtpXTsKKwljMiA9IGk7CisgICAgICB9CisgICAgfQorCisgICAgLyogRG9uZSBpZiB3ZSd2ZSBtZXJnZWQgZXZlcnl0aGluZyBpbnRvIG9uZSBmcmVxdWVuY3kgKi8KKyAgICBpZiAoYzIgPCAwKQorICAgICAgYnJlYWs7CisgICAgCisgICAgLyogRWxzZSBtZXJnZSB0aGUgdHdvIGNvdW50cy90cmVlcyAqLworICAgIGZyZXFbYzFdICs9IGZyZXFbYzJdOworICAgIGZyZXFbYzJdID0gMDsKKworICAgIC8qIEluY3JlbWVudCB0aGUgY29kZXNpemUgb2YgZXZlcnl0aGluZyBpbiBjMSdzIHRyZWUgYnJhbmNoICovCisgICAgY29kZXNpemVbYzFdKys7CisgICAgd2hpbGUgKG90aGVyc1tjMV0gPj0gMCkgeworICAgICAgYzEgPSBvdGhlcnNbYzFdOworICAgICAgY29kZXNpemVbYzFdKys7CisgICAgfQorICAgIAorICAgIG90aGVyc1tjMV0gPSBjMjsJCS8qIGNoYWluIGMyIG9udG8gYzEncyB0cmVlIGJyYW5jaCAqLworICAgIAorICAgIC8qIEluY3JlbWVudCB0aGUgY29kZXNpemUgb2YgZXZlcnl0aGluZyBpbiBjMidzIHRyZWUgYnJhbmNoICovCisgICAgY29kZXNpemVbYzJdKys7CisgICAgd2hpbGUgKG90aGVyc1tjMl0gPj0gMCkgeworICAgICAgYzIgPSBvdGhlcnNbYzJdOworICAgICAgY29kZXNpemVbYzJdKys7CisgICAgfQorICB9CisKKyAgLyogTm93IGNvdW50IHRoZSBudW1iZXIgb2Ygc3ltYm9scyBvZiBlYWNoIGNvZGUgbGVuZ3RoICovCisgIGZvciAoaSA9IDA7IGkgPD0gMjU2OyBpKyspIHsKKyAgICBpZiAoY29kZXNpemVbaV0pIHsKKyAgICAgIC8qIFRoZSBKUEVHIHN0YW5kYXJkIHNlZW1zIHRvIHRoaW5rIHRoYXQgdGhpcyBjYW4ndCBoYXBwZW4sICovCisgICAgICAvKiBidXQgSSdtIHBhcmFub2lkLi4uICovCisgICAgICBpZiAoY29kZXNpemVbaV0gPiBNQVhfQ0xFTikKKwlFUlJFWElUKGNpbmZvLCBKRVJSX0hVRkZfQ0xFTl9PVkVSRkxPVyk7CisKKyAgICAgIGJpdHNbY29kZXNpemVbaV1dKys7CisgICAgfQorICB9CisKKyAgLyogSlBFRyBkb2Vzbid0IGFsbG93IHN5bWJvbHMgd2l0aCBjb2RlIGxlbmd0aHMgb3ZlciAxNiBiaXRzLCBzbyBpZiB0aGUgcHVyZQorICAgKiBIdWZmbWFuIHByb2NlZHVyZSBhc3NpZ25lZCBhbnkgc3VjaCBsZW5ndGhzLCB3ZSBtdXN0IGFkanVzdCB0aGUgY29kaW5nLgorICAgKiBIZXJlIGlzIHdoYXQgdGhlIEpQRUcgc3BlYyBzYXlzIGFib3V0IGhvdyB0aGlzIG5leHQgYml0IHdvcmtzOgorICAgKiBTaW5jZSBzeW1ib2xzIGFyZSBwYWlyZWQgZm9yIHRoZSBsb25nZXN0IEh1ZmZtYW4gY29kZSwgdGhlIHN5bWJvbHMgYXJlCisgICAqIHJlbW92ZWQgZnJvbSB0aGlzIGxlbmd0aCBjYXRlZ29yeSB0d28gYXQgYSB0aW1lLiAgVGhlIHByZWZpeCBmb3IgdGhlIHBhaXIKKyAgICogKHdoaWNoIGlzIG9uZSBiaXQgc2hvcnRlcikgaXMgYWxsb2NhdGVkIHRvIG9uZSBvZiB0aGUgcGFpcjsgdGhlbiwKKyAgICogc2tpcHBpbmcgdGhlIEJJVFMgZW50cnkgZm9yIHRoYXQgcHJlZml4IGxlbmd0aCwgYSBjb2RlIHdvcmQgZnJvbSB0aGUgbmV4dAorICAgKiBzaG9ydGVzdCBub256ZXJvIEJJVFMgZW50cnkgaXMgY29udmVydGVkIGludG8gYSBwcmVmaXggZm9yIHR3byBjb2RlIHdvcmRzCisgICAqIG9uZSBiaXQgbG9uZ2VyLgorICAgKi8KKyAgCisgIGZvciAoaSA9IE1BWF9DTEVOOyBpID4gMTY7IGktLSkgeworICAgIHdoaWxlIChiaXRzW2ldID4gMCkgeworICAgICAgaiA9IGkgLSAyOwkJLyogZmluZCBsZW5ndGggb2YgbmV3IHByZWZpeCB0byBiZSB1c2VkICovCisgICAgICB3aGlsZSAoYml0c1tqXSA9PSAwKQorCWotLTsKKyAgICAgIAorICAgICAgYml0c1tpXSAtPSAyOwkJLyogcmVtb3ZlIHR3byBzeW1ib2xzICovCisgICAgICBiaXRzW2ktMV0rKzsJCS8qIG9uZSBnb2VzIGluIHRoaXMgbGVuZ3RoICovCisgICAgICBiaXRzW2orMV0gKz0gMjsJCS8qIHR3byBuZXcgc3ltYm9scyBpbiB0aGlzIGxlbmd0aCAqLworICAgICAgYml0c1tqXS0tOwkJLyogc3ltYm9sIG9mIHRoaXMgbGVuZ3RoIGlzIG5vdyBhIHByZWZpeCAqLworICAgIH0KKyAgfQorCisgIC8qIFJlbW92ZSB0aGUgY291bnQgZm9yIHRoZSBwc2V1ZG8tc3ltYm9sIDI1NiBmcm9tIHRoZSBsYXJnZXN0IGNvZGVsZW5ndGggKi8KKyAgd2hpbGUgKGJpdHNbaV0gPT0gMCkJCS8qIGZpbmQgbGFyZ2VzdCBjb2RlbGVuZ3RoIHN0aWxsIGluIHVzZSAqLworICAgIGktLTsKKyAgYml0c1tpXS0tOworICAKKyAgLyogUmV0dXJuIGZpbmFsIHN5bWJvbCBjb3VudHMgKG9ubHkgZm9yIGxlbmd0aHMgMC4uMTYpICovCisgIE1FTUNPUFkoaHRibC0+Yml0cywgYml0cywgU0laRU9GKGh0YmwtPmJpdHMpKTsKKyAgCisgIC8qIFJldHVybiBhIGxpc3Qgb2YgdGhlIHN5bWJvbHMgc29ydGVkIGJ5IGNvZGUgbGVuZ3RoICovCisgIC8qIEl0J3Mgbm90IHJlYWwgY2xlYXIgdG8gbWUgd2h5IHdlIGRvbid0IG5lZWQgdG8gY29uc2lkZXIgdGhlIGNvZGVsZW5ndGgKKyAgICogY2hhbmdlcyBtYWRlIGFib3ZlLCBidXQgdGhlIEpQRUcgc3BlYyBzZWVtcyB0byB0aGluayB0aGlzIHdvcmtzLgorICAgKi8KKyAgcCA9IDA7CisgIGZvciAoaSA9IDE7IGkgPD0gTUFYX0NMRU47IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPD0gMjU1OyBqKyspIHsKKyAgICAgIGlmIChjb2Rlc2l6ZVtqXSA9PSBpKSB7CisJaHRibC0+aHVmZnZhbFtwXSA9IChVSU5UOCkgajsKKwlwKys7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogU2V0IHNlbnRfdGFibGUgRkFMU0Ugc28gdXBkYXRlZCB0YWJsZSB3aWxsIGJlIHdyaXR0ZW4gdG8gSlBFRyBmaWxlLiAqLworICBodGJsLT5zZW50X3RhYmxlID0gRkFMU0U7Cit9CisKKworLyoKKyAqIEZpbmlzaCB1cCBhIHN0YXRpc3RpY3MtZ2F0aGVyaW5nIHBhc3MgYW5kIGNyZWF0ZSB0aGUgbmV3IEh1ZmZtYW4gdGFibGVzLgorICovCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX3Bhc3NfZ2F0aGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBpbnQgY2ksIGRjdGJsLCBhY3RibDsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisgIEpIVUZGX1RCTCAqKmh0YmxwdHI7CisgIGJvb2xlYW4gZGlkX2RjW05VTV9IVUZGX1RCTFNdOworICBib29sZWFuIGRpZF9hY1tOVU1fSFVGRl9UQkxTXTsKKworICAvKiBJdCdzIGltcG9ydGFudCBub3QgdG8gYXBwbHkganBlZ19nZW5fb3B0aW1hbF90YWJsZSBtb3JlIHRoYW4gb25jZQorICAgKiBwZXIgdGFibGUsIGJlY2F1c2UgaXQgY2xvYmJlcnMgdGhlIGlucHV0IGZyZXF1ZW5jeSBjb3VudHMhCisgICAqLworICBNRU1aRVJPKGRpZF9kYywgU0laRU9GKGRpZF9kYykpOworICBNRU1aRVJPKGRpZF9hYywgU0laRU9GKGRpZF9hYykpOworCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICBkY3RibCA9IGNvbXBwdHItPmRjX3RibF9ubzsKKyAgICBhY3RibCA9IGNvbXBwdHItPmFjX3RibF9ubzsKKyAgICBpZiAoISBkaWRfZGNbZGN0YmxdKSB7CisgICAgICBodGJscHRyID0gJiBjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1tkY3RibF07CisgICAgICBpZiAoKmh0YmxwdHIgPT0gTlVMTCkKKwkqaHRibHB0ciA9IGpwZWdfYWxsb2NfaHVmZl90YWJsZSgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICAgICBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlKGNpbmZvLCAqaHRibHB0ciwgZW50cm9weS0+ZGNfY291bnRfcHRyc1tkY3RibF0pOworICAgICAgZGlkX2RjW2RjdGJsXSA9IFRSVUU7CisgICAgfQorICAgIGlmICghIGRpZF9hY1thY3RibF0pIHsKKyAgICAgIGh0YmxwdHIgPSAmIGNpbmZvLT5hY19odWZmX3RibF9wdHJzW2FjdGJsXTsKKyAgICAgIGlmICgqaHRibHB0ciA9PSBOVUxMKQorCSpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgICAgIGpwZWdfZ2VuX29wdGltYWxfdGFibGUoY2luZm8sICpodGJscHRyLCBlbnRyb3B5LT5hY19jb3VudF9wdHJzW2FjdGJsXSk7CisgICAgICBkaWRfYWNbYWN0YmxdID0gVFJVRTsKKyAgICB9CisgIH0KK30KKworCisjZW5kaWYgLyogRU5UUk9QWV9PUFRfU1VQUE9SVEVEICovCisKKworLyoKKyAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciBIdWZmbWFuIGVudHJvcHkgZW5jb2RpbmcuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9odWZmX2VuY29kZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHk7CisgIGludCBpOworCisgIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihodWZmX2VudHJvcHlfZW5jb2RlcikpOworICBjaW5mby0+ZW50cm9weSA9IChzdHJ1Y3QganBlZ19lbnRyb3B5X2VuY29kZXIgKikgZW50cm9weTsKKyAgZW50cm9weS0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX2h1ZmY7CisKKyAgLyogTWFyayB0YWJsZXMgdW5hbGxvY2F0ZWQgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgeworICAgIGVudHJvcHktPmRjX2Rlcml2ZWRfdGJsc1tpXSA9IGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsc1tpXSA9IE5VTEw7CisjaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECisgICAgZW50cm9weS0+ZGNfY291bnRfcHRyc1tpXSA9IGVudHJvcHktPmFjX2NvdW50X3B0cnNbaV0gPSBOVUxMOworI2VuZGlmCisgIH0KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY2luaXQuYyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWZmZmUzCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjaW5pdC5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBqY2luaXQuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGluaXRpYWxpemF0aW9uIGxvZ2ljIGZvciB0aGUgSlBFRyBjb21wcmVzc29yLgorICogVGhpcyByb3V0aW5lIGlzIGluIGNoYXJnZSBvZiBzZWxlY3RpbmcgdGhlIG1vZHVsZXMgdG8gYmUgZXhlY3V0ZWQgYW5kCisgKiBtYWtpbmcgYW4gaW5pdGlhbGl6YXRpb24gY2FsbCB0byBlYWNoIG9uZS4KKyAqCisgKiBMb2dpY2FsbHksIHRoaXMgY29kZSBiZWxvbmdzIGluIGpjbWFzdGVyLmMuICBJdCdzIHNwbGl0IG91dCBiZWNhdXNlCisgKiBsaW5raW5nIHRoaXMgcm91dGluZSBpbXBsaWVzIGxpbmtpbmcgdGhlIGVudGlyZSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorICogRm9yIGEgdHJhbnNjb2Rpbmctb25seSBhcHBsaWNhdGlvbiwgd2Ugd2FudCB0byBiZSBhYmxlIHRvIHVzZSBqY21hc3Rlci5jCisgKiB3aXRob3V0IGxpbmtpbmcgaW4gdGhlIHdob2xlIGxpYnJhcnkuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qCisgKiBNYXN0ZXIgc2VsZWN0aW9uIG9mIGNvbXByZXNzaW9uIG1vZHVsZXMuCisgKiBUaGlzIGlzIGRvbmUgb25jZSBhdCB0aGUgc3RhcnQgb2YgcHJvY2Vzc2luZyBhbiBpbWFnZS4gIFdlIGRldGVybWluZQorICogd2hpY2ggbW9kdWxlcyB3aWxsIGJlIHVzZWQgYW5kIGdpdmUgdGhlbSBhcHByb3ByaWF0ZSBpbml0aWFsaXphdGlvbiBjYWxscy4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X2NvbXByZXNzX21hc3RlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIC8qIEluaXRpYWxpemUgbWFzdGVyIGNvbnRyb2wgKGluY2x1ZGVzIHBhcmFtZXRlciBjaGVja2luZy9wcm9jZXNzaW5nKSAqLworICBqaW5pdF9jX21hc3Rlcl9jb250cm9sKGNpbmZvLCBGQUxTRSAvKiBmdWxsIGNvbXByZXNzaW9uICovKTsKKworICAvKiBQcmVwcm9jZXNzaW5nICovCisgIGlmICghIGNpbmZvLT5yYXdfZGF0YV9pbikgeworICAgIGppbml0X2NvbG9yX2NvbnZlcnRlcihjaW5mbyk7CisgICAgamluaXRfZG93bnNhbXBsZXIoY2luZm8pOworICAgIGppbml0X2NfcHJlcF9jb250cm9sbGVyKGNpbmZvLCBGQUxTRSAvKiBuZXZlciBuZWVkIGZ1bGwgYnVmZmVyIGhlcmUgKi8pOworICB9CisgIC8qIEZvcndhcmQgRENUICovCisgIGppbml0X2ZvcndhcmRfZGN0KGNpbmZvKTsKKyAgLyogRW50cm9weSBlbmNvZGluZzogZWl0aGVyIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYyBjb2RpbmcuICovCisgIGlmIChjaW5mby0+YXJpdGhfY29kZSkgeworICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQVJJVEhfTk9USU1QTCk7CisgIH0gZWxzZSB7CisgICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7CisjaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKKyAgICAgIGppbml0X3BodWZmX2VuY29kZXIoY2luZm8pOworI2Vsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICAgIH0gZWxzZQorICAgICAgamluaXRfaHVmZl9lbmNvZGVyKGNpbmZvKTsKKyAgfQorCisgIC8qIE5lZWQgYSBmdWxsLWltYWdlIGNvZWZmaWNpZW50IGJ1ZmZlciBpbiBhbnkgbXVsdGktcGFzcyBtb2RlLiAqLworICBqaW5pdF9jX2NvZWZfY29udHJvbGxlcihjaW5mbywKKwkJKGJvb2xlYW4pIChjaW5mby0+bnVtX3NjYW5zID4gMSB8fCBjaW5mby0+b3B0aW1pemVfY29kaW5nKSk7CisgIGppbml0X2NfbWFpbl9jb250cm9sbGVyKGNpbmZvLCBGQUxTRSAvKiBuZXZlciBuZWVkIGZ1bGwgYnVmZmVyIGhlcmUgKi8pOworCisgIGppbml0X21hcmtlcl93cml0ZXIoY2luZm8pOworCisgIC8qIFdlIGNhbiBub3cgdGVsbCB0aGUgbWVtb3J5IG1hbmFnZXIgdG8gYWxsb2NhdGUgdmlydHVhbCBhcnJheXMuICovCisgICgqY2luZm8tPm1lbS0+cmVhbGl6ZV92aXJ0X2FycmF5cykgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKworICAvKiBXcml0ZSB0aGUgZGF0YXN0cmVhbSBoZWFkZXIgKFNPSSkgaW1tZWRpYXRlbHkuCisgICAqIEZyYW1lIGFuZCBzY2FuIGhlYWRlcnMgYXJlIHBvc3Rwb25lZCB0aWxsIGxhdGVyLgorICAgKiBUaGlzIGxldHMgYXBwbGljYXRpb24gaW5zZXJ0IHNwZWNpYWwgbWFya2VycyBhZnRlciB0aGUgU09JLgorICAgKi8KKyAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9maWxlX2hlYWRlcikgKGNpbmZvKTsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY21haW5jdC5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjbWFpbmN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyNzlhNwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY21haW5jdC5jCkBAIC0wLDAgKzEsMjkzIEBACisvKgorICogamNtYWluY3QuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtYWluIGJ1ZmZlciBjb250cm9sbGVyIGZvciBjb21wcmVzc2lvbi4KKyAqIFRoZSBtYWluIGJ1ZmZlciBsaWVzIGJldHdlZW4gdGhlIHByZS1wcm9jZXNzb3IgYW5kIHRoZSBKUEVHCisgKiBjb21wcmVzc29yIHByb3BlcjsgaXQgaG9sZHMgZG93bnNhbXBsZWQgZGF0YSBpbiB0aGUgSlBFRyBjb2xvcnNwYWNlLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKiBOb3RlOiBjdXJyZW50bHksIHRoZXJlIGlzIG5vIG9wZXJhdGluZyBtb2RlIGluIHdoaWNoIGEgZnVsbC1pbWFnZSBidWZmZXIKKyAqIGlzIG5lZWRlZCBhdCB0aGlzIHN0ZXAuICBJZiB0aGVyZSB3ZXJlLCB0aGF0IG1vZGUgY291bGQgbm90IGJlIHVzZWQgd2l0aAorICogInJhdyBkYXRhIiBpbnB1dCwgc2luY2UgdGhpcyBtb2R1bGUgaXMgYnlwYXNzZWQgaW4gdGhhdCBjYXNlLiAgSG93ZXZlciwKKyAqIHdlJ3ZlIGxlZnQgdGhlIGNvZGUgaGVyZSBmb3IgcG9zc2libGUgdXNlIGluIHNwZWNpYWwgYXBwbGljYXRpb25zLgorICovCisjdW5kZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKKworCisvKiBQcml2YXRlIGJ1ZmZlciBjb250cm9sbGVyIG9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2NfbWFpbl9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIEpESU1FTlNJT04gY3VyX2lNQ1Vfcm93OwkvKiBudW1iZXIgb2YgY3VycmVudCBpTUNVIHJvdyAqLworICBKRElNRU5TSU9OIHJvd2dyb3VwX2N0cjsJLyogY291bnRzIHJvdyBncm91cHMgcmVjZWl2ZWQgaW4gaU1DVSByb3cgKi8KKyAgYm9vbGVhbiBzdXNwZW5kZWQ7CQkvKiByZW1lbWJlciBpZiB3ZSBzdXNwZW5kZWQgb3V0cHV0ICovCisgIEpfQlVGX01PREUgcGFzc19tb2RlOwkJLyogY3VycmVudCBvcGVyYXRpbmcgbW9kZSAqLworCisgIC8qIElmIHVzaW5nIGp1c3QgYSBzdHJpcCBidWZmZXIsIHRoaXMgcG9pbnRzIHRvIHRoZSBlbnRpcmUgc2V0IG9mIGJ1ZmZlcnMKKyAgICogKHdlIGFsbG9jYXRlIG9uZSBmb3IgZWFjaCBjb21wb25lbnQpLiAgSW4gdGhlIGZ1bGwtaW1hZ2UgY2FzZSwgdGhpcworICAgKiBwb2ludHMgdG8gdGhlIGN1cnJlbnRseSBhY2Nlc3NpYmxlIHN0cmlwcyBvZiB0aGUgdmlydHVhbCBhcnJheXMuCisgICAqLworICBKU0FNUEFSUkFZIGJ1ZmZlcltNQVhfQ09NUE9ORU5UU107CisKKyNpZmRlZiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRAorICAvKiBJZiB1c2luZyBmdWxsLWltYWdlIHN0b3JhZ2UsIHRoaXMgYXJyYXkgaG9sZHMgcG9pbnRlcnMgdG8gdmlydHVhbC1hcnJheQorICAgKiBjb250cm9sIGJsb2NrcyBmb3IgZWFjaCBjb21wb25lbnQuICBVbnVzZWQgaWYgbm90IGZ1bGwtaW1hZ2Ugc3RvcmFnZS4KKyAgICovCisgIGp2aXJ0X3NhcnJheV9wdHIgd2hvbGVfaW1hZ2VbTUFYX0NPTVBPTkVOVFNdOworI2VuZGlmCit9IG15X21haW5fY29udHJvbGxlcjsKKwordHlwZWRlZiBteV9tYWluX2NvbnRyb2xsZXIgKiBteV9tYWluX3B0cjsKKworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworTUVUSE9EREVGKHZvaWQpIHByb2Nlc3NfZGF0YV9zaW1wbGVfbWFpbgorCUpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgaW5wdXRfYnVmLAorCSAgICAgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwgSkRJTUVOU0lPTiBpbl9yb3dzX2F2YWlsKSk7CisjaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKK01FVEhPRERFRih2b2lkKSBwcm9jZXNzX2RhdGFfYnVmZmVyX21haW4KKwlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIGlucHV0X2J1ZiwKKwkgICAgIEpESU1FTlNJT04gKmluX3Jvd19jdHIsIEpESU1FTlNJT04gaW5fcm93c19hdmFpbCkpOworI2VuZGlmCisKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIGEgcHJvY2Vzc2luZyBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19tYWluIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpCit7CisgIG15X21haW5fcHRyIG1haW4gPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOworCisgIC8qIERvIG5vdGhpbmcgaW4gcmF3LWRhdGEgbW9kZS4gKi8KKyAgaWYgKGNpbmZvLT5yYXdfZGF0YV9pbikKKyAgICByZXR1cm47CisKKyAgbWFpbi0+Y3VyX2lNQ1Vfcm93ID0gMDsJLyogaW5pdGlhbGl6ZSBjb3VudGVycyAqLworICBtYWluLT5yb3dncm91cF9jdHIgPSAwOworICBtYWluLT5zdXNwZW5kZWQgPSBGQUxTRTsKKyAgbWFpbi0+cGFzc19tb2RlID0gcGFzc19tb2RlOwkvKiBzYXZlIG1vZGUgZm9yIHVzZSBieSBwcm9jZXNzX2RhdGEgKi8KKworICBzd2l0Y2ggKHBhc3NfbW9kZSkgeworICBjYXNlIEpCVUZfUEFTU19USFJVOgorI2lmZGVmIEZVTExfTUFJTl9CVUZGRVJfU1VQUE9SVEVECisgICAgaWYgKG1haW4tPndob2xlX2ltYWdlWzBdICE9IE5VTEwpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisjZW5kaWYKKyAgICBtYWluLT5wdWIucHJvY2Vzc19kYXRhID0gcHJvY2Vzc19kYXRhX3NpbXBsZV9tYWluOworICAgIGJyZWFrOworI2lmZGVmIEZVTExfTUFJTl9CVUZGRVJfU1VQUE9SVEVECisgIGNhc2UgSkJVRl9TQVZFX1NPVVJDRToKKyAgY2FzZSBKQlVGX0NSQU5LX0RFU1Q6CisgIGNhc2UgSkJVRl9TQVZFX0FORF9QQVNTOgorICAgIGlmIChtYWluLT53aG9sZV9pbWFnZVswXSA9PSBOVUxMKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOworICAgIG1haW4tPnB1Yi5wcm9jZXNzX2RhdGEgPSBwcm9jZXNzX2RhdGFfYnVmZmVyX21haW47CisgICAgYnJlYWs7CisjZW5kaWYKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisgICAgYnJlYWs7CisgIH0KK30KKworCisvKgorICogUHJvY2VzcyBzb21lIGRhdGEuCisgKiBUaGlzIHJvdXRpbmUgaGFuZGxlcyB0aGUgc2ltcGxlIHBhc3MtdGhyb3VnaCBtb2RlLAorICogd2hlcmUgd2UgaGF2ZSBvbmx5IGEgc3RyaXAgYnVmZmVyLgorICovCisKK01FVEhPRERFRih2b2lkKQorcHJvY2Vzc19kYXRhX3NpbXBsZV9tYWluIChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCSAgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19jdHIsCisJCQkgIEpESU1FTlNJT04gaW5fcm93c19hdmFpbCkKK3sKKyAgbXlfbWFpbl9wdHIgbWFpbiA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47CisKKyAgd2hpbGUgKG1haW4tPmN1cl9pTUNVX3JvdyA8IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MpIHsKKyAgICAvKiBSZWFkIGlucHV0IGRhdGEgaWYgd2UgaGF2ZW4ndCBmaWxsZWQgdGhlIG1haW4gYnVmZmVyIHlldCAqLworICAgIGlmIChtYWluLT5yb3dncm91cF9jdHIgPCBEQ1RTSVpFKQorICAgICAgKCpjaW5mby0+cHJlcC0+cHJlX3Byb2Nlc3NfZGF0YSkgKGNpbmZvLAorCQkJCQlpbnB1dF9idWYsIGluX3Jvd19jdHIsIGluX3Jvd3NfYXZhaWwsCisJCQkJCW1haW4tPmJ1ZmZlciwgJm1haW4tPnJvd2dyb3VwX2N0ciwKKwkJCQkJKEpESU1FTlNJT04pIERDVFNJWkUpOworCisgICAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIGZ1bGwgaU1DVSByb3cgYnVmZmVyZWQsIHJldHVybiB0byBhcHBsaWNhdGlvbiBmb3IKKyAgICAgKiBtb3JlIGRhdGEuICBOb3RlIHRoYXQgcHJlcHJvY2Vzc29yIHdpbGwgYWx3YXlzIHBhZCB0byBmaWxsIHRoZSBpTUNVIHJvdworICAgICAqIGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLgorICAgICAqLworICAgIGlmIChtYWluLT5yb3dncm91cF9jdHIgIT0gRENUU0laRSkKKyAgICAgIHJldHVybjsKKworICAgIC8qIFNlbmQgdGhlIGNvbXBsZXRlZCByb3cgdG8gdGhlIGNvbXByZXNzb3IgKi8KKyAgICBpZiAoISAoKmNpbmZvLT5jb2VmLT5jb21wcmVzc19kYXRhKSAoY2luZm8sIG1haW4tPmJ1ZmZlcikpIHsKKyAgICAgIC8qIElmIGNvbXByZXNzb3IgZGlkIG5vdCBjb25zdW1lIHRoZSB3aG9sZSByb3csIHRoZW4gd2UgbXVzdCBuZWVkIHRvCisgICAgICAgKiBzdXNwZW5kIHByb2Nlc3NpbmcgYW5kIHJldHVybiB0byB0aGUgYXBwbGljYXRpb24uICBJbiB0aGlzIHNpdHVhdGlvbgorICAgICAgICogd2UgcHJldGVuZCB3ZSBkaWRuJ3QgeWV0IGNvbnN1bWUgdGhlIGxhc3QgaW5wdXQgcm93OyBvdGhlcndpc2UsIGlmCisgICAgICAgKiBpdCBoYXBwZW5lZCB0byBiZSB0aGUgbGFzdCByb3cgb2YgdGhlIGltYWdlLCB0aGUgYXBwbGljYXRpb24gd291bGQKKyAgICAgICAqIHRoaW5rIHdlIHdlcmUgZG9uZS4KKyAgICAgICAqLworICAgICAgaWYgKCEgbWFpbi0+c3VzcGVuZGVkKSB7CisJKCppbl9yb3dfY3RyKS0tOworCW1haW4tPnN1c3BlbmRlZCA9IFRSVUU7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIFdlIGRpZCBmaW5pc2ggdGhlIHJvdy4gIFVuZG8gb3VyIGxpdHRsZSBzdXNwZW5zaW9uIGhhY2sgaWYgYSBwcmV2aW91cworICAgICAqIGNhbGwgc3VzcGVuZGVkOyB0aGVuIG1hcmsgdGhlIG1haW4gYnVmZmVyIGVtcHR5LgorICAgICAqLworICAgIGlmIChtYWluLT5zdXNwZW5kZWQpIHsKKyAgICAgICgqaW5fcm93X2N0cikrKzsKKyAgICAgIG1haW4tPnN1c3BlbmRlZCA9IEZBTFNFOworICAgIH0KKyAgICBtYWluLT5yb3dncm91cF9jdHIgPSAwOworICAgIG1haW4tPmN1cl9pTUNVX3JvdysrOworICB9Cit9CisKKworI2lmZGVmIEZVTExfTUFJTl9CVUZGRVJfU1VQUE9SVEVECisKKy8qCisgKiBQcm9jZXNzIHNvbWUgZGF0YS4KKyAqIFRoaXMgcm91dGluZSBoYW5kbGVzIGFsbCBvZiB0aGUgbW9kZXMgdGhhdCB1c2UgYSBmdWxsLXNpemUgYnVmZmVyLgorICovCisKK01FVEhPRERFRih2b2lkKQorcHJvY2Vzc19kYXRhX2J1ZmZlcl9tYWluIChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCSAgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19jdHIsCisJCQkgIEpESU1FTlNJT04gaW5fcm93c19hdmFpbCkKK3sKKyAgbXlfbWFpbl9wdHIgbWFpbiA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47CisgIGludCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgYm9vbGVhbiB3cml0aW5nID0gKG1haW4tPnBhc3NfbW9kZSAhPSBKQlVGX0NSQU5LX0RFU1QpOworCisgIHdoaWxlIChtYWluLT5jdXJfaU1DVV9yb3cgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzKSB7CisgICAgLyogUmVhbGlnbiB0aGUgdmlydHVhbCBidWZmZXJzIGlmIGF0IHRoZSBzdGFydCBvZiBhbiBpTUNVIHJvdy4gKi8KKyAgICBpZiAobWFpbi0+cm93Z3JvdXBfY3RyID09IDApIHsKKyAgICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisJICAgY2krKywgY29tcHB0cisrKSB7CisJbWFpbi0+YnVmZmVyW2NpXSA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQorCSAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBtYWluLT53aG9sZV9pbWFnZVtjaV0sCisJICAgbWFpbi0+Y3VyX2lNQ1Vfcm93ICogKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSwKKwkgICAoSkRJTUVOU0lPTikgKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSwgd3JpdGluZyk7CisgICAgICB9CisgICAgICAvKiBJbiBhIHJlYWQgcGFzcywgcHJldGVuZCB3ZSBqdXN0IHJlYWQgc29tZSBzb3VyY2UgZGF0YS4gKi8KKyAgICAgIGlmICghIHdyaXRpbmcpIHsKKwkqaW5fcm93X2N0ciArPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFOworCW1haW4tPnJvd2dyb3VwX2N0ciA9IERDVFNJWkU7CisgICAgICB9CisgICAgfQorCisgICAgLyogSWYgYSB3cml0ZSBwYXNzLCByZWFkIGlucHV0IGRhdGEgdW50aWwgdGhlIGN1cnJlbnQgaU1DVSByb3cgaXMgZnVsbC4gKi8KKyAgICAvKiBOb3RlOiBwcmVwcm9jZXNzb3Igd2lsbCBwYWQgaWYgbmVjZXNzYXJ5IHRvIGZpbGwgdGhlIGxhc3QgaU1DVSByb3cuICovCisgICAgaWYgKHdyaXRpbmcpIHsKKyAgICAgICgqY2luZm8tPnByZXAtPnByZV9wcm9jZXNzX2RhdGEpIChjaW5mbywKKwkJCQkJaW5wdXRfYnVmLCBpbl9yb3dfY3RyLCBpbl9yb3dzX2F2YWlsLAorCQkJCQltYWluLT5idWZmZXIsICZtYWluLT5yb3dncm91cF9jdHIsCisJCQkJCShKRElNRU5TSU9OKSBEQ1RTSVpFKTsKKyAgICAgIC8qIFJldHVybiB0byBhcHBsaWNhdGlvbiBpZiB3ZSBuZWVkIG1vcmUgZGF0YSB0byBmaWxsIHRoZSBpTUNVIHJvdy4gKi8KKyAgICAgIGlmIChtYWluLT5yb3dncm91cF9jdHIgPCBEQ1RTSVpFKQorCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBFbWl0IGRhdGEsIHVubGVzcyB0aGlzIGlzIGEgc2luay1vbmx5IHBhc3MuICovCisgICAgaWYgKG1haW4tPnBhc3NfbW9kZSAhPSBKQlVGX1NBVkVfU09VUkNFKSB7CisgICAgICBpZiAoISAoKmNpbmZvLT5jb2VmLT5jb21wcmVzc19kYXRhKSAoY2luZm8sIG1haW4tPmJ1ZmZlcikpIHsKKwkvKiBJZiBjb21wcmVzc29yIGRpZCBub3QgY29uc3VtZSB0aGUgd2hvbGUgcm93LCB0aGVuIHdlIG11c3QgbmVlZCB0bworCSAqIHN1c3BlbmQgcHJvY2Vzc2luZyBhbmQgcmV0dXJuIHRvIHRoZSBhcHBsaWNhdGlvbi4gIEluIHRoaXMgc2l0dWF0aW9uCisJICogd2UgcHJldGVuZCB3ZSBkaWRuJ3QgeWV0IGNvbnN1bWUgdGhlIGxhc3QgaW5wdXQgcm93OyBvdGhlcndpc2UsIGlmCisJICogaXQgaGFwcGVuZWQgdG8gYmUgdGhlIGxhc3Qgcm93IG9mIHRoZSBpbWFnZSwgdGhlIGFwcGxpY2F0aW9uIHdvdWxkCisJICogdGhpbmsgd2Ugd2VyZSBkb25lLgorCSAqLworCWlmICghIG1haW4tPnN1c3BlbmRlZCkgeworCSAgKCppbl9yb3dfY3RyKS0tOworCSAgbWFpbi0+c3VzcGVuZGVkID0gVFJVRTsKKwl9CisJcmV0dXJuOworICAgICAgfQorICAgICAgLyogV2UgZGlkIGZpbmlzaCB0aGUgcm93LiAgVW5kbyBvdXIgbGl0dGxlIHN1c3BlbnNpb24gaGFjayBpZiBhIHByZXZpb3VzCisgICAgICAgKiBjYWxsIHN1c3BlbmRlZDsgdGhlbiBtYXJrIHRoZSBtYWluIGJ1ZmZlciBlbXB0eS4KKyAgICAgICAqLworICAgICAgaWYgKG1haW4tPnN1c3BlbmRlZCkgeworCSgqaW5fcm93X2N0cikrKzsKKwltYWluLT5zdXNwZW5kZWQgPSBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJZiBnZXQgaGVyZSwgd2UgYXJlIGRvbmUgd2l0aCB0aGlzIGlNQ1Ugcm93LiAgTWFyayBidWZmZXIgZW1wdHkuICovCisgICAgbWFpbi0+cm93Z3JvdXBfY3RyID0gMDsKKyAgICBtYWluLT5jdXJfaU1DVV9yb3crKzsKKyAgfQorfQorCisjZW5kaWYgLyogRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQgKi8KKworCisvKgorICogSW5pdGlhbGl6ZSBtYWluIGJ1ZmZlciBjb250cm9sbGVyLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfY19tYWluX2NvbnRyb2xsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpCit7CisgIG15X21haW5fcHRyIG1haW47CisgIGludCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICBtYWluID0gKG15X21haW5fcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKG15X21haW5fY29udHJvbGxlcikpOworICBjaW5mby0+bWFpbiA9IChzdHJ1Y3QganBlZ19jX21haW5fY29udHJvbGxlciAqKSBtYWluOworICBtYWluLT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfbWFpbjsKKworICAvKiBXZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBhIGJ1ZmZlciBpbiByYXctZGF0YSBtb2RlLiAqLworICBpZiAoY2luZm8tPnJhd19kYXRhX2luKQorICAgIHJldHVybjsKKworICAvKiBDcmVhdGUgdGhlIGJ1ZmZlci4gIEl0IGhvbGRzIGRvd25zYW1wbGVkIGRhdGEsIHNvIGVhY2ggY29tcG9uZW50CisgICAqIG1heSBiZSBvZiBhIGRpZmZlcmVudCBzaXplLgorICAgKi8KKyAgaWYgKG5lZWRfZnVsbF9idWZmZXIpIHsKKyNpZmRlZiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRAorICAgIC8qIEFsbG9jYXRlIGEgZnVsbC1pbWFnZSB2aXJ0dWFsIGFycmF5IGZvciBlYWNoIGNvbXBvbmVudCAqLworICAgIC8qIE5vdGUgd2UgcGFkIHRoZSBib3R0b20gdG8gYSBtdWx0aXBsZSBvZiB0aGUgaU1DVSBoZWlnaHQgKi8KKyAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworCSBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAgIG1haW4tPndob2xlX2ltYWdlW2NpXSA9ICgqY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X3NhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBGQUxTRSwKKwkgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRSwKKwkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcywKKwkJCQkobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgKiBEQ1RTSVpFLAorCSAoSkRJTUVOU0lPTikgKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7CisgICAgfQorI2Vsc2UKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisjZW5kaWYKKyAgfSBlbHNlIHsKKyNpZmRlZiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRAorICAgIG1haW4tPndob2xlX2ltYWdlWzBdID0gTlVMTDsgLyogZmxhZyBmb3Igbm8gdmlydHVhbCBhcnJheXMgKi8KKyNlbmRpZgorICAgIC8qIEFsbG9jYXRlIGEgc3RyaXAgYnVmZmVyIGZvciBlYWNoIGNvbXBvbmVudCAqLworICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisJIGNpKyssIGNvbXBwdHIrKykgeworICAgICAgbWFpbi0+YnVmZmVyW2NpXSA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQorCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUsCisJIChKRElNRU5TSU9OKSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY21hcmtlci5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjbWFya2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QxZTZjNgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY21hcmtlci5jCkBAIC0wLDAgKzEsNjY0IEBACisvKgorICogamNtYXJrZXIuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHdyaXRlIEpQRUcgZGF0YXN0cmVhbSBtYXJrZXJzLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCit0eXBlZGVmIGVudW0gewkJCS8qIEpQRUcgbWFya2VyIGNvZGVzICovCisgIE1fU09GMCAgPSAweGMwLAorICBNX1NPRjEgID0gMHhjMSwKKyAgTV9TT0YyICA9IDB4YzIsCisgIE1fU09GMyAgPSAweGMzLAorICAKKyAgTV9TT0Y1ICA9IDB4YzUsCisgIE1fU09GNiAgPSAweGM2LAorICBNX1NPRjcgID0gMHhjNywKKyAgCisgIE1fSlBHICAgPSAweGM4LAorICBNX1NPRjkgID0gMHhjOSwKKyAgTV9TT0YxMCA9IDB4Y2EsCisgIE1fU09GMTEgPSAweGNiLAorICAKKyAgTV9TT0YxMyA9IDB4Y2QsCisgIE1fU09GMTQgPSAweGNlLAorICBNX1NPRjE1ID0gMHhjZiwKKyAgCisgIE1fREhUICAgPSAweGM0LAorICAKKyAgTV9EQUMgICA9IDB4Y2MsCisgIAorICBNX1JTVDAgID0gMHhkMCwKKyAgTV9SU1QxICA9IDB4ZDEsCisgIE1fUlNUMiAgPSAweGQyLAorICBNX1JTVDMgID0gMHhkMywKKyAgTV9SU1Q0ICA9IDB4ZDQsCisgIE1fUlNUNSAgPSAweGQ1LAorICBNX1JTVDYgID0gMHhkNiwKKyAgTV9SU1Q3ICA9IDB4ZDcsCisgIAorICBNX1NPSSAgID0gMHhkOCwKKyAgTV9FT0kgICA9IDB4ZDksCisgIE1fU09TICAgPSAweGRhLAorICBNX0RRVCAgID0gMHhkYiwKKyAgTV9ETkwgICA9IDB4ZGMsCisgIE1fRFJJICAgPSAweGRkLAorICBNX0RIUCAgID0gMHhkZSwKKyAgTV9FWFAgICA9IDB4ZGYsCisgIAorICBNX0FQUDAgID0gMHhlMCwKKyAgTV9BUFAxICA9IDB4ZTEsCisgIE1fQVBQMiAgPSAweGUyLAorICBNX0FQUDMgID0gMHhlMywKKyAgTV9BUFA0ICA9IDB4ZTQsCisgIE1fQVBQNSAgPSAweGU1LAorICBNX0FQUDYgID0gMHhlNiwKKyAgTV9BUFA3ICA9IDB4ZTcsCisgIE1fQVBQOCAgPSAweGU4LAorICBNX0FQUDkgID0gMHhlOSwKKyAgTV9BUFAxMCA9IDB4ZWEsCisgIE1fQVBQMTEgPSAweGViLAorICBNX0FQUDEyID0gMHhlYywKKyAgTV9BUFAxMyA9IDB4ZWQsCisgIE1fQVBQMTQgPSAweGVlLAorICBNX0FQUDE1ID0gMHhlZiwKKyAgCisgIE1fSlBHMCAgPSAweGYwLAorICBNX0pQRzEzID0gMHhmZCwKKyAgTV9DT00gICA9IDB4ZmUsCisgIAorICBNX1RFTSAgID0gMHgwMSwKKyAgCisgIE1fRVJST1IgPSAweDEwMAorfSBKUEVHX01BUktFUjsKKworCisvKiBQcml2YXRlIHN0YXRlICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfbWFya2VyX3dyaXRlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICB1bnNpZ25lZCBpbnQgbGFzdF9yZXN0YXJ0X2ludGVydmFsOyAvKiBsYXN0IERSSSB2YWx1ZSBlbWl0dGVkOyAwIGFmdGVyIFNPSSAqLworfSBteV9tYXJrZXJfd3JpdGVyOworCit0eXBlZGVmIG15X21hcmtlcl93cml0ZXIgKiBteV9tYXJrZXJfcHRyOworCisKKy8qCisgKiBCYXNpYyBvdXRwdXQgcm91dGluZXMuCisgKgorICogTm90ZSB0aGF0IHdlIGRvIG5vdCBzdXBwb3J0IHN1c3BlbnNpb24gd2hpbGUgd3JpdGluZyBhIG1hcmtlci4KKyAqIFRoZXJlZm9yZSwgYW4gYXBwbGljYXRpb24gdXNpbmcgc3VzcGVuc2lvbiBtdXN0IGVuc3VyZSB0aGF0IHRoZXJlIGlzCisgKiBlbm91Z2ggYnVmZmVyIHNwYWNlIGZvciB0aGUgaW5pdGlhbCBtYXJrZXJzICh0eXAuIDYwMC03MDAgYnl0ZXMpIGJlZm9yZQorICogY2FsbGluZyBqcGVnX3N0YXJ0X2NvbXByZXNzLCBhbmQgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIHRoZSB0cmFpbGluZyBFT0kKKyAqIChhIGZldyBieXRlcykgYmVmb3JlIGNhbGxpbmcganBlZ19maW5pc2hfY29tcHJlc3MuICBNdWx0aXBhc3MgY29tcHJlc3Npb24KKyAqIG1vZGVzIGFyZSBub3Qgc3VwcG9ydGVkIGF0IGFsbCB3aXRoIHN1c3BlbnNpb24sIHNvIHRob3NlIHR3byBhcmUgdGhlIG9ubHkKKyAqIHBvaW50cyB3aGVyZSBtYXJrZXJzIHdpbGwgYmUgd3JpdHRlbi4KKyAqLworCitMT0NBTCh2b2lkKQorZW1pdF9ieXRlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHZhbCkKKy8qIEVtaXQgYSBieXRlICovCit7CisgIHN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21nciAqIGRlc3QgPSBjaW5mby0+ZGVzdDsKKworICAqKGRlc3QtPm5leHRfb3V0cHV0X2J5dGUpKysgPSAoSk9DVEVUKSB2YWw7CisgIGlmICgtLWRlc3QtPmZyZWVfaW5fYnVmZmVyID09IDApIHsKKyAgICBpZiAoISAoKmRlc3QtPmVtcHR5X291dHB1dF9idWZmZXIpIChjaW5mbykpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NBTlRfU1VTUEVORCk7CisgIH0KK30KKworCitMT0NBTCh2b2lkKQorZW1pdF9tYXJrZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKUEVHX01BUktFUiBtYXJrKQorLyogRW1pdCBhIG1hcmtlciBjb2RlICovCit7CisgIGVtaXRfYnl0ZShjaW5mbywgMHhGRik7CisgIGVtaXRfYnl0ZShjaW5mbywgKGludCkgbWFyayk7Cit9CisKKworTE9DQUwodm9pZCkKK2VtaXRfMmJ5dGVzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHZhbHVlKQorLyogRW1pdCBhIDItYnl0ZSBpbnRlZ2VyOyB0aGVzZSBhcmUgYWx3YXlzIE1TQiBmaXJzdCBpbiBKUEVHIGZpbGVzICovCit7CisgIGVtaXRfYnl0ZShjaW5mbywgKHZhbHVlID4+IDgpICYgMHhGRik7CisgIGVtaXRfYnl0ZShjaW5mbywgdmFsdWUgJiAweEZGKTsKK30KKworCisvKgorICogUm91dGluZXMgdG8gd3JpdGUgc3BlY2lmaWMgbWFya2VyIHR5cGVzLgorICovCisKK0xPQ0FMKGludCkKK2VtaXRfZHF0IChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IGluZGV4KQorLyogRW1pdCBhIERRVCBtYXJrZXIgKi8KKy8qIFJldHVybnMgdGhlIHByZWNpc2lvbiB1c2VkICgwID0gOGJpdHMsIDEgPSAxNmJpdHMpIGZvciBiYXNlbGluZSBjaGVja2luZyAqLworeworICBKUVVBTlRfVEJMICogcXRibCA9IGNpbmZvLT5xdWFudF90YmxfcHRyc1tpbmRleF07CisgIGludCBwcmVjOworICBpbnQgaTsKKworICBpZiAocXRibCA9PSBOVUxMKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX1FVQU5UX1RBQkxFLCBpbmRleCk7CisKKyAgcHJlYyA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7CisgICAgaWYgKHF0YmwtPnF1YW50dmFsW2ldID4gMjU1KQorICAgICAgcHJlYyA9IDE7CisgIH0KKworICBpZiAoISBxdGJsLT5zZW50X3RhYmxlKSB7CisgICAgZW1pdF9tYXJrZXIoY2luZm8sIE1fRFFUKTsKKworICAgIGVtaXRfMmJ5dGVzKGNpbmZvLCBwcmVjID8gRENUU0laRTIqMiArIDEgKyAyIDogRENUU0laRTIgKyAxICsgMik7CisKKyAgICBlbWl0X2J5dGUoY2luZm8sIGluZGV4ICsgKHByZWM8PDQpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7CisgICAgICAvKiBUaGUgdGFibGUgZW50cmllcyBtdXN0IGJlIGVtaXR0ZWQgaW4gemlnemFnIG9yZGVyLiAqLworICAgICAgdW5zaWduZWQgaW50IHF2YWwgPSBxdGJsLT5xdWFudHZhbFtqcGVnX25hdHVyYWxfb3JkZXJbaV1dOworICAgICAgaWYgKHByZWMpCisJZW1pdF9ieXRlKGNpbmZvLCAoaW50KSAocXZhbCA+PiA4KSk7CisgICAgICBlbWl0X2J5dGUoY2luZm8sIChpbnQpIChxdmFsICYgMHhGRikpOworICAgIH0KKworICAgIHF0YmwtPnNlbnRfdGFibGUgPSBUUlVFOworICB9CisKKyAgcmV0dXJuIHByZWM7Cit9CisKKworTE9DQUwodm9pZCkKK2VtaXRfZGh0IChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IGluZGV4LCBib29sZWFuIGlzX2FjKQorLyogRW1pdCBhIERIVCBtYXJrZXIgKi8KK3sKKyAgSkhVRkZfVEJMICogaHRibDsKKyAgaW50IGxlbmd0aCwgaTsKKyAgCisgIGlmIChpc19hYykgeworICAgIGh0YmwgPSBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1tpbmRleF07CisgICAgaW5kZXggKz0gMHgxMDsJCS8qIG91dHB1dCBpbmRleCBoYXMgQUMgYml0IHNldCAqLworICB9IGVsc2UgeworICAgIGh0YmwgPSBjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1tpbmRleF07CisgIH0KKworICBpZiAoaHRibCA9PSBOVUxMKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIGluZGV4KTsKKyAgCisgIGlmICghIGh0YmwtPnNlbnRfdGFibGUpIHsKKyAgICBlbWl0X21hcmtlcihjaW5mbywgTV9ESFQpOworICAgIAorICAgIGxlbmd0aCA9IDA7CisgICAgZm9yIChpID0gMTsgaSA8PSAxNjsgaSsrKQorICAgICAgbGVuZ3RoICs9IGh0YmwtPmJpdHNbaV07CisgICAgCisgICAgZW1pdF8yYnl0ZXMoY2luZm8sIGxlbmd0aCArIDIgKyAxICsgMTYpOworICAgIGVtaXRfYnl0ZShjaW5mbywgaW5kZXgpOworICAgIAorICAgIGZvciAoaSA9IDE7IGkgPD0gMTY7IGkrKykKKyAgICAgIGVtaXRfYnl0ZShjaW5mbywgaHRibC0+Yml0c1tpXSk7CisgICAgCisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgZW1pdF9ieXRlKGNpbmZvLCBodGJsLT5odWZmdmFsW2ldKTsKKyAgICAKKyAgICBodGJsLT5zZW50X3RhYmxlID0gVFJVRTsKKyAgfQorfQorCisKK0xPQ0FMKHZvaWQpCitlbWl0X2RhYyAoal9jb21wcmVzc19wdHIgY2luZm8pCisvKiBFbWl0IGEgREFDIG1hcmtlciAqLworLyogU2luY2UgdGhlIHVzZWZ1bCBpbmZvIGlzIHNvIHNtYWxsLCB3ZSB3YW50IHRvIGVtaXQgYWxsIHRoZSB0YWJsZXMgaW4gKi8KKy8qIG9uZSBEQUMgbWFya2VyLiAgVGhlcmVmb3JlIHRoaXMgcm91dGluZSBkb2VzIGl0cyBvd24gc2NhbiBvZiB0aGUgdGFibGUuICovCit7CisjaWZkZWYgQ19BUklUSF9DT0RJTkdfU1VQUE9SVEVECisgIGNoYXIgZGNfaW5fdXNlW05VTV9BUklUSF9UQkxTXTsKKyAgY2hhciBhY19pbl91c2VbTlVNX0FSSVRIX1RCTFNdOworICBpbnQgbGVuZ3RoLCBpOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICAKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9BUklUSF9UQkxTOyBpKyspCisgICAgZGNfaW5fdXNlW2ldID0gYWNfaW5fdXNlW2ldID0gMDsKKyAgCisgIGZvciAoaSA9IDA7IGkgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgaSsrKSB7CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2ldOworICAgIGRjX2luX3VzZVtjb21wcHRyLT5kY190Ymxfbm9dID0gMTsKKyAgICBhY19pbl91c2VbY29tcHB0ci0+YWNfdGJsX25vXSA9IDE7CisgIH0KKyAgCisgIGxlbmd0aCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBOVU1fQVJJVEhfVEJMUzsgaSsrKQorICAgIGxlbmd0aCArPSBkY19pbl91c2VbaV0gKyBhY19pbl91c2VbaV07CisgIAorICBlbWl0X21hcmtlcihjaW5mbywgTV9EQUMpOworICAKKyAgZW1pdF8yYnl0ZXMoY2luZm8sIGxlbmd0aCoyICsgMik7CisgIAorICBmb3IgKGkgPSAwOyBpIDwgTlVNX0FSSVRIX1RCTFM7IGkrKykgeworICAgIGlmIChkY19pbl91c2VbaV0pIHsKKyAgICAgIGVtaXRfYnl0ZShjaW5mbywgaSk7CisgICAgICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5hcml0aF9kY19MW2ldICsgKGNpbmZvLT5hcml0aF9kY19VW2ldPDw0KSk7CisgICAgfQorICAgIGlmIChhY19pbl91c2VbaV0pIHsKKyAgICAgIGVtaXRfYnl0ZShjaW5mbywgaSArIDB4MTApOworICAgICAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+YXJpdGhfYWNfS1tpXSk7CisgICAgfQorICB9CisjZW5kaWYgLyogQ19BUklUSF9DT0RJTkdfU1VQUE9SVEVEICovCit9CisKKworTE9DQUwodm9pZCkKK2VtaXRfZHJpIChqX2NvbXByZXNzX3B0ciBjaW5mbykKKy8qIEVtaXQgYSBEUkkgbWFya2VyICovCit7CisgIGVtaXRfbWFya2VyKGNpbmZvLCBNX0RSSSk7CisgIAorICBlbWl0XzJieXRlcyhjaW5mbywgNCk7CS8qIGZpeGVkIGxlbmd0aCAqLworCisgIGVtaXRfMmJ5dGVzKGNpbmZvLCAoaW50KSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbCk7Cit9CisKKworTE9DQUwodm9pZCkKK2VtaXRfc29mIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlBFR19NQVJLRVIgY29kZSkKKy8qIEVtaXQgYSBTT0YgbWFya2VyICovCit7CisgIGludCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgCisgIGVtaXRfbWFya2VyKGNpbmZvLCBjb2RlKTsKKyAgCisgIGVtaXRfMmJ5dGVzKGNpbmZvLCAzICogY2luZm8tPm51bV9jb21wb25lbnRzICsgMiArIDUgKyAxKTsgLyogbGVuZ3RoICovCisKKyAgLyogTWFrZSBzdXJlIGltYWdlIGlzbid0IGJpZ2dlciB0aGFuIFNPRiBmaWVsZCBjYW4gaGFuZGxlICovCisgIGlmICgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCA+IDY1NTM1TCB8fAorICAgICAgKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCA+IDY1NTM1TCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9JTUFHRV9UT09fQklHLCAodW5zaWduZWQgaW50KSA2NTUzNSk7CisKKyAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+ZGF0YV9wcmVjaXNpb24pOworICBlbWl0XzJieXRlcyhjaW5mbywgKGludCkgY2luZm8tPmltYWdlX2hlaWdodCk7CisgIGVtaXRfMmJ5dGVzKGNpbmZvLCAoaW50KSBjaW5mby0+aW1hZ2Vfd2lkdGgpOworCisgIGVtaXRfYnl0ZShjaW5mbywgY2luZm8tPm51bV9jb21wb25lbnRzKTsKKworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIGVtaXRfYnl0ZShjaW5mbywgY29tcHB0ci0+Y29tcG9uZW50X2lkKTsKKyAgICBlbWl0X2J5dGUoY2luZm8sIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yIDw8IDQpICsgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7CisgICAgZW1pdF9ieXRlKGNpbmZvLCBjb21wcHRyLT5xdWFudF90Ymxfbm8pOworICB9Cit9CisKKworTE9DQUwodm9pZCkKK2VtaXRfc29zIChqX2NvbXByZXNzX3B0ciBjaW5mbykKKy8qIEVtaXQgYSBTT1MgbWFya2VyICovCit7CisgIGludCBpLCB0ZCwgdGE7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIAorICBlbWl0X21hcmtlcihjaW5mbywgTV9TT1MpOworICAKKyAgZW1pdF8yYnl0ZXMoY2luZm8sIDIgKiBjaW5mby0+Y29tcHNfaW5fc2NhbiArIDIgKyAxICsgMyk7IC8qIGxlbmd0aCAqLworICAKKyAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+Y29tcHNfaW5fc2Nhbik7CisgIAorICBmb3IgKGkgPSAwOyBpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGkrKykgeworICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tpXTsKKyAgICBlbWl0X2J5dGUoY2luZm8sIGNvbXBwdHItPmNvbXBvbmVudF9pZCk7CisgICAgdGQgPSBjb21wcHRyLT5kY190Ymxfbm87CisgICAgdGEgPSBjb21wcHRyLT5hY190Ymxfbm87CisgICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7CisgICAgICAvKiBQcm9ncmVzc2l2ZSBtb2RlOiBvbmx5IERDIG9yIG9ubHkgQUMgdGFibGVzIGFyZSB1c2VkIGluIG9uZSBzY2FuOworICAgICAgICogZnVydGhlcm1vcmUsIEh1ZmZtYW4gY29kaW5nIG9mIERDIHJlZmluZW1lbnQgdXNlcyBubyB0YWJsZSBhdCBhbGwuCisgICAgICAgKiBXZSBlbWl0IDAgZm9yIHVudXNlZCBmaWVsZChzKTsgdGhpcyBpcyByZWNvbW1lbmRlZCBieSB0aGUgUCZNIHRleHQKKyAgICAgICAqIGJ1dCBkb2VzIG5vdCBzZWVtIHRvIGJlIHNwZWNpZmllZCBpbiB0aGUgc3RhbmRhcmQuCisgICAgICAgKi8KKyAgICAgIGlmIChjaW5mby0+U3MgPT0gMCkgeworCXRhID0gMDsJCQkvKiBEQyBzY2FuICovCisJaWYgKGNpbmZvLT5BaCAhPSAwICYmICFjaW5mby0+YXJpdGhfY29kZSkKKwkgIHRkID0gMDsJCS8qIG5vIERDIHRhYmxlIGVpdGhlciAqLworICAgICAgfSBlbHNlIHsKKwl0ZCA9IDA7CQkJLyogQUMgc2NhbiAqLworICAgICAgfQorICAgIH0KKyAgICBlbWl0X2J5dGUoY2luZm8sICh0ZCA8PCA0KSArIHRhKTsKKyAgfQorCisgIGVtaXRfYnl0ZShjaW5mbywgY2luZm8tPlNzKTsKKyAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+U2UpOworICBlbWl0X2J5dGUoY2luZm8sIChjaW5mby0+QWggPDwgNCkgKyBjaW5mby0+QWwpOworfQorCisKK0xPQ0FMKHZvaWQpCitlbWl0X2pmaWZfYXBwMCAoal9jb21wcmVzc19wdHIgY2luZm8pCisvKiBFbWl0IGEgSkZJRi1jb21wbGlhbnQgQVBQMCBtYXJrZXIgKi8KK3sKKyAgLyoKKyAgICogTGVuZ3RoIG9mIEFQUDAgYmxvY2sJKDIgYnl0ZXMpCisgICAqIEJsb2NrIElECQkJKDQgYnl0ZXMgLSBBU0NJSSAiSkZJRiIpCisgICAqIFplcm8gYnl0ZQkJCSgxIGJ5dGUgdG8gdGVybWluYXRlIHRoZSBJRCBzdHJpbmcpCisgICAqIFZlcnNpb24gTWFqb3IsIE1pbm9yCSgyIGJ5dGVzIC0gbWFqb3IgZmlyc3QpCisgICAqIFVuaXRzCQkJKDEgYnl0ZSAtIDB4MDAgPSBub25lLCAweDAxID0gaW5jaCwgMHgwMiA9IGNtKQorICAgKiBYZHB1CQkJKDIgYnl0ZXMgLSBkb3RzIHBlciB1bml0IGhvcml6b250YWwpCisgICAqIFlkcHUJCQkoMiBieXRlcyAtIGRvdHMgcGVyIHVuaXQgdmVydGljYWwpCisgICAqIFRodW1ibmFpbCBYIHNpemUJCSgxIGJ5dGUpCisgICAqIFRodW1ibmFpbCBZIHNpemUJCSgxIGJ5dGUpCisgICAqLworICAKKyAgZW1pdF9tYXJrZXIoY2luZm8sIE1fQVBQMCk7CisgIAorICBlbWl0XzJieXRlcyhjaW5mbywgMiArIDQgKyAxICsgMiArIDEgKyAyICsgMiArIDEgKyAxKTsgLyogbGVuZ3RoICovCisKKyAgZW1pdF9ieXRlKGNpbmZvLCAweDRBKTsJLyogSWRlbnRpZmllcjogQVNDSUkgIkpGSUYiICovCisgIGVtaXRfYnl0ZShjaW5mbywgMHg0Nik7CisgIGVtaXRfYnl0ZShjaW5mbywgMHg0OSk7CisgIGVtaXRfYnl0ZShjaW5mbywgMHg0Nik7CisgIGVtaXRfYnl0ZShjaW5mbywgMCk7CisgIGVtaXRfYnl0ZShjaW5mbywgY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbik7IC8qIFZlcnNpb24gZmllbGRzICovCisgIGVtaXRfYnl0ZShjaW5mbywgY2luZm8tPkpGSUZfbWlub3JfdmVyc2lvbik7CisgIGVtaXRfYnl0ZShjaW5mbywgY2luZm8tPmRlbnNpdHlfdW5pdCk7IC8qIFBpeGVsIHNpemUgaW5mb3JtYXRpb24gKi8KKyAgZW1pdF8yYnl0ZXMoY2luZm8sIChpbnQpIGNpbmZvLT5YX2RlbnNpdHkpOworICBlbWl0XzJieXRlcyhjaW5mbywgKGludCkgY2luZm8tPllfZGVuc2l0eSk7CisgIGVtaXRfYnl0ZShjaW5mbywgMCk7CQkvKiBObyB0aHVtYm5haWwgaW1hZ2UgKi8KKyAgZW1pdF9ieXRlKGNpbmZvLCAwKTsKK30KKworCitMT0NBTCh2b2lkKQorZW1pdF9hZG9iZV9hcHAxNCAoal9jb21wcmVzc19wdHIgY2luZm8pCisvKiBFbWl0IGFuIEFkb2JlIEFQUDE0IG1hcmtlciAqLworeworICAvKgorICAgKiBMZW5ndGggb2YgQVBQMTQgYmxvY2sJKDIgYnl0ZXMpCisgICAqIEJsb2NrIElECQkJKDUgYnl0ZXMgLSBBU0NJSSAiQWRvYmUiKQorICAgKiBWZXJzaW9uIE51bWJlcgkJKDIgYnl0ZXMgLSBjdXJyZW50bHkgMTAwKQorICAgKiBGbGFnczAJCQkoMiBieXRlcyAtIGN1cnJlbnRseSAwKQorICAgKiBGbGFnczEJCQkoMiBieXRlcyAtIGN1cnJlbnRseSAwKQorICAgKiBDb2xvciB0cmFuc2Zvcm0JCSgxIGJ5dGUpCisgICAqCisgICAqIEFsdGhvdWdoIEFkb2JlIFROIDUxMTYgbWVudGlvbnMgVmVyc2lvbiA9IDEwMSwgYWxsIHRoZSBBZG9iZSBmaWxlcworICAgKiBub3cgaW4gY2lyY3VsYXRpb24gc2VlbSB0byB1c2UgVmVyc2lvbiA9IDEwMCwgc28gdGhhdCdzIHdoYXQgd2Ugd3JpdGUuCisgICAqCisgICAqIFdlIHdyaXRlIHRoZSBjb2xvciB0cmFuc2Zvcm0gYnl0ZSBhcyAxIGlmIHRoZSBKUEVHIGNvbG9yIHNwYWNlIGlzCisgICAqIFlDYkNyLCAyIGlmIGl0J3MgWUNDSywgMCBvdGhlcndpc2UuICBBZG9iZSdzIGRlZmluaXRpb24gaGFzIHRvIGRvIHdpdGgKKyAgICogd2hldGhlciB0aGUgZW5jb2RlciBwZXJmb3JtZWQgYSB0cmFuc2Zvcm1hdGlvbiwgd2hpY2ggaXMgcHJldHR5IHVzZWxlc3MuCisgICAqLworICAKKyAgZW1pdF9tYXJrZXIoY2luZm8sIE1fQVBQMTQpOworICAKKyAgZW1pdF8yYnl0ZXMoY2luZm8sIDIgKyA1ICsgMiArIDIgKyAyICsgMSk7IC8qIGxlbmd0aCAqLworCisgIGVtaXRfYnl0ZShjaW5mbywgMHg0MSk7CS8qIElkZW50aWZpZXI6IEFTQ0lJICJBZG9iZSIgKi8KKyAgZW1pdF9ieXRlKGNpbmZvLCAweDY0KTsKKyAgZW1pdF9ieXRlKGNpbmZvLCAweDZGKTsKKyAgZW1pdF9ieXRlKGNpbmZvLCAweDYyKTsKKyAgZW1pdF9ieXRlKGNpbmZvLCAweDY1KTsKKyAgZW1pdF8yYnl0ZXMoY2luZm8sIDEwMCk7CS8qIFZlcnNpb24gKi8KKyAgZW1pdF8yYnl0ZXMoY2luZm8sIDApOwkvKiBGbGFnczAgKi8KKyAgZW1pdF8yYnl0ZXMoY2luZm8sIDApOwkvKiBGbGFnczEgKi8KKyAgc3dpdGNoIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSkgeworICBjYXNlIEpDU19ZQ2JDcjoKKyAgICBlbWl0X2J5dGUoY2luZm8sIDEpOwkvKiBDb2xvciB0cmFuc2Zvcm0gPSAxICovCisgICAgYnJlYWs7CisgIGNhc2UgSkNTX1lDQ0s6CisgICAgZW1pdF9ieXRlKGNpbmZvLCAyKTsJLyogQ29sb3IgdHJhbnNmb3JtID0gMiAqLworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGVtaXRfYnl0ZShjaW5mbywgMCk7CS8qIENvbG9yIHRyYW5zZm9ybSA9IDAgKi8KKyAgICBicmVhazsKKyAgfQorfQorCisKKy8qCisgKiBUaGVzZSByb3V0aW5lcyBhbGxvdyB3cml0aW5nIGFuIGFyYml0cmFyeSBtYXJrZXIgd2l0aCBwYXJhbWV0ZXJzLgorICogVGhlIG9ubHkgaW50ZW5kZWQgdXNlIGlzIHRvIGVtaXQgQ09NIG9yIEFQUG4gbWFya2VycyBhZnRlciBjYWxsaW5nCisgKiB3cml0ZV9maWxlX2hlYWRlciBhbmQgYmVmb3JlIGNhbGxpbmcgd3JpdGVfZnJhbWVfaGVhZGVyLgorICogT3RoZXIgdXNlcyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gcHJvZHVjZSBkZXNpcmFibGUgcmVzdWx0cy4KKyAqIENvdW50aW5nIHRoZSBwYXJhbWV0ZXIgYnl0ZXMgcHJvcGVybHkgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5LgorICovCisKK01FVEhPRERFRih2b2lkKQord3JpdGVfbWFya2VyX2hlYWRlciAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXIsIHVuc2lnbmVkIGludCBkYXRhbGVuKQorLyogRW1pdCBhbiBhcmJpdHJhcnkgbWFya2VyIGhlYWRlciAqLworeworICBpZiAoZGF0YWxlbiA+ICh1bnNpZ25lZCBpbnQpIDY1NTMzKQkJLyogc2FmZXR5IGNoZWNrICovCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfTEVOR1RIKTsKKworICBlbWl0X21hcmtlcihjaW5mbywgKEpQRUdfTUFSS0VSKSBtYXJrZXIpOworCisgIGVtaXRfMmJ5dGVzKGNpbmZvLCAoaW50KSAoZGF0YWxlbiArIDIpKTsJLyogdG90YWwgbGVuZ3RoICovCit9CisKK01FVEhPRERFRih2b2lkKQord3JpdGVfbWFya2VyX2J5dGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgdmFsKQorLyogRW1pdCBvbmUgYnl0ZSBvZiBtYXJrZXIgcGFyYW1ldGVycyBmb2xsb3dpbmcgd3JpdGVfbWFya2VyX2hlYWRlciAqLworeworICBlbWl0X2J5dGUoY2luZm8sIHZhbCk7Cit9CisKKworLyoKKyAqIFdyaXRlIGRhdGFzdHJlYW0gaGVhZGVyLgorICogVGhpcyBjb25zaXN0cyBvZiBhbiBTT0kgYW5kIG9wdGlvbmFsIEFQUG4gbWFya2Vycy4KKyAqIFdlIHJlY29tbWVuZCB1c2Ugb2YgdGhlIEpGSUYgbWFya2VyLCBidXQgbm90IHRoZSBBZG9iZSBtYXJrZXIsCisgKiB3aGVuIHVzaW5nIFlDYkNyIG9yIGdyYXlzY2FsZSBkYXRhLiAgVGhlIEpGSUYgbWFya2VyIHNob3VsZCBOT1QKKyAqIGJlIHVzZWQgZm9yIGFueSBvdGhlciBKUEVHIGNvbG9yc3BhY2UuICBUaGUgQWRvYmUgbWFya2VyIGlzIGhlbHBmdWwKKyAqIHRvIGRpc3Rpbmd1aXNoIFJHQiwgQ01ZSywgYW5kIFlDQ0sgY29sb3JzcGFjZXMuCisgKiBOb3RlIHRoYXQgYW4gYXBwbGljYXRpb24gY2FuIHdyaXRlIGFkZGl0aW9uYWwgaGVhZGVyIG1hcmtlcnMgYWZ0ZXIKKyAqIGpwZWdfc3RhcnRfY29tcHJlc3MgcmV0dXJucy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3dyaXRlX2ZpbGVfaGVhZGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfbWFya2VyX3B0ciBtYXJrZXIgPSAobXlfbWFya2VyX3B0cikgY2luZm8tPm1hcmtlcjsKKworICBlbWl0X21hcmtlcihjaW5mbywgTV9TT0kpOwkvKiBmaXJzdCB0aGUgU09JICovCisKKyAgLyogU09JIGlzIGRlZmluZWQgdG8gcmVzZXQgcmVzdGFydCBpbnRlcnZhbCB0byAwICovCisgIG1hcmtlci0+bGFzdF9yZXN0YXJ0X2ludGVydmFsID0gMDsKKworICBpZiAoY2luZm8tPndyaXRlX0pGSUZfaGVhZGVyKQkvKiBuZXh0IGFuIG9wdGlvbmFsIEpGSUYgQVBQMCAqLworICAgIGVtaXRfamZpZl9hcHAwKGNpbmZvKTsKKyAgaWYgKGNpbmZvLT53cml0ZV9BZG9iZV9tYXJrZXIpIC8qIG5leHQgYW4gb3B0aW9uYWwgQWRvYmUgQVBQMTQgKi8KKyAgICBlbWl0X2Fkb2JlX2FwcDE0KGNpbmZvKTsKK30KKworCisvKgorICogV3JpdGUgZnJhbWUgaGVhZGVyLgorICogVGhpcyBjb25zaXN0cyBvZiBEUVQgYW5kIFNPRm4gbWFya2Vycy4KKyAqIE5vdGUgdGhhdCB3ZSBkbyBub3QgZW1pdCB0aGUgU09GIHVudGlsIHdlIGhhdmUgZW1pdHRlZCB0aGUgRFFUKHMpLgorICogVGhpcyBhdm9pZHMgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyB3aXRoIGluY29ycmVjdCBpbXBsZW1lbnRhdGlvbnMgdGhhdAorICogdHJ5IHRvIGVycm9yLWNoZWNrIHRoZSBxdWFudCB0YWJsZSBudW1iZXJzIGFzIHNvb24gYXMgdGhleSBzZWUgdGhlIFNPRi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3dyaXRlX2ZyYW1lX2hlYWRlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIGludCBjaSwgcHJlYzsKKyAgYm9vbGVhbiBpc19iYXNlbGluZTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgCisgIC8qIEVtaXQgRFFUIGZvciBlYWNoIHF1YW50aXphdGlvbiB0YWJsZS4KKyAgICogTm90ZSB0aGF0IGVtaXRfZHF0KCkgc3VwcHJlc3NlcyBhbnkgZHVwbGljYXRlIHRhYmxlcy4KKyAgICovCisgIHByZWMgPSAwOworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIHByZWMgKz0gZW1pdF9kcXQoY2luZm8sIGNvbXBwdHItPnF1YW50X3RibF9ubyk7CisgIH0KKyAgLyogbm93IHByZWMgaXMgbm9uemVybyBpZmYgdGhlcmUgYXJlIGFueSAxNi1iaXQgcXVhbnQgdGFibGVzLiAqLworCisgIC8qIENoZWNrIGZvciBhIG5vbi1iYXNlbGluZSBzcGVjaWZpY2F0aW9uLgorICAgKiBOb3RlIHdlIGFzc3VtZSB0aGF0IEh1ZmZtYW4gdGFibGUgbnVtYmVycyB3b24ndCBiZSBjaGFuZ2VkIGxhdGVyLgorICAgKi8KKyAgaWYgKGNpbmZvLT5hcml0aF9jb2RlIHx8IGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlIHx8CisgICAgICBjaW5mby0+ZGF0YV9wcmVjaXNpb24gIT0gOCkgeworICAgIGlzX2Jhc2VsaW5lID0gRkFMU0U7CisgIH0gZWxzZSB7CisgICAgaXNfYmFzZWxpbmUgPSBUUlVFOworICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisJIGNpKyssIGNvbXBwdHIrKykgeworICAgICAgaWYgKGNvbXBwdHItPmRjX3RibF9ubyA+IDEgfHwgY29tcHB0ci0+YWNfdGJsX25vID4gMSkKKwlpc19iYXNlbGluZSA9IEZBTFNFOworICAgIH0KKyAgICBpZiAocHJlYyAmJiBpc19iYXNlbGluZSkgeworICAgICAgaXNfYmFzZWxpbmUgPSBGQUxTRTsKKyAgICAgIC8qIElmIGl0J3MgYmFzZWxpbmUgZXhjZXB0IGZvciBxdWFudGl6ZXIgc2l6ZSwgd2FybiB0aGUgdXNlciAqLworICAgICAgVFJBQ0VNUyhjaW5mbywgMCwgSlRSQ18xNkJJVF9UQUJMRVMpOworICAgIH0KKyAgfQorCisgIC8qIEVtaXQgdGhlIHByb3BlciBTT0YgbWFya2VyICovCisgIGlmIChjaW5mby0+YXJpdGhfY29kZSkgeworICAgIGVtaXRfc29mKGNpbmZvLCBNX1NPRjkpOwkvKiBTT0YgY29kZSBmb3IgYXJpdGhtZXRpYyBjb2RpbmcgKi8KKyAgfSBlbHNlIHsKKyAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpCisgICAgICBlbWl0X3NvZihjaW5mbywgTV9TT0YyKTsJLyogU09GIGNvZGUgZm9yIHByb2dyZXNzaXZlIEh1ZmZtYW4gKi8KKyAgICBlbHNlIGlmIChpc19iYXNlbGluZSkKKyAgICAgIGVtaXRfc29mKGNpbmZvLCBNX1NPRjApOwkvKiBTT0YgY29kZSBmb3IgYmFzZWxpbmUgaW1wbGVtZW50YXRpb24gKi8KKyAgICBlbHNlCisgICAgICBlbWl0X3NvZihjaW5mbywgTV9TT0YxKTsJLyogU09GIGNvZGUgZm9yIG5vbi1iYXNlbGluZSBIdWZmbWFuIGZpbGUgKi8KKyAgfQorfQorCisKKy8qCisgKiBXcml0ZSBzY2FuIGhlYWRlci4KKyAqIFRoaXMgY29uc2lzdHMgb2YgREhUIG9yIERBQyBtYXJrZXJzLCBvcHRpb25hbCBEUkksIGFuZCBTT1MuCisgKiBDb21wcmVzc2VkIGRhdGEgd2lsbCBiZSB3cml0dGVuIGZvbGxvd2luZyB0aGUgU09TLgorICovCisKK01FVEhPRERFRih2b2lkKQord3JpdGVfc2Nhbl9oZWFkZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9tYXJrZXJfcHRyIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKSBjaW5mby0+bWFya2VyOworICBpbnQgaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICBpZiAoY2luZm8tPmFyaXRoX2NvZGUpIHsKKyAgICAvKiBFbWl0IGFyaXRoIGNvbmRpdGlvbmluZyBpbmZvLiAgV2UgbWF5IGhhdmUgc29tZSBkdXBsaWNhdGlvbgorICAgICAqIGlmIHRoZSBmaWxlIGhhcyBtdWx0aXBsZSBzY2FucywgYnV0IGl0J3Mgc28gc21hbGwgaXQncyBoYXJkbHkKKyAgICAgKiB3b3J0aCB3b3JyeWluZyBhYm91dC4KKyAgICAgKi8KKyAgICBlbWl0X2RhYyhjaW5mbyk7CisgIH0gZWxzZSB7CisgICAgLyogRW1pdCBIdWZmbWFuIHRhYmxlcy4KKyAgICAgKiBOb3RlIHRoYXQgZW1pdF9kaHQoKSBzdXBwcmVzc2VzIGFueSBkdXBsaWNhdGUgdGFibGVzLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgaSsrKSB7CisgICAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9baV07CisgICAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKKwkvKiBQcm9ncmVzc2l2ZSBtb2RlOiBvbmx5IERDIG9yIG9ubHkgQUMgdGFibGVzIGFyZSB1c2VkIGluIG9uZSBzY2FuICovCisJaWYgKGNpbmZvLT5TcyA9PSAwKSB7CisJICBpZiAoY2luZm8tPkFoID09IDApCS8qIERDIG5lZWRzIG5vIHRhYmxlIGZvciByZWZpbmVtZW50IHNjYW4gKi8KKwkgICAgZW1pdF9kaHQoY2luZm8sIGNvbXBwdHItPmRjX3RibF9ubywgRkFMU0UpOworCX0gZWxzZSB7CisJICBlbWl0X2RodChjaW5mbywgY29tcHB0ci0+YWNfdGJsX25vLCBUUlVFKTsKKwl9CisgICAgICB9IGVsc2UgeworCS8qIFNlcXVlbnRpYWwgbW9kZTogbmVlZCBib3RoIERDIGFuZCBBQyB0YWJsZXMgKi8KKwllbWl0X2RodChjaW5mbywgY29tcHB0ci0+ZGNfdGJsX25vLCBGQUxTRSk7CisJZW1pdF9kaHQoY2luZm8sIGNvbXBwdHItPmFjX3RibF9ubywgVFJVRSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogRW1pdCBEUkkgaWYgcmVxdWlyZWQgLS0tIG5vdGUgdGhhdCBEUkkgdmFsdWUgY291bGQgY2hhbmdlIGZvciBlYWNoIHNjYW4uCisgICAqIFdlIGF2b2lkIHdhc3Rpbmcgc3BhY2Ugd2l0aCB1bm5lY2Vzc2FyeSBEUklzLCBob3dldmVyLgorICAgKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsICE9IG1hcmtlci0+bGFzdF9yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgZW1pdF9kcmkoY2luZm8pOworICAgIG1hcmtlci0+bGFzdF9yZXN0YXJ0X2ludGVydmFsID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgIH0KKworICBlbWl0X3NvcyhjaW5mbyk7Cit9CisKKworLyoKKyAqIFdyaXRlIGRhdGFzdHJlYW0gdHJhaWxlci4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3dyaXRlX2ZpbGVfdHJhaWxlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIGVtaXRfbWFya2VyKGNpbmZvLCBNX0VPSSk7Cit9CisKKworLyoKKyAqIFdyaXRlIGFuIGFiYnJldmlhdGVkIHRhYmxlLXNwZWNpZmljYXRpb24gZGF0YXN0cmVhbS4KKyAqIFRoaXMgY29uc2lzdHMgb2YgU09JLCBEUVQgYW5kIERIVCB0YWJsZXMsIGFuZCBFT0kuCisgKiBBbnkgdGFibGUgdGhhdCBpcyBkZWZpbmVkIGFuZCBub3QgbWFya2VkIHNlbnRfdGFibGUgPSBUUlVFIHdpbGwgYmUKKyAqIGVtaXR0ZWQuICBOb3RlIHRoYXQgYWxsIHRhYmxlcyB3aWxsIGJlIG1hcmtlZCBzZW50X3RhYmxlID0gVFJVRSBhdCBleGl0LgorICovCisKK01FVEhPRERFRih2b2lkKQord3JpdGVfdGFibGVzX29ubHkgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBpbnQgaTsKKworICBlbWl0X21hcmtlcihjaW5mbywgTV9TT0kpOworCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fUVVBTlRfVEJMUzsgaSsrKSB7CisgICAgaWYgKGNpbmZvLT5xdWFudF90YmxfcHRyc1tpXSAhPSBOVUxMKQorICAgICAgKHZvaWQpIGVtaXRfZHF0KGNpbmZvLCBpKTsKKyAgfQorCisgIGlmICghIGNpbmZvLT5hcml0aF9jb2RlKSB7CisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgeworICAgICAgaWYgKGNpbmZvLT5kY19odWZmX3RibF9wdHJzW2ldICE9IE5VTEwpCisJZW1pdF9kaHQoY2luZm8sIGksIEZBTFNFKTsKKyAgICAgIGlmIChjaW5mby0+YWNfaHVmZl90YmxfcHRyc1tpXSAhPSBOVUxMKQorCWVtaXRfZGh0KGNpbmZvLCBpLCBUUlVFKTsKKyAgICB9CisgIH0KKworICBlbWl0X21hcmtlcihjaW5mbywgTV9FT0kpOworfQorCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBtYXJrZXIgd3JpdGVyIG1vZHVsZS4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X21hcmtlcl93cml0ZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9tYXJrZXJfcHRyIG1hcmtlcjsKKworICAvKiBDcmVhdGUgdGhlIHN1Ym9iamVjdCAqLworICBtYXJrZXIgPSAobXlfbWFya2VyX3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9tYXJrZXJfd3JpdGVyKSk7CisgIGNpbmZvLT5tYXJrZXIgPSAoc3RydWN0IGpwZWdfbWFya2VyX3dyaXRlciAqKSBtYXJrZXI7CisgIC8qIEluaXRpYWxpemUgbWV0aG9kIHBvaW50ZXJzICovCisgIG1hcmtlci0+cHViLndyaXRlX2ZpbGVfaGVhZGVyID0gd3JpdGVfZmlsZV9oZWFkZXI7CisgIG1hcmtlci0+cHViLndyaXRlX2ZyYW1lX2hlYWRlciA9IHdyaXRlX2ZyYW1lX2hlYWRlcjsKKyAgbWFya2VyLT5wdWIud3JpdGVfc2Nhbl9oZWFkZXIgPSB3cml0ZV9zY2FuX2hlYWRlcjsKKyAgbWFya2VyLT5wdWIud3JpdGVfZmlsZV90cmFpbGVyID0gd3JpdGVfZmlsZV90cmFpbGVyOworICBtYXJrZXItPnB1Yi53cml0ZV90YWJsZXNfb25seSA9IHdyaXRlX3RhYmxlc19vbmx5OworICBtYXJrZXItPnB1Yi53cml0ZV9tYXJrZXJfaGVhZGVyID0gd3JpdGVfbWFya2VyX2hlYWRlcjsKKyAgbWFya2VyLT5wdWIud3JpdGVfbWFya2VyX2J5dGUgPSB3cml0ZV9tYXJrZXJfYnl0ZTsKKyAgLyogSW5pdGlhbGl6ZSBwcml2YXRlIHN0YXRlICovCisgIG1hcmtlci0+bGFzdF9yZXN0YXJ0X2ludGVydmFsID0gMDsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY21hc3Rlci5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjbWFzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFiNDAyMAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY21hc3Rlci5jCkBAIC0wLDAgKzEsNTkwIEBACisvKgorICogamNtYXN0ZXIuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIG1hc3RlciBjb250cm9sIGxvZ2ljIGZvciB0aGUgSlBFRyBjb21wcmVzc29yLgorICogVGhlc2Ugcm91dGluZXMgYXJlIGNvbmNlcm5lZCB3aXRoIHBhcmFtZXRlciB2YWxpZGF0aW9uLCBpbml0aWFsIHNldHVwLAorICogYW5kIGludGVyLXBhc3MgY29udHJvbCAoZGV0ZXJtaW5pbmcgdGhlIG51bWJlciBvZiBwYXNzZXMgYW5kIHRoZSB3b3JrIAorICogdG8gYmUgZG9uZSBpbiBlYWNoIHBhc3MpLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKiBQcml2YXRlIHN0YXRlICovCisKK3R5cGVkZWYgZW51bSB7CisJbWFpbl9wYXNzLAkJLyogaW5wdXQgZGF0YSwgYWxzbyBkbyBmaXJzdCBvdXRwdXQgc3RlcCAqLworCWh1ZmZfb3B0X3Bhc3MsCQkvKiBIdWZmbWFuIGNvZGUgb3B0aW1pemF0aW9uIHBhc3MgKi8KKwlvdXRwdXRfcGFzcwkJLyogZGF0YSBvdXRwdXQgcGFzcyAqLworfSBjX3Bhc3NfdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19jb21wX21hc3RlciBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KKworICBjX3Bhc3NfdHlwZSBwYXNzX3R5cGU7CS8qIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IHBhc3MgKi8KKworICBpbnQgcGFzc19udW1iZXI7CQkvKiAjIG9mIHBhc3NlcyBjb21wbGV0ZWQgKi8KKyAgaW50IHRvdGFsX3Bhc3NlczsJCS8qIHRvdGFsICMgb2YgcGFzc2VzIG5lZWRlZCAqLworCisgIGludCBzY2FuX251bWJlcjsJCS8qIGN1cnJlbnQgaW5kZXggaW4gc2Nhbl9pbmZvW10gKi8KK30gbXlfY29tcF9tYXN0ZXI7CisKK3R5cGVkZWYgbXlfY29tcF9tYXN0ZXIgKiBteV9tYXN0ZXJfcHRyOworCisKKy8qCisgKiBTdXBwb3J0IHJvdXRpbmVzIHRoYXQgZG8gdmFyaW91cyBlc3NlbnRpYWwgY2FsY3VsYXRpb25zLgorICovCisKK0xPQ0FMKHZvaWQpCitpbml0aWFsX3NldHVwIChqX2NvbXByZXNzX3B0ciBjaW5mbykKKy8qIERvIGNvbXB1dGF0aW9ucyB0aGF0IGFyZSBuZWVkZWQgYmVmb3JlIG1hc3RlciBzZWxlY3Rpb24gcGhhc2UgKi8KK3sKKyAgaW50IGNpOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICBsb25nIHNhbXBsZXNwZXJyb3c7CisgIEpESU1FTlNJT04gamRfc2FtcGxlc3BlcnJvdzsKKworICAvKiBTYW5pdHkgY2hlY2sgb24gaW1hZ2UgZGltZW5zaW9ucyAqLworICBpZiAoY2luZm8tPmltYWdlX2hlaWdodCA8PSAwIHx8IGNpbmZvLT5pbWFnZV93aWR0aCA8PSAwCisgICAgICB8fCBjaW5mby0+bnVtX2NvbXBvbmVudHMgPD0gMCB8fCBjaW5mby0+aW5wdXRfY29tcG9uZW50cyA8PSAwKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRU1QVFlfSU1BR0UpOworCisgIC8qIE1ha2Ugc3VyZSBpbWFnZSBpc24ndCBiaWdnZXIgdGhhbiBJIGNhbiBoYW5kbGUgKi8KKyAgaWYgKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ID4gKGxvbmcpIEpQRUdfTUFYX0RJTUVOU0lPTiB8fAorICAgICAgKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCA+IChsb25nKSBKUEVHX01BWF9ESU1FTlNJT04pCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfSU1BR0VfVE9PX0JJRywgKHVuc2lnbmVkIGludCkgSlBFR19NQVhfRElNRU5TSU9OKTsKKworICAvKiBXaWR0aCBvZiBhbiBpbnB1dCBzY2FubGluZSBtdXN0IGJlIHJlcHJlc2VudGFibGUgYXMgSkRJTUVOU0lPTi4gKi8KKyAgc2FtcGxlc3BlcnJvdyA9IChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggKiAobG9uZykgY2luZm8tPmlucHV0X2NvbXBvbmVudHM7CisgIGpkX3NhbXBsZXNwZXJyb3cgPSAoSkRJTUVOU0lPTikgc2FtcGxlc3BlcnJvdzsKKyAgaWYgKChsb25nKSBqZF9zYW1wbGVzcGVycm93ICE9IHNhbXBsZXNwZXJyb3cpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9XSURUSF9PVkVSRkxPVyk7CisKKyAgLyogRm9yIG5vdywgcHJlY2lzaW9uIG11c3QgbWF0Y2ggY29tcGlsZWQtaW4gdmFsdWUuLi4gKi8KKyAgaWYgKGNpbmZvLT5kYXRhX3ByZWNpc2lvbiAhPSBCSVRTX0lOX0pTQU1QTEUpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BSRUNJU0lPTiwgY2luZm8tPmRhdGFfcHJlY2lzaW9uKTsKKworICAvKiBDaGVjayB0aGF0IG51bWJlciBvZiBjb21wb25lbnRzIHdvbid0IGV4Y2VlZCBpbnRlcm5hbCBhcnJheSBzaXplcyAqLworICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzID4gTUFYX0NPTVBPTkVOVFMpCisgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQ09NUE9ORU5UX0NPVU5ULCBjaW5mby0+bnVtX2NvbXBvbmVudHMsCisJICAgICBNQVhfQ09NUE9ORU5UUyk7CisKKyAgLyogQ29tcHV0ZSBtYXhpbXVtIHNhbXBsaW5nIGZhY3RvcnM7IGNoZWNrIGZhY3RvciB2YWxpZGl0eSAqLworICBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgPSAxOworICBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgPSAxOworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIGlmIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yPD0wIHx8IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I+TUFYX1NBTVBfRkFDVE9SIHx8CisJY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjw9MCB8fCBjb21wcHRyLT52X3NhbXBfZmFjdG9yPk1BWF9TQU1QX0ZBQ1RPUikKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1NBTVBMSU5HKTsKKyAgICBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgPSBNQVgoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yLAorCQkJCSAgIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpOworICAgIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciA9IE1BWChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsCisJCQkJICAgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7CisgIH0KKworICAvKiBDb21wdXRlIGRpbWVuc2lvbnMgb2YgY29tcG9uZW50cyAqLworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIC8qIEZpbGwgaW4gdGhlIGNvcnJlY3QgY29tcG9uZW50X2luZGV4IHZhbHVlOyBkb24ndCByZWx5IG9uIGFwcGxpY2F0aW9uICovCisgICAgY29tcHB0ci0+Y29tcG9uZW50X2luZGV4ID0gY2k7CisgICAgLyogRm9yIGNvbXByZXNzaW9uLCB3ZSBuZXZlciBkbyBEQ1Qgc2NhbGluZy4gKi8KKyAgICBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUgPSBEQ1RTSVpFOworICAgIC8qIFNpemUgaW4gRENUIGJsb2NrcyAqLworICAgIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogKGxvbmcpIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsCisJCSAgICAobG9uZykgKGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKKyAgICBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ICogKGxvbmcpIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCisJCSAgICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKKyAgICAvKiBTaXplIGluIHNhbXBsZXMgKi8KKyAgICBjb21wcHRyLT5kb3duc2FtcGxlZF93aWR0aCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogKGxvbmcpIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsCisJCSAgICAobG9uZykgY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yKTsKKyAgICBjb21wcHRyLT5kb3duc2FtcGxlZF9oZWlnaHQgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgKiAobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKKwkJICAgIChsb25nKSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpOworICAgIC8qIE1hcmsgY29tcG9uZW50IG5lZWRlZCAodGhpcyBmbGFnIGlzbid0IGFjdHVhbGx5IHVzZWQgZm9yIGNvbXByZXNzaW9uKSAqLworICAgIGNvbXBwdHItPmNvbXBvbmVudF9uZWVkZWQgPSBUUlVFOworICB9CisKKyAgLyogQ29tcHV0ZSBudW1iZXIgb2YgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvd3MgKG51bWJlciBvZiB0aW1lcyB0aGF0CisgICAqIG1haW4gY29udHJvbGxlciB3aWxsIGNhbGwgY29lZmZpY2llbnQgY29udHJvbGxlcikuCisgICAqLworICBjaW5mby0+dG90YWxfaU1DVV9yb3dzID0gKEpESU1FTlNJT04pCisgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCwKKwkJICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcipEQ1RTSVpFKSk7Cit9CisKKworI2lmZGVmIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorCitMT0NBTCh2b2lkKQordmFsaWRhdGVfc2NyaXB0IChqX2NvbXByZXNzX3B0ciBjaW5mbykKKy8qIFZlcmlmeSB0aGF0IHRoZSBzY2FuIHNjcmlwdCBpbiBjaW5mby0+c2Nhbl9pbmZvW10gaXMgdmFsaWQ7IGFsc28KKyAqIGRldGVybWluZSB3aGV0aGVyIGl0IHVzZXMgcHJvZ3Jlc3NpdmUgSlBFRywgYW5kIHNldCBjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZS4KKyAqLworeworICBjb25zdCBqcGVnX3NjYW5faW5mbyAqIHNjYW5wdHI7CisgIGludCBzY2Fubm8sIG5jb21wcywgY2ksIGNvZWZpLCB0aGlzaTsKKyAgaW50IFNzLCBTZSwgQWgsIEFsOworICBib29sZWFuIGNvbXBvbmVudF9zZW50W01BWF9DT01QT05FTlRTXTsKKyNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorICBpbnQgKiBsYXN0X2JpdHBvc19wdHI7CisgIGludCBsYXN0X2JpdHBvc1tNQVhfQ09NUE9ORU5UU11bRENUU0laRTJdOworICAvKiAtMSB1bnRpbCB0aGF0IGNvZWZmaWNpZW50IGhhcyBiZWVuIHNlZW47IHRoZW4gbGFzdCBBbCBmb3IgaXQgKi8KKyNlbmRpZgorCisgIGlmIChjaW5mby0+bnVtX3NjYW5zIDw9IDApCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NDQU5fU0NSSVBULCAwKTsKKworICAvKiBGb3Igc2VxdWVudGlhbCBKUEVHLCBhbGwgc2NhbnMgbXVzdCBoYXZlIFNzPTAsIFNlPURDVFNJWkUyLTE7CisgICAqIGZvciBwcm9ncmVzc2l2ZSBKUEVHLCBubyBzY2FuIGNhbiBoYXZlIHRoaXMuCisgICAqLworICBzY2FucHRyID0gY2luZm8tPnNjYW5faW5mbzsKKyAgaWYgKHNjYW5wdHItPlNzICE9IDAgfHwgc2NhbnB0ci0+U2UgIT0gRENUU0laRTItMSkgeworI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECisgICAgY2luZm8tPnByb2dyZXNzaXZlX21vZGUgPSBUUlVFOworICAgIGxhc3RfYml0cG9zX3B0ciA9ICYgbGFzdF9iaXRwb3NbMF1bMF07CisgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSAKKyAgICAgIGZvciAoY29lZmkgPSAwOyBjb2VmaSA8IERDVFNJWkUyOyBjb2VmaSsrKQorCSpsYXN0X2JpdHBvc19wdHIrKyA9IC0xOworI2Vsc2UKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisjZW5kaWYKKyAgfSBlbHNlIHsKKyAgICBjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSA9IEZBTFNFOworICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgCisgICAgICBjb21wb25lbnRfc2VudFtjaV0gPSBGQUxTRTsKKyAgfQorCisgIGZvciAoc2Nhbm5vID0gMTsgc2Nhbm5vIDw9IGNpbmZvLT5udW1fc2NhbnM7IHNjYW5wdHIrKywgc2Nhbm5vKyspIHsKKyAgICAvKiBWYWxpZGF0ZSBjb21wb25lbnQgaW5kZXhlcyAqLworICAgIG5jb21wcyA9IHNjYW5wdHItPmNvbXBzX2luX3NjYW47CisgICAgaWYgKG5jb21wcyA8PSAwIHx8IG5jb21wcyA+IE1BWF9DT01QU19JTl9TQ0FOKQorICAgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQ09NUE9ORU5UX0NPVU5ULCBuY29tcHMsIE1BWF9DT01QU19JTl9TQ0FOKTsKKyAgICBmb3IgKGNpID0gMDsgY2kgPCBuY29tcHM7IGNpKyspIHsKKyAgICAgIHRoaXNpID0gc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4W2NpXTsKKyAgICAgIGlmICh0aGlzaSA8IDAgfHwgdGhpc2kgPj0gY2luZm8tPm51bV9jb21wb25lbnRzKQorCUVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TQ0FOX1NDUklQVCwgc2Nhbm5vKTsKKyAgICAgIC8qIENvbXBvbmVudHMgbXVzdCBhcHBlYXIgaW4gU09GIG9yZGVyIHdpdGhpbiBlYWNoIHNjYW4gKi8KKyAgICAgIGlmIChjaSA+IDAgJiYgdGhpc2kgPD0gc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4W2NpLTFdKQorCUVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TQ0FOX1NDUklQVCwgc2Nhbm5vKTsKKyAgICB9CisgICAgLyogVmFsaWRhdGUgcHJvZ3Jlc3Npb24gcGFyYW1ldGVycyAqLworICAgIFNzID0gc2NhbnB0ci0+U3M7CisgICAgU2UgPSBzY2FucHRyLT5TZTsKKyAgICBBaCA9IHNjYW5wdHItPkFoOworICAgIEFsID0gc2NhbnB0ci0+QWw7CisgICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7CisjaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKKyAgICAgIC8qIFRoZSBKUEVHIHNwZWMgc2ltcGx5IGdpdmVzIHRoZSByYW5nZXMgMC4uMTMgZm9yIEFoIGFuZCBBbCwgYnV0IHRoYXQKKyAgICAgICAqIHNlZW1zIHdyb25nOiB0aGUgdXBwZXIgYm91bmQgb3VnaHQgdG8gZGVwZW5kIG9uIGRhdGEgcHJlY2lzaW9uLgorICAgICAgICogUGVyaGFwcyB0aGV5IHJlYWxseSBtZWFudCAwLi5OKzEgZm9yIE4tYml0IHByZWNpc2lvbi4KKyAgICAgICAqIEhlcmUgd2UgYWxsb3cgMC4uMTAgZm9yIDgtYml0IGRhdGE7IEFsIGxhcmdlciB0aGFuIDEwIHJlc3VsdHMgaW4KKyAgICAgICAqIG91dC1vZi1yYW5nZSByZWNvbnN0cnVjdGVkIERDIHZhbHVlcyBkdXJpbmcgdGhlIGZpcnN0IERDIHNjYW4sCisgICAgICAgKiB3aGljaCBtaWdodCBjYXVzZSBwcm9ibGVtcyBmb3Igc29tZSBkZWNvZGVycy4KKyAgICAgICAqLworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4CisjZGVmaW5lIE1BWF9BSF9BTCAxMAorI2Vsc2UKKyNkZWZpbmUgTUFYX0FIX0FMIDEzCisjZW5kaWYKKyAgICAgIGlmIChTcyA8IDAgfHwgU3MgPj0gRENUU0laRTIgfHwgU2UgPCBTcyB8fCBTZSA+PSBEQ1RTSVpFMiB8fAorCSAgQWggPCAwIHx8IEFoID4gTUFYX0FIX0FMIHx8IEFsIDwgMCB8fCBBbCA+IE1BWF9BSF9BTCkKKwlFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJPR19TQ1JJUFQsIHNjYW5ubyk7CisgICAgICBpZiAoU3MgPT0gMCkgeworCWlmIChTZSAhPSAwKQkJLyogREMgYW5kIEFDIHRvZ2V0aGVyIG5vdCBPSyAqLworCSAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BST0dfU0NSSVBULCBzY2Fubm8pOworICAgICAgfSBlbHNlIHsKKwlpZiAobmNvbXBzICE9IDEpCS8qIEFDIHNjYW5zIG11c3QgYmUgZm9yIG9ubHkgb25lIGNvbXBvbmVudCAqLworCSAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BST0dfU0NSSVBULCBzY2Fubm8pOworICAgICAgfQorICAgICAgZm9yIChjaSA9IDA7IGNpIDwgbmNvbXBzOyBjaSsrKSB7CisJbGFzdF9iaXRwb3NfcHRyID0gJiBsYXN0X2JpdHBvc1tzY2FucHRyLT5jb21wb25lbnRfaW5kZXhbY2ldXVswXTsKKwlpZiAoU3MgIT0gMCAmJiBsYXN0X2JpdHBvc19wdHJbMF0gPCAwKSAvKiBBQyB3aXRob3V0IHByaW9yIERDIHNjYW4gKi8KKwkgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QUk9HX1NDUklQVCwgc2Nhbm5vKTsKKwlmb3IgKGNvZWZpID0gU3M7IGNvZWZpIDw9IFNlOyBjb2VmaSsrKSB7CisJICBpZiAobGFzdF9iaXRwb3NfcHRyW2NvZWZpXSA8IDApIHsKKwkgICAgLyogZmlyc3Qgc2NhbiBvZiB0aGlzIGNvZWZmaWNpZW50ICovCisJICAgIGlmIChBaCAhPSAwKQorCSAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QUk9HX1NDUklQVCwgc2Nhbm5vKTsKKwkgIH0gZWxzZSB7CisJICAgIC8qIG5vdCBmaXJzdCBzY2FuICovCisJICAgIGlmIChBaCAhPSBsYXN0X2JpdHBvc19wdHJbY29lZmldIHx8IEFsICE9IEFoLTEpCisJICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BST0dfU0NSSVBULCBzY2Fubm8pOworCSAgfQorCSAgbGFzdF9iaXRwb3NfcHRyW2NvZWZpXSA9IEFsOworCX0KKyAgICAgIH0KKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAvKiBGb3Igc2VxdWVudGlhbCBKUEVHLCBhbGwgcHJvZ3Jlc3Npb24gcGFyYW1ldGVycyBtdXN0IGJlIHRoZXNlOiAqLworICAgICAgaWYgKFNzICE9IDAgfHwgU2UgIT0gRENUU0laRTItMSB8fCBBaCAhPSAwIHx8IEFsICE9IDApCisJRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BST0dfU0NSSVBULCBzY2Fubm8pOworICAgICAgLyogTWFrZSBzdXJlIGNvbXBvbmVudHMgYXJlIG5vdCBzZW50IHR3aWNlICovCisgICAgICBmb3IgKGNpID0gMDsgY2kgPCBuY29tcHM7IGNpKyspIHsKKwl0aGlzaSA9IHNjYW5wdHItPmNvbXBvbmVudF9pbmRleFtjaV07CisJaWYgKGNvbXBvbmVudF9zZW50W3RoaXNpXSkKKwkgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TQ0FOX1NDUklQVCwgc2Nhbm5vKTsKKwljb21wb25lbnRfc2VudFt0aGlzaV0gPSBUUlVFOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIE5vdyB2ZXJpZnkgdGhhdCBldmVyeXRoaW5nIGdvdCBzZW50LiAqLworICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKKyNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorICAgIC8qIEZvciBwcm9ncmVzc2l2ZSBtb2RlLCB3ZSBvbmx5IGNoZWNrIHRoYXQgYXQgbGVhc3Qgc29tZSBEQyBkYXRhCisgICAgICogZ290IHNlbnQgZm9yIGVhY2ggY29tcG9uZW50OyB0aGUgc3BlYyBkb2VzIG5vdCByZXF1aXJlIHRoYXQgYWxsIGJpdHMKKyAgICAgKiBvZiBhbGwgY29lZmZpY2llbnRzIGJlIHRyYW5zbWl0dGVkLiAgV291bGQgaXQgYmUgd2lzZXIgdG8gZW5mb3JjZQorICAgICAqIHRyYW5zbWlzc2lvbiBvZiBhbGwgY29lZmZpY2llbnQgYml0cz8/CisgICAgICovCisgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisgICAgICBpZiAobGFzdF9iaXRwb3NbY2ldWzBdIDwgMCkKKwlFUlJFWElUKGNpbmZvLCBKRVJSX01JU1NJTkdfREFUQSk7CisgICAgfQorI2VuZGlmCisgIH0gZWxzZSB7CisgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisgICAgICBpZiAoISBjb21wb25lbnRfc2VudFtjaV0pCisJRVJSRVhJVChjaW5mbywgSkVSUl9NSVNTSU5HX0RBVEEpOworICAgIH0KKyAgfQorfQorCisjZW5kaWYgLyogQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCisKKworTE9DQUwodm9pZCkKK3NlbGVjdF9zY2FuX3BhcmFtZXRlcnMgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogU2V0IHVwIHRoZSBzY2FuIHBhcmFtZXRlcnMgZm9yIHRoZSBjdXJyZW50IHNjYW4gKi8KK3sKKyAgaW50IGNpOworCisjaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisgIGlmIChjaW5mby0+c2Nhbl9pbmZvICE9IE5VTEwpIHsKKyAgICAvKiBQcmVwYXJlIGZvciBjdXJyZW50IHNjYW4gLS0tIHRoZSBzY3JpcHQgaXMgYWxyZWFkeSB2YWxpZGF0ZWQgKi8KKyAgICBteV9tYXN0ZXJfcHRyIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKSBjaW5mby0+bWFzdGVyOworICAgIGNvbnN0IGpwZWdfc2Nhbl9pbmZvICogc2NhbnB0ciA9IGNpbmZvLT5zY2FuX2luZm8gKyBtYXN0ZXItPnNjYW5fbnVtYmVyOworCisgICAgY2luZm8tPmNvbXBzX2luX3NjYW4gPSBzY2FucHRyLT5jb21wc19pbl9zY2FuOworICAgIGZvciAoY2kgPSAwOyBjaSA8IHNjYW5wdHItPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICAgIGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXSA9CisJJmNpbmZvLT5jb21wX2luZm9bc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4W2NpXV07CisgICAgfQorICAgIGNpbmZvLT5TcyA9IHNjYW5wdHItPlNzOworICAgIGNpbmZvLT5TZSA9IHNjYW5wdHItPlNlOworICAgIGNpbmZvLT5BaCA9IHNjYW5wdHItPkFoOworICAgIGNpbmZvLT5BbCA9IHNjYW5wdHItPkFsOworICB9CisgIGVsc2UKKyNlbmRpZgorICB7CisgICAgLyogUHJlcGFyZSBmb3Igc2luZ2xlIHNlcXVlbnRpYWwtSlBFRyBzY2FuIGNvbnRhaW5pbmcgYWxsIGNvbXBvbmVudHMgKi8KKyAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzID4gTUFYX0NPTVBTX0lOX1NDQU4pCisgICAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGNpbmZvLT5udW1fY29tcG9uZW50cywKKwkgICAgICAgTUFYX0NPTVBTX0lOX1NDQU4pOworICAgIGNpbmZvLT5jb21wc19pbl9zY2FuID0gY2luZm8tPm51bV9jb21wb25lbnRzOworICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworICAgICAgY2luZm8tPmN1cl9jb21wX2luZm9bY2ldID0gJmNpbmZvLT5jb21wX2luZm9bY2ldOworICAgIH0KKyAgICBjaW5mby0+U3MgPSAwOworICAgIGNpbmZvLT5TZSA9IERDVFNJWkUyLTE7CisgICAgY2luZm8tPkFoID0gMDsKKyAgICBjaW5mby0+QWwgPSAwOworICB9Cit9CisKKworTE9DQUwodm9pZCkKK3Blcl9zY2FuX3NldHVwIChqX2NvbXByZXNzX3B0ciBjaW5mbykKKy8qIERvIGNvbXB1dGF0aW9ucyB0aGF0IGFyZSBuZWVkZWQgYmVmb3JlIHByb2Nlc3NpbmcgYSBKUEVHIHNjYW4gKi8KKy8qIGNpbmZvLT5jb21wc19pbl9zY2FuIGFuZCBjaW5mby0+Y3VyX2NvbXBfaW5mb1tdIGFyZSBhbHJlYWR5IHNldCAqLworeworICBpbnQgY2ksIG1jdWJsa3MsIHRtcDsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgCisgIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiA9PSAxKSB7CisgICAgCisgICAgLyogTm9uaW50ZXJsZWF2ZWQgKHNpbmdsZS1jb21wb25lbnQpIHNjYW4gKi8KKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bMF07CisgICAgCisgICAgLyogT3ZlcmFsbCBpbWFnZSBzaXplIGluIE1DVXMgKi8KKyAgICBjaW5mby0+TUNVc19wZXJfcm93ID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOworICAgIGNpbmZvLT5NQ1Vfcm93c19pbl9zY2FuID0gY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrczsKKyAgICAKKyAgICAvKiBGb3Igbm9uaW50ZXJsZWF2ZWQgc2NhbiwgYWx3YXlzIG9uZSBibG9jayBwZXIgTUNVICovCisgICAgY29tcHB0ci0+TUNVX3dpZHRoID0gMTsKKyAgICBjb21wcHRyLT5NQ1VfaGVpZ2h0ID0gMTsKKyAgICBjb21wcHRyLT5NQ1VfYmxvY2tzID0gMTsKKyAgICBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoID0gRENUU0laRTsKKyAgICBjb21wcHRyLT5sYXN0X2NvbF93aWR0aCA9IDE7CisgICAgLyogRm9yIG5vbmludGVybGVhdmVkIHNjYW5zLCBpdCBpcyBjb252ZW5pZW50IHRvIGRlZmluZSBsYXN0X3Jvd19oZWlnaHQKKyAgICAgKiBhcyB0aGUgbnVtYmVyIG9mIGJsb2NrIHJvd3MgcHJlc2VudCBpbiB0aGUgbGFzdCBpTUNVIHJvdy4KKyAgICAgKi8KKyAgICB0bXAgPSAoaW50KSAoY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyAlIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOworICAgIGlmICh0bXAgPT0gMCkgdG1wID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICBjb21wcHRyLT5sYXN0X3Jvd19oZWlnaHQgPSB0bXA7CisgICAgCisgICAgLyogUHJlcGFyZSBhcnJheSBkZXNjcmliaW5nIE1DVSBjb21wb3NpdGlvbiAqLworICAgIGNpbmZvLT5ibG9ja3NfaW5fTUNVID0gMTsKKyAgICBjaW5mby0+TUNVX21lbWJlcnNoaXBbMF0gPSAwOworICAgIAorICB9IGVsc2UgeworICAgIAorICAgIC8qIEludGVybGVhdmVkIChtdWx0aS1jb21wb25lbnQpIHNjYW4gKi8KKyAgICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gPD0gMCB8fCBjaW5mby0+Y29tcHNfaW5fc2NhbiA+IE1BWF9DT01QU19JTl9TQ0FOKQorICAgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQ09NUE9ORU5UX0NPVU5ULCBjaW5mby0+Y29tcHNfaW5fc2NhbiwKKwkgICAgICAgTUFYX0NPTVBTX0lOX1NDQU4pOworICAgIAorICAgIC8qIE92ZXJhbGwgaW1hZ2Ugc2l6ZSBpbiBNQ1VzICovCisgICAgY2luZm8tPk1DVXNfcGVyX3JvdyA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoLAorCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IqRENUU0laRSkpOworICAgIGNpbmZvLT5NQ1Vfcm93c19pbl9zY2FuID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0LAorCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IqRENUU0laRSkpOworICAgIAorICAgIGNpbmZvLT5ibG9ja3NfaW5fTUNVID0gMDsKKyAgICAKKyAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgeworICAgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICAgIC8qIFNhbXBsaW5nIGZhY3RvcnMgZ2l2ZSAjIG9mIGJsb2NrcyBvZiBjb21wb25lbnQgaW4gZWFjaCBNQ1UgKi8KKyAgICAgIGNvbXBwdHItPk1DVV93aWR0aCA9IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7CisgICAgICBjb21wcHRyLT5NQ1VfaGVpZ2h0ID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICAgIGNvbXBwdHItPk1DVV9ibG9ja3MgPSBjb21wcHRyLT5NQ1Vfd2lkdGggKiBjb21wcHRyLT5NQ1VfaGVpZ2h0OworICAgICAgY29tcHB0ci0+TUNVX3NhbXBsZV93aWR0aCA9IGNvbXBwdHItPk1DVV93aWR0aCAqIERDVFNJWkU7CisgICAgICAvKiBGaWd1cmUgbnVtYmVyIG9mIG5vbi1kdW1teSBibG9ja3MgaW4gbGFzdCBNQ1UgY29sdW1uICYgcm93ICovCisgICAgICB0bXAgPSAoaW50KSAoY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICUgY29tcHB0ci0+TUNVX3dpZHRoKTsKKyAgICAgIGlmICh0bXAgPT0gMCkgdG1wID0gY29tcHB0ci0+TUNVX3dpZHRoOworICAgICAgY29tcHB0ci0+bGFzdF9jb2xfd2lkdGggPSB0bXA7CisgICAgICB0bXAgPSAoaW50KSAoY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyAlIGNvbXBwdHItPk1DVV9oZWlnaHQpOworICAgICAgaWYgKHRtcCA9PSAwKSB0bXAgPSBjb21wcHRyLT5NQ1VfaGVpZ2h0OworICAgICAgY29tcHB0ci0+bGFzdF9yb3dfaGVpZ2h0ID0gdG1wOworICAgICAgLyogUHJlcGFyZSBhcnJheSBkZXNjcmliaW5nIE1DVSBjb21wb3NpdGlvbiAqLworICAgICAgbWN1YmxrcyA9IGNvbXBwdHItPk1DVV9ibG9ja3M7CisgICAgICBpZiAoY2luZm8tPmJsb2Nrc19pbl9NQ1UgKyBtY3VibGtzID4gQ19NQVhfQkxPQ0tTX0lOX01DVSkKKwlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9NQ1VfU0laRSk7CisgICAgICB3aGlsZSAobWN1Ymxrcy0tID4gMCkgeworCWNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtjaW5mby0+YmxvY2tzX2luX01DVSsrXSA9IGNpOworICAgICAgfQorICAgIH0KKyAgICAKKyAgfQorCisgIC8qIENvbnZlcnQgcmVzdGFydCBzcGVjaWZpZWQgaW4gcm93cyB0byBhY3R1YWwgTUNVIGNvdW50LiAqLworICAvKiBOb3RlIHRoYXQgY291bnQgbXVzdCBmaXQgaW4gMTYgYml0cywgc28gd2UgcHJvdmlkZSBsaW1pdGluZy4gKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2luX3Jvd3MgPiAwKSB7CisgICAgbG9uZyBub21pbmFsID0gKGxvbmcpIGNpbmZvLT5yZXN0YXJ0X2luX3Jvd3MgKiAobG9uZykgY2luZm8tPk1DVXNfcGVyX3JvdzsKKyAgICBjaW5mby0+cmVzdGFydF9pbnRlcnZhbCA9ICh1bnNpZ25lZCBpbnQpIE1JTihub21pbmFsLCA2NTUzNUwpOworICB9Cit9CisKKworLyoKKyAqIFBlci1wYXNzIHNldHVwLgorICogVGhpcyBpcyBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHBhc3MuICBXZSBkZXRlcm1pbmUgd2hpY2ggbW9kdWxlcworICogd2lsbCBiZSBhY3RpdmUgZHVyaW5nIHRoaXMgcGFzcyBhbmQgZ2l2ZSB0aGVtIGFwcHJvcHJpYXRlIHN0YXJ0X3Bhc3MgY2FsbHMuCisgKiBXZSBhbHNvIHNldCBpc19sYXN0X3Bhc3MgdG8gaW5kaWNhdGUgd2hldGhlciBhbnkgbW9yZSBwYXNzZXMgd2lsbCBiZQorICogcmVxdWlyZWQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwcmVwYXJlX2Zvcl9wYXNzIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfbWFzdGVyX3B0ciBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikgY2luZm8tPm1hc3RlcjsKKworICBzd2l0Y2ggKG1hc3Rlci0+cGFzc190eXBlKSB7CisgIGNhc2UgbWFpbl9wYXNzOgorICAgIC8qIEluaXRpYWwgcGFzczogd2lsbCBjb2xsZWN0IGlucHV0IGRhdGEsIGFuZCBkbyBlaXRoZXIgSHVmZm1hbgorICAgICAqIG9wdGltaXphdGlvbiBvciBkYXRhIG91dHB1dCBmb3IgdGhlIGZpcnN0IHNjYW4uCisgICAgICovCisgICAgc2VsZWN0X3NjYW5fcGFyYW1ldGVycyhjaW5mbyk7CisgICAgcGVyX3NjYW5fc2V0dXAoY2luZm8pOworICAgIGlmICghIGNpbmZvLT5yYXdfZGF0YV9pbikgeworICAgICAgKCpjaW5mby0+Y2NvbnZlcnQtPnN0YXJ0X3Bhc3MpIChjaW5mbyk7CisgICAgICAoKmNpbmZvLT5kb3duc2FtcGxlLT5zdGFydF9wYXNzKSAoY2luZm8pOworICAgICAgKCpjaW5mby0+cHJlcC0+c3RhcnRfcGFzcykgKGNpbmZvLCBKQlVGX1BBU1NfVEhSVSk7CisgICAgfQorICAgICgqY2luZm8tPmZkY3QtPnN0YXJ0X3Bhc3MpIChjaW5mbyk7CisgICAgKCpjaW5mby0+ZW50cm9weS0+c3RhcnRfcGFzcykgKGNpbmZvLCBjaW5mby0+b3B0aW1pemVfY29kaW5nKTsKKyAgICAoKmNpbmZvLT5jb2VmLT5zdGFydF9wYXNzKSAoY2luZm8sCisJCQkJKG1hc3Rlci0+dG90YWxfcGFzc2VzID4gMSA/CisJCQkJIEpCVUZfU0FWRV9BTkRfUEFTUyA6IEpCVUZfUEFTU19USFJVKSk7CisgICAgKCpjaW5mby0+bWFpbi0+c3RhcnRfcGFzcykgKGNpbmZvLCBKQlVGX1BBU1NfVEhSVSk7CisgICAgaWYgKGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpIHsKKyAgICAgIC8qIE5vIGltbWVkaWF0ZSBkYXRhIG91dHB1dDsgcG9zdHBvbmUgd3JpdGluZyBmcmFtZS9zY2FuIGhlYWRlcnMgKi8KKyAgICAgIG1hc3Rlci0+cHViLmNhbGxfcGFzc19zdGFydHVwID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFdpbGwgd3JpdGUgZnJhbWUvc2NhbiBoZWFkZXJzIGF0IGZpcnN0IGpwZWdfd3JpdGVfc2NhbmxpbmVzIGNhbGwgKi8KKyAgICAgIG1hc3Rlci0+cHViLmNhbGxfcGFzc19zdGFydHVwID0gVFJVRTsKKyAgICB9CisgICAgYnJlYWs7CisjaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECisgIGNhc2UgaHVmZl9vcHRfcGFzczoKKyAgICAvKiBEbyBIdWZmbWFuIG9wdGltaXphdGlvbiBmb3IgYSBzY2FuIGFmdGVyIHRoZSBmaXJzdCBvbmUuICovCisgICAgc2VsZWN0X3NjYW5fcGFyYW1ldGVycyhjaW5mbyk7CisgICAgcGVyX3NjYW5fc2V0dXAoY2luZm8pOworICAgIGlmIChjaW5mby0+U3MgIT0gMCB8fCBjaW5mby0+QWggPT0gMCB8fCBjaW5mby0+YXJpdGhfY29kZSkgeworICAgICAgKCpjaW5mby0+ZW50cm9weS0+c3RhcnRfcGFzcykgKGNpbmZvLCBUUlVFKTsKKyAgICAgICgqY2luZm8tPmNvZWYtPnN0YXJ0X3Bhc3MpIChjaW5mbywgSkJVRl9DUkFOS19ERVNUKTsKKyAgICAgIG1hc3Rlci0+cHViLmNhbGxfcGFzc19zdGFydHVwID0gRkFMU0U7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLyogU3BlY2lhbCBjYXNlOiBIdWZmbWFuIERDIHJlZmluZW1lbnQgc2NhbnMgbmVlZCBubyBIdWZmbWFuIHRhYmxlCisgICAgICogYW5kIHRoZXJlZm9yZSB3ZSBjYW4gc2tpcCB0aGUgb3B0aW1pemF0aW9uIHBhc3MgZm9yIHRoZW0uCisgICAgICovCisgICAgbWFzdGVyLT5wYXNzX3R5cGUgPSBvdXRwdXRfcGFzczsKKyAgICBtYXN0ZXItPnBhc3NfbnVtYmVyKys7CisgICAgLypGQUxMVEhST1VHSCovCisjZW5kaWYKKyAgY2FzZSBvdXRwdXRfcGFzczoKKyAgICAvKiBEbyBhIGRhdGEtb3V0cHV0IHBhc3MuICovCisgICAgLyogV2UgbmVlZCBub3QgcmVwZWF0IHBlci1zY2FuIHNldHVwIGlmIHByaW9yIG9wdGltaXphdGlvbiBwYXNzIGRpZCBpdC4gKi8KKyAgICBpZiAoISBjaW5mby0+b3B0aW1pemVfY29kaW5nKSB7CisgICAgICBzZWxlY3Rfc2Nhbl9wYXJhbWV0ZXJzKGNpbmZvKTsKKyAgICAgIHBlcl9zY2FuX3NldHVwKGNpbmZvKTsKKyAgICB9CisgICAgKCpjaW5mby0+ZW50cm9weS0+c3RhcnRfcGFzcykgKGNpbmZvLCBGQUxTRSk7CisgICAgKCpjaW5mby0+Y29lZi0+c3RhcnRfcGFzcykgKGNpbmZvLCBKQlVGX0NSQU5LX0RFU1QpOworICAgIC8qIFdlIGVtaXQgZnJhbWUvc2NhbiBoZWFkZXJzIG5vdyAqLworICAgIGlmIChtYXN0ZXItPnNjYW5fbnVtYmVyID09IDApCisgICAgICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX2ZyYW1lX2hlYWRlcikgKGNpbmZvKTsKKyAgICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX3NjYW5faGVhZGVyKSAoY2luZm8pOworICAgIG1hc3Rlci0+cHViLmNhbGxfcGFzc19zdGFydHVwID0gRkFMU0U7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworICB9CisKKyAgbWFzdGVyLT5wdWIuaXNfbGFzdF9wYXNzID0gKG1hc3Rlci0+cGFzc19udW1iZXIgPT0gbWFzdGVyLT50b3RhbF9wYXNzZXMtMSk7CisKKyAgLyogU2V0IHVwIHByb2dyZXNzIG1vbml0b3IncyBwYXNzIGluZm8gaWYgcHJlc2VudCAqLworICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpIHsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPmNvbXBsZXRlZF9wYXNzZXMgPSBtYXN0ZXItPnBhc3NfbnVtYmVyOworICAgIGNpbmZvLT5wcm9ncmVzcy0+dG90YWxfcGFzc2VzID0gbWFzdGVyLT50b3RhbF9wYXNzZXM7CisgIH0KK30KKworCisvKgorICogU3BlY2lhbCBzdGFydC1vZi1wYXNzIGhvb2suCisgKiBUaGlzIGlzIGNhbGxlZCBieSBqcGVnX3dyaXRlX3NjYW5saW5lcyBpZiBjYWxsX3Bhc3Nfc3RhcnR1cCBpcyBUUlVFLgorICogSW4gc2luZ2xlLXBhc3MgcHJvY2Vzc2luZywgd2UgbmVlZCB0aGlzIGhvb2sgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvCisgKiB3cml0ZSBmcmFtZS9zY2FuIGhlYWRlcnMgZHVyaW5nIGpwZWdfc3RhcnRfY29tcHJlc3M7IHdlIHdhbnQgdG8gbGV0IHRoZQorICogYXBwbGljYXRpb24gd3JpdGUgQ09NIG1hcmtlcnMgZXRjLiBiZXR3ZWVuIGpwZWdfc3RhcnRfY29tcHJlc3MgYW5kIHRoZQorICoganBlZ193cml0ZV9zY2FubGluZXMgbG9vcC4KKyAqIEluIG11bHRpLXBhc3MgcHJvY2Vzc2luZywgdGhpcyByb3V0aW5lIGlzIG5vdCB1c2VkLgorICovCisKK01FVEhPRERFRih2b2lkKQorcGFzc19zdGFydHVwIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgY2luZm8tPm1hc3Rlci0+Y2FsbF9wYXNzX3N0YXJ0dXAgPSBGQUxTRTsgLyogcmVzZXQgZmxhZyBzbyBjYWxsIG9ubHkgb25jZSAqLworCisgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfZnJhbWVfaGVhZGVyKSAoY2luZm8pOworICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX3NjYW5faGVhZGVyKSAoY2luZm8pOworfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYXQgZW5kIG9mIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmaW5pc2hfcGFzc19tYXN0ZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9tYXN0ZXJfcHRyIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKSBjaW5mby0+bWFzdGVyOworCisgIC8qIFRoZSBlbnRyb3B5IGNvZGVyIGFsd2F5cyBuZWVkcyBhbiBlbmQtb2YtcGFzcyBjYWxsLAorICAgKiBlaXRoZXIgdG8gYW5hbHl6ZSBzdGF0aXN0aWNzIG9yIHRvIGZsdXNoIGl0cyBvdXRwdXQgYnVmZmVyLgorICAgKi8KKyAgKCpjaW5mby0+ZW50cm9weS0+ZmluaXNoX3Bhc3MpIChjaW5mbyk7CisKKyAgLyogVXBkYXRlIHN0YXRlIGZvciBuZXh0IHBhc3MgKi8KKyAgc3dpdGNoIChtYXN0ZXItPnBhc3NfdHlwZSkgeworICBjYXNlIG1haW5fcGFzczoKKyAgICAvKiBuZXh0IHBhc3MgaXMgZWl0aGVyIG91dHB1dCBvZiBzY2FuIDAgKGFmdGVyIG9wdGltaXphdGlvbikKKyAgICAgKiBvciBvdXRwdXQgb2Ygc2NhbiAxIChpZiBubyBvcHRpbWl6YXRpb24pLgorICAgICAqLworICAgIG1hc3Rlci0+cGFzc190eXBlID0gb3V0cHV0X3Bhc3M7CisgICAgaWYgKCEgY2luZm8tPm9wdGltaXplX2NvZGluZykKKyAgICAgIG1hc3Rlci0+c2Nhbl9udW1iZXIrKzsKKyAgICBicmVhazsKKyAgY2FzZSBodWZmX29wdF9wYXNzOgorICAgIC8qIG5leHQgcGFzcyBpcyBhbHdheXMgb3V0cHV0IG9mIGN1cnJlbnQgc2NhbiAqLworICAgIG1hc3Rlci0+cGFzc190eXBlID0gb3V0cHV0X3Bhc3M7CisgICAgYnJlYWs7CisgIGNhc2Ugb3V0cHV0X3Bhc3M6CisgICAgLyogbmV4dCBwYXNzIGlzIGVpdGhlciBvcHRpbWl6YXRpb24gb3Igb3V0cHV0IG9mIG5leHQgc2NhbiAqLworICAgIGlmIChjaW5mby0+b3B0aW1pemVfY29kaW5nKQorICAgICAgbWFzdGVyLT5wYXNzX3R5cGUgPSBodWZmX29wdF9wYXNzOworICAgIG1hc3Rlci0+c2Nhbl9udW1iZXIrKzsKKyAgICBicmVhazsKKyAgfQorCisgIG1hc3Rlci0+cGFzc19udW1iZXIrKzsKK30KKworCisvKgorICogSW5pdGlhbGl6ZSBtYXN0ZXIgY29tcHJlc3Npb24gY29udHJvbC4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X2NfbWFzdGVyX2NvbnRyb2wgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIHRyYW5zY29kZV9vbmx5KQoreworICBteV9tYXN0ZXJfcHRyIG1hc3RlcjsKKworICBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICBTSVpFT0YobXlfY29tcF9tYXN0ZXIpKTsKKyAgY2luZm8tPm1hc3RlciA9IChzdHJ1Y3QganBlZ19jb21wX21hc3RlciAqKSBtYXN0ZXI7CisgIG1hc3Rlci0+cHViLnByZXBhcmVfZm9yX3Bhc3MgPSBwcmVwYXJlX2Zvcl9wYXNzOworICBtYXN0ZXItPnB1Yi5wYXNzX3N0YXJ0dXAgPSBwYXNzX3N0YXJ0dXA7CisgIG1hc3Rlci0+cHViLmZpbmlzaF9wYXNzID0gZmluaXNoX3Bhc3NfbWFzdGVyOworICBtYXN0ZXItPnB1Yi5pc19sYXN0X3Bhc3MgPSBGQUxTRTsKKworICAvKiBWYWxpZGF0ZSBwYXJhbWV0ZXJzLCBkZXRlcm1pbmUgZGVyaXZlZCB2YWx1ZXMgKi8KKyAgaW5pdGlhbF9zZXR1cChjaW5mbyk7CisKKyAgaWYgKGNpbmZvLT5zY2FuX2luZm8gIT0gTlVMTCkgeworI2lmZGVmIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorICAgIHZhbGlkYXRlX3NjcmlwdChjaW5mbyk7CisjZWxzZQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlID0gRkFMU0U7CisgICAgY2luZm8tPm51bV9zY2FucyA9IDE7CisgIH0KKworICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpCS8qICBURU1QT1JBUlkgSEFDSyA/Pz8gKi8KKyAgICBjaW5mby0+b3B0aW1pemVfY29kaW5nID0gVFJVRTsgLyogYXNzdW1lIGRlZmF1bHQgdGFibGVzIG5vIGdvb2QgZm9yIHByb2dyZXNzaXZlIG1vZGUgKi8KKworICAvKiBJbml0aWFsaXplIG15IHByaXZhdGUgc3RhdGUgKi8KKyAgaWYgKHRyYW5zY29kZV9vbmx5KSB7CisgICAgLyogbm8gbWFpbiBwYXNzIGluIHRyYW5zY29kaW5nICovCisgICAgaWYgKGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpCisgICAgICBtYXN0ZXItPnBhc3NfdHlwZSA9IGh1ZmZfb3B0X3Bhc3M7CisgICAgZWxzZQorICAgICAgbWFzdGVyLT5wYXNzX3R5cGUgPSBvdXRwdXRfcGFzczsKKyAgfSBlbHNlIHsKKyAgICAvKiBmb3Igbm9ybWFsIGNvbXByZXNzaW9uLCBmaXJzdCBwYXNzIGlzIGFsd2F5cyB0aGlzIHR5cGU6ICovCisgICAgbWFzdGVyLT5wYXNzX3R5cGUgPSBtYWluX3Bhc3M7CisgIH0KKyAgbWFzdGVyLT5zY2FuX251bWJlciA9IDA7CisgIG1hc3Rlci0+cGFzc19udW1iZXIgPSAwOworICBpZiAoY2luZm8tPm9wdGltaXplX2NvZGluZykKKyAgICBtYXN0ZXItPnRvdGFsX3Bhc3NlcyA9IGNpbmZvLT5udW1fc2NhbnMgKiAyOworICBlbHNlCisgICAgbWFzdGVyLT50b3RhbF9wYXNzZXMgPSBjaW5mby0+bnVtX3NjYW5zOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjb21hcGkuYyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY29tYXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIxZmE3NQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY29tYXBpLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBqY29tYXBpLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhcHBsaWNhdGlvbiBpbnRlcmZhY2Ugcm91dGluZXMgdGhhdCBhcmUgdXNlZCBmb3IgYm90aAorICogY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24uCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qCisgKiBBYm9ydCBwcm9jZXNzaW5nIG9mIGEgSlBFRyBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIG9wZXJhdGlvbiwKKyAqIGJ1dCBkb24ndCBkZXN0cm95IHRoZSBvYmplY3QgaXRzZWxmLgorICoKKyAqIEZvciB0aGlzLCB3ZSBtZXJlbHkgY2xlYW4gdXAgYWxsIHRoZSBub25wZXJtYW5lbnQgbWVtb3J5IHBvb2xzLgorICogTm90ZSB0aGF0IHRlbXAgZmlsZXMgKHZpcnR1YWwgYXJyYXlzKSBhcmUgbm90IGFsbG93ZWQgdG8gYmVsb25nIHRvCisgKiB0aGUgcGVybWFuZW50IHBvb2wsIHNvIHdlIHdpbGwgYmUgYWJsZSB0byBjbG9zZSBhbGwgdGVtcCBmaWxlcyBoZXJlLgorICogQ2xvc2luZyBhIGRhdGEgc291cmNlIG9yIGRlc3RpbmF0aW9uLCBpZiBuZWNlc3NhcnksIGlzIHRoZSBhcHBsaWNhdGlvbidzCisgKiByZXNwb25zaWJpbGl0eS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfYWJvcnQgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgaW50IHBvb2w7CisKKyAgLyogRG8gbm90aGluZyBpZiBjYWxsZWQgb24gYSBub3QtaW5pdGlhbGl6ZWQgb3IgZGVzdHJveWVkIEpQRUcgb2JqZWN0LiAqLworICBpZiAoY2luZm8tPm1lbSA9PSBOVUxMKQorICAgIHJldHVybjsKKworICAvKiBSZWxlYXNpbmcgcG9vbHMgaW4gcmV2ZXJzZSBvcmRlciBtaWdodCBoZWxwIGF2b2lkIGZyYWdtZW50YXRpb24KKyAgICogd2l0aCBzb21lIChicmFpbi1kYW1hZ2VkKSBtYWxsb2MgbGlicmFyaWVzLgorICAgKi8KKyAgZm9yIChwb29sID0gSlBPT0xfTlVNUE9PTFMtMTsgcG9vbCA+IEpQT09MX1BFUk1BTkVOVDsgcG9vbC0tKSB7CisgICAgKCpjaW5mby0+bWVtLT5mcmVlX3Bvb2wpIChjaW5mbywgcG9vbCk7CisgIH0KKworICAvKiBSZXNldCBvdmVyYWxsIHN0YXRlIGZvciBwb3NzaWJsZSByZXVzZSBvZiBvYmplY3QgKi8KKyAgaWYgKGNpbmZvLT5pc19kZWNvbXByZXNzb3IpIHsKKyAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1NUQVJUOworICAgIC8qIFRyeSB0byBrZWVwIGFwcGxpY2F0aW9uIGZyb20gYWNjZXNzaW5nIG5vdy1kZWxldGVkIG1hcmtlciBsaXN0LgorICAgICAqIEEgYml0IGtsdWRneSB0byBkbyBpdCBoZXJlLCBidXQgdGhpcyBpcyB0aGUgbW9zdCBjZW50cmFsIHBsYWNlLgorICAgICAqLworICAgICgoal9kZWNvbXByZXNzX3B0cikgY2luZm8pLT5tYXJrZXJfbGlzdCA9IE5VTEw7CisgIH0gZWxzZSB7CisgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IENTVEFURV9TVEFSVDsKKyAgfQorfQorCisKKy8qCisgKiBEZXN0cnVjdGlvbiBvZiBhIEpQRUcgb2JqZWN0LgorICoKKyAqIEV2ZXJ5dGhpbmcgZ2V0cyBkZWFsbG9jYXRlZCBleGNlcHQgdGhlIG1hc3RlciBqcGVnX2NvbXByZXNzX3N0cnVjdCBpdHNlbGYKKyAqIGFuZCB0aGUgZXJyb3IgbWFuYWdlciBzdHJ1Y3QuICBCb3RoIG9mIHRoZXNlIGFyZSBzdXBwbGllZCBieSB0aGUgYXBwbGljYXRpb24KKyAqIGFuZCBtdXN0IGJlIGZyZWVkLCBpZiBuZWNlc3NhcnksIGJ5IHRoZSBhcHBsaWNhdGlvbi4gIChPZnRlbiB0aGV5IGFyZSBvbgorICogdGhlIHN0YWNrIGFuZCBzbyBkb24ndCBuZWVkIHRvIGJlIGZyZWVkIGFueXdheS4pCisgKiBDbG9zaW5nIGEgZGF0YSBzb3VyY2Ugb3IgZGVzdGluYXRpb24sIGlmIG5lY2Vzc2FyeSwgaXMgdGhlIGFwcGxpY2F0aW9uJ3MKKyAqIHJlc3BvbnNpYmlsaXR5LgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19kZXN0cm95IChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIC8qIFdlIG5lZWQgb25seSB0ZWxsIHRoZSBtZW1vcnkgbWFuYWdlciB0byByZWxlYXNlIGV2ZXJ5dGhpbmcuICovCisgIC8qIE5COiBtZW0gcG9pbnRlciBpcyBOVUxMIGlmIG1lbW9yeSBtZ3IgZmFpbGVkIHRvIGluaXRpYWxpemUuICovCisgIGlmIChjaW5mby0+bWVtICE9IE5VTEwpCisgICAgKCpjaW5mby0+bWVtLT5zZWxmX2Rlc3RydWN0KSAoY2luZm8pOworICBjaW5mby0+bWVtID0gTlVMTDsJCS8qIGJlIHNhZmUgaWYganBlZ19kZXN0cm95IGlzIGNhbGxlZCB0d2ljZSAqLworICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gMDsJLyogbWFyayBpdCBkZXN0cm95ZWQgKi8KK30KKworCisvKgorICogQ29udmVuaWVuY2Ugcm91dGluZXMgZm9yIGFsbG9jYXRpbmcgcXVhbnRpemF0aW9uIGFuZCBIdWZmbWFuIHRhYmxlcy4KKyAqIChXb3VsZCBqdXRpbHMuYyBiZSBhIG1vcmUgcmVhc29uYWJsZSBwbGFjZSB0byBwdXQgdGhlc2U/KQorICovCisKK0dMT0JBTChKUVVBTlRfVEJMICopCitqcGVnX2FsbG9jX3F1YW50X3RhYmxlIChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIEpRVUFOVF9UQkwgKnRibDsKKworICB0YmwgPSAoSlFVQU5UX1RCTCAqKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpIChjaW5mbywgSlBPT0xfUEVSTUFORU5ULCBTSVpFT0YoSlFVQU5UX1RCTCkpOworICB0YmwtPnNlbnRfdGFibGUgPSBGQUxTRTsJLyogbWFrZSBzdXJlIHRoaXMgaXMgZmFsc2UgaW4gYW55IG5ldyB0YWJsZSAqLworICByZXR1cm4gdGJsOworfQorCisKK0dMT0JBTChKSFVGRl9UQkwgKikKK2pwZWdfYWxsb2NfaHVmZl90YWJsZSAoal9jb21tb25fcHRyIGNpbmZvKQoreworICBKSFVGRl9UQkwgKnRibDsKKworICB0YmwgPSAoSkhVRkZfVEJMICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKGNpbmZvLCBKUE9PTF9QRVJNQU5FTlQsIFNJWkVPRihKSFVGRl9UQkwpKTsKKyAgdGJsLT5zZW50X3RhYmxlID0gRkFMU0U7CS8qIG1ha2Ugc3VyZSB0aGlzIGlzIGZhbHNlIGluIGFueSBuZXcgdGFibGUgKi8KKyAgcmV0dXJuIHRibDsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY3BhcmFtLmMgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamNwYXJhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYzQ4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamNwYXJhbS5jCkBAIC0wLDAgKzEsNjEwIEBACisvKgorICogamNwYXJhbS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgb3B0aW9uYWwgZGVmYXVsdC1zZXR0aW5nIGNvZGUgZm9yIHRoZSBKUEVHIGNvbXByZXNzb3IuCisgKiBBcHBsaWNhdGlvbnMgZG8gbm90IGhhdmUgdG8gdXNlIHRoaXMgZmlsZSwgYnV0IHRob3NlIHRoYXQgZG9uJ3QgdXNlIGl0CisgKiBtdXN0IGtub3cgYSBsb3QgbW9yZSBhYm91dCB0aGUgaW5uYXJkcyBvZiB0aGUgSlBFRyBjb2RlLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKgorICogUXVhbnRpemF0aW9uIHRhYmxlIHNldHVwIHJvdXRpbmVzCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2FkZF9xdWFudF90YWJsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB3aGljaF90YmwsCisJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqYmFzaWNfdGFibGUsCisJCSAgICAgIGludCBzY2FsZV9mYWN0b3IsIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpCisvKiBEZWZpbmUgYSBxdWFudGl6YXRpb24gdGFibGUgZXF1YWwgdG8gdGhlIGJhc2ljX3RhYmxlIHRpbWVzCisgKiBhIHNjYWxlIGZhY3RvciAoZ2l2ZW4gYXMgYSBwZXJjZW50YWdlKS4KKyAqIElmIGZvcmNlX2Jhc2VsaW5lIGlzIFRSVUUsIHRoZSBjb21wdXRlZCBxdWFudGl6YXRpb24gdGFibGUgZW50cmllcworICogYXJlIGxpbWl0ZWQgdG8gMS4uMjU1IGZvciBKUEVHIGJhc2VsaW5lIGNvbXBhdGliaWxpdHkuCisgKi8KK3sKKyAgSlFVQU5UX1RCTCAqKiBxdGJscHRyOworICBpbnQgaTsKKyAgbG9uZyB0ZW1wOworCisgIC8qIFNhZmV0eSBjaGVjayB0byBlbnN1cmUgc3RhcnRfY29tcHJlc3Mgbm90IGNhbGxlZCB5ZXQuICovCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TVEFSVCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworCisgIGlmICh3aGljaF90YmwgPCAwIHx8IHdoaWNoX3RibCA+PSBOVU1fUVVBTlRfVEJMUykKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9EUVRfSU5ERVgsIHdoaWNoX3RibCk7CisKKyAgcXRibHB0ciA9ICYgY2luZm8tPnF1YW50X3RibF9wdHJzW3doaWNoX3RibF07CisKKyAgaWYgKCpxdGJscHRyID09IE5VTEwpCisgICAgKnF0YmxwdHIgPSBqcGVnX2FsbG9jX3F1YW50X3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKworICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgeworICAgIHRlbXAgPSAoKGxvbmcpIGJhc2ljX3RhYmxlW2ldICogc2NhbGVfZmFjdG9yICsgNTBMKSAvIDEwMEw7CisgICAgLyogbGltaXQgdGhlIHZhbHVlcyB0byB0aGUgdmFsaWQgcmFuZ2UgKi8KKyAgICBpZiAodGVtcCA8PSAwTCkgdGVtcCA9IDFMOworICAgIGlmICh0ZW1wID4gMzI3NjdMKSB0ZW1wID0gMzI3NjdMOyAvKiBtYXggcXVhbnRpemVyIG5lZWRlZCBmb3IgMTIgYml0cyAqLworICAgIGlmIChmb3JjZV9iYXNlbGluZSAmJiB0ZW1wID4gMjU1TCkKKyAgICAgIHRlbXAgPSAyNTVMOwkJLyogbGltaXQgdG8gYmFzZWxpbmUgcmFuZ2UgaWYgcmVxdWVzdGVkICovCisgICAgKCpxdGJscHRyKS0+cXVhbnR2YWxbaV0gPSAoVUlOVDE2KSB0ZW1wOworICB9CisKKyAgLyogSW5pdGlhbGl6ZSBzZW50X3RhYmxlIEZBTFNFIHNvIHRhYmxlIHdpbGwgYmUgd3JpdHRlbiB0byBKUEVHIGZpbGUuICovCisgICgqcXRibHB0ciktPnNlbnRfdGFibGUgPSBGQUxTRTsKK30KKworCitHTE9CQUwodm9pZCkKK2pwZWdfc2V0X2xpbmVhcl9xdWFsaXR5IChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHNjYWxlX2ZhY3RvciwKKwkJCSBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQorLyogU2V0IG9yIGNoYW5nZSB0aGUgJ3F1YWxpdHknIChxdWFudGl6YXRpb24pIHNldHRpbmcsIHVzaW5nIGRlZmF1bHQgdGFibGVzCisgKiBhbmQgYSBzdHJhaWdodCBwZXJjZW50YWdlLXNjYWxpbmcgcXVhbGl0eSBzY2FsZS4gIEluIG1vc3QgY2FzZXMgaXQncyBiZXR0ZXIKKyAqIHRvIHVzZSBqcGVnX3NldF9xdWFsaXR5IChiZWxvdyk7IHRoaXMgZW50cnkgcG9pbnQgaXMgcHJvdmlkZWQgZm9yCisgKiBhcHBsaWNhdGlvbnMgdGhhdCBpbnNpc3Qgb24gYSBsaW5lYXIgcGVyY2VudGFnZSBzY2FsaW5nLgorICovCit7CisgIC8qIFRoZXNlIGFyZSB0aGUgc2FtcGxlIHF1YW50aXphdGlvbiB0YWJsZXMgZ2l2ZW4gaW4gSlBFRyBzcGVjIHNlY3Rpb24gSy4xLgorICAgKiBUaGUgc3BlYyBzYXlzIHRoYXQgdGhlIHZhbHVlcyBnaXZlbiBwcm9kdWNlICJnb29kIiBxdWFsaXR5LCBhbmQKKyAgICogd2hlbiBkaXZpZGVkIGJ5IDIsICJ2ZXJ5IGdvb2QiIHF1YWxpdHkuCisgICAqLworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHN0ZF9sdW1pbmFuY2VfcXVhbnRfdGJsW0RDVFNJWkUyXSA9IHsKKyAgICAxNiwgIDExLCAgMTAsICAxNiwgIDI0LCAgNDAsICA1MSwgIDYxLAorICAgIDEyLCAgMTIsICAxNCwgIDE5LCAgMjYsICA1OCwgIDYwLCAgNTUsCisgICAgMTQsICAxMywgIDE2LCAgMjQsICA0MCwgIDU3LCAgNjksICA1NiwKKyAgICAxNCwgIDE3LCAgMjIsICAyOSwgIDUxLCAgODcsICA4MCwgIDYyLAorICAgIDE4LCAgMjIsICAzNywgIDU2LCAgNjgsIDEwOSwgMTAzLCAgNzcsCisgICAgMjQsICAzNSwgIDU1LCAgNjQsICA4MSwgMTA0LCAxMTMsICA5MiwKKyAgICA0OSwgIDY0LCAgNzgsICA4NywgMTAzLCAxMjEsIDEyMCwgMTAxLAorICAgIDcyLCAgOTIsICA5NSwgIDk4LCAxMTIsIDEwMCwgMTAzLCAgOTkKKyAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzdGRfY2hyb21pbmFuY2VfcXVhbnRfdGJsW0RDVFNJWkUyXSA9IHsKKyAgICAxNywgIDE4LCAgMjQsICA0NywgIDk5LCAgOTksICA5OSwgIDk5LAorICAgIDE4LCAgMjEsICAyNiwgIDY2LCAgOTksICA5OSwgIDk5LCAgOTksCisgICAgMjQsICAyNiwgIDU2LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKKyAgICA0NywgIDY2LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAorICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCisgICAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKKyAgICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAorICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTkKKyAgfTsKKworICAvKiBTZXQgdXAgdHdvIHF1YW50aXphdGlvbiB0YWJsZXMgdXNpbmcgdGhlIHNwZWNpZmllZCBzY2FsaW5nICovCisgIGpwZWdfYWRkX3F1YW50X3RhYmxlKGNpbmZvLCAwLCBzdGRfbHVtaW5hbmNlX3F1YW50X3RibCwKKwkJICAgICAgIHNjYWxlX2ZhY3RvciwgZm9yY2VfYmFzZWxpbmUpOworICBqcGVnX2FkZF9xdWFudF90YWJsZShjaW5mbywgMSwgc3RkX2Nocm9taW5hbmNlX3F1YW50X3RibCwKKwkJICAgICAgIHNjYWxlX2ZhY3RvciwgZm9yY2VfYmFzZWxpbmUpOworfQorCisKK0dMT0JBTChpbnQpCitqcGVnX3F1YWxpdHlfc2NhbGluZyAoaW50IHF1YWxpdHkpCisvKiBDb252ZXJ0IGEgdXNlci1zcGVjaWZpZWQgcXVhbGl0eSByYXRpbmcgdG8gYSBwZXJjZW50YWdlIHNjYWxpbmcgZmFjdG9yCisgKiBmb3IgYW4gdW5kZXJseWluZyBxdWFudGl6YXRpb24gdGFibGUsIHVzaW5nIG91ciByZWNvbW1lbmRlZCBzY2FsaW5nIGN1cnZlLgorICogVGhlIGlucHV0ICdxdWFsaXR5JyBmYWN0b3Igc2hvdWxkIGJlIDAgKHRlcnJpYmxlKSB0byAxMDAgKHZlcnkgZ29vZCkuCisgKi8KK3sKKyAgLyogU2FmZXR5IGxpbWl0IG9uIHF1YWxpdHkgZmFjdG9yLiAgQ29udmVydCAwIHRvIDEgdG8gYXZvaWQgemVybyBkaXZpZGUuICovCisgIGlmIChxdWFsaXR5IDw9IDApIHF1YWxpdHkgPSAxOworICBpZiAocXVhbGl0eSA+IDEwMCkgcXVhbGl0eSA9IDEwMDsKKworICAvKiBUaGUgYmFzaWMgdGFibGUgaXMgdXNlZCBhcy1pcyAoc2NhbGluZyAxMDApIGZvciBhIHF1YWxpdHkgb2YgNTAuCisgICAqIFF1YWxpdGllcyA1MC4uMTAwIGFyZSBjb252ZXJ0ZWQgdG8gc2NhbGluZyBwZXJjZW50YWdlIDIwMCAtIDIqUTsKKyAgICogbm90ZSB0aGF0IGF0IFE9MTAwIHRoZSBzY2FsaW5nIGlzIDAsIHdoaWNoIHdpbGwgY2F1c2UganBlZ19hZGRfcXVhbnRfdGFibGUKKyAgICogdG8gbWFrZSBhbGwgdGhlIHRhYmxlIGVudHJpZXMgMSAoaGVuY2UsIG1pbmltdW0gcXVhbnRpemF0aW9uIGxvc3MpLgorICAgKiBRdWFsaXRpZXMgMS4uNTAgYXJlIGNvbnZlcnRlZCB0byBzY2FsaW5nIHBlcmNlbnRhZ2UgNTAwMC9RLgorICAgKi8KKyAgaWYgKHF1YWxpdHkgPCA1MCkKKyAgICBxdWFsaXR5ID0gNTAwMCAvIHF1YWxpdHk7CisgIGVsc2UKKyAgICBxdWFsaXR5ID0gMjAwIC0gcXVhbGl0eSoyOworCisgIHJldHVybiBxdWFsaXR5OworfQorCisKK0dMT0JBTCh2b2lkKQoranBlZ19zZXRfcXVhbGl0eSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBxdWFsaXR5LCBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQorLyogU2V0IG9yIGNoYW5nZSB0aGUgJ3F1YWxpdHknIChxdWFudGl6YXRpb24pIHNldHRpbmcsIHVzaW5nIGRlZmF1bHQgdGFibGVzLgorICogVGhpcyBpcyB0aGUgc3RhbmRhcmQgcXVhbGl0eS1hZGp1c3RpbmcgZW50cnkgcG9pbnQgZm9yIHR5cGljYWwgdXNlcgorICogaW50ZXJmYWNlczsgb25seSB0aG9zZSB3aG8gd2FudCBkZXRhaWxlZCBjb250cm9sIG92ZXIgcXVhbnRpemF0aW9uIHRhYmxlcworICogd291bGQgdXNlIHRoZSBwcmVjZWRpbmcgdGhyZWUgcm91dGluZXMgZGlyZWN0bHkuCisgKi8KK3sKKyAgLyogQ29udmVydCB1c2VyIDAtMTAwIHJhdGluZyB0byBwZXJjZW50YWdlIHNjYWxpbmcgKi8KKyAgcXVhbGl0eSA9IGpwZWdfcXVhbGl0eV9zY2FsaW5nKHF1YWxpdHkpOworCisgIC8qIFNldCB1cCBzdGFuZGFyZCBxdWFsaXR5IHRhYmxlcyAqLworICBqcGVnX3NldF9saW5lYXJfcXVhbGl0eShjaW5mbywgcXVhbGl0eSwgZm9yY2VfYmFzZWxpbmUpOworfQorCisKKy8qCisgKiBIdWZmbWFuIHRhYmxlIHNldHVwIHJvdXRpbmVzCisgKi8KKworTE9DQUwodm9pZCkKK2FkZF9odWZmX3RhYmxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJSkhVRkZfVEJMICoqaHRibHB0ciwgY29uc3QgVUlOVDggKmJpdHMsIGNvbnN0IFVJTlQ4ICp2YWwpCisvKiBEZWZpbmUgYSBIdWZmbWFuIHRhYmxlICovCit7CisgIGludCBuc3ltYm9scywgbGVuOworCisgIGlmICgqaHRibHB0ciA9PSBOVUxMKQorICAgICpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKworICAvKiBDb3B5IHRoZSBudW1iZXItb2Ytc3ltYm9scy1vZi1lYWNoLWNvZGUtbGVuZ3RoIGNvdW50cyAqLworICBNRU1DT1BZKCgqaHRibHB0ciktPmJpdHMsIGJpdHMsIFNJWkVPRigoKmh0YmxwdHIpLT5iaXRzKSk7CisKKyAgLyogVmFsaWRhdGUgdGhlIGNvdW50cy4gIFdlIGRvIHRoaXMgaGVyZSBtYWlubHkgc28gd2UgY2FuIGNvcHkgdGhlIHJpZ2h0CisgICAqIG51bWJlciBvZiBzeW1ib2xzIGZyb20gdGhlIHZhbFtdIGFycmF5LCB3aXRob3V0IHJpc2tpbmcgbWFyY2hpbmcgb2ZmCisgICAqIHRoZSBlbmQgb2YgbWVtb3J5LiAgamNodWZmLmMgd2lsbCBkbyBhIG1vcmUgdGhvcm91Z2ggdGVzdCBsYXRlci4KKyAgICovCisgIG5zeW1ib2xzID0gMDsKKyAgZm9yIChsZW4gPSAxOyBsZW4gPD0gMTY7IGxlbisrKQorICAgIG5zeW1ib2xzICs9IGJpdHNbbGVuXTsKKyAgaWYgKG5zeW1ib2xzIDwgMSB8fCBuc3ltYm9scyA+IDI1NikKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKKworICBNRU1DT1BZKCgqaHRibHB0ciktPmh1ZmZ2YWwsIHZhbCwgbnN5bWJvbHMgKiBTSVpFT0YoVUlOVDgpKTsKKworICAvKiBJbml0aWFsaXplIHNlbnRfdGFibGUgRkFMU0Ugc28gdGFibGUgd2lsbCBiZSB3cml0dGVuIHRvIEpQRUcgZmlsZS4gKi8KKyAgKCpodGJscHRyKS0+c2VudF90YWJsZSA9IEZBTFNFOworfQorCisKK0xPQ0FMKHZvaWQpCitzdGRfaHVmZl90YWJsZXMgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogU2V0IHVwIHRoZSBzdGFuZGFyZCBIdWZmbWFuIHRhYmxlcyAoY2YuIEpQRUcgc3RhbmRhcmQgc2VjdGlvbiBLLjMpICovCisvKiBJTVBPUlRBTlQ6IHRoZXNlIGFyZSBvbmx5IHZhbGlkIGZvciA4LWJpdCBkYXRhIHByZWNpc2lvbiEgKi8KK3sKKyAgc3RhdGljIGNvbnN0IFVJTlQ4IGJpdHNfZGNfbHVtaW5hbmNlWzE3XSA9CisgICAgeyAvKiAwLWJhc2UgKi8gMCwgMCwgMSwgNSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworICBzdGF0aWMgY29uc3QgVUlOVDggdmFsX2RjX2x1bWluYW5jZVtdID0KKyAgICB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSB9OworICAKKyAgc3RhdGljIGNvbnN0IFVJTlQ4IGJpdHNfZGNfY2hyb21pbmFuY2VbMTddID0KKyAgICB7IC8qIDAtYmFzZSAqLyAwLCAwLCAzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwIH07CisgIHN0YXRpYyBjb25zdCBVSU5UOCB2YWxfZGNfY2hyb21pbmFuY2VbXSA9CisgICAgeyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEgfTsKKyAgCisgIHN0YXRpYyBjb25zdCBVSU5UOCBiaXRzX2FjX2x1bWluYW5jZVsxN10gPQorICAgIHsgLyogMC1iYXNlICovIDAsIDAsIDIsIDEsIDMsIDMsIDIsIDQsIDMsIDUsIDUsIDQsIDQsIDAsIDAsIDEsIDB4N2QgfTsKKyAgc3RhdGljIGNvbnN0IFVJTlQ4IHZhbF9hY19sdW1pbmFuY2VbXSA9CisgICAgeyAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDA0LCAweDExLCAweDA1LCAweDEyLAorICAgICAgMHgyMSwgMHgzMSwgMHg0MSwgMHgwNiwgMHgxMywgMHg1MSwgMHg2MSwgMHgwNywKKyAgICAgIDB4MjIsIDB4NzEsIDB4MTQsIDB4MzIsIDB4ODEsIDB4OTEsIDB4YTEsIDB4MDgsCisgICAgICAweDIzLCAweDQyLCAweGIxLCAweGMxLCAweDE1LCAweDUyLCAweGQxLCAweGYwLAorICAgICAgMHgyNCwgMHgzMywgMHg2MiwgMHg3MiwgMHg4MiwgMHgwOSwgMHgwYSwgMHgxNiwKKyAgICAgIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsCisgICAgICAweDI5LCAweDJhLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LAorICAgICAgMHgzYSwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwKKyAgICAgIDB4NGEsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTksCisgICAgICAweDVhLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LAorICAgICAgMHg2YSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwKKyAgICAgIDB4N2EsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsIDB4ODksCisgICAgICAweDhhLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LAorICAgICAgMHg5OSwgMHg5YSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywKKyAgICAgIDB4YTgsIDB4YTksIDB4YWEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsCisgICAgICAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LAorICAgICAgMHhjNiwgMHhjNywgMHhjOCwgMHhjOSwgMHhjYSwgMHhkMiwgMHhkMywgMHhkNCwKKyAgICAgIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZTEsIDB4ZTIsCisgICAgICAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLAorICAgICAgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwKKyAgICAgIDB4ZjksIDB4ZmEgfTsKKyAgCisgIHN0YXRpYyBjb25zdCBVSU5UOCBiaXRzX2FjX2Nocm9taW5hbmNlWzE3XSA9CisgICAgeyAvKiAwLWJhc2UgKi8gMCwgMCwgMiwgMSwgMiwgNCwgNCwgMywgNCwgNywgNSwgNCwgNCwgMCwgMSwgMiwgMHg3NyB9OworICBzdGF0aWMgY29uc3QgVUlOVDggdmFsX2FjX2Nocm9taW5hbmNlW10gPQorICAgIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgxMSwgMHgwNCwgMHgwNSwgMHgyMSwKKyAgICAgIDB4MzEsIDB4MDYsIDB4MTIsIDB4NDEsIDB4NTEsIDB4MDcsIDB4NjEsIDB4NzEsCisgICAgICAweDEzLCAweDIyLCAweDMyLCAweDgxLCAweDA4LCAweDE0LCAweDQyLCAweDkxLAorICAgICAgMHhhMSwgMHhiMSwgMHhjMSwgMHgwOSwgMHgyMywgMHgzMywgMHg1MiwgMHhmMCwKKyAgICAgIDB4MTUsIDB4NjIsIDB4NzIsIDB4ZDEsIDB4MGEsIDB4MTYsIDB4MjQsIDB4MzQsCisgICAgICAweGUxLCAweDI1LCAweGYxLCAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDI2LAorICAgICAgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwKKyAgICAgIDB4MzksIDB4M2EsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsCisgICAgICAweDQ5LCAweDRhLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LAorICAgICAgMHg1OSwgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwKKyAgICAgIDB4NjksIDB4NmEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsCisgICAgICAweDc5LCAweDdhLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LAorICAgICAgMHg4OCwgMHg4OSwgMHg4YSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwKKyAgICAgIDB4OTcsIDB4OTgsIDB4OTksIDB4OWEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsCisgICAgICAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LAorICAgICAgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywKKyAgICAgIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksIDB4Y2EsIDB4ZDIsCisgICAgICAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLAorICAgICAgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwKKyAgICAgIDB4ZWEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsCisgICAgICAweGY5LCAweGZhIH07CisgIAorICBhZGRfaHVmZl90YWJsZShjaW5mbywgJmNpbmZvLT5kY19odWZmX3RibF9wdHJzWzBdLAorCQkgYml0c19kY19sdW1pbmFuY2UsIHZhbF9kY19sdW1pbmFuY2UpOworICBhZGRfaHVmZl90YWJsZShjaW5mbywgJmNpbmZvLT5hY19odWZmX3RibF9wdHJzWzBdLAorCQkgYml0c19hY19sdW1pbmFuY2UsIHZhbF9hY19sdW1pbmFuY2UpOworICBhZGRfaHVmZl90YWJsZShjaW5mbywgJmNpbmZvLT5kY19odWZmX3RibF9wdHJzWzFdLAorCQkgYml0c19kY19jaHJvbWluYW5jZSwgdmFsX2RjX2Nocm9taW5hbmNlKTsKKyAgYWRkX2h1ZmZfdGFibGUoY2luZm8sICZjaW5mby0+YWNfaHVmZl90YmxfcHRyc1sxXSwKKwkJIGJpdHNfYWNfY2hyb21pbmFuY2UsIHZhbF9hY19jaHJvbWluYW5jZSk7Cit9CisKKworLyoKKyAqIERlZmF1bHQgcGFyYW1ldGVyIHNldHVwIGZvciBjb21wcmVzc2lvbi4KKyAqCisgKiBBcHBsaWNhdGlvbnMgdGhhdCBkb24ndCBjaG9vc2UgdG8gdXNlIHRoaXMgcm91dGluZSBtdXN0IGRvIHRoZWlyCisgKiBvd24gc2V0dXAgb2YgYWxsIHRoZXNlIHBhcmFtZXRlcnMuICBBbHRlcm5hdGVseSwgeW91IGNhbiBjYWxsIHRoaXMKKyAqIHRvIGVzdGFibGlzaCBkZWZhdWx0cyBhbmQgdGhlbiBhbHRlciBwYXJhbWV0ZXJzIHNlbGVjdGl2ZWx5LiAgVGhpcworICogaXMgdGhlIHJlY29tbWVuZGVkIGFwcHJvYWNoIHNpbmNlLCBpZiB3ZSBhZGQgYW55IG5ldyBwYXJhbWV0ZXJzLAorICogeW91ciBjb2RlIHdpbGwgc3RpbGwgd29yayAodGhleSdsbCBiZSBzZXQgdG8gcmVhc29uYWJsZSBkZWZhdWx0cykuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3NldF9kZWZhdWx0cyAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIGludCBpOworCisgIC8qIFNhZmV0eSBjaGVjayB0byBlbnN1cmUgc3RhcnRfY29tcHJlc3Mgbm90IGNhbGxlZCB5ZXQuICovCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TVEFSVCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworCisgIC8qIEFsbG9jYXRlIGNvbXBfaW5mbyBhcnJheSBsYXJnZSBlbm91Z2ggZm9yIG1heGltdW0gY29tcG9uZW50IGNvdW50LgorICAgKiBBcnJheSBpcyBtYWRlIHBlcm1hbmVudCBpbiBjYXNlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIGNvbXByZXNzCisgICAqIG11bHRpcGxlIGltYWdlcyBhdCBzYW1lIHBhcmFtIHNldHRpbmdzLgorICAgKi8KKyAgaWYgKGNpbmZvLT5jb21wX2luZm8gPT0gTlVMTCkKKyAgICBjaW5mby0+Y29tcF9pbmZvID0gKGpwZWdfY29tcG9uZW50X2luZm8gKikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfUEVSTUFORU5ULAorCQkJCSAgTUFYX0NPTVBPTkVOVFMgKiBTSVpFT0YoanBlZ19jb21wb25lbnRfaW5mbykpOworCisgIC8qIEluaXRpYWxpemUgZXZlcnl0aGluZyBub3QgZGVwZW5kZW50IG9uIHRoZSBjb2xvciBzcGFjZSAqLworCisgIGNpbmZvLT5kYXRhX3ByZWNpc2lvbiA9IEJJVFNfSU5fSlNBTVBMRTsKKyAgLyogU2V0IHVwIHR3byBxdWFudGl6YXRpb24gdGFibGVzIHVzaW5nIGRlZmF1bHQgcXVhbGl0eSBvZiA3NSAqLworICBqcGVnX3NldF9xdWFsaXR5KGNpbmZvLCA3NSwgVFJVRSk7CisgIC8qIFNldCB1cCB0d28gSHVmZm1hbiB0YWJsZXMgKi8KKyAgc3RkX2h1ZmZfdGFibGVzKGNpbmZvKTsKKworICAvKiBJbml0aWFsaXplIGRlZmF1bHQgYXJpdGhtZXRpYyBjb2RpbmcgY29uZGl0aW9uaW5nICovCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fQVJJVEhfVEJMUzsgaSsrKSB7CisgICAgY2luZm8tPmFyaXRoX2RjX0xbaV0gPSAwOworICAgIGNpbmZvLT5hcml0aF9kY19VW2ldID0gMTsKKyAgICBjaW5mby0+YXJpdGhfYWNfS1tpXSA9IDU7CisgIH0KKworICAvKiBEZWZhdWx0IGlzIG5vIG11bHRpcGxlLXNjYW4gb3V0cHV0ICovCisgIGNpbmZvLT5zY2FuX2luZm8gPSBOVUxMOworICBjaW5mby0+bnVtX3NjYW5zID0gMDsKKworICAvKiBFeHBlY3Qgbm9ybWFsIHNvdXJjZSBpbWFnZSwgbm90IHJhdyBkb3duc2FtcGxlZCBkYXRhICovCisgIGNpbmZvLT5yYXdfZGF0YV9pbiA9IEZBTFNFOworCisgIC8qIFVzZSBIdWZmbWFuIGNvZGluZywgbm90IGFyaXRobWV0aWMgY29kaW5nLCBieSBkZWZhdWx0ICovCisgIGNpbmZvLT5hcml0aF9jb2RlID0gRkFMU0U7CisKKyAgLyogQnkgZGVmYXVsdCwgZG9uJ3QgZG8gZXh0cmEgcGFzc2VzIHRvIG9wdGltaXplIGVudHJvcHkgY29kaW5nICovCisgIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcgPSBGQUxTRTsKKyAgLyogVGhlIHN0YW5kYXJkIEh1ZmZtYW4gdGFibGVzIGFyZSBvbmx5IHZhbGlkIGZvciA4LWJpdCBkYXRhIHByZWNpc2lvbi4KKyAgICogSWYgdGhlIHByZWNpc2lvbiBpcyBoaWdoZXIsIGZvcmNlIG9wdGltaXphdGlvbiBvbiBzbyB0aGF0IHVzYWJsZQorICAgKiB0YWJsZXMgd2lsbCBiZSBjb21wdXRlZC4gIFRoaXMgdGVzdCBjYW4gYmUgcmVtb3ZlZCBpZiBkZWZhdWx0IHRhYmxlcworICAgKiBhcmUgc3VwcGxpZWQgdGhhdCBhcmUgdmFsaWQgZm9yIHRoZSBkZXNpcmVkIHByZWNpc2lvbi4KKyAgICovCisgIGlmIChjaW5mby0+ZGF0YV9wcmVjaXNpb24gPiA4KQorICAgIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcgPSBUUlVFOworCisgIC8qIEJ5IGRlZmF1bHQsIHVzZSB0aGUgc2ltcGxlciBub24tY29zaXRlZCBzYW1wbGluZyBhbGlnbm1lbnQgKi8KKyAgY2luZm8tPkNDSVI2MDFfc2FtcGxpbmcgPSBGQUxTRTsKKworICAvKiBObyBpbnB1dCBzbW9vdGhpbmcgKi8KKyAgY2luZm8tPnNtb290aGluZ19mYWN0b3IgPSAwOworCisgIC8qIERDVCBhbGdvcml0aG0gcHJlZmVyZW5jZSAqLworICBjaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfREVGQVVMVDsKKworICAvKiBObyByZXN0YXJ0IG1hcmtlcnMgKi8KKyAgY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwgPSAwOworICBjaW5mby0+cmVzdGFydF9pbl9yb3dzID0gMDsKKworICAvKiBGaWxsIGluIGRlZmF1bHQgSkZJRiBtYXJrZXIgcGFyYW1ldGVycy4gIE5vdGUgdGhhdCB3aGV0aGVyIHRoZSBtYXJrZXIKKyAgICogd2lsbCBhY3R1YWxseSBiZSB3cml0dGVuIGlzIGRldGVybWluZWQgYnkganBlZ19zZXRfY29sb3JzcGFjZS4KKyAgICoKKyAgICogQnkgZGVmYXVsdCwgdGhlIGxpYnJhcnkgZW1pdHMgSkZJRiB2ZXJzaW9uIGNvZGUgMS4wMS4KKyAgICogQW4gYXBwbGljYXRpb24gdGhhdCB3YW50cyB0byBlbWl0IEpGSUYgMS4wMiBleHRlbnNpb24gbWFya2VycyBzaG91bGQgc2V0CisgICAqIEpGSUZfbWlub3JfdmVyc2lvbiB0byAyLiAgV2UgY291bGQgcHJvYmFibHkgZ2V0IGF3YXkgd2l0aCBqdXN0IGRlZmF1bHRpbmcKKyAgICogdG8gMS4wMiwgYnV0IHRoZXJlIG1heSBzdGlsbCBiZSBzb21lIGRlY29kZXJzIGluIHVzZSB0aGF0IHdpbGwgY29tcGxhaW4KKyAgICogYWJvdXQgdGhhdDsgc2F5aW5nIDEuMDEgc2hvdWxkIG1pbmltaXplIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMuCisgICAqLworICBjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uID0gMTsgLyogRGVmYXVsdCBKRklGIHZlcnNpb24gPSAxLjAxICovCisgIGNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24gPSAxOworICBjaW5mby0+ZGVuc2l0eV91bml0ID0gMDsJLyogUGl4ZWwgc2l6ZSBpcyB1bmtub3duIGJ5IGRlZmF1bHQgKi8KKyAgY2luZm8tPlhfZGVuc2l0eSA9IDE7CQkvKiBQaXhlbCBhc3BlY3QgcmF0aW8gaXMgc3F1YXJlIGJ5IGRlZmF1bHQgKi8KKyAgY2luZm8tPllfZGVuc2l0eSA9IDE7CisKKyAgLyogQ2hvb3NlIEpQRUcgY29sb3JzcGFjZSBiYXNlZCBvbiBpbnB1dCBzcGFjZSwgc2V0IGRlZmF1bHRzIGFjY29yZGluZ2x5ICovCisKKyAganBlZ19kZWZhdWx0X2NvbG9yc3BhY2UoY2luZm8pOworfQorCisKKy8qCisgKiBTZWxlY3QgYW4gYXBwcm9wcmlhdGUgSlBFRyBjb2xvcnNwYWNlIGZvciBpbl9jb2xvcl9zcGFjZS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZGVmYXVsdF9jb2xvcnNwYWNlIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgc3dpdGNoIChjaW5mby0+aW5fY29sb3Jfc3BhY2UpIHsKKyAgY2FzZSBKQ1NfR1JBWVNDQUxFOgorICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoY2luZm8sIEpDU19HUkFZU0NBTEUpOworICAgIGJyZWFrOworICBjYXNlIEpDU19SR0I6CisgICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX1lDYkNyKTsKKyAgICBicmVhazsKKyAgY2FzZSBKQ1NfWUNiQ3I6CisgICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX1lDYkNyKTsKKyAgICBicmVhazsKKyAgY2FzZSBKQ1NfQ01ZSzoKKyAgICBqcGVnX3NldF9jb2xvcnNwYWNlKGNpbmZvLCBKQ1NfQ01ZSyk7IC8qIEJ5IGRlZmF1bHQsIG5vIHRyYW5zbGF0aW9uICovCisgICAgYnJlYWs7CisgIGNhc2UgSkNTX1lDQ0s6CisgICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX1lDQ0spOworICAgIGJyZWFrOworICBjYXNlIEpDU19VTktOT1dOOgorICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoY2luZm8sIEpDU19VTktOT1dOKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9JTl9DT0xPUlNQQUNFKTsKKyAgfQorfQorCisKKy8qCisgKiBTZXQgdGhlIEpQRUcgY29sb3JzcGFjZSwgYW5kIGNob29zZSBjb2xvcnNwYWNlLWRlcGVuZGVudCBkZWZhdWx0IHZhbHVlcy4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfc2V0X2NvbG9yc3BhY2UgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0NPTE9SX1NQQUNFIGNvbG9yc3BhY2UpCit7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworICBpbnQgY2k7CisKKyNkZWZpbmUgU0VUX0NPTVAoaW5kZXgsaWQsaHNhbXAsdnNhbXAscXVhbnQsZGN0YmwsYWN0YmwpICBcCisgIChjb21wcHRyID0gJmNpbmZvLT5jb21wX2luZm9baW5kZXhdLCBcCisgICBjb21wcHRyLT5jb21wb25lbnRfaWQgPSAoaWQpLCBcCisgICBjb21wcHRyLT5oX3NhbXBfZmFjdG9yID0gKGhzYW1wKSwgXAorICAgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciA9ICh2c2FtcCksIFwKKyAgIGNvbXBwdHItPnF1YW50X3RibF9ubyA9IChxdWFudCksIFwKKyAgIGNvbXBwdHItPmRjX3RibF9ubyA9IChkY3RibCksIFwKKyAgIGNvbXBwdHItPmFjX3RibF9ubyA9IChhY3RibCkgKQorCisgIC8qIFNhZmV0eSBjaGVjayB0byBlbnN1cmUgc3RhcnRfY29tcHJlc3Mgbm90IGNhbGxlZCB5ZXQuICovCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TVEFSVCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworCisgIC8qIEZvciBhbGwgY29sb3JzcGFjZXMsIHdlIHVzZSBRIGFuZCBIdWZmIHRhYmxlcyAwIGZvciBsdW1pbmFuY2UgY29tcG9uZW50cywKKyAgICogdGFibGVzIDEgZm9yIGNocm9taW5hbmNlIGNvbXBvbmVudHMuCisgICAqLworCisgIGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gY29sb3JzcGFjZTsKKworICBjaW5mby0+d3JpdGVfSkZJRl9oZWFkZXIgPSBGQUxTRTsgLyogTm8gbWFya2VyIGZvciBub24tSkZJRiBjb2xvcnNwYWNlcyAqLworICBjaW5mby0+d3JpdGVfQWRvYmVfbWFya2VyID0gRkFMU0U7IC8qIHdyaXRlIG5vIEFkb2JlIG1hcmtlciBieSBkZWZhdWx0ICovCisKKyAgc3dpdGNoIChjb2xvcnNwYWNlKSB7CisgIGNhc2UgSkNTX0dSQVlTQ0FMRToKKyAgICBjaW5mby0+d3JpdGVfSkZJRl9oZWFkZXIgPSBUUlVFOyAvKiBXcml0ZSBhIEpGSUYgbWFya2VyICovCisgICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gMTsKKyAgICAvKiBKRklGIHNwZWNpZmllcyBjb21wb25lbnQgSUQgMSAqLworICAgIFNFVF9DT01QKDAsIDEsIDEsMSwgMCwgMCwwKTsKKyAgICBicmVhazsKKyAgY2FzZSBKQ1NfUkdCOgorICAgIGNpbmZvLT53cml0ZV9BZG9iZV9tYXJrZXIgPSBUUlVFOyAvKiB3cml0ZSBBZG9iZSBtYXJrZXIgdG8gZmxhZyBSR0IgKi8KKyAgICBjaW5mby0+bnVtX2NvbXBvbmVudHMgPSAzOworICAgIFNFVF9DT01QKDAsIDB4NTIgLyogJ1InICovLCAxLDEsIDAsIDAsMCk7CisgICAgU0VUX0NPTVAoMSwgMHg0NyAvKiAnRycgKi8sIDEsMSwgMCwgMCwwKTsKKyAgICBTRVRfQ09NUCgyLCAweDQyIC8qICdCJyAqLywgMSwxLCAwLCAwLDApOworICAgIGJyZWFrOworICBjYXNlIEpDU19ZQ2JDcjoKKyAgICBjaW5mby0+d3JpdGVfSkZJRl9oZWFkZXIgPSBUUlVFOyAvKiBXcml0ZSBhIEpGSUYgbWFya2VyICovCisgICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gMzsKKyAgICAvKiBKRklGIHNwZWNpZmllcyBjb21wb25lbnQgSURzIDEsMiwzICovCisgICAgLyogV2UgZGVmYXVsdCB0byAyeDIgc3Vic2FtcGxlcyBvZiBjaHJvbWluYW5jZSAqLworICAgIFNFVF9DT01QKDAsIDEsIDIsMiwgMCwgMCwwKTsKKyAgICBTRVRfQ09NUCgxLCAyLCAxLDEsIDEsIDEsMSk7CisgICAgU0VUX0NPTVAoMiwgMywgMSwxLCAxLCAxLDEpOworICAgIGJyZWFrOworICBjYXNlIEpDU19DTVlLOgorICAgIGNpbmZvLT53cml0ZV9BZG9iZV9tYXJrZXIgPSBUUlVFOyAvKiB3cml0ZSBBZG9iZSBtYXJrZXIgdG8gZmxhZyBDTVlLICovCisgICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gNDsKKyAgICBTRVRfQ09NUCgwLCAweDQzIC8qICdDJyAqLywgMSwxLCAwLCAwLDApOworICAgIFNFVF9DT01QKDEsIDB4NEQgLyogJ00nICovLCAxLDEsIDAsIDAsMCk7CisgICAgU0VUX0NPTVAoMiwgMHg1OSAvKiAnWScgKi8sIDEsMSwgMCwgMCwwKTsKKyAgICBTRVRfQ09NUCgzLCAweDRCIC8qICdLJyAqLywgMSwxLCAwLCAwLDApOworICAgIGJyZWFrOworICBjYXNlIEpDU19ZQ0NLOgorICAgIGNpbmZvLT53cml0ZV9BZG9iZV9tYXJrZXIgPSBUUlVFOyAvKiB3cml0ZSBBZG9iZSBtYXJrZXIgdG8gZmxhZyBZQ0NLICovCisgICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gNDsKKyAgICBTRVRfQ09NUCgwLCAxLCAyLDIsIDAsIDAsMCk7CisgICAgU0VUX0NPTVAoMSwgMiwgMSwxLCAxLCAxLDEpOworICAgIFNFVF9DT01QKDIsIDMsIDEsMSwgMSwgMSwxKTsKKyAgICBTRVRfQ09NUCgzLCA0LCAyLDIsIDAsIDAsMCk7CisgICAgYnJlYWs7CisgIGNhc2UgSkNTX1VOS05PV046CisgICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gY2luZm8tPmlucHV0X2NvbXBvbmVudHM7CisgICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyA8IDEgfHwgY2luZm8tPm51bV9jb21wb25lbnRzID4gTUFYX0NPTVBPTkVOVFMpCisgICAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGNpbmZvLT5udW1fY29tcG9uZW50cywKKwkgICAgICAgTUFYX0NPTVBPTkVOVFMpOworICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworICAgICAgU0VUX0NPTVAoY2ksIGNpLCAxLDEsIDAsIDAsMCk7CisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7CisgIH0KK30KKworCisjaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKKworTE9DQUwoanBlZ19zY2FuX2luZm8gKikKK2ZpbGxfYV9zY2FuIChqcGVnX3NjYW5faW5mbyAqIHNjYW5wdHIsIGludCBjaSwKKwkgICAgIGludCBTcywgaW50IFNlLCBpbnQgQWgsIGludCBBbCkKKy8qIFN1cHBvcnQgcm91dGluZTogZ2VuZXJhdGUgb25lIHNjYW4gZm9yIHNwZWNpZmllZCBjb21wb25lbnQgKi8KK3sKKyAgc2NhbnB0ci0+Y29tcHNfaW5fc2NhbiA9IDE7CisgIHNjYW5wdHItPmNvbXBvbmVudF9pbmRleFswXSA9IGNpOworICBzY2FucHRyLT5TcyA9IFNzOworICBzY2FucHRyLT5TZSA9IFNlOworICBzY2FucHRyLT5BaCA9IEFoOworICBzY2FucHRyLT5BbCA9IEFsOworICBzY2FucHRyKys7CisgIHJldHVybiBzY2FucHRyOworfQorCitMT0NBTChqcGVnX3NjYW5faW5mbyAqKQorZmlsbF9zY2FucyAoanBlZ19zY2FuX2luZm8gKiBzY2FucHRyLCBpbnQgbmNvbXBzLAorCSAgICBpbnQgU3MsIGludCBTZSwgaW50IEFoLCBpbnQgQWwpCisvKiBTdXBwb3J0IHJvdXRpbmU6IGdlbmVyYXRlIG9uZSBzY2FuIGZvciBlYWNoIGNvbXBvbmVudCAqLworeworICBpbnQgY2k7CisKKyAgZm9yIChjaSA9IDA7IGNpIDwgbmNvbXBzOyBjaSsrKSB7CisgICAgc2NhbnB0ci0+Y29tcHNfaW5fc2NhbiA9IDE7CisgICAgc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4WzBdID0gY2k7CisgICAgc2NhbnB0ci0+U3MgPSBTczsKKyAgICBzY2FucHRyLT5TZSA9IFNlOworICAgIHNjYW5wdHItPkFoID0gQWg7CisgICAgc2NhbnB0ci0+QWwgPSBBbDsKKyAgICBzY2FucHRyKys7CisgIH0KKyAgcmV0dXJuIHNjYW5wdHI7Cit9CisKK0xPQ0FMKGpwZWdfc2Nhbl9pbmZvICopCitmaWxsX2RjX3NjYW5zIChqcGVnX3NjYW5faW5mbyAqIHNjYW5wdHIsIGludCBuY29tcHMsIGludCBBaCwgaW50IEFsKQorLyogU3VwcG9ydCByb3V0aW5lOiBnZW5lcmF0ZSBpbnRlcmxlYXZlZCBEQyBzY2FuIGlmIHBvc3NpYmxlLCBlbHNlIE4gc2NhbnMgKi8KK3sKKyAgaW50IGNpOworCisgIGlmIChuY29tcHMgPD0gTUFYX0NPTVBTX0lOX1NDQU4pIHsKKyAgICAvKiBTaW5nbGUgaW50ZXJsZWF2ZWQgREMgc2NhbiAqLworICAgIHNjYW5wdHItPmNvbXBzX2luX3NjYW4gPSBuY29tcHM7CisgICAgZm9yIChjaSA9IDA7IGNpIDwgbmNvbXBzOyBjaSsrKQorICAgICAgc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4W2NpXSA9IGNpOworICAgIHNjYW5wdHItPlNzID0gc2NhbnB0ci0+U2UgPSAwOworICAgIHNjYW5wdHItPkFoID0gQWg7CisgICAgc2NhbnB0ci0+QWwgPSBBbDsKKyAgICBzY2FucHRyKys7CisgIH0gZWxzZSB7CisgICAgLyogTm9uaW50ZXJsZWF2ZWQgREMgc2NhbiBmb3IgZWFjaCBjb21wb25lbnQgKi8KKyAgICBzY2FucHRyID0gZmlsbF9zY2FucyhzY2FucHRyLCBuY29tcHMsIDAsIDAsIEFoLCBBbCk7CisgIH0KKyAgcmV0dXJuIHNjYW5wdHI7Cit9CisKKworLyoKKyAqIENyZWF0ZSBhIHJlY29tbWVuZGVkIHByb2dyZXNzaXZlLUpQRUcgc2NyaXB0LgorICogY2luZm8tPm51bV9jb21wb25lbnRzIGFuZCBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSBtdXN0IGJlIGNvcnJlY3QuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbiAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIGludCBuY29tcHMgPSBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgIGludCBuc2NhbnM7CisgIGpwZWdfc2Nhbl9pbmZvICogc2NhbnB0cjsKKworICAvKiBTYWZldHkgY2hlY2sgdG8gZW5zdXJlIHN0YXJ0X2NvbXByZXNzIG5vdCBjYWxsZWQgeWV0LiAqLworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKworICAvKiBGaWd1cmUgc3BhY2UgbmVlZGVkIGZvciBzY3JpcHQuICBDYWxjdWxhdGlvbiBtdXN0IG1hdGNoIGNvZGUgYmVsb3chICovCisgIGlmIChuY29tcHMgPT0gMyAmJiBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpIHsKKyAgICAvKiBDdXN0b20gc2NyaXB0IGZvciBZQ2JDciBjb2xvciBpbWFnZXMuICovCisgICAgbnNjYW5zID0gMTA7CisgIH0gZWxzZSB7CisgICAgLyogQWxsLXB1cnBvc2Ugc2NyaXB0IGZvciBvdGhlciBjb2xvciBzcGFjZXMuICovCisgICAgaWYgKG5jb21wcyA+IE1BWF9DT01QU19JTl9TQ0FOKQorICAgICAgbnNjYW5zID0gNiAqIG5jb21wczsJLyogMiBEQyArIDQgQUMgc2NhbnMgcGVyIGNvbXBvbmVudCAqLworICAgIGVsc2UKKyAgICAgIG5zY2FucyA9IDIgKyA0ICogbmNvbXBzOwkvKiAyIERDIHNjYW5zOyA0IEFDIHNjYW5zIHBlciBjb21wb25lbnQgKi8KKyAgfQorCisgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBzY3JpcHQuCisgICAqIFdlIG5lZWQgdG8gcHV0IGl0IGluIHRoZSBwZXJtYW5lbnQgcG9vbCBpbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiBwZXJmb3JtcworICAgKiBtdWx0aXBsZSBjb21wcmVzc2lvbnMgd2l0aG91dCBjaGFuZ2luZyB0aGUgc2V0dGluZ3MuICBUbyBhdm9pZCBhIG1lbW9yeQorICAgKiBsZWFrIGlmIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uIGlzIGNhbGxlZCByZXBlYXRlZGx5IGZvciB0aGUgc2FtZSBKUEVHCisgICAqIG9iamVjdCwgd2UgdHJ5IHRvIHJlLXVzZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBzcGFjZSwgYW5kIHdlIGFsbG9jYXRlCisgICAqIGVub3VnaCBzcGFjZSB0byBoYW5kbGUgWUNiQ3IgZXZlbiBpZiBpbml0aWFsbHkgYXNrZWQgZm9yIGdyYXlzY2FsZS4KKyAgICovCisgIGlmIChjaW5mby0+c2NyaXB0X3NwYWNlID09IE5VTEwgfHwgY2luZm8tPnNjcmlwdF9zcGFjZV9zaXplIDwgbnNjYW5zKSB7CisgICAgY2luZm8tPnNjcmlwdF9zcGFjZV9zaXplID0gTUFYKG5zY2FucywgMTApOworICAgIGNpbmZvLT5zY3JpcHRfc3BhY2UgPSAoanBlZ19zY2FuX2luZm8gKikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfUEVSTUFORU5ULAorCQkJY2luZm8tPnNjcmlwdF9zcGFjZV9zaXplICogU0laRU9GKGpwZWdfc2Nhbl9pbmZvKSk7CisgIH0KKyAgc2NhbnB0ciA9IGNpbmZvLT5zY3JpcHRfc3BhY2U7CisgIGNpbmZvLT5zY2FuX2luZm8gPSBzY2FucHRyOworICBjaW5mby0+bnVtX3NjYW5zID0gbnNjYW5zOworCisgIGlmIChuY29tcHMgPT0gMyAmJiBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpIHsKKyAgICAvKiBDdXN0b20gc2NyaXB0IGZvciBZQ2JDciBjb2xvciBpbWFnZXMuICovCisgICAgLyogSW5pdGlhbCBEQyBzY2FuICovCisgICAgc2NhbnB0ciA9IGZpbGxfZGNfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCAwLCAxKTsKKyAgICAvKiBJbml0aWFsIEFDIHNjYW46IGdldCBzb21lIGx1bWEgZGF0YSBvdXQgaW4gYSBodXJyeSAqLworICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAwLCAxLCA1LCAwLCAyKTsKKyAgICAvKiBDaHJvbWEgZGF0YSBpcyB0b28gc21hbGwgdG8gYmUgd29ydGggZXhwZW5kaW5nIG1hbnkgc2NhbnMgb24gKi8KKyAgICBzY2FucHRyID0gZmlsbF9hX3NjYW4oc2NhbnB0ciwgMiwgMSwgNjMsIDAsIDEpOworICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAxLCAxLCA2MywgMCwgMSk7CisgICAgLyogQ29tcGxldGUgc3BlY3RyYWwgc2VsZWN0aW9uIGZvciBsdW1hIEFDICovCisgICAgc2NhbnB0ciA9IGZpbGxfYV9zY2FuKHNjYW5wdHIsIDAsIDYsIDYzLCAwLCAyKTsKKyAgICAvKiBSZWZpbmUgbmV4dCBiaXQgb2YgbHVtYSBBQyAqLworICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAwLCAxLCA2MywgMiwgMSk7CisgICAgLyogRmluaXNoIERDIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiAqLworICAgIHNjYW5wdHIgPSBmaWxsX2RjX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMSwgMCk7CisgICAgLyogRmluaXNoIEFDIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiAqLworICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAyLCAxLCA2MywgMSwgMCk7CisgICAgc2NhbnB0ciA9IGZpbGxfYV9zY2FuKHNjYW5wdHIsIDEsIDEsIDYzLCAxLCAwKTsKKyAgICAvKiBMdW1hIGJvdHRvbSBiaXQgY29tZXMgbGFzdCBzaW5jZSBpdCdzIHVzdWFsbHkgbGFyZ2VzdCBzY2FuICovCisgICAgc2NhbnB0ciA9IGZpbGxfYV9zY2FuKHNjYW5wdHIsIDAsIDEsIDYzLCAxLCAwKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBBbGwtcHVycG9zZSBzY3JpcHQgZm9yIG90aGVyIGNvbG9yIHNwYWNlcy4gKi8KKyAgICAvKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gZmlyc3QgcGFzcyAqLworICAgIHNjYW5wdHIgPSBmaWxsX2RjX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMCwgMSk7CisgICAgc2NhbnB0ciA9IGZpbGxfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCAxLCA1LCAwLCAyKTsKKyAgICBzY2FucHRyID0gZmlsbF9zY2FucyhzY2FucHRyLCBuY29tcHMsIDYsIDYzLCAwLCAyKTsKKyAgICAvKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gc2Vjb25kIHBhc3MgKi8KKyAgICBzY2FucHRyID0gZmlsbF9zY2FucyhzY2FucHRyLCBuY29tcHMsIDEsIDYzLCAyLCAxKTsKKyAgICAvKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gZmluYWwgcGFzcyAqLworICAgIHNjYW5wdHIgPSBmaWxsX2RjX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMSwgMCk7CisgICAgc2NhbnB0ciA9IGZpbGxfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCAxLCA2MywgMSwgMCk7CisgIH0KK30KKworI2VuZGlmIC8qIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamNwaHVmZi5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjcGh1ZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2Y5MTc4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjcGh1ZmYuYwpAQCAtMCwwICsxLDgzMyBAQAorLyoKKyAqIGpjcGh1ZmYuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIEh1ZmZtYW4gZW50cm9weSBlbmNvZGluZyByb3V0aW5lcyBmb3IgcHJvZ3Jlc3NpdmUgSlBFRy4KKyAqCisgKiBXZSBkbyBub3Qgc3VwcG9ydCBvdXRwdXQgc3VzcGVuc2lvbiBpbiB0aGlzIG1vZHVsZSwgc2luY2UgdGhlIGxpYnJhcnkKKyAqIGN1cnJlbnRseSBkb2VzIG5vdCBhbGxvdyBtdWx0aXBsZS1zY2FuIGZpbGVzIHRvIGJlIHdyaXR0ZW4gd2l0aCBvdXRwdXQKKyAqIHN1c3BlbnNpb24uCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImpjaHVmZi5oIgkJLyogRGVjbGFyYXRpb25zIHNoYXJlZCB3aXRoIGpjaHVmZi5jICovCisKKyNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorCisvKiBFeHBhbmRlZCBlbnRyb3B5IGVuY29kZXIgb2JqZWN0IGZvciBwcm9ncmVzc2l2ZSBIdWZmbWFuIGVuY29kaW5nLiAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBNb2RlIGZsYWc6IFRSVUUgZm9yIG9wdGltaXphdGlvbiwgRkFMU0UgZm9yIGFjdHVhbCBkYXRhIG91dHB1dCAqLworICBib29sZWFuIGdhdGhlcl9zdGF0aXN0aWNzOworCisgIC8qIEJpdC1sZXZlbCBjb2Rpbmcgc3RhdHVzLgorICAgKiBuZXh0X291dHB1dF9ieXRlL2ZyZWVfaW5fYnVmZmVyIGFyZSBsb2NhbCBjb3BpZXMgb2YgY2luZm8tPmRlc3QgZmllbGRzLgorICAgKi8KKyAgSk9DVEVUICogbmV4dF9vdXRwdXRfYnl0ZTsJLyogPT4gbmV4dCBieXRlIHRvIHdyaXRlIGluIGJ1ZmZlciAqLworICBzaXplX3QgZnJlZV9pbl9idWZmZXI7CS8qICMgb2YgYnl0ZSBzcGFjZXMgcmVtYWluaW5nIGluIGJ1ZmZlciAqLworICBJTlQzMiBwdXRfYnVmZmVyOwkJLyogY3VycmVudCBiaXQtYWNjdW11bGF0aW9uIGJ1ZmZlciAqLworICBpbnQgcHV0X2JpdHM7CQkJLyogIyBvZiBiaXRzIG5vdyBpbiBpdCAqLworICBqX2NvbXByZXNzX3B0ciBjaW5mbzsJCS8qIGxpbmsgdG8gY2luZm8gKG5lZWRlZCBmb3IgZHVtcF9idWZmZXIpICovCisKKyAgLyogQ29kaW5nIHN0YXR1cyBmb3IgREMgY29tcG9uZW50cyAqLworICBpbnQgbGFzdF9kY192YWxbTUFYX0NPTVBTX0lOX1NDQU5dOyAvKiBsYXN0IERDIGNvZWYgZm9yIGVhY2ggY29tcG9uZW50ICovCisKKyAgLyogQ29kaW5nIHN0YXR1cyBmb3IgQUMgY29tcG9uZW50cyAqLworICBpbnQgYWNfdGJsX25vOwkJLyogdGhlIHRhYmxlIG51bWJlciBvZiB0aGUgc2luZ2xlIGNvbXBvbmVudCAqLworICB1bnNpZ25lZCBpbnQgRU9CUlVOOwkJLyogcnVuIGxlbmd0aCBvZiBFT0JzICovCisgIHVuc2lnbmVkIGludCBCRTsJCS8qICMgb2YgYnVmZmVyZWQgY29ycmVjdGlvbiBiaXRzIGJlZm9yZSBNQ1UgKi8KKyAgY2hhciAqIGJpdF9idWZmZXI7CQkvKiBidWZmZXIgZm9yIGNvcnJlY3Rpb24gYml0cyAoMSBwZXIgY2hhcikgKi8KKyAgLyogcGFja2luZyBjb3JyZWN0aW9uIGJpdHMgdGlnaHRseSB3b3VsZCBzYXZlIHNvbWUgc3BhY2UgYnV0IGNvc3QgdGltZS4uLiAqLworCisgIHVuc2lnbmVkIGludCByZXN0YXJ0c190b19nbzsJLyogTUNVcyBsZWZ0IGluIHRoaXMgcmVzdGFydCBpbnRlcnZhbCAqLworICBpbnQgbmV4dF9yZXN0YXJ0X251bTsJCS8qIG5leHQgcmVzdGFydCBudW1iZXIgdG8gd3JpdGUgKDAtNykgKi8KKworICAvKiBQb2ludGVycyB0byBkZXJpdmVkIHRhYmxlcyAodGhlc2Ugd29ya3NwYWNlcyBoYXZlIGltYWdlIGxpZmVzcGFuKS4KKyAgICogU2luY2UgYW55IG9uZSBzY2FuIGNvZGVzIG9ubHkgREMgb3Igb25seSBBQywgd2Ugb25seSBuZWVkIG9uZSBzZXQKKyAgICogb2YgdGFibGVzLCBub3Qgb25lIGZvciBEQyBhbmQgb25lIGZvciBBQy4KKyAgICovCisgIGNfZGVyaXZlZF90YmwgKiBkZXJpdmVkX3RibHNbTlVNX0hVRkZfVEJMU107CisKKyAgLyogU3RhdGlzdGljcyB0YWJsZXMgZm9yIG9wdGltaXphdGlvbjsgYWdhaW4sIG9uZSBzZXQgaXMgZW5vdWdoICovCisgIGxvbmcgKiBjb3VudF9wdHJzW05VTV9IVUZGX1RCTFNdOworfSBwaHVmZl9lbnRyb3B5X2VuY29kZXI7CisKK3R5cGVkZWYgcGh1ZmZfZW50cm9weV9lbmNvZGVyICogcGh1ZmZfZW50cm9weV9wdHI7CisKKy8qIE1BWF9DT1JSX0JJVFMgaXMgdGhlIG51bWJlciBvZiBiaXRzIHRoZSBBQyByZWZpbmVtZW50IGNvcnJlY3Rpb24tYml0CisgKiBidWZmZXIgY2FuIGhvbGQuICBMYXJnZXIgc2l6ZXMgbWF5IHNsaWdodGx5IGltcHJvdmUgY29tcHJlc3Npb24sIGJ1dAorICogMTAwMCBpcyBhbHJlYWR5IHdlbGwgaW50byB0aGUgcmVhbG0gb2Ygb3ZlcmtpbGwuCisgKiBUaGUgbWluaW11bSBzYWZlIHNpemUgaXMgNjQgYml0cy4KKyAqLworCisjZGVmaW5lIE1BWF9DT1JSX0JJVFMgIDEwMDAJLyogTWF4ICMgb2YgY29ycmVjdGlvbiBiaXRzIEkgY2FuIGJ1ZmZlciAqLworCisvKiBJUklHSFRfU0hJRlQgaXMgbGlrZSBSSUdIVF9TSElGVCwgYnV0IHdvcmtzIG9uIGludCByYXRoZXIgdGhhbiBJTlQzMi4KKyAqIFdlIGFzc3VtZSB0aGF0IGludCByaWdodCBzaGlmdCBpcyB1bnNpZ25lZCBpZiBJTlQzMiByaWdodCBzaGlmdCBpcywKKyAqIHdoaWNoIHNob3VsZCBiZSBzYWZlLgorICovCisKKyNpZmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorI2RlZmluZSBJU0hJRlRfVEVNUFMJaW50IGlzaGlmdF90ZW1wOworI2RlZmluZSBJUklHSFRfU0hJRlQoeCxzaGZ0KSAgXAorCSgoaXNoaWZ0X3RlbXAgPSAoeCkpIDwgMCA/IFwKKwkgKGlzaGlmdF90ZW1wID4+IChzaGZ0KSkgfCAoKH4wKSA8PCAoMTYtKHNoZnQpKSkgOiBcCisJIChpc2hpZnRfdGVtcCA+PiAoc2hmdCkpKQorI2Vsc2UKKyNkZWZpbmUgSVNISUZUX1RFTVBTCisjZGVmaW5lIElSSUdIVF9TSElGVCh4LHNoZnQpCSgoeCkgPj4gKHNoZnQpKQorI2VuZGlmCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitNRVRIT0RERUYoYm9vbGVhbikgZW5jb2RlX21jdV9EQ19maXJzdCBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOworTUVUSE9EREVGKGJvb2xlYW4pIGVuY29kZV9tY3VfQUNfZmlyc3QgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKK01FVEhPRERFRihib29sZWFuKSBlbmNvZGVfbWN1X0RDX3JlZmluZSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKK01FVEhPRERFRihib29sZWFuKSBlbmNvZGVfbWN1X0FDX3JlZmluZSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKK01FVEhPRERFRih2b2lkKSBmaW5pc2hfcGFzc19waHVmZiBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CitNRVRIT0RERUYodm9pZCkgZmluaXNoX3Bhc3NfZ2F0aGVyX3BodWZmIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBIdWZmbWFuLWNvbXByZXNzZWQgc2NhbiB1c2luZyBwcm9ncmVzc2l2ZSBKUEVHLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19waHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gZ2F0aGVyX3N0YXRpc3RpY3MpCit7ICAKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGJvb2xlYW4gaXNfRENfYmFuZDsKKyAgaW50IGNpLCB0Ymw7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworCisgIGVudHJvcHktPmNpbmZvID0gY2luZm87CisgIGVudHJvcHktPmdhdGhlcl9zdGF0aXN0aWNzID0gZ2F0aGVyX3N0YXRpc3RpY3M7CisKKyAgaXNfRENfYmFuZCA9IChjaW5mby0+U3MgPT0gMCk7CisKKyAgLyogV2UgYXNzdW1lIGpjbWFzdGVyLmMgYWxyZWFkeSB2YWxpZGF0ZWQgdGhlIHNjYW4gcGFyYW1ldGVycy4gKi8KKworICAvKiBTZWxlY3QgZXhlY3V0aW9uIHJvdXRpbmVzICovCisgIGlmIChjaW5mby0+QWggPT0gMCkgeworICAgIGlmIChpc19EQ19iYW5kKQorICAgICAgZW50cm9weS0+cHViLmVuY29kZV9tY3UgPSBlbmNvZGVfbWN1X0RDX2ZpcnN0OworICAgIGVsc2UKKyAgICAgIGVudHJvcHktPnB1Yi5lbmNvZGVfbWN1ID0gZW5jb2RlX21jdV9BQ19maXJzdDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoaXNfRENfYmFuZCkKKyAgICAgIGVudHJvcHktPnB1Yi5lbmNvZGVfbWN1ID0gZW5jb2RlX21jdV9EQ19yZWZpbmU7CisgICAgZWxzZSB7CisgICAgICBlbnRyb3B5LT5wdWIuZW5jb2RlX21jdSA9IGVuY29kZV9tY3VfQUNfcmVmaW5lOworICAgICAgLyogQUMgcmVmaW5lbWVudCBuZWVkcyBhIGNvcnJlY3Rpb24gYml0IGJ1ZmZlciAqLworICAgICAgaWYgKGVudHJvcHktPmJpdF9idWZmZXIgPT0gTlVMTCkKKwllbnRyb3B5LT5iaXRfYnVmZmVyID0gKGNoYXIgKikKKwkgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICAgICAgTUFYX0NPUlJfQklUUyAqIFNJWkVPRihjaGFyKSk7CisgICAgfQorICB9CisgIGlmIChnYXRoZXJfc3RhdGlzdGljcykKKyAgICBlbnRyb3B5LT5wdWIuZmluaXNoX3Bhc3MgPSBmaW5pc2hfcGFzc19nYXRoZXJfcGh1ZmY7CisgIGVsc2UKKyAgICBlbnRyb3B5LT5wdWIuZmluaXNoX3Bhc3MgPSBmaW5pc2hfcGFzc19waHVmZjsKKworICAvKiBPbmx5IERDIGNvZWZmaWNpZW50cyBtYXkgYmUgaW50ZXJsZWF2ZWQsIHNvIGNpbmZvLT5jb21wc19pbl9zY2FuID0gMQorICAgKiBmb3IgQUMgY29lZmZpY2llbnRzLgorICAgKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIC8qIEluaXRpYWxpemUgREMgcHJlZGljdGlvbnMgdG8gMCAqLworICAgIGVudHJvcHktPmxhc3RfZGNfdmFsW2NpXSA9IDA7CisgICAgLyogR2V0IHRhYmxlIGluZGV4ICovCisgICAgaWYgKGlzX0RDX2JhbmQpIHsKKyAgICAgIGlmIChjaW5mby0+QWggIT0gMCkJLyogREMgcmVmaW5lbWVudCBuZWVkcyBubyB0YWJsZSAqLworCWNvbnRpbnVlOworICAgICAgdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOworICAgIH0gZWxzZSB7CisgICAgICBlbnRyb3B5LT5hY190Ymxfbm8gPSB0YmwgPSBjb21wcHRyLT5hY190Ymxfbm87CisgICAgfQorICAgIGlmIChnYXRoZXJfc3RhdGlzdGljcykgeworICAgICAgLyogQ2hlY2sgZm9yIGludmFsaWQgdGFibGUgaW5kZXggKi8KKyAgICAgIC8qIChtYWtlX2NfZGVyaXZlZF90YmwgZG9lcyB0aGlzIGluIHRoZSBvdGhlciBwYXRoKSAqLworICAgICAgaWYgKHRibCA8IDAgfHwgdGJsID49IE5VTV9IVUZGX1RCTFMpCisgICAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIHRibCk7CisgICAgICAvKiBBbGxvY2F0ZSBhbmQgemVybyB0aGUgc3RhdGlzdGljcyB0YWJsZXMgKi8KKyAgICAgIC8qIE5vdGUgdGhhdCBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlIGV4cGVjdHMgMjU3IGVudHJpZXMgaW4gZWFjaCB0YWJsZSEgKi8KKyAgICAgIGlmIChlbnRyb3B5LT5jb3VudF9wdHJzW3RibF0gPT0gTlVMTCkKKwllbnRyb3B5LT5jb3VudF9wdHJzW3RibF0gPSAobG9uZyAqKQorCSAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgICAgICAyNTcgKiBTSVpFT0YobG9uZykpOworICAgICAgTUVNWkVSTyhlbnRyb3B5LT5jb3VudF9wdHJzW3RibF0sIDI1NyAqIFNJWkVPRihsb25nKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIENvbXB1dGUgZGVyaXZlZCB2YWx1ZXMgZm9yIEh1ZmZtYW4gdGFibGUgKi8KKyAgICAgIC8qIFdlIG1heSBkbyB0aGlzIG1vcmUgdGhhbiBvbmNlIGZvciBhIHRhYmxlLCBidXQgaXQncyBub3QgZXhwZW5zaXZlICovCisgICAgICBqcGVnX21ha2VfY19kZXJpdmVkX3RibChjaW5mbywgaXNfRENfYmFuZCwgdGJsLAorCQkJICAgICAgJiBlbnRyb3B5LT5kZXJpdmVkX3RibHNbdGJsXSk7CisgICAgfQorICB9CisKKyAgLyogSW5pdGlhbGl6ZSBBQyBzdHVmZiAqLworICBlbnRyb3B5LT5FT0JSVU4gPSAwOworICBlbnRyb3B5LT5CRSA9IDA7CisKKyAgLyogSW5pdGlhbGl6ZSBiaXQgYnVmZmVyIHRvIGVtcHR5ICovCisgIGVudHJvcHktPnB1dF9idWZmZXIgPSAwOworICBlbnRyb3B5LT5wdXRfYml0cyA9IDA7CisKKyAgLyogSW5pdGlhbGl6ZSByZXN0YXJ0IHN0dWZmICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gPSAwOworfQorCisKKy8qIE91dHB1dHRpbmcgYnl0ZXMgdG8gdGhlIGZpbGUuCisgKiBOQjogdGhlc2UgbXVzdCBiZSBjYWxsZWQgb25seSB3aGVuIGFjdHVhbGx5IG91dHB1dHRpbmcsCisgKiB0aGF0IGlzLCBlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcyA9PSBGQUxTRS4KKyAqLworCisvKiBFbWl0IGEgYnl0ZSAqLworI2RlZmluZSBlbWl0X2J5dGUoZW50cm9weSx2YWwpICBcCisJeyAqKGVudHJvcHkpLT5uZXh0X291dHB1dF9ieXRlKysgPSAoSk9DVEVUKSAodmFsKTsgIFwKKwkgIGlmICgtLShlbnRyb3B5KS0+ZnJlZV9pbl9idWZmZXIgPT0gMCkgIFwKKwkgICAgZHVtcF9idWZmZXIoZW50cm9weSk7IH0KKworCitMT0NBTCh2b2lkKQorZHVtcF9idWZmZXIgKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkpCisvKiBFbXB0eSB0aGUgb3V0cHV0IGJ1ZmZlcjsgd2UgZG8gbm90IHN1cHBvcnQgc3VzcGVuc2lvbiBpbiB0aGlzIG1vZHVsZS4gKi8KK3sKKyAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyICogZGVzdCA9IGVudHJvcHktPmNpbmZvLT5kZXN0OworCisgIGlmICghICgqZGVzdC0+ZW1wdHlfb3V0cHV0X2J1ZmZlcikgKGVudHJvcHktPmNpbmZvKSkKKyAgICBFUlJFWElUKGVudHJvcHktPmNpbmZvLCBKRVJSX0NBTlRfU1VTUEVORCk7CisgIC8qIEFmdGVyIGEgc3VjY2Vzc2Z1bCBidWZmZXIgZHVtcCwgbXVzdCByZXNldCBidWZmZXIgcG9pbnRlcnMgKi8KKyAgZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGRlc3QtPm5leHRfb3V0cHV0X2J5dGU7CisgIGVudHJvcHktPmZyZWVfaW5fYnVmZmVyID0gZGVzdC0+ZnJlZV9pbl9idWZmZXI7Cit9CisKKworLyogT3V0cHV0dGluZyBiaXRzIHRvIHRoZSBmaWxlICovCisKKy8qIE9ubHkgdGhlIHJpZ2h0IDI0IGJpdHMgb2YgcHV0X2J1ZmZlciBhcmUgdXNlZDsgdGhlIHZhbGlkIGJpdHMgYXJlCisgKiBsZWZ0LWp1c3RpZmllZCBpbiB0aGlzIHBhcnQuICBBdCBtb3N0IDE2IGJpdHMgY2FuIGJlIHBhc3NlZCB0byBlbWl0X2JpdHMKKyAqIGluIG9uZSBjYWxsLCBhbmQgd2UgbmV2ZXIgcmV0YWluIG1vcmUgdGhhbiA3IGJpdHMgaW4gcHV0X2J1ZmZlcgorICogYmV0d2VlbiBjYWxscywgc28gMjQgYml0cyBhcmUgc3VmZmljaWVudC4KKyAqLworCitJTkxJTkUKK0xPQ0FMKHZvaWQpCitlbWl0X2JpdHMgKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHksIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgc2l6ZSkKKy8qIEVtaXQgc29tZSBiaXRzLCB1bmxlc3Mgd2UgYXJlIGluIGdhdGhlciBtb2RlICovCit7CisgIC8qIFRoaXMgcm91dGluZSBpcyBoZWF2aWx5IHVzZWQsIHNvIGl0J3Mgd29ydGggY29kaW5nIHRpZ2h0bHkuICovCisgIHJlZ2lzdGVyIElOVDMyIHB1dF9idWZmZXIgPSAoSU5UMzIpIGNvZGU7CisgIHJlZ2lzdGVyIGludCBwdXRfYml0cyA9IGVudHJvcHktPnB1dF9iaXRzOworCisgIC8qIGlmIHNpemUgaXMgMCwgY2FsbGVyIHVzZWQgYW4gaW52YWxpZCBIdWZmbWFuIHRhYmxlIGVudHJ5ICovCisgIGlmIChzaXplID09IDApCisgICAgRVJSRVhJVChlbnRyb3B5LT5jaW5mbywgSkVSUl9IVUZGX01JU1NJTkdfQ09ERSk7CisKKyAgaWYgKGVudHJvcHktPmdhdGhlcl9zdGF0aXN0aWNzKQorICAgIHJldHVybjsJCQkvKiBkbyBub3RoaW5nIGlmIHdlJ3JlIG9ubHkgZ2V0dGluZyBzdGF0cyAqLworCisgIHB1dF9idWZmZXIgJj0gKCgoSU5UMzIpIDEpPDxzaXplKSAtIDE7IC8qIG1hc2sgb2ZmIGFueSBleHRyYSBiaXRzIGluIGNvZGUgKi8KKyAgCisgIHB1dF9iaXRzICs9IHNpemU7CQkvKiBuZXcgbnVtYmVyIG9mIGJpdHMgaW4gYnVmZmVyICovCisgIAorICBwdXRfYnVmZmVyIDw8PSAyNCAtIHB1dF9iaXRzOyAvKiBhbGlnbiBpbmNvbWluZyBiaXRzICovCisKKyAgcHV0X2J1ZmZlciB8PSBlbnRyb3B5LT5wdXRfYnVmZmVyOyAvKiBhbmQgbWVyZ2Ugd2l0aCBvbGQgYnVmZmVyIGNvbnRlbnRzICovCisKKyAgd2hpbGUgKHB1dF9iaXRzID49IDgpIHsKKyAgICBpbnQgYyA9IChpbnQpICgocHV0X2J1ZmZlciA+PiAxNikgJiAweEZGKTsKKyAgICAKKyAgICBlbWl0X2J5dGUoZW50cm9weSwgYyk7CisgICAgaWYgKGMgPT0gMHhGRikgewkJLyogbmVlZCB0byBzdHVmZiBhIHplcm8gYnl0ZT8gKi8KKyAgICAgIGVtaXRfYnl0ZShlbnRyb3B5LCAwKTsKKyAgICB9CisgICAgcHV0X2J1ZmZlciA8PD0gODsKKyAgICBwdXRfYml0cyAtPSA4OworICB9CisKKyAgZW50cm9weS0+cHV0X2J1ZmZlciA9IHB1dF9idWZmZXI7IC8qIHVwZGF0ZSB2YXJpYWJsZXMgKi8KKyAgZW50cm9weS0+cHV0X2JpdHMgPSBwdXRfYml0czsKK30KKworCitMT0NBTCh2b2lkKQorZmx1c2hfYml0cyAocGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSkKK3sKKyAgZW1pdF9iaXRzKGVudHJvcHksIDB4N0YsIDcpOyAvKiBmaWxsIGFueSBwYXJ0aWFsIGJ5dGUgd2l0aCBvbmVzICovCisgIGVudHJvcHktPnB1dF9idWZmZXIgPSAwOyAgICAgLyogYW5kIHJlc2V0IGJpdC1idWZmZXIgdG8gZW1wdHkgKi8KKyAgZW50cm9weS0+cHV0X2JpdHMgPSAwOworfQorCisKKy8qCisgKiBFbWl0IChvciBqdXN0IGNvdW50KSBhIEh1ZmZtYW4gc3ltYm9sLgorICovCisKK0lOTElORQorTE9DQUwodm9pZCkKK2VtaXRfc3ltYm9sIChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCBpbnQgdGJsX25vLCBpbnQgc3ltYm9sKQoreworICBpZiAoZW50cm9weS0+Z2F0aGVyX3N0YXRpc3RpY3MpCisgICAgZW50cm9weS0+Y291bnRfcHRyc1t0Ymxfbm9dW3N5bWJvbF0rKzsKKyAgZWxzZSB7CisgICAgY19kZXJpdmVkX3RibCAqIHRibCA9IGVudHJvcHktPmRlcml2ZWRfdGJsc1t0Ymxfbm9dOworICAgIGVtaXRfYml0cyhlbnRyb3B5LCB0YmwtPmVodWZjb1tzeW1ib2xdLCB0YmwtPmVodWZzaVtzeW1ib2xdKTsKKyAgfQorfQorCisKKy8qCisgKiBFbWl0IGJpdHMgZnJvbSBhIGNvcnJlY3Rpb24gYml0IGJ1ZmZlci4KKyAqLworCitMT0NBTCh2b2lkKQorZW1pdF9idWZmZXJlZF9iaXRzIChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCBjaGFyICogYnVmc3RhcnQsCisJCSAgICB1bnNpZ25lZCBpbnQgbmJpdHMpCit7CisgIGlmIChlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcykKKyAgICByZXR1cm47CQkJLyogbm8gcmVhbCB3b3JrICovCisKKyAgd2hpbGUgKG5iaXRzID4gMCkgeworICAgIGVtaXRfYml0cyhlbnRyb3B5LCAodW5zaWduZWQgaW50KSAoKmJ1ZnN0YXJ0KSwgMSk7CisgICAgYnVmc3RhcnQrKzsKKyAgICBuYml0cy0tOworICB9Cit9CisKKworLyoKKyAqIEVtaXQgYW55IHBlbmRpbmcgRU9CUlVOIHN5bWJvbC4KKyAqLworCitMT0NBTCh2b2lkKQorZW1pdF9lb2JydW4gKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkpCit7CisgIHJlZ2lzdGVyIGludCB0ZW1wLCBuYml0czsKKworICBpZiAoZW50cm9weS0+RU9CUlVOID4gMCkgewkvKiBpZiB0aGVyZSBpcyBhbnkgcGVuZGluZyBFT0JSVU4gKi8KKyAgICB0ZW1wID0gZW50cm9weS0+RU9CUlVOOworICAgIG5iaXRzID0gMDsKKyAgICB3aGlsZSAoKHRlbXAgPj49IDEpKQorICAgICAgbmJpdHMrKzsKKyAgICAvKiBzYWZldHkgY2hlY2s6IHNob3VsZG4ndCBoYXBwZW4gZ2l2ZW4gbGltaXRlZCBjb3JyZWN0aW9uLWJpdCBidWZmZXIgKi8KKyAgICBpZiAobmJpdHMgPiAxNCkKKyAgICAgIEVSUkVYSVQoZW50cm9weS0+Y2luZm8sIEpFUlJfSFVGRl9NSVNTSU5HX0NPREUpOworCisgICAgZW1pdF9zeW1ib2woZW50cm9weSwgZW50cm9weS0+YWNfdGJsX25vLCBuYml0cyA8PCA0KTsKKyAgICBpZiAobmJpdHMpCisgICAgICBlbWl0X2JpdHMoZW50cm9weSwgZW50cm9weS0+RU9CUlVOLCBuYml0cyk7CisKKyAgICBlbnRyb3B5LT5FT0JSVU4gPSAwOworCisgICAgLyogRW1pdCBhbnkgYnVmZmVyZWQgY29ycmVjdGlvbiBiaXRzICovCisgICAgZW1pdF9idWZmZXJlZF9iaXRzKGVudHJvcHksIGVudHJvcHktPmJpdF9idWZmZXIsIGVudHJvcHktPkJFKTsKKyAgICBlbnRyb3B5LT5CRSA9IDA7CisgIH0KK30KKworCisvKgorICogRW1pdCBhIHJlc3RhcnQgbWFya2VyICYgcmVzeW5jaHJvbml6ZSBwcmVkaWN0aW9ucy4KKyAqLworCitMT0NBTCh2b2lkKQorZW1pdF9yZXN0YXJ0IChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCBpbnQgcmVzdGFydF9udW0pCit7CisgIGludCBjaTsKKworICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKworICBpZiAoISBlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcykgeworICAgIGZsdXNoX2JpdHMoZW50cm9weSk7CisgICAgZW1pdF9ieXRlKGVudHJvcHksIDB4RkYpOworICAgIGVtaXRfYnl0ZShlbnRyb3B5LCBKUEVHX1JTVDAgKyByZXN0YXJ0X251bSk7CisgIH0KKworICBpZiAoZW50cm9weS0+Y2luZm8tPlNzID09IDApIHsKKyAgICAvKiBSZS1pbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KKyAgICBmb3IgKGNpID0gMDsgY2kgPCBlbnRyb3B5LT5jaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykKKyAgICAgIGVudHJvcHktPmxhc3RfZGNfdmFsW2NpXSA9IDA7CisgIH0gZWxzZSB7CisgICAgLyogUmUtaW5pdGlhbGl6ZSBhbGwgQUMtcmVsYXRlZCBmaWVsZHMgdG8gMCAqLworICAgIGVudHJvcHktPkVPQlJVTiA9IDA7CisgICAgZW50cm9weS0+QkUgPSAwOworICB9Cit9CisKKworLyoKKyAqIE1DVSBlbmNvZGluZyBmb3IgREMgaW5pdGlhbCBzY2FuIChlaXRoZXIgc3BlY3RyYWwgc2VsZWN0aW9uLAorICogb3IgZmlyc3QgcGFzcyBvZiBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24pLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZW5jb2RlX21jdV9EQ19maXJzdCAoal9jb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCit7CisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICByZWdpc3RlciBpbnQgdGVtcCwgdGVtcDI7CisgIHJlZ2lzdGVyIGludCBuYml0czsKKyAgaW50IGJsa24sIGNpOworICBpbnQgQWwgPSBjaW5mby0+QWw7CisgIEpCTE9DS1JPVyBibG9jazsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisgIElTSElGVF9URU1QUworCisgIGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgZW50cm9weS0+ZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7CisKKyAgLyogRW1pdCByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQgKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKQorICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgZW1pdF9yZXN0YXJ0KGVudHJvcHksIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0pOworCisgIC8qIEVuY29kZSB0aGUgTUNVIGRhdGEgYmxvY2tzICovCisgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7CisgICAgYmxvY2sgPSBNQ1VfZGF0YVtibGtuXTsKKyAgICBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworCisgICAgLyogQ29tcHV0ZSB0aGUgREMgdmFsdWUgYWZ0ZXIgdGhlIHJlcXVpcmVkIHBvaW50IHRyYW5zZm9ybSBieSBBbC4KKyAgICAgKiBUaGlzIGlzIHNpbXBseSBhbiBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0LgorICAgICAqLworICAgIHRlbXAyID0gSVJJR0hUX1NISUZUKChpbnQpICgoKmJsb2NrKVswXSksIEFsKTsKKworICAgIC8qIERDIGRpZmZlcmVuY2VzIGFyZSBmaWd1cmVkIG9uIHRoZSBwb2ludC10cmFuc2Zvcm1lZCB2YWx1ZXMuICovCisgICAgdGVtcCA9IHRlbXAyIC0gZW50cm9weS0+bGFzdF9kY192YWxbY2ldOworICAgIGVudHJvcHktPmxhc3RfZGNfdmFsW2NpXSA9IHRlbXAyOworCisgICAgLyogRW5jb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlIHBlciBzZWN0aW9uIEcuMS4yLjEgKi8KKyAgICB0ZW1wMiA9IHRlbXA7CisgICAgaWYgKHRlbXAgPCAwKSB7CisgICAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLworICAgICAgLyogRm9yIGEgbmVnYXRpdmUgaW5wdXQsIHdhbnQgdGVtcDIgPSBiaXR3aXNlIGNvbXBsZW1lbnQgb2YgYWJzKGlucHV0KSAqLworICAgICAgLyogVGhpcyBjb2RlIGFzc3VtZXMgd2UgYXJlIG9uIGEgdHdvJ3MgY29tcGxlbWVudCBtYWNoaW5lICovCisgICAgICB0ZW1wMi0tOworICAgIH0KKyAgICAKKyAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvZWZmaWNpZW50ICovCisgICAgbmJpdHMgPSAwOworICAgIHdoaWxlICh0ZW1wKSB7CisgICAgICBuYml0cysrOworICAgICAgdGVtcCA+Pj0gMTsKKyAgICB9CisgICAgLyogQ2hlY2sgZm9yIG91dC1vZi1yYW5nZSBjb2VmZmljaWVudCB2YWx1ZXMuCisgICAgICogU2luY2Ugd2UncmUgZW5jb2RpbmcgYSBkaWZmZXJlbmNlLCB0aGUgcmFuZ2UgbGltaXQgaXMgdHdpY2UgYXMgbXVjaC4KKyAgICAgKi8KKyAgICBpZiAobmJpdHMgPiBNQVhfQ09FRl9CSVRTKzEpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9EQ1RfQ09FRik7CisgICAgCisgICAgLyogQ291bnQvZW1pdCB0aGUgSHVmZm1hbi1jb2RlZCBzeW1ib2wgZm9yIHRoZSBudW1iZXIgb2YgYml0cyAqLworICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGNvbXBwdHItPmRjX3RibF9ubywgbmJpdHMpOworICAgIAorICAgIC8qIEVtaXQgdGhhdCBudW1iZXIgb2YgYml0cyBvZiB0aGUgdmFsdWUsIGlmIHBvc2l0aXZlLCAqLworICAgIC8qIG9yIHRoZSBjb21wbGVtZW50IG9mIGl0cyBtYWduaXR1ZGUsIGlmIG5lZ2F0aXZlLiAqLworICAgIGlmIChuYml0cykJCQkvKiBlbWl0X2JpdHMgcmVqZWN0cyBjYWxscyB3aXRoIHNpemUgMCAqLworICAgICAgZW1pdF9iaXRzKGVudHJvcHksICh1bnNpZ25lZCBpbnQpIHRlbXAyLCBuYml0cyk7CisgIH0KKworICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGU7CisgIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IGVudHJvcHktPmZyZWVfaW5fYnVmZmVyOworCisgIC8qIFVwZGF0ZSByZXN0YXJ0LWludGVydmFsIHN0YXRlIHRvbyAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkgeworICAgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKKyAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0rKzsKKyAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gJj0gNzsKKyAgICB9CisgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBNQ1UgZW5jb2RpbmcgZm9yIEFDIGluaXRpYWwgc2NhbiAoZWl0aGVyIHNwZWN0cmFsIHNlbGVjdGlvbiwKKyAqIG9yIGZpcnN0IHBhc3Mgb2Ygc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uKS4KKyAqLworCitNRVRIT0RERUYoYm9vbGVhbikKK2VuY29kZV9tY3VfQUNfZmlyc3QgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreworICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgcmVnaXN0ZXIgaW50IHRlbXAsIHRlbXAyOworICByZWdpc3RlciBpbnQgbmJpdHM7CisgIHJlZ2lzdGVyIGludCByLCBrOworICBpbnQgU2UgPSBjaW5mby0+U2U7CisgIGludCBBbCA9IGNpbmZvLT5BbDsKKyAgSkJMT0NLUk9XIGJsb2NrOworCisgIGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgZW50cm9weS0+ZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7CisKKyAgLyogRW1pdCByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQgKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKQorICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgZW1pdF9yZXN0YXJ0KGVudHJvcHksIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0pOworCisgIC8qIEVuY29kZSB0aGUgTUNVIGRhdGEgYmxvY2sgKi8KKyAgYmxvY2sgPSBNQ1VfZGF0YVswXTsKKworICAvKiBFbmNvZGUgdGhlIEFDIGNvZWZmaWNpZW50cyBwZXIgc2VjdGlvbiBHLjEuMi4yLCBmaWcuIEcuMyAqLworICAKKyAgciA9IDA7CQkJLyogciA9IHJ1biBsZW5ndGggb2YgemVyb3MgKi8KKyAgIAorICBmb3IgKGsgPSBjaW5mby0+U3M7IGsgPD0gU2U7IGsrKykgeworICAgIGlmICgodGVtcCA9ICgqYmxvY2spW2pwZWdfbmF0dXJhbF9vcmRlcltrXV0pID09IDApIHsKKyAgICAgIHIrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAvKiBXZSBtdXN0IGFwcGx5IHRoZSBwb2ludCB0cmFuc2Zvcm0gYnkgQWwuICBGb3IgQUMgY29lZmZpY2llbnRzIHRoaXMKKyAgICAgKiBpcyBhbiBpbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG93YXJkcyAwLiAgVG8gZG8gdGhpcyBwb3J0YWJseQorICAgICAqIGluIEMsIHdlIHNoaWZ0IGFmdGVyIG9idGFpbmluZyB0aGUgYWJzb2x1dGUgdmFsdWU7IHNvIHRoZSBjb2RlIGlzCisgICAgICogaW50ZXJ3b3ZlbiB3aXRoIGZpbmRpbmcgdGhlIGFicyB2YWx1ZSAodGVtcCkgYW5kIG91dHB1dCBiaXRzICh0ZW1wMikuCisgICAgICovCisgICAgaWYgKHRlbXAgPCAwKSB7CisgICAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLworICAgICAgdGVtcCA+Pj0gQWw7CQkvKiBhcHBseSB0aGUgcG9pbnQgdHJhbnNmb3JtICovCisgICAgICAvKiBGb3IgYSBuZWdhdGl2ZSBjb2VmLCB3YW50IHRlbXAyID0gYml0d2lzZSBjb21wbGVtZW50IG9mIGFicyhjb2VmKSAqLworICAgICAgdGVtcDIgPSB+dGVtcDsKKyAgICB9IGVsc2UgeworICAgICAgdGVtcCA+Pj0gQWw7CQkvKiBhcHBseSB0aGUgcG9pbnQgdHJhbnNmb3JtICovCisgICAgICB0ZW1wMiA9IHRlbXA7CisgICAgfQorICAgIC8qIFdhdGNoIG91dCBmb3IgY2FzZSB0aGF0IG5vbnplcm8gY29lZiBpcyB6ZXJvIGFmdGVyIHBvaW50IHRyYW5zZm9ybSAqLworICAgIGlmICh0ZW1wID09IDApIHsKKyAgICAgIHIrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIEVtaXQgYW55IHBlbmRpbmcgRU9CUlVOICovCisgICAgaWYgKGVudHJvcHktPkVPQlJVTiA+IDApCisgICAgICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKyAgICAvKiBpZiBydW4gbGVuZ3RoID4gMTUsIG11c3QgZW1pdCBzcGVjaWFsIHJ1bi1sZW5ndGgtMTYgY29kZXMgKDB4RjApICovCisgICAgd2hpbGUgKHIgPiAxNSkgeworICAgICAgZW1pdF9zeW1ib2woZW50cm9weSwgZW50cm9weS0+YWNfdGJsX25vLCAweEYwKTsKKyAgICAgIHIgLT0gMTY7CisgICAgfQorCisgICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLworICAgIG5iaXRzID0gMTsJCQkvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSAxIGJpdCAqLworICAgIHdoaWxlICgodGVtcCA+Pj0gMSkpCisgICAgICBuYml0cysrOworICAgIC8qIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgY29lZmZpY2llbnQgdmFsdWVzICovCisgICAgaWYgKG5iaXRzID4gTUFYX0NPRUZfQklUUykKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0RDVF9DT0VGKTsKKworICAgIC8qIENvdW50L2VtaXQgSHVmZm1hbiBzeW1ib2wgZm9yIHJ1biBsZW5ndGggLyBudW1iZXIgb2YgYml0cyAqLworICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgKHIgPDwgNCkgKyBuYml0cyk7CisKKyAgICAvKiBFbWl0IHRoYXQgbnVtYmVyIG9mIGJpdHMgb2YgdGhlIHZhbHVlLCBpZiBwb3NpdGl2ZSwgKi8KKyAgICAvKiBvciB0aGUgY29tcGxlbWVudCBvZiBpdHMgbWFnbml0dWRlLCBpZiBuZWdhdGl2ZS4gKi8KKyAgICBlbWl0X2JpdHMoZW50cm9weSwgKHVuc2lnbmVkIGludCkgdGVtcDIsIG5iaXRzKTsKKworICAgIHIgPSAwOwkJCS8qIHJlc2V0IHplcm8gcnVuIGxlbmd0aCAqLworICB9CisKKyAgaWYgKHIgPiAwKSB7CQkJLyogSWYgdGhlcmUgYXJlIHRyYWlsaW5nIHplcm9lcywgKi8KKyAgICBlbnRyb3B5LT5FT0JSVU4rKzsJCS8qIGNvdW50IGFuIEVPQiAqLworICAgIGlmIChlbnRyb3B5LT5FT0JSVU4gPT0gMHg3RkZGKQorICAgICAgZW1pdF9lb2JydW4oZW50cm9weSk7CS8qIGZvcmNlIGl0IG91dCB0byBhdm9pZCBvdmVyZmxvdyAqLworICB9CisKKyAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlOworICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlcjsKKworICAvKiBVcGRhdGUgcmVzdGFydC1pbnRlcnZhbCBzdGF0ZSB0b28gKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApIHsKKyAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKys7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtICY9IDc7CisgICAgfQorICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogTUNVIGVuY29kaW5nIGZvciBEQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuLgorICogTm90ZTogd2UgYXNzdW1lIHN1Y2ggc2NhbnMgY2FuIGJlIG11bHRpLWNvbXBvbmVudCwgYWx0aG91Z2ggdGhlIHNwZWMKKyAqIGlzIG5vdCB2ZXJ5IGNsZWFyIG9uIHRoZSBwb2ludC4KKyAqLworCitNRVRIT0RERUYoYm9vbGVhbikKK2VuY29kZV9tY3VfRENfcmVmaW5lIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKK3sKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIHJlZ2lzdGVyIGludCB0ZW1wOworICBpbnQgYmxrbjsKKyAgaW50IEFsID0gY2luZm8tPkFsOworICBKQkxPQ0tST1cgYmxvY2s7CisKKyAgZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlOworICBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlciA9IGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcjsKKworICAvKiBFbWl0IHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZCAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpCisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCisgICAgICBlbWl0X3Jlc3RhcnQoZW50cm9weSwgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSk7CisKKyAgLyogRW5jb2RlIHRoZSBNQ1UgZGF0YSBibG9ja3MgKi8KKyAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKKyAgICBibG9jayA9IE1DVV9kYXRhW2Jsa25dOworCisgICAgLyogV2Ugc2ltcGx5IGVtaXQgdGhlIEFsJ3RoIGJpdCBvZiB0aGUgREMgY29lZmZpY2llbnQgdmFsdWUuICovCisgICAgdGVtcCA9ICgqYmxvY2spWzBdOworICAgIGVtaXRfYml0cyhlbnRyb3B5LCAodW5zaWduZWQgaW50KSAodGVtcCA+PiBBbCksIDEpOworICB9CisKKyAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlOworICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlcjsKKworICAvKiBVcGRhdGUgcmVzdGFydC1pbnRlcnZhbCBzdGF0ZSB0b28gKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApIHsKKyAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKys7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtICY9IDc7CisgICAgfQorICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogTUNVIGVuY29kaW5nIGZvciBBQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZW5jb2RlX21jdV9BQ19yZWZpbmUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreworICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgcmVnaXN0ZXIgaW50IHRlbXA7CisgIHJlZ2lzdGVyIGludCByLCBrOworICBpbnQgRU9COworICBjaGFyICpCUl9idWZmZXI7CisgIHVuc2lnbmVkIGludCBCUjsKKyAgaW50IFNlID0gY2luZm8tPlNlOworICBpbnQgQWwgPSBjaW5mby0+QWw7CisgIEpCTE9DS1JPVyBibG9jazsKKyAgaW50IGFic3ZhbHVlc1tEQ1RTSVpFMl07CisKKyAgZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlOworICBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlciA9IGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcjsKKworICAvKiBFbWl0IHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZCAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpCisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCisgICAgICBlbWl0X3Jlc3RhcnQoZW50cm9weSwgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSk7CisKKyAgLyogRW5jb2RlIHRoZSBNQ1UgZGF0YSBibG9jayAqLworICBibG9jayA9IE1DVV9kYXRhWzBdOworCisgIC8qIEl0IGlzIGNvbnZlbmllbnQgdG8gbWFrZSBhIHByZS1wYXNzIHRvIGRldGVybWluZSB0aGUgdHJhbnNmb3JtZWQKKyAgICogY29lZmZpY2llbnRzJyBhYnNvbHV0ZSB2YWx1ZXMgYW5kIHRoZSBFT0IgcG9zaXRpb24uCisgICAqLworICBFT0IgPSAwOworICBmb3IgKGsgPSBjaW5mby0+U3M7IGsgPD0gU2U7IGsrKykgeworICAgIHRlbXAgPSAoKmJsb2NrKVtqcGVnX25hdHVyYWxfb3JkZXJba11dOworICAgIC8qIFdlIG11c3QgYXBwbHkgdGhlIHBvaW50IHRyYW5zZm9ybSBieSBBbC4gIEZvciBBQyBjb2VmZmljaWVudHMgdGhpcworICAgICAqIGlzIGFuIGludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB0b3dhcmRzIDAuICBUbyBkbyB0aGlzIHBvcnRhYmx5CisgICAgICogaW4gQywgd2Ugc2hpZnQgYWZ0ZXIgb2J0YWluaW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBpZiAodGVtcCA8IDApCisgICAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLworICAgIHRlbXAgPj49IEFsOwkJLyogYXBwbHkgdGhlIHBvaW50IHRyYW5zZm9ybSAqLworICAgIGFic3ZhbHVlc1trXSA9IHRlbXA7CS8qIHNhdmUgYWJzIHZhbHVlIGZvciBtYWluIHBhc3MgKi8KKyAgICBpZiAodGVtcCA9PSAxKQorICAgICAgRU9CID0gazsJCQkvKiBFT0IgPSBpbmRleCBvZiBsYXN0IG5ld2x5LW5vbnplcm8gY29lZiAqLworICB9CisKKyAgLyogRW5jb2RlIHRoZSBBQyBjb2VmZmljaWVudHMgcGVyIHNlY3Rpb24gRy4xLjIuMywgZmlnLiBHLjcgKi8KKyAgCisgIHIgPSAwOwkJCS8qIHIgPSBydW4gbGVuZ3RoIG9mIHplcm9zICovCisgIEJSID0gMDsJCQkvKiBCUiA9IGNvdW50IG9mIGJ1ZmZlcmVkIGJpdHMgYWRkZWQgbm93ICovCisgIEJSX2J1ZmZlciA9IGVudHJvcHktPmJpdF9idWZmZXIgKyBlbnRyb3B5LT5CRTsgLyogQXBwZW5kIGJpdHMgdG8gYnVmZmVyICovCisKKyAgZm9yIChrID0gY2luZm8tPlNzOyBrIDw9IFNlOyBrKyspIHsKKyAgICBpZiAoKHRlbXAgPSBhYnN2YWx1ZXNba10pID09IDApIHsKKyAgICAgIHIrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIEVtaXQgYW55IHJlcXVpcmVkIFpSTHMsIGJ1dCBub3QgaWYgdGhleSBjYW4gYmUgZm9sZGVkIGludG8gRU9CICovCisgICAgd2hpbGUgKHIgPiAxNSAmJiBrIDw9IEVPQikgeworICAgICAgLyogZW1pdCBhbnkgcGVuZGluZyBFT0JSVU4gYW5kIHRoZSBCRSBjb3JyZWN0aW9uIGJpdHMgKi8KKyAgICAgIGVtaXRfZW9icnVuKGVudHJvcHkpOworICAgICAgLyogRW1pdCBaUkwgKi8KKyAgICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgMHhGMCk7CisgICAgICByIC09IDE2OworICAgICAgLyogRW1pdCBidWZmZXJlZCBjb3JyZWN0aW9uIGJpdHMgdGhhdCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBaUkwgKi8KKyAgICAgIGVtaXRfYnVmZmVyZWRfYml0cyhlbnRyb3B5LCBCUl9idWZmZXIsIEJSKTsKKyAgICAgIEJSX2J1ZmZlciA9IGVudHJvcHktPmJpdF9idWZmZXI7IC8qIEJFIGJpdHMgYXJlIGdvbmUgbm93ICovCisgICAgICBCUiA9IDA7CisgICAgfQorCisgICAgLyogSWYgdGhlIGNvZWYgd2FzIHByZXZpb3VzbHkgbm9uemVybywgaXQgb25seSBuZWVkcyBhIGNvcnJlY3Rpb24gYml0LgorICAgICAqIE5PVEU6IGEgc3RyYWlnaHQgdHJhbnNsYXRpb24gb2YgdGhlIHNwZWMncyBmaWd1cmUgRy43IHdvdWxkIHN1Z2dlc3QKKyAgICAgKiB0aGF0IHdlIGFsc28gbmVlZCB0byB0ZXN0IHIgPiAxNS4gIEJ1dCBpZiByID4gMTUsIHdlIGNhbiBvbmx5IGdldCBoZXJlCisgICAgICogaWYgayA+IEVPQiwgd2hpY2ggaW1wbGllcyB0aGF0IHRoaXMgY29lZmZpY2llbnQgaXMgbm90IDEuCisgICAgICovCisgICAgaWYgKHRlbXAgPiAxKSB7CisgICAgICAvKiBUaGUgY29ycmVjdGlvbiBiaXQgaXMgdGhlIG5leHQgYml0IG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZS4gKi8KKyAgICAgIEJSX2J1ZmZlcltCUisrXSA9IChjaGFyKSAodGVtcCAmIDEpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLyogRW1pdCBhbnkgcGVuZGluZyBFT0JSVU4gYW5kIHRoZSBCRSBjb3JyZWN0aW9uIGJpdHMgKi8KKyAgICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKworICAgIC8qIENvdW50L2VtaXQgSHVmZm1hbiBzeW1ib2wgZm9yIHJ1biBsZW5ndGggLyBudW1iZXIgb2YgYml0cyAqLworICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgKHIgPDwgNCkgKyAxKTsKKworICAgIC8qIEVtaXQgb3V0cHV0IGJpdCBmb3IgbmV3bHktbm9uemVybyBjb2VmICovCisgICAgdGVtcCA9ICgoKmJsb2NrKVtqcGVnX25hdHVyYWxfb3JkZXJba11dIDwgMCkgPyAwIDogMTsKKyAgICBlbWl0X2JpdHMoZW50cm9weSwgKHVuc2lnbmVkIGludCkgdGVtcCwgMSk7CisKKyAgICAvKiBFbWl0IGJ1ZmZlcmVkIGNvcnJlY3Rpb24gYml0cyB0aGF0IG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29kZSAqLworICAgIGVtaXRfYnVmZmVyZWRfYml0cyhlbnRyb3B5LCBCUl9idWZmZXIsIEJSKTsKKyAgICBCUl9idWZmZXIgPSBlbnRyb3B5LT5iaXRfYnVmZmVyOyAvKiBCRSBiaXRzIGFyZSBnb25lIG5vdyAqLworICAgIEJSID0gMDsKKyAgICByID0gMDsJCQkvKiByZXNldCB6ZXJvIHJ1biBsZW5ndGggKi8KKyAgfQorCisgIGlmIChyID4gMCB8fCBCUiA+IDApIHsJLyogSWYgdGhlcmUgYXJlIHRyYWlsaW5nIHplcm9lcywgKi8KKyAgICBlbnRyb3B5LT5FT0JSVU4rKzsJCS8qIGNvdW50IGFuIEVPQiAqLworICAgIGVudHJvcHktPkJFICs9IEJSOwkJLyogY29uY2F0IG15IGNvcnJlY3Rpb24gYml0cyB0byBvbGRlciBvbmVzICovCisgICAgLyogV2UgZm9yY2Ugb3V0IHRoZSBFT0IgaWYgd2UgcmlzayBlaXRoZXI6CisgICAgICogMS4gb3ZlcmZsb3cgb2YgdGhlIEVPQiBjb3VudGVyOworICAgICAqIDIuIG92ZXJmbG93IG9mIHRoZSBjb3JyZWN0aW9uIGJpdCBidWZmZXIgZHVyaW5nIHRoZSBuZXh0IE1DVS4KKyAgICAgKi8KKyAgICBpZiAoZW50cm9weS0+RU9CUlVOID09IDB4N0ZGRiB8fCBlbnRyb3B5LT5CRSA+IChNQVhfQ09SUl9CSVRTLURDVFNJWkUyKzEpKQorICAgICAgZW1pdF9lb2JydW4oZW50cm9weSk7CisgIH0KKworICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGU7CisgIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IGVudHJvcHktPmZyZWVfaW5fYnVmZmVyOworCisgIC8qIFVwZGF0ZSByZXN0YXJ0LWludGVydmFsIHN0YXRlIHRvbyAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkgeworICAgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKKyAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0rKzsKKyAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gJj0gNzsKKyAgICB9CisgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiBhIEh1ZmZtYW4tY29tcHJlc3NlZCBwcm9ncmVzc2l2ZSBzY2FuLgorICovCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX3Bhc3NfcGh1ZmYgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreyAgIAorICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKworICBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlID0gY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGU7CisgIGVudHJvcHktPmZyZWVfaW5fYnVmZmVyID0gY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyOworCisgIC8qIEZsdXNoIG91dCBhbnkgYnVmZmVyZWQgZGF0YSAqLworICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKyAgZmx1c2hfYml0cyhlbnRyb3B5KTsKKworICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGU7CisgIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IGVudHJvcHktPmZyZWVfaW5fYnVmZmVyOworfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYSBzdGF0aXN0aWNzLWdhdGhlcmluZyBwYXNzIGFuZCBjcmVhdGUgdGhlIG5ldyBIdWZmbWFuIHRhYmxlcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZpbmlzaF9wYXNzX2dhdGhlcl9waHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBib29sZWFuIGlzX0RDX2JhbmQ7CisgIGludCBjaSwgdGJsOworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKKyAgSkhVRkZfVEJMICoqaHRibHB0cjsKKyAgYm9vbGVhbiBkaWRbTlVNX0hVRkZfVEJMU107CisKKyAgLyogRmx1c2ggb3V0IGJ1ZmZlcmVkIGRhdGEgKGFsbCB3ZSBjYXJlIGFib3V0IGlzIGNvdW50aW5nIHRoZSBFT0Igc3ltYm9sKSAqLworICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKworICBpc19EQ19iYW5kID0gKGNpbmZvLT5TcyA9PSAwKTsKKworICAvKiBJdCdzIGltcG9ydGFudCBub3QgdG8gYXBwbHkganBlZ19nZW5fb3B0aW1hbF90YWJsZSBtb3JlIHRoYW4gb25jZQorICAgKiBwZXIgdGFibGUsIGJlY2F1c2UgaXQgY2xvYmJlcnMgdGhlIGlucHV0IGZyZXF1ZW5jeSBjb3VudHMhCisgICAqLworICBNRU1aRVJPKGRpZCwgU0laRU9GKGRpZCkpOworCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICBpZiAoaXNfRENfYmFuZCkgeworICAgICAgaWYgKGNpbmZvLT5BaCAhPSAwKQkvKiBEQyByZWZpbmVtZW50IG5lZWRzIG5vIHRhYmxlICovCisJY29udGludWU7CisgICAgICB0YmwgPSBjb21wcHRyLT5kY190Ymxfbm87CisgICAgfSBlbHNlIHsKKyAgICAgIHRibCA9IGNvbXBwdHItPmFjX3RibF9ubzsKKyAgICB9CisgICAgaWYgKCEgZGlkW3RibF0pIHsKKyAgICAgIGlmIChpc19EQ19iYW5kKQorICAgICAgICBodGJscHRyID0gJiBjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1t0YmxdOworICAgICAgZWxzZQorICAgICAgICBodGJscHRyID0gJiBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1t0YmxdOworICAgICAgaWYgKCpodGJscHRyID09IE5VTEwpCisgICAgICAgICpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgICAgIGpwZWdfZ2VuX29wdGltYWxfdGFibGUoY2luZm8sICpodGJscHRyLCBlbnRyb3B5LT5jb3VudF9wdHJzW3RibF0pOworICAgICAgZGlkW3RibF0gPSBUUlVFOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgcHJvZ3Jlc3NpdmUgSHVmZm1hbiBlbnRyb3B5IGVuY29kaW5nLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfcGh1ZmZfZW5jb2RlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHk7CisgIGludCBpOworCisgIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YocGh1ZmZfZW50cm9weV9lbmNvZGVyKSk7CisgIGNpbmZvLT5lbnRyb3B5ID0gKHN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciAqKSBlbnRyb3B5OworICBlbnRyb3B5LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfcGh1ZmY7CisKKyAgLyogTWFyayB0YWJsZXMgdW5hbGxvY2F0ZWQgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgeworICAgIGVudHJvcHktPmRlcml2ZWRfdGJsc1tpXSA9IE5VTEw7CisgICAgZW50cm9weS0+Y291bnRfcHRyc1tpXSA9IE5VTEw7CisgIH0KKyAgZW50cm9weS0+Yml0X2J1ZmZlciA9IE5VTEw7CS8qIG5lZWRlZCBvbmx5IGluIEFDIHJlZmluZW1lbnQgc2NhbiAqLworfQorCisjZW5kaWYgLyogQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY3ByZXBjdC5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjcHJlcGN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE5MzMzMwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY3ByZXBjdC5jCkBAIC0wLDAgKzEsMzU0IEBACisvKgorICogamNwcmVwY3QuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb21wcmVzc2lvbiBwcmVwcm9jZXNzaW5nIGNvbnRyb2xsZXIuCisgKiBUaGlzIGNvbnRyb2xsZXIgbWFuYWdlcyB0aGUgY29sb3IgY29udmVyc2lvbiwgZG93bnNhbXBsaW5nLAorICogYW5kIGVkZ2UgZXhwYW5zaW9uIHN0ZXBzLgorICoKKyAqIE1vc3Qgb2YgdGhlIGNvbXBsZXhpdHkgaGVyZSBpcyBhc3NvY2lhdGVkIHdpdGggYnVmZmVyaW5nIGlucHV0IHJvd3MKKyAqIGFzIHJlcXVpcmVkIGJ5IHRoZSBkb3duc2FtcGxlci4gIFNlZSB0aGUgY29tbWVudHMgYXQgdGhlIGhlYWQgb2YKKyAqIGpjc2FtcGxlLmMgZm9yIHRoZSBkb3duc2FtcGxlcidzIG5lZWRzLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKiBBdCBwcmVzZW50LCBqY3NhbXBsZS5jIGNhbiByZXF1ZXN0IGNvbnRleHQgcm93cyBvbmx5IGZvciBzbW9vdGhpbmcuCisgKiBJbiB0aGUgZnV0dXJlLCB3ZSBtaWdodCBhbHNvIG5lZWQgY29udGV4dCByb3dzIGZvciBDQ0lSNjAxIHNhbXBsaW5nCisgKiBvciBvdGhlciBtb3JlLWNvbXBsZXggZG93bnNhbXBsaW5nIHByb2NlZHVyZXMuICBUaGUgY29kZSB0byBzdXBwb3J0CisgKiBjb250ZXh0IHJvd3Mgc2hvdWxkIGJlIGNvbXBpbGVkIG9ubHkgaWYgbmVlZGVkLgorICovCisjaWZkZWYgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRAorI2RlZmluZSBDT05URVhUX1JPV1NfU1VQUE9SVEVECisjZW5kaWYKKworCisvKgorICogRm9yIHRoZSBzaW1wbGUgKG5vLWNvbnRleHQtcm93KSBjYXNlLCB3ZSBqdXN0IG5lZWQgdG8gYnVmZmVyIG9uZQorICogcm93IGdyb3VwJ3Mgd29ydGggb2YgcGl4ZWxzIGZvciB0aGUgZG93bnNhbXBsaW5nIHN0ZXAuICBBdCB0aGUgYm90dG9tIG9mCisgKiB0aGUgaW1hZ2UsIHdlIHBhZCB0byBhIGZ1bGwgcm93IGdyb3VwIGJ5IHJlcGxpY2F0aW5nIHRoZSBsYXN0IHBpeGVsIHJvdy4KKyAqIFRoZSBkb3duc2FtcGxlcidzIGxhc3Qgb3V0cHV0IHJvdyBpcyB0aGVuIHJlcGxpY2F0ZWQgaWYgbmVlZGVkIHRvIHBhZAorICogb3V0IHRvIGEgZnVsbCBpTUNVIHJvdy4KKyAqCisgKiBXaGVuIHByb3ZpZGluZyBjb250ZXh0IHJvd3MsIHdlIG11c3QgYnVmZmVyIHRocmVlIHJvdyBncm91cHMnIHdvcnRoIG9mCisgKiBwaXhlbHMuICBUaHJlZSByb3cgZ3JvdXBzIGFyZSBwaHlzaWNhbGx5IGFsbG9jYXRlZCwgYnV0IHRoZSByb3cgcG9pbnRlcgorICogYXJyYXlzIGFyZSBtYWRlIGZpdmUgcm93IGdyb3VwcyBoaWdoLCB3aXRoIHRoZSBleHRyYSBwb2ludGVycyBhYm92ZSBhbmQKKyAqIGJlbG93ICJ3cmFwcGluZyBhcm91bmQiIHRvIHBvaW50IHRvIHRoZSBsYXN0IGFuZCBmaXJzdCByZWFsIHJvdyBncm91cHMuCisgKiBUaGlzIGFsbG93cyB0aGUgZG93bnNhbXBsZXIgdG8gYWNjZXNzIHRoZSBwcm9wZXIgY29udGV4dCByb3dzLgorICogQXQgdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBpbWFnZSwgd2UgY3JlYXRlIGR1bW15IGNvbnRleHQgcm93cyBieQorICogY29weWluZyB0aGUgZmlyc3Qgb3IgbGFzdCByZWFsIHBpeGVsIHJvdy4gIFRoaXMgY29weWluZyBjb3VsZCBiZSBhdm9pZGVkCisgKiBieSBwb2ludGVyIGhhY2tpbmcgYXMgaXMgZG9uZSBpbiBqZG1haW5jdC5jLCBidXQgaXQgZG9lc24ndCBzZWVtIHdvcnRoIHRoZQorICogdHJvdWJsZSBvbiB0aGUgY29tcHJlc3Npb24gc2lkZS4KKyAqLworCisKKy8qIFByaXZhdGUgYnVmZmVyIGNvbnRyb2xsZXIgb2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfY19wcmVwX2NvbnRyb2xsZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogRG93bnNhbXBsaW5nIGlucHV0IGJ1ZmZlci4gIFRoaXMgYnVmZmVyIGhvbGRzIGNvbG9yLWNvbnZlcnRlZCBkYXRhCisgICAqIHVudGlsIHdlIGhhdmUgZW5vdWdoIHRvIGRvIGEgZG93bnNhbXBsZSBzdGVwLgorICAgKi8KKyAgSlNBTVBBUlJBWSBjb2xvcl9idWZbTUFYX0NPTVBPTkVOVFNdOworCisgIEpESU1FTlNJT04gcm93c190b19nbzsJLyogY291bnRzIHJvd3MgcmVtYWluaW5nIGluIHNvdXJjZSBpbWFnZSAqLworICBpbnQgbmV4dF9idWZfcm93OwkJLyogaW5kZXggb2YgbmV4dCByb3cgdG8gc3RvcmUgaW4gY29sb3JfYnVmICovCisKKyNpZmRlZiBDT05URVhUX1JPV1NfU1VQUE9SVEVECS8qIG9ubHkgbmVlZGVkIGZvciBjb250ZXh0IGNhc2UgKi8KKyAgaW50IHRoaXNfcm93X2dyb3VwOwkJLyogc3RhcnRpbmcgcm93IGluZGV4IG9mIGdyb3VwIHRvIHByb2Nlc3MgKi8KKyAgaW50IG5leHRfYnVmX3N0b3A7CQkvKiBkb3duc2FtcGxlIHdoZW4gd2UgcmVhY2ggdGhpcyBpbmRleCAqLworI2VuZGlmCit9IG15X3ByZXBfY29udHJvbGxlcjsKKwordHlwZWRlZiBteV9wcmVwX2NvbnRyb2xsZXIgKiBteV9wcmVwX3B0cjsKKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBwcm9jZXNzaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX3ByZXAgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkKK3sKKyAgbXlfcHJlcF9wdHIgcHJlcCA9IChteV9wcmVwX3B0cikgY2luZm8tPnByZXA7CisKKyAgaWYgKHBhc3NfbW9kZSAhPSBKQlVGX1BBU1NfVEhSVSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisKKyAgLyogSW5pdGlhbGl6ZSB0b3RhbC1oZWlnaHQgY291bnRlciBmb3IgZGV0ZWN0aW5nIGJvdHRvbSBvZiBpbWFnZSAqLworICBwcmVwLT5yb3dzX3RvX2dvID0gY2luZm8tPmltYWdlX2hlaWdodDsKKyAgLyogTWFyayB0aGUgY29udmVyc2lvbiBidWZmZXIgZW1wdHkgKi8KKyAgcHJlcC0+bmV4dF9idWZfcm93ID0gMDsKKyNpZmRlZiBDT05URVhUX1JPV1NfU1VQUE9SVEVECisgIC8qIFByZXNldCBhZGRpdGlvbmFsIHN0YXRlIHZhcmlhYmxlcyBmb3IgY29udGV4dCBtb2RlLgorICAgKiBUaGVzZSBhcmVuJ3QgdXNlZCBpbiBub24tY29udGV4dCBtb2RlLCBzbyB3ZSBuZWVkbid0IHRlc3Qgd2hpY2ggbW9kZS4KKyAgICovCisgIHByZXAtPnRoaXNfcm93X2dyb3VwID0gMDsKKyAgLyogU2V0IG5leHRfYnVmX3N0b3AgdG8gc3RvcCBhZnRlciB0d28gcm93IGdyb3VwcyBoYXZlIGJlZW4gcmVhZCBpbi4gKi8KKyAgcHJlcC0+bmV4dF9idWZfc3RvcCA9IDIgKiBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7CisjZW5kaWYKK30KKworCisvKgorICogRXhwYW5kIGFuIGltYWdlIHZlcnRpY2FsbHkgZnJvbSBoZWlnaHQgaW5wdXRfcm93cyB0byBoZWlnaHQgb3V0cHV0X3Jvd3MsCisgKiBieSBkdXBsaWNhdGluZyB0aGUgYm90dG9tIHJvdy4KKyAqLworCitMT0NBTCh2b2lkKQorZXhwYW5kX2JvdHRvbV9lZGdlIChKU0FNUEFSUkFZIGltYWdlX2RhdGEsIEpESU1FTlNJT04gbnVtX2NvbHMsCisJCSAgICBpbnQgaW5wdXRfcm93cywgaW50IG91dHB1dF9yb3dzKQoreworICByZWdpc3RlciBpbnQgcm93OworCisgIGZvciAocm93ID0gaW5wdXRfcm93czsgcm93IDwgb3V0cHV0X3Jvd3M7IHJvdysrKSB7CisgICAgamNvcHlfc2FtcGxlX3Jvd3MoaW1hZ2VfZGF0YSwgaW5wdXRfcm93cy0xLCBpbWFnZV9kYXRhLCByb3csCisJCSAgICAgIDEsIG51bV9jb2xzKTsKKyAgfQorfQorCisKKy8qCisgKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiB0aGUgc2ltcGxlIG5vLWNvbnRleHQgY2FzZS4KKyAqCisgKiBQcmVwcm9jZXNzb3Igb3V0cHV0IGRhdGEgaXMgY291bnRlZCBpbiAicm93IGdyb3VwcyIuICBBIHJvdyBncm91cAorICogaXMgZGVmaW5lZCB0byBiZSB2X3NhbXBfZmFjdG9yIHNhbXBsZSByb3dzIG9mIGVhY2ggY29tcG9uZW50LgorICogRG93bnNhbXBsaW5nIHdpbGwgcHJvZHVjZSB0aGlzIG11Y2ggZGF0YSBmcm9tIGVhY2ggbWF4X3Zfc2FtcF9mYWN0b3IKKyAqIGlucHV0IHJvd3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwcmVfcHJvY2Vzc19kYXRhIChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwKKwkJICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwsCisJCSAgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2dyb3VwX2N0ciwKKwkJICBKRElNRU5TSU9OIG91dF9yb3dfZ3JvdXBzX2F2YWlsKQoreworICBteV9wcmVwX3B0ciBwcmVwID0gKG15X3ByZXBfcHRyKSBjaW5mby0+cHJlcDsKKyAgaW50IG51bXJvd3MsIGNpOworICBKRElNRU5TSU9OIGlucm93czsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgd2hpbGUgKCppbl9yb3dfY3RyIDwgaW5fcm93c19hdmFpbCAmJgorCSAqb3V0X3Jvd19ncm91cF9jdHIgPCBvdXRfcm93X2dyb3Vwc19hdmFpbCkgeworICAgIC8qIERvIGNvbG9yIGNvbnZlcnNpb24gdG8gZmlsbCB0aGUgY29udmVyc2lvbiBidWZmZXIuICovCisgICAgaW5yb3dzID0gaW5fcm93c19hdmFpbCAtICppbl9yb3dfY3RyOworICAgIG51bXJvd3MgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgLSBwcmVwLT5uZXh0X2J1Zl9yb3c7CisgICAgbnVtcm93cyA9IChpbnQpIE1JTigoSkRJTUVOU0lPTikgbnVtcm93cywgaW5yb3dzKTsKKyAgICAoKmNpbmZvLT5jY29udmVydC0+Y29sb3JfY29udmVydCkgKGNpbmZvLCBpbnB1dF9idWYgKyAqaW5fcm93X2N0ciwKKwkJCQkgICAgICAgcHJlcC0+Y29sb3JfYnVmLAorCQkJCSAgICAgICAoSkRJTUVOU0lPTikgcHJlcC0+bmV4dF9idWZfcm93LAorCQkJCSAgICAgICBudW1yb3dzKTsKKyAgICAqaW5fcm93X2N0ciArPSBudW1yb3dzOworICAgIHByZXAtPm5leHRfYnVmX3JvdyArPSBudW1yb3dzOworICAgIHByZXAtPnJvd3NfdG9fZ28gLT0gbnVtcm93czsKKyAgICAvKiBJZiBhdCBib3R0b20gb2YgaW1hZ2UsIHBhZCB0byBmaWxsIHRoZSBjb252ZXJzaW9uIGJ1ZmZlci4gKi8KKyAgICBpZiAocHJlcC0+cm93c190b19nbyA9PSAwICYmCisJcHJlcC0+bmV4dF9idWZfcm93IDwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7CisgICAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKwlleHBhbmRfYm90dG9tX2VkZ2UocHJlcC0+Y29sb3JfYnVmW2NpXSwgY2luZm8tPmltYWdlX3dpZHRoLAorCQkJICAgcHJlcC0+bmV4dF9idWZfcm93LCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpOworICAgICAgfQorICAgICAgcHJlcC0+bmV4dF9idWZfcm93ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOworICAgIH0KKyAgICAvKiBJZiB3ZSd2ZSBmaWxsZWQgdGhlIGNvbnZlcnNpb24gYnVmZmVyLCBlbXB0eSBpdC4gKi8KKyAgICBpZiAocHJlcC0+bmV4dF9idWZfcm93ID09IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgeworICAgICAgKCpjaW5mby0+ZG93bnNhbXBsZS0+ZG93bnNhbXBsZSkgKGNpbmZvLAorCQkJCQlwcmVwLT5jb2xvcl9idWYsIChKRElNRU5TSU9OKSAwLAorCQkJCQlvdXRwdXRfYnVmLCAqb3V0X3Jvd19ncm91cF9jdHIpOworICAgICAgcHJlcC0+bmV4dF9idWZfcm93ID0gMDsKKyAgICAgICgqb3V0X3Jvd19ncm91cF9jdHIpKys7CisgICAgfQorICAgIC8qIElmIGF0IGJvdHRvbSBvZiBpbWFnZSwgcGFkIHRoZSBvdXRwdXQgdG8gYSBmdWxsIGlNQ1UgaGVpZ2h0LgorICAgICAqIE5vdGUgd2UgYXNzdW1lIHRoZSBjYWxsZXIgaXMgcHJvdmlkaW5nIGEgb25lLWlNQ1UtaGVpZ2h0IG91dHB1dCBidWZmZXIhCisgICAgICovCisgICAgaWYgKHByZXAtPnJvd3NfdG9fZ28gPT0gMCAmJgorCSpvdXRfcm93X2dyb3VwX2N0ciA8IG91dF9yb3dfZ3JvdXBzX2F2YWlsKSB7CisgICAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworCSAgIGNpKyssIGNvbXBwdHIrKykgeworCWV4cGFuZF9ib3R0b21fZWRnZShvdXRwdXRfYnVmW2NpXSwKKwkJCSAgIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUsCisJCQkgICAoaW50KSAoKm91dF9yb3dfZ3JvdXBfY3RyICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvciksCisJCQkgICAoaW50KSAob3V0X3Jvd19ncm91cHNfYXZhaWwgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSk7CisgICAgICB9CisgICAgICAqb3V0X3Jvd19ncm91cF9jdHIgPSBvdXRfcm93X2dyb3Vwc19hdmFpbDsKKyAgICAgIGJyZWFrOwkJCS8qIGNhbiBleGl0IG91dGVyIGxvb3Agd2l0aG91dCB0ZXN0ICovCisgICAgfQorICB9Cit9CisKKworI2lmZGVmIENPTlRFWFRfUk9XU19TVVBQT1JURUQKKworLyoKKyAqIFByb2Nlc3Mgc29tZSBkYXRhIGluIHRoZSBjb250ZXh0IGNhc2UuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwcmVfcHJvY2Vzc19jb250ZXh0IChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJICAgICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwKKwkJICAgICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwsCisJCSAgICAgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2dyb3VwX2N0ciwKKwkJICAgICBKRElNRU5TSU9OIG91dF9yb3dfZ3JvdXBzX2F2YWlsKQoreworICBteV9wcmVwX3B0ciBwcmVwID0gKG15X3ByZXBfcHRyKSBjaW5mby0+cHJlcDsKKyAgaW50IG51bXJvd3MsIGNpOworICBpbnQgYnVmX2hlaWdodCA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIDM7CisgIEpESU1FTlNJT04gaW5yb3dzOworCisgIHdoaWxlICgqb3V0X3Jvd19ncm91cF9jdHIgPCBvdXRfcm93X2dyb3Vwc19hdmFpbCkgeworICAgIGlmICgqaW5fcm93X2N0ciA8IGluX3Jvd3NfYXZhaWwpIHsKKyAgICAgIC8qIERvIGNvbG9yIGNvbnZlcnNpb24gdG8gZmlsbCB0aGUgY29udmVyc2lvbiBidWZmZXIuICovCisgICAgICBpbnJvd3MgPSBpbl9yb3dzX2F2YWlsIC0gKmluX3Jvd19jdHI7CisgICAgICBudW1yb3dzID0gcHJlcC0+bmV4dF9idWZfc3RvcCAtIHByZXAtPm5leHRfYnVmX3JvdzsKKyAgICAgIG51bXJvd3MgPSAoaW50KSBNSU4oKEpESU1FTlNJT04pIG51bXJvd3MsIGlucm93cyk7CisgICAgICAoKmNpbmZvLT5jY29udmVydC0+Y29sb3JfY29udmVydCkgKGNpbmZvLCBpbnB1dF9idWYgKyAqaW5fcm93X2N0ciwKKwkJCQkJIHByZXAtPmNvbG9yX2J1ZiwKKwkJCQkJIChKRElNRU5TSU9OKSBwcmVwLT5uZXh0X2J1Zl9yb3csCisJCQkJCSBudW1yb3dzKTsKKyAgICAgIC8qIFBhZCBhdCB0b3Agb2YgaW1hZ2UsIGlmIGZpcnN0IHRpbWUgdGhyb3VnaCAqLworICAgICAgaWYgKHByZXAtPnJvd3NfdG9fZ28gPT0gY2luZm8tPmltYWdlX2hlaWdodCkgeworCWZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworCSAgaW50IHJvdzsKKwkgIGZvciAocm93ID0gMTsgcm93IDw9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3Rvcjsgcm93KyspIHsKKwkgICAgamNvcHlfc2FtcGxlX3Jvd3MocHJlcC0+Y29sb3JfYnVmW2NpXSwgMCwKKwkJCSAgICAgIHByZXAtPmNvbG9yX2J1ZltjaV0sIC1yb3csCisJCQkgICAgICAxLCBjaW5mby0+aW1hZ2Vfd2lkdGgpOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgICppbl9yb3dfY3RyICs9IG51bXJvd3M7CisgICAgICBwcmVwLT5uZXh0X2J1Zl9yb3cgKz0gbnVtcm93czsKKyAgICAgIHByZXAtPnJvd3NfdG9fZ28gLT0gbnVtcm93czsKKyAgICB9IGVsc2UgeworICAgICAgLyogUmV0dXJuIGZvciBtb3JlIGRhdGEsIHVubGVzcyB3ZSBhcmUgYXQgdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UuICovCisgICAgICBpZiAocHJlcC0+cm93c190b19nbyAhPSAwKQorCWJyZWFrOworICAgICAgLyogV2hlbiBhdCBib3R0b20gb2YgaW1hZ2UsIHBhZCB0byBmaWxsIHRoZSBjb252ZXJzaW9uIGJ1ZmZlci4gKi8KKyAgICAgIGlmIChwcmVwLT5uZXh0X2J1Zl9yb3cgPCBwcmVwLT5uZXh0X2J1Zl9zdG9wKSB7CisJZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisJICBleHBhbmRfYm90dG9tX2VkZ2UocHJlcC0+Y29sb3JfYnVmW2NpXSwgY2luZm8tPmltYWdlX3dpZHRoLAorCQkJICAgICBwcmVwLT5uZXh0X2J1Zl9yb3csIHByZXAtPm5leHRfYnVmX3N0b3ApOworCX0KKwlwcmVwLT5uZXh0X2J1Zl9yb3cgPSBwcmVwLT5uZXh0X2J1Zl9zdG9wOworICAgICAgfQorICAgIH0KKyAgICAvKiBJZiB3ZSd2ZSBnb3R0ZW4gZW5vdWdoIGRhdGEsIGRvd25zYW1wbGUgYSByb3cgZ3JvdXAuICovCisgICAgaWYgKHByZXAtPm5leHRfYnVmX3JvdyA9PSBwcmVwLT5uZXh0X2J1Zl9zdG9wKSB7CisgICAgICAoKmNpbmZvLT5kb3duc2FtcGxlLT5kb3duc2FtcGxlKSAoY2luZm8sCisJCQkJCXByZXAtPmNvbG9yX2J1ZiwKKwkJCQkJKEpESU1FTlNJT04pIHByZXAtPnRoaXNfcm93X2dyb3VwLAorCQkJCQlvdXRwdXRfYnVmLCAqb3V0X3Jvd19ncm91cF9jdHIpOworICAgICAgKCpvdXRfcm93X2dyb3VwX2N0cikrKzsKKyAgICAgIC8qIEFkdmFuY2UgcG9pbnRlcnMgd2l0aCB3cmFwYXJvdW5kIGFzIG5lY2Vzc2FyeS4gKi8KKyAgICAgIHByZXAtPnRoaXNfcm93X2dyb3VwICs9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKKyAgICAgIGlmIChwcmVwLT50aGlzX3Jvd19ncm91cCA+PSBidWZfaGVpZ2h0KQorCXByZXAtPnRoaXNfcm93X2dyb3VwID0gMDsKKyAgICAgIGlmIChwcmVwLT5uZXh0X2J1Zl9yb3cgPj0gYnVmX2hlaWdodCkKKwlwcmVwLT5uZXh0X2J1Zl9yb3cgPSAwOworICAgICAgcHJlcC0+bmV4dF9idWZfc3RvcCA9IHByZXAtPm5leHRfYnVmX3JvdyArIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKKyAgICB9CisgIH0KK30KKworCisvKgorICogQ3JlYXRlIHRoZSB3cmFwcGVkLWFyb3VuZCBkb3duc2FtcGxpbmcgaW5wdXQgYnVmZmVyIG5lZWRlZCBmb3IgY29udGV4dCBtb2RlLgorICovCisKK0xPQ0FMKHZvaWQpCitjcmVhdGVfY29udGV4dF9idWZmZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9wcmVwX3B0ciBwcmVwID0gKG15X3ByZXBfcHRyKSBjaW5mby0+cHJlcDsKKyAgaW50IHJncm91cF9oZWlnaHQgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7CisgIGludCBjaSwgaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisgIEpTQU1QQVJSQVkgdHJ1ZV9idWZmZXIsIGZha2VfYnVmZmVyOworCisgIC8qIEdyYWIgZW5vdWdoIHNwYWNlIGZvciBmYWtlIHJvdyBwb2ludGVycyBmb3IgYWxsIHRoZSBjb21wb25lbnRzOworICAgKiB3ZSBuZWVkIGZpdmUgcm93IGdyb3Vwcycgd29ydGggb2YgcG9pbnRlcnMgZm9yIGVhY2ggY29tcG9uZW50LgorICAgKi8KKyAgZmFrZV9idWZmZXIgPSAoSlNBTVBBUlJBWSkKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCShjaW5mby0+bnVtX2NvbXBvbmVudHMgKiA1ICogcmdyb3VwX2hlaWdodCkgKgorCQkJCVNJWkVPRihKU0FNUFJPVykpOworCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgLyogQWxsb2NhdGUgdGhlIGFjdHVhbCBidWZmZXIgc3BhY2UgKDMgcm93IGdyb3VwcykgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqIFdlIG1ha2UgdGhlIGJ1ZmZlciB3aWRlIGVub3VnaCB0byBhbGxvdyB0aGUgZG93bnNhbXBsZXIgdG8gZWRnZS1leHBhbmQKKyAgICAgKiBob3Jpem9udGFsbHkgd2l0aGluIHRoZSBidWZmZXIsIGlmIGl0IHNvIGNob29zZXMuCisgICAgICovCisgICAgdHJ1ZV9idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgICAgKEpESU1FTlNJT04pICgoKGxvbmcpIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUgKgorCQkgICAgICBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IpIC8gY29tcHB0ci0+aF9zYW1wX2ZhY3RvciksCisgICAgICAgKEpESU1FTlNJT04pICgzICogcmdyb3VwX2hlaWdodCkpOworICAgIC8qIENvcHkgdHJ1ZSBidWZmZXIgcm93IHBvaW50ZXJzIGludG8gdGhlIG1pZGRsZSBvZiB0aGUgZmFrZSByb3cgYXJyYXkgKi8KKyAgICBNRU1DT1BZKGZha2VfYnVmZmVyICsgcmdyb3VwX2hlaWdodCwgdHJ1ZV9idWZmZXIsCisJICAgIDMgKiByZ3JvdXBfaGVpZ2h0ICogU0laRU9GKEpTQU1QUk9XKSk7CisgICAgLyogRmlsbCBpbiB0aGUgYWJvdmUgYW5kIGJlbG93IHdyYXBhcm91bmQgcG9pbnRlcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcmdyb3VwX2hlaWdodDsgaSsrKSB7CisgICAgICBmYWtlX2J1ZmZlcltpXSA9IHRydWVfYnVmZmVyWzIgKiByZ3JvdXBfaGVpZ2h0ICsgaV07CisgICAgICBmYWtlX2J1ZmZlcls0ICogcmdyb3VwX2hlaWdodCArIGldID0gdHJ1ZV9idWZmZXJbaV07CisgICAgfQorICAgIHByZXAtPmNvbG9yX2J1ZltjaV0gPSBmYWtlX2J1ZmZlciArIHJncm91cF9oZWlnaHQ7CisgICAgZmFrZV9idWZmZXIgKz0gNSAqIHJncm91cF9oZWlnaHQ7IC8qIHBvaW50IHRvIHNwYWNlIGZvciBuZXh0IGNvbXBvbmVudCAqLworICB9Cit9CisKKyNlbmRpZiAvKiBDT05URVhUX1JPV1NfU1VQUE9SVEVEICovCisKKworLyoKKyAqIEluaXRpYWxpemUgcHJlcHJvY2Vzc2luZyBjb250cm9sbGVyLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfY19wcmVwX2NvbnRyb2xsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpCit7CisgIG15X3ByZXBfcHRyIHByZXA7CisgIGludCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgaWYgKG5lZWRfZnVsbF9idWZmZXIpCQkvKiBzYWZldHkgY2hlY2sgKi8KKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisKKyAgcHJlcCA9IChteV9wcmVwX3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9wcmVwX2NvbnRyb2xsZXIpKTsKKyAgY2luZm8tPnByZXAgPSAoc3RydWN0IGpwZWdfY19wcmVwX2NvbnRyb2xsZXIgKikgcHJlcDsKKyAgcHJlcC0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX3ByZXA7CisKKyAgLyogQWxsb2NhdGUgdGhlIGNvbG9yIGNvbnZlcnNpb24gYnVmZmVyLgorICAgKiBXZSBtYWtlIHRoZSBidWZmZXIgd2lkZSBlbm91Z2ggdG8gYWxsb3cgdGhlIGRvd25zYW1wbGVyIHRvIGVkZ2UtZXhwYW5kCisgICAqIGhvcml6b250YWxseSB3aXRoaW4gdGhlIGJ1ZmZlciwgaWYgaXQgc28gY2hvb3Nlcy4KKyAgICovCisgIGlmIChjaW5mby0+ZG93bnNhbXBsZS0+bmVlZF9jb250ZXh0X3Jvd3MpIHsKKyAgICAvKiBTZXQgdXAgdG8gcHJvdmlkZSBjb250ZXh0IHJvd3MgKi8KKyNpZmRlZiBDT05URVhUX1JPV1NfU1VQUE9SVEVECisgICAgcHJlcC0+cHViLnByZV9wcm9jZXNzX2RhdGEgPSBwcmVfcHJvY2Vzc19jb250ZXh0OworICAgIGNyZWF0ZV9jb250ZXh0X2J1ZmZlcihjaW5mbyk7CisjZWxzZQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIC8qIE5vIGNvbnRleHQsIGp1c3QgbWFrZSBpdCB0YWxsIGVub3VnaCBmb3Igb25lIHJvdyBncm91cCAqLworICAgIHByZXAtPnB1Yi5wcmVfcHJvY2Vzc19kYXRhID0gcHJlX3Byb2Nlc3NfZGF0YTsKKyAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworCSBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAgIHByZXAtPmNvbG9yX2J1ZltjaV0gPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCSAoSkRJTUVOU0lPTikgKCgobG9uZykgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRSAqCisJCQljaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IpIC8gY29tcHB0ci0+aF9zYW1wX2ZhY3RvciksCisJIChKRElNRU5TSU9OKSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjc2FtcGxlLmMgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamNzYW1wbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTJlYzg3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjc2FtcGxlLmMKQEAgLTAsMCArMSw1MTkgQEAKKy8qCisgKiBqY3NhbXBsZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZG93bnNhbXBsaW5nIHJvdXRpbmVzLgorICoKKyAqIERvd25zYW1wbGluZyBpbnB1dCBkYXRhIGlzIGNvdW50ZWQgaW4gInJvdyBncm91cHMiLiAgQSByb3cgZ3JvdXAKKyAqIGlzIGRlZmluZWQgdG8gYmUgbWF4X3Zfc2FtcF9mYWN0b3IgcGl4ZWwgcm93cyBvZiBlYWNoIGNvbXBvbmVudCwKKyAqIGZyb20gd2hpY2ggdGhlIGRvd25zYW1wbGVyIHByb2R1Y2VzIHZfc2FtcF9mYWN0b3Igc2FtcGxlIHJvd3MuCisgKiBBIHNpbmdsZSByb3cgZ3JvdXAgaXMgcHJvY2Vzc2VkIGluIGVhY2ggY2FsbCB0byB0aGUgZG93bnNhbXBsZXIgbW9kdWxlLgorICoKKyAqIFRoZSBkb3duc2FtcGxlciBpcyByZXNwb25zaWJsZSBmb3IgZWRnZS1leHBhbnNpb24gb2YgaXRzIG91dHB1dCBkYXRhCisgKiB0byBmaWxsIGFuIGludGVncmFsIG51bWJlciBvZiBEQ1QgYmxvY2tzIGhvcml6b250YWxseS4gIFRoZSBzb3VyY2UgYnVmZmVyCisgKiBtYXkgYmUgbW9kaWZpZWQgaWYgaXQgaXMgaGVscGZ1bCBmb3IgdGhpcyBwdXJwb3NlICh0aGUgc291cmNlIGJ1ZmZlciBpcworICogYWxsb2NhdGVkIHdpZGUgZW5vdWdoIHRvIGNvcnJlc3BvbmQgdG8gdGhlIGRlc2lyZWQgb3V0cHV0IHdpZHRoKS4KKyAqIFRoZSBjYWxsZXIgKHRoZSBwcmVwIGNvbnRyb2xsZXIpIGlzIHJlc3BvbnNpYmxlIGZvciB2ZXJ0aWNhbCBwYWRkaW5nLgorICoKKyAqIFRoZSBkb3duc2FtcGxlciBtYXkgcmVxdWVzdCAiY29udGV4dCByb3dzIiBieSBzZXR0aW5nIG5lZWRfY29udGV4dF9yb3dzCisgKiBkdXJpbmcgc3RhcnR1cC4gIEluIHRoaXMgY2FzZSwgdGhlIGlucHV0IGFycmF5cyB3aWxsIGNvbnRhaW4gYXQgbGVhc3QKKyAqIG9uZSByb3cgZ3JvdXAncyB3b3J0aCBvZiBwaXhlbHMgYWJvdmUgYW5kIGJlbG93IHRoZSBwYXNzZWQtaW4gZGF0YTsKKyAqIHRoZSBjYWxsZXIgd2lsbCBjcmVhdGUgZHVtbXkgcm93cyBhdCBpbWFnZSB0b3AgYW5kIGJvdHRvbSBieSByZXBsaWNhdGluZworICogdGhlIGZpcnN0IG9yIGxhc3QgcmVhbCBwaXhlbCByb3cuCisgKgorICogQW4gZXhjZWxsZW50IHJlZmVyZW5jZSBmb3IgaW1hZ2UgcmVzYW1wbGluZyBpcworICogICBEaWdpdGFsIEltYWdlIFdhcnBpbmcsIEdlb3JnZSBXb2xiZXJnLCAxOTkwLgorICogICBQdWIuIGJ5IElFRUUgQ29tcHV0ZXIgU29jaWV0eSBQcmVzcywgTG9zIEFsYW1pdG9zLCBDQS4gSVNCTiAwLTgxODYtODk0NC03LgorICoKKyAqIFRoZSBkb3duc2FtcGxpbmcgYWxnb3JpdGhtIHVzZWQgaGVyZSBpcyBhIHNpbXBsZSBhdmVyYWdlIG9mIHRoZSBzb3VyY2UKKyAqIHBpeGVscyBjb3ZlcmVkIGJ5IHRoZSBvdXRwdXQgcGl4ZWwuICBUaGUgaGktZmFsdXRpbiBzYW1wbGluZyBsaXRlcmF0dXJlCisgKiByZWZlcnMgdG8gdGhpcyBhcyBhICJib3ggZmlsdGVyIi4gIEluIGdlbmVyYWwgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiBhIGJveAorICogZmlsdGVyIGFyZSBub3QgdmVyeSBnb29kLCBidXQgZm9yIHRoZSBzcGVjaWZpYyBjYXNlcyB3ZSBub3JtYWxseSB1c2UgKDE6MQorICogYW5kIDI6MSByYXRpb3MpIHRoZSBib3ggaXMgZXF1aXZhbGVudCB0byBhICJ0cmlhbmdsZSBmaWx0ZXIiIHdoaWNoIGlzIG5vdAorICogbmVhcmx5IHNvIGJhZC4gIElmIHlvdSBpbnRlbmQgdG8gdXNlIG90aGVyIHNhbXBsaW5nIHJhdGlvcywgeW91J2QgYmUgd2VsbAorICogYWR2aXNlZCB0byBpbXByb3ZlIHRoaXMgY29kZS4KKyAqCisgKiBBIHNpbXBsZSBpbnB1dC1zbW9vdGhpbmcgY2FwYWJpbGl0eSBpcyBwcm92aWRlZC4gIFRoaXMgaXMgbWFpbmx5IGludGVuZGVkCisgKiBmb3IgY2xlYW5pbmcgdXAgY29sb3ItZGl0aGVyZWQgR0lGIGlucHV0IGZpbGVzIChpZiB5b3UgZmluZCBpdCBpbmFkZXF1YXRlLAorICogd2Ugc3VnZ2VzdCB1c2luZyBhbiBleHRlcm5hbCBmaWx0ZXJpbmcgcHJvZ3JhbSBzdWNoIGFzIHBubWNvbnZvbCkuICBXaGVuCisgKiBlbmFibGVkLCBlYWNoIGlucHV0IHBpeGVsIFAgaXMgcmVwbGFjZWQgYnkgYSB3ZWlnaHRlZCBzdW0gb2YgaXRzZWxmIGFuZCBpdHMKKyAqIGVpZ2h0IG5laWdoYm9ycy4gIFAncyB3ZWlnaHQgaXMgMS04KlNGIGFuZCBlYWNoIG5laWdoYm9yJ3Mgd2VpZ2h0IGlzIFNGLAorICogd2hlcmUgU0YgPSAoc21vb3RoaW5nX2ZhY3RvciAvIDEwMjQpLgorICogQ3VycmVudGx5LCBzbW9vdGhpbmcgaXMgb25seSBzdXBwb3J0ZWQgZm9yIDJoMnYgc2FtcGxpbmcgZmFjdG9ycy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyogUG9pbnRlciB0byByb3V0aW5lIHRvIGRvd25zYW1wbGUgYSBzaW5nbGUgY29tcG9uZW50ICovCit0eXBlZGVmIEpNRVRIT0Qodm9pZCwgZG93bnNhbXBsZTFfcHRyLAorCQkoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKSk7CisKKy8qIFByaXZhdGUgc3Vib2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfZG93bnNhbXBsZXIgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogRG93bnNhbXBsaW5nIG1ldGhvZCBwb2ludGVycywgb25lIHBlciBjb21wb25lbnQgKi8KKyAgZG93bnNhbXBsZTFfcHRyIG1ldGhvZHNbTUFYX0NPTVBPTkVOVFNdOworfSBteV9kb3duc2FtcGxlcjsKKwordHlwZWRlZiBteV9kb3duc2FtcGxlciAqIG15X2Rvd25zYW1wbGVfcHRyOworCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhIGRvd25zYW1wbGluZyBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgLyogbm8gd29yayBmb3Igbm93ICovCit9CisKKworLyoKKyAqIEV4cGFuZCBhIGNvbXBvbmVudCBob3Jpem9udGFsbHkgZnJvbSB3aWR0aCBpbnB1dF9jb2xzIHRvIHdpZHRoIG91dHB1dF9jb2xzLAorICogYnkgZHVwbGljYXRpbmcgdGhlIHJpZ2h0bW9zdCBzYW1wbGVzLgorICovCisKK0xPQ0FMKHZvaWQpCitleHBhbmRfcmlnaHRfZWRnZSAoSlNBTVBBUlJBWSBpbWFnZV9kYXRhLCBpbnQgbnVtX3Jvd3MsCisJCSAgIEpESU1FTlNJT04gaW5wdXRfY29scywgSkRJTUVOU0lPTiBvdXRwdXRfY29scykKK3sKKyAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOworICByZWdpc3RlciBKU0FNUExFIHBpeHZhbDsKKyAgcmVnaXN0ZXIgaW50IGNvdW50OworICBpbnQgcm93OworICBpbnQgbnVtY29scyA9IChpbnQpIChvdXRwdXRfY29scyAtIGlucHV0X2NvbHMpOworCisgIGlmIChudW1jb2xzID4gMCkgeworICAgIGZvciAocm93ID0gMDsgcm93IDwgbnVtX3Jvd3M7IHJvdysrKSB7CisgICAgICBwdHIgPSBpbWFnZV9kYXRhW3Jvd10gKyBpbnB1dF9jb2xzOworICAgICAgcGl4dmFsID0gcHRyWy0xXTsJCS8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSgpIGhlcmUgKi8KKyAgICAgIGZvciAoY291bnQgPSBudW1jb2xzOyBjb3VudCA+IDA7IGNvdW50LS0pCisJKnB0cisrID0gcGl4dmFsOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBEbyBkb3duc2FtcGxpbmcgZm9yIGEgd2hvbGUgcm93IGdyb3VwIChhbGwgY29tcG9uZW50cykuCisgKgorICogSW4gdGhpcyB2ZXJzaW9uIHdlIHNpbXBseSBkb3duc2FtcGxlIGVhY2ggY29tcG9uZW50IGluZGVwZW5kZW50bHkuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzZXBfZG93bnNhbXBsZSAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCUpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGluX3Jvd19pbmRleCwKKwkJSlNBTVBJTUFHRSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dF9yb3dfZ3JvdXBfaW5kZXgpCit7CisgIG15X2Rvd25zYW1wbGVfcHRyIGRvd25zYW1wbGUgPSAobXlfZG93bnNhbXBsZV9wdHIpIGNpbmZvLT5kb3duc2FtcGxlOworICBpbnQgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworICBKU0FNUEFSUkFZIGluX3B0ciwgb3V0X3B0cjsKKworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIGluX3B0ciA9IGlucHV0X2J1ZltjaV0gKyBpbl9yb3dfaW5kZXg7CisgICAgb3V0X3B0ciA9IG91dHB1dF9idWZbY2ldICsgKG91dF9yb3dfZ3JvdXBfaW5kZXggKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKKyAgICAoKmRvd25zYW1wbGUtPm1ldGhvZHNbY2ldKSAoY2luZm8sIGNvbXBwdHIsIGluX3B0ciwgb3V0X3B0cik7CisgIH0KK30KKworCisvKgorICogRG93bnNhbXBsZSBwaXhlbCB2YWx1ZXMgb2YgYSBzaW5nbGUgY29tcG9uZW50LgorICogT25lIHJvdyBncm91cCBpcyBwcm9jZXNzZWQgcGVyIGNhbGwuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyBhcmJpdHJhcnkgaW50ZWdyYWwgc2FtcGxpbmcgcmF0aW9zLCB3aXRob3V0IHNtb290aGluZy4KKyAqIE5vdGUgdGhhdCB0aGlzIHZlcnNpb24gaXMgbm90IGFjdHVhbGx5IHVzZWQgZm9yIGN1c3RvbWFyeSBzYW1wbGluZyByYXRpb3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitpbnRfZG93bnNhbXBsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQlKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpCit7CisgIGludCBpbnJvdywgb3V0cm93LCBoX2V4cGFuZCwgdl9leHBhbmQsIG51bXBpeCwgbnVtcGl4MiwgaCwgdjsKKyAgSkRJTUVOU0lPTiBvdXRjb2wsIG91dGNvbF9oOwkvKiBvdXRjb2xfaCA9PSBvdXRjb2wqaF9leHBhbmQgKi8KKyAgSkRJTUVOU0lPTiBvdXRwdXRfY29scyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkU7CisgIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisgIElOVDMyIG91dHZhbHVlOworCisgIGhfZXhwYW5kID0gY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yIC8gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKyAgdl9leHBhbmQgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgLyBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICBudW1waXggPSBoX2V4cGFuZCAqIHZfZXhwYW5kOworICBudW1waXgyID0gbnVtcGl4LzI7CisKKyAgLyogRXhwYW5kIGlucHV0IGRhdGEgZW5vdWdoIHRvIGxldCBhbGwgdGhlIG91dHB1dCBzYW1wbGVzIGJlIGdlbmVyYXRlZAorICAgKiBieSB0aGUgc3RhbmRhcmQgbG9vcC4gIFNwZWNpYWwtY2FzaW5nIHBhZGRlZCBvdXRwdXQgd291bGQgYmUgbW9yZQorICAgKiBlZmZpY2llbnQuCisgICAqLworICBleHBhbmRfcmlnaHRfZWRnZShpbnB1dF9kYXRhLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsCisJCSAgICBjaW5mby0+aW1hZ2Vfd2lkdGgsIG91dHB1dF9jb2xzICogaF9leHBhbmQpOworCisgIGlucm93ID0gMDsKKyAgZm9yIChvdXRyb3cgPSAwOyBvdXRyb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvdXRyb3crKykgeworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107CisgICAgZm9yIChvdXRjb2wgPSAwLCBvdXRjb2xfaCA9IDA7IG91dGNvbCA8IG91dHB1dF9jb2xzOworCSBvdXRjb2wrKywgb3V0Y29sX2ggKz0gaF9leHBhbmQpIHsKKyAgICAgIG91dHZhbHVlID0gMDsKKyAgICAgIGZvciAodiA9IDA7IHYgPCB2X2V4cGFuZDsgdisrKSB7CisJaW5wdHIgPSBpbnB1dF9kYXRhW2lucm93K3ZdICsgb3V0Y29sX2g7CisJZm9yIChoID0gMDsgaCA8IGhfZXhwYW5kOyBoKyspIHsKKwkgIG91dHZhbHVlICs9IChJTlQzMikgR0VUSlNBTVBMRSgqaW5wdHIrKyk7CisJfQorICAgICAgfQorICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgob3V0dmFsdWUgKyBudW1waXgyKSAvIG51bXBpeCk7CisgICAgfQorICAgIGlucm93ICs9IHZfZXhwYW5kOworICB9Cit9CisKKworLyoKKyAqIERvd25zYW1wbGUgcGl4ZWwgdmFsdWVzIG9mIGEgc2luZ2xlIGNvbXBvbmVudC4KKyAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIHRoZSBzcGVjaWFsIGNhc2Ugb2YgYSBmdWxsLXNpemUgY29tcG9uZW50LAorICogd2l0aG91dCBzbW9vdGhpbmcuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmdWxsc2l6ZV9kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKQoreworICAvKiBDb3B5IHRoZSBkYXRhICovCisgIGpjb3B5X3NhbXBsZV9yb3dzKGlucHV0X2RhdGEsIDAsIG91dHB1dF9kYXRhLCAwLAorCQkgICAgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yLCBjaW5mby0+aW1hZ2Vfd2lkdGgpOworICAvKiBFZGdlLWV4cGFuZCAqLworICBleHBhbmRfcmlnaHRfZWRnZShvdXRwdXRfZGF0YSwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yLAorCQkgICAgY2luZm8tPmltYWdlX3dpZHRoLCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFKTsKK30KKworCisvKgorICogRG93bnNhbXBsZSBwaXhlbCB2YWx1ZXMgb2YgYSBzaW5nbGUgY29tcG9uZW50LgorICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgdGhlIGNvbW1vbiBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAxOjEgdmVydGljYWwsCisgKiB3aXRob3V0IHNtb290aGluZy4KKyAqCisgKiBBIG5vdGUgYWJvdXQgdGhlICJiaWFzIiBjYWxjdWxhdGlvbnM6IHdoZW4gcm91bmRpbmcgZnJhY3Rpb25hbCB2YWx1ZXMgdG8KKyAqIGludGVnZXIsIHdlIGRvIG5vdCB3YW50IHRvIGFsd2F5cyByb3VuZCAwLjUgdXAgdG8gdGhlIG5leHQgaW50ZWdlci4KKyAqIElmIHdlIGRpZCB0aGF0LCB3ZSdkIGludHJvZHVjZSBhIG5vdGljZWFibGUgYmlhcyB0b3dhcmRzIGxhcmdlciB2YWx1ZXMuCisgKiBJbnN0ZWFkLCB0aGlzIGNvZGUgaXMgYXJyYW5nZWQgc28gdGhhdCAwLjUgd2lsbCBiZSByb3VuZGVkIHVwIG9yIGRvd24gYXQKKyAqIGFsdGVybmF0ZSBwaXhlbCBsb2NhdGlvbnMgKGEgc2ltcGxlIG9yZGVyZWQgZGl0aGVyIHBhdHRlcm4pLgorICovCisKK01FVEhPRERFRih2b2lkKQoraDJ2MV9kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpCit7CisgIGludCBvdXRyb3c7CisgIEpESU1FTlNJT04gb3V0Y29sOworICBKRElNRU5TSU9OIG91dHB1dF9jb2xzID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRTsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKKyAgcmVnaXN0ZXIgaW50IGJpYXM7CisKKyAgLyogRXhwYW5kIGlucHV0IGRhdGEgZW5vdWdoIHRvIGxldCBhbGwgdGhlIG91dHB1dCBzYW1wbGVzIGJlIGdlbmVyYXRlZAorICAgKiBieSB0aGUgc3RhbmRhcmQgbG9vcC4gIFNwZWNpYWwtY2FzaW5nIHBhZGRlZCBvdXRwdXQgd291bGQgYmUgbW9yZQorICAgKiBlZmZpY2llbnQuCisgICAqLworICBleHBhbmRfcmlnaHRfZWRnZShpbnB1dF9kYXRhLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsCisJCSAgICBjaW5mby0+aW1hZ2Vfd2lkdGgsIG91dHB1dF9jb2xzICogMik7CisKKyAgZm9yIChvdXRyb3cgPSAwOyBvdXRyb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvdXRyb3crKykgeworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107CisgICAgaW5wdHIgPSBpbnB1dF9kYXRhW291dHJvd107CisgICAgYmlhcyA9IDA7CQkJLyogYmlhcyA9IDAsMSwwLDEsLi4uIGZvciBzdWNjZXNzaXZlIHNhbXBsZXMgKi8KKyAgICBmb3IgKG91dGNvbCA9IDA7IG91dGNvbCA8IG91dHB1dF9jb2xzOyBvdXRjb2wrKykgeworICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgoR0VUSlNBTVBMRSgqaW5wdHIpICsgR0VUSlNBTVBMRShpbnB0clsxXSkKKwkJCSAgICAgICsgYmlhcykgPj4gMSk7CisgICAgICBiaWFzIF49IDE7CQkvKiAwPT4xLCAxPT4wICovCisgICAgICBpbnB0ciArPSAyOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBEb3duc2FtcGxlIHBpeGVsIHZhbHVlcyBvZiBhIHNpbmdsZSBjb21wb25lbnQuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyB0aGUgc3RhbmRhcmQgY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMjoxIHZlcnRpY2FsLAorICogd2l0aG91dCBzbW9vdGhpbmcuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitoMnYyX2Rvd25zYW1wbGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkJIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSkKK3sKKyAgaW50IGlucm93LCBvdXRyb3c7CisgIEpESU1FTlNJT04gb3V0Y29sOworICBKRElNRU5TSU9OIG91dHB1dF9jb2xzID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRTsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIG91dHB0cjsKKyAgcmVnaXN0ZXIgaW50IGJpYXM7CisKKyAgLyogRXhwYW5kIGlucHV0IGRhdGEgZW5vdWdoIHRvIGxldCBhbGwgdGhlIG91dHB1dCBzYW1wbGVzIGJlIGdlbmVyYXRlZAorICAgKiBieSB0aGUgc3RhbmRhcmQgbG9vcC4gIFNwZWNpYWwtY2FzaW5nIHBhZGRlZCBvdXRwdXQgd291bGQgYmUgbW9yZQorICAgKiBlZmZpY2llbnQuCisgICAqLworICBleHBhbmRfcmlnaHRfZWRnZShpbnB1dF9kYXRhLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsCisJCSAgICBjaW5mby0+aW1hZ2Vfd2lkdGgsIG91dHB1dF9jb2xzICogMik7CisKKyAgaW5yb3cgPSAwOworICBmb3IgKG91dHJvdyA9IDA7IG91dHJvdyA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG91dHJvdysrKSB7CisgICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbb3V0cm93XTsKKyAgICBpbnB0cjAgPSBpbnB1dF9kYXRhW2lucm93XTsKKyAgICBpbnB0cjEgPSBpbnB1dF9kYXRhW2lucm93KzFdOworICAgIGJpYXMgPSAxOwkJCS8qIGJpYXMgPSAxLDIsMSwyLC4uLiBmb3Igc3VjY2Vzc2l2ZSBzYW1wbGVzICovCisgICAgZm9yIChvdXRjb2wgPSAwOyBvdXRjb2wgPCBvdXRwdXRfY29sczsgb3V0Y29sKyspIHsKKyAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKEdFVEpTQU1QTEUoKmlucHRyMCkgKyBHRVRKU0FNUExFKGlucHRyMFsxXSkgKworCQkJICAgICAgR0VUSlNBTVBMRSgqaW5wdHIxKSArIEdFVEpTQU1QTEUoaW5wdHIxWzFdKQorCQkJICAgICAgKyBiaWFzKSA+PiAyKTsKKyAgICAgIGJpYXMgXj0gMzsJCS8qIDE9PjIsIDI9PjEgKi8KKyAgICAgIGlucHRyMCArPSAyOyBpbnB0cjEgKz0gMjsKKyAgICB9CisgICAgaW5yb3cgKz0gMjsKKyAgfQorfQorCisKKyNpZmRlZiBJTlBVVF9TTU9PVEhJTkdfU1VQUE9SVEVECisKKy8qCisgKiBEb3duc2FtcGxlIHBpeGVsIHZhbHVlcyBvZiBhIHNpbmdsZSBjb21wb25lbnQuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyB0aGUgc3RhbmRhcmQgY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMjoxIHZlcnRpY2FsLAorICogd2l0aCBzbW9vdGhpbmcuICBPbmUgcm93IG9mIGNvbnRleHQgaXMgcmVxdWlyZWQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitoMnYyX3Ntb290aF9kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCQlKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpCit7CisgIGludCBpbnJvdywgb3V0cm93OworICBKRElNRU5TSU9OIGNvbGN0cjsKKyAgSkRJTUVOU0lPTiBvdXRwdXRfY29scyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkU7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBhYm92ZV9wdHIsIGJlbG93X3B0ciwgb3V0cHRyOworICBJTlQzMiBtZW1iZXJzdW0sIG5laWdoc3VtLCBtZW1iZXJzY2FsZSwgbmVpZ2hzY2FsZTsKKworICAvKiBFeHBhbmQgaW5wdXQgZGF0YSBlbm91Z2ggdG8gbGV0IGFsbCB0aGUgb3V0cHV0IHNhbXBsZXMgYmUgZ2VuZXJhdGVkCisgICAqIGJ5IHRoZSBzdGFuZGFyZCBsb29wLiAgU3BlY2lhbC1jYXNpbmcgcGFkZGVkIG91dHB1dCB3b3VsZCBiZSBtb3JlCisgICAqIGVmZmljaWVudC4KKyAgICovCisgIGV4cGFuZF9yaWdodF9lZGdlKGlucHV0X2RhdGEgLSAxLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKyAyLAorCQkgICAgY2luZm8tPmltYWdlX3dpZHRoLCBvdXRwdXRfY29scyAqIDIpOworCisgIC8qIFdlIGRvbid0IGJvdGhlciB0byBmb3JtIHRoZSBpbmRpdmlkdWFsICJzbW9vdGhlZCIgaW5wdXQgcGl4ZWwgdmFsdWVzOworICAgKiB3ZSBjYW4gZGlyZWN0bHkgY29tcHV0ZSB0aGUgb3V0cHV0IHdoaWNoIGlzIHRoZSBhdmVyYWdlIG9mIHRoZSBmb3VyCisgICAqIHNtb290aGVkIHZhbHVlcy4gIEVhY2ggb2YgdGhlIGZvdXIgbWVtYmVyIHBpeGVscyBjb250cmlidXRlcyBhIGZyYWN0aW9uCisgICAqICgxLTgqU0YpIHRvIGl0cyBvd24gc21vb3RoZWQgaW1hZ2UgYW5kIGEgZnJhY3Rpb24gU0YgdG8gZWFjaCBvZiB0aGUgdGhyZWUKKyAgICogb3RoZXIgc21vb3RoZWQgcGl4ZWxzLCB0aGVyZWZvcmUgYSB0b3RhbCBmcmFjdGlvbiAoMS01KlNGKS80IHRvIHRoZSBmaW5hbAorICAgKiBvdXRwdXQuICBUaGUgZm91ciBjb3JuZXItYWRqYWNlbnQgbmVpZ2hib3IgcGl4ZWxzIGNvbnRyaWJ1dGUgYSBmcmFjdGlvbgorICAgKiBTRiB0byBqdXN0IG9uZSBzbW9vdGhlZCBwaXhlbCwgb3IgU0YvNCB0byB0aGUgZmluYWwgb3V0cHV0OyB3aGlsZSB0aGUKKyAgICogZWlnaHQgZWRnZS1hZGphY2VudCBuZWlnaGJvcnMgY29udHJpYnV0ZSBTRiB0byBlYWNoIG9mIHR3byBzbW9vdGhlZAorICAgKiBwaXhlbHMsIG9yIFNGLzIgb3ZlcmFsbC4gIEluIG9yZGVyIHRvIHVzZSBpbnRlZ2VyIGFyaXRobWV0aWMsIHRoZXNlCisgICAqIGZhY3RvcnMgYXJlIHNjYWxlZCBieSAyXjE2ID0gNjU1MzYuCisgICAqIEFsc28gcmVjYWxsIHRoYXQgU0YgPSBzbW9vdGhpbmdfZmFjdG9yIC8gMTAyNC4KKyAgICovCisKKyAgbWVtYmVyc2NhbGUgPSAxNjM4NCAtIGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yICogODA7IC8qIHNjYWxlZCAoMS01KlNGKS80ICovCisgIG5laWdoc2NhbGUgPSBjaW5mby0+c21vb3RoaW5nX2ZhY3RvciAqIDE2OyAvKiBzY2FsZWQgU0YvNCAqLworCisgIGlucm93ID0gMDsKKyAgZm9yIChvdXRyb3cgPSAwOyBvdXRyb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvdXRyb3crKykgeworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107CisgICAgaW5wdHIwID0gaW5wdXRfZGF0YVtpbnJvd107CisgICAgaW5wdHIxID0gaW5wdXRfZGF0YVtpbnJvdysxXTsKKyAgICBhYm92ZV9wdHIgPSBpbnB1dF9kYXRhW2lucm93LTFdOworICAgIGJlbG93X3B0ciA9IGlucHV0X2RhdGFbaW5yb3crMl07CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGZpcnN0IGNvbHVtbjogcHJldGVuZCBjb2x1bW4gLTEgaXMgc2FtZSBhcyBjb2x1bW4gMCAqLworICAgIG1lbWJlcnN1bSA9IEdFVEpTQU1QTEUoKmlucHRyMCkgKyBHRVRKU0FNUExFKGlucHRyMFsxXSkgKworCQlHRVRKU0FNUExFKCppbnB0cjEpICsgR0VUSlNBTVBMRShpbnB0cjFbMV0pOworICAgIG5laWdoc3VtID0gR0VUSlNBTVBMRSgqYWJvdmVfcHRyKSArIEdFVEpTQU1QTEUoYWJvdmVfcHRyWzFdKSArCisJICAgICAgIEdFVEpTQU1QTEUoKmJlbG93X3B0cikgKyBHRVRKU0FNUExFKGJlbG93X3B0clsxXSkgKworCSAgICAgICBHRVRKU0FNUExFKCppbnB0cjApICsgR0VUSlNBTVBMRShpbnB0cjBbMl0pICsKKwkgICAgICAgR0VUSlNBTVBMRSgqaW5wdHIxKSArIEdFVEpTQU1QTEUoaW5wdHIxWzJdKTsKKyAgICBuZWlnaHN1bSArPSBuZWlnaHN1bTsKKyAgICBuZWlnaHN1bSArPSBHRVRKU0FNUExFKCphYm92ZV9wdHIpICsgR0VUSlNBTVBMRShhYm92ZV9wdHJbMl0pICsKKwkJR0VUSlNBTVBMRSgqYmVsb3dfcHRyKSArIEdFVEpTQU1QTEUoYmVsb3dfcHRyWzJdKTsKKyAgICBtZW1iZXJzdW0gPSBtZW1iZXJzdW0gKiBtZW1iZXJzY2FsZSArIG5laWdoc3VtICogbmVpZ2hzY2FsZTsKKyAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOworICAgIGlucHRyMCArPSAyOyBpbnB0cjEgKz0gMjsgYWJvdmVfcHRyICs9IDI7IGJlbG93X3B0ciArPSAyOworCisgICAgZm9yIChjb2xjdHIgPSBvdXRwdXRfY29scyAtIDI7IGNvbGN0ciA+IDA7IGNvbGN0ci0tKSB7CisgICAgICAvKiBzdW0gb2YgcGl4ZWxzIGRpcmVjdGx5IG1hcHBlZCB0byB0aGlzIG91dHB1dCBlbGVtZW50ICovCisgICAgICBtZW1iZXJzdW0gPSBHRVRKU0FNUExFKCppbnB0cjApICsgR0VUSlNBTVBMRShpbnB0cjBbMV0pICsKKwkJICBHRVRKU0FNUExFKCppbnB0cjEpICsgR0VUSlNBTVBMRShpbnB0cjFbMV0pOworICAgICAgLyogc3VtIG9mIGVkZ2UtbmVpZ2hib3IgcGl4ZWxzICovCisgICAgICBuZWlnaHN1bSA9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cikgKyBHRVRKU0FNUExFKGFib3ZlX3B0clsxXSkgKworCQkgR0VUSlNBTVBMRSgqYmVsb3dfcHRyKSArIEdFVEpTQU1QTEUoYmVsb3dfcHRyWzFdKSArCisJCSBHRVRKU0FNUExFKGlucHRyMFstMV0pICsgR0VUSlNBTVBMRShpbnB0cjBbMl0pICsKKwkJIEdFVEpTQU1QTEUoaW5wdHIxWy0xXSkgKyBHRVRKU0FNUExFKGlucHRyMVsyXSk7CisgICAgICAvKiBUaGUgZWRnZS1uZWlnaGJvcnMgY291bnQgdHdpY2UgYXMgbXVjaCBhcyBjb3JuZXItbmVpZ2hib3JzICovCisgICAgICBuZWlnaHN1bSArPSBuZWlnaHN1bTsKKyAgICAgIC8qIEFkZCBpbiB0aGUgY29ybmVyLW5laWdoYm9ycyAqLworICAgICAgbmVpZ2hzdW0gKz0gR0VUSlNBTVBMRShhYm92ZV9wdHJbLTFdKSArIEdFVEpTQU1QTEUoYWJvdmVfcHRyWzJdKSArCisJCSAgR0VUSlNBTVBMRShiZWxvd19wdHJbLTFdKSArIEdFVEpTQU1QTEUoYmVsb3dfcHRyWzJdKTsKKyAgICAgIC8qIGZvcm0gZmluYWwgb3V0cHV0IHNjYWxlZCB1cCBieSAyXjE2ICovCisgICAgICBtZW1iZXJzdW0gPSBtZW1iZXJzdW0gKiBtZW1iZXJzY2FsZSArIG5laWdoc3VtICogbmVpZ2hzY2FsZTsKKyAgICAgIC8qIHJvdW5kLCBkZXNjYWxlIGFuZCBvdXRwdXQgaXQgKi8KKyAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKG1lbWJlcnN1bSArIDMyNzY4KSA+PiAxNik7CisgICAgICBpbnB0cjAgKz0gMjsgaW5wdHIxICs9IDI7IGFib3ZlX3B0ciArPSAyOyBiZWxvd19wdHIgKz0gMjsKKyAgICB9CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGxhc3QgY29sdW1uICovCisgICAgbWVtYmVyc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIwKSArIEdFVEpTQU1QTEUoaW5wdHIwWzFdKSArCisJCUdFVEpTQU1QTEUoKmlucHRyMSkgKyBHRVRKU0FNUExFKGlucHRyMVsxXSk7CisgICAgbmVpZ2hzdW0gPSBHRVRKU0FNUExFKCphYm92ZV9wdHIpICsgR0VUSlNBTVBMRShhYm92ZV9wdHJbMV0pICsKKwkgICAgICAgR0VUSlNBTVBMRSgqYmVsb3dfcHRyKSArIEdFVEpTQU1QTEUoYmVsb3dfcHRyWzFdKSArCisJICAgICAgIEdFVEpTQU1QTEUoaW5wdHIwWy0xXSkgKyBHRVRKU0FNUExFKGlucHRyMFsxXSkgKworCSAgICAgICBHRVRKU0FNUExFKGlucHRyMVstMV0pICsgR0VUSlNBTVBMRShpbnB0cjFbMV0pOworICAgIG5laWdoc3VtICs9IG5laWdoc3VtOworICAgIG5laWdoc3VtICs9IEdFVEpTQU1QTEUoYWJvdmVfcHRyWy0xXSkgKyBHRVRKU0FNUExFKGFib3ZlX3B0clsxXSkgKworCQlHRVRKU0FNUExFKGJlbG93X3B0clstMV0pICsgR0VUSlNBTVBMRShiZWxvd19wdHJbMV0pOworICAgIG1lbWJlcnN1bSA9IG1lbWJlcnN1bSAqIG1lbWJlcnNjYWxlICsgbmVpZ2hzdW0gKiBuZWlnaHNjYWxlOworICAgICpvdXRwdHIgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOworCisgICAgaW5yb3cgKz0gMjsKKyAgfQorfQorCisKKy8qCisgKiBEb3duc2FtcGxlIHBpeGVsIHZhbHVlcyBvZiBhIHNpbmdsZSBjb21wb25lbnQuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyB0aGUgc3BlY2lhbCBjYXNlIG9mIGEgZnVsbC1zaXplIGNvbXBvbmVudCwKKyAqIHdpdGggc21vb3RoaW5nLiAgT25lIHJvdyBvZiBjb250ZXh0IGlzIHJlcXVpcmVkLgorICovCisKK01FVEhPRERFRih2b2lkKQorZnVsbHNpemVfc21vb3RoX2Rvd25zYW1wbGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyLAorCQkJICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSkKK3sKKyAgaW50IG91dHJvdzsKKyAgSkRJTUVOU0lPTiBjb2xjdHI7CisgIEpESU1FTlNJT04gb3V0cHV0X2NvbHMgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgYWJvdmVfcHRyLCBiZWxvd19wdHIsIG91dHB0cjsKKyAgSU5UMzIgbWVtYmVyc3VtLCBuZWlnaHN1bSwgbWVtYmVyc2NhbGUsIG5laWdoc2NhbGU7CisgIGludCBjb2xzdW0sIGxhc3Rjb2xzdW0sIG5leHRjb2xzdW07CisKKyAgLyogRXhwYW5kIGlucHV0IGRhdGEgZW5vdWdoIHRvIGxldCBhbGwgdGhlIG91dHB1dCBzYW1wbGVzIGJlIGdlbmVyYXRlZAorICAgKiBieSB0aGUgc3RhbmRhcmQgbG9vcC4gIFNwZWNpYWwtY2FzaW5nIHBhZGRlZCBvdXRwdXQgd291bGQgYmUgbW9yZQorICAgKiBlZmZpY2llbnQuCisgICAqLworICBleHBhbmRfcmlnaHRfZWRnZShpbnB1dF9kYXRhIC0gMSwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICsgMiwKKwkJICAgIGNpbmZvLT5pbWFnZV93aWR0aCwgb3V0cHV0X2NvbHMpOworCisgIC8qIEVhY2ggb2YgdGhlIGVpZ2h0IG5laWdoYm9yIHBpeGVscyBjb250cmlidXRlcyBhIGZyYWN0aW9uIFNGIHRvIHRoZQorICAgKiBzbW9vdGhlZCBwaXhlbCwgd2hpbGUgdGhlIG1haW4gcGl4ZWwgY29udHJpYnV0ZXMgKDEtOCpTRikuICBJbiBvcmRlcgorICAgKiB0byB1c2UgaW50ZWdlciBhcml0aG1ldGljLCB0aGVzZSBmYWN0b3JzIGFyZSBtdWx0aXBsaWVkIGJ5IDJeMTYgPSA2NTUzNi4KKyAgICogQWxzbyByZWNhbGwgdGhhdCBTRiA9IHNtb290aGluZ19mYWN0b3IgLyAxMDI0LgorICAgKi8KKworICBtZW1iZXJzY2FsZSA9IDY1NTM2TCAtIGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yICogNTEyTDsgLyogc2NhbGVkIDEtOCpTRiAqLworICBuZWlnaHNjYWxlID0gY2luZm8tPnNtb290aGluZ19mYWN0b3IgKiA2NDsgLyogc2NhbGVkIFNGICovCisKKyAgZm9yIChvdXRyb3cgPSAwOyBvdXRyb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvdXRyb3crKykgeworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107CisgICAgaW5wdHIgPSBpbnB1dF9kYXRhW291dHJvd107CisgICAgYWJvdmVfcHRyID0gaW5wdXRfZGF0YVtvdXRyb3ctMV07CisgICAgYmVsb3dfcHRyID0gaW5wdXRfZGF0YVtvdXRyb3crMV07CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGZpcnN0IGNvbHVtbiAqLworICAgIGNvbHN1bSA9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cisrKSArIEdFVEpTQU1QTEUoKmJlbG93X3B0cisrKSArCisJICAgICBHRVRKU0FNUExFKCppbnB0cik7CisgICAgbWVtYmVyc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIrKyk7CisgICAgbmV4dGNvbHN1bSA9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cikgKyBHRVRKU0FNUExFKCpiZWxvd19wdHIpICsKKwkJIEdFVEpTQU1QTEUoKmlucHRyKTsKKyAgICBuZWlnaHN1bSA9IGNvbHN1bSArIChjb2xzdW0gLSBtZW1iZXJzdW0pICsgbmV4dGNvbHN1bTsKKyAgICBtZW1iZXJzdW0gPSBtZW1iZXJzdW0gKiBtZW1iZXJzY2FsZSArIG5laWdoc3VtICogbmVpZ2hzY2FsZTsKKyAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOworICAgIGxhc3Rjb2xzdW0gPSBjb2xzdW07IGNvbHN1bSA9IG5leHRjb2xzdW07CisKKyAgICBmb3IgKGNvbGN0ciA9IG91dHB1dF9jb2xzIC0gMjsgY29sY3RyID4gMDsgY29sY3RyLS0pIHsKKyAgICAgIG1lbWJlcnN1bSA9IEdFVEpTQU1QTEUoKmlucHRyKyspOworICAgICAgYWJvdmVfcHRyKys7IGJlbG93X3B0cisrOworICAgICAgbmV4dGNvbHN1bSA9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cikgKyBHRVRKU0FNUExFKCpiZWxvd19wdHIpICsKKwkJICAgR0VUSlNBTVBMRSgqaW5wdHIpOworICAgICAgbmVpZ2hzdW0gPSBsYXN0Y29sc3VtICsgKGNvbHN1bSAtIG1lbWJlcnN1bSkgKyBuZXh0Y29sc3VtOworICAgICAgbWVtYmVyc3VtID0gbWVtYmVyc3VtICogbWVtYmVyc2NhbGUgKyBuZWlnaHN1bSAqIG5laWdoc2NhbGU7CisgICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOworICAgICAgbGFzdGNvbHN1bSA9IGNvbHN1bTsgY29sc3VtID0gbmV4dGNvbHN1bTsKKyAgICB9CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGxhc3QgY29sdW1uICovCisgICAgbWVtYmVyc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIpOworICAgIG5laWdoc3VtID0gbGFzdGNvbHN1bSArIChjb2xzdW0gLSBtZW1iZXJzdW0pICsgY29sc3VtOworICAgIG1lbWJlcnN1bSA9IG1lbWJlcnN1bSAqIG1lbWJlcnNjYWxlICsgbmVpZ2hzdW0gKiBuZWlnaHNjYWxlOworICAgICpvdXRwdHIgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOworCisgIH0KK30KKworI2VuZGlmIC8qIElOUFVUX1NNT09USElOR19TVVBQT1JURUQgKi8KKworCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIGRvd25zYW1wbGluZy4KKyAqIE5vdGUgdGhhdCB3ZSBtdXN0IHNlbGVjdCBhIHJvdXRpbmUgZm9yIGVhY2ggY29tcG9uZW50LgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfZG93bnNhbXBsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9kb3duc2FtcGxlX3B0ciBkb3duc2FtcGxlOworICBpbnQgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworICBib29sZWFuIHNtb290aG9rID0gVFJVRTsKKworICBkb3duc2FtcGxlID0gKG15X2Rvd25zYW1wbGVfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKG15X2Rvd25zYW1wbGVyKSk7CisgIGNpbmZvLT5kb3duc2FtcGxlID0gKHN0cnVjdCBqcGVnX2Rvd25zYW1wbGVyICopIGRvd25zYW1wbGU7CisgIGRvd25zYW1wbGUtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19kb3duc2FtcGxlOworICBkb3duc2FtcGxlLT5wdWIuZG93bnNhbXBsZSA9IHNlcF9kb3duc2FtcGxlOworICBkb3duc2FtcGxlLT5wdWIubmVlZF9jb250ZXh0X3Jvd3MgPSBGQUxTRTsKKworICBpZiAoY2luZm8tPkNDSVI2MDFfc2FtcGxpbmcpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DQ0lSNjAxX05PVElNUEwpOworCisgIC8qIFZlcmlmeSB3ZSBjYW4gaGFuZGxlIHRoZSBzYW1wbGluZyBmYWN0b3JzLCBhbmQgc2V0IHVwIG1ldGhvZCBwb2ludGVycyAqLworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIGlmIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yID09IGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAmJgorCWNvbXBwdHItPnZfc2FtcF9mYWN0b3IgPT0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7CisjaWZkZWYgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRAorICAgICAgaWYgKGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yKSB7CisJZG93bnNhbXBsZS0+bWV0aG9kc1tjaV0gPSBmdWxsc2l6ZV9zbW9vdGhfZG93bnNhbXBsZTsKKwlkb3duc2FtcGxlLT5wdWIubmVlZF9jb250ZXh0X3Jvd3MgPSBUUlVFOworICAgICAgfSBlbHNlCisjZW5kaWYKKwlkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGZ1bGxzaXplX2Rvd25zYW1wbGU7CisgICAgfSBlbHNlIGlmIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yICogMiA9PSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgJiYKKwkgICAgICAgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciA9PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKKyAgICAgIHNtb290aG9rID0gRkFMU0U7CisgICAgICBkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjFfZG93bnNhbXBsZTsKKyAgICB9IGVsc2UgaWYgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgKiAyID09IGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAmJgorCSAgICAgICBjb21wcHRyLT52X3NhbXBfZmFjdG9yICogMiA9PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKKyNpZmRlZiBJTlBVVF9TTU9PVEhJTkdfU1VQUE9SVEVECisgICAgICBpZiAoY2luZm8tPnNtb290aGluZ19mYWN0b3IpIHsKKwlkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjJfc21vb3RoX2Rvd25zYW1wbGU7CisJZG93bnNhbXBsZS0+cHViLm5lZWRfY29udGV4dF9yb3dzID0gVFJVRTsKKyAgICAgIH0gZWxzZQorI2VuZGlmCisJZG93bnNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYyX2Rvd25zYW1wbGU7CisgICAgfSBlbHNlIGlmICgoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICUgY29tcHB0ci0+aF9zYW1wX2ZhY3RvcikgPT0gMCAmJgorCSAgICAgICAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICUgY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgPT0gMCkgeworICAgICAgc21vb3Rob2sgPSBGQUxTRTsKKyAgICAgIGRvd25zYW1wbGUtPm1ldGhvZHNbY2ldID0gaW50X2Rvd25zYW1wbGU7CisgICAgfSBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZSQUNUX1NBTVBMRV9OT1RJTVBMKTsKKyAgfQorCisjaWZkZWYgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRAorICBpZiAoY2luZm8tPnNtb290aGluZ19mYWN0b3IgJiYgIXNtb290aG9rKQorICAgIFRSQUNFTVMoY2luZm8sIDAsIEpUUkNfU01PT1RIX05PVElNUEwpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamN0cmFucy5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjdHJhbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTZkNzA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjdHJhbnMuYwpAQCAtMCwwICsxLDM4OCBAQAorLyoKKyAqIGpjdHJhbnMuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGxpYnJhcnkgcm91dGluZXMgZm9yIHRyYW5zY29kaW5nIGNvbXByZXNzaW9uLAorICogdGhhdCBpcywgd3JpdGluZyByYXcgRENUIGNvZWZmaWNpZW50IGFycmF5cyB0byBhbiBvdXRwdXQgSlBFRyBmaWxlLgorICogVGhlIHJvdXRpbmVzIGluIGpjYXBpbWluLmMgd2lsbCBhbHNvIGJlIG5lZWRlZCBieSBhIHRyYW5zY29kZXIuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitMT0NBTCh2b2lkKSB0cmFuc2VuY29kZV9tYXN0ZXJfc2VsZWN0aW9uCisJSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywganZpcnRfYmFycmF5X3B0ciAqIGNvZWZfYXJyYXlzKSk7CitMT0NBTCh2b2lkKSB0cmFuc2VuY29kZV9jb2VmX2NvbnRyb2xsZXIKKwlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqdmlydF9iYXJyYXlfcHRyICogY29lZl9hcnJheXMpKTsKKworCisvKgorICogQ29tcHJlc3Npb24gaW5pdGlhbGl6YXRpb24gZm9yIHdyaXRpbmcgcmF3LWNvZWZmaWNpZW50IGRhdGEuCisgKiBCZWZvcmUgY2FsbGluZyB0aGlzLCBhbGwgcGFyYW1ldGVycyBhbmQgYSBkYXRhIGRlc3RpbmF0aW9uIG11c3QgYmUgc2V0IHVwLgorICogQ2FsbCBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIHRvIGFjdHVhbGx5IHdyaXRlIHRoZSBkYXRhLgorICoKKyAqIFRoZSBudW1iZXIgb2YgcGFzc2VkIHZpcnR1YWwgYXJyYXlzIG11c3QgbWF0Y2ggY2luZm8tPm51bV9jb21wb25lbnRzLgorICogTm90ZSB0aGF0IHRoZSB2aXJ0dWFsIGFycmF5cyBuZWVkIG5vdCBiZSBmaWxsZWQgb3IgZXZlbiByZWFsaXplZCBhdAorICogdGhlIHRpbWUgd3JpdGVfY29lZmZpY2llbnRzIGlzIGNhbGxlZDsgaW5kZWVkLCBpZiB0aGUgdmlydHVhbCBhcnJheXMKKyAqIHdlcmUgcmVxdWVzdGVkIGZyb20gdGhpcyBjb21wcmVzc2lvbiBvYmplY3QncyBtZW1vcnkgbWFuYWdlciwgdGhleQorICogdHlwaWNhbGx5IHdpbGwgYmUgcmVhbGl6ZWQgZHVyaW5nIHRoaXMgcm91dGluZSBhbmQgZmlsbGVkIGFmdGVyd2FyZHMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3dyaXRlX2NvZWZmaWNpZW50cyAoal9jb21wcmVzc19wdHIgY2luZm8sIGp2aXJ0X2JhcnJheV9wdHIgKiBjb2VmX2FycmF5cykKK3sKKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NUQVJUKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisgIC8qIE1hcmsgYWxsIHRhYmxlcyB0byBiZSB3cml0dGVuICovCisgIGpwZWdfc3VwcHJlc3NfdGFibGVzKGNpbmZvLCBGQUxTRSk7CisgIC8qIChSZSlpbml0aWFsaXplIGVycm9yIG1nciBhbmQgZGVzdGluYXRpb24gbW9kdWxlcyAqLworICAoKmNpbmZvLT5lcnItPnJlc2V0X2Vycm9yX21ncikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgKCpjaW5mby0+ZGVzdC0+aW5pdF9kZXN0aW5hdGlvbikgKGNpbmZvKTsKKyAgLyogUGVyZm9ybSBtYXN0ZXIgc2VsZWN0aW9uIG9mIGFjdGl2ZSBtb2R1bGVzICovCisgIHRyYW5zZW5jb2RlX21hc3Rlcl9zZWxlY3Rpb24oY2luZm8sIGNvZWZfYXJyYXlzKTsKKyAgLyogV2FpdCBmb3IganBlZ19maW5pc2hfY29tcHJlc3MoKSBjYWxsICovCisgIGNpbmZvLT5uZXh0X3NjYW5saW5lID0gMDsJLyogc28ganBlZ193cml0ZV9tYXJrZXIgd29ya3MgKi8KKyAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IENTVEFURV9XUkNPRUZTOworfQorCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBjb21wcmVzc2lvbiBvYmplY3Qgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMsCisgKiB0aGVuIGNvcHkgZnJvbSB0aGUgc291cmNlIG9iamVjdCBhbGwgcGFyYW1ldGVycyBuZWVkZWQgZm9yIGxvc3NsZXNzCisgKiB0cmFuc2NvZGluZy4gIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgdmFyaWVkIHdpdGhvdXQgbG9zcyAoc3VjaCBhcworICogc2NhbiBzY3JpcHQgYW5kIEh1ZmZtYW4gb3B0aW1pemF0aW9uKSBhcmUgbGVmdCBpbiB0aGVpciBkZWZhdWx0IHN0YXRlcy4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfY29weV9jcml0aWNhbF9wYXJhbWV0ZXJzIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sCisJCQkgICAgICAgal9jb21wcmVzc19wdHIgZHN0aW5mbykKK3sKKyAgSlFVQU5UX1RCTCAqKiBxdGJscHRyOworICBqcGVnX2NvbXBvbmVudF9pbmZvICppbmNvbXAsICpvdXRjb21wOworICBKUVVBTlRfVEJMICpjX3F1YW50LCAqc2xvdF9xdWFudDsKKyAgaW50IHRibG5vLCBjaSwgY29lZmk7CisKKyAgLyogU2FmZXR5IGNoZWNrIHRvIGVuc3VyZSBzdGFydF9jb21wcmVzcyBub3QgY2FsbGVkIHlldC4gKi8KKyAgaWYgKGRzdGluZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCisgICAgRVJSRVhJVDEoZHN0aW5mbywgSkVSUl9CQURfU1RBVEUsIGRzdGluZm8tPmdsb2JhbF9zdGF0ZSk7CisgIC8qIENvcHkgZnVuZGFtZW50YWwgaW1hZ2UgZGltZW5zaW9ucyAqLworICBkc3RpbmZvLT5pbWFnZV93aWR0aCA9IHNyY2luZm8tPmltYWdlX3dpZHRoOworICBkc3RpbmZvLT5pbWFnZV9oZWlnaHQgPSBzcmNpbmZvLT5pbWFnZV9oZWlnaHQ7CisgIGRzdGluZm8tPmlucHV0X2NvbXBvbmVudHMgPSBzcmNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgZHN0aW5mby0+aW5fY29sb3Jfc3BhY2UgPSBzcmNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlOworICAvKiBJbml0aWFsaXplIGFsbCBwYXJhbWV0ZXJzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIGpwZWdfc2V0X2RlZmF1bHRzKGRzdGluZm8pOworICAvKiBqcGVnX3NldF9kZWZhdWx0cyBtYXkgY2hvb3NlIHdyb25nIGNvbG9yc3BhY2UsIGVnIFlDYkNyIGlmIGlucHV0IGlzIFJHQi4KKyAgICogRml4IGl0IHRvIGdldCB0aGUgcmlnaHQgaGVhZGVyIG1hcmtlcnMgZm9yIHRoZSBpbWFnZSBjb2xvcnNwYWNlLgorICAgKi8KKyAganBlZ19zZXRfY29sb3JzcGFjZShkc3RpbmZvLCBzcmNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlKTsKKyAgZHN0aW5mby0+ZGF0YV9wcmVjaXNpb24gPSBzcmNpbmZvLT5kYXRhX3ByZWNpc2lvbjsKKyAgZHN0aW5mby0+Q0NJUjYwMV9zYW1wbGluZyA9IHNyY2luZm8tPkNDSVI2MDFfc2FtcGxpbmc7CisgIC8qIENvcHkgdGhlIHNvdXJjZSdzIHF1YW50aXphdGlvbiB0YWJsZXMuICovCisgIGZvciAodGJsbm8gPSAwOyB0YmxubyA8IE5VTV9RVUFOVF9UQkxTOyB0YmxubysrKSB7CisgICAgaWYgKHNyY2luZm8tPnF1YW50X3RibF9wdHJzW3RibG5vXSAhPSBOVUxMKSB7CisgICAgICBxdGJscHRyID0gJiBkc3RpbmZvLT5xdWFudF90YmxfcHRyc1t0Ymxub107CisgICAgICBpZiAoKnF0YmxwdHIgPT0gTlVMTCkKKwkqcXRibHB0ciA9IGpwZWdfYWxsb2NfcXVhbnRfdGFibGUoKGpfY29tbW9uX3B0cikgZHN0aW5mbyk7CisgICAgICBNRU1DT1BZKCgqcXRibHB0ciktPnF1YW50dmFsLAorCSAgICAgIHNyY2luZm8tPnF1YW50X3RibF9wdHJzW3RibG5vXS0+cXVhbnR2YWwsCisJICAgICAgU0laRU9GKCgqcXRibHB0ciktPnF1YW50dmFsKSk7CisgICAgICAoKnF0YmxwdHIpLT5zZW50X3RhYmxlID0gRkFMU0U7CisgICAgfQorICB9CisgIC8qIENvcHkgdGhlIHNvdXJjZSdzIHBlci1jb21wb25lbnQgaW5mby4KKyAgICogTm90ZSB3ZSBhc3N1bWUganBlZ19zZXRfZGVmYXVsdHMgaGFzIGFsbG9jYXRlZCB0aGUgZGVzdCBjb21wX2luZm8gYXJyYXkuCisgICAqLworICBkc3RpbmZvLT5udW1fY29tcG9uZW50cyA9IHNyY2luZm8tPm51bV9jb21wb25lbnRzOworICBpZiAoZHN0aW5mby0+bnVtX2NvbXBvbmVudHMgPCAxIHx8IGRzdGluZm8tPm51bV9jb21wb25lbnRzID4gTUFYX0NPTVBPTkVOVFMpCisgICAgRVJSRVhJVDIoZHN0aW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGRzdGluZm8tPm51bV9jb21wb25lbnRzLAorCSAgICAgTUFYX0NPTVBPTkVOVFMpOworICBmb3IgKGNpID0gMCwgaW5jb21wID0gc3JjaW5mby0+Y29tcF9pbmZvLCBvdXRjb21wID0gZHN0aW5mby0+Y29tcF9pbmZvOworICAgICAgIGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyssIGluY29tcCsrLCBvdXRjb21wKyspIHsKKyAgICBvdXRjb21wLT5jb21wb25lbnRfaWQgPSBpbmNvbXAtPmNvbXBvbmVudF9pZDsKKyAgICBvdXRjb21wLT5oX3NhbXBfZmFjdG9yID0gaW5jb21wLT5oX3NhbXBfZmFjdG9yOworICAgIG91dGNvbXAtPnZfc2FtcF9mYWN0b3IgPSBpbmNvbXAtPnZfc2FtcF9mYWN0b3I7CisgICAgb3V0Y29tcC0+cXVhbnRfdGJsX25vID0gaW5jb21wLT5xdWFudF90Ymxfbm87CisgICAgLyogTWFrZSBzdXJlIHNhdmVkIHF1YW50aXphdGlvbiB0YWJsZSBmb3IgY29tcG9uZW50IG1hdGNoZXMgdGhlIHF0YWJsZQorICAgICAqIHNsb3QuICBJZiBub3QsIHRoZSBpbnB1dCBmaWxlIHJlLXVzZWQgdGhpcyBxdGFibGUgc2xvdC4KKyAgICAgKiBJSkcgZW5jb2RlciBjdXJyZW50bHkgY2Fubm90IGR1cGxpY2F0ZSB0aGlzLgorICAgICAqLworICAgIHRibG5vID0gb3V0Y29tcC0+cXVhbnRfdGJsX25vOworICAgIGlmICh0YmxubyA8IDAgfHwgdGJsbm8gPj0gTlVNX1FVQU5UX1RCTFMgfHwKKwlzcmNpbmZvLT5xdWFudF90YmxfcHRyc1t0Ymxub10gPT0gTlVMTCkKKyAgICAgIEVSUkVYSVQxKGRzdGluZm8sIEpFUlJfTk9fUVVBTlRfVEFCTEUsIHRibG5vKTsKKyAgICBzbG90X3F1YW50ID0gc3JjaW5mby0+cXVhbnRfdGJsX3B0cnNbdGJsbm9dOworICAgIGNfcXVhbnQgPSBpbmNvbXAtPnF1YW50X3RhYmxlOworICAgIGlmIChjX3F1YW50ICE9IE5VTEwpIHsKKyAgICAgIGZvciAoY29lZmkgPSAwOyBjb2VmaSA8IERDVFNJWkUyOyBjb2VmaSsrKSB7CisJaWYgKGNfcXVhbnQtPnF1YW50dmFsW2NvZWZpXSAhPSBzbG90X3F1YW50LT5xdWFudHZhbFtjb2VmaV0pCisJICBFUlJFWElUMShkc3RpbmZvLCBKRVJSX01JU01BVENIRURfUVVBTlRfVEFCTEUsIHRibG5vKTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogTm90ZTogd2UgZG8gbm90IGNvcHkgdGhlIHNvdXJjZSdzIEh1ZmZtYW4gdGFibGUgYXNzaWdubWVudHM7CisgICAgICogaW5zdGVhZCB3ZSByZWx5IG9uIGpwZWdfc2V0X2NvbG9yc3BhY2UgdG8gaGF2ZSBtYWRlIGEgc3VpdGFibGUgY2hvaWNlLgorICAgICAqLworICB9CisgIC8qIEFsc28gY29weSBKRklGIHZlcnNpb24gYW5kIHJlc29sdXRpb24gaW5mb3JtYXRpb24sIGlmIGF2YWlsYWJsZS4KKyAgICogU3RyaWN0bHkgc3BlYWtpbmcgdGhpcyBpc24ndCAiY3JpdGljYWwiIGluZm8sIGJ1dCBpdCdzIG5lYXJseQorICAgKiBhbHdheXMgYXBwcm9wcmlhdGUgdG8gY29weSBpdCBpZiBhdmFpbGFibGUuICBJbiBwYXJ0aWN1bGFyLAorICAgKiBpZiB0aGUgYXBwbGljYXRpb24gY2hvb3NlcyB0byBjb3B5IEpGSUYgMS4wMiBleHRlbnNpb24gbWFya2VycyBmcm9tCisgICAqIHRoZSBzb3VyY2UgZmlsZSwgd2UgbmVlZCB0byBjb3B5IHRoZSB2ZXJzaW9uIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndAorICAgKiBlbWl0IGEgZmlsZSB0aGF0IGhhcyAxLjAyIGV4dGVuc2lvbnMgYnV0IGEgY2xhaW1lZCB2ZXJzaW9uIG9mIDEuMDEuCisgICAqIFdlIHdpbGwgKm5vdCosIGhvd2V2ZXIsIGNvcHkgdmVyc2lvbiBpbmZvIGZyb20gbWlzbGFiZWxlZCAiMi4wMSIgZmlsZXMuCisgICAqLworICBpZiAoc3JjaW5mby0+c2F3X0pGSUZfbWFya2VyKSB7CisgICAgaWYgKHNyY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbiA9PSAxKSB7CisgICAgICBkc3RpbmZvLT5KRklGX21ham9yX3ZlcnNpb24gPSBzcmNpbmZvLT5KRklGX21ham9yX3ZlcnNpb247CisgICAgICBkc3RpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24gPSBzcmNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb247CisgICAgfQorICAgIGRzdGluZm8tPmRlbnNpdHlfdW5pdCA9IHNyY2luZm8tPmRlbnNpdHlfdW5pdDsKKyAgICBkc3RpbmZvLT5YX2RlbnNpdHkgPSBzcmNpbmZvLT5YX2RlbnNpdHk7CisgICAgZHN0aW5mby0+WV9kZW5zaXR5ID0gc3JjaW5mby0+WV9kZW5zaXR5OworICB9Cit9CisKKworLyoKKyAqIE1hc3RlciBzZWxlY3Rpb24gb2YgY29tcHJlc3Npb24gbW9kdWxlcyBmb3IgdHJhbnNjb2RpbmcuCisgKiBUaGlzIHN1YnN0aXR1dGVzIGZvciBqY2luaXQuYydzIGluaXRpYWxpemF0aW9uIG9mIHRoZSBmdWxsIGNvbXByZXNzb3IuCisgKi8KKworTE9DQUwodm9pZCkKK3RyYW5zZW5jb2RlX21hc3Rlcl9zZWxlY3Rpb24gKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICAgICAganZpcnRfYmFycmF5X3B0ciAqIGNvZWZfYXJyYXlzKQoreworICAvKiBBbHRob3VnaCB3ZSBkb24ndCBhY3R1YWxseSB1c2UgaW5wdXRfY29tcG9uZW50cyBmb3IgdHJhbnNjb2RpbmcsCisgICAqIGpjbWFzdGVyLmMncyBpbml0aWFsX3NldHVwIHdpbGwgY29tcGxhaW4gaWYgaW5wdXRfY29tcG9uZW50cyBpcyAwLgorICAgKi8KKyAgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPSAxOworICAvKiBJbml0aWFsaXplIG1hc3RlciBjb250cm9sIChpbmNsdWRlcyBwYXJhbWV0ZXIgY2hlY2tpbmcvcHJvY2Vzc2luZykgKi8KKyAgamluaXRfY19tYXN0ZXJfY29udHJvbChjaW5mbywgVFJVRSAvKiB0cmFuc2NvZGUgb25seSAqLyk7CisKKyAgLyogRW50cm9weSBlbmNvZGluZzogZWl0aGVyIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYyBjb2RpbmcuICovCisgIGlmIChjaW5mby0+YXJpdGhfY29kZSkgeworICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQVJJVEhfTk9USU1QTCk7CisgIH0gZWxzZSB7CisgICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7CisjaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKKyAgICAgIGppbml0X3BodWZmX2VuY29kZXIoY2luZm8pOworI2Vsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICAgIH0gZWxzZQorICAgICAgamluaXRfaHVmZl9lbmNvZGVyKGNpbmZvKTsKKyAgfQorCisgIC8qIFdlIG5lZWQgYSBzcGVjaWFsIGNvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sbGVyLiAqLworICB0cmFuc2VuY29kZV9jb2VmX2NvbnRyb2xsZXIoY2luZm8sIGNvZWZfYXJyYXlzKTsKKworICBqaW5pdF9tYXJrZXJfd3JpdGVyKGNpbmZvKTsKKworICAvKiBXZSBjYW4gbm93IHRlbGwgdGhlIG1lbW9yeSBtYW5hZ2VyIHRvIGFsbG9jYXRlIHZpcnR1YWwgYXJyYXlzLiAqLworICAoKmNpbmZvLT5tZW0tPnJlYWxpemVfdmlydF9hcnJheXMpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisKKyAgLyogV3JpdGUgdGhlIGRhdGFzdHJlYW0gaGVhZGVyIChTT0ksIEpGSUYpIGltbWVkaWF0ZWx5LgorICAgKiBGcmFtZSBhbmQgc2NhbiBoZWFkZXJzIGFyZSBwb3N0cG9uZWQgdGlsbCBsYXRlci4KKyAgICogVGhpcyBsZXRzIGFwcGxpY2F0aW9uIGluc2VydCBzcGVjaWFsIG1hcmtlcnMgYWZ0ZXIgdGhlIFNPSS4KKyAgICovCisgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfZmlsZV9oZWFkZXIpIChjaW5mbyk7Cit9CisKKworLyoKKyAqIFRoZSByZXN0IG9mIHRoaXMgZmlsZSBpcyBhIHNwZWNpYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvZWZmaWNpZW50CisgKiBidWZmZXIgY29udHJvbGxlci4gIFRoaXMgaXMgc2ltaWxhciB0byBqY2NvZWZjdC5jLCBidXQgaXQgaGFuZGxlcyBvbmx5CisgKiBvdXRwdXQgZnJvbSBwcmVzdXBwbGllZCB2aXJ0dWFsIGFycmF5cy4gIEZ1cnRoZXJtb3JlLCB3ZSBnZW5lcmF0ZSBhbnkKKyAqIGR1bW15IHBhZGRpbmcgYmxvY2tzIG9uLXRoZS1mbHkgcmF0aGVyIHRoYW4gZXhwZWN0aW5nIHRoZW0gdG8gYmUgcHJlc2VudAorICogaW4gdGhlIGFycmF5cy4KKyAqLworCisvKiBQcml2YXRlIGJ1ZmZlciBjb250cm9sbGVyIG9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIEpESU1FTlNJT04gaU1DVV9yb3dfbnVtOwkvKiBpTUNVIHJvdyAjIHdpdGhpbiBpbWFnZSAqLworICBKRElNRU5TSU9OIG1jdV9jdHI7CQkvKiBjb3VudHMgTUNVcyBwcm9jZXNzZWQgaW4gY3VycmVudCByb3cgKi8KKyAgaW50IE1DVV92ZXJ0X29mZnNldDsJCS8qIGNvdW50cyBNQ1Ugcm93cyB3aXRoaW4gaU1DVSByb3cgKi8KKyAgaW50IE1DVV9yb3dzX3Blcl9pTUNVX3JvdzsJLyogbnVtYmVyIG9mIHN1Y2ggcm93cyBuZWVkZWQgKi8KKworICAvKiBWaXJ0dWFsIGJsb2NrIGFycmF5IGZvciBlYWNoIGNvbXBvbmVudC4gKi8KKyAganZpcnRfYmFycmF5X3B0ciAqIHdob2xlX2ltYWdlOworCisgIC8qIFdvcmtzcGFjZSBmb3IgY29uc3RydWN0aW5nIGR1bW15IGJsb2NrcyBhdCByaWdodC9ib3R0b20gZWRnZXMuICovCisgIEpCTE9DS1JPVyBkdW1teV9idWZmZXJbQ19NQVhfQkxPQ0tTX0lOX01DVV07Cit9IG15X2NvZWZfY29udHJvbGxlcjsKKwordHlwZWRlZiBteV9jb2VmX2NvbnRyb2xsZXIgKiBteV9jb2VmX3B0cjsKKworCitMT0NBTCh2b2lkKQorc3RhcnRfaU1DVV9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogUmVzZXQgd2l0aGluLWlNQ1Utcm93IGNvdW50ZXJzIGZvciBhIG5ldyByb3cgKi8KK3sKKyAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7CisKKyAgLyogSW4gYW4gaW50ZXJsZWF2ZWQgc2NhbiwgYW4gTUNVIHJvdyBpcyB0aGUgc2FtZSBhcyBhbiBpTUNVIHJvdy4KKyAgICogSW4gYSBub25pbnRlcmxlYXZlZCBzY2FuLCBhbiBpTUNVIHJvdyBoYXMgdl9zYW1wX2ZhY3RvciBNQ1Ugcm93cy4KKyAgICogQnV0IGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLCBwcm9jZXNzIG9ubHkgd2hhdCdzIGxlZnQuCisgICAqLworICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gPiAxKSB7CisgICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gMTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtIDwgKGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MtMSkpCisgICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+dl9zYW1wX2ZhY3RvcjsKKyAgICBlbHNlCisgICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+bGFzdF9yb3dfaGVpZ2h0OworICB9CisKKyAgY29lZi0+bWN1X2N0ciA9IDA7CisgIGNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IDA7Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIGEgcHJvY2Vzc2luZyBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19jb2VmIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworCisgIGlmIChwYXNzX21vZGUgIT0gSkJVRl9DUkFOS19ERVNUKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKworICBjb2VmLT5pTUNVX3Jvd19udW0gPSAwOworICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7Cit9CisKKworLyoKKyAqIFByb2Nlc3Mgc29tZSBkYXRhLgorICogV2UgcHJvY2VzcyB0aGUgZXF1aXZhbGVudCBvZiBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykKKyAqIHBlciBjYWxsLCBpZSwgdl9zYW1wX2ZhY3RvciBibG9jayByb3dzIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgc2Nhbi4KKyAqIFRoZSBkYXRhIGlzIG9idGFpbmVkIGZyb20gdGhlIHZpcnR1YWwgYXJyYXlzIGFuZCBmZWQgdG8gdGhlIGVudHJvcHkgY29kZXIuCisgKiBSZXR1cm5zIFRSVUUgaWYgdGhlIGlNQ1Ugcm93IGlzIGNvbXBsZXRlZCwgRkFMU0UgaWYgc3VzcGVuZGVkLgorICoKKyAqIE5COiBpbnB1dF9idWYgaXMgaWdub3JlZDsgaXQgaXMgbGlrZWx5IHRvIGJlIGEgTlVMTCBwb2ludGVyLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorY29tcHJlc3Nfb3V0cHV0IChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworICBKRElNRU5TSU9OIE1DVV9jb2xfbnVtOwkvKiBpbmRleCBvZiBjdXJyZW50IE1DVSB3aXRoaW4gcm93ICovCisgIEpESU1FTlNJT04gbGFzdF9NQ1VfY29sID0gY2luZm8tPk1DVXNfcGVyX3JvdyAtIDE7CisgIEpESU1FTlNJT04gbGFzdF9pTUNVX3JvdyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgLSAxOworICBpbnQgYmxrbiwgY2ksIHhpbmRleCwgeWluZGV4LCB5b2Zmc2V0LCBibG9ja2NudDsKKyAgSkRJTUVOU0lPTiBzdGFydF9jb2w7CisgIEpCTE9DS0FSUkFZIGJ1ZmZlcltNQVhfQ09NUFNfSU5fU0NBTl07CisgIEpCTE9DS1JPVyBNQ1VfYnVmZmVyW0NfTUFYX0JMT0NLU19JTl9NQ1VdOworICBKQkxPQ0tST1cgYnVmZmVyX3B0cjsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXJzIGZvciB0aGUgY29tcG9uZW50cyB1c2VkIGluIHRoaXMgc2Nhbi4gKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIGJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XSwKKyAgICAgICBjb2VmLT5pTUNVX3Jvd19udW0gKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAorICAgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7CisgIH0KKworICAvKiBMb29wIHRvIHByb2Nlc3Mgb25lIHdob2xlIGlNQ1Ugcm93ICovCisgIGZvciAoeW9mZnNldCA9IGNvZWYtPk1DVV92ZXJ0X29mZnNldDsgeW9mZnNldCA8IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKKyAgICAgICB5b2Zmc2V0KyspIHsKKyAgICBmb3IgKE1DVV9jb2xfbnVtID0gY29lZi0+bWN1X2N0cjsgTUNVX2NvbF9udW0gPCBjaW5mby0+TUNVc19wZXJfcm93OworCSBNQ1VfY29sX251bSsrKSB7CisgICAgICAvKiBDb25zdHJ1Y3QgbGlzdCBvZiBwb2ludGVycyB0byBEQ1QgYmxvY2tzIGJlbG9uZ2luZyB0byB0aGlzIE1DVSAqLworICAgICAgYmxrbiA9IDA7CQkJLyogaW5kZXggb2YgY3VycmVudCBEQ1QgYmxvY2sgd2l0aGluIE1DVSAqLworICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKwljb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworCXN0YXJ0X2NvbCA9IE1DVV9jb2xfbnVtICogY29tcHB0ci0+TUNVX3dpZHRoOworCWJsb2NrY250ID0gKE1DVV9jb2xfbnVtIDwgbGFzdF9NQ1VfY29sKSA/IGNvbXBwdHItPk1DVV93aWR0aAorCQkJCQkJOiBjb21wcHRyLT5sYXN0X2NvbF93aWR0aDsKKwlmb3IgKHlpbmRleCA9IDA7IHlpbmRleCA8IGNvbXBwdHItPk1DVV9oZWlnaHQ7IHlpbmRleCsrKSB7CisJICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtIDwgbGFzdF9pTUNVX3JvdyB8fAorCSAgICAgIHlpbmRleCt5b2Zmc2V0IDwgY29tcHB0ci0+bGFzdF9yb3dfaGVpZ2h0KSB7CisJICAgIC8qIEZpbGwgaW4gcG9pbnRlcnMgdG8gcmVhbCBibG9ja3MgaW4gdGhpcyByb3cgKi8KKwkgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcltjaV1beWluZGV4K3lvZmZzZXRdICsgc3RhcnRfY29sOworCSAgICBmb3IgKHhpbmRleCA9IDA7IHhpbmRleCA8IGJsb2NrY250OyB4aW5kZXgrKykKKwkgICAgICBNQ1VfYnVmZmVyW2Jsa24rK10gPSBidWZmZXJfcHRyKys7CisJICB9IGVsc2UgeworCSAgICAvKiBBdCBib3R0b20gb2YgaW1hZ2UsIG5lZWQgYSB3aG9sZSByb3cgb2YgZHVtbXkgYmxvY2tzICovCisJICAgIHhpbmRleCA9IDA7CisJICB9CisJICAvKiBGaWxsIGluIGFueSBkdW1teSBibG9ja3MgbmVlZGVkIGluIHRoaXMgcm93LgorCSAgICogRHVtbXkgYmxvY2tzIGFyZSBmaWxsZWQgaW4gdGhlIHNhbWUgd2F5IGFzIGluIGpjY29lZmN0LmM6CisJICAgKiBhbGwgemVyb2VzIGluIHRoZSBBQyBlbnRyaWVzLCBEQyBlbnRyaWVzIGVxdWFsIHRvIHByZXZpb3VzCisJICAgKiBibG9jaydzIERDIHZhbHVlLiAgVGhlIGluaXQgcm91dGluZSBoYXMgYWxyZWFkeSB6ZXJvZWQgdGhlCisJICAgKiBBQyBlbnRyaWVzLCBzbyB3ZSBuZWVkIG9ubHkgc2V0IHRoZSBEQyBlbnRyaWVzIGNvcnJlY3RseS4KKwkgICAqLworCSAgZm9yICg7IHhpbmRleCA8IGNvbXBwdHItPk1DVV93aWR0aDsgeGluZGV4KyspIHsKKwkgICAgTUNVX2J1ZmZlcltibGtuXSA9IGNvZWYtPmR1bW15X2J1ZmZlcltibGtuXTsKKwkgICAgTUNVX2J1ZmZlcltibGtuXVswXVswXSA9IE1DVV9idWZmZXJbYmxrbi0xXVswXVswXTsKKwkgICAgYmxrbisrOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIC8qIFRyeSB0byB3cml0ZSB0aGUgTUNVLiAqLworICAgICAgaWYgKCEgKCpjaW5mby0+ZW50cm9weS0+ZW5jb2RlX21jdSkgKGNpbmZvLCBNQ1VfYnVmZmVyKSkgeworCS8qIFN1c3BlbnNpb24gZm9yY2VkOyB1cGRhdGUgc3RhdGUgY291bnRlcnMgYW5kIGV4aXQgKi8KKwljb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSB5b2Zmc2V0OworCWNvZWYtPm1jdV9jdHIgPSBNQ1VfY29sX251bTsKKwlyZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgfQorICAgIC8qIENvbXBsZXRlZCBhbiBNQ1Ugcm93LCBidXQgcGVyaGFwcyBub3QgYW4gaU1DVSByb3cgKi8KKyAgICBjb2VmLT5tY3VfY3RyID0gMDsKKyAgfQorICAvKiBDb21wbGV0ZWQgdGhlIGlNQ1Ugcm93LCBhZHZhbmNlIGNvdW50ZXJzIGZvciBuZXh0IG9uZSAqLworICBjb2VmLT5pTUNVX3Jvd19udW0rKzsKKyAgc3RhcnRfaU1DVV9yb3coY2luZm8pOworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogSW5pdGlhbGl6ZSBjb2VmZmljaWVudCBidWZmZXIgY29udHJvbGxlci4KKyAqCisgKiBFYWNoIHBhc3NlZCBjb2VmZmljaWVudCBhcnJheSBtdXN0IGJlIHRoZSByaWdodCBzaXplIGZvciB0aGF0CisgKiBjb2VmZmljaWVudDogd2lkdGhfaW5fYmxvY2tzIHdpZGUgYW5kIGhlaWdodF9pbl9ibG9ja3MgaGlnaCwKKyAqIHdpdGggdW5pdGhlaWdodCBhdCBsZWFzdCB2X3NhbXBfZmFjdG9yLgorICovCisKK0xPQ0FMKHZvaWQpCit0cmFuc2VuY29kZV9jb2VmX2NvbnRyb2xsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICAgICBqdmlydF9iYXJyYXlfcHRyICogY29lZl9hcnJheXMpCit7CisgIG15X2NvZWZfcHRyIGNvZWY7CisgIEpCTE9DS1JPVyBidWZmZXI7CisgIGludCBpOworCisgIGNvZWYgPSAobXlfY29lZl9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YobXlfY29lZl9jb250cm9sbGVyKSk7CisgIGNpbmZvLT5jb2VmID0gKHN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyICopIGNvZWY7CisgIGNvZWYtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19jb2VmOworICBjb2VmLT5wdWIuY29tcHJlc3NfZGF0YSA9IGNvbXByZXNzX291dHB1dDsKKworICAvKiBTYXZlIHBvaW50ZXIgdG8gdmlydHVhbCBhcnJheXMgKi8KKyAgY29lZi0+d2hvbGVfaW1hZ2UgPSBjb2VmX2FycmF5czsKKworICAvKiBBbGxvY2F0ZSBhbmQgcHJlLXplcm8gc3BhY2UgZm9yIGR1bW15IERDVCBibG9ja3MuICovCisgIGJ1ZmZlciA9IChKQkxPQ0tST1cpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlDX01BWF9CTE9DS1NfSU5fTUNVICogU0laRU9GKEpCTE9DSykpOworICBqemVyb19mYXIoKHZvaWQgRkFSICopIGJ1ZmZlciwgQ19NQVhfQkxPQ0tTX0lOX01DVSAqIFNJWkVPRihKQkxPQ0spKTsKKyAgZm9yIChpID0gMDsgaSA8IENfTUFYX0JMT0NLU19JTl9NQ1U7IGkrKykgeworICAgIGNvZWYtPmR1bW15X2J1ZmZlcltpXSA9IGJ1ZmZlciArIGk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qZGFwaW1pbi5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkYXBpbWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FkYjU5ZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qZGFwaW1pbi5jCkBAIC0wLDAgKzEsMzk1IEBACisvKgorICogamRhcGltaW4uYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGFwcGxpY2F0aW9uIGludGVyZmFjZSBjb2RlIGZvciB0aGUgZGVjb21wcmVzc2lvbiBoYWxmCisgKiBvZiB0aGUgSlBFRyBsaWJyYXJ5LiAgVGhlc2UgYXJlIHRoZSAibWluaW11bSIgQVBJIHJvdXRpbmVzIHRoYXQgbWF5IGJlCisgKiBuZWVkZWQgaW4gZWl0aGVyIHRoZSBub3JtYWwgZnVsbC1kZWNvbXByZXNzaW9uIGNhc2Ugb3IgdGhlCisgKiB0cmFuc2NvZGluZy1vbmx5IGNhc2UuCisgKgorICogTW9zdCBvZiB0aGUgcm91dGluZXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGFuIGFwcGxpY2F0aW9uCisgKiBhcmUgaW4gdGhpcyBmaWxlIG9yIGluIGpkYXBpc3RkLmMuICBCdXQgYWxzbyBzZWUgamNvbWFwaS5jIGZvciByb3V0aW5lcworICogc2hhcmVkIGJ5IGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uLCBhbmQgamR0cmFucy5jIGZvciB0aGUgdHJhbnNjb2RpbmcKKyAqIGNhc2UuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qCisgKiBJbml0aWFsaXphdGlvbiBvZiBhIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QuCisgKiBUaGUgZXJyb3IgbWFuYWdlciBtdXN0IGFscmVhZHkgYmUgc2V0IHVwIChpbiBjYXNlIG1lbW9yeSBtYW5hZ2VyIGZhaWxzKS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfQ3JlYXRlRGVjb21wcmVzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IHZlcnNpb24sIHNpemVfdCBzdHJ1Y3RzaXplKQoreworICBpbnQgaTsKKworICAvKiBHdWFyZCBhZ2FpbnN0IHZlcnNpb24gbWlzbWF0Y2hlcyBiZXR3ZWVuIGxpYnJhcnkgYW5kIGNhbGxlci4gKi8KKyAgY2luZm8tPm1lbSA9IE5VTEw7CQkvKiBzbyBqcGVnX2Rlc3Ryb3kga25vd3MgbWVtIG1nciBub3QgY2FsbGVkICovCisgIGlmICh2ZXJzaW9uICE9IEpQRUdfTElCX1ZFUlNJT04pCisgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQkFEX0xJQl9WRVJTSU9OLCBKUEVHX0xJQl9WRVJTSU9OLCB2ZXJzaW9uKTsKKyAgaWYgKHN0cnVjdHNpemUgIT0gU0laRU9GKHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KSkKKyAgICBFUlJFWElUMihjaW5mbywgSkVSUl9CQURfU1RSVUNUX1NJWkUsIAorCSAgICAgKGludCkgU0laRU9GKHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KSwgKGludCkgc3RydWN0c2l6ZSk7CisKKyAgLyogRm9yIGRlYnVnZ2luZyBwdXJwb3Nlcywgd2UgemVybyB0aGUgd2hvbGUgbWFzdGVyIHN0cnVjdHVyZS4KKyAgICogQnV0IHRoZSBhcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBzZXQgdGhlIGVyciBwb2ludGVyLCBhbmQgbWF5IGhhdmUgc2V0CisgICAqIGNsaWVudF9kYXRhLCBzbyB3ZSBoYXZlIHRvIHNhdmUgYW5kIHJlc3RvcmUgdGhvc2UgZmllbGRzLgorICAgKiBOb3RlOiBpZiBhcHBsaWNhdGlvbiBoYXNuJ3Qgc2V0IGNsaWVudF9kYXRhLCB0b29scyBsaWtlIFB1cmlmeSBtYXkKKyAgICogY29tcGxhaW4gaGVyZS4KKyAgICovCisgIHsKKyAgICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKiBlcnIgPSBjaW5mby0+ZXJyOworICAgIHZvaWQgKiBjbGllbnRfZGF0YSA9IGNpbmZvLT5jbGllbnRfZGF0YTsgLyogaWdub3JlIFB1cmlmeSBjb21wbGFpbnQgaGVyZSAqLworICAgIE1FTVpFUk8oY2luZm8sIFNJWkVPRihzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCkpOworICAgIGNpbmZvLT5lcnIgPSBlcnI7CisgICAgY2luZm8tPmNsaWVudF9kYXRhID0gY2xpZW50X2RhdGE7CisgIH0KKyAgY2luZm8tPmlzX2RlY29tcHJlc3NvciA9IFRSVUU7CisKKyAgLyogSW5pdGlhbGl6ZSBhIG1lbW9yeSBtYW5hZ2VyIGluc3RhbmNlIGZvciB0aGlzIG9iamVjdCAqLworICBqaW5pdF9tZW1vcnlfbWdyKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKworICAvKiBaZXJvIG91dCBwb2ludGVycyB0byBwZXJtYW5lbnQgc3RydWN0dXJlcy4gKi8KKyAgY2luZm8tPnByb2dyZXNzID0gTlVMTDsKKyAgY2luZm8tPnNyYyA9IE5VTEw7CisKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9RVUFOVF9UQkxTOyBpKyspCisgICAgY2luZm8tPnF1YW50X3RibF9wdHJzW2ldID0gTlVMTDsKKworICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7CisgICAgY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbaV0gPSBOVUxMOworICAgIGNpbmZvLT5hY19odWZmX3RibF9wdHJzW2ldID0gTlVMTDsKKyAgfQorCisgIC8qIEluaXRpYWxpemUgbWFya2VyIHByb2Nlc3NvciBzbyBhcHBsaWNhdGlvbiBjYW4gb3ZlcnJpZGUgbWV0aG9kcworICAgKiBmb3IgQ09NLCBBUFBuIG1hcmtlcnMgYmVmb3JlIGNhbGxpbmcganBlZ19yZWFkX2hlYWRlci4KKyAgICovCisgIGNpbmZvLT5tYXJrZXJfbGlzdCA9IE5VTEw7CisgIGppbml0X21hcmtlcl9yZWFkZXIoY2luZm8pOworCisgIC8qIEFuZCBpbml0aWFsaXplIHRoZSBvdmVyYWxsIGlucHV0IGNvbnRyb2xsZXIuICovCisgIGppbml0X2lucHV0X2NvbnRyb2xsZXIoY2luZm8pOworCisgIC8qIE9LLCBJJ20gcmVhZHkgKi8KKyAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9TVEFSVDsKK30KKworCisvKgorICogRGVzdHJ1Y3Rpb24gb2YgYSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0CisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAganBlZ19kZXN0cm95KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsgLyogdXNlIGNvbW1vbiByb3V0aW5lICovCit9CisKKworLyoKKyAqIEFib3J0IHByb2Nlc3Npbmcgb2YgYSBKUEVHIGRlY29tcHJlc3Npb24gb3BlcmF0aW9uLAorICogYnV0IGRvbid0IGRlc3Ryb3kgdGhlIG9iamVjdCBpdHNlbGYuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2Fib3J0X2RlY29tcHJlc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGpwZWdfYWJvcnQoKGpfY29tbW9uX3B0cikgY2luZm8pOyAvKiB1c2UgY29tbW9uIHJvdXRpbmUgKi8KK30KKworCisvKgorICogU2V0IGRlZmF1bHQgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLgorICovCisKK0xPQ0FMKHZvaWQpCitkZWZhdWx0X2RlY29tcHJlc3NfcGFybXMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIC8qIEd1ZXNzIHRoZSBpbnB1dCBjb2xvcnNwYWNlLCBhbmQgc2V0IG91dHB1dCBjb2xvcnNwYWNlIGFjY29yZGluZ2x5LiAqLworICAvKiAoV2lzaCBKUEVHIGNvbW1pdHRlZSBoYWQgcHJvdmlkZWQgYSByZWFsIHdheSB0byBzcGVjaWZ5IHRoaXMuLi4pICovCisgIC8qIE5vdGUgYXBwbGljYXRpb24gbWF5IG92ZXJyaWRlIG91ciBndWVzc2VzLiAqLworICBzd2l0Y2ggKGNpbmZvLT5udW1fY29tcG9uZW50cykgeworICBjYXNlIDE6CisgICAgY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOworICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOworICAgIGJyZWFrOworICAgIAorICBjYXNlIDM6CisgICAgaWYgKGNpbmZvLT5zYXdfSkZJRl9tYXJrZXIpIHsKKyAgICAgIGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOyAvKiBKRklGIGltcGxpZXMgWUNiQ3IgKi8KKyAgICB9IGVsc2UgaWYgKGNpbmZvLT5zYXdfQWRvYmVfbWFya2VyKSB7CisgICAgICBzd2l0Y2ggKGNpbmZvLT5BZG9iZV90cmFuc2Zvcm0pIHsKKyAgICAgIGNhc2UgMDoKKwljaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19SR0I7CisJYnJlYWs7CisgICAgICBjYXNlIDE6CisJY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfWUNiQ3I7CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorCVdBUk5NUzEoY2luZm8sIEpXUk5fQURPQkVfWEZPUk0sIGNpbmZvLT5BZG9iZV90cmFuc2Zvcm0pOworCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOyAvKiBhc3N1bWUgaXQncyBZQ2JDciAqLworCWJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiBTYXcgbm8gc3BlY2lhbCBtYXJrZXJzLCB0cnkgdG8gZ3Vlc3MgZnJvbSB0aGUgY29tcG9uZW50IElEcyAqLworICAgICAgaW50IGNpZDAgPSBjaW5mby0+Y29tcF9pbmZvWzBdLmNvbXBvbmVudF9pZDsKKyAgICAgIGludCBjaWQxID0gY2luZm8tPmNvbXBfaW5mb1sxXS5jb21wb25lbnRfaWQ7CisgICAgICBpbnQgY2lkMiA9IGNpbmZvLT5jb21wX2luZm9bMl0uY29tcG9uZW50X2lkOworCisgICAgICBpZiAoY2lkMCA9PSAxICYmIGNpZDEgPT0gMiAmJiBjaWQyID09IDMpCisJY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfWUNiQ3I7IC8qIGFzc3VtZSBKRklGIHcvb3V0IG1hcmtlciAqLworICAgICAgZWxzZSBpZiAoY2lkMCA9PSA4MiAmJiBjaWQxID09IDcxICYmIGNpZDIgPT0gNjYpCisJY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOyAvKiBBU0NJSSAnUicsICdHJywgJ0InICovCisgICAgICBlbHNlIHsKKwlUUkFDRU1TMyhjaW5mbywgMSwgSlRSQ19VTktOT1dOX0lEUywgY2lkMCwgY2lkMSwgY2lkMik7CisJY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfWUNiQ3I7IC8qIGFzc3VtZSBpdCdzIFlDYkNyICovCisgICAgICB9CisgICAgfQorICAgIC8qIEFsd2F5cyBndWVzcyBSR0IgaXMgcHJvcGVyIG91dHB1dCBjb2xvcnNwYWNlLiAqLworICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOworICAgIGJyZWFrOworICAgIAorICBjYXNlIDQ6CisgICAgaWYgKGNpbmZvLT5zYXdfQWRvYmVfbWFya2VyKSB7CisgICAgICBzd2l0Y2ggKGNpbmZvLT5BZG9iZV90cmFuc2Zvcm0pIHsKKyAgICAgIGNhc2UgMDoKKwljaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19DTVlLOworCWJyZWFrOworICAgICAgY2FzZSAyOgorCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDQ0s7CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorCVdBUk5NUzEoY2luZm8sIEpXUk5fQURPQkVfWEZPUk0sIGNpbmZvLT5BZG9iZV90cmFuc2Zvcm0pOworCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDQ0s7IC8qIGFzc3VtZSBpdCdzIFlDQ0sgKi8KKwlicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogTm8gc3BlY2lhbCBtYXJrZXJzLCBhc3N1bWUgc3RyYWlnaHQgQ01ZSy4gKi8KKyAgICAgIGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX0NNWUs7CisgICAgfQorICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPSBKQ1NfQ01ZSzsKKyAgICBicmVhazsKKyAgICAKKyAgZGVmYXVsdDoKKyAgICBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19VTktOT1dOOworICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPSBKQ1NfVU5LTk9XTjsKKyAgICBicmVhazsKKyAgfQorCisgIC8qIFNldCBkZWZhdWx0cyBmb3Igb3RoZXIgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLiAqLworICBjaW5mby0+c2NhbGVfbnVtID0gMTsJCS8qIDE6MSBzY2FsaW5nICovCisgIGNpbmZvLT5zY2FsZV9kZW5vbSA9IDE7CisgIGNpbmZvLT5vdXRwdXRfZ2FtbWEgPSAxLjA7CisgIGNpbmZvLT5idWZmZXJlZF9pbWFnZSA9IEZBTFNFOworICBjaW5mby0+cmF3X2RhdGFfb3V0ID0gRkFMU0U7CisgIGNpbmZvLT5kY3RfbWV0aG9kID0gSkRDVF9ERUZBVUxUOworICBjaW5mby0+ZG9fZmFuY3lfdXBzYW1wbGluZyA9IFRSVUU7CisgIGNpbmZvLT5kb19ibG9ja19zbW9vdGhpbmcgPSBUUlVFOworICBjaW5mby0+cXVhbnRpemVfY29sb3JzID0gRkFMU0U7CisgIC8qIFdlIHNldCB0aGVzZSBpbiBjYXNlIGFwcGxpY2F0aW9uIG9ubHkgc2V0cyBxdWFudGl6ZV9jb2xvcnMuICovCisgIGNpbmZvLT5kaXRoZXJfbW9kZSA9IEpESVRIRVJfRlM7CisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECisgIGNpbmZvLT50d29fcGFzc19xdWFudGl6ZSA9IFRSVUU7CisjZWxzZQorICBjaW5mby0+dHdvX3Bhc3NfcXVhbnRpemUgPSBGQUxTRTsKKyNlbmRpZgorICBjaW5mby0+ZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzID0gMjU2OworICBjaW5mby0+Y29sb3JtYXAgPSBOVUxMOworICAvKiBJbml0aWFsaXplIGZvciBubyBtb2RlIGNoYW5nZSBpbiBidWZmZXJlZC1pbWFnZSBtb2RlLiAqLworICBjaW5mby0+ZW5hYmxlXzFwYXNzX3F1YW50ID0gRkFMU0U7CisgIGNpbmZvLT5lbmFibGVfZXh0ZXJuYWxfcXVhbnQgPSBGQUxTRTsKKyAgY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCA9IEZBTFNFOworfQorCisKKy8qCisgKiBEZWNvbXByZXNzaW9uIHN0YXJ0dXA6IHJlYWQgc3RhcnQgb2YgSlBFRyBkYXRhc3RyZWFtIHRvIHNlZSB3aGF0J3MgdGhlcmUuCisgKiBOZWVkIG9ubHkgaW5pdGlhbGl6ZSBKUEVHIG9iamVjdCBhbmQgc3VwcGx5IGEgZGF0YSBzb3VyY2UgYmVmb3JlIGNhbGxpbmcuCisgKgorICogVGhpcyByb3V0aW5lIHdpbGwgcmVhZCBhcyBmYXIgYXMgdGhlIGZpcnN0IFNPUyBtYXJrZXIgKGllLCBhY3R1YWwgc3RhcnQgb2YKKyAqIGNvbXByZXNzZWQgZGF0YSksIGFuZCB3aWxsIHNhdmUgYWxsIHRhYmxlcyBhbmQgcGFyYW1ldGVycyBpbiB0aGUgSlBFRworICogb2JqZWN0LiAgSXQgd2lsbCBhbHNvIGluaXRpYWxpemUgdGhlIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycyB0byBkZWZhdWx0CisgKiB2YWx1ZXMsIGFuZCBmaW5hbGx5IHJldHVybiBKUEVHX0hFQURFUl9PSy4gIE9uIHJldHVybiwgdGhlIGFwcGxpY2F0aW9uIG1heQorICogYWRqdXN0IHRoZSBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYW5kIHRoZW4gY2FsbCBqcGVnX3N0YXJ0X2RlY29tcHJlc3MuCisgKiAoT3IsIGlmIHRoZSBhcHBsaWNhdGlvbiBvbmx5IHdhbnRlZCB0byBkZXRlcm1pbmUgdGhlIGltYWdlIHBhcmFtZXRlcnMsCisgKiB0aGUgZGF0YSBuZWVkIG5vdCBiZSBkZWNvbXByZXNzZWQuICBJbiB0aGF0IGNhc2UsIGNhbGwganBlZ19hYm9ydCBvcgorICoganBlZ19kZXN0cm95IHRvIHJlbGVhc2UgYW55IHRlbXBvcmFyeSBzcGFjZS4pCisgKiBJZiBhbiBhYmJyZXZpYXRlZCAodGFibGVzIG9ubHkpIGRhdGFzdHJlYW0gaXMgcHJlc2VudGVkLCB0aGUgcm91dGluZSB3aWxsCisgKiByZXR1cm4gSlBFR19IRUFERVJfVEFCTEVTX09OTFkgdXBvbiByZWFjaGluZyBFT0kuICBUaGUgYXBwbGljYXRpb24gbWF5IHRoZW4KKyAqIHJlLXVzZSB0aGUgSlBFRyBvYmplY3QgdG8gcmVhZCB0aGUgYWJicmV2aWF0ZWQgaW1hZ2UgZGF0YXN0cmVhbShzKS4KKyAqIEl0IGlzIHVubmVjZXNzYXJ5IChidXQgT0spIHRvIGNhbGwganBlZ19hYm9ydCBpbiB0aGlzIGNhc2UuCisgKiBUaGUgSlBFR19TVVNQRU5ERUQgcmV0dXJuIGNvZGUgb25seSBvY2N1cnMgaWYgdGhlIGRhdGEgc291cmNlIG1vZHVsZQorICogcmVxdWVzdHMgc3VzcGVuc2lvbiBvZiB0aGUgZGVjb21wcmVzc29yLiAgSW4gdGhpcyBjYXNlIHRoZSBhcHBsaWNhdGlvbgorICogc2hvdWxkIGxvYWQgbW9yZSBzb3VyY2UgZGF0YSBhbmQgdGhlbiByZS1jYWxsIGpwZWdfcmVhZF9oZWFkZXIgdG8gcmVzdW1lCisgKiBwcm9jZXNzaW5nLgorICogSWYgYSBub24tc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBpcyB1c2VkIGFuZCByZXF1aXJlX2ltYWdlIGlzIFRSVUUsIHRoZW4gdGhlCisgKiByZXR1cm4gY29kZSBuZWVkIG5vdCBiZSBpbnNwZWN0ZWQgc2luY2Ugb25seSBKUEVHX0hFQURFUl9PSyBpcyBwb3NzaWJsZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgbm93IGp1c3QgYSBmcm9udCBlbmQgdG8ganBlZ19jb25zdW1lX2lucHV0LCB3aXRoIHNvbWUKKyAqIGV4dHJhIGVycm9yIGNoZWNraW5nLgorICovCisKK0dMT0JBTChpbnQpCitqcGVnX3JlYWRfaGVhZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIHJlcXVpcmVfaW1hZ2UpCit7CisgIGludCByZXRjb2RlOworCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9TVEFSVCAmJgorICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfSU5IRUFERVIpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKworICByZXRjb2RlID0ganBlZ19jb25zdW1lX2lucHV0KGNpbmZvKTsKKworICBzd2l0Y2ggKHJldGNvZGUpIHsKKyAgY2FzZSBKUEVHX1JFQUNIRURfU09TOgorICAgIHJldGNvZGUgPSBKUEVHX0hFQURFUl9PSzsKKyAgICBicmVhazsKKyAgY2FzZSBKUEVHX1JFQUNIRURfRU9JOgorICAgIGlmIChyZXF1aXJlX2ltYWdlKQkJLyogQ29tcGxhaW4gaWYgYXBwbGljYXRpb24gd2FudGVkIGFuIGltYWdlICovCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PX0lNQUdFKTsKKyAgICAvKiBSZXNldCB0byBzdGFydCBzdGF0ZTsgaXQgd291bGQgYmUgc2FmZXIgdG8gcmVxdWlyZSB0aGUgYXBwbGljYXRpb24gdG8KKyAgICAgKiBjYWxsIGpwZWdfYWJvcnQsIGJ1dCB3ZSBjYW4ndCBjaGFuZ2UgaXQgbm93IGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuCisgICAgICogQSBzaWRlIGVmZmVjdCBpcyB0byBmcmVlIGFueSB0ZW1wb3JhcnkgbWVtb3J5ICh0aGVyZSBzaG91bGRuJ3QgYmUgYW55KS4KKyAgICAgKi8KKyAgICBqcGVnX2Fib3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsgLyogc2V0cyBzdGF0ZSA9IERTVEFURV9TVEFSVCAqLworICAgIHJldGNvZGUgPSBKUEVHX0hFQURFUl9UQUJMRVNfT05MWTsKKyAgICBicmVhazsKKyAgY2FzZSBKUEVHX1NVU1BFTkRFRDoKKyAgICAvKiBubyB3b3JrICovCisgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gcmV0Y29kZTsKK30KKworCisvKgorICogQ29uc3VtZSBkYXRhIGluIGFkdmFuY2Ugb2Ygd2hhdCB0aGUgZGVjb21wcmVzc29yIHJlcXVpcmVzLgorICogVGhpcyBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIG9uY2UgdGhlIGRlY29tcHJlc3NvciBvYmplY3QgaGFzCisgKiBiZWVuIGNyZWF0ZWQgYW5kIGEgZGF0YSBzb3VyY2UgaGFzIGJlZW4gc2V0IHVwLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBlc3NlbnRpYWxseSBhIHN0YXRlIG1hY2hpbmUgdGhhdCBoYW5kbGVzIGEgY291cGxlCisgKiBvZiBjcml0aWNhbCBzdGF0ZS10cmFuc2l0aW9uIGFjdGlvbnMsIG5hbWVseSBpbml0aWFsIHNldHVwIGFuZAorICogdHJhbnNpdGlvbiBmcm9tIGhlYWRlciBzY2FubmluZyB0byByZWFkeS1mb3Itc3RhcnRfZGVjb21wcmVzcy4KKyAqIEFsbCB0aGUgYWN0dWFsIGlucHV0IGlzIGRvbmUgdmlhIHRoZSBpbnB1dCBjb250cm9sbGVyJ3MgY29uc3VtZV9pbnB1dAorICogbWV0aG9kLgorICovCisKK0dMT0JBTChpbnQpCitqcGVnX2NvbnN1bWVfaW5wdXQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGludCByZXRjb2RlID0gSlBFR19TVVNQRU5ERUQ7CisKKyAgLyogTkI6IGV2ZXJ5IHBvc3NpYmxlIERTVEFURSB2YWx1ZSBzaG91bGQgYmUgbGlzdGVkIGluIHRoaXMgc3dpdGNoICovCisgIHN3aXRjaCAoY2luZm8tPmdsb2JhbF9zdGF0ZSkgeworICBjYXNlIERTVEFURV9TVEFSVDoKKyAgICAvKiBTdGFydC1vZi1kYXRhc3RyZWFtIGFjdGlvbnM6IHJlc2V0IGFwcHJvcHJpYXRlIG1vZHVsZXMgKi8KKyAgICAoKmNpbmZvLT5pbnB1dGN0bC0+cmVzZXRfaW5wdXRfY29udHJvbGxlcikgKGNpbmZvKTsKKyAgICAvKiBJbml0aWFsaXplIGFwcGxpY2F0aW9uJ3MgZGF0YSBzb3VyY2UgbW9kdWxlICovCisgICAgKCpjaW5mby0+c3JjLT5pbml0X3NvdXJjZSkgKGNpbmZvKTsKKyAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX0lOSEVBREVSOworICAgIC8qRkFMTFRIUk9VR0gqLworICBjYXNlIERTVEFURV9JTkhFQURFUjoKKyAgICByZXRjb2RlID0gKCpjaW5mby0+aW5wdXRjdGwtPmNvbnN1bWVfaW5wdXQpIChjaW5mbyk7CisgICAgaWYgKHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX1NPUykgeyAvKiBGb3VuZCBTT1MsIHByZXBhcmUgdG8gZGVjb21wcmVzcyAqLworICAgICAgLyogU2V0IHVwIGRlZmF1bHQgcGFyYW1ldGVycyBiYXNlZCBvbiBoZWFkZXIgZGF0YSAqLworICAgICAgZGVmYXVsdF9kZWNvbXByZXNzX3Bhcm1zKGNpbmZvKTsKKyAgICAgIC8qIFNldCBnbG9iYWwgc3RhdGU6IHJlYWR5IGZvciBzdGFydF9kZWNvbXByZXNzICovCisgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1JFQURZOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBEU1RBVEVfUkVBRFk6CisgICAgLyogQ2FuJ3QgYWR2YW5jZSBwYXN0IGZpcnN0IFNPUyB1bnRpbCBzdGFydF9kZWNvbXByZXNzIGlzIGNhbGxlZCAqLworICAgIHJldGNvZGUgPSBKUEVHX1JFQUNIRURfU09TOworICAgIGJyZWFrOworICBjYXNlIERTVEFURV9QUkVMT0FEOgorICBjYXNlIERTVEFURV9QUkVTQ0FOOgorICBjYXNlIERTVEFURV9TQ0FOTklORzoKKyAgY2FzZSBEU1RBVEVfUkFXX09LOgorICBjYXNlIERTVEFURV9CVUZJTUFHRToKKyAgY2FzZSBEU1RBVEVfQlVGUE9TVDoKKyAgY2FzZSBEU1RBVEVfU1RPUFBJTkc6CisgICAgcmV0Y29kZSA9ICgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KSAoY2luZm8pOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisgIH0KKyAgcmV0dXJuIHJldGNvZGU7Cit9CisKKworLyoKKyAqIEhhdmUgd2UgZmluaXNoZWQgcmVhZGluZyB0aGUgaW5wdXQgZmlsZT8KKyAqLworCitHTE9CQUwoYm9vbGVhbikKK2pwZWdfaW5wdXRfY29tcGxldGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIC8qIENoZWNrIGZvciB2YWxpZCBqcGVnIG9iamVjdCAqLworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA8IERTVEFURV9TVEFSVCB8fAorICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA+IERTVEFURV9TVE9QUElORykKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICByZXR1cm4gY2luZm8tPmlucHV0Y3RsLT5lb2lfcmVhY2hlZDsKK30KKworCisvKgorICogSXMgdGhlcmUgbW9yZSB0aGFuIG9uZSBzY2FuPworICovCisKK0dMT0JBTChib29sZWFuKQoranBlZ19oYXNfbXVsdGlwbGVfc2NhbnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIC8qIE9ubHkgdmFsaWQgYWZ0ZXIganBlZ19yZWFkX2hlYWRlciBjb21wbGV0ZXMgKi8KKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPCBEU1RBVEVfUkVBRFkgfHwKKyAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPiBEU1RBVEVfU1RPUFBJTkcpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKyAgcmV0dXJuIGNpbmZvLT5pbnB1dGN0bC0+aGFzX211bHRpcGxlX3NjYW5zOworfQorCisKKy8qCisgKiBGaW5pc2ggSlBFRyBkZWNvbXByZXNzaW9uLgorICoKKyAqIFRoaXMgd2lsbCBub3JtYWxseSBqdXN0IHZlcmlmeSB0aGUgZmlsZSB0cmFpbGVyIGFuZCByZWxlYXNlIHRlbXAgc3RvcmFnZS4KKyAqCisgKiBSZXR1cm5zIEZBTFNFIGlmIHN1c3BlbmRlZC4gIFRoZSByZXR1cm4gdmFsdWUgbmVlZCBiZSBpbnNwZWN0ZWQgb25seSBpZgorICogYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlIGlzIHVzZWQuCisgKi8KKworR0xPQkFMKGJvb2xlYW4pCitqcGVnX2ZpbmlzaF9kZWNvbXByZXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBpZiAoKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1NDQU5OSU5HIHx8CisgICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfUkFXX09LKSAmJiAhIGNpbmZvLT5idWZmZXJlZF9pbWFnZSkgeworICAgIC8qIFRlcm1pbmF0ZSBmaW5hbCBwYXNzIG9mIG5vbi1idWZmZXJlZCBtb2RlICovCisgICAgaWYgKGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPCBjaW5mby0+b3V0cHV0X2hlaWdodCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVE9PX0xJVFRMRV9EQVRBKTsKKyAgICAoKmNpbmZvLT5tYXN0ZXItPmZpbmlzaF9vdXRwdXRfcGFzcykgKGNpbmZvKTsKKyAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1NUT1BQSU5HOworICB9IGVsc2UgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX0JVRklNQUdFKSB7CisgICAgLyogRmluaXNoaW5nIGFmdGVyIGEgYnVmZmVyZWQtaW1hZ2Ugb3BlcmF0aW9uICovCisgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9TVE9QUElORzsKKyAgfSBlbHNlIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9TVE9QUElORykgeworICAgIC8qIFNUT1BQSU5HID0gcmVwZWF0IGNhbGwgYWZ0ZXIgYSBzdXNwZW5zaW9uLCBhbnl0aGluZyBlbHNlIGlzIGVycm9yICovCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKyAgfQorICAvKiBSZWFkIHVudGlsIEVPSSAqLworICB3aGlsZSAoISBjaW5mby0+aW5wdXRjdGwtPmVvaV9yZWFjaGVkKSB7CisgICAgaWYgKCgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KSAoY2luZm8pID09IEpQRUdfU1VTUEVOREVEKQorICAgICAgcmV0dXJuIEZBTFNFOwkJLyogU3VzcGVuZCwgY29tZSBiYWNrIGxhdGVyICovCisgIH0KKyAgLyogRG8gZmluYWwgY2xlYW51cCAqLworICAoKmNpbmZvLT5zcmMtPnRlcm1fc291cmNlKSAoY2luZm8pOworICAvKiBXZSBjYW4gdXNlIGpwZWdfYWJvcnQgdG8gcmVsZWFzZSBtZW1vcnkgYW5kIHJlc2V0IGdsb2JhbF9zdGF0ZSAqLworICBqcGVnX2Fib3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRhcGlzdGQuYyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qZGFwaXN0ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YmJiOTYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRhcGlzdGQuYwpAQCAtMCwwICsxLDI3NiBAQAorLyoKKyAqIGpkYXBpc3RkLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgY29kZSBmb3IgdGhlIGRlY29tcHJlc3Npb24gaGFsZgorICogb2YgdGhlIEpQRUcgbGlicmFyeS4gIFRoZXNlIGFyZSB0aGUgInN0YW5kYXJkIiBBUEkgcm91dGluZXMgdGhhdCBhcmUKKyAqIHVzZWQgaW4gdGhlIG5vcm1hbCBmdWxsLWRlY29tcHJlc3Npb24gY2FzZS4gIFRoZXkgYXJlIG5vdCB1c2VkIGJ5IGEKKyAqIHRyYW5zY29kaW5nLW9ubHkgYXBwbGljYXRpb24uICBOb3RlIHRoYXQgaWYgYW4gYXBwbGljYXRpb24gbGlua3MgaW4KKyAqIGpwZWdfc3RhcnRfZGVjb21wcmVzcywgaXQgd2lsbCBlbmQgdXAgbGlua2luZyBpbiB0aGUgZW50aXJlIGRlY29tcHJlc3Nvci4KKyAqIFdlIHRodXMgbXVzdCBzZXBhcmF0ZSB0aGlzIGZpbGUgZnJvbSBqZGFwaW1pbi5jIHRvIGF2b2lkIGxpbmtpbmcgdGhlCisgKiB3aG9sZSBkZWNvbXByZXNzaW9uIGxpYnJhcnkgaW50byBhIHRyYW5zY29kZXIuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitMT0NBTChib29sZWFuKSBvdXRwdXRfcGFzc19zZXR1cCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKworCisvKgorICogRGVjb21wcmVzc2lvbiBpbml0aWFsaXphdGlvbi4KKyAqIGpwZWdfcmVhZF9oZWFkZXIgbXVzdCBiZSBjb21wbGV0ZWQgYmVmb3JlIGNhbGxpbmcgdGhpcy4KKyAqCisgKiBJZiBhIG11bHRpcGFzcyBvcGVyYXRpbmcgbW9kZSB3YXMgc2VsZWN0ZWQsIHRoaXMgd2lsbCBkbyBhbGwgYnV0IHRoZQorICogbGFzdCBwYXNzLCBhbmQgdGh1cyBtYXkgdGFrZSBhIGdyZWF0IGRlYWwgb2YgdGltZS4KKyAqCisgKiBSZXR1cm5zIEZBTFNFIGlmIHN1c3BlbmRlZC4gIFRoZSByZXR1cm4gdmFsdWUgbmVlZCBiZSBpbnNwZWN0ZWQgb25seSBpZgorICogYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlIGlzIHVzZWQuCisgKi8KKworR0xPQkFMKGJvb2xlYW4pCitqcGVnX3N0YXJ0X2RlY29tcHJlc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9SRUFEWSkgeworICAgIC8qIEZpcnN0IGNhbGw6IGluaXRpYWxpemUgbWFzdGVyIGNvbnRyb2wsIHNlbGVjdCBhY3RpdmUgbW9kdWxlcyAqLworICAgIGppbml0X21hc3Rlcl9kZWNvbXByZXNzKGNpbmZvKTsKKyAgICBpZiAoY2luZm8tPmJ1ZmZlcmVkX2ltYWdlKSB7CisgICAgICAvKiBObyBtb3JlIHdvcmsgaGVyZTsgZXhwZWN0aW5nIGpwZWdfc3RhcnRfb3V0cHV0IG5leHQgKi8KKyAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfQlVGSU1BR0U7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9QUkVMT0FEOworICB9CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9QUkVMT0FEKSB7CisgICAgLyogSWYgZmlsZSBoYXMgbXVsdGlwbGUgc2NhbnMsIGFic29yYiB0aGVtIGFsbCBpbnRvIHRoZSBjb2VmIGJ1ZmZlciAqLworICAgIGlmIChjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FucykgeworI2lmZGVmIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorICAgICAgZm9yICg7OykgeworCWludCByZXRjb2RlOworCS8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KKwlpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpCisJICAoKmNpbmZvLT5wcm9ncmVzcy0+cHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKwkvKiBBYnNvcmIgc29tZSBtb3JlIGlucHV0ICovCisJcmV0Y29kZSA9ICgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KSAoY2luZm8pOworCWlmIChyZXRjb2RlID09IEpQRUdfU1VTUEVOREVEKQorCSAgcmV0dXJuIEZBTFNFOworCWlmIChyZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9FT0kpCisJICBicmVhazsKKwkvKiBBZHZhbmNlIHByb2dyZXNzIGNvdW50ZXIgaWYgYXBwcm9wcmlhdGUgKi8KKwlpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwgJiYKKwkgICAgKHJldGNvZGUgPT0gSlBFR19ST1dfQ09NUExFVEVEIHx8IHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX1NPUykpIHsKKwkgIGlmICgrK2NpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID49IGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCkgeworCSAgICAvKiBqZG1hc3RlciB1bmRlcmVzdGltYXRlZCBudW1iZXIgb2Ygc2NhbnM7IHJhdGNoZXQgdXAgb25lIHNjYW4gKi8KKwkgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ICs9IChsb25nKSBjaW5mby0+dG90YWxfaU1DVV9yb3dzOworCSAgfQorCX0KKyAgICAgIH0KKyNlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisjZW5kaWYgLyogRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCisgICAgfQorICAgIGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgPSBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXI7CisgIH0gZWxzZSBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfUFJFU0NBTikKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICAvKiBQZXJmb3JtIGFueSBkdW1teSBvdXRwdXQgcGFzc2VzLCBhbmQgc2V0IHVwIGZvciB0aGUgZmluYWwgcGFzcyAqLworICByZXR1cm4gb3V0cHV0X3Bhc3Nfc2V0dXAoY2luZm8pOworfQorCisKKy8qCisgKiBTZXQgdXAgZm9yIGFuIG91dHB1dCBwYXNzLCBhbmQgcGVyZm9ybSBhbnkgZHVtbXkgcGFzcyhlcykgbmVlZGVkLgorICogQ29tbW9uIHN1YnJvdXRpbmUgZm9yIGpwZWdfc3RhcnRfZGVjb21wcmVzcyBhbmQganBlZ19zdGFydF9vdXRwdXQuCisgKiBFbnRyeTogZ2xvYmFsX3N0YXRlID0gRFNUQVRFX1BSRVNDQU4gb25seSBpZiBwcmV2aW91c2x5IHN1c3BlbmRlZC4KKyAqIEV4aXQ6IElmIGRvbmUsIHJldHVybnMgVFJVRSBhbmQgc2V0cyBnbG9iYWxfc3RhdGUgZm9yIHByb3BlciBvdXRwdXQgbW9kZS4KKyAqICAgICAgIElmIHN1c3BlbmRlZCwgcmV0dXJucyBGQUxTRSBhbmQgc2V0cyBnbG9iYWxfc3RhdGUgPSBEU1RBVEVfUFJFU0NBTi4KKyAqLworCitMT0NBTChib29sZWFuKQorb3V0cHV0X3Bhc3Nfc2V0dXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9QUkVTQ0FOKSB7CisgICAgLyogRmlyc3QgY2FsbDogZG8gcGFzcyBzZXR1cCAqLworICAgICgqY2luZm8tPm1hc3Rlci0+cHJlcGFyZV9mb3Jfb3V0cHV0X3Bhc3MpIChjaW5mbyk7CisgICAgY2luZm8tPm91dHB1dF9zY2FubGluZSA9IDA7CisgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9QUkVTQ0FOOworICB9CisgIC8qIExvb3Agb3ZlciBhbnkgcmVxdWlyZWQgZHVtbXkgcGFzc2VzICovCisgIHdoaWxlIChjaW5mby0+bWFzdGVyLT5pc19kdW1teV9wYXNzKSB7CisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECisgICAgLyogQ3JhbmsgdGhyb3VnaCB0aGUgZHVtbXkgcGFzcyAqLworICAgIHdoaWxlIChjaW5mby0+b3V0cHV0X3NjYW5saW5lIDwgY2luZm8tPm91dHB1dF9oZWlnaHQpIHsKKyAgICAgIEpESU1FTlNJT04gbGFzdF9zY2FubGluZTsKKyAgICAgIC8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KKyAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgeworCWNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmU7CisJY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0OworCSgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICAgICAgfQorICAgICAgLyogUHJvY2VzcyBzb21lIGRhdGEgKi8KKyAgICAgIGxhc3Rfc2NhbmxpbmUgPSBjaW5mby0+b3V0cHV0X3NjYW5saW5lOworICAgICAgKCpjaW5mby0+bWFpbi0+cHJvY2Vzc19kYXRhKSAoY2luZm8sIChKU0FNUEFSUkFZKSBOVUxMLAorCQkJCSAgICAmY2luZm8tPm91dHB1dF9zY2FubGluZSwgKEpESU1FTlNJT04pIDApOworICAgICAgaWYgKGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPT0gbGFzdF9zY2FubGluZSkKKwlyZXR1cm4gRkFMU0U7CQkvKiBObyBwcm9ncmVzcyBtYWRlLCBtdXN0IHN1c3BlbmQgKi8KKyAgICB9CisgICAgLyogRmluaXNoIHVwIGR1bW15IHBhc3MsIGFuZCBzZXQgdXAgZm9yIGFub3RoZXIgb25lICovCisgICAgKCpjaW5mby0+bWFzdGVyLT5maW5pc2hfb3V0cHV0X3Bhc3MpIChjaW5mbyk7CisgICAgKCpjaW5mby0+bWFzdGVyLT5wcmVwYXJlX2Zvcl9vdXRwdXRfcGFzcykgKGNpbmZvKTsKKyAgICBjaW5mby0+b3V0cHV0X3NjYW5saW5lID0gMDsKKyNlbHNlCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmIC8qIFFVQU5UXzJQQVNTX1NVUFBPUlRFRCAqLworICB9CisgIC8qIFJlYWR5IGZvciBhcHBsaWNhdGlvbiB0byBkcml2ZSBvdXRwdXQgcGFzcyB0aHJvdWdoCisgICAqIGpwZWdfcmVhZF9zY2FubGluZXMgb3IganBlZ19yZWFkX3Jhd19kYXRhLgorICAgKi8KKyAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IGNpbmZvLT5yYXdfZGF0YV9vdXQgPyBEU1RBVEVfUkFXX09LIDogRFNUQVRFX1NDQU5OSU5HOworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogUmVhZCBzb21lIHNjYW5saW5lcyBvZiBkYXRhIGZyb20gdGhlIEpQRUcgZGVjb21wcmVzc29yLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSB0aGUgbnVtYmVyIG9mIGxpbmVzIGFjdHVhbGx5IHJlYWQuCisgKiBUaGlzIG1heSBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciByZXF1ZXN0ZWQgaW4gc2V2ZXJhbCBjYXNlcywKKyAqIGluY2x1ZGluZyBib3R0b20gb2YgaW1hZ2UsIGRhdGEgc291cmNlIHN1c3BlbnNpb24sIGFuZCBvcGVyYXRpbmcKKyAqIG1vZGVzIHRoYXQgZW1pdCBtdWx0aXBsZSBzY2FubGluZXMgYXQgYSB0aW1lLgorICoKKyAqIE5vdGU6IHdlIHdhcm4gYWJvdXQgZXhjZXNzIGNhbGxzIHRvIGpwZWdfcmVhZF9zY2FubGluZXMoKSBzaW5jZQorICogdGhpcyBsaWtlbHkgc2lnbmFscyBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtbWVyIGVycm9yLiAgSG93ZXZlciwKKyAqIGFuIG92ZXJzaXplIGJ1ZmZlciAobWF4X2xpbmVzID4gc2NhbmxpbmVzIHJlbWFpbmluZykgaXMgbm90IGFuIGVycm9yLgorICovCisKK0dMT0JBTChKRElNRU5TSU9OKQoranBlZ19yZWFkX3NjYW5saW5lcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBzY2FubGluZXMsCisJCSAgICAgSkRJTUVOU0lPTiBtYXhfbGluZXMpCit7CisgIEpESU1FTlNJT04gcm93X2N0cjsKKworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfU0NBTk5JTkcpCisJICByZXR1cm4gMDsgLyogWFlRIDIwMTAtNi0yNzogZG9uJ3QgdGhyb3cgZXhjZXB0aW9uIGhlcmUgKi8KKy8qICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7ICovCisgIGlmIChjaW5mby0+b3V0cHV0X3NjYW5saW5lID49IGNpbmZvLT5vdXRwdXRfaGVpZ2h0KSB7CisgICAgV0FSTk1TKGNpbmZvLCBKV1JOX1RPT19NVUNIX0RBVEEpOworICAgIHJldHVybiAwOworICB9CisKKyAgLyogQ2FsbCBwcm9ncmVzcyBtb25pdG9yIGhvb2sgaWYgcHJlc2VudCAqLworICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpIHsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfY291bnRlciA9IChsb25nKSBjaW5mby0+b3V0cHV0X3NjYW5saW5lOworICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+b3V0cHV0X2hlaWdodDsKKyAgICAoKmNpbmZvLT5wcm9ncmVzcy0+cHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgfQorCisgIC8qIFByb2Nlc3Mgc29tZSBkYXRhICovCisgIHJvd19jdHIgPSAwOworICAoKmNpbmZvLT5tYWluLT5wcm9jZXNzX2RhdGEpIChjaW5mbywgc2NhbmxpbmVzLCAmcm93X2N0ciwgbWF4X2xpbmVzKTsKKyAgY2luZm8tPm91dHB1dF9zY2FubGluZSArPSByb3dfY3RyOworICByZXR1cm4gcm93X2N0cjsKK30KKworCisvKgorICogQWx0ZXJuYXRlIGVudHJ5IHBvaW50IHRvIHJlYWQgcmF3IGRhdGEuCisgKiBQcm9jZXNzZXMgZXhhY3RseSBvbmUgaU1DVSByb3cgcGVyIGNhbGwsIHVubGVzcyBzdXNwZW5kZWQuCisgKi8KKworR0xPQkFMKEpESU1FTlNJT04pCitqcGVnX3JlYWRfcmF3X2RhdGEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgZGF0YSwKKwkJICAgIEpESU1FTlNJT04gbWF4X2xpbmVzKQoreworICBKRElNRU5TSU9OIGxpbmVzX3Blcl9pTUNVX3JvdzsKKworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfUkFXX09LKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisgIGlmIChjaW5mby0+b3V0cHV0X3NjYW5saW5lID49IGNpbmZvLT5vdXRwdXRfaGVpZ2h0KSB7CisgICAgV0FSTk1TKGNpbmZvLCBKV1JOX1RPT19NVUNIX0RBVEEpOworICAgIHJldHVybiAwOworICB9CisKKyAgLyogQ2FsbCBwcm9ncmVzcyBtb25pdG9yIGhvb2sgaWYgcHJlc2VudCAqLworICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpIHsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfY291bnRlciA9IChsb25nKSBjaW5mby0+b3V0cHV0X3NjYW5saW5lOworICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+b3V0cHV0X2hlaWdodDsKKyAgICAoKmNpbmZvLT5wcm9ncmVzcy0+cHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgfQorCisgIC8qIFZlcmlmeSB0aGF0IGF0IGxlYXN0IG9uZSBpTUNVIHJvdyBjYW4gYmUgcmV0dXJuZWQuICovCisgIGxpbmVzX3Blcl9pTUNVX3JvdyA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOworICBpZiAobWF4X2xpbmVzIDwgbGluZXNfcGVyX2lNQ1Vfcm93KQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQlVGRkVSX1NJWkUpOworCisgIC8qIERlY29tcHJlc3MgZGlyZWN0bHkgaW50byB1c2VyJ3MgYnVmZmVyLiAqLworICBpZiAoISAoKmNpbmZvLT5jb2VmLT5kZWNvbXByZXNzX2RhdGEpIChjaW5mbywgZGF0YSkpCisgICAgcmV0dXJuIDA7CQkJLyogc3VzcGVuc2lvbiBmb3JjZWQsIGNhbiBkbyBub3RoaW5nIG1vcmUgKi8KKworICAvKiBPSywgd2UgcHJvY2Vzc2VkIG9uZSBpTUNVIHJvdy4gKi8KKyAgY2luZm8tPm91dHB1dF9zY2FubGluZSArPSBsaW5lc19wZXJfaU1DVV9yb3c7CisgIHJldHVybiBsaW5lc19wZXJfaU1DVV9yb3c7Cit9CisKKworLyogQWRkaXRpb25hbCBlbnRyeSBwb2ludHMgZm9yIGJ1ZmZlcmVkLWltYWdlIG1vZGUuICovCisKKyNpZmRlZiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIGFuIG91dHB1dCBwYXNzIGluIGJ1ZmZlcmVkLWltYWdlIG1vZGUuCisgKi8KKworR0xPQkFMKGJvb2xlYW4pCitqcGVnX3N0YXJ0X291dHB1dCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IHNjYW5fbnVtYmVyKQoreworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfQlVGSU1BR0UgJiYKKyAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX1BSRVNDQU4pCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKyAgLyogTGltaXQgc2NhbiBudW1iZXIgdG8gdmFsaWQgcmFuZ2UgKi8KKyAgaWYgKHNjYW5fbnVtYmVyIDw9IDApCisgICAgc2Nhbl9udW1iZXIgPSAxOworICBpZiAoY2luZm8tPmlucHV0Y3RsLT5lb2lfcmVhY2hlZCAmJgorICAgICAgc2Nhbl9udW1iZXIgPiBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIpCisgICAgc2Nhbl9udW1iZXIgPSBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXI7CisgIGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgPSBzY2FuX251bWJlcjsKKyAgLyogUGVyZm9ybSBhbnkgZHVtbXkgb3V0cHV0IHBhc3NlcywgYW5kIHNldCB1cCBmb3IgdGhlIHJlYWwgcGFzcyAqLworICByZXR1cm4gb3V0cHV0X3Bhc3Nfc2V0dXAoY2luZm8pOworfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYWZ0ZXIgYW4gb3V0cHV0IHBhc3MgaW4gYnVmZmVyZWQtaW1hZ2UgbW9kZS4KKyAqCisgKiBSZXR1cm5zIEZBTFNFIGlmIHN1c3BlbmRlZC4gIFRoZSByZXR1cm4gdmFsdWUgbmVlZCBiZSBpbnNwZWN0ZWQgb25seSBpZgorICogYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlIGlzIHVzZWQuCisgKi8KKworR0xPQkFMKGJvb2xlYW4pCitqcGVnX2ZpbmlzaF9vdXRwdXQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGlmICgoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfU0NBTk5JTkcgfHwKKyAgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9SQVdfT0spICYmIGNpbmZvLT5idWZmZXJlZF9pbWFnZSkgeworICAgIC8qIFRlcm1pbmF0ZSB0aGlzIHBhc3MuICovCisgICAgLyogV2UgZG8gbm90IHJlcXVpcmUgdGhlIHdob2xlIHBhc3MgdG8gaGF2ZSBiZWVuIGNvbXBsZXRlZC4gKi8KKyAgICAoKmNpbmZvLT5tYXN0ZXItPmZpbmlzaF9vdXRwdXRfcGFzcykgKGNpbmZvKTsKKyAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX0JVRlBPU1Q7CisgIH0gZWxzZSBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfQlVGUE9TVCkgeworICAgIC8qIEJVRlBPU1QgPSByZXBlYXQgY2FsbCBhZnRlciBhIHN1c3BlbnNpb24sIGFueXRoaW5nIGVsc2UgaXMgZXJyb3IgKi8KKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICB9CisgIC8qIFJlYWQgbWFya2VycyBsb29raW5nIGZvciBTT1Mgb3IgRU9JICovCisgIHdoaWxlIChjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPD0gY2luZm8tPm91dHB1dF9zY2FuX251bWJlciAmJgorCSAhIGNpbmZvLT5pbnB1dGN0bC0+ZW9pX3JlYWNoZWQpIHsKKyAgICBpZiAoKCpjaW5mby0+aW5wdXRjdGwtPmNvbnN1bWVfaW5wdXQpIChjaW5mbykgPT0gSlBFR19TVVNQRU5ERUQpCisgICAgICByZXR1cm4gRkFMU0U7CQkvKiBTdXNwZW5kLCBjb21lIGJhY2sgbGF0ZXIgKi8KKyAgfQorICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX0JVRklNQUdFOworICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkY29lZmN0LmMgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRjb2VmY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTM4ZDIwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkY29lZmN0LmMKQEAgLTAsMCArMSw3MzYgQEAKKy8qCisgKiBqZGNvZWZjdC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sbGVyIGZvciBkZWNvbXByZXNzaW9uLgorICogVGhpcyBjb250cm9sbGVyIGlzIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIEpQRUcgZGVjb21wcmVzc29yIHByb3Blci4KKyAqIFRoZSBjb2VmZmljaWVudCBidWZmZXIgbGllcyBiZXR3ZWVuIGVudHJvcHkgZGVjb2RpbmcgYW5kIGludmVyc2UtRENUIHN0ZXBzLgorICoKKyAqIEluIGJ1ZmZlcmVkLWltYWdlIG1vZGUsIHRoaXMgY29udHJvbGxlciBpcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4KKyAqIGlucHV0LW9yaWVudGVkIHByb2Nlc3NpbmcgYW5kIG91dHB1dC1vcmllbnRlZCBwcm9jZXNzaW5nLgorICogQWxzbywgdGhlIGlucHV0IHNpZGUgKG9ubHkpIGlzIHVzZWQgd2hlbiByZWFkaW5nIGEgZmlsZSBmb3IgdHJhbnNjb2RpbmcuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisvKiBCbG9jayBzbW9vdGhpbmcgaXMgb25seSBhcHBsaWNhYmxlIGZvciBwcm9ncmVzc2l2ZSBKUEVHLCBzbzogKi8KKyNpZm5kZWYgRF9QUk9HUkVTU0lWRV9TVVBQT1JURUQKKyN1bmRlZiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVECisjZW5kaWYKKworLyogUHJpdmF0ZSBidWZmZXIgY29udHJvbGxlciBvYmplY3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19kX2NvZWZfY29udHJvbGxlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBUaGVzZSB2YXJpYWJsZXMga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiBvZiB0aGUgaW5wdXQgc2lkZS4gKi8KKyAgLyogY2luZm8tPmlucHV0X2lNQ1Vfcm93IGlzIGFsc28gdXNlZCBmb3IgdGhpcy4gKi8KKyAgSkRJTUVOU0lPTiBNQ1VfY3RyOwkJLyogY291bnRzIE1DVXMgcHJvY2Vzc2VkIGluIGN1cnJlbnQgcm93ICovCisgIGludCBNQ1VfdmVydF9vZmZzZXQ7CQkvKiBjb3VudHMgTUNVIHJvd3Mgd2l0aGluIGlNQ1Ugcm93ICovCisgIGludCBNQ1Vfcm93c19wZXJfaU1DVV9yb3c7CS8qIG51bWJlciBvZiBzdWNoIHJvd3MgbmVlZGVkICovCisKKyAgLyogVGhlIG91dHB1dCBzaWRlJ3MgbG9jYXRpb24gaXMgcmVwcmVzZW50ZWQgYnkgY2luZm8tPm91dHB1dF9pTUNVX3Jvdy4gKi8KKworICAvKiBJbiBzaW5nbGUtcGFzcyBtb2RlcywgaXQncyBzdWZmaWNpZW50IHRvIGJ1ZmZlciBqdXN0IG9uZSBNQ1UuCisgICAqIFdlIGFsbG9jYXRlIGEgd29ya3NwYWNlIG9mIERfTUFYX0JMT0NLU19JTl9NQ1UgY29lZmZpY2llbnQgYmxvY2tzLAorICAgKiBhbmQgbGV0IHRoZSBlbnRyb3B5IGRlY29kZXIgd3JpdGUgaW50byB0aGF0IHdvcmtzcGFjZSBlYWNoIHRpbWUuCisgICAqIChPbiA4MHg4NiwgdGhlIHdvcmtzcGFjZSBpcyBGQVIgZXZlbiB0aG91Z2ggaXQncyBub3QgcmVhbGx5IHZlcnkgYmlnOworICAgKiB0aGlzIGlzIHRvIGtlZXAgdGhlIG1vZHVsZSBpbnRlcmZhY2VzIHVuY2hhbmdlZCB3aGVuIGEgbGFyZ2UgY29lZmZpY2llbnQKKyAgICogYnVmZmVyIGlzIG5lY2Vzc2FyeS4pCisgICAqIEluIG11bHRpLXBhc3MgbW9kZXMsIHRoaXMgYXJyYXkgcG9pbnRzIHRvIHRoZSBjdXJyZW50IE1DVSdzIGJsb2NrcworICAgKiB3aXRoaW4gdGhlIHZpcnR1YWwgYXJyYXlzOyBpdCBpcyB1c2VkIG9ubHkgYnkgdGhlIGlucHV0IHNpZGUuCisgICAqLworICBKQkxPQ0tST1cgTUNVX2J1ZmZlcltEX01BWF9CTE9DS1NfSU5fTUNVXTsKKworI2lmZGVmIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorICAvKiBJbiBtdWx0aS1wYXNzIG1vZGVzLCB3ZSBuZWVkIGEgdmlydHVhbCBibG9jayBhcnJheSBmb3IgZWFjaCBjb21wb25lbnQuICovCisgIGp2aXJ0X2JhcnJheV9wdHIgd2hvbGVfaW1hZ2VbTUFYX0NPTVBPTkVOVFNdOworI2VuZGlmCisKKyNpZmRlZiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVECisgIC8qIFdoZW4gZG9pbmcgYmxvY2sgc21vb3RoaW5nLCB3ZSBsYXRjaCBjb2VmZmljaWVudCBBbCB2YWx1ZXMgaGVyZSAqLworICBpbnQgKiBjb2VmX2JpdHNfbGF0Y2g7CisjZGVmaW5lIFNBVkVEX0NPRUZTICA2CQkvKiB3ZSBzYXZlIGNvZWZfYml0c1swLi41XSAqLworI2VuZGlmCit9IG15X2NvZWZfY29udHJvbGxlcjsKKwordHlwZWRlZiBteV9jb2VmX2NvbnRyb2xsZXIgKiBteV9jb2VmX3B0cjsKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK01FVEhPRERFRihpbnQpIGRlY29tcHJlc3Nfb25lcGFzcworCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBvdXRwdXRfYnVmKSk7CisjaWZkZWYgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECitNRVRIT0RERUYoaW50KSBkZWNvbXByZXNzX2RhdGEKKwlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZikpOworI2VuZGlmCisjaWZkZWYgQkxPQ0tfU01PT1RISU5HX1NVUFBPUlRFRAorTE9DQUwoYm9vbGVhbikgc21vb3RoaW5nX29rIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworTUVUSE9EREVGKGludCkgZGVjb21wcmVzc19zbW9vdGhfZGF0YQorCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBvdXRwdXRfYnVmKSk7CisjZW5kaWYKKworCitMT0NBTCh2b2lkKQorc3RhcnRfaU1DVV9yb3cgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBSZXNldCB3aXRoaW4taU1DVS1yb3cgY291bnRlcnMgZm9yIGEgbmV3IHJvdyAoaW5wdXQgc2lkZSkgKi8KK3sKKyAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7CisKKyAgLyogSW4gYW4gaW50ZXJsZWF2ZWQgc2NhbiwgYW4gTUNVIHJvdyBpcyB0aGUgc2FtZSBhcyBhbiBpTUNVIHJvdy4KKyAgICogSW4gYSBub25pbnRlcmxlYXZlZCBzY2FuLCBhbiBpTUNVIHJvdyBoYXMgdl9zYW1wX2ZhY3RvciBNQ1Ugcm93cy4KKyAgICogQnV0IGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLCBwcm9jZXNzIG9ubHkgd2hhdCdzIGxlZnQuCisgICAqLworICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gPiAxKSB7CisgICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gMTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoY2luZm8tPmlucHV0X2lNQ1Vfcm93IDwgKGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MtMSkpCisgICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+dl9zYW1wX2ZhY3RvcjsKKyAgICBlbHNlCisgICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+bGFzdF9yb3dfaGVpZ2h0OworICB9CisKKyAgY29lZi0+TUNVX2N0ciA9IDA7CisgIGNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IDA7Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIGFuIGlucHV0IHByb2Nlc3NpbmcgcGFzcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X2lucHV0X3Bhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA9IDA7CisgIHN0YXJ0X2lNQ1Vfcm93KGNpbmZvKTsKK30KKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYW4gb3V0cHV0IHByb2Nlc3NpbmcgcGFzcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X291dHB1dF9wYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworI2lmZGVmIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQKKyAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7CisKKyAgLyogSWYgbXVsdGlwYXNzLCBjaGVjayB0byBzZWUgd2hldGhlciB0byB1c2UgYmxvY2sgc21vb3RoaW5nIG9uIHRoaXMgcGFzcyAqLworICBpZiAoY29lZi0+cHViLmNvZWZfYXJyYXlzICE9IE5VTEwpIHsKKyAgICBpZiAoY2luZm8tPmRvX2Jsb2NrX3Ntb290aGluZyAmJiBzbW9vdGhpbmdfb2soY2luZm8pKQorICAgICAgY29lZi0+cHViLmRlY29tcHJlc3NfZGF0YSA9IGRlY29tcHJlc3Nfc21vb3RoX2RhdGE7CisgICAgZWxzZQorICAgICAgY29lZi0+cHViLmRlY29tcHJlc3NfZGF0YSA9IGRlY29tcHJlc3NfZGF0YTsKKyAgfQorI2VuZGlmCisgIGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cgPSAwOworfQorCisKKy8qCisgKiBEZWNvbXByZXNzIGFuZCByZXR1cm4gc29tZSBkYXRhIGluIHRoZSBzaW5nbGUtcGFzcyBjYXNlLgorICogQWx3YXlzIGF0dGVtcHRzIHRvIGVtaXQgb25lIGZ1bGx5IGludGVybGVhdmVkIE1DVSByb3cgKCJpTUNVIiByb3cpLgorICogSW5wdXQgYW5kIG91dHB1dCBtdXN0IHJ1biBpbiBsb2Nrc3RlcCBzaW5jZSB3ZSBoYXZlIG9ubHkgYSBvbmUtTUNVIGJ1ZmZlci4KKyAqIFJldHVybiB2YWx1ZSBpcyBKUEVHX1JPV19DT01QTEVURUQsIEpQRUdfU0NBTl9DT01QTEVURUQsIG9yIEpQRUdfU1VTUEVOREVELgorICoKKyAqIE5COiBvdXRwdXRfYnVmIGNvbnRhaW5zIGEgcGxhbmUgZm9yIGVhY2ggY29tcG9uZW50IGluIGltYWdlLAorICogd2hpY2ggd2UgaW5kZXggYWNjb3JkaW5nIHRvIHRoZSBjb21wb25lbnQncyBTT0YgcG9zaXRpb24uCisgKi8KKworTUVUSE9EREVGKGludCkKK2RlY29tcHJlc3Nfb25lcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBvdXRwdXRfYnVmKQoreworICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKKyAgSkRJTUVOU0lPTiBNQ1VfY29sX251bTsJLyogaW5kZXggb2YgY3VycmVudCBNQ1Ugd2l0aGluIHJvdyAqLworICBKRElNRU5TSU9OIGxhc3RfTUNVX2NvbCA9IGNpbmZvLT5NQ1VzX3Blcl9yb3cgLSAxOworICBKRElNRU5TSU9OIGxhc3RfaU1DVV9yb3cgPSBjaW5mby0+dG90YWxfaU1DVV9yb3dzIC0gMTsKKyAgaW50IGJsa24sIGNpLCB4aW5kZXgsIHlpbmRleCwgeW9mZnNldCwgdXNlZnVsX3dpZHRoOworICBKU0FNUEFSUkFZIG91dHB1dF9wdHI7CisgIEpESU1FTlNJT04gc3RhcnRfY29sLCBvdXRwdXRfY29sOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICBpbnZlcnNlX0RDVF9tZXRob2RfcHRyIGludmVyc2VfRENUOworCisgIC8qIExvb3AgdG8gcHJvY2VzcyBhcyBtdWNoIGFzIG9uZSB3aG9sZSBpTUNVIHJvdyAqLworICBmb3IgKHlvZmZzZXQgPSBjb2VmLT5NQ1VfdmVydF9vZmZzZXQ7IHlvZmZzZXQgPCBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3c7CisgICAgICAgeW9mZnNldCsrKSB7CisgICAgZm9yIChNQ1VfY29sX251bSA9IGNvZWYtPk1DVV9jdHI7IE1DVV9jb2xfbnVtIDw9IGxhc3RfTUNVX2NvbDsKKwkgTUNVX2NvbF9udW0rKykgeworICAgICAgLyogVHJ5IHRvIGZldGNoIGFuIE1DVS4gIEVudHJvcHkgZGVjb2RlciBleHBlY3RzIGJ1ZmZlciB0byBiZSB6ZXJvZWQuICovCisgICAgICBqemVyb19mYXIoKHZvaWQgRkFSICopIGNvZWYtPk1DVV9idWZmZXJbMF0sCisJCShzaXplX3QpIChjaW5mby0+YmxvY2tzX2luX01DVSAqIFNJWkVPRihKQkxPQ0spKSk7CisgICAgICBpZiAoISAoKmNpbmZvLT5lbnRyb3B5LT5kZWNvZGVfbWN1KSAoY2luZm8sIGNvZWYtPk1DVV9idWZmZXIpKSB7CisJLyogU3VzcGVuc2lvbiBmb3JjZWQ7IHVwZGF0ZSBzdGF0ZSBjb3VudGVycyBhbmQgZXhpdCAqLworCWNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IHlvZmZzZXQ7CisJY29lZi0+TUNVX2N0ciA9IE1DVV9jb2xfbnVtOworCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIH0KKyAgICAgIC8qIERldGVybWluZSB3aGVyZSBkYXRhIHNob3VsZCBnbyBpbiBvdXRwdXRfYnVmIGFuZCBkbyB0aGUgSURDVCB0aGluZy4KKyAgICAgICAqIFdlIHNraXAgZHVtbXkgYmxvY2tzIGF0IHRoZSByaWdodCBhbmQgYm90dG9tIGVkZ2VzIChidXQgYmxrbiBnZXRzCisgICAgICAgKiBpbmNyZW1lbnRlZCBwYXN0IHRoZW0hKS4gIE5vdGUgdGhlIGlubmVyIGxvb3AgcmVsaWVzIG9uIGhhdmluZworICAgICAgICogYWxsb2NhdGVkIHRoZSBNQ1VfYnVmZmVyW10gYmxvY2tzIHNlcXVlbnRpYWxseS4KKyAgICAgICAqLworICAgICAgYmxrbiA9IDA7CQkJLyogaW5kZXggb2YgY3VycmVudCBEQ1QgYmxvY2sgd2l0aGluIE1DVSAqLworICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKwljb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworCS8qIERvbid0IGJvdGhlciB0byBJRENUIGFuIHVuaW50ZXJlc3RpbmcgY29tcG9uZW50LiAqLworCWlmICghIGNvbXBwdHItPmNvbXBvbmVudF9uZWVkZWQpIHsKKwkgIGJsa24gKz0gY29tcHB0ci0+TUNVX2Jsb2NrczsKKwkgIGNvbnRpbnVlOworCX0KKwlpbnZlcnNlX0RDVCA9IGNpbmZvLT5pZGN0LT5pbnZlcnNlX0RDVFtjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdOworCXVzZWZ1bF93aWR0aCA9IChNQ1VfY29sX251bSA8IGxhc3RfTUNVX2NvbCkgPyBjb21wcHRyLT5NQ1Vfd2lkdGgKKwkJCQkJCSAgICA6IGNvbXBwdHItPmxhc3RfY29sX3dpZHRoOworCW91dHB1dF9wdHIgPSBvdXRwdXRfYnVmW2NvbXBwdHItPmNvbXBvbmVudF9pbmRleF0gKworCSAgeW9mZnNldCAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKKwlzdGFydF9jb2wgPSBNQ1VfY29sX251bSAqIGNvbXBwdHItPk1DVV9zYW1wbGVfd2lkdGg7CisJZm9yICh5aW5kZXggPSAwOyB5aW5kZXggPCBjb21wcHRyLT5NQ1VfaGVpZ2h0OyB5aW5kZXgrKykgeworCSAgaWYgKGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA8IGxhc3RfaU1DVV9yb3cgfHwKKwkgICAgICB5b2Zmc2V0K3lpbmRleCA8IGNvbXBwdHItPmxhc3Rfcm93X2hlaWdodCkgeworCSAgICBvdXRwdXRfY29sID0gc3RhcnRfY29sOworCSAgICBmb3IgKHhpbmRleCA9IDA7IHhpbmRleCA8IHVzZWZ1bF93aWR0aDsgeGluZGV4KyspIHsKKwkgICAgICAoKmludmVyc2VfRENUKSAoY2luZm8sIGNvbXBwdHIsCisJCQkgICAgICAoSkNPRUZQVFIpIGNvZWYtPk1DVV9idWZmZXJbYmxrbit4aW5kZXhdLAorCQkJICAgICAgb3V0cHV0X3B0ciwgb3V0cHV0X2NvbCk7CisJICAgICAgb3V0cHV0X2NvbCArPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7CisJICAgIH0KKwkgIH0KKwkgIGJsa24gKz0gY29tcHB0ci0+TUNVX3dpZHRoOworCSAgb3V0cHV0X3B0ciArPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7CisJfQorICAgICAgfQorICAgIH0KKyAgICAvKiBDb21wbGV0ZWQgYW4gTUNVIHJvdywgYnV0IHBlcmhhcHMgbm90IGFuIGlNQ1Ugcm93ICovCisgICAgY29lZi0+TUNVX2N0ciA9IDA7CisgIH0KKyAgLyogQ29tcGxldGVkIHRoZSBpTUNVIHJvdywgYWR2YW5jZSBjb3VudGVycyBmb3IgbmV4dCBvbmUgKi8KKyAgY2luZm8tPm91dHB1dF9pTUNVX3JvdysrOworICBpZiAoKysoY2luZm8tPmlucHV0X2lNQ1Vfcm93KSA8IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MpIHsKKyAgICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7CisgICAgcmV0dXJuIEpQRUdfUk9XX0NPTVBMRVRFRDsKKyAgfQorICAvKiBDb21wbGV0ZWQgdGhlIHNjYW4gKi8KKyAgKCpjaW5mby0+aW5wdXRjdGwtPmZpbmlzaF9pbnB1dF9wYXNzKSAoY2luZm8pOworICByZXR1cm4gSlBFR19TQ0FOX0NPTVBMRVRFRDsKK30KKworCisvKgorICogRHVtbXkgY29uc3VtZS1pbnB1dCByb3V0aW5lIGZvciBzaW5nbGUtcGFzcyBvcGVyYXRpb24uCisgKi8KKworTUVUSE9EREVGKGludCkKK2R1bW15X2NvbnN1bWVfZGF0YSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOwkvKiBBbHdheXMgaW5kaWNhdGUgbm90aGluZyB3YXMgZG9uZSAqLworfQorCisKKyNpZmRlZiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKKworLyoKKyAqIENvbnN1bWUgaW5wdXQgZGF0YSBhbmQgc3RvcmUgaXQgaW4gdGhlIGZ1bGwtaW1hZ2UgY29lZmZpY2llbnQgYnVmZmVyLgorICogV2UgcmVhZCBhcyBtdWNoIGFzIG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93ICgiaU1DVSIgcm93KSBwZXIgY2FsbCwKKyAqIGllLCB2X3NhbXBfZmFjdG9yIGJsb2NrIHJvd3MgZm9yIGVhY2ggY29tcG9uZW50IGluIHRoZSBzY2FuLgorICogUmV0dXJuIHZhbHVlIGlzIEpQRUdfUk9XX0NPTVBMRVRFRCwgSlBFR19TQ0FOX0NPTVBMRVRFRCwgb3IgSlBFR19TVVNQRU5ERUQuCisgKi8KKworTUVUSE9EREVGKGludCkKK2NvbnN1bWVfZGF0YSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7CisgIEpESU1FTlNJT04gTUNVX2NvbF9udW07CS8qIGluZGV4IG9mIGN1cnJlbnQgTUNVIHdpdGhpbiByb3cgKi8KKyAgaW50IGJsa24sIGNpLCB4aW5kZXgsIHlpbmRleCwgeW9mZnNldDsKKyAgSkRJTUVOU0lPTiBzdGFydF9jb2w7CisgIEpCTE9DS0FSUkFZIGJ1ZmZlcltNQVhfQ09NUFNfSU5fU0NBTl07CisgIEpCTE9DS1JPVyBidWZmZXJfcHRyOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworCisgIC8qIEFsaWduIHRoZSB2aXJ0dWFsIGJ1ZmZlcnMgZm9yIHRoZSBjb21wb25lbnRzIHVzZWQgaW4gdGhpcyBzY2FuLiAqLworICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgeworICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgYnVmZmVyW2NpXSA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBjb2VmLT53aG9sZV9pbWFnZVtjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdLAorICAgICAgIGNpbmZvLT5pbnB1dF9pTUNVX3JvdyAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCisgICAgICAgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIFRSVUUpOworICAgIC8qIE5vdGU6IGVudHJvcHkgZGVjb2RlciBleHBlY3RzIGJ1ZmZlciB0byBiZSB6ZXJvZWQsCisgICAgICogYnV0IHRoaXMgaXMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBtZW1vcnkgbWFuYWdlcgorICAgICAqIGJlY2F1c2Ugd2UgcmVxdWVzdGVkIGEgcHJlLXplcm9lZCBhcnJheS4KKyAgICAgKi8KKyAgfQorCisgIC8qIExvb3AgdG8gcHJvY2VzcyBvbmUgd2hvbGUgaU1DVSByb3cgKi8KKyAgZm9yICh5b2Zmc2V0ID0gY29lZi0+TUNVX3ZlcnRfb2Zmc2V0OyB5b2Zmc2V0IDwgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OworICAgICAgIHlvZmZzZXQrKykgeworICAgIGZvciAoTUNVX2NvbF9udW0gPSBjb2VmLT5NQ1VfY3RyOyBNQ1VfY29sX251bSA8IGNpbmZvLT5NQ1VzX3Blcl9yb3c7CisJIE1DVV9jb2xfbnVtKyspIHsKKyAgICAgIC8qIENvbnN0cnVjdCBsaXN0IG9mIHBvaW50ZXJzIHRvIERDVCBibG9ja3MgYmVsb25naW5nIHRvIHRoaXMgTUNVICovCisgICAgICBibGtuID0gMDsJCQkvKiBpbmRleCBvZiBjdXJyZW50IERDVCBibG9jayB3aXRoaW4gTUNVICovCisgICAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgeworCWNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisJc3RhcnRfY29sID0gTUNVX2NvbF9udW0gKiBjb21wcHRyLT5NQ1Vfd2lkdGg7CisJZm9yICh5aW5kZXggPSAwOyB5aW5kZXggPCBjb21wcHRyLT5NQ1VfaGVpZ2h0OyB5aW5kZXgrKykgeworCSAgYnVmZmVyX3B0ciA9IGJ1ZmZlcltjaV1beWluZGV4K3lvZmZzZXRdICsgc3RhcnRfY29sOworCSAgZm9yICh4aW5kZXggPSAwOyB4aW5kZXggPCBjb21wcHRyLT5NQ1Vfd2lkdGg7IHhpbmRleCsrKSB7CisJICAgIGNvZWYtPk1DVV9idWZmZXJbYmxrbisrXSA9IGJ1ZmZlcl9wdHIrKzsKKwkgIH0KKwl9CisgICAgICB9CisgICAgICAvKiBUcnkgdG8gZmV0Y2ggdGhlIE1DVS4gKi8KKyAgICAgIGlmICghICgqY2luZm8tPmVudHJvcHktPmRlY29kZV9tY3UpIChjaW5mbywgY29lZi0+TUNVX2J1ZmZlcikpIHsKKwkvKiBTdXNwZW5zaW9uIGZvcmNlZDsgdXBkYXRlIHN0YXRlIGNvdW50ZXJzIGFuZCBleGl0ICovCisJY29lZi0+TUNVX3ZlcnRfb2Zmc2V0ID0geW9mZnNldDsKKwljb2VmLT5NQ1VfY3RyID0gTUNVX2NvbF9udW07CisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgfQorICAgIH0KKyAgICAvKiBDb21wbGV0ZWQgYW4gTUNVIHJvdywgYnV0IHBlcmhhcHMgbm90IGFuIGlNQ1Ugcm93ICovCisgICAgY29lZi0+TUNVX2N0ciA9IDA7CisgIH0KKyAgLyogQ29tcGxldGVkIHRoZSBpTUNVIHJvdywgYWR2YW5jZSBjb3VudGVycyBmb3IgbmV4dCBvbmUgKi8KKyAgaWYgKCsrKGNpbmZvLT5pbnB1dF9pTUNVX3JvdykgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzKSB7CisgICAgc3RhcnRfaU1DVV9yb3coY2luZm8pOworICAgIHJldHVybiBKUEVHX1JPV19DT01QTEVURUQ7CisgIH0KKyAgLyogQ29tcGxldGVkIHRoZSBzY2FuICovCisgICgqY2luZm8tPmlucHV0Y3RsLT5maW5pc2hfaW5wdXRfcGFzcykgKGNpbmZvKTsKKyAgcmV0dXJuIEpQRUdfU0NBTl9DT01QTEVURUQ7Cit9CisKKworLyoKKyAqIERlY29tcHJlc3MgYW5kIHJldHVybiBzb21lIGRhdGEgaW4gdGhlIG11bHRpLXBhc3MgY2FzZS4KKyAqIEFsd2F5cyBhdHRlbXB0cyB0byBlbWl0IG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93ICgiaU1DVSIgcm93KS4KKyAqIFJldHVybiB2YWx1ZSBpcyBKUEVHX1JPV19DT01QTEVURUQsIEpQRUdfU0NBTl9DT01QTEVURUQsIG9yIEpQRUdfU1VTUEVOREVELgorICoKKyAqIE5COiBvdXRwdXRfYnVmIGNvbnRhaW5zIGEgcGxhbmUgZm9yIGVhY2ggY29tcG9uZW50IGluIGltYWdlLgorICovCisKK01FVEhPRERFRihpbnQpCitkZWNvbXByZXNzX2RhdGEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZikKK3sKKyAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7CisgIEpESU1FTlNJT04gbGFzdF9pTUNVX3JvdyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgLSAxOworICBKRElNRU5TSU9OIGJsb2NrX251bTsKKyAgaW50IGNpLCBibG9ja19yb3csIGJsb2NrX3Jvd3M7CisgIEpCTE9DS0FSUkFZIGJ1ZmZlcjsKKyAgSkJMT0NLUk9XIGJ1ZmZlcl9wdHI7CisgIEpTQU1QQVJSQVkgb3V0cHV0X3B0cjsKKyAgSkRJTUVOU0lPTiBvdXRwdXRfY29sOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICBpbnZlcnNlX0RDVF9tZXRob2RfcHRyIGludmVyc2VfRENUOworCisgIC8qIEZvcmNlIHNvbWUgaW5wdXQgdG8gYmUgZG9uZSBpZiB3ZSBhcmUgZ2V0dGluZyBhaGVhZCBvZiB0aGUgaW5wdXQuICovCisgIHdoaWxlIChjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPCBjaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyIHx8CisJIChjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPT0gY2luZm8tPm91dHB1dF9zY2FuX251bWJlciAmJgorCSAgY2luZm8tPmlucHV0X2lNQ1Vfcm93IDw9IGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cpKSB7CisgICAgaWYgKCgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KShjaW5mbykgPT0gSlBFR19TVVNQRU5ERUQpCisgICAgICByZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgIH0KKworICAvKiBPSywgb3V0cHV0IGZyb20gdGhlIHZpcnR1YWwgYXJyYXlzLiAqLworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIC8qIERvbid0IGJvdGhlciB0byBJRENUIGFuIHVuaW50ZXJlc3RpbmcgY29tcG9uZW50LiAqLworICAgIGlmICghIGNvbXBwdHItPmNvbXBvbmVudF9uZWVkZWQpCisgICAgICBjb250aW51ZTsKKyAgICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXIgZm9yIHRoaXMgY29tcG9uZW50LiAqLworICAgIGJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBjb2VmLT53aG9sZV9pbWFnZVtjaV0sCisgICAgICAgY2luZm8tPm91dHB1dF9pTUNVX3JvdyAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCisgICAgICAgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIEZBTFNFKTsKKyAgICAvKiBDb3VudCBub24tZHVtbXkgRENUIGJsb2NrIHJvd3MgaW4gdGhpcyBpTUNVIHJvdy4gKi8KKyAgICBpZiAoY2luZm8tPm91dHB1dF9pTUNVX3JvdyA8IGxhc3RfaU1DVV9yb3cpCisgICAgICBibG9ja19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICBlbHNlIHsKKyAgICAgIC8qIE5COiBjYW4ndCB1c2UgbGFzdF9yb3dfaGVpZ2h0IGhlcmU7IGl0IGlzIGlucHV0LXNpZGUtZGVwZW5kZW50ISAqLworICAgICAgYmxvY2tfcm93cyA9IChpbnQpIChjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzICUgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7CisgICAgICBpZiAoYmxvY2tfcm93cyA9PSAwKSBibG9ja19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICB9CisgICAgaW52ZXJzZV9EQ1QgPSBjaW5mby0+aWRjdC0+aW52ZXJzZV9EQ1RbY2ldOworICAgIG91dHB1dF9wdHIgPSBvdXRwdXRfYnVmW2NpXTsKKyAgICAvKiBMb29wIG92ZXIgYWxsIERDVCBibG9ja3MgdG8gYmUgcHJvY2Vzc2VkLiAqLworICAgIGZvciAoYmxvY2tfcm93ID0gMDsgYmxvY2tfcm93IDwgYmxvY2tfcm93czsgYmxvY2tfcm93KyspIHsKKyAgICAgIGJ1ZmZlcl9wdHIgPSBidWZmZXJbYmxvY2tfcm93XTsKKyAgICAgIG91dHB1dF9jb2wgPSAwOworICAgICAgZm9yIChibG9ja19udW0gPSAwOyBibG9ja19udW0gPCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7IGJsb2NrX251bSsrKSB7CisJKCppbnZlcnNlX0RDVCkgKGNpbmZvLCBjb21wcHRyLCAoSkNPRUZQVFIpIGJ1ZmZlcl9wdHIsCisJCQlvdXRwdXRfcHRyLCBvdXRwdXRfY29sKTsKKwlidWZmZXJfcHRyKys7CisJb3V0cHV0X2NvbCArPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7CisgICAgICB9CisgICAgICBvdXRwdXRfcHRyICs9IGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKKyAgICB9CisgIH0KKworICBpZiAoKysoY2luZm8tPm91dHB1dF9pTUNVX3JvdykgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzKQorICAgIHJldHVybiBKUEVHX1JPV19DT01QTEVURUQ7CisgIHJldHVybiBKUEVHX1NDQU5fQ09NUExFVEVEOworfQorCisjZW5kaWYgLyogRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCisKKworI2lmZGVmIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQKKworLyoKKyAqIFRoaXMgY29kZSBhcHBsaWVzIGludGVyYmxvY2sgc21vb3RoaW5nIGFzIGRlc2NyaWJlZCBieSBzZWN0aW9uIEsuOAorICogb2YgdGhlIEpQRUcgc3RhbmRhcmQ6IHRoZSBmaXJzdCA1IEFDIGNvZWZmaWNpZW50cyBhcmUgZXN0aW1hdGVkIGZyb20KKyAqIHRoZSBEQyB2YWx1ZXMgb2YgYSBEQ1QgYmxvY2sgYW5kIGl0cyA4IG5laWdoYm9yaW5nIGJsb2Nrcy4KKyAqIFdlIGFwcGx5IHNtb290aGluZyBvbmx5IGZvciBwcm9ncmVzc2l2ZSBKUEVHIGRlY29kaW5nLCBhbmQgb25seSBpZgorICogdGhlIGNvZWZmaWNpZW50cyBpdCBjYW4gZXN0aW1hdGUgYXJlIG5vdCB5ZXQga25vd24gdG8gZnVsbCBwcmVjaXNpb24uCisgKi8KKworLyogTmF0dXJhbC1vcmRlciBhcnJheSBwb3NpdGlvbnMgb2YgdGhlIGZpcnN0IDUgemlnemFnLW9yZGVyIGNvZWZmaWNpZW50cyAqLworI2RlZmluZSBRMDFfUE9TICAxCisjZGVmaW5lIFExMF9QT1MgIDgKKyNkZWZpbmUgUTIwX1BPUyAgMTYKKyNkZWZpbmUgUTExX1BPUyAgOQorI2RlZmluZSBRMDJfUE9TICAyCisKKy8qCisgKiBEZXRlcm1pbmUgd2hldGhlciBibG9jayBzbW9vdGhpbmcgaXMgYXBwbGljYWJsZSBhbmQgc2FmZS4KKyAqIFdlIGFsc28gbGF0Y2ggdGhlIGN1cnJlbnQgc3RhdGVzIG9mIHRoZSBjb2VmX2JpdHNbXSBlbnRyaWVzIGZvciB0aGUKKyAqIEFDIGNvZWZmaWNpZW50czsgb3RoZXJ3aXNlLCBpZiB0aGUgaW5wdXQgc2lkZSBvZiB0aGUgZGVjb21wcmVzc29yCisgKiBhZHZhbmNlcyBpbnRvIGEgbmV3IHNjYW4sIHdlIG1pZ2h0IHRoaW5rIHRoZSBjb2VmZmljaWVudHMgYXJlIGtub3duCisgKiBtb3JlIGFjY3VyYXRlbHkgdGhhbiB0aGV5IHJlYWxseSBhcmUuCisgKi8KKworTE9DQUwoYm9vbGVhbikKK3Ntb290aGluZ19vayAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7CisgIGJvb2xlYW4gc21vb3RoaW5nX3VzZWZ1bCA9IEZBTFNFOworICBpbnQgY2ksIGNvZWZpOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICBKUVVBTlRfVEJMICogcXRhYmxlOworICBpbnQgKiBjb2VmX2JpdHM7CisgIGludCAqIGNvZWZfYml0c19sYXRjaDsKKworICBpZiAoISBjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSB8fCBjaW5mby0+Y29lZl9iaXRzID09IE5VTEwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIEFsbG9jYXRlIGxhdGNoIGFyZWEgaWYgbm90IGFscmVhZHkgZG9uZSAqLworICBpZiAoY29lZi0+Y29lZl9iaXRzX2xhdGNoID09IE5VTEwpCisgICAgY29lZi0+Y29lZl9iaXRzX2xhdGNoID0gKGludCAqKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIGNpbmZvLT5udW1fY29tcG9uZW50cyAqCisJCQkJICAoU0FWRURfQ09FRlMgKiBTSVpFT0YoaW50KSkpOworICBjb2VmX2JpdHNfbGF0Y2ggPSBjb2VmLT5jb2VmX2JpdHNfbGF0Y2g7CisKKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAvKiBBbGwgY29tcG9uZW50cycgcXVhbnRpemF0aW9uIHZhbHVlcyBtdXN0IGFscmVhZHkgYmUgbGF0Y2hlZC4gKi8KKyAgICBpZiAoKHF0YWJsZSA9IGNvbXBwdHItPnF1YW50X3RhYmxlKSA9PSBOVUxMKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIC8qIFZlcmlmeSBEQyAmIGZpcnN0IDUgQUMgcXVhbnRpemVycyBhcmUgbm9uemVybyB0byBhdm9pZCB6ZXJvLWRpdmlkZS4gKi8KKyAgICBpZiAocXRhYmxlLT5xdWFudHZhbFswXSA9PSAwIHx8CisJcXRhYmxlLT5xdWFudHZhbFtRMDFfUE9TXSA9PSAwIHx8CisJcXRhYmxlLT5xdWFudHZhbFtRMTBfUE9TXSA9PSAwIHx8CisJcXRhYmxlLT5xdWFudHZhbFtRMjBfUE9TXSA9PSAwIHx8CisJcXRhYmxlLT5xdWFudHZhbFtRMTFfUE9TXSA9PSAwIHx8CisJcXRhYmxlLT5xdWFudHZhbFtRMDJfUE9TXSA9PSAwKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIC8qIERDIHZhbHVlcyBtdXN0IGJlIGF0IGxlYXN0IHBhcnRseSBrbm93biBmb3IgYWxsIGNvbXBvbmVudHMuICovCisgICAgY29lZl9iaXRzID0gY2luZm8tPmNvZWZfYml0c1tjaV07CisgICAgaWYgKGNvZWZfYml0c1swXSA8IDApCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgLyogQmxvY2sgc21vb3RoaW5nIGlzIGhlbHBmdWwgaWYgc29tZSBBQyBjb2VmZmljaWVudHMgcmVtYWluIGluYWNjdXJhdGUuICovCisgICAgZm9yIChjb2VmaSA9IDE7IGNvZWZpIDw9IDU7IGNvZWZpKyspIHsKKyAgICAgIGNvZWZfYml0c19sYXRjaFtjb2VmaV0gPSBjb2VmX2JpdHNbY29lZmldOworICAgICAgaWYgKGNvZWZfYml0c1tjb2VmaV0gIT0gMCkKKwlzbW9vdGhpbmdfdXNlZnVsID0gVFJVRTsKKyAgICB9CisgICAgY29lZl9iaXRzX2xhdGNoICs9IFNBVkVEX0NPRUZTOworICB9CisKKyAgcmV0dXJuIHNtb290aGluZ191c2VmdWw7Cit9CisKKworLyoKKyAqIFZhcmlhbnQgb2YgZGVjb21wcmVzc19kYXRhIGZvciB1c2Ugd2hlbiBkb2luZyBibG9jayBzbW9vdGhpbmcuCisgKi8KKworTUVUSE9EREVGKGludCkKK2RlY29tcHJlc3Nfc21vb3RoX2RhdGEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZikKK3sKKyAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7CisgIEpESU1FTlNJT04gbGFzdF9pTUNVX3JvdyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgLSAxOworICBKRElNRU5TSU9OIGJsb2NrX251bSwgbGFzdF9ibG9ja19jb2x1bW47CisgIGludCBjaSwgYmxvY2tfcm93LCBibG9ja19yb3dzLCBhY2Nlc3Nfcm93czsKKyAgSkJMT0NLQVJSQVkgYnVmZmVyOworICBKQkxPQ0tST1cgYnVmZmVyX3B0ciwgcHJldl9ibG9ja19yb3csIG5leHRfYmxvY2tfcm93OworICBKU0FNUEFSUkFZIG91dHB1dF9wdHI7CisgIEpESU1FTlNJT04gb3V0cHV0X2NvbDsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgaW52ZXJzZV9EQ1RfbWV0aG9kX3B0ciBpbnZlcnNlX0RDVDsKKyAgYm9vbGVhbiBmaXJzdF9yb3csIGxhc3Rfcm93OworICBKQkxPQ0sgd29ya3NwYWNlOworICBpbnQgKmNvZWZfYml0czsKKyAgSlFVQU5UX1RCTCAqcXVhbnR0Ymw7CisgIElOVDMyIFEwMCxRMDEsUTAyLFExMCxRMTEsUTIwLCBudW07CisgIGludCBEQzEsREMyLERDMyxEQzQsREM1LERDNixEQzcsREM4LERDOTsKKyAgaW50IEFsLCBwcmVkOworCisgIC8qIEZvcmNlIHNvbWUgaW5wdXQgdG8gYmUgZG9uZSBpZiB3ZSBhcmUgZ2V0dGluZyBhaGVhZCBvZiB0aGUgaW5wdXQuICovCisgIHdoaWxlIChjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPD0gY2luZm8tPm91dHB1dF9zY2FuX251bWJlciAmJgorCSAhIGNpbmZvLT5pbnB1dGN0bC0+ZW9pX3JlYWNoZWQpIHsKKyAgICBpZiAoY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyID09IGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIpIHsKKyAgICAgIC8qIElmIGlucHV0IGlzIHdvcmtpbmcgb24gY3VycmVudCBzY2FuLCB3ZSBvcmRpbmFyaWx5IHdhbnQgaXQgdG8KKyAgICAgICAqIGhhdmUgY29tcGxldGVkIHRoZSBjdXJyZW50IHJvdy4gIEJ1dCBpZiBpbnB1dCBzY2FuIGlzIERDLAorICAgICAgICogd2Ugd2FudCBpdCB0byBrZWVwIG9uZSByb3cgYWhlYWQgc28gdGhhdCBuZXh0IGJsb2NrIHJvdydzIERDCisgICAgICAgKiB2YWx1ZXMgYXJlIHVwIHRvIGRhdGUuCisgICAgICAgKi8KKyAgICAgIEpESU1FTlNJT04gZGVsdGEgPSAoY2luZm8tPlNzID09IDApID8gMSA6IDA7CisgICAgICBpZiAoY2luZm8tPmlucHV0X2lNQ1Vfcm93ID4gY2luZm8tPm91dHB1dF9pTUNVX3JvdytkZWx0YSkKKwlicmVhazsKKyAgICB9CisgICAgaWYgKCgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KShjaW5mbykgPT0gSlBFR19TVVNQRU5ERUQpCisgICAgICByZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgIH0KKworICAvKiBPSywgb3V0cHV0IGZyb20gdGhlIHZpcnR1YWwgYXJyYXlzLiAqLworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIC8qIERvbid0IGJvdGhlciB0byBJRENUIGFuIHVuaW50ZXJlc3RpbmcgY29tcG9uZW50LiAqLworICAgIGlmICghIGNvbXBwdHItPmNvbXBvbmVudF9uZWVkZWQpCisgICAgICBjb250aW51ZTsKKyAgICAvKiBDb3VudCBub24tZHVtbXkgRENUIGJsb2NrIHJvd3MgaW4gdGhpcyBpTUNVIHJvdy4gKi8KKyAgICBpZiAoY2luZm8tPm91dHB1dF9pTUNVX3JvdyA8IGxhc3RfaU1DVV9yb3cpIHsKKyAgICAgIGJsb2NrX3Jvd3MgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgICAgYWNjZXNzX3Jvd3MgPSBibG9ja19yb3dzICogMjsgLyogdGhpcyBhbmQgbmV4dCBpTUNVIHJvdyAqLworICAgICAgbGFzdF9yb3cgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgLyogTkI6IGNhbid0IHVzZSBsYXN0X3Jvd19oZWlnaHQgaGVyZTsgaXQgaXMgaW5wdXQtc2lkZS1kZXBlbmRlbnQhICovCisgICAgICBibG9ja19yb3dzID0gKGludCkgKGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MgJSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKKyAgICAgIGlmIChibG9ja19yb3dzID09IDApIGJsb2NrX3Jvd3MgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgICAgYWNjZXNzX3Jvd3MgPSBibG9ja19yb3dzOyAvKiB0aGlzIGlNQ1Ugcm93IG9ubHkgKi8KKyAgICAgIGxhc3Rfcm93ID0gVFJVRTsKKyAgICB9CisgICAgLyogQWxpZ24gdGhlIHZpcnR1YWwgYnVmZmVyIGZvciB0aGlzIGNvbXBvbmVudC4gKi8KKyAgICBpZiAoY2luZm8tPm91dHB1dF9pTUNVX3JvdyA+IDApIHsKKyAgICAgIGFjY2Vzc19yb3dzICs9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IC8qIHByaW9yIGlNQ1Ugcm93IHRvbyAqLworICAgICAgYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBjb2VmLT53aG9sZV9pbWFnZVtjaV0sCisJIChjaW5mby0+b3V0cHV0X2lNQ1Vfcm93IC0gMSkgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAorCSAoSkRJTUVOU0lPTikgYWNjZXNzX3Jvd3MsIEZBTFNFKTsKKyAgICAgIGJ1ZmZlciArPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwkvKiBwb2ludCB0byBjdXJyZW50IGlNQ1Ugcm93ICovCisgICAgICBmaXJzdF9yb3cgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBjb2VmLT53aG9sZV9pbWFnZVtjaV0sCisJIChKRElNRU5TSU9OKSAwLCAoSkRJTUVOU0lPTikgYWNjZXNzX3Jvd3MsIEZBTFNFKTsKKyAgICAgIGZpcnN0X3JvdyA9IFRSVUU7CisgICAgfQorICAgIC8qIEZldGNoIGNvbXBvbmVudC1kZXBlbmRlbnQgaW5mbyAqLworICAgIGNvZWZfYml0cyA9IGNvZWYtPmNvZWZfYml0c19sYXRjaCArIChjaSAqIFNBVkVEX0NPRUZTKTsKKyAgICBxdWFudHRibCA9IGNvbXBwdHItPnF1YW50X3RhYmxlOworICAgIFEwMCA9IHF1YW50dGJsLT5xdWFudHZhbFswXTsKKyAgICBRMDEgPSBxdWFudHRibC0+cXVhbnR2YWxbUTAxX1BPU107CisgICAgUTEwID0gcXVhbnR0YmwtPnF1YW50dmFsW1ExMF9QT1NdOworICAgIFEyMCA9IHF1YW50dGJsLT5xdWFudHZhbFtRMjBfUE9TXTsKKyAgICBRMTEgPSBxdWFudHRibC0+cXVhbnR2YWxbUTExX1BPU107CisgICAgUTAyID0gcXVhbnR0YmwtPnF1YW50dmFsW1EwMl9QT1NdOworICAgIGludmVyc2VfRENUID0gY2luZm8tPmlkY3QtPmludmVyc2VfRENUW2NpXTsKKyAgICBvdXRwdXRfcHRyID0gb3V0cHV0X2J1ZltjaV07CisgICAgLyogTG9vcCBvdmVyIGFsbCBEQ1QgYmxvY2tzIHRvIGJlIHByb2Nlc3NlZC4gKi8KKyAgICBmb3IgKGJsb2NrX3JvdyA9IDA7IGJsb2NrX3JvdyA8IGJsb2NrX3Jvd3M7IGJsb2NrX3JvdysrKSB7CisgICAgICBidWZmZXJfcHRyID0gYnVmZmVyW2Jsb2NrX3Jvd107CisgICAgICBpZiAoZmlyc3Rfcm93ICYmIGJsb2NrX3JvdyA9PSAwKQorCXByZXZfYmxvY2tfcm93ID0gYnVmZmVyX3B0cjsKKyAgICAgIGVsc2UKKwlwcmV2X2Jsb2NrX3JvdyA9IGJ1ZmZlcltibG9ja19yb3ctMV07CisgICAgICBpZiAobGFzdF9yb3cgJiYgYmxvY2tfcm93ID09IGJsb2NrX3Jvd3MtMSkKKwluZXh0X2Jsb2NrX3JvdyA9IGJ1ZmZlcl9wdHI7CisgICAgICBlbHNlCisJbmV4dF9ibG9ja19yb3cgPSBidWZmZXJbYmxvY2tfcm93KzFdOworICAgICAgLyogV2UgZmV0Y2ggdGhlIHN1cnJvdW5kaW5nIERDIHZhbHVlcyB1c2luZyBhIHNsaWRpbmctcmVnaXN0ZXIgYXBwcm9hY2guCisgICAgICAgKiBJbml0aWFsaXplIGFsbCBuaW5lIGhlcmUgc28gYXMgdG8gZG8gdGhlIHJpZ2h0IHRoaW5nIG9uIG5hcnJvdyBwaWNzLgorICAgICAgICovCisgICAgICBEQzEgPSBEQzIgPSBEQzMgPSAoaW50KSBwcmV2X2Jsb2NrX3Jvd1swXVswXTsKKyAgICAgIERDNCA9IERDNSA9IERDNiA9IChpbnQpIGJ1ZmZlcl9wdHJbMF1bMF07CisgICAgICBEQzcgPSBEQzggPSBEQzkgPSAoaW50KSBuZXh0X2Jsb2NrX3Jvd1swXVswXTsKKyAgICAgIG91dHB1dF9jb2wgPSAwOworICAgICAgbGFzdF9ibG9ja19jb2x1bW4gPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgLSAxOworICAgICAgZm9yIChibG9ja19udW0gPSAwOyBibG9ja19udW0gPD0gbGFzdF9ibG9ja19jb2x1bW47IGJsb2NrX251bSsrKSB7CisJLyogRmV0Y2ggY3VycmVudCBEQ1QgYmxvY2sgaW50byB3b3Jrc3BhY2Ugc28gd2UgY2FuIG1vZGlmeSBpdC4gKi8KKwlqY29weV9ibG9ja19yb3coYnVmZmVyX3B0ciwgKEpCTE9DS1JPVykgd29ya3NwYWNlLCAoSkRJTUVOU0lPTikgMSk7CisJLyogVXBkYXRlIERDIHZhbHVlcyAqLworCWlmIChibG9ja19udW0gPCBsYXN0X2Jsb2NrX2NvbHVtbikgeworCSAgREMzID0gKGludCkgcHJldl9ibG9ja19yb3dbMV1bMF07CisJICBEQzYgPSAoaW50KSBidWZmZXJfcHRyWzFdWzBdOworCSAgREM5ID0gKGludCkgbmV4dF9ibG9ja19yb3dbMV1bMF07CisJfQorCS8qIENvbXB1dGUgY29lZmZpY2llbnQgZXN0aW1hdGVzIHBlciBLLjguCisJICogQW4gZXN0aW1hdGUgaXMgYXBwbGllZCBvbmx5IGlmIGNvZWZmaWNpZW50IGlzIHN0aWxsIHplcm8sCisJICogYW5kIGlzIG5vdCBrbm93biB0byBiZSBmdWxseSBhY2N1cmF0ZS4KKwkgKi8KKwkvKiBBQzAxICovCisJaWYgKChBbD1jb2VmX2JpdHNbMV0pICE9IDAgJiYgd29ya3NwYWNlWzFdID09IDApIHsKKwkgIG51bSA9IDM2ICogUTAwICogKERDNCAtIERDNik7CisJICBpZiAobnVtID49IDApIHsKKwkgICAgcHJlZCA9IChpbnQpICgoKFEwMTw8NykgKyBudW0pIC8gKFEwMTw8OCkpOworCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKKwkgICAgICBwcmVkID0gKDE8PEFsKS0xOworCSAgfSBlbHNlIHsKKwkgICAgcHJlZCA9IChpbnQpICgoKFEwMTw8NykgLSBudW0pIC8gKFEwMTw8OCkpOworCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKKwkgICAgICBwcmVkID0gKDE8PEFsKS0xOworCSAgICBwcmVkID0gLXByZWQ7CisJICB9CisJICB3b3Jrc3BhY2VbMV0gPSAoSkNPRUYpIHByZWQ7CisJfQorCS8qIEFDMTAgKi8KKwlpZiAoKEFsPWNvZWZfYml0c1syXSkgIT0gMCAmJiB3b3Jrc3BhY2VbOF0gPT0gMCkgeworCSAgbnVtID0gMzYgKiBRMDAgKiAoREMyIC0gREM4KTsKKwkgIGlmIChudW0gPj0gMCkgeworCSAgICBwcmVkID0gKGludCkgKCgoUTEwPDw3KSArIG51bSkgLyAoUTEwPDw4KSk7CisJICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQorCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7CisJICB9IGVsc2UgeworCSAgICBwcmVkID0gKGludCkgKCgoUTEwPDw3KSAtIG51bSkgLyAoUTEwPDw4KSk7CisJICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQorCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7CisJICAgIHByZWQgPSAtcHJlZDsKKwkgIH0KKwkgIHdvcmtzcGFjZVs4XSA9IChKQ09FRikgcHJlZDsKKwl9CisJLyogQUMyMCAqLworCWlmICgoQWw9Y29lZl9iaXRzWzNdKSAhPSAwICYmIHdvcmtzcGFjZVsxNl0gPT0gMCkgeworCSAgbnVtID0gOSAqIFEwMCAqIChEQzIgKyBEQzggLSAyKkRDNSk7CisJICBpZiAobnVtID49IDApIHsKKwkgICAgcHJlZCA9IChpbnQpICgoKFEyMDw8NykgKyBudW0pIC8gKFEyMDw8OCkpOworCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKKwkgICAgICBwcmVkID0gKDE8PEFsKS0xOworCSAgfSBlbHNlIHsKKwkgICAgcHJlZCA9IChpbnQpICgoKFEyMDw8NykgLSBudW0pIC8gKFEyMDw8OCkpOworCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKKwkgICAgICBwcmVkID0gKDE8PEFsKS0xOworCSAgICBwcmVkID0gLXByZWQ7CisJICB9CisJICB3b3Jrc3BhY2VbMTZdID0gKEpDT0VGKSBwcmVkOworCX0KKwkvKiBBQzExICovCisJaWYgKChBbD1jb2VmX2JpdHNbNF0pICE9IDAgJiYgd29ya3NwYWNlWzldID09IDApIHsKKwkgIG51bSA9IDUgKiBRMDAgKiAoREMxIC0gREMzIC0gREM3ICsgREM5KTsKKwkgIGlmIChudW0gPj0gMCkgeworCSAgICBwcmVkID0gKGludCkgKCgoUTExPDw3KSArIG51bSkgLyAoUTExPDw4KSk7CisJICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQorCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7CisJICB9IGVsc2UgeworCSAgICBwcmVkID0gKGludCkgKCgoUTExPDw3KSAtIG51bSkgLyAoUTExPDw4KSk7CisJICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQorCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7CisJICAgIHByZWQgPSAtcHJlZDsKKwkgIH0KKwkgIHdvcmtzcGFjZVs5XSA9IChKQ09FRikgcHJlZDsKKwl9CisJLyogQUMwMiAqLworCWlmICgoQWw9Y29lZl9iaXRzWzVdKSAhPSAwICYmIHdvcmtzcGFjZVsyXSA9PSAwKSB7CisJICBudW0gPSA5ICogUTAwICogKERDNCArIERDNiAtIDIqREM1KTsKKwkgIGlmIChudW0gPj0gMCkgeworCSAgICBwcmVkID0gKGludCkgKCgoUTAyPDw3KSArIG51bSkgLyAoUTAyPDw4KSk7CisJICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQorCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7CisJICB9IGVsc2UgeworCSAgICBwcmVkID0gKGludCkgKCgoUTAyPDw3KSAtIG51bSkgLyAoUTAyPDw4KSk7CisJICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQorCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7CisJICAgIHByZWQgPSAtcHJlZDsKKwkgIH0KKwkgIHdvcmtzcGFjZVsyXSA9IChKQ09FRikgcHJlZDsKKwl9CisJLyogT0ssIGRvIHRoZSBJRENUICovCisJKCppbnZlcnNlX0RDVCkgKGNpbmZvLCBjb21wcHRyLCAoSkNPRUZQVFIpIHdvcmtzcGFjZSwKKwkJCW91dHB1dF9wdHIsIG91dHB1dF9jb2wpOworCS8qIEFkdmFuY2UgZm9yIG5leHQgY29sdW1uICovCisJREMxID0gREMyOyBEQzIgPSBEQzM7CisJREM0ID0gREM1OyBEQzUgPSBEQzY7CisJREM3ID0gREM4OyBEQzggPSBEQzk7CisJYnVmZmVyX3B0cisrLCBwcmV2X2Jsb2NrX3JvdysrLCBuZXh0X2Jsb2NrX3JvdysrOworCW91dHB1dF9jb2wgKz0gY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOworICAgICAgfQorICAgICAgb3V0cHV0X3B0ciArPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7CisgICAgfQorICB9CisKKyAgaWYgKCsrKGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cpIDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cykKKyAgICByZXR1cm4gSlBFR19ST1dfQ09NUExFVEVEOworICByZXR1cm4gSlBFR19TQ0FOX0NPTVBMRVRFRDsKK30KKworI2VuZGlmIC8qIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQgKi8KKworCisvKgorICogSW5pdGlhbGl6ZSBjb2VmZmljaWVudCBidWZmZXIgY29udHJvbGxlci4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X2RfY29lZl9jb250cm9sbGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpCit7CisgIG15X2NvZWZfcHRyIGNvZWY7CisKKyAgY29lZiA9IChteV9jb2VmX3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9jb2VmX2NvbnRyb2xsZXIpKTsKKyAgY2luZm8tPmNvZWYgPSAoc3RydWN0IGpwZWdfZF9jb2VmX2NvbnRyb2xsZXIgKikgY29lZjsKKyAgY29lZi0+cHViLnN0YXJ0X2lucHV0X3Bhc3MgPSBzdGFydF9pbnB1dF9wYXNzOworICBjb2VmLT5wdWIuc3RhcnRfb3V0cHV0X3Bhc3MgPSBzdGFydF9vdXRwdXRfcGFzczsKKyNpZmRlZiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVECisgIGNvZWYtPmNvZWZfYml0c19sYXRjaCA9IE5VTEw7CisjZW5kaWYKKworICAvKiBDcmVhdGUgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlci4gKi8KKyAgaWYgKG5lZWRfZnVsbF9idWZmZXIpIHsKKyNpZmRlZiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKKyAgICAvKiBBbGxvY2F0ZSBhIGZ1bGwtaW1hZ2UgdmlydHVhbCBhcnJheSBmb3IgZWFjaCBjb21wb25lbnQsICovCisgICAgLyogcGFkZGVkIHRvIGEgbXVsdGlwbGUgb2Ygc2FtcF9mYWN0b3IgRENUIGJsb2NrcyBpbiBlYWNoIGRpcmVjdGlvbi4gKi8KKyAgICAvKiBOb3RlIHdlIGFzayBmb3IgYSBwcmUtemVyb2VkIGFycmF5LiAqLworICAgIGludCBjaSwgYWNjZXNzX3Jvd3M7CisgICAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisJIGNpKyssIGNvbXBwdHIrKykgeworICAgICAgYWNjZXNzX3Jvd3MgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworI2lmZGVmIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQKKyAgICAgIC8qIElmIGJsb2NrIHNtb290aGluZyBjb3VsZCBiZSB1c2VkLCBuZWVkIGEgYmlnZ2VyIHdpbmRvdyAqLworICAgICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKQorCWFjY2Vzc19yb3dzICo9IDM7CisjZW5kaWYKKyAgICAgIGNvZWYtPndob2xlX2ltYWdlW2NpXSA9ICgqY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X2JhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBUUlVFLAorCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MsCisJCQkJKGxvbmcpIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpLAorCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzLAorCQkJCShsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSwKKwkgKEpESU1FTlNJT04pIGFjY2Vzc19yb3dzKTsKKyAgICB9CisgICAgY29lZi0+cHViLmNvbnN1bWVfZGF0YSA9IGNvbnN1bWVfZGF0YTsKKyAgICBjb2VmLT5wdWIuZGVjb21wcmVzc19kYXRhID0gZGVjb21wcmVzc19kYXRhOworICAgIGNvZWYtPnB1Yi5jb2VmX2FycmF5cyA9IGNvZWYtPndob2xlX2ltYWdlOyAvKiBsaW5rIHRvIHZpcnR1YWwgYXJyYXlzICovCisjZWxzZQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIC8qIFdlIG9ubHkgbmVlZCBhIHNpbmdsZS1NQ1UgYnVmZmVyLiAqLworICAgIEpCTE9DS1JPVyBidWZmZXI7CisgICAgaW50IGk7CisKKyAgICBidWZmZXIgPSAoSkJMT0NLUk9XKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIERfTUFYX0JMT0NLU19JTl9NQ1UgKiBTSVpFT0YoSkJMT0NLKSk7CisgICAgZm9yIChpID0gMDsgaSA8IERfTUFYX0JMT0NLU19JTl9NQ1U7IGkrKykgeworICAgICAgY29lZi0+TUNVX2J1ZmZlcltpXSA9IGJ1ZmZlciArIGk7CisgICAgfQorICAgIGNvZWYtPnB1Yi5jb25zdW1lX2RhdGEgPSBkdW1teV9jb25zdW1lX2RhdGE7CisgICAgY29lZi0+cHViLmRlY29tcHJlc3NfZGF0YSA9IGRlY29tcHJlc3Nfb25lcGFzczsKKyAgICBjb2VmLT5wdWIuY29lZl9hcnJheXMgPSBOVUxMOyAvKiBmbGFnIGZvciBubyB2aXJ0dWFsIGFycmF5cyAqLworICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRjb2xvci5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkY29sb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzA0ZGZlCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkY29sb3IuYwpAQCAtMCwwICsxLDM5NiBAQAorLyoKKyAqIGpkY29sb3IuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIG91dHB1dCBjb2xvcnNwYWNlIGNvbnZlcnNpb24gcm91dGluZXMuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIFByaXZhdGUgc3Vib2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfY29sb3JfZGVjb252ZXJ0ZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogUHJpdmF0ZSBzdGF0ZSBmb3IgWUNDLT5SR0IgY29udmVyc2lvbiAqLworICBpbnQgKiBDcl9yX3RhYjsJCS8qID0+IHRhYmxlIGZvciBDciB0byBSIGNvbnZlcnNpb24gKi8KKyAgaW50ICogQ2JfYl90YWI7CQkvKiA9PiB0YWJsZSBmb3IgQ2IgdG8gQiBjb252ZXJzaW9uICovCisgIElOVDMyICogQ3JfZ190YWI7CQkvKiA9PiB0YWJsZSBmb3IgQ3IgdG8gRyBjb252ZXJzaW9uICovCisgIElOVDMyICogQ2JfZ190YWI7CQkvKiA9PiB0YWJsZSBmb3IgQ2IgdG8gRyBjb252ZXJzaW9uICovCit9IG15X2NvbG9yX2RlY29udmVydGVyOworCit0eXBlZGVmIG15X2NvbG9yX2RlY29udmVydGVyICogbXlfY2NvbnZlcnRfcHRyOworCisKKy8qKioqKioqKioqKioqKioqIFlDYkNyIC0+IFJHQiBjb252ZXJzaW9uOiBtb3N0IGNvbW1vbiBjYXNlICoqKioqKioqKioqKioqLworCisvKgorICogWUNiQ3IgaXMgZGVmaW5lZCBwZXIgQ0NJUiA2MDEtMSwgZXhjZXB0IHRoYXQgQ2IgYW5kIENyIGFyZQorICogbm9ybWFsaXplZCB0byB0aGUgcmFuZ2UgMC4uTUFYSlNBTVBMRSByYXRoZXIgdGhhbiAtMC41IC4uIDAuNS4KKyAqIFRoZSBjb252ZXJzaW9uIGVxdWF0aW9ucyB0byBiZSBpbXBsZW1lbnRlZCBhcmUgdGhlcmVmb3JlCisgKglSID0gWSAgICAgICAgICAgICAgICArIDEuNDAyMDAgKiBDcgorICoJRyA9IFkgLSAwLjM0NDE0ICogQ2IgLSAwLjcxNDE0ICogQ3IKKyAqCUIgPSBZICsgMS43NzIwMCAqIENiCisgKiB3aGVyZSBDYiBhbmQgQ3IgcmVwcmVzZW50IHRoZSBpbmNvbWluZyB2YWx1ZXMgbGVzcyBDRU5URVJKU0FNUExFLgorICogKFRoZXNlIG51bWJlcnMgYXJlIGRlcml2ZWQgZnJvbSBUSUZGIDYuMCBzZWN0aW9uIDIxLCBkYXRlZCAzLUp1bmUtOTIuKQorICoKKyAqIFRvIGF2b2lkIGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMsIHdlIHJlcHJlc2VudCB0aGUgZnJhY3Rpb25hbCBjb25zdGFudHMKKyAqIGFzIGludGVnZXJzIHNjYWxlZCB1cCBieSAyXjE2IChhYm91dCA0IGRpZ2l0cyBwcmVjaXNpb24pOyB3ZSBoYXZlIHRvIGRpdmlkZQorICogdGhlIHByb2R1Y3RzIGJ5IDJeMTYsIHdpdGggYXBwcm9wcmlhdGUgcm91bmRpbmcsIHRvIGdldCB0aGUgY29ycmVjdCBhbnN3ZXIuCisgKiBOb3RpY2UgdGhhdCBZLCBiZWluZyBhbiBpbnRlZ3JhbCBpbnB1dCwgZG9lcyBub3QgY29udHJpYnV0ZSBhbnkgZnJhY3Rpb24KKyAqIHNvIGl0IG5lZWQgbm90IHBhcnRpY2lwYXRlIGluIHRoZSByb3VuZGluZy4KKyAqCisgKiBGb3IgZXZlbiBtb3JlIHNwZWVkLCB3ZSBhdm9pZCBkb2luZyBhbnkgbXVsdGlwbGljYXRpb25zIGluIHRoZSBpbm5lciBsb29wCisgKiBieSBwcmVjYWxjdWxhdGluZyB0aGUgY29uc3RhbnRzIHRpbWVzIENiIGFuZCBDciBmb3IgYWxsIHBvc3NpYmxlIHZhbHVlcy4KKyAqIEZvciA4LWJpdCBKU0FNUExFcyB0aGlzIGlzIHZlcnkgcmVhc29uYWJsZSAob25seSAyNTYgZW50cmllcyBwZXIgdGFibGUpOworICogZm9yIDEyLWJpdCBzYW1wbGVzIGl0IGlzIHN0aWxsIGFjY2VwdGFibGUuICBJdCdzIG5vdCB2ZXJ5IHJlYXNvbmFibGUgZm9yCisgKiAxNi1iaXQgc2FtcGxlcywgYnV0IGlmIHlvdSB3YW50IGxvc3NsZXNzIHN0b3JhZ2UgeW91IHNob3VsZG4ndCBiZSBjaGFuZ2luZworICogY29sb3JzcGFjZSBhbnl3YXkuCisgKiBUaGUgQ3I9PlIgYW5kIENiPT5CIHZhbHVlcyBjYW4gYmUgcm91bmRlZCB0byBpbnRlZ2VycyBpbiBhZHZhbmNlOyB0aGUKKyAqIHZhbHVlcyBmb3IgdGhlIEcgY2FsY3VsYXRpb24gYXJlIGxlZnQgc2NhbGVkIHVwLCBzaW5jZSB3ZSBtdXN0IGFkZCB0aGVtCisgKiB0b2dldGhlciBiZWZvcmUgcm91bmRpbmcuCisgKi8KKworI2RlZmluZSBTQ0FMRUJJVFMJMTYJLyogc3BlZWRpZXN0IHJpZ2h0LXNoaWZ0IG9uIHNvbWUgbWFjaGluZXMgKi8KKyNkZWZpbmUgT05FX0hBTEYJKChJTlQzMikgMSA8PCAoU0NBTEVCSVRTLTEpKQorI2RlZmluZSBGSVgoeCkJCSgoSU5UMzIpICgoeCkgKiAoMUw8PFNDQUxFQklUUykgKyAwLjUpKQorCisKKy8qCisgKiBJbml0aWFsaXplIHRhYmxlcyBmb3IgWUNDLT5SR0IgY29sb3JzcGFjZSBjb252ZXJzaW9uLgorICovCisKK0xPQ0FMKHZvaWQpCitidWlsZF95Y2NfcmdiX3RhYmxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7CisgIGludCBpOworICBJTlQzMiB4OworICBTSElGVF9URU1QUworCisgIGNjb252ZXJ0LT5Dcl9yX3RhYiA9IChpbnQgKikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCShNQVhKU0FNUExFKzEpICogU0laRU9GKGludCkpOworICBjY29udmVydC0+Q2JfYl90YWIgPSAoaW50ICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihpbnQpKTsKKyAgY2NvbnZlcnQtPkNyX2dfdGFiID0gKElOVDMyICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihJTlQzMikpOworICBjY29udmVydC0+Q2JfZ190YWIgPSAoSU5UMzIgKikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCShNQVhKU0FNUExFKzEpICogU0laRU9GKElOVDMyKSk7CisKKyAgZm9yIChpID0gMCwgeCA9IC1DRU5URVJKU0FNUExFOyBpIDw9IE1BWEpTQU1QTEU7IGkrKywgeCsrKSB7CisgICAgLyogaSBpcyB0aGUgYWN0dWFsIGlucHV0IHBpeGVsIHZhbHVlLCBpbiB0aGUgcmFuZ2UgMC4uTUFYSlNBTVBMRSAqLworICAgIC8qIFRoZSBDYiBvciBDciB2YWx1ZSB3ZSBhcmUgdGhpbmtpbmcgb2YgaXMgeCA9IGkgLSBDRU5URVJKU0FNUExFICovCisgICAgLyogQ3I9PlIgdmFsdWUgaXMgbmVhcmVzdCBpbnQgdG8gMS40MDIwMCAqIHggKi8KKyAgICBjY29udmVydC0+Q3Jfcl90YWJbaV0gPSAoaW50KQorCQkgICAgUklHSFRfU0hJRlQoRklYKDEuNDAyMDApICogeCArIE9ORV9IQUxGLCBTQ0FMRUJJVFMpOworICAgIC8qIENiPT5CIHZhbHVlIGlzIG5lYXJlc3QgaW50IHRvIDEuNzcyMDAgKiB4ICovCisgICAgY2NvbnZlcnQtPkNiX2JfdGFiW2ldID0gKGludCkKKwkJICAgIFJJR0hUX1NISUZUKEZJWCgxLjc3MjAwKSAqIHggKyBPTkVfSEFMRiwgU0NBTEVCSVRTKTsKKyAgICAvKiBDcj0+RyB2YWx1ZSBpcyBzY2FsZWQtdXAgLTAuNzE0MTQgKiB4ICovCisgICAgY2NvbnZlcnQtPkNyX2dfdGFiW2ldID0gKC0gRklYKDAuNzE0MTQpKSAqIHg7CisgICAgLyogQ2I9PkcgdmFsdWUgaXMgc2NhbGVkLXVwIC0wLjM0NDE0ICogeCAqLworICAgIC8qIFdlIGFsc28gYWRkIGluIE9ORV9IQUxGIHNvIHRoYXQgbmVlZCBub3QgZG8gaXQgaW4gaW5uZXIgbG9vcCAqLworICAgIGNjb252ZXJ0LT5DYl9nX3RhYltpXSA9ICgtIEZJWCgwLjM0NDE0KSkgKiB4ICsgT05FX0hBTEY7CisgIH0KK30KKworCisvKgorICogQ29udmVydCBzb21lIHJvd3Mgb2Ygc2FtcGxlcyB0byB0aGUgb3V0cHV0IGNvbG9yc3BhY2UuCisgKgorICogTm90ZSB0aGF0IHdlIGNoYW5nZSBmcm9tIG5vbmludGVybGVhdmVkLCBvbmUtcGxhbmUtcGVyLWNvbXBvbmVudCBmb3JtYXQKKyAqIHRvIGludGVybGVhdmVkLXBpeGVsIGZvcm1hdC4gIFRoZSBvdXRwdXQgYnVmZmVyIGlzIHRoZXJlZm9yZSB0aHJlZSB0aW1lcworICogYXMgd2lkZSBhcyB0aGUgaW5wdXQgYnVmZmVyLgorICogQSBzdGFydGluZyByb3cgb2Zmc2V0IGlzIHByb3ZpZGVkIG9ubHkgZm9yIHRoZSBpbnB1dCBidWZmZXIuICBUaGUgY2FsbGVyCisgKiBjYW4gZWFzaWx5IGFkanVzdCB0aGUgcGFzc2VkIG91dHB1dF9idWYgdmFsdWUgdG8gYWNjb21tb2RhdGUgYW55IHJvdworICogb2Zmc2V0IHJlcXVpcmVkIG9uIHRoYXQgc2lkZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3ljY19yZ2JfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKKwkJIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQoreworICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7CisgIHJlZ2lzdGVyIGludCB5LCBjYiwgY3I7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIGlucHRyMjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+b3V0cHV0X3dpZHRoOworICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCisgIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7CisgIHJlZ2lzdGVyIGludCAqIENycnRhYiA9IGNjb252ZXJ0LT5Dcl9yX3RhYjsKKyAgcmVnaXN0ZXIgaW50ICogQ2JidGFiID0gY2NvbnZlcnQtPkNiX2JfdGFiOworICByZWdpc3RlciBJTlQzMiAqIENyZ3RhYiA9IGNjb252ZXJ0LT5Dcl9nX3RhYjsKKyAgcmVnaXN0ZXIgSU5UMzIgKiBDYmd0YWIgPSBjY29udmVydC0+Q2JfZ190YWI7CisgIFNISUZUX1RFTVBTCisKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIGlucHRyMCA9IGlucHV0X2J1ZlswXVtpbnB1dF9yb3ddOworICAgIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbnB1dF9yb3ddOworICAgIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbnB1dF9yb3ddOworICAgIGlucHV0X3JvdysrOworICAgIG91dHB0ciA9ICpvdXRwdXRfYnVmKys7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKKyAgICAgIHkgID0gR0VUSlNBTVBMRShpbnB0cjBbY29sXSk7CisgICAgICBjYiA9IEdFVEpTQU1QTEUoaW5wdHIxW2NvbF0pOworICAgICAgY3IgPSBHRVRKU0FNUExFKGlucHRyMltjb2xdKTsKKyAgICAgIC8qIFJhbmdlLWxpbWl0aW5nIGlzIGVzc2VudGlhbCBkdWUgdG8gbm9pc2UgaW50cm9kdWNlZCBieSBEQ1QgbG9zc2VzLiAqLworICAgICAgb3V0cHRyW1JHQl9SRURdID0gICByYW5nZV9saW1pdFt5ICsgQ3JydGFiW2NyXV07CisgICAgICBvdXRwdHJbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKworCQkJICAgICAgKChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLAorCQkJCQkJIFNDQUxFQklUUykpXTsKKyAgICAgIG91dHB0cltSR0JfQkxVRV0gPSAgcmFuZ2VfbGltaXRbeSArIENiYnRhYltjYl1dOworICAgICAgb3V0cHRyICs9IFJHQl9QSVhFTFNJWkU7CisgICAgfQorICB9Cit9CisKKworLyoqKioqKioqKioqKioqKiogQ2FzZXMgb3RoZXIgdGhhbiBZQ2JDciAtPiBSR0IgKioqKioqKioqKioqKiovCisKKworLyoKKyAqIENvbG9yIGNvbnZlcnNpb24gZm9yIG5vIGNvbG9yc3BhY2UgY2hhbmdlOiBqdXN0IGNvcHkgdGhlIGRhdGEsCisgKiBjb252ZXJ0aW5nIGZyb20gc2VwYXJhdGUtcGxhbmVzIHRvIGludGVybGVhdmVkIHJlcHJlc2VudGF0aW9uLgorICovCisKK01FVEhPRERFRih2b2lkKQorbnVsbF9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCSAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKKwkgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKK3sKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb3VudDsKKyAgcmVnaXN0ZXIgaW50IG51bV9jb21wb25lbnRzID0gY2luZm8tPm51bV9jb21wb25lbnRzOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKKyAgaW50IGNpOworCisgIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKKyAgICBmb3IgKGNpID0gMDsgY2kgPCBudW1fY29tcG9uZW50czsgY2krKykgeworICAgICAgaW5wdHIgPSBpbnB1dF9idWZbY2ldW2lucHV0X3Jvd107CisgICAgICBvdXRwdHIgPSBvdXRwdXRfYnVmWzBdICsgY2k7CisgICAgICBmb3IgKGNvdW50ID0gbnVtX2NvbHM7IGNvdW50ID4gMDsgY291bnQtLSkgeworCSpvdXRwdHIgPSAqaW5wdHIrKzsJLyogbmVlZG4ndCBib3RoZXIgd2l0aCBHRVRKU0FNUExFKCkgaGVyZSAqLworCW91dHB0ciArPSBudW1fY29tcG9uZW50czsKKyAgICAgIH0KKyAgICB9CisgICAgaW5wdXRfcm93Kys7CisgICAgb3V0cHV0X2J1ZisrOworICB9Cit9CisKKworLyoKKyAqIENvbG9yIGNvbnZlcnNpb24gZm9yIGdyYXlzY2FsZToganVzdCBjb3B5IHRoZSBkYXRhLgorICogVGhpcyBhbHNvIHdvcmtzIGZvciBZQ2JDciAtPiBncmF5c2NhbGUgY29udmVyc2lvbiwgaW4gd2hpY2gKKyAqIHdlIGp1c3QgY29weSB0aGUgWSAobHVtaW5hbmNlKSBjb21wb25lbnQgYW5kIGlnbm9yZSBjaHJvbWluYW5jZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2dyYXlzY2FsZV9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisJCSAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQoreworICBqY29weV9zYW1wbGVfcm93cyhpbnB1dF9idWZbMF0sIChpbnQpIGlucHV0X3Jvdywgb3V0cHV0X2J1ZiwgMCwKKwkJICAgIG51bV9yb3dzLCBjaW5mby0+b3V0cHV0X3dpZHRoKTsKK30KKworCisvKgorICogQ29udmVydCBncmF5c2NhbGUgdG8gUkdCOiBqdXN0IGR1cGxpY2F0ZSB0aGUgZ3JheWxldmVsIHRocmVlIHRpbWVzLgorICogVGhpcyBpcyBwcm92aWRlZCB0byBzdXBwb3J0IGFwcGxpY2F0aW9ucyB0aGF0IGRvbid0IHdhbnQgdG8gY29wZQorICogd2l0aCBncmF5c2NhbGUgYXMgYSBzZXBhcmF0ZSBjYXNlLgorICovCisKK01FVEhPRERFRih2b2lkKQorZ3JheV9yZ2JfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisJCSAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCit7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKKworICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7CisgICAgaW5wdHIgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93KytdOworICAgIG91dHB0ciA9ICpvdXRwdXRfYnVmKys7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKKyAgICAgIC8qIFdlIGNhbiBkaXNwZW5zZSB3aXRoIEdFVEpTQU1QTEUoKSBoZXJlICovCisgICAgICBvdXRwdHJbUkdCX1JFRF0gPSBvdXRwdHJbUkdCX0dSRUVOXSA9IG91dHB0cltSR0JfQkxVRV0gPSBpbnB0cltjb2xdOworICAgICAgb3V0cHRyICs9IFJHQl9QSVhFTFNJWkU7CisgICAgfQorICB9Cit9CisKKworLyoKKyAqIEFkb2JlLXN0eWxlIFlDQ0stPkNNWUsgY29udmVyc2lvbi4KKyAqIFdlIGNvbnZlcnQgWUNiQ3IgdG8gUj0xLUMsIEc9MS1NLCBhbmQgQj0xLVkgdXNpbmcgdGhlIHNhbWUKKyAqIGNvbnZlcnNpb24gYXMgYWJvdmUsIHdoaWxlIHBhc3NpbmcgSyAoYmxhY2spIHVuY2hhbmdlZC4KKyAqIFdlIGFzc3VtZSBidWlsZF95Y2NfcmdiX3RhYmxlIGhhcyBiZWVuIGNhbGxlZC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3ljY2tfY215a19jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisJCSAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQoreworICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7CisgIHJlZ2lzdGVyIGludCB5LCBjYiwgY3I7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIGlucHRyMiwgaW5wdHIzOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisgIC8qIGNvcHkgdGhlc2UgcG9pbnRlcnMgaW50byByZWdpc3RlcnMgaWYgcG9zc2libGUgKi8KKyAgcmVnaXN0ZXIgSlNBTVBMRSAqIHJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKKyAgcmVnaXN0ZXIgaW50ICogQ3JydGFiID0gY2NvbnZlcnQtPkNyX3JfdGFiOworICByZWdpc3RlciBpbnQgKiBDYmJ0YWIgPSBjY29udmVydC0+Q2JfYl90YWI7CisgIHJlZ2lzdGVyIElOVDMyICogQ3JndGFiID0gY2NvbnZlcnQtPkNyX2dfdGFiOworICByZWdpc3RlciBJTlQzMiAqIENiZ3RhYiA9IGNjb252ZXJ0LT5DYl9nX3RhYjsKKyAgU0hJRlRfVEVNUFMKKworICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7CisgICAgaW5wdHIwID0gaW5wdXRfYnVmWzBdW2lucHV0X3Jvd107CisgICAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2lucHV0X3Jvd107CisgICAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2lucHV0X3Jvd107CisgICAgaW5wdHIzID0gaW5wdXRfYnVmWzNdW2lucHV0X3Jvd107CisgICAgaW5wdXRfcm93Kys7CisgICAgb3V0cHRyID0gKm91dHB1dF9idWYrKzsKKyAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bV9jb2xzOyBjb2wrKykgeworICAgICAgeSAgPSBHRVRKU0FNUExFKGlucHRyMFtjb2xdKTsKKyAgICAgIGNiID0gR0VUSlNBTVBMRShpbnB0cjFbY29sXSk7CisgICAgICBjciA9IEdFVEpTQU1QTEUoaW5wdHIyW2NvbF0pOworICAgICAgLyogUmFuZ2UtbGltaXRpbmcgaXMgZXNzZW50aWFsIGR1ZSB0byBub2lzZSBpbnRyb2R1Y2VkIGJ5IERDVCBsb3NzZXMuICovCisgICAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFtNQVhKU0FNUExFIC0gKHkgKyBDcnJ0YWJbY3JdKV07CS8qIHJlZCAqLworICAgICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbTUFYSlNBTVBMRSAtICh5ICsJCQkvKiBncmVlbiAqLworCQkJICAgICAgKChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLAorCQkJCQkJIFNDQUxFQklUUykpKV07CisgICAgICBvdXRwdHJbMl0gPSByYW5nZV9saW1pdFtNQVhKU0FNUExFIC0gKHkgKyBDYmJ0YWJbY2JdKV07CS8qIGJsdWUgKi8KKyAgICAgIC8qIEsgcGFzc2VzIHRocm91Z2ggdW5jaGFuZ2VkICovCisgICAgICBvdXRwdHJbM10gPSBpbnB0cjNbY29sXTsJLyogZG9uJ3QgbmVlZCBHRVRKU0FNUExFIGhlcmUgKi8KKyAgICAgIG91dHB0ciArPSA0OworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBFbXB0eSBtZXRob2QgZm9yIHN0YXJ0X3Bhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX2Rjb2xvciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgLyogbm8gd29yayBuZWVkZWQgKi8KK30KKworCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIG91dHB1dCBjb2xvcnNwYWNlIGNvbnZlcnNpb24uCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9jb2xvcl9kZWNvbnZlcnRlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0OworICBpbnQgY2k7CisKKyAgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKG15X2NvbG9yX2RlY29udmVydGVyKSk7CisgIGNpbmZvLT5jY29udmVydCA9IChzdHJ1Y3QganBlZ19jb2xvcl9kZWNvbnZlcnRlciAqKSBjY29udmVydDsKKyAgY2NvbnZlcnQtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19kY29sb3I7CisKKyAgLyogTWFrZSBzdXJlIG51bV9jb21wb25lbnRzIGFncmVlcyB3aXRoIGpwZWdfY29sb3Jfc3BhY2UgKi8KKyAgc3dpdGNoIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSkgeworICBjYXNlIEpDU19HUkFZU0NBTEU6CisgICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyAhPSAxKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKKyAgICBicmVhazsKKworICBjYXNlIEpDU19SR0I6CisgIGNhc2UgSkNTX1lDYkNyOgorICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gMykKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBKQ1NfQ01ZSzoKKyAgY2FzZSBKQ1NfWUNDSzoKKyAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDQpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CQkJLyogSkNTX1VOS05PV04gY2FuIGJlIGFueXRoaW5nICovCisgICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyA8IDEpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOworICAgIGJyZWFrOworICB9CisKKyAgLyogU2V0IG91dF9jb2xvcl9jb21wb25lbnRzIGFuZCBjb252ZXJzaW9uIG1ldGhvZCBiYXNlZCBvbiByZXF1ZXN0ZWQgc3BhY2UuCisgICAqIEFsc28gY2xlYXIgdGhlIGNvbXBvbmVudF9uZWVkZWQgZmxhZ3MgZm9yIGFueSB1bnVzZWQgY29tcG9uZW50cywKKyAgICogc28gdGhhdCBlYXJsaWVyIHBpcGVsaW5lIHN0YWdlcyBjYW4gYXZvaWQgdXNlbGVzcyBjb21wdXRhdGlvbi4KKyAgICovCisKKyAgc3dpdGNoIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlKSB7CisgIGNhc2UgSkNTX0dSQVlTQ0FMRToKKyAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSAxOworICAgIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfR1JBWVNDQUxFIHx8CisJY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyKSB7CisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBncmF5c2NhbGVfY29udmVydDsKKyAgICAgIC8qIEZvciBjb2xvci0+Z3JheXNjYWxlIGNvbnZlcnNpb24sIG9ubHkgdGhlIFkgKDApIGNvbXBvbmVudCBpcyBuZWVkZWQgKi8KKyAgICAgIGZvciAoY2kgPSAxOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykKKwljaW5mby0+Y29tcF9pbmZvW2NpXS5jb21wb25lbnRfbmVlZGVkID0gRkFMU0U7CisgICAgfSBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBKQ1NfUkdCOgorICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IFJHQl9QSVhFTFNJWkU7CisgICAgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19ZQ2JDcikgeworICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0geWNjX3JnYl9jb252ZXJ0OworICAgICAgYnVpbGRfeWNjX3JnYl90YWJsZShjaW5mbyk7CisgICAgfSBlbHNlIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfR1JBWVNDQUxFKSB7CisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBncmF5X3JnYl9jb252ZXJ0OworICAgIH0gZWxzZSBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQiAmJiBSR0JfUElYRUxTSVpFID09IDMpIHsKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKKyAgICB9IGVsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKKyAgICBicmVhazsKKworICBjYXNlIEpDU19DTVlLOgorICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IDQ7CisgICAgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19ZQ0NLKSB7CisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSB5Y2NrX2NteWtfY29udmVydDsKKyAgICAgIGJ1aWxkX3ljY19yZ2JfdGFibGUoY2luZm8pOworICAgIH0gZWxzZSBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX0NNWUspIHsKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKKyAgICB9IGVsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIC8qIFBlcm1pdCBudWxsIGNvbnZlcnNpb24gdG8gc2FtZSBvdXRwdXQgc3BhY2UgKi8KKyAgICBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSkgeworICAgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gbnVsbF9jb252ZXJ0OworICAgIH0gZWxzZQkJCS8qIHVuc3VwcG9ydGVkIG5vbi1udWxsIGNvbnZlcnNpb24gKi8KKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKKyAgICBicmVhazsKKyAgfQorCisgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKQorICAgIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50cyA9IDE7IC8qIHNpbmdsZSBjb2xvcm1hcHBlZCBvdXRwdXQgY29tcG9uZW50ICovCisgIGVsc2UKKyAgICBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMgPSBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRkY3RtZ3IuYyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qZGRjdG1nci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZjhkMGUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRkY3RtZ3IuYwpAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqIGpkZGN0bWdyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW52ZXJzZS1EQ1QgbWFuYWdlbWVudCBsb2dpYy4KKyAqIFRoaXMgY29kZSBzZWxlY3RzIGEgcGFydGljdWxhciBJRENUIGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQsCisgKiBhbmQgaXQgcGVyZm9ybXMgcmVsYXRlZCBob3VzZWtlZXBpbmcgY2hvcmVzLiAgTm8gY29kZSBpbiB0aGlzIGZpbGUKKyAqIGlzIGV4ZWN1dGVkIHBlciBJRENUIHN0ZXAsIG9ubHkgZHVyaW5nIG91dHB1dCBwYXNzIHNldHVwLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgSURDVCByb3V0aW5lcyBhcmUgcmVzcG9uc2libGUgZm9yIHBlcmZvcm1pbmcgY29lZmZpY2llbnQKKyAqIGRlcXVhbnRpemF0aW9uIGFzIHdlbGwgYXMgdGhlIElEQ1QgcHJvcGVyLiAgVGhpcyBtb2R1bGUgc2V0cyB1cCB0aGUKKyAqIGRlcXVhbnRpemF0aW9uIG11bHRpcGxpZXIgdGFibGUgbmVlZGVkIGJ5IHRoZSBJRENUIHJvdXRpbmUuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImpkY3QuaCIJCS8qIFByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBEQ1Qgc3Vic3lzdGVtICovCisKKworLyoKKyAqIFRoZSBkZWNvbXByZXNzb3IgaW5wdXQgc2lkZSAoamRpbnB1dC5jKSBzYXZlcyBhd2F5IHRoZSBhcHByb3ByaWF0ZQorICogcXVhbnRpemF0aW9uIHRhYmxlIGZvciBlYWNoIGNvbXBvbmVudCBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpcnN0IHNjYW4KKyAqIGludm9sdmluZyB0aGF0IGNvbXBvbmVudC4gIChUaGlzIGlzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBjb3JyZWN0bHkKKyAqIGRlY29kZSBmaWxlcyB0aGF0IHJldXNlIFEtdGFibGUgc2xvdHMuKQorICogV2hlbiB3ZSBhcmUgcmVhZHkgdG8gbWFrZSBhbiBvdXRwdXQgcGFzcywgdGhlIHNhdmVkIFEtdGFibGUgaXMgY29udmVydGVkCisgKiB0byBhIG11bHRpcGxpZXIgdGFibGUgdGhhdCB3aWxsIGFjdHVhbGx5IGJlIHVzZWQgYnkgdGhlIElEQ1Qgcm91dGluZS4KKyAqIFRoZSBtdWx0aXBsaWVyIHRhYmxlIGNvbnRlbnRzIGFyZSBJRENULW1ldGhvZC1kZXBlbmRlbnQuICBUbyBzdXBwb3J0CisgKiBhcHBsaWNhdGlvbiBjaGFuZ2VzIGluIElEQ1QgbWV0aG9kIGJldHdlZW4gc2NhbnMsIHdlIGNhbiByZW1ha2UgdGhlCisgKiBtdWx0aXBsaWVyIHRhYmxlcyBpZiBuZWNlc3NhcnkuCisgKiBJbiBidWZmZXJlZC1pbWFnZSBtb2RlLCB0aGUgZmlyc3Qgb3V0cHV0IHBhc3MgbWF5IG9jY3VyIGJlZm9yZSBhbnkgZGF0YQorICogaGFzIGJlZW4gc2VlbiBmb3Igc29tZSBjb21wb25lbnRzLCBhbmQgdGh1cyBiZWZvcmUgdGhlaXIgUS10YWJsZXMgaGF2ZQorICogYmVlbiBzYXZlZCBhd2F5LiAgVG8gaGFuZGxlIHRoaXMgY2FzZSwgbXVsdGlwbGllciB0YWJsZXMgYXJlIHByZXNldAorICogdG8gemVyb2VzOyB0aGUgcmVzdWx0IG9mIHRoZSBJRENUIHdpbGwgYmUgYSBuZXV0cmFsIGdyYXkgbGV2ZWwuCisgKi8KKworCisvKiBQcml2YXRlIHN1Ym9iamVjdCBmb3IgdGhpcyBtb2R1bGUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19pbnZlcnNlX2RjdCBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBUaGlzIGFycmF5IGNvbnRhaW5zIHRoZSBJRENUIG1ldGhvZCBjb2RlIHRoYXQgZWFjaCBtdWx0aXBsaWVyIHRhYmxlCisgICAqIGlzIGN1cnJlbnRseSBzZXQgdXAgZm9yLCBvciAtMSBpZiBpdCdzIG5vdCB5ZXQgc2V0IHVwLgorICAgKiBUaGUgYWN0dWFsIG11bHRpcGxpZXIgdGFibGVzIGFyZSBwb2ludGVkIHRvIGJ5IGRjdF90YWJsZSBpbiB0aGUKKyAgICogcGVyLWNvbXBvbmVudCBjb21wX2luZm8gc3RydWN0dXJlcy4KKyAgICovCisgIGludCBjdXJfbWV0aG9kW01BWF9DT01QT05FTlRTXTsKK30gbXlfaWRjdF9jb250cm9sbGVyOworCit0eXBlZGVmIG15X2lkY3RfY29udHJvbGxlciAqIG15X2lkY3RfcHRyOworCisKKy8qIEFsbG9jYXRlZCBtdWx0aXBsaWVyIHRhYmxlczogYmlnIGVub3VnaCBmb3IgYW55IHN1cHBvcnRlZCB2YXJpYW50ICovCisKK3R5cGVkZWYgdW5pb24geworICBJU0xPV19NVUxUX1RZUEUgaXNsb3dfYXJyYXlbRENUU0laRTJdOworI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKKyAgSUZBU1RfTVVMVF9UWVBFIGlmYXN0X2FycmF5W0RDVFNJWkUyXTsKKyNlbmRpZgorI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKKyAgRkxPQVRfTVVMVF9UWVBFIGZsb2F0X2FycmF5W0RDVFNJWkUyXTsKKyNlbmRpZgorfSBtdWx0aXBsaWVyX3RhYmxlOworCisKKy8qIFRoZSBjdXJyZW50IHNjYWxlZC1JRENUIHJvdXRpbmVzIHJlcXVpcmUgSVNMT1ctc3R5bGUgbXVsdGlwbGllciB0YWJsZXMsCisgKiBzbyBiZSBzdXJlIHRvIGNvbXBpbGUgdGhhdCBjb2RlIGlmIGVpdGhlciBJU0xPVyBvciBTQ0FMSU5HIGlzIHJlcXVlc3RlZC4KKyAqLworI2lmZGVmIERDVF9JU0xPV19TVVBQT1JURUQKKyNkZWZpbmUgUFJPVklERV9JU0xPV19UQUJMRVMKKyNlbHNlCisjaWZkZWYgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAorI2RlZmluZSBQUk9WSURFX0lTTE9XX1RBQkxFUworI2VuZGlmCisjZW5kaWYKKworCisvKgorICogUHJlcGFyZSBmb3IgYW4gb3V0cHV0IHBhc3MuCisgKiBIZXJlIHdlIHNlbGVjdCB0aGUgcHJvcGVyIElEQ1Qgcm91dGluZSBmb3IgZWFjaCBjb21wb25lbnQgYW5kIGJ1aWxkCisgKiBhIG1hdGNoaW5nIG11bHRpcGxpZXIgdGFibGUuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9pZGN0X3B0ciBpZGN0ID0gKG15X2lkY3RfcHRyKSBjaW5mby0+aWRjdDsKKyAgaW50IGNpLCBpOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICBpbnQgbWV0aG9kID0gMDsKKyAgaW52ZXJzZV9EQ1RfbWV0aG9kX3B0ciBtZXRob2RfcHRyID0gTlVMTDsKKyAgSlFVQU5UX1RCTCAqIHF0Ymw7CisKKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAvKiBTZWxlY3QgdGhlIHByb3BlciBJRENUIHJvdXRpbmUgZm9yIHRoaXMgY29tcG9uZW50J3Mgc2NhbGluZyAqLworICAgIHN3aXRjaCAoY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSB7CisjaWZkZWYgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAorICAgIGNhc2UgMToKKyAgICAgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfMXgxOworICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamlkY3RyZWQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF8yeDI7CisgICAgICBtZXRob2QgPSBKRENUX0lTTE9XOwkvKiBqaWRjdHJlZCB1c2VzIGlzbG93LXN0eWxlIHRhYmxlICovCisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBtZXRob2RfcHRyID0ganBlZ19pZGN0XzR4NDsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGppZGN0cmVkIHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBEQ1RTSVpFOgorICAgICAgc3dpdGNoIChjaW5mby0+ZGN0X21ldGhvZCkgeworI2lmZGVmIERDVF9JU0xPV19TVVBQT1JURUQKKyAgICAgIGNhc2UgSkRDVF9JU0xPVzoKKwltZXRob2RfcHRyID0ganBlZ19pZGN0X2lzbG93OworCW1ldGhvZCA9IEpEQ1RfSVNMT1c7CisJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECisgICAgICBjYXNlIEpEQ1RfSUZBU1Q6CisJbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF9pZmFzdDsKKwltZXRob2QgPSBKRENUX0lGQVNUOworCWJyZWFrOworI2VuZGlmCisjaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAorICAgICAgY2FzZSBKRENUX0ZMT0FUOgorCW1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfZmxvYXQ7CisJbWV0aG9kID0gSkRDVF9GTE9BVDsKKwlicmVhazsKKyNlbmRpZgorICAgICAgZGVmYXVsdDoKKwlFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisJYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX0RDVFNJWkUsIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWRjdC0+cHViLmludmVyc2VfRENUW2NpXSA9IG1ldGhvZF9wdHI7CisgICAgLyogQ3JlYXRlIG11bHRpcGxpZXIgdGFibGUgZnJvbSBxdWFudCB0YWJsZS4KKyAgICAgKiBIb3dldmVyLCB3ZSBjYW4gc2tpcCB0aGlzIGlmIHRoZSBjb21wb25lbnQgaXMgdW5pbnRlcmVzdGluZworICAgICAqIG9yIGlmIHdlIGFscmVhZHkgYnVpbHQgdGhlIHRhYmxlLiAgQWxzbywgaWYgbm8gcXVhbnQgdGFibGUKKyAgICAgKiBoYXMgeWV0IGJlZW4gc2F2ZWQgZm9yIHRoZSBjb21wb25lbnQsIHdlIGxlYXZlIHRoZQorICAgICAqIG11bHRpcGxpZXIgdGFibGUgYWxsLXplcm87IHdlJ2xsIGJlIHJlYWRpbmcgemVyb2VzIGZyb20gdGhlCisgICAgICogY29lZmZpY2llbnQgY29udHJvbGxlcidzIGJ1ZmZlciBhbnl3YXkuCisgICAgICovCisgICAgaWYgKCEgY29tcHB0ci0+Y29tcG9uZW50X25lZWRlZCB8fCBpZGN0LT5jdXJfbWV0aG9kW2NpXSA9PSBtZXRob2QpCisgICAgICBjb250aW51ZTsKKyAgICBxdGJsID0gY29tcHB0ci0+cXVhbnRfdGFibGU7CisgICAgaWYgKHF0YmwgPT0gTlVMTCkJCS8qIGhhcHBlbnMgaWYgbm8gZGF0YSB5ZXQgZm9yIGNvbXBvbmVudCAqLworICAgICAgY29udGludWU7CisgICAgaWRjdC0+Y3VyX21ldGhvZFtjaV0gPSBtZXRob2Q7CisgICAgc3dpdGNoIChtZXRob2QpIHsKKyNpZmRlZiBQUk9WSURFX0lTTE9XX1RBQkxFUworICAgIGNhc2UgSkRDVF9JU0xPVzoKKyAgICAgIHsKKwkvKiBGb3IgTEwmTSBJRENUIG1ldGhvZCwgbXVsdGlwbGllcnMgYXJlIGVxdWFsIHRvIHJhdyBxdWFudGl6YXRpb24KKwkgKiBjb2VmZmljaWVudHMsIGJ1dCBhcmUgc3RvcmVkIGFzIGludHMgdG8gZW5zdXJlIGFjY2VzcyBlZmZpY2llbmN5LgorCSAqLworCUlTTE9XX01VTFRfVFlQRSAqIGlzbXRibCA9IChJU0xPV19NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOworCWZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7CisJICBpc210YmxbaV0gPSAoSVNMT1dfTVVMVF9UWVBFKSBxdGJsLT5xdWFudHZhbFtpXTsKKwl9CisgICAgICB9CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKKyAgICBjYXNlIEpEQ1RfSUZBU1Q6CisgICAgICB7CisJLyogRm9yIEFBJk4gSURDVCBtZXRob2QsIG11bHRpcGxpZXJzIGFyZSBlcXVhbCB0byBxdWFudGl6YXRpb24KKwkgKiBjb2VmZmljaWVudHMgc2NhbGVkIGJ5IHNjYWxlZmFjdG9yW3Jvd10qc2NhbGVmYWN0b3JbY29sXSwgd2hlcmUKKwkgKiAgIHNjYWxlZmFjdG9yWzBdID0gMQorCSAqICAgc2NhbGVmYWN0b3Jba10gPSBjb3MoaypQSS8xNikgKiBzcXJ0KDIpICAgIGZvciBrPTEuLjcKKwkgKiBGb3IgaW50ZWdlciBvcGVyYXRpb24sIHRoZSBtdWx0aXBsaWVyIHRhYmxlIGlzIHRvIGJlIHNjYWxlZCBieQorCSAqIElGQVNUX1NDQUxFX0JJVFMuCisJICovCisJSUZBU1RfTVVMVF9UWVBFICogaWZtdGJsID0gKElGQVNUX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisjZGVmaW5lIENPTlNUX0JJVFMgMTQKKwlzdGF0aWMgY29uc3QgSU5UMTYgYWFuc2NhbGVzW0RDVFNJWkUyXSA9IHsKKwkgIC8qIHByZWNvbXB1dGVkIHZhbHVlcyBzY2FsZWQgdXAgYnkgMTQgYml0cyAqLworCSAgMTYzODQsIDIyNzI1LCAyMTQwNywgMTkyNjYsIDE2Mzg0LCAxMjg3MywgIDg4NjcsICA0NTIwLAorCSAgMjI3MjUsIDMxNTIxLCAyOTY5MiwgMjY3MjIsIDIyNzI1LCAxNzg1NSwgMTIyOTksICA2MjcwLAorCSAgMjE0MDcsIDI5NjkyLCAyNzk2OSwgMjUxNzIsIDIxNDA3LCAxNjgxOSwgMTE1ODUsICA1OTA2LAorCSAgMTkyNjYsIDI2NzIyLCAyNTE3MiwgMjI2NTQsIDE5MjY2LCAxNTEzNywgMTA0MjYsICA1MzE1LAorCSAgMTYzODQsIDIyNzI1LCAyMTQwNywgMTkyNjYsIDE2Mzg0LCAxMjg3MywgIDg4NjcsICA0NTIwLAorCSAgMTI4NzMsIDE3ODU1LCAxNjgxOSwgMTUxMzcsIDEyODczLCAxMDExNCwgIDY5NjcsICAzNTUyLAorCSAgIDg4NjcsIDEyMjk5LCAxMTU4NSwgMTA0MjYsICA4ODY3LCAgNjk2NywgIDQ3OTksICAyNDQ2LAorCSAgIDQ1MjAsICA2MjcwLCAgNTkwNiwgIDUzMTUsICA0NTIwLCAgMzU1MiwgIDI0NDYsICAxMjQ3CisJfTsKKwlTSElGVF9URU1QUworCisJZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKKwkgIGlmbXRibFtpXSA9IChJRkFTVF9NVUxUX1RZUEUpCisJICAgIERFU0NBTEUoTVVMVElQTFkxNlYxNigoSU5UMzIpIHF0YmwtPnF1YW50dmFsW2ldLAorCQkJCSAgKElOVDMyKSBhYW5zY2FsZXNbaV0pLAorCQkgICAgQ09OU1RfQklUUy1JRkFTVF9TQ0FMRV9CSVRTKTsKKwl9CisgICAgICB9CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKKyAgICBjYXNlIEpEQ1RfRkxPQVQ6CisgICAgICB7CisJLyogRm9yIGZsb2F0IEFBJk4gSURDVCBtZXRob2QsIG11bHRpcGxpZXJzIGFyZSBlcXVhbCB0byBxdWFudGl6YXRpb24KKwkgKiBjb2VmZmljaWVudHMgc2NhbGVkIGJ5IHNjYWxlZmFjdG9yW3Jvd10qc2NhbGVmYWN0b3JbY29sXSwgd2hlcmUKKwkgKiAgIHNjYWxlZmFjdG9yWzBdID0gMQorCSAqICAgc2NhbGVmYWN0b3Jba10gPSBjb3MoaypQSS8xNikgKiBzcXJ0KDIpICAgIGZvciBrPTEuLjcKKwkgKi8KKwlGTE9BVF9NVUxUX1RZUEUgKiBmbXRibCA9IChGTE9BVF9NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOworCWludCByb3csIGNvbDsKKwlzdGF0aWMgY29uc3QgZG91YmxlIGFhbnNjYWxlZmFjdG9yW0RDVFNJWkVdID0geworCSAgMS4wLCAxLjM4NzAzOTg0NSwgMS4zMDY1NjI5NjUsIDEuMTc1ODc1NjAyLAorCSAgMS4wLCAwLjc4NTY5NDk1OCwgMC41NDExOTYxMDAsIDAuMjc1ODk5Mzc5CisJfTsKKworCWkgPSAwOworCWZvciAocm93ID0gMDsgcm93IDwgRENUU0laRTsgcm93KyspIHsKKwkgIGZvciAoY29sID0gMDsgY29sIDwgRENUU0laRTsgY29sKyspIHsKKwkgICAgZm10YmxbaV0gPSAoRkxPQVRfTVVMVF9UWVBFKQorCSAgICAgICgoZG91YmxlKSBxdGJsLT5xdWFudHZhbFtpXSAqCisJICAgICAgIGFhbnNjYWxlZmFjdG9yW3Jvd10gKiBhYW5zY2FsZWZhY3Rvcltjb2xdKTsKKwkgICAgaSsrOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBJbml0aWFsaXplIElEQ1QgbWFuYWdlci4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X2ludmVyc2VfZGN0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9pZGN0X3B0ciBpZGN0OworICBpbnQgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgaWRjdCA9IChteV9pZGN0X3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9pZGN0X2NvbnRyb2xsZXIpKTsKKyAgY2luZm8tPmlkY3QgPSAoc3RydWN0IGpwZWdfaW52ZXJzZV9kY3QgKikgaWRjdDsKKyAgaWRjdC0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzOworCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgLyogQWxsb2NhdGUgYW5kIHByZS16ZXJvIGEgbXVsdGlwbGllciB0YWJsZSBmb3IgZWFjaCBjb21wb25lbnQgKi8KKyAgICBjb21wcHRyLT5kY3RfdGFibGUgPQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIFNJWkVPRihtdWx0aXBsaWVyX3RhYmxlKSk7CisgICAgTUVNWkVSTyhjb21wcHRyLT5kY3RfdGFibGUsIFNJWkVPRihtdWx0aXBsaWVyX3RhYmxlKSk7CisgICAgLyogTWFyayBtdWx0aXBsaWVyIHRhYmxlIG5vdCB5ZXQgc2V0IHVwIGZvciBhbnkgbWV0aG9kICovCisgICAgaWRjdC0+Y3VyX21ldGhvZFtjaV0gPSAtMTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkaHVmZi5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkaHVmZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMDQ1NGQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRodWZmLmMKQEAgLTAsMCArMSw2NTQgQEAKKy8qCisgKiBqZGh1ZmYuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIEh1ZmZtYW4gZW50cm9weSBkZWNvZGluZyByb3V0aW5lcy4KKyAqCisgKiBNdWNoIG9mIHRoZSBjb21wbGV4aXR5IGhlcmUgaGFzIHRvIGRvIHdpdGggc3VwcG9ydGluZyBpbnB1dCBzdXNwZW5zaW9uLgorICogSWYgdGhlIGRhdGEgc291cmNlIG1vZHVsZSBkZW1hbmRzIHN1c3BlbnNpb24sIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBiYWNrCisgKiB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgTUNVLiAgVG8gZG8gdGhpcywgd2UgY29weSBzdGF0ZSB2YXJpYWJsZXMKKyAqIGludG8gbG9jYWwgd29ya2luZyBzdG9yYWdlLCBhbmQgdXBkYXRlIHRoZW0gYmFjayB0byB0aGUgcGVybWFuZW50CisgKiBzdG9yYWdlIG9ubHkgdXBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgYW4gTUNVLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZGh1ZmYuaCIJCS8qIERlY2xhcmF0aW9ucyBzaGFyZWQgd2l0aCBqZHBodWZmLmMgKi8KKworI2lmZGVmIF9GWF9NQU5BR0VEX0NPREVfCisjZGVmaW5lIHNhdmFibGVfc3RhdGUJc2F2YWJsZV9zdGF0ZV9kCisjZW5kaWYKKworLyoKKyAqIEV4cGFuZGVkIGVudHJvcHkgZGVjb2RlciBvYmplY3QgZm9yIEh1ZmZtYW4gZGVjb2RpbmcuCisgKgorICogVGhlIHNhdmFibGVfc3RhdGUgc3VicmVjb3JkIGNvbnRhaW5zIGZpZWxkcyB0aGF0IGNoYW5nZSB3aXRoaW4gYW4gTUNVLAorICogYnV0IG11c3Qgbm90IGJlIHVwZGF0ZWQgcGVybWFuZW50bHkgdW50aWwgd2UgY29tcGxldGUgdGhlIE1DVS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBsYXN0X2RjX3ZhbFtNQVhfQ09NUFNfSU5fU0NBTl07IC8qIGxhc3QgREMgY29lZiBmb3IgZWFjaCBjb21wb25lbnQgKi8KK30gc2F2YWJsZV9zdGF0ZTsKKworLyogVGhpcyBtYWNybyBpcyB0byB3b3JrIGFyb3VuZCBjb21waWxlcnMgd2l0aCBtaXNzaW5nIG9yIGJyb2tlbgorICogc3RydWN0dXJlIGFzc2lnbm1lbnQuICBZb3UnbGwgbmVlZCB0byBmaXggdGhpcyBjb2RlIGlmIHlvdSBoYXZlCisgKiBzdWNoIGEgY29tcGlsZXIgYW5kIHlvdSBjaGFuZ2UgTUFYX0NPTVBTX0lOX1NDQU4uCisgKi8KKworI2lmbmRlZiBOT19TVFJVQ1RfQVNTSUdOCisjZGVmaW5lIEFTU0lHTl9TVEFURShkZXN0LHNyYykgICgoZGVzdCkgPSAoc3JjKSkKKyNlbHNlCisjaWYgTUFYX0NPTVBTX0lOX1NDQU4gPT0gNAorI2RlZmluZSBBU1NJR05fU1RBVEUoZGVzdCxzcmMpICBcCisJKChkZXN0KS5sYXN0X2RjX3ZhbFswXSA9IChzcmMpLmxhc3RfZGNfdmFsWzBdLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFsxXSA9IChzcmMpLmxhc3RfZGNfdmFsWzFdLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFsyXSA9IChzcmMpLmxhc3RfZGNfdmFsWzJdLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFszXSA9IChzcmMpLmxhc3RfZGNfdmFsWzNdKQorI2VuZGlmCisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2VudHJvcHlfZGVjb2RlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBUaGVzZSBmaWVsZHMgYXJlIGxvYWRlZCBpbnRvIGxvY2FsIHZhcmlhYmxlcyBhdCBzdGFydCBvZiBlYWNoIE1DVS4KKyAgICogSW4gY2FzZSBvZiBzdXNwZW5zaW9uLCB3ZSBleGl0IFdJVEhPVVQgdXBkYXRpbmcgdGhlbS4KKyAgICovCisgIGJpdHJlYWRfcGVybV9zdGF0ZSBiaXRzdGF0ZTsJLyogQml0IGJ1ZmZlciBhdCBzdGFydCBvZiBNQ1UgKi8KKyAgc2F2YWJsZV9zdGF0ZSBzYXZlZDsJCS8qIE90aGVyIHN0YXRlIGF0IHN0YXJ0IG9mIE1DVSAqLworCisgIC8qIFRoZXNlIGZpZWxkcyBhcmUgTk9UIGxvYWRlZCBpbnRvIGxvY2FsIHdvcmtpbmcgc3RhdGUuICovCisgIHVuc2lnbmVkIGludCByZXN0YXJ0c190b19nbzsJLyogTUNVcyBsZWZ0IGluIHRoaXMgcmVzdGFydCBpbnRlcnZhbCAqLworCisgIC8qIFBvaW50ZXJzIHRvIGRlcml2ZWQgdGFibGVzICh0aGVzZSB3b3Jrc3BhY2VzIGhhdmUgaW1hZ2UgbGlmZXNwYW4pICovCisgIGRfZGVyaXZlZF90YmwgKiBkY19kZXJpdmVkX3RibHNbTlVNX0hVRkZfVEJMU107CisgIGRfZGVyaXZlZF90YmwgKiBhY19kZXJpdmVkX3RibHNbTlVNX0hVRkZfVEJMU107CisKKyAgLyogUHJlY2FsY3VsYXRlZCBpbmZvIHNldCB1cCBieSBzdGFydF9wYXNzIGZvciB1c2UgaW4gZGVjb2RlX21jdTogKi8KKworICAvKiBQb2ludGVycyB0byBkZXJpdmVkIHRhYmxlcyB0byBiZSB1c2VkIGZvciBlYWNoIGJsb2NrIHdpdGhpbiBhbiBNQ1UgKi8KKyAgZF9kZXJpdmVkX3RibCAqIGRjX2N1cl90YmxzW0RfTUFYX0JMT0NLU19JTl9NQ1VdOworICBkX2Rlcml2ZWRfdGJsICogYWNfY3VyX3RibHNbRF9NQVhfQkxPQ0tTX0lOX01DVV07CisgIC8qIFdoZXRoZXIgd2UgY2FyZSBhYm91dCB0aGUgREMgYW5kIEFDIGNvZWZmaWNpZW50IHZhbHVlcyBmb3IgZWFjaCBibG9jayAqLworICBib29sZWFuIGRjX25lZWRlZFtEX01BWF9CTE9DS1NfSU5fTUNVXTsKKyAgYm9vbGVhbiBhY19uZWVkZWRbRF9NQVhfQkxPQ0tTX0lOX01DVV07Cit9IGh1ZmZfZW50cm9weV9kZWNvZGVyOworCit0eXBlZGVmIGh1ZmZfZW50cm9weV9kZWNvZGVyICogaHVmZl9lbnRyb3B5X3B0cjsKKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBIdWZmbWFuLWNvbXByZXNzZWQgc2Nhbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X3Bhc3NfaHVmZl9kZWNvZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBjaSwgYmxrbiwgZGN0YmwsIGFjdGJsOworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKKworICAvKiBDaGVjayB0aGF0IHRoZSBzY2FuIHBhcmFtZXRlcnMgU3MsIFNlLCBBaC9BbCBhcmUgT0sgZm9yIHNlcXVlbnRpYWwgSlBFRy4KKyAgICogVGhpcyBvdWdodCB0byBiZSBhbiBlcnJvciBjb25kaXRpb24sIGJ1dCB3ZSBtYWtlIGl0IGEgd2FybmluZyBiZWNhdXNlCisgICAqIHRoZXJlIGFyZSBzb21lIGJhc2VsaW5lIGZpbGVzIG91dCB0aGVyZSB3aXRoIGFsbCB6ZXJvZXMgaW4gdGhlc2UgYnl0ZXMuCisgICAqLworICBpZiAoY2luZm8tPlNzICE9IDAgfHwgY2luZm8tPlNlICE9IERDVFNJWkUyLTEgfHwKKyAgICAgIGNpbmZvLT5BaCAhPSAwIHx8IGNpbmZvLT5BbCAhPSAwKQorICAgIFdBUk5NUyhjaW5mbywgSldSTl9OT1RfU0VRVUVOVElBTCk7CisKKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIGRjdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOworICAgIGFjdGJsID0gY29tcHB0ci0+YWNfdGJsX25vOworICAgIC8qIENvbXB1dGUgZGVyaXZlZCB2YWx1ZXMgZm9yIEh1ZmZtYW4gdGFibGVzICovCisgICAgLyogV2UgbWF5IGRvIHRoaXMgbW9yZSB0aGFuIG9uY2UgZm9yIGEgdGFibGUsIGJ1dCBpdCdzIG5vdCBleHBlbnNpdmUgKi8KKyAgICBqcGVnX21ha2VfZF9kZXJpdmVkX3RibChjaW5mbywgVFJVRSwgZGN0YmwsCisJCQkgICAgJiBlbnRyb3B5LT5kY19kZXJpdmVkX3RibHNbZGN0YmxdKTsKKyAgICBqcGVnX21ha2VfZF9kZXJpdmVkX3RibChjaW5mbywgRkFMU0UsIGFjdGJsLAorCQkJICAgICYgZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2FjdGJsXSk7CisgICAgLyogSW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCisgICAgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldID0gMDsKKyAgfQorCisgIC8qIFByZWNhbGN1bGF0ZSBkZWNvZGluZyBpbmZvIGZvciBlYWNoIGJsb2NrIGluIGFuIE1DVSBvZiB0aGlzIHNjYW4gKi8KKyAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKKyAgICBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIC8qIFByZWNhbGN1bGF0ZSB3aGljaCB0YWJsZSB0byB1c2UgZm9yIGVhY2ggYmxvY2sgKi8KKyAgICBlbnRyb3B5LT5kY19jdXJfdGJsc1tibGtuXSA9IGVudHJvcHktPmRjX2Rlcml2ZWRfdGJsc1tjb21wcHRyLT5kY190Ymxfbm9dOworICAgIGVudHJvcHktPmFjX2N1cl90YmxzW2Jsa25dID0gZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2NvbXBwdHItPmFjX3RibF9ub107CisgICAgLyogRGVjaWRlIHdoZXRoZXIgd2UgcmVhbGx5IGNhcmUgYWJvdXQgdGhlIGNvZWZmaWNpZW50IHZhbHVlcyAqLworICAgIGlmIChjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKSB7CisgICAgICBlbnRyb3B5LT5kY19uZWVkZWRbYmxrbl0gPSBUUlVFOworICAgICAgLyogd2UgZG9uJ3QgbmVlZCB0aGUgQUNzIGlmIHByb2R1Y2luZyBhIDEvOHRoLXNpemUgaW1hZ2UgKi8KKyAgICAgIGVudHJvcHktPmFjX25lZWRlZFtibGtuXSA9IChjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUgPiAxKTsKKyAgICB9IGVsc2UgeworICAgICAgZW50cm9weS0+ZGNfbmVlZGVkW2Jsa25dID0gZW50cm9weS0+YWNfbmVlZGVkW2Jsa25dID0gRkFMU0U7CisgICAgfQorICB9CisKKyAgLyogSW5pdGlhbGl6ZSBiaXRyZWFkIHN0YXRlIHZhcmlhYmxlcyAqLworICBlbnRyb3B5LT5iaXRzdGF0ZS5iaXRzX2xlZnQgPSAwOworICBlbnRyb3B5LT5iaXRzdGF0ZS5nZXRfYnVmZmVyID0gMDsgLyogdW5uZWNlc3NhcnksIGJ1dCBrZWVwcyBQdXJpZnkgcXVpZXQgKi8KKyAgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhID0gRkFMU0U7CisKKyAgLyogSW5pdGlhbGl6ZSByZXN0YXJ0IGNvdW50ZXIgKi8KKyAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKK30KKworCisvKgorICogQ29tcHV0ZSB0aGUgZGVyaXZlZCB2YWx1ZXMgZm9yIGEgSHVmZm1hbiB0YWJsZS4KKyAqIFRoaXMgcm91dGluZSBhbHNvIHBlcmZvcm1zIHNvbWUgdmFsaWRhdGlvbiBjaGVja3Mgb24gdGhlIHRhYmxlLgorICoKKyAqIE5vdGUgdGhpcyBpcyBhbHNvIHVzZWQgYnkgamRwaHVmZi5jLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19tYWtlX2RfZGVyaXZlZF90YmwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNEQywgaW50IHRibG5vLAorCQkJIGRfZGVyaXZlZF90YmwgKiogcGR0YmwpCit7CisgIEpIVUZGX1RCTCAqaHRibDsKKyAgZF9kZXJpdmVkX3RibCAqZHRibDsKKyAgaW50IHAsIGksIGwsIF9zaSwgbnVtc3ltYm9sczsKKyAgaW50IGxvb2tiaXRzLCBjdHI7CisgIGNoYXIgaHVmZnNpemVbMjU3XTsKKyAgdW5zaWduZWQgaW50IGh1ZmZjb2RlWzI1N107CisgIHVuc2lnbmVkIGludCBjb2RlOworCisgIC8qIE5vdGUgdGhhdCBodWZmc2l6ZVtdIGFuZCBodWZmY29kZVtdIGFyZSBmaWxsZWQgaW4gY29kZS1sZW5ndGggb3JkZXIsCisgICAqIHBhcmFsbGVsaW5nIHRoZSBvcmRlciBvZiB0aGUgc3ltYm9scyB0aGVtc2VsdmVzIGluIGh0YmwtPmh1ZmZ2YWxbXS4KKyAgICovCisKKyAgLyogRmluZCB0aGUgaW5wdXQgSHVmZm1hbiB0YWJsZSAqLworICBpZiAodGJsbm8gPCAwIHx8IHRibG5vID49IE5VTV9IVUZGX1RCTFMpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fSFVGRl9UQUJMRSwgdGJsbm8pOworICBodGJsID0KKyAgICBpc0RDID8gY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbdGJsbm9dIDogY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbdGJsbm9dOworICBpZiAoaHRibCA9PSBOVUxMKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIHRibG5vKTsKKworICAvKiBBbGxvY2F0ZSBhIHdvcmtzcGFjZSBpZiB3ZSBoYXZlbid0IGFscmVhZHkgZG9uZSBzby4gKi8KKyAgaWYgKCpwZHRibCA9PSBOVUxMKQorICAgICpwZHRibCA9IChkX2Rlcml2ZWRfdGJsICopCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgU0laRU9GKGRfZGVyaXZlZF90YmwpKTsKKyAgZHRibCA9ICpwZHRibDsKKyAgZHRibC0+cHViID0gaHRibDsJCS8qIGZpbGwgaW4gYmFjayBsaW5rICovCisgIAorICAvKiBGaWd1cmUgQy4xOiBtYWtlIHRhYmxlIG9mIEh1ZmZtYW4gY29kZSBsZW5ndGggZm9yIGVhY2ggc3ltYm9sICovCisKKyAgcCA9IDA7CisgIGZvciAobCA9IDE7IGwgPD0gMTY7IGwrKykgeworICAgIGkgPSAoaW50KSBodGJsLT5iaXRzW2xdOworICAgIGlmIChpIDwgMCB8fCBwICsgaSA+IDI1NikJLyogcHJvdGVjdCBhZ2FpbnN0IHRhYmxlIG92ZXJydW4gKi8KKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0hVRkZfVEFCTEUpOworICAgIHdoaWxlIChpLS0pCisgICAgICBodWZmc2l6ZVtwKytdID0gKGNoYXIpIGw7CisgIH0KKyAgaHVmZnNpemVbcF0gPSAwOworICBudW1zeW1ib2xzID0gcDsKKyAgCisgIC8qIEZpZ3VyZSBDLjI6IGdlbmVyYXRlIHRoZSBjb2RlcyB0aGVtc2VsdmVzICovCisgIC8qIFdlIGFsc28gdmFsaWRhdGUgdGhhdCB0aGUgY291bnRzIHJlcHJlc2VudCBhIGxlZ2FsIEh1ZmZtYW4gY29kZSB0cmVlLiAqLworICAKKyAgY29kZSA9IDA7CisgIF9zaSA9IGh1ZmZzaXplWzBdOworICBwID0gMDsKKyAgd2hpbGUgKGh1ZmZzaXplW3BdKSB7CisgICAgd2hpbGUgKCgoaW50KSBodWZmc2l6ZVtwXSkgPT0gX3NpKSB7CisgICAgICBodWZmY29kZVtwKytdID0gY29kZTsKKyAgICAgIGNvZGUrKzsKKyAgICB9CisgICAgLyogY29kZSBpcyBub3cgMSBtb3JlIHRoYW4gdGhlIGxhc3QgY29kZSB1c2VkIGZvciBjb2RlbGVuZ3RoIHNpOyBidXQKKyAgICAgKiBpdCBtdXN0IHN0aWxsIGZpdCBpbiBzaSBiaXRzLCBzaW5jZSBubyBjb2RlIGlzIGFsbG93ZWQgdG8gYmUgYWxsIG9uZXMuCisgICAgICovCisgICAgaWYgKCgoSU5UMzIpIGNvZGUpID49ICgoKElOVDMyKSAxKSA8PCBfc2kpKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSFVGRl9UQUJMRSk7CisgICAgY29kZSA8PD0gMTsKKyAgICBfc2krKzsKKyAgfQorCisgIC8qIEZpZ3VyZSBGLjE1OiBnZW5lcmF0ZSBkZWNvZGluZyB0YWJsZXMgZm9yIGJpdC1zZXF1ZW50aWFsIGRlY29kaW5nICovCisKKyAgcCA9IDA7CisgIGZvciAobCA9IDE7IGwgPD0gMTY7IGwrKykgeworICAgIGlmIChodGJsLT5iaXRzW2xdKSB7CisgICAgICAvKiB2YWxvZmZzZXRbbF0gPSBodWZmdmFsW10gaW5kZXggb2YgMXN0IHN5bWJvbCBvZiBjb2RlIGxlbmd0aCBsLAorICAgICAgICogbWludXMgdGhlIG1pbmltdW0gY29kZSBvZiBsZW5ndGggbAorICAgICAgICovCisgICAgICBkdGJsLT52YWxvZmZzZXRbbF0gPSAoSU5UMzIpIHAgLSAoSU5UMzIpIGh1ZmZjb2RlW3BdOworICAgICAgcCArPSBodGJsLT5iaXRzW2xdOworICAgICAgZHRibC0+bWF4Y29kZVtsXSA9IGh1ZmZjb2RlW3AtMV07IC8qIG1heGltdW0gY29kZSBvZiBsZW5ndGggbCAqLworICAgIH0gZWxzZSB7CisgICAgICBkdGJsLT5tYXhjb2RlW2xdID0gLTE7CS8qIC0xIGlmIG5vIGNvZGVzIG9mIHRoaXMgbGVuZ3RoICovCisgICAgfQorICB9CisgIGR0YmwtPm1heGNvZGVbMTddID0gMHhGRkZGRkw7IC8qIGVuc3VyZXMganBlZ19odWZmX2RlY29kZSB0ZXJtaW5hdGVzICovCisKKyAgLyogQ29tcHV0ZSBsb29rYWhlYWQgdGFibGVzIHRvIHNwZWVkIHVwIGRlY29kaW5nLgorICAgKiBGaXJzdCB3ZSBzZXQgYWxsIHRoZSB0YWJsZSBlbnRyaWVzIHRvIDAsIGluZGljYXRpbmcgInRvbyBsb25nIjsKKyAgICogdGhlbiB3ZSBpdGVyYXRlIHRocm91Z2ggdGhlIEh1ZmZtYW4gY29kZXMgdGhhdCBhcmUgc2hvcnQgZW5vdWdoIGFuZAorICAgKiBmaWxsIGluIGFsbCB0aGUgZW50cmllcyB0aGF0IGNvcnJlc3BvbmQgdG8gYml0IHNlcXVlbmNlcyBzdGFydGluZworICAgKiB3aXRoIHRoYXQgY29kZS4KKyAgICovCisKKyAgTUVNWkVSTyhkdGJsLT5sb29rX25iaXRzLCBTSVpFT0YoZHRibC0+bG9va19uYml0cykpOworCisgIHAgPSAwOworICBmb3IgKGwgPSAxOyBsIDw9IEhVRkZfTE9PS0FIRUFEOyBsKyspIHsKKyAgICBmb3IgKGkgPSAxOyBpIDw9IChpbnQpIGh0YmwtPmJpdHNbbF07IGkrKywgcCsrKSB7CisgICAgICAvKiBsID0gY3VycmVudCBjb2RlJ3MgbGVuZ3RoLCBwID0gaXRzIGluZGV4IGluIGh1ZmZjb2RlW10gJiBodWZmdmFsW10uICovCisgICAgICAvKiBHZW5lcmF0ZSBsZWZ0LWp1c3RpZmllZCBjb2RlIGZvbGxvd2VkIGJ5IGFsbCBwb3NzaWJsZSBiaXQgc2VxdWVuY2VzICovCisgICAgICBsb29rYml0cyA9IGh1ZmZjb2RlW3BdIDw8IChIVUZGX0xPT0tBSEVBRC1sKTsKKyAgICAgIGZvciAoY3RyID0gMSA8PCAoSFVGRl9MT09LQUhFQUQtbCk7IGN0ciA+IDA7IGN0ci0tKSB7CisJZHRibC0+bG9va19uYml0c1tsb29rYml0c10gPSBsOworCWR0YmwtPmxvb2tfc3ltW2xvb2tiaXRzXSA9IGh0YmwtPmh1ZmZ2YWxbcF07CisJbG9va2JpdHMrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBWYWxpZGF0ZSBzeW1ib2xzIGFzIGJlaW5nIHJlYXNvbmFibGUuCisgICAqIEZvciBBQyB0YWJsZXMsIHdlIG1ha2Ugbm8gY2hlY2ssIGJ1dCBhY2NlcHQgYWxsIGJ5dGUgdmFsdWVzIDAuLjI1NS4KKyAgICogRm9yIERDIHRhYmxlcywgd2UgcmVxdWlyZSB0aGUgc3ltYm9scyB0byBiZSBpbiByYW5nZSAwLi4xNS4KKyAgICogKFRpZ2h0ZXIgYm91bmRzIGNvdWxkIGJlIGFwcGxpZWQgZGVwZW5kaW5nIG9uIHRoZSBkYXRhIGRlcHRoIGFuZCBtb2RlLAorICAgKiBidXQgdGhpcyBpcyBzdWZmaWNpZW50IHRvIGVuc3VyZSBzYWZlIGRlY29kaW5nLikKKyAgICovCisgIGlmIChpc0RDKSB7CisgICAgZm9yIChpID0gMDsgaSA8IG51bXN5bWJvbHM7IGkrKykgeworICAgICAgaW50IHN5bSA9IGh0YmwtPmh1ZmZ2YWxbaV07CisgICAgICBpZiAoc3ltIDwgMCB8fCBzeW0gPiAxNSkKKwlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKKyAgICB9CisgIH0KK30KKworCisvKgorICogT3V0LW9mLWxpbmUgY29kZSBmb3IgYml0IGZldGNoaW5nIChzaGFyZWQgd2l0aCBqZHBodWZmLmMpLgorICogU2VlIGpkaHVmZi5oIGZvciBpbmZvIGFib3V0IHVzYWdlLgorICogTm90ZTogY3VycmVudCB2YWx1ZXMgb2YgZ2V0X2J1ZmZlciBhbmQgYml0c19sZWZ0IGFyZSBwYXNzZWQgYXMgcGFyYW1ldGVycywKKyAqIGJ1dCBhcmUgcmV0dXJuZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRzIG9mIHRoZSBzdGF0ZSBzdHJ1Y3QuCisgKgorICogT24gbW9zdCBtYWNoaW5lcyBNSU5fR0VUX0JJVFMgc2hvdWxkIGJlIDI1IHRvIGFsbG93IHRoZSBmdWxsIDMyLWJpdCB3aWR0aAorICogb2YgZ2V0X2J1ZmZlciB0byBiZSB1c2VkLiAgKE9uIG1hY2hpbmVzIHdpdGggd2lkZXIgd29yZHMsIGFuIGV2ZW4gbGFyZ2VyCisgKiBidWZmZXIgY291bGQgYmUgdXNlZC4pICBIb3dldmVyLCBvbiBzb21lIG1hY2hpbmVzIDMyLWJpdCBzaGlmdHMgYXJlCisgKiBxdWl0ZSBzbG93IGFuZCB0YWtlIHRpbWUgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YgcGxhY2VzIHNoaWZ0ZWQuCisgKiAoVGhpcyBpcyB0cnVlIHdpdGggbW9zdCBQQyBjb21waWxlcnMsIGZvciBpbnN0YW5jZS4pICBJbiB0aGlzIGNhc2UgaXQgbWF5CisgKiBiZSBhIHdpbiB0byBzZXQgTUlOX0dFVF9CSVRTIHRvIHRoZSBtaW5pbXVtIHZhbHVlIG9mIDE1LiAgVGhpcyByZWR1Y2VzIHRoZQorICogYXZlcmFnZSBzaGlmdCBkaXN0YW5jZSBhdCB0aGUgY29zdCBvZiBtb3JlIGNhbGxzIHRvIGpwZWdfZmlsbF9iaXRfYnVmZmVyLgorICovCisKKyNpZmRlZiBTTE9XX1NISUZUXzMyCisjZGVmaW5lIE1JTl9HRVRfQklUUyAgMTUJLyogbWluaW11bSBhbGxvd2FibGUgdmFsdWUgKi8KKyNlbHNlCisjZGVmaW5lIE1JTl9HRVRfQklUUyAgKEJJVF9CVUZfU0laRS03KQorI2VuZGlmCisKKworR0xPQkFMKGJvb2xlYW4pCitqcGVnX2ZpbGxfYml0X2J1ZmZlciAoYml0cmVhZF93b3JraW5nX3N0YXRlICogc3RhdGUsCisJCSAgICAgIHJlZ2lzdGVyIGJpdF9idWZfdHlwZSBnZXRfYnVmZmVyLCByZWdpc3RlciBpbnQgYml0c19sZWZ0LAorCQkgICAgICBpbnQgbmJpdHMpCisvKiBMb2FkIHVwIHRoZSBiaXQgYnVmZmVyIHRvIGEgZGVwdGggb2YgYXQgbGVhc3QgbmJpdHMgKi8KK3sKKyAgLyogQ29weSBoZWF2aWx5IHVzZWQgc3RhdGUgZmllbGRzIGludG8gbG9jYWxzIChob3BlZnVsbHkgcmVnaXN0ZXJzKSAqLworICByZWdpc3RlciBjb25zdCBKT0NURVQgKiBuZXh0X2lucHV0X2J5dGUgPSBzdGF0ZS0+bmV4dF9pbnB1dF9ieXRlOworICByZWdpc3RlciBzaXplX3QgYnl0ZXNfaW5fYnVmZmVyID0gc3RhdGUtPmJ5dGVzX2luX2J1ZmZlcjsKKyAgal9kZWNvbXByZXNzX3B0ciBjaW5mbyA9IHN0YXRlLT5jaW5mbzsKKworICAvKiBBdHRlbXB0IHRvIGxvYWQgYXQgbGVhc3QgTUlOX0dFVF9CSVRTIGJpdHMgaW50byBnZXRfYnVmZmVyLiAqLworICAvKiAoSXQgaXMgYXNzdW1lZCB0aGF0IG5vIHJlcXVlc3Qgd2lsbCBiZSBmb3IgbW9yZSB0aGFuIHRoYXQgbWFueSBiaXRzLikgKi8KKyAgLyogV2UgZmFpbCB0byBkbyBzbyBvbmx5IGlmIHdlIGhpdCBhIG1hcmtlciBvciBhcmUgZm9yY2VkIHRvIHN1c3BlbmQuICovCisKKyAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09IDApIHsJLyogY2Fubm90IGFkdmFuY2UgcGFzdCBhIG1hcmtlciAqLworICAgIHdoaWxlIChiaXRzX2xlZnQgPCBNSU5fR0VUX0JJVFMpIHsKKyAgICAgIHJlZ2lzdGVyIGludCBjOworCisgICAgICAvKiBBdHRlbXB0IHRvIHJlYWQgYSBieXRlICovCisgICAgICBpZiAoYnl0ZXNfaW5fYnVmZmVyID09IDApIHsKKwlpZiAoISAoKmNpbmZvLT5zcmMtPmZpbGxfaW5wdXRfYnVmZmVyKSAoY2luZm8pKQorCSAgcmV0dXJuIEZBTFNFOworCW5leHRfaW5wdXRfYnl0ZSA9IGNpbmZvLT5zcmMtPm5leHRfaW5wdXRfYnl0ZTsKKwlieXRlc19pbl9idWZmZXIgPSBjaW5mby0+c3JjLT5ieXRlc19pbl9idWZmZXI7CisgICAgICB9CisgICAgICBieXRlc19pbl9idWZmZXItLTsKKyAgICAgIGMgPSBHRVRKT0NURVQoKm5leHRfaW5wdXRfYnl0ZSsrKTsKKworICAgICAgLyogSWYgaXQncyAweEZGLCBjaGVjayBhbmQgZGlzY2FyZCBzdHVmZmVkIHplcm8gYnl0ZSAqLworICAgICAgaWYgKGMgPT0gMHhGRikgeworCS8qIExvb3AgaGVyZSB0byBkaXNjYXJkIGFueSBwYWRkaW5nIEZGJ3Mgb24gdGVybWluYXRpbmcgbWFya2VyLAorCSAqIHNvIHRoYXQgd2UgY2FuIHNhdmUgYSB2YWxpZCB1bnJlYWRfbWFya2VyIHZhbHVlLiAgTk9URTogd2Ugd2lsbAorCSAqIGFjY2VwdCBtdWx0aXBsZSBGRidzIGZvbGxvd2VkIGJ5IGEgMCBhcyBtZWFuaW5nIGEgc2luZ2xlIEZGIGRhdGEKKwkgKiBieXRlLiAgVGhpcyBkYXRhIHBhdHRlcm4gaXMgbm90IHZhbGlkIGFjY29yZGluZyB0byB0aGUgc3RhbmRhcmQuCisJICovCisJZG8geworCSAgaWYgKGJ5dGVzX2luX2J1ZmZlciA9PSAwKSB7CisJICAgIGlmICghICgqY2luZm8tPnNyYy0+ZmlsbF9pbnB1dF9idWZmZXIpIChjaW5mbykpCisJICAgICAgcmV0dXJuIEZBTFNFOworCSAgICBuZXh0X2lucHV0X2J5dGUgPSBjaW5mby0+c3JjLT5uZXh0X2lucHV0X2J5dGU7CisJICAgIGJ5dGVzX2luX2J1ZmZlciA9IGNpbmZvLT5zcmMtPmJ5dGVzX2luX2J1ZmZlcjsKKwkgIH0KKwkgIGJ5dGVzX2luX2J1ZmZlci0tOworCSAgYyA9IEdFVEpPQ1RFVCgqbmV4dF9pbnB1dF9ieXRlKyspOworCX0gd2hpbGUgKGMgPT0gMHhGRik7CisKKwlpZiAoYyA9PSAwKSB7CisJICAvKiBGb3VuZCBGRi8wMCwgd2hpY2ggcmVwcmVzZW50cyBhbiBGRiBkYXRhIGJ5dGUgKi8KKwkgIGMgPSAweEZGOworCX0gZWxzZSB7CisJICAvKiBPb3BzLCBpdCdzIGFjdHVhbGx5IGEgbWFya2VyIGluZGljYXRpbmcgZW5kIG9mIGNvbXByZXNzZWQgZGF0YS4KKwkgICAqIFNhdmUgdGhlIG1hcmtlciBjb2RlIGZvciBsYXRlciB1c2UuCisJICAgKiBGaW5lIHBvaW50OiBpdCBtaWdodCBhcHBlYXIgdGhhdCB3ZSBzaG91bGQgc2F2ZSB0aGUgbWFya2VyIGludG8KKwkgICAqIGJpdHJlYWQgd29ya2luZyBzdGF0ZSwgbm90IHN0cmFpZ2h0IGludG8gcGVybWFuZW50IHN0YXRlLiAgQnV0CisJICAgKiBvbmNlIHdlIGhhdmUgaGl0IGEgbWFya2VyLCB3ZSBjYW5ub3QgbmVlZCB0byBzdXNwZW5kIHdpdGhpbiB0aGUKKwkgICAqIGN1cnJlbnQgTUNVLCBiZWNhdXNlIHdlIHdpbGwgcmVhZCBubyBtb3JlIGJ5dGVzIGZyb20gdGhlIGRhdGEKKwkgICAqIHNvdXJjZS4gIFNvIGl0IGlzIE9LIHRvIHVwZGF0ZSBwZXJtYW5lbnQgc3RhdGUgcmlnaHQgYXdheS4KKwkgICAqLworCSAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSBjOworCSAgLyogU2VlIGlmIHdlIG5lZWQgdG8gaW5zZXJ0IHNvbWUgZmFrZSB6ZXJvIGJpdHMuICovCisJICBnb3RvIG5vX21vcmVfYnl0ZXM7CisJfQorICAgICAgfQorCisgICAgICAvKiBPSywgbG9hZCBjIGludG8gZ2V0X2J1ZmZlciAqLworICAgICAgZ2V0X2J1ZmZlciA9IChnZXRfYnVmZmVyIDw8IDgpIHwgYzsKKyAgICAgIGJpdHNfbGVmdCArPSA4OworICAgIH0gLyogZW5kIHdoaWxlICovCisgIH0gZWxzZSB7CisgIG5vX21vcmVfYnl0ZXM6CisgICAgLyogV2UgZ2V0IGhlcmUgaWYgd2UndmUgcmVhZCB0aGUgbWFya2VyIHRoYXQgdGVybWluYXRlcyB0aGUgY29tcHJlc3NlZAorICAgICAqIGRhdGEgc2VnbWVudC4gIFRoZXJlIHNob3VsZCBiZSBlbm91Z2ggYml0cyBpbiB0aGUgYnVmZmVyIHJlZ2lzdGVyCisgICAgICogdG8gc2F0aXNmeSB0aGUgcmVxdWVzdDsgaWYgc28sIG5vIHByb2JsZW0uCisgICAgICovCisgICAgaWYgKG5iaXRzID4gYml0c19sZWZ0KSB7CisgICAgICAvKiBVaC1vaC4gIFJlcG9ydCBjb3JydXB0ZWQgZGF0YSB0byB1c2VyIGFuZCBzdHVmZiB6ZXJvZXMgaW50bworICAgICAgICogdGhlIGRhdGEgc3RyZWFtLCBzbyB0aGF0IHdlIGNhbiBwcm9kdWNlIHNvbWUga2luZCBvZiBpbWFnZS4KKyAgICAgICAqIFdlIHVzZSBhIG5vbnZvbGF0aWxlIGZsYWcgdG8gZW5zdXJlIHRoYXQgb25seSBvbmUgd2FybmluZyBtZXNzYWdlCisgICAgICAgKiBhcHBlYXJzIHBlciBkYXRhIHNlZ21lbnQuCisgICAgICAgKi8KKyAgICAgIGlmICghIGNpbmZvLT5lbnRyb3B5LT5pbnN1ZmZpY2llbnRfZGF0YSkgeworCVdBUk5NUyhjaW5mbywgSldSTl9ISVRfTUFSS0VSKTsKKwljaW5mby0+ZW50cm9weS0+aW5zdWZmaWNpZW50X2RhdGEgPSBUUlVFOworICAgICAgfQorICAgICAgLyogRmlsbCB0aGUgYnVmZmVyIHdpdGggemVybyBiaXRzICovCisgICAgICBnZXRfYnVmZmVyIDw8PSBNSU5fR0VUX0JJVFMgLSBiaXRzX2xlZnQ7CisgICAgICBiaXRzX2xlZnQgPSBNSU5fR0VUX0JJVFM7CisgICAgfQorICB9CisKKyAgLyogVW5sb2FkIHRoZSBsb2NhbCByZWdpc3RlcnMgKi8KKyAgc3RhdGUtPm5leHRfaW5wdXRfYnl0ZSA9IG5leHRfaW5wdXRfYnl0ZTsKKyAgc3RhdGUtPmJ5dGVzX2luX2J1ZmZlciA9IGJ5dGVzX2luX2J1ZmZlcjsKKyAgc3RhdGUtPmdldF9idWZmZXIgPSBnZXRfYnVmZmVyOworICBzdGF0ZS0+Yml0c19sZWZ0ID0gYml0c19sZWZ0OworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBPdXQtb2YtbGluZSBjb2RlIGZvciBIdWZmbWFuIGNvZGUgZGVjb2RpbmcuCisgKiBTZWUgamRodWZmLmggZm9yIGluZm8gYWJvdXQgdXNhZ2UuCisgKi8KKworR0xPQkFMKGludCkKK2pwZWdfaHVmZl9kZWNvZGUgKGJpdHJlYWRfd29ya2luZ19zdGF0ZSAqIHN0YXRlLAorCQkgIHJlZ2lzdGVyIGJpdF9idWZfdHlwZSBnZXRfYnVmZmVyLCByZWdpc3RlciBpbnQgYml0c19sZWZ0LAorCQkgIGRfZGVyaXZlZF90YmwgKiBodGJsLCBpbnQgbWluX2JpdHMpCit7CisgIHJlZ2lzdGVyIGludCBsID0gbWluX2JpdHM7CisgIHJlZ2lzdGVyIElOVDMyIGNvZGU7CisKKyAgLyogSFVGRl9ERUNPREUgaGFzIGRldGVybWluZWQgdGhhdCB0aGUgY29kZSBpcyBhdCBsZWFzdCBtaW5fYml0cyAqLworICAvKiBiaXRzIGxvbmcsIHNvIGZldGNoIHRoYXQgbWFueSBiaXRzIGluIG9uZSBzd29vcC4gKi8KKworICBDSEVDS19CSVRfQlVGRkVSKCpzdGF0ZSwgbCwgcmV0dXJuIC0xKTsKKyAgY29kZSA9IEdFVF9CSVRTKGwpOworCisgIC8qIENvbGxlY3QgdGhlIHJlc3Qgb2YgdGhlIEh1ZmZtYW4gY29kZSBvbmUgYml0IGF0IGEgdGltZS4gKi8KKyAgLyogVGhpcyBpcyBwZXIgRmlndXJlIEYuMTYgaW4gdGhlIEpQRUcgc3BlYy4gKi8KKworICB3aGlsZSAoY29kZSA+IGh0YmwtPm1heGNvZGVbbF0pIHsKKyAgICBjb2RlIDw8PSAxOworICAgIENIRUNLX0JJVF9CVUZGRVIoKnN0YXRlLCAxLCByZXR1cm4gLTEpOworICAgIGNvZGUgfD0gR0VUX0JJVFMoMSk7CisgICAgbCsrOworICB9CisKKyAgLyogVW5sb2FkIHRoZSBsb2NhbCByZWdpc3RlcnMgKi8KKyAgc3RhdGUtPmdldF9idWZmZXIgPSBnZXRfYnVmZmVyOworICBzdGF0ZS0+Yml0c19sZWZ0ID0gYml0c19sZWZ0OworCisgIC8qIFdpdGggZ2FyYmFnZSBpbnB1dCB3ZSBtYXkgcmVhY2ggdGhlIHNlbnRpbmVsIHZhbHVlIGwgPSAxNy4gKi8KKworICBpZiAobCA+IDE2KSB7CisgICAgV0FSTk1TKHN0YXRlLT5jaW5mbywgSldSTl9IVUZGX0JBRF9DT0RFKTsKKyAgICByZXR1cm4gMDsJCQkvKiBmYWtlIGEgemVybyBhcyB0aGUgc2FmZXN0IHJlc3VsdCAqLworICB9CisKKyAgcmV0dXJuIGh0YmwtPnB1Yi0+aHVmZnZhbFsgKGludCkgKGNvZGUgKyBodGJsLT52YWxvZmZzZXRbbF0pIF07Cit9CisKKworLyoKKyAqIEZpZ3VyZSBGLjEyOiBleHRlbmQgc2lnbiBiaXQuCisgKiBPbiBzb21lIG1hY2hpbmVzLCBhIHNoaWZ0IGFuZCBhZGQgd2lsbCBiZSBmYXN0ZXIgdGhhbiBhIHRhYmxlIGxvb2t1cC4KKyAqLworCisjaWZkZWYgQVZPSURfVEFCTEVTCisKKyNkZWZpbmUgSFVGRl9FWFRFTkQoeCxzKSAgKCh4KSA8ICgxPDwoKHMpLTEpKSA/ICh4KSArICgoKC0xKTw8KHMpKSArIDEpIDogKHgpKQorCisjZWxzZQorCisjZGVmaW5lIEhVRkZfRVhURU5EKHgscykgICgoeCkgPCBleHRlbmRfdGVzdFtzXSA/ICh4KSArIGV4dGVuZF9vZmZzZXRbc10gOiAoeCkpCisKK3N0YXRpYyBjb25zdCBpbnQgZXh0ZW5kX3Rlc3RbMTZdID0gICAvKiBlbnRyeSBuIGlzIDIqKihuLTEpICovCisgIHsgMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwNCwgMHgwMDA4LCAweDAwMTAsIDB4MDAyMCwgMHgwMDQwLCAweDAwODAsCisgICAgMHgwMTAwLCAweDAyMDAsIDB4MDQwMCwgMHgwODAwLCAweDEwMDAsIDB4MjAwMCwgMHg0MDAwIH07CisKK3N0YXRpYyBjb25zdCBpbnQgZXh0ZW5kX29mZnNldFsxNl0gPSAvKiBlbnRyeSBuIGlzICgtMSA8PCBuKSArIDEgKi8KKyAgeyAwLCAoKC0xKTw8MSkgKyAxLCAoKC0xKTw8MikgKyAxLCAoKC0xKTw8MykgKyAxLCAoKC0xKTw8NCkgKyAxLAorICAgICgoLTEpPDw1KSArIDEsICgoLTEpPDw2KSArIDEsICgoLTEpPDw3KSArIDEsICgoLTEpPDw4KSArIDEsCisgICAgKCgtMSk8PDkpICsgMSwgKCgtMSk8PDEwKSArIDEsICgoLTEpPDwxMSkgKyAxLCAoKC0xKTw8MTIpICsgMSwKKyAgICAoKC0xKTw8MTMpICsgMSwgKCgtMSk8PDE0KSArIDEsICgoLTEpPDwxNSkgKyAxIH07CisKKyNlbmRpZiAvKiBBVk9JRF9UQUJMRVMgKi8KKworCisvKgorICogQ2hlY2sgZm9yIGEgcmVzdGFydCBtYXJrZXIgJiByZXN5bmNocm9uaXplIGRlY29kZXIuCisgKiBSZXR1cm5zIEZBTFNFIGlmIG11c3Qgc3VzcGVuZC4KKyAqLworCitMT0NBTChib29sZWFuKQorcHJvY2Vzc19yZXN0YXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBjaTsKKworICAvKiBUaHJvdyBhd2F5IGFueSB1bnVzZWQgYml0cyByZW1haW5pbmcgaW4gYml0IGJ1ZmZlcjsgKi8KKyAgLyogaW5jbHVkZSBhbnkgZnVsbCBieXRlcyBpbiBuZXh0X21hcmtlcidzIGNvdW50IG9mIGRpc2NhcmRlZCBieXRlcyAqLworICBjaW5mby0+bWFya2VyLT5kaXNjYXJkZWRfYnl0ZXMgKz0gZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0IC8gODsKKyAgZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0ID0gMDsKKworICAvKiBBZHZhbmNlIHBhc3QgdGhlIFJTVG4gbWFya2VyICovCisgIGlmICghICgqY2luZm8tPm1hcmtlci0+cmVhZF9yZXN0YXJ0X21hcmtlcikgKGNpbmZvKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogUmUtaW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKQorICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IDA7CisKKyAgLyogUmVzZXQgcmVzdGFydCBjb3VudGVyICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisKKyAgLyogUmVzZXQgb3V0LW9mLWRhdGEgZmxhZywgdW5sZXNzIHJlYWRfcmVzdGFydF9tYXJrZXIgbGVmdCB1cyBzbWFjayB1cAorICAgKiBhZ2FpbnN0IGEgbWFya2VyLiAgSW4gdGhhdCBjYXNlIHdlIHdpbGwgZW5kIHVwIHRyZWF0aW5nIHRoZSBuZXh0IGRhdGEKKyAgICogc2VnbWVudCBhcyBlbXB0eSwgYW5kIHdlIGNhbiBhdm9pZCBwcm9kdWNpbmcgYm9ndXMgb3V0cHV0IHBpeGVscyBieQorICAgKiBsZWF2aW5nIHRoZSBmbGFnIHNldC4KKyAgICovCisgIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PSAwKQorICAgIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSA9IEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBEZWNvZGUgYW5kIHJldHVybiBvbmUgTUNVJ3Mgd29ydGggb2YgSHVmZm1hbi1jb21wcmVzc2VkIGNvZWZmaWNpZW50cy4KKyAqIFRoZSBjb2VmZmljaWVudHMgYXJlIHJlb3JkZXJlZCBmcm9tIHppZ3phZyBvcmRlciBpbnRvIG5hdHVyYWwgYXJyYXkgb3JkZXIsCisgKiBidXQgYXJlIG5vdCBkZXF1YW50aXplZC4KKyAqCisgKiBUaGUgaSd0aCBibG9jayBvZiB0aGUgTUNVIGlzIHN0b3JlZCBpbnRvIHRoZSBibG9jayBwb2ludGVkIHRvIGJ5CisgKiBNQ1VfZGF0YVtpXS4gIFdFIEFTU1VNRSBUSElTIEFSRUEgSEFTIEJFRU4gWkVST0VEIEJZIFRIRSBDQUxMRVIuCisgKiAoV2hvbGVzYWxlIHplcm9pbmcgaXMgdXN1YWxseSBhIGxpdHRsZSBmYXN0ZXIgdGhhbiByZXRhaWwuLi4pCisgKgorICogUmV0dXJucyBGQUxTRSBpZiBkYXRhIHNvdXJjZSByZXF1ZXN0ZWQgc3VzcGVuc2lvbi4gIEluIHRoYXQgY2FzZSBubworICogY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0byBwZXJtYW5lbnQgc3RhdGUuICAoRXhjZXB0aW9uOiBzb21lIG91dHB1dAorICogY29lZmZpY2llbnRzIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBhc3NpZ25lZC4gIFRoaXMgaXMgaGFybWxlc3MgZm9yCisgKiB0aGlzIG1vZHVsZSwgc2luY2Ugd2UnbGwganVzdCByZS1hc3NpZ24gdGhlbSBvbiB0aGUgbmV4dCBjYWxsLikKKyAqLworCitNRVRIT0RERUYoYm9vbGVhbikKK2RlY29kZV9tY3UgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCit7CisgIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgaW50IGJsa247CisgIEJJVFJFQURfU1RBVEVfVkFSUzsKKyAgc2F2YWJsZV9zdGF0ZSBzdGF0ZTsKKworICAvKiBQcm9jZXNzIHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZDsgbWF5IGhhdmUgdG8gc3VzcGVuZCAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKKyAgICAgIGlmICghIHByb2Nlc3NfcmVzdGFydChjaW5mbykpCisJcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogSWYgd2UndmUgcnVuIG91dCBvZiBkYXRhLCBqdXN0IGxlYXZlIHRoZSBNQ1Ugc2V0IHRvIHplcm9lcy4KKyAgICogVGhpcyB3YXksIHdlIHJldHVybiB1bmlmb3JtIGdyYXkgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHNlZ21lbnQuCisgICAqLworICBpZiAoISBlbnRyb3B5LT5wdWIuaW5zdWZmaWNpZW50X2RhdGEpIHsKKworICAgIC8qIExvYWQgdXAgd29ya2luZyBzdGF0ZSAqLworICAgIEJJVFJFQURfTE9BRF9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7CisgICAgQVNTSUdOX1NUQVRFKHN0YXRlLCBlbnRyb3B5LT5zYXZlZCk7CisKKyAgICAvKiBPdXRlciBsb29wIGhhbmRsZXMgZWFjaCBibG9jayBpbiB0aGUgTUNVICovCisKKyAgICBmb3IgKGJsa24gPSAwOyBibGtuIDwgY2luZm8tPmJsb2Nrc19pbl9NQ1U7IGJsa24rKykgeworICAgICAgSkJMT0NLUk9XIGJsb2NrID0gTUNVX2RhdGFbYmxrbl07CisgICAgICBkX2Rlcml2ZWRfdGJsICogZGN0YmwgPSBlbnRyb3B5LT5kY19jdXJfdGJsc1tibGtuXTsKKyAgICAgIGRfZGVyaXZlZF90YmwgKiBhY3RibCA9IGVudHJvcHktPmFjX2N1cl90YmxzW2Jsa25dOworICAgICAgcmVnaXN0ZXIgaW50IHMsIGssIHI7CisKKyAgICAgIC8qIERlY29kZSBhIHNpbmdsZSBibG9jaydzIHdvcnRoIG9mIGNvZWZmaWNpZW50cyAqLworCisgICAgICAvKiBTZWN0aW9uIEYuMi4yLjE6IGRlY29kZSB0aGUgREMgY29lZmZpY2llbnQgZGlmZmVyZW5jZSAqLworICAgICAgSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIGRjdGJsLCByZXR1cm4gRkFMU0UsIGxhYmVsMSk7CisgICAgICBpZiAocykgeworCUNIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHMsIHJldHVybiBGQUxTRSk7CisJciA9IEdFVF9CSVRTKHMpOworCXMgPSBIVUZGX0VYVEVORChyLCBzKTsKKyAgICAgIH0KKworICAgICAgaWYgKGVudHJvcHktPmRjX25lZWRlZFtibGtuXSkgeworCS8qIENvbnZlcnQgREMgZGlmZmVyZW5jZSB0byBhY3R1YWwgdmFsdWUsIHVwZGF0ZSBsYXN0X2RjX3ZhbCAqLworCWludCBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKKwlzICs9IHN0YXRlLmxhc3RfZGNfdmFsW2NpXTsKKwlzdGF0ZS5sYXN0X2RjX3ZhbFtjaV0gPSBzOworCS8qIE91dHB1dCB0aGUgREMgY29lZmZpY2llbnQgKGFzc3VtZXMganBlZ19uYXR1cmFsX29yZGVyWzBdID0gMCkgKi8KKwkoKmJsb2NrKVswXSA9IChKQ09FRikgczsKKyAgICAgIH0KKworICAgICAgaWYgKGVudHJvcHktPmFjX25lZWRlZFtibGtuXSkgeworCisJLyogU2VjdGlvbiBGLjIuMi4yOiBkZWNvZGUgdGhlIEFDIGNvZWZmaWNpZW50cyAqLworCS8qIFNpbmNlIHplcm9lcyBhcmUgc2tpcHBlZCwgb3V0cHV0IGFyZWEgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZWhhbmQgKi8KKwlmb3IgKGsgPSAxOyBrIDwgRENUU0laRTI7IGsrKykgeworCSAgSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIGFjdGJsLCByZXR1cm4gRkFMU0UsIGxhYmVsMik7CisgICAgICAKKwkgIHIgPSBzID4+IDQ7CisJICBzICY9IDE1OworICAgICAgCisJICBpZiAocykgeworCSAgICBrICs9IHI7CisJICAgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHMsIHJldHVybiBGQUxTRSk7CisJICAgIHIgPSBHRVRfQklUUyhzKTsKKwkgICAgcyA9IEhVRkZfRVhURU5EKHIsIHMpOworCSAgICAvKiBPdXRwdXQgY29lZmZpY2llbnQgaW4gbmF0dXJhbCAoZGV6aWd6YWdnZWQpIG9yZGVyLgorCSAgICAgKiBOb3RlOiB0aGUgZXh0cmEgZW50cmllcyBpbiBqcGVnX25hdHVyYWxfb3JkZXJbXSB3aWxsIHNhdmUgdXMKKwkgICAgICogaWYgayA+PSBEQ1RTSVpFMiwgd2hpY2ggY291bGQgaGFwcGVuIGlmIHRoZSBkYXRhIGlzIGNvcnJ1cHRlZC4KKwkgICAgICovCisJICAgICgqYmxvY2spW2pwZWdfbmF0dXJhbF9vcmRlcltrXV0gPSAoSkNPRUYpIHM7CisJICB9IGVsc2UgeworCSAgICBpZiAociAhPSAxNSkKKwkgICAgICBicmVhazsKKwkgICAgayArPSAxNTsKKwkgIH0KKwl9CisKKyAgICAgIH0gZWxzZSB7CisKKwkvKiBTZWN0aW9uIEYuMi4yLjI6IGRlY29kZSB0aGUgQUMgY29lZmZpY2llbnRzICovCisJLyogSW4gdGhpcyBwYXRoIHdlIGp1c3QgZGlzY2FyZCB0aGUgdmFsdWVzICovCisJZm9yIChrID0gMTsgayA8IERDVFNJWkUyOyBrKyspIHsKKwkgIEhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCBhY3RibCwgcmV0dXJuIEZBTFNFLCBsYWJlbDMpOworICAgICAgCisJICByID0gcyA+PiA0OworCSAgcyAmPSAxNTsKKyAgICAgIAorCSAgaWYgKHMpIHsKKwkgICAgayArPSByOworCSAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOworCSAgICBEUk9QX0JJVFMocyk7CisJICB9IGVsc2UgeworCSAgICBpZiAociAhPSAxNSkKKwkgICAgICBicmVhazsKKwkgICAgayArPSAxNTsKKwkgIH0KKwl9CisKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDb21wbGV0ZWQgTUNVLCBzbyB1cGRhdGUgc3RhdGUgKi8KKyAgICBCSVRSRUFEX1NBVkVfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOworICAgIEFTU0lHTl9TVEFURShlbnRyb3B5LT5zYXZlZCwgc3RhdGUpOworICB9CisKKyAgLyogQWNjb3VudCBmb3IgcmVzdGFydCBpbnRlcnZhbCAobm8tb3AgaWYgbm90IHVzaW5nIHJlc3RhcnRzKSAqLworICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgSHVmZm1hbiBlbnRyb3B5IGRlY29kaW5nLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfaHVmZl9kZWNvZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHk7CisgIGludCBpOworCisgIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihodWZmX2VudHJvcHlfZGVjb2RlcikpOworICBjaW5mby0+ZW50cm9weSA9IChzdHJ1Y3QganBlZ19lbnRyb3B5X2RlY29kZXIgKikgZW50cm9weTsKKyAgZW50cm9weS0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX2h1ZmZfZGVjb2RlcjsKKyAgZW50cm9weS0+cHViLmRlY29kZV9tY3UgPSBkZWNvZGVfbWN1OworCisgIC8qIE1hcmsgdGFibGVzIHVuYWxsb2NhdGVkICovCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fSFVGRl9UQkxTOyBpKyspIHsKKyAgICBlbnRyb3B5LT5kY19kZXJpdmVkX3RibHNbaV0gPSBlbnRyb3B5LT5hY19kZXJpdmVkX3RibHNbaV0gPSBOVUxMOworICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRpbnB1dC5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkaW5wdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzJhYzhmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkaW5wdXQuYwpAQCAtMCwwICsxLDM4MSBAQAorLyoKKyAqIGpkaW5wdXQuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGlucHV0IGNvbnRyb2wgbG9naWMgZm9yIHRoZSBKUEVHIGRlY29tcHJlc3Nvci4KKyAqIFRoZXNlIHJvdXRpbmVzIGFyZSBjb25jZXJuZWQgd2l0aCBjb250cm9sbGluZyB0aGUgZGVjb21wcmVzc29yJ3MgaW5wdXQKKyAqIHByb2Nlc3NpbmcgKG1hcmtlciByZWFkaW5nIGFuZCBjb2VmZmljaWVudCBkZWNvZGluZykuICBUaGUgYWN0dWFsIGlucHV0CisgKiByZWFkaW5nIGlzIGRvbmUgaW4gamRtYXJrZXIuYywgamRodWZmLmMsIGFuZCBqZHBodWZmLmMuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIFByaXZhdGUgc3RhdGUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19pbnB1dF9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIGJvb2xlYW4gaW5oZWFkZXJzOwkJLyogVFJVRSB1bnRpbCBmaXJzdCBTT1MgaXMgcmVhY2hlZCAqLworfSBteV9pbnB1dF9jb250cm9sbGVyOworCit0eXBlZGVmIG15X2lucHV0X2NvbnRyb2xsZXIgKiBteV9pbnB1dGN0bF9wdHI7CisKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK01FVEhPRERFRihpbnQpIGNvbnN1bWVfbWFya2VycyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKworCisvKgorICogUm91dGluZXMgdG8gY2FsY3VsYXRlIHZhcmlvdXMgcXVhbnRpdGllcyByZWxhdGVkIHRvIHRoZSBzaXplIG9mIHRoZSBpbWFnZS4KKyAqLworCitMT0NBTCh2b2lkKQoraW5pdGlhbF9zZXR1cCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIENhbGxlZCBvbmNlLCB3aGVuIGZpcnN0IFNPUyBtYXJrZXIgaXMgcmVhY2hlZCAqLworeworICBpbnQgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgLyogTWFrZSBzdXJlIGltYWdlIGlzbid0IGJpZ2dlciB0aGFuIEkgY2FuIGhhbmRsZSAqLworICBpZiAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgPiAobG9uZykgSlBFR19NQVhfRElNRU5TSU9OIHx8CisgICAgICAobG9uZykgY2luZm8tPmltYWdlX3dpZHRoID4gKGxvbmcpIEpQRUdfTUFYX0RJTUVOU0lPTikKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9JTUFHRV9UT09fQklHLCAodW5zaWduZWQgaW50KSBKUEVHX01BWF9ESU1FTlNJT04pOworCisgIC8qIEZvciBub3csIHByZWNpc2lvbiBtdXN0IG1hdGNoIGNvbXBpbGVkLWluIHZhbHVlLi4uICovCisgIGlmIChjaW5mby0+ZGF0YV9wcmVjaXNpb24gIT0gQklUU19JTl9KU0FNUExFKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QUkVDSVNJT04sIGNpbmZvLT5kYXRhX3ByZWNpc2lvbik7CisKKyAgLyogQ2hlY2sgdGhhdCBudW1iZXIgb2YgY29tcG9uZW50cyB3b24ndCBleGNlZWQgaW50ZXJuYWwgYXJyYXkgc2l6ZXMgKi8KKyAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyA+IE1BWF9DT01QT05FTlRTKQorICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0NPTVBPTkVOVF9DT1VOVCwgY2luZm8tPm51bV9jb21wb25lbnRzLAorCSAgICAgTUFYX0NPTVBPTkVOVFMpOworCisgIC8qIENvbXB1dGUgbWF4aW11bSBzYW1wbGluZyBmYWN0b3JzOyBjaGVjayBmYWN0b3IgdmFsaWRpdHkgKi8KKyAgY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yID0gMTsKKyAgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yID0gMTsKKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICBpZiAoY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcjw9MCB8fCBjb21wcHRyLT5oX3NhbXBfZmFjdG9yPk1BWF9TQU1QX0ZBQ1RPUiB8fAorCWNvbXBwdHItPnZfc2FtcF9mYWN0b3I8PTAgfHwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcj5NQVhfU0FNUF9GQUNUT1IpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9TQU1QTElORyk7CisgICAgY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yID0gTUFYKGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciwKKwkJCQkgICBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKTsKKyAgICBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgPSBNQVgoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yLAorCQkJCSAgIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOworICB9CisKKyAgLyogV2UgaW5pdGlhbGl6ZSBEQ1Rfc2NhbGVkX3NpemUgYW5kIG1pbl9EQ1Rfc2NhbGVkX3NpemUgdG8gRENUU0laRS4KKyAgICogSW4gdGhlIGZ1bGwgZGVjb21wcmVzc29yLCB0aGlzIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBqZG1hc3Rlci5jOworICAgKiBidXQgaW4gdGhlIHRyYW5zY29kZXIsIGpkbWFzdGVyLmMgaXMgbm90IHVzZWQsIHNvIHdlIG11c3QgZG8gaXQgaGVyZS4KKyAgICovCisgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplID0gRENUU0laRTsKKworICAvKiBDb21wdXRlIGRpbWVuc2lvbnMgb2YgY29tcG9uZW50cyAqLworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSA9IERDVFNJWkU7CisgICAgLyogU2l6ZSBpbiBEQ1QgYmxvY2tzICovCisgICAgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggKiAobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwKKwkJICAgIChsb25nKSAoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSkpOworICAgIGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgKiAobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKKwkJICAgIChsb25nKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSkpOworICAgIC8qIGRvd25zYW1wbGVkX3dpZHRoIGFuZCBkb3duc2FtcGxlZF9oZWlnaHQgd2lsbCBhbHNvIGJlIG92ZXJyaWRkZW4gYnkKKyAgICAgKiBqZG1hc3Rlci5jIGlmIHdlIGFyZSBkb2luZyBmdWxsIGRlY29tcHJlc3Npb24uICBUaGUgdHJhbnNjb2RlciBsaWJyYXJ5CisgICAgICogZG9lc24ndCB1c2UgdGhlc2UgdmFsdWVzLCBidXQgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24gbWlnaHQuCisgICAgICovCisgICAgLyogU2l6ZSBpbiBzYW1wbGVzICovCisgICAgY29tcHB0ci0+ZG93bnNhbXBsZWRfd2lkdGggPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCAqIChsb25nKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yLAorCQkgICAgKGxvbmcpIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3Rvcik7CisgICAgY29tcHB0ci0+ZG93bnNhbXBsZWRfaGVpZ2h0ID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ICogKGxvbmcpIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCisJCSAgICAobG9uZykgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKTsKKyAgICAvKiBNYXJrIGNvbXBvbmVudCBuZWVkZWQsIHVudGlsIGNvbG9yIGNvbnZlcnNpb24gc2F5cyBvdGhlcndpc2UgKi8KKyAgICBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkID0gVFJVRTsKKyAgICAvKiBNYXJrIG5vIHF1YW50aXphdGlvbiB0YWJsZSB5ZXQgc2F2ZWQgZm9yIGNvbXBvbmVudCAqLworICAgIGNvbXBwdHItPnF1YW50X3RhYmxlID0gTlVMTDsKKyAgfQorCisgIC8qIENvbXB1dGUgbnVtYmVyIG9mIGZ1bGx5IGludGVybGVhdmVkIE1DVSByb3dzLiAqLworICBjaW5mby0+dG90YWxfaU1DVV9yb3dzID0gKEpESU1FTlNJT04pCisgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCwKKwkJICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcipEQ1RTSVpFKSk7CisKKyAgLyogRGVjaWRlIHdoZXRoZXIgZmlsZSBjb250YWlucyBtdWx0aXBsZSBzY2FucyAqLworICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gPCBjaW5mby0+bnVtX2NvbXBvbmVudHMgfHwgY2luZm8tPnByb2dyZXNzaXZlX21vZGUpCisgICAgY2luZm8tPmlucHV0Y3RsLT5oYXNfbXVsdGlwbGVfc2NhbnMgPSBUUlVFOworICBlbHNlCisgICAgY2luZm8tPmlucHV0Y3RsLT5oYXNfbXVsdGlwbGVfc2NhbnMgPSBGQUxTRTsKK30KKworCitMT0NBTCh2b2lkKQorcGVyX3NjYW5fc2V0dXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBEbyBjb21wdXRhdGlvbnMgdGhhdCBhcmUgbmVlZGVkIGJlZm9yZSBwcm9jZXNzaW5nIGEgSlBFRyBzY2FuICovCisvKiBjaW5mby0+Y29tcHNfaW5fc2NhbiBhbmQgY2luZm8tPmN1cl9jb21wX2luZm9bXSB3ZXJlIHNldCBmcm9tIFNPUyBtYXJrZXIgKi8KK3sKKyAgaW50IGNpLCBtY3VibGtzLCB0bXA7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIAorICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gPT0gMSkgeworICAgIAorICAgIC8qIE5vbmludGVybGVhdmVkIChzaW5nbGUtY29tcG9uZW50KSBzY2FuICovCisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvWzBdOworICAgIAorICAgIC8qIE92ZXJhbGwgaW1hZ2Ugc2l6ZSBpbiBNQ1VzICovCisgICAgY2luZm8tPk1DVXNfcGVyX3JvdyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrczsKKyAgICBjaW5mby0+TUNVX3Jvd3NfaW5fc2NhbiA9IGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3M7CisgICAgCisgICAgLyogRm9yIG5vbmludGVybGVhdmVkIHNjYW4sIGFsd2F5cyBvbmUgYmxvY2sgcGVyIE1DVSAqLworICAgIGNvbXBwdHItPk1DVV93aWR0aCA9IDE7CisgICAgY29tcHB0ci0+TUNVX2hlaWdodCA9IDE7CisgICAgY29tcHB0ci0+TUNVX2Jsb2NrcyA9IDE7CisgICAgY29tcHB0ci0+TUNVX3NhbXBsZV93aWR0aCA9IGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKKyAgICBjb21wcHRyLT5sYXN0X2NvbF93aWR0aCA9IDE7CisgICAgLyogRm9yIG5vbmludGVybGVhdmVkIHNjYW5zLCBpdCBpcyBjb252ZW5pZW50IHRvIGRlZmluZSBsYXN0X3Jvd19oZWlnaHQKKyAgICAgKiBhcyB0aGUgbnVtYmVyIG9mIGJsb2NrIHJvd3MgcHJlc2VudCBpbiB0aGUgbGFzdCBpTUNVIHJvdy4KKyAgICAgKi8KKyAgICB0bXAgPSAoaW50KSAoY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyAlIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOworICAgIGlmICh0bXAgPT0gMCkgdG1wID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICBjb21wcHRyLT5sYXN0X3Jvd19oZWlnaHQgPSB0bXA7CisgICAgCisgICAgLyogUHJlcGFyZSBhcnJheSBkZXNjcmliaW5nIE1DVSBjb21wb3NpdGlvbiAqLworICAgIGNpbmZvLT5ibG9ja3NfaW5fTUNVID0gMTsKKyAgICBjaW5mby0+TUNVX21lbWJlcnNoaXBbMF0gPSAwOworICAgIAorICB9IGVsc2UgeworICAgIAorICAgIC8qIEludGVybGVhdmVkIChtdWx0aS1jb21wb25lbnQpIHNjYW4gKi8KKyAgICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gPD0gMCB8fCBjaW5mby0+Y29tcHNfaW5fc2NhbiA+IE1BWF9DT01QU19JTl9TQ0FOKQorICAgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQ09NUE9ORU5UX0NPVU5ULCBjaW5mby0+Y29tcHNfaW5fc2NhbiwKKwkgICAgICAgTUFYX0NPTVBTX0lOX1NDQU4pOworICAgIAorICAgIC8qIE92ZXJhbGwgaW1hZ2Ugc2l6ZSBpbiBNQ1VzICovCisgICAgY2luZm8tPk1DVXNfcGVyX3JvdyA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoLAorCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IqRENUU0laRSkpOworICAgIGNpbmZvLT5NQ1Vfcm93c19pbl9zY2FuID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0LAorCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IqRENUU0laRSkpOworICAgIAorICAgIGNpbmZvLT5ibG9ja3NfaW5fTUNVID0gMDsKKyAgICAKKyAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgeworICAgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICAgIC8qIFNhbXBsaW5nIGZhY3RvcnMgZ2l2ZSAjIG9mIGJsb2NrcyBvZiBjb21wb25lbnQgaW4gZWFjaCBNQ1UgKi8KKyAgICAgIGNvbXBwdHItPk1DVV93aWR0aCA9IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7CisgICAgICBjb21wcHRyLT5NQ1VfaGVpZ2h0ID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICAgIGNvbXBwdHItPk1DVV9ibG9ja3MgPSBjb21wcHRyLT5NQ1Vfd2lkdGggKiBjb21wcHRyLT5NQ1VfaGVpZ2h0OworICAgICAgY29tcHB0ci0+TUNVX3NhbXBsZV93aWR0aCA9IGNvbXBwdHItPk1DVV93aWR0aCAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKKyAgICAgIC8qIEZpZ3VyZSBudW1iZXIgb2Ygbm9uLWR1bW15IGJsb2NrcyBpbiBsYXN0IE1DVSBjb2x1bW4gJiByb3cgKi8KKyAgICAgIHRtcCA9IChpbnQpIChjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgJSBjb21wcHRyLT5NQ1Vfd2lkdGgpOworICAgICAgaWYgKHRtcCA9PSAwKSB0bXAgPSBjb21wcHRyLT5NQ1Vfd2lkdGg7CisgICAgICBjb21wcHRyLT5sYXN0X2NvbF93aWR0aCA9IHRtcDsKKyAgICAgIHRtcCA9IChpbnQpIChjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzICUgY29tcHB0ci0+TUNVX2hlaWdodCk7CisgICAgICBpZiAodG1wID09IDApIHRtcCA9IGNvbXBwdHItPk1DVV9oZWlnaHQ7CisgICAgICBjb21wcHRyLT5sYXN0X3Jvd19oZWlnaHQgPSB0bXA7CisgICAgICAvKiBQcmVwYXJlIGFycmF5IGRlc2NyaWJpbmcgTUNVIGNvbXBvc2l0aW9uICovCisgICAgICBtY3VibGtzID0gY29tcHB0ci0+TUNVX2Jsb2NrczsKKyAgICAgIGlmIChjaW5mby0+YmxvY2tzX2luX01DVSArIG1jdWJsa3MgPiBEX01BWF9CTE9DS1NfSU5fTUNVKQorCUVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX01DVV9TSVpFKTsKKyAgICAgIHdoaWxlIChtY3VibGtzLS0gPiAwKSB7CisJY2luZm8tPk1DVV9tZW1iZXJzaGlwW2NpbmZvLT5ibG9ja3NfaW5fTUNVKytdID0gY2k7CisgICAgICB9CisgICAgfQorICAgIAorICB9Cit9CisKKworLyoKKyAqIFNhdmUgYXdheSBhIGNvcHkgb2YgdGhlIFEtdGFibGUgcmVmZXJlbmNlZCBieSBlYWNoIGNvbXBvbmVudCBwcmVzZW50CisgKiBpbiB0aGUgY3VycmVudCBzY2FuLCB1bmxlc3MgYWxyZWFkeSBzYXZlZCBkdXJpbmcgYSBwcmlvciBzY2FuLgorICoKKyAqIEluIGEgbXVsdGlwbGUtc2NhbiBKUEVHIGZpbGUsIHRoZSBlbmNvZGVyIGNvdWxkIGFzc2lnbiBkaWZmZXJlbnQgY29tcG9uZW50cworICogdGhlIHNhbWUgUS10YWJsZSBzbG90IG51bWJlciwgYnV0IGNoYW5nZSB0YWJsZSBkZWZpbml0aW9ucyBiZXR3ZWVuIHNjYW5zCisgKiBzbyB0aGF0IGVhY2ggY29tcG9uZW50IHVzZXMgYSBkaWZmZXJlbnQgUS10YWJsZS4gIChUaGUgSUpHIGVuY29kZXIgaXMgbm90CisgKiBjdXJyZW50bHkgY2FwYWJsZSBvZiBkb2luZyB0aGlzLCBidXQgb3RoZXIgZW5jb2RlcnMgbWlnaHQuKSAgU2luY2Ugd2Ugd2FudAorICogdG8gYmUgYWJsZSB0byBkZXF1YW50aXplIGFsbCB0aGUgY29tcG9uZW50cyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLCB0aGlzCisgKiBtZWFucyB0aGF0IHdlIGhhdmUgdG8gc2F2ZSBhd2F5IHRoZSB0YWJsZSBhY3R1YWxseSB1c2VkIGZvciBlYWNoIGNvbXBvbmVudC4KKyAqIFdlIGRvIHRoaXMgYnkgY29weWluZyB0aGUgdGFibGUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBzY2FuIGNvbnRhaW5pbmcKKyAqIHRoZSBjb21wb25lbnQuCisgKiBUaGUgSlBFRyBzcGVjIHByb2hpYml0cyB0aGUgZW5jb2RlciBmcm9tIGNoYW5naW5nIHRoZSBjb250ZW50cyBvZiBhIFEtdGFibGUKKyAqIHNsb3QgYmV0d2VlbiBzY2FucyBvZiBhIGNvbXBvbmVudCB1c2luZyB0aGF0IHNsb3QuICBJZiB0aGUgZW5jb2RlciBkb2VzIHNvCisgKiBhbnl3YXksIHRoaXMgZGVjb2RlciB3aWxsIHNpbXBseSB1c2UgdGhlIFEtdGFibGUgdmFsdWVzIHRoYXQgd2VyZSBjdXJyZW50CisgKiBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpcnN0IHNjYW4gZm9yIHRoZSBjb21wb25lbnQuCisgKgorICogVGhlIGRlY29tcHJlc3NvciBvdXRwdXQgc2lkZSBsb29rcyBvbmx5IGF0IHRoZSBzYXZlZCBxdWFudCB0YWJsZXMsCisgKiBub3QgYXQgdGhlIGN1cnJlbnQgUS10YWJsZSBzbG90cy4KKyAqLworCitMT0NBTCh2b2lkKQorbGF0Y2hfcXVhbnRfdGFibGVzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBpbnQgY2ksIHF0YmxubzsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgSlFVQU5UX1RCTCAqIHF0Ymw7CisKKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIC8qIE5vIHdvcmsgaWYgd2UgYWxyZWFkeSBzYXZlZCBRLXRhYmxlIGZvciB0aGlzIGNvbXBvbmVudCAqLworICAgIGlmIChjb21wcHRyLT5xdWFudF90YWJsZSAhPSBOVUxMKQorICAgICAgY29udGludWU7CisgICAgLyogTWFrZSBzdXJlIHNwZWNpZmllZCBxdWFudGl6YXRpb24gdGFibGUgaXMgcHJlc2VudCAqLworICAgIHF0YmxubyA9IGNvbXBwdHItPnF1YW50X3RibF9ubzsKKyAgICBpZiAocXRibG5vIDwgMCB8fCBxdGJsbm8gPj0gTlVNX1FVQU5UX1RCTFMgfHwKKwljaW5mby0+cXVhbnRfdGJsX3B0cnNbcXRibG5vXSA9PSBOVUxMKQorICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fUVVBTlRfVEFCTEUsIHF0Ymxubyk7CisgICAgLyogT0ssIHNhdmUgYXdheSB0aGUgcXVhbnRpemF0aW9uIHRhYmxlICovCisgICAgcXRibCA9IChKUVVBTlRfVEJMICopCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgU0laRU9GKEpRVUFOVF9UQkwpKTsKKyAgICBNRU1DT1BZKHF0YmwsIGNpbmZvLT5xdWFudF90YmxfcHRyc1txdGJsbm9dLCBTSVpFT0YoSlFVQU5UX1RCTCkpOworICAgIGNvbXBwdHItPnF1YW50X3RhYmxlID0gcXRibDsKKyAgfQorfQorCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBpbnB1dCBtb2R1bGVzIHRvIHJlYWQgYSBzY2FuIG9mIGNvbXByZXNzZWQgZGF0YS4KKyAqIFRoZSBmaXJzdCBjYWxsIHRvIHRoaXMgaXMgZG9uZSBieSBqZG1hc3Rlci5jIGFmdGVyIGluaXRpYWxpemluZworICogdGhlIGVudGlyZSBkZWNvbXByZXNzb3IgKGR1cmluZyBqcGVnX3N0YXJ0X2RlY29tcHJlc3MpLgorICogU3Vic2VxdWVudCBjYWxscyBjb21lIGZyb20gY29uc3VtZV9tYXJrZXJzLCBiZWxvdy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X2lucHV0X3Bhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIHBlcl9zY2FuX3NldHVwKGNpbmZvKTsKKyAgbGF0Y2hfcXVhbnRfdGFibGVzKGNpbmZvKTsKKyAgKCpjaW5mby0+ZW50cm9weS0+c3RhcnRfcGFzcykgKGNpbmZvKTsKKyAgKCpjaW5mby0+Y29lZi0+c3RhcnRfaW5wdXRfcGFzcykgKGNpbmZvKTsKKyAgY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0ID0gY2luZm8tPmNvZWYtPmNvbnN1bWVfZGF0YTsKK30KKworCisvKgorICogRmluaXNoIHVwIGFmdGVyIGlucHV0dGluZyBhIGNvbXByZXNzZWQtZGF0YSBzY2FuLgorICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIgYWZ0ZXIgaXQncyByZWFkIGFsbAorICogdGhlIGV4cGVjdGVkIGRhdGEgb2YgdGhlIHNjYW4uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmaW5pc2hfaW5wdXRfcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0ID0gY29uc3VtZV9tYXJrZXJzOworfQorCisKKy8qCisgKiBSZWFkIEpQRUcgbWFya2VycyBiZWZvcmUsIGJldHdlZW4sIG9yIGFmdGVyIGNvbXByZXNzZWQtZGF0YSBzY2Fucy4KKyAqIENoYW5nZSBzdGF0ZSBhcyBuZWNlc3Nhcnkgd2hlbiBhIG5ldyBzY2FuIGlzIHJlYWNoZWQuCisgKiBSZXR1cm4gdmFsdWUgaXMgSlBFR19TVVNQRU5ERUQsIEpQRUdfUkVBQ0hFRF9TT1MsIG9yIEpQRUdfUkVBQ0hFRF9FT0kuCisgKgorICogVGhlIGNvbnN1bWVfaW5wdXQgbWV0aG9kIHBvaW50ZXIgcG9pbnRzIGVpdGhlciBoZXJlIG9yIHRvIHRoZQorICogY29lZmZpY2llbnQgY29udHJvbGxlcidzIGNvbnN1bWVfZGF0YSByb3V0aW5lLCBkZXBlbmRpbmcgb24gd2hldGhlcgorICogd2UgYXJlIHJlYWRpbmcgYSBjb21wcmVzc2VkIGRhdGEgc2VnbWVudCBvciBpbnRlci1zZWdtZW50IG1hcmtlcnMuCisgKi8KKworTUVUSE9EREVGKGludCkKK2NvbnN1bWVfbWFya2VycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfaW5wdXRjdGxfcHRyIGlucHV0Y3RsID0gKG15X2lucHV0Y3RsX3B0cikgY2luZm8tPmlucHV0Y3RsOworICBpbnQgdmFsOworCisgIGlmIChpbnB1dGN0bC0+cHViLmVvaV9yZWFjaGVkKSAvKiBBZnRlciBoaXR0aW5nIEVPSSwgcmVhZCBubyBmdXJ0aGVyICovCisgICAgcmV0dXJuIEpQRUdfUkVBQ0hFRF9FT0k7CisKKyAgdmFsID0gKCpjaW5mby0+bWFya2VyLT5yZWFkX21hcmtlcnMpIChjaW5mbyk7CisKKyAgc3dpdGNoICh2YWwpIHsKKyAgY2FzZSBKUEVHX1JFQUNIRURfU09TOgkvKiBGb3VuZCBTT1MgKi8KKyAgICBpZiAoaW5wdXRjdGwtPmluaGVhZGVycykgewkvKiAxc3QgU09TICovCisgICAgICBpbml0aWFsX3NldHVwKGNpbmZvKTsKKyAgICAgIGlucHV0Y3RsLT5pbmhlYWRlcnMgPSBGQUxTRTsKKyAgICAgIC8qIE5vdGU6IHN0YXJ0X2lucHV0X3Bhc3MgbXVzdCBiZSBjYWxsZWQgYnkgamRtYXN0ZXIuYworICAgICAgICogYmVmb3JlIGFueSBtb3JlIGlucHV0IGNhbiBiZSBjb25zdW1lZC4gIGpkYXBpbWluLmMgaXMKKyAgICAgICAqIHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgdGhpcyBzZXF1ZW5jaW5nLgorICAgICAgICovCisgICAgfSBlbHNlIHsJCQkvKiAybmQgb3IgbGF0ZXIgU09TIG1hcmtlciAqLworICAgICAgaWYgKCEgaW5wdXRjdGwtPnB1Yi5oYXNfbXVsdGlwbGVfc2NhbnMpCisJRVJSRVhJVChjaW5mbywgSkVSUl9FT0lfRVhQRUNURUQpOyAvKiBPb3BzLCBJIHdhc24ndCBleHBlY3RpbmcgdGhpcyEgKi8KKyAgICAgIHN0YXJ0X2lucHV0X3Bhc3MoY2luZm8pOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBKUEVHX1JFQUNIRURfRU9JOgkvKiBGb3VuZCBFT0kgKi8KKyAgICBpbnB1dGN0bC0+cHViLmVvaV9yZWFjaGVkID0gVFJVRTsKKyAgICBpZiAoaW5wdXRjdGwtPmluaGVhZGVycykgewkvKiBUYWJsZXMtb25seSBkYXRhc3RyZWFtLCBhcHBhcmVudGx5ICovCisgICAgICBpZiAoY2luZm8tPm1hcmtlci0+c2F3X1NPRikKKwlFUlJFWElUKGNpbmZvLCBKRVJSX1NPRl9OT19TT1MpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBQcmV2ZW50IGluZmluaXRlIGxvb3AgaW4gY29lZiBjdGxyJ3MgZGVjb21wcmVzc19kYXRhIHJvdXRpbmUKKyAgICAgICAqIGlmIHVzZXIgc2V0IG91dHB1dF9zY2FuX251bWJlciBsYXJnZXIgdGhhbiBudW1iZXIgb2Ygc2NhbnMuCisgICAgICAgKi8KKyAgICAgIGlmIChjaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyID4gY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyKQorCWNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgPSBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXI7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEpQRUdfU1VTUEVOREVEOgorICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHZhbDsKK30KKworCisvKgorICogUmVzZXQgc3RhdGUgdG8gYmVnaW4gYSBmcmVzaCBkYXRhc3RyZWFtLgorICovCisKK01FVEhPRERFRih2b2lkKQorcmVzZXRfaW5wdXRfY29udHJvbGxlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfaW5wdXRjdGxfcHRyIGlucHV0Y3RsID0gKG15X2lucHV0Y3RsX3B0cikgY2luZm8tPmlucHV0Y3RsOworCisgIGlucHV0Y3RsLT5wdWIuY29uc3VtZV9pbnB1dCA9IGNvbnN1bWVfbWFya2VyczsKKyAgaW5wdXRjdGwtPnB1Yi5oYXNfbXVsdGlwbGVfc2NhbnMgPSBGQUxTRTsgLyogInVua25vd24iIHdvdWxkIGJlIGJldHRlciAqLworICBpbnB1dGN0bC0+cHViLmVvaV9yZWFjaGVkID0gRkFMU0U7CisgIGlucHV0Y3RsLT5pbmhlYWRlcnMgPSBUUlVFOworICAvKiBSZXNldCBvdGhlciBtb2R1bGVzICovCisgICgqY2luZm8tPmVyci0+cmVzZXRfZXJyb3JfbWdyKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICAoKmNpbmZvLT5tYXJrZXItPnJlc2V0X21hcmtlcl9yZWFkZXIpIChjaW5mbyk7CisgIC8qIFJlc2V0IHByb2dyZXNzaW9uIHN0YXRlIC0tIHdvdWxkIGJlIGNsZWFuZXIgaWYgZW50cm9weSBkZWNvZGVyIGRpZCB0aGlzICovCisgIGNpbmZvLT5jb2VmX2JpdHMgPSBOVUxMOworfQorCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBpbnB1dCBjb250cm9sbGVyIG1vZHVsZS4KKyAqIFRoaXMgaXMgY2FsbGVkIG9ubHkgb25jZSwgd2hlbiB0aGUgZGVjb21wcmVzc2lvbiBvYmplY3QgaXMgY3JlYXRlZC4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X2lucHV0X2NvbnRyb2xsZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2lucHV0Y3RsX3B0ciBpbnB1dGN0bDsKKworICAvKiBDcmVhdGUgc3Vib2JqZWN0IGluIHBlcm1hbmVudCBwb29sICovCisgIGlucHV0Y3RsID0gKG15X2lucHV0Y3RsX3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX1BFUk1BTkVOVCwKKwkJCQlTSVpFT0YobXlfaW5wdXRfY29udHJvbGxlcikpOworICBjaW5mby0+aW5wdXRjdGwgPSAoc3RydWN0IGpwZWdfaW5wdXRfY29udHJvbGxlciAqKSBpbnB1dGN0bDsKKyAgLyogSW5pdGlhbGl6ZSBtZXRob2QgcG9pbnRlcnMgKi8KKyAgaW5wdXRjdGwtPnB1Yi5jb25zdW1lX2lucHV0ID0gY29uc3VtZV9tYXJrZXJzOworICBpbnB1dGN0bC0+cHViLnJlc2V0X2lucHV0X2NvbnRyb2xsZXIgPSByZXNldF9pbnB1dF9jb250cm9sbGVyOworICBpbnB1dGN0bC0+cHViLnN0YXJ0X2lucHV0X3Bhc3MgPSBzdGFydF9pbnB1dF9wYXNzOworICBpbnB1dGN0bC0+cHViLmZpbmlzaF9pbnB1dF9wYXNzID0gZmluaXNoX2lucHV0X3Bhc3M7CisgIC8qIEluaXRpYWxpemUgc3RhdGU6IGNhbid0IHVzZSByZXNldF9pbnB1dF9jb250cm9sbGVyIHNpbmNlIHdlIGRvbid0CisgICAqIHdhbnQgdG8gdHJ5IHRvIHJlc2V0IG90aGVyIG1vZHVsZXMgeWV0LgorICAgKi8KKyAgaW5wdXRjdGwtPnB1Yi5oYXNfbXVsdGlwbGVfc2NhbnMgPSBGQUxTRTsgLyogInVua25vd24iIHdvdWxkIGJlIGJldHRlciAqLworICBpbnB1dGN0bC0+cHViLmVvaV9yZWFjaGVkID0gRkFMU0U7CisgIGlucHV0Y3RsLT5pbmhlYWRlcnMgPSBUUlVFOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkbWFpbmN0LmMgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRtYWluY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2M5NTZmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkbWFpbmN0LmMKQEAgLTAsMCArMSw1MTIgQEAKKy8qCisgKiBqZG1haW5jdC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG1haW4gYnVmZmVyIGNvbnRyb2xsZXIgZm9yIGRlY29tcHJlc3Npb24uCisgKiBUaGUgbWFpbiBidWZmZXIgbGllcyBiZXR3ZWVuIHRoZSBKUEVHIGRlY29tcHJlc3NvciBwcm9wZXIgYW5kIHRoZQorICogcG9zdC1wcm9jZXNzb3I7IGl0IGhvbGRzIGRvd25zYW1wbGVkIGRhdGEgaW4gdGhlIEpQRUcgY29sb3JzcGFjZS4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBjb2RlIGlzIGJ5cGFzc2VkIGluIHJhdy1kYXRhIG1vZGUsIHNpbmNlIHRoZSBhcHBsaWNhdGlvbgorICogc3VwcGxpZXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIG1haW4gYnVmZmVyIGluIHRoYXQgY2FzZS4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyoKKyAqIEluIHRoZSBjdXJyZW50IHN5c3RlbSBkZXNpZ24sIHRoZSBtYWluIGJ1ZmZlciBuZWVkIG5ldmVyIGJlIGEgZnVsbC1pbWFnZQorICogYnVmZmVyOyBhbnkgZnVsbC1oZWlnaHQgYnVmZmVycyB3aWxsIGJlIGZvdW5kIGluc2lkZSB0aGUgY29lZmZpY2llbnQgb3IKKyAqIHBvc3Rwcm9jZXNzaW5nIGNvbnRyb2xsZXJzLiAgTm9uZXRoZWxlc3MsIHRoZSBtYWluIGNvbnRyb2xsZXIgaXMgbm90CisgKiB0cml2aWFsLiAgSXRzIHJlc3BvbnNpYmlsaXR5IGlzIHRvIHByb3ZpZGUgY29udGV4dCByb3dzIGZvciB1cHNhbXBsaW5nLworICogcmVzY2FsaW5nLCBhbmQgZG9pbmcgdGhpcyBpbiBhbiBlZmZpY2llbnQgZmFzaGlvbiBpcyBhIGJpdCB0cmlja3kuCisgKgorICogUG9zdHByb2Nlc3NvciBpbnB1dCBkYXRhIGlzIGNvdW50ZWQgaW4gInJvdyBncm91cHMiLiAgQSByb3cgZ3JvdXAKKyAqIGlzIGRlZmluZWQgdG8gYmUgKHZfc2FtcF9mYWN0b3IgKiBEQ1Rfc2NhbGVkX3NpemUgLyBtaW5fRENUX3NjYWxlZF9zaXplKQorICogc2FtcGxlIHJvd3Mgb2YgZWFjaCBjb21wb25lbnQuICAoV2UgcmVxdWlyZSBEQ1Rfc2NhbGVkX3NpemUgdmFsdWVzIHRvIGJlCisgKiBjaG9zZW4gc3VjaCB0aGF0IHRoZXNlIG51bWJlcnMgYXJlIGludGVnZXJzLiAgSW4gcHJhY3RpY2UgRENUX3NjYWxlZF9zaXplCisgKiB2YWx1ZXMgd2lsbCBsaWtlbHkgYmUgcG93ZXJzIG9mIHR3bywgc28gd2UgYWN0dWFsbHkgaGF2ZSB0aGUgc3Ryb25nZXIKKyAqIGNvbmRpdGlvbiB0aGF0IERDVF9zY2FsZWRfc2l6ZSAvIG1pbl9EQ1Rfc2NhbGVkX3NpemUgaXMgYW4gaW50ZWdlci4pCisgKiBVcHNhbXBsaW5nIHdpbGwgdHlwaWNhbGx5IHByb2R1Y2UgbWF4X3Zfc2FtcF9mYWN0b3IgcGl4ZWwgcm93cyBmcm9tIGVhY2gKKyAqIHJvdyBncm91cCAodGltZXMgYW55IGFkZGl0aW9uYWwgc2NhbGUgZmFjdG9yIHRoYXQgdGhlIHVwc2FtcGxlciBpcworICogYXBwbHlpbmcpLgorICoKKyAqIFRoZSBjb2VmZmljaWVudCBjb250cm9sbGVyIHdpbGwgZGVsaXZlciBkYXRhIHRvIHVzIG9uZSBpTUNVIHJvdyBhdCBhIHRpbWU7CisgKiBlYWNoIGlNQ1Ugcm93IGNvbnRhaW5zIHZfc2FtcF9mYWN0b3IgKiBEQ1Rfc2NhbGVkX3NpemUgc2FtcGxlIHJvd3MsIG9yCisgKiBleGFjdGx5IG1pbl9EQ1Rfc2NhbGVkX3NpemUgcm93IGdyb3Vwcy4gIChUaGlzIGFtb3VudCBvZiBkYXRhIGNvcnJlc3BvbmRzCisgKiB0byBvbmUgcm93IG9mIE1DVXMgd2hlbiB0aGUgaW1hZ2UgaXMgZnVsbHkgaW50ZXJsZWF2ZWQuKSAgTm90ZSB0aGF0IHRoZQorICogbnVtYmVyIG9mIHNhbXBsZSByb3dzIHZhcmllcyBhY3Jvc3MgY29tcG9uZW50cywgYnV0IHRoZSBudW1iZXIgb2Ygcm93CisgKiBncm91cHMgZG9lcyBub3QuICBTb21lIGdhcmJhZ2Ugc2FtcGxlIHJvd3MgbWF5IGJlIGluY2x1ZGVkIGluIHRoZSBsYXN0IGlNQ1UKKyAqIHJvdyBhdCB0aGUgYm90dG9tIG9mIHRoZSBpbWFnZS4KKyAqCisgKiBEZXBlbmRpbmcgb24gdGhlIHZlcnRpY2FsIHNjYWxpbmcgYWxnb3JpdGhtIHVzZWQsIHRoZSB1cHNhbXBsZXIgbWF5IG5lZWQKKyAqIGFjY2VzcyB0byB0aGUgc2FtcGxlIHJvdyhzKSBhYm92ZSBhbmQgYmVsb3cgaXRzIGN1cnJlbnQgaW5wdXQgcm93IGdyb3VwLgorICogVGhlIHVwc2FtcGxlciBpcyByZXF1aXJlZCB0byBzZXQgbmVlZF9jb250ZXh0X3Jvd3MgVFJVRSBhdCBnbG9iYWwgc2VsZWN0aW9uCisgKiB0aW1lIGlmIHNvLiAgV2hlbiBuZWVkX2NvbnRleHRfcm93cyBpcyBGQUxTRSwgdGhpcyBjb250cm9sbGVyIGNhbiBzaW1wbHkKKyAqIG9idGFpbiBvbmUgaU1DVSByb3cgYXQgYSB0aW1lIGZyb20gdGhlIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIgYW5kIGRvbGUgaXQKKyAqIG91dCBhcyByb3cgZ3JvdXBzIHRvIHRoZSBwb3N0cHJvY2Vzc29yLgorICoKKyAqIFdoZW4gbmVlZF9jb250ZXh0X3Jvd3MgaXMgVFJVRSwgdGhpcyBjb250cm9sbGVyIGd1YXJhbnRlZXMgdGhhdCB0aGUgYnVmZmVyCisgKiBwYXNzZWQgdG8gcG9zdHByb2Nlc3NpbmcgY29udGFpbnMgYXQgbGVhc3Qgb25lIHJvdyBncm91cCdzIHdvcnRoIG9mIHNhbXBsZXMKKyAqIGFib3ZlIGFuZCBiZWxvdyB0aGUgcm93IGdyb3VwKHMpIGJlaW5nIHByb2Nlc3NlZC4gIE5vdGUgdGhhdCB0aGUgY29udGV4dAorICogcm93cyAiYWJvdmUiIHRoZSBmaXJzdCBwYXNzZWQgcm93IGdyb3VwIGFwcGVhciBhdCBuZWdhdGl2ZSByb3cgb2Zmc2V0cyBpbgorICogdGhlIHBhc3NlZCBidWZmZXIuICBBdCB0aGUgdG9wIGFuZCBib3R0b20gb2YgdGhlIGltYWdlLCB0aGUgcmVxdWlyZWQKKyAqIGNvbnRleHQgcm93cyBhcmUgbWFudWZhY3R1cmVkIGJ5IGR1cGxpY2F0aW5nIHRoZSBmaXJzdCBvciBsYXN0IHJlYWwgc2FtcGxlCisgKiByb3c7IHRoaXMgYXZvaWRzIGhhdmluZyBzcGVjaWFsIGNhc2VzIGluIHRoZSB1cHNhbXBsaW5nIGlubmVyIGxvb3BzLgorICoKKyAqIFRoZSBhbW91bnQgb2YgY29udGV4dCBpcyBmaXhlZCBhdCBvbmUgcm93IGdyb3VwIGp1c3QgYmVjYXVzZSB0aGF0J3MgYQorICogY29udmVuaWVudCBudW1iZXIgZm9yIHRoaXMgY29udHJvbGxlciB0byB3b3JrIHdpdGguICBUaGUgZXhpc3RpbmcKKyAqIHVwc2FtcGxlcnMgcmVhbGx5IG9ubHkgbmVlZCBvbmUgc2FtcGxlIHJvdyBvZiBjb250ZXh0LiAgQW4gdXBzYW1wbGVyCisgKiBzdXBwb3J0aW5nIGFyYml0cmFyeSBvdXRwdXQgcmVzY2FsaW5nIG1pZ2h0IHdpc2ggZm9yIG1vcmUgdGhhbiBvbmUgcm93CisgKiBncm91cCBvZiBjb250ZXh0IHdoZW4gc2hyaW5raW5nIHRoZSBpbWFnZTsgdG91Z2gsIHdlIGRvbid0IGhhbmRsZSB0aGF0LgorICogKFRoaXMgaXMganVzdGlmaWVkIGJ5IHRoZSBhc3N1bXB0aW9uIHRoYXQgZG93bnNpemluZyB3aWxsIGJlIGhhbmRsZWQgbW9zdGx5CisgKiBieSBhZGp1c3RpbmcgdGhlIERDVF9zY2FsZWRfc2l6ZSB2YWx1ZXMsIHNvIHRoYXQgdGhlIGFjdHVhbCBzY2FsZSBmYWN0b3IgYXQKKyAqIHRoZSB1cHNhbXBsZSBzdGVwIG5lZWRuJ3QgYmUgbXVjaCBsZXNzIHRoYW4gb25lLikKKyAqCisgKiBUbyBwcm92aWRlIHRoZSBkZXNpcmVkIGNvbnRleHQsIHdlIGhhdmUgdG8gcmV0YWluIHRoZSBsYXN0IHR3byByb3cgZ3JvdXBzCisgKiBvZiBvbmUgaU1DVSByb3cgd2hpbGUgcmVhZGluZyBpbiB0aGUgbmV4dCBpTUNVIHJvdy4gIChUaGUgbGFzdCByb3cgZ3JvdXAKKyAqIGNhbid0IGJlIHByb2Nlc3NlZCB1bnRpbCB3ZSBoYXZlIGFub3RoZXIgcm93IGdyb3VwIGZvciBpdHMgYmVsb3ctY29udGV4dCwKKyAqIGFuZCBzbyB3ZSBoYXZlIHRvIHNhdmUgdGhlIG5leHQtdG8tbGFzdCBncm91cCB0b28gZm9yIGl0cyBhYm92ZS1jb250ZXh0LikKKyAqIFdlIGNvdWxkIGRvIHRoaXMgbW9zdCBzaW1wbHkgYnkgY29weWluZyBkYXRhIGFyb3VuZCBpbiBvdXIgYnVmZmVyLCBidXQKKyAqIHRoYXQnZCBiZSB2ZXJ5IHNsb3cuICBXZSBjYW4gYXZvaWQgY29weWluZyBhbnkgZGF0YSBieSBjcmVhdGluZyBhIHJhdGhlcgorICogc3RyYW5nZSBwb2ludGVyIHN0cnVjdHVyZS4gIEhlcmUncyBob3cgaXQgd29ya3MuICBXZSBhbGxvY2F0ZSBhIHdvcmtzcGFjZQorICogY29uc2lzdGluZyBvZiBNKzIgcm93IGdyb3VwcyAod2hlcmUgTSA9IG1pbl9EQ1Rfc2NhbGVkX3NpemUgaXMgdGhlIG51bWJlcgorICogb2Ygcm93IGdyb3VwcyBwZXIgaU1DVSByb3cpLiAgV2UgY3JlYXRlIHR3byBzZXRzIG9mIHJlZHVuZGFudCBwb2ludGVycyB0bworICogdGhlIHdvcmtzcGFjZS4gIExhYmVsaW5nIHRoZSBwaHlzaWNhbCByb3cgZ3JvdXBzIDAgdG8gTSsxLCB0aGUgc3ludGhlc2l6ZWQKKyAqIHBvaW50ZXIgbGlzdHMgbG9vayBsaWtlIHRoaXM6CisgKiAgICAgICAgICAgICAgICAgICBNKzEgICAgICAgICAgICAgICAgICAgICAgICAgIE0tMQorICogbWFzdGVyIHBvaW50ZXIgLS0+IDAgICAgICAgICBtYXN0ZXIgcG9pbnRlciAtLT4gMAorICogICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorICogICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4KKyAqICAgICAgICAgICAgICAgICAgIE0tMyAgICAgICAgICAgICAgICAgICAgICAgICAgTS0zCisgKiAgICAgICAgICAgICAgICAgICBNLTIgICAgICAgICAgICAgICAgICAgICAgICAgICBNCisgKiAgICAgICAgICAgICAgICAgICBNLTEgICAgICAgICAgICAgICAgICAgICAgICAgIE0rMQorICogICAgICAgICAgICAgICAgICAgIE0gICAgICAgICAgICAgICAgICAgICAgICAgICBNLTIKKyAqICAgICAgICAgICAgICAgICAgIE0rMSAgICAgICAgICAgICAgICAgICAgICAgICAgTS0xCisgKiAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisgKiBXZSByZWFkIGFsdGVybmF0ZSBpTUNVIHJvd3MgdXNpbmcgZWFjaCBtYXN0ZXIgcG9pbnRlcjsgdGh1cyB0aGUgbGFzdCB0d28KKyAqIHJvdyBncm91cHMgb2YgdGhlIHByZXZpb3VzIGlNQ1Ugcm93IHJlbWFpbiB1bi1vdmVyd3JpdHRlbiBpbiB0aGUgd29ya3NwYWNlLgorICogVGhlIHBvaW50ZXIgbGlzdHMgYXJlIHNldCB1cCBzbyB0aGF0IHRoZSByZXF1aXJlZCBjb250ZXh0IHJvd3MgYXBwZWFyIHRvCisgKiBiZSBhZGphY2VudCB0byB0aGUgcHJvcGVyIHBsYWNlcyB3aGVuIHdlIHBhc3MgdGhlIHBvaW50ZXIgbGlzdHMgdG8gdGhlCisgKiB1cHNhbXBsZXIuCisgKgorICogVGhlIGFib3ZlIHBpY3R1cmVzIGRlc2NyaWJlIHRoZSBub3JtYWwgc3RhdGUgb2YgdGhlIHBvaW50ZXIgbGlzdHMuCisgKiBBdCB0b3AgYW5kIGJvdHRvbSBvZiB0aGUgaW1hZ2UsIHdlIGRpZGRsZSB0aGUgcG9pbnRlciBsaXN0cyB0byBkdXBsaWNhdGUKKyAqIHRoZSBmaXJzdCBvciBsYXN0IHNhbXBsZSByb3cgYXMgbmVjZXNzYXJ5ICh0aGlzIGlzIGNoZWFwZXIgdGhhbiBjb3B5aW5nCisgKiBzYW1wbGUgcm93cyBhcm91bmQpLgorICoKKyAqIFRoaXMgc2NoZW1lIGJyZWFrcyBkb3duIGlmIE0gPCAyLCBpZSwgbWluX0RDVF9zY2FsZWRfc2l6ZSBpcyAxLiAgSW4gdGhhdAorICogc2l0dWF0aW9uIGVhY2ggaU1DVSByb3cgcHJvdmlkZXMgb25seSBvbmUgcm93IGdyb3VwIHNvIHRoZSBidWZmZXJpbmcgbG9naWMKKyAqIG11c3QgYmUgZGlmZmVyZW50IChlZywgd2UgbXVzdCByZWFkIHR3byBpTUNVIHJvd3MgYmVmb3JlIHdlIGNhbiBlbWl0IHRoZQorICogZmlyc3Qgcm93IGdyb3VwKS4gIEZvciBub3csIHdlIHNpbXBseSBkbyBub3Qgc3VwcG9ydCBwcm92aWRpbmcgY29udGV4dAorICogcm93cyB3aGVuIG1pbl9EQ1Rfc2NhbGVkX3NpemUgaXMgMS4gIFRoYXQgY29tYmluYXRpb24gc2VlbXMgdW5saWtlbHkgdG8KKyAqIGJlIHdvcnRoIHByb3ZpZGluZyAtLS0gaWYgc29tZW9uZSB3YW50cyBhIDEvOHRoLXNpemUgcHJldmlldywgdGhleSBwcm9iYWJseQorICogd2FudCBpdCBxdWljayBhbmQgZGlydHksIHNvIGEgY29udGV4dC1mcmVlIHVwc2FtcGxlciBpcyBzdWZmaWNpZW50LgorICovCisKKworLyogUHJpdmF0ZSBidWZmZXIgY29udHJvbGxlciBvYmplY3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19kX21haW5fY29udHJvbGxlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBQb2ludGVyIHRvIGFsbG9jYXRlZCB3b3Jrc3BhY2UgKE0gb3IgTSsyIHJvdyBncm91cHMpLiAqLworICBKU0FNUEFSUkFZIGJ1ZmZlcltNQVhfQ09NUE9ORU5UU107CisKKyAgYm9vbGVhbiBidWZmZXJfZnVsbDsJCS8qIEhhdmUgd2UgZ290dGVuIGFuIGlNQ1Ugcm93IGZyb20gZGVjb2Rlcj8gKi8KKyAgSkRJTUVOU0lPTiByb3dncm91cF9jdHI7CS8qIGNvdW50cyByb3cgZ3JvdXBzIG91dHB1dCB0byBwb3N0cHJvY2Vzc29yICovCisKKyAgLyogUmVtYWluaW5nIGZpZWxkcyBhcmUgb25seSB1c2VkIGluIHRoZSBjb250ZXh0IGNhc2UuICovCisKKyAgLyogVGhlc2UgYXJlIHRoZSBtYXN0ZXIgcG9pbnRlcnMgdG8gdGhlIGZ1bm55LW9yZGVyIHBvaW50ZXIgbGlzdHMuICovCisgIEpTQU1QSU1BR0UgeGJ1ZmZlclsyXTsJLyogcG9pbnRlcnMgdG8gd2VpcmQgcG9pbnRlciBsaXN0cyAqLworCisgIGludCB3aGljaHB0cjsJCQkvKiBpbmRpY2F0ZXMgd2hpY2ggcG9pbnRlciBzZXQgaXMgbm93IGluIHVzZSAqLworICBpbnQgY29udGV4dF9zdGF0ZTsJCS8qIHByb2Nlc3NfZGF0YSBzdGF0ZSBtYWNoaW5lIHN0YXR1cyAqLworICBKRElNRU5TSU9OIHJvd2dyb3Vwc19hdmFpbDsJLyogcm93IGdyb3VwcyBhdmFpbGFibGUgdG8gcG9zdHByb2Nlc3NvciAqLworICBKRElNRU5TSU9OIGlNQ1Vfcm93X2N0cjsJLyogY291bnRzIGlNQ1Ugcm93cyB0byBkZXRlY3QgaW1hZ2UgdG9wL2JvdCAqLworfSBteV9tYWluX2NvbnRyb2xsZXI7CisKK3R5cGVkZWYgbXlfbWFpbl9jb250cm9sbGVyICogbXlfbWFpbl9wdHI7CisKKy8qIGNvbnRleHRfc3RhdGUgdmFsdWVzOiAqLworI2RlZmluZSBDVFhfUFJFUEFSRV9GT1JfSU1DVQkwCS8qIG5lZWQgdG8gcHJlcGFyZSBmb3IgTUNVIHJvdyAqLworI2RlZmluZSBDVFhfUFJPQ0VTU19JTUNVCTEJLyogZmVlZGluZyBpTUNVIHRvIHBvc3Rwcm9jZXNzb3IgKi8KKyNkZWZpbmUgQ1RYX1BPU1RQT05FRF9ST1cJMgkvKiBmZWVkaW5nIHBvc3Rwb25lZCByb3cgZ3JvdXAgKi8KKworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworTUVUSE9EREVGKHZvaWQpIHByb2Nlc3NfZGF0YV9zaW1wbGVfbWFpbgorCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLAorCSAgICAgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKK01FVEhPRERFRih2b2lkKSBwcm9jZXNzX2RhdGFfY29udGV4dF9tYWluCisJSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsCisJICAgICBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOworI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAorTUVUSE9EREVGKHZvaWQpIHByb2Nlc3NfZGF0YV9jcmFua19wb3N0CisJSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsCisJICAgICBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOworI2VuZGlmCisKKworTE9DQUwodm9pZCkKK2FsbG9jX2Z1bm55X3BvaW50ZXJzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBmdW5ueSBwb2ludGVyIGxpc3RzLgorICogVGhpcyBpcyBkb25lIG9ubHkgb25jZSwgbm90IG9uY2UgcGVyIHBhc3MuCisgKi8KK3sKKyAgbXlfbWFpbl9wdHIgbWFpbiA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47CisgIGludCBjaSwgcmdyb3VwOworICBpbnQgTSA9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICBKU0FNUEFSUkFZIHhidWY7CisKKyAgLyogR2V0IHRvcC1sZXZlbCBzcGFjZSBmb3IgY29tcG9uZW50IGFycmF5IHBvaW50ZXJzLgorICAgKiBXZSBhbGxvYyBib3RoIGFycmF5cyB3aXRoIG9uZSBjYWxsIHRvIHNhdmUgYSBmZXcgY3ljbGVzLgorICAgKi8KKyAgbWFpbi0+eGJ1ZmZlclswXSA9IChKU0FNUElNQUdFKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJY2luZm8tPm51bV9jb21wb25lbnRzICogMiAqIFNJWkVPRihKU0FNUEFSUkFZKSk7CisgIG1haW4tPnhidWZmZXJbMV0gPSBtYWluLT54YnVmZmVyWzBdICsgY2luZm8tPm51bV9jb21wb25lbnRzOworCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgcmdyb3VwID0gKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIC8KKyAgICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOyAvKiBoZWlnaHQgb2YgYSByb3cgZ3JvdXAgb2YgY29tcG9uZW50ICovCisgICAgLyogR2V0IHNwYWNlIGZvciBwb2ludGVyIGxpc3RzIC0tLSBNKzQgcm93IGdyb3VwcyBpbiBlYWNoIGxpc3QuCisgICAgICogV2UgYWxsb2MgYm90aCBwb2ludGVyIGxpc3RzIHdpdGggb25lIGNhbGwgdG8gc2F2ZSBhIGZldyBjeWNsZXMuCisgICAgICovCisgICAgeGJ1ZiA9IChKU0FNUEFSUkFZKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIDIgKiAocmdyb3VwICogKE0gKyA0KSkgKiBTSVpFT0YoSlNBTVBST1cpKTsKKyAgICB4YnVmICs9IHJncm91cDsJCS8qIHdhbnQgb25lIHJvdyBncm91cCBhdCBuZWdhdGl2ZSBvZmZzZXRzICovCisgICAgbWFpbi0+eGJ1ZmZlclswXVtjaV0gPSB4YnVmOworICAgIHhidWYgKz0gcmdyb3VwICogKE0gKyA0KTsKKyAgICBtYWluLT54YnVmZmVyWzFdW2NpXSA9IHhidWY7CisgIH0KK30KKworCitMT0NBTCh2b2lkKQorbWFrZV9mdW5ueV9wb2ludGVycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIENyZWF0ZSB0aGUgZnVubnkgcG9pbnRlciBsaXN0cyBkaXNjdXNzZWQgaW4gdGhlIGNvbW1lbnRzIGFib3ZlLgorICogVGhlIGFjdHVhbCB3b3Jrc3BhY2UgaXMgYWxyZWFkeSBhbGxvY2F0ZWQgKGluIG1haW4tPmJ1ZmZlciksCisgKiBhbmQgdGhlIHNwYWNlIGZvciB0aGUgcG9pbnRlciBsaXN0cyBpcyBhbGxvY2F0ZWQgdG9vLgorICogVGhpcyByb3V0aW5lIGp1c3QgZmlsbHMgaW4gdGhlIGN1cmlvdXNseSBvcmRlcmVkIGxpc3RzLgorICogVGhpcyB3aWxsIGJlIHJlcGVhdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBwYXNzLgorICovCit7CisgIG15X21haW5fcHRyIG1haW4gPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOworICBpbnQgY2ksIGksIHJncm91cDsKKyAgaW50IE0gPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgSlNBTVBBUlJBWSBidWYsIHhidWYwLCB4YnVmMTsKKworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIHJncm91cCA9IChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSAvCisgICAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsgLyogaGVpZ2h0IG9mIGEgcm93IGdyb3VwIG9mIGNvbXBvbmVudCAqLworICAgIHhidWYwID0gbWFpbi0+eGJ1ZmZlclswXVtjaV07CisgICAgeGJ1ZjEgPSBtYWluLT54YnVmZmVyWzFdW2NpXTsKKyAgICAvKiBGaXJzdCBjb3B5IHRoZSB3b3Jrc3BhY2UgcG9pbnRlcnMgYXMtaXMgKi8KKyAgICBidWYgPSBtYWluLT5idWZmZXJbY2ldOworICAgIGZvciAoaSA9IDA7IGkgPCByZ3JvdXAgKiAoTSArIDIpOyBpKyspIHsKKyAgICAgIHhidWYwW2ldID0geGJ1ZjFbaV0gPSBidWZbaV07CisgICAgfQorICAgIC8qIEluIHRoZSBzZWNvbmQgbGlzdCwgcHV0IHRoZSBsYXN0IGZvdXIgcm93IGdyb3VwcyBpbiBzd2FwcGVkIG9yZGVyICovCisgICAgZm9yIChpID0gMDsgaSA8IHJncm91cCAqIDI7IGkrKykgeworICAgICAgeGJ1ZjFbcmdyb3VwKihNLTIpICsgaV0gPSBidWZbcmdyb3VwKk0gKyBpXTsKKyAgICAgIHhidWYxW3Jncm91cCpNICsgaV0gPSBidWZbcmdyb3VwKihNLTIpICsgaV07CisgICAgfQorICAgIC8qIFRoZSB3cmFwYXJvdW5kIHBvaW50ZXJzIGF0IHRvcCBhbmQgYm90dG9tIHdpbGwgYmUgZmlsbGVkIGxhdGVyCisgICAgICogKHNlZSBzZXRfd3JhcGFyb3VuZF9wb2ludGVycywgYmVsb3cpLiAgSW5pdGlhbGx5IHdlIHdhbnQgdGhlICJhYm92ZSIKKyAgICAgKiBwb2ludGVycyB0byBkdXBsaWNhdGUgdGhlIGZpcnN0IGFjdHVhbCBkYXRhIGxpbmUuICBUaGlzIG9ubHkgbmVlZHMKKyAgICAgKiB0byBoYXBwZW4gaW4geGJ1ZmZlclswXS4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcmdyb3VwOyBpKyspIHsKKyAgICAgIHhidWYwW2kgLSByZ3JvdXBdID0geGJ1ZjBbMF07CisgICAgfQorICB9Cit9CisKKworTE9DQUwodm9pZCkKK3NldF93cmFwYXJvdW5kX3BvaW50ZXJzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogU2V0IHVwIHRoZSAid3JhcGFyb3VuZCIgcG9pbnRlcnMgYXQgdG9wIGFuZCBib3R0b20gb2YgdGhlIHBvaW50ZXIgbGlzdHMuCisgKiBUaGlzIGNoYW5nZXMgdGhlIHBvaW50ZXIgbGlzdCBzdGF0ZSBmcm9tIHRvcC1vZi1pbWFnZSB0byB0aGUgbm9ybWFsIHN0YXRlLgorICovCit7CisgIG15X21haW5fcHRyIG1haW4gPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOworICBpbnQgY2ksIGksIHJncm91cDsKKyAgaW50IE0gPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgSlNBTVBBUlJBWSB4YnVmMCwgeGJ1ZjE7CisKKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICByZ3JvdXAgPSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSkgLworICAgICAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7IC8qIGhlaWdodCBvZiBhIHJvdyBncm91cCBvZiBjb21wb25lbnQgKi8KKyAgICB4YnVmMCA9IG1haW4tPnhidWZmZXJbMF1bY2ldOworICAgIHhidWYxID0gbWFpbi0+eGJ1ZmZlclsxXVtjaV07CisgICAgZm9yIChpID0gMDsgaSA8IHJncm91cDsgaSsrKSB7CisgICAgICB4YnVmMFtpIC0gcmdyb3VwXSA9IHhidWYwW3Jncm91cCooTSsxKSArIGldOworICAgICAgeGJ1ZjFbaSAtIHJncm91cF0gPSB4YnVmMVtyZ3JvdXAqKE0rMSkgKyBpXTsKKyAgICAgIHhidWYwW3Jncm91cCooTSsyKSArIGldID0geGJ1ZjBbaV07CisgICAgICB4YnVmMVtyZ3JvdXAqKE0rMikgKyBpXSA9IHhidWYxW2ldOworICAgIH0KKyAgfQorfQorCisKK0xPQ0FMKHZvaWQpCitzZXRfYm90dG9tX3BvaW50ZXJzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogQ2hhbmdlIHRoZSBwb2ludGVyIGxpc3RzIHRvIGR1cGxpY2F0ZSB0aGUgbGFzdCBzYW1wbGUgcm93IGF0IHRoZSBib3R0b20KKyAqIG9mIHRoZSBpbWFnZS4gIHdoaWNocHRyIGluZGljYXRlcyB3aGljaCB4YnVmZmVyIGhvbGRzIHRoZSBmaW5hbCBpTUNVIHJvdy4KKyAqIEFsc28gc2V0cyByb3dncm91cHNfYXZhaWwgdG8gaW5kaWNhdGUgbnVtYmVyIG9mIG5vbmR1bW15IHJvdyBncm91cHMgaW4gcm93LgorICovCit7CisgIG15X21haW5fcHRyIG1haW4gPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOworICBpbnQgY2ksIGksIHJncm91cCwgaU1DVWhlaWdodCwgcm93c19sZWZ0OworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICBKU0FNUEFSUkFZIHhidWY7CisKKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAvKiBDb3VudCBzYW1wbGUgcm93cyBpbiBvbmUgaU1DVSByb3cgYW5kIGluIG9uZSByb3cgZ3JvdXAgKi8KKyAgICBpTUNVaGVpZ2h0ID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKKyAgICByZ3JvdXAgPSBpTUNVaGVpZ2h0IC8gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgICAgLyogQ291bnQgbm9uZHVtbXkgc2FtcGxlIHJvd3MgcmVtYWluaW5nIGZvciB0aGlzIGNvbXBvbmVudCAqLworICAgIHJvd3NfbGVmdCA9IChpbnQpIChjb21wcHRyLT5kb3duc2FtcGxlZF9oZWlnaHQgJSAoSkRJTUVOU0lPTikgaU1DVWhlaWdodCk7CisgICAgaWYgKHJvd3NfbGVmdCA9PSAwKSByb3dzX2xlZnQgPSBpTUNVaGVpZ2h0OworICAgIC8qIENvdW50IG5vbmR1bW15IHJvdyBncm91cHMuICBTaG91bGQgZ2V0IHNhbWUgYW5zd2VyIGZvciBlYWNoIGNvbXBvbmVudCwKKyAgICAgKiBzbyB3ZSBuZWVkIG9ubHkgZG8gaXQgb25jZS4KKyAgICAgKi8KKyAgICBpZiAoY2kgPT0gMCkgeworICAgICAgbWFpbi0+cm93Z3JvdXBzX2F2YWlsID0gKEpESU1FTlNJT04pICgocm93c19sZWZ0LTEpIC8gcmdyb3VwICsgMSk7CisgICAgfQorICAgIC8qIER1cGxpY2F0ZSB0aGUgbGFzdCByZWFsIHNhbXBsZSByb3cgcmdyb3VwKjIgdGltZXM7IHRoaXMgcGFkcyBvdXQgdGhlCisgICAgICogbGFzdCBwYXJ0aWFsIHJvd2dyb3VwIGFuZCBlbnN1cmVzIGF0IGxlYXN0IG9uZSBmdWxsIHJvd2dyb3VwIG9mIGNvbnRleHQuCisgICAgICovCisgICAgeGJ1ZiA9IG1haW4tPnhidWZmZXJbbWFpbi0+d2hpY2hwdHJdW2NpXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcmdyb3VwICogMjsgaSsrKSB7CisgICAgICB4YnVmW3Jvd3NfbGVmdCArIGldID0geGJ1Zltyb3dzX2xlZnQtMV07CisgICAgfQorICB9Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIGEgcHJvY2Vzc2luZyBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19tYWluIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkKK3sKKyAgbXlfbWFpbl9wdHIgbWFpbiA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47CisKKyAgc3dpdGNoIChwYXNzX21vZGUpIHsKKyAgY2FzZSBKQlVGX1BBU1NfVEhSVToKKyAgICBpZiAoY2luZm8tPnVwc2FtcGxlLT5uZWVkX2NvbnRleHRfcm93cykgeworICAgICAgbWFpbi0+cHViLnByb2Nlc3NfZGF0YSA9IHByb2Nlc3NfZGF0YV9jb250ZXh0X21haW47CisgICAgICBtYWtlX2Z1bm55X3BvaW50ZXJzKGNpbmZvKTsgLyogQ3JlYXRlIHRoZSB4YnVmZmVyW10gbGlzdHMgKi8KKyAgICAgIG1haW4tPndoaWNocHRyID0gMDsJLyogUmVhZCBmaXJzdCBpTUNVIHJvdyBpbnRvIHhidWZmZXJbMF0gKi8KKyAgICAgIG1haW4tPmNvbnRleHRfc3RhdGUgPSBDVFhfUFJFUEFSRV9GT1JfSU1DVTsKKyAgICAgIG1haW4tPmlNQ1Vfcm93X2N0ciA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFNpbXBsZSBjYXNlIHdpdGggbm8gY29udGV4dCBuZWVkZWQgKi8KKyAgICAgIG1haW4tPnB1Yi5wcm9jZXNzX2RhdGEgPSBwcm9jZXNzX2RhdGFfc2ltcGxlX21haW47CisgICAgfQorICAgIG1haW4tPmJ1ZmZlcl9mdWxsID0gRkFMU0U7CS8qIE1hcmsgYnVmZmVyIGVtcHR5ICovCisgICAgbWFpbi0+cm93Z3JvdXBfY3RyID0gMDsKKyAgICBicmVhazsKKyNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKKyAgY2FzZSBKQlVGX0NSQU5LX0RFU1Q6CisgICAgLyogRm9yIGxhc3QgcGFzcyBvZiAyLXBhc3MgcXVhbnRpemF0aW9uLCBqdXN0IGNyYW5rIHRoZSBwb3N0cHJvY2Vzc29yICovCisgICAgbWFpbi0+cHViLnByb2Nlc3NfZGF0YSA9IHByb2Nlc3NfZGF0YV9jcmFua19wb3N0OworICAgIGJyZWFrOworI2VuZGlmCisgIGRlZmF1bHQ6CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOworICAgIGJyZWFrOworICB9Cit9CisKKworLyoKKyAqIFByb2Nlc3Mgc29tZSBkYXRhLgorICogVGhpcyBoYW5kbGVzIHRoZSBzaW1wbGUgY2FzZSB3aGVyZSBubyBjb250ZXh0IGlzIHJlcXVpcmVkLgorICovCisKK01FVEhPRERFRih2b2lkKQorcHJvY2Vzc19kYXRhX3NpbXBsZV9tYWluIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAorCQkJICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQoreworICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKKyAgSkRJTUVOU0lPTiByb3dncm91cHNfYXZhaWw7CisKKyAgLyogUmVhZCBpbnB1dCBkYXRhIGlmIHdlIGhhdmVuJ3QgZmlsbGVkIHRoZSBtYWluIGJ1ZmZlciB5ZXQgKi8KKyAgaWYgKCEgbWFpbi0+YnVmZmVyX2Z1bGwpIHsKKyAgICBpZiAoISAoKmNpbmZvLT5jb2VmLT5kZWNvbXByZXNzX2RhdGEpIChjaW5mbywgbWFpbi0+YnVmZmVyKSkKKyAgICAgIHJldHVybjsJCQkvKiBzdXNwZW5zaW9uIGZvcmNlZCwgY2FuIGRvIG5vdGhpbmcgbW9yZSAqLworICAgIG1haW4tPmJ1ZmZlcl9mdWxsID0gVFJVRTsJLyogT0ssIHdlIGhhdmUgYW4gaU1DVSByb3cgdG8gd29yayB3aXRoICovCisgIH0KKworICAvKiBUaGVyZSBhcmUgYWx3YXlzIG1pbl9EQ1Rfc2NhbGVkX3NpemUgcm93IGdyb3VwcyBpbiBhbiBpTUNVIHJvdy4gKi8KKyAgcm93Z3JvdXBzX2F2YWlsID0gKEpESU1FTlNJT04pIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOworICAvKiBOb3RlOiBhdCB0aGUgYm90dG9tIG9mIHRoZSBpbWFnZSwgd2UgbWF5IHBhc3MgZXh0cmEgZ2FyYmFnZSByb3cgZ3JvdXBzCisgICAqIHRvIHRoZSBwb3N0cHJvY2Vzc29yLiAgVGhlIHBvc3Rwcm9jZXNzb3IgaGFzIHRvIGNoZWNrIGZvciBib3R0b20KKyAgICogb2YgaW1hZ2UgYW55d2F5IChhdCByb3cgcmVzb2x1dGlvbiksIHNvIG5vIHBvaW50IGluIHVzIGRvaW5nIGl0IHRvby4KKyAgICovCisKKyAgLyogRmVlZCB0aGUgcG9zdHByb2Nlc3NvciAqLworICAoKmNpbmZvLT5wb3N0LT5wb3N0X3Byb2Nlc3NfZGF0YSkgKGNpbmZvLCBtYWluLT5idWZmZXIsCisJCQkJICAgICAmbWFpbi0+cm93Z3JvdXBfY3RyLCByb3dncm91cHNfYXZhaWwsCisJCQkJICAgICBvdXRwdXRfYnVmLCBvdXRfcm93X2N0ciwgb3V0X3Jvd3NfYXZhaWwpOworCisgIC8qIEhhcyBwb3N0cHJvY2Vzc29yIGNvbnN1bWVkIGFsbCB0aGUgZGF0YSB5ZXQ/IElmIHNvLCBtYXJrIGJ1ZmZlciBlbXB0eSAqLworICBpZiAobWFpbi0+cm93Z3JvdXBfY3RyID49IHJvd2dyb3Vwc19hdmFpbCkgeworICAgIG1haW4tPmJ1ZmZlcl9mdWxsID0gRkFMU0U7CisgICAgbWFpbi0+cm93Z3JvdXBfY3RyID0gMDsKKyAgfQorfQorCisKKy8qCisgKiBQcm9jZXNzIHNvbWUgZGF0YS4KKyAqIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBjb250ZXh0IHJvd3MgbXVzdCBiZSBwcm92aWRlZC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3Byb2Nlc3NfZGF0YV9jb250ZXh0X21haW4gKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAorCQkJICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkKK3sKKyAgbXlfbWFpbl9wdHIgbWFpbiA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47CisKKyAgLyogUmVhZCBpbnB1dCBkYXRhIGlmIHdlIGhhdmVuJ3QgZmlsbGVkIHRoZSBtYWluIGJ1ZmZlciB5ZXQgKi8KKyAgaWYgKCEgbWFpbi0+YnVmZmVyX2Z1bGwpIHsKKyAgICBpZiAoISAoKmNpbmZvLT5jb2VmLT5kZWNvbXByZXNzX2RhdGEpIChjaW5mbywKKwkJCQkJICAgbWFpbi0+eGJ1ZmZlclttYWluLT53aGljaHB0cl0pKQorICAgICAgcmV0dXJuOwkJCS8qIHN1c3BlbnNpb24gZm9yY2VkLCBjYW4gZG8gbm90aGluZyBtb3JlICovCisgICAgbWFpbi0+YnVmZmVyX2Z1bGwgPSBUUlVFOwkvKiBPSywgd2UgaGF2ZSBhbiBpTUNVIHJvdyB0byB3b3JrIHdpdGggKi8KKyAgICBtYWluLT5pTUNVX3Jvd19jdHIrKzsJLyogY291bnQgcm93cyByZWNlaXZlZCAqLworICB9CisKKyAgLyogUG9zdHByb2Nlc3NvciB0eXBpY2FsbHkgd2lsbCBub3Qgc3dhbGxvdyBhbGwgdGhlIGlucHV0IGRhdGEgaXQgaXMgaGFuZGVkCisgICAqIGluIG9uZSBjYWxsIChkdWUgdG8gZmlsbGluZyB0aGUgb3V0cHV0IGJ1ZmZlciBmaXJzdCkuICBNdXN0IGJlIHByZXBhcmVkCisgICAqIHRvIGV4aXQgYW5kIHJlc3RhcnQuICBUaGlzIHN3aXRjaCBsZXRzIHVzIGtlZXAgdHJhY2sgb2YgaG93IGZhciB3ZSBnb3QuCisgICAqIE5vdGUgdGhhdCBlYWNoIGNhc2UgZmFsbHMgdGhyb3VnaCB0byB0aGUgbmV4dCBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24uCisgICAqLworICBzd2l0Y2ggKG1haW4tPmNvbnRleHRfc3RhdGUpIHsKKyAgY2FzZSBDVFhfUE9TVFBPTkVEX1JPVzoKKyAgICAvKiBDYWxsIHBvc3Rwcm9jZXNzb3IgdXNpbmcgcHJldmlvdXNseSBzZXQgcG9pbnRlcnMgZm9yIHBvc3Rwb25lZCByb3cgKi8KKyAgICAoKmNpbmZvLT5wb3N0LT5wb3N0X3Byb2Nlc3NfZGF0YSkgKGNpbmZvLCBtYWluLT54YnVmZmVyW21haW4tPndoaWNocHRyXSwKKwkJCSZtYWluLT5yb3dncm91cF9jdHIsIG1haW4tPnJvd2dyb3Vwc19hdmFpbCwKKwkJCW91dHB1dF9idWYsIG91dF9yb3dfY3RyLCBvdXRfcm93c19hdmFpbCk7CisgICAgaWYgKG1haW4tPnJvd2dyb3VwX2N0ciA8IG1haW4tPnJvd2dyb3Vwc19hdmFpbCkKKyAgICAgIHJldHVybjsJCQkvKiBOZWVkIHRvIHN1c3BlbmQgKi8KKyAgICBtYWluLT5jb250ZXh0X3N0YXRlID0gQ1RYX1BSRVBBUkVfRk9SX0lNQ1U7CisgICAgaWYgKCpvdXRfcm93X2N0ciA+PSBvdXRfcm93c19hdmFpbCkKKyAgICAgIHJldHVybjsJCQkvKiBQb3N0cHJvY2Vzc29yIGV4YWN0bHkgZmlsbGVkIG91dHB1dCBidWYgKi8KKyAgICAvKkZBTExUSFJPVUdIKi8KKyAgY2FzZSBDVFhfUFJFUEFSRV9GT1JfSU1DVToKKyAgICAvKiBQcmVwYXJlIHRvIHByb2Nlc3MgZmlyc3QgTS0xIHJvdyBncm91cHMgb2YgdGhpcyBpTUNVIHJvdyAqLworICAgIG1haW4tPnJvd2dyb3VwX2N0ciA9IDA7CisgICAgbWFpbi0+cm93Z3JvdXBzX2F2YWlsID0gKEpESU1FTlNJT04pIChjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSAtIDEpOworICAgIC8qIENoZWNrIGZvciBib3R0b20gb2YgaW1hZ2U6IGlmIHNvLCB0d2VhayBwb2ludGVycyB0byAiZHVwbGljYXRlIgorICAgICAqIHRoZSBsYXN0IHNhbXBsZSByb3csIGFuZCBhZGp1c3Qgcm93Z3JvdXBzX2F2YWlsIHRvIGlnbm9yZSBwYWRkaW5nIHJvd3MuCisgICAgICovCisgICAgaWYgKG1haW4tPmlNQ1Vfcm93X2N0ciA9PSBjaW5mby0+dG90YWxfaU1DVV9yb3dzKQorICAgICAgc2V0X2JvdHRvbV9wb2ludGVycyhjaW5mbyk7CisgICAgbWFpbi0+Y29udGV4dF9zdGF0ZSA9IENUWF9QUk9DRVNTX0lNQ1U7CisgICAgLypGQUxMVEhST1VHSCovCisgIGNhc2UgQ1RYX1BST0NFU1NfSU1DVToKKyAgICAvKiBDYWxsIHBvc3Rwcm9jZXNzb3IgdXNpbmcgcHJldmlvdXNseSBzZXQgcG9pbnRlcnMgKi8KKyAgICAoKmNpbmZvLT5wb3N0LT5wb3N0X3Byb2Nlc3NfZGF0YSkgKGNpbmZvLCBtYWluLT54YnVmZmVyW21haW4tPndoaWNocHRyXSwKKwkJCSZtYWluLT5yb3dncm91cF9jdHIsIG1haW4tPnJvd2dyb3Vwc19hdmFpbCwKKwkJCW91dHB1dF9idWYsIG91dF9yb3dfY3RyLCBvdXRfcm93c19hdmFpbCk7CisgICAgaWYgKG1haW4tPnJvd2dyb3VwX2N0ciA8IG1haW4tPnJvd2dyb3Vwc19hdmFpbCkKKyAgICAgIHJldHVybjsJCQkvKiBOZWVkIHRvIHN1c3BlbmQgKi8KKyAgICAvKiBBZnRlciB0aGUgZmlyc3QgaU1DVSwgY2hhbmdlIHdyYXBhcm91bmQgcG9pbnRlcnMgdG8gbm9ybWFsIHN0YXRlICovCisgICAgaWYgKG1haW4tPmlNQ1Vfcm93X2N0ciA9PSAxKQorICAgICAgc2V0X3dyYXBhcm91bmRfcG9pbnRlcnMoY2luZm8pOworICAgIC8qIFByZXBhcmUgdG8gbG9hZCBuZXcgaU1DVSByb3cgdXNpbmcgb3RoZXIgeGJ1ZmZlciBsaXN0ICovCisgICAgbWFpbi0+d2hpY2hwdHIgXj0gMTsJLyogMD0+MSBvciAxPT4wICovCisgICAgbWFpbi0+YnVmZmVyX2Z1bGwgPSBGQUxTRTsKKyAgICAvKiBTdGlsbCBuZWVkIHRvIHByb2Nlc3MgbGFzdCByb3cgZ3JvdXAgb2YgdGhpcyBpTUNVIHJvdywgKi8KKyAgICAvKiB3aGljaCBpcyBzYXZlZCBhdCBpbmRleCBNKzEgb2YgdGhlIG90aGVyIHhidWZmZXIgKi8KKyAgICBtYWluLT5yb3dncm91cF9jdHIgPSAoSkRJTUVOU0lPTikgKGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplICsgMSk7CisgICAgbWFpbi0+cm93Z3JvdXBzX2F2YWlsID0gKEpESU1FTlNJT04pIChjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSArIDIpOworICAgIG1haW4tPmNvbnRleHRfc3RhdGUgPSBDVFhfUE9TVFBPTkVEX1JPVzsKKyAgfQorfQorCisKKy8qCisgKiBQcm9jZXNzIHNvbWUgZGF0YS4KKyAqIEZpbmFsIHBhc3Mgb2YgdHdvLXBhc3MgcXVhbnRpemF0aW9uOiBqdXN0IGNhbGwgdGhlIHBvc3Rwcm9jZXNzb3IuCisgKiBTb3VyY2UgZGF0YSB3aWxsIGJlIHRoZSBwb3N0cHJvY2Vzc29yIGNvbnRyb2xsZXIncyBpbnRlcm5hbCBidWZmZXIuCisgKi8KKworI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAorCitNRVRIT0RERUYodm9pZCkKK3Byb2Nlc3NfZGF0YV9jcmFua19wb3N0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJCQkgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkKK3sKKyAgKCpjaW5mby0+cG9zdC0+cG9zdF9wcm9jZXNzX2RhdGEpIChjaW5mbywgKEpTQU1QSU1BR0UpIE5VTEwsCisJCQkJICAgICAoSkRJTUVOU0lPTiAqKSBOVUxMLCAoSkRJTUVOU0lPTikgMCwKKwkJCQkgICAgIG91dHB1dF9idWYsIG91dF9yb3dfY3RyLCBvdXRfcm93c19hdmFpbCk7Cit9CisKKyNlbmRpZiAvKiBRVUFOVF8yUEFTU19TVVBQT1JURUQgKi8KKworCisvKgorICogSW5pdGlhbGl6ZSBtYWluIGJ1ZmZlciBjb250cm9sbGVyLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfZF9tYWluX2NvbnRyb2xsZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikKK3sKKyAgbXlfbWFpbl9wdHIgbWFpbjsKKyAgaW50IGNpLCByZ3JvdXAsIG5ncm91cHM7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgbWFpbiA9IChteV9tYWluX3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9tYWluX2NvbnRyb2xsZXIpKTsKKyAgY2luZm8tPm1haW4gPSAoc3RydWN0IGpwZWdfZF9tYWluX2NvbnRyb2xsZXIgKikgbWFpbjsKKyAgbWFpbi0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX21haW47CisKKyAgaWYgKG5lZWRfZnVsbF9idWZmZXIpCQkvKiBzaG91bGRuJ3QgaGFwcGVuICovCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOworCisgIC8qIEFsbG9jYXRlIHRoZSB3b3Jrc3BhY2UuCisgICAqIG5ncm91cHMgaXMgdGhlIG51bWJlciBvZiByb3cgZ3JvdXBzIHdlIG5lZWQuCisgICAqLworICBpZiAoY2luZm8tPnVwc2FtcGxlLT5uZWVkX2NvbnRleHRfcm93cykgeworICAgIGlmIChjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSA8IDIpIC8qIHVuc3VwcG9ydGVkLCBzZWUgY29tbWVudHMgYWJvdmUgKi8KKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9USU1QTCk7CisgICAgYWxsb2NfZnVubnlfcG9pbnRlcnMoY2luZm8pOyAvKiBBbGxvYyBzcGFjZSBmb3IgeGJ1ZmZlcltdIGxpc3RzICovCisgICAgbmdyb3VwcyA9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplICsgMjsKKyAgfSBlbHNlIHsKKyAgICBuZ3JvdXBzID0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgIH0KKworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIHJncm91cCA9IChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSAvCisgICAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsgLyogaGVpZ2h0IG9mIGEgcm93IGdyb3VwIG9mIGNvbXBvbmVudCAqLworICAgIG1haW4tPmJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKwkJCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplLAorCQkJIChKRElNRU5TSU9OKSAocmdyb3VwICogbmdyb3VwcykpOworICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRtYXJrZXIuYyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qZG1hcmtlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0OWEzYzAKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRtYXJrZXIuYwpAQCAtMCwwICsxLDEzOTMgQEAKKy8qCisgKiBqZG1hcmtlci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gZGVjb2RlIEpQRUcgZGF0YXN0cmVhbSBtYXJrZXJzLgorICogTW9zdCBvZiB0aGUgY29tcGxleGl0eSBhcmlzZXMgZnJvbSBvdXIgZGVzaXJlIHRvIHN1cHBvcnQgaW5wdXQKKyAqIHN1c3BlbnNpb246IGlmIG5vdCBhbGwgb2YgdGhlIGRhdGEgZm9yIGEgbWFya2VyIGlzIGF2YWlsYWJsZSwKKyAqIHdlIG11c3QgZXhpdCBiYWNrIHRvIHRoZSBhcHBsaWNhdGlvbi4gIE9uIHJlc3VtcHRpb24sIHdlIHJlcHJvY2VzcworICogdGhlIG1hcmtlci4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKwordHlwZWRlZiBlbnVtIHsJCQkvKiBKUEVHIG1hcmtlciBjb2RlcyAqLworICBNX1NPRjAgID0gMHhjMCwKKyAgTV9TT0YxICA9IDB4YzEsCisgIE1fU09GMiAgPSAweGMyLAorICBNX1NPRjMgID0gMHhjMywKKyAgCisgIE1fU09GNSAgPSAweGM1LAorICBNX1NPRjYgID0gMHhjNiwKKyAgTV9TT0Y3ICA9IDB4YzcsCisgIAorICBNX0pQRyAgID0gMHhjOCwKKyAgTV9TT0Y5ICA9IDB4YzksCisgIE1fU09GMTAgPSAweGNhLAorICBNX1NPRjExID0gMHhjYiwKKyAgCisgIE1fU09GMTMgPSAweGNkLAorICBNX1NPRjE0ID0gMHhjZSwKKyAgTV9TT0YxNSA9IDB4Y2YsCisgIAorICBNX0RIVCAgID0gMHhjNCwKKyAgCisgIE1fREFDICAgPSAweGNjLAorICAKKyAgTV9SU1QwICA9IDB4ZDAsCisgIE1fUlNUMSAgPSAweGQxLAorICBNX1JTVDIgID0gMHhkMiwKKyAgTV9SU1QzICA9IDB4ZDMsCisgIE1fUlNUNCAgPSAweGQ0LAorICBNX1JTVDUgID0gMHhkNSwKKyAgTV9SU1Q2ICA9IDB4ZDYsCisgIE1fUlNUNyAgPSAweGQ3LAorICAKKyAgTV9TT0kgICA9IDB4ZDgsCisgIE1fRU9JICAgPSAweGQ5LAorICBNX1NPUyAgID0gMHhkYSwKKyAgTV9EUVQgICA9IDB4ZGIsCisgIE1fRE5MICAgPSAweGRjLAorICBNX0RSSSAgID0gMHhkZCwKKyAgTV9ESFAgICA9IDB4ZGUsCisgIE1fRVhQICAgPSAweGRmLAorICAKKyAgTV9BUFAwICA9IDB4ZTAsCisgIE1fQVBQMSAgPSAweGUxLAorICBNX0FQUDIgID0gMHhlMiwKKyAgTV9BUFAzICA9IDB4ZTMsCisgIE1fQVBQNCAgPSAweGU0LAorICBNX0FQUDUgID0gMHhlNSwKKyAgTV9BUFA2ICA9IDB4ZTYsCisgIE1fQVBQNyAgPSAweGU3LAorICBNX0FQUDggID0gMHhlOCwKKyAgTV9BUFA5ICA9IDB4ZTksCisgIE1fQVBQMTAgPSAweGVhLAorICBNX0FQUDExID0gMHhlYiwKKyAgTV9BUFAxMiA9IDB4ZWMsCisgIE1fQVBQMTMgPSAweGVkLAorICBNX0FQUDE0ID0gMHhlZSwKKyAgTV9BUFAxNSA9IDB4ZWYsCisgIAorICBNX0pQRzAgID0gMHhmMCwKKyAgTV9KUEcxMyA9IDB4ZmQsCisgIE1fQ09NICAgPSAweGZlLAorICAKKyAgTV9URU0gICA9IDB4MDEsCisgIAorICBNX0VSUk9SID0gMHgxMDAKK30gSlBFR19NQVJLRVI7CisKKworLyogUHJpdmF0ZSBzdGF0ZSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX21hcmtlcl9yZWFkZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogQXBwbGljYXRpb24tb3ZlcnJpZGFibGUgbWFya2VyIHByb2Nlc3NpbmcgbWV0aG9kcyAqLworICBqcGVnX21hcmtlcl9wYXJzZXJfbWV0aG9kIHByb2Nlc3NfQ09NOworICBqcGVnX21hcmtlcl9wYXJzZXJfbWV0aG9kIHByb2Nlc3NfQVBQblsxNl07CisKKyAgLyogTGltaXQgb24gbWFya2VyIGRhdGEgbGVuZ3RoIHRvIHNhdmUgZm9yIGVhY2ggbWFya2VyIHR5cGUgKi8KKyAgdW5zaWduZWQgaW50IGxlbmd0aF9saW1pdF9DT007CisgIHVuc2lnbmVkIGludCBsZW5ndGhfbGltaXRfQVBQblsxNl07CisKKyAgLyogU3RhdHVzIG9mIENPTS9BUFBuIG1hcmtlciBzYXZpbmcgKi8KKyAganBlZ19zYXZlZF9tYXJrZXJfcHRyIGN1cl9tYXJrZXI7CS8qIE5VTEwgaWYgbm90IHByb2Nlc3NpbmcgYSBtYXJrZXIgKi8KKyAgdW5zaWduZWQgaW50IGJ5dGVzX3JlYWQ7CQkvKiBkYXRhIGJ5dGVzIHJlYWQgc28gZmFyIGluIG1hcmtlciAqLworICAvKiBOb3RlOiBjdXJfbWFya2VyIGlzIG5vdCBsaW5rZWQgaW50byBtYXJrZXJfbGlzdCB1bnRpbCBpdCdzIGFsbCByZWFkLiAqLworfSBteV9tYXJrZXJfcmVhZGVyOworCit0eXBlZGVmIG15X21hcmtlcl9yZWFkZXIgKiBteV9tYXJrZXJfcHRyOworCisKKy8qCisgKiBNYWNyb3MgZm9yIGZldGNoaW5nIGRhdGEgZnJvbSB0aGUgZGF0YSBzb3VyY2UgbW9kdWxlLgorICoKKyAqIEF0IGFsbCB0aW1lcywgY2luZm8tPnNyYy0+bmV4dF9pbnB1dF9ieXRlIGFuZCAtPmJ5dGVzX2luX2J1ZmZlciByZWZsZWN0CisgKiB0aGUgY3VycmVudCByZXN0YXJ0IHBvaW50OyB3ZSB1cGRhdGUgdGhlbSBvbmx5IHdoZW4gd2UgaGF2ZSByZWFjaGVkIGEKKyAqIHN1aXRhYmxlIHBsYWNlIHRvIHJlc3RhcnQgaWYgYSBzdXNwZW5zaW9uIG9jY3Vycy4KKyAqLworCisvKiBEZWNsYXJlIGFuZCBpbml0aWFsaXplIGxvY2FsIGNvcGllcyBvZiBpbnB1dCBwb2ludGVyL2NvdW50ICovCisjZGVmaW5lIElOUFVUX1ZBUlMoY2luZm8pICBcCisJc3RydWN0IGpwZWdfc291cmNlX21nciAqIGRhdGFzcmMgPSAoY2luZm8pLT5zcmM7ICBcCisJY29uc3QgSk9DVEVUICogbmV4dF9pbnB1dF9ieXRlID0gZGF0YXNyYy0+bmV4dF9pbnB1dF9ieXRlOyAgXAorCXNpemVfdCBieXRlc19pbl9idWZmZXIgPSBkYXRhc3JjLT5ieXRlc19pbl9idWZmZXIKKworLyogVW5sb2FkIHRoZSBsb2NhbCBjb3BpZXMgLS0tIGRvIHRoaXMgb25seSBhdCBhIHJlc3RhcnQgYm91bmRhcnkgKi8KKyNkZWZpbmUgSU5QVVRfU1lOQyhjaW5mbykgIFwKKwkoIGRhdGFzcmMtPm5leHRfaW5wdXRfYnl0ZSA9IG5leHRfaW5wdXRfYnl0ZSwgIFwKKwkgIGRhdGFzcmMtPmJ5dGVzX2luX2J1ZmZlciA9IGJ5dGVzX2luX2J1ZmZlciApCisKKy8qIFJlbG9hZCB0aGUgbG9jYWwgY29waWVzIC0tLSB1c2VkIG9ubHkgaW4gTUFLRV9CWVRFX0FWQUlMICovCisjZGVmaW5lIElOUFVUX1JFTE9BRChjaW5mbykgIFwKKwkoIG5leHRfaW5wdXRfYnl0ZSA9IGRhdGFzcmMtPm5leHRfaW5wdXRfYnl0ZSwgIFwKKwkgIGJ5dGVzX2luX2J1ZmZlciA9IGRhdGFzcmMtPmJ5dGVzX2luX2J1ZmZlciApCisKKy8qIEludGVybmFsIG1hY3JvIGZvciBJTlBVVF9CWVRFIGFuZCBJTlBVVF8yQllURVM6IG1ha2UgYSBieXRlIGF2YWlsYWJsZS4KKyAqIE5vdGUgd2UgZG8gKm5vdCogZG8gSU5QVVRfU1lOQyBiZWZvcmUgY2FsbGluZyBmaWxsX2lucHV0X2J1ZmZlciwKKyAqIGJ1dCB3ZSBtdXN0IHJlbG9hZCB0aGUgbG9jYWwgY29waWVzIGFmdGVyIGEgc3VjY2Vzc2Z1bCBmaWxsLgorICovCisjZGVmaW5lIE1BS0VfQllURV9BVkFJTChjaW5mbyxhY3Rpb24pICBcCisJaWYgKGJ5dGVzX2luX2J1ZmZlciA9PSAwKSB7ICBcCisJICBpZiAoISAoKmRhdGFzcmMtPmZpbGxfaW5wdXRfYnVmZmVyKSAoY2luZm8pKSAgXAorCSAgICB7IGFjdGlvbjsgfSAgXAorCSAgSU5QVVRfUkVMT0FEKGNpbmZvKTsgIFwKKwl9CisKKy8qIFJlYWQgYSBieXRlIGludG8gdmFyaWFibGUgVi4KKyAqIElmIG11c3Qgc3VzcGVuZCwgdGFrZSB0aGUgc3BlY2lmaWVkIGFjdGlvbiAodHlwaWNhbGx5ICJyZXR1cm4gRkFMU0UiKS4KKyAqLworI2RlZmluZSBJTlBVVF9CWVRFKGNpbmZvLFYsYWN0aW9uKSAgXAorCU1BS0VTVE1UKCBNQUtFX0JZVEVfQVZBSUwoY2luZm8sYWN0aW9uKTsgXAorCQkgIGJ5dGVzX2luX2J1ZmZlci0tOyBcCisJCSAgViA9IEdFVEpPQ1RFVCgqbmV4dF9pbnB1dF9ieXRlKyspOyApCisKKy8qIEFzIGFib3ZlLCBidXQgcmVhZCB0d28gYnl0ZXMgaW50ZXJwcmV0ZWQgYXMgYW4gdW5zaWduZWQgMTYtYml0IGludGVnZXIuCisgKiBWIHNob3VsZCBiZSBkZWNsYXJlZCB1bnNpZ25lZCBpbnQgb3IgcGVyaGFwcyBJTlQzMi4KKyAqLworI2RlZmluZSBJTlBVVF8yQllURVMoY2luZm8sVixhY3Rpb24pICBcCisJTUFLRVNUTVQoIE1BS0VfQllURV9BVkFJTChjaW5mbyxhY3Rpb24pOyBcCisJCSAgYnl0ZXNfaW5fYnVmZmVyLS07IFwKKwkJICBWID0gKCh1bnNpZ25lZCBpbnQpIEdFVEpPQ1RFVCgqbmV4dF9pbnB1dF9ieXRlKyspKSA8PCA4OyBcCisJCSAgTUFLRV9CWVRFX0FWQUlMKGNpbmZvLGFjdGlvbik7IFwKKwkJICBieXRlc19pbl9idWZmZXItLTsgXAorCQkgIFYgKz0gR0VUSk9DVEVUKCpuZXh0X2lucHV0X2J5dGUrKyk7ICkKKworCisvKgorICogUm91dGluZXMgdG8gcHJvY2VzcyBKUEVHIG1hcmtlcnMuCisgKgorICogRW50cnkgY29uZGl0aW9uOiBKUEVHIG1hcmtlciBpdHNlbGYgaGFzIGJlZW4gcmVhZCBhbmQgaXRzIGNvZGUgc2F2ZWQKKyAqICAgaW4gY2luZm8tPnVucmVhZF9tYXJrZXI7IGlucHV0IHJlc3RhcnQgcG9pbnQgaXMganVzdCBhZnRlciB0aGUgbWFya2VyLgorICoKKyAqIEV4aXQ6IGlmIHJldHVybiBUUlVFLCBoYXZlIHJlYWQgYW5kIHByb2Nlc3NlZCBhbnkgcGFyYW1ldGVycywgYW5kIGhhdmUKKyAqICAgdXBkYXRlZCB0aGUgcmVzdGFydCBwb2ludCB0byBwb2ludCBhZnRlciB0aGUgcGFyYW1ldGVycy4KKyAqICAgSWYgcmV0dXJuIEZBTFNFLCB3YXMgZm9yY2VkIHRvIHN1c3BlbmQgYmVmb3JlIHJlYWNoaW5nIGVuZCBvZgorICogICBtYXJrZXIgcGFyYW1ldGVyczsgcmVzdGFydCBwb2ludCBoYXMgbm90IGJlZW4gbW92ZWQuICBTYW1lIHJvdXRpbmUKKyAqICAgd2lsbCBiZSBjYWxsZWQgYWdhaW4gYWZ0ZXIgYXBwbGljYXRpb24gc3VwcGxpZXMgbW9yZSBpbnB1dCBkYXRhLgorICoKKyAqIFRoaXMgYXBwcm9hY2ggdG8gc3VzcGVuc2lvbiBhc3N1bWVzIHRoYXQgYWxsIG9mIGEgbWFya2VyJ3MgcGFyYW1ldGVycworICogY2FuIGZpdCBpbnRvIGEgc2luZ2xlIGlucHV0IGJ1ZmZlcmxvYWQuICBUaGlzIHNob3VsZCBob2xkIGZvciAibm9ybWFsIgorICogbWFya2Vycy4gIFNvbWUgQ09NL0FQUG4gbWFya2VycyBtaWdodCBoYXZlIGxhcmdlIHBhcmFtZXRlciBzZWdtZW50cworICogdGhhdCBtaWdodCBub3QgZml0LiAgSWYgd2UgYXJlIHNpbXBseSBkcm9wcGluZyBzdWNoIGEgbWFya2VyLCB3ZSB1c2UKKyAqIHNraXBfaW5wdXRfZGF0YSB0byBnZXQgcGFzdCBpdCwgYW5kIHRoZXJlYnkgcHV0IHRoZSBwcm9ibGVtIG9uIHRoZQorICogc291cmNlIG1hbmFnZXIncyBzaG91bGRlcnMuICBJZiB3ZSBhcmUgc2F2aW5nIHRoZSBtYXJrZXIncyBjb250ZW50cworICogaW50byBtZW1vcnksIHdlIHVzZSBhIHNsaWdodGx5IGRpZmZlcmVudCBjb252ZW50aW9uOiB3aGVuIGZvcmNlZCB0bworICogc3VzcGVuZCwgdGhlIG1hcmtlciBwcm9jZXNzb3IgdXBkYXRlcyB0aGUgcmVzdGFydCBwb2ludCB0byB0aGUgZW5kIG9mCisgKiB3aGF0IGl0J3MgY29uc3VtZWQgKGllLCB0aGUgZW5kIG9mIHRoZSBidWZmZXIpIGJlZm9yZSByZXR1cm5pbmcgRkFMU0UuCisgKiBPbiByZXN1bXB0aW9uLCBjaW5mby0+dW5yZWFkX21hcmtlciBzdGlsbCBjb250YWlucyB0aGUgbWFya2VyIGNvZGUsCisgKiBidXQgdGhlIGRhdGEgc291cmNlIHdpbGwgcG9pbnQgdG8gdGhlIG5leHQgY2h1bmsgb2YgbWFya2VyIGRhdGEuCisgKiBUaGUgbWFya2VyIHByb2Nlc3NvciBtdXN0IHJldGFpbiBpbnRlcm5hbCBzdGF0ZSB0byBkZWFsIHdpdGggdGhpcy4KKyAqCisgKiBOb3RlIHRoYXQgd2UgZG9uJ3QgYm90aGVyIHRvIGF2b2lkIGR1cGxpY2F0ZSB0cmFjZSBtZXNzYWdlcyBpZiBhCisgKiBzdXNwZW5zaW9uIG9jY3VycyB3aXRoaW4gbWFya2VyIHBhcmFtZXRlcnMuICBPdGhlciBzaWRlIGVmZmVjdHMKKyAqIHJlcXVpcmUgbW9yZSBjYXJlLgorICovCisKKworTE9DQUwoYm9vbGVhbikKK2dldF9zb2kgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBQcm9jZXNzIGFuIFNPSSBtYXJrZXIgKi8KK3sKKyAgaW50IGk7CisgIAorICBUUkFDRU1TKGNpbmZvLCAxLCBKVFJDX1NPSSk7CisKKyAgaWYgKGNpbmZvLT5tYXJrZXItPnNhd19TT0kpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9TT0lfRFVQTElDQVRFKTsKKworICAvKiBSZXNldCBhbGwgcGFyYW1ldGVycyB0aGF0IGFyZSBkZWZpbmVkIHRvIGJlIHJlc2V0IGJ5IFNPSSAqLworCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fQVJJVEhfVEJMUzsgaSsrKSB7CisgICAgY2luZm8tPmFyaXRoX2RjX0xbaV0gPSAwOworICAgIGNpbmZvLT5hcml0aF9kY19VW2ldID0gMTsKKyAgICBjaW5mby0+YXJpdGhfYWNfS1tpXSA9IDU7CisgIH0KKyAgY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwgPSAwOworCisgIC8qIFNldCBpbml0aWFsIGFzc3VtcHRpb25zIGZvciBjb2xvcnNwYWNlIGV0YyAqLworCisgIGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1VOS05PV047CisgIGNpbmZvLT5DQ0lSNjAxX3NhbXBsaW5nID0gRkFMU0U7IC8qIEFzc3VtZSBub24tQ0NJUiBzYW1wbGluZz8/PyAqLworCisgIGNpbmZvLT5zYXdfSkZJRl9tYXJrZXIgPSBGQUxTRTsKKyAgY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbiA9IDE7IC8qIHNldCBkZWZhdWx0IEpGSUYgQVBQMCB2YWx1ZXMgKi8KKyAgY2luZm8tPkpGSUZfbWlub3JfdmVyc2lvbiA9IDE7CisgIGNpbmZvLT5kZW5zaXR5X3VuaXQgPSAwOworICBjaW5mby0+WF9kZW5zaXR5ID0gMTsKKyAgY2luZm8tPllfZGVuc2l0eSA9IDE7CisgIGNpbmZvLT5zYXdfQWRvYmVfbWFya2VyID0gRkFMU0U7CisgIGNpbmZvLT5BZG9iZV90cmFuc2Zvcm0gPSAwOworCisgIGNpbmZvLT5tYXJrZXItPnNhd19TT0kgPSBUUlVFOworCisgIHJldHVybiBUUlVFOworfQorCisKK0xPQ0FMKGJvb2xlYW4pCitnZXRfc29mIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGlzX3Byb2csIGJvb2xlYW4gaXNfYXJpdGgpCisvKiBQcm9jZXNzIGEgU09GbiBtYXJrZXIgKi8KK3sKKyAgSU5UMzIgbGVuZ3RoOworICBpbnQgYywgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworICAvKiBMaXVTdW5saWFuZyBhZGRlZCAyMDExMTIwOSAqLworICBKRElNRU5TSU9OIGltYWdlX3dpZHRoLCBpbWFnZV9oZWlnaHQ7CisgIElOUFVUX1ZBUlMoY2luZm8pOworCisgIGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlID0gaXNfcHJvZzsKKyAgY2luZm8tPmFyaXRoX2NvZGUgPSBpc19hcml0aDsKKworICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKKworICBJTlBVVF9CWVRFKGNpbmZvLCBjaW5mby0+ZGF0YV9wcmVjaXNpb24sIHJldHVybiBGQUxTRSk7CisgIElOUFVUXzJCWVRFUyhjaW5mbywgaW1hZ2VfaGVpZ2h0LCByZXR1cm4gRkFMU0UpOworICBJTlBVVF8yQllURVMoY2luZm8sIGltYWdlX3dpZHRoLCByZXR1cm4gRkFMU0UpOworICBJTlBVVF9CWVRFKGNpbmZvLCBjaW5mby0+bnVtX2NvbXBvbmVudHMsIHJldHVybiBGQUxTRSk7CisKKyAgaWYgKGltYWdlX3dpZHRoIDw9IEpQRUdfTUFYX0RJTUVOU0lPTikKKwkgIGNpbmZvLT5pbWFnZV93aWR0aCA9IGltYWdlX3dpZHRoOworIAorICBpZiAoaW1hZ2VfaGVpZ2h0IDw9IEpQRUdfTUFYX0RJTUVOU0lPTikKKwkgIGNpbmZvLT5pbWFnZV9oZWlnaHQgPSBpbWFnZV9oZWlnaHQ7CisKKyAgbGVuZ3RoIC09IDg7CisKKyAgVFJBQ0VNUzQoY2luZm8sIDEsIEpUUkNfU09GLCBjaW5mby0+dW5yZWFkX21hcmtlciwKKwkgICAoaW50KSBjaW5mby0+aW1hZ2Vfd2lkdGgsIChpbnQpIGNpbmZvLT5pbWFnZV9oZWlnaHQsCisJICAgY2luZm8tPm51bV9jb21wb25lbnRzKTsKKworICBpZiAoY2luZm8tPm1hcmtlci0+c2F3X1NPRikKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1NPRl9EVVBMSUNBVEUpOworCisgIC8qIFdlIGRvbid0IHN1cHBvcnQgZmlsZXMgaW4gd2hpY2ggdGhlIGltYWdlIGhlaWdodCBpcyBpbml0aWFsbHkgc3BlY2lmaWVkICovCisgIC8qIGFzIDAgYW5kIGlzIGxhdGVyIHJlZGVmaW5lZCBieSBETkwuICBBcyBsb25nIGFzIHdlIGhhdmUgdG8gY2hlY2sgdGhhdCwgICovCisgIC8qIG1pZ2h0IGFzIHdlbGwgaGF2ZSBhIGdlbmVyYWwgc2FuaXR5IGNoZWNrLiAqLworICBpZiAoY2luZm8tPmltYWdlX2hlaWdodCA8PSAwIHx8IGNpbmZvLT5pbWFnZV93aWR0aCA8PSAwCisgICAgICB8fCBjaW5mby0+bnVtX2NvbXBvbmVudHMgPD0gMCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0VNUFRZX0lNQUdFKTsKKworICBpZiAobGVuZ3RoICE9IChjaW5mby0+bnVtX2NvbXBvbmVudHMgKiAzKSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9MRU5HVEgpOworCisgIGlmIChjaW5mby0+Y29tcF9pbmZvID09IE5VTEwpCS8qIGRvIG9ubHkgb25jZSwgZXZlbiBpZiBzdXNwZW5kICovCisgICAgY2luZm8tPmNvbXBfaW5mbyA9IChqcGVnX2NvbXBvbmVudF9pbmZvICopICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpCisJCQkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJIGNpbmZvLT5udW1fY29tcG9uZW50cyAqIFNJWkVPRihqcGVnX2NvbXBvbmVudF9pbmZvKSk7CisgIAorICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIGNvbXBwdHItPmNvbXBvbmVudF9pbmRleCA9IGNpOworICAgIElOUFVUX0JZVEUoY2luZm8sIGNvbXBwdHItPmNvbXBvbmVudF9pZCwgcmV0dXJuIEZBTFNFKTsKKwkvKiBYWVEgMjAwOC0wMy0yNTogQWRvYmUgQ01ZSyBKUEVHIGhhcyBzZXJpb3VzIGZsYXc6IHRoZSBLIGNoYW5uZWwgaGFzIHNhbWUgY29tcG9uZW50IGlkIGFzIEMgY2hhbm5lbCAqLworCXsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBjaTsgaSArKykKKwkJCWlmIChjb21wcHRyLT5jb21wb25lbnRfaWQgPT0gY2luZm8tPmNvbXBfaW5mb1tpXS5jb21wb25lbnRfaWQpIGJyZWFrOworCQlpZiAoaSA8IGNpKQorCQkJLyogRm91bmQgdGhlIGVycm9yISBXZSByZXBsYWNlIHRoZSBpZCB3aXRoIHNvbWV0aGluZyB1bmxpa2VseSB1c2VkIGVsc2V3aGVyZSAqLworCQkJY29tcHB0ci0+Y29tcG9uZW50X2lkICs9IDB4ZjA7CisJfQorCS8qIGVuZCBvZiBtb2RpZmljYXRpb24gKi8KKyAgICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOworICAgIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgPSAoYyA+PiA0KSAmIDE1OworICAgIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgPSAoYyAgICAgKSAmIDE1OworICAgIElOUFVUX0JZVEUoY2luZm8sIGNvbXBwdHItPnF1YW50X3RibF9ubywgcmV0dXJuIEZBTFNFKTsKKworICAgIFRSQUNFTVM0KGNpbmZvLCAxLCBKVFJDX1NPRl9DT01QT05FTlQsCisJICAgICBjb21wcHRyLT5jb21wb25lbnRfaWQsIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsCisJICAgICBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBjb21wcHRyLT5xdWFudF90Ymxfbm8pOworICB9CisKKyAgY2luZm8tPm1hcmtlci0+c2F3X1NPRiA9IFRSVUU7CisKKyAgSU5QVVRfU1lOQyhjaW5mbyk7CisgIHJldHVybiBUUlVFOworfQorCisKK0xPQ0FMKGJvb2xlYW4pCitnZXRfc29zIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogUHJvY2VzcyBhIFNPUyBtYXJrZXIgKi8KK3sKKyAgSU5UMzIgbGVuZ3RoOworICBpbnQgaSwgY2ksIG4sIGMsIGNjOworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKKyAgSU5QVVRfVkFSUyhjaW5mbyk7CisKKyAgaWYgKCEgY2luZm8tPm1hcmtlci0+c2F3X1NPRikKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1NPU19OT19TT0YpOworCisgIElOUFVUXzJCWVRFUyhjaW5mbywgbGVuZ3RoLCByZXR1cm4gRkFMU0UpOworCisgIElOUFVUX0JZVEUoY2luZm8sIG4sIHJldHVybiBGQUxTRSk7IC8qIE51bWJlciBvZiBjb21wb25lbnRzICovCisKKyAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfU09TLCBuKTsKKworICBpZiAobGVuZ3RoICE9IChuICogMiArIDYpIHx8IG4gPCAxIHx8IG4gPiBNQVhfQ09NUFNfSU5fU0NBTikKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9MRU5HVEgpOworCisgIGNpbmZvLT5jb21wc19pbl9zY2FuID0gbjsKKworICAvKiBDb2xsZWN0IHRoZSBjb21wb25lbnQtc3BlYyBwYXJhbWV0ZXJzICovCisKKyAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgIElOUFVUX0JZVEUoY2luZm8sIGNjLCByZXR1cm4gRkFMU0UpOworICAgIElOUFVUX0JZVEUoY2luZm8sIGMsIHJldHVybiBGQUxTRSk7CisgICAgCisJLyogWFlRIDIwMDgtMDMtMjU6IEFkb2JlIENNWUsgSlBFRyBoYXMgc2VyaW91cyBmbGF3OiB0aGUgSyBjaGFubmVsIGhhcyBzYW1lIGNvbXBvbmVudCBpZCBhcyBDIGNoYW5uZWwgKi8KKwl7CisJCWludCBqOworCQlmb3IgKGogPSAwOyBqIDwgaTsgaiArKykKKwkJCWlmIChjYyA9PSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tqXS0+Y29tcG9uZW50X2lkKSBicmVhazsKKwkJaWYgKGogPCBpKQorCQkJLyogZm91bmQgdGhlIGVycm9yISAqLworCQkJY2MgKz0gMHhmMDsKKwl9CisJLyogZW5kIG9mIG1vZGlmaWNhdGlvbiAqLworICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisJIGNpKyssIGNvbXBwdHIrKykgeworICAgICAgaWYgKGNjID09IGNvbXBwdHItPmNvbXBvbmVudF9pZCkKKwlnb3RvIGlkX2ZvdW5kOworICAgIH0KKworICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9DT01QT05FTlRfSUQsIGNjKTsKKworICBpZF9mb3VuZDoKKworICAgIGNpbmZvLT5jdXJfY29tcF9pbmZvW2ldID0gY29tcHB0cjsKKyAgICBjb21wcHRyLT5kY190Ymxfbm8gPSAoYyA+PiA0KSAmIDE1OworICAgIGNvbXBwdHItPmFjX3RibF9ubyA9IChjICAgICApICYgMTU7CisgICAgCisgICAgVFJBQ0VNUzMoY2luZm8sIDEsIEpUUkNfU09TX0NPTVBPTkVOVCwgY2MsCisJICAgICBjb21wcHRyLT5kY190Ymxfbm8sIGNvbXBwdHItPmFjX3RibF9ubyk7CisJLyogVGhpcyBDU2kgKGNjKSBzaG91bGQgZGlmZmVyIGZyb20gdGhlIHByZXZpb3VzIENTaSAqLworICAgIGZvciAoY2kgPSAwOyBjaSA8IGk7IGNpKyspIHsKKyAgICAgIGlmIChjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV0gPT0gY29tcHB0cikKKyAgICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX0NPTVBPTkVOVF9JRCwgY2MpOworICAgIH0KKyAgfQorCisgIC8qIENvbGxlY3QgdGhlIGFkZGl0aW9uYWwgc2NhbiBwYXJhbWV0ZXJzIFNzLCBTZSwgQWgvQWwuICovCisgIElOUFVUX0JZVEUoY2luZm8sIGMsIHJldHVybiBGQUxTRSk7CisgIGNpbmZvLT5TcyA9IGM7CisgIElOUFVUX0JZVEUoY2luZm8sIGMsIHJldHVybiBGQUxTRSk7CisgIGNpbmZvLT5TZSA9IGM7CisgIElOUFVUX0JZVEUoY2luZm8sIGMsIHJldHVybiBGQUxTRSk7CisgIGNpbmZvLT5BaCA9IChjID4+IDQpICYgMTU7CisgIGNpbmZvLT5BbCA9IChjICAgICApICYgMTU7CisKKyAgVFJBQ0VNUzQoY2luZm8sIDEsIEpUUkNfU09TX1BBUkFNUywgY2luZm8tPlNzLCBjaW5mby0+U2UsCisJICAgY2luZm8tPkFoLCBjaW5mby0+QWwpOworCisgIC8qIFByZXBhcmUgdG8gc2NhbiBkYXRhICYgcmVzdGFydCBtYXJrZXJzICovCisgIGNpbmZvLT5tYXJrZXItPm5leHRfcmVzdGFydF9udW0gPSAwOworCisgIC8qIENvdW50IGFub3RoZXIgU09TIG1hcmtlciAqLworICBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIrKzsKKworICBJTlBVVF9TWU5DKGNpbmZvKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworI2lmZGVmIERfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRAorCitMT0NBTChib29sZWFuKQorZ2V0X2RhYyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIFByb2Nlc3MgYSBEQUMgbWFya2VyICovCit7CisgIElOVDMyIGxlbmd0aDsKKyAgaW50IGluZGV4LCB2YWw7CisgIElOUFVUX1ZBUlMoY2luZm8pOworCisgIElOUFVUXzJCWVRFUyhjaW5mbywgbGVuZ3RoLCByZXR1cm4gRkFMU0UpOworICBsZW5ndGggLT0gMjsKKyAgCisgIHdoaWxlIChsZW5ndGggPiAwKSB7CisgICAgSU5QVVRfQllURShjaW5mbywgaW5kZXgsIHJldHVybiBGQUxTRSk7CisgICAgSU5QVVRfQllURShjaW5mbywgdmFsLCByZXR1cm4gRkFMU0UpOworCisgICAgbGVuZ3RoIC09IDI7CisKKyAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19EQUMsIGluZGV4LCB2YWwpOworCisgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSAoMipOVU1fQVJJVEhfVEJMUykpCisgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9EQUNfSU5ERVgsIGluZGV4KTsKKworICAgIGlmIChpbmRleCA+PSBOVU1fQVJJVEhfVEJMUykgeyAvKiBkZWZpbmUgQUMgdGFibGUgKi8KKyAgICAgIGNpbmZvLT5hcml0aF9hY19LW2luZGV4LU5VTV9BUklUSF9UQkxTXSA9IChVSU5UOCkgdmFsOworICAgIH0gZWxzZSB7CQkJLyogZGVmaW5lIERDIHRhYmxlICovCisgICAgICBjaW5mby0+YXJpdGhfZGNfTFtpbmRleF0gPSAoVUlOVDgpICh2YWwgJiAweDBGKTsKKyAgICAgIGNpbmZvLT5hcml0aF9kY19VW2luZGV4XSA9IChVSU5UOCkgKHZhbCA+PiA0KTsKKyAgICAgIGlmIChjaW5mby0+YXJpdGhfZGNfTFtpbmRleF0gPiBjaW5mby0+YXJpdGhfZGNfVVtpbmRleF0pCisJRVJSRVhJVDEoY2luZm8sIEpFUlJfREFDX1ZBTFVFLCB2YWwpOworICAgIH0KKyAgfQorCisgIGlmIChsZW5ndGggIT0gMCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9MRU5HVEgpOworCisgIElOUFVUX1NZTkMoY2luZm8pOworICByZXR1cm4gVFJVRTsKK30KKworI2Vsc2UgLyogISBEX0FSSVRIX0NPRElOR19TVVBQT1JURUQgKi8KKworI2RlZmluZSBnZXRfZGFjKGNpbmZvKSAgc2tpcF92YXJpYWJsZShjaW5mbykKKworI2VuZGlmIC8qIERfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRCAqLworCisKK0xPQ0FMKGJvb2xlYW4pCitnZXRfZGh0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogUHJvY2VzcyBhIERIVCBtYXJrZXIgKi8KK3sKKyAgSU5UMzIgbGVuZ3RoOworICBVSU5UOCBiaXRzWzE3XTsKKyAgVUlOVDggaHVmZnZhbFsyNTZdOworICBpbnQgaSwgaW5kZXgsIGNvdW50OworICBKSFVGRl9UQkwgKipodGJscHRyOworICBJTlBVVF9WQVJTKGNpbmZvKTsKKworICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKKyAgbGVuZ3RoIC09IDI7CisgIAorICB3aGlsZSAobGVuZ3RoID4gMTYpIHsKKyAgICBJTlBVVF9CWVRFKGNpbmZvLCBpbmRleCwgcmV0dXJuIEZBTFNFKTsKKworICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX0RIVCwgaW5kZXgpOworICAgICAgCisgICAgYml0c1swXSA9IDA7CisgICAgY291bnQgPSAwOworICAgIGZvciAoaSA9IDE7IGkgPD0gMTY7IGkrKykgeworICAgICAgSU5QVVRfQllURShjaW5mbywgYml0c1tpXSwgcmV0dXJuIEZBTFNFKTsKKyAgICAgIGNvdW50ICs9IGJpdHNbaV07CisgICAgfQorCisgICAgbGVuZ3RoIC09IDEgKyAxNjsKKworICAgIFRSQUNFTVM4KGNpbmZvLCAyLCBKVFJDX0hVRkZCSVRTLAorCSAgICAgYml0c1sxXSwgYml0c1syXSwgYml0c1szXSwgYml0c1s0XSwKKwkgICAgIGJpdHNbNV0sIGJpdHNbNl0sIGJpdHNbN10sIGJpdHNbOF0pOworICAgIFRSQUNFTVM4KGNpbmZvLCAyLCBKVFJDX0hVRkZCSVRTLAorCSAgICAgYml0c1s5XSwgYml0c1sxMF0sIGJpdHNbMTFdLCBiaXRzWzEyXSwKKwkgICAgIGJpdHNbMTNdLCBiaXRzWzE0XSwgYml0c1sxNV0sIGJpdHNbMTZdKTsKKworICAgIC8qIEhlcmUgd2UganVzdCBkbyBtaW5pbWFsIHZhbGlkYXRpb24gb2YgdGhlIGNvdW50cyB0byBhdm9pZCB3YWxraW5nCisgICAgICogb2ZmIHRoZSBlbmQgb2Ygb3VyIHRhYmxlIHNwYWNlLiAgamRodWZmLmMgd2lsbCBjaGVjayBtb3JlIGNhcmVmdWxseS4KKyAgICAgKi8KKyAgICBpZiAoY291bnQgPiAyNTYgfHwgKChJTlQzMikgY291bnQpID4gbGVuZ3RoKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSFVGRl9UQUJMRSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgIElOUFVUX0JZVEUoY2luZm8sIGh1ZmZ2YWxbaV0sIHJldHVybiBGQUxTRSk7CisKKyAgICBsZW5ndGggLT0gY291bnQ7CisKKyAgICBpZiAoaW5kZXggJiAweDEwKSB7CQkvKiBBQyB0YWJsZSBkZWZpbml0aW9uICovCisgICAgICBpbmRleCAtPSAweDEwOworICAgICAgaHRibHB0ciA9ICZjaW5mby0+YWNfaHVmZl90YmxfcHRyc1tpbmRleF07CisgICAgfSBlbHNlIHsJCQkvKiBEQyB0YWJsZSBkZWZpbml0aW9uICovCisgICAgICBodGJscHRyID0gJmNpbmZvLT5kY19odWZmX3RibF9wdHJzW2luZGV4XTsKKyAgICB9CisKKyAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE5VTV9IVUZGX1RCTFMpCisgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9ESFRfSU5ERVgsIGluZGV4KTsKKworICAgIGlmICgqaHRibHB0ciA9PSBOVUxMKQorICAgICAgKmh0YmxwdHIgPSBqcGVnX2FsbG9jX2h1ZmZfdGFibGUoKGpfY29tbW9uX3B0cikgY2luZm8pOworICAKKyAgICBNRU1DT1BZKCgqaHRibHB0ciktPmJpdHMsIGJpdHMsIFNJWkVPRigoKmh0YmxwdHIpLT5iaXRzKSk7CisgICAgTUVNQ09QWSgoKmh0YmxwdHIpLT5odWZmdmFsLCBodWZmdmFsLCBTSVpFT0YoKCpodGJscHRyKS0+aHVmZnZhbCkpOworICB9CisKKyAgaWYgKGxlbmd0aCAhPSAwKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0xFTkdUSCk7CisKKyAgSU5QVVRfU1lOQyhjaW5mbyk7CisgIHJldHVybiBUUlVFOworfQorCisKK0xPQ0FMKGJvb2xlYW4pCitnZXRfZHF0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogUHJvY2VzcyBhIERRVCBtYXJrZXIgKi8KK3sKKyAgSU5UMzIgbGVuZ3RoOworICBpbnQgbiwgaSwgcHJlYzsKKyAgdW5zaWduZWQgaW50IHRtcDsKKyAgSlFVQU5UX1RCTCAqcXVhbnRfcHRyOworICBJTlBVVF9WQVJTKGNpbmZvKTsKKworICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKKyAgbGVuZ3RoIC09IDI7CisKKyAgd2hpbGUgKGxlbmd0aCA+IDApIHsKKyAgICBJTlBVVF9CWVRFKGNpbmZvLCBuLCByZXR1cm4gRkFMU0UpOworICAgIHByZWMgPSBuID4+IDQ7CisgICAgbiAmPSAweDBGOworCisgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfRFFULCBuLCBwcmVjKTsKKworICAgIGlmIChuID49IE5VTV9RVUFOVF9UQkxTKQorICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfRFFUX0lOREVYLCBuKTsKKyAgICAgIAorICAgIGlmIChjaW5mby0+cXVhbnRfdGJsX3B0cnNbbl0gPT0gTlVMTCkKKyAgICAgIGNpbmZvLT5xdWFudF90YmxfcHRyc1tuXSA9IGpwZWdfYWxsb2NfcXVhbnRfdGFibGUoKGpfY29tbW9uX3B0cikgY2luZm8pOworICAgIHF1YW50X3B0ciA9IGNpbmZvLT5xdWFudF90YmxfcHRyc1tuXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7CisgICAgICBpZiAocHJlYykKKwlJTlBVVF8yQllURVMoY2luZm8sIHRtcCwgcmV0dXJuIEZBTFNFKTsKKyAgICAgIGVsc2UKKwlJTlBVVF9CWVRFKGNpbmZvLCB0bXAsIHJldHVybiBGQUxTRSk7CisgICAgICAvKiBXZSBjb252ZXJ0IHRoZSB6aWd6YWctb3JkZXIgdGFibGUgdG8gbmF0dXJhbCBhcnJheSBvcmRlci4gKi8KKyAgICAgIHF1YW50X3B0ci0+cXVhbnR2YWxbanBlZ19uYXR1cmFsX29yZGVyW2ldXSA9IChVSU5UMTYpIHRtcDsKKyAgICB9CisKKyAgICBpZiAoY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPj0gMikgeworICAgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpICs9IDgpIHsKKwlUUkFDRU1TOChjaW5mbywgMiwgSlRSQ19RVUFOVFZBTFMsCisJCSBxdWFudF9wdHItPnF1YW50dmFsW2ldLCAgIHF1YW50X3B0ci0+cXVhbnR2YWxbaSsxXSwKKwkJIHF1YW50X3B0ci0+cXVhbnR2YWxbaSsyXSwgcXVhbnRfcHRyLT5xdWFudHZhbFtpKzNdLAorCQkgcXVhbnRfcHRyLT5xdWFudHZhbFtpKzRdLCBxdWFudF9wdHItPnF1YW50dmFsW2krNV0sCisJCSBxdWFudF9wdHItPnF1YW50dmFsW2krNl0sIHF1YW50X3B0ci0+cXVhbnR2YWxbaSs3XSk7CisgICAgICB9CisgICAgfQorCisgICAgbGVuZ3RoIC09IERDVFNJWkUyKzE7CisgICAgaWYgKHByZWMpIGxlbmd0aCAtPSBEQ1RTSVpFMjsKKyAgfQorCisgIGlmIChsZW5ndGggIT0gMCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9MRU5HVEgpOworCisgIElOUFVUX1NZTkMoY2luZm8pOworICByZXR1cm4gVFJVRTsKK30KKworCitMT0NBTChib29sZWFuKQorZ2V0X2RyaSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIFByb2Nlc3MgYSBEUkkgbWFya2VyICovCit7CisgIElOVDMyIGxlbmd0aDsKKyAgdW5zaWduZWQgaW50IHRtcDsKKyAgSU5QVVRfVkFSUyhjaW5mbyk7CisKKyAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7CisgIAorICBpZiAobGVuZ3RoICE9IDQpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfTEVOR1RIKTsKKworICBJTlBVVF8yQllURVMoY2luZm8sIHRtcCwgcmV0dXJuIEZBTFNFKTsKKworICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19EUkksIHRtcCk7CisKKyAgY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwgPSB0bXA7CisKKyAgSU5QVVRfU1lOQyhjaW5mbyk7CisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBSb3V0aW5lcyBmb3IgcHJvY2Vzc2luZyBBUFBuIGFuZCBDT00gbWFya2Vycy4KKyAqIFRoZXNlIGFyZSBlaXRoZXIgc2F2ZWQgaW4gbWVtb3J5IG9yIGRpc2NhcmRlZCwgcGVyIGFwcGxpY2F0aW9uIHJlcXVlc3QuCisgKiBBUFAwIGFuZCBBUFAxNCBhcmUgc3BlY2lhbGx5IGNoZWNrZWQgdG8gc2VlIGlmIHRoZXkgYXJlCisgKiBKRklGIGFuZCBBZG9iZSBtYXJrZXJzLCByZXNwZWN0aXZlbHkuCisgKi8KKworI2RlZmluZSBBUFAwX0RBVEFfTEVOCTE0CS8qIExlbmd0aCBvZiBpbnRlcmVzdGluZyBkYXRhIGluIEFQUDAgKi8KKyNkZWZpbmUgQVBQMTRfREFUQV9MRU4JMTIJLyogTGVuZ3RoIG9mIGludGVyZXN0aW5nIGRhdGEgaW4gQVBQMTQgKi8KKyNkZWZpbmUgQVBQTl9EQVRBX0xFTgkxNAkvKiBNdXN0IGJlIHRoZSBsYXJnZXN0IG9mIHRoZSBhYm92ZSEhICovCisKKworTE9DQUwodm9pZCkKK2V4YW1pbmVfYXBwMCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSk9DVEVUIEZBUiAqIGRhdGEsCisJICAgICAgdW5zaWduZWQgaW50IGRhdGFsZW4sIElOVDMyIHJlbWFpbmluZykKKy8qIEV4YW1pbmUgZmlyc3QgZmV3IGJ5dGVzIGZyb20gYW4gQVBQMC4KKyAqIFRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIGlmIGl0IGlzIGEgSkZJRiBtYXJrZXIuCisgKiBkYXRhbGVuIGlzICMgb2YgYnl0ZXMgYXQgZGF0YVtdLCByZW1haW5pbmcgaXMgbGVuZ3RoIG9mIHJlc3Qgb2YgbWFya2VyIGRhdGEuCisgKi8KK3sKKyAgSU5UMzIgdG90YWxsZW4gPSAoSU5UMzIpIGRhdGFsZW4gKyByZW1haW5pbmc7CisKKyAgaWYgKGRhdGFsZW4gPj0gQVBQMF9EQVRBX0xFTiAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbMF0pID09IDB4NEEgJiYKKyAgICAgIEdFVEpPQ1RFVChkYXRhWzFdKSA9PSAweDQ2ICYmCisgICAgICBHRVRKT0NURVQoZGF0YVsyXSkgPT0gMHg0OSAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbM10pID09IDB4NDYgJiYKKyAgICAgIEdFVEpPQ1RFVChkYXRhWzRdKSA9PSAwKSB7CisgICAgLyogRm91bmQgSkZJRiBBUFAwIG1hcmtlcjogc2F2ZSBpbmZvICovCisgICAgY2luZm8tPnNhd19KRklGX21hcmtlciA9IFRSVUU7CisgICAgY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbiA9IEdFVEpPQ1RFVChkYXRhWzVdKTsKKyAgICBjaW5mby0+SkZJRl9taW5vcl92ZXJzaW9uID0gR0VUSk9DVEVUKGRhdGFbNl0pOworICAgIGNpbmZvLT5kZW5zaXR5X3VuaXQgPSBHRVRKT0NURVQoZGF0YVs3XSk7CisgICAgY2luZm8tPlhfZGVuc2l0eSA9IChHRVRKT0NURVQoZGF0YVs4XSkgPDwgOCkgKyBHRVRKT0NURVQoZGF0YVs5XSk7CisgICAgY2luZm8tPllfZGVuc2l0eSA9IChHRVRKT0NURVQoZGF0YVsxMF0pIDw8IDgpICsgR0VUSk9DVEVUKGRhdGFbMTFdKTsKKyAgICAvKiBDaGVjayB2ZXJzaW9uLgorICAgICAqIE1ham9yIHZlcnNpb24gbXVzdCBiZSAxLCBhbnl0aGluZyBlbHNlIHNpZ25hbHMgYW4gaW5jb21wYXRpYmxlIGNoYW5nZS4KKyAgICAgKiAoV2UgdXNlZCB0byB0cmVhdCB0aGlzIGFzIGFuIGVycm9yLCBidXQgbm93IGl0J3MgYSBub25mYXRhbCB3YXJuaW5nLAorICAgICAqIGJlY2F1c2Ugc29tZSBib3pvIGF0IEhpamFhayBjb3VsZG4ndCByZWFkIHRoZSBzcGVjLikKKyAgICAgKiBNaW5vciB2ZXJzaW9uIHNob3VsZCBiZSAwLi4yLCBidXQgcHJvY2VzcyBhbnl3YXkgaWYgbmV3ZXIuCisgICAgICovCisgICAgaWYgKGNpbmZvLT5KRklGX21ham9yX3ZlcnNpb24gIT0gMSkKKyAgICAgIFdBUk5NUzIoY2luZm8sIEpXUk5fSkZJRl9NQUpPUiwKKwkgICAgICBjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uLCBjaW5mby0+SkZJRl9taW5vcl92ZXJzaW9uKTsKKyAgICAvKiBHZW5lcmF0ZSB0cmFjZSBtZXNzYWdlcyAqLworICAgIFRSQUNFTVM1KGNpbmZvLCAxLCBKVFJDX0pGSUYsCisJICAgICBjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uLCBjaW5mby0+SkZJRl9taW5vcl92ZXJzaW9uLAorCSAgICAgY2luZm8tPlhfZGVuc2l0eSwgY2luZm8tPllfZGVuc2l0eSwgY2luZm8tPmRlbnNpdHlfdW5pdCk7CisgICAgLyogVmFsaWRhdGUgdGh1bWJuYWlsIGRpbWVuc2lvbnMgYW5kIGlzc3VlIGFwcHJvcHJpYXRlIG1lc3NhZ2VzICovCisgICAgaWYgKEdFVEpPQ1RFVChkYXRhWzEyXSkgfCBHRVRKT0NURVQoZGF0YVsxM10pKQorICAgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfSkZJRl9USFVNQk5BSUwsCisJICAgICAgIEdFVEpPQ1RFVChkYXRhWzEyXSksIEdFVEpPQ1RFVChkYXRhWzEzXSkpOworICAgIHRvdGFsbGVuIC09IEFQUDBfREFUQV9MRU47CisgICAgaWYgKHRvdGFsbGVuICE9CisJKChJTlQzMilHRVRKT0NURVQoZGF0YVsxMl0pICogKElOVDMyKUdFVEpPQ1RFVChkYXRhWzEzXSkgKiAoSU5UMzIpIDMpKQorICAgICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfSkZJRl9CQURUSFVNQk5BSUxTSVpFLCAoaW50KSB0b3RhbGxlbik7CisgIH0gZWxzZSBpZiAoZGF0YWxlbiA+PSA2ICYmCisgICAgICBHRVRKT0NURVQoZGF0YVswXSkgPT0gMHg0QSAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbMV0pID09IDB4NDYgJiYKKyAgICAgIEdFVEpPQ1RFVChkYXRhWzJdKSA9PSAweDU4ICYmCisgICAgICBHRVRKT0NURVQoZGF0YVszXSkgPT0gMHg1OCAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbNF0pID09IDApIHsKKyAgICAvKiBGb3VuZCBKRklGICJKRlhYIiBleHRlbnNpb24gQVBQMCBtYXJrZXIgKi8KKyAgICAvKiBUaGUgbGlicmFyeSBkb2Vzbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nIHdpdGggdGhlc2UsCisgICAgICogYnV0IHdlIHRyeSB0byBwcm9kdWNlIGEgaGVscGZ1bCB0cmFjZSBtZXNzYWdlLgorICAgICAqLworICAgIHN3aXRjaCAoR0VUSk9DVEVUKGRhdGFbNV0pKSB7CisgICAgY2FzZSAweDEwOgorICAgICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfVEhVTUJfSlBFRywgKGludCkgdG90YWxsZW4pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDExOgorICAgICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfVEhVTUJfUEFMRVRURSwgKGludCkgdG90YWxsZW4pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweDEzOgorICAgICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfVEhVTUJfUkdCLCAoaW50KSB0b3RhbGxlbik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfSkZJRl9FWFRFTlNJT04sCisJICAgICAgIEdFVEpPQ1RFVChkYXRhWzVdKSwgKGludCkgdG90YWxsZW4pOworICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIFN0YXJ0IG9mIEFQUDAgZG9lcyBub3QgbWF0Y2ggIkpGSUYiIG9yICJKRlhYIiwgb3IgdG9vIHNob3J0ICovCisgICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfQVBQMCwgKGludCkgdG90YWxsZW4pOworICB9Cit9CisKKworTE9DQUwodm9pZCkKK2V4YW1pbmVfYXBwMTQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpPQ1RFVCBGQVIgKiBkYXRhLAorCSAgICAgICB1bnNpZ25lZCBpbnQgZGF0YWxlbiwgSU5UMzIgcmVtYWluaW5nKQorLyogRXhhbWluZSBmaXJzdCBmZXcgYnl0ZXMgZnJvbSBhbiBBUFAxNC4KKyAqIFRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIGlmIGl0IGlzIGFuIEFkb2JlIG1hcmtlci4KKyAqIGRhdGFsZW4gaXMgIyBvZiBieXRlcyBhdCBkYXRhW10sIHJlbWFpbmluZyBpcyBsZW5ndGggb2YgcmVzdCBvZiBtYXJrZXIgZGF0YS4KKyAqLworeworICB1bnNpZ25lZCBpbnQgdmVyc2lvbiwgZmxhZ3MwLCBmbGFnczEsIHRyYW5zZm9ybTsKKworICBpZiAoZGF0YWxlbiA+PSBBUFAxNF9EQVRBX0xFTiAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbMF0pID09IDB4NDEgJiYKKyAgICAgIEdFVEpPQ1RFVChkYXRhWzFdKSA9PSAweDY0ICYmCisgICAgICBHRVRKT0NURVQoZGF0YVsyXSkgPT0gMHg2RiAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbM10pID09IDB4NjIgJiYKKyAgICAgIEdFVEpPQ1RFVChkYXRhWzRdKSA9PSAweDY1KSB7CisgICAgLyogRm91bmQgQWRvYmUgQVBQMTQgbWFya2VyICovCisgICAgdmVyc2lvbiA9IChHRVRKT0NURVQoZGF0YVs1XSkgPDwgOCkgKyBHRVRKT0NURVQoZGF0YVs2XSk7CisgICAgZmxhZ3MwID0gKEdFVEpPQ1RFVChkYXRhWzddKSA8PCA4KSArIEdFVEpPQ1RFVChkYXRhWzhdKTsKKyAgICBmbGFnczEgPSAoR0VUSk9DVEVUKGRhdGFbOV0pIDw8IDgpICsgR0VUSk9DVEVUKGRhdGFbMTBdKTsKKyAgICB0cmFuc2Zvcm0gPSBHRVRKT0NURVQoZGF0YVsxMV0pOworICAgIFRSQUNFTVM0KGNpbmZvLCAxLCBKVFJDX0FET0JFLCB2ZXJzaW9uLCBmbGFnczAsIGZsYWdzMSwgdHJhbnNmb3JtKTsKKyAgICBjaW5mby0+c2F3X0Fkb2JlX21hcmtlciA9IFRSVUU7CisgICAgY2luZm8tPkFkb2JlX3RyYW5zZm9ybSA9IChVSU5UOCkgdHJhbnNmb3JtOworICB9IGVsc2UgeworICAgIC8qIFN0YXJ0IG9mIEFQUDE0IGRvZXMgbm90IG1hdGNoICJBZG9iZSIsIG9yIHRvbyBzaG9ydCAqLworICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX0FQUDE0LCAoaW50KSAoZGF0YWxlbiArIHJlbWFpbmluZykpOworICB9Cit9CisKKworTUVUSE9EREVGKGJvb2xlYW4pCitnZXRfaW50ZXJlc3RpbmdfYXBwbiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIFByb2Nlc3MgYW4gQVBQMCBvciBBUFAxNCBtYXJrZXIgd2l0aG91dCBzYXZpbmcgaXQgKi8KK3sKKyAgSU5UMzIgbGVuZ3RoOworICBKT0NURVQgYltBUFBOX0RBVEFfTEVOXTsKKyAgdW5zaWduZWQgaW50IGksIG51bXRvcmVhZDsKKyAgSU5QVVRfVkFSUyhjaW5mbyk7CisKKyAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7CisgIGxlbmd0aCAtPSAyOworCisgIC8qIGdldCB0aGUgaW50ZXJlc3RpbmcgcGFydCBvZiB0aGUgbWFya2VyIGRhdGEgKi8KKyAgaWYgKGxlbmd0aCA+PSBBUFBOX0RBVEFfTEVOKQorICAgIG51bXRvcmVhZCA9IEFQUE5fREFUQV9MRU47CisgIGVsc2UgaWYgKGxlbmd0aCA+IDApCisgICAgbnVtdG9yZWFkID0gKHVuc2lnbmVkIGludCkgbGVuZ3RoOworICBlbHNlCisgICAgbnVtdG9yZWFkID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IG51bXRvcmVhZDsgaSsrKQorICAgIElOUFVUX0JZVEUoY2luZm8sIGJbaV0sIHJldHVybiBGQUxTRSk7CisgIGxlbmd0aCAtPSBudW10b3JlYWQ7CisKKyAgLyogcHJvY2VzcyBpdCAqLworICBzd2l0Y2ggKGNpbmZvLT51bnJlYWRfbWFya2VyKSB7CisgIGNhc2UgTV9BUFAwOgorICAgIGV4YW1pbmVfYXBwMChjaW5mbywgKEpPQ1RFVCBGQVIgKikgYiwgbnVtdG9yZWFkLCBsZW5ndGgpOworICAgIGJyZWFrOworICBjYXNlIE1fQVBQMTQ6CisgICAgZXhhbWluZV9hcHAxNChjaW5mbywgKEpPQ1RFVCBGQVIgKikgYiwgbnVtdG9yZWFkLCBsZW5ndGgpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIC8qIGNhbid0IGdldCBoZXJlIHVubGVzcyBqcGVnX3NhdmVfbWFya2VycyBjaG9vc2VzIHdyb25nIHByb2Nlc3NvciAqLworICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1VOS05PV05fTUFSS0VSLCBjaW5mby0+dW5yZWFkX21hcmtlcik7CisgICAgYnJlYWs7CisgIH0KKworICAvKiBza2lwIGFueSByZW1haW5pbmcgZGF0YSAtLSBjb3VsZCBiZSBsb3RzICovCisgIElOUFVUX1NZTkMoY2luZm8pOworICBpZiAobGVuZ3RoID4gMCkKKyAgICAoKmNpbmZvLT5zcmMtPnNraXBfaW5wdXRfZGF0YSkgKGNpbmZvLCAobG9uZykgbGVuZ3RoKTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisjaWZkZWYgU0FWRV9NQVJLRVJTX1NVUFBPUlRFRAorCitNRVRIT0RERUYoYm9vbGVhbikKK3NhdmVfbWFya2VyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogU2F2ZSBhbiBBUFBuIG9yIENPTSBtYXJrZXIgaW50byB0aGUgbWFya2VyIGxpc3QgKi8KK3sKKyAgbXlfbWFya2VyX3B0ciBtYXJrZXIgPSAobXlfbWFya2VyX3B0cikgY2luZm8tPm1hcmtlcjsKKyAganBlZ19zYXZlZF9tYXJrZXJfcHRyIGN1cl9tYXJrZXIgPSBtYXJrZXItPmN1cl9tYXJrZXI7CisgIHVuc2lnbmVkIGludCBieXRlc19yZWFkLCBkYXRhX2xlbmd0aDsKKyAgSk9DVEVUIEZBUiAqIGRhdGE7CisgIElOVDMyIGxlbmd0aCA9IDA7CisgIElOUFVUX1ZBUlMoY2luZm8pOworCisgIGlmIChjdXJfbWFya2VyID09IE5VTEwpIHsKKyAgICAvKiBiZWdpbiByZWFkaW5nIGEgbWFya2VyICovCisgICAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7CisgICAgbGVuZ3RoIC09IDI7CisgICAgaWYgKGxlbmd0aCA+PSAwKSB7CQkvKiB3YXRjaCBvdXQgZm9yIGJvZ3VzIGxlbmd0aCB3b3JkICovCisgICAgICAvKiBmaWd1cmUgb3V0IGhvdyBtdWNoIHdlIHdhbnQgdG8gc2F2ZSAqLworICAgICAgdW5zaWduZWQgaW50IGxpbWl0OworICAgICAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09IChpbnQpIE1fQ09NKQorCWxpbWl0ID0gbWFya2VyLT5sZW5ndGhfbGltaXRfQ09NOworICAgICAgZWxzZQorCWxpbWl0ID0gbWFya2VyLT5sZW5ndGhfbGltaXRfQVBQbltjaW5mby0+dW5yZWFkX21hcmtlciAtIChpbnQpIE1fQVBQMF07CisgICAgICBpZiAoKHVuc2lnbmVkIGludCkgbGVuZ3RoIDwgbGltaXQpCisJbGltaXQgPSAodW5zaWduZWQgaW50KSBsZW5ndGg7CisgICAgICAvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgbWFya2VyIGl0ZW0gKi8KKyAgICAgIGN1cl9tYXJrZXIgPSAoanBlZ19zYXZlZF9tYXJrZXJfcHRyKQorCSgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICAgIFNJWkVPRihzdHJ1Y3QganBlZ19tYXJrZXJfc3RydWN0KSArIGxpbWl0KTsKKyAgICAgIGN1cl9tYXJrZXItPm5leHQgPSBOVUxMOworICAgICAgY3VyX21hcmtlci0+bWFya2VyID0gKFVJTlQ4KSBjaW5mby0+dW5yZWFkX21hcmtlcjsKKyAgICAgIGN1cl9tYXJrZXItPm9yaWdpbmFsX2xlbmd0aCA9ICh1bnNpZ25lZCBpbnQpIGxlbmd0aDsKKyAgICAgIGN1cl9tYXJrZXItPmRhdGFfbGVuZ3RoID0gbGltaXQ7CisgICAgICAvKiBkYXRhIGFyZWEgaXMganVzdCBiZXlvbmQgdGhlIGpwZWdfbWFya2VyX3N0cnVjdCAqLworICAgICAgZGF0YSA9IGN1cl9tYXJrZXItPmRhdGEgPSAoSk9DVEVUIEZBUiAqKSAoY3VyX21hcmtlciArIDEpOworICAgICAgbWFya2VyLT5jdXJfbWFya2VyID0gY3VyX21hcmtlcjsKKyAgICAgIG1hcmtlci0+Ynl0ZXNfcmVhZCA9IDA7CisgICAgICBieXRlc19yZWFkID0gMDsKKyAgICAgIGRhdGFfbGVuZ3RoID0gbGltaXQ7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGRlYWwgd2l0aCBib2d1cyBsZW5ndGggd29yZCAqLworICAgICAgYnl0ZXNfcmVhZCA9IGRhdGFfbGVuZ3RoID0gMDsKKyAgICAgIGRhdGEgPSBOVUxMOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiByZXN1bWUgcmVhZGluZyBhIG1hcmtlciAqLworICAgIGJ5dGVzX3JlYWQgPSBtYXJrZXItPmJ5dGVzX3JlYWQ7CisgICAgZGF0YV9sZW5ndGggPSBjdXJfbWFya2VyLT5kYXRhX2xlbmd0aDsKKyAgICBkYXRhID0gY3VyX21hcmtlci0+ZGF0YSArIGJ5dGVzX3JlYWQ7CisgIH0KKworICB3aGlsZSAoYnl0ZXNfcmVhZCA8IGRhdGFfbGVuZ3RoKSB7CisgICAgSU5QVVRfU1lOQyhjaW5mbyk7CQkvKiBtb3ZlIHRoZSByZXN0YXJ0IHBvaW50IHRvIGhlcmUgKi8KKyAgICBtYXJrZXItPmJ5dGVzX3JlYWQgPSBieXRlc19yZWFkOworICAgIC8qIElmIHRoZXJlJ3Mgbm90IGF0IGxlYXN0IG9uZSBieXRlIGluIGJ1ZmZlciwgc3VzcGVuZCAqLworICAgIE1BS0VfQllURV9BVkFJTChjaW5mbywgcmV0dXJuIEZBTFNFKTsKKyAgICAvKiBDb3B5IGJ5dGVzIHdpdGggcmVhc29uYWJsZSByYXBpZGl0eSAqLworICAgIHdoaWxlIChieXRlc19yZWFkIDwgZGF0YV9sZW5ndGggJiYgYnl0ZXNfaW5fYnVmZmVyID4gMCkgeworICAgICAgKmRhdGErKyA9ICpuZXh0X2lucHV0X2J5dGUrKzsKKyAgICAgIGJ5dGVzX2luX2J1ZmZlci0tOworICAgICAgYnl0ZXNfcmVhZCsrOworICAgIH0KKyAgfQorCisgIC8qIERvbmUgcmVhZGluZyB3aGF0IHdlIHdhbnQgdG8gcmVhZCAqLworICBpZiAoY3VyX21hcmtlciAhPSBOVUxMKSB7CS8qIHdpbGwgYmUgTlVMTCBpZiBib2d1cyBsZW5ndGggd29yZCAqLworICAgIC8qIEFkZCBuZXcgbWFya2VyIHRvIGVuZCBvZiBsaXN0ICovCisgICAgaWYgKGNpbmZvLT5tYXJrZXJfbGlzdCA9PSBOVUxMKSB7CisgICAgICBjaW5mby0+bWFya2VyX2xpc3QgPSBjdXJfbWFya2VyOworICAgIH0gZWxzZSB7CisgICAgICBqcGVnX3NhdmVkX21hcmtlcl9wdHIgcHJldiA9IGNpbmZvLT5tYXJrZXJfbGlzdDsKKyAgICAgIHdoaWxlIChwcmV2LT5uZXh0ICE9IE5VTEwpCisJcHJldiA9IHByZXYtPm5leHQ7CisgICAgICBwcmV2LT5uZXh0ID0gY3VyX21hcmtlcjsKKyAgICB9CisgICAgLyogUmVzZXQgcG9pbnRlciAmIGNhbGMgcmVtYWluaW5nIGRhdGEgbGVuZ3RoICovCisgICAgZGF0YSA9IGN1cl9tYXJrZXItPmRhdGE7CisgICAgbGVuZ3RoID0gY3VyX21hcmtlci0+b3JpZ2luYWxfbGVuZ3RoIC0gZGF0YV9sZW5ndGg7CisgIH0KKyAgLyogUmVzZXQgdG8gaW5pdGlhbCBzdGF0ZSBmb3IgbmV4dCBtYXJrZXIgKi8KKyAgbWFya2VyLT5jdXJfbWFya2VyID0gTlVMTDsKKworICAvKiBQcm9jZXNzIHRoZSBtYXJrZXIgaWYgaW50ZXJlc3Rpbmc7IGVsc2UganVzdCBtYWtlIGEgZ2VuZXJpYyB0cmFjZSBtc2cgKi8KKyAgc3dpdGNoIChjaW5mby0+dW5yZWFkX21hcmtlcikgeworICBjYXNlIE1fQVBQMDoKKyAgICBleGFtaW5lX2FwcDAoY2luZm8sIGRhdGEsIGRhdGFfbGVuZ3RoLCBsZW5ndGgpOworICAgIGJyZWFrOworICBjYXNlIE1fQVBQMTQ6CisgICAgZXhhbWluZV9hcHAxNChjaW5mbywgZGF0YSwgZGF0YV9sZW5ndGgsIGxlbmd0aCk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfTUlTQ19NQVJLRVIsIGNpbmZvLT51bnJlYWRfbWFya2VyLAorCSAgICAgKGludCkgKGRhdGFfbGVuZ3RoICsgbGVuZ3RoKSk7CisgICAgYnJlYWs7CisgIH0KKworICAvKiBza2lwIGFueSByZW1haW5pbmcgZGF0YSAtLSBjb3VsZCBiZSBsb3RzICovCisgIElOUFVUX1NZTkMoY2luZm8pOwkJLyogZG8gYmVmb3JlIHNraXBfaW5wdXRfZGF0YSAqLworICBpZiAobGVuZ3RoID4gMCkKKyAgICAoKmNpbmZvLT5zcmMtPnNraXBfaW5wdXRfZGF0YSkgKGNpbmZvLCAobG9uZykgbGVuZ3RoKTsKKworICByZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIFNBVkVfTUFSS0VSU19TVVBQT1JURUQgKi8KKworCitNRVRIT0RERUYoYm9vbGVhbikKK3NraXBfdmFyaWFibGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBTa2lwIG92ZXIgYW4gdW5rbm93biBvciB1bmludGVyZXN0aW5nIHZhcmlhYmxlLWxlbmd0aCBtYXJrZXIgKi8KK3sKKyAgSU5UMzIgbGVuZ3RoOworICBJTlBVVF9WQVJTKGNpbmZvKTsKKworICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKKyAgbGVuZ3RoIC09IDI7CisgIAorICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19NSVNDX01BUktFUiwgY2luZm8tPnVucmVhZF9tYXJrZXIsIChpbnQpIGxlbmd0aCk7CisKKyAgSU5QVVRfU1lOQyhjaW5mbyk7CQkvKiBkbyBiZWZvcmUgc2tpcF9pbnB1dF9kYXRhICovCisgIGlmIChsZW5ndGggPiAwKQorICAgICgqY2luZm8tPnNyYy0+c2tpcF9pbnB1dF9kYXRhKSAoY2luZm8sIChsb25nKSBsZW5ndGgpOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBGaW5kIHRoZSBuZXh0IEpQRUcgbWFya2VyLCBzYXZlIGl0IGluIGNpbmZvLT51bnJlYWRfbWFya2VyLgorICogUmV0dXJucyBGQUxTRSBpZiBoYWQgdG8gc3VzcGVuZCBiZWZvcmUgcmVhY2hpbmcgYSBtYXJrZXI7CisgKiBpbiB0aGF0IGNhc2UgY2luZm8tPnVucmVhZF9tYXJrZXIgaXMgdW5jaGFuZ2VkLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgcmVzdWx0IG1pZ2h0IG5vdCBiZSBhIHZhbGlkIG1hcmtlciBjb2RlLAorICogYnV0IGl0IHdpbGwgbmV2ZXIgYmUgMCBvciBGRi4KKyAqLworCitMT0NBTChib29sZWFuKQorbmV4dF9tYXJrZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGludCBjOworICBJTlBVVF9WQVJTKGNpbmZvKTsKKworICBmb3IgKDs7KSB7CisgICAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKKyAgICAvKiBTa2lwIGFueSBub24tRkYgYnl0ZXMuCisgICAgICogVGhpcyBtYXkgbG9vayBhIGJpdCBpbmVmZmljaWVudCwgYnV0IGl0IHdpbGwgbm90IG9jY3VyIGluIGEgdmFsaWQgZmlsZS4KKyAgICAgKiBXZSBzeW5jIGFmdGVyIGVhY2ggZGlzY2FyZGVkIGJ5dGUgc28gdGhhdCBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UKKyAgICAgKiBjYW4gZGlzY2FyZCB0aGUgYnl0ZSBmcm9tIGl0cyBidWZmZXIuCisgICAgICovCisgICAgd2hpbGUgKGMgIT0gMHhGRikgeworICAgICAgY2luZm8tPm1hcmtlci0+ZGlzY2FyZGVkX2J5dGVzKys7CisgICAgICBJTlBVVF9TWU5DKGNpbmZvKTsKKyAgICAgIElOUFVUX0JZVEUoY2luZm8sIGMsIHJldHVybiBGQUxTRSk7CisgICAgfQorICAgIC8qIFRoaXMgbG9vcCBzd2FsbG93cyBhbnkgZHVwbGljYXRlIEZGIGJ5dGVzLiAgRXh0cmEgRkZzIGFyZSBsZWdhbCBhcworICAgICAqIHBhZCBieXRlcywgc28gZG9uJ3QgY291bnQgdGhlbSBpbiBkaXNjYXJkZWRfYnl0ZXMuICBXZSBhc3N1bWUgdGhlcmUKKyAgICAgKiB3aWxsIG5vdCBiZSBzbyBtYW55IGNvbnNlY3V0aXZlIEZGIGJ5dGVzIGFzIHRvIG92ZXJmbG93IGEgc3VzcGVuZGluZworICAgICAqIGRhdGEgc291cmNlJ3MgaW5wdXQgYnVmZmVyLgorICAgICAqLworICAgIGRvIHsKKyAgICAgIElOUFVUX0JZVEUoY2luZm8sIGMsIHJldHVybiBGQUxTRSk7CisgICAgfSB3aGlsZSAoYyA9PSAweEZGKTsKKyAgICBpZiAoYyAhPSAwKQorICAgICAgYnJlYWs7CQkJLyogZm91bmQgYSB2YWxpZCBtYXJrZXIsIGV4aXQgbG9vcCAqLworICAgIC8qIFJlYWNoIGhlcmUgaWYgd2UgZm91bmQgYSBzdHVmZmVkLXplcm8gZGF0YSBzZXF1ZW5jZSAoRkYvMDApLgorICAgICAqIERpc2NhcmQgaXQgYW5kIGxvb3AgYmFjayB0byB0cnkgYWdhaW4uCisgICAgICovCisgICAgY2luZm8tPm1hcmtlci0+ZGlzY2FyZGVkX2J5dGVzICs9IDI7CisgICAgSU5QVVRfU1lOQyhjaW5mbyk7CisgIH0KKworICBpZiAoY2luZm8tPm1hcmtlci0+ZGlzY2FyZGVkX2J5dGVzICE9IDApIHsKKyAgICBXQVJOTVMyKGNpbmZvLCBKV1JOX0VYVFJBTkVPVVNfREFUQSwgY2luZm8tPm1hcmtlci0+ZGlzY2FyZGVkX2J5dGVzLCBjKTsKKyAgICBjaW5mby0+bWFya2VyLT5kaXNjYXJkZWRfYnl0ZXMgPSAwOworICB9CisKKyAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSBjOworCisgIElOUFVUX1NZTkMoY2luZm8pOworICByZXR1cm4gVFJVRTsKK30KKworCitMT0NBTChib29sZWFuKQorZmlyc3RfbWFya2VyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogTGlrZSBuZXh0X21hcmtlciwgYnV0IHVzZWQgdG8gb2J0YWluIHRoZSBpbml0aWFsIFNPSSBtYXJrZXIuICovCisvKiBGb3IgdGhpcyBtYXJrZXIsIHdlIGRvIG5vdCBhbGxvdyBwcmVjZWRpbmcgZ2FyYmFnZSBvciBmaWxsOyBvdGhlcndpc2UsCisgKiB3ZSBtaWdodCB3ZWxsIHNjYW4gYW4gZW50aXJlIGlucHV0IGZpbGUgYmVmb3JlIHJlYWxpemluZyBpdCBhaW4ndCBKUEVHLgorICogSWYgYW4gYXBwbGljYXRpb24gd2FudHMgdG8gcHJvY2VzcyBub24tSkZJRiBmaWxlcywgaXQgbXVzdCBzZWVrIHRvIHRoZQorICogU09JIGJlZm9yZSBjYWxsaW5nIHRoZSBKUEVHIGxpYnJhcnkuCisgKi8KK3sKKyAgaW50IGMsIGMyOworICBJTlBVVF9WQVJTKGNpbmZvKTsKKworICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOworICBJTlBVVF9CWVRFKGNpbmZvLCBjMiwgcmV0dXJuIEZBTFNFKTsKKyAgaWYgKGMgIT0gMHhGRiB8fCBjMiAhPSAoaW50KSBNX1NPSSkKKyAgICBFUlJFWElUMihjaW5mbywgSkVSUl9OT19TT0ksIGMsIGMyKTsKKworICBjaW5mby0+dW5yZWFkX21hcmtlciA9IGMyOworCisgIElOUFVUX1NZTkMoY2luZm8pOworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogUmVhZCBtYXJrZXJzIHVudGlsIFNPUyBvciBFT0kuCisgKgorICogUmV0dXJucyBzYW1lIGNvZGVzIGFzIGFyZSBkZWZpbmVkIGZvciBqcGVnX2NvbnN1bWVfaW5wdXQ6CisgKiBKUEVHX1NVU1BFTkRFRCwgSlBFR19SRUFDSEVEX1NPUywgb3IgSlBFR19SRUFDSEVEX0VPSS4KKyAqLworCitNRVRIT0RERUYoaW50KQorcmVhZF9tYXJrZXJzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICAvKiBPdXRlciBsb29wIHJlcGVhdHMgb25jZSBmb3IgZWFjaCBtYXJrZXIuICovCisgIGZvciAoOzspIHsKKyAgICAvKiBDb2xsZWN0IHRoZSBtYXJrZXIgcHJvcGVyLCB1bmxlc3Mgd2UgYWxyZWFkeSBkaWQuICovCisgICAgLyogTkI6IGZpcnN0X21hcmtlcigpIGVuZm9yY2VzIHRoZSByZXF1aXJlbWVudCB0aGF0IFNPSSBhcHBlYXIgZmlyc3QuICovCisgICAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09IDApIHsKKyAgICAgIGlmICghIGNpbmZvLT5tYXJrZXItPnNhd19TT0kpIHsKKwlpZiAoISBmaXJzdF9tYXJrZXIoY2luZm8pKQorCSAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgfSBlbHNlIHsKKwlpZiAoISBuZXh0X21hcmtlcihjaW5mbykpCisJICByZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgICAgICB9CisgICAgfQorICAgIC8qIEF0IHRoaXMgcG9pbnQgY2luZm8tPnVucmVhZF9tYXJrZXIgY29udGFpbnMgdGhlIG1hcmtlciBjb2RlIGFuZCB0aGUKKyAgICAgKiBpbnB1dCBwb2ludCBpcyBqdXN0IHBhc3QgdGhlIG1hcmtlciBwcm9wZXIsIGJ1dCBiZWZvcmUgYW55IHBhcmFtZXRlcnMuCisgICAgICogQSBzdXNwZW5zaW9uIHdpbGwgY2F1c2UgdXMgdG8gcmV0dXJuIHdpdGggdGhpcyBzdGF0ZSBzdGlsbCB0cnVlLgorICAgICAqLworICAgIHN3aXRjaCAoY2luZm8tPnVucmVhZF9tYXJrZXIpIHsKKyAgICBjYXNlIE1fU09JOgorICAgICAgaWYgKCEgZ2V0X3NvaShjaW5mbykpCisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fU09GMDoJCS8qIEJhc2VsaW5lICovCisgICAgY2FzZSBNX1NPRjE6CQkvKiBFeHRlbmRlZCBzZXF1ZW50aWFsLCBIdWZmbWFuICovCisgICAgICBpZiAoISBnZXRfc29mKGNpbmZvLCBGQUxTRSwgRkFMU0UpKQorCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX1NPRjI6CQkvKiBQcm9ncmVzc2l2ZSwgSHVmZm1hbiAqLworICAgICAgaWYgKCEgZ2V0X3NvZihjaW5mbywgVFJVRSwgRkFMU0UpKQorCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX1NPRjk6CQkvKiBFeHRlbmRlZCBzZXF1ZW50aWFsLCBhcml0aG1ldGljICovCisgICAgICBpZiAoISBnZXRfc29mKGNpbmZvLCBGQUxTRSwgVFJVRSkpCisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fU09GMTA6CQkvKiBQcm9ncmVzc2l2ZSwgYXJpdGhtZXRpYyAqLworICAgICAgaWYgKCEgZ2V0X3NvZihjaW5mbywgVFJVRSwgVFJVRSkpCisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgYnJlYWs7CisKKyAgICAvKiBDdXJyZW50bHkgdW5zdXBwb3J0ZWQgU09GbiB0eXBlcyAqLworICAgIGNhc2UgTV9TT0YzOgkJLyogTG9zc2xlc3MsIEh1ZmZtYW4gKi8KKyAgICBjYXNlIE1fU09GNToJCS8qIERpZmZlcmVudGlhbCBzZXF1ZW50aWFsLCBIdWZmbWFuICovCisgICAgY2FzZSBNX1NPRjY6CQkvKiBEaWZmZXJlbnRpYWwgcHJvZ3Jlc3NpdmUsIEh1ZmZtYW4gKi8KKyAgICBjYXNlIE1fU09GNzoJCS8qIERpZmZlcmVudGlhbCBsb3NzbGVzcywgSHVmZm1hbiAqLworICAgIGNhc2UgTV9KUEc6CQkJLyogUmVzZXJ2ZWQgZm9yIEpQRUcgZXh0ZW5zaW9ucyAqLworICAgIGNhc2UgTV9TT0YxMToJCS8qIExvc3NsZXNzLCBhcml0aG1ldGljICovCisgICAgY2FzZSBNX1NPRjEzOgkJLyogRGlmZmVyZW50aWFsIHNlcXVlbnRpYWwsIGFyaXRobWV0aWMgKi8KKyAgICBjYXNlIE1fU09GMTQ6CQkvKiBEaWZmZXJlbnRpYWwgcHJvZ3Jlc3NpdmUsIGFyaXRobWV0aWMgKi8KKyAgICBjYXNlIE1fU09GMTU6CQkvKiBEaWZmZXJlbnRpYWwgbG9zc2xlc3MsIGFyaXRobWV0aWMgKi8KKyAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1NPRl9VTlNVUFBPUlRFRCwgY2luZm8tPnVucmVhZF9tYXJrZXIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fU09TOgorICAgICAgaWYgKCEgZ2V0X3NvcyhjaW5mbykpCisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSAwOwkvKiBwcm9jZXNzZWQgdGhlIG1hcmtlciAqLworICAgICAgcmV0dXJuIEpQRUdfUkVBQ0hFRF9TT1M7CisgICAgCisgICAgY2FzZSBNX0VPSToKKyAgICAgIFRSQUNFTVMoY2luZm8sIDEsIEpUUkNfRU9JKTsKKyAgICAgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gMDsJLyogcHJvY2Vzc2VkIHRoZSBtYXJrZXIgKi8KKyAgICAgIHJldHVybiBKUEVHX1JFQUNIRURfRU9JOworICAgICAgCisgICAgY2FzZSBNX0RBQzoKKyAgICAgIGlmICghIGdldF9kYWMoY2luZm8pKQorCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBNX0RIVDoKKyAgICAgIGlmICghIGdldF9kaHQoY2luZm8pKQorCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBNX0RRVDoKKyAgICAgIGlmICghIGdldF9kcXQoY2luZm8pKQorCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBNX0RSSToKKyAgICAgIGlmICghIGdldF9kcmkoY2luZm8pKQorCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBNX0FQUDA6CisgICAgY2FzZSBNX0FQUDE6CisgICAgY2FzZSBNX0FQUDI6CisgICAgY2FzZSBNX0FQUDM6CisgICAgY2FzZSBNX0FQUDQ6CisgICAgY2FzZSBNX0FQUDU6CisgICAgY2FzZSBNX0FQUDY6CisgICAgY2FzZSBNX0FQUDc6CisgICAgY2FzZSBNX0FQUDg6CisgICAgY2FzZSBNX0FQUDk6CisgICAgY2FzZSBNX0FQUDEwOgorICAgIGNhc2UgTV9BUFAxMToKKyAgICBjYXNlIE1fQVBQMTI6CisgICAgY2FzZSBNX0FQUDEzOgorICAgIGNhc2UgTV9BUFAxNDoKKyAgICBjYXNlIE1fQVBQMTU6CisgICAgICBpZiAoISAoKigobXlfbWFya2VyX3B0cikgY2luZm8tPm1hcmtlciktPnByb2Nlc3NfQVBQblsKKwkJY2luZm8tPnVucmVhZF9tYXJrZXIgLSAoaW50KSBNX0FQUDBdKSAoY2luZm8pKQorCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgY2FzZSBNX0NPTToKKyAgICAgIGlmICghICgqKChteV9tYXJrZXJfcHRyKSBjaW5mby0+bWFya2VyKS0+cHJvY2Vzc19DT00pIChjaW5mbykpCisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fUlNUMDoJCS8qIHRoZXNlIGFyZSBhbGwgcGFyYW1ldGVybGVzcyAqLworICAgIGNhc2UgTV9SU1QxOgorICAgIGNhc2UgTV9SU1QyOgorICAgIGNhc2UgTV9SU1QzOgorICAgIGNhc2UgTV9SU1Q0OgorICAgIGNhc2UgTV9SU1Q1OgorICAgIGNhc2UgTV9SU1Q2OgorICAgIGNhc2UgTV9SU1Q3OgorICAgIGNhc2UgTV9URU06CisgICAgICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19QQVJNTEVTU19NQVJLRVIsIGNpbmZvLT51bnJlYWRfbWFya2VyKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX0ROTDoJCQkvKiBJZ25vcmUgRE5MIC4uLiBwZXJoYXBzIHRoZSB3cm9uZyB0aGluZyAqLworICAgICAgaWYgKCEgc2tpcF92YXJpYWJsZShjaW5mbykpCisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgkJCS8qIG11c3QgYmUgREhQLCBFWFAsIEpQR24sIG9yIFJFU24gKi8KKyAgICAgIC8qIEZvciBub3csIHdlIHRyZWF0IHRoZSByZXNlcnZlZCBtYXJrZXJzIGFzIGZhdGFsIGVycm9ycyBzaW5jZSB0aGV5IGFyZQorICAgICAgICogbGlrZWx5IHRvIGJlIHVzZWQgdG8gc2lnbmFsIGluY29tcGF0aWJsZSBKUEVHIFBhcnQgMyBleHRlbnNpb25zLgorICAgICAgICogT25jZSB0aGUgSlBFRyAzIHZlcnNpb24tbnVtYmVyIG1hcmtlciBpcyB3ZWxsIGRlZmluZWQsIHRoaXMgY29kZQorICAgICAgICogb3VnaHQgdG8gY2hhbmdlIQorICAgICAgICovCisgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9VTktOT1dOX01BUktFUiwgY2luZm8tPnVucmVhZF9tYXJrZXIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIC8qIFN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgbWFya2VyLCBzbyByZXNldCBzdGF0ZSB2YXJpYWJsZSAqLworICAgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gMDsKKyAgfSAvKiBlbmQgbG9vcCAqLworfQorCisKKy8qCisgKiBSZWFkIGEgcmVzdGFydCBtYXJrZXIsIHdoaWNoIGlzIGV4cGVjdGVkIHRvIGFwcGVhciBuZXh0IGluIHRoZSBkYXRhc3RyZWFtOworICogaWYgdGhlIG1hcmtlciBpcyBub3QgdGhlcmUsIHRha2UgYXBwcm9wcmlhdGUgcmVjb3ZlcnkgYWN0aW9uLgorICogUmV0dXJucyBGQUxTRSBpZiBzdXNwZW5zaW9uIGlzIHJlcXVpcmVkLgorICoKKyAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBlbnRyb3B5IGRlY29kZXIgYWZ0ZXIgaXQgaGFzIHJlYWQgYW4gYXBwcm9wcmlhdGUKKyAqIG51bWJlciBvZiBNQ1VzLiAgY2luZm8tPnVucmVhZF9tYXJrZXIgbWF5IGJlIG5vbnplcm8gaWYgdGhlIGVudHJvcHkgZGVjb2RlcgorICogaGFzIGFscmVhZHkgcmVhZCBhIG1hcmtlciBmcm9tIHRoZSBkYXRhIHNvdXJjZS4gIFVuZGVyIG5vcm1hbCBjb25kaXRpb25zCisgKiBjaW5mby0+dW5yZWFkX21hcmtlciB3aWxsIGJlIHJlc2V0IHRvIDAgYmVmb3JlIHJldHVybmluZzsgaWYgbm90IHJlc2V0LAorICogaXQgaG9sZHMgYSBtYXJrZXIgd2hpY2ggdGhlIGRlY29kZXIgd2lsbCBiZSB1bmFibGUgdG8gcmVhZCBwYXN0LgorICovCisKK01FVEhPRERFRihib29sZWFuKQorcmVhZF9yZXN0YXJ0X21hcmtlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgLyogT2J0YWluIGEgbWFya2VyIHVubGVzcyB3ZSBhbHJlYWR5IGRpZC4gKi8KKyAgLyogTm90ZSB0aGF0IG5leHRfbWFya2VyIHdpbGwgY29tcGxhaW4gaWYgaXQgc2tpcHMgYW55IGRhdGEuICovCisgIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PSAwKSB7CisgICAgaWYgKCEgbmV4dF9tYXJrZXIoY2luZm8pKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09CisgICAgICAoKGludCkgTV9SU1QwICsgY2luZm8tPm1hcmtlci0+bmV4dF9yZXN0YXJ0X251bSkpIHsKKyAgICAvKiBOb3JtYWwgY2FzZSAtLS0gc3dhbGxvdyB0aGUgbWFya2VyIGFuZCBsZXQgZW50cm9weSBkZWNvZGVyIGNvbnRpbnVlICovCisgICAgVFJBQ0VNUzEoY2luZm8sIDMsIEpUUkNfUlNULCBjaW5mby0+bWFya2VyLT5uZXh0X3Jlc3RhcnRfbnVtKTsKKyAgICBjaW5mby0+dW5yZWFkX21hcmtlciA9IDA7CisgIH0gZWxzZSB7CisgICAgLyogVWgtb2gsIHRoZSByZXN0YXJ0IG1hcmtlcnMgaGF2ZSBiZWVuIG1lc3NlZCB1cC4gKi8KKyAgICAvKiBMZXQgdGhlIGRhdGEgc291cmNlIG1hbmFnZXIgZGV0ZXJtaW5lIGhvdyB0byByZXN5bmMuICovCisgICAgaWYgKCEgKCpjaW5mby0+c3JjLT5yZXN5bmNfdG9fcmVzdGFydCkgKGNpbmZvLAorCQkJCQkgICAgY2luZm8tPm1hcmtlci0+bmV4dF9yZXN0YXJ0X251bSkpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBVcGRhdGUgbmV4dC1yZXN0YXJ0IHN0YXRlICovCisgIGNpbmZvLT5tYXJrZXItPm5leHRfcmVzdGFydF9udW0gPSAoY2luZm8tPm1hcmtlci0+bmV4dF9yZXN0YXJ0X251bSArIDEpICYgNzsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogVGhpcyBpcyB0aGUgZGVmYXVsdCByZXN5bmNfdG9fcmVzdGFydCBtZXRob2QgZm9yIGRhdGEgc291cmNlIG1hbmFnZXJzCisgKiB0byB1c2UgaWYgdGhleSBkb24ndCBoYXZlIGFueSBiZXR0ZXIgYXBwcm9hY2guICBTb21lIGRhdGEgc291cmNlIG1hbmFnZXJzCisgKiBtYXkgYmUgYWJsZSB0byBiYWNrIHVwLCBvciBtYXkgaGF2ZSBhZGRpdGlvbmFsIGtub3dsZWRnZSBhYm91dCB0aGUgZGF0YQorICogd2hpY2ggcGVybWl0cyBhIG1vcmUgaW50ZWxsaWdlbnQgcmVjb3Zlcnkgc3RyYXRlZ3k7IHN1Y2ggbWFuYWdlcnMgd291bGQKKyAqIHByZXN1bWFibHkgc3VwcGx5IHRoZWlyIG93biByZXN5bmMgbWV0aG9kLgorICoKKyAqIHJlYWRfcmVzdGFydF9tYXJrZXIgY2FsbHMgcmVzeW5jX3RvX3Jlc3RhcnQgaWYgaXQgZmluZHMgYSBtYXJrZXIgb3RoZXIgdGhhbgorICogdGhlIHJlc3RhcnQgbWFya2VyIGl0IHdhcyBleHBlY3RpbmcuICAoVGhpcyBjb2RlIGlzICpub3QqIHVzZWQgdW5sZXNzCisgKiBhIG5vbnplcm8gcmVzdGFydCBpbnRlcnZhbCBoYXMgYmVlbiBkZWNsYXJlZC4pICBjaW5mby0+dW5yZWFkX21hcmtlciBpcworICogdGhlIG1hcmtlciBjb2RlIGFjdHVhbGx5IGZvdW5kIChtaWdodCBiZSBhbnl0aGluZywgZXhjZXB0IDAgb3IgRkYpLgorICogVGhlIGRlc2lyZWQgcmVzdGFydCBtYXJrZXIgbnVtYmVyICgwLi43KSBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIuCisgKiBUaGlzIHJvdXRpbmUgaXMgc3VwcG9zZWQgdG8gYXBwbHkgd2hhdGV2ZXIgZXJyb3IgcmVjb3Zlcnkgc3RyYXRlZ3kgc2VlbXMKKyAqIGFwcHJvcHJpYXRlIGluIG9yZGVyIHRvIHBvc2l0aW9uIHRoZSBpbnB1dCBzdHJlYW0gdG8gdGhlIG5leHQgZGF0YSBzZWdtZW50LgorICogTm90ZSB0aGF0IGNpbmZvLT51bnJlYWRfbWFya2VyIGlzIHRyZWF0ZWQgYXMgYSBtYXJrZXIgYXBwZWFyaW5nIGJlZm9yZQorICogdGhlIGN1cnJlbnQgZGF0YS1zb3VyY2UgaW5wdXQgcG9pbnQ7IHVzdWFsbHkgaXQgc2hvdWxkIGJlIHJlc2V0IHRvIHplcm8KKyAqIGJlZm9yZSByZXR1cm5pbmcuCisgKiBSZXR1cm5zIEZBTFNFIGlmIHN1c3BlbnNpb24gaXMgcmVxdWlyZWQuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBzdWJzdGFudGlhbGx5IGNvbnN0cmFpbmVkIGJ5IHdhbnRpbmcgdG8gdHJlYXQgdGhlCisgKiBpbnB1dCBhcyBhIGRhdGEgc3RyZWFtOyB0aGlzIG1lYW5zIHdlIGNhbid0IGJhY2sgdXAuICBUaGVyZWZvcmUsIHdlIGhhdmUKKyAqIG9ubHkgdGhlIGZvbGxvd2luZyBhY3Rpb25zIHRvIHdvcmsgd2l0aDoKKyAqICAgMS4gU2ltcGx5IGRpc2NhcmQgdGhlIG1hcmtlciBhbmQgbGV0IHRoZSBlbnRyb3B5IGRlY29kZXIgcmVzdW1lIGF0IG5leHQKKyAqICAgICAgYnl0ZSBvZiBmaWxlLgorICogICAyLiBSZWFkIGZvcndhcmQgdW50aWwgd2UgZmluZCBhbm90aGVyIG1hcmtlciwgZGlzY2FyZGluZyBpbnRlcnZlbmluZworICogICAgICBkYXRhLiAgKEluIHRoZW9yeSB3ZSBjb3VsZCBsb29rIGFoZWFkIHdpdGhpbiB0aGUgY3VycmVudCBidWZmZXJsb2FkLAorICogICAgICB3aXRob3V0IGhhdmluZyB0byBkaXNjYXJkIGRhdGEgaWYgd2UgZG9uJ3QgZmluZCB0aGUgZGVzaXJlZCBtYXJrZXIuCisgKiAgICAgIFRoaXMgaWRlYSBpcyBub3QgaW1wbGVtZW50ZWQgaGVyZSwgaW4gcGFydCBiZWNhdXNlIGl0IG1ha2VzIGJlaGF2aW9yCisgKiAgICAgIGRlcGVuZGVudCBvbiBidWZmZXIgc2l6ZSBhbmQgY2hhbmNlIGJ1ZmZlci1ib3VuZGFyeSBwb3NpdGlvbnMuKQorICogICAzLiBMZWF2ZSB0aGUgbWFya2VyIHVucmVhZCAoYnkgZmFpbGluZyB0byB6ZXJvIGNpbmZvLT51bnJlYWRfbWFya2VyKS4KKyAqICAgICAgVGhpcyB3aWxsIGNhdXNlIHRoZSBlbnRyb3B5IGRlY29kZXIgdG8gcHJvY2VzcyBhbiBlbXB0eSBkYXRhIHNlZ21lbnQsCisgKiAgICAgIGluc2VydGluZyBkdW1teSB6ZXJvZXMsIGFuZCB0aGVuIHdlIHdpbGwgcmVwcm9jZXNzIHRoZSBtYXJrZXIuCisgKgorICogIzIgaXMgYXBwcm9wcmlhdGUgaWYgd2UgdGhpbmsgdGhlIGRlc2lyZWQgbWFya2VyIGxpZXMgYWhlYWQsIHdoaWxlICMzIGlzCisgKiBhcHByb3ByaWF0ZSBpZiB0aGUgZm91bmQgbWFya2VyIGlzIGEgZnV0dXJlIHJlc3RhcnQgbWFya2VyIChpbmRpY2F0aW5nCisgKiB0aGF0IHdlIGhhdmUgbWlzc2VkIHRoZSBkZXNpcmVkIHJlc3RhcnQgbWFya2VyLCBwcm9iYWJseSBiZWNhdXNlIGl0IGdvdAorICogY29ycnVwdGVkKS4KKyAqIFdlIGFwcGx5ICMyIG9yICMzIGlmIHRoZSBmb3VuZCBtYXJrZXIgaXMgYSByZXN0YXJ0IG1hcmtlciBubyBtb3JlIHRoYW4KKyAqIHR3byBjb3VudHMgYmVoaW5kIG9yIGFoZWFkIG9mIHRoZSBleHBlY3RlZCBvbmUuICBXZSBhbHNvIGFwcGx5ICMyIGlmIHRoZQorICogZm91bmQgbWFya2VyIGlzIG5vdCBhIGxlZ2FsIEpQRUcgbWFya2VyIGNvZGUgKGl0J3MgY2VydGFpbmx5IGJvZ3VzIGRhdGEpLgorICogSWYgdGhlIGZvdW5kIG1hcmtlciBpcyBhIHJlc3RhcnQgbWFya2VyIG1vcmUgdGhhbiAyIGNvdW50cyBhd2F5LCB3ZSBkbyAjMQorICogKHRvbyBtdWNoIHJpc2sgdGhhdCB0aGUgbWFya2VyIGlzIGVycm9uZW91czsgd2l0aCBsdWNrIHdlIHdpbGwgYmUgYWJsZSB0bworICogcmVzeW5jIGF0IHNvbWUgZnV0dXJlIHBvaW50KS4KKyAqIEZvciBhbnkgdmFsaWQgbm9uLXJlc3RhcnQgSlBFRyBtYXJrZXIsIHdlIGFwcGx5ICMzLiAgVGhpcyBrZWVwcyB1cyBmcm9tCisgKiBvdmVycnVubmluZyB0aGUgZW5kIG9mIGEgc2Nhbi4gIEFuIGltcGxlbWVudGF0aW9uIGxpbWl0ZWQgdG8gc2luZ2xlLXNjYW4KKyAqIGZpbGVzIG1pZ2h0IGZpbmQgaXQgYmV0dGVyIHRvIGFwcGx5ICMyIGZvciBtYXJrZXJzIG90aGVyIHRoYW4gRU9JLCBzaW5jZQorICogYW55IG90aGVyIG1hcmtlciB3b3VsZCBoYXZlIHRvIGJlIGJvZ3VzIGRhdGEgaW4gdGhhdCBjYXNlLgorICovCisKK0dMT0JBTChib29sZWFuKQoranBlZ19yZXN5bmNfdG9fcmVzdGFydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGRlc2lyZWQpCit7CisgIGludCBtYXJrZXIgPSBjaW5mby0+dW5yZWFkX21hcmtlcjsKKyAgaW50IGFjdGlvbiA9IDE7CisgIAorICAvKiBBbHdheXMgcHV0IHVwIGEgd2FybmluZy4gKi8KKyAgV0FSTk1TMihjaW5mbywgSldSTl9NVVNUX1JFU1lOQywgbWFya2VyLCBkZXNpcmVkKTsKKyAgCisgIC8qIE91dGVyIGxvb3AgaGFuZGxlcyByZXBlYXRlZCBkZWNpc2lvbiBhZnRlciBzY2FubmluZyBmb3J3YXJkLiAqLworICBmb3IgKDs7KSB7CisgICAgaWYgKG1hcmtlciA8IChpbnQpIE1fU09GMCkKKyAgICAgIGFjdGlvbiA9IDI7CQkvKiBpbnZhbGlkIG1hcmtlciAqLworICAgIGVsc2UgaWYgKG1hcmtlciA8IChpbnQpIE1fUlNUMCB8fCBtYXJrZXIgPiAoaW50KSBNX1JTVDcpCisgICAgICBhY3Rpb24gPSAzOwkJLyogdmFsaWQgbm9uLXJlc3RhcnQgbWFya2VyICovCisgICAgZWxzZSB7CisgICAgICBpZiAobWFya2VyID09ICgoaW50KSBNX1JTVDAgKyAoKGRlc2lyZWQrMSkgJiA3KSkgfHwKKwkgIG1hcmtlciA9PSAoKGludCkgTV9SU1QwICsgKChkZXNpcmVkKzIpICYgNykpKQorCWFjdGlvbiA9IDM7CQkvKiBvbmUgb2YgdGhlIG5leHQgdHdvIGV4cGVjdGVkIHJlc3RhcnRzICovCisgICAgICBlbHNlIGlmIChtYXJrZXIgPT0gKChpbnQpIE1fUlNUMCArICgoZGVzaXJlZC0xKSAmIDcpKSB8fAorCSAgICAgICBtYXJrZXIgPT0gKChpbnQpIE1fUlNUMCArICgoZGVzaXJlZC0yKSAmIDcpKSkKKwlhY3Rpb24gPSAyOwkJLyogYSBwcmlvciByZXN0YXJ0LCBzbyBhZHZhbmNlICovCisgICAgICBlbHNlCisJYWN0aW9uID0gMTsJCS8qIGRlc2lyZWQgcmVzdGFydCBvciB0b28gZmFyIGF3YXkgKi8KKyAgICB9CisgICAgVFJBQ0VNUzIoY2luZm8sIDQsIEpUUkNfUkVDT1ZFUllfQUNUSU9OLCBtYXJrZXIsIGFjdGlvbik7CisgICAgc3dpdGNoIChhY3Rpb24pIHsKKyAgICBjYXNlIDE6CisgICAgICAvKiBEaXNjYXJkIG1hcmtlciBhbmQgbGV0IGVudHJvcHkgZGVjb2RlciByZXN1bWUgcHJvY2Vzc2luZy4gKi8KKyAgICAgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gMDsKKyAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgMjoKKyAgICAgIC8qIFNjYW4gdG8gdGhlIG5leHQgbWFya2VyLCBhbmQgcmVwZWF0IHRoZSBkZWNpc2lvbiBsb29wLiAqLworICAgICAgaWYgKCEgbmV4dF9tYXJrZXIoY2luZm8pKQorCXJldHVybiBGQUxTRTsKKyAgICAgIG1hcmtlciA9IGNpbmZvLT51bnJlYWRfbWFya2VyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgLyogUmV0dXJuIHdpdGhvdXQgYWR2YW5jaW5nIHBhc3QgdGhpcyBtYXJrZXIuICovCisgICAgICAvKiBFbnRyb3B5IGRlY29kZXIgd2lsbCBiZSBmb3JjZWQgdG8gcHJvY2VzcyBhbiBlbXB0eSBzZWdtZW50LiAqLworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9IC8qIGVuZCBsb29wICovCit9CisKKworLyoKKyAqIFJlc2V0IG1hcmtlciBwcm9jZXNzaW5nIHN0YXRlIHRvIGJlZ2luIGEgZnJlc2ggZGF0YXN0cmVhbS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3Jlc2V0X21hcmtlcl9yZWFkZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X21hcmtlcl9wdHIgbWFya2VyID0gKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXI7CisKKyAgY2luZm8tPmNvbXBfaW5mbyA9IE5VTEw7CQkvKiB1bnRpbCBhbGxvY2F0ZWQgYnkgZ2V0X3NvZiAqLworICBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPSAwOwkJLyogbm8gU09TIHNlZW4geWV0ICovCisgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gMDsJCS8qIG5vIHBlbmRpbmcgbWFya2VyICovCisgIG1hcmtlci0+cHViLnNhd19TT0kgPSBGQUxTRTsJCS8qIHNldCBpbnRlcm5hbCBzdGF0ZSB0b28gKi8KKyAgbWFya2VyLT5wdWIuc2F3X1NPRiA9IEZBTFNFOworICBtYXJrZXItPnB1Yi5kaXNjYXJkZWRfYnl0ZXMgPSAwOworICBtYXJrZXItPmN1cl9tYXJrZXIgPSBOVUxMOworfQorCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBtYXJrZXIgcmVhZGVyIG1vZHVsZS4KKyAqIFRoaXMgaXMgY2FsbGVkIG9ubHkgb25jZSwgd2hlbiB0aGUgZGVjb21wcmVzc2lvbiBvYmplY3QgaXMgY3JlYXRlZC4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X21hcmtlcl9yZWFkZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X21hcmtlcl9wdHIgbWFya2VyOworICBpbnQgaTsKKworICAvKiBDcmVhdGUgc3Vib2JqZWN0IGluIHBlcm1hbmVudCBwb29sICovCisgIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfUEVSTUFORU5ULAorCQkJCVNJWkVPRihteV9tYXJrZXJfcmVhZGVyKSk7CisgIGNpbmZvLT5tYXJrZXIgPSAoc3RydWN0IGpwZWdfbWFya2VyX3JlYWRlciAqKSBtYXJrZXI7CisgIC8qIEluaXRpYWxpemUgcHVibGljIG1ldGhvZCBwb2ludGVycyAqLworICBtYXJrZXItPnB1Yi5yZXNldF9tYXJrZXJfcmVhZGVyID0gcmVzZXRfbWFya2VyX3JlYWRlcjsKKyAgbWFya2VyLT5wdWIucmVhZF9tYXJrZXJzID0gcmVhZF9tYXJrZXJzOworICBtYXJrZXItPnB1Yi5yZWFkX3Jlc3RhcnRfbWFya2VyID0gcmVhZF9yZXN0YXJ0X21hcmtlcjsKKyAgLyogSW5pdGlhbGl6ZSBDT00vQVBQbiBwcm9jZXNzaW5nLgorICAgKiBCeSBkZWZhdWx0LCB3ZSBleGFtaW5lIGFuZCB0aGVuIGRpc2NhcmQgQVBQMCBhbmQgQVBQMTQsCisgICAqIGJ1dCBzaW1wbHkgZGlzY2FyZCBDT00gYW5kIGFsbCBvdGhlciBBUFBuLgorICAgKi8KKyAgbWFya2VyLT5wcm9jZXNzX0NPTSA9IHNraXBfdmFyaWFibGU7CisgIG1hcmtlci0+bGVuZ3RoX2xpbWl0X0NPTSA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgbWFya2VyLT5wcm9jZXNzX0FQUG5baV0gPSBza2lwX3ZhcmlhYmxlOworICAgIG1hcmtlci0+bGVuZ3RoX2xpbWl0X0FQUG5baV0gPSAwOworICB9CisgIG1hcmtlci0+cHJvY2Vzc19BUFBuWzBdID0gZ2V0X2ludGVyZXN0aW5nX2FwcG47CisgIG1hcmtlci0+cHJvY2Vzc19BUFBuWzE0XSA9IGdldF9pbnRlcmVzdGluZ19hcHBuOworICAvKiBSZXNldCBtYXJrZXIgcHJvY2Vzc2luZyBzdGF0ZSAqLworICByZXNldF9tYXJrZXJfcmVhZGVyKGNpbmZvKTsKK30KKworCisvKgorICogQ29udHJvbCBzYXZpbmcgb2YgQ09NIGFuZCBBUFBuIG1hcmtlcnMgaW50byBtYXJrZXJfbGlzdC4KKyAqLworCisjaWZkZWYgU0FWRV9NQVJLRVJTX1NVUFBPUlRFRAorCitHTE9CQUwodm9pZCkKK2pwZWdfc2F2ZV9tYXJrZXJzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyX2NvZGUsCisJCSAgIHVuc2lnbmVkIGludCBsZW5ndGhfbGltaXQpCit7CisgIG15X21hcmtlcl9wdHIgbWFya2VyID0gKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXI7CisgIGxvbmcgbWF4bGVuZ3RoOworICBqcGVnX21hcmtlcl9wYXJzZXJfbWV0aG9kIHByb2Nlc3NvcjsKKworICAvKiBMZW5ndGggbGltaXQgbXVzdG4ndCBiZSBsYXJnZXIgdGhhbiB3aGF0IHdlIGNhbiBhbGxvY2F0ZQorICAgKiAoc2hvdWxkIG9ubHkgYmUgYSBjb25jZXJuIGluIGEgMTYtYml0IGVudmlyb25tZW50KS4KKyAgICovCisgIG1heGxlbmd0aCA9IGNpbmZvLT5tZW0tPm1heF9hbGxvY19jaHVuayAtIFNJWkVPRihzdHJ1Y3QganBlZ19tYXJrZXJfc3RydWN0KTsKKyAgaWYgKCgobG9uZykgbGVuZ3RoX2xpbWl0KSA+IG1heGxlbmd0aCkKKyAgICBsZW5ndGhfbGltaXQgPSAodW5zaWduZWQgaW50KSBtYXhsZW5ndGg7CisKKyAgLyogQ2hvb3NlIHByb2Nlc3NvciByb3V0aW5lIHRvIHVzZS4KKyAgICogQVBQMC9BUFAxNCBoYXZlIHNwZWNpYWwgcmVxdWlyZW1lbnRzLgorICAgKi8KKyAgaWYgKGxlbmd0aF9saW1pdCkgeworICAgIHByb2Nlc3NvciA9IHNhdmVfbWFya2VyOworICAgIC8qIElmIHNhdmluZyBBUFAwL0FQUDE0LCBzYXZlIGF0IGxlYXN0IGVub3VnaCBmb3Igb3VyIGludGVybmFsIHVzZS4gKi8KKyAgICBpZiAobWFya2VyX2NvZGUgPT0gKGludCkgTV9BUFAwICYmIGxlbmd0aF9saW1pdCA8IEFQUDBfREFUQV9MRU4pCisgICAgICBsZW5ndGhfbGltaXQgPSBBUFAwX0RBVEFfTEVOOworICAgIGVsc2UgaWYgKG1hcmtlcl9jb2RlID09IChpbnQpIE1fQVBQMTQgJiYgbGVuZ3RoX2xpbWl0IDwgQVBQMTRfREFUQV9MRU4pCisgICAgICBsZW5ndGhfbGltaXQgPSBBUFAxNF9EQVRBX0xFTjsKKyAgfSBlbHNlIHsKKyAgICBwcm9jZXNzb3IgPSBza2lwX3ZhcmlhYmxlOworICAgIC8qIElmIGRpc2NhcmRpbmcgQVBQMC9BUFAxNCwgdXNlIG91ciByZWd1bGFyIG9uLXRoZS1mbHkgcHJvY2Vzc29yLiAqLworICAgIGlmIChtYXJrZXJfY29kZSA9PSAoaW50KSBNX0FQUDAgfHwgbWFya2VyX2NvZGUgPT0gKGludCkgTV9BUFAxNCkKKyAgICAgIHByb2Nlc3NvciA9IGdldF9pbnRlcmVzdGluZ19hcHBuOworICB9CisKKyAgaWYgKG1hcmtlcl9jb2RlID09IChpbnQpIE1fQ09NKSB7CisgICAgbWFya2VyLT5wcm9jZXNzX0NPTSA9IHByb2Nlc3NvcjsKKyAgICBtYXJrZXItPmxlbmd0aF9saW1pdF9DT00gPSBsZW5ndGhfbGltaXQ7CisgIH0gZWxzZSBpZiAobWFya2VyX2NvZGUgPj0gKGludCkgTV9BUFAwICYmIG1hcmtlcl9jb2RlIDw9IChpbnQpIE1fQVBQMTUpIHsKKyAgICBtYXJrZXItPnByb2Nlc3NfQVBQblttYXJrZXJfY29kZSAtIChpbnQpIE1fQVBQMF0gPSBwcm9jZXNzb3I7CisgICAgbWFya2VyLT5sZW5ndGhfbGltaXRfQVBQblttYXJrZXJfY29kZSAtIChpbnQpIE1fQVBQMF0gPSBsZW5ndGhfbGltaXQ7CisgIH0gZWxzZQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1VOS05PV05fTUFSS0VSLCBtYXJrZXJfY29kZSk7Cit9CisKKyNlbmRpZiAvKiBTQVZFX01BUktFUlNfU1VQUE9SVEVEICovCisKKworLyoKKyAqIEluc3RhbGwgYSBzcGVjaWFsIHByb2Nlc3NpbmcgbWV0aG9kIGZvciBDT00gb3IgQVBQbiBtYXJrZXJzLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19zZXRfbWFya2VyX3Byb2Nlc3NvciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlcl9jb2RlLAorCQkJICAganBlZ19tYXJrZXJfcGFyc2VyX21ldGhvZCByb3V0aW5lKQoreworICBteV9tYXJrZXJfcHRyIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKSBjaW5mby0+bWFya2VyOworCisgIGlmIChtYXJrZXJfY29kZSA9PSAoaW50KSBNX0NPTSkKKyAgICBtYXJrZXItPnByb2Nlc3NfQ09NID0gcm91dGluZTsKKyAgZWxzZSBpZiAobWFya2VyX2NvZGUgPj0gKGludCkgTV9BUFAwICYmIG1hcmtlcl9jb2RlIDw9IChpbnQpIE1fQVBQMTUpCisgICAgbWFya2VyLT5wcm9jZXNzX0FQUG5bbWFya2VyX2NvZGUgLSAoaW50KSBNX0FQUDBdID0gcm91dGluZTsKKyAgZWxzZQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1VOS05PV05fTUFSS0VSLCBtYXJrZXJfY29kZSk7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRtYXN0ZXIuYyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qZG1hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MDJjNWIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRtYXN0ZXIuYwpAQCAtMCwwICsxLDU1NyBAQAorLyoKKyAqIGpkbWFzdGVyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBtYXN0ZXIgY29udHJvbCBsb2dpYyBmb3IgdGhlIEpQRUcgZGVjb21wcmVzc29yLgorICogVGhlc2Ugcm91dGluZXMgYXJlIGNvbmNlcm5lZCB3aXRoIHNlbGVjdGluZyB0aGUgbW9kdWxlcyB0byBiZSBleGVjdXRlZAorICogYW5kIHdpdGggZGV0ZXJtaW5pbmcgdGhlIG51bWJlciBvZiBwYXNzZXMgYW5kIHRoZSB3b3JrIHRvIGJlIGRvbmUgaW4gZWFjaAorICogcGFzcy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyogUHJpdmF0ZSBzdGF0ZSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2RlY29tcF9tYXN0ZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgaW50IHBhc3NfbnVtYmVyOwkJLyogIyBvZiBwYXNzZXMgY29tcGxldGVkICovCisKKyAgYm9vbGVhbiB1c2luZ19tZXJnZWRfdXBzYW1wbGU7IC8qIFRSVUUgaWYgdXNpbmcgbWVyZ2VkIHVwc2FtcGxlL2Njb252ZXJ0ICovCisKKyAgLyogU2F2ZWQgcmVmZXJlbmNlcyB0byBpbml0aWFsaXplZCBxdWFudGl6ZXIgbW9kdWxlcywKKyAgICogaW4gY2FzZSB3ZSBuZWVkIHRvIHN3aXRjaCBtb2Rlcy4KKyAgICovCisgIHN0cnVjdCBqcGVnX2NvbG9yX3F1YW50aXplciAqIHF1YW50aXplcl8xcGFzczsKKyAgc3RydWN0IGpwZWdfY29sb3JfcXVhbnRpemVyICogcXVhbnRpemVyXzJwYXNzOworfSBteV9kZWNvbXBfbWFzdGVyOworCit0eXBlZGVmIG15X2RlY29tcF9tYXN0ZXIgKiBteV9tYXN0ZXJfcHRyOworCisKKy8qCisgKiBEZXRlcm1pbmUgd2hldGhlciBtZXJnZWQgdXBzYW1wbGUvY29sb3IgY29udmVyc2lvbiBzaG91bGQgYmUgdXNlZC4KKyAqIENSVUNJQUw6IHRoaXMgbXVzdCBtYXRjaCB0aGUgYWN0dWFsIGNhcGFiaWxpdGllcyBvZiBqZG1lcmdlLmMhCisgKi8KKworTE9DQUwoYm9vbGVhbikKK3VzZV9tZXJnZWRfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisjaWZkZWYgVVBTQU1QTEVfTUVSR0lOR19TVVBQT1JURUQKKyAgLyogTWVyZ2luZyBpcyB0aGUgZXF1aXZhbGVudCBvZiBwbGFpbiBib3gtZmlsdGVyIHVwc2FtcGxpbmcgKi8KKyAgaWYgKGNpbmZvLT5kb19mYW5jeV91cHNhbXBsaW5nIHx8IGNpbmZvLT5DQ0lSNjAxX3NhbXBsaW5nKQorICAgIHJldHVybiBGQUxTRTsKKyAgLyogamRtZXJnZS5jIG9ubHkgc3VwcG9ydHMgWUNDPT5SR0IgY29sb3IgY29udmVyc2lvbiAqLworICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgIT0gSkNTX1lDYkNyIHx8IGNpbmZvLT5udW1fY29tcG9uZW50cyAhPSAzIHx8CisgICAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlICE9IEpDU19SR0IgfHwKKyAgICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyAhPSBSR0JfUElYRUxTSVpFKQorICAgIHJldHVybiBGQUxTRTsKKyAgLyogYW5kIGl0IG9ubHkgaGFuZGxlcyAyaDF2IG9yIDJoMnYgc2FtcGxpbmcgcmF0aW9zICovCisgIGlmIChjaW5mby0+Y29tcF9pbmZvWzBdLmhfc2FtcF9mYWN0b3IgIT0gMiB8fAorICAgICAgY2luZm8tPmNvbXBfaW5mb1sxXS5oX3NhbXBfZmFjdG9yICE9IDEgfHwKKyAgICAgIGNpbmZvLT5jb21wX2luZm9bMl0uaF9zYW1wX2ZhY3RvciAhPSAxIHx8CisgICAgICBjaW5mby0+Y29tcF9pbmZvWzBdLnZfc2FtcF9mYWN0b3IgPiAgMiB8fAorICAgICAgY2luZm8tPmNvbXBfaW5mb1sxXS52X3NhbXBfZmFjdG9yICE9IDEgfHwKKyAgICAgIGNpbmZvLT5jb21wX2luZm9bMl0udl9zYW1wX2ZhY3RvciAhPSAxKQorICAgIHJldHVybiBGQUxTRTsKKyAgLyogZnVydGhlcm1vcmUsIGl0IGRvZXNuJ3Qgd29yayBpZiB3ZSd2ZSBzY2FsZWQgdGhlIElEQ1RzIGRpZmZlcmVudGx5ICovCisgIGlmIChjaW5mby0+Y29tcF9pbmZvWzBdLkRDVF9zY2FsZWRfc2l6ZSAhPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSB8fAorICAgICAgY2luZm8tPmNvbXBfaW5mb1sxXS5EQ1Rfc2NhbGVkX3NpemUgIT0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgfHwKKyAgICAgIGNpbmZvLT5jb21wX2luZm9bMl0uRENUX3NjYWxlZF9zaXplICE9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplKQorICAgIHJldHVybiBGQUxTRTsKKyAgLyogPz8/IGFsc28gbmVlZCB0byB0ZXN0IGZvciB1cHNhbXBsZS10aW1lIHJlc2NhbGluZywgd2hlbiAmIGlmIHN1cHBvcnRlZCAqLworICByZXR1cm4gVFJVRTsJCQkvKiBieSBnb2xseSwgaXQnbGwgd29yay4uLiAqLworI2Vsc2UKKyAgcmV0dXJuIEZBTFNFOworI2VuZGlmCit9CisKKworLyoKKyAqIENvbXB1dGUgb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMgYW5kIHJlbGF0ZWQgdmFsdWVzLgorICogTk9URTogdGhpcyBpcyBleHBvcnRlZCBmb3IgcG9zc2libGUgdXNlIGJ5IGFwcGxpY2F0aW9uLgorICogSGVuY2UgaXQgbXVzdG4ndCBkbyBhbnl0aGluZyB0aGF0IGNhbid0IGJlIGRvbmUgdHdpY2UuCisgKiBBbHNvIG5vdGUgdGhhdCBpdCBtYXkgYmUgY2FsbGVkIGJlZm9yZSB0aGUgbWFzdGVyIG1vZHVsZSBpcyBpbml0aWFsaXplZCEKKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIERvIGNvbXB1dGF0aW9ucyB0aGF0IGFyZSBuZWVkZWQgYmVmb3JlIG1hc3RlciBzZWxlY3Rpb24gcGhhc2UgKi8KK3sKKyNpZmRlZiBJRENUX1NDQUxJTkdfU1VQUE9SVEVECisgIGludCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyNlbmRpZgorCisgIC8qIFByZXZlbnQgYXBwbGljYXRpb24gZnJvbSBjYWxsaW5nIG1lIGF0IHdyb25nIHRpbWVzICovCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9SRUFEWSkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworCisjaWZkZWYgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAorCisgIC8qIENvbXB1dGUgYWN0dWFsIG91dHB1dCBpbWFnZSBkaW1lbnNpb25zIGFuZCBEQ1Qgc2NhbGluZyBjaG9pY2VzLiAqLworICBpZiAoY2luZm8tPnNjYWxlX251bSAqIDggPD0gY2luZm8tPnNjYWxlX2Rlbm9tKSB7CisgICAgLyogUHJvdmlkZSAxLzggc2NhbGluZyAqLworICAgIGNpbmZvLT5vdXRwdXRfd2lkdGggPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCwgOEwpOworICAgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0LCA4TCk7CisgICAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgPSAxOworICB9IGVsc2UgaWYgKGNpbmZvLT5zY2FsZV9udW0gKiA0IDw9IGNpbmZvLT5zY2FsZV9kZW5vbSkgeworICAgIC8qIFByb3ZpZGUgMS80IHNjYWxpbmcgKi8KKyAgICBjaW5mby0+b3V0cHV0X3dpZHRoID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGgsIDRMKTsKKyAgICBjaW5mby0+b3V0cHV0X2hlaWdodCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCwgNEwpOworICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplID0gMjsKKyAgfSBlbHNlIGlmIChjaW5mby0+c2NhbGVfbnVtICogMiA8PSBjaW5mby0+c2NhbGVfZGVub20pIHsKKyAgICAvKiBQcm92aWRlIDEvMiBzY2FsaW5nICovCisgICAgY2luZm8tPm91dHB1dF93aWR0aCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoLCAyTCk7CisgICAgY2luZm8tPm91dHB1dF9oZWlnaHQgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsIDJMKTsKKyAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSA9IDQ7CisgIH0gZWxzZSB7CisgICAgLyogUHJvdmlkZSAxLzEgc2NhbGluZyAqLworICAgIGNpbmZvLT5vdXRwdXRfd2lkdGggPSBjaW5mby0+aW1hZ2Vfd2lkdGg7CisgICAgY2luZm8tPm91dHB1dF9oZWlnaHQgPSBjaW5mby0+aW1hZ2VfaGVpZ2h0OworICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplID0gRENUU0laRTsKKyAgfQorICAvKiBJbiBzZWxlY3RpbmcgdGhlIGFjdHVhbCBEQ1Qgc2NhbGluZyBmb3IgZWFjaCBjb21wb25lbnQsIHdlIHRyeSB0bworICAgKiBzY2FsZSB1cCB0aGUgY2hyb21hIGNvbXBvbmVudHMgdmlhIElEQ1Qgc2NhbGluZyByYXRoZXIgdGhhbiB1cHNhbXBsaW5nLgorICAgKiBUaGlzIHNhdmVzIHRpbWUgaWYgdGhlIHVwc2FtcGxlciBnZXRzIHRvIHVzZSAxOjEgc2NhbGluZy4KKyAgICogTm90ZSB0aGlzIGNvZGUgYXNzdW1lcyB0aGF0IHRoZSBzdXBwb3J0ZWQgRENUIHNjYWxpbmdzIGFyZSBwb3dlcnMgb2YgMi4KKyAgICovCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgaW50IHNzaXplID0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgICAgd2hpbGUgKHNzaXplIDwgRENUU0laRSAmJgorCSAgIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yICogc3NpemUgKiAyIDw9CisJICAgIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplKSAmJgorCSAgIChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogc3NpemUgKiAyIDw9CisJICAgIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplKSkgeworICAgICAgc3NpemUgPSBzc2l6ZSAqIDI7CisgICAgfQorICAgIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSA9IHNzaXplOworICB9CisKKyAgLyogUmVjb21wdXRlIGRvd25zYW1wbGVkIGRpbWVuc2lvbnMgb2YgY29tcG9uZW50czsKKyAgICogYXBwbGljYXRpb24gbmVlZHMgdG8ga25vdyB0aGVzZSBpZiB1c2luZyByYXcgZG93bnNhbXBsZWQgZGF0YS4KKyAgICovCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgLyogU2l6ZSBpbiBzYW1wbGVzLCBhZnRlciBJRENUIHNjYWxpbmcgKi8KKyAgICBjb21wcHRyLT5kb3duc2FtcGxlZF93aWR0aCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICoKKwkJICAgIChsb25nKSAoY29tcHB0ci0+aF9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSksCisJCSAgICAobG9uZykgKGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKKyAgICBjb21wcHRyLT5kb3duc2FtcGxlZF9oZWlnaHQgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgKgorCQkgICAgKGxvbmcpIChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSwKKwkJICAgIChsb25nKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSkpOworICB9CisKKyNlbHNlIC8qICFJRENUX1NDQUxJTkdfU1VQUE9SVEVEICovCisKKyAgLyogSGFyZHdpcmUgaXQgdG8gIm5vIHNjYWxpbmciICovCisgIGNpbmZvLT5vdXRwdXRfd2lkdGggPSBjaW5mby0+aW1hZ2Vfd2lkdGg7CisgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID0gY2luZm8tPmltYWdlX2hlaWdodDsKKyAgLyogamRpbnB1dC5jIGhhcyBhbHJlYWR5IGluaXRpYWxpemVkIERDVF9zY2FsZWRfc2l6ZSB0byBEQ1RTSVpFLAorICAgKiBhbmQgaGFzIGNvbXB1dGVkIHVuc2NhbGVkIGRvd25zYW1wbGVkX3dpZHRoIGFuZCBkb3duc2FtcGxlZF9oZWlnaHQuCisgICAqLworCisjZW5kaWYgLyogSURDVF9TQ0FMSU5HX1NVUFBPUlRFRCAqLworCisgIC8qIFJlcG9ydCBudW1iZXIgb2YgY29tcG9uZW50cyBpbiBzZWxlY3RlZCBjb2xvcnNwYWNlLiAqLworICAvKiBQcm9iYWJseSB0aGlzIHNob3VsZCBiZSBpbiB0aGUgY29sb3IgY29udmVyc2lvbiBtb2R1bGUuLi4gKi8KKyAgc3dpdGNoIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlKSB7CisgIGNhc2UgSkNTX0dSQVlTQ0FMRToKKyAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSAxOworICAgIGJyZWFrOworICBjYXNlIEpDU19SR0I6CisjaWYgUkdCX1BJWEVMU0laRSAhPSAzCisgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gUkdCX1BJWEVMU0laRTsKKyAgICBicmVhazsKKyNlbmRpZiAvKiBlbHNlIHNoYXJlIGNvZGUgd2l0aCBZQ2JDciAqLworICBjYXNlIEpDU19ZQ2JDcjoKKyAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSAzOworICAgIGJyZWFrOworICBjYXNlIEpDU19DTVlLOgorICBjYXNlIEpDU19ZQ0NLOgorICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IDQ7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CQkJLyogZWxzZSBtdXN0IGJlIHNhbWUgY29sb3JzcGFjZSBhcyBpbiBmaWxlICovCisgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gY2luZm8tPm51bV9jb21wb25lbnRzOworICAgIGJyZWFrOworICB9CisgIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50cyA9IChjaW5mby0+cXVhbnRpemVfY29sb3JzID8gMSA6CisJCQkgICAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMpOworCisgIC8qIFNlZSBpZiB1cHNhbXBsZXIgd2lsbCB3YW50IHRvIGVtaXQgbW9yZSB0aGFuIG9uZSByb3cgYXQgYSB0aW1lICovCisgIGlmICh1c2VfbWVyZ2VkX3Vwc2FtcGxlKGNpbmZvKSkKKyAgICBjaW5mby0+cmVjX291dGJ1Zl9oZWlnaHQgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7CisgIGVsc2UKKyAgICBjaW5mby0+cmVjX291dGJ1Zl9oZWlnaHQgPSAxOworfQorCisKKy8qCisgKiBTZXZlcmFsIGRlY29tcHJlc3Npb24gcHJvY2Vzc2VzIG5lZWQgdG8gcmFuZ2UtbGltaXQgdmFsdWVzIHRvIHRoZSByYW5nZQorICogMC4uTUFYSlNBTVBMRTsgdGhlIGlucHV0IHZhbHVlIG1heSBmYWxsIHNvbWV3aGF0IG91dHNpZGUgdGhpcyByYW5nZQorICogZHVlIHRvIG5vaXNlIGludHJvZHVjZWQgYnkgcXVhbnRpemF0aW9uLCByb3VuZG9mZiBlcnJvciwgZXRjLiAgVGhlc2UKKyAqIHByb2Nlc3NlcyBhcmUgaW5uZXIgbG9vcHMgYW5kIG5lZWQgdG8gYmUgYXMgZmFzdCBhcyBwb3NzaWJsZS4gIE9uIG1vc3QKKyAqIG1hY2hpbmVzLCBwYXJ0aWN1bGFybHkgQ1BVcyB3aXRoIHBpcGVsaW5lcyBvciBpbnN0cnVjdGlvbiBwcmVmZXRjaCwKKyAqIGEgKHN1YnNjcmlwdC1jaGVjay1sZXNzKSBDIHRhYmxlIGxvb2t1cAorICoJCXggPSBzYW1wbGVfcmFuZ2VfbGltaXRbeF07CisgKiBpcyBmYXN0ZXIgdGhhbiBleHBsaWNpdCB0ZXN0cworICoJCWlmICh4IDwgMCkgIHggPSAwOworICoJCWVsc2UgaWYgKHggPiBNQVhKU0FNUExFKSAgeCA9IE1BWEpTQU1QTEU7CisgKiBUaGVzZSBwcm9jZXNzZXMgYWxsIHVzZSBhIGNvbW1vbiB0YWJsZSBwcmVwYXJlZCBieSB0aGUgcm91dGluZSBiZWxvdy4KKyAqCisgKiBGb3IgbW9zdCBzdGVwcyB3ZSBjYW4gbWF0aGVtYXRpY2FsbHkgZ3VhcmFudGVlIHRoYXQgdGhlIGluaXRpYWwgdmFsdWUKKyAqIG9mIHggaXMgd2l0aGluIE1BWEpTQU1QTEUrMSBvZiB0aGUgbGVnYWwgcmFuZ2UsIHNvIGEgdGFibGUgcnVubmluZyBmcm9tCisgKiAtKE1BWEpTQU1QTEUrMSkgdG8gMipNQVhKU0FNUExFKzEgaXMgc3VmZmljaWVudC4gIEJ1dCBmb3IgdGhlIGluaXRpYWwKKyAqIGxpbWl0aW5nIHN0ZXAgKGp1c3QgYWZ0ZXIgdGhlIElEQ1QpLCBhIHdpbGRseSBvdXQtb2YtcmFuZ2UgdmFsdWUgaXMgCisgKiBwb3NzaWJsZSBpZiB0aGUgaW5wdXQgZGF0YSBpcyBjb3JydXB0LiAgVG8gYXZvaWQgYW55IGNoYW5jZSBvZiBpbmRleGluZworICogb2ZmIHRoZSBlbmQgb2YgbWVtb3J5IGFuZCBnZXR0aW5nIGEgYmFkLXBvaW50ZXIgdHJhcCwgd2UgcGVyZm9ybSB0aGUKKyAqIHBvc3QtSURDVCBsaW1pdGluZyB0aHVzOgorICoJCXggPSByYW5nZV9saW1pdFt4ICYgTUFTS107CisgKiB3aGVyZSBNQVNLIGlzIDIgYml0cyB3aWRlciB0aGFuIGxlZ2FsIHNhbXBsZSBkYXRhLCBpZSAxMCBiaXRzIGZvciA4LWJpdAorICogc2FtcGxlcy4gIFVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzIHRoaXMgaXMgbW9yZSB0aGFuIGVub3VnaCByYW5nZSBhbmQKKyAqIGEgY29ycmVjdCBvdXRwdXQgd2lsbCBiZSBnZW5lcmF0ZWQ7IHdpdGggYm9ndXMgaW5wdXQgZGF0YSB0aGUgbWFzayB3aWxsCisgKiBjYXVzZSB3cmFwYXJvdW5kLCBhbmQgd2Ugd2lsbCBzYWZlbHkgZ2VuZXJhdGUgYSBib2d1cy1idXQtaW4tcmFuZ2Ugb3V0cHV0LgorICogRm9yIHRoZSBwb3N0LUlEQ1Qgc3RlcCwgd2Ugd2FudCB0byBjb252ZXJ0IHRoZSBkYXRhIGZyb20gc2lnbmVkIHRvIHVuc2lnbmVkCisgKiByZXByZXNlbnRhdGlvbiBieSBhZGRpbmcgQ0VOVEVSSlNBTVBMRSBhdCB0aGUgc2FtZSB0aW1lIHRoYXQgd2UgbGltaXQgaXQuCisgKiBTbyB0aGUgcG9zdC1JRENUIGxpbWl0aW5nIHRhYmxlIGVuZHMgdXAgbG9va2luZyBsaWtlIHRoaXM6CisgKiAgIENFTlRFUkpTQU1QTEUsQ0VOVEVSSlNBTVBMRSsxLC4uLixNQVhKU0FNUExFLAorICogICBNQVhKU0FNUExFIChyZXBlYXQgMiooTUFYSlNBTVBMRSsxKS1DRU5URVJKU0FNUExFIHRpbWVzKSwKKyAqICAgMCAgICAgICAgICAocmVwZWF0IDIqKE1BWEpTQU1QTEUrMSktQ0VOVEVSSlNBTVBMRSB0aW1lcyksCisgKiAgIDAsMSwuLi4sQ0VOVEVSSlNBTVBMRS0xCisgKiBOZWdhdGl2ZSBpbnB1dHMgc2VsZWN0IHZhbHVlcyBmcm9tIHRoZSB1cHBlciBoYWxmIG9mIHRoZSB0YWJsZSBhZnRlcgorICogbWFza2luZy4KKyAqCisgKiBXZSBjYW4gc2F2ZSBzb21lIHNwYWNlIGJ5IG92ZXJsYXBwaW5nIHRoZSBzdGFydCBvZiB0aGUgcG9zdC1JRENUIHRhYmxlCisgKiB3aXRoIHRoZSBzaW1wbGVyIHJhbmdlIGxpbWl0aW5nIHRhYmxlLiAgVGhlIHBvc3QtSURDVCB0YWJsZSBiZWdpbnMgYXQKKyAqIHNhbXBsZV9yYW5nZV9saW1pdCArIENFTlRFUkpTQU1QTEUuCisgKgorICogTm90ZSB0aGF0IHRoZSB0YWJsZSBpcyBhbGxvY2F0ZWQgaW4gbmVhciBkYXRhIHNwYWNlIG9uIFBDczsgaXQncyBzbWFsbAorICogZW5vdWdoIGFuZCB1c2VkIG9mdGVuIGVub3VnaCB0byBqdXN0aWZ5IHRoaXMuCisgKi8KKworTE9DQUwodm9pZCkKK3ByZXBhcmVfcmFuZ2VfbGltaXRfdGFibGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBBbGxvY2F0ZSBhbmQgZmlsbCBpbiB0aGUgc2FtcGxlX3JhbmdlX2xpbWl0IHRhYmxlICovCit7CisgIEpTQU1QTEUgKiB0YWJsZTsKKyAgaW50IGk7CisKKyAgdGFibGUgPSAoSlNBTVBMRSAqKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCSg1ICogKE1BWEpTQU1QTEUrMSkgKyBDRU5URVJKU0FNUExFKSAqIFNJWkVPRihKU0FNUExFKSk7CisgIHRhYmxlICs9IChNQVhKU0FNUExFKzEpOwkvKiBhbGxvdyBuZWdhdGl2ZSBzdWJzY3JpcHRzIG9mIHNpbXBsZSB0YWJsZSAqLworICBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0ID0gdGFibGU7CisgIC8qIEZpcnN0IHNlZ21lbnQgb2YgInNpbXBsZSIgdGFibGU6IGxpbWl0W3hdID0gMCBmb3IgeCA8IDAgKi8KKyAgTUVNWkVSTyh0YWJsZSAtIChNQVhKU0FNUExFKzEpLCAoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihKU0FNUExFKSk7CisgIC8qIE1haW4gcGFydCBvZiAic2ltcGxlIiB0YWJsZTogbGltaXRbeF0gPSB4ICovCisgIGZvciAoaSA9IDA7IGkgPD0gTUFYSlNBTVBMRTsgaSsrKQorICAgIHRhYmxlW2ldID0gKEpTQU1QTEUpIGk7CisgIHRhYmxlICs9IENFTlRFUkpTQU1QTEU7CS8qIFBvaW50IHRvIHdoZXJlIHBvc3QtSURDVCB0YWJsZSBzdGFydHMgKi8KKyAgLyogRW5kIG9mIHNpbXBsZSB0YWJsZSwgcmVzdCBvZiBmaXJzdCBoYWxmIG9mIHBvc3QtSURDVCB0YWJsZSAqLworICBmb3IgKGkgPSBDRU5URVJKU0FNUExFOyBpIDwgMiooTUFYSlNBTVBMRSsxKTsgaSsrKQorICAgIHRhYmxlW2ldID0gTUFYSlNBTVBMRTsKKyAgLyogU2Vjb25kIGhhbGYgb2YgcG9zdC1JRENUIHRhYmxlICovCisgIE1FTVpFUk8odGFibGUgKyAoMiAqIChNQVhKU0FNUExFKzEpKSwKKwkgICgyICogKE1BWEpTQU1QTEUrMSkgLSBDRU5URVJKU0FNUExFKSAqIFNJWkVPRihKU0FNUExFKSk7CisgIE1FTUNPUFkodGFibGUgKyAoNCAqIChNQVhKU0FNUExFKzEpIC0gQ0VOVEVSSlNBTVBMRSksCisJICBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0LCBDRU5URVJKU0FNUExFICogU0laRU9GKEpTQU1QTEUpKTsKK30KKworCisvKgorICogTWFzdGVyIHNlbGVjdGlvbiBvZiBkZWNvbXByZXNzaW9uIG1vZHVsZXMuCisgKiBUaGlzIGlzIGRvbmUgb25jZSBhdCBqcGVnX3N0YXJ0X2RlY29tcHJlc3MgdGltZS4gIFdlIGRldGVybWluZQorICogd2hpY2ggbW9kdWxlcyB3aWxsIGJlIHVzZWQgYW5kIGdpdmUgdGhlbSBhcHByb3ByaWF0ZSBpbml0aWFsaXphdGlvbiBjYWxscy4KKyAqIFdlIGFsc28gaW5pdGlhbGl6ZSB0aGUgZGVjb21wcmVzc29yIGlucHV0IHNpZGUgdG8gYmVnaW4gY29uc3VtaW5nIGRhdGEuCisgKgorICogU2luY2UganBlZ19yZWFkX2hlYWRlciBoYXMgZmluaXNoZWQsIHdlIGtub3cgd2hhdCBpcyBpbiB0aGUgU09GCisgKiBhbmQgKGZpcnN0KSBTT1MgbWFya2Vycy4gIFdlIGFsc28gaGF2ZSBhbGwgdGhlIGFwcGxpY2F0aW9uIHBhcmFtZXRlcgorICogc2V0dGluZ3MuCisgKi8KKworTE9DQUwodm9pZCkKK21hc3Rlcl9zZWxlY3Rpb24gKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X21hc3Rlcl9wdHIgbWFzdGVyID0gKG15X21hc3Rlcl9wdHIpIGNpbmZvLT5tYXN0ZXI7CisgIGJvb2xlYW4gdXNlX2NfYnVmZmVyOworICBsb25nIHNhbXBsZXNwZXJyb3c7CisgIEpESU1FTlNJT04gamRfc2FtcGxlc3BlcnJvdzsKKworICAvKiBJbml0aWFsaXplIGRpbWVuc2lvbnMgYW5kIG90aGVyIHN0dWZmICovCisgIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucyhjaW5mbyk7CisgIHByZXBhcmVfcmFuZ2VfbGltaXRfdGFibGUoY2luZm8pOworCisgIC8qIFdpZHRoIG9mIGFuIG91dHB1dCBzY2FubGluZSBtdXN0IGJlIHJlcHJlc2VudGFibGUgYXMgSkRJTUVOU0lPTi4gKi8KKyAgc2FtcGxlc3BlcnJvdyA9IChsb25nKSBjaW5mby0+b3V0cHV0X3dpZHRoICogKGxvbmcpIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsKKyAgamRfc2FtcGxlc3BlcnJvdyA9IChKRElNRU5TSU9OKSBzYW1wbGVzcGVycm93OworICBpZiAoKGxvbmcpIGpkX3NhbXBsZXNwZXJyb3cgIT0gc2FtcGxlc3BlcnJvdykKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1dJRFRIX09WRVJGTE9XKTsKKworICAvKiBJbml0aWFsaXplIG15IHByaXZhdGUgc3RhdGUgKi8KKyAgbWFzdGVyLT5wYXNzX251bWJlciA9IDA7CisgIG1hc3Rlci0+dXNpbmdfbWVyZ2VkX3Vwc2FtcGxlID0gdXNlX21lcmdlZF91cHNhbXBsZShjaW5mbyk7CisKKyAgLyogQ29sb3IgcXVhbnRpemVyIHNlbGVjdGlvbiAqLworICBtYXN0ZXItPnF1YW50aXplcl8xcGFzcyA9IE5VTEw7CisgIG1hc3Rlci0+cXVhbnRpemVyXzJwYXNzID0gTlVMTDsKKyAgLyogTm8gbW9kZSBjaGFuZ2VzIGlmIG5vdCB1c2luZyBidWZmZXJlZC1pbWFnZSBtb2RlLiAqLworICBpZiAoISBjaW5mby0+cXVhbnRpemVfY29sb3JzIHx8ICEgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlKSB7CisgICAgY2luZm8tPmVuYWJsZV8xcGFzc19xdWFudCA9IEZBTFNFOworICAgIGNpbmZvLT5lbmFibGVfZXh0ZXJuYWxfcXVhbnQgPSBGQUxTRTsKKyAgICBjaW5mby0+ZW5hYmxlXzJwYXNzX3F1YW50ID0gRkFMU0U7CisgIH0KKyAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpIHsKKyAgICBpZiAoY2luZm8tPnJhd19kYXRhX291dCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9USU1QTCk7CisgICAgLyogMi1wYXNzIHF1YW50aXplciBvbmx5IHdvcmtzIGluIDMtY29tcG9uZW50IGNvbG9yIHNwYWNlLiAqLworICAgIGlmIChjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgIT0gMykgeworICAgICAgY2luZm8tPmVuYWJsZV8xcGFzc19xdWFudCA9IFRSVUU7CisgICAgICBjaW5mby0+ZW5hYmxlX2V4dGVybmFsX3F1YW50ID0gRkFMU0U7CisgICAgICBjaW5mby0+ZW5hYmxlXzJwYXNzX3F1YW50ID0gRkFMU0U7CisgICAgICBjaW5mby0+Y29sb3JtYXAgPSBOVUxMOworICAgIH0gZWxzZSBpZiAoY2luZm8tPmNvbG9ybWFwICE9IE5VTEwpIHsKKyAgICAgIGNpbmZvLT5lbmFibGVfZXh0ZXJuYWxfcXVhbnQgPSBUUlVFOworICAgIH0gZWxzZSBpZiAoY2luZm8tPnR3b19wYXNzX3F1YW50aXplKSB7CisgICAgICBjaW5mby0+ZW5hYmxlXzJwYXNzX3F1YW50ID0gVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgY2luZm8tPmVuYWJsZV8xcGFzc19xdWFudCA9IFRSVUU7CisgICAgfQorCisgICAgaWYgKGNpbmZvLT5lbmFibGVfMXBhc3NfcXVhbnQpIHsKKyNpZmRlZiBRVUFOVF8xUEFTU19TVVBQT1JURUQKKyAgICAgIGppbml0XzFwYXNzX3F1YW50aXplcihjaW5mbyk7CisgICAgICBtYXN0ZXItPnF1YW50aXplcl8xcGFzcyA9IGNpbmZvLT5jcXVhbnRpemU7CisjZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmCisgICAgfQorCisgICAgLyogV2UgdXNlIHRoZSAyLXBhc3MgY29kZSB0byBtYXAgdG8gZXh0ZXJuYWwgY29sb3JtYXBzLiAqLworICAgIGlmIChjaW5mby0+ZW5hYmxlXzJwYXNzX3F1YW50IHx8IGNpbmZvLT5lbmFibGVfZXh0ZXJuYWxfcXVhbnQpIHsKKyNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKKyAgICAgIGppbml0XzJwYXNzX3F1YW50aXplcihjaW5mbyk7CisgICAgICBtYXN0ZXItPnF1YW50aXplcl8ycGFzcyA9IGNpbmZvLT5jcXVhbnRpemU7CisjZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmCisgICAgfQorICAgIC8qIElmIGJvdGggcXVhbnRpemVycyBhcmUgaW5pdGlhbGl6ZWQsIHRoZSAyLXBhc3Mgb25lIGlzIGxlZnQgYWN0aXZlOworICAgICAqIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciBzdGFydGluZyB3aXRoIHF1YW50aXphdGlvbiB0byBhbiBleHRlcm5hbCBtYXAuCisgICAgICovCisgIH0KKworICAvKiBQb3N0LXByb2Nlc3Npbmc6IGluIHBhcnRpY3VsYXIsIGNvbG9yIGNvbnZlcnNpb24gZmlyc3QgKi8KKyAgaWYgKCEgY2luZm8tPnJhd19kYXRhX291dCkgeworICAgIGlmIChtYXN0ZXItPnVzaW5nX21lcmdlZF91cHNhbXBsZSkgeworI2lmZGVmIFVQU0FNUExFX01FUkdJTkdfU1VQUE9SVEVECisgICAgICBqaW5pdF9tZXJnZWRfdXBzYW1wbGVyKGNpbmZvKTsgLyogZG9lcyBjb2xvciBjb252ZXJzaW9uIHRvbyAqLworI2Vsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICBqaW5pdF9jb2xvcl9kZWNvbnZlcnRlcihjaW5mbyk7CisgICAgICBqaW5pdF91cHNhbXBsZXIoY2luZm8pOworICAgIH0KKyAgICBqaW5pdF9kX3Bvc3RfY29udHJvbGxlcihjaW5mbywgY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCk7CisgIH0KKyAgLyogSW52ZXJzZSBEQ1QgKi8KKyAgamluaXRfaW52ZXJzZV9kY3QoY2luZm8pOworICAvKiBFbnRyb3B5IGRlY29kaW5nOiBlaXRoZXIgSHVmZm1hbiBvciBhcml0aG1ldGljIGNvZGluZy4gKi8KKyAgaWYgKGNpbmZvLT5hcml0aF9jb2RlKSB7CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9BUklUSF9OT1RJTVBMKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKKyNpZmRlZiBEX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorICAgICAgamluaXRfcGh1ZmZfZGVjb2RlcihjaW5mbyk7CisjZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmCisgICAgfSBlbHNlCisgICAgICBqaW5pdF9odWZmX2RlY29kZXIoY2luZm8pOworICB9CisKKyAgLyogSW5pdGlhbGl6ZSBwcmluY2lwYWwgYnVmZmVyIGNvbnRyb2xsZXJzLiAqLworICB1c2VfY19idWZmZXIgPSBjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FucyB8fCBjaW5mby0+YnVmZmVyZWRfaW1hZ2U7CisgIGppbml0X2RfY29lZl9jb250cm9sbGVyKGNpbmZvLCB1c2VfY19idWZmZXIpOworCisgIGlmICghIGNpbmZvLT5yYXdfZGF0YV9vdXQpCisgICAgamluaXRfZF9tYWluX2NvbnRyb2xsZXIoY2luZm8sIEZBTFNFIC8qIG5ldmVyIG5lZWQgZnVsbCBidWZmZXIgaGVyZSAqLyk7CisKKyAgLyogV2UgY2FuIG5vdyB0ZWxsIHRoZSBtZW1vcnkgbWFuYWdlciB0byBhbGxvY2F0ZSB2aXJ0dWFsIGFycmF5cy4gKi8KKyAgKCpjaW5mby0+bWVtLT5yZWFsaXplX3ZpcnRfYXJyYXlzKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworCisgIC8qIEluaXRpYWxpemUgaW5wdXQgc2lkZSBvZiBkZWNvbXByZXNzb3IgdG8gY29uc3VtZSBmaXJzdCBzY2FuLiAqLworICAoKmNpbmZvLT5pbnB1dGN0bC0+c3RhcnRfaW5wdXRfcGFzcykgKGNpbmZvKTsKKworI2lmZGVmIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorICAvKiBJZiBqcGVnX3N0YXJ0X2RlY29tcHJlc3Mgd2lsbCByZWFkIHRoZSB3aG9sZSBmaWxlLCBpbml0aWFsaXplCisgICAqIHByb2dyZXNzIG1vbml0b3JpbmcgYXBwcm9wcmlhdGVseS4gIFRoZSBpbnB1dCBzdGVwIGlzIGNvdW50ZWQKKyAgICogYXMgb25lIHBhc3MuCisgICAqLworICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwgJiYgISBjaW5mby0+YnVmZmVyZWRfaW1hZ2UgJiYKKyAgICAgIGNpbmZvLT5pbnB1dGN0bC0+aGFzX211bHRpcGxlX3NjYW5zKSB7CisgICAgaW50IG5zY2FuczsKKyAgICAvKiBFc3RpbWF0ZSBudW1iZXIgb2Ygc2NhbnMgdG8gc2V0IHBhc3NfbGltaXQuICovCisgICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7CisgICAgICAvKiBBcmJpdHJhcmlseSBlc3RpbWF0ZSAyIGludGVybGVhdmVkIERDIHNjYW5zICsgMyBBQyBzY2Fucy9jb21wb25lbnQuICovCisgICAgICBuc2NhbnMgPSAyICsgMyAqIGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICB9IGVsc2UgeworICAgICAgLyogRm9yIGEgbm9ucHJvZ3Jlc3NpdmUgbXVsdGlzY2FuIGZpbGUsIGVzdGltYXRlIDEgc2NhbiBwZXIgY29tcG9uZW50LiAqLworICAgICAgbnNjYW5zID0gY2luZm8tPm51bV9jb21wb25lbnRzOworICAgIH0KKyAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfY291bnRlciA9IDBMOworICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+dG90YWxfaU1DVV9yb3dzICogbnNjYW5zOworICAgIGNpbmZvLT5wcm9ncmVzcy0+Y29tcGxldGVkX3Bhc3NlcyA9IDA7CisgICAgY2luZm8tPnByb2dyZXNzLT50b3RhbF9wYXNzZXMgPSAoY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCA/IDMgOiAyKTsKKyAgICAvKiBDb3VudCB0aGUgaW5wdXQgcGFzcyBhcyBkb25lICovCisgICAgbWFzdGVyLT5wYXNzX251bWJlcisrOworICB9CisjZW5kaWYgLyogRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCit9CisKKworLyoKKyAqIFBlci1wYXNzIHNldHVwLgorICogVGhpcyBpcyBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIG91dHB1dCBwYXNzLiAgV2UgZGV0ZXJtaW5lIHdoaWNoCisgKiBtb2R1bGVzIHdpbGwgYmUgYWN0aXZlIGR1cmluZyB0aGlzIHBhc3MgYW5kIGdpdmUgdGhlbSBhcHByb3ByaWF0ZQorICogc3RhcnRfcGFzcyBjYWxscy4gIFdlIGFsc28gc2V0IGlzX2R1bW15X3Bhc3MgdG8gaW5kaWNhdGUgd2hldGhlciB0aGlzCisgKiBpcyBhICJyZWFsIiBvdXRwdXQgcGFzcyBvciBhIGR1bW15IHBhc3MgZm9yIGNvbG9yIHF1YW50aXphdGlvbi4KKyAqIChJbiB0aGUgbGF0dGVyIGNhc2UsIGpkYXBpc3RkLmMgd2lsbCBjcmFuayB0aGUgcGFzcyB0byBjb21wbGV0aW9uLikKKyAqLworCitNRVRIT0RERUYodm9pZCkKK3ByZXBhcmVfZm9yX291dHB1dF9wYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9tYXN0ZXJfcHRyIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKSBjaW5mby0+bWFzdGVyOworCisgIGlmIChtYXN0ZXItPnB1Yi5pc19kdW1teV9wYXNzKSB7CisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECisgICAgLyogRmluYWwgcGFzcyBvZiAyLXBhc3MgcXVhbnRpemF0aW9uICovCisgICAgbWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyA9IEZBTFNFOworICAgICgqY2luZm8tPmNxdWFudGl6ZS0+c3RhcnRfcGFzcykgKGNpbmZvLCBGQUxTRSk7CisgICAgKCpjaW5mby0+cG9zdC0+c3RhcnRfcGFzcykgKGNpbmZvLCBKQlVGX0NSQU5LX0RFU1QpOworICAgICgqY2luZm8tPm1haW4tPnN0YXJ0X3Bhc3MpIChjaW5mbywgSkJVRl9DUkFOS19ERVNUKTsKKyNlbHNlCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmIC8qIFFVQU5UXzJQQVNTX1NVUFBPUlRFRCAqLworICB9IGVsc2UgeworICAgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzICYmIGNpbmZvLT5jb2xvcm1hcCA9PSBOVUxMKSB7CisgICAgICAvKiBTZWxlY3QgbmV3IHF1YW50aXphdGlvbiBtZXRob2QgKi8KKyAgICAgIGlmIChjaW5mby0+dHdvX3Bhc3NfcXVhbnRpemUgJiYgY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCkgeworCWNpbmZvLT5jcXVhbnRpemUgPSBtYXN0ZXItPnF1YW50aXplcl8ycGFzczsKKwltYXN0ZXItPnB1Yi5pc19kdW1teV9wYXNzID0gVFJVRTsKKyAgICAgIH0gZWxzZSBpZiAoY2luZm8tPmVuYWJsZV8xcGFzc19xdWFudCkgeworCWNpbmZvLT5jcXVhbnRpemUgPSBtYXN0ZXItPnF1YW50aXplcl8xcGFzczsKKyAgICAgIH0gZWxzZSB7CisJRVJSRVhJVChjaW5mbywgSkVSUl9NT0RFX0NIQU5HRSk7CisgICAgICB9CisgICAgfQorICAgICgqY2luZm8tPmlkY3QtPnN0YXJ0X3Bhc3MpIChjaW5mbyk7CisgICAgKCpjaW5mby0+Y29lZi0+c3RhcnRfb3V0cHV0X3Bhc3MpIChjaW5mbyk7CisgICAgaWYgKCEgY2luZm8tPnJhd19kYXRhX291dCkgeworICAgICAgaWYgKCEgbWFzdGVyLT51c2luZ19tZXJnZWRfdXBzYW1wbGUpCisJKCpjaW5mby0+Y2NvbnZlcnQtPnN0YXJ0X3Bhc3MpIChjaW5mbyk7CisgICAgICAoKmNpbmZvLT51cHNhbXBsZS0+c3RhcnRfcGFzcykgKGNpbmZvKTsKKyAgICAgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKQorCSgqY2luZm8tPmNxdWFudGl6ZS0+c3RhcnRfcGFzcykgKGNpbmZvLCBtYXN0ZXItPnB1Yi5pc19kdW1teV9wYXNzKTsKKyAgICAgICgqY2luZm8tPnBvc3QtPnN0YXJ0X3Bhc3MpIChjaW5mbywKKwkgICAgKG1hc3Rlci0+cHViLmlzX2R1bW15X3Bhc3MgPyBKQlVGX1NBVkVfQU5EX1BBU1MgOiBKQlVGX1BBU1NfVEhSVSkpOworICAgICAgKCpjaW5mby0+bWFpbi0+c3RhcnRfcGFzcykgKGNpbmZvLCBKQlVGX1BBU1NfVEhSVSk7CisgICAgfQorICB9CisKKyAgLyogU2V0IHVwIHByb2dyZXNzIG1vbml0b3IncyBwYXNzIGluZm8gaWYgcHJlc2VudCAqLworICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpIHsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPmNvbXBsZXRlZF9wYXNzZXMgPSBtYXN0ZXItPnBhc3NfbnVtYmVyOworICAgIGNpbmZvLT5wcm9ncmVzcy0+dG90YWxfcGFzc2VzID0gbWFzdGVyLT5wYXNzX251bWJlciArCisJCQkJICAgIChtYXN0ZXItPnB1Yi5pc19kdW1teV9wYXNzID8gMiA6IDEpOworICAgIC8qIEluIGJ1ZmZlcmVkLWltYWdlIG1vZGUsIHdlIGFzc3VtZSBvbmUgbW9yZSBvdXRwdXQgcGFzcyBpZiBFT0kgbm90CisgICAgICogeWV0IHJlYWNoZWQsIGJ1dCBubyBtb3JlIHBhc3NlcyBpZiBFT0kgaGFzIGJlZW4gcmVhY2hlZC4KKyAgICAgKi8KKyAgICBpZiAoY2luZm8tPmJ1ZmZlcmVkX2ltYWdlICYmICEgY2luZm8tPmlucHV0Y3RsLT5lb2lfcmVhY2hlZCkgeworICAgICAgY2luZm8tPnByb2dyZXNzLT50b3RhbF9wYXNzZXMgKz0gKGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQgPyAyIDogMSk7CisgICAgfQorICB9Cit9CisKKworLyoKKyAqIEZpbmlzaCB1cCBhdCBlbmQgb2YgYW4gb3V0cHV0IHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmaW5pc2hfb3V0cHV0X3Bhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X21hc3Rlcl9wdHIgbWFzdGVyID0gKG15X21hc3Rlcl9wdHIpIGNpbmZvLT5tYXN0ZXI7CisKKyAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpCisgICAgKCpjaW5mby0+Y3F1YW50aXplLT5maW5pc2hfcGFzcykgKGNpbmZvKTsKKyAgbWFzdGVyLT5wYXNzX251bWJlcisrOworfQorCisKKyNpZmRlZiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKKworLyoKKyAqIFN3aXRjaCB0byBhIG5ldyBleHRlcm5hbCBjb2xvcm1hcCBiZXR3ZWVuIG91dHB1dCBwYXNzZXMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX25ld19jb2xvcm1hcCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfbWFzdGVyX3B0ciBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikgY2luZm8tPm1hc3RlcjsKKworICAvKiBQcmV2ZW50IGFwcGxpY2F0aW9uIGZyb20gY2FsbGluZyBtZSBhdCB3cm9uZyB0aW1lcyAqLworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfQlVGSU1BR0UpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKworICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycyAmJiBjaW5mby0+ZW5hYmxlX2V4dGVybmFsX3F1YW50ICYmCisgICAgICBjaW5mby0+Y29sb3JtYXAgIT0gTlVMTCkgeworICAgIC8qIFNlbGVjdCAyLXBhc3MgcXVhbnRpemVyIGZvciBleHRlcm5hbCBjb2xvcm1hcCB1c2UgKi8KKyAgICBjaW5mby0+Y3F1YW50aXplID0gbWFzdGVyLT5xdWFudGl6ZXJfMnBhc3M7CisgICAgLyogTm90aWZ5IHF1YW50aXplciBvZiBjb2xvcm1hcCBjaGFuZ2UgKi8KKyAgICAoKmNpbmZvLT5jcXVhbnRpemUtPm5ld19jb2xvcl9tYXApIChjaW5mbyk7CisgICAgbWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyA9IEZBTFNFOyAvKiBqdXN0IGluIGNhc2UgKi8KKyAgfSBlbHNlCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9NT0RFX0NIQU5HRSk7Cit9CisKKyNlbmRpZiAvKiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQgKi8KKworCisvKgorICogSW5pdGlhbGl6ZSBtYXN0ZXIgZGVjb21wcmVzc2lvbiBjb250cm9sIGFuZCBzZWxlY3QgYWN0aXZlIG1vZHVsZXMuCisgKiBUaGlzIGlzIHBlcmZvcm1lZCBhdCB0aGUgc3RhcnQgb2YganBlZ19zdGFydF9kZWNvbXByZXNzLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfbWFzdGVyX2RlY29tcHJlc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X21hc3Rlcl9wdHIgbWFzdGVyOworCisgIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIFNJWkVPRihteV9kZWNvbXBfbWFzdGVyKSk7CisgIGNpbmZvLT5tYXN0ZXIgPSAoc3RydWN0IGpwZWdfZGVjb21wX21hc3RlciAqKSBtYXN0ZXI7CisgIG1hc3Rlci0+cHViLnByZXBhcmVfZm9yX291dHB1dF9wYXNzID0gcHJlcGFyZV9mb3Jfb3V0cHV0X3Bhc3M7CisgIG1hc3Rlci0+cHViLmZpbmlzaF9vdXRwdXRfcGFzcyA9IGZpbmlzaF9vdXRwdXRfcGFzczsKKworICBtYXN0ZXItPnB1Yi5pc19kdW1teV9wYXNzID0gRkFMU0U7CisKKyAgbWFzdGVyX3NlbGVjdGlvbihjaW5mbyk7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRtZXJnZS5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkbWVyZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTliYmFkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkbWVyZ2UuYwpAQCAtMCwwICsxLDQwMyBAQAorLyoKKyAqIGpkbWVyZ2UuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgZm9yIG1lcmdlZCB1cHNhbXBsaW5nL2NvbG9yIGNvbnZlcnNpb24uCisgKgorICogVGhpcyBmaWxlIGNvbWJpbmVzIGZ1bmN0aW9ucyBmcm9tIGpkc2FtcGxlLmMgYW5kIGpkY29sb3IuYzsKKyAqIHJlYWQgdGhvc2UgZmlsZXMgZmlyc3QgdG8gdW5kZXJzdGFuZCB3aGF0J3MgZ29pbmcgb24uCisgKgorICogV2hlbiB0aGUgY2hyb21hIGNvbXBvbmVudHMgYXJlIHRvIGJlIHVwc2FtcGxlZCBieSBzaW1wbGUgcmVwbGljYXRpb24KKyAqIChpZSwgYm94IGZpbHRlcmluZyksIHdlIGNhbiBzYXZlIHNvbWUgd29yayBpbiBjb2xvciBjb252ZXJzaW9uIGJ5CisgKiBjYWxjdWxhdGluZyBhbGwgdGhlIG91dHB1dCBwaXhlbHMgY29ycmVzcG9uZGluZyB0byBhIHBhaXIgb2YgY2hyb21hCisgKiBzYW1wbGVzIGF0IG9uZSB0aW1lLiAgSW4gdGhlIGNvbnZlcnNpb24gZXF1YXRpb25zCisgKglSID0gWSAgICAgICAgICAgKyBLMSAqIENyCisgKglHID0gWSArIEsyICogQ2IgKyBLMyAqIENyCisgKglCID0gWSArIEs0ICogQ2IKKyAqIG9ubHkgdGhlIFkgdGVybSB2YXJpZXMgYW1vbmcgdGhlIGdyb3VwIG9mIHBpeGVscyBjb3JyZXNwb25kaW5nIHRvIGEgcGFpcgorICogb2YgY2hyb21hIHNhbXBsZXMsIHNvIHRoZSByZXN0IG9mIHRoZSB0ZXJtcyBjYW4gYmUgY2FsY3VsYXRlZCBqdXN0IG9uY2UuCisgKiBBdCB0eXBpY2FsIHNhbXBsaW5nIHJhdGlvcywgdGhpcyBlbGltaW5hdGVzIGhhbGYgb3IgdGhyZWUtcXVhcnRlcnMgb2YgdGhlCisgKiBtdWx0aXBsaWNhdGlvbnMgbmVlZGVkIGZvciBjb2xvciBjb252ZXJzaW9uLgorICoKKyAqIFRoaXMgZmlsZSBjdXJyZW50bHkgcHJvdmlkZXMgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgZm9sbG93aW5nIGNhc2VzOgorICoJWUNiQ3IgPT4gUkdCIGNvbG9yIGNvbnZlcnNpb24gb25seS4KKyAqCVNhbXBsaW5nIHJhdGlvcyBvZiAyaDF2IG9yIDJoMnYuCisgKglObyBzY2FsaW5nIG5lZWRlZCBhdCB1cHNhbXBsZSB0aW1lLgorICoJQ29ybmVyLWFsaWduZWQgKG5vbi1DQ0lSNjAxKSBzYW1wbGluZyBhbGlnbm1lbnQuCisgKiBPdGhlciBzcGVjaWFsIGNhc2VzIGNvdWxkIGJlIGFkZGVkLCBidXQgaW4gbW9zdCBhcHBsaWNhdGlvbnMgdGhlc2UgYXJlCisgKiB0aGUgb25seSBjb21tb24gY2FzZXMuICAoRm9yIHVuY29tbW9uIGNhc2VzIHdlIGZhbGwgYmFjayBvbiB0aGUgbW9yZQorICogZ2VuZXJhbCBjb2RlIGluIGpkc2FtcGxlLmMgYW5kIGpkY29sb3IuYy4pCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisjaWZkZWYgVVBTQU1QTEVfTUVSR0lOR19TVVBQT1JURUQKKworI2lmZGVmIF9GWF9NQU5BR0VEX0NPREVfCisjZGVmaW5lIG15X3Vwc2FtcGxlcglteV91cHNhbXBsZXJfbQorI2VuZGlmCisKKy8qIFByaXZhdGUgc3Vib2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfdXBzYW1wbGVyIHB1YjsJLyogcHVibGljIGZpZWxkcyAqLworCisgIC8qIFBvaW50ZXIgdG8gcm91dGluZSB0byBkbyBhY3R1YWwgdXBzYW1wbGluZy9jb252ZXJzaW9uIG9mIG9uZSByb3cgZ3JvdXAgKi8KKyAgSk1FVEhPRCh2b2lkLCB1cG1ldGhvZCwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyLAorCQkJICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmKSk7CisKKyAgLyogUHJpdmF0ZSBzdGF0ZSBmb3IgWUNDLT5SR0IgY29udmVyc2lvbiAqLworICBpbnQgKiBDcl9yX3RhYjsJCS8qID0+IHRhYmxlIGZvciBDciB0byBSIGNvbnZlcnNpb24gKi8KKyAgaW50ICogQ2JfYl90YWI7CQkvKiA9PiB0YWJsZSBmb3IgQ2IgdG8gQiBjb252ZXJzaW9uICovCisgIElOVDMyICogQ3JfZ190YWI7CQkvKiA9PiB0YWJsZSBmb3IgQ3IgdG8gRyBjb252ZXJzaW9uICovCisgIElOVDMyICogQ2JfZ190YWI7CQkvKiA9PiB0YWJsZSBmb3IgQ2IgdG8gRyBjb252ZXJzaW9uICovCisKKyAgLyogRm9yIDI6MSB2ZXJ0aWNhbCBzYW1wbGluZywgd2UgcHJvZHVjZSB0d28gb3V0cHV0IHJvd3MgYXQgYSB0aW1lLgorICAgKiBXZSBuZWVkIGEgInNwYXJlIiByb3cgYnVmZmVyIHRvIGhvbGQgdGhlIHNlY29uZCBvdXRwdXQgcm93IGlmIHRoZQorICAgKiBhcHBsaWNhdGlvbiBwcm92aWRlcyBqdXN0IGEgb25lLXJvdyBidWZmZXI7IHdlIGFsc28gdXNlIHRoZSBzcGFyZQorICAgKiB0byBkaXNjYXJkIHRoZSBkdW1teSBsYXN0IHJvdyBpZiB0aGUgaW1hZ2UgaGVpZ2h0IGlzIG9kZC4KKyAgICovCisgIEpTQU1QUk9XIHNwYXJlX3JvdzsKKyAgYm9vbGVhbiBzcGFyZV9mdWxsOwkJLyogVCBpZiBzcGFyZSBidWZmZXIgaXMgb2NjdXBpZWQgKi8KKworICBKRElNRU5TSU9OIG91dF9yb3dfd2lkdGg7CS8qIHNhbXBsZXMgcGVyIG91dHB1dCByb3cgKi8KKyAgSkRJTUVOU0lPTiByb3dzX3RvX2dvOwkvKiBjb3VudHMgcm93cyByZW1haW5pbmcgaW4gaW1hZ2UgKi8KK30gbXlfdXBzYW1wbGVyOworCit0eXBlZGVmIG15X3Vwc2FtcGxlciAqIG15X3Vwc2FtcGxlX3B0cjsKKworI2RlZmluZSBTQ0FMRUJJVFMJMTYJLyogc3BlZWRpZXN0IHJpZ2h0LXNoaWZ0IG9uIHNvbWUgbWFjaGluZXMgKi8KKyNkZWZpbmUgT05FX0hBTEYJKChJTlQzMikgMSA8PCAoU0NBTEVCSVRTLTEpKQorI2RlZmluZSBGSVgoeCkJCSgoSU5UMzIpICgoeCkgKiAoMUw8PFNDQUxFQklUUykgKyAwLjUpKQorCisKKy8qCisgKiBJbml0aWFsaXplIHRhYmxlcyBmb3IgWUNDLT5SR0IgY29sb3JzcGFjZSBjb252ZXJzaW9uLgorICogVGhpcyBpcyB0YWtlbiBkaXJlY3RseSBmcm9tIGpkY29sb3IuYzsgc2VlIHRoYXQgZmlsZSBmb3IgbW9yZSBpbmZvLgorICovCisKK0xPQ0FMKHZvaWQpCitidWlsZF95Y2NfcmdiX3RhYmxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7CisgIGludCBpOworICBJTlQzMiB4OworICBTSElGVF9URU1QUworCisgIHVwc2FtcGxlLT5Dcl9yX3RhYiA9IChpbnQgKikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCShNQVhKU0FNUExFKzEpICogU0laRU9GKGludCkpOworICB1cHNhbXBsZS0+Q2JfYl90YWIgPSAoaW50ICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihpbnQpKTsKKyAgdXBzYW1wbGUtPkNyX2dfdGFiID0gKElOVDMyICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihJTlQzMikpOworICB1cHNhbXBsZS0+Q2JfZ190YWIgPSAoSU5UMzIgKikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCShNQVhKU0FNUExFKzEpICogU0laRU9GKElOVDMyKSk7CisKKyAgZm9yIChpID0gMCwgeCA9IC1DRU5URVJKU0FNUExFOyBpIDw9IE1BWEpTQU1QTEU7IGkrKywgeCsrKSB7CisgICAgLyogaSBpcyB0aGUgYWN0dWFsIGlucHV0IHBpeGVsIHZhbHVlLCBpbiB0aGUgcmFuZ2UgMC4uTUFYSlNBTVBMRSAqLworICAgIC8qIFRoZSBDYiBvciBDciB2YWx1ZSB3ZSBhcmUgdGhpbmtpbmcgb2YgaXMgeCA9IGkgLSBDRU5URVJKU0FNUExFICovCisgICAgLyogQ3I9PlIgdmFsdWUgaXMgbmVhcmVzdCBpbnQgdG8gMS40MDIwMCAqIHggKi8KKyAgICB1cHNhbXBsZS0+Q3Jfcl90YWJbaV0gPSAoaW50KQorCQkgICAgUklHSFRfU0hJRlQoRklYKDEuNDAyMDApICogeCArIE9ORV9IQUxGLCBTQ0FMRUJJVFMpOworICAgIC8qIENiPT5CIHZhbHVlIGlzIG5lYXJlc3QgaW50IHRvIDEuNzcyMDAgKiB4ICovCisgICAgdXBzYW1wbGUtPkNiX2JfdGFiW2ldID0gKGludCkKKwkJICAgIFJJR0hUX1NISUZUKEZJWCgxLjc3MjAwKSAqIHggKyBPTkVfSEFMRiwgU0NBTEVCSVRTKTsKKyAgICAvKiBDcj0+RyB2YWx1ZSBpcyBzY2FsZWQtdXAgLTAuNzE0MTQgKiB4ICovCisgICAgdXBzYW1wbGUtPkNyX2dfdGFiW2ldID0gKC0gRklYKDAuNzE0MTQpKSAqIHg7CisgICAgLyogQ2I9PkcgdmFsdWUgaXMgc2NhbGVkLXVwIC0wLjM0NDE0ICogeCAqLworICAgIC8qIFdlIGFsc28gYWRkIGluIE9ORV9IQUxGIHNvIHRoYXQgbmVlZCBub3QgZG8gaXQgaW4gaW5uZXIgbG9vcCAqLworICAgIHVwc2FtcGxlLT5DYl9nX3RhYltpXSA9ICgtIEZJWCgwLjM0NDE0KSkgKiB4ICsgT05FX0hBTEY7CisgIH0KK30KKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYW4gdXBzYW1wbGluZyBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19tZXJnZWRfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKKworICAvKiBNYXJrIHRoZSBzcGFyZSBidWZmZXIgZW1wdHkgKi8KKyAgdXBzYW1wbGUtPnNwYXJlX2Z1bGwgPSBGQUxTRTsKKyAgLyogSW5pdGlhbGl6ZSB0b3RhbC1oZWlnaHQgY291bnRlciBmb3IgZGV0ZWN0aW5nIGJvdHRvbSBvZiBpbWFnZSAqLworICB1cHNhbXBsZS0+cm93c190b19nbyA9IGNpbmZvLT5vdXRwdXRfaGVpZ2h0OworfQorCisKKy8qCisgKiBDb250cm9sIHJvdXRpbmUgdG8gZG8gdXBzYW1wbGluZyAoYW5kIGNvbG9yIGNvbnZlcnNpb24pLgorICoKKyAqIFRoZSBjb250cm9sIHJvdXRpbmUganVzdCBoYW5kbGVzIHRoZSByb3cgYnVmZmVyaW5nIGNvbnNpZGVyYXRpb25zLgorICovCisKK01FVEhPRERFRih2b2lkKQorbWVyZ2VkXzJ2X3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCisJCSAgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCisJCSAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAorCQkgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkKKy8qIDI6MSB2ZXJ0aWNhbCBzYW1wbGluZyBjYXNlOiBtYXkgbmVlZCBhIHNwYXJlIHJvdy4gKi8KK3sKKyAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOworICBKU0FNUFJPVyB3b3JrX3B0cnNbMl07CisgIEpESU1FTlNJT04gbnVtX3Jvd3M7CQkvKiBudW1iZXIgb2Ygcm93cyByZXR1cm5lZCB0byBjYWxsZXIgKi8KKworICBpZiAodXBzYW1wbGUtPnNwYXJlX2Z1bGwpIHsKKyAgICAvKiBJZiB3ZSBoYXZlIGEgc3BhcmUgcm93IHNhdmVkIGZyb20gYSBwcmV2aW91cyBjeWNsZSwganVzdCByZXR1cm4gaXQuICovCisgICAgamNvcHlfc2FtcGxlX3Jvd3MoJiB1cHNhbXBsZS0+c3BhcmVfcm93LCAwLCBvdXRwdXRfYnVmICsgKm91dF9yb3dfY3RyLCAwLAorCQkgICAgICAxLCB1cHNhbXBsZS0+b3V0X3Jvd193aWR0aCk7CisgICAgbnVtX3Jvd3MgPSAxOworICAgIHVwc2FtcGxlLT5zcGFyZV9mdWxsID0gRkFMU0U7CisgIH0gZWxzZSB7CisgICAgLyogRmlndXJlIG51bWJlciBvZiByb3dzIHRvIHJldHVybiB0byBjYWxsZXIuICovCisgICAgbnVtX3Jvd3MgPSAyOworICAgIC8qIE5vdCBtb3JlIHRoYW4gdGhlIGRpc3RhbmNlIHRvIHRoZSBlbmQgb2YgdGhlIGltYWdlLiAqLworICAgIGlmIChudW1fcm93cyA+IHVwc2FtcGxlLT5yb3dzX3RvX2dvKQorICAgICAgbnVtX3Jvd3MgPSB1cHNhbXBsZS0+cm93c190b19nbzsKKyAgICAvKiBBbmQgbm90IG1vcmUgdGhhbiB3aGF0IHRoZSBjbGllbnQgY2FuIGFjY2VwdDogKi8KKyAgICBvdXRfcm93c19hdmFpbCAtPSAqb3V0X3Jvd19jdHI7CisgICAgaWYgKG51bV9yb3dzID4gb3V0X3Jvd3NfYXZhaWwpCisgICAgICBudW1fcm93cyA9IG91dF9yb3dzX2F2YWlsOworICAgIC8qIENyZWF0ZSBvdXRwdXQgcG9pbnRlciBhcnJheSBmb3IgdXBzYW1wbGVyLiAqLworICAgIHdvcmtfcHRyc1swXSA9IG91dHB1dF9idWZbKm91dF9yb3dfY3RyXTsKKyAgICBpZiAobnVtX3Jvd3MgPiAxKSB7CisgICAgICB3b3JrX3B0cnNbMV0gPSBvdXRwdXRfYnVmWypvdXRfcm93X2N0ciArIDFdOworICAgIH0gZWxzZSB7CisgICAgICB3b3JrX3B0cnNbMV0gPSB1cHNhbXBsZS0+c3BhcmVfcm93OworICAgICAgdXBzYW1wbGUtPnNwYXJlX2Z1bGwgPSBUUlVFOworICAgIH0KKyAgICAvKiBOb3cgZG8gdGhlIHVwc2FtcGxpbmcuICovCisgICAgKCp1cHNhbXBsZS0+dXBtZXRob2QpIChjaW5mbywgaW5wdXRfYnVmLCAqaW5fcm93X2dyb3VwX2N0ciwgd29ya19wdHJzKTsKKyAgfQorCisgIC8qIEFkanVzdCBjb3VudHMgKi8KKyAgKm91dF9yb3dfY3RyICs9IG51bV9yb3dzOworICB1cHNhbXBsZS0+cm93c190b19nbyAtPSBudW1fcm93czsKKyAgLyogV2hlbiB0aGUgYnVmZmVyIGlzIGVtcHRpZWQsIGRlY2xhcmUgdGhpcyBpbnB1dCByb3cgZ3JvdXAgY29uc3VtZWQgKi8KKyAgaWYgKCEgdXBzYW1wbGUtPnNwYXJlX2Z1bGwpCisgICAgKCppbl9yb3dfZ3JvdXBfY3RyKSsrOworfQorCisKK01FVEhPRERFRih2b2lkKQorbWVyZ2VkXzF2X3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCisJCSAgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCisJCSAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAorCQkgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkKKy8qIDE6MSB2ZXJ0aWNhbCBzYW1wbGluZyBjYXNlOiBtdWNoIGVhc2llciwgbmV2ZXIgbmVlZCBhIHNwYXJlIHJvdy4gKi8KK3sKKyAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOworCisgIC8qIEp1c3QgZG8gdGhlIHVwc2FtcGxpbmcuICovCisgICgqdXBzYW1wbGUtPnVwbWV0aG9kKSAoY2luZm8sIGlucHV0X2J1ZiwgKmluX3Jvd19ncm91cF9jdHIsCisJCQkgb3V0cHV0X2J1ZiArICpvdXRfcm93X2N0cik7CisgIC8qIEFkanVzdCBjb3VudHMgKi8KKyAgKCpvdXRfcm93X2N0cikrKzsKKyAgKCppbl9yb3dfZ3JvdXBfY3RyKSsrOworfQorCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIHJvdXRpbmVzIGludm9rZWQgYnkgdGhlIGNvbnRyb2wgcm91dGluZXMgdG8gZG8KKyAqIHRoZSBhY3R1YWwgdXBzYW1wbGluZy9jb252ZXJzaW9uLiAgT25lIHJvdyBncm91cCBpcyBwcm9jZXNzZWQgcGVyIGNhbGwuCisgKgorICogTm90ZTogc2luY2Ugd2UgbWF5IGJlIHdyaXRpbmcgZGlyZWN0bHkgaW50byBhcHBsaWNhdGlvbi1zdXBwbGllZCBidWZmZXJzLAorICogd2UgaGF2ZSB0byBiZSBob25lc3QgYWJvdXQgdGhlIG91dHB1dCB3aWR0aDsgd2UgY2FuJ3QgYXNzdW1lIHRoZSBidWZmZXIKKyAqIGhhcyBiZWVuIHJvdW5kZWQgdXAgdG8gYW4gZXZlbiB3aWR0aC4KKyAqLworCisKKy8qCisgKiBVcHNhbXBsZSBhbmQgY29sb3IgY29udmVydCBmb3IgdGhlIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDE6MSB2ZXJ0aWNhbC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2gydjFfbWVyZ2VkX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyLAorCQkgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYpCit7CisgIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKKyAgcmVnaXN0ZXIgaW50IHksIGNyZWQsIGNncmVlbiwgY2JsdWU7CisgIGludCBjYiwgY3I7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKKyAgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIGlucHRyMjsKKyAgSkRJTUVOU0lPTiBjb2w7CisgIC8qIGNvcHkgdGhlc2UgcG9pbnRlcnMgaW50byByZWdpc3RlcnMgaWYgcG9zc2libGUgKi8KKyAgcmVnaXN0ZXIgSlNBTVBMRSAqIHJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKKyAgaW50ICogQ3JydGFiID0gdXBzYW1wbGUtPkNyX3JfdGFiOworICBpbnQgKiBDYmJ0YWIgPSB1cHNhbXBsZS0+Q2JfYl90YWI7CisgIElOVDMyICogQ3JndGFiID0gdXBzYW1wbGUtPkNyX2dfdGFiOworICBJTlQzMiAqIENiZ3RhYiA9IHVwc2FtcGxlLT5DYl9nX3RhYjsKKyAgU0hJRlRfVEVNUFMKKworICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5fcm93X2dyb3VwX2N0cl07CisgIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbl9yb3dfZ3JvdXBfY3RyXTsKKyAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2luX3Jvd19ncm91cF9jdHJdOworICBvdXRwdHIgPSBvdXRwdXRfYnVmWzBdOworICAvKiBMb29wIGZvciBlYWNoIHBhaXIgb2Ygb3V0cHV0IHBpeGVscyAqLworICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGggPj4gMTsgY29sID4gMDsgY29sLS0pIHsKKyAgICAvKiBEbyB0aGUgY2hyb21hIHBhcnQgb2YgdGhlIGNhbGN1bGF0aW9uICovCisgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7CisgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7CisgICAgY3JlZCA9IENycnRhYltjcl07CisgICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7CisgICAgY2JsdWUgPSBDYmJ0YWJbY2JdOworICAgIC8qIEZldGNoIDIgWSB2YWx1ZXMgYW5kIGVtaXQgMiBwaXhlbHMgKi8KKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKKyAgICBvdXRwdHJbUkdCX1JFRF0gPSAgIHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKKyAgICBvdXRwdHJbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOworICAgIG91dHB0cltSR0JfQkxVRV0gPSAgcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgICBvdXRwdHIgKz0gUkdCX1BJWEVMU0laRTsKKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKKyAgICBvdXRwdHJbUkdCX1JFRF0gPSAgIHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKKyAgICBvdXRwdHJbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOworICAgIG91dHB0cltSR0JfQkxVRV0gPSAgcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgICBvdXRwdHIgKz0gUkdCX1BJWEVMU0laRTsKKyAgfQorICAvKiBJZiBpbWFnZSB3aWR0aCBpcyBvZGQsIGRvIHRoZSBsYXN0IG91dHB1dCBjb2x1bW4gc2VwYXJhdGVseSAqLworICBpZiAoY2luZm8tPm91dHB1dF93aWR0aCAmIDEpIHsKKyAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSk7CisgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIpOworICAgIGNyZWQgPSBDcnJ0YWJbY3JdOworICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOworICAgIGNibHVlID0gQ2JidGFiW2NiXTsKKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCk7CisgICAgb3V0cHRyW1JHQl9SRURdID0gICByYW5nZV9saW1pdFt5ICsgY3JlZF07CisgICAgb3V0cHRyW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKKyAgICBvdXRwdHJbUkdCX0JMVUVdID0gIHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07CisgIH0KK30KKworCisvKgorICogVXBzYW1wbGUgYW5kIGNvbG9yIGNvbnZlcnQgZm9yIHRoZSBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAyOjEgdmVydGljYWwuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitoMnYyX21lcmdlZF91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5fcm93X2dyb3VwX2N0ciwKKwkJICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmKQoreworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7CisgIHJlZ2lzdGVyIGludCB5LCBjcmVkLCBjZ3JlZW4sIGNibHVlOworICBpbnQgY2IsIGNyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHIwLCBvdXRwdHIxOworICBKU0FNUFJPVyBpbnB0cjAwLCBpbnB0cjAxLCBpbnB0cjEsIGlucHRyMjsKKyAgSkRJTUVOU0lPTiBjb2w7CisgIC8qIGNvcHkgdGhlc2UgcG9pbnRlcnMgaW50byByZWdpc3RlcnMgaWYgcG9zc2libGUgKi8KKyAgcmVnaXN0ZXIgSlNBTVBMRSAqIHJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKKyAgaW50ICogQ3JydGFiID0gdXBzYW1wbGUtPkNyX3JfdGFiOworICBpbnQgKiBDYmJ0YWIgPSB1cHNhbXBsZS0+Q2JfYl90YWI7CisgIElOVDMyICogQ3JndGFiID0gdXBzYW1wbGUtPkNyX2dfdGFiOworICBJTlQzMiAqIENiZ3RhYiA9IHVwc2FtcGxlLT5DYl9nX3RhYjsKKyAgU0hJRlRfVEVNUFMKKworICBpbnB0cjAwID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHIqMl07CisgIGlucHRyMDEgPSBpbnB1dF9idWZbMF1baW5fcm93X2dyb3VwX2N0cioyICsgMV07CisgIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbl9yb3dfZ3JvdXBfY3RyXTsKKyAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2luX3Jvd19ncm91cF9jdHJdOworICBvdXRwdHIwID0gb3V0cHV0X2J1ZlswXTsKKyAgb3V0cHRyMSA9IG91dHB1dF9idWZbMV07CisgIC8qIExvb3AgZm9yIGVhY2ggZ3JvdXAgb2Ygb3V0cHV0IHBpeGVscyAqLworICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGggPj4gMTsgY29sID4gMDsgY29sLS0pIHsKKyAgICAvKiBEbyB0aGUgY2hyb21hIHBhcnQgb2YgdGhlIGNhbGN1bGF0aW9uICovCisgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7CisgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7CisgICAgY3JlZCA9IENycnRhYltjcl07CisgICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7CisgICAgY2JsdWUgPSBDYmJ0YWJbY2JdOworICAgIC8qIEZldGNoIDQgWSB2YWx1ZXMgYW5kIGVtaXQgNCBwaXhlbHMgKi8KKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDArKyk7CisgICAgb3V0cHRyMFtSR0JfUkVEXSA9ICAgcmFuZ2VfbGltaXRbeSArIGNyZWRdOworICAgIG91dHB0cjBbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOworICAgIG91dHB0cjBbUkdCX0JMVUVdID0gIHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07CisgICAgb3V0cHRyMCArPSBSR0JfUElYRUxTSVpFOworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMCsrKTsKKyAgICBvdXRwdHIwW1JHQl9SRURdID0gICByYW5nZV9saW1pdFt5ICsgY3JlZF07CisgICAgb3V0cHRyMFtSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CisgICAgb3V0cHRyMFtSR0JfQkxVRV0gPSAgcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgICBvdXRwdHIwICs9IFJHQl9QSVhFTFNJWkU7CisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAxKyspOworICAgIG91dHB0cjFbUkdCX1JFRF0gPSAgIHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKKyAgICBvdXRwdHIxW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKKyAgICBvdXRwdHIxW1JHQl9CTFVFXSA9ICByYW5nZV9saW1pdFt5ICsgY2JsdWVdOworICAgIG91dHB0cjEgKz0gUkdCX1BJWEVMU0laRTsKKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDErKyk7CisgICAgb3V0cHRyMVtSR0JfUkVEXSA9ICAgcmFuZ2VfbGltaXRbeSArIGNyZWRdOworICAgIG91dHB0cjFbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOworICAgIG91dHB0cjFbUkdCX0JMVUVdID0gIHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07CisgICAgb3V0cHRyMSArPSBSR0JfUElYRUxTSVpFOworICB9CisgIC8qIElmIGltYWdlIHdpZHRoIGlzIG9kZCwgZG8gdGhlIGxhc3Qgb3V0cHV0IGNvbHVtbiBzZXBhcmF0ZWx5ICovCisgIGlmIChjaW5mby0+b3V0cHV0X3dpZHRoICYgMSkgeworICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKTsKKyAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMik7CisgICAgY3JlZCA9IENycnRhYltjcl07CisgICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7CisgICAgY2JsdWUgPSBDYmJ0YWJbY2JdOworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMCk7CisgICAgb3V0cHRyMFtSR0JfUkVEXSA9ICAgcmFuZ2VfbGltaXRbeSArIGNyZWRdOworICAgIG91dHB0cjBbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOworICAgIG91dHB0cjBbUkdCX0JMVUVdID0gIHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07CisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAxKTsKKyAgICBvdXRwdHIxW1JHQl9SRURdID0gICByYW5nZV9saW1pdFt5ICsgY3JlZF07CisgICAgb3V0cHRyMVtSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CisgICAgb3V0cHRyMVtSR0JfQkxVRV0gPSAgcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgfQorfQorCisKKy8qCisgKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgbWVyZ2VkIHVwc2FtcGxpbmcvY29sb3IgY29udmVyc2lvbi4KKyAqCisgKiBOQjogdGhpcyBpcyBjYWxsZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZGV0ZXJtaW5lZCBieSB1c2VfbWVyZ2VkX3Vwc2FtcGxlKCkKKyAqIGluIGpkbWFzdGVyLmMuICBUaGF0IHJvdXRpbmUgTVVTVCBjb3JyZXNwb25kIHRvIHRoZSBhY3R1YWwgY2FwYWJpbGl0aWVzCisgKiBvZiB0aGlzIG1vZHVsZTsgbm8gc2FmZXR5IGNoZWNrcyBhcmUgbWFkZSBoZXJlLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfbWVyZ2VkX3Vwc2FtcGxlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlOworCisgIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV91cHNhbXBsZXIpKTsKKyAgY2luZm8tPnVwc2FtcGxlID0gKHN0cnVjdCBqcGVnX3Vwc2FtcGxlciAqKSB1cHNhbXBsZTsKKyAgdXBzYW1wbGUtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19tZXJnZWRfdXBzYW1wbGU7CisgIHVwc2FtcGxlLT5wdWIubmVlZF9jb250ZXh0X3Jvd3MgPSBGQUxTRTsKKworICB1cHNhbXBsZS0+b3V0X3Jvd193aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGggKiBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7CisKKyAgaWYgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciA9PSAyKSB7CisgICAgdXBzYW1wbGUtPnB1Yi51cHNhbXBsZSA9IG1lcmdlZF8ydl91cHNhbXBsZTsKKyAgICB1cHNhbXBsZS0+dXBtZXRob2QgPSBoMnYyX21lcmdlZF91cHNhbXBsZTsKKyAgICAvKiBBbGxvY2F0ZSBhIHNwYXJlIHJvdyBidWZmZXIgKi8KKyAgICB1cHNhbXBsZS0+c3BhcmVfcm93ID0gKEpTQU1QUk9XKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJKHNpemVfdCkgKHVwc2FtcGxlLT5vdXRfcm93X3dpZHRoICogU0laRU9GKEpTQU1QTEUpKSk7CisgIH0gZWxzZSB7CisgICAgdXBzYW1wbGUtPnB1Yi51cHNhbXBsZSA9IG1lcmdlZF8xdl91cHNhbXBsZTsKKyAgICB1cHNhbXBsZS0+dXBtZXRob2QgPSBoMnYxX21lcmdlZF91cHNhbXBsZTsKKyAgICAvKiBObyBzcGFyZSByb3cgbmVlZGVkICovCisgICAgdXBzYW1wbGUtPnNwYXJlX3JvdyA9IE5VTEw7CisgIH0KKworICBidWlsZF95Y2NfcmdiX3RhYmxlKGNpbmZvKTsKK30KKworI2VuZGlmIC8qIFVQU0FNUExFX01FUkdJTkdfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRwaHVmZi5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkcGh1ZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjY3ODA5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkcGh1ZmYuYwpAQCAtMCwwICsxLDY2OCBAQAorLyoKKyAqIGpkcGh1ZmYuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIEh1ZmZtYW4gZW50cm9weSBkZWNvZGluZyByb3V0aW5lcyBmb3IgcHJvZ3Jlc3NpdmUgSlBFRy4KKyAqCisgKiBNdWNoIG9mIHRoZSBjb21wbGV4aXR5IGhlcmUgaGFzIHRvIGRvIHdpdGggc3VwcG9ydGluZyBpbnB1dCBzdXNwZW5zaW9uLgorICogSWYgdGhlIGRhdGEgc291cmNlIG1vZHVsZSBkZW1hbmRzIHN1c3BlbnNpb24sIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBiYWNrCisgKiB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgTUNVLiAgVG8gZG8gdGhpcywgd2UgY29weSBzdGF0ZSB2YXJpYWJsZXMKKyAqIGludG8gbG9jYWwgd29ya2luZyBzdG9yYWdlLCBhbmQgdXBkYXRlIHRoZW0gYmFjayB0byB0aGUgcGVybWFuZW50CisgKiBzdG9yYWdlIG9ubHkgdXBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgYW4gTUNVLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZGh1ZmYuaCIJCS8qIERlY2xhcmF0aW9ucyBzaGFyZWQgd2l0aCBqZGh1ZmYuYyAqLworCisKKyNpZmRlZiBEX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorCisvKgorICogRXhwYW5kZWQgZW50cm9weSBkZWNvZGVyIG9iamVjdCBmb3IgcHJvZ3Jlc3NpdmUgSHVmZm1hbiBkZWNvZGluZy4KKyAqCisgKiBUaGUgc2F2YWJsZV9zdGF0ZSBzdWJyZWNvcmQgY29udGFpbnMgZmllbGRzIHRoYXQgY2hhbmdlIHdpdGhpbiBhbiBNQ1UsCisgKiBidXQgbXVzdCBub3QgYmUgdXBkYXRlZCBwZXJtYW5lbnRseSB1bnRpbCB3ZSBjb21wbGV0ZSB0aGUgTUNVLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IEVPQlJVTjsJCQkvKiByZW1haW5pbmcgRU9CcyBpbiBFT0JSVU4gKi8KKyAgaW50IGxhc3RfZGNfdmFsW01BWF9DT01QU19JTl9TQ0FOXTsJLyogbGFzdCBEQyBjb2VmIGZvciBlYWNoIGNvbXBvbmVudCAqLworfSBzYXZhYmxlX3N0YXRlOworCisvKiBUaGlzIG1hY3JvIGlzIHRvIHdvcmsgYXJvdW5kIGNvbXBpbGVycyB3aXRoIG1pc3Npbmcgb3IgYnJva2VuCisgKiBzdHJ1Y3R1cmUgYXNzaWdubWVudC4gIFlvdSdsbCBuZWVkIHRvIGZpeCB0aGlzIGNvZGUgaWYgeW91IGhhdmUKKyAqIHN1Y2ggYSBjb21waWxlciBhbmQgeW91IGNoYW5nZSBNQVhfQ09NUFNfSU5fU0NBTi4KKyAqLworCisjaWZuZGVmIE5PX1NUUlVDVF9BU1NJR04KKyNkZWZpbmUgQVNTSUdOX1NUQVRFKGRlc3Qsc3JjKSAgKChkZXN0KSA9IChzcmMpKQorI2Vsc2UKKyNpZiBNQVhfQ09NUFNfSU5fU0NBTiA9PSA0CisjZGVmaW5lIEFTU0lHTl9TVEFURShkZXN0LHNyYykgIFwKKwkoKGRlc3QpLkVPQlJVTiA9IChzcmMpLkVPQlJVTiwgXAorCSAoZGVzdCkubGFzdF9kY192YWxbMF0gPSAoc3JjKS5sYXN0X2RjX3ZhbFswXSwgXAorCSAoZGVzdCkubGFzdF9kY192YWxbMV0gPSAoc3JjKS5sYXN0X2RjX3ZhbFsxXSwgXAorCSAoZGVzdCkubGFzdF9kY192YWxbMl0gPSAoc3JjKS5sYXN0X2RjX3ZhbFsyXSwgXAorCSAoZGVzdCkubGFzdF9kY192YWxbM10gPSAoc3JjKS5sYXN0X2RjX3ZhbFszXSkKKyNlbmRpZgorI2VuZGlmCisKKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19lbnRyb3B5X2RlY29kZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogVGhlc2UgZmllbGRzIGFyZSBsb2FkZWQgaW50byBsb2NhbCB2YXJpYWJsZXMgYXQgc3RhcnQgb2YgZWFjaCBNQ1UuCisgICAqIEluIGNhc2Ugb2Ygc3VzcGVuc2lvbiwgd2UgZXhpdCBXSVRIT1VUIHVwZGF0aW5nIHRoZW0uCisgICAqLworICBiaXRyZWFkX3Blcm1fc3RhdGUgYml0c3RhdGU7CS8qIEJpdCBidWZmZXIgYXQgc3RhcnQgb2YgTUNVICovCisgIHNhdmFibGVfc3RhdGUgc2F2ZWQ7CQkvKiBPdGhlciBzdGF0ZSBhdCBzdGFydCBvZiBNQ1UgKi8KKworICAvKiBUaGVzZSBmaWVsZHMgYXJlIE5PVCBsb2FkZWQgaW50byBsb2NhbCB3b3JraW5nIHN0YXRlLiAqLworICB1bnNpZ25lZCBpbnQgcmVzdGFydHNfdG9fZ287CS8qIE1DVXMgbGVmdCBpbiB0aGlzIHJlc3RhcnQgaW50ZXJ2YWwgKi8KKworICAvKiBQb2ludGVycyB0byBkZXJpdmVkIHRhYmxlcyAodGhlc2Ugd29ya3NwYWNlcyBoYXZlIGltYWdlIGxpZmVzcGFuKSAqLworICBkX2Rlcml2ZWRfdGJsICogZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOworCisgIGRfZGVyaXZlZF90YmwgKiBhY19kZXJpdmVkX3RibDsgLyogYWN0aXZlIHRhYmxlIGR1cmluZyBhbiBBQyBzY2FuICovCit9IHBodWZmX2VudHJvcHlfZGVjb2RlcjsKKwordHlwZWRlZiBwaHVmZl9lbnRyb3B5X2RlY29kZXIgKiBwaHVmZl9lbnRyb3B5X3B0cjsKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK01FVEhPRERFRihib29sZWFuKSBkZWNvZGVfbWN1X0RDX2ZpcnN0IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKK01FVEhPRERFRihib29sZWFuKSBkZWNvZGVfbWN1X0FDX2ZpcnN0IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKK01FVEhPRERFRihib29sZWFuKSBkZWNvZGVfbWN1X0RDX3JlZmluZSBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgICAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOworTUVUSE9EREVGKGJvb2xlYW4pIGRlY29kZV9tY3VfQUNfcmVmaW5lIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICAgICBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7CisKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIGEgSHVmZm1hbi1jb21wcmVzc2VkIHNjYW4uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX3BodWZmX2RlY29kZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBib29sZWFuIGlzX0RDX2JhbmQsIGJhZDsKKyAgaW50IGNpLCBjb2VmaSwgdGJsOworICBpbnQgKmNvZWZfYml0X3B0cjsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgaXNfRENfYmFuZCA9IChjaW5mby0+U3MgPT0gMCk7CisKKyAgLyogVmFsaWRhdGUgc2NhbiBwYXJhbWV0ZXJzICovCisgIGJhZCA9IEZBTFNFOworICBpZiAoaXNfRENfYmFuZCkgeworICAgIGlmIChjaW5mby0+U2UgIT0gMCkKKyAgICAgIGJhZCA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgLyogbmVlZCBub3QgY2hlY2sgU3MvU2UgPCAwIHNpbmNlIHRoZXkgY2FtZSBmcm9tIHVuc2lnbmVkIGJ5dGVzICovCisgICAgaWYgKGNpbmZvLT5TcyA+IGNpbmZvLT5TZSB8fCBjaW5mby0+U2UgPj0gRENUU0laRTIpCisgICAgICBiYWQgPSBUUlVFOworICAgIC8qIEFDIHNjYW5zIG1heSBoYXZlIG9ubHkgb25lIGNvbXBvbmVudCAqLworICAgIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiAhPSAxKQorICAgICAgYmFkID0gVFJVRTsKKyAgfQorICBpZiAoY2luZm8tPkFoICE9IDApIHsKKyAgICAvKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuOiBtdXN0IGhhdmUgQWwgPSBBaC0xLiAqLworICAgIGlmIChjaW5mby0+QWwgIT0gY2luZm8tPkFoLTEpCisgICAgICBiYWQgPSBUUlVFOworICB9CisgIGlmIChjaW5mby0+QWwgPiAxMykJCS8qIG5lZWQgbm90IGNoZWNrIGZvciA8IDAgKi8KKyAgICBiYWQgPSBUUlVFOworICAvKiBBcmd1YWJseSB0aGUgbWF4aW11bSBBbCB2YWx1ZSBzaG91bGQgYmUgbGVzcyB0aGFuIDEzIGZvciA4LWJpdCBwcmVjaXNpb24sCisgICAqIGJ1dCB0aGUgc3BlYyBkb2Vzbid0IHNheSBzbywgYW5kIHdlIHRyeSB0byBiZSBsaWJlcmFsIGFib3V0IHdoYXQgd2UKKyAgICogYWNjZXB0LiAgTm90ZTogbGFyZ2UgQWwgdmFsdWVzIGNvdWxkIHJlc3VsdCBpbiBvdXQtb2YtcmFuZ2UgREMKKyAgICogY29lZmZpY2llbnRzIGR1cmluZyBlYXJseSBzY2FucywgbGVhZGluZyB0byBiaXphcnJlIGRpc3BsYXlzIGR1ZSB0bworICAgKiBvdmVyZmxvd3MgaW4gdGhlIElEQ1QgbWF0aC4gIEJ1dCB3ZSB3b24ndCBjcmFzaC4KKyAgICovCisgIGlmIChiYWQpCisgICAgRVJSRVhJVDQoY2luZm8sIEpFUlJfQkFEX1BST0dSRVNTSU9OLAorCSAgICAgY2luZm8tPlNzLCBjaW5mby0+U2UsIGNpbmZvLT5BaCwgY2luZm8tPkFsKTsKKyAgLyogVXBkYXRlIHByb2dyZXNzaW9uIHN0YXR1cywgYW5kIHZlcmlmeSB0aGF0IHNjYW4gb3JkZXIgaXMgbGVnYWwuCisgICAqIE5vdGUgdGhhdCBpbnRlci1zY2FuIGluY29uc2lzdGVuY2llcyBhcmUgdHJlYXRlZCBhcyB3YXJuaW5ncworICAgKiBub3QgZmF0YWwgZXJyb3JzIC4uLiBub3QgY2xlYXIgaWYgdGhpcyBpcyByaWdodCB3YXkgdG8gYmVoYXZlLgorICAgKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBpbnQgY2luZGV4ID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldLT5jb21wb25lbnRfaW5kZXg7CisgICAgY29lZl9iaXRfcHRyID0gJiBjaW5mby0+Y29lZl9iaXRzW2NpbmRleF1bMF07CisgICAgaWYgKCFpc19EQ19iYW5kICYmIGNvZWZfYml0X3B0clswXSA8IDApIC8qIEFDIHdpdGhvdXQgcHJpb3IgREMgc2NhbiAqLworICAgICAgV0FSTk1TMihjaW5mbywgSldSTl9CT0dVU19QUk9HUkVTU0lPTiwgY2luZGV4LCAwKTsKKyAgICBmb3IgKGNvZWZpID0gY2luZm8tPlNzOyBjb2VmaSA8PSBjaW5mby0+U2U7IGNvZWZpKyspIHsKKyAgICAgIGludCBleHBlY3RlZCA9IChjb2VmX2JpdF9wdHJbY29lZmldIDwgMCkgPyAwIDogY29lZl9iaXRfcHRyW2NvZWZpXTsKKyAgICAgIGlmIChjaW5mby0+QWggIT0gZXhwZWN0ZWQpCisJV0FSTk1TMihjaW5mbywgSldSTl9CT0dVU19QUk9HUkVTU0lPTiwgY2luZGV4LCBjb2VmaSk7CisgICAgICBjb2VmX2JpdF9wdHJbY29lZmldID0gY2luZm8tPkFsOworICAgIH0KKyAgfQorCisgIC8qIFNlbGVjdCBNQ1UgZGVjb2Rpbmcgcm91dGluZSAqLworICBpZiAoY2luZm8tPkFoID09IDApIHsKKyAgICBpZiAoaXNfRENfYmFuZCkKKyAgICAgIGVudHJvcHktPnB1Yi5kZWNvZGVfbWN1ID0gZGVjb2RlX21jdV9EQ19maXJzdDsKKyAgICBlbHNlCisgICAgICBlbnRyb3B5LT5wdWIuZGVjb2RlX21jdSA9IGRlY29kZV9tY3VfQUNfZmlyc3Q7CisgIH0gZWxzZSB7CisgICAgaWYgKGlzX0RDX2JhbmQpCisgICAgICBlbnRyb3B5LT5wdWIuZGVjb2RlX21jdSA9IGRlY29kZV9tY3VfRENfcmVmaW5lOworICAgIGVsc2UKKyAgICAgIGVudHJvcHktPnB1Yi5kZWNvZGVfbWN1ID0gZGVjb2RlX21jdV9BQ19yZWZpbmU7CisgIH0KKworICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgeworICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgLyogTWFrZSBzdXJlIHJlcXVlc3RlZCB0YWJsZXMgYXJlIHByZXNlbnQsIGFuZCBjb21wdXRlIGRlcml2ZWQgdGFibGVzLgorICAgICAqIFdlIG1heSBidWlsZCBzYW1lIGRlcml2ZWQgdGFibGUgbW9yZSB0aGFuIG9uY2UsIGJ1dCBpdCdzIG5vdCBleHBlbnNpdmUuCisgICAgICovCisgICAgaWYgKGlzX0RDX2JhbmQpIHsKKyAgICAgIGlmIChjaW5mby0+QWggPT0gMCkgewkvKiBEQyByZWZpbmVtZW50IG5lZWRzIG5vIHRhYmxlICovCisJdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOworCWpwZWdfbWFrZV9kX2Rlcml2ZWRfdGJsKGNpbmZvLCBUUlVFLCB0YmwsCisJCQkJJiBlbnRyb3B5LT5kZXJpdmVkX3RibHNbdGJsXSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHRibCA9IGNvbXBwdHItPmFjX3RibF9ubzsKKyAgICAgIGpwZWdfbWFrZV9kX2Rlcml2ZWRfdGJsKGNpbmZvLCBGQUxTRSwgdGJsLAorCQkJICAgICAgJiBlbnRyb3B5LT5kZXJpdmVkX3RibHNbdGJsXSk7CisgICAgICAvKiByZW1lbWJlciB0aGUgc2luZ2xlIGFjdGl2ZSB0YWJsZSAqLworICAgICAgZW50cm9weS0+YWNfZGVyaXZlZF90YmwgPSBlbnRyb3B5LT5kZXJpdmVkX3RibHNbdGJsXTsKKyAgICB9CisgICAgLyogSW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCisgICAgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldID0gMDsKKyAgfQorCisgIC8qIEluaXRpYWxpemUgYml0cmVhZCBzdGF0ZSB2YXJpYWJsZXMgKi8KKyAgZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0ID0gMDsKKyAgZW50cm9weS0+Yml0c3RhdGUuZ2V0X2J1ZmZlciA9IDA7IC8qIHVubmVjZXNzYXJ5LCBidXQga2VlcHMgUHVyaWZ5IHF1aWV0ICovCisgIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSA9IEZBTFNFOworCisgIC8qIEluaXRpYWxpemUgcHJpdmF0ZSBzdGF0ZSB2YXJpYWJsZXMgKi8KKyAgZW50cm9weS0+c2F2ZWQuRU9CUlVOID0gMDsKKworICAvKiBJbml0aWFsaXplIHJlc3RhcnQgY291bnRlciAqLworICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOworfQorCisKKy8qCisgKiBGaWd1cmUgRi4xMjogZXh0ZW5kIHNpZ24gYml0LgorICogT24gc29tZSBtYWNoaW5lcywgYSBzaGlmdCBhbmQgYWRkIHdpbGwgYmUgZmFzdGVyIHRoYW4gYSB0YWJsZSBsb29rdXAuCisgKi8KKworI2lmZGVmIEFWT0lEX1RBQkxFUworCisjZGVmaW5lIEhVRkZfRVhURU5EKHgscykgICgoeCkgPCAoMTw8KChzKS0xKSkgPyAoeCkgKyAoKCgtMSk8PChzKSkgKyAxKSA6ICh4KSkKKworI2Vsc2UKKworI2RlZmluZSBIVUZGX0VYVEVORCh4LHMpICAoKHgpIDwgZXh0ZW5kX3Rlc3Rbc10gPyAoeCkgKyBleHRlbmRfb2Zmc2V0W3NdIDogKHgpKQorCitzdGF0aWMgY29uc3QgaW50IGV4dGVuZF90ZXN0WzE2XSA9ICAgLyogZW50cnkgbiBpcyAyKioobi0xKSAqLworICB7IDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDQsIDB4MDAwOCwgMHgwMDEwLCAweDAwMjAsIDB4MDA0MCwgMHgwMDgwLAorICAgIDB4MDEwMCwgMHgwMjAwLCAweDA0MDAsIDB4MDgwMCwgMHgxMDAwLCAweDIwMDAsIDB4NDAwMCB9OworCitzdGF0aWMgY29uc3QgaW50IGV4dGVuZF9vZmZzZXRbMTZdID0gLyogZW50cnkgbiBpcyAoLTEgPDwgbikgKyAxICovCisgIHsgMCwgKCgtMSk8PDEpICsgMSwgKCgtMSk8PDIpICsgMSwgKCgtMSk8PDMpICsgMSwgKCgtMSk8PDQpICsgMSwKKyAgICAoKC0xKTw8NSkgKyAxLCAoKC0xKTw8NikgKyAxLCAoKC0xKTw8NykgKyAxLCAoKC0xKTw8OCkgKyAxLAorICAgICgoLTEpPDw5KSArIDEsICgoLTEpPDwxMCkgKyAxLCAoKC0xKTw8MTEpICsgMSwgKCgtMSk8PDEyKSArIDEsCisgICAgKCgtMSk8PDEzKSArIDEsICgoLTEpPDwxNCkgKyAxLCAoKC0xKTw8MTUpICsgMSB9OworCisjZW5kaWYgLyogQVZPSURfVEFCTEVTICovCisKKworLyoKKyAqIENoZWNrIGZvciBhIHJlc3RhcnQgbWFya2VyICYgcmVzeW5jaHJvbml6ZSBkZWNvZGVyLgorICogUmV0dXJucyBGQUxTRSBpZiBtdXN0IHN1c3BlbmQuCisgKi8KKworTE9DQUwoYm9vbGVhbikKK3Byb2Nlc3NfcmVzdGFydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBjaTsKKworICAvKiBUaHJvdyBhd2F5IGFueSB1bnVzZWQgYml0cyByZW1haW5pbmcgaW4gYml0IGJ1ZmZlcjsgKi8KKyAgLyogaW5jbHVkZSBhbnkgZnVsbCBieXRlcyBpbiBuZXh0X21hcmtlcidzIGNvdW50IG9mIGRpc2NhcmRlZCBieXRlcyAqLworICBjaW5mby0+bWFya2VyLT5kaXNjYXJkZWRfYnl0ZXMgKz0gZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0IC8gODsKKyAgZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0ID0gMDsKKworICAvKiBBZHZhbmNlIHBhc3QgdGhlIFJTVG4gbWFya2VyICovCisgIGlmICghICgqY2luZm8tPm1hcmtlci0+cmVhZF9yZXN0YXJ0X21hcmtlcikgKGNpbmZvKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogUmUtaW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKQorICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IDA7CisgIC8qIFJlLWluaXQgRU9CIHJ1biBjb3VudCwgdG9vICovCisgIGVudHJvcHktPnNhdmVkLkVPQlJVTiA9IDA7CisKKyAgLyogUmVzZXQgcmVzdGFydCBjb3VudGVyICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisKKyAgLyogUmVzZXQgb3V0LW9mLWRhdGEgZmxhZywgdW5sZXNzIHJlYWRfcmVzdGFydF9tYXJrZXIgbGVmdCB1cyBzbWFjayB1cAorICAgKiBhZ2FpbnN0IGEgbWFya2VyLiAgSW4gdGhhdCBjYXNlIHdlIHdpbGwgZW5kIHVwIHRyZWF0aW5nIHRoZSBuZXh0IGRhdGEKKyAgICogc2VnbWVudCBhcyBlbXB0eSwgYW5kIHdlIGNhbiBhdm9pZCBwcm9kdWNpbmcgYm9ndXMgb3V0cHV0IHBpeGVscyBieQorICAgKiBsZWF2aW5nIHRoZSBmbGFnIHNldC4KKyAgICovCisgIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PSAwKQorICAgIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSA9IEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBIdWZmbWFuIE1DVSBkZWNvZGluZy4KKyAqIEVhY2ggb2YgdGhlc2Ugcm91dGluZXMgZGVjb2RlcyBhbmQgcmV0dXJucyBvbmUgTUNVJ3Mgd29ydGggb2YKKyAqIEh1ZmZtYW4tY29tcHJlc3NlZCBjb2VmZmljaWVudHMuIAorICogVGhlIGNvZWZmaWNpZW50cyBhcmUgcmVvcmRlcmVkIGZyb20gemlnemFnIG9yZGVyIGludG8gbmF0dXJhbCBhcnJheSBvcmRlciwKKyAqIGJ1dCBhcmUgbm90IGRlcXVhbnRpemVkLgorICoKKyAqIFRoZSBpJ3RoIGJsb2NrIG9mIHRoZSBNQ1UgaXMgc3RvcmVkIGludG8gdGhlIGJsb2NrIHBvaW50ZWQgdG8gYnkKKyAqIE1DVV9kYXRhW2ldLiAgV0UgQVNTVU1FIFRISVMgQVJFQSBJUyBJTklUSUFMTFkgWkVST0VEIEJZIFRIRSBDQUxMRVIuCisgKgorICogV2UgcmV0dXJuIEZBTFNFIGlmIGRhdGEgc291cmNlIHJlcXVlc3RlZCBzdXNwZW5zaW9uLiAgSW4gdGhhdCBjYXNlIG5vCisgKiBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHBlcm1hbmVudCBzdGF0ZS4gIChFeGNlcHRpb246IHNvbWUgb3V0cHV0CisgKiBjb2VmZmljaWVudHMgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGFzc2lnbmVkLiAgVGhpcyBpcyBoYXJtbGVzcyBmb3IKKyAqIHNwZWN0cmFsIHNlbGVjdGlvbiwgc2luY2Ugd2UnbGwganVzdCByZS1hc3NpZ24gdGhlbSBvbiB0aGUgbmV4dCBjYWxsLgorICogU3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIEFDIHJlZmluZW1lbnQgaGFzIHRvIGJlIG1vcmUgY2FyZWZ1bCwgaG93ZXZlci4pCisgKi8KKworLyoKKyAqIE1DVSBkZWNvZGluZyBmb3IgREMgaW5pdGlhbCBzY2FuIChlaXRoZXIgc3BlY3RyYWwgc2VsZWN0aW9uLAorICogb3IgZmlyc3QgcGFzcyBvZiBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24pLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZGVjb2RlX21jdV9EQ19maXJzdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKK3sgICAKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBBbCA9IGNpbmZvLT5BbDsKKyAgcmVnaXN0ZXIgaW50IHMsIHI7CisgIGludCBibGtuLCBjaTsKKyAgSkJMT0NLUk9XIGJsb2NrOworICBCSVRSRUFEX1NUQVRFX1ZBUlM7CisgIHNhdmFibGVfc3RhdGUgc3RhdGU7CisgIGRfZGVyaXZlZF90YmwgKiB0Ymw7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworCisgIC8qIFByb2Nlc3MgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkOyBtYXkgaGF2ZSB0byBzdXNwZW5kICovCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgeworICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgaWYgKCEgcHJvY2Vzc19yZXN0YXJ0KGNpbmZvKSkKKwlyZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBJZiB3ZSd2ZSBydW4gb3V0IG9mIGRhdGEsIGp1c3QgbGVhdmUgdGhlIE1DVSBzZXQgdG8gemVyb2VzLgorICAgKiBUaGlzIHdheSwgd2UgcmV0dXJuIHVuaWZvcm0gZ3JheSBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgc2VnbWVudC4KKyAgICovCisgIGlmICghIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSkgeworCisgICAgLyogTG9hZCB1cCB3b3JraW5nIHN0YXRlICovCisgICAgQklUUkVBRF9MT0FEX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKKyAgICBBU1NJR05fU1RBVEUoc3RhdGUsIGVudHJvcHktPnNhdmVkKTsKKworICAgIC8qIE91dGVyIGxvb3AgaGFuZGxlcyBlYWNoIGJsb2NrIGluIHRoZSBNQ1UgKi8KKworICAgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7CisgICAgICBibG9jayA9IE1DVV9kYXRhW2Jsa25dOworICAgICAgY2kgPSBjaW5mby0+TUNVX21lbWJlcnNoaXBbYmxrbl07CisgICAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgICAgdGJsID0gZW50cm9weS0+ZGVyaXZlZF90YmxzW2NvbXBwdHItPmRjX3RibF9ub107CisKKyAgICAgIC8qIERlY29kZSBhIHNpbmdsZSBibG9jaydzIHdvcnRoIG9mIGNvZWZmaWNpZW50cyAqLworCisgICAgICAvKiBTZWN0aW9uIEYuMi4yLjE6IGRlY29kZSB0aGUgREMgY29lZmZpY2llbnQgZGlmZmVyZW5jZSAqLworICAgICAgSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIHRibCwgcmV0dXJuIEZBTFNFLCBsYWJlbDEpOworICAgICAgaWYgKHMpIHsKKwlDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOworCXIgPSBHRVRfQklUUyhzKTsKKwlzID0gSFVGRl9FWFRFTkQociwgcyk7CisgICAgICB9CisKKyAgICAgIC8qIENvbnZlcnQgREMgZGlmZmVyZW5jZSB0byBhY3R1YWwgdmFsdWUsIHVwZGF0ZSBsYXN0X2RjX3ZhbCAqLworICAgICAgcyArPSBzdGF0ZS5sYXN0X2RjX3ZhbFtjaV07CisgICAgICBzdGF0ZS5sYXN0X2RjX3ZhbFtjaV0gPSBzOworICAgICAgLyogU2NhbGUgYW5kIG91dHB1dCB0aGUgY29lZmZpY2llbnQgKGFzc3VtZXMganBlZ19uYXR1cmFsX29yZGVyWzBdPTApICovCisgICAgICAoKmJsb2NrKVswXSA9IChKQ09FRikgKHMgPDwgQWwpOworICAgIH0KKworICAgIC8qIENvbXBsZXRlZCBNQ1UsIHNvIHVwZGF0ZSBzdGF0ZSAqLworICAgIEJJVFJFQURfU0FWRV9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7CisgICAgQVNTSUdOX1NUQVRFKGVudHJvcHktPnNhdmVkLCBzdGF0ZSk7CisgIH0KKworICAvKiBBY2NvdW50IGZvciByZXN0YXJ0IGludGVydmFsIChuby1vcCBpZiBub3QgdXNpbmcgcmVzdGFydHMpICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIE1DVSBkZWNvZGluZyBmb3IgQUMgaW5pdGlhbCBzY2FuIChlaXRoZXIgc3BlY3RyYWwgc2VsZWN0aW9uLAorICogb3IgZmlyc3QgcGFzcyBvZiBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24pLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZGVjb2RlX21jdV9BQ19maXJzdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKK3sgICAKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBTZSA9IGNpbmZvLT5TZTsKKyAgaW50IEFsID0gY2luZm8tPkFsOworICByZWdpc3RlciBpbnQgcywgaywgcjsKKyAgdW5zaWduZWQgaW50IEVPQlJVTjsKKyAgSkJMT0NLUk9XIGJsb2NrOworICBCSVRSRUFEX1NUQVRFX1ZBUlM7CisgIGRfZGVyaXZlZF90YmwgKiB0Ymw7CisKKyAgLyogUHJvY2VzcyByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQ7IG1heSBoYXZlIHRvIHN1c3BlbmQgKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCisgICAgICBpZiAoISBwcm9jZXNzX3Jlc3RhcnQoY2luZm8pKQorCXJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIElmIHdlJ3ZlIHJ1biBvdXQgb2YgZGF0YSwganVzdCBsZWF2ZSB0aGUgTUNVIHNldCB0byB6ZXJvZXMuCisgICAqIFRoaXMgd2F5LCB3ZSByZXR1cm4gdW5pZm9ybSBncmF5IGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSBzZWdtZW50LgorICAgKi8KKyAgaWYgKCEgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhKSB7CisKKyAgICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUuCisgICAgICogV2UgY2FuIGF2b2lkIGxvYWRpbmcvc2F2aW5nIGJpdHJlYWQgc3RhdGUgaWYgaW4gYW4gRU9CIHJ1bi4KKyAgICAgKi8KKyAgICBFT0JSVU4gPSBlbnRyb3B5LT5zYXZlZC5FT0JSVU47CS8qIG9ubHkgcGFydCBvZiBzYXZlZCBzdGF0ZSB3ZSBuZWVkICovCisKKyAgICAvKiBUaGVyZSBpcyBhbHdheXMgb25seSBvbmUgYmxvY2sgcGVyIE1DVSAqLworCisgICAgaWYgKEVPQlJVTiA+IDApCQkvKiBpZiBpdCdzIGEgYmFuZCBvZiB6ZXJvZXMuLi4gKi8KKyAgICAgIEVPQlJVTi0tOwkJCS8qIC4uLnByb2Nlc3MgaXQgbm93ICh3ZSBkbyBub3RoaW5nKSAqLworICAgIGVsc2UgeworICAgICAgQklUUkVBRF9MT0FEX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKKyAgICAgIGJsb2NrID0gTUNVX2RhdGFbMF07CisgICAgICB0YmwgPSBlbnRyb3B5LT5hY19kZXJpdmVkX3RibDsKKworICAgICAgZm9yIChrID0gY2luZm8tPlNzOyBrIDw9IFNlOyBrKyspIHsKKwlIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgdGJsLCByZXR1cm4gRkFMU0UsIGxhYmVsMik7CisJciA9IHMgPj4gNDsKKwlzICY9IDE1OworCWlmIChzKSB7CisJICBrICs9IHI7CisJICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOworCSAgciA9IEdFVF9CSVRTKHMpOworCSAgcyA9IEhVRkZfRVhURU5EKHIsIHMpOworCSAgLyogU2NhbGUgYW5kIG91dHB1dCBjb2VmZmljaWVudCBpbiBuYXR1cmFsIChkZXppZ3phZ2dlZCkgb3JkZXIgKi8KKwkgICgqYmxvY2spW2pwZWdfbmF0dXJhbF9vcmRlcltrXV0gPSAoSkNPRUYpIChzIDw8IEFsKTsKKwl9IGVsc2UgeworCSAgaWYgKHIgPT0gMTUpIHsJLyogWlJMICovCisJICAgIGsgKz0gMTU7CQkvKiBza2lwIDE1IHplcm9lcyBpbiBiYW5kICovCisJICB9IGVsc2UgewkJLyogRU9CciwgcnVuIGxlbmd0aCBpcyAyXnIgKyBhcHBlbmRlZCBiaXRzICovCisJICAgIEVPQlJVTiA9IDEgPDwgcjsKKwkgICAgaWYgKHIpIHsJCS8qIEVPQnIsIHIgPiAwICovCisJICAgICAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgciwgcmV0dXJuIEZBTFNFKTsKKwkgICAgICByID0gR0VUX0JJVFMocik7CisJICAgICAgRU9CUlVOICs9IHI7CisJICAgIH0KKwkgICAgRU9CUlVOLS07CQkvKiB0aGlzIGJhbmQgaXMgcHJvY2Vzc2VkIGF0IHRoaXMgbW9tZW50ICovCisJICAgIGJyZWFrOwkJLyogZm9yY2UgZW5kLW9mLWJhbmQgKi8KKwkgIH0KKwl9CisgICAgICB9CisKKyAgICAgIEJJVFJFQURfU0FWRV9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7CisgICAgfQorCisgICAgLyogQ29tcGxldGVkIE1DVSwgc28gdXBkYXRlIHN0YXRlICovCisgICAgZW50cm9weS0+c2F2ZWQuRU9CUlVOID0gRU9CUlVOOwkvKiBvbmx5IHBhcnQgb2Ygc2F2ZWQgc3RhdGUgd2UgbmVlZCAqLworICB9CisKKyAgLyogQWNjb3VudCBmb3IgcmVzdGFydCBpbnRlcnZhbCAobm8tb3AgaWYgbm90IHVzaW5nIHJlc3RhcnRzKSAqLworICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBNQ1UgZGVjb2RpbmcgZm9yIERDIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiByZWZpbmVtZW50IHNjYW4uCisgKiBOb3RlOiB3ZSBhc3N1bWUgc3VjaCBzY2FucyBjYW4gYmUgbXVsdGktY29tcG9uZW50LCBhbHRob3VnaCB0aGUgc3BlYworICogaXMgbm90IHZlcnkgY2xlYXIgb24gdGhlIHBvaW50LgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZGVjb2RlX21jdV9EQ19yZWZpbmUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCit7ICAgCisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBpbnQgcDEgPSAxIDw8IGNpbmZvLT5BbDsJLyogMSBpbiB0aGUgYml0IHBvc2l0aW9uIGJlaW5nIGNvZGVkICovCisgIGludCBibGtuOworICBKQkxPQ0tST1cgYmxvY2s7CisgIEJJVFJFQURfU1RBVEVfVkFSUzsKKworICAvKiBQcm9jZXNzIHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZDsgbWF5IGhhdmUgdG8gc3VzcGVuZCAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKKyAgICAgIGlmICghIHByb2Nlc3NfcmVzdGFydChjaW5mbykpCisJcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogTm90IHdvcnRoIHRoZSBjeWNsZXMgdG8gY2hlY2sgaW5zdWZmaWNpZW50X2RhdGEgaGVyZSwKKyAgICogc2luY2Ugd2Ugd2lsbCBub3QgY2hhbmdlIHRoZSBkYXRhIGFueXdheSBpZiB3ZSByZWFkIHplcm9lcy4KKyAgICovCisKKyAgLyogTG9hZCB1cCB3b3JraW5nIHN0YXRlICovCisgIEJJVFJFQURfTE9BRF9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7CisKKyAgLyogT3V0ZXIgbG9vcCBoYW5kbGVzIGVhY2ggYmxvY2sgaW4gdGhlIE1DVSAqLworCisgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7CisgICAgYmxvY2sgPSBNQ1VfZGF0YVtibGtuXTsKKworICAgIC8qIEVuY29kZWQgZGF0YSBpcyBzaW1wbHkgdGhlIG5leHQgYml0IG9mIHRoZSB0d28ncy1jb21wbGVtZW50IERDIHZhbHVlICovCisgICAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgMSwgcmV0dXJuIEZBTFNFKTsKKyAgICBpZiAoR0VUX0JJVFMoMSkpCisgICAgICAoKmJsb2NrKVswXSB8PSBwMTsKKyAgICAvKiBOb3RlOiBzaW5jZSB3ZSB1c2UgfD0sIHJlcGVhdGluZyB0aGUgYXNzaWdubWVudCBsYXRlciBpcyBzYWZlICovCisgIH0KKworICAvKiBDb21wbGV0ZWQgTUNVLCBzbyB1cGRhdGUgc3RhdGUgKi8KKyAgQklUUkVBRF9TQVZFX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKKworICAvKiBBY2NvdW50IGZvciByZXN0YXJ0IGludGVydmFsIChuby1vcCBpZiBub3QgdXNpbmcgcmVzdGFydHMpICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIE1DVSBkZWNvZGluZyBmb3IgQUMgc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIHJlZmluZW1lbnQgc2Nhbi4KKyAqLworCitNRVRIT0RERUYoYm9vbGVhbikKK2RlY29kZV9tY3VfQUNfcmVmaW5lIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreyAgIAorICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgaW50IFNlID0gY2luZm8tPlNlOworICBpbnQgcDEgPSAxIDw8IGNpbmZvLT5BbDsJLyogMSBpbiB0aGUgYml0IHBvc2l0aW9uIGJlaW5nIGNvZGVkICovCisgIGludCBtMSA9ICgtMSkgPDwgY2luZm8tPkFsOwkvKiAtMSBpbiB0aGUgYml0IHBvc2l0aW9uIGJlaW5nIGNvZGVkICovCisgIHJlZ2lzdGVyIGludCBzLCBrLCByOworICB1bnNpZ25lZCBpbnQgRU9CUlVOOworICBKQkxPQ0tST1cgYmxvY2s7CisgIEpDT0VGUFRSIHRoaXNjb2VmOworICBCSVRSRUFEX1NUQVRFX1ZBUlM7CisgIGRfZGVyaXZlZF90YmwgKiB0Ymw7CisgIGludCBudW1fbmV3bno7CisgIGludCBuZXduel9wb3NbRENUU0laRTJdOworCisgIC8qIFByb2Nlc3MgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkOyBtYXkgaGF2ZSB0byBzdXNwZW5kICovCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgeworICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgaWYgKCEgcHJvY2Vzc19yZXN0YXJ0KGNpbmZvKSkKKwlyZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBJZiB3ZSd2ZSBydW4gb3V0IG9mIGRhdGEsIGRvbid0IG1vZGlmeSB0aGUgTUNVLgorICAgKi8KKyAgaWYgKCEgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhKSB7CisKKyAgICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUgKi8KKyAgICBCSVRSRUFEX0xPQURfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOworICAgIEVPQlJVTiA9IGVudHJvcHktPnNhdmVkLkVPQlJVTjsgLyogb25seSBwYXJ0IG9mIHNhdmVkIHN0YXRlIHdlIG5lZWQgKi8KKworICAgIC8qIFRoZXJlIGlzIGFsd2F5cyBvbmx5IG9uZSBibG9jayBwZXIgTUNVICovCisgICAgYmxvY2sgPSBNQ1VfZGF0YVswXTsKKyAgICB0YmwgPSBlbnRyb3B5LT5hY19kZXJpdmVkX3RibDsKKworICAgIC8qIElmIHdlIGFyZSBmb3JjZWQgdG8gc3VzcGVuZCwgd2UgbXVzdCB1bmRvIHRoZSBhc3NpZ25tZW50cyB0byBhbnkgbmV3bHkKKyAgICAgKiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgYmxvY2ssIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlJ2QgZ2V0IGNvbmZ1c2VkCisgICAgICogbmV4dCB0aW1lIGFib3V0IHdoaWNoIGNvZWZmaWNpZW50cyB3ZXJlIGFscmVhZHkgbm9uemVyby4KKyAgICAgKiBCdXQgd2UgbmVlZCBub3QgdW5kbyBhZGRpdGlvbiBvZiBiaXRzIHRvIGFscmVhZHktbm9uemVybyBjb2VmZmljaWVudHM7CisgICAgICogaW5zdGVhZCwgd2UgY2FuIHRlc3QgdGhlIGN1cnJlbnQgYml0IHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGRpZCBpdC4KKyAgICAgKi8KKyAgICBudW1fbmV3bnogPSAwOworCisgICAgLyogaW5pdGlhbGl6ZSBjb2VmZmljaWVudCBsb29wIGNvdW50ZXIgdG8gc3RhcnQgb2YgYmFuZCAqLworICAgIGsgPSBjaW5mby0+U3M7CisKKyAgICBpZiAoRU9CUlVOID09IDApIHsKKyAgICAgIGZvciAoOyBrIDw9IFNlOyBrKyspIHsKKwlIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgdGJsLCBnb3RvIHVuZG9pdCwgbGFiZWwzKTsKKwlyID0gcyA+PiA0OworCXMgJj0gMTU7CisJaWYgKHMpIHsKKwkgIGlmIChzICE9IDEpCQkvKiBzaXplIG9mIG5ldyBjb2VmIHNob3VsZCBhbHdheXMgYmUgMSAqLworCSAgICBXQVJOTVMoY2luZm8sIEpXUk5fSFVGRl9CQURfQ09ERSk7CisJICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCAxLCBnb3RvIHVuZG9pdCk7CisJICBpZiAoR0VUX0JJVFMoMSkpCisJICAgIHMgPSBwMTsJCS8qIG5ld2x5IG5vbnplcm8gY29lZiBpcyBwb3NpdGl2ZSAqLworCSAgZWxzZQorCSAgICBzID0gbTE7CQkvKiBuZXdseSBub256ZXJvIGNvZWYgaXMgbmVnYXRpdmUgKi8KKwl9IGVsc2UgeworCSAgaWYgKHIgIT0gMTUpIHsKKwkgICAgRU9CUlVOID0gMSA8PCByOwkvKiBFT0JyLCBydW4gbGVuZ3RoIGlzIDJeciArIGFwcGVuZGVkIGJpdHMgKi8KKwkgICAgaWYgKHIpIHsKKwkgICAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCByLCBnb3RvIHVuZG9pdCk7CisJICAgICAgciA9IEdFVF9CSVRTKHIpOworCSAgICAgIEVPQlJVTiArPSByOworCSAgICB9CisJICAgIGJyZWFrOwkJLyogcmVzdCBvZiBibG9jayBpcyBoYW5kbGVkIGJ5IEVPQiBsb2dpYyAqLworCSAgfQorCSAgLyogbm90ZSBzID0gMCBmb3IgcHJvY2Vzc2luZyBaUkwgKi8KKwl9CisJLyogQWR2YW5jZSBvdmVyIGFscmVhZHktbm9uemVybyBjb2VmcyBhbmQgciBzdGlsbC16ZXJvIGNvZWZzLAorCSAqIGFwcGVuZGluZyBjb3JyZWN0aW9uIGJpdHMgdG8gdGhlIG5vbnplcm9lcy4gIEEgY29ycmVjdGlvbiBiaXQgaXMgMQorCSAqIGlmIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgY29lZmZpY2llbnQgbXVzdCBiZSBpbmNyZWFzZWQuCisJICovCisJZG8geworCSAgdGhpc2NvZWYgPSAqYmxvY2sgKyBqcGVnX25hdHVyYWxfb3JkZXJba107CisJICBpZiAoKnRoaXNjb2VmICE9IDApIHsKKwkgICAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgMSwgZ290byB1bmRvaXQpOworCSAgICBpZiAoR0VUX0JJVFMoMSkpIHsKKwkgICAgICBpZiAoKCp0aGlzY29lZiAmIHAxKSA9PSAwKSB7IC8qIGRvIG5vdGhpbmcgaWYgYWxyZWFkeSBzZXQgaXQgKi8KKwkJaWYgKCp0aGlzY29lZiA+PSAwKQorCQkgICp0aGlzY29lZiArPSBwMTsKKwkJZWxzZQorCQkgICp0aGlzY29lZiArPSBtMTsKKwkgICAgICB9CisJICAgIH0KKwkgIH0gZWxzZSB7CisJICAgIGlmICgtLXIgPCAwKQorCSAgICAgIGJyZWFrOwkJLyogcmVhY2hlZCB0YXJnZXQgemVybyBjb2VmZmljaWVudCAqLworCSAgfQorCSAgaysrOworCX0gd2hpbGUgKGsgPD0gU2UpOworCWlmIChzKSB7CisJICBpbnQgcG9zID0ganBlZ19uYXR1cmFsX29yZGVyW2tdOworCSAgLyogT3V0cHV0IG5ld2x5IG5vbnplcm8gY29lZmZpY2llbnQgKi8KKwkgICgqYmxvY2spW3Bvc10gPSAoSkNPRUYpIHM7CisJICAvKiBSZW1lbWJlciBpdHMgcG9zaXRpb24gaW4gY2FzZSB3ZSBoYXZlIHRvIHN1c3BlbmQgKi8KKwkgIG5ld256X3Bvc1tudW1fbmV3bnorK10gPSBwb3M7CisJfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChFT0JSVU4gPiAwKSB7CisgICAgICAvKiBTY2FuIGFueSByZW1haW5pbmcgY29lZmZpY2llbnQgcG9zaXRpb25zIGFmdGVyIHRoZSBlbmQtb2YtYmFuZAorICAgICAgICogKHRoZSBsYXN0IG5ld2x5IG5vbnplcm8gY29lZmZpY2llbnQsIGlmIGFueSkuICBBcHBlbmQgYSBjb3JyZWN0aW9uCisgICAgICAgKiBiaXQgdG8gZWFjaCBhbHJlYWR5LW5vbnplcm8gY29lZmZpY2llbnQuICBBIGNvcnJlY3Rpb24gYml0IGlzIDEKKyAgICAgICAqIGlmIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgY29lZmZpY2llbnQgbXVzdCBiZSBpbmNyZWFzZWQuCisgICAgICAgKi8KKyAgICAgIGZvciAoOyBrIDw9IFNlOyBrKyspIHsKKwl0aGlzY29lZiA9ICpibG9jayArIGpwZWdfbmF0dXJhbF9vcmRlcltrXTsKKwlpZiAoKnRoaXNjb2VmICE9IDApIHsKKwkgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIDEsIGdvdG8gdW5kb2l0KTsKKwkgIGlmIChHRVRfQklUUygxKSkgeworCSAgICBpZiAoKCp0aGlzY29lZiAmIHAxKSA9PSAwKSB7IC8qIGRvIG5vdGhpbmcgaWYgYWxyZWFkeSBjaGFuZ2VkIGl0ICovCisJICAgICAgaWYgKCp0aGlzY29lZiA+PSAwKQorCQkqdGhpc2NvZWYgKz0gcDE7CisJICAgICAgZWxzZQorCQkqdGhpc2NvZWYgKz0gbTE7CisJICAgIH0KKwkgIH0KKwl9CisgICAgICB9CisgICAgICAvKiBDb3VudCBvbmUgYmxvY2sgY29tcGxldGVkIGluIEVPQiBydW4gKi8KKyAgICAgIEVPQlJVTi0tOworICAgIH0KKworICAgIC8qIENvbXBsZXRlZCBNQ1UsIHNvIHVwZGF0ZSBzdGF0ZSAqLworICAgIEJJVFJFQURfU0FWRV9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7CisgICAgZW50cm9weS0+c2F2ZWQuRU9CUlVOID0gRU9CUlVOOyAvKiBvbmx5IHBhcnQgb2Ygc2F2ZWQgc3RhdGUgd2UgbmVlZCAqLworICB9CisKKyAgLyogQWNjb3VudCBmb3IgcmVzdGFydCBpbnRlcnZhbCAobm8tb3AgaWYgbm90IHVzaW5nIHJlc3RhcnRzKSAqLworICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOworCisgIHJldHVybiBUUlVFOworCit1bmRvaXQ6CisgIC8qIFJlLXplcm8gYW55IG91dHB1dCBjb2VmZmljaWVudHMgdGhhdCB3ZSBtYWRlIG5ld2x5IG5vbnplcm8gKi8KKyAgd2hpbGUgKG51bV9uZXdueiA+IDApCisgICAgKCpibG9jaylbbmV3bnpfcG9zWy0tbnVtX25ld256XV0gPSAwOworCisgIHJldHVybiBGQUxTRTsKK30KKworCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIHByb2dyZXNzaXZlIEh1ZmZtYW4gZW50cm9weSBkZWNvZGluZy4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X3BodWZmX2RlY29kZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHk7CisgIGludCAqY29lZl9iaXRfcHRyOworICBpbnQgY2ksIGk7CisKKyAgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihwaHVmZl9lbnRyb3B5X2RlY29kZXIpKTsKKyAgY2luZm8tPmVudHJvcHkgPSAoc3RydWN0IGpwZWdfZW50cm9weV9kZWNvZGVyICopIGVudHJvcHk7CisgIGVudHJvcHktPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19waHVmZl9kZWNvZGVyOworCisgIC8qIE1hcmsgZGVyaXZlZCB0YWJsZXMgdW5hbGxvY2F0ZWQgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgeworICAgIGVudHJvcHktPmRlcml2ZWRfdGJsc1tpXSA9IE5VTEw7CisgIH0KKworICAvKiBDcmVhdGUgcHJvZ3Jlc3Npb24gc3RhdHVzIHRhYmxlICovCisgIGNpbmZvLT5jb2VmX2JpdHMgPSAoaW50ICgqKVtEQ1RTSVpFMl0pCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQljaW5mby0+bnVtX2NvbXBvbmVudHMqRENUU0laRTIqU0laRU9GKGludCkpOworICBjb2VmX2JpdF9wdHIgPSAmIGNpbmZvLT5jb2VmX2JpdHNbMF1bMF07CisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgCisgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspCisgICAgICAqY29lZl9iaXRfcHRyKysgPSAtMTsKK30KKworI2VuZGlmIC8qIERfUFJPR1JFU1NJVkVfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRwb3N0Y3QuYyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qZHBvc3RjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MTU2M2QKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRwb3N0Y3QuYwpAQCAtMCwwICsxLDI5MCBAQAorLyoKKyAqIGpkcG9zdGN0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjb21wcmVzc2lvbiBwb3N0cHJvY2Vzc2luZyBjb250cm9sbGVyLgorICogVGhpcyBjb250cm9sbGVyIG1hbmFnZXMgdGhlIHVwc2FtcGxpbmcsIGNvbG9yIGNvbnZlcnNpb24sIGFuZCBjb2xvcgorICogcXVhbnRpemF0aW9uL3JlZHVjdGlvbiBzdGVwczsgc3BlY2lmaWNhbGx5LCBpdCBjb250cm9scyB0aGUgYnVmZmVyaW5nCisgKiBiZXR3ZWVuIHVwc2FtcGxlL2NvbG9yIGNvbnZlcnNpb24gYW5kIGNvbG9yIHF1YW50aXphdGlvbi9yZWR1Y3Rpb24uCisgKgorICogSWYgbm8gY29sb3IgcXVhbnRpemF0aW9uL3JlZHVjdGlvbiBpcyByZXF1aXJlZCwgdGhlbiB0aGlzIG1vZHVsZSBoYXMgbm8KKyAqIHdvcmsgdG8gZG8sIGFuZCBpdCBqdXN0IGhhbmRzIG9mZiB0byB0aGUgdXBzYW1wbGUvY29sb3IgY29udmVyc2lvbiBjb2RlLgorICogQW4gaW50ZWdyYXRlZCB1cHNhbXBsZS9jb252ZXJ0L3F1YW50aXplIHByb2Nlc3Mgd291bGQgcmVwbGFjZSB0aGlzIG1vZHVsZQorICogZW50aXJlbHkuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIFByaXZhdGUgYnVmZmVyIGNvbnRyb2xsZXIgb2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfZF9wb3N0X2NvbnRyb2xsZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogQ29sb3IgcXVhbnRpemF0aW9uIHNvdXJjZSBidWZmZXI6IHRoaXMgaG9sZHMgb3V0cHV0IGRhdGEgZnJvbQorICAgKiB0aGUgdXBzYW1wbGUvY29sb3IgY29udmVyc2lvbiBzdGVwIHRvIGJlIHBhc3NlZCB0byB0aGUgcXVhbnRpemVyLgorICAgKiBGb3IgdHdvLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uLCB3ZSBuZWVkIGEgZnVsbC1pbWFnZSBidWZmZXI7CisgICAqIGZvciBvbmUtcGFzcyBvcGVyYXRpb24sIGEgc3RyaXAgYnVmZmVyIGlzIHN1ZmZpY2llbnQuCisgICAqLworICBqdmlydF9zYXJyYXlfcHRyIHdob2xlX2ltYWdlOwkvKiB2aXJ0dWFsIGFycmF5LCBvciBOVUxMIGlmIG9uZS1wYXNzICovCisgIEpTQU1QQVJSQVkgYnVmZmVyOwkJLyogc3RyaXAgYnVmZmVyLCBvciBjdXJyZW50IHN0cmlwIG9mIHZpcnR1YWwgKi8KKyAgSkRJTUVOU0lPTiBzdHJpcF9oZWlnaHQ7CS8qIGJ1ZmZlciBzaXplIGluIHJvd3MgKi8KKyAgLyogZm9yIHR3by1wYXNzIG1vZGUgb25seTogKi8KKyAgSkRJTUVOU0lPTiBzdGFydGluZ19yb3c7CS8qIHJvdyAjIG9mIGZpcnN0IHJvdyBpbiBjdXJyZW50IHN0cmlwICovCisgIEpESU1FTlNJT04gbmV4dF9yb3c7CQkvKiBpbmRleCBvZiBuZXh0IHJvdyB0byBmaWxsL2VtcHR5IGluIHN0cmlwICovCit9IG15X3Bvc3RfY29udHJvbGxlcjsKKwordHlwZWRlZiBteV9wb3N0X2NvbnRyb2xsZXIgKiBteV9wb3N0X3B0cjsKKworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworTUVUSE9EREVGKHZvaWQpIHBvc3RfcHJvY2Vzc18xcGFzcworCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAorCSAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCSAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKKwkgICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKKyNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKK01FVEhPRERFRih2b2lkKSBwb3N0X3Byb2Nlc3NfcHJlcGFzcworCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAorCSAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCSAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKKwkgICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKK01FVEhPRERFRih2b2lkKSBwb3N0X3Byb2Nlc3NfMnBhc3MKKwlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKKwkgICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKKwkgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJICAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7CisjZW5kaWYKKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBwcm9jZXNzaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX2Rwb3N0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkKK3sKKyAgbXlfcG9zdF9wdHIgcG9zdCA9IChteV9wb3N0X3B0cikgY2luZm8tPnBvc3Q7CisKKyAgc3dpdGNoIChwYXNzX21vZGUpIHsKKyAgY2FzZSBKQlVGX1BBU1NfVEhSVToKKyAgICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykgeworICAgICAgLyogU2luZ2xlLXBhc3MgcHJvY2Vzc2luZyB3aXRoIGNvbG9yIHF1YW50aXphdGlvbi4gKi8KKyAgICAgIHBvc3QtPnB1Yi5wb3N0X3Byb2Nlc3NfZGF0YSA9IHBvc3RfcHJvY2Vzc18xcGFzczsKKyAgICAgIC8qIFdlIGNvdWxkIGJlIGRvaW5nIGJ1ZmZlcmVkLWltYWdlIG91dHB1dCBiZWZvcmUgc3RhcnRpbmcgYSAyLXBhc3MKKyAgICAgICAqIGNvbG9yIHF1YW50aXphdGlvbjsgaW4gdGhhdCBjYXNlLCBqaW5pdF9kX3Bvc3RfY29udHJvbGxlciBkaWQgbm90CisgICAgICAgKiBhbGxvY2F0ZSBhIHN0cmlwIGJ1ZmZlci4gIFVzZSB0aGUgdmlydHVhbC1hcnJheSBidWZmZXIgYXMgd29ya3NwYWNlLgorICAgICAgICovCisgICAgICBpZiAocG9zdC0+YnVmZmVyID09IE5VTEwpIHsKKwlwb3N0LT5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKwkgICgoal9jb21tb25fcHRyKSBjaW5mbywgcG9zdC0+d2hvbGVfaW1hZ2UsCisJICAgKEpESU1FTlNJT04pIDAsIHBvc3QtPnN0cmlwX2hlaWdodCwgVFJVRSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEZvciBzaW5nbGUtcGFzcyBwcm9jZXNzaW5nIHdpdGhvdXQgY29sb3IgcXVhbnRpemF0aW9uLAorICAgICAgICogSSBoYXZlIG5vIHdvcmsgdG8gZG87IGp1c3QgY2FsbCB0aGUgdXBzYW1wbGVyIGRpcmVjdGx5LgorICAgICAgICovCisgICAgICBwb3N0LT5wdWIucG9zdF9wcm9jZXNzX2RhdGEgPSBjaW5mby0+dXBzYW1wbGUtPnVwc2FtcGxlOworICAgIH0KKyAgICBicmVhazsKKyNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKKyAgY2FzZSBKQlVGX1NBVkVfQU5EX1BBU1M6CisgICAgLyogRmlyc3QgcGFzcyBvZiAyLXBhc3MgcXVhbnRpemF0aW9uICovCisgICAgaWYgKHBvc3QtPndob2xlX2ltYWdlID09IE5VTEwpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisgICAgcG9zdC0+cHViLnBvc3RfcHJvY2Vzc19kYXRhID0gcG9zdF9wcm9jZXNzX3ByZXBhc3M7CisgICAgYnJlYWs7CisgIGNhc2UgSkJVRl9DUkFOS19ERVNUOgorICAgIC8qIFNlY29uZCBwYXNzIG9mIDItcGFzcyBxdWFudGl6YXRpb24gKi8KKyAgICBpZiAocG9zdC0+d2hvbGVfaW1hZ2UgPT0gTlVMTCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyAgICBwb3N0LT5wdWIucG9zdF9wcm9jZXNzX2RhdGEgPSBwb3N0X3Byb2Nlc3NfMnBhc3M7CisgICAgYnJlYWs7CisjZW5kaWYgLyogUVVBTlRfMlBBU1NfU1VQUE9SVEVEICovCisgIGRlZmF1bHQ6CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOworICAgIGJyZWFrOworICB9CisgIHBvc3QtPnN0YXJ0aW5nX3JvdyA9IHBvc3QtPm5leHRfcm93ID0gMDsKK30KKworCisvKgorICogUHJvY2VzcyBzb21lIGRhdGEgaW4gdGhlIG9uZS1wYXNzIChzdHJpcCBidWZmZXIpIGNhc2UuCisgKiBUaGlzIGlzIHVzZWQgZm9yIGNvbG9yIHByZWNpc2lvbiByZWR1Y3Rpb24gYXMgd2VsbCBhcyBvbmUtcGFzcyBxdWFudGl6YXRpb24uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwb3N0X3Byb2Nlc3NfMXBhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCSAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKKwkJICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKKwkJICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJCSAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQoreworICBteV9wb3N0X3B0ciBwb3N0ID0gKG15X3Bvc3RfcHRyKSBjaW5mby0+cG9zdDsKKyAgSkRJTUVOU0lPTiBudW1fcm93cywgbWF4X3Jvd3M7CisKKyAgLyogRmlsbCB0aGUgYnVmZmVyLCBidXQgbm90IG1vcmUgdGhhbiB3aGF0IHdlIGNhbiBkdW1wIG91dCBpbiBvbmUgZ28uICovCisgIC8qIE5vdGUgd2UgcmVseSBvbiB0aGUgdXBzYW1wbGVyIHRvIGRldGVjdCBib3R0b20gb2YgaW1hZ2UuICovCisgIG1heF9yb3dzID0gb3V0X3Jvd3NfYXZhaWwgLSAqb3V0X3Jvd19jdHI7CisgIGlmIChtYXhfcm93cyA+IHBvc3QtPnN0cmlwX2hlaWdodCkKKyAgICBtYXhfcm93cyA9IHBvc3QtPnN0cmlwX2hlaWdodDsKKyAgbnVtX3Jvd3MgPSAwOworICAoKmNpbmZvLT51cHNhbXBsZS0+dXBzYW1wbGUpIChjaW5mbywKKwkJaW5wdXRfYnVmLCBpbl9yb3dfZ3JvdXBfY3RyLCBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCQlwb3N0LT5idWZmZXIsICZudW1fcm93cywgbWF4X3Jvd3MpOworICAvKiBRdWFudGl6ZSBhbmQgZW1pdCBkYXRhLiAqLworICAoKmNpbmZvLT5jcXVhbnRpemUtPmNvbG9yX3F1YW50aXplKSAoY2luZm8sCisJCXBvc3QtPmJ1ZmZlciwgb3V0cHV0X2J1ZiArICpvdXRfcm93X2N0ciwgKGludCkgbnVtX3Jvd3MpOworICAqb3V0X3Jvd19jdHIgKz0gbnVtX3Jvd3M7Cit9CisKKworI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAorCisvKgorICogUHJvY2VzcyBzb21lIGRhdGEgaW4gdGhlIGZpcnN0IHBhc3Mgb2YgMi1wYXNzIHF1YW50aXphdGlvbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3Bvc3RfcHJvY2Vzc19wcmVwYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKKwkJICAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCQkgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAorCQkgICAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQoreworICBteV9wb3N0X3B0ciBwb3N0ID0gKG15X3Bvc3RfcHRyKSBjaW5mby0+cG9zdDsKKyAgSkRJTUVOU0lPTiBvbGRfbmV4dF9yb3csIG51bV9yb3dzOworCisgIC8qIFJlcG9zaXRpb24gdmlydHVhbCBidWZmZXIgaWYgYXQgc3RhcnQgb2Ygc3RyaXAuICovCisgIGlmIChwb3N0LT5uZXh0X3JvdyA9PSAwKSB7CisgICAgcG9zdC0+YnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBwb3N0LT53aG9sZV9pbWFnZSwKKwkgcG9zdC0+c3RhcnRpbmdfcm93LCBwb3N0LT5zdHJpcF9oZWlnaHQsIFRSVUUpOworICB9CisKKyAgLyogVXBzYW1wbGUgc29tZSBkYXRhICh1cCB0byBhIHN0cmlwIGhlaWdodCdzIHdvcnRoKS4gKi8KKyAgb2xkX25leHRfcm93ID0gcG9zdC0+bmV4dF9yb3c7CisgICgqY2luZm8tPnVwc2FtcGxlLT51cHNhbXBsZSkgKGNpbmZvLAorCQlpbnB1dF9idWYsIGluX3Jvd19ncm91cF9jdHIsIGluX3Jvd19ncm91cHNfYXZhaWwsCisJCXBvc3QtPmJ1ZmZlciwgJnBvc3QtPm5leHRfcm93LCBwb3N0LT5zdHJpcF9oZWlnaHQpOworCisgIC8qIEFsbG93IHF1YW50aXplciB0byBzY2FuIG5ldyBkYXRhLiAgTm8gZGF0YSBpcyBlbWl0dGVkLCAqLworICAvKiBidXQgd2UgYWR2YW5jZSBvdXRfcm93X2N0ciBzbyBvdXRlciBsb29wIGNhbiB0ZWxsIHdoZW4gd2UncmUgZG9uZS4gKi8KKyAgaWYgKHBvc3QtPm5leHRfcm93ID4gb2xkX25leHRfcm93KSB7CisgICAgbnVtX3Jvd3MgPSBwb3N0LT5uZXh0X3JvdyAtIG9sZF9uZXh0X3JvdzsKKyAgICAoKmNpbmZvLT5jcXVhbnRpemUtPmNvbG9yX3F1YW50aXplKSAoY2luZm8sIHBvc3QtPmJ1ZmZlciArIG9sZF9uZXh0X3JvdywKKwkJCQkJIChKU0FNUEFSUkFZKSBOVUxMLCAoaW50KSBudW1fcm93cyk7CisgICAgKm91dF9yb3dfY3RyICs9IG51bV9yb3dzOworICB9CisKKyAgLyogQWR2YW5jZSBpZiB3ZSBmaWxsZWQgdGhlIHN0cmlwLiAqLworICBpZiAocG9zdC0+bmV4dF9yb3cgPj0gcG9zdC0+c3RyaXBfaGVpZ2h0KSB7CisgICAgcG9zdC0+c3RhcnRpbmdfcm93ICs9IHBvc3QtPnN0cmlwX2hlaWdodDsKKyAgICBwb3N0LT5uZXh0X3JvdyA9IDA7CisgIH0KK30KKworCisvKgorICogUHJvY2VzcyBzb21lIGRhdGEgaW4gdGhlIHNlY29uZCBwYXNzIG9mIDItcGFzcyBxdWFudGl6YXRpb24uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwb3N0X3Byb2Nlc3NfMnBhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCSAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKKwkJICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKKwkJICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJCSAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQoreworICBteV9wb3N0X3B0ciBwb3N0ID0gKG15X3Bvc3RfcHRyKSBjaW5mby0+cG9zdDsKKyAgSkRJTUVOU0lPTiBudW1fcm93cywgbWF4X3Jvd3M7CisKKyAgLyogUmVwb3NpdGlvbiB2aXJ0dWFsIGJ1ZmZlciBpZiBhdCBzdGFydCBvZiBzdHJpcC4gKi8KKyAgaWYgKHBvc3QtPm5leHRfcm93ID09IDApIHsKKyAgICBwb3N0LT5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgY2luZm8sIHBvc3QtPndob2xlX2ltYWdlLAorCSBwb3N0LT5zdGFydGluZ19yb3csIHBvc3QtPnN0cmlwX2hlaWdodCwgRkFMU0UpOworICB9CisKKyAgLyogRGV0ZXJtaW5lIG51bWJlciBvZiByb3dzIHRvIGVtaXQuICovCisgIG51bV9yb3dzID0gcG9zdC0+c3RyaXBfaGVpZ2h0IC0gcG9zdC0+bmV4dF9yb3c7IC8qIGF2YWlsYWJsZSBpbiBzdHJpcCAqLworICBtYXhfcm93cyA9IG91dF9yb3dzX2F2YWlsIC0gKm91dF9yb3dfY3RyOyAvKiBhdmFpbGFibGUgaW4gb3V0cHV0IGFyZWEgKi8KKyAgaWYgKG51bV9yb3dzID4gbWF4X3Jvd3MpCisgICAgbnVtX3Jvd3MgPSBtYXhfcm93czsKKyAgLyogV2UgaGF2ZSB0byBjaGVjayBib3R0b20gb2YgaW1hZ2UgaGVyZSwgY2FuJ3QgZGVwZW5kIG9uIHVwc2FtcGxlci4gKi8KKyAgbWF4X3Jvd3MgPSBjaW5mby0+b3V0cHV0X2hlaWdodCAtIHBvc3QtPnN0YXJ0aW5nX3JvdzsKKyAgaWYgKG51bV9yb3dzID4gbWF4X3Jvd3MpCisgICAgbnVtX3Jvd3MgPSBtYXhfcm93czsKKworICAvKiBRdWFudGl6ZSBhbmQgZW1pdCBkYXRhLiAqLworICAoKmNpbmZvLT5jcXVhbnRpemUtPmNvbG9yX3F1YW50aXplKSAoY2luZm8sCisJCXBvc3QtPmJ1ZmZlciArIHBvc3QtPm5leHRfcm93LCBvdXRwdXRfYnVmICsgKm91dF9yb3dfY3RyLAorCQkoaW50KSBudW1fcm93cyk7CisgICpvdXRfcm93X2N0ciArPSBudW1fcm93czsKKworICAvKiBBZHZhbmNlIGlmIHdlIGZpbGxlZCB0aGUgc3RyaXAuICovCisgIHBvc3QtPm5leHRfcm93ICs9IG51bV9yb3dzOworICBpZiAocG9zdC0+bmV4dF9yb3cgPj0gcG9zdC0+c3RyaXBfaGVpZ2h0KSB7CisgICAgcG9zdC0+c3RhcnRpbmdfcm93ICs9IHBvc3QtPnN0cmlwX2hlaWdodDsKKyAgICBwb3N0LT5uZXh0X3JvdyA9IDA7CisgIH0KK30KKworI2VuZGlmIC8qIFFVQU5UXzJQQVNTX1NVUFBPUlRFRCAqLworCisKKy8qCisgKiBJbml0aWFsaXplIHBvc3Rwcm9jZXNzaW5nIGNvbnRyb2xsZXIuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9kX3Bvc3RfY29udHJvbGxlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKQoreworICBteV9wb3N0X3B0ciBwb3N0OworCisgIHBvc3QgPSAobXlfcG9zdF9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YobXlfcG9zdF9jb250cm9sbGVyKSk7CisgIGNpbmZvLT5wb3N0ID0gKHN0cnVjdCBqcGVnX2RfcG9zdF9jb250cm9sbGVyICopIHBvc3Q7CisgIHBvc3QtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19kcG9zdDsKKyAgcG9zdC0+d2hvbGVfaW1hZ2UgPSBOVUxMOwkvKiBmbGFnIGZvciBubyB2aXJ0dWFsIGFycmF5cyAqLworICBwb3N0LT5idWZmZXIgPSBOVUxMOwkJLyogZmxhZyBmb3Igbm8gc3RyaXAgYnVmZmVyICovCisKKyAgLyogQ3JlYXRlIHRoZSBxdWFudGl6YXRpb24gYnVmZmVyLCBpZiBuZWVkZWQgKi8KKyAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpIHsKKyAgICAvKiBUaGUgYnVmZmVyIHN0cmlwIGhlaWdodCBpcyBtYXhfdl9zYW1wX2ZhY3Rvciwgd2hpY2ggaXMgdHlwaWNhbGx5CisgICAgICogYW4gZWZmaWNpZW50IG51bWJlciBvZiByb3dzIGZvciB1cHNhbXBsaW5nIHRvIHJldHVybi4KKyAgICAgKiAoSW4gdGhlIHByZXNlbmNlIG9mIG91dHB1dCByZXNjYWxpbmcsIHdlIG1pZ2h0IHdhbnQgdG8gYmUgc21hcnRlcj8pCisgICAgICovCisgICAgcG9zdC0+c3RyaXBfaGVpZ2h0ID0gKEpESU1FTlNJT04pIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKKyAgICBpZiAobmVlZF9mdWxsX2J1ZmZlcikgeworICAgICAgLyogVHdvLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uOiBuZWVkIGZ1bGwtaW1hZ2Ugc3RvcmFnZS4gKi8KKyAgICAgIC8qIFdlIHJvdW5kIHVwIHRoZSBudW1iZXIgb2Ygcm93cyB0byBhIG11bHRpcGxlIG9mIHRoZSBzdHJpcCBoZWlnaHQuICovCisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECisgICAgICBwb3N0LT53aG9sZV9pbWFnZSA9ICgqY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X3NhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBGQUxTRSwKKwkgY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cywKKwkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY2luZm8tPm91dHB1dF9oZWlnaHQsCisJCQkJKGxvbmcpIHBvc3QtPnN0cmlwX2hlaWdodCksCisJIHBvc3QtPnN0cmlwX2hlaWdodCk7CisjZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOworI2VuZGlmIC8qIFFVQU5UXzJQQVNTX1NVUFBPUlRFRCAqLworICAgIH0gZWxzZSB7CisgICAgICAvKiBPbmUtcGFzcyBjb2xvciBxdWFudGl6YXRpb246IGp1c3QgbWFrZSBhIHN0cmlwIGJ1ZmZlci4gKi8KKyAgICAgIHBvc3QtPmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQorCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJIGNpbmZvLT5vdXRwdXRfd2lkdGggKiBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMsCisJIHBvc3QtPnN0cmlwX2hlaWdodCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRzYW1wbGUuYyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qZHNhbXBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZmZlZmIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRzYW1wbGUuYwpAQCAtMCwwICsxLDQ3OCBAQAorLyoKKyAqIGpkc2FtcGxlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB1cHNhbXBsaW5nIHJvdXRpbmVzLgorICoKKyAqIFVwc2FtcGxpbmcgaW5wdXQgZGF0YSBpcyBjb3VudGVkIGluICJyb3cgZ3JvdXBzIi4gIEEgcm93IGdyb3VwCisgKiBpcyBkZWZpbmVkIHRvIGJlICh2X3NhbXBfZmFjdG9yICogRENUX3NjYWxlZF9zaXplIC8gbWluX0RDVF9zY2FsZWRfc2l6ZSkKKyAqIHNhbXBsZSByb3dzIG9mIGVhY2ggY29tcG9uZW50LiAgVXBzYW1wbGluZyB3aWxsIG5vcm1hbGx5IHByb2R1Y2UKKyAqIG1heF92X3NhbXBfZmFjdG9yIHBpeGVsIHJvd3MgZnJvbSBlYWNoIHJvdyBncm91cCAoYnV0IHRoaXMgY291bGQgdmFyeQorICogaWYgdGhlIHVwc2FtcGxlciBpcyBhcHBseWluZyBhIHNjYWxlIGZhY3RvciBvZiBpdHMgb3duKS4KKyAqCisgKiBBbiBleGNlbGxlbnQgcmVmZXJlbmNlIGZvciBpbWFnZSByZXNhbXBsaW5nIGlzCisgKiAgIERpZ2l0YWwgSW1hZ2UgV2FycGluZywgR2VvcmdlIFdvbGJlcmcsIDE5OTAuCisgKiAgIFB1Yi4gYnkgSUVFRSBDb21wdXRlciBTb2NpZXR5IFByZXNzLCBMb3MgQWxhbWl0b3MsIENBLiBJU0JOIDAtODE4Ni04OTQ0LTcuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIFBvaW50ZXIgdG8gcm91dGluZSB0byB1cHNhbXBsZSBhIHNpbmdsZSBjb21wb25lbnQgKi8KK3R5cGVkZWYgSk1FVEhPRCh2b2lkLCB1cHNhbXBsZTFfcHRyLAorCQkoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpKTsKKworLyogUHJpdmF0ZSBzdWJvYmplY3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ191cHNhbXBsZXIgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogQ29sb3IgY29udmVyc2lvbiBidWZmZXIuICBXaGVuIHVzaW5nIHNlcGFyYXRlIHVwc2FtcGxpbmcgYW5kIGNvbG9yCisgICAqIGNvbnZlcnNpb24gc3RlcHMsIHRoaXMgYnVmZmVyIGhvbGRzIG9uZSB1cHNhbXBsZWQgcm93IGdyb3VwIHVudGlsIGl0CisgICAqIGhhcyBiZWVuIGNvbG9yIGNvbnZlcnRlZCBhbmQgb3V0cHV0LgorICAgKiBOb3RlOiB3ZSBkbyBub3QgYWxsb2NhdGUgYW55IHN0b3JhZ2UgZm9yIGNvbXBvbmVudChzKSB3aGljaCBhcmUgZnVsbC1zaXplLAorICAgKiBpZSBkbyBub3QgbmVlZCByZXNjYWxpbmcuICBUaGUgY29ycmVzcG9uZGluZyBlbnRyeSBvZiBjb2xvcl9idWZbXSBpcworICAgKiBzaW1wbHkgc2V0IHRvIHBvaW50IHRvIHRoZSBpbnB1dCBkYXRhIGFycmF5LCB0aGVyZWJ5IGF2b2lkaW5nIGNvcHlpbmcuCisgICAqLworICBKU0FNUEFSUkFZIGNvbG9yX2J1ZltNQVhfQ09NUE9ORU5UU107CisKKyAgLyogUGVyLWNvbXBvbmVudCB1cHNhbXBsaW5nIG1ldGhvZCBwb2ludGVycyAqLworICB1cHNhbXBsZTFfcHRyIG1ldGhvZHNbTUFYX0NPTVBPTkVOVFNdOworCisgIGludCBuZXh0X3Jvd19vdXQ7CQkvKiBjb3VudHMgcm93cyBlbWl0dGVkIGZyb20gY29sb3JfYnVmICovCisgIEpESU1FTlNJT04gcm93c190b19nbzsJLyogY291bnRzIHJvd3MgcmVtYWluaW5nIGluIGltYWdlICovCisKKyAgLyogSGVpZ2h0IG9mIGFuIGlucHV0IHJvdyBncm91cCBmb3IgZWFjaCBjb21wb25lbnQuICovCisgIGludCByb3dncm91cF9oZWlnaHRbTUFYX0NPTVBPTkVOVFNdOworCisgIC8qIFRoZXNlIGFycmF5cyBzYXZlIHBpeGVsIGV4cGFuc2lvbiBmYWN0b3JzIHNvIHRoYXQgaW50X2V4cGFuZCBuZWVkIG5vdAorICAgKiByZWNvbXB1dGUgdGhlbSBlYWNoIHRpbWUuICBUaGV5IGFyZSB1bnVzZWQgZm9yIG90aGVyIHVwc2FtcGxpbmcgbWV0aG9kcy4KKyAgICovCisgIFVJTlQ4IGhfZXhwYW5kW01BWF9DT01QT05FTlRTXTsKKyAgVUlOVDggdl9leHBhbmRbTUFYX0NPTVBPTkVOVFNdOworfSBteV91cHNhbXBsZXI7CisKK3R5cGVkZWYgbXlfdXBzYW1wbGVyICogbXlfdXBzYW1wbGVfcHRyOworCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhbiB1cHNhbXBsaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7CisKKyAgLyogTWFyayB0aGUgY29udmVyc2lvbiBidWZmZXIgZW1wdHkgKi8KKyAgdXBzYW1wbGUtPm5leHRfcm93X291dCA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKKyAgLyogSW5pdGlhbGl6ZSB0b3RhbC1oZWlnaHQgY291bnRlciBmb3IgZGV0ZWN0aW5nIGJvdHRvbSBvZiBpbWFnZSAqLworICB1cHNhbXBsZS0+cm93c190b19nbyA9IGNpbmZvLT5vdXRwdXRfaGVpZ2h0OworfQorCisKKy8qCisgKiBDb250cm9sIHJvdXRpbmUgdG8gZG8gdXBzYW1wbGluZyAoYW5kIGNvbG9yIGNvbnZlcnNpb24pLgorICoKKyAqIEluIHRoaXMgdmVyc2lvbiB3ZSB1cHNhbXBsZSBlYWNoIGNvbXBvbmVudCBpbmRlcGVuZGVudGx5LgorICogV2UgdXBzYW1wbGUgb25lIHJvdyBncm91cCBpbnRvIHRoZSBjb252ZXJzaW9uIGJ1ZmZlciwgdGhlbiBhcHBseQorICogY29sb3IgY29udmVyc2lvbiBhIHJvdyBhdCBhIHRpbWUuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzZXBfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCisJICAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCSAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJICAgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkKK3sKKyAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOworICBpbnQgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworICBKRElNRU5TSU9OIG51bV9yb3dzOworCisgIC8qIEZpbGwgdGhlIGNvbnZlcnNpb24gYnVmZmVyLCBpZiBpdCdzIGVtcHR5ICovCisgIGlmICh1cHNhbXBsZS0+bmV4dF9yb3dfb3V0ID49IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgeworICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisJIGNpKyssIGNvbXBwdHIrKykgeworICAgICAgLyogSW52b2tlIHBlci1jb21wb25lbnQgdXBzYW1wbGUgbWV0aG9kLiAgTm90aWNlIHdlIHBhc3MgYSBQT0lOVEVSCisgICAgICAgKiB0byBjb2xvcl9idWZbY2ldLCBzbyB0aGF0IGZ1bGxzaXplX3Vwc2FtcGxlIGNhbiBjaGFuZ2UgaXQuCisgICAgICAgKi8KKyAgICAgICgqdXBzYW1wbGUtPm1ldGhvZHNbY2ldKSAoY2luZm8sIGNvbXBwdHIsCisJaW5wdXRfYnVmW2NpXSArICgqaW5fcm93X2dyb3VwX2N0ciAqIHVwc2FtcGxlLT5yb3dncm91cF9oZWlnaHRbY2ldKSwKKwl1cHNhbXBsZS0+Y29sb3JfYnVmICsgY2kpOworICAgIH0KKyAgICB1cHNhbXBsZS0+bmV4dF9yb3dfb3V0ID0gMDsKKyAgfQorCisgIC8qIENvbG9yLWNvbnZlcnQgYW5kIGVtaXQgcm93cyAqLworCisgIC8qIEhvdyBtYW55IHdlIGhhdmUgaW4gdGhlIGJ1ZmZlcjogKi8KKyAgbnVtX3Jvd3MgPSAoSkRJTUVOU0lPTikgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAtIHVwc2FtcGxlLT5uZXh0X3Jvd19vdXQpOworICAvKiBOb3QgbW9yZSB0aGFuIHRoZSBkaXN0YW5jZSB0byB0aGUgZW5kIG9mIHRoZSBpbWFnZS4gIE5lZWQgdGhpcyB0ZXN0CisgICAqIGluIGNhc2UgdGhlIGltYWdlIGhlaWdodCBpcyBub3QgYSBtdWx0aXBsZSBvZiBtYXhfdl9zYW1wX2ZhY3RvcjoKKyAgICovCisgIGlmIChudW1fcm93cyA+IHVwc2FtcGxlLT5yb3dzX3RvX2dvKSAKKyAgICBudW1fcm93cyA9IHVwc2FtcGxlLT5yb3dzX3RvX2dvOworICAvKiBBbmQgbm90IG1vcmUgdGhhbiB3aGF0IHRoZSBjbGllbnQgY2FuIGFjY2VwdDogKi8KKyAgb3V0X3Jvd3NfYXZhaWwgLT0gKm91dF9yb3dfY3RyOworICBpZiAobnVtX3Jvd3MgPiBvdXRfcm93c19hdmFpbCkKKyAgICBudW1fcm93cyA9IG91dF9yb3dzX2F2YWlsOworCisgICgqY2luZm8tPmNjb252ZXJ0LT5jb2xvcl9jb252ZXJ0KSAoY2luZm8sIHVwc2FtcGxlLT5jb2xvcl9idWYsCisJCQkJICAgICAoSkRJTUVOU0lPTikgdXBzYW1wbGUtPm5leHRfcm93X291dCwKKwkJCQkgICAgIG91dHB1dF9idWYgKyAqb3V0X3Jvd19jdHIsCisJCQkJICAgICAoaW50KSBudW1fcm93cyk7CisKKyAgLyogQWRqdXN0IGNvdW50cyAqLworICAqb3V0X3Jvd19jdHIgKz0gbnVtX3Jvd3M7CisgIHVwc2FtcGxlLT5yb3dzX3RvX2dvIC09IG51bV9yb3dzOworICB1cHNhbXBsZS0+bmV4dF9yb3dfb3V0ICs9IG51bV9yb3dzOworICAvKiBXaGVuIHRoZSBidWZmZXIgaXMgZW1wdGllZCwgZGVjbGFyZSB0aGlzIGlucHV0IHJvdyBncm91cCBjb25zdW1lZCAqLworICBpZiAodXBzYW1wbGUtPm5leHRfcm93X291dCA+PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpCisgICAgKCppbl9yb3dfZ3JvdXBfY3RyKSsrOworfQorCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIHJvdXRpbmVzIGludm9rZWQgYnkgc2VwX3Vwc2FtcGxlIHRvIHVwc2FtcGxlIHBpeGVsIHZhbHVlcworICogb2YgYSBzaW5nbGUgY29tcG9uZW50LiAgT25lIHJvdyBncm91cCBpcyBwcm9jZXNzZWQgcGVyIGNhbGwuCisgKi8KKworCisvKgorICogRm9yIGZ1bGwtc2l6ZSBjb21wb25lbnRzLCB3ZSBqdXN0IG1ha2UgY29sb3JfYnVmW2NpXSBwb2ludCBhdCB0aGUKKyAqIGlucHV0IGJ1ZmZlciwgYW5kIHRodXMgYXZvaWQgY29weWluZyBhbnkgZGF0YS4gIE5vdGUgdGhhdCB0aGlzIGlzCisgKiBzYWZlIG9ubHkgYmVjYXVzZSBzZXBfdXBzYW1wbGUgZG9lc24ndCBkZWNsYXJlIHRoZSBpbnB1dCByb3cgZ3JvdXAKKyAqICJjb25zdW1lZCIgdW50aWwgd2UgYXJlIGRvbmUgY29sb3IgY29udmVydGluZyBhbmQgZW1pdHRpbmcgaXQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmdWxsc2l6ZV91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikKK3sKKyAgKm91dHB1dF9kYXRhX3B0ciA9IGlucHV0X2RhdGE7Cit9CisKKworLyoKKyAqIFRoaXMgaXMgYSBuby1vcCB2ZXJzaW9uIHVzZWQgZm9yICJ1bmludGVyZXN0aW5nIiBjb21wb25lbnRzLgorICogVGhlc2UgY29tcG9uZW50cyB3aWxsIG5vdCBiZSByZWZlcmVuY2VkIGJ5IGNvbG9yIGNvbnZlcnNpb24uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitub29wX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQoreworICAqb3V0cHV0X2RhdGFfcHRyID0gTlVMTDsJLyogc2FmZXR5IGNoZWNrICovCit9CisKKworLyoKKyAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIGFueSBpbnRlZ3JhbCBzYW1wbGluZyByYXRpb3MuCisgKiBUaGlzIGlzIG5vdCB1c2VkIGZvciB0eXBpY2FsIEpQRUcgZmlsZXMsIHNvIGl0IG5lZWQgbm90IGJlIGZhc3QuCisgKiBOb3IsIGZvciB0aGF0IG1hdHRlciwgaXMgaXQgcGFydGljdWxhcmx5IGFjY3VyYXRlOiB0aGUgYWxnb3JpdGhtIGlzCisgKiBzaW1wbGUgcmVwbGljYXRpb24gb2YgdGhlIGlucHV0IHBpeGVsIG9udG8gdGhlIGNvcnJlc3BvbmRpbmcgb3V0cHV0CisgKiBwaXhlbHMuICBUaGUgaGktZmFsdXRpbiBzYW1wbGluZyBsaXRlcmF0dXJlIHJlZmVycyB0byB0aGlzIGFzIGEKKyAqICJib3ggZmlsdGVyIi4gIEEgYm94IGZpbHRlciB0ZW5kcyB0byBpbnRyb2R1Y2UgdmlzaWJsZSBhcnRpZmFjdHMsCisgKiBzbyBpZiB5b3UgYXJlIGFjdHVhbGx5IGdvaW5nIHRvIHVzZSAzOjEgb3IgNDoxIHNhbXBsaW5nIHJhdGlvcworICogeW91IHdvdWxkIGJlIHdlbGwgYWR2aXNlZCB0byBpbXByb3ZlIHRoaXMgY29kZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ludF91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQoreworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7CisgIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEgPSAqb3V0cHV0X2RhdGFfcHRyOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOworICByZWdpc3RlciBKU0FNUExFIGludmFsdWU7CisgIHJlZ2lzdGVyIGludCBoOworICBKU0FNUFJPVyBvdXRlbmQ7CisgIGludCBoX2V4cGFuZCwgdl9leHBhbmQ7CisgIGludCBpbnJvdywgb3V0cm93OworCisgIGhfZXhwYW5kID0gdXBzYW1wbGUtPmhfZXhwYW5kW2NvbXBwdHItPmNvbXBvbmVudF9pbmRleF07CisgIHZfZXhwYW5kID0gdXBzYW1wbGUtPnZfZXhwYW5kW2NvbXBwdHItPmNvbXBvbmVudF9pbmRleF07CisKKyAgaW5yb3cgPSBvdXRyb3cgPSAwOworICB3aGlsZSAob3V0cm93IDwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7CisgICAgLyogR2VuZXJhdGUgb25lIG91dHB1dCByb3cgd2l0aCBwcm9wZXIgaG9yaXpvbnRhbCBleHBhbnNpb24gKi8KKyAgICBpbnB0ciA9IGlucHV0X2RhdGFbaW5yb3ddOworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107CisgICAgb3V0ZW5kID0gb3V0cHRyICsgY2luZm8tPm91dHB1dF93aWR0aDsKKyAgICB3aGlsZSAob3V0cHRyIDwgb3V0ZW5kKSB7CisgICAgICBpbnZhbHVlID0gKmlucHRyKys7CS8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSgpIGhlcmUgKi8KKyAgICAgIGZvciAoaCA9IGhfZXhwYW5kOyBoID4gMDsgaC0tKSB7CisJKm91dHB0cisrID0gaW52YWx1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogR2VuZXJhdGUgYW55IGFkZGl0aW9uYWwgb3V0cHV0IHJvd3MgYnkgZHVwbGljYXRpbmcgdGhlIGZpcnN0IG9uZSAqLworICAgIGlmICh2X2V4cGFuZCA+IDEpIHsKKyAgICAgIGpjb3B5X3NhbXBsZV9yb3dzKG91dHB1dF9kYXRhLCBvdXRyb3csIG91dHB1dF9kYXRhLCBvdXRyb3crMSwKKwkJCXZfZXhwYW5kLTEsIGNpbmZvLT5vdXRwdXRfd2lkdGgpOworICAgIH0KKyAgICBpbnJvdysrOworICAgIG91dHJvdyArPSB2X2V4cGFuZDsKKyAgfQorfQorCisKKy8qCisgKiBGYXN0IHByb2Nlc3NpbmcgZm9yIHRoZSBjb21tb24gY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMToxIHZlcnRpY2FsLgorICogSXQncyBzdGlsbCBhIGJveCBmaWx0ZXIuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitoMnYxX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQoreworICBKU0FNUEFSUkFZIG91dHB1dF9kYXRhID0gKm91dHB1dF9kYXRhX3B0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBMRSBpbnZhbHVlOworICBKU0FNUFJPVyBvdXRlbmQ7CisgIGludCBpbnJvdzsKKworICBmb3IgKGlucm93ID0gMDsgaW5yb3cgPCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7IGlucm93KyspIHsKKyAgICBpbnB0ciA9IGlucHV0X2RhdGFbaW5yb3ddOworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW2lucm93XTsKKyAgICBvdXRlbmQgPSBvdXRwdHIgKyBjaW5mby0+b3V0cHV0X3dpZHRoOworICAgIHdoaWxlIChvdXRwdHIgPCBvdXRlbmQpIHsKKyAgICAgIGludmFsdWUgPSAqaW5wdHIrKzsJLyogZG9uJ3QgbmVlZCBHRVRKU0FNUExFKCkgaGVyZSAqLworICAgICAgKm91dHB0cisrID0gaW52YWx1ZTsKKyAgICAgICpvdXRwdHIrKyA9IGludmFsdWU7CisgICAgfQorICB9Cit9CisKKworLyoKKyAqIEZhc3QgcHJvY2Vzc2luZyBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAyOjEgdmVydGljYWwuCisgKiBJdCdzIHN0aWxsIGEgYm94IGZpbHRlci4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2gydjJfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpCit7CisgIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEgPSAqb3V0cHV0X2RhdGFfcHRyOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOworICByZWdpc3RlciBKU0FNUExFIGludmFsdWU7CisgIEpTQU1QUk9XIG91dGVuZDsKKyAgaW50IGlucm93LCBvdXRyb3c7CisKKyAgaW5yb3cgPSBvdXRyb3cgPSAwOworICB3aGlsZSAob3V0cm93IDwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7CisgICAgaW5wdHIgPSBpbnB1dF9kYXRhW2lucm93XTsKKyAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtvdXRyb3ddOworICAgIG91dGVuZCA9IG91dHB0ciArIGNpbmZvLT5vdXRwdXRfd2lkdGg7CisgICAgd2hpbGUgKG91dHB0ciA8IG91dGVuZCkgeworICAgICAgaW52YWx1ZSA9ICppbnB0cisrOwkvKiBkb24ndCBuZWVkIEdFVEpTQU1QTEUoKSBoZXJlICovCisgICAgICAqb3V0cHRyKysgPSBpbnZhbHVlOworICAgICAgKm91dHB0cisrID0gaW52YWx1ZTsKKyAgICB9CisgICAgamNvcHlfc2FtcGxlX3Jvd3Mob3V0cHV0X2RhdGEsIG91dHJvdywgb3V0cHV0X2RhdGEsIG91dHJvdysxLAorCQkgICAgICAxLCBjaW5mby0+b3V0cHV0X3dpZHRoKTsKKyAgICBpbnJvdysrOworICAgIG91dHJvdyArPSAyOworICB9Cit9CisKKworLyoKKyAqIEZhbmN5IHByb2Nlc3NpbmcgZm9yIHRoZSBjb21tb24gY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMToxIHZlcnRpY2FsLgorICoKKyAqIFRoZSB1cHNhbXBsaW5nIGFsZ29yaXRobSBpcyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHBpeGVsIGNlbnRlcnMsCisgKiBhbHNvIGtub3duIGFzIGEgInRyaWFuZ2xlIGZpbHRlciIuICBUaGlzIGlzIGEgZ29vZCBjb21wcm9taXNlIGJldHdlZW4KKyAqIHNwZWVkIGFuZCB2aXN1YWwgcXVhbGl0eS4gIFRoZSBjZW50ZXJzIG9mIHRoZSBvdXRwdXQgcGl4ZWxzIGFyZSAxLzQgYW5kIDMvNAorICogb2YgdGhlIHdheSBiZXR3ZWVuIGlucHV0IHBpeGVsIGNlbnRlcnMuCisgKgorICogQSBub3RlIGFib3V0IHRoZSAiYmlhcyIgY2FsY3VsYXRpb25zOiB3aGVuIHJvdW5kaW5nIGZyYWN0aW9uYWwgdmFsdWVzIHRvCisgKiBpbnRlZ2VyLCB3ZSBkbyBub3Qgd2FudCB0byBhbHdheXMgcm91bmQgMC41IHVwIHRvIHRoZSBuZXh0IGludGVnZXIuCisgKiBJZiB3ZSBkaWQgdGhhdCwgd2UnZCBpbnRyb2R1Y2UgYSBub3RpY2VhYmxlIGJpYXMgdG93YXJkcyBsYXJnZXIgdmFsdWVzLgorICogSW5zdGVhZCwgdGhpcyBjb2RlIGlzIGFycmFuZ2VkIHNvIHRoYXQgMC41IHdpbGwgYmUgcm91bmRlZCB1cCBvciBkb3duIGF0CisgKiBhbHRlcm5hdGUgcGl4ZWwgbG9jYXRpb25zIChhIHNpbXBsZSBvcmRlcmVkIGRpdGhlciBwYXR0ZXJuKS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2gydjFfZmFuY3lfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikKK3sKKyAgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSA9ICpvdXRwdXRfZGF0YV9wdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisgIHJlZ2lzdGVyIGludCBpbnZhbHVlOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbGN0cjsKKyAgaW50IGlucm93OworCisgIGZvciAoaW5yb3cgPSAwOyBpbnJvdyA8IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsgaW5yb3crKykgeworICAgIGlucHRyID0gaW5wdXRfZGF0YVtpbnJvd107CisgICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbaW5yb3ddOworICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgZmlyc3QgY29sdW1uICovCisgICAgaW52YWx1ZSA9IEdFVEpTQU1QTEUoKmlucHRyKyspOworICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSBpbnZhbHVlOworICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKGludmFsdWUgKiAzICsgR0VUSlNBTVBMRSgqaW5wdHIpICsgMikgPj4gMik7CisKKyAgICBmb3IgKGNvbGN0ciA9IGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoIC0gMjsgY29sY3RyID4gMDsgY29sY3RyLS0pIHsKKyAgICAgIC8qIEdlbmVyYWwgY2FzZTogMy80ICogbmVhcmVyIHBpeGVsICsgMS80ICogZnVydGhlciBwaXhlbCAqLworICAgICAgaW52YWx1ZSA9IEdFVEpTQU1QTEUoKmlucHRyKyspICogMzsKKyAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKGludmFsdWUgKyBHRVRKU0FNUExFKGlucHRyWy0yXSkgKyAxKSA+PiAyKTsKKyAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKGludmFsdWUgKyBHRVRKU0FNUExFKCppbnB0cikgKyAyKSA+PiAyKTsKKyAgICB9CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGxhc3QgY29sdW1uICovCisgICAgaW52YWx1ZSA9IEdFVEpTQU1QTEUoKmlucHRyKTsKKyAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChpbnZhbHVlICogMyArIEdFVEpTQU1QTEUoaW5wdHJbLTFdKSArIDEpID4+IDIpOworICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSBpbnZhbHVlOworICB9Cit9CisKKworLyoKKyAqIEZhbmN5IHByb2Nlc3NpbmcgZm9yIHRoZSBjb21tb24gY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMjoxIHZlcnRpY2FsLgorICogQWdhaW4gYSB0cmlhbmdsZSBmaWx0ZXI7IHNlZSBjb21tZW50cyBmb3IgaDJ2MSBjYXNlLCBhYm92ZS4KKyAqCisgKiBJdCBpcyBPSyBmb3IgdXMgdG8gcmVmZXJlbmNlIHRoZSBhZGphY2VudCBpbnB1dCByb3dzIGJlY2F1c2Ugd2UgZGVtYW5kZWQKKyAqIGNvbnRleHQgZnJvbSB0aGUgbWFpbiBidWZmZXIgY29udHJvbGxlciAoc2VlIGluaXRpYWxpemF0aW9uIGNvZGUpLgorICovCisKK01FVEhPRERFRih2b2lkKQoraDJ2Ml9mYW5jeV91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQoreworICBKU0FNUEFSUkFZIG91dHB1dF9kYXRhID0gKm91dHB1dF9kYXRhX3B0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIG91dHB0cjsKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorICByZWdpc3RlciBpbnQgdGhpc2NvbHN1bSwgbGFzdGNvbHN1bSwgbmV4dGNvbHN1bTsKKyNlbHNlCisgIHJlZ2lzdGVyIElOVDMyIHRoaXNjb2xzdW0sIGxhc3Rjb2xzdW0sIG5leHRjb2xzdW07CisjZW5kaWYKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2xjdHI7CisgIGludCBpbnJvdywgb3V0cm93LCB2OworCisgIGlucm93ID0gb3V0cm93ID0gMDsKKyAgd2hpbGUgKG91dHJvdyA8IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgeworICAgIGZvciAodiA9IDA7IHYgPCAyOyB2KyspIHsKKyAgICAgIC8qIGlucHRyMCBwb2ludHMgdG8gbmVhcmVzdCBpbnB1dCByb3csIGlucHRyMSBwb2ludHMgdG8gbmV4dCBuZWFyZXN0ICovCisgICAgICBpbnB0cjAgPSBpbnB1dF9kYXRhW2lucm93XTsKKyAgICAgIGlmICh2ID09IDApCQkvKiBuZXh0IG5lYXJlc3QgaXMgcm93IGFib3ZlICovCisJaW5wdHIxID0gaW5wdXRfZGF0YVtpbnJvdy0xXTsKKyAgICAgIGVsc2UJCQkvKiBuZXh0IG5lYXJlc3QgaXMgcm93IGJlbG93ICovCisJaW5wdHIxID0gaW5wdXRfZGF0YVtpbnJvdysxXTsKKyAgICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvdysrXTsKKworICAgICAgLyogU3BlY2lhbCBjYXNlIGZvciBmaXJzdCBjb2x1bW4gKi8KKyAgICAgIHRoaXNjb2xzdW0gPSBHRVRKU0FNUExFKCppbnB0cjArKykgKiAzICsgR0VUSlNBTVBMRSgqaW5wdHIxKyspOworICAgICAgbmV4dGNvbHN1bSA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKSAqIDMgKyBHRVRKU0FNUExFKCppbnB0cjErKyk7CisgICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKCh0aGlzY29sc3VtICogNCArIDgpID4+IDQpOworICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgodGhpc2NvbHN1bSAqIDMgKyBuZXh0Y29sc3VtICsgNykgPj4gNCk7CisgICAgICBsYXN0Y29sc3VtID0gdGhpc2NvbHN1bTsgdGhpc2NvbHN1bSA9IG5leHRjb2xzdW07CisKKyAgICAgIGZvciAoY29sY3RyID0gY29tcHB0ci0+ZG93bnNhbXBsZWRfd2lkdGggLSAyOyBjb2xjdHIgPiAwOyBjb2xjdHItLSkgeworCS8qIEdlbmVyYWwgY2FzZTogMy80ICogbmVhcmVyIHBpeGVsICsgMS80ICogZnVydGhlciBwaXhlbCBpbiBlYWNoICovCisJLyogZGltZW5zaW9uLCB0aHVzIDkvMTYsIDMvMTYsIDMvMTYsIDEvMTYgb3ZlcmFsbCAqLworCW5leHRjb2xzdW0gPSBHRVRKU0FNUExFKCppbnB0cjArKykgKiAzICsgR0VUSlNBTVBMRSgqaW5wdHIxKyspOworCSpvdXRwdHIrKyA9IChKU0FNUExFKSAoKHRoaXNjb2xzdW0gKiAzICsgbGFzdGNvbHN1bSArIDgpID4+IDQpOworCSpvdXRwdHIrKyA9IChKU0FNUExFKSAoKHRoaXNjb2xzdW0gKiAzICsgbmV4dGNvbHN1bSArIDcpID4+IDQpOworCWxhc3Rjb2xzdW0gPSB0aGlzY29sc3VtOyB0aGlzY29sc3VtID0gbmV4dGNvbHN1bTsKKyAgICAgIH0KKworICAgICAgLyogU3BlY2lhbCBjYXNlIGZvciBsYXN0IGNvbHVtbiAqLworICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgodGhpc2NvbHN1bSAqIDMgKyBsYXN0Y29sc3VtICsgOCkgPj4gNCk7CisgICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKCh0aGlzY29sc3VtICogNCArIDcpID4+IDQpOworICAgIH0KKyAgICBpbnJvdysrOworICB9Cit9CisKKworLyoKKyAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciB1cHNhbXBsaW5nLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfdXBzYW1wbGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGU7CisgIGludCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisgIGJvb2xlYW4gbmVlZF9idWZmZXIsIGRvX2ZhbmN5OworICBpbnQgaF9pbl9ncm91cCwgdl9pbl9ncm91cCwgaF9vdXRfZ3JvdXAsIHZfb3V0X2dyb3VwOworCisgIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV91cHNhbXBsZXIpKTsKKyAgY2luZm8tPnVwc2FtcGxlID0gKHN0cnVjdCBqcGVnX3Vwc2FtcGxlciAqKSB1cHNhbXBsZTsKKyAgdXBzYW1wbGUtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc191cHNhbXBsZTsKKyAgdXBzYW1wbGUtPnB1Yi51cHNhbXBsZSA9IHNlcF91cHNhbXBsZTsKKyAgdXBzYW1wbGUtPnB1Yi5uZWVkX2NvbnRleHRfcm93cyA9IEZBTFNFOyAvKiB1bnRpbCB3ZSBmaW5kIG91dCBkaWZmZXJlbnRseSAqLworCisgIGlmIChjaW5mby0+Q0NJUjYwMV9zYW1wbGluZykJLyogdGhpcyBpc24ndCBzdXBwb3J0ZWQgKi8KKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NDSVI2MDFfTk9USU1QTCk7CisKKyAgLyogamRtYWluY3QuYyBkb2Vzbid0IHN1cHBvcnQgY29udGV4dCByb3dzIHdoZW4gbWluX0RDVF9zY2FsZWRfc2l6ZSA9IDEsCisgICAqIHNvIGRvbid0IGFzayBmb3IgaXQuCisgICAqLworICBkb19mYW5jeSA9IGNpbmZvLT5kb19mYW5jeV91cHNhbXBsaW5nICYmIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplID4gMTsKKworICAvKiBWZXJpZnkgd2UgY2FuIGhhbmRsZSB0aGUgc2FtcGxpbmcgZmFjdG9ycywgc2VsZWN0IHBlci1jb21wb25lbnQgbWV0aG9kcywKKyAgICogYW5kIGNyZWF0ZSBzdG9yYWdlIGFzIG5lZWRlZC4KKyAgICovCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgLyogQ29tcHV0ZSBzaXplIG9mIGFuICJpbnB1dCBncm91cCIgYWZ0ZXIgSURDVCBzY2FsaW5nLiAgVGhpcyBtYW55IHNhbXBsZXMKKyAgICAgKiBhcmUgdG8gYmUgY29udmVydGVkIHRvIG1heF9oX3NhbXBfZmFjdG9yICogbWF4X3Zfc2FtcF9mYWN0b3IgcGl4ZWxzLgorICAgICAqLworICAgIGhfaW5fZ3JvdXAgPSAoY29tcHB0ci0+aF9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSkgLworCQkgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgICAgdl9pbl9ncm91cCA9IChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSAvCisJCSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKKyAgICBoX291dF9ncm91cCA9IGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvcjsKKyAgICB2X291dF9ncm91cCA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKKyAgICB1cHNhbXBsZS0+cm93Z3JvdXBfaGVpZ2h0W2NpXSA9IHZfaW5fZ3JvdXA7IC8qIHNhdmUgZm9yIHVzZSBsYXRlciAqLworICAgIG5lZWRfYnVmZmVyID0gVFJVRTsKKyAgICBpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKSB7CisgICAgICAvKiBEb24ndCBib3RoZXIgdG8gdXBzYW1wbGUgYW4gdW5pbnRlcmVzdGluZyBjb21wb25lbnQuICovCisgICAgICB1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBub29wX3Vwc2FtcGxlOworICAgICAgbmVlZF9idWZmZXIgPSBGQUxTRTsKKyAgICB9IGVsc2UgaWYgKGhfaW5fZ3JvdXAgPT0gaF9vdXRfZ3JvdXAgJiYgdl9pbl9ncm91cCA9PSB2X291dF9ncm91cCkgeworICAgICAgLyogRnVsbHNpemUgY29tcG9uZW50cyBjYW4gYmUgcHJvY2Vzc2VkIHdpdGhvdXQgYW55IHdvcmsuICovCisgICAgICB1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBmdWxsc2l6ZV91cHNhbXBsZTsKKyAgICAgIG5lZWRfYnVmZmVyID0gRkFMU0U7CisgICAgfSBlbHNlIGlmIChoX2luX2dyb3VwICogMiA9PSBoX291dF9ncm91cCAmJgorCSAgICAgICB2X2luX2dyb3VwID09IHZfb3V0X2dyb3VwKSB7CisgICAgICAvKiBTcGVjaWFsIGNhc2VzIGZvciAyaDF2IHVwc2FtcGxpbmcgKi8KKyAgICAgIGlmIChkb19mYW5jeSAmJiBjb21wcHRyLT5kb3duc2FtcGxlZF93aWR0aCA+IDIpCisJdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0gaDJ2MV9mYW5jeV91cHNhbXBsZTsKKyAgICAgIGVsc2UKKwl1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYxX3Vwc2FtcGxlOworICAgIH0gZWxzZSBpZiAoaF9pbl9ncm91cCAqIDIgPT0gaF9vdXRfZ3JvdXAgJiYKKwkgICAgICAgdl9pbl9ncm91cCAqIDIgPT0gdl9vdXRfZ3JvdXApIHsKKyAgICAgIC8qIFNwZWNpYWwgY2FzZXMgZm9yIDJoMnYgdXBzYW1wbGluZyAqLworICAgICAgaWYgKGRvX2ZhbmN5ICYmIGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoID4gMikgeworCXVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjJfZmFuY3lfdXBzYW1wbGU7CisJdXBzYW1wbGUtPnB1Yi5uZWVkX2NvbnRleHRfcm93cyA9IFRSVUU7CisgICAgICB9IGVsc2UKKwl1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYyX3Vwc2FtcGxlOworICAgIH0gZWxzZSBpZiAoKGhfb3V0X2dyb3VwICUgaF9pbl9ncm91cCkgPT0gMCAmJgorCSAgICAgICAodl9vdXRfZ3JvdXAgJSB2X2luX2dyb3VwKSA9PSAwKSB7CisgICAgICAvKiBHZW5lcmljIGludGVncmFsLWZhY3RvcnMgdXBzYW1wbGluZyBtZXRob2QgKi8KKyAgICAgIHVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGludF91cHNhbXBsZTsKKyAgICAgIHVwc2FtcGxlLT5oX2V4cGFuZFtjaV0gPSAoVUlOVDgpIChoX291dF9ncm91cCAvIGhfaW5fZ3JvdXApOworICAgICAgdXBzYW1wbGUtPnZfZXhwYW5kW2NpXSA9IChVSU5UOCkgKHZfb3V0X2dyb3VwIC8gdl9pbl9ncm91cCk7CisgICAgfSBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZSQUNUX1NBTVBMRV9OT1RJTVBMKTsKKyAgICBpZiAobmVlZF9idWZmZXIpIHsKKyAgICAgIHVwc2FtcGxlLT5jb2xvcl9idWZbY2ldID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY2luZm8tPm91dHB1dF93aWR0aCwKKwkJCQkobG9uZykgY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yKSwKKwkgKEpESU1FTlNJT04pIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3Rvcik7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamR0cmFucy5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkdHJhbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzBhYjcxCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkdHJhbnMuYwpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIGpkdHJhbnMuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGxpYnJhcnkgcm91dGluZXMgZm9yIHRyYW5zY29kaW5nIGRlY29tcHJlc3Npb24sCisgKiB0aGF0IGlzLCByZWFkaW5nIHJhdyBEQ1QgY29lZmZpY2llbnQgYXJyYXlzIGZyb20gYW4gaW5wdXQgSlBFRyBmaWxlLgorICogVGhlIHJvdXRpbmVzIGluIGpkYXBpbWluLmMgd2lsbCBhbHNvIGJlIG5lZWRlZCBieSBhIHRyYW5zY29kZXIuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitMT0NBTCh2b2lkKSB0cmFuc2RlY29kZV9tYXN0ZXJfc2VsZWN0aW9uIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworCisKKy8qCisgKiBSZWFkIHRoZSBjb2VmZmljaWVudCBhcnJheXMgZnJvbSBhIEpQRUcgZmlsZS4KKyAqIGpwZWdfcmVhZF9oZWFkZXIgbXVzdCBiZSBjb21wbGV0ZWQgYmVmb3JlIGNhbGxpbmcgdGhpcy4KKyAqCisgKiBUaGUgZW50aXJlIGltYWdlIGlzIHJlYWQgaW50byBhIHNldCBvZiB2aXJ0dWFsIGNvZWZmaWNpZW50LWJsb2NrIGFycmF5cywKKyAqIG9uZSBwZXIgY29tcG9uZW50LiAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mCisgKiB2aXJ0dWFsLWFycmF5IGRlc2NyaXB0b3JzLiAgVGhlc2UgY2FuIGJlIG1hbmlwdWxhdGVkIGRpcmVjdGx5IHZpYSB0aGUKKyAqIEpQRUcgbWVtb3J5IG1hbmFnZXIsIG9yIGhhbmRlZCBvZmYgdG8ganBlZ193cml0ZV9jb2VmZmljaWVudHMoKS4KKyAqIFRvIHJlbGVhc2UgdGhlIG1lbW9yeSBvY2N1cGllZCBieSB0aGUgdmlydHVhbCBhcnJheXMsIGNhbGwKKyAqIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKSB3aGVuIGRvbmUgd2l0aCB0aGUgZGF0YS4KKyAqCisgKiBBbiBhbHRlcm5hdGl2ZSB1c2FnZSBpcyB0byBzaW1wbHkgb2J0YWluIGFjY2VzcyB0byB0aGUgY29lZmZpY2llbnQgYXJyYXlzCisgKiBkdXJpbmcgYSBidWZmZXJlZC1pbWFnZS1tb2RlIGRlY29tcHJlc3Npb24gb3BlcmF0aW9uLiAgVGhpcyBpcyBhbGxvd2VkCisgKiBhZnRlciBhbnkganBlZ19maW5pc2hfb3V0cHV0KCkgY2FsbC4gIFRoZSBhcnJheXMgY2FuIGJlIGFjY2Vzc2VkIHVudGlsCisgKiBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkgaXMgY2FsbGVkLiAgKE5vdGUgdGhhdCBhbnkgY2FsbCB0byB0aGUgbGlicmFyeQorICogbWF5IHJlcG9zaXRpb24gdGhlIGFycmF5cywgc28gZG9uJ3QgcmVseSBvbiBhY2Nlc3NfdmlydF9iYXJyYXkoKSByZXN1bHRzCisgKiB0byBzdGF5IHZhbGlkIGFjcm9zcyBsaWJyYXJ5IGNhbGxzLikKKyAqCisgKiBSZXR1cm5zIE5VTEwgaWYgc3VzcGVuZGVkLiAgVGhpcyBjYXNlIG5lZWQgYmUgY2hlY2tlZCBvbmx5IGlmCisgKiBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UgaXMgdXNlZC4KKyAqLworCitHTE9CQUwoanZpcnRfYmFycmF5X3B0ciAqKQoranBlZ19yZWFkX2NvZWZmaWNpZW50cyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1JFQURZKSB7CisgICAgLyogRmlyc3QgY2FsbDogaW5pdGlhbGl6ZSBhY3RpdmUgbW9kdWxlcyAqLworICAgIHRyYW5zZGVjb2RlX21hc3Rlcl9zZWxlY3Rpb24oY2luZm8pOworICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfUkRDT0VGUzsKKyAgfQorICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfUkRDT0VGUykgeworICAgIC8qIEFic29yYiB3aG9sZSBmaWxlIGludG8gdGhlIGNvZWYgYnVmZmVyICovCisgICAgZm9yICg7OykgeworICAgICAgaW50IHJldGNvZGU7CisgICAgICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCisgICAgICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpCisJKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICAgICAvKiBBYnNvcmIgc29tZSBtb3JlIGlucHV0ICovCisgICAgICByZXRjb2RlID0gKCpjaW5mby0+aW5wdXRjdGwtPmNvbnN1bWVfaW5wdXQpIChjaW5mbyk7CisgICAgICBpZiAocmV0Y29kZSA9PSBKUEVHX1NVU1BFTkRFRCkKKwlyZXR1cm4gTlVMTDsKKyAgICAgIGlmIChyZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9FT0kpCisJYnJlYWs7CisgICAgICAvKiBBZHZhbmNlIHByb2dyZXNzIGNvdW50ZXIgaWYgYXBwcm9wcmlhdGUgKi8KKyAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCAmJgorCSAgKHJldGNvZGUgPT0gSlBFR19ST1dfQ09NUExFVEVEIHx8IHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX1NPUykpIHsKKwlpZiAoKytjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfY291bnRlciA+PSBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQpIHsKKwkgIC8qIHN0YXJ0dXAgdW5kZXJlc3RpbWF0ZWQgbnVtYmVyIG9mIHNjYW5zOyByYXRjaGV0IHVwIG9uZSBzY2FuICovCisJICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgKz0gKGxvbmcpIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3M7CisJfQorICAgICAgfQorICAgIH0KKyAgICAvKiBTZXQgc3RhdGUgc28gdGhhdCBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzIGRvZXMgdGhlIHJpZ2h0IHRoaW5nICovCisgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9TVE9QUElORzsKKyAgfQorICAvKiBBdCB0aGlzIHBvaW50IHdlIHNob3VsZCBiZSBpbiBzdGF0ZSBEU1RBVEVfU1RPUFBJTkcgaWYgYmVpbmcgdXNlZAorICAgKiBzdGFuZGFsb25lLCBvciBpbiBzdGF0ZSBEU1RBVEVfQlVGSU1BR0UgaWYgYmVpbmcgaW52b2tlZCB0byBnZXQgYWNjZXNzCisgICAqIHRvIHRoZSBjb2VmZmljaWVudHMgZHVyaW5nIGEgZnVsbCBidWZmZXJlZC1pbWFnZS1tb2RlIGRlY29tcHJlc3Npb24uCisgICAqLworICBpZiAoKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1NUT1BQSU5HIHx8CisgICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfQlVGSU1BR0UpICYmIGNpbmZvLT5idWZmZXJlZF9pbWFnZSkgeworICAgIHJldHVybiBjaW5mby0+Y29lZi0+Y29lZl9hcnJheXM7CisgIH0KKyAgLyogT29wcywgaW1wcm9wZXIgdXNhZ2UgKi8KKyAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKyAgcmV0dXJuIE5VTEw7CQkJLyoga2VlcCBjb21waWxlciBoYXBweSAqLworfQorCisKKy8qCisgKiBNYXN0ZXIgc2VsZWN0aW9uIG9mIGRlY29tcHJlc3Npb24gbW9kdWxlcyBmb3IgdHJhbnNjb2RpbmcuCisgKiBUaGlzIHN1YnN0aXR1dGVzIGZvciBqZG1hc3Rlci5jJ3MgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGZ1bGwgZGVjb21wcmVzc29yLgorICovCisKK0xPQ0FMKHZvaWQpCit0cmFuc2RlY29kZV9tYXN0ZXJfc2VsZWN0aW9uIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICAvKiBUaGlzIGlzIGVmZmVjdGl2ZWx5IGEgYnVmZmVyZWQtaW1hZ2Ugb3BlcmF0aW9uLiAqLworICBjaW5mby0+YnVmZmVyZWRfaW1hZ2UgPSBUUlVFOworCisgIC8qIEVudHJvcHkgZGVjb2Rpbmc6IGVpdGhlciBIdWZmbWFuIG9yIGFyaXRobWV0aWMgY29kaW5nLiAqLworICBpZiAoY2luZm8tPmFyaXRoX2NvZGUpIHsKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0FSSVRIX05PVElNUEwpOworICB9IGVsc2UgeworICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgeworI2lmZGVmIERfUFJPR1JFU1NJVkVfU1VQUE9SVEVECisgICAgICBqaW5pdF9waHVmZl9kZWNvZGVyKGNpbmZvKTsKKyNlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisjZW5kaWYKKyAgICB9IGVsc2UKKyAgICAgIGppbml0X2h1ZmZfZGVjb2RlcihjaW5mbyk7CisgIH0KKworICAvKiBBbHdheXMgZ2V0IGEgZnVsbC1pbWFnZSBjb2VmZmljaWVudCBidWZmZXIuICovCisgIGppbml0X2RfY29lZl9jb250cm9sbGVyKGNpbmZvLCBUUlVFKTsKKworICAvKiBXZSBjYW4gbm93IHRlbGwgdGhlIG1lbW9yeSBtYW5hZ2VyIHRvIGFsbG9jYXRlIHZpcnR1YWwgYXJyYXlzLiAqLworICAoKmNpbmZvLT5tZW0tPnJlYWxpemVfdmlydF9hcnJheXMpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisKKyAgLyogSW5pdGlhbGl6ZSBpbnB1dCBzaWRlIG9mIGRlY29tcHJlc3NvciB0byBjb25zdW1lIGZpcnN0IHNjYW4uICovCisgICgqY2luZm8tPmlucHV0Y3RsLT5zdGFydF9pbnB1dF9wYXNzKSAoY2luZm8pOworCisgIC8qIEluaXRpYWxpemUgcHJvZ3Jlc3MgbW9uaXRvcmluZy4gKi8KKyAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgaW50IG5zY2FuczsKKyAgICAvKiBFc3RpbWF0ZSBudW1iZXIgb2Ygc2NhbnMgdG8gc2V0IHBhc3NfbGltaXQuICovCisgICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7CisgICAgICAvKiBBcmJpdHJhcmlseSBlc3RpbWF0ZSAyIGludGVybGVhdmVkIERDIHNjYW5zICsgMyBBQyBzY2Fucy9jb21wb25lbnQuICovCisgICAgICBuc2NhbnMgPSAyICsgMyAqIGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICB9IGVsc2UgaWYgKGNpbmZvLT5pbnB1dGN0bC0+aGFzX211bHRpcGxlX3NjYW5zKSB7CisgICAgICAvKiBGb3IgYSBub25wcm9ncmVzc2l2ZSBtdWx0aXNjYW4gZmlsZSwgZXN0aW1hdGUgMSBzY2FuIHBlciBjb21wb25lbnQuICovCisgICAgICBuc2NhbnMgPSBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgfSBlbHNlIHsKKyAgICAgIG5zY2FucyA9IDE7CisgICAgfQorICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gMEw7CisgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgKiBuc2NhbnM7CisgICAgY2luZm8tPnByb2dyZXNzLT5jb21wbGV0ZWRfcGFzc2VzID0gMDsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPnRvdGFsX3Bhc3NlcyA9IDE7CisgIH0KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qZXJyb3IuYyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGZiOWZlCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2plcnJvci5jCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICogamVycm9yLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBzaW1wbGUgZXJyb3ItcmVwb3J0aW5nIGFuZCB0cmFjZS1tZXNzYWdlIHJvdXRpbmVzLgorICogVGhlc2UgYXJlIHN1aXRhYmxlIGZvciBVbml4LWxpa2Ugc3lzdGVtcyBhbmQgb3RoZXJzIHdoZXJlIHdyaXRpbmcgdG8KKyAqIHN0ZGVyciBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8uICBNYW55IGFwcGxpY2F0aW9ucyB3aWxsIHdhbnQgdG8gcmVwbGFjZQorICogc29tZSBvciBhbGwgb2YgdGhlc2Ugcm91dGluZXMuCisgKgorICogVGhlc2Ugcm91dGluZXMgYXJlIHVzZWQgYnkgYm90aCB0aGUgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gY29kZS4KKyAqLworCisvKiB0aGlzIGlzIG5vdCBhIGNvcmUgbGlicmFyeSBtb2R1bGUsIHNvIGl0IGRvZXNuJ3QgZGVmaW5lIEpQRUdfSU5URVJOQUxTICovCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAianZlcnNpb24uaCIKKyNpbmNsdWRlICJqZXJyb3IuaCIKKworI2lmbmRlZiBFWElUX0ZBSUxVUkUJCS8qIGRlZmluZSBleGl0KCkgY29kZXMgaWYgbm90IHByb3ZpZGVkICovCisjZGVmaW5lIEVYSVRfRkFJTFVSRSAgMQorI2VuZGlmCisKKworLyoKKyAqIENyZWF0ZSB0aGUgbWVzc2FnZSBzdHJpbmcgdGFibGUuCisgKiBXZSBkbyB0aGlzIGZyb20gdGhlIG1hc3RlciBtZXNzYWdlIGxpc3QgaW4gamVycm9yLmggYnkgcmUtcmVhZGluZworICogamVycm9yLmggd2l0aCBhIHN1aXRhYmxlIGRlZmluaXRpb24gZm9yIG1hY3JvIEpNRVNTQUdFLgorICogVGhlIG1lc3NhZ2UgdGFibGUgaXMgbWFkZSBhbiBleHRlcm5hbCBzeW1ib2wganVzdCBpbiBjYXNlIGFueSBhcHBsaWNhdGlvbnMKKyAqIHdhbnQgdG8gcmVmZXIgdG8gaXQgZGlyZWN0bHkuCisgKi8KKworI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyNkZWZpbmUganBlZ19zdGRfbWVzc2FnZV90YWJsZQlqTXNnVGFibGUKKyNlbmRpZgorCisjZGVmaW5lIEpNRVNTQUdFKGNvZGUsc3RyaW5nKQlzdHJpbmcgLAorCitjb25zdCBjaGFyICogY29uc3QganBlZ19zdGRfbWVzc2FnZV90YWJsZVtdID0geworI2luY2x1ZGUgImplcnJvci5oIgorICBOVUxMCit9OworCisKKy8qCisgKiBFcnJvciBleGl0IGhhbmRsZXI6IG11c3Qgbm90IHJldHVybiB0byBjYWxsZXIuCisgKgorICogQXBwbGljYXRpb25zIG1heSBvdmVycmlkZSB0aGlzIGlmIHRoZXkgd2FudCB0byBnZXQgY29udHJvbCBiYWNrIGFmdGVyCisgKiBhbiBlcnJvci4gIFR5cGljYWxseSBvbmUgd291bGQgbG9uZ2ptcCBzb21ld2hlcmUgaW5zdGVhZCBvZiBleGl0aW5nLgorICogVGhlIHNldGptcCBidWZmZXIgY2FuIGJlIG1hZGUgYSBwcml2YXRlIGZpZWxkIHdpdGhpbiBhbiBleHBhbmRlZCBlcnJvcgorICogaGFuZGxlciBvYmplY3QuICBOb3RlIHRoYXQgdGhlIGluZm8gbmVlZGVkIHRvIGdlbmVyYXRlIGFuIGVycm9yIG1lc3NhZ2UKKyAqIGlzIHN0b3JlZCBpbiB0aGUgZXJyb3Igb2JqZWN0LCBzbyB5b3UgY2FuIGdlbmVyYXRlIHRoZSBtZXNzYWdlIG5vdyBvcgorICogbGF0ZXIsIGF0IHlvdXIgY29udmVuaWVuY2UuCisgKiBZb3Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IHRoZSBKUEVHIG9iamVjdCBpcyBjbGVhbmVkIHVwICh3aXRoIGpwZWdfYWJvcnQKKyAqIG9yIGpwZWdfZGVzdHJveSkgYXQgc29tZSBwb2ludC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2Vycm9yX2V4aXQgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgLyogQWx3YXlzIGRpc3BsYXkgdGhlIG1lc3NhZ2UgKi8KKyAgKCpjaW5mby0+ZXJyLT5vdXRwdXRfbWVzc2FnZSkgKGNpbmZvKTsKKworICAvKiBMZXQgdGhlIG1lbW9yeSBtYW5hZ2VyIGRlbGV0ZSBhbnkgdGVtcCBmaWxlcyBiZWZvcmUgd2UgZGllICovCisgIGpwZWdfZGVzdHJveShjaW5mbyk7CisKKy8vICBleGl0KEVYSVRfRkFJTFVSRSk7Cit9CisKKworLyoKKyAqIEFjdHVhbCBvdXRwdXQgb2YgYW4gZXJyb3Igb3IgdHJhY2UgbWVzc2FnZS4KKyAqIEFwcGxpY2F0aW9ucyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gc2VuZCBKUEVHIG1lc3NhZ2VzIHNvbWV3aGVyZQorICogb3RoZXIgdGhhbiBzdGRlcnIuCisgKgorICogT24gV2luZG93cywgcHJpbnRpbmcgdG8gc3RkZXJyIGlzIGdlbmVyYWxseSBjb21wbGV0ZWx5IHVzZWxlc3MsCisgKiBzbyB3ZSBwcm92aWRlIG9wdGlvbmFsIGNvZGUgdG8gcHJvZHVjZSBhbiBlcnJvci1kaWFsb2cgcG9wdXAuCisgKiBNb3N0IFdpbmRvd3MgYXBwbGljYXRpb25zIHdpbGwgc3RpbGwgcHJlZmVyIHRvIG92ZXJyaWRlIHRoaXMgcm91dGluZSwKKyAqIGJ1dCBpZiB0aGV5IGRvbid0LCBpdCdsbCBkbyBzb21ldGhpbmcgYXQgbGVhc3QgbWFyZ2luYWxseSB1c2VmdWwuCisgKgorICogTk9URTogdG8gdXNlIHRoZSBsaWJyYXJ5IGluIGFuIGVudmlyb25tZW50IHRoYXQgZG9lc24ndCBzdXBwb3J0IHRoZQorICogQyBzdGRpbyBsaWJyYXJ5LCB5b3UgbWF5IGhhdmUgdG8gZGVsZXRlIHRoZSBjYWxsIHRvIGZwcmludGYoKSBlbnRpcmVseSwKKyAqIG5vdCBqdXN0IG5vdCB1c2UgdGhpcyByb3V0aW5lLgorICovCisKK01FVEhPRERFRih2b2lkKQorb3V0cHV0X21lc3NhZ2UgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgY2hhciBidWZmZXJbSk1TR19MRU5HVEhfTUFYXTsKKworICAvKiBDcmVhdGUgdGhlIG1lc3NhZ2UgKi8KKyAgKCpjaW5mby0+ZXJyLT5mb3JtYXRfbWVzc2FnZSkgKGNpbmZvLCBidWZmZXIpOworCisgIC8qIFNlbmQgaXQgdG8gc3RkZXJyLCBhZGRpbmcgYSBuZXdsaW5lICovCisgIEZYU1lTX2ZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGJ1ZmZlcik7Cit9CisKKworLyoKKyAqIERlY2lkZSB3aGV0aGVyIHRvIGVtaXQgYSB0cmFjZSBvciB3YXJuaW5nIG1lc3NhZ2UuCisgKiBtc2dfbGV2ZWwgaXMgb25lIG9mOgorICogICAtMTogcmVjb3ZlcmFibGUgY29ycnVwdC1kYXRhIHdhcm5pbmcsIG1heSB3YW50IHRvIGFib3J0LgorICogICAgMDogaW1wb3J0YW50IGFkdmlzb3J5IG1lc3NhZ2VzIChhbHdheXMgZGlzcGxheSB0byB1c2VyKS4KKyAqICAgIDE6IGZpcnN0IGxldmVsIG9mIHRyYWNpbmcgZGV0YWlsLgorICogICAgMiwzLC4uLjogc3VjY2Vzc2l2ZWx5IG1vcmUgZGV0YWlsZWQgdHJhY2luZyBtZXNzYWdlcy4KKyAqIEFuIGFwcGxpY2F0aW9uIG1pZ2h0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIGl0IHdhbnRlZCB0byBhYm9ydCBvbiB3YXJuaW5ncworICogb3IgY2hhbmdlIHRoZSBwb2xpY3kgYWJvdXQgd2hpY2ggbWVzc2FnZXMgdG8gZGlzcGxheS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2VtaXRfbWVzc2FnZSAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgbXNnX2xldmVsKQoreworICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKiBlcnIgPSBjaW5mby0+ZXJyOworCisgIGlmIChtc2dfbGV2ZWwgPCAwKSB7CisgICAgLyogSXQncyBhIHdhcm5pbmcgbWVzc2FnZS4gIFNpbmNlIGNvcnJ1cHQgZmlsZXMgbWF5IGdlbmVyYXRlIG1hbnkgd2FybmluZ3MsCisgICAgICogdGhlIHBvbGljeSBpbXBsZW1lbnRlZCBoZXJlIGlzIHRvIHNob3cgb25seSB0aGUgZmlyc3Qgd2FybmluZywKKyAgICAgKiB1bmxlc3MgdHJhY2VfbGV2ZWwgPj0gMy4KKyAgICAgKi8KKyAgICBpZiAoZXJyLT5udW1fd2FybmluZ3MgPT0gMCB8fCBlcnItPnRyYWNlX2xldmVsID49IDMpCisgICAgICAoKmVyci0+b3V0cHV0X21lc3NhZ2UpIChjaW5mbyk7CisgICAgLyogQWx3YXlzIGNvdW50IHdhcm5pbmdzIGluIG51bV93YXJuaW5ncy4gKi8KKyAgICBlcnItPm51bV93YXJuaW5ncysrOworICB9IGVsc2UgeworICAgIC8qIEl0J3MgYSB0cmFjZSBtZXNzYWdlLiAgU2hvdyBpdCBpZiB0cmFjZV9sZXZlbCA+PSBtc2dfbGV2ZWwuICovCisgICAgaWYgKGVyci0+dHJhY2VfbGV2ZWwgPj0gbXNnX2xldmVsKQorICAgICAgKCplcnItPm91dHB1dF9tZXNzYWdlKSAoY2luZm8pOworICB9Cit9CisKKworLyoKKyAqIEZvcm1hdCBhIG1lc3NhZ2Ugc3RyaW5nIGZvciB0aGUgbW9zdCByZWNlbnQgSlBFRyBlcnJvciBvciBtZXNzYWdlLgorICogVGhlIG1lc3NhZ2UgaXMgc3RvcmVkIGludG8gYnVmZmVyLCB3aGljaCBzaG91bGQgYmUgYXQgbGVhc3QgSk1TR19MRU5HVEhfTUFYCisgKiBjaGFyYWN0ZXJzLiAgTm90ZSB0aGF0IG5vICdcbicgY2hhcmFjdGVyIGlzIGFkZGVkIHRvIHRoZSBzdHJpbmcuCisgKiBGZXcgYXBwbGljYXRpb25zIHNob3VsZCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgorICovCisKK01FVEhPRERFRih2b2lkKQorZm9ybWF0X21lc3NhZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgY2hhciAqIGJ1ZmZlcikKK3sKKyNpZiAwCS8qIFhZUSAqLworICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKiBlcnIgPSBjaW5mby0+ZXJyOworICBpbnQgbXNnX2NvZGUgPSBlcnItPm1zZ19jb2RlOworICBjb25zdCBjaGFyICogbXNndGV4dCA9IE5VTEw7CisgIGNvbnN0IGNoYXIgKiBtc2dwdHI7CisgIGNoYXIgY2g7CisgIGJvb2xlYW4gaXNzdHJpbmc7CisKKyAgLyogTG9vayB1cCBtZXNzYWdlIHN0cmluZyBpbiBwcm9wZXIgdGFibGUgKi8KKyAgaWYgKG1zZ19jb2RlID4gMCAmJiBtc2dfY29kZSA8PSBlcnItPmxhc3RfanBlZ19tZXNzYWdlKSB7CisgICAgbXNndGV4dCA9IGVyci0+anBlZ19tZXNzYWdlX3RhYmxlW21zZ19jb2RlXTsKKyAgfSBlbHNlIGlmIChlcnItPmFkZG9uX21lc3NhZ2VfdGFibGUgIT0gTlVMTCAmJgorCSAgICAgbXNnX2NvZGUgPj0gZXJyLT5maXJzdF9hZGRvbl9tZXNzYWdlICYmCisJICAgICBtc2dfY29kZSA8PSBlcnItPmxhc3RfYWRkb25fbWVzc2FnZSkgeworICAgIG1zZ3RleHQgPSBlcnItPmFkZG9uX21lc3NhZ2VfdGFibGVbbXNnX2NvZGUgLSBlcnItPmZpcnN0X2FkZG9uX21lc3NhZ2VdOworICB9CisKKyAgLyogRGVmZW5kIGFnYWluc3QgYm9ndXMgbWVzc2FnZSBudW1iZXIgKi8KKyAgaWYgKG1zZ3RleHQgPT0gTlVMTCkgeworICAgIGVyci0+bXNnX3Bhcm0uaVswXSA9IG1zZ19jb2RlOworICAgIG1zZ3RleHQgPSBlcnItPmpwZWdfbWVzc2FnZV90YWJsZVswXTsKKyAgfQorCisgIC8qIENoZWNrIGZvciBzdHJpbmcgcGFyYW1ldGVyLCBhcyBpbmRpY2F0ZWQgYnkgJXMgaW4gdGhlIG1lc3NhZ2UgdGV4dCAqLworICBpc3N0cmluZyA9IEZBTFNFOworICBtc2dwdHIgPSBtc2d0ZXh0OworICB3aGlsZSAoKGNoID0gKm1zZ3B0cisrKSAhPSAnXDAnKSB7CisgICAgaWYgKGNoID09ICclJykgeworICAgICAgaWYgKCptc2dwdHIgPT0gJ3MnKSBpc3N0cmluZyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvKiBGb3JtYXQgdGhlIG1lc3NhZ2UgaW50byB0aGUgcGFzc2VkIGJ1ZmZlciAqLworICBpZiAoaXNzdHJpbmcpCisgICAgc3ByaW50ZihidWZmZXIsIG1zZ3RleHQsIGVyci0+bXNnX3Bhcm0ucyk7CisgIGVsc2UKKyAgICBzcHJpbnRmKGJ1ZmZlciwgbXNndGV4dCwKKwkgICAgZXJyLT5tc2dfcGFybS5pWzBdLCBlcnItPm1zZ19wYXJtLmlbMV0sCisJICAgIGVyci0+bXNnX3Bhcm0uaVsyXSwgZXJyLT5tc2dfcGFybS5pWzNdLAorCSAgICBlcnItPm1zZ19wYXJtLmlbNF0sIGVyci0+bXNnX3Bhcm0uaVs1XSwKKwkgICAgZXJyLT5tc2dfcGFybS5pWzZdLCBlcnItPm1zZ19wYXJtLmlbN10pOworI2VuZGlmCit9CisKKworLyoKKyAqIFJlc2V0IGVycm9yIHN0YXRlIHZhcmlhYmxlcyBhdCBzdGFydCBvZiBhIG5ldyBpbWFnZS4KKyAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBjb21wcmVzc2lvbiBzdGFydHVwIHRvIHJlc2V0IHRyYWNlL2Vycm9yCisgKiBwcm9jZXNzaW5nIHRvIGRlZmF1bHQgc3RhdGUsIHdpdGhvdXQgbG9zaW5nIGFueSBhcHBsaWNhdGlvbi1zcGVjaWZpYworICogbWV0aG9kIHBvaW50ZXJzLiAgQW4gYXBwbGljYXRpb24gbWlnaHQgcG9zc2libHkgd2FudCB0byBvdmVycmlkZQorICogdGhpcyBtZXRob2QgaWYgaXQgaGFzIGFkZGl0aW9uYWwgZXJyb3IgcHJvY2Vzc2luZyBzdGF0ZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3Jlc2V0X2Vycm9yX21nciAoal9jb21tb25fcHRyIGNpbmZvKQoreworICBjaW5mby0+ZXJyLT5udW1fd2FybmluZ3MgPSAwOworICAvKiB0cmFjZV9sZXZlbCBpcyBub3QgcmVzZXQgc2luY2UgaXQgaXMgYW4gYXBwbGljYXRpb24tc3VwcGxpZWQgcGFyYW1ldGVyICovCisgIGNpbmZvLT5lcnItPm1zZ19jb2RlID0gMDsJLyogbWF5IGJlIHVzZWZ1bCBhcyBhIGZsYWcgZm9yICJubyBlcnJvciIgKi8KK30KKworCisvKgorICogRmlsbCBpbiB0aGUgc3RhbmRhcmQgZXJyb3ItaGFuZGxpbmcgbWV0aG9kcyBpbiBhIGpwZWdfZXJyb3JfbWdyIG9iamVjdC4KKyAqIFR5cGljYWwgY2FsbCBpczoKKyAqCXN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBjaW5mbzsKKyAqCXN0cnVjdCBqcGVnX2Vycm9yX21nciBlcnI7CisgKgorICoJY2luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmVycik7CisgKiBhZnRlciB3aGljaCB0aGUgYXBwbGljYXRpb24gbWF5IG92ZXJyaWRlIHNvbWUgb2YgdGhlIG1ldGhvZHMuCisgKi8KKworR0xPQkFMKHN0cnVjdCBqcGVnX2Vycm9yX21nciAqKQoranBlZ19zdGRfZXJyb3IgKHN0cnVjdCBqcGVnX2Vycm9yX21nciAqIGVycikKK3sKKyAgZXJyLT5lcnJvcl9leGl0ID0gZXJyb3JfZXhpdDsKKyAgZXJyLT5lbWl0X21lc3NhZ2UgPSBlbWl0X21lc3NhZ2U7CisgIGVyci0+b3V0cHV0X21lc3NhZ2UgPSBvdXRwdXRfbWVzc2FnZTsKKyAgZXJyLT5mb3JtYXRfbWVzc2FnZSA9IGZvcm1hdF9tZXNzYWdlOworICBlcnItPnJlc2V0X2Vycm9yX21nciA9IHJlc2V0X2Vycm9yX21ncjsKKworICBlcnItPnRyYWNlX2xldmVsID0gMDsJCS8qIGRlZmF1bHQgPSBubyB0cmFjaW5nICovCisgIGVyci0+bnVtX3dhcm5pbmdzID0gMDsJLyogbm8gd2FybmluZ3MgZW1pdHRlZCB5ZXQgKi8KKyAgZXJyLT5tc2dfY29kZSA9IDA7CQkvKiBtYXkgYmUgdXNlZnVsIGFzIGEgZmxhZyBmb3IgIm5vIGVycm9yIiAqLworCisgIC8qIEluaXRpYWxpemUgbWVzc2FnZSB0YWJsZSBwb2ludGVycyAqLworICBlcnItPmpwZWdfbWVzc2FnZV90YWJsZSA9IGpwZWdfc3RkX21lc3NhZ2VfdGFibGU7CisgIGVyci0+bGFzdF9qcGVnX21lc3NhZ2UgPSAoaW50KSBKTVNHX0xBU1RNU0dDT0RFIC0gMTsKKworICBlcnItPmFkZG9uX21lc3NhZ2VfdGFibGUgPSBOVUxMOworICBlcnItPmZpcnN0X2FkZG9uX21lc3NhZ2UgPSAwOwkvKiBmb3Igc2FmZXR5ICovCisgIGVyci0+bGFzdF9hZGRvbl9tZXNzYWdlID0gMDsKKworICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pmZGN0ZnN0LmMgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamZkY3Rmc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2IzNzhhCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pmZGN0ZnN0LmMKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBqZmRjdGZzdC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYSBmYXN0LCBub3Qgc28gYWNjdXJhdGUgaW50ZWdlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKyAqIGZvcndhcmQgRENUIChEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtKS4KKyAqCisgKiBBIDItRCBEQ1QgY2FuIGJlIGRvbmUgYnkgMS1EIERDVCBvbiBlYWNoIHJvdyBmb2xsb3dlZCBieSAxLUQgRENUCisgKiBvbiBlYWNoIGNvbHVtbi4gIERpcmVjdCBhbGdvcml0aG1zIGFyZSBhbHNvIGF2YWlsYWJsZSwgYnV0IHRoZXkgYXJlCisgKiBtdWNoIG1vcmUgY29tcGxleCBhbmQgc2VlbSBub3QgdG8gYmUgYW55IGZhc3RlciB3aGVuIHJlZHVjZWQgdG8gY29kZS4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIEFyYWksIEFndWksIGFuZCBOYWthamltYSdzIGFsZ29yaXRobSBmb3IKKyAqIHNjYWxlZCBEQ1QuICBUaGVpciBvcmlnaW5hbCBwYXBlciAoVHJhbnMuIElFSUNFIEUtNzEoMTEpOjEwOTUpIGlzIGluCisgKiBKYXBhbmVzZSwgYnV0IHRoZSBhbGdvcml0aG0gaXMgZGVzY3JpYmVkIGluIHRoZSBQZW5uZWJha2VyICYgTWl0Y2hlbGwKKyAqIEpQRUcgdGV4dGJvb2sgKHNlZSBSRUZFUkVOQ0VTIHNlY3Rpb24gaW4gZmlsZSBSRUFETUUpLiAgVGhlIGZvbGxvd2luZyBjb2RlCisgKiBpcyBiYXNlZCBkaXJlY3RseSBvbiBmaWd1cmUgNC04IGluIFAmTS4KKyAqIFdoaWxlIGFuIDgtcG9pbnQgRENUIGNhbm5vdCBiZSBkb25lIGluIGxlc3MgdGhhbiAxMSBtdWx0aXBsaWVzLCBpdCBpcworICogcG9zc2libGUgdG8gYXJyYW5nZSB0aGUgY29tcHV0YXRpb24gc28gdGhhdCBtYW55IG9mIHRoZSBtdWx0aXBsaWVzIGFyZQorICogc2ltcGxlIHNjYWxpbmdzIG9mIHRoZSBmaW5hbCBvdXRwdXRzLiAgVGhlc2UgbXVsdGlwbGllcyBjYW4gdGhlbiBiZQorICogZm9sZGVkIGludG8gdGhlIG11bHRpcGxpY2F0aW9ucyBvciBkaXZpc2lvbnMgYnkgdGhlIEpQRUcgcXVhbnRpemF0aW9uCisgKiB0YWJsZSBlbnRyaWVzLiAgVGhlIEFBJk4gbWV0aG9kIGxlYXZlcyBvbmx5IDUgbXVsdGlwbGllcyBhbmQgMjkgYWRkcworICogdG8gYmUgZG9uZSBpbiB0aGUgRENUIGl0c2VsZi4KKyAqIFRoZSBwcmltYXJ5IGRpc2FkdmFudGFnZSBvZiB0aGlzIG1ldGhvZCBpcyB0aGF0IHdpdGggZml4ZWQtcG9pbnQgbWF0aCwKKyAqIGFjY3VyYWN5IGlzIGxvc3QgZHVlIHRvIGltcHJlY2lzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2NhbGVkCisgKiBxdWFudGl6YXRpb24gdmFsdWVzLiAgVGhlIHNtYWxsZXIgdGhlIHF1YW50aXphdGlvbiB0YWJsZSBlbnRyeSwgdGhlIGxlc3MKKyAqIHByZWNpc2UgdGhlIHNjYWxlZCB2YWx1ZSwgc28gdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIHdvcnNlIHdpdGggaGlnaC0KKyAqIHF1YWxpdHktc2V0dGluZyBmaWxlcyB0aGFuIHdpdGggbG93LXF1YWxpdHkgb25lcy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiamRjdC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KKworI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKKworCisvKgorICogVGhpcyBtb2R1bGUgaXMgc3BlY2lhbGl6ZWQgdG8gdGhlIGNhc2UgRENUU0laRSA9IDguCisgKi8KKworI2lmIERDVFNJWkUgIT0gOAorICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCisjZW5kaWYKKworCisvKiBTY2FsaW5nIGRlY2lzaW9ucyBhcmUgZ2VuZXJhbGx5IHRoZSBzYW1lIGFzIGluIHRoZSBMTCZNIGFsZ29yaXRobTsKKyAqIHNlZSBqZmRjdGludC5jIGZvciBtb3JlIGRldGFpbHMuICBIb3dldmVyLCB3ZSBjaG9vc2UgdG8gZGVzY2FsZQorICogKHJpZ2h0IHNoaWZ0KSBtdWx0aXBsaWNhdGlvbiBwcm9kdWN0cyBhcyBzb29uIGFzIHRoZXkgYXJlIGZvcm1lZCwKKyAqIHJhdGhlciB0aGFuIGNhcnJ5aW5nIGFkZGl0aW9uYWwgZnJhY3Rpb25hbCBiaXRzIGludG8gc3Vic2VxdWVudCBhZGRpdGlvbnMuCisgKiBUaGlzIGNvbXByb21pc2VzIGFjY3VyYWN5IHNsaWdodGx5LCBidXQgaXQgbGV0cyB1cyBzYXZlIGEgZmV3IHNoaWZ0cy4KKyAqIE1vcmUgaW1wb3J0YW50bHksIDE2LWJpdCBhcml0aG1ldGljIGlzIHRoZW4gYWRlcXVhdGUgKGZvciA4LWJpdCBzYW1wbGVzKQorICogZXZlcnl3aGVyZSBleGNlcHQgaW4gdGhlIG11bHRpcGxpY2F0aW9ucyBwcm9wZXI7IHRoaXMgc2F2ZXMgYSBnb29kIGRlYWwKKyAqIG9mIHdvcmsgb24gMTYtYml0LWludCBtYWNoaW5lcy4KKyAqCisgKiBBZ2FpbiB0byBzYXZlIGEgZmV3IHNoaWZ0cywgdGhlIGludGVybWVkaWF0ZSByZXN1bHRzIGJldHdlZW4gcGFzcyAxIGFuZAorICogcGFzcyAyIGFyZSBub3QgdXBzY2FsZWQsIGJ1dCBhcmUgcmVwcmVzZW50ZWQgb25seSB0byBpbnRlZ3JhbCBwcmVjaXNpb24uCisgKgorICogQSBmaW5hbCBjb21wcm9taXNlIGlzIHRvIHJlcHJlc2VudCB0aGUgbXVsdGlwbGljYXRpdmUgY29uc3RhbnRzIHRvIG9ubHkKKyAqIDggZnJhY3Rpb25hbCBiaXRzLCByYXRoZXIgdGhhbiAxMy4gIFRoaXMgc2F2ZXMgc29tZSBzaGlmdGluZyB3b3JrIG9uIHNvbWUKKyAqIG1hY2hpbmVzLCBhbmQgbWF5IGFsc28gcmVkdWNlIHRoZSBjb3N0IG9mIG11bHRpcGxpY2F0aW9uIChzaW5jZSB0aGVyZQorICogYXJlIGZld2VyIG9uZS1iaXRzIGluIHRoZSBjb25zdGFudHMpLgorICovCisKKyNkZWZpbmUgQ09OU1RfQklUUyAgOAorCisKKy8qIFNvbWUgQyBjb21waWxlcnMgZmFpbCB0byByZWR1Y2UgIkZJWChjb25zdGFudCkiIGF0IGNvbXBpbGUgdGltZSwgdGh1cworICogY2F1c2luZyBhIGxvdCBvZiB1c2VsZXNzIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgYXQgcnVuIHRpbWUuCisgKiBUbyBnZXQgYXJvdW5kIHRoaXMgd2UgdXNlIHRoZSBmb2xsb3dpbmcgcHJlLWNhbGN1bGF0ZWQgY29uc3RhbnRzLgorICogSWYgeW91IGNoYW5nZSBDT05TVF9CSVRTIHlvdSBtYXkgd2FudCB0byBhZGQgYXBwcm9wcmlhdGUgdmFsdWVzLgorICogKFdpdGggYSByZWFzb25hYmxlIEMgY29tcGlsZXIsIHlvdSBjYW4ganVzdCByZWx5IG9uIHRoZSBGSVgoKSBtYWNyby4uLikKKyAqLworCisjaWYgQ09OU1RfQklUUyA9PSA4CisjZGVmaW5lIEZJWF8wXzM4MjY4MzQzMyAgKChJTlQzMikgICA5OCkJCS8qIEZJWCgwLjM4MjY4MzQzMykgKi8KKyNkZWZpbmUgRklYXzBfNTQxMTk2MTAwICAoKElOVDMyKSAgMTM5KQkJLyogRklYKDAuNTQxMTk2MTAwKSAqLworI2RlZmluZSBGSVhfMF83MDcxMDY3ODEgICgoSU5UMzIpICAxODEpCQkvKiBGSVgoMC43MDcxMDY3ODEpICovCisjZGVmaW5lIEZJWF8xXzMwNjU2Mjk2NSAgKChJTlQzMikgIDMzNCkJCS8qIEZJWCgxLjMwNjU2Mjk2NSkgKi8KKyNlbHNlCisjZGVmaW5lIEZJWF8wXzM4MjY4MzQzMyAgRklYKDAuMzgyNjgzNDMzKQorI2RlZmluZSBGSVhfMF81NDExOTYxMDAgIEZJWCgwLjU0MTE5NjEwMCkKKyNkZWZpbmUgRklYXzBfNzA3MTA2NzgxICBGSVgoMC43MDcxMDY3ODEpCisjZGVmaW5lIEZJWF8xXzMwNjU2Mjk2NSAgRklYKDEuMzA2NTYyOTY1KQorI2VuZGlmCisKKworLyogV2UgY2FuIGdhaW4gYSBsaXR0bGUgbW9yZSBzcGVlZCwgd2l0aCBhIGZ1cnRoZXIgY29tcHJvbWlzZSBpbiBhY2N1cmFjeSwKKyAqIGJ5IG9taXR0aW5nIHRoZSBhZGRpdGlvbiBpbiBhIGRlc2NhbGluZyBzaGlmdC4gIFRoaXMgeWllbGRzIGFuIGluY29ycmVjdGx5CisgKiByb3VuZGVkIHJlc3VsdCBoYWxmIHRoZSB0aW1lLi4uCisgKi8KKworI2lmbmRlZiBVU0VfQUNDVVJBVEVfUk9VTkRJTkcKKyN1bmRlZiBERVNDQUxFCisjZGVmaW5lIERFU0NBTEUoeCxuKSAgUklHSFRfU0hJRlQoeCwgbikKKyNlbmRpZgorCisKKy8qIE11bHRpcGx5IGEgRENURUxFTSB2YXJpYWJsZSBieSBhbiBJTlQzMiBjb25zdGFudCwgYW5kIGltbWVkaWF0ZWx5CisgKiBkZXNjYWxlIHRvIHlpZWxkIGEgRENURUxFTSByZXN1bHQuCisgKi8KKworI2RlZmluZSBNVUxUSVBMWSh2YXIsY29uc3QpICAoKERDVEVMRU0pIERFU0NBTEUoKHZhcikgKiAoY29uc3QpLCBDT05TVF9CSVRTKSkKKworCisvKgorICogUGVyZm9ybSB0aGUgZm9yd2FyZCBEQ1Qgb24gb25lIGJsb2NrIG9mIHNhbXBsZXMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2ZkY3RfaWZhc3QgKERDVEVMRU0gKiBkYXRhKQoreworICBEQ1RFTEVNIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgIERDVEVMRU0gdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTM7CisgIERDVEVMRU0gejEsIHoyLCB6MywgejQsIHo1LCB6MTEsIHoxMzsKKyAgRENURUxFTSAqZGF0YXB0cjsKKyAgaW50IGN0cjsKKyAgU0hJRlRfVEVNUFMKKworICAvKiBQYXNzIDE6IHByb2Nlc3Mgcm93cy4gKi8KKworICBkYXRhcHRyID0gZGF0YTsKKyAgZm9yIChjdHIgPSBEQ1RTSVpFLTE7IGN0ciA+PSAwOyBjdHItLSkgeworICAgIHRtcDAgPSBkYXRhcHRyWzBdICsgZGF0YXB0cls3XTsKKyAgICB0bXA3ID0gZGF0YXB0clswXSAtIGRhdGFwdHJbN107CisgICAgdG1wMSA9IGRhdGFwdHJbMV0gKyBkYXRhcHRyWzZdOworICAgIHRtcDYgPSBkYXRhcHRyWzFdIC0gZGF0YXB0cls2XTsKKyAgICB0bXAyID0gZGF0YXB0clsyXSArIGRhdGFwdHJbNV07CisgICAgdG1wNSA9IGRhdGFwdHJbMl0gLSBkYXRhcHRyWzVdOworICAgIHRtcDMgPSBkYXRhcHRyWzNdICsgZGF0YXB0cls0XTsKKyAgICB0bXA0ID0gZGF0YXB0clszXSAtIGRhdGFwdHJbNF07CisgICAgCisgICAgLyogRXZlbiBwYXJ0ICovCisgICAgCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMzsJLyogcGhhc2UgMiAqLworICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7CisgICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKKyAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOworICAgIAorICAgIGRhdGFwdHJbMF0gPSB0bXAxMCArIHRtcDExOyAvKiBwaGFzZSAzICovCisgICAgZGF0YXB0cls0XSA9IHRtcDEwIC0gdG1wMTE7CisgICAgCisgICAgejEgPSBNVUxUSVBMWSh0bXAxMiArIHRtcDEzLCBGSVhfMF83MDcxMDY3ODEpOyAvKiBjNCAqLworICAgIGRhdGFwdHJbMl0gPSB0bXAxMyArIHoxOwkvKiBwaGFzZSA1ICovCisgICAgZGF0YXB0cls2XSA9IHRtcDEzIC0gejE7CisgICAgCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDEwID0gdG1wNCArIHRtcDU7CS8qIHBoYXNlIDIgKi8KKyAgICB0bXAxMSA9IHRtcDUgKyB0bXA2OworICAgIHRtcDEyID0gdG1wNiArIHRtcDc7CisKKyAgICAvKiBUaGUgcm90YXRvciBpcyBtb2RpZmllZCBmcm9tIGZpZyA0LTggdG8gYXZvaWQgZXh0cmEgbmVnYXRpb25zLiAqLworICAgIHo1ID0gTVVMVElQTFkodG1wMTAgLSB0bXAxMiwgRklYXzBfMzgyNjgzNDMzKTsgLyogYzYgKi8KKyAgICB6MiA9IE1VTFRJUExZKHRtcDEwLCBGSVhfMF81NDExOTYxMDApICsgejU7IC8qIGMyLWM2ICovCisgICAgejQgPSBNVUxUSVBMWSh0bXAxMiwgRklYXzFfMzA2NTYyOTY1KSArIHo1OyAvKiBjMitjNiAqLworICAgIHozID0gTVVMVElQTFkodG1wMTEsIEZJWF8wXzcwNzEwNjc4MSk7IC8qIGM0ICovCisKKyAgICB6MTEgPSB0bXA3ICsgejM7CQkvKiBwaGFzZSA1ICovCisgICAgejEzID0gdG1wNyAtIHozOworCisgICAgZGF0YXB0cls1XSA9IHoxMyArIHoyOwkvKiBwaGFzZSA2ICovCisgICAgZGF0YXB0clszXSA9IHoxMyAtIHoyOworICAgIGRhdGFwdHJbMV0gPSB6MTEgKyB6NDsKKyAgICBkYXRhcHRyWzddID0gejExIC0gejQ7CisKKyAgICBkYXRhcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyBjb2x1bW5zLiAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7CisgICAgdG1wMCA9IGRhdGFwdHJbRENUU0laRSowXSArIGRhdGFwdHJbRENUU0laRSo3XTsKKyAgICB0bXA3ID0gZGF0YXB0cltEQ1RTSVpFKjBdIC0gZGF0YXB0cltEQ1RTSVpFKjddOworICAgIHRtcDEgPSBkYXRhcHRyW0RDVFNJWkUqMV0gKyBkYXRhcHRyW0RDVFNJWkUqNl07CisgICAgdG1wNiA9IGRhdGFwdHJbRENUU0laRSoxXSAtIGRhdGFwdHJbRENUU0laRSo2XTsKKyAgICB0bXAyID0gZGF0YXB0cltEQ1RTSVpFKjJdICsgZGF0YXB0cltEQ1RTSVpFKjVdOworICAgIHRtcDUgPSBkYXRhcHRyW0RDVFNJWkUqMl0gLSBkYXRhcHRyW0RDVFNJWkUqNV07CisgICAgdG1wMyA9IGRhdGFwdHJbRENUU0laRSozXSArIGRhdGFwdHJbRENUU0laRSo0XTsKKyAgICB0bXA0ID0gZGF0YXB0cltEQ1RTSVpFKjNdIC0gZGF0YXB0cltEQ1RTSVpFKjRdOworICAgIAorICAgIC8qIEV2ZW4gcGFydCAqLworICAgIAorICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CS8qIHBoYXNlIDIgKi8KKyAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOworICAgIHRtcDExID0gdG1wMSArIHRtcDI7CisgICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKKyAgICAKKyAgICBkYXRhcHRyW0RDVFNJWkUqMF0gPSB0bXAxMCArIHRtcDExOyAvKiBwaGFzZSAzICovCisgICAgZGF0YXB0cltEQ1RTSVpFKjRdID0gdG1wMTAgLSB0bXAxMTsKKyAgICAKKyAgICB6MSA9IE1VTFRJUExZKHRtcDEyICsgdG1wMTMsIEZJWF8wXzcwNzEwNjc4MSk7IC8qIGM0ICovCisgICAgZGF0YXB0cltEQ1RTSVpFKjJdID0gdG1wMTMgKyB6MTsgLyogcGhhc2UgNSAqLworICAgIGRhdGFwdHJbRENUU0laRSo2XSA9IHRtcDEzIC0gejE7CisgICAgCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDEwID0gdG1wNCArIHRtcDU7CS8qIHBoYXNlIDIgKi8KKyAgICB0bXAxMSA9IHRtcDUgKyB0bXA2OworICAgIHRtcDEyID0gdG1wNiArIHRtcDc7CisKKyAgICAvKiBUaGUgcm90YXRvciBpcyBtb2RpZmllZCBmcm9tIGZpZyA0LTggdG8gYXZvaWQgZXh0cmEgbmVnYXRpb25zLiAqLworICAgIHo1ID0gTVVMVElQTFkodG1wMTAgLSB0bXAxMiwgRklYXzBfMzgyNjgzNDMzKTsgLyogYzYgKi8KKyAgICB6MiA9IE1VTFRJUExZKHRtcDEwLCBGSVhfMF81NDExOTYxMDApICsgejU7IC8qIGMyLWM2ICovCisgICAgejQgPSBNVUxUSVBMWSh0bXAxMiwgRklYXzFfMzA2NTYyOTY1KSArIHo1OyAvKiBjMitjNiAqLworICAgIHozID0gTVVMVElQTFkodG1wMTEsIEZJWF8wXzcwNzEwNjc4MSk7IC8qIGM0ICovCisKKyAgICB6MTEgPSB0bXA3ICsgejM7CQkvKiBwaGFzZSA1ICovCisgICAgejEzID0gdG1wNyAtIHozOworCisgICAgZGF0YXB0cltEQ1RTSVpFKjVdID0gejEzICsgejI7IC8qIHBoYXNlIDYgKi8KKyAgICBkYXRhcHRyW0RDVFNJWkUqM10gPSB6MTMgLSB6MjsKKyAgICBkYXRhcHRyW0RDVFNJWkUqMV0gPSB6MTEgKyB6NDsKKyAgICBkYXRhcHRyW0RDVFNJWkUqN10gPSB6MTEgLSB6NDsKKworICAgIGRhdGFwdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KKyAgfQorfQorCisjZW5kaWYgLyogRENUX0lGQVNUX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pmZGN0aW50LmMgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamZkY3RpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTc4YjY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pmZGN0aW50LmMKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBqZmRjdGludC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYSBzbG93LWJ1dC1hY2N1cmF0ZSBpbnRlZ2VyIGltcGxlbWVudGF0aW9uIG9mIHRoZQorICogZm9yd2FyZCBEQ1QgKERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm0pLgorICoKKyAqIEEgMi1EIERDVCBjYW4gYmUgZG9uZSBieSAxLUQgRENUIG9uIGVhY2ggcm93IGZvbGxvd2VkIGJ5IDEtRCBEQ1QKKyAqIG9uIGVhY2ggY29sdW1uLiAgRGlyZWN0IGFsZ29yaXRobXMgYXJlIGFsc28gYXZhaWxhYmxlLCBidXQgdGhleSBhcmUKKyAqIG11Y2ggbW9yZSBjb21wbGV4IGFuZCBzZWVtIG5vdCB0byBiZSBhbnkgZmFzdGVyIHdoZW4gcmVkdWNlZCB0byBjb2RlLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gYW4gYWxnb3JpdGhtIGRlc2NyaWJlZCBpbgorICogICBDLiBMb2VmZmxlciwgQS4gTGlndGVuYmVyZyBhbmQgRy4gTW9zY2h5dHosICJQcmFjdGljYWwgRmFzdCAxLUQgRENUCisgKiAgIEFsZ29yaXRobXMgd2l0aCAxMSBNdWx0aXBsaWNhdGlvbnMiLCBQcm9jLiBJbnQnbC4gQ29uZi4gb24gQWNvdXN0aWNzLAorICogICBTcGVlY2gsIGFuZCBTaWduYWwgUHJvY2Vzc2luZyAxOTg5IChJQ0FTU1AgJzg5KSwgcHAuIDk4OC05OTEuCisgKiBUaGUgcHJpbWFyeSBhbGdvcml0aG0gZGVzY3JpYmVkIHRoZXJlIHVzZXMgMTEgbXVsdGlwbGllcyBhbmQgMjkgYWRkcy4KKyAqIFdlIHVzZSB0aGVpciBhbHRlcm5hdGUgbWV0aG9kIHdpdGggMTIgbXVsdGlwbGllcyBhbmQgMzIgYWRkcy4KKyAqIFRoZSBhZHZhbnRhZ2Ugb2YgdGhpcyBtZXRob2QgaXMgdGhhdCBubyBkYXRhIHBhdGggY29udGFpbnMgbW9yZSB0aGFuIG9uZQorICogbXVsdGlwbGljYXRpb247IHRoaXMgYWxsb3dzIGEgdmVyeSBzaW1wbGUgYW5kIGFjY3VyYXRlIGltcGxlbWVudGF0aW9uIGluCisgKiBzY2FsZWQgZml4ZWQtcG9pbnQgYXJpdGhtZXRpYywgd2l0aCBhIG1pbmltYWwgbnVtYmVyIG9mIHNoaWZ0cy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiamRjdC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KKworI2lmZGVmIERDVF9JU0xPV19TVVBQT1JURUQKKworCisvKgorICogVGhpcyBtb2R1bGUgaXMgc3BlY2lhbGl6ZWQgdG8gdGhlIGNhc2UgRENUU0laRSA9IDguCisgKi8KKworI2lmIERDVFNJWkUgIT0gOAorICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCisjZW5kaWYKKworCisvKgorICogVGhlIHBvb3Agb24gdGhpcyBzY2FsaW5nIHN0dWZmIGlzIGFzIGZvbGxvd3M6CisgKgorICogRWFjaCAxLUQgRENUIHN0ZXAgcHJvZHVjZXMgb3V0cHV0cyB3aGljaCBhcmUgYSBmYWN0b3Igb2Ygc3FydChOKQorICogbGFyZ2VyIHRoYW4gdGhlIHRydWUgRENUIG91dHB1dHMuICBUaGUgZmluYWwgb3V0cHV0cyBhcmUgdGhlcmVmb3JlCisgKiBhIGZhY3RvciBvZiBOIGxhcmdlciB0aGFuIGRlc2lyZWQ7IHNpbmNlIE49OCB0aGlzIGNhbiBiZSBjdXJlZCBieQorICogYSBzaW1wbGUgcmlnaHQgc2hpZnQgYXQgdGhlIGVuZCBvZiB0aGUgYWxnb3JpdGhtLiAgVGhlIGFkdmFudGFnZSBvZgorICogdGhpcyBhcnJhbmdlbWVudCBpcyB0aGF0IHdlIHNhdmUgdHdvIG11bHRpcGxpY2F0aW9ucyBwZXIgMS1EIERDVCwKKyAqIGJlY2F1c2UgdGhlIHkwIGFuZCB5NCBvdXRwdXRzIG5lZWQgbm90IGJlIGRpdmlkZWQgYnkgc3FydChOKS4KKyAqIEluIHRoZSBJSkcgY29kZSwgdGhpcyBmYWN0b3Igb2YgOCBpcyByZW1vdmVkIGJ5IHRoZSBxdWFudGl6YXRpb24gc3RlcAorICogKGluIGpjZGN0bWdyLmMpLCBOT1QgaW4gdGhpcyBtb2R1bGUuCisgKgorICogV2UgaGF2ZSB0byBkbyBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24gb2YgdGhlIGludGVnZXIgaW5wdXRzLCB3aGljaAorICogaXMgbm8gcHJvYmxlbSwgYW5kIG11bHRpcGxpY2F0aW9uIGJ5IGZyYWN0aW9uYWwgY29uc3RhbnRzLCB3aGljaCBpcworICogYSBwcm9ibGVtIHRvIGRvIGluIGludGVnZXIgYXJpdGhtZXRpYy4gIFdlIG11bHRpcGx5IGFsbCB0aGUgY29uc3RhbnRzCisgKiBieSBDT05TVF9TQ0FMRSBhbmQgY29udmVydCB0aGVtIHRvIGludGVnZXIgY29uc3RhbnRzICh0aHVzIHJldGFpbmluZworICogQ09OU1RfQklUUyBiaXRzIG9mIHByZWNpc2lvbiBpbiB0aGUgY29uc3RhbnRzKS4gIEFmdGVyIGRvaW5nIGEKKyAqIG11bHRpcGxpY2F0aW9uIHdlIGhhdmUgdG8gZGl2aWRlIHRoZSBwcm9kdWN0IGJ5IENPTlNUX1NDQUxFLCB3aXRoIHByb3BlcgorICogcm91bmRpbmcsIHRvIHByb2R1Y2UgdGhlIGNvcnJlY3Qgb3V0cHV0LiAgVGhpcyBkaXZpc2lvbiBjYW4gYmUgZG9uZQorICogY2hlYXBseSBhcyBhIHJpZ2h0IHNoaWZ0IG9mIENPTlNUX0JJVFMgYml0cy4gIFdlIHBvc3Rwb25lIHNoaWZ0aW5nCisgKiBhcyBsb25nIGFzIHBvc3NpYmxlIHNvIHRoYXQgcGFydGlhbCBzdW1zIGNhbiBiZSBhZGRlZCB0b2dldGhlciB3aXRoCisgKiBmdWxsIGZyYWN0aW9uYWwgcHJlY2lzaW9uLgorICoKKyAqIFRoZSBvdXRwdXRzIG9mIHRoZSBmaXJzdCBwYXNzIGFyZSBzY2FsZWQgdXAgYnkgUEFTUzFfQklUUyBiaXRzIHNvIHRoYXQKKyAqIHRoZXkgYXJlIHJlcHJlc2VudGVkIHRvIGJldHRlci10aGFuLWludGVncmFsIHByZWNpc2lvbi4gIFRoZXNlIG91dHB1dHMKKyAqIHJlcXVpcmUgQklUU19JTl9KU0FNUExFICsgUEFTUzFfQklUUyArIDMgYml0czsgdGhpcyBmaXRzIGluIGEgMTYtYml0IHdvcmQKKyAqIHdpdGggdGhlIHJlY29tbWVuZGVkIHNjYWxpbmcuICAoRm9yIDEyLWJpdCBzYW1wbGUgZGF0YSwgdGhlIGludGVybWVkaWF0ZQorICogYXJyYXkgaXMgSU5UMzIgYW55d2F5LikKKyAqCisgKiBUbyBhdm9pZCBvdmVyZmxvdyBvZiB0aGUgMzItYml0IGludGVybWVkaWF0ZSByZXN1bHRzIGluIHBhc3MgMiwgd2UgbXVzdAorICogaGF2ZSBCSVRTX0lOX0pTQU1QTEUgKyBDT05TVF9CSVRTICsgUEFTUzFfQklUUyA8PSAyNi4gIEVycm9yIGFuYWx5c2lzCisgKiBzaG93cyB0aGF0IHRoZSB2YWx1ZXMgZ2l2ZW4gYmVsb3cgYXJlIHRoZSBtb3N0IGVmZmVjdGl2ZS4KKyAqLworCisjaWYgQklUU19JTl9KU0FNUExFID09IDgKKyNkZWZpbmUgQ09OU1RfQklUUyAgMTMKKyNkZWZpbmUgUEFTUzFfQklUUyAgMgorI2Vsc2UKKyNkZWZpbmUgQ09OU1RfQklUUyAgMTMKKyNkZWZpbmUgUEFTUzFfQklUUyAgMQkJLyogbG9zZSBhIGxpdHRsZSBwcmVjaXNpb24gdG8gYXZvaWQgb3ZlcmZsb3cgKi8KKyNlbmRpZgorCisvKiBTb21lIEMgY29tcGlsZXJzIGZhaWwgdG8gcmVkdWNlICJGSVgoY29uc3RhbnQpIiBhdCBjb21waWxlIHRpbWUsIHRodXMKKyAqIGNhdXNpbmcgYSBsb3Qgb2YgdXNlbGVzcyBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zIGF0IHJ1biB0aW1lLgorICogVG8gZ2V0IGFyb3VuZCB0aGlzIHdlIHVzZSB0aGUgZm9sbG93aW5nIHByZS1jYWxjdWxhdGVkIGNvbnN0YW50cy4KKyAqIElmIHlvdSBjaGFuZ2UgQ09OU1RfQklUUyB5b3UgbWF5IHdhbnQgdG8gYWRkIGFwcHJvcHJpYXRlIHZhbHVlcy4KKyAqIChXaXRoIGEgcmVhc29uYWJsZSBDIGNvbXBpbGVyLCB5b3UgY2FuIGp1c3QgcmVseSBvbiB0aGUgRklYKCkgbWFjcm8uLi4pCisgKi8KKworI2lmIENPTlNUX0JJVFMgPT0gMTMKKyNkZWZpbmUgRklYXzBfMjk4NjMxMzM2ICAoKElOVDMyKSAgMjQ0NikJLyogRklYKDAuMjk4NjMxMzM2KSAqLworI2RlZmluZSBGSVhfMF8zOTAxODA2NDQgICgoSU5UMzIpICAzMTk2KQkvKiBGSVgoMC4zOTAxODA2NDQpICovCisjZGVmaW5lIEZJWF8wXzU0MTE5NjEwMCAgKChJTlQzMikgIDQ0MzMpCS8qIEZJWCgwLjU0MTE5NjEwMCkgKi8KKyNkZWZpbmUgRklYXzBfNzY1MzY2ODY1ICAoKElOVDMyKSAgNjI3MCkJLyogRklYKDAuNzY1MzY2ODY1KSAqLworI2RlZmluZSBGSVhfMF84OTk5NzYyMjMgICgoSU5UMzIpICA3MzczKQkvKiBGSVgoMC44OTk5NzYyMjMpICovCisjZGVmaW5lIEZJWF8xXzE3NTg3NTYwMiAgKChJTlQzMikgIDk2MzMpCS8qIEZJWCgxLjE3NTg3NTYwMikgKi8KKyNkZWZpbmUgRklYXzFfNTAxMzIxMTEwICAoKElOVDMyKSAgMTIyOTkpCS8qIEZJWCgxLjUwMTMyMTExMCkgKi8KKyNkZWZpbmUgRklYXzFfODQ3NzU5MDY1ICAoKElOVDMyKSAgMTUxMzcpCS8qIEZJWCgxLjg0Nzc1OTA2NSkgKi8KKyNkZWZpbmUgRklYXzFfOTYxNTcwNTYwICAoKElOVDMyKSAgMTYwNjkpCS8qIEZJWCgxLjk2MTU3MDU2MCkgKi8KKyNkZWZpbmUgRklYXzJfMDUzMTE5ODY5ICAoKElOVDMyKSAgMTY4MTkpCS8qIEZJWCgyLjA1MzExOTg2OSkgKi8KKyNkZWZpbmUgRklYXzJfNTYyOTE1NDQ3ICAoKElOVDMyKSAgMjA5OTUpCS8qIEZJWCgyLjU2MjkxNTQ0NykgKi8KKyNkZWZpbmUgRklYXzNfMDcyNzExMDI2ICAoKElOVDMyKSAgMjUxNzIpCS8qIEZJWCgzLjA3MjcxMTAyNikgKi8KKyNlbHNlCisjZGVmaW5lIEZJWF8wXzI5ODYzMTMzNiAgRklYKDAuMjk4NjMxMzM2KQorI2RlZmluZSBGSVhfMF8zOTAxODA2NDQgIEZJWCgwLjM5MDE4MDY0NCkKKyNkZWZpbmUgRklYXzBfNTQxMTk2MTAwICBGSVgoMC41NDExOTYxMDApCisjZGVmaW5lIEZJWF8wXzc2NTM2Njg2NSAgRklYKDAuNzY1MzY2ODY1KQorI2RlZmluZSBGSVhfMF84OTk5NzYyMjMgIEZJWCgwLjg5OTk3NjIyMykKKyNkZWZpbmUgRklYXzFfMTc1ODc1NjAyICBGSVgoMS4xNzU4NzU2MDIpCisjZGVmaW5lIEZJWF8xXzUwMTMyMTExMCAgRklYKDEuNTAxMzIxMTEwKQorI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgIEZJWCgxLjg0Nzc1OTA2NSkKKyNkZWZpbmUgRklYXzFfOTYxNTcwNTYwICBGSVgoMS45NjE1NzA1NjApCisjZGVmaW5lIEZJWF8yXzA1MzExOTg2OSAgRklYKDIuMDUzMTE5ODY5KQorI2RlZmluZSBGSVhfMl81NjI5MTU0NDcgIEZJWCgyLjU2MjkxNTQ0NykKKyNkZWZpbmUgRklYXzNfMDcyNzExMDI2ICBGSVgoMy4wNzI3MTEwMjYpCisjZW5kaWYKKworCisvKiBNdWx0aXBseSBhbiBJTlQzMiB2YXJpYWJsZSBieSBhbiBJTlQzMiBjb25zdGFudCB0byB5aWVsZCBhbiBJTlQzMiByZXN1bHQuCisgKiBGb3IgOC1iaXQgc2FtcGxlcyB3aXRoIHRoZSByZWNvbW1lbmRlZCBzY2FsaW5nLCBhbGwgdGhlIHZhcmlhYmxlCisgKiBhbmQgY29uc3RhbnQgdmFsdWVzIGludm9sdmVkIGFyZSBubyBtb3JlIHRoYW4gMTYgYml0cyB3aWRlLCBzbyBhCisgKiAxNngxNi0+MzIgYml0IG11bHRpcGx5IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYSBmdWxsIDMyeDMyIG11bHRpcGx5LgorICogRm9yIDEyLWJpdCBzYW1wbGVzLCBhIGZ1bGwgMzItYml0IG11bHRpcGxpY2F0aW9uIHdpbGwgYmUgbmVlZGVkLgorICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorI2RlZmluZSBNVUxUSVBMWSh2YXIsY29uc3QpICBNVUxUSVBMWTE2QzE2KHZhcixjb25zdCkKKyNlbHNlCisjZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgICgodmFyKSAqIChjb25zdCkpCisjZW5kaWYKKworCisvKgorICogUGVyZm9ybSB0aGUgZm9yd2FyZCBEQ1Qgb24gb25lIGJsb2NrIG9mIHNhbXBsZXMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2ZkY3RfaXNsb3cgKERDVEVMRU0gKiBkYXRhKQoreworICBJTlQzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICBJTlQzMiB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKKyAgSU5UMzIgejEsIHoyLCB6MywgejQsIHo1OworICBEQ1RFTEVNICpkYXRhcHRyOworICBpbnQgY3RyOworICBTSElGVF9URU1QUworCisgIC8qIFBhc3MgMTogcHJvY2VzcyByb3dzLiAqLworICAvKiBOb3RlIHJlc3VsdHMgYXJlIHNjYWxlZCB1cCBieSBzcXJ0KDgpIGNvbXBhcmVkIHRvIGEgdHJ1ZSBEQ1Q7ICovCisgIC8qIGZ1cnRoZXJtb3JlLCB3ZSBzY2FsZSB0aGUgcmVzdWx0cyBieSAyKipQQVNTMV9CSVRTLiAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7CisgICAgdG1wMCA9IGRhdGFwdHJbMF0gKyBkYXRhcHRyWzddOworICAgIHRtcDcgPSBkYXRhcHRyWzBdIC0gZGF0YXB0cls3XTsKKyAgICB0bXAxID0gZGF0YXB0clsxXSArIGRhdGFwdHJbNl07CisgICAgdG1wNiA9IGRhdGFwdHJbMV0gLSBkYXRhcHRyWzZdOworICAgIHRtcDIgPSBkYXRhcHRyWzJdICsgZGF0YXB0cls1XTsKKyAgICB0bXA1ID0gZGF0YXB0clsyXSAtIGRhdGFwdHJbNV07CisgICAgdG1wMyA9IGRhdGFwdHJbM10gKyBkYXRhcHRyWzRdOworICAgIHRtcDQgPSBkYXRhcHRyWzNdIC0gZGF0YXB0cls0XTsKKyAgICAKKyAgICAvKiBFdmVuIHBhcnQgcGVyIExMJk0gZmlndXJlIDEgLS0tIG5vdGUgdGhhdCBwdWJsaXNoZWQgZmlndXJlIGlzIGZhdWx0eTsKKyAgICAgKiByb3RhdG9yICJzcXJ0KDIpKmMxIiBzaG91bGQgYmUgInNxcnQoMikqYzYiLgorICAgICAqLworICAgIAorICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CisgICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKKyAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7CisgICAgCisgICAgZGF0YXB0clswXSA9IChEQ1RFTEVNKSAoKHRtcDEwICsgdG1wMTEpIDw8IFBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbNF0gPSAoRENURUxFTSkgKCh0bXAxMCAtIHRtcDExKSA8PCBQQVNTMV9CSVRTKTsKKyAgICAKKyAgICB6MSA9IE1VTFRJUExZKHRtcDEyICsgdG1wMTMsIEZJWF8wXzU0MTE5NjEwMCk7CisgICAgZGF0YXB0clsyXSA9IChEQ1RFTEVNKSBERVNDQUxFKHoxICsgTVVMVElQTFkodG1wMTMsIEZJWF8wXzc2NTM2Njg2NSksCisJCQkJICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzZdID0gKERDVEVMRU0pIERFU0NBTEUoejEgKyBNVUxUSVBMWSh0bXAxMiwgLSBGSVhfMV84NDc3NTkwNjUpLAorCQkJCSAgIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgCisgICAgLyogT2RkIHBhcnQgcGVyIGZpZ3VyZSA4IC0tLSBub3RlIHBhcGVyIG9taXRzIGZhY3RvciBvZiBzcXJ0KDIpLgorICAgICAqIGNLIHJlcHJlc2VudHMgY29zKEsqcGkvMTYpLgorICAgICAqIGkwLi5pMyBpbiB0aGUgcGFwZXIgYXJlIHRtcDQuLnRtcDcgaGVyZS4KKyAgICAgKi8KKyAgICAKKyAgICB6MSA9IHRtcDQgKyB0bXA3OworICAgIHoyID0gdG1wNSArIHRtcDY7CisgICAgejMgPSB0bXA0ICsgdG1wNjsKKyAgICB6NCA9IHRtcDUgKyB0bXA3OworICAgIHo1ID0gTVVMVElQTFkoejMgKyB6NCwgRklYXzFfMTc1ODc1NjAyKTsgLyogc3FydCgyKSAqIGMzICovCisgICAgCisgICAgdG1wNCA9IE1VTFRJUExZKHRtcDQsIEZJWF8wXzI5ODYzMTMzNik7IC8qIHNxcnQoMikgKiAoLWMxK2MzK2M1LWM3KSAqLworICAgIHRtcDUgPSBNVUxUSVBMWSh0bXA1LCBGSVhfMl8wNTMxMTk4NjkpOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNStjNykgKi8KKyAgICB0bXA2ID0gTVVMVElQTFkodG1wNiwgRklYXzNfMDcyNzExMDI2KTsgLyogc3FydCgyKSAqICggYzErYzMrYzUtYzcpICovCisgICAgdG1wNyA9IE1VTFRJUExZKHRtcDcsIEZJWF8xXzUwMTMyMTExMCk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1LWM3KSAqLworICAgIHoxID0gTVVMVElQTFkoejEsIC0gRklYXzBfODk5OTc2MjIzKTsgLyogc3FydCgyKSAqIChjNy1jMykgKi8KKyAgICB6MiA9IE1VTFRJUExZKHoyLCAtIEZJWF8yXzU2MjkxNTQ0Nyk7IC8qIHNxcnQoMikgKiAoLWMxLWMzKSAqLworICAgIHozID0gTVVMVElQTFkoejMsIC0gRklYXzFfOTYxNTcwNTYwKTsgLyogc3FydCgyKSAqICgtYzMtYzUpICovCisgICAgejQgPSBNVUxUSVBMWSh6NCwgLSBGSVhfMF8zOTAxODA2NDQpOyAvKiBzcXJ0KDIpICogKGM1LWMzKSAqLworICAgIAorICAgIHozICs9IHo1OworICAgIHo0ICs9IHo1OworICAgIAorICAgIGRhdGFwdHJbN10gPSAoRENURUxFTSkgREVTQ0FMRSh0bXA0ICsgejEgKyB6MywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzVdID0gKERDVEVMRU0pIERFU0NBTEUodG1wNSArIHoyICsgejQsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgZGF0YXB0clszXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDYgKyB6MiArIHozLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbMV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXA3ICsgejEgKyB6NCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICAKKyAgICBkYXRhcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyBjb2x1bW5zLgorICAgKiBXZSByZW1vdmUgdGhlIFBBU1MxX0JJVFMgc2NhbGluZywgYnV0IGxlYXZlIHRoZSByZXN1bHRzIHNjYWxlZCB1cAorICAgKiBieSBhbiBvdmVyYWxsIGZhY3RvciBvZiA4LgorICAgKi8KKworICBkYXRhcHRyID0gZGF0YTsKKyAgZm9yIChjdHIgPSBEQ1RTSVpFLTE7IGN0ciA+PSAwOyBjdHItLSkgeworICAgIHRtcDAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gKyBkYXRhcHRyW0RDVFNJWkUqN107CisgICAgdG1wNyA9IGRhdGFwdHJbRENUU0laRSowXSAtIGRhdGFwdHJbRENUU0laRSo3XTsKKyAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdICsgZGF0YXB0cltEQ1RTSVpFKjZdOworICAgIHRtcDYgPSBkYXRhcHRyW0RDVFNJWkUqMV0gLSBkYXRhcHRyW0RDVFNJWkUqNl07CisgICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXSArIGRhdGFwdHJbRENUU0laRSo1XTsKKyAgICB0bXA1ID0gZGF0YXB0cltEQ1RTSVpFKjJdIC0gZGF0YXB0cltEQ1RTSVpFKjVdOworICAgIHRtcDMgPSBkYXRhcHRyW0RDVFNJWkUqM10gKyBkYXRhcHRyW0RDVFNJWkUqNF07CisgICAgdG1wNCA9IGRhdGFwdHJbRENUU0laRSozXSAtIGRhdGFwdHJbRENUU0laRSo0XTsKKyAgICAKKyAgICAvKiBFdmVuIHBhcnQgcGVyIExMJk0gZmlndXJlIDEgLS0tIG5vdGUgdGhhdCBwdWJsaXNoZWQgZmlndXJlIGlzIGZhdWx0eTsKKyAgICAgKiByb3RhdG9yICJzcXJ0KDIpKmMxIiBzaG91bGQgYmUgInNxcnQoMikqYzYiLgorICAgICAqLworICAgIAorICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CisgICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKKyAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7CisgICAgCisgICAgZGF0YXB0cltEQ1RTSVpFKjBdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMTAgKyB0bXAxMSwgUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjRdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMTAgLSB0bXAxMSwgUEFTUzFfQklUUyk7CisgICAgCisgICAgejEgPSBNVUxUSVBMWSh0bXAxMiArIHRtcDEzLCBGSVhfMF81NDExOTYxMDApOworICAgIGRhdGFwdHJbRENUU0laRSoyXSA9IChEQ1RFTEVNKSBERVNDQUxFKHoxICsgTVVMVElQTFkodG1wMTMsIEZJWF8wXzc2NTM2Njg2NSksCisJCQkJCSAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjZdID0gKERDVEVMRU0pIERFU0NBTEUoejEgKyBNVUxUSVBMWSh0bXAxMiwgLSBGSVhfMV84NDc3NTkwNjUpLAorCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIAorICAgIC8qIE9kZCBwYXJ0IHBlciBmaWd1cmUgOCAtLS0gbm90ZSBwYXBlciBvbWl0cyBmYWN0b3Igb2Ygc3FydCgyKS4KKyAgICAgKiBjSyByZXByZXNlbnRzIGNvcyhLKnBpLzE2KS4KKyAgICAgKiBpMC4uaTMgaW4gdGhlIHBhcGVyIGFyZSB0bXA0Li50bXA3IGhlcmUuCisgICAgICovCisgICAgCisgICAgejEgPSB0bXA0ICsgdG1wNzsKKyAgICB6MiA9IHRtcDUgKyB0bXA2OworICAgIHozID0gdG1wNCArIHRtcDY7CisgICAgejQgPSB0bXA1ICsgdG1wNzsKKyAgICB6NSA9IE1VTFRJUExZKHozICsgejQsIEZJWF8xXzE3NTg3NTYwMik7IC8qIHNxcnQoMikgKiBjMyAqLworICAgIAorICAgIHRtcDQgPSBNVUxUSVBMWSh0bXA0LCBGSVhfMF8yOTg2MzEzMzYpOyAvKiBzcXJ0KDIpICogKC1jMStjMytjNS1jNykgKi8KKyAgICB0bXA1ID0gTVVMVElQTFkodG1wNSwgRklYXzJfMDUzMTE5ODY5KTsgLyogc3FydCgyKSAqICggYzErYzMtYzUrYzcpICovCisgICAgdG1wNiA9IE1VTFRJUExZKHRtcDYsIEZJWF8zXzA3MjcxMTAyNik7IC8qIHNxcnQoMikgKiAoIGMxK2MzK2M1LWM3KSAqLworICAgIHRtcDcgPSBNVUxUSVBMWSh0bXA3LCBGSVhfMV81MDEzMjExMTApOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNS1jNykgKi8KKyAgICB6MSA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzg5OTk3NjIyMyk7IC8qIHNxcnQoMikgKiAoYzctYzMpICovCisgICAgejIgPSBNVUxUSVBMWSh6MiwgLSBGSVhfMl81NjI5MTU0NDcpOyAvKiBzcXJ0KDIpICogKC1jMS1jMykgKi8KKyAgICB6MyA9IE1VTFRJUExZKHozLCAtIEZJWF8xXzk2MTU3MDU2MCk7IC8qIHNxcnQoMikgKiAoLWMzLWM1KSAqLworICAgIHo0ID0gTVVMVElQTFkoejQsIC0gRklYXzBfMzkwMTgwNjQ0KTsgLyogc3FydCgyKSAqIChjNS1jMykgKi8KKyAgICAKKyAgICB6MyArPSB6NTsKKyAgICB6NCArPSB6NTsKKyAgICAKKyAgICBkYXRhcHRyW0RDVFNJWkUqN10gPSAoRENURUxFTSkgREVTQ0FMRSh0bXA0ICsgejEgKyB6MywKKwkJCQkJICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqNV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXA1ICsgejIgKyB6NCwKKwkJCQkJICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqM10gPSAoRENURUxFTSkgREVTQ0FMRSh0bXA2ICsgejIgKyB6MywKKwkJCQkJICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqMV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXA3ICsgejEgKyB6NCwKKwkJCQkJICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICAKKyAgICBkYXRhcHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgY29sdW1uICovCisgIH0KK30KKworI2VuZGlmIC8qIERDVF9JU0xPV19TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qaWRjdGZzdC5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2ppZGN0ZnN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJhNDIxNgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qaWRjdGZzdC5jCkBAIC0wLDAgKzEsMzY4IEBACisvKgorICogamlkY3Rmc3QuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgZmFzdCwgbm90IHNvIGFjY3VyYXRlIGludGVnZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlCisgKiBpbnZlcnNlIERDVCAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuICBJbiB0aGUgSUpHIGNvZGUsIHRoaXMgcm91dGluZQorICogbXVzdCBhbHNvIHBlcmZvcm0gZGVxdWFudGl6YXRpb24gb2YgdGhlIGlucHV0IGNvZWZmaWNpZW50cy4KKyAqCisgKiBBIDItRCBJRENUIGNhbiBiZSBkb25lIGJ5IDEtRCBJRENUIG9uIGVhY2ggY29sdW1uIGZvbGxvd2VkIGJ5IDEtRCBJRENUCisgKiBvbiBlYWNoIHJvdyAob3IgdmljZSB2ZXJzYSwgYnV0IGl0J3MgbW9yZSBjb252ZW5pZW50IHRvIGVtaXQgYSByb3cgYXQKKyAqIGEgdGltZSkuICBEaXJlY3QgYWxnb3JpdGhtcyBhcmUgYWxzbyBhdmFpbGFibGUsIGJ1dCB0aGV5IGFyZSBtdWNoIG1vcmUKKyAqIGNvbXBsZXggYW5kIHNlZW0gbm90IHRvIGJlIGFueSBmYXN0ZXIgd2hlbiByZWR1Y2VkIHRvIGNvZGUuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBBcmFpLCBBZ3VpLCBhbmQgTmFrYWppbWEncyBhbGdvcml0aG0gZm9yCisgKiBzY2FsZWQgRENULiAgVGhlaXIgb3JpZ2luYWwgcGFwZXIgKFRyYW5zLiBJRUlDRSBFLTcxKDExKToxMDk1KSBpcyBpbgorICogSmFwYW5lc2UsIGJ1dCB0aGUgYWxnb3JpdGhtIGlzIGRlc2NyaWJlZCBpbiB0aGUgUGVubmViYWtlciAmIE1pdGNoZWxsCisgKiBKUEVHIHRleHRib29rIChzZWUgUkVGRVJFTkNFUyBzZWN0aW9uIGluIGZpbGUgUkVBRE1FKS4gIFRoZSBmb2xsb3dpbmcgY29kZQorICogaXMgYmFzZWQgZGlyZWN0bHkgb24gZmlndXJlIDQtOCBpbiBQJk0uCisgKiBXaGlsZSBhbiA4LXBvaW50IERDVCBjYW5ub3QgYmUgZG9uZSBpbiBsZXNzIHRoYW4gMTEgbXVsdGlwbGllcywgaXQgaXMKKyAqIHBvc3NpYmxlIHRvIGFycmFuZ2UgdGhlIGNvbXB1dGF0aW9uIHNvIHRoYXQgbWFueSBvZiB0aGUgbXVsdGlwbGllcyBhcmUKKyAqIHNpbXBsZSBzY2FsaW5ncyBvZiB0aGUgZmluYWwgb3V0cHV0cy4gIFRoZXNlIG11bHRpcGxpZXMgY2FuIHRoZW4gYmUKKyAqIGZvbGRlZCBpbnRvIHRoZSBtdWx0aXBsaWNhdGlvbnMgb3IgZGl2aXNpb25zIGJ5IHRoZSBKUEVHIHF1YW50aXphdGlvbgorICogdGFibGUgZW50cmllcy4gIFRoZSBBQSZOIG1ldGhvZCBsZWF2ZXMgb25seSA1IG11bHRpcGxpZXMgYW5kIDI5IGFkZHMKKyAqIHRvIGJlIGRvbmUgaW4gdGhlIERDVCBpdHNlbGYuCisgKiBUaGUgcHJpbWFyeSBkaXNhZHZhbnRhZ2Ugb2YgdGhpcyBtZXRob2QgaXMgdGhhdCB3aXRoIGZpeGVkLXBvaW50IG1hdGgsCisgKiBhY2N1cmFjeSBpcyBsb3N0IGR1ZSB0byBpbXByZWNpc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNjYWxlZAorICogcXVhbnRpemF0aW9uIHZhbHVlcy4gIFRoZSBzbWFsbGVyIHRoZSBxdWFudGl6YXRpb24gdGFibGUgZW50cnksIHRoZSBsZXNzCisgKiBwcmVjaXNlIHRoZSBzY2FsZWQgdmFsdWUsIHNvIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyB3b3JzZSB3aXRoIGhpZ2gtCisgKiBxdWFsaXR5LXNldHRpbmcgZmlsZXMgdGhhbiB3aXRoIGxvdy1xdWFsaXR5IG9uZXMuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImpkY3QuaCIJCS8qIFByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBEQ1Qgc3Vic3lzdGVtICovCisKKyNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECisKKworLyoKKyAqIFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgorICovCisKKyNpZiBEQ1RTSVpFICE9IDgKKyAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLworI2VuZGlmCisKKworLyogU2NhbGluZyBkZWNpc2lvbnMgYXJlIGdlbmVyYWxseSB0aGUgc2FtZSBhcyBpbiB0aGUgTEwmTSBhbGdvcml0aG07CisgKiBzZWUgamlkY3RpbnQuYyBmb3IgbW9yZSBkZXRhaWxzLiAgSG93ZXZlciwgd2UgY2hvb3NlIHRvIGRlc2NhbGUKKyAqIChyaWdodCBzaGlmdCkgbXVsdGlwbGljYXRpb24gcHJvZHVjdHMgYXMgc29vbiBhcyB0aGV5IGFyZSBmb3JtZWQsCisgKiByYXRoZXIgdGhhbiBjYXJyeWluZyBhZGRpdGlvbmFsIGZyYWN0aW9uYWwgYml0cyBpbnRvIHN1YnNlcXVlbnQgYWRkaXRpb25zLgorICogVGhpcyBjb21wcm9taXNlcyBhY2N1cmFjeSBzbGlnaHRseSwgYnV0IGl0IGxldHMgdXMgc2F2ZSBhIGZldyBzaGlmdHMuCisgKiBNb3JlIGltcG9ydGFudGx5LCAxNi1iaXQgYXJpdGhtZXRpYyBpcyB0aGVuIGFkZXF1YXRlIChmb3IgOC1iaXQgc2FtcGxlcykKKyAqIGV2ZXJ5d2hlcmUgZXhjZXB0IGluIHRoZSBtdWx0aXBsaWNhdGlvbnMgcHJvcGVyOyB0aGlzIHNhdmVzIGEgZ29vZCBkZWFsCisgKiBvZiB3b3JrIG9uIDE2LWJpdC1pbnQgbWFjaGluZXMuCisgKgorICogVGhlIGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cyBhcmUgbm90IGludGVnZXJzIGJlY2F1c2UgdGhlIEFBJk4gc2NhbGluZworICogZmFjdG9ycyBoYXZlIGJlZW4gaW5jb3Jwb3JhdGVkLiAgV2UgcmVwcmVzZW50IHRoZW0gc2NhbGVkIHVwIGJ5IFBBU1MxX0JJVFMsCisgKiBzbyB0aGF0IHRoZSBmaXJzdCBhbmQgc2Vjb25kIElEQ1Qgcm91bmRzIGhhdmUgdGhlIHNhbWUgaW5wdXQgc2NhbGluZy4KKyAqIEZvciA4LWJpdCBKU0FNUExFcywgd2UgY2hvb3NlIElGQVNUX1NDQUxFX0JJVFMgPSBQQVNTMV9CSVRTIHNvIGFzIHRvCisgKiBhdm9pZCBhIGRlc2NhbGluZyBzaGlmdDsgdGhpcyBjb21wcm9taXNlcyBhY2N1cmFjeSByYXRoZXIgZHJhc3RpY2FsbHkKKyAqIGZvciBzbWFsbCBxdWFudGl6YXRpb24gdGFibGUgZW50cmllcywgYnV0IGl0IHNhdmVzIGEgbG90IG9mIHNoaWZ0cy4KKyAqIEZvciAxMi1iaXQgSlNBTVBMRXMsIHRoZXJlJ3Mgbm8gaG9wZSBvZiB1c2luZyAxNngxNiBtdWx0aXBsaWVzIGFueXdheSwKKyAqIHNvIHdlIHVzZSBhIG11Y2ggbGFyZ2VyIHNjYWxpbmcgZmFjdG9yIHRvIHByZXNlcnZlIGFjY3VyYWN5LgorICoKKyAqIEEgZmluYWwgY29tcHJvbWlzZSBpcyB0byByZXByZXNlbnQgdGhlIG11bHRpcGxpY2F0aXZlIGNvbnN0YW50cyB0byBvbmx5CisgKiA4IGZyYWN0aW9uYWwgYml0cywgcmF0aGVyIHRoYW4gMTMuICBUaGlzIHNhdmVzIHNvbWUgc2hpZnRpbmcgd29yayBvbiBzb21lCisgKiBtYWNoaW5lcywgYW5kIG1heSBhbHNvIHJlZHVjZSB0aGUgY29zdCBvZiBtdWx0aXBsaWNhdGlvbiAoc2luY2UgdGhlcmUKKyAqIGFyZSBmZXdlciBvbmUtYml0cyBpbiB0aGUgY29uc3RhbnRzKS4KKyAqLworCisjaWYgQklUU19JTl9KU0FNUExFID09IDgKKyNkZWZpbmUgQ09OU1RfQklUUyAgOAorI2RlZmluZSBQQVNTMV9CSVRTICAyCisjZWxzZQorI2RlZmluZSBDT05TVF9CSVRTICA4CisjZGVmaW5lIFBBU1MxX0JJVFMgIDEJCS8qIGxvc2UgYSBsaXR0bGUgcHJlY2lzaW9uIHRvIGF2b2lkIG92ZXJmbG93ICovCisjZW5kaWYKKworLyogU29tZSBDIGNvbXBpbGVycyBmYWlsIHRvIHJlZHVjZSAiRklYKGNvbnN0YW50KSIgYXQgY29tcGlsZSB0aW1lLCB0aHVzCisgKiBjYXVzaW5nIGEgbG90IG9mIHVzZWxlc3MgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyBhdCBydW4gdGltZS4KKyAqIFRvIGdldCBhcm91bmQgdGhpcyB3ZSB1c2UgdGhlIGZvbGxvd2luZyBwcmUtY2FsY3VsYXRlZCBjb25zdGFudHMuCisgKiBJZiB5b3UgY2hhbmdlIENPTlNUX0JJVFMgeW91IG1heSB3YW50IHRvIGFkZCBhcHByb3ByaWF0ZSB2YWx1ZXMuCisgKiAoV2l0aCBhIHJlYXNvbmFibGUgQyBjb21waWxlciwgeW91IGNhbiBqdXN0IHJlbHkgb24gdGhlIEZJWCgpIG1hY3JvLi4uKQorICovCisKKyNpZiBDT05TVF9CSVRTID09IDgKKyNkZWZpbmUgRklYXzFfMDgyMzkyMjAwICAoKElOVDMyKSAgMjc3KQkJLyogRklYKDEuMDgyMzkyMjAwKSAqLworI2RlZmluZSBGSVhfMV80MTQyMTM1NjIgICgoSU5UMzIpICAzNjIpCQkvKiBGSVgoMS40MTQyMTM1NjIpICovCisjZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAgKChJTlQzMikgIDQ3MykJCS8qIEZJWCgxLjg0Nzc1OTA2NSkgKi8KKyNkZWZpbmUgRklYXzJfNjEzMTI1OTMwICAoKElOVDMyKSAgNjY5KQkJLyogRklYKDIuNjEzMTI1OTMwKSAqLworI2Vsc2UKKyNkZWZpbmUgRklYXzFfMDgyMzkyMjAwICBGSVgoMS4wODIzOTIyMDApCisjZGVmaW5lIEZJWF8xXzQxNDIxMzU2MiAgRklYKDEuNDE0MjEzNTYyKQorI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgIEZJWCgxLjg0Nzc1OTA2NSkKKyNkZWZpbmUgRklYXzJfNjEzMTI1OTMwICBGSVgoMi42MTMxMjU5MzApCisjZW5kaWYKKworCisvKiBXZSBjYW4gZ2FpbiBhIGxpdHRsZSBtb3JlIHNwZWVkLCB3aXRoIGEgZnVydGhlciBjb21wcm9taXNlIGluIGFjY3VyYWN5LAorICogYnkgb21pdHRpbmcgdGhlIGFkZGl0aW9uIGluIGEgZGVzY2FsaW5nIHNoaWZ0LiAgVGhpcyB5aWVsZHMgYW4gaW5jb3JyZWN0bHkKKyAqIHJvdW5kZWQgcmVzdWx0IGhhbGYgdGhlIHRpbWUuLi4KKyAqLworCisjaWZuZGVmIFVTRV9BQ0NVUkFURV9ST1VORElORworI3VuZGVmIERFU0NBTEUKKyNkZWZpbmUgREVTQ0FMRSh4LG4pICBSSUdIVF9TSElGVCh4LCBuKQorI2VuZGlmCisKKworLyogTXVsdGlwbHkgYSBEQ1RFTEVNIHZhcmlhYmxlIGJ5IGFuIElOVDMyIGNvbnN0YW50LCBhbmQgaW1tZWRpYXRlbHkKKyAqIGRlc2NhbGUgdG8geWllbGQgYSBEQ1RFTEVNIHJlc3VsdC4KKyAqLworCisjZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgICgoRENURUxFTSkgREVTQ0FMRSgodmFyKSAqIChjb25zdCksIENPTlNUX0JJVFMpKQorCisKKy8qIERlcXVhbnRpemUgYSBjb2VmZmljaWVudCBieSBtdWx0aXBseWluZyBpdCBieSB0aGUgbXVsdGlwbGllci10YWJsZQorICogZW50cnk7IHByb2R1Y2UgYSBEQ1RFTEVNIHJlc3VsdC4gIEZvciA4LWJpdCBkYXRhIGEgMTZ4MTYtPjE2CisgKiBtdWx0aXBsaWNhdGlvbiB3aWxsIGRvLiAgRm9yIDEyLWJpdCBkYXRhLCB0aGUgbXVsdGlwbGllciB0YWJsZSBpcworICogZGVjbGFyZWQgSU5UMzIsIHNvIGEgMzItYml0IG11bHRpcGx5IHdpbGwgYmUgdXNlZC4KKyAqLworCisjaWYgQklUU19JTl9KU0FNUExFID09IDgKKyNkZWZpbmUgREVRVUFOVElaRShjb2VmLHF1YW50dmFsKSAgKCgoSUZBU1RfTVVMVF9UWVBFKSAoY29lZikpICogKHF1YW50dmFsKSkKKyNlbHNlCisjZGVmaW5lIERFUVVBTlRJWkUoY29lZixxdWFudHZhbCkgIFwKKwlERVNDQUxFKChjb2VmKSoocXVhbnR2YWwpLCBJRkFTVF9TQ0FMRV9CSVRTLVBBU1MxX0JJVFMpCisjZW5kaWYKKworCisvKiBMaWtlIERFU0NBTEUsIGJ1dCBhcHBsaWVzIHRvIGEgRENURUxFTSBhbmQgcHJvZHVjZXMgYW4gaW50LgorICogV2UgYXNzdW1lIHRoYXQgaW50IHJpZ2h0IHNoaWZ0IGlzIHVuc2lnbmVkIGlmIElOVDMyIHJpZ2h0IHNoaWZ0IGlzLgorICovCisKKyNpZmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorI2RlZmluZSBJU0hJRlRfVEVNUFMJRENURUxFTSBpc2hpZnRfdGVtcDsKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorI2RlZmluZSBEQ1RFTEVNQklUUyAgMTYJCS8qIERDVEVMRU0gbWF5IGJlIDE2IG9yIDMyIGJpdHMgKi8KKyNlbHNlCisjZGVmaW5lIERDVEVMRU1CSVRTICAzMgkJLyogRENURUxFTSBtdXN0IGJlIDMyIGJpdHMgKi8KKyNlbmRpZgorI2RlZmluZSBJUklHSFRfU0hJRlQoeCxzaGZ0KSAgXAorICAgICgoaXNoaWZ0X3RlbXAgPSAoeCkpIDwgMCA/IFwKKyAgICAgKGlzaGlmdF90ZW1wID4+IChzaGZ0KSkgfCAoKH4oKERDVEVMRU0pIDApKSA8PCAoRENURUxFTUJJVFMtKHNoZnQpKSkgOiBcCisgICAgIChpc2hpZnRfdGVtcCA+PiAoc2hmdCkpKQorI2Vsc2UKKyNkZWZpbmUgSVNISUZUX1RFTVBTCisjZGVmaW5lIElSSUdIVF9TSElGVCh4LHNoZnQpCSgoeCkgPj4gKHNoZnQpKQorI2VuZGlmCisKKyNpZmRlZiBVU0VfQUNDVVJBVEVfUk9VTkRJTkcKKyNkZWZpbmUgSURFU0NBTEUoeCxuKSAgKChpbnQpIElSSUdIVF9TSElGVCgoeCkgKyAoMSA8PCAoKG4pLTEpKSwgbikpCisjZWxzZQorI2RlZmluZSBJREVTQ0FMRSh4LG4pICAoKGludCkgSVJJR0hUX1NISUZUKHgsIG4pKQorI2VuZGlmCisKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2lkY3RfaWZhc3QgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkgSkNPRUZQVFIgY29lZl9ibG9jaywKKwkJIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBEQ1RFTEVNIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgIERDVEVMRU0gdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTM7CisgIERDVEVMRU0gejUsIHoxMCwgejExLCB6MTIsIHoxMzsKKyAgSkNPRUZQVFIgaW5wdHI7CisgIElGQVNUX01VTFRfVFlQRSAqIHF1YW50cHRyOworICBpbnQgKiB3c3B0cjsKKyAgSlNBTVBST1cgb3V0cHRyOworICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOworICBpbnQgY3RyOworICBpbnQgd29ya3NwYWNlW0RDVFNJWkUyXTsJLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCisgIFNISUZUX1RFTVBTCQkJLyogZm9yIERFU0NBTEUgKi8KKyAgSVNISUZUX1RFTVBTCQkJLyogZm9yIElERVNDQUxFICovCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LiAqLworCisgIGlucHRyID0gY29lZl9ibG9jazsKKyAgcXVhbnRwdHIgPSAoSUZBU1RfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gRENUU0laRTsgY3RyID4gMDsgY3RyLS0pIHsKKyAgICAvKiBEdWUgdG8gcXVhbnRpemF0aW9uLCB3ZSB3aWxsIHVzdWFsbHkgZmluZCB0aGF0IG1hbnkgb2YgdGhlIGlucHV0CisgICAgICogY29lZmZpY2llbnRzIGFyZSB6ZXJvLCBlc3BlY2lhbGx5IHRoZSBBQyB0ZXJtcy4gIFdlIGNhbiBleHBsb2l0IHRoaXMKKyAgICAgKiBieSBzaG9ydC1jaXJjdWl0aW5nIHRoZSBJRENUIGNhbGN1bGF0aW9uIGZvciBhbnkgY29sdW1uIGluIHdoaWNoIGFsbAorICAgICAqIHRoZSBBQyB0ZXJtcyBhcmUgemVyby4gIEluIHRoYXQgY2FzZSBlYWNoIG91dHB1dCBpcyBlcXVhbCB0byB0aGUKKyAgICAgKiBEQyBjb2VmZmljaWVudCAod2l0aCBzY2FsZSBmYWN0b3IgYXMgbmVlZGVkKS4KKyAgICAgKiBXaXRoIHR5cGljYWwgaW1hZ2VzIGFuZCBxdWFudGl6YXRpb24gdGFibGVzLCBoYWxmIG9yIG1vcmUgb2YgdGhlCisgICAgICogY29sdW1uIERDVCBjYWxjdWxhdGlvbnMgY2FuIGJlIHNpbXBsaWZpZWQgdGhpcyB3YXkuCisgICAgICovCisgICAgCisgICAgaWYgKGlucHRyW0RDVFNJWkUqMV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjJdID09IDAgJiYKKwlpbnB0cltEQ1RTSVpFKjNdID09IDAgJiYgaW5wdHJbRENUU0laRSo0XSA9PSAwICYmCisJaW5wdHJbRENUU0laRSo1XSA9PSAwICYmIGlucHRyW0RDVFNJWkUqNl0gPT0gMCAmJgorCWlucHRyW0RDVFNJWkUqN10gPT0gMCkgeworICAgICAgLyogQUMgdGVybXMgYWxsIHplcm8gKi8KKyAgICAgIGludCBkY3ZhbCA9IChpbnQpIERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisKKyAgICAgIHdzcHRyW0RDVFNJWkUqMF0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqMV0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqMl0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqM10gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqNF0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqNV0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqNl0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqN10gPSBkY3ZhbDsKKyAgICAgIAorICAgICAgaW5wdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCisgICAgICBxdWFudHB0cisrOworICAgICAgd3NwdHIrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDAgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pOworICAgIHRtcDEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOworICAgIHRtcDIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNF0sIHF1YW50cHRyW0RDVFNJWkUqNF0pOworICAgIHRtcDMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNl0sIHF1YW50cHRyW0RDVFNJWkUqNl0pOworCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMjsJLyogcGhhc2UgMyAqLworICAgIHRtcDExID0gdG1wMCAtIHRtcDI7CisKKyAgICB0bXAxMyA9IHRtcDEgKyB0bXAzOwkvKiBwaGFzZXMgNS0zICovCisgICAgdG1wMTIgPSBNVUxUSVBMWSh0bXAxIC0gdG1wMywgRklYXzFfNDE0MjEzNTYyKSAtIHRtcDEzOyAvKiAyKmM0ICovCisKKyAgICB0bXAwID0gdG1wMTAgKyB0bXAxMzsJLyogcGhhc2UgMiAqLworICAgIHRtcDMgPSB0bXAxMCAtIHRtcDEzOworICAgIHRtcDEgPSB0bXAxMSArIHRtcDEyOworICAgIHRtcDIgPSB0bXAxMSAtIHRtcDEyOworICAgIAorICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXA0ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjFdLCBxdWFudHB0cltEQ1RTSVpFKjFdKTsKKyAgICB0bXA1ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjNdLCBxdWFudHB0cltEQ1RTSVpFKjNdKTsKKyAgICB0bXA2ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKKyAgICB0bXA3ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjddLCBxdWFudHB0cltEQ1RTSVpFKjddKTsKKworICAgIHoxMyA9IHRtcDYgKyB0bXA1OwkJLyogcGhhc2UgNiAqLworICAgIHoxMCA9IHRtcDYgLSB0bXA1OworICAgIHoxMSA9IHRtcDQgKyB0bXA3OworICAgIHoxMiA9IHRtcDQgLSB0bXA3OworCisgICAgdG1wNyA9IHoxMSArIHoxMzsJCS8qIHBoYXNlIDUgKi8KKyAgICB0bXAxMSA9IE1VTFRJUExZKHoxMSAtIHoxMywgRklYXzFfNDE0MjEzNTYyKTsgLyogMipjNCAqLworCisgICAgejUgPSBNVUxUSVBMWSh6MTAgKyB6MTIsIEZJWF8xXzg0Nzc1OTA2NSk7IC8qIDIqYzIgKi8KKyAgICB0bXAxMCA9IE1VTFRJUExZKHoxMiwgRklYXzFfMDgyMzkyMjAwKSAtIHo1OyAvKiAyKihjMi1jNikgKi8KKyAgICB0bXAxMiA9IE1VTFRJUExZKHoxMCwgLSBGSVhfMl82MTMxMjU5MzApICsgejU7IC8qIC0yKihjMitjNikgKi8KKworICAgIHRtcDYgPSB0bXAxMiAtIHRtcDc7CS8qIHBoYXNlIDIgKi8KKyAgICB0bXA1ID0gdG1wMTEgLSB0bXA2OworICAgIHRtcDQgPSB0bXAxMCArIHRtcDU7CisKKyAgICB3c3B0cltEQ1RTSVpFKjBdID0gKGludCkgKHRtcDAgKyB0bXA3KTsKKyAgICB3c3B0cltEQ1RTSVpFKjddID0gKGludCkgKHRtcDAgLSB0bXA3KTsKKyAgICB3c3B0cltEQ1RTSVpFKjFdID0gKGludCkgKHRtcDEgKyB0bXA2KTsKKyAgICB3c3B0cltEQ1RTSVpFKjZdID0gKGludCkgKHRtcDEgLSB0bXA2KTsKKyAgICB3c3B0cltEQ1RTSVpFKjJdID0gKGludCkgKHRtcDIgKyB0bXA1KTsKKyAgICB3c3B0cltEQ1RTSVpFKjVdID0gKGludCkgKHRtcDIgLSB0bXA1KTsKKyAgICB3c3B0cltEQ1RTSVpFKjRdID0gKGludCkgKHRtcDMgKyB0bXA0KTsKKyAgICB3c3B0cltEQ1RTSVpFKjNdID0gKGludCkgKHRtcDMgLSB0bXA0KTsKKworICAgIGlucHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVycyB0byBuZXh0IGNvbHVtbiAqLworICAgIHF1YW50cHRyKys7CisgICAgd3NwdHIrKzsKKyAgfQorICAKKyAgLyogUGFzcyAyOiBwcm9jZXNzIHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4gKi8KKyAgLyogTm90ZSB0aGF0IHdlIG11c3QgZGVzY2FsZSB0aGUgcmVzdWx0cyBieSBhIGZhY3RvciBvZiA4ID09IDIqKjMsICovCisgIC8qIGFuZCBhbHNvIHVuZG8gdGhlIFBBU1MxX0JJVFMgc2NhbGluZy4gKi8KKworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCBEQ1RTSVpFOyBjdHIrKykgeworICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7CisgICAgLyogUm93cyBvZiB6ZXJvZXMgY2FuIGJlIGV4cGxvaXRlZCBpbiB0aGUgc2FtZSB3YXkgYXMgd2UgZGlkIHdpdGggY29sdW1ucy4KKyAgICAgKiBIb3dldmVyLCB0aGUgY29sdW1uIGNhbGN1bGF0aW9uIGhhcyBjcmVhdGVkIG1hbnkgbm9uemVybyBBQyB0ZXJtcywgc28KKyAgICAgKiB0aGUgc2ltcGxpZmljYXRpb24gYXBwbGllcyBsZXNzIG9mdGVuICh0eXBpY2FsbHkgNSUgdG8gMTAlIG9mIHRoZSB0aW1lKS4KKyAgICAgKiBPbiBtYWNoaW5lcyB3aXRoIHZlcnkgZmFzdCBtdWx0aXBsaWNhdGlvbiwgaXQncyBwb3NzaWJsZSB0aGF0IHRoZQorICAgICAqIHRlc3QgdGFrZXMgbW9yZSB0aW1lIHRoYW4gaXQncyB3b3J0aC4gIEluIHRoYXQgY2FzZSB0aGlzIHNlY3Rpb24KKyAgICAgKiBtYXkgYmUgY29tbWVudGVkIG91dC4KKyAgICAgKi8KKyAgICAKKyNpZm5kZWYgTk9fWkVST19ST1dfVEVTVAorICAgIGlmICh3c3B0clsxXSA9PSAwICYmIHdzcHRyWzJdID09IDAgJiYgd3NwdHJbM10gPT0gMCAmJiB3c3B0cls0XSA9PSAwICYmCisJd3NwdHJbNV0gPT0gMCAmJiB3c3B0cls2XSA9PSAwICYmIHdzcHRyWzddID09IDApIHsKKyAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCisgICAgICBKU0FNUExFIGRjdmFsID0gcmFuZ2VfbGltaXRbSURFU0NBTEUod3NwdHJbMF0sIFBBU1MxX0JJVFMrMykKKwkJCQkgICYgUkFOR0VfTUFTS107CisgICAgICAKKyAgICAgIG91dHB0clswXSA9IGRjdmFsOworICAgICAgb3V0cHRyWzFdID0gZGN2YWw7CisgICAgICBvdXRwdHJbMl0gPSBkY3ZhbDsKKyAgICAgIG91dHB0clszXSA9IGRjdmFsOworICAgICAgb3V0cHRyWzRdID0gZGN2YWw7CisgICAgICBvdXRwdHJbNV0gPSBkY3ZhbDsKKyAgICAgIG91dHB0cls2XSA9IGRjdmFsOworICAgICAgb3V0cHRyWzddID0gZGN2YWw7CisKKyAgICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyNlbmRpZgorICAgIAorICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgdG1wMTAgPSAoKERDVEVMRU0pIHdzcHRyWzBdICsgKERDVEVMRU0pIHdzcHRyWzRdKTsKKyAgICB0bXAxMSA9ICgoRENURUxFTSkgd3NwdHJbMF0gLSAoRENURUxFTSkgd3NwdHJbNF0pOworCisgICAgdG1wMTMgPSAoKERDVEVMRU0pIHdzcHRyWzJdICsgKERDVEVMRU0pIHdzcHRyWzZdKTsKKyAgICB0bXAxMiA9IE1VTFRJUExZKChEQ1RFTEVNKSB3c3B0clsyXSAtIChEQ1RFTEVNKSB3c3B0cls2XSwgRklYXzFfNDE0MjEzNTYyKQorCSAgICAtIHRtcDEzOworCisgICAgdG1wMCA9IHRtcDEwICsgdG1wMTM7CisgICAgdG1wMyA9IHRtcDEwIC0gdG1wMTM7CisgICAgdG1wMSA9IHRtcDExICsgdG1wMTI7CisgICAgdG1wMiA9IHRtcDExIC0gdG1wMTI7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgejEzID0gKERDVEVMRU0pIHdzcHRyWzVdICsgKERDVEVMRU0pIHdzcHRyWzNdOworICAgIHoxMCA9IChEQ1RFTEVNKSB3c3B0cls1XSAtIChEQ1RFTEVNKSB3c3B0clszXTsKKyAgICB6MTEgPSAoRENURUxFTSkgd3NwdHJbMV0gKyAoRENURUxFTSkgd3NwdHJbN107CisgICAgejEyID0gKERDVEVMRU0pIHdzcHRyWzFdIC0gKERDVEVMRU0pIHdzcHRyWzddOworCisgICAgdG1wNyA9IHoxMSArIHoxMzsJCS8qIHBoYXNlIDUgKi8KKyAgICB0bXAxMSA9IE1VTFRJUExZKHoxMSAtIHoxMywgRklYXzFfNDE0MjEzNTYyKTsgLyogMipjNCAqLworCisgICAgejUgPSBNVUxUSVBMWSh6MTAgKyB6MTIsIEZJWF8xXzg0Nzc1OTA2NSk7IC8qIDIqYzIgKi8KKyAgICB0bXAxMCA9IE1VTFRJUExZKHoxMiwgRklYXzFfMDgyMzkyMjAwKSAtIHo1OyAvKiAyKihjMi1jNikgKi8KKyAgICB0bXAxMiA9IE1VTFRJUExZKHoxMCwgLSBGSVhfMl82MTMxMjU5MzApICsgejU7IC8qIC0yKihjMitjNikgKi8KKworICAgIHRtcDYgPSB0bXAxMiAtIHRtcDc7CS8qIHBoYXNlIDIgKi8KKyAgICB0bXA1ID0gdG1wMTEgLSB0bXA2OworICAgIHRtcDQgPSB0bXAxMCArIHRtcDU7CisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2U6IHNjYWxlIGRvd24gYnkgYSBmYWN0b3Igb2YgOCBhbmQgcmFuZ2UtbGltaXQgKi8KKworICAgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDAgKyB0bXA3LCBQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbN10gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAwIC0gdG1wNywgUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMSArIHRtcDYsIFBBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls2XSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDEgLSB0bXA2LCBQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMl0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAyICsgdG1wNSwgUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzVdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMiAtIHRtcDUsIFBBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls0XSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDMgKyB0bXA0LCBQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbM10gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAzIC0gdG1wNCwgUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisKKyAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KK30KKworI2VuZGlmIC8qIERDVF9JRkFTVF9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qaWRjdGludC5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2ppZGN0aW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcyYjMyMAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qaWRjdGludC5jCkBAIC0wLDAgKzEsMzg5IEBACisvKgorICogamlkY3RpbnQuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgc2xvdy1idXQtYWNjdXJhdGUgaW50ZWdlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKyAqIGludmVyc2UgRENUIChEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtKS4gIEluIHRoZSBJSkcgY29kZSwgdGhpcyByb3V0aW5lCisgKiBtdXN0IGFsc28gcGVyZm9ybSBkZXF1YW50aXphdGlvbiBvZiB0aGUgaW5wdXQgY29lZmZpY2llbnRzLgorICoKKyAqIEEgMi1EIElEQ1QgY2FuIGJlIGRvbmUgYnkgMS1EIElEQ1Qgb24gZWFjaCBjb2x1bW4gZm9sbG93ZWQgYnkgMS1EIElEQ1QKKyAqIG9uIGVhY2ggcm93IChvciB2aWNlIHZlcnNhLCBidXQgaXQncyBtb3JlIGNvbnZlbmllbnQgdG8gZW1pdCBhIHJvdyBhdAorICogYSB0aW1lKS4gIERpcmVjdCBhbGdvcml0aG1zIGFyZSBhbHNvIGF2YWlsYWJsZSwgYnV0IHRoZXkgYXJlIG11Y2ggbW9yZQorICogY29tcGxleCBhbmQgc2VlbSBub3QgdG8gYmUgYW55IGZhc3RlciB3aGVuIHJlZHVjZWQgdG8gY29kZS4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIGFuIGFsZ29yaXRobSBkZXNjcmliZWQgaW4KKyAqICAgQy4gTG9lZmZsZXIsIEEuIExpZ3RlbmJlcmcgYW5kIEcuIE1vc2NoeXR6LCAiUHJhY3RpY2FsIEZhc3QgMS1EIERDVAorICogICBBbGdvcml0aG1zIHdpdGggMTEgTXVsdGlwbGljYXRpb25zIiwgUHJvYy4gSW50J2wuIENvbmYuIG9uIEFjb3VzdGljcywKKyAqICAgU3BlZWNoLCBhbmQgU2lnbmFsIFByb2Nlc3NpbmcgMTk4OSAoSUNBU1NQICc4OSksIHBwLiA5ODgtOTkxLgorICogVGhlIHByaW1hcnkgYWxnb3JpdGhtIGRlc2NyaWJlZCB0aGVyZSB1c2VzIDExIG11bHRpcGxpZXMgYW5kIDI5IGFkZHMuCisgKiBXZSB1c2UgdGhlaXIgYWx0ZXJuYXRlIG1ldGhvZCB3aXRoIDEyIG11bHRpcGxpZXMgYW5kIDMyIGFkZHMuCisgKiBUaGUgYWR2YW50YWdlIG9mIHRoaXMgbWV0aG9kIGlzIHRoYXQgbm8gZGF0YSBwYXRoIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUKKyAqIG11bHRpcGxpY2F0aW9uOyB0aGlzIGFsbG93cyBhIHZlcnkgc2ltcGxlIGFuZCBhY2N1cmF0ZSBpbXBsZW1lbnRhdGlvbiBpbgorICogc2NhbGVkIGZpeGVkLXBvaW50IGFyaXRobWV0aWMsIHdpdGggYSBtaW5pbWFsIG51bWJlciBvZiBzaGlmdHMuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImpkY3QuaCIJCS8qIFByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBEQ1Qgc3Vic3lzdGVtICovCisKKyNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECisKKworLyoKKyAqIFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgorICovCisKKyNpZiBEQ1RTSVpFICE9IDgKKyAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLworI2VuZGlmCisKKworLyoKKyAqIFRoZSBwb29wIG9uIHRoaXMgc2NhbGluZyBzdHVmZiBpcyBhcyBmb2xsb3dzOgorICoKKyAqIEVhY2ggMS1EIElEQ1Qgc3RlcCBwcm9kdWNlcyBvdXRwdXRzIHdoaWNoIGFyZSBhIGZhY3RvciBvZiBzcXJ0KE4pCisgKiBsYXJnZXIgdGhhbiB0aGUgdHJ1ZSBJRENUIG91dHB1dHMuICBUaGUgZmluYWwgb3V0cHV0cyBhcmUgdGhlcmVmb3JlCisgKiBhIGZhY3RvciBvZiBOIGxhcmdlciB0aGFuIGRlc2lyZWQ7IHNpbmNlIE49OCB0aGlzIGNhbiBiZSBjdXJlZCBieQorICogYSBzaW1wbGUgcmlnaHQgc2hpZnQgYXQgdGhlIGVuZCBvZiB0aGUgYWxnb3JpdGhtLiAgVGhlIGFkdmFudGFnZSBvZgorICogdGhpcyBhcnJhbmdlbWVudCBpcyB0aGF0IHdlIHNhdmUgdHdvIG11bHRpcGxpY2F0aW9ucyBwZXIgMS1EIElEQ1QsCisgKiBiZWNhdXNlIHRoZSB5MCBhbmQgeTQgaW5wdXRzIG5lZWQgbm90IGJlIGRpdmlkZWQgYnkgc3FydChOKS4KKyAqCisgKiBXZSBoYXZlIHRvIGRvIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbiBvZiB0aGUgaW50ZWdlciBpbnB1dHMsIHdoaWNoCisgKiBpcyBubyBwcm9ibGVtLCBhbmQgbXVsdGlwbGljYXRpb24gYnkgZnJhY3Rpb25hbCBjb25zdGFudHMsIHdoaWNoIGlzCisgKiBhIHByb2JsZW0gdG8gZG8gaW4gaW50ZWdlciBhcml0aG1ldGljLiAgV2UgbXVsdGlwbHkgYWxsIHRoZSBjb25zdGFudHMKKyAqIGJ5IENPTlNUX1NDQUxFIGFuZCBjb252ZXJ0IHRoZW0gdG8gaW50ZWdlciBjb25zdGFudHMgKHRodXMgcmV0YWluaW5nCisgKiBDT05TVF9CSVRTIGJpdHMgb2YgcHJlY2lzaW9uIGluIHRoZSBjb25zdGFudHMpLiAgQWZ0ZXIgZG9pbmcgYQorICogbXVsdGlwbGljYXRpb24gd2UgaGF2ZSB0byBkaXZpZGUgdGhlIHByb2R1Y3QgYnkgQ09OU1RfU0NBTEUsIHdpdGggcHJvcGVyCisgKiByb3VuZGluZywgdG8gcHJvZHVjZSB0aGUgY29ycmVjdCBvdXRwdXQuICBUaGlzIGRpdmlzaW9uIGNhbiBiZSBkb25lCisgKiBjaGVhcGx5IGFzIGEgcmlnaHQgc2hpZnQgb2YgQ09OU1RfQklUUyBiaXRzLiAgV2UgcG9zdHBvbmUgc2hpZnRpbmcKKyAqIGFzIGxvbmcgYXMgcG9zc2libGUgc28gdGhhdCBwYXJ0aWFsIHN1bXMgY2FuIGJlIGFkZGVkIHRvZ2V0aGVyIHdpdGgKKyAqIGZ1bGwgZnJhY3Rpb25hbCBwcmVjaXNpb24uCisgKgorICogVGhlIG91dHB1dHMgb2YgdGhlIGZpcnN0IHBhc3MgYXJlIHNjYWxlZCB1cCBieSBQQVNTMV9CSVRTIGJpdHMgc28gdGhhdAorICogdGhleSBhcmUgcmVwcmVzZW50ZWQgdG8gYmV0dGVyLXRoYW4taW50ZWdyYWwgcHJlY2lzaW9uLiAgVGhlc2Ugb3V0cHV0cworICogcmVxdWlyZSBCSVRTX0lOX0pTQU1QTEUgKyBQQVNTMV9CSVRTICsgMyBiaXRzOyB0aGlzIGZpdHMgaW4gYSAxNi1iaXQgd29yZAorICogd2l0aCB0aGUgcmVjb21tZW5kZWQgc2NhbGluZy4gIChUbyBzY2FsZSB1cCAxMi1iaXQgc2FtcGxlIGRhdGEgZnVydGhlciwgYW4KKyAqIGludGVybWVkaWF0ZSBJTlQzMiBhcnJheSB3b3VsZCBiZSBuZWVkZWQuKQorICoKKyAqIFRvIGF2b2lkIG92ZXJmbG93IG9mIHRoZSAzMi1iaXQgaW50ZXJtZWRpYXRlIHJlc3VsdHMgaW4gcGFzcyAyLCB3ZSBtdXN0CisgKiBoYXZlIEJJVFNfSU5fSlNBTVBMRSArIENPTlNUX0JJVFMgKyBQQVNTMV9CSVRTIDw9IDI2LiAgRXJyb3IgYW5hbHlzaXMKKyAqIHNob3dzIHRoYXQgdGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBhcmUgdGhlIG1vc3QgZWZmZWN0aXZlLgorICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorI2RlZmluZSBDT05TVF9CSVRTICAxMworI2RlZmluZSBQQVNTMV9CSVRTICAyCisjZWxzZQorI2RlZmluZSBDT05TVF9CSVRTICAxMworI2RlZmluZSBQQVNTMV9CSVRTICAxCQkvKiBsb3NlIGEgbGl0dGxlIHByZWNpc2lvbiB0byBhdm9pZCBvdmVyZmxvdyAqLworI2VuZGlmCisKKy8qIFNvbWUgQyBjb21waWxlcnMgZmFpbCB0byByZWR1Y2UgIkZJWChjb25zdGFudCkiIGF0IGNvbXBpbGUgdGltZSwgdGh1cworICogY2F1c2luZyBhIGxvdCBvZiB1c2VsZXNzIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgYXQgcnVuIHRpbWUuCisgKiBUbyBnZXQgYXJvdW5kIHRoaXMgd2UgdXNlIHRoZSBmb2xsb3dpbmcgcHJlLWNhbGN1bGF0ZWQgY29uc3RhbnRzLgorICogSWYgeW91IGNoYW5nZSBDT05TVF9CSVRTIHlvdSBtYXkgd2FudCB0byBhZGQgYXBwcm9wcmlhdGUgdmFsdWVzLgorICogKFdpdGggYSByZWFzb25hYmxlIEMgY29tcGlsZXIsIHlvdSBjYW4ganVzdCByZWx5IG9uIHRoZSBGSVgoKSBtYWNyby4uLikKKyAqLworCisjaWYgQ09OU1RfQklUUyA9PSAxMworI2RlZmluZSBGSVhfMF8yOTg2MzEzMzYgICgoSU5UMzIpICAyNDQ2KQkvKiBGSVgoMC4yOTg2MzEzMzYpICovCisjZGVmaW5lIEZJWF8wXzM5MDE4MDY0NCAgKChJTlQzMikgIDMxOTYpCS8qIEZJWCgwLjM5MDE4MDY0NCkgKi8KKyNkZWZpbmUgRklYXzBfNTQxMTk2MTAwICAoKElOVDMyKSAgNDQzMykJLyogRklYKDAuNTQxMTk2MTAwKSAqLworI2RlZmluZSBGSVhfMF83NjUzNjY4NjUgICgoSU5UMzIpICA2MjcwKQkvKiBGSVgoMC43NjUzNjY4NjUpICovCisjZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgKChJTlQzMikgIDczNzMpCS8qIEZJWCgwLjg5OTk3NjIyMykgKi8KKyNkZWZpbmUgRklYXzFfMTc1ODc1NjAyICAoKElOVDMyKSAgOTYzMykJLyogRklYKDEuMTc1ODc1NjAyKSAqLworI2RlZmluZSBGSVhfMV81MDEzMjExMTAgICgoSU5UMzIpICAxMjI5OSkJLyogRklYKDEuNTAxMzIxMTEwKSAqLworI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgICgoSU5UMzIpICAxNTEzNykJLyogRklYKDEuODQ3NzU5MDY1KSAqLworI2RlZmluZSBGSVhfMV85NjE1NzA1NjAgICgoSU5UMzIpICAxNjA2OSkJLyogRklYKDEuOTYxNTcwNTYwKSAqLworI2RlZmluZSBGSVhfMl8wNTMxMTk4NjkgICgoSU5UMzIpICAxNjgxOSkJLyogRklYKDIuMDUzMTE5ODY5KSAqLworI2RlZmluZSBGSVhfMl81NjI5MTU0NDcgICgoSU5UMzIpICAyMDk5NSkJLyogRklYKDIuNTYyOTE1NDQ3KSAqLworI2RlZmluZSBGSVhfM18wNzI3MTEwMjYgICgoSU5UMzIpICAyNTE3MikJLyogRklYKDMuMDcyNzExMDI2KSAqLworI2Vsc2UKKyNkZWZpbmUgRklYXzBfMjk4NjMxMzM2ICBGSVgoMC4yOTg2MzEzMzYpCisjZGVmaW5lIEZJWF8wXzM5MDE4MDY0NCAgRklYKDAuMzkwMTgwNjQ0KQorI2RlZmluZSBGSVhfMF81NDExOTYxMDAgIEZJWCgwLjU0MTE5NjEwMCkKKyNkZWZpbmUgRklYXzBfNzY1MzY2ODY1ICBGSVgoMC43NjUzNjY4NjUpCisjZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgRklYKDAuODk5OTc2MjIzKQorI2RlZmluZSBGSVhfMV8xNzU4NzU2MDIgIEZJWCgxLjE3NTg3NTYwMikKKyNkZWZpbmUgRklYXzFfNTAxMzIxMTEwICBGSVgoMS41MDEzMjExMTApCisjZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAgRklYKDEuODQ3NzU5MDY1KQorI2RlZmluZSBGSVhfMV85NjE1NzA1NjAgIEZJWCgxLjk2MTU3MDU2MCkKKyNkZWZpbmUgRklYXzJfMDUzMTE5ODY5ICBGSVgoMi4wNTMxMTk4NjkpCisjZGVmaW5lIEZJWF8yXzU2MjkxNTQ0NyAgRklYKDIuNTYyOTE1NDQ3KQorI2RlZmluZSBGSVhfM18wNzI3MTEwMjYgIEZJWCgzLjA3MjcxMTAyNikKKyNlbmRpZgorCisKKy8qIE11bHRpcGx5IGFuIElOVDMyIHZhcmlhYmxlIGJ5IGFuIElOVDMyIGNvbnN0YW50IHRvIHlpZWxkIGFuIElOVDMyIHJlc3VsdC4KKyAqIEZvciA4LWJpdCBzYW1wbGVzIHdpdGggdGhlIHJlY29tbWVuZGVkIHNjYWxpbmcsIGFsbCB0aGUgdmFyaWFibGUKKyAqIGFuZCBjb25zdGFudCB2YWx1ZXMgaW52b2x2ZWQgYXJlIG5vIG1vcmUgdGhhbiAxNiBiaXRzIHdpZGUsIHNvIGEKKyAqIDE2eDE2LT4zMiBiaXQgbXVsdGlwbHkgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIGZ1bGwgMzJ4MzIgbXVsdGlwbHkuCisgKiBGb3IgMTItYml0IHNhbXBsZXMsIGEgZnVsbCAzMi1iaXQgbXVsdGlwbGljYXRpb24gd2lsbCBiZSBuZWVkZWQuCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4CisjZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgIE1VTFRJUExZMTZDMTYodmFyLGNvbnN0KQorI2Vsc2UKKyNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgKCh2YXIpICogKGNvbnN0KSkKKyNlbmRpZgorCisKKy8qIERlcXVhbnRpemUgYSBjb2VmZmljaWVudCBieSBtdWx0aXBseWluZyBpdCBieSB0aGUgbXVsdGlwbGllci10YWJsZQorICogZW50cnk7IHByb2R1Y2UgYW4gaW50IHJlc3VsdC4gIEluIHRoaXMgbW9kdWxlLCBib3RoIGlucHV0cyBhbmQgcmVzdWx0CisgKiBhcmUgMTYgYml0cyBvciBsZXNzLCBzbyBlaXRoZXIgaW50IG9yIHNob3J0IG11bHRpcGx5IHdpbGwgd29yay4KKyAqLworCisjZGVmaW5lIERFUVVBTlRJWkUoY29lZixxdWFudHZhbCkgICgoKElTTE9XX01VTFRfVFlQRSkgKGNvZWYpKSAqIChxdWFudHZhbCkpCisKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2lkY3RfaXNsb3cgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkgSkNPRUZQVFIgY29lZl9ibG9jaywKKwkJIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworICBJTlQzMiB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKKyAgSU5UMzIgejEsIHoyLCB6MywgejQsIHo1OworICBKQ09FRlBUUiBpbnB0cjsKKyAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIGludCAqIHdzcHRyOworICBKU0FNUFJPVyBvdXRwdHI7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7CisgIGludCBjdHI7CisgIGludCB3b3Jrc3BhY2VbRENUU0laRTJdOwkvKiBidWZmZXJzIGRhdGEgYmV0d2VlbiBwYXNzZXMgKi8KKyAgU0hJRlRfVEVNUFMKKworICAvKiBQYXNzIDE6IHByb2Nlc3MgY29sdW1ucyBmcm9tIGlucHV0LCBzdG9yZSBpbnRvIHdvcmsgYXJyYXkuICovCisgIC8qIE5vdGUgcmVzdWx0cyBhcmUgc2NhbGVkIHVwIGJ5IHNxcnQoOCkgY29tcGFyZWQgdG8gYSB0cnVlIElEQ1Q7ICovCisgIC8qIGZ1cnRoZXJtb3JlLCB3ZSBzY2FsZSB0aGUgcmVzdWx0cyBieSAyKipQQVNTMV9CSVRTLiAqLworCisgIGlucHRyID0gY29lZl9ibG9jazsKKyAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gRENUU0laRTsgY3RyID4gMDsgY3RyLS0pIHsKKyAgICAvKiBEdWUgdG8gcXVhbnRpemF0aW9uLCB3ZSB3aWxsIHVzdWFsbHkgZmluZCB0aGF0IG1hbnkgb2YgdGhlIGlucHV0CisgICAgICogY29lZmZpY2llbnRzIGFyZSB6ZXJvLCBlc3BlY2lhbGx5IHRoZSBBQyB0ZXJtcy4gIFdlIGNhbiBleHBsb2l0IHRoaXMKKyAgICAgKiBieSBzaG9ydC1jaXJjdWl0aW5nIHRoZSBJRENUIGNhbGN1bGF0aW9uIGZvciBhbnkgY29sdW1uIGluIHdoaWNoIGFsbAorICAgICAqIHRoZSBBQyB0ZXJtcyBhcmUgemVyby4gIEluIHRoYXQgY2FzZSBlYWNoIG91dHB1dCBpcyBlcXVhbCB0byB0aGUKKyAgICAgKiBEQyBjb2VmZmljaWVudCAod2l0aCBzY2FsZSBmYWN0b3IgYXMgbmVlZGVkKS4KKyAgICAgKiBXaXRoIHR5cGljYWwgaW1hZ2VzIGFuZCBxdWFudGl6YXRpb24gdGFibGVzLCBoYWxmIG9yIG1vcmUgb2YgdGhlCisgICAgICogY29sdW1uIERDVCBjYWxjdWxhdGlvbnMgY2FuIGJlIHNpbXBsaWZpZWQgdGhpcyB3YXkuCisgICAgICovCisgICAgCisgICAgaWYgKGlucHRyW0RDVFNJWkUqMV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjJdID09IDAgJiYKKwlpbnB0cltEQ1RTSVpFKjNdID09IDAgJiYgaW5wdHJbRENUU0laRSo0XSA9PSAwICYmCisJaW5wdHJbRENUU0laRSo1XSA9PSAwICYmIGlucHRyW0RDVFNJWkUqNl0gPT0gMCAmJgorCWlucHRyW0RDVFNJWkUqN10gPT0gMCkgeworICAgICAgLyogQUMgdGVybXMgYWxsIHplcm8gKi8KKyAgICAgIGludCBkY3ZhbCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSkgPDwgUEFTUzFfQklUUzsKKyAgICAgIAorICAgICAgd3NwdHJbRENUU0laRSowXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSoxXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSoyXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSozXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSo0XSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSo1XSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSo2XSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSo3XSA9IGRjdmFsOworICAgICAgCisgICAgICBpbnB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlcnMgdG8gbmV4dCBjb2x1bW4gKi8KKyAgICAgIHF1YW50cHRyKys7CisgICAgICB3c3B0cisrOworICAgICAgY29udGludWU7CisgICAgfQorICAgIAorICAgIC8qIEV2ZW4gcGFydDogcmV2ZXJzZSB0aGUgZXZlbiBwYXJ0IG9mIHRoZSBmb3J3YXJkIERDVC4gKi8KKyAgICAvKiBUaGUgcm90YXRvciBpcyBzcXJ0KDIpKmMoLTYpLiAqLworICAgIAorICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjJdLCBxdWFudHB0cltEQ1RTSVpFKjJdKTsKKyAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo2XSwgcXVhbnRwdHJbRENUU0laRSo2XSk7CisgICAgCisgICAgejEgPSBNVUxUSVBMWSh6MiArIHozLCBGSVhfMF81NDExOTYxMDApOworICAgIHRtcDIgPSB6MSArIE1VTFRJUExZKHozLCAtIEZJWF8xXzg0Nzc1OTA2NSk7CisgICAgdG1wMyA9IHoxICsgTVVMVElQTFkoejIsIEZJWF8wXzc2NTM2Njg2NSk7CisgICAgCisgICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pOworICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjRdLCBxdWFudHB0cltEQ1RTSVpFKjRdKTsKKworICAgIHRtcDAgPSAoejIgKyB6MykgPDwgQ09OU1RfQklUUzsKKyAgICB0bXAxID0gKHoyIC0gejMpIDw8IENPTlNUX0JJVFM7CisgICAgCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMzsKKyAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOworICAgIHRtcDExID0gdG1wMSArIHRtcDI7CisgICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKKyAgICAKKyAgICAvKiBPZGQgcGFydCBwZXIgZmlndXJlIDg7IHRoZSBtYXRyaXggaXMgdW5pdGFyeSBhbmQgaGVuY2UgaXRzCisgICAgICogdHJhbnNwb3NlIGlzIGl0cyBpbnZlcnNlLiAgaTAuLmkzIGFyZSB5Nyx5NSx5Myx5MSByZXNwZWN0aXZlbHkuCisgICAgICovCisgICAgCisgICAgdG1wMCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo3XSwgcXVhbnRwdHJbRENUU0laRSo3XSk7CisgICAgdG1wMSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo1XSwgcXVhbnRwdHJbRENUU0laRSo1XSk7CisgICAgdG1wMiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7CisgICAgdG1wMyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7CisgICAgCisgICAgejEgPSB0bXAwICsgdG1wMzsKKyAgICB6MiA9IHRtcDEgKyB0bXAyOworICAgIHozID0gdG1wMCArIHRtcDI7CisgICAgejQgPSB0bXAxICsgdG1wMzsKKyAgICB6NSA9IE1VTFRJUExZKHozICsgejQsIEZJWF8xXzE3NTg3NTYwMik7IC8qIHNxcnQoMikgKiBjMyAqLworICAgIAorICAgIHRtcDAgPSBNVUxUSVBMWSh0bXAwLCBGSVhfMF8yOTg2MzEzMzYpOyAvKiBzcXJ0KDIpICogKC1jMStjMytjNS1jNykgKi8KKyAgICB0bXAxID0gTVVMVElQTFkodG1wMSwgRklYXzJfMDUzMTE5ODY5KTsgLyogc3FydCgyKSAqICggYzErYzMtYzUrYzcpICovCisgICAgdG1wMiA9IE1VTFRJUExZKHRtcDIsIEZJWF8zXzA3MjcxMTAyNik7IC8qIHNxcnQoMikgKiAoIGMxK2MzK2M1LWM3KSAqLworICAgIHRtcDMgPSBNVUxUSVBMWSh0bXAzLCBGSVhfMV81MDEzMjExMTApOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNS1jNykgKi8KKyAgICB6MSA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzg5OTk3NjIyMyk7IC8qIHNxcnQoMikgKiAoYzctYzMpICovCisgICAgejIgPSBNVUxUSVBMWSh6MiwgLSBGSVhfMl81NjI5MTU0NDcpOyAvKiBzcXJ0KDIpICogKC1jMS1jMykgKi8KKyAgICB6MyA9IE1VTFRJUExZKHozLCAtIEZJWF8xXzk2MTU3MDU2MCk7IC8qIHNxcnQoMikgKiAoLWMzLWM1KSAqLworICAgIHo0ID0gTVVMVElQTFkoejQsIC0gRklYXzBfMzkwMTgwNjQ0KTsgLyogc3FydCgyKSAqIChjNS1jMykgKi8KKyAgICAKKyAgICB6MyArPSB6NTsKKyAgICB6NCArPSB6NTsKKyAgICAKKyAgICB0bXAwICs9IHoxICsgejM7CisgICAgdG1wMSArPSB6MiArIHo0OworICAgIHRtcDIgKz0gejIgKyB6MzsKKyAgICB0bXAzICs9IHoxICsgejQ7CisgICAgCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlOiBpbnB1dHMgYXJlIHRtcDEwLi50bXAxMywgdG1wMC4udG1wMyAqLworICAgIAorICAgIHdzcHRyW0RDVFNJWkUqMF0gPSAoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cltEQ1RTSVpFKjddID0gKGludCkgREVTQ0FMRSh0bXAxMCAtIHRtcDMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbRENUU0laRSoxXSA9IChpbnQpIERFU0NBTEUodG1wMTEgKyB0bXAyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyW0RDVFNJWkUqNl0gPSAoaW50KSBERVNDQUxFKHRtcDExIC0gdG1wMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cltEQ1RTSVpFKjJdID0gKGludCkgREVTQ0FMRSh0bXAxMiArIHRtcDEsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbRENUU0laRSo1XSA9IChpbnQpIERFU0NBTEUodG1wMTIgLSB0bXAxLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyW0RDVFNJWkUqM10gPSAoaW50KSBERVNDQUxFKHRtcDEzICsgdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cltEQ1RTSVpFKjRdID0gKGludCkgREVTQ0FMRSh0bXAxMyAtIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgCisgICAgaW5wdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCisgICAgcXVhbnRwdHIrKzsKKyAgICB3c3B0cisrOworICB9CisgIAorICAvKiBQYXNzIDI6IHByb2Nlc3Mgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LiAqLworICAvKiBOb3RlIHRoYXQgd2UgbXVzdCBkZXNjYWxlIHRoZSByZXN1bHRzIGJ5IGEgZmFjdG9yIG9mIDggPT0gMioqMywgKi8KKyAgLyogYW5kIGFsc28gdW5kbyB0aGUgUEFTUzFfQklUUyBzY2FsaW5nLiAqLworCisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IERDVFNJWkU7IGN0cisrKSB7CisgICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKKyAgICAvKiBSb3dzIG9mIHplcm9lcyBjYW4gYmUgZXhwbG9pdGVkIGluIHRoZSBzYW1lIHdheSBhcyB3ZSBkaWQgd2l0aCBjb2x1bW5zLgorICAgICAqIEhvd2V2ZXIsIHRoZSBjb2x1bW4gY2FsY3VsYXRpb24gaGFzIGNyZWF0ZWQgbWFueSBub256ZXJvIEFDIHRlcm1zLCBzbworICAgICAqIHRoZSBzaW1wbGlmaWNhdGlvbiBhcHBsaWVzIGxlc3Mgb2Z0ZW4gKHR5cGljYWxseSA1JSB0byAxMCUgb2YgdGhlIHRpbWUpLgorICAgICAqIE9uIG1hY2hpbmVzIHdpdGggdmVyeSBmYXN0IG11bHRpcGxpY2F0aW9uLCBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlCisgICAgICogdGVzdCB0YWtlcyBtb3JlIHRpbWUgdGhhbiBpdCdzIHdvcnRoLiAgSW4gdGhhdCBjYXNlIHRoaXMgc2VjdGlvbgorICAgICAqIG1heSBiZSBjb21tZW50ZWQgb3V0LgorICAgICAqLworICAgIAorI2lmbmRlZiBOT19aRVJPX1JPV19URVNUCisgICAgaWYgKHdzcHRyWzFdID09IDAgJiYgd3NwdHJbMl0gPT0gMCAmJiB3c3B0clszXSA9PSAwICYmIHdzcHRyWzRdID09IDAgJiYKKwl3c3B0cls1XSA9PSAwICYmIHdzcHRyWzZdID09IDAgJiYgd3NwdHJbN10gPT0gMCkgeworICAgICAgLyogQUMgdGVybXMgYWxsIHplcm8gKi8KKyAgICAgIEpTQU1QTEUgZGN2YWwgPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKChJTlQzMikgd3NwdHJbMF0sIFBBU1MxX0JJVFMrMykKKwkJCQkgICYgUkFOR0VfTUFTS107CisgICAgICAKKyAgICAgIG91dHB0clswXSA9IGRjdmFsOworICAgICAgb3V0cHRyWzFdID0gZGN2YWw7CisgICAgICBvdXRwdHJbMl0gPSBkY3ZhbDsKKyAgICAgIG91dHB0clszXSA9IGRjdmFsOworICAgICAgb3V0cHRyWzRdID0gZGN2YWw7CisgICAgICBvdXRwdHJbNV0gPSBkY3ZhbDsKKyAgICAgIG91dHB0cls2XSA9IGRjdmFsOworICAgICAgb3V0cHRyWzddID0gZGN2YWw7CisKKyAgICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyNlbmRpZgorICAgIAorICAgIC8qIEV2ZW4gcGFydDogcmV2ZXJzZSB0aGUgZXZlbiBwYXJ0IG9mIHRoZSBmb3J3YXJkIERDVC4gKi8KKyAgICAvKiBUaGUgcm90YXRvciBpcyBzcXJ0KDIpKmMoLTYpLiAqLworICAgIAorICAgIHoyID0gKElOVDMyKSB3c3B0clsyXTsKKyAgICB6MyA9IChJTlQzMikgd3NwdHJbNl07CisgICAgCisgICAgejEgPSBNVUxUSVBMWSh6MiArIHozLCBGSVhfMF81NDExOTYxMDApOworICAgIHRtcDIgPSB6MSArIE1VTFRJUExZKHozLCAtIEZJWF8xXzg0Nzc1OTA2NSk7CisgICAgdG1wMyA9IHoxICsgTVVMVElQTFkoejIsIEZJWF8wXzc2NTM2Njg2NSk7CisgICAgCisgICAgdG1wMCA9ICgoSU5UMzIpIHdzcHRyWzBdICsgKElOVDMyKSB3c3B0cls0XSkgPDwgQ09OU1RfQklUUzsKKyAgICB0bXAxID0gKChJTlQzMikgd3NwdHJbMF0gLSAoSU5UMzIpIHdzcHRyWzRdKSA8PCBDT05TVF9CSVRTOworICAgIAorICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CisgICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKKyAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7CisgICAgCisgICAgLyogT2RkIHBhcnQgcGVyIGZpZ3VyZSA4OyB0aGUgbWF0cml4IGlzIHVuaXRhcnkgYW5kIGhlbmNlIGl0cworICAgICAqIHRyYW5zcG9zZSBpcyBpdHMgaW52ZXJzZS4gIGkwLi5pMyBhcmUgeTcseTUseTMseTEgcmVzcGVjdGl2ZWx5LgorICAgICAqLworICAgIAorICAgIHRtcDAgPSAoSU5UMzIpIHdzcHRyWzddOworICAgIHRtcDEgPSAoSU5UMzIpIHdzcHRyWzVdOworICAgIHRtcDIgPSAoSU5UMzIpIHdzcHRyWzNdOworICAgIHRtcDMgPSAoSU5UMzIpIHdzcHRyWzFdOworICAgIAorICAgIHoxID0gdG1wMCArIHRtcDM7CisgICAgejIgPSB0bXAxICsgdG1wMjsKKyAgICB6MyA9IHRtcDAgKyB0bXAyOworICAgIHo0ID0gdG1wMSArIHRtcDM7CisgICAgejUgPSBNVUxUSVBMWSh6MyArIHo0LCBGSVhfMV8xNzU4NzU2MDIpOyAvKiBzcXJ0KDIpICogYzMgKi8KKyAgICAKKyAgICB0bXAwID0gTVVMVElQTFkodG1wMCwgRklYXzBfMjk4NjMxMzM2KTsgLyogc3FydCgyKSAqICgtYzErYzMrYzUtYzcpICovCisgICAgdG1wMSA9IE1VTFRJUExZKHRtcDEsIEZJWF8yXzA1MzExOTg2OSk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1K2M3KSAqLworICAgIHRtcDIgPSBNVUxUSVBMWSh0bXAyLCBGSVhfM18wNzI3MTEwMjYpOyAvKiBzcXJ0KDIpICogKCBjMStjMytjNS1jNykgKi8KKyAgICB0bXAzID0gTVVMVElQTFkodG1wMywgRklYXzFfNTAxMzIxMTEwKTsgLyogc3FydCgyKSAqICggYzErYzMtYzUtYzcpICovCisgICAgejEgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF84OTk5NzYyMjMpOyAvKiBzcXJ0KDIpICogKGM3LWMzKSAqLworICAgIHoyID0gTVVMVElQTFkoejIsIC0gRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqICgtYzEtYzMpICovCisgICAgejMgPSBNVUxUSVBMWSh6MywgLSBGSVhfMV85NjE1NzA1NjApOyAvKiBzcXJ0KDIpICogKC1jMy1jNSkgKi8KKyAgICB6NCA9IE1VTFRJUExZKHo0LCAtIEZJWF8wXzM5MDE4MDY0NCk7IC8qIHNxcnQoMikgKiAoYzUtYzMpICovCisgICAgCisgICAgejMgKz0gejU7CisgICAgejQgKz0gejU7CisgICAgCisgICAgdG1wMCArPSB6MSArIHozOworICAgIHRtcDEgKz0gejIgKyB6NDsKKyAgICB0bXAyICs9IHoyICsgejM7CisgICAgdG1wMyArPSB6MSArIHo0OworICAgIAorICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZTogaW5wdXRzIGFyZSB0bXAxMC4udG1wMTMsIHRtcDAuLnRtcDMgKi8KKyAgICAKKyAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMywKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls3XSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTAgLSB0bXAzLAorCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMSArIHRtcDIsCisJCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNl0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDExIC0gdG1wMiwKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsyXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTIgKyB0bXAxLAorCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzVdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMiAtIHRtcDEsCisJCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbM10gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEzICsgdG1wMCwKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls0XSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTMgLSB0bXAwLAorCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgCisgICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICB9Cit9CisKKyNlbmRpZiAvKiBEQ1RfSVNMT1dfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamlkY3RyZWQuYyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qaWRjdHJlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMWYzYzcKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamlkY3RyZWQuYwpAQCAtMCwwICsxLDM5OCBAQAorLyoKKyAqIGppZGN0cmVkLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBpbnZlcnNlLURDVCByb3V0aW5lcyB0aGF0IHByb2R1Y2UgcmVkdWNlZC1zaXplIG91dHB1dDoKKyAqIGVpdGhlciA0eDQsIDJ4Miwgb3IgMXgxIHBpeGVscyBmcm9tIGFuIDh4OCBEQ1QgYmxvY2suCisgKgorICogVGhlIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHRoZSBMb2VmZmxlciwgTGlndGVuYmVyZyBhbmQgTW9zY2h5dHogKExMJk0pCisgKiBhbGdvcml0aG0gdXNlZCBpbiBqaWRjdGludC5jLiAgV2Ugc2ltcGx5IHJlcGxhY2UgZWFjaCA4LXRvLTggMS1EIElEQ1Qgc3RlcAorICogd2l0aCBhbiA4LXRvLTQgc3RlcCB0aGF0IHByb2R1Y2VzIHRoZSBmb3VyIGF2ZXJhZ2VzIG9mIHR3byBhZGphY2VudCBvdXRwdXRzCisgKiAob3IgYW4gOC10by0yIHN0ZXAgcHJvZHVjaW5nIHR3byBhdmVyYWdlcyBvZiBmb3VyIG91dHB1dHMsIGZvciAyeDIgb3V0cHV0KS4KKyAqIFRoZXNlIHN0ZXBzIHdlcmUgZGVyaXZlZCBieSBjb21wdXRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGF0IHRoZSBlbmQKKyAqIG9mIHRoZSBub3JtYWwgTEwmTSBjb2RlLCB0aGVuIHNpbXBsaWZ5aW5nIGFzIG11Y2ggYXMgcG9zc2libGUuCisgKgorICogMXgxIGlzIHRyaXZpYWw6IGp1c3QgdGFrZSB0aGUgREMgY29lZmZpY2llbnQgZGl2aWRlZCBieSA4LgorICoKKyAqIFNlZSBqaWRjdGludC5jIGZvciBhZGRpdGlvbmFsIGNvbW1lbnRzLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLworCisjaWZkZWYgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAorCisKKy8qCisgKiBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KKyAqLworCisjaWYgRENUU0laRSAhPSA4CisgIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KKyNlbmRpZgorCisKKy8qIFNjYWxpbmcgaXMgdGhlIHNhbWUgYXMgaW4gamlkY3RpbnQuYy4gKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4CisjZGVmaW5lIENPTlNUX0JJVFMgIDEzCisjZGVmaW5lIFBBU1MxX0JJVFMgIDIKKyNlbHNlCisjZGVmaW5lIENPTlNUX0JJVFMgIDEzCisjZGVmaW5lIFBBU1MxX0JJVFMgIDEJCS8qIGxvc2UgYSBsaXR0bGUgcHJlY2lzaW9uIHRvIGF2b2lkIG92ZXJmbG93ICovCisjZW5kaWYKKworLyogU29tZSBDIGNvbXBpbGVycyBmYWlsIHRvIHJlZHVjZSAiRklYKGNvbnN0YW50KSIgYXQgY29tcGlsZSB0aW1lLCB0aHVzCisgKiBjYXVzaW5nIGEgbG90IG9mIHVzZWxlc3MgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyBhdCBydW4gdGltZS4KKyAqIFRvIGdldCBhcm91bmQgdGhpcyB3ZSB1c2UgdGhlIGZvbGxvd2luZyBwcmUtY2FsY3VsYXRlZCBjb25zdGFudHMuCisgKiBJZiB5b3UgY2hhbmdlIENPTlNUX0JJVFMgeW91IG1heSB3YW50IHRvIGFkZCBhcHByb3ByaWF0ZSB2YWx1ZXMuCisgKiAoV2l0aCBhIHJlYXNvbmFibGUgQyBjb21waWxlciwgeW91IGNhbiBqdXN0IHJlbHkgb24gdGhlIEZJWCgpIG1hY3JvLi4uKQorICovCisKKyNpZiBDT05TVF9CSVRTID09IDEzCisjZGVmaW5lIEZJWF8wXzIxMTE2NDI0MyAgKChJTlQzMikgIDE3MzApCS8qIEZJWCgwLjIxMTE2NDI0MykgKi8KKyNkZWZpbmUgRklYXzBfNTA5Nzk1NTc5ICAoKElOVDMyKSAgNDE3NikJLyogRklYKDAuNTA5Nzk1NTc5KSAqLworI2RlZmluZSBGSVhfMF82MDEzNDQ4ODcgICgoSU5UMzIpICA0OTI2KQkvKiBGSVgoMC42MDEzNDQ4ODcpICovCisjZGVmaW5lIEZJWF8wXzcyMDk1OTgyMiAgKChJTlQzMikgIDU5MDYpCS8qIEZJWCgwLjcyMDk1OTgyMikgKi8KKyNkZWZpbmUgRklYXzBfNzY1MzY2ODY1ICAoKElOVDMyKSAgNjI3MCkJLyogRklYKDAuNzY1MzY2ODY1KSAqLworI2RlZmluZSBGSVhfMF84NTA0MzAwOTUgICgoSU5UMzIpICA2OTY3KQkvKiBGSVgoMC44NTA0MzAwOTUpICovCisjZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgKChJTlQzMikgIDczNzMpCS8qIEZJWCgwLjg5OTk3NjIyMykgKi8KKyNkZWZpbmUgRklYXzFfMDYxNTk0MzM3ICAoKElOVDMyKSAgODY5NykJLyogRklYKDEuMDYxNTk0MzM3KSAqLworI2RlZmluZSBGSVhfMV8yNzI3NTg1ODAgICgoSU5UMzIpICAxMDQyNikJLyogRklYKDEuMjcyNzU4NTgwKSAqLworI2RlZmluZSBGSVhfMV80NTE3NzQ5ODEgICgoSU5UMzIpICAxMTg5MykJLyogRklYKDEuNDUxNzc0OTgxKSAqLworI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgICgoSU5UMzIpICAxNTEzNykJLyogRklYKDEuODQ3NzU5MDY1KSAqLworI2RlZmluZSBGSVhfMl8xNzI3MzQ4MDMgICgoSU5UMzIpICAxNzc5OSkJLyogRklYKDIuMTcyNzM0ODAzKSAqLworI2RlZmluZSBGSVhfMl81NjI5MTU0NDcgICgoSU5UMzIpICAyMDk5NSkJLyogRklYKDIuNTYyOTE1NDQ3KSAqLworI2RlZmluZSBGSVhfM182MjQ1MDk3ODUgICgoSU5UMzIpICAyOTY5MikJLyogRklYKDMuNjI0NTA5Nzg1KSAqLworI2Vsc2UKKyNkZWZpbmUgRklYXzBfMjExMTY0MjQzICBGSVgoMC4yMTExNjQyNDMpCisjZGVmaW5lIEZJWF8wXzUwOTc5NTU3OSAgRklYKDAuNTA5Nzk1NTc5KQorI2RlZmluZSBGSVhfMF82MDEzNDQ4ODcgIEZJWCgwLjYwMTM0NDg4NykKKyNkZWZpbmUgRklYXzBfNzIwOTU5ODIyICBGSVgoMC43MjA5NTk4MjIpCisjZGVmaW5lIEZJWF8wXzc2NTM2Njg2NSAgRklYKDAuNzY1MzY2ODY1KQorI2RlZmluZSBGSVhfMF84NTA0MzAwOTUgIEZJWCgwLjg1MDQzMDA5NSkKKyNkZWZpbmUgRklYXzBfODk5OTc2MjIzICBGSVgoMC44OTk5NzYyMjMpCisjZGVmaW5lIEZJWF8xXzA2MTU5NDMzNyAgRklYKDEuMDYxNTk0MzM3KQorI2RlZmluZSBGSVhfMV8yNzI3NTg1ODAgIEZJWCgxLjI3Mjc1ODU4MCkKKyNkZWZpbmUgRklYXzFfNDUxNzc0OTgxICBGSVgoMS40NTE3NzQ5ODEpCisjZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAgRklYKDEuODQ3NzU5MDY1KQorI2RlZmluZSBGSVhfMl8xNzI3MzQ4MDMgIEZJWCgyLjE3MjczNDgwMykKKyNkZWZpbmUgRklYXzJfNTYyOTE1NDQ3ICBGSVgoMi41NjI5MTU0NDcpCisjZGVmaW5lIEZJWF8zXzYyNDUwOTc4NSAgRklYKDMuNjI0NTA5Nzg1KQorI2VuZGlmCisKKworLyogTXVsdGlwbHkgYW4gSU5UMzIgdmFyaWFibGUgYnkgYW4gSU5UMzIgY29uc3RhbnQgdG8geWllbGQgYW4gSU5UMzIgcmVzdWx0LgorICogRm9yIDgtYml0IHNhbXBsZXMgd2l0aCB0aGUgcmVjb21tZW5kZWQgc2NhbGluZywgYWxsIHRoZSB2YXJpYWJsZQorICogYW5kIGNvbnN0YW50IHZhbHVlcyBpbnZvbHZlZCBhcmUgbm8gbW9yZSB0aGFuIDE2IGJpdHMgd2lkZSwgc28gYQorICogMTZ4MTYtPjMyIGJpdCBtdWx0aXBseSBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGEgZnVsbCAzMngzMiBtdWx0aXBseS4KKyAqIEZvciAxMi1iaXQgc2FtcGxlcywgYSBmdWxsIDMyLWJpdCBtdWx0aXBsaWNhdGlvbiB3aWxsIGJlIG5lZWRlZC4KKyAqLworCisjaWYgQklUU19JTl9KU0FNUExFID09IDgKKyNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgTVVMVElQTFkxNkMxNih2YXIsY29uc3QpCisjZWxzZQorI2RlZmluZSBNVUxUSVBMWSh2YXIsY29uc3QpICAoKHZhcikgKiAoY29uc3QpKQorI2VuZGlmCisKKworLyogRGVxdWFudGl6ZSBhIGNvZWZmaWNpZW50IGJ5IG11bHRpcGx5aW5nIGl0IGJ5IHRoZSBtdWx0aXBsaWVyLXRhYmxlCisgKiBlbnRyeTsgcHJvZHVjZSBhbiBpbnQgcmVzdWx0LiAgSW4gdGhpcyBtb2R1bGUsIGJvdGggaW5wdXRzIGFuZCByZXN1bHQKKyAqIGFyZSAxNiBiaXRzIG9yIGxlc3MsIHNvIGVpdGhlciBpbnQgb3Igc2hvcnQgbXVsdGlwbHkgd2lsbCB3b3JrLgorICovCisKKyNkZWZpbmUgREVRVUFOVElaRShjb2VmLHF1YW50dmFsKSAgKCgoSVNMT1dfTVVMVF9UWVBFKSAoY29lZikpICogKHF1YW50dmFsKSkKKworCisvKgorICogUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cywKKyAqIHByb2R1Y2luZyBhIHJlZHVjZWQtc2l6ZSA0eDQgb3V0cHV0IGJsb2NrLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19pZGN0XzR4NCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisJICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAyLCB0bXAxMCwgdG1wMTI7CisgIElOVDMyIHoxLCB6MiwgejMsIHo0OworICBKQ09FRlBUUiBpbnB0cjsKKyAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIGludCAqIHdzcHRyOworICBKU0FNUFJPVyBvdXRwdHI7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7CisgIGludCBjdHI7CisgIGludCB3b3Jrc3BhY2VbRENUU0laRSo0XTsJLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCisgIFNISUZUX1RFTVBTCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LiAqLworCisgIGlucHRyID0gY29lZl9ibG9jazsKKyAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gRENUU0laRTsgY3RyID4gMDsgaW5wdHIrKywgcXVhbnRwdHIrKywgd3NwdHIrKywgY3RyLS0pIHsKKyAgICAvKiBEb24ndCBib3RoZXIgdG8gcHJvY2VzcyBjb2x1bW4gNCwgYmVjYXVzZSBzZWNvbmQgcGFzcyB3b24ndCB1c2UgaXQgKi8KKyAgICBpZiAoY3RyID09IERDVFNJWkUtNCkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChpbnB0cltEQ1RTSVpFKjFdID09IDAgJiYgaW5wdHJbRENUU0laRSoyXSA9PSAwICYmCisJaW5wdHJbRENUU0laRSozXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqNV0gPT0gMCAmJgorCWlucHRyW0RDVFNJWkUqNl0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjddID09IDApIHsKKyAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvOyB3ZSBuZWVkIG5vdCBleGFtaW5lIHRlcm0gNCBmb3IgNHg0IG91dHB1dCAqLworICAgICAgaW50IGRjdmFsID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKSA8PCBQQVNTMV9CSVRTOworICAgICAgCisgICAgICB3c3B0cltEQ1RTSVpFKjBdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjFdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjJdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjNdID0gZGN2YWw7CisgICAgICAKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICAvKiBFdmVuIHBhcnQgKi8KKyAgICAKKyAgICB0bXAwID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKKyAgICB0bXAwIDw8PSAoQ09OU1RfQklUUysxKTsKKyAgICAKKyAgICB6MiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoyXSwgcXVhbnRwdHJbRENUU0laRSoyXSk7CisgICAgejMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNl0sIHF1YW50cHRyW0RDVFNJWkUqNl0pOworCisgICAgdG1wMiA9IE1VTFRJUExZKHoyLCBGSVhfMV84NDc3NTkwNjUpICsgTVVMVElQTFkoejMsIC0gRklYXzBfNzY1MzY2ODY1KTsKKyAgICAKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMCAtIHRtcDI7CisgICAgCisgICAgLyogT2RkIHBhcnQgKi8KKyAgICAKKyAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo3XSwgcXVhbnRwdHJbRENUU0laRSo3XSk7CisgICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNV0sIHF1YW50cHRyW0RDVFNJWkUqNV0pOworICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjNdLCBxdWFudHB0cltEQ1RTSVpFKjNdKTsKKyAgICB6NCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7CisgICAgCisgICAgdG1wMCA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzIxMTE2NDI0MykgLyogc3FydCgyKSAqIChjMy1jMSkgKi8KKwkgKyBNVUxUSVBMWSh6MiwgRklYXzFfNDUxNzc0OTgxKSAvKiBzcXJ0KDIpICogKGMzK2M3KSAqLworCSArIE1VTFRJUExZKHozLCAtIEZJWF8yXzE3MjczNDgwMykgLyogc3FydCgyKSAqICgtYzEtYzUpICovCisJICsgTVVMVElQTFkoejQsIEZJWF8xXzA2MTU5NDMzNyk7IC8qIHNxcnQoMikgKiAoYzUrYzcpICovCisgICAgCisgICAgdG1wMiA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzUwOTc5NTU3OSkgLyogc3FydCgyKSAqIChjNy1jNSkgKi8KKwkgKyBNVUxUSVBMWSh6MiwgLSBGSVhfMF82MDEzNDQ4ODcpIC8qIHNxcnQoMikgKiAoYzUtYzEpICovCisJICsgTVVMVElQTFkoejMsIEZJWF8wXzg5OTk3NjIyMykgLyogc3FydCgyKSAqIChjMy1jNykgKi8KKwkgKyBNVUxUSVBMWSh6NCwgRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqIChjMStjMykgKi8KKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworICAgIAorICAgIHdzcHRyW0RDVFNJWkUqMF0gPSAoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzEpOworICAgIHdzcHRyW0RDVFNJWkUqM10gPSAoaW50KSBERVNDQUxFKHRtcDEwIC0gdG1wMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzEpOworICAgIHdzcHRyW0RDVFNJWkUqMV0gPSAoaW50KSBERVNDQUxFKHRtcDEyICsgdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzEpOworICAgIHdzcHRyW0RDVFNJWkUqMl0gPSAoaW50KSBERVNDQUxFKHRtcDEyIC0gdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzEpOworICB9CisgIAorICAvKiBQYXNzIDI6IHByb2Nlc3MgNCByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuICovCisKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgNDsgY3RyKyspIHsKKyAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOworICAgIC8qIEl0J3Mgbm90IGNsZWFyIHdoZXRoZXIgYSB6ZXJvIHJvdyB0ZXN0IGlzIHdvcnRod2hpbGUgaGVyZSAuLi4gKi8KKworI2lmbmRlZiBOT19aRVJPX1JPV19URVNUCisgICAgaWYgKHdzcHRyWzFdID09IDAgJiYgd3NwdHJbMl0gPT0gMCAmJiB3c3B0clszXSA9PSAwICYmCisJd3NwdHJbNV0gPT0gMCAmJiB3c3B0cls2XSA9PSAwICYmIHdzcHRyWzddID09IDApIHsKKyAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCisgICAgICBKU0FNUExFIGRjdmFsID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpIHdzcHRyWzBdLCBQQVNTMV9CSVRTKzMpCisJCQkJICAmIFJBTkdFX01BU0tdOworICAgICAgCisgICAgICBvdXRwdHJbMF0gPSBkY3ZhbDsKKyAgICAgIG91dHB0clsxXSA9IGRjdmFsOworICAgICAgb3V0cHRyWzJdID0gZGN2YWw7CisgICAgICBvdXRwdHJbM10gPSBkY3ZhbDsKKyAgICAgIAorICAgICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICAgICAgY29udGludWU7CisgICAgfQorI2VuZGlmCisgICAgCisgICAgLyogRXZlbiBwYXJ0ICovCisgICAgCisgICAgdG1wMCA9ICgoSU5UMzIpIHdzcHRyWzBdKSA8PCAoQ09OU1RfQklUUysxKTsKKyAgICAKKyAgICB0bXAyID0gTVVMVElQTFkoKElOVDMyKSB3c3B0clsyXSwgRklYXzFfODQ3NzU5MDY1KQorCSArIE1VTFRJUExZKChJTlQzMikgd3NwdHJbNl0sIC0gRklYXzBfNzY1MzY2ODY1KTsKKyAgICAKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMCAtIHRtcDI7CisgICAgCisgICAgLyogT2RkIHBhcnQgKi8KKyAgICAKKyAgICB6MSA9IChJTlQzMikgd3NwdHJbN107CisgICAgejIgPSAoSU5UMzIpIHdzcHRyWzVdOworICAgIHozID0gKElOVDMyKSB3c3B0clszXTsKKyAgICB6NCA9IChJTlQzMikgd3NwdHJbMV07CisgICAgCisgICAgdG1wMCA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzIxMTE2NDI0MykgLyogc3FydCgyKSAqIChjMy1jMSkgKi8KKwkgKyBNVUxUSVBMWSh6MiwgRklYXzFfNDUxNzc0OTgxKSAvKiBzcXJ0KDIpICogKGMzK2M3KSAqLworCSArIE1VTFRJUExZKHozLCAtIEZJWF8yXzE3MjczNDgwMykgLyogc3FydCgyKSAqICgtYzEtYzUpICovCisJICsgTVVMVElQTFkoejQsIEZJWF8xXzA2MTU5NDMzNyk7IC8qIHNxcnQoMikgKiAoYzUrYzcpICovCisgICAgCisgICAgdG1wMiA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzUwOTc5NTU3OSkgLyogc3FydCgyKSAqIChjNy1jNSkgKi8KKwkgKyBNVUxUSVBMWSh6MiwgLSBGSVhfMF82MDEzNDQ4ODcpIC8qIHNxcnQoMikgKiAoYzUtYzEpICovCisJICsgTVVMVElQTFkoejMsIEZJWF8wXzg5OTk3NjIyMykgLyogc3FydCgyKSAqIChjMy1jNykgKi8KKwkgKyBNVUxUSVBMWSh6NCwgRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqIChjMStjMykgKi8KKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworICAgIAorICAgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTAgKyB0bXAyLAorCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKzEpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbM10gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEwIC0gdG1wMiwKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysxKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMiArIHRtcDAsCisJCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMrMSkKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsyXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTIgLSB0bXAwLAorCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKzEpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICAKKyAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KK30KKworCisvKgorICogUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cywKKyAqIHByb2R1Y2luZyBhIHJlZHVjZWQtc2l6ZSAyeDIgb3V0cHV0IGJsb2NrLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19pZGN0XzJ4MiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisJICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAxMCwgejE7CisgIEpDT0VGUFRSIGlucHRyOworICBJU0xPV19NVUxUX1RZUEUgKiBxdWFudHB0cjsKKyAgaW50ICogd3NwdHI7CisgIEpTQU1QUk9XIG91dHB0cjsKKyAgSlNBTVBMRSAqcmFuZ2VfbGltaXQgPSBJRENUX3JhbmdlX2xpbWl0KGNpbmZvKTsKKyAgaW50IGN0cjsKKyAgaW50IHdvcmtzcGFjZVtEQ1RTSVpFKjJdOwkvKiBidWZmZXJzIGRhdGEgYmV0d2VlbiBwYXNzZXMgKi8KKyAgU0hJRlRfVEVNUFMKKworICAvKiBQYXNzIDE6IHByb2Nlc3MgY29sdW1ucyBmcm9tIGlucHV0LCBzdG9yZSBpbnRvIHdvcmsgYXJyYXkuICovCisKKyAgaW5wdHIgPSBjb2VmX2Jsb2NrOworICBxdWFudHB0ciA9IChJU0xPV19NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSBEQ1RTSVpFOyBjdHIgPiAwOyBpbnB0cisrLCBxdWFudHB0cisrLCB3c3B0cisrLCBjdHItLSkgeworICAgIC8qIERvbid0IGJvdGhlciB0byBwcm9jZXNzIGNvbHVtbnMgMiw0LDYgKi8KKyAgICBpZiAoY3RyID09IERDVFNJWkUtMiB8fCBjdHIgPT0gRENUU0laRS00IHx8IGN0ciA9PSBEQ1RTSVpFLTYpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoaW5wdHJbRENUU0laRSoxXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqM10gPT0gMCAmJgorCWlucHRyW0RDVFNJWkUqNV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjddID09IDApIHsKKyAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvOyB3ZSBuZWVkIG5vdCBleGFtaW5lIHRlcm1zIDIsNCw2IGZvciAyeDIgb3V0cHV0ICovCisgICAgICBpbnQgZGN2YWwgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pIDw8IFBBU1MxX0JJVFM7CisgICAgICAKKyAgICAgIHdzcHRyW0RDVFNJWkUqMF0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqMV0gPSBkY3ZhbDsKKyAgICAgIAorICAgICAgY29udGludWU7CisgICAgfQorICAgIAorICAgIC8qIEV2ZW4gcGFydCAqLworICAgIAorICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKKyAgICB0bXAxMCA9IHoxIDw8IChDT05TVF9CSVRTKzIpOworICAgIAorICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo3XSwgcXVhbnRwdHJbRENUU0laRSo3XSk7CisgICAgdG1wMCA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzcyMDk1OTgyMik7IC8qIHNxcnQoMikgKiAoYzctYzUrYzMtYzEpICovCisgICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNV0sIHF1YW50cHRyW0RDVFNJWkUqNV0pOworICAgIHRtcDAgKz0gTVVMVElQTFkoejEsIEZJWF8wXzg1MDQzMDA5NSk7IC8qIHNxcnQoMikgKiAoLWMxK2MzK2M1K2M3KSAqLworICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjNdLCBxdWFudHB0cltEQ1RTSVpFKjNdKTsKKyAgICB0bXAwICs9IE1VTFRJUExZKHoxLCAtIEZJWF8xXzI3Mjc1ODU4MCk7IC8qIHNxcnQoMikgKiAoLWMxK2MzLWM1LWM3KSAqLworICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjFdLCBxdWFudHB0cltEQ1RTSVpFKjFdKTsKKyAgICB0bXAwICs9IE1VTFRJUExZKHoxLCBGSVhfM182MjQ1MDk3ODUpOyAvKiBzcXJ0KDIpICogKGMxK2MzK2M1K2M3KSAqLworCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlICovCisgICAgCisgICAgd3NwdHJbRENUU0laRSowXSA9IChpbnQpIERFU0NBTEUodG1wMTAgKyB0bXAwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMrMik7CisgICAgd3NwdHJbRENUU0laRSoxXSA9IChpbnQpIERFU0NBTEUodG1wMTAgLSB0bXAwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMrMik7CisgIH0KKyAgCisgIC8qIFBhc3MgMjogcHJvY2VzcyAyIHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4gKi8KKworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCAyOyBjdHIrKykgeworICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7CisgICAgLyogSXQncyBub3QgY2xlYXIgd2hldGhlciBhIHplcm8gcm93IHRlc3QgaXMgd29ydGh3aGlsZSBoZXJlIC4uLiAqLworCisjaWZuZGVmIE5PX1pFUk9fUk9XX1RFU1QKKyAgICBpZiAod3NwdHJbMV0gPT0gMCAmJiB3c3B0clszXSA9PSAwICYmIHdzcHRyWzVdID09IDAgJiYgd3NwdHJbN10gPT0gMCkgeworICAgICAgLyogQUMgdGVybXMgYWxsIHplcm8gKi8KKyAgICAgIEpTQU1QTEUgZGN2YWwgPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKChJTlQzMikgd3NwdHJbMF0sIFBBU1MxX0JJVFMrMykKKwkJCQkgICYgUkFOR0VfTUFTS107CisgICAgICAKKyAgICAgIG91dHB0clswXSA9IGRjdmFsOworICAgICAgb3V0cHRyWzFdID0gZGN2YWw7CisgICAgICAKKyAgICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyNlbmRpZgorICAgIAorICAgIC8qIEV2ZW4gcGFydCAqLworICAgIAorICAgIHRtcDEwID0gKChJTlQzMikgd3NwdHJbMF0pIDw8IChDT05TVF9CSVRTKzIpOworICAgIAorICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXAwID0gTVVMVElQTFkoKElOVDMyKSB3c3B0cls3XSwgLSBGSVhfMF83MjA5NTk4MjIpIC8qIHNxcnQoMikgKiAoYzctYzUrYzMtYzEpICovCisJICsgTVVMVElQTFkoKElOVDMyKSB3c3B0cls1XSwgRklYXzBfODUwNDMwMDk1KSAvKiBzcXJ0KDIpICogKC1jMStjMytjNStjNykgKi8KKwkgKyBNVUxUSVBMWSgoSU5UMzIpIHdzcHRyWzNdLCAtIEZJWF8xXzI3Mjc1ODU4MCkgLyogc3FydCgyKSAqICgtYzErYzMtYzUtYzcpICovCisJICsgTVVMVElQTFkoKElOVDMyKSB3c3B0clsxXSwgRklYXzNfNjI0NTA5Nzg1KTsgLyogc3FydCgyKSAqIChjMStjMytjNStjNykgKi8KKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworICAgIAorICAgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTAgKyB0bXAwLAorCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKzIpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMV0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEwIC0gdG1wMCwKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysyKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgCisgICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICB9Cit9CisKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMsCisgKiBwcm9kdWNpbmcgYSByZWR1Y2VkLXNpemUgMXgxIG91dHB1dCBibG9jay4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfaWRjdF8xeDEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorCSAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKK3sKKyAgaW50IGRjdmFsOworICBJU0xPV19NVUxUX1RZUEUgKiBxdWFudHB0cjsKKyAgSlNBTVBMRSAqcmFuZ2VfbGltaXQgPSBJRENUX3JhbmdlX2xpbWl0KGNpbmZvKTsKKyAgU0hJRlRfVEVNUFMKKworICAvKiBXZSBoYXJkbHkgbmVlZCBhbiBpbnZlcnNlIERDVCByb3V0aW5lIGZvciB0aGlzOiBqdXN0IHRha2UgdGhlCisgICAqIGF2ZXJhZ2UgcGl4ZWwgdmFsdWUsIHdoaWNoIGlzIG9uZS1laWdodGggb2YgdGhlIERDIGNvZWZmaWNpZW50LgorICAgKi8KKyAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKyAgZGN2YWwgPSBERVFVQU5USVpFKGNvZWZfYmxvY2tbMF0sIHF1YW50cHRyWzBdKTsKKyAgZGN2YWwgPSAoaW50KSBERVNDQUxFKChJTlQzMikgZGN2YWwsIDMpOworCisgIG91dHB1dF9idWZbMF1bb3V0cHV0X2NvbF0gPSByYW5nZV9saW1pdFtkY3ZhbCAmIFJBTkdFX01BU0tdOworfQorCisjZW5kaWYgLyogSURDVF9TQ0FMSU5HX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2ptZW1tZ3IuYyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qbWVtbWdyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdlYWQ0OAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qbWVtbWdyLmMKQEAgLTAsMCArMSwxMTIwIEBACisvKgorICogam1lbW1nci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEpQRUcgc3lzdGVtLWluZGVwZW5kZW50IG1lbW9yeSBtYW5hZ2VtZW50CisgKiByb3V0aW5lcy4gIFRoaXMgY29kZSBpcyB1c2FibGUgYWNyb3NzIGEgd2lkZSB2YXJpZXR5IG9mIG1hY2hpbmVzOyBtb3N0CisgKiBvZiB0aGUgc3lzdGVtIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gaXNvbGF0ZWQgaW4gYSBzZXBhcmF0ZSBmaWxlLgorICogVGhlIG1ham9yIGZ1bmN0aW9ucyBwcm92aWRlZCBoZXJlIGFyZToKKyAqICAgKiBwb29sLWJhc2VkIGFsbG9jYXRpb24gYW5kIGZyZWVpbmcgb2YgbWVtb3J5OworICogICAqIHBvbGljeSBkZWNpc2lvbnMgYWJvdXQgaG93IHRvIGRpdmlkZSBhdmFpbGFibGUgbWVtb3J5IGFtb25nIHRoZQorICogICAgIHZpcnR1YWwgYXJyYXlzOworICogICAqIGNvbnRyb2wgbG9naWMgZm9yIHN3YXBwaW5nIHZpcnR1YWwgYXJyYXlzIGJldHdlZW4gbWFpbiBtZW1vcnkgYW5kCisgKiAgICAgYmFja2luZyBzdG9yYWdlLgorICogVGhlIHNlcGFyYXRlIHN5c3RlbS1kZXBlbmRlbnQgZmlsZSBwcm92aWRlcyB0aGUgYWN0dWFsIGJhY2tpbmctc3RvcmFnZQorICogYWNjZXNzIGNvZGUsIGFuZCBpdCBjb250YWlucyB0aGUgcG9saWN5IGRlY2lzaW9uIGFib3V0IGhvdyBtdWNoIHRvdGFsCisgKiBtYWluIG1lbW9yeSB0byB1c2UuCisgKiBUaGlzIGZpbGUgaXMgc3lzdGVtLWRlcGVuZGVudCBpbiB0aGUgc2Vuc2UgdGhhdCBzb21lIG9mIGl0cyBmdW5jdGlvbnMKKyAqIGFyZSB1bm5lY2Vzc2FyeSBpbiBzb21lIHN5c3RlbXMuICBGb3IgZXhhbXBsZSwgaWYgdGhlcmUgaXMgZW5vdWdoIHZpcnR1YWwKKyAqIG1lbW9yeSBzbyB0aGF0IGJhY2tpbmcgc3RvcmFnZSB3aWxsIG5ldmVyIGJlIHVzZWQsIG11Y2ggb2YgdGhlIHZpcnR1YWwKKyAqIGFycmF5IGNvbnRyb2wgbG9naWMgY291bGQgYmUgcmVtb3ZlZC4gIChPZiBjb3Vyc2UsIGlmIHlvdSBoYXZlIHRoYXQgbXVjaAorICogbWVtb3J5IHRoZW4geW91IHNob3VsZG4ndCBjYXJlIGFib3V0IGEgbGl0dGxlIGJpdCBvZiB1bnVzZWQgY29kZS4uLikKKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjZGVmaW5lIEFNX01FTU9SWV9NQU5BR0VSCS8qIHdlIGRlZmluZSBqdmlydF9YYXJyYXlfY29udHJvbCBzdHJ1Y3RzICovCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiam1lbXN5cy5oIgkJLyogaW1wb3J0IHRoZSBzeXN0ZW0tZGVwZW5kZW50IGRlY2xhcmF0aW9ucyAqLworCisjZGVmaW5lIE5PX0dFVEVOVgkvKiBYWVE6IDIwMDctNS0yMiBEb24ndCB1c2UgaXQgKi8KKworI2lmbmRlZiBOT19HRVRFTlYKKyNpZm5kZWYgSEFWRV9TVERMSUJfSAkJLyogPHN0ZGxpYi5oPiBzaG91bGQgZGVjbGFyZSBnZXRlbnYoKSAqLworZXh0ZXJuIGNoYXIgKiBnZXRlbnYgSlBQKChjb25zdCBjaGFyICogbmFtZSkpOworI2VuZGlmCisjZW5kaWYKKworCisvKgorICogU29tZSBpbXBvcnRhbnQgbm90ZXM6CisgKiAgIFRoZSBhbGxvY2F0aW9uIHJvdXRpbmVzIHByb3ZpZGVkIGhlcmUgbXVzdCBuZXZlciByZXR1cm4gTlVMTC4KKyAqICAgVGhleSBzaG91bGQgZXhpdCB0byBlcnJvcl9leGl0IGlmIHVuc3VjY2Vzc2Z1bC4KKyAqCisgKiAgIEl0J3Mgbm90IGEgZ29vZCBpZGVhIHRvIHRyeSB0byBtZXJnZSB0aGUgc2FycmF5IGFuZCBiYXJyYXkgcm91dGluZXMsCisgKiAgIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHRleHR1YWxseSBhbG1vc3QgdGhlIHNhbWUsIGJlY2F1c2Ugc2FtcGxlcyBhcmUKKyAqICAgdXN1YWxseSBzdG9yZWQgYXMgYnl0ZXMgd2hpbGUgY29lZmZpY2llbnRzIGFyZSBzaG9ydHMgb3IgaW50cy4gIFRodXMsCisgKiAgIGluIG1hY2hpbmVzIHdoZXJlIGJ5dGUgcG9pbnRlcnMgaGF2ZSBhIGRpZmZlcmVudCByZXByZXNlbnRhdGlvbiBmcm9tCisgKiAgIHdvcmQgcG9pbnRlcnMsIHRoZSByZXN1bHRpbmcgbWFjaGluZSBjb2RlIGNvdWxkIG5vdCBiZSB0aGUgc2FtZS4KKyAqLworCisKKy8qCisgKiBNYW55IG1hY2hpbmVzIHJlcXVpcmUgc3RvcmFnZSBhbGlnbm1lbnQ6IGxvbmdzIG11c3Qgc3RhcnQgb24gNC1ieXRlCisgKiBib3VuZGFyaWVzLCBkb3VibGVzIG9uIDgtYnl0ZSBib3VuZGFyaWVzLCBldGMuICBPbiBzdWNoIG1hY2hpbmVzLCBtYWxsb2MoKQorICogYWx3YXlzIHJldHVybnMgcG9pbnRlcnMgdGhhdCBhcmUgbXVsdGlwbGVzIG9mIHRoZSB3b3JzdC1jYXNlIGFsaWdubWVudAorICogcmVxdWlyZW1lbnQsIGFuZCB3ZSBoYWQgYmV0dGVyIGRvIHNvIHRvby4KKyAqIFRoZXJlIGlzbid0IGFueSByZWFsbHkgcG9ydGFibGUgd2F5IHRvIGRldGVybWluZSB0aGUgd29yc3QtY2FzZSBhbGlnbm1lbnQKKyAqIHJlcXVpcmVtZW50LiAgVGhpcyBtb2R1bGUgYXNzdW1lcyB0aGF0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgaXMKKyAqIG11bHRpcGxlcyBvZiBzaXplb2YoQUxJR05fVFlQRSkuCisgKiBCeSBkZWZhdWx0LCB3ZSBkZWZpbmUgQUxJR05fVFlQRSBhcyBkb3VibGUuICBUaGlzIGlzIG5lY2Vzc2FyeSBvbiBzb21lCisgKiB3b3Jrc3RhdGlvbnMgKHdoZXJlIGRvdWJsZXMgcmVhbGx5IGRvIG5lZWQgOC1ieXRlIGFsaWdubWVudCkgYW5kIHdpbGwgd29yaworICogZmluZSBvbiBuZWFybHkgZXZlcnl0aGluZy4gIElmIHlvdXIgbWFjaGluZSBoYXMgbGVzc2VyIGFsaWdubWVudCBuZWVkcywKKyAqIHlvdSBjYW4gc2F2ZSBhIGZldyBieXRlcyBieSBtYWtpbmcgQUxJR05fVFlQRSBzbWFsbGVyLgorICogVGhlIG9ubHkgcGxhY2UgSSBrbm93IG9mIHdoZXJlIHRoaXMgd2lsbCBOT1Qgd29yayBpcyBjZXJ0YWluIE1hY2ludG9zaAorICogNjgweDAgY29tcGlsZXJzIHRoYXQgZGVmaW5lIGRvdWJsZSBhcyBhIDEwLWJ5dGUgSUVFRSBleHRlbmRlZCBmbG9hdC4KKyAqIERvaW5nIDEwLWJ5dGUgYWxpZ25tZW50IGlzIGNvdW50ZXJwcm9kdWN0aXZlIGJlY2F1c2UgbG9uZ3dvcmRzIHdvbid0IGJlCisgKiBhbGlnbmVkIHdlbGwuICBQdXQgIiNkZWZpbmUgQUxJR05fVFlQRSBsb25nIiBpbiBqY29uZmlnLmggaWYgeW91IGhhdmUKKyAqIHN1Y2ggYSBjb21waWxlci4KKyAqLworCisjaWZuZGVmIEFMSUdOX1RZUEUJCS8qIHNvIGNhbiBvdmVycmlkZSBmcm9tIGpjb25maWcuaCAqLworI2RlZmluZSBBTElHTl9UWVBFICBkb3VibGUKKyNlbmRpZgorCisKKy8qCisgKiBXZSBhbGxvY2F0ZSBvYmplY3RzIGZyb20gInBvb2xzIiwgd2hlcmUgZWFjaCBwb29sIGlzIGdvdHRlbiB3aXRoIGEgc2luZ2xlCisgKiByZXF1ZXN0IHRvIGpwZWdfZ2V0X3NtYWxsKCkgb3IganBlZ19nZXRfbGFyZ2UoKS4gIFRoZXJlIGlzIG5vIHBlci1vYmplY3QKKyAqIG92ZXJoZWFkIHdpdGhpbiBhIHBvb2wsIGV4Y2VwdCBmb3IgYWxpZ25tZW50IHBhZGRpbmcuICBFYWNoIHBvb2wgaGFzIGEKKyAqIGhlYWRlciB3aXRoIGEgbGluayB0byB0aGUgbmV4dCBwb29sIG9mIHRoZSBzYW1lIGNsYXNzLgorICogU21hbGwgYW5kIGxhcmdlIHBvb2wgaGVhZGVycyBhcmUgaWRlbnRpY2FsIGV4Y2VwdCB0aGF0IHRoZSBsYXR0ZXIncworICogbGluayBwb2ludGVyIG11c3QgYmUgRkFSIG9uIDgweDg2IG1hY2hpbmVzLgorICogTm90aWNlIHRoYXQgdGhlICJyZWFsIiBoZWFkZXIgZmllbGRzIGFyZSB1bmlvbidlZCB3aXRoIGEgZHVtbXkgQUxJR05fVFlQRQorICogZmllbGQuICBUaGlzIGZvcmNlcyB0aGUgY29tcGlsZXIgdG8gbWFrZSBTSVpFT0Yoc21hbGxfcG9vbF9oZHIpIGEgbXVsdGlwbGUKKyAqIG9mIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgb2YgQUxJR05fVFlQRS4KKyAqLworCit0eXBlZGVmIHVuaW9uIHNtYWxsX3Bvb2xfc3RydWN0ICogc21hbGxfcG9vbF9wdHI7CisKK3R5cGVkZWYgdW5pb24gc21hbGxfcG9vbF9zdHJ1Y3QgeworICBzdHJ1Y3QgeworICAgIHNtYWxsX3Bvb2xfcHRyIG5leHQ7CS8qIG5leHQgaW4gbGlzdCBvZiBwb29scyAqLworICAgIHNpemVfdCBieXRlc191c2VkOwkJLyogaG93IG1hbnkgYnl0ZXMgYWxyZWFkeSB1c2VkIHdpdGhpbiBwb29sICovCisgICAgc2l6ZV90IGJ5dGVzX2xlZnQ7CQkvKiBieXRlcyBzdGlsbCBhdmFpbGFibGUgaW4gdGhpcyBwb29sICovCisgIH0gaGRyOworICBBTElHTl9UWVBFIGR1bW15OwkJLyogaW5jbHVkZWQgaW4gdW5pb24gdG8gZW5zdXJlIGFsaWdubWVudCAqLworfSBzbWFsbF9wb29sX2hkcjsKKwordHlwZWRlZiB1bmlvbiBsYXJnZV9wb29sX3N0cnVjdCBGQVIgKiBsYXJnZV9wb29sX3B0cjsKKwordHlwZWRlZiB1bmlvbiBsYXJnZV9wb29sX3N0cnVjdCB7CisgIHN0cnVjdCB7CisgICAgbGFyZ2VfcG9vbF9wdHIgbmV4dDsJLyogbmV4dCBpbiBsaXN0IG9mIHBvb2xzICovCisgICAgc2l6ZV90IGJ5dGVzX3VzZWQ7CQkvKiBob3cgbWFueSBieXRlcyBhbHJlYWR5IHVzZWQgd2l0aGluIHBvb2wgKi8KKyAgICBzaXplX3QgYnl0ZXNfbGVmdDsJCS8qIGJ5dGVzIHN0aWxsIGF2YWlsYWJsZSBpbiB0aGlzIHBvb2wgKi8KKyAgfSBoZHI7CisgIEFMSUdOX1RZUEUgZHVtbXk7CQkvKiBpbmNsdWRlZCBpbiB1bmlvbiB0byBlbnN1cmUgYWxpZ25tZW50ICovCit9IGxhcmdlX3Bvb2xfaGRyOworCisKKy8qCisgKiBIZXJlIGlzIHRoZSBmdWxsIGRlZmluaXRpb24gb2YgYSBtZW1vcnkgbWFuYWdlciBvYmplY3QuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19tZW1vcnlfbWdyIHB1YjsJLyogcHVibGljIGZpZWxkcyAqLworCisgIC8qIEVhY2ggcG9vbCBpZGVudGlmaWVyIChsaWZldGltZSBjbGFzcykgbmFtZXMgYSBsaW5rZWQgbGlzdCBvZiBwb29scy4gKi8KKyAgc21hbGxfcG9vbF9wdHIgc21hbGxfbGlzdFtKUE9PTF9OVU1QT09MU107CisgIGxhcmdlX3Bvb2xfcHRyIGxhcmdlX2xpc3RbSlBPT0xfTlVNUE9PTFNdOworCisgIC8qIFNpbmNlIHdlIG9ubHkgaGF2ZSBvbmUgbGlmZXRpbWUgY2xhc3Mgb2YgdmlydHVhbCBhcnJheXMsIG9ubHkgb25lCisgICAqIGxpbmtlZCBsaXN0IGlzIG5lY2Vzc2FyeSAoZm9yIGVhY2ggZGF0YXR5cGUpLiAgTm90ZSB0aGF0IHRoZSB2aXJ0dWFsCisgICAqIGFycmF5IGNvbnRyb2wgYmxvY2tzIGJlaW5nIGxpbmtlZCB0b2dldGhlciBhcmUgYWN0dWFsbHkgc3RvcmVkIHNvbWV3aGVyZQorICAgKiBpbiB0aGUgc21hbGwtcG9vbCBsaXN0LgorICAgKi8KKyAganZpcnRfc2FycmF5X3B0ciB2aXJ0X3NhcnJheV9saXN0OworICBqdmlydF9iYXJyYXlfcHRyIHZpcnRfYmFycmF5X2xpc3Q7CisKKyAgLyogVGhpcyBjb3VudHMgdG90YWwgc3BhY2Ugb2J0YWluZWQgZnJvbSBqcGVnX2dldF9zbWFsbC9sYXJnZSAqLworICBsb25nIHRvdGFsX3NwYWNlX2FsbG9jYXRlZDsKKworICAvKiBhbGxvY19zYXJyYXkgYW5kIGFsbG9jX2JhcnJheSBzZXQgdGhpcyB2YWx1ZSBmb3IgdXNlIGJ5IHZpcnR1YWwKKyAgICogYXJyYXkgcm91dGluZXMuCisgICAqLworICBKRElNRU5TSU9OIGxhc3Rfcm93c3BlcmNodW5rOwkvKiBmcm9tIG1vc3QgcmVjZW50IGFsbG9jX3NhcnJheS9iYXJyYXkgKi8KK30gbXlfbWVtb3J5X21ncjsKKwordHlwZWRlZiBteV9tZW1vcnlfbWdyICogbXlfbWVtX3B0cjsKKworCisvKgorICogVGhlIGNvbnRyb2wgYmxvY2tzIGZvciB2aXJ0dWFsIGFycmF5cy4KKyAqIE5vdGUgdGhhdCB0aGVzZSBibG9ja3MgYXJlIGFsbG9jYXRlZCBpbiB0aGUgInNtYWxsIiBwb29sIGFyZWEuCisgKiBTeXN0ZW0tZGVwZW5kZW50IGluZm8gZm9yIHRoZSBhc3NvY2lhdGVkIGJhY2tpbmcgc3RvcmUgKGlmIGFueSkgaXMgaGlkZGVuCisgKiBpbnNpZGUgdGhlIGJhY2tpbmdfc3RvcmVfaW5mbyBzdHJ1Y3QuCisgKi8KKworc3RydWN0IGp2aXJ0X3NhcnJheV9jb250cm9sIHsKKyAgSlNBTVBBUlJBWSBtZW1fYnVmZmVyOwkvKiA9PiB0aGUgaW4tbWVtb3J5IGJ1ZmZlciAqLworICBKRElNRU5TSU9OIHJvd3NfaW5fYXJyYXk7CS8qIHRvdGFsIHZpcnR1YWwgYXJyYXkgaGVpZ2h0ICovCisgIEpESU1FTlNJT04gc2FtcGxlc3BlcnJvdzsJLyogd2lkdGggb2YgYXJyYXkgKGFuZCBvZiBtZW1vcnkgYnVmZmVyKSAqLworICBKRElNRU5TSU9OIG1heGFjY2VzczsJCS8qIG1heCByb3dzIGFjY2Vzc2VkIGJ5IGFjY2Vzc192aXJ0X3NhcnJheSAqLworICBKRElNRU5TSU9OIHJvd3NfaW5fbWVtOwkvKiBoZWlnaHQgb2YgbWVtb3J5IGJ1ZmZlciAqLworICBKRElNRU5TSU9OIHJvd3NwZXJjaHVuazsJLyogYWxsb2NhdGlvbiBjaHVuayBzaXplIGluIG1lbV9idWZmZXIgKi8KKyAgSkRJTUVOU0lPTiBjdXJfc3RhcnRfcm93OwkvKiBmaXJzdCBsb2dpY2FsIHJvdyAjIGluIHRoZSBidWZmZXIgKi8KKyAgSkRJTUVOU0lPTiBmaXJzdF91bmRlZl9yb3c7CS8qIHJvdyAjIG9mIGZpcnN0IHVuaW5pdGlhbGl6ZWQgcm93ICovCisgIGJvb2xlYW4gcHJlX3plcm87CQkvKiBwcmUtemVybyBtb2RlIHJlcXVlc3RlZD8gKi8KKyAgYm9vbGVhbiBkaXJ0eTsJCS8qIGRvIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIG5lZWQgd3JpdHRlbj8gKi8KKyAgYm9vbGVhbiBiX3Nfb3BlbjsJCS8qIGlzIGJhY2tpbmctc3RvcmUgZGF0YSB2YWxpZD8gKi8KKyAganZpcnRfc2FycmF5X3B0ciBuZXh0OwkvKiBsaW5rIHRvIG5leHQgdmlydHVhbCBzYXJyYXkgY29udHJvbCBibG9jayAqLworICBiYWNraW5nX3N0b3JlX2luZm8gYl9zX2luZm87CS8qIFN5c3RlbS1kZXBlbmRlbnQgY29udHJvbCBpbmZvICovCit9OworCitzdHJ1Y3QganZpcnRfYmFycmF5X2NvbnRyb2wgeworICBKQkxPQ0tBUlJBWSBtZW1fYnVmZmVyOwkvKiA9PiB0aGUgaW4tbWVtb3J5IGJ1ZmZlciAqLworICBKRElNRU5TSU9OIHJvd3NfaW5fYXJyYXk7CS8qIHRvdGFsIHZpcnR1YWwgYXJyYXkgaGVpZ2h0ICovCisgIEpESU1FTlNJT04gYmxvY2tzcGVycm93OwkvKiB3aWR0aCBvZiBhcnJheSAoYW5kIG9mIG1lbW9yeSBidWZmZXIpICovCisgIEpESU1FTlNJT04gbWF4YWNjZXNzOwkJLyogbWF4IHJvd3MgYWNjZXNzZWQgYnkgYWNjZXNzX3ZpcnRfYmFycmF5ICovCisgIEpESU1FTlNJT04gcm93c19pbl9tZW07CS8qIGhlaWdodCBvZiBtZW1vcnkgYnVmZmVyICovCisgIEpESU1FTlNJT04gcm93c3BlcmNodW5rOwkvKiBhbGxvY2F0aW9uIGNodW5rIHNpemUgaW4gbWVtX2J1ZmZlciAqLworICBKRElNRU5TSU9OIGN1cl9zdGFydF9yb3c7CS8qIGZpcnN0IGxvZ2ljYWwgcm93ICMgaW4gdGhlIGJ1ZmZlciAqLworICBKRElNRU5TSU9OIGZpcnN0X3VuZGVmX3JvdzsJLyogcm93ICMgb2YgZmlyc3QgdW5pbml0aWFsaXplZCByb3cgKi8KKyAgYm9vbGVhbiBwcmVfemVybzsJCS8qIHByZS16ZXJvIG1vZGUgcmVxdWVzdGVkPyAqLworICBib29sZWFuIGRpcnR5OwkJLyogZG8gY3VycmVudCBidWZmZXIgY29udGVudHMgbmVlZCB3cml0dGVuPyAqLworICBib29sZWFuIGJfc19vcGVuOwkJLyogaXMgYmFja2luZy1zdG9yZSBkYXRhIHZhbGlkPyAqLworICBqdmlydF9iYXJyYXlfcHRyIG5leHQ7CS8qIGxpbmsgdG8gbmV4dCB2aXJ0dWFsIGJhcnJheSBjb250cm9sIGJsb2NrICovCisgIGJhY2tpbmdfc3RvcmVfaW5mbyBiX3NfaW5mbzsJLyogU3lzdGVtLWRlcGVuZGVudCBjb250cm9sIGluZm8gKi8KK307CisKKworI2lmZGVmIE1FTV9TVEFUUwkJLyogb3B0aW9uYWwgZXh0cmEgc3R1ZmYgZm9yIHN0YXRpc3RpY3MgKi8KKworTE9DQUwodm9pZCkKK3ByaW50X21lbV9zdGF0cyAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCkKK3sKKyAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKKyAgc21hbGxfcG9vbF9wdHIgc2hkcl9wdHI7CisgIGxhcmdlX3Bvb2xfcHRyIGxoZHJfcHRyOworCisgIC8qIFNpbmNlIHRoaXMgaXMgb25seSBhIGRlYnVnZ2luZyBzdHViLCB3ZSBjYW4gY2hlYXQgYSBsaXR0bGUgYnkgdXNpbmcKKyAgICogZnByaW50ZiBkaXJlY3RseSByYXRoZXIgdGhhbiBnb2luZyB0aHJvdWdoIHRoZSB0cmFjZSBtZXNzYWdlIGNvZGUuCisgICAqIFRoaXMgaXMgaGVscGZ1bCBiZWNhdXNlIG1lc3NhZ2UgcGFybSBhcnJheSBjYW4ndCBoYW5kbGUgbG9uZ3MuCisgICAqLworICBGWFNZU19mcHJpbnRmKHN0ZGVyciwgIkZyZWVpbmcgcG9vbCAlZCwgdG90YWwgc3BhY2UgPSAlbGRcbiIsCisJICBwb29sX2lkLCBtZW0tPnRvdGFsX3NwYWNlX2FsbG9jYXRlZCk7CisKKyAgZm9yIChsaGRyX3B0ciA9IG1lbS0+bGFyZ2VfbGlzdFtwb29sX2lkXTsgbGhkcl9wdHIgIT0gTlVMTDsKKyAgICAgICBsaGRyX3B0ciA9IGxoZHJfcHRyLT5oZHIubmV4dCkgeworICAgIEZYU1lTX2ZwcmludGYoc3RkZXJyLCAiICBMYXJnZSBjaHVuayB1c2VkICVsZFxuIiwKKwkgICAgKGxvbmcpIGxoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCk7CisgIH0KKworICBmb3IgKHNoZHJfcHRyID0gbWVtLT5zbWFsbF9saXN0W3Bvb2xfaWRdOyBzaGRyX3B0ciAhPSBOVUxMOworICAgICAgIHNoZHJfcHRyID0gc2hkcl9wdHItPmhkci5uZXh0KSB7CisgICAgRlhTWVNfZnByaW50ZihzdGRlcnIsICIgIFNtYWxsIGNodW5rIHVzZWQgJWxkIGZyZWUgJWxkXG4iLAorCSAgICAobG9uZykgc2hkcl9wdHItPmhkci5ieXRlc191c2VkLAorCSAgICAobG9uZykgc2hkcl9wdHItPmhkci5ieXRlc19sZWZ0KTsKKyAgfQorfQorCisjZW5kaWYgLyogTUVNX1NUQVRTICovCisKKworTE9DQUwodm9pZCkKK291dF9vZl9tZW1vcnkgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHdoaWNoKQorLyogUmVwb3J0IGFuIG91dC1vZi1tZW1vcnkgZXJyb3IgYW5kIHN0b3AgZXhlY3V0aW9uICovCisvKiBJZiB3ZSBjb21waWxlZCBNRU1fU1RBVFMgc3VwcG9ydCwgcmVwb3J0IGFsbG9jIHJlcXVlc3RzIGJlZm9yZSBkeWluZyAqLworeworI2lmZGVmIE1FTV9TVEFUUworICBjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCA9IDI7CS8qIGZvcmNlIHNlbGZfZGVzdHJ1Y3QgdG8gcmVwb3J0IHN0YXRzICovCisjZW5kaWYKKyAgRVJSRVhJVDEoY2luZm8sIEpFUlJfT1VUX09GX01FTU9SWSwgd2hpY2gpOworfQorCisKKy8qCisgKiBBbGxvY2F0aW9uIG9mICJzbWFsbCIgb2JqZWN0cy4KKyAqCisgKiBGb3IgdGhlc2UsIHdlIHVzZSBwb29sZWQgc3RvcmFnZS4gIFdoZW4gYSBuZXcgcG9vbCBtdXN0IGJlIGNyZWF0ZWQsCisgKiB3ZSB0cnkgdG8gZ2V0IGVub3VnaCBzcGFjZSBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdCBwbHVzIGEgInNsb3AiIGZhY3RvciwKKyAqIHdoZXJlIHRoZSBzbG9wIHdpbGwgYmUgdGhlIGFtb3VudCBvZiBsZWZ0b3ZlciBzcGFjZSBpbiB0aGUgbmV3IHBvb2wuCisgKiBUaGUgc3BlZWQgdnMuIHNwYWNlIHRyYWRlb2ZmIGlzIGxhcmdlbHkgZGV0ZXJtaW5lZCBieSB0aGUgc2xvcCB2YWx1ZXMuCisgKiBBIGRpZmZlcmVudCBzbG9wIHZhbHVlIGlzIHByb3ZpZGVkIGZvciBlYWNoIHBvb2wgY2xhc3MgKGxpZmV0aW1lKSwKKyAqIGFuZCB3ZSBhbHNvIGRpc3Rpbmd1aXNoIHRoZSBmaXJzdCBwb29sIG9mIGEgY2xhc3MgZnJvbSBsYXRlciBvbmVzLgorICogTk9URTogdGhlIHZhbHVlcyBnaXZlbiB3b3JrIGZhaXJseSB3ZWxsIG9uIGJvdGggMTYtIGFuZCAzMi1iaXQtaW50CisgKiBtYWNoaW5lcywgYnV0IG1heSBiZSB0b28gc21hbGwgaWYgbG9uZ3MgYXJlIDY0IGJpdHMgb3IgbW9yZS4KKyAqLworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGZpcnN0X3Bvb2xfc2xvcFtKUE9PTF9OVU1QT09MU10gPSAKK3sKKwkxNjAwLAkJCS8qIGZpcnN0IFBFUk1BTkVOVCBwb29sICovCisJMTYwMDAJCQkvKiBmaXJzdCBJTUFHRSBwb29sICovCit9OworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGV4dHJhX3Bvb2xfc2xvcFtKUE9PTF9OVU1QT09MU10gPSAKK3sKKwkwLAkJCS8qIGFkZGl0aW9uYWwgUEVSTUFORU5UIHBvb2xzICovCisJNTAwMAkJCS8qIGFkZGl0aW9uYWwgSU1BR0UgcG9vbHMgKi8KK307CisKKyNkZWZpbmUgTUlOX1NMT1AgIDUwCQkvKiBncmVhdGVyIHRoYW4gMCB0byBhdm9pZCBmdXRpbGUgbG9vcGluZyAqLworCisKK01FVEhPRERFRih2b2lkICopCithbGxvY19zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwgc2l6ZV90IHNpemVvZm9iamVjdCkKKy8qIEFsbG9jYXRlIGEgInNtYWxsIiBvYmplY3QgKi8KK3sKKyAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKKyAgc21hbGxfcG9vbF9wdHIgaGRyX3B0ciwgcHJldl9oZHJfcHRyOworICBjaGFyICogZGF0YV9wdHI7CisgIHNpemVfdCBvZGRfYnl0ZXMsIG1pbl9yZXF1ZXN0LCBzbG9wOworCisgIC8qIENoZWNrIGZvciB1bnNhdGlzZmlhYmxlIHJlcXVlc3QgKGRvIG5vdyB0byBlbnN1cmUgbm8gb3ZlcmZsb3cgYmVsb3cpICovCisgIGlmIChzaXplb2ZvYmplY3QgPiAoc2l6ZV90KSAoTUFYX0FMTE9DX0NIVU5LLVNJWkVPRihzbWFsbF9wb29sX2hkcikpKQorICAgIG91dF9vZl9tZW1vcnkoY2luZm8sIDEpOwkvKiByZXF1ZXN0IGV4Y2VlZHMgbWFsbG9jJ3MgYWJpbGl0eSAqLworCisgIC8qIFJvdW5kIHVwIHRoZSByZXF1ZXN0ZWQgc2l6ZSB0byBhIG11bHRpcGxlIG9mIFNJWkVPRihBTElHTl9UWVBFKSAqLworICBvZGRfYnl0ZXMgPSBzaXplb2ZvYmplY3QgJSBTSVpFT0YoQUxJR05fVFlQRSk7CisgIGlmIChvZGRfYnl0ZXMgPiAwKQorICAgIHNpemVvZm9iamVjdCArPSBTSVpFT0YoQUxJR05fVFlQRSkgLSBvZGRfYnl0ZXM7CisKKyAgLyogU2VlIGlmIHNwYWNlIGlzIGF2YWlsYWJsZSBpbiBhbnkgZXhpc3RpbmcgcG9vbCAqLworICBpZiAocG9vbF9pZCA8IDAgfHwgcG9vbF9pZCA+PSBKUE9PTF9OVU1QT09MUykKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUE9PTF9JRCwgcG9vbF9pZCk7CS8qIHNhZmV0eSBjaGVjayAqLworICBwcmV2X2hkcl9wdHIgPSBOVUxMOworICBoZHJfcHRyID0gbWVtLT5zbWFsbF9saXN0W3Bvb2xfaWRdOworICB3aGlsZSAoaGRyX3B0ciAhPSBOVUxMKSB7CisgICAgaWYgKGhkcl9wdHItPmhkci5ieXRlc19sZWZ0ID49IHNpemVvZm9iamVjdCkKKyAgICAgIGJyZWFrOwkJCS8qIGZvdW5kIHBvb2wgd2l0aCBlbm91Z2ggc3BhY2UgKi8KKyAgICBwcmV2X2hkcl9wdHIgPSBoZHJfcHRyOworICAgIGhkcl9wdHIgPSBoZHJfcHRyLT5oZHIubmV4dDsKKyAgfQorCisgIC8qIFRpbWUgdG8gbWFrZSBhIG5ldyBwb29sPyAqLworICBpZiAoaGRyX3B0ciA9PSBOVUxMKSB7CisgICAgLyogbWluX3JlcXVlc3QgaXMgd2hhdCB3ZSBuZWVkIG5vdywgc2xvcCBpcyB3aGF0IHdpbGwgYmUgbGVmdG92ZXIgKi8KKyAgICBtaW5fcmVxdWVzdCA9IHNpemVvZm9iamVjdCArIFNJWkVPRihzbWFsbF9wb29sX2hkcik7CisgICAgaWYgKHByZXZfaGRyX3B0ciA9PSBOVUxMKQkvKiBmaXJzdCBwb29sIGluIGNsYXNzPyAqLworICAgICAgc2xvcCA9IGZpcnN0X3Bvb2xfc2xvcFtwb29sX2lkXTsKKyAgICBlbHNlCisgICAgICBzbG9wID0gZXh0cmFfcG9vbF9zbG9wW3Bvb2xfaWRdOworICAgIC8qIERvbid0IGFzayBmb3IgbW9yZSB0aGFuIE1BWF9BTExPQ19DSFVOSyAqLworICAgIGlmIChzbG9wID4gKHNpemVfdCkgKE1BWF9BTExPQ19DSFVOSy1taW5fcmVxdWVzdCkpCisgICAgICBzbG9wID0gKHNpemVfdCkgKE1BWF9BTExPQ19DSFVOSy1taW5fcmVxdWVzdCk7CisgICAgLyogVHJ5IHRvIGdldCBzcGFjZSwgaWYgZmFpbCByZWR1Y2Ugc2xvcCBhbmQgdHJ5IGFnYWluICovCisgICAgZm9yICg7OykgeworICAgICAgaGRyX3B0ciA9IChzbWFsbF9wb29sX3B0cikganBlZ19nZXRfc21hbGwoY2luZm8sIG1pbl9yZXF1ZXN0ICsgc2xvcCk7CisgICAgICBpZiAoaGRyX3B0ciAhPSBOVUxMKQorCWJyZWFrOworICAgICAgc2xvcCAvPSAyOworICAgICAgaWYgKHNsb3AgPCBNSU5fU0xPUCkJLyogZ2l2ZSB1cCB3aGVuIGl0IGdldHMgcmVhbCBzbWFsbCAqLworCW91dF9vZl9tZW1vcnkoY2luZm8sIDIpOyAvKiBqcGVnX2dldF9zbWFsbCBmYWlsZWQgKi8KKyAgICB9CisgICAgbWVtLT50b3RhbF9zcGFjZV9hbGxvY2F0ZWQgKz0gbWluX3JlcXVlc3QgKyBzbG9wOworICAgIC8qIFN1Y2Nlc3MsIGluaXRpYWxpemUgdGhlIG5ldyBwb29sIGhlYWRlciBhbmQgYWRkIHRvIGVuZCBvZiBsaXN0ICovCisgICAgaGRyX3B0ci0+aGRyLm5leHQgPSBOVUxMOworICAgIGhkcl9wdHItPmhkci5ieXRlc191c2VkID0gMDsKKyAgICBoZHJfcHRyLT5oZHIuYnl0ZXNfbGVmdCA9IHNpemVvZm9iamVjdCArIHNsb3A7CisgICAgaWYgKHByZXZfaGRyX3B0ciA9PSBOVUxMKQkvKiBmaXJzdCBwb29sIGluIGNsYXNzPyAqLworICAgICAgbWVtLT5zbWFsbF9saXN0W3Bvb2xfaWRdID0gaGRyX3B0cjsKKyAgICBlbHNlCisgICAgICBwcmV2X2hkcl9wdHItPmhkci5uZXh0ID0gaGRyX3B0cjsKKyAgfQorCisgIC8qIE9LLCBhbGxvY2F0ZSB0aGUgb2JqZWN0IGZyb20gdGhlIGN1cnJlbnQgcG9vbCAqLworICBkYXRhX3B0ciA9IChjaGFyICopIChoZHJfcHRyICsgMSk7IC8qIHBvaW50IHRvIGZpcnN0IGRhdGEgYnl0ZSBpbiBwb29sICovCisgIGRhdGFfcHRyICs9IGhkcl9wdHItPmhkci5ieXRlc191c2VkOyAvKiBwb2ludCB0byBwbGFjZSBmb3Igb2JqZWN0ICovCisgIGhkcl9wdHItPmhkci5ieXRlc191c2VkICs9IHNpemVvZm9iamVjdDsKKyAgaGRyX3B0ci0+aGRyLmJ5dGVzX2xlZnQgLT0gc2l6ZW9mb2JqZWN0OworCisgIHJldHVybiAodm9pZCAqKSBkYXRhX3B0cjsKK30KKworCisvKgorICogQWxsb2NhdGlvbiBvZiAibGFyZ2UiIG9iamVjdHMuCisgKgorICogVGhlIGV4dGVybmFsIHNlbWFudGljcyBvZiB0aGVzZSBhcmUgdGhlIHNhbWUgYXMgInNtYWxsIiBvYmplY3RzLAorICogZXhjZXB0IHRoYXQgRkFSIHBvaW50ZXJzIGFyZSB1c2VkIG9uIDgweDg2LiAgSG93ZXZlciB0aGUgcG9vbAorICogbWFuYWdlbWVudCBoZXVyaXN0aWNzIGFyZSBxdWl0ZSBkaWZmZXJlbnQuICBXZSBhc3N1bWUgdGhhdCBlYWNoCisgKiByZXF1ZXN0IGlzIGxhcmdlIGVub3VnaCB0aGF0IGl0IG1heSBhcyB3ZWxsIGJlIHBhc3NlZCBkaXJlY3RseSB0bworICoganBlZ19nZXRfbGFyZ2U7IHRoZSBwb29sIG1hbmFnZW1lbnQganVzdCBsaW5rcyBldmVyeXRoaW5nIHRvZ2V0aGVyCisgKiBzbyB0aGF0IHdlIGNhbiBmcmVlIGl0IGFsbCBvbiBkZW1hbmQuCisgKiBOb3RlOiB0aGUgbWFqb3IgdXNlIG9mICJsYXJnZSIgb2JqZWN0cyBpcyBpbiBKU0FNUEFSUkFZIGFuZCBKQkxPQ0tBUlJBWQorICogc3RydWN0dXJlcy4gIFRoZSByb3V0aW5lcyB0aGF0IGNyZWF0ZSB0aGVzZSBzdHJ1Y3R1cmVzIChzZWUgYmVsb3cpCisgKiBkZWxpYmVyYXRlbHkgYnVuY2ggcm93cyB0b2dldGhlciB0byBlbnN1cmUgYSBsYXJnZSByZXF1ZXN0IHNpemUuCisgKi8KKworTUVUSE9EREVGKHZvaWQgRkFSICopCithbGxvY19sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwgc2l6ZV90IHNpemVvZm9iamVjdCkKKy8qIEFsbG9jYXRlIGEgImxhcmdlIiBvYmplY3QgKi8KK3sKKyAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKKyAgbGFyZ2VfcG9vbF9wdHIgaGRyX3B0cjsKKyAgc2l6ZV90IG9kZF9ieXRlczsKKworICAvKiBDaGVjayBmb3IgdW5zYXRpc2ZpYWJsZSByZXF1ZXN0IChkbyBub3cgdG8gZW5zdXJlIG5vIG92ZXJmbG93IGJlbG93KSAqLworICBpZiAoc2l6ZW9mb2JqZWN0ID4gKHNpemVfdCkgKE1BWF9BTExPQ19DSFVOSy1TSVpFT0YobGFyZ2VfcG9vbF9oZHIpKSkKKyAgICBvdXRfb2ZfbWVtb3J5KGNpbmZvLCAzKTsJLyogcmVxdWVzdCBleGNlZWRzIG1hbGxvYydzIGFiaWxpdHkgKi8KKworICAvKiBSb3VuZCB1cCB0aGUgcmVxdWVzdGVkIHNpemUgdG8gYSBtdWx0aXBsZSBvZiBTSVpFT0YoQUxJR05fVFlQRSkgKi8KKyAgb2RkX2J5dGVzID0gc2l6ZW9mb2JqZWN0ICUgU0laRU9GKEFMSUdOX1RZUEUpOworICBpZiAob2RkX2J5dGVzID4gMCkKKyAgICBzaXplb2ZvYmplY3QgKz0gU0laRU9GKEFMSUdOX1RZUEUpIC0gb2RkX2J5dGVzOworCisgIC8qIEFsd2F5cyBtYWtlIGEgbmV3IHBvb2wgKi8KKyAgaWYgKHBvb2xfaWQgPCAwIHx8IHBvb2xfaWQgPj0gSlBPT0xfTlVNUE9PTFMpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BPT0xfSUQsIHBvb2xfaWQpOwkvKiBzYWZldHkgY2hlY2sgKi8KKworICBoZHJfcHRyID0gKGxhcmdlX3Bvb2xfcHRyKSBqcGVnX2dldF9sYXJnZShjaW5mbywgc2l6ZW9mb2JqZWN0ICsKKwkJCQkJICAgIFNJWkVPRihsYXJnZV9wb29sX2hkcikpOworICBpZiAoaGRyX3B0ciA9PSBOVUxMKQorICAgIG91dF9vZl9tZW1vcnkoY2luZm8sIDQpOwkvKiBqcGVnX2dldF9sYXJnZSBmYWlsZWQgKi8KKyAgbWVtLT50b3RhbF9zcGFjZV9hbGxvY2F0ZWQgKz0gc2l6ZW9mb2JqZWN0ICsgU0laRU9GKGxhcmdlX3Bvb2xfaGRyKTsKKworICAvKiBTdWNjZXNzLCBpbml0aWFsaXplIHRoZSBuZXcgcG9vbCBoZWFkZXIgYW5kIGFkZCB0byBsaXN0ICovCisgIGhkcl9wdHItPmhkci5uZXh0ID0gbWVtLT5sYXJnZV9saXN0W3Bvb2xfaWRdOworICAvKiBXZSBtYWludGFpbiBzcGFjZSBjb3VudHMgaW4gZWFjaCBwb29sIGhlYWRlciBmb3Igc3RhdGlzdGljYWwgcHVycG9zZXMsCisgICAqIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIG5vdCBuZWVkZWQgZm9yIGFsbG9jYXRpb24uCisgICAqLworICBoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCA9IHNpemVvZm9iamVjdDsKKyAgaGRyX3B0ci0+aGRyLmJ5dGVzX2xlZnQgPSAwOworICBtZW0tPmxhcmdlX2xpc3RbcG9vbF9pZF0gPSBoZHJfcHRyOworCisgIHJldHVybiAodm9pZCBGQVIgKikgKGhkcl9wdHIgKyAxKTsgLyogcG9pbnQgdG8gZmlyc3QgZGF0YSBieXRlIGluIHBvb2wgKi8KK30KKworCisvKgorICogQ3JlYXRpb24gb2YgMi1EIHNhbXBsZSBhcnJheXMuCisgKiBUaGUgcG9pbnRlcnMgYXJlIGluIG5lYXIgaGVhcCwgdGhlIHNhbXBsZXMgdGhlbXNlbHZlcyBpbiBGQVIgaGVhcC4KKyAqCisgKiBUbyBtaW5pbWl6ZSBhbGxvY2F0aW9uIG92ZXJoZWFkIGFuZCB0byBhbGxvdyBJL08gb2YgbGFyZ2UgY29udGlndW91cworICogYmxvY2tzLCB3ZSBhbGxvY2F0ZSB0aGUgc2FtcGxlIHJvd3MgaW4gZ3JvdXBzIG9mIGFzIG1hbnkgcm93cyBhcyBwb3NzaWJsZQorICogd2l0aG91dCBleGNlZWRpbmcgTUFYX0FMTE9DX0NIVU5LIHRvdGFsIGJ5dGVzIHBlciBhbGxvY2F0aW9uIHJlcXVlc3QuCisgKiBOQjogdGhlIHZpcnR1YWwgYXJyYXkgY29udHJvbCByb3V0aW5lcywgbGF0ZXIgaW4gdGhpcyBmaWxlLCBrbm93IGFib3V0CisgKiB0aGlzIGNodW5raW5nIG9mIHJvd3MuICBUaGUgcm93c3BlcmNodW5rIHZhbHVlIGlzIGxlZnQgaW4gdGhlIG1lbSBtYW5hZ2VyCisgKiBvYmplY3Qgc28gdGhhdCBpdCBjYW4gYmUgc2F2ZWQgYXdheSBpZiB0aGlzIHNhcnJheSBpcyB0aGUgd29ya3NwYWNlIGZvcgorICogYSB2aXJ0dWFsIGFycmF5LgorICovCisKK01FVEhPRERFRihKU0FNUEFSUkFZKQorYWxsb2Nfc2FycmF5IChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLAorCSAgICAgIEpESU1FTlNJT04gc2FtcGxlc3BlcnJvdywgSkRJTUVOU0lPTiBudW1yb3dzKQorLyogQWxsb2NhdGUgYSAyLUQgc2FtcGxlIGFycmF5ICovCit7CisgIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07CisgIEpTQU1QQVJSQVkgcmVzdWx0OworICBKU0FNUFJPVyB3b3Jrc3BhY2U7CisgIEpESU1FTlNJT04gcm93c3BlcmNodW5rLCBjdXJyb3csIGk7CisgIGxvbmcgbHRlbXA7CisKKyAgLyogQ2FsY3VsYXRlIG1heCAjIG9mIHJvd3MgYWxsb3dlZCBpbiBvbmUgYWxsb2NhdGlvbiBjaHVuayAqLworICBsdGVtcCA9IChNQVhfQUxMT0NfQ0hVTkstU0laRU9GKGxhcmdlX3Bvb2xfaGRyKSkgLworCSAgKChsb25nKSBzYW1wbGVzcGVycm93ICogU0laRU9GKEpTQU1QTEUpKTsKKyAgaWYgKGx0ZW1wIDw9IDApCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9XSURUSF9PVkVSRkxPVyk7CisgIGlmIChsdGVtcCA8IChsb25nKSBudW1yb3dzKQorICAgIHJvd3NwZXJjaHVuayA9IChKRElNRU5TSU9OKSBsdGVtcDsKKyAgZWxzZQorICAgIHJvd3NwZXJjaHVuayA9IG51bXJvd3M7CisgIG1lbS0+bGFzdF9yb3dzcGVyY2h1bmsgPSByb3dzcGVyY2h1bms7CisKKyAgLyogR2V0IHNwYWNlIGZvciByb3cgcG9pbnRlcnMgKHNtYWxsIG9iamVjdCkgKi8KKyAgcmVzdWx0ID0gKEpTQU1QQVJSQVkpIGFsbG9jX3NtYWxsKGNpbmZvLCBwb29sX2lkLAorCQkJCSAgICAoc2l6ZV90KSAobnVtcm93cyAqIFNJWkVPRihKU0FNUFJPVykpKTsKKworICAvKiBHZXQgdGhlIHJvd3MgdGhlbXNlbHZlcyAobGFyZ2Ugb2JqZWN0cykgKi8KKyAgY3Vycm93ID0gMDsKKyAgd2hpbGUgKGN1cnJvdyA8IG51bXJvd3MpIHsKKyAgICByb3dzcGVyY2h1bmsgPSBNSU4ocm93c3BlcmNodW5rLCBudW1yb3dzIC0gY3Vycm93KTsKKyAgICB3b3Jrc3BhY2UgPSAoSlNBTVBST1cpIGFsbG9jX2xhcmdlKGNpbmZvLCBwb29sX2lkLAorCShzaXplX3QpICgoc2l6ZV90KSByb3dzcGVyY2h1bmsgKiAoc2l6ZV90KSBzYW1wbGVzcGVycm93CisJCSAgKiBTSVpFT0YoSlNBTVBMRSkpKTsKKyAgICBmb3IgKGkgPSByb3dzcGVyY2h1bms7IGkgPiAwOyBpLS0pIHsKKyAgICAgIHJlc3VsdFtjdXJyb3crK10gPSB3b3Jrc3BhY2U7CisgICAgICB3b3Jrc3BhY2UgKz0gc2FtcGxlc3BlcnJvdzsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBDcmVhdGlvbiBvZiAyLUQgY29lZmZpY2llbnQtYmxvY2sgYXJyYXlzLgorICogVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyB0aGUgY29kZSBmb3Igc2FtcGxlIGFycmF5cywgYWJvdmUuCisgKi8KKworTUVUSE9EREVGKEpCTE9DS0FSUkFZKQorYWxsb2NfYmFycmF5IChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLAorCSAgICAgIEpESU1FTlNJT04gYmxvY2tzcGVycm93LCBKRElNRU5TSU9OIG51bXJvd3MpCisvKiBBbGxvY2F0ZSBhIDItRCBjb2VmZmljaWVudC1ibG9jayBhcnJheSAqLworeworICBteV9tZW1fcHRyIG1lbSA9IChteV9tZW1fcHRyKSBjaW5mby0+bWVtOworICBKQkxPQ0tBUlJBWSByZXN1bHQ7CisgIEpCTE9DS1JPVyB3b3Jrc3BhY2U7CisgIEpESU1FTlNJT04gcm93c3BlcmNodW5rLCBjdXJyb3csIGk7CisgIGxvbmcgbHRlbXA7CisKKyAgLyogQ2FsY3VsYXRlIG1heCAjIG9mIHJvd3MgYWxsb3dlZCBpbiBvbmUgYWxsb2NhdGlvbiBjaHVuayAqLworICBsdGVtcCA9IChNQVhfQUxMT0NfQ0hVTkstU0laRU9GKGxhcmdlX3Bvb2xfaGRyKSkgLworCSAgKChsb25nKSBibG9ja3NwZXJyb3cgKiBTSVpFT0YoSkJMT0NLKSk7CisgIGlmIChsdGVtcCA8PSAwKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfV0lEVEhfT1ZFUkZMT1cpOworICBpZiAobHRlbXAgPCAobG9uZykgbnVtcm93cykKKyAgICByb3dzcGVyY2h1bmsgPSAoSkRJTUVOU0lPTikgbHRlbXA7CisgIGVsc2UKKyAgICByb3dzcGVyY2h1bmsgPSBudW1yb3dzOworICBtZW0tPmxhc3Rfcm93c3BlcmNodW5rID0gcm93c3BlcmNodW5rOworCisgIC8qIEdldCBzcGFjZSBmb3Igcm93IHBvaW50ZXJzIChzbWFsbCBvYmplY3QpICovCisgIHJlc3VsdCA9IChKQkxPQ0tBUlJBWSkgYWxsb2Nfc21hbGwoY2luZm8sIHBvb2xfaWQsCisJCQkJICAgICAoc2l6ZV90KSAobnVtcm93cyAqIFNJWkVPRihKQkxPQ0tST1cpKSk7CisKKyAgLyogR2V0IHRoZSByb3dzIHRoZW1zZWx2ZXMgKGxhcmdlIG9iamVjdHMpICovCisgIGN1cnJvdyA9IDA7CisgIHdoaWxlIChjdXJyb3cgPCBudW1yb3dzKSB7CisgICAgcm93c3BlcmNodW5rID0gTUlOKHJvd3NwZXJjaHVuaywgbnVtcm93cyAtIGN1cnJvdyk7CisgICAgd29ya3NwYWNlID0gKEpCTE9DS1JPVykgYWxsb2NfbGFyZ2UoY2luZm8sIHBvb2xfaWQsCisJKHNpemVfdCkgKChzaXplX3QpIHJvd3NwZXJjaHVuayAqIChzaXplX3QpIGJsb2Nrc3BlcnJvdworCQkgICogU0laRU9GKEpCTE9DSykpKTsKKyAgICBmb3IgKGkgPSByb3dzcGVyY2h1bms7IGkgPiAwOyBpLS0pIHsKKyAgICAgIHJlc3VsdFtjdXJyb3crK10gPSB3b3Jrc3BhY2U7CisgICAgICB3b3Jrc3BhY2UgKz0gYmxvY2tzcGVycm93OworICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyoKKyAqIEFib3V0IHZpcnR1YWwgYXJyYXkgbWFuYWdlbWVudDoKKyAqCisgKiBUaGUgYWJvdmUgIm5vcm1hbCIgYXJyYXkgcm91dGluZXMgYXJlIG9ubHkgdXNlZCB0byBhbGxvY2F0ZSBzdHJpcCBidWZmZXJzCisgKiAoYXMgd2lkZSBhcyB0aGUgaW1hZ2UsIGJ1dCBqdXN0IGEgZmV3IHJvd3MgaGlnaCkuICBGdWxsLWltYWdlLXNpemVkIGJ1ZmZlcnMKKyAqIGFyZSBoYW5kbGVkIGFzICJ2aXJ0dWFsIiBhcnJheXMuICBUaGUgYXJyYXkgaXMgc3RpbGwgYWNjZXNzZWQgYSBzdHJpcCBhdCBhCisgKiB0aW1lLCBidXQgdGhlIG1lbW9yeSBtYW5hZ2VyIG11c3Qgc2F2ZSB0aGUgd2hvbGUgYXJyYXkgZm9yIHJlcGVhdGVkCisgKiBhY2Nlc3Nlcy4gIFRoZSBpbnRlbmRlZCBpbXBsZW1lbnRhdGlvbiBpcyB0aGF0IHRoZXJlIGlzIGEgc3RyaXAgYnVmZmVyIGluCisgKiBtZW1vcnkgKGFzIGhpZ2ggYXMgaXMgcG9zc2libGUgZ2l2ZW4gdGhlIGRlc2lyZWQgbWVtb3J5IGxpbWl0KSwgcGx1cyBhCisgKiBiYWNraW5nIGZpbGUgdGhhdCBob2xkcyB0aGUgcmVzdCBvZiB0aGUgYXJyYXkuCisgKgorICogVGhlIHJlcXVlc3RfdmlydF9hcnJheSByb3V0aW5lcyBhcmUgdG9sZCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgaW1hZ2UgYW5kCisgKiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0aGF0IHdpbGwgYmUgYWNjZXNzZWQgYXQgb25jZS4gIFRoZSBpbi1tZW1vcnkKKyAqIGJ1ZmZlciBtdXN0IGJlIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHRoZSBtYXhhY2Nlc3MgdmFsdWUuCisgKgorICogVGhlIHJlcXVlc3Qgcm91dGluZXMgY3JlYXRlIGNvbnRyb2wgYmxvY2tzIGJ1dCBub3QgdGhlIGluLW1lbW9yeSBidWZmZXJzLgorICogVGhhdCBpcyBwb3N0cG9uZWQgdW50aWwgcmVhbGl6ZV92aXJ0X2FycmF5cyBpcyBjYWxsZWQuICBBdCB0aGF0IHRpbWUgdGhlCisgKiB0b3RhbCBhbW91bnQgb2Ygc3BhY2UgbmVlZGVkIGlzIGtub3duIChhcHByb3hpbWF0ZWx5LCBhbnl3YXkpLCBzbyBmcmVlCisgKiBtZW1vcnkgY2FuIGJlIGRpdmlkZWQgdXAgZmFpcmx5LgorICoKKyAqIFRoZSBhY2Nlc3NfdmlydF9hcnJheSByb3V0aW5lcyBhcmUgcmVzcG9uc2libGUgZm9yIG1ha2luZyBhIHNwZWNpZmljIHN0cmlwCisgKiBhcmVhIGFjY2Vzc2libGUgKGFmdGVyIHJlYWRpbmcgb3Igd3JpdGluZyB0aGUgYmFja2luZyBmaWxlLCBpZiBuZWNlc3NhcnkpLgorICogTm90ZSB0aGF0IHRoZSBhY2Nlc3Mgcm91dGluZXMgYXJlIHRvbGQgd2hldGhlciB0aGUgY2FsbGVyIGludGVuZHMgdG8gbW9kaWZ5CisgKiB0aGUgYWNjZXNzZWQgc3RyaXA7IGR1cmluZyBhIHJlYWQtb25seSBwYXNzIHRoaXMgc2F2ZXMgaGF2aW5nIHRvIHJld3JpdGUKKyAqIGRhdGEgdG8gZGlzay4gIFRoZSBhY2Nlc3Mgcm91dGluZXMgYXJlIGFsc28gcmVzcG9uc2libGUgZm9yIHByZS16ZXJvaW5nCisgKiBhbnkgbmV3bHkgYWNjZXNzZWQgcm93cywgaWYgcHJlLXplcm9pbmcgd2FzIHJlcXVlc3RlZC4KKyAqCisgKiBJbiBjdXJyZW50IHVzYWdlLCB0aGUgYWNjZXNzIHJlcXVlc3RzIGFyZSB1c3VhbGx5IGZvciBub25vdmVybGFwcGluZworICogc3RyaXBzOyB0aGF0IGlzLCBzdWNjZXNzaXZlIGFjY2VzcyBzdGFydF9yb3cgbnVtYmVycyBkaWZmZXIgYnkgZXhhY3RseQorICogbnVtX3Jvd3MgPSBtYXhhY2Nlc3MuICBUaGlzIG1lYW5zIHdlIGNhbiBnZXQgZ29vZCBwZXJmb3JtYW5jZSB3aXRoIHNpbXBsZQorICogYnVmZmVyIGR1bXAvcmVsb2FkIGxvZ2ljLCBieSBtYWtpbmcgdGhlIGluLW1lbW9yeSBidWZmZXIgYmUgYSBtdWx0aXBsZQorICogb2YgdGhlIGFjY2VzcyBoZWlnaHQ7IHRoZW4gdGhlcmUgd2lsbCBuZXZlciBiZSBhY2Nlc3NlcyBhY3Jvc3MgYnVmZmVybG9hZAorICogYm91bmRhcmllcy4gIFRoZSBjb2RlIHdpbGwgc3RpbGwgd29yayB3aXRoIG92ZXJsYXBwaW5nIGFjY2VzcyByZXF1ZXN0cywKKyAqIGJ1dCBpdCBkb2Vzbid0IGhhbmRsZSBidWZmZXJsb2FkIG92ZXJsYXBzIHZlcnkgZWZmaWNpZW50bHkuCisgKi8KKworCitNRVRIT0RERUYoanZpcnRfc2FycmF5X3B0cikKK3JlcXVlc3RfdmlydF9zYXJyYXkgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsIGJvb2xlYW4gcHJlX3plcm8sCisJCSAgICAgSkRJTUVOU0lPTiBzYW1wbGVzcGVycm93LCBKRElNRU5TSU9OIG51bXJvd3MsCisJCSAgICAgSkRJTUVOU0lPTiBtYXhhY2Nlc3MpCisvKiBSZXF1ZXN0IGEgdmlydHVhbCAyLUQgc2FtcGxlIGFycmF5ICovCit7CisgIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07CisgIGp2aXJ0X3NhcnJheV9wdHIgcmVzdWx0OworCisgIC8qIE9ubHkgSU1BR0UtbGlmZXRpbWUgdmlydHVhbCBhcnJheXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQgKi8KKyAgaWYgKHBvb2xfaWQgIT0gSlBPT0xfSU1BR0UpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BPT0xfSUQsIHBvb2xfaWQpOwkvKiBzYWZldHkgY2hlY2sgKi8KKworICAvKiBnZXQgY29udHJvbCBibG9jayAqLworICByZXN1bHQgPSAoanZpcnRfc2FycmF5X3B0cikgYWxsb2Nfc21hbGwoY2luZm8sIHBvb2xfaWQsCisJCQkJCSAgU0laRU9GKHN0cnVjdCBqdmlydF9zYXJyYXlfY29udHJvbCkpOworCisgIHJlc3VsdC0+bWVtX2J1ZmZlciA9IE5VTEw7CS8qIG1hcmtzIGFycmF5IG5vdCB5ZXQgcmVhbGl6ZWQgKi8KKyAgcmVzdWx0LT5yb3dzX2luX2FycmF5ID0gbnVtcm93czsKKyAgcmVzdWx0LT5zYW1wbGVzcGVycm93ID0gc2FtcGxlc3BlcnJvdzsKKyAgcmVzdWx0LT5tYXhhY2Nlc3MgPSBtYXhhY2Nlc3M7CisgIHJlc3VsdC0+cHJlX3plcm8gPSBwcmVfemVybzsKKyAgcmVzdWx0LT5iX3Nfb3BlbiA9IEZBTFNFOwkvKiBubyBhc3NvY2lhdGVkIGJhY2tpbmctc3RvcmUgb2JqZWN0ICovCisgIHJlc3VsdC0+bmV4dCA9IG1lbS0+dmlydF9zYXJyYXlfbGlzdDsgLyogYWRkIHRvIGxpc3Qgb2YgdmlydHVhbCBhcnJheXMgKi8KKyAgbWVtLT52aXJ0X3NhcnJheV9saXN0ID0gcmVzdWx0OworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworTUVUSE9EREVGKGp2aXJ0X2JhcnJheV9wdHIpCityZXF1ZXN0X3ZpcnRfYmFycmF5IChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLCBib29sZWFuIHByZV96ZXJvLAorCQkgICAgIEpESU1FTlNJT04gYmxvY2tzcGVycm93LCBKRElNRU5TSU9OIG51bXJvd3MsCisJCSAgICAgSkRJTUVOU0lPTiBtYXhhY2Nlc3MpCisvKiBSZXF1ZXN0IGEgdmlydHVhbCAyLUQgY29lZmZpY2llbnQtYmxvY2sgYXJyYXkgKi8KK3sKKyAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKKyAganZpcnRfYmFycmF5X3B0ciByZXN1bHQ7CisKKyAgLyogT25seSBJTUFHRS1saWZldGltZSB2aXJ0dWFsIGFycmF5cyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZCAqLworICBpZiAocG9vbF9pZCAhPSBKUE9PTF9JTUFHRSkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUE9PTF9JRCwgcG9vbF9pZCk7CS8qIHNhZmV0eSBjaGVjayAqLworCisgIC8qIGdldCBjb250cm9sIGJsb2NrICovCisgIHJlc3VsdCA9IChqdmlydF9iYXJyYXlfcHRyKSBhbGxvY19zbWFsbChjaW5mbywgcG9vbF9pZCwKKwkJCQkJICBTSVpFT0Yoc3RydWN0IGp2aXJ0X2JhcnJheV9jb250cm9sKSk7CisKKyAgcmVzdWx0LT5tZW1fYnVmZmVyID0gTlVMTDsJLyogbWFya3MgYXJyYXkgbm90IHlldCByZWFsaXplZCAqLworICByZXN1bHQtPnJvd3NfaW5fYXJyYXkgPSBudW1yb3dzOworICByZXN1bHQtPmJsb2Nrc3BlcnJvdyA9IGJsb2Nrc3BlcnJvdzsKKyAgcmVzdWx0LT5tYXhhY2Nlc3MgPSBtYXhhY2Nlc3M7CisgIHJlc3VsdC0+cHJlX3plcm8gPSBwcmVfemVybzsKKyAgcmVzdWx0LT5iX3Nfb3BlbiA9IEZBTFNFOwkvKiBubyBhc3NvY2lhdGVkIGJhY2tpbmctc3RvcmUgb2JqZWN0ICovCisgIHJlc3VsdC0+bmV4dCA9IG1lbS0+dmlydF9iYXJyYXlfbGlzdDsgLyogYWRkIHRvIGxpc3Qgb2YgdmlydHVhbCBhcnJheXMgKi8KKyAgbWVtLT52aXJ0X2JhcnJheV9saXN0ID0gcmVzdWx0OworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworTUVUSE9EREVGKHZvaWQpCityZWFsaXplX3ZpcnRfYXJyYXlzIChqX2NvbW1vbl9wdHIgY2luZm8pCisvKiBBbGxvY2F0ZSB0aGUgaW4tbWVtb3J5IGJ1ZmZlcnMgZm9yIGFueSB1bnJlYWxpemVkIHZpcnR1YWwgYXJyYXlzICovCit7CisgIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07CisgIGxvbmcgc3BhY2VfcGVyX21pbmhlaWdodCwgbWF4aW11bV9zcGFjZSwgYXZhaWxfbWVtOworICBsb25nIG1pbmhlaWdodHMsIG1heF9taW5oZWlnaHRzOworICBqdmlydF9zYXJyYXlfcHRyIHNwdHI7CisgIGp2aXJ0X2JhcnJheV9wdHIgYnB0cjsKKworICAvKiBDb21wdXRlIHRoZSBtaW5pbXVtIHNwYWNlIG5lZWRlZCAobWF4YWNjZXNzIHJvd3MgaW4gZWFjaCBidWZmZXIpCisgICAqIGFuZCB0aGUgbWF4aW11bSBzcGFjZSBuZWVkZWQgKGZ1bGwgaW1hZ2UgaGVpZ2h0IGluIGVhY2ggYnVmZmVyKS4KKyAgICogVGhlc2UgbWF5IGJlIG9mIHVzZSB0byB0aGUgc3lzdGVtLWRlcGVuZGVudCBqcGVnX21lbV9hdmFpbGFibGUgcm91dGluZS4KKyAgICovCisgIHNwYWNlX3Blcl9taW5oZWlnaHQgPSAwOworICBtYXhpbXVtX3NwYWNlID0gMDsKKyAgZm9yIChzcHRyID0gbWVtLT52aXJ0X3NhcnJheV9saXN0OyBzcHRyICE9IE5VTEw7IHNwdHIgPSBzcHRyLT5uZXh0KSB7CisgICAgaWYgKHNwdHItPm1lbV9idWZmZXIgPT0gTlVMTCkgeyAvKiBpZiBub3QgcmVhbGl6ZWQgeWV0ICovCisgICAgICBzcGFjZV9wZXJfbWluaGVpZ2h0ICs9IChsb25nKSBzcHRyLT5tYXhhY2Nlc3MgKgorCQkJICAgICAobG9uZykgc3B0ci0+c2FtcGxlc3BlcnJvdyAqIFNJWkVPRihKU0FNUExFKTsKKyAgICAgIG1heGltdW1fc3BhY2UgKz0gKGxvbmcpIHNwdHItPnJvd3NfaW5fYXJyYXkgKgorCQkgICAgICAgKGxvbmcpIHNwdHItPnNhbXBsZXNwZXJyb3cgKiBTSVpFT0YoSlNBTVBMRSk7CisgICAgfQorICB9CisgIGZvciAoYnB0ciA9IG1lbS0+dmlydF9iYXJyYXlfbGlzdDsgYnB0ciAhPSBOVUxMOyBicHRyID0gYnB0ci0+bmV4dCkgeworICAgIGlmIChicHRyLT5tZW1fYnVmZmVyID09IE5VTEwpIHsgLyogaWYgbm90IHJlYWxpemVkIHlldCAqLworICAgICAgc3BhY2VfcGVyX21pbmhlaWdodCArPSAobG9uZykgYnB0ci0+bWF4YWNjZXNzICoKKwkJCSAgICAgKGxvbmcpIGJwdHItPmJsb2Nrc3BlcnJvdyAqIFNJWkVPRihKQkxPQ0spOworICAgICAgbWF4aW11bV9zcGFjZSArPSAobG9uZykgYnB0ci0+cm93c19pbl9hcnJheSAqCisJCSAgICAgICAobG9uZykgYnB0ci0+YmxvY2tzcGVycm93ICogU0laRU9GKEpCTE9DSyk7CisgICAgfQorICB9CisKKyAgaWYgKHNwYWNlX3Blcl9taW5oZWlnaHQgPD0gMCkKKyAgICByZXR1cm47CQkJLyogbm8gdW5yZWFsaXplZCBhcnJheXMsIG5vIHdvcmsgKi8KKworICAvKiBEZXRlcm1pbmUgYW1vdW50IG9mIG1lbW9yeSB0byBhY3R1YWxseSB1c2U7IHRoaXMgaXMgc3lzdGVtLWRlcGVuZGVudC4gKi8KKyAgYXZhaWxfbWVtID0ganBlZ19tZW1fYXZhaWxhYmxlKGNpbmZvLCBzcGFjZV9wZXJfbWluaGVpZ2h0LCBtYXhpbXVtX3NwYWNlLAorCQkJCSBtZW0tPnRvdGFsX3NwYWNlX2FsbG9jYXRlZCk7CisKKyAgLyogSWYgdGhlIG1heGltdW0gc3BhY2UgbmVlZGVkIGlzIGF2YWlsYWJsZSwgbWFrZSBhbGwgdGhlIGJ1ZmZlcnMgZnVsbAorICAgKiBoZWlnaHQ7IG90aGVyd2lzZSBwYXJjZWwgaXQgb3V0IHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIG1pbmhlaWdodHMKKyAgICogaW4gZWFjaCBidWZmZXIuCisgICAqLworICBpZiAoYXZhaWxfbWVtID49IG1heGltdW1fc3BhY2UpCisgICAgbWF4X21pbmhlaWdodHMgPSAxMDAwMDAwMDAwTDsKKyAgZWxzZSB7CisgICAgbWF4X21pbmhlaWdodHMgPSBhdmFpbF9tZW0gLyBzcGFjZV9wZXJfbWluaGVpZ2h0OworICAgIC8qIElmIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBlbm91Z2ggc3BhY2UsIHRyeSB0byBnZXQgdGhlIG1pbmltdW0KKyAgICAgKiBhbnl3YXkuICBUaGlzIGFsbG93cyBhICJzdHViIiBpbXBsZW1lbnRhdGlvbiBvZiBqcGVnX21lbV9hdmFpbGFibGUoKS4KKyAgICAgKi8KKyAgICBpZiAobWF4X21pbmhlaWdodHMgPD0gMCkKKyAgICAgIG1heF9taW5oZWlnaHRzID0gMTsKKyAgfQorCisgIC8qIEFsbG9jYXRlIHRoZSBpbi1tZW1vcnkgYnVmZmVycyBhbmQgaW5pdGlhbGl6ZSBiYWNraW5nIHN0b3JlIGFzIG5lZWRlZC4gKi8KKworICBmb3IgKHNwdHIgPSBtZW0tPnZpcnRfc2FycmF5X2xpc3Q7IHNwdHIgIT0gTlVMTDsgc3B0ciA9IHNwdHItPm5leHQpIHsKKyAgICBpZiAoc3B0ci0+bWVtX2J1ZmZlciA9PSBOVUxMKSB7IC8qIGlmIG5vdCByZWFsaXplZCB5ZXQgKi8KKyAgICAgIG1pbmhlaWdodHMgPSAoKGxvbmcpIHNwdHItPnJvd3NfaW5fYXJyYXkgLSAxTCkgLyBzcHRyLT5tYXhhY2Nlc3MgKyAxTDsKKyAgICAgIGlmIChtaW5oZWlnaHRzIDw9IG1heF9taW5oZWlnaHRzKSB7CisJLyogVGhpcyBidWZmZXIgZml0cyBpbiBtZW1vcnkgKi8KKwlzcHRyLT5yb3dzX2luX21lbSA9IHNwdHItPnJvd3NfaW5fYXJyYXk7CisgICAgICB9IGVsc2UgeworCS8qIEl0IGRvZXNuJ3QgZml0IGluIG1lbW9yeSwgY3JlYXRlIGJhY2tpbmcgc3RvcmUuICovCisJc3B0ci0+cm93c19pbl9tZW0gPSAoSkRJTUVOU0lPTikgKG1heF9taW5oZWlnaHRzICogc3B0ci0+bWF4YWNjZXNzKTsKKwlqcGVnX29wZW5fYmFja2luZ19zdG9yZShjaW5mbywgJiBzcHRyLT5iX3NfaW5mbywKKwkJCQkobG9uZykgc3B0ci0+cm93c19pbl9hcnJheSAqCisJCQkJKGxvbmcpIHNwdHItPnNhbXBsZXNwZXJyb3cgKgorCQkJCShsb25nKSBTSVpFT0YoSlNBTVBMRSkpOworCXNwdHItPmJfc19vcGVuID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIHNwdHItPm1lbV9idWZmZXIgPSBhbGxvY19zYXJyYXkoY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgICAgIHNwdHItPnNhbXBsZXNwZXJyb3csIHNwdHItPnJvd3NfaW5fbWVtKTsKKyAgICAgIHNwdHItPnJvd3NwZXJjaHVuayA9IG1lbS0+bGFzdF9yb3dzcGVyY2h1bms7CisgICAgICBzcHRyLT5jdXJfc3RhcnRfcm93ID0gMDsKKyAgICAgIHNwdHItPmZpcnN0X3VuZGVmX3JvdyA9IDA7CisgICAgICBzcHRyLT5kaXJ0eSA9IEZBTFNFOworICAgIH0KKyAgfQorCisgIGZvciAoYnB0ciA9IG1lbS0+dmlydF9iYXJyYXlfbGlzdDsgYnB0ciAhPSBOVUxMOyBicHRyID0gYnB0ci0+bmV4dCkgeworICAgIGlmIChicHRyLT5tZW1fYnVmZmVyID09IE5VTEwpIHsgLyogaWYgbm90IHJlYWxpemVkIHlldCAqLworICAgICAgbWluaGVpZ2h0cyA9ICgobG9uZykgYnB0ci0+cm93c19pbl9hcnJheSAtIDFMKSAvIGJwdHItPm1heGFjY2VzcyArIDFMOworICAgICAgaWYgKG1pbmhlaWdodHMgPD0gbWF4X21pbmhlaWdodHMpIHsKKwkvKiBUaGlzIGJ1ZmZlciBmaXRzIGluIG1lbW9yeSAqLworCWJwdHItPnJvd3NfaW5fbWVtID0gYnB0ci0+cm93c19pbl9hcnJheTsKKyAgICAgIH0gZWxzZSB7CisJLyogSXQgZG9lc24ndCBmaXQgaW4gbWVtb3J5LCBjcmVhdGUgYmFja2luZyBzdG9yZS4gKi8KKwlicHRyLT5yb3dzX2luX21lbSA9IChKRElNRU5TSU9OKSAobWF4X21pbmhlaWdodHMgKiBicHRyLT5tYXhhY2Nlc3MpOworCWpwZWdfb3Blbl9iYWNraW5nX3N0b3JlKGNpbmZvLCAmIGJwdHItPmJfc19pbmZvLAorCQkJCShsb25nKSBicHRyLT5yb3dzX2luX2FycmF5ICoKKwkJCQkobG9uZykgYnB0ci0+YmxvY2tzcGVycm93ICoKKwkJCQkobG9uZykgU0laRU9GKEpCTE9DSykpOworCWJwdHItPmJfc19vcGVuID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGJwdHItPm1lbV9idWZmZXIgPSBhbGxvY19iYXJyYXkoY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgICAgIGJwdHItPmJsb2Nrc3BlcnJvdywgYnB0ci0+cm93c19pbl9tZW0pOworICAgICAgYnB0ci0+cm93c3BlcmNodW5rID0gbWVtLT5sYXN0X3Jvd3NwZXJjaHVuazsKKyAgICAgIGJwdHItPmN1cl9zdGFydF9yb3cgPSAwOworICAgICAgYnB0ci0+Zmlyc3RfdW5kZWZfcm93ID0gMDsKKyAgICAgIGJwdHItPmRpcnR5ID0gRkFMU0U7CisgICAgfQorICB9Cit9CisKKworTE9DQUwodm9pZCkKK2RvX3NhcnJheV9pbyAoal9jb21tb25fcHRyIGNpbmZvLCBqdmlydF9zYXJyYXlfcHRyIHB0ciwgYm9vbGVhbiB3cml0aW5nKQorLyogRG8gYmFja2luZyBzdG9yZSByZWFkIG9yIHdyaXRlIG9mIGEgdmlydHVhbCBzYW1wbGUgYXJyYXkgKi8KK3sKKyAgbG9uZyBieXRlc3BlcnJvdywgZmlsZV9vZmZzZXQsIGJ5dGVfY291bnQsIHJvd3MsIHRoaXNyb3csIGk7CisKKyAgYnl0ZXNwZXJyb3cgPSAobG9uZykgcHRyLT5zYW1wbGVzcGVycm93ICogU0laRU9GKEpTQU1QTEUpOworICBmaWxlX29mZnNldCA9IHB0ci0+Y3VyX3N0YXJ0X3JvdyAqIGJ5dGVzcGVycm93OworICAvKiBMb29wIHRvIHJlYWQgb3Igd3JpdGUgZWFjaCBhbGxvY2F0aW9uIGNodW5rIGluIG1lbV9idWZmZXIgKi8KKyAgZm9yIChpID0gMDsgaSA8IChsb25nKSBwdHItPnJvd3NfaW5fbWVtOyBpICs9IHB0ci0+cm93c3BlcmNodW5rKSB7CisgICAgLyogT25lIGNodW5rLCBidXQgY2hlY2sgZm9yIHNob3J0IGNodW5rIGF0IGVuZCBvZiBidWZmZXIgKi8KKyAgICByb3dzID0gTUlOKChsb25nKSBwdHItPnJvd3NwZXJjaHVuaywgKGxvbmcpIHB0ci0+cm93c19pbl9tZW0gLSBpKTsKKyAgICAvKiBUcmFuc2ZlciBubyBtb3JlIHRoYW4gaXMgY3VycmVudGx5IGRlZmluZWQgKi8KKyAgICB0aGlzcm93ID0gKGxvbmcpIHB0ci0+Y3VyX3N0YXJ0X3JvdyArIGk7CisgICAgcm93cyA9IE1JTihyb3dzLCAobG9uZykgcHRyLT5maXJzdF91bmRlZl9yb3cgLSB0aGlzcm93KTsKKyAgICAvKiBUcmFuc2ZlciBubyBtb3JlIHRoYW4gZml0cyBpbiBmaWxlICovCisgICAgcm93cyA9IE1JTihyb3dzLCAobG9uZykgcHRyLT5yb3dzX2luX2FycmF5IC0gdGhpc3Jvdyk7CisgICAgaWYgKHJvd3MgPD0gMCkJCS8qIHRoaXMgY2h1bmsgbWlnaHQgYmUgcGFzdCBlbmQgb2YgZmlsZSEgKi8KKyAgICAgIGJyZWFrOworICAgIGJ5dGVfY291bnQgPSByb3dzICogYnl0ZXNwZXJyb3c7CisgICAgaWYgKHdyaXRpbmcpCisgICAgICAoKnB0ci0+Yl9zX2luZm8ud3JpdGVfYmFja2luZ19zdG9yZSkgKGNpbmZvLCAmIHB0ci0+Yl9zX2luZm8sCisJCQkJCSAgICAodm9pZCBGQVIgKikgcHRyLT5tZW1fYnVmZmVyW2ldLAorCQkJCQkgICAgZmlsZV9vZmZzZXQsIGJ5dGVfY291bnQpOworICAgIGVsc2UKKyAgICAgICgqcHRyLT5iX3NfaW5mby5yZWFkX2JhY2tpbmdfc3RvcmUpIChjaW5mbywgJiBwdHItPmJfc19pbmZvLAorCQkJCQkgICAodm9pZCBGQVIgKikgcHRyLT5tZW1fYnVmZmVyW2ldLAorCQkJCQkgICBmaWxlX29mZnNldCwgYnl0ZV9jb3VudCk7CisgICAgZmlsZV9vZmZzZXQgKz0gYnl0ZV9jb3VudDsKKyAgfQorfQorCisKK0xPQ0FMKHZvaWQpCitkb19iYXJyYXlfaW8gKGpfY29tbW9uX3B0ciBjaW5mbywganZpcnRfYmFycmF5X3B0ciBwdHIsIGJvb2xlYW4gd3JpdGluZykKKy8qIERvIGJhY2tpbmcgc3RvcmUgcmVhZCBvciB3cml0ZSBvZiBhIHZpcnR1YWwgY29lZmZpY2llbnQtYmxvY2sgYXJyYXkgKi8KK3sKKyAgbG9uZyBieXRlc3BlcnJvdywgZmlsZV9vZmZzZXQsIGJ5dGVfY291bnQsIHJvd3MsIHRoaXNyb3csIGk7CisKKyAgYnl0ZXNwZXJyb3cgPSAobG9uZykgcHRyLT5ibG9ja3NwZXJyb3cgKiBTSVpFT0YoSkJMT0NLKTsKKyAgZmlsZV9vZmZzZXQgPSBwdHItPmN1cl9zdGFydF9yb3cgKiBieXRlc3BlcnJvdzsKKyAgLyogTG9vcCB0byByZWFkIG9yIHdyaXRlIGVhY2ggYWxsb2NhdGlvbiBjaHVuayBpbiBtZW1fYnVmZmVyICovCisgIGZvciAoaSA9IDA7IGkgPCAobG9uZykgcHRyLT5yb3dzX2luX21lbTsgaSArPSBwdHItPnJvd3NwZXJjaHVuaykgeworICAgIC8qIE9uZSBjaHVuaywgYnV0IGNoZWNrIGZvciBzaG9ydCBjaHVuayBhdCBlbmQgb2YgYnVmZmVyICovCisgICAgcm93cyA9IE1JTigobG9uZykgcHRyLT5yb3dzcGVyY2h1bmssIChsb25nKSBwdHItPnJvd3NfaW5fbWVtIC0gaSk7CisgICAgLyogVHJhbnNmZXIgbm8gbW9yZSB0aGFuIGlzIGN1cnJlbnRseSBkZWZpbmVkICovCisgICAgdGhpc3JvdyA9IChsb25nKSBwdHItPmN1cl9zdGFydF9yb3cgKyBpOworICAgIHJvd3MgPSBNSU4ocm93cywgKGxvbmcpIHB0ci0+Zmlyc3RfdW5kZWZfcm93IC0gdGhpc3Jvdyk7CisgICAgLyogVHJhbnNmZXIgbm8gbW9yZSB0aGFuIGZpdHMgaW4gZmlsZSAqLworICAgIHJvd3MgPSBNSU4ocm93cywgKGxvbmcpIHB0ci0+cm93c19pbl9hcnJheSAtIHRoaXNyb3cpOworICAgIGlmIChyb3dzIDw9IDApCQkvKiB0aGlzIGNodW5rIG1pZ2h0IGJlIHBhc3QgZW5kIG9mIGZpbGUhICovCisgICAgICBicmVhazsKKyAgICBieXRlX2NvdW50ID0gcm93cyAqIGJ5dGVzcGVycm93OworICAgIGlmICh3cml0aW5nKQorICAgICAgKCpwdHItPmJfc19pbmZvLndyaXRlX2JhY2tpbmdfc3RvcmUpIChjaW5mbywgJiBwdHItPmJfc19pbmZvLAorCQkJCQkgICAgKHZvaWQgRkFSICopIHB0ci0+bWVtX2J1ZmZlcltpXSwKKwkJCQkJICAgIGZpbGVfb2Zmc2V0LCBieXRlX2NvdW50KTsKKyAgICBlbHNlCisgICAgICAoKnB0ci0+Yl9zX2luZm8ucmVhZF9iYWNraW5nX3N0b3JlKSAoY2luZm8sICYgcHRyLT5iX3NfaW5mbywKKwkJCQkJICAgKHZvaWQgRkFSICopIHB0ci0+bWVtX2J1ZmZlcltpXSwKKwkJCQkJICAgZmlsZV9vZmZzZXQsIGJ5dGVfY291bnQpOworICAgIGZpbGVfb2Zmc2V0ICs9IGJ5dGVfY291bnQ7CisgIH0KK30KKworCitNRVRIT0RERUYoSlNBTVBBUlJBWSkKK2FjY2Vzc192aXJ0X3NhcnJheSAoal9jb21tb25fcHRyIGNpbmZvLCBqdmlydF9zYXJyYXlfcHRyIHB0ciwKKwkJICAgIEpESU1FTlNJT04gc3RhcnRfcm93LCBKRElNRU5TSU9OIG51bV9yb3dzLAorCQkgICAgYm9vbGVhbiB3cml0YWJsZSkKKy8qIEFjY2VzcyB0aGUgcGFydCBvZiBhIHZpcnR1YWwgc2FtcGxlIGFycmF5IHN0YXJ0aW5nIGF0IHN0YXJ0X3JvdyAqLworLyogYW5kIGV4dGVuZGluZyBmb3IgbnVtX3Jvd3Mgcm93cy4gIHdyaXRhYmxlIGlzIHRydWUgaWYgICovCisvKiBjYWxsZXIgaW50ZW5kcyB0byBtb2RpZnkgdGhlIGFjY2Vzc2VkIGFyZWEuICovCit7CisgIEpESU1FTlNJT04gZW5kX3JvdyA9IHN0YXJ0X3JvdyArIG51bV9yb3dzOworICBKRElNRU5TSU9OIHVuZGVmX3JvdzsKKworICAvKiBkZWJ1Z2dpbmcgY2hlY2sgKi8KKyAgaWYgKGVuZF9yb3cgPiBwdHItPnJvd3NfaW5fYXJyYXkgfHwgbnVtX3Jvd3MgPiBwdHItPm1heGFjY2VzcyB8fAorICAgICAgcHRyLT5tZW1fYnVmZmVyID09IE5VTEwpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfVklSVFVBTF9BQ0NFU1MpOworCisgIC8qIE1ha2UgdGhlIGRlc2lyZWQgcGFydCBvZiB0aGUgdmlydHVhbCBhcnJheSBhY2Nlc3NpYmxlICovCisgIGlmIChzdGFydF9yb3cgPCBwdHItPmN1cl9zdGFydF9yb3cgfHwKKyAgICAgIGVuZF9yb3cgPiBwdHItPmN1cl9zdGFydF9yb3crcHRyLT5yb3dzX2luX21lbSkgeworICAgIGlmICghIHB0ci0+Yl9zX29wZW4pCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1ZJUlRVQUxfQlVHKTsKKyAgICAvKiBGbHVzaCBvbGQgYnVmZmVyIGNvbnRlbnRzIGlmIG5lY2Vzc2FyeSAqLworICAgIGlmIChwdHItPmRpcnR5KSB7CisgICAgICBkb19zYXJyYXlfaW8oY2luZm8sIHB0ciwgVFJVRSk7CisgICAgICBwdHItPmRpcnR5ID0gRkFMU0U7CisgICAgfQorICAgIC8qIERlY2lkZSB3aGF0IHBhcnQgb2YgdmlydHVhbCBhcnJheSB0byBhY2Nlc3MuCisgICAgICogQWxnb3JpdGhtOiBpZiB0YXJnZXQgYWRkcmVzcyA+IGN1cnJlbnQgd2luZG93LCBhc3N1bWUgZm9yd2FyZCBzY2FuLAorICAgICAqIGxvYWQgc3RhcnRpbmcgYXQgdGFyZ2V0IGFkZHJlc3MuICBJZiB0YXJnZXQgYWRkcmVzcyA8IGN1cnJlbnQgd2luZG93LAorICAgICAqIGFzc3VtZSBiYWNrd2FyZCBzY2FuLCBsb2FkIHNvIHRoYXQgdGFyZ2V0IGFyZWEgaXMgdG9wIG9mIHdpbmRvdy4KKyAgICAgKiBOb3RlIHRoYXQgd2hlbiBzd2l0Y2hpbmcgZnJvbSBmb3J3YXJkIHdyaXRlIHRvIGZvcndhcmQgcmVhZCwgd2lsbCBoYXZlCisgICAgICogc3RhcnRfcm93ID0gMCwgc28gdGhlIGxpbWl0aW5nIGNhc2UgYXBwbGllcyBhbmQgd2UgbG9hZCBmcm9tIDAgYW55d2F5LgorICAgICAqLworICAgIGlmIChzdGFydF9yb3cgPiBwdHItPmN1cl9zdGFydF9yb3cpIHsKKyAgICAgIHB0ci0+Y3VyX3N0YXJ0X3JvdyA9IHN0YXJ0X3JvdzsKKyAgICB9IGVsc2UgeworICAgICAgLyogdXNlIGxvbmcgYXJpdGhtZXRpYyBoZXJlIHRvIGF2b2lkIG92ZXJmbG93ICYgdW5zaWduZWQgcHJvYmxlbXMgKi8KKyAgICAgIGxvbmcgbHRlbXA7CisKKyAgICAgIGx0ZW1wID0gKGxvbmcpIGVuZF9yb3cgLSAobG9uZykgcHRyLT5yb3dzX2luX21lbTsKKyAgICAgIGlmIChsdGVtcCA8IDApCisJbHRlbXAgPSAwOwkJLyogZG9uJ3QgZmFsbCBvZmYgZnJvbnQgZW5kIG9mIGZpbGUgKi8KKyAgICAgIHB0ci0+Y3VyX3N0YXJ0X3JvdyA9IChKRElNRU5TSU9OKSBsdGVtcDsKKyAgICB9CisgICAgLyogUmVhZCBpbiB0aGUgc2VsZWN0ZWQgcGFydCBvZiB0aGUgYXJyYXkuCisgICAgICogRHVyaW5nIHRoZSBpbml0aWFsIHdyaXRlIHBhc3MsIHdlIHdpbGwgZG8gbm8gYWN0dWFsIHJlYWQKKyAgICAgKiBiZWNhdXNlIHRoZSBzZWxlY3RlZCBwYXJ0IGlzIGFsbCB1bmRlZmluZWQuCisgICAgICovCisgICAgZG9fc2FycmF5X2lvKGNpbmZvLCBwdHIsIEZBTFNFKTsKKyAgfQorICAvKiBFbnN1cmUgdGhlIGFjY2Vzc2VkIHBhcnQgb2YgdGhlIGFycmF5IGlzIGRlZmluZWQ7IHByZXplcm8gaWYgbmVlZGVkLgorICAgKiBUbyBpbXByb3ZlIGxvY2FsaXR5IG9mIGFjY2Vzcywgd2Ugb25seSBwcmV6ZXJvIHRoZSBwYXJ0IG9mIHRoZSBhcnJheQorICAgKiB0aGF0IHRoZSBjYWxsZXIgaXMgYWJvdXQgdG8gYWNjZXNzLCBub3QgdGhlIGVudGlyZSBpbi1tZW1vcnkgYXJyYXkuCisgICAqLworICBpZiAocHRyLT5maXJzdF91bmRlZl9yb3cgPCBlbmRfcm93KSB7CisgICAgaWYgKHB0ci0+Zmlyc3RfdW5kZWZfcm93IDwgc3RhcnRfcm93KSB7CisgICAgICBpZiAod3JpdGFibGUpCQkvKiB3cml0ZXIgc2tpcHBlZCBvdmVyIGEgc2VjdGlvbiBvZiBhcnJheSAqLworCUVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1ZJUlRVQUxfQUNDRVNTKTsKKyAgICAgIHVuZGVmX3JvdyA9IHN0YXJ0X3JvdzsJLyogYnV0IHJlYWRlciBpcyBhbGxvd2VkIHRvIHJlYWQgYWhlYWQgKi8KKyAgICB9IGVsc2UgeworICAgICAgdW5kZWZfcm93ID0gcHRyLT5maXJzdF91bmRlZl9yb3c7CisgICAgfQorICAgIGlmICh3cml0YWJsZSkKKyAgICAgIHB0ci0+Zmlyc3RfdW5kZWZfcm93ID0gZW5kX3JvdzsKKyAgICBpZiAocHRyLT5wcmVfemVybykgeworICAgICAgc2l6ZV90IGJ5dGVzcGVycm93ID0gKHNpemVfdCkgcHRyLT5zYW1wbGVzcGVycm93ICogU0laRU9GKEpTQU1QTEUpOworICAgICAgdW5kZWZfcm93IC09IHB0ci0+Y3VyX3N0YXJ0X3JvdzsgLyogbWFrZSBpbmRleGVzIHJlbGF0aXZlIHRvIGJ1ZmZlciAqLworICAgICAgZW5kX3JvdyAtPSBwdHItPmN1cl9zdGFydF9yb3c7CisgICAgICB3aGlsZSAodW5kZWZfcm93IDwgZW5kX3JvdykgeworCWp6ZXJvX2Zhcigodm9pZCBGQVIgKikgcHRyLT5tZW1fYnVmZmVyW3VuZGVmX3Jvd10sIGJ5dGVzcGVycm93KTsKKwl1bmRlZl9yb3crKzsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKCEgd3JpdGFibGUpCQkvKiByZWFkZXIgbG9va2luZyBhdCB1bmRlZmluZWQgZGF0YSAqLworCUVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1ZJUlRVQUxfQUNDRVNTKTsKKyAgICB9CisgIH0KKyAgLyogRmxhZyB0aGUgYnVmZmVyIGRpcnR5IGlmIGNhbGxlciB3aWxsIHdyaXRlIGluIGl0ICovCisgIGlmICh3cml0YWJsZSkKKyAgICBwdHItPmRpcnR5ID0gVFJVRTsKKyAgLyogUmV0dXJuIGFkZHJlc3Mgb2YgcHJvcGVyIHBhcnQgb2YgdGhlIGJ1ZmZlciAqLworICByZXR1cm4gcHRyLT5tZW1fYnVmZmVyICsgKHN0YXJ0X3JvdyAtIHB0ci0+Y3VyX3N0YXJ0X3Jvdyk7Cit9CisKKworTUVUSE9EREVGKEpCTE9DS0FSUkFZKQorYWNjZXNzX3ZpcnRfYmFycmF5IChqX2NvbW1vbl9wdHIgY2luZm8sIGp2aXJ0X2JhcnJheV9wdHIgcHRyLAorCQkgICAgSkRJTUVOU0lPTiBzdGFydF9yb3csIEpESU1FTlNJT04gbnVtX3Jvd3MsCisJCSAgICBib29sZWFuIHdyaXRhYmxlKQorLyogQWNjZXNzIHRoZSBwYXJ0IG9mIGEgdmlydHVhbCBibG9jayBhcnJheSBzdGFydGluZyBhdCBzdGFydF9yb3cgKi8KKy8qIGFuZCBleHRlbmRpbmcgZm9yIG51bV9yb3dzIHJvd3MuICB3cml0YWJsZSBpcyB0cnVlIGlmICAqLworLyogY2FsbGVyIGludGVuZHMgdG8gbW9kaWZ5IHRoZSBhY2Nlc3NlZCBhcmVhLiAqLworeworICBKRElNRU5TSU9OIGVuZF9yb3cgPSBzdGFydF9yb3cgKyBudW1fcm93czsKKyAgSkRJTUVOU0lPTiB1bmRlZl9yb3c7CisKKyAgLyogZGVidWdnaW5nIGNoZWNrICovCisgIGlmIChlbmRfcm93ID4gcHRyLT5yb3dzX2luX2FycmF5IHx8IG51bV9yb3dzID4gcHRyLT5tYXhhY2Nlc3MgfHwKKyAgICAgIHB0ci0+bWVtX2J1ZmZlciA9PSBOVUxMKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1ZJUlRVQUxfQUNDRVNTKTsKKworICAvKiBNYWtlIHRoZSBkZXNpcmVkIHBhcnQgb2YgdGhlIHZpcnR1YWwgYXJyYXkgYWNjZXNzaWJsZSAqLworICBpZiAoc3RhcnRfcm93IDwgcHRyLT5jdXJfc3RhcnRfcm93IHx8CisgICAgICBlbmRfcm93ID4gcHRyLT5jdXJfc3RhcnRfcm93K3B0ci0+cm93c19pbl9tZW0pIHsKKyAgICBpZiAoISBwdHItPmJfc19vcGVuKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9WSVJUVUFMX0JVRyk7CisgICAgLyogRmx1c2ggb2xkIGJ1ZmZlciBjb250ZW50cyBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZiAocHRyLT5kaXJ0eSkgeworICAgICAgZG9fYmFycmF5X2lvKGNpbmZvLCBwdHIsIFRSVUUpOworICAgICAgcHRyLT5kaXJ0eSA9IEZBTFNFOworICAgIH0KKyAgICAvKiBEZWNpZGUgd2hhdCBwYXJ0IG9mIHZpcnR1YWwgYXJyYXkgdG8gYWNjZXNzLgorICAgICAqIEFsZ29yaXRobTogaWYgdGFyZ2V0IGFkZHJlc3MgPiBjdXJyZW50IHdpbmRvdywgYXNzdW1lIGZvcndhcmQgc2NhbiwKKyAgICAgKiBsb2FkIHN0YXJ0aW5nIGF0IHRhcmdldCBhZGRyZXNzLiAgSWYgdGFyZ2V0IGFkZHJlc3MgPCBjdXJyZW50IHdpbmRvdywKKyAgICAgKiBhc3N1bWUgYmFja3dhcmQgc2NhbiwgbG9hZCBzbyB0aGF0IHRhcmdldCBhcmVhIGlzIHRvcCBvZiB3aW5kb3cuCisgICAgICogTm90ZSB0aGF0IHdoZW4gc3dpdGNoaW5nIGZyb20gZm9yd2FyZCB3cml0ZSB0byBmb3J3YXJkIHJlYWQsIHdpbGwgaGF2ZQorICAgICAqIHN0YXJ0X3JvdyA9IDAsIHNvIHRoZSBsaW1pdGluZyBjYXNlIGFwcGxpZXMgYW5kIHdlIGxvYWQgZnJvbSAwIGFueXdheS4KKyAgICAgKi8KKyAgICBpZiAoc3RhcnRfcm93ID4gcHRyLT5jdXJfc3RhcnRfcm93KSB7CisgICAgICBwdHItPmN1cl9zdGFydF9yb3cgPSBzdGFydF9yb3c7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHVzZSBsb25nIGFyaXRobWV0aWMgaGVyZSB0byBhdm9pZCBvdmVyZmxvdyAmIHVuc2lnbmVkIHByb2JsZW1zICovCisgICAgICBsb25nIGx0ZW1wOworCisgICAgICBsdGVtcCA9IChsb25nKSBlbmRfcm93IC0gKGxvbmcpIHB0ci0+cm93c19pbl9tZW07CisgICAgICBpZiAobHRlbXAgPCAwKQorCWx0ZW1wID0gMDsJCS8qIGRvbid0IGZhbGwgb2ZmIGZyb250IGVuZCBvZiBmaWxlICovCisgICAgICBwdHItPmN1cl9zdGFydF9yb3cgPSAoSkRJTUVOU0lPTikgbHRlbXA7CisgICAgfQorICAgIC8qIFJlYWQgaW4gdGhlIHNlbGVjdGVkIHBhcnQgb2YgdGhlIGFycmF5LgorICAgICAqIER1cmluZyB0aGUgaW5pdGlhbCB3cml0ZSBwYXNzLCB3ZSB3aWxsIGRvIG5vIGFjdHVhbCByZWFkCisgICAgICogYmVjYXVzZSB0aGUgc2VsZWN0ZWQgcGFydCBpcyBhbGwgdW5kZWZpbmVkLgorICAgICAqLworICAgIGRvX2JhcnJheV9pbyhjaW5mbywgcHRyLCBGQUxTRSk7CisgIH0KKyAgLyogRW5zdXJlIHRoZSBhY2Nlc3NlZCBwYXJ0IG9mIHRoZSBhcnJheSBpcyBkZWZpbmVkOyBwcmV6ZXJvIGlmIG5lZWRlZC4KKyAgICogVG8gaW1wcm92ZSBsb2NhbGl0eSBvZiBhY2Nlc3MsIHdlIG9ubHkgcHJlemVybyB0aGUgcGFydCBvZiB0aGUgYXJyYXkKKyAgICogdGhhdCB0aGUgY2FsbGVyIGlzIGFib3V0IHRvIGFjY2Vzcywgbm90IHRoZSBlbnRpcmUgaW4tbWVtb3J5IGFycmF5LgorICAgKi8KKyAgaWYgKHB0ci0+Zmlyc3RfdW5kZWZfcm93IDwgZW5kX3JvdykgeworICAgIGlmIChwdHItPmZpcnN0X3VuZGVmX3JvdyA8IHN0YXJ0X3JvdykgeworICAgICAgaWYgKHdyaXRhYmxlKQkJLyogd3JpdGVyIHNraXBwZWQgb3ZlciBhIHNlY3Rpb24gb2YgYXJyYXkgKi8KKwlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9WSVJUVUFMX0FDQ0VTUyk7CisgICAgICB1bmRlZl9yb3cgPSBzdGFydF9yb3c7CS8qIGJ1dCByZWFkZXIgaXMgYWxsb3dlZCB0byByZWFkIGFoZWFkICovCisgICAgfSBlbHNlIHsKKyAgICAgIHVuZGVmX3JvdyA9IHB0ci0+Zmlyc3RfdW5kZWZfcm93OworICAgIH0KKyAgICBpZiAod3JpdGFibGUpCisgICAgICBwdHItPmZpcnN0X3VuZGVmX3JvdyA9IGVuZF9yb3c7CisgICAgaWYgKHB0ci0+cHJlX3plcm8pIHsKKyAgICAgIHNpemVfdCBieXRlc3BlcnJvdyA9IChzaXplX3QpIHB0ci0+YmxvY2tzcGVycm93ICogU0laRU9GKEpCTE9DSyk7CisgICAgICB1bmRlZl9yb3cgLT0gcHRyLT5jdXJfc3RhcnRfcm93OyAvKiBtYWtlIGluZGV4ZXMgcmVsYXRpdmUgdG8gYnVmZmVyICovCisgICAgICBlbmRfcm93IC09IHB0ci0+Y3VyX3N0YXJ0X3JvdzsKKyAgICAgIHdoaWxlICh1bmRlZl9yb3cgPCBlbmRfcm93KSB7CisJanplcm9fZmFyKCh2b2lkIEZBUiAqKSBwdHItPm1lbV9idWZmZXJbdW5kZWZfcm93XSwgYnl0ZXNwZXJyb3cpOworCXVuZGVmX3JvdysrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoISB3cml0YWJsZSkJCS8qIHJlYWRlciBsb29raW5nIGF0IHVuZGVmaW5lZCBkYXRhICovCisJRVJSRVhJVChjaW5mbywgSkVSUl9CQURfVklSVFVBTF9BQ0NFU1MpOworICAgIH0KKyAgfQorICAvKiBGbGFnIHRoZSBidWZmZXIgZGlydHkgaWYgY2FsbGVyIHdpbGwgd3JpdGUgaW4gaXQgKi8KKyAgaWYgKHdyaXRhYmxlKQorICAgIHB0ci0+ZGlydHkgPSBUUlVFOworICAvKiBSZXR1cm4gYWRkcmVzcyBvZiBwcm9wZXIgcGFydCBvZiB0aGUgYnVmZmVyICovCisgIHJldHVybiBwdHItPm1lbV9idWZmZXIgKyAoc3RhcnRfcm93IC0gcHRyLT5jdXJfc3RhcnRfcm93KTsKK30KKworCisvKgorICogUmVsZWFzZSBhbGwgb2JqZWN0cyBiZWxvbmdpbmcgdG8gYSBzcGVjaWZpZWQgcG9vbC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZyZWVfcG9vbCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCkKK3sKKyAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKKyAgc21hbGxfcG9vbF9wdHIgc2hkcl9wdHI7CisgIGxhcmdlX3Bvb2xfcHRyIGxoZHJfcHRyOworICBzaXplX3Qgc3BhY2VfZnJlZWQ7CisKKyAgaWYgKHBvb2xfaWQgPCAwIHx8IHBvb2xfaWQgPj0gSlBPT0xfTlVNUE9PTFMpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BPT0xfSUQsIHBvb2xfaWQpOwkvKiBzYWZldHkgY2hlY2sgKi8KKworI2lmZGVmIE1FTV9TVEFUUworICBpZiAoY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPiAxKQorICAgIHByaW50X21lbV9zdGF0cyhjaW5mbywgcG9vbF9pZCk7IC8qIHByaW50IHBvb2wncyBtZW1vcnkgdXNhZ2Ugc3RhdGlzdGljcyAqLworI2VuZGlmCisKKyAgLyogSWYgZnJlZWluZyBJTUFHRSBwb29sLCBjbG9zZSBhbnkgdmlydHVhbCBhcnJheXMgZmlyc3QgKi8KKyAgaWYgKHBvb2xfaWQgPT0gSlBPT0xfSU1BR0UpIHsKKyAgICBqdmlydF9zYXJyYXlfcHRyIHNwdHI7CisgICAganZpcnRfYmFycmF5X3B0ciBicHRyOworCisgICAgZm9yIChzcHRyID0gbWVtLT52aXJ0X3NhcnJheV9saXN0OyBzcHRyICE9IE5VTEw7IHNwdHIgPSBzcHRyLT5uZXh0KSB7CisgICAgICBpZiAoc3B0ci0+Yl9zX29wZW4pIHsJLyogdGhlcmUgbWF5IGJlIG5vIGJhY2tpbmcgc3RvcmUgKi8KKwlzcHRyLT5iX3Nfb3BlbiA9IEZBTFNFOwkvKiBwcmV2ZW50IHJlY3Vyc2l2ZSBjbG9zZSBpZiBlcnJvciAqLworCSgqc3B0ci0+Yl9zX2luZm8uY2xvc2VfYmFja2luZ19zdG9yZSkgKGNpbmZvLCAmIHNwdHItPmJfc19pbmZvKTsKKyAgICAgIH0KKyAgICB9CisgICAgbWVtLT52aXJ0X3NhcnJheV9saXN0ID0gTlVMTDsKKyAgICBmb3IgKGJwdHIgPSBtZW0tPnZpcnRfYmFycmF5X2xpc3Q7IGJwdHIgIT0gTlVMTDsgYnB0ciA9IGJwdHItPm5leHQpIHsKKyAgICAgIGlmIChicHRyLT5iX3Nfb3BlbikgewkvKiB0aGVyZSBtYXkgYmUgbm8gYmFja2luZyBzdG9yZSAqLworCWJwdHItPmJfc19vcGVuID0gRkFMU0U7CS8qIHByZXZlbnQgcmVjdXJzaXZlIGNsb3NlIGlmIGVycm9yICovCisJKCpicHRyLT5iX3NfaW5mby5jbG9zZV9iYWNraW5nX3N0b3JlKSAoY2luZm8sICYgYnB0ci0+Yl9zX2luZm8pOworICAgICAgfQorICAgIH0KKyAgICBtZW0tPnZpcnRfYmFycmF5X2xpc3QgPSBOVUxMOworICB9CisKKyAgLyogUmVsZWFzZSBsYXJnZSBvYmplY3RzICovCisgIGxoZHJfcHRyID0gbWVtLT5sYXJnZV9saXN0W3Bvb2xfaWRdOworICBtZW0tPmxhcmdlX2xpc3RbcG9vbF9pZF0gPSBOVUxMOworCisgIHdoaWxlIChsaGRyX3B0ciAhPSBOVUxMKSB7CisgICAgbGFyZ2VfcG9vbF9wdHIgbmV4dF9saGRyX3B0ciA9IGxoZHJfcHRyLT5oZHIubmV4dDsKKyAgICBzcGFjZV9mcmVlZCA9IGxoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCArCisJCSAgbGhkcl9wdHItPmhkci5ieXRlc19sZWZ0ICsKKwkJICBTSVpFT0YobGFyZ2VfcG9vbF9oZHIpOworICAgIGpwZWdfZnJlZV9sYXJnZShjaW5mbywgKHZvaWQgRkFSICopIGxoZHJfcHRyLCBzcGFjZV9mcmVlZCk7CisgICAgbWVtLT50b3RhbF9zcGFjZV9hbGxvY2F0ZWQgLT0gc3BhY2VfZnJlZWQ7CisgICAgbGhkcl9wdHIgPSBuZXh0X2xoZHJfcHRyOworICB9CisKKyAgLyogUmVsZWFzZSBzbWFsbCBvYmplY3RzICovCisgIHNoZHJfcHRyID0gbWVtLT5zbWFsbF9saXN0W3Bvb2xfaWRdOworICBtZW0tPnNtYWxsX2xpc3RbcG9vbF9pZF0gPSBOVUxMOworCisgIHdoaWxlIChzaGRyX3B0ciAhPSBOVUxMKSB7CisgICAgc21hbGxfcG9vbF9wdHIgbmV4dF9zaGRyX3B0ciA9IHNoZHJfcHRyLT5oZHIubmV4dDsKKyAgICBzcGFjZV9mcmVlZCA9IHNoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCArCisJCSAgc2hkcl9wdHItPmhkci5ieXRlc19sZWZ0ICsKKwkJICBTSVpFT0Yoc21hbGxfcG9vbF9oZHIpOworICAgIGpwZWdfZnJlZV9zbWFsbChjaW5mbywgKHZvaWQgKikgc2hkcl9wdHIsIHNwYWNlX2ZyZWVkKTsKKyAgICBtZW0tPnRvdGFsX3NwYWNlX2FsbG9jYXRlZCAtPSBzcGFjZV9mcmVlZDsKKyAgICBzaGRyX3B0ciA9IG5leHRfc2hkcl9wdHI7CisgIH0KK30KKworCisvKgorICogQ2xvc2UgdXAgc2hvcCBlbnRpcmVseS4KKyAqIE5vdGUgdGhhdCB0aGlzIGNhbm5vdCBiZSBjYWxsZWQgdW5sZXNzIGNpbmZvLT5tZW0gaXMgbm9uLU5VTEwuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzZWxmX2Rlc3RydWN0IChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIGludCBwb29sOworCisgIC8qIENsb3NlIGFsbCBiYWNraW5nIHN0b3JlLCByZWxlYXNlIGFsbCBtZW1vcnkuCisgICAqIFJlbGVhc2luZyBwb29scyBpbiByZXZlcnNlIG9yZGVyIG1pZ2h0IGhlbHAgYXZvaWQgZnJhZ21lbnRhdGlvbgorICAgKiB3aXRoIHNvbWUgKGJyYWluLWRhbWFnZWQpIG1hbGxvYyBsaWJyYXJpZXMuCisgICAqLworICBmb3IgKHBvb2wgPSBKUE9PTF9OVU1QT09MUy0xOyBwb29sID49IEpQT09MX1BFUk1BTkVOVDsgcG9vbC0tKSB7CisgICAgZnJlZV9wb29sKGNpbmZvLCBwb29sKTsKKyAgfQorCisgIC8qIFJlbGVhc2UgdGhlIG1lbW9yeSBtYW5hZ2VyIGNvbnRyb2wgYmxvY2sgdG9vLiAqLworICBqcGVnX2ZyZWVfc21hbGwoY2luZm8sICh2b2lkICopIGNpbmZvLT5tZW0sIFNJWkVPRihteV9tZW1vcnlfbWdyKSk7CisgIGNpbmZvLT5tZW0gPSBOVUxMOwkJLyogZW5zdXJlcyBJIHdpbGwgYmUgY2FsbGVkIG9ubHkgb25jZSAqLworCisgIGpwZWdfbWVtX3Rlcm0oY2luZm8pOwkJLyogc3lzdGVtLWRlcGVuZGVudCBjbGVhbnVwICovCit9CisKKworLyoKKyAqIE1lbW9yeSBtYW5hZ2VyIGluaXRpYWxpemF0aW9uLgorICogV2hlbiB0aGlzIGlzIGNhbGxlZCwgb25seSB0aGUgZXJyb3IgbWFuYWdlciBwb2ludGVyIGlzIHZhbGlkIGluIGNpbmZvIQorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfbWVtb3J5X21nciAoal9jb21tb25fcHRyIGNpbmZvKQoreworICBteV9tZW1fcHRyIG1lbTsKKyAgbG9uZyBtYXhfdG9fdXNlOworICBpbnQgcG9vbDsKKyAgc2l6ZV90IHRlc3RfbWFjOworCisgIGNpbmZvLT5tZW0gPSBOVUxMOwkJLyogZm9yIHNhZmV0eSBpZiBpbml0IGZhaWxzICovCisKKyAgLyogQ2hlY2sgZm9yIGNvbmZpZ3VyYXRpb24gZXJyb3JzLgorICAgKiBTSVpFT0YoQUxJR05fVFlQRSkgc2hvdWxkIGJlIGEgcG93ZXIgb2YgMjsgb3RoZXJ3aXNlLCBpdCBwcm9iYWJseQorICAgKiBkb2Vzbid0IHJlZmxlY3QgYW55IHJlYWwgaGFyZHdhcmUgYWxpZ25tZW50IHJlcXVpcmVtZW50LgorICAgKiBUaGUgdGVzdCBpcyBhIGxpdHRsZSB0cmlja3k6IGZvciBYPjAsIFggYW5kIFgtMSBoYXZlIG5vIG9uZS1iaXRzCisgICAqIGluIGNvbW1vbiBpZiBhbmQgb25seSBpZiBYIGlzIGEgcG93ZXIgb2YgMiwgaWUgaGFzIG9ubHkgb25lIG9uZS1iaXQuCisgICAqIFNvbWUgY29tcGlsZXJzIG1heSBnaXZlIGFuICJ1bnJlYWNoYWJsZSBjb2RlIiB3YXJuaW5nIGhlcmU7IGlnbm9yZSBpdC4KKyAgICovCisgIGlmICgoU0laRU9GKEFMSUdOX1RZUEUpICYgKFNJWkVPRihBTElHTl9UWVBFKS0xKSkgIT0gMCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9BTElHTl9UWVBFKTsKKyAgLyogTUFYX0FMTE9DX0NIVU5LIG11c3QgYmUgcmVwcmVzZW50YWJsZSBhcyB0eXBlIHNpemVfdCwgYW5kIG11c3QgYmUKKyAgICogYSBtdWx0aXBsZSBvZiBTSVpFT0YoQUxJR05fVFlQRSkuCisgICAqIEFnYWluLCBhbiAidW5yZWFjaGFibGUgY29kZSIgd2FybmluZyBtYXkgYmUgaWdub3JlZCBoZXJlLgorICAgKiBCdXQgYSAiY29uc3RhbnQgdG9vIGxhcmdlIiB3YXJuaW5nIG1lYW5zIHlvdSBuZWVkIHRvIGZpeCBNQVhfQUxMT0NfQ0hVTksuCisgICAqLworICB0ZXN0X21hYyA9IChzaXplX3QpIE1BWF9BTExPQ19DSFVOSzsKKyAgaWYgKChsb25nKSB0ZXN0X21hYyAhPSBNQVhfQUxMT0NfQ0hVTksgfHwKKyAgICAgIChNQVhfQUxMT0NfQ0hVTksgJSBTSVpFT0YoQUxJR05fVFlQRSkpICE9IDApCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQUxMT0NfQ0hVTkspOworCisgIG1heF90b191c2UgPSBqcGVnX21lbV9pbml0KGNpbmZvKTsgLyogc3lzdGVtLWRlcGVuZGVudCBpbml0aWFsaXphdGlvbiAqLworCisgIC8qIEF0dGVtcHQgdG8gYWxsb2NhdGUgbWVtb3J5IG1hbmFnZXIncyBjb250cm9sIGJsb2NrICovCisgIG1lbSA9IChteV9tZW1fcHRyKSBqcGVnX2dldF9zbWFsbChjaW5mbywgU0laRU9GKG15X21lbW9yeV9tZ3IpKTsKKworICBpZiAobWVtID09IE5VTEwpIHsKKyAgICBqcGVnX21lbV90ZXJtKGNpbmZvKTsJLyogc3lzdGVtLWRlcGVuZGVudCBjbGVhbnVwICovCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfT1VUX09GX01FTU9SWSwgMCk7CisgIH0KKworICAvKiBPSywgZmlsbCBpbiB0aGUgbWV0aG9kIHBvaW50ZXJzICovCisgIG1lbS0+cHViLmFsbG9jX3NtYWxsID0gYWxsb2Nfc21hbGw7CisgIG1lbS0+cHViLmFsbG9jX2xhcmdlID0gYWxsb2NfbGFyZ2U7CisgIG1lbS0+cHViLmFsbG9jX3NhcnJheSA9IGFsbG9jX3NhcnJheTsKKyAgbWVtLT5wdWIuYWxsb2NfYmFycmF5ID0gYWxsb2NfYmFycmF5OworICBtZW0tPnB1Yi5yZXF1ZXN0X3ZpcnRfc2FycmF5ID0gcmVxdWVzdF92aXJ0X3NhcnJheTsKKyAgbWVtLT5wdWIucmVxdWVzdF92aXJ0X2JhcnJheSA9IHJlcXVlc3RfdmlydF9iYXJyYXk7CisgIG1lbS0+cHViLnJlYWxpemVfdmlydF9hcnJheXMgPSByZWFsaXplX3ZpcnRfYXJyYXlzOworICBtZW0tPnB1Yi5hY2Nlc3NfdmlydF9zYXJyYXkgPSBhY2Nlc3NfdmlydF9zYXJyYXk7CisgIG1lbS0+cHViLmFjY2Vzc192aXJ0X2JhcnJheSA9IGFjY2Vzc192aXJ0X2JhcnJheTsKKyAgbWVtLT5wdWIuZnJlZV9wb29sID0gZnJlZV9wb29sOworICBtZW0tPnB1Yi5zZWxmX2Rlc3RydWN0ID0gc2VsZl9kZXN0cnVjdDsKKworICAvKiBNYWtlIE1BWF9BTExPQ19DSFVOSyBhY2Nlc3NpYmxlIHRvIG90aGVyIG1vZHVsZXMgKi8KKyAgbWVtLT5wdWIubWF4X2FsbG9jX2NodW5rID0gTUFYX0FMTE9DX0NIVU5LOworCisgIC8qIEluaXRpYWxpemUgd29ya2luZyBzdGF0ZSAqLworICBtZW0tPnB1Yi5tYXhfbWVtb3J5X3RvX3VzZSA9IG1heF90b191c2U7CisKKyAgZm9yIChwb29sID0gSlBPT0xfTlVNUE9PTFMtMTsgcG9vbCA+PSBKUE9PTF9QRVJNQU5FTlQ7IHBvb2wtLSkgeworICAgIG1lbS0+c21hbGxfbGlzdFtwb29sXSA9IE5VTEw7CisgICAgbWVtLT5sYXJnZV9saXN0W3Bvb2xdID0gTlVMTDsKKyAgfQorICBtZW0tPnZpcnRfc2FycmF5X2xpc3QgPSBOVUxMOworICBtZW0tPnZpcnRfYmFycmF5X2xpc3QgPSBOVUxMOworCisgIG1lbS0+dG90YWxfc3BhY2VfYWxsb2NhdGVkID0gU0laRU9GKG15X21lbW9yeV9tZ3IpOworCisgIC8qIERlY2xhcmUgb3Vyc2VsdmVzIG9wZW4gZm9yIGJ1c2luZXNzICovCisgIGNpbmZvLT5tZW0gPSAmIG1lbS0+cHViOworCisgIC8qIENoZWNrIGZvciBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBKUEVHTUVNOyBpZiBmb3VuZCwgb3ZlcnJpZGUgdGhlCisgICAqIGRlZmF1bHQgbWF4X21lbW9yeSBzZXR0aW5nIGZyb20ganBlZ19tZW1faW5pdC4gIE5vdGUgdGhhdCB0aGUKKyAgICogc3Vycm91bmRpbmcgYXBwbGljYXRpb24gbWF5IGFnYWluIG92ZXJyaWRlIHRoaXMgdmFsdWUuCisgICAqIElmIHlvdXIgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBnZXRlbnYoKSwgZGVmaW5lIE5PX0dFVEVOViB0byBkaXNhYmxlCisgICAqIHRoaXMgZmVhdHVyZS4KKyAgICovCisjaWZuZGVmIE5PX0dFVEVOVgorICB7IGNoYXIgKiBtZW1lbnY7CisKKyAgICBpZiAoKG1lbWVudiA9IGdldGVudigiSlBFR01FTSIpKSAhPSBOVUxMKSB7CisgICAgICBjaGFyIGNoID0gJ3gnOworCisgICAgICBpZiAoc3NjYW5mKG1lbWVudiwgIiVsZCVjIiwgJm1heF90b191c2UsICZjaCkgPiAwKSB7CisJaWYgKGNoID09ICdtJyB8fCBjaCA9PSAnTScpCisJICBtYXhfdG9fdXNlICo9IDEwMDBMOworCW1lbS0+cHViLm1heF9tZW1vcnlfdG9fdXNlID0gbWF4X3RvX3VzZSAqIDEwMDBMOworICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCisKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qbWVtbm9icy5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2ptZW1ub2JzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxYzVkNgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qbWVtbm9icy5jCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogam1lbW5vYnMuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIHByb3ZpZGVzIGEgcmVhbGx5IHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3lzdGVtLQorICogZGVwZW5kZW50IHBvcnRpb24gb2YgdGhlIEpQRUcgbWVtb3J5IG1hbmFnZXIuICBUaGlzIGltcGxlbWVudGF0aW9uCisgKiBhc3N1bWVzIHRoYXQgbm8gYmFja2luZy1zdG9yZSBmaWxlcyBhcmUgbmVlZGVkOiBhbGwgcmVxdWlyZWQgc3BhY2UKKyAqIGNhbiBiZSBvYnRhaW5lZCBmcm9tIG1hbGxvYygpLgorICogVGhpcyBpcyB2ZXJ5IHBvcnRhYmxlIGluIHRoZSBzZW5zZSB0aGF0IGl0J2xsIGNvbXBpbGUgb24gYWxtb3N0IGFueXRoaW5nLAorICogYnV0IHlvdSdkIGJldHRlciBoYXZlIGxvdHMgb2YgbWFpbiBtZW1vcnkgKG9yIHZpcnR1YWwgbWVtb3J5KSBpZiB5b3Ugd2FudAorICogdG8gcHJvY2VzcyBiaWcgaW1hZ2VzLgorICogTm90ZSB0aGF0IHRoZSBtYXhfbWVtb3J5X3RvX3VzZSBvcHRpb24gaXMgaWdub3JlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqbWVtc3lzLmgiCQkvKiBpbXBvcnQgdGhlIHN5c3RlbS1kZXBlbmRlbnQgZGVjbGFyYXRpb25zICovCisKKyNpZm5kZWYgSEFWRV9TVERMSUJfSAkJLyogPHN0ZGxpYi5oPiBzaG91bGQgZGVjbGFyZSBtYWxsb2MoKSxmcmVlKCkgKi8KK2V4dGVybiB2b2lkICogbWFsbG9jIEpQUCgoc2l6ZV90IHNpemUpKTsKK2V4dGVybiB2b2lkIGZyZWUgSlBQKCh2b2lkICpwdHIpKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfRlhfTUFOQUdFRF9DT0RFXykgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3ZvaWQqCUZYTUVNX0RlZmF1bHRBbGxvYyhpbnQgYnl0ZV9zaXplLCBpbnQpOwordm9pZAlGWE1FTV9EZWZhdWx0RnJlZSh2b2lkKiBwb2ludGVyLCBpbnQpOworCisjaWYgZGVmaW5lZChfRlhfTUFOQUdFRF9DT0RFXykgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKK30KKyNlbmRpZgorCisvKgorICogTWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWVpbmcgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIHJlZ3VsYXIgbGlicmFyeQorICogcm91dGluZXMgbWFsbG9jKCkgYW5kIGZyZWUoKS4KKyAqLworCitHTE9CQUwodm9pZCAqKQoranBlZ19nZXRfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKy8vICByZXR1cm4gKHZvaWQgKikgbWFsbG9jKHNpemVvZm9iamVjdCk7CisJcmV0dXJuIEZYTUVNX0RlZmF1bHRBbGxvYyhzaXplb2ZvYmplY3QsIDApOworfQorCitHTE9CQUwodm9pZCkKK2pwZWdfZnJlZV9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkICogb2JqZWN0LCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworLy8gIGZyZWUob2JqZWN0KTsKKwlGWE1FTV9EZWZhdWx0RnJlZShvYmplY3QsIDApOworfQorCisKKy8qCisgKiAiTGFyZ2UiIG9iamVjdHMgYXJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgInNtYWxsIiBvbmVzLgorICogTkI6IGFsdGhvdWdoIHdlIGluY2x1ZGUgRkFSIGtleXdvcmRzIGluIHRoZSByb3V0aW5lIGRlY2xhcmF0aW9ucywKKyAqIHRoaXMgZmlsZSB3b24ndCBhY3R1YWxseSB3b3JrIGluIDgweDg2IHNtYWxsL21lZGl1bSBtb2RlbDsgYXQgbGVhc3QsCisgKiB5b3UgcHJvYmFibHkgd29uJ3QgYmUgYWJsZSB0byBwcm9jZXNzIHVzZWZ1bC1zaXplIGltYWdlcyBpbiBvbmx5IDY0S0IuCisgKi8KKworR0xPQkFMKHZvaWQgRkFSICopCitqcGVnX2dldF9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworLy8gIHJldHVybiAodm9pZCBGQVIgKikgbWFsbG9jKHNpemVvZm9iamVjdCk7CisJcmV0dXJuIEZYTUVNX0RlZmF1bHRBbGxvYyhzaXplb2ZvYmplY3QsIDApOworfQorCitHTE9CQUwodm9pZCkKK2pwZWdfZnJlZV9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkIEZBUiAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKy8vICBmcmVlKG9iamVjdCk7CisJRlhNRU1fRGVmYXVsdEZyZWUob2JqZWN0LCAwKTsKK30KKworCisvKgorICogVGhpcyByb3V0aW5lIGNvbXB1dGVzIHRoZSB0b3RhbCBtZW1vcnkgc3BhY2UgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLgorICogSGVyZSB3ZSBhbHdheXMgc2F5LCAid2UgZ290IGFsbCB5b3Ugd2FudCBidWQhIgorICovCisKK0dMT0JBTChsb25nKQoranBlZ19tZW1fYXZhaWxhYmxlIChqX2NvbW1vbl9wdHIgY2luZm8sIGxvbmcgbWluX2J5dGVzX25lZWRlZCwKKwkJICAgIGxvbmcgbWF4X2J5dGVzX25lZWRlZCwgbG9uZyBhbHJlYWR5X2FsbG9jYXRlZCkKK3sKKyAgcmV0dXJuIG1heF9ieXRlc19uZWVkZWQ7Cit9CisKKworLyoKKyAqIEJhY2tpbmcgc3RvcmUgKHRlbXBvcmFyeSBmaWxlKSBtYW5hZ2VtZW50LgorICogU2luY2UganBlZ19tZW1fYXZhaWxhYmxlIGFsd2F5cyBwcm9taXNlZCB0aGUgbW9vbiwKKyAqIHRoaXMgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBhbmQgd2UgY2FuIGp1c3QgZXJyb3Igb3V0LgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19vcGVuX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJCSBsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkKK3sKKyAgRVJSRVhJVChjaW5mbywgSkVSUl9OT19CQUNLSU5HX1NUT1JFKTsKK30KKworCisvKgorICogVGhlc2Ugcm91dGluZXMgdGFrZSBjYXJlIG9mIGFueSBzeXN0ZW0tZGVwZW5kZW50IGluaXRpYWxpemF0aW9uIGFuZAorICogY2xlYW51cCByZXF1aXJlZC4gIEhlcmUsIHRoZXJlIGlzbid0IGFueS4KKyAqLworCitHTE9CQUwobG9uZykKK2pwZWdfbWVtX2luaXQgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgcmV0dXJuIDA7CQkJLyoganVzdCBzZXQgbWF4X21lbW9yeV90b191c2UgdG8gMCAqLworfQorCitHTE9CQUwodm9pZCkKK2pwZWdfbWVtX3Rlcm0gKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgLyogbm8gd29yayAqLworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2p1dGlscy5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2p1dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxOGE5NTUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfanV0aWxzLmMKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBqdXRpbHMuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRhYmxlcyBhbmQgbWlzY2VsbGFuZW91cyB1dGlsaXR5IHJvdXRpbmVzIG5lZWRlZAorICogZm9yIGJvdGggY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24uCisgKiBOb3RlIHdlIHByZWZpeCBhbGwgZ2xvYmFsIG5hbWVzIHdpdGggImoiIHRvIG1pbmltaXplIGNvbmZsaWN0cyB3aXRoCisgKiBhIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKgorICoganBlZ196aWd6YWdfb3JkZXJbaV0gaXMgdGhlIHppZ3phZy1vcmRlciBwb3NpdGlvbiBvZiB0aGUgaSd0aCBlbGVtZW50CisgKiBvZiBhIERDVCBibG9jayByZWFkIGluIG5hdHVyYWwgb3JkZXIgKGxlZnQgdG8gcmlnaHQsIHRvcCB0byBib3R0b20pLgorICovCisKKyNpZiAwCQkJCS8qIFRoaXMgdGFibGUgaXMgbm90IGFjdHVhbGx5IG5lZWRlZCBpbiB2NmEgKi8KKworY29uc3QgaW50IGpwZWdfemlnemFnX29yZGVyW0RDVFNJWkUyXSA9IHsKKyAgIDAsICAxLCAgNSwgIDYsIDE0LCAxNSwgMjcsIDI4LAorICAgMiwgIDQsICA3LCAxMywgMTYsIDI2LCAyOSwgNDIsCisgICAzLCAgOCwgMTIsIDE3LCAyNSwgMzAsIDQxLCA0MywKKyAgIDksIDExLCAxOCwgMjQsIDMxLCA0MCwgNDQsIDUzLAorICAxMCwgMTksIDIzLCAzMiwgMzksIDQ1LCA1MiwgNTQsCisgIDIwLCAyMiwgMzMsIDM4LCA0NiwgNTEsIDU1LCA2MCwKKyAgMjEsIDM0LCAzNywgNDcsIDUwLCA1NiwgNTksIDYxLAorICAzNSwgMzYsIDQ4LCA0OSwgNTcsIDU4LCA2MiwgNjMKK307CisKKyNlbmRpZgorCisvKgorICoganBlZ19uYXR1cmFsX29yZGVyW2ldIGlzIHRoZSBuYXR1cmFsLW9yZGVyIHBvc2l0aW9uIG9mIHRoZSBpJ3RoIGVsZW1lbnQKKyAqIG9mIHppZ3phZyBvcmRlci4KKyAqCisgKiBXaGVuIHJlYWRpbmcgY29ycnVwdGVkIGRhdGEsIHRoZSBIdWZmbWFuIGRlY29kZXJzIGNvdWxkIGF0dGVtcHQKKyAqIHRvIHJlZmVyZW5jZSBhbiBlbnRyeSBiZXlvbmQgdGhlIGVuZCBvZiB0aGlzIGFycmF5IChpZiB0aGUgZGVjb2RlZAorICogemVybyBydW4gbGVuZ3RoIHJlYWNoZXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBibG9jaykuICBUbyBwcmV2ZW50CisgKiB3aWxkIHN0b3JlcyB3aXRob3V0IGFkZGluZyBhbiBpbm5lci1sb29wIHRlc3QsIHdlIHB1dCBzb21lIGV4dHJhCisgKiAiNjMicyBhZnRlciB0aGUgcmVhbCBlbnRyaWVzLiAgVGhpcyB3aWxsIGNhdXNlIHRoZSBleHRyYSBjb2VmZmljaWVudAorICogdG8gYmUgc3RvcmVkIGluIGxvY2F0aW9uIDYzIG9mIHRoZSBibG9jaywgbm90IHNvbWV3aGVyZSByYW5kb20uCisgKiBUaGUgd29yc3QgY2FzZSB3b3VsZCBiZSBhIHJ1bi1sZW5ndGggb2YgMTUsIHdoaWNoIG1lYW5zIHdlIG5lZWQgMTYKKyAqIGZha2UgZW50cmllcy4KKyAqLworCitjb25zdCBpbnQganBlZ19uYXR1cmFsX29yZGVyW0RDVFNJWkUyKzE2XSA9IHsKKyAgMCwgIDEsICA4LCAxNiwgIDksICAyLCAgMywgMTAsCisgMTcsIDI0LCAzMiwgMjUsIDE4LCAxMSwgIDQsICA1LAorIDEyLCAxOSwgMjYsIDMzLCA0MCwgNDgsIDQxLCAzNCwKKyAyNywgMjAsIDEzLCAgNiwgIDcsIDE0LCAyMSwgMjgsCisgMzUsIDQyLCA0OSwgNTYsIDU3LCA1MCwgNDMsIDM2LAorIDI5LCAyMiwgMTUsIDIzLCAzMCwgMzcsIDQ0LCA1MSwKKyA1OCwgNTksIDUyLCA0NSwgMzgsIDMxLCAzOSwgNDYsCisgNTMsIDYwLCA2MSwgNTQsIDQ3LCA1NSwgNjIsIDYzLAorIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgLyogZXh0cmEgZW50cmllcyBmb3Igc2FmZXR5IGluIGRlY29kZXIgKi8KKyA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMKK307CisKKworLyoKKyAqIEFyaXRobWV0aWMgdXRpbGl0aWVzCisgKi8KKworR0xPQkFMKGxvbmcpCitqZGl2X3JvdW5kX3VwIChsb25nIGEsIGxvbmcgYikKKy8qIENvbXB1dGUgYS9iIHJvdW5kZWQgdXAgdG8gbmV4dCBpbnRlZ2VyLCBpZSwgY2VpbChhL2IpICovCisvKiBBc3N1bWVzIGEgPj0gMCwgYiA+IDAgKi8KK3sKKyAgcmV0dXJuIChhICsgYiAtIDFMKSAvIGI7Cit9CisKKworR0xPQkFMKGxvbmcpCitqcm91bmRfdXAgKGxvbmcgYSwgbG9uZyBiKQorLyogQ29tcHV0ZSBhIHJvdW5kZWQgdXAgdG8gbmV4dCBtdWx0aXBsZSBvZiBiLCBpZSwgY2VpbChhL2IpKmIgKi8KKy8qIEFzc3VtZXMgYSA+PSAwLCBiID4gMCAqLworeworICBhICs9IGIgLSAxTDsKKyAgcmV0dXJuIGEgLSAoYSAlIGIpOworfQorCisKKy8qIE9uIG5vcm1hbCBtYWNoaW5lcyB3ZSBjYW4gYXBwbHkgTUVNQ09QWSgpIGFuZCBNRU1aRVJPKCkgdG8gc2FtcGxlIGFycmF5cworICogYW5kIGNvZWZmaWNpZW50LWJsb2NrIGFycmF5cy4gIFRoaXMgd29uJ3Qgd29yayBvbiA4MHg4NiBiZWNhdXNlIHRoZSBhcnJheXMKKyAqIGFyZSBGQVIgYW5kIHdlJ3JlIGFzc3VtaW5nIGEgc21hbGwtcG9pbnRlciBtZW1vcnkgbW9kZWwuICBIb3dldmVyLCBzb21lCisgKiBET1MgY29tcGlsZXJzIHByb3ZpZGUgZmFyLXBvaW50ZXIgdmVyc2lvbnMgb2YgbWVtY3B5KCkgYW5kIG1lbXNldCgpIGV2ZW4KKyAqIGluIHRoZSBzbWFsbC1tb2RlbCBsaWJyYXJpZXMuICBUaGVzZSB3aWxsIGJlIHVzZWQgaWYgVVNFX0ZNRU0gaXMgZGVmaW5lZC4KKyAqIE90aGVyd2lzZSwgdGhlIHJvdXRpbmVzIGJlbG93IGRvIGl0IHRoZSBoYXJkIHdheS4gIChUaGUgcGVyZm9ybWFuY2UgY29zdAorICogaXMgbm90IGFsbCB0aGF0IGdyZWF0LCBiZWNhdXNlIHRoZXNlIHJvdXRpbmVzIGFyZW4ndCB2ZXJ5IGhlYXZpbHkgdXNlZC4pCisgKi8KKworI2lmbmRlZiBORUVEX0ZBUl9QT0lOVEVSUwkvKiBub3JtYWwgY2FzZSwgc2FtZSBhcyByZWd1bGFyIG1hY3JvcyAqLworI2RlZmluZSBGTUVNQ09QWShkZXN0LHNyYyxzaXplKQlNRU1DT1BZKGRlc3Qsc3JjLHNpemUpCisjZGVmaW5lIEZNRU1aRVJPKHRhcmdldCxzaXplKQlNRU1aRVJPKHRhcmdldCxzaXplKQorI2Vsc2UJCQkJLyogODB4ODYgY2FzZSwgZGVmaW5lIGlmIHdlIGNhbiAqLworI2lmZGVmIFVTRV9GTUVNCisjZGVmaW5lIEZNRU1DT1BZKGRlc3Qsc3JjLHNpemUpCV9mbWVtY3B5KCh2b2lkIEZBUiAqKShkZXN0KSwgKGNvbnN0IHZvaWQgRkFSICopKHNyYyksIChzaXplX3QpKHNpemUpKQorI2RlZmluZSBGTUVNWkVSTyh0YXJnZXQsc2l6ZSkJX2ZtZW1zZXQoKHZvaWQgRkFSICopKHRhcmdldCksIDAsIChzaXplX3QpKHNpemUpKQorI2VuZGlmCisjZW5kaWYKKworCitHTE9CQUwodm9pZCkKK2pjb3B5X3NhbXBsZV9yb3dzIChKU0FNUEFSUkFZIGlucHV0X2FycmF5LCBpbnQgc291cmNlX3JvdywKKwkJICAgSlNBTVBBUlJBWSBvdXRwdXRfYXJyYXksIGludCBkZXN0X3JvdywKKwkJICAgaW50IG51bV9yb3dzLCBKRElNRU5TSU9OIG51bV9jb2xzKQorLyogQ29weSBzb21lIHJvd3Mgb2Ygc2FtcGxlcyBmcm9tIG9uZSBwbGFjZSB0byBhbm90aGVyLgorICogbnVtX3Jvd3Mgcm93cyBhcmUgY29waWVkIGZyb20gaW5wdXRfYXJyYXlbc291cmNlX3JvdysrXQorICogdG8gb3V0cHV0X2FycmF5W2Rlc3Rfcm93KytdOyB0aGVzZSBhcmVhcyBtYXkgb3ZlcmxhcCBmb3IgZHVwbGljYXRpb24uCisgKiBUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcnJheXMgbXVzdCBiZSBhdCBsZWFzdCBhcyB3aWRlIGFzIG51bV9jb2xzLgorICovCit7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisjaWZkZWYgRk1FTUNPUFkKKyAgcmVnaXN0ZXIgc2l6ZV90IGNvdW50ID0gKHNpemVfdCkgKG51bV9jb2xzICogU0laRU9GKEpTQU1QTEUpKTsKKyNlbHNlCisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY291bnQ7CisjZW5kaWYKKyAgcmVnaXN0ZXIgaW50IHJvdzsKKworICBpbnB1dF9hcnJheSArPSBzb3VyY2Vfcm93OworICBvdXRwdXRfYXJyYXkgKz0gZGVzdF9yb3c7CisKKyAgZm9yIChyb3cgPSBudW1fcm93czsgcm93ID4gMDsgcm93LS0pIHsKKyAgICBpbnB0ciA9ICppbnB1dF9hcnJheSsrOworICAgIG91dHB0ciA9ICpvdXRwdXRfYXJyYXkrKzsKKyNpZmRlZiBGTUVNQ09QWQorICAgIEZNRU1DT1BZKG91dHB0ciwgaW5wdHIsIGNvdW50KTsKKyNlbHNlCisgICAgZm9yIChjb3VudCA9IG51bV9jb2xzOyBjb3VudCA+IDA7IGNvdW50LS0pCisgICAgICAqb3V0cHRyKysgPSAqaW5wdHIrKzsJLyogbmVlZG4ndCBib3RoZXIgd2l0aCBHRVRKU0FNUExFKCkgaGVyZSAqLworI2VuZGlmCisgIH0KK30KKworCitHTE9CQUwodm9pZCkKK2pjb3B5X2Jsb2NrX3JvdyAoSkJMT0NLUk9XIGlucHV0X3JvdywgSkJMT0NLUk9XIG91dHB1dF9yb3csCisJCSBKRElNRU5TSU9OIG51bV9ibG9ja3MpCisvKiBDb3B5IGEgcm93IG9mIGNvZWZmaWNpZW50IGJsb2NrcyBmcm9tIG9uZSBwbGFjZSB0byBhbm90aGVyLiAqLworeworI2lmZGVmIEZNRU1DT1BZCisgIEZNRU1DT1BZKG91dHB1dF9yb3csIGlucHV0X3JvdywgbnVtX2Jsb2NrcyAqIChEQ1RTSVpFMiAqIFNJWkVPRihKQ09FRikpKTsKKyNlbHNlCisgIHJlZ2lzdGVyIEpDT0VGUFRSIGlucHRyLCBvdXRwdHI7CisgIHJlZ2lzdGVyIGxvbmcgY291bnQ7CisKKyAgaW5wdHIgPSAoSkNPRUZQVFIpIGlucHV0X3JvdzsKKyAgb3V0cHRyID0gKEpDT0VGUFRSKSBvdXRwdXRfcm93OworICBmb3IgKGNvdW50ID0gKGxvbmcpIG51bV9ibG9ja3MgKiBEQ1RTSVpFMjsgY291bnQgPiAwOyBjb3VudC0tKSB7CisgICAgKm91dHB0cisrID0gKmlucHRyKys7CisgIH0KKyNlbmRpZgorfQorCisKK0dMT0JBTCh2b2lkKQoranplcm9fZmFyICh2b2lkIEZBUiAqIHRhcmdldCwgc2l6ZV90IGJ5dGVzdG96ZXJvKQorLyogWmVybyBvdXQgYSBjaHVuayBvZiBGQVIgbWVtb3J5LiAqLworLyogVGhpcyBtaWdodCBiZSBzYW1wbGUtYXJyYXkgZGF0YSwgYmxvY2stYXJyYXkgZGF0YSwgb3IgYWxsb2NfbGFyZ2UgZGF0YS4gKi8KK3sKKyNpZmRlZiBGTUVNWkVSTworICBGTUVNWkVSTyh0YXJnZXQsIGJ5dGVzdG96ZXJvKTsKKyNlbHNlCisgIHJlZ2lzdGVyIGNoYXIgRkFSICogcHRyID0gKGNoYXIgRkFSICopIHRhcmdldDsKKyAgcmVnaXN0ZXIgc2l6ZV90IGNvdW50OworCisgIGZvciAoY291bnQgPSBieXRlc3RvemVybzsgY291bnQgPiAwOyBjb3VudC0tKSB7CisgICAgKnB0cisrID0gMDsKKyAgfQorI2VuZGlmCit9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvamNodWZmLmggYi90aGlyZF9wYXJ0eS9saWJqcGVnL2pjaHVmZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvamNodWZmLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmpwZWcvamNodWZmLmgKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9qY29uZmlnLmggYi90aGlyZF9wYXJ0eS9saWJqcGVnL2pjb25maWcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2pjb25maWcuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGlianBlZy9qY29uZmlnLmgKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9qZGN0LmggYi90aGlyZF9wYXJ0eS9saWJqcGVnL2pkY3QuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2pkY3QuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGlianBlZy9qZGN0LmgKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9qZGh1ZmYuaCBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvamRodWZmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9qZGh1ZmYuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGlianBlZy9qZGh1ZmYuaApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2plcnJvci5oIGIvdGhpcmRfcGFydHkvbGlianBlZy9qZXJyb3IuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2plcnJvci5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJqcGVnL2plcnJvci5oCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ppbmNsdWRlLmggYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ppbmNsdWRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU3YTYwNgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvamluY2x1ZGUuaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIGppbmNsdWRlLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBleGlzdHMgdG8gcHJvdmlkZSBhIHNpbmdsZSBwbGFjZSB0byBmaXggYW55IHByb2JsZW1zIHdpdGgKKyAqIGluY2x1ZGluZyB0aGUgd3Jvbmcgc3lzdGVtIGluY2x1ZGUgZmlsZXMuICAoQ29tbW9uIHByb2JsZW1zIGFyZSB0YWtlbgorICogY2FyZSBvZiBieSB0aGUgc3RhbmRhcmQgamNvbmZpZyBzeW1ib2xzLCBidXQgb24gcmVhbGx5IHdlaXJkIHN5c3RlbXMKKyAqIHlvdSBtYXkgaGF2ZSB0byBlZGl0IHRoaXMgZmlsZS4pCisgKgorICogTk9URTogdGhpcyBmaWxlIGlzIE5PVCBpbnRlbmRlZCB0byBiZSBpbmNsdWRlZCBieSBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlCisgKiBKUEVHIGxpYnJhcnkuICBNb3N0IGFwcGxpY2F0aW9ucyBuZWVkIG9ubHkgaW5jbHVkZSBqcGVnbGliLmguCisgKi8KKworCisvKiBJbmNsdWRlIGF1dG8tY29uZmlnIGZpbGUgdG8gZmluZCBvdXQgd2hpY2ggc3lzdGVtIGluY2x1ZGUgZmlsZXMgd2UgbmVlZC4gKi8KKworI2luY2x1ZGUgImpjb25maWcuaCIJCS8qIGF1dG8gY29uZmlndXJhdGlvbiBvcHRpb25zICovCisjZGVmaW5lIEpDT05GSUdfSU5DTFVERUQJLyogc28gdGhhdCBqcGVnbGliLmggZG9lc24ndCBkbyBpdCBhZ2FpbiAqLworCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorCisvKgorICogV2UgbmVlZCB0aGUgTlVMTCBtYWNybyBhbmQgc2l6ZV90IHR5cGVkZWYuCisgKiBPbiBhbiBBTlNJLWNvbmZvcm1pbmcgc3lzdGVtIGl0IGlzIHN1ZmZpY2llbnQgdG8gaW5jbHVkZSA8c3RkZGVmLmg+LgorICogT3RoZXJ3aXNlLCB3ZSBnZXQgdGhlbSBmcm9tIDxzdGRsaWIuaD4gb3IgPHN0ZGlvLmg+OyB3ZSBtYXkgaGF2ZSB0bworICogcHVsbCBpbiA8c3lzL3R5cGVzLmg+IGFzIHdlbGwuCisgKiBOb3RlIHRoYXQgdGhlIGNvcmUgSlBFRyBsaWJyYXJ5IGRvZXMgbm90IHJlcXVpcmUgPHN0ZGlvLmg+OworICogb25seSB0aGUgZGVmYXVsdCBlcnJvciBoYW5kbGVyIGFuZCBkYXRhIHNvdXJjZS9kZXN0aW5hdGlvbiBtb2R1bGVzIGRvLgorICogQnV0IHdlIG11c3QgcHVsbCBpdCBpbiBiZWNhdXNlIG9mIHRoZSByZWZlcmVuY2VzIHRvIEZJTEUgaW4ganBlZ2xpYi5oLgorICogWW91IGNhbiByZW1vdmUgdGhvc2UgcmVmZXJlbmNlcyBpZiB5b3Ugd2FudCB0byBjb21waWxlIHdpdGhvdXQgPHN0ZGlvLmg+LgorICovCisKKyNpZmRlZiBfREVCVUcKKyNkZWZpbmUgQ1JUREJHX01BUF9BTExPQworLy8jaW5jbHVkZSA8c3RkbGliLmg+CisvLyNpbmNsdWRlIDxjcnRkYmcuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVERERUZfSAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NURExJQl9ICisvLyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaWZkZWYgTkVFRF9TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpZm5kZWYgRkFSCisjZGVmaW5lIEZBUgorI2VuZGlmCisKKy8vI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qCisgKiBXZSBuZWVkIG1lbW9yeSBjb3B5aW5nIGFuZCB6ZXJvaW5nIGZ1bmN0aW9ucywgcGx1cyBzdHJuY3B5KCkuCisgKiBBTlNJIGFuZCBTeXN0ZW0gViBpbXBsZW1lbnRhdGlvbnMgZGVjbGFyZSB0aGVzZSBpbiA8c3RyaW5nLmg+LgorICogQlNEIGRvZXNuJ3QgaGF2ZSB0aGUgbWVtKCkgZnVuY3Rpb25zLCBidXQgaXQgZG9lcyBoYXZlIGJjb3B5KCkvYnplcm8oKS4KKyAqIFNvbWUgc3lzdGVtcyBtYXkgZGVjbGFyZSBtZW1zZXQgYW5kIG1lbWNweSBpbiA8bWVtb3J5Lmg+LgorICoKKyAqIE5PVEU6IHdlIGFzc3VtZSB0aGUgc2l6ZSBwYXJhbWV0ZXJzIHRvIHRoZXNlIGZ1bmN0aW9ucyBhcmUgb2YgdHlwZSBzaXplX3QuCisgKiBDaGFuZ2UgdGhlIGNhc3RzIGluIHRoZXNlIG1hY3JvcyBpZiBub3QhCisgKi8KKworI2lmZGVmIE5FRURfQlNEX1NUUklOR1MKKworLy8jaW5jbHVkZSA8c3RyaW5ncy5oPgorI2RlZmluZSBNRU1aRVJPKHRhcmdldCxzaXplKQliemVybygodm9pZCAqKSh0YXJnZXQpLCAoc2l6ZV90KShzaXplKSkKKyNkZWZpbmUgTUVNQ09QWShkZXN0LHNyYyxzaXplKQliY29weSgoY29uc3Qgdm9pZCAqKShzcmMpLCAodm9pZCAqKShkZXN0KSwgKHNpemVfdCkoc2l6ZSkpCisKKyNlbHNlIC8qIG5vdCBCU0QsIGFzc3VtZSBBTlNJL1N5c1Ygc3RyaW5nIGxpYiAqLworCisvLyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNkZWZpbmUgTUVNWkVSTyh0YXJnZXQsc2l6ZSkJRlhTWVNfbWVtc2V0KCh2b2lkICopKHRhcmdldCksIDAsIChzaXplX3QpKHNpemUpKQorI2RlZmluZSBNRU1DT1BZKGRlc3Qsc3JjLHNpemUpCUZYU1lTX21lbWNweSgodm9pZCAqKShkZXN0KSwgKGNvbnN0IHZvaWQgKikoc3JjKSwgKHNpemVfdCkoc2l6ZSkpCisKKyNlbmRpZgorCisvKgorICogSW4gQU5TSSBDLCBhbmQgaW5kZWVkIGFueSByYXRpb25hbCBpbXBsZW1lbnRhdGlvbiwgc2l6ZV90IGlzIGFsc28gdGhlCisgKiB0eXBlIHJldHVybmVkIGJ5IHNpemVvZigpLiAgSG93ZXZlciwgaXQgc2VlbXMgdGhlcmUgYXJlIHNvbWUgaXJyYXRpb25hbAorICogaW1wbGVtZW50YXRpb25zIG91dCB0aGVyZSwgaW4gd2hpY2ggc2l6ZW9mKCkgcmV0dXJucyBhbiBpbnQgZXZlbiB0aG91Z2gKKyAqIHNpemVfdCBpcyBkZWZpbmVkIGFzIGxvbmcgb3IgdW5zaWduZWQgbG9uZy4gIFRvIGVuc3VyZSBjb25zaXN0ZW50IHJlc3VsdHMKKyAqIHdlIGFsd2F5cyB1c2UgdGhpcyBTSVpFT0YoKSBtYWNybyBpbiBwbGFjZSBvZiB1c2luZyBzaXplb2YoKSBkaXJlY3RseS4KKyAqLworCisjZGVmaW5lIFNJWkVPRihvYmplY3QpCSgoc2l6ZV90KSBzaXplb2Yob2JqZWN0KSkKKworLyoKKyAqIFRoZSBtb2R1bGVzIHRoYXQgdXNlIGZyZWFkKCkgYW5kIGZ3cml0ZSgpIGFsd2F5cyBpbnZva2UgdGhlbSB0aHJvdWdoCisgKiB0aGVzZSBtYWNyb3MuICBPbiBzb21lIHN5c3RlbXMgeW91IG1heSBuZWVkIHRvIHR3aWRkbGUgdGhlIGFyZ3VtZW50IGNhc3RzLgorICogQ0FVVElPTjogYXJndW1lbnQgb3JkZXIgaXMgZGlmZmVyZW50IGZyb20gdW5kZXJseWluZyBmdW5jdGlvbnMhCisgKi8KKworI2RlZmluZSBKRlJFQUQoZmlsZSxidWYsc2l6ZW9mYnVmKSAgXAorICAoKHNpemVfdCkgRlhTWVNfZnJlYWQoKHZvaWQgKikgKGJ1ZiksIChzaXplX3QpIDEsIChzaXplX3QpIChzaXplb2ZidWYpLCAoZmlsZSkpKQorI2RlZmluZSBKRldSSVRFKGZpbGUsYnVmLHNpemVvZmJ1ZikgIFwKKyAgKChzaXplX3QpIEZYU1lTX2Z3cml0ZSgoY29uc3Qgdm9pZCAqKSAoYnVmKSwgKHNpemVfdCkgMSwgKHNpemVfdCkgKHNpemVvZmJ1ZiksIChmaWxlKSkpCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvam1lbXN5cy5oIGIvdGhpcmRfcGFydHkvbGlianBlZy9qbWVtc3lzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9qbWVtc3lzLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmpwZWcvam1lbXN5cy5oCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvam1vcmVjZmcuaCBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvam1vcmVjZmcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2ptb3JlY2ZnLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmpwZWcvam1vcmVjZmcuaApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL2pwZWdpbnQuaCBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvanBlZ2ludC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvanBlZ2ludC5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJqcGVnL2pwZWdpbnQuaApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9qcGVnbGliLmggYi90aGlyZF9wYXJ0eS9saWJqcGVnL2pwZWdsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmFmNGYyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlianBlZy9qcGVnbGliLmgKQEAgLTAsMCArMSwxMjAwIEBACisvKgorICoganBlZ2xpYi5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgYXBwbGljYXRpb24gaW50ZXJmYWNlIGZvciB0aGUgSlBFRyBsaWJyYXJ5LgorICogTW9zdCBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxpYnJhcnkgbmVlZCBvbmx5IGluY2x1ZGUgdGhpcyBmaWxlLAorICogYW5kIHBlcmhhcHMgamVycm9yLmggaWYgdGhleSB3YW50IHRvIGtub3cgdGhlIGV4YWN0IGVycm9yIGNvZGVzLgorICovCisKKyNpZm5kZWYgSlBFR0xJQl9ICisjZGVmaW5lIEpQRUdMSUJfSAorCisjZGVmaW5lIEZPWElUX1BSRUZJWChvcmlnTmFtZSkgIEZQREZBUElKUEVHXyMjb3JpZ05hbWUKKworI2RlZmluZSBqY29weV9ibG9ja19yb3cgRk9YSVRfUFJFRklYKGpjb3B5X2Jsb2NrX3JvdykKKyNkZWZpbmUgamNvcHlfc2FtcGxlX3Jvd3MgRk9YSVRfUFJFRklYKGpjb3B5X3NhbXBsZV9yb3dzKQorI2RlZmluZSBqZGl2X3JvdW5kX3VwIEZPWElUX1BSRUZJWChqZGl2X3JvdW5kX3VwKQorI2RlZmluZSBqaW5pdF8xcGFzc19xdWFudGl6ZXIgRk9YSVRfUFJFRklYKGppbml0XzFwYXNzX3F1YW50aXplcikKKyNkZWZpbmUgamluaXRfMnBhc3NfcXVhbnRpemVyIEZPWElUX1BSRUZJWChqaW5pdF8ycGFzc19xdWFudGl6ZXIpCisjZGVmaW5lIGppbml0X2NfY29lZl9jb250cm9sbGVyIEZPWElUX1BSRUZJWChqaW5pdF9jX2NvZWZfY29udHJvbGxlcikKKyNkZWZpbmUgamluaXRfY19tYWluX2NvbnRyb2xsZXIgRk9YSVRfUFJFRklYKGppbml0X2NfbWFpbl9jb250cm9sbGVyKQorI2RlZmluZSBqaW5pdF9jX21hc3Rlcl9jb250cm9sIEZPWElUX1BSRUZJWChqaW5pdF9jX21hc3Rlcl9jb250cm9sKQorI2RlZmluZSBqaW5pdF9jX3ByZXBfY29udHJvbGxlciBGT1hJVF9QUkVGSVgoamluaXRfY19wcmVwX2NvbnRyb2xsZXIpCisjZGVmaW5lIGppbml0X2NvbG9yX2NvbnZlcnRlciBGT1hJVF9QUkVGSVgoamluaXRfY29sb3JfY29udmVydGVyKQorI2RlZmluZSBqaW5pdF9jb2xvcl9kZWNvbnZlcnRlciBGT1hJVF9QUkVGSVgoamluaXRfY29sb3JfZGVjb252ZXJ0ZXIpCisjZGVmaW5lIGppbml0X2NvbXByZXNzX21hc3RlciBGT1hJVF9QUkVGSVgoamluaXRfY29tcHJlc3NfbWFzdGVyKQorI2RlZmluZSBqaW5pdF9kX2NvZWZfY29udHJvbGxlciBGT1hJVF9QUkVGSVgoamluaXRfZF9jb2VmX2NvbnRyb2xsZXIpCisjZGVmaW5lIGppbml0X2RfbWFpbl9jb250cm9sbGVyIEZPWElUX1BSRUZJWChqaW5pdF9kX21haW5fY29udHJvbGxlcikKKyNkZWZpbmUgamluaXRfZF9wb3N0X2NvbnRyb2xsZXIgRk9YSVRfUFJFRklYKGppbml0X2RfcG9zdF9jb250cm9sbGVyKQorI2RlZmluZSBqaW5pdF9kb3duc2FtcGxlciBGT1hJVF9QUkVGSVgoamluaXRfZG93bnNhbXBsZXIpCisjZGVmaW5lIGppbml0X2ZvcndhcmRfZGN0IEZPWElUX1BSRUZJWChqaW5pdF9mb3J3YXJkX2RjdCkKKyNkZWZpbmUgamluaXRfaHVmZl9kZWNvZGVyIEZPWElUX1BSRUZJWChqaW5pdF9odWZmX2RlY29kZXIpCisjZGVmaW5lIGppbml0X2h1ZmZfZW5jb2RlciBGT1hJVF9QUkVGSVgoamluaXRfaHVmZl9lbmNvZGVyKQorI2RlZmluZSBqaW5pdF9pbnB1dF9jb250cm9sbGVyIEZPWElUX1BSRUZJWChqaW5pdF9pbnB1dF9jb250cm9sbGVyKQorI2RlZmluZSBqaW5pdF9pbnZlcnNlX2RjdCBGT1hJVF9QUkVGSVgoamluaXRfaW52ZXJzZV9kY3QpCisjZGVmaW5lIGppbml0X21hcmtlcl9yZWFkZXIgRk9YSVRfUFJFRklYKGppbml0X21hcmtlcl9yZWFkZXIpCisjZGVmaW5lIGppbml0X21hcmtlcl93cml0ZXIgRk9YSVRfUFJFRklYKGppbml0X21hcmtlcl93cml0ZXIpCisjZGVmaW5lIGppbml0X21hc3Rlcl9kZWNvbXByZXNzIEZPWElUX1BSRUZJWChqaW5pdF9tYXN0ZXJfZGVjb21wcmVzcykKKyNkZWZpbmUgamluaXRfbWVtb3J5X21nciBGT1hJVF9QUkVGSVgoamluaXRfbWVtb3J5X21ncikKKyNkZWZpbmUgamluaXRfbWVyZ2VkX3Vwc2FtcGxlciBGT1hJVF9QUkVGSVgoamluaXRfbWVyZ2VkX3Vwc2FtcGxlcikKKyNkZWZpbmUgamluaXRfcGh1ZmZfZGVjb2RlciBGT1hJVF9QUkVGSVgoamluaXRfcGh1ZmZfZGVjb2RlcikKKyNkZWZpbmUgamluaXRfcGh1ZmZfZW5jb2RlciBGT1hJVF9QUkVGSVgoamluaXRfcGh1ZmZfZW5jb2RlcikKKyNkZWZpbmUgamluaXRfdXBzYW1wbGVyIEZPWElUX1BSRUZJWChqaW5pdF91cHNhbXBsZXIpCisjZGVmaW5lIGpwZWdfQ3JlYXRlQ29tcHJlc3MgRk9YSVRfUFJFRklYKGpwZWdfQ3JlYXRlQ29tcHJlc3MpCisjZGVmaW5lIGpwZWdfQ3JlYXRlRGVjb21wcmVzcyBGT1hJVF9QUkVGSVgoanBlZ19DcmVhdGVEZWNvbXByZXNzKQorI2RlZmluZSBqcGVnX2Fib3J0IEZPWElUX1BSRUZJWChqcGVnX2Fib3J0KQorI2RlZmluZSBqcGVnX2Fib3J0X2NvbXByZXNzIEZPWElUX1BSRUZJWChqcGVnX2Fib3J0X2NvbXByZXNzKQorI2RlZmluZSBqcGVnX2Fib3J0X2RlY29tcHJlc3MgRk9YSVRfUFJFRklYKGpwZWdfYWJvcnRfZGVjb21wcmVzcykKKyNkZWZpbmUganBlZ19hZGRfcXVhbnRfdGFibGUgRk9YSVRfUFJFRklYKGpwZWdfYWRkX3F1YW50X3RhYmxlKQorI2RlZmluZSBqcGVnX2FsbG9jX2h1ZmZfdGFibGUgRk9YSVRfUFJFRklYKGpwZWdfYWxsb2NfaHVmZl90YWJsZSkKKyNkZWZpbmUganBlZ19hbGxvY19xdWFudF90YWJsZSBGT1hJVF9QUkVGSVgoanBlZ19hbGxvY19xdWFudF90YWJsZSkKKyNkZWZpbmUganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zIEZPWElUX1BSRUZJWChqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMpCisjZGVmaW5lIGpwZWdfY29uc3VtZV9pbnB1dCBGT1hJVF9QUkVGSVgoanBlZ19jb25zdW1lX2lucHV0KQorI2RlZmluZSBqcGVnX2RlZmF1bHRfY29sb3JzcGFjZSBGT1hJVF9QUkVGSVgoanBlZ19kZWZhdWx0X2NvbG9yc3BhY2UpCisjZGVmaW5lIGpwZWdfZGVzdHJveSBGT1hJVF9QUkVGSVgoanBlZ19kZXN0cm95KQorI2RlZmluZSBqcGVnX2Rlc3Ryb3lfY29tcHJlc3MgRk9YSVRfUFJFRklYKGpwZWdfZGVzdHJveV9jb21wcmVzcykKKyNkZWZpbmUganBlZ19kZXN0cm95X2RlY29tcHJlc3MgRk9YSVRfUFJFRklYKGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKQorI2RlZmluZSBqcGVnX2ZkY3RfaWZhc3QgRk9YSVRfUFJFRklYKGpwZWdfZmRjdF9pZmFzdCkKKyNkZWZpbmUganBlZ19mZGN0X2lzbG93IEZPWElUX1BSRUZJWChqcGVnX2ZkY3RfaXNsb3cpCisjZGVmaW5lIGpwZWdfZmlsbF9iaXRfYnVmZmVyIEZPWElUX1BSRUZJWChqcGVnX2ZpbGxfYml0X2J1ZmZlcikKKyNkZWZpbmUganBlZ19maW5pc2hfY29tcHJlc3MgRk9YSVRfUFJFRklYKGpwZWdfZmluaXNoX2NvbXByZXNzKQorI2RlZmluZSBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzIEZPWElUX1BSRUZJWChqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKQorI2RlZmluZSBqcGVnX2ZpbmlzaF9vdXRwdXQgRk9YSVRfUFJFRklYKGpwZWdfZmluaXNoX291dHB1dCkKKyNkZWZpbmUganBlZ19mcmVlX2xhcmdlIEZPWElUX1BSRUZJWChqcGVnX2ZyZWVfbGFyZ2UpCisjZGVmaW5lIGpwZWdfZnJlZV9zbWFsbCBGT1hJVF9QUkVGSVgoanBlZ19mcmVlX3NtYWxsKQorI2RlZmluZSBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlIEZPWElUX1BSRUZJWChqcGVnX2dlbl9vcHRpbWFsX3RhYmxlKQorI2RlZmluZSBqcGVnX2dldF9sYXJnZSBGT1hJVF9QUkVGSVgoanBlZ19nZXRfbGFyZ2UpCisjZGVmaW5lIGpwZWdfZ2V0X3NtYWxsIEZPWElUX1BSRUZJWChqcGVnX2dldF9zbWFsbCkKKyNkZWZpbmUganBlZ19oYXNfbXVsdGlwbGVfc2NhbnMgRk9YSVRfUFJFRklYKGpwZWdfaGFzX211bHRpcGxlX3NjYW5zKQorI2RlZmluZSBqcGVnX2h1ZmZfZGVjb2RlIEZPWElUX1BSRUZJWChqcGVnX2h1ZmZfZGVjb2RlKQorI2RlZmluZSBqcGVnX2lkY3RfMXgxIEZPWElUX1BSRUZJWChqcGVnX2lkY3RfMXgxKQorI2RlZmluZSBqcGVnX2lkY3RfMngyIEZPWElUX1BSRUZJWChqcGVnX2lkY3RfMngyKQorI2RlZmluZSBqcGVnX2lkY3RfNHg0IEZPWElUX1BSRUZJWChqcGVnX2lkY3RfNHg0KQorI2RlZmluZSBqcGVnX2lkY3RfZmxvYXQgRk9YSVRfUFJFRklYKGpwZWdfaWRjdF9mbG9hdCkKKyNkZWZpbmUganBlZ19pZGN0X2lmYXN0IEZPWElUX1BSRUZJWChqcGVnX2lkY3RfaWZhc3QpCisjZGVmaW5lIGpwZWdfaWRjdF9pc2xvdyBGT1hJVF9QUkVGSVgoanBlZ19pZGN0X2lzbG93KQorI2RlZmluZSBqcGVnX2lucHV0X2NvbXBsZXRlIEZPWElUX1BSRUZJWChqcGVnX2lucHV0X2NvbXBsZXRlKQorI2RlZmluZSBqcGVnX21ha2VfY19kZXJpdmVkX3RibCBGT1hJVF9QUkVGSVgoanBlZ19tYWtlX2NfZGVyaXZlZF90YmwpCisjZGVmaW5lIGpwZWdfbWFrZV9kX2Rlcml2ZWRfdGJsIEZPWElUX1BSRUZJWChqcGVnX21ha2VfZF9kZXJpdmVkX3RibCkKKyNkZWZpbmUganBlZ19tZW1fYXZhaWxhYmxlIEZPWElUX1BSRUZJWChqcGVnX21lbV9hdmFpbGFibGUpCisjZGVmaW5lIGpwZWdfbWVtX2luaXQgRk9YSVRfUFJFRklYKGpwZWdfbWVtX2luaXQpCisjZGVmaW5lIGpwZWdfbWVtX3Rlcm0gRk9YSVRfUFJFRklYKGpwZWdfbWVtX3Rlcm0pCisjZGVmaW5lIGpwZWdfbmF0dXJhbF9vcmRlciBGT1hJVF9QUkVGSVgoanBlZ19uYXR1cmFsX29yZGVyKQorI2RlZmluZSBqcGVnX25ld19jb2xvcm1hcCBGT1hJVF9QUkVGSVgoanBlZ19uZXdfY29sb3JtYXApCisjZGVmaW5lIGpwZWdfb3Blbl9iYWNraW5nX3N0b3JlIEZPWElUX1BSRUZJWChqcGVnX29wZW5fYmFja2luZ19zdG9yZSkKKyNkZWZpbmUganBlZ19xdWFsaXR5X3NjYWxpbmcgRk9YSVRfUFJFRklYKGpwZWdfcXVhbGl0eV9zY2FsaW5nKQorI2RlZmluZSBqcGVnX3JlYWRfY29lZmZpY2llbnRzIEZPWElUX1BSRUZJWChqcGVnX3JlYWRfY29lZmZpY2llbnRzKQorI2RlZmluZSBqcGVnX3JlYWRfaGVhZGVyIEZPWElUX1BSRUZJWChqcGVnX3JlYWRfaGVhZGVyKQorI2RlZmluZSBqcGVnX3JlYWRfcmF3X2RhdGEgRk9YSVRfUFJFRklYKGpwZWdfcmVhZF9yYXdfZGF0YSkKKyNkZWZpbmUganBlZ19yZWFkX3NjYW5saW5lcyBGT1hJVF9QUkVGSVgoanBlZ19yZWFkX3NjYW5saW5lcykKKyNkZWZpbmUganBlZ19yZXN5bmNfdG9fcmVzdGFydCBGT1hJVF9QUkVGSVgoanBlZ19yZXN5bmNfdG9fcmVzdGFydCkKKyNkZWZpbmUganBlZ19zYXZlX21hcmtlcnMgRk9YSVRfUFJFRklYKGpwZWdfc2F2ZV9tYXJrZXJzKQorI2RlZmluZSBqcGVnX3NldF9jb2xvcnNwYWNlIEZPWElUX1BSRUZJWChqcGVnX3NldF9jb2xvcnNwYWNlKQorI2RlZmluZSBqcGVnX3NldF9kZWZhdWx0cyBGT1hJVF9QUkVGSVgoanBlZ19zZXRfZGVmYXVsdHMpCisjZGVmaW5lIGpwZWdfc2V0X2xpbmVhcl9xdWFsaXR5IEZPWElUX1BSRUZJWChqcGVnX3NldF9saW5lYXJfcXVhbGl0eSkKKyNkZWZpbmUganBlZ19zZXRfbWFya2VyX3Byb2Nlc3NvciBGT1hJVF9QUkVGSVgoanBlZ19zZXRfbWFya2VyX3Byb2Nlc3NvcikKKyNkZWZpbmUganBlZ19zZXRfcXVhbGl0eSBGT1hJVF9QUkVGSVgoanBlZ19zZXRfcXVhbGl0eSkKKyNkZWZpbmUganBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24gRk9YSVRfUFJFRklYKGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uKQorI2RlZmluZSBqcGVnX3N0YXJ0X2NvbXByZXNzIEZPWElUX1BSRUZJWChqcGVnX3N0YXJ0X2NvbXByZXNzKQorI2RlZmluZSBqcGVnX3N0YXJ0X2RlY29tcHJlc3MgRk9YSVRfUFJFRklYKGpwZWdfc3RhcnRfZGVjb21wcmVzcykKKyNkZWZpbmUganBlZ19zdGFydF9vdXRwdXQgRk9YSVRfUFJFRklYKGpwZWdfc3RhcnRfb3V0cHV0KQorI2RlZmluZSBqcGVnX3N0ZF9lcnJvciBGT1hJVF9QUkVGSVgoanBlZ19zdGRfZXJyb3IpCisjZGVmaW5lIGpwZWdfc3RkX21lc3NhZ2VfdGFibGUgRk9YSVRfUFJFRklYKGpwZWdfc3RkX21lc3NhZ2VfdGFibGUpCisjZGVmaW5lIGpwZWdfc3RkaW9fc3JjIEZPWElUX1BSRUZJWChqcGVnX3N0ZGlvX3NyYykKKyNkZWZpbmUganBlZ19zdXBwcmVzc190YWJsZXMgRk9YSVRfUFJFRklYKGpwZWdfc3VwcHJlc3NfdGFibGVzKQorI2RlZmluZSBqcGVnX3dyaXRlX21fYnl0ZSBGT1hJVF9QUkVGSVgoanBlZ193cml0ZV9tX2J5dGUpCisjZGVmaW5lIGpwZWdfd3JpdGVfbV9oZWFkZXIgRk9YSVRfUFJFRklYKGpwZWdfd3JpdGVfbV9oZWFkZXIpCisjZGVmaW5lIGpwZWdfd3JpdGVfbWFya2VyIEZPWElUX1BSRUZJWChqcGVnX3dyaXRlX21hcmtlcikKKyNkZWZpbmUganBlZ193cml0ZV9yYXdfZGF0YSBGT1hJVF9QUkVGSVgoanBlZ193cml0ZV9yYXdfZGF0YSkKKyNkZWZpbmUganBlZ193cml0ZV9zY2FubGluZXMgRk9YSVRfUFJFRklYKGpwZWdfd3JpdGVfc2NhbmxpbmVzKQorI2RlZmluZSBqcGVnX3dyaXRlX3RhYmxlcyBGT1hJVF9QUkVGSVgoanBlZ193cml0ZV90YWJsZXMpCisjZGVmaW5lIGpyb3VuZF91cCBGT1hJVF9QUkVGSVgoanJvdW5kX3VwKQorI2RlZmluZSBqemVyb19mYXIgRk9YSVRfUFJFRklYKGp6ZXJvX2ZhcikKKworIC8qCisgKiBGaXJzdCB3ZSBpbmNsdWRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIHRoYXQgcmVjb3JkIGhvdyB0aGlzCisgKiBpbnN0YWxsYXRpb24gb2YgdGhlIEpQRUcgbGlicmFyeSBpcyBzZXQgdXAuICBqY29uZmlnLmggY2FuIGJlCisgKiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmb3IgbWFueSBzeXN0ZW1zLiAgam1vcmVjZmcuaCBjb250YWlucworICogbWFudWFsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IG1vc3QgcGVvcGxlIG5lZWQgbm90IHdvcnJ5IGFib3V0LgorICovCisKKyNpZm5kZWYgSkNPTkZJR19JTkNMVURFRAkvKiBpbiBjYXNlIGppbmNsdWRlLmggYWxyZWFkeSBkaWQgKi8KKyNpbmNsdWRlICJqY29uZmlnLmgiCQkvKiB3aWRlbHkgdXNlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KKyNlbmRpZgorI2luY2x1ZGUgImptb3JlY2ZnLmgiCQkvKiBzZWxkb20gY2hhbmdlZCBvcHRpb25zICovCisKKworLyogVmVyc2lvbiBJRCBmb3IgdGhlIEpQRUcgbGlicmFyeS4KKyAqIE1pZ2h0IGJlIHVzZWZ1bCBmb3IgdGVzdHMgbGlrZSAiI2lmIEpQRUdfTElCX1ZFUlNJT04gPj0gNjAiLgorICovCisKKyNkZWZpbmUgSlBFR19MSUJfVkVSU0lPTiAgNjIJLyogVmVyc2lvbiA2YiAqLworCisKKy8qIFZhcmlvdXMgY29uc3RhbnRzIGRldGVybWluaW5nIHRoZSBzaXplcyBvZiB0aGluZ3MuCisgKiBBbGwgb2YgdGhlc2UgYXJlIHNwZWNpZmllZCBieSB0aGUgSlBFRyBzdGFuZGFyZCwgc28gZG9uJ3QgY2hhbmdlIHRoZW0KKyAqIGlmIHlvdSB3YW50IHRvIGJlIGNvbXBhdGlibGUuCisgKi8KKworI2RlZmluZSBEQ1RTSVpFCQkgICAgOAkvKiBUaGUgYmFzaWMgRENUIGJsb2NrIGlzIDh4OCBzYW1wbGVzICovCisjZGVmaW5lIERDVFNJWkUyCSAgICA2NAkvKiBEQ1RTSVpFIHNxdWFyZWQ7ICMgb2YgZWxlbWVudHMgaW4gYSBibG9jayAqLworI2RlZmluZSBOVU1fUVVBTlRfVEJMUyAgICAgIDQJLyogUXVhbnRpemF0aW9uIHRhYmxlcyBhcmUgbnVtYmVyZWQgMC4uMyAqLworI2RlZmluZSBOVU1fSFVGRl9UQkxTICAgICAgIDQJLyogSHVmZm1hbiB0YWJsZXMgYXJlIG51bWJlcmVkIDAuLjMgKi8KKyNkZWZpbmUgTlVNX0FSSVRIX1RCTFMgICAgICAxNgkvKiBBcml0aC1jb2RpbmcgdGFibGVzIGFyZSBudW1iZXJlZCAwLi4xNSAqLworI2RlZmluZSBNQVhfQ09NUFNfSU5fU0NBTiAgIDQJLyogSlBFRyBsaW1pdCBvbiAjIG9mIGNvbXBvbmVudHMgaW4gb25lIHNjYW4gKi8KKyNkZWZpbmUgTUFYX1NBTVBfRkFDVE9SICAgICA0CS8qIEpQRUcgbGltaXQgb24gc2FtcGxpbmcgZmFjdG9ycyAqLworLyogVW5mb3J0dW5hdGVseSwgc29tZSBib3pvIGF0IEFkb2JlIHNhdyBubyByZWFzb24gdG8gYmUgYm91bmQgYnkgdGhlIHN0YW5kYXJkOworICogdGhlIFBvc3RTY3JpcHQgRENUIGZpbHRlciBjYW4gZW1pdCBmaWxlcyB3aXRoIG1hbnkgbW9yZSB0aGFuIDEwIGJsb2Nrcy9NQ1UuCisgKiBJZiB5b3UgaGFwcGVuIHRvIHJ1biBhY3Jvc3Mgc3VjaCBhIGZpbGUsIHlvdSBjYW4gdXAgRF9NQVhfQkxPQ0tTX0lOX01DVQorICogdG8gaGFuZGxlIGl0LiAgV2UgZXZlbiBsZXQgeW91IGRvIHRoaXMgZnJvbSB0aGUgamNvbmZpZy5oIGZpbGUuICBIb3dldmVyLAorICogd2Ugc3Ryb25nbHkgZGlzY291cmFnZSBjaGFuZ2luZyBDX01BWF9CTE9DS1NfSU5fTUNVOyBqdXN0IGJlY2F1c2UgQWRvYmUKKyAqIHNvbWV0aW1lcyBlbWl0cyBub25jb21wbGlhbnQgZmlsZXMgZG9lc24ndCBtZWFuIHlvdSBzaG91bGQgdG9vLgorICovCisjZGVmaW5lIENfTUFYX0JMT0NLU19JTl9NQ1UgICAxMCAvKiBjb21wcmVzc29yJ3MgbGltaXQgb24gYmxvY2tzIHBlciBNQ1UgKi8KKyNpZm5kZWYgRF9NQVhfQkxPQ0tTX0lOX01DVQorI2RlZmluZSBEX01BWF9CTE9DS1NfSU5fTUNVICAgMTAgLyogZGVjb21wcmVzc29yJ3MgbGltaXQgb24gYmxvY2tzIHBlciBNQ1UgKi8KKyNlbmRpZgorCisKKy8qIERhdGEgc3RydWN0dXJlcyBmb3IgaW1hZ2VzIChhcnJheXMgb2Ygc2FtcGxlcyBhbmQgb2YgRENUIGNvZWZmaWNpZW50cykuCisgKiBPbiA4MHg4NiBtYWNoaW5lcywgdGhlIGltYWdlIGFycmF5cyBhcmUgdG9vIGJpZyBmb3IgbmVhciBwb2ludGVycywKKyAqIGJ1dCB0aGUgcG9pbnRlciBhcnJheXMgY2FuIGZpdCBpbiBuZWFyIG1lbW9yeS4KKyAqLworCit0eXBlZGVmIEpTQU1QTEUgICpKU0FNUFJPVzsJLyogcHRyIHRvIG9uZSBpbWFnZSByb3cgb2YgcGl4ZWwgc2FtcGxlcy4gKi8KK3R5cGVkZWYgSlNBTVBST1cgKkpTQU1QQVJSQVk7CS8qIHB0ciB0byBzb21lIHJvd3MgKGEgMi1EIHNhbXBsZSBhcnJheSkgKi8KK3R5cGVkZWYgSlNBTVBBUlJBWSAqSlNBTVBJTUFHRTsJLyogYSAzLUQgc2FtcGxlIGFycmF5OiB0b3AgaW5kZXggaXMgY29sb3IgKi8KKwordHlwZWRlZiBKQ09FRiBKQkxPQ0tbRENUU0laRTJdOwkvKiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzICovCit0eXBlZGVmIEpCTE9DSyAgKkpCTE9DS1JPVzsJLyogcG9pbnRlciB0byBvbmUgcm93IG9mIGNvZWZmaWNpZW50IGJsb2NrcyAqLwordHlwZWRlZiBKQkxPQ0tST1cgKkpCTE9DS0FSUkFZOwkJLyogYSAyLUQgYXJyYXkgb2YgY29lZmZpY2llbnQgYmxvY2tzICovCit0eXBlZGVmIEpCTE9DS0FSUkFZICpKQkxPQ0tJTUFHRTsJLyogYSAzLUQgYXJyYXkgb2YgY29lZmZpY2llbnQgYmxvY2tzICovCisKK3R5cGVkZWYgSkNPRUYgICpKQ09FRlBUUjsJLyogdXNlZnVsIGluIGEgY291cGxlIG9mIHBsYWNlcyAqLworCisKKy8qIFR5cGVzIGZvciBKUEVHIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYW5kIHdvcmtpbmcgdGFibGVzLiAqLworCisKKy8qIERDVCBjb2VmZmljaWVudCBxdWFudGl6YXRpb24gdGFibGVzLiAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIFRoaXMgYXJyYXkgZ2l2ZXMgdGhlIGNvZWZmaWNpZW50IHF1YW50aXplcnMgaW4gbmF0dXJhbCBhcnJheSBvcmRlcgorICAgKiAobm90IHRoZSB6aWd6YWcgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgc3RvcmVkIGluIGEgSlBFRyBEUVQgbWFya2VyKS4KKyAgICogQ0FVVElPTjogSUpHIHZlcnNpb25zIHByaW9yIHRvIHY2YSBrZXB0IHRoaXMgYXJyYXkgaW4gemlnemFnIG9yZGVyLgorICAgKi8KKyAgVUlOVDE2IHF1YW50dmFsW0RDVFNJWkUyXTsJLyogcXVhbnRpemF0aW9uIHN0ZXAgZm9yIGVhY2ggY29lZmZpY2llbnQgKi8KKyAgLyogVGhpcyBmaWVsZCBpcyB1c2VkIG9ubHkgZHVyaW5nIGNvbXByZXNzaW9uLiAgSXQncyBpbml0aWFsaXplZCBGQUxTRSB3aGVuCisgICAqIHRoZSB0YWJsZSBpcyBjcmVhdGVkLCBhbmQgc2V0IFRSVUUgd2hlbiBpdCdzIGJlZW4gb3V0cHV0IHRvIHRoZSBmaWxlLgorICAgKiBZb3UgY291bGQgc3VwcHJlc3Mgb3V0cHV0IG9mIGEgdGFibGUgYnkgc2V0dGluZyB0aGlzIHRvIFRSVUUuCisgICAqIChTZWUganBlZ19zdXBwcmVzc190YWJsZXMgZm9yIGFuIGV4YW1wbGUuKQorICAgKi8KKyAgYm9vbGVhbiBzZW50X3RhYmxlOwkJLyogVFJVRSB3aGVuIHRhYmxlIGhhcyBiZWVuIG91dHB1dCAqLworfSBKUVVBTlRfVEJMOworCisKKy8qIEh1ZmZtYW4gY29kaW5nIHRhYmxlcy4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiBUaGVzZSB0d28gZmllbGRzIGRpcmVjdGx5IHJlcHJlc2VudCB0aGUgY29udGVudHMgb2YgYSBKUEVHIERIVCBtYXJrZXIgKi8KKyAgVUlOVDggYml0c1sxN107CQkvKiBiaXRzW2tdID0gIyBvZiBzeW1ib2xzIHdpdGggY29kZXMgb2YgKi8KKwkJCQkvKiBsZW5ndGggayBiaXRzOyBiaXRzWzBdIGlzIHVudXNlZCAqLworICBVSU5UOCBodWZmdmFsWzI1Nl07CQkvKiBUaGUgc3ltYm9scywgaW4gb3JkZXIgb2YgaW5jciBjb2RlIGxlbmd0aCAqLworICAvKiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBkdXJpbmcgY29tcHJlc3Npb24uICBJdCdzIGluaXRpYWxpemVkIEZBTFNFIHdoZW4KKyAgICogdGhlIHRhYmxlIGlzIGNyZWF0ZWQsIGFuZCBzZXQgVFJVRSB3aGVuIGl0J3MgYmVlbiBvdXRwdXQgdG8gdGhlIGZpbGUuCisgICAqIFlvdSBjb3VsZCBzdXBwcmVzcyBvdXRwdXQgb2YgYSB0YWJsZSBieSBzZXR0aW5nIHRoaXMgdG8gVFJVRS4KKyAgICogKFNlZSBqcGVnX3N1cHByZXNzX3RhYmxlcyBmb3IgYW4gZXhhbXBsZS4pCisgICAqLworICBib29sZWFuIHNlbnRfdGFibGU7CQkvKiBUUlVFIHdoZW4gdGFibGUgaGFzIGJlZW4gb3V0cHV0ICovCit9IEpIVUZGX1RCTDsKKworCisvKiBCYXNpYyBpbmZvIGFib3V0IG9uZSBjb21wb25lbnQgKGNvbG9yIGNoYW5uZWwpLiAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIFRoZXNlIHZhbHVlcyBhcmUgZml4ZWQgb3ZlciB0aGUgd2hvbGUgaW1hZ2UuICovCisgIC8qIEZvciBjb21wcmVzc2lvbiwgdGhleSBtdXN0IGJlIHN1cHBsaWVkIGJ5IHBhcmFtZXRlciBzZXR1cDsgKi8KKyAgLyogZm9yIGRlY29tcHJlc3Npb24sIHRoZXkgYXJlIHJlYWQgZnJvbSB0aGUgU09GIG1hcmtlci4gKi8KKyAgaW50IGNvbXBvbmVudF9pZDsJCS8qIGlkZW50aWZpZXIgZm9yIHRoaXMgY29tcG9uZW50ICgwLi4yNTUpICovCisgIGludCBjb21wb25lbnRfaW5kZXg7CQkvKiBpdHMgaW5kZXggaW4gU09GIG9yIGNpbmZvLT5jb21wX2luZm9bXSAqLworICBpbnQgaF9zYW1wX2ZhY3RvcjsJCS8qIGhvcml6b250YWwgc2FtcGxpbmcgZmFjdG9yICgxLi40KSAqLworICBpbnQgdl9zYW1wX2ZhY3RvcjsJCS8qIHZlcnRpY2FsIHNhbXBsaW5nIGZhY3RvciAoMS4uNCkgKi8KKyAgaW50IHF1YW50X3RibF9ubzsJCS8qIHF1YW50aXphdGlvbiB0YWJsZSBzZWxlY3RvciAoMC4uMykgKi8KKyAgLyogVGhlc2UgdmFsdWVzIG1heSB2YXJ5IGJldHdlZW4gc2NhbnMuICovCisgIC8qIEZvciBjb21wcmVzc2lvbiwgdGhleSBtdXN0IGJlIHN1cHBsaWVkIGJ5IHBhcmFtZXRlciBzZXR1cDsgKi8KKyAgLyogZm9yIGRlY29tcHJlc3Npb24sIHRoZXkgYXJlIHJlYWQgZnJvbSB0aGUgU09TIG1hcmtlci4gKi8KKyAgLyogVGhlIGRlY29tcHJlc3NvciBvdXRwdXQgc2lkZSBtYXkgbm90IHVzZSB0aGVzZSB2YXJpYWJsZXMuICovCisgIGludCBkY190Ymxfbm87CQkvKiBEQyBlbnRyb3B5IHRhYmxlIHNlbGVjdG9yICgwLi4zKSAqLworICBpbnQgYWNfdGJsX25vOwkJLyogQUMgZW50cm9weSB0YWJsZSBzZWxlY3RvciAoMC4uMykgKi8KKyAgCisgIC8qIFJlbWFpbmluZyBmaWVsZHMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgcHJpdmF0ZSBieSBhcHBsaWNhdGlvbnMuICovCisgIAorICAvKiBUaGVzZSB2YWx1ZXMgYXJlIGNvbXB1dGVkIGR1cmluZyBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIHN0YXJ0dXA6ICovCisgIC8qIENvbXBvbmVudCdzIHNpemUgaW4gRENUIGJsb2Nrcy4KKyAgICogQW55IGR1bW15IGJsb2NrcyBhZGRlZCB0byBjb21wbGV0ZSBhbiBNQ1UgYXJlIG5vdCBjb3VudGVkOyB0aGVyZWZvcmUKKyAgICogdGhlc2UgdmFsdWVzIGRvIG5vdCBkZXBlbmQgb24gd2hldGhlciBhIHNjYW4gaXMgaW50ZXJsZWF2ZWQgb3Igbm90LgorICAgKi8KKyAgSkRJTUVOU0lPTiB3aWR0aF9pbl9ibG9ja3M7CisgIEpESU1FTlNJT04gaGVpZ2h0X2luX2Jsb2NrczsKKyAgLyogU2l6ZSBvZiBhIERDVCBibG9jayBpbiBzYW1wbGVzLiAgQWx3YXlzIERDVFNJWkUgZm9yIGNvbXByZXNzaW9uLgorICAgKiBGb3IgZGVjb21wcmVzc2lvbiB0aGlzIGlzIHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgZnJvbSBvbmUgRENUIGJsb2NrLAorICAgKiByZWZsZWN0aW5nIGFueSBzY2FsaW5nIHdlIGNob29zZSB0byBhcHBseSBkdXJpbmcgdGhlIElEQ1Qgc3RlcC4KKyAgICogVmFsdWVzIG9mIDEsMiw0LDggYXJlIGxpa2VseSB0byBiZSBzdXBwb3J0ZWQuICBOb3RlIHRoYXQgZGlmZmVyZW50CisgICAqIGNvbXBvbmVudHMgbWF5IHJlY2VpdmUgZGlmZmVyZW50IElEQ1Qgc2NhbGluZ3MuCisgICAqLworICBpbnQgRENUX3NjYWxlZF9zaXplOworICAvKiBUaGUgZG93bnNhbXBsZWQgZGltZW5zaW9ucyBhcmUgdGhlIGNvbXBvbmVudCdzIGFjdHVhbCwgdW5wYWRkZWQgbnVtYmVyCisgICAqIG9mIHNhbXBsZXMgYXQgdGhlIG1haW4gYnVmZmVyIChwcmVwcm9jZXNzaW5nL2NvbXByZXNzaW9uIGludGVyZmFjZSksIHRodXMKKyAgICogZG93bnNhbXBsZWRfd2lkdGggPSBjZWlsKGltYWdlX3dpZHRoICogSGkvSG1heCkKKyAgICogYW5kIHNpbWlsYXJseSBmb3IgaGVpZ2h0LiAgRm9yIGRlY29tcHJlc3Npb24sIElEQ1Qgc2NhbGluZyBpcyBpbmNsdWRlZCwgc28KKyAgICogZG93bnNhbXBsZWRfd2lkdGggPSBjZWlsKGltYWdlX3dpZHRoICogSGkvSG1heCAqIERDVF9zY2FsZWRfc2l6ZS9EQ1RTSVpFKQorICAgKi8KKyAgSkRJTUVOU0lPTiBkb3duc2FtcGxlZF93aWR0aDsJIC8qIGFjdHVhbCB3aWR0aCBpbiBzYW1wbGVzICovCisgIEpESU1FTlNJT04gZG93bnNhbXBsZWRfaGVpZ2h0OyAvKiBhY3R1YWwgaGVpZ2h0IGluIHNhbXBsZXMgKi8KKyAgLyogVGhpcyBmbGFnIGlzIHVzZWQgb25seSBmb3IgZGVjb21wcmVzc2lvbi4gIEluIGNhc2VzIHdoZXJlIHNvbWUgb2YgdGhlCisgICAqIGNvbXBvbmVudHMgd2lsbCBiZSBpZ25vcmVkIChlZyBncmF5c2NhbGUgb3V0cHV0IGZyb20gWUNiQ3IgaW1hZ2UpLAorICAgKiB3ZSBjYW4gc2tpcCBtb3N0IGNvbXB1dGF0aW9ucyBmb3IgdGhlIHVudXNlZCBjb21wb25lbnRzLgorICAgKi8KKyAgYm9vbGVhbiBjb21wb25lbnRfbmVlZGVkOwkvKiBkbyB3ZSBuZWVkIHRoZSB2YWx1ZSBvZiB0aGlzIGNvbXBvbmVudD8gKi8KKworICAvKiBUaGVzZSB2YWx1ZXMgYXJlIGNvbXB1dGVkIGJlZm9yZSBzdGFydGluZyBhIHNjYW4gb2YgdGhlIGNvbXBvbmVudC4gKi8KKyAgLyogVGhlIGRlY29tcHJlc3NvciBvdXRwdXQgc2lkZSBtYXkgbm90IHVzZSB0aGVzZSB2YXJpYWJsZXMuICovCisgIGludCBNQ1Vfd2lkdGg7CQkvKiBudW1iZXIgb2YgYmxvY2tzIHBlciBNQ1UsIGhvcml6b250YWxseSAqLworICBpbnQgTUNVX2hlaWdodDsJCS8qIG51bWJlciBvZiBibG9ja3MgcGVyIE1DVSwgdmVydGljYWxseSAqLworICBpbnQgTUNVX2Jsb2NrczsJCS8qIE1DVV93aWR0aCAqIE1DVV9oZWlnaHQgKi8KKyAgaW50IE1DVV9zYW1wbGVfd2lkdGg7CQkvKiBNQ1Ugd2lkdGggaW4gc2FtcGxlcywgTUNVX3dpZHRoKkRDVF9zY2FsZWRfc2l6ZSAqLworICBpbnQgbGFzdF9jb2xfd2lkdGg7CQkvKiAjIG9mIG5vbi1kdW1teSBibG9ja3MgYWNyb3NzIGluIGxhc3QgTUNVICovCisgIGludCBsYXN0X3Jvd19oZWlnaHQ7CQkvKiAjIG9mIG5vbi1kdW1teSBibG9ja3MgZG93biBpbiBsYXN0IE1DVSAqLworCisgIC8qIFNhdmVkIHF1YW50aXphdGlvbiB0YWJsZSBmb3IgY29tcG9uZW50OyBOVUxMIGlmIG5vbmUgeWV0IHNhdmVkLgorICAgKiBTZWUgamRpbnB1dC5jIGNvbW1lbnRzIGFib3V0IHRoZSBuZWVkIGZvciB0aGlzIGluZm9ybWF0aW9uLgorICAgKiBUaGlzIGZpZWxkIGlzIGN1cnJlbnRseSB1c2VkIG9ubHkgZm9yIGRlY29tcHJlc3Npb24uCisgICAqLworICBKUVVBTlRfVEJMICogcXVhbnRfdGFibGU7CisKKyAgLyogUHJpdmF0ZSBwZXItY29tcG9uZW50IHN0b3JhZ2UgZm9yIERDVCBvciBJRENUIHN1YnN5c3RlbS4gKi8KKyAgdm9pZCAqIGRjdF90YWJsZTsKK30ganBlZ19jb21wb25lbnRfaW5mbzsKKworCisvKiBUaGUgc2NyaXB0IGZvciBlbmNvZGluZyBhIG11bHRpcGxlLXNjYW4gZmlsZSBpcyBhbiBhcnJheSBvZiB0aGVzZTogKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgY29tcHNfaW5fc2NhbjsJCS8qIG51bWJlciBvZiBjb21wb25lbnRzIGVuY29kZWQgaW4gdGhpcyBzY2FuICovCisgIGludCBjb21wb25lbnRfaW5kZXhbTUFYX0NPTVBTX0lOX1NDQU5dOyAvKiB0aGVpciBTT0YvY29tcF9pbmZvW10gaW5kZXhlcyAqLworICBpbnQgU3MsIFNlOwkJCS8qIHByb2dyZXNzaXZlIEpQRUcgc3BlY3RyYWwgc2VsZWN0aW9uIHBhcm1zICovCisgIGludCBBaCwgQWw7CQkJLyogcHJvZ3Jlc3NpdmUgSlBFRyBzdWNjZXNzaXZlIGFwcHJveC4gcGFybXMgKi8KK30ganBlZ19zY2FuX2luZm87CisKKy8qIFRoZSBkZWNvbXByZXNzb3IgY2FuIHNhdmUgQVBQbiBhbmQgQ09NIG1hcmtlcnMgaW4gYSBsaXN0IG9mIHRoZXNlOiAqLworCit0eXBlZGVmIHN0cnVjdCBqcGVnX21hcmtlcl9zdHJ1Y3QgICoganBlZ19zYXZlZF9tYXJrZXJfcHRyOworCitzdHJ1Y3QganBlZ19tYXJrZXJfc3RydWN0IHsKKyAganBlZ19zYXZlZF9tYXJrZXJfcHRyIG5leHQ7CS8qIG5leHQgaW4gbGlzdCwgb3IgTlVMTCAqLworICBVSU5UOCBtYXJrZXI7CQkJLyogbWFya2VyIGNvZGU6IEpQRUdfQ09NLCBvciBKUEVHX0FQUDArbiAqLworICB1bnNpZ25lZCBpbnQgb3JpZ2luYWxfbGVuZ3RoOwkvKiAjIGJ5dGVzIG9mIGRhdGEgaW4gdGhlIGZpbGUgKi8KKyAgdW5zaWduZWQgaW50IGRhdGFfbGVuZ3RoOwkvKiAjIGJ5dGVzIG9mIGRhdGEgc2F2ZWQgYXQgZGF0YVtdICovCisgIEpPQ1RFVCAgKiBkYXRhOwkJLyogdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBtYXJrZXIgKi8KKyAgLyogdGhlIG1hcmtlciBsZW5ndGggd29yZCBpcyBub3QgY291bnRlZCBpbiBkYXRhX2xlbmd0aCBvciBvcmlnaW5hbF9sZW5ndGggKi8KK307CisKKy8qIEtub3duIGNvbG9yIHNwYWNlcy4gKi8KKwordHlwZWRlZiBlbnVtIHsKKwlKQ1NfVU5LTk9XTiwJCS8qIGVycm9yL3Vuc3BlY2lmaWVkICovCisJSkNTX0dSQVlTQ0FMRSwJCS8qIG1vbm9jaHJvbWUgKi8KKwlKQ1NfUkdCLAkJLyogcmVkL2dyZWVuL2JsdWUgKi8KKwlKQ1NfWUNiQ3IsCQkvKiBZL0NiL0NyIChhbHNvIGtub3duIGFzIFlVVikgKi8KKwlKQ1NfQ01ZSywJCS8qIEMvTS9ZL0sgKi8KKwlKQ1NfWUNDSwkJLyogWS9DYi9Dci9LICovCit9IEpfQ09MT1JfU1BBQ0U7CisKKy8qIERDVC9JRENUIGFsZ29yaXRobSBvcHRpb25zLiAqLworCit0eXBlZGVmIGVudW0geworCUpEQ1RfSVNMT1csCQkvKiBzbG93IGJ1dCBhY2N1cmF0ZSBpbnRlZ2VyIGFsZ29yaXRobSAqLworCUpEQ1RfSUZBU1QsCQkvKiBmYXN0ZXIsIGxlc3MgYWNjdXJhdGUgaW50ZWdlciBtZXRob2QgKi8KKwlKRENUX0ZMT0FUCQkvKiBmbG9hdGluZy1wb2ludDogYWNjdXJhdGUsIGZhc3Qgb24gZmFzdCBIVyAqLworfSBKX0RDVF9NRVRIT0Q7CisKKyNpZm5kZWYgSkRDVF9ERUZBVUxUCQkvKiBtYXkgYmUgb3ZlcnJpZGRlbiBpbiBqY29uZmlnLmggKi8KKyNkZWZpbmUgSkRDVF9ERUZBVUxUICBKRENUX0lTTE9XCisjZW5kaWYKKyNpZm5kZWYgSkRDVF9GQVNURVNUCQkvKiBtYXkgYmUgb3ZlcnJpZGRlbiBpbiBqY29uZmlnLmggKi8KKyNkZWZpbmUgSkRDVF9GQVNURVNUICBKRENUX0lGQVNUCisjZW5kaWYKKworLyogRGl0aGVyaW5nIG9wdGlvbnMgZm9yIGRlY29tcHJlc3Npb24uICovCisKK3R5cGVkZWYgZW51bSB7CisJSkRJVEhFUl9OT05FLAkJLyogbm8gZGl0aGVyaW5nICovCisJSkRJVEhFUl9PUkRFUkVELAkvKiBzaW1wbGUgb3JkZXJlZCBkaXRoZXIgKi8KKwlKRElUSEVSX0ZTCQkvKiBGbG95ZC1TdGVpbmJlcmcgZXJyb3IgZGlmZnVzaW9uIGRpdGhlciAqLworfSBKX0RJVEhFUl9NT0RFOworCisKKy8qIENvbW1vbiBmaWVsZHMgYmV0d2VlbiBKUEVHIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIG1hc3RlciBzdHJ1Y3RzLiAqLworCisjZGVmaW5lIGpwZWdfY29tbW9uX2ZpZWxkcyBcCisgIHN0cnVjdCBqcGVnX2Vycm9yX21nciAqIGVycjsJLyogRXJyb3IgaGFuZGxlciBtb2R1bGUgKi9cCisgIHN0cnVjdCBqcGVnX21lbW9yeV9tZ3IgKiBtZW07CS8qIE1lbW9yeSBtYW5hZ2VyIG1vZHVsZSAqL1wKKyAgc3RydWN0IGpwZWdfcHJvZ3Jlc3NfbWdyICogcHJvZ3Jlc3M7IC8qIFByb2dyZXNzIG1vbml0b3IsIG9yIE5VTEwgaWYgbm9uZSAqL1wKKyAgdm9pZCAqIGNsaWVudF9kYXRhOwkJLyogQXZhaWxhYmxlIGZvciB1c2UgYnkgYXBwbGljYXRpb24gKi9cCisgIGJvb2xlYW4gaXNfZGVjb21wcmVzc29yOwkvKiBTbyBjb21tb24gY29kZSBjYW4gdGVsbCB3aGljaCBpcyB3aGljaCAqL1wKKyAgaW50IGdsb2JhbF9zdGF0ZQkJLyogRm9yIGNoZWNraW5nIGNhbGwgc2VxdWVuY2UgdmFsaWRpdHkgKi8KKworLyogUm91dGluZXMgdGhhdCBhcmUgdG8gYmUgdXNlZCBieSBib3RoIGhhbHZlcyBvZiB0aGUgbGlicmFyeSBhcmUgZGVjbGFyZWQKKyAqIHRvIHJlY2VpdmUgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlLiAgVGhlcmUgYXJlIG5vIGFjdHVhbCBpbnN0YW5jZXMgb2YKKyAqIGpwZWdfY29tbW9uX3N0cnVjdCwgb25seSBvZiBqcGVnX2NvbXByZXNzX3N0cnVjdCBhbmQganBlZ19kZWNvbXByZXNzX3N0cnVjdC4KKyAqLworc3RydWN0IGpwZWdfY29tbW9uX3N0cnVjdCB7CisgIGpwZWdfY29tbW9uX2ZpZWxkczsJCS8qIEZpZWxkcyBjb21tb24gdG8gYm90aCBtYXN0ZXIgc3RydWN0IHR5cGVzICovCisgIC8qIEFkZGl0aW9uYWwgZmllbGRzIGZvbGxvdyBpbiBhbiBhY3R1YWwganBlZ19jb21wcmVzc19zdHJ1Y3Qgb3IKKyAgICoganBlZ19kZWNvbXByZXNzX3N0cnVjdC4gIEFsbCB0aHJlZSBzdHJ1Y3RzIG11c3QgYWdyZWUgb24gdGhlc2UKKyAgICogaW5pdGlhbCBmaWVsZHMhICAoVGhpcyB3b3VsZCBiZSBhIGxvdCBjbGVhbmVyIGluIEMrKy4pCisgICAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QganBlZ19jb21tb25fc3RydWN0ICogal9jb21tb25fcHRyOwordHlwZWRlZiBzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgKiBqX2NvbXByZXNzX3B0cjsKK3R5cGVkZWYgc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QgKiBqX2RlY29tcHJlc3NfcHRyOworCisKKy8qIE1hc3RlciByZWNvcmQgZm9yIGEgY29tcHJlc3Npb24gaW5zdGFuY2UgKi8KKworc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0IHsKKyAganBlZ19jb21tb25fZmllbGRzOwkJLyogRmllbGRzIHNoYXJlZCB3aXRoIGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QgKi8KKworICAvKiBEZXN0aW5hdGlvbiBmb3IgY29tcHJlc3NlZCBkYXRhICovCisgIHN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21nciAqIGRlc3Q7CisKKyAgLyogRGVzY3JpcHRpb24gb2Ygc291cmNlIGltYWdlIC0tLSB0aGVzZSBmaWVsZHMgbXVzdCBiZSBmaWxsZWQgaW4gYnkKKyAgICogb3V0ZXIgYXBwbGljYXRpb24gYmVmb3JlIHN0YXJ0aW5nIGNvbXByZXNzaW9uLiAgaW5fY29sb3Jfc3BhY2UgbXVzdAorICAgKiBiZSBjb3JyZWN0IGJlZm9yZSB5b3UgY2FuIGV2ZW4gY2FsbCBqcGVnX3NldF9kZWZhdWx0cygpLgorICAgKi8KKworICBKRElNRU5TSU9OIGltYWdlX3dpZHRoOwkvKiBpbnB1dCBpbWFnZSB3aWR0aCAqLworICBKRElNRU5TSU9OIGltYWdlX2hlaWdodDsJLyogaW5wdXQgaW1hZ2UgaGVpZ2h0ICovCisgIGludCBpbnB1dF9jb21wb25lbnRzOwkJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIGluIGlucHV0IGltYWdlICovCisgIEpfQ09MT1JfU1BBQ0UgaW5fY29sb3Jfc3BhY2U7CS8qIGNvbG9yc3BhY2Ugb2YgaW5wdXQgaW1hZ2UgKi8KKworICBkb3VibGUgaW5wdXRfZ2FtbWE7CQkvKiBpbWFnZSBnYW1tYSBvZiBpbnB1dCBpbWFnZSAqLworCisgIC8qIENvbXByZXNzaW9uIHBhcmFtZXRlcnMgLS0tIHRoZXNlIGZpZWxkcyBtdXN0IGJlIHNldCBiZWZvcmUgY2FsbGluZworICAgKiBqcGVnX3N0YXJ0X2NvbXByZXNzKCkuICBXZSByZWNvbW1lbmQgY2FsbGluZyBqcGVnX3NldF9kZWZhdWx0cygpIHRvCisgICAqIGluaXRpYWxpemUgZXZlcnl0aGluZyB0byByZWFzb25hYmxlIGRlZmF1bHRzLCB0aGVuIGNoYW5naW5nIGFueXRoaW5nCisgICAqIHRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpY2FsbHkgd2FudHMgdG8gY2hhbmdlLiAgVGhhdCB3YXkgeW91IHdvbid0IGdldAorICAgKiBidXJudCB3aGVuIG5ldyBwYXJhbWV0ZXJzIGFyZSBhZGRlZC4gIEFsc28gbm90ZSB0aGF0IHRoZXJlIGFyZSBzZXZlcmFsCisgICAqIGhlbHBlciByb3V0aW5lcyB0byBzaW1wbGlmeSBjaGFuZ2luZyBwYXJhbWV0ZXJzLgorICAgKi8KKworICBpbnQgZGF0YV9wcmVjaXNpb247CQkvKiBiaXRzIG9mIHByZWNpc2lvbiBpbiBpbWFnZSBkYXRhICovCisKKyAgaW50IG51bV9jb21wb25lbnRzOwkJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIGluIEpQRUcgaW1hZ2UgKi8KKyAgSl9DT0xPUl9TUEFDRSBqcGVnX2NvbG9yX3NwYWNlOyAvKiBjb2xvcnNwYWNlIG9mIEpQRUcgaW1hZ2UgKi8KKworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcF9pbmZvOworICAvKiBjb21wX2luZm9baV0gZGVzY3JpYmVzIGNvbXBvbmVudCB0aGF0IGFwcGVhcnMgaSd0aCBpbiBTT0YgKi8KKyAgCisgIEpRVUFOVF9UQkwgKiBxdWFudF90YmxfcHRyc1tOVU1fUVVBTlRfVEJMU107CisgIC8qIHB0cnMgdG8gY29lZmZpY2llbnQgcXVhbnRpemF0aW9uIHRhYmxlcywgb3IgTlVMTCBpZiBub3QgZGVmaW5lZCAqLworICAKKyAgSkhVRkZfVEJMICogZGNfaHVmZl90YmxfcHRyc1tOVU1fSFVGRl9UQkxTXTsKKyAgSkhVRkZfVEJMICogYWNfaHVmZl90YmxfcHRyc1tOVU1fSFVGRl9UQkxTXTsKKyAgLyogcHRycyB0byBIdWZmbWFuIGNvZGluZyB0YWJsZXMsIG9yIE5VTEwgaWYgbm90IGRlZmluZWQgKi8KKyAgCisgIFVJTlQ4IGFyaXRoX2RjX0xbTlVNX0FSSVRIX1RCTFNdOyAvKiBMIHZhbHVlcyBmb3IgREMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLworICBVSU5UOCBhcml0aF9kY19VW05VTV9BUklUSF9UQkxTXTsgLyogVSB2YWx1ZXMgZm9yIERDIGFyaXRoLWNvZGluZyB0YWJsZXMgKi8KKyAgVUlOVDggYXJpdGhfYWNfS1tOVU1fQVJJVEhfVEJMU107IC8qIEt4IHZhbHVlcyBmb3IgQUMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLworCisgIGludCBudW1fc2NhbnM7CQkvKiAjIG9mIGVudHJpZXMgaW4gc2Nhbl9pbmZvIGFycmF5ICovCisgIGNvbnN0IGpwZWdfc2Nhbl9pbmZvICogc2Nhbl9pbmZvOyAvKiBzY3JpcHQgZm9yIG11bHRpLXNjYW4gZmlsZSwgb3IgTlVMTCAqLworICAvKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBzY2FuX2luZm8gaXMgTlVMTCwgd2hpY2ggY2F1c2VzIGEgc2luZ2xlLXNjYW4KKyAgICogc2VxdWVudGlhbCBKUEVHIGZpbGUgdG8gYmUgZW1pdHRlZC4gIFRvIGNyZWF0ZSBhIG11bHRpLXNjYW4gZmlsZSwKKyAgICogc2V0IG51bV9zY2FucyBhbmQgc2Nhbl9pbmZvIHRvIHBvaW50IHRvIGFuIGFycmF5IG9mIHNjYW4gZGVmaW5pdGlvbnMuCisgICAqLworCisgIGJvb2xlYW4gcmF3X2RhdGFfaW47CQkvKiBUUlVFPWNhbGxlciBzdXBwbGllcyBkb3duc2FtcGxlZCBkYXRhICovCisgIGJvb2xlYW4gYXJpdGhfY29kZTsJCS8qIFRSVUU9YXJpdGhtZXRpYyBjb2RpbmcsIEZBTFNFPUh1ZmZtYW4gKi8KKyAgYm9vbGVhbiBvcHRpbWl6ZV9jb2Rpbmc7CS8qIFRSVUU9b3B0aW1pemUgZW50cm9weSBlbmNvZGluZyBwYXJtcyAqLworICBib29sZWFuIENDSVI2MDFfc2FtcGxpbmc7CS8qIFRSVUU9Zmlyc3Qgc2FtcGxlcyBhcmUgY29zaXRlZCAqLworICBpbnQgc21vb3RoaW5nX2ZhY3RvcjsJCS8qIDEuLjEwMCwgb3IgMCBmb3Igbm8gaW5wdXQgc21vb3RoaW5nICovCisgIEpfRENUX01FVEhPRCBkY3RfbWV0aG9kOwkvKiBEQ1QgYWxnb3JpdGhtIHNlbGVjdG9yICovCisKKyAgLyogVGhlIHJlc3RhcnQgaW50ZXJ2YWwgY2FuIGJlIHNwZWNpZmllZCBpbiBhYnNvbHV0ZSBNQ1VzIGJ5IHNldHRpbmcKKyAgICogcmVzdGFydF9pbnRlcnZhbCwgb3IgaW4gTUNVIHJvd3MgYnkgc2V0dGluZyByZXN0YXJ0X2luX3Jvd3MKKyAgICogKGluIHdoaWNoIGNhc2UgdGhlIGNvcnJlY3QgcmVzdGFydF9pbnRlcnZhbCB3aWxsIGJlIGZpZ3VyZWQKKyAgICogZm9yIGVhY2ggc2NhbikuCisgICAqLworICB1bnNpZ25lZCBpbnQgcmVzdGFydF9pbnRlcnZhbDsgLyogTUNVcyBwZXIgcmVzdGFydCwgb3IgMCBmb3Igbm8gcmVzdGFydCAqLworICBpbnQgcmVzdGFydF9pbl9yb3dzOwkJLyogaWYgPiAwLCBNQ1Ugcm93cyBwZXIgcmVzdGFydCBpbnRlcnZhbCAqLworCisgIC8qIFBhcmFtZXRlcnMgY29udHJvbGxpbmcgZW1pc3Npb24gb2Ygc3BlY2lhbCBtYXJrZXJzLiAqLworCisgIGJvb2xlYW4gd3JpdGVfSkZJRl9oZWFkZXI7CS8qIHNob3VsZCBhIEpGSUYgbWFya2VyIGJlIHdyaXR0ZW4/ICovCisgIFVJTlQ4IEpGSUZfbWFqb3JfdmVyc2lvbjsJLyogV2hhdCB0byB3cml0ZSBmb3IgdGhlIEpGSUYgdmVyc2lvbiBudW1iZXIgKi8KKyAgVUlOVDggSkZJRl9taW5vcl92ZXJzaW9uOworICAvKiBUaGVzZSB0aHJlZSB2YWx1ZXMgYXJlIG5vdCB1c2VkIGJ5IHRoZSBKUEVHIGNvZGUsIG1lcmVseSBjb3BpZWQgKi8KKyAgLyogaW50byB0aGUgSkZJRiBBUFAwIG1hcmtlci4gIGRlbnNpdHlfdW5pdCBjYW4gYmUgMCBmb3IgdW5rbm93biwgKi8KKyAgLyogMSBmb3IgZG90cy9pbmNoLCBvciAyIGZvciBkb3RzL2NtLiAgTm90ZSB0aGF0IHRoZSBwaXhlbCBhc3BlY3QgKi8KKyAgLyogcmF0aW8gaXMgZGVmaW5lZCBieSBYX2RlbnNpdHkvWV9kZW5zaXR5IGV2ZW4gd2hlbiBkZW5zaXR5X3VuaXQ9MC4gKi8KKyAgVUlOVDggZGVuc2l0eV91bml0OwkJLyogSkZJRiBjb2RlIGZvciBwaXhlbCBzaXplIHVuaXRzICovCisgIFVJTlQxNiBYX2RlbnNpdHk7CQkvKiBIb3Jpem9udGFsIHBpeGVsIGRlbnNpdHkgKi8KKyAgVUlOVDE2IFlfZGVuc2l0eTsJCS8qIFZlcnRpY2FsIHBpeGVsIGRlbnNpdHkgKi8KKyAgYm9vbGVhbiB3cml0ZV9BZG9iZV9tYXJrZXI7CS8qIHNob3VsZCBhbiBBZG9iZSBtYXJrZXIgYmUgd3JpdHRlbj8gKi8KKyAgCisgIC8qIFN0YXRlIHZhcmlhYmxlOiBpbmRleCBvZiBuZXh0IHNjYW5saW5lIHRvIGJlIHdyaXR0ZW4gdG8KKyAgICoganBlZ193cml0ZV9zY2FubGluZXMoKS4gIEFwcGxpY2F0aW9uIG1heSB1c2UgdGhpcyB0byBjb250cm9sIGl0cworICAgKiBwcm9jZXNzaW5nIGxvb3AsIGUuZy4sICJ3aGlsZSAobmV4dF9zY2FubGluZSA8IGltYWdlX2hlaWdodCkiLgorICAgKi8KKworICBKRElNRU5TSU9OIG5leHRfc2NhbmxpbmU7CS8qIDAgLi4gaW1hZ2VfaGVpZ2h0LTEgICovCisKKyAgLyogUmVtYWluaW5nIGZpZWxkcyBhcmUga25vd24gdGhyb3VnaG91dCBjb21wcmVzc29yLCBidXQgZ2VuZXJhbGx5CisgICAqIHNob3VsZCBub3QgYmUgdG91Y2hlZCBieSBhIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uLgorICAgKi8KKworICAvKgorICAgKiBUaGVzZSBmaWVsZHMgYXJlIGNvbXB1dGVkIGR1cmluZyBjb21wcmVzc2lvbiBzdGFydHVwCisgICAqLworICBib29sZWFuIHByb2dyZXNzaXZlX21vZGU7CS8qIFRSVUUgaWYgc2NhbiBzY3JpcHQgdXNlcyBwcm9ncmVzc2l2ZSBtb2RlICovCisgIGludCBtYXhfaF9zYW1wX2ZhY3RvcjsJLyogbGFyZ2VzdCBoX3NhbXBfZmFjdG9yICovCisgIGludCBtYXhfdl9zYW1wX2ZhY3RvcjsJLyogbGFyZ2VzdCB2X3NhbXBfZmFjdG9yICovCisKKyAgSkRJTUVOU0lPTiB0b3RhbF9pTUNVX3Jvd3M7CS8qICMgb2YgaU1DVSByb3dzIHRvIGJlIGlucHV0IHRvIGNvZWYgY3RsciAqLworICAvKiBUaGUgY29lZmZpY2llbnQgY29udHJvbGxlciByZWNlaXZlcyBkYXRhIGluIHVuaXRzIG9mIE1DVSByb3dzIGFzIGRlZmluZWQKKyAgICogZm9yIGZ1bGx5IGludGVybGVhdmVkIHNjYW5zICh3aGV0aGVyIHRoZSBKUEVHIGZpbGUgaXMgaW50ZXJsZWF2ZWQgb3Igbm90KS4KKyAgICogVGhlcmUgYXJlIHZfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFIHNhbXBsZSByb3dzIG9mIGVhY2ggY29tcG9uZW50IGluIGFuCisgICAqICJpTUNVIiAoaW50ZXJsZWF2ZWQgTUNVKSByb3cuCisgICAqLworICAKKyAgLyoKKyAgICogVGhlc2UgZmllbGRzIGFyZSB2YWxpZCBkdXJpbmcgYW55IG9uZSBzY2FuLgorICAgKiBUaGV5IGRlc2NyaWJlIHRoZSBjb21wb25lbnRzIGFuZCBNQ1VzIGFjdHVhbGx5IGFwcGVhcmluZyBpbiB0aGUgc2Nhbi4KKyAgICovCisgIGludCBjb21wc19pbl9zY2FuOwkJLyogIyBvZiBKUEVHIGNvbXBvbmVudHMgaW4gdGhpcyBzY2FuICovCisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjdXJfY29tcF9pbmZvW01BWF9DT01QU19JTl9TQ0FOXTsKKyAgLyogKmN1cl9jb21wX2luZm9baV0gZGVzY3JpYmVzIGNvbXBvbmVudCB0aGF0IGFwcGVhcnMgaSd0aCBpbiBTT1MgKi8KKyAgCisgIEpESU1FTlNJT04gTUNVc19wZXJfcm93OwkvKiAjIG9mIE1DVXMgYWNyb3NzIHRoZSBpbWFnZSAqLworICBKRElNRU5TSU9OIE1DVV9yb3dzX2luX3NjYW47CS8qICMgb2YgTUNVIHJvd3MgaW4gdGhlIGltYWdlICovCisgIAorICBpbnQgYmxvY2tzX2luX01DVTsJCS8qICMgb2YgRENUIGJsb2NrcyBwZXIgTUNVICovCisgIGludCBNQ1VfbWVtYmVyc2hpcFtDX01BWF9CTE9DS1NfSU5fTUNVXTsKKyAgLyogTUNVX21lbWJlcnNoaXBbaV0gaXMgaW5kZXggaW4gY3VyX2NvbXBfaW5mbyBvZiBjb21wb25lbnQgb3duaW5nICovCisgIC8qIGkndGggYmxvY2sgaW4gYW4gTUNVICovCisKKyAgaW50IFNzLCBTZSwgQWgsIEFsOwkJLyogcHJvZ3Jlc3NpdmUgSlBFRyBwYXJhbWV0ZXJzIGZvciBzY2FuICovCisKKyAgLyoKKyAgICogTGlua3MgdG8gY29tcHJlc3Npb24gc3Vib2JqZWN0cyAobWV0aG9kcyBhbmQgcHJpdmF0ZSB2YXJpYWJsZXMgb2YgbW9kdWxlcykKKyAgICovCisgIHN0cnVjdCBqcGVnX2NvbXBfbWFzdGVyICogbWFzdGVyOworICBzdHJ1Y3QganBlZ19jX21haW5fY29udHJvbGxlciAqIG1haW47CisgIHN0cnVjdCBqcGVnX2NfcHJlcF9jb250cm9sbGVyICogcHJlcDsKKyAgc3RydWN0IGpwZWdfY19jb2VmX2NvbnRyb2xsZXIgKiBjb2VmOworICBzdHJ1Y3QganBlZ19tYXJrZXJfd3JpdGVyICogbWFya2VyOworICBzdHJ1Y3QganBlZ19jb2xvcl9jb252ZXJ0ZXIgKiBjY29udmVydDsKKyAgc3RydWN0IGpwZWdfZG93bnNhbXBsZXIgKiBkb3duc2FtcGxlOworICBzdHJ1Y3QganBlZ19mb3J3YXJkX2RjdCAqIGZkY3Q7CisgIHN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciAqIGVudHJvcHk7CisgIGpwZWdfc2Nhbl9pbmZvICogc2NyaXB0X3NwYWNlOyAvKiB3b3Jrc3BhY2UgZm9yIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uICovCisgIGludCBzY3JpcHRfc3BhY2Vfc2l6ZTsKK307CisKKworLyogTWFzdGVyIHJlY29yZCBmb3IgYSBkZWNvbXByZXNzaW9uIGluc3RhbmNlICovCisKK3N0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0IHsKKyAganBlZ19jb21tb25fZmllbGRzOwkJLyogRmllbGRzIHNoYXJlZCB3aXRoIGpwZWdfY29tcHJlc3Nfc3RydWN0ICovCisKKyAgLyogU291cmNlIG9mIGNvbXByZXNzZWQgZGF0YSAqLworICBzdHJ1Y3QganBlZ19zb3VyY2VfbWdyICogc3JjOworCisgIC8qIEJhc2ljIGRlc2NyaXB0aW9uIG9mIGltYWdlIC0tLSBmaWxsZWQgaW4gYnkganBlZ19yZWFkX2hlYWRlcigpLiAqLworICAvKiBBcHBsaWNhdGlvbiBtYXkgaW5zcGVjdCB0aGVzZSB2YWx1ZXMgdG8gZGVjaWRlIGhvdyB0byBwcm9jZXNzIGltYWdlLiAqLworCisgIEpESU1FTlNJT04gaW1hZ2Vfd2lkdGg7CS8qIG5vbWluYWwgaW1hZ2Ugd2lkdGggKGZyb20gU09GIG1hcmtlcikgKi8KKyAgSkRJTUVOU0lPTiBpbWFnZV9oZWlnaHQ7CS8qIG5vbWluYWwgaW1hZ2UgaGVpZ2h0ICovCisgIGludCBudW1fY29tcG9uZW50czsJCS8qICMgb2YgY29sb3IgY29tcG9uZW50cyBpbiBKUEVHIGltYWdlICovCisgIEpfQ09MT1JfU1BBQ0UganBlZ19jb2xvcl9zcGFjZTsgLyogY29sb3JzcGFjZSBvZiBKUEVHIGltYWdlICovCisKKyAgLyogRGVjb21wcmVzc2lvbiBwcm9jZXNzaW5nIHBhcmFtZXRlcnMgLS0tIHRoZXNlIGZpZWxkcyBtdXN0IGJlIHNldCBiZWZvcmUKKyAgICogY2FsbGluZyBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4gIE5vdGUgdGhhdCBqcGVnX3JlYWRfaGVhZGVyKCkgaW5pdGlhbGl6ZXMKKyAgICogdGhlbSB0byBkZWZhdWx0IHZhbHVlcy4KKyAgICovCisKKyAgSl9DT0xPUl9TUEFDRSBvdXRfY29sb3Jfc3BhY2U7IC8qIGNvbG9yc3BhY2UgZm9yIG91dHB1dCAqLworCisgIHVuc2lnbmVkIGludCBzY2FsZV9udW0sIHNjYWxlX2Rlbm9tOyAvKiBmcmFjdGlvbiBieSB3aGljaCB0byBzY2FsZSBpbWFnZSAqLworCisgIGRvdWJsZSBvdXRwdXRfZ2FtbWE7CQkvKiBpbWFnZSBnYW1tYSB3YW50ZWQgaW4gb3V0cHV0ICovCisKKyAgYm9vbGVhbiBidWZmZXJlZF9pbWFnZTsJLyogVFJVRT1tdWx0aXBsZSBvdXRwdXQgcGFzc2VzICovCisgIGJvb2xlYW4gcmF3X2RhdGFfb3V0OwkJLyogVFJVRT1kb3duc2FtcGxlZCBkYXRhIHdhbnRlZCAqLworCisgIEpfRENUX01FVEhPRCBkY3RfbWV0aG9kOwkvKiBJRENUIGFsZ29yaXRobSBzZWxlY3RvciAqLworICBib29sZWFuIGRvX2ZhbmN5X3Vwc2FtcGxpbmc7CS8qIFRSVUU9YXBwbHkgZmFuY3kgdXBzYW1wbGluZyAqLworICBib29sZWFuIGRvX2Jsb2NrX3Ntb290aGluZzsJLyogVFJVRT1hcHBseSBpbnRlcmJsb2NrIHNtb290aGluZyAqLworCisgIGJvb2xlYW4gcXVhbnRpemVfY29sb3JzOwkvKiBUUlVFPWNvbG9ybWFwcGVkIG91dHB1dCB3YW50ZWQgKi8KKyAgLyogdGhlIGZvbGxvd2luZyBhcmUgaWdub3JlZCBpZiBub3QgcXVhbnRpemVfY29sb3JzOiAqLworICBKX0RJVEhFUl9NT0RFIGRpdGhlcl9tb2RlOwkvKiB0eXBlIG9mIGNvbG9yIGRpdGhlcmluZyB0byB1c2UgKi8KKyAgYm9vbGVhbiB0d29fcGFzc19xdWFudGl6ZTsJLyogVFJVRT11c2UgdHdvLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uICovCisgIGludCBkZXNpcmVkX251bWJlcl9vZl9jb2xvcnM7CS8qIG1heCAjIGNvbG9ycyB0byB1c2UgaW4gY3JlYXRlZCBjb2xvcm1hcCAqLworICAvKiB0aGVzZSBhcmUgc2lnbmlmaWNhbnQgb25seSBpbiBidWZmZXJlZC1pbWFnZSBtb2RlOiAqLworICBib29sZWFuIGVuYWJsZV8xcGFzc19xdWFudDsJLyogZW5hYmxlIGZ1dHVyZSB1c2Ugb2YgMS1wYXNzIHF1YW50aXplciAqLworICBib29sZWFuIGVuYWJsZV9leHRlcm5hbF9xdWFudDsvKiBlbmFibGUgZnV0dXJlIHVzZSBvZiBleHRlcm5hbCBjb2xvcm1hcCAqLworICBib29sZWFuIGVuYWJsZV8ycGFzc19xdWFudDsJLyogZW5hYmxlIGZ1dHVyZSB1c2Ugb2YgMi1wYXNzIHF1YW50aXplciAqLworCisgIC8qIERlc2NyaXB0aW9uIG9mIGFjdHVhbCBvdXRwdXQgaW1hZ2UgdGhhdCB3aWxsIGJlIHJldHVybmVkIHRvIGFwcGxpY2F0aW9uLgorICAgKiBUaGVzZSBmaWVsZHMgYXJlIGNvbXB1dGVkIGJ5IGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLgorICAgKiBZb3UgY2FuIGFsc28gdXNlIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucygpIHRvIGRldGVybWluZSB0aGVzZSB2YWx1ZXMKKyAgICogaW4gYWR2YW5jZSBvZiBjYWxsaW5nIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLgorICAgKi8KKworICBKRElNRU5TSU9OIG91dHB1dF93aWR0aDsJLyogc2NhbGVkIGltYWdlIHdpZHRoICovCisgIEpESU1FTlNJT04gb3V0cHV0X2hlaWdodDsJLyogc2NhbGVkIGltYWdlIGhlaWdodCAqLworICBpbnQgb3V0X2NvbG9yX2NvbXBvbmVudHM7CS8qICMgb2YgY29sb3IgY29tcG9uZW50cyBpbiBvdXRfY29sb3Jfc3BhY2UgKi8KKyAgaW50IG91dHB1dF9jb21wb25lbnRzOwkvKiAjIG9mIGNvbG9yIGNvbXBvbmVudHMgcmV0dXJuZWQgKi8KKyAgLyogb3V0cHV0X2NvbXBvbmVudHMgaXMgMSAoYSBjb2xvcm1hcCBpbmRleCkgd2hlbiBxdWFudGl6aW5nIGNvbG9yczsKKyAgICogb3RoZXJ3aXNlIGl0IGVxdWFscyBvdXRfY29sb3JfY29tcG9uZW50cy4KKyAgICovCisgIGludCByZWNfb3V0YnVmX2hlaWdodDsJLyogbWluIHJlY29tbWVuZGVkIGhlaWdodCBvZiBzY2FubGluZSBidWZmZXIgKi8KKyAgLyogSWYgdGhlIGJ1ZmZlciBwYXNzZWQgdG8ganBlZ19yZWFkX3NjYW5saW5lcygpIGlzIGxlc3MgdGhhbiB0aGlzIG1hbnkgcm93cworICAgKiBoaWdoLCBzcGFjZSBhbmQgdGltZSB3aWxsIGJlIHdhc3RlZCBkdWUgdG8gdW5uZWNlc3NhcnkgZGF0YSBjb3B5aW5nLgorICAgKiBVc3VhbGx5IHJlY19vdXRidWZfaGVpZ2h0IHdpbGwgYmUgMSBvciAyLCBhdCBtb3N0IDQuCisgICAqLworCisgIC8qIFdoZW4gcXVhbnRpemluZyBjb2xvcnMsIHRoZSBvdXRwdXQgY29sb3JtYXAgaXMgZGVzY3JpYmVkIGJ5IHRoZXNlIGZpZWxkcy4KKyAgICogVGhlIGFwcGxpY2F0aW9uIGNhbiBzdXBwbHkgYSBjb2xvcm1hcCBieSBzZXR0aW5nIGNvbG9ybWFwIG5vbi1OVUxMIGJlZm9yZQorICAgKiBjYWxsaW5nIGpwZWdfc3RhcnRfZGVjb21wcmVzczsgb3RoZXJ3aXNlIGEgY29sb3JtYXAgaXMgY3JlYXRlZCBkdXJpbmcKKyAgICoganBlZ19zdGFydF9kZWNvbXByZXNzIG9yIGpwZWdfc3RhcnRfb3V0cHV0LgorICAgKiBUaGUgbWFwIGhhcyBvdXRfY29sb3JfY29tcG9uZW50cyByb3dzIGFuZCBhY3R1YWxfbnVtYmVyX29mX2NvbG9ycyBjb2x1bW5zLgorICAgKi8KKyAgaW50IGFjdHVhbF9udW1iZXJfb2ZfY29sb3JzOwkvKiBudW1iZXIgb2YgZW50cmllcyBpbiB1c2UgKi8KKyAgSlNBTVBBUlJBWSBjb2xvcm1hcDsJCS8qIFRoZSBjb2xvciBtYXAgYXMgYSAyLUQgcGl4ZWwgYXJyYXkgKi8KKworICAvKiBTdGF0ZSB2YXJpYWJsZXM6IHRoZXNlIHZhcmlhYmxlcyBpbmRpY2F0ZSB0aGUgcHJvZ3Jlc3Mgb2YgZGVjb21wcmVzc2lvbi4KKyAgICogVGhlIGFwcGxpY2F0aW9uIG1heSBleGFtaW5lIHRoZXNlIGJ1dCBtdXN0IG5vdCBtb2RpZnkgdGhlbS4KKyAgICovCisKKyAgLyogUm93IGluZGV4IG9mIG5leHQgc2NhbmxpbmUgdG8gYmUgcmVhZCBmcm9tIGpwZWdfcmVhZF9zY2FubGluZXMoKS4KKyAgICogQXBwbGljYXRpb24gbWF5IHVzZSB0aGlzIHRvIGNvbnRyb2wgaXRzIHByb2Nlc3NpbmcgbG9vcCwgZS5nLiwKKyAgICogIndoaWxlIChvdXRwdXRfc2NhbmxpbmUgPCBvdXRwdXRfaGVpZ2h0KSIuCisgICAqLworICBKRElNRU5TSU9OIG91dHB1dF9zY2FubGluZTsJLyogMCAuLiBvdXRwdXRfaGVpZ2h0LTEgICovCisKKyAgLyogQ3VycmVudCBpbnB1dCBzY2FuIG51bWJlciBhbmQgbnVtYmVyIG9mIGlNQ1Ugcm93cyBjb21wbGV0ZWQgaW4gc2Nhbi4KKyAgICogVGhlc2UgaW5kaWNhdGUgdGhlIHByb2dyZXNzIG9mIHRoZSBkZWNvbXByZXNzb3IgaW5wdXQgc2lkZS4KKyAgICovCisgIGludCBpbnB1dF9zY2FuX251bWJlcjsJLyogTnVtYmVyIG9mIFNPUyBtYXJrZXJzIHNlZW4gc28gZmFyICovCisgIEpESU1FTlNJT04gaW5wdXRfaU1DVV9yb3c7CS8qIE51bWJlciBvZiBpTUNVIHJvd3MgY29tcGxldGVkICovCisKKyAgLyogVGhlICJvdXRwdXQgc2NhbiBudW1iZXIiIGlzIHRoZSBub3Rpb25hbCBzY2FuIGJlaW5nIGRpc3BsYXllZCBieSB0aGUKKyAgICogb3V0cHV0IHNpZGUuICBUaGUgZGVjb21wcmVzc29yIHdpbGwgbm90IGFsbG93IG91dHB1dCBzY2FuL3JvdyBudW1iZXIKKyAgICogdG8gZ2V0IGFoZWFkIG9mIGlucHV0IHNjYW4vcm93LCBidXQgaXQgY2FuIGZhbGwgYXJiaXRyYXJpbHkgZmFyIGJlaGluZC4KKyAgICovCisgIGludCBvdXRwdXRfc2Nhbl9udW1iZXI7CS8qIE5vbWluYWwgc2NhbiBudW1iZXIgYmVpbmcgZGlzcGxheWVkICovCisgIEpESU1FTlNJT04gb3V0cHV0X2lNQ1Vfcm93OwkvKiBOdW1iZXIgb2YgaU1DVSByb3dzIHJlYWQgKi8KKworICAvKiBDdXJyZW50IHByb2dyZXNzaW9uIHN0YXR1cy4gIGNvZWZfYml0c1tjXVtpXSBpbmRpY2F0ZXMgdGhlIHByZWNpc2lvbgorICAgKiB3aXRoIHdoaWNoIGNvbXBvbmVudCBjJ3MgRENUIGNvZWZmaWNpZW50IGkgKGluIHppZ3phZyBvcmRlcikgaXMga25vd24uCisgICAqIEl0IGlzIC0xIHdoZW4gbm8gZGF0YSBoYXMgeWV0IGJlZW4gcmVjZWl2ZWQsIG90aGVyd2lzZSBpdCBpcyB0aGUgcG9pbnQKKyAgICogdHJhbnNmb3JtIChzaGlmdCkgdmFsdWUgZm9yIHRoZSBtb3N0IHJlY2VudCBzY2FuIG9mIHRoZSBjb2VmZmljaWVudAorICAgKiAodGh1cywgMCBhdCBjb21wbGV0aW9uIG9mIHRoZSBwcm9ncmVzc2lvbikuCisgICAqIFRoaXMgcG9pbnRlciBpcyBOVUxMIHdoZW4gcmVhZGluZyBhIG5vbi1wcm9ncmVzc2l2ZSBmaWxlLgorICAgKi8KKyAgaW50ICgqY29lZl9iaXRzKVtEQ1RTSVpFMl07CS8qIC0xIG9yIGN1cnJlbnQgQWwgdmFsdWUgZm9yIGVhY2ggY29lZiAqLworCisgIC8qIEludGVybmFsIEpQRUcgcGFyYW1ldGVycyAtLS0gdGhlIGFwcGxpY2F0aW9uIHVzdWFsbHkgbmVlZCBub3QgbG9vayBhdAorICAgKiB0aGVzZSBmaWVsZHMuICBOb3RlIHRoYXQgdGhlIGRlY29tcHJlc3NvciBvdXRwdXQgc2lkZSBtYXkgbm90IHVzZQorICAgKiBhbnkgcGFyYW1ldGVycyB0aGF0IGNhbiBjaGFuZ2UgYmV0d2VlbiBzY2Fucy4KKyAgICovCisKKyAgLyogUXVhbnRpemF0aW9uIGFuZCBIdWZmbWFuIHRhYmxlcyBhcmUgY2FycmllZCBmb3J3YXJkIGFjcm9zcyBpbnB1dAorICAgKiBkYXRhc3RyZWFtcyB3aGVuIHByb2Nlc3NpbmcgYWJicmV2aWF0ZWQgSlBFRyBkYXRhc3RyZWFtcy4KKyAgICovCisKKyAgSlFVQU5UX1RCTCAqIHF1YW50X3RibF9wdHJzW05VTV9RVUFOVF9UQkxTXTsKKyAgLyogcHRycyB0byBjb2VmZmljaWVudCBxdWFudGl6YXRpb24gdGFibGVzLCBvciBOVUxMIGlmIG5vdCBkZWZpbmVkICovCisKKyAgSkhVRkZfVEJMICogZGNfaHVmZl90YmxfcHRyc1tOVU1fSFVGRl9UQkxTXTsKKyAgSkhVRkZfVEJMICogYWNfaHVmZl90YmxfcHRyc1tOVU1fSFVGRl9UQkxTXTsKKyAgLyogcHRycyB0byBIdWZmbWFuIGNvZGluZyB0YWJsZXMsIG9yIE5VTEwgaWYgbm90IGRlZmluZWQgKi8KKworICAvKiBUaGVzZSBwYXJhbWV0ZXJzIGFyZSBuZXZlciBjYXJyaWVkIGFjcm9zcyBkYXRhc3RyZWFtcywgc2luY2UgdGhleQorICAgKiBhcmUgZ2l2ZW4gaW4gU09GL1NPUyBtYXJrZXJzIG9yIGRlZmluZWQgdG8gYmUgcmVzZXQgYnkgU09JLgorICAgKi8KKworICBpbnQgZGF0YV9wcmVjaXNpb247CQkvKiBiaXRzIG9mIHByZWNpc2lvbiBpbiBpbWFnZSBkYXRhICovCisKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBfaW5mbzsKKyAgLyogY29tcF9pbmZvW2ldIGRlc2NyaWJlcyBjb21wb25lbnQgdGhhdCBhcHBlYXJzIGkndGggaW4gU09GICovCisKKyAgYm9vbGVhbiBwcm9ncmVzc2l2ZV9tb2RlOwkvKiBUUlVFIGlmIFNPRm4gc3BlY2lmaWVzIHByb2dyZXNzaXZlIG1vZGUgKi8KKyAgYm9vbGVhbiBhcml0aF9jb2RlOwkJLyogVFJVRT1hcml0aG1ldGljIGNvZGluZywgRkFMU0U9SHVmZm1hbiAqLworCisgIFVJTlQ4IGFyaXRoX2RjX0xbTlVNX0FSSVRIX1RCTFNdOyAvKiBMIHZhbHVlcyBmb3IgREMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLworICBVSU5UOCBhcml0aF9kY19VW05VTV9BUklUSF9UQkxTXTsgLyogVSB2YWx1ZXMgZm9yIERDIGFyaXRoLWNvZGluZyB0YWJsZXMgKi8KKyAgVUlOVDggYXJpdGhfYWNfS1tOVU1fQVJJVEhfVEJMU107IC8qIEt4IHZhbHVlcyBmb3IgQUMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLworCisgIHVuc2lnbmVkIGludCByZXN0YXJ0X2ludGVydmFsOyAvKiBNQ1VzIHBlciByZXN0YXJ0IGludGVydmFsLCBvciAwIGZvciBubyByZXN0YXJ0ICovCisKKyAgLyogVGhlc2UgZmllbGRzIHJlY29yZCBkYXRhIG9idGFpbmVkIGZyb20gb3B0aW9uYWwgbWFya2VycyByZWNvZ25pemVkIGJ5CisgICAqIHRoZSBKUEVHIGxpYnJhcnkuCisgICAqLworICBib29sZWFuIHNhd19KRklGX21hcmtlcjsJLyogVFJVRSBpZmYgYSBKRklGIEFQUDAgbWFya2VyIHdhcyBmb3VuZCAqLworICAvKiBEYXRhIGNvcGllZCBmcm9tIEpGSUYgbWFya2VyOyBvbmx5IHZhbGlkIGlmIHNhd19KRklGX21hcmtlciBpcyBUUlVFOiAqLworICBVSU5UOCBKRklGX21ham9yX3ZlcnNpb247CS8qIEpGSUYgdmVyc2lvbiBudW1iZXIgKi8KKyAgVUlOVDggSkZJRl9taW5vcl92ZXJzaW9uOworICBVSU5UOCBkZW5zaXR5X3VuaXQ7CQkvKiBKRklGIGNvZGUgZm9yIHBpeGVsIHNpemUgdW5pdHMgKi8KKyAgVUlOVDE2IFhfZGVuc2l0eTsJCS8qIEhvcml6b250YWwgcGl4ZWwgZGVuc2l0eSAqLworICBVSU5UMTYgWV9kZW5zaXR5OwkJLyogVmVydGljYWwgcGl4ZWwgZGVuc2l0eSAqLworICBib29sZWFuIHNhd19BZG9iZV9tYXJrZXI7CS8qIFRSVUUgaWZmIGFuIEFkb2JlIEFQUDE0IG1hcmtlciB3YXMgZm91bmQgKi8KKyAgVUlOVDggQWRvYmVfdHJhbnNmb3JtOwkvKiBDb2xvciB0cmFuc2Zvcm0gY29kZSBmcm9tIEFkb2JlIG1hcmtlciAqLworCisgIGJvb2xlYW4gQ0NJUjYwMV9zYW1wbGluZzsJLyogVFJVRT1maXJzdCBzYW1wbGVzIGFyZSBjb3NpdGVkICovCisKKyAgLyogQXNpZGUgZnJvbSB0aGUgc3BlY2lmaWMgZGF0YSByZXRhaW5lZCBmcm9tIEFQUG4gbWFya2VycyBrbm93biB0byB0aGUKKyAgICogbGlicmFyeSwgdGhlIHVuaW50ZXJwcmV0ZWQgY29udGVudHMgb2YgYW55IG9yIGFsbCBBUFBuIGFuZCBDT00gbWFya2VycworICAgKiBjYW4gYmUgc2F2ZWQgaW4gYSBsaXN0IGZvciBleGFtaW5hdGlvbiBieSB0aGUgYXBwbGljYXRpb24uCisgICAqLworICBqcGVnX3NhdmVkX21hcmtlcl9wdHIgbWFya2VyX2xpc3Q7IC8qIEhlYWQgb2YgbGlzdCBvZiBzYXZlZCBtYXJrZXJzICovCisKKyAgLyogUmVtYWluaW5nIGZpZWxkcyBhcmUga25vd24gdGhyb3VnaG91dCBkZWNvbXByZXNzb3IsIGJ1dCBnZW5lcmFsbHkKKyAgICogc2hvdWxkIG5vdCBiZSB0b3VjaGVkIGJ5IGEgc3Vycm91bmRpbmcgYXBwbGljYXRpb24uCisgICAqLworCisgIC8qCisgICAqIFRoZXNlIGZpZWxkcyBhcmUgY29tcHV0ZWQgZHVyaW5nIGRlY29tcHJlc3Npb24gc3RhcnR1cAorICAgKi8KKyAgaW50IG1heF9oX3NhbXBfZmFjdG9yOwkvKiBsYXJnZXN0IGhfc2FtcF9mYWN0b3IgKi8KKyAgaW50IG1heF92X3NhbXBfZmFjdG9yOwkvKiBsYXJnZXN0IHZfc2FtcF9mYWN0b3IgKi8KKworICBpbnQgbWluX0RDVF9zY2FsZWRfc2l6ZTsJLyogc21hbGxlc3QgRENUX3NjYWxlZF9zaXplIG9mIGFueSBjb21wb25lbnQgKi8KKworICBKRElNRU5TSU9OIHRvdGFsX2lNQ1Vfcm93czsJLyogIyBvZiBpTUNVIHJvd3MgaW4gaW1hZ2UgKi8KKyAgLyogVGhlIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIncyBpbnB1dCBhbmQgb3V0cHV0IHByb2dyZXNzIGlzIG1lYXN1cmVkIGluCisgICAqIHVuaXRzIG9mICJpTUNVIiAoaW50ZXJsZWF2ZWQgTUNVKSByb3dzLiAgVGhlc2UgYXJlIHRoZSBzYW1lIGFzIE1DVSByb3dzCisgICAqIGluIGZ1bGx5IGludGVybGVhdmVkIEpQRUcgc2NhbnMsIGJ1dCBhcmUgdXNlZCB3aGV0aGVyIHRoZSBzY2FuIGlzCisgICAqIGludGVybGVhdmVkIG9yIG5vdC4gIFdlIGRlZmluZSBhbiBpTUNVIHJvdyBhcyB2X3NhbXBfZmFjdG9yIERDVCBibG9jaworICAgKiByb3dzIG9mIGVhY2ggY29tcG9uZW50LiAgVGhlcmVmb3JlLCB0aGUgSURDVCBvdXRwdXQgY29udGFpbnMKKyAgICogdl9zYW1wX2ZhY3RvcipEQ1Rfc2NhbGVkX3NpemUgc2FtcGxlIHJvd3Mgb2YgYSBjb21wb25lbnQgcGVyIGlNQ1Ugcm93LgorICAgKi8KKworICBKU0FNUExFICogc2FtcGxlX3JhbmdlX2xpbWl0OyAvKiB0YWJsZSBmb3IgZmFzdCByYW5nZS1saW1pdGluZyAqLworCisgIC8qCisgICAqIFRoZXNlIGZpZWxkcyBhcmUgdmFsaWQgZHVyaW5nIGFueSBvbmUgc2Nhbi4KKyAgICogVGhleSBkZXNjcmliZSB0aGUgY29tcG9uZW50cyBhbmQgTUNVcyBhY3R1YWxseSBhcHBlYXJpbmcgaW4gdGhlIHNjYW4uCisgICAqIE5vdGUgdGhhdCB0aGUgZGVjb21wcmVzc29yIG91dHB1dCBzaWRlIG11c3Qgbm90IHVzZSB0aGVzZSBmaWVsZHMuCisgICAqLworICBpbnQgY29tcHNfaW5fc2NhbjsJCS8qICMgb2YgSlBFRyBjb21wb25lbnRzIGluIHRoaXMgc2NhbiAqLworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY3VyX2NvbXBfaW5mb1tNQVhfQ09NUFNfSU5fU0NBTl07CisgIC8qICpjdXJfY29tcF9pbmZvW2ldIGRlc2NyaWJlcyBjb21wb25lbnQgdGhhdCBhcHBlYXJzIGkndGggaW4gU09TICovCisKKyAgSkRJTUVOU0lPTiBNQ1VzX3Blcl9yb3c7CS8qICMgb2YgTUNVcyBhY3Jvc3MgdGhlIGltYWdlICovCisgIEpESU1FTlNJT04gTUNVX3Jvd3NfaW5fc2NhbjsJLyogIyBvZiBNQ1Ugcm93cyBpbiB0aGUgaW1hZ2UgKi8KKworICBpbnQgYmxvY2tzX2luX01DVTsJCS8qICMgb2YgRENUIGJsb2NrcyBwZXIgTUNVICovCisgIGludCBNQ1VfbWVtYmVyc2hpcFtEX01BWF9CTE9DS1NfSU5fTUNVXTsKKyAgLyogTUNVX21lbWJlcnNoaXBbaV0gaXMgaW5kZXggaW4gY3VyX2NvbXBfaW5mbyBvZiBjb21wb25lbnQgb3duaW5nICovCisgIC8qIGkndGggYmxvY2sgaW4gYW4gTUNVICovCisKKyAgaW50IFNzLCBTZSwgQWgsIEFsOwkJLyogcHJvZ3Jlc3NpdmUgSlBFRyBwYXJhbWV0ZXJzIGZvciBzY2FuICovCisKKyAgLyogVGhpcyBmaWVsZCBpcyBzaGFyZWQgYmV0d2VlbiBlbnRyb3B5IGRlY29kZXIgYW5kIG1hcmtlciBwYXJzZXIuCisgICAqIEl0IGlzIGVpdGhlciB6ZXJvIG9yIHRoZSBjb2RlIG9mIGEgSlBFRyBtYXJrZXIgdGhhdCBoYXMgYmVlbgorICAgKiByZWFkIGZyb20gdGhlIGRhdGEgc291cmNlLCBidXQgaGFzIG5vdCB5ZXQgYmVlbiBwcm9jZXNzZWQuCisgICAqLworICBpbnQgdW5yZWFkX21hcmtlcjsKKworICAvKgorICAgKiBMaW5rcyB0byBkZWNvbXByZXNzaW9uIHN1Ym9iamVjdHMgKG1ldGhvZHMsIHByaXZhdGUgdmFyaWFibGVzIG9mIG1vZHVsZXMpCisgICAqLworICBzdHJ1Y3QganBlZ19kZWNvbXBfbWFzdGVyICogbWFzdGVyOworICBzdHJ1Y3QganBlZ19kX21haW5fY29udHJvbGxlciAqIG1haW47CisgIHN0cnVjdCBqcGVnX2RfY29lZl9jb250cm9sbGVyICogY29lZjsKKyAgc3RydWN0IGpwZWdfZF9wb3N0X2NvbnRyb2xsZXIgKiBwb3N0OworICBzdHJ1Y3QganBlZ19pbnB1dF9jb250cm9sbGVyICogaW5wdXRjdGw7CisgIHN0cnVjdCBqcGVnX21hcmtlcl9yZWFkZXIgKiBtYXJrZXI7CisgIHN0cnVjdCBqcGVnX2VudHJvcHlfZGVjb2RlciAqIGVudHJvcHk7CisgIHN0cnVjdCBqcGVnX2ludmVyc2VfZGN0ICogaWRjdDsKKyAgc3RydWN0IGpwZWdfdXBzYW1wbGVyICogdXBzYW1wbGU7CisgIHN0cnVjdCBqcGVnX2NvbG9yX2RlY29udmVydGVyICogY2NvbnZlcnQ7CisgIHN0cnVjdCBqcGVnX2NvbG9yX3F1YW50aXplciAqIGNxdWFudGl6ZTsKK307CisKKworLyogIk9iamVjdCIgZGVjbGFyYXRpb25zIGZvciBKUEVHIG1vZHVsZXMgdGhhdCBtYXkgYmUgc3VwcGxpZWQgb3IgY2FsbGVkCisgKiBkaXJlY3RseSBieSB0aGUgc3Vycm91bmRpbmcgYXBwbGljYXRpb24uCisgKiBBcyB3aXRoIGFsbCBvYmplY3RzIGluIHRoZSBKUEVHIGxpYnJhcnksIHRoZXNlIHN0cnVjdHMgb25seSBkZWZpbmUgdGhlCisgKiBwdWJsaWNseSB2aXNpYmxlIG1ldGhvZHMgYW5kIHN0YXRlIHZhcmlhYmxlcyBvZiBhIG1vZHVsZS4gIEFkZGl0aW9uYWwKKyAqIHByaXZhdGUgZmllbGRzIG1heSBleGlzdCBhZnRlciB0aGUgcHVibGljIG9uZXMuCisgKi8KKworCisvKiBFcnJvciBoYW5kbGVyIG9iamVjdCAqLworCitzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgeworICAvKiBFcnJvciBleGl0IGhhbmRsZXI6IGRvZXMgbm90IHJldHVybiB0byBjYWxsZXIgKi8KKyAgSk1FVEhPRCh2b2lkLCBlcnJvcl9leGl0LCAoal9jb21tb25fcHRyIGNpbmZvKSk7CisgIC8qIENvbmRpdGlvbmFsbHkgZW1pdCBhIHRyYWNlIG9yIHdhcm5pbmcgbWVzc2FnZSAqLworICBKTUVUSE9EKHZvaWQsIGVtaXRfbWVzc2FnZSwgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IG1zZ19sZXZlbCkpOworICAvKiBSb3V0aW5lIHRoYXQgYWN0dWFsbHkgb3V0cHV0cyBhIHRyYWNlIG9yIGVycm9yIG1lc3NhZ2UgKi8KKyAgSk1FVEhPRCh2b2lkLCBvdXRwdXRfbWVzc2FnZSwgKGpfY29tbW9uX3B0ciBjaW5mbykpOworICAvKiBGb3JtYXQgYSBtZXNzYWdlIHN0cmluZyBmb3IgdGhlIG1vc3QgcmVjZW50IEpQRUcgZXJyb3Igb3IgbWVzc2FnZSAqLworICBKTUVUSE9EKHZvaWQsIGZvcm1hdF9tZXNzYWdlLCAoal9jb21tb25fcHRyIGNpbmZvLCBjaGFyICogYnVmZmVyKSk7CisjZGVmaW5lIEpNU0dfTEVOR1RIX01BWCAgMjAwCS8qIHJlY29tbWVuZGVkIHNpemUgb2YgZm9ybWF0X21lc3NhZ2UgYnVmZmVyICovCisgIC8qIFJlc2V0IGVycm9yIHN0YXRlIHZhcmlhYmxlcyBhdCBzdGFydCBvZiBhIG5ldyBpbWFnZSAqLworICBKTUVUSE9EKHZvaWQsIHJlc2V0X2Vycm9yX21nciwgKGpfY29tbW9uX3B0ciBjaW5mbykpOworICAKKyAgLyogVGhlIG1lc3NhZ2UgSUQgY29kZSBhbmQgYW55IHBhcmFtZXRlcnMgYXJlIHNhdmVkIGhlcmUuCisgICAqIEEgbWVzc2FnZSBjYW4gaGF2ZSBvbmUgc3RyaW5nIHBhcmFtZXRlciBvciB1cCB0byA4IGludCBwYXJhbWV0ZXJzLgorICAgKi8KKyAgaW50IG1zZ19jb2RlOworI2RlZmluZSBKTVNHX1NUUl9QQVJNX01BWCAgODAKKyAgdW5pb24geworICAgIGludCBpWzhdOworICAgIGNoYXIgc1tKTVNHX1NUUl9QQVJNX01BWF07CisgIH0gbXNnX3Bhcm07CisgIAorICAvKiBTdGFuZGFyZCBzdGF0ZSB2YXJpYWJsZXMgZm9yIGVycm9yIGZhY2lsaXR5ICovCisgIAorICBpbnQgdHJhY2VfbGV2ZWw7CQkvKiBtYXggbXNnX2xldmVsIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgKi8KKyAgCisgIC8qIEZvciByZWNvdmVyYWJsZSBjb3JydXB0LWRhdGEgZXJyb3JzLCB3ZSBlbWl0IGEgd2FybmluZyBtZXNzYWdlLAorICAgKiBidXQga2VlcCBnb2luZyB1bmxlc3MgZW1pdF9tZXNzYWdlIGNob29zZXMgdG8gYWJvcnQuICBlbWl0X21lc3NhZ2UKKyAgICogc2hvdWxkIGNvdW50IHdhcm5pbmdzIGluIG51bV93YXJuaW5ncy4gIFRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbgorICAgKiBjYW4gY2hlY2sgZm9yIGJhZCBkYXRhIGJ5IHNlZWluZyBpZiBudW1fd2FybmluZ3MgaXMgbm9uemVybyBhdCB0aGUKKyAgICogZW5kIG9mIHByb2Nlc3NpbmcuCisgICAqLworICBsb25nIG51bV93YXJuaW5nczsJCS8qIG51bWJlciBvZiBjb3JydXB0LWRhdGEgd2FybmluZ3MgKi8KKworICAvKiBUaGVzZSBmaWVsZHMgcG9pbnQgdG8gdGhlIHRhYmxlKHMpIG9mIGVycm9yIG1lc3NhZ2Ugc3RyaW5ncy4KKyAgICogQW4gYXBwbGljYXRpb24gY2FuIGNoYW5nZSB0aGUgdGFibGUgcG9pbnRlciB0byBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQKKyAgICogbWVzc2FnZSBsaXN0ICh0eXBpY2FsbHksIHRvIGNoYW5nZSB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggZXJyb3JzIGFyZQorICAgKiByZXBvcnRlZCkuICBTb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBhZGQgYWRkaXRpb25hbCBlcnJvciBjb2RlcworICAgKiB0aGF0IHdpbGwgYmUgaGFuZGxlZCBieSB0aGUgSlBFRyBsaWJyYXJ5IGVycm9yIG1lY2hhbmlzbTsgdGhlIHNlY29uZAorICAgKiB0YWJsZSBwb2ludGVyIGlzIHVzZWQgZm9yIHRoaXMgcHVycG9zZS4KKyAgICoKKyAgICogRmlyc3QgdGFibGUgaW5jbHVkZXMgYWxsIGVycm9ycyBnZW5lcmF0ZWQgYnkgSlBFRyBsaWJyYXJ5IGl0c2VsZi4KKyAgICogRXJyb3IgY29kZSAwIGlzIHJlc2VydmVkIGZvciBhICJubyBzdWNoIGVycm9yIHN0cmluZyIgbWVzc2FnZS4KKyAgICovCisgIGNvbnN0IGNoYXIgKiBjb25zdCAqIGpwZWdfbWVzc2FnZV90YWJsZTsgLyogTGlicmFyeSBlcnJvcnMgKi8KKyAgaW50IGxhc3RfanBlZ19tZXNzYWdlOyAgICAvKiBUYWJsZSBjb250YWlucyBzdHJpbmdzIDAuLmxhc3RfanBlZ19tZXNzYWdlICovCisgIC8qIFNlY29uZCB0YWJsZSBjYW4gYmUgYWRkZWQgYnkgYXBwbGljYXRpb24gKHNlZSBjanBlZy9kanBlZyBmb3IgZXhhbXBsZSkuCisgICAqIEl0IGNvbnRhaW5zIHN0cmluZ3MgbnVtYmVyZWQgZmlyc3RfYWRkb25fbWVzc2FnZS4ubGFzdF9hZGRvbl9tZXNzYWdlLgorICAgKi8KKyAgY29uc3QgY2hhciAqIGNvbnN0ICogYWRkb25fbWVzc2FnZV90YWJsZTsgLyogTm9uLWxpYnJhcnkgZXJyb3JzICovCisgIGludCBmaXJzdF9hZGRvbl9tZXNzYWdlOwkvKiBjb2RlIGZvciBmaXJzdCBzdHJpbmcgaW4gYWRkb24gdGFibGUgKi8KKyAgaW50IGxhc3RfYWRkb25fbWVzc2FnZTsJLyogY29kZSBmb3IgbGFzdCBzdHJpbmcgaW4gYWRkb24gdGFibGUgKi8KK307CisKKworLyogUHJvZ3Jlc3MgbW9uaXRvciBvYmplY3QgKi8KKworc3RydWN0IGpwZWdfcHJvZ3Jlc3NfbWdyIHsKKyAgSk1FVEhPRCh2b2lkLCBwcm9ncmVzc19tb25pdG9yLCAoal9jb21tb25fcHRyIGNpbmZvKSk7CisKKyAgbG9uZyBwYXNzX2NvdW50ZXI7CQkvKiB3b3JrIHVuaXRzIGNvbXBsZXRlZCBpbiB0aGlzIHBhc3MgKi8KKyAgbG9uZyBwYXNzX2xpbWl0OwkJLyogdG90YWwgbnVtYmVyIG9mIHdvcmsgdW5pdHMgaW4gdGhpcyBwYXNzICovCisgIGludCBjb21wbGV0ZWRfcGFzc2VzOwkJLyogcGFzc2VzIGNvbXBsZXRlZCBzbyBmYXIgKi8KKyAgaW50IHRvdGFsX3Bhc3NlczsJCS8qIHRvdGFsIG51bWJlciBvZiBwYXNzZXMgZXhwZWN0ZWQgKi8KK307CisKKworLyogRGF0YSBkZXN0aW5hdGlvbiBvYmplY3QgZm9yIGNvbXByZXNzaW9uICovCisKK3N0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21nciB7CisgIEpPQ1RFVCAqIG5leHRfb3V0cHV0X2J5dGU7CS8qID0+IG5leHQgYnl0ZSB0byB3cml0ZSBpbiBidWZmZXIgKi8KKyAgc2l6ZV90IGZyZWVfaW5fYnVmZmVyOwkvKiAjIG9mIGJ5dGUgc3BhY2VzIHJlbWFpbmluZyBpbiBidWZmZXIgKi8KKworICBKTUVUSE9EKHZvaWQsIGluaXRfZGVzdGluYXRpb24sIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKGJvb2xlYW4sIGVtcHR5X291dHB1dF9idWZmZXIsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKHZvaWQsIHRlcm1fZGVzdGluYXRpb24sIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworfTsKKworCisvKiBEYXRhIHNvdXJjZSBvYmplY3QgZm9yIGRlY29tcHJlc3Npb24gKi8KKworc3RydWN0IGpwZWdfc291cmNlX21nciB7CisgIGNvbnN0IEpPQ1RFVCAqIG5leHRfaW5wdXRfYnl0ZTsgLyogPT4gbmV4dCBieXRlIHRvIHJlYWQgZnJvbSBidWZmZXIgKi8KKyAgc2l6ZV90IGJ5dGVzX2luX2J1ZmZlcjsJLyogIyBvZiBieXRlcyByZW1haW5pbmcgaW4gYnVmZmVyICovCisKKyAgSk1FVEhPRCh2b2lkLCBpbml0X3NvdXJjZSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRChib29sZWFuLCBmaWxsX2lucHV0X2J1ZmZlciwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCBza2lwX2lucHV0X2RhdGEsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBsb25nIG51bV9ieXRlcykpOworICBKTUVUSE9EKGJvb2xlYW4sIHJlc3luY190b19yZXN0YXJ0LCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGRlc2lyZWQpKTsKKyAgSk1FVEhPRCh2b2lkLCB0ZXJtX3NvdXJjZSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK307CisKKworLyogTWVtb3J5IG1hbmFnZXIgb2JqZWN0LgorICogQWxsb2NhdGVzICJzbWFsbCIgb2JqZWN0cyAoYSBmZXcgSyB0b3RhbCksICJsYXJnZSIgb2JqZWN0cyAodGVucyBvZiBLKSwKKyAqIGFuZCAicmVhbGx5IGJpZyIgb2JqZWN0cyAodmlydHVhbCBhcnJheXMgd2l0aCBiYWNraW5nIHN0b3JlIGlmIG5lZWRlZCkuCisgKiBUaGUgbWVtb3J5IG1hbmFnZXIgZG9lcyBub3QgYWxsb3cgaW5kaXZpZHVhbCBvYmplY3RzIHRvIGJlIGZyZWVkOyByYXRoZXIsCisgKiBlYWNoIGNyZWF0ZWQgb2JqZWN0IGlzIGFzc2lnbmVkIHRvIGEgcG9vbCwgYW5kIHdob2xlIHBvb2xzIGNhbiBiZSBmcmVlZAorICogYXQgb25jZS4gIFRoaXMgaXMgZmFzdGVyIGFuZCBtb3JlIGNvbnZlbmllbnQgdGhhbiByZW1lbWJlcmluZyBleGFjdGx5IHdoYXQKKyAqIHRvIGZyZWUsIGVzcGVjaWFsbHkgd2hlcmUgbWFsbG9jKCkvZnJlZSgpIGFyZSBub3QgdG9vIHNwZWVkeS4KKyAqIE5COiBhbGxvYyByb3V0aW5lcyBuZXZlciByZXR1cm4gTlVMTC4gIFRoZXkgZXhpdCB0byBlcnJvcl9leGl0IGlmIG5vdAorICogc3VjY2Vzc2Z1bC4KKyAqLworCisjZGVmaW5lIEpQT09MX1BFUk1BTkVOVAkwCS8qIGxhc3RzIHVudGlsIG1hc3RlciByZWNvcmQgaXMgZGVzdHJveWVkICovCisjZGVmaW5lIEpQT09MX0lNQUdFCTEJLyogbGFzdHMgdW50aWwgZG9uZSB3aXRoIGltYWdlL2RhdGFzdHJlYW0gKi8KKyNkZWZpbmUgSlBPT0xfTlVNUE9PTFMJMgorCit0eXBlZGVmIHN0cnVjdCBqdmlydF9zYXJyYXlfY29udHJvbCAqIGp2aXJ0X3NhcnJheV9wdHI7Cit0eXBlZGVmIHN0cnVjdCBqdmlydF9iYXJyYXlfY29udHJvbCAqIGp2aXJ0X2JhcnJheV9wdHI7CisKKworc3RydWN0IGpwZWdfbWVtb3J5X21nciB7CisgIC8qIE1ldGhvZCBwb2ludGVycyAqLworICBKTUVUSE9EKHZvaWQgKiwgYWxsb2Nfc21hbGwsIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLAorCQkJCXNpemVfdCBzaXplb2ZvYmplY3QpKTsKKyAgSk1FVEhPRCh2b2lkICAqLCBhbGxvY19sYXJnZSwgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsCisJCQkJICAgICBzaXplX3Qgc2l6ZW9mb2JqZWN0KSk7CisgIEpNRVRIT0QoSlNBTVBBUlJBWSwgYWxsb2Nfc2FycmF5LCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwKKwkJCQkgICAgIEpESU1FTlNJT04gc2FtcGxlc3BlcnJvdywKKwkJCQkgICAgIEpESU1FTlNJT04gbnVtcm93cykpOworICBKTUVUSE9EKEpCTE9DS0FSUkFZLCBhbGxvY19iYXJyYXksIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLAorCQkJCSAgICAgIEpESU1FTlNJT04gYmxvY2tzcGVycm93LAorCQkJCSAgICAgIEpESU1FTlNJT04gbnVtcm93cykpOworICBKTUVUSE9EKGp2aXJ0X3NhcnJheV9wdHIsIHJlcXVlc3RfdmlydF9zYXJyYXksIChqX2NvbW1vbl9wdHIgY2luZm8sCisJCQkJCQkgIGludCBwb29sX2lkLAorCQkJCQkJICBib29sZWFuIHByZV96ZXJvLAorCQkJCQkJICBKRElNRU5TSU9OIHNhbXBsZXNwZXJyb3csCisJCQkJCQkgIEpESU1FTlNJT04gbnVtcm93cywKKwkJCQkJCSAgSkRJTUVOU0lPTiBtYXhhY2Nlc3MpKTsKKyAgSk1FVEhPRChqdmlydF9iYXJyYXlfcHRyLCByZXF1ZXN0X3ZpcnRfYmFycmF5LCAoal9jb21tb25fcHRyIGNpbmZvLAorCQkJCQkJICBpbnQgcG9vbF9pZCwKKwkJCQkJCSAgYm9vbGVhbiBwcmVfemVybywKKwkJCQkJCSAgSkRJTUVOU0lPTiBibG9ja3NwZXJyb3csCisJCQkJCQkgIEpESU1FTlNJT04gbnVtcm93cywKKwkJCQkJCSAgSkRJTUVOU0lPTiBtYXhhY2Nlc3MpKTsKKyAgSk1FVEhPRCh2b2lkLCByZWFsaXplX3ZpcnRfYXJyYXlzLCAoal9jb21tb25fcHRyIGNpbmZvKSk7CisgIEpNRVRIT0QoSlNBTVBBUlJBWSwgYWNjZXNzX3ZpcnRfc2FycmF5LCAoal9jb21tb25fcHRyIGNpbmZvLAorCQkJCQkgICBqdmlydF9zYXJyYXlfcHRyIHB0ciwKKwkJCQkJICAgSkRJTUVOU0lPTiBzdGFydF9yb3csCisJCQkJCSAgIEpESU1FTlNJT04gbnVtX3Jvd3MsCisJCQkJCSAgIGJvb2xlYW4gd3JpdGFibGUpKTsKKyAgSk1FVEhPRChKQkxPQ0tBUlJBWSwgYWNjZXNzX3ZpcnRfYmFycmF5LCAoal9jb21tb25fcHRyIGNpbmZvLAorCQkJCQkgICAganZpcnRfYmFycmF5X3B0ciBwdHIsCisJCQkJCSAgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywKKwkJCQkJICAgIEpESU1FTlNJT04gbnVtX3Jvd3MsCisJCQkJCSAgICBib29sZWFuIHdyaXRhYmxlKSk7CisgIEpNRVRIT0Qodm9pZCwgZnJlZV9wb29sLCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCkpOworICBKTUVUSE9EKHZvaWQsIHNlbGZfZGVzdHJ1Y3QsIChqX2NvbW1vbl9wdHIgY2luZm8pKTsKKworICAvKiBMaW1pdCBvbiBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgdGhpcyBKUEVHIG9iamVjdC4gIChOb3RlIHRoYXQgdGhpcyBpcworICAgKiBtZXJlbHkgYWR2aXNvcnksIG5vdCBhIGd1YXJhbnRlZWQgbWF4aW11bTsgaXQgb25seSBhZmZlY3RzIHRoZSBzcGFjZQorICAgKiB1c2VkIGZvciB2aXJ0dWFsLWFycmF5IGJ1ZmZlcnMuKSAgTWF5IGJlIGNoYW5nZWQgYnkgb3V0ZXIgYXBwbGljYXRpb24KKyAgICogYWZ0ZXIgY3JlYXRpbmcgdGhlIEpQRUcgb2JqZWN0LgorICAgKi8KKyAgbG9uZyBtYXhfbWVtb3J5X3RvX3VzZTsKKworICAvKiBNYXhpbXVtIGFsbG9jYXRpb24gcmVxdWVzdCBhY2NlcHRlZCBieSBhbGxvY19sYXJnZS4gKi8KKyAgbG9uZyBtYXhfYWxsb2NfY2h1bms7Cit9OworCisKKy8qIFJvdXRpbmUgc2lnbmF0dXJlIGZvciBhcHBsaWNhdGlvbi1zdXBwbGllZCBtYXJrZXIgcHJvY2Vzc2luZyBtZXRob2RzLgorICogTmVlZCBub3QgcGFzcyBtYXJrZXIgY29kZSBzaW5jZSBpdCBpcyBzdG9yZWQgaW4gY2luZm8tPnVucmVhZF9tYXJrZXIuCisgKi8KK3R5cGVkZWYgSk1FVEhPRChib29sZWFuLCBqcGVnX21hcmtlcl9wYXJzZXJfbWV0aG9kLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworCisKKy8qIERlY2xhcmF0aW9ucyBmb3Igcm91dGluZXMgY2FsbGVkIGJ5IGFwcGxpY2F0aW9uLgorICogVGhlIEpQUCBtYWNybyBoaWRlcyBwcm90b3R5cGUgcGFyYW1ldGVycyBmcm9tIGNvbXBpbGVycyB0aGF0IGNhbid0IGNvcGUuCisgKiBOb3RlIEpQUCByZXF1aXJlcyBkb3VibGUgcGFyZW50aGVzZXMuCisgKi8KKworI2lmZGVmIEhBVkVfUFJPVE9UWVBFUworI2RlZmluZSBKUFAoYXJnbGlzdCkJYXJnbGlzdAorI2Vsc2UKKyNkZWZpbmUgSlBQKGFyZ2xpc3QpCSgpCisjZW5kaWYKKworCisvKiBTaG9ydCBmb3JtcyBvZiBleHRlcm5hbCBuYW1lcyBmb3Igc3lzdGVtcyB3aXRoIGJyYWluLWRhbWFnZWQgbGlua2Vycy4KKyAqIFdlIHNob3J0ZW4gZXh0ZXJuYWwgbmFtZXMgdG8gYmUgdW5pcXVlIGluIHRoZSBmaXJzdCBzaXggbGV0dGVycywgd2hpY2gKKyAqIGlzIGdvb2QgZW5vdWdoIGZvciBhbGwga25vd24gc3lzdGVtcy4KKyAqIChJZiB5b3VyIGNvbXBpbGVyIGl0c2VsZiBuZWVkcyBuYW1lcyB0byBiZSB1bmlxdWUgaW4gbGVzcyB0aGFuIDE1IAorICogY2hhcmFjdGVycywgeW91IGFyZSBvdXQgb2YgbHVjay4gIEdldCBhIGJldHRlciBjb21waWxlci4pCisgKi8KKworI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyNkZWZpbmUganBlZ19zdGRfZXJyb3IJCWpTdGRFcnJvcgorI2RlZmluZSBqcGVnX0NyZWF0ZUNvbXByZXNzCWpDcmVhQ29tcHJlc3MKKyNkZWZpbmUganBlZ19DcmVhdGVEZWNvbXByZXNzCWpDcmVhRGVjb21wcmVzcworI2RlZmluZSBqcGVnX2Rlc3Ryb3lfY29tcHJlc3MJakRlc3RDb21wcmVzcworI2RlZmluZSBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcwlqRGVzdERlY29tcHJlc3MKKyNkZWZpbmUganBlZ19zdGRpb19kZXN0CQlqU3RkRGVzdAorI2RlZmluZSBqcGVnX3N0ZGlvX3NyYwkJalN0ZFNyYworI2RlZmluZSBqcGVnX3NldF9kZWZhdWx0cwlqU2V0RGVmYXVsdHMKKyNkZWZpbmUganBlZ19zZXRfY29sb3JzcGFjZQlqU2V0Q29sb3JzcGFjZQorI2RlZmluZSBqcGVnX2RlZmF1bHRfY29sb3JzcGFjZQlqRGVmQ29sb3JzcGFjZQorI2RlZmluZSBqcGVnX3NldF9xdWFsaXR5CWpTZXRRdWFsaXR5CisjZGVmaW5lIGpwZWdfc2V0X2xpbmVhcl9xdWFsaXR5CWpTZXRMUXVhbGl0eQorI2RlZmluZSBqcGVnX2FkZF9xdWFudF90YWJsZQlqQWRkUXVhbnRUYWJsZQorI2RlZmluZSBqcGVnX3F1YWxpdHlfc2NhbGluZwlqUXVhbGl0eVNjYWxpbmcKKyNkZWZpbmUganBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24JalNpbVByb2dyZXNzCisjZGVmaW5lIGpwZWdfc3VwcHJlc3NfdGFibGVzCWpTdXBwcmVzc1RhYmxlcworI2RlZmluZSBqcGVnX2FsbG9jX3F1YW50X3RhYmxlCWpBbGNRVGFibGUKKyNkZWZpbmUganBlZ19hbGxvY19odWZmX3RhYmxlCWpBbGNIVGFibGUKKyNkZWZpbmUganBlZ19zdGFydF9jb21wcmVzcwlqU3RydENvbXByZXNzCisjZGVmaW5lIGpwZWdfd3JpdGVfc2NhbmxpbmVzCWpXcnRTY2FubGluZXMKKyNkZWZpbmUganBlZ19maW5pc2hfY29tcHJlc3MJakZpbkNvbXByZXNzCisjZGVmaW5lIGpwZWdfd3JpdGVfcmF3X2RhdGEJaldydFJhd0RhdGEKKyNkZWZpbmUganBlZ193cml0ZV9tYXJrZXIJaldydE1hcmtlcgorI2RlZmluZSBqcGVnX3dyaXRlX21faGVhZGVyCWpXcnRNSGVhZGVyCisjZGVmaW5lIGpwZWdfd3JpdGVfbV9ieXRlCWpXcnRNQnl0ZQorI2RlZmluZSBqcGVnX3dyaXRlX3RhYmxlcwlqV3J0VGFibGVzCisjZGVmaW5lIGpwZWdfcmVhZF9oZWFkZXIJalJlYWRIZWFkZXIKKyNkZWZpbmUganBlZ19zdGFydF9kZWNvbXByZXNzCWpTdHJ0RGVjb21wcmVzcworI2RlZmluZSBqcGVnX3JlYWRfc2NhbmxpbmVzCWpSZWFkU2NhbmxpbmVzCisjZGVmaW5lIGpwZWdfZmluaXNoX2RlY29tcHJlc3MJakZpbkRlY29tcHJlc3MKKyNkZWZpbmUganBlZ19yZWFkX3Jhd19kYXRhCWpSZWFkUmF3RGF0YQorI2RlZmluZSBqcGVnX2hhc19tdWx0aXBsZV9zY2FucwlqSGFzTXVsdFNjbgorI2RlZmluZSBqcGVnX3N0YXJ0X291dHB1dAlqU3RydE91dHB1dAorI2RlZmluZSBqcGVnX2ZpbmlzaF9vdXRwdXQJakZpbk91dHB1dAorI2RlZmluZSBqcGVnX2lucHV0X2NvbXBsZXRlCWpJbkNvbXBsZXRlCisjZGVmaW5lIGpwZWdfbmV3X2NvbG9ybWFwCWpOZXdDTWFwCisjZGVmaW5lIGpwZWdfY29uc3VtZV9pbnB1dAlqQ29uc3VtZUlucHV0CisjZGVmaW5lIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucwlqQ2FsY0RpbWVuc2lvbnMKKyNkZWZpbmUganBlZ19zYXZlX21hcmtlcnMJalNhdmVNYXJrZXJzCisjZGVmaW5lIGpwZWdfc2V0X21hcmtlcl9wcm9jZXNzb3IJalNldE1hcmtlcgorI2RlZmluZSBqcGVnX3JlYWRfY29lZmZpY2llbnRzCWpSZWFkQ29lZnMKKyNkZWZpbmUganBlZ193cml0ZV9jb2VmZmljaWVudHMJaldydENvZWZzCisjZGVmaW5lIGpwZWdfY29weV9jcml0aWNhbF9wYXJhbWV0ZXJzCWpDb3B5Q3JpdAorI2RlZmluZSBqcGVnX2Fib3J0X2NvbXByZXNzCWpBYnJ0Q29tcHJlc3MKKyNkZWZpbmUganBlZ19hYm9ydF9kZWNvbXByZXNzCWpBYnJ0RGVjb21wcmVzcworI2RlZmluZSBqcGVnX2Fib3J0CQlqQWJvcnQKKyNkZWZpbmUganBlZ19kZXN0cm95CQlqRGVzdHJveQorI2RlZmluZSBqcGVnX3Jlc3luY190b19yZXN0YXJ0CWpSZXN5bmNSZXN0YXJ0CisjZW5kaWYgLyogTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyAqLworCisKKy8qIERlZmF1bHQgZXJyb3ItbWFuYWdlbWVudCBzZXR1cCAqLworRVhURVJOKHN0cnVjdCBqcGVnX2Vycm9yX21nciAqKSBqcGVnX3N0ZF9lcnJvcgorCUpQUCgoc3RydWN0IGpwZWdfZXJyb3JfbWdyICogZXJyKSk7CisKKy8qIEluaXRpYWxpemF0aW9uIG9mIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0cy4KKyAqIGpwZWdfY3JlYXRlX2NvbXByZXNzKCkgYW5kIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoKSBhcmUgdGhlIGV4cG9ydGVkCisgKiBuYW1lcyB0aGF0IGFwcGxpY2F0aW9ucyBzaG91bGQgY2FsbC4gIFRoZXNlIGV4cGFuZCB0byBjYWxscyBvbgorICoganBlZ19DcmVhdGVDb21wcmVzcyBhbmQganBlZ19DcmVhdGVEZWNvbXByZXNzIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcGFzc2VkIGZvciB2ZXJzaW9uIG1pc21hdGNoIGNoZWNraW5nLgorICogTkI6IHlvdSBtdXN0IHNldCB1cCB0aGUgZXJyb3ItbWFuYWdlciBCRUZPUkUgY2FsbGluZyBqcGVnX2NyZWF0ZV94eHguCisgKi8KKyNkZWZpbmUganBlZ19jcmVhdGVfY29tcHJlc3MoY2luZm8pIFwKKyAgICBqcGVnX0NyZWF0ZUNvbXByZXNzKChjaW5mbyksIEpQRUdfTElCX1ZFUlNJT04sIFwKKwkJCShzaXplX3QpIHNpemVvZihzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QpKQorI2RlZmluZSBqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKGNpbmZvKSBcCisgICAganBlZ19DcmVhdGVEZWNvbXByZXNzKChjaW5mbyksIEpQRUdfTElCX1ZFUlNJT04sIFwKKwkJCSAgKHNpemVfdCkgc2l6ZW9mKHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KSkKK0VYVEVSTih2b2lkKSBqcGVnX0NyZWF0ZUNvbXByZXNzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJICAgICAgaW50IHZlcnNpb24sIHNpemVfdCBzdHJ1Y3RzaXplKSk7CitFWFRFUk4odm9pZCkganBlZ19DcmVhdGVEZWNvbXByZXNzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJaW50IHZlcnNpb24sIHNpemVfdCBzdHJ1Y3RzaXplKSk7CisvKiBEZXN0cnVjdGlvbiBvZiBKUEVHIGNvbXByZXNzaW9uIG9iamVjdHMgKi8KK0VYVEVSTih2b2lkKSBqcGVnX2Rlc3Ryb3lfY29tcHJlc3MgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworCisjaWYgMAorLyogU3RhbmRhcmQgZGF0YSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG1hbmFnZXJzOiBzdGRpbyBzdHJlYW1zLiAqLworLyogQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBvcGVuaW5nIHRoZSBmaWxlIGJlZm9yZSBhbmQgY2xvc2luZyBhZnRlci4gKi8KK0VYVEVSTih2b2lkKSBqcGVnX3N0ZGlvX2Rlc3QgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgRlhTWVNfRklMRSAqIG91dGZpbGUpKTsKK0VYVEVSTih2b2lkKSBqcGVnX3N0ZGlvX3NyYyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEZYU1lTX0ZJTEUgKiBpbmZpbGUpKTsKKyNlbmRpZgorCisvKiBEZWZhdWx0IHBhcmFtZXRlciBzZXR1cCBmb3IgY29tcHJlc3Npb24gKi8KK0VYVEVSTih2b2lkKSBqcGVnX3NldF9kZWZhdWx0cyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisvKiBDb21wcmVzc2lvbiBwYXJhbWV0ZXIgc2V0dXAgYWlkcyAqLworRVhURVJOKHZvaWQpIGpwZWdfc2V0X2NvbG9yc3BhY2UgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkgICAgICBKX0NPTE9SX1NQQUNFIGNvbG9yc3BhY2UpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2RlZmF1bHRfY29sb3JzcGFjZSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkganBlZ19zZXRfcXVhbGl0eSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgcXVhbGl0eSwKKwkJCQkgICBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKSk7CitFWFRFUk4odm9pZCkganBlZ19zZXRfbGluZWFyX3F1YWxpdHkgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICBpbnQgc2NhbGVfZmFjdG9yLAorCQkJCQkgIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2FkZF9xdWFudF90YWJsZSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgd2hpY2hfdGJsLAorCQkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgKmJhc2ljX3RhYmxlLAorCQkJCSAgICAgICBpbnQgc2NhbGVfZmFjdG9yLAorCQkJCSAgICAgICBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKSk7CitFWFRFUk4oaW50KSBqcGVnX3F1YWxpdHlfc2NhbGluZyBKUFAoKGludCBxdWFsaXR5KSk7CitFWFRFUk4odm9pZCkganBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24gSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGpwZWdfc3VwcHJlc3NfdGFibGVzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJICAgICAgIGJvb2xlYW4gc3VwcHJlc3MpKTsKK0VYVEVSTihKUVVBTlRfVEJMICopIGpwZWdfYWxsb2NfcXVhbnRfdGFibGUgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKK0VYVEVSTihKSFVGRl9UQkwgKikganBlZ19hbGxvY19odWZmX3RhYmxlIEpQUCgoal9jb21tb25fcHRyIGNpbmZvKSk7CisKKy8qIE1haW4gZW50cnkgcG9pbnRzIGZvciBjb21wcmVzc2lvbiAqLworRVhURVJOKHZvaWQpIGpwZWdfc3RhcnRfY29tcHJlc3MgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkgICAgICBib29sZWFuIHdyaXRlX2FsbF90YWJsZXMpKTsKK0VYVEVSTihKRElNRU5TSU9OKSBqcGVnX3dyaXRlX3NjYW5saW5lcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgIEpTQU1QQVJSQVkgc2NhbmxpbmVzLAorCQkJCQkgICAgIEpESU1FTlNJT04gbnVtX2xpbmVzKSk7CitFWFRFUk4odm9pZCkganBlZ19maW5pc2hfY29tcHJlc3MgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworCisvKiBSZXBsYWNlcyBqcGVnX3dyaXRlX3NjYW5saW5lcyB3aGVuIHdyaXRpbmcgcmF3IGRvd25zYW1wbGVkIGRhdGEuICovCitFWFRFUk4oSkRJTUVOU0lPTikganBlZ193cml0ZV9yYXdfZGF0YSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgSlNBTVBJTUFHRSBkYXRhLAorCQkJCQkgICAgSkRJTUVOU0lPTiBudW1fbGluZXMpKTsKKworLyogV3JpdGUgYSBzcGVjaWFsIG1hcmtlci4gIFNlZSBsaWJqcGVnLmRvYyBjb25jZXJuaW5nIHNhZmUgdXNhZ2UuICovCitFWFRFUk4odm9pZCkganBlZ193cml0ZV9tYXJrZXIKKwlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyLAorCSAgICAgY29uc3QgSk9DVEVUICogZGF0YXB0ciwgdW5zaWduZWQgaW50IGRhdGFsZW4pKTsKKy8qIFNhbWUsIGJ1dCBwaWVjZW1lYWwuICovCitFWFRFUk4odm9pZCkganBlZ193cml0ZV9tX2hlYWRlcgorCUpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXIsIHVuc2lnbmVkIGludCBkYXRhbGVuKSk7CitFWFRFUk4odm9pZCkganBlZ193cml0ZV9tX2J5dGUKKwlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgdmFsKSk7CisKKy8qIEFsdGVybmF0ZSBjb21wcmVzc2lvbiBmdW5jdGlvbjoganVzdCB3cml0ZSBhbiBhYmJyZXZpYXRlZCB0YWJsZSBmaWxlICovCitFWFRFUk4odm9pZCkganBlZ193cml0ZV90YWJsZXMgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworCisvKiBEZWNvbXByZXNzaW9uIHN0YXJ0dXA6IHJlYWQgc3RhcnQgb2YgSlBFRyBkYXRhc3RyZWFtIHRvIHNlZSB3aGF0J3MgdGhlcmUgKi8KK0VYVEVSTihpbnQpIGpwZWdfcmVhZF9oZWFkZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCSAgYm9vbGVhbiByZXF1aXJlX2ltYWdlKSk7CisvKiBSZXR1cm4gdmFsdWUgaXMgb25lIG9mOiAqLworI2RlZmluZSBKUEVHX1NVU1BFTkRFRAkJMCAvKiBTdXNwZW5kZWQgZHVlIHRvIGxhY2sgb2YgaW5wdXQgZGF0YSAqLworI2RlZmluZSBKUEVHX0hFQURFUl9PSwkJMSAvKiBGb3VuZCB2YWxpZCBpbWFnZSBkYXRhc3RyZWFtICovCisjZGVmaW5lIEpQRUdfSEVBREVSX1RBQkxFU19PTkxZCTIgLyogRm91bmQgdmFsaWQgdGFibGUtc3BlY3Mtb25seSBkYXRhc3RyZWFtICovCisvKiBJZiB5b3UgcGFzcyByZXF1aXJlX2ltYWdlID0gVFJVRSAobm9ybWFsIGNhc2UpLCB5b3UgbmVlZCBub3QgY2hlY2sgZm9yCisgKiBhIFRBQkxFU19PTkxZIHJldHVybiBjb2RlOyBhbiBhYmJyZXZpYXRlZCBmaWxlIHdpbGwgY2F1c2UgYW4gZXJyb3IgZXhpdC4KKyAqIEpQRUdfU1VTUEVOREVEIGlzIG9ubHkgcG9zc2libGUgaWYgeW91IHVzZSBhIGRhdGEgc291cmNlIG1vZHVsZSB0aGF0IGNhbgorICogZ2l2ZSBhIHN1c3BlbnNpb24gcmV0dXJuICh0aGUgc3RkaW8gc291cmNlIG1vZHVsZSBkb2Vzbid0KS4KKyAqLworCisvKiBNYWluIGVudHJ5IHBvaW50cyBmb3IgZGVjb21wcmVzc2lvbiAqLworRVhURVJOKGJvb2xlYW4pIGpwZWdfc3RhcnRfZGVjb21wcmVzcyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTihKRElNRU5TSU9OKSBqcGVnX3JlYWRfc2NhbmxpbmVzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICAgIEpTQU1QQVJSQVkgc2NhbmxpbmVzLAorCQkJCQkgICAgSkRJTUVOU0lPTiBtYXhfbGluZXMpKTsKK0VYVEVSTihib29sZWFuKSBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworCisvKiBSZXBsYWNlcyBqcGVnX3JlYWRfc2NhbmxpbmVzIHdoZW4gcmVhZGluZyByYXcgZG93bnNhbXBsZWQgZGF0YS4gKi8KK0VYVEVSTihKRElNRU5TSU9OKSBqcGVnX3JlYWRfcmF3X2RhdGEgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICBKU0FNUElNQUdFIGRhdGEsCisJCQkJCSAgIEpESU1FTlNJT04gbWF4X2xpbmVzKSk7CisKKy8qIEFkZGl0aW9uYWwgZW50cnkgcG9pbnRzIGZvciBidWZmZXJlZC1pbWFnZSBtb2RlLiAqLworRVhURVJOKGJvb2xlYW4pIGpwZWdfaGFzX211bHRpcGxlX3NjYW5zIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKGJvb2xlYW4pIGpwZWdfc3RhcnRfb3V0cHV0IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkgICAgICAgaW50IHNjYW5fbnVtYmVyKSk7CitFWFRFUk4oYm9vbGVhbikganBlZ19maW5pc2hfb3V0cHV0IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKGJvb2xlYW4pIGpwZWdfaW5wdXRfY29tcGxldGUgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkganBlZ19uZXdfY29sb3JtYXAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4oaW50KSBqcGVnX2NvbnN1bWVfaW5wdXQgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisvKiBSZXR1cm4gdmFsdWUgaXMgb25lIG9mOiAqLworLyogI2RlZmluZSBKUEVHX1NVU1BFTkRFRAkwICAgIFN1c3BlbmRlZCBkdWUgdG8gbGFjayBvZiBpbnB1dCBkYXRhICovCisjZGVmaW5lIEpQRUdfUkVBQ0hFRF9TT1MJMSAvKiBSZWFjaGVkIHN0YXJ0IG9mIG5ldyBzY2FuICovCisjZGVmaW5lIEpQRUdfUkVBQ0hFRF9FT0kJMiAvKiBSZWFjaGVkIGVuZCBvZiBpbWFnZSAqLworI2RlZmluZSBKUEVHX1JPV19DT01QTEVURUQJMyAvKiBDb21wbGV0ZWQgb25lIGlNQ1Ugcm93ICovCisjZGVmaW5lIEpQRUdfU0NBTl9DT01QTEVURUQJNCAvKiBDb21wbGV0ZWQgbGFzdCBpTUNVIHJvdyBvZiBhIHNjYW4gKi8KKworLyogUHJlY2FsY3VsYXRlIG91dHB1dCBkaW1lbnNpb25zIGZvciBjdXJyZW50IGRlY29tcHJlc3Npb24gcGFyYW1ldGVycy4gKi8KK0VYVEVSTih2b2lkKSBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisKKy8qIENvbnRyb2wgc2F2aW5nIG9mIENPTSBhbmQgQVBQbiBtYXJrZXJzIGludG8gbWFya2VyX2xpc3QuICovCitFWFRFUk4odm9pZCkganBlZ19zYXZlX21hcmtlcnMKKwlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXJfY29kZSwKKwkgICAgIHVuc2lnbmVkIGludCBsZW5ndGhfbGltaXQpKTsKKworLyogSW5zdGFsbCBhIHNwZWNpYWwgcHJvY2Vzc2luZyBtZXRob2QgZm9yIENPTSBvciBBUFBuIG1hcmtlcnMuICovCitFWFRFUk4odm9pZCkganBlZ19zZXRfbWFya2VyX3Byb2Nlc3NvcgorCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlcl9jb2RlLAorCSAgICAganBlZ19tYXJrZXJfcGFyc2VyX21ldGhvZCByb3V0aW5lKSk7CisKKy8qIFJlYWQgb3Igd3JpdGUgcmF3IERDVCBjb2VmZmljaWVudHMgLS0tIHVzZWZ1bCBmb3IgbG9zc2xlc3MgdHJhbnNjb2RpbmcuICovCitFWFRFUk4oanZpcnRfYmFycmF5X3B0ciAqKSBqcGVnX3JlYWRfY29lZmZpY2llbnRzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAganZpcnRfYmFycmF5X3B0ciAqIGNvZWZfYXJyYXlzKSk7CitFWFRFUk4odm9pZCkganBlZ19jb3B5X2NyaXRpY2FsX3BhcmFtZXRlcnMgSlBQKChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sCisJCQkJCQlqX2NvbXByZXNzX3B0ciBkc3RpbmZvKSk7CisKKy8qIElmIHlvdSBjaG9vc2UgdG8gYWJvcnQgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBiZWZvcmUgY29tcGxldGluZworICoganBlZ19maW5pc2hfKGRlKWNvbXByZXNzLCB0aGVuIHlvdSBuZWVkIHRvIGNsZWFuIHVwIHRvIHJlbGVhc2UgbWVtb3J5LAorICogdGVtcG9yYXJ5IGZpbGVzLCBldGMuICBZb3UgY2FuIGp1c3QgY2FsbCBqcGVnX2Rlc3Ryb3lfKGRlKWNvbXByZXNzCisgKiBpZiB5b3UncmUgZG9uZSB3aXRoIHRoZSBKUEVHIG9iamVjdCwgYnV0IGlmIHlvdSB3YW50IHRvIGNsZWFuIGl0IHVwIGFuZAorICogcmV1c2UgaXQsIGNhbGwgdGhpczoKKyAqLworRVhURVJOKHZvaWQpIGpwZWdfYWJvcnRfY29tcHJlc3MgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGpwZWdfYWJvcnRfZGVjb21wcmVzcyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKworLyogR2VuZXJpYyB2ZXJzaW9ucyBvZiBqcGVnX2Fib3J0IGFuZCBqcGVnX2Rlc3Ryb3kgdGhhdCB3b3JrIG9uIGVpdGhlcgorICogZmxhdm9yIG9mIEpQRUcgb2JqZWN0LiAgVGhlc2UgbWF5IGJlIG1vcmUgY29udmVuaWVudCBpbiBzb21lIHBsYWNlcy4KKyAqLworRVhURVJOKHZvaWQpIGpwZWdfYWJvcnQgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqcGVnX2Rlc3Ryb3kgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKKworLyogRGVmYXVsdCByZXN0YXJ0LW1hcmtlci1yZXN5bmMgcHJvY2VkdXJlIGZvciB1c2UgYnkgZGF0YSBzb3VyY2UgbW9kdWxlcyAqLworRVhURVJOKGJvb2xlYW4pIGpwZWdfcmVzeW5jX3RvX3Jlc3RhcnQgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgaW50IGRlc2lyZWQpKTsKKworCisvKiBUaGVzZSBtYXJrZXIgY29kZXMgYXJlIGV4cG9ydGVkIHNpbmNlIGFwcGxpY2F0aW9ucyBhbmQgZGF0YSBzb3VyY2UgbW9kdWxlcworICogYXJlIGxpa2VseSB0byB3YW50IHRvIHVzZSB0aGVtLgorICovCisKKyNkZWZpbmUgSlBFR19SU1QwCTB4RDAJLyogUlNUMCBtYXJrZXIgY29kZSAqLworI2RlZmluZSBKUEVHX0VPSQkweEQ5CS8qIEVPSSBtYXJrZXIgY29kZSAqLworI2RlZmluZSBKUEVHX0FQUDAJMHhFMAkvKiBBUFAwIG1hcmtlciBjb2RlICovCisjZGVmaW5lIEpQRUdfQ09NCTB4RkUJLyogQ09NIG1hcmtlciBjb2RlICovCisKKworLyogSWYgd2UgaGF2ZSBhIGJyYWluLWRhbWFnZWQgY29tcGlsZXIgdGhhdCBlbWl0cyB3YXJuaW5ncyAob3Igd29yc2UsIGVycm9ycykKKyAqIGZvciBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgdGhhdCBhcmUgbmV2ZXIgZmlsbGVkIGluLCBrZWVwIGl0IHF1aWV0IGJ5CisgKiBzdXBwbHlpbmcgZHVtbXkgZGVmaW5pdGlvbnMgZm9yIHRoZSB2YXJpb3VzIHN1YnN0cnVjdHVyZXMuCisgKi8KKworI2lmZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCisjaWZuZGVmIEpQRUdfSU5URVJOQUxTCQkvKiB3aWxsIGJlIGRlZmluZWQgaW4ganBlZ2ludC5oICovCitzdHJ1Y3QganZpcnRfc2FycmF5X2NvbnRyb2wgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGp2aXJ0X2JhcnJheV9jb250cm9sIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX2NvbXBfbWFzdGVyIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX2NfbWFpbl9jb250cm9sbGVyIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX2NfcHJlcF9jb250cm9sbGVyIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX21hcmtlcl93cml0ZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfY29sb3JfY29udmVydGVyIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX2Rvd25zYW1wbGVyIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX2ZvcndhcmRfZGN0IHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19kZWNvbXBfbWFzdGVyIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX2RfbWFpbl9jb250cm9sbGVyIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX2RfY29lZl9jb250cm9sbGVyIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX2RfcG9zdF9jb250cm9sbGVyIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX2lucHV0X2NvbnRyb2xsZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfbWFya2VyX3JlYWRlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19lbnRyb3B5X2RlY29kZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfaW52ZXJzZV9kY3QgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfdXBzYW1wbGVyIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX2NvbG9yX2RlY29udmVydGVyIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX2NvbG9yX3F1YW50aXplciB7IGxvbmcgZHVtbXk7IH07CisjZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KKyNlbmRpZiAvKiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTiAqLworCisKKy8qCisgKiBUaGUgSlBFRyBsaWJyYXJ5IG1vZHVsZXMgZGVmaW5lIEpQRUdfSU5URVJOQUxTIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmaWxlLgorICogVGhlIGludGVybmFsIHN0cnVjdHVyZSBkZWNsYXJhdGlvbnMgYXJlIHJlYWQgb25seSB3aGVuIHRoYXQgaXMgdHJ1ZS4KKyAqIEFwcGxpY2F0aW9ucyB1c2luZyB0aGUgbGlicmFyeSBzaG91bGQgbm90IGluY2x1ZGUganBlZ2ludC5oLCBidXQgbWF5IHdpc2gKKyAqIHRvIGluY2x1ZGUgamVycm9yLmguCisgKi8KKworI2lmZGVmIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAianBlZ2ludC5oIgkJLyogZmV0Y2ggcHJpdmF0ZSBkZWNsYXJhdGlvbnMgKi8KKyNpbmNsdWRlICJqZXJyb3IuaCIJCS8qIGZldGNoIGVycm9yIGNvZGVzIHRvbyAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBKUEVHTElCX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvbGlianBlZy9qdmVyc2lvbi5oIGIvdGhpcmRfcGFydHkvbGlianBlZy9qdmVyc2lvbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvanZlcnNpb24uaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGlianBlZy9qdmVyc2lvbi5oCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2xpYmpwZWcvdHJhbnN1cHAuaCBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvdHJhbnN1cHAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9saWJqcGVnL3RyYW5zdXBwLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYmpwZWcvdHJhbnN1cHAuaApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDAwLXVzZS1jb2xvcnNwYWNlLnBhdGNoIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDAwLXVzZS1jb2xvcnNwYWNlLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MDY5MmMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMDAtdXNlLWNvbG9yc3BhY2UucGF0Y2gKQEAgLTAsMCArMSwyNyBAQAorZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvanAyLmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2pwMi5jCitpbmRleCA4YmY2MGY2Li40N2Y4M2ExIDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuYworKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuYworQEAgLTE1MDgsNyArMTUwOCw3IEBAIE9QSl9CT09MIG9wal9qcDJfZGVjb2RlKG9wal9qcDJfdCAqanAyLAorIAkJCS8qIFBhcnQgMSwgSS41LjMuNDogRWl0aGVyIGJvdGggb3Igbm9uZSA6ICovCisgCQkJaWYoICFqcDItPmNvbG9yLmpwMl9wY2xyLT5jbWFwKQorIAkJCQlvcGpfanAyX2ZyZWVfcGNscigmKGpwMi0+Y29sb3IpKTsKKy0JCQllbHNlCisrCQkJZWxzZSBpZiAocF9pbWFnZS0+cGRmaXVtX3VzZV9jb2xvcnNwYWNlKQorIAkJCQlvcGpfanAyX2FwcGx5X3BjbHIocF9pbWFnZSwgJihqcDItPmNvbG9yKSk7CisgCQl9CisgCitkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGVuanBlZy5oIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGVuanBlZy5oCitpbmRleCBjMDdlOWM4Li5lNTcxNjcyIDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGVuanBlZy5oCisrKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wZW5qcGVnLmgKK0BAIC02NzcsNiArNjc3LDkgQEAgdHlwZWRlZiBzdHJ1Y3Qgb3BqX2ltYWdlIHsKKyAJT1BKX0JZVEUgKmljY19wcm9maWxlX2J1ZjsKKyAJLyoqIHNpemUgb2YgSUNDIHByb2ZpbGUgKi8KKyAJT1BKX1VJTlQzMiBpY2NfcHJvZmlsZV9sZW47CisrCisrCS8qKiBXaGV0aGVyIHRvIGFwcGx5IFBDTFIgb3Igbm90ICovCisrCU9QSl9CT09MIHBkZml1bV91c2VfY29sb3JzcGFjZTsKKyB9IG9wal9pbWFnZV90OworIAorIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDAxLWltYWdlLWRhdGEucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMDEtaW1hZ2UtZGF0YS5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWUwMTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDAxLWltYWdlLWRhdGEucGF0Y2gKQEAgLTAsMCArMSwyNiBAQAorZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvajJrLmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2oyay5jCitpbmRleCBlNjEyZDA2Li5kNTE1Nzk4IDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qMmsuYworKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qMmsuYworQEAgLTgxNDgsMTEgKzgxNDgsMTYgQEAgc3RhdGljIE9QSl9CT09MIG9wal9qMmtfdXBkYXRlX2ltYWdlX2RhdGEgKG9wal90Y2RfdCAqIHBfdGNkLCBPUEpfQllURSAqIHBfZGF0YSwKKyAKKyAgICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgb3V0cHV0IGNvbXBvbmVudCBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCisgICAgICAgICAgICAgICAgIGlmICghbF9pbWdfY29tcF9kZXN0LT5kYXRhKSB7CistCistICAgICAgICAgICAgICAgICAgICAgICAgbF9pbWdfY29tcF9kZXN0LT5kYXRhID0gKE9QSl9JTlQzMiopIG9wal9jYWxsb2MoKE9QSl9TSVpFX1QpbF9pbWdfY29tcF9kZXN0LT53ICogKE9QSl9TSVpFX1QpbF9pbWdfY29tcF9kZXN0LT5oLCBzaXplb2YoT1BKX0lOVDMyKSk7CistICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbF9pbWdfY29tcF9kZXN0LT5kYXRhKSB7CistICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKysgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgd2lkdGggPSBsX2ltZ19jb21wX2Rlc3QtPnc7CisrICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGhlaWdodCA9IGxfaW1nX2NvbXBfZGVzdC0+aDsKKysgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9QSl9VSU5UMzIgTUFYX1NJWkUgPSBVSU5UMzJfTUFYIC8gc2l6ZW9mKE9QSl9JTlQzMik7CisrICAgICAgICAgICAgICAgICAgICBpZiAoaGVpZ2h0ID09IDAgfHwgd2lkdGggPiBNQVhfU0laRSAvIGhlaWdodCkgeworKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisrICAgICAgICAgICAgICAgICAgICB9CisrICAgICAgICAgICAgICAgICAgICBsX2ltZ19jb21wX2Rlc3QtPmRhdGEgPSAoT1BKX0lOVDMyKilvcGpfY2FsbG9jKHdpZHRoICogaGVpZ2h0LCBzaXplb2YoT1BKX0lOVDMyKSk7CisrICAgICAgICAgICAgICAgICAgICBpZiAoIWxfaW1nX2NvbXBfZGVzdC0+ZGF0YSkgeworKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisrICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIH0KKyAKKyAgICAgICAgICAgICAgICAgLyogQ29weSBpbmZvIGZyb20gZGVjb2RlZCBjb21wIGltYWdlIHRvIG91dHB1dCBpbWFnZSAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDAyLXBhY2tldC1pdGVyYXRvci5wYXRjaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAwMi1wYWNrZXQtaXRlcmF0b3IucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM3NTVlZAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAwMi1wYWNrZXQtaXRlcmF0b3IucGF0Y2gKQEAgLTAsMCArMSwyNyBAQAorZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvcGkuYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvcGkuYworaW5kZXggMTY5N2JjYi4uMDZmMWU0MSAxMDA2NDQKKy0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvcGkuYworKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9waS5jCitAQCAtMzYsNiArMzYsNyBAQAorICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICAqLworIAorKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyAjaW5jbHVkZSAib3BqX2luY2x1ZGVzLmgiCisgCisgLyoqIEBkZWZncm91cCBQSSBQSSAtIEltcGxlbWVudGF0aW9uIG9mIGEgcGFja2V0IGl0ZXJhdG9yICovCitAQCAtMTIzNiw3ICsxMjM3LDEzIEBAIG9wal9waV9pdGVyYXRvcl90ICpvcGpfcGlfY3JlYXRlX2RlY29kZShvcGpfaW1hZ2VfdCAqcF9pbWFnZSwKKyAJbF9jdXJyZW50X3BpID0gbF9waTsKKyAKKyAJLyogbWVtb3J5IGFsbG9jYXRpb24gZm9yIGluY2x1ZGUgKi8KKy0JbF9jdXJyZW50X3BpLT5pbmNsdWRlID0gKE9QSl9JTlQxNiopIG9wal9jYWxsb2MoKGxfdGNwLT5udW1sYXllcnMgKzEpICogbF9zdGVwX2wsIHNpemVvZihPUEpfSU5UMTYpKTsKKysJbF9jdXJyZW50X3BpLT5pbmNsdWRlID0gMDA7CisrCWlmCisrCQkobF9zdGVwX2wgJiYgbF90Y3AtPm51bWxheWVycyA8IFVJTlRfTUFYIC8gbF9zdGVwX2wgLSAxKQorKwl7CisrCQlsX2N1cnJlbnRfcGktPmluY2x1ZGUgPSAoT1BKX0lOVDE2KilvcGpfY2FsbG9jKChsX3RjcC0+bnVtbGF5ZXJzICsgMSkgKiBsX3N0ZXBfbCwgc2l6ZW9mKE9QSl9JTlQxNikpOworKwl9CisrCisgCWlmCisgCQkoIWxfY3VycmVudF9waS0+aW5jbHVkZSkKKyAJewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDAzLWR3dC1kZWNvZGUucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMDMtZHd0LWRlY29kZS5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTAwZjBjCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDAzLWR3dC1kZWNvZGUucGF0Y2gKQEAgLTAsMCArMSwxOTEgQEAKK2RpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2R3dC5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9kd3QuYworaW5kZXggNGFkOTllZC4uOTc1YTk3ZSAxMDA2NDQKKy0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvZHd0LmMKKysrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvZHd0LmMKK0BAIC00NiwxNCArNDYsMTIgQEAKKyAvKiogQGRlZmdyb3VwIERXVCBEV1QgLSBJbXBsZW1lbnRhdGlvbiBvZiBhIGRpc2NyZXRlIHdhdmVsZXQgdHJhbnNmb3JtICovCisgLypAeyovCisgCistI2RlZmluZSBPUEpfV1MoaSkgdi0+bWVtWyhpKSoyXQorLSNkZWZpbmUgT1BKX1dEKGkpIHYtPm1lbVsoMSsoaSkqMildCistCisgLyoqIEBuYW1lIExvY2FsIGRhdGEgc3RydWN0dXJlcyAqLworIC8qQHsqLworIAorIHR5cGVkZWYgc3RydWN0IGR3dF9sb2NhbCB7CisgCU9QSl9JTlQzMiogbWVtOworKwlPUEpfU0laRV9UIG1lbV9jb3VudDsKKyAJT1BKX0lOVDMyIGRuOworIAlPUEpfSU5UMzIgc247CisgCU9QSl9JTlQzMiBjYXM7CitAQCAtMTA3LDE2ICsxMDUsMTYgQEAgc3RhdGljIHZvaWQgb3BqX2R3dF9pbnRlcmxlYXZlX3Yob3BqX2R3dF90KiB2LCBPUEpfSU5UMzIgKmEsIE9QSl9JTlQzMiB4KTsKKyAvKioKKyBGb3J3YXJkIDUtMyB3YXZlbGV0IHRyYW5zZm9ybSBpbiAxLUQKKyAqLworLXN0YXRpYyB2b2lkIG9wal9kd3RfZW5jb2RlXzEoT1BKX0lOVDMyICphLCBPUEpfSU5UMzIgZG4sIE9QSl9JTlQzMiBzbiwgT1BKX0lOVDMyIGNhcyk7Cisrc3RhdGljIHZvaWQgb3BqX2R3dF9lbmNvZGVfMShPUEpfSU5UMzIgKmEsIE9QSl9TSVpFX1QgYV9jb3VudCwgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpOworIC8qKgorIEludmVyc2UgNS0zIHdhdmVsZXQgdHJhbnNmb3JtIGluIDEtRAorICovCisgc3RhdGljIHZvaWQgb3BqX2R3dF9kZWNvZGVfMShvcGpfZHd0X3QgKnYpOworLXN0YXRpYyB2b2lkIG9wal9kd3RfZGVjb2RlXzFfKE9QSl9JTlQzMiAqYSwgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpOworK3N0YXRpYyB2b2lkIG9wal9kd3RfZGVjb2RlXzFfKE9QSl9JTlQzMiAqYSwgT1BKX1NJWkVfVCBhX2NvdW50LCBPUEpfSU5UMzIgZG4sIE9QSl9JTlQzMiBzbiwgT1BKX0lOVDMyIGNhcyk7CisgLyoqCisgRm9yd2FyZCA5LTcgd2F2ZWxldCB0cmFuc2Zvcm0gaW4gMS1ECisgKi8KKy1zdGF0aWMgdm9pZCBvcGpfZHd0X2VuY29kZV8xX3JlYWwoT1BKX0lOVDMyICphLCBPUEpfSU5UMzIgZG4sIE9QSl9JTlQzMiBzbiwgT1BKX0lOVDMyIGNhcyk7Cisrc3RhdGljIHZvaWQgb3BqX2R3dF9lbmNvZGVfMV9yZWFsKE9QSl9JTlQzMiAqYSwgT1BKX1NJWkVfVCBhX2NvdW50LCBPUEpfSU5UMzIgZG4sIE9QSl9JTlQzMiBzbiwgT1BKX0lOVDMyIGNhcyk7CisgLyoqCisgRXhwbGljaXQgY2FsY3VsYXRpb24gb2YgdGhlIFF1YW50aXphdGlvbiBTdGVwc2l6ZXMgCisgKi8KK0BAIC0xMjQsMTAgKzEyMiwxMCBAQCBzdGF0aWMgdm9pZCBvcGpfZHd0X2VuY29kZV9zdGVwc2l6ZShPUEpfSU5UMzIgc3RlcHNpemUsIE9QSl9JTlQzMiBudW1icHMsIG9wal9zdAorIC8qKgorIEludmVyc2Ugd2F2ZWxldCB0cmFuc2Zvcm0gaW4gMi1ELgorICovCistc3RhdGljIE9QSl9CT09MIG9wal9kd3RfZGVjb2RlX3RpbGUob3BqX3RjZF90aWxlY29tcF90KiB0aWxlYywgT1BKX1VJTlQzMiBpLCBEV1QxREZOIGZuKTsKKytzdGF0aWMgT1BKX0JPT0wgb3BqX2R3dF9kZWNvZGVfdGlsZShjb25zdCBvcGpfdGNkX3RpbGVjb21wX3QqIHRpbGVjLCBPUEpfVUlOVDMyIGksIERXVDFERk4gZm4pOworIAorLXN0YXRpYyBPUEpfQk9PTCBvcGpfZHd0X2VuY29kZV9wcm9jZWR1cmUoCW9wal90Y2RfdGlsZWNvbXBfdCAqIHRpbGVjLAorLQkJCQkJCQkJCQkgICAgdm9pZCAoKnBfZnVuY3Rpb24pKE9QSl9JTlQzMiAqLCBPUEpfSU5UMzIsT1BKX0lOVDMyLE9QSl9JTlQzMikgKTsKKytzdGF0aWMgT1BKX0JPT0wgb3BqX2R3dF9lbmNvZGVfcHJvY2VkdXJlKGNvbnN0IG9wal90Y2RfdGlsZWNvbXBfdCAqIHRpbGVjLAorKwkJCQkJCQkJCQkgICAgdm9pZCgqcF9mdW5jdGlvbikoT1BKX0lOVDMyICosIE9QSl9TSVpFX1QsIE9QSl9JTlQzMiwgT1BKX0lOVDMyLCBPUEpfSU5UMzIpKTsKKyAKKyBzdGF0aWMgT1BKX1VJTlQzMiBvcGpfZHd0X21heF9yZXNvbHV0aW9uKG9wal90Y2RfcmVzb2x1dGlvbl90KiByZXN0cmljdCByLCBPUEpfVUlOVDMyIGkpOworIAorQEAgLTE1NiwxMyArMTU0LDIwIEBAIHN0YXRpYyB2b2lkIG9wal92NGR3dF9kZWNvZGVfc3RlcDIob3BqX3Y0X3QqIGwsIG9wal92NF90KiB3LCBPUEpfSU5UMzIgaywgT1BKX0lOCisgCisgLypAfSovCisgCistI2RlZmluZSBPUEpfUyhpKSBhWyhpKSoyXQorLSNkZWZpbmUgT1BKX0QoaSkgYVsoMSsoaSkqMildCistI2RlZmluZSBPUEpfU18oaSkgKChpKTwwP09QSl9TKDApOigoaSk+PXNuP09QSl9TKHNuLTEpOk9QSl9TKGkpKSkKKy0jZGVmaW5lIE9QSl9EXyhpKSAoKGkpPDA/T1BKX0QoMCk6KChpKT49ZG4/T1BKX0QoZG4tMSk6T1BKX0QoaSkpKQorLS8qIG5ldyAqLworLSNkZWZpbmUgT1BKX1NTXyhpKSAoKGkpPDA/T1BKX1MoMCk6KChpKT49ZG4/T1BKX1MoZG4tMSk6T1BKX1MoaSkpKQorLSNkZWZpbmUgT1BKX0REXyhpKSAoKGkpPDA/T1BKX0QoMCk6KChpKT49c24/T1BKX0Qoc24tMSk6T1BKX0QoaSkpKQorKyNkZWZpbmUgSURYX1MoaSkgKGkpKjIKKysjZGVmaW5lIElEWF9EKGkpIDEgKyAoaSkqIDIKKysjZGVmaW5lIFVOREVSRkxPV19TTihpKSAoKGkpID49IHNuJiZzbj4wKQorKyNkZWZpbmUgVU5ERVJGTE9XX0ROKGkpICgoaSkgPj0gZG4mJmRuPjApCisrI2RlZmluZSBPVkVSRkxPV19TKGkpIChJRFhfUyhpKSA+PSBhX2NvdW50KQorKyNkZWZpbmUgT1ZFUkZMT1dfRChpKSAoSURYX0QoaSkgPj0gYV9jb3VudCkKKysKKysjZGVmaW5lIE9QSl9TKGkpIGFbSURYX1MoaSldCisrI2RlZmluZSBPUEpfRChpKSBhW0lEWF9EKGkpXQorKyNkZWZpbmUgT1BKX1NfKGkpICgoaSk8MCA/IE9QSl9TKDApIDogKFVOREVSRkxPV19TTihpKSA/IE9QSl9TKHNuIC0gMSkgOiBPVkVSRkxPV19TKGkpID8gT1BKX1MoaSAtIDEpIDogT1BKX1MoaSkpKQorKyNkZWZpbmUgT1BKX0RfKGkpICgoaSk8MCA/IE9QSl9EKDApIDogKFVOREVSRkxPV19ETihpKSA/IE9QSl9EKGRuIC0gMSkgOiBPVkVSRkxPV19EKGkpID8gT1BKX0QoaSAtIDEpIDogT1BKX0QoaSkpKQorKy8qIG5ldyAqLworKyNkZWZpbmUgT1BKX1NTXyhpKSAoKGkpPDAgPyBPUEpfUygwKSA6IChVTkRFUkZMT1dfRE4oaSkgPyBPUEpfUyhkbiAtIDEpIDogT1ZFUkZMT1dfUyhpKSA/IE9QSl9TKGkgLSAxKSA6IE9QSl9TKGkpKSkKKysjZGVmaW5lIE9QSl9ERF8oaSkgKChpKTwwID8gT1BKX0QoMCkgOiAoVU5ERVJGTE9XX1NOKGkpID8gT1BKX0Qoc24gLSAxKSA6IE9WRVJGTE9XX0QoaSkgPyBPUEpfRChpIC0gMSkgOiBPUEpfRChpKSkpCisgCisgLyogPHN1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIG5vcm1zIG9mIHRoZSA1LTMgd2F2ZWxldHMgZm9yIGRpZmZlcmVudCBiYW5kcy4gKi8KK0BAIC0yODMsNyArMjg4LDcgQEAgc3RhdGljIHZvaWQgb3BqX2R3dF9pbnRlcmxlYXZlX3Yob3BqX2R3dF90KiB2LCBPUEpfSU5UMzIgKmEsIE9QSl9JTlQzMiB4KSB7CisgLyogPHN1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyogRm9yd2FyZCA1LTMgd2F2ZWxldCB0cmFuc2Zvcm0gaW4gMS1ELiAqLworIC8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLXN0YXRpYyB2b2lkIG9wal9kd3RfZW5jb2RlXzEoT1BKX0lOVDMyICphLCBPUEpfSU5UMzIgZG4sIE9QSl9JTlQzMiBzbiwgT1BKX0lOVDMyIGNhcykgeworK3N0YXRpYyB2b2lkIG9wal9kd3RfZW5jb2RlXzEoT1BKX0lOVDMyICphLCBPUEpfU0laRV9UIGFfY291bnQsIE9QSl9JTlQzMiBkbiwgT1BKX0lOVDMyIHNuLCBPUEpfSU5UMzIgY2FzKSB7CisgCU9QSl9JTlQzMiBpOworIAkKKyAJaWYgKCFjYXMpIHsKK0BAIC0zMDQsNyArMzA5LDcgQEAgc3RhdGljIHZvaWQgb3BqX2R3dF9lbmNvZGVfMShPUEpfSU5UMzIgKmEsIE9QSl9JTlQzMiBkbiwgT1BKX0lOVDMyIHNuLCBPUEpfSU5UMzIKKyAvKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiBJbnZlcnNlIDUtMyB3YXZlbGV0IHRyYW5zZm9ybSBpbiAxLUQuICovCisgLyogPC9zdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICovIAorLXN0YXRpYyB2b2lkIG9wal9kd3RfZGVjb2RlXzFfKE9QSl9JTlQzMiAqYSwgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpIHsKKytzdGF0aWMgdm9pZCBvcGpfZHd0X2RlY29kZV8xXyhPUEpfSU5UMzIgKmEsIE9QSl9TSVpFX1QgYV9jb3VudCwgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpIHsKKyAJT1BKX0lOVDMyIGk7CisgCQorIAlpZiAoIWNhcykgeworQEAgLTMyNiwxMyArMzMxLDEzIEBAIHN0YXRpYyB2b2lkIG9wal9kd3RfZGVjb2RlXzFfKE9QSl9JTlQzMiAqYSwgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzCisgLyogSW52ZXJzZSA1LTMgd2F2ZWxldCB0cmFuc2Zvcm0gaW4gMS1ELiAqLworIC8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAKKyBzdGF0aWMgdm9pZCBvcGpfZHd0X2RlY29kZV8xKG9wal9kd3RfdCAqdikgeworLQlvcGpfZHd0X2RlY29kZV8xXyh2LT5tZW0sIHYtPmRuLCB2LT5zbiwgdi0+Y2FzKTsKKysJb3BqX2R3dF9kZWNvZGVfMV8odi0+bWVtLCB2LT5tZW1fY291bnQsIHYtPmRuLCB2LT5zbiwgdi0+Y2FzKTsKKyB9CisgCisgLyogPHN1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworIC8qIEZvcndhcmQgOS03IHdhdmVsZXQgdHJhbnNmb3JtIGluIDEtRC4gKi8KKyAvKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCistc3RhdGljIHZvaWQgb3BqX2R3dF9lbmNvZGVfMV9yZWFsKE9QSl9JTlQzMiAqYSwgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpIHsKKytzdGF0aWMgdm9pZCBvcGpfZHd0X2VuY29kZV8xX3JlYWwoT1BKX0lOVDMyICphLCBPUEpfU0laRV9UIGFfY291bnQsIE9QSl9JTlQzMiBkbiwgT1BKX0lOVDMyIHNuLCBPUEpfSU5UMzIgY2FzKSB7CisgCU9QSl9JTlQzMiBpOworIAlpZiAoIWNhcykgeworIAkJaWYgKChkbiA+IDApIHx8IChzbiA+IDEpKSB7CS8qIE5FVyA6ICBDQVNFIE9ORSBFTEVNRU5UICovCitAQCAtMzg1LDcgKzM5MCw3IEBAIHN0YXRpYyB2b2lkIG9wal9kd3RfZW5jb2RlX3N0ZXBzaXplKE9QSl9JTlQzMiBzdGVwc2l6ZSwgT1BKX0lOVDMyIG51bWJwcywgb3BqX3N0CisgLyogPHN1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyogRm9yd2FyZCA1LTMgd2F2ZWxldCB0cmFuc2Zvcm0gaW4gMi1ELiAqLworIC8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLXN0YXRpYyBJTkxJTkUgT1BKX0JPT0wgb3BqX2R3dF9lbmNvZGVfcHJvY2VkdXJlKG9wal90Y2RfdGlsZWNvbXBfdCAqIHRpbGVjLHZvaWQgKCpwX2Z1bmN0aW9uKShPUEpfSU5UMzIgKiwgT1BKX0lOVDMyLE9QSl9JTlQzMixPUEpfSU5UMzIpICkKKytzdGF0aWMgSU5MSU5FIE9QSl9CT09MIG9wal9kd3RfZW5jb2RlX3Byb2NlZHVyZShjb25zdCBvcGpfdGNkX3RpbGVjb21wX3QgKiB0aWxlYywgdm9pZCgqcF9mdW5jdGlvbikoT1BKX0lOVDMyICosIE9QSl9TSVpFX1QsIE9QSl9JTlQzMiwgT1BKX0lOVDMyLCBPUEpfSU5UMzIpKQorIHsKKyAJT1BKX0lOVDMyIGksIGosIGs7CisgCU9QSl9JTlQzMiAqYSA9IDAwOworQEAgLTM5NSw3ICs0MDAsOCBAQCBzdGF0aWMgSU5MSU5FIE9QSl9CT09MIG9wal9kd3RfZW5jb2RlX3Byb2NlZHVyZShvcGpfdGNkX3RpbGVjb21wX3QgKiB0aWxlYyx2b2lkCisgCisgCU9QSl9JTlQzMiBydzsJCQkvKiB3aWR0aCBvZiB0aGUgcmVzb2x1dGlvbiBsZXZlbCBjb21wdXRlZCAgICovCisgCU9QSl9JTlQzMiByaDsJCQkvKiBoZWlnaHQgb2YgdGhlIHJlc29sdXRpb24gbGV2ZWwgY29tcHV0ZWQgICovCistCU9QSl9VSU5UMzIgbF9kYXRhX3NpemU7CisrCU9QSl9TSVpFX1QgbF9kYXRhX2NvdW50OworKwlPUEpfU0laRV9UIGxfZGF0YV9zaXplOworIAorIAlvcGpfdGNkX3Jlc29sdXRpb25fdCAqIGxfY3VyX3JlcyA9IDA7CisgCW9wal90Y2RfcmVzb2x1dGlvbl90ICogbF9sYXN0X3JlcyA9IDA7CitAQCAtNDA3LDggKzQxMyw5IEBAIHN0YXRpYyBJTkxJTkUgT1BKX0JPT0wgb3BqX2R3dF9lbmNvZGVfcHJvY2VkdXJlKG9wal90Y2RfdGlsZWNvbXBfdCAqIHRpbGVjLHZvaWQKKyAJbF9jdXJfcmVzID0gdGlsZWMtPnJlc29sdXRpb25zICsgbDsKKyAJbF9sYXN0X3JlcyA9IGxfY3VyX3JlcyAtIDE7CisgCistCWxfZGF0YV9zaXplID0gb3BqX2R3dF9tYXhfcmVzb2x1dGlvbiggdGlsZWMtPnJlc29sdXRpb25zLHRpbGVjLT5udW1yZXNvbHV0aW9ucykgKiAoT1BKX1VJTlQzMilzaXplb2YoT1BKX0lOVDMyKTsKKy0JYmogPSAoT1BKX0lOVDMyKilvcGpfbWFsbG9jKChzaXplX3QpbF9kYXRhX3NpemUpOworKwlsX2RhdGFfY291bnQgPSBvcGpfZHd0X21heF9yZXNvbHV0aW9uKHRpbGVjLT5yZXNvbHV0aW9ucywgdGlsZWMtPm51bXJlc29sdXRpb25zKSAqIChPUEpfVUlOVDMyKXNpemVvZihPUEpfSU5UMzIpOworKwlsX2RhdGFfc2l6ZSA9IGxfZGF0YV9jb3VudCAqIChPUEpfVUlOVDMyKXNpemVvZihPUEpfSU5UMzIpOworKwliaiA9IChPUEpfSU5UMzIqKW9wal9tYWxsb2MobF9kYXRhX3NpemUpOworIAlpZiAoISBiaikgeworIAkJcmV0dXJuIE9QSl9GQUxTRTsKKyAJfQorQEAgLTQzNyw3ICs0NDQsNyBAQCBzdGF0aWMgSU5MSU5FIE9QSl9CT09MIG9wal9kd3RfZW5jb2RlX3Byb2NlZHVyZShvcGpfdGNkX3RpbGVjb21wX3QgKiB0aWxlYyx2b2lkCisgCQkJCWJqW2tdID0gYWpbayp3XTsKKyAJCQl9CisgCistCQkJKCpwX2Z1bmN0aW9uKSAoYmosIGRuLCBzbiwgY2FzX2NvbCk7CisrCQkJKCpwX2Z1bmN0aW9uKSAoYmosIGxfZGF0YV9jb3VudCwgZG4sIHNuLCBjYXNfY29sKTsKKyAKKyAJCQlvcGpfZHd0X2RlaW50ZXJsZWF2ZV92KGJqLCBhaiwgZG4sIHNuLCB3LCBjYXNfY29sKTsKKyAJCX0KK0BAIC00NDgsNyArNDU1LDcgQEAgc3RhdGljIElOTElORSBPUEpfQk9PTCBvcGpfZHd0X2VuY29kZV9wcm9jZWR1cmUob3BqX3RjZF90aWxlY29tcF90ICogdGlsZWMsdm9pZAorIAkJZm9yIChqID0gMDsgaiA8IHJoOyBqKyspIHsKKyAJCQlhaiA9IGEgKyBqICogdzsKKyAJCQlmb3IgKGsgPSAwOyBrIDwgcnc7IGsrKykgIGJqW2tdID0gYWpba107CistCQkJKCpwX2Z1bmN0aW9uKSAoYmosIGRuLCBzbiwgY2FzX3Jvdyk7CisrCQkJKCpwX2Z1bmN0aW9uKSAoYmosIGxfZGF0YV9jb3VudCwgZG4sIHNuLCBjYXNfcm93KTsKKyAJCQlvcGpfZHd0X2RlaW50ZXJsZWF2ZV9oKGJqLCBhaiwgZG4sIHNuLCBjYXNfcm93KTsKKyAJCX0KKyAKK0BAIC01NTcsNyArNTY0LDcgQEAgc3RhdGljIE9QSl9VSU5UMzIgb3BqX2R3dF9tYXhfcmVzb2x1dGlvbihvcGpfdGNkX3Jlc29sdXRpb25fdCogcmVzdHJpY3QgciwgT1BKX1UKKyAvKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAvKiBJbnZlcnNlIHdhdmVsZXQgdHJhbnNmb3JtIGluIDItRC4gICAgICovCisgLyogPC9zdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCistc3RhdGljIE9QSl9CT09MIG9wal9kd3RfZGVjb2RlX3RpbGUob3BqX3RjZF90aWxlY29tcF90KiB0aWxlYywgT1BKX1VJTlQzMiBudW1yZXMsIERXVDFERk4gZHd0XzFEKSB7Cisrc3RhdGljIE9QSl9CT09MIG9wal9kd3RfZGVjb2RlX3RpbGUoY29uc3Qgb3BqX3RjZF90aWxlY29tcF90KiB0aWxlYywgT1BKX1VJTlQzMiBudW1yZXMsIERXVDFERk4gZHd0XzFEKSB7CisgCW9wal9kd3RfdCBoOworIAlvcGpfZHd0X3QgdjsKKyAKK0BAIC01NjgsMTMgKzU3NSwxNCBAQCBzdGF0aWMgT1BKX0JPT0wgb3BqX2R3dF9kZWNvZGVfdGlsZShvcGpfdGNkX3RpbGVjb21wX3QqIHRpbGVjLCBPUEpfVUlOVDMyIG51bXJlcworIAorIAlPUEpfVUlOVDMyIHcgPSAoT1BKX1VJTlQzMikodGlsZWMtPngxIC0gdGlsZWMtPngwKTsKKyAKKy0JaC5tZW0gPSAoT1BKX0lOVDMyKikKKy0Jb3BqX2FsaWduZWRfbWFsbG9jKG9wal9kd3RfbWF4X3Jlc29sdXRpb24odHIsIG51bXJlcykgKiBzaXplb2YoT1BKX0lOVDMyKSk7CisrCWgubWVtX2NvdW50ID0gb3BqX2R3dF9tYXhfcmVzb2x1dGlvbih0ciwgbnVtcmVzKTsKKysJaC5tZW0gPSAoT1BKX0lOVDMyKilvcGpfYWxpZ25lZF9tYWxsb2MoaC5tZW1fY291bnQgKiBzaXplb2YoT1BKX0lOVDMyKSk7CisgCWlmICghIGgubWVtKXsKKyAJCS8qIEZJWE1FIGV2ZW50IG1hbmFnZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAJCXJldHVybiBPUEpfRkFMU0U7CisgCX0KKyAKKysJdi5tZW1fY291bnQgPSBoLm1lbV9jb3VudDsKKyAJdi5tZW0gPSBoLm1lbTsKKyAKKyAJd2hpbGUoIC0tbnVtcmVzKSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMDQtajJrX3JlYWRfbWNjLnBhdGNoIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDA0LWoya19yZWFkX21jYy5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWM4NDdkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDA0LWoya19yZWFkX21jYy5wYXRjaApAQCAtMCwwICsxLDMxIEBACitkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qMmsuYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvajJrLmMKK2luZGV4IDg0OWQwYjQuLmIyMGYyMTkgMTAwNjQ0CistLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2oyay5jCisrKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2oyay5jCitAQCAtNTM0MSw2ICs1MzQxLDcgQEAgc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9tY2MgKCAgICAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgIE9QSl9VSU5UMzIgbF9uYl9jb2xsZWN0aW9uczsKKyAgICAgICAgIE9QSl9VSU5UMzIgbF9uYl9jb21wczsKKyAgICAgICAgIE9QSl9VSU5UMzIgbF9uYl9ieXRlc19ieV9jb21wOworKyAgICAgICAgT1BKX0JPT0wgbmV3X21jYyA9IE9QSl9GQUxTRTsKKyAKKyAgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICAgICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKK0BAIC01NDAyLDYgKzU0MDMsNyBAQCBzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX21jYyAoICAgICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChsX21jY19yZWNvcmQsMCwobF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzLWxfdGNwLT5tX25iX21jY19yZWNvcmRzKSAqIHNpemVvZihvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCkpOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIGxfbWNjX3JlY29yZCA9IGxfdGNwLT5tX21jY19yZWNvcmRzICsgbF90Y3AtPm1fbmJfbWNjX3JlY29yZHM7CisrICAgICAgICAgICAgICAgIG5ld19tY2MgPSBPUEpfVFJVRTsKKyAgICAgICAgIH0KKyAgICAgICAgIGxfbWNjX3JlY29yZC0+bV9pbmRleCA9IGxfaW5kaXg7CisgCitAQCAtNTUzNyw3ICs1NTM5LDkgQEAgc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9tY2MgKCAgICAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgIH0KKyAKKy0gICAgICAgICsrbF90Y3AtPm1fbmJfbWNjX3JlY29yZHM7CisrICAgICAgICBpZiAobmV3X21jYykgeworKyAgICAgICAgICAgICAgICArK2xfdGNwLT5tX25iX21jY19yZWNvcmRzOworKyAgICAgICAgfQorIAorICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAwNS1qcDJfYXBwbHlfcGNsci5wYXRjaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAwNS1qcDJfYXBwbHlfcGNsci5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDNjYTYzCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDA1LWpwMl9hcHBseV9wY2xyLnBhdGNoCkBAIC0wLDAgKzEsNDkgQEAKK2RpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2pwMi5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuYworaW5kZXggNDdmODNhMS4uNmU5MTBhOSAxMDA2NDQKKy0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvanAyLmMKKysrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvanAyLmMKK0BAIC05MDIsNyArOTAyLDcgQEAgc3RhdGljIE9QSl9CT09MIG9wal9qcDJfY2hlY2tfY29sb3Iob3BqX2ltYWdlX3QgKmltYWdlLCBvcGpfanAyX2NvbG9yX3QgKmNvbG9yLAorIAkJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSW52YWxpZCBjb21wb25lbnQvcGFsZXR0ZSBpbmRleCBmb3IgZGlyZWN0IG1hcHBpbmcgJWQuXG4iLCBwY29sKTsKKyAJCQkJaXNfc2FuZSA9IE9QSl9GQUxTRTsKKyAJCQl9CistCQkJZWxzZSBpZiAocGNvbF91c2FnZVtwY29sXSAmJiBjbWFwW2ldLm10eXAgPT0gMSkgeworKwkJCWVsc2UgaWYgKHBjb2xfdXNhZ2VbcGNvbF0gJiYgY21hcFtpXS5tdHlwICE9IDApIHsKKyAJCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkNvbXBvbmVudCAlZCBpcyBtYXBwZWQgdHdpY2UuXG4iLCBwY29sKTsKKyAJCQkJaXNfc2FuZSA9IE9QSl9GQUxTRTsKKyAJCQl9CitAQCAtOTgyLDggKzk4Miw4IEBAIHN0YXRpYyB2b2lkIG9wal9qcDJfYXBwbHlfcGNscihvcGpfaW1hZ2VfdCAqaW1hZ2UsIG9wal9qcDJfY29sb3JfdCAqY29sb3IpCisgICAgICAgYXNzZXJ0KCBwY29sID09IDAgKTsKKyAgICAgICBuZXdfY29tcHNbaV0gPSBvbGRfY29tcHNbY21wXTsKKyAgICAgfSBlbHNlIHsKKy0gICAgICBhc3NlcnQoIGkgPT0gcGNvbCApOworLSAgICAgIG5ld19jb21wc1twY29sXSA9IG9sZF9jb21wc1tjbXBdOworKyAgICAgIGFzc2VydCggaSA9PSBwY29sICk7IC8vIHByb2JhYmx5IHdyb25nPworKyAgICAgIG5ld19jb21wc1tpXSA9IG9sZF9jb21wc1tjbXBdOworICAgICB9CisgCisgCQkvKiBQYWxldHRlIG1hcHBpbmc6ICovCitAQCAtMTAwNywxMSArMTAwNywxMSBAQCBzdGF0aWMgdm9pZCBvcGpfanAyX2FwcGx5X3BjbHIob3BqX2ltYWdlX3QgKmltYWdlLCBvcGpfanAyX2NvbG9yX3QgKmNvbG9yKQorIAkJY21wID0gY21hcFtpXS5jbXA7IHBjb2wgPSBjbWFwW2ldLnBjb2w7CisgCQlzcmMgPSBvbGRfY29tcHNbY21wXS5kYXRhOworICAgICBhc3NlcnQoIHNyYyApOworLQkJbWF4ID0gbmV3X2NvbXBzW3Bjb2xdLncgKiBuZXdfY29tcHNbcGNvbF0uaDsKKysJCW1heCA9IG5ld19jb21wc1tpXS53ICogbmV3X2NvbXBzW2ldLmg7CisgCisgCQkvKiBEaXJlY3QgdXNlOiAqLworICAgICBpZihjbWFwW2ldLm10eXAgPT0gMCkgeworLSAgICAgIGFzc2VydCggY21wID09IDAgKTsKKysgICAgICBhc3NlcnQoIGNtcCA9PSAwICk7IC8vIHByb2JhYmx5IHdyb25nLgorICAgICAgIGRzdCA9IG5ld19jb21wc1tpXS5kYXRhOworICAgICAgIGFzc2VydCggZHN0ICk7CisgICAgICAgZm9yKGogPSAwOyBqIDwgbWF4OyArK2opIHsKK0BAIC0xMDE5LDggKzEwMTksOCBAQCBzdGF0aWMgdm9pZCBvcGpfanAyX2FwcGx5X3BjbHIob3BqX2ltYWdlX3QgKmltYWdlLCBvcGpfanAyX2NvbG9yX3QgKmNvbG9yKQorICAgICAgIH0KKyAgICAgfQorICAgICBlbHNlIHsKKy0gICAgICBhc3NlcnQoIGkgPT0gcGNvbCApOworLSAgICAgIGRzdCA9IG5ld19jb21wc1twY29sXS5kYXRhOworKyAgICAgIGFzc2VydCggaSA9PSBwY29sICk7IC8vIHByb2JhYmx5IHdyb25nPworKyAgICAgIGRzdCA9IG5ld19jb21wc1tpXS5kYXRhOworICAgICAgIGFzc2VydCggZHN0ICk7CisgICAgICAgZm9yKGogPSAwOyBqIDwgbWF4OyArK2opIHsKKyAgICAgICAgIC8qIFRoZSBpbmRleCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDA2LXRjZF9pbml0X3RpbGUucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMDYtdGNkX2luaXRfdGlsZS5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzAwZjQwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDA2LXRjZF9pbml0X3RpbGUucGF0Y2gKQEAgLTAsMCArMSwxNiBAQAorZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdGNkLmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3RjZC5jCitpbmRleCAyZmNjZmYxLi5hZWJlOWJlIDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90Y2QuYworKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90Y2QuYworQEAgLTcyNyw3ICs3MjcsMTAgQEAgc3RhdGljIElOTElORSBPUEpfQk9PTCBvcGpfdGNkX2luaXRfdGlsZShvcGpfdGNkX3QgKnBfdGNkLCBPUEpfVUlOVDMyIHBfdGlsZV9ubywKKyAJCWxfdGlsZWMtPngxID0gb3BqX2ludF9jZWlsZGl2KGxfdGlsZS0+eDEsIChPUEpfSU5UMzIpbF9pbWFnZV9jb21wLT5keCk7CisgCQlsX3RpbGVjLT55MSA9IG9wal9pbnRfY2VpbGRpdihsX3RpbGUtPnkxLCAoT1BKX0lOVDMyKWxfaW1hZ2VfY29tcC0+ZHkpOworIAkJLypmcHJpbnRmKHN0ZGVyciwgIlx0VGlsZSBjb21wbyBib3JkZXIgPSAlZCwlZCwlZCwlZFxuIiwgbF90aWxlYy0+eDAsIGxfdGlsZWMtPnkwLGxfdGlsZWMtPngxLGxfdGlsZWMtPnkxKTsqLworLQkJCisrCQlpZiAobF90aWxlYy0+eDAgPj0gbF90aWxlYy0+eDEgfHwgbF90aWxlYy0+eTAgPj0gbF90aWxlYy0+eTEpIHsKKysJCQlvcGpfZXZlbnRfbXNnKG1hbmFnZXIsIEVWVF9FUlJPUiwgIkludmFsaWQgdGlsZSBkYXRhXG4iKTsKKysJCQlyZXR1cm4gT1BKX0ZBTFNFOworKwkJfQorIAkJLyogY29tcHV0ZSBsX2RhdGFfc2l6ZSB3aXRoIG92ZXJmbG93IGNoZWNrICovCisgCQlsX2RhdGFfc2l6ZSA9IChPUEpfVUlOVDMyKShsX3RpbGVjLT54MSAtIGxfdGlsZWMtPngwKTsKKyAJCWlmICgoKChPUEpfVUlOVDMyKS0xKSAvIGxfZGF0YV9zaXplKSA8IChPUEpfVUlOVDMyKShsX3RpbGVjLT55MSAtIGxfdGlsZWMtPnkwKSkgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDA3LWpwMl9yZWFkX2NtYXAucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMDctanAyX3JlYWRfY21hcC5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGY5ZTRiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDA3LWpwMl9yZWFkX2NtYXAucGF0Y2gKQEAgLTAsMCArMSwxMyBAQAorZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvanAyLmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2pwMi5jCitpbmRleCA2ZTkxMGE5Li5mM2JhY2E1IDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuYworKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuYworQEAgLTExOTQsNyArMTE5NCw3IEBAIHN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfY21hcCgJb3BqX2pwMl90ICoganAyLAorIAorIAorIAlmb3IoaSA9IDA7IGkgPCBucl9jaGFubmVsczsgKytpKSB7CistCQlvcGpfcmVhZF9ieXRlcyhwX2NtYXBfaGVhZGVyX2RhdGEsICZsX3ZhbHVlLCAyKTsJCQkvKiBDTVBeaSAqLworKwkJb3BqX3JlYWRfYnl0ZXNfQkUocF9jbWFwX2hlYWRlcl9kYXRhLCAmbF92YWx1ZSwgMik7CQkJLyogQ01QXmkgKi8KKyAJCXBfY21hcF9oZWFkZXJfZGF0YSArPTI7CisgCQljbWFwW2ldLmNtcCA9IChPUEpfVUlOVDE2KSBsX3ZhbHVlOworIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDA4LWpwMl9jaGVja19jb2xvci5wYXRjaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAwOC1qcDJfY2hlY2tfY29sb3IucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgxMGM4NgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAwOC1qcDJfY2hlY2tfY29sb3IucGF0Y2gKQEAgLTAsMCArMSwxOSBAQAorZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvanAyLmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2pwMi5jCitpbmRleCBmM2JhY2E1Li4zYmNiNDJlIDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuYworKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuYworQEAgLTg5Niw4ICs4OTYsMTIgQEAgc3RhdGljIE9QSl9CT09MIG9wal9qcDJfY2hlY2tfY29sb3Iob3BqX2ltYWdlX3QgKmltYWdlLCBvcGpfanAyX2NvbG9yX3QgKmNvbG9yLAorIAkJfQorIAkJLyogdmVyaWZ5IHRoYXQgbm8gY29tcG9uZW50IGlzIHRhcmdldGVkIG1vcmUgdGhhbiBvbmNlICovCisgCQlmb3IgKGkgPSAwOyBpIDwgbnJfY2hhbm5lbHM7IGkrKykgeworLSAgICAgIE9QSl9VSU5UMTYgcGNvbCA9IGNtYXBbaV0ucGNvbDsKKy0gICAgICBhc3NlcnQoY21hcFtpXS5tdHlwID09IDAgfHwgY21hcFtpXS5tdHlwID09IDEpOworKwkJCWlmIChjbWFwW2ldLm10eXAgIT0gMCAmJiBjbWFwW2ldLm10eXAgIT0gMSkgeworKwkJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiVW5leHBlY3RlZCBNVFlQIHZhbHVlLlxuIik7CisrCQkJCW9wal9mcmVlKHBjb2xfdXNhZ2UpOworKwkJCQlyZXR1cm4gT1BKX0ZBTFNFOworKwkJCX0KKysJCQlPUEpfVUlOVDE2IHBjb2wgPSBjbWFwW2ldLnBjb2w7CisgCQkJaWYgKHBjb2wgPj0gbnJfY2hhbm5lbHMpIHsKKyAJCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkludmFsaWQgY29tcG9uZW50L3BhbGV0dGUgaW5kZXggZm9yIGRpcmVjdCBtYXBwaW5nICVkLlxuIiwgcGNvbCk7CisgCQkJCWlzX3NhbmUgPSBPUEpfRkFMU0U7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMDktb3BqX3BpX25leHQucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMDktb3BqX3BpX25leHQucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc3MDFmMAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAwOS1vcGpfcGlfbmV4dC5wYXRjaApAQCAtMCwwICsxLDM0IEBACitkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9waS5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9waS5jCitpbmRleCAwNmYxZTQxLi40NjJlMDdjIDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9waS5jCisrKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3BpLmMKK0BAIC0zNzcsNiArMzc3LDkgQEAgaWYgKCFwaS0+dHBfb24peworIAkJCQkJcHJjaiA9IG9wal9pbnRfZmxvb3JkaXZwb3cyKG9wal9pbnRfY2VpbGRpdihwaS0+eSwgKE9QSl9JTlQzMikoY29tcC0+ZHkgPDwgbGV2ZWxubykpLCAoT1BKX0lOVDMyKXJlcy0+cGR5KQorIAkJCQkJCSAtIG9wal9pbnRfZmxvb3JkaXZwb3cyKHRyeTAsIChPUEpfSU5UMzIpcmVzLT5wZHkpOworIAkJCQkJcGktPnByZWNubyA9IChPUEpfVUlOVDMyKShwcmNpICsgcHJjaiAqIChPUEpfSU5UMzIpcmVzLT5wdyk7CisrCQkJCQlpZiAocGktPnByZWNubyA+PSByZXMtPnB3ICogcmVzLT5waCkgeworKwkJCQkJCXJldHVybiBPUEpfRkFMU0U7CisrCQkJCQl9CisgCQkJCQlmb3IgKHBpLT5sYXlubyA9IHBpLT5wb2MubGF5bm8wOyBwaS0+bGF5bm8gPCBwaS0+cG9jLmxheW5vMTsgcGktPmxheW5vKyspIHsKKyAJCQkJCQlpbmRleCA9IHBpLT5sYXlubyAqIHBpLT5zdGVwX2wgKyBwaS0+cmVzbm8gKiBwaS0+c3RlcF9yICsgcGktPmNvbXBubyAqIHBpLT5zdGVwX2MgKyBwaS0+cHJlY25vICogcGktPnN0ZXBfcDsKKyAJCQkJCQlpZiAoIXBpLT5pbmNsdWRlW2luZGV4XSkgeworQEAgLTQ1OCw2ICs0NjEsOSBAQCBzdGF0aWMgT1BKX0JPT0wgb3BqX3BpX25leHRfcGNybChvcGpfcGlfaXRlcmF0b3JfdCAqIHBpKSB7CisgCQkJCQlwcmNqID0gb3BqX2ludF9mbG9vcmRpdnBvdzIob3BqX2ludF9jZWlsZGl2KHBpLT55LCAoT1BKX0lOVDMyKShjb21wLT5keSA8PCBsZXZlbG5vKSksIChPUEpfSU5UMzIpcmVzLT5wZHkpCisgCQkJCQkJIC0gb3BqX2ludF9mbG9vcmRpdnBvdzIodHJ5MCwgKE9QSl9JTlQzMilyZXMtPnBkeSk7CisgCQkJCQlwaS0+cHJlY25vID0gKE9QSl9VSU5UMzIpKHByY2kgKyBwcmNqICogKE9QSl9JTlQzMilyZXMtPnB3KTsKKysJCQkJCWlmIChwaS0+cHJlY25vID49IHJlcy0+cHcgKiByZXMtPnBoKSB7CisrCQkJCQkJcmV0dXJuIE9QSl9GQUxTRTsKKysJCQkJCX0KKyAJCQkJCWZvciAocGktPmxheW5vID0gcGktPnBvYy5sYXlubzA7IHBpLT5sYXlubyA8IHBpLT5wb2MubGF5bm8xOyBwaS0+bGF5bm8rKykgeworIAkJCQkJCWluZGV4ID0gcGktPmxheW5vICogcGktPnN0ZXBfbCArIHBpLT5yZXNubyAqIHBpLT5zdGVwX3IgKyBwaS0+Y29tcG5vICogcGktPnN0ZXBfYyArIHBpLT5wcmVjbm8gKiBwaS0+c3RlcF9wOworIAkJCQkJCWlmICghcGktPmluY2x1ZGVbaW5kZXhdKSB7CitAQCAtNTM3LDYgKzU0Myw5IEBAIHN0YXRpYyBPUEpfQk9PTCBvcGpfcGlfbmV4dF9jcHJsKG9wal9waV9pdGVyYXRvcl90ICogcGkpIHsKKyAJCQkJCXByY2ogPSBvcGpfaW50X2Zsb29yZGl2cG93MihvcGpfaW50X2NlaWxkaXYocGktPnksIChPUEpfSU5UMzIpKGNvbXAtPmR5IDw8IGxldmVsbm8pKSwgKE9QSl9JTlQzMilyZXMtPnBkeSkKKyAJCQkJCQkgLSBvcGpfaW50X2Zsb29yZGl2cG93Mih0cnkwLCAoT1BKX0lOVDMyKXJlcy0+cGR5KTsKKyAJCQkJCXBpLT5wcmVjbm8gPSAoT1BKX1VJTlQzMikocHJjaSArIHByY2ogKiAoT1BKX0lOVDMyKXJlcy0+cHcpOworKwkJCQkJaWYgKHBpLT5wcmVjbm8gPj0gcmVzLT5wdyAqIHJlcy0+cGgpIHsKKysJCQkJCQlyZXR1cm4gT1BKX0ZBTFNFOworKwkJCQkJfQorIAkJCQkJZm9yIChwaS0+bGF5bm8gPSBwaS0+cG9jLmxheW5vMDsgcGktPmxheW5vIDwgcGktPnBvYy5sYXlubzE7IHBpLT5sYXlubysrKSB7CisgCQkJCQkJaW5kZXggPSBwaS0+bGF5bm8gKiBwaS0+c3RlcF9sICsgcGktPnJlc25vICogcGktPnN0ZXBfciArIHBpLT5jb21wbm8gKiBwaS0+c3RlcF9jICsgcGktPnByZWNubyAqIHBpLT5zdGVwX3A7CisgCQkJCQkJaWYgKCFwaS0+aW5jbHVkZVtpbmRleF0pIHsKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9DTWFrZUxpc3RzLnR4dCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvQ01ha2VMaXN0cy50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9DTWFrZUxpc3RzLnR4dApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9DTWFrZUxpc3RzLnR4dApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9SRUFETUUucGRmaXVtIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9SRUFETUUucGRmaXVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YzkzZjgKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL1JFQURNRS5wZGZpdW0KQEAgLTAsMCArMSwyMiBAQAorTmFtZTogT3BlbkpQRUcKK1VSTDogaHR0cDovL3d3dy5vcGVuanBlZy5vcmcvCitWZXJzaW9uOiAwZmE1YTE3Yzk4YzRiOGY5ZWUyMjg2ZjRmMGE1MGNmNTJhNWZjY2IwCitTZWN1cml0eSBDcml0aWNhbDogeWVzCitMaWNlbnNlOiAyLWNsYXVzZSBCU0QKKworRGVzY3JpcHRpb246CitKUEVHIDIwMDAgbGlicmFyeS4KKworTG9jYWwgTW9kaWZpY2F0aW9uczoKKworMDAwMC11c2UtY29sb3JzcGFjZS5wYXRjaDogTWFrZXMgaXQgcG9zc2libGUgdG8gbm90IGNhbGwgb3BqX2pwMl9hcHBseV9wY2xyKCkuCiswMDAxLWltYWdlLWRhdGEucGF0Y2g6IEZpeCBhIGNyYXNoaWVyIGluIG9wal9qMmtfdXBkYXRlX2ltYWdlX2RhdGEoKS4KKzAwMDItcGFja2V0LWl0ZXJhdG9yLnBhdGNoOiBGaXggaW50ZWdlciBvdmVyZmxvdyBpbiBvcGpfcGlfY3JlYXRlX2RlY29kZSgpLgorMDAwMy1kd3QtZGVjb2RlLnBhdGNoOiBDaGVjayBhcnJheSBib3VuZHMgZm9yIG9wal9kd3RfZGVjb2RlXzEoKSBhbmQgZnJpZW5kcy4KKzAwMDQtajJrX3JlYWRfbWNjLnBhdGNoOiBNb3ZlIGluY3JlbWVudGluZyBvZiBsX3RjcC0+bV9uYl9tY2NfcmVjb3JkcyB0byB0aGUgcmlnaHQgcGxhY2UuCiswMDA1LWpwMl9hcHBseV9wY2xyLnBhdGNoOiBGaXggb3V0IG9mIGJvdW5kcyBhY2Nlc3MuCiswMDA2LXRjZF9pbml0X3RpbGUucGF0Y2g6IEZpeCBhIGRpdmlkaW5nIHplcm8gYnVnIGluIG9wal90Y2RfaW5pdF90aWxlKCkuCiswMDA3LWpwMl9yZWFkX2NtYXAucGF0Y2g6IEZpeCB3cm9uZyByZW5kZXJpbmcgb24gZ3JleXNjYWxlIGltYWdlcyB3aXRoIGluZGV4IGNvbG9yc3BhY2UuCiswMDA4LWpwMl9jaGVja19jb2xvci5wYXRjaDogUmVwbGFjZSBhbiBhc3NlcnRpb24gd2l0aCByZXR1cm5pbmcgZmFsc2UuCiswMDA5LW9wal9waV9uZXh0LnBhdGNoOiBGaXggcG90ZW50aWFsIGJhZCBwcmVjbm8gdmFsdWUgaW4gb3BqX3BpX25leHQqIGZ1bmN0aW9ucy4KK1RPRE8odGhlc3RpZyk6IExpc3QgYWxsIHRoZSBvdGhlciBwYXRjaGVzLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9iaW8uYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvYmlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRlZGIzNwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvYmlvLmMKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKKyAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKKyAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKKyAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgVW5pdmVyc2l0ZSBjYXRob2xpcXVlIGRlIExvdXZhaW4gKFVDTCksIEJlbGdpdW0KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBQcm9mZXNzb3IgQmVub2l0IE1hY3EKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzLCBEYXZpZCBKYW5zc2VucworICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIFlhbm5pY2sgVmVyc2NodWVyZW4KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eCAKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE0LCBBbnRvbmluIERlc2NhbXBlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgQVMgSVMnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIm9wal9pbmNsdWRlcy5oIgorCisvKiogQGRlZmdyb3VwIEJJTyBCSU8gLSBJbmRpdmlkdWFsIGJpdCBpbnB1dC1vdXRwdXQgc3RyZWFtICovCisvKkB7Ki8KKworLyoqIEBuYW1lIExvY2FsIHN0YXRpYyBmdW5jdGlvbnMgKi8KKy8qQHsqLworCisvKioKK1dyaXRlIGEgYml0CitAcGFyYW0gYmlvIEJJTyBoYW5kbGUKK0BwYXJhbSBiIEJpdCB0byB3cml0ZSAoMCBvciAxKQorKi8KK3N0YXRpYyB2b2lkIG9wal9iaW9fcHV0Yml0KG9wal9iaW9fdCAqYmlvLCBPUEpfVUlOVDMyIGIpOworLyoqCitSZWFkIGEgYml0CitAcGFyYW0gYmlvIEJJTyBoYW5kbGUKK0ByZXR1cm4gUmV0dXJucyB0aGUgcmVhZCBiaXQKKyovCitzdGF0aWMgT1BKX1VJTlQzMiBvcGpfYmlvX2dldGJpdChvcGpfYmlvX3QgKmJpbyk7CisvKioKK1dyaXRlIGEgYnl0ZQorQHBhcmFtIGJpbyBCSU8gaGFuZGxlCitAcmV0dXJuIFJldHVybnMgT1BKX1RSVUUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBPUEpfRkFMU0Ugb3RoZXJ3aXNlCisqLworc3RhdGljIE9QSl9CT09MIG9wal9iaW9fYnl0ZW91dChvcGpfYmlvX3QgKmJpbyk7CisvKioKK1JlYWQgYSBieXRlCitAcGFyYW0gYmlvIEJJTyBoYW5kbGUKK0ByZXR1cm4gUmV0dXJucyBPUEpfVFJVRSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIE9QSl9GQUxTRSBvdGhlcndpc2UKKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2Jpb19ieXRlaW4ob3BqX2Jpb190ICpiaW8pOworCisvKkB9Ki8KKworLypAfSovCisKKy8qIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgbG9jYWwgZnVuY3Rpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitzdGF0aWMgT1BKX0JPT0wgb3BqX2Jpb19ieXRlb3V0KG9wal9iaW9fdCAqYmlvKSB7CisJYmlvLT5idWYgPSAoYmlvLT5idWYgPDwgOCkgJiAweGZmZmY7CisJYmlvLT5jdCA9IGJpby0+YnVmID09IDB4ZmYwMCA/IDcgOiA4OworCWlmICgoT1BKX1NJWkVfVCliaW8tPmJwID49IChPUEpfU0laRV9UKWJpby0+ZW5kKSB7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCSpiaW8tPmJwKysgPSAoT1BKX0JZVEUpKGJpby0+YnVmID4+IDgpOworCXJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9iaW9fYnl0ZWluKG9wal9iaW9fdCAqYmlvKSB7CisJYmlvLT5idWYgPSAoYmlvLT5idWYgPDwgOCkgJiAweGZmZmY7CisJYmlvLT5jdCA9IGJpby0+YnVmID09IDB4ZmYwMCA/IDcgOiA4OworCWlmICgoT1BKX1NJWkVfVCliaW8tPmJwID49IChPUEpfU0laRV9UKWJpby0+ZW5kKSB7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCWJpby0+YnVmIHw9ICpiaW8tPmJwKys7CisJcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgdm9pZCBvcGpfYmlvX3B1dGJpdChvcGpfYmlvX3QgKmJpbywgT1BKX1VJTlQzMiBiKSB7CisJaWYgKGJpby0+Y3QgPT0gMCkgeworCQlvcGpfYmlvX2J5dGVvdXQoYmlvKTsgLyogTVNEOiB3aHkgbm90IGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBmdW5jdGlvbiA/ICovCisJfQorCWJpby0+Y3QtLTsKKwliaW8tPmJ1ZiB8PSBiIDw8IGJpby0+Y3Q7Cit9CisKK3N0YXRpYyBPUEpfVUlOVDMyIG9wal9iaW9fZ2V0Yml0KG9wal9iaW9fdCAqYmlvKSB7CisJaWYgKGJpby0+Y3QgPT0gMCkgeworCQlvcGpfYmlvX2J5dGVpbihiaW8pOyAvKiBNU0Q6IHdoeSBub3QgY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIGZ1bmN0aW9uID8gKi8KKwl9CisJYmlvLT5jdC0tOworCXJldHVybiAoYmlvLT5idWYgPj4gYmlvLT5jdCkgJiAxOworfQorCisvKiAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIEJpdCBJbnB1dC9PdXRwdXQgaW50ZXJmYWNlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCitvcGpfYmlvX3QqIG9wal9iaW9fY3JlYXRlKHZvaWQpIHsKKwlvcGpfYmlvX3QgKmJpbyA9IChvcGpfYmlvX3QqKW9wal9tYWxsb2Moc2l6ZW9mKG9wal9iaW9fdCkpOworCXJldHVybiBiaW87Cit9CisKK3ZvaWQgb3BqX2Jpb19kZXN0cm95KG9wal9iaW9fdCAqYmlvKSB7CisJaWYoYmlvKSB7CisJCW9wal9mcmVlKGJpbyk7CisJfQorfQorCitwdHJkaWZmX3Qgb3BqX2Jpb19udW1ieXRlcyhvcGpfYmlvX3QgKmJpbykgeworCXJldHVybiAoYmlvLT5icCAtIGJpby0+c3RhcnQpOworfQorCit2b2lkIG9wal9iaW9faW5pdF9lbmMob3BqX2Jpb190ICpiaW8sIE9QSl9CWVRFICpicCwgT1BKX1VJTlQzMiBsZW4pIHsKKwliaW8tPnN0YXJ0ID0gYnA7CisJYmlvLT5lbmQgPSBicCArIGxlbjsKKwliaW8tPmJwID0gYnA7CisJYmlvLT5idWYgPSAwOworCWJpby0+Y3QgPSA4OworfQorCit2b2lkIG9wal9iaW9faW5pdF9kZWMob3BqX2Jpb190ICpiaW8sIE9QSl9CWVRFICpicCwgT1BKX1VJTlQzMiBsZW4pIHsKKwliaW8tPnN0YXJ0ID0gYnA7CisJYmlvLT5lbmQgPSBicCArIGxlbjsKKwliaW8tPmJwID0gYnA7CisJYmlvLT5idWYgPSAwOworCWJpby0+Y3QgPSAwOworfQorCit2b2lkIG9wal9iaW9fd3JpdGUob3BqX2Jpb190ICpiaW8sIE9QSl9VSU5UMzIgdiwgT1BKX1VJTlQzMiBuKSB7CisJT1BKX1VJTlQzMiBpOworCWZvciAoaSA9IG4gLSAxOyBpIDwgbjsgaS0tKSB7CisJCW9wal9iaW9fcHV0Yml0KGJpbywgKHYgPj4gaSkgJiAxKTsKKwl9Cit9CisKK09QSl9VSU5UMzIgb3BqX2Jpb19yZWFkKG9wal9iaW9fdCAqYmlvLCBPUEpfVUlOVDMyIG4pIHsKKwlPUEpfVUlOVDMyIGk7CisgICAgT1BKX1VJTlQzMiB2OworCXYgPSAwOworCWZvciAoaSA9IG4gLSAxOyBpIDwgbjsgaS0tKSB7CisJCXYgKz0gb3BqX2Jpb19nZXRiaXQoYmlvKSA8PCBpOworCX0KKwlyZXR1cm4gdjsKK30KKworT1BKX0JPT0wgb3BqX2Jpb19mbHVzaChvcGpfYmlvX3QgKmJpbykgeworCWlmICghIG9wal9iaW9fYnl0ZW91dChiaW8pKSB7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCWlmIChiaW8tPmN0ID09IDcpIHsKKwkJaWYgKCEgb3BqX2Jpb19ieXRlb3V0KGJpbykpIHsKKwkJCXJldHVybiBPUEpfRkFMU0U7CisJCX0KKwl9CisJcmV0dXJuIE9QSl9UUlVFOworfQorCitPUEpfQk9PTCBvcGpfYmlvX2luYWxpZ24ob3BqX2Jpb190ICpiaW8pIHsKKwlpZiAoKGJpby0+YnVmICYgMHhmZikgPT0gMHhmZikgeworCQlpZiAoISBvcGpfYmlvX2J5dGVpbihiaW8pKSB7CisJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQl9CisJfQorCWJpby0+Y3QgPSAwOworCXJldHVybiBPUEpfVFJVRTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9iaW8uaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvYmlvLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9iaW8uaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9iaW8uaApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9jaW8uYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvY2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJmNjQwNQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvY2lvLmMKQEAgLTAsMCArMSw2NDQgQEAKKy8qCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKKyAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKKyAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKKyAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgVW5pdmVyc2l0ZSBjYXRob2xpcXVlIGRlIExvdXZhaW4gKFVDTCksIEJlbGdpdW0KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBQcm9mZXNzb3IgQmVub2l0IE1hY3EKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzLCBEYXZpZCBKYW5zc2VucworICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIFlhbm5pY2sgVmVyc2NodWVyZW4KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eCAKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE0LCBBbnRvbmluIERlc2NhbXBlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMS0yMDEyLCBDZW50cmUgTmF0aW9uYWwgZCdFdHVkZXMgU3BhdGlhbGVzIChDTkVTKSwgRlIgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENTIFN5c3RlbWVzIGQnSW5mb3JtYXRpb24sIEZyYW5jZQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAib3BqX2luY2x1ZGVzLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBvcGpfd3JpdGVfYnl0ZXNfQkUgKE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9VSU5UMzIgcF92YWx1ZSwgT1BKX1VJTlQzMiBwX25iX2J5dGVzKQoreworCWNvbnN0IE9QSl9CWVRFICogbF9kYXRhX3B0ciA9ICgoY29uc3QgT1BKX0JZVEUgKikgJnBfdmFsdWUpK3NpemVvZihPUEpfVUlOVDMyKS1wX25iX2J5dGVzOworCisJYXNzZXJ0KHBfbmJfYnl0ZXMgPiAwICYmIHBfbmJfYnl0ZXMgPD0gIHNpemVvZihPUEpfVUlOVDMyKSk7CisKKwltZW1jcHkocF9idWZmZXIsbF9kYXRhX3B0cixwX25iX2J5dGVzKTsKK30KKwordm9pZCBvcGpfd3JpdGVfYnl0ZXNfTEUgKE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9VSU5UMzIgcF92YWx1ZSwgT1BKX1VJTlQzMiBwX25iX2J5dGVzKQoreworCWNvbnN0IE9QSl9CWVRFICogbF9kYXRhX3B0ciA9ICgoY29uc3QgT1BKX0JZVEUgKikgJnBfdmFsdWUpICsgcF9uYl9ieXRlcyAtIDE7CisJT1BKX1VJTlQzMiBpOworCisJYXNzZXJ0KHBfbmJfYnl0ZXMgPiAwICYmIHBfbmJfYnl0ZXMgPD0gc2l6ZW9mKE9QSl9VSU5UMzIpKTsKKworCWZvcgkoaT0wO2k8cF9uYl9ieXRlczsrK2kpIHsKKwkJKihwX2J1ZmZlcisrKSA9ICoobF9kYXRhX3B0ci0tKTsKKwl9Cit9CisKK3ZvaWQgb3BqX3JlYWRfYnl0ZXNfQkUoY29uc3QgT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX1VJTlQzMiAqIHBfdmFsdWUsIE9QSl9VSU5UMzIgcF9uYl9ieXRlcykKK3sKKwlPUEpfQllURSAqIGxfZGF0YV9wdHIgPSAoKE9QSl9CWVRFICopIHBfdmFsdWUpOworCisJYXNzZXJ0KHBfbmJfYnl0ZXMgPiAwICYmIHBfbmJfYnl0ZXMgPD0gc2l6ZW9mKE9QSl9VSU5UMzIpKTsKKworCSpwX3ZhbHVlID0gMDsKKwltZW1jcHkobF9kYXRhX3B0citzaXplb2YoT1BKX1VJTlQzMiktcF9uYl9ieXRlcyxwX2J1ZmZlcixwX25iX2J5dGVzKTsKK30KKwordm9pZCBvcGpfcmVhZF9ieXRlc19MRShjb25zdCBPUEpfQllURSAqIHBfYnVmZmVyLCBPUEpfVUlOVDMyICogcF92YWx1ZSwgT1BKX1VJTlQzMiBwX25iX2J5dGVzKQoreworCU9QSl9CWVRFICogbF9kYXRhX3B0ciA9ICgoT1BKX0JZVEUgKikgcF92YWx1ZSkgKyBwX25iX2J5dGVzLTE7CisJT1BKX1VJTlQzMiBpOworCisJYXNzZXJ0KHBfbmJfYnl0ZXMgPiAwICYmIHBfbmJfYnl0ZXMgPD0gc2l6ZW9mKE9QSl9VSU5UMzIpKTsKKworCSpwX3ZhbHVlID0gMDsKKwlmb3IgKGk9MDtpPHBfbmJfYnl0ZXM7KytpKSB7CisJCSoobF9kYXRhX3B0ci0tKSA9ICoocF9idWZmZXIrKyk7CisJfQorfQorCit2b2lkIG9wal93cml0ZV9kb3VibGVfQkUoT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX0ZMT0FUNjQgcF92YWx1ZSkKK3sKKwljb25zdCBPUEpfQllURSAqIGxfZGF0YV9wdHIgPSAoKGNvbnN0IE9QSl9CWVRFICopICZwX3ZhbHVlKTsKKwltZW1jcHkocF9idWZmZXIsbF9kYXRhX3B0cixzaXplb2YoT1BKX0ZMT0FUNjQpKTsKK30KKwordm9pZCBvcGpfd3JpdGVfZG91YmxlX0xFKE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9GTE9BVDY0IHBfdmFsdWUpCit7CisJY29uc3QgT1BKX0JZVEUgKiBsX2RhdGFfcHRyID0gKChjb25zdCBPUEpfQllURSAqKSAmcF92YWx1ZSkgKyBzaXplb2YoT1BKX0ZMT0FUNjQpIC0gMTsKKwlPUEpfVUlOVDMyIGk7CisJZm9yCShpPTA7aTxzaXplb2YoT1BKX0ZMT0FUNjQpOysraSkgeworCQkqKHBfYnVmZmVyKyspID0gKihsX2RhdGFfcHRyLS0pOworCX0KK30KKwordm9pZCBvcGpfcmVhZF9kb3VibGVfQkUoY29uc3QgT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX0ZMT0FUNjQgKiBwX3ZhbHVlKQoreworCU9QSl9CWVRFICogbF9kYXRhX3B0ciA9ICgoT1BKX0JZVEUgKikgcF92YWx1ZSk7CisJbWVtY3B5KGxfZGF0YV9wdHIscF9idWZmZXIsc2l6ZW9mKE9QSl9GTE9BVDY0KSk7Cit9CisKK3ZvaWQgb3BqX3JlYWRfZG91YmxlX0xFKGNvbnN0IE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9GTE9BVDY0ICogcF92YWx1ZSkKK3sKKwlPUEpfQllURSAqIGxfZGF0YV9wdHIgPSAoKE9QSl9CWVRFICopIHBfdmFsdWUpICsgc2l6ZW9mKE9QSl9GTE9BVDY0KS0xOworCU9QSl9VSU5UMzIgaTsKKwlmb3IgKGk9MDtpPHNpemVvZihPUEpfRkxPQVQ2NCk7KytpKSB7CisJCSoobF9kYXRhX3B0ci0tKSA9ICoocF9idWZmZXIrKyk7CisJfQorfQorCit2b2lkIG9wal93cml0ZV9mbG9hdF9CRShPUEpfQllURSAqIHBfYnVmZmVyLCBPUEpfRkxPQVQzMiBwX3ZhbHVlKQoreworCWNvbnN0IE9QSl9CWVRFICogbF9kYXRhX3B0ciA9ICgoY29uc3QgT1BKX0JZVEUgKikgJnBfdmFsdWUpOworCW1lbWNweShwX2J1ZmZlcixsX2RhdGFfcHRyLHNpemVvZihPUEpfRkxPQVQzMikpOworfQorCit2b2lkIG9wal93cml0ZV9mbG9hdF9MRShPUEpfQllURSAqIHBfYnVmZmVyLCBPUEpfRkxPQVQzMiBwX3ZhbHVlKQoreworCWNvbnN0IE9QSl9CWVRFICogbF9kYXRhX3B0ciA9ICgoY29uc3QgT1BKX0JZVEUgKikgJnBfdmFsdWUpICsgc2l6ZW9mKE9QSl9GTE9BVDMyKSAtIDE7CisJT1BKX1VJTlQzMiBpOworCWZvcgkoaT0wO2k8c2l6ZW9mKE9QSl9GTE9BVDMyKTsrK2kpIHsKKwkJKihwX2J1ZmZlcisrKSA9ICoobF9kYXRhX3B0ci0tKTsKKwl9Cit9CisKK3ZvaWQgb3BqX3JlYWRfZmxvYXRfQkUoY29uc3QgT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX0ZMT0FUMzIgKiBwX3ZhbHVlKQoreworCU9QSl9CWVRFICogbF9kYXRhX3B0ciA9ICgoT1BKX0JZVEUgKikgcF92YWx1ZSk7CisJbWVtY3B5KGxfZGF0YV9wdHIscF9idWZmZXIsc2l6ZW9mKE9QSl9GTE9BVDMyKSk7Cit9CisKK3ZvaWQgb3BqX3JlYWRfZmxvYXRfTEUoY29uc3QgT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX0ZMT0FUMzIgKiBwX3ZhbHVlKQoreworCU9QSl9CWVRFICogbF9kYXRhX3B0ciA9ICgoT1BKX0JZVEUgKikgcF92YWx1ZSkgKyBzaXplb2YoT1BKX0ZMT0FUMzIpLTE7CisJT1BKX1VJTlQzMiBpOworCWZvcgkoaT0wO2k8c2l6ZW9mKE9QSl9GTE9BVDMyKTsrK2kpIHsKKwkJKihsX2RhdGFfcHRyLS0pID0gKihwX2J1ZmZlcisrKTsKKwl9Cit9CisKK29wal9zdHJlYW1fdCogT1BKX0NBTExDT05WIG9wal9zdHJlYW1fY3JlYXRlKE9QSl9TSVpFX1QgcF9idWZmZXJfc2l6ZSxPUEpfQk9PTCBsX2lzX2lucHV0KQoreworCW9wal9zdHJlYW1fcHJpdmF0ZV90ICogbF9zdHJlYW0gPSAwMDsKKwlsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCopIG9wal9jYWxsb2MoMSxzaXplb2Yob3BqX3N0cmVhbV9wcml2YXRlX3QpKTsKKwlpZiAoISBsX3N0cmVhbSkgeworCQlyZXR1cm4gMDA7CisJfQorCisJbF9zdHJlYW0tPm1fYnVmZmVyX3NpemUgPSBwX2J1ZmZlcl9zaXplOworCWxfc3RyZWFtLT5tX3N0b3JlZF9kYXRhID0gKE9QSl9CWVRFICopIG9wal9tYWxsb2MocF9idWZmZXJfc2l6ZSk7CisJaWYgKCEgbF9zdHJlYW0tPm1fc3RvcmVkX2RhdGEpIHsKKwkJb3BqX2ZyZWUobF9zdHJlYW0pOworCQlyZXR1cm4gMDA7CisJfQorCisJbF9zdHJlYW0tPm1fY3VycmVudF9kYXRhID0gbF9zdHJlYW0tPm1fc3RvcmVkX2RhdGE7CisKKwlpZiAobF9pc19pbnB1dCkgeworCQlsX3N0cmVhbS0+bV9zdGF0dXMgfD0gb3BqX3N0cmVhbV9lX2lucHV0OworCQlsX3N0cmVhbS0+bV9vcGpfc2tpcCA9IG9wal9zdHJlYW1fcmVhZF9za2lwOworCQlsX3N0cmVhbS0+bV9vcGpfc2VlayA9IG9wal9zdHJlYW1fcmVhZF9zZWVrOworCX0KKwllbHNlIHsKKwkJbF9zdHJlYW0tPm1fc3RhdHVzIHw9IG9wal9zdHJlYW1fZV9vdXRwdXQ7CisJCWxfc3RyZWFtLT5tX29wal9za2lwID0gb3BqX3N0cmVhbV93cml0ZV9za2lwOworCQlsX3N0cmVhbS0+bV9vcGpfc2VlayA9IG9wal9zdHJlYW1fd3JpdGVfc2VlazsKKwl9CisKKwlsX3N0cmVhbS0+bV9yZWFkX2ZuID0gb3BqX3N0cmVhbV9kZWZhdWx0X3JlYWQ7CisJbF9zdHJlYW0tPm1fd3JpdGVfZm4gPSBvcGpfc3RyZWFtX2RlZmF1bHRfd3JpdGU7CisJbF9zdHJlYW0tPm1fc2tpcF9mbiA9IG9wal9zdHJlYW1fZGVmYXVsdF9za2lwOworCWxfc3RyZWFtLT5tX3NlZWtfZm4gPSBvcGpfc3RyZWFtX2RlZmF1bHRfc2VlazsKKworCXJldHVybiAob3BqX3N0cmVhbV90ICopIGxfc3RyZWFtOworfQorCitvcGpfc3RyZWFtX3QqIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX2RlZmF1bHRfY3JlYXRlKE9QSl9CT09MIGxfaXNfaW5wdXQpCit7CisJcmV0dXJuIG9wal9zdHJlYW1fY3JlYXRlKE9QSl9KMktfU1RSRUFNX0NIVU5LX1NJWkUsbF9pc19pbnB1dCk7Cit9CisKK3ZvaWQgT1BKX0NBTExDT05WIG9wal9zdHJlYW1fZGVzdHJveShvcGpfc3RyZWFtX3QqIHBfc3RyZWFtKQoreworCW9wal9zdHJlYW1fcHJpdmF0ZV90KiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCopIHBfc3RyZWFtOworCQorCWlmIChsX3N0cmVhbSkgeworCQlpZiAobF9zdHJlYW0tPm1fZnJlZV91c2VyX2RhdGFfZm4pIHsKKwkJCWxfc3RyZWFtLT5tX2ZyZWVfdXNlcl9kYXRhX2ZuKGxfc3RyZWFtLT5tX3VzZXJfZGF0YSk7CisJCX0KKwkJb3BqX2ZyZWUobF9zdHJlYW0tPm1fc3RvcmVkX2RhdGEpOworCQlsX3N0cmVhbS0+bV9zdG9yZWRfZGF0YSA9IDAwOworCQlvcGpfZnJlZShsX3N0cmVhbSk7CisJfQorfQorCit2b2lkIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX3NldF9yZWFkX2Z1bmN0aW9uKG9wal9zdHJlYW1fdCogcF9zdHJlYW0sIG9wal9zdHJlYW1fcmVhZF9mbiBwX2Z1bmN0aW9uKQoreworCW9wal9zdHJlYW1fcHJpdmF0ZV90KiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCopIHBfc3RyZWFtOworCisJaWYgKCghbF9zdHJlYW0pIHx8ICghIChsX3N0cmVhbS0+bV9zdGF0dXMgJiBvcGpfc3RyZWFtX2VfaW5wdXQpKSkgeworCQlyZXR1cm47CisJfQorCisJbF9zdHJlYW0tPm1fcmVhZF9mbiA9IHBfZnVuY3Rpb247Cit9CisKK3ZvaWQgT1BKX0NBTExDT05WIG9wal9zdHJlYW1fc2V0X3NlZWtfZnVuY3Rpb24ob3BqX3N0cmVhbV90KiBwX3N0cmVhbSwgb3BqX3N0cmVhbV9zZWVrX2ZuIHBfZnVuY3Rpb24pCit7CisJb3BqX3N0cmVhbV9wcml2YXRlX3QqIGxfc3RyZWFtID0gKG9wal9zdHJlYW1fcHJpdmF0ZV90KikgcF9zdHJlYW07CisJCisJaWYgKCFsX3N0cmVhbSkgeworCQlyZXR1cm47CisJfQorCWxfc3RyZWFtLT5tX3NlZWtfZm4gPSBwX2Z1bmN0aW9uOworfQorCit2b2lkIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX3NldF93cml0ZV9mdW5jdGlvbihvcGpfc3RyZWFtX3QqIHBfc3RyZWFtLCBvcGpfc3RyZWFtX3dyaXRlX2ZuIHBfZnVuY3Rpb24pCit7CisJb3BqX3N0cmVhbV9wcml2YXRlX3QqIGxfc3RyZWFtID0gKG9wal9zdHJlYW1fcHJpdmF0ZV90KikgcF9zdHJlYW07CisJCisJaWYgKCghbF9zdHJlYW0gKXx8ICghIChsX3N0cmVhbS0+bV9zdGF0dXMgJiBvcGpfc3RyZWFtX2Vfb3V0cHV0KSkpIHsKKwkJcmV0dXJuOworCX0KKworCWxfc3RyZWFtLT5tX3dyaXRlX2ZuID0gcF9mdW5jdGlvbjsKK30KKwordm9pZCBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9zZXRfc2tpcF9mdW5jdGlvbihvcGpfc3RyZWFtX3QqIHBfc3RyZWFtLCBvcGpfc3RyZWFtX3NraXBfZm4gcF9mdW5jdGlvbikKK3sKKwlvcGpfc3RyZWFtX3ByaXZhdGVfdCogbF9zdHJlYW0gPSAob3BqX3N0cmVhbV9wcml2YXRlX3QqKSBwX3N0cmVhbTsKKwkKKwlpZiAoISBsX3N0cmVhbSkgeworCQlyZXR1cm47CisJfQorCisJbF9zdHJlYW0tPm1fc2tpcF9mbiA9IHBfZnVuY3Rpb247Cit9CisKK3ZvaWQgT1BKX0NBTExDT05WIG9wal9zdHJlYW1fc2V0X3VzZXJfZGF0YShvcGpfc3RyZWFtX3QqIHBfc3RyZWFtLCB2b2lkICogcF9kYXRhLCBvcGpfc3RyZWFtX2ZyZWVfdXNlcl9kYXRhX2ZuIHBfZnVuY3Rpb24pCit7CisJb3BqX3N0cmVhbV9wcml2YXRlX3QqIGxfc3RyZWFtID0gKG9wal9zdHJlYW1fcHJpdmF0ZV90KikgcF9zdHJlYW07CisJaWYgKCFsX3N0cmVhbSkKKwkJcmV0dXJuOworCWxfc3RyZWFtLT5tX3VzZXJfZGF0YSA9IHBfZGF0YTsKKyAgbF9zdHJlYW0tPm1fZnJlZV91c2VyX2RhdGFfZm4gPSBwX2Z1bmN0aW9uOworfQorCit2b2lkIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX3NldF91c2VyX2RhdGFfbGVuZ3RoKG9wal9zdHJlYW1fdCogcF9zdHJlYW0sIE9QSl9VSU5UNjQgZGF0YV9sZW5ndGgpCit7CisJb3BqX3N0cmVhbV9wcml2YXRlX3QqIGxfc3RyZWFtID0gKG9wal9zdHJlYW1fcHJpdmF0ZV90KikgcF9zdHJlYW07CisJaWYgKCFsX3N0cmVhbSkKKwkJcmV0dXJuOworCWxfc3RyZWFtLT5tX3VzZXJfZGF0YV9sZW5ndGggPSBkYXRhX2xlbmd0aDsKK30KKworT1BKX1NJWkVfVCBvcGpfc3RyZWFtX3JlYWRfZGF0YSAob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSxPUEpfQllURSAqIHBfYnVmZmVyLCBPUEpfU0laRV9UIHBfc2l6ZSwgb3BqX2V2ZW50X21ncl90ICogcF9ldmVudF9tZ3IpCit7CisJT1BKX1NJWkVfVCBsX3JlYWRfbmJfYnl0ZXMgPSAwOworCWlmIChwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPj0gcF9zaXplKSB7CisJCW1lbWNweShwX2J1ZmZlcixwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEscF9zaXplKTsKKwkJcF9zdHJlYW0tPm1fY3VycmVudF9kYXRhICs9IHBfc2l6ZTsKKwkJcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyIC09IHBfc2l6ZTsKKwkJbF9yZWFkX25iX2J5dGVzICs9IHBfc2l6ZTsKKwkJcF9zdHJlYW0tPm1fYnl0ZV9vZmZzZXQgKz0gKE9QSl9PRkZfVClwX3NpemU7CisJCXJldHVybiBsX3JlYWRfbmJfYnl0ZXM7CisJfQorCisJLyogd2UgYXJlIG5vdyBpbiB0aGUgY2FzZSB3aGVuIHRoZSByZW1haW5pbmcgZGF0YSBpZiBub3Qgc3VmZmljaWVudCAqLworCWlmIChwX3N0cmVhbS0+bV9zdGF0dXMgJiBvcGpfc3RyZWFtX2VfZW5kKSB7CisJCWxfcmVhZF9uYl9ieXRlcyArPSBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXI7CisJCW1lbWNweShwX2J1ZmZlcixwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEscF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyKTsKKwkJcF9zdHJlYW0tPm1fY3VycmVudF9kYXRhICs9IHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKKwkJcF9zdHJlYW0tPm1fYnl0ZV9vZmZzZXQgKz0gKE9QSl9PRkZfVClwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXI7CisJCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA9IDA7CisJCXJldHVybiBsX3JlYWRfbmJfYnl0ZXMgPyBsX3JlYWRfbmJfYnl0ZXMgOiAoT1BKX1NJWkVfVCktMTsKKwl9CisKKwkvKiB0aGUgZmxhZyBpcyBub3Qgc2V0LCB3ZSBjb3B5IGRhdGEgYW5kIHRoZW4gZG8gYW4gYWN0dWFsIHJlYWQgb24gdGhlIHN0cmVhbSAqLworCWlmIChwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIpIHsKKwkJbF9yZWFkX25iX2J5dGVzICs9IHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKKwkJbWVtY3B5KHBfYnVmZmVyLHBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSxwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIpOworCQlwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEgPSBwX3N0cmVhbS0+bV9zdG9yZWRfZGF0YTsKKwkJcF9idWZmZXIgKz0gcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOworCQlwX3NpemUgLT0gcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOworCQlwX3N0cmVhbS0+bV9ieXRlX29mZnNldCArPSAoT1BKX09GRl9UKXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKKwkJcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyID0gMDsKKwl9CisJZWxzZSB7CisgICAgLyogY2FzZSB3aGVyZSB3ZSBhcmUgYWxyZWFkeSBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIKKyAgICAgICBzbyByZXNldCB0aGUgbV9jdXJyZW50X2RhdGEgdG8gcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZQorICAgICAgIHN0b3JlZCBidWZmZXIgdG8gZ2V0IHJlYWR5IHRvIHJlYWQgZnJvbSBkaXNrKi8KKwkJcF9zdHJlYW0tPm1fY3VycmVudF9kYXRhID0gcF9zdHJlYW0tPm1fc3RvcmVkX2RhdGE7CisJfQorCisJZm9yICg7OykgeworCQkvKiB3ZSBzaG91bGQgcmVhZCBsZXNzIHRoYW4gYSBjaHVuayAtPiByZWFkIGEgY2h1bmsgKi8KKwkJaWYgKHBfc2l6ZSA8IHBfc3RyZWFtLT5tX2J1ZmZlcl9zaXplKSB7CisJCQkvKiB3ZSBzaG91bGQgZG8gYW4gYWN0dWFsIHJlYWQgb24gdGhlIG1lZGlhICovCisJCQlwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPSBwX3N0cmVhbS0+bV9yZWFkX2ZuKHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhLHBfc3RyZWFtLT5tX2J1ZmZlcl9zaXplLHBfc3RyZWFtLT5tX3VzZXJfZGF0YSk7CisKKwkJCWlmIChwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPT0gKE9QSl9TSVpFX1QpLTEpIHsKKwkJCQkvKiBlbmQgb2Ygc3RyZWFtICovCisJCQkJb3BqX2V2ZW50X21zZyhwX2V2ZW50X21nciwgRVZUX0lORk8sICJTdHJlYW0gcmVhY2hlZCBpdHMgZW5kICFcbiIpOworCisJCQkJcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyID0gMDsKKwkJCQlwX3N0cmVhbS0+bV9zdGF0dXMgfD0gb3BqX3N0cmVhbV9lX2VuZDsKKwkJCQkvKiBlbmQgb2Ygc3RyZWFtICovCisJCQkJcmV0dXJuIGxfcmVhZF9uYl9ieXRlcyA/IGxfcmVhZF9uYl9ieXRlcyA6IChPUEpfU0laRV9UKS0xOworCQkJfQorCQkJZWxzZSBpZgkocF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyIDwgcF9zaXplKSB7CisJCQkJLyogbm90IGVub3VnaCBkYXRhICovCisJCQkJbF9yZWFkX25iX2J5dGVzICs9IHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKKwkJCQltZW1jcHkocF9idWZmZXIscF9zdHJlYW0tPm1fY3VycmVudF9kYXRhLHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcik7CisJCQkJcF9zdHJlYW0tPm1fY3VycmVudF9kYXRhID0gcF9zdHJlYW0tPm1fc3RvcmVkX2RhdGE7CisJCQkJcF9idWZmZXIgKz0gcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOworCQkJCXBfc2l6ZSAtPSBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXI7CisJCQkJcF9zdHJlYW0tPm1fYnl0ZV9vZmZzZXQgKz0gKE9QSl9PRkZfVClwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXI7CisJCQkJcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyID0gMDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWxfcmVhZF9uYl9ieXRlcyArPSBwX3NpemU7CisJCQkJbWVtY3B5KHBfYnVmZmVyLHBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSxwX3NpemUpOworCQkJCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSArPSBwX3NpemU7CisJCQkJcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyIC09IHBfc2l6ZTsKKwkJCQlwX3N0cmVhbS0+bV9ieXRlX29mZnNldCArPSAoT1BKX09GRl9UKXBfc2l6ZTsKKwkJCQlyZXR1cm4gbF9yZWFkX25iX2J5dGVzOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJLyogZGlyZWN0IHJlYWQgb24gdGhlIGRlc3QgYnVmZmVyICovCisJCQlwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPSBwX3N0cmVhbS0+bV9yZWFkX2ZuKHBfYnVmZmVyLHBfc2l6ZSxwX3N0cmVhbS0+bV91c2VyX2RhdGEpOworCisJCQlpZiAocF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyID09IChPUEpfU0laRV9UKS0xKSB7CisJCQkJLyogIGVuZCBvZiBzdHJlYW0gKi8KKwkJCQlvcGpfZXZlbnRfbXNnKHBfZXZlbnRfbWdyLCBFVlRfSU5GTywgIlN0cmVhbSByZWFjaGVkIGl0cyBlbmQgIVxuIik7CisKKwkJCQlwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPSAwOworCQkJCXBfc3RyZWFtLT5tX3N0YXR1cyB8PSBvcGpfc3RyZWFtX2VfZW5kOworCQkJCS8qIGVuZCBvZiBzdHJlYW0gKi8KKwkJCQlyZXR1cm4gbF9yZWFkX25iX2J5dGVzID8gbF9yZWFkX25iX2J5dGVzIDogKE9QSl9TSVpFX1QpLTE7CisJCQl9CisJCQllbHNlIGlmIChwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPCBwX3NpemUpIHsKKwkJCQkvKiBub3QgZW5vdWdoIGRhdGEgKi8KKwkJCQlsX3JlYWRfbmJfYnl0ZXMgKz0gcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOworCQkJCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSA9IHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhOworCQkJCXBfYnVmZmVyICs9IHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKKwkJCQlwX3NpemUgLT0gcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOworCQkJCXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IChPUEpfT0ZGX1QpcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOworCQkJCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA9IDA7CisJCQl9CisJCQllbHNlIHsKKwkJCQkvKiB3ZSBoYXZlIHJlYWQgdGhlIGV4YWN0IHNpemUgKi8KKwkJCQlsX3JlYWRfbmJfYnl0ZXMgKz0gcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOworCQkJCXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IChPUEpfT0ZGX1QpcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOworCQkJCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSA9IHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhOworCQkJCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA9IDA7CisJCQkJcmV0dXJuIGxfcmVhZF9uYl9ieXRlczsKKwkJCX0KKwkJfQorCX0KK30KKworT1BKX1NJWkVfVCBvcGpfc3RyZWFtX3dyaXRlX2RhdGEgKG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0sCisJCQkJCQkJCSAgY29uc3QgT1BKX0JZVEUgKiBwX2J1ZmZlciwKKwkJCQkJCQkJICBPUEpfU0laRV9UIHBfc2l6ZSwgCisJCQkJCQkJCSAgb3BqX2V2ZW50X21ncl90ICogcF9ldmVudF9tZ3IpCit7CisJT1BKX1NJWkVfVCBsX3JlbWFpbmluZ19ieXRlcyA9IDA7CisJT1BKX1NJWkVfVCBsX3dyaXRlX25iX2J5dGVzID0gMDsKKworCWlmIChwX3N0cmVhbS0+bV9zdGF0dXMgJiBvcGpfc3RyZWFtX2VfZXJyb3IpIHsKKwkJcmV0dXJuIChPUEpfU0laRV9UKS0xOworCX0KKworCWZvciAoOzspIHsKKwkJbF9yZW1haW5pbmdfYnl0ZXMgPSBwX3N0cmVhbS0+bV9idWZmZXJfc2l6ZSAtIHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKKwkJCisJCS8qIHdlIGhhdmUgbW9yZSBtZW1vcnkgdGhhbiByZXF1aXJlZCAqLworCQlpZiAobF9yZW1haW5pbmdfYnl0ZXMgPj0gcF9zaXplKSB7CisJCQltZW1jcHkocF9zdHJlYW0tPm1fY3VycmVudF9kYXRhLCBwX2J1ZmZlciwgcF9zaXplKTsKKwkJCQorCQkJcF9zdHJlYW0tPm1fY3VycmVudF9kYXRhICs9IHBfc2l6ZTsKKwkJCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciArPSBwX3NpemU7CisJCQlsX3dyaXRlX25iX2J5dGVzICs9IHBfc2l6ZTsKKwkJCXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IChPUEpfT0ZGX1QpcF9zaXplOworCQkJCisJCQlyZXR1cm4gbF93cml0ZV9uYl9ieXRlczsKKwkJfQorCisJCS8qIHdlIGNvcHkgZGF0YSBhbmQgdGhlbiBkbyBhbiBhY3R1YWwgcmVhZCBvbiB0aGUgc3RyZWFtICovCisJCWlmIChsX3JlbWFpbmluZ19ieXRlcykgeworCQkJbF93cml0ZV9uYl9ieXRlcyArPSBsX3JlbWFpbmluZ19ieXRlczsKKwkJCQorCQkJbWVtY3B5KHBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSxwX2J1ZmZlcixsX3JlbWFpbmluZ19ieXRlcyk7CisJCQkKKwkJCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSA9IHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhOworCQkJCisJCQlwX2J1ZmZlciArPSBsX3JlbWFpbmluZ19ieXRlczsKKwkJCXBfc2l6ZSAtPSBsX3JlbWFpbmluZ19ieXRlczsKKwkJCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciArPSBsX3JlbWFpbmluZ19ieXRlczsKKwkJCXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IChPUEpfT0ZGX1QpbF9yZW1haW5pbmdfYnl0ZXM7CisJCX0KKworCQlpZiAoISBvcGpfc3RyZWFtX2ZsdXNoKHBfc3RyZWFtLCBwX2V2ZW50X21ncikpIHsKKwkJCXJldHVybiAoT1BKX1NJWkVfVCktMTsKKwkJfQorCX0KKworfQorCitPUEpfQk9PTCBvcGpfc3RyZWFtX2ZsdXNoIChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLCBvcGpfZXZlbnRfbWdyX3QgKiBwX2V2ZW50X21ncikKK3sKKwkvKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gb24gdGhlIG1lZGlhLiAqLworCU9QSl9TSVpFX1QgbF9jdXJyZW50X3dyaXRlX25iX2J5dGVzID0gMDsKKworCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSA9IHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhOworCisJd2hpbGUgKHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcikgeworCQkvKiB3ZSBzaG91bGQgZG8gYW4gYWN0dWFsIHdyaXRlIG9uIHRoZSBtZWRpYSAqLworCQlsX2N1cnJlbnRfd3JpdGVfbmJfYnl0ZXMgPSBwX3N0cmVhbS0+bV93cml0ZV9mbihwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEsCisJCQkJCQkJCQkJCQkJCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciwKKwkJCQkJCQkJCQkJCQkJcF9zdHJlYW0tPm1fdXNlcl9kYXRhKTsKKwkJCisJCWlmIChsX2N1cnJlbnRfd3JpdGVfbmJfYnl0ZXMgPT0gKE9QSl9TSVpFX1QpLTEpIHsKKwkJCXBfc3RyZWFtLT5tX3N0YXR1cyB8PSBvcGpfc3RyZWFtX2VfZXJyb3I7CisJCQlvcGpfZXZlbnRfbXNnKHBfZXZlbnRfbWdyLCBFVlRfSU5GTywgIkVycm9yIG9uIHdyaXRpbmcgc3RyZWFtIVxuIik7CisKKwkJCXJldHVybiBPUEpfRkFMU0U7CisJCX0KKworCQlwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEgKz0gbF9jdXJyZW50X3dyaXRlX25iX2J5dGVzOworCQlwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgLT0gbF9jdXJyZW50X3dyaXRlX25iX2J5dGVzOworCX0KKworCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSA9IHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhOworCQorCXJldHVybiBPUEpfVFJVRTsKK30KKworT1BKX09GRl9UIG9wal9zdHJlYW1fcmVhZF9za2lwIChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLCBPUEpfT0ZGX1QgcF9zaXplLCBvcGpfZXZlbnRfbWdyX3QgKiBwX2V2ZW50X21ncikKK3sKKwlPUEpfT0ZGX1QgbF9za2lwX25iX2J5dGVzID0gMDsKKwlPUEpfT0ZGX1QgbF9jdXJyZW50X3NraXBfbmJfYnl0ZXMgPSAwOworCQorCWFzc2VydCggcF9zaXplID49IDAgKTsKKwkKKwlpZiAocF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyID49IChPUEpfU0laRV9UKXBfc2l6ZSkgeworCQlwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEgKz0gcF9zaXplOworCQkvKiBpdCBpcyBzYWZlIHRvIGNhc3QgcF9zaXplIHRvIE9QSl9TSVpFX1Qgc2luY2UgaXQgaXMgPD0gbV9ieXRlc19pbl9idWZmZXIKKwkJd2hpY2ggaXMgb2YgdHlwZSBPUEpfU0laRV9UICovCisJCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciAtPSAoT1BKX1NJWkVfVClwX3NpemU7CisJCWxfc2tpcF9uYl9ieXRlcyArPSBwX3NpemU7CisJCXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IGxfc2tpcF9uYl9ieXRlczsKKwkJcmV0dXJuIGxfc2tpcF9uYl9ieXRlczsKKwl9CisKKwkvKiB3ZSBhcmUgbm93IGluIHRoZSBjYXNlIHdoZW4gdGhlIHJlbWFpbmluZyBkYXRhIGlmIG5vdCBzdWZmaWNpZW50ICovCisJaWYgKHBfc3RyZWFtLT5tX3N0YXR1cyAmIG9wal9zdHJlYW1fZV9lbmQpIHsKKwkJbF9za2lwX25iX2J5dGVzICs9IChPUEpfT0ZGX1QpcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOworCQlwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEgKz0gcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOworCQlwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPSAwOworCQlwX3N0cmVhbS0+bV9ieXRlX29mZnNldCArPSBsX3NraXBfbmJfYnl0ZXM7CisJCXJldHVybiBsX3NraXBfbmJfYnl0ZXMgPyBsX3NraXBfbmJfYnl0ZXMgOiAoT1BKX09GRl9UKSAtMTsKKwl9CisKKwkvKiB0aGUgZmxhZyBpcyBub3Qgc2V0LCB3ZSBjb3B5IGRhdGEgYW5kIHRoZW4gZG8gYW4gYWN0dWFsIHNraXAgb24gdGhlIHN0cmVhbSAqLworCWlmIChwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIpIHsKKwkJbF9za2lwX25iX2J5dGVzICs9IChPUEpfT0ZGX1QpcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOworCQlwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEgPSBwX3N0cmVhbS0+bV9zdG9yZWRfZGF0YTsKKwkJcF9zaXplIC09IChPUEpfT0ZGX1QpcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOworCQlwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPSAwOworCX0KKworCXdoaWxlIChwX3NpemUgPiAwKSB7CisJCS8qIHdlIHNob3VsZCBkbyBhbiBhY3R1YWwgc2tpcCBvbiB0aGUgbWVkaWEgKi8KKwkJbF9jdXJyZW50X3NraXBfbmJfYnl0ZXMgPSBwX3N0cmVhbS0+bV9za2lwX2ZuKHBfc2l6ZSwgcF9zdHJlYW0tPm1fdXNlcl9kYXRhKTsKKwkJaWYgKGxfY3VycmVudF9za2lwX25iX2J5dGVzID09IChPUEpfT0ZGX1QpIC0xKSB7CisJCQlvcGpfZXZlbnRfbXNnKHBfZXZlbnRfbWdyLCBFVlRfSU5GTywgIlN0cmVhbSByZWFjaGVkIGl0cyBlbmQgIVxuIik7CisKKwkJCXBfc3RyZWFtLT5tX3N0YXR1cyB8PSBvcGpfc3RyZWFtX2VfZW5kOworCQkJcF9zdHJlYW0tPm1fYnl0ZV9vZmZzZXQgKz0gbF9za2lwX25iX2J5dGVzOworCQkJLyogZW5kIGlmIHN0cmVhbSAqLworCQkJcmV0dXJuIGxfc2tpcF9uYl9ieXRlcyA/IGxfc2tpcF9uYl9ieXRlcyA6IChPUEpfT0ZGX1QpIC0xOworCQl9CisJCXBfc2l6ZSAtPSBsX2N1cnJlbnRfc2tpcF9uYl9ieXRlczsKKwkJbF9za2lwX25iX2J5dGVzICs9IGxfY3VycmVudF9za2lwX25iX2J5dGVzOworCX0KKworCXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IGxfc2tpcF9uYl9ieXRlczsKKwkKKwlyZXR1cm4gbF9za2lwX25iX2J5dGVzOworfQorCitPUEpfT0ZGX1Qgb3BqX3N0cmVhbV93cml0ZV9za2lwIChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLCBPUEpfT0ZGX1QgcF9zaXplLCBvcGpfZXZlbnRfbWdyX3QgKiBwX2V2ZW50X21ncikKK3sKKwlPUEpfQk9PTCBsX2lzX3dyaXR0ZW4gPSAwOworCU9QSl9PRkZfVCBsX2N1cnJlbnRfc2tpcF9uYl9ieXRlcyA9IDA7CisJT1BKX09GRl9UIGxfc2tpcF9uYl9ieXRlcyA9IDA7CisKKwlpZiAocF9zdHJlYW0tPm1fc3RhdHVzICYgb3BqX3N0cmVhbV9lX2Vycm9yKSB7CisJCXJldHVybiAoT1BKX09GRl9UKSAtMTsKKwl9CisKKwkvKiB3ZSBzaG91bGQgZmx1c2ggZGF0YSAqLworCWxfaXNfd3JpdHRlbiA9IG9wal9zdHJlYW1fZmx1c2ggKHBfc3RyZWFtLCBwX2V2ZW50X21ncik7CisJaWYgKCEgbF9pc193cml0dGVuKSB7CisJCXBfc3RyZWFtLT5tX3N0YXR1cyB8PSBvcGpfc3RyZWFtX2VfZXJyb3I7CisJCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA9IDA7CisJCXJldHVybiAoT1BKX09GRl9UKSAtMTsKKwl9CisJLyogdGhlbiBza2lwICovCisKKwl3aGlsZSAocF9zaXplID4gMCkgeworCQkvKiB3ZSBzaG91bGQgZG8gYW4gYWN0dWFsIHNraXAgb24gdGhlIG1lZGlhICovCisJCWxfY3VycmVudF9za2lwX25iX2J5dGVzID0gcF9zdHJlYW0tPm1fc2tpcF9mbihwX3NpemUsIHBfc3RyZWFtLT5tX3VzZXJfZGF0YSk7CisJCQorCQlpZiAobF9jdXJyZW50X3NraXBfbmJfYnl0ZXMgPT0gKE9QSl9PRkZfVCktMSkgeworCQkJb3BqX2V2ZW50X21zZyhwX2V2ZW50X21nciwgRVZUX0lORk8sICJTdHJlYW0gZXJyb3IhXG4iKTsKKworCQkJcF9zdHJlYW0tPm1fc3RhdHVzIHw9IG9wal9zdHJlYW1fZV9lcnJvcjsKKwkJCXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IGxfc2tpcF9uYl9ieXRlczsKKwkJCS8qIGVuZCBpZiBzdHJlYW0gKi8KKwkJCXJldHVybiBsX3NraXBfbmJfYnl0ZXMgPyBsX3NraXBfbmJfYnl0ZXMgOiAoT1BKX09GRl9UKS0xOworCQl9CisJCXBfc2l6ZSAtPSBsX2N1cnJlbnRfc2tpcF9uYl9ieXRlczsKKwkJbF9za2lwX25iX2J5dGVzICs9IGxfY3VycmVudF9za2lwX25iX2J5dGVzOworCX0KKworCXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IGxfc2tpcF9uYl9ieXRlczsKKwkKKwlyZXR1cm4gbF9za2lwX25iX2J5dGVzOworfQorCitPUEpfT0ZGX1Qgb3BqX3N0cmVhbV90ZWxsIChjb25zdCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtKQoreworCXJldHVybiBwX3N0cmVhbS0+bV9ieXRlX29mZnNldDsKK30KKworT1BKX09GRl9UIG9wal9zdHJlYW1fZ2V0X251bWJlcl9ieXRlX2xlZnQgKGNvbnN0IG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0pCit7CisgIGFzc2VydCggcF9zdHJlYW0tPm1fYnl0ZV9vZmZzZXQgPj0gMCApOworICBhc3NlcnQoIHBfc3RyZWFtLT5tX3VzZXJfZGF0YV9sZW5ndGggPj0gKE9QSl9VSU5UNjQpcF9zdHJlYW0tPm1fYnl0ZV9vZmZzZXQpOworICByZXR1cm4gcF9zdHJlYW0tPm1fdXNlcl9kYXRhX2xlbmd0aCA/CisJCQkJKE9QSl9PRkZfVCkocF9zdHJlYW0tPm1fdXNlcl9kYXRhX2xlbmd0aCkgLSBwX3N0cmVhbS0+bV9ieXRlX29mZnNldCA6CisJCQkJMDsKK30KKworT1BKX09GRl9UIG9wal9zdHJlYW1fc2tpcCAob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSwgT1BKX09GRl9UIHBfc2l6ZSwgb3BqX2V2ZW50X21ncl90ICogcF9ldmVudF9tZ3IpCit7CisJYXNzZXJ0KHBfc2l6ZSA+PSAwKTsKKwlyZXR1cm4gcF9zdHJlYW0tPm1fb3BqX3NraXAocF9zdHJlYW0scF9zaXplLHBfZXZlbnRfbWdyKTsKK30KKworT1BKX0JPT0wgb3BqX3N0cmVhbV9yZWFkX3NlZWsgKG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0sIE9QSl9PRkZfVCBwX3NpemUsIG9wal9ldmVudF9tZ3JfdCAqIHBfZXZlbnRfbWdyKQoreworCU9QSl9BUkdfTk9UX1VTRUQocF9ldmVudF9tZ3IpOworCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSA9IHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhOworCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA9IDA7CisKKwlpZiggIShwX3N0cmVhbS0+bV9zZWVrX2ZuKHBfc2l6ZSxwX3N0cmVhbS0+bV91c2VyX2RhdGEpKSApIHsKKwkJcF9zdHJlYW0tPm1fc3RhdHVzIHw9IG9wal9zdHJlYW1fZV9lbmQ7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCWVsc2UgeworCQkvKiByZXNldCBzdHJlYW0gc3RhdHVzICovCisJCXBfc3RyZWFtLT5tX3N0YXR1cyAmPSAofm9wal9zdHJlYW1fZV9lbmQpOworCQlwX3N0cmVhbS0+bV9ieXRlX29mZnNldCA9IHBfc2l6ZTsKKworCX0KKworCXJldHVybiBPUEpfVFJVRTsKK30KKworT1BKX0JPT0wgb3BqX3N0cmVhbV93cml0ZV9zZWVrIChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLCBPUEpfT0ZGX1QgcF9zaXplLCBvcGpfZXZlbnRfbWdyX3QgKiBwX2V2ZW50X21ncikKK3sKKwlpZiAoISBvcGpfc3RyZWFtX2ZsdXNoKHBfc3RyZWFtLHBfZXZlbnRfbWdyKSkgeworCQlwX3N0cmVhbS0+bV9zdGF0dXMgfD0gb3BqX3N0cmVhbV9lX2Vycm9yOworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKworCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSA9IHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhOworCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA9IDA7CisKKwlpZiAoISBwX3N0cmVhbS0+bV9zZWVrX2ZuKHBfc2l6ZSxwX3N0cmVhbS0+bV91c2VyX2RhdGEpKSB7CisJCXBfc3RyZWFtLT5tX3N0YXR1cyB8PSBvcGpfc3RyZWFtX2VfZXJyb3I7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCWVsc2UgeworCQlwX3N0cmVhbS0+bV9ieXRlX29mZnNldCA9IHBfc2l6ZTsKKwl9CisKKwlyZXR1cm4gT1BKX1RSVUU7Cit9CisKK09QSl9CT09MIG9wal9zdHJlYW1fc2VlayAob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSwgT1BKX09GRl9UIHBfc2l6ZSwgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX2V2ZW50X21ncikKK3sKKwlhc3NlcnQocF9zaXplID49IDApOworCXJldHVybiBwX3N0cmVhbS0+bV9vcGpfc2VlayhwX3N0cmVhbSxwX3NpemUscF9ldmVudF9tZ3IpOworfQorCitPUEpfQk9PTCBvcGpfc3RyZWFtX2hhc19zZWVrIChjb25zdCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtKQoreworCXJldHVybiBwX3N0cmVhbS0+bV9zZWVrX2ZuICE9IG9wal9zdHJlYW1fZGVmYXVsdF9zZWVrOworfQorCitPUEpfU0laRV9UIG9wal9zdHJlYW1fZGVmYXVsdF9yZWFkICh2b2lkICogcF9idWZmZXIsIE9QSl9TSVpFX1QgcF9uYl9ieXRlcywgdm9pZCAqIHBfdXNlcl9kYXRhKQoreworCU9QSl9BUkdfTk9UX1VTRUQocF9idWZmZXIpOworCU9QSl9BUkdfTk9UX1VTRUQocF9uYl9ieXRlcyk7CisJT1BKX0FSR19OT1RfVVNFRChwX3VzZXJfZGF0YSk7CisJcmV0dXJuIChPUEpfU0laRV9UKSAtMTsKK30KKworT1BKX1NJWkVfVCBvcGpfc3RyZWFtX2RlZmF1bHRfd3JpdGUgKHZvaWQgKiBwX2J1ZmZlciwgT1BKX1NJWkVfVCBwX25iX2J5dGVzLCB2b2lkICogcF91c2VyX2RhdGEpCit7CisJT1BKX0FSR19OT1RfVVNFRChwX2J1ZmZlcik7CisJT1BKX0FSR19OT1RfVVNFRChwX25iX2J5dGVzKTsKKwlPUEpfQVJHX05PVF9VU0VEKHBfdXNlcl9kYXRhKTsKKwlyZXR1cm4gKE9QSl9TSVpFX1QpIC0xOworfQorCitPUEpfT0ZGX1Qgb3BqX3N0cmVhbV9kZWZhdWx0X3NraXAgKE9QSl9PRkZfVCBwX25iX2J5dGVzLCB2b2lkICogcF91c2VyX2RhdGEpCit7CisJT1BKX0FSR19OT1RfVVNFRChwX25iX2J5dGVzKTsKKwlPUEpfQVJHX05PVF9VU0VEKHBfdXNlcl9kYXRhKTsKKwlyZXR1cm4gKE9QSl9PRkZfVCkgLTE7Cit9CisKK09QSl9CT09MIG9wal9zdHJlYW1fZGVmYXVsdF9zZWVrIChPUEpfT0ZGX1QgcF9uYl9ieXRlcywgdm9pZCAqIHBfdXNlcl9kYXRhKQoreworCU9QSl9BUkdfTk9UX1VTRUQocF9uYl9ieXRlcyk7CisJT1BKX0FSR19OT1RfVVNFRChwX3VzZXJfZGF0YSk7CisJcmV0dXJuIE9QSl9GQUxTRTsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvY2lvLmggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2Npby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNjg0ZWYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2Npby5oCkBAIC0wLDAgKzEsMzk5IEBACisvKgorICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCisgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFVuaXZlcnNpdGUgY2F0aG9saXF1ZSBkZSBMb3V2YWluIChVQ0wpLCBCZWxnaXVtCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQorICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZSIAorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDUyBTeXN0ZW1lcyBkJ0luZm9ybWF0aW9uLCBGcmFuY2UKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgQVMgSVMnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfX0NJT19ICisjZGVmaW5lIF9fQ0lPX0gKKy8qKgorQGZpbGUgY2lvLmgKK0BicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBhIGJ5dGUgaW5wdXQtb3V0cHV0IHByb2Nlc3MgKENJTykKKworVGhlIGZ1bmN0aW9ucyBpbiBDSU8uQyBoYXZlIGZvciBnb2FsIHRvIHJlYWxpemUgYSBieXRlIGlucHV0IC8gb3V0cHV0IHByb2Nlc3MuCisqLworCisvKiogQGRlZmdyb3VwIENJTyBDSU8gLSBieXRlIGlucHV0LW91dHB1dCBzdHJlYW0gKi8KKy8qQHsqLworCisjaW5jbHVkZSAib3BqX2NvbmZpZ19wcml2YXRlLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkKE9QSl9CSUdfRU5ESUFOKQorCSNkZWZpbmUgb3BqX3dyaXRlX2J5dGVzCQlvcGpfd3JpdGVfYnl0ZXNfQkUKKwkjZGVmaW5lIG9wal9yZWFkX2J5dGVzCQlvcGpfcmVhZF9ieXRlc19CRQorCSNkZWZpbmUgb3BqX3dyaXRlX2RvdWJsZQlvcGpfd3JpdGVfZG91YmxlX0JFCisJI2RlZmluZSBvcGpfcmVhZF9kb3VibGUJCW9wal9yZWFkX2RvdWJsZV9CRQorCSNkZWZpbmUgb3BqX3dyaXRlX2Zsb2F0CQlvcGpfd3JpdGVfZmxvYXRfQkUKKwkjZGVmaW5lIG9wal9yZWFkX2Zsb2F0CQlvcGpfcmVhZF9mbG9hdF9CRQorI2Vsc2UKKwkjZGVmaW5lIG9wal93cml0ZV9ieXRlcwkJb3BqX3dyaXRlX2J5dGVzX0xFCisJI2RlZmluZSBvcGpfcmVhZF9ieXRlcwkJb3BqX3JlYWRfYnl0ZXNfTEUKKwkjZGVmaW5lIG9wal93cml0ZV9kb3VibGUJb3BqX3dyaXRlX2RvdWJsZV9MRQorCSNkZWZpbmUgb3BqX3JlYWRfZG91YmxlCQlvcGpfcmVhZF9kb3VibGVfTEUKKwkjZGVmaW5lIG9wal93cml0ZV9mbG9hdAkJb3BqX3dyaXRlX2Zsb2F0X0xFCisJI2RlZmluZSBvcGpfcmVhZF9mbG9hdAkJb3BqX3JlYWRfZmxvYXRfTEUKKyNlbmRpZgorCisKKwordHlwZWRlZiBlbnVtCit7CisJb3BqX3NpZ25lZF9zZW50aW5lbAkJPSAtMSwgLyogZG8gbm90IHVzZSBpbiBjb2RlICovCisJb3BqX3N0cmVhbV9lX291dHB1dAkJPSAweDEsCisJb3BqX3N0cmVhbV9lX2lucHV0CQk9IDB4MiwKKwlvcGpfc3RyZWFtX2VfZW5kCQk9IDB4NCwKKwlvcGpfc3RyZWFtX2VfZXJyb3IJCT0gMHg4Cit9CitvcGpfc3RyZWFtX2ZsYWcgOworCisvKioKK0J5dGUgaW5wdXQtb3V0cHV0IHN0cmVhbS4KKyovCit0eXBlZGVmIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUKK3sKKwkvKioKKwkgKiBVc2VyIGRhdGEsIGJlIGl0IGZpbGVzLCAuLi4gVGhlIGFjdHVhbCBkYXRhIGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgdGhlIHN0cmVhbS4KKwkgKi8KKwl2b2lkICoJCQkJCW1fdXNlcl9kYXRhOworCisJLyoqCisJICogUG9pbnRlciB0byBmdW5jdGlvbiB0byBmcmVlIG1fdXNlcl9kYXRhIChOVUxMIGF0IGluaXRpYWxpemF0aW9uKQorCSAqIHdoZW4gZGVzdHJveWluZyB0aGUgc3RyZWFtLiBJZiBwb2ludGVyIGlzIE5VTEwgdGhlIGZ1bmN0aW9uIGlzIG5vdAorCSAqIGNhbGxlZCBhbmQgdGhlIG1fdXNlcl9kYXRhIGlzIG5vdCBmcmVlZCAoZXZlbiBpZiBub24tTlVMTCkuCisJICovCisJb3BqX3N0cmVhbV9mcmVlX3VzZXJfZGF0YV9mbgkJbV9mcmVlX3VzZXJfZGF0YV9mbjsKKworCS8qKgorCSAqIFVzZXIgZGF0YSBsZW5ndGgKKwkgKi8KKwlPUEpfVUlOVDY0IAkJCQltX3VzZXJfZGF0YV9sZW5ndGg7CisKKwkvKioKKwkgKiBQb2ludGVyIHRvIGFjdHVhbCByZWFkIGZ1bmN0aW9uIChOVUxMIGF0IHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgY2lvLgorCSAqLworCW9wal9zdHJlYW1fcmVhZF9mbgkJbV9yZWFkX2ZuOworCisJLyoqCisJICogUG9pbnRlciB0byBhY3R1YWwgd3JpdGUgZnVuY3Rpb24gKE5VTEwgYXQgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBjaW8uCisJICovCisJb3BqX3N0cmVhbV93cml0ZV9mbgkJbV93cml0ZV9mbjsKKworCS8qKgorCSAqIFBvaW50ZXIgdG8gYWN0dWFsIHNraXAgZnVuY3Rpb24gKE5VTEwgYXQgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBjaW8uCisJICogVGhlcmUgaXMgbm8gc2VlayBmdW5jdGlvbiB0byBwcmV2ZW50IGZyb20gYmFjayBhbmQgZm9ydGggc2xvdyBwcm9jZWR1cmVzLgorCSAqLworCW9wal9zdHJlYW1fc2tpcF9mbgkJbV9za2lwX2ZuOworCisJLyoqCisJICogUG9pbnRlciB0byBhY3R1YWwgc2VlayBmdW5jdGlvbiAoaWYgYXZhaWxhYmxlKS4KKwkgKi8KKwlvcGpfc3RyZWFtX3NlZWtfZm4JCW1fc2Vla19mbjsKKworCS8qKgorCSAqIEFjdHVhbCBkYXRhIHN0b3JlZCBpbnRvIHRoZSBzdHJlYW0gaWYgcmVhZGVkIGZyb20uIERhdGEgaXMgcmVhZCBieSBjaHVuayBvZiBmaXhlZCBzaXplLgorCSAqIHlvdSBzaG91bGQgbmV2ZXIgYWNjZXNzIHRoaXMgZGF0YSBkaXJlY3RseS4KKwkgKi8KKwlPUEpfQllURSAqCQkJCQltX3N0b3JlZF9kYXRhOworCisJLyoqCisJICogUG9pbnRlciB0byB0aGUgY3VycmVudCByZWFkIGRhdGEuCisJICovCisJT1BKX0JZVEUgKgkJCQkJbV9jdXJyZW50X2RhdGE7CisKKyAgICAvKioKKyAgICAqIEZJWE1FIERPQy4KKyAgICAqLworCU9QSl9PRkZfVCAoKiBtX29wal9za2lwKShzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICogLE9QSl9PRkZfVCAsIHN0cnVjdCBvcGpfZXZlbnRfbWdyICopOworCisgICAgLyoqCisgICAgKiBGSVhNRSBET0MuCisgICAgKi8KKwlPUEpfQk9PTCAoKiBtX29wal9zZWVrKSAoc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqICwgT1BKX09GRl9UICwgc3RydWN0IG9wal9ldmVudF9tZ3IgKik7CisKKwkvKioKKwkgKiBudW1iZXIgb2YgYnl0ZXMgY29udGFpbmluZyBpbiB0aGUgYnVmZmVyLgorCSAqLworCU9QSl9TSVpFX1QJCQltX2J5dGVzX2luX2J1ZmZlcjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC93cml0dGVuIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtCisJICovCisJT1BKX09GRl9UCQkJbV9ieXRlX29mZnNldDsKKworCS8qKgorCSAqIFRoZSBzaXplIG9mIHRoZSBidWZmZXIuCisJICovCisJT1BKX1NJWkVfVAkJCW1fYnVmZmVyX3NpemU7CisKKwkvKioKKwkgKiBGbGFncyB0byB0ZWxsIHRoZSBzdGF0dXMgb2YgdGhlIHN0cmVhbS4KKwkgKi8KKwlvcGpfc3RyZWFtX2ZsYWcgbV9zdGF0dXM7CisKK30KK29wal9zdHJlYW1fcHJpdmF0ZV90OworCisvKiogQG5hbWUgRXhwb3J0ZWQgZnVuY3Rpb25zIChzZWUgYWxzbyBvcGVuanBlZy5oKSAqLworLypAeyovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoqCisgKiBXcml0ZSBzb21lIGJ5dGVzIHRvIHRoZSBnaXZlbiBkYXRhIGJ1ZmZlciwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIEJpZyBFbmRpYW4gY3B1cy4KKyAqIEBwYXJhbSBwX2J1ZmZlcgkJcG9pbnRlciB0aGUgZGF0YSBidWZmZXIgdG8gd3JpdGUgZGF0YSB0by4KKyAqIEBwYXJhbSBwX3ZhbHVlCQl0aGUgdmFsdWUgdG8gd3JpdGUKKyAqIEBwYXJhbSBwX25iX2J5dGVzCXRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKyovCit2b2lkIG9wal93cml0ZV9ieXRlc19CRSAoT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX1VJTlQzMiBwX3ZhbHVlLCBPUEpfVUlOVDMyIHBfbmJfYnl0ZXMpOworCisvKioKKyAqIFJlYWRzIHNvbWUgYnl0ZXMgZnJvbSB0aGUgZ2l2ZW4gZGF0YSBidWZmZXIsIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiBCaWcgRW5kaWFuIGNwdXMuCisgKiBAcGFyYW0gcF9idWZmZXIJCXBvaW50ZXIgdGhlIGRhdGEgYnVmZmVyIHRvIHJlYWQgZGF0YSBmcm9tLgorICogQHBhcmFtIHBfdmFsdWUJCXBvaW50ZXIgdG8gdGhlIHZhbHVlIHRoYXQgd2lsbCBzdG9yZSB0aGUgZGF0YS4KKyAqIEBwYXJhbSBwX25iX2J5dGVzCXRoZSBuYiBieXRlcyB0byByZWFkLgorICogQHJldHVybgkJCQl0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgKi8KK3ZvaWQgb3BqX3JlYWRfYnl0ZXNfQkUoY29uc3QgT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX1VJTlQzMiAqIHBfdmFsdWUsIE9QSl9VSU5UMzIgcF9uYl9ieXRlcyk7CisKKy8qKgorICogV3JpdGUgc29tZSBieXRlcyB0byB0aGUgZ2l2ZW4gZGF0YSBidWZmZXIsIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiBMaXR0bGUgRW5kaWFuIGNwdXMuCisgKiBAcGFyYW0gcF9idWZmZXIJCXBvaW50ZXIgdGhlIGRhdGEgYnVmZmVyIHRvIHdyaXRlIGRhdGEgdG8uCisgKiBAcGFyYW0gcF92YWx1ZQkJdGhlIHZhbHVlIHRvIHdyaXRlCisgKiBAcGFyYW0gcF9uYl9ieXRlcwl0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCisgKiBAcmV0dXJuCQkJCXRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnJlZAorKi8KK3ZvaWQgb3BqX3dyaXRlX2J5dGVzX0xFIChPUEpfQllURSAqIHBfYnVmZmVyLCBPUEpfVUlOVDMyIHBfdmFsdWUsIE9QSl9VSU5UMzIgcF9uYl9ieXRlcyk7CisKKy8qKgorICogUmVhZHMgc29tZSBieXRlcyBmcm9tIHRoZSBnaXZlbiBkYXRhIGJ1ZmZlciwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIExpdHRsZSBFbmRpYW4gY3B1cy4KKyAqIEBwYXJhbSBwX2J1ZmZlcgkJcG9pbnRlciB0aGUgZGF0YSBidWZmZXIgdG8gcmVhZCBkYXRhIGZyb20uCisgKiBAcGFyYW0gcF92YWx1ZQkJcG9pbnRlciB0byB0aGUgdmFsdWUgdGhhdCB3aWxsIHN0b3JlIHRoZSBkYXRhLgorICogQHBhcmFtIHBfbmJfYnl0ZXMJdGhlIG5iIGJ5dGVzIHRvIHJlYWQuCisgKiBAcmV0dXJuCQkJCXRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqLwordm9pZCBvcGpfcmVhZF9ieXRlc19MRShjb25zdCBPUEpfQllURSAqIHBfYnVmZmVyLCBPUEpfVUlOVDMyICogcF92YWx1ZSwgT1BKX1VJTlQzMiBwX25iX2J5dGVzKTsKKworCisvKioKKyAqIFdyaXRlIHNvbWUgYnl0ZXMgdG8gdGhlIGdpdmVuIGRhdGEgYnVmZmVyLCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gTGl0dGxlIEVuZGlhbiBjcHVzLgorICogQHBhcmFtIHBfYnVmZmVyCQlwb2ludGVyIHRoZSBkYXRhIGJ1ZmZlciB0byB3cml0ZSBkYXRhIHRvLgorICogQHBhcmFtIHBfdmFsdWUJCXRoZSB2YWx1ZSB0byB3cml0ZQorICovCit2b2lkIG9wal93cml0ZV9kb3VibGVfTEUoT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX0ZMT0FUNjQgcF92YWx1ZSk7CisKKy8qKioKKyAqIFdyaXRlIHNvbWUgYnl0ZXMgdG8gdGhlIGdpdmVuIGRhdGEgYnVmZmVyLCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gQmlnIEVuZGlhbiBjcHVzLgorICogQHBhcmFtIHBfYnVmZmVyCQlwb2ludGVyIHRoZSBkYXRhIGJ1ZmZlciB0byB3cml0ZSBkYXRhIHRvLgorICogQHBhcmFtIHBfdmFsdWUJCXRoZSB2YWx1ZSB0byB3cml0ZQorICovCit2b2lkIG9wal93cml0ZV9kb3VibGVfQkUoT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX0ZMT0FUNjQgcF92YWx1ZSk7CisKKy8qKgorICogUmVhZHMgc29tZSBieXRlcyBmcm9tIHRoZSBnaXZlbiBkYXRhIGJ1ZmZlciwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIExpdHRsZSBFbmRpYW4gY3B1cy4KKyAqIEBwYXJhbSBwX2J1ZmZlcgkJcG9pbnRlciB0aGUgZGF0YSBidWZmZXIgdG8gcmVhZCBkYXRhIGZyb20uCisgKiBAcGFyYW0gcF92YWx1ZQkJcG9pbnRlciB0byB0aGUgdmFsdWUgdGhhdCB3aWxsIHN0b3JlIHRoZSBkYXRhLgorICovCit2b2lkIG9wal9yZWFkX2RvdWJsZV9MRShjb25zdCBPUEpfQllURSAqIHBfYnVmZmVyLCBPUEpfRkxPQVQ2NCAqIHBfdmFsdWUpOworCisvKioKKyAqIFJlYWRzIHNvbWUgYnl0ZXMgZnJvbSB0aGUgZ2l2ZW4gZGF0YSBidWZmZXIsIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiBCaWcgRW5kaWFuIGNwdXMuCisgKiBAcGFyYW0gcF9idWZmZXIJCXBvaW50ZXIgdGhlIGRhdGEgYnVmZmVyIHRvIHJlYWQgZGF0YSBmcm9tLgorICogQHBhcmFtIHBfdmFsdWUJCXBvaW50ZXIgdG8gdGhlIHZhbHVlIHRoYXQgd2lsbCBzdG9yZSB0aGUgZGF0YS4KKyAqLwordm9pZCBvcGpfcmVhZF9kb3VibGVfQkUoY29uc3QgT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX0ZMT0FUNjQgKiBwX3ZhbHVlKTsKKworLyoqCisgKiBSZWFkcyBzb21lIGJ5dGVzIGZyb20gdGhlIGdpdmVuIGRhdGEgYnVmZmVyLCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gTGl0dGxlIEVuZGlhbiBjcHVzLgorICogQHBhcmFtIHBfYnVmZmVyCQlwb2ludGVyIHRoZSBkYXRhIGJ1ZmZlciB0byByZWFkIGRhdGEgZnJvbS4KKyAqIEBwYXJhbSBwX3ZhbHVlCQlwb2ludGVyIHRvIHRoZSB2YWx1ZSB0aGF0IHdpbGwgc3RvcmUgdGhlIGRhdGEuCisgKi8KK3ZvaWQgb3BqX3JlYWRfZmxvYXRfTEUoY29uc3QgT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX0ZMT0FUMzIgKiBwX3ZhbHVlKTsKKworLyoqCisgKiBSZWFkcyBzb21lIGJ5dGVzIGZyb20gdGhlIGdpdmVuIGRhdGEgYnVmZmVyLCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gQmlnIEVuZGlhbiBjcHVzLgorICogQHBhcmFtIHBfYnVmZmVyCQlwb2ludGVyIHRoZSBkYXRhIGJ1ZmZlciB0byByZWFkIGRhdGEgZnJvbS4KKyAqIEBwYXJhbSBwX3ZhbHVlCQlwb2ludGVyIHRvIHRoZSB2YWx1ZSB0aGF0IHdpbGwgc3RvcmUgdGhlIGRhdGEuCisgKi8KK3ZvaWQgb3BqX3JlYWRfZmxvYXRfQkUoY29uc3QgT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX0ZMT0FUMzIgKiBwX3ZhbHVlKTsKKworLyoqCisgKiBXcml0ZSBzb21lIGJ5dGVzIHRvIHRoZSBnaXZlbiBkYXRhIGJ1ZmZlciwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIExpdHRsZSBFbmRpYW4gY3B1cy4KKyAqIEBwYXJhbSBwX2J1ZmZlcgkJcG9pbnRlciB0aGUgZGF0YSBidWZmZXIgdG8gd3JpdGUgZGF0YSB0by4KKyAqIEBwYXJhbSBwX3ZhbHVlCQl0aGUgdmFsdWUgdG8gd3JpdGUKKyAqLwordm9pZCBvcGpfd3JpdGVfZmxvYXRfTEUoT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX0ZMT0FUMzIgcF92YWx1ZSk7CisKKy8qKioKKyAqIFdyaXRlIHNvbWUgYnl0ZXMgdG8gdGhlIGdpdmVuIGRhdGEgYnVmZmVyLCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gQmlnIEVuZGlhbiBjcHVzLgorICogQHBhcmFtIHBfYnVmZmVyCQlwb2ludGVyIHRoZSBkYXRhIGJ1ZmZlciB0byB3cml0ZSBkYXRhIHRvLgorICogQHBhcmFtIHBfdmFsdWUJCXRoZSB2YWx1ZSB0byB3cml0ZQorICovCit2b2lkIG9wal93cml0ZV9mbG9hdF9CRShPUEpfQllURSAqIHBfYnVmZmVyLCBPUEpfRkxPQVQzMiBwX3ZhbHVlKTsKKworLyoqCisgKiBSZWFkcyBzb21lIGJ5dGVzIGZyb20gdGhlIHN0cmVhbS4KKyAqIEBwYXJhbQkJcF9zdHJlYW0JdGhlIHN0cmVhbSB0byByZWFkIGRhdGEgZnJvbS4KKyAqIEBwYXJhbQkJcF9idWZmZXIJcG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgdGhhdCB3aWxsIHJlY2VpdmUgdGhlIGRhdGEuCisgKiBAcGFyYW0JCXBfc2l6ZQkJbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgKiBAcGFyYW0JCXBfZXZlbnRfbWdyCXRoZSB1c2VyIGV2ZW50IG1hbmFnZXIgdG8gYmUgbm90aWZpZWQgb2Ygc3BlY2lhbCBldmVudHMuCisgKiBAcmV0dXJuCQl0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VycmVkIG9yIGlmIHRoZSBzdHJlYW0gaXMgYXQgdGhlIGVuZC4KKyAqLworT1BKX1NJWkVfVCBvcGpfc3RyZWFtX3JlYWRfZGF0YSAob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSxPUEpfQllURSAqIHBfYnVmZmVyLCBPUEpfU0laRV9UIHBfc2l6ZSwgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX2V2ZW50X21ncik7CisKKy8qKgorICogV3JpdGVzIHNvbWUgYnl0ZXMgdG8gdGhlIHN0cmVhbS4KKyAqIEBwYXJhbQkJcF9zdHJlYW0JdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgorICogQHBhcmFtCQlwX2J1ZmZlcglwb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciBob2xkcyB0aGUgZGF0YSB0byBiZSB3cml0dGVudC4KKyAqIEBwYXJhbQkJcF9zaXplCQludW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUuCisgKiBAcGFyYW0JCXBfZXZlbnRfbWdyCXRoZSB1c2VyIGV2ZW50IG1hbmFnZXIgdG8gYmUgbm90aWZpZWQgb2Ygc3BlY2lhbCBldmVudHMuCisgKiBAcmV0dXJuCQl0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW50LCBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqLworT1BKX1NJWkVfVCBvcGpfc3RyZWFtX3dyaXRlX2RhdGEgKG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0sY29uc3QgT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX1NJWkVfVCBwX3NpemUsIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9ldmVudF9tZ3IpOworCisvKioKKyAqIFdyaXRlcyB0aGUgY29udGVudCBvZiB0aGUgc3RyZWFtIGJ1ZmZlciB0byB0aGUgc3RyZWFtLgorICogQHBhcmFtCQlwX3N0cmVhbQl0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCisgKiBAcGFyYW0JCXBfZXZlbnRfbWdyCXRoZSB1c2VyIGV2ZW50IG1hbmFnZXIgdG8gYmUgbm90aWZpZWQgb2Ygc3BlY2lhbCBldmVudHMuCisgKiBAcmV0dXJuCQl0cnVlIGlmIHRoZSBkYXRhIGNvdWxkIGJlIGZsdXNoZWQsIGZhbHNlIGVsc2UuCisgKi8KK09QSl9CT09MIG9wal9zdHJlYW1fZmx1c2ggKG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0sIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9ldmVudF9tZ3IpOworCisvKioKKyAqIFNraXBzIGEgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHN0cmVhbS4KKyAqIEBwYXJhbQkJcF9zdHJlYW0JdGhlIHN0cmVhbSB0byBza2lwIGRhdGEgZnJvbS4KKyAqIEBwYXJhbQkJcF9zaXplCQl0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuCisgKiBAcGFyYW0JCXBfZXZlbnRfbWdyCXRoZSB1c2VyIGV2ZW50IG1hbmFnZXIgdG8gYmUgbm90aWZpZWQgb2Ygc3BlY2lhbCBldmVudHMuCisgKiBAcmV0dXJuCQl0aGUgbnVtYmVyIG9mIGJ5dGVzIHNraXBwZWQsIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICovCitPUEpfT0ZGX1Qgb3BqX3N0cmVhbV9za2lwIChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLE9QSl9PRkZfVCBwX3NpemUsIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9ldmVudF9tZ3IpOworCisvKioKKyAqIFRlbGxzIHRoZSBieXRlIG9mZnNldCBvbiB0aGUgc3RyZWFtIChzaW1pbGFyIHRvIGZ0ZWxsKS4KKyAqCisgKiBAcGFyYW0JCXBfc3RyZWFtCXRoZSBzdHJlYW0gdG8gZ2V0IHRoZSBpbmZvcm1hdGlvbiBmcm9tLgorICoKKyAqIEByZXR1cm4JCXRoZSBjdXJyZW50IHBvc2l0aW9uIG8gZnRoZSBzdHJlYW0uCisgKi8KK09QSl9PRkZfVCBvcGpfc3RyZWFtX3RlbGwgKGNvbnN0IG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0pOworCisKKy8qKgorICogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgbGVmdCBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIChzaW1pbGFyIHRvIGNpb19udW1ieXRlc2xlZnQpLgorICoKKyAqIEBwYXJhbQkJcF9zdHJlYW0JdGhlIHN0cmVhbSB0byBnZXQgdGhlIGluZm9ybWF0aW9uIGZyb20uCisgKgorICogQHJldHVybgkJTnVtYmVyIG9mIGJ5dGVzIGxlZnQgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4KKyAqLworT1BKX09GRl9UIG9wal9zdHJlYW1fZ2V0X251bWJlcl9ieXRlX2xlZnQgKGNvbnN0IG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0pOworCisvKioKKyAqIFNraXBzIGEgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHN0cmVhbS4KKyAqIEBwYXJhbQkJcF9zdHJlYW0JdGhlIHN0cmVhbSB0byBza2lwIGRhdGEgZnJvbS4KKyAqIEBwYXJhbQkJcF9zaXplCQl0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuCisgKiBAcGFyYW0JCXBfZXZlbnRfbWdyCXRoZSB1c2VyIGV2ZW50IG1hbmFnZXIgdG8gYmUgbm90aWZpZWQgb2Ygc3BlY2lhbCBldmVudHMuCisgKiBAcmV0dXJuCQl0aGUgbnVtYmVyIG9mIGJ5dGVzIHNraXBwZWQsIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICovCitPUEpfT0ZGX1Qgb3BqX3N0cmVhbV93cml0ZV9za2lwIChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLCBPUEpfT0ZGX1QgcF9zaXplLCBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfZXZlbnRfbWdyKTsKKworLyoqCisgKiBTa2lwcyBhIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBzdHJlYW0uCisgKiBAcGFyYW0JCXBfc3RyZWFtCXRoZSBzdHJlYW0gdG8gc2tpcCBkYXRhIGZyb20uCisgKiBAcGFyYW0JCXBfc2l6ZQkJdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwLgorICogQHBhcmFtCQlwX2V2ZW50X21ncgl0aGUgdXNlciBldmVudCBtYW5hZ2VyIHRvIGJlIG5vdGlmaWVkIG9mIHNwZWNpYWwgZXZlbnRzLgorICogQHJldHVybgkJdGhlIG51bWJlciBvZiBieXRlcyBza2lwcGVkLCBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqLworT1BKX09GRl9UIG9wal9zdHJlYW1fcmVhZF9za2lwIChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLCBPUEpfT0ZGX1QgcF9zaXplLCBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfZXZlbnRfbWdyKTsKKworLyoqCisgKiBTa2lwcyBhIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBzdHJlYW0uCisgKiBAcGFyYW0JCXBfc3RyZWFtCXRoZSBzdHJlYW0gdG8gc2tpcCBkYXRhIGZyb20uCisgKiBAcGFyYW0JCXBfc2l6ZQkJdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwLgorICogQHBhcmFtCQlwX2V2ZW50X21ncgl0aGUgdXNlciBldmVudCBtYW5hZ2VyIHRvIGJlIG5vdGlmaWVkIG9mIHNwZWNpYWwgZXZlbnRzLgorICogQHJldHVybgkJT1BKX1RSVUUgaWYgc3VjY2Vzcywgb3IgT1BKX0ZBTFNFIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICovCitPUEpfQk9PTCBvcGpfc3RyZWFtX3JlYWRfc2VlayAob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSwgT1BKX09GRl9UIHBfc2l6ZSwgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX2V2ZW50X21ncik7CisKKy8qKgorICogU2tpcHMgYSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLgorICogQHBhcmFtCQlwX3N0cmVhbQl0aGUgc3RyZWFtIHRvIHNraXAgZGF0YSBmcm9tLgorICogQHBhcmFtCQlwX3NpemUJCXRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcC4KKyAqIEBwYXJhbQkJcF9ldmVudF9tZ3IJdGhlIHVzZXIgZXZlbnQgbWFuYWdlciB0byBiZSBub3RpZmllZCBvZiBzcGVjaWFsIGV2ZW50cy4KKyAqIEByZXR1cm4JCXRoZSBudW1iZXIgb2YgYnl0ZXMgc2tpcHBlZCwgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgKi8KK09QSl9CT09MIG9wal9zdHJlYW1fd3JpdGVfc2VlayAob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSwgT1BKX09GRl9UIHBfc2l6ZSwgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX2V2ZW50X21ncik7CisKKy8qKgorICogU2Vla3MgYSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLgorICogQHBhcmFtCQlwX3N0cmVhbQl0aGUgc3RyZWFtIHRvIHNraXAgZGF0YSBmcm9tLgorICogQHBhcmFtCQlwX3NpemUJCXRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcC4KKyAqIEBwYXJhbQkJcF9ldmVudF9tZ3IJdGhlIHVzZXIgZXZlbnQgbWFuYWdlciB0byBiZSBub3RpZmllZCBvZiBzcGVjaWFsIGV2ZW50cy4KKyAqIEByZXR1cm4JCXRydWUgaWYgdGhlIHN0cmVhbSBpcyBzZWVrYWJsZS4KKyAqLworT1BKX0JPT0wgb3BqX3N0cmVhbV9zZWVrIChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLCBPUEpfT0ZGX1QgcF9zaXplLCBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfZXZlbnRfbWdyKTsKKworLyoqCisgKiBUZWxscyBpZiB0aGUgZ2l2ZW4gc3RyZWFtIGlzIHNlZWthYmxlLgorICovCitPUEpfQk9PTCBvcGpfc3RyZWFtX2hhc19zZWVrIChjb25zdCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtKTsKKworLyoqCisgKiBGSVhNRSBET0MuCisgKi8KK09QSl9TSVpFX1Qgb3BqX3N0cmVhbV9kZWZhdWx0X3JlYWQgKHZvaWQgKiBwX2J1ZmZlciwgT1BKX1NJWkVfVCBwX25iX2J5dGVzLCB2b2lkICogcF91c2VyX2RhdGEpOworCisvKioKKyAqIEZJWE1FIERPQy4KKyAqLworT1BKX1NJWkVfVCBvcGpfc3RyZWFtX2RlZmF1bHRfd3JpdGUgKHZvaWQgKiBwX2J1ZmZlciwgT1BKX1NJWkVfVCBwX25iX2J5dGVzLCB2b2lkICogcF91c2VyX2RhdGEpOworCisvKioKKyAqIEZJWE1FIERPQy4KKyAqLworT1BKX09GRl9UIG9wal9zdHJlYW1fZGVmYXVsdF9za2lwIChPUEpfT0ZGX1QgcF9uYl9ieXRlcywgdm9pZCAqIHBfdXNlcl9kYXRhKTsKKworLyoqCisgKiBGSVhNRSBET0MuCisgKi8KK09QSl9CT09MIG9wal9zdHJlYW1fZGVmYXVsdF9zZWVrIChPUEpfT0ZGX1QgcF9uYl9ieXRlcywgdm9pZCAqIHBfdXNlcl9kYXRhKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qQH0qLworCisvKkB9Ki8KKworCisjZW5kaWYgLyogX19DSU9fSCAqLworCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2R3dC5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9kd3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjkyYmRmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9kd3QuYwpAQCAtMCwwICsxLDkzOCBAQAorLyoKKyAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzIAorICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIAorICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cworICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBVbml2ZXJzaXRlIGNhdGhvbGlxdWUgZGUgTG91dmFpbiAoVUNMKSwgQmVsZ2l1bQorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFByb2Zlc3NvciBCZW5vaXQgTWFjcQorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMsIERhdmlkIEphbnNzZW5zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgWWFubmljayBWZXJzY2h1ZXJlbgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4IAorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTQsIEFudG9uaW4gRGVzY2FtcGUKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQorICogQ29weXJpZ2h0IChjKSAyMDA3LCBKb25hdGhhbiBCYWxsYXJkIDxkem9uYXRhc0Bkem9udXgubmV0PgorICogQ29weXJpZ2h0IChjKSAyMDA3LCBDYWxsdW0gTGVyd2ljayA8c2VnQGhheHhlZC5jb20+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZmRlZiBfX1NTRV9fCisjaW5jbHVkZSA8eG1taW50cmluLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIm9wal9pbmNsdWRlcy5oIgorCisvKiogQGRlZmdyb3VwIERXVCBEV1QgLSBJbXBsZW1lbnRhdGlvbiBvZiBhIGRpc2NyZXRlIHdhdmVsZXQgdHJhbnNmb3JtICovCisvKkB7Ki8KKworLyoqIEBuYW1lIExvY2FsIGRhdGEgc3RydWN0dXJlcyAqLworLypAeyovCisKK3R5cGVkZWYgc3RydWN0IGR3dF9sb2NhbCB7CisJT1BKX0lOVDMyKiBtZW07CisJT1BKX1NJWkVfVCBtZW1fY291bnQ7CisJT1BKX0lOVDMyIGRuOworCU9QSl9JTlQzMiBzbjsKKwlPUEpfSU5UMzIgY2FzOworfSBvcGpfZHd0X3Q7CisKK3R5cGVkZWYgdW5pb24geworCU9QSl9GTE9BVDMyCWZbNF07Cit9IG9wal92NF90OworCit0eXBlZGVmIHN0cnVjdCB2NGR3dF9sb2NhbCB7CisJb3BqX3Y0X3QqCXdhdmVsZXQgOworCU9QSl9JTlQzMgkJZG4gOworCU9QSl9JTlQzMgkJc24gOworCU9QSl9JTlQzMgkJY2FzIDsKK30gb3BqX3Y0ZHd0X3QgOworCitzdGF0aWMgY29uc3QgT1BKX0ZMT0FUMzIgb3BqX2R3dF9hbHBoYSA9ICAxLjU4NjEzNDM0MmY7IC8qICAxMjk5NCAqLworc3RhdGljIGNvbnN0IE9QSl9GTE9BVDMyIG9wal9kd3RfYmV0YSAgPSAgMC4wNTI5ODAxMThmOyAvKiAgICA0MzQgKi8KK3N0YXRpYyBjb25zdCBPUEpfRkxPQVQzMiBvcGpfZHd0X2dhbW1hID0gLTAuODgyOTExMDc1ZjsgLyogIC03MjMzICovCitzdGF0aWMgY29uc3QgT1BKX0ZMT0FUMzIgb3BqX2R3dF9kZWx0YSA9IC0wLjQ0MzUwNjg1MmY7IC8qICAtMzYzMyAqLworCitzdGF0aWMgY29uc3QgT1BKX0ZMT0FUMzIgb3BqX0sgICAgICA9IDEuMjMwMTc0MTA1ZjsgLyogIDEwMDc4ICovCitzdGF0aWMgY29uc3QgT1BKX0ZMT0FUMzIgb3BqX2MxMzMxOCA9IDEuNjI1NzMyNDIyZjsKKworLypAfSovCisKKy8qKgorVmlydHVhbCBmdW5jdGlvbiB0eXBlIGZvciB3YXZlbGV0IHRyYW5zZm9ybSBpbiAxLUQgCisqLwordHlwZWRlZiB2b2lkICgqRFdUMURGTikob3BqX2R3dF90KiB2KTsKKworLyoqIEBuYW1lIExvY2FsIHN0YXRpYyBmdW5jdGlvbnMgKi8KKy8qQHsqLworCisvKioKK0ZvcndhcmQgbGF6eSB0cmFuc2Zvcm0gKGhvcml6b250YWwpCisqLworc3RhdGljIHZvaWQgb3BqX2R3dF9kZWludGVybGVhdmVfaChPUEpfSU5UMzIgKmEsIE9QSl9JTlQzMiAqYiwgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpOworLyoqCitGb3J3YXJkIGxhenkgdHJhbnNmb3JtICh2ZXJ0aWNhbCkKKyovCitzdGF0aWMgdm9pZCBvcGpfZHd0X2RlaW50ZXJsZWF2ZV92KE9QSl9JTlQzMiAqYSwgT1BKX0lOVDMyICpiLCBPUEpfSU5UMzIgZG4sIE9QSl9JTlQzMiBzbiwgT1BKX0lOVDMyIHgsIE9QSl9JTlQzMiBjYXMpOworLyoqCitJbnZlcnNlIGxhenkgdHJhbnNmb3JtIChob3Jpem9udGFsKQorKi8KK3N0YXRpYyB2b2lkIG9wal9kd3RfaW50ZXJsZWF2ZV9oKG9wal9kd3RfdCogaCwgT1BKX0lOVDMyICphKTsKKy8qKgorSW52ZXJzZSBsYXp5IHRyYW5zZm9ybSAodmVydGljYWwpCisqLworc3RhdGljIHZvaWQgb3BqX2R3dF9pbnRlcmxlYXZlX3Yob3BqX2R3dF90KiB2LCBPUEpfSU5UMzIgKmEsIE9QSl9JTlQzMiB4KTsKKy8qKgorRm9yd2FyZCA1LTMgd2F2ZWxldCB0cmFuc2Zvcm0gaW4gMS1ECisqLworc3RhdGljIHZvaWQgb3BqX2R3dF9lbmNvZGVfMShPUEpfSU5UMzIgKmEsIE9QSl9TSVpFX1QgYV9jb3VudCwgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpOworLyoqCitJbnZlcnNlIDUtMyB3YXZlbGV0IHRyYW5zZm9ybSBpbiAxLUQKKyovCitzdGF0aWMgdm9pZCBvcGpfZHd0X2RlY29kZV8xKG9wal9kd3RfdCAqdik7CitzdGF0aWMgdm9pZCBvcGpfZHd0X2RlY29kZV8xXyhPUEpfSU5UMzIgKmEsIE9QSl9TSVpFX1QgYV9jb3VudCwgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpOworLyoqCitGb3J3YXJkIDktNyB3YXZlbGV0IHRyYW5zZm9ybSBpbiAxLUQKKyovCitzdGF0aWMgdm9pZCBvcGpfZHd0X2VuY29kZV8xX3JlYWwoT1BKX0lOVDMyICphLCBPUEpfU0laRV9UIGFfY291bnQsIE9QSl9JTlQzMiBkbiwgT1BKX0lOVDMyIHNuLCBPUEpfSU5UMzIgY2FzKTsKKy8qKgorRXhwbGljaXQgY2FsY3VsYXRpb24gb2YgdGhlIFF1YW50aXphdGlvbiBTdGVwc2l6ZXMgCisqLworc3RhdGljIHZvaWQgb3BqX2R3dF9lbmNvZGVfc3RlcHNpemUoT1BKX0lOVDMyIHN0ZXBzaXplLCBPUEpfSU5UMzIgbnVtYnBzLCBvcGpfc3RlcHNpemVfdCAqYmFuZG5vX3N0ZXBzaXplKTsKKy8qKgorSW52ZXJzZSB3YXZlbGV0IHRyYW5zZm9ybSBpbiAyLUQuCisqLworc3RhdGljIE9QSl9CT09MIG9wal9kd3RfZGVjb2RlX3RpbGUoY29uc3Qgb3BqX3RjZF90aWxlY29tcF90KiB0aWxlYywgT1BKX1VJTlQzMiBpLCBEV1QxREZOIGZuKTsKKworc3RhdGljIE9QSl9CT09MIG9wal9kd3RfZW5jb2RlX3Byb2NlZHVyZShjb25zdCBvcGpfdGNkX3RpbGVjb21wX3QgKiB0aWxlYywKKwkJCQkJCQkJCQkgICAgdm9pZCgqcF9mdW5jdGlvbikoT1BKX0lOVDMyICosIE9QSl9TSVpFX1QsIE9QSl9JTlQzMiwgT1BKX0lOVDMyLCBPUEpfSU5UMzIpKTsKKworc3RhdGljIE9QSl9VSU5UMzIgb3BqX2R3dF9tYXhfcmVzb2x1dGlvbihvcGpfdGNkX3Jlc29sdXRpb25fdCogcmVzdHJpY3QgciwgT1BKX1VJTlQzMiBpKTsKKworLyogPHN1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSW52ZXJzZSA5LTcgd2F2ZWxldCB0cmFuc2Zvcm0gaW4gMS1ELiAqLworLyogPC9zdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RhdGljIHZvaWQgb3BqX3Y0ZHd0X2RlY29kZShvcGpfdjRkd3RfdCogcmVzdHJpY3QgZHd0KTsKKworc3RhdGljIHZvaWQgb3BqX3Y0ZHd0X2ludGVybGVhdmVfaChvcGpfdjRkd3RfdCogcmVzdHJpY3QgdywgT1BKX0ZMT0FUMzIqIHJlc3RyaWN0IGEsIE9QSl9JTlQzMiB4LCBPUEpfSU5UMzIgc2l6ZSk7CisKK3N0YXRpYyB2b2lkIG9wal92NGR3dF9pbnRlcmxlYXZlX3Yob3BqX3Y0ZHd0X3QqIHJlc3RyaWN0IHYgLCBPUEpfRkxPQVQzMiogcmVzdHJpY3QgYSAsIE9QSl9JTlQzMiB4LCBPUEpfSU5UMzIgbmJfZWx0c19yZWFkKTsKKworI2lmZGVmIF9fU1NFX18KK3N0YXRpYyB2b2lkIG9wal92NGR3dF9kZWNvZGVfc3RlcDFfc3NlKG9wal92NF90KiB3LCBPUEpfSU5UMzIgY291bnQsIGNvbnN0IF9fbTEyOCBjKTsKKworc3RhdGljIHZvaWQgb3BqX3Y0ZHd0X2RlY29kZV9zdGVwMl9zc2Uob3BqX3Y0X3QqIGwsIG9wal92NF90KiB3LCBPUEpfSU5UMzIgaywgT1BKX0lOVDMyIG0sIF9fbTEyOCBjKTsKKworI2Vsc2UKK3N0YXRpYyB2b2lkIG9wal92NGR3dF9kZWNvZGVfc3RlcDEob3BqX3Y0X3QqIHcsIE9QSl9JTlQzMiBjb3VudCwgY29uc3QgT1BKX0ZMT0FUMzIgYyk7CisKK3N0YXRpYyB2b2lkIG9wal92NGR3dF9kZWNvZGVfc3RlcDIob3BqX3Y0X3QqIGwsIG9wal92NF90KiB3LCBPUEpfSU5UMzIgaywgT1BKX0lOVDMyIG0sIE9QSl9GTE9BVDMyIGMpOworCisjZW5kaWYKKworLypAfSovCisKKy8qQH0qLworCisjZGVmaW5lIElEWF9TKGkpIChpKSoyCisjZGVmaW5lIElEWF9EKGkpIDEgKyAoaSkqIDIKKyNkZWZpbmUgVU5ERVJGTE9XX1NOKGkpICgoaSkgPj0gc24mJnNuPjApCisjZGVmaW5lIFVOREVSRkxPV19ETihpKSAoKGkpID49IGRuJiZkbj4wKQorI2RlZmluZSBPVkVSRkxPV19TKGkpIChJRFhfUyhpKSA+PSBhX2NvdW50KQorI2RlZmluZSBPVkVSRkxPV19EKGkpIChJRFhfRChpKSA+PSBhX2NvdW50KQorCisjZGVmaW5lIE9QSl9TKGkpIGFbSURYX1MoaSldCisjZGVmaW5lIE9QSl9EKGkpIGFbSURYX0QoaSldCisjZGVmaW5lIE9QSl9TXyhpKSAoKGkpPDAgPyBPUEpfUygwKSA6IChVTkRFUkZMT1dfU04oaSkgPyBPUEpfUyhzbiAtIDEpIDogT1ZFUkZMT1dfUyhpKSA/IE9QSl9TKGkgLSAxKSA6IE9QSl9TKGkpKSkKKyNkZWZpbmUgT1BKX0RfKGkpICgoaSk8MCA/IE9QSl9EKDApIDogKFVOREVSRkxPV19ETihpKSA/IE9QSl9EKGRuIC0gMSkgOiBPVkVSRkxPV19EKGkpID8gT1BKX0QoaSAtIDEpIDogT1BKX0QoaSkpKQorLyogbmV3ICovCisjZGVmaW5lIE9QSl9TU18oaSkgKChpKTwwID8gT1BKX1MoMCkgOiAoVU5ERVJGTE9XX0ROKGkpID8gT1BKX1MoZG4gLSAxKSA6IE9WRVJGTE9XX1MoaSkgPyBPUEpfUyhpIC0gMSkgOiBPUEpfUyhpKSkpCisjZGVmaW5lIE9QSl9ERF8oaSkgKChpKTwwID8gT1BKX0QoMCkgOiAoVU5ERVJGTE9XX1NOKGkpID8gT1BKX0Qoc24gLSAxKSA6IE9WRVJGTE9XX0QoaSkgPyBPUEpfRChpIC0gMSkgOiBPUEpfRChpKSkpCisKKy8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIG5vcm1zIG9mIHRoZSA1LTMgd2F2ZWxldHMgZm9yIGRpZmZlcmVudCBiYW5kcy4gKi8KKy8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0YXRpYyBjb25zdCBPUEpfRkxPQVQ2NCBvcGpfZHd0X25vcm1zWzRdWzEwXSA9IHsKKwl7MS4wMDAsIDEuNTAwLCAyLjc1MCwgNS4zNzUsIDEwLjY4LCAyMS4zNCwgNDIuNjcsIDg1LjMzLCAxNzAuNywgMzQxLjN9LAorCXsxLjAzOCwgMS41OTIsIDIuOTE5LCA1LjcwMywgMTEuMzMsIDIyLjY0LCA0NS4yNSwgOTAuNDgsIDE4MC45fSwKKwl7MS4wMzgsIDEuNTkyLCAyLjkxOSwgNS43MDMsIDExLjMzLCAyMi42NCwgNDUuMjUsIDkwLjQ4LCAxODAuOX0sCisJey43MTg2LCAuOTIxOCwgMS41ODYsIDMuMDQzLCA2LjAxOSwgMTIuMDEsIDI0LjAwLCA0Ny45NywgOTUuOTN9Cit9OworCisvKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBub3JtcyBvZiB0aGUgOS03IHdhdmVsZXRzIGZvciBkaWZmZXJlbnQgYmFuZHMuICovCisvKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdGF0aWMgY29uc3QgT1BKX0ZMT0FUNjQgb3BqX2R3dF9ub3Jtc19yZWFsWzRdWzEwXSA9IHsKKwl7MS4wMDAsIDEuOTY1LCA0LjE3NywgOC40MDMsIDE2LjkwLCAzMy44NCwgNjcuNjksIDEzNS4zLCAyNzAuNiwgNTQwLjl9LAorCXsyLjAyMiwgMy45ODksIDguMzU1LCAxNy4wNCwgMzQuMjcsIDY4LjYzLCAxMzcuMywgMjc0LjYsIDU0OS4wfSwKKwl7Mi4wMjIsIDMuOTg5LCA4LjM1NSwgMTcuMDQsIDM0LjI3LCA2OC42MywgMTM3LjMsIDI3NC42LCA1NDkuMH0sCisJezIuMDgwLCAzLjg2NSwgOC4zMDcsIDE3LjE4LCAzNC43MSwgNjkuNTksIDEzOS4zLCAyNzguNiwgNTU3LjJ9Cit9OworCisvKiAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIGxvY2FsIGZ1bmN0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworLyogPHN1bW1hcnk+CQkJICAgICAgICAgICAgICAgICAqLworLyogRm9yd2FyZCBsYXp5IHRyYW5zZm9ybSAoaG9yaXpvbnRhbCkuICAqLworLyogPC9zdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAKK3N0YXRpYyB2b2lkIG9wal9kd3RfZGVpbnRlcmxlYXZlX2goT1BKX0lOVDMyICphLCBPUEpfSU5UMzIgKmIsIE9QSl9JTlQzMiBkbiwgT1BKX0lOVDMyIHNuLCBPUEpfSU5UMzIgY2FzKSB7CisJT1BKX0lOVDMyIGk7CisJT1BKX0lOVDMyICogbF9kZXN0ID0gYjsKKwlPUEpfSU5UMzIgKiBsX3NyYyA9IGErY2FzOworCisgICAgZm9yIChpPTA7IGk8c247ICsraSkgeworCQkqbF9kZXN0KysgPSAqbF9zcmM7CisJCWxfc3JjICs9IDI7CisJfQorCQorICAgIGxfZGVzdCA9IGIgKyBzbjsKKwlsX3NyYyA9IGEgKyAxIC0gY2FzOworCisgICAgZm9yCShpPTA7IGk8ZG47ICsraSkgIHsKKwkJKmxfZGVzdCsrPSpsX3NyYzsKKwkJbF9zcmMgKz0gMjsKKwl9Cit9CisKKy8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIAorLyogRm9yd2FyZCBsYXp5IHRyYW5zZm9ybSAodmVydGljYWwpLiAgICAqLworLyogPC9zdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAKK3N0YXRpYyB2b2lkIG9wal9kd3RfZGVpbnRlcmxlYXZlX3YoT1BKX0lOVDMyICphLCBPUEpfSU5UMzIgKmIsIE9QSl9JTlQzMiBkbiwgT1BKX0lOVDMyIHNuLCBPUEpfSU5UMzIgeCwgT1BKX0lOVDMyIGNhcykgeworICAgIE9QSl9JTlQzMiBpID0gc247CisJT1BKX0lOVDMyICogbF9kZXN0ID0gYjsKKwlPUEpfSU5UMzIgKiBsX3NyYyA9IGErY2FzOworCisgICAgd2hpbGUgKGktLSkgeworCQkqbF9kZXN0ID0gKmxfc3JjOworCQlsX2Rlc3QgKz0geDsKKwkJbF9zcmMgKz0gMjsKKwkJfSAvKiBiW2kqeF09YVsyKmkrY2FzXTsgKi8KKworCWxfZGVzdCA9IGIgKyBzbiAqIHg7CisJbF9zcmMgPSBhICsgMSAtIGNhczsKKwkKKwlpID0gZG47CisgICAgd2hpbGUgKGktLSkgeworCQkqbF9kZXN0ID0gKmxfc3JjOworCQlsX2Rlc3QgKz0geDsKKwkJbF9zcmMgKz0gMjsKKyAgICAgICAgfSAvKmJbKHNuK2kpKnhdPWFbKDIqaSsxLWNhcyldOyovCit9CisKKy8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEludmVyc2UgbGF6eSB0cmFuc2Zvcm0gKGhvcml6b250YWwpLiAgKi8KKy8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0YXRpYyB2b2lkIG9wal9kd3RfaW50ZXJsZWF2ZV9oKG9wal9kd3RfdCogaCwgT1BKX0lOVDMyICphKSB7CisgICAgT1BKX0lOVDMyICphaSA9IGE7CisgICAgT1BKX0lOVDMyICpiaSA9IGgtPm1lbSArIGgtPmNhczsKKyAgICBPUEpfSU5UMzIgIGkJPSBoLT5zbjsKKyAgICB3aGlsZSggaS0tICkgeworICAgICAgKmJpID0gKihhaSsrKTsKKwkgIGJpICs9IDI7CisgICAgfQorICAgIGFpCT0gYSArIGgtPnNuOworICAgIGJpCT0gaC0+bWVtICsgMSAtIGgtPmNhczsKKyAgICBpCT0gaC0+ZG4gOworICAgIHdoaWxlKCBpLS0gKSB7CisgICAgICAqYmkgPSAqKGFpKyspOworCSAgYmkgKz0gMjsKKyAgICB9Cit9CisKKy8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIAorLyogSW52ZXJzZSBsYXp5IHRyYW5zZm9ybSAodmVydGljYWwpLiAgICAqLworLyogPC9zdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAKK3N0YXRpYyB2b2lkIG9wal9kd3RfaW50ZXJsZWF2ZV92KG9wal9kd3RfdCogdiwgT1BKX0lOVDMyICphLCBPUEpfSU5UMzIgeCkgeworICAgIE9QSl9JTlQzMiAqYWkgPSBhOworICAgIE9QSl9JTlQzMiAqYmkgPSB2LT5tZW0gKyB2LT5jYXM7CisgICAgT1BKX0lOVDMyICBpID0gdi0+c247CisgICAgd2hpbGUoIGktLSApIHsKKyAgICAgICpiaSA9ICphaTsKKwkgIGJpICs9IDI7CisJICBhaSArPSB4OworICAgIH0KKyAgICBhaSA9IGEgKyAodi0+c24gKiB4KTsKKyAgICBiaSA9IHYtPm1lbSArIDEgLSB2LT5jYXM7CisgICAgaSA9IHYtPmRuIDsKKyAgICB3aGlsZSggaS0tICkgeworICAgICAgKmJpID0gKmFpOworCSAgYmkgKz0gMjsgIAorCSAgYWkgKz0geDsKKyAgICB9Cit9CisKKworLyogPHN1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGb3J3YXJkIDUtMyB3YXZlbGV0IHRyYW5zZm9ybSBpbiAxLUQuICovCisvKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0YXRpYyB2b2lkIG9wal9kd3RfZW5jb2RlXzEoT1BKX0lOVDMyICphLCBPUEpfU0laRV9UIGFfY291bnQsIE9QSl9JTlQzMiBkbiwgT1BKX0lOVDMyIHNuLCBPUEpfSU5UMzIgY2FzKSB7CisJT1BKX0lOVDMyIGk7CisJCisJaWYgKCFjYXMpIHsKKwkJaWYgKChkbiA+IDApIHx8IChzbiA+IDEpKSB7CS8qIE5FVyA6ICBDQVNFIE9ORSBFTEVNRU5UICovCisJCQlmb3IgKGkgPSAwOyBpIDwgZG47IGkrKykgT1BKX0QoaSkgLT0gKE9QSl9TXyhpKSArIE9QSl9TXyhpICsgMSkpID4+IDE7CisJCQlmb3IgKGkgPSAwOyBpIDwgc247IGkrKykgT1BKX1MoaSkgKz0gKE9QSl9EXyhpIC0gMSkgKyBPUEpfRF8oaSkgKyAyKSA+PiAyOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCFzbiAmJiBkbiA9PSAxKQkJICAgIC8qIE5FVyA6ICBDQVNFIE9ORSBFTEVNRU5UICovCisJCQlPUEpfUygwKSAqPSAyOworCQllbHNlIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBkbjsgaSsrKSBPUEpfUyhpKSAtPSAoT1BKX0REXyhpKSArIE9QSl9ERF8oaSAtIDEpKSA+PiAxOworCQkJZm9yIChpID0gMDsgaSA8IHNuOyBpKyspIE9QSl9EKGkpICs9IChPUEpfU1NfKGkpICsgT1BKX1NTXyhpICsgMSkgKyAyKSA+PiAyOworCQl9CisJfQorfQorCisvKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEludmVyc2UgNS0zIHdhdmVsZXQgdHJhbnNmb3JtIGluIDEtRC4gKi8KKy8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAKK3N0YXRpYyB2b2lkIG9wal9kd3RfZGVjb2RlXzFfKE9QSl9JTlQzMiAqYSwgT1BKX1NJWkVfVCBhX2NvdW50LCBPUEpfSU5UMzIgZG4sIE9QSl9JTlQzMiBzbiwgT1BKX0lOVDMyIGNhcykgeworCU9QSl9JTlQzMiBpOworCQorCWlmICghY2FzKSB7CisJCWlmICgoZG4gPiAwKSB8fCAoc24gPiAxKSkgeyAvKiBORVcgOiAgQ0FTRSBPTkUgRUxFTUVOVCAqLworCQkJZm9yIChpID0gMDsgaSA8IHNuOyBpKyspIE9QSl9TKGkpIC09IChPUEpfRF8oaSAtIDEpICsgT1BKX0RfKGkpICsgMikgPj4gMjsKKwkJCWZvciAoaSA9IDA7IGkgPCBkbjsgaSsrKSBPUEpfRChpKSArPSAoT1BKX1NfKGkpICsgT1BKX1NfKGkgKyAxKSkgPj4gMTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghc24gICYmIGRuID09IDEpICAgICAgICAgIC8qIE5FVyA6ICBDQVNFIE9ORSBFTEVNRU5UICovCisJCQlPUEpfUygwKSAvPSAyOworCQllbHNlIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBzbjsgaSsrKSBPUEpfRChpKSAtPSAoT1BKX1NTXyhpKSArIE9QSl9TU18oaSArIDEpICsgMikgPj4gMjsKKwkJCWZvciAoaSA9IDA7IGkgPCBkbjsgaSsrKSBPUEpfUyhpKSArPSAoT1BKX0REXyhpKSArIE9QSl9ERF8oaSAtIDEpKSA+PiAxOworCQl9CisJfQorfQorCisvKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEludmVyc2UgNS0zIHdhdmVsZXQgdHJhbnNmb3JtIGluIDEtRC4gKi8KKy8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAKK3N0YXRpYyB2b2lkIG9wal9kd3RfZGVjb2RlXzEob3BqX2R3dF90ICp2KSB7CisJb3BqX2R3dF9kZWNvZGVfMV8odi0+bWVtLCB2LT5tZW1fY291bnQsIHYtPmRuLCB2LT5zbiwgdi0+Y2FzKTsKK30KKworLyogPHN1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRm9yd2FyZCA5LTcgd2F2ZWxldCB0cmFuc2Zvcm0gaW4gMS1ELiAqLworLyogPC9zdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RhdGljIHZvaWQgb3BqX2R3dF9lbmNvZGVfMV9yZWFsKE9QSl9JTlQzMiAqYSwgT1BKX1NJWkVfVCBhX2NvdW50LCBPUEpfSU5UMzIgZG4sIE9QSl9JTlQzMiBzbiwgT1BKX0lOVDMyIGNhcykgeworCU9QSl9JTlQzMiBpOworCWlmICghY2FzKSB7CisJCWlmICgoZG4gPiAwKSB8fCAoc24gPiAxKSkgewkvKiBORVcgOiAgQ0FTRSBPTkUgRUxFTUVOVCAqLworCQkJZm9yIChpID0gMDsgaSA8IGRuOyBpKyspCisJCQkJT1BKX0QoaSkgLT0gb3BqX2ludF9maXhfbXVsKE9QSl9TXyhpKSArIE9QSl9TXyhpICsgMSksIDEyOTkzKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBzbjsgaSsrKQorCQkJCU9QSl9TKGkpIC09IG9wal9pbnRfZml4X211bChPUEpfRF8oaSAtIDEpICsgT1BKX0RfKGkpLCA0MzQpOworCQkJZm9yIChpID0gMDsgaSA8IGRuOyBpKyspCisJCQkJT1BKX0QoaSkgKz0gb3BqX2ludF9maXhfbXVsKE9QSl9TXyhpKSArIE9QSl9TXyhpICsgMSksIDcyMzMpOworCQkJZm9yIChpID0gMDsgaSA8IHNuOyBpKyspCisJCQkJT1BKX1MoaSkgKz0gb3BqX2ludF9maXhfbXVsKE9QSl9EXyhpIC0gMSkgKyBPUEpfRF8oaSksIDM2MzMpOworCQkJZm9yIChpID0gMDsgaSA8IGRuOyBpKyspCisJCQkJT1BKX0QoaSkgPSBvcGpfaW50X2ZpeF9tdWwoT1BKX0QoaSksIDUwMzgpOwkvKjUwMzggKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBzbjsgaSsrKQorCQkJCU9QSl9TKGkpID0gb3BqX2ludF9maXhfbXVsKE9QSl9TKGkpLCA2NjU5KTsJLyo2NjYwICovCisJCX0KKwl9IGVsc2UgeworCQlpZiAoKHNuID4gMCkgfHwgKGRuID4gMSkpIHsJLyogTkVXIDogIENBU0UgT05FIEVMRU1FTlQgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBkbjsgaSsrKQorCQkJCU9QSl9TKGkpIC09IG9wal9pbnRfZml4X211bChPUEpfRERfKGkpICsgT1BKX0REXyhpIC0gMSksIDEyOTkzKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBzbjsgaSsrKQorCQkJCU9QSl9EKGkpIC09IG9wal9pbnRfZml4X211bChPUEpfU1NfKGkpICsgT1BKX1NTXyhpICsgMSksIDQzNCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgZG47IGkrKykKKwkJCQlPUEpfUyhpKSArPSBvcGpfaW50X2ZpeF9tdWwoT1BKX0REXyhpKSArIE9QSl9ERF8oaSAtIDEpLCA3MjMzKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBzbjsgaSsrKQorCQkJCU9QSl9EKGkpICs9IG9wal9pbnRfZml4X211bChPUEpfU1NfKGkpICsgT1BKX1NTXyhpICsgMSksIDM2MzMpOworCQkJZm9yIChpID0gMDsgaSA8IGRuOyBpKyspCisJCQkJT1BKX1MoaSkgPSBvcGpfaW50X2ZpeF9tdWwoT1BKX1MoaSksIDUwMzgpOwkvKjUwMzggKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBzbjsgaSsrKQorCQkJCU9QSl9EKGkpID0gb3BqX2ludF9maXhfbXVsKE9QSl9EKGkpLCA2NjU5KTsJLyo2NjYwICovCisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9wal9kd3RfZW5jb2RlX3N0ZXBzaXplKE9QSl9JTlQzMiBzdGVwc2l6ZSwgT1BKX0lOVDMyIG51bWJwcywgb3BqX3N0ZXBzaXplX3QgKmJhbmRub19zdGVwc2l6ZSkgeworCU9QSl9JTlQzMiBwLCBuOworCXAgPSBvcGpfaW50X2Zsb29ybG9nMihzdGVwc2l6ZSkgLSAxMzsKKwluID0gMTEgLSBvcGpfaW50X2Zsb29ybG9nMihzdGVwc2l6ZSk7CisJYmFuZG5vX3N0ZXBzaXplLT5tYW50ID0gKG4gPCAwID8gc3RlcHNpemUgPj4gLW4gOiBzdGVwc2l6ZSA8PCBuKSAmIDB4N2ZmOworCWJhbmRub19zdGVwc2l6ZS0+ZXhwbiA9IG51bWJwcyAtIHA7Cit9CisKKy8qIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgRFdUIGludGVyZmFjZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworCisvKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZvcndhcmQgNS0zIHdhdmVsZXQgdHJhbnNmb3JtIGluIDItRC4gKi8KKy8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RhdGljIElOTElORSBPUEpfQk9PTCBvcGpfZHd0X2VuY29kZV9wcm9jZWR1cmUoY29uc3Qgb3BqX3RjZF90aWxlY29tcF90ICogdGlsZWMsIHZvaWQoKnBfZnVuY3Rpb24pKE9QSl9JTlQzMiAqLCBPUEpfU0laRV9ULCBPUEpfSU5UMzIsIE9QSl9JTlQzMiwgT1BKX0lOVDMyKSkKK3sKKwlPUEpfSU5UMzIgaSwgaiwgazsKKwlPUEpfSU5UMzIgKmEgPSAwMDsKKwlPUEpfSU5UMzIgKmFqID0gMDA7CisJT1BKX0lOVDMyICpiaiA9IDAwOworCU9QSl9JTlQzMiB3LCBsOworCisJT1BKX0lOVDMyIHJ3OwkJCS8qIHdpZHRoIG9mIHRoZSByZXNvbHV0aW9uIGxldmVsIGNvbXB1dGVkICAgKi8KKwlPUEpfSU5UMzIgcmg7CQkJLyogaGVpZ2h0IG9mIHRoZSByZXNvbHV0aW9uIGxldmVsIGNvbXB1dGVkICAqLworCU9QSl9TSVpFX1QgbF9kYXRhX2NvdW50OworCU9QSl9TSVpFX1QgbF9kYXRhX3NpemU7CisKKwlvcGpfdGNkX3Jlc29sdXRpb25fdCAqIGxfY3VyX3JlcyA9IDA7CisJb3BqX3RjZF9yZXNvbHV0aW9uX3QgKiBsX2xhc3RfcmVzID0gMDsKKworCXcgPSB0aWxlYy0+eDEtdGlsZWMtPngwOworCWwgPSAoT1BKX0lOVDMyKXRpbGVjLT5udW1yZXNvbHV0aW9ucy0xOworCWEgPSB0aWxlYy0+ZGF0YTsKKworCWxfY3VyX3JlcyA9IHRpbGVjLT5yZXNvbHV0aW9ucyArIGw7CisJbF9sYXN0X3JlcyA9IGxfY3VyX3JlcyAtIDE7CisKKwlsX2RhdGFfY291bnQgPSBvcGpfZHd0X21heF9yZXNvbHV0aW9uKHRpbGVjLT5yZXNvbHV0aW9ucywgdGlsZWMtPm51bXJlc29sdXRpb25zKSAqIChPUEpfVUlOVDMyKXNpemVvZihPUEpfSU5UMzIpOworCWxfZGF0YV9zaXplID0gbF9kYXRhX2NvdW50ICogKE9QSl9VSU5UMzIpc2l6ZW9mKE9QSl9JTlQzMik7CisJYmogPSAoT1BKX0lOVDMyKilvcGpfbWFsbG9jKGxfZGF0YV9zaXplKTsKKwlpZiAoISBiaikgeworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKwlpID0gbDsKKworCXdoaWxlIChpLS0pIHsKKwkJT1BKX0lOVDMyIHJ3MTsJCS8qIHdpZHRoIG9mIHRoZSByZXNvbHV0aW9uIGxldmVsIG9uY2UgbG93ZXIgdGhhbiBjb21wdXRlZCBvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQlPUEpfSU5UMzIgcmgxOwkJLyogaGVpZ2h0IG9mIHRoZSByZXNvbHV0aW9uIGxldmVsIG9uY2UgbG93ZXIgdGhhbiBjb21wdXRlZCBvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJCU9QSl9JTlQzMiBjYXNfY29sOwkvKiAwID0gbm9uIGludmVyc2lvbiBvbiBob3Jpem9udGFsIGZpbHRlcmluZyAxID0gaW52ZXJzaW9uIGJldHdlZW4gbG93LXBhc3MgYW5kIGhpZ2gtcGFzcyBmaWx0ZXJpbmcgKi8KKwkJT1BKX0lOVDMyIGNhc19yb3c7CS8qIDAgPSBub24gaW52ZXJzaW9uIG9uIHZlcnRpY2FsIGZpbHRlcmluZyAxID0gaW52ZXJzaW9uIGJldHdlZW4gbG93LXBhc3MgYW5kIGhpZ2gtcGFzcyBmaWx0ZXJpbmcgICAqLworCQlPUEpfSU5UMzIgZG4sIHNuOworCisJCXJ3ICA9IGxfY3VyX3Jlcy0+eDEgLSBsX2N1cl9yZXMtPngwOworCQlyaCAgPSBsX2N1cl9yZXMtPnkxIC0gbF9jdXJfcmVzLT55MDsKKwkJcncxID0gbF9sYXN0X3Jlcy0+eDEgLSBsX2xhc3RfcmVzLT54MDsKKwkJcmgxID0gbF9sYXN0X3Jlcy0+eTEgLSBsX2xhc3RfcmVzLT55MDsKKworCQljYXNfcm93ID0gbF9jdXJfcmVzLT54MCAmIDE7CisJCWNhc19jb2wgPSBsX2N1cl9yZXMtPnkwICYgMTsKKworCQlzbiA9IHJoMTsKKwkJZG4gPSByaCAtIHJoMTsKKwkJZm9yIChqID0gMDsgaiA8IHJ3OyArK2opIHsKKwkJCWFqID0gYSArIGo7CisJCQlmb3IgKGsgPSAwOyBrIDwgcmg7ICsraykgeworCQkJCWJqW2tdID0gYWpbayp3XTsKKwkJCX0KKworCQkJKCpwX2Z1bmN0aW9uKSAoYmosIGxfZGF0YV9jb3VudCwgZG4sIHNuLCBjYXNfY29sKTsKKworCQkJb3BqX2R3dF9kZWludGVybGVhdmVfdihiaiwgYWosIGRuLCBzbiwgdywgY2FzX2NvbCk7CisJCX0KKworCQlzbiA9IHJ3MTsKKwkJZG4gPSBydyAtIHJ3MTsKKworCQlmb3IgKGogPSAwOyBqIDwgcmg7IGorKykgeworCQkJYWogPSBhICsgaiAqIHc7CisJCQlmb3IgKGsgPSAwOyBrIDwgcnc7IGsrKykgIGJqW2tdID0gYWpba107CisJCQkoKnBfZnVuY3Rpb24pIChiaiwgbF9kYXRhX2NvdW50LCBkbiwgc24sIGNhc19yb3cpOworCQkJb3BqX2R3dF9kZWludGVybGVhdmVfaChiaiwgYWosIGRuLCBzbiwgY2FzX3Jvdyk7CisJCX0KKworCQlsX2N1cl9yZXMgPSBsX2xhc3RfcmVzOworCisJCS0tbF9sYXN0X3JlczsKKwl9CisKKwlvcGpfZnJlZShiaik7CisJcmV0dXJuIE9QSl9UUlVFOworfQorCisvKiBGb3J3YXJkIDUtMyB3YXZlbGV0IHRyYW5zZm9ybSBpbiAyLUQuICovCisvKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK09QSl9CT09MIG9wal9kd3RfZW5jb2RlKG9wal90Y2RfdGlsZWNvbXBfdCAqIHRpbGVjKQoreworCXJldHVybiBvcGpfZHd0X2VuY29kZV9wcm9jZWR1cmUodGlsZWMsb3BqX2R3dF9lbmNvZGVfMSk7Cit9CisKKy8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSW52ZXJzZSA1LTMgd2F2ZWxldCB0cmFuc2Zvcm0gaW4gMi1ELiAqLworLyogPC9zdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitPUEpfQk9PTCBvcGpfZHd0X2RlY29kZShvcGpfdGNkX3RpbGVjb21wX3QqIHRpbGVjLCBPUEpfVUlOVDMyIG51bXJlcykgeworCXJldHVybiBvcGpfZHd0X2RlY29kZV90aWxlKHRpbGVjLCBudW1yZXMsICZvcGpfZHd0X2RlY29kZV8xKTsKK30KKworCisvKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBHZXQgZ2FpbiBvZiA1LTMgd2F2ZWxldCB0cmFuc2Zvcm0uICovCisvKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICovCitPUEpfVUlOVDMyIG9wal9kd3RfZ2V0Z2FpbihPUEpfVUlOVDMyIG9yaWVudCkgeworCWlmIChvcmllbnQgPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKG9yaWVudCA9PSAxIHx8IG9yaWVudCA9PSAyKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMjsKK30KKworLyogPHN1bW1hcnk+ICAgICAgICAgICAgICAgICovCisvKiBHZXQgbm9ybSBvZiA1LTMgd2F2ZWxldC4gKi8KKy8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAqLworT1BKX0ZMT0FUNjQgb3BqX2R3dF9nZXRub3JtKE9QSl9VSU5UMzIgbGV2ZWwsIE9QSl9VSU5UMzIgb3JpZW50KSB7CisJcmV0dXJuIG9wal9kd3Rfbm9ybXNbb3JpZW50XVtsZXZlbF07Cit9CisKKy8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZvcndhcmQgOS03IHdhdmVsZXQgdHJhbnNmb3JtIGluIDItRC4gKi8KKy8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK09QSl9CT09MIG9wal9kd3RfZW5jb2RlX3JlYWwob3BqX3RjZF90aWxlY29tcF90ICogdGlsZWMpCit7CisJcmV0dXJuIG9wal9kd3RfZW5jb2RlX3Byb2NlZHVyZSh0aWxlYyxvcGpfZHd0X2VuY29kZV8xX3JlYWwpOworfQorCisvKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBHZXQgZ2FpbiBvZiA5LTcgd2F2ZWxldCB0cmFuc2Zvcm0uICovCisvKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICovCitPUEpfVUlOVDMyIG9wal9kd3RfZ2V0Z2Fpbl9yZWFsKE9QSl9VSU5UMzIgb3JpZW50KSB7CisJKHZvaWQpb3JpZW50OworCXJldHVybiAwOworfQorCisvKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgKi8KKy8qIEdldCBub3JtIG9mIDktNyB3YXZlbGV0LiAqLworLyogPC9zdW1tYXJ5PiAgICAgICAgICAgICAgICovCitPUEpfRkxPQVQ2NCBvcGpfZHd0X2dldG5vcm1fcmVhbChPUEpfVUlOVDMyIGxldmVsLCBPUEpfVUlOVDMyIG9yaWVudCkgeworCXJldHVybiBvcGpfZHd0X25vcm1zX3JlYWxbb3JpZW50XVtsZXZlbF07Cit9CisKK3ZvaWQgb3BqX2R3dF9jYWxjX2V4cGxpY2l0X3N0ZXBzaXplcyhvcGpfdGNjcF90ICogdGNjcCwgT1BKX1VJTlQzMiBwcmVjKSB7CisJT1BKX1VJTlQzMiBudW1iYW5kcywgYmFuZG5vOworCW51bWJhbmRzID0gMyAqIHRjY3AtPm51bXJlc29sdXRpb25zIC0gMjsKKwlmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IG51bWJhbmRzOyBiYW5kbm8rKykgeworCQlPUEpfRkxPQVQ2NCBzdGVwc2l6ZTsKKwkJT1BKX1VJTlQzMiByZXNubywgbGV2ZWwsIG9yaWVudCwgZ2FpbjsKKworCQlyZXNubyA9IChiYW5kbm8gPT0gMCkgPyAwIDogKChiYW5kbm8gLSAxKSAvIDMgKyAxKTsKKwkJb3JpZW50ID0gKGJhbmRubyA9PSAwKSA/IDAgOiAoKGJhbmRubyAtIDEpICUgMyArIDEpOworCQlsZXZlbCA9IHRjY3AtPm51bXJlc29sdXRpb25zIC0gMSAtIHJlc25vOworCQlnYWluID0gKHRjY3AtPnFtZmJpZCA9PSAwKSA/IDAgOiAoKG9yaWVudCA9PSAwKSA/IDAgOiAoKChvcmllbnQgPT0gMSkgfHwgKG9yaWVudCA9PSAyKSkgPyAxIDogMikpOworCQlpZiAodGNjcC0+cW50c3R5ID09IEoyS19DQ1BfUU5UU1RZX05PUU5UKSB7CisJCQlzdGVwc2l6ZSA9IDEuMDsKKwkJfSBlbHNlIHsKKwkJCU9QSl9GTE9BVDY0IG5vcm0gPSBvcGpfZHd0X25vcm1zX3JlYWxbb3JpZW50XVtsZXZlbF07CisJCQlzdGVwc2l6ZSA9ICgxIDw8IChnYWluKSkgLyBub3JtOworCQl9CisJCW9wal9kd3RfZW5jb2RlX3N0ZXBzaXplKChPUEpfSU5UMzIpIGZsb29yKHN0ZXBzaXplICogODE5Mi4wKSwgKE9QSl9JTlQzMikocHJlYyArIGdhaW4pLCAmdGNjcC0+c3RlcHNpemVzW2JhbmRub10pOworCX0KK30KKworLyogPHN1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGV0ZXJtaW5lIG1heGltdW0gY29tcHV0ZWQgcmVzb2x1dGlvbiBsZXZlbCBmb3IgaW52ZXJzZSB3YXZlbGV0IHRyYW5zZm9ybSAqLworLyogPC9zdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RhdGljIE9QSl9VSU5UMzIgb3BqX2R3dF9tYXhfcmVzb2x1dGlvbihvcGpfdGNkX3Jlc29sdXRpb25fdCogcmVzdHJpY3QgciwgT1BKX1VJTlQzMiBpKSB7CisJT1BKX1VJTlQzMiBtcgk9IDA7CisJT1BKX1VJTlQzMiB3OworCXdoaWxlKCAtLWkgKSB7CisJCSsrcjsKKwkJaWYoIG1yIDwgKCB3ID0gKE9QSl9VSU5UMzIpKHItPngxIC0gci0+eDApICkgKQorCQkJbXIgPSB3IDsKKwkJaWYoIG1yIDwgKCB3ID0gKE9QSl9VSU5UMzIpKHItPnkxIC0gci0+eTApICkgKQorCQkJbXIgPSB3IDsKKwl9CisJcmV0dXJuIG1yIDsKK30KKworLyogPHN1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBJbnZlcnNlIHdhdmVsZXQgdHJhbnNmb3JtIGluIDItRC4gICAgICovCisvKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfZHd0X2RlY29kZV90aWxlKGNvbnN0IG9wal90Y2RfdGlsZWNvbXBfdCogdGlsZWMsIE9QSl9VSU5UMzIgbnVtcmVzLCBEV1QxREZOIGR3dF8xRCkgeworCW9wal9kd3RfdCBoOworCW9wal9kd3RfdCB2OworCisJb3BqX3RjZF9yZXNvbHV0aW9uX3QqIHRyID0gdGlsZWMtPnJlc29sdXRpb25zOworCisJT1BKX1VJTlQzMiBydyA9IChPUEpfVUlOVDMyKSh0ci0+eDEgLSB0ci0+eDApOwkvKiB3aWR0aCBvZiB0aGUgcmVzb2x1dGlvbiBsZXZlbCBjb21wdXRlZCAqLworCU9QSl9VSU5UMzIgcmggPSAoT1BKX1VJTlQzMikodHItPnkxIC0gdHItPnkwKTsJLyogaGVpZ2h0IG9mIHRoZSByZXNvbHV0aW9uIGxldmVsIGNvbXB1dGVkICovCisKKwlPUEpfVUlOVDMyIHcgPSAoT1BKX1VJTlQzMikodGlsZWMtPngxIC0gdGlsZWMtPngwKTsKKworCWgubWVtX2NvdW50ID0gb3BqX2R3dF9tYXhfcmVzb2x1dGlvbih0ciwgbnVtcmVzKTsKKwloLm1lbSA9IChPUEpfSU5UMzIqKW9wal9hbGlnbmVkX21hbGxvYyhoLm1lbV9jb3VudCAqIHNpemVvZihPUEpfSU5UMzIpKTsKKwlpZiAoISBoLm1lbSl7CisJCS8qIEZJWE1FIGV2ZW50IG1hbmFnZXIgZXJyb3IgY2FsbGJhY2sgKi8KKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisKKwl2Lm1lbV9jb3VudCA9IGgubWVtX2NvdW50OworCXYubWVtID0gaC5tZW07CisKKwl3aGlsZSggLS1udW1yZXMpIHsKKwkJT1BKX0lOVDMyICogcmVzdHJpY3QgdGlsZWRwID0gdGlsZWMtPmRhdGE7CisJCU9QSl9VSU5UMzIgajsKKworCQkrK3RyOworCQloLnNuID0gKE9QSl9JTlQzMilydzsKKwkJdi5zbiA9IChPUEpfSU5UMzIpcmg7CisKKwkJcncgPSAoT1BKX1VJTlQzMikodHItPngxIC0gdHItPngwKTsKKwkJcmggPSAoT1BKX1VJTlQzMikodHItPnkxIC0gdHItPnkwKTsKKworCQloLmRuID0gKE9QSl9JTlQzMikocncgLSAoT1BKX1VJTlQzMiloLnNuKTsKKwkJaC5jYXMgPSB0ci0+eDAgJSAyOworCisJCWZvcihqID0gMDsgaiA8IHJoOyArK2opIHsKKwkJCW9wal9kd3RfaW50ZXJsZWF2ZV9oKCZoLCAmdGlsZWRwW2oqd10pOworCQkJKGR3dF8xRCkoJmgpOworCQkJbWVtY3B5KCZ0aWxlZHBbaip3XSwgaC5tZW0sIHJ3ICogc2l6ZW9mKE9QSl9JTlQzMikpOworCQl9CisKKwkJdi5kbiA9IChPUEpfSU5UMzIpKHJoIC0gKE9QSl9VSU5UMzIpdi5zbik7CisJCXYuY2FzID0gdHItPnkwICUgMjsKKworCQlmb3IoaiA9IDA7IGogPCBydzsgKytqKXsKKwkJCU9QSl9VSU5UMzIgazsKKwkJCW9wal9kd3RfaW50ZXJsZWF2ZV92KCZ2LCAmdGlsZWRwW2pdLCAoT1BKX0lOVDMyKXcpOworCQkJKGR3dF8xRCkoJnYpOworCQkJZm9yKGsgPSAwOyBrIDwgcmg7ICsraykgeworCQkJCXRpbGVkcFtrICogdyArIGpdID0gdi5tZW1ba107CisJCQl9CisJCX0KKwl9CisJb3BqX2FsaWduZWRfZnJlZShoLm1lbSk7CisJcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgdm9pZCBvcGpfdjRkd3RfaW50ZXJsZWF2ZV9oKG9wal92NGR3dF90KiByZXN0cmljdCB3LCBPUEpfRkxPQVQzMiogcmVzdHJpY3QgYSwgT1BKX0lOVDMyIHgsIE9QSl9JTlQzMiBzaXplKXsKKwlPUEpfRkxPQVQzMiogcmVzdHJpY3QgYmkgPSAoT1BKX0ZMT0FUMzIqKSAody0+d2F2ZWxldCArIHctPmNhcyk7CisJT1BKX0lOVDMyIGNvdW50ID0gdy0+c247CisJT1BKX0lOVDMyIGksIGs7CisKKwlmb3IoayA9IDA7IGsgPCAyOyArK2speworCQlpZiAoIGNvdW50ICsgMyAqIHggPCBzaXplICYmICgoc2l6ZV90KSBhICYgMHgwZikgPT0gMCAmJiAoKHNpemVfdCkgYmkgJiAweDBmKSA9PSAwICYmICh4ICYgMHgwZikgPT0gMCApIHsKKwkJCS8qIEZhc3QgY29kZSBwYXRoICovCisJCQlmb3IoaSA9IDA7IGkgPCBjb3VudDsgKytpKXsKKwkJCQlPUEpfSU5UMzIgaiA9IGk7CisJCQkJYmlbaSo4ICAgIF0gPSBhW2pdOworCQkJCWogKz0geDsKKwkJCQliaVtpKjggKyAxXSA9IGFbal07CisJCQkJaiArPSB4OworCQkJCWJpW2kqOCArIDJdID0gYVtqXTsKKwkJCQlqICs9IHg7CisJCQkJYmlbaSo4ICsgM10gPSBhW2pdOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJLyogU2xvdyBjb2RlIHBhdGggKi8KKwkJCWZvcihpID0gMDsgaSA8IGNvdW50OyArK2kpeworCQkJCU9QSl9JTlQzMiBqID0gaTsKKwkJCQliaVtpKjggICAgXSA9IGFbal07CisJCQkJaiArPSB4OworCQkJCWlmKGogPj0gc2l6ZSkgY29udGludWU7CisJCQkJYmlbaSo4ICsgMV0gPSBhW2pdOworCQkJCWogKz0geDsKKwkJCQlpZihqID49IHNpemUpIGNvbnRpbnVlOworCQkJCWJpW2kqOCArIDJdID0gYVtqXTsKKwkJCQlqICs9IHg7CisJCQkJaWYoaiA+PSBzaXplKSBjb250aW51ZTsKKwkJCQliaVtpKjggKyAzXSA9IGFbal07IC8qIFRoaXMgb25lKi8KKwkJCX0KKwkJfQorCisJCWJpID0gKE9QSl9GTE9BVDMyKikgKHctPndhdmVsZXQgKyAxIC0gdy0+Y2FzKTsKKwkJYSArPSB3LT5zbjsKKwkJc2l6ZSAtPSB3LT5zbjsKKwkJY291bnQgPSB3LT5kbjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9wal92NGR3dF9pbnRlcmxlYXZlX3Yob3BqX3Y0ZHd0X3QqIHJlc3RyaWN0IHYgLCBPUEpfRkxPQVQzMiogcmVzdHJpY3QgYSAsIE9QSl9JTlQzMiB4LCBPUEpfSU5UMzIgbmJfZWx0c19yZWFkKXsKKwlvcGpfdjRfdCogcmVzdHJpY3QgYmkgPSB2LT53YXZlbGV0ICsgdi0+Y2FzOworCU9QSl9JTlQzMiBpOworCisJZm9yKGkgPSAwOyBpIDwgdi0+c247ICsraSl7CisJCW1lbWNweSgmYmlbaSoyXSwgJmFbaSp4XSwgKHNpemVfdCluYl9lbHRzX3JlYWQgKiBzaXplb2YoT1BKX0ZMT0FUMzIpKTsKKwl9CisKKwlhICs9IHYtPnNuICogeDsKKwliaSA9IHYtPndhdmVsZXQgKyAxIC0gdi0+Y2FzOworCisJZm9yKGkgPSAwOyBpIDwgdi0+ZG47ICsraSl7CisJCW1lbWNweSgmYmlbaSoyXSwgJmFbaSp4XSwgKHNpemVfdCluYl9lbHRzX3JlYWQgKiBzaXplb2YoT1BKX0ZMT0FUMzIpKTsKKwl9Cit9CisKKyNpZmRlZiBfX1NTRV9fCisKK3N0YXRpYyB2b2lkIG9wal92NGR3dF9kZWNvZGVfc3RlcDFfc3NlKG9wal92NF90KiB3LCBPUEpfSU5UMzIgY291bnQsIGNvbnN0IF9fbTEyOCBjKXsKKwlfX20xMjgqIHJlc3RyaWN0IHZ3ID0gKF9fbTEyOCopIHc7CisJT1BKX0lOVDMyIGk7CisJLyogNHggdW5yb2xsZWQgbG9vcCAqLworCWZvcihpID0gMDsgaSA8IGNvdW50ID4+IDI7ICsraSl7CisJCSp2dyA9IF9tbV9tdWxfcHMoKnZ3LCBjKTsKKwkJdncgKz0gMjsKKwkJKnZ3ID0gX21tX211bF9wcygqdncsIGMpOworCQl2dyArPSAyOworCQkqdncgPSBfbW1fbXVsX3BzKCp2dywgYyk7CisJCXZ3ICs9IDI7CisJCSp2dyA9IF9tbV9tdWxfcHMoKnZ3LCBjKTsKKwkJdncgKz0gMjsKKwl9CisJY291bnQgJj0gMzsKKwlmb3IoaSA9IDA7IGkgPCBjb3VudDsgKytpKXsKKwkJKnZ3ID0gX21tX211bF9wcygqdncsIGMpOworCQl2dyArPSAyOworCX0KK30KKwordm9pZCBvcGpfdjRkd3RfZGVjb2RlX3N0ZXAyX3NzZShvcGpfdjRfdCogbCwgb3BqX3Y0X3QqIHcsIE9QSl9JTlQzMiBrLCBPUEpfSU5UMzIgbSwgX19tMTI4IGMpeworCV9fbTEyOCogcmVzdHJpY3QgdmwgPSAoX19tMTI4KikgbDsKKwlfX20xMjgqIHJlc3RyaWN0IHZ3ID0gKF9fbTEyOCopIHc7CisJT1BKX0lOVDMyIGk7CisJX19tMTI4IHRtcDEsIHRtcDIsIHRtcDM7CisJdG1wMSA9IHZsWzBdOworCWZvcihpID0gMDsgaSA8IG07ICsraSl7CisJCXRtcDIgPSB2d1stMV07CisJCXRtcDMgPSB2d1sgMF07CisJCXZ3Wy0xXSA9IF9tbV9hZGRfcHModG1wMiwgX21tX211bF9wcyhfbW1fYWRkX3BzKHRtcDEsIHRtcDMpLCBjKSk7CisJCXRtcDEgPSB0bXAzOworCQl2dyArPSAyOworCX0KKwl2bCA9IHZ3IC0gMjsKKwlpZihtID49IGspeworCQlyZXR1cm47CisJfQorCWMgPSBfbW1fYWRkX3BzKGMsIGMpOworCWMgPSBfbW1fbXVsX3BzKGMsIHZsWzBdKTsKKwlmb3IoOyBtIDwgazsgKyttKXsKKwkJX19tMTI4IHRtcCA9IHZ3Wy0xXTsKKwkJdndbLTFdID0gX21tX2FkZF9wcyh0bXAsIGMpOworCQl2dyArPSAyOworCX0KK30KKworI2Vsc2UKKworc3RhdGljIHZvaWQgb3BqX3Y0ZHd0X2RlY29kZV9zdGVwMShvcGpfdjRfdCogdywgT1BKX0lOVDMyIGNvdW50LCBjb25zdCBPUEpfRkxPQVQzMiBjKQoreworCU9QSl9GTE9BVDMyKiByZXN0cmljdCBmdyA9IChPUEpfRkxPQVQzMiopIHc7CisJT1BKX0lOVDMyIGk7CisJZm9yKGkgPSAwOyBpIDwgY291bnQ7ICsraSl7CisJCU9QSl9GTE9BVDMyIHRtcDEgPSBmd1tpKjggICAgXTsKKwkJT1BKX0ZMT0FUMzIgdG1wMiA9IGZ3W2kqOCArIDFdOworCQlPUEpfRkxPQVQzMiB0bXAzID0gZndbaSo4ICsgMl07CisJCU9QSl9GTE9BVDMyIHRtcDQgPSBmd1tpKjggKyAzXTsKKwkJZndbaSo4ICAgIF0gPSB0bXAxICogYzsKKwkJZndbaSo4ICsgMV0gPSB0bXAyICogYzsKKwkJZndbaSo4ICsgMl0gPSB0bXAzICogYzsKKwkJZndbaSo4ICsgM10gPSB0bXA0ICogYzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9wal92NGR3dF9kZWNvZGVfc3RlcDIob3BqX3Y0X3QqIGwsIG9wal92NF90KiB3LCBPUEpfSU5UMzIgaywgT1BKX0lOVDMyIG0sIE9QSl9GTE9BVDMyIGMpCit7CisJT1BKX0ZMT0FUMzIqIHJlc3RyaWN0IGZsID0gKE9QSl9GTE9BVDMyKikgbDsKKwlPUEpfRkxPQVQzMiogcmVzdHJpY3QgZncgPSAoT1BKX0ZMT0FUMzIqKSB3OworCU9QSl9JTlQzMiBpOworCWZvcihpID0gMDsgaSA8IG07ICsraSl7CisJCU9QSl9GTE9BVDMyIHRtcDFfMSA9IGZsWzBdOworCQlPUEpfRkxPQVQzMiB0bXAxXzIgPSBmbFsxXTsKKwkJT1BKX0ZMT0FUMzIgdG1wMV8zID0gZmxbMl07CisJCU9QSl9GTE9BVDMyIHRtcDFfNCA9IGZsWzNdOworCQlPUEpfRkxPQVQzMiB0bXAyXzEgPSBmd1stNF07CisJCU9QSl9GTE9BVDMyIHRtcDJfMiA9IGZ3Wy0zXTsKKwkJT1BKX0ZMT0FUMzIgdG1wMl8zID0gZndbLTJdOworCQlPUEpfRkxPQVQzMiB0bXAyXzQgPSBmd1stMV07CisJCU9QSl9GTE9BVDMyIHRtcDNfMSA9IGZ3WzBdOworCQlPUEpfRkxPQVQzMiB0bXAzXzIgPSBmd1sxXTsKKwkJT1BKX0ZMT0FUMzIgdG1wM18zID0gZndbMl07CisJCU9QSl9GTE9BVDMyIHRtcDNfNCA9IGZ3WzNdOworCQlmd1stNF0gPSB0bXAyXzEgKyAoKHRtcDFfMSArIHRtcDNfMSkgKiBjKTsKKwkJZndbLTNdID0gdG1wMl8yICsgKCh0bXAxXzIgKyB0bXAzXzIpICogYyk7CisJCWZ3Wy0yXSA9IHRtcDJfMyArICgodG1wMV8zICsgdG1wM18zKSAqIGMpOworCQlmd1stMV0gPSB0bXAyXzQgKyAoKHRtcDFfNCArIHRtcDNfNCkgKiBjKTsKKwkJZmwgPSBmdzsKKwkJZncgKz0gODsKKwl9CisJaWYobSA8IGspeworCQlPUEpfRkxPQVQzMiBjMTsKKwkJT1BKX0ZMT0FUMzIgYzI7CisJCU9QSl9GTE9BVDMyIGMzOworCQlPUEpfRkxPQVQzMiBjNDsKKwkJYyArPSBjOworCQljMSA9IGZsWzBdICogYzsKKwkJYzIgPSBmbFsxXSAqIGM7CisJCWMzID0gZmxbMl0gKiBjOworCQljNCA9IGZsWzNdICogYzsKKwkJZm9yKDsgbSA8IGs7ICsrbSl7CisJCQlPUEpfRkxPQVQzMiB0bXAxID0gZndbLTRdOworCQkJT1BKX0ZMT0FUMzIgdG1wMiA9IGZ3Wy0zXTsKKwkJCU9QSl9GTE9BVDMyIHRtcDMgPSBmd1stMl07CisJCQlPUEpfRkxPQVQzMiB0bXA0ID0gZndbLTFdOworCQkJZndbLTRdID0gdG1wMSArIGMxOworCQkJZndbLTNdID0gdG1wMiArIGMyOworCQkJZndbLTJdID0gdG1wMyArIGMzOworCQkJZndbLTFdID0gdG1wNCArIGM0OworCQkJZncgKz0gODsKKwkJfQorCX0KK30KKworI2VuZGlmCisKKy8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEludmVyc2UgOS03IHdhdmVsZXQgdHJhbnNmb3JtIGluIDEtRC4gKi8KKy8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3ZvaWQgb3BqX3Y0ZHd0X2RlY29kZShvcGpfdjRkd3RfdCogcmVzdHJpY3QgZHd0KQoreworCU9QSl9JTlQzMiBhLCBiOworCWlmKGR3dC0+Y2FzID09IDApIHsKKwkJaWYoISgoZHd0LT5kbiA+IDApIHx8IChkd3QtPnNuID4gMSkpKXsKKwkJCXJldHVybjsKKwkJfQorCQlhID0gMDsKKwkJYiA9IDE7CisJfWVsc2V7CisJCWlmKCEoKGR3dC0+c24gPiAwKSB8fCAoZHd0LT5kbiA+IDEpKSkgeworCQkJcmV0dXJuOworCQl9CisJCWEgPSAxOworCQliID0gMDsKKwl9CisjaWZkZWYgX19TU0VfXworCW9wal92NGR3dF9kZWNvZGVfc3RlcDFfc3NlKGR3dC0+d2F2ZWxldCthLCBkd3QtPnNuLCBfbW1fc2V0MV9wcyhvcGpfSykpOworCW9wal92NGR3dF9kZWNvZGVfc3RlcDFfc3NlKGR3dC0+d2F2ZWxldCtiLCBkd3QtPmRuLCBfbW1fc2V0MV9wcyhvcGpfYzEzMzE4KSk7CisJb3BqX3Y0ZHd0X2RlY29kZV9zdGVwMl9zc2UoZHd0LT53YXZlbGV0K2IsIGR3dC0+d2F2ZWxldCthKzEsIGR3dC0+c24sIG9wal9pbnRfbWluKGR3dC0+c24sIGR3dC0+ZG4tYSksIF9tbV9zZXQxX3BzKG9wal9kd3RfZGVsdGEpKTsKKwlvcGpfdjRkd3RfZGVjb2RlX3N0ZXAyX3NzZShkd3QtPndhdmVsZXQrYSwgZHd0LT53YXZlbGV0K2IrMSwgZHd0LT5kbiwgb3BqX2ludF9taW4oZHd0LT5kbiwgZHd0LT5zbi1iKSwgX21tX3NldDFfcHMob3BqX2R3dF9nYW1tYSkpOworCW9wal92NGR3dF9kZWNvZGVfc3RlcDJfc3NlKGR3dC0+d2F2ZWxldCtiLCBkd3QtPndhdmVsZXQrYSsxLCBkd3QtPnNuLCBvcGpfaW50X21pbihkd3QtPnNuLCBkd3QtPmRuLWEpLCBfbW1fc2V0MV9wcyhvcGpfZHd0X2JldGEpKTsKKwlvcGpfdjRkd3RfZGVjb2RlX3N0ZXAyX3NzZShkd3QtPndhdmVsZXQrYSwgZHd0LT53YXZlbGV0K2IrMSwgZHd0LT5kbiwgb3BqX2ludF9taW4oZHd0LT5kbiwgZHd0LT5zbi1iKSwgX21tX3NldDFfcHMob3BqX2R3dF9hbHBoYSkpOworI2Vsc2UKKwlvcGpfdjRkd3RfZGVjb2RlX3N0ZXAxKGR3dC0+d2F2ZWxldCthLCBkd3QtPnNuLCBvcGpfSyk7CisJb3BqX3Y0ZHd0X2RlY29kZV9zdGVwMShkd3QtPndhdmVsZXQrYiwgZHd0LT5kbiwgb3BqX2MxMzMxOCk7CisJb3BqX3Y0ZHd0X2RlY29kZV9zdGVwMihkd3QtPndhdmVsZXQrYiwgZHd0LT53YXZlbGV0K2ErMSwgZHd0LT5zbiwgb3BqX2ludF9taW4oZHd0LT5zbiwgZHd0LT5kbi1hKSwgb3BqX2R3dF9kZWx0YSk7CisJb3BqX3Y0ZHd0X2RlY29kZV9zdGVwMihkd3QtPndhdmVsZXQrYSwgZHd0LT53YXZlbGV0K2IrMSwgZHd0LT5kbiwgb3BqX2ludF9taW4oZHd0LT5kbiwgZHd0LT5zbi1iKSwgb3BqX2R3dF9nYW1tYSk7CisJb3BqX3Y0ZHd0X2RlY29kZV9zdGVwMihkd3QtPndhdmVsZXQrYiwgZHd0LT53YXZlbGV0K2ErMSwgZHd0LT5zbiwgb3BqX2ludF9taW4oZHd0LT5zbiwgZHd0LT5kbi1hKSwgb3BqX2R3dF9iZXRhKTsKKwlvcGpfdjRkd3RfZGVjb2RlX3N0ZXAyKGR3dC0+d2F2ZWxldCthLCBkd3QtPndhdmVsZXQrYisxLCBkd3QtPmRuLCBvcGpfaW50X21pbihkd3QtPmRuLCBkd3QtPnNuLWIpLCBvcGpfZHd0X2FscGhhKTsKKyNlbmRpZgorfQorCisKKy8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEludmVyc2UgOS03IHdhdmVsZXQgdHJhbnNmb3JtIGluIDItRC4gKi8KKy8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK09QSl9CT09MIG9wal9kd3RfZGVjb2RlX3JlYWwob3BqX3RjZF90aWxlY29tcF90KiByZXN0cmljdCB0aWxlYywgT1BKX1VJTlQzMiBudW1yZXMpCit7CisJb3BqX3Y0ZHd0X3QgaDsKKwlvcGpfdjRkd3RfdCB2OworCisJb3BqX3RjZF9yZXNvbHV0aW9uX3QqIHJlcyA9IHRpbGVjLT5yZXNvbHV0aW9uczsKKworCU9QSl9VSU5UMzIgcncgPSAoT1BKX1VJTlQzMikocmVzLT54MSAtIHJlcy0+eDApOwkvKiB3aWR0aCBvZiB0aGUgcmVzb2x1dGlvbiBsZXZlbCBjb21wdXRlZCAqLworCU9QSl9VSU5UMzIgcmggPSAoT1BKX1VJTlQzMikocmVzLT55MSAtIHJlcy0+eTApOwkvKiBoZWlnaHQgb2YgdGhlIHJlc29sdXRpb24gbGV2ZWwgY29tcHV0ZWQgKi8KKworCU9QSl9VSU5UMzIgdyA9IChPUEpfVUlOVDMyKSh0aWxlYy0+eDEgLSB0aWxlYy0+eDApOworCisJaC53YXZlbGV0ID0gKG9wal92NF90Kikgb3BqX2FsaWduZWRfbWFsbG9jKChvcGpfZHd0X21heF9yZXNvbHV0aW9uKHJlcywgbnVtcmVzKSs1KSAqIHNpemVvZihvcGpfdjRfdCkpOworCWlmICghaC53YXZlbGV0KSB7CisJCS8qIEZJWE1FIGV2ZW50IG1hbmFnZXIgZXJyb3IgY2FsbGJhY2sgKi8KKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisJdi53YXZlbGV0ID0gaC53YXZlbGV0OworCisJd2hpbGUoIC0tbnVtcmVzKSB7CisJCU9QSl9GTE9BVDMyICogcmVzdHJpY3QgYWogPSAoT1BKX0ZMT0FUMzIqKSB0aWxlYy0+ZGF0YTsKKwkJT1BKX1VJTlQzMiBidWZzaXplID0gKE9QSl9VSU5UMzIpKCh0aWxlYy0+eDEgLSB0aWxlYy0+eDApICogKHRpbGVjLT55MSAtIHRpbGVjLT55MCkpOworCQlPUEpfSU5UMzIgajsKKworCQloLnNuID0gKE9QSl9JTlQzMilydzsKKwkJdi5zbiA9IChPUEpfSU5UMzIpcmg7CisKKwkJKytyZXM7CisKKwkJcncgPSAoT1BKX1VJTlQzMikocmVzLT54MSAtIHJlcy0+eDApOwkvKiB3aWR0aCBvZiB0aGUgcmVzb2x1dGlvbiBsZXZlbCBjb21wdXRlZCAqLworCQlyaCA9IChPUEpfVUlOVDMyKShyZXMtPnkxIC0gcmVzLT55MCk7CS8qIGhlaWdodCBvZiB0aGUgcmVzb2x1dGlvbiBsZXZlbCBjb21wdXRlZCAqLworCisJCWguZG4gPSAoT1BKX0lOVDMyKShydyAtIChPUEpfVUlOVDMyKWguc24pOworCQloLmNhcyA9IHJlcy0+eDAgJSAyOworCisJCWZvcihqID0gKE9QSl9JTlQzMilyaDsgaiA+IDM7IGogLT0gNCkgeworCQkJT1BKX0lOVDMyIGs7CisJCQlvcGpfdjRkd3RfaW50ZXJsZWF2ZV9oKCZoLCBhaiwgKE9QSl9JTlQzMil3LCAoT1BKX0lOVDMyKWJ1ZnNpemUpOworCQkJb3BqX3Y0ZHd0X2RlY29kZSgmaCk7CisKKwkJCWZvcihrID0gKE9QSl9JTlQzMilydzsgLS1rID49IDA7KXsKKwkJCQlhaltrICAgICAgICAgICAgICAgXSA9IGgud2F2ZWxldFtrXS5mWzBdOworCQkJCWFqW2srKE9QSl9JTlQzMil3ICBdID0gaC53YXZlbGV0W2tdLmZbMV07CisJCQkJYWpbaysoT1BKX0lOVDMyKXcqMl0gPSBoLndhdmVsZXRba10uZlsyXTsKKwkJCQlhaltrKyhPUEpfSU5UMzIpdyozXSA9IGgud2F2ZWxldFtrXS5mWzNdOworCQkJfQorCisJCQlhaiArPSB3KjQ7CisJCQlidWZzaXplIC09IHcqNDsKKwkJfQorCisJCWlmIChyaCAmIDB4MDMpIHsKKwkJCU9QSl9JTlQzMiBrOworCQkJaiA9IHJoICYgMHgwMzsKKwkJCW9wal92NGR3dF9pbnRlcmxlYXZlX2goJmgsIGFqLCAoT1BKX0lOVDMyKXcsIChPUEpfSU5UMzIpYnVmc2l6ZSk7CisJCQlvcGpfdjRkd3RfZGVjb2RlKCZoKTsKKwkJCWZvcihrID0gKE9QSl9JTlQzMilydzsgLS1rID49IDA7KXsKKwkJCQlzd2l0Y2goaikgeworCQkJCQljYXNlIDM6IGFqW2srKE9QSl9JTlQzMil3KjJdID0gaC53YXZlbGV0W2tdLmZbMl07CisJCQkJCWNhc2UgMjogYWpbaysoT1BKX0lOVDMyKXcgIF0gPSBoLndhdmVsZXRba10uZlsxXTsKKwkJCQkJY2FzZSAxOiBhaltrICAgICAgICAgICAgICAgXSA9IGgud2F2ZWxldFtrXS5mWzBdOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXYuZG4gPSAoT1BKX0lOVDMyKShyaCAtIChPUEpfVUlOVDMyKXYuc24pOworCQl2LmNhcyA9IHJlcy0+eTAgJSAyOworCisJCWFqID0gKE9QSl9GTE9BVDMyKikgdGlsZWMtPmRhdGE7CisJCWZvcihqID0gKE9QSl9JTlQzMilydzsgaiA+IDM7IGogLT0gNCl7CisJCQlPUEpfVUlOVDMyIGs7CisKKwkJCW9wal92NGR3dF9pbnRlcmxlYXZlX3YoJnYsIGFqLCAoT1BKX0lOVDMyKXcsIDQpOworCQkJb3BqX3Y0ZHd0X2RlY29kZSgmdik7CisKKwkJCWZvcihrID0gMDsgayA8IHJoOyArK2speworCQkJCW1lbWNweSgmYWpbayp3XSwgJnYud2F2ZWxldFtrXSwgNCAqIHNpemVvZihPUEpfRkxPQVQzMikpOworCQkJfQorCQkJYWogKz0gNDsKKwkJfQorCisJCWlmIChydyAmIDB4MDMpeworCQkJT1BKX1VJTlQzMiBrOworCisJCQlqID0gcncgJiAweDAzOworCisJCQlvcGpfdjRkd3RfaW50ZXJsZWF2ZV92KCZ2LCBhaiwgKE9QSl9JTlQzMil3LCBqKTsKKwkJCW9wal92NGR3dF9kZWNvZGUoJnYpOworCisJCQlmb3IoayA9IDA7IGsgPCByaDsgKytrKXsKKwkJCQltZW1jcHkoJmFqW2sqd10sICZ2LndhdmVsZXRba10sIChzaXplX3QpaiAqIHNpemVvZihPUEpfRkxPQVQzMikpOworCQkJfQorCQl9CisJfQorCisJb3BqX2FsaWduZWRfZnJlZShoLndhdmVsZXQpOworCXJldHVybiBPUEpfVFJVRTsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvZHd0LmggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2R3dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZmU5NDIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2R3dC5oCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCisgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFVuaXZlcnNpdGUgY2F0aG9saXF1ZSBkZSBMb3V2YWluIChVQ0wpLCBCZWxnaXVtCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQorICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX19EV1RfSAorI2RlZmluZSBfX0RXVF9ICisvKioKK0BmaWxlIGR3dC5oCitAYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYSBkaXNjcmV0ZSB3YXZlbGV0IHRyYW5zZm9ybSAoRFdUKQorCitUaGUgZnVuY3Rpb25zIGluIERXVC5DIGhhdmUgZm9yIGdvYWwgdG8gcmVhbGl6ZSBmb3J3YXJkIGFuZCBpbnZlcnNlIGRpc2NyZXQgd2F2ZWxldAordHJhbnNmb3JtIHdpdGggZmlsdGVyIDUtMyAocmV2ZXJzaWJsZSkgYW5kIGZpbHRlciA5LTcgKGlycmV2ZXJzaWJsZSkuIFRoZSBmdW5jdGlvbnMgaW4KK0RXVC5DIGFyZSB1c2VkIGJ5IHNvbWUgZnVuY3Rpb24gaW4gVENELkMuCisqLworCisvKiogQGRlZmdyb3VwIERXVCBEV1QgLSBJbXBsZW1lbnRhdGlvbiBvZiBhIGRpc2NyZXRlIHdhdmVsZXQgdHJhbnNmb3JtICovCisvKkB7Ki8KKworCisvKiogQG5hbWUgRXhwb3J0ZWQgZnVuY3Rpb25zICovCisvKkB7Ki8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKioKK0ZvcndhcmQgNS0zIHdhdmVsZXQgdHJhbnNmb3JtIGluIDItRC4KK0FwcGx5IGEgcmV2ZXJzaWJsZSBEV1QgdHJhbnNmb3JtIHRvIGEgY29tcG9uZW50IG9mIGFuIGltYWdlLgorQHBhcmFtIHRpbGVjIFRpbGUgY29tcG9uZW50IGluZm9ybWF0aW9uIChjdXJyZW50IHRpbGUpCisqLworT1BKX0JPT0wgb3BqX2R3dF9lbmNvZGUob3BqX3RjZF90aWxlY29tcF90ICogdGlsZWMpOworCisvKioKK0ludmVyc2UgNS0zIHdhdmVsZXQgdHJhbnNmb3JtIGluIDItRC4KK0FwcGx5IGEgcmV2ZXJzaWJsZSBpbnZlcnNlIERXVCB0cmFuc2Zvcm0gdG8gYSBjb21wb25lbnQgb2YgYW4gaW1hZ2UuCitAcGFyYW0gdGlsZWMgVGlsZSBjb21wb25lbnQgaW5mb3JtYXRpb24gKGN1cnJlbnQgdGlsZSkKK0BwYXJhbSBudW1yZXMgTnVtYmVyIG9mIHJlc29sdXRpb24gbGV2ZWxzIHRvIGRlY29kZQorKi8KK09QSl9CT09MIG9wal9kd3RfZGVjb2RlKG9wal90Y2RfdGlsZWNvbXBfdCogdGlsZWMsIE9QSl9VSU5UMzIgbnVtcmVzKTsKKworLyoqCitHZXQgdGhlIGdhaW4gb2YgYSBzdWJiYW5kIGZvciB0aGUgcmV2ZXJzaWJsZSA1LTMgRFdULgorQHBhcmFtIG9yaWVudCBOdW1iZXIgdGhhdCBpZGVudGlmaWVzIHRoZSBzdWJiYW5kICgwLT5MTCwgMS0+SEwsIDItPkxILCAzLT5ISCkKK0ByZXR1cm4gUmV0dXJucyAwIGlmIG9yaWVudCA9IDAsIHJldHVybnMgMSBpZiBvcmllbnQgPSAxIG9yIDIsIHJldHVybnMgMiBvdGhlcndpc2UKKyovCitPUEpfVUlOVDMyIG9wal9kd3RfZ2V0Z2FpbihPUEpfVUlOVDMyIG9yaWVudCkgOworLyoqCitHZXQgdGhlIG5vcm0gb2YgYSB3YXZlbGV0IGZ1bmN0aW9uIG9mIGEgc3ViYmFuZCBhdCBhIHNwZWNpZmllZCBsZXZlbCBmb3IgdGhlIHJldmVyc2libGUgNS0zIERXVC4KK0BwYXJhbSBsZXZlbCBMZXZlbCBvZiB0aGUgd2F2ZWxldCBmdW5jdGlvbgorQHBhcmFtIG9yaWVudCBCYW5kIG9mIHRoZSB3YXZlbGV0IGZ1bmN0aW9uCitAcmV0dXJuIFJldHVybnMgdGhlIG5vcm0gb2YgdGhlIHdhdmVsZXQgZnVuY3Rpb24KKyovCitPUEpfRkxPQVQ2NCBvcGpfZHd0X2dldG5vcm0oT1BKX1VJTlQzMiBsZXZlbCwgT1BKX1VJTlQzMiBvcmllbnQpOworLyoqCitGb3J3YXJkIDktNyB3YXZlbGV0IHRyYW5zZm9ybSBpbiAyLUQuIAorQXBwbHkgYW4gaXJyZXZlcnNpYmxlIERXVCB0cmFuc2Zvcm0gdG8gYSBjb21wb25lbnQgb2YgYW4gaW1hZ2UuCitAcGFyYW0gdGlsZWMgVGlsZSBjb21wb25lbnQgaW5mb3JtYXRpb24gKGN1cnJlbnQgdGlsZSkKKyovCitPUEpfQk9PTCBvcGpfZHd0X2VuY29kZV9yZWFsKG9wal90Y2RfdGlsZWNvbXBfdCAqIHRpbGVjKTsKKy8qKgorSW52ZXJzZSA5LTcgd2F2ZWxldCB0cmFuc2Zvcm0gaW4gMi1ELiAKK0FwcGx5IGFuIGlycmV2ZXJzaWJsZSBpbnZlcnNlIERXVCB0cmFuc2Zvcm0gdG8gYSBjb21wb25lbnQgb2YgYW4gaW1hZ2UuCitAcGFyYW0gdGlsZWMgVGlsZSBjb21wb25lbnQgaW5mb3JtYXRpb24gKGN1cnJlbnQgdGlsZSkKK0BwYXJhbSBudW1yZXMgTnVtYmVyIG9mIHJlc29sdXRpb24gbGV2ZWxzIHRvIGRlY29kZQorKi8KK09QSl9CT09MIG9wal9kd3RfZGVjb2RlX3JlYWwob3BqX3RjZF90aWxlY29tcF90KiByZXN0cmljdCB0aWxlYywgT1BKX1VJTlQzMiBudW1yZXMpOworCisvKioKK0dldCB0aGUgZ2FpbiBvZiBhIHN1YmJhbmQgZm9yIHRoZSBpcnJldmVyc2libGUgOS03IERXVC4KK0BwYXJhbSBvcmllbnQgTnVtYmVyIHRoYXQgaWRlbnRpZmllcyB0aGUgc3ViYmFuZCAoMC0+TEwsIDEtPkhMLCAyLT5MSCwgMy0+SEgpCitAcmV0dXJuIFJldHVybnMgdGhlIGdhaW4gb2YgdGhlIDktNyB3YXZlbGV0IHRyYW5zZm9ybQorKi8KK09QSl9VSU5UMzIgb3BqX2R3dF9nZXRnYWluX3JlYWwoT1BKX1VJTlQzMiBvcmllbnQpOworLyoqCitHZXQgdGhlIG5vcm0gb2YgYSB3YXZlbGV0IGZ1bmN0aW9uIG9mIGEgc3ViYmFuZCBhdCBhIHNwZWNpZmllZCBsZXZlbCBmb3IgdGhlIGlycmV2ZXJzaWJsZSA5LTcgRFdUCitAcGFyYW0gbGV2ZWwgTGV2ZWwgb2YgdGhlIHdhdmVsZXQgZnVuY3Rpb24KK0BwYXJhbSBvcmllbnQgQmFuZCBvZiB0aGUgd2F2ZWxldCBmdW5jdGlvbgorQHJldHVybiBSZXR1cm5zIHRoZSBub3JtIG9mIHRoZSA5LTcgd2F2ZWxldAorKi8KK09QSl9GTE9BVDY0IG9wal9kd3RfZ2V0bm9ybV9yZWFsKE9QSl9VSU5UMzIgbGV2ZWwsIE9QSl9VSU5UMzIgb3JpZW50KTsKKy8qKgorRXhwbGljaXQgY2FsY3VsYXRpb24gb2YgdGhlIFF1YW50aXphdGlvbiBTdGVwc2l6ZXMgCitAcGFyYW0gdGNjcCBUaWxlLWNvbXBvbmVudCBjb2RpbmcgcGFyYW1ldGVycworQHBhcmFtIHByZWMgUHJlY2ludCBhbmFseXplZAorKi8KK3ZvaWQgb3BqX2R3dF9jYWxjX2V4cGxpY2l0X3N0ZXBzaXplcyhvcGpfdGNjcF90ICogdGNjcCwgT1BKX1VJTlQzMiBwcmVjKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKkB9Ki8KKworLypAfSovCisKKyNlbmRpZiAvKiBfX0RXVF9IICovCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvZXZlbnQuYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvZXZlbnQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL2V2ZW50LmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvZXZlbnQuYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9ldmVudC5oIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9ldmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhODYwNGUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2V2ZW50LmgKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKKyAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKKyAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKKyAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMS0yMDEyLCBDZW50cmUgTmF0aW9uYWwgZCdFdHVkZXMgU3BhdGlhbGVzIChDTkVTKSwgRlIgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENTIFN5c3RlbWVzIGQnSW5mb3JtYXRpb24sIEZyYW5jZQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBfX0VWRU5UX0gKKyNkZWZpbmUgX19FVkVOVF9ICisvKioKK0BmaWxlIGV2ZW50LmgKK0BicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBhIGV2ZW50IGNhbGxiYWNrIHN5c3RlbQorCitUaGUgZnVuY3Rpb25zIGluIEVWRU5ULkMgaGF2ZSBmb3IgZ29hbCB0byBzZW5kIG91dHB1dCBtZXNzYWdlcyAoZXJyb3JzLCB3YXJuaW5ncywgZGVidWcpIHRvIHRoZSB1c2VyLgorKi8KKy8qKgorTWVzc2FnZSBoYW5kbGVyIG9iamVjdAordXNlZCBmb3IgCis8dWw+Cis8bGk+RXJyb3IgbWVzc2FnZXMKKzxsaT5XYXJuaW5nIG1lc3NhZ2VzCis8bGk+RGVidWdnaW5nIG1lc3NhZ2VzCis8L3VsPgorKi8KK3R5cGVkZWYgc3RydWN0IG9wal9ldmVudF9tZ3IgCit7CisJLyoqIERhdGEgdG8gY2FsbCB0aGUgZXZlbnQgbWFuYWdlciB1cG9uICovCisJdm9pZCAqCQkJbV9lcnJvcl9kYXRhOworCS8qKiBEYXRhIHRvIGNhbGwgdGhlIGV2ZW50IG1hbmFnZXIgdXBvbiAqLworCXZvaWQgKgkJCW1fd2FybmluZ19kYXRhOworCS8qKiBEYXRhIHRvIGNhbGwgdGhlIGV2ZW50IG1hbmFnZXIgdXBvbiAqLworCXZvaWQgKgkJCW1faW5mb19kYXRhOworCS8qKiBFcnJvciBtZXNzYWdlIGNhbGxiYWNrIGlmIGF2YWlsYWJsZSwgTlVMTCBvdGhlcndpc2UgKi8KKwlvcGpfbXNnX2NhbGxiYWNrIGVycm9yX2hhbmRsZXI7CisJLyoqIFdhcm5pbmcgbWVzc2FnZSBjYWxsYmFjayBpZiBhdmFpbGFibGUsIE5VTEwgb3RoZXJ3aXNlICovCisJb3BqX21zZ19jYWxsYmFjayB3YXJuaW5nX2hhbmRsZXI7CisJLyoqIERlYnVnIG1lc3NhZ2UgY2FsbGJhY2sgaWYgYXZhaWxhYmxlLCBOVUxMIG90aGVyd2lzZSAqLworCW9wal9tc2dfY2FsbGJhY2sgaW5mb19oYW5kbGVyOworfSBvcGpfZXZlbnRfbWdyX3Q7CisKKworI2RlZmluZSBFVlRfRVJST1IJMQkvKio8IEVycm9yIGV2ZW50IHR5cGUgKi8KKyNkZWZpbmUgRVZUX1dBUk5JTkcJMgkvKio8IFdhcm5pbmcgZXZlbnQgdHlwZSAqLworI2RlZmluZSBFVlRfSU5GTwk0CS8qKjwgRGVidWcgZXZlbnQgdHlwZSAqLworCisvKiogQGRlZmdyb3VwIEVWRU5UIEVWRU5UIC0gSW1wbGVtZW50YXRpb24gb2YgYSBldmVudCBjYWxsYmFjayBzeXN0ZW0gKi8KKy8qQHsqLworCisvKiogQG5hbWUgRXhwb3J0ZWQgZnVuY3Rpb25zIChzZWUgYWxzbyBvcGVuanBlZy5oKSAqLworLypAeyovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogV3JpdGUgZm9ybWF0dGVkIGRhdGEgdG8gYSBzdHJpbmcgYW5kIHNlbmQgdGhlIHN0cmluZyB0byBhIHVzZXIgY2FsbGJhY2suCisgKgorICogQHBhcmFtIGV2ZW50X21ncgkJCUV2ZW50IGhhbmRsZXIKKyAqIEBwYXJhbSBldmVudF90eXBlIAkJRXZlbnQgdHlwZSBvciBjYWxsYmFjayB0byB1c2UgdG8gc2VuZCB0aGUgbWVzc2FnZQorICogQHBhcmFtIGZtdCAJCQkJRm9ybWF0LWNvbnRyb2wgc3RyaW5nIChwbHVzIG9wdGlvbmFsIGFyZ3VtZW50cykKKyAqCisgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIGZhbHNlIG90aGVyd2lzZQorICovCitPUEpfQk9PTCBvcGpfZXZlbnRfbXNnKG9wal9ldmVudF9tZ3JfdCogZXZlbnRfbWdyLCBPUEpfSU5UMzIgZXZlbnRfdHlwZSwgY29uc3QgY2hhciAqZm10LCAuLi4pOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBTZXQgdGhlIGV2ZW50IG1hbmFnZXIgd2l0aCB0aGUgZGVmYXVsdCBjYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhlIDMgbGV2ZWxzLgorICovCit2b2lkIG9wal9zZXRfZGVmYXVsdF9ldmVudF9oYW5kbGVyKG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CisKKy8qCisjaWZkZWYgX19HTlVDX18KKyNwcmFnbWEgR0NDIHBvaXNvbiBwcmludGYgZnByaW50ZgorI2VuZGlmCisqLworCisvKkB9Ki8KKworLypAfSovCisKKyNlbmRpZiAvKiBfX0VWRU5UX0ggKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvZnVuY3Rpb25fbGlzdC5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9mdW5jdGlvbl9saXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdlYTExZAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvZnVuY3Rpb25fbGlzdC5jCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCisgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCBKZXJvbWUgRmltZXMsIENvbW11bmljYXRpb25zICYgU3lzdGVtZXMgPGplcm9tZS5maW1lc0BjLXMuZnI+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJvcGpfaW5jbHVkZXMuaCIKKworLyoqCisgKiBEZWZhdWx0IHNpemUgb2YgdGhlIHZhbGlkYXRpb24gbGlzdCwgaWYgbm90IHN1ZmZpY2llbnQsIGRhdGEgd2lsbCBiZSByZWFsbG9jYXRlZCB3aXRoIGEgZG91YmxlIHNpemUuCisgKi8KKyNkZWZpbmUgT1BKX1ZBTElEQVRJT05fU0laRSAxMAorCitvcGpfcHJvY2VkdXJlX2xpc3RfdCAqICBvcGpfcHJvY2VkdXJlX2xpc3RfY3JlYXRlKCkKK3sKKyAgICAgICAgLyogbWVtb3J5IGFsbG9jYXRpb24gKi8KKyAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X3QgKiBsX3ZhbGlkYXRpb24gPSAob3BqX3Byb2NlZHVyZV9saXN0X3QgKikgb3BqX2NhbGxvYygxLHNpemVvZihvcGpfcHJvY2VkdXJlX2xpc3RfdCkpOworICAgICAgICBpZiAoISBsX3ZhbGlkYXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDA7CisgICAgICAgIH0KKyAgICAgICAgLyogaW5pdGlhbGl6YXRpb24gKi8KKyAgICAgICAgbF92YWxpZGF0aW9uLT5tX25iX21heF9wcm9jZWR1cmVzID0gT1BKX1ZBTElEQVRJT05fU0laRTsKKyAgICAgICAgbF92YWxpZGF0aW9uLT5tX3Byb2NlZHVyZXMgPSAob3BqX3Byb2NlZHVyZSopb3BqX2NhbGxvYyhPUEpfVkFMSURBVElPTl9TSVpFLCBzaXplb2Yob3BqX3Byb2NlZHVyZSkpOworICAgICAgICBpZiAoISBsX3ZhbGlkYXRpb24tPm1fcHJvY2VkdXJlcykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfdmFsaWRhdGlvbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsX3ZhbGlkYXRpb247Cit9CisKK3ZvaWQgIG9wal9wcm9jZWR1cmVfbGlzdF9kZXN0cm95KG9wal9wcm9jZWR1cmVfbGlzdF90ICogcF9saXN0KQoreworICAgICAgICBpZiAoISBwX2xpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLyogaW5pdGlhbGl6YXRpb24gKi8KKyAgICAgICAgaWYgKHBfbGlzdC0+bV9wcm9jZWR1cmVzKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9saXN0LT5tX3Byb2NlZHVyZXMpOworICAgICAgICB9CisgICAgICAgIG9wal9mcmVlKHBfbGlzdCk7Cit9CisKK09QSl9CT09MIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlIChvcGpfcHJvY2VkdXJlX2xpc3RfdCAqIHBfdmFsaWRhdGlvbl9saXN0LCBvcGpfcHJvY2VkdXJlIHBfcHJvY2VkdXJlLCBvcGpfZXZlbnRfbWdyX3QqIHBfbWFuYWdlciApCit7CisJCisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gTlVMTCk7CisJCisgICAgICAgIGlmIChwX3ZhbGlkYXRpb25fbGlzdC0+bV9uYl9tYXhfcHJvY2VkdXJlcyA9PSBwX3ZhbGlkYXRpb25fbGlzdC0+bV9uYl9wcm9jZWR1cmVzKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgb3BqX3Byb2NlZHVyZSAqIG5ld19wcm9jZWR1cmVzOworCisgICAgICAgICAgICAgICAgcF92YWxpZGF0aW9uX2xpc3QtPm1fbmJfbWF4X3Byb2NlZHVyZXMgKz0gT1BKX1ZBTElEQVRJT05fU0laRTsKKyAgICAgICAgICAgICAgICBuZXdfcHJvY2VkdXJlcyA9IChvcGpfcHJvY2VkdXJlKilvcGpfcmVhbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfdmFsaWRhdGlvbl9saXN0LT5tX3Byb2NlZHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBwX3ZhbGlkYXRpb25fbGlzdC0+bV9uYl9tYXhfcHJvY2VkdXJlcyAqIHNpemVvZihvcGpfcHJvY2VkdXJlKSk7CisgICAgICAgICAgICAgICAgaWYgKCEgbmV3X3Byb2NlZHVyZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF92YWxpZGF0aW9uX2xpc3QtPm1fcHJvY2VkdXJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBwX3ZhbGlkYXRpb25fbGlzdC0+bV9uYl9tYXhfcHJvY2VkdXJlcyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBwX3ZhbGlkYXRpb25fbGlzdC0+bV9uYl9wcm9jZWR1cmVzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhZGQgYSBuZXcgdmFsaWRhdGlvbiBwcm9jZWR1cmVcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfdmFsaWRhdGlvbl9saXN0LT5tX3Byb2NlZHVyZXMgPSBuZXdfcHJvY2VkdXJlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcF92YWxpZGF0aW9uX2xpc3QtPm1fcHJvY2VkdXJlc1twX3ZhbGlkYXRpb25fbGlzdC0+bV9uYl9wcm9jZWR1cmVzXSA9IHBfcHJvY2VkdXJlOworICAgICAgICArK3BfdmFsaWRhdGlvbl9saXN0LT5tX25iX3Byb2NlZHVyZXM7CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitPUEpfVUlOVDMyIG9wal9wcm9jZWR1cmVfbGlzdF9nZXRfbmJfcHJvY2VkdXJlcyAob3BqX3Byb2NlZHVyZV9saXN0X3QgKiBwX3ZhbGlkYXRpb25fbGlzdCkKK3sKKyAgICAgICAgcmV0dXJuIHBfdmFsaWRhdGlvbl9saXN0LT5tX25iX3Byb2NlZHVyZXM7Cit9CisKK29wal9wcm9jZWR1cmUqIG9wal9wcm9jZWR1cmVfbGlzdF9nZXRfZmlyc3RfcHJvY2VkdXJlIChvcGpfcHJvY2VkdXJlX2xpc3RfdCAqIHBfdmFsaWRhdGlvbl9saXN0KQoreworICAgICAgICByZXR1cm4gcF92YWxpZGF0aW9uX2xpc3QtPm1fcHJvY2VkdXJlczsKK30KKwordm9pZCBvcGpfcHJvY2VkdXJlX2xpc3RfY2xlYXIgKG9wal9wcm9jZWR1cmVfbGlzdF90ICogcF92YWxpZGF0aW9uX2xpc3QpCit7CisgICAgICAgIHBfdmFsaWRhdGlvbl9saXN0LT5tX25iX3Byb2NlZHVyZXMgPSAwOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9mdW5jdGlvbl9saXN0LmggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2Z1bmN0aW9uX2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjA5MWI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9mdW5jdGlvbl9saXN0LmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKKyAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKKyAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKKyAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIEplcm9tZSBGaW1lcywgQ29tbXVuaWNhdGlvbnMgJiBTeXN0ZW1lcyA8amVyb21lLmZpbWVzQGMtcy5mcj4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgQVMgSVMnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfX0ZVTkNUSU9OX0xJU1RfSAorI2RlZmluZSBfX0ZVTkNUSU9OX0xJU1RfSAorCisvKiogCisgKiBAZmlsZSBmdW5jdGlvbl9saXN0LmgKKyAqIEBicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBhIGxpc3Qgb2YgcHJvY2VkdXJlcy4KKworICogVGhlIGZ1bmN0aW9ucyBpbiB2YWxpZGF0aW9uLmMgYWltcyB0byBoYXZlIGFjY2VzcyB0byBhIGxpc3Qgb2YgcHJvY2VkdXJlcy4KKyovCisKKy8qKiBAZGVmZ3JvdXAgVkFMIFZBTCAtIHZhbGlkYXRpb24gcHJvY2VkdXJlKi8KKy8qQHsqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBGT1JXQVJEIERFQ0xBUkFUSU9OICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIGRlY2xhcmUgYSBmdW5jdGlvbiBwb2ludGVyCisgKi8KK3R5cGVkZWYgdm9pZCAoKm9wal9wcm9jZWR1cmUpKHZvaWQpOworCisvKioKKyAqIEEgbGlzdCBvZiBwcm9jZWR1cmVzLgorKi8KK3R5cGVkZWYgc3RydWN0IG9wal9wcm9jZWR1cmVfbGlzdCAKK3sKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHZhbGlkYXRpb24gcHJvY2VkdXJlcy4KKwkgKi8KKwlPUEpfVUlOVDMyIG1fbmJfcHJvY2VkdXJlczsKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHRoZSBhcnJheSBvZiB2YWxpZGF0aW9uIHByb2NlZHVyZXMuCisJICovCisJT1BKX1VJTlQzMiBtX25iX21heF9wcm9jZWR1cmVzOworCS8qKgorCSAqIFRoZSBhcnJheSBvZiBwcm9jZWR1cmVzLgorCSAqLworCW9wal9wcm9jZWR1cmUgKiBtX3Byb2NlZHVyZXM7CisKK30gb3BqX3Byb2NlZHVyZV9saXN0X3Q7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogQ3JlYXRlcyBhIHZhbGlkYXRpb24gbGlzdC4KKyAqCisgKiBAcmV0dXJuCXRoZSBuZXdseSBjcmVhdGVkIHZhbGlkYXRpb24gbGlzdC4KKyAqLworb3BqX3Byb2NlZHVyZV9saXN0X3QgKiAgb3BqX3Byb2NlZHVyZV9saXN0X2NyZWF0ZSh2b2lkKTsKKworLyoqCisgKiBEZXN0cm95cyBhIHZhbGlkYXRpb24gbGlzdC4KKyAqCisgKiBAcGFyYW0gcF9saXN0IHRoZSBsaXN0IHRvIGRlc3Ryb3kuCisgKi8KK3ZvaWQgIG9wal9wcm9jZWR1cmVfbGlzdF9kZXN0cm95KG9wal9wcm9jZWR1cmVfbGlzdF90ICogcF9saXN0KTsKKworLyoqCisgKiBBZGRzIGEgbmV3IHZhbGlkYXRpb24gcHJvY2VkdXJlLgorICoKKyAqIEBwYXJhbQlwX3ZhbGlkYXRpb25fbGlzdCB0aGUgbGlzdCBvZiBwcm9jZWR1cmUgdG8gbW9kaWZ5LgorICogQHBhcmFtCXBfcHJvY2VkdXJlCQl0aGUgcHJvY2VkdXJlIHRvIGFkZC4KKyAqCisgKiBAcmV0dXJuCU9QSl9UUlVFIGlmIHRoZSBwcm9jZWR1cmUgY291bGQgYmUgYWRkZWQuCisgKi8KK09QSl9CT09MIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlIChvcGpfcHJvY2VkdXJlX2xpc3RfdCAqIHBfdmFsaWRhdGlvbl9saXN0LCBvcGpfcHJvY2VkdXJlIHBfcHJvY2VkdXJlLCBvcGpfZXZlbnRfbWdyX3QqIHBfbWFuYWdlcik7CisKKy8qKgorICogR2V0cyB0aGUgbnVtYmVyIG9mIHZhbGlkYXRpb24gcHJvY2VkdXJlcy4KKyAqCisgKiBAcGFyYW0JcF92YWxpZGF0aW9uX2xpc3QgdGhlIGxpc3Qgb2YgcHJvY2VkdXJlIHRvIG1vZGlmeS4KKyAqCisgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgdmFsaWRhdGlvbiBwcm9jZWR1cmVzLgorICovCitPUEpfVUlOVDMyIG9wal9wcm9jZWR1cmVfbGlzdF9nZXRfbmJfcHJvY2VkdXJlcyAob3BqX3Byb2NlZHVyZV9saXN0X3QgKiBwX3ZhbGlkYXRpb25fbGlzdCk7CisKKy8qKgorICogR2V0cyB0aGUgcG9pbnRlciBvbiB0aGUgZmlyc3QgdmFsaWRhdGlvbiBwcm9jZWR1cmUuIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byB0aGUgQysrCisgKiBpdGVyYXRvciBjbGFzcyB0byBpdGVyYXRlIHRocm91Z2ggYWxsIHRoZSBwcm9jZWR1cmVzIGluc2lkZSB0aGUgdmFsaWRhdGlvbiBsaXN0LgorICogdGhlIGNhbGxlciBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB0aGUgcG9pbnRlci4KKyAqCisgKiBAcGFyYW0JcF92YWxpZGF0aW9uX2xpc3QgdGhlIGxpc3Qgb2YgcHJvY2VkdXJlIHRvIGdldCB0aGUgZmlyc3QgcHJvY2VkdXJlIGZyb20uCisgKgorICogQHJldHVybglhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IHByb2NlZHVyZS4KKyAqLworb3BqX3Byb2NlZHVyZSogb3BqX3Byb2NlZHVyZV9saXN0X2dldF9maXJzdF9wcm9jZWR1cmUgKG9wal9wcm9jZWR1cmVfbGlzdF90ICogcF92YWxpZGF0aW9uX2xpc3QpOworCisKKy8qKgorICogQ2xlYXJzIHRoZSBsaXN0IG9mIHZhbGlkYXRpb24gcHJvY2VkdXJlcy4KKyAqCisgKiBAcGFyYW0JcF92YWxpZGF0aW9uX2xpc3QgdGhlIGxpc3Qgb2YgcHJvY2VkdXJlIHRvIGNsZWFyLgorICoKKyAqLwordm9pZCBvcGpfcHJvY2VkdXJlX2xpc3RfY2xlYXIgKG9wal9wcm9jZWR1cmVfbGlzdF90ICogcF92YWxpZGF0aW9uX2xpc3QpOworLypAfSovCisKKyNlbmRpZiAvKiBfX0ZVTkNUSU9OX0xJU1RfSCAqLworCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2ltYWdlLmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2ltYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM0NjJmMAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvaW1hZ2UuYwpAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzIAorICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIAorICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cworICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAib3BqX2luY2x1ZGVzLmgiCisKK29wal9pbWFnZV90KiBvcGpfaW1hZ2VfY3JlYXRlMCh2b2lkKSB7CisJb3BqX2ltYWdlX3QgKmltYWdlID0gKG9wal9pbWFnZV90KilvcGpfY2FsbG9jKDEsIHNpemVvZihvcGpfaW1hZ2VfdCkpOworCXJldHVybiBpbWFnZTsKK30KKworb3BqX2ltYWdlX3QqIE9QSl9DQUxMQ09OViBvcGpfaW1hZ2VfY3JlYXRlKE9QSl9VSU5UMzIgbnVtY21wdHMsIG9wal9pbWFnZV9jbXB0cGFybV90ICpjbXB0cGFybXMsIE9QSl9DT0xPUl9TUEFDRSBjbHJzcGMpIHsKKwlPUEpfVUlOVDMyIGNvbXBubzsKKwlvcGpfaW1hZ2VfdCAqaW1hZ2UgPSBOVUxMOworCisJaW1hZ2UgPSAob3BqX2ltYWdlX3QqKSBvcGpfY2FsbG9jKDEsIHNpemVvZihvcGpfaW1hZ2VfdCkpOworCWlmKGltYWdlKSB7CisJCWltYWdlLT5jb2xvcl9zcGFjZSA9IGNscnNwYzsKKwkJaW1hZ2UtPm51bWNvbXBzID0gbnVtY21wdHM7CisJCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHBlci1jb21wb25lbnQgaW5mb3JtYXRpb24gKi8KKwkJaW1hZ2UtPmNvbXBzID0gKG9wal9pbWFnZV9jb21wX3QqKW9wal9jYWxsb2MoMSxpbWFnZS0+bnVtY29tcHMgKiBzaXplb2Yob3BqX2ltYWdlX2NvbXBfdCkpOworCQlpZighaW1hZ2UtPmNvbXBzKSB7CisJCQkvKiBUT0RPIHJlcGxhY2Ugd2l0aCBldmVudCBtYW5hZ2VyLCBicmVha3MgQVBJICovCisJCQkvKiBmcHJpbnRmKHN0ZGVyciwiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgaW1hZ2UuXG4iKTsgKi8KKwkJCW9wal9pbWFnZV9kZXN0cm95KGltYWdlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCS8qIGNyZWF0ZSB0aGUgaW5kaXZpZHVhbCBpbWFnZSBjb21wb25lbnRzICovCisJCWZvcihjb21wbm8gPSAwOyBjb21wbm8gPCBudW1jbXB0czsgY29tcG5vKyspIHsKKwkJCW9wal9pbWFnZV9jb21wX3QgKmNvbXAgPSAmaW1hZ2UtPmNvbXBzW2NvbXBub107CisJCQljb21wLT5keCA9IGNtcHRwYXJtc1tjb21wbm9dLmR4OworCQkJY29tcC0+ZHkgPSBjbXB0cGFybXNbY29tcG5vXS5keTsKKwkJCWNvbXAtPncgPSBjbXB0cGFybXNbY29tcG5vXS53OworCQkJY29tcC0+aCA9IGNtcHRwYXJtc1tjb21wbm9dLmg7CisJCQljb21wLT54MCA9IGNtcHRwYXJtc1tjb21wbm9dLngwOworCQkJY29tcC0+eTAgPSBjbXB0cGFybXNbY29tcG5vXS55MDsKKwkJCWNvbXAtPnByZWMgPSBjbXB0cGFybXNbY29tcG5vXS5wcmVjOworCQkJY29tcC0+YnBwID0gY21wdHBhcm1zW2NvbXBub10uYnBwOworCQkJY29tcC0+c2duZCA9IGNtcHRwYXJtc1tjb21wbm9dLnNnbmQ7CisJCQljb21wLT5kYXRhID0gKE9QSl9JTlQzMiopIG9wal9jYWxsb2MoY29tcC0+dyAqIGNvbXAtPmgsIHNpemVvZihPUEpfSU5UMzIpKTsKKwkJCWlmKCFjb21wLT5kYXRhKSB7CisJCQkJLyogVE9ETyByZXBsYWNlIHdpdGggZXZlbnQgbWFuYWdlciwgYnJlYWtzIEFQSSAqLworCQkJCS8qIGZwcmludGYoc3RkZXJyLCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBpbWFnZS5cbiIpOyAqLworCQkJCW9wal9pbWFnZV9kZXN0cm95KGltYWdlKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBpbWFnZTsKK30KKwordm9pZCBPUEpfQ0FMTENPTlYgb3BqX2ltYWdlX2Rlc3Ryb3kob3BqX2ltYWdlX3QgKmltYWdlKSB7CisJaWYoaW1hZ2UpIHsKKwkJaWYoaW1hZ2UtPmNvbXBzKSB7CisJCQlPUEpfVUlOVDMyIGNvbXBubzsKKworCQkJLyogaW1hZ2UgY29tcG9uZW50cyAqLworCQkJZm9yKGNvbXBubyA9IDA7IGNvbXBubyA8IGltYWdlLT5udW1jb21wczsgY29tcG5vKyspIHsKKwkJCQlvcGpfaW1hZ2VfY29tcF90ICppbWFnZV9jb21wID0gJihpbWFnZS0+Y29tcHNbY29tcG5vXSk7CisJCQkJaWYoaW1hZ2VfY29tcC0+ZGF0YSkgeworCQkJCQlvcGpfZnJlZShpbWFnZV9jb21wLT5kYXRhKTsKKwkJCQl9CisJCQl9CisJCQlvcGpfZnJlZShpbWFnZS0+Y29tcHMpOworCQl9CisKKwkJaWYoaW1hZ2UtPmljY19wcm9maWxlX2J1ZikgeworCQkJb3BqX2ZyZWUoaW1hZ2UtPmljY19wcm9maWxlX2J1Zik7CisJCX0KKworCQlvcGpfZnJlZShpbWFnZSk7CisJfQorfQorCisvKioKKyAqIFVwZGF0ZXMgdGhlIGNvbXBvbmVudHMgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBpbWFnZSBmcm9tIHRoZSBjb2RpbmcgcGFyYW1ldGVycy4KKyAqCisgKiBAcGFyYW0gcF9pbWFnZV9oZWFkZXIJdGhlIGltYWdlIGhlYWRlciB0byB1cGRhdGUuCisgKiBAcGFyYW0gcF9jcAkJCQl0aGUgY29kaW5nIHBhcmFtZXRlcnMgZnJvbSB3aGljaCB0byB1cGRhdGUgdGhlIGltYWdlLgorICovCit2b2lkIG9wal9pbWFnZV9jb21wX2hlYWRlcl91cGRhdGUob3BqX2ltYWdlX3QgKiBwX2ltYWdlX2hlYWRlciwgY29uc3Qgc3RydWN0IG9wal9jcCAqIHBfY3ApCit7CisJT1BKX1VJTlQzMiBpLCBsX3dpZHRoLCBsX2hlaWdodDsKKwlPUEpfVUlOVDMyIGxfeDAsIGxfeTAsIGxfeDEsIGxfeTE7CisJT1BKX1VJTlQzMiBsX2NvbXBfeDAsIGxfY29tcF95MCwgbF9jb21wX3gxLCBsX2NvbXBfeTE7CisJb3BqX2ltYWdlX2NvbXBfdCogbF9pbWdfY29tcCA9IE5VTEw7CisKKwlsX3gwID0gb3BqX3VpbnRfbWF4KHBfY3AtPnR4MCAsIHBfaW1hZ2VfaGVhZGVyLT54MCk7CisJbF95MCA9IG9wal91aW50X21heChwX2NwLT50eTAgLCBwX2ltYWdlX2hlYWRlci0+eTApOworCWxfeDEgPSBwX2NwLT50eDAgKyAocF9jcC0+dHcgLSAxVSkgKiBwX2NwLT50ZHg7IC8qIHZhbGlkaXR5IG9mIHBfY3AgbWVtYmVycyB1c2VkIGhlcmUgY2hlY2tlZCBpbiBvcGpfajJrX3JlYWRfc2l6LiBDYW4ndCBvdmVyZmxvdy4gKi8KKwlsX3kxID0gcF9jcC0+dHkwICsgKHBfY3AtPnRoIC0gMVUpICogcF9jcC0+dGR5OyAvKiBjYW4ndCBvdmVyZmxvdyAqLworCWxfeDEgPSBvcGpfdWludF9taW4ob3BqX3VpbnRfYWRkcyhsX3gxLCBwX2NwLT50ZHgpLCBwX2ltYWdlX2hlYWRlci0+eDEpOyAvKiB1c2UgYWRkIHNhdHVyYXRlZCB0byBwcmV2ZW50IG92ZXJmbG93ICovCisJbF95MSA9IG9wal91aW50X21pbihvcGpfdWludF9hZGRzKGxfeTEsIHBfY3AtPnRkeSksIHBfaW1hZ2VfaGVhZGVyLT55MSk7IC8qIHVzZSBhZGQgc2F0dXJhdGVkIHRvIHByZXZlbnQgb3ZlcmZsb3cgKi8KKworCWxfaW1nX2NvbXAgPSBwX2ltYWdlX2hlYWRlci0+Y29tcHM7CisJZm9yCShpID0gMDsgaSA8IHBfaW1hZ2VfaGVhZGVyLT5udW1jb21wczsgKytpKSB7CisJCWxfY29tcF94MCA9IG9wal91aW50X2NlaWxkaXYobF94MCwgbF9pbWdfY29tcC0+ZHgpOworCQlsX2NvbXBfeTAgPSBvcGpfdWludF9jZWlsZGl2KGxfeTAsIGxfaW1nX2NvbXAtPmR5KTsKKwkJbF9jb21wX3gxID0gb3BqX3VpbnRfY2VpbGRpdihsX3gxLCBsX2ltZ19jb21wLT5keCk7CisJCWxfY29tcF95MSA9IG9wal91aW50X2NlaWxkaXYobF95MSwgbF9pbWdfY29tcC0+ZHkpOworCQlsX3dpZHRoICAgPSBvcGpfdWludF9jZWlsZGl2cG93MihsX2NvbXBfeDEgLSBsX2NvbXBfeDAsIGxfaW1nX2NvbXAtPmZhY3Rvcik7CisJCWxfaGVpZ2h0ICA9IG9wal91aW50X2NlaWxkaXZwb3cyKGxfY29tcF95MSAtIGxfY29tcF95MCwgbF9pbWdfY29tcC0+ZmFjdG9yKTsKKwkJbF9pbWdfY29tcC0+dyA9IGxfd2lkdGg7CisJCWxfaW1nX2NvbXAtPmggPSBsX2hlaWdodDsKKwkJbF9pbWdfY29tcC0+eDAgPSBsX2NvbXBfeDA7CisJCWxfaW1nX2NvbXAtPnkwID0gbF9jb21wX3kwOworCQkrK2xfaW1nX2NvbXA7CisJfQorfQorCisKKy8qKgorICogQ29weSBvbmx5IGhlYWRlciBvZiBpbWFnZSBhbmQgaXRzIGNvbXBvbmVudCBoZWFkZXIgKG5vIGRhdGEgYXJlIGNvcGllZCkKKyAqIGlmIGRlc3QgaW1hZ2UgaGF2ZSBkYXRhLCB0aGV5IHdpbGwgYmUgZnJlZWQKKyAqCisgKiBAcGFyYW0JcF9pbWFnZV9zcmMJCXRoZSBzcmMgaW1hZ2UKKyAqIEBwYXJhbQlwX2ltYWdlX2Rlc3QJdGhlIGRlc3QgaW1hZ2UKKyAqCisgKi8KK3ZvaWQgb3BqX2NvcHlfaW1hZ2VfaGVhZGVyKGNvbnN0IG9wal9pbWFnZV90KiBwX2ltYWdlX3NyYywgb3BqX2ltYWdlX3QqIHBfaW1hZ2VfZGVzdCkKK3sKKwlPUEpfVUlOVDMyIGNvbXBubzsKKworCS8qIHByZWNvbmRpdGlvbnMgKi8KKwlhc3NlcnQocF9pbWFnZV9zcmMgIT0gMDApOworCWFzc2VydChwX2ltYWdlX2Rlc3QgIT0gMDApOworCisJcF9pbWFnZV9kZXN0LT54MCA9IHBfaW1hZ2Vfc3JjLT54MDsKKwlwX2ltYWdlX2Rlc3QtPnkwID0gcF9pbWFnZV9zcmMtPnkwOworCXBfaW1hZ2VfZGVzdC0+eDEgPSBwX2ltYWdlX3NyYy0+eDE7CisJcF9pbWFnZV9kZXN0LT55MSA9IHBfaW1hZ2Vfc3JjLT55MTsKKworCWlmIChwX2ltYWdlX2Rlc3QtPmNvbXBzKXsKKwkJZm9yKGNvbXBubyA9IDA7IGNvbXBubyA8IHBfaW1hZ2VfZGVzdC0+bnVtY29tcHM7IGNvbXBubysrKSB7CisJCQlvcGpfaW1hZ2VfY29tcF90ICppbWFnZV9jb21wID0gJihwX2ltYWdlX2Rlc3QtPmNvbXBzW2NvbXBub10pOworCQkJaWYoaW1hZ2VfY29tcC0+ZGF0YSkgeworCQkJCW9wal9mcmVlKGltYWdlX2NvbXAtPmRhdGEpOworCQkJfQorCQl9CisJCW9wal9mcmVlKHBfaW1hZ2VfZGVzdC0+Y29tcHMpOworCQlwX2ltYWdlX2Rlc3QtPmNvbXBzID0gTlVMTDsKKwl9CisKKwlwX2ltYWdlX2Rlc3QtPm51bWNvbXBzID0gcF9pbWFnZV9zcmMtPm51bWNvbXBzOworCisJcF9pbWFnZV9kZXN0LT5jb21wcyA9IChvcGpfaW1hZ2VfY29tcF90Kikgb3BqX21hbGxvYyhwX2ltYWdlX2Rlc3QtPm51bWNvbXBzICogc2l6ZW9mKG9wal9pbWFnZV9jb21wX3QpKTsKKwlpZiAoIXBfaW1hZ2VfZGVzdC0+Y29tcHMpeworCQlwX2ltYWdlX2Rlc3QtPmNvbXBzID0gTlVMTDsKKwkJcF9pbWFnZV9kZXN0LT5udW1jb21wcyA9IDA7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGNvbXBubz0wOyBjb21wbm8gPCBwX2ltYWdlX2Rlc3QtPm51bWNvbXBzOyBjb21wbm8rKyl7CisJCW1lbWNweSggJihwX2ltYWdlX2Rlc3QtPmNvbXBzW2NvbXBub10pLAorCQkJCSYocF9pbWFnZV9zcmMtPmNvbXBzW2NvbXBub10pLAorCQkJCXNpemVvZihvcGpfaW1hZ2VfY29tcF90KSk7CisJCXBfaW1hZ2VfZGVzdC0+Y29tcHNbY29tcG5vXS5kYXRhID0gTlVMTDsKKwl9CisKKwlwX2ltYWdlX2Rlc3QtPmNvbG9yX3NwYWNlID0gcF9pbWFnZV9zcmMtPmNvbG9yX3NwYWNlOworCXBfaW1hZ2VfZGVzdC0+aWNjX3Byb2ZpbGVfbGVuID0gcF9pbWFnZV9zcmMtPmljY19wcm9maWxlX2xlbjsKKworCWlmIChwX2ltYWdlX2Rlc3QtPmljY19wcm9maWxlX2xlbikgeworCQlwX2ltYWdlX2Rlc3QtPmljY19wcm9maWxlX2J1ZiA9IChPUEpfQllURSopb3BqX21hbGxvYyhwX2ltYWdlX2Rlc3QtPmljY19wcm9maWxlX2xlbik7CisJCWlmICghcF9pbWFnZV9kZXN0LT5pY2NfcHJvZmlsZV9idWYpeworCQkJcF9pbWFnZV9kZXN0LT5pY2NfcHJvZmlsZV9idWYgPSBOVUxMOworCQkJcF9pbWFnZV9kZXN0LT5pY2NfcHJvZmlsZV9sZW4gPSAwOworCQkJcmV0dXJuOworCQl9CisJCW1lbWNweSggcF9pbWFnZV9kZXN0LT5pY2NfcHJvZmlsZV9idWYsCisJCQkJcF9pbWFnZV9zcmMtPmljY19wcm9maWxlX2J1ZiwKKwkJCQlwX2ltYWdlX3NyYy0+aWNjX3Byb2ZpbGVfbGVuKTsKKwkJfQorCQllbHNlCisJCQlwX2ltYWdlX2Rlc3QtPmljY19wcm9maWxlX2J1ZiA9IE5VTEw7CisKKwlyZXR1cm47Cit9CisKK29wal9pbWFnZV90KiBPUEpfQ0FMTENPTlYgb3BqX2ltYWdlX3RpbGVfY3JlYXRlKE9QSl9VSU5UMzIgbnVtY21wdHMsIG9wal9pbWFnZV9jbXB0cGFybV90ICpjbXB0cGFybXMsIE9QSl9DT0xPUl9TUEFDRSBjbHJzcGMpIHsKKwlPUEpfVUlOVDMyIGNvbXBubzsKKwlvcGpfaW1hZ2VfdCAqaW1hZ2UgPSAwMDsKKworCWltYWdlID0gKG9wal9pbWFnZV90Kikgb3BqX2NhbGxvYygxLHNpemVvZihvcGpfaW1hZ2VfdCkpOworCWlmIChpbWFnZSkKKwl7CisJCQorCQlpbWFnZS0+Y29sb3Jfc3BhY2UgPSBjbHJzcGM7CisJCWltYWdlLT5udW1jb21wcyA9IG51bWNtcHRzOworCQkKKwkJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcGVyLWNvbXBvbmVudCBpbmZvcm1hdGlvbiAqLworCQlpbWFnZS0+Y29tcHMgPSAob3BqX2ltYWdlX2NvbXBfdCopb3BqX2NhbGxvYyhpbWFnZS0+bnVtY29tcHMsIHNpemVvZihvcGpfaW1hZ2VfY29tcF90KSk7CisJCWlmICghaW1hZ2UtPmNvbXBzKSB7CisJCQlvcGpfaW1hZ2VfZGVzdHJveShpbWFnZSk7CisJCQlyZXR1cm4gMDA7CisJCX0KKwkJCisJCS8qIGNyZWF0ZSB0aGUgaW5kaXZpZHVhbCBpbWFnZSBjb21wb25lbnRzICovCisJCWZvcihjb21wbm8gPSAwOyBjb21wbm8gPCBudW1jbXB0czsgY29tcG5vKyspIHsKKwkJCW9wal9pbWFnZV9jb21wX3QgKmNvbXAgPSAmaW1hZ2UtPmNvbXBzW2NvbXBub107CisJCQljb21wLT5keCA9IGNtcHRwYXJtc1tjb21wbm9dLmR4OworCQkJY29tcC0+ZHkgPSBjbXB0cGFybXNbY29tcG5vXS5keTsKKwkJCWNvbXAtPncgPSBjbXB0cGFybXNbY29tcG5vXS53OworCQkJY29tcC0+aCA9IGNtcHRwYXJtc1tjb21wbm9dLmg7CisJCQljb21wLT54MCA9IGNtcHRwYXJtc1tjb21wbm9dLngwOworCQkJY29tcC0+eTAgPSBjbXB0cGFybXNbY29tcG5vXS55MDsKKwkJCWNvbXAtPnByZWMgPSBjbXB0cGFybXNbY29tcG5vXS5wcmVjOworCQkJY29tcC0+c2duZCA9IGNtcHRwYXJtc1tjb21wbm9dLnNnbmQ7CisJCQljb21wLT5kYXRhID0gMDsKKwkJfQorCX0KKworCXJldHVybiBpbWFnZTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9pbWFnZS5oIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9pbWFnZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvaW1hZ2UuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9pbWFnZS5oCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2luZGV4Ym94X21hbmFnZXIuaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvaW5kZXhib3hfbWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViY2RlOGYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2luZGV4Ym94X21hbmFnZXIuaApAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqICRJZDogaW5kZXhib3hfbWFuYWdlci5oIDg5NyAyMDExLTA4LTI4IDIxOjQzOjU3WiBLYW9yaS5IYWdpaGFyYUBnbWFpbC5jb20gJAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBVbml2ZXJzaXRlIGNhdGhvbGlxdWUgZGUgTG91dmFpbiAoVUNMKSwgQmVsZ2l1bQorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFByb2Zlc3NvciBCZW5vaXQgTWFjcQorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQsIFlhbm5pY2sgVmVyc2NodWVyZW4KKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBLYW9yaSBIYWdpaGFyYQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKiEgXGZpbGUKKyAqICBcYnJpZWYgTW9kaWZpY2F0aW9uIG9mIGpwaXAuYyBmcm9tIDJLQU4gaW5kZXhlcgorICovCisKKyNpZm5kZWYgIElOREVYQk9YX01BTkFHRVJfSF8KKyMgZGVmaW5lIElOREVYQk9YX01BTkFHRVJfSF8KKworI2luY2x1ZGUgIm9wZW5qcGVnLmgiCisjaW5jbHVkZSAiajJrLmgiIC8qIG5lZWRlZCB0byB1c2UganAyLmggKi8KKyNpbmNsdWRlICJqcDIuaCIKKworI2RlZmluZSBKUElQX0NJRFggMHg2MzY5NjQ3OCAgIC8qIENvZGVzdHJlYW0gaW5kZXggICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSlBJUF9DUFRSIDB4NjM3MDc0NzIgICAvKiBDb2Rlc3RyZWFtIEZpbmRlciBCb3ggICAgICAgICAgICovCisjZGVmaW5lIEpQSVBfTUFORiAweDZkNjE2ZTY2ICAgLyogTWFuaWZlc3QgQm94ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBKUElQX0ZBSVggMHg2NjYxNjk3OCAgIC8qIEZyYWdtZW50IGFycmF5IEluZGV4IGJveCAgICAgICAgKi8KKyNkZWZpbmUgSlBJUF9NSElYIDB4NmQ2ODY5NzggICAvKiBNYWluIEhlYWRlciBJbmRleCBUYWJsZSAgICAgICAgICovCisjZGVmaW5lIEpQSVBfVFBJWCAweDc0NzA2OTc4ICAgLyogVGlsZS1wYXJ0IEluZGV4IFRhYmxlIGJveCAgICAgICAqLworI2RlZmluZSBKUElQX1RISVggMHg3NDY4Njk3OCAgIC8qIFRpbGUgaGVhZGVyIEluZGV4IFRhYmxlIGJveCAgICAgKi8KKyNkZWZpbmUgSlBJUF9QUElYIDB4NzA3MDY5NzggICAvKiBQcmVjaW5jdCBQYWNrZXQgSW5kZXggVGFibGUgYm94ICovCisjZGVmaW5lIEpQSVBfUEhJWCAweDcwNjg2OTc4ICAgLyogUGFja2V0IEhlYWRlciBpbmRleCBUYWJsZSAgICAgICAqLworI2RlZmluZSBKUElQX0ZJRFggMHg2NjY5NjQ3OCAgIC8qIEZpbGUgSW5kZXggICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSlBJUF9GUFRSIDB4NjY3MDc0NzIgICAvKiBGaWxlIEZpbmRlciAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEpQSVBfUFJYWSAweDcwNzI3ODc5ICAgLyogUHJveHkgYm94ZXMgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBKUElQX0lQVFIgMHg2OTcwNzQ3MiAgIC8qIEluZGV4IGZpbmRlciBib3ggICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSlBJUF9QSExEIDB4NzA2ODZjNjQgICAvKiBQbGFjZSBob2xkZXIgICAgICAgICAgICAgICAgICAgICovCisKKworLyogCisgKiBXcml0ZSB0aWxlLXBhcnQgSW5kZXggdGFibGUgYm94IChzdXBlcmJveCkKKyAqCisgKiBAcGFyYW1baW5dIGNvZmYgICAgICBvZmZzZXQgb2YgajJrIGNvZGVzdHJlYW0KKyAqIEBwYXJhbVtpbl0gY3N0cl9pbmZvIGNvZGVzdHJlYW0gaW5mb3JtYXRpb24KKyAqIEBwYXJhbVtpbl0gajJrbGVuICAgIGxlbmd0aCBvZiBqMmsgY29kZXN0cmVhbQorICogQHBhcmFtW2luXSBjaW8gICAgICAgZmlsZSBvdXRwdXQgaGFuZGxlCisgKiBAcmV0dXJuICAgICAgICAgICAgICBsZW5ndGggb2YgdHBpeCBib3gKKyAqLworaW50IG9wal93cml0ZV90cGl4KCBpbnQgY29mZiwgb3BqX2NvZGVzdHJlYW1faW5mb190IGNzdHJfaW5mbywgaW50IGoya2xlbiwgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKKyAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKworLyogCisgKiBXcml0ZSB0aWxlIGhlYWRlciBpbmRleCB0YWJsZSBib3ggKHN1cGVyYm94KQorICoKKyAqIEBwYXJhbVtpbl0gY29mZiAgICAgIG9mZnNldCBvZiBqMmsgY29kZXN0cmVhbQorICogQHBhcmFtW2luXSBjc3RyX2luZm8gY29kZXN0cmVhbSBpbmZvcm1hdGlvbiBwb2ludGVyCisgKiBAcGFyYW1baW5dIGNpbyAgICAgICBmaWxlIG91dHB1dCBoYW5kbGUKKyAqIEByZXR1cm4gICAgICAgICAgICAgIGxlbmd0aCBvZiB0aGl4IGJveAorICovCitpbnQgb3BqX3dyaXRlX3RoaXgoIGludCBjb2ZmLCBvcGpfY29kZXN0cmVhbV9pbmZvX3QgY3N0cl9pbmZvLCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLCBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworCisvKiAKKyAqIFdyaXRlIHByZWNpbmN0IHBhY2tldCBpbmRleCB0YWJsZSBib3ggKHN1cGVyYm94KQorICoKKyAqIEBwYXJhbVtpbl0gY29mZiAgICAgIG9mZnNldCBvZiBqMmsgY29kZXN0cmVhbQorICogQHBhcmFtW2luXSBjc3RyX2luZm8gY29kZXN0cmVhbSBpbmZvcm1hdGlvbgorICogQHBhcmFtW2luXSBFUEh1c2VkICAgdHJ1ZSBpZiBFUEggb3B0aW9uIHVzZWQKKyAqIEBwYXJhbVtpbl0gajJrbGVuICAgIGxlbmd0aCBvZiBqMmsgY29kZXN0cmVhbQorICogQHBhcmFtW2luXSBjaW8gICAgICAgZmlsZSBvdXRwdXQgaGFuZGxlCisgKiBAcmV0dXJuICAgICAgICAgICAgICBsZW5ndGggb2YgcHBpeCBib3gKKyAqLworaW50IG9wal93cml0ZV9wcGl4KCBpbnQgY29mZiwgb3BqX2NvZGVzdHJlYW1faW5mb190IGNzdHJfaW5mbywgT1BKX0JPT0wgRVBIdXNlZCwgaW50IGoya2xlbiwgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKKyAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKworLyogCisgKiBXcml0ZSBwYWNrZXQgaGVhZGVyIGluZGV4IHRhYmxlIGJveCAoc3VwZXJib3gpCisgKgorICogQHBhcmFtW2luXSBjb2ZmICAgICAgb2Zmc2V0IG9mIGoyayBjb2Rlc3RyZWFtCisgKiBAcGFyYW1baW5dIGNzdHJfaW5mbyBjb2Rlc3RyZWFtIGluZm9ybWF0aW9uCisgKiBAcGFyYW1baW5dIEVQSHVzZWQgICB0cnVlIGlmIEVQSCBvcHRpb24gdXNlZAorICogQHBhcmFtW2luXSBqMmtsZW4gICAgbGVuZ3RoIG9mIGoyayBjb2Rlc3RyZWFtCisgKiBAcGFyYW1baW5dIGNpbyAgICAgICBmaWxlIG91dHB1dCBoYW5kbGUKKyAqIEByZXR1cm4gICAgICAgICAgICAgIGxlbmd0aCBvZiBwcGl4IGJveAorICovCitpbnQgb3BqX3dyaXRlX3BoaXgoIGludCBjb2ZmLCBvcGpfY29kZXN0cmVhbV9pbmZvX3QgY3N0cl9pbmZvLCBPUEpfQk9PTCBFUEh1c2VkLCBpbnQgajJrbGVuLCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAorICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworLyogCisgKiBXcml0ZSBtYW5pZmVzdCBib3ggKGJveCkKKyAqCisgKiBAcGFyYW1baW5dIHNlY29uZCBudW1iZXIgdG8gYmUgdmlzaXRlZAorICogQHBhcmFtW2luXSB2ICAgICAgbnVtYmVyIG9mIGJveGVzCisgKiBAcGFyYW1baW5dIGJveCAgICBib3ggdG8gYmUgbWFuaWZlc3RlZAorICogQHBhcmFtW2luXSBjaW8gICAgZmlsZSBvdXRwdXQgaGFuZGxlCisgKi8KKwordm9pZCBvcGpfd3JpdGVfbWFuZihpbnQgc2Vjb25kLCAKKyAgICAgICAgICAgICAgICAgICAgaW50IHYsIAorICAgICAgICAgICAgICAgICAgICBvcGpfanAyX2JveF90ICpib3gsIAorICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAorICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworLyogCisgKiBXcml0ZSBtYWluIGhlYWRlciBpbmRleCB0YWJsZSAoYm94KQorICoKKyAqIEBwYXJhbVtpbl0gY29mZiBvZmZzZXQgb2YgajJrIGNvZGVzdHJlYW0KKyAqIEBwYXJhbVtpbl0gY3N0cl9pbmZvIGNvZGVzdHJlYW0gaW5mb3JtYXRpb24KKyAqIEBwYXJhbVtpbl0gY2lvICBmaWxlIG91dHB1dCBoYW5kbGUKKyAqIEByZXR1cm4gICAgICAgICBsZW5ndGggb2YgbWFpbm1oaXggYm94CisgKi8KK2ludCBvcGpfd3JpdGVfbWFpbm1oaXgoIGludCBjb2ZmLCBvcGpfY29kZXN0cmVhbV9pbmZvX3QgY3N0cl9pbmZvLCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAorICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworaW50IG9wal93cml0ZV9waGl4ZmFpeCggaW50IGNvZmYsIGludCBjb21wbm8sIG9wal9jb2Rlc3RyZWFtX2luZm9fdCBjc3RyX2luZm8sIE9QSl9CT09MIEVQSHVzZWQsIGludCBqMmtsZW4sIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCisgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworCitpbnQgb3BqX3dyaXRlX3BwaXhmYWl4KCBpbnQgY29mZiwgaW50IGNvbXBubywgb3BqX2NvZGVzdHJlYW1faW5mb190IGNzdHJfaW5mbywgT1BKX0JPT0wgRVBIdXNlZCwgaW50IGoya2xlbiwgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKKyAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKK2ludCBvcGpfd3JpdGVfdGlsZW1oaXgoIGludCBjb2ZmLCBvcGpfY29kZXN0cmVhbV9pbmZvX3QgY3N0cl9pbmZvLCBpbnQgdGlsZW5vLCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAorICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworaW50IG9wal93cml0ZV90cGl4ZmFpeCggaW50IGNvZmYsIGludCBjb21wbm8sIG9wal9jb2Rlc3RyZWFtX2luZm9fdCBjc3RyX2luZm8sIGludCBqMmtsZW4sIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCisgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworCisjZW5kaWYgICAgICAvKiAhSU5ERVhCT1hfTUFOQUdFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9pbnZlcnQuYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvaW52ZXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VmYWY2ZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvaW52ZXJ0LmMKQEAgLTAsMCArMSwyOTQgQEAKKy8qCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKKyAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKKyAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKKyAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIEplcm9tZSBGaW1lcywgQ29tbXVuaWNhdGlvbnMgJiBTeXN0ZW1lcyA8amVyb21lLmZpbWVzQGMtcy5mcj4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgQVMgSVMnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIm9wal9pbmNsdWRlcy5oIgorCisvKiogCisgKiBMVVAgZGVjb21wb3NpdGlvbgorICovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2x1cERlY29tcG9zZShPUEpfRkxPQVQzMiAqIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwZXJtdXRhdGlvbnMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIgKiBwX3N3YXBfYXJlYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbmJfY29tcG8pOworLyoqIAorICogTFVQIHNvbHZpbmcKKyAqLworc3RhdGljIHZvaWQgb3BqX2x1cFNvbHZlKE9QSl9GTE9BVDMyICogcFJlc3VsdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIqIHBNYXRyaXgsIAorICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyKiBwVmVjdG9yLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyKiBwUGVybXV0YXRpb25zLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG5iX2NvbXBvLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcF9pbnRlcm1lZGlhdGVfZGF0YSk7CisKKy8qKiAKKyAqTFVQIGludmVyc2lvbiAoY2FsbCB3aXRoIHRoZSByZXN1bHQgb2YgbHVwRGVjb21wb3NlKQorICovCitzdGF0aWMgdm9pZCBvcGpfbHVwSW52ZXJ0ICggT1BKX0ZMT0FUMzIgKiBwU3JjTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcERlc3RNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBuYl9jb21wbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcFBlcm11dGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiAqIHBfc3JjX3RlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIgKiBwX2Rlc3RfdGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiAqIHBfc3dhcF9hcmVhKTsKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIE1hdHJpYyBpbnZlcnNpb24gaW50ZXJmYWNlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworLyoqCisgKiBNYXRyaXggaW52ZXJzaW9uLgorICovCitPUEpfQk9PTCBvcGpfbWF0cml4X2ludmVyc2lvbl9mKE9QSl9GTE9BVDMyICogcFNyY01hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIgKiBwRGVzdE1hdHJpeCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbmJfY29tcG8pCit7CisJT1BKX0JZVEUgKiBsX2RhdGEgPSAwMDsKKwlPUEpfVUlOVDMyIGxfcGVybXV0YXRpb25fc2l6ZSA9IG5iX2NvbXBvICogKE9QSl9VSU5UMzIpc2l6ZW9mKE9QSl9VSU5UMzIpOworCU9QSl9VSU5UMzIgbF9zd2FwX3NpemUgPSBuYl9jb21wbyAqIChPUEpfVUlOVDMyKXNpemVvZihPUEpfRkxPQVQzMik7CisJT1BKX1VJTlQzMiBsX3RvdGFsX3NpemUgPSBsX3Blcm11dGF0aW9uX3NpemUgKyAzICogbF9zd2FwX3NpemU7CisJT1BKX1VJTlQzMiAqIGxQZXJtdXRhdGlvbnMgPSAwMDsKKwlPUEpfRkxPQVQzMiAqIGxfZG91YmxlX2RhdGEgPSAwMDsKKworCWxfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfbWFsbG9jKGxfdG90YWxfc2l6ZSk7CisJaWYgKGxfZGF0YSA9PSAwKSB7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCWxQZXJtdXRhdGlvbnMgPSAoT1BKX1VJTlQzMiAqKSBsX2RhdGE7CisJbF9kb3VibGVfZGF0YSA9IChPUEpfRkxPQVQzMiAqKSAobF9kYXRhICsgbF9wZXJtdXRhdGlvbl9zaXplKTsKKwltZW1zZXQobFBlcm11dGF0aW9ucywwLGxfcGVybXV0YXRpb25fc2l6ZSk7CisKKwlpZighIG9wal9sdXBEZWNvbXBvc2UocFNyY01hdHJpeCxsUGVybXV0YXRpb25zLGxfZG91YmxlX2RhdGEsbmJfY29tcG8pKSB7CisJCW9wal9mcmVlKGxfZGF0YSk7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCQorICAgIG9wal9sdXBJbnZlcnQocFNyY01hdHJpeCxwRGVzdE1hdHJpeCxuYl9jb21wbyxsUGVybXV0YXRpb25zLGxfZG91YmxlX2RhdGEsbF9kb3VibGVfZGF0YSArIG5iX2NvbXBvLGxfZG91YmxlX2RhdGEgKyAyKm5iX2NvbXBvKTsKKwlvcGpfZnJlZShsX2RhdGEpOworCQorICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgTG9jYWwgZnVuY3Rpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworc3RhdGljIE9QSl9CT09MIG9wal9sdXBEZWNvbXBvc2UoT1BKX0ZMT0FUMzIgKiBtYXRyaXgsT1BKX1VJTlQzMiAqIHBlcm11dGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIgKiBwX3N3YXBfYXJlYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBuYl9jb21wbykgCit7CisJT1BKX1VJTlQzMiAqIHRtcFBlcm11dGF0aW9ucyA9IHBlcm11dGF0aW9uczsKKwlPUEpfVUlOVDMyICogZHN0UGVybXV0YXRpb25zOworCU9QSl9VSU5UMzIgazI9MCx0OworCU9QSl9GTE9BVDMyIHRlbXA7CisJT1BKX1VJTlQzMiBpLGosazsKKwlPUEpfRkxPQVQzMiBwOworCU9QSl9VSU5UMzIgbExhc3RDb2x1bSA9IG5iX2NvbXBvIC0gMTsKKwlPUEpfVUlOVDMyIGxTd2FwU2l6ZSA9IG5iX2NvbXBvICogKE9QSl9VSU5UMzIpc2l6ZW9mKE9QSl9GTE9BVDMyKTsKKwlPUEpfRkxPQVQzMiAqIGxUbXBNYXRyaXggPSBtYXRyaXg7CisJT1BKX0ZMT0FUMzIgKiBsQ29sdW1uTWF0cml4LCogbERlc3RNYXRyaXg7CisJT1BKX1VJTlQzMiBvZmZzZXQgPSAxOworCU9QSl9VSU5UMzIgbFN0cmlkZSA9IG5iX2NvbXBvLTE7CisKKwkvKmluaXRpYWxpemUgcGVybXV0YXRpb25zICovCisJZm9yIChpID0gMDsgaSA8IG5iX2NvbXBvOyArK2kpIAorCXsKKyAgICAJKnRtcFBlcm11dGF0aW9ucysrID0gaTsKKwl9CisJLyogbm93IG1ha2UgYSBwaXZvdCB3aXRoIGNvbHVtbiBzd2l0Y2ggKi8KKwl0bXBQZXJtdXRhdGlvbnMgPSBwZXJtdXRhdGlvbnM7CisJZm9yIChrID0gMDsgayA8IGxMYXN0Q29sdW07ICsraykgeworCQlwID0gMC4wOworCisJCS8qIHRha2UgdGhlIG1pZGRsZSBlbGVtZW50ICovCisJCWxDb2x1bW5NYXRyaXggPSBsVG1wTWF0cml4ICsgazsKKwkJCisJCS8qIG1ha2UgcGVybXV0YXRpb24gd2l0aCB0aGUgYmlnZ2VzdCB2YWx1ZSBpbiB0aGUgY29sdW1uICovCisgICAgICAgIGZvciAoaSA9IGs7IGkgPCBuYl9jb21wbzsgKytpKSB7CisJCQl0ZW1wID0gKCgqbENvbHVtbk1hdHJpeCA+IDApID8gKmxDb2x1bW5NYXRyaXggOiAtKCpsQ29sdW1uTWF0cml4KSk7CisgICAgIAkJaWYgKHRlbXAgPiBwKSB7CisgICAgIAkJCXAgPSB0ZW1wOworICAgICAJCQlrMiA9IGk7CisgICAgIAkJfQorCQkJLyogbmV4dCBsaW5lICovCisJCQlsQ29sdW1uTWF0cml4ICs9IG5iX2NvbXBvOworICAgICAJfQorCisgICAgIAkvKiBhIHdob2xlIHJlc3Qgb2YgMCAtPiBub24gc2luZ3VsYXIgKi8KKyAgICAgCWlmIChwID09IDAuMCkgeworICAgIAkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJfQorCisJCS8qIHNob3VsZCB3ZSBwZXJtdXRlID8gKi8KKwkJaWYgKGsyICE9IGspIHsKKwkJCS8qZXhjaGFuZ2Ugb2YgbGluZSAqLworICAgICAJCS8qIGsyID4gayAqLworCQkJZHN0UGVybXV0YXRpb25zID0gdG1wUGVybXV0YXRpb25zICsgazIgLSBrOworCQkJLyogc3dhcCBpbmRpY2VzICovCisJCQl0ID0gKnRtcFBlcm11dGF0aW9uczsKKyAgICAgCQkqdG1wUGVybXV0YXRpb25zID0gKmRzdFBlcm11dGF0aW9uczsKKyAgICAgCQkqZHN0UGVybXV0YXRpb25zID0gdDsKKworCQkJLyogYW5kIHN3YXAgZW50aXJlIGxpbmUuICovCisJCQlsQ29sdW1uTWF0cml4ID0gbFRtcE1hdHJpeCArIChrMiAtIGspICogbmJfY29tcG87CisJCQltZW1jcHkocF9zd2FwX2FyZWEsbENvbHVtbk1hdHJpeCxsU3dhcFNpemUpOworCQkJbWVtY3B5KGxDb2x1bW5NYXRyaXgsbFRtcE1hdHJpeCxsU3dhcFNpemUpOworCQkJbWVtY3B5KGxUbXBNYXRyaXgscF9zd2FwX2FyZWEsbFN3YXBTaXplKTsKKwkJfQorCisJCS8qIG5vdyB1cGRhdGUgZGF0YSBpbiB0aGUgcmVzdCBvZiB0aGUgbGluZSBhbmQgbGluZSBhZnRlciAqLworCQlsRGVzdE1hdHJpeCA9IGxUbXBNYXRyaXggKyBrOworCQlsQ29sdW1uTWF0cml4ID0gbERlc3RNYXRyaXggKyBuYl9jb21wbzsKKwkJLyogdGFrZSB0aGUgbWlkZGxlIGVsZW1lbnQgKi8KKwkJdGVtcCA9ICoobERlc3RNYXRyaXgrKyk7CisKKwkJLyogbm93IGNvbXB1dGUgdXAgZGF0YSAoaS5lLiBjb2VmZiB1cCBvZiB0aGUgZGlhZ29uYWwpLiAqLworICAgICAJZm9yIChpID0gb2Zmc2V0OyBpIDwgbmJfY29tcG87ICsraSkgIHsKKwkJCS8qbENvbHVtbk1hdHJpeDsgKi8KKwkJCS8qIGRpdmlkZSB0aGUgbG93ZXIgY29sdW1uIGVsZW1lbnRzIGJ5IHRoZSBkaWFnb25hbCB2YWx1ZSAqLworCisJCQkvKiBtYXRyaXhbaV1ba10gLz0gbWF0cml4W2tdW2tdOyAqLworICAgICAJCS8qIHAgPSBtYXRyaXhbaV1ba10gKi8KKwkJCXAgPSAqbENvbHVtbk1hdHJpeCAvIHRlbXA7CisJCQkqKGxDb2x1bW5NYXRyaXgrKykgPSBwOworICAgICAJCQorICAgICAgICAgICAgZm9yIChqID0gLyogayArIDEgKi8gb2Zmc2V0OyBqIDwgbmJfY29tcG87ICsraikgeworCQkJCS8qIG1hdHJpeFtpXVtqXSAtPSBtYXRyaXhbaV1ba10gKiBtYXRyaXhba11bal07ICovCisgICAgIAkJCSoobENvbHVtbk1hdHJpeCsrKSAtPSBwICogKCoobERlc3RNYXRyaXgrKykpOworCQkJfQorCQkJLyogY29tZSBiYWNrIHRvIHRoZSBrKzF0aCBlbGVtZW50ICovCisJCQlsRGVzdE1hdHJpeCAtPSBsU3RyaWRlOworCQkJLyogZ28gdG8ga3RoIGVsZW1lbnQgb2YgdGhlIG5leHQgbGluZSAqLworCQkJbENvbHVtbk1hdHJpeCArPSBrOworICAgICAJfQorCisJCS8qIG9mZnNldCBpcyBub3cgaysyICovCisJCSsrb2Zmc2V0OworCQkvKiAxIGVsZW1lbnQgbGVzcyBmb3Igc3RyaWRlICovCisJCS0tbFN0cmlkZTsKKwkJLyogbmV4dCBsaW5lICovCisJCWxUbXBNYXRyaXgrPW5iX2NvbXBvOworCQkvKiBuZXh0IHBlcm11dGF0aW9uIGVsZW1lbnQgKi8KKwkJKyt0bXBQZXJtdXRhdGlvbnM7CisJfQorICAgIHJldHVybiBPUEpfVFJVRTsKK30KKyAgIAkJCitzdGF0aWMgdm9pZCBvcGpfbHVwU29sdmUgKE9QSl9GTE9BVDMyICogcFJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiAqIHBNYXRyaXgsIAorICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcFZlY3RvciwgCisgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiogcFBlcm11dGF0aW9ucywgCisgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBuYl9jb21wbyxPUEpfRkxPQVQzMiAqIHBfaW50ZXJtZWRpYXRlX2RhdGEpIAoreworCU9QSl9JTlQzMiBrOworICAgIE9QSl9VSU5UMzIgaSxqOworCU9QSl9GTE9BVDMyIHN1bTsKKwlPUEpfRkxPQVQzMiB1OworICAgIE9QSl9VSU5UMzIgbFN0cmlkZSA9IG5iX2NvbXBvKzE7CisJT1BKX0ZMT0FUMzIgKiBsQ3VycmVudFB0cjsKKwlPUEpfRkxPQVQzMiAqIGxJbnRlcm1lZGlhdGVQdHI7CisJT1BKX0ZMT0FUMzIgKiBsRGVzdFB0cjsKKwlPUEpfRkxPQVQzMiAqIGxUbXBNYXRyaXg7CisJT1BKX0ZMT0FUMzIgKiBsTGluZU1hdHJpeCA9IHBNYXRyaXg7CisJT1BKX0ZMT0FUMzIgKiBsQmVnaW5QdHIgPSBwUmVzdWx0ICsgbmJfY29tcG8gLSAxOworCU9QSl9GTE9BVDMyICogbEdlbmVyYXRlZERhdGE7CisJT1BKX1VJTlQzMiAqIGxDdXJyZW50UGVybXV0YXRpb25QdHIgPSBwUGVybXV0YXRpb25zOworCisJCisJbEludGVybWVkaWF0ZVB0ciA9IHBfaW50ZXJtZWRpYXRlX2RhdGE7CisJbEdlbmVyYXRlZERhdGEgPSBwX2ludGVybWVkaWF0ZV9kYXRhICsgbmJfY29tcG8gLSAxOworCQorICAgIGZvciAoaSA9IDA7IGkgPCBuYl9jb21wbzsgKytpKSB7CisgICAgICAgCXN1bSA9IDAuMDsKKwkJbEN1cnJlbnRQdHIgPSBwX2ludGVybWVkaWF0ZV9kYXRhOworCQlsVG1wTWF0cml4ID0gbExpbmVNYXRyaXg7CisgICAgICAgIGZvciAoaiA9IDE7IGogPD0gaTsgKytqKSAKKwkJeworCQkJLyogc3VtICs9IG1hdHJpeFtpXVtqLTFdICogeVtqLTFdOyAqLworICAgICAgICAJc3VtICs9ICgqKGxUbXBNYXRyaXgrKykpICogKCoobEN1cnJlbnRQdHIrKykpOworICAgICAgICB9CisJCS8qeVtpXSA9IHBWZWN0b3JbcFBlcm11dGF0aW9uc1tpXV0gLSBzdW07ICovCisgICAgICAgICoobEludGVybWVkaWF0ZVB0cisrKSA9IHBWZWN0b3JbKihsQ3VycmVudFBlcm11dGF0aW9uUHRyKyspXSAtIHN1bTsKKwkJbExpbmVNYXRyaXggKz0gbmJfY29tcG87CisJfQorCisJLyogd2UgdGFrZSB0aGUgbGFzdCBwb2ludCBvZiB0aGUgbWF0cml4ICovCisJbExpbmVNYXRyaXggPSBwTWF0cml4ICsgbmJfY29tcG8qbmJfY29tcG8gLSAxOworCisJLyogYW5kIHdlIHRha2UgYWZ0ZXIgdGhlIGxhc3QgcG9pbnQgb2YgdGhlIGRlc3RpbmF0aW9uIHZlY3RvciAqLworCWxEZXN0UHRyID0gcFJlc3VsdCArIG5iX2NvbXBvOworCisKKyAgICBhc3NlcnQobmJfY29tcG8gIT0gMCk7CisJZm9yIChrID0gKE9QSl9JTlQzMiluYl9jb21wbyAtIDE7IGsgIT0gLTEgOyAtLWspIHsKKwkJc3VtID0gMC4wOworCQlsVG1wTWF0cml4ID0gbExpbmVNYXRyaXg7CisgICAgICAgIHUgPSAqKGxUbXBNYXRyaXgrKyk7CisJCWxDdXJyZW50UHRyID0gbERlc3RQdHItLTsKKyAgICAgICAgZm9yIChqID0gKE9QSl9VSU5UMzIpKGsgKyAxKTsgaiA8IG5iX2NvbXBvOyArK2opIHsKKwkJCS8qIHN1bSArPSBtYXRyaXhba11bal0gKiB4W2pdICovCisgICAgICAgIAlzdW0gKz0gKCoobFRtcE1hdHJpeCsrKSkgKiAoKihsQ3VycmVudFB0cisrKSk7CisJCX0KKwkJLyp4W2tdID0gKHlba10gLSBzdW0pIC8gdTsgKi8KKyAgICAgICAgKihsQmVnaW5QdHItLSkgPSAoKihsR2VuZXJhdGVkRGF0YS0tKSAtIHN1bSkgLyB1OworCQlsTGluZU1hdHJpeCAtPSBsU3RyaWRlOworCX0KK30KKyAgICAKKworc3RhdGljIHZvaWQgb3BqX2x1cEludmVydCAoT1BKX0ZMT0FUMzIgKiBwU3JjTWF0cml4LAorICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiAqIHBEZXN0TWF0cml4LAorICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG5iX2NvbXBvLAorICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcFBlcm11dGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIgKiBwX3NyY190ZW1wLAorICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiAqIHBfZGVzdF90ZW1wLAorICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiAqIHBfc3dhcF9hcmVhICkKK3sKKwlPUEpfVUlOVDMyIGosaTsKKwlPUEpfRkxPQVQzMiAqIGxDdXJyZW50UHRyOworCU9QSl9GTE9BVDMyICogbExpbmVNYXRyaXggPSBwRGVzdE1hdHJpeDsKKwlPUEpfVUlOVDMyIGxTd2FwU2l6ZSA9IG5iX2NvbXBvICogKE9QSl9VSU5UMzIpc2l6ZW9mKE9QSl9GTE9BVDMyKTsKKworCWZvciAoaiA9IDA7IGogPCBuYl9jb21wbzsgKytqKSB7CisJCWxDdXJyZW50UHRyID0gbExpbmVNYXRyaXgrKzsKKyAgICAgICAgbWVtc2V0KHBfc3JjX3RlbXAsMCxsU3dhcFNpemUpOworICAgIAlwX3NyY190ZW1wW2pdID0gMS4wOworCQlvcGpfbHVwU29sdmUocF9kZXN0X3RlbXAscFNyY01hdHJpeCxwX3NyY190ZW1wLCBwUGVybXV0YXRpb25zLCBuYl9jb21wbyAsIHBfc3dhcF9hcmVhKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbmJfY29tcG87ICsraSkgeworICAgIAkJKihsQ3VycmVudFB0cikgPSBwX2Rlc3RfdGVtcFtpXTsKKwkJCWxDdXJyZW50UHRyKz1uYl9jb21wbzsKKyAgICAJfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL2ludmVydC5oIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9pbnZlcnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL2ludmVydC5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2ludmVydC5oCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2oyay5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qMmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjBmMjE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qMmsuYwpAQCAtMCwwICsxLDEwODEzIEBACisvKgorICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCisgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFVuaXZlcnNpdGUgY2F0aG9saXF1ZSBkZSBMb3V2YWluIChVQ0wpLCBCZWxnaXVtCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQorICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIEplcm9tZSBGaW1lcywgQ29tbXVuaWNhdGlvbnMgJiBTeXN0ZW1lcyA8amVyb21lLmZpbWVzQGMtcy5mcj4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA3LCBQYXJ2YXRoYSBFbGFuZ292YW4KKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBLYW9yaSBIYWdpaGFyYQorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIENlbnRyZSBOYXRpb25hbCBkJ0V0dWRlcyBTcGF0aWFsZXMgKENORVMpLCBGcmFuY2UgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENTIFN5c3RlbWVzIGQnSW5mb3JtYXRpb24sIEZyYW5jZQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAib3BqX2luY2x1ZGVzLmgiCisKKy8qKiBAZGVmZ3JvdXAgSjJLIEoySyAtIEpQRUctMjAwMCBjb2Rlc3RyZWFtIHJlYWRlci93cml0ZXIgKi8KKy8qQHsqLworCisvKiogQG5hbWUgTG9jYWwgc3RhdGljIGZ1bmN0aW9ucyAqLworLypAeyovCisKKy8qKgorICogU2V0cyB1cCB0aGUgcHJvY2VkdXJlcyB0byBkbyBvbiByZWFkaW5nIGhlYWRlci4gRGV2ZWxvcHBlcnMgd2FudGluZyB0byBleHRlbmQgdGhlIGxpYnJhcnkgY2FuIGFkZCB0aGVpciBvd24gcmVhZGluZyBwcm9jZWR1cmVzLgorICovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19zZXR1cF9oZWFkZXJfcmVhZGluZyAob3BqX2oya190ICpwX2oyaywgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKKworLyoqCisgKiBUaGUgcmVhZCBoZWFkZXIgcHJvY2VkdXJlLgorICovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX2hlYWRlcl9wcm9jZWR1cmUoICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKKworLyoqCisgKiBUaGUgZGVmYXVsdCBlbmNvZGluZyB2YWxpZGF0aW9uIHByb2NlZHVyZSB3aXRob3V0IGFueSBleHRlbnNpb24uCisgKgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYyB0byB2YWxpZGF0ZS4KKyAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICB0aGUgaW5wdXQgc3RyZWFtIHRvIHZhbGlkYXRlLgorICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisgKgorICogQHJldHVybiB0cnVlIGlmIHRoZSBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0LgorICovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19lbmNvZGluZ192YWxpZGF0aW9uICggICBvcGpfajJrX3QgKiBwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworCisvKioKKyAqIFRoZSBkZWZhdWx0IGRlY29kaW5nIHZhbGlkYXRpb24gcHJvY2VkdXJlIHdpdGhvdXQgYW55IGV4dGVuc2lvbi4KKyAqCisgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjIHRvIHZhbGlkYXRlLgorICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5wdXQgc3RyZWFtIHRvIHZhbGlkYXRlLgorICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisgKgorICogQHJldHVybiB0cnVlIGlmIHRoZSBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0LgorICovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19kZWNvZGluZ192YWxpZGF0aW9uICggICBvcGpfajJrX3QgKiBwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworCisvKioKKyAqIFNldHMgdXAgdGhlIHZhbGlkYXRpb24gLGkuZS4gYWRkcyB0aGUgcHJvY2VkdXJlcyB0byBsYXVjaCB0byBtYWtlIHN1cmUgdGhlIGNvZGVjIHBhcmFtZXRlcnMKKyAqIGFyZSB2YWxpZC4gRGV2ZWxvcHBlcnMgd2FudGluZyB0byBleHRlbmQgdGhlIGxpYnJhcnkgY2FuIGFkZCB0aGVpciBvd24gdmFsaWRhdGlvbiBwcm9jZWR1cmVzLgorICovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19zZXR1cF9lbmNvZGluZ192YWxpZGF0aW9uIChvcGpfajJrX3QgKnBfajJrLCBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOworCisvKioKKyAqIFNldHMgdXAgdGhlIHZhbGlkYXRpb24gLGkuZS4gYWRkcyB0aGUgcHJvY2VkdXJlcyB0byBsYXVjaCB0byBtYWtlIHN1cmUgdGhlIGNvZGVjIHBhcmFtZXRlcnMKKyAqIGFyZSB2YWxpZC4gRGV2ZWxvcHBlcnMgd2FudGluZyB0byBleHRlbmQgdGhlIGxpYnJhcnkgY2FuIGFkZCB0aGVpciBvd24gdmFsaWRhdGlvbiBwcm9jZWR1cmVzLgorICovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19zZXR1cF9kZWNvZGluZ192YWxpZGF0aW9uIChvcGpfajJrX3QgKnBfajJrLCBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOworCisvKioKKyAqIFNldHMgdXAgdGhlIHZhbGlkYXRpb24gLGkuZS4gYWRkcyB0aGUgcHJvY2VkdXJlcyB0byBsYXVjaCB0byBtYWtlIHN1cmUgdGhlIGNvZGVjIHBhcmFtZXRlcnMKKyAqIGFyZSB2YWxpZC4gRGV2ZWxvcHBlcnMgd2FudGluZyB0byBleHRlbmQgdGhlIGxpYnJhcnkgY2FuIGFkZCB0aGVpciBvd24gdmFsaWRhdGlvbiBwcm9jZWR1cmVzLgorICovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19zZXR1cF9lbmRfY29tcHJlc3MgKG9wal9qMmtfdCAqcF9qMmssIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CisKKy8qKgorICogVGhlIG1jdCBlbmNvZGluZyB2YWxpZGF0aW9uIHByb2NlZHVyZS4KKyAqCisgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjIHRvIHZhbGlkYXRlLgorICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5wdXQgc3RyZWFtIHRvIHZhbGlkYXRlLgorICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisgKgorICogQHJldHVybiB0cnVlIGlmIHRoZSBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0LgorICovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19tY3RfdmFsaWRhdGlvbiAob3BqX2oya190ICogcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworCisvKioKKyAqIEJ1aWxkcyB0aGUgdGNkIGRlY29kZXIgdG8gdXNlIHRvIGRlY29kZSB0aWxlLgorICovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19idWlsZF9kZWNvZGVyICggb3BqX2oya190ICogcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworLyoqCisgKiBCdWlsZHMgdGhlIHRjZCBlbmNvZGVyIHRvIHVzZSB0byBlbmNvZGUgdGlsZS4KKyAqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfYnVpbGRfZW5jb2RlciAoIG9wal9qMmtfdCAqIHBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworLyoqCisgKiBDcmVhdGVzIGEgdGlsZS1jb2RlciBkZWNvZGVyLgorICoKKyAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICAgICAgICAgIEoySyBjb2RlYy4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19jcmVhdGVfdGNkKCAgICAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworLyoqCisgKiBFeGN1dGVzIHRoZSBnaXZlbiBwcm9jZWR1cmVzIG9uIHRoZSBnaXZlbiBjb2RlYy4KKyAqCisgKiBAcGFyYW0gICAgICAgcF9wcm9jZWR1cmVfbGlzdCAgICAgICAgdGhlIGxpc3Qgb2YgcHJvY2VkdXJlcyB0byBleGVjdXRlCisgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMgdG8gZXhlY3V0ZSB0aGUgcHJvY2VkdXJlcyBvbi4KKyAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gZXhlY3V0ZSB0aGUgcHJvY2VkdXJlcyBvbi4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICAgICAgICAgIHRoZSB1c2VyIG1hbmFnZXIuCisgKgorICogQHJldHVybiAgICAgIHRydWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgYWxsIHRoZSBwcm9jZWR1cmVzIHdlcmUgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkLgorICovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19leGVjICggIG9wal9qMmtfdCAqIHBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9wcm9jZWR1cmVfbGlzdF90ICogcF9wcm9jZWR1cmVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKKworLyoqCisgKiBVcGRhdGVzIHRoZSByYXRlcyBvZiB0aGUgdGNwLgorICoKKyAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgICAgICAgICAgSjJLIGNvZGVjLgorICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfdXBkYXRlX3JhdGVzKCAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworCisvKioKKyAqIENvcGllcyB0aGUgZGVjb2RpbmcgdGlsZSBwYXJhbWV0ZXJzIG9udG8gYWxsIHRoZSB0aWxlIHBhcmFtZXRlcnMuCisgKiBDcmVhdGVzIGFsc28gdGhlIHRpbGUgZGVjb2Rlci4KKyAqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfY29weV9kZWZhdWx0X3RjcF9hbmRfY3JlYXRlX3RjZCAoICAgICAgIG9wal9qMmtfdCAqIHBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKy8qKgorICogRGVzdHJveXMgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIGRlY29kaW5nIG9mIGhlYWRlcnMuCisgKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2Rlc3Ryb3lfaGVhZGVyX21lbW9yeSAoIG9wal9qMmtfdCAqIHBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKy8qKgorICogUmVhZHMgdGhlIGxvb2t1cCB0YWJsZSBjb250YWluaW5nIGFsbCB0aGUgbWFya2VyLCBzdGF0dXMgYW5kIGFjdGlvbiwgYW5kIHJldHVybnMgdGhlIGhhbmRsZXIgYXNzb2NpYXRlZAorICogd2l0aCB0aGUgbWFya2VyIHZhbHVlLgorICogQHBhcmFtICAgICAgIHBfaWQgICAgICAgICAgICBNYXJrZXIgdmFsdWUgdG8gbG9vayB1cAorICoKKyAqIEByZXR1cm4gICAgICB0aGUgaGFuZGxlciBhc3NvY2lhdGVkIHdpdGggdGhlIGlkLgorKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3BqX2RlY19tZW1vcnlfbWFya2VyX2hhbmRsZXIgKiBvcGpfajJrX2dldF9tYXJrZXJfaGFuZGxlciAoT1BKX1VJTlQzMiBwX2lkKTsKKworLyoqCisgKiBEZXN0cm95cyBhIHRpbGUgY29kaW5nIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtICAgICAgIHBfdGNwICAgICAgICAgICB0aGUgdGlsZSBjb2RpbmcgcGFyYW1ldGVyIHRvIGRlc3Ryb3kuCisgKi8KK3N0YXRpYyB2b2lkIG9wal9qMmtfdGNwX2Rlc3Ryb3kgKG9wal90Y3BfdCAqcF90Y3ApOworCisvKioKKyAqIERlc3Ryb3lzIHRoZSBkYXRhIGluc2lkZSBhIHRpbGUgY29kaW5nIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtICAgICAgIHBfdGNwICAgICAgICAgICB0aGUgdGlsZSBjb2RpbmcgcGFyYW1ldGVyIHdoaWNoIGNvbnRhaW4gZGF0YSB0byBkZXN0cm95LgorICovCitzdGF0aWMgdm9pZCBvcGpfajJrX3RjcF9kYXRhX2Rlc3Ryb3kgKG9wal90Y3BfdCAqcF90Y3ApOworCisvKioKKyAqIERlc3Ryb3lzIGEgY29kaW5nIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtICAgICAgIHBfY3AgICAgICAgICAgICB0aGUgY29kaW5nIHBhcmFtZXRlciB0byBkZXN0cm95LgorICovCitzdGF0aWMgdm9pZCBvcGpfajJrX2NwX2Rlc3Ryb3kgKG9wal9jcF90ICpwX2NwKTsKKworLyoqCisgKiBXcml0ZXMgYSBTUENvZCBvciBTUENvYyBlbGVtZW50LCBpLmUuIHRoZSBjb2Rpbmcgc3R5bGUgb2YgYSBnaXZlbiBjb21wb25lbnQgb2YgYSB0aWxlLgorICoKKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgSjJLIGNvZGVjLgorICogQHBhcmFtICAgICAgIHBfdGlsZV9ubyAgICAgICBGSVhNRSBET0MKKyAqIEBwYXJhbSAgICAgICBwX2NvbXBfbm8gICAgICAgdGhlIGNvbXBvbmVudCBudW1iZXIgdG8gb3V0cHV0LgorICogQHBhcmFtICAgICAgIHBfZGF0YSAgICAgICAgICBGSVhNRSBET0MKKyAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgRklYTUUgRE9DCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisgKgorICogQHJldHVybiBGSVhNRSBET0MKKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9TUENvZF9TUENvYyggICAgICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29tcF9ubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworLyoqCisgKiBHZXRzIHRoZSBzaXplIHRha2VuIGJ5IHdyaXRpbmcgYSBTUENvZCBvciBTUENvYyBmb3IgdGhlIGdpdmVuIHRpbGUgYW5kIGNvbXBvbmVudC4KKyAqCisgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIEoySyBjb2RlYy4KKyAqIEBwYXJhbSAgICAgICBwX3RpbGVfbm8gICAgICAgICAgICAgICB0aGUgdGlsZSBpbmRleC4KKyAqIEBwYXJhbSAgICAgICBwX2NvbXBfbm8gICAgICAgICAgICAgICB0aGUgY29tcG9uZW50IGJlaW5nIG91dHB1dHRlZC4KKyAqCisgKiBAcmV0dXJuICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0YWtlbiBieSB0aGUgU1BDb2QgZWxlbWVudC4KKyAqLworc3RhdGljIE9QSl9VSU5UMzIgb3BqX2oya19nZXRfU1BDb2RfU1BDb2Nfc2l6ZSAob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vICk7CisKKy8qKgorICogUmVhZHMgYSBTUENvZCBvciBTUENvYyBlbGVtZW50LCBpLmUuIHRoZSBjb2Rpbmcgc3R5bGUgb2YgYSBnaXZlbiBjb21wb25lbnQgb2YgYSB0aWxlLgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0gICAgICAgY29tcG5vICAgICAgICAgIEZJWE1FIERPQworICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENPTSBib3guCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgQ09NIG1hcmtlci4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX1NQQ29kX1NQQ29jKCAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgY29tcG5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworLyoqCisgKiBHZXRzIHRoZSBzaXplIHRha2VuIGJ5IHdyaXRpbmcgU1FjZCBvciBTUWNjIGVsZW1lbnQsIGkuZS4gdGhlIHF1YW50aXphdGlvbiB2YWx1ZXMgb2YgYSBiYW5kIGluIHRoZSBRQ0Qgb3IgUUNDLgorICoKKyAqIEBwYXJhbSAgICAgICBwX3RpbGVfbm8gICAgICAgICAgICAgICB0aGUgdGlsZSBpbmRleC4KKyAqIEBwYXJhbSAgICAgICBwX2NvbXBfbm8gICAgICAgICAgICAgICB0aGUgY29tcG9uZW50IGJlaW5nIG91dHB1dHRlZC4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUgSjJLIGNvZGVjLgorICoKKyAqIEByZXR1cm4gICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRha2VuIGJ5IHRoZSBTUENvZCBlbGVtZW50LgorICovCitzdGF0aWMgT1BKX1VJTlQzMiBvcGpfajJrX2dldF9TUWNkX1NRY2Nfc2l6ZSAoICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29tcF9ubyApOworCisvKioKKyAqIFdyaXRlcyBhIFNRY2Qgb3IgU1FjYyBlbGVtZW50LCBpLmUuIHRoZSBxdWFudGl6YXRpb24gdmFsdWVzIG9mIGEgYmFuZCBpbiB0aGUgUUNEIG9yIFFDQy4KKyAqCisgKiBAcGFyYW0gICAgICAgcF90aWxlX25vICAgICAgICAgICAgICAgdGhlIHRpbGUgdG8gb3V0cHV0LgorICogQHBhcmFtICAgICAgIHBfY29tcF9ubyAgICAgICAgICAgICAgIHRoZSBjb21wb25lbnQgbnVtYmVyIHRvIG91dHB1dC4KKyAqIEBwYXJhbSAgICAgICBwX2RhdGEgICAgICAgICAgICAgICAgICB0aGUgZGF0YSBidWZmZXIuCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHBvaW50ZXIgdG8gdGhlIHNpemUgb2YgdGhlIGRhdGEgYnVmZmVyLCBpdCBpcyBjaGFuZ2VkIGJ5IHRoZSBmdW5jdGlvbi4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyAqCisqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfU1FjZF9TUWNjKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKKworLyoqCisgKiBVcGRhdGVzIHRoZSBUaWxlIExlbmd0aCBNYXJrZXIuCisgKi8KK3N0YXRpYyB2b2lkIG9wal9qMmtfdXBkYXRlX3RsbSAoIG9wal9qMmtfdCAqIHBfajJrLCBPUEpfVUlOVDMyIHBfdGlsZV9wYXJ0X3NpemUpOworCisvKioKKyAqIFJlYWRzIGEgU1FjZCBvciBTUWNjIGVsZW1lbnQsIGkuZS4gdGhlIHF1YW50aXphdGlvbiB2YWx1ZXMgb2YgYSBiYW5kIGluIHRoZSBRQ0Qgb3IgUUNDLgorICoKKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgSjJLIGNvZGVjLgorICogQHBhcmFtICAgICAgIGNvbXBubyAgICAgICAgICB0aGUgY29tcG9uZW50IG51bWJlciB0byBvdXRwdXQuCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGJ1ZmZlci4KKyAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgcG9pbnRlciB0byB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBidWZmZXIsIGl0IGlzIGNoYW5nZWQgYnkgdGhlIGZ1bmN0aW9uLgorICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorICoKKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX1NRY2RfU1FjYyggb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNvbXBubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKy8qKgorICogQ29waWVzIHRoZSB0aWxlIGNvbXBvbmVudCBwYXJhbWV0ZXJzIG9mIGFsbCB0aGUgY29tcG9uZW50IGZyb20gdGhlIGZpcnN0IHRpbGUgY29tcG9uZW50LgorICoKKyAqIEBwYXJhbSAgICAgICAgICAgICAgIHBfajJrICAgICAgICAgICB0aGUgSjJrIGNvZGVjLgorICovCitzdGF0aWMgdm9pZCBvcGpfajJrX2NvcHlfdGlsZV9jb21wb25lbnRfcGFyYW1ldGVycyggb3BqX2oya190ICpwX2oyayApOworCisvKioKKyAqIENvcGllcyB0aGUgdGlsZSBxdWFudGl6YXRpb24gcGFyYW1ldGVycyBvZiBhbGwgdGhlIGNvbXBvbmVudCBmcm9tIHRoZSBmaXJzdCB0aWxlIGNvbXBvbmVudC4KKyAqCisgKiBAcGFyYW0gICAgICAgICAgICAgICBwX2oyayAgICAgICAgICAgdGhlIEoyayBjb2RlYy4KKyAqLworc3RhdGljIHZvaWQgb3BqX2oya19jb3B5X3RpbGVfcXVhbnRpemF0aW9uX3BhcmFtZXRlcnMoIG9wal9qMmtfdCAqcF9qMmsgKTsKKworLyoqCisgKiBSZWFkcyB0aGUgdGlsZXMuCisgKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2RlY29kZV90aWxlcyAoICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOworCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19wcmVfd3JpdGVfdGlsZSAoIG9wal9qMmtfdCAqIHBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfdXBkYXRlX2ltYWdlX2RhdGEgKG9wal90Y2RfdCAqIHBfdGNkLCBPUEpfQllURSAqIHBfZGF0YSwgb3BqX2ltYWdlX3QqIHBfb3V0cHV0X2ltYWdlKTsKKworc3RhdGljIHZvaWQgb3BqX2dldF90aWxlX2RpbWVuc2lvbnMob3BqX2ltYWdlX3QgKiBsX2ltYWdlLAorCQkJCQkJCQkJCQkJCQkJCQkJb3BqX3RjZF90aWxlY29tcF90ICogbF90aWxlYywKKwkJCQkJCQkJCQkJCQkJCQkJCW9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wLAorCQkJCQkJCQkJCQkJCQkJCQkJT1BKX1VJTlQzMiogbF9zaXplX2NvbXAsCisJCQkJCQkJCQkJCQkJCQkJCQlPUEpfVUlOVDMyKiBsX3dpZHRoLAorCQkJCQkJCQkJCQkJCQkJCQkJT1BKX1VJTlQzMiogbF9oZWlnaHQsCisJCQkJCQkJCQkJCQkJCQkJCQlPUEpfVUlOVDMyKiBsX29mZnNldF94LAorCQkJCQkJCQkJCQkJCQkJCQkJT1BKX1VJTlQzMiogbF9vZmZzZXRfeSwKKwkJCQkJCQkJCQkJCQkJCQkJCU9QSl9VSU5UMzIqIGxfaW1hZ2Vfd2lkdGgsCisJCQkJCQkJCQkJCQkJCQkJCQlPUEpfVUlOVDMyKiBsX3N0cmlkZSwKKwkJCQkJCQkJCQkJCQkJCQkJCU9QSl9VSU5UMzIqIGxfdGlsZV9vZmZzZXQpOworCitzdGF0aWMgdm9pZCBvcGpfajJrX2dldF90aWxlX2RhdGEgKG9wal90Y2RfdCAqIHBfdGNkLCBPUEpfQllURSAqIHBfZGF0YSk7CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3Bvc3Rfd3JpdGVfdGlsZSAob3BqX2oya190ICogcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKy8qKgorICogU2V0cyB1cCB0aGUgcHJvY2VkdXJlcyB0byBkbyBvbiB3cml0aW5nIGhlYWRlci4KKyAqIERldmVsb3BlcnMgd2FudGluZyB0byBleHRlbmQgdGhlIGxpYnJhcnkgY2FuIGFkZCB0aGVpciBvd24gd3JpdGluZyBwcm9jZWR1cmVzLgorICovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19zZXR1cF9oZWFkZXJfd3JpdGluZyAob3BqX2oya190ICpwX2oyaywgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfZmlyc3RfdGlsZV9wYXJ0KCAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RvdGFsX2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlciApOworCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9hbGxfdGlsZV9wYXJ0cyggICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdG90YWxfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyICk7CisKKy8qKgorICogR2V0cyB0aGUgb2Zmc2V0IG9mIHRoZSBoZWFkZXIuCisgKgorICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19nZXRfZW5kX2hlYWRlciggb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2FsbG9jYXRlX3RpbGVfZWxlbWVudF9jc3RyX2luZGV4KG9wal9qMmtfdCAqcF9qMmspOworCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qKgorICogV3JpdGVzIHRoZSBTT0MgbWFya2VyIChTdGFydCBPZiBDb2Rlc3RyZWFtKQorICoKKyAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfc29jKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworCisvKioKKyAqIFJlYWRzIGEgU09DIG1hcmtlciAoU3RhcnQgb2YgQ29kZXN0cmVhbSkKKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgIFhYWCBuZWVkcyBkYXRhCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9zb2MoICAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworCisvKioKKyAqIFdyaXRlcyB0aGUgU0laIG1hcmtlciAoaW1hZ2UgYW5kIHRpbGUgc2l6ZSkKKyAqCisgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgIEoySyBjb2RlYy4KKyAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgorICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX3NpeiggICAgICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworLyoqCisgKiBSZWFkcyBhIFNJWiBtYXJrZXIgKGltYWdlIGFuZCB0aWxlIHNpemUpCisgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgIHRoZSBqcGVnMjAwMCBmaWxlIGNvZGVjLgorICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFNJWiBib3guCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgU0laIG1hcmtlci4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3NpeihvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKKworLyoqCisgKiBXcml0ZXMgdGhlIENPTSBtYXJrZXIgKGNvbW1lbnQpCisgKgorICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIEoySyBjb2RlYy4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9jb20oICAgICAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworCisvKioKKyAqIFJlYWRzIGEgQ09NIG1hcmtlciAoY29tbWVudHMpCisgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgIHRoZSBqcGVnMjAwMCBmaWxlIGNvZGVjLgorICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENPTSBib3guCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgQ09NIG1hcmtlci4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX2NvbSAoICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisvKioKKyAqIFdyaXRlcyB0aGUgQ09EIG1hcmtlciAoQ29kaW5nIHN0eWxlIGRlZmF1bHQpCisgKgorICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIEoySyBjb2RlYy4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9jb2QoICAgICAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworCisvKioKKyAqIFJlYWRzIGEgQ09EIG1hcmtlciAoQ29kaW5nIFN0eWtlIGRlZmF1bHRzKQorICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENPRCBib3guCisgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgorICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENPRCBtYXJrZXIuCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX2NvZCAoICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKKworI2lmIDAKKy8qKgorICogV3JpdGVzIHRoZSBDT0MgbWFya2VyIChDb2Rpbmcgc3R5bGUgY29tcG9uZW50KQorICoKKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICBKMksgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9jb21wX25vICAgdGhlIGluZGV4IG9mIHRoZSBjb21wb25lbnQgdG8gb3V0cHV0LgorICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2NvYyggIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworI2VuZGlmCisKKyNpZiAwCisvKioKKyAqIFdyaXRlcyB0aGUgQ09DIG1hcmtlciAoQ29kaW5nIHN0eWxlIGNvbXBvbmVudCkKKyAqCisgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgSjJLIGNvZGVjLgorICogQHBhcmFtICAgICAgIHBfY29tcF9ubyAgICAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgY29tcG9uZW50IHRvIG91dHB1dC4KKyAqIEBwYXJhbSAgICAgICBwX2RhdGEgICAgICAgICAgRklYTUUgRE9DCisgKiBAcGFyYW0gICAgICAgcF9kYXRhX3dyaXR0ZW4gIEZJWE1FIERPQworICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisqLworc3RhdGljIHZvaWQgb3BqX2oya193cml0ZV9jb2NfaW5fbWVtb3J5KG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworI2VuZGlmCisKKy8qKgorICogR2V0cyB0aGUgbWF4aW11bSBzaXplIHRha2VuIGJ5IGEgY29jLgorICoKKyAqIEBwYXJhbSAgICAgICBwX2oyayAgIHRoZSBqcGVnMjAwMCBjb2RlYyB0byB1c2UuCisgKi8KK3N0YXRpYyBPUEpfVUlOVDMyIG9wal9qMmtfZ2V0X21heF9jb2Nfc2l6ZShvcGpfajJrX3QgKnBfajJrKTsKKworLyoqCisgKiBSZWFkcyBhIENPQyBtYXJrZXIgKENvZGluZyBTdHlsZSBDb21wb25lbnQpCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgQ09DIGJveC4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgQ09DIG1hcmtlci4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfY29jICggIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworLyoqCisgKiBXcml0ZXMgdGhlIFFDRCBtYXJrZXIgKHF1YW50aXphdGlvbiBkZWZhdWx0KQorICoKKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgICAgICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgorICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfcWNkKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworLyoqCisgKiBSZWFkcyBhIFFDRCBtYXJrZXIgKFF1YW50aXphdGlvbiBkZWZhdWx0cykKKyAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9kYXRhICAgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBRQ0QgYm94LgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KKyAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBRQ0QgbWFya2VyLgorICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9xY2QgKCAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworI2lmIDAKKy8qKgorICogV3JpdGVzIHRoZSBRQ0MgbWFya2VyIChxdWFudGl6YXRpb24gY29tcG9uZW50KQorICoKKyAqIEBwYXJhbSAgICAgICBwX2NvbXBfbm8gICAgICAgdGhlIGluZGV4IG9mIHRoZSBjb21wb25lbnQgdG8gb3V0cHV0LgorICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9xY2MoICAgICAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisjZW5kaWYKKworI2lmIDAKKy8qKgorICogV3JpdGVzIHRoZSBRQ0MgbWFya2VyIChxdWFudGl6YXRpb24gY29tcG9uZW50KQorICoKKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgSjJLIGNvZGVjLgorICogQHBhcmFtICAgICAgIHBfY29tcF9ubyAgICAgICB0aGUgaW5kZXggb2YgdGhlIGNvbXBvbmVudCB0byBvdXRwdXQuCisgKiBAcGFyYW0gICAgICAgcF9kYXRhICAgICAgICAgIEZJWE1FIERPQworICogQHBhcmFtICAgICAgIHBfZGF0YV93cml0dGVuICB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisqLworc3RhdGljIHZvaWQgb3BqX2oya193cml0ZV9xY2NfaW5fbWVtb3J5KG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworI2VuZGlmCisKKy8qKgorICogR2V0cyB0aGUgbWF4aW11bSBzaXplIHRha2VuIGJ5IGEgcWNjLgorICovCitzdGF0aWMgT1BKX1VJTlQzMiBvcGpfajJrX2dldF9tYXhfcWNjX3NpemUgKG9wal9qMmtfdCAqcF9qMmspOworCisvKioKKyAqIFJlYWRzIGEgUUNDIG1hcmtlciAoUXVhbnRpemF0aW9uIGNvbXBvbmVudCkKKyAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9kYXRhICAgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBRQ0MgYm94LgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KKyAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBRQ0MgbWFya2VyLgorICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9xY2MoICAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CisvKioKKyAqIFdyaXRlcyB0aGUgUE9DIG1hcmtlciAoUHJvZ3Jlc3Npb24gT3JkZXIgQ2hhbmdlKQorICoKKyAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgICAgICAgICAgSjJLIGNvZGVjLgorICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfcG9jKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKy8qKgorICogV3JpdGVzIHRoZSBQT0MgbWFya2VyIChQcm9ncmVzc2lvbiBPcmRlciBDaGFuZ2UpCisgKgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgIEoySyBjb2RlYy4KKyAqIEBwYXJhbSAgICAgICBwX2RhdGEgICAgICAgICBGSVhNRSBET0MKKyAqIEBwYXJhbSAgICAgICBwX2RhdGFfd3JpdHRlbiB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyAqLworc3RhdGljIHZvaWQgb3BqX2oya193cml0ZV9wb2NfaW5fbWVtb3J5KG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworLyoqCisgKiBHZXRzIHRoZSBtYXhpbXVtIHNpemUgdGFrZW4gYnkgdGhlIHdyaXRpbmcgb2YgYSBQT0MuCisgKi8KK3N0YXRpYyBPUEpfVUlOVDMyIG9wal9qMmtfZ2V0X21heF9wb2Nfc2l6ZShvcGpfajJrX3QgKnBfajJrKTsKKworLyoqCisgKiBSZWFkcyBhIFBPQyBtYXJrZXIgKFByb2dyZXNzaW9uIE9yZGVyIENoYW5nZSkKKyAqCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUE9DIGJveC4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUE9DIG1hcmtlci4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfcG9jICggIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworLyoqCisgKiBHZXRzIHRoZSBtYXhpbXVtIHNpemUgdGFrZW4gYnkgdGhlIHRvYyBoZWFkZXJzIG9mIGFsbCB0aGUgdGlsZSBwYXJ0cyBvZiBhbnkgZ2l2ZW4gdGlsZS4KKyAqLworc3RhdGljIE9QSl9VSU5UMzIgb3BqX2oya19nZXRfbWF4X3RvY19zaXplIChvcGpfajJrX3QgKnBfajJrKTsKKworLyoqCisgKiBHZXRzIHRoZSBtYXhpbXVtIHNpemUgdGFrZW4gYnkgdGhlIGhlYWRlcnMgb2YgdGhlIFNPVC4KKyAqCisgKiBAcGFyYW0gICAgICAgcF9qMmsgICB0aGUganBlZzIwMDAgY29kZWMgdG8gdXNlLgorICovCitzdGF0aWMgT1BKX1VJTlQzMiBvcGpfajJrX2dldF9zcGVjaWZpY19oZWFkZXJfc2l6ZXMob3BqX2oya190ICpwX2oyayk7CisKKy8qKgorICogUmVhZHMgYSBDUkcgbWFya2VyIChDb21wb25lbnQgcmVnaXN0cmF0aW9uKQorICoKKyAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9kYXRhICAgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBUTE0gYm94LgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KKyAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBUTE0gbWFya2VyLgorICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9jcmcgKCAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworLyoqCisgKiBSZWFkcyBhIFRMTSBtYXJrZXIgKFRpbGUgTGVuZ3RoIE1hcmtlcikKKyAqCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgVExNIGJveC4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgVExNIG1hcmtlci4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfdGxtICggIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOworCisvKioKKyAqIFdyaXRlcyB0aGUgdXBkYXRlZCB0bG0uCisgKgorICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV91cGRhdGVkX3RsbSggICAgICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworCisvKioKKyAqIFJlYWRzIGEgUExNIG1hcmtlciAoUGFja2V0IGxlbmd0aCwgbWFpbiBoZWFkZXIgbWFya2VyKQorICoKKyAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9kYXRhICAgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBUTE0gYm94LgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KKyAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBUTE0gbWFya2VyLgorICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9wbG0gKCAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CisvKioKKyAqIFJlYWRzIGEgUExUIG1hcmtlciAoUGFja2V0IGxlbmd0aCwgdGlsZS1wYXJ0IGhlYWRlcikKKyAqCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUExUIGJveC4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUExUIG1hcmtlci4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfcGx0ICggIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworLyoqCisgKiBSZWFkcyBhIFBQTSBtYXJrZXIgKFBhY2tlZCBoZWFkZXJzLCBtYWluIGhlYWRlcikKKyAqCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUE9DIGJveC4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUE9DIG1hcmtlci4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorICovCisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfcHBtICgKKwkJCQkJCQkJCQkJCQkJCQkJCSBvcGpfajJrX3QgKnBfajJrLAorCQkJCQkJCQkJCQkJCQkJCQkJIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKwkJCQkJCQkJCQkJCQkJCQkJCSBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCisJCQkJCQkJCQkJCQkJCQkJCQkgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKy8qKgorICogTWVyZ2VzIGFsbCBQUE0gbWFya2VycyByZWFkIChQYWNrZWQgaGVhZGVycywgbWFpbiBoZWFkZXIpCisgKgorICogQHBhcmFtICAgICAgIHBfY3AgICAgICBtYWluIGNvZGluZyBwYXJhbWV0ZXJzLgorICogQHBhcmFtICAgICAgIHBfbWFuYWdlciB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorICovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19tZXJnZV9wcG0gKCBvcGpfY3BfdCAqcF9jcCwgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKy8qKgorICogUmVhZHMgYSBQUFQgbWFya2VyIChQYWNrZWQgcGFja2V0IGhlYWRlcnMsIHRpbGUtcGFydCBoZWFkZXIpCisgKgorICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFBQVCBib3guCisgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgorICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFBQVCBtYXJrZXIuCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3BwdCAoICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKy8qKgorICogTWVyZ2VzIGFsbCBQUFQgbWFya2VycyByZWFkIChQYWNrZWQgaGVhZGVycywgdGlsZS1wYXJ0IGhlYWRlcikKKyAqCisgKiBAcGFyYW0gICAgICAgcF90Y3AgICB0aGUgdGlsZS4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorICovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19tZXJnZV9wcHQgKCAgb3BqX3RjcF90ICpwX3RjcCwKKwkJCQkJCQkJCQkJCQkJCQkJICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKworLyoqCisgKiBXcml0ZXMgdGhlIFRMTSBtYXJrZXIgKFRpbGUgTGVuZ3RoIE1hcmtlcikKKyAqCisgKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICAgICAgICAgIEoySyBjb2RlYy4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX3RsbSggICAgICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKy8qKgorICogV3JpdGVzIHRoZSBTT1QgbWFya2VyIChTdGFydCBvZiB0aWxlLXBhcnQpCisgKgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgSjJLIGNvZGVjLgorICogQHBhcmFtICAgICAgIHBfZGF0YSAgICAgICAgICAgRklYTUUgRE9DCisgKiBAcGFyYW0gICAgICAgcF9kYXRhX3dyaXR0ZW4gICBGSVhNRSBET0MKKyAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfc290KCAgICAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworCisvKioKKyAqIFJlYWRzIHZhbHVlcyBmcm9tIGEgU09UIG1hcmtlciAoU3RhcnQgb2YgdGlsZS1wYXJ0KQorICoKKyAqIHRoZSBqMmsgZGVjb2RlciBzdGF0ZSBpcyBub3QgYWZmZWN0ZWQuIE5vIHNpZGUgZWZmZWN0cywgbm8gY2hlY2tzIGV4Y2VwdCBmb3IgcF9oZWFkZXJfc2l6ZS4KKyAqCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgU09UIG1hcmtlci4KKyAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBTT1QgbWFya2VyLgorICogQHBhcmFtICAgICAgIHBfdGlsZV9ubyAgICAgICBJc290LgorICogQHBhcmFtICAgICAgIHBfdG90X2xlbiAgICAgICBQc290LgorICogQHBhcmFtICAgICAgIHBfY3VycmVudF9wYXJ0ICBUUHNvdC4KKyAqIEBwYXJhbSAgICAgICBwX251bV9wYXJ0cyAgICAgVE5zb3QuCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisgKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2dldF9zb3RfdmFsdWVzKE9QSl9CWVRFICogIHBfaGVhZGVyX2RhdGEsCisJCQkJCQkJCQkJCQkJCQkJCQkJIE9QSl9VSU5UMzIgIHBfaGVhZGVyX3NpemUsCisJCQkJCQkJCQkJCQkJCQkJCQkJIE9QSl9VSU5UMzIqIHBfdGlsZV9ubywKKwkJCQkJCQkJCQkJCQkJCQkJCQkgT1BKX1VJTlQzMiogcF90b3RfbGVuLAorCQkJCQkJCQkJCQkJCQkJCQkJCSBPUEpfVUlOVDMyKiBwX2N1cnJlbnRfcGFydCwKKwkJCQkJCQkJCQkJCQkJCQkJCQkgT1BKX1VJTlQzMiogcF9udW1fcGFydHMsCisJCQkJCQkJCQkJCQkJCQkJCQkJIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworLyoqCisgKiBSZWFkcyBhIFNPVCBtYXJrZXIgKFN0YXJ0IG9mIHRpbGUtcGFydCkKKyAqCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgU09UIG1hcmtlci4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgorICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFBQVCBtYXJrZXIuCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9zb3QgKCAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworLyoqCisgKiBXcml0ZXMgdGhlIFNPRCBtYXJrZXIgKFN0YXJ0IG9mIGRhdGEpCisgKgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgSjJLIGNvZGVjLgorICogQHBhcmFtICAgICAgIHBfdGlsZV9jb2RlciAgICAgICAgRklYTUUgRE9DCisgKiBAcGFyYW0gICAgICAgcF9kYXRhICAgICAgICAgICAgICBGSVhNRSBET0MKKyAqIEBwYXJhbSAgICAgICBwX2RhdGFfd3JpdHRlbiAgICAgIEZJWE1FIERPQworICogQHBhcmFtICAgICAgIHBfdG90YWxfZGF0YV9zaXplICAgRklYTUUgRE9DCisgKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX3NvZCggICAgICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90ICogcF90aWxlX2NvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdG90YWxfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKy8qKgorICogUmVhZHMgYSBTT0QgbWFya2VyIChTdGFydCBPZiBEYXRhKQorICoKKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgICAgICAgICAgRklYTUUgRE9DCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3NvZCggICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKK3N0YXRpYyB2b2lkIG9wal9qMmtfdXBkYXRlX3RsbSAob3BqX2oya190ICogcF9qMmssIE9QSl9VSU5UMzIgcF90aWxlX3BhcnRfc2l6ZSApCit7CisgICAgICAgIG9wal93cml0ZV9ieXRlcyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90bG1fc290X29mZnNldHNfY3VycmVudCxwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLDEpOyAgICAgICAgICAgIC8qIFBTT1QgKi8KKyAgICAgICAgKytwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90bG1fc290X29mZnNldHNfY3VycmVudDsKKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdGxtX3NvdF9vZmZzZXRzX2N1cnJlbnQscF90aWxlX3BhcnRfc2l6ZSw0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUFNPVCAqLworICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90bG1fc290X29mZnNldHNfY3VycmVudCArPSA0OworfQorCisvKioKKyAqIFdyaXRlcyB0aGUgUkdOIG1hcmtlciAoUmVnaW9uIE9mIEludGVyZXN0KQorICoKKyAqIEBwYXJhbSAgICAgICBwX3RpbGVfbm8gICAgICAgICAgICAgICB0aGUgdGlsZSB0byBvdXRwdXQKKyAqIEBwYXJhbSAgICAgICBwX2NvbXBfbm8gICAgICAgICAgICAgICB0aGUgY29tcG9uZW50IHRvIG91dHB1dAorICogQHBhcmFtICAgICAgIG5iX2NvbXBzICAgICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cworICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9yZ24oICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29tcF9ubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbmJfY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworLyoqCisgKiBSZWFkcyBhIFJHTiBtYXJrZXIgKFJlZ2lvbiBPZiBJbnRlcmVzdCkKKyAqCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUE9DIGJveC4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUE9DIG1hcmtlci4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfcmduIChvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKy8qKgorICogV3JpdGVzIHRoZSBFT0MgbWFya2VyIChFbmQgb2YgQ29kZXN0cmVhbSkKKyAqCisgKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgICAgICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIEoySyBjb2RlYy4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2VvYyggICAgICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKyNpZiAwCisvKioKKyAqIFJlYWRzIGEgRU9DIG1hcmtlciAoRW5kIE9mIENvZGVzdHJlYW0pCisgKgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KKyAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICBGSVhNRSBET0MKKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfZW9jICggICAgICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKyNlbmRpZgorCisvKioKKyAqIFdyaXRlcyB0aGUgQ0JELU1DVC1NQ0MtTUNPIG1hcmtlcnMgKE11bHRpIGNvbXBvbmVudHMgdHJhbnNmb3JtKQorICoKKyAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfbWN0X2RhdGFfZ3JvdXAoICAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworCisvKioKKyAqIEluaXRzIHRoZSBJbmZvCisgKgorICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19pbml0X2luZm8oICAgICAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworCisvKioKK0FkZCBtYWluIGhlYWRlciBtYXJrZXIgaW5mb3JtYXRpb24KK0BwYXJhbSBjc3RyX2luZGV4ICAgIENvZGVzdHJlYW0gaW5mb3JtYXRpb24gc3RydWN0dXJlCitAcGFyYW0gdHlwZSAgICAgICAgIG1hcmtlciB0eXBlCitAcGFyYW0gcG9zICAgICAgICAgIGJ5dGUgb2Zmc2V0IG9mIG1hcmtlciBzZWdtZW50CitAcGFyYW0gbGVuICAgICAgICAgIGxlbmd0aCBvZiBtYXJrZXIgc2VnbWVudAorICovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19hZGRfbWhtYXJrZXIob3BqX2NvZGVzdHJlYW1faW5kZXhfdCAqY3N0cl9pbmRleCwgT1BKX1VJTlQzMiB0eXBlLCBPUEpfT0ZGX1QgcG9zLCBPUEpfVUlOVDMyIGxlbikgOworLyoqCitBZGQgdGlsZSBoZWFkZXIgbWFya2VyIGluZm9ybWF0aW9uCitAcGFyYW0gdGlsZW5vICAgICAgIHRpbGUgaW5kZXggbnVtYmVyCitAcGFyYW0gY3N0cl9pbmRleCAgIENvZGVzdHJlYW0gaW5mb3JtYXRpb24gc3RydWN0dXJlCitAcGFyYW0gdHlwZSAgICAgICAgIG1hcmtlciB0eXBlCitAcGFyYW0gcG9zICAgICAgICAgIGJ5dGUgb2Zmc2V0IG9mIG1hcmtlciBzZWdtZW50CitAcGFyYW0gbGVuICAgICAgICAgIGxlbmd0aCBvZiBtYXJrZXIgc2VnbWVudAorICovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19hZGRfdGxtYXJrZXIoT1BKX1VJTlQzMiB0aWxlbm8sIG9wal9jb2Rlc3RyZWFtX2luZGV4X3QgKmNzdHJfaW5kZXgsIE9QSl9VSU5UMzIgdHlwZSwgT1BKX09GRl9UIHBvcywgT1BKX1VJTlQzMiBsZW4pOworCisvKioKKyAqIFJlYWRzIGFuIHVua25vd24gbWFya2VyCisgKgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KKyAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICB0aGUgc3RyZWFtIG9iamVjdCB0byByZWFkIGZyb20uCisgKiBAcGFyYW0gICAgICAgb3V0cHV0X21hcmtlciAgICAgICAgICAgRklYTUUgRE9DCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyAqCisgKiBAcmV0dXJuICAgICAgdHJ1ZSAgICAgICAgICAgICAgICAgICAgaWYgdGhlIG1hcmtlciBjb3VsZCBiZSBkZWR1Y2VkLgorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfdW5rKCBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICpvdXRwdXRfbWFya2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworCisvKioKKyAqIFdyaXRlcyB0aGUgTUNUIG1hcmtlciAoTXVsdGlwbGUgQ29tcG9uZW50IFRyYW5zZm9ybSkKKyAqCisgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgIEoySyBjb2RlYy4KKyAqIEBwYXJhbSAgICAgICBwX21jdF9yZWNvcmQgICAgRklYTUUgRE9DCisgKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9tY3RfcmVjb3JkKCAgICAgICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX21jdF9kYXRhX3QgKiBwX21jdF9yZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKy8qKgorICogUmVhZHMgYSBNQ1QgbWFya2VyIChNdWx0aXBsZSBDb21wb25lbnQgVHJhbnNmb3JtKQorICoKKyAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9kYXRhICAgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBNQ1QgYm94LgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KKyAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBNQ1QgbWFya2VyLgorICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9tY3QgKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworLyoqCisgKiBXcml0ZXMgdGhlIE1DQyBtYXJrZXIgKE11bHRpcGxlIENvbXBvbmVudCBDb2xsZWN0aW9uKQorICoKKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9tY2NfcmVjb3JkICAgICAgICAgICAgRklYTUUgRE9DCisgKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgICAgICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgorICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfbWNjX3JlY29yZCggICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCAqIHBfbWNjX3JlY29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworLyoqCisgKiBSZWFkcyBhIE1DQyBtYXJrZXIgKE11bHRpcGxlIENvbXBvbmVudCBDb2xsZWN0aW9uKQorICoKKyAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9kYXRhICAgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBNQ0MgYm94LgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KKyAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBNQ0MgbWFya2VyLgorICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9tY2MgKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworLyoqCisgKiBXcml0ZXMgdGhlIE1DTyBtYXJrZXIgKE11bHRpcGxlIGNvbXBvbmVudCB0cmFuc2Zvcm1hdGlvbiBvcmRlcmluZykKKyAqCisgKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICAgICAgICAgIEoySyBjb2RlYy4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX21jbyggICAgICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKy8qKgorICogUmVhZHMgYSBNQ08gbWFya2VyIChNdWx0aXBsZSBDb21wb25lbnQgVHJhbnNmb3JtIE9yZGVyaW5nKQorICoKKyAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9kYXRhICAgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBNQ08gYm94LgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KKyAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBNQ08gbWFya2VyLgorICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9tY28gKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfYWRkX21jdChvcGpfdGNwX3QgKiBwX3RjcCwgb3BqX2ltYWdlX3QgKiBwX2ltYWdlLCBPUEpfVUlOVDMyIHBfaW5kZXgpOworCitzdGF0aWMgdm9pZCAgb3BqX2oya19yZWFkX2ludDE2X3RvX2Zsb2F0IChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSk7CitzdGF0aWMgdm9pZCAgb3BqX2oya19yZWFkX2ludDMyX3RvX2Zsb2F0IChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSk7CitzdGF0aWMgdm9pZCAgb3BqX2oya19yZWFkX2Zsb2F0MzJfdG9fZmxvYXQgKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLCB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKTsKK3N0YXRpYyB2b2lkICBvcGpfajJrX3JlYWRfZmxvYXQ2NF90b19mbG9hdCAoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pOworCitzdGF0aWMgdm9pZCAgb3BqX2oya19yZWFkX2ludDE2X3RvX2ludDMyIChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSk7CitzdGF0aWMgdm9pZCAgb3BqX2oya19yZWFkX2ludDMyX3RvX2ludDMyIChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSk7CitzdGF0aWMgdm9pZCAgb3BqX2oya19yZWFkX2Zsb2F0MzJfdG9faW50MzIgKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLCB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKTsKK3N0YXRpYyB2b2lkICBvcGpfajJrX3JlYWRfZmxvYXQ2NF90b19pbnQzMiAoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pOworCitzdGF0aWMgdm9pZCAgb3BqX2oya193cml0ZV9mbG9hdF90b19pbnQxNiAoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pOworc3RhdGljIHZvaWQgIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9faW50MzIgKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLCB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKTsKK3N0YXRpYyB2b2lkICBvcGpfajJrX3dyaXRlX2Zsb2F0X3RvX2Zsb2F0IChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSk7CitzdGF0aWMgdm9pZCAgb3BqX2oya193cml0ZV9mbG9hdF90b19mbG9hdDY0IChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSk7CisKKy8qKgorICogRW5kcyB0aGUgZW5jb2RpbmcsIGkuZS4gZnJlZXMgbWVtb3J5LgorICoKKyAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCisgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgSjJLIGNvZGVjLgorICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfZW5kX2VuY29kaW5nKCAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworCisvKioKKyAqIFdyaXRlcyB0aGUgQ0JEIG1hcmtlciAoQ29tcG9uZW50IGJpdCBkZXB0aCBkZWZpbml0aW9uKQorICoKKyAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgICAgICAgICAgSjJLIGNvZGVjLgorICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfY2JkKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworCisvKioKKyAqIFJlYWRzIGEgQ0JEIG1hcmtlciAoQ29tcG9uZW50IGJpdCBkZXB0aCBkZWZpbml0aW9uKQorICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENCRCBib3guCisgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgorICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENCRCBtYXJrZXIuCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX2NiZCAoICAgICAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CisKKyNpZiAwCisvKioKKyAqIFdyaXRlcyBDT0MgbWFya2VyIGZvciBlYWNoIGNvbXBvbmVudC4KKyAqCisgKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgICAgICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIEoySyBjb2RlYy4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2FsbF9jb2MoIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKyNlbmRpZgorCisjaWYgMAorLyoqCisgKiBXcml0ZXMgUUNDIG1hcmtlciBmb3IgZWFjaCBjb21wb25lbnQuCisgKgorICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9hbGxfcWNjKCBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisjZW5kaWYKKworLyoqCisgKiBXcml0ZXMgcmVnaW9ucyBvZiBpbnRlcmVzdHMuCisgKgorICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9yZWdpb25zKCAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworCisvKioKKyAqIFdyaXRlcyBFUEMgPz8/PworICoKKyAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCisgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgSjJLIGNvZGVjLgorICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfZXBjKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKy8qKgorICogQ2hlY2tzIHRoZSBwcm9ncmVzc2lvbiBvcmRlciBjaGFuZ2VzIHZhbHVlcy4gVGVsbHMgb2YgdGhlIHBvYyBnaXZlbiBhcyBpbnB1dCBhcmUgdmFsaWQuCisgKiBBIG5pY2UgbWVzc2FnZSBpcyBvdXRwdXR0ZWQgYXQgZXJyb3JzLgorICoKKyAqIEBwYXJhbSAgICAgICBwX3BvY3MgICAgICAgICAgICAgICAgICB0aGUgcHJvZ3Jlc3Npb24gb3JkZXIgY2hhbmdlcy4KKyAqIEBwYXJhbSAgICAgICBwX25iX3BvY3MgICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHByb2dyZXNzaW9uIG9yZGVyIGNoYW5nZXMuCisgKiBAcGFyYW0gICAgICAgcF9uYl9yZXNvbHV0aW9ucyAgICAgICAgdGhlIG51bWJlciBvZiByZXNvbHV0aW9ucy4KKyAqIEBwYXJhbSAgICAgICBudW1jb21wcyAgICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMKKyAqIEBwYXJhbSAgICAgICBudW1sYXllcnMgICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGxheWVycy4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorICoKKyAqIEByZXR1cm4gICAgICB0cnVlIGlmIHRoZSBwb2NzIGFyZSB2YWxpZC4KKyAqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfY2hlY2tfcG9jX3ZhbCggIGNvbnN0IG9wal9wb2NfdCAqcF9wb2NzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9uYl9wb2NzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9uYl9yZXNvbHV0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG51bWNvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbnVtbGF5ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CisKKy8qKgorICogR2V0cyB0aGUgbnVtYmVyIG9mIHRpbGUgcGFydHMgdXNlZCBmb3IgdGhlIGdpdmVuIGNoYW5nZSBvZiBwcm9ncmVzc2lvbiAoaWYgYW55KSBhbmQgdGhlIGdpdmVuIHRpbGUuCisgKgorICogQHBhcmFtICAgICAgICAgICAgICAgY3AgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvZGluZyBwYXJhbWV0ZXJzLgorICogQHBhcmFtICAgICAgICAgICAgICAgcGlubyAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGdpdmVuIHBvYyAoaS5lLiBpdHMgcG9zaXRpb24gaW4gdGhlIGNvZGluZyBwYXJhbWV0ZXIpLgorICogQHBhcmFtICAgICAgICAgICAgICAgdGlsZW5vICAgICAgICAgIHRoZSBnaXZlbiB0aWxlLgorICoKKyAqIEByZXR1cm4gICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgdGlsZSBwYXJ0cy4KKyAqLworc3RhdGljIE9QSl9VSU5UMzIgb3BqX2oya19nZXRfbnVtX3RwKCBvcGpfY3BfdCAqY3AsIE9QSl9VSU5UMzIgcGlubywgT1BKX1VJTlQzMiB0aWxlbm8pOworCisvKioKKyAqIENhbGN1bGF0ZXMgdGhlIHRvdGFsIG51bWJlciBvZiB0aWxlIHBhcnRzIG5lZWRlZCBieSB0aGUgZW5jb2RlciB0bworICogZW5jb2RlIHN1Y2ggYW4gaW1hZ2UuIElmIG5vdCBlbm91Z2ggbWVtb3J5IGlzIGF2YWlsYWJsZSwgdGhlbiB0aGUgZnVuY3Rpb24gcmV0dXJuIGZhbHNlLgorICoKKyAqIEBwYXJhbSAgICAgICBwX25iX3RpbGVzICAgICAgcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgbnVtYmVyIG9mIHRpbGUgcGFydHMuCisgKiBAcGFyYW0gICAgICAgY3AgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvZGluZyBwYXJhbWV0ZXJzIGZvciB0aGUgaW1hZ2UuCisgKiBAcGFyYW0gICAgICAgaW1hZ2UgICAgICAgICAgIHRoZSBpbWFnZSB0byBlbmNvZGUuCisgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIHBfajJrIGVuY29kZXIuCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisgKgorICogQHJldHVybiB0cnVlIGlmIHRoZSBmdW5jdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2UgZWxzZS4KKyAqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfY2FsY3VsYXRlX3RwKCAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NwX3QgKmNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX25iX3RpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90ICppbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOworCitzdGF0aWMgdm9pZCBvcGpfajJrX2R1bXBfTUhfaW5mbyhvcGpfajJrX3QqIHBfajJrLCBGSUxFKiBvdXRfc3RyZWFtKTsKKworc3RhdGljIHZvaWQgb3BqX2oya19kdW1wX01IX2luZGV4KG9wal9qMmtfdCogcF9qMmssIEZJTEUqIG91dF9zdHJlYW0pOworCitzdGF0aWMgb3BqX2NvZGVzdHJlYW1faW5kZXhfdCogb3BqX2oya19jcmVhdGVfY3N0cl9pbmRleCh2b2lkKTsKKworc3RhdGljIE9QSl9GTE9BVDMyIG9wal9qMmtfZ2V0X3RwX3N0cmlkZSAob3BqX3RjcF90ICogcF90Y3ApOworCitzdGF0aWMgT1BKX0ZMT0FUMzIgb3BqX2oya19nZXRfZGVmYXVsdF9zdHJpZGUgKG9wal90Y3BfdCAqIHBfdGNwKTsKKworc3RhdGljIGludCBvcGpfajJrX2luaXRpYWxpc2VfNEtfcG9jKG9wal9wb2NfdCAqUE9DLCBpbnQgbnVtcmVzKTsKKworc3RhdGljIHZvaWQgb3BqX2oya19zZXRfY2luZW1hX3BhcmFtZXRlcnMob3BqX2NwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMsIG9wal9pbWFnZV90ICppbWFnZSwgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIpOworCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19pc19jaW5lbWFfY29tcGxpYW50KG9wal9pbWFnZV90ICppbWFnZSwgT1BKX1VJTlQxNiByc2l6LCBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcik7CisKKy8qKgorICogQ2hlY2tzIGZvciBpbnZhbGlkIG51bWJlciBvZiB0aWxlLXBhcnRzIGluIFNPVCBtYXJrZXIgKFRQc290PT1UTnNvdCkuIFNlZSBpc3N1ZSAyNTQuCisgKgorICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICAgICAgdGhlIHN0cmVhbSB0byByZWFkIGRhdGEgZnJvbS4KKyAqIEBwYXJhbSAgICAgICB0aWxlX25vICAgICAgICAgICAgIHRpbGUgbnVtYmVyIHdlJ3JlIGxvb2tpbmcgZm9yLgorICogQHBhcmFtICAgICAgIHBfY29ycmVjdGlvbl9uZWVkZWQgb3V0cHV0IHZhbHVlLiBpZiB0cnVlLCBub24gY29uZm9ybWFudCBjb2Rlc3RyZWFtIG5lZWRzIFROc290IGNvcnJlY3Rpb24uCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisgKgorICogQHJldHVybiB0cnVlIGlmIHRoZSBmdW5jdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2UgZWxzZS4KKyAqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfbmVlZF9uYl90aWxlX3BhcnRzX2NvcnJlY3Rpb24ob3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLCBPUEpfVUlOVDMyIHRpbGVfbm8sIE9QSl9CT09MKiBwX2NvcnJlY3Rpb25fbmVlZGVkLCBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworLypAfSovCisKKy8qQH0qLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordHlwZWRlZiBzdHJ1Y3QgajJrX3Byb2dfb3JkZXJ7CisgICAgICAgIE9QSl9QUk9HX09SREVSIGVudW1fcHJvZzsKKyAgICAgICAgY2hhciBzdHJfcHJvZ1s1XTsKK31qMmtfcHJvZ19vcmRlcl90OworCitzdGF0aWMgajJrX3Byb2dfb3JkZXJfdCBqMmtfcHJvZ19vcmRlcl9saXN0W10gPSB7CisgICAgICAgIHtPUEpfQ1BSTCwgIkNQUkwifSwKKyAgICAgICAge09QSl9MUkNQLCAiTFJDUCJ9LAorICAgICAgICB7T1BKX1BDUkwsICJQQ1JMIn0sCisgICAgICAgIHtPUEpfUkxDUCwgIlJMQ1AifSwKKyAgICAgICAge09QSl9SUENMLCAiUlBDTCJ9LAorICAgICAgICB7KE9QSl9QUk9HX09SREVSKS0xLCAiIn0KK307CisKKy8qKgorICogRklYTUUgRE9DCisgKi8KK3N0YXRpYyBjb25zdCBPUEpfVUlOVDMyIE1DVF9FTEVNRU5UX1NJWkUgW10gPQoreworICAgICAgICAyLAorICAgICAgICA0LAorICAgICAgICA0LAorICAgICAgICA4Cit9OworCit0eXBlZGVmIHZvaWQgKCogb3BqX2oya19tY3RfZnVuY3Rpb24pIChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSk7CisKK3N0YXRpYyBjb25zdCBvcGpfajJrX21jdF9mdW5jdGlvbiBqMmtfbWN0X3JlYWRfZnVuY3Rpb25zX3RvX2Zsb2F0IFtdID0KK3sKKyAgICAgICAgb3BqX2oya19yZWFkX2ludDE2X3RvX2Zsb2F0LAorICAgICAgICBvcGpfajJrX3JlYWRfaW50MzJfdG9fZmxvYXQsCisgICAgICAgIG9wal9qMmtfcmVhZF9mbG9hdDMyX3RvX2Zsb2F0LAorICAgICAgICBvcGpfajJrX3JlYWRfZmxvYXQ2NF90b19mbG9hdAorfTsKKworc3RhdGljIGNvbnN0IG9wal9qMmtfbWN0X2Z1bmN0aW9uIGoya19tY3RfcmVhZF9mdW5jdGlvbnNfdG9faW50MzIgW10gPQoreworICAgICAgICBvcGpfajJrX3JlYWRfaW50MTZfdG9faW50MzIsCisgICAgICAgIG9wal9qMmtfcmVhZF9pbnQzMl90b19pbnQzMiwKKyAgICAgICAgb3BqX2oya19yZWFkX2Zsb2F0MzJfdG9faW50MzIsCisgICAgICAgIG9wal9qMmtfcmVhZF9mbG9hdDY0X3RvX2ludDMyCit9OworCitzdGF0aWMgY29uc3Qgb3BqX2oya19tY3RfZnVuY3Rpb24gajJrX21jdF93cml0ZV9mdW5jdGlvbnNfZnJvbV9mbG9hdCBbXSA9Cit7CisgICAgICAgIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9faW50MTYsCisgICAgICAgIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9faW50MzIsCisgICAgICAgIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9fZmxvYXQsCisgICAgICAgIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9fZmxvYXQ2NAorfTsKKwordHlwZWRlZiBzdHJ1Y3Qgb3BqX2RlY19tZW1vcnlfbWFya2VyX2hhbmRsZXIKK3sKKyAgICAgICAgLyoqIG1hcmtlciB2YWx1ZSAqLworICAgICAgICBPUEpfVUlOVDMyIGlkOworICAgICAgICAvKiogdmFsdWUgb2YgdGhlIHN0YXRlIHdoZW4gdGhlIG1hcmtlciBjYW4gYXBwZWFyICovCisgICAgICAgIE9QSl9VSU5UMzIgc3RhdGVzOworICAgICAgICAvKiogYWN0aW9uIGxpbmtlZCB0byB0aGUgbWFya2VyICovCisgICAgICAgIE9QSl9CT09MICgqaGFuZGxlcikgKCAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK30KK29wal9kZWNfbWVtb3J5X21hcmtlcl9oYW5kbGVyX3Q7CisKK3N0YXRpYyBjb25zdCBvcGpfZGVjX21lbW9yeV9tYXJrZXJfaGFuZGxlcl90IGoya19tZW1vcnlfbWFya2VyX2hhbmRsZXJfdGFiIFtdID0KK3sKKyAge0oyS19NU19TT1QsIEoyS19TVEFURV9NSCB8IEoyS19TVEFURV9UUEhTT1QsIG9wal9qMmtfcmVhZF9zb3R9LAorICB7SjJLX01TX0NPRCwgSjJLX1NUQVRFX01IIHwgSjJLX1NUQVRFX1RQSCwgb3BqX2oya19yZWFkX2NvZH0sCisgIHtKMktfTVNfQ09DLCBKMktfU1RBVEVfTUggfCBKMktfU1RBVEVfVFBILCBvcGpfajJrX3JlYWRfY29jfSwKKyAge0oyS19NU19SR04sIEoyS19TVEFURV9NSCB8IEoyS19TVEFURV9UUEgsIG9wal9qMmtfcmVhZF9yZ259LAorICB7SjJLX01TX1FDRCwgSjJLX1NUQVRFX01IIHwgSjJLX1NUQVRFX1RQSCwgb3BqX2oya19yZWFkX3FjZH0sCisgIHtKMktfTVNfUUNDLCBKMktfU1RBVEVfTUggfCBKMktfU1RBVEVfVFBILCBvcGpfajJrX3JlYWRfcWNjfSwKKyAge0oyS19NU19QT0MsIEoyS19TVEFURV9NSCB8IEoyS19TVEFURV9UUEgsIG9wal9qMmtfcmVhZF9wb2N9LAorICB7SjJLX01TX1NJWiwgSjJLX1NUQVRFX01IU0laLCBvcGpfajJrX3JlYWRfc2l6fSwKKyAge0oyS19NU19UTE0sIEoyS19TVEFURV9NSCwgb3BqX2oya19yZWFkX3RsbX0sCisgIHtKMktfTVNfUExNLCBKMktfU1RBVEVfTUgsIG9wal9qMmtfcmVhZF9wbG19LAorICB7SjJLX01TX1BMVCwgSjJLX1NUQVRFX1RQSCwgb3BqX2oya19yZWFkX3BsdH0sCisgIHtKMktfTVNfUFBNLCBKMktfU1RBVEVfTUgsIG9wal9qMmtfcmVhZF9wcG19LAorICB7SjJLX01TX1BQVCwgSjJLX1NUQVRFX1RQSCwgb3BqX2oya19yZWFkX3BwdH0sCisgIHtKMktfTVNfU09QLCAwLCAwfSwKKyAge0oyS19NU19DUkcsIEoyS19TVEFURV9NSCwgb3BqX2oya19yZWFkX2NyZ30sCisgIHtKMktfTVNfQ09NLCBKMktfU1RBVEVfTUggfCBKMktfU1RBVEVfVFBILCBvcGpfajJrX3JlYWRfY29tfSwKKyAge0oyS19NU19NQ1QsIEoyS19TVEFURV9NSCB8IEoyS19TVEFURV9UUEgsIG9wal9qMmtfcmVhZF9tY3R9LAorICB7SjJLX01TX0NCRCwgSjJLX1NUQVRFX01IICwgb3BqX2oya19yZWFkX2NiZH0sCisgIHtKMktfTVNfTUNDLCBKMktfU1RBVEVfTUggfCBKMktfU1RBVEVfVFBILCBvcGpfajJrX3JlYWRfbWNjfSwKKyAge0oyS19NU19NQ08sIEoyS19TVEFURV9NSCB8IEoyS19TVEFURV9UUEgsIG9wal9qMmtfcmVhZF9tY299LAorI2lmZGVmIFVTRV9KUFdMCisjaWZkZWYgVE9ET19NUyAvKiByZW1vdmUgdGhlc2UgZnVuY3Rpb25zIHdoaWNoIGFyZSBub3QgY29tbXBhdGlibGUgd2l0aCB0aGUgdjIgQVBJICovCisgIHtKMktfTVNfRVBDLCBKMktfU1RBVEVfTUggfCBKMktfU1RBVEVfVFBILCBqMmtfcmVhZF9lcGN9LAorICB7SjJLX01TX0VQQiwgSjJLX1NUQVRFX01IIHwgSjJLX1NUQVRFX1RQSCwgajJrX3JlYWRfZXBifSwKKyAge0oyS19NU19FU0QsIEoyS19TVEFURV9NSCB8IEoyS19TVEFURV9UUEgsIGoya19yZWFkX2VzZH0sCisgIHtKMktfTVNfUkVELCBKMktfU1RBVEVfTUggfCBKMktfU1RBVEVfVFBILCBqMmtfcmVhZF9yZWR9LAorI2VuZGlmCisjZW5kaWYgLyogVVNFX0pQV0wgKi8KKyNpZmRlZiBVU0VfSlBTRUMKKyAge0oyS19NU19TRUMsIEoyS19ERUNfU1RBVEVfTUgsIGoya19yZWFkX3NlY30sCisgIHtKMktfTVNfSU5TRUMsIDAsIGoya19yZWFkX2luc2VjfQorI2VuZGlmIC8qIFVTRV9KUFNFQyAqLworICB7SjJLX01TX1VOSywgSjJLX1NUQVRFX01IIHwgSjJLX1NUQVRFX1RQSCwgMH0vKm9wal9qMmtfcmVhZF91bmsgaXMgZGlyZWN0bHkgdXNlZCovCit9OworCitzdGF0aWMgdm9pZCAgb3BqX2oya19yZWFkX2ludDE2X3RvX2Zsb2F0IChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSkKK3sKKyAgICAgICAgT1BKX0JZVEUgKiBsX3NyY19kYXRhID0gKE9QSl9CWVRFICopIHBfc3JjX2RhdGE7CisgICAgICAgIE9QSl9GTE9BVDMyICogbF9kZXN0X2RhdGEgPSAoT1BKX0ZMT0FUMzIgKikgcF9kZXN0X2RhdGE7CisgICAgICAgIE9QSl9VSU5UMzIgaTsKKyAgICAgICAgT1BKX1VJTlQzMiBsX3RlbXA7CisKKyAgICAgICAgZm9yIChpPTA7aTxwX25iX2VsZW07KytpKSB7CisgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMobF9zcmNfZGF0YSwmbF90ZW1wLDIpOworCisgICAgICAgICAgICAgICAgbF9zcmNfZGF0YSs9c2l6ZW9mKE9QSl9JTlQxNik7CisKKyAgICAgICAgICAgICAgICAqKGxfZGVzdF9kYXRhKyspID0gKE9QSl9GTE9BVDMyKSBsX3RlbXA7CisgICAgICAgIH0KK30KKworc3RhdGljIHZvaWQgIG9wal9qMmtfcmVhZF9pbnQzMl90b19mbG9hdCAoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pCit7CisgICAgICAgIE9QSl9CWVRFICogbF9zcmNfZGF0YSA9IChPUEpfQllURSAqKSBwX3NyY19kYXRhOworICAgICAgICBPUEpfRkxPQVQzMiAqIGxfZGVzdF9kYXRhID0gKE9QSl9GTE9BVDMyICopIHBfZGVzdF9kYXRhOworICAgICAgICBPUEpfVUlOVDMyIGk7CisgICAgICAgIE9QSl9VSU5UMzIgbF90ZW1wOworCisgICAgICAgIGZvciAoaT0wO2k8cF9uYl9lbGVtOysraSkgeworICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKGxfc3JjX2RhdGEsJmxfdGVtcCw0KTsKKworICAgICAgICAgICAgICAgIGxfc3JjX2RhdGErPXNpemVvZihPUEpfSU5UMzIpOworCisgICAgICAgICAgICAgICAgKihsX2Rlc3RfZGF0YSsrKSA9IChPUEpfRkxPQVQzMikgbF90ZW1wOworICAgICAgICB9Cit9CisKK3N0YXRpYyB2b2lkICBvcGpfajJrX3JlYWRfZmxvYXQzMl90b19mbG9hdCAoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pCit7CisgICAgICAgIE9QSl9CWVRFICogbF9zcmNfZGF0YSA9IChPUEpfQllURSAqKSBwX3NyY19kYXRhOworICAgICAgICBPUEpfRkxPQVQzMiAqIGxfZGVzdF9kYXRhID0gKE9QSl9GTE9BVDMyICopIHBfZGVzdF9kYXRhOworICAgICAgICBPUEpfVUlOVDMyIGk7CisgICAgICAgIE9QSl9GTE9BVDMyIGxfdGVtcDsKKworICAgICAgICBmb3IgKGk9MDtpPHBfbmJfZWxlbTsrK2kpIHsKKyAgICAgICAgICAgICAgICBvcGpfcmVhZF9mbG9hdChsX3NyY19kYXRhLCZsX3RlbXApOworCisgICAgICAgICAgICAgICAgbF9zcmNfZGF0YSs9c2l6ZW9mKE9QSl9GTE9BVDMyKTsKKworICAgICAgICAgICAgICAgICoobF9kZXN0X2RhdGErKykgPSBsX3RlbXA7CisgICAgICAgIH0KK30KKworc3RhdGljIHZvaWQgIG9wal9qMmtfcmVhZF9mbG9hdDY0X3RvX2Zsb2F0IChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSkKK3sKKyAgICAgICAgT1BKX0JZVEUgKiBsX3NyY19kYXRhID0gKE9QSl9CWVRFICopIHBfc3JjX2RhdGE7CisgICAgICAgIE9QSl9GTE9BVDMyICogbF9kZXN0X2RhdGEgPSAoT1BKX0ZMT0FUMzIgKikgcF9kZXN0X2RhdGE7CisgICAgICAgIE9QSl9VSU5UMzIgaTsKKyAgICAgICAgT1BKX0ZMT0FUNjQgbF90ZW1wOworCisgICAgICAgIGZvciAoaT0wO2k8cF9uYl9lbGVtOysraSkgeworICAgICAgICAgICAgICAgIG9wal9yZWFkX2RvdWJsZShsX3NyY19kYXRhLCZsX3RlbXApOworCisgICAgICAgICAgICAgICAgbF9zcmNfZGF0YSs9c2l6ZW9mKE9QSl9GTE9BVDY0KTsKKworICAgICAgICAgICAgICAgICoobF9kZXN0X2RhdGErKykgPSAoT1BKX0ZMT0FUMzIpIGxfdGVtcDsKKyAgICAgICAgfQorfQorCitzdGF0aWMgdm9pZCAgb3BqX2oya19yZWFkX2ludDE2X3RvX2ludDMyIChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSkKK3sKKyAgICAgICAgT1BKX0JZVEUgKiBsX3NyY19kYXRhID0gKE9QSl9CWVRFICopIHBfc3JjX2RhdGE7CisgICAgICAgIE9QSl9JTlQzMiAqIGxfZGVzdF9kYXRhID0gKE9QSl9JTlQzMiAqKSBwX2Rlc3RfZGF0YTsKKyAgICAgICAgT1BKX1VJTlQzMiBpOworICAgICAgICBPUEpfVUlOVDMyIGxfdGVtcDsKKworICAgICAgICBmb3IgKGk9MDtpPHBfbmJfZWxlbTsrK2kpIHsKKyAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhsX3NyY19kYXRhLCZsX3RlbXAsMik7CisKKyAgICAgICAgICAgICAgICBsX3NyY19kYXRhKz1zaXplb2YoT1BKX0lOVDE2KTsKKworICAgICAgICAgICAgICAgICoobF9kZXN0X2RhdGErKykgPSAoT1BKX0lOVDMyKSBsX3RlbXA7CisgICAgICAgIH0KK30KKworc3RhdGljIHZvaWQgIG9wal9qMmtfcmVhZF9pbnQzMl90b19pbnQzMiAoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pCit7CisgICAgICAgIE9QSl9CWVRFICogbF9zcmNfZGF0YSA9IChPUEpfQllURSAqKSBwX3NyY19kYXRhOworICAgICAgICBPUEpfSU5UMzIgKiBsX2Rlc3RfZGF0YSA9IChPUEpfSU5UMzIgKikgcF9kZXN0X2RhdGE7CisgICAgICAgIE9QSl9VSU5UMzIgaTsKKyAgICAgICAgT1BKX1VJTlQzMiBsX3RlbXA7CisKKyAgICAgICAgZm9yIChpPTA7aTxwX25iX2VsZW07KytpKSB7CisgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMobF9zcmNfZGF0YSwmbF90ZW1wLDQpOworCisgICAgICAgICAgICAgICAgbF9zcmNfZGF0YSs9c2l6ZW9mKE9QSl9JTlQzMik7CisKKyAgICAgICAgICAgICAgICAqKGxfZGVzdF9kYXRhKyspID0gKE9QSl9JTlQzMikgbF90ZW1wOworICAgICAgICB9Cit9CisKK3N0YXRpYyB2b2lkICBvcGpfajJrX3JlYWRfZmxvYXQzMl90b19pbnQzMiAoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pCit7CisgICAgICAgIE9QSl9CWVRFICogbF9zcmNfZGF0YSA9IChPUEpfQllURSAqKSBwX3NyY19kYXRhOworICAgICAgICBPUEpfSU5UMzIgKiBsX2Rlc3RfZGF0YSA9IChPUEpfSU5UMzIgKikgcF9kZXN0X2RhdGE7CisgICAgICAgIE9QSl9VSU5UMzIgaTsKKyAgICAgICAgT1BKX0ZMT0FUMzIgbF90ZW1wOworCisgICAgICAgIGZvciAoaT0wO2k8cF9uYl9lbGVtOysraSkgeworICAgICAgICAgICAgICAgIG9wal9yZWFkX2Zsb2F0KGxfc3JjX2RhdGEsJmxfdGVtcCk7CisKKyAgICAgICAgICAgICAgICBsX3NyY19kYXRhKz1zaXplb2YoT1BKX0ZMT0FUMzIpOworCisgICAgICAgICAgICAgICAgKihsX2Rlc3RfZGF0YSsrKSA9IChPUEpfSU5UMzIpIGxfdGVtcDsKKyAgICAgICAgfQorfQorCitzdGF0aWMgdm9pZCAgb3BqX2oya19yZWFkX2Zsb2F0NjRfdG9faW50MzIgKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLCB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKQoreworICAgICAgICBPUEpfQllURSAqIGxfc3JjX2RhdGEgPSAoT1BKX0JZVEUgKikgcF9zcmNfZGF0YTsKKyAgICAgICAgT1BKX0lOVDMyICogbF9kZXN0X2RhdGEgPSAoT1BKX0lOVDMyICopIHBfZGVzdF9kYXRhOworICAgICAgICBPUEpfVUlOVDMyIGk7CisgICAgICAgIE9QSl9GTE9BVDY0IGxfdGVtcDsKKworICAgICAgICBmb3IgKGk9MDtpPHBfbmJfZWxlbTsrK2kpIHsKKyAgICAgICAgICAgICAgICBvcGpfcmVhZF9kb3VibGUobF9zcmNfZGF0YSwmbF90ZW1wKTsKKworICAgICAgICAgICAgICAgIGxfc3JjX2RhdGErPXNpemVvZihPUEpfRkxPQVQ2NCk7CisKKyAgICAgICAgICAgICAgICAqKGxfZGVzdF9kYXRhKyspID0gKE9QSl9JTlQzMikgbF90ZW1wOworICAgICAgICB9Cit9CisKK3N0YXRpYyB2b2lkICBvcGpfajJrX3dyaXRlX2Zsb2F0X3RvX2ludDE2IChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSkKK3sKKyAgICAgICAgT1BKX0JZVEUgKiBsX2Rlc3RfZGF0YSA9IChPUEpfQllURSAqKSBwX2Rlc3RfZGF0YTsKKyAgICAgICAgT1BKX0ZMT0FUMzIgKiBsX3NyY19kYXRhID0gKE9QSl9GTE9BVDMyICopIHBfc3JjX2RhdGE7CisgICAgICAgIE9QSl9VSU5UMzIgaTsKKyAgICAgICAgT1BKX1VJTlQzMiBsX3RlbXA7CisKKyAgICAgICAgZm9yIChpPTA7aTxwX25iX2VsZW07KytpKSB7CisgICAgICAgICAgICAgICAgbF90ZW1wID0gKE9QSl9VSU5UMzIpICoobF9zcmNfZGF0YSsrKTsKKworICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2Rlc3RfZGF0YSxsX3RlbXAsc2l6ZW9mKE9QSl9JTlQxNikpOworCisgICAgICAgICAgICAgICAgbF9kZXN0X2RhdGErPXNpemVvZihPUEpfSU5UMTYpOworICAgICAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9faW50MzIgKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLCB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKQoreworICAgICAgICBPUEpfQllURSAqIGxfZGVzdF9kYXRhID0gKE9QSl9CWVRFICopIHBfZGVzdF9kYXRhOworICAgICAgICBPUEpfRkxPQVQzMiAqIGxfc3JjX2RhdGEgPSAoT1BKX0ZMT0FUMzIgKikgcF9zcmNfZGF0YTsKKyAgICAgICAgT1BKX1VJTlQzMiBpOworICAgICAgICBPUEpfVUlOVDMyIGxfdGVtcDsKKworICAgICAgICBmb3IgKGk9MDtpPHBfbmJfZWxlbTsrK2kpIHsKKyAgICAgICAgICAgICAgICBsX3RlbXAgPSAoT1BKX1VJTlQzMikgKihsX3NyY19kYXRhKyspOworCisgICAgICAgICAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfZGVzdF9kYXRhLGxfdGVtcCxzaXplb2YoT1BKX0lOVDMyKSk7CisKKyAgICAgICAgICAgICAgICBsX2Rlc3RfZGF0YSs9c2l6ZW9mKE9QSl9JTlQzMik7CisgICAgICAgIH0KK30KKworc3RhdGljIHZvaWQgIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9fZmxvYXQgKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLCB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKQoreworICAgICAgICBPUEpfQllURSAqIGxfZGVzdF9kYXRhID0gKE9QSl9CWVRFICopIHBfZGVzdF9kYXRhOworICAgICAgICBPUEpfRkxPQVQzMiAqIGxfc3JjX2RhdGEgPSAoT1BKX0ZMT0FUMzIgKikgcF9zcmNfZGF0YTsKKyAgICAgICAgT1BKX1VJTlQzMiBpOworICAgICAgICBPUEpfRkxPQVQzMiBsX3RlbXA7CisKKyAgICAgICAgZm9yIChpPTA7aTxwX25iX2VsZW07KytpKSB7CisgICAgICAgICAgICAgICAgbF90ZW1wID0gKE9QSl9GTE9BVDMyKSAqKGxfc3JjX2RhdGErKyk7CisKKyAgICAgICAgICAgICAgICBvcGpfd3JpdGVfZmxvYXQobF9kZXN0X2RhdGEsbF90ZW1wKTsKKworICAgICAgICAgICAgICAgIGxfZGVzdF9kYXRhKz1zaXplb2YoT1BKX0ZMT0FUMzIpOworICAgICAgICB9Cit9CisKK3N0YXRpYyB2b2lkICBvcGpfajJrX3dyaXRlX2Zsb2F0X3RvX2Zsb2F0NjQgKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLCB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKQoreworICAgICAgICBPUEpfQllURSAqIGxfZGVzdF9kYXRhID0gKE9QSl9CWVRFICopIHBfZGVzdF9kYXRhOworICAgICAgICBPUEpfRkxPQVQzMiAqIGxfc3JjX2RhdGEgPSAoT1BKX0ZMT0FUMzIgKikgcF9zcmNfZGF0YTsKKyAgICAgICAgT1BKX1VJTlQzMiBpOworICAgICAgICBPUEpfRkxPQVQ2NCBsX3RlbXA7CisKKyAgICAgICAgZm9yIChpPTA7aTxwX25iX2VsZW07KytpKSB7CisgICAgICAgICAgICAgICAgbF90ZW1wID0gKE9QSl9GTE9BVDY0KSAqKGxfc3JjX2RhdGErKyk7CisKKyAgICAgICAgICAgICAgICBvcGpfd3JpdGVfZG91YmxlKGxfZGVzdF9kYXRhLGxfdGVtcCk7CisKKyAgICAgICAgICAgICAgICBsX2Rlc3RfZGF0YSs9c2l6ZW9mKE9QSl9GTE9BVDY0KTsKKyAgICAgICAgfQorfQorCitjaGFyICpvcGpfajJrX2NvbnZlcnRfcHJvZ3Jlc3Npb25fb3JkZXIoT1BKX1BST0dfT1JERVIgcHJnX29yZGVyKXsKKyAgICAgICAgajJrX3Byb2dfb3JkZXJfdCAqcG87CisgICAgICAgIGZvcihwbyA9IGoya19wcm9nX29yZGVyX2xpc3Q7IHBvLT5lbnVtX3Byb2cgIT0gLTE7IHBvKysgKXsKKyAgICAgICAgICAgICAgICBpZihwby0+ZW51bV9wcm9nID09IHByZ19vcmRlcil7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG8tPnN0cl9wcm9nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcG8tPnN0cl9wcm9nOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19jaGVja19wb2NfdmFsKCBjb25zdCBvcGpfcG9jX3QgKnBfcG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX25iX3BvY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9uYl9yZXNvbHV0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX251bV9jb21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX251bV9sYXllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKK3sKKyAgICAgICAgT1BKX1VJTlQzMiogcGFja2V0X2FycmF5OworICAgICAgICBPUEpfVUlOVDMyIGluZGV4ICwgcmVzbm8sIGNvbXBubywgbGF5bm87CisgICAgICAgIE9QSl9VSU5UMzIgaTsKKyAgICAgICAgT1BKX1VJTlQzMiBzdGVwX2MgPSAxOworICAgICAgICBPUEpfVUlOVDMyIHN0ZXBfciA9IHBfbnVtX2NvbXBzICogc3RlcF9jOworICAgICAgICBPUEpfVUlOVDMyIHN0ZXBfbCA9IHBfbmJfcmVzb2x1dGlvbnMgKiBzdGVwX3I7CisgICAgICAgIE9QSl9CT09MIGxvc3MgPSBPUEpfRkFMU0U7CisgICAgICAgIE9QSl9VSU5UMzIgbGF5bm8wID0gMDsKKworICAgICAgICBwYWNrZXRfYXJyYXkgPSAoT1BKX1VJTlQzMiopIG9wal9jYWxsb2Moc3RlcF9sICogcF9udW1fbGF5ZXJzLCBzaXplb2YoT1BKX1VJTlQzMikpOworICAgICAgICBpZiAocGFja2V0X2FycmF5ID09IDAwKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIgLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgY2hlY2tpbmcgdGhlIHBvYyB2YWx1ZXMuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBfbmJfcG9jcyA9PSAwKSB7CisgICAgICAgIG9wal9mcmVlKHBhY2tldF9hcnJheSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgICAgICB9CisKKyAgICAgICAgaW5kZXggPSBzdGVwX3IgKiBwX3BvY3MtPnJlc25vMDsKKyAgICAgICAgLyogdGFrZSBlYWNoIHJlc29sdXRpb24gZm9yIGVhY2ggcG9jICovCisgICAgICAgIGZvciAocmVzbm8gPSBwX3BvY3MtPnJlc25vMCA7IHJlc25vIDwgcF9wb2NzLT5yZXNubzEgOyArK3Jlc25vKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiByZXNfaW5kZXggPSBpbmRleCArIHBfcG9jcy0+Y29tcG5vMCAqIHN0ZXBfYzsKKworICAgICAgICAgICAgICAgIC8qIHRha2UgZWFjaCBjb21wIG9mIGVhY2ggcmVzb2x1dGlvbiBmb3IgZWFjaCBwb2MgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGNvbXBubyA9IHBfcG9jcy0+Y29tcG5vMCA7IGNvbXBubyA8IHBfcG9jcy0+Y29tcG5vMSA7ICsrY29tcG5vKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNvbXBfaW5kZXggPSByZXNfaW5kZXggKyBsYXlubzAgKiBzdGVwX2w7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBmaW5hbGx5IHRha2UgZWFjaCBsYXllciBvZiBlYWNoIHJlcyBvZiAuLi4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGF5bm8gPSBsYXlubzA7IGxheW5vIDwgcF9wb2NzLT5sYXlubzEgOyArK2xheW5vKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaW5kZXggPSBzdGVwX3IgKiByZXNubyArIHN0ZXBfYyAqIGNvbXBubyArIHN0ZXBfbCAqIGxheW5vOyovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldF9hcnJheVtjb21wX2luZGV4XSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBfaW5kZXggKz0gc3RlcF9sOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICByZXNfaW5kZXggKz0gc3RlcF9jOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGluZGV4ICs9IHN0ZXBfcjsKKyAgICAgICAgfQorICAgICAgICArK3BfcG9jczsKKworICAgICAgICAvKiBpdGVyYXRlIHRocm91Z2ggYWxsIHRoZSBwb2NzICovCisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBwX25iX3BvY3MgOyArK2kpIHsKKyAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxfbGFzdF9sYXlubzEgPSAocF9wb2NzLTEpLT5sYXlubzEgOworCisgICAgICAgICAgICAgICAgbGF5bm8wID0gKHBfcG9jcy0+bGF5bm8xID4gbF9sYXN0X2xheW5vMSk/IGxfbGFzdF9sYXlubzEgOiAwOworICAgICAgICAgICAgICAgIGluZGV4ID0gc3RlcF9yICogcF9wb2NzLT5yZXNubzA7CisKKyAgICAgICAgICAgICAgICAvKiB0YWtlIGVhY2ggcmVzb2x1dGlvbiBmb3IgZWFjaCBwb2MgKi8KKyAgICAgICAgICAgICAgICBmb3IgKHJlc25vID0gcF9wb2NzLT5yZXNubzAgOyByZXNubyA8IHBfcG9jcy0+cmVzbm8xIDsgKytyZXNubykgeworICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiByZXNfaW5kZXggPSBpbmRleCArIHBfcG9jcy0+Y29tcG5vMCAqIHN0ZXBfYzsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogdGFrZSBlYWNoIGNvbXAgb2YgZWFjaCByZXNvbHV0aW9uIGZvciBlYWNoIHBvYyAqLworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb21wbm8gPSBwX3BvY3MtPmNvbXBubzAgOyBjb21wbm8gPCBwX3BvY3MtPmNvbXBubzEgOyArK2NvbXBubykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNvbXBfaW5kZXggPSByZXNfaW5kZXggKyBsYXlubzAgKiBzdGVwX2w7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIGZpbmFsbHkgdGFrZSBlYWNoIGxheWVyIG9mIGVhY2ggcmVzIG9mIC4uLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxheW5vID0gbGF5bm8wOyBsYXlubyA8IHBfcG9jcy0+bGF5bm8xIDsgKytsYXlubykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaW5kZXggPSBzdGVwX3IgKiByZXNubyArIHN0ZXBfYyAqIGNvbXBubyArIHN0ZXBfbCAqIGxheW5vOyovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0X2FycmF5W2NvbXBfaW5kZXhdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wX2luZGV4ICs9IHN0ZXBfbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc19pbmRleCArPSBzdGVwX2M7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IHN0ZXBfcjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICArK3BfcG9jczsKKyAgICAgICAgfQorCisgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgZm9yIChsYXlubyA9IDA7IGxheW5vIDwgcF9udW1fbGF5ZXJzIDsgKytsYXlubykgeworICAgICAgICAgICAgICAgIGZvciAocmVzbm8gPSAwOyByZXNubyA8IHBfbmJfcmVzb2x1dGlvbnM7ICsrcmVzbm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgcF9udW1fY29tcHM7ICsrY29tcG5vKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvc3MgfD0gKHBhY2tldF9hcnJheVtpbmRleF0hPTEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmluZGV4ID0gc3RlcF9yICogcmVzbm8gKyBzdGVwX2MgKiBjb21wbm8gKyBzdGVwX2wgKiBsYXlubzsqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCArPSBzdGVwX2M7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvc3MpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciAsIEVWVF9FUlJPUiwgIk1pc3NpbmcgcGFja2V0cyBwb3NzaWJsZSBsb3NzIG9mIGRhdGFcbiIpOworICAgICAgICB9CisKKyAgICAgICAgb3BqX2ZyZWUocGFja2V0X2FycmF5KTsKKworICAgICAgICByZXR1cm4gIWxvc3M7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBPUEpfVUlOVDMyIG9wal9qMmtfZ2V0X251bV90cChvcGpfY3BfdCAqY3AsIE9QSl9VSU5UMzIgcGlubywgT1BKX1VJTlQzMiB0aWxlbm8pCit7CisgICAgICAgIGNvbnN0IE9QSl9DSEFSICpwcm9nID0gMDA7CisgICAgICAgIE9QSl9JTlQzMiBpOworICAgICAgICBPUEpfVUlOVDMyIHRwbnVtID0gMTsKKyAgICAgICAgb3BqX3RjcF90ICp0Y3AgPSAwMDsKKyAgICAgICAgb3BqX3BvY190ICogbF9jdXJyZW50X3BvYyA9IDAwOworCisgICAgICAgIC8qICBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydCh0aWxlbm8gPCAoY3AtPnR3ICogY3AtPnRoKSk7CisgICAgICAgIGFzc2VydChwaW5vIDwgKGNwLT50Y3BzW3RpbGVub10ubnVtcG9jcyArIDEpKTsKKworICAgICAgICAvKiBnZXQgdGhlIGdpdmVuIHRpbGUgY29kaW5nIHBhcmFtZXRlciAqLworICAgICAgICB0Y3AgPSAmY3AtPnRjcHNbdGlsZW5vXTsKKyAgICAgICAgYXNzZXJ0KHRjcCAhPSAwMCk7CisKKyAgICAgICAgbF9jdXJyZW50X3BvYyA9ICYodGNwLT5wb2NzW3Bpbm9dKTsKKyAgICAgICAgYXNzZXJ0KGxfY3VycmVudF9wb2MgIT0gMCk7CisKKyAgICAgICAgLyogZ2V0IHRoZSBwcm9ncmVzc2lvbiBvcmRlciBhcyBhIGNoYXJhY3RlciBzdHJpbmcgKi8KKyAgICAgICAgcHJvZyA9IG9wal9qMmtfY29udmVydF9wcm9ncmVzc2lvbl9vcmRlcih0Y3AtPnByZyk7CisgICAgICAgIGFzc2VydChzdHJsZW4ocHJvZykgPiAwKTsKKworICAgICAgICBpZiAoY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV90cF9vbiA9PSAxKSB7CisgICAgICAgICAgICAgICAgZm9yIChpPTA7aTw0OysraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwcm9nW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21wb25lbnQgd2lzZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cG51bSAqPSBsX2N1cnJlbnRfcG9jLT5jb21wRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzb2x1dGlvbiB3aXNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1InOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwbnVtICo9IGxfY3VycmVudF9wb2MtPnJlc0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZWNpbmN0IHdpc2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnUCc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBudW0gKj0gbF9jdXJyZW50X3BvYy0+cHJjRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGF5ZXIgd2lzZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdMJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cG51bSAqPSBsX2N1cnJlbnRfcG9jLT5sYXlFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLyogd2hvdWxkIHdlIHNwbGl0IGhlcmUgPyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX3RwX2ZsYWcgPT0gcHJvZ1tpXSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV90cF9wb3M9aTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHRwbnVtPTE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHBudW07Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2NhbGN1bGF0ZV90cCggIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jcF90ICpjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfbmJfdGlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90ICppbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBwaW5vLHRpbGVubzsKKyAgICAgICAgT1BKX1VJTlQzMiBsX25iX3RpbGVzOworICAgICAgICBvcGpfdGNwX3QgKnRjcDsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydChwX25iX3RpbGVzICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KGNwICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KGltYWdlICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisKKyAgICAgICAgbF9uYl90aWxlcyA9IGNwLT50dyAqIGNwLT50aDsKKyAgICAgICAgKiBwX25iX3RpbGVzID0gMDsKKyAgICAgICAgdGNwID0gY3AtPnRjcHM7CisKKyAgICAgICAgLyogSU5ERVggPj4gKi8KKyAgICAgICAgLyogVE9ETyBtZXJnZVYyOiBjaGVjayB0aGlzIHBhcnQgd2hpY2ggdXNlIGNzdHJfaW5mbyAqLworICAgICAgICAvKmlmIChwX2oyay0+Y3N0cl9pbmZvKSB7CisgICAgICAgICAgICAgICAgb3BqX3RpbGVfaW5mb190ICogbF9pbmZvX3RpbGVfcHRyID0gcF9qMmstPmNzdHJfaW5mby0+dGlsZTsKKworICAgICAgICAgICAgICAgIGZvciAodGlsZW5vID0gMDsgdGlsZW5vIDwgbF9uYl90aWxlczsgKyt0aWxlbm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgY3VyX3RvdG51bV90cCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9waV91cGRhdGVfZW5jb2RpbmdfcGFyYW1ldGVycyhpbWFnZSxjcCx0aWxlbm8pOworCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHBpbm8gPSAwOyBwaW5vIDw9IHRjcC0+bnVtcG9jczsgKytwaW5vKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHRwX251bSA9IG9wal9qMmtfZ2V0X251bV90cChjcCxwaW5vLHRpbGVubyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbmJfdGlsZXMgPSAqcF9uYl90aWxlcyArIHRwX251bTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfdG90bnVtX3RwICs9IHRwX251bTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT5tX25iX3RpbGVfcGFydHMgPSBjdXJfdG90bnVtX3RwOworCisgICAgICAgICAgICAgICAgICAgICAgICBsX2luZm9fdGlsZV9wdHItPnRwID0gKG9wal90cF9pbmZvX3QgKikgb3BqX21hbGxvYyhjdXJfdG90bnVtX3RwICogc2l6ZW9mKG9wal90cF9pbmZvX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2luZm9fdGlsZV9wdHItPnRwID09IDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChsX2luZm9fdGlsZV9wdHItPnRwLDAsY3VyX3RvdG51bV90cCAqIHNpemVvZihvcGpfdHBfaW5mb190KSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfaW5mb190aWxlX3B0ci0+bnVtX3RwcyA9IGN1cl90b3RudW1fdHA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICsrbF9pbmZvX3RpbGVfcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgKyt0Y3A7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgKi97CisgICAgICAgICAgICAgICAgZm9yICh0aWxlbm8gPSAwOyB0aWxlbm8gPCBsX25iX3RpbGVzOyArK3RpbGVubykgeworICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBjdXJfdG90bnVtX3RwID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BpX3VwZGF0ZV9lbmNvZGluZ19wYXJhbWV0ZXJzKGltYWdlLGNwLHRpbGVubyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocGlubyA9IDA7IHBpbm8gPD0gdGNwLT5udW1wb2NzOyArK3Bpbm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0cF9udW0gPSBvcGpfajJrX2dldF9udW1fdHAoY3AscGlubyx0aWxlbm8pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX25iX3RpbGVzID0gKnBfbmJfdGlsZXMgKyB0cF9udW07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3RvdG51bV90cCArPSB0cF9udW07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0Y3AtPm1fbmJfdGlsZV9wYXJ0cyA9IGN1cl90b3RudW1fdHA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICsrdGNwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfc29jKCAgICAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQoreworICAgICAgICAvKiAyIGJ5dGVzIHdpbGwgYmUgd3JpdHRlbiAqLworICAgICAgICBPUEpfQllURSAqIGxfc3RhcnRfc3RyZWFtID0gMDA7CisKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworICAgICAgICBsX3N0YXJ0X3N0cmVhbSA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGE7CisKKyAgICAgICAgLyogd3JpdGUgU09DIGlkZW50aWZpZXIgKi8KKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfc3RhcnRfc3RyZWFtLEoyS19NU19TT0MsMik7CisKKyAgICAgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShwX3N0cmVhbSxsX3N0YXJ0X3N0cmVhbSwyLHBfbWFuYWdlcikgIT0gMikgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworLyogVW5pUEc+PiAqLworI2lmZGVmIFVTRV9KUFdMCisgICAgICAgIC8qIHVwZGF0ZSBtYXJrZXJzIHN0cnVjdCAqLworLyoKKyAgICAgICAgT1BKX0JPT0wgcmVzID0gajJrX2FkZF9tYXJrZXIocF9qMmstPmNzdHJfaW5mbywgSjJLX01TX1NPQywgcF9zdHJlYW1fdGVsbChwX3N0cmVhbSkgLSAyLCAyKTsKKyovCisgIGFzc2VydCggMCAmJiAiVE9ETyIgKTsKKyNlbmRpZiAvKiBVU0VfSlBXTCAqLworLyogPDxVbmlQRyAqLworCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworLyoqCisgKiBSZWFkcyBhIFNPQyBtYXJrZXIgKFN0YXJ0IG9mIENvZGVzdHJlYW0pCisgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgIHRoZSBqcGVnMjAwMCBmaWxlIGNvZGVjLgorICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICBGSVhNRSBET0MKKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3NvYyggICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgICAgIE9QSl9CWVRFIGxfZGF0YSBbMl07CisgICAgICAgIE9QSl9VSU5UMzIgbF9tYXJrZXI7CisKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKworICAgICAgICBpZiAob3BqX3N0cmVhbV9yZWFkX2RhdGEocF9zdHJlYW0sbF9kYXRhLDIscF9tYW5hZ2VyKSAhPSAyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIG9wal9yZWFkX2J5dGVzKGxfZGF0YSwmbF9tYXJrZXIsMik7CisgICAgICAgIGlmIChsX21hcmtlciAhPSBKMktfTVNfU09DKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE5leHQgbWFya2VyIHNob3VsZCBiZSBhIFNJWiBtYXJrZXIgaW4gdGhlIG1haW4gaGVhZGVyICovCisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID0gSjJLX1NUQVRFX01IU0laOworCisgICAgICAgIC8qIEZJWE1FIG1vdmUgaXQgaW4gYSBpbmRleCBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gcF9qMmsqLworICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+bWFpbl9oZWFkX3N0YXJ0ID0gb3BqX3N0cmVhbV90ZWxsKHBfc3RyZWFtKSAtIDI7CisKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9JTkZPLCAiU3RhcnQgdG8gcmVhZCBqMmsgbWFpbiBoZWFkZXIgKCVkKS5cbiIsIHBfajJrLT5jc3RyX2luZGV4LT5tYWluX2hlYWRfc3RhcnQpOworCisgICAgICAgIC8qIEFkZCB0aGUgbWFya2VyIHRvIHRoZSBjb2Rlc3RyZWFtIGluZGV4Ki8KKyAgICAgICAgaWYgKE9QSl9GQUxTRSA9PSBvcGpfajJrX2FkZF9taG1hcmtlcihwX2oyay0+Y3N0cl9pbmRleCwgSjJLX01TX1NPQywgcF9qMmstPmNzdHJfaW5kZXgtPm1haW5faGVhZF9zdGFydCwgMikpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWRkIG1oIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX3NpeiggICAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBpOworICAgICAgICBPUEpfVUlOVDMyIGxfc2l6ZV9sZW47CisgICAgICAgIE9QSl9CWVRFICogbF9jdXJyZW50X3B0cjsKKyAgICAgICAgb3BqX2ltYWdlX3QgKiBsX2ltYWdlID0gMDA7CisgICAgICAgIG9wal9jcF90ICpjcCA9IDAwOworICAgICAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IDAwOworCisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisKKyAgICAgICAgbF9pbWFnZSA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2U7CisgICAgICAgIGNwID0gJihwX2oyay0+bV9jcCk7CisgICAgICAgIGxfc2l6ZV9sZW4gPSA0MCArIDMgKiBsX2ltYWdlLT5udW1jb21wczsKKyAgICAgICAgbF9pbWdfY29tcCA9IGxfaW1hZ2UtPmNvbXBzOworCisgICAgICAgIGlmIChsX3NpemVfbGVuID4gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplKSB7CisKKyAgICAgICAgICAgICAgICBPUEpfQllURSAqbmV3X2hlYWRlcl90aWxlX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwgbF9zaXplX2xlbik7CisgICAgICAgICAgICAgICAgaWYgKCEgbmV3X2hlYWRlcl90aWxlX2RhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IGZvciB0aGUgU0laIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gbmV3X2hlYWRlcl90aWxlX2RhdGE7CisgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gbF9zaXplX2xlbjsKKyAgICAgICAgfQorCisgICAgICAgIGxfY3VycmVudF9wdHIgPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhOworCisgICAgICAgIC8qIHdyaXRlIFNPQyBpZGVudGlmaWVyICovCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLEoyS19NU19TSVosMik7ICAgIC8qIFNJWiAqLworICAgICAgICBsX2N1cnJlbnRfcHRyKz0yOworCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLGxfc2l6ZV9sZW4tMiwyKTsgLyogTF9TSVogKi8KKyAgICAgICAgbF9jdXJyZW50X3B0cis9MjsKKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X3B0ciwgY3AtPnJzaXosIDIpOyAgICAvKiBSc2l6IChjYXBhYmlsaXRpZXMpICovCisgICAgICAgIGxfY3VycmVudF9wdHIrPTI7CisKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9wdHIsIGxfaW1hZ2UtPngxLCA0KTsgLyogWHNpeiAqLworICAgICAgICBsX2N1cnJlbnRfcHRyKz00OworCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLCBsX2ltYWdlLT55MSwgNCk7IC8qIFlzaXogKi8KKyAgICAgICAgbF9jdXJyZW50X3B0cis9NDsKKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X3B0ciwgbF9pbWFnZS0+eDAsIDQpOyAvKiBYMHNpeiAqLworICAgICAgICBsX2N1cnJlbnRfcHRyKz00OworCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLCBsX2ltYWdlLT55MCwgNCk7IC8qIFkwc2l6ICovCisgICAgICAgIGxfY3VycmVudF9wdHIrPTQ7CisKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9wdHIsIGNwLT50ZHgsIDQpOyAgICAgICAgICAgICAvKiBYVHNpeiAqLworICAgICAgICBsX2N1cnJlbnRfcHRyKz00OworCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLCBjcC0+dGR5LCA0KTsgICAgICAgICAgICAgLyogWVRzaXogKi8KKyAgICAgICAgbF9jdXJyZW50X3B0cis9NDsKKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X3B0ciwgY3AtPnR4MCwgNCk7ICAgICAgICAgICAgIC8qIFhUMHNpeiAqLworICAgICAgICBsX2N1cnJlbnRfcHRyKz00OworCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLCBjcC0+dHkwLCA0KTsgICAgICAgICAgICAgLyogWVQwc2l6ICovCisgICAgICAgIGxfY3VycmVudF9wdHIrPTQ7CisKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9wdHIsIGxfaW1hZ2UtPm51bWNvbXBzLCAyKTsgICAvKiBDc2l6ICovCisgICAgICAgIGxfY3VycmVudF9wdHIrPTI7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxfaW1hZ2UtPm51bWNvbXBzOyArK2kpIHsKKyAgICAgICAgICAgICAgICAvKiBUT0RPIGhlcmUgd2l0aCBNQ1QgPyAqLworICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLCBsX2ltZ19jb21wLT5wcmVjIC0gMSArIChsX2ltZ19jb21wLT5zZ25kIDw8IDcpLCAxKTsgICAgICAvKiBTc2l6X2kgKi8KKyAgICAgICAgICAgICAgICArK2xfY3VycmVudF9wdHI7CisKKyAgICAgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X3B0ciwgbF9pbWdfY29tcC0+ZHgsIDEpOyAgICAgIC8qIFhSc2l6X2kgKi8KKyAgICAgICAgICAgICAgICArK2xfY3VycmVudF9wdHI7CisKKyAgICAgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X3B0ciwgbF9pbWdfY29tcC0+ZHksIDEpOyAgICAgIC8qIFlSc2l6X2kgKi8KKyAgICAgICAgICAgICAgICArK2xfY3VycmVudF9wdHI7CisKKyAgICAgICAgICAgICAgICArK2xfaW1nX2NvbXA7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKHBfc3RyZWFtLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsbF9zaXplX2xlbixwX21hbmFnZXIpICE9IGxfc2l6ZV9sZW4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCisvKioKKyAqIFJlYWRzIGEgU0laIG1hcmtlciAoaW1hZ2UgYW5kIHRpbGUgc2l6ZSkKKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgU0laIGJveC4KKyAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBTSVogbWFya2VyLgorICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfc2l6KG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBpOworICAgICAgICBPUEpfVUlOVDMyIGxfbmJfY29tcDsKKyAgICAgICAgT1BKX1VJTlQzMiBsX25iX2NvbXBfcmVtYWluOworICAgICAgICBPUEpfVUlOVDMyIGxfcmVtYWluaW5nX3NpemU7CisgICAgICAgIE9QSl9VSU5UMzIgbF9uYl90aWxlczsKKyAgICAgICAgT1BKX1VJTlQzMiBsX3RtcCwgbF90eDEsIGxfdHkxOworICAgICAgICBvcGpfaW1hZ2VfdCAqbF9pbWFnZSA9IDAwOworICAgICAgICBvcGpfY3BfdCAqbF9jcCA9IDAwOworICAgICAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IDAwOworICAgICAgICBvcGpfdGNwX3QgKiBsX2N1cnJlbnRfdGlsZV9wYXJhbSA9IDAwOworCisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKKworICAgICAgICBsX2ltYWdlID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZTsKKyAgICAgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOworCisgICAgICAgIC8qIG1pbmltdW0gc2l6ZSA9PSAzOSAtIDMgKD0gbWluaW11bSBjb21wb25lbnQgcGFyYW1ldGVyKSAqLworICAgICAgICBpZiAocF9oZWFkZXJfc2l6ZSA8IDM2KSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdpdGggU0laIG1hcmtlciBzaXplXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgbF9yZW1haW5pbmdfc2l6ZSA9IHBfaGVhZGVyX3NpemUgLSAzNjsKKyAgICAgICAgbF9uYl9jb21wID0gbF9yZW1haW5pbmdfc2l6ZSAvIDM7CisgICAgICAgIGxfbmJfY29tcF9yZW1haW4gPSBsX3JlbWFpbmluZ19zaXplICUgMzsKKyAgICAgICAgaWYgKGxfbmJfY29tcF9yZW1haW4gIT0gMCl7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdpdGggU0laIG1hcmtlciBzaXplXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF90bXAgLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJzaXogKGNhcGFiaWxpdGllcykgKi8KKyAgICAgICAgcF9oZWFkZXJfZGF0YSs9MjsKKyAgICAgICAgbF9jcC0+cnNpeiA9IChPUEpfVUlOVDE2KSBsX3RtcDsKKyAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgKE9QSl9VSU5UMzIqKSAmbF9pbWFnZS0+eDEsIDQpOyAgIC8qIFhzaXogKi8KKyAgICAgICAgcF9oZWFkZXJfZGF0YSs9NDsKKyAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgKE9QSl9VSU5UMzIqKSAmbF9pbWFnZS0+eTEsIDQpOyAgIC8qIFlzaXogKi8KKyAgICAgICAgcF9oZWFkZXJfZGF0YSs9NDsKKyAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgKE9QSl9VSU5UMzIqKSAmbF9pbWFnZS0+eDAsIDQpOyAgIC8qIFgwc2l6ICovCisgICAgICAgIHBfaGVhZGVyX2RhdGErPTQ7CisgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsIChPUEpfVUlOVDMyKikgJmxfaW1hZ2UtPnkwLCA0KTsgICAvKiBZMHNpeiAqLworICAgICAgICBwX2hlYWRlcl9kYXRhKz00OworICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAoT1BKX1VJTlQzMiopICZsX2NwLT50ZHgsIDQpOyAgICAgICAgICAgICAvKiBYVHNpeiAqLworICAgICAgICBwX2hlYWRlcl9kYXRhKz00OworICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAoT1BKX1VJTlQzMiopICZsX2NwLT50ZHksIDQpOyAgICAgICAgICAgICAvKiBZVHNpeiAqLworICAgICAgICBwX2hlYWRlcl9kYXRhKz00OworICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAoT1BKX1VJTlQzMiopICZsX2NwLT50eDAsIDQpOyAgICAgICAgICAgICAvKiBYVDBzaXogKi8KKyAgICAgICAgcF9oZWFkZXJfZGF0YSs9NDsKKyAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgKE9QSl9VSU5UMzIqKSAmbF9jcC0+dHkwLCA0KTsgICAgICAgICAgICAgLyogWVQwc2l6ICovCisgICAgICAgIHBfaGVhZGVyX2RhdGErPTQ7CisgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsIChPUEpfVUlOVDMyKikgJmxfdG1wLCAyKTsgICAgICAgICAgICAgICAgIC8qIENzaXogKi8KKyAgICAgICAgcF9oZWFkZXJfZGF0YSs9MjsKKyAgICAgICAgaWYgKGxfdG1wIDwgMTYzODUpCisgICAgICAgICAgICAgICAgbF9pbWFnZS0+bnVtY29tcHMgPSAoT1BKX1VJTlQxNikgbF90bXA7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciB3aXRoIFNJWiBtYXJrZXI6IG51bWJlciBvZiBjb21wb25lbnQgaXMgaWxsZWdhbCAtPiAlZFxuIiwgbF90bXApOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAobF9pbWFnZS0+bnVtY29tcHMgIT0gbF9uYl9jb21wKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdpdGggU0laIG1hcmtlcjogbnVtYmVyIG9mIGNvbXBvbmVudCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSByZW1haW5pbmcgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKCAlZCB2cyAlZClcbiIsIGxfaW1hZ2UtPm51bWNvbXBzLCBsX25iX2NvbXApOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICAvKiB0ZXN0Y2FzZSA0MDM1LnBkZi5TSUdTRUdWLmQ4Yi4zMzc1ICovCisgICAgICAgIC8qIHRlc3RjYXNlIGlzc3VlNDI3LW51bGwtaW1hZ2Utc2l6ZS5qcDIgKi8KKyAgICAgICAgaWYgKChsX2ltYWdlLT54MCA+PSBsX2ltYWdlLT54MSkgfHwgKGxfaW1hZ2UtPnkwID49IGxfaW1hZ2UtPnkxKSkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciB3aXRoIFNJWiBtYXJrZXI6IG5lZ2F0aXZlIG9yIHplcm8gaW1hZ2Ugc2l6ZSAoJWQgeCAlZClcbiIsIGxfaW1hZ2UtPngxIC0gbF9pbWFnZS0+eDAsIGxfaW1hZ2UtPnkxIC0gbF9pbWFnZS0+eTApOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgLyogdGVzdGNhc2UgMjUzOS5wZGYuU0lHRlBFLjcwNi4xNzEyIChhbHNvIDM2MjIucGRmLlNJR0ZQRS43MDYuMjkxNiBhbmQgNDAwOC5wZGYuU0lHRlBFLjcwNi4zMzQ1IGFuZCBtYXliZSBtb3JlKSAqLworICAgICAgICBpZiAoIShsX2NwLT50ZHggKiBsX2NwLT50ZHkpKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdpdGggU0laIG1hcmtlcjogaW52YWxpZCB0aWxlIHNpemUgKHRkeDogJWQsIHRkeTogJWQpXG4iLCBsX2NwLT50ZHgsIGxfY3AtPnRkeSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHRlc3RjYXNlIDE2MTAucGRmLlNJR1NFR1YuNTljLjY4MSAqLworICAgICAgICBpZiAoKChPUEpfVUlOVDY0KWxfaW1hZ2UtPngxKSAqICgoT1BKX1VJTlQ2NClsX2ltYWdlLT55MSkgIT0gKGxfaW1hZ2UtPngxICogbF9pbWFnZS0+eTEpKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlByZXZlbnQgYnVmZmVyIG92ZXJmbG93ICh4MTogJWQsIHkxOiAlZClcbiIsIGxfaW1hZ2UtPngxLCBsX2ltYWdlLT55MSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHRlc3RjYXNlIGlzc3VlNDI3LWlsbGVnYWwtdGlsZS1vZmZzZXQuanAyICovCisgICAgICAgIGxfdHgxID0gb3BqX3VpbnRfYWRkcyhsX2NwLT50eDAsIGxfY3AtPnRkeCk7IC8qIG1hbmFnZSBvdmVyZmxvdyAqLworICAgICAgICBsX3R5MSA9IG9wal91aW50X2FkZHMobF9jcC0+dHkwLCBsX2NwLT50ZHkpOyAvKiBtYW5hZ2Ugb3ZlcmZsb3cgKi8KKyAgICAgICAgaWYgKChsX2NwLT50eDAgPiBsX2ltYWdlLT54MCkgfHwgKGxfY3AtPnR5MCA+IGxfaW1hZ2UtPnkwKSB8fCAobF90eDEgPD0gbF9pbWFnZS0+eDApIHx8IChsX3R5MSA8PSBsX2ltYWdlLT55MCkgKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdpdGggU0laIG1hcmtlcjogaWxsZWdhbCB0aWxlIG9mZnNldFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisjaWZkZWYgVVNFX0pQV0wKKyAgICAgICAgaWYgKGxfY3AtPmNvcnJlY3QpIHsKKyAgICAgICAgICAgICAgICAvKiBpZiBKUFdMIGlzIG9uLCB3ZSBjaGVjayB3aGV0aGVyIFRYIGVycm9ycyBoYXZlIGRhbWFnZWQKKyAgICAgICAgICAgICAgICAgIHRvbyBtdWNoIHRoZSBTSVogcGFyYW1ldGVycyAqLworICAgICAgICAgICAgICAgIGlmICghKGxfaW1hZ2UtPngxICogbF9pbWFnZS0+eTEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSlBXTDogYmFkIGltYWdlIHNpemUgKCVkIHggJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2ltYWdlLT54MSwgbF9pbWFnZS0+eTEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFKUFdMX0FTU1VNRSB8fCBKUFdMX0FTU1VNRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSlBXTDogZ2l2aW5nIHVwXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgLyogRklYTUUgY2hlY2sgcHJldmlvdXNseSBpbiB0aGUgZnVuY3Rpb24gc28gd2h5IGtlZXAgdGhpcyBwaWVjZSBvZiBjb2RlID8gTmVlZCBieSB0aGUgbm9ybSA/CisgICAgICAgICAgICAgICAgaWYgKGxfaW1hZ2UtPm51bWNvbXBzICE9ICgobGVuIC0gMzgpIC8gMykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBKUFdMX0FTU1VNRSA/IEVWVF9XQVJOSU5HIDogRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSlBXTDogQ3NpeiBpcyAlZCA9PiBzcGFjZSBpbiBTSVogb25seSBmb3IgJWQgY29tcHMuISEhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2ltYWdlLT5udW1jb21wcywgKChsZW4gLSAzOCkgLyAzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUpQV0xfQVNTVU1FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJKUFdMOiBnaXZpbmcgdXBcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAqLyAgICAgICAgICAgICAgLyogd2UgdHJ5IHRvIGNvcnJlY3QgKi8KKyAgICAgICAgLyogICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIi0gdHJ5aW5nIHRvIGFkanVzdCB0aGlzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2ltYWdlLT5udW1jb21wcyA8ICgobGVuIC0gMzgpIC8gMykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gMzggKyAzICogbF9pbWFnZS0+bnVtY29tcHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIi0gc2V0dGluZyBMc2l6IHRvICVkID0+IEhZUE9USEVTSVMhISFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaW1hZ2UtPm51bWNvbXBzID0gKChsZW4gLSAzOCkgLyAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiLSBzZXR0aW5nIENzaXogdG8gJWQgPT4gSFlQT1RIRVNJUyEhIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2ltYWdlLT5udW1jb21wcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAqLworCisgICAgICAgICAgICAgICAgLyogdXBkYXRlIGNvbXBvbmVudHMgbnVtYmVyIGluIHRoZSBqcHdsX2V4cF9jb21wcyBmaWxlZCAqLworICAgICAgICAgICAgICAgIGxfY3AtPmV4cF9jb21wcyA9IGxfaW1hZ2UtPm51bWNvbXBzOworICAgICAgICB9CisjZW5kaWYgLyogVVNFX0pQV0wgKi8KKworICAgICAgICAvKiBBbGxvY2F0ZSB0aGUgcmVzdWx0aW5nIGltYWdlIGNvbXBvbmVudHMgKi8KKyAgICAgICAgbF9pbWFnZS0+Y29tcHMgPSAob3BqX2ltYWdlX2NvbXBfdCopIG9wal9jYWxsb2MobF9pbWFnZS0+bnVtY29tcHMsIHNpemVvZihvcGpfaW1hZ2VfY29tcF90KSk7CisgICAgICAgIGlmIChsX2ltYWdlLT5jb21wcyA9PSAwMCl7CisgICAgICAgICAgICAgICAgbF9pbWFnZS0+bnVtY29tcHMgPSAwOworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byB0YWtlIGluIGNoYXJnZSBTSVogbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgbF9pbWdfY29tcCA9IGxfaW1hZ2UtPmNvbXBzOworCisgICAgICAgIC8qIFJlYWQgdGhlIGNvbXBvbmVudCBpbmZvcm1hdGlvbiAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbF9pbWFnZS0+bnVtY29tcHM7ICsraSl7CisgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0bXA7CisgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmdG1wLDEpOyAgIC8qIFNzaXpfaSAqLworICAgICAgICAgICAgICAgICsrcF9oZWFkZXJfZGF0YTsKKyAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT5wcmVjID0gKHRtcCAmIDB4N2YpICsgMTsKKyAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT5zZ25kID0gdG1wID4+IDc7CisgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmdG1wLDEpOyAgIC8qIFhSc2l6X2kgKi8KKyAgICAgICAgICAgICAgICArK3BfaGVhZGVyX2RhdGE7CisgICAgICAgICAgICAgICAgbF9pbWdfY29tcC0+ZHggPSAoT1BKX1VJTlQzMil0bXA7IC8qIHNob3VsZCBiZSBiZXR3ZWVuIDEgYW5kIDI1NSAqLworICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJnRtcCwxKTsgICAvKiBZUnNpel9pICovCisgICAgICAgICAgICAgICAgKytwX2hlYWRlcl9kYXRhOworICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPmR5ID0gKE9QSl9VSU5UMzIpdG1wOyAvKiBzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAyNTUgKi8KKyAgICAgICAgICAgICAgICBpZiggbF9pbWdfY29tcC0+ZHggPCAxIHx8IGxfaW1nX2NvbXAtPmR4ID4gMjU1IHx8CisgICAgICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPmR5IDwgMSB8fCBsX2ltZ19jb21wLT5keSA+IDI1NSApIHsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCB2YWx1ZXMgZm9yIGNvbXAgPSAlZCA6IGR4PSV1IGR5PSV1XG4gKHNob3VsZCBiZSBiZXR3ZWVuIDEgYW5kIDI1NSBhY2NvcmRpbmcgdGhlIEpQRUcyMDAwIG5vcm0pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBsX2ltZ19jb21wLT5keCwgbF9pbWdfY29tcC0+ZHkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworI2lmZGVmIFVTRV9KUFdMCisgICAgICAgICAgICAgICAgaWYgKGxfY3AtPmNvcnJlY3QpIHsKKyAgICAgICAgICAgICAgICAvKiBpZiBKUFdMIGlzIG9uLCB3ZSBjaGVjayB3aGV0aGVyIFRYIGVycm9ycyBoYXZlIGRhbWFnZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvbyBtdWNoIHRoZSBTSVogcGFyYW1ldGVycywgYWdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGxfaW1hZ2UtPmNvbXBzW2ldLmR4ICogbF9pbWFnZS0+Y29tcHNbaV0uZHkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBKUFdMX0FTU1VNRSA/IEVWVF9XQVJOSU5HIDogRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKUFdMOiBiYWQgWFJzaXpfJWQvWVJzaXpfJWQgKCVkIHggJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGksIGxfaW1hZ2UtPmNvbXBzW2ldLmR4LCBsX2ltYWdlLT5jb21wc1tpXS5keSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSlBXTF9BU1NVTUUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSlBXTDogZ2l2aW5nIHVwXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIHRyeSB0byBjb3JyZWN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIi0gdHJ5aW5nIHRvIGFkanVzdCB0aGVtXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsX2ltYWdlLT5jb21wc1tpXS5keCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaW1hZ2UtPmNvbXBzW2ldLmR4ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICItIHNldHRpbmcgWFJzaXpfJWQgdG8gJWQgPT4gSFlQT1RIRVNJUyEhIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGxfaW1hZ2UtPmNvbXBzW2ldLmR4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxfaW1hZ2UtPmNvbXBzW2ldLmR5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9pbWFnZS0+Y29tcHNbaV0uZHkgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIi0gc2V0dGluZyBZUnNpel8lZCB0byAlZCA9PiBIWVBPVEhFU0lTISEhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgbF9pbWFnZS0+Y29tcHNbaV0uZHkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9KUFdMICovCisgICAgICAgICAgICAgICAgbF9pbWdfY29tcC0+cmVzbm9fZGVjb2RlZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiByZXNvbHV0aW9uIGRlY29kZWQgKi8KKyAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT5mYWN0b3IgPSBsX2NwLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjLm1fcmVkdWNlOyAvKiByZWR1Y2luZyBmYWN0b3IgcGVyIGNvbXBvbmVudCAqLworICAgICAgICAgICAgICAgICsrbF9pbWdfY29tcDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbXB1dGUgdGhlIG51bWJlciBvZiB0aWxlcyAqLworICAgICAgICBsX2NwLT50dyA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKShsX2ltYWdlLT54MSAtIGxfY3AtPnR4MCksIChPUEpfSU5UMzIpbF9jcC0+dGR4KTsKKyAgICAgICAgbF9jcC0+dGggPSAoT1BKX1VJTlQzMilvcGpfaW50X2NlaWxkaXYoKE9QSl9JTlQzMikobF9pbWFnZS0+eTEgLSBsX2NwLT50eTApLCAoT1BKX0lOVDMyKWxfY3AtPnRkeSk7CisKKyAgICAgICAgLyogQ2hlY2sgdGhhdCB0aGUgbnVtYmVyIG9mIHRpbGVzIGlzIHZhbGlkICovCisgICAgICAgIGlmIChsX2NwLT50dyA9PSAwIHx8IGxfY3AtPnRoID09IDAgfHwgbF9jcC0+dHcgPiA2NTUzNSAvIGxfY3AtPnRoKSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKCAgcF9tYW5hZ2VyLCBFVlRfRVJST1IsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIG51bWJlciBvZiB0aWxlcyA6ICV1IHggJXUgKG1heGltdW0gZml4ZWQgYnkganBlZzIwMDAgbm9ybSBpcyA2NTUzNSB0aWxlcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+dHcsIGxfY3AtPnRoKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgbF9uYl90aWxlcyA9IGxfY3AtPnR3ICogbF9jcC0+dGg7CisKKyAgICAgICAgLyogRGVmaW5lIHRoZSB0aWxlcyB3aGljaCB3aWxsIGJlIGRlY29kZWQgKi8KKyAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2Rpc2NhcmRfdGlsZXMpIHsKKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3ggPSAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhcnRfdGlsZV94IC0gbF9jcC0+dHgwKSAvIGxfY3AtPnRkeDsKKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3kgPSAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhcnRfdGlsZV95IC0gbF9jcC0+dHkwKSAvIGxfY3AtPnRkeTsKKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9lbmRfdGlsZV94ID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2VuZF90aWxlX3ggLSBsX2NwLT50eDApLCAoT1BKX0lOVDMyKWxfY3AtPnRkeCk7CisgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeSA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9lbmRfdGlsZV95IC0gbF9jcC0+dHkwKSwgKE9QSl9JTlQzMilsX2NwLT50ZHkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXJ0X3RpbGVfeCA9IDA7CisgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhcnRfdGlsZV95ID0gMDsKKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9lbmRfdGlsZV94ID0gbF9jcC0+dHc7CisgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeSA9IGxfY3AtPnRoOworICAgICAgICB9CisKKyNpZmRlZiBVU0VfSlBXTAorICAgICAgICBpZiAobF9jcC0+Y29ycmVjdCkgeworICAgICAgICAgICAgICAgIC8qIGlmIEpQV0wgaXMgb24sIHdlIGNoZWNrIHdoZXRoZXIgVFggZXJyb3JzIGhhdmUgZGFtYWdlZAorICAgICAgICAgICAgICAgICAgdG9vIG11Y2ggdGhlIFNJWiBwYXJhbWV0ZXJzICovCisgICAgICAgICAgICAgICAgaWYgKChsX2NwLT50dyA8IDEpIHx8IChsX2NwLT50aCA8IDEpIHx8IChsX2NwLT50dyA+IGxfY3AtPm1heF90aWxlcykgfHwgKGxfY3AtPnRoID4gbF9jcC0+bWF4X3RpbGVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEpQV0xfQVNTVU1FID8gRVZUX1dBUk5JTkcgOiBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKUFdMOiBiYWQgbnVtYmVyIG9mIHRpbGVzICglZCB4ICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+dHcsIGxfY3AtPnRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSlBXTF9BU1NVTUUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkpQV0w6IGdpdmluZyB1cFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSB0cnkgdG8gY29ycmVjdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiLSB0cnlpbmcgdG8gYWRqdXN0IHRoZW1cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfY3AtPnR3IDwgMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NwLT50dz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiLSBzZXR0aW5nICVkIHRpbGVzIGluIHggPT4gSFlQT1RIRVNJUyEhIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnR3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2NwLT50dyA+IGxfY3AtPm1heF90aWxlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NwLT50dz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiLSB0b28gbGFyZ2UgeCwgaW5jcmVhc2UgZXhwZWN0YW5jZSBvZiAlZFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItIHNldHRpbmcgJWQgdGlsZXMgaW4geCA9PiBIWVBPVEhFU0lTISEhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPm1heF90aWxlcywgbF9jcC0+dHcpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfY3AtPnRoIDwgMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NwLT50aD0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiLSBzZXR0aW5nICVkIHRpbGVzIGluIHkgPT4gSFlQT1RIRVNJUyEhIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2NwLT50aCA+IGxfY3AtPm1heF90aWxlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NwLT50aD0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiLSB0b28gbGFyZ2UgeSwgaW5jcmVhc2UgZXhwZWN0YW5jZSBvZiAlZCB0byBjb250aW51ZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLSBzZXR0aW5nICVkIHRpbGVzIGluIHkgPT4gSFlQT1RIRVNJUyEhIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NwLT5tYXhfdGlsZXMsIGxfY3AtPnRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBVU0VfSlBXTCAqLworCisgICAgICAgIC8qIG1lbW9yeSBhbGxvY2F0aW9ucyAqLworICAgICAgICBsX2NwLT50Y3BzID0gKG9wal90Y3BfdCopIG9wal9jYWxsb2MobF9uYl90aWxlcywgc2l6ZW9mKG9wal90Y3BfdCkpOworICAgICAgICBpZiAobF9jcC0+dGNwcyA9PSAwMCkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byB0YWtlIGluIGNoYXJnZSBTSVogbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyNpZmRlZiBVU0VfSlBXTAorICAgICAgICBpZiAobF9jcC0+Y29ycmVjdCkgeworICAgICAgICAgICAgICAgIGlmICghbF9jcC0+dGNwcykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEpQV0xfQVNTVU1FID8gRVZUX1dBUk5JTkcgOiBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKUFdMOiBjb3VsZCBub3QgYWxsb2MgdGNwcyBmaWVsZCBvZiBjcFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUpQV0xfQVNTVU1FIHx8IEpQV0xfQVNTVU1FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJKUFdMOiBnaXZpbmcgdXBcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9KUFdMICovCisKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3AtPnRjY3BzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChvcGpfdGNjcF90Kikgb3BqX2NhbGxvYyhsX2ltYWdlLT5udW1jb21wcywgc2l6ZW9mKG9wal90Y2NwX3QpKTsKKyAgICAgICAgaWYocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3AtPnRjY3BzICA9PSAwMCkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byB0YWtlIGluIGNoYXJnZSBTSVogbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3AtPm1fbWN0X3JlY29yZHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgKG9wal9tY3RfZGF0YV90KilvcGpfY2FsbG9jKE9QSl9KMktfTUNUX0RFRkFVTFRfTkJfUkVDT1JEUyAsc2l6ZW9mKG9wal9tY3RfZGF0YV90KSk7CisKKyAgICAgICAgaWYgKCEgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3AtPm1fbWN0X3JlY29yZHMpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gdGFrZSBpbiBjaGFyZ2UgU0laIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMgPSBPUEpfSjJLX01DVF9ERUZBVUxUX05CX1JFQ09SRFM7CisKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3AtPm1fbWNjX3JlY29yZHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgKG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90KikKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jYWxsb2MoT1BKX0oyS19NQ0NfREVGQVVMVF9OQl9SRUNPUkRTLCBzaXplb2Yob3BqX3NpbXBsZV9tY2NfZGVjb3JyZWxhdGlvbl9kYXRhX3QpKTsKKworICAgICAgICBpZiAoISBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcC0+bV9tY2NfcmVjb3JkcykgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byB0YWtlIGluIGNoYXJnZSBTSVogbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwLT5tX25iX21heF9tY2NfcmVjb3JkcyA9IE9QSl9KMktfTUNDX0RFRkFVTFRfTkJfUkVDT1JEUzsKKworICAgICAgICAvKiBzZXQgdXAgZGVmYXVsdCBkYyBsZXZlbCBzaGlmdCAqLworICAgICAgICBmb3IgKGk9MDtpPGxfaW1hZ2UtPm51bWNvbXBzOysraSkgeworICAgICAgICAgICAgICAgIGlmICghIGxfaW1hZ2UtPmNvbXBzW2ldLnNnbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwLT50Y2Nwc1tpXS5tX2RjX2xldmVsX3NoaWZ0ID0gMSA8PCAobF9pbWFnZS0+Y29tcHNbaV0ucHJlYyAtIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGxfY3VycmVudF90aWxlX3BhcmFtID0gbF9jcC0+dGNwczsKKyAgICAgICAgZm9yICAgICAoaSA9IDA7IGkgPCBsX25iX3RpbGVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBsX2N1cnJlbnRfdGlsZV9wYXJhbS0+dGNjcHMgPSAob3BqX3RjY3BfdCopIG9wal9jYWxsb2MobF9pbWFnZS0+bnVtY29tcHMsIHNpemVvZihvcGpfdGNjcF90KSk7CisgICAgICAgICAgICAgICAgaWYgKGxfY3VycmVudF90aWxlX3BhcmFtLT50Y2NwcyA9PSAwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHRha2UgaW4gY2hhcmdlIFNJWiBtYXJrZXJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICArK2xfY3VycmVudF90aWxlX3BhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPSAgSjJLX1NUQVRFX01IOyAvKiBGSVhNRSBKMktfREVDX1NUQVRFX01IOyAqLworICAgICAgICBvcGpfaW1hZ2VfY29tcF9oZWFkZXJfdXBkYXRlKGxfaW1hZ2UsbF9jcCk7CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9jb20oICAgICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBsX2NvbW1lbnRfc2l6ZTsKKyAgICAgICAgT1BKX1VJTlQzMiBsX3RvdGFsX2NvbV9zaXplOworICAgICAgICBjb25zdCBPUEpfQ0hBUiAqbF9jb21tZW50OworICAgICAgICBPUEpfQllURSAqIGxfY3VycmVudF9wdHIgPSAwMDsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisgICAgICAgIGxfY29tbWVudCA9IHBfajJrLT5tX2NwLmNvbW1lbnQ7CisgICAgICAgIGxfY29tbWVudF9zaXplID0gKE9QSl9VSU5UMzIpc3RybGVuKGxfY29tbWVudCk7CisgICAgICAgIGxfdG90YWxfY29tX3NpemUgPSBsX2NvbW1lbnRfc2l6ZSArIDY7CisKKyAgICAgICAgaWYgKGxfdG90YWxfY29tX3NpemUgPiBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICBPUEpfQllURSAqbmV3X2hlYWRlcl90aWxlX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwgbF90b3RhbF9jb21fc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCEgbmV3X2hlYWRlcl90aWxlX2RhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHdyaXRlIHRoZSBDT00gbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBuZXdfaGVhZGVyX3RpbGVfZGF0YTsKKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSBsX3RvdGFsX2NvbV9zaXplOworICAgICAgICB9CisKKyAgICAgICAgbF9jdXJyZW50X3B0ciA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGE7CisKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9wdHIsSjJLX01TX0NPTSAsIDIpOyAgLyogQ09NICovCisgICAgICAgIGxfY3VycmVudF9wdHIrPTI7CisKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9wdHIsbF90b3RhbF9jb21fc2l6ZSAtIDIgLCAyKTsgICAgICAgIC8qIExfQ09NICovCisgICAgICAgIGxfY3VycmVudF9wdHIrPTI7CisKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9wdHIsMSAsIDIpOyAgIC8qIEdlbmVyYWwgdXNlIChJUyA4ODU5LTE1OjE5OTkgKExhdGluKSB2YWx1ZXMpICovCisgICAgICAgIGxfY3VycmVudF9wdHIrPTI7CisKKyAgICAgICAgbWVtY3B5KCBsX2N1cnJlbnRfcHRyLGxfY29tbWVudCxsX2NvbW1lbnRfc2l6ZSk7CisKKyAgICAgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLGxfdG90YWxfY29tX3NpemUscF9tYW5hZ2VyKSAhPSBsX3RvdGFsX2NvbV9zaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworLyoqCisgKiBSZWFkcyBhIENPTSBtYXJrZXIgKGNvbW1lbnRzKQorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICB0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KKyAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9kYXRhICAgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBDT00gYm94LgorICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENPTSBtYXJrZXIuCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX2NvbSAoICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKKyAgKHZvaWQpcF9oZWFkZXJfc2l6ZTsKKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2NvZCggICAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3sKKyAgICAgICAgb3BqX2NwX3QgKmxfY3AgPSAwMDsKKyAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOworICAgICAgICBPUEpfVUlOVDMyIGxfY29kZV9zaXplLGxfcmVtYWluaW5nX3NpemU7CisgICAgICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworCisgICAgICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKKyAgICAgICAgbF90Y3AgPSAmbF9jcC0+dGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXTsKKyAgICAgICAgbF9jb2RlX3NpemUgPSA5ICsgb3BqX2oya19nZXRfU1BDb2RfU1BDb2Nfc2l6ZShwX2oyayxwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLDApOworICAgICAgICBsX3JlbWFpbmluZ19zaXplID0gbF9jb2RlX3NpemU7CisKKyAgICAgICAgaWYgKGxfY29kZV9zaXplID4gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgT1BKX0JZVEUgKm5ld19oZWFkZXJfdGlsZV9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsIGxfY29kZV9zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoISBuZXdfaGVhZGVyX3RpbGVfZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gd3JpdGUgQ09EIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gbmV3X2hlYWRlcl90aWxlX2RhdGE7CisgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gbF9jb2RlX3NpemU7CisgICAgICAgIH0KKworICAgICAgICBsX2N1cnJlbnRfZGF0YSA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGE7CisKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLEoyS19NU19DT0QsMik7ICAgICAgICAgICAvKiBDT0QgKi8KKyAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF9jb2RlX3NpemUtMiwyKTsgICAgICAgIC8qIExfQ09EICovCisgICAgICAgIGxfY3VycmVudF9kYXRhICs9IDI7CisKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfdGNwLT5jc3R5LDEpOyAgICAgICAgICAvKiBTY29kICovCisgICAgICAgICsrbF9jdXJyZW50X2RhdGE7CisKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfdGNwLT5wcmcsMSk7ICAgICAgICAgICAvKiBTR2NvZCAoQSkgKi8KKyAgICAgICAgKytsX2N1cnJlbnRfZGF0YTsKKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF90Y3AtPm51bWxheWVycywyKTsgICAgIC8qIFNHY29kIChCKSAqLworICAgICAgICBsX2N1cnJlbnRfZGF0YSs9MjsKKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF90Y3AtPm1jdCwxKTsgICAgICAgICAgIC8qIFNHY29kIChDKSAqLworICAgICAgICArK2xfY3VycmVudF9kYXRhOworCisgICAgICAgIGxfcmVtYWluaW5nX3NpemUgLT0gOTsKKworICAgICAgICBpZiAoISBvcGpfajJrX3dyaXRlX1NQQ29kX1NQQ29jKHBfajJrLHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIsMCxsX2N1cnJlbnRfZGF0YSwmbF9yZW1haW5pbmdfc2l6ZSxwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdyaXRpbmcgQ09EIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsX3JlbWFpbmluZ19zaXplICE9IDApIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd3JpdGluZyBDT0QgbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLGxfY29kZV9zaXplLHBfbWFuYWdlcikgIT0gbF9jb2RlX3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCisvKioKKyAqIFJlYWRzIGEgQ09EIG1hcmtlciAoQ29kaW5nIFN0eWtlIGRlZmF1bHRzKQorICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENPRCBib3guCisgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgorICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENPRCBtYXJrZXIuCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX2NvZCAoICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgICAgIC8qIGxvb3AgKi8KKyAgICAgICAgT1BKX1VJTlQzMiBpOworICAgICAgICBPUEpfVUlOVDMyIGxfdG1wOworICAgICAgICBvcGpfY3BfdCAqbF9jcCA9IDAwOworICAgICAgICBvcGpfdGNwX3QgKmxfdGNwID0gMDA7CisgICAgICAgIG9wal9pbWFnZV90ICpsX2ltYWdlID0gMDA7CisKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisgICAgICAgIGxfaW1hZ2UgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlOworICAgICAgICBsX2NwID0gJihwX2oyay0+bV9jcCk7CisKKyAgICAgICAgLyogSWYgd2UgYXJlIGluIHRoZSBmaXJzdCB0aWxlLXBhcnQgaGVhZGVyIG9mIHRoZSBjdXJyZW50IHRpbGUgKi8KKyAgICAgICAgbF90Y3AgPSAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPT0gSjJLX1NUQVRFX1RQSCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF9jcC0+dGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwOworCQorICAgICAgICAvKiBPbmx5IG9uZSBDT0QgcGVyIHRpbGUgKi8KKyAgICAgICAgaWYgKGxfdGNwLT5jb2QpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ09EIG1hcmtlciBhbHJlYWR5IHJlYWQuIE5vIG1vcmUgdGhhbiBvbmUgQ09EIG1hcmtlciBwZXIgdGlsZS5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgbF90Y3AtPmNvZCA9IDE7CisJCisgICAgICAgIC8qIE1ha2Ugc3VyZSByb29tIGlzIHN1ZmZpY2llbnQgKi8KKyAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCA1KSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgQ09EIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfdGNwLT5jc3R5LDEpOyAgICAgICAgICAgLyogU2NvZCAqLworICAgICAgICArK3BfaGVhZGVyX2RhdGE7CisgICAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBrbm93IGhvdyB0byBkZWNvZGUgdGhpcyAqLworICAgICAgICBpZiAoKGxfdGNwLT5jc3R5ICYgfihPUEpfVUlOVDMyKShKMktfQ1BfQ1NUWV9QUlQgfCBKMktfQ1BfQ1NUWV9TT1AgfCBKMktfQ1BfQ1NUWV9FUEgpKSAhPSAwVSkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJVbmtub3duIFNjb2QgdmFsdWUgaW4gQ09EIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX3RtcCwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0djb2QgKEEpICovCisgICAgICAgICsrcF9oZWFkZXJfZGF0YTsKKyAgICAgICAgbF90Y3AtPnByZyA9IChPUEpfUFJPR19PUkRFUikgbF90bXA7CisgICAgICAgIC8qIE1ha2Ugc3VyZSBwcm9ncmVzc2lvbiBvcmRlciBpcyB2YWxpZCAqLworICAgICAgICBpZiAobF90Y3AtPnByZyA+IE9QSl9DUFJMICkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJVbmtub3duIHByb2dyZXNzaW9uIG9yZGVyIGluIENPRCBtYXJrZXJcbiIpOworICAgICAgICAgICAgICAgIGxfdGNwLT5wcmcgPSBPUEpfUFJPR19VTktOT1dOOworICAgICAgICB9CisgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfdGNwLT5udW1sYXllcnMsMik7ICAgICAgLyogU0djb2QgKEIpICovCisgICAgICAgIHBfaGVhZGVyX2RhdGErPTI7CisJCisgICAgICAgIGlmICgobF90Y3AtPm51bWxheWVycyA8IDFVKSB8fCAobF90Y3AtPm51bWxheWVycyA+IDY1NTM1VSkpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSW52YWxpZCBudW1iZXIgb2YgbGF5ZXJzIGluIENPRCBtYXJrZXIgOiAlZCBub3QgaW4gcmFuZ2UgWzEtNjU1MzVdXG4iLCBsX3RjcC0+bnVtbGF5ZXJzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLyogSWYgdXNlciBkaWRuJ3Qgc2V0IGEgbnVtYmVyIGxheWVyIHRvIGRlY29kZSB0YWtlIHRoZSBtYXggc3BlY2lmeSBpbiB0aGUgY29kZXN0cmVhbS4gKi8KKyAgICAgICAgaWYgICAgICAobF9jcC0+bV9zcGVjaWZpY19wYXJhbS5tX2RlYy5tX2xheWVyKSB7CisgICAgICAgICAgICAgICAgbF90Y3AtPm51bV9sYXllcnNfdG9fZGVjb2RlID0gbF9jcC0+bV9zcGVjaWZpY19wYXJhbS5tX2RlYy5tX2xheWVyOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGxfdGNwLT5udW1fbGF5ZXJzX3RvX2RlY29kZSA9IGxfdGNwLT5udW1sYXllcnM7CisgICAgICAgIH0KKworICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX3RjcC0+bWN0LDEpOyAgICAgICAgICAgIC8qIFNHY29kIChDKSAqLworICAgICAgICArK3BfaGVhZGVyX2RhdGE7CisKKyAgICAgICAgcF9oZWFkZXJfc2l6ZSAtPSA1OworICAgICAgICBmb3IgICAgIChpID0gMDsgaSA8IGxfaW1hZ2UtPm51bWNvbXBzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBsX3RjcC0+dGNjcHNbaV0uY3N0eSA9IGxfdGNwLT5jc3R5ICYgSjJLX0NDUF9DU1RZX1BSVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghIG9wal9qMmtfcmVhZF9TUENvZF9TUENvYyhwX2oyaywwLHBfaGVhZGVyX2RhdGEsJnBfaGVhZGVyX3NpemUscF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIENPRCBtYXJrZXJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAocF9oZWFkZXJfc2l6ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgQ09EIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFwcGx5IHRoZSBjb2Rpbmcgc3R5bGUgdG8gb3RoZXIgY29tcG9uZW50cyBvZiB0aGUgY3VycmVudCB0aWxlIG9yIHRoZSBtX2RlZmF1bHRfdGNwKi8KKyAgICAgICAgb3BqX2oya19jb3B5X3RpbGVfY29tcG9uZW50X3BhcmFtZXRlcnMocF9qMmspOworCisgICAgICAgIC8qIEluZGV4ICovCisjaWZkZWYgV0lQX1JFTU9WRV9NU0QKKyAgICAgICAgaWYgKHBfajJrLT5jc3RyX2luZm8pIHsKKyAgICAgICAgICAgICAgICAvKm9wal9jb2Rlc3RyZWFtX2luZm9fdCAqbF9jc3RyX2luZm8gPSBwX2oyay0+Y3N0cl9pbmZvOyovCisgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5mby0+cHJvZyA9IGxfdGNwLT5wcmc7CisgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5mby0+bnVtbGF5ZXJzID0gbF90Y3AtPm51bWxheWVyczsKKyAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmZvLT5udW1kZWNvbXBvcyA9IChPUEpfSU5UMzIqKSBvcGpfbWFsbG9jKGxfaW1hZ2UtPm51bWNvbXBzICogc2l6ZW9mKE9QSl9VSU5UMzIpKTsKKyAgICAgICAgICAgICAgICBmb3IgICAgIChpID0gMDsgaSA8IGxfaW1hZ2UtPm51bWNvbXBzOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPm51bWRlY29tcG9zW2ldID0gbF90Y3AtPnRjY3BzW2ldLm51bXJlc29sdXRpb25zIC0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworI2lmIDAKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2NvYyggb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBsX2NvY19zaXplLGxfcmVtYWluaW5nX3NpemU7CisgICAgICAgIE9QSl9VSU5UMzIgbF9jb21wX3Jvb207CisKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKworICAgICAgICBsX2NvbXBfcm9vbSA9IChwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wcyA8PSAyNTYpID8gMSA6IDI7CisKKyAgICAgICAgbF9jb2Nfc2l6ZSA9IDUgKyBsX2NvbXBfcm9vbSArIG9wal9qMmtfZ2V0X1NQQ29kX1NQQ29jX3NpemUocF9qMmsscF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcixwX2NvbXBfbm8pOworCisgICAgICAgIGlmIChsX2NvY19zaXplID4gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgT1BKX0JZVEUgKm5ld19oZWFkZXJfdGlsZV9kYXRhOworICAgICAgICAgICAgICAgIC8qcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgPSAoT1BKX0JZVEUqKW9wal9yZWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NvY19zaXplKTsqLworCisgICAgICAgICAgICAgICAgbmV3X2hlYWRlcl90aWxlX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwgbF9jb2Nfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCEgbmV3X2hlYWRlcl90aWxlX2RhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHdyaXRlIENPQyBtYXJrZXJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IG5ld19oZWFkZXJfdGlsZV9kYXRhOworICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IGxfY29jX3NpemU7CisgICAgICAgIH0KKworICAgICAgICBvcGpfajJrX3dyaXRlX2NvY19pbl9tZW1vcnkocF9qMmsscF9jb21wX25vLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsJmxfcmVtYWluaW5nX3NpemUscF9tYW5hZ2VyKTsKKworICAgICAgICBpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKHBfc3RyZWFtLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsbF9jb2Nfc2l6ZSxwX21hbmFnZXIpICE9IGxfY29jX3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorI2VuZGlmCisKKyNpZiAwCitzdGF0aWMgdm9pZCBvcGpfajJrX3dyaXRlX2NvY19pbl9tZW1vcnkoICAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAgICAgb3BqX2NwX3QgKmxfY3AgPSAwMDsKKyAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOworICAgICAgICBPUEpfVUlOVDMyIGxfY29jX3NpemUsbF9yZW1haW5pbmdfc2l6ZTsKKyAgICAgICAgT1BKX0JZVEUgKiBsX2N1cnJlbnRfZGF0YSA9IDAwOworICAgICAgICBvcGpfaW1hZ2VfdCAqbF9pbWFnZSA9IDAwOworICAgICAgICBPUEpfVUlOVDMyIGxfY29tcF9yb29tOworCisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisKKyAgICAgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOworICAgICAgICBsX3RjcCA9ICZsX2NwLT50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdOworICAgICAgICBsX2ltYWdlID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZTsKKyAgICAgICAgbF9jb21wX3Jvb20gPSAobF9pbWFnZS0+bnVtY29tcHMgPD0gMjU2KSA/IDEgOiAyOworCisgICAgICAgIGxfY29jX3NpemUgPSA1ICsgbF9jb21wX3Jvb20gKyBvcGpfajJrX2dldF9TUENvZF9TUENvY19zaXplKHBfajJrLHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIscF9jb21wX25vKTsKKyAgICAgICAgbF9yZW1haW5pbmdfc2l6ZSA9IGxfY29jX3NpemU7CisKKyAgICAgICAgbF9jdXJyZW50X2RhdGEgPSBwX2RhdGE7CisKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLEoyS19NU19DT0MsMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ09DICovCisgICAgICAgIGxfY3VycmVudF9kYXRhICs9IDI7CisKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfY29jX3NpemUtMiwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTF9DT0MgKi8KKyAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEscF9jb21wX25vLCBsX2NvbXBfcm9vbSk7ICAgICAgICAgLyogQ2NvYyAqLworICAgICAgICBsX2N1cnJlbnRfZGF0YSs9bF9jb21wX3Jvb207CisKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLCBsX3RjcC0+dGNjcHNbcF9jb21wX25vXS5jc3R5LCAxKTsgICAgICAgICAgICAgICAvKiBTY29jICovCisgICAgICAgICsrbF9jdXJyZW50X2RhdGE7CisKKyAgICAgICAgbF9yZW1haW5pbmdfc2l6ZSAtPSAoNSArIGxfY29tcF9yb29tKTsKKyAgICAgICAgb3BqX2oya193cml0ZV9TUENvZF9TUENvYyhwX2oyayxwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLDAsbF9jdXJyZW50X2RhdGEsJmxfcmVtYWluaW5nX3NpemUscF9tYW5hZ2VyKTsKKyAgICAgICAgKiBwX2RhdGFfd3JpdHRlbiA9IGxfY29jX3NpemU7Cit9CisjZW5kaWYKKworc3RhdGljIE9QSl9VSU5UMzIgb3BqX2oya19nZXRfbWF4X2NvY19zaXplKG9wal9qMmtfdCAqcF9qMmspCit7CisgICAgICAgIE9QSl9VSU5UMzIgaSxqOworICAgICAgICBPUEpfVUlOVDMyIGxfbmJfY29tcDsKKyAgICAgICAgT1BKX1VJTlQzMiBsX25iX3RpbGVzOworICAgICAgICBPUEpfVUlOVDMyIGxfbWF4ID0gMDsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisKKyAgICAgICAgbF9uYl90aWxlcyA9IHBfajJrLT5tX2NwLnR3ICogcF9qMmstPm1fY3AudGggOworICAgICAgICBsX25iX2NvbXAgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wczsKKworICAgICAgICBmb3IgKGk9MDtpPGxfbmJfdGlsZXM7KytpKSB7CisgICAgICAgICAgICAgICAgZm9yIChqPTA7ajxsX25iX2NvbXA7KytqKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsX21heCA9IG9wal91aW50X21heChsX21heCxvcGpfajJrX2dldF9TUENvZF9TUENvY19zaXplKHBfajJrLGksaikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiA2ICsgbF9tYXg7Cit9CisKKy8qKgorICogUmVhZHMgYSBDT0MgbWFya2VyIChDb2RpbmcgU3R5bGUgQ29tcG9uZW50KQorICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENPQyBib3guCisgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgorICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENPQyBtYXJrZXIuCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX2NvYyAoICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgICAgIG9wal9jcF90ICpsX2NwID0gTlVMTDsKKyAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IE5VTEw7CisgICAgICAgIG9wal9pbWFnZV90ICpsX2ltYWdlID0gTlVMTDsKKyAgICAgICAgT1BKX1VJTlQzMiBsX2NvbXBfcm9vbTsKKyAgICAgICAgT1BKX1VJTlQzMiBsX2NvbXBfbm87CisKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisgICAgICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKKyAgICAgICAgbF90Y3AgPSAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPT0gSjJLX1NUQVRFX1RQSCApID8gLypGSVhNRSBKMktfREVDX1NUQVRFX1RQSCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX2NwLT50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3A7CisgICAgICAgIGxfaW1hZ2UgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlOworCisgICAgICAgIGxfY29tcF9yb29tID0gbF9pbWFnZS0+bnVtY29tcHMgPD0gMjU2ID8gMSA6IDI7CisKKyAgICAgICAgLyogbWFrZSBzdXJlIHJvb20gaXMgc3VmZmljaWVudCovCisgICAgICAgIGlmIChwX2hlYWRlcl9zaXplIDwgbF9jb21wX3Jvb20gKyAxKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgQ09DIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBwX2hlYWRlcl9zaXplIC09IGxfY29tcF9yb29tICsgMTsKKworICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX2NvbXBfbm8sbF9jb21wX3Jvb20pOyAgICAgICAgICAgICAgICAgICAvKiBDY29jICovCisgICAgICAgIHBfaGVhZGVyX2RhdGEgKz0gbF9jb21wX3Jvb207CisgICAgICAgIGlmIChsX2NvbXBfbm8gPj0gbF9pbWFnZS0+bnVtY29tcHMpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBDT0MgbWFya2VyIChiYWQgbnVtYmVyIG9mIGNvbXBvbmVudHMpXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF90Y3AtPnRjY3BzW2xfY29tcF9ub10uY3N0eSwxKTsgICAgICAgICAgICAgICAgICAvKiBTY29jICovCisgICAgICAgICsrcF9oZWFkZXJfZGF0YSA7CisKKyAgICAgICAgaWYgKCEgb3BqX2oya19yZWFkX1NQQ29kX1NQQ29jKHBfajJrLGxfY29tcF9ubyxwX2hlYWRlcl9kYXRhLCZwX2hlYWRlcl9zaXplLHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBDT0MgbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgIT0gMCkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIENPQyBtYXJrZXJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9xY2QoICAgICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBsX3FjZF9zaXplLGxfcmVtYWluaW5nX3NpemU7CisgICAgICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworCisgICAgICAgIGxfcWNkX3NpemUgPSA0ICsgb3BqX2oya19nZXRfU1FjZF9TUWNjX3NpemUocF9qMmsscF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciwwKTsKKyAgICAgICAgbF9yZW1haW5pbmdfc2l6ZSA9IGxfcWNkX3NpemU7CisKKyAgICAgICAgaWYgKGxfcWNkX3NpemUgPiBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICBPUEpfQllURSAqbmV3X2hlYWRlcl90aWxlX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwgbF9xY2Rfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCEgbmV3X2hlYWRlcl90aWxlX2RhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHdyaXRlIFFDRCBtYXJrZXJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IG5ld19oZWFkZXJfdGlsZV9kYXRhOworICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IGxfcWNkX3NpemU7CisgICAgICAgIH0KKworICAgICAgICBsX2N1cnJlbnRfZGF0YSA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGE7CisKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLEoyS19NU19RQ0QsMik7ICAgICAgICAgICAvKiBRQ0QgKi8KKyAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF9xY2Rfc2l6ZS0yLDIpOyAgICAgICAgIC8qIExfUUNEICovCisgICAgICAgIGxfY3VycmVudF9kYXRhICs9IDI7CisKKyAgICAgICAgbF9yZW1haW5pbmdfc2l6ZSAtPSA0OworCisgICAgICAgIGlmICghIG9wal9qMmtfd3JpdGVfU1FjZF9TUWNjKHBfajJrLHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIsMCxsX2N1cnJlbnRfZGF0YSwmbF9yZW1haW5pbmdfc2l6ZSxwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdyaXRpbmcgUUNEIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsX3JlbWFpbmluZ19zaXplICE9IDApIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd3JpdGluZyBRQ0QgbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShwX3N0cmVhbSwgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSxsX3FjZF9zaXplLHBfbWFuYWdlcikgIT0gbF9xY2Rfc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKKy8qKgorICogUmVhZHMgYSBRQ0QgbWFya2VyIChRdWFudGl6YXRpb24gZGVmYXVsdHMpCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUUNEIGJveC4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUUNEIG1hcmtlci4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfcWNkICggIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisgICAgICAgIGlmICghIG9wal9qMmtfcmVhZF9TUWNkX1NRY2MocF9qMmssMCxwX2hlYWRlcl9kYXRhLCZwX2hlYWRlcl9zaXplLHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBRQ0QgbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgIT0gMCkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFFDRCBtYXJrZXJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICAvKiBBcHBseSB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlcnMgdG8gb3RoZXIgY29tcG9uZW50cyBvZiB0aGUgY3VycmVudCB0aWxlIG9yIHRoZSBtX2RlZmF1bHRfdGNwICovCisgICAgICAgIG9wal9qMmtfY29weV90aWxlX3F1YW50aXphdGlvbl9wYXJhbWV0ZXJzKHBfajJrKTsKKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKKyNpZiAwCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9xY2MoICAgICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgICAgIE9QSl9VSU5UMzIgbF9xY2Nfc2l6ZSxsX3JlbWFpbmluZ19zaXplOworCisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CisKKyAgICAgICAgbF9xY2Nfc2l6ZSA9IDUgKyBvcGpfajJrX2dldF9TUWNkX1NRY2Nfc2l6ZShwX2oyayxwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLHBfY29tcF9ubyk7CisgICAgICAgIGxfcWNjX3NpemUgKz0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHMgPD0gMjU2ID8gMDoxOworICAgICAgICBsX3JlbWFpbmluZ19zaXplID0gbF9xY2Nfc2l6ZTsKKworICAgICAgICBpZiAobF9xY2Nfc2l6ZSA+IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgIE9QSl9CWVRFICpuZXdfaGVhZGVyX3RpbGVfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfcmVhbGxvYyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLCBsX3FjY19zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoISBuZXdfaGVhZGVyX3RpbGVfZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gd3JpdGUgUUNDIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gbmV3X2hlYWRlcl90aWxlX2RhdGE7CisgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gbF9xY2Nfc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIG9wal9qMmtfd3JpdGVfcWNjX2luX21lbW9yeShwX2oyayxwX2NvbXBfbm8scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwmbF9yZW1haW5pbmdfc2l6ZSxwX21hbmFnZXIpOworCisgICAgICAgIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSxsX3FjY19zaXplLHBfbWFuYWdlcikgIT0gbF9xY2Nfc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisjZW5kaWYKKworI2lmIDAKK3N0YXRpYyB2b2lkIG9wal9qMmtfd3JpdGVfcWNjX2luX21lbW9yeSggICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBsX3FjY19zaXplLGxfcmVtYWluaW5nX3NpemU7CisgICAgICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisgICAgICAgIGxfcWNjX3NpemUgPSA2ICsgb3BqX2oya19nZXRfU1FjZF9TUWNjX3NpemUocF9qMmsscF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcixwX2NvbXBfbm8pOworICAgICAgICBsX3JlbWFpbmluZ19zaXplID0gbF9xY2Nfc2l6ZTsKKworICAgICAgICBsX2N1cnJlbnRfZGF0YSA9IHBfZGF0YTsKKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsSjJLX01TX1FDQywyKTsgICAgICAgICAgIC8qIFFDQyAqLworICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOworCisgICAgICAgIGlmIChwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wcyA8PSAyNTYpIHsKKyAgICAgICAgICAgICAgICAtLWxfcWNjX3NpemU7CisKKyAgICAgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF9xY2Nfc2l6ZS0yLDIpOyAgICAgICAgIC8qIExfUUNDICovCisgICAgICAgICAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKKworICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgcF9jb21wX25vLCAxKTsgIC8qIENxY2MgKi8KKyAgICAgICAgICAgICAgICArK2xfY3VycmVudF9kYXRhOworCisgICAgICAgICAgICAgICAgLyogaW4gdGhlIGNhc2Ugb25seSBvbmUgYnl0ZSBpcyBzdWZmaWNpZW50IHRoZSBsYXN0IGJ5dGUgYWxsb2NhdGVkIGlzIHVzZWxlc3MgLT4gc3RpbGwgZG8gLTYgZm9yIGF2YWlsYWJsZSAqLworICAgICAgICAgICAgICAgIGxfcmVtYWluaW5nX3NpemUgLT0gNjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF9xY2Nfc2l6ZS0yLDIpOyAgICAgICAgIC8qIExfUUNDICovCisgICAgICAgICAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKKworICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgcF9jb21wX25vLCAyKTsgIC8qIENxY2MgKi8KKyAgICAgICAgICAgICAgICBsX2N1cnJlbnRfZGF0YSs9MjsKKworICAgICAgICAgICAgICAgIGxfcmVtYWluaW5nX3NpemUgLT0gNjsKKyAgICAgICAgfQorCisgICAgICAgIG9wal9qMmtfd3JpdGVfU1FjZF9TUWNjKHBfajJrLHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIscF9jb21wX25vLGxfY3VycmVudF9kYXRhLCZsX3JlbWFpbmluZ19zaXplLHBfbWFuYWdlcik7CisKKyAgICAgICAgKnBfZGF0YV93cml0dGVuID0gbF9xY2Nfc2l6ZTsKK30KKyNlbmRpZgorCitzdGF0aWMgT1BKX1VJTlQzMiBvcGpfajJrX2dldF9tYXhfcWNjX3NpemUgKG9wal9qMmtfdCAqcF9qMmspCit7CisgICAgICAgIHJldHVybiBvcGpfajJrX2dldF9tYXhfY29jX3NpemUocF9qMmspOworfQorCisvKioKKyAqIFJlYWRzIGEgUUNDIG1hcmtlciAoUXVhbnRpemF0aW9uIGNvbXBvbmVudCkKKyAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9kYXRhICAgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBRQ0MgYm94LgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KKyAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBRQ0MgbWFya2VyLgorICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9xY2MoICAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgICAgICBPUEpfVUlOVDMyIGxfbnVtX2NvbXAsbF9jb21wX25vOworCisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICAgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOworICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworICAgICAgICBsX251bV9jb21wID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHM7CisKKyAgICAgICAgaWYgKGxfbnVtX2NvbXAgPD0gMjU2KSB7CisgICAgICAgICAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBRQ0MgbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfY29tcF9ubywxKTsKKyAgICAgICAgICAgICAgICArK3BfaGVhZGVyX2RhdGE7CisgICAgICAgICAgICAgICAgLS1wX2hlYWRlcl9zaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChwX2hlYWRlcl9zaXplIDwgMikgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUUNDIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX2NvbXBfbm8sMik7CisgICAgICAgICAgICAgICAgcF9oZWFkZXJfZGF0YSs9MjsKKyAgICAgICAgICAgICAgICBwX2hlYWRlcl9zaXplLT0yOworICAgICAgICB9CisKKyNpZmRlZiBVU0VfSlBXTAorICAgICAgICBpZiAocF9qMmstPm1fY3AuY29ycmVjdCkgeworCisgICAgICAgICAgICAgICAgc3RhdGljIE9QSl9VSU5UMzIgYmFja3VwX2NvbXBubyA9IDA7CisKKyAgICAgICAgICAgICAgICAvKiBjb21wbm8gaXMgbmVnYXRpdmUgb3IgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBjb21wb25lbnRzISEhICovCisgICAgICAgICAgICAgICAgaWYgKC8qKGxfY29tcF9ubyA8IDApIHx8Ki8gKGxfY29tcF9ubyA+PSBsX251bV9jb21wKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpQV0w6IGJhZCBjb21wb25lbnQgbnVtYmVyIGluIFFDQyAoJWQgb3V0IG9mIGEgbWF4aW11bSBvZiAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY29tcF9ubywgbF9udW1fY29tcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUpQV0xfQVNTVU1FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJKUFdMOiBnaXZpbmcgdXBcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UgdHJ5IHRvIGNvcnJlY3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxfY29tcF9ubyA9IGJhY2t1cF9jb21wbm8gJSBsX251bV9jb21wOworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiLSB0cnlpbmcgdG8gYWRqdXN0IHRoaXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0gc2V0dGluZyBjb21wb25lbnQgbnVtYmVyIHRvICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NvbXBfbm8pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIGtlZXAgeW91ciBwcml2YXRlIGNvdW50IG9mIHRpbGVzICovCisgICAgICAgICAgICAgICAgYmFja3VwX2NvbXBubysrOworICAgICAgICB9OworI2VuZGlmIC8qIFVTRV9KUFdMICovCisKKyAgICAgICAgaWYgKGxfY29tcF9ubyA+PSBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wcykgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBjb21wb25lbnQgbnVtYmVyOiAlZCwgcmVnYXJkaW5nIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY29tcF9ubywgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHMpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoISBvcGpfajJrX3JlYWRfU1FjZF9TUWNjKHBfajJrLGxfY29tcF9ubyxwX2hlYWRlcl9kYXRhLCZwX2hlYWRlcl9zaXplLHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBRQ0MgbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgIT0gMCkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFFDQyBtYXJrZXJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX3BvYyggICAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgICAgICBPUEpfVUlOVDMyIGxfbmJfY29tcDsKKyAgICAgICAgT1BKX1VJTlQzMiBsX25iX3BvYzsKKyAgICAgICAgT1BKX1VJTlQzMiBsX3BvY19zaXplOworICAgICAgICBPUEpfVUlOVDMyIGxfd3JpdHRlbl9zaXplID0gMDsKKyAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOworICAgICAgICBPUEpfVUlOVDMyIGxfcG9jX3Jvb207CisKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKworICAgICAgICBsX3RjcCA9ICZwX2oyay0+bV9jcC50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdOworICAgICAgICBsX25iX2NvbXAgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wczsKKyAgICAgICAgbF9uYl9wb2MgPSAxICsgbF90Y3AtPm51bXBvY3M7CisKKyAgICAgICAgaWYgKGxfbmJfY29tcCA8PSAyNTYpIHsKKyAgICAgICAgICAgICAgICBsX3BvY19yb29tID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsX3BvY19yb29tID0gMjsKKyAgICAgICAgfQorICAgICAgICBsX3BvY19zaXplID0gNCArICg1ICsgMiAqIGxfcG9jX3Jvb20pICogbF9uYl9wb2M7CisKKyAgICAgICAgaWYgKGxfcG9jX3NpemUgPiBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICBPUEpfQllURSAqbmV3X2hlYWRlcl90aWxlX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwgbF9wb2Nfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCEgbmV3X2hlYWRlcl90aWxlX2RhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHdyaXRlIFBPQyBtYXJrZXJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IG5ld19oZWFkZXJfdGlsZV9kYXRhOworICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IGxfcG9jX3NpemU7CisgICAgICAgIH0KKworICAgICAgICBvcGpfajJrX3dyaXRlX3BvY19pbl9tZW1vcnkocF9qMmsscF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwmbF93cml0dGVuX3NpemUscF9tYW5hZ2VyKTsKKworICAgICAgICBpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKHBfc3RyZWFtLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsbF9wb2Nfc2l6ZSxwX21hbmFnZXIpICE9IGxfcG9jX3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgdm9pZCBvcGpfajJrX3dyaXRlX3BvY19pbl9tZW1vcnkoICAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgICAgIE9QSl9VSU5UMzIgaTsKKyAgICAgICAgT1BKX0JZVEUgKiBsX2N1cnJlbnRfZGF0YSA9IDAwOworICAgICAgICBPUEpfVUlOVDMyIGxfbmJfY29tcDsKKyAgICAgICAgT1BKX1VJTlQzMiBsX25iX3BvYzsKKyAgICAgICAgT1BKX1VJTlQzMiBsX3BvY19zaXplOworICAgICAgICBvcGpfaW1hZ2VfdCAqbF9pbWFnZSA9IDAwOworICAgICAgICBvcGpfdGNwX3QgKmxfdGNwID0gMDA7CisgICAgICAgIG9wal90Y2NwX3QgKmxfdGNjcCA9IDAwOworICAgICAgICBvcGpfcG9jX3QgKmxfY3VycmVudF9wb2MgPSAwMDsKKyAgICAgICAgT1BKX1VJTlQzMiBsX3BvY19yb29tOworCisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisKKyAgICAgICAgbF90Y3AgPSAmcF9qMmstPm1fY3AudGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXTsKKyAgICAgICAgbF90Y2NwID0gJmxfdGNwLT50Y2Nwc1swXTsKKyAgICAgICAgbF9pbWFnZSA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2U7CisgICAgICAgIGxfbmJfY29tcCA9IGxfaW1hZ2UtPm51bWNvbXBzOworICAgICAgICBsX25iX3BvYyA9IDEgKyBsX3RjcC0+bnVtcG9jczsKKworICAgICAgICBpZiAobF9uYl9jb21wIDw9IDI1NikgeworICAgICAgICAgICAgICAgIGxfcG9jX3Jvb20gPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGxfcG9jX3Jvb20gPSAyOworICAgICAgICB9CisKKyAgICAgICAgbF9wb2Nfc2l6ZSA9IDQgKyAoNSArIDIgKiBsX3BvY19yb29tKSAqIGxfbmJfcG9jOworCisgICAgICAgIGxfY3VycmVudF9kYXRhID0gcF9kYXRhOworCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxKMktfTVNfUE9DLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUE9DICAqLworICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOworCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX3BvY19zaXplLTIsMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTHBvYyAqLworICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOworCisgICAgICAgIGxfY3VycmVudF9wb2MgPSAgbF90Y3AtPnBvY3M7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsX25iX3BvYzsgKytpKSB7CisgICAgICAgICAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfY3VycmVudF9wb2MtPnJlc25vMCwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJTcG9jX2kgKi8KKyAgICAgICAgICAgICAgICArK2xfY3VycmVudF9kYXRhOworCisgICAgICAgICAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfY3VycmVudF9wb2MtPmNvbXBubzAsbF9wb2Nfcm9vbSk7ICAgICAgICAgICAgICAvKiBDU3BvY19pICovCisgICAgICAgICAgICAgICAgbF9jdXJyZW50X2RhdGErPWxfcG9jX3Jvb207CisKKyAgICAgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF9jdXJyZW50X3BvYy0+bGF5bm8xLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTFlFcG9jX2kgKi8KKyAgICAgICAgICAgICAgICBsX2N1cnJlbnRfZGF0YSs9MjsKKworICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX2N1cnJlbnRfcG9jLT5yZXNubzEsMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSRXBvY19pICovCisgICAgICAgICAgICAgICAgKytsX2N1cnJlbnRfZGF0YTsKKworICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX2N1cnJlbnRfcG9jLT5jb21wbm8xLGxfcG9jX3Jvb20pOyAgICAgICAgICAgICAgLyogQ0Vwb2NfaSAqLworICAgICAgICAgICAgICAgIGxfY3VycmVudF9kYXRhKz1sX3BvY19yb29tOworCisgICAgICAgICAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfY3VycmVudF9wb2MtPnByZywxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBwb2NfaSAqLworICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X2RhdGE7CisKKyAgICAgICAgICAgICAgICAvKiBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBtYXggbGF5ZXIgYWNjb3JkaW5nIHRvIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGxheWVycyBpbiB0aGUgZmlsZSwgY29tcG9uZW50cyBhbmQgcmVzb2x1dGlvbnMqLworICAgICAgICAgICAgICAgIGxfY3VycmVudF9wb2MtPmxheW5vMSA9IChPUEpfVUlOVDMyKW9wal9pbnRfbWluKChPUEpfSU5UMzIpbF9jdXJyZW50X3BvYy0+bGF5bm8xLCAoT1BKX0lOVDMyKWxfdGNwLT5udW1sYXllcnMpOworICAgICAgICAgICAgICAgIGxfY3VycmVudF9wb2MtPnJlc25vMSA9IChPUEpfVUlOVDMyKW9wal9pbnRfbWluKChPUEpfSU5UMzIpbF9jdXJyZW50X3BvYy0+cmVzbm8xLCAoT1BKX0lOVDMyKWxfdGNjcC0+bnVtcmVzb2x1dGlvbnMpOworICAgICAgICAgICAgICAgIGxfY3VycmVudF9wb2MtPmNvbXBubzEgPSAoT1BKX1VJTlQzMilvcGpfaW50X21pbigoT1BKX0lOVDMyKWxfY3VycmVudF9wb2MtPmNvbXBubzEsIChPUEpfSU5UMzIpbF9uYl9jb21wKTsKKworICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X3BvYzsKKyAgICAgICAgfQorCisgICAgICAgICpwX2RhdGFfd3JpdHRlbiA9IGxfcG9jX3NpemU7Cit9CisKK3N0YXRpYyBPUEpfVUlOVDMyIG9wal9qMmtfZ2V0X21heF9wb2Nfc2l6ZShvcGpfajJrX3QgKnBfajJrKQoreworICAgICAgICBvcGpfdGNwX3QgKiBsX3RjcCA9IDAwOworICAgICAgICBPUEpfVUlOVDMyIGxfbmJfdGlsZXMgPSAwOworICAgICAgICBPUEpfVUlOVDMyIGxfbWF4X3BvYyA9IDA7CisgICAgICAgIE9QSl9VSU5UMzIgaTsKKworICAgICAgICBsX3RjcCA9IHBfajJrLT5tX2NwLnRjcHM7CisgICAgICAgIGxfbmJfdGlsZXMgPSBwX2oyay0+bV9jcC50aCAqIHBfajJrLT5tX2NwLnR3OworCisgICAgICAgIGZvciAoaT0wO2k8bF9uYl90aWxlczsrK2kpIHsKKyAgICAgICAgICAgICAgICBsX21heF9wb2MgPSBvcGpfdWludF9tYXgobF9tYXhfcG9jLGxfdGNwLT5udW1wb2NzKTsKKyAgICAgICAgICAgICAgICArK2xfdGNwOworICAgICAgICB9CisKKyAgICAgICAgKytsX21heF9wb2M7CisKKyAgICAgICAgcmV0dXJuIDQgKyA5ICogbF9tYXhfcG9jOworfQorCitzdGF0aWMgT1BKX1VJTlQzMiBvcGpfajJrX2dldF9tYXhfdG9jX3NpemUgKG9wal9qMmtfdCAqcF9qMmspCit7CisgICAgICAgIE9QSl9VSU5UMzIgaTsKKyAgICAgICAgT1BKX1VJTlQzMiBsX25iX3RpbGVzOworICAgICAgICBPUEpfVUlOVDMyIGxfbWF4ID0gMDsKKyAgICAgICAgb3BqX3RjcF90ICogbF90Y3AgPSAwMDsKKworICAgICAgICBsX3RjcCA9IHBfajJrLT5tX2NwLnRjcHM7CisgICAgICAgIGxfbmJfdGlsZXMgPSBwX2oyay0+bV9jcC50dyAqIHBfajJrLT5tX2NwLnRoIDsKKworICAgICAgICBmb3IgKGk9MDtpPGxfbmJfdGlsZXM7KytpKSB7CisgICAgICAgICAgICAgICAgbF9tYXggPSBvcGpfdWludF9tYXgobF9tYXgsbF90Y3AtPm1fbmJfdGlsZV9wYXJ0cyk7CisKKyAgICAgICAgICAgICAgICArK2xfdGNwOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDEyICogbF9tYXg7Cit9CisKK3N0YXRpYyBPUEpfVUlOVDMyIG9wal9qMmtfZ2V0X3NwZWNpZmljX2hlYWRlcl9zaXplcyhvcGpfajJrX3QgKnBfajJrKQoreworICAgICAgICBPUEpfVUlOVDMyIGxfbmJfYnl0ZXMgPSAwOworICAgICAgICBPUEpfVUlOVDMyIGxfbmJfY29tcHM7CisgICAgICAgIE9QSl9VSU5UMzIgbF9jb2NfYnl0ZXMsbF9xY2NfYnl0ZXM7CisKKyAgICAgICAgbF9uYl9jb21wcyA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzIC0gMTsKKyAgICAgICAgbF9uYl9ieXRlcyArPSBvcGpfajJrX2dldF9tYXhfdG9jX3NpemUocF9qMmspOworCisgICAgICAgIGlmICghKE9QSl9JU19DSU5FTUEocF9qMmstPm1fY3AucnNpeikpKSB7CisgICAgICAgICAgICAgICAgbF9jb2NfYnl0ZXMgPSBvcGpfajJrX2dldF9tYXhfY29jX3NpemUocF9qMmspOworICAgICAgICAgICAgICAgIGxfbmJfYnl0ZXMgKz0gbF9uYl9jb21wcyAqIGxfY29jX2J5dGVzOworCisgICAgICAgICAgICAgICAgbF9xY2NfYnl0ZXMgPSBvcGpfajJrX2dldF9tYXhfcWNjX3NpemUocF9qMmspOworICAgICAgICAgICAgICAgIGxfbmJfYnl0ZXMgKz0gbF9uYl9jb21wcyAqIGxfcWNjX2J5dGVzOworICAgICAgICB9CisKKyAgICAgICAgbF9uYl9ieXRlcyArPSBvcGpfajJrX2dldF9tYXhfcG9jX3NpemUocF9qMmspOworCisgICAgICAgIC8qKiogREVWRUxPUEVSIENPUk5FUiwgQWRkIHJvb20gZm9yIHlvdXIgaGVhZGVycyAqKiovCisKKyAgICAgICAgcmV0dXJuIGxfbmJfYnl0ZXM7Cit9CisKKy8qKgorICogUmVhZHMgYSBQT0MgbWFya2VyIChQcm9ncmVzc2lvbiBPcmRlciBDaGFuZ2UpCisgKgorICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFBPQyBib3guCisgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgorICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFBPQyBtYXJrZXIuCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3BvYyAoICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgICAgIE9QSl9VSU5UMzIgaSwgbF9uYl9jb21wLCBsX3RtcDsKKyAgICAgICAgb3BqX2ltYWdlX3QgKiBsX2ltYWdlID0gMDA7CisgICAgICAgIE9QSl9VSU5UMzIgbF9vbGRfcG9jX25iLCBsX2N1cnJlbnRfcG9jX25iLCBsX2N1cnJlbnRfcG9jX3JlbWFpbmluZzsKKyAgICAgICAgT1BKX1VJTlQzMiBsX2NodW5rX3NpemUsIGxfY29tcF9yb29tOworCisgICAgICAgIG9wal9jcF90ICpsX2NwID0gMDA7CisgICAgICAgIG9wal90Y3BfdCAqbF90Y3AgPSAwMDsKKyAgICAgICAgb3BqX3BvY190ICpsX2N1cnJlbnRfcG9jID0gMDA7CisKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisgICAgICAgIGxfaW1hZ2UgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlOworICAgICAgICBsX25iX2NvbXAgPSBsX2ltYWdlLT5udW1jb21wczsKKyAgICAgICAgaWYgKGxfbmJfY29tcCA8PSAyNTYpIHsKKyAgICAgICAgICAgICAgICBsX2NvbXBfcm9vbSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbF9jb21wX3Jvb20gPSAyOworICAgICAgICB9CisgICAgICAgIGxfY2h1bmtfc2l6ZSA9IDUgKyAyICogbF9jb21wX3Jvb207CisgICAgICAgIGxfY3VycmVudF9wb2NfbmIgPSBwX2hlYWRlcl9zaXplIC8gbF9jaHVua19zaXplOworICAgICAgICBsX2N1cnJlbnRfcG9jX3JlbWFpbmluZyA9IHBfaGVhZGVyX3NpemUgJSBsX2NodW5rX3NpemU7CisKKyAgICAgICAgaWYgKChsX2N1cnJlbnRfcG9jX25iIDw9IDApIHx8IChsX2N1cnJlbnRfcG9jX3JlbWFpbmluZyAhPSAwKSkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFBPQyBtYXJrZXJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBsX2NwID0gJihwX2oyay0+bV9jcCk7CisgICAgICAgIGxfdGNwID0gKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IEoyS19TVEFURV9UUEgpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfY3AtPnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0gOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcDsKKyAgICAgICAgbF9vbGRfcG9jX25iID0gbF90Y3AtPlBPQyA/IGxfdGNwLT5udW1wb2NzICsgMSA6IDA7CisgICAgICAgIGxfY3VycmVudF9wb2NfbmIgKz0gbF9vbGRfcG9jX25iOworCisgICAgICAgIGlmKGxfY3VycmVudF9wb2NfbmIgPj0gMzIpCisgICAgICAgICAgeworICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJUb28gbWFueSBQT0NzICVkXG4iLCBsX2N1cnJlbnRfcG9jX25iKTsKKyAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KGxfY3VycmVudF9wb2NfbmIgPCAzMik7CisKKyAgICAgICAgLyogbm93IHBvYyBpcyBpbiB1c2UuKi8KKyAgICAgICAgbF90Y3AtPlBPQyA9IDE7CisKKyAgICAgICAgbF9jdXJyZW50X3BvYyA9ICZsX3RjcC0+cG9jc1tsX29sZF9wb2NfbmJdOworICAgICAgICBmb3IgICAgIChpID0gbF9vbGRfcG9jX25iOyBpIDwgbF9jdXJyZW50X3BvY19uYjsgKytpKSB7CisgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmKGxfY3VycmVudF9wb2MtPnJlc25vMCksMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJTcG9jX2kgKi8KKyAgICAgICAgICAgICAgICArK3BfaGVhZGVyX2RhdGE7CisgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmKGxfY3VycmVudF9wb2MtPmNvbXBubzApLGxfY29tcF9yb29tKTsgICAgLyogQ1Nwb2NfaSAqLworICAgICAgICAgICAgICAgIHBfaGVhZGVyX2RhdGErPWxfY29tcF9yb29tOworICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJihsX2N1cnJlbnRfcG9jLT5sYXlubzEpLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMWUVwb2NfaSAqLworICAgICAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSBsYXllciBlbmQgaXMgaW4gYWNjZXB0YWJsZSBib3VuZHMgKi8KKyAgICAgICAgICAgICAgICBsX2N1cnJlbnRfcG9jLT5sYXlubzEgPSBvcGpfdWludF9taW4obF9jdXJyZW50X3BvYy0+bGF5bm8xLCBsX3RjcC0+bnVtbGF5ZXJzKTsKKyAgICAgICAgICAgICAgICBwX2hlYWRlcl9kYXRhKz0yOworICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJihsX2N1cnJlbnRfcG9jLT5yZXNubzEpLDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSRXBvY19pICovCisgICAgICAgICAgICAgICAgKytwX2hlYWRlcl9kYXRhOworICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJihsX2N1cnJlbnRfcG9jLT5jb21wbm8xKSxsX2NvbXBfcm9vbSk7ICAgIC8qIENFcG9jX2kgKi8KKyAgICAgICAgICAgICAgICBwX2hlYWRlcl9kYXRhKz1sX2NvbXBfcm9vbTsKKyAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX3RtcCwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBwb2NfaSAqLworICAgICAgICAgICAgICAgICsrcF9oZWFkZXJfZGF0YTsKKyAgICAgICAgICAgICAgICBsX2N1cnJlbnRfcG9jLT5wcmcgPSAoT1BKX1BST0dfT1JERVIpIGxfdG1wOworICAgICAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSBjb21wIGlzIGluIGFjY2VwdGFibGUgYm91bmRzICovCisgICAgICAgICAgICAgICAgbF9jdXJyZW50X3BvYy0+Y29tcG5vMSA9IG9wal91aW50X21pbihsX2N1cnJlbnRfcG9jLT5jb21wbm8xLCBsX25iX2NvbXApOworICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X3BvYzsKKyAgICAgICAgfQorCisgICAgICAgIGxfdGNwLT5udW1wb2NzID0gbF9jdXJyZW50X3BvY19uYiAtIDE7CisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworLyoqCisgKiBSZWFkcyBhIENSRyBtYXJrZXIgKENvbXBvbmVudCByZWdpc3RyYXRpb24pCisgKgorICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFRMTSBib3guCisgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgorICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFRMTSBtYXJrZXIuCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX2NyZyAoICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgICAgIE9QSl9VSU5UMzIgbF9uYl9jb21wOworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisKKyAgICAgICAgbF9uYl9jb21wID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHM7CisKKyAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgIT0gbF9uYl9jb21wICo0KSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgQ1JHIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICAvKiBEbyBub3QgY2FyZSBvZiB0aGlzIGF0IHRoZSBtb21lbnQgc2luY2Ugb25seSBsb2NhbCB2YXJpYWJsZXMgYXJlIHNldCBoZXJlICovCisgICAgICAgIC8qCisgICAgICAgIGZvcgorICAgICAgICAgICAgICAgIChpID0gMDsgaSA8IGxfbmJfY29tcDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9YY3JnX2ksMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWGNyZ19pCisgICAgICAgICAgICAgICAgcF9oZWFkZXJfZGF0YSs9MjsKKyAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX1ljcmdfaSwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYY3JnX2kKKyAgICAgICAgICAgICAgICBwX2hlYWRlcl9kYXRhKz0yOworICAgICAgICB9CisgICAgICAgICovCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworLyoqCisgKiBSZWFkcyBhIFRMTSBtYXJrZXIgKFRpbGUgTGVuZ3RoIE1hcmtlcikKKyAqCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgVExNIGJveC4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgVExNIG1hcmtlci4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfdGxtICggIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBsX1p0bG0sIGxfU3RsbSwgbF9TVCwgbF9TUCwgbF90b3RfbnVtX3RwX3JlbWFpbmluZywgbF9xdW90aWVudCwgbF9QdGxtX3NpemU7CisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICAgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOworICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworICAgICAgICBpZiAocF9oZWFkZXJfc2l6ZSA8IDIpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBUTE0gbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIHBfaGVhZGVyX3NpemUgLT0gMjsKKworICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX1p0bG0sMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBadGxtICovCisgICAgICAgICsrcF9oZWFkZXJfZGF0YTsKKyAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9TdGxtLDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RsbSAqLworICAgICAgICArK3BfaGVhZGVyX2RhdGE7CisKKyAgICAgICAgbF9TVCA9ICgobF9TdGxtID4+IDQpICYgMHgzKTsKKyAgICAgICAgbF9TUCA9IChsX1N0bG0gPj4gNikgJiAweDE7CisKKyAgICAgICAgbF9QdGxtX3NpemUgPSAobF9TUCArIDEpICogMjsKKyAgICAgICAgbF9xdW90aWVudCA9IGxfUHRsbV9zaXplICsgbF9TVDsKKworICAgICAgICBsX3RvdF9udW1fdHBfcmVtYWluaW5nID0gcF9oZWFkZXJfc2l6ZSAlIGxfcXVvdGllbnQ7CisKKyAgICAgICAgaWYgKGxfdG90X251bV90cF9yZW1haW5pbmcgIT0gMCkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFRMTSBtYXJrZXJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgLyogRklYTUUgRG8gbm90IGNhcmUgb2YgdGhpcyBhdCB0aGUgbW9tZW50IHNpbmNlIG9ubHkgbG9jYWwgdmFyaWFibGVzIGFyZSBzZXQgaGVyZSAqLworICAgICAgICAvKgorICAgICAgICBmb3IKKyAgICAgICAgICAgICAgICAoaSA9IDA7IGkgPCBsX3RvdF9udW1fdHA7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfVHRsbV9pLGxfU1QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR0bG1faQorICAgICAgICAgICAgICAgIHBfaGVhZGVyX2RhdGEgKz0gbF9TVDsKKyAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX1B0bG1faSxsX1B0bG1fc2l6ZSk7ICAgICAgICAgICAgLy8gUHRsbV9pCisgICAgICAgICAgICAgICAgcF9oZWFkZXJfZGF0YSArPSBsX1B0bG1fc2l6ZTsKKyAgICAgICAgfSovCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworLyoqCisgKiBSZWFkcyBhIFBMTSBtYXJrZXIgKFBhY2tldCBsZW5ndGgsIG1haW4gaGVhZGVyIG1hcmtlcikKKyAqCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgVExNIGJveC4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgVExNIG1hcmtlci4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfcGxtICggIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisgICAgICAgIGlmIChwX2hlYWRlcl9zaXplIDwgMSkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFBMTSBtYXJrZXJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgLyogRG8gbm90IGNhcmUgb2YgdGhpcyBhdCB0aGUgbW9tZW50IHNpbmNlIG9ubHkgbG9jYWwgdmFyaWFibGVzIGFyZSBzZXQgaGVyZSAqLworICAgICAgICAvKgorICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX1pwbG0sMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFpwbG0KKyAgICAgICAgKytwX2hlYWRlcl9kYXRhOworICAgICAgICAtLXBfaGVhZGVyX3NpemU7CisKKyAgICAgICAgd2hpbGUKKyAgICAgICAgICAgICAgICAocF9oZWFkZXJfc2l6ZSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX05wbG0sMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOcGxtCisgICAgICAgICAgICAgICAgKytwX2hlYWRlcl9kYXRhOworICAgICAgICAgICAgICAgIHBfaGVhZGVyX3NpemUgLT0gKDErbF9OcGxtKTsKKyAgICAgICAgICAgICAgICBpZgorICAgICAgICAgICAgICAgICAgICAgICAgKHBfaGVhZGVyX3NpemUgPCAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFBMTSBtYXJrZXJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIChpID0gMDsgaSA8IGxfTnBsbTsgKytpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfdG1wLDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcGxtX2lqCisgICAgICAgICAgICAgICAgICAgICAgICArK3BfaGVhZGVyX2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWtlIG9ubHkgdGhlIGxhc3Qgc2V2ZW4gYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfcGFja2V0X2xlbiB8PSAobF90bXAgJiAweDdmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsX3RtcCAmIDB4ODApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfcGFja2V0X2xlbiA8PD0gNzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBzdG9yZSBwYWNrZXQgbGVuZ3RoIGFuZCBwcm9jZWVkIHRvIG5leHQgcGFja2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfcGFja2V0X2xlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAobF9wYWNrZXRfbGVuICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUExNIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICovCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworLyoqCisgKiBSZWFkcyBhIFBMVCBtYXJrZXIgKFBhY2tldCBsZW5ndGgsIHRpbGUtcGFydCBoZWFkZXIpCisgKgorICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFBMVCBib3guCisgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgorICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFBMVCBtYXJrZXIuCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3BsdCAoICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgICAgIE9QSl9VSU5UMzIgbF9acGx0LCBsX3RtcCwgbF9wYWNrZXRfbGVuID0gMCwgaTsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisKKyAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCAxKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUExUIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfWnBsdCwxKTsgICAgICAgICAgICAgICAgLyogWnBsdCAqLworICAgICAgICArK3BfaGVhZGVyX2RhdGE7CisgICAgICAgIC0tcF9oZWFkZXJfc2l6ZTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcF9oZWFkZXJfc2l6ZTsgKytpKSB7CisgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF90bXAsMSk7ICAgICAgICAgLyogSXBsdF9paiAqLworICAgICAgICAgICAgICAgICsrcF9oZWFkZXJfZGF0YTsKKyAgICAgICAgICAgICAgICAvKiB0YWtlIG9ubHkgdGhlIGxhc3Qgc2V2ZW4gYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICBsX3BhY2tldF9sZW4gfD0gKGxfdG1wICYgMHg3Zik7CisgICAgICAgICAgICAgICAgaWYgKGxfdG1wICYgMHg4MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbF9wYWNrZXRfbGVuIDw8PSA3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIHN0b3JlIHBhY2tldCBsZW5ndGggYW5kIHByb2NlZWQgdG8gbmV4dCBwYWNrZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxfcGFja2V0X2xlbiA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGxfcGFja2V0X2xlbiAhPSAwKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUExUIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworLyoqCisgKiBSZWFkcyBhIFBQTSBtYXJrZXIgKFBhY2tlZCBwYWNrZXQgaGVhZGVycywgbWFpbiBoZWFkZXIpCisgKgorICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFBPQyBib3guCisgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgorICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFBPQyBtYXJrZXIuCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyAqLworCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3BwbSAoCisJCQkJCQkJCQkJCQkJCQkJCW9wal9qMmtfdCAqcF9qMmssCisJCQkJCQkJCQkJCQkJCQkJCU9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKwkJCQkJCQkJCQkJCQkJCQkJT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorCQkJCQkJCQkJCQkJCQkJCQlvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQoreworCW9wal9jcF90ICpsX2NwID0gMDA7CisJT1BKX1VJTlQzMiBsX1pfcHBtOworCQorCS8qIHByZWNvbmRpdGlvbnMgKi8KKwlhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7CisJYXNzZXJ0KHBfajJrICE9IDAwKTsKKwlhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKwkKKwkvKiBXZSBuZWVkIHRvIGhhdmUgdGhlIFpfcHBtIGVsZW1lbnQgKyAxIGJ5dGUgb2YgTnBwbS9JcHBtIGF0IG1pbmltdW0gKi8KKwlpZiAocF9oZWFkZXJfc2l6ZSA8IDIpIHsKKwkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUFBNIG1hcmtlclxuIik7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCQorCWxfY3AgPSAmKHBfajJrLT5tX2NwKTsKKwlsX2NwLT5wcG0gPSAxOworCQorCW9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfWl9wcG0sMSk7ICAgICAgICAgICAgICAgLyogWl9wcG0gKi8KKwkrK3BfaGVhZGVyX2RhdGE7CisJLS1wX2hlYWRlcl9zaXplOworCQorCS8qIGNoZWNrIGFsbG9jYXRpb24gbmVlZGVkICovCisJaWYgKGxfY3AtPnBwbV9tYXJrZXJzID09IE5VTEwpIHsgLyogZmlyc3QgUFBNIG1hcmtlciAqLworCQlPUEpfVUlOVDMyIGxfbmV3Q291bnQgPSBsX1pfcHBtICsgMVU7IC8qIGNhbid0IG92ZXJmbG93LCBsX1pfcHBtIGlzIFVJTlQ4ICovCisJCWFzc2VydChsX2NwLT5wcG1fbWFya2Vyc19jb3VudCA9PSAwVSk7CisJCQorCQlsX2NwLT5wcG1fbWFya2VycyA9IChvcGpfcHB4ICopIG9wal9jYWxsb2MobF9uZXdDb3VudCwgc2l6ZW9mKG9wal9wcHgpKTsKKwkJaWYgKGxfY3AtPnBwbV9tYXJrZXJzID09IE5VTEwpIHsKKwkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIFBQTSBtYXJrZXJcbiIpOworCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJfQorCQlsX2NwLT5wcG1fbWFya2Vyc19jb3VudCA9IGxfbmV3Q291bnQ7CisJfSBlbHNlIGlmIChsX2NwLT5wcG1fbWFya2Vyc19jb3VudCA8PSBsX1pfcHBtKSB7CisJCU9QSl9VSU5UMzIgbF9uZXdDb3VudCA9IGxfWl9wcG0gKyAxVTsgLyogY2FuJ3Qgb3ZlcmZsb3csIGxfWl9wcG0gaXMgVUlOVDggKi8KKwkJb3BqX3BweCAqbmV3X3BwbV9tYXJrZXJzOworCQluZXdfcHBtX21hcmtlcnMgPSAob3BqX3BweCAqKSBvcGpfcmVhbGxvYyhsX2NwLT5wcG1fbWFya2VycywgbF9uZXdDb3VudCAqIHNpemVvZihvcGpfcHB4KSk7CisJCWlmIChuZXdfcHBtX21hcmtlcnMgPT0gTlVMTCkgeworCQkJLyogY2xlYW4gdXAgdG8gYmUgZG9uZSBvbiBsX2NwIGRlc3RydWN0aW9uICovCisJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBQUE0gbWFya2VyXG4iKTsKKwkJCXJldHVybiBPUEpfRkFMU0U7CisJCX0KKwkJbF9jcC0+cHBtX21hcmtlcnMgPSBuZXdfcHBtX21hcmtlcnM7CisJCW1lbXNldChsX2NwLT5wcG1fbWFya2VycyArIGxfY3AtPnBwbV9tYXJrZXJzX2NvdW50LCAwLCAobF9uZXdDb3VudCAtIGxfY3AtPnBwbV9tYXJrZXJzX2NvdW50KSAqIHNpemVvZihvcGpfcHB4KSk7CisJCWxfY3AtPnBwbV9tYXJrZXJzX2NvdW50ID0gbF9uZXdDb3VudDsKKwl9CisJCisJaWYgKGxfY3AtPnBwbV9tYXJrZXJzW2xfWl9wcG1dLm1fZGF0YSAhPSBOVUxMKSB7CisJCS8qIGNsZWFuIHVwIHRvIGJlIGRvbmUgb24gbF9jcCBkZXN0cnVjdGlvbiAqLworCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiWnBwbSAldSBhbHJlYWR5IHJlYWRcbiIsIGxfWl9wcG0pOworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKwkKKwlsX2NwLT5wcG1fbWFya2Vyc1tsX1pfcHBtXS5tX2RhdGEgPSBvcGpfbWFsbG9jKHBfaGVhZGVyX3NpemUpOworCWlmIChsX2NwLT5wcG1fbWFya2Vyc1tsX1pfcHBtXS5tX2RhdGEgPT0gTlVMTCkgeworCQkvKiBjbGVhbiB1cCB0byBiZSBkb25lIG9uIGxfY3AgZGVzdHJ1Y3Rpb24gKi8KKwkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgUFBNIG1hcmtlclxuIik7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCWxfY3AtPnBwbV9tYXJrZXJzW2xfWl9wcG1dLm1fZGF0YV9zaXplID0gcF9oZWFkZXJfc2l6ZTsKKwltZW1jcHkobF9jcC0+cHBtX21hcmtlcnNbbF9aX3BwbV0ubV9kYXRhLCBwX2hlYWRlcl9kYXRhLCBwX2hlYWRlcl9zaXplKTsKKworCXJldHVybiBPUEpfVFJVRTsKK30KKworLyoqCisgKiBNZXJnZXMgYWxsIFBQTSBtYXJrZXJzIHJlYWQgKFBhY2tlZCBoZWFkZXJzLCBtYWluIGhlYWRlcikKKyAqCisgKiBAcGFyYW0gICAgICAgcF9jcCAgICAgIG1haW4gY29kaW5nIHBhcmFtZXRlcnMuCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisgKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX21lcmdlX3BwbSAoIG9wal9jcF90ICpwX2NwLCBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQoreworCU9QSl9VSU5UMzIgaSwgbF9wcG1fZGF0YV9zaXplLCBsX05fcHBtX3JlbWFpbmluZzsKKwkKKwkvKiBwcmVjb25kaXRpb25zICovCisJYXNzZXJ0KHBfY3AgIT0gMDApOworCWFzc2VydChwX21hbmFnZXIgIT0gMDApOworCWFzc2VydChwX2NwLT5wcG1fYnVmZmVyID09IE5VTEwpOworCQorCWlmIChwX2NwLT5wcG0gPT0gMFUpIHsKKwkJcmV0dXJuIE9QSl9UUlVFOworCX0KKwkKKwlsX3BwbV9kYXRhX3NpemUgPSAwVTsKKwlsX05fcHBtX3JlbWFpbmluZyA9IDBVOworCWZvciAoaSA9IDBVOyBpIDwgcF9jcC0+cHBtX21hcmtlcnNfY291bnQ7ICsraSkgeworCQlpZiAocF9jcC0+cHBtX21hcmtlcnNbaV0ubV9kYXRhICE9IE5VTEwpIHsgLyogc3RhbmRhcmQgZG9lc24ndCBzZWVtIHRvIHJlcXVpcmUgY29udGlndW91cyBacHBtICovCisJCQlPUEpfVUlOVDMyIGxfTl9wcG07CisJCQlPUEpfVUlOVDMyIGxfZGF0YV9zaXplID0gcF9jcC0+cHBtX21hcmtlcnNbaV0ubV9kYXRhX3NpemU7CisJCQljb25zdCBPUEpfQllURSogbF9kYXRhID0gcF9jcC0+cHBtX21hcmtlcnNbaV0ubV9kYXRhOworCQkJCisJCQlpZiAobF9OX3BwbV9yZW1haW5pbmcgPj0gbF9kYXRhX3NpemUpIHsKKwkJCQlsX05fcHBtX3JlbWFpbmluZyAtPSBsX2RhdGFfc2l6ZTsKKwkJCQlsX2RhdGFfc2l6ZSA9IDBVOworCQkJfSBlbHNlIHsKKwkJCQlsX2RhdGEgKz0gbF9OX3BwbV9yZW1haW5pbmc7CisJCQkJbF9kYXRhX3NpemUgLT0gbF9OX3BwbV9yZW1haW5pbmc7CisJCQkJbF9OX3BwbV9yZW1haW5pbmcgPSAwVTsKKwkJCX0KKwkJCQorCQkJaWYgKGxfZGF0YV9zaXplID4gMFUpIHsKKwkJCQlkbworCQkJCXsKKwkJCQkJLyogcmVhZCBOcHBtICovCisJCQkJCWlmIChsX2RhdGFfc2l6ZSA8IDRVKSB7CisJCQkJCQkvKiBjbGVhbiB1cCB0byBiZSBkb25lIG9uIGxfY3AgZGVzdHJ1Y3Rpb24gKi8KKwkJCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIGJ5dGVzIHRvIHJlYWQgTnBwbVxuIik7CisJCQkJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQkJCQl9CisJCQkJCW9wal9yZWFkX2J5dGVzKGxfZGF0YSwgJmxfTl9wcG0sIDQpOworCQkJCQlsX2RhdGErPTQ7CisJCQkJCWxfZGF0YV9zaXplLT00OworCQkJCQlsX3BwbV9kYXRhX3NpemUgKz0gbF9OX3BwbTsgLyogY2FuJ3Qgb3ZlcmZsb3csIG1heCAyNTYgbWFya2VycyBvZiBtYXggNjU1MzYgYnl0ZXMsIHRoYXQgaXMgd2hlbiBQUE0gbWFya2VycyBhcmUgbm90IGNvcnJ1cHRlZCB3aGljaCBpcyBjaGVja2VkIGVsc2V3aGVyZSAqLworCQkJCQkKKwkJCQkJaWYgKGxfZGF0YV9zaXplID49IGxfTl9wcG0pIHsKKwkJCQkJCWxfZGF0YV9zaXplIC09IGxfTl9wcG07CisJCQkJCQlsX2RhdGEgKz0gbF9OX3BwbTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWxfTl9wcG1fcmVtYWluaW5nID0gbF9OX3BwbSAtIGxfZGF0YV9zaXplOworCQkJCQkJbF9kYXRhX3NpemUgPSAwVTsKKwkJCQkJfQorCQkJCX0gd2hpbGUgKGxfZGF0YV9zaXplID4gMFUpOworCQkJfQorCQl9CisJfQorCQorCWlmIChsX05fcHBtX3JlbWFpbmluZyAhPSAwVSkgeworCQkvKiBjbGVhbiB1cCB0byBiZSBkb25lIG9uIGxfY3AgZGVzdHJ1Y3Rpb24gKi8KKwkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkNvcnJ1cHRlZCBQUE0gbWFya2Vyc1xuIik7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCQorCXBfY3AtPnBwbV9idWZmZXIgPSAoT1BKX0JZVEUgKikgb3BqX21hbGxvYyhsX3BwbV9kYXRhX3NpemUpOworCWlmIChwX2NwLT5wcG1fYnVmZmVyID09IDAwKSB7CisJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIFBQTSBtYXJrZXJcbiIpOworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKwlwX2NwLT5wcG1fbGVuID0gbF9wcG1fZGF0YV9zaXplOworCWxfcHBtX2RhdGFfc2l6ZSA9IDBVOworCWxfTl9wcG1fcmVtYWluaW5nID0gMFU7CisJZm9yIChpID0gMFU7IGkgPCBwX2NwLT5wcG1fbWFya2Vyc19jb3VudDsgKytpKSB7CisJCWlmIChwX2NwLT5wcG1fbWFya2Vyc1tpXS5tX2RhdGEgIT0gTlVMTCkgeyAvKiBzdGFuZGFyZCBkb2Vzbid0IHNlZW0gdG8gcmVxdWlyZSBjb250aWd1b3VzIFpwcG0gKi8KKwkJCU9QSl9VSU5UMzIgbF9OX3BwbTsKKwkJCU9QSl9VSU5UMzIgbF9kYXRhX3NpemUgPSBwX2NwLT5wcG1fbWFya2Vyc1tpXS5tX2RhdGFfc2l6ZTsKKwkJCWNvbnN0IE9QSl9CWVRFKiBsX2RhdGEgPSBwX2NwLT5wcG1fbWFya2Vyc1tpXS5tX2RhdGE7CisJCQkKKwkJCWlmIChsX05fcHBtX3JlbWFpbmluZyA+PSBsX2RhdGFfc2l6ZSkgeworCQkJCW1lbWNweShwX2NwLT5wcG1fYnVmZmVyICsgbF9wcG1fZGF0YV9zaXplLCBsX2RhdGEsIGxfZGF0YV9zaXplKTsKKwkJCQlsX3BwbV9kYXRhX3NpemUgKz0gbF9kYXRhX3NpemU7CisJCQkJbF9OX3BwbV9yZW1haW5pbmcgLT0gbF9kYXRhX3NpemU7CisJCQkJbF9kYXRhX3NpemUgPSAwVTsKKwkJCX0gZWxzZSB7CisJCQkJbWVtY3B5KHBfY3AtPnBwbV9idWZmZXIgKyBsX3BwbV9kYXRhX3NpemUsIGxfZGF0YSwgbF9OX3BwbV9yZW1haW5pbmcpOworCQkJCWxfcHBtX2RhdGFfc2l6ZSArPSBsX05fcHBtX3JlbWFpbmluZzsKKwkJCQlsX2RhdGEgKz0gbF9OX3BwbV9yZW1haW5pbmc7CisJCQkJbF9kYXRhX3NpemUgLT0gbF9OX3BwbV9yZW1haW5pbmc7CisJCQkJbF9OX3BwbV9yZW1haW5pbmcgPSAwVTsKKwkJCX0KKworCQkJaWYgKGxfZGF0YV9zaXplID4gMFUpIHsKKwkJCQlkbworCQkJCXsKKwkJCQkJLyogcmVhZCBOcHBtICovCisJCQkJCWlmIChsX2RhdGFfc2l6ZSA8IDRVKSB7CisJCQkJCQkvKiBjbGVhbiB1cCB0byBiZSBkb25lIG9uIGxfY3AgZGVzdHJ1Y3Rpb24gKi8KKwkJCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIGJ5dGVzIHRvIHJlYWQgTnBwbVxuIik7CisJCQkJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQkJCQl9CisJCQkJCW9wal9yZWFkX2J5dGVzKGxfZGF0YSwgJmxfTl9wcG0sIDQpOworCQkJCQlsX2RhdGErPTQ7CisJCQkJCWxfZGF0YV9zaXplLT00OworCQkJCQkKKwkJCQkJaWYgKGxfZGF0YV9zaXplID49IGxfTl9wcG0pIHsKKwkJCQkJCW1lbWNweShwX2NwLT5wcG1fYnVmZmVyICsgbF9wcG1fZGF0YV9zaXplLCBsX2RhdGEsIGxfTl9wcG0pOworCQkJCQkJbF9wcG1fZGF0YV9zaXplICs9IGxfTl9wcG07CisJCQkJCQlsX2RhdGFfc2l6ZSAtPSBsX05fcHBtOworCQkJCQkJbF9kYXRhICs9IGxfTl9wcG07CisJCQkJCX0gZWxzZSB7CisJCQkJCQltZW1jcHkocF9jcC0+cHBtX2J1ZmZlciArIGxfcHBtX2RhdGFfc2l6ZSwgbF9kYXRhLCBsX2RhdGFfc2l6ZSk7CisJCQkJCQlsX3BwbV9kYXRhX3NpemUgKz0gbF9kYXRhX3NpemU7CisJCQkJCQlsX05fcHBtX3JlbWFpbmluZyA9IGxfTl9wcG0gLSBsX2RhdGFfc2l6ZTsKKwkJCQkJCWxfZGF0YV9zaXplID0gMFU7CisJCQkJCX0KKwkJCQl9IHdoaWxlIChsX2RhdGFfc2l6ZSA+IDBVKTsKKwkJCX0KKwkJCW9wal9mcmVlKHBfY3AtPnBwbV9tYXJrZXJzW2ldLm1fZGF0YSk7CisJCQlwX2NwLT5wcG1fbWFya2Vyc1tpXS5tX2RhdGEgPSBOVUxMOworCQkJcF9jcC0+cHBtX21hcmtlcnNbaV0ubV9kYXRhX3NpemUgPSAwVTsKKwkJfQorCX0KKwkKKwlwX2NwLT5wcG1fZGF0YSA9IHBfY3AtPnBwbV9idWZmZXI7CisJcF9jcC0+cHBtX2RhdGFfc2l6ZSA9IHBfY3AtPnBwbV9sZW47CisJCisJcF9jcC0+cHBtX21hcmtlcnNfY291bnQgPSAwVTsKKwlvcGpfZnJlZShwX2NwLT5wcG1fbWFya2Vycyk7CisJcF9jcC0+cHBtX21hcmtlcnMgPSBOVUxMOworCQorCXJldHVybiBPUEpfVFJVRTsKK30KKworLyoqCisgKiBSZWFkcyBhIFBQVCBtYXJrZXIgKFBhY2tlZCBwYWNrZXQgaGVhZGVycywgdGlsZS1wYXJ0IGhlYWRlcikKKyAqCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUFBUIGJveC4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUFBUIG1hcmtlci4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfcHB0ICggIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKwlvcGpfY3BfdCAqbF9jcCA9IDAwOworCW9wal90Y3BfdCAqbF90Y3AgPSAwMDsKKwlPUEpfVUlOVDMyIGxfWl9wcHQ7CisKKwkvKiBwcmVjb25kaXRpb25zICovCisJYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOworCWFzc2VydChwX2oyayAhPSAwMCk7CisJYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisKKwkvKiBXZSBuZWVkIHRvIGhhdmUgdGhlIFpfcHB0IGVsZW1lbnQgKyAxIGJ5dGUgb2YgSXBwdCBhdCBtaW5pbXVtICovCisJaWYgKHBfaGVhZGVyX3NpemUgPCAyKSB7CisJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFBQVCBtYXJrZXJcbiIpOworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKworCWxfY3AgPSAmKHBfajJrLT5tX2NwKTsKKwlpZiAobF9jcC0+cHBtKXsKKwkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUFBUIG1hcmtlcjogcGFja2V0IGhlYWRlciBoYXZlIGJlZW4gcHJldmlvdXNseSBmb3VuZCBpbiB0aGUgbWFpbiBoZWFkZXIgKFBQTSBtYXJrZXIpLlxuIik7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCisJbF90Y3AgPSAmKGxfY3AtPnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0pOworCWxfdGNwLT5wcHQgPSAxOworCisJb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9aX3BwdCwxKTsgICAgICAgICAgICAgICAvKiBaX3BwdCAqLworCSsrcF9oZWFkZXJfZGF0YTsKKwktLXBfaGVhZGVyX3NpemU7CisJCisJLyogY2hlY2sgYWxsb2NhdGlvbiBuZWVkZWQgKi8KKwlpZiAobF90Y3AtPnBwdF9tYXJrZXJzID09IE5VTEwpIHsgLyogZmlyc3QgUFBUIG1hcmtlciAqLworCQlPUEpfVUlOVDMyIGxfbmV3Q291bnQgPSBsX1pfcHB0ICsgMVU7IC8qIGNhbid0IG92ZXJmbG93LCBsX1pfcHB0IGlzIFVJTlQ4ICovCisJCWFzc2VydChsX3RjcC0+cHB0X21hcmtlcnNfY291bnQgPT0gMFUpOworCQkKKwkJbF90Y3AtPnBwdF9tYXJrZXJzID0gKG9wal9wcHggKikgb3BqX2NhbGxvYyhsX25ld0NvdW50LCBzaXplb2Yob3BqX3BweCkpOworCQlpZiAobF90Y3AtPnBwdF9tYXJrZXJzID09IE5VTEwpIHsKKwkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIFBQVCBtYXJrZXJcbiIpOworCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJfQorCQlsX3RjcC0+cHB0X21hcmtlcnNfY291bnQgPSBsX25ld0NvdW50OworCX0gZWxzZSBpZiAobF90Y3AtPnBwdF9tYXJrZXJzX2NvdW50IDw9IGxfWl9wcHQpIHsKKwkJT1BKX1VJTlQzMiBsX25ld0NvdW50ID0gbF9aX3BwdCArIDFVOyAvKiBjYW4ndCBvdmVyZmxvdywgbF9aX3BwdCBpcyBVSU5UOCAqLworCQlvcGpfcHB4ICpuZXdfcHB0X21hcmtlcnM7CisJCW5ld19wcHRfbWFya2VycyA9IChvcGpfcHB4ICopIG9wal9yZWFsbG9jKGxfdGNwLT5wcHRfbWFya2VycywgbF9uZXdDb3VudCAqIHNpemVvZihvcGpfcHB4KSk7CisJCWlmIChuZXdfcHB0X21hcmtlcnMgPT0gTlVMTCkgeworCQkJLyogY2xlYW4gdXAgdG8gYmUgZG9uZSBvbiBsX3RjcCBkZXN0cnVjdGlvbiAqLworCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgUFBUIG1hcmtlclxuIik7CisJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQl9CisJCWxfdGNwLT5wcHRfbWFya2VycyA9IG5ld19wcHRfbWFya2VyczsKKwkJbWVtc2V0KGxfdGNwLT5wcHRfbWFya2VycyArIGxfdGNwLT5wcHRfbWFya2Vyc19jb3VudCwgMCwgKGxfbmV3Q291bnQgLSBsX3RjcC0+cHB0X21hcmtlcnNfY291bnQpICogc2l6ZW9mKG9wal9wcHgpKTsKKwkJbF90Y3AtPnBwdF9tYXJrZXJzX2NvdW50ID0gbF9uZXdDb3VudDsKKwl9CisJCisJaWYgKGxfdGNwLT5wcHRfbWFya2Vyc1tsX1pfcHB0XS5tX2RhdGEgIT0gTlVMTCkgeworCQkvKiBjbGVhbiB1cCB0byBiZSBkb25lIG9uIGxfdGNwIGRlc3RydWN0aW9uICovCisJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJacHB0ICV1IGFscmVhZHkgcmVhZFxuIiwgbF9aX3BwdCk7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCQorCWxfdGNwLT5wcHRfbWFya2Vyc1tsX1pfcHB0XS5tX2RhdGEgPSBvcGpfbWFsbG9jKHBfaGVhZGVyX3NpemUpOworCWlmIChsX3RjcC0+cHB0X21hcmtlcnNbbF9aX3BwdF0ubV9kYXRhID09IE5VTEwpIHsKKwkJLyogY2xlYW4gdXAgdG8gYmUgZG9uZSBvbiBsX3RjcCBkZXN0cnVjdGlvbiAqLworCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBQUFQgbWFya2VyXG4iKTsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisJbF90Y3AtPnBwdF9tYXJrZXJzW2xfWl9wcHRdLm1fZGF0YV9zaXplID0gcF9oZWFkZXJfc2l6ZTsKKwltZW1jcHkobF90Y3AtPnBwdF9tYXJrZXJzW2xfWl9wcHRdLm1fZGF0YSwgcF9oZWFkZXJfZGF0YSwgcF9oZWFkZXJfc2l6ZSk7CisJcmV0dXJuIE9QSl9UUlVFOworfQorCisvKioKKyAqIE1lcmdlcyBhbGwgUFBUIG1hcmtlcnMgcmVhZCAoUGFja2VkIHBhY2tldCBoZWFkZXJzLCB0aWxlLXBhcnQgaGVhZGVyKQorICoKKyAqIEBwYXJhbSAgICAgICBwX3RjcCAgIHRoZSB0aWxlLgorICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisgKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX21lcmdlX3BwdChvcGpfdGNwX3QgKnBfdGNwLCBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCit7CisJT1BKX1VJTlQzMiBpLCBsX3BwdF9kYXRhX3NpemU7CisJLyogcHJlY29uZGl0aW9ucyAqLworCWFzc2VydChwX3RjcCAhPSAwMCk7CisJYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisJYXNzZXJ0KHBfdGNwLT5wcHRfYnVmZmVyID09IE5VTEwpOworCQorCWlmIChwX3RjcC0+cHB0ID09IDBVKSB7CisJCXJldHVybiBPUEpfVFJVRTsKKwl9CisJCisJbF9wcHRfZGF0YV9zaXplID0gMFU7CisJZm9yIChpID0gMFU7IGkgPCBwX3RjcC0+cHB0X21hcmtlcnNfY291bnQ7ICsraSkgeworCQlsX3BwdF9kYXRhX3NpemUgKz0gcF90Y3AtPnBwdF9tYXJrZXJzW2ldLm1fZGF0YV9zaXplOyAvKiBjYW4ndCBvdmVyZmxvdywgbWF4IDI1NiBtYXJrZXJzIG9mIG1heCA2NTUzNiBieXRlcyAqLworCX0KKwkKKwlwX3RjcC0+cHB0X2J1ZmZlciA9IChPUEpfQllURSAqKSBvcGpfbWFsbG9jKGxfcHB0X2RhdGFfc2l6ZSk7CisJaWYgKHBfdGNwLT5wcHRfYnVmZmVyID09IDAwKSB7CisJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIFBQVCBtYXJrZXJcbiIpOworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKwlwX3RjcC0+cHB0X2xlbiA9IGxfcHB0X2RhdGFfc2l6ZTsKKwlsX3BwdF9kYXRhX3NpemUgPSAwVTsKKwlmb3IgKGkgPSAwVTsgaSA8IHBfdGNwLT5wcHRfbWFya2Vyc19jb3VudDsgKytpKSB7CisJCWlmIChwX3RjcC0+cHB0X21hcmtlcnNbaV0ubV9kYXRhICE9IE5VTEwpIHsgLyogc3RhbmRhcmQgZG9lc24ndCBzZWVtIHRvIHJlcXVpcmUgY29udGlndW91cyBacHB0ICovCisJCQltZW1jcHkocF90Y3AtPnBwdF9idWZmZXIgKyBsX3BwdF9kYXRhX3NpemUsIHBfdGNwLT5wcHRfbWFya2Vyc1tpXS5tX2RhdGEsIHBfdGNwLT5wcHRfbWFya2Vyc1tpXS5tX2RhdGFfc2l6ZSk7CisJCQlsX3BwdF9kYXRhX3NpemUgKz0gcF90Y3AtPnBwdF9tYXJrZXJzW2ldLm1fZGF0YV9zaXplOyAvKiBjYW4ndCBvdmVyZmxvdywgbWF4IDI1NiBtYXJrZXJzIG9mIG1heCA2NTUzNiBieXRlcyAqLworCQkJCisJCQlvcGpfZnJlZShwX3RjcC0+cHB0X21hcmtlcnNbaV0ubV9kYXRhKTsKKwkJCXBfdGNwLT5wcHRfbWFya2Vyc1tpXS5tX2RhdGEgPSBOVUxMOworCQkJcF90Y3AtPnBwdF9tYXJrZXJzW2ldLm1fZGF0YV9zaXplID0gMFU7CisJCX0KKwl9CisJCisJcF90Y3AtPnBwdF9tYXJrZXJzX2NvdW50ID0gMFU7CisJb3BqX2ZyZWUocF90Y3AtPnBwdF9tYXJrZXJzKTsKKwlwX3RjcC0+cHB0X21hcmtlcnMgPSBOVUxMOworCQorCXBfdGNwLT5wcHRfZGF0YSA9IHBfdGNwLT5wcHRfYnVmZmVyOworCXBfdGNwLT5wcHRfZGF0YV9zaXplID0gcF90Y3AtPnBwdF9sZW47CisJcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV90bG0oICAgICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAgICAgT1BKX0JZVEUgKiBsX2N1cnJlbnRfZGF0YSA9IDAwOworICAgICAgICBPUEpfVUlOVDMyIGxfdGxtX3NpemU7CisKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKworICAgICAgICBsX3RsbV9zaXplID0gNiArICg1KnBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RvdGFsX3RpbGVfcGFydHMpOworCisgICAgICAgIGlmIChsX3RsbV9zaXplID4gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgT1BKX0JZVEUgKm5ld19oZWFkZXJfdGlsZV9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsIGxfdGxtX3NpemUpOworICAgICAgICAgICAgICAgIGlmICghIG5ld19oZWFkZXJfdGlsZV9kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byB3cml0ZSBUTE0gbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBuZXdfaGVhZGVyX3RpbGVfZGF0YTsKKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSBsX3RsbV9zaXplOworICAgICAgICB9CisKKyAgICAgICAgbF9jdXJyZW50X2RhdGEgPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhOworCisgICAgICAgIC8qIGNoYW5nZSB0aGUgd2F5IGRhdGEgaXMgd3JpdHRlbiB0byBhdm9pZCBzZWVraW5nIGlmIHBvc3NpYmxlICovCisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdGxtX3N0YXJ0ID0gb3BqX3N0cmVhbV90ZWxsKHBfc3RyZWFtKTsKKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsSjJLX01TX1RMTSwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRMTSAqLworICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOworCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX3RsbV9zaXplLTIsMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTHBvYyAqLworICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOworCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwwLDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBadGxtPTAqLworICAgICAgICArK2xfY3VycmVudF9kYXRhOworCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwweDUwLDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGxtIFNUPTEoOGJpdHMtMjU1IHRpbGVzIG1heCksU1A9MShQdGxtPTMyYml0cykgKi8KKyAgICAgICAgKytsX2N1cnJlbnRfZGF0YTsKKworICAgICAgICAvKiBkbyBub3RoaW5nIG9uIHRoZSA1ICogbF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdG90YWxfdGlsZV9wYXJ0cyByZW1haW5pbmcgZGF0YSAqLworICAgICAgICBpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKHBfc3RyZWFtLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsbF90bG1fc2l6ZSxwX21hbmFnZXIpICE9IGxfdGxtX3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9zb3QoICAgICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLEoyS19NU19TT1QsMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTT1QgKi8KKyAgICAgICAgcF9kYXRhICs9IDI7CisKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKHBfZGF0YSwxMCwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMc290ICovCisgICAgICAgIHBfZGF0YSArPSAyOworCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhwX2RhdGEsIHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIsMik7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSXNvdCAqLworICAgICAgICBwX2RhdGEgKz0gMjsKKworICAgICAgICAvKiBQc290ICAqLworICAgICAgICBwX2RhdGEgKz0gNDsKKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLCBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9jdXJyZW50X3RpbGVfcGFydF9udW1iZXIsMSk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVFBzb3QgKi8KKyAgICAgICAgKytwX2RhdGE7CisKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKHBfZGF0YSwgcF9qMmstPm1fY3AudGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS5tX25iX3RpbGVfcGFydHMsMSk7ICAgICAgICAgICAgICAgICAgICAgIC8qIFROc290ICovCisgICAgICAgICsrcF9kYXRhOworCisgICAgICAgIC8qIFVuaVBHPj4gKi8KKyNpZmRlZiBVU0VfSlBXTAorICAgICAgICAvKiB1cGRhdGUgbWFya2VycyBzdHJ1Y3QgKi8KKy8qCisgICAgICAgIE9QSl9CT09MIHJlcyA9IGoya19hZGRfbWFya2VyKHBfajJrLT5jc3RyX2luZm8sIEoyS19NU19TT1QsIHBfajJrLT5zb3Rfc3RhcnQsIGxlbiArIDIpOworKi8KKyAgYXNzZXJ0KCAwICYmICJUT0RPIiApOworI2VuZGlmIC8qIFVTRV9KUFdMICovCisKKyAgICAgICAgKiBwX2RhdGFfd3JpdHRlbiA9IDEyOworCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfZ2V0X3NvdF92YWx1ZXMoT1BKX0JZVEUgKiAgcF9oZWFkZXJfZGF0YSwKKwkJCQkJCQkJCQkJCQkJCQkJCQkgT1BKX1VJTlQzMiAgcF9oZWFkZXJfc2l6ZSwKKwkJCQkJCQkJCQkJCQkJCQkJCQkgT1BKX1VJTlQzMiogcF90aWxlX25vLAorCQkJCQkJCQkJCQkJCQkJCQkJCSBPUEpfVUlOVDMyKiBwX3RvdF9sZW4sCisJCQkJCQkJCQkJCQkJCQkJCQkJIE9QSl9VSU5UMzIqIHBfY3VycmVudF9wYXJ0LAorCQkJCQkJCQkJCQkJCQkJCQkJCSBPUEpfVUlOVDMyKiBwX251bV9wYXJ0cywKKwkJCQkJCQkJCQkJCQkJCQkJCQkgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3sKKwkvKiBwcmVjb25kaXRpb25zICovCisJYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOworCWFzc2VydChwX21hbmFnZXIgIT0gMDApOworCQorCS8qIFNpemUgb2YgdGhpcyBtYXJrZXIgaXMgZml4ZWQgPSAxMiAod2UgaGF2ZSBhbHJlYWR5IHJlYWQgbWFya2VyIGFuZCBpdHMgc2l6ZSkqLworCWlmIChwX2hlYWRlcl9zaXplICE9IDgpIHsKKwkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgU09UIG1hcmtlclxuIik7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCQorCW9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEscF90aWxlX25vLDIpOyAgICAgIC8qIElzb3QgKi8KKwlwX2hlYWRlcl9kYXRhKz0yOworCW9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEscF90b3RfbGVuLDQpOyAgICAgIC8qIFBzb3QgKi8KKwlwX2hlYWRlcl9kYXRhKz00OworCW9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEscF9jdXJyZW50X3BhcnQsMSk7IC8qIFRQc290ICovCisJKytwX2hlYWRlcl9kYXRhOworCW9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEscF9udW1fcGFydHMgLDEpOyAgIC8qIFROc290ICovCisJKytwX2hlYWRlcl9kYXRhOworCXJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9zb3QgKCBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3sKKyAgICAgICAgb3BqX2NwX3QgKmxfY3AgPSAwMDsKKyAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOworICAgICAgICBPUEpfVUlOVDMyIGxfdG90X2xlbiwgbF9udW1fcGFydHMgPSAwOworICAgICAgICBPUEpfVUlOVDMyIGxfY3VycmVudF9wYXJ0OworICAgICAgICBPUEpfVUlOVDMyIGxfdGlsZV94LGxfdGlsZV95OworCisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKwkKKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisJCisgICAgICAgIGlmICghIG9wal9qMmtfZ2V0X3NvdF92YWx1ZXMocF9oZWFkZXJfZGF0YSwgcF9oZWFkZXJfc2l6ZSwgJihwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyKSwgJmxfdG90X2xlbiwgJmxfY3VycmVudF9wYXJ0LCAmbF9udW1fcGFydHMsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBTT1QgbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOworCisgICAgICAgIC8qIHRlc3RjYXNlIDIucGRmLlNJR0ZQRS43MDYuMTExMiAqLworICAgICAgICBpZiAocF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciA+PSBsX2NwLT50dyAqIGxfY3AtPnRoKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkludmFsaWQgdGlsZSBudW1iZXIgJWRcbiIsIHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBsX3RjcCA9ICZsX2NwLT50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdOworICAgICAgICBsX3RpbGVfeCA9IHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIgJSBsX2NwLT50dzsKKyAgICAgICAgbF90aWxlX3kgPSBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyIC8gbF9jcC0+dHc7CisKKyNpZmRlZiBVU0VfSlBXTAorICAgICAgICBpZiAobF9jcC0+Y29ycmVjdCkgeworCisgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0aWxlbm8gPSBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyOworICAgICAgICAgICAgICAgIHN0YXRpYyBPUEpfVUlOVDMyIGJhY2t1cF90aWxlbm8gPSAwOworCisgICAgICAgICAgICAgICAgLyogdGlsZW5vIGlzIG5lZ2F0aXZlIG9yIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgdGlsZXMhISEgKi8KKyAgICAgICAgICAgICAgICBpZiAodGlsZW5vID4gKGxfY3AtPnR3ICogbF9jcC0+dGgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKUFdMOiBiYWQgdGlsZSBudW1iZXIgKCVkIG91dCBvZiBhIG1heGltdW0gb2YgJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVubywgKGxfY3AtPnR3ICogbF9jcC0+dGgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSlBXTF9BU1NVTUUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkpQV0w6IGdpdmluZyB1cFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSB0cnkgdG8gY29ycmVjdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgdGlsZW5vID0gYmFja3VwX3RpbGVubzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIi0gdHJ5aW5nIHRvIGFkanVzdCB0aGlzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0gc2V0dGluZyB0aWxlIG51bWJlciB0byAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlbm8pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIGtlZXAgeW91ciBwcml2YXRlIGNvdW50IG9mIHRpbGVzICovCisgICAgICAgICAgICAgICAgYmFja3VwX3RpbGVubysrOworICAgICAgICB9OworI2VuZGlmIC8qIFVTRV9KUFdMICovCisKKyAgICAgICAgLyogbG9vayBmb3IgdGhlIHRpbGUgaW4gdGhlIGxpc3Qgb2YgYWxyZWFkeSBwcm9jZXNzZWQgdGlsZSAoaW4gcGFydHMpLiAqLworICAgICAgICAvKiBPcHRpbWl6YXRpb24gcG9zc2libGUgaGVyZSB3aXRoIGEgbW9yZSBjb21wbGV4IGRhdGEgc3RydWN0dXJlIGFuZCB3aXRoIHRoZSByZW1vdmluZyBvZiB0aWxlcyAqLworICAgICAgICAvKiBzaW5jZSB0aGUgdGltZSB0YWtlbiBieSB0aGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGdyb3cgYXQgdGhlIHRpbWUgKi8KKworICAgICAgICAvKiBQU290IHNob3VsZCBiZSBlcXVhbCB0byB6ZXJvIG9yID49MTQgb3IgPD0gMl4zMi0xICovCisgICAgICAgIGlmICgobF90b3RfbGVuICE9MCApICYmIChsX3RvdF9sZW4gPCAxNCkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobF90b3RfbGVuID09IDEyICkgLyogTVNEOiBTcGVjaWFsIGNhc2UgZm9yIHRoZSBQSFIgZGF0YSB3aGljaCBhcmUgcmVhZCBieSBrYWthZHUqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkVtcHR5IFNPVCBtYXJrZXIgZGV0ZWN0ZWQ6IFBzb3Q9JWQuXG4iLCBsX3RvdF9sZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJQc290IHZhbHVlIGlzIG5vdCBjb3JyZWN0IHJlZ2FyZHMgdG8gdGhlIEpQRUcyMDAwIG5vcm06ICVkLlxuIiwgbF90b3RfbGVuKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNpZmRlZiBVU0VfSlBXTAorICAgICAgICBpZiAobF9jcC0+Y29ycmVjdCkgeworCisgICAgICAgICAgICAgICAgLyogdG90bGVuIGlzIG5lZ2F0aXZlIG9yIGxhcmdlciB0aGFuIHRoZSBieXRlcyBsZWZ0ISEhICovCisgICAgICAgICAgICAgICAgaWYgKC8qKGxfdG90X2xlbiA8IDApIHx8Ki8gKGxfdG90X2xlbiA+IHBfaGVhZGVyX3NpemUgKSApIHsgLyogRklYTUUgaXQgc2VlbXMgY29ycmVjdDsgZm9yIGluZm8gaW4gVjEgLT4gKHBfc3RyZWFtX251bWJ5dGVzbGVmdChwX3N0cmVhbSkgKyA4KSkpIHsgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpQV0w6IGJhZCB0aWxlIGJ5dGUgc2l6ZSAoJWQgYnl0ZXMgYWdhaW5zdCAlZCBieXRlcyBsZWZ0KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RvdF9sZW4sIHBfaGVhZGVyX3NpemUgKTsgLyogRklYTUUgaXQgc2VlbXMgY29ycmVjdDsgZm9yIGluZm8gaW4gVjEgLT4gcF9zdHJlYW1fbnVtYnl0ZXNsZWZ0KHBfc3RyZWFtKSArIDgpOyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFKUFdMX0FTU1VNRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSlBXTDogZ2l2aW5nIHVwXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIHRyeSB0byBjb3JyZWN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBsX3RvdF9sZW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiLSB0cnlpbmcgdG8gYWRqdXN0IHRoaXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLSBzZXR0aW5nIFBzb3QgdG8gJWQgPT4gYXNzdW1pbmcgaXQgaXMgdGhlIGxhc3QgdGlsZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RvdF9sZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworI2VuZGlmIC8qIFVTRV9KUFdMICovCisKKyAgICAgICAgICAgICAgICAvKiBSZWYgQS40LjI6IFBzb3QgY291bGQgYmUgZXF1YWwgemVybyBpZiBpdCBpcyB0aGUgbGFzdCB0aWxlLXBhcnQgb2YgdGhlIGNvZGVzdHJlYW0uKi8KKyAgICAgICAgICAgICAgICBpZiAoIWxfdG90X2xlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9JTkZPLCAiUHNvdCB2YWx1ZSBvZiB0aGUgY3VycmVudCB0aWxlLXBhcnQgaXMgZXF1YWwgdG8gemVybywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZSBhc3N1bWluZyBpdCBpcyB0aGUgbGFzdCB0aWxlLXBhcnQgb2YgdGhlIGNvZGVzdHJlYW0uXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2xhc3RfdGlsZV9wYXJ0ID0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobF9udW1fcGFydHMgIT0gMCkgeyAvKiBOdW1iZXIgb2YgdGlsZS1wYXJ0IGhlYWRlciBpcyBwcm92aWRlZCBieSB0aGlzIHRpbGUtcGFydCBoZWFkZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxfbnVtX3BhcnRzICs9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX25iX3RpbGVfcGFydHNfY29ycmVjdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVzZWZ1bCB0byBtYW5hZ2UgdGhlIGNhc2Ugb2YgdGV4dEdCUi5qcDIgZmlsZSBiZWNhdXNlIHR3byB2YWx1ZXMgb2YgVE5Tb3QgYXJlIGFsbG93ZWQ6IHRoZSBjb3JyZWN0IG51bWJlcnMgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRpbGUtcGFydHMgZm9yIHRoYXQgdGlsZSBhbmQgemVybyAoQS40LjIgb2YgMTU0NDQtMSA6IDIwMDIpLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfdGNwLT5tX25iX3RpbGVfcGFydHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfY3VycmVudF9wYXJ0ID49IGxfdGNwLT5tX25iX3RpbGVfcGFydHMpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJJbiBTT1QgbWFya2VyLCBUUFNvdCAoJWQpIGlzIG5vdCB2YWxpZCByZWdhcmRzIHRvIHRoZSBjdXJyZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWJlciBvZiB0aWxlLXBhcnQgKCVkKSwgZ2l2aW5nIHVwXG4iLCBsX2N1cnJlbnRfcGFydCwgbF90Y3AtPm1fbmJfdGlsZV9wYXJ0cyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2xhc3RfdGlsZV9wYXJ0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggbF9jdXJyZW50X3BhcnQgPj0gbF9udW1fcGFydHMgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlc3RjYXNlIDQ1MS5wZGYuU0lHU0VHVi5jZTkuMzcyMyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSW4gU09UIG1hcmtlciwgVFBTb3QgKCVkKSBpcyBub3QgdmFsaWQgcmVnYXJkcyB0byB0aGUgY3VycmVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWJlciBvZiB0aWxlLXBhcnQgKGhlYWRlcikgKCVkKSwgZ2l2aW5nIHVwXG4iLCBsX2N1cnJlbnRfcGFydCwgbF9udW1fcGFydHMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fbGFzdF90aWxlX3BhcnQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbF90Y3AtPm1fbmJfdGlsZV9wYXJ0cyA9IGxfbnVtX3BhcnRzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIElmIGtub3cgdGhlIG51bWJlciBvZiB0aWxlIHBhcnQgaGVhZGVyIHdlIHdpbGwgY2hlY2sgaWYgd2UgZGlkbid0IHJlYWQgdGhlIGxhc3QqLworICAgICAgICAgICAgICAgIGlmIChsX3RjcC0+bV9uYl90aWxlX3BhcnRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF90Y3AtPm1fbmJfdGlsZV9wYXJ0cyA9PSAobF9jdXJyZW50X3BhcnQrMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fY2FuX2RlY29kZSA9IDE7IC8qIFByb2Nlc3MgdGhlIGxhc3QgdGlsZS1wYXJ0IGhlYWRlciovCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9sYXN0X3RpbGVfcGFydCl7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBLZWVwIHRoZSBzaXplIG9mIGRhdGEgdG8gc2tpcCBhZnRlciB0aGlzIG1hcmtlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc290X2xlbmd0aCA9IGxfdG90X2xlbiAtIDEyOyAvKiBTT1RfbWFya2VyX3NpemUgPSAxMiAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBuZWVkIHRvIGJlIGNvbXB1dGVkIGZyb20gdGhlIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgaW4gdGhlIGNvZGVzdHJlYW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGggPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID0gSjJLX1NUQVRFX1RQSDsKKworICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSBjdXJyZW50IHRpbGUgaXMgb3V0c2lkZSB0aGUgYXJlYSB3ZSB3YW50IGRlY29kZSBvciBub3QgY29ycmVzcG9uZGluZyB0byB0aGUgdGlsZSBpbmRleCovCisgICAgICAgICAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3RpbGVfaW5kX3RvX2RlYyA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc2tpcF9kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxfdGlsZV94IDwgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhcnRfdGlsZV94KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgICAgIChsX3RpbGVfeCA+PSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9lbmRfdGlsZV94KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgKGxfdGlsZV95IDwgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhcnRfdGlsZV95KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgICAgIChsX3RpbGVfeSA+PSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9lbmRfdGlsZV95KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3RpbGVfaW5kX3RvX2RlYyA+PSAwICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9za2lwX2RhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciAhPSAoT1BKX1VJTlQzMilwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV90aWxlX2luZF90b19kZWMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIEluZGV4ICovCisgICAgICAgICAgICAgICAgaWYgKHBfajJrLT5jc3RyX2luZGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleCAhPSAwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50aWxlbm8gPSBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0uY3VycmVudF90cHNubyA9IGxfY3VycmVudF9wYXJ0OworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9udW1fcGFydHMgIT0gMCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLm5iX3RwcyA9IGxfbnVtX3BhcnRzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS5jdXJyZW50X25iX3RwcyA9IGxfbnVtX3BhcnRzOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udHBfaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50cF9pbmRleCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3BqX3RwX2luZGV4X3QqKW9wal9jYWxsb2MobF9udW1fcGFydHMsIHNpemVvZihvcGpfdHBfaW5kZXhfdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udHBfaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIFNPVCBtYXJrZXIuIFRpbGUgaW5kZXggYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKwkJCQkJCQkJCQkJCQkJCQkJCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90cF9pbmRleF90ICpuZXdfdHBfaW5kZXggPSAob3BqX3RwX2luZGV4X3QgKikgb3BqX3JlYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRwX2luZGV4LCBsX251bV9wYXJ0cyogc2l6ZW9mKG9wal90cF9pbmRleF90KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmV3X3RwX2luZGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50cF9pbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50cF9pbmRleCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBTT1QgbWFya2VyLiBUaWxlIGluZGV4IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRwX2luZGV4ID0gbmV3X3RwX2luZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmlmICghcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udHBfaW5kZXgpKi8geworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50cF9pbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0uY3VycmVudF9uYl90cHMgPSAxMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRwX2luZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wal90cF9pbmRleF90KilvcGpfY2FsbG9jKCBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS5jdXJyZW50X25iX3RwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvcGpfdHBfaW5kZXhfdCkpOworCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJaWYgKCFwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50cF9pbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS5jdXJyZW50X25iX3RwcyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIFNPVCBtYXJrZXIuIFRpbGUgaW5kZXggYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGxfY3VycmVudF9wYXJ0ID49IHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLmN1cnJlbnRfbmJfdHBzICl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdHBfaW5kZXhfdCAqbmV3X3RwX2luZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0uY3VycmVudF9uYl90cHMgPSBsX2N1cnJlbnRfcGFydCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfdHBfaW5kZXggPSAob3BqX3RwX2luZGV4X3QgKikgb3BqX3JlYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udHBfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0uY3VycmVudF9uYl90cHMgKiBzaXplb2Yob3BqX3RwX2luZGV4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG5ld190cF9pbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50cF9pbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRwX2luZGV4ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0uY3VycmVudF9uYl90cHMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBTT1QgbWFya2VyLiBUaWxlIGluZGV4IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRwX2luZGV4ID0gbmV3X3RwX2luZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBGSVhNRSBtb3ZlIHRoaXMgb250byBhIHNlcGFyYXRlIG1ldGhvZCB0byBjYWxsIGJlZm9yZSByZWFkaW5nIGFueSBTT1QsIHJlbW92ZSBwYXJ0IGFib3V0IG1haW5fZW5kIGhlYWRlciwgdXNlIGEgaW5kZXggc3RydWN0IGluc2lkZSBwX2oyayAqLworICAgICAgICAgICAgICAgIC8qIGlmIChwX2oyay0+Y3N0cl9pbmZvKSB7CisgICAgICAgICAgICAgICAgICAgaWYgKGxfdGNwLT5maXJzdCkgeworICAgICAgICAgICAgICAgICAgIGlmICh0aWxlbm8gPT0gMCkgeworICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPm1haW5faGVhZF9lbmQgPSBwX3N0cmVhbV90ZWxsKHBfc3RyZWFtKSAtIDEzOworICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPnRpbGVbdGlsZW5vXS50aWxlbm8gPSB0aWxlbm87CisgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5mby0+dGlsZVt0aWxlbm9dLnN0YXJ0X3BvcyA9IHBfc3RyZWFtX3RlbGwocF9zdHJlYW0pIC0gMTI7CisgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5mby0+dGlsZVt0aWxlbm9dLmVuZF9wb3MgPSBwX2oyay0+Y3N0cl9pbmZvLT50aWxlW3RpbGVub10uc3RhcnRfcG9zICsgdG90bGVuIC0gMTsKKyAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmZvLT50aWxlW3RpbGVub10ubnVtX3RwcyA9IG51bXBhcnRzOworCisgICAgICAgICAgICAgICAgICAgaWYgKG51bXBhcnRzKSB7CisgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5mby0+dGlsZVt0aWxlbm9dLnRwID0gKG9wal90cF9pbmZvX3QgKikgb3BqX21hbGxvYyhudW1wYXJ0cyAqIHNpemVvZihvcGpfdHBfaW5mb190KSk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPnRpbGVbdGlsZW5vXS50cCA9IChvcGpfdHBfaW5mb190ICopIG9wal9tYWxsb2MoMTAgKiBzaXplb2Yob3BqX3RwX2luZm9fdCkpOyAvLyBGaXhtZSAoMTApCisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmZvLT50aWxlW3RpbGVub10uZW5kX3BvcyArPSB0b3RsZW47CisgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5mby0+dGlsZVt0aWxlbm9dLnRwW3BhcnRub10udHBfc3RhcnRfcG9zID0gcF9zdHJlYW1fdGVsbChwX3N0cmVhbSkgLSAxMjsKKyAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmZvLT50aWxlW3RpbGVub10udHBbcGFydG5vXS50cF9lbmRfcG9zID0KKyAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmZvLT50aWxlW3RpbGVub10udHBbcGFydG5vXS50cF9zdGFydF9wb3MgKyB0b3RsZW4gLSAxOworICAgICAgICAgICAgICAgICAgIH0qLworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAgICAgfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9zb2QoICAgICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3QgKiBwX3RpbGVfY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90b3RhbF9kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmZvX3QgKmxfY3N0cl9pbmZvID0gMDA7CisgICAgICAgIE9QSl9VSU5UMzIgbF9yZW1haW5pbmdfZGF0YTsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhwX2RhdGEsSjJLX01TX1NPRCwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNPRCAqLworICAgICAgICBwX2RhdGEgKz0gMjsKKworICAgICAgICAvKiBtYWtlIHJvb20gZm9yIHRoZSBFT0YgbWFya2VyICovCisgICAgICAgIGxfcmVtYWluaW5nX2RhdGEgPSAgcF90b3RhbF9kYXRhX3NpemUgLSA0OworCisgICAgICAgIC8qIHVwZGF0ZSB0aWxlIGNvZGVyICovCisgICAgICAgIHBfdGlsZV9jb2Rlci0+dHBfbnVtID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fY3VycmVudF9wb2NfdGlsZV9wYXJ0X251bWJlciA7CisgICAgICAgIHBfdGlsZV9jb2Rlci0+Y3VyX3RwX251bSA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2N1cnJlbnRfdGlsZV9wYXJ0X251bWJlcjsKKworICAgICAgICAgLyogSU5ERVggPj4gKi8KKyAgICAgICAgLyogVE9ETyBtZXJnZVYyOiBjaGVjayB0aGlzIHBhcnQgd2hpY2ggdXNlIGNzdHJfaW5mbyAqLworICAgICAgICAvKmxfY3N0cl9pbmZvID0gcF9qMmstPmNzdHJfaW5mbzsKKyAgICAgICAgaWYgKGxfY3N0cl9pbmZvKSB7CisgICAgICAgICAgICAgICAgaWYgKCFwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9jdXJyZW50X3RpbGVfcGFydF9udW1iZXIgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gY3N0cl9pbmZvLT50aWxlW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLmVuZF9oZWFkZXIgPSBwX3N0cmVhbV90ZWxsKHBfc3RyZWFtKSArIHBfajJrLT5wb3NfY29ycmVjdGlvbiAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBsX2NzdHJfaW5mby0+dGlsZVtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50aWxlbm8gPSBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsqLworICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgIFRPRE8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjc3RyX2luZm8tPnRpbGVbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0ucGFja2V0W2NzdHJfaW5mby0+cGFja25vIC0gMV0uZW5kX3BvcyA8IHBfc3RyZWFtX3RlbGwocF9zdHJlYW0pKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZm8tPnRpbGVbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0ucGFja2V0W2NzdHJfaW5mby0+cGFja25vXS5zdGFydF9wb3MgPSBwX3N0cmVhbV90ZWxsKHBfc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0qLworICAgICAgICAgICAgICAgIC8qfSovCisgICAgICAgICAgICAgICAgLyogVW5pUEc+PiAqLworI2lmZGVmIFVTRV9KUFdMCisgICAgICAgICAgICAgICAgLyogdXBkYXRlIG1hcmtlcnMgc3RydWN0ICovCisgICAgICAgICAgICAgICAgLypPUEpfQk9PTCByZXMgPSBqMmtfYWRkX21hcmtlcihwX2oyay0+Y3N0cl9pbmZvLCBKMktfTVNfU09ELCBwX2oyay0+c29kX3N0YXJ0LCAyKTsKKyovCisgIGFzc2VydCggMCAmJiAiVE9ETyIgKTsKKyNlbmRpZiAvKiBVU0VfSlBXTCAqLworICAgICAgICAgICAgICAgIC8qIDw8VW5pUEcgKi8KKyAgICAgICAgLyp9Ki8KKyAgICAgICAgLyogPDwgSU5ERVggKi8KKworICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fY3VycmVudF90aWxlX3BhcnRfbnVtYmVyID09IDApIHsKKyAgICAgICAgICAgICAgICBwX3RpbGVfY29kZXItPnRjZF9pbWFnZS0+dGlsZXMtPnBhY2tubyA9IDA7CisgICAgICAgICAgICAgICAgaWYgKGxfY3N0cl9pbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsX2NzdHJfaW5mby0+cGFja25vID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAqcF9kYXRhX3dyaXR0ZW4gPSAwOworCisgICAgICAgIGlmICghIG9wal90Y2RfZW5jb2RlX3RpbGUocF90aWxlX2NvZGVyLCBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLCBwX2RhdGEsIHBfZGF0YV93cml0dGVuLCBsX3JlbWFpbmluZ19kYXRhICwgbF9jc3RyX2luZm8pKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkNhbm5vdCBlbmNvZGUgdGlsZVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgICpwX2RhdGFfd3JpdHRlbiArPSAyOworCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9zb2QgKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAgICAgT1BKX1NJWkVfVCBsX2N1cnJlbnRfcmVhZF9zaXplOworICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmRleF90ICogbF9jc3RyX2luZGV4ID0gMDA7CisgICAgICAgIE9QSl9CWVRFICoqIGxfY3VycmVudF9kYXRhID0gMDA7CisgICAgICAgIG9wal90Y3BfdCAqIGxfdGNwID0gMDA7CisgICAgICAgIE9QSl9VSU5UMzIgKiBsX3RpbGVfbGVuID0gMDA7CisgICAgICAgIE9QSl9CT09MIGxfc290X2xlbmd0aF9wYl9kZXRlY3RlZCA9IE9QSl9GQUxTRTsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworCisgICAgICAgIGxfdGNwID0gJihwX2oyay0+bV9jcC50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdKTsKKworICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fbGFzdF90aWxlX3BhcnQpIHsKKyAgICAgICAgICAgICAgICAvKiBvcGpfc3RyZWFtX2dldF9udW1iZXJfYnl0ZV9sZWZ0IHJldHVybnMgT1BKX09GRl9UCisgICAgICAgICAgICAgICAgLy8gYnV0IHdlIGFyZSBpbiB0aGUgbGFzdCB0aWxlIHBhcnQsCisgICAgICAgICAgICAgICAgLy8gc28gaXRzIHJlc3VsdCB3aWxsIGZpdCBvbiBPUEpfVUlOVDMyIHVubGVzcyB3ZSBmaW5kCisgICAgICAgICAgICAgICAgLy8gYSBmaWxlIHdpdGggYSBzaW5nbGUgdGlsZSBwYXJ0IG9mIG1vcmUgdGhhbiA0IEdCLi4uKi8KKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoID0gKE9QSl9VSU5UMzIpKG9wal9zdHJlYW1fZ2V0X251bWJlcl9ieXRlX2xlZnQocF9zdHJlYW0pIC0gMik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBDaGVjayB0byBhdm9pZCBwYXNzIHRoZSBsaW1pdCBvZiBPUEpfVUlOVDMyICovCisgICAgICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc290X2xlbmd0aCA+PSAyICkKKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoIC09IDI7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBNU0Q6IGNhc2UgY29tbWVudGVkIHRvIHN1cHBvcnQgZW1wdHkgU09UIG1hcmtlciAoUEhSIGRhdGEpICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsX2N1cnJlbnRfZGF0YSA9ICYobF90Y3AtPm1fZGF0YSk7CisgICAgICAgIGxfdGlsZV9sZW4gPSAmbF90Y3AtPm1fZGF0YV9zaXplOworCisgICAgICAgIC8qIFBhdGNoIHRvIHN1cHBvcnQgbmV3IFBIUiBkYXRhICovCisgICAgICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoKSB7CisgICAgICAgICAgICAvKiBJZiB3ZSBhcmUgaGVyZSwgd2UnbGwgdHJ5IHRvIHJlYWQgdGhlIGRhdGEgYWZ0ZXIgYWxsb2NhdGlvbiAqLworICAgICAgICAgICAgLyogQ2hlY2sgZW5vdWdoIGJ5dGVzIGxlZnQgaW4gc3RyZWFtIGJlZm9yZSBhbGxvY2F0aW9uICovCisgICAgICAgICAgICBpZiAoKE9QSl9PRkZfVClwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoID4gb3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdChwX3N0cmVhbSkpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiVGlsZSBwYXJ0IGxlbmd0aCBzaXplIGluY29uc2lzdGVudCB3aXRoIHN0cmVhbSBsZW5ndGhcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoISAqbF9jdXJyZW50X2RhdGEpIHsKKyAgICAgICAgICAgICAgICAvKiBMSDogb2RkbHkgZW5vdWdoLCBpbiB0aGlzIHBhdGgsIGxfdGlsZV9sZW4hPTAuCisgICAgICAgICAgICAgICAgICogVE9ETzogSWYgdGhpcyB3YXMgY29uc2lzdGVudCwgd2UgY291bGQgc2ltcGxpZnkgdGhlIGNvZGUgdG8gb25seSB1c2UgcmVhbGxvYygpLCBhcyByZWFsbG9jKDAsLi4uKSBkZWZhdWx0IHRvIG1hbGxvYygwLC4uLikuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgKmxfY3VycmVudF9kYXRhID0gKE9QSl9CWVRFKikgb3BqX21hbGxvYyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIE9QSl9CWVRFICpsX25ld19jdXJyZW50X2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MoKmxfY3VycmVudF9kYXRhLCAqbF90aWxlX2xlbiArIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmICghIGxfbmV3X2N1cnJlbnRfZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUoKmxfY3VycmVudF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qbm90aGluZyBtb3JlIGlzIGRvbmUgYXMgbF9jdXJyZW50X2RhdGEgd2lsbCBiZSBzZXQgdG8gbnVsbCwgYW5kIGp1c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJ3YXJkIHdlIGVudGVyIGluIHRoZSBlcnJvciBwYXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgYWN0dWFsIHRpbGVfbGVuIGlzIHVwZGF0ZWQgKGNvbW1pdHRlZCkgYXQgdGhlIGVuZCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpsX2N1cnJlbnRfZGF0YSA9IGxfbmV3X2N1cnJlbnRfZGF0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCpsX2N1cnJlbnRfZGF0YSA9PSAwMCkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBkZWNvZGUgdGlsZVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGxfc290X2xlbmd0aF9wYl9kZXRlY3RlZCA9IE9QSl9UUlVFOworICAgICAgICB9CisKKyAgICAgICAgLyogSW5kZXggKi8KKyAgICAgICAgbF9jc3RyX2luZGV4ID0gcF9qMmstPmNzdHJfaW5kZXg7CisgICAgICAgIGlmIChsX2NzdHJfaW5kZXgpIHsKKyAgICAgICAgICAgICAgICBPUEpfT0ZGX1QgbF9jdXJyZW50X3BvcyA9IG9wal9zdHJlYW1fdGVsbChwX3N0cmVhbSkgLSAyOworCisgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsX2N1cnJlbnRfdGlsZV9wYXJ0ID0gbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLmN1cnJlbnRfdHBzbm87CisgICAgICAgICAgICAgICAgbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRwX2luZGV4W2xfY3VycmVudF90aWxlX3BhcnRdLmVuZF9oZWFkZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfcG9zOworICAgICAgICAgICAgICAgIGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50cF9pbmRleFtsX2N1cnJlbnRfdGlsZV9wYXJ0XS5lbmRfcG9zID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X3BvcyArIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGggKyAyOworCisgICAgICAgICAgICAgICAgaWYgKE9QSl9GQUxTRSA9PSBvcGpfajJrX2FkZF90bG1hcmtlcihwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3N0cl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKMktfTVNfU09ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc290X2xlbmd0aCArIDIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWRkIHRsIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qbF9jc3RyX2luZGV4LT5wYWNrbm8gPSAwOyovCisgICAgICAgIH0KKworICAgICAgICAvKiBQYXRjaCB0byBzdXBwb3J0IG5ldyBQSFIgZGF0YSAqLworICAgICAgICBpZiAoIWxfc290X2xlbmd0aF9wYl9kZXRlY3RlZCkgeworICAgICAgICAgICAgbF9jdXJyZW50X3JlYWRfc2l6ZSA9IG9wal9zdHJlYW1fcmVhZF9kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAqbF9jdXJyZW50X2RhdGEgKyAqbF90aWxlX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbF9jdXJyZW50X3JlYWRfc2l6ZSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAobF9jdXJyZW50X3JlYWRfc2l6ZSAhPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPSBKMktfU1RBVEVfTkVPQzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9IEoyS19TVEFURV9UUEhTT1Q7CisgICAgICAgIH0KKworICAgICAgICAqbF90aWxlX2xlbiArPSAoT1BKX1VJTlQzMilsX2N1cnJlbnRfcmVhZF9zaXplOworCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfcmduKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBuYl9jb21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgICAgICBPUEpfQllURSAqIGxfY3VycmVudF9kYXRhID0gMDA7CisgICAgICAgIE9QSl9VSU5UMzIgbF9yZ25fc2l6ZTsKKyAgICAgICAgb3BqX2NwX3QgKmxfY3AgPSAwMDsKKyAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOworICAgICAgICBvcGpfdGNjcF90ICpsX3RjY3AgPSAwMDsKKyAgICAgICAgT1BKX1VJTlQzMiBsX2NvbXBfcm9vbTsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworCisgICAgICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKKyAgICAgICAgbF90Y3AgPSAmbF9jcC0+dGNwc1twX3RpbGVfbm9dOworICAgICAgICBsX3RjY3AgPSAmbF90Y3AtPnRjY3BzW3BfY29tcF9ub107CisKKyAgICAgICAgaWYgKG5iX2NvbXBzIDw9IDI1NikgeworICAgICAgICAgICAgICAgIGxfY29tcF9yb29tID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsX2NvbXBfcm9vbSA9IDI7CisgICAgICAgIH0KKworICAgICAgICBsX3Jnbl9zaXplID0gNiArIGxfY29tcF9yb29tOworCisgICAgICAgIGxfY3VycmVudF9kYXRhID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YTsKKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsSjJLX01TX1JHTiwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJHTiAgKi8KKyAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF9yZ25fc2l6ZS0yLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExyZ24gKi8KKyAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEscF9jb21wX25vLGxfY29tcF9yb29tKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENyZ24gKi8KKyAgICAgICAgbF9jdXJyZW50X2RhdGErPWxfY29tcF9yb29tOworCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgMCwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3JnbiAqLworICAgICAgICArK2xfY3VycmVudF9kYXRhOworCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgKE9QSl9VSU5UMzIpbF90Y2NwLT5yb2lzaGlmdCwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU1ByZ24gKi8KKyAgICAgICAgKytsX2N1cnJlbnRfZGF0YTsKKworICAgICAgICBpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKHBfc3RyZWFtLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsbF9yZ25fc2l6ZSxwX21hbmFnZXIpICE9IGxfcmduX3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9lb2MoICAgICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CisKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsSjJLX01TX0VPQywyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRU9DICovCisKKy8qIFVuaVBHPj4gKi8KKyNpZmRlZiBVU0VfSlBXTAorICAgICAgICAvKiB1cGRhdGUgbWFya2VycyBzdHJ1Y3QgKi8KKyAgICAgICAgLyoKKyAgICAgICAgT1BKX0JPT0wgcmVzID0gajJrX2FkZF9tYXJrZXIocF9qMmstPmNzdHJfaW5mbywgSjJLX01TX0VPQywgcF9zdHJlYW1fdGVsbChwX3N0cmVhbSkgLSAyLCAyKTsKKyovCisjZW5kaWYgLyogVVNFX0pQV0wgKi8KKworICAgICAgICBpZiAoIG9wal9zdHJlYW1fd3JpdGVfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLDIscF9tYW5hZ2VyKSAhPSAyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggISBvcGpfc3RyZWFtX2ZsdXNoKHBfc3RyZWFtLHBfbWFuYWdlcikgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworLyoqCisgKiBSZWFkcyBhIFJHTiBtYXJrZXIgKFJlZ2lvbiBPZiBJbnRlcmVzdCkKKyAqCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUE9DIGJveC4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUE9DIG1hcmtlci4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfcmduIChvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgICAgICBPUEpfVUlOVDMyIGxfbmJfY29tcDsKKyAgICAgICAgb3BqX2ltYWdlX3QgKiBsX2ltYWdlID0gMDA7CisKKyAgICAgICAgb3BqX2NwX3QgKmxfY3AgPSAwMDsKKyAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOworICAgICAgICBPUEpfVUlOVDMyIGxfY29tcF9yb29tLCBsX2NvbXBfbm8sIGxfcm9pX3N0eTsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zKi8KKyAgICAgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOworICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworICAgICAgICBsX2ltYWdlID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZTsKKyAgICAgICAgbF9uYl9jb21wID0gbF9pbWFnZS0+bnVtY29tcHM7CisKKyAgICAgICAgaWYgKGxfbmJfY29tcCA8PSAyNTYpIHsKKyAgICAgICAgICAgICAgICBsX2NvbXBfcm9vbSA9IDE7IH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbF9jb21wX3Jvb20gPSAyOyB9CisKKyAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgIT0gMiArIGxfY29tcF9yb29tKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUkdOIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKKyAgICAgICAgbF90Y3AgPSAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPT0gSjJLX1NUQVRFX1RQSCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF9jcC0+dGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwOworCisgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfY29tcF9ubyxsX2NvbXBfcm9vbSk7ICAgICAgICAgICAvKiBDcmduICovCisgICAgICAgIHBfaGVhZGVyX2RhdGErPWxfY29tcF9yb29tOworICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX3JvaV9zdHksMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNyZ24gKi8KKyAgICAgICAgKytwX2hlYWRlcl9kYXRhOworCisjaWZkZWYgVVNFX0pQV0wKKyAgICAgICAgaWYgKGxfY3AtPmNvcnJlY3QpIHsKKyAgICAgICAgICAgICAgICAvKiB0b3RsZW4gaXMgbmVnYXRpdmUgb3IgbGFyZ2VyIHRoYW4gdGhlIGJ5dGVzIGxlZnQhISEgKi8KKyAgICAgICAgICAgICAgICBpZiAobF9jb21wX3Jvb20gPj0gbF9uYl9jb21wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSlBXTDogYmFkIGNvbXBvbmVudCBudW1iZXIgaW4gUkdOICglZCB3aGVuIHRoZXJlIGFyZSBvbmx5ICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jb21wX3Jvb20sIGxfbmJfY29tcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUpQV0xfQVNTVU1FIHx8IEpQV0xfQVNTVU1FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJKUFdMOiBnaXZpbmcgdXBcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyNlbmRpZiAvKiBVU0VfSlBXTCAqLworCisgICAgICAgIC8qIHRlc3RjYXNlIDM2MzUucGRmLmFzYW4uNzcuMjkzMCAqLworICAgICAgICBpZiAobF9jb21wX25vID49IGxfbmJfY29tcCkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYmFkIGNvbXBvbmVudCBudW1iZXIgaW4gUkdOICglZCB3aGVuIHRoZXJlIGFyZSBvbmx5ICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfY29tcF9ubywgbF9uYl9jb21wKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwoT1BKX1VJTlQzMiAqKSAoJihsX3RjcC0+dGNjcHNbbF9jb21wX25vXS5yb2lzaGlmdCkpLDEpOyAgIC8qIFNQcmduICovCisgICAgICAgICsrcF9oZWFkZXJfZGF0YTsKKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisKK30KKworc3RhdGljIE9QSl9GTE9BVDMyIG9wal9qMmtfZ2V0X3RwX3N0cmlkZSAob3BqX3RjcF90ICogcF90Y3ApCit7CisgICAgICAgIHJldHVybiAoT1BKX0ZMT0FUMzIpICgocF90Y3AtPm1fbmJfdGlsZV9wYXJ0cyAtIDEpICogMTQpOworfQorCitzdGF0aWMgT1BKX0ZMT0FUMzIgb3BqX2oya19nZXRfZGVmYXVsdF9zdHJpZGUgKG9wal90Y3BfdCAqIHBfdGNwKQoreworICAgICh2b2lkKXBfdGNwOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya191cGRhdGVfcmF0ZXMoICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3sKKyAgICAgICAgb3BqX2NwX3QgKiBsX2NwID0gMDA7CisgICAgICAgIG9wal9pbWFnZV90ICogbF9pbWFnZSA9IDAwOworICAgICAgICBvcGpfdGNwX3QgKiBsX3RjcCA9IDAwOworICAgICAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IDAwOworCisgICAgICAgIE9QSl9VSU5UMzIgaSxqLGs7CisgICAgICAgIE9QSl9JTlQzMiBsX3gwLGxfeTAsbF94MSxsX3kxOworICAgICAgICBPUEpfRkxPQVQzMiAqIGxfcmF0ZXMgPSAwOworICAgICAgICBPUEpfRkxPQVQzMiBsX3NvdF9yZW1vdmU7CisgICAgICAgIE9QSl9VSU5UMzIgbF9iaXRzX2VtcHR5LCBsX3NpemVfcGl4ZWw7CisgICAgICAgIE9QSl9VSU5UMzIgbF90aWxlX3NpemUgPSAwOworICAgICAgICBPUEpfVUlOVDMyIGxfbGFzdF9yZXM7CisgICAgICAgIE9QSl9GTE9BVDMyICgqIGxfdHBfc3RyaWRlX2Z1bmMpKG9wal90Y3BfdCAqKSA9IDAwOworCisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CisKKyAgICAgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOworICAgICAgICBsX2ltYWdlID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZTsKKyAgICAgICAgbF90Y3AgPSBsX2NwLT50Y3BzOworCisgICAgICAgIGxfYml0c19lbXB0eSA9IDggKiBsX2ltYWdlLT5jb21wcy0+ZHggKiBsX2ltYWdlLT5jb21wcy0+ZHk7CisgICAgICAgIGxfc2l6ZV9waXhlbCA9IGxfaW1hZ2UtPm51bWNvbXBzICogbF9pbWFnZS0+Y29tcHMtPnByZWM7CisgICAgICAgIGxfc290X3JlbW92ZSA9IChPUEpfRkxPQVQzMikgb3BqX3N0cmVhbV90ZWxsKHBfc3RyZWFtKSAvIChPUEpfRkxPQVQzMikobF9jcC0+dGggKiBsX2NwLT50dyk7CisKKyAgICAgICAgaWYgKGxfY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV90cF9vbikgeworICAgICAgICAgICAgICAgIGxfdHBfc3RyaWRlX2Z1bmMgPSBvcGpfajJrX2dldF90cF9zdHJpZGU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbF90cF9zdHJpZGVfZnVuYyA9IG9wal9qMmtfZ2V0X2RlZmF1bHRfc3RyaWRlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpPTA7aTxsX2NwLT50aDsrK2kpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfY3AtPnR3OysraikgeworICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIgbF9vZmZzZXQgPSAoT1BKX0ZMT0FUMzIpKCpsX3RwX3N0cmlkZV9mdW5jKShsX3RjcCkgLyAoT1BKX0ZMT0FUMzIpbF90Y3AtPm51bWxheWVyczsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogNCBib3JkZXJzIG9mIHRoZSB0aWxlIHJlc2NhbGUgb24gdGhlIGltYWdlIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICAgICAgICAgICAgICAgICAgbF94MCA9IG9wal9pbnRfbWF4KChPUEpfSU5UMzIpKGxfY3AtPnR4MCArIGogKiBsX2NwLT50ZHgpLCAoT1BKX0lOVDMyKWxfaW1hZ2UtPngwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfeTAgPSBvcGpfaW50X21heCgoT1BKX0lOVDMyKShsX2NwLT50eTAgKyBpICogbF9jcC0+dGR5KSwgKE9QSl9JTlQzMilsX2ltYWdlLT55MCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsX3gxID0gb3BqX2ludF9taW4oKE9QSl9JTlQzMikobF9jcC0+dHgwICsgKGogKyAxKSAqIGxfY3AtPnRkeCksIChPUEpfSU5UMzIpbF9pbWFnZS0+eDEpOworICAgICAgICAgICAgICAgICAgICAgICAgbF95MSA9IG9wal9pbnRfbWluKChPUEpfSU5UMzIpKGxfY3AtPnR5MCArIChpICsgMSkgKiBsX2NwLT50ZHkpLCAoT1BKX0lOVDMyKWxfaW1hZ2UtPnkxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbF9yYXRlcyA9IGxfdGNwLT5yYXRlczsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogTW9kaWZpY2F0aW9uIG9mIHRoZSBSQVRFID4+ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKmxfcmF0ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxfcmF0ZXMgPSAgICAgICAgICAgICAgKCggKE9QSl9GTE9BVDMyKSAobF9zaXplX3BpeGVsICogKE9QSl9VSU5UMzIpKGxfeDEgLSBsX3gwKSAqIChPUEpfVUlOVDMyKShsX3kxIC0gbF95MCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCpsX3JhdGVzKSAqIChPUEpfRkxPQVQzMilsX2JpdHNfZW1wdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgKytsX3JhdGVzOworCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAxOyBrIDwgbF90Y3AtPm51bWxheWVyczsgKytrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqbF9yYXRlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsX3JhdGVzID0gICAgICAgICAgICAgICgoIChPUEpfRkxPQVQzMikgKGxfc2l6ZV9waXhlbCAqIChPUEpfVUlOVDMyKShsX3gxIC0gbF94MCkgKiAoT1BKX1VJTlQzMikobF95MSAtIGxfeTApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgqbF9yYXRlcykgKiAoT1BKX0ZMT0FUMzIpbF9iaXRzX2VtcHR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfcmF0ZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICsrbF90Y3A7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsX3RjcCA9IGxfY3AtPnRjcHM7CisKKyAgICAgICAgZm9yIChpPTA7aTxsX2NwLT50aDsrK2kpIHsKKyAgICAgICAgICAgICAgICBmb3IgICAgIChqPTA7ajxsX2NwLT50dzsrK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfcmF0ZXMgPSBsX3RjcC0+cmF0ZXM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqbF9yYXRlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbF9yYXRlcyAtPSBsX3NvdF9yZW1vdmU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpsX3JhdGVzIDwgMzApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbF9yYXRlcyA9IDMwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICsrbF9yYXRlczsKKworICAgICAgICAgICAgICAgICAgICAgICAgbF9sYXN0X3JlcyA9IGxfdGNwLT5udW1sYXllcnMgLSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAxOyBrIDwgbF9sYXN0X3JlczsgKytrKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpsX3JhdGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxfcmF0ZXMgLT0gbF9zb3RfcmVtb3ZlOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpsX3JhdGVzIDwgKihsX3JhdGVzIC0gMSkgKyAxMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxfcmF0ZXMgID0gKCoobF9yYXRlcyAtIDEpKSArIDIwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9yYXRlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpsX3JhdGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsX3JhdGVzIC09IChsX3NvdF9yZW1vdmUgKyAyLmYpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqbF9yYXRlcyA8ICoobF9yYXRlcyAtIDEpICsgMTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbF9yYXRlcyAgPSAoKihsX3JhdGVzIC0gMSkpICsgMjA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgKytsX3RjcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsX2ltZ19jb21wID0gbF9pbWFnZS0+Y29tcHM7CisgICAgICAgIGxfdGlsZV9zaXplID0gMDsKKworICAgICAgICBmb3IgKGk9MDtpPGxfaW1hZ2UtPm51bWNvbXBzOysraSkgeworICAgICAgICAgICAgICAgIGxfdGlsZV9zaXplICs9ICggICAgICAgIG9wal91aW50X2NlaWxkaXYobF9jcC0+dGR4LGxfaW1nX2NvbXAtPmR4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal91aW50X2NlaWxkaXYobF9jcC0+dGR5LGxfaW1nX2NvbXAtPmR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPnByZWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICArK2xfaW1nX2NvbXA7CisgICAgICAgIH0KKworICAgICAgICBsX3RpbGVfc2l6ZSA9IChPUEpfVUlOVDMyKSAobF90aWxlX3NpemUgKiAwLjE2MjUpOyAvKiAxLjMvOCA9IDAuMTYyNSAqLworCisgICAgICAgIGxfdGlsZV9zaXplICs9IG9wal9qMmtfZ2V0X3NwZWNpZmljX2hlYWRlcl9zaXplcyhwX2oyayk7CisKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fZW5jb2RlZF90aWxlX3NpemUgPSBsX3RpbGVfc2l6ZTsKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fZW5jb2RlZF90aWxlX2RhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9CWVRFICopIG9wal9tYWxsb2MocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fZW5jb2RlZF90aWxlX3NpemUpOworICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fZW5jb2RlZF90aWxlX2RhdGEgPT0gMDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKE9QSl9JU19DSU5FTUEobF9jcC0+cnNpeikpIHsKKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90bG1fc290X29mZnNldHNfYnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9CWVRFICopIG9wal9tYWxsb2MoNSpwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90b3RhbF90aWxlX3BhcnRzKTsKKyAgICAgICAgICAgICAgICBpZiAoISBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90bG1fc290X29mZnNldHNfYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zb3Rfb2Zmc2V0c19jdXJyZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdGxtX3NvdF9vZmZzZXRzX2J1ZmZlcjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworI2lmIDAKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfZW9jICggICAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBpOworICAgICAgICBvcGpfdGNkX3QgKiBsX3RjZCA9IDAwOworICAgICAgICBPUEpfVUlOVDMyIGxfbmJfdGlsZXM7CisgICAgICAgIG9wal90Y3BfdCAqIGxfdGNwID0gMDA7CisgICAgICAgIE9QSl9CT09MIGxfc3VjY2VzczsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworCisgICAgICAgIGxfbmJfdGlsZXMgPSBwX2oyay0+bV9jcC50aCAqIHBfajJrLT5tX2NwLnR3OworICAgICAgICBsX3RjcCA9IHBfajJrLT5tX2NwLnRjcHM7CisKKyAgICAgICAgbF90Y2QgPSBvcGpfdGNkX2NyZWF0ZShPUEpfVFJVRSk7CisgICAgICAgIGlmIChsX3RjZCA9PSAwMCkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJDYW5ub3QgZGVjb2RlIHRpbGUsIG1lbW9yeSBlcnJvclxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsX25iX3RpbGVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAobF90Y3AtPm1fZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgb3BqX3RjZF9pbml0X2RlY29kZV90aWxlKGxfdGNkLCBpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX2Rlc3Ryb3kobF90Y2QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ2Fubm90IGRlY29kZSB0aWxlLCBtZW1vcnkgZXJyb3JcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBsX3N1Y2Nlc3MgPSBvcGpfdGNkX2RlY29kZV90aWxlKGxfdGNkLCBsX3RjcC0+bV9kYXRhLCBsX3RjcC0+bV9kYXRhX3NpemUsIGksIHBfajJrLT5jc3RyX2luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFudXAgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbF9zdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlIHw9IEoyS19TVEFURV9FUlI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG9wal9qMmtfdGNwX2Rlc3Ryb3kobF90Y3ApOworICAgICAgICAgICAgICAgICsrbF90Y3A7CisgICAgICAgIH0KKworICAgICAgICBvcGpfdGNkX2Rlc3Ryb3kobF90Y2QpOworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisjZW5kaWYKKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfZ2V0X2VuZF9oZWFkZXIob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyICkKK3sKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKworICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+bWFpbl9oZWFkX2VuZCA9IG9wal9zdHJlYW1fdGVsbChwX3N0cmVhbSk7CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9tY3RfZGF0YV9ncm91cCggIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyICkKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBpOworICAgICAgICBvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCAqIGxfbWNjX3JlY29yZDsKKyAgICAgICAgb3BqX21jdF9kYXRhX3QgKiBsX21jdF9yZWNvcmQ7CisgICAgICAgIG9wal90Y3BfdCAqIGxfdGNwOworCisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisKKyAgICAgICAgaWYgKCEgb3BqX2oya193cml0ZV9jYmQocF9qMmsscF9zdHJlYW0scF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBsX3RjcCA9ICYocF9qMmstPm1fY3AudGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXSk7CisgICAgICAgIGxfbWN0X3JlY29yZCA9IGxfdGNwLT5tX21jdF9yZWNvcmRzOworCisgICAgICAgIGZvciAoaT0wO2k8bF90Y3AtPm1fbmJfbWN0X3JlY29yZHM7KytpKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoISBvcGpfajJrX3dyaXRlX21jdF9yZWNvcmQocF9qMmssbF9tY3RfcmVjb3JkLHBfc3RyZWFtLHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKytsX21jdF9yZWNvcmQ7CisgICAgICAgIH0KKworICAgICAgICBsX21jY19yZWNvcmQgPSBsX3RjcC0+bV9tY2NfcmVjb3JkczsKKworICAgICAgICBmb3IgICAgIChpPTA7aTxsX3RjcC0+bV9uYl9tY2NfcmVjb3JkczsrK2kpIHsKKworICAgICAgICAgICAgICAgIGlmICghIG9wal9qMmtfd3JpdGVfbWNjX3JlY29yZChwX2oyayxsX21jY19yZWNvcmQscF9zdHJlYW0scF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICArK2xfbWNjX3JlY29yZDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghIG9wal9qMmtfd3JpdGVfbWNvKHBfajJrLHBfc3RyZWFtLHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCisjaWYgMAorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfYWxsX2NvYyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlciApCit7CisgICAgICAgIE9QSl9VSU5UMzIgY29tcG5vOworCisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CisKKyAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wczsgKytjb21wbm8pCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoISBvcGpfajJrX3dyaXRlX2NvYyhwX2oyayxjb21wbm8scF9zdHJlYW0sIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorI2VuZGlmCisKKyNpZiAwCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9hbGxfcWNjKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyICkKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBjb21wbm87CisKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKworICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOyArK2NvbXBubykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghIG9wal9qMmtfd3JpdGVfcWNjKHBfajJrLGNvbXBubyxwX3N0cmVhbSwgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisjZW5kaWYKKworCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9yZWdpb25zKCBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIgKQoreworICAgICAgICBPUEpfVUlOVDMyIGNvbXBubzsKKyAgICAgICAgY29uc3Qgb3BqX3RjY3BfdCAqbF90Y2NwID0gMDA7CisKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKworICAgICAgICBsX3RjY3AgPSBwX2oyay0+bV9jcC50Y3BzLT50Y2NwczsKKworICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOyArK2NvbXBubykgIHsKKyAgICAgICAgICAgICAgICBpZiAobF90Y2NwLT5yb2lzaGlmdCkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBvcGpfajJrX3dyaXRlX3JnbihwX2oyaywwLGNvbXBubyxwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wcyxwX3N0cmVhbSxwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKytsX3RjY3A7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2VwYyggICAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyICkKK3sKKyAgICAgICAgb3BqX2NvZGVzdHJlYW1faW5kZXhfdCAqIGxfY3N0cl9pbmRleCA9IDAwOworCisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CisKKyAgICAgICAgbF9jc3RyX2luZGV4ID0gcF9qMmstPmNzdHJfaW5kZXg7CisgICAgICAgIGlmIChsX2NzdHJfaW5kZXgpIHsKKyAgICAgICAgICAgICAgICBsX2NzdHJfaW5kZXgtPmNvZGVzdHJlYW1fc2l6ZSA9IChPUEpfVUlOVDY0KW9wal9zdHJlYW1fdGVsbChwX3N0cmVhbSk7CisgICAgICAgICAgICAgICAgLyogVW5pUEc+PiAqLworICAgICAgICAgICAgICAgIC8qIFRoZSBmb2xsb3dpbmcgYWRqdXN0bWVudCBpcyBkb25lIHRvIGFkanVzdCB0aGUgY29kZXN0cmVhbSBzaXplICovCisgICAgICAgICAgICAgICAgLyogaWYgU09EIGlzIG5vdCBhdCAwIGluIHRoZSBidWZmZXIuIFVzZWZ1bCBpbiBjYXNlIG9mIEpQMiwgd2hlcmUgKi8KKyAgICAgICAgICAgICAgICAvKiB0aGUgZmlyc3QgYnVuY2ggb2YgYnl0ZXMgaXMgbm90IGluIHRoZSBjb2Rlc3RyZWFtICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGxfY3N0cl9pbmRleC0+Y29kZXN0cmVhbV9zaXplIC09IChPUEpfVUlOVDY0KWxfY3N0cl9pbmRleC0+bWFpbl9oZWFkX3N0YXJ0OworICAgICAgICAgICAgICAgIC8qIDw8VW5pUEcgKi8KKyAgICAgICAgfQorCisjaWZkZWYgVVNFX0pQV0wKKyAgICAgICAgLyogcHJlcGFyYXRpb24gb2YgSlBXTCBtYXJrZXIgc2VnbWVudHMgKi8KKyNpZiAwCisgICAgICAgIGlmKGNwLT5lcGNfb24pIHsKKworICAgICAgICAgICAgICAgIC8qIGVuY29kZSBhY2NvcmRpbmcgdG8gSlBXTCAqLworICAgICAgICAgICAgICAgIGpwd2xfZW5jb2RlKHBfajJrLCBwX3N0cmVhbSwgaW1hZ2UpOworCisgICAgICAgIH0KKyNlbmRpZgorICBhc3NlcnQoIDAgJiYgIlRPRE8iICk7CisjZW5kaWYgLyogVVNFX0pQV0wgKi8KKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfdW5rICggICAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqb3V0cHV0X21hcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBsX3Vua25vd25fbWFya2VyOworICAgICAgICBjb25zdCBvcGpfZGVjX21lbW9yeV9tYXJrZXJfaGFuZGxlcl90ICogbF9tYXJrZXJfaGFuZGxlcjsKKyAgICAgICAgT1BKX1VJTlQzMiBsX3NpemVfdW5rID0gMjsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zKi8KKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CisKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiVW5rbm93biBtYXJrZXJcbiIpOworCisJCWZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAvKiBUcnkgdG8gcmVhZCAyIGJ5dGVzICh0aGUgbmV4dCBtYXJrZXIgSUQpIGZyb20gc3RyZWFtIGFuZCBjb3B5IHRoZW0gaW50byB0aGUgYnVmZmVyKi8KKyAgICAgICAgICAgICAgICBpZiAob3BqX3N0cmVhbV9yZWFkX2RhdGEocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsMixwX21hbmFnZXIpICE9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJTdHJlYW0gdG9vIHNob3J0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogcmVhZCAyIGJ5dGVzIGFzIHRoZSBuZXcgbWFya2VyIElEKi8KKyAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSwmbF91bmtub3duX21hcmtlciwyKTsKKworICAgICAgICAgICAgICAgIGlmICghKGxfdW5rbm93bl9tYXJrZXIgPCAweGZmMDApKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbWFya2VyIGhhbmRsZXIgZnJvbSB0aGUgbWFya2VyIElEKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxfbWFya2VyX2hhbmRsZXIgPSBvcGpfajJrX2dldF9tYXJrZXJfaGFuZGxlcihsX3Vua25vd25fbWFya2VyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgJiBsX21hcmtlcl9oYW5kbGVyLT5zdGF0ZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJNYXJrZXIgaXMgbm90IGNvbXBsaWFudCB3aXRoIGl0cyBwb3NpdGlvblxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfbWFya2VyX2hhbmRsZXItPmlkICE9IEoyS19NU19VTkspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBZGQgdGhlIG1hcmtlciB0byB0aGUgY29kZXN0cmVhbSBpbmRleCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfbWFya2VyX2hhbmRsZXItPmlkICE9IEoyS19NU19TT1QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JPT0wgcmVzID0gb3BqX2oya19hZGRfbWhtYXJrZXIocF9qMmstPmNzdHJfaW5kZXgsIEoyS19NU19VTkssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9VSU5UMzIpIG9wal9zdHJlYW1fdGVsbChwX3N0cmVhbSkgLSBsX3NpemVfdW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2l6ZV91bmspOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBPUEpfRkFMU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFkZCBtaCBtYXJrZXJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLyogbmV4dCBtYXJrZXIgaXMga25vd24gYW5kIHdlbGwgbG9jYXRlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NpemVfdW5rICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKm91dHB1dF9tYXJrZXIgPSBsX21hcmtlcl9oYW5kbGVyLT5pZCA7CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9tY3RfcmVjb3JkKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX21jdF9kYXRhX3QgKiBwX21jdF9yZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIgKQoreworICAgICAgICBPUEpfVUlOVDMyIGxfbWN0X3NpemU7CisgICAgICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKKyAgICAgICAgT1BKX1VJTlQzMiBsX3RtcDsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworCisgICAgICAgIGxfbWN0X3NpemUgPSAxMCArIHBfbWN0X3JlY29yZC0+bV9kYXRhX3NpemU7CisKKyAgICAgICAgaWYgKGxfbWN0X3NpemUgPiBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICBPUEpfQllURSAqbmV3X2hlYWRlcl90aWxlX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwgbF9tY3Rfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCEgbmV3X2hlYWRlcl90aWxlX2RhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHdyaXRlIE1DVCBtYXJrZXJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IG5ld19oZWFkZXJfdGlsZV9kYXRhOworICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IGxfbWN0X3NpemU7CisgICAgICAgIH0KKworICAgICAgICBsX2N1cnJlbnRfZGF0YSA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGE7CisKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLEoyS19NU19NQ1QsMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNQ1QgKi8KKyAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF9tY3Rfc2l6ZS0yLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExtY3QgKi8KKyAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsMCwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWm1jdCAqLworICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOworCisgICAgICAgIC8qIG9ubHkgb25lIG1hcmtlciBhdG0gKi8KKyAgICAgICAgbF90bXAgPSAocF9tY3RfcmVjb3JkLT5tX2luZGV4ICYgMHhmZikgfCAocF9tY3RfcmVjb3JkLT5tX2FycmF5X3R5cGUgPDwgOCkgfCAocF9tY3RfcmVjb3JkLT5tX2VsZW1lbnRfdHlwZSA8PCAxMCk7CisKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfdG1wLDIpOworICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOworCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwwLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBZbWN0ICovCisgICAgICAgIGxfY3VycmVudF9kYXRhKz0yOworCisgICAgICAgIG1lbWNweShsX2N1cnJlbnRfZGF0YSxwX21jdF9yZWNvcmQtPm1fZGF0YSxwX21jdF9yZWNvcmQtPm1fZGF0YV9zaXplKTsKKworICAgICAgICBpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKHBfc3RyZWFtLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsbF9tY3Rfc2l6ZSxwX21hbmFnZXIpICE9IGxfbWN0X3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCisvKioKKyAqIFJlYWRzIGEgTUNUIG1hcmtlciAoTXVsdGlwbGUgQ29tcG9uZW50IFRyYW5zZm9ybSkKKyAqCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgTUNUIGJveC4KKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgTUNUIG1hcmtlci4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfbWN0ICggICAgICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgICAgIE9QSl9VSU5UMzIgaTsKKyAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOworICAgICAgICBPUEpfVUlOVDMyIGxfdG1wOworICAgICAgICBPUEpfVUlOVDMyIGxfaW5kaXg7CisgICAgICAgIG9wal9tY3RfZGF0YV90ICogbF9tY3RfZGF0YTsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKworICAgICAgICBsX3RjcCA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IEoyS19TVEFURV9UUEggPworICAgICAgICAgICAgICAgICAgICAgICAgJnBfajJrLT5tX2NwLnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0gOgorICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3A7CisKKyAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCAyKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgTUNUIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGZpcnN0IG1hcmtlciAqLworICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX3RtcCwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogWm1jdCAqLworICAgICAgICBwX2hlYWRlcl9kYXRhICs9IDI7CisgICAgICAgIGlmIChsX3RtcCAhPSAwKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiQ2Fubm90IHRha2UgaW4gY2hhcmdlIG1jdCBkYXRhIHdpdGhpbiBtdWx0aXBsZSBNQ1QgcmVjb3Jkc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgICAgICB9CisKKyAgICAgICAgaWYocF9oZWFkZXJfc2l6ZSA8PSA2KSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgTUNUIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEltY3QgLT4gbm8gbmVlZCBmb3Igb3RoZXIgdmFsdWVzLCB0YWtlIHRoZSBmaXJzdCwgdHlwZSBpcyBkb3VibGUgd2l0aCBkZWNvcnJlbGF0aW9uIHgwMDAwIDExMDEgMDAwMCAwMDAwKi8KKyAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF90bXAsMik7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEltY3QgKi8KKyAgICAgICAgcF9oZWFkZXJfZGF0YSArPSAyOworCisgICAgICAgIGxfaW5kaXggPSBsX3RtcCAmIDB4ZmY7CisgICAgICAgIGxfbWN0X2RhdGEgPSBsX3RjcC0+bV9tY3RfcmVjb3JkczsKKworICAgICAgICBmb3IgKGk9MDtpPGxfdGNwLT5tX25iX21jdF9yZWNvcmRzOysraSkgeworICAgICAgICAgICAgICAgIGlmIChsX21jdF9kYXRhLT5tX2luZGV4ID09IGxfaW5kaXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK2xfbWN0X2RhdGE7CisgICAgICAgIH0KKworICAgICAgICAvKiBOT1QgRk9VTkQgKi8KKyAgICAgICAgaWYgKGkgPT0gbF90Y3AtPm1fbmJfbWN0X3JlY29yZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAobF90Y3AtPm1fbmJfbWN0X3JlY29yZHMgPT0gbF90Y3AtPm1fbmJfbWF4X21jdF9yZWNvcmRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfbWN0X2RhdGFfdCAqbmV3X21jdF9yZWNvcmRzOworICAgICAgICAgICAgICAgICAgICAgICAgbF90Y3AtPm1fbmJfbWF4X21jdF9yZWNvcmRzICs9IE9QSl9KMktfTUNUX0RFRkFVTFRfTkJfUkVDT1JEUzsKKworICAgICAgICAgICAgICAgICAgICAgICAgbmV3X21jdF9yZWNvcmRzID0gKG9wal9tY3RfZGF0YV90ICopIG9wal9yZWFsbG9jKGxfdGNwLT5tX21jdF9yZWNvcmRzLCBsX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMgKiBzaXplb2Yob3BqX21jdF9kYXRhX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG5ld19tY3RfcmVjb3JkcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX3RjcC0+bV9tY3RfcmVjb3Jkcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNwLT5tX21jdF9yZWNvcmRzID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90Y3AtPm1fbmJfbWF4X21jdF9yZWNvcmRzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90Y3AtPm1fbmJfbWN0X3JlY29yZHMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBNQ1QgbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNwLT5tX21jdF9yZWNvcmRzID0gbmV3X21jdF9yZWNvcmRzOworICAgICAgICAgICAgICAgICAgICAgICAgbF9tY3RfZGF0YSA9IGxfdGNwLT5tX21jdF9yZWNvcmRzICsgbF90Y3AtPm1fbmJfbWN0X3JlY29yZHM7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQobF9tY3RfZGF0YSAsMCwobF90Y3AtPm1fbmJfbWF4X21jdF9yZWNvcmRzIC0gbF90Y3AtPm1fbmJfbWN0X3JlY29yZHMpICogc2l6ZW9mKG9wal9tY3RfZGF0YV90KSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbF9tY3RfZGF0YSA9IGxfdGNwLT5tX21jdF9yZWNvcmRzICsgbF90Y3AtPm1fbmJfbWN0X3JlY29yZHM7CisgICAgICAgICAgICAgICAgKytsX3RjcC0+bV9uYl9tY3RfcmVjb3JkczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsX21jdF9kYXRhLT5tX2RhdGEpIHsKKyAgICAgICAgICAgICAgICBvcGpfZnJlZShsX21jdF9kYXRhLT5tX2RhdGEpOworICAgICAgICAgICAgICAgIGxfbWN0X2RhdGEtPm1fZGF0YSA9IDAwOworICAgICAgICB9CisKKyAgICAgICAgbF9tY3RfZGF0YS0+bV9pbmRleCA9IGxfaW5kaXg7CisgICAgICAgIGxfbWN0X2RhdGEtPm1fYXJyYXlfdHlwZSA9IChKMktfTUNUX0FSUkFZX1RZUEUpKChsX3RtcCAgPj4gOCkgJiAzKTsKKyAgICAgICAgbF9tY3RfZGF0YS0+bV9lbGVtZW50X3R5cGUgPSAoSjJLX01DVF9FTEVNRU5UX1RZUEUpKChsX3RtcCAgPj4gMTApICYgMyk7CisKKyAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF90bXAsMik7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFltY3QgKi8KKyAgICAgICAgcF9oZWFkZXJfZGF0YSs9MjsKKyAgICAgICAgaWYgKGxfdG1wICE9IDApIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbXVsdGlwbGUgTUNUIG1hcmtlcnNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIHBfaGVhZGVyX3NpemUgLT0gNjsKKworICAgICAgICBsX21jdF9kYXRhLT5tX2RhdGEgPSAoT1BKX0JZVEUqKW9wal9tYWxsb2MocF9oZWFkZXJfc2l6ZSk7CisgICAgICAgIGlmICghIGxfbWN0X2RhdGEtPm1fZGF0YSkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIE1DVCBtYXJrZXJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGxfbWN0X2RhdGEtPm1fZGF0YSxwX2hlYWRlcl9kYXRhLHBfaGVhZGVyX3NpemUpOworCisgICAgICAgIGxfbWN0X2RhdGEtPm1fZGF0YV9zaXplID0gcF9oZWFkZXJfc2l6ZTsKKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX21jY19yZWNvcmQoICAgICAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX3NpbXBsZV9tY2NfZGVjb3JyZWxhdGlvbl9kYXRhICogcF9tY2NfcmVjb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyICkKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBpOworICAgICAgICBPUEpfVUlOVDMyIGxfbWNjX3NpemU7CisgICAgICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKKyAgICAgICAgT1BKX1VJTlQzMiBsX25iX2J5dGVzX2Zvcl9jb21wOworICAgICAgICBPUEpfVUlOVDMyIGxfbWFzazsKKyAgICAgICAgT1BKX1VJTlQzMiBsX3RtY2M7CisKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKworICAgICAgICBpZiAocF9tY2NfcmVjb3JkLT5tX25iX2NvbXBzID4gMjU1ICkgeworICAgICAgICBsX25iX2J5dGVzX2Zvcl9jb21wID0gMjsKKyAgICAgICAgICAgICAgICBsX21hc2sgPSAweDgwMDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbF9uYl9ieXRlc19mb3JfY29tcCA9IDE7CisgICAgICAgICAgICAgICAgbF9tYXNrID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGxfbWNjX3NpemUgPSBwX21jY19yZWNvcmQtPm1fbmJfY29tcHMgKiAyICogbF9uYl9ieXRlc19mb3JfY29tcCArIDE5OworICAgICAgICBpZiAobF9tY2Nfc2l6ZSA+IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIE9QSl9CWVRFICpuZXdfaGVhZGVyX3RpbGVfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfcmVhbGxvYyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLCBsX21jY19zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoISBuZXdfaGVhZGVyX3RpbGVfZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gd3JpdGUgTUNDIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gbmV3X2hlYWRlcl90aWxlX2RhdGE7CisgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gbF9tY2Nfc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGxfY3VycmVudF9kYXRhID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YTsKKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsSjJLX01TX01DQywyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1DQyAqLworICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOworCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX21jY19zaXplLTIsMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG1jYyAqLworICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOworCisgICAgICAgIC8qIGZpcnN0IG1hcmtlciAqLworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsMCwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBabWNjICovCisgICAgICAgIGxfY3VycmVudF9kYXRhICs9IDI7CisKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLHBfbWNjX3JlY29yZC0+bV9pbmRleCwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW1jYyAtPiBubyBuZWVkIGZvciBvdGhlciB2YWx1ZXMsIHRha2UgdGhlIGZpcnN0ICovCisgICAgICAgICsrbF9jdXJyZW50X2RhdGE7CisKKyAgICAgICAgLyogb25seSBvbmUgbWFya2VyIGF0bSAqLworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsMCwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBZbWNjICovCisgICAgICAgIGxfY3VycmVudF9kYXRhKz0yOworCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwxLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFFtY2MgLT4gbnVtYmVyIG9mIGNvbGxlY3Rpb25zIC0+IDEgKi8KKyAgICAgICAgbF9jdXJyZW50X2RhdGErPTI7CisKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLDB4MSwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWG1jY2kgdHlwZSBvZiBjb21wb25lbnQgdHJhbnNmb3JtYXRpb24gLT4gYXJyYXkgYmFzZWQgZGVjb3JyZWxhdGlvbiAqLworICAgICAgICArK2xfY3VycmVudF9kYXRhOworCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxwX21jY19yZWNvcmQtPm1fbmJfY29tcHMgfCBsX21hc2ssMik7ICAgIC8qIE5tY2NpIG51bWJlciBvZiBpbnB1dCBjb21wb25lbnRzIGludm9sdmVkIGFuZCBzaXplIGZvciBlYWNoIGNvbXBvbmVudCBvZmZzZXQgPSA4IGJpdHMgKi8KKyAgICAgICAgbF9jdXJyZW50X2RhdGErPTI7CisKKyAgICAgICAgZm9yIChpPTA7aTxwX21jY19yZWNvcmQtPm1fbmJfY29tcHM7KytpKSB7CisgICAgICAgICAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGksbF9uYl9ieXRlc19mb3JfY29tcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbWNjaWogQ29tcG9uZW50IG9mZnNldCovCisgICAgICAgICAgICAgICAgbF9jdXJyZW50X2RhdGErPWxfbmJfYnl0ZXNfZm9yX2NvbXA7CisgICAgICAgIH0KKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEscF9tY2NfcmVjb3JkLT5tX25iX2NvbXBzfGxfbWFzaywyKTsgICAgICAvKiBNbWNjaSBudW1iZXIgb2Ygb3V0cHV0IGNvbXBvbmVudHMgaW52b2x2ZWQgYW5kIHNpemUgZm9yIGVhY2ggY29tcG9uZW50IG9mZnNldCA9IDggYml0cyAqLworICAgICAgICBsX2N1cnJlbnRfZGF0YSs9MjsKKworICAgICAgICBmb3IgKGk9MDtpPHBfbWNjX3JlY29yZC0+bV9uYl9jb21wczsrK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsaSxsX25iX2J5dGVzX2Zvcl9jb21wKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdtY2NpaiBDb21wb25lbnQgb2Zmc2V0Ki8KKyAgICAgICAgICAgICAgICBsX2N1cnJlbnRfZGF0YSs9bF9uYl9ieXRlc19mb3JfY29tcDsKKyAgICAgICAgfQorCisgICAgICAgIGxfdG1jYyA9ICgoIXBfbWNjX3JlY29yZC0+bV9pc19pcnJldmVyc2libGUpJjEpPDwxNjsKKworICAgICAgICBpZiAocF9tY2NfcmVjb3JkLT5tX2RlY29ycmVsYXRpb25fYXJyYXkpIHsKKyAgICAgICAgICAgICAgICBsX3RtY2MgfD0gcF9tY2NfcmVjb3JkLT5tX2RlY29ycmVsYXRpb25fYXJyYXktPm1faW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBpZiAocF9tY2NfcmVjb3JkLT5tX29mZnNldF9hcnJheSkgeworICAgICAgICAgICAgICAgIGxfdG1jYyB8PSAoKHBfbWNjX3JlY29yZC0+bV9vZmZzZXRfYXJyYXktPm1faW5kZXgpPDw4KTsKKyAgICAgICAgfQorCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX3RtY2MsMyk7ICAgICAgIC8qIFRtY2NpIDogdXNlIE1DVCBkZWZpbmVkIGFzIG51bWJlciAxIGFuZCBpcnJldmVyc2libGUgYXJyYXkgYmFzZWQuICovCisgICAgICAgIGxfY3VycmVudF9kYXRhKz0zOworCisgICAgICAgIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSxsX21jY19zaXplLHBfbWFuYWdlcikgIT0gbF9tY2Nfc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfbWNjICggICAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQoreworICAgICAgICBPUEpfVUlOVDMyIGksajsKKyAgICAgICAgT1BKX1VJTlQzMiBsX3RtcDsKKyAgICAgICAgT1BKX1VJTlQzMiBsX2luZGl4OworICAgICAgICBvcGpfdGNwX3QgKiBsX3RjcDsKKyAgICAgICAgb3BqX3NpbXBsZV9tY2NfZGVjb3JyZWxhdGlvbl9kYXRhX3QgKiBsX21jY19yZWNvcmQ7CisgICAgICAgIG9wal9tY3RfZGF0YV90ICogbF9tY3RfZGF0YTsKKyAgICAgICAgT1BKX1VJTlQzMiBsX25iX2NvbGxlY3Rpb25zOworICAgICAgICBPUEpfVUlOVDMyIGxfbmJfY29tcHM7CisgICAgICAgIE9QSl9VSU5UMzIgbF9uYl9ieXRlc19ieV9jb21wOworICAgICAgICBPUEpfQk9PTCBuZXdfbWNjID0gT1BKX0ZBTFNFOworCisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICAgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOworICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworICAgICAgICBsX3RjcCA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IEoyS19TVEFURV9UUEggPworICAgICAgICAgICAgICAgICAgICAgICAgJnBfajJrLT5tX2NwLnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0gOgorICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3A7CisKKyAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCAyKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgTUNDIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGZpcnN0IG1hcmtlciAqLworICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX3RtcCwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogWm1jYyAqLworICAgICAgICBwX2hlYWRlcl9kYXRhICs9IDI7CisgICAgICAgIGlmIChsX3RtcCAhPSAwKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiQ2Fubm90IHRha2UgaW4gY2hhcmdlIG11bHRpcGxlIGRhdGEgc3Bhbm5pbmdcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwX2hlYWRlcl9zaXplIDwgNykgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIE1DQyBtYXJrZXJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX2luZGl4LDEpOyAvKiBJbWNjIC0+IG5vIG5lZWQgZm9yIG90aGVyIHZhbHVlcywgdGFrZSB0aGUgZmlyc3QgKi8KKyAgICAgICAgKytwX2hlYWRlcl9kYXRhOworCisgICAgICAgIGxfbWNjX3JlY29yZCA9IGxfdGNwLT5tX21jY19yZWNvcmRzOworCisgICAgICAgIGZvcihpPTA7aTxsX3RjcC0+bV9uYl9tY2NfcmVjb3JkczsrK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAobF9tY2NfcmVjb3JkLT5tX2luZGV4ID09IGxfaW5kaXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK2xfbWNjX3JlY29yZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBOT1QgRk9VTkQgKi8KKyAgICAgICAgaWYgKGkgPT0gbF90Y3AtPm1fbmJfbWNjX3JlY29yZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAobF90Y3AtPm1fbmJfbWNjX3JlY29yZHMgPT0gbF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCAqbmV3X21jY19yZWNvcmRzOworICAgICAgICAgICAgICAgICAgICAgICAgbF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzICs9IE9QSl9KMktfTUNDX0RFRkFVTFRfTkJfUkVDT1JEUzsKKworICAgICAgICAgICAgICAgICAgICAgICAgbmV3X21jY19yZWNvcmRzID0gKG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90ICopIG9wal9yZWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNwLT5tX21jY19yZWNvcmRzLCBsX3RjcC0+bV9uYl9tYXhfbWNjX3JlY29yZHMgKiBzaXplb2Yob3BqX3NpbXBsZV9tY2NfZGVjb3JyZWxhdGlvbl9kYXRhX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG5ld19tY2NfcmVjb3JkcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX3RjcC0+bV9tY2NfcmVjb3Jkcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNwLT5tX21jY19yZWNvcmRzID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90Y3AtPm1fbmJfbWNjX3JlY29yZHMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBNQ0MgbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNwLT5tX21jY19yZWNvcmRzID0gbmV3X21jY19yZWNvcmRzOworICAgICAgICAgICAgICAgICAgICAgICAgbF9tY2NfcmVjb3JkID0gbF90Y3AtPm1fbWNjX3JlY29yZHMgKyBsX3RjcC0+bV9uYl9tY2NfcmVjb3JkczsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChsX21jY19yZWNvcmQsMCwobF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzLWxfdGNwLT5tX25iX21jY19yZWNvcmRzKSAqIHNpemVvZihvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsX21jY19yZWNvcmQgPSBsX3RjcC0+bV9tY2NfcmVjb3JkcyArIGxfdGNwLT5tX25iX21jY19yZWNvcmRzOworICAgICAgICAgICAgICAgIG5ld19tY2MgPSBPUEpfVFJVRTsKKyAgICAgICAgfQorICAgICAgICBsX21jY19yZWNvcmQtPm1faW5kZXggPSBsX2luZGl4OworCisgICAgICAgIC8qIG9ubHkgb25lIG1hcmtlciBhdG0gKi8KKyAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF90bXAsMik7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFltY2MgKi8KKyAgICAgICAgcF9oZWFkZXJfZGF0YSs9MjsKKyAgICAgICAgaWYgKGxfdG1wICE9IDApIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbXVsdGlwbGUgZGF0YSBzcGFubmluZ1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgICAgICB9CisKKyAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9uYl9jb2xsZWN0aW9ucywyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRbWNjIC0+IG51bWJlciBvZiBjb2xsZWN0aW9ucyAtPiAxICovCisgICAgICAgIHBfaGVhZGVyX2RhdGErPTI7CisKKyAgICAgICAgaWYgKGxfbmJfY29sbGVjdGlvbnMgPiAxKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiQ2Fubm90IHRha2UgaW4gY2hhcmdlIG11bHRpcGxlIGNvbGxlY3Rpb25zXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgIH0KKworICAgICAgICBwX2hlYWRlcl9zaXplIC09IDc7CisKKyAgICAgICAgZm9yIChpPTA7aTxsX25iX2NvbGxlY3Rpb25zOysraSkgeworICAgICAgICAgICAgICAgIGlmIChwX2hlYWRlcl9zaXplIDwgMykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgTUNDIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfdG1wLDEpOyAvKiBYbWNjaSB0eXBlIG9mIGNvbXBvbmVudCB0cmFuc2Zvcm1hdGlvbiAtPiBhcnJheSBiYXNlZCBkZWNvcnJlbGF0aW9uICovCisgICAgICAgICAgICAgICAgKytwX2hlYWRlcl9kYXRhOworCisgICAgICAgICAgICAgICAgaWYgKGxfdG1wICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkNhbm5vdCB0YWtlIGluIGNoYXJnZSBjb2xsZWN0aW9ucyBvdGhlciB0aGFuIGFycmF5IGRlY29ycmVsYXRpb25cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfbmJfY29tcHMsMik7CisKKyAgICAgICAgICAgICAgICBwX2hlYWRlcl9kYXRhKz0yOworICAgICAgICAgICAgICAgIHBfaGVhZGVyX3NpemUtPTM7CisKKyAgICAgICAgICAgICAgICBsX25iX2J5dGVzX2J5X2NvbXAgPSAxICsgKGxfbmJfY29tcHM+PjE1KTsKKyAgICAgICAgICAgICAgICBsX21jY19yZWNvcmQtPm1fbmJfY29tcHMgPSBsX25iX2NvbXBzICYgMHg3ZmZmOworCisgICAgICAgICAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCAobF9uYl9ieXRlc19ieV9jb21wICogbF9tY2NfcmVjb3JkLT5tX25iX2NvbXBzICsgMikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIE1DQyBtYXJrZXJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwX2hlYWRlcl9zaXplIC09IChsX25iX2J5dGVzX2J5X2NvbXAgKiBsX21jY19yZWNvcmQtPm1fbmJfY29tcHMgKyAyKTsKKworICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9tY2NfcmVjb3JkLT5tX25iX2NvbXBzOysraikgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF90bXAsbF9uYl9ieXRlc19ieV9jb21wKTsgICAgICAgIC8qIENtY2NpaiBDb21wb25lbnQgb2Zmc2V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBfaGVhZGVyX2RhdGErPWxfbmJfYnl0ZXNfYnlfY29tcDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfdG1wICE9IGopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiQ2Fubm90IHRha2UgaW4gY2hhcmdlIGNvbGxlY3Rpb25zIHdpdGggaW5kaXggc2h1ZmZsZVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX25iX2NvbXBzLDIpOworICAgICAgICAgICAgICAgIHBfaGVhZGVyX2RhdGErPTI7CisKKyAgICAgICAgICAgICAgICBsX25iX2J5dGVzX2J5X2NvbXAgPSAxICsgKGxfbmJfY29tcHM+PjE1KTsKKyAgICAgICAgICAgICAgICBsX25iX2NvbXBzICY9IDB4N2ZmZjsKKworICAgICAgICAgICAgICAgIGlmIChsX25iX2NvbXBzICE9IGxfbWNjX3JlY29yZC0+bV9uYl9jb21wcykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiQ2Fubm90IHRha2UgaW4gY2hhcmdlIGNvbGxlY3Rpb25zIHdpdGhvdXQgc2FtZSBudW1iZXIgb2YgaW5kaXhlc1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCAobF9uYl9ieXRlc19ieV9jb21wICogbF9tY2NfcmVjb3JkLT5tX25iX2NvbXBzICsgMykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIE1DQyBtYXJrZXJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwX2hlYWRlcl9zaXplIC09IChsX25iX2J5dGVzX2J5X2NvbXAgKiBsX21jY19yZWNvcmQtPm1fbmJfY29tcHMgKyAzKTsKKworICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9tY2NfcmVjb3JkLT5tX25iX2NvbXBzOysraikgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF90bXAsbF9uYl9ieXRlc19ieV9jb21wKTsgICAgICAgIC8qIFdtY2NpaiBDb21wb25lbnQgb2Zmc2V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBfaGVhZGVyX2RhdGErPWxfbmJfYnl0ZXNfYnlfY29tcDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfdG1wICE9IGopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiQ2Fubm90IHRha2UgaW4gY2hhcmdlIGNvbGxlY3Rpb25zIHdpdGggaW5kaXggc2h1ZmZsZVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX3RtcCwzKTsgLyogV21jY2lqIENvbXBvbmVudCBvZmZzZXQqLworICAgICAgICAgICAgICAgIHBfaGVhZGVyX2RhdGEgKz0gMzsKKworICAgICAgICAgICAgICAgIGxfbWNjX3JlY29yZC0+bV9pc19pcnJldmVyc2libGUgPSAhICgobF90bXA+PjE2KSAmIDEpOworICAgICAgICAgICAgICAgIGxfbWNjX3JlY29yZC0+bV9kZWNvcnJlbGF0aW9uX2FycmF5ID0gMDA7CisgICAgICAgICAgICAgICAgbF9tY2NfcmVjb3JkLT5tX29mZnNldF9hcnJheSA9IDAwOworCisgICAgICAgICAgICAgICAgbF9pbmRpeCA9IGxfdG1wICYgMHhmZjsKKyAgICAgICAgICAgICAgICBpZiAobF9pbmRpeCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsX21jdF9kYXRhID0gbF90Y3AtPm1fbWN0X3JlY29yZHM7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfdGNwLT5tX25iX21jdF9yZWNvcmRzOysraikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9tY3RfZGF0YS0+bV9pbmRleCA9PSBsX2luZGl4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9tY2NfcmVjb3JkLT5tX2RlY29ycmVsYXRpb25fYXJyYXkgPSBsX21jdF9kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9tY3RfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfbWNjX3JlY29yZC0+bV9kZWNvcnJlbGF0aW9uX2FycmF5ID09IDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIE1DQyBtYXJrZXJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGxfaW5kaXggPSAobF90bXAgPj4gOCkgJiAweGZmOworICAgICAgICAgICAgICAgIGlmIChsX2luZGl4ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfbWN0X2RhdGEgPSBsX3RjcC0+bV9tY3RfcmVjb3JkczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF90Y3AtPm1fbmJfbWN0X3JlY29yZHM7KytqKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX21jdF9kYXRhLT5tX2luZGV4ID09IGxfaW5kaXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX21jY19yZWNvcmQtPm1fb2Zmc2V0X2FycmF5ID0gbF9tY3RfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfbWN0X2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX21jY19yZWNvcmQtPm1fb2Zmc2V0X2FycmF5ID09IDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIE1DQyBtYXJrZXJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwX2hlYWRlcl9zaXplICE9IDApIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBNQ0MgbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5ld19tY2MpIHsKKyAgICAgICAgICAgICAgICArK2xfdGNwLT5tX25iX21jY19yZWNvcmRzOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9tY28oICAgICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAgICAgT1BKX0JZVEUgKiBsX2N1cnJlbnRfZGF0YSA9IDAwOworICAgICAgICBPUEpfVUlOVDMyIGxfbWNvX3NpemU7CisgICAgICAgIG9wal90Y3BfdCAqIGxfdGNwID0gMDA7CisgICAgICAgIG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90ICogbF9tY2NfcmVjb3JkOworICAgICAgICBPUEpfVUlOVDMyIGk7CisKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKworICAgICAgICBsX3RjcCA9JihwX2oyay0+bV9jcC50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdKTsKKwkKKyAgICAgICAgbF9tY29fc2l6ZSA9IDUgKyBsX3RjcC0+bV9uYl9tY2NfcmVjb3JkczsKKyAgICAgICAgaWYgKGxfbWNvX3NpemUgPiBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUpIHsKKworICAgICAgICAgICAgICAgIE9QSl9CWVRFICpuZXdfaGVhZGVyX3RpbGVfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfcmVhbGxvYyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLCBsX21jb19zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoISBuZXdfaGVhZGVyX3RpbGVfZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gd3JpdGUgTUNPIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gbmV3X2hlYWRlcl90aWxlX2RhdGE7CisgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gbF9tY29fc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBsX2N1cnJlbnRfZGF0YSA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGE7CisKKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsSjJLX01TX01DTywyKTsgICAgICAgICAgICAgICAgICAgLyogTUNPICovCisgICAgICAgIGxfY3VycmVudF9kYXRhICs9IDI7CisKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfbWNvX3NpemUtMiwyKTsgICAgICAgICAgICAgICAgIC8qIExtY28gKi8KKyAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF90Y3AtPm1fbmJfbWNjX3JlY29yZHMsMSk7ICAgICAgLyogTm1jbyA6IG9ubHkgb25lIHRyYW5zZm9ybSBzdGFnZSovCisgICAgICAgICsrbF9jdXJyZW50X2RhdGE7CisKKyAgICAgICAgbF9tY2NfcmVjb3JkID0gbF90Y3AtPm1fbWNjX3JlY29yZHM7CisgICAgICAgIGZvciAoaT0wO2k8bF90Y3AtPm1fbmJfbWNjX3JlY29yZHM7KytpKSB7CisgICAgICAgICAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfbWNjX3JlY29yZC0+bV9pbmRleCwxKTsvKiBJbWNvIC0+IHVzZSB0aGUgbWNjIGluZGljYXRlZCBieSAxKi8KKyAgICAgICAgICAgICAgICArK2xfY3VycmVudF9kYXRhOworICAgICAgICAgICAgICAgICsrbF9tY2NfcmVjb3JkOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLGxfbWNvX3NpemUscF9tYW5hZ2VyKSAhPSBsX21jb19zaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworLyoqCisgKiBSZWFkcyBhIE1DTyBtYXJrZXIgKE11bHRpcGxlIENvbXBvbmVudCBUcmFuc2Zvcm0gT3JkZXJpbmcpCisgKgorICogQHBhcmFtICAgICAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIE1DTyBib3guCisgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgorICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIE1DTyBtYXJrZXIuCisgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX21jbyAoICAgICAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgICAgICBPUEpfVUlOVDMyIGxfdG1wLCBpOworICAgICAgICBPUEpfVUlOVDMyIGxfbmJfc3RhZ2VzOworICAgICAgICBvcGpfdGNwX3QgKiBsX3RjcDsKKyAgICAgICAgb3BqX3RjY3BfdCAqIGxfdGNjcDsKKyAgICAgICAgb3BqX2ltYWdlX3QgKiBsX2ltYWdlOworCisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICAgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOworICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworICAgICAgICBsX2ltYWdlID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZTsKKyAgICAgICAgbF90Y3AgPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9PSBKMktfU1RBVEVfVFBIID8KKyAgICAgICAgICAgICAgICAgICAgICAgICZwX2oyay0+bV9jcC50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwOworCisgICAgICAgIGlmIChwX2hlYWRlcl9zaXplIDwgMSkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIE1DTyBtYXJrZXJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX25iX3N0YWdlcywxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObWNvIDogb25seSBvbmUgdHJhbnNmb3JtIHN0YWdlKi8KKyAgICAgICAgKytwX2hlYWRlcl9kYXRhOworCisgICAgICAgIGlmIChsX25iX3N0YWdlcyA+IDEpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbXVsdGlwbGUgdHJhbnNmb3JtYXRpb24gc3RhZ2VzLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgIT0gbF9uYl9zdGFnZXMgKyAxKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiRXJyb3IgcmVhZGluZyBNQ08gbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgbF90Y2NwID0gbF90Y3AtPnRjY3BzOworCisgICAgICAgIGZvciAoaT0wO2k8bF9pbWFnZS0+bnVtY29tcHM7KytpKSB7CisgICAgICAgICAgICAgICAgbF90Y2NwLT5tX2RjX2xldmVsX3NoaWZ0ID0gMDsKKyAgICAgICAgICAgICAgICArK2xfdGNjcDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsX3RjcC0+bV9tY3RfZGVjb2RpbmdfbWF0cml4KSB7CisgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCk7CisgICAgICAgICAgICAgICAgbF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCA9IDAwOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpPTA7aTxsX25iX3N0YWdlczsrK2kpIHsKKyAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX3RtcCwxKTsKKyAgICAgICAgICAgICAgICArK3BfaGVhZGVyX2RhdGE7CisKKyAgICAgICAgICAgICAgICBpZiAoISBvcGpfajJrX2FkZF9tY3QobF90Y3AscF9qMmstPm1fcHJpdmF0ZV9pbWFnZSxsX3RtcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19hZGRfbWN0KG9wal90Y3BfdCAqIHBfdGNwLCBvcGpfaW1hZ2VfdCAqIHBfaW1hZ2UsIE9QSl9VSU5UMzIgcF9pbmRleCkKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBpOworICAgICAgICBvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCAqIGxfbWNjX3JlY29yZDsKKyAgICAgICAgb3BqX21jdF9kYXRhX3QgKiBsX2RlY29fYXJyYXksICogbF9vZmZzZXRfYXJyYXk7CisgICAgICAgIE9QSl9VSU5UMzIgbF9kYXRhX3NpemUsbF9tY3Rfc2l6ZSwgbF9vZmZzZXRfc2l6ZTsKKyAgICAgICAgT1BKX1VJTlQzMiBsX25iX2VsZW07CisgICAgICAgIE9QSl9VSU5UMzIgKiBsX29mZnNldF9kYXRhLCAqIGxfY3VycmVudF9vZmZzZXRfZGF0YTsKKyAgICAgICAgb3BqX3RjY3BfdCAqIGxfdGNjcDsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydChwX3RjcCAhPSAwMCk7CisKKyAgICAgICAgbF9tY2NfcmVjb3JkID0gcF90Y3AtPm1fbWNjX3JlY29yZHM7CisKKyAgICAgICAgZm9yIChpPTA7aTxwX3RjcC0+bV9uYl9tY2NfcmVjb3JkczsrK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAobF9tY2NfcmVjb3JkLT5tX2luZGV4ID09IHBfaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpPT1wX3RjcC0+bV9uYl9tY2NfcmVjb3JkcykgeworICAgICAgICAgICAgICAgIC8qKiBlbGVtZW50IGRpc2NhcmRlZCAqKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobF9tY2NfcmVjb3JkLT5tX25iX2NvbXBzICE9IHBfaW1hZ2UtPm51bWNvbXBzKSB7CisgICAgICAgICAgICAgICAgLyoqIGRvIG5vdCBzdXBwb3J0IG51bWJlciBvZiBjb21wcyAhPSBpbWFnZSAqLworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIGxfZGVjb19hcnJheSA9IGxfbWNjX3JlY29yZC0+bV9kZWNvcnJlbGF0aW9uX2FycmF5OworCisgICAgICAgIGlmIChsX2RlY29fYXJyYXkpIHsKKyAgICAgICAgICAgICAgICBsX2RhdGFfc2l6ZSA9IE1DVF9FTEVNRU5UX1NJWkVbbF9kZWNvX2FycmF5LT5tX2VsZW1lbnRfdHlwZV0gKiBwX2ltYWdlLT5udW1jb21wcyAqIHBfaW1hZ2UtPm51bWNvbXBzOworICAgICAgICAgICAgICAgIGlmIChsX2RlY29fYXJyYXktPm1fZGF0YV9zaXplICE9IGxfZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGxfbmJfZWxlbSA9IHBfaW1hZ2UtPm51bWNvbXBzICogcF9pbWFnZS0+bnVtY29tcHM7CisgICAgICAgICAgICAgICAgbF9tY3Rfc2l6ZSA9IGxfbmJfZWxlbSAqIChPUEpfVUlOVDMyKXNpemVvZihPUEpfRkxPQVQzMik7CisgICAgICAgICAgICAgICAgcF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCA9IChPUEpfRkxPQVQzMiopb3BqX21hbGxvYyhsX21jdF9zaXplKTsKKworICAgICAgICAgICAgICAgIGlmICghIHBfdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGoya19tY3RfcmVhZF9mdW5jdGlvbnNfdG9fZmxvYXRbbF9kZWNvX2FycmF5LT5tX2VsZW1lbnRfdHlwZV0obF9kZWNvX2FycmF5LT5tX2RhdGEscF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCxsX25iX2VsZW0pOworICAgICAgICB9CisKKyAgICAgICAgbF9vZmZzZXRfYXJyYXkgPSBsX21jY19yZWNvcmQtPm1fb2Zmc2V0X2FycmF5OworCisgICAgICAgIGlmIChsX29mZnNldF9hcnJheSkgeworICAgICAgICAgICAgICAgIGxfZGF0YV9zaXplID0gTUNUX0VMRU1FTlRfU0laRVtsX29mZnNldF9hcnJheS0+bV9lbGVtZW50X3R5cGVdICogcF9pbWFnZS0+bnVtY29tcHM7CisgICAgICAgICAgICAgICAgaWYgKGxfb2Zmc2V0X2FycmF5LT5tX2RhdGFfc2l6ZSAhPSBsX2RhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsX25iX2VsZW0gPSBwX2ltYWdlLT5udW1jb21wczsKKyAgICAgICAgICAgICAgICBsX29mZnNldF9zaXplID0gbF9uYl9lbGVtICogKE9QSl9VSU5UMzIpc2l6ZW9mKE9QSl9VSU5UMzIpOworICAgICAgICAgICAgICAgIGxfb2Zmc2V0X2RhdGEgPSAoT1BKX1VJTlQzMiopb3BqX21hbGxvYyhsX29mZnNldF9zaXplKTsKKworICAgICAgICAgICAgICAgIGlmICghIGxfb2Zmc2V0X2RhdGEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGoya19tY3RfcmVhZF9mdW5jdGlvbnNfdG9faW50MzJbbF9vZmZzZXRfYXJyYXktPm1fZWxlbWVudF90eXBlXShsX29mZnNldF9hcnJheS0+bV9kYXRhLGxfb2Zmc2V0X2RhdGEsbF9uYl9lbGVtKTsKKworICAgICAgICAgICAgICAgIGxfdGNjcCA9IHBfdGNwLT50Y2NwczsKKyAgICAgICAgICAgICAgICBsX2N1cnJlbnRfb2Zmc2V0X2RhdGEgPSBsX29mZnNldF9kYXRhOworCisgICAgICAgICAgICAgICAgZm9yIChpPTA7aTxwX2ltYWdlLT5udW1jb21wczsrK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNjcC0+bV9kY19sZXZlbF9zaGlmdCA9IChPUEpfSU5UMzIpKihsX2N1cnJlbnRfb2Zmc2V0X2RhdGErKyk7CisgICAgICAgICAgICAgICAgICAgICAgICArK2xfdGNjcDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBvcGpfZnJlZShsX29mZnNldF9kYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfY2JkKCBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlciApCit7CisgICAgICAgIE9QSl9VSU5UMzIgaTsKKyAgICAgICAgT1BKX1VJTlQzMiBsX2NiZF9zaXplOworICAgICAgICBPUEpfQllURSAqIGxfY3VycmVudF9kYXRhID0gMDA7CisgICAgICAgIG9wal9pbWFnZV90ICpsX2ltYWdlID0gMDA7CisgICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2NvbXAgPSAwMDsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworCisgICAgICAgIGxfaW1hZ2UgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlOworICAgICAgICBsX2NiZF9zaXplID0gNiArIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOworCisgICAgICAgIGlmIChsX2NiZF9zaXplID4gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgT1BKX0JZVEUgKm5ld19oZWFkZXJfdGlsZV9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsIGxfY2JkX3NpemUpOworICAgICAgICAgICAgICAgIGlmICghIG5ld19oZWFkZXJfdGlsZV9kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byB3cml0ZSBDQkQgbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBuZXdfaGVhZGVyX3RpbGVfZGF0YTsKKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSBsX2NiZF9zaXplOworICAgICAgICB9CisKKyAgICAgICAgbF9jdXJyZW50X2RhdGEgPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhOworCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxKMktfTVNfQ0JELDIpOyAgICAgICAgICAgICAgICAgICAvKiBDQkQgKi8KKyAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF9jYmRfc2l6ZS0yLDIpOyAgICAgICAgICAgICAgICAgLyogTF9DQkQgKi8KKyAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF9pbWFnZS0+bnVtY29tcHMsIDIpOyAgICAgICAgICAgLyogTmNiZCAqLworICAgICAgICBsX2N1cnJlbnRfZGF0YSs9MjsKKworICAgICAgICBsX2NvbXAgPSBsX2ltYWdlLT5jb21wczsKKworICAgICAgICBmb3IgKGk9MDtpPGxfaW1hZ2UtPm51bWNvbXBzOysraSkgeworICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgKGxfY29tcC0+c2duZCA8PCA3KSB8IChsX2NvbXAtPnByZWMgLSAxKSwgMSk7ICAgICAgICAgICAvKiBDb21wb25lbnQgYml0IGRlcHRoICovCisgICAgICAgICAgICAgICAgKytsX2N1cnJlbnRfZGF0YTsKKworICAgICAgICAgICAgICAgICsrbF9jb21wOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLGxfY2JkX3NpemUscF9tYW5hZ2VyKSAhPSBsX2NiZF9zaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworLyoqCisgKiBSZWFkcyBhIENCRCBtYXJrZXIgKENvbXBvbmVudCBiaXQgZGVwdGggZGVmaW5pdGlvbikKKyAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9kYXRhICAgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBDQkQgYm94LgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KKyAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBDQkQgbWFya2VyLgorICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9jYmQgKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBsX25iX2NvbXAsbF9udW1fY29tcDsKKyAgICAgICAgT1BKX1VJTlQzMiBsX2NvbXBfZGVmOworICAgICAgICBPUEpfVUlOVDMyIGk7CisgICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2NvbXAgPSAwMDsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisKKyAgICAgICAgbF9udW1fY29tcCA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOworCisgICAgICAgIGlmIChwX2hlYWRlcl9zaXplICE9IChwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wcyArIDIpKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkNycm9yIHJlYWRpbmcgQ0JEIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfbmJfY29tcCwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5jYmQgKi8KKyAgICAgICAgcF9oZWFkZXJfZGF0YSs9MjsKKworICAgICAgICBpZiAobF9uYl9jb21wICE9IGxfbnVtX2NvbXApIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ3Jyb3IgcmVhZGluZyBDQkQgbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgbF9jb21wID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+Y29tcHM7CisgICAgICAgIGZvciAoaT0wO2k8bF9udW1fY29tcDsrK2kpIHsKKyAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX2NvbXBfZGVmLDEpOyAgICAgICAgICAgICAgICAgICAgLyogQ29tcG9uZW50IGJpdCBkZXB0aCAqLworICAgICAgICAgICAgICAgICsrcF9oZWFkZXJfZGF0YTsKKyAgICAgICAgbF9jb21wLT5zZ25kID0gKGxfY29tcF9kZWY+PjcpICYgMTsKKyAgICAgICAgICAgICAgICBsX2NvbXAtPnByZWMgPSAobF9jb21wX2RlZiYweDdmKSArIDE7CisgICAgICAgICAgICAgICAgKytsX2NvbXA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBKMksgLyBKUFQgZGVjb2RlciBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBvcGpfajJrX3NldHVwX2RlY29kZXIob3BqX2oya190ICpqMmssIG9wal9kcGFyYW1ldGVyc190ICpwYXJhbWV0ZXJzKQoreworICAgICAgICBpZihqMmsgJiYgcGFyYW1ldGVycykgeworICAgICAgICAgICAgICAgIGoyay0+bV9jcC5tX3NwZWNpZmljX3BhcmFtLm1fZGVjLm1fbGF5ZXIgPSBwYXJhbWV0ZXJzLT5jcF9sYXllcjsKKyAgICAgICAgICAgICAgICBqMmstPm1fY3AubV9zcGVjaWZpY19wYXJhbS5tX2RlYy5tX3JlZHVjZSA9IHBhcmFtZXRlcnMtPmNwX3JlZHVjZTsKKworI2lmZGVmIFVTRV9KUFdMCisgICAgICAgICAgICAgICAgajJrLT5tX2NwLmNvcnJlY3QgPSBwYXJhbWV0ZXJzLT5qcHdsX2NvcnJlY3Q7CisgICAgICAgICAgICAgICAgajJrLT5tX2NwLmV4cF9jb21wcyA9IHBhcmFtZXRlcnMtPmpwd2xfZXhwX2NvbXBzOworICAgICAgICAgICAgICAgIGoyay0+bV9jcC5tYXhfdGlsZXMgPSBwYXJhbWV0ZXJzLT5qcHdsX21heF90aWxlczsKKyNlbmRpZiAvKiBVU0VfSlBXTCAqLworICAgICAgICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBKMksgZW5jb2RlciBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK29wal9qMmtfdCogb3BqX2oya19jcmVhdGVfY29tcHJlc3Modm9pZCkKK3sKKyAgICAgICAgb3BqX2oya190ICpsX2oyayA9IChvcGpfajJrX3QqKSBvcGpfY2FsbG9jKDEsc2l6ZW9mKG9wal9qMmtfdCkpOworICAgICAgICBpZiAoIWxfajJrKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworCisgICAgICAgIGxfajJrLT5tX2lzX2RlY29kZXIgPSAwOworICAgICAgICBsX2oyay0+bV9jcC5tX2lzX2RlY29kZXIgPSAwOworCisgICAgICAgIGxfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX21hbGxvYyhPUEpfSjJLX0RFRkFVTFRfSEVBREVSX1NJWkUpOworICAgICAgICBpZiAoISBsX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhKSB7CisgICAgICAgICAgICAgICAgb3BqX2oya19kZXN0cm95KGxfajJrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGxfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IE9QSl9KMktfREVGQVVMVF9IRUFERVJfU0laRTsKKworICAgICAgICAvKiB2YWxpZGF0aW9uIGxpc3QgY3JlYXRpb24qLworICAgICAgICBsX2oyay0+bV92YWxpZGF0aW9uX2xpc3QgPSBvcGpfcHJvY2VkdXJlX2xpc3RfY3JlYXRlKCk7CisgICAgICAgIGlmICghIGxfajJrLT5tX3ZhbGlkYXRpb25fbGlzdCkgeworICAgICAgICAgICAgICAgIG9wal9qMmtfZGVzdHJveShsX2oyayk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICAvKiBleGVjdXRpb24gbGlzdCBjcmVhdGlvbiovCisgICAgICAgIGxfajJrLT5tX3Byb2NlZHVyZV9saXN0ID0gb3BqX3Byb2NlZHVyZV9saXN0X2NyZWF0ZSgpOworICAgICAgICBpZiAoISBsX2oyay0+bV9wcm9jZWR1cmVfbGlzdCkgeworICAgICAgICAgICAgICAgIG9wal9qMmtfZGVzdHJveShsX2oyayk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbF9qMms7Cit9CisKK3N0YXRpYyBpbnQgb3BqX2oya19pbml0aWFsaXNlXzRLX3BvYyhvcGpfcG9jX3QgKlBPQywgaW50IG51bXJlcyl7CisgICAgUE9DWzBdLnRpbGUgID0gMTsKKyAgICBQT0NbMF0ucmVzbm8wICA9IDA7CisgICAgUE9DWzBdLmNvbXBubzAgPSAwOworICAgIFBPQ1swXS5sYXlubzEgID0gMTsKKyAgICBQT0NbMF0ucmVzbm8xICA9IChPUEpfVUlOVDMyKShudW1yZXMtMSk7CisgICAgUE9DWzBdLmNvbXBubzEgPSAzOworICAgIFBPQ1swXS5wcmcxID0gT1BKX0NQUkw7CisgICAgUE9DWzFdLnRpbGUgID0gMTsKKyAgICBQT0NbMV0ucmVzbm8wICA9IChPUEpfVUlOVDMyKShudW1yZXMtMSk7CisgICAgUE9DWzFdLmNvbXBubzAgPSAwOworICAgIFBPQ1sxXS5sYXlubzEgID0gMTsKKyAgICBQT0NbMV0ucmVzbm8xICA9IChPUEpfVUlOVDMyKW51bXJlczsKKyAgICBQT0NbMV0uY29tcG5vMSA9IDM7CisgICAgUE9DWzFdLnByZzEgPSBPUEpfQ1BSTDsKKyAgICByZXR1cm4gMjsKK30KKworc3RhdGljIHZvaWQgb3BqX2oya19zZXRfY2luZW1hX3BhcmFtZXRlcnMob3BqX2NwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMsIG9wal9pbWFnZV90ICppbWFnZSwgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIpCit7CisgICAgLyogQ29uZmlndXJlIGNpbmVtYSBwYXJhbWV0ZXJzICovCisgICAgaW50IGk7CisKKyAgICAvKiBObyB0aWxpbmcgKi8KKyAgICBwYXJhbWV0ZXJzLT50aWxlX3NpemVfb24gPSBPUEpfRkFMU0U7CisgICAgcGFyYW1ldGVycy0+Y3BfdGR4PTE7CisgICAgcGFyYW1ldGVycy0+Y3BfdGR5PTE7CisKKyAgICAvKiBPbmUgdGlsZSBwYXJ0IGZvciBlYWNoIGNvbXBvbmVudCAqLworICAgIHBhcmFtZXRlcnMtPnRwX2ZsYWcgPSAnQyc7CisgICAgcGFyYW1ldGVycy0+dHBfb24gPSAxOworCisgICAgLyogVGlsZSBhbmQgSW1hZ2Ugc2hhbGwgYmUgYXQgKDAsMCkgKi8KKyAgICBwYXJhbWV0ZXJzLT5jcF90eDAgPSAwOworICAgIHBhcmFtZXRlcnMtPmNwX3R5MCA9IDA7CisgICAgcGFyYW1ldGVycy0+aW1hZ2Vfb2Zmc2V0X3gwID0gMDsKKyAgICBwYXJhbWV0ZXJzLT5pbWFnZV9vZmZzZXRfeTAgPSAwOworCisgICAgLyogQ29kZWJsb2NrIHNpemU9IDMyKjMyICovCisgICAgcGFyYW1ldGVycy0+Y2Jsb2Nrd19pbml0ID0gMzI7CisgICAgcGFyYW1ldGVycy0+Y2Jsb2NraF9pbml0ID0gMzI7CisKKyAgICAvKiBDb2RlYmxvY2sgc3R5bGU6IG5vIG1vZGUgc3dpdGNoIGVuYWJsZWQgKi8KKyAgICBwYXJhbWV0ZXJzLT5tb2RlID0gMDsKKworICAgIC8qIE5vIFJPSSAqLworICAgIHBhcmFtZXRlcnMtPnJvaV9jb21wbm8gPSAtMTsKKworICAgIC8qIE5vIHN1YnNhbXBsaW5nICovCisgICAgcGFyYW1ldGVycy0+c3Vic2FtcGxpbmdfZHggPSAxOworICAgIHBhcmFtZXRlcnMtPnN1YnNhbXBsaW5nX2R5ID0gMTsKKworICAgIC8qIDktNyB0cmFuc2Zvcm0gKi8KKyAgICBwYXJhbWV0ZXJzLT5pcnJldmVyc2libGUgPSAxOworCisgICAgLyogTnVtYmVyIG9mIGxheWVycyAqLworICAgIGlmIChwYXJhbWV0ZXJzLT50Y3BfbnVtbGF5ZXJzID4gMSl7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAiSlBFRyAyMDAwIFByb2ZpbGUtMyBhbmQgNCAoMmsvNGsgZGMgcHJvZmlsZSkgcmVxdWlyZXM6XG4iCisgICAgICAgICAgICAgICAgIjEgc2luZ2xlIHF1YWxpdHkgbGF5ZXIiCisgICAgICAgICAgICAgICAgIi0+IE51bWJlciBvZiBsYXllcnMgZm9yY2VkIHRvIDEgKHJhdGhlciB0aGFuICVkKVxuIgorICAgICAgICAgICAgICAgICItPiBSYXRlIG9mIHRoZSBsYXN0IGxheWVyICglMy4xZikgd2lsbCBiZSB1c2VkIiwKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT50Y3BfbnVtbGF5ZXJzLCBwYXJhbWV0ZXJzLT50Y3BfcmF0ZXNbcGFyYW1ldGVycy0+dGNwX251bWxheWVycy0xXSk7CisgICAgICAgIHBhcmFtZXRlcnMtPnRjcF9yYXRlc1swXSA9IHBhcmFtZXRlcnMtPnRjcF9yYXRlc1twYXJhbWV0ZXJzLT50Y3BfbnVtbGF5ZXJzLTFdOworICAgICAgICBwYXJhbWV0ZXJzLT50Y3BfbnVtbGF5ZXJzID0gMTsKKyAgICB9CisKKyAgICAvKiBSZXNvbHV0aW9uIGxldmVscyAqLworICAgIHN3aXRjaCAocGFyYW1ldGVycy0+cnNpeil7CisgICAgY2FzZSBPUEpfUFJPRklMRV9DSU5FTUFfMks6CisgICAgICAgIGlmKHBhcmFtZXRlcnMtPm51bXJlc29sdXRpb24gPiA2KXsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkpQRUcgMjAwMCBQcm9maWxlLTMgKDJrIGRjIHByb2ZpbGUpIHJlcXVpcmVzOlxuIgorICAgICAgICAgICAgICAgICAgICAiTnVtYmVyIG9mIGRlY29tcG9zaXRpb24gbGV2ZWxzIDw9IDVcbiIKKyAgICAgICAgICAgICAgICAgICAgIi0+IE51bWJlciBvZiBkZWNvbXBvc2l0aW9uIGxldmVscyBmb3JjZWQgdG8gNSAocmF0aGVyIHRoYW4gJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uKzEpOworICAgICAgICAgICAgcGFyYW1ldGVycy0+bnVtcmVzb2x1dGlvbiA9IDY7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUEpfUFJPRklMRV9DSU5FTUFfNEs6CisgICAgICAgIGlmKHBhcmFtZXRlcnMtPm51bXJlc29sdXRpb24gPCAyKXsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkpQRUcgMjAwMCBQcm9maWxlLTQgKDRrIGRjIHByb2ZpbGUpIHJlcXVpcmVzOlxuIgorICAgICAgICAgICAgICAgICAgICAiTnVtYmVyIG9mIGRlY29tcG9zaXRpb24gbGV2ZWxzID49IDEgJiYgPD0gNlxuIgorICAgICAgICAgICAgICAgICAgICAiLT4gTnVtYmVyIG9mIGRlY29tcG9zaXRpb24gbGV2ZWxzIGZvcmNlZCB0byAxIChyYXRoZXIgdGhhbiAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMtPm51bXJlc29sdXRpb24rMSk7CisgICAgICAgICAgICBwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uID0gMTsKKyAgICAgICAgfWVsc2UgaWYocGFyYW1ldGVycy0+bnVtcmVzb2x1dGlvbiA+IDcpeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiSlBFRyAyMDAwIFByb2ZpbGUtNCAoNGsgZGMgcHJvZmlsZSkgcmVxdWlyZXM6XG4iCisgICAgICAgICAgICAgICAgICAgICJOdW1iZXIgb2YgZGVjb21wb3NpdGlvbiBsZXZlbHMgPj0gMSAmJiA8PSA2XG4iCisgICAgICAgICAgICAgICAgICAgICItPiBOdW1iZXIgb2YgZGVjb21wb3NpdGlvbiBsZXZlbHMgZm9yY2VkIHRvIDYgKHJhdGhlciB0aGFuICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+bnVtcmVzb2x1dGlvbisxKTsKKyAgICAgICAgICAgIHBhcmFtZXRlcnMtPm51bXJlc29sdXRpb24gPSA3OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQgOgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBQcmVjaW5jdHMgKi8KKyAgICBwYXJhbWV0ZXJzLT5jc3R5IHw9IDB4MDE7CisgICAgcGFyYW1ldGVycy0+cmVzX3NwZWMgPSBwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uLTE7CisgICAgZm9yIChpID0gMDsgaTxwYXJhbWV0ZXJzLT5yZXNfc3BlYzsgaSsrKSB7CisgICAgICAgIHBhcmFtZXRlcnMtPnByY3dfaW5pdFtpXSA9IDI1NjsKKyAgICAgICAgcGFyYW1ldGVycy0+cHJjaF9pbml0W2ldID0gMjU2OworICAgIH0KKworICAgIC8qIFRoZSBwcm9ncmVzc2lvbiBvcmRlciBzaGFsbCBiZSBDUFJMICovCisgICAgcGFyYW1ldGVycy0+cHJvZ19vcmRlciA9IE9QSl9DUFJMOworCisgICAgLyogUHJvZ3Jlc3Npb24gb3JkZXIgY2hhbmdlcyBmb3IgNEssIGRpc2FsbG93ZWQgZm9yIDJLICovCisgICAgaWYgKHBhcmFtZXRlcnMtPnJzaXogPT0gT1BKX1BST0ZJTEVfQ0lORU1BXzRLKSB7CisgICAgICAgIHBhcmFtZXRlcnMtPm51bXBvY3MgPSAoT1BKX1VJTlQzMilvcGpfajJrX2luaXRpYWxpc2VfNEtfcG9jKHBhcmFtZXRlcnMtPlBPQyxwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwYXJhbWV0ZXJzLT5udW1wb2NzID0gMDsKKyAgICB9CisKKyAgICAvKiBMaW1pdGVkIGJpdC1yYXRlICovCisgICAgcGFyYW1ldGVycy0+Y3BfZGlzdG9fYWxsb2MgPSAxOworICAgIGlmIChwYXJhbWV0ZXJzLT5tYXhfY3Nfc2l6ZSA8PSAwKSB7CisgICAgICAgIC8qIE5vIHJhdGUgaGFzIGJlZW4gaW50cm9kdWNlZCwgMjQgZnBzIGlzIGFzc3VtZWQgKi8KKyAgICAgICAgcGFyYW1ldGVycy0+bWF4X2NzX3NpemUgPSBPUEpfQ0lORU1BXzI0X0NTOworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgIkpQRUcgMjAwMCBQcm9maWxlLTMgYW5kIDQgKDJrLzRrIGRjIHByb2ZpbGUpIHJlcXVpcmVzOlxuIgorICAgICAgICAgICAgICAgICAgICAgICJNYXhpbXVtIDEzMDIwODMgY29tcHJlc3NlZCBieXRlcyBAIDI0ZnBzXG4iCisgICAgICAgICAgICAgICAgICAgICAgIkFzIG5vIHJhdGUgaGFzIGJlZW4gZ2l2ZW4sIHRoaXMgbGltaXQgd2lsbCBiZSB1c2VkLlxuIik7CisgICAgfSBlbHNlIGlmIChwYXJhbWV0ZXJzLT5tYXhfY3Nfc2l6ZSA+IE9QSl9DSU5FTUFfMjRfQ1MpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICJKUEVHIDIwMDAgUHJvZmlsZS0zIGFuZCA0ICgyay80ayBkYyBwcm9maWxlKSByZXF1aXJlczpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiTWF4aW11bSAxMzAyMDgzIGNvbXByZXNzZWQgYnl0ZXMgQCAyNGZwc1xuIgorICAgICAgICAgICAgICAgICAgICAgICItPiBTcGVjaWZpZWQgcmF0ZSBleGNlZWRzIHRoaXMgbGltaXQuIFJhdGUgd2lsbCBiZSBmb3JjZWQgdG8gMTMwMjA4MyBieXRlcy5cbiIpOworICAgICAgICBwYXJhbWV0ZXJzLT5tYXhfY3Nfc2l6ZSA9IE9QSl9DSU5FTUFfMjRfQ1M7CisgICAgfQorCisgICAgaWYgKHBhcmFtZXRlcnMtPm1heF9jb21wX3NpemUgPD0gMCkgeworICAgICAgICAvKiBObyByYXRlIGhhcyBiZWVuIGludHJvZHVjZWQsIDI0IGZwcyBpcyBhc3N1bWVkICovCisgICAgICAgIHBhcmFtZXRlcnMtPm1heF9jb21wX3NpemUgPSBPUEpfQ0lORU1BXzI0X0NPTVA7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAiSlBFRyAyMDAwIFByb2ZpbGUtMyBhbmQgNCAoMmsvNGsgZGMgcHJvZmlsZSkgcmVxdWlyZXM6XG4iCisgICAgICAgICAgICAgICAgICAgICAgIk1heGltdW0gMTA0MTY2NiBjb21wcmVzc2VkIGJ5dGVzIEAgMjRmcHNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiQXMgbm8gcmF0ZSBoYXMgYmVlbiBnaXZlbiwgdGhpcyBsaW1pdCB3aWxsIGJlIHVzZWQuXG4iKTsKKyAgICB9IGVsc2UgaWYgKHBhcmFtZXRlcnMtPm1heF9jb21wX3NpemUgPiBPUEpfQ0lORU1BXzI0X0NPTVApIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICJKUEVHIDIwMDAgUHJvZmlsZS0zIGFuZCA0ICgyay80ayBkYyBwcm9maWxlKSByZXF1aXJlczpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiTWF4aW11bSAxMDQxNjY2IGNvbXByZXNzZWQgYnl0ZXMgQCAyNGZwc1xuIgorICAgICAgICAgICAgICAgICAgICAgICItPiBTcGVjaWZpZWQgcmF0ZSBleGNlZWRzIHRoaXMgbGltaXQuIFJhdGUgd2lsbCBiZSBmb3JjZWQgdG8gMTA0MTY2NiBieXRlcy5cbiIpOworICAgICAgICBwYXJhbWV0ZXJzLT5tYXhfY29tcF9zaXplID0gT1BKX0NJTkVNQV8yNF9DT01QOworICAgIH0KKworICAgIHBhcmFtZXRlcnMtPnRjcF9yYXRlc1swXSA9IChPUEpfRkxPQVQzMikgKGltYWdlLT5udW1jb21wcyAqIGltYWdlLT5jb21wc1swXS53ICogaW1hZ2UtPmNvbXBzWzBdLmggKiBpbWFnZS0+Y29tcHNbMF0ucHJlYykvCisgICAgICAgICAgICAoT1BKX0ZMT0FUMzIpKCgoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT5tYXhfY3Nfc2l6ZSkgKiA4ICogaW1hZ2UtPmNvbXBzWzBdLmR4ICogaW1hZ2UtPmNvbXBzWzBdLmR5KTsKKworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19pc19jaW5lbWFfY29tcGxpYW50KG9wal9pbWFnZV90ICppbWFnZSwgT1BKX1VJTlQxNiByc2l6LCBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcikKK3sKKyAgICBPUEpfVUlOVDMyIGk7CisKKyAgICAvKiBOdW1iZXIgb2YgY29tcG9uZW50cyAqLworICAgIGlmIChpbWFnZS0+bnVtY29tcHMgIT0gMyl7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAiSlBFRyAyMDAwIFByb2ZpbGUtMyAoMmsgZGMgcHJvZmlsZSkgcmVxdWlyZXM6XG4iCisgICAgICAgICAgICAgICAgIjMgY29tcG9uZW50cyIKKyAgICAgICAgICAgICAgICAiLT4gTnVtYmVyIG9mIGNvbXBvbmVudHMgb2YgaW5wdXQgaW1hZ2UgKCVkKSBpcyBub3QgY29tcGxpYW50XG4iCisgICAgICAgICAgICAgICAgIi0+IE5vbi1wcm9maWxlLTMgY29kZXN0cmVhbSB3aWxsIGJlIGdlbmVyYXRlZFxuIiwKKyAgICAgICAgICAgICAgICBpbWFnZS0+bnVtY29tcHMpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIC8qIEJpdGRlcHRoICovCisgICAgZm9yIChpID0gMDsgaSA8IGltYWdlLT5udW1jb21wczsgaSsrKSB7CisgICAgICAgIGlmICgoaW1hZ2UtPmNvbXBzW2ldLmJwcCAhPSAxMikgfCAoaW1hZ2UtPmNvbXBzW2ldLnNnbmQpKXsKKyAgICAgICAgICAgIGNoYXIgc2lnbmVkX3N0cltdID0gInNpZ25lZCI7CisgICAgICAgICAgICBjaGFyIHVuc2lnbmVkX3N0cltdID0gInVuc2lnbmVkIjsKKyAgICAgICAgICAgIGNoYXIgKnRtcF9zdHIgPSBpbWFnZS0+Y29tcHNbaV0uc2duZD9zaWduZWRfc3RyOnVuc2lnbmVkX3N0cjsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkpQRUcgMjAwMCBQcm9maWxlLTMgKDJrIGRjIHByb2ZpbGUpIHJlcXVpcmVzOlxuIgorICAgICAgICAgICAgICAgICAgICAiUHJlY2lzaW9uIG9mIGVhY2ggY29tcG9uZW50IHNoYWxsIGJlIDEyIGJpdHMgdW5zaWduZWQiCisgICAgICAgICAgICAgICAgICAgICItPiBBdCBsZWFzdCBjb21wb25lbnQgJWQgb2YgaW5wdXQgaW1hZ2UgKCVkIGJpdHMsICVzKSBpcyBub3QgY29tcGxpYW50XG4iCisgICAgICAgICAgICAgICAgICAgICItPiBOb24tcHJvZmlsZS0zIGNvZGVzdHJlYW0gd2lsbCBiZSBnZW5lcmF0ZWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGksaW1hZ2UtPmNvbXBzW2ldLmJwcCwgdG1wX3N0cik7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSW1hZ2Ugc2l6ZSAqLworICAgIHN3aXRjaCAocnNpeil7CisgICAgY2FzZSBPUEpfUFJPRklMRV9DSU5FTUFfMks6CisgICAgICAgIGlmICgoKGltYWdlLT5jb21wc1swXS53ID4gMjA0OCkgfCAoaW1hZ2UtPmNvbXBzWzBdLmggPiAxMDgwKSkpeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiSlBFRyAyMDAwIFByb2ZpbGUtMyAoMmsgZGMgcHJvZmlsZSkgcmVxdWlyZXM6XG4iCisgICAgICAgICAgICAgICAgICAgICJ3aWR0aCA8PSAyMDQ4IGFuZCBoZWlnaHQgPD0gMTA4MFxuIgorICAgICAgICAgICAgICAgICAgICAiLT4gSW5wdXQgaW1hZ2Ugc2l6ZSAlZCB4ICVkIGlzIG5vdCBjb21wbGlhbnRcbiIKKyAgICAgICAgICAgICAgICAgICAgIi0+IE5vbi1wcm9maWxlLTMgY29kZXN0cmVhbSB3aWxsIGJlIGdlbmVyYXRlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPmNvbXBzWzBdLncsaW1hZ2UtPmNvbXBzWzBdLmgpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QSl9QUk9GSUxFX0NJTkVNQV80SzoKKyAgICAgICAgaWYgKCgoaW1hZ2UtPmNvbXBzWzBdLncgPiA0MDk2KSB8IChpbWFnZS0+Y29tcHNbMF0uaCA+IDIxNjApKSl7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICJKUEVHIDIwMDAgUHJvZmlsZS00ICg0ayBkYyBwcm9maWxlKSByZXF1aXJlczpcbiIKKyAgICAgICAgICAgICAgICAgICAgIndpZHRoIDw9IDQwOTYgYW5kIGhlaWdodCA8PSAyMTYwXG4iCisgICAgICAgICAgICAgICAgICAgICItPiBJbWFnZSBzaXplICVkIHggJWQgaXMgbm90IGNvbXBsaWFudFxuIgorICAgICAgICAgICAgICAgICAgICAiLT4gTm9uLXByb2ZpbGUtNCBjb2Rlc3RyZWFtIHdpbGwgYmUgZ2VuZXJhdGVkXG4iLAorICAgICAgICAgICAgICAgICAgICBpbWFnZS0+Y29tcHNbMF0udyxpbWFnZS0+Y29tcHNbMF0uaCk7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQgOgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK09QSl9CT09MIG9wal9qMmtfc2V0dXBfZW5jb2RlciggICAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKmltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBpLCBqLCB0aWxlbm8sIG51bXBvY3NfdGlsZTsKKyAgICAgICAgb3BqX2NwX3QgKmNwID0gMDA7CisKKyAgICAgICAgaWYoIXBfajJrIHx8ICFwYXJhbWV0ZXJzIHx8ICEgaW1hZ2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uIDw9IDApIHx8IChwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uID4gT1BKX0oyS19NQVhSTFZMUykpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJJbnZhbGlkIG51bWJlciBvZiByZXNvbHV0aW9ucyA6ICVkIG5vdCBpbiByYW5nZSBbMSwlZF1cbiIsIHBhcmFtZXRlcnMtPm51bXJlc29sdXRpb24sIE9QSl9KMktfTUFYUkxWTFMpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGtlZXAgYSBsaW5rIHRvIGNwIHNvIHRoYXQgd2UgY2FuIGRlc3Ryb3kgaXQgbGF0ZXIgaW4gajJrX2Rlc3Ryb3lfY29tcHJlc3MgKi8KKyAgICAgICAgY3AgPSAmKHBfajJrLT5tX2NwKTsKKworICAgICAgICAvKiBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIGNwICovCisgICAgICAgIGNwLT50dyA9IDE7CisgICAgICAgIGNwLT50aCA9IDE7CisKKyAgICAgICAgLyogRklYTUUgQURFOiB0byBiZSByZW1vdmVkIG9uY2UgZGVwcmVjYXRlZCBjcF9jaW5lbWEgYW5kIGNwX3JzaXogaGF2ZSBiZWVuIHJlbW92ZWQgKi8KKyAgICAgICAgaWYgKHBhcmFtZXRlcnMtPnJzaXogPT0gT1BKX1BST0ZJTEVfTk9ORSkgeyAvKiBjb25zaWRlciBkZXByZWNhdGVkIGZpZWxkcyBvbmx5IGlmIFJTSVogaGFzIG5vdCBiZWVuIHNldCAqLworICAgICAgICAgICAgT1BKX0JPT0wgZGVwcmVjYXRlZF91c2VkID0gT1BKX0ZBTFNFOworICAgICAgICAgICAgc3dpdGNoIChwYXJhbWV0ZXJzLT5jcF9jaW5lbWEpeworICAgICAgICAgICAgY2FzZSBPUEpfQ0lORU1BMktfMjQ6CisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+cnNpeiA9IE9QSl9QUk9GSUxFX0NJTkVNQV8ySzsKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5tYXhfY3Nfc2l6ZSA9IE9QSl9DSU5FTUFfMjRfQ1M7CisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+bWF4X2NvbXBfc2l6ZSA9IE9QSl9DSU5FTUFfMjRfQ09NUDsKKyAgICAgICAgICAgICAgICBkZXByZWNhdGVkX3VzZWQgPSBPUEpfVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BKX0NJTkVNQTJLXzQ4OgorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMtPnJzaXogPSBPUEpfUFJPRklMRV9DSU5FTUFfMks7CisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+bWF4X2NzX3NpemUgPSBPUEpfQ0lORU1BXzQ4X0NTOworICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMtPm1heF9jb21wX3NpemUgPSBPUEpfQ0lORU1BXzQ4X0NPTVA7CisgICAgICAgICAgICAgICAgZGVwcmVjYXRlZF91c2VkID0gT1BKX1RSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QSl9DSU5FTUE0S18yNDoKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5yc2l6ID0gT1BKX1BST0ZJTEVfQ0lORU1BXzRLOworICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMtPm1heF9jc19zaXplID0gT1BKX0NJTkVNQV8yNF9DUzsKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5tYXhfY29tcF9zaXplID0gT1BKX0NJTkVNQV8yNF9DT01QOworICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWRfdXNlZCA9IE9QSl9UUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUEpfT0ZGOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAocGFyYW1ldGVycy0+Y3BfcnNpeil7CisgICAgICAgICAgICBjYXNlIE9QSl9DSU5FTUEySzoKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5yc2l6ID0gT1BKX1BST0ZJTEVfQ0lORU1BXzJLOworICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWRfdXNlZCA9IE9QSl9UUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUEpfQ0lORU1BNEs6CisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+cnNpeiA9IE9QSl9QUk9GSUxFX0NJTkVNQV80SzsKKyAgICAgICAgICAgICAgICBkZXByZWNhdGVkX3VzZWQgPSBPUEpfVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BKX01DVDoKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5yc2l6ID0gT1BKX1BST0ZJTEVfUEFSVDIgfCBPUEpfRVhURU5TSU9OX01DVDsKKyAgICAgICAgICAgICAgICBkZXByZWNhdGVkX3VzZWQgPSBPUEpfVFJVRTsKKyAgICAgICAgICAgIGNhc2UgT1BKX1NURF9SU0laOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkZXByZWNhdGVkX3VzZWQpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAiRGVwcmVjYXRlZCBmaWVsZHMgY3BfY2luZW1hIG9yIGNwX3JzaXogYXJlIHVzZWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJQbGVhc2UgY29uc2lkZXIgdXNpbmcgb25seSB0aGUgcnNpeiBmaWVsZFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIlNlZSBvcGVuanBlZy5oIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlsc1xuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBzZWUgaWYgbWF4X2NvZGVzdHJlYW1fc2l6ZSBkb2VzIGxpbWl0IGlucHV0IHJhdGUgKi8KKyAgICAgICAgaWYgKHBhcmFtZXRlcnMtPm1heF9jc19zaXplIDw9IDApIHsKKyAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLT50Y3BfcmF0ZXNbcGFyYW1ldGVycy0+dGNwX251bWxheWVycy0xXSA+IDApIHsKKyAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiB0ZW1wX3NpemU7CisgICAgICAgICAgICAgICAgdGVtcF9zaXplID0oT1BKX0ZMT0FUMzIpKGltYWdlLT5udW1jb21wcyAqIGltYWdlLT5jb21wc1swXS53ICogaW1hZ2UtPmNvbXBzWzBdLmggKiBpbWFnZS0+Y29tcHNbMF0ucHJlYykvCisgICAgICAgICAgICAgICAgICAgICAgICAocGFyYW1ldGVycy0+dGNwX3JhdGVzW3BhcmFtZXRlcnMtPnRjcF9udW1sYXllcnMtMV0gKiA4ICogKE9QSl9GTE9BVDMyKWltYWdlLT5jb21wc1swXS5keCAqIChPUEpfRkxPQVQzMilpbWFnZS0+Y29tcHNbMF0uZHkpOworICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMtPm1heF9jc19zaXplID0gKGludCkgZmxvb3IodGVtcF9zaXplKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+bWF4X2NzX3NpemUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgT1BKX0ZMT0FUMzIgdGVtcF9yYXRlOworICAgICAgICAgICAgT1BKX0JPT0wgY2FwID0gT1BKX0ZBTFNFOworICAgICAgICAgICAgdGVtcF9yYXRlID0gKE9QSl9GTE9BVDMyKSAoaW1hZ2UtPm51bWNvbXBzICogaW1hZ2UtPmNvbXBzWzBdLncgKiBpbWFnZS0+Y29tcHNbMF0uaCAqIGltYWdlLT5jb21wc1swXS5wcmVjKS8KKyAgICAgICAgICAgICAgICAgICAgKE9QSl9GTE9BVDMyKSgoKE9QSl9VSU5UMzIpcGFyYW1ldGVycy0+bWF4X2NzX3NpemUpICogOCAqIGltYWdlLT5jb21wc1swXS5keCAqIGltYWdlLT5jb21wc1swXS5keSk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKE9QSl9VSU5UMzIpIHBhcmFtZXRlcnMtPnRjcF9udW1sYXllcnM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLT50Y3BfcmF0ZXNbaV0gPCB0ZW1wX3JhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+dGNwX3JhdGVzW2ldID0gdGVtcF9yYXRlOworICAgICAgICAgICAgICAgICAgICBjYXAgPSBPUEpfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FwKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBkZXNpcmVkIG1heGltdW0gY29kZXN0cmVhbSBzaXplIGhhcyBsaW1pdGVkXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiYXQgbGVhc3Qgb25lIG9mIHRoZSBkZXNpcmVkIHF1YWxpdHkgbGF5ZXJzXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIE1hbmFnZSBwcm9maWxlcyBhbmQgYXBwbGljYXRpb25zIGFuZCBzZXQgUlNJWiAqLworICAgICAgICAvKiBzZXQgY2luZW1hIHBhcmFtZXRlcnMgaWYgcmVxdWlyZWQgKi8KKyAgICAgICAgaWYgKE9QSl9JU19DSU5FTUEocGFyYW1ldGVycy0+cnNpeikpeworICAgICAgICAgICAgaWYgKChwYXJhbWV0ZXJzLT5yc2l6ID09IE9QSl9QUk9GSUxFX0NJTkVNQV9TMkspCisgICAgICAgICAgICAgICAgICAgIHx8IChwYXJhbWV0ZXJzLT5yc2l6ID09IE9QSl9QUk9GSUxFX0NJTkVNQV9TNEspKXsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAiSlBFRyAyMDAwIFNjYWxhYmxlIERpZ2l0YWwgQ2luZW1hIHByb2ZpbGVzIG5vdCB5ZXQgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5yc2l6ID0gT1BKX1BST0ZJTEVfTk9ORTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3BqX2oya19zZXRfY2luZW1hX3BhcmFtZXRlcnMocGFyYW1ldGVycyxpbWFnZSxwX21hbmFnZXIpOworICAgICAgICAgICAgICAgIGlmICghb3BqX2oya19pc19jaW5lbWFfY29tcGxpYW50KGltYWdlLHBhcmFtZXRlcnMtPnJzaXoscF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5yc2l6ID0gT1BKX1BST0ZJTEVfTk9ORTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoT1BKX0lTX1NUT1JBR0UocGFyYW1ldGVycy0+cnNpeikpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkpQRUcgMjAwMCBMb25nIFRlcm0gU3RvcmFnZSBwcm9maWxlIG5vdCB5ZXQgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgICAgIHBhcmFtZXRlcnMtPnJzaXogPSBPUEpfUFJPRklMRV9OT05FOworICAgICAgICB9IGVsc2UgaWYgKE9QSl9JU19CUk9BRENBU1QocGFyYW1ldGVycy0+cnNpeikpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIkpQRUcgMjAwMCBCcm9hZGNhc3QgcHJvZmlsZXMgbm90IHlldCBzdXBwb3J0ZWRcbiIpOworICAgICAgICAgICAgcGFyYW1ldGVycy0+cnNpeiA9IE9QSl9QUk9GSUxFX05PTkU7CisgICAgICAgIH0gZWxzZSBpZiAoT1BKX0lTX0lNRihwYXJhbWV0ZXJzLT5yc2l6KSkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiSlBFRyAyMDAwIElNRiBwcm9maWxlcyBub3QgeWV0IHN1cHBvcnRlZFxuIik7CisgICAgICAgICAgICBwYXJhbWV0ZXJzLT5yc2l6ID0gT1BKX1BST0ZJTEVfTk9ORTsKKyAgICAgICAgfSBlbHNlIGlmIChPUEpfSVNfUEFSVDIocGFyYW1ldGVycy0+cnNpeikpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLT5yc2l6ID09ICgoT1BKX1BST0ZJTEVfUEFSVDIpIHwgKE9QSl9FWFRFTlNJT05fTk9ORSkpKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpQRUcgMjAwMCBQYXJ0LTIgcHJvZmlsZSBkZWZpbmVkXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IG5vIFBhcnQtMiBleHRlbnNpb24gZW5hYmxlZC5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9maWxlIHNldCB0byBOT05FLlxuIik7CisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+cnNpeiA9IE9QSl9QUk9GSUxFX05PTkU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlcnMtPnJzaXogIT0gKChPUEpfUFJPRklMRV9QQVJUMikgfCAoT1BKX0VYVEVOU0lPTl9NQ1QpKSkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBQYXJ0LTIgZXh0ZW5zaW9uIGVuYWJsZWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9maWxlIHNldCB0byBOT05FLlxuIik7CisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+cnNpeiA9IE9QSl9QUk9GSUxFX05PTkU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICBjb3B5IHVzZXIgZW5jb2RpbmcgcGFyYW1ldGVycworICAgICAgICAqLworICAgICAgICBjcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX21heF9jb21wX3NpemUgPSAoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT5tYXhfY29tcF9zaXplOworICAgICAgICBjcC0+cnNpeiA9IHBhcmFtZXRlcnMtPnJzaXo7CisgICAgICAgIGNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fZGlzdG9fYWxsb2MgPSAoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT5jcF9kaXN0b19hbGxvYyAmIDF1OworICAgICAgICBjcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX2ZpeGVkX2FsbG9jID0gKE9QSl9VSU5UMzIpcGFyYW1ldGVycy0+Y3BfZml4ZWRfYWxsb2MgJiAxdTsKKyAgICAgICAgY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9maXhlZF9xdWFsaXR5ID0gKE9QSl9VSU5UMzIpcGFyYW1ldGVycy0+Y3BfZml4ZWRfcXVhbGl0eSAmIDF1OworCisgICAgICAgIC8qIG1vZCBmaXhlZF9xdWFsaXR5ICovCisgICAgICAgIGlmIChwYXJhbWV0ZXJzLT5jcF9maXhlZF9hbGxvYyAmJiBwYXJhbWV0ZXJzLT5jcF9tYXRyaWNlKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IGFycmF5X3NpemUgPSAoc2l6ZV90KXBhcmFtZXRlcnMtPnRjcF9udW1sYXllcnMgKiAoc2l6ZV90KXBhcmFtZXRlcnMtPm51bXJlc29sdXRpb24gKiAzICogc2l6ZW9mKE9QSl9JTlQzMik7CisgICAgICAgICAgICAgICAgY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9tYXRyaWNlID0gKE9QSl9JTlQzMiAqKSBvcGpfbWFsbG9jKGFycmF5X3NpemUpOworCQkJCQkJCQlpZiAoIWNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fbWF0cmljZSkgeworCQkJCQkJCQkgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBjb3B5IG9mIHVzZXIgZW5jb2RpbmcgcGFyYW1ldGVycyBtYXRyaXggXG4iKTsKKwkJCQkJCQkJICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworCQkJCQkJCQl9CisgICAgICAgICAgICAgICAgbWVtY3B5KGNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fbWF0cmljZSwgcGFyYW1ldGVycy0+Y3BfbWF0cmljZSwgYXJyYXlfc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICAvKiB0aWxlcyAqLworICAgICAgICBjcC0+dGR4ID0gKE9QSl9VSU5UMzIpcGFyYW1ldGVycy0+Y3BfdGR4OworICAgICAgICBjcC0+dGR5ID0gKE9QSl9VSU5UMzIpcGFyYW1ldGVycy0+Y3BfdGR5OworCisgICAgICAgIC8qIHRpbGUgb2Zmc2V0ICovCisgICAgICAgIGNwLT50eDAgPSAoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT5jcF90eDA7CisgICAgICAgIGNwLT50eTAgPSAoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT5jcF90eTA7CisKKyAgICAgICAgLyogY29tbWVudCBzdHJpbmcgKi8KKyAgICAgICAgaWYocGFyYW1ldGVycy0+Y3BfY29tbWVudCkgeworICAgICAgICAgICAgICAgIGNwLT5jb21tZW50ID0gKGNoYXIqKW9wal9tYWxsb2Moc3RybGVuKHBhcmFtZXRlcnMtPmNwX2NvbW1lbnQpICsgMVUpOworCQkJCQkJCQlpZighY3AtPmNvbW1lbnQpIHsKKwkJCQkJCQkJICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgY29weSBvZiBjb21tZW50IHN0cmluZ1xuIik7CisJCQkJCQkJCSAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKwkJCQkJCQkJfQorICAgICAgICAgICAgICAgIHN0cmNweShjcC0+Y29tbWVudCwgcGFyYW1ldGVycy0+Y3BfY29tbWVudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogQ3JlYXRlIGRlZmF1bHQgY29tbWVudCBmb3IgY29kZXN0cmVhbSAqLworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgY29tbWVudFtdID0gIkNyZWF0ZWQgYnkgT3BlbkpQRUcgdmVyc2lvbiAiOworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBjbGVuID0gc3RybGVuKGNvbW1lbnQpOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24gPSBvcGpfdmVyc2lvbigpOworCisgICAgICAgICAgICAgICAgLyogVW5pUEc+PiAqLworI2lmZGVmIFVTRV9KUFdMCisgICAgICAgICAgICAgICAgY3AtPmNvbW1lbnQgPSAoY2hhciopb3BqX21hbGxvYyhjbGVuK3N0cmxlbih2ZXJzaW9uKSsxMSk7CisJCQkJCQkJCWlmKCFjcC0+Y29tbWVudCkgeworCQkJCQkJCQkgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBjb21tZW50IHN0cmluZ1xuIik7CisJCQkJCQkJCSAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKwkJCQkJCQkJfQorICAgICAgICAgICAgICAgIHNwcmludGYoY3AtPmNvbW1lbnQsIiVzJXMgd2l0aCBKUFdMIiwgY29tbWVudCwgdmVyc2lvbik7CisjZWxzZQorICAgICAgICAgICAgICAgIGNwLT5jb21tZW50ID0gKGNoYXIqKW9wal9tYWxsb2MoY2xlbitzdHJsZW4odmVyc2lvbikrMSk7CisJCQkJCQkJCWlmKCFjcC0+Y29tbWVudCkgeworCQkJCQkJCQkgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBjb21tZW50IHN0cmluZ1xuIik7CisJCQkJCQkJCSAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKwkJCQkJCQkJfQorICAgICAgICAgICAgICAgIHNwcmludGYoY3AtPmNvbW1lbnQsIiVzJXMiLCBjb21tZW50LCB2ZXJzaW9uKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIC8qIDw8VW5pUEcgKi8KKwkJCQl9CisKKyAgICAgICAgLyoKKyAgICAgICAgY2FsY3VsYXRlIG90aGVyIGVuY29kaW5nIHBhcmFtZXRlcnMKKyAgICAgICAgKi8KKworICAgICAgICBpZiAocGFyYW1ldGVycy0+dGlsZV9zaXplX29uKSB7CisgICAgICAgICAgICAgICAgY3AtPnR3ID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpKGltYWdlLT54MSAtIGNwLT50eDApLCAoT1BKX0lOVDMyKWNwLT50ZHgpOworICAgICAgICAgICAgICAgIGNwLT50aCA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKShpbWFnZS0+eTEgLSBjcC0+dHkwKSwgKE9QSl9JTlQzMiljcC0+dGR5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjcC0+dGR4ID0gaW1hZ2UtPngxIC0gY3AtPnR4MDsKKyAgICAgICAgICAgICAgICBjcC0+dGR5ID0gaW1hZ2UtPnkxIC0gY3AtPnR5MDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYXJhbWV0ZXJzLT50cF9vbikgeworICAgICAgICAgICAgICAgIGNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fdHBfZmxhZyA9IChPUEpfQllURSlwYXJhbWV0ZXJzLT50cF9mbGFnOworICAgICAgICAgICAgICAgIGNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fdHBfb24gPSAxOworICAgICAgICB9CisKKyNpZmRlZiBVU0VfSlBXTAorICAgICAgICAvKgorICAgICAgICBjYWxjdWxhdGUgSlBXTCBlbmNvZGluZyBwYXJhbWV0ZXJzCisgICAgICAgICovCisKKyAgICAgICAgaWYgKHBhcmFtZXRlcnMtPmpwd2xfZXBjX29uKSB7CisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIGk7CisKKyAgICAgICAgICAgICAgICAvKiBzZXQgSlBXTCBvbiAqLworICAgICAgICAgICAgICAgIGNwLT5lcGNfb24gPSBPUEpfVFJVRTsKKyAgICAgICAgICAgICAgICBjcC0+aW5mb19vbiA9IE9QSl9GQUxTRTsgLyogbm8gaW5mb3JtYXRpdmUgdGVjaG5pcXVlICovCisKKyAgICAgICAgICAgICAgICAvKiBzZXQgRVBCIG9uICovCisgICAgICAgICAgICAgICAgaWYgKChwYXJhbWV0ZXJzLT5qcHdsX2hwcm90X01IID4gMCkgfHwgKHBhcmFtZXRlcnMtPmpwd2xfaHByb3RfVFBIWzBdID4gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwLT5lcGJfb24gPSBPUEpfVFJVRTsKKworICAgICAgICAgICAgICAgICAgICAgICAgY3AtPmhwcm90X01IID0gcGFyYW1ldGVycy0+anB3bF9ocHJvdF9NSDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBKUFdMX01BWF9OT19USUxFU1BFQ1M7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC0+aHByb3RfVFBIX3RpbGVub1tpXSA9IHBhcmFtZXRlcnMtPmpwd2xfaHByb3RfVFBIX3RpbGVub1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AtPmhwcm90X1RQSFtpXSA9IHBhcmFtZXRlcnMtPmpwd2xfaHByb3RfVFBIW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgdGlsZSBzcGVjcyBhcmUgbm90IHNwZWNpZmllZCwgY29weSBNSCBzcGVjcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNwLT5ocHJvdF9UUEhbMF0gPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AtPmhwcm90X1RQSF90aWxlbm9bMF0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC0+aHByb3RfVFBIWzBdID0gcGFyYW1ldGVycy0+anB3bF9ocHJvdF9NSDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBKUFdMX01BWF9OT19QQUNLU1BFQ1M7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC0+cHByb3RfdGlsZW5vW2ldID0gcGFyYW1ldGVycy0+anB3bF9wcHJvdF90aWxlbm9baV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLT5wcHJvdF9wYWNrbm9baV0gPSBwYXJhbWV0ZXJzLT5qcHdsX3Bwcm90X3BhY2tub1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AtPnBwcm90W2ldID0gcGFyYW1ldGVycy0+anB3bF9wcHJvdFtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBzZXQgRVNEIHdyaXRpbmcgKi8KKyAgICAgICAgICAgICAgICBpZiAoKHBhcmFtZXRlcnMtPmpwd2xfc2Vuc19zaXplID09IDEpIHx8IChwYXJhbWV0ZXJzLT5qcHdsX3NlbnNfc2l6ZSA9PSAyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY3AtPmVzZF9vbiA9IE9QSl9UUlVFOworCisgICAgICAgICAgICAgICAgICAgICAgICBjcC0+c2Vuc19zaXplID0gcGFyYW1ldGVycy0+anB3bF9zZW5zX3NpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBjcC0+c2Vuc19hZGRyID0gcGFyYW1ldGVycy0+anB3bF9zZW5zX2FkZHI7CisgICAgICAgICAgICAgICAgICAgICAgICBjcC0+c2Vuc19yYW5nZSA9IHBhcmFtZXRlcnMtPmpwd2xfc2Vuc19yYW5nZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgY3AtPnNlbnNfTUggPSBwYXJhbWV0ZXJzLT5qcHdsX3NlbnNfTUg7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgSlBXTF9NQVhfTk9fVElMRVNQRUNTOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AtPnNlbnNfVFBIX3RpbGVub1tpXSA9IHBhcmFtZXRlcnMtPmpwd2xfc2Vuc19UUEhfdGlsZW5vW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC0+c2Vuc19UUEhbaV0gPSBwYXJhbWV0ZXJzLT5qcHdsX3NlbnNfVFBIW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIGFsd2F5cyBzZXQgUkVEIHdyaXRpbmcgdG8gZmFsc2U6IHdlIGFyZSBhdCB0aGUgZW5jb2RlciAqLworICAgICAgICAgICAgICAgIGNwLT5yZWRfb24gPSBPUEpfRkFMU0U7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjcC0+ZXBjX29uID0gT1BKX0ZBTFNFOworICAgICAgICB9CisjZW5kaWYgLyogVVNFX0pQV0wgKi8KKworICAgICAgICAvKiBpbml0aWFsaXplIHRoZSBtdXRpcGxlIHRpbGVzICovCisgICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgICAgY3AtPnRjcHMgPSAob3BqX3RjcF90Kikgb3BqX2NhbGxvYyhjcC0+dHcgKiBjcC0+dGgsIHNpemVvZihvcGpfdGNwX3QpKTsKKyAgICAgICAgaWYgKCFjcC0+dGNwcykgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSB0aWxlIGNvZGluZyBwYXJhbWV0ZXJzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJhbWV0ZXJzLT5udW1wb2NzKSB7CisgICAgICAgICAgICAgICAgLyogaW5pdGlhbGlzYXRpb24gb2YgUE9DICovCisgICAgICAgICAgICAgICAgb3BqX2oya19jaGVja19wb2NfdmFsKHBhcmFtZXRlcnMtPlBPQyxwYXJhbWV0ZXJzLT5udW1wb2NzLCAoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uLCBpbWFnZS0+bnVtY29tcHMsIChPUEpfVUlOVDMyKXBhcmFtZXRlcnMtPnRjcF9udW1sYXllcnMsIHBfbWFuYWdlcik7CisgICAgICAgICAgICAgICAgLyogVE9ETyBNU0QgdXNlIHRoZSByZXR1cm4gdmFsdWUqLworICAgICAgICB9CisKKyAgICAgICAgZm9yICh0aWxlbm8gPSAwOyB0aWxlbm8gPCBjcC0+dHcgKiBjcC0+dGg7IHRpbGVubysrKSB7CisgICAgICAgICAgICAgICAgb3BqX3RjcF90ICp0Y3AgPSAmY3AtPnRjcHNbdGlsZW5vXTsKKyAgICAgICAgICAgICAgICB0Y3AtPm51bWxheWVycyA9IChPUEpfVUlOVDMyKXBhcmFtZXRlcnMtPnRjcF9udW1sYXllcnM7CisKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdGNwLT5udW1sYXllcnM7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoT1BKX0lTX0NJTkVNQShjcC0+cnNpeikpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9maXhlZF9xdWFsaXR5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT5kaXN0b3JhdGlvW2pdID0gcGFyYW1ldGVycy0+dGNwX2Rpc3RvcmF0aW9bal07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT5yYXRlc1tqXSA9IHBhcmFtZXRlcnMtPnRjcF9yYXRlc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9maXhlZF9xdWFsaXR5KSB7ICAgICAgIC8qIGFkZCBmaXhlZF9xdWFsaXR5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT5kaXN0b3JhdGlvW2pdID0gcGFyYW1ldGVycy0+dGNwX2Rpc3RvcmF0aW9bal07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT5yYXRlc1tqXSA9IHBhcmFtZXRlcnMtPnRjcF9yYXRlc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRjcC0+Y3N0eSA9IChPUEpfVUlOVDMyKXBhcmFtZXRlcnMtPmNzdHk7CisgICAgICAgICAgICAgICAgdGNwLT5wcmcgPSBwYXJhbWV0ZXJzLT5wcm9nX29yZGVyOworICAgICAgICAgICAgICAgIHRjcC0+bWN0ID0gKE9QSl9VSU5UMzIpcGFyYW1ldGVycy0+dGNwX21jdDsKKworICAgICAgICAgICAgICAgIG51bXBvY3NfdGlsZSA9IDA7CisgICAgICAgICAgICAgICAgdGNwLT5QT0MgPSAwOworCisgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMtPm51bXBvY3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpc2F0aW9uIG9mIFBPQyAqLworICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT5QT0MgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcmFtZXRlcnMtPm51bXBvY3M7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGlsZW5vICsgMSA9PSBwYXJhbWV0ZXJzLT5QT0NbaV0udGlsZSApICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BvY190ICp0Y3BfcG9jID0gJnRjcC0+cG9jc1tudW1wb2NzX3RpbGVdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwX3BvYy0+cmVzbm8wICAgICAgICAgPSBwYXJhbWV0ZXJzLT5QT0NbbnVtcG9jc190aWxlXS5yZXNubzA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwX3BvYy0+Y29tcG5vMCAgICAgICAgPSBwYXJhbWV0ZXJzLT5QT0NbbnVtcG9jc190aWxlXS5jb21wbm8wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcF9wb2MtPmxheW5vMSAgICAgICAgID0gcGFyYW1ldGVycy0+UE9DW251bXBvY3NfdGlsZV0ubGF5bm8xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcF9wb2MtPnJlc25vMSAgICAgICAgID0gcGFyYW1ldGVycy0+UE9DW251bXBvY3NfdGlsZV0ucmVzbm8xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcF9wb2MtPmNvbXBubzEgICAgICAgID0gcGFyYW1ldGVycy0+UE9DW251bXBvY3NfdGlsZV0uY29tcG5vMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3BfcG9jLT5wcmcxICAgICAgICAgICA9IHBhcmFtZXRlcnMtPlBPQ1tudW1wb2NzX3RpbGVdLnByZzE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwX3BvYy0+dGlsZSAgICAgICAgICAgPSBwYXJhbWV0ZXJzLT5QT0NbbnVtcG9jc190aWxlXS50aWxlOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtcG9jc190aWxlKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT5udW1wb2NzID0gbnVtcG9jc190aWxlIC0xIDsKKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjcC0+bnVtcG9jcyA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGNwLT50Y2NwcyA9IChvcGpfdGNjcF90Kikgb3BqX2NhbGxvYyhpbWFnZS0+bnVtY29tcHMsIHNpemVvZihvcGpfdGNjcF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCF0Y3AtPnRjY3BzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgdGlsZSBjb21wb25lbnQgY29kaW5nIHBhcmFtZXRlcnNcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMtPm1jdF9kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbE1jdFNpemUgPSBpbWFnZS0+bnVtY29tcHMgKiBpbWFnZS0+bnVtY29tcHMgKiAoT1BKX1VJTlQzMilzaXplb2YoT1BKX0ZMT0FUMzIpOworICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiAqIGxUbXBCdWYgPSAoT1BKX0ZMT0FUMzIqKW9wal9tYWxsb2MobE1jdFNpemUpOworICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBsX2RjX3NoaWZ0ID0gKE9QSl9JTlQzMiAqKSAoKE9QSl9CWVRFICopIHBhcmFtZXRlcnMtPm1jdF9kYXRhICsgbE1jdFNpemUpOworCisJCQkJCQkJCQkJaWYgKCFsVG1wQnVmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHRlbXAgYnVmZmVyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdGNwLT5tY3QgPSAyOworICAgICAgICAgICAgICAgICAgICB0Y3AtPm1fbWN0X2NvZGluZ19tYXRyaXggPSAoT1BKX0ZMT0FUMzIqKW9wal9tYWxsb2MobE1jdFNpemUpOworCQkJCQkJCQkJCWlmICghIHRjcC0+bV9tY3RfY29kaW5nX21hdHJpeCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxUbXBCdWYpOworCQkJCQkJCQkJCQkJCQlsVG1wQnVmID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgZW5jb2RlciBNQ1QgY29kaW5nIG1hdHJpeCBcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHRjcC0+bV9tY3RfY29kaW5nX21hdHJpeCxwYXJhbWV0ZXJzLT5tY3RfZGF0YSxsTWN0U2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShsVG1wQnVmLHBhcmFtZXRlcnMtPm1jdF9kYXRhLGxNY3RTaXplKTsKKworICAgICAgICAgICAgICAgICAgICB0Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCA9IChPUEpfRkxPQVQzMiopb3BqX21hbGxvYyhsTWN0U2l6ZSk7CisJCQkJCQkJCQkJaWYgKCEgdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgpIHsKKwkJCQkJCQkJCQkJCQkJb3BqX2ZyZWUobFRtcEJ1Zik7CisJCQkJCQkJCQkJCQkJCWxUbXBCdWYgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBlbmNvZGVyIE1DVCBkZWNvZGluZyBtYXRyaXggXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKG9wal9tYXRyaXhfaW52ZXJzaW9uX2YobFRtcEJ1ZiwodGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgpLGltYWdlLT5udW1jb21wcykgPT0gT1BKX0ZBTFNFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobFRtcEJ1Zik7CisJCQkJCQkJCQkJCQkJCWxUbXBCdWYgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gaW52ZXJzZSBlbmNvZGVyIE1DVCBkZWNvZGluZyBtYXRyaXggXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworCQkJCQkJCQkJCX0KKworICAgICAgICAgICAgICAgICAgICB0Y3AtPm1jdF9ub3JtcyA9IChPUEpfRkxPQVQ2NCopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfbWFsbG9jKGltYWdlLT5udW1jb21wcyAqIHNpemVvZihPUEpfRkxPQVQ2NCkpOworCQkJCQkJCQkJCWlmICghIHRjcC0+bWN0X25vcm1zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobFRtcEJ1Zik7CisJCQkJCQkJCQkJCQkJCWxUbXBCdWYgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBlbmNvZGVyIE1DVCBub3JtcyBcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3BqX2NhbGN1bGF0ZV9ub3Jtcyh0Y3AtPm1jdF9ub3JtcyxpbWFnZS0+bnVtY29tcHMsdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgpOworICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsVG1wQnVmKTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW1hZ2UtPm51bWNvbXBzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNjcF90ICp0Y2NwID0gJnRjcC0+dGNjcHNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+bV9kY19sZXZlbF9zaGlmdCA9IGxfZGNfc2hpZnRbaV07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAob3BqX2oya19zZXR1cF9tY3RfZW5jb2RpbmcodGNwLGltYWdlKSA9PSBPUEpfRkFMU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZyZWUgd2lsbCBiZSBoYW5kbGVkIGJ5IG9wal9qMmtfZGVzdHJveSAqLworCQkJCQkJCQkJCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWxlZCB0byBzZXR1cCBqMmsgbWN0IGVuY29kaW5nXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmKHRjcC0+bWN0PT0xICYmIGltYWdlLT5udW1jb21wcyA+PSAzKSB7IC8qIFJHQi0+WUNDIE1DVCBpcyBlbmFibGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGltYWdlLT5jb21wc1swXS5keCAhPSBpbWFnZS0+Y29tcHNbMV0uZHgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbWFnZS0+Y29tcHNbMF0uZHggIT0gaW1hZ2UtPmNvbXBzWzJdLmR4KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW1hZ2UtPmNvbXBzWzBdLmR5ICE9IGltYWdlLT5jb21wc1sxXS5keSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGltYWdlLT5jb21wc1swXS5keSAhPSBpbWFnZS0+Y29tcHNbMl0uZHkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiQ2Fubm90IHBlcmZvcm0gTUNUIG9uIGNvbXBvbmVudHMgd2l0aCBkaWZmZXJlbnQgc2l6ZXMuIERpc2FibGluZyBNQ1QuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3AtPm1jdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbWFnZS0+bnVtY29tcHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNjcF90ICp0Y2NwID0gJnRjcC0+dGNjcHNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2NvbXAgPSAmKGltYWdlLT5jb21wc1tpXSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbF9jb21wLT5zZ25kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+bV9kY19sZXZlbF9zaGlmdCA9IDEgPDwgKGxfY29tcC0+cHJlYyAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGltYWdlLT5udW1jb21wczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNjcF90ICp0Y2NwID0gJnRjcC0+dGNjcHNbaV07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPmNzdHkgPSBwYXJhbWV0ZXJzLT5jc3R5ICYgMHgwMTsgICAvKiAwID0+IG9uZSBwcmVjaW5jdCB8fCAxID0+IGN1c3RvbSBwcmVjaW5jdCAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPm51bXJlc29sdXRpb25zID0gKE9QSl9VSU5UMzIpcGFyYW1ldGVycy0+bnVtcmVzb2x1dGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPmNibGt3ID0gKE9QSl9VSU5UMzIpb3BqX2ludF9mbG9vcmxvZzIocGFyYW1ldGVycy0+Y2Jsb2Nrd19pbml0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPmNibGtoID0gKE9QSl9VSU5UMzIpb3BqX2ludF9mbG9vcmxvZzIocGFyYW1ldGVycy0+Y2Jsb2NraF9pbml0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPmNibGtzdHkgPSAoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT5tb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cW1mYmlkID0gcGFyYW1ldGVycy0+aXJyZXZlcnNpYmxlID8gMCA6IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2NwLT5xbnRzdHkgPSBwYXJhbWV0ZXJzLT5pcnJldmVyc2libGUgPyBKMktfQ0NQX1FOVFNUWV9TRVFOVCA6IEoyS19DQ1BfUU5UU1RZX05PUU5UOworICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+bnVtZ2JpdHMgPSAyOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKE9QSl9JTlQzMilpID09IHBhcmFtZXRlcnMtPnJvaV9jb21wbm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cm9pc2hpZnQgPSBwYXJhbWV0ZXJzLT5yb2lfc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2NwLT5yb2lzaGlmdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMtPmNzdHkgJiBKMktfQ0NQX0NTVFlfUFJUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHAgPSAwLCBpdF9yZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCB0Y2NwLT5udW1yZXNvbHV0aW9ucyA+IDAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGl0X3JlcyA9IChPUEpfSU5UMzIpdGNjcC0+bnVtcmVzb2x1dGlvbnMgLSAxOyBpdF9yZXMgPj0gMDsgaXRfcmVzLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwIDwgcGFyYW1ldGVycy0+cmVzX3NwZWMpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVycy0+cHJjd19pbml0W3BdIDwgMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPnByY3dbaXRfcmVzXSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cHJjd1tpdF9yZXNdID0gKE9QSl9VSU5UMzIpb3BqX2ludF9mbG9vcmxvZzIocGFyYW1ldGVycy0+cHJjd19pbml0W3BdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLT5wcmNoX2luaXRbcF0gPCAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cHJjaFtpdF9yZXNdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPnByY2hbaXRfcmVzXSA9IChPUEpfVUlOVDMyKW9wal9pbnRfZmxvb3Jsb2cyKHBhcmFtZXRlcnMtPnByY2hfaW5pdFtwXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHJlc19zcGVjID0gcGFyYW1ldGVycy0+cmVzX3NwZWM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBzaXplX3ByY3cgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgc2l6ZV9wcmNoID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmVzX3NwZWM+MCk7IC8qIGlzc3VlIDE4OSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3ByY3cgPSBwYXJhbWV0ZXJzLT5wcmN3X2luaXRbcmVzX3NwZWMgLSAxXSA+PiAocCAtIChyZXNfc3BlYyAtIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9wcmNoID0gcGFyYW1ldGVycy0+cHJjaF9pbml0W3Jlc19zcGVjIC0gMV0gPj4gKHAgLSAocmVzX3NwZWMgLSAxKSk7CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZV9wcmN3IDwgMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPnByY3dbaXRfcmVzXSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cHJjd1tpdF9yZXNdID0gKE9QSl9VSU5UMzIpb3BqX2ludF9mbG9vcmxvZzIoc2l6ZV9wcmN3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplX3ByY2ggPCAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cHJjaFtpdF9yZXNdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2NwLT5wcmNoW2l0X3Jlc10gPSAoT1BKX1VJTlQzMilvcGpfaW50X2Zsb29ybG9nMihzaXplX3ByY2gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnByaW50ZigiXG5zaXplIHByZWNpbmN0IGZvciBsZXZlbCAlZCA6ICVkLCVkXG4iLCBpdF9yZXMsdGNjcC0+cHJjd1tpdF9yZXNdLCB0Y2NwLT5wcmNoW2l0X3Jlc10pOyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgLyplbmQgZm9yKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdGNjcC0+bnVtcmVzb2x1dGlvbnM7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cHJjd1tqXSA9IDE1OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cHJjaFtqXSA9IDE1OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZHd0X2NhbGNfZXhwbGljaXRfc3RlcHNpemVzKHRjY3AsIGltYWdlLT5jb21wc1tpXS5wcmVjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFyYW1ldGVycy0+bWN0X2RhdGEpIHsKKyAgICAgICAgICAgICAgICBvcGpfZnJlZShwYXJhbWV0ZXJzLT5tY3RfZGF0YSk7CisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+bWN0X2RhdGEgPSAwMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2FkZF9taG1hcmtlcihvcGpfY29kZXN0cmVhbV9pbmRleF90ICpjc3RyX2luZGV4LCBPUEpfVUlOVDMyIHR5cGUsIE9QSl9PRkZfVCBwb3MsIE9QSl9VSU5UMzIgbGVuKQoreworICAgICAgICBhc3NlcnQoY3N0cl9pbmRleCAhPSAwMCk7CisKKyAgICAgICAgLyogZXhwYW5kIHRoZSBsaXN0PyAqLworICAgICAgICBpZiAoKGNzdHJfaW5kZXgtPm1hcmtudW0gKyAxKSA+IGNzdHJfaW5kZXgtPm1heG1hcmtudW0pIHsKKyAgICAgICAgICAgICAgICBvcGpfbWFya2VyX2luZm9fdCAqbmV3X21hcmtlcjsKKyAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT5tYXhtYXJrbnVtID0gKE9QSl9VSU5UMzIpKDEwMCArIChPUEpfRkxPQVQzMikgY3N0cl9pbmRleC0+bWF4bWFya251bSk7CisgICAgICAgICAgICAgICAgbmV3X21hcmtlciA9IChvcGpfbWFya2VyX2luZm9fdCAqKSBvcGpfcmVhbGxvYyhjc3RyX2luZGV4LT5tYXJrZXIsIGNzdHJfaW5kZXgtPm1heG1hcmtudW0gKnNpemVvZihvcGpfbWFya2VyX2luZm9fdCkpOworICAgICAgICAgICAgICAgIGlmICghIG5ld19tYXJrZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGNzdHJfaW5kZXgtPm1hcmtlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT5tYXJrZXIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+bWF4bWFya251bSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT5tYXJrbnVtID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhZGQgbWggbWFya2VyXG4iKTsgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNzdHJfaW5kZXgtPm1hcmtlciA9IG5ld19tYXJrZXI7CisgICAgICAgIH0KKworICAgICAgICAvKiBhZGQgdGhlIG1hcmtlciAqLworICAgICAgICBjc3RyX2luZGV4LT5tYXJrZXJbY3N0cl9pbmRleC0+bWFya251bV0udHlwZSA9IChPUEpfVUlOVDE2KXR5cGU7CisgICAgICAgIGNzdHJfaW5kZXgtPm1hcmtlcltjc3RyX2luZGV4LT5tYXJrbnVtXS5wb3MgPSAoT1BKX0lOVDMyKXBvczsKKyAgICAgICAgY3N0cl9pbmRleC0+bWFya2VyW2NzdHJfaW5kZXgtPm1hcmtudW1dLmxlbiA9IChPUEpfSU5UMzIpbGVuOworICAgICAgICBjc3RyX2luZGV4LT5tYXJrbnVtKys7CisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfYWRkX3RsbWFya2VyKE9QSl9VSU5UMzIgdGlsZW5vLCBvcGpfY29kZXN0cmVhbV9pbmRleF90ICpjc3RyX2luZGV4LCBPUEpfVUlOVDMyIHR5cGUsIE9QSl9PRkZfVCBwb3MsIE9QSl9VSU5UMzIgbGVuKQoreworICAgICAgICBhc3NlcnQoY3N0cl9pbmRleCAhPSAwMCk7CisgICAgICAgIGFzc2VydChjc3RyX2luZGV4LT50aWxlX2luZGV4ICE9IDAwKTsKKworICAgICAgICAvKiBleHBhbmQgdGhlIGxpc3Q/ICovCisgICAgICAgIGlmICgoY3N0cl9pbmRleC0+dGlsZV9pbmRleFt0aWxlbm9dLm1hcmtudW0gKyAxKSA+IGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5tYXhtYXJrbnVtKSB7CisgICAgICAgICAgICAgICAgb3BqX21hcmtlcl9pbmZvX3QgKm5ld19tYXJrZXI7CisgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFt0aWxlbm9dLm1heG1hcmtudW0gPSAoT1BKX1VJTlQzMikoMTAwICsgKE9QSl9GTE9BVDMyKSBjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10ubWF4bWFya251bSk7CisgICAgICAgICAgICAgICAgbmV3X21hcmtlciA9IChvcGpfbWFya2VyX2luZm9fdCAqKSBvcGpfcmVhbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFt0aWxlbm9dLm1hcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFt0aWxlbm9dLm1heG1hcmtudW0gKnNpemVvZihvcGpfbWFya2VyX2luZm9fdCkpOworICAgICAgICAgICAgICAgIGlmICghIG5ld19tYXJrZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5tYXJrZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFt0aWxlbm9dLm1hcmtlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10ubWF4bWFya251bSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10ubWFya251bSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWRkIHRsIG1hcmtlclxuIik7ICovCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10ubWFya2VyID0gbmV3X21hcmtlcjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGFkZCB0aGUgbWFya2VyICovCisgICAgICAgIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5tYXJrZXJbY3N0cl9pbmRleC0+dGlsZV9pbmRleFt0aWxlbm9dLm1hcmtudW1dLnR5cGUgPSAoT1BKX1VJTlQxNil0eXBlOworICAgICAgICBjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10ubWFya2VyW2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5tYXJrbnVtXS5wb3MgPSAoT1BKX0lOVDMyKXBvczsKKyAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFt0aWxlbm9dLm1hcmtlcltjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10ubWFya251bV0ubGVuID0gKE9QSl9JTlQzMilsZW47CisgICAgICAgIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5tYXJrbnVtKys7CisKKyAgICAgICAgaWYgKHR5cGUgPT0gSjJLX01TX1NPVCkgeworICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbF9jdXJyZW50X3RpbGVfcGFydCA9IGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5jdXJyZW50X3Rwc25vOworCisgICAgICAgICAgICAgICAgaWYgKGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS50cF9pbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS50cF9pbmRleFtsX2N1cnJlbnRfdGlsZV9wYXJ0XS5zdGFydF9wb3MgPSBwb3M7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworT1BKX0JPT0wgb3BqX2oya19lbmRfZGVjb21wcmVzcyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgKHZvaWQpcF9qMms7CisgICAgKHZvaWQpcF9zdHJlYW07CisgICAgKHZvaWQpcF9tYW5hZ2VyOworICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworT1BKX0JPT0wgb3BqX2oya19yZWFkX2hlYWRlciggICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfajJrX3QqIHBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QqKiBwX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90KiBwX21hbmFnZXIgKQoreworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisgICAgICAgIC8qIGNyZWF0ZSBhbiBlbXB0eSBpbWFnZSBoZWFkZXIgKi8KKyAgICAgICAgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZSA9IG9wal9pbWFnZV9jcmVhdGUwKCk7CisgICAgICAgIGlmICghIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLyogY3VzdG9taXphdGlvbiBvZiB0aGUgdmFsaWRhdGlvbiAqLworICAgICAgICBpZiAoISBvcGpfajJrX3NldHVwX2RlY29kaW5nX3ZhbGlkYXRpb24ocF9qMmssIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfZGVzdHJveShwX2oyay0+bV9wcml2YXRlX2ltYWdlKTsKKyAgICAgICAgICAgICAgICBwX2oyay0+bV9wcml2YXRlX2ltYWdlID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLyogdmFsaWRhdGlvbiBvZiB0aGUgcGFyYW1ldGVycyBjb2RlYyAqLworICAgICAgICBpZiAoISBvcGpfajJrX2V4ZWMocF9qMmssIHBfajJrLT5tX3ZhbGlkYXRpb25fbGlzdCwgcF9zdHJlYW0scF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgIG9wal9pbWFnZV9kZXN0cm95KHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UpOworICAgICAgICAgICAgICAgIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICAvKiBjdXN0b21pemF0aW9uIG9mIHRoZSBlbmNvZGluZyAqLworICAgICAgICBpZiAoISBvcGpfajJrX3NldHVwX2hlYWRlcl9yZWFkaW5nKHBfajJrLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgb3BqX2ltYWdlX2Rlc3Ryb3kocF9qMmstPm1fcHJpdmF0ZV9pbWFnZSk7CisgICAgICAgICAgICAgICAgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHJlYWQgaGVhZGVyICovCisgICAgICAgIGlmICghIG9wal9qMmtfZXhlYyAocF9qMmsscF9qMmstPm1fcHJvY2VkdXJlX2xpc3QscF9zdHJlYW0scF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgIG9wal9pbWFnZV9kZXN0cm95KHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UpOworICAgICAgICAgICAgICAgIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICAqcF9pbWFnZSA9IG9wal9pbWFnZV9jcmVhdGUwKCk7CisgICAgICAgIGlmICghICgqcF9pbWFnZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLyogQ29weSBjb2Rlc3RyZWFtIGltYWdlIGluZm9ybWF0aW9uIHRvIHRoZSBvdXRwdXQgaW1hZ2UgKi8KKyAgICAgICAgb3BqX2NvcHlfaW1hZ2VfaGVhZGVyKHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UsICpwX2ltYWdlKTsKKworICAgIC8qQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgc29tZSBlbGVtZW50cyBvZiBjb2Rlc3RyZW0gaW5kZXgqLworICAgICAgICBpZiAoIW9wal9qMmtfYWxsb2NhdGVfdGlsZV9lbGVtZW50X2NzdHJfaW5kZXgocF9qMmspKXsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19zZXR1cF9oZWFkZXJfcmVhZGluZyAob3BqX2oya190ICpwX2oyaywgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQoreworICAgICAgICAvKiBwcmVjb25kaXRpb25zKi8KKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisKKyAgICAgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya19yZWFkX2hlYWRlcl9wcm9jZWR1cmUsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLyogREVWRUxPUEVSIENPUk5FUiwgYWRkIHlvdXIgY3VzdG9tIHByb2NlZHVyZXMgKi8KKyAgICAgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya19jb3B5X2RlZmF1bHRfdGNwX2FuZF9jcmVhdGVfdGNkLCBwX21hbmFnZXIpKSAgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKwkKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19zZXR1cF9kZWNvZGluZ192YWxpZGF0aW9uIChvcGpfajJrX3QgKnBfajJrLCBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCit7CisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMqLworICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworICAgICAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV92YWxpZGF0aW9uX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya19idWlsZF9kZWNvZGVyLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV92YWxpZGF0aW9uX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya19kZWNvZGluZ192YWxpZGF0aW9uLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIERFVkVMT1BFUiBDT1JORVIsIGFkZCB5b3VyIGN1c3RvbSB2YWxpZGF0aW9uIHByb2NlZHVyZSAqLworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX21jdF92YWxpZGF0aW9uICggICAgICAgb3BqX2oya190ICogcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCit7CisgICAgICAgIE9QSl9CT09MIGxfaXNfdmFsaWQgPSBPUEpfVFJVRTsKKyAgICAgICAgT1BKX1VJTlQzMiBpLGo7CisKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworICAgICAgICBpZiAoKHBfajJrLT5tX2NwLnJzaXogJiAweDgyMDApID09IDB4ODIwMCkgeworICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbF9uYl90aWxlcyA9IHBfajJrLT5tX2NwLnRoICogcF9qMmstPm1fY3AudHc7CisgICAgICAgICAgICAgICAgb3BqX3RjcF90ICogbF90Y3AgPSBwX2oyay0+bV9jcC50Y3BzOworCisgICAgICAgICAgICAgICAgZm9yIChpPTA7aTxsX25iX3RpbGVzOysraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfdGNwLT5tY3QgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNjcF90ICogbF90Y2NwID0gbF90Y3AtPnRjY3BzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2lzX3ZhbGlkICY9IChsX3RjcC0+bV9tY3RfY29kaW5nX21hdHJpeCAhPSAwMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7ajxwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wczsrK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2lzX3ZhbGlkICY9ICEgKGxfdGNjcC0+cW1mYmlkICYgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX3RjY3A7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICsrbF90Y3A7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxfaXNfdmFsaWQ7Cit9CisKK09QSl9CT09MIG9wal9qMmtfc2V0dXBfbWN0X2VuY29kaW5nKG9wal90Y3BfdCAqIHBfdGNwLCBvcGpfaW1hZ2VfdCAqIHBfaW1hZ2UpCit7CisgICAgICAgIE9QSl9VSU5UMzIgaTsKKyAgICAgICAgT1BKX1VJTlQzMiBsX2luZGl4ID0gMTsKKyAgICAgICAgb3BqX21jdF9kYXRhX3QgKiBsX21jdF9kZWNvX2RhdGEgPSAwMCwqIGxfbWN0X29mZnNldF9kYXRhID0gMDA7CisgICAgICAgIG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90ICogbF9tY2NfZGF0YTsKKyAgICAgICAgT1BKX1VJTlQzMiBsX21jdF9zaXplLGxfbmJfZWxlbTsKKyAgICAgICAgT1BKX0ZMT0FUMzIgKiBsX2RhdGEsICogbF9jdXJyZW50X2RhdGE7CisgICAgICAgIG9wal90Y2NwX3QgKiBsX3RjY3A7CisKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF90Y3AgIT0gMDApOworCisgICAgICAgIGlmIChwX3RjcC0+bWN0ICE9IDIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgIH0KKworICAgICAgICBpZiAocF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCkgeworICAgICAgICAgICAgICAgIGlmIChwX3RjcC0+bV9uYl9tY3RfcmVjb3JkcyA9PSBwX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9tY3RfZGF0YV90ICpuZXdfbWN0X3JlY29yZHM7CisgICAgICAgICAgICAgICAgICAgICAgICBwX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMgKz0gT1BKX0oyS19NQ1RfREVGQVVMVF9OQl9SRUNPUkRTOworCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdfbWN0X3JlY29yZHMgPSAob3BqX21jdF9kYXRhX3QgKikgb3BqX3JlYWxsb2MocF90Y3AtPm1fbWN0X3JlY29yZHMsIHBfdGNwLT5tX25iX21heF9tY3RfcmVjb3JkcyAqIHNpemVvZihvcGpfbWN0X2RhdGFfdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmV3X21jdF9yZWNvcmRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfdGNwLT5tX21jdF9yZWNvcmRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90Y3AtPm1fbWN0X3JlY29yZHMgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3RjcC0+bV9uYl9tY3RfcmVjb3JkcyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBzZXR1cCBtY3QgZW5jb2RpbmdcbiIpOyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcF90Y3AtPm1fbWN0X3JlY29yZHMgPSBuZXdfbWN0X3JlY29yZHM7CisgICAgICAgICAgICAgICAgICAgICAgICBsX21jdF9kZWNvX2RhdGEgPSBwX3RjcC0+bV9tY3RfcmVjb3JkcyArIHBfdGNwLT5tX25iX21jdF9yZWNvcmRzOworCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQobF9tY3RfZGVjb19kYXRhICwwLChwX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMgLSBwX3RjcC0+bV9uYl9tY3RfcmVjb3JkcykgKiBzaXplb2Yob3BqX21jdF9kYXRhX3QpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbF9tY3RfZGVjb19kYXRhID0gcF90Y3AtPm1fbWN0X3JlY29yZHMgKyBwX3RjcC0+bV9uYl9tY3RfcmVjb3JkczsKKworICAgICAgICAgICAgICAgIGlmIChsX21jdF9kZWNvX2RhdGEtPm1fZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9tY3RfZGVjb19kYXRhLT5tX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgbF9tY3RfZGVjb19kYXRhLT5tX2RhdGEgPSAwMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsX21jdF9kZWNvX2RhdGEtPm1faW5kZXggPSBsX2luZGl4Kys7CisgICAgICAgICAgICAgICAgbF9tY3RfZGVjb19kYXRhLT5tX2FycmF5X3R5cGUgPSBNQ1RfVFlQRV9ERUNPUlJFTEFUSU9OOworICAgICAgICAgICAgICAgIGxfbWN0X2RlY29fZGF0YS0+bV9lbGVtZW50X3R5cGUgPSBNQ1RfVFlQRV9GTE9BVDsKKyAgICAgICAgICAgICAgICBsX25iX2VsZW0gPSBwX2ltYWdlLT5udW1jb21wcyAqIHBfaW1hZ2UtPm51bWNvbXBzOworICAgICAgICAgICAgICAgIGxfbWN0X3NpemUgPSBsX25iX2VsZW0gKiBNQ1RfRUxFTUVOVF9TSVpFW2xfbWN0X2RlY29fZGF0YS0+bV9lbGVtZW50X3R5cGVdOworICAgICAgICAgICAgICAgIGxfbWN0X2RlY29fZGF0YS0+bV9kYXRhID0gKE9QSl9CWVRFKilvcGpfbWFsbG9jKGxfbWN0X3NpemUgKTsKKworICAgICAgICAgICAgICAgIGlmICghIGxfbWN0X2RlY29fZGF0YS0+bV9kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGoya19tY3Rfd3JpdGVfZnVuY3Rpb25zX2Zyb21fZmxvYXRbbF9tY3RfZGVjb19kYXRhLT5tX2VsZW1lbnRfdHlwZV0ocF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCxsX21jdF9kZWNvX2RhdGEtPm1fZGF0YSxsX25iX2VsZW0pOworCisgICAgICAgICAgICAgICAgbF9tY3RfZGVjb19kYXRhLT5tX2RhdGFfc2l6ZSA9IGxfbWN0X3NpemU7CisgICAgICAgICAgICAgICAgKytwX3RjcC0+bV9uYl9tY3RfcmVjb3JkczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwX3RjcC0+bV9uYl9tY3RfcmVjb3JkcyA9PSBwX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMpIHsKKyAgICAgICAgICAgICAgICBvcGpfbWN0X2RhdGFfdCAqbmV3X21jdF9yZWNvcmRzOworICAgICAgICAgICAgICAgIHBfdGNwLT5tX25iX21heF9tY3RfcmVjb3JkcyArPSBPUEpfSjJLX01DVF9ERUZBVUxUX05CX1JFQ09SRFM7CisgICAgICAgICAgICAgICAgbmV3X21jdF9yZWNvcmRzID0gKG9wal9tY3RfZGF0YV90ICopIG9wal9yZWFsbG9jKHBfdGNwLT5tX21jdF9yZWNvcmRzLCBwX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMgKiBzaXplb2Yob3BqX21jdF9kYXRhX3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoISBuZXdfbWN0X3JlY29yZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfdGNwLT5tX21jdF9yZWNvcmRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfdGNwLT5tX21jdF9yZWNvcmRzID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfdGNwLT5tX25iX21heF9tY3RfcmVjb3JkcyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBwX3RjcC0+bV9uYl9tY3RfcmVjb3JkcyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gc2V0dXAgbWN0IGVuY29kaW5nXG4iKTsgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBfdGNwLT5tX21jdF9yZWNvcmRzID0gbmV3X21jdF9yZWNvcmRzOworICAgICAgICAgICAgICAgIGxfbWN0X29mZnNldF9kYXRhID0gcF90Y3AtPm1fbWN0X3JlY29yZHMgKyBwX3RjcC0+bV9uYl9tY3RfcmVjb3JkczsKKworICAgICAgICAgICAgICAgIG1lbXNldChsX21jdF9vZmZzZXRfZGF0YSAsMCwocF90Y3AtPm1fbmJfbWF4X21jdF9yZWNvcmRzIC0gcF90Y3AtPm1fbmJfbWN0X3JlY29yZHMpICogc2l6ZW9mKG9wal9tY3RfZGF0YV90KSk7CisKKyAgICAgICAgICAgICAgICBpZiAobF9tY3RfZGVjb19kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsX21jdF9kZWNvX2RhdGEgPSBsX21jdF9vZmZzZXRfZGF0YSAtIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbF9tY3Rfb2Zmc2V0X2RhdGEgPSBwX3RjcC0+bV9tY3RfcmVjb3JkcyArIHBfdGNwLT5tX25iX21jdF9yZWNvcmRzOworCisgICAgICAgIGlmIChsX21jdF9vZmZzZXRfZGF0YS0+bV9kYXRhKSB7CisgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9tY3Rfb2Zmc2V0X2RhdGEtPm1fZGF0YSk7CisgICAgICAgICAgICAgICAgbF9tY3Rfb2Zmc2V0X2RhdGEtPm1fZGF0YSA9IDAwOworICAgICAgICB9CisKKyAgICAgICAgbF9tY3Rfb2Zmc2V0X2RhdGEtPm1faW5kZXggPSBsX2luZGl4Kys7CisgICAgICAgIGxfbWN0X29mZnNldF9kYXRhLT5tX2FycmF5X3R5cGUgPSBNQ1RfVFlQRV9PRkZTRVQ7CisgICAgICAgIGxfbWN0X29mZnNldF9kYXRhLT5tX2VsZW1lbnRfdHlwZSA9IE1DVF9UWVBFX0ZMT0FUOworICAgICAgICBsX25iX2VsZW0gPSBwX2ltYWdlLT5udW1jb21wczsKKyAgICAgICAgbF9tY3Rfc2l6ZSA9IGxfbmJfZWxlbSAqIE1DVF9FTEVNRU5UX1NJWkVbbF9tY3Rfb2Zmc2V0X2RhdGEtPm1fZWxlbWVudF90eXBlXTsKKyAgICAgICAgbF9tY3Rfb2Zmc2V0X2RhdGEtPm1fZGF0YSA9IChPUEpfQllURSopb3BqX21hbGxvYyhsX21jdF9zaXplICk7CisKKyAgICAgICAgaWYgKCEgbF9tY3Rfb2Zmc2V0X2RhdGEtPm1fZGF0YSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBsX2RhdGEgPSAoT1BKX0ZMT0FUMzIqKW9wal9tYWxsb2MobF9uYl9lbGVtICogc2l6ZW9mKE9QSl9GTE9BVDMyKSk7CisgICAgICAgIGlmICghIGxfZGF0YSkgeworICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfbWN0X29mZnNldF9kYXRhLT5tX2RhdGEpOworICAgICAgICAgICAgICAgIGxfbWN0X29mZnNldF9kYXRhLT5tX2RhdGEgPSAwMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgbF90Y2NwID0gcF90Y3AtPnRjY3BzOworICAgICAgICBsX2N1cnJlbnRfZGF0YSA9IGxfZGF0YTsKKworICAgICAgICBmb3IgKGk9MDtpPGxfbmJfZWxlbTsrK2kpIHsKKyAgICAgICAgICAgICAgICAqKGxfY3VycmVudF9kYXRhKyspID0gKE9QSl9GTE9BVDMyKSAobF90Y2NwLT5tX2RjX2xldmVsX3NoaWZ0KTsKKyAgICAgICAgICAgICAgICArK2xfdGNjcDsKKyAgICAgICAgfQorCisgICAgICAgIGoya19tY3Rfd3JpdGVfZnVuY3Rpb25zX2Zyb21fZmxvYXRbbF9tY3Rfb2Zmc2V0X2RhdGEtPm1fZWxlbWVudF90eXBlXShsX2RhdGEsbF9tY3Rfb2Zmc2V0X2RhdGEtPm1fZGF0YSxsX25iX2VsZW0pOworCisgICAgICAgIG9wal9mcmVlKGxfZGF0YSk7CisKKyAgICAgICAgbF9tY3Rfb2Zmc2V0X2RhdGEtPm1fZGF0YV9zaXplID0gbF9tY3Rfc2l6ZTsKKworICAgICAgICArK3BfdGNwLT5tX25iX21jdF9yZWNvcmRzOworCisgICAgICAgIGlmIChwX3RjcC0+bV9uYl9tY2NfcmVjb3JkcyA9PSBwX3RjcC0+bV9uYl9tYXhfbWNjX3JlY29yZHMpIHsKKyAgICAgICAgICAgICAgICBvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCAqbmV3X21jY19yZWNvcmRzOworICAgICAgICAgICAgICAgIHBfdGNwLT5tX25iX21heF9tY2NfcmVjb3JkcyArPSBPUEpfSjJLX01DVF9ERUZBVUxUX05CX1JFQ09SRFM7CisgICAgICAgICAgICAgICAgbmV3X21jY19yZWNvcmRzID0gKG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90ICopIG9wal9yZWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3RjcC0+bV9tY2NfcmVjb3JkcywgcF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzICogc2l6ZW9mKG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90KSk7CisgICAgICAgICAgICAgICAgaWYgKCEgbmV3X21jY19yZWNvcmRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX3RjcC0+bV9tY2NfcmVjb3Jkcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBwX3RjcC0+bV9tY2NfcmVjb3JkcyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBwX3RjcC0+bV9uYl9tYXhfbWNjX3JlY29yZHMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcF90Y3AtPm1fbmJfbWNjX3JlY29yZHMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgLyogb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHNldHVwIG1jdCBlbmNvZGluZ1xuIik7ICovCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwX3RjcC0+bV9tY2NfcmVjb3JkcyA9IG5ld19tY2NfcmVjb3JkczsKKyAgICAgICAgICAgICAgICBsX21jY19kYXRhID0gcF90Y3AtPm1fbWNjX3JlY29yZHMgKyBwX3RjcC0+bV9uYl9tY2NfcmVjb3JkczsKKyAgICAgICAgICAgICAgICBtZW1zZXQobF9tY2NfZGF0YSAsMCwocF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzIC0gcF90Y3AtPm1fbmJfbWNjX3JlY29yZHMpICogc2l6ZW9mKG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90KSk7CisKKyAgICAgICAgfQorCisgICAgICAgIGxfbWNjX2RhdGEgPSBwX3RjcC0+bV9tY2NfcmVjb3JkcyArIHBfdGNwLT5tX25iX21jY19yZWNvcmRzOworICAgICAgICBsX21jY19kYXRhLT5tX2RlY29ycmVsYXRpb25fYXJyYXkgPSBsX21jdF9kZWNvX2RhdGE7CisgICAgICAgIGxfbWNjX2RhdGEtPm1faXNfaXJyZXZlcnNpYmxlID0gMTsKKyAgICAgICAgbF9tY2NfZGF0YS0+bV9uYl9jb21wcyA9IHBfaW1hZ2UtPm51bWNvbXBzOworICAgICAgICBsX21jY19kYXRhLT5tX2luZGV4ID0gbF9pbmRpeCsrOworICAgICAgICBsX21jY19kYXRhLT5tX29mZnNldF9hcnJheSA9IGxfbWN0X29mZnNldF9kYXRhOworICAgICAgICArK3BfdGNwLT5tX25iX21jY19yZWNvcmRzOworCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfYnVpbGRfZGVjb2RlciAob3BqX2oya190ICogcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQoreworICAgICAgICAvKiBhZGQgaGVyZSBpbml0aWFsaXphdGlvbiBvZiBjcAorICAgICAgICAgICBjb3B5IHBhc3RlIG9mIHNldHVwX2RlY29kZXIgKi8KKyAgKHZvaWQpcF9qMms7CisgICh2b2lkKXBfc3RyZWFtOworICAodm9pZClwX21hbmFnZXI7CisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfYnVpbGRfZW5jb2RlciAob3BqX2oya190ICogcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3sKKyAgICAgICAgLyogYWRkIGhlcmUgaW5pdGlhbGl6YXRpb24gb2YgY3AKKyAgICAgICAgICAgY29weSBwYXN0ZSBvZiBzZXR1cF9lbmNvZGVyICovCisgICh2b2lkKXBfajJrOworICAodm9pZClwX3N0cmVhbTsKKyAgKHZvaWQpcF9tYW5hZ2VyOworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2VuY29kaW5nX3ZhbGlkYXRpb24gKCAgb3BqX2oya190ICogcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCit7CisgICAgICAgIE9QSl9CT09MIGxfaXNfdmFsaWQgPSBPUEpfVFJVRTsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisgICAgICAgIC8qIFNUQVRFIGNoZWNraW5nICovCisgICAgICAgIC8qIG1ha2Ugc3VyZSB0aGUgc3RhdGUgaXMgYXQgMCAqLworICAgICAgICBsX2lzX3ZhbGlkICY9IChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9PSBKMktfU1RBVEVfTk9ORSk7CisKKyAgICAgICAgLyogUE9JTlRFUiB2YWxpZGF0aW9uICovCisgICAgICAgIC8qIG1ha2Ugc3VyZSBhIHBfajJrIGNvZGVjIGlzIHByZXNlbnQgKi8KKyAgICAgICAgbF9pc192YWxpZCAmPSAocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QgIT0gMDApOworICAgICAgICAvKiBtYWtlIHN1cmUgYSB2YWxpZGF0aW9uIGxpc3QgaXMgcHJlc2VudCAqLworICAgICAgICBsX2lzX3ZhbGlkICY9IChwX2oyay0+bV92YWxpZGF0aW9uX2xpc3QgIT0gMDApOworCisgICAgICAgIC8qIElTTyAxNTQ0NC0xOjIwMDQgc3RhdGVzIGJldHdlZW4gMSAmIDMzICgwIC0+IDMyKSAqLworICAgICAgICAvKiAzMyAoMzIpIHdvdWxkIGFsd2F5cyBmYWlsIHRoZSBjaGVjayBiZWxvdyAoaWYgYSBjYXN0IHRvIDY0Yml0cyB3YXMgZG9uZSkgKi8KKyAgICAgICAgLyogRklYTUUgU2hhbGwgd2UgY2hhbmdlIE9QSl9KMktfTUFYUkxWTFMgdG8gMzIgPyAqLworICAgICAgICBpZiAoKHBfajJrLT5tX2NwLnRjcHMtPnRjY3BzLT5udW1yZXNvbHV0aW9ucyA8PSAwKSB8fCAocF9qMmstPm1fY3AudGNwcy0+dGNjcHMtPm51bXJlc29sdXRpb25zID4gMzIpKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk51bWJlciBvZiByZXNvbHV0aW9ucyBpcyB0b28gaGlnaCBpbiBjb21wYXJpc29uIHRvIHRoZSBzaXplIG9mIHRpbGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChwX2oyay0+bV9jcC50ZHgpIDwgKE9QSl9VSU5UMzIpICgxIDw8IChwX2oyay0+bV9jcC50Y3BzLT50Y2Nwcy0+bnVtcmVzb2x1dGlvbnMgLSAxVSkpKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk51bWJlciBvZiByZXNvbHV0aW9ucyBpcyB0b28gaGlnaCBpbiBjb21wYXJpc29uIHRvIHRoZSBzaXplIG9mIHRpbGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChwX2oyay0+bV9jcC50ZHkpIDwgKE9QSl9VSU5UMzIpICgxIDw8IChwX2oyay0+bV9jcC50Y3BzLT50Y2Nwcy0+bnVtcmVzb2x1dGlvbnMgLSAxVSkpKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk51bWJlciBvZiByZXNvbHV0aW9ucyBpcyB0b28gaGlnaCBpbiBjb21wYXJpc29uIHRvIHRoZSBzaXplIG9mIHRpbGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLyogUEFSQU1FVEVSIFZBTElEQVRJT04gKi8KKyAgICAgICAgcmV0dXJuIGxfaXNfdmFsaWQ7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2RlY29kaW5nX3ZhbGlkYXRpb24gKCAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgICAgICBPUEpfQk9PTCBsX2lzX3ZhbGlkID0gT1BKX1RSVUU7CisKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyovCisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisgICAgICAgIC8qIFNUQVRFIGNoZWNraW5nICovCisgICAgICAgIC8qIG1ha2Ugc3VyZSB0aGUgc3RhdGUgaXMgYXQgMCAqLworI2lmZGVmIFRPRE9fTVNECisgICAgICAgIGxfaXNfdmFsaWQgJj0gKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IEoyS19ERUNfU1RBVEVfTk9ORSk7CisjZW5kaWYKKyAgICAgICAgbF9pc192YWxpZCAmPSAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPT0gMHgwMDAwKTsKKworICAgICAgICAvKiBQT0lOVEVSIHZhbGlkYXRpb24gKi8KKyAgICAgICAgLyogbWFrZSBzdXJlIGEgcF9qMmsgY29kZWMgaXMgcHJlc2VudCAqLworICAgICAgICAvKiBtYWtlIHN1cmUgYSBwcm9jZWR1cmUgbGlzdCBpcyBwcmVzZW50ICovCisgICAgICAgIGxfaXNfdmFsaWQgJj0gKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0ICE9IDAwKTsKKyAgICAgICAgLyogbWFrZSBzdXJlIGEgdmFsaWRhdGlvbiBsaXN0IGlzIHByZXNlbnQgKi8KKyAgICAgICAgbF9pc192YWxpZCAmPSAocF9qMmstPm1fdmFsaWRhdGlvbl9saXN0ICE9IDAwKTsKKworICAgICAgICAvKiBQQVJBTUVURVIgVkFMSURBVElPTiAqLworICAgICAgICByZXR1cm4gbF9pc192YWxpZDsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9oZWFkZXJfcHJvY2VkdXJlKCBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCit7CisgICAgICAgIE9QSl9VSU5UMzIgbF9jdXJyZW50X21hcmtlcjsKKyAgICAgICAgT1BKX1VJTlQzMiBsX21hcmtlcl9zaXplOworICAgICAgICBjb25zdCBvcGpfZGVjX21lbW9yeV9tYXJrZXJfaGFuZGxlcl90ICogbF9tYXJrZXJfaGFuZGxlciA9IDAwOworICAgICAgICBPUEpfQk9PTCBsX2hhc19zaXogPSAwOworICAgICAgICBPUEpfQk9PTCBsX2hhc19jb2QgPSAwOworICAgICAgICBPUEpfQk9PTCBsX2hhc19xY2QgPSAwOworCisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisKKyAgICAgICAgLyogIFdlIGVudGVyIGluIHRoZSBtYWluIGhlYWRlciAqLworICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9IEoyS19TVEFURV9NSFNPQzsKKworICAgICAgICAvKiBUcnkgdG8gcmVhZCB0aGUgU09DIG1hcmtlciwgdGhlIGNvZGVzdHJlYW0gbXVzdCBiZWdpbiB3aXRoIFNPQyBtYXJrZXIgKi8KKyAgICAgICAgaWYgKCEgb3BqX2oya19yZWFkX3NvYyhwX2oyayxwX3N0cmVhbSxwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkV4cGVjdGVkIGEgU09DIG1hcmtlciBcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICAvKiBUcnkgdG8gcmVhZCAyIGJ5dGVzICh0aGUgbmV4dCBtYXJrZXIgSUQpIGZyb20gc3RyZWFtIGFuZCBjb3B5IHRoZW0gaW50byB0aGUgYnVmZmVyICovCisgICAgICAgIGlmIChvcGpfc3RyZWFtX3JlYWRfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSwyLHBfbWFuYWdlcikgIT0gMikgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJTdHJlYW0gdG9vIHNob3J0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLyogUmVhZCAyIGJ5dGVzIGFzIHRoZSBuZXcgbWFya2VyIElEICovCisgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLCZsX2N1cnJlbnRfbWFya2VyLDIpOworCisgICAgICAgIC8qIFRyeSB0byByZWFkIHVudGlsIHRoZSBTT1QgaXMgZGV0ZWN0ZWQgKi8KKyAgICAgICAgd2hpbGUgKGxfY3VycmVudF9tYXJrZXIgIT0gSjJLX01TX1NPVCkgeworCisgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgbWFya2VyIElEIGlzIHZhbGlkICovCisgICAgICAgICAgICAgICAgaWYgKGxfY3VycmVudF9tYXJrZXIgPCAweGZmMDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJBIG1hcmtlciBJRCB3YXMgZXhwZWN0ZWQgKDB4ZmYtLSkgaW5zdGVhZCBvZiAlLjh4XG4iLCBsX2N1cnJlbnRfbWFya2VyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBtYXJrZXIgaGFuZGxlciBmcm9tIHRoZSBtYXJrZXIgSUQgKi8KKyAgICAgICAgICAgICAgICBsX21hcmtlcl9oYW5kbGVyID0gb3BqX2oya19nZXRfbWFya2VyX2hhbmRsZXIobF9jdXJyZW50X21hcmtlcik7CisKKyAgICAgICAgICAgICAgICAvKiBNYW5hZ2UgY2FzZSB3aGVyZSBtYXJrZXIgaXMgdW5rbm93biAqLworICAgICAgICAgICAgICAgIGlmIChsX21hcmtlcl9oYW5kbGVyLT5pZCA9PSBKMktfTVNfVU5LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBvcGpfajJrX3JlYWRfdW5rKHBfajJrLCBwX3N0cmVhbSwgJmxfY3VycmVudF9tYXJrZXIsIHBfbWFuYWdlcikpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiVW5rbm93IG1hcmtlciBoYXZlIGJlZW4gZGV0ZWN0ZWQgYW5kIGdlbmVyYXRlZCBlcnJvci5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9jdXJyZW50X21hcmtlciA9PSBKMktfTVNfU09UKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLyogU09UIG1hcmtlciBpcyBkZXRlY3RlZCBtYWluIGhlYWRlciBpcyBjb21wbGV0ZWx5IHJlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgLyogR2V0IHRoZSBtYXJrZXIgaGFuZGxlciBmcm9tIHRoZSBtYXJrZXIgSUQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9tYXJrZXJfaGFuZGxlciA9IG9wal9qMmtfZ2V0X21hcmtlcl9oYW5kbGVyKGxfY3VycmVudF9tYXJrZXIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsX21hcmtlcl9oYW5kbGVyLT5pZCA9PSBKMktfTVNfU0laKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIE1hcmsgcmVxdWlyZWQgU0laIG1hcmtlciBhcyBmb3VuZCAqLworICAgICAgICAgICAgICAgICAgICBsX2hhc19zaXogPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobF9tYXJrZXJfaGFuZGxlci0+aWQgPT0gSjJLX01TX0NPRCkgeworICAgICAgICAgICAgICAgICAgICAvKiBNYXJrIHJlcXVpcmVkIENPRCBtYXJrZXIgYXMgZm91bmQgKi8KKyAgICAgICAgICAgICAgICAgICAgbF9oYXNfY29kID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxfbWFya2VyX2hhbmRsZXItPmlkID09IEoyS19NU19RQ0QpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogTWFyayByZXF1aXJlZCBRQ0QgbWFya2VyIGFzIGZvdW5kICovCisgICAgICAgICAgICAgICAgICAgIGxfaGFzX3FjZCA9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIG1hcmtlciBpcyBrbm93biBhbmQgaWYgaXQgaXMgdGhlIHJpZ2h0IHBsYWNlIHRvIGZpbmQgaXQgKi8KKyAgICAgICAgICAgICAgICBpZiAoISAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgJiBsX21hcmtlcl9oYW5kbGVyLT5zdGF0ZXMpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk1hcmtlciBpcyBub3QgY29tcGxpYW50IHdpdGggaXRzIHBvc2l0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogVHJ5IHRvIHJlYWQgMiBieXRlcyAodGhlIG1hcmtlciBzaXplKSBmcm9tIHN0cmVhbSBhbmQgY29weSB0aGVtIGludG8gdGhlIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIGlmIChvcGpfc3RyZWFtX3JlYWRfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSwyLHBfbWFuYWdlcikgIT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiByZWFkIDIgYnl0ZXMgYXMgdGhlIG1hcmtlciBzaXplICovCisgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsJmxfbWFya2VyX3NpemUsMik7CisgICAgICAgICAgICAgICAgbF9tYXJrZXJfc2l6ZSAtPSAyOyAvKiBTdWJ0cmFjdCB0aGUgc2l6ZSBvZiB0aGUgbWFya2VyIElEIGFscmVhZHkgcmVhZCAqLworCisgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIG1hcmtlciBzaXplIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgaGVhZGVyIGRhdGEgc2l6ZSAqLworICAgICAgICAgICAgICAgIGlmIChsX21hcmtlcl9zaXplID4gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKm5ld19oZWFkZXJfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfcmVhbGxvYyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSwgbF9tYXJrZXJfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBuZXdfaGVhZGVyX2RhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBoZWFkZXJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEgPSBuZXdfaGVhZGVyX2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YV9zaXplID0gbF9tYXJrZXJfc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBUcnkgdG8gcmVhZCB0aGUgcmVzdCBvZiB0aGUgbWFya2VyIHNlZ21lbnQgZnJvbSBzdHJlYW0gYW5kIGNvcHkgdGhlbSBpbnRvIHRoZSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBpZiAob3BqX3N0cmVhbV9yZWFkX2RhdGEocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsbF9tYXJrZXJfc2l6ZSxwX21hbmFnZXIpICE9IGxfbWFya2VyX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJTdHJlYW0gdG9vIHNob3J0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogUmVhZCB0aGUgbWFya2VyIHNlZ21lbnQgd2l0aCB0aGUgY29ycmVjdCBtYXJrZXIgaGFuZGxlciAqLworICAgICAgICAgICAgICAgIGlmICghICgqKGxfbWFya2VyX2hhbmRsZXItPmhhbmRsZXIpKShwX2oyayxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSxsX21hcmtlcl9zaXplLHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJNYXJrZXIgaGFuZGxlciBmdW5jdGlvbiBmYWlsZWQgdG8gcmVhZCB0aGUgbWFya2VyIHNlZ21lbnRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBBZGQgdGhlIG1hcmtlciB0byB0aGUgY29kZXN0cmVhbSBpbmRleCovCisgICAgICAgICAgICAgICAgaWYgKE9QSl9GQUxTRSA9PSBvcGpfajJrX2FkZF9taG1hcmtlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX21hcmtlcl9oYW5kbGVyLT5pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMikgb3BqX3N0cmVhbV90ZWxsKHBfc3RyZWFtKSAtIGxfbWFya2VyX3NpemUgLSA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfbWFya2VyX3NpemUgKyA0ICkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhZGQgbWggbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogVHJ5IHRvIHJlYWQgMiBieXRlcyAodGhlIG5leHQgbWFya2VyIElEKSBmcm9tIHN0cmVhbSBhbmQgY29weSB0aGVtIGludG8gdGhlIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIGlmIChvcGpfc3RyZWFtX3JlYWRfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSwyLHBfbWFuYWdlcikgIT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiByZWFkIDIgYnl0ZXMgYXMgdGhlIG5ldyBtYXJrZXIgSUQgKi8KKyAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSwmbF9jdXJyZW50X21hcmtlciwyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsX2hhc19zaXogPT0gMCkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgInJlcXVpcmVkIFNJWiBtYXJrZXIgbm90IGZvdW5kIGluIG1haW4gaGVhZGVyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxfaGFzX2NvZCA9PSAwKSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAicmVxdWlyZWQgQ09EIG1hcmtlciBub3QgZm91bmQgaW4gbWFpbiBoZWFkZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBpZiAobF9oYXNfcWNkID09IDApIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJyZXF1aXJlZCBRQ0QgbWFya2VyIG5vdCBmb3VuZCBpbiBtYWluIGhlYWRlclxuIik7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisJCisgICAgICAgIGlmICghIG9wal9qMmtfbWVyZ2VfcHBtKCYocF9qMmstPm1fY3ApLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRmFpbGVkIHRvIG1lcmdlIFBQTSBkYXRhXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0lORk8sICJNYWluIGhlYWRlciBoYXMgYmVlbiBjb3JyZWN0bHkgZGVjb2RlZC5cbiIpOworCisgICAgICAgIC8qIFBvc2l0aW9uIG9mIHRoZSBsYXN0IGVsZW1lbnQgaWYgdGhlIG1haW4gaGVhZGVyICovCisgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT5tYWluX2hlYWRfZW5kID0gKE9QSl9VSU5UMzIpIG9wal9zdHJlYW1fdGVsbChwX3N0cmVhbSkgLSAyOworCisgICAgICAgIC8qIE5leHQgc3RlcDogcmVhZCBhIHRpbGUtcGFydCBoZWFkZXIgKi8KKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPSBKMktfU1RBVEVfVFBIU09UOworCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfZXhlYyAoIG9wal9qMmtfdCAqIHBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9wcm9jZWR1cmVfbGlzdF90ICogcF9wcm9jZWR1cmVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3sKKyAgICAgICAgT1BKX0JPT0wgKCoqIGxfcHJvY2VkdXJlKSAob3BqX2oya190ICogLG9wal9zdHJlYW1fcHJpdmF0ZV90ICosb3BqX2V2ZW50X21ncl90ICopID0gMDA7CisgICAgICAgIE9QSl9CT09MIGxfcmVzdWx0ID0gT1BKX1RSVUU7CisgICAgICAgIE9QSl9VSU5UMzIgbF9uYl9wcm9jLCBpOworCisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMqLworICAgICAgICBhc3NlcnQocF9wcm9jZWR1cmVfbGlzdCAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisgICAgICAgIGxfbmJfcHJvYyA9IG9wal9wcm9jZWR1cmVfbGlzdF9nZXRfbmJfcHJvY2VkdXJlcyhwX3Byb2NlZHVyZV9saXN0KTsKKyAgICAgICAgbF9wcm9jZWR1cmUgPSAoT1BKX0JPT0wgKCoqKSAob3BqX2oya190ICogLG9wal9zdHJlYW1fcHJpdmF0ZV90ICosb3BqX2V2ZW50X21ncl90ICopKSBvcGpfcHJvY2VkdXJlX2xpc3RfZ2V0X2ZpcnN0X3Byb2NlZHVyZShwX3Byb2NlZHVyZV9saXN0KTsKKworICAgICAgICBmb3IgICAgIChpPTA7aTxsX25iX3Byb2M7KytpKSB7CisgICAgICAgICAgICAgICAgbF9yZXN1bHQgPSBsX3Jlc3VsdCAmJiAoKCpsX3Byb2NlZHVyZSkgKHBfajJrLHBfc3RyZWFtLHBfbWFuYWdlcikpOworICAgICAgICAgICAgICAgICsrbF9wcm9jZWR1cmU7CisgICAgICAgIH0KKworICAgICAgICAvKiBhbmQgY2xlYXIgdGhlIHByb2NlZHVyZSBsaXN0IGF0IHRoZSBlbmQuKi8KKyAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X2NsZWFyKHBfcHJvY2VkdXJlX2xpc3QpOworICAgICAgICByZXR1cm4gbF9yZXN1bHQ7Cit9CisKKy8qIEZJWE1FIERPQyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19jb3B5X2RlZmF1bHRfdGNwX2FuZF9jcmVhdGVfdGNkICggICAgICAgb3BqX2oya190ICogcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAgICAgb3BqX3RjcF90ICogbF90Y3AgPSAwMDsKKyAgICAgICAgb3BqX3RjcF90ICogbF9kZWZhdWx0X3RjcCA9IDAwOworICAgICAgICBPUEpfVUlOVDMyIGxfbmJfdGlsZXM7CisgICAgICAgIE9QSl9VSU5UMzIgaSxqOworICAgICAgICBvcGpfdGNjcF90ICpsX2N1cnJlbnRfdGNjcCA9IDAwOworICAgICAgICBPUEpfVUlOVDMyIGxfdGNjcF9zaXplOworICAgICAgICBPUEpfVUlOVDMyIGxfbWN0X3NpemU7CisgICAgICAgIG9wal9pbWFnZV90ICogbF9pbWFnZTsKKyAgICAgICAgT1BKX1VJTlQzMiBsX21jY19yZWNvcmRzX3NpemUsbF9tY3RfcmVjb3Jkc19zaXplOworICAgICAgICBvcGpfbWN0X2RhdGFfdCAqIGxfc3JjX21jdF9yZWMsICpsX2Rlc3RfbWN0X3JlYzsKKyAgICAgICAgb3BqX3NpbXBsZV9tY2NfZGVjb3JyZWxhdGlvbl9kYXRhX3QgKiBsX3NyY19tY2NfcmVjLCAqbF9kZXN0X21jY19yZWM7CisgICAgICAgIE9QSl9VSU5UMzIgbF9vZmZzZXQ7CisKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworICAgICAgICBsX2ltYWdlID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZTsKKyAgICAgICAgbF9uYl90aWxlcyA9IHBfajJrLT5tX2NwLnRoICogcF9qMmstPm1fY3AudHc7CisgICAgICAgIGxfdGNwID0gcF9qMmstPm1fY3AudGNwczsKKyAgICAgICAgbF90Y2NwX3NpemUgPSBsX2ltYWdlLT5udW1jb21wcyAqIChPUEpfVUlOVDMyKXNpemVvZihvcGpfdGNjcF90KTsKKyAgICAgICAgbF9kZWZhdWx0X3RjcCA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwOworICAgICAgICBsX21jdF9zaXplID0gbF9pbWFnZS0+bnVtY29tcHMgKiBsX2ltYWdlLT5udW1jb21wcyAqIChPUEpfVUlOVDMyKXNpemVvZihPUEpfRkxPQVQzMik7CisKKyAgICAgICAgLyogRm9yIGVhY2ggdGlsZSAqLworICAgICAgICBmb3IgKGk9MDsgaTxsX25iX3RpbGVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICAvKiBrZWVwIHRoZSB0aWxlLWNvbXBvIGNvZGluZyBwYXJhbWV0ZXJzIHBvaW50ZXIgb2YgdGhlIGN1cnJlbnQgdGlsZSBjb2RpbmcgcGFyYW1ldGVycyovCisgICAgICAgICAgICAgICAgbF9jdXJyZW50X3RjY3AgPSBsX3RjcC0+dGNjcHM7CisgICAgICAgICAgICAgICAgLypDb3B5IGRlZmF1bHQgY29kaW5nIHBhcmFtZXRlcnMgaW50byB0aGUgY3VycmVudCB0aWxlIGNvZGluZyBwYXJhbWV0ZXJzKi8KKyAgICAgICAgICAgICAgICBtZW1jcHkobF90Y3AsIGxfZGVmYXVsdF90Y3AsIHNpemVvZihvcGpfdGNwX3QpKTsKKyAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHNvbWUgdmFsdWVzIG9mIHRoZSBjdXJyZW50IHRpbGUgY29kaW5nIHBhcmFtZXRlcnMqLworICAgICAgICAgICAgICAgIGxfdGNwLT5jb2QgPSAwOworICAgICAgICAgICAgICAgIGxfdGNwLT5wcHQgPSAwOworICAgICAgICAgICAgICAgIGxfdGNwLT5wcHRfZGF0YSA9IDAwOworICAgICAgICAgICAgICAgIC8qIFJlbW92ZSBtZW1vcnkgbm90IG93bmVkIGJ5IHRoaXMgdGlsZSBpbiBjYXNlIG9mIGVhcmx5IGVycm9yIHJldHVybi4gKi8KKyAgICAgICAgICAgICAgICBsX3RjcC0+bV9tY3RfZGVjb2RpbmdfbWF0cml4ID0gMDA7CisgICAgICAgICAgICAgICAgbF90Y3AtPm1fbmJfbWF4X21jdF9yZWNvcmRzID0gMDsKKyAgICAgICAgICAgICAgICBsX3RjcC0+bV9tY3RfcmVjb3JkcyA9IDAwOworICAgICAgICAgICAgICAgIGxfdGNwLT5tX25iX21heF9tY2NfcmVjb3JkcyA9IDA7CisgICAgICAgICAgICAgICAgbF90Y3AtPm1fbWNjX3JlY29yZHMgPSAwMDsKKyAgICAgICAgICAgICAgICAvKiBSZWNvbm5lY3QgdGhlIHRpbGUtY29tcG8gY29kaW5nIHBhcmFtZXRlcnMgcG9pbnRlciB0byB0aGUgY3VycmVudCB0aWxlIGNvZGluZyBwYXJhbWV0ZXJzKi8KKyAgICAgICAgICAgICAgICBsX3RjcC0+dGNjcHMgPSBsX2N1cnJlbnRfdGNjcDsKKworICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbWN0X2RlY29kaW5nX21hdHJpeCBvZiB0aGUgZGZsdF90aWxlX2NwIGFuZCBjb3B5IHRoZW0gaW50byB0aGUgY3VycmVudCB0aWxlIGNwKi8KKyAgICAgICAgICAgICAgICBpZiAobF9kZWZhdWx0X3RjcC0+bV9tY3RfZGVjb2RpbmdfbWF0cml4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsX3RjcC0+bV9tY3RfZGVjb2RpbmdfbWF0cml4ID0gKE9QSl9GTE9BVDMyKilvcGpfbWFsbG9jKGxfbWN0X3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShsX3RjcC0+bV9tY3RfZGVjb2RpbmdfbWF0cml4LGxfZGVmYXVsdF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCxsX21jdF9zaXplKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG1jdF9yZWNvcmQgb2YgdGhlIGRmbHRfdGlsZV9jcCBhbmQgY29weSB0aGVtIGludG8gdGhlIGN1cnJlbnQgdGlsZSBjcCovCisgICAgICAgICAgICAgICAgbF9tY3RfcmVjb3Jkc19zaXplID0gbF9kZWZhdWx0X3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMgKiAoT1BKX1VJTlQzMilzaXplb2Yob3BqX21jdF9kYXRhX3QpOworICAgICAgICAgICAgICAgIGxfdGNwLT5tX21jdF9yZWNvcmRzID0gKG9wal9tY3RfZGF0YV90KilvcGpfbWFsbG9jKGxfbWN0X3JlY29yZHNfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCEgbF90Y3AtPm1fbWN0X3JlY29yZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lbWNweShsX3RjcC0+bV9tY3RfcmVjb3JkcywgbF9kZWZhdWx0X3RjcC0+bV9tY3RfcmVjb3JkcyxsX21jdF9yZWNvcmRzX3NpemUpOworCisgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgbWN0IHJlY29yZCBkYXRhIGZyb20gZGZsdF90aWxlX2NwIHRvIHRoZSBjdXJyZW50IHRpbGUqLworICAgICAgICAgICAgICAgIGxfc3JjX21jdF9yZWMgPSBsX2RlZmF1bHRfdGNwLT5tX21jdF9yZWNvcmRzOworICAgICAgICAgICAgICAgIGxfZGVzdF9tY3RfcmVjID0gbF90Y3AtPm1fbWN0X3JlY29yZHM7CisKKyAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfZGVmYXVsdF90Y3AtPm1fbmJfbWN0X3JlY29yZHM7KytqKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX3NyY19tY3RfcmVjLT5tX2RhdGEpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2Rlc3RfbWN0X3JlYy0+bV9kYXRhID0gKE9QSl9CWVRFKikgb3BqX21hbGxvYyhsX3NyY19tY3RfcmVjLT5tX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEgbF9kZXN0X21jdF9yZWMtPm1fZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGxfZGVzdF9tY3RfcmVjLT5tX2RhdGEsbF9zcmNfbWN0X3JlYy0+bV9kYXRhLGxfc3JjX21jdF9yZWMtPm1fZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgKytsX3NyY19tY3RfcmVjOworICAgICAgICAgICAgICAgICAgICAgICAgKytsX2Rlc3RfbWN0X3JlYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB3aXRoIGVhY2ggcGFzcyB0byBmcmVlIGV4YWN0bHkgd2hhdCBoYXMgYmVlbiBhbGxvY2F0ZWQgb24gZWFybHkgcmV0dXJuLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgbF90Y3AtPm1fbmJfbWF4X21jdF9yZWNvcmRzICs9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBtY2NfcmVjb3JkIG9mIHRoZSBkZmx0X3RpbGVfY3AgYW5kIGNvcHkgdGhlbSBpbnRvIHRoZSBjdXJyZW50IHRpbGUgY3AqLworICAgICAgICAgICAgICAgIGxfbWNjX3JlY29yZHNfc2l6ZSA9IGxfZGVmYXVsdF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzICogKE9QSl9VSU5UMzIpc2l6ZW9mKG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90KTsKKyAgICAgICAgICAgICAgICBsX3RjcC0+bV9tY2NfcmVjb3JkcyA9IChvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCopIG9wal9tYWxsb2MobF9tY2NfcmVjb3Jkc19zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoISBsX3RjcC0+bV9tY2NfcmVjb3JkcykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVtY3B5KGxfdGNwLT5tX21jY19yZWNvcmRzLGxfZGVmYXVsdF90Y3AtPm1fbWNjX3JlY29yZHMsbF9tY2NfcmVjb3Jkc19zaXplKTsKKyAgICAgICAgICAgICAgICBsX3RjcC0+bV9uYl9tYXhfbWNjX3JlY29yZHMgPSBsX2RlZmF1bHRfdGNwLT5tX25iX21heF9tY2NfcmVjb3JkczsKKworICAgICAgICAgICAgICAgIC8qIENvcHkgdGhlIG1jYyByZWNvcmQgZGF0YSBmcm9tIGRmbHRfdGlsZV9jcCB0byB0aGUgY3VycmVudCB0aWxlKi8KKyAgICAgICAgICAgICAgICBsX3NyY19tY2NfcmVjID0gbF9kZWZhdWx0X3RjcC0+bV9tY2NfcmVjb3JkczsKKyAgICAgICAgICAgICAgICBsX2Rlc3RfbWNjX3JlYyA9IGxfdGNwLT5tX21jY19yZWNvcmRzOworCisgICAgICAgICAgICAgICAgZm9yIChqPTA7ajxsX2RlZmF1bHRfdGNwLT5tX25iX21heF9tY2NfcmVjb3JkczsrK2opIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfc3JjX21jY19yZWMtPm1fZGVjb3JyZWxhdGlvbl9hcnJheSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX29mZnNldCA9IChPUEpfVUlOVDMyKShsX3NyY19tY2NfcmVjLT5tX2RlY29ycmVsYXRpb25fYXJyYXkgLSBsX2RlZmF1bHRfdGNwLT5tX21jdF9yZWNvcmRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9kZXN0X21jY19yZWMtPm1fZGVjb3JyZWxhdGlvbl9hcnJheSA9IGxfdGNwLT5tX21jdF9yZWNvcmRzICsgbF9vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX3NyY19tY2NfcmVjLT5tX29mZnNldF9hcnJheSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX29mZnNldCA9IChPUEpfVUlOVDMyKShsX3NyY19tY2NfcmVjLT5tX29mZnNldF9hcnJheSAtIGxfZGVmYXVsdF90Y3AtPm1fbWN0X3JlY29yZHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2Rlc3RfbWNjX3JlYy0+bV9vZmZzZXRfYXJyYXkgPSBsX3RjcC0+bV9tY3RfcmVjb3JkcyArIGxfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICArK2xfc3JjX21jY19yZWM7CisgICAgICAgICAgICAgICAgICAgICAgICArK2xfZGVzdF9tY2NfcmVjOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIENvcHkgYWxsIHRoZSBkZmx0X3RpbGVfY29tcG9fY3AgdG8gdGhlIGN1cnJlbnQgdGlsZSBjcCAqLworICAgICAgICAgICAgICAgIG1lbWNweShsX2N1cnJlbnRfdGNjcCxsX2RlZmF1bHRfdGNwLT50Y2NwcyxsX3RjY3Bfc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAvKiBNb3ZlIHRvIG5leHQgdGlsZSBjcCovCisgICAgICAgICAgICAgICAgKytsX3RjcDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENyZWF0ZSB0aGUgY3VycmVudCB0aWxlIGRlY29kZXIqLworICAgICAgICBwX2oyay0+bV90Y2QgPSAob3BqX3RjZF90KilvcGpfdGNkX2NyZWF0ZShPUEpfVFJVRSk7IC8qIEZJWE1FIHdoeSBhIGNhc3QgPyAqLworICAgICAgICBpZiAoISBwX2oyay0+bV90Y2QgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggIW9wal90Y2RfaW5pdChwX2oyay0+bV90Y2QsIGxfaW1hZ2UsICYocF9qMmstPm1fY3ApKSApIHsKKyAgICAgICAgICAgICAgICBvcGpfdGNkX2Rlc3Ryb3kocF9qMmstPm1fdGNkKTsKKyAgICAgICAgICAgICAgICBwX2oyay0+bV90Y2QgPSAwMDsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ2Fubm90IGRlY29kZSB0aWxlLCBtZW1vcnkgZXJyb3JcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK3N0YXRpYyBjb25zdCBvcGpfZGVjX21lbW9yeV9tYXJrZXJfaGFuZGxlcl90ICogb3BqX2oya19nZXRfbWFya2VyX2hhbmRsZXIgKE9QSl9VSU5UMzIgcF9pZCkKK3sKKyAgICAgICAgY29uc3Qgb3BqX2RlY19tZW1vcnlfbWFya2VyX2hhbmRsZXJfdCAqZTsKKyAgICAgICAgZm9yIChlID0gajJrX21lbW9yeV9tYXJrZXJfaGFuZGxlcl90YWI7IGUtPmlkICE9IDA7ICsrZSkgeworICAgICAgICAgICAgICAgIGlmIChlLT5pZCA9PSBwX2lkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLyogd2UgZmluZCBhIGhhbmRsZXIgY29ycmVzcG9uZGluZyB0byB0aGUgbWFya2VyIElEKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGU7Cit9CisKK3ZvaWQgb3BqX2oya19kZXN0cm95IChvcGpfajJrX3QgKnBfajJrKQoreworICAgICAgICBpZiAocF9qMmsgPT0gMDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAocF9qMmstPm1faXNfZGVjb2RlcikgeworCisgICAgICAgICAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwICE9IDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfajJrX3RjcF9kZXN0cm95KHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwID0gMDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhICE9IDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSA9IDAwOworICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2VuY29kZWRfdGlsZV9kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfZGF0YSA9IDAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90bG1fc290X29mZnNldHNfYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90bG1fc290X29mZnNldHNfYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zb3Rfb2Zmc2V0c19idWZmZXIgPSAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zb3Rfb2Zmc2V0c19jdXJyZW50ID0gMDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IDAwOworICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvcGpfdGNkX2Rlc3Ryb3kocF9qMmstPm1fdGNkKTsKKworICAgICAgICBvcGpfajJrX2NwX2Rlc3Ryb3koJihwX2oyay0+bV9jcCkpOworICAgICAgICBtZW1zZXQoJihwX2oyay0+bV9jcCksMCxzaXplb2Yob3BqX2NwX3QpKTsKKworICAgICAgICBvcGpfcHJvY2VkdXJlX2xpc3RfZGVzdHJveShwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCk7CisgICAgICAgIHBfajJrLT5tX3Byb2NlZHVyZV9saXN0ID0gMDA7CisKKyAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X2Rlc3Ryb3kocF9qMmstPm1fdmFsaWRhdGlvbl9saXN0KTsKKyAgICAgICAgcF9qMmstPm1fcHJvY2VkdXJlX2xpc3QgPSAwMDsKKworICAgICAgICBqMmtfZGVzdHJveV9jc3RyX2luZGV4KHBfajJrLT5jc3RyX2luZGV4KTsKKyAgICAgICAgcF9qMmstPmNzdHJfaW5kZXggPSBOVUxMOworCisgICAgICAgIG9wal9pbWFnZV9kZXN0cm95KHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UpOworICAgICAgICBwX2oyay0+bV9wcml2YXRlX2ltYWdlID0gTlVMTDsKKworICAgICAgICBvcGpfaW1hZ2VfZGVzdHJveShwX2oyay0+bV9vdXRwdXRfaW1hZ2UpOworICAgICAgICBwX2oyay0+bV9vdXRwdXRfaW1hZ2UgPSBOVUxMOworCisgICAgICAgIG9wal9mcmVlKHBfajJrKTsKK30KKwordm9pZCBqMmtfZGVzdHJveV9jc3RyX2luZGV4IChvcGpfY29kZXN0cmVhbV9pbmRleF90ICpwX2NzdHJfaW5kKQoreworICAgICAgICBpZiAocF9jc3RyX2luZCkgeworCisgICAgICAgICAgICAgICAgaWYgKHBfY3N0cl9pbmQtPm1hcmtlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9jc3RyX2luZC0+bWFya2VyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmQtPm1hcmtlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBfY3N0cl9pbmQtPnRpbGVfaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgaXRfdGlsZSA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaXRfdGlsZT0wOyBpdF90aWxlIDwgcF9jc3RyX2luZC0+bmJfb2ZfdGlsZXM7IGl0X3RpbGUrKykgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBfY3N0cl9pbmQtPnRpbGVfaW5kZXhbaXRfdGlsZV0ucGFja2V0X2luZGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9jc3RyX2luZC0+dGlsZV9pbmRleFtpdF90aWxlXS5wYWNrZXRfaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmQtPnRpbGVfaW5kZXhbaXRfdGlsZV0ucGFja2V0X2luZGV4ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBfY3N0cl9pbmQtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXgpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfY3N0cl9pbmQtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmQtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXggPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocF9jc3RyX2luZC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrZXIpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfY3N0cl9pbmQtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya2VyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NzdHJfaW5kLT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtlciA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZSggcF9jc3RyX2luZC0+dGlsZV9pbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwX2NzdHJfaW5kLT50aWxlX2luZGV4ID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2NzdHJfaW5kKTsKKyAgICAgICAgfQorfQorCitzdGF0aWMgdm9pZCBvcGpfajJrX3RjcF9kZXN0cm95IChvcGpfdGNwX3QgKnBfdGNwKQoreworCWlmIChwX3RjcCA9PSAwMCkgeworCQlyZXR1cm47CisJfQorCQorCWlmIChwX3RjcC0+cHB0X21hcmtlcnMgIT0gMDApIHsKKwkJT1BKX1VJTlQzMiBpOworCQlmb3IgKGkgPSAwVTsgaSA8IHBfdGNwLT5wcHRfbWFya2Vyc19jb3VudDsgKytpKSB7CisJCQlpZiAocF90Y3AtPnBwdF9tYXJrZXJzW2ldLm1fZGF0YSAhPSBOVUxMKSB7CisJCQkJb3BqX2ZyZWUocF90Y3AtPnBwdF9tYXJrZXJzW2ldLm1fZGF0YSk7CisJCQl9CisJCX0KKwkJcF90Y3AtPnBwdF9tYXJrZXJzX2NvdW50ID0gMFU7CisJCW9wal9mcmVlKHBfdGNwLT5wcHRfbWFya2Vycyk7CisJCXBfdGNwLT5wcHRfbWFya2VycyA9IE5VTEw7CisJfQorCQorCWlmIChwX3RjcC0+cHB0X2J1ZmZlciAhPSAwMCkgeworCQlvcGpfZnJlZShwX3RjcC0+cHB0X2J1ZmZlcik7CisJCXBfdGNwLT5wcHRfYnVmZmVyID0gMDA7CisJfQorCQorCWlmIChwX3RjcC0+dGNjcHMgIT0gMDApIHsKKwkJb3BqX2ZyZWUocF90Y3AtPnRjY3BzKTsKKwkJcF90Y3AtPnRjY3BzID0gMDA7CisJfQorCQorCWlmIChwX3RjcC0+bV9tY3RfY29kaW5nX21hdHJpeCAhPSAwMCkgeworCQlvcGpfZnJlZShwX3RjcC0+bV9tY3RfY29kaW5nX21hdHJpeCk7CisJCXBfdGNwLT5tX21jdF9jb2RpbmdfbWF0cml4ID0gMDA7CisJfQorCQorCWlmIChwX3RjcC0+bV9tY3RfZGVjb2RpbmdfbWF0cml4ICE9IDAwKSB7CisJCW9wal9mcmVlKHBfdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgpOworCQlwX3RjcC0+bV9tY3RfZGVjb2RpbmdfbWF0cml4ID0gMDA7CisJfQorCQorCWlmIChwX3RjcC0+bV9tY2NfcmVjb3JkcykgeworCQlvcGpfZnJlZShwX3RjcC0+bV9tY2NfcmVjb3Jkcyk7CisJCXBfdGNwLT5tX21jY19yZWNvcmRzID0gMDA7CisJCXBfdGNwLT5tX25iX21heF9tY2NfcmVjb3JkcyA9IDA7CisJCXBfdGNwLT5tX25iX21jY19yZWNvcmRzID0gMDsKKwl9CisJCisJaWYgKHBfdGNwLT5tX21jdF9yZWNvcmRzKSB7CisJCW9wal9tY3RfZGF0YV90ICogbF9tY3RfZGF0YSA9IHBfdGNwLT5tX21jdF9yZWNvcmRzOworCQlPUEpfVUlOVDMyIGk7CisJCQorCQlmb3IgKGk9MDtpPHBfdGNwLT5tX25iX21jdF9yZWNvcmRzOysraSkgeworCQkJaWYgKGxfbWN0X2RhdGEtPm1fZGF0YSkgeworCQkJCW9wal9mcmVlKGxfbWN0X2RhdGEtPm1fZGF0YSk7CisJCQkJbF9tY3RfZGF0YS0+bV9kYXRhID0gMDA7CisJCQl9CisJCQkKKwkJCSsrbF9tY3RfZGF0YTsKKwkJfQorCQkKKwkJb3BqX2ZyZWUocF90Y3AtPm1fbWN0X3JlY29yZHMpOworCQlwX3RjcC0+bV9tY3RfcmVjb3JkcyA9IDAwOworCX0KKworCWlmIChwX3RjcC0+bWN0X25vcm1zICE9IDAwKSB7CisJCW9wal9mcmVlKHBfdGNwLT5tY3Rfbm9ybXMpOworCQlwX3RjcC0+bWN0X25vcm1zID0gMDA7CisJfQorCisJb3BqX2oya190Y3BfZGF0YV9kZXN0cm95KHBfdGNwKTsKKworfQorCitzdGF0aWMgdm9pZCBvcGpfajJrX3RjcF9kYXRhX2Rlc3Ryb3kgKG9wal90Y3BfdCAqcF90Y3ApCit7CisgICAgICAgIGlmIChwX3RjcC0+bV9kYXRhKSB7CisgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF90Y3AtPm1fZGF0YSk7CisgICAgICAgICAgICAgICAgcF90Y3AtPm1fZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgcF90Y3AtPm1fZGF0YV9zaXplID0gMDsKKyAgICAgICAgfQorfQorCitzdGF0aWMgdm9pZCBvcGpfajJrX2NwX2Rlc3Ryb3kgKG9wal9jcF90ICpwX2NwKQoreworCU9QSl9VSU5UMzIgbF9uYl90aWxlczsKKwlvcGpfdGNwX3QgKiBsX2N1cnJlbnRfdGlsZSA9IDAwOworCisJaWYgKHBfY3AgPT0gMDApCisJeworCQlyZXR1cm47CisJfQorCWlmIChwX2NwLT50Y3BzICE9IDAwKQorCXsKKwkJT1BKX1VJTlQzMiBpOworCQlsX2N1cnJlbnRfdGlsZSA9IHBfY3AtPnRjcHM7CisJCWxfbmJfdGlsZXMgPSBwX2NwLT50aCAqIHBfY3AtPnR3OworCQkKKwkJZm9yIChpID0gMFU7IGkgPCBsX25iX3RpbGVzOyArK2kpCisJCXsKKwkJCW9wal9qMmtfdGNwX2Rlc3Ryb3kobF9jdXJyZW50X3RpbGUpOworCQkJKytsX2N1cnJlbnRfdGlsZTsKKwkJfQorCQlvcGpfZnJlZShwX2NwLT50Y3BzKTsKKwkJcF9jcC0+dGNwcyA9IDAwOworCX0KKwlpZiAocF9jcC0+cHBtX21hcmtlcnMgIT0gMDApIHsKKwkJT1BKX1VJTlQzMiBpOworCQlmb3IgKGkgPSAwVTsgaSA8IHBfY3AtPnBwbV9tYXJrZXJzX2NvdW50OyArK2kpIHsKKwkJCWlmIChwX2NwLT5wcG1fbWFya2Vyc1tpXS5tX2RhdGEgIT0gTlVMTCkgeworCQkJCW9wal9mcmVlKHBfY3AtPnBwbV9tYXJrZXJzW2ldLm1fZGF0YSk7CisJCQl9CisJCX0KKwkJcF9jcC0+cHBtX21hcmtlcnNfY291bnQgPSAwVTsKKwkJb3BqX2ZyZWUocF9jcC0+cHBtX21hcmtlcnMpOworCQlwX2NwLT5wcG1fbWFya2VycyA9IE5VTEw7CisJfQorCW9wal9mcmVlKHBfY3AtPnBwbV9idWZmZXIpOworCXBfY3AtPnBwbV9idWZmZXIgPSAwMDsKKwlwX2NwLT5wcG1fZGF0YSA9IE5VTEw7IC8qIHBwbV9kYXRhIGJlbG9uZ3MgdG8gdGhlIGFsbG9jYXRlZCBidWZmZXIgcG9pbnRlZCBieSBwcG1fYnVmZmVyICovCisJb3BqX2ZyZWUocF9jcC0+Y29tbWVudCk7CisJcF9jcC0+Y29tbWVudCA9IDAwOworCWlmICghIHBfY3AtPm1faXNfZGVjb2RlcikKKwl7CisJCW9wal9mcmVlKHBfY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9tYXRyaWNlKTsKKwkJcF9jcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX21hdHJpY2UgPSAwMDsKKwl9Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX25lZWRfbmJfdGlsZV9wYXJ0c19jb3JyZWN0aW9uKG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwgT1BKX1VJTlQzMiB0aWxlX25vLCBPUEpfQk9PTCogcF9jb3JyZWN0aW9uX25lZWRlZCwgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3sKKwlPUEpfQllURSAgIGxfaGVhZGVyX2RhdGFbMTBdOworCU9QSl9PRkZfVCAgbF9zdHJlYW1fcG9zX2JhY2t1cDsKKwlPUEpfVUlOVDMyIGxfY3VycmVudF9tYXJrZXI7CisJT1BKX1VJTlQzMiBsX21hcmtlcl9zaXplOworCU9QSl9VSU5UMzIgbF90aWxlX25vLCBsX3RvdF9sZW4sIGxfY3VycmVudF9wYXJ0LCBsX251bV9wYXJ0czsKKwkKKwkvKiBpbml0aWFsaXplIHRvIG5vIGNvcnJlY3Rpb24gbmVlZGVkICovCisJKnBfY29ycmVjdGlvbl9uZWVkZWQgPSBPUEpfRkFMU0U7CisJCisJbF9zdHJlYW1fcG9zX2JhY2t1cCA9IG9wal9zdHJlYW1fdGVsbChwX3N0cmVhbSk7CisJaWYgKGxfc3RyZWFtX3Bvc19iYWNrdXAgPT0gLTEpIHsKKwkJLyogbGV0J3MgZG8gbm90aGluZyAqLworCQlyZXR1cm4gT1BKX1RSVUU7CisJfQorCQorCWZvciAoOzspIHsKKwkJLyogVHJ5IHRvIHJlYWQgMiBieXRlcyAodGhlIG5leHQgbWFya2VyIElEKSBmcm9tIHN0cmVhbSBhbmQgY29weSB0aGVtIGludG8gdGhlIGJ1ZmZlciAqLworCQlpZiAob3BqX3N0cmVhbV9yZWFkX2RhdGEocF9zdHJlYW0sbF9oZWFkZXJfZGF0YSwgMiwgcF9tYW5hZ2VyKSAhPSAyKSB7CisJCQkvKiBhc3N1bWUgYWxsIGlzIE9LICovCisJCQlpZiAoISBvcGpfc3RyZWFtX3NlZWsocF9zdHJlYW0sIGxfc3RyZWFtX3Bvc19iYWNrdXAsIHBfbWFuYWdlcikpIHsKKwkJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQkJfQorCQkJcmV0dXJuIE9QSl9UUlVFOworCQl9CisJCQorCQkvKiBSZWFkIDIgYnl0ZXMgZnJvbSBidWZmZXIgYXMgdGhlIG5ldyBtYXJrZXIgSUQgKi8KKwkJb3BqX3JlYWRfYnl0ZXMobF9oZWFkZXJfZGF0YSwgJmxfY3VycmVudF9tYXJrZXIsIDIpOworCQkKKwkJaWYgKGxfY3VycmVudF9tYXJrZXIgIT0gSjJLX01TX1NPVCkgeworCQkJLyogYXNzdW1lIGFsbCBpcyBPSyAqLworCQkJaWYgKCEgb3BqX3N0cmVhbV9zZWVrKHBfc3RyZWFtLCBsX3N0cmVhbV9wb3NfYmFja3VwLCBwX21hbmFnZXIpKSB7CisJCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJCX0KKwkJCXJldHVybiBPUEpfVFJVRTsKKwkJfQorCQkKKwkJLyogVHJ5IHRvIHJlYWQgMiBieXRlcyAodGhlIG1hcmtlciBzaXplKSBmcm9tIHN0cmVhbSBhbmQgY29weSB0aGVtIGludG8gdGhlIGJ1ZmZlciAqLworCQlpZiAob3BqX3N0cmVhbV9yZWFkX2RhdGEocF9zdHJlYW0sIGxfaGVhZGVyX2RhdGEsIDIsIHBfbWFuYWdlcikgIT0gMikgeworCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnRcbiIpOworCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJfQorCQkKKwkJLyogUmVhZCAyIGJ5dGVzIGZyb20gdGhlIGJ1ZmZlciBhcyB0aGUgbWFya2VyIHNpemUgKi8KKwkJb3BqX3JlYWRfYnl0ZXMobF9oZWFkZXJfZGF0YSwgJmxfbWFya2VyX3NpemUsIDIpOworCQkKKwkJLyogQ2hlY2sgbWFya2VyIHNpemUgZm9yIFNPVCBNYXJrZXIgKi8KKwkJaWYgKGxfbWFya2VyX3NpemUgIT0gMTApIHsKKwkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJJbmNvbnNpc3RlbnQgbWFya2VyIHNpemVcbiIpOworCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJfQorCQlsX21hcmtlcl9zaXplIC09IDI7CisJCQorCQlpZiAob3BqX3N0cmVhbV9yZWFkX2RhdGEocF9zdHJlYW0sIGxfaGVhZGVyX2RhdGEsIGxfbWFya2VyX3NpemUsIHBfbWFuYWdlcikgIT0gbF9tYXJrZXJfc2l6ZSkgeworCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnRcbiIpOworCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJfQorCQkKKwkJaWYgKCEgb3BqX2oya19nZXRfc290X3ZhbHVlcyhsX2hlYWRlcl9kYXRhLCBsX21hcmtlcl9zaXplLCAmbF90aWxlX25vLCAmbF90b3RfbGVuLCAmbF9jdXJyZW50X3BhcnQsICZsX251bV9wYXJ0cywgcF9tYW5hZ2VyKSkgeworCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJfQorCQkKKwkJaWYgKGxfdGlsZV9ubyA9PSB0aWxlX25vKSB7CisJCQkvKiB3ZSBmb3VuZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3IgKi8KKwkJCWJyZWFrOworCQl9CisJCQorCQlpZiAoKGxfdG90X2xlbiA9PSAwVSkgfHwgKGxfdG90X2xlbiA8IDE0VSkpIHsKKwkJCS8qIGxhc3QgU09UIHVudGlsIEVPQyBvciBpbnZhbGlkIFBzb3QgdmFsdWUgKi8KKwkJCS8qIGFzc3VtZSBhbGwgaXMgT0sgKi8KKwkJCWlmICghIG9wal9zdHJlYW1fc2VlayhwX3N0cmVhbSwgbF9zdHJlYW1fcG9zX2JhY2t1cCwgcF9tYW5hZ2VyKSkgeworCQkJCXJldHVybiBPUEpfRkFMU0U7CisJCQl9CisJCQlyZXR1cm4gT1BKX1RSVUU7CisJCX0KKwkJbF90b3RfbGVuIC09IDEyVTsKKwkJLyogbG9vayBmb3IgbmV4dCBTT1QgbWFya2VyICovCisJCWlmIChvcGpfc3RyZWFtX3NraXAocF9zdHJlYW0sIChPUEpfT0ZGX1QpKGxfdG90X2xlbiksIHBfbWFuYWdlcikgIT0gKE9QSl9PRkZfVCkobF90b3RfbGVuKSkgeworCQkJLyogYXNzdW1lIGFsbCBpcyBPSyAqLworCQkJaWYgKCEgb3BqX3N0cmVhbV9zZWVrKHBfc3RyZWFtLCBsX3N0cmVhbV9wb3NfYmFja3VwLCBwX21hbmFnZXIpKSB7CisJCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJCX0KKwkJCXJldHVybiBPUEpfVFJVRTsKKwkJfQorCX0KKwkKKwkvKiBjaGVjayBmb3IgY29ycmVjdGlvbiAqLworCWlmIChsX2N1cnJlbnRfcGFydCA9PSBsX251bV9wYXJ0cykgeworCQkqcF9jb3JyZWN0aW9uX25lZWRlZCA9IE9QSl9UUlVFOworCX0KKwkKKwlpZiAoISBvcGpfc3RyZWFtX3NlZWsocF9zdHJlYW0sIGxfc3RyZWFtX3Bvc19iYWNrdXAsIHBfbWFuYWdlcikpIHsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisJcmV0dXJuIE9QSl9UUlVFOworfQorCitPUEpfQk9PTCBvcGpfajJrX3JlYWRfdGlsZV9oZWFkZXIoICAgICAgb3BqX2oya190ICogcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX3RpbGVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90aWxlX3gwLCBPUEpfSU5UMzIgKiBwX3RpbGVfeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV94MSwgT1BKX0lOVDMyICogcF90aWxlX3kxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9uYl9jb21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JPT0wgKiBwX2dvX29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCit7CisgICAgICAgIE9QSl9VSU5UMzIgbF9jdXJyZW50X21hcmtlciA9IEoyS19NU19TT1Q7CisgICAgICAgIE9QSl9VSU5UMzIgbF9tYXJrZXJfc2l6ZTsKKyAgICAgICAgY29uc3Qgb3BqX2RlY19tZW1vcnlfbWFya2VyX2hhbmRsZXJfdCAqIGxfbWFya2VyX2hhbmRsZXIgPSAwMDsKKyAgICAgICAgb3BqX3RjcF90ICogbF90Y3AgPSBOVUxMOworCisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisKKyAgICAgICAgLyogUmVhY2ggdGhlIEVuZCBPZiBDb2Rlc3RyZWFtID8qLworICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPT0gSjJLX1NUQVRFX0VPQyl7CisgICAgICAgICAgICAgICAgbF9jdXJyZW50X21hcmtlciA9IEoyS19NU19FT0M7CisgICAgICAgIH0KKyAgICAgICAgLyogV2UgbmVlZCB0byBlbmNvdW50ZXIgYSBTT1QgbWFya2VyIChhIG5ldyB0aWxlLXBhcnQgaGVhZGVyKSAqLworICAgICAgICBlbHNlIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSAhPSBKMktfU1RBVEVfVFBIU09UKXsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLyogUmVhZCBpbnRvIHRoZSBjb2Rlc3RyZWFtIHVudGlsIHJlYWNoIHRoZSBFT0Mgb3IgISBjYW5fZGVjb2RlID8/PyBGSVhNRSAqLworICAgICAgICB3aGlsZSAoICghcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fY2FuX2RlY29kZSkgJiYgKGxfY3VycmVudF9tYXJrZXIgIT0gSjJLX01TX0VPQykgKSB7CisKKyAgICAgICAgICAgICAgICAvKiBUcnkgdG8gcmVhZCB1bnRpbCB0aGUgU3RhcnQgT2YgRGF0YSBpcyBkZXRlY3RlZCAqLworICAgICAgICAgICAgICAgIHdoaWxlIChsX2N1cnJlbnRfbWFya2VyICE9IEoyS19NU19TT0QpIHsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmKG9wal9zdHJlYW1fZ2V0X251bWJlcl9ieXRlX2xlZnQocF9zdHJlYW0pID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID0gSjJLX1NUQVRFX05FT0M7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcnkgdG8gcmVhZCAyIGJ5dGVzICh0aGUgbWFya2VyIHNpemUpIGZyb20gc3RyZWFtIGFuZCBjb3B5IHRoZW0gaW50byB0aGUgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BqX3N0cmVhbV9yZWFkX2RhdGEocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsMixwX21hbmFnZXIpICE9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWFkIDIgYnl0ZXMgZnJvbSB0aGUgYnVmZmVyIGFzIHRoZSBtYXJrZXIgc2l6ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsJmxfbWFya2VyX3NpemUsMik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIG1hcmtlciBzaXplIChkb2VzIG5vdCBpbmNsdWRlIG1hcmtlciBJRCBidXQgaW5jbHVkZXMgbWFya2VyIHNpemUpICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9tYXJrZXJfc2l6ZSA8IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkluY29uc2lzdGVudCBtYXJrZXIgc2l6ZVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNmLiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL29wZW5qcGVnL2lzc3Vlcy9kZXRhaWw/aWQ9MjI2ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9jdXJyZW50X21hcmtlciA9PSAweDgwODAgJiYgb3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdChwX3N0cmVhbSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9IEoyS19TVEFURV9ORU9DOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogV2h5IHRoaXMgY29uZGl0aW9uPyBGSVhNRSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlICYgSjJLX1NUQVRFX1RQSCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGggLT0gKGxfbWFya2VyX3NpemUgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxfbWFya2VyX3NpemUgLT0gMjsgLyogU3VidHJhY3QgdGhlIHNpemUgb2YgdGhlIG1hcmtlciBJRCBhbHJlYWR5IHJlYWQgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBtYXJrZXIgaGFuZGxlciBmcm9tIHRoZSBtYXJrZXIgSUQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxfbWFya2VyX2hhbmRsZXIgPSBvcGpfajJrX2dldF9tYXJrZXJfaGFuZGxlcihsX2N1cnJlbnRfbWFya2VyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIG1hcmtlciBpcyBrbm93biBhbmQgaWYgaXQgaXMgdGhlIHJpZ2h0IHBsYWNlIHRvIGZpbmQgaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSAmIGxfbWFya2VyX2hhbmRsZXItPnN0YXRlcykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJNYXJrZXIgaXMgbm90IGNvbXBsaWFudCB3aXRoIGl0cyBwb3NpdGlvblxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisvKiBGSVhNRSBtYW5hZ2UgY2FzZSBvZiB1bmtub3duIG1hcmtlciBhcyBpbiB0aGUgbWFpbiBoZWFkZXIgPyAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgbWFya2VyIHNpemUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBoZWFkZXIgZGF0YSBzaXplICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9tYXJrZXJfc2l6ZSA+IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKm5ld19oZWFkZXJfZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHdlIGFyZSBoZXJlLCB0aGlzIG1lYW5zIHdlIGNvbnNpZGVyIHRoaXMgbWFya2VyIGFzIGtub3duICYgd2Ugd2lsbCByZWFkIGl0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGVub3VnaCBieXRlcyBsZWZ0IGluIHN0cmVhbSBiZWZvcmUgYWxsb2NhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKE9QSl9PRkZfVClsX21hcmtlcl9zaXplID4gIG9wal9zdHJlYW1fZ2V0X251bWJlcl9ieXRlX2xlZnQocF9zdHJlYW0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk1hcmtlciBzaXplIGluY29uc2lzdGVudCB3aXRoIHN0cmVhbSBsZW5ndGhcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2hlYWRlcl9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLCBsX21hcmtlcl9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmV3X2hlYWRlcl9kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBoZWFkZXJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEgPSBuZXdfaGVhZGVyX2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhX3NpemUgPSBsX21hcmtlcl9zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcnkgdG8gcmVhZCB0aGUgcmVzdCBvZiB0aGUgbWFya2VyIHNlZ21lbnQgZnJvbSBzdHJlYW0gYW5kIGNvcHkgdGhlbSBpbnRvIHRoZSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGpfc3RyZWFtX3JlYWRfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSxsX21hcmtlcl9zaXplLHBfbWFuYWdlcikgIT0gbF9tYXJrZXJfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIHRvbyBzaG9ydFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbF9tYXJrZXJfaGFuZGxlci0+aGFuZGxlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWUgaXNzdWUgIzE3NSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IHN1cmUgaG93IHRoYXQgaGFwcGVuZWQuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlYWQgdGhlIG1hcmtlciBzZWdtZW50IHdpdGggdGhlIGNvcnJlY3QgbWFya2VyIGhhbmRsZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghICgqKGxfbWFya2VyX2hhbmRsZXItPmhhbmRsZXIpKShwX2oyayxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSxsX21hcmtlcl9zaXplLHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWwgdG8gcmVhZCB0aGUgY3VycmVudCBtYXJrZXIgc2VnbWVudCAoJSN4KVxuIiwgbF9jdXJyZW50X21hcmtlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkZCB0aGUgbWFya2VyIHRvIHRoZSBjb2Rlc3RyZWFtIGluZGV4Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPUEpfRkFMU0UgPT0gb3BqX2oya19hZGRfdGxtYXJrZXIocF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9tYXJrZXJfaGFuZGxlci0+aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMikgb3BqX3N0cmVhbV90ZWxsKHBfc3RyZWFtKSAtIGxfbWFya2VyX3NpemUgLSA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9tYXJrZXJfc2l6ZSArIDQgKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWRkIHRsIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEtlZXAgdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0IFNPVCBtYXJrZXIgcmVhZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBsX21hcmtlcl9oYW5kbGVyLT5pZCA9PSBKMktfTVNfU09UICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHNvdF9wb3MgPSAoT1BKX1VJTlQzMikgb3BqX3N0cmVhbV90ZWxsKHBfc3RyZWFtKSAtIGxfbWFya2VyX3NpemUgLSA0IDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdF9wb3MgPiBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9sYXN0X3NvdF9yZWFkX3BvcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2xhc3Rfc290X3JlYWRfcG9zID0gc290X3BvczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc2tpcF9kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNraXAgdGhlIHJlc3Qgb2YgdGhlIHRpbGUgcGFydCBoZWFkZXIqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BqX3N0cmVhbV9za2lwKHBfc3RyZWFtLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGgscF9tYW5hZ2VyKSAhPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X21hcmtlciA9IEoyS19NU19TT0Q7IC8qIE5vcm1hbGx5IHdlIHJlYWNoZWQgYSBTT0QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcnkgdG8gcmVhZCAyIGJ5dGVzICh0aGUgbmV4dCBtYXJrZXIgSUQpIGZyb20gc3RyZWFtIGFuZCBjb3B5IHRoZW0gaW50byB0aGUgYnVmZmVyKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wal9zdHJlYW1fcmVhZF9kYXRhKHBfc3RyZWFtLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLDIscF9tYW5hZ2VyKSAhPSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVhZCAyIGJ5dGVzIGZyb20gdGhlIGJ1ZmZlciBhcyB0aGUgbmV3IG1hcmtlciBJRCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSwmbF9jdXJyZW50X21hcmtlciwyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYob3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdChwX3N0cmVhbSkgPT0gMAorICAgICAgICAgICAgICAgICAgICAmJiBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9PSBKMktfU1RBVEVfTkVPQykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvKiBJZiB3ZSBkaWRuJ3Qgc2tpcCBkYXRhIGJlZm9yZSwgd2UgbmVlZCB0byByZWFkIHRoZSBTT0QgbWFya2VyKi8KKyAgICAgICAgICAgICAgICBpZiAoISBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9za2lwX2RhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyeSB0byByZWFkIHRoZSBTT0QgbWFya2VyIGFuZCBza2lwIGRhdGEgPyBGSVhNRSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgb3BqX2oya19yZWFkX3NvZChwX2oyaywgcF9zdHJlYW0sIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9jYW5fZGVjb2RlICYmICFwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9uYl90aWxlX3BhcnRzX2NvcnJlY3Rpb25fY2hlY2tlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJc3N1ZSAyNTQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JPT0wgbF9jb3JyZWN0aW9uX25lZWRlZDsKKwkJCQkJCQkJCQkJCQkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fbmJfdGlsZV9wYXJ0c19jb3JyZWN0aW9uX2NoZWNrZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighb3BqX2oya19uZWVkX25iX3RpbGVfcGFydHNfY29ycmVjdGlvbihwX3N0cmVhbSwgcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciwgJmxfY29ycmVjdGlvbl9uZWVkZWQsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAib3BqX2oya19hcHBseV9uYl90aWxlX3BhcnRzX2NvcnJlY3Rpb24gZXJyb3JcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfY29ycmVjdGlvbl9uZWVkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxfbmJfdGlsZXMgPSBwX2oyay0+bV9jcC50dyAqIHBfajJrLT5tX2NwLnRoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbF90aWxlX25vOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fY2FuX2RlY29kZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fbmJfdGlsZV9wYXJ0c19jb3JyZWN0aW9uID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3JyZWN0IHRpbGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsX3RpbGVfbm8gPSAwVTsgbF90aWxlX25vIDwgbF9uYl90aWxlczsgKytsX3RpbGVfbm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwX2oyay0+bV9jcC50Y3BzW2xfdGlsZV9ub10ubV9uYl90aWxlX3BhcnRzICE9IDBVKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX2NwLnRjcHNbbF90aWxlX25vXS5tX25iX3RpbGVfcGFydHMrPTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIk5vbiBjb25mb3JtYW50IGNvZGVzdHJlYW0gVFBzb3Q9PVROc290LlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2Nhbl9kZWNvZGUpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcnkgdG8gcmVhZCAyIGJ5dGVzICh0aGUgbmV4dCBtYXJrZXIgSUQpIGZyb20gc3RyZWFtIGFuZCBjb3B5IHRoZW0gaW50byB0aGUgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGpfc3RyZWFtX3JlYWRfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSwyLHBfbWFuYWdlcikgIT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJTdHJlYW0gdG9vIHNob3J0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVhZCAyIGJ5dGVzIGZyb20gYnVmZmVyIGFzIHRoZSBuZXcgbWFya2VyIElEICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLCZsX2N1cnJlbnRfbWFya2VyLDIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluZGljYXRlIHdlIHdpbGwgdHJ5IHRvIHJlYWQgYSBuZXcgdGlsZS1wYXJ0IGhlYWRlciovCisgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9za2lwX2RhdGEgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fY2FuX2RlY29kZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9IEoyS19TVEFURV9UUEhTT1Q7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyeSB0byByZWFkIDIgYnl0ZXMgKHRoZSBuZXh0IG1hcmtlciBJRCkgZnJvbSBzdHJlYW0gYW5kIGNvcHkgdGhlbSBpbnRvIHRoZSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGpfc3RyZWFtX3JlYWRfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSwyLHBfbWFuYWdlcikgIT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIHRvbyBzaG9ydFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlYWQgMiBieXRlcyBmcm9tIGJ1ZmZlciBhcyB0aGUgbmV3IG1hcmtlciBJRCAqLworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsJmxfY3VycmVudF9tYXJrZXIsMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ3VycmVudCBtYXJrZXIgaXMgdGhlIEVPQyBtYXJrZXIgPyovCisgICAgICAgIGlmIChsX2N1cnJlbnRfbWFya2VyID09IEoyS19NU19FT0MpIHsKKyAgICAgICAgICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgIT0gSjJLX1NUQVRFX0VPQyApeworICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9IEoyS19TVEFURV9FT0M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogRklYTUUgRE9DID8/PyovCisgICAgICAgIGlmICggISBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9jYW5fZGVjb2RlKSB7CisgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsX25iX3RpbGVzID0gcF9qMmstPm1fY3AudGggKiBwX2oyay0+bV9jcC50dzsKKyAgICAgICAgICAgICAgICBsX3RjcCA9IHBfajJrLT5tX2NwLnRjcHMgKyBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyOworCisgICAgICAgICAgICAgICAgd2hpbGUoIChwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyIDwgbF9uYl90aWxlcykgJiYgKGxfdGNwLT5tX2RhdGEgPT0gMDApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgKytwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgKytsX3RjcDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciA9PSBsX25iX3RpbGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF9nb19vbiA9IE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoISBvcGpfajJrX21lcmdlX3BwdChwX2oyay0+bV9jcC50Y3BzICsgcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciwgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gbWVyZ2UgUFBUIGRhdGFcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgLypGSVhNRSA/Pz8qLworICAgICAgICBpZiAoISBvcGpfdGNkX2luaXRfZGVjb2RlX3RpbGUocF9qMmstPm1fdGNkLCBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkNhbm5vdCBkZWNvZGUgdGlsZSwgbWVtb3J5IGVycm9yXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9JTkZPLCAiSGVhZGVyIG9mIHRpbGUgJWQgLyAlZCBoYXMgYmVlbiByZWFkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIrMSwgKHBfajJrLT5tX2NwLnRoICogcF9qMmstPm1fY3AudHcpKTsKKworICAgICAgICAqcF90aWxlX2luZGV4ID0gcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcjsKKyAgICAgICAgKnBfZ29fb24gPSBPUEpfVFJVRTsKKyAgICAgICAgKnBfZGF0YV9zaXplID0gb3BqX3RjZF9nZXRfZGVjb2RlZF90aWxlX3NpemUocF9qMmstPm1fdGNkKTsKKyAgICAgICAgKnBfdGlsZV94MCA9IHBfajJrLT5tX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+eDA7CisgICAgICAgICpwX3RpbGVfeTAgPSBwX2oyay0+bV90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPnkwOworICAgICAgICAqcF90aWxlX3gxID0gcF9qMmstPm1fdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT54MTsKKyAgICAgICAgKnBfdGlsZV95MSA9IHBfajJrLT5tX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+eTE7CisgICAgICAgICpwX25iX2NvbXBzID0gcF9qMmstPm1fdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT5udW1jb21wczsKKworICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgfD0gMHgwMDgwOy8qIEZJWE1FIEoyS19ERUNfU1RBVEVfREFUQTsqLworCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworT1BKX0JPT0wgb3BqX2oya19kZWNvZGVfdGlsZSAoICBvcGpfajJrX3QgKiBwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCit7CisgICAgICAgIE9QSl9VSU5UMzIgbF9jdXJyZW50X21hcmtlcjsKKyAgICAgICAgT1BKX0JZVEUgbF9kYXRhIFsyXTsKKyAgICAgICAgb3BqX3RjcF90ICogbF90Y3A7CisKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworICAgICAgICBpZiAoICEocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgJiAweDAwODAvKkZJWE1FIEoyS19ERUNfU1RBVEVfREFUQSovKQorICAgICAgICAgICAgICAgIHx8IChwX3RpbGVfaW5kZXggIT0gcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcikgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGxfdGNwID0gJihwX2oyay0+bV9jcC50Y3BzW3BfdGlsZV9pbmRleF0pOworICAgICAgICBpZiAoISBsX3RjcC0+bV9kYXRhKSB7CisgICAgICAgICAgICAgICAgb3BqX2oya190Y3BfZGVzdHJveShsX3RjcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghIG9wal90Y2RfZGVjb2RlX3RpbGUoICAgICAgcF9qMmstPm1fdGNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNwLT5tX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90Y3AtPm1fZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdGlsZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleCwgcF9tYW5hZ2VyKSApIHsKKyAgICAgICAgICAgICAgICBvcGpfajJrX3RjcF9kZXN0cm95KGxfdGNwKTsKKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSB8PSAweDgwMDA7LypGSVhNRSBKMktfREVDX1NUQVRFX0VSUjsqLworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gZGVjb2RlLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghIG9wal90Y2RfdXBkYXRlX3RpbGVfZGF0YShwX2oyay0+bV90Y2QscF9kYXRhLHBfZGF0YV9zaXplKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICAvKiBUbyBhdm9pZCB0byBkZXN0cm95IHRoZSB0Y3Agd2hpY2ggY2FuIGJlIHVzZWZ1bCB3aGVuIHdlIHRyeSB0byBkZWNvZGUgYSB0aWxlIGRlY29kZWQgYmVmb3JlIChjZiBqMmtfcmFuZG9tX3RpbGVfYWNjZXNzKQorICAgICAgICAgKiB3ZSBkZXN0cm95IGp1c3QgdGhlIGRhdGEgd2hpY2ggd2lsbCBiZSByZS1yZWFkIGluIHJlYWRfdGlsZV9oZWFkZXIqLworICAgICAgICAvKm9wal9qMmtfdGNwX2Rlc3Ryb3kobF90Y3ApOworICAgICAgICBwX2oyay0+bV90Y2QtPnRjcCA9IDA7Ki8KKyAgICAgICAgb3BqX2oya190Y3BfZGF0YV9kZXN0cm95KGxfdGNwKTsKKworICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9jYW5fZGVjb2RlID0gMDsKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgJj0gKH4gKDB4MDA4MHUpKTsvKiBGSVhNRSBKMktfREVDX1NUQVRFX0RBVEEpOyovCisKKyAgICAgICAgaWYob3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdChwX3N0cmVhbSkgPT0gMCAKKyAgICAgICAgICAgICYmIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IEoyS19TVEFURV9ORU9DKXsKKyAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSAhPSAweDAxMDApeyAvKkZJWE1FIEoyS19ERUNfU1RBVEVfRU9DKSovCisgICAgICAgICAgICAgICAgaWYgKG9wal9zdHJlYW1fcmVhZF9kYXRhKHBfc3RyZWFtLGxfZGF0YSwyLHBfbWFuYWdlcikgIT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhsX2RhdGEsJmxfY3VycmVudF9tYXJrZXIsMik7CisKKyAgICAgICAgICAgICAgICBpZiAobF9jdXJyZW50X21hcmtlciA9PSBKMktfTVNfRU9DKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID0gIDB4MDEwMDsvKkZJWE1FIEoyS19ERUNfU1RBVEVfRU9DOyovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxfY3VycmVudF9tYXJrZXIgIT0gSjJLX01TX1NPVCkKKyAgICAgICAgICAgICAgICB7ICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYob3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdChwX3N0cmVhbSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID0gSjJLX1NUQVRFX05FT0M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiU3RyZWFtIGRvZXMgbm90IGVuZCB3aXRoIEVPQ1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnQsIGV4cGVjdGVkIFNPVFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfdXBkYXRlX2ltYWdlX2RhdGEgKG9wal90Y2RfdCAqIHBfdGNkLCBPUEpfQllURSAqIHBfZGF0YSwgb3BqX2ltYWdlX3QqIHBfb3V0cHV0X2ltYWdlKQoreworICAgICAgICBPUEpfVUlOVDMyIGksaixrID0gMDsKKyAgICAgICAgT1BKX1VJTlQzMiBsX3dpZHRoX3NyYyxsX2hlaWdodF9zcmM7CisgICAgICAgIE9QSl9VSU5UMzIgbF93aWR0aF9kZXN0LGxfaGVpZ2h0X2Rlc3Q7CisgICAgICAgIE9QSl9JTlQzMiBsX29mZnNldF94MF9zcmMsIGxfb2Zmc2V0X3kwX3NyYywgbF9vZmZzZXRfeDFfc3JjLCBsX29mZnNldF95MV9zcmM7CisgICAgICAgIE9QSl9TSVpFX1QgbF9zdGFydF9vZmZzZXRfc3JjLCBsX2xpbmVfb2Zmc2V0X3NyYywgbF9lbmRfb2Zmc2V0X3NyYyA7CisgICAgICAgIE9QSl9VSU5UMzIgbF9zdGFydF94X2Rlc3QgLCBsX3N0YXJ0X3lfZGVzdDsKKyAgICAgICAgT1BKX1VJTlQzMiBsX3gwX2Rlc3QsIGxfeTBfZGVzdCwgbF94MV9kZXN0LCBsX3kxX2Rlc3Q7CisgICAgICAgIE9QSl9TSVpFX1QgbF9zdGFydF9vZmZzZXRfZGVzdCwgbF9saW5lX29mZnNldF9kZXN0OworCisgICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wX3NyYyA9IDAwOworICAgICAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcF9kZXN0ID0gMDA7CisKKyAgICAgICAgb3BqX3RjZF90aWxlY29tcF90ICogbF90aWxlYyA9IDAwOworICAgICAgICBvcGpfaW1hZ2VfdCAqIGxfaW1hZ2Vfc3JjID0gMDA7CisgICAgICAgIE9QSl9VSU5UMzIgbF9zaXplX2NvbXAsIGxfcmVtYWluaW5nOworICAgICAgICBPUEpfSU5UMzIgKiBsX2Rlc3RfcHRyOworICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCogbF9yZXM9IDAwOworCisgICAgICAgIGxfdGlsZWMgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+Y29tcHM7CisgICAgICAgIGxfaW1hZ2Vfc3JjID0gcF90Y2QtPmltYWdlOworICAgICAgICBsX2ltZ19jb21wX3NyYyA9IGxfaW1hZ2Vfc3JjLT5jb21wczsKKworICAgICAgICBsX2ltZ19jb21wX2Rlc3QgPSBwX291dHB1dF9pbWFnZS0+Y29tcHM7CisKKyAgICAgICAgZm9yIChpPTA7IGk8bF9pbWFnZV9zcmMtPm51bWNvbXBzOyBpKyspIHsKKworICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIG91dHB1dCBjb21wb25lbnQgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICAgICAgICAgIGlmICghbF9pbWdfY29tcF9kZXN0LT5kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgd2lkdGggPSBsX2ltZ19jb21wX2Rlc3QtPnc7CisgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgaGVpZ2h0ID0gbF9pbWdfY29tcF9kZXN0LT5oOworICAgICAgICAgICAgICAgICAgICBjb25zdCBPUEpfVUlOVDMyIE1BWF9TSVpFID0gVUlOVDMyX01BWCAvIHNpemVvZihPUEpfSU5UMzIpOworICAgICAgICAgICAgICAgICAgICBpZiAoaGVpZ2h0ID09IDAgfHwgd2lkdGggPiBNQVhfU0laRSAvIGhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsX2ltZ19jb21wX2Rlc3QtPmRhdGEgPSAoT1BKX0lOVDMyKilvcGpfY2FsbG9jKHdpZHRoICogaGVpZ2h0LCBzaXplb2YoT1BKX0lOVDMyKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghbF9pbWdfY29tcF9kZXN0LT5kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogQ29weSBpbmZvIGZyb20gZGVjb2RlZCBjb21wIGltYWdlIHRvIG91dHB1dCBpbWFnZSAqLworICAgICAgICAgICAgICAgIGxfaW1nX2NvbXBfZGVzdC0+cmVzbm9fZGVjb2RlZCA9IGxfaW1nX2NvbXBfc3JjLT5yZXNub19kZWNvZGVkOworCisgICAgICAgICAgICAgICAgLyotLS0tLSovCisgICAgICAgICAgICAgICAgLyogQ29tcHV0ZSB0aGUgcHJlY2lzaW9uIG9mIHRoZSBvdXRwdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgbF9zaXplX2NvbXAgPSBsX2ltZ19jb21wX3NyYy0+cHJlYyA+PiAzOyAvKigvIDgpKi8KKyAgICAgICAgICAgICAgICBsX3JlbWFpbmluZyA9IGxfaW1nX2NvbXBfc3JjLT5wcmVjICYgNzsgIC8qICglOCkgKi8KKyAgICAgICAgICAgICAgICBsX3JlcyA9IGxfdGlsZWMtPnJlc29sdXRpb25zICsgbF9pbWdfY29tcF9zcmMtPnJlc25vX2RlY29kZWQ7CisKKyAgICAgICAgICAgICAgICBpZiAobF9yZW1haW5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrbF9zaXplX2NvbXA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxfc2l6ZV9jb21wID09IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfc2l6ZV9jb21wID0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyotLS0tLSovCisKKyAgICAgICAgICAgICAgICAvKiBDdXJyZW50IHRpbGUgY29tcG9uZW50IHNpemUqLworICAgICAgICAgICAgICAgIC8qaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiU1JDOiBsX3Jlc194MD0lZCwgbF9yZXNfeDE9JWQsIGxfcmVzX3kwPSVkLCBsX3Jlc195MT0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9yZXMtPngwLCBsX3Jlcy0+eDEsIGxfcmVzLT55MCwgbF9yZXMtPnkxKTsKKyAgICAgICAgICAgICAgICB9Ki8KKworICAgICAgICAgICAgICAgIGxfd2lkdGhfc3JjID0gKE9QSl9VSU5UMzIpKGxfcmVzLT54MSAtIGxfcmVzLT54MCk7CisgICAgICAgICAgICAgICAgbF9oZWlnaHRfc3JjID0gKE9QSl9VSU5UMzIpKGxfcmVzLT55MSAtIGxfcmVzLT55MCk7CisKKyAgICAgICAgICAgICAgICAvKiBCb3JkZXIgb2YgdGhlIGN1cnJlbnQgb3V0cHV0IGNvbXBvbmVudCovCisgICAgICAgICAgICAgICAgbF94MF9kZXN0ID0gb3BqX3VpbnRfY2VpbGRpdnBvdzIobF9pbWdfY29tcF9kZXN0LT54MCwgbF9pbWdfY29tcF9kZXN0LT5mYWN0b3IpOworICAgICAgICAgICAgICAgIGxfeTBfZGVzdCA9IG9wal91aW50X2NlaWxkaXZwb3cyKGxfaW1nX2NvbXBfZGVzdC0+eTAsIGxfaW1nX2NvbXBfZGVzdC0+ZmFjdG9yKTsKKyAgICAgICAgICAgICAgICBsX3gxX2Rlc3QgPSBsX3gwX2Rlc3QgKyBsX2ltZ19jb21wX2Rlc3QtPnc7IC8qIGNhbid0IG92ZXJmbG93IGdpdmVuIHRoYXQgaW1hZ2UtPngxIGlzIHVpbnQzMiAqLworICAgICAgICAgICAgICAgIGxfeTFfZGVzdCA9IGxfeTBfZGVzdCArIGxfaW1nX2NvbXBfZGVzdC0+aDsKKworICAgICAgICAgICAgICAgIC8qaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiREVTVDogbF94MF9kZXN0PSVkLCBsX3gxX2Rlc3Q9JWQsIGxfeTBfZGVzdD0lZCwgbF95MV9kZXN0PSVkICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfeDBfZGVzdCwgbF94MV9kZXN0LCBsX3kwX2Rlc3QsIGxfeTFfZGVzdCwgbF9pbWdfY29tcF9kZXN0LT5mYWN0b3IgKTsKKyAgICAgICAgICAgICAgICB9Ki8KKworICAgICAgICAgICAgICAgIC8qLS0tLS0qLworICAgICAgICAgICAgICAgIC8qIENvbXB1dGUgdGhlIGFyZWEgKGxfb2Zmc2V0X3gwX3NyYywgbF9vZmZzZXRfeTBfc3JjLCBsX29mZnNldF94MV9zcmMsIGxfb2Zmc2V0X3kxX3NyYykKKyAgICAgICAgICAgICAgICAgKiBvZiB0aGUgaW5wdXQgYnVmZmVyIChkZWNvZGVkIHRpbGUgY29tcG9uZW50KSB3aGljaCB3aWxsIGJlIG1vdmUKKyAgICAgICAgICAgICAgICAgKiBpbiB0aGUgb3V0cHV0IGJ1ZmZlci4gQ29tcHV0ZSB0aGUgYXJlYSBvZiB0aGUgb3V0cHV0IGJ1ZmZlciAobF9zdGFydF94X2Rlc3QsCisgICAgICAgICAgICAgICAgICogbF9zdGFydF95X2Rlc3QsIGxfd2lkdGhfZGVzdCwgbF9oZWlnaHRfZGVzdCkgIHdoaWNoIHdpbGwgYmUgbW9kaWZpZWQKKyAgICAgICAgICAgICAgICAgKiBieSB0aGlzIGlucHV0IGFyZWEuCisgICAgICAgICAgICAgICAgICogKi8KKyAgICAgICAgICAgICAgICBhc3NlcnQoIGxfcmVzLT54MCA+PSAwKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIGxfcmVzLT54MSA+PSAwKTsKKyAgICAgICAgICAgICAgICBpZiAoIGxfeDBfZGVzdCA8IChPUEpfVUlOVDMyKWxfcmVzLT54MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfc3RhcnRfeF9kZXN0ID0gKE9QSl9VSU5UMzIpbF9yZXMtPngwIC0gbF94MF9kZXN0OworICAgICAgICAgICAgICAgICAgICAgICAgbF9vZmZzZXRfeDBfc3JjID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBsX3gxX2Rlc3QgPj0gKE9QSl9VSU5UMzIpbF9yZXMtPngxICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3dpZHRoX2Rlc3QgPSBsX3dpZHRoX3NyYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9vZmZzZXRfeDFfc3JjID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3dpZHRoX2Rlc3QgPSBsX3gxX2Rlc3QgLSAoT1BKX1VJTlQzMilsX3Jlcy0+eDAgOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX29mZnNldF94MV9zcmMgPSAoT1BKX0lOVDMyKShsX3dpZHRoX3NyYyAtIGxfd2lkdGhfZGVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbF9zdGFydF94X2Rlc3QgPSAwVTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfb2Zmc2V0X3gwX3NyYyA9IChPUEpfSU5UMzIpbF94MF9kZXN0IC0gbF9yZXMtPngwOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGxfeDFfZGVzdCA+PSAoT1BKX1VJTlQzMilsX3Jlcy0+eDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfd2lkdGhfZGVzdCA9IGxfd2lkdGhfc3JjIC0gKE9QSl9VSU5UMzIpbF9vZmZzZXRfeDBfc3JjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX29mZnNldF94MV9zcmMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfd2lkdGhfZGVzdCA9IGxfaW1nX2NvbXBfZGVzdC0+dyA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfb2Zmc2V0X3gxX3NyYyA9IGxfcmVzLT54MSAtIChPUEpfSU5UMzIpbF94MV9kZXN0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICggbF95MF9kZXN0IDwgKE9QSl9VSU5UMzIpbF9yZXMtPnkwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbF9zdGFydF95X2Rlc3QgPSAoT1BKX1VJTlQzMilsX3Jlcy0+eTAgLSBsX3kwX2Rlc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBsX29mZnNldF95MF9zcmMgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGxfeTFfZGVzdCA+PSAoT1BKX1VJTlQzMilsX3Jlcy0+eTEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaGVpZ2h0X2Rlc3QgPSBsX2hlaWdodF9zcmM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfb2Zmc2V0X3kxX3NyYyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9oZWlnaHRfZGVzdCA9IGxfeTFfZGVzdCAtIChPUEpfVUlOVDMyKWxfcmVzLT55MCA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfb2Zmc2V0X3kxX3NyYyA9ICAoT1BKX0lOVDMyKShsX2hlaWdodF9zcmMgLSBsX2hlaWdodF9kZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsX3N0YXJ0X3lfZGVzdCA9IDBVOworICAgICAgICAgICAgICAgICAgICAgICAgbF9vZmZzZXRfeTBfc3JjID0gKE9QSl9JTlQzMilsX3kwX2Rlc3QgLSBsX3Jlcy0+eTA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbF95MV9kZXN0ID49IChPUEpfVUlOVDMyKWxfcmVzLT55MSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9oZWlnaHRfZGVzdCA9IGxfaGVpZ2h0X3NyYyAtIChPUEpfVUlOVDMyKWxfb2Zmc2V0X3kwX3NyYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9vZmZzZXRfeTFfc3JjID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2hlaWdodF9kZXN0ID0gbF9pbWdfY29tcF9kZXN0LT5oIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9vZmZzZXRfeTFfc3JjID0gbF9yZXMtPnkxIC0gKE9QSl9JTlQzMilsX3kxX2Rlc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoIChsX29mZnNldF94MF9zcmMgPCAwICkgfHwgKGxfb2Zmc2V0X3kwX3NyYyA8IDAgKSB8fCAobF9vZmZzZXRfeDFfc3JjIDwgMCApIHx8IChsX29mZnNldF95MV9zcmMgPCAwICkgKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIHRlc3RjYXNlIDI5NzcucGRmLmFzYW4uNjcuMjE5OCAqLworICAgICAgICAgICAgICAgIGlmICgoT1BKX0lOVDMyKWxfd2lkdGhfZGVzdCA8IDAgfHwgKE9QSl9JTlQzMilsX2hlaWdodF9kZXN0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyotLS0tLSovCisKKyAgICAgICAgICAgICAgICAvKiBDb21wdXRlIHRoZSBpbnB1dCBidWZmZXIgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgbF9zdGFydF9vZmZzZXRfc3JjID0gKE9QSl9TSVpFX1QpbF9vZmZzZXRfeDBfc3JjICsgKE9QSl9TSVpFX1QpbF9vZmZzZXRfeTBfc3JjICogKE9QSl9TSVpFX1QpbF93aWR0aF9zcmM7CisgICAgICAgICAgICAgICAgbF9saW5lX29mZnNldF9zcmMgID0gKE9QSl9TSVpFX1QpbF9vZmZzZXRfeDFfc3JjICsgKE9QSl9TSVpFX1QpbF9vZmZzZXRfeDBfc3JjOworICAgICAgICAgICAgICAgIGxfZW5kX29mZnNldF9zcmMgICA9IChPUEpfU0laRV9UKWxfb2Zmc2V0X3kxX3NyYyAqIChPUEpfU0laRV9UKWxfd2lkdGhfc3JjIC0gKE9QSl9TSVpFX1QpbF9vZmZzZXRfeDBfc3JjOworCisgICAgICAgICAgICAgICAgLyogQ29tcHV0ZSB0aGUgb3V0cHV0IGJ1ZmZlciBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICBsX3N0YXJ0X29mZnNldF9kZXN0ID0gKE9QSl9TSVpFX1QpbF9zdGFydF94X2Rlc3QgKyAoT1BKX1NJWkVfVClsX3N0YXJ0X3lfZGVzdCAqIChPUEpfU0laRV9UKWxfaW1nX2NvbXBfZGVzdC0+dzsKKyAgICAgICAgICAgICAgICBsX2xpbmVfb2Zmc2V0X2Rlc3QgID0gKE9QSl9TSVpFX1QpbF9pbWdfY29tcF9kZXN0LT53IC0gKE9QSl9TSVpFX1QpbF93aWR0aF9kZXN0OworCisgICAgICAgICAgICAgICAgLyogTW92ZSB0aGUgb3V0cHV0IGJ1ZmZlciB0byB0aGUgZmlyc3QgcGxhY2Ugd2hlcmUgd2Ugd2lsbCB3cml0ZSovCisgICAgICAgICAgICAgICAgbF9kZXN0X3B0ciA9IGxfaW1nX2NvbXBfZGVzdC0+ZGF0YSArIGxfc3RhcnRfb2Zmc2V0X2Rlc3Q7CisKKyAgICAgICAgICAgICAgICAvKmlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiQ09NUE9bJWRdOlxuIixpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiU1JDOiBsX3N0YXJ0X3hfc3JjPSVkLCBsX3N0YXJ0X3lfc3JjPSVkLCBsX3dpZHRoX3NyYz0lZCwgbF9oZWlnaHRfc3JjPSVkXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0IHRpbGUgb2Zmc2V0OiVkLCAlZCwgJWQsICVkXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0IGJ1ZmZlciBvZmZzZXQ6ICVkOyAlZCwgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9yZXMtPngwLCBsX3Jlcy0+eTAsIGxfd2lkdGhfc3JjLCBsX2hlaWdodF9zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9vZmZzZXRfeDBfc3JjLCBsX29mZnNldF95MF9zcmMsIGxfb2Zmc2V0X3gxX3NyYywgbF9vZmZzZXRfeTFfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3RhcnRfb2Zmc2V0X3NyYywgbF9saW5lX29mZnNldF9zcmMsIGxfZW5kX29mZnNldF9zcmMpOworCisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIkRFU1Q6IGxfc3RhcnRfeF9kZXN0PSVkLCBsX3N0YXJ0X3lfZGVzdD0lZCwgbF93aWR0aF9kZXN0PSVkLCBsX2hlaWdodF9kZXN0PSVkXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0IHN0YXJ0IG9mZnNldDogJWQsIGxpbmUgb2Zmc2V0PSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3N0YXJ0X3hfZGVzdCwgbF9zdGFydF95X2Rlc3QsIGxfd2lkdGhfZGVzdCwgbF9oZWlnaHRfZGVzdCwgbF9zdGFydF9vZmZzZXRfZGVzdCwgbF9saW5lX29mZnNldF9kZXN0KTsKKyAgICAgICAgICAgICAgICB9Ki8KKworICAgICAgICAgICAgICAgIHN3aXRjaCAobF9zaXplX2NvbXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9DSEFSICogbF9zcmNfcHRyID0gKE9QSl9DSEFSKikgcF9kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX3N0YXJ0X29mZnNldF9zcmM7IC8qIE1vdmUgdG8gdGhlIGZpcnN0IHBsYWNlIHdoZXJlIHdlIHdpbGwgcmVhZCovCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9pbWdfY29tcF9zcmMtPnNnbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDAgOyBqIDwgbF9oZWlnaHRfZGVzdCA7ICsraikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCBrID0gMCA7IGsgPCBsX3dpZHRoX2Rlc3QgOyArK2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGxfZGVzdF9wdHIrKykgPSAoT1BKX0lOVDMyKSAoKihsX3NyY19wdHIrKykpOyAvKiBDb3B5IG9ubHkgdGhlIGRhdGEgbmVlZGVkIGZvciB0aGUgb3V0cHV0IGltYWdlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2Rlc3RfcHRyKz0gbF9saW5lX29mZnNldF9kZXN0OyAvKiBNb3ZlIHRvIHRoZSBuZXh0IHBsYWNlIHdoZXJlIHdlIHdpbGwgd3JpdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zcmNfcHRyICs9IGxfbGluZV9vZmZzZXRfc3JjIDsgLyogTW92ZSB0byB0aGUgbmV4dCBwbGFjZSB3aGVyZSB3ZSB3aWxsIHJlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCBqID0gMCA7IGogPCBsX2hlaWdodF9kZXN0IDsgKytqICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCBrID0gMCA7IGsgPCBsX3dpZHRoX2Rlc3QgOyArK2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGxfZGVzdF9wdHIrKykgPSAoT1BKX0lOVDMyKSAoKCoobF9zcmNfcHRyKyspKSYweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZGVzdF9wdHIrPSBsX2xpbmVfb2Zmc2V0X2Rlc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX2xpbmVfb2Zmc2V0X3NyYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NyY19wdHIgKz0gbF9lbmRfb2Zmc2V0X3NyYzsgLyogTW92ZSB0byB0aGUgZW5kIG9mIHRoaXMgY29tcG9uZW50LXBhcnQgb2YgdGhlIGlucHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YSA9IChPUEpfQllURSopIGxfc3JjX3B0cjsgLyogS2VlcCB0aGUgY3VycmVudCBwb3NpdGlvbiBmb3IgdGhlIG5leHQgY29tcG9uZW50LXBhcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQxNiAqIGxfc3JjX3B0ciA9IChPUEpfSU5UMTYgKikgcF9kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX3N0YXJ0X29mZnNldF9zcmM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9pbWdfY29tcF9zcmMtPnNnbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9oZWlnaHRfZGVzdDsrK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrPTA7azxsX3dpZHRoX2Rlc3Q7KytrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKihsX3NyY19wdHIrKyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2Rlc3RfcHRyKz0gbF9saW5lX29mZnNldF9kZXN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NyY19wdHIgKz0gbF9saW5lX29mZnNldF9zcmMgOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9oZWlnaHRfZGVzdDsrK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrPTA7azxsX3dpZHRoX2Rlc3Q7KytrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKCoobF9zcmNfcHRyKyspKSYweGZmZmY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2Rlc3RfcHRyKz0gbF9saW5lX29mZnNldF9kZXN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NyY19wdHIgKz0gbF9saW5lX29mZnNldF9zcmMgOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX2VuZF9vZmZzZXRfc3JjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YSA9IChPUEpfQllURSopIGxfc3JjX3B0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIGxfc3JjX3B0ciA9IChPUEpfSU5UMzIgKikgcF9kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX3N0YXJ0X29mZnNldF9zcmM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfaGVpZ2h0X2Rlc3Q7KytqKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGs9MDtrPGxfd2lkdGhfZGVzdDsrK2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKCoobF9zcmNfcHRyKyspKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9kZXN0X3B0cis9IGxfbGluZV9vZmZzZXRfZGVzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX2xpbmVfb2Zmc2V0X3NyYyA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zcmNfcHRyICs9IGxfZW5kX29mZnNldF9zcmM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhID0gKE9QSl9CWVRFKikgbF9zcmNfcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICsrbF9pbWdfY29tcF9kZXN0OworICAgICAgICAgICAgICAgICsrbF9pbWdfY29tcF9zcmM7CisgICAgICAgICAgICAgICAgKytsX3RpbGVjOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitPUEpfQk9PTCBvcGpfajJrX3NldF9kZWNvZGVfYXJlYSggICAgICAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QqIHBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX3N0YXJ0X3gsIE9QSl9JTlQzMiBwX3N0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX2VuZF94LCBPUEpfSU5UMzIgcF9lbmRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3sKKyAgICAgICAgb3BqX2NwX3QgKiBsX2NwID0gJihwX2oyay0+bV9jcCk7CisgICAgICAgIG9wal9pbWFnZV90ICogbF9pbWFnZSA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2U7CisKKyAgICAgICAgT1BKX1VJTlQzMiBpdF9jb21wOworICAgICAgICBPUEpfSU5UMzIgbF9jb21wX3gxLCBsX2NvbXBfeTE7CisgICAgICAgIG9wal9pbWFnZV9jb21wX3QqIGxfaW1nX2NvbXAgPSBOVUxMOworCisgICAgICAgIC8qIENoZWNrIGlmIHdlIGFyZSByZWFkIHRoZSBtYWluIGhlYWRlciAqLworICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgIT0gSjJLX1NUQVRFX1RQSFNPVCkgeyAvKiBGSVhNRSBKMktfREVDX1NUQVRFX1RQSFNPVCkqLworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOZWVkIHRvIGRlY29kZSB0aGUgbWFpbiBoZWFkZXIgYmVmb3JlIGJlZ2luIHRvIGRlY29kZSB0aGUgcmVtYWluaW5nIGNvZGVzdHJlYW0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCAhcF9zdGFydF94ICYmICFwX3N0YXJ0X3kgJiYgIXBfZW5kX3ggJiYgIXBfZW5kX3kpeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfSU5GTywgIk5vIGRlY29kZWQgYXJlYSBwYXJhbWV0ZXJzLCBzZXQgdGhlIGRlY29kZWQgYXJlYSB0byB0aGUgd2hvbGUgaW1hZ2VcbiIpOworCisgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhcnRfdGlsZV94ID0gMDsKKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3kgPSAwOworICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2VuZF90aWxlX3ggPSBsX2NwLT50dzsKKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9lbmRfdGlsZV95ID0gbF9jcC0+dGg7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgIH0KKworICAgICAgICAvKiAtLS0tLSAqLworICAgICAgICAvKiBDaGVjayBpZiB0aGUgcG9zaXRpb25zIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIGFyZSBjb3JyZWN0ICovCisKKyAgICAgICAgLyogTGVmdCAqLworICAgICAgICBhc3NlcnQocF9zdGFydF94ID49IDAgKTsKKyAgICAgICAgYXNzZXJ0KHBfc3RhcnRfeSA+PSAwICk7CisKKyAgICAgICAgaWYgKChPUEpfVUlOVDMyKXBfc3RhcnRfeCA+IGxfaW1hZ2UtPngxICkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAiTGVmdCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDA9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhzaXo9JWQpLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfc3RhcnRfeCwgbF9pbWFnZS0+eDEpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKE9QSl9VSU5UMzIpcF9zdGFydF94IDwgbF9pbWFnZS0+eDApeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlZnQgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3gwPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChYT3Npej0lZCkuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3N0YXJ0X3gsIGxfaW1hZ2UtPngwKTsKKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3ggPSAwOworICAgICAgICAgICAgICAgIHBfaW1hZ2UtPngwID0gbF9pbWFnZS0+eDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhcnRfdGlsZV94ID0gKChPUEpfVUlOVDMyKXBfc3RhcnRfeCAtIGxfY3AtPnR4MCkgLyBsX2NwLT50ZHg7CisgICAgICAgICAgICAgICAgcF9pbWFnZS0+eDAgPSAoT1BKX1VJTlQzMilwX3N0YXJ0X3g7CisgICAgICAgIH0KKworICAgICAgICAvKiBVcCAqLworICAgICAgICBpZiAoKE9QSl9VSU5UMzIpcF9zdGFydF95ID4gbF9pbWFnZS0+eTEpeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVcCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feTA9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFlzaXo9JWQpLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zdGFydF95LCBsX2ltYWdlLT55MSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoT1BKX1VJTlQzMilwX3N0YXJ0X3kgPCBsX2ltYWdlLT55MCl7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXAgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kwPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChZT3Npej0lZCkuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3N0YXJ0X3ksIGxfaW1hZ2UtPnkwKTsKKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3kgPSAwOworICAgICAgICAgICAgICAgIHBfaW1hZ2UtPnkwID0gbF9pbWFnZS0+eTA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhcnRfdGlsZV95ID0gKChPUEpfVUlOVDMyKXBfc3RhcnRfeSAtIGxfY3AtPnR5MCkgLyBsX2NwLT50ZHk7CisgICAgICAgICAgICAgICAgcF9pbWFnZS0+eTAgPSAoT1BKX1VJTlQzMilwX3N0YXJ0X3k7CisgICAgICAgIH0KKworICAgICAgICAvKiBSaWdodCAqLworICAgICAgICBhc3NlcnQoKE9QSl9VSU5UMzIpcF9lbmRfeCA+IDApOworICAgICAgICBhc3NlcnQoKE9QSl9VSU5UMzIpcF9lbmRfeSA+IDApOworICAgICAgICBpZiAoKE9QSl9VSU5UMzIpcF9lbmRfeCA8IGxfaW1hZ2UtPngwKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJSaWdodCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDE9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhPc2l6PSVkKS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwX2VuZF94LCBsX2ltYWdlLT54MCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoT1BKX1VJTlQzMilwX2VuZF94ID4gbF9pbWFnZS0+eDEpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAiUmlnaHQgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3gxPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChYc2l6PSVkKS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwX2VuZF94LCBsX2ltYWdlLT54MSk7CisgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeCA9IGxfY3AtPnR3OworICAgICAgICAgICAgICAgIHBfaW1hZ2UtPngxID0gbF9pbWFnZS0+eDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeCA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdihwX2VuZF94IC0gKE9QSl9JTlQzMilsX2NwLT50eDAsIChPUEpfSU5UMzIpbF9jcC0+dGR4KTsKKyAgICAgICAgICAgICAgICBwX2ltYWdlLT54MSA9IChPUEpfVUlOVDMyKXBfZW5kX3g7CisgICAgICAgIH0KKworICAgICAgICAvKiBCb3R0b20gKi8KKyAgICAgICAgaWYgKChPUEpfVUlOVDMyKXBfZW5kX3kgPCBsX2ltYWdlLT55MCkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQm90dG9tIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MT0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWU9zaXo9JWQpLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfZW5kX3ksIGxfaW1hZ2UtPnkwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGlmICgoT1BKX1VJTlQzMilwX2VuZF95ID4gbF9pbWFnZS0+eTEpeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICJCb3R0b20gcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kxPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChZc2l6PSVkKS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwX2VuZF95LCBsX2ltYWdlLT55MSk7CisgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeSA9IGxfY3AtPnRoOworICAgICAgICAgICAgICAgIHBfaW1hZ2UtPnkxID0gbF9pbWFnZS0+eTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9lbmRfdGlsZV95ID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2KHBfZW5kX3kgLSAoT1BKX0lOVDMyKWxfY3AtPnR5MCwgKE9QSl9JTlQzMilsX2NwLT50ZHkpOworICAgICAgICAgICAgICAgIHBfaW1hZ2UtPnkxID0gKE9QSl9VSU5UMzIpcF9lbmRfeTsKKyAgICAgICAgfQorICAgICAgICAvKiAtLS0tLSAqLworCisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2Rpc2NhcmRfdGlsZXMgPSAxOworCisgICAgICAgIGxfaW1nX2NvbXAgPSBwX2ltYWdlLT5jb21wczsKKyAgICAgICAgZm9yIChpdF9jb21wPTA7IGl0X2NvbXAgPCBwX2ltYWdlLT5udW1jb21wczsgKytpdF9jb21wKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIGxfaCxsX3c7CisKKyAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT54MCA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKXBfaW1hZ2UtPngwLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR4KTsKKyAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT55MCA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKXBfaW1hZ2UtPnkwLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR5KTsKKyAgICAgICAgICAgICAgICBsX2NvbXBfeDEgPSBvcGpfaW50X2NlaWxkaXYoKE9QSl9JTlQzMilwX2ltYWdlLT54MSwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5keCk7CisgICAgICAgICAgICAgICAgbF9jb21wX3kxID0gb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpcF9pbWFnZS0+eTEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHkpOworCisgICAgICAgICAgICAgICAgbF93ID0gb3BqX2ludF9jZWlsZGl2cG93MihsX2NvbXBfeDEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZmFjdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG9wal9pbnRfY2VpbGRpdnBvdzIoKE9QSl9JTlQzMilsX2ltZ19jb21wLT54MCwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5mYWN0b3IpOworICAgICAgICAgICAgICAgIGlmIChsX3cgPCAwKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaXplIHggb2YgdGhlIGRlY29kZWQgY29tcG9uZW50IGltYWdlIGlzIGluY29ycmVjdCAoY29tcFslZF0udz0lZCkuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdF9jb21wLCBsX3cpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbF9pbWdfY29tcC0+dyA9IChPUEpfVUlOVDMyKWxfdzsKKworICAgICAgICAgICAgICAgIGxfaCA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF9jb21wX3kxLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmZhY3RvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBvcGpfaW50X2NlaWxkaXZwb3cyKChPUEpfSU5UMzIpbF9pbWdfY29tcC0+eTAsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZmFjdG9yKTsKKyAgICAgICAgICAgICAgICBpZiAobF9oIDwgMCl7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2l6ZSB5IG9mIHRoZSBkZWNvZGVkIGNvbXBvbmVudCBpbWFnZSBpcyBpbmNvcnJlY3QgKGNvbXBbJWRdLmg9JWQpLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRfY29tcCwgbF9oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPmggPSAoT1BKX1VJTlQzMilsX2g7CisKKyAgICAgICAgICAgICAgICBsX2ltZ19jb21wKys7CisgICAgICAgIH0KKworICAgICAgICBvcGpfZXZlbnRfbXNnKCBwX21hbmFnZXIsIEVWVF9JTkZPLCJTZXR0aW5nIGRlY29kaW5nIGFyZWEgdG8gJWQsJWQsJWQsJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwX2ltYWdlLT54MCwgcF9pbWFnZS0+eTAsIHBfaW1hZ2UtPngxLCBwX2ltYWdlLT55MSk7CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitvcGpfajJrX3QqIG9wal9qMmtfY3JlYXRlX2RlY29tcHJlc3Modm9pZCkKK3sKKyAgICAgICAgb3BqX2oya190ICpsX2oyayA9IChvcGpfajJrX3QqKSBvcGpfY2FsbG9jKDEsc2l6ZW9mKG9wal9qMmtfdCkpOworICAgICAgICBpZiAoIWxfajJrKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDAwOworICAgICAgICB9CisKKyAgICAgICAgbF9qMmstPm1faXNfZGVjb2RlciA9IDE7CisgICAgICAgIGxfajJrLT5tX2NwLm1faXNfZGVjb2RlciA9IDE7CisKKyNpZmRlZiBPUEpfRElTQUJMRV9UUFNPVF9GSVgKKyAgICAgICAgbF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fbmJfdGlsZV9wYXJ0c19jb3JyZWN0aW9uX2NoZWNrZWQgPSAxOworI2VuZGlmCisKKyAgICAgICAgbF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3AgPSAob3BqX3RjcF90Kikgb3BqX2NhbGxvYygxLHNpemVvZihvcGpfdGNwX3QpKTsKKyAgICAgICAgaWYgKCFsX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcCkgeworICAgICAgICAgICAgICAgIG9wal9qMmtfZGVzdHJveShsX2oyayk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDAwOworICAgICAgICB9CisKKyAgICAgICAgbF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX2NhbGxvYygxLE9QSl9KMktfREVGQVVMVF9IRUFERVJfU0laRSk7CisgICAgICAgIGlmICghIGxfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhKSB7CisgICAgICAgICAgICAgICAgb3BqX2oya19kZXN0cm95KGxfajJrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDA7CisgICAgICAgIH0KKworICAgICAgICBsX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YV9zaXplID0gT1BKX0oyS19ERUZBVUxUX0hFQURFUl9TSVpFOworCisgICAgICAgIGxfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3RpbGVfaW5kX3RvX2RlYyA9IC0xIDsKKworICAgICAgICBsX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9sYXN0X3NvdF9yZWFkX3BvcyA9IDAgOworCisgICAgICAgIC8qIGNvZGVzdHJlYW0gaW5kZXggY3JlYXRpb24gKi8KKyAgICAgICAgbF9qMmstPmNzdHJfaW5kZXggPSBvcGpfajJrX2NyZWF0ZV9jc3RyX2luZGV4KCk7CisgICAgICAgIGlmICghbF9qMmstPmNzdHJfaW5kZXgpeworICAgICAgICAgICAgICAgIG9wal9qMmtfZGVzdHJveShsX2oyayk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDAwOworICAgICAgICB9CisKKyAgICAgICAgLyogdmFsaWRhdGlvbiBsaXN0IGNyZWF0aW9uICovCisgICAgICAgIGxfajJrLT5tX3ZhbGlkYXRpb25fbGlzdCA9IG9wal9wcm9jZWR1cmVfbGlzdF9jcmVhdGUoKTsKKyAgICAgICAgaWYgKCEgbF9qMmstPm1fdmFsaWRhdGlvbl9saXN0KSB7CisgICAgICAgICAgICAgICAgb3BqX2oya19kZXN0cm95KGxfajJrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBleGVjdXRpb24gbGlzdCBjcmVhdGlvbiAqLworICAgICAgICBsX2oyay0+bV9wcm9jZWR1cmVfbGlzdCA9IG9wal9wcm9jZWR1cmVfbGlzdF9jcmVhdGUoKTsKKyAgICAgICAgaWYgKCEgbF9qMmstPm1fcHJvY2VkdXJlX2xpc3QpIHsKKyAgICAgICAgICAgICAgICBvcGpfajJrX2Rlc3Ryb3kobF9qMmspOworICAgICAgICAgICAgICAgIHJldHVybiAwMDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsX2oyazsKK30KKworc3RhdGljIG9wal9jb2Rlc3RyZWFtX2luZGV4X3QqIG9wal9qMmtfY3JlYXRlX2NzdHJfaW5kZXgodm9pZCkKK3sKKyAgICAgICAgb3BqX2NvZGVzdHJlYW1faW5kZXhfdCogY3N0cl9pbmRleCA9IChvcGpfY29kZXN0cmVhbV9pbmRleF90KikKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jYWxsb2MoMSxzaXplb2Yob3BqX2NvZGVzdHJlYW1faW5kZXhfdCkpOworICAgICAgICBpZiAoIWNzdHJfaW5kZXgpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgY3N0cl9pbmRleC0+bWF4bWFya251bSA9IDEwMDsKKyAgICAgICAgY3N0cl9pbmRleC0+bWFya251bSA9IDA7CisgICAgICAgIGNzdHJfaW5kZXgtPm1hcmtlciA9IChvcGpfbWFya2VyX2luZm9fdCopCisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY2FsbG9jKGNzdHJfaW5kZXgtPm1heG1hcmtudW0sIHNpemVvZihvcGpfbWFya2VyX2luZm9fdCkpOworICAgICAgICBpZiAoIWNzdHJfaW5kZXgtPiBtYXJrZXIpIHsKKyAgICAgICAgICAgICAgICBvcGpfZnJlZShjc3RyX2luZGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXggPSBOVUxMOworCisgICAgICAgIHJldHVybiBjc3RyX2luZGV4OworfQorCitzdGF0aWMgT1BKX1VJTlQzMiBvcGpfajJrX2dldF9TUENvZF9TUENvY19zaXplICggICAgICAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vICkKK3sKKyAgICAgICAgb3BqX2NwX3QgKmxfY3AgPSAwMDsKKyAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOworICAgICAgICBvcGpfdGNjcF90ICpsX3RjY3AgPSAwMDsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisKKyAgICAgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOworICAgICAgICBsX3RjcCA9ICZsX2NwLT50Y3BzW3BfdGlsZV9ub107CisgICAgICAgIGxfdGNjcCA9ICZsX3RjcC0+dGNjcHNbcF9jb21wX25vXTsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zIGFnYWluICovCisgICAgICAgIGFzc2VydChwX3RpbGVfbm8gPCAobF9jcC0+dHcgKiBsX2NwLT50aCkpOworICAgICAgICBhc3NlcnQocF9jb21wX25vIDwgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHMpOworCisgICAgICAgIGlmIChsX3RjY3AtPmNzdHkgJiBKMktfQ0NQX0NTVFlfUFJUKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDUgKyBsX3RjY3AtPm51bXJlc29sdXRpb25zOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiA1OworICAgICAgICB9Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX1NQQ29kX1NQQ29jKCAgICAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyICkKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBpOworICAgICAgICBvcGpfY3BfdCAqbF9jcCA9IDAwOworICAgICAgICBvcGpfdGNwX3QgKmxfdGNwID0gMDA7CisgICAgICAgIG9wal90Y2NwX3QgKmxfdGNjcCA9IDAwOworCisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfaGVhZGVyX3NpemUgIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfZGF0YSAhPSAwMCk7CisKKyAgICAgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOworICAgICAgICBsX3RjcCA9ICZsX2NwLT50Y3BzW3BfdGlsZV9ub107CisgICAgICAgIGxfdGNjcCA9ICZsX3RjcC0+dGNjcHNbcF9jb21wX25vXTsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zIGFnYWluICovCisgICAgICAgIGFzc2VydChwX3RpbGVfbm8gPCAobF9jcC0+dHcgKiBsX2NwLT50aCkpOworICAgICAgICBhc3NlcnQocF9jb21wX25vIDwocF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHMpKTsKKworICAgICAgICBpZiAoKnBfaGVhZGVyX3NpemUgPCA1KSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdyaXRpbmcgU1BDb2QgU1BDb2MgZWxlbWVudFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhwX2RhdGEsbF90Y2NwLT5udW1yZXNvbHV0aW9ucyAtIDEsIDEpOyAgLyogU1Bjb2MgKEQpICovCisgICAgICAgICsrcF9kYXRhOworCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhwX2RhdGEsbF90Y2NwLT5jYmxrdyAtIDIsIDEpOyAgICAgICAgICAgICAgICAgICAvKiBTUGNvYyAoRSkgKi8KKyAgICAgICAgKytwX2RhdGE7CisKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKHBfZGF0YSxsX3RjY3AtPmNibGtoIC0gMiwgMSk7ICAgICAgICAgICAgICAgICAgIC8qIFNQY29jIChGKSAqLworICAgICAgICArK3BfZGF0YTsKKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLGxfdGNjcC0+Y2Jsa3N0eSwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTUGNvYyAoRykgKi8KKyAgICAgICAgKytwX2RhdGE7CisKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKHBfZGF0YSxsX3RjY3AtPnFtZmJpZCwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU1Bjb2MgKEgpICovCisgICAgICAgICsrcF9kYXRhOworCisgICAgICAgICpwX2hlYWRlcl9zaXplID0gKnBfaGVhZGVyX3NpemUgLSA1OworCisgICAgICAgIGlmIChsX3RjY3AtPmNzdHkgJiBKMktfQ0NQX0NTVFlfUFJUKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoKnBfaGVhZGVyX3NpemUgPCBsX3RjY3AtPm51bXJlc29sdXRpb25zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd3JpdGluZyBTUENvZCBTUENvYyBlbGVtZW50XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxfdGNjcC0+bnVtcmVzb2x1dGlvbnM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3dyaXRlX2J5dGVzKHBfZGF0YSxsX3RjY3AtPnByY3dbaV0gKyAobF90Y2NwLT5wcmNoW2ldIDw8IDQpLCAxKTsgICAgLyogU1Bjb2MgKElfaSkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICsrcF9kYXRhOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpwX2hlYWRlcl9zaXplID0gKnBfaGVhZGVyX3NpemUgLSBsX3RjY3AtPm51bXJlc29sdXRpb25zOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX1NQQ29kX1NQQ29jKCAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNvbXBubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQoreworICAgICAgICBPUEpfVUlOVDMyIGksIGxfdG1wOworICAgICAgICBvcGpfY3BfdCAqbF9jcCA9IE5VTEw7CisgICAgICAgIG9wal90Y3BfdCAqbF90Y3AgPSBOVUxMOworICAgICAgICBvcGpfdGNjcF90ICpsX3RjY3AgPSBOVUxMOworICAgICAgICBPUEpfQllURSAqIGxfY3VycmVudF9wdHIgPSBOVUxMOworCisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKKworICAgICAgICBsX2NwID0gJihwX2oyay0+bV9jcCk7CisgICAgICAgIGxfdGNwID0gKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IEoyS19TVEFURV9UUEgpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfY3AtPnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0gOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcDsKKworICAgICAgICAvKiBwcmVjb25kaXRpb24gYWdhaW4gKi8KKyAgICAgICAgYXNzZXJ0KGNvbXBubyA8IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzKTsKKworICAgICAgICBsX3RjY3AgPSAmbF90Y3AtPnRjY3BzW2NvbXBub107CisgICAgICAgIGxfY3VycmVudF9wdHIgPSBwX2hlYWRlcl9kYXRhOworCisgICAgICAgIC8qIG1ha2Ugc3VyZSByb29tIGlzIHN1ZmZpY2llbnQgKi8KKyAgICAgICAgaWYgKCpwX2hlYWRlcl9zaXplIDwgNSkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFNQQ29kIFNQQ29jIGVsZW1lbnRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBvcGpfcmVhZF9ieXRlcyhsX2N1cnJlbnRfcHRyLCAmbF90Y2NwLT5udW1yZXNvbHV0aW9ucyAsMSk7ICAgICAgICAgICAgICAvKiBTUGNveCAoRCkgKi8KKyAgICAgICAgKytsX3RjY3AtPm51bXJlc29sdXRpb25zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0Y2NwLT5udW1yZXNvbHV0aW9ucyA9IHJlYWQoKSArIDEgKi8KKyAgICAgICAgaWYgKGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMgPiBPUEpfSjJLX01BWFJMVkxTKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBudW1yZXNvbHV0aW9ucyA6ICVkLCBtYXggdmFsdWUgaXMgc2V0IGluIG9wZW5qcGVnLmggYXQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RjY3AtPm51bXJlc29sdXRpb25zLCBPUEpfSjJLX01BWFJMVkxTKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgICsrbF9jdXJyZW50X3B0cjsKKworICAgICAgICAvKiBJZiB1c2VyIHdhbnRzIHRvIHJlbW92ZSBtb3JlIHJlc29sdXRpb25zIHRoYW4gdGhlIGNvZGVzdHJlYW0gY29udGFpbnMsIHJldHVybiBlcnJvciAqLworICAgICAgICBpZiAobF9jcC0+bV9zcGVjaWZpY19wYXJhbS5tX2RlYy5tX3JlZHVjZSA+PSBsX3RjY3AtPm51bXJlc29sdXRpb25zKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIGRlY29kaW5nIGNvbXBvbmVudCAlZC5cblRoZSBudW1iZXIgb2YgcmVzb2x1dGlvbnMgdG8gcmVtb3ZlIGlzIGhpZ2hlciB0aGFuIHRoZSBudW1iZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZiByZXNvbHV0aW9ucyBvZiB0aGlzIGNvbXBvbmVudFxuTW9kaWZ5IHRoZSBjcF9yZWR1Y2UgcGFyYW1ldGVyLlxuXG4iLCBjb21wbm8pOworICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlIHw9IDB4ODAwMDsvKiBGSVhNRSBKMktfREVDX1NUQVRFX0VSUjsqLworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBvcGpfcmVhZF9ieXRlcyhsX2N1cnJlbnRfcHRyLCZsX3RjY3AtPmNibGt3ICwxKTsgICAgICAgICAgICAgICAgLyogU1Bjb2MgKEUpICovCisgICAgICAgICsrbF9jdXJyZW50X3B0cjsKKyAgICAgICAgbF90Y2NwLT5jYmxrdyArPSAyOworCisgICAgICAgIG9wal9yZWFkX2J5dGVzKGxfY3VycmVudF9wdHIsJmxfdGNjcC0+Y2Jsa2ggLDEpOyAgICAgICAgICAgICAgICAvKiBTUGNvYyAoRikgKi8KKyAgICAgICAgKytsX2N1cnJlbnRfcHRyOworICAgICAgICBsX3RjY3AtPmNibGtoICs9IDI7CisKKyAgICAgICAgaWYgKChsX3RjY3AtPmNibGt3ID4gMTApIHx8IChsX3RjY3AtPmNibGtoID4gMTApIHx8ICgobF90Y2NwLT5jYmxrdyArIGxfdGNjcC0+Y2Jsa2gpID4gMTIpKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgU1BDb2QgU1BDb2MgZWxlbWVudCwgSW52YWxpZCBjYmxrdy9jYmxraCBjb21iaW5hdGlvblxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCQorCisgICAgICAgIG9wal9yZWFkX2J5dGVzKGxfY3VycmVudF9wdHIsJmxfdGNjcC0+Y2Jsa3N0eSAsMSk7ICAgICAgICAgICAgICAvKiBTUGNvYyAoRykgKi8KKyAgICAgICAgKytsX2N1cnJlbnRfcHRyOworCisgICAgICAgIG9wal9yZWFkX2J5dGVzKGxfY3VycmVudF9wdHIsJmxfdGNjcC0+cW1mYmlkICwxKTsgICAgICAgICAgICAgICAvKiBTUGNvYyAoSCkgKi8KKyAgICAgICAgKytsX2N1cnJlbnRfcHRyOworCisgICAgICAgICpwX2hlYWRlcl9zaXplID0gKnBfaGVhZGVyX3NpemUgLSA1OworCisgICAgICAgIC8qIHVzZSBjdXN0b20gcHJlY2luY3Qgc2l6ZSA/ICovCisgICAgICAgIGlmIChsX3RjY3AtPmNzdHkgJiBKMktfQ0NQX0NTVFlfUFJUKSB7CisgICAgICAgICAgICAgICAgaWYgKCpwX2hlYWRlcl9zaXplIDwgbF90Y2NwLT5udW1yZXNvbHV0aW9ucykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgU1BDb2QgU1BDb2MgZWxlbWVudFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAgICAgKGkgPSAwOyBpIDwgbF90Y2NwLT5udW1yZXNvbHV0aW9uczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhsX2N1cnJlbnRfcHRyLCZsX3RtcCAsMSk7ICAgICAgICAgICAgICAgIC8qIFNQY29jIChJX2kpICovCisgICAgICAgICAgICAgICAgICAgICAgICArK2xfY3VycmVudF9wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcmVjaW5jdCBleHBvbmVudCAwIGlzIG9ubHkgYWxsb3dlZCBmb3IgbG93ZXN0IHJlc29sdXRpb24gbGV2ZWwgKFRhYmxlIEEuMjEpICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGkgIT0gMCkgJiYgKCgobF90bXAgJiAweGYpID09IDApIHx8ICgobF90bXAgPj4gNCkgPT0gMCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJJbnZhbGlkIHByZWNpbmN0IHNpemVcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbF90Y2NwLT5wcmN3W2ldID0gbF90bXAgJiAweGY7CisgICAgICAgICAgICAgICAgICAgICAgICBsX3RjY3AtPnByY2hbaV0gPSBsX3RtcCA+PiA0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpwX2hlYWRlcl9zaXplID0gKnBfaGVhZGVyX3NpemUgLSBsX3RjY3AtPm51bXJlc29sdXRpb25zOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIHNldCBkZWZhdWx0IHNpemUgZm9yIHRoZSBwcmVjaW5jdCB3aWR0aCBhbmQgaGVpZ2h0ICovCisgICAgICAgICAgICAgICAgZm9yICAgICAoaSA9IDA7IGkgPCBsX3RjY3AtPm51bXJlc29sdXRpb25zOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNjcC0+cHJjd1tpXSA9IDE1OworICAgICAgICAgICAgICAgICAgICAgICAgbF90Y2NwLT5wcmNoW2ldID0gMTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNpZmRlZiBXSVBfUkVNT1ZFX01TRAorICAgICAgICAvKiBJTkRFWCA+PiAqLworICAgICAgICBpZiAocF9qMmstPmNzdHJfaW5mbyAmJiBjb21wbm8gPT0gMCkgeworICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbF9kYXRhX3NpemUgPSBsX3RjY3AtPm51bXJlc29sdXRpb25zICogc2l6ZW9mKE9QSl9VSU5UMzIpOworCisgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5mby0+dGlsZVtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50Y2NwX2luZm9bY29tcG5vXS5jYmxraCA9IGxfdGNjcC0+Y2Jsa2g7CisgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5mby0+dGlsZVtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50Y2NwX2luZm9bY29tcG5vXS5jYmxrdyA9IGxfdGNjcC0+Y2Jsa3c7CisgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5mby0+dGlsZVtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50Y2NwX2luZm9bY29tcG5vXS5udW1yZXNvbHV0aW9ucyA9IGxfdGNjcC0+bnVtcmVzb2x1dGlvbnM7CisgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5mby0+dGlsZVtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50Y2NwX2luZm9bY29tcG5vXS5jYmxrc3R5ID0gbF90Y2NwLT5jYmxrc3R5OworICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPnRpbGVbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udGNjcF9pbmZvW2NvbXBub10ucW1mYmlkID0gbF90Y2NwLT5xbWZiaWQ7CisKKyAgICAgICAgICAgICAgICBtZW1jcHkocF9qMmstPmNzdHJfaW5mby0+dGlsZVtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS5wZHgsbF90Y2NwLT5wcmN3LCBsX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHBfajJrLT5jc3RyX2luZm8tPnRpbGVbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0ucGR5LGxfdGNjcC0+cHJjaCwgbF9kYXRhX3NpemUpOworICAgICAgICB9CisgICAgICAgIC8qIDw8IElOREVYICovCisjZW5kaWYKKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK3N0YXRpYyB2b2lkIG9wal9qMmtfY29weV90aWxlX2NvbXBvbmVudF9wYXJhbWV0ZXJzKCBvcGpfajJrX3QgKnBfajJrICkKK3sKKyAgICAgICAgLyogbG9vcCAqLworICAgICAgICBPUEpfVUlOVDMyIGk7CisgICAgICAgIG9wal9jcF90ICpsX2NwID0gTlVMTDsKKyAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IE5VTEw7CisgICAgICAgIG9wal90Y2NwX3QgKmxfcmVmX3RjY3AgPSBOVUxMLCAqbF9jb3BpZWRfdGNjcCA9IE5VTEw7CisgICAgICAgIE9QSl9VSU5UMzIgbF9wcmNfc2l6ZTsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisKKyAgICAgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOworICAgICAgICBsX3RjcCA9IChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9PSBKMktfU1RBVEVfVFBIKSA/IC8qIEZJWE1FIEoyS19ERUNfU1RBVEVfVFBIKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfY3AtPnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0gOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcDsKKworICAgICAgICBsX3JlZl90Y2NwID0gJmxfdGNwLT50Y2Nwc1swXTsKKyAgICAgICAgbF9jb3BpZWRfdGNjcCA9IGxfcmVmX3RjY3AgKyAxOworICAgICAgICBsX3ByY19zaXplID0gbF9yZWZfdGNjcC0+bnVtcmVzb2x1dGlvbnMgKiAoT1BKX1VJTlQzMilzaXplb2YoT1BKX1VJTlQzMik7CisKKyAgICAgICAgZm9yICAgICAoaT0xOyBpPHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBsX2NvcGllZF90Y2NwLT5udW1yZXNvbHV0aW9ucyA9IGxfcmVmX3RjY3AtPm51bXJlc29sdXRpb25zOworICAgICAgICAgICAgICAgIGxfY29waWVkX3RjY3AtPmNibGt3ID0gbF9yZWZfdGNjcC0+Y2Jsa3c7CisgICAgICAgICAgICAgICAgbF9jb3BpZWRfdGNjcC0+Y2Jsa2ggPSBsX3JlZl90Y2NwLT5jYmxraDsKKyAgICAgICAgICAgICAgICBsX2NvcGllZF90Y2NwLT5jYmxrc3R5ID0gbF9yZWZfdGNjcC0+Y2Jsa3N0eTsKKyAgICAgICAgICAgICAgICBsX2NvcGllZF90Y2NwLT5xbWZiaWQgPSBsX3JlZl90Y2NwLT5xbWZiaWQ7CisgICAgICAgICAgICAgICAgbWVtY3B5KGxfY29waWVkX3RjY3AtPnByY3csbF9yZWZfdGNjcC0+cHJjdyxsX3ByY19zaXplKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkobF9jb3BpZWRfdGNjcC0+cHJjaCxsX3JlZl90Y2NwLT5wcmNoLGxfcHJjX3NpemUpOworICAgICAgICAgICAgICAgICsrbF9jb3BpZWRfdGNjcDsKKyAgICAgICAgfQorfQorCitzdGF0aWMgT1BKX1VJTlQzMiBvcGpfajJrX2dldF9TUWNkX1NRY2Nfc2l6ZSAoIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9ubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vICkKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBsX251bV9iYW5kczsKKworICAgICAgICBvcGpfY3BfdCAqbF9jcCA9IDAwOworICAgICAgICBvcGpfdGNwX3QgKmxfdGNwID0gMDA7CisgICAgICAgIG9wal90Y2NwX3QgKmxfdGNjcCA9IDAwOworCisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKworICAgICAgICBsX2NwID0gJihwX2oyay0+bV9jcCk7CisgICAgICAgIGxfdGNwID0gJmxfY3AtPnRjcHNbcF90aWxlX25vXTsKKyAgICAgICAgbF90Y2NwID0gJmxfdGNwLT50Y2Nwc1twX2NvbXBfbm9dOworCisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgYWdhaW4gKi8KKyAgICAgICAgYXNzZXJ0KHBfdGlsZV9ubyA8IGxfY3AtPnR3ICogbF9jcC0+dGgpOworICAgICAgICBhc3NlcnQocF9jb21wX25vIDwgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHMpOworCisgICAgICAgIGxfbnVtX2JhbmRzID0gKGxfdGNjcC0+cW50c3R5ID09IEoyS19DQ1BfUU5UU1RZX1NJUU5UKSA/IDEgOiAobF90Y2NwLT5udW1yZXNvbHV0aW9ucyAqIDMgLSAyKTsKKworICAgICAgICBpZiAobF90Y2NwLT5xbnRzdHkgPT0gSjJLX0NDUF9RTlRTVFlfTk9RTlQpICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDEgKyBsX251bV9iYW5kczsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMSArIDIqbF9udW1fYmFuZHM7CisgICAgICAgIH0KK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfU1FjZF9TUWNjKCAgICAgICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyICkKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBsX2hlYWRlcl9zaXplOworICAgICAgICBPUEpfVUlOVDMyIGxfYmFuZF9ubywgbF9udW1fYmFuZHM7CisgICAgICAgIE9QSl9VSU5UMzIgbF9leHBuLGxfbWFudDsKKworICAgICAgICBvcGpfY3BfdCAqbF9jcCA9IDAwOworICAgICAgICBvcGpfdGNwX3QgKmxfdGNwID0gMDA7CisgICAgICAgIG9wal90Y2NwX3QgKmxfdGNjcCA9IDAwOworCisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfaGVhZGVyX3NpemUgIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfZGF0YSAhPSAwMCk7CisKKyAgICAgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOworICAgICAgICBsX3RjcCA9ICZsX2NwLT50Y3BzW3BfdGlsZV9ub107CisgICAgICAgIGxfdGNjcCA9ICZsX3RjcC0+dGNjcHNbcF9jb21wX25vXTsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zIGFnYWluICovCisgICAgICAgIGFzc2VydChwX3RpbGVfbm8gPCBsX2NwLT50dyAqIGxfY3AtPnRoKTsKKyAgICAgICAgYXNzZXJ0KHBfY29tcF9ubyA8cF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHMpOworCisgICAgICAgIGxfbnVtX2JhbmRzID0gKGxfdGNjcC0+cW50c3R5ID09IEoyS19DQ1BfUU5UU1RZX1NJUU5UKSA/IDEgOiAobF90Y2NwLT5udW1yZXNvbHV0aW9ucyAqIDMgLSAyKTsKKworICAgICAgICBpZiAobF90Y2NwLT5xbnRzdHkgPT0gSjJLX0NDUF9RTlRTVFlfTk9RTlQpICB7CisgICAgICAgICAgICAgICAgbF9oZWFkZXJfc2l6ZSA9IDEgKyBsX251bV9iYW5kczsKKworICAgICAgICAgICAgICAgIGlmICgqcF9oZWFkZXJfc2l6ZSA8IGxfaGVhZGVyX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciB3cml0aW5nIFNRY2QgU1FjYyBlbGVtZW50XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgb3BqX3dyaXRlX2J5dGVzKHBfZGF0YSxsX3RjY3AtPnFudHN0eSArIChsX3RjY3AtPm51bWdiaXRzIDw8IDUpLCAxKTsgICAgLyogU3FjeCAqLworICAgICAgICAgICAgICAgICsrcF9kYXRhOworCisgICAgICAgICAgICAgICAgZm9yIChsX2JhbmRfbm8gPSAwOyBsX2JhbmRfbm8gPCBsX251bV9iYW5kczsgKytsX2JhbmRfbm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfZXhwbiA9IChPUEpfVUlOVDMyKWxfdGNjcC0+c3RlcHNpemVzW2xfYmFuZF9ub10uZXhwbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhwX2RhdGEsIGxfZXhwbiA8PCAzLCAxKTsgICAgICAgIC8qIFNQcWN4X2kgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICsrcF9kYXRhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsX2hlYWRlcl9zaXplID0gMSArIDIqbF9udW1fYmFuZHM7CisKKyAgICAgICAgICAgICAgICBpZiAoKnBfaGVhZGVyX3NpemUgPCBsX2hlYWRlcl9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd3JpdGluZyBTUWNkIFNRY2MgZWxlbWVudFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhwX2RhdGEsbF90Y2NwLT5xbnRzdHkgKyAobF90Y2NwLT5udW1nYml0cyA8PCA1KSwgMSk7ICAgIC8qIFNxY3ggKi8KKyAgICAgICAgICAgICAgICArK3BfZGF0YTsKKworICAgICAgICAgICAgICAgIGZvciAobF9iYW5kX25vID0gMDsgbF9iYW5kX25vIDwgbF9udW1fYmFuZHM7ICsrbF9iYW5kX25vKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsX2V4cG4gPSAoT1BKX1VJTlQzMilsX3RjY3AtPnN0ZXBzaXplc1tsX2JhbmRfbm9dLmV4cG47CisgICAgICAgICAgICAgICAgICAgICAgICBsX21hbnQgPSAoT1BKX1VJTlQzMilsX3RjY3AtPnN0ZXBzaXplc1tsX2JhbmRfbm9dLm1hbnQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhwX2RhdGEsIChsX2V4cG4gPDwgMTEpICsgbF9tYW50LCAyKTsgICAgLyogU1BxY3hfaSAqLworICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKnBfaGVhZGVyX3NpemUgPSAqcF9oZWFkZXJfc2l6ZSAtIGxfaGVhZGVyX3NpemU7CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX1NRY2RfU1FjYyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgICAgIC8qIGxvb3AqLworICAgICAgICBPUEpfVUlOVDMyIGxfYmFuZF9ubzsKKyAgICAgICAgb3BqX2NwX3QgKmxfY3AgPSAwMDsKKyAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOworICAgICAgICBvcGpfdGNjcF90ICpsX3RjY3AgPSAwMDsKKyAgICAgICAgT1BKX0JZVEUgKiBsX2N1cnJlbnRfcHRyID0gMDA7CisgICAgICAgIE9QSl9VSU5UMzIgbF90bXAsIGxfbnVtX2JhbmQ7CisKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyovCisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgICAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7CisKKyAgICAgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOworICAgICAgICAvKiBjb21lIGZyb20gdGlsZSBwYXJ0IGhlYWRlciBvciBtYWluIGhlYWRlciA/Ki8KKyAgICAgICAgbF90Y3AgPSAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPT0gSjJLX1NUQVRFX1RQSCkgPyAvKkZJWE1FIEoyS19ERUNfU1RBVEVfVFBIKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfY3AtPnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0gOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcDsKKworICAgICAgICAvKiBwcmVjb25kaXRpb24gYWdhaW4qLworICAgICAgICBhc3NlcnQocF9jb21wX25vIDwgIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzKTsKKworICAgICAgICBsX3RjY3AgPSAmbF90Y3AtPnRjY3BzW3BfY29tcF9ub107CisgICAgICAgIGxfY3VycmVudF9wdHIgPSBwX2hlYWRlcl9kYXRhOworCisgICAgICAgIGlmICgqcF9oZWFkZXJfc2l6ZSA8IDEpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBTUWNkIG9yIFNRY2MgZWxlbWVudFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICAqcF9oZWFkZXJfc2l6ZSAtPSAxOworCisgICAgICAgIG9wal9yZWFkX2J5dGVzKGxfY3VycmVudF9wdHIsICZsX3RtcCAsMSk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTcWN4ICovCisgICAgICAgICsrbF9jdXJyZW50X3B0cjsKKworICAgICAgICBsX3RjY3AtPnFudHN0eSA9IGxfdG1wICYgMHgxZjsKKyAgICAgICAgbF90Y2NwLT5udW1nYml0cyA9IGxfdG1wID4+IDU7CisgICAgICAgIGlmIChsX3RjY3AtPnFudHN0eSA9PSBKMktfQ0NQX1FOVFNUWV9TSVFOVCkgeworICAgICAgICBsX251bV9iYW5kID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsX251bV9iYW5kID0gKGxfdGNjcC0+cW50c3R5ID09IEoyS19DQ1BfUU5UU1RZX05PUU5UKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAoKnBfaGVhZGVyX3NpemUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICgqcF9oZWFkZXJfc2l6ZSkgLyAyOworCisgICAgICAgICAgICAgICAgaWYoIGxfbnVtX2JhbmQgPiBPUEpfSjJLX01BWEJBTkRTICkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiV2hpbGUgcmVhZGluZyBDQ1BfUU5UU1RZIGVsZW1lbnQgaW5zaWRlIFFDRCBvciBRQ0MgbWFya2VyIHNlZ21lbnQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWJlciBvZiBzdWJiYW5kcyAoJWQpIGlzIGdyZWF0ZXIgdG8gT1BKX0oyS19NQVhCQU5EUyAoJWQpLiBTbyB3ZSBsaW1pdCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHN0b3JlZCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPUEpfSjJLX01BWEJBTkRTICglZCkgYW5kIHNraXAgdGhlIHJlc3QuIFxuIiwgbF9udW1fYmFuZCwgT1BKX0oyS19NQVhCQU5EUywgT1BKX0oyS19NQVhCQU5EUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKnJldHVybiBPUEpfRkFMU0U7Ki8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmZGVmIFVTRV9KUFdMCisgICAgICAgIGlmIChsX2NwLT5jb3JyZWN0KSB7CisKKyAgICAgICAgICAgICAgICAvKiBpZiBKUFdMIGlzIG9uLCB3ZSBjaGVjayB3aGV0aGVyIHRoZXJlIGFyZSB0b28gbWFueSBzdWJiYW5kcyAqLworICAgICAgICAgICAgICAgIGlmICgvKihsX251bV9iYW5kIDwgMCkgfHwqLyAobF9udW1fYmFuZCA+PSBPUEpfSjJLX01BWEJBTkRTKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEpQV0xfQVNTVU1FID8gRVZUX1dBUk5JTkcgOiBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKUFdMOiBiYWQgbnVtYmVyIG9mIHN1YmJhbmRzIGluIFNxY3ggKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9udW1fYmFuZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUpQV0xfQVNTVU1FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJKUFdMOiBnaXZpbmcgdXBcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UgdHJ5IHRvIGNvcnJlY3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxfbnVtX2JhbmQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiLSB0cnlpbmcgdG8gYWRqdXN0IHRoZW1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0gc2V0dGluZyBudW1iZXIgb2YgYmFuZHMgdG8gJWQgPT4gSFlQT1RIRVNJUyEhIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9udW1fYmFuZCk7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICB9OworI2VuZGlmIC8qIFVTRV9KUFdMICovCisKKyAgICAgICAgaWYgKGxfdGNjcC0+cW50c3R5ID09IEoyS19DQ1BfUU5UU1RZX05PUU5UKSB7CisgICAgICAgICAgICAgICAgZm9yICAgICAobF9iYW5kX25vID0gMDsgbF9iYW5kX25vIDwgbF9udW1fYmFuZDsgbF9iYW5kX25vKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKGxfY3VycmVudF9wdHIsICZsX3RtcCAsMSk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTUHFjeF9pICovCisgICAgICAgICAgICAgICAgICAgICAgICArK2xfY3VycmVudF9wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9iYW5kX25vIDwgT1BKX0oyS19NQVhCQU5EUyl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNjcC0+c3RlcHNpemVzW2xfYmFuZF9ub10uZXhwbiA9IChPUEpfSU5UMzIpKGxfdG1wID4+IDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RjY3AtPnN0ZXBzaXplc1tsX2JhbmRfbm9dLm1hbnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqcF9oZWFkZXJfc2l6ZSA9ICpwX2hlYWRlcl9zaXplIC0gbF9udW1fYmFuZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgICAgIChsX2JhbmRfbm8gPSAwOyBsX2JhbmRfbm8gPCBsX251bV9iYW5kOyBsX2JhbmRfbm8rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMobF9jdXJyZW50X3B0ciwgJmxfdG1wICwyKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFNQcWN4X2kgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9wdHIrPTI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9iYW5kX25vIDwgT1BKX0oyS19NQVhCQU5EUyl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNjcC0+c3RlcHNpemVzW2xfYmFuZF9ub10uZXhwbiA9IChPUEpfSU5UMzIpKGxfdG1wID4+IDExKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90Y2NwLT5zdGVwc2l6ZXNbbF9iYW5kX25vXS5tYW50ID0gbF90bXAgJiAweDdmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKnBfaGVhZGVyX3NpemUgPSAqcF9oZWFkZXJfc2l6ZSAtIDIqbF9udW1fYmFuZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFkZCBBbnRvbmluIDogaWYgc2NhbGFyX2Rlcml2ZWQgLT4gY29tcHV0ZSBvdGhlciBzdGVwc2l6ZXMgKi8KKyAgICAgICAgaWYgKGxfdGNjcC0+cW50c3R5ID09IEoyS19DQ1BfUU5UU1RZX1NJUU5UKSB7CisgICAgICAgICAgICAgICAgZm9yIChsX2JhbmRfbm8gPSAxOyBsX2JhbmRfbm8gPCBPUEpfSjJLX01BWEJBTkRTOyBsX2JhbmRfbm8rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgbF90Y2NwLT5zdGVwc2l6ZXNbbF9iYW5kX25vXS5leHBuID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPUEpfSU5UMzIpKGxfdGNjcC0+c3RlcHNpemVzWzBdLmV4cG4pIC0gKE9QSl9JTlQzMikoKGxfYmFuZF9ubyAtIDEpIC8gMykgPiAwKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMikobF90Y2NwLT5zdGVwc2l6ZXNbMF0uZXhwbikgLSAoT1BKX0lOVDMyKSgobF9iYW5kX25vIC0gMSkgLyAzKSA6IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBsX3RjY3AtPnN0ZXBzaXplc1tsX2JhbmRfbm9dLm1hbnQgPSBsX3RjY3AtPnN0ZXBzaXplc1swXS5tYW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIHZvaWQgb3BqX2oya19jb3B5X3RpbGVfcXVhbnRpemF0aW9uX3BhcmFtZXRlcnMoIG9wal9qMmtfdCAqcF9qMmsgKQoreworICAgICAgICBPUEpfVUlOVDMyIGk7CisgICAgICAgIG9wal9jcF90ICpsX2NwID0gTlVMTDsKKyAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IE5VTEw7CisgICAgICAgIG9wal90Y2NwX3QgKmxfcmVmX3RjY3AgPSBOVUxMOworICAgICAgICBvcGpfdGNjcF90ICpsX2NvcGllZF90Y2NwID0gTlVMTDsKKyAgICAgICAgT1BKX1VJTlQzMiBsX3NpemU7CisKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOworCisgICAgICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKKyAgICAgICAgbF90Y3AgPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9PSBKMktfU1RBVEVfVFBIID8KKyAgICAgICAgICAgICAgICAgICAgICAgICZsX2NwLT50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwOworCisgICAgICAgIGxfcmVmX3RjY3AgPSAmbF90Y3AtPnRjY3BzWzBdOworICAgICAgICBsX2NvcGllZF90Y2NwID0gbF9yZWZfdGNjcCArIDE7CisgICAgICAgIGxfc2l6ZSA9IE9QSl9KMktfTUFYQkFORFMgKiBzaXplb2Yob3BqX3N0ZXBzaXplX3QpOworCisgICAgICAgIGZvciAgICAgKGk9MTtpPHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOysraSkgeworICAgICAgICAgICAgICAgIGxfY29waWVkX3RjY3AtPnFudHN0eSA9IGxfcmVmX3RjY3AtPnFudHN0eTsKKyAgICAgICAgICAgICAgICBsX2NvcGllZF90Y2NwLT5udW1nYml0cyA9IGxfcmVmX3RjY3AtPm51bWdiaXRzOworICAgICAgICAgICAgICAgIG1lbWNweShsX2NvcGllZF90Y2NwLT5zdGVwc2l6ZXMsbF9yZWZfdGNjcC0+c3RlcHNpemVzLGxfc2l6ZSk7CisgICAgICAgICAgICAgICAgKytsX2NvcGllZF90Y2NwOworICAgICAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG9wal9qMmtfZHVtcF90aWxlX2luZm8oIG9wal90Y3BfdCAqIGxfZGVmYXVsdF90aWxlLE9QSl9JTlQzMiBudW1jb21wcyxGSUxFKiBvdXRfc3RyZWFtKQoreworICAgICAgICBpZiAobF9kZWZhdWx0X3RpbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPUEpfSU5UMzIgY29tcG5vOworCisgICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHQgZGVmYXVsdCB0aWxlIHtcbiIpOworICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHQgY3N0eT0lI3hcbiIsIGxfZGVmYXVsdF90aWxlLT5jc3R5KTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0IHByZz0lI3hcbiIsIGxfZGVmYXVsdF90aWxlLT5wcmcpOworICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHQgbnVtbGF5ZXJzPSVkXG4iLCBsX2RlZmF1bHRfdGlsZS0+bnVtbGF5ZXJzKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0IG1jdD0leFxuIiwgbF9kZWZhdWx0X3RpbGUtPm1jdCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IG51bWNvbXBzOyBjb21wbm8rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjY3BfdCAqbF90Y2NwID0gJihsX2RlZmF1bHRfdGlsZS0+dGNjcHNbY29tcG5vXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHJlc25vOworICAgICAgT1BKX0lOVDMyIGJhbmRubywgbnVtYmFuZHM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvZGluZyBzdHlsZSovCisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0IGNvbXAgJWQge1xuIiwgY29tcG5vKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHRcdCBjc3R5PSUjeFxuIiwgbF90Y2NwLT5jc3R5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHRcdCBudW1yZXNvbHV0aW9ucz0lZFxuIiwgbF90Y2NwLT5udW1yZXNvbHV0aW9ucyk7CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0XHQgY2Jsa3c9Ml4lZFxuIiwgbF90Y2NwLT5jYmxrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0XHQgY2Jsa2g9Ml4lZFxuIiwgbF90Y2NwLT5jYmxraCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0XHQgY2Jsa3N0eT0lI3hcbiIsIGxfdGNjcC0+Y2Jsa3N0eSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0XHQgcW1mYmlkPSVkXG4iLCBsX3RjY3AtPnFtZmJpZCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHRcdCBwcmVjY2ludHNpemUgKHcsaCk9Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHJlc25vID0gMDsgcmVzbm8gPCBsX3RjY3AtPm51bXJlc29sdXRpb25zOyByZXNubysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIiglZCwlZCkgIiwgbF90Y2NwLT5wcmN3W3Jlc25vXSwgbF90Y2NwLT5wcmNoW3Jlc25vXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcbiIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBxdWFudGl6YXRpb24gc3R5bGUqLworICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHRcdFx0IHFudHN0eT0lZFxuIiwgbF90Y2NwLT5xbnRzdHkpOworICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHRcdFx0IG51bWdiaXRzPSVkXG4iLCBsX3RjY3AtPm51bWdiaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHRcdCBzdGVwc2l6ZXMgKG0sZSk9Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBudW1iYW5kcyA9IChsX3RjY3AtPnFudHN0eSA9PSBKMktfQ0NQX1FOVFNUWV9TSVFOVCkgPyAxIDogKE9QSl9JTlQzMilsX3RjY3AtPm51bXJlc29sdXRpb25zICogMyAtIDI7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IG51bWJhbmRzOyBiYW5kbm8rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICIoJWQsJWQpICIsIGxfdGNjcC0+c3RlcHNpemVzW2JhbmRub10ubWFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RjY3AtPnN0ZXBzaXplc1tiYW5kbm9dLmV4cG4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXG4iKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogUkdOIHZhbHVlKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHRcdCByb2lzaGlmdD0lZFxuIiwgbF90Y2NwLT5yb2lzaGlmdCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHQgfVxuIik7CisgICAgICAgICAgICAgICAgfSAvKmVuZCBvZiBjb21wb25lbnQgb2YgZGVmYXVsdCB0aWxlKi8KKyAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdCB9XG4iKTsgLyplbmQgb2YgZGVmYXVsdCB0aWxlKi8KKyAgICAgICAgICAgIH0KK30KKwordm9pZCBqMmtfZHVtcCAob3BqX2oya190KiBwX2oyaywgT1BKX0lOVDMyIGZsYWcsIEZJTEUqIG91dF9zdHJlYW0pCit7CisgICAgICAgIC8qIENoZWNrIGlmIHRoZSBmbGFnIGlzIGNvbXBhdGlibGUgd2l0aCBqMmsgZmlsZSovCisgICAgICAgIGlmICggKGZsYWcgJiBPUEpfSlAyX0lORk8pIHx8IChmbGFnICYgT1BKX0pQMl9JTkQpKXsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJXcm9uZyBmbGFnXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvKiBEdW1wIHRoZSBpbWFnZV9oZWFkZXIgKi8KKyAgICAgICAgaWYgKGZsYWcgJiBPUEpfSU1HX0lORk8peworICAgICAgICAgICAgICAgIGlmIChwX2oyay0+bV9wcml2YXRlX2ltYWdlKQorICAgICAgICAgICAgICAgICAgICAgICAgajJrX2R1bXBfaW1hZ2VfaGVhZGVyKHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UsIDAsIG91dF9zdHJlYW0pOworICAgICAgICB9CisKKyAgICAgICAgLyogRHVtcCB0aGUgY29kZXN0cmVhbSBpbmZvIGZyb20gbWFpbiBoZWFkZXIgKi8KKyAgICAgICAgaWYgKGZsYWcgJiBPUEpfSjJLX01IX0lORk8peworICAgICAgICAgICAgICAgIG9wal9qMmtfZHVtcF9NSF9pbmZvKHBfajJrLCBvdXRfc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICAvKiBEdW1wIGFsbCB0aWxlL2NvZGVzdHJlYW0gaW5mbyAqLworICAgICAgICBpZiAoZmxhZyAmIE9QSl9KMktfVENIX0lORk8peworICAgICAgICAgIE9QSl9VSU5UMzIgbF9uYl90aWxlcyA9IHBfajJrLT5tX2NwLnRoICogcF9qMmstPm1fY3AudHc7CisgICAgICAgICAgT1BKX1VJTlQzMiBpOworICAgICAgICAgIG9wal90Y3BfdCAqIGxfdGNwID0gcF9qMmstPm1fY3AudGNwczsKKyAgICAgICAgICBmb3IgKGk9MDtpPGxfbmJfdGlsZXM7KytpKSB7CisgICAgICAgICAgICBvcGpfajJrX2R1bXBfdGlsZV9pbmZvKCBsX3RjcCwoT1BKX0lOVDMyKXBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzLCBvdXRfc3RyZWFtKTsKKyAgICAgICAgICAgICsrbF90Y3A7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogRHVtcCB0aGUgY29kZXN0cmVhbSBpbmZvIG9mIHRoZSBjdXJyZW50IHRpbGUgKi8KKyAgICAgICAgaWYgKGZsYWcgJiBPUEpfSjJLX1RIX0lORk8peworCisgICAgICAgIH0KKworICAgICAgICAvKiBEdW1wIHRoZSBjb2Rlc3RyZWFtIGluZGV4IGZyb20gbWFpbiBoZWFkZXIgKi8KKyAgICAgICAgaWYgKGZsYWcgJiBPUEpfSjJLX01IX0lORCl7CisgICAgICAgICAgICAgICAgb3BqX2oya19kdW1wX01IX2luZGV4KHBfajJrLCBvdXRfc3RyZWFtKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIER1bXAgdGhlIGNvZGVzdHJlYW0gaW5kZXggb2YgdGhlIGN1cnJlbnQgdGlsZSAqLworICAgICAgICBpZiAoZmxhZyAmIE9QSl9KMktfVEhfSU5EKXsKKworICAgICAgICB9CisKK30KKworc3RhdGljIHZvaWQgb3BqX2oya19kdW1wX01IX2luZGV4KG9wal9qMmtfdCogcF9qMmssIEZJTEUqIG91dF9zdHJlYW0pCit7CisgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZGV4X3QqIGNzdHJfaW5kZXggPSBwX2oyay0+Y3N0cl9pbmRleDsKKyAgICAgICAgT1BKX1VJTlQzMiBpdF9tYXJrZXIsIGl0X3RpbGUsIGl0X3RpbGVfcGFydDsKKworICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJDb2Rlc3RyZWFtIGluZGV4IGZyb20gbWFpbiBoZWFkZXI6IHtcbiIpOworCisgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0IE1haW4gaGVhZGVyIHN0YXJ0IHBvc2l0aW9uPSUiIFBSSWk2NCAiXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHQgTWFpbiBoZWFkZXIgZW5kIHBvc2l0aW9uPSUiIFBSSWk2NCAiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+bWFpbl9oZWFkX3N0YXJ0LCBjc3RyX2luZGV4LT5tYWluX2hlYWRfZW5kKTsKKworICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdCBNYXJrZXIgbGlzdDoge1xuIik7CisKKyAgICAgICAgaWYgKGNzdHJfaW5kZXgtPm1hcmtlcil7CisgICAgICAgICAgICAgICAgZm9yIChpdF9tYXJrZXI9MDsgaXRfbWFya2VyIDwgY3N0cl9pbmRleC0+bWFya251bSA7IGl0X21hcmtlcisrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHQgdHlwZT0lI3gsIHBvcz0lIiBQUklpNjQgIiwgbGVuPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5kZXgtPm1hcmtlcltpdF9tYXJrZXJdLnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+bWFya2VyW2l0X21hcmtlcl0ucG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5kZXgtPm1hcmtlcltpdF9tYXJrZXJdLmxlbiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0IH1cbiIpOworCisgICAgICAgIGlmIChjc3RyX2luZGV4LT50aWxlX2luZGV4KXsKKworICAgICAgICAvKiBTaW1wbGUgdGVzdCB0byBhdm9pZCB0byB3cml0ZSBlbXB0eSBpbmZvcm1hdGlvbiovCisgICAgICAgIE9QSl9VSU5UMzIgbF9hY2NfbmJfb2ZfdGlsZV9wYXJ0ID0gMDsKKyAgICAgICAgZm9yIChpdF90aWxlPTA7IGl0X3RpbGUgPCBjc3RyX2luZGV4LT5uYl9vZl90aWxlcyA7IGl0X3RpbGUrKyl7CisgICAgICAgICAgICAgICAgICAgICAgICBsX2FjY19uYl9vZl90aWxlX3BhcnQgKz0gY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5uYl90cHM7CisgICAgICAgIH0KKworICAgICAgICBpZiAobF9hY2NfbmJfb2ZfdGlsZV9wYXJ0KQorICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdCBUaWxlIGluZGV4OiB7XG4iKTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGl0X3RpbGU9MDsgaXRfdGlsZSA8IGNzdHJfaW5kZXgtPm5iX29mX3RpbGVzIDsgaXRfdGlsZSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG5iX29mX3RpbGVfcGFydCA9IGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubmJfdHBzOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHRcdCBuYiBvZiB0aWxlLXBhcnQgaW4gdGlsZSBbJWRdPSVkXG4iLCBpdF90aWxlLCBuYl9vZl90aWxlX3BhcnQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXgpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpdF90aWxlX3BhcnQgPTA7IGl0X3RpbGVfcGFydCA8IG5iX29mX3RpbGVfcGFydDsgaXRfdGlsZV9wYXJ0KyspeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0XHQgdGlsZS1wYXJ0WyVkXTogc3Rhcl9wb3M9JSIgUFJJaTY0ICIsIGVuZF9oZWFkZXI9JSIgUFJJaTY0ICIsIGVuZF9wb3M9JSIgUFJJaTY0ICIuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRfdGlsZV9wYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS50cF9pbmRleFtpdF90aWxlX3BhcnRdLnN0YXJ0X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXhbaXRfdGlsZV9wYXJ0XS5lbmRfaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS50cF9pbmRleFtpdF90aWxlX3BhcnRdLmVuZF9wb3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtlcil7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGl0X21hcmtlcj0wOyBpdF9tYXJrZXIgPCBjc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtudW0gOyBpdF9tYXJrZXIrKyl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHQgdHlwZT0lI3gsIHBvcz0lIiBQUklpNjQgIiwgbGVuPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrZXJbaXRfbWFya2VyXS50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrZXJbaXRfbWFya2VyXS5wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtlcltpdF9tYXJrZXJdLmxlbiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sIlx0IH1cbiIpOworICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sIn1cbiIpOworCit9CisKKworc3RhdGljIHZvaWQgb3BqX2oya19kdW1wX01IX2luZm8ob3BqX2oya190KiBwX2oyaywgRklMRSogb3V0X3N0cmVhbSkKK3sKKworICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJDb2Rlc3RyZWFtIGluZm8gZnJvbSBtYWluIGhlYWRlcjoge1xuIik7CisKKyAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHQgdHgwPSVkLCB0eTA9JWRcbiIsIHBfajJrLT5tX2NwLnR4MCwgcF9qMmstPm1fY3AudHkwKTsKKyAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHQgdGR4PSVkLCB0ZHk9JWRcbiIsIHBfajJrLT5tX2NwLnRkeCwgcF9qMmstPm1fY3AudGR5KTsKKyAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHQgdHc9JWQsIHRoPSVkXG4iLCBwX2oyay0+bV9jcC50dywgcF9qMmstPm1fY3AudGgpOworICAgICAgICBvcGpfajJrX2R1bXBfdGlsZV9pbmZvKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwLChPUEpfSU5UMzIpcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHMsIG91dF9zdHJlYW0pOworICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJ9XG4iKTsKK30KKwordm9pZCBqMmtfZHVtcF9pbWFnZV9oZWFkZXIob3BqX2ltYWdlX3QqIGltZ19oZWFkZXIsIE9QSl9CT09MIGRldl9kdW1wX2ZsYWcsIEZJTEUqIG91dF9zdHJlYW0pCit7CisgICAgICAgIGNoYXIgdGFiWzJdOworCisgICAgICAgIGlmIChkZXZfZHVtcF9mbGFnKXsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIltERVZdIER1bXAgYW4gaW1hZ2VfaGVhZGVyIHN0cnVjdCB7XG4iKTsKKyAgICAgICAgICAgICAgICB0YWJbMF0gPSAnXDAnOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIkltYWdlIGluZm8ge1xuIik7CisgICAgICAgICAgICAgICAgdGFiWzBdID0gJ1x0Jzt0YWJbMV0gPSAnXDAnOworICAgICAgICB9CisKKyAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiJXMgeDA9JWQsIHkwPSVkXG4iLCB0YWIsIGltZ19oZWFkZXItPngwLCBpbWdfaGVhZGVyLT55MCk7CisgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgICAgICIlcyB4MT0lZCwgeTE9JWRcbiIsIHRhYiwgaW1nX2hlYWRlci0+eDEsIGltZ19oZWFkZXItPnkxKTsKKyAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiJXMgbnVtY29tcHM9JWRcbiIsIHRhYiwgaW1nX2hlYWRlci0+bnVtY29tcHMpOworCisgICAgICAgIGlmIChpbWdfaGVhZGVyLT5jb21wcyl7CisgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBjb21wbm87CisgICAgICAgICAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBpbWdfaGVhZGVyLT5udW1jb21wczsgY29tcG5vKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIiVzXHQgY29tcG9uZW50ICVkIHtcbiIsIHRhYiwgY29tcG5vKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGoya19kdW1wX2ltYWdlX2NvbXBfaGVhZGVyKCYoaW1nX2hlYWRlci0+Y29tcHNbY29tcG5vXSksIGRldl9kdW1wX2ZsYWcsIG91dF9zdHJlYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCIlc31cbiIsdGFiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJ9XG4iKTsKK30KKwordm9pZCBqMmtfZHVtcF9pbWFnZV9jb21wX2hlYWRlcihvcGpfaW1hZ2VfY29tcF90KiBjb21wX2hlYWRlciwgT1BKX0JPT0wgZGV2X2R1bXBfZmxhZywgRklMRSogb3V0X3N0cmVhbSkKK3sKKyAgICAgICAgY2hhciB0YWJbM107CisKKyAgICAgICAgaWYgKGRldl9kdW1wX2ZsYWcpeworICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiW0RFVl0gRHVtcCBhbiBpbWFnZV9jb21wX2hlYWRlciBzdHJ1Y3Qge1xuIik7CisgICAgICAgICAgICAgICAgdGFiWzBdID0gJ1wwJzsKKyAgICAgICAgfSAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0YWJbMF0gPSAnXHQnO3RhYlsxXSA9ICdcdCc7dGFiWzJdID0gJ1wwJzsKKyAgICAgICAgfQorCisgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIiVzIGR4PSVkLCBkeT0lZFxuIiwgdGFiLCBjb21wX2hlYWRlci0+ZHgsIGNvbXBfaGVhZGVyLT5keSk7CisgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIiVzIHByZWM9JWRcbiIsIHRhYiwgY29tcF9oZWFkZXItPnByZWMpOworICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICIlcyBzZ25kPSVkXG4iLCB0YWIsIGNvbXBfaGVhZGVyLT5zZ25kKTsKKworICAgICAgICBpZiAoZGV2X2R1bXBfZmxhZykKKyAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJ9XG4iKTsKK30KKworb3BqX2NvZGVzdHJlYW1faW5mb192Ml90KiBqMmtfZ2V0X2NzdHJfaW5mbyhvcGpfajJrX3QqIHBfajJrKQoreworICAgICAgICBPUEpfVUlOVDMyIGNvbXBubzsKKyAgICAgICAgT1BKX1VJTlQzMiBudW1jb21wcyA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOworICAgICAgICBvcGpfdGNwX3QgKmxfZGVmYXVsdF90aWxlOworICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmZvX3YyX3QqIGNzdHJfaW5mbyA9IChvcGpfY29kZXN0cmVhbV9pbmZvX3YyX3QqKSBvcGpfY2FsbG9jKDEsc2l6ZW9mKG9wal9jb2Rlc3RyZWFtX2luZm9fdjJfdCkpOworCQlpZiAoIWNzdHJfaW5mbykKKwkJCXJldHVybiBOVUxMOworCisgICAgICAgIGNzdHJfaW5mby0+bmJjb21wcyA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOworCisgICAgICAgIGNzdHJfaW5mby0+dHgwID0gcF9qMmstPm1fY3AudHgwOworICAgICAgICBjc3RyX2luZm8tPnR5MCA9IHBfajJrLT5tX2NwLnR5MDsKKyAgICAgICAgY3N0cl9pbmZvLT50ZHggPSBwX2oyay0+bV9jcC50ZHg7CisgICAgICAgIGNzdHJfaW5mby0+dGR5ID0gcF9qMmstPm1fY3AudGR5OworICAgICAgICBjc3RyX2luZm8tPnR3ID0gcF9qMmstPm1fY3AudHc7CisgICAgICAgIGNzdHJfaW5mby0+dGggPSBwX2oyay0+bV9jcC50aDsKKworICAgICAgICBjc3RyX2luZm8tPnRpbGVfaW5mbyA9IE5VTEw7IC8qIE5vdCBmaWxsIGZyb20gdGhlIG1haW4gaGVhZGVyKi8KKworICAgICAgICBsX2RlZmF1bHRfdGlsZSA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwOworCisgICAgICAgIGNzdHJfaW5mby0+bV9kZWZhdWx0X3RpbGVfaW5mby5jc3R5ID0gbF9kZWZhdWx0X3RpbGUtPmNzdHk7CisgICAgICAgIGNzdHJfaW5mby0+bV9kZWZhdWx0X3RpbGVfaW5mby5wcmcgPSBsX2RlZmF1bHRfdGlsZS0+cHJnOworICAgICAgICBjc3RyX2luZm8tPm1fZGVmYXVsdF90aWxlX2luZm8ubnVtbGF5ZXJzID0gbF9kZWZhdWx0X3RpbGUtPm51bWxheWVyczsKKyAgICAgICAgY3N0cl9pbmZvLT5tX2RlZmF1bHRfdGlsZV9pbmZvLm1jdCA9IGxfZGVmYXVsdF90aWxlLT5tY3Q7CisKKyAgICAgICAgY3N0cl9pbmZvLT5tX2RlZmF1bHRfdGlsZV9pbmZvLnRjY3BfaW5mbyA9IChvcGpfdGNjcF9pbmZvX3QqKSBvcGpfY2FsbG9jKGNzdHJfaW5mby0+bmJjb21wcywgc2l6ZW9mKG9wal90Y2NwX2luZm9fdCkpOworCQlpZiAoIWNzdHJfaW5mby0+bV9kZWZhdWx0X3RpbGVfaW5mby50Y2NwX2luZm8pCisJCXsKKwkJCW9wal9kZXN0cm95X2NzdHJfaW5mbygmY3N0cl9pbmZvKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKyAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBudW1jb21wczsgY29tcG5vKyspIHsKKyAgICAgICAgICAgICAgICBvcGpfdGNjcF90ICpsX3RjY3AgPSAmKGxfZGVmYXVsdF90aWxlLT50Y2Nwc1tjb21wbm9dKTsKKyAgICAgICAgICAgICAgICBvcGpfdGNjcF9pbmZvX3QgKmxfdGNjcF9pbmZvID0gJihjc3RyX2luZm8tPm1fZGVmYXVsdF90aWxlX2luZm8udGNjcF9pbmZvW2NvbXBub10pOworICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBiYW5kbm8sIG51bWJhbmRzOworCisgICAgICAgICAgICAgICAgLyogY29kaW5nIHN0eWxlKi8KKyAgICAgICAgICAgICAgICBsX3RjY3BfaW5mby0+Y3N0eSA9IGxfdGNjcC0+Y3N0eTsKKyAgICAgICAgICAgICAgICBsX3RjY3BfaW5mby0+bnVtcmVzb2x1dGlvbnMgPSBsX3RjY3AtPm51bXJlc29sdXRpb25zOworICAgICAgICAgICAgICAgIGxfdGNjcF9pbmZvLT5jYmxrdyA9IGxfdGNjcC0+Y2Jsa3c7CisgICAgICAgICAgICAgICAgbF90Y2NwX2luZm8tPmNibGtoID0gbF90Y2NwLT5jYmxraDsKKyAgICAgICAgICAgICAgICBsX3RjY3BfaW5mby0+Y2Jsa3N0eSA9IGxfdGNjcC0+Y2Jsa3N0eTsKKyAgICAgICAgICAgICAgICBsX3RjY3BfaW5mby0+cW1mYmlkID0gbF90Y2NwLT5xbWZiaWQ7CisgICAgICAgICAgICAgICAgaWYgKGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMgPCBPUEpfSjJLX01BWFJMVkxTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShsX3RjY3BfaW5mby0+cHJjaCwgbF90Y2NwLT5wcmNoLCBsX3RjY3AtPm51bXJlc29sdXRpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShsX3RjY3BfaW5mby0+cHJjdywgbF90Y2NwLT5wcmN3LCBsX3RjY3AtPm51bXJlc29sdXRpb25zKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBxdWFudGl6YXRpb24gc3R5bGUqLworICAgICAgICAgICAgICAgIGxfdGNjcF9pbmZvLT5xbnRzdHkgPSBsX3RjY3AtPnFudHN0eTsKKyAgICAgICAgICAgICAgICBsX3RjY3BfaW5mby0+bnVtZ2JpdHMgPSBsX3RjY3AtPm51bWdiaXRzOworCisgICAgICAgICAgICAgICAgbnVtYmFuZHMgPSAobF90Y2NwLT5xbnRzdHkgPT0gSjJLX0NDUF9RTlRTVFlfU0lRTlQpID8gMSA6IChPUEpfSU5UMzIpbF90Y2NwLT5udW1yZXNvbHV0aW9ucyAqIDMgLSAyOworICAgICAgICAgICAgICAgIGlmIChudW1iYW5kcyA8IE9QSl9KMktfTUFYQkFORFMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgbnVtYmFuZHM7IGJhbmRubysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNjcF9pbmZvLT5zdGVwc2l6ZXNfbWFudFtiYW5kbm9dID0gKE9QSl9VSU5UMzIpbF90Y2NwLT5zdGVwc2l6ZXNbYmFuZG5vXS5tYW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RjY3BfaW5mby0+c3RlcHNpemVzX2V4cG5bYmFuZG5vXSA9IChPUEpfVUlOVDMyKWxfdGNjcC0+c3RlcHNpemVzW2JhbmRub10uZXhwbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBSR04gdmFsdWUqLworICAgICAgICAgICAgICAgIGxfdGNjcF9pbmZvLT5yb2lzaGlmdCA9IGxfdGNjcC0+cm9pc2hpZnQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY3N0cl9pbmZvOworfQorCitvcGpfY29kZXN0cmVhbV9pbmRleF90KiBqMmtfZ2V0X2NzdHJfaW5kZXgob3BqX2oya190KiBwX2oyaykKK3sKKyAgICAgICAgb3BqX2NvZGVzdHJlYW1faW5kZXhfdCogbF9jc3RyX2luZGV4ID0gKG9wal9jb2Rlc3RyZWFtX2luZGV4X3QqKQorICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NhbGxvYygxLHNpemVvZihvcGpfY29kZXN0cmVhbV9pbmRleF90KSk7CisgICAgICAgIGlmICghbF9jc3RyX2luZGV4KQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICAgIGxfY3N0cl9pbmRleC0+bWFpbl9oZWFkX3N0YXJ0ID0gcF9qMmstPmNzdHJfaW5kZXgtPm1haW5faGVhZF9zdGFydDsKKyAgICAgICAgbF9jc3RyX2luZGV4LT5tYWluX2hlYWRfZW5kID0gcF9qMmstPmNzdHJfaW5kZXgtPm1haW5faGVhZF9lbmQ7CisgICAgICAgIGxfY3N0cl9pbmRleC0+Y29kZXN0cmVhbV9zaXplID0gcF9qMmstPmNzdHJfaW5kZXgtPmNvZGVzdHJlYW1fc2l6ZTsKKworICAgICAgICBsX2NzdHJfaW5kZXgtPm1hcmtudW0gPSBwX2oyay0+Y3N0cl9pbmRleC0+bWFya251bTsKKyAgICAgICAgbF9jc3RyX2luZGV4LT5tYXJrZXIgPSAob3BqX21hcmtlcl9pbmZvX3QqKW9wal9tYWxsb2MobF9jc3RyX2luZGV4LT5tYXJrbnVtKnNpemVvZihvcGpfbWFya2VyX2luZm9fdCkpOworICAgICAgICBpZiAoIWxfY3N0cl9pbmRleC0+bWFya2VyKXsKKyAgICAgICAgICAgICAgICBvcGpfZnJlZSggbF9jc3RyX2luZGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwX2oyay0+Y3N0cl9pbmRleC0+bWFya2VyKQorICAgICAgICAgICAgICAgIG1lbWNweShsX2NzdHJfaW5kZXgtPm1hcmtlciwgcF9qMmstPmNzdHJfaW5kZXgtPm1hcmtlciwgbF9jc3RyX2luZGV4LT5tYXJrbnVtICogc2l6ZW9mKG9wal9tYXJrZXJfaW5mb190KSApOworICAgICAgICBlbHNleworICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3N0cl9pbmRleC0+bWFya2VyKTsKKyAgICAgICAgICAgICAgICBsX2NzdHJfaW5kZXgtPm1hcmtlciA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBsX2NzdHJfaW5kZXgtPm5iX29mX3RpbGVzID0gcF9qMmstPmNzdHJfaW5kZXgtPm5iX29mX3RpbGVzOworICAgICAgICBsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXggPSAob3BqX3RpbGVfaW5kZXhfdCopb3BqX2NhbGxvYyhsX2NzdHJfaW5kZXgtPm5iX29mX3RpbGVzLCBzaXplb2Yob3BqX3RpbGVfaW5kZXhfdCkgKTsKKyAgICAgICAgaWYgKCFsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXgpeworICAgICAgICAgICAgICAgIG9wal9mcmVlKCBsX2NzdHJfaW5kZXgtPm1hcmtlcik7CisgICAgICAgICAgICAgICAgb3BqX2ZyZWUoIGxfY3N0cl9pbmRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4KXsKKyAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXgpOworICAgICAgICAgICAgICAgIGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBpdF90aWxlID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGl0X3RpbGUgPSAwOyBpdF90aWxlIDwgbF9jc3RyX2luZGV4LT5uYl9vZl90aWxlczsgaXRfdGlsZSsrICl7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRpbGUgTWFya2VyKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrbnVtID0gcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya251bTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcGpfbWFya2VyX2luZm9fdCopb3BqX21hbGxvYyhsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya251bSpzaXplb2Yob3BqX21hcmtlcl9pbmZvX3QpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya2VyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgaXRfdGlsZV9mcmVlOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaXRfdGlsZV9mcmVlPTA7IGl0X3RpbGVfZnJlZSA8IGl0X3RpbGU7IGl0X3RpbGVfZnJlZSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV9mcmVlXS5tYXJrZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUoIGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKCBsX2NzdHJfaW5kZXgtPm1hcmtlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKCBsX2NzdHJfaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCBsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtudW0gKiBzaXplb2Yob3BqX21hcmtlcl9pbmZvX3QpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya2VyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRpbGUgcGFydCBpbmRleCovCisgICAgICAgICAgICAgICAgICAgICAgICBsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubmJfdHBzID0gcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubmJfdHBzOworCisgICAgICAgICAgICAgICAgICAgICAgICBsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXggPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3BqX3RwX2luZGV4X3QqKW9wal9tYWxsb2MobF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm5iX3RwcypzaXplb2Yob3BqX3RwX2luZGV4X3QpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS50cF9pbmRleCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgaXRfdGlsZV9mcmVlOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaXRfdGlsZV9mcmVlPTA7IGl0X3RpbGVfZnJlZSA8IGl0X3RpbGU7IGl0X3RpbGVfZnJlZSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV9mcmVlXS5tYXJrZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlX2ZyZWVdLnRwX2luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKCBsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZSggbF9jc3RyX2luZGV4LT5tYXJrZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZSggbF9jc3RyX2luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS50cF9pbmRleCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSggbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLnRwX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubmJfdHBzICogc2l6ZW9mKG9wal90cF9pbmRleF90KSApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLnRwX2luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLnRwX2luZGV4ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogUGFja2V0IGluZGV4IChOT1QgVVNFRCkqLworICAgICAgICAgICAgICAgICAgICAgICAgbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm5iX3BhY2tldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ucGFja2V0X2luZGV4ID0gTlVMTDsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsX2NzdHJfaW5kZXg7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2FsbG9jYXRlX3RpbGVfZWxlbWVudF9jc3RyX2luZGV4KG9wal9qMmtfdCAqcF9qMmspCit7CisgICAgICAgIE9QSl9VSU5UMzIgaXRfdGlsZT0wOworCisgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT5uYl9vZl90aWxlcyA9IHBfajJrLT5tX2NwLnR3ICogcF9qMmstPm1fY3AudGg7CisgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4ID0gKG9wal90aWxlX2luZGV4X3QqKW9wal9jYWxsb2MocF9qMmstPmNzdHJfaW5kZXgtPm5iX29mX3RpbGVzLCBzaXplb2Yob3BqX3RpbGVfaW5kZXhfdCkpOworICAgICAgICBpZiAoIXBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4KQorICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisKKyAgICAgICAgZm9yIChpdF90aWxlPTA7IGl0X3RpbGUgPCBwX2oyay0+Y3N0cl9pbmRleC0+bmJfb2ZfdGlsZXM7IGl0X3RpbGUrKyl7CisgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWF4bWFya251bSA9IDEwMDsKKyAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrbnVtID0gMDsKKyAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrZXIgPSAob3BqX21hcmtlcl9pbmZvX3QqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY2FsbG9jKHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1heG1hcmtudW0sIHNpemVvZihvcGpfbWFya2VyX2luZm9fdCkpOworICAgICAgICAgICAgICAgIGlmICghcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya2VyKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfZGVjb2RlX3RpbGVzICggb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKK3sKKyAgICAgICAgT1BKX0JPT0wgbF9nb19vbiA9IE9QSl9UUlVFOworICAgICAgICBPUEpfVUlOVDMyIGxfY3VycmVudF90aWxlX25vOworICAgICAgICBPUEpfVUlOVDMyIGxfZGF0YV9zaXplLGxfbWF4X2RhdGFfc2l6ZTsKKyAgICAgICAgT1BKX0lOVDMyIGxfdGlsZV94MCxsX3RpbGVfeTAsbF90aWxlX3gxLGxfdGlsZV95MTsKKyAgICAgICAgT1BKX1VJTlQzMiBsX25iX2NvbXBzOworICAgICAgICBPUEpfQllURSAqIGxfY3VycmVudF9kYXRhOworICAgICAgICBPUEpfVUlOVDMyIG5yX3RpbGVzID0gMDsKKworICAgICAgICBsX2N1cnJlbnRfZGF0YSA9IChPUEpfQllURSopb3BqX21hbGxvYygxMDAwKTsKKyAgICAgICAgaWYgKCEgbF9jdXJyZW50X2RhdGEpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gZGVjb2RlIHRpbGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGxfbWF4X2RhdGFfc2l6ZSA9IDEwMDA7CisKKwkJZm9yICg7OykgeworICAgICAgICAgICAgICAgIGlmICghIG9wal9qMmtfcmVhZF90aWxlX2hlYWRlciggcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfY3VycmVudF90aWxlX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF90aWxlX3gwLCAmbF90aWxlX3kwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX3RpbGVfeDEsICZsX3RpbGVfeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfbmJfY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfZ29fb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoISBsX2dvX29uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobF9kYXRhX3NpemUgPiBsX21heF9kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpsX25ld19jdXJyZW50X2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MobF9jdXJyZW50X2RhdGEsIGxfZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIGxfbmV3X2N1cnJlbnRfZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBkZWNvZGUgdGlsZSAlZC8lZFxuIiwgbF9jdXJyZW50X3RpbGVfbm8gKzEsIHBfajJrLT5tX2NwLnRoICogcF9qMmstPm1fY3AudHcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X2RhdGEgPSBsX25ld19jdXJyZW50X2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICBsX21heF9kYXRhX3NpemUgPSBsX2RhdGFfc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoISBvcGpfajJrX2RlY29kZV90aWxlKHBfajJrLGxfY3VycmVudF90aWxlX25vLGxfY3VycmVudF9kYXRhLGxfZGF0YV9zaXplLHBfc3RyZWFtLHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gZGVjb2RlIHRpbGUgJWQvJWRcbiIsIGxfY3VycmVudF90aWxlX25vICsxLCBwX2oyay0+bV9jcC50aCAqIHBfajJrLT5tX2NwLnR3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfSU5GTywgIlRpbGUgJWQvJWQgaGFzIGJlZW4gZGVjb2RlZC5cbiIsIGxfY3VycmVudF90aWxlX25vICsxLCBwX2oyay0+bV9jcC50aCAqIHBfajJrLT5tX2NwLnR3KTsKKworICAgICAgICAgICAgICAgIGlmICghIG9wal9qMmtfdXBkYXRlX2ltYWdlX2RhdGEocF9qMmstPm1fdGNkLGxfY3VycmVudF9kYXRhLCBwX2oyay0+bV9vdXRwdXRfaW1hZ2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0lORk8sICJJbWFnZSBkYXRhIGhhcyBiZWVuIHVwZGF0ZWQgd2l0aCB0aWxlICVkLlxuXG4iLCBsX2N1cnJlbnRfdGlsZV9ubyArIDEpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmKG9wal9zdHJlYW1fZ2V0X251bWJlcl9ieXRlX2xlZnQocF9zdHJlYW0pID09IDAgIAorICAgICAgICAgICAgICAgICAgICAmJiBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9PSBKMktfU1RBVEVfTkVPQykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYoKytucl90aWxlcyA9PSAgcF9qMmstPm1fY3AudGggKiBwX2oyay0+bV9jcC50dykgCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOworCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworLyoqCisgKiBTZXRzIHVwIHRoZSBwcm9jZWR1cmVzIHRvIGRvIG9uIGRlY29kaW5nIGRhdGEuIERldmVsb3BwZXJzIHdhbnRpbmcgdG8gZXh0ZW5kIHRoZSBsaWJyYXJ5IGNhbiBhZGQgdGhlaXIgb3duIHJlYWRpbmcgcHJvY2VkdXJlcy4KKyAqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfc2V0dXBfZGVjb2RpbmcgKG9wal9qMmtfdCAqcF9qMmssIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKK3sKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyovCisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisgICAgICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfZGVjb2RlX3RpbGVzLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICAvKiBERVZFTE9QRVIgQ09STkVSLCBhZGQgeW91ciBjdXN0b20gcHJvY2VkdXJlcyAqLworCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworLyoKKyAqIFJlYWQgYW5kIGRlY29kZSBvbmUgdGlsZS4KKyAqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfZGVjb2RlX29uZV90aWxlICggICAgICAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQoreworICAgICAgICBPUEpfQk9PTCBsX2dvX29uID0gT1BKX1RSVUU7CisgICAgICAgIE9QSl9VSU5UMzIgbF9jdXJyZW50X3RpbGVfbm87CisgICAgICAgIE9QSl9VSU5UMzIgbF90aWxlX25vX3RvX2RlYzsKKyAgICAgICAgT1BKX1VJTlQzMiBsX2RhdGFfc2l6ZSxsX21heF9kYXRhX3NpemU7CisgICAgICAgIE9QSl9JTlQzMiBsX3RpbGVfeDAsbF90aWxlX3kwLGxfdGlsZV94MSxsX3RpbGVfeTE7CisgICAgICAgIE9QSl9VSU5UMzIgbF9uYl9jb21wczsKKyAgICAgICAgT1BKX0JZVEUgKiBsX2N1cnJlbnRfZGF0YTsKKworICAgICAgICBsX2N1cnJlbnRfZGF0YSA9IChPUEpfQllURSopb3BqX21hbGxvYygxMDAwKTsKKyAgICAgICAgaWYgKCEgbF9jdXJyZW50X2RhdGEpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gZGVjb2RlIG9uZSB0aWxlXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGxfbWF4X2RhdGFfc2l6ZSA9IDEwMDA7CisKKyAgICAgICAgLypBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBzb21lIGVsZW1lbnRzIG9mIGNvZGVzdHJlbSBpbmRleCBpZiBub3QgYWxyZWFkeSBkb25lKi8KKyAgICAgICAgaWYoICFwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghb3BqX2oya19hbGxvY2F0ZV90aWxlX2VsZW1lbnRfY3N0cl9pbmRleChwX2oyaykpeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogTW92ZSBpbnRvIHRoZSBjb2Rlc3RyZWFtIHRvIHRoZSBmaXJzdCBTT1QgdXNlZCB0byBkZWNvZGUgdGhlIGRlc2lyZWQgdGlsZSAqLworICAgICAgICBsX3RpbGVfbm9fdG9fZGVjID0gKE9QSl9VSU5UMzIpcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fdGlsZV9pbmRfdG9fZGVjOworICAgICAgICBpZiAocF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXgpCisgICAgICAgICAgICAgICAgaWYocF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXgtPnRwX2luZGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtsX3RpbGVfbm9fdG9fZGVjXS5uYl90cHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIGluZGV4IGZvciB0aGlzIHRpbGUgaGFzIG5vdCBiZWVuIGJ1aWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgc28gbW92ZSB0byB0aGUgbGFzdCBTT1QgcmVhZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEob3BqX3N0cmVhbV9yZWFkX3NlZWsocF9zdHJlYW0sIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2xhc3Rfc290X3JlYWRfcG9zKzIsIHBfbWFuYWdlcikpICl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlByb2JsZW0gd2l0aCBzZWVrIGZ1bmN0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhKG9wal9zdHJlYW1fcmVhZF9zZWVrKHBfc3RyZWFtLCBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtsX3RpbGVfbm9fdG9fZGVjXS50cF9pbmRleFswXS5zdGFydF9wb3MrMiwgcF9tYW5hZ2VyKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlByb2JsZW0gd2l0aCBzZWVrIGZ1bmN0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLyogU3BlY2lhbCBjYXNlIGlmIHdlIGhhdmUgcHJldmlvdXNseSByZWFkIHRoZSBFT0MgbWFya2VyIChpZiB0aGUgcHJldmlvdXMgdGlsZSBnZXR0ZWQgaXMgdGhlIGxhc3QgKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPT0gSjJLX1NUQVRFX0VPQykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPSBKMktfU1RBVEVfVFBIU09UOworICAgICAgICAgICAgICAgIH0KKworCQlmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgaWYgKCEgb3BqX2oya19yZWFkX3RpbGVfaGVhZGVyKCBwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF9jdXJyZW50X3RpbGVfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX3RpbGVfeDAsICZsX3RpbGVfeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfdGlsZV94MSwgJmxfdGlsZV95MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF9uYl9jb21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF9nb19vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghIGxfZ29fb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsX2RhdGFfc2l6ZSA+IGxfbWF4X2RhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKmxfbmV3X2N1cnJlbnRfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfcmVhbGxvYyhsX2N1cnJlbnRfZGF0YSwgbF9kYXRhX3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbF9uZXdfY3VycmVudF9kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X2RhdGEgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPOiBMSDogd2h5IHRpbGUgbnVtYmVyaW5nIHBvbGljeSB1c2VkIGluIG1lc3NhZ2VzIGRpZmZlcnMgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb25lIHVzZWQgaW4gb3BqX2oya19kZWNvZGVfdGlsZXMoKSA/ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBkZWNvZGUgdGlsZSAlZC8lZFxuIiwgbF9jdXJyZW50X3RpbGVfbm8sIChwX2oyay0+bV9jcC50aCAqIHBfajJrLT5tX2NwLnR3KSAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X2RhdGEgPSBsX25ld19jdXJyZW50X2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICBsX21heF9kYXRhX3NpemUgPSBsX2RhdGFfc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoISBvcGpfajJrX2RlY29kZV90aWxlKHBfajJrLGxfY3VycmVudF90aWxlX25vLGxfY3VycmVudF9kYXRhLGxfZGF0YV9zaXplLHBfc3RyZWFtLHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfSU5GTywgIlRpbGUgJWQvJWQgaGFzIGJlZW4gZGVjb2RlZC5cbiIsIGxfY3VycmVudF90aWxlX25vLCAocF9qMmstPm1fY3AudGggKiBwX2oyay0+bV9jcC50dykgLSAxKTsKKworICAgICAgICAgICAgICAgIGlmICghIG9wal9qMmtfdXBkYXRlX2ltYWdlX2RhdGEocF9qMmstPm1fdGNkLGxfY3VycmVudF9kYXRhLCBwX2oyay0+bV9vdXRwdXRfaW1hZ2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0lORk8sICJJbWFnZSBkYXRhIGhhcyBiZWVuIHVwZGF0ZWQgd2l0aCB0aWxlICVkLlxuXG4iLCBsX2N1cnJlbnRfdGlsZV9ubyk7CisKKyAgICAgICAgICAgICAgICBpZihsX2N1cnJlbnRfdGlsZV9ubyA9PSBsX3RpbGVfbm9fdG9fZGVjKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vdmUgaW50byB0aGUgY29kZXN0cmVhbSB0byB0aGUgdGhlIGZpcnN0IFNPVCAoRklYTUUgb3Igbm90IG1vdmU/KSovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvcGpfc3RyZWFtX3JlYWRfc2VlayhwX3N0cmVhbSwgcF9qMmstPmNzdHJfaW5kZXgtPm1haW5faGVhZF9lbmQgKyAyLCBwX21hbmFnZXIpICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJQcm9ibGVtIHdpdGggc2VlayBmdW5jdGlvblxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIlRpbGUgcmVhZCwgZGVjb2RlIGFuZCB1cGRhdGVkIGlzIG5vdCB0aGUgZGVzaXJlZCAoJWQgdnMgJWQpLlxuIiwgbF9jdXJyZW50X3RpbGVfbm8sIGxfdGlsZV9ub190b19kZWMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOworCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworLyoqCisgKiBTZXRzIHVwIHRoZSBwcm9jZWR1cmVzIHRvIGRvIG9uIGRlY29kaW5nIG9uZSB0aWxlLiBEZXZlbG9wcGVycyB3YW50aW5nIHRvIGV4dGVuZCB0aGUgbGlicmFyeSBjYW4gYWRkIHRoZWlyIG93biByZWFkaW5nIHByb2NlZHVyZXMuCisgKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3NldHVwX2RlY29kaW5nX3RpbGUgKG9wal9qMmtfdCAqcF9qMmssIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKK3sKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyovCisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisgICAgICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfZGVjb2RlX29uZV90aWxlLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICAvKiBERVZFTE9QRVIgQ09STkVSLCBhZGQgeW91ciBjdXN0b20gcHJvY2VkdXJlcyAqLworCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworT1BKX0JPT0wgb3BqX2oya19kZWNvZGUob3BqX2oya190ICogcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKiBwX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQoreworICAgICAgICBPUEpfVUlOVDMyIGNvbXBubzsKKworICAgICAgICBpZiAoIXBfaW1hZ2UpCisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKwkKKyAgICAgICAgcF9qMmstPm1fb3V0cHV0X2ltYWdlID0gb3BqX2ltYWdlX2NyZWF0ZTAoKTsKKyAgICAgICAgaWYgKCEgKHBfajJrLT5tX291dHB1dF9pbWFnZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIG9wal9jb3B5X2ltYWdlX2hlYWRlcihwX2ltYWdlLCBwX2oyay0+bV9vdXRwdXRfaW1hZ2UpOworCisgICAgICAgIC8qIGN1c3RvbWl6YXRpb24gb2YgdGhlIGRlY29kaW5nICovCisgICAgICAgIG9wal9qMmtfc2V0dXBfZGVjb2RpbmcocF9qMmssIHBfbWFuYWdlcik7CisKKyAgICAgICAgLyogRGVjb2RlIHRoZSBjb2Rlc3RyZWFtICovCisgICAgICAgIGlmICghIG9wal9qMmtfZXhlYyAocF9qMmsscF9qMmstPm1fcHJvY2VkdXJlX2xpc3QscF9zdHJlYW0scF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgIG9wal9pbWFnZV9kZXN0cm95KHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UpOworICAgICAgICAgICAgICAgIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICAvKiBNb3ZlIGRhdGEgYW5kIGNvcHkgb25lIGluZm9ybWF0aW9uIGZyb20gY29kZWMgdG8gb3V0cHV0IGltYWdlKi8KKyAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBwX2ltYWdlLT5udW1jb21wczsgY29tcG5vKyspIHsKKyAgICAgICAgICAgICAgICBwX2ltYWdlLT5jb21wc1tjb21wbm9dLnJlc25vX2RlY29kZWQgPSBwX2oyay0+bV9vdXRwdXRfaW1hZ2UtPmNvbXBzW2NvbXBub10ucmVzbm9fZGVjb2RlZDsKKyAgICAgICAgICAgICAgICBwX2ltYWdlLT5jb21wc1tjb21wbm9dLmRhdGEgPSBwX2oyay0+bV9vdXRwdXRfaW1hZ2UtPmNvbXBzW2NvbXBub10uZGF0YTsKKyNpZiAwCisgICAgICAgICAgICAgICAgY2hhciBmblsyNTZdOworICAgICAgICAgICAgICAgIHNwcmludGYoIGZuLCAiL3RtcC8lZC5yYXciLCBjb21wbm8gKTsKKyAgICAgICAgICAgICAgICBGSUxFICpkZWJ1ZyA9IGZvcGVuKCBmbiwgIndiIiApOworICAgICAgICAgICAgICAgIGZ3cml0ZSggcF9pbWFnZS0+Y29tcHNbY29tcG5vXS5kYXRhLCBzaXplb2YoT1BKX0lOVDMyKSwgcF9pbWFnZS0+Y29tcHNbY29tcG5vXS53ICogcF9pbWFnZS0+Y29tcHNbY29tcG5vXS5oLCBkZWJ1ZyApOworICAgICAgICAgICAgICAgIGZjbG9zZSggZGVidWcgKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHBfajJrLT5tX291dHB1dF9pbWFnZS0+Y29tcHNbY29tcG5vXS5kYXRhID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworT1BKX0JPT0wgb3BqX2oya19nZXRfdGlsZSggICAgICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCogcF9pbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0aWxlX2luZGV4ICkKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBjb21wbm87CisgICAgICAgIE9QSl9VSU5UMzIgbF90aWxlX3gsIGxfdGlsZV95OworICAgICAgICBvcGpfaW1hZ2VfY29tcF90KiBsX2ltZ19jb21wOworCisgICAgICAgIGlmICghcF9pbWFnZSkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJXZSBuZWVkIGFuIGltYWdlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIC8qKHRpbGVfaW5kZXggPCAwKSAmJiovICh0aWxlX2luZGV4ID49IHBfajJrLT5tX2NwLnR3ICogcF9qMmstPm1fY3AudGgpICl7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlRpbGUgaW5kZXggcHJvdmlkZWQgYnkgdGhlIHVzZXIgaXMgaW5jb3JyZWN0ICVkIChtYXggPSAlZCkgXG4iLCB0aWxlX2luZGV4LCAocF9qMmstPm1fY3AudHcgKiBwX2oyay0+bV9jcC50aCkgLSAxKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLyogQ29tcHV0ZSB0aGUgZGltZW5zaW9uIG9mIHRoZSBkZXNpcmVkIHRpbGUqLworICAgICAgICBsX3RpbGVfeCA9IHRpbGVfaW5kZXggJSBwX2oyay0+bV9jcC50dzsKKyAgICAgICAgbF90aWxlX3kgPSB0aWxlX2luZGV4IC8gcF9qMmstPm1fY3AudHc7CisKKyAgICAgICAgcF9pbWFnZS0+eDAgPSBsX3RpbGVfeCAqIHBfajJrLT5tX2NwLnRkeCArIHBfajJrLT5tX2NwLnR4MDsKKyAgICAgICAgaWYgKHBfaW1hZ2UtPngwIDwgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+eDApCisgICAgICAgICAgICAgICAgcF9pbWFnZS0+eDAgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT54MDsKKyAgICAgICAgcF9pbWFnZS0+eDEgPSAobF90aWxlX3ggKyAxKSAqIHBfajJrLT5tX2NwLnRkeCArIHBfajJrLT5tX2NwLnR4MDsKKyAgICAgICAgaWYgKHBfaW1hZ2UtPngxID4gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+eDEpCisgICAgICAgICAgICAgICAgcF9pbWFnZS0+eDEgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT54MTsKKworICAgICAgICBwX2ltYWdlLT55MCA9IGxfdGlsZV95ICogcF9qMmstPm1fY3AudGR5ICsgcF9qMmstPm1fY3AudHkwOworICAgICAgICBpZiAocF9pbWFnZS0+eTAgPCBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT55MCkKKyAgICAgICAgICAgICAgICBwX2ltYWdlLT55MCA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPnkwOworICAgICAgICBwX2ltYWdlLT55MSA9IChsX3RpbGVfeSArIDEpICogcF9qMmstPm1fY3AudGR5ICsgcF9qMmstPm1fY3AudHkwOworICAgICAgICBpZiAocF9pbWFnZS0+eTEgPiBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT55MSkKKyAgICAgICAgICAgICAgICBwX2ltYWdlLT55MSA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPnkxOworCisgICAgICAgIGxfaW1nX2NvbXAgPSBwX2ltYWdlLT5jb21wczsKKyAgICAgICAgZm9yIChjb21wbm89MDsgY29tcG5vIDwgcF9pbWFnZS0+bnVtY29tcHM7ICsrY29tcG5vKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIGxfY29tcF94MSwgbF9jb21wX3kxOworCisgICAgICAgICAgICAgICAgbF9pbWdfY29tcC0+ZmFjdG9yID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+Y29tcHNbY29tcG5vXS5mYWN0b3I7CisKKyAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT54MCA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKXBfaW1hZ2UtPngwLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR4KTsKKyAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT55MCA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKXBfaW1hZ2UtPnkwLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR5KTsKKyAgICAgICAgICAgICAgICBsX2NvbXBfeDEgPSBvcGpfaW50X2NlaWxkaXYoKE9QSl9JTlQzMilwX2ltYWdlLT54MSwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5keCk7CisgICAgICAgICAgICAgICAgbF9jb21wX3kxID0gb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpcF9pbWFnZS0+eTEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHkpOworCisgICAgICAgICAgICAgICAgbF9pbWdfY29tcC0+dyA9IChPUEpfVUlOVDMyKShvcGpfaW50X2NlaWxkaXZwb3cyKGxfY29tcF94MSwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5mYWN0b3IpIC0gb3BqX2ludF9jZWlsZGl2cG93MigoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPngwLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmZhY3RvcikpOworICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPmggPSAoT1BKX1VJTlQzMikob3BqX2ludF9jZWlsZGl2cG93MihsX2NvbXBfeTEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZmFjdG9yKSAtIG9wal9pbnRfY2VpbGRpdnBvdzIoKE9QSl9JTlQzMilsX2ltZ19jb21wLT55MCwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5mYWN0b3IpKTsKKworICAgICAgICAgICAgICAgIGxfaW1nX2NvbXArKzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIERlc3Ryb3kgdGhlIHByZXZpb3VzIG91dHB1dCBpbWFnZSovCisgICAgICAgIGlmIChwX2oyay0+bV9vdXRwdXRfaW1hZ2UpCisgICAgICAgICAgICAgICAgb3BqX2ltYWdlX2Rlc3Ryb3kocF9qMmstPm1fb3V0cHV0X2ltYWdlKTsKKworICAgICAgICAvKiBDcmVhdGUgdGhlIG91cHV0IGltYWdlIGZyb20gdGhlIGluZm9ybWF0aW9uIHByZXZpb3VzbHkgY29tcHV0ZWQqLworICAgICAgICBwX2oyay0+bV9vdXRwdXRfaW1hZ2UgPSBvcGpfaW1hZ2VfY3JlYXRlMCgpOworICAgICAgICBpZiAoISAocF9qMmstPm1fb3V0cHV0X2ltYWdlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgb3BqX2NvcHlfaW1hZ2VfaGVhZGVyKHBfaW1hZ2UsIHBfajJrLT5tX291dHB1dF9pbWFnZSk7CisKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fdGlsZV9pbmRfdG9fZGVjID0gKE9QSl9JTlQzMil0aWxlX2luZGV4OworCisgICAgICAgIC8qIGN1c3RvbWl6YXRpb24gb2YgdGhlIGRlY29kaW5nICovCisgICAgICAgIG9wal9qMmtfc2V0dXBfZGVjb2RpbmdfdGlsZShwX2oyaywgcF9tYW5hZ2VyKTsKKworICAgICAgICAvKiBEZWNvZGUgdGhlIGNvZGVzdHJlYW0gKi8KKyAgICAgICAgaWYgKCEgb3BqX2oya19leGVjIChwX2oyayxwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCxwX3N0cmVhbSxwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgb3BqX2ltYWdlX2Rlc3Ryb3kocF9qMmstPm1fcHJpdmF0ZV9pbWFnZSk7CisgICAgICAgICAgICAgICAgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE1vdmUgZGF0YSBhbmQgY29weSBvbmUgaW5mb3JtYXRpb24gZnJvbSBjb2RlYyB0byBvdXRwdXQgaW1hZ2UqLworICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHBfaW1hZ2UtPm51bWNvbXBzOyBjb21wbm8rKykgeworICAgICAgICAgICAgICAgIHBfaW1hZ2UtPmNvbXBzW2NvbXBub10ucmVzbm9fZGVjb2RlZCA9IHBfajJrLT5tX291dHB1dF9pbWFnZS0+Y29tcHNbY29tcG5vXS5yZXNub19kZWNvZGVkOworCisgICAgICAgICAgICAgICAgaWYgKHBfaW1hZ2UtPmNvbXBzW2NvbXBub10uZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfaW1hZ2UtPmNvbXBzW2NvbXBub10uZGF0YSk7CisKKyAgICAgICAgICAgICAgICBwX2ltYWdlLT5jb21wc1tjb21wbm9dLmRhdGEgPSBwX2oyay0+bV9vdXRwdXRfaW1hZ2UtPmNvbXBzW2NvbXBub10uZGF0YTsKKworICAgICAgICAgICAgICAgIHBfajJrLT5tX291dHB1dF9pbWFnZS0+Y29tcHNbY29tcG5vXS5kYXRhID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworT1BKX0JPT0wgb3BqX2oya19zZXRfZGVjb2RlZF9yZXNvbHV0aW9uX2ZhY3RvcihvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHJlc19mYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBpdF9jb21wOworCisgICAgICAgIHBfajJrLT5tX2NwLm1fc3BlY2lmaWNfcGFyYW0ubV9kZWMubV9yZWR1Y2UgPSByZXNfZmFjdG9yOworCisgICAgICAgIGlmIChwX2oyay0+bV9wcml2YXRlX2ltYWdlKSB7CisgICAgICAgICAgICAgICAgaWYgKHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPmNvbXBzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwLT50Y2NwcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaXRfY29tcCA9IDAgOyBpdF9jb21wIDwgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHM7IGl0X2NvbXArKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBtYXhfcmVzID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3AtPnRjY3BzW2l0X2NvbXBdLm51bXJlc29sdXRpb25zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCByZXNfZmFjdG9yID49IG1heF9yZXMpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiUmVzb2x1dGlvbiBmYWN0b3IgaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIHJlc29sdXRpb24gaW4gdGhlIGNvbXBvbmVudC5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+Y29tcHNbaXRfY29tcF0uZmFjdG9yID0gcmVzX2ZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKK30KKworT1BKX0JPT0wgb3BqX2oya19lbmNvZGUob3BqX2oya190ICogcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQoreworICAgICAgICBPUEpfVUlOVDMyIGksIGo7CisgICAgICAgIE9QSl9VSU5UMzIgbF9uYl90aWxlczsKKyAgICAgICAgT1BKX1VJTlQzMiBsX21heF90aWxlX3NpemUgPSAwLCBsX2N1cnJlbnRfdGlsZV9zaXplOworICAgICAgICBPUEpfQllURSAqIGxfY3VycmVudF9kYXRhID0gMDA7CisgICAgICAgIG9wal90Y2RfdCogcF90Y2QgPSAwMDsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworCQorICAgICAgICBwX3RjZCA9IHBfajJrLT5tX3RjZDsKKworICAgICAgICBsX25iX3RpbGVzID0gcF9qMmstPm1fY3AudGggKiBwX2oyay0+bV9jcC50dzsKKyAgICAgICAgZm9yIChpPTA7aTxsX25iX3RpbGVzOysraSkgeworICAgICAgICAgICAgICAgIGlmICghIG9wal9qMmtfcHJlX3dyaXRlX3RpbGUocF9qMmssaSxwX3N0cmVhbSxwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9jdXJyZW50X2RhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBpZiB3ZSBvbmx5IGhhdmUgb25lIHRpbGUsIHRoZW4gc2ltcGx5IHNldCB0aWxlIGNvbXBvbmVudCBkYXRhIGVxdWFsIHRvIGltYWdlIGNvbXBvbmVudCBkYXRhICovCisgICAgICAgICAgICAgICAgLyogb3RoZXJ3aXNlLCBhbGxvY2F0ZSB0aGUgZGF0YSAqLworICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8cF9qMmstPm1fdGNkLT5pbWFnZS0+bnVtY29tcHM7KytqKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QqIGxfdGlsZWMgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+Y29tcHMgKyBqOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfbmJfdGlsZXMgPT0gMSkgeworCQkJCQkJCQkJCQkJICAgICAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IHBfdGNkLT5pbWFnZS0+Y29tcHMgKyBqOworCQkJCQkJCQkJCQkJICAgICAgICBsX3RpbGVjLT5kYXRhICA9ICBsX2ltZ19jb21wLT5kYXRhOworCQkJCQkJCQkJCQkJICAgICAgICBsX3RpbGVjLT5vd25zRGF0YSA9IE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisJCQkJCQkJCQkJCQkgICAgICAgIGlmKCEgb3BqX2FsbG9jX3RpbGVfY29tcG9uZW50X2RhdGEobF90aWxlYykpIHsKKwkJCQkJCQkJCQkJCSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgYWxsb2NhdGluZyB0aWxlIGNvbXBvbmVudCBkYXRhLiIgKTsKKwkJCQkJCQkJCQkJCSAgICAgICAgICAgICAgICBpZiAobF9jdXJyZW50X2RhdGEpIHsKKwkJCQkJCQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKKwkJCQkJCQkJCQkJCSAgICAgICAgICAgICAgICB9CisJCQkJCQkJCQkJCQkgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKwkJCQkJCQkJCQkJCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsX2N1cnJlbnRfdGlsZV9zaXplID0gb3BqX3RjZF9nZXRfZW5jb2RlZF90aWxlX3NpemUocF9qMmstPm1fdGNkKTsKKyAgICAgICAgICAgICAgICBpZiAobF9uYl90aWxlcyA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2N1cnJlbnRfdGlsZV9zaXplID4gbF9tYXhfdGlsZV9zaXplKSB7CisJCQkJCQkJCQkJCQkgICAgICAgIE9QSl9CWVRFICpsX25ld19jdXJyZW50X2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MobF9jdXJyZW50X2RhdGEsIGxfY3VycmVudF90aWxlX3NpemUpOworCQkJCQkJCQkJCQkJICAgICAgICBpZiAoISBsX25ld19jdXJyZW50X2RhdGEpIHsKKwkJCQkJCQkJCQkJCSAgICAgICAgICAgICAgICBpZiAobF9jdXJyZW50X2RhdGEpIHsKKwkJCQkJCQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKKwkJCQkJCQkJCQkJCSAgICAgICAgICAgICAgICB9CisJCQkJCQkJCQkJCQkgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGVuY29kZSBhbGwgdGlsZXNcbiIpOworCQkJCQkJCQkJCQkJICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisJCQkJCQkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQkJCQkJCWxfY3VycmVudF9kYXRhID0gbF9uZXdfY3VycmVudF9kYXRhOworCQkJCQkJCQkJCQkJCQkJCWxfbWF4X3RpbGVfc2l6ZSA9IGxfY3VycmVudF90aWxlX3NpemU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgaW1hZ2UgZGF0YSAoMzIgYml0KSB0byBsX2N1cnJlbnRfZGF0YSBhcyBjb250aWd1b3VzLCBhbGwtY29tcG9uZW50LCB6ZXJvIG9mZnNldCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMyIGJpdCBjb21wb25lbnRzIEAgOCBiaXQgcHJlY2lzaW9uIGdldCBjb252ZXJ0ZWQgdG8gOCBiaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMyIGJpdCBjb21wb25lbnRzIEAgMTYgYml0IHByZWNpc2lvbiBnZXQgY29udmVydGVkIHRvIDE2IGJpdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2oya19nZXRfdGlsZV9kYXRhKHBfajJrLT5tX3RjZCxsX2N1cnJlbnRfZGF0YSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdyBjb3B5IHRoaXMgZGF0YSBpbnRvIHRoZSB0aWxlIGNvbXBvbmVudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgb3BqX3RjZF9jb3B5X3RpbGVfZGF0YShwX2oyay0+bV90Y2QsbF9jdXJyZW50X2RhdGEsbF9jdXJyZW50X3RpbGVfc2l6ZSkpIHsKKwkJCQkJCQkJCQkJCQkJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU2l6ZSBtaXNtYXRjaCBiZXR3ZWVuIHRpbGUgZGF0YSBhbmQgc2VudCBkYXRhLiIgKTsKKwkJCQkJCQkJCQkJCQkJCQlvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7CisJCQkJCQkJCQkJCQkJCQkJcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoISBvcGpfajJrX3Bvc3Rfd3JpdGVfdGlsZSAocF9qMmsscF9zdHJlYW0scF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfY3VycmVudF9kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGxfY3VycmVudF9kYXRhKSB7CisgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworT1BKX0JPT0wgb3BqX2oya19lbmRfY29tcHJlc3MoICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKK3sKKyAgICAgICAgLyogY3VzdG9taXphdGlvbiBvZiB0aGUgZW5jb2RpbmcgKi8KKyAgICAgICAgaWYgKCEgb3BqX2oya19zZXR1cF9lbmRfY29tcHJlc3MocF9qMmssIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCEgb3BqX2oya19leGVjIChwX2oyaywgcF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsIHBfc3RyZWFtLCBwX21hbmFnZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworT1BKX0JPT0wgb3BqX2oya19zdGFydF9jb21wcmVzcyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKiBwX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQoreworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisgICAgICAgIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UgPSBvcGpfaW1hZ2VfY3JlYXRlMCgpOworICAgICAgICBpZiAoISBwX2oyay0+bV9wcml2YXRlX2ltYWdlKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBpbWFnZSBoZWFkZXIuIiApOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgb3BqX2NvcHlfaW1hZ2VfaGVhZGVyKHBfaW1hZ2UsIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UpOworCisgICAgICAgIC8qIFRPRE9fTVNEOiBGaW5kIGEgYmV0dGVyIHdheSAqLworICAgICAgICBpZiAocF9pbWFnZS0+Y29tcHMpIHsKKyAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGl0X2NvbXA7CisgICAgICAgICAgICAgICAgZm9yIChpdF9jb21wID0gMCA7IGl0X2NvbXAgPCBwX2ltYWdlLT5udW1jb21wczsgaXRfY29tcCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocF9pbWFnZS0+Y29tcHNbaXRfY29tcF0uZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5jb21wc1tpdF9jb21wXS5kYXRhID1wX2ltYWdlLT5jb21wc1tpdF9jb21wXS5kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2ltYWdlLT5jb21wc1tpdF9jb21wXS5kYXRhID0gTlVMTDsKKworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGN1c3RvbWl6YXRpb24gb2YgdGhlIHZhbGlkYXRpb24gKi8KKyAgICAgICAgaWYgKCEgb3BqX2oya19zZXR1cF9lbmNvZGluZ192YWxpZGF0aW9uIChwX2oyaywgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICAvKiB2YWxpZGF0aW9uIG9mIHRoZSBwYXJhbWV0ZXJzIGNvZGVjICovCisgICAgICAgIGlmICghIG9wal9qMmtfZXhlYyhwX2oyayxwX2oyay0+bV92YWxpZGF0aW9uX2xpc3QscF9zdHJlYW0scF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICAvKiBjdXN0b21pemF0aW9uIG9mIHRoZSBlbmNvZGluZyAqLworICAgICAgICBpZiAoISBvcGpfajJrX3NldHVwX2hlYWRlcl93cml0aW5nKHBfajJrLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHdyaXRlIGhlYWRlciAqLworICAgICAgICBpZiAoISBvcGpfajJrX2V4ZWMgKHBfajJrLHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LHBfc3RyZWFtLHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19wcmVfd3JpdGVfdGlsZSAoICAgICAgIG9wal9qMmtfdCAqIHBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQoreworICAodm9pZClwX3N0cmVhbTsKKyAgICAgICAgaWYgKHBfdGlsZV9pbmRleCAhPSBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlRoZSBnaXZlbiB0aWxlIGluZGV4IGRvZXMgbm90IG1hdGNoLiIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9JTkZPLCAidGlsZSBudW1iZXIgJWQgLyAlZFxuIiwgcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciArIDEsIHBfajJrLT5tX2NwLnR3ICogcF9qMmstPm1fY3AudGgpOworCisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2N1cnJlbnRfdGlsZV9wYXJ0X251bWJlciA9IDA7CisgICAgICAgIHBfajJrLT5tX3RjZC0+Y3VyX3RvdG51bV90cCA9IHBfajJrLT5tX2NwLnRjcHNbcF90aWxlX2luZGV4XS5tX25iX3RpbGVfcGFydHM7CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2N1cnJlbnRfcG9jX3RpbGVfcGFydF9udW1iZXIgPSAwOworCisgICAgICAgIC8qIGluaXRpYWxpc2F0aW9uIGJlZm9yZSB0aWxlIGVuY29kaW5nICAqLworICAgICAgICBpZiAoISBvcGpfdGNkX2luaXRfZW5jb2RlX3RpbGUocF9qMmstPm1fdGNkLCBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIHZvaWQgb3BqX2dldF90aWxlX2RpbWVuc2lvbnMob3BqX2ltYWdlX3QgKiBsX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKiBsX3RpbGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiogbF9zaXplX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIqIGxfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIqIGxfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyKiBsX29mZnNldF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyKiBsX29mZnNldF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyKiBsX2ltYWdlX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyKiBsX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiogbF90aWxlX29mZnNldCkgeworCU9QSl9VSU5UMzIgbF9yZW1haW5pbmc7CisJKmxfc2l6ZV9jb21wID0gbF9pbWdfY29tcC0+cHJlYyA+PiAzOyAvKiAoLzgpICovCisJbF9yZW1haW5pbmcgPSBsX2ltZ19jb21wLT5wcmVjICYgNzsgIC8qICglOCkgKi8KKwlpZiAobF9yZW1haW5pbmcpIHsKKwkJKmxfc2l6ZV9jb21wICs9IDE7CisJfQorCisJaWYgKCpsX3NpemVfY29tcCA9PSAzKSB7CisJCSpsX3NpemVfY29tcCA9IDQ7CisJfQorCisJKmxfd2lkdGggID0gKE9QSl9VSU5UMzIpKGxfdGlsZWMtPngxIC0gbF90aWxlYy0+eDApOworCSpsX2hlaWdodCA9IChPUEpfVUlOVDMyKShsX3RpbGVjLT55MSAtIGxfdGlsZWMtPnkwKTsKKwkqbF9vZmZzZXRfeCA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKWxfaW1hZ2UtPngwLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR4KTsKKwkqbF9vZmZzZXRfeSA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKWxfaW1hZ2UtPnkwLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR5KTsKKwkqbF9pbWFnZV93aWR0aCA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKWxfaW1hZ2UtPngxIC0gKE9QSl9JTlQzMilsX2ltYWdlLT54MCwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5keCk7CisJKmxfc3RyaWRlID0gKmxfaW1hZ2Vfd2lkdGggLSAqbF93aWR0aDsKKwkqbF90aWxlX29mZnNldCA9ICgoT1BKX1VJTlQzMilsX3RpbGVjLT54MCAtICpsX29mZnNldF94KSArICgoT1BKX1VJTlQzMilsX3RpbGVjLT55MCAtICpsX29mZnNldF95KSAqICpsX2ltYWdlX3dpZHRoOworfQorCitzdGF0aWMgdm9pZCBvcGpfajJrX2dldF90aWxlX2RhdGEgKG9wal90Y2RfdCAqIHBfdGNkLCBPUEpfQllURSAqIHBfZGF0YSkKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBpLGosayA9IDA7CisKKyAgICAgICAgZm9yIChpPTA7aTxwX3RjZC0+aW1hZ2UtPm51bWNvbXBzOysraSkgeworICAgICAgICAgICAgICAgIG9wal9pbWFnZV90ICogbF9pbWFnZSA9ICBwX3RjZC0+aW1hZ2U7CisgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogbF9zcmNfcHRyOworICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqIGxfdGlsZWMgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+Y29tcHMgKyBpOworICAgICAgICAgICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wID0gbF9pbWFnZS0+Y29tcHMgKyBpOworICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbF9zaXplX2NvbXAsbF93aWR0aCxsX2hlaWdodCxsX29mZnNldF94LGxfb2Zmc2V0X3ksIGxfaW1hZ2Vfd2lkdGgsbF9zdHJpZGUsbF90aWxlX29mZnNldDsKKworICAgICAgICAgICAgICAgIG9wal9nZXRfdGlsZV9kaW1lbnNpb25zKGxfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90aWxlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2ltZ19jb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX3NpemVfY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfb2Zmc2V0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfb2Zmc2V0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfaW1hZ2Vfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX3RpbGVfb2Zmc2V0KTsKKworICAgICAgICAgICAgICAgIGxfc3JjX3B0ciA9IGxfaW1nX2NvbXAtPmRhdGEgKyBsX3RpbGVfb2Zmc2V0OworCisgICAgICAgICAgICAgICAgc3dpdGNoIChsX3NpemVfY29tcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0NIQVIgKiBsX2Rlc3RfcHRyID0gKE9QSl9DSEFSKikgcF9kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2ltZ19jb21wLT5zZ25kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgICAgIChqPTA7ajxsX2hlaWdodDsrK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrPTA7azxsX3dpZHRoOysraykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoobF9kZXN0X3B0cikgPSAoT1BKX0NIQVIpICgqbF9zcmNfcHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfZGVzdF9wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX3NyY19wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zcmNfcHRyICs9IGxfc3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9oZWlnaHQ7KytqKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaz0wO2s8bF93aWR0aDsrK2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGxfZGVzdF9wdHIpID0gKE9QSl9DSEFSKSgoKmxfc3JjX3B0cikmMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX2Rlc3RfcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9zcmNfcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX3N0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEgPSAoT1BKX0JZVEUqKSBsX2Rlc3RfcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDE2ICogbF9kZXN0X3B0ciA9IChPUEpfSU5UMTYgKikgcF9kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2ltZ19jb21wLT5zZ25kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfaGVpZ2h0OysraikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGs9MDtrPGxfd2lkdGg7KytrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKE9QSl9JTlQxNikgKCoobF9zcmNfcHRyKyspKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NyY19wdHIgKz0gbF9zdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7ajxsX2hlaWdodDsrK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrPTA7azxsX3dpZHRoOysraykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoobF9kZXN0X3B0cisrKSA9IChPUEpfSU5UMTYpKCgqKGxfc3JjX3B0cisrKSkgJiAweGZmZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX3N0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEgPSAoT1BKX0JZVEUqKSBsX2Rlc3RfcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogbF9kZXN0X3B0ciA9IChPUEpfSU5UMzIgKikgcF9kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9oZWlnaHQ7KytqKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGs9MDtrPGxfd2lkdGg7KytrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoobF9kZXN0X3B0cisrKSA9ICoobF9zcmNfcHRyKyspOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zcmNfcHRyICs9IGxfc3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YSA9IChPUEpfQllURSopIGxfZGVzdF9wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3Bvc3Rfd3JpdGVfdGlsZSAoICAgICAgb3BqX2oya190ICogcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCit7CisgICAgICAgIE9QSl9VSU5UMzIgbF9uYl9ieXRlc193cml0dGVuOworICAgICAgICBPUEpfQllURSAqIGxfY3VycmVudF9kYXRhID0gMDA7CisgICAgICAgIE9QSl9VSU5UMzIgbF90aWxlX3NpemUgPSAwOworICAgICAgICBPUEpfVUlOVDMyIGxfYXZhaWxhYmxlX2RhdGE7CisKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fZW5jb2RlZF90aWxlX2RhdGEpOworCisgICAgICAgIGxfdGlsZV9zaXplID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fZW5jb2RlZF90aWxlX3NpemU7CisgICAgICAgIGxfYXZhaWxhYmxlX2RhdGEgPSBsX3RpbGVfc2l6ZTsKKyAgICAgICAgbF9jdXJyZW50X2RhdGEgPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfZGF0YTsKKworICAgICAgICBsX25iX2J5dGVzX3dyaXR0ZW4gPSAwOworICAgICAgICBpZiAoISBvcGpfajJrX3dyaXRlX2ZpcnN0X3RpbGVfcGFydChwX2oyayxsX2N1cnJlbnRfZGF0YSwmbF9uYl9ieXRlc193cml0dGVuLGxfYXZhaWxhYmxlX2RhdGEscF9zdHJlYW0scF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gbF9uYl9ieXRlc193cml0dGVuOworICAgICAgICBsX2F2YWlsYWJsZV9kYXRhIC09IGxfbmJfYnl0ZXNfd3JpdHRlbjsKKworICAgICAgICBsX25iX2J5dGVzX3dyaXR0ZW4gPSAwOworICAgICAgICBpZiAoISBvcGpfajJrX3dyaXRlX2FsbF90aWxlX3BhcnRzKHBfajJrLGxfY3VycmVudF9kYXRhLCZsX25iX2J5dGVzX3dyaXR0ZW4sbF9hdmFpbGFibGVfZGF0YSxwX3N0cmVhbSxwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGxfYXZhaWxhYmxlX2RhdGEgLT0gbF9uYl9ieXRlc193cml0dGVuOworICAgICAgICBsX25iX2J5dGVzX3dyaXR0ZW4gPSBsX3RpbGVfc2l6ZSAtIGxfYXZhaWxhYmxlX2RhdGE7CisKKyAgICAgICAgaWYgKCBvcGpfc3RyZWFtX3dyaXRlX2RhdGEoICAgICBwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX25iX2J5dGVzX3dyaXR0ZW4scF9tYW5hZ2VyKSAhPSBsX25iX2J5dGVzX3dyaXR0ZW4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgKytwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyOworCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfc2V0dXBfZW5kX2NvbXByZXNzIChvcGpfajJrX3QgKnBfajJrLCBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCit7CisgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisKKyAgICAgICAgLyogREVWRUxPUEVSIENPUk5FUiwgaW5zZXJ0IHlvdXIgY3VzdG9tIHByb2NlZHVyZXMgKi8KKyAgICAgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV9lb2MsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKE9QSl9JU19DSU5FTUEocF9qMmstPm1fY3AucnNpeikpIHsKKyAgICAgICAgICAgICAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfajJrX3dyaXRlX3VwZGF0ZWRfdGxtLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfd3JpdGVfZXBjLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfajJrX2VuZF9lbmNvZGluZywgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya19kZXN0cm95X2hlYWRlcl9tZW1vcnksIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfc2V0dXBfZW5jb2RpbmdfdmFsaWRhdGlvbiAob3BqX2oya190ICpwX2oyaywgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQoreworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisgICAgICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3ZhbGlkYXRpb25fbGlzdCwgKG9wal9wcm9jZWR1cmUpb3BqX2oya19idWlsZF9lbmNvZGVyLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV92YWxpZGF0aW9uX2xpc3QsIChvcGpfcHJvY2VkdXJlKW9wal9qMmtfZW5jb2RpbmdfdmFsaWRhdGlvbiwgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisJCQkJfQorCisgICAgICAgIC8qIERFVkVMT1BFUiBDT1JORVIsIGFkZCB5b3VyIGN1c3RvbSB2YWxpZGF0aW9uIHByb2NlZHVyZSAqLworICAgICAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV92YWxpZGF0aW9uX2xpc3QsIChvcGpfcHJvY2VkdXJlKW9wal9qMmtfbWN0X3ZhbGlkYXRpb24sIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisJCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfc2V0dXBfaGVhZGVyX3dyaXRpbmcgKG9wal9qMmtfdCAqcF9qMmssIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKK3sKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworICAgICAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfajJrX2luaXRfaW5mbywgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV9zb2MsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfd3JpdGVfc2l6LCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfajJrX3dyaXRlX2NvZCwgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV9xY2QsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKE9QSl9JU19DSU5FTUEocF9qMmstPm1fY3AucnNpeikpIHsKKyAgICAgICAgICAgICAgICAvKiBObyBuZWVkIGZvciBDT0Mgb3IgUUNDLCBRQ0QgYW5kIENPRCBhcmUgdXNlZAorICAgICAgICAgICAgICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfd3JpdGVfYWxsX2NvYywgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV9hbGxfcWNjLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfd3JpdGVfdGxtLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwX2oyay0+bV9jcC5yc2l6ID09IE9QSl9QUk9GSUxFX0NJTkVNQV80SykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV9wb2MsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfajJrX3dyaXRlX3JlZ2lvbnMsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBfajJrLT5tX2NwLmNvbW1lbnQgIT0gMDApICB7CisgICAgICAgICAgICAgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV9jb20sIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogREVWRUxPUEVSIENPUk5FUiwgaW5zZXJ0IHlvdXIgY3VzdG9tIHByb2NlZHVyZXMgKi8KKyAgICAgICAgaWYgKHBfajJrLT5tX2NwLnJzaXogJiBPUEpfRVhURU5TSU9OX01DVCkgeworICAgICAgICAgICAgICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfd3JpdGVfbWN0X2RhdGFfZ3JvdXAsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIEVuZCBvZiBEZXZlbG9wZXIgQ29ybmVyICovCisKKyAgICAgICAgaWYgKHBfajJrLT5jc3RyX2luZGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya19nZXRfZW5kX2hlYWRlciwgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfajJrX2NyZWF0ZV90Y2QsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfdXBkYXRlX3JhdGVzLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfZmlyc3RfdGlsZV9wYXJ0IChvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdG90YWxfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIgKQoreworICAgICAgICBPUEpfVUlOVDMyIGxfbmJfYnl0ZXNfd3JpdHRlbiA9IDA7CisgICAgICAgIE9QSl9VSU5UMzIgbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47CisgICAgICAgIE9QSl9CWVRFICogbF9iZWdpbl9kYXRhID0gMDA7CisKKyAgICAgICAgb3BqX3RjZF90ICogbF90Y2QgPSAwMDsKKyAgICAgICAgb3BqX2NwX3QgKiBsX2NwID0gMDA7CisKKyAgICAgICAgbF90Y2QgPSBwX2oyay0+bV90Y2Q7CisgICAgICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKKworICAgICAgICBsX3RjZC0+Y3VyX3Bpbm8gPSAwOworCisgICAgICAgIC8qR2V0IG51bWJlciBvZiB0aWxlIHBhcnRzKi8KKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fY3VycmVudF9wb2NfdGlsZV9wYXJ0X251bWJlciA9IDA7CisKKyAgICAgICAgLyogSU5ERVggPj4gKi8KKyAgICAgICAgLyogPDwgSU5ERVggKi8KKworICAgICAgICBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbiA9IDA7CisgICAgICAgIGxfYmVnaW5fZGF0YSA9IHBfZGF0YTsKKyAgICAgICAgaWYgKCEgb3BqX2oya193cml0ZV9zb3QocF9qMmsscF9kYXRhLCZsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbixwX3N0cmVhbSxwX21hbmFnZXIpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGxfbmJfYnl0ZXNfd3JpdHRlbiArPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKKyAgICAgICAgcF9kYXRhICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOworICAgICAgICBwX3RvdGFsX2RhdGFfc2l6ZSAtPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKKworICAgICAgICBpZiAoIU9QSl9JU19DSU5FTUEobF9jcC0+cnNpeikpIHsKKyNpZiAwCisgICAgICAgICAgICAgICAgZm9yIChjb21wbm8gPSAxOyBjb21wbm8gPCBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wczsgY29tcG5vKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9qMmtfd3JpdGVfY29jX2luX21lbW9yeShwX2oyayxjb21wbm8scF9kYXRhLCZsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbixwX21hbmFnZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgbF9uYl9ieXRlc193cml0dGVuICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOworICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOworICAgICAgICAgICAgICAgICAgICAgICAgcF90b3RhbF9kYXRhX3NpemUgLT0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9qMmtfd3JpdGVfcWNjX2luX21lbW9yeShwX2oyayxjb21wbm8scF9kYXRhLCZsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbixwX21hbmFnZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgbF9uYl9ieXRlc193cml0dGVuICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOworICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOworICAgICAgICAgICAgICAgICAgICAgICAgcF90b3RhbF9kYXRhX3NpemUgLT0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICBpZiAobF9jcC0+dGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS5udW1wb2NzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfajJrX3dyaXRlX3BvY19pbl9tZW1vcnkocF9qMmsscF9kYXRhLCZsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbixwX21hbmFnZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgbF9uYl9ieXRlc193cml0dGVuICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOworICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOworICAgICAgICAgICAgICAgICAgICAgICAgcF90b3RhbF9kYXRhX3NpemUgLT0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW4gPSAwOworICAgICAgICBpZiAoISBvcGpfajJrX3dyaXRlX3NvZChwX2oyayxsX3RjZCxwX2RhdGEsJmxfY3VycmVudF9uYl9ieXRlc193cml0dGVuLHBfdG90YWxfZGF0YV9zaXplLHBfc3RyZWFtLHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgbF9uYl9ieXRlc193cml0dGVuICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOworICAgICAgICAqIHBfZGF0YV93cml0dGVuID0gbF9uYl9ieXRlc193cml0dGVuOworCisgICAgICAgIC8qIFdyaXRpbmcgUHNvdCBpbiBTT1QgbWFya2VyICovCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2JlZ2luX2RhdGEgKyA2LGxfbmJfYnl0ZXNfd3JpdHRlbiw0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQU09UICovCisKKyAgICAgICAgaWYgKE9QSl9JU19DSU5FTUEobF9jcC0+cnNpeikpeworICAgICAgICAgICAgICAgIG9wal9qMmtfdXBkYXRlX3RsbShwX2oyayxsX25iX2J5dGVzX3dyaXR0ZW4pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9hbGxfdGlsZV9wYXJ0cyggIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90b3RhbF9kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAgICAgT1BKX1VJTlQzMiB0aWxlcGFydG5vPTA7CisgICAgICAgIE9QSl9VSU5UMzIgbF9uYl9ieXRlc193cml0dGVuID0gMDsKKyAgICAgICAgT1BKX1VJTlQzMiBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKKyAgICAgICAgT1BKX1VJTlQzMiBsX3BhcnRfdGlsZV9zaXplOworICAgICAgICBPUEpfVUlOVDMyIHRvdF9udW1fdHA7CisgICAgICAgIE9QSl9VSU5UMzIgcGlubzsKKworICAgICAgICBPUEpfQllURSAqIGxfYmVnaW5fZGF0YTsKKyAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOworICAgICAgICBvcGpfdGNkX3QgKiBsX3RjZCA9IDAwOworICAgICAgICBvcGpfY3BfdCAqIGxfY3AgPSAwMDsKKworICAgICAgICBsX3RjZCA9IHBfajJrLT5tX3RjZDsKKyAgICAgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOworICAgICAgICBsX3RjcCA9IGxfY3AtPnRjcHMgKyBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyOworCisgICAgICAgIC8qR2V0IG51bWJlciBvZiB0aWxlIHBhcnRzKi8KKyAgICAgICAgdG90X251bV90cCA9IG9wal9qMmtfZ2V0X251bV90cChsX2NwLDAscF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcik7CisKKyAgICAgICAgLyogc3RhcnQgd3JpdGluZyByZW1haW5pbmcgdGlsZSBwYXJ0cyAqLworICAgICAgICArK3BfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2N1cnJlbnRfdGlsZV9wYXJ0X251bWJlcjsKKyAgICAgICAgZm9yICh0aWxlcGFydG5vID0gMTsgdGlsZXBhcnRubyA8IHRvdF9udW1fdHAgOyArK3RpbGVwYXJ0bm8pIHsKKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9jdXJyZW50X3BvY190aWxlX3BhcnRfbnVtYmVyID0gdGlsZXBhcnRubzsKKyAgICAgICAgICAgICAgICBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbiA9IDA7CisgICAgICAgICAgICAgICAgbF9wYXJ0X3RpbGVfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgbF9iZWdpbl9kYXRhID0gcF9kYXRhOworCisgICAgICAgICAgICAgICAgaWYgKCEgb3BqX2oya193cml0ZV9zb3QocF9qMmsscF9kYXRhLCZsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbixwX3N0cmVhbSxwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGxfbmJfYnl0ZXNfd3JpdHRlbiArPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKKyAgICAgICAgICAgICAgICBwX2RhdGEgKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47CisgICAgICAgICAgICAgICAgcF90b3RhbF9kYXRhX3NpemUgLT0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47CisgICAgICAgICAgICAgICAgbF9wYXJ0X3RpbGVfc2l6ZSArPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKKworICAgICAgICAgICAgICAgIGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoISBvcGpfajJrX3dyaXRlX3NvZChwX2oyayxsX3RjZCxwX2RhdGEsJmxfY3VycmVudF9uYl9ieXRlc193cml0dGVuLHBfdG90YWxfZGF0YV9zaXplLHBfc3RyZWFtLHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcF9kYXRhICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOworICAgICAgICAgICAgICAgIGxfbmJfYnl0ZXNfd3JpdHRlbiArPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKKyAgICAgICAgICAgICAgICBwX3RvdGFsX2RhdGFfc2l6ZSAtPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKKyAgICAgICAgICAgICAgICBsX3BhcnRfdGlsZV9zaXplICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOworCisgICAgICAgICAgICAgICAgLyogV3JpdGluZyBQc290IGluIFNPVCBtYXJrZXIgKi8KKyAgICAgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9iZWdpbl9kYXRhICsgNixsX3BhcnRfdGlsZV9zaXplLDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUFNPVCAqLworCisgICAgICAgICAgICAgICAgaWYgKE9QSl9JU19DSU5FTUEobF9jcC0+cnNpeikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9qMmtfdXBkYXRlX3RsbShwX2oyayxsX3BhcnRfdGlsZV9zaXplKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICArK3BfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2N1cnJlbnRfdGlsZV9wYXJ0X251bWJlcjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAocGlubyA9IDE7IHBpbm8gPD0gbF90Y3AtPm51bXBvY3M7ICsrcGlubykgeworICAgICAgICAgICAgICAgIGxfdGNkLT5jdXJfcGlubyA9IHBpbm87CisKKyAgICAgICAgICAgICAgICAvKkdldCBudW1iZXIgb2YgdGlsZSBwYXJ0cyovCisgICAgICAgICAgICAgICAgdG90X251bV90cCA9IG9wal9qMmtfZ2V0X251bV90cChsX2NwLHBpbm8scF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcik7CisgICAgICAgICAgICAgICAgZm9yICh0aWxlcGFydG5vID0gMDsgdGlsZXBhcnRubyA8IHRvdF9udW1fdHAgOyArK3RpbGVwYXJ0bm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2N1cnJlbnRfcG9jX3RpbGVfcGFydF9udW1iZXIgPSB0aWxlcGFydG5vOworICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbF9wYXJ0X3RpbGVfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBsX2JlZ2luX2RhdGEgPSBwX2RhdGE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG9wal9qMmtfd3JpdGVfc290KHBfajJrLHBfZGF0YSwmbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW4scF9zdHJlYW0scF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBsX25iX2J5dGVzX3dyaXR0ZW4gKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47CisgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEgKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47CisgICAgICAgICAgICAgICAgICAgICAgICBwX3RvdGFsX2RhdGFfc2l6ZSAtPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfcGFydF90aWxlX3NpemUgKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgb3BqX2oya193cml0ZV9zb2QocF9qMmssbF90Y2QscF9kYXRhLCZsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbixwX3RvdGFsX2RhdGFfc2l6ZSxwX3N0cmVhbSxwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfbmJfYnl0ZXNfd3JpdHRlbiArPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YSArPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfdG90YWxfZGF0YV9zaXplIC09IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOworICAgICAgICAgICAgICAgICAgICAgICAgbF9wYXJ0X3RpbGVfc2l6ZSArPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogV3JpdGluZyBQc290IGluIFNPVCBtYXJrZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2JlZ2luX2RhdGEgKyA2LGxfcGFydF90aWxlX3NpemUsNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQU09UICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPUEpfSVNfQ0lORU1BKGxfY3AtPnJzaXopKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9qMmtfdXBkYXRlX3RsbShwX2oyayxsX3BhcnRfdGlsZV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgKytwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9jdXJyZW50X3RpbGVfcGFydF9udW1iZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKnBfZGF0YV93cml0dGVuID0gbF9uYl9ieXRlc193cml0dGVuOworCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfdXBkYXRlZF90bG0oIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlciApCit7CisgICAgICAgIE9QSl9VSU5UMzIgbF90bG1fc2l6ZTsKKyAgICAgICAgT1BKX09GRl9UIGxfdGxtX3Bvc2l0aW9uLCBsX2N1cnJlbnRfcG9zaXRpb247CisKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKworICAgICAgICBsX3RsbV9zaXplID0gNSAqIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RvdGFsX3RpbGVfcGFydHM7CisgICAgICAgIGxfdGxtX3Bvc2l0aW9uID0gNiArIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zdGFydDsKKyAgICAgICAgbF9jdXJyZW50X3Bvc2l0aW9uID0gb3BqX3N0cmVhbV90ZWxsKHBfc3RyZWFtKTsKKworICAgICAgICBpZiAoISBvcGpfc3RyZWFtX3NlZWsocF9zdHJlYW0sbF90bG1fcG9zaXRpb24scF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKHBfc3RyZWFtLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zb3Rfb2Zmc2V0c19idWZmZXIsbF90bG1fc2l6ZSxwX21hbmFnZXIpICE9IGxfdGxtX3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCEgb3BqX3N0cmVhbV9zZWVrKHBfc3RyZWFtLGxfY3VycmVudF9wb3NpdGlvbixwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfZW5kX2VuY29kaW5nKCAgb3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyICkKK3sKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKworICAgICAgICBvcGpfdGNkX2Rlc3Ryb3kocF9qMmstPm1fdGNkKTsKKyAgICAgICAgcF9qMmstPm1fdGNkID0gMDA7CisKKyAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zb3Rfb2Zmc2V0c19idWZmZXIpIHsKKyAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90bG1fc290X29mZnNldHNfYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90bG1fc290X29mZnNldHNfYnVmZmVyID0gMDsKKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90bG1fc290X29mZnNldHNfY3VycmVudCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fZW5jb2RlZF90aWxlX2RhdGEpIHsKKyAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfZGF0YSk7CisgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fZW5jb2RlZF90aWxlX2RhdGEgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fZW5jb2RlZF90aWxlX3NpemUgPSAwOworCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworLyoqCisgKiBEZXN0cm95cyB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVjb2Rpbmcgb2YgaGVhZGVycy4KKyAqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfZGVzdHJveV9oZWFkZXJfbWVtb3J5ICggb3BqX2oya190ICogcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSkgeworICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEpOworICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gMDsKKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2luaXRfaW5mbyggICAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyICkKK3sKKyAgICAgICAgb3BqX2NvZGVzdHJlYW1faW5mb190ICogbF9jc3RyX2luZm8gPSAwMDsKKworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworICAodm9pZClsX2NzdHJfaW5mbzsKKworICAgICAgICAvKiBUT0RPIG1lcmdlVjI6IGNoZWNrIHRoaXMgcGFydCB3aGljaCB1c2UgY3N0cl9pbmZvICovCisgICAgICAgIC8qbF9jc3RyX2luZm8gPSBwX2oyay0+Y3N0cl9pbmZvOworCisgICAgICAgIGlmIChsX2NzdHJfaW5mbykgIHsKKyAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNvbXBubzsKKyAgICAgICAgICAgICAgICBsX2NzdHJfaW5mby0+dGlsZSA9IChvcGpfdGlsZV9pbmZvX3QgKikgb3BqX21hbGxvYyhwX2oyay0+bV9jcC50dyAqIHBfajJrLT5tX2NwLnRoICogc2l6ZW9mKG9wal90aWxlX2luZm9fdCkpOworCisgICAgICAgICAgICAgICAgbF9jc3RyX2luZm8tPmltYWdlX3cgPSBwX2oyay0+bV9pbWFnZS0+eDEgLSBwX2oyay0+bV9pbWFnZS0+eDA7CisgICAgICAgICAgICAgICAgbF9jc3RyX2luZm8tPmltYWdlX2ggPSBwX2oyay0+bV9pbWFnZS0+eTEgLSBwX2oyay0+bV9pbWFnZS0+eTA7CisKKyAgICAgICAgICAgICAgICBsX2NzdHJfaW5mby0+cHJvZyA9ICgmcF9qMmstPm1fY3AudGNwc1swXSktPnByZzsKKworICAgICAgICAgICAgICAgIGxfY3N0cl9pbmZvLT50dyA9IHBfajJrLT5tX2NwLnR3OworICAgICAgICAgICAgICAgIGxfY3N0cl9pbmZvLT50aCA9IHBfajJrLT5tX2NwLnRoOworCisgICAgICAgICAgICAgICAgbF9jc3RyX2luZm8tPnRpbGVfeCA9IHBfajJrLT5tX2NwLnRkeDsqLyAgICAgICAgLyogbmV3IHZlcnNpb24gcGFyc2VyICovCisgICAgICAgICAgICAgICAgLypsX2NzdHJfaW5mby0+dGlsZV95ID0gcF9qMmstPm1fY3AudGR5OyovICAgICAgLyogbmV3IHZlcnNpb24gcGFyc2VyICovCisgICAgICAgICAgICAgICAgLypsX2NzdHJfaW5mby0+dGlsZV9PeCA9IHBfajJrLT5tX2NwLnR4MDsqLyAgICAgLyogbmV3IHZlcnNpb24gcGFyc2VyICovCisgICAgICAgICAgICAgICAgLypsX2NzdHJfaW5mby0+dGlsZV9PeSA9IHBfajJrLT5tX2NwLnR5MDsqLyAgICAgLyogbmV3IHZlcnNpb24gcGFyc2VyICovCisKKyAgICAgICAgICAgICAgICAvKmxfY3N0cl9pbmZvLT5udW1jb21wcyA9IHBfajJrLT5tX2ltYWdlLT5udW1jb21wczsKKworICAgICAgICAgICAgICAgIGxfY3N0cl9pbmZvLT5udW1sYXllcnMgPSAoJnBfajJrLT5tX2NwLnRjcHNbMF0pLT5udW1sYXllcnM7CisKKyAgICAgICAgICAgICAgICBsX2NzdHJfaW5mby0+bnVtZGVjb21wb3MgPSAoT1BKX0lOVDMyKikgb3BqX21hbGxvYyhwX2oyay0+bV9pbWFnZS0+bnVtY29tcHMgKiBzaXplb2YoT1BKX0lOVDMyKSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGNvbXBubz0wOyBjb21wbm8gPCBwX2oyay0+bV9pbWFnZS0+bnVtY29tcHM7IGNvbXBubysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsX2NzdHJfaW5mby0+bnVtZGVjb21wb3NbY29tcG5vXSA9ICgmcF9qMmstPm1fY3AudGNwc1swXSktPnRjY3BzLT5udW1yZXNvbHV0aW9ucyAtIDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbF9jc3RyX2luZm8tPkRfbWF4ID0gMC4wOyAgICAgICAqLyAgICAgIC8qIEFERCBNYXJjZWxhICovCisKKyAgICAgICAgICAgICAgICAvKmxfY3N0cl9pbmZvLT5tYWluX2hlYWRfc3RhcnQgPSBvcGpfc3RyZWFtX3RlbGwocF9zdHJlYW0pOyovIC8qIHBvc2l0aW9uIG9mIFNPQyAqLworCisgICAgICAgICAgICAgICAgLypsX2NzdHJfaW5mby0+bWF4bWFya251bSA9IDEwMDsKKyAgICAgICAgICAgICAgICBsX2NzdHJfaW5mby0+bWFya2VyID0gKG9wal9tYXJrZXJfaW5mb190ICopIG9wal9tYWxsb2MobF9jc3RyX2luZm8tPm1heG1hcmtudW0gKiBzaXplb2Yob3BqX21hcmtlcl9pbmZvX3QpKTsKKyAgICAgICAgICAgICAgICBsX2NzdHJfaW5mby0+bWFya251bSA9IDA7CisgICAgICAgIH0qLworCisgICAgICAgIHJldHVybiBvcGpfajJrX2NhbGN1bGF0ZV90cChwX2oyaywmKHBfajJrLT5tX2NwKSwmcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdG90YWxfdGlsZV9wYXJ0cyxwX2oyay0+bV9wcml2YXRlX2ltYWdlLHBfbWFuYWdlcik7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIHRpbGUtY29kZXIgZGVjb2Rlci4KKyAqCisgKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgICAgICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIEoySyBjb2RlYy4KKyAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2NyZWF0ZV90Y2QoICAgICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworCisgICAgICAgIHBfajJrLT5tX3RjZCA9IG9wal90Y2RfY3JlYXRlKE9QSl9GQUxTRSk7CisKKyAgICAgICAgaWYgKCEgcF9qMmstPm1fdGNkKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSBUaWxlIENvZGVyXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFvcGpfdGNkX2luaXQocF9qMmstPm1fdGNkLHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UsJnBfajJrLT5tX2NwKSkgeworICAgICAgICAgICAgICAgIG9wal90Y2RfZGVzdHJveShwX2oyay0+bV90Y2QpOworICAgICAgICAgICAgICAgIHBfajJrLT5tX3RjZCA9IDAwOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK09QSl9CT09MIG9wal9qMmtfd3JpdGVfdGlsZSAob3BqX2oya190ICogcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3sKKyAgICAgICAgaWYgKCEgb3BqX2oya19wcmVfd3JpdGVfdGlsZShwX2oyayxwX3RpbGVfaW5kZXgscF9zdHJlYW0scF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciB3aGlsZSBvcGpfajJrX3ByZV93cml0ZV90aWxlIHdpdGggdGlsZSBpbmRleCA9ICVkXG4iLCBwX3RpbGVfaW5kZXgpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBqOworICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIGRhdGEgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPHBfajJrLT5tX3RjZC0+aW1hZ2UtPm51bWNvbXBzOysraikgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlY29tcF90KiBsX3RpbGVjID0gcF9qMmstPm1fdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT5jb21wcyArIGo7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEgb3BqX2FsbG9jX3RpbGVfY29tcG9uZW50X2RhdGEobF90aWxlYykpIHsKKwkJCQkJCQkJCQkJCSAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIGFsbG9jYXRpbmcgdGlsZSBjb21wb25lbnQgZGF0YS4iICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogbm93IGNvcHkgZGF0YSBpbnRvIHRoZSB0aGUgdGlsZSBjb21wb25lbnQgKi8KKyAgICAgICAgICAgICAgICBpZiAoISBvcGpfdGNkX2NvcHlfdGlsZV9kYXRhKHBfajJrLT5tX3RjZCxwX2RhdGEscF9kYXRhX3NpemUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU2l6ZSBtaXNtYXRjaCBiZXR3ZWVuIHRpbGUgZGF0YSBhbmQgc2VudCBkYXRhLiIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghIG9wal9qMmtfcG9zdF93cml0ZV90aWxlKHBfajJrLHBfc3RyZWFtLHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciB3aGlsZSBvcGpfajJrX3Bvc3Rfd3JpdGVfdGlsZSB3aXRoIHRpbGUgaW5kZXggPSAlZFxuIiwgcF90aWxlX2luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qMmsuaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvajJrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU4ZTA3MwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvajJrLmgKQEAgLTAsMCArMSw4NjMgQEAKKy8qCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKKyAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKKyAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKKyAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgVW5pdmVyc2l0ZSBjYXRob2xpcXVlIGRlIExvdXZhaW4gKFVDTCksIEJlbGdpdW0KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBQcm9mZXNzb3IgQmVub2l0IE1hY3EKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzLCBEYXZpZCBKYW5zc2VucworICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIFlhbm5pY2sgVmVyc2NodWVyZW4KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eCAKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE0LCBBbnRvbmluIERlc2NhbXBlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA3LCBQYXJ2YXRoYSBFbGFuZ292YW4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgSmVyb21lIEZpbWVzLCBDb21tdW5pY2F0aW9ucyAmIFN5c3RlbWVzIDxqZXJvbWUuZmltZXNAYy1zLmZyPgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIENlbnRyZSBOYXRpb25hbCBkJ0V0dWRlcyBTcGF0aWFsZXMgKENORVMpLCBGcmFuY2UgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENTIFN5c3RlbWVzIGQnSW5mb3JtYXRpb24sIEZyYW5jZQorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgQVMgSVMnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgX19KMktfSAorI2RlZmluZSBfX0oyS19ICisvKioKK0BmaWxlIGoyay5oCitAYnJpZWYgVGhlIEpQRUctMjAwMCBDb2Rlc3RyZWFtIFJlYWRlci9Xcml0ZXIgKEoySykKKworVGhlIGZ1bmN0aW9ucyBpbiBKMksuQyBoYXZlIGZvciBnb2FsIHRvIHJlYWQvd3JpdGUgdGhlIHNldmVyYWwgcGFydHMgb2YgdGhlIGNvZGVzdHJlYW06IG1hcmtlcnMgYW5kIGRhdGEuCisqLworCisvKiogQGRlZmdyb3VwIEoySyBKMksgLSBKUEVHLTIwMDAgY29kZXN0cmVhbSByZWFkZXIvd3JpdGVyICovCisvKkB7Ki8KKworI2RlZmluZSBKMktfQ1BfQ1NUWV9QUlQgMHgwMQorI2RlZmluZSBKMktfQ1BfQ1NUWV9TT1AgMHgwMgorI2RlZmluZSBKMktfQ1BfQ1NUWV9FUEggMHgwNAorI2RlZmluZSBKMktfQ0NQX0NTVFlfUFJUIDB4MDEKKyNkZWZpbmUgSjJLX0NDUF9DQkxLU1RZX0xBWlkgMHgwMSAgICAgLyoqPCBTZWxlY3RpdmUgYXJpdGhtZXRpYyBjb2RpbmcgYnlwYXNzICovCisjZGVmaW5lIEoyS19DQ1BfQ0JMS1NUWV9SRVNFVCAweDAyICAgIC8qKjwgUmVzZXQgY29udGV4dCBwcm9iYWJpbGl0aWVzIG9uIGNvZGluZyBwYXNzIGJvdW5kYXJpZXMgKi8KKyNkZWZpbmUgSjJLX0NDUF9DQkxLU1RZX1RFUk1BTEwgMHgwNCAgLyoqPCBUZXJtaW5hdGlvbiBvbiBlYWNoIGNvZGluZyBwYXNzICovCisjZGVmaW5lIEoyS19DQ1BfQ0JMS1NUWV9WU0MgMHgwOCAgICAgIC8qKjwgVmVydGljYWxseSBzdHJpcGUgY2F1c2FsIGNvbnRleHQgKi8KKyNkZWZpbmUgSjJLX0NDUF9DQkxLU1RZX1BURVJNIDB4MTAgICAgLyoqPCBQcmVkaWN0YWJsZSB0ZXJtaW5hdGlvbiAqLworI2RlZmluZSBKMktfQ0NQX0NCTEtTVFlfU0VHU1lNIDB4MjAgICAvKio8IFNlZ21lbnRhdGlvbiBzeW1ib2xzIGFyZSB1c2VkICovCisjZGVmaW5lIEoyS19DQ1BfUU5UU1RZX05PUU5UIDAKKyNkZWZpbmUgSjJLX0NDUF9RTlRTVFlfU0lRTlQgMQorI2RlZmluZSBKMktfQ0NQX1FOVFNUWV9TRVFOVCAyCisKKyNkZWZpbmUgT1BKX0oyS19ERUZBVUxUX0NCTEtfREFUQV9TSVpFIDgxOTIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBKMktfTVNfU09DIDB4ZmY0ZgkvKio8IFNPQyBtYXJrZXIgdmFsdWUgKi8KKyNkZWZpbmUgSjJLX01TX1NPVCAweGZmOTAJLyoqPCBTT1QgbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19TT0QgMHhmZjkzCS8qKjwgU09EIG1hcmtlciB2YWx1ZSAqLworI2RlZmluZSBKMktfTVNfRU9DIDB4ZmZkOQkvKio8IEVPQyBtYXJrZXIgdmFsdWUgKi8KKyNkZWZpbmUgSjJLX01TX1NJWiAweGZmNTEJLyoqPCBTSVogbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19DT0QgMHhmZjUyCS8qKjwgQ09EIG1hcmtlciB2YWx1ZSAqLworI2RlZmluZSBKMktfTVNfQ09DIDB4ZmY1MwkvKio8IENPQyBtYXJrZXIgdmFsdWUgKi8KKyNkZWZpbmUgSjJLX01TX1JHTiAweGZmNWUJLyoqPCBSR04gbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19RQ0QgMHhmZjVjCS8qKjwgUUNEIG1hcmtlciB2YWx1ZSAqLworI2RlZmluZSBKMktfTVNfUUNDIDB4ZmY1ZAkvKio8IFFDQyBtYXJrZXIgdmFsdWUgKi8KKyNkZWZpbmUgSjJLX01TX1BPQyAweGZmNWYJLyoqPCBQT0MgbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19UTE0gMHhmZjU1CS8qKjwgVExNIG1hcmtlciB2YWx1ZSAqLworI2RlZmluZSBKMktfTVNfUExNIDB4ZmY1NwkvKio8IFBMTSBtYXJrZXIgdmFsdWUgKi8KKyNkZWZpbmUgSjJLX01TX1BMVCAweGZmNTgJLyoqPCBQTFQgbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19QUE0gMHhmZjYwCS8qKjwgUFBNIG1hcmtlciB2YWx1ZSAqLworI2RlZmluZSBKMktfTVNfUFBUIDB4ZmY2MQkvKio8IFBQVCBtYXJrZXIgdmFsdWUgKi8KKyNkZWZpbmUgSjJLX01TX1NPUCAweGZmOTEJLyoqPCBTT1AgbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19FUEggMHhmZjkyCS8qKjwgRVBIIG1hcmtlciB2YWx1ZSAqLworI2RlZmluZSBKMktfTVNfQ1JHIDB4ZmY2MwkvKio8IENSRyBtYXJrZXIgdmFsdWUgKi8KKyNkZWZpbmUgSjJLX01TX0NPTSAweGZmNjQJLyoqPCBDT00gbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19DQkQgMHhmZjc4CS8qKjwgQ0JEIG1hcmtlciB2YWx1ZSAqLworI2RlZmluZSBKMktfTVNfTUNDIDB4ZmY3NQkvKio8IE1DQyBtYXJrZXIgdmFsdWUgKi8KKyNkZWZpbmUgSjJLX01TX01DVCAweGZmNzQJLyoqPCBNQ1QgbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19NQ08gMHhmZjc3CS8qKjwgTUNPIG1hcmtlciB2YWx1ZSAqLworCisjZGVmaW5lIEoyS19NU19VTksgMAkJLyoqPCBVTktOT1dOIG1hcmtlciB2YWx1ZSAqLworCisvKiBVbmlQRz4+ICovCisjaWZkZWYgVVNFX0pQV0wKKyNkZWZpbmUgSjJLX01TX0VQQyAweGZmNjgJLyoqPCBFUEMgbWFya2VyIHZhbHVlIChQYXJ0IDExOiBKUEVHIDIwMDAgZm9yIFdpcmVsZXNzKSAqLworI2RlZmluZSBKMktfTVNfRVBCIDB4ZmY2NgkvKio8IEVQQiBtYXJrZXIgdmFsdWUgKFBhcnQgMTE6IEpQRUcgMjAwMCBmb3IgV2lyZWxlc3MpICovIAorI2RlZmluZSBKMktfTVNfRVNEIDB4ZmY2NwkvKio8IEVTRCBtYXJrZXIgdmFsdWUgKFBhcnQgMTE6IEpQRUcgMjAwMCBmb3IgV2lyZWxlc3MpICovIAorI2RlZmluZSBKMktfTVNfUkVEIDB4ZmY2OQkvKio8IFJFRCBtYXJrZXIgdmFsdWUgKFBhcnQgMTE6IEpQRUcgMjAwMCBmb3IgV2lyZWxlc3MpICovCisjZW5kaWYgLyogVVNFX0pQV0wgKi8KKyNpZmRlZiBVU0VfSlBTRUMKKyNkZWZpbmUgSjJLX01TX1NFQyAweGZmNjUgICAgLyoqPCBTRUMgbWFya2VyIHZhbHVlIChQYXJ0IDg6IFNlY3VyZSBKUEVHIDIwMDApICovCisjZGVmaW5lIEoyS19NU19JTlNFQyAweGZmOTQgIC8qKjwgSU5TRUMgbWFya2VyIHZhbHVlIChQYXJ0IDg6IFNlY3VyZSBKUEVHIDIwMDApICovCisjZW5kaWYgLyogVVNFX0pQU0VDICovCisvKiA8PFVuaVBHICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogVmFsdWVzIHRoYXQgc3BlY2lmeSB0aGUgc3RhdHVzIG9mIHRoZSBkZWNvZGluZyBwcm9jZXNzIHdoZW4gZGVjb2RpbmcgdGhlIG1haW4gaGVhZGVyLgorICogVGhlc2UgdmFsdWVzIG1heSBiZSBjb21iaW5lZCB3aXRoIGEgfCBvcGVyYXRvci4KKyAqICovCit0eXBlZGVmIGVudW0gSjJLX1NUQVRVUyB7CisJSjJLX1NUQVRFX05PTkUgID0gIDB4MDAwMCwgLyoqPCBhIFNPQyBtYXJrZXIgaXMgZXhwZWN0ZWQgKi8KKwlKMktfU1RBVEVfTUhTT0MgID0gMHgwMDAxLCAvKio8IGEgU09DIG1hcmtlciBpcyBleHBlY3RlZCAqLworCUoyS19TVEFURV9NSFNJWiAgPSAweDAwMDIsIC8qKjwgYSBTSVogbWFya2VyIGlzIGV4cGVjdGVkICovCisJSjJLX1NUQVRFX01IICAgICA9IDB4MDAwNCwgLyoqPCB0aGUgZGVjb2RpbmcgcHJvY2VzcyBpcyBpbiB0aGUgbWFpbiBoZWFkZXIgKi8KKwlKMktfU1RBVEVfVFBIU09UID0gMHgwMDA4LCAvKio8IHRoZSBkZWNvZGluZyBwcm9jZXNzIGlzIGluIGEgdGlsZSBwYXJ0IGhlYWRlciBhbmQgZXhwZWN0cyBhIFNPVCBtYXJrZXIgKi8KKwlKMktfU1RBVEVfVFBIICAgID0gMHgwMDEwLCAvKio8IHRoZSBkZWNvZGluZyBwcm9jZXNzIGlzIGluIGEgdGlsZSBwYXJ0IGhlYWRlciAqLworCUoyS19TVEFURV9NVCAgICAgPSAweDAwMjAsIC8qKjwgdGhlIEVPQyBtYXJrZXIgaGFzIGp1c3QgYmVlbiByZWFkICovCisJSjJLX1NUQVRFX05FT0MgICA9IDB4MDA0MCwgLyoqPCB0aGUgZGVjb2RpbmcgcHJvY2VzcyBtdXN0IG5vdCBleHBlY3QgYSBFT0MgbWFya2VyIGJlY2F1c2UgdGhlIGNvZGVzdHJlYW0gaXMgdHJ1bmNhdGVkICovCisKKwlKMktfU1RBVEVfRU9DCSA9IDB4MDEwMCwgLyoqPCB0aGUgZGVjb2RpbmcgcHJvY2VzcyBoYXMgZW5jb3VudGVyZWQgdGhlIEVPQyBtYXJrZXIgKi8KKwlKMktfU1RBVEVfRVJSICAgID0gMHg4MDAwICAvKio8IHRoZSBkZWNvZGluZyBwcm9jZXNzIGhhcyBlbmNvdW50ZXJlZCBhbiBlcnJvciAoRklYTUUgd2FybmluZyBWMSA9IDB4MDA4MCkqLworfSBKMktfU1RBVFVTOworCisvKioKKyAqIFR5cGUgb2YgZWxlbWVudHMgc3RvcmluZyBpbiB0aGUgTUNUIGRhdGEKKyAqLwordHlwZWRlZiBlbnVtIE1DVF9FTEVNRU5UX1RZUEUKK3sKKwlNQ1RfVFlQRV9JTlQxNiA9IDAsCQkvKiogTUNUIGRhdGEgaXMgc3RvcmVkIGFzIHNpZ25lZCBzaG9ydHMqLworCU1DVF9UWVBFX0lOVDMyID0gMSwJCS8qKiBNQ1QgZGF0YSBpcyBzdG9yZWQgYXMgc2lnbmVkIGludGVnZXJzKi8KKwlNQ1RfVFlQRV9GTE9BVCA9IDIsCQkvKiogTUNUIGRhdGEgaXMgc3RvcmVkIGFzIGZsb2F0cyovCisJTUNUX1RZUEVfRE9VQkxFID0gMwkJLyoqIE1DVCBkYXRhIGlzIHN0b3JlZCBhcyBkb3VibGVzKi8KK30gSjJLX01DVF9FTEVNRU5UX1RZUEU7CisKKy8qKgorICogVHlwZSBvZiBNQ1QgYXJyYXkKKyAqLwordHlwZWRlZiBlbnVtIE1DVF9BUlJBWV9UWVBFCit7CisJTUNUX1RZUEVfREVQRU5ERU5DWSA9IDAsCisJTUNUX1RZUEVfREVDT1JSRUxBVElPTiA9IDEsCisJTUNUX1RZUEVfT0ZGU0VUID0gMgorfSBKMktfTUNUX0FSUkFZX1RZUEU7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKiAKK1QyIGVuY29kaW5nIG1vZGUgCisqLwordHlwZWRlZiBlbnVtIFQyX01PREUgeworCVRIUkVTSF9DQUxDID0gMCwJLyoqIEZ1bmN0aW9uIGNhbGxlZCBpbiBSYXRlIGFsbG9jYXRpb24gcHJvY2VzcyovCisJRklOQUxfUEFTUyA9IDEJCS8qKiBGdW5jdGlvbiBjYWxsZWQgaW4gVGllciAyIHByb2Nlc3MqLworfUoyS19UMl9NT0RFOworCisvKioKKyAqIFF1YW50aXphdGlvbiBzdGVwc2l6ZQorICovCit0eXBlZGVmIHN0cnVjdCBvcGpfc3RlcHNpemUgeworCS8qKiBleHBvbmVudCAqLworCU9QSl9JTlQzMiBleHBuOworCS8qKiBtYW50aXNzYSAqLworCU9QSl9JTlQzMiBtYW50OworfSBvcGpfc3RlcHNpemVfdDsKKworLyoqCitUaWxlLWNvbXBvbmVudCBjb2RpbmcgcGFyYW1ldGVycworKi8KK3R5cGVkZWYgc3RydWN0IG9wal90Y2NwCit7CisJLyoqIGNvZGluZyBzdHlsZSAqLworCU9QSl9VSU5UMzIgY3N0eTsKKwkvKiogbnVtYmVyIG9mIHJlc29sdXRpb25zICovCisJT1BKX1VJTlQzMiBudW1yZXNvbHV0aW9uczsKKwkvKiogY29kZS1ibG9ja3Mgd2lkdGggKi8KKwlPUEpfVUlOVDMyIGNibGt3OworCS8qKiBjb2RlLWJsb2NrcyBoZWlnaHQgKi8KKwlPUEpfVUlOVDMyIGNibGtoOworCS8qKiBjb2RlLWJsb2NrIGNvZGluZyBzdHlsZSAqLworCU9QSl9VSU5UMzIgY2Jsa3N0eTsKKwkvKiogZGlzY3JldGUgd2F2ZWxldCB0cmFuc2Zvcm0gaWRlbnRpZmllciAqLworCU9QSl9VSU5UMzIgcW1mYmlkOworCS8qKiBxdWFudGlzYXRpb24gc3R5bGUgKi8KKwlPUEpfVUlOVDMyIHFudHN0eTsKKwkvKiogc3RlcHNpemVzIHVzZWQgZm9yIHF1YW50aXphdGlvbiAqLworCW9wal9zdGVwc2l6ZV90IHN0ZXBzaXplc1tPUEpfSjJLX01BWEJBTkRTXTsKKwkvKiogbnVtYmVyIG9mIGd1YXJkIGJpdHMgKi8KKwlPUEpfVUlOVDMyIG51bWdiaXRzOworCS8qKiBSZWdpb24gT2YgSW50ZXJlc3Qgc2hpZnQgKi8KKwlPUEpfSU5UMzIgcm9pc2hpZnQ7CisJLyoqIHByZWNpbmN0IHdpZHRoICovCisJT1BKX1VJTlQzMiBwcmN3W09QSl9KMktfTUFYUkxWTFNdOworCS8qKiBwcmVjaW5jdCBoZWlnaHQgKi8KKwlPUEpfVUlOVDMyIHByY2hbT1BKX0oyS19NQVhSTFZMU107CisJLyoqIHRoZSBkY19sZXZlbF9zaGlmdCAqKi8KKwlPUEpfSU5UMzIgbV9kY19sZXZlbF9zaGlmdDsKK30KK29wal90Y2NwX3Q7CisKKworCisvKioKKyAqIEZJWE1FIERPQworICovCit0eXBlZGVmIHN0cnVjdCBvcGpfbWN0X2RhdGEKK3sKKwlKMktfTUNUX0VMRU1FTlRfVFlQRSBtX2VsZW1lbnRfdHlwZTsKKwlKMktfTUNUX0FSUkFZX1RZUEUJIG1fYXJyYXlfdHlwZTsKKwlPUEpfVUlOVDMyCQkJIG1faW5kZXg7CisJT1BKX0JZVEUgKgkJCSBtX2RhdGE7CisJT1BKX1VJTlQzMgkJCSBtX2RhdGFfc2l6ZTsKK30KK29wal9tY3RfZGF0YV90OworCisvKioKKyAqIEZJWE1FIERPQworICovCit0eXBlZGVmIHN0cnVjdCBvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGEKK3sKKwlPUEpfVUlOVDMyCQkJIG1faW5kZXg7CisJT1BKX1VJTlQzMgkJCSBtX25iX2NvbXBzOworCW9wal9tY3RfZGF0YV90ICoJIG1fZGVjb3JyZWxhdGlvbl9hcnJheTsKKwlvcGpfbWN0X2RhdGFfdCAqCSBtX29mZnNldF9hcnJheTsKKwlPUEpfVUlOVDMyCQkJIG1faXNfaXJyZXZlcnNpYmxlIDogMTsKK30KK29wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90OworCit0eXBlZGVmIHN0cnVjdCBvcGpfcHB4X3N0cnVjdAoreworCU9QSl9CWVRFKiAgIG1fZGF0YTsgLyogbV9kYXRhID09IE5VTEwgPT4gWnBweCBub3QgcmVhZCB5ZXQgKi8KKwlPUEpfVUlOVDMyCW1fZGF0YV9zaXplOworfSBvcGpfcHB4OworCisvKioKK1RpbGUgY29kaW5nIHBhcmFtZXRlcnMgOgordGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzdG9yZSBjb2RpbmcvZGVjb2RpbmcgcGFyYW1ldGVycyBjb21tb24gdG8gYWxsCit0aWxlcyAoaW5mb3JtYXRpb24gbGlrZSBDT0QsIENPQyBpbiBtYWluIGhlYWRlcikKKyovCit0eXBlZGVmIHN0cnVjdCBvcGpfdGNwCit7CisJLyoqIGNvZGluZyBzdHlsZSAqLworCU9QSl9VSU5UMzIgY3N0eTsKKwkvKiogcHJvZ3Jlc3Npb24gb3JkZXIgKi8KKwlPUEpfUFJPR19PUkRFUiBwcmc7CisJLyoqIG51bWJlciBvZiBsYXllcnMgKi8KKwlPUEpfVUlOVDMyIG51bWxheWVyczsKKwlPUEpfVUlOVDMyIG51bV9sYXllcnNfdG9fZGVjb2RlOworCS8qKiBtdWx0aS1jb21wb25lbnQgdHJhbnNmb3JtIGlkZW50aWZpZXIgKi8KKwlPUEpfVUlOVDMyIG1jdDsKKwkvKiogcmF0ZXMgb2YgbGF5ZXJzICovCisJT1BKX0ZMT0FUMzIgcmF0ZXNbMTAwXTsKKwkvKiogbnVtYmVyIG9mIHByb2dyZXNzaW9uIG9yZGVyIGNoYW5nZXMgKi8KKwlPUEpfVUlOVDMyIG51bXBvY3M7CisJLyoqIHByb2dyZXNzaW9uIG9yZGVyIGNoYW5nZXMgKi8KKwlvcGpfcG9jX3QgcG9jc1szMl07CisJCisJLyoqIG51bWJlciBvZiBwcHQgbWFya2VycyAocmVzZXJ2ZWQgc2l6ZSkgKi8KKwlPUEpfVUlOVDMyIHBwdF9tYXJrZXJzX2NvdW50OworCS8qKiBwcHQgbWFya2VycyBkYXRhICh0YWJsZSBpbmRleGVkIGJ5IFpwcHQpICovCisJb3BqX3BweCogcHB0X21hcmtlcnM7CisJCisJLyoqIHBhY2tldCBoZWFkZXIgc3RvcmUgdGhlcmUgZm9yIGZ1dHVyZSB1c2UgaW4gdDJfZGVjb2RlX3BhY2tldCAqLworCU9QSl9CWVRFICpwcHRfZGF0YTsKKwkvKiogdXNlZCB0byBrZWVwIGEgdHJhY2sgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkgKi8KKwlPUEpfQllURSAqcHB0X2J1ZmZlcjsKKwkvKiogTnVtYmVyIG9mIGJ5dGVzIHN0b3JlZCBpbnNpZGUgcHB0X2RhdGEqLworCU9QSl9VSU5UMzIgcHB0X2RhdGFfc2l6ZTsKKwkvKiogc2l6ZSBvZiBwcHRfZGF0YSovCisJT1BKX1VJTlQzMiBwcHRfbGVuOworCS8qKiBhZGQgZml4ZWRfcXVhbGl0eSAqLworCU9QSl9GTE9BVDMyIGRpc3RvcmF0aW9bMTAwXTsKKwkvKiogdGlsZS1jb21wb25lbnQgY29kaW5nIHBhcmFtZXRlcnMgKi8KKwlvcGpfdGNjcF90ICp0Y2NwczsKKwkvKiogbnVtYmVyIG9mIHRpbGUgcGFydHMgZm9yIHRoZSB0aWxlLiAqLworCU9QSl9VSU5UMzIgbV9uYl90aWxlX3BhcnRzOworCS8qKiBkYXRhIGZvciB0aGUgdGlsZSAqLworCU9QSl9CWVRFICoJCW1fZGF0YTsKKwkvKiogc2l6ZSBvZiBkYXRhICovCisJT1BKX1VJTlQzMgkJbV9kYXRhX3NpemU7CisJLyoqIGVuY29kaW5nIG5vcm1zICovCisJT1BKX0ZMT0FUNjQgKgltY3Rfbm9ybXM7CisJLyoqIHRoZSBtY3QgZGVjb2RpbmcgbWF0cml4ICovCisJT1BKX0ZMT0FUMzIgKgltX21jdF9kZWNvZGluZ19tYXRyaXg7CisJLyoqIHRoZSBtY3QgY29kaW5nIG1hdHJpeCAqLworCU9QSl9GTE9BVDMyICoJbV9tY3RfY29kaW5nX21hdHJpeDsKKwkvKiogbWN0IHJlY29yZHMgKi8KKwlvcGpfbWN0X2RhdGFfdCAqIG1fbWN0X3JlY29yZHM7CisJLyoqIHRoZSBudW1iZXIgb2YgbWN0IHJlY29yZHMuICovCisJT1BKX1VJTlQzMiBtX25iX21jdF9yZWNvcmRzOworCS8qKiB0aGUgbWF4IG51bWJlciBvZiBtY3QgcmVjb3Jkcy4gKi8KKwlPUEpfVUlOVDMyIG1fbmJfbWF4X21jdF9yZWNvcmRzOworCS8qKiBtY2MgcmVjb3JkcyAqLworCW9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90ICogbV9tY2NfcmVjb3JkczsKKwkvKiogdGhlIG51bWJlciBvZiBtY3QgcmVjb3Jkcy4gKi8KKwlPUEpfVUlOVDMyIG1fbmJfbWNjX3JlY29yZHM7CisJLyoqIHRoZSBtYXggbnVtYmVyIG9mIG1jdCByZWNvcmRzLiAqLworCU9QSl9VSU5UMzIgbV9uYl9tYXhfbWNjX3JlY29yZHM7CisKKworCS8qKioqKiBGTEFHUyAqKioqKioqLworCS8qKiBJZiBjb2QgPT0gMSAtLT4gdGhlcmUgd2FzIGEgQ09EIG1hcmtlciBmb3IgdGhlIHByZXNlbnQgdGlsZSAqLworCU9QSl9VSU5UMzIgY29kIDogMTsKKwkvKiogSWYgcHB0ID09IDEgLS0+IHRoZXJlIHdhcyBhIFBQVCBtYXJrZXIgZm9yIHRoZSBwcmVzZW50IHRpbGUgKi8KKwlPUEpfVUlOVDMyIHBwdCA6IDE7CisJLyoqIGluZGljYXRlcyBpZiBhIFBPQyBtYXJrZXIgaGFzIGJlZW4gdXNlZCBPOk5PLCAxOllFUyAqLworCU9QSl9VSU5UMzIgUE9DIDogMTsKK30gb3BqX3RjcF90OworCisKKworCit0eXBlZGVmIHN0cnVjdCBvcGpfZW5jb2RpbmdfcGFyYW0KK3sKKwkvKiogTWF4aW11bSByYXRlIGZvciBlYWNoIGNvbXBvbmVudC4gSWYgPT0gMCwgY29tcG9uZW50IHNpemUgbGltaXRhdGlvbiBpcyBub3QgY29uc2lkZXJlZCAqLworCU9QSl9VSU5UMzIgbV9tYXhfY29tcF9zaXplOworCS8qKiBQb3NpdGlvbiBvZiB0aWxlIHBhcnQgZmxhZyBpbiBwcm9ncmVzc2lvbiBvcmRlciovCisJT1BKX0lOVDMyIG1fdHBfcG9zOworCS8qKiBmaXhlZCBsYXllciAqLworCU9QSl9JTlQzMiAqbV9tYXRyaWNlOworCS8qKiBGbGFnIGRldGVybWluaW5nIHRpbGUgcGFydCBnZW5lcmF0aW9uKi8KKwlPUEpfQllURSBtX3RwX2ZsYWc7CisJLyoqIGFsbG9jYXRpb24gYnkgcmF0ZS9kaXN0b3J0aW9uICovCisJT1BKX1VJTlQzMiBtX2Rpc3RvX2FsbG9jIDogMTsKKwkvKiogYWxsb2NhdGlvbiBieSBmaXhlZCBsYXllciAqLworCU9QSl9VSU5UMzIgbV9maXhlZF9hbGxvYyA6IDE7CisJLyoqIGFkZCBmaXhlZF9xdWFsaXR5ICovCisJT1BKX1VJTlQzMiBtX2ZpeGVkX3F1YWxpdHkgOiAxOworCS8qKiBFbmFibGluZyBUaWxlIHBhcnQgZ2VuZXJhdGlvbiovCisJT1BKX1VJTlQzMiBtX3RwX29uIDogMTsKK30KK29wal9lbmNvZGluZ19wYXJhbV90OworCit0eXBlZGVmIHN0cnVjdCBvcGpfZGVjb2RpbmdfcGFyYW0KK3sKKwkvKiogaWYgIT0gMCwgdGhlbiBvcmlnaW5hbCBkaW1lbnNpb24gZGl2aWRlZCBieSAyXihyZWR1Y2UpOyBpZiA9PSAwIG9yIG5vdCB1c2VkLCBpbWFnZSBpcyBkZWNvZGVkIHRvIHRoZSBmdWxsIHJlc29sdXRpb24gKi8KKwlPUEpfVUlOVDMyIG1fcmVkdWNlOworCS8qKiBpZiAhPSAwLCB0aGVuIG9ubHkgdGhlIGZpcnN0ICJsYXllciIgbGF5ZXJzIGFyZSBkZWNvZGVkOyBpZiA9PSAwIG9yIG5vdCB1c2VkLCBhbGwgdGhlIHF1YWxpdHkgbGF5ZXJzIGFyZSBkZWNvZGVkICovCisJT1BKX1VJTlQzMiBtX2xheWVyOworfQorb3BqX2RlY29kaW5nX3BhcmFtX3Q7CisKKworLyoqCisgKiBDb2RpbmcgcGFyYW1ldGVycworICovCit0eXBlZGVmIHN0cnVjdCBvcGpfY3AKK3sKKwkvKiogU2l6ZSBvZiB0aGUgaW1hZ2UgaW4gYml0cyovCisJLyppbnQgaW1nX3NpemU7Ki8KKwkvKiogUnNpeiovCisgICAgT1BKX1VJTlQxNiByc2l6OworCS8qKiBYVE9zaXogKi8KKwlPUEpfVUlOVDMyIHR4MDsgLyogTVNEIHNlZSBub3JtICovCisJLyoqIFlUT3NpeiAqLworCU9QSl9VSU5UMzIgdHkwOyAvKiBNU0Qgc2VlIG5vcm0gKi8KKwkvKiogWFRzaXogKi8KKwlPUEpfVUlOVDMyIHRkeDsKKwkvKiogWVRzaXogKi8KKwlPUEpfVUlOVDMyIHRkeTsKKwkvKiogY29tbWVudCAqLworCU9QSl9DSEFSICpjb21tZW50OworCS8qKiBudW1iZXIgb2YgdGlsZXMgaW4gd2lkdGggKi8KKwlPUEpfVUlOVDMyIHR3OworCS8qKiBudW1iZXIgb2YgdGlsZXMgaW4gaGVpZ3RoICovCisJT1BKX1VJTlQzMiB0aDsKKworCS8qKiBudW1iZXIgb2YgcHBtIG1hcmtlcnMgKHJlc2VydmVkIHNpemUpICovCisJT1BKX1VJTlQzMiBwcG1fbWFya2Vyc19jb3VudDsKKwkvKiogcHBtIG1hcmtlcnMgZGF0YSAodGFibGUgaW5kZXhlZCBieSBacHBtKSAqLworCW9wal9wcHgqIHBwbV9tYXJrZXJzOworCQorCS8qKiBwYWNrZXQgaGVhZGVyIHN0b3JlIHRoZXJlIGZvciBmdXR1cmUgdXNlIGluIHQyX2RlY29kZV9wYWNrZXQgKi8KKwlPUEpfQllURSAqcHBtX2RhdGE7CisJLyoqIHNpemUgb2YgdGhlIHBwbV9kYXRhKi8KKwlPUEpfVUlOVDMyIHBwbV9sZW47CisJLyoqIHNpemUgb2YgdGhlIHBwbV9kYXRhKi8KKwlPUEpfVUlOVDMyIHBwbV9kYXRhX3JlYWQ7CisKKwlPUEpfQllURSAqcHBtX2RhdGFfY3VycmVudDsKKworCS8qKiBwYWNrZXQgaGVhZGVyIHN0b3JhZ2Ugb3JpZ2luYWwgYnVmZmVyICovCisJT1BKX0JZVEUgKnBwbV9idWZmZXI7CisJLyoqIHBvaW50ZXIgcmVtYWluaW5nIG9uIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBmaXJzdCBoZWFkZXIgaWYgcHBtIGlzIHVzZWQgKi8KKwlPUEpfQllURSAqcHBtX2RhdGFfZmlyc3Q7CisJLyoqIE51bWJlciBvZiBieXRlcyBhY3R1YWxseSBzdG9yZWQgaW5zaWRlIHRoZSBwcG1fZGF0YSAqLworCU9QSl9VSU5UMzIgcHBtX2RhdGFfc2l6ZTsKKwkvKiogdXNlIGluIGNhc2Ugb2YgbXVsdGlwbGUgbWFya2VyIFBQTSAobnVtYmVyIG9mIGluZm8gYWxyZWFkeSBzdG9yZSkgKi8KKwlPUEpfSU5UMzIgcHBtX3N0b3JlOworCS8qKiB1c2UgaW4gY2FzZSBvZiBtdWx0aXBsZSBtYXJrZXIgUFBNIChjYXNlIG9uIG5vbi1maW5pc2hlZCBwcmV2aW91cyBpbmZvKSAqLworCU9QSl9JTlQzMiBwcG1fcHJldmlvdXM7CisKKwkvKiogdGlsZSBjb2RpbmcgcGFyYW1ldGVycyAqLworCW9wal90Y3BfdCAqdGNwczsKKworCXVuaW9uCisJeworCQlvcGpfZGVjb2RpbmdfcGFyYW1fdCBtX2RlYzsKKwkJb3BqX2VuY29kaW5nX3BhcmFtX3QgbV9lbmM7CisJfQorCW1fc3BlY2lmaWNfcGFyYW07CisKKworLyogVW5pUEc+PiAqLworI2lmZGVmIFVTRV9KUFdMCisJLyoqIGVuYWJsZXMgd3JpdGluZyBvZiBFUEMgaW4gTUgsIHRodXMgYWN0aXZhdGluZyBKUFdMICovCisJT1BKX0JPT0wgZXBjX29uOworCS8qKiBlbmFibGVzIHdyaXRpbmcgb2YgRVBCLCBpbiBjYXNlIG9mIGFjdGl2YXRlZCBKUFdMICovCisJT1BKX0JPT0wgZXBiX29uOworCS8qKiBlbmFibGVzIHdyaXRpbmcgb2YgRVNELCBpbiBjYXNlIG9mIGFjdGl2YXRlZCBKUFdMICovCisJT1BKX0JPT0wgZXNkX29uOworCS8qKiBlbmFibGVzIHdyaXRpbmcgb2YgaW5mb3JtYXRpdmUgdGVjaG5pcXVlcyBvZiBFU0QsIGluIGNhc2Ugb2YgYWN0aXZhdGVkIEpQV0wgKi8KKwlPUEpfQk9PTCBpbmZvX29uOworCS8qKiBlbmFibGVzIHdyaXRpbmcgb2YgUkVELCBpbiBjYXNlIG9mIGFjdGl2YXRlZCBKUFdMICovCisJT1BKX0JPT0wgcmVkX29uOworCS8qKiBlcnJvciBwcm90ZWN0aW9uIG1ldGhvZCBmb3IgTUggKDAsMSwxNiwzMiwzNy0xMjgpICovCisJaW50IGhwcm90X01IOworCS8qKiB0aWxlIG51bWJlciBvZiBoZWFkZXIgcHJvdGVjdGlvbiBzcGVjaWZpY2F0aW9uICg+PTApICovCisJaW50IGhwcm90X1RQSF90aWxlbm9bSlBXTF9NQVhfTk9fVElMRVNQRUNTXTsKKwkvKiogZXJyb3IgcHJvdGVjdGlvbiBtZXRob2RzIGZvciBUUEhzICgwLDEsMTYsMzIsMzctMTI4KSAqLworCWludCBocHJvdF9UUEhbSlBXTF9NQVhfTk9fVElMRVNQRUNTXTsKKwkvKiogdGlsZSBudW1iZXIgb2YgcGFja2V0IHByb3RlY3Rpb24gc3BlY2lmaWNhdGlvbiAoPj0wKSAqLworCWludCBwcHJvdF90aWxlbm9bSlBXTF9NQVhfTk9fUEFDS1NQRUNTXTsKKwkvKiogcGFja2V0IG51bWJlciBvZiBwYWNrZXQgcHJvdGVjdGlvbiBzcGVjaWZpY2F0aW9uICg+PTApICovCisJaW50IHBwcm90X3BhY2tub1tKUFdMX01BWF9OT19QQUNLU1BFQ1NdOworCS8qKiBlcnJvciBwcm90ZWN0aW9uIG1ldGhvZHMgZm9yIHBhY2tldHMgKDAsMSwxNiwzMiwzNy0xMjgpICovCisJaW50IHBwcm90W0pQV0xfTUFYX05PX1BBQ0tTUEVDU107CisJLyoqIGVuYWJsZXMgd3JpdGluZyBvZiBFU0QsICgwLzIvNCBieXRlcykgKi8KKwlpbnQgc2Vuc19zaXplOworCS8qKiBzZW5zaXRpdml0eSBhZGRyZXNzaW5nIHNpemUgKDA9YXV0by8yLzQgYnl0ZXMpICovCisJaW50IHNlbnNfYWRkcjsKKwkvKiogc2Vuc2l0aXZpdHkgcmFuZ2UgKDAtMykgKi8KKwlpbnQgc2Vuc19yYW5nZTsKKwkvKiogc2Vuc2l0aXZpdHkgbWV0aG9kIGZvciBNSCAoLTEsMC03KSAqLworCWludCBzZW5zX01IOworCS8qKiB0aWxlIG51bWJlciBvZiBzZW5zaXRpdml0eSBzcGVjaWZpY2F0aW9uICg+PTApICovCisJaW50IHNlbnNfVFBIX3RpbGVub1tKUFdMX01BWF9OT19USUxFU1BFQ1NdOworCS8qKiBzZW5zaXRpdml0eSBtZXRob2RzIGZvciBUUEhzICgtMSwwLTcpICovCisJaW50IHNlbnNfVFBIW0pQV0xfTUFYX05PX1RJTEVTUEVDU107CisJLyoqIGVuYWJsZXMgSlBXTCBjb3JyZWN0aW9uIGF0IHRoZSBkZWNvZGVyICovCisJT1BKX0JPT0wgY29ycmVjdDsKKwkvKiogZXhwZWN0ZWQgbnVtYmVyIG9mIGNvbXBvbmVudHMgYXQgdGhlIGRlY29kZXIgKi8KKwlpbnQgZXhwX2NvbXBzOworCS8qKiBtYXhpbXVtIG51bWJlciBvZiB0aWxlcyBhdCB0aGUgZGVjb2RlciAqLworCU9QSl9VSU5UMzIgbWF4X3RpbGVzOworI2VuZGlmIC8qIFVTRV9KUFdMICovCisKKwkvKioqKioqKiogRkxBR1MgKioqKioqKioqLworCS8qKiBpZiBwcG0gPT0gMSAtLT4gdGhlcmUgd2FzIGEgUFBNIG1hcmtlciovCisJT1BKX1VJTlQzMiBwcG0gOiAxOworCS8qKiB0ZWxscyBpZiB0aGUgcGFyYW1ldGVyIGlzIGEgY29kaW5nIG9yIGRlY29kaW5nIG9uZSAqLworCU9QSl9VSU5UMzIgbV9pc19kZWNvZGVyIDogMTsKKy8qIDw8VW5pUEcgKi8KK30gb3BqX2NwX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3Qgb3BqX2oya19kZWMKK3sKKwkvKiogbG9jYXRlIGluIHdoaWNoIHBhcnQgb2YgdGhlIGNvZGVzdHJlYW0gdGhlIGRlY29kZXIgaXMgKG1haW4gaGVhZGVyLCB0aWxlIGhlYWRlciwgZW5kKSAqLworCU9QSl9VSU5UMzIgbV9zdGF0ZTsKKwkvKioKKwkgKiBzdG9yZSBkZWNvZGluZyBwYXJhbWV0ZXJzIGNvbW1vbiB0byBhbGwgdGlsZXMgKGluZm9ybWF0aW9uIGxpa2UgQ09ELCBDT0MgaW4gbWFpbiBoZWFkZXIpCisJICovCisJb3BqX3RjcF90ICptX2RlZmF1bHRfdGNwOworCU9QSl9CWVRFICAqbV9oZWFkZXJfZGF0YTsKKwlPUEpfVUlOVDMyIG1faGVhZGVyX2RhdGFfc2l6ZTsKKwkvKiogdG8gdGVsbCB0aGUgdGlsZSBwYXJ0IGxlbmd0aCAqLworCU9QSl9VSU5UMzIgbV9zb3RfbGVuZ3RoOworCS8qKiBPbmx5IHRpbGVzIGluZGV4IGluIHRoZSBjb3JyZWN0IHJhbmdlIHdpbGwgYmUgZGVjb2RlZC4qLworCU9QSl9VSU5UMzIgbV9zdGFydF90aWxlX3g7CisJT1BKX1VJTlQzMiBtX3N0YXJ0X3RpbGVfeTsKKwlPUEpfVUlOVDMyIG1fZW5kX3RpbGVfeDsKKwlPUEpfVUlOVDMyIG1fZW5kX3RpbGVfeTsKKwkvKioKKwkgKiBEZWNvZGVkIGFyZWEgc2V0IGJ5IHRoZSB1c2VyCisJICovCisJT1BKX1VJTlQzMiBtX0RBX3gwOworCU9QSl9VSU5UMzIgbV9EQV95MDsKKwlPUEpfVUlOVDMyIG1fREFfeDE7CisJT1BKX1VJTlQzMiBtX0RBX3kxOworCisJLyoqIEluZGV4IG9mIHRoZSB0aWxlIHRvIGRlY29kZSAodXNlZCBpbiBnZXRfdGlsZSkgKi8KKwlPUEpfSU5UMzIgbV90aWxlX2luZF90b19kZWM7CisJLyoqIFBvc2l0aW9uIG9mIHRoZSBsYXN0IFNPVCBtYXJrZXIgcmVhZCAqLworCU9QSl9PRkZfVCBtX2xhc3Rfc290X3JlYWRfcG9zOworCisJLyoqCisJICogSW5kaWNhdGUgdGhhdCB0aGUgY3VycmVudCB0aWxlLXBhcnQgaXMgYXNzdW1lIGFzIHRoZSBsYXN0IHRpbGUgcGFydCBvZiB0aGUgY29kZXN0cmVhbS4KKwkgKiBJdCBpcyB1c2VmdWwgaW4gdGhlIGNhc2Ugb2YgUFNvdCBpcyBlcXVhbCB0byB6ZXJvLiBUaGUgc290IGxlbmd0aCB3aWxsIGJlIGNvbXB1dGUgaW4gdGhlCisJICogU09EIHJlYWRlciBmdW5jdGlvbi4gRklYTUUgTk9UIFVTRUQgZm9yIHRoZSBtb21lbnQKKwkgKi8KKwlPUEpfQk9PTCAgIG1fbGFzdF90aWxlX3BhcnQ7CisJLyoqIHRvIHRlbGwgdGhhdCBhIHRpbGUgY2FuIGJlIGRlY29kZWQuICovCisJT1BKX1VJTlQzMiBtX2Nhbl9kZWNvZGUJCQk6IDE7CisJT1BKX1VJTlQzMiBtX2Rpc2NhcmRfdGlsZXMJCTogMTsKKwlPUEpfVUlOVDMyIG1fc2tpcF9kYXRhCQkJOiAxOworCS8qKiBUTnNvdCBjb3JyZWN0aW9uIDogc2VlIGlzc3VlIDI1NCAqKi8KKwlPUEpfVUlOVDMyIG1fbmJfdGlsZV9wYXJ0c19jb3JyZWN0aW9uX2NoZWNrZWQgOiAxOworCU9QSl9VSU5UMzIgbV9uYl90aWxlX3BhcnRzX2NvcnJlY3Rpb24gOiAxOworCit9IG9wal9qMmtfZGVjX3Q7CisKK3R5cGVkZWYgc3RydWN0IG9wal9qMmtfZW5jCit7CisJLyoqIFRpbGUgcGFydCBudW1iZXIsIHJlZ2FyZGxlc3Mgb2YgcG9jLCBmb3IgZWFjaCBuZXcgcG9jLCB0cCBpcyByZXNldCB0byAxKi8KKwlPUEpfVUlOVDMyIG1fY3VycmVudF9wb2NfdGlsZV9wYXJ0X251bWJlcjsgLyogdHBfbnVtICovCisKKwkvKiogVGlsZSBwYXJ0IG51bWJlciBjdXJyZW50bHkgY29kaW5nLCB0YWtpbmcgaW50byBhY2NvdW50IFBPQy4gbV9jdXJyZW50X3RpbGVfcGFydF9udW1iZXIgaG9sZHMgdGhlIHRvdGFsIG51bWJlciBvZiB0aWxlIHBhcnRzIHdoaWxlIGVuY29kaW5nIHRoZSBsYXN0IHRpbGUgcGFydC4qLworCU9QSl9VSU5UMzIgbV9jdXJyZW50X3RpbGVfcGFydF9udW1iZXI7IC8qY3VyX3RwX251bSAqLworCisJLyoqCisJbG9jYXRlIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgVExNIG1hcmtlcgorCWFmdGVyIGVuY29kaW5nIHRoZSB0aWxlcGFydCwgYSBqdW1wIChpbiBqMmtfd3JpdGVfc29kKSBpcyBkb25lIHRvIHRoZSBUTE0gbWFya2VyIHRvIHN0b3JlIHRoZSB2YWx1ZSBvZiBpdHMgbGVuZ3RoLgorCSovCisgICAgT1BKX09GRl9UIG1fdGxtX3N0YXJ0OworCS8qKgorCSAqIFN0b3JlcyB0aGUgc2l6ZXMgb2YgdGhlIHRsbS4KKwkgKi8KKwlPUEpfQllURSAqIG1fdGxtX3NvdF9vZmZzZXRzX2J1ZmZlcjsKKwkvKioKKwkgKiBUaGUgY3VycmVudCBvZmZzZXQgb2YgdGhlIHRsbSBidWZmZXIuCisJICovCisJT1BKX0JZVEUgKiBtX3RsbV9zb3Rfb2Zmc2V0c19jdXJyZW50OworCisJLyoqIFRvdGFsIG51bSBvZiB0aWxlIHBhcnRzIGluIHdob2xlIGltYWdlID0gbnVtIHRpbGVzKiBudW0gdGlsZXBhcnRzIGluIGVhY2ggdGlsZSovCisJLyoqIHVzZWQgaW4gVExNbWFya2VyKi8KKwlPUEpfVUlOVDMyIG1fdG90YWxfdGlsZV9wYXJ0czsJIC8qIHRvdG51bV90cCAqLworCisJLyogZW5jb2RlZCBkYXRhIGZvciBhIHRpbGUgKi8KKwlPUEpfQllURSAqIG1fZW5jb2RlZF90aWxlX2RhdGE7CisKKwkvKiBzaXplIG9mIHRoZSBlbmNvZGVkX2RhdGEgKi8KKwlPUEpfVUlOVDMyIG1fZW5jb2RlZF90aWxlX3NpemU7CisKKwkvKiBlbmNvZGVkIGRhdGEgZm9yIGEgdGlsZSAqLworCU9QSl9CWVRFICogbV9oZWFkZXJfdGlsZV9kYXRhOworCisJLyogc2l6ZSBvZiB0aGUgZW5jb2RlZF9kYXRhICovCisJT1BKX1VJTlQzMiBtX2hlYWRlcl90aWxlX2RhdGFfc2l6ZTsKKworCit9IG9wal9qMmtfZW5jX3Q7CisKKworCitzdHJ1Y3Qgb3BqX3RjZDsKKy8qKgorSlBFRy0yMDAwIGNvZGVzdHJlYW0gcmVhZGVyL3dyaXRlcgorKi8KK3R5cGVkZWYgc3RydWN0IG9wal9qMmsKK3sKKwkvKiBKMksgY29kZXN0cmVhbSBpcyBkZWNvZGVkKi8KKwlPUEpfQk9PTCBtX2lzX2RlY29kZXI7CisKKwkvKiBGSVhNRSBET0MqLworCXVuaW9uCisJeworCQlvcGpfajJrX2RlY190IG1fZGVjb2RlcjsKKwkJb3BqX2oya19lbmNfdCBtX2VuY29kZXI7CisJfQorCW1fc3BlY2lmaWNfcGFyYW07CisKKwkvKiogcG9pbnRlciB0byB0aGUgaW50ZXJuYWwvcHJpdmF0ZSBlbmNvZGVkIC8gZGVjb2RlZCBpbWFnZSAqLworCW9wal9pbWFnZV90KiBtX3ByaXZhdGVfaW1hZ2U7CisKKwkvKiBwb2ludGVyIHRvIHRoZSBvdXRwdXQgaW1hZ2UgKGRlY29kZWQpKi8KKwlvcGpfaW1hZ2VfdCogbV9vdXRwdXRfaW1hZ2U7CisKKwkvKiogQ29kaW5nIHBhcmFtZXRlcnMgKi8KKwlvcGpfY3BfdCBtX2NwOworCisJLyoqIHRoZSBsaXN0IG9mIHByb2NlZHVyZXMgdG8gZXhlYyAqKi8KKwlvcGpfcHJvY2VkdXJlX2xpc3RfdCAqCW1fcHJvY2VkdXJlX2xpc3Q7CisKKwkvKiogdGhlIGxpc3Qgb2YgdmFsaWRhdGlvbiBwcm9jZWR1cmVzIHRvIGZvbGxvdyB0byBtYWtlIHN1cmUgdGhlIGNvZGUgaXMgdmFsaWQgKiovCisJb3BqX3Byb2NlZHVyZV9saXN0X3QgKgltX3ZhbGlkYXRpb25fbGlzdDsKKworCS8qKiBoZWxwZXIgdXNlZCB0byB3cml0ZSB0aGUgaW5kZXggZmlsZSAqLworCW9wal9jb2Rlc3RyZWFtX2luZGV4X3QgKmNzdHJfaW5kZXg7CisKKwkvKiogbnVtYmVyIG9mIHRoZSB0aWxlIGN1cmVudGx5IGNvbmNlcm4gYnkgY29kaW5nL2RlY29kaW5nICovCisJT1BKX1VJTlQzMiBtX2N1cnJlbnRfdGlsZV9udW1iZXI7CisKKwkvKiogdGhlIGN1cnJlbnQgdGlsZSBjb2Rlci9kZWNvZGVyICoqLworCXN0cnVjdCBvcGpfdGNkICoJbV90Y2Q7Cit9CitvcGpfajJrX3Q7CisKKworCisKKy8qKiBAbmFtZSBFeHBvcnRlZCBmdW5jdGlvbnMgKi8KKy8qQHsqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCitTZXR1cCB0aGUgZGVjb2RlciBkZWNvZGluZyBwYXJhbWV0ZXJzIHVzaW5nIHVzZXIgcGFyYW1ldGVycy4KK0RlY29kaW5nIHBhcmFtZXRlcnMgYXJlIHJldHVybmVkIGluIGoyay0+Y3AuIAorQHBhcmFtIGoyayBKMksgZGVjb21wcmVzc29yIGhhbmRsZQorQHBhcmFtIHBhcmFtZXRlcnMgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzCisqLwordm9pZCBvcGpfajJrX3NldHVwX2RlY29kZXIob3BqX2oya190ICpqMmssIG9wal9kcGFyYW1ldGVyc190ICpwYXJhbWV0ZXJzKTsKKworLyoqCisgKiBDcmVhdGVzIGEgSjJLIGNvbXByZXNzaW9uIHN0cnVjdHVyZQorICoKKyAqIEByZXR1cm4gUmV0dXJucyBhIGhhbmRsZSB0byBhIEoySyBjb21wcmVzc29yIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKKyovCitvcGpfajJrX3QqIG9wal9qMmtfY3JlYXRlX2NvbXByZXNzKHZvaWQpOworCisKK09QSl9CT09MIG9wal9qMmtfc2V0dXBfZW5jb2RlcigJb3BqX2oya190ICpwX2oyaywKKwkJCQkJCSAgICBvcGpfY3BhcmFtZXRlcnNfdCAqcGFyYW1ldGVycywKKwkJCQkJCSAgICBvcGpfaW1hZ2VfdCAqaW1hZ2UsCisJCQkJCQkgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKKworLyoqCitDb252ZXJ0cyBhbiBlbnVtIHR5cGUgcHJvZ3Jlc3Npb24gb3JkZXIgdG8gc3RyaW5nIHR5cGUKKyovCitjaGFyICpvcGpfajJrX2NvbnZlcnRfcHJvZ3Jlc3Npb25fb3JkZXIoT1BKX1BST0dfT1JERVIgcHJnX29yZGVyKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qQH0qLworCisvKkB9Ki8KKworLyoqCisgKiBFbmRzIHRoZSBkZWNvbXByZXNzaW9uIHByb2NlZHVyZXMgYW5kIHBvc3NpYmlsaXkgYWRkIGRhdGEgdG8gYmUgcmVhZCBhZnRlciB0aGUKKyAqIGNvZGVzdHJlYW0uCisgKi8KK09QSl9CT09MIG9wal9qMmtfZW5kX2RlY29tcHJlc3Mob3BqX2oya190ICpqMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKKworLyoqCisgKiBSZWFkcyBhIGpwZWcyMDAwIGNvZGVzdHJlYW0gaGVhZGVyIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gcF9zdHJlYW0gdGhlIHN0cmVhbSB0byByZWFkIGRhdGEgZnJvbS4KKyAqIEBwYXJhbSBwX2oyayB0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0gcF9pbWFnZSBGSVhNRSBET0MKKyAqIEBwYXJhbSBwX21hbmFnZXIgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGJveCBpcyB2YWxpZC4KKyAqLworT1BKX0JPT0wgb3BqX2oya19yZWFkX2hlYWRlcigJb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfajJrX3QqIHBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCoqIHBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCogcF9tYW5hZ2VyICk7CisKKworLyoqCisgKiBEZXN0cm95cyBhIGpwZWcyMDAwIGNvZGVjLgorICoKKyAqIEBwYXJhbQlwX2oyawl0aGUganBlZzIwMDAwIHN0cnVjdHVyZSB0byBkZXN0cm95LgorICovCit2b2lkIG9wal9qMmtfZGVzdHJveSAob3BqX2oya190ICpwX2oyayk7CisKKy8qKgorICogRGVzdHJveXMgYSBjb2Rlc3RyZWFtIGluZGV4IHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0JcF9jc3RyX2luZAl0aGUgY29kZXN0cmVhbSBpbmRleCBwYXJhbWV0ZXIgdG8gZGVzdHJveS4KKyAqLwordm9pZCBqMmtfZGVzdHJveV9jc3RyX2luZGV4IChvcGpfY29kZXN0cmVhbV9pbmRleF90ICpwX2NzdHJfaW5kKTsKKworLyoqCisgKiBEZWNvZGUgdGlsZSBkYXRhLgorICogQHBhcmFtCXBfajJrCQl0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0JcF90aWxlX2luZGV4CisgKiBAcGFyYW0gcF9kYXRhICAgICAgIEZJWE1FIERPQworICogQHBhcmFtIHBfZGF0YV9zaXplICBGSVhNRSBET0MKKyAqIEBwYXJhbQlwX3N0cmVhbQkJCXRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KKyAqIEBwYXJhbQlwX21hbmFnZXIJdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyAqLworT1BKX0JPT0wgb3BqX2oya19kZWNvZGVfdGlsZSAoICBvcGpfajJrX3QgKiBwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworCisvKioKKyAqIFJlYWRzIGEgdGlsZSBoZWFkZXIuCisgKiBAcGFyYW0JcF9qMmsJCXRoZSBqcGVnMjAwMCBjb2RlYy4KKyAqIEBwYXJhbQlwX3RpbGVfaW5kZXggRklYTUUgRE9DCisgKiBAcGFyYW0JcF9kYXRhX3NpemUgRklYTUUgRE9DCisgKiBAcGFyYW0JcF90aWxlX3gwIEZJWE1FIERPQworICogQHBhcmFtCXBfdGlsZV95MCBGSVhNRSBET0MKKyAqIEBwYXJhbQlwX3RpbGVfeDEgRklYTUUgRE9DCisgKiBAcGFyYW0JcF90aWxlX3kxIEZJWE1FIERPQworICogQHBhcmFtCXBfbmJfY29tcHMgRklYTUUgRE9DCisgKiBAcGFyYW0JcF9nb19vbiBGSVhNRSBET0MKKyAqIEBwYXJhbQlwX3N0cmVhbQkJCXRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KKyAqIEBwYXJhbQlwX21hbmFnZXIJdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyAqLworT1BKX0JPT0wgb3BqX2oya19yZWFkX3RpbGVfaGVhZGVyICggb3BqX2oya190ICogcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF90aWxlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90aWxlX3gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90aWxlX3kwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90aWxlX3gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90aWxlX3kxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfbmJfY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQk9PTCAqIHBfZ29fb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworCisvKioKKyAqIFNldHMgdGhlIGdpdmVuIGFyZWEgdG8gYmUgZGVjb2RlZC4gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHJpZ2h0IGFmdGVyIG9wal9yZWFkX2hlYWRlciBhbmQgYmVmb3JlIGFueSB0aWxlIGhlYWRlciByZWFkaW5nLgorICoKKyAqIEBwYXJhbQlwX2oyawkJCXRoZSBqcGVnMjAwMCBjb2RlYy4KKyAqIEBwYXJhbQlwX2ltYWdlICAgICBGSVhNRSBET0MKKyAqIEBwYXJhbQlwX3N0YXJ0X3gJCXRoZSBsZWZ0IHBvc2l0aW9uIG9mIHRoZSByZWN0YW5nbGUgdG8gZGVjb2RlIChpbiBpbWFnZSBjb29yZGluYXRlcykuCisgKiBAcGFyYW0JcF9zdGFydF95CQl0aGUgdXAgcG9zaXRpb24gb2YgdGhlIHJlY3RhbmdsZSB0byBkZWNvZGUgKGluIGltYWdlIGNvb3JkaW5hdGVzKS4KKyAqIEBwYXJhbQlwX2VuZF94CQkJdGhlIHJpZ2h0IHBvc2l0aW9uIG9mIHRoZSByZWN0YW5nbGUgdG8gZGVjb2RlIChpbiBpbWFnZSBjb29yZGluYXRlcykuCisgKiBAcGFyYW0JcF9lbmRfeQkJCXRoZSBib3R0b20gcG9zaXRpb24gb2YgdGhlIHJlY3RhbmdsZSB0byBkZWNvZGUgKGluIGltYWdlIGNvb3JkaW5hdGVzKS4KKyAqIEBwYXJhbQlwX21hbmFnZXIJCXRoZSB1c2VyIGV2ZW50IG1hbmFnZXIKKyAqCisgKiBAcmV0dXJuCXRydWUJCQlpZiB0aGUgYXJlYSBjb3VsZCBiZSBzZXQuCisgKi8KK09QSl9CT09MIG9wal9qMmtfc2V0X2RlY29kZV9hcmVhKAlvcGpfajJrX3QgKnBfajJrLAorCQkJCQkJCQkgICAgb3BqX2ltYWdlX3QqIHBfaW1hZ2UsCisJCQkJCQkJCSAgICBPUEpfSU5UMzIgcF9zdGFydF94LCBPUEpfSU5UMzIgcF9zdGFydF95LAorCQkJCQkJCQkgICAgT1BKX0lOVDMyIHBfZW5kX3gsIE9QSl9JTlQzMiBwX2VuZF95LAorCQkJCQkJCQkgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKy8qKgorICogQ3JlYXRlcyBhIEoySyBkZWNvbXByZXNzaW9uIHN0cnVjdHVyZS4KKyAqCisgKiBAcmV0dXJuIGEgaGFuZGxlIHRvIGEgSjJLIGRlY29tcHJlc3NvciBpZiBzdWNjZXNzZnVsLCBOVUxMIG90aGVyd2lzZS4KKyAqLworb3BqX2oya190KiBvcGpfajJrX2NyZWF0ZV9kZWNvbXByZXNzKHZvaWQpOworCisKKy8qKgorICogRHVtcCBzb21lIGVsZW1lbnRzIGZyb20gdGhlIEoySyBkZWNvbXByZXNzaW9uIHN0cnVjdHVyZSAuCisgKgorICpAcGFyYW0gcF9qMmsJCQkJdGhlIGpwZWcyMDAwIGNvZGVjLgorICpAcGFyYW0gZmxhZwkJCQlmbGFnIHRvIGRlc2NyaWJlIHdoYXQgZWxtZW50cyBhcmUgZHVtcC4KKyAqQHBhcmFtIG91dF9zdHJlYW0JCQlvdXRwdXQgc3RyZWFtIHdoZXJlIGR1bXAgdGhlIGVsZW1lbnRzLgorICoKKyovCit2b2lkIGoya19kdW1wIChvcGpfajJrX3QqIHBfajJrLCBPUEpfSU5UMzIgZmxhZywgRklMRSogb3V0X3N0cmVhbSk7CisKKworCisvKioKKyAqIER1bXAgYW4gaW1hZ2UgaGVhZGVyIHN0cnVjdHVyZS4KKyAqCisgKkBwYXJhbSBpbWFnZQkJCXRoZSBpbWFnZSBoZWFkZXIgdG8gZHVtcC4KKyAqQHBhcmFtIGRldl9kdW1wX2ZsYWcJCWZsYWcgdG8gZGVzY3JpYmUgaWYgd2UgYXJlIGluIHRoZSBjYXNlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdXNlIG91dHNpZGUgajJrX2R1bXAgZnVuY3Rpb24KKyAqQHBhcmFtIG91dF9zdHJlYW0JCQlvdXRwdXQgc3RyZWFtIHdoZXJlIGR1bXAgdGhlIGVsZW1lbnRzLgorICovCit2b2lkIGoya19kdW1wX2ltYWdlX2hlYWRlcihvcGpfaW1hZ2VfdCogaW1hZ2UsIE9QSl9CT09MIGRldl9kdW1wX2ZsYWcsIEZJTEUqIG91dF9zdHJlYW0pOworCisvKioKKyAqIER1bXAgYSBjb21wb25lbnQgaW1hZ2UgaGVhZGVyIHN0cnVjdHVyZS4KKyAqCisgKkBwYXJhbSBjb21wCQl0aGUgY29tcG9uZW50IGltYWdlIGhlYWRlciB0byBkdW1wLgorICpAcGFyYW0gZGV2X2R1bXBfZmxhZwkJZmxhZyB0byBkZXNjcmliZSBpZiB3ZSBhcmUgaW4gdGhlIGNhc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB1c2Ugb3V0c2lkZSBqMmtfZHVtcCBmdW5jdGlvbgorICpAcGFyYW0gb3V0X3N0cmVhbQkJCW91dHB1dCBzdHJlYW0gd2hlcmUgZHVtcCB0aGUgZWxlbWVudHMuCisgKi8KK3ZvaWQgajJrX2R1bXBfaW1hZ2VfY29tcF9oZWFkZXIob3BqX2ltYWdlX2NvbXBfdCogY29tcCwgT1BKX0JPT0wgZGV2X2R1bXBfZmxhZywgRklMRSogb3V0X3N0cmVhbSk7CisKKy8qKgorICogR2V0IHRoZSBjb2Rlc3RyZWFtIGluZm8gZnJvbSBhIEpQRUcyMDAwIGNvZGVjLgorICoKKyAqQHBhcmFtCXBfajJrCQkJCXRoZSBjb21wb25lbnQgaW1hZ2UgaGVhZGVyIHRvIGR1bXAuCisgKgorICpAcmV0dXJuCXRoZSBjb2Rlc3RyZWFtIGluZm9ybWF0aW9uIGV4dHJhY3QgZnJvbSB0aGUganBnMjAwMCBjb2RlYworICovCitvcGpfY29kZXN0cmVhbV9pbmZvX3YyX3QqIGoya19nZXRfY3N0cl9pbmZvKG9wal9qMmtfdCogcF9qMmspOworCisvKioKKyAqIEdldCB0aGUgY29kZXN0cmVhbSBpbmRleCBmcm9tIGEgSlBFRzIwMDAgY29kZWMuCisgKgorICpAcGFyYW0JcF9qMmsJCQkJdGhlIGNvbXBvbmVudCBpbWFnZSBoZWFkZXIgdG8gZHVtcC4KKyAqCisgKkByZXR1cm4JdGhlIGNvZGVzdHJlYW0gaW5kZXggZXh0cmFjdCBmcm9tIHRoZSBqcGcyMDAwIGNvZGVjCisgKi8KK29wal9jb2Rlc3RyZWFtX2luZGV4X3QqIGoya19nZXRfY3N0cl9pbmRleChvcGpfajJrX3QqIHBfajJrKTsKKworLyoqCisgKiBEZWNvZGUgYW4gaW1hZ2UgZnJvbSBhIEpQRUctMjAwMCBjb2Rlc3RyZWFtCisgKiBAcGFyYW0gajJrIEoySyBkZWNvbXByZXNzb3IgaGFuZGxlCisgKiBAcGFyYW0gcF9zdHJlYW0gIEZJWE1FIERPQworICogQHBhcmFtIHBfaW1hZ2UgICBGSVhNRSBET0MKKyAqIEBwYXJhbSBwX21hbmFnZXIgRklYTUUgRE9DCisgKiBAcmV0dXJuIEZJWE1FIERPQworKi8KK09QSl9CT09MIG9wal9qMmtfZGVjb2RlKG9wal9qMmtfdCAqajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKnBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcik7CisKKworT1BKX0JPT0wgb3BqX2oya19nZXRfdGlsZSgJb3BqX2oya190ICpwX2oyaywKKwkJCSAgICAJCQlvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisJCQkJICAgIAkJb3BqX2ltYWdlX3QqIHBfaW1hZ2UsCisJCQkJCSAgICAJb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyLAorCQkJCQkJICAgIE9QSl9VSU5UMzIgdGlsZV9pbmRleCApOworCitPUEpfQk9PTCBvcGpfajJrX3NldF9kZWNvZGVkX3Jlc29sdXRpb25fZmFjdG9yKG9wal9qMmtfdCAqcF9qMmssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHJlc19mYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CisKKworLyoqCisgKiBXcml0ZXMgYSB0aWxlLgorICogQHBhcmFtCXBfajJrCQl0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0gcF90aWxlX2luZGV4IEZJWE1FIERPQworICogQHBhcmFtIHBfZGF0YSBGSVhNRSBET0MKKyAqIEBwYXJhbSBwX2RhdGFfc2l6ZSBGSVhNRSBET0MKKyAqIEBwYXJhbQlwX3N0cmVhbQkJCXRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KKyAqIEBwYXJhbQlwX21hbmFnZXIJdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyAqLworT1BKX0JPT0wgb3BqX2oya193cml0ZV90aWxlICgJb3BqX2oya190ICogcF9qMmssCisJCQkJCQkJICAgIE9QSl9VSU5UMzIgcF90aWxlX2luZGV4LAorCQkJCQkJCSAgICBPUEpfQllURSAqIHBfZGF0YSwKKwkJCQkJCQkgICAgT1BKX1VJTlQzMiBwX2RhdGFfc2l6ZSwKKwkJCQkJCQkgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorCQkJCQkJCSAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworLyoqCisgKiBFbmNvZGVzIGFuIGltYWdlIGludG8gYSBKUEVHLTIwMDAgY29kZXN0cmVhbQorICovCitPUEpfQk9PTCBvcGpfajJrX2VuY29kZSgJb3BqX2oya190ICogcF9qMmssCisJCQkgICAgCQkJb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKKwkJCQkgICAgCQlvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworLyoqCisgKiBTdGFydHMgYSBjb21wcmVzc2lvbiBzY2hlbWUsIGkuZS4gdmFsaWRhdGVzIHRoZSBjb2RlYyBwYXJhbWV0ZXJzLCB3cml0ZXMgdGhlIGhlYWRlci4KKyAqCisgKiBAcGFyYW0JcF9qMmsJCXRoZSBqcGVnMjAwMCBjb2RlYy4KKyAqIEBwYXJhbQlwX3N0cmVhbQkJCXRoZSBzdHJlYW0gb2JqZWN0LgorICogQHBhcmFtCXBfaW1hZ2UgRklYTUUgRE9DCisgKiBAcGFyYW0JcF9tYW5hZ2VyCXRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisgKgorICogQHJldHVybiB0cnVlIGlmIHRoZSBjb2RlYyBpcyB2YWxpZC4KKyAqLworT1BKX0JPT0wgb3BqX2oya19zdGFydF9jb21wcmVzcyhvcGpfajJrX3QgKnBfajJrLAorCQkJCQkJCSAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisJCQkJCQkJICAgIG9wal9pbWFnZV90ICogcF9pbWFnZSwKKwkJCQkJCQkgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKKworLyoqCisgKiBFbmRzIHRoZSBjb21wcmVzc2lvbiBwcm9jZWR1cmVzIGFuZCBwb3NzaWJpbGl5IGFkZCBkYXRhIHRvIGJlIHJlYWQgYWZ0ZXIgdGhlCisgKiBjb2Rlc3RyZWFtLgorICovCitPUEpfQk9PTCBvcGpfajJrX2VuZF9jb21wcmVzcyggCW9wal9qMmtfdCAqcF9qMmssCisJCQkJCQkJICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCisJCQkJCQkJICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CisKK09QSl9CT09MIG9wal9qMmtfc2V0dXBfbWN0X2VuY29kaW5nIChvcGpfdGNwX3QgKiBwX3RjcCwgb3BqX2ltYWdlX3QgKiBwX2ltYWdlKTsKKworCisjZW5kaWYgLyogX19KMktfSCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvanAyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JjYjQyZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvanAyLmMKQEAgLTAsMCArMSwzMTYyIEBACisvKgorICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCisgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFVuaXZlcnNpdGUgY2F0aG9saXF1ZSBkZSBMb3V2YWluIChVQ0wpLCBCZWxnaXVtCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQorICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgS2FvcmkgSGFnaWhhcmEKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMS0yMDEyLCBDZW50cmUgTmF0aW9uYWwgZCdFdHVkZXMgU3BhdGlhbGVzIChDTkVTKSwgRlIgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENTIFN5c3RlbWVzIGQnSW5mb3JtYXRpb24sIEZyYW5jZQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2luY2x1ZGUgIm9wal9pbmNsdWRlcy5oIgorCisvKiogQGRlZmdyb3VwIEpQMiBKUDIgLSBKUEVHLTIwMDAgZmlsZSBmb3JtYXQgcmVhZGVyL3dyaXRlciAqLworLypAeyovCisKKyNkZWZpbmUgT1BKX0JPWF9TSVpFCTEwMjQKKworLyoqIEBuYW1lIExvY2FsIHN0YXRpYyBmdW5jdGlvbnMgKi8KKy8qQHsqLworCisvKnN0YXRpYyB2b2lkIGpwMl93cml0ZV91cmwob3BqX2Npb190ICpjaW8sIGNoYXIgKklkeF9maWxlKTsqLworCisvKioKKyAqIFJlYWRzIGEgSUhEUiBib3ggLSBJbWFnZSBIZWFkZXIgYm94CisgKgorICogQHBhcmFtCXBfaW1hZ2VfaGVhZGVyX2RhdGEJCQlwb2ludGVyIHRvIGFjdHVhbCBkYXRhIChhbHJlYWR5IHJlYWQgZnJvbSBmaWxlKQorICogQHBhcmFtCWpwMgkJCQkJCQl0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KKyAqIEBwYXJhbQlwX2ltYWdlX2hlYWRlcl9zaXplCQkJdGhlIHNpemUgb2YgdGhlIGltYWdlIGhlYWRlcgorICogQHBhcmFtCXBfbWFuYWdlcgkJCQkJdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyAqCisgKiBAcmV0dXJuCXRydWUgaWYgdGhlIGltYWdlIGhlYWRlciBpcyB2YWxpZCwgZmFsc2UgZWxzZS4KKyAqLworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfcmVhZF9paGRyKCAgb3BqX2pwMl90ICpqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqcF9pbWFnZV9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9pbWFnZV9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworCisvKioKKyAqIFdyaXRlcyB0aGUgSW1hZ2UgSGVhZGVyIGJveCAtIEltYWdlIEhlYWRlciBib3guCisgKgorICogQHBhcmFtIGpwMgkJCQkJanBlZzIwMDAgZmlsZSBjb2RlYy4KKyAqIEBwYXJhbSBwX25iX2J5dGVzX3dyaXR0ZW4JcG9pbnRlciB0byBzdG9yZSB0aGUgbmIgb2YgYnl0ZXMgd3JpdHRlbiBieSB0aGUgZnVuY3Rpb24uCisgKgorICogQHJldHVybgl0aGUgZGF0YSBiZWluZyBjb3BpZWQuCisqLworc3RhdGljIE9QSl9CWVRFICogb3BqX2pwMl93cml0ZV9paGRyKG9wal9qcDJfdCAqanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX25iX2J5dGVzX3dyaXR0ZW4gKTsKKworLyoqCisgKiBXcml0ZXMgdGhlIEJpdCBwZXIgQ29tcG9uZW50IGJveC4KKyAqCisgKiBAcGFyYW0JanAyCQkJCQkJanBlZzIwMDAgZmlsZSBjb2RlYy4KKyAqIEBwYXJhbQlwX25iX2J5dGVzX3dyaXR0ZW4JCXBvaW50ZXIgdG8gc3RvcmUgdGhlIG5iIG9mIGJ5dGVzIHdyaXR0ZW4gYnkgdGhlIGZ1bmN0aW9uLgorICoKKyAqIEByZXR1cm4JdGhlIGRhdGEgYmVpbmcgY29waWVkLgorKi8KK3N0YXRpYyBPUEpfQllURSAqIG9wal9qcDJfd3JpdGVfYnBjYygJb3BqX2pwMl90ICpqcDIsCisJCQkJCQkJCSAgICAgICAgT1BKX1VJTlQzMiAqIHBfbmJfYnl0ZXNfd3JpdHRlbiApOworCisvKioKKyAqIFJlYWRzIGEgQml0IHBlciBDb21wb25lbnQgYm94LgorICoKKyAqIEBwYXJhbQlwX2JwY19oZWFkZXJfZGF0YQkJCXBvaW50ZXIgdG8gYWN0dWFsIGRhdGEgKGFscmVhZHkgcmVhZCBmcm9tIGZpbGUpCisgKiBAcGFyYW0JanAyCQkJCQkJCXRoZSBqcGVnMjAwMCBmaWxlIGNvZGVjLgorICogQHBhcmFtCXBfYnBjX2hlYWRlcl9zaXplCQkJdGhlIHNpemUgb2YgdGhlIGJwYyBoZWFkZXIKKyAqIEBwYXJhbQlwX21hbmFnZXIJCQkJCXRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisgKgorICogQHJldHVybgl0cnVlIGlmIHRoZSBicGMgaGVhZGVyIGlzIHZhbGlkLCBmYWxlIGVsc2UuCisgKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfYnBjYyggIG9wal9qcDJfdCAqanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2JwY19oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9icGNfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfcmVhZF9jZGVmKAlvcGpfanAyX3QgKiBqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfY2RlZl9oZWFkZXJfZGF0YSwKKwkJCQkJCQkJCU9QSl9VSU5UMzIgcF9jZGVmX2hlYWRlcl9zaXplLAorCQkJCQkJCQkJb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKK3N0YXRpYyB2b2lkIG9wal9qcDJfYXBwbHlfY2RlZihvcGpfaW1hZ2VfdCAqaW1hZ2UsIG9wal9qcDJfY29sb3JfdCAqY29sb3IsIG9wal9ldmVudF9tZ3JfdCAqKTsKKworLyoqCisgKiBXcml0ZXMgdGhlIENoYW5uZWwgRGVmaW5pdGlvbiBib3guCisgKgorICogQHBhcmFtIGpwMgkJCQkJanBlZzIwMDAgZmlsZSBjb2RlYy4KKyAqIEBwYXJhbSBwX25iX2J5dGVzX3dyaXR0ZW4JcG9pbnRlciB0byBzdG9yZSB0aGUgbmIgb2YgYnl0ZXMgd3JpdHRlbiBieSB0aGUgZnVuY3Rpb24uCisgKgorICogQHJldHVybgl0aGUgZGF0YSBiZWluZyBjb3BpZWQuCisgKi8KK3N0YXRpYyBPUEpfQllURSAqIG9wal9qcDJfd3JpdGVfY2RlZiggICBvcGpfanAyX3QgKmpwMiwKKwkJCQkJCQkJCQkJCQkJCQkJCSBPUEpfVUlOVDMyICogcF9uYl9ieXRlc193cml0dGVuICk7CisKKy8qKgorICogV3JpdGVzIHRoZSBDb2xvdXIgU3BlY2lmaWNhdGlvbiBib3guCisgKgorICogQHBhcmFtIGpwMgkJCQkJanBlZzIwMDAgZmlsZSBjb2RlYy4KKyAqIEBwYXJhbSBwX25iX2J5dGVzX3dyaXR0ZW4JcG9pbnRlciB0byBzdG9yZSB0aGUgbmIgb2YgYnl0ZXMgd3JpdHRlbiBieSB0aGUgZnVuY3Rpb24uCisgKgorICogQHJldHVybgl0aGUgZGF0YSBiZWluZyBjb3BpZWQuCisqLworc3RhdGljIE9QSl9CWVRFICogb3BqX2pwMl93cml0ZV9jb2xyKCAgIG9wal9qcDJfdCAqanAyLAorCQkJCQkJCQkJICAgIE9QSl9VSU5UMzIgKiBwX25iX2J5dGVzX3dyaXR0ZW4gKTsKKworLyoqCisgKiBXcml0ZXMgYSBGVFlQIGJveCAtIEZpbGUgdHlwZSBib3gKKyAqCisgKiBAcGFyYW0JY2lvCQkJdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgorICogQHBhcmFtCWpwMgkJCXRoZSBqcGVnMjAwMCBmaWxlIGNvZGVjLgorICogQHBhcmFtCXBfbWFuYWdlcgl0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorICoKKyAqIEByZXR1cm4JdHJ1ZSBpZiB3cml0aW5nIHdhcyBzdWNjZXNzZnVsLgorICovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl93cml0ZV9mdHlwKAlvcGpfanAyX3QgKmpwMiwKKwkJCQkJCQkJCW9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCisJCQkJCQkJCQlvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworLyoqCisgKiBSZWFkcyBhIGEgRlRZUCBib3ggLSBGaWxlIHR5cGUgYm94CisgKgorICogQHBhcmFtCXBfaGVhZGVyX2RhdGEJdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBGVFlQIGJveC4KKyAqIEBwYXJhbQlqcDIJCQkJdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCisgKiBAcGFyYW0JcF9oZWFkZXJfc2l6ZQl0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIEZUWVAgYm94LgorICogQHBhcmFtCXBfbWFuYWdlcgkJdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIEZUWVAgYm94IGlzIHZhbGlkLgorICovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2Z0eXAoCW9wal9qcDJfdCAqanAyLAorCQkJCQkJCQkJT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorCQkJCQkJCQkJT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorCQkJCQkJCQkJb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3NraXBfanAyYygJb3BqX2pwMl90ICpqcDIsCisJCQkJCQkgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKKwkJCQkJCSAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworLyoqCisgKiBSZWFkcyB0aGUgSnBlZzIwMDAgZmlsZSBIZWFkZXIgYm94IC0gSlAyIEhlYWRlciBib3ggKHdhcm5pbmcsIHRoaXMgaXMgYSBzdXBlciBib3gpLgorICoKKyAqIEBwYXJhbQlwX2hlYWRlcl9kYXRhCXRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSBoZWFkZXIgYm94LgorICogQHBhcmFtCWpwMgkJCQl0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KKyAqIEBwYXJhbQlwX2hlYWRlcl9zaXplCXRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSBoZWFkZXIgYm94LgorICogQHBhcmFtCXBfbWFuYWdlcgkJdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIEpQMiBIZWFkZXIgYm94IHdhcyBzdWNjZXNzZnVsbHkgcmVjb2duaXplZC4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2pwMmgoICBvcGpfanAyX3QgKmpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKy8qKgorICogV3JpdGVzIHRoZSBKcGVnMjAwMCBmaWxlIEhlYWRlciBib3ggLSBKUDIgSGVhZGVyIGJveCAod2FybmluZywgdGhpcyBpcyBhIHN1cGVyIGJveCkuCisgKgorICogQHBhcmFtICBqcDIgICAgICB0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KKyAqIEBwYXJhbSAgc3RyZWFtICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgorICogQHBhcmFtICBwX21hbmFnZXIgIHVzZXIgZXZlbnQgbWFuYWdlci4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgd3JpdGluZyB3YXMgc3VjY2Vzc2Z1bC4KKyAqLworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfd3JpdGVfanAyaChvcGpfanAyX3QgKmpwMiwKKwkJCQkJCQkJCQkJCQkJb3BqX3N0cmVhbV9wcml2YXRlX3QgKnN0cmVhbSwKKwkJCQkJCQkJCQkJCQkJb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKy8qKgorICogV3JpdGVzIHRoZSBKcGVnMjAwMCBjb2Rlc3RyZWFtIEhlYWRlciBib3ggLSBKUDJDIEhlYWRlciBib3guIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgQUZURVIgdGhlIGNvZGluZyBoYXMgYmVlbiBkb25lLgorICoKKyAqIEBwYXJhbQljaW8JCQl0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCisgKiBAcGFyYW0JanAyCQkJdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCisgKiBAcGFyYW0JcF9tYW5hZ2VyCXVzZXIgZXZlbnQgbWFuYWdlci4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgd3JpdGluZyB3YXMgc3VjY2Vzc2Z1bC4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl93cml0ZV9qcDJjKAlvcGpfanAyX3QgKmpwMiwKKwkJCQkJCQkJICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCisJCQkJCQkJCSAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworI2lmZGVmIFVTRV9KUElQCisvKioKKyAqIFdyaXRlIGluZGV4IEZpbmRlciBib3gKKyAqIEBwYXJhbSBjaW8gICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgdG8uCisgKiBAcGFyYW0JanAyCQkJdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCisgKiBAcGFyYW0JcF9tYW5hZ2VyCXVzZXIgZXZlbnQgbWFuYWdlci4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwaXBfd3JpdGVfaXB0cigJb3BqX2pwMl90ICpqcDIsCisJCQkJCQkJCSAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAorCQkJCQkJCQkgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKy8qKgorICogV3JpdGUgaW5kZXggRmluZGVyIGJveAorICogQHBhcmFtIGNpbyAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSB0by4KKyAqIEBwYXJhbQlqcDIJCQl0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KKyAqIEBwYXJhbQlwX21hbmFnZXIJdXNlciBldmVudCBtYW5hZ2VyLgorICovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwaXBfd3JpdGVfY2lkeChvcGpfanAyX3QgKmpwMiwKKyAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKKyAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKy8qKgorICogV3JpdGUgZmlsZSBJbmRleCAoc3VwZXJib3gpCisgKiBAcGFyYW0gY2lvICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIHRvLgorICogQHBhcmFtCWpwMgkJCXRoZSBqcGVnMjAwMCBmaWxlIGNvZGVjLgorICogQHBhcmFtCXBfbWFuYWdlcgl1c2VyIGV2ZW50IG1hbmFnZXIuCisgKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfanBpcF93cml0ZV9maWR4KG9wal9qcDJfdCAqanAyLAorICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAorICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKyNlbmRpZiAvKiBVU0VfSlBJUCAqLworCisvKioKKyAqIFJlYWRzIGEganBlZzIwMDAgZmlsZSBzaWduYXR1cmUgYm94LgorICoKKyAqIEBwYXJhbQlwX2hlYWRlcl9kYXRhCXRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgc2lnbmF0dXJlIGJveC4KKyAqIEBwYXJhbQlqcDIJCQkJdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCisgKiBAcGFyYW0JcF9oZWFkZXJfc2l6ZQl0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIHNpZ25hdHVyZSBib3guCisgKiBAcGFyYW0JcF9tYW5hZ2VyCQl0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorICoKKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSBzaWduYXR1cmUgYm94IGlzIHZhbGlkLgorICovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2pwKG9wal9qcDJfdCAqanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKKworLyoqCisgKiBXcml0ZXMgYSBqcGVnMjAwMCBmaWxlIHNpZ25hdHVyZSBib3guCisgKgorICogQHBhcmFtIGNpbyB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCisgKiBAcGFyYW0JanAyCQkJdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCisgKiBAcGFyYW0gcF9tYW5hZ2VyIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisgKgorICogQHJldHVybiB0cnVlIGlmIHdyaXRpbmcgd2FzIHN1Y2Nlc3NmdWwuCisgKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3dyaXRlX2pwKAlvcGpfanAyX3QgKmpwMiwKKwkJCSAgICAJICAgICAgICAJICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCisJCQkJICAgICAgICAgICAgCQlvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworLyoqCitBcHBseSBjb2xsZWN0ZWQgcGFsZXR0ZSBkYXRhCitAcGFyYW0gY29sb3IgQ29sbGVjdG9yIGZvciBwcm9maWxlLCBjZGVmIGFuZCBwY2xyIGRhdGEKK0BwYXJhbSBpbWFnZQorKi8KK3N0YXRpYyB2b2lkIG9wal9qcDJfYXBwbHlfcGNscihvcGpfaW1hZ2VfdCAqaW1hZ2UsIG9wal9qcDJfY29sb3JfdCAqY29sb3IpOworCitzdGF0aWMgdm9pZCBvcGpfanAyX2ZyZWVfcGNscihvcGpfanAyX2NvbG9yX3QgKmNvbG9yKTsKKworLyoqCisgKiBDb2xsZWN0IHBhbGV0dGUgZGF0YQorICoKKyAqIEBwYXJhbSBqcDIgSlAyIGhhbmRsZQorICogQHBhcmFtIHBfcGNscl9oZWFkZXJfZGF0YSAgICBGSVhNRSBET0MKKyAqIEBwYXJhbSBwX3BjbHJfaGVhZGVyX3NpemUgICAgRklYTUUgRE9DCisgKiBAcGFyYW0gcF9tYW5hZ2VyCisgKgorICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBmYWxzZSBvdGhlcndpc2UKKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX3BjbHIoCW9wal9qcDJfdCAqanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX3BjbHJfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfcGNscl9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworCisvKioKKyAqIENvbGxlY3QgY29tcG9uZW50IG1hcHBpbmcgZGF0YQorICoKKyAqIEBwYXJhbSBqcDIgICAgICAgICAgICAgICAgIEpQMiBoYW5kbGUKKyAqIEBwYXJhbSBwX2NtYXBfaGVhZGVyX2RhdGEgIEZJWE1FIERPQworICogQHBhcmFtIHBfY21hcF9oZWFkZXJfc2l6ZSAgRklYTUUgRE9DCisgKiBAcGFyYW0gcF9tYW5hZ2VyICAgICAgICAgICBGSVhNRSBET0MKKyAqCisgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIGZhbHNlIG90aGVyd2lzZQorKi8KKworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfcmVhZF9jbWFwKAlvcGpfanAyX3QgKiBqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfY21hcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jbWFwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKy8qKgorICogUmVhZHMgdGhlIENvbG9yIFNwZWNpZmljYXRpb24gYm94LgorICoKKyAqIEBwYXJhbQlwX2NvbHJfaGVhZGVyX2RhdGEJCQlwb2ludGVyIHRvIGFjdHVhbCBkYXRhIChhbHJlYWR5IHJlYWQgZnJvbSBmaWxlKQorICogQHBhcmFtCWpwMgkJCQkJCQl0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KKyAqIEBwYXJhbQlwX2NvbHJfaGVhZGVyX3NpemUJCQl0aGUgc2l6ZSBvZiB0aGUgY29sb3IgaGVhZGVyCisgKiBAcGFyYW0JcF9tYW5hZ2VyCQkJCQl0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorICoKKyAqIEByZXR1cm4JdHJ1ZSBpZiB0aGUgYnBjIGhlYWRlciBpcyB2YWxpZCwgZmFsZSBlbHNlLgorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfY29sciggIG9wal9qcDJfdCAqanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2NvbHJfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29scl9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworCisvKkB9Ki8KKworLypAfSovCisKKy8qKgorICogU2V0cyB1cCB0aGUgcHJvY2VkdXJlcyB0byBkbyBvbiB3cml0aW5nIGhlYWRlciBhZnRlciB0aGUgY29kZXN0cmVhbS4KKyAqIERldmVsb3BwZXJzIHdhbnRpbmcgdG8gZXh0ZW5kIHRoZSBsaWJyYXJ5IGNhbiBhZGQgdGhlaXIgb3duIHdyaXRpbmcgcHJvY2VkdXJlcy4KKyAqLworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfc2V0dXBfZW5kX2hlYWRlcl93cml0aW5nIChvcGpfanAyX3QgKmpwMiwgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKKworLyoqCisgKiBTZXRzIHVwIHRoZSBwcm9jZWR1cmVzIHRvIGRvIG9uIHJlYWRpbmcgaGVhZGVyIGFmdGVyIHRoZSBjb2Rlc3RyZWFtLgorICogRGV2ZWxvcHBlcnMgd2FudGluZyB0byBleHRlbmQgdGhlIGxpYnJhcnkgY2FuIGFkZCB0aGVpciBvd24gd3JpdGluZyBwcm9jZWR1cmVzLgorICovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9zZXR1cF9lbmRfaGVhZGVyX3JlYWRpbmcgKG9wal9qcDJfdCAqanAyLCBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOworCisvKioKKyAqIFJlYWRzIGEganBlZzIwMDAgZmlsZSBoZWFkZXIgc3RydWN0dXJlLgorICoKKyAqIEBwYXJhbSBqcDIgdGhlIGpwZWcyMDAwIGZpbGUgaGVhZGVyIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSBzdHJlYW0gdGhlIHN0cmVhbSB0byByZWFkIGRhdGEgZnJvbS4KKyAqIEBwYXJhbSBwX21hbmFnZXIgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGJveCBpcyB2YWxpZC4KKyAqLworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfcmVhZF9oZWFkZXJfcHJvY2VkdXJlKCAgb3BqX2pwMl90ICpqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKy8qKgorICogRXhjdXRlcyB0aGUgZ2l2ZW4gcHJvY2VkdXJlcyBvbiB0aGUgZ2l2ZW4gY29kZWMuCisgKgorICogQHBhcmFtCXBfcHJvY2VkdXJlX2xpc3QJdGhlIGxpc3Qgb2YgcHJvY2VkdXJlcyB0byBleGVjdXRlCisgKiBAcGFyYW0JanAyCQkJCQl0aGUganBlZzIwMDAgZmlsZSBjb2RlYyB0byBleGVjdXRlIHRoZSBwcm9jZWR1cmVzIG9uLgorICogQHBhcmFtCXN0cmVhbQkJCQkJdGhlIHN0cmVhbSB0byBleGVjdXRlIHRoZSBwcm9jZWR1cmVzIG9uLgorICogQHBhcmFtCXBfbWFuYWdlcgkJCXRoZSB1c2VyIG1hbmFnZXIuCisgKgorICogQHJldHVybgl0cnVlCQkJCWlmIGFsbCB0aGUgcHJvY2VkdXJlcyB3ZXJlIHN1Y2Nlc3NmdWxseSBleGVjdXRlZC4KKyAqLworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfZXhlYyAoICBvcGpfanAyX3QgKiBqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9wcm9jZWR1cmVfbGlzdF90ICogcF9wcm9jZWR1cmVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKy8qKgorICogUmVhZHMgYSBib3ggaGVhZGVyLiBUaGUgYm94IGlzIHRoZSB3YXkgZGF0YSBpcyBwYWNrZWQgaW5zaWRlIGEganBlZzIwMDAgZmlsZSBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtCWNpbwkJCQkJCXRoZSBpbnB1dCBzdHJlYW0gdG8gcmVhZCBkYXRhIGZyb20uCisgKiBAcGFyYW0JYm94CQkJCQkJdGhlIGJveCBzdHJ1Y3R1cmUgdG8gZmlsbC4KKyAqIEBwYXJhbQlwX251bWJlcl9ieXRlc19yZWFkCQlwb2ludGVyIHRvIGFuIGludCB0aGF0IHdpbGwgc3RvcmUgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gdGhlIHN0cmVhbSAoc2hvdWwgdXN1YWxseSBiZSAyKS4KKyAqIEBwYXJhbQlwX21hbmFnZXIJCQkJdXNlciBldmVudCBtYW5hZ2VyLgorICoKKyAqIEByZXR1cm4JdHJ1ZSBpZiB0aGUgYm94IGlzIHJlY29nbml6ZWQsIGZhbHNlIG90aGVyd2lzZQorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfYm94aGRyKG9wal9qcDJfYm94X3QgKmJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX251bWJlcl9ieXRlc19yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CisKKy8qKgorICogU2V0cyB1cCB0aGUgdmFsaWRhdGlvbiAsaS5lLiBhZGRzIHRoZSBwcm9jZWR1cmVzIHRvIGxhdWNoIHRvIG1ha2Ugc3VyZSB0aGUgY29kZWMgcGFyYW1ldGVycworICogYXJlIHZhbGlkLiBEZXZlbG9wcGVycyB3YW50aW5nIHRvIGV4dGVuZCB0aGUgbGlicmFyeSBjYW4gYWRkIHRoZWlyIG93biB2YWxpZGF0aW9uIHByb2NlZHVyZXMuCisgKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3NldHVwX2VuY29kaW5nX3ZhbGlkYXRpb24gKG9wal9qcDJfdCAqanAyLCBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOworCisvKioKKyAqIFNldHMgdXAgdGhlIHByb2NlZHVyZXMgdG8gZG8gb24gd3JpdGluZyBoZWFkZXIuIERldmVsb3BwZXJzIHdhbnRpbmcgdG8gZXh0ZW5kIHRoZSBsaWJyYXJ5IGNhbiBhZGQgdGhlaXIgb3duIHdyaXRpbmcgcHJvY2VkdXJlcy4KKyAqLworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfc2V0dXBfaGVhZGVyX3dyaXRpbmcgKG9wal9qcDJfdCAqanAyLCBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOworCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9kZWZhdWx0X3ZhbGlkYXRpb24gKAlvcGpfanAyX3QgKiBqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworLyoqCisgKiBGaW5kcyB0aGUgaW1hZ2UgZXhlY3V0aW9uIGZ1bmN0aW9uIHJlbGF0ZWQgdG8gdGhlIGdpdmVuIGJveCBpZC4KKyAqCisgKiBAcGFyYW0JcF9pZAl0aGUgaWQgb2YgdGhlIGhhbmRsZXIgdG8gZmV0Y2guCisgKgorICogQHJldHVybgl0aGUgZ2l2ZW4gaGFuZGxlciBvciBOVUxMIGlmIGl0IGNvdWxkIG5vdCBiZSBmb3VuZC4KKyAqLworc3RhdGljIGNvbnN0IG9wal9qcDJfaGVhZGVyX2hhbmRsZXJfdCAqIG9wal9qcDJfaW1nX2ZpbmRfaGFuZGxlciAoT1BKX1VJTlQzMiBwX2lkKTsKKworLyoqCisgKiBGaW5kcyB0aGUgZXhlY3V0aW9uIGZ1bmN0aW9uIHJlbGF0ZWQgdG8gdGhlIGdpdmVuIGJveCBpZC4KKyAqCisgKiBAcGFyYW0JcF9pZAl0aGUgaWQgb2YgdGhlIGhhbmRsZXIgdG8gZmV0Y2guCisgKgorICogQHJldHVybgl0aGUgZ2l2ZW4gaGFuZGxlciBvciBOVUxMIGlmIGl0IGNvdWxkIG5vdCBiZSBmb3VuZC4KKyAqLworc3RhdGljIGNvbnN0IG9wal9qcDJfaGVhZGVyX2hhbmRsZXJfdCAqIG9wal9qcDJfZmluZF9oYW5kbGVyIChPUEpfVUlOVDMyIHBfaWQgKTsKKworc3RhdGljIGNvbnN0IG9wal9qcDJfaGVhZGVyX2hhbmRsZXJfdCBqcDJfaGVhZGVyIFtdID0KK3sKKwl7SlAyX0pQLG9wal9qcDJfcmVhZF9qcH0sCisJe0pQMl9GVFlQLG9wal9qcDJfcmVhZF9mdHlwfSwKKwl7SlAyX0pQMkgsb3BqX2pwMl9yZWFkX2pwMmh9Cit9OworCitzdGF0aWMgY29uc3Qgb3BqX2pwMl9oZWFkZXJfaGFuZGxlcl90IGpwMl9pbWdfaGVhZGVyIFtdID0KK3sKKwl7SlAyX0lIRFIsb3BqX2pwMl9yZWFkX2loZHJ9LAorCXtKUDJfQ09MUixvcGpfanAyX3JlYWRfY29scn0sCisJe0pQMl9CUENDLG9wal9qcDJfcmVhZF9icGNjfSwKKwl7SlAyX1BDTFIsb3BqX2pwMl9yZWFkX3BjbHJ9LAorCXtKUDJfQ01BUCxvcGpfanAyX3JlYWRfY21hcH0sCisJe0pQMl9DREVGLG9wal9qcDJfcmVhZF9jZGVmfQorCit9OworCisvKioKKyAqIFJlYWRzIGEgYm94IGhlYWRlci4gVGhlIGJveCBpcyB0aGUgd2F5IGRhdGEgaXMgcGFja2VkIGluc2lkZSBhIGpwZWcyMDAwIGZpbGUgc3RydWN0dXJlLiBEYXRhIGlzIHJlYWQgZnJvbSBhIGNoYXJhY3RlciBzdHJpbmcKKyAqCisgKiBAcGFyYW0JYm94CQkJCQkJdGhlIGJveCBzdHJ1Y3R1cmUgdG8gZmlsbC4KKyAqIEBwYXJhbQlwX2RhdGEJCQkJCXRoZSBjaGFyYWN0ZXIgc3RyaW5nIHRvIHJlYWQgZGF0YSBmcm9tLgorICogQHBhcmFtCXBfbnVtYmVyX2J5dGVzX3JlYWQJCXBvaW50ZXIgdG8gYW4gaW50IHRoYXQgd2lsbCBzdG9yZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSB0aGUgc3RyZWFtIChzaG91bCB1c3VhbGx5IGJlIDIpLgorICogQHBhcmFtCXBfYm94X21heF9zaXplCQkJdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBib3guCisgKiBAcGFyYW0JcF9tYW5hZ2VyICAgICAgICAgRklYTUUgRE9DCisgKgorICogQHJldHVybgl0cnVlIGlmIHRoZSBib3ggaXMgcmVjb2duaXplZCwgZmFsc2Ugb3RoZXJ3aXNlCisqLworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfcmVhZF9ib3hoZHJfY2hhciggICBvcGpfanAyX2JveF90ICpib3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9udW1iZXJfYnl0ZXNfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2JveF9tYXhfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKy8qKgorICogU2V0cyB1cCB0aGUgdmFsaWRhdGlvbiAsaS5lLiBhZGRzIHRoZSBwcm9jZWR1cmVzIHRvIGxhdWNoIHRvIG1ha2Ugc3VyZSB0aGUgY29kZWMgcGFyYW1ldGVycworICogYXJlIHZhbGlkLiBEZXZlbG9wcGVycyB3YW50aW5nIHRvIGV4dGVuZCB0aGUgbGlicmFyeSBjYW4gYWRkIHRoZWlyIG93biB2YWxpZGF0aW9uIHByb2NlZHVyZXMuCisgKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3NldHVwX2RlY29kaW5nX3ZhbGlkYXRpb24gKG9wal9qcDJfdCAqanAyLCBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOworCisvKioKKyAqIFNldHMgdXAgdGhlIHByb2NlZHVyZXMgdG8gZG8gb24gcmVhZGluZyBoZWFkZXIuCisgKiBEZXZlbG9wcGVycyB3YW50aW5nIHRvIGV4dGVuZCB0aGUgbGlicmFyeSBjYW4gYWRkIHRoZWlyIG93biB3cml0aW5nIHByb2NlZHVyZXMuCisgKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3NldHVwX2hlYWRlcl9yZWFkaW5nIChvcGpfanAyX3QgKmpwMiwgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfYm94aGRyKG9wal9qcDJfYm94X3QgKmJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX251bWJlcl9ieXRlc19yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCit7CisJLyogcmVhZCBoZWFkZXIgZnJvbSBmaWxlICovCisJT1BKX0JZVEUgbF9kYXRhX2hlYWRlciBbOF07CisKKwkvKiBwcmVjb25kaXRpb25zICovCisJYXNzZXJ0KGNpbyAhPSAwMCk7CisJYXNzZXJ0KGJveCAhPSAwMCk7CisJYXNzZXJ0KHBfbnVtYmVyX2J5dGVzX3JlYWQgIT0gMDApOworCWFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisJKnBfbnVtYmVyX2J5dGVzX3JlYWQgPSAoT1BKX1VJTlQzMilvcGpfc3RyZWFtX3JlYWRfZGF0YShjaW8sbF9kYXRhX2hlYWRlciw4LHBfbWFuYWdlcik7CisJaWYgKCpwX251bWJlcl9ieXRlc19yZWFkICE9IDgpIHsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisKKwkvKiBwcm9jZXNzIHJlYWQgZGF0YSAqLworCW9wal9yZWFkX2J5dGVzKGxfZGF0YV9oZWFkZXIsJihib3gtPmxlbmd0aCksIDQpOworCW9wal9yZWFkX2J5dGVzKGxfZGF0YV9oZWFkZXIrNCwmKGJveC0+dHlwZSksIDQpOworICAgIAorICBpZihib3gtPmxlbmd0aCA9PSAwKS8qIGxhc3QgYm94ICovCisgICAgeworICAgIGNvbnN0IE9QSl9PRkZfVCBibGVmdCA9IG9wal9zdHJlYW1fZ2V0X251bWJlcl9ieXRlX2xlZnQoY2lvKTsKKyAgICBib3gtPmxlbmd0aCA9IChPUEpfVUlOVDMyKWJsZWZ0OworICAgIGFzc2VydCggKE9QSl9PRkZfVClib3gtPmxlbmd0aCA9PSBibGVmdCApOworICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICB9CisKKwkvKiBkbyB3ZSBoYXZlIGEgInNwZWNpYWwgdmVyeSBsYXJnZSBib3ggPyIgKi8KKwkvKiByZWFkIHRoZW4gdGhlIFhMQm94ICovCisJaWYgKGJveC0+bGVuZ3RoID09IDEpIHsKKwkJT1BKX1VJTlQzMiBsX3hsX3BhcnRfc2l6ZTsKKworCQlPUEpfVUlOVDMyIGxfbmJfYnl0ZXNfcmVhZCA9IChPUEpfVUlOVDMyKW9wal9zdHJlYW1fcmVhZF9kYXRhKGNpbyxsX2RhdGFfaGVhZGVyLDgscF9tYW5hZ2VyKTsKKwkJaWYgKGxfbmJfYnl0ZXNfcmVhZCAhPSA4KSB7CisJCQlpZiAobF9uYl9ieXRlc19yZWFkID4gMCkgeworCQkJCSpwX251bWJlcl9ieXRlc19yZWFkICs9IGxfbmJfYnl0ZXNfcmVhZDsKKwkJCX0KKworCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJfQorCisgICAgICAgICpwX251bWJlcl9ieXRlc19yZWFkID0gMTY7CisJCW9wal9yZWFkX2J5dGVzKGxfZGF0YV9oZWFkZXIsJmxfeGxfcGFydF9zaXplLCA0KTsKKwkJaWYgKGxfeGxfcGFydF9zaXplICE9IDApIHsKKwkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJDYW5ub3QgaGFuZGxlIGJveCBzaXplcyBoaWdoZXIgdGhhbiAyXjMyXG4iKTsKKwkJCXJldHVybiBPUEpfRkFMU0U7CisJCX0KKwkJb3BqX3JlYWRfYnl0ZXMobF9kYXRhX2hlYWRlcis0LCYoYm94LT5sZW5ndGgpLCA0KTsKKwl9CisgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCisjaWYgMAorc3RhdGljIHZvaWQganAyX3dyaXRlX3VybChvcGpfY2lvX3QgKmNpbywgY2hhciAqSWR4X2ZpbGUpIHsKKwlPUEpfVUlOVDMyIGk7CisJb3BqX2pwMl9ib3hfdCBib3g7CisKKwlib3guaW5pdF9wb3MgPSBjaW9fdGVsbChjaW8pOworCWNpb19za2lwKGNpbywgNCk7CisJY2lvX3dyaXRlKGNpbywgSlAyX1VSTCwgNCk7CS8qIERCVEwgKi8KKwljaW9fd3JpdGUoY2lvLCAwLCAxKTsJCS8qIFZFUlMgKi8KKwljaW9fd3JpdGUoY2lvLCAwLCAzKTsJCS8qIEZMQUcgKi8KKworCWlmKElkeF9maWxlKSB7CisJCWZvciAoaSA9IDA7IGkgPCBzdHJsZW4oSWR4X2ZpbGUpOyBpKyspIHsKKwkJCWNpb193cml0ZShjaW8sIElkeF9maWxlW2ldLCAxKTsKKwkJfQorCX0KKworCWJveC5sZW5ndGggPSBjaW9fdGVsbChjaW8pIC0gYm94LmluaXRfcG9zOworCWNpb19zZWVrKGNpbywgYm94LmluaXRfcG9zKTsKKwljaW9fd3JpdGUoY2lvLCBib3gubGVuZ3RoLCA0KTsJLyogTCAqLworCWNpb19zZWVrKGNpbywgYm94LmluaXRfcG9zICsgYm94Lmxlbmd0aCk7Cit9CisjZW5kaWYKKworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfcmVhZF9paGRyKCBvcGpfanAyX3QgKmpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqcF9pbWFnZV9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaW1hZ2VfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3sKKwkvKiBwcmVjb25kaXRpb25zICovCisJYXNzZXJ0KHBfaW1hZ2VfaGVhZGVyX2RhdGEgIT0gMDApOworCWFzc2VydChqcDIgIT0gMDApOworCWFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisJaWYgKHBfaW1hZ2VfaGVhZGVyX3NpemUgIT0gMTQpIHsKKwkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkJhZCBpbWFnZSBoZWFkZXIgYm94IChiYWQgc2l6ZSlcbiIpOworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKworCW9wal9yZWFkX2J5dGVzKHBfaW1hZ2VfaGVhZGVyX2RhdGEsJihqcDItPmgpLDQpOwkJCS8qIEhFSUdIVCAqLworCXBfaW1hZ2VfaGVhZGVyX2RhdGEgKz0gNDsKKwlvcGpfcmVhZF9ieXRlcyhwX2ltYWdlX2hlYWRlcl9kYXRhLCYoanAyLT53KSw0KTsJCQkvKiBXSURUSCAqLworCXBfaW1hZ2VfaGVhZGVyX2RhdGEgKz0gNDsKKwlvcGpfcmVhZF9ieXRlcyhwX2ltYWdlX2hlYWRlcl9kYXRhLCYoanAyLT5udW1jb21wcyksMik7CQkvKiBOQyAqLworCXBfaW1hZ2VfaGVhZGVyX2RhdGEgKz0gMjsKKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgY29tcG9uZW50cyAqLworCWpwMi0+Y29tcHMgPSAob3BqX2pwMl9jb21wc190Kikgb3BqX2NhbGxvYyhqcDItPm51bWNvbXBzLCBzaXplb2Yob3BqX2pwMl9jb21wc190KSk7CisJaWYgKGpwMi0+Y29tcHMgPT0gMCkgeworCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGltYWdlIGhlYWRlciAoaWhkcilcbiIpOworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKworCW9wal9yZWFkX2J5dGVzKHBfaW1hZ2VfaGVhZGVyX2RhdGEsJihqcDItPmJwYyksMSk7CQkJLyogQlBDICovCisJKysgcF9pbWFnZV9oZWFkZXJfZGF0YTsKKworCW9wal9yZWFkX2J5dGVzKHBfaW1hZ2VfaGVhZGVyX2RhdGEsJihqcDItPkMpLDEpOwkJCS8qIEMgKi8KKwkrKyBwX2ltYWdlX2hlYWRlcl9kYXRhOworCisJLyogU2hvdWxkIGJlIGVxdWFsIHRvIDcgY2YuIGNoYXB0ZXIgYWJvdXQgaW1hZ2UgaGVhZGVyIGJveCBvZiB0aGUgbm9ybSAqLworCWlmIChqcDItPkMgIT0gNyl7CisJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfSU5GTywgIkpQMiBJSERSIGJveDogY29tcHJlc3Npb24gdHlwZSBpbmRpY2F0ZSB0aGF0IHRoZSBmaWxlIGlzIG5vdCBhIGNvbmZvcm1pbmcgSlAyIGZpbGUgKCVkKSBcbiIsIGpwMi0+Qyk7CisJfQorCisJb3BqX3JlYWRfYnl0ZXMocF9pbWFnZV9oZWFkZXJfZGF0YSwmKGpwMi0+VW5rQyksMSk7CQkJLyogVW5rQyAqLworCSsrIHBfaW1hZ2VfaGVhZGVyX2RhdGE7CisJb3BqX3JlYWRfYnl0ZXMocF9pbWFnZV9oZWFkZXJfZGF0YSwmKGpwMi0+SVBSKSwxKTsJCQkvKiBJUFIgKi8KKwkrKyBwX2ltYWdlX2hlYWRlcl9kYXRhOworCisJcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JZVEUgKiBvcGpfanAyX3dyaXRlX2loZHIob3BqX2pwMl90ICpqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9uYl9ieXRlc193cml0dGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisJT1BKX0JZVEUgKiBsX2loZHJfZGF0YSwqIGxfY3VycmVudF9paGRyX3B0cjsKKwkKKwkvKiBwcmVjb25kaXRpb25zICovCisJYXNzZXJ0KGpwMiAhPSAwMCk7CisJYXNzZXJ0KHBfbmJfYnl0ZXNfd3JpdHRlbiAhPSAwMCk7CisKKwkvKiBkZWZhdWx0IGltYWdlIGhlYWRlciBpcyAyMiBieXRlcyB3aWRlICovCisJbF9paGRyX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX2NhbGxvYygxLDIyKTsKKwlpZiAobF9paGRyX2RhdGEgPT0gMDApIHsKKwkJcmV0dXJuIDAwOworCX0KKworCWxfY3VycmVudF9paGRyX3B0ciA9IGxfaWhkcl9kYXRhOworCQorCW9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfaWhkcl9wdHIsMjIsNCk7CQkJCS8qIHdyaXRlIGJveCBzaXplICovCisJbF9jdXJyZW50X2loZHJfcHRyKz00OworCisJb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9paGRyX3B0cixKUDJfSUhEUiwgNCk7CQkvKiBJSERSICovCisJbF9jdXJyZW50X2loZHJfcHRyKz00OworCQorCW9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfaWhkcl9wdHIsanAyLT5oLCA0KTsJCS8qIEhFSUdIVCAqLworCWxfY3VycmVudF9paGRyX3B0cis9NDsKKwkKKwlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2loZHJfcHRyLCBqcDItPncsIDQpOwkJLyogV0lEVEggKi8KKwlsX2N1cnJlbnRfaWhkcl9wdHIrPTQ7CisJCisJb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9paGRyX3B0ciwganAyLT5udW1jb21wcywgMik7CQkvKiBOQyAqLworCWxfY3VycmVudF9paGRyX3B0cis9MjsKKwkKKwlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2loZHJfcHRyLCBqcDItPmJwYywgMSk7CQkvKiBCUEMgKi8KKwkrK2xfY3VycmVudF9paGRyX3B0cjsKKwkKKwlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2loZHJfcHRyLCBqcDItPkMsIDEpOwkJLyogQyA6IEFsd2F5cyA3ICovCisJKytsX2N1cnJlbnRfaWhkcl9wdHI7CisJCisJb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9paGRyX3B0ciwganAyLT5VbmtDLCAxKTsJCS8qIFVua0MsIGNvbG9yc3BhY2UgdW5rbm93biAqLworCSsrbF9jdXJyZW50X2loZHJfcHRyOworCQorCW9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfaWhkcl9wdHIsIGpwMi0+SVBSLCAxKTsJCS8qIElQUiwgbm8gaW50ZWxsZWN0dWFsIHByb3BlcnR5ICovCisJKytsX2N1cnJlbnRfaWhkcl9wdHI7CisJCisJKnBfbmJfYnl0ZXNfd3JpdHRlbiA9IDIyOworCQorCXJldHVybiBsX2loZHJfZGF0YTsKK30KKworc3RhdGljIE9QSl9CWVRFICogb3BqX2pwMl93cml0ZV9icGNjKAlvcGpfanAyX3QgKmpwMiwKKwkJCQkJCSAgICAgICAgT1BKX1VJTlQzMiAqIHBfbmJfYnl0ZXNfd3JpdHRlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisJT1BKX1VJTlQzMiBpOworCS8qIHJvb20gZm9yIDggYnl0ZXMgZm9yIGJveCBhbmQgMSBieXRlIGZvciBlYWNoIGNvbXBvbmVudCAqLworCU9QSl9VSU5UMzIgbF9icGNjX3NpemUgPSA4ICsganAyLT5udW1jb21wczsKKwlPUEpfQllURSAqIGxfYnBjY19kYXRhLCogbF9jdXJyZW50X2JwY2NfcHRyOworCQorCS8qIHByZWNvbmRpdGlvbnMgKi8KKwlhc3NlcnQoanAyICE9IDAwKTsKKwlhc3NlcnQocF9uYl9ieXRlc193cml0dGVuICE9IDAwKTsKKworCWxfYnBjY19kYXRhID0gKE9QSl9CWVRFICopIG9wal9jYWxsb2MoMSxsX2JwY2Nfc2l6ZSk7CisJaWYgKGxfYnBjY19kYXRhID09IDAwKSB7CisJCXJldHVybiAwMDsKKwl9CisKKwlsX2N1cnJlbnRfYnBjY19wdHIgPSBsX2JwY2NfZGF0YTsKKworCW9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfYnBjY19wdHIsbF9icGNjX3NpemUsNCk7CQkJCS8qIHdyaXRlIGJveCBzaXplICovCisJbF9jdXJyZW50X2JwY2NfcHRyICs9IDQ7CisJCisJb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9icGNjX3B0cixKUDJfQlBDQyw0KTsJCQkJCS8qIEJQQ0MgKi8KKwlsX2N1cnJlbnRfYnBjY19wdHIgKz0gNDsKKworCWZvciAoaSA9IDA7IGkgPCBqcDItPm51bWNvbXBzOyArK2kpICB7CisJCW9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfYnBjY19wdHIsIGpwMi0+Y29tcHNbaV0uYnBjYywgMSk7IC8qIHdyaXRlIGVhY2ggY29tcG9uZW50IGluZm9ybWF0aW9uICovCisJCSsrbF9jdXJyZW50X2JwY2NfcHRyOworCX0KKworCSpwX25iX2J5dGVzX3dyaXR0ZW4gPSBsX2JwY2Nfc2l6ZTsKKwkKKwlyZXR1cm4gbF9icGNjX2RhdGE7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfYnBjYyggb3BqX2pwMl90ICpqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2JwY19oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfYnBjX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKwlPUEpfVUlOVDMyIGk7CisKKwkvKiBwcmVjb25kaXRpb25zICovCisJYXNzZXJ0KHBfYnBjX2hlYWRlcl9kYXRhICE9IDAwKTsKKwlhc3NlcnQoanAyICE9IDAwKTsKKwlhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworCQorCWlmIChqcDItPmJwYyAhPSAyNTUgKXsKKwkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiQSBCUENDIGhlYWRlciBib3ggaXMgYXZhaWxhYmxlIGFsdGhvdWdoIEJQQyBnaXZlbiBieSB0aGUgSUhEUiBib3ggKCVkKSBpbmRpY2F0ZSBjb21wb25lbnRzIGJpdCBkZXB0aCBpcyBjb25zdGFudFxuIixqcDItPmJwYyk7CisJfQorCisJLyogYW5kIGxlbmd0aCBpcyByZWxldmFudCAqLworCWlmIChwX2JwY19oZWFkZXJfc2l6ZSAhPSBqcDItPm51bWNvbXBzKSB7CisJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJCYWQgQlBDQyBoZWFkZXIgYm94IChiYWQgc2l6ZSlcbiIpOworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKworCS8qIHJlYWQgaW5mbyBmb3IgZWFjaCBjb21wb25lbnQgKi8KKwlmb3IgKGkgPSAwOyBpIDwganAyLT5udW1jb21wczsgKytpKSB7CisJCW9wal9yZWFkX2J5dGVzKHBfYnBjX2hlYWRlcl9kYXRhLCZqcDItPmNvbXBzW2ldLmJwY2MgLDEpOwkvKiByZWFkIGVhY2ggQlBDQyBjb21wb25lbnQgKi8KKwkJKytwX2JwY19oZWFkZXJfZGF0YTsKKwl9CisKKwlyZXR1cm4gT1BKX1RSVUU7Cit9CitzdGF0aWMgT1BKX0JZVEUgKiBvcGpfanAyX3dyaXRlX2NkZWYob3BqX2pwMl90ICpqcDIsIE9QSl9VSU5UMzIgKiBwX25iX2J5dGVzX3dyaXR0ZW4pCit7CisJLyogcm9vbSBmb3IgOCBieXRlcyBmb3IgYm94LCAyIGZvciBuICovCisJT1BKX1VJTlQzMiBsX2NkZWZfc2l6ZSA9IDEwOworCU9QSl9CWVRFICogbF9jZGVmX2RhdGEsKiBsX2N1cnJlbnRfY2RlZl9wdHI7CisJT1BKX1VJTlQzMiBsX3ZhbHVlOworCU9QSl9VSU5UMTYgaTsKKworCS8qIHByZWNvbmRpdGlvbnMgKi8KKwlhc3NlcnQoanAyICE9IDAwKTsKKwlhc3NlcnQocF9uYl9ieXRlc193cml0dGVuICE9IDAwKTsKKwlhc3NlcnQoanAyLT5jb2xvci5qcDJfY2RlZiAhPSAwMCk7CisJYXNzZXJ0KGpwMi0+Y29sb3IuanAyX2NkZWYtPmluZm8gIT0gMDApOworCWFzc2VydChqcDItPmNvbG9yLmpwMl9jZGVmLT5uID4gMFUpOworCisJbF9jZGVmX3NpemUgKz0gNlUgKiBqcDItPmNvbG9yLmpwMl9jZGVmLT5uOworCisJbF9jZGVmX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX21hbGxvYyhsX2NkZWZfc2l6ZSk7CisJaWYgKGxfY2RlZl9kYXRhID09IDAwKSB7CisJCXJldHVybiAwMDsKKwl9CisKKwlsX2N1cnJlbnRfY2RlZl9wdHIgPSBsX2NkZWZfZGF0YTsKKwkKKwlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2NkZWZfcHRyLGxfY2RlZl9zaXplLDQpOwkJCS8qIHdyaXRlIGJveCBzaXplICovCisJbF9jdXJyZW50X2NkZWZfcHRyICs9IDQ7CisKKwlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2NkZWZfcHRyLEpQMl9DREVGLDQpOwkJCQkJLyogQlBDQyAqLworCWxfY3VycmVudF9jZGVmX3B0ciArPSA0OworCisJbF92YWx1ZSA9IGpwMi0+Y29sb3IuanAyX2NkZWYtPm47CisJb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9jZGVmX3B0cixsX3ZhbHVlLDIpOwkJCQkJLyogTiAqLworCWxfY3VycmVudF9jZGVmX3B0ciArPSAyOworCisJZm9yIChpID0gMFU7IGkgPCBqcDItPmNvbG9yLmpwMl9jZGVmLT5uOyArK2kpIHsKKwkJbF92YWx1ZSA9IGpwMi0+Y29sb3IuanAyX2NkZWYtPmluZm9baV0uY247CisJCW9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfY2RlZl9wdHIsbF92YWx1ZSwyKTsJCQkJCS8qIENuaSAqLworCQlsX2N1cnJlbnRfY2RlZl9wdHIgKz0gMjsKKwkJbF92YWx1ZSA9IGpwMi0+Y29sb3IuanAyX2NkZWYtPmluZm9baV0udHlwOworCQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2NkZWZfcHRyLGxfdmFsdWUsMik7CQkJCQkvKiBUeXBpICovCisJCWxfY3VycmVudF9jZGVmX3B0ciArPSAyOworCQlsX3ZhbHVlID0ganAyLT5jb2xvci5qcDJfY2RlZi0+aW5mb1tpXS5hc29jOworCQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2NkZWZfcHRyLGxfdmFsdWUsMik7CQkJCQkvKiBBc29jaSAqLworCQlsX2N1cnJlbnRfY2RlZl9wdHIgKz0gMjsKKwl9CisJKnBfbmJfYnl0ZXNfd3JpdHRlbiA9IGxfY2RlZl9zaXplOworCisJcmV0dXJuIGxfY2RlZl9kYXRhOworfQorCitzdGF0aWMgT1BKX0JZVEUgKiBvcGpfanAyX3dyaXRlX2NvbHIoICBvcGpfanAyX3QgKmpwMiwKKwkJCQkJCQkgICAgT1BKX1VJTlQzMiAqIHBfbmJfYnl0ZXNfd3JpdHRlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisJLyogcm9vbSBmb3IgOCBieXRlcyBmb3IgYm94IDMgZm9yIGNvbW1vbiBkYXRhIGFuZCB2YXJpYWJsZSB1cG9uIHByb2ZpbGUqLworCU9QSl9VSU5UMzIgbF9jb2xyX3NpemUgPSAxMTsKKwlPUEpfQllURSAqIGxfY29scl9kYXRhLCogbF9jdXJyZW50X2NvbHJfcHRyOworCisJLyogcHJlY29uZGl0aW9ucyAqLworCWFzc2VydChqcDIgIT0gMDApOworCWFzc2VydChwX25iX2J5dGVzX3dyaXR0ZW4gIT0gMDApOworICAgIGFzc2VydChqcDItPm1ldGggPT0gMSB8fCBqcDItPm1ldGggPT0gMik7CisKKwlzd2l0Y2ggKGpwMi0+bWV0aCkgeyAKKwkJY2FzZSAxIDoKKwkJCWxfY29scl9zaXplICs9IDQ7IC8qIEVudW1DUyAqLworCQkJYnJlYWs7CisJCWNhc2UgMiA6CisgICAgICAgICAgICBhc3NlcnQoanAyLT5jb2xvci5pY2NfcHJvZmlsZV9sZW4pOwkvKiBJQ0MgcHJvZmlsZSAqLworICAgICAgICAgICAgbF9jb2xyX3NpemUgKz0ganAyLT5jb2xvci5pY2NfcHJvZmlsZV9sZW47CisJCQlicmVhazsKKwkJZGVmYXVsdCA6CisJCQlyZXR1cm4gMDA7CisJfQorCisJbF9jb2xyX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX2NhbGxvYygxLGxfY29scl9zaXplKTsKKwlpZiAobF9jb2xyX2RhdGEgPT0gMDApIHsKKwkJcmV0dXJuIDAwOworCX0KKwkKKwlsX2N1cnJlbnRfY29scl9wdHIgPSBsX2NvbHJfZGF0YTsKKworCW9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfY29scl9wdHIsbF9jb2xyX3NpemUsNCk7CQkJCS8qIHdyaXRlIGJveCBzaXplICovCisJbF9jdXJyZW50X2NvbHJfcHRyICs9IDQ7CisJCisJb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9jb2xyX3B0cixKUDJfQ09MUiw0KTsJCQkJCS8qIEJQQ0MgKi8KKwlsX2N1cnJlbnRfY29scl9wdHIgKz0gNDsKKwkKKwlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2NvbHJfcHRyLCBqcDItPm1ldGgsMSk7CQkJCS8qIE1FVEggKi8KKwkrK2xfY3VycmVudF9jb2xyX3B0cjsKKwkKKwlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2NvbHJfcHRyLCBqcDItPnByZWNlZGVuY2UsMSk7CQkJLyogUFJFQ0VERU5DRSAqLworCSsrbF9jdXJyZW50X2NvbHJfcHRyOworCQorCW9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfY29scl9wdHIsIGpwMi0+YXBwcm94LDEpOwkJCQkvKiBBUFBST1ggKi8KKwkrK2xfY3VycmVudF9jb2xyX3B0cjsKKwkKKwlpZiAoanAyLT5tZXRoID09IDEpIHsgLyogTWV0aCB2YWx1ZSBpcyByZXN0cmljdGVkIHRvIDEgb3IgMiAoVGFibGUgSS45IG9mIHBhcnQgMSkgKi8KKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9jb2xyX3B0ciwganAyLT5lbnVtY3MsNCk7IH0gICAgICAgLyogRW51bUNTICovCisgICAgZWxzZSB7CisgICAgICAgIGlmIChqcDItPm1ldGggPT0gMikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSUNDIHByb2ZpbGUgKi8KKyAgICAgICAgICAgIE9QSl9VSU5UMzIgaTsKKyAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IGpwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfbGVuOyArK2kpIHsKKyAgICAgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2NvbHJfcHRyLCBqcDItPmNvbG9yLmljY19wcm9maWxlX2J1ZltpXSwgMSk7CisgICAgICAgICAgICAgICAgKytsX2N1cnJlbnRfY29scl9wdHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwl9CisKKwkqcF9uYl9ieXRlc193cml0dGVuID0gbF9jb2xyX3NpemU7CisJCisJcmV0dXJuIGxfY29scl9kYXRhOworfQorCitzdGF0aWMgdm9pZCBvcGpfanAyX2ZyZWVfcGNscihvcGpfanAyX2NvbG9yX3QgKmNvbG9yKQoreworICAgIG9wal9mcmVlKGNvbG9yLT5qcDJfcGNsci0+Y2hhbm5lbF9zaWduKTsKKyAgICBvcGpfZnJlZShjb2xvci0+anAyX3BjbHItPmNoYW5uZWxfc2l6ZSk7CisgICAgb3BqX2ZyZWUoY29sb3ItPmpwMl9wY2xyLT5lbnRyaWVzKTsKKworCWlmKGNvbG9yLT5qcDJfcGNsci0+Y21hcCkgb3BqX2ZyZWUoY29sb3ItPmpwMl9wY2xyLT5jbWFwKTsKKworICAgIG9wal9mcmVlKGNvbG9yLT5qcDJfcGNscik7IGNvbG9yLT5qcDJfcGNsciA9IE5VTEw7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX2NoZWNrX2NvbG9yKG9wal9pbWFnZV90ICppbWFnZSwgb3BqX2pwMl9jb2xvcl90ICpjb2xvciwgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIpCit7CisJT1BKX1VJTlQxNiBpOworCisJLyogdGVzdGNhc2UgNDE0OS5wZGYuU0lHU0VHVi5jZjcuMzUwMSAqLworCWlmIChjb2xvci0+anAyX2NkZWYpIHsKKwkJb3BqX2pwMl9jZGVmX2luZm9fdCAqaW5mbyA9IGNvbG9yLT5qcDJfY2RlZi0+aW5mbzsKKwkJT1BKX1VJTlQxNiBuID0gY29sb3ItPmpwMl9jZGVmLT5uOworCQlPUEpfVUlOVDMyIG5yX2NoYW5uZWxzID0gaW1hZ2UtPm51bWNvbXBzOyAvKiBGSVhNRSBpbWFnZS0+bnVtY29tcHMgPT0ganAyLT5udW1jb21wcyBiZWZvcmUgY29sb3IgaXMgYXBwbGllZCA/Pz8gKi8KKworCQkvKiBjZGVmIGFwcGxpZXMgdG8gY21hcCBjaGFubmVscyBpZiBhbnkgKi8KKwkJaWYgKGNvbG9yLT5qcDJfcGNsciAmJiBjb2xvci0+anAyX3BjbHItPmNtYXApIHsKKwkJCW5yX2NoYW5uZWxzID0gKE9QSl9VSU5UMzIpY29sb3ItPmpwMl9wY2xyLT5ucl9jaGFubmVsczsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCWlmIChpbmZvW2ldLmNuID49IG5yX2NoYW5uZWxzKSB7CisJCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkludmFsaWQgY29tcG9uZW50IGluZGV4ICVkICg+PSAlZCkuXG4iLCBpbmZvW2ldLmNuLCBucl9jaGFubmVscyk7CisJCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJCX0KKwkJCWlmIChpbmZvW2ldLmFzb2MgPT0gNjU1MzVVKSBjb250aW51ZTsKKworCQkJaWYgKGluZm9baV0uYXNvYyA+IDAgJiYgKE9QSl9VSU5UMzIpKGluZm9baV0uYXNvYyAtIDEpID49IG5yX2NoYW5uZWxzKSB7CisJCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkludmFsaWQgY29tcG9uZW50IGluZGV4ICVkICg+PSAlZCkuXG4iLCBpbmZvW2ldLmFzb2MgLSAxLCBucl9jaGFubmVscyk7CisJCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJCX0KKwkJfQorCisJCS8qIGlzc3VlIDM5NyAqLworCQkvKiBJU08gMTU0NDQtMSBzdGF0ZXMgdGhhdCBpZiBjZGVmIGlzIHByZXNlbnQsIGl0IHNoYWxsIGNvbnRhaW4gYSBjb21wbGV0ZSBsaXN0IG9mIGNoYW5uZWwgZGVmaW5pdGlvbnMuICovCisJCXdoaWxlIChucl9jaGFubmVscyA+IDApCisJCXsKKwkJCWZvcihpID0gMDsgaSA8IG47ICsraSkgeworCQkJCWlmICgoT1BKX1VJTlQzMilpbmZvW2ldLmNuID09IChucl9jaGFubmVscyAtIDFVKSkgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoaSA9PSBuKSB7CisJCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkluY29tcGxldGUgY2hhbm5lbCBkZWZpbml0aW9ucy5cbiIpOworCQkJCXJldHVybiBPUEpfRkFMU0U7CisJCQl9CisJCQktLW5yX2NoYW5uZWxzOworCQl9CisJfQorCisJLyogdGVzdGNhc2VzIDQ1MS5wZGYuU0lHU0VHVi5mNGMuMzcyMywgNDUxLnBkZi5TSUdTRUdWLjViNS4zNzIzIGFuZAorCSAgIDY2ZWEzMWFjYmIwZjIzYTJiYmM5MWY2NGQ2OWEwM2Y1X3NpZ25hbF9zaWdzZWd2XzEzOTM3YzBfNzAzMF81NzI1LnBkZiAqLworCWlmIChjb2xvci0+anAyX3BjbHIgJiYgY29sb3ItPmpwMl9wY2xyLT5jbWFwKSB7CisJCU9QSl9VSU5UMTYgbnJfY2hhbm5lbHMgPSBjb2xvci0+anAyX3BjbHItPm5yX2NoYW5uZWxzOworCQlvcGpfanAyX2NtYXBfY29tcF90ICpjbWFwID0gY29sb3ItPmpwMl9wY2xyLT5jbWFwOworCQlPUEpfQk9PTCAqcGNvbF91c2FnZSwgaXNfc2FuZSA9IE9QSl9UUlVFOworCisJCS8qIHZlcmlmeSB0aGF0IGFsbCBvcmlnaW5hbCBjb21wb25lbnRzIG1hdGNoIGFuIGV4aXN0aW5nIG9uZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnJfY2hhbm5lbHM7IGkrKykgeworCQkJaWYgKGNtYXBbaV0uY21wID49IGltYWdlLT5udW1jb21wcykgeworCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJJbnZhbGlkIGNvbXBvbmVudCBpbmRleCAlZCAoPj0gJWQpLlxuIiwgY21hcFtpXS5jbXAsIGltYWdlLT5udW1jb21wcyk7CisJCQkJaXNfc2FuZSA9IE9QSl9GQUxTRTsKKwkJCX0KKwkJfQorCisJCXBjb2xfdXNhZ2UgPSBvcGpfY2FsbG9jKG5yX2NoYW5uZWxzLCBzaXplb2YoT1BKX0JPT0wpKTsKKwkJaWYgKCFwY29sX3VzYWdlKSB7CisJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiVW5leHBlY3RlZCBPT00uXG4iKTsKKwkJCXJldHVybiBPUEpfRkFMU0U7CisJCX0KKwkJLyogdmVyaWZ5IHRoYXQgbm8gY29tcG9uZW50IGlzIHRhcmdldGVkIG1vcmUgdGhhbiBvbmNlICovCisJCWZvciAoaSA9IDA7IGkgPCBucl9jaGFubmVsczsgaSsrKSB7CisJCQlpZiAoY21hcFtpXS5tdHlwICE9IDAgJiYgY21hcFtpXS5tdHlwICE9IDEpIHsKKwkJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiVW5leHBlY3RlZCBNVFlQIHZhbHVlLlxuIik7CisJCQkJb3BqX2ZyZWUocGNvbF91c2FnZSk7CisJCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJCX0KKwkJCU9QSl9VSU5UMTYgcGNvbCA9IGNtYXBbaV0ucGNvbDsKKwkJCWlmIChwY29sID49IG5yX2NoYW5uZWxzKSB7CisJCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkludmFsaWQgY29tcG9uZW50L3BhbGV0dGUgaW5kZXggZm9yIGRpcmVjdCBtYXBwaW5nICVkLlxuIiwgcGNvbCk7CisJCQkJaXNfc2FuZSA9IE9QSl9GQUxTRTsKKwkJCX0KKwkJCWVsc2UgaWYgKHBjb2xfdXNhZ2VbcGNvbF0gJiYgY21hcFtpXS5tdHlwICE9IDApIHsKKwkJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ29tcG9uZW50ICVkIGlzIG1hcHBlZCB0d2ljZS5cbiIsIHBjb2wpOworCQkJCWlzX3NhbmUgPSBPUEpfRkFMU0U7CisJCQl9CisgICAgICBlbHNlIGlmIChjbWFwW2ldLm10eXAgPT0gMCAmJiBjbWFwW2ldLnBjb2wgIT0gMCkgeworICAgICAgICAvKiBJLjUuMy41IFBDT0w6IElmIHRoZSB2YWx1ZSBvZiB0aGUgTVRZUCBmaWVsZCBmb3IgdGhpcyBjaGFubmVsIGlzIDAsIHRoZW4KKyAgICAgICAgICogdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgc2hhbGwgYmUgMC4gKi8KKwkJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRGlyZWN0IHVzZSBhdCAjJWQgaG93ZXZlciBwY29sPSVkLlxuIiwgaSwgcGNvbCk7CisJCQkJaXNfc2FuZSA9IE9QSl9GQUxTRTsKKyAgICAgIH0KKwkJCWVsc2UKKwkJCQlwY29sX3VzYWdlW3Bjb2xdID0gT1BKX1RSVUU7CisJCX0KKwkJLyogdmVyaWZ5IHRoYXQgYWxsIGNvbXBvbmVudHMgYXJlIHRhcmdldGVkIGF0IGxlYXN0IG9uY2UgKi8KKwkJZm9yIChpID0gMDsgaSA8IG5yX2NoYW5uZWxzOyBpKyspIHsKKwkJCWlmICghcGNvbF91c2FnZVtpXSAmJiBjbWFwW2ldLm10eXAgIT0gMCkgeworCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJDb21wb25lbnQgJWQgZG9lc24ndCBoYXZlIGEgbWFwcGluZy5cbiIsIGkpOworCQkJCWlzX3NhbmUgPSBPUEpfRkFMU0U7CisJCQl9CisJCX0KKwkJLyogSXNzdWUgMjM1LzQ0NyB3ZWlyZCBjbWFwICovCisJCWlmICgxICYmIGlzX3NhbmUgJiYgKGltYWdlLT5udW1jb21wcz09MVUpKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgbnJfY2hhbm5lbHM7IGkrKykgeworCQkJCWlmICghcGNvbF91c2FnZVtpXSkgeworCQkJCQlpc19zYW5lID0gMFU7CisJCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkNvbXBvbmVudCBtYXBwaW5nIHNlZW1zIHdyb25nLiBUcnlpbmcgdG8gY29ycmVjdC5cbiIsIGkpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoIWlzX3NhbmUpIHsKKwkJCQlpc19zYW5lID0gT1BKX1RSVUU7CisJCQkJZm9yIChpID0gMDsgaSA8IG5yX2NoYW5uZWxzOyBpKyspIHsKKwkJCQkJY21hcFtpXS5tdHlwID0gMVU7CisJCQkJCWNtYXBbaV0ucGNvbCA9IChPUEpfQllURSkgaTsKKwkJCQl9CisJCQl9CisJCX0KKwkJb3BqX2ZyZWUocGNvbF91c2FnZSk7CisJCWlmICghaXNfc2FuZSkgeworCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJfQorCX0KKworCXJldHVybiBPUEpfVFJVRTsKK30KKworLyogZmlsZTkuanAyICovCitzdGF0aWMgdm9pZCBvcGpfanAyX2FwcGx5X3BjbHIob3BqX2ltYWdlX3QgKmltYWdlLCBvcGpfanAyX2NvbG9yX3QgKmNvbG9yKQoreworCW9wal9pbWFnZV9jb21wX3QgKm9sZF9jb21wcywgKm5ld19jb21wczsKKwlPUEpfQllURSAqY2hhbm5lbF9zaXplLCAqY2hhbm5lbF9zaWduOworCU9QSl9VSU5UMzIgKmVudHJpZXM7CisJb3BqX2pwMl9jbWFwX2NvbXBfdCAqY21hcDsKKwlPUEpfSU5UMzIgKnNyYywgKmRzdDsKKwlPUEpfVUlOVDMyIGosIG1heDsKKwlPUEpfVUlOVDE2IGksIG5yX2NoYW5uZWxzLCBjbXAsIHBjb2w7CisJT1BKX0lOVDMyIGssIHRvcF9rOworCisJY2hhbm5lbF9zaXplID0gY29sb3ItPmpwMl9wY2xyLT5jaGFubmVsX3NpemU7CisJY2hhbm5lbF9zaWduID0gY29sb3ItPmpwMl9wY2xyLT5jaGFubmVsX3NpZ247CisJZW50cmllcyA9IGNvbG9yLT5qcDJfcGNsci0+ZW50cmllczsKKwljbWFwID0gY29sb3ItPmpwMl9wY2xyLT5jbWFwOworCW5yX2NoYW5uZWxzID0gY29sb3ItPmpwMl9wY2xyLT5ucl9jaGFubmVsczsKKworCW9sZF9jb21wcyA9IGltYWdlLT5jb21wczsKKwluZXdfY29tcHMgPSAob3BqX2ltYWdlX2NvbXBfdCopCisJCQlvcGpfbWFsbG9jKG5yX2NoYW5uZWxzICogc2l6ZW9mKG9wal9pbWFnZV9jb21wX3QpKTsKKwlpZiAoIW5ld19jb21wcykgeworCQkvKiBGSVhNRSBubyBlcnJvciBjb2RlIGZvciBvcGpfanAyX2FwcGx5X3BjbHIgKi8KKwkJLyogRklYTUUgZXZlbnQgbWFuYWdlciBlcnJvciBjYWxsYmFjayAqLworCQlyZXR1cm47CisJfQorCWZvcihpID0gMDsgaSA8IG5yX2NoYW5uZWxzOyArK2kpIHsKKwkJcGNvbCA9IGNtYXBbaV0ucGNvbDsgY21wID0gY21hcFtpXS5jbXA7CisKKwkJLyogRGlyZWN0IHVzZSAqLworICAgIGlmKGNtYXBbaV0ubXR5cCA9PSAwKXsKKyAgICAgIGFzc2VydCggcGNvbCA9PSAwICk7CisgICAgICBuZXdfY29tcHNbaV0gPSBvbGRfY29tcHNbY21wXTsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KCBpID09IHBjb2wgKTsgLy8gcHJvYmFibHkgd3Jvbmc/CisgICAgICBuZXdfY29tcHNbaV0gPSBvbGRfY29tcHNbY21wXTsKKyAgICB9CisKKwkJLyogUGFsZXR0ZSBtYXBwaW5nOiAqLworCQluZXdfY29tcHNbaV0uZGF0YSA9IChPUEpfSU5UMzIqKQorCQkJCW9wal9tYWxsb2Mob2xkX2NvbXBzW2NtcF0udyAqIG9sZF9jb21wc1tjbXBdLmggKiBzaXplb2YoT1BKX0lOVDMyKSk7CisJCWlmICghbmV3X2NvbXBzW2ldLmRhdGEpIHsKKwkJCW9wal9mcmVlKG5ld19jb21wcyk7CisJCQluZXdfY29tcHMgPSBOVUxMOworCQkJLyogRklYTUUgbm8gZXJyb3IgY29kZSBmb3Igb3BqX2pwMl9hcHBseV9wY2xyICovCisJCQkvKiBGSVhNRSBldmVudCBtYW5hZ2VyIGVycm9yIGNhbGxiYWNrICovCisJCQlyZXR1cm47CisJCX0KKwkJbmV3X2NvbXBzW2ldLnByZWMgPSBjaGFubmVsX3NpemVbaV07CisJCW5ld19jb21wc1tpXS5zZ25kID0gY2hhbm5lbF9zaWduW2ldOworCX0KKworCXRvcF9rID0gY29sb3ItPmpwMl9wY2xyLT5ucl9lbnRyaWVzIC0gMTsKKworCWZvcihpID0gMDsgaSA8IG5yX2NoYW5uZWxzOyArK2kpIHsKKwkJLyogUGFsZXR0ZSBtYXBwaW5nOiAqLworCQljbXAgPSBjbWFwW2ldLmNtcDsgcGNvbCA9IGNtYXBbaV0ucGNvbDsKKwkJc3JjID0gb2xkX2NvbXBzW2NtcF0uZGF0YTsKKyAgICBhc3NlcnQoIHNyYyApOworCQltYXggPSBuZXdfY29tcHNbaV0udyAqIG5ld19jb21wc1tpXS5oOworCisJCS8qIERpcmVjdCB1c2U6ICovCisgICAgaWYoY21hcFtpXS5tdHlwID09IDApIHsKKyAgICAgIGFzc2VydCggY21wID09IDAgKTsgLy8gcHJvYmFibHkgd3JvbmcuCisgICAgICBkc3QgPSBuZXdfY29tcHNbaV0uZGF0YTsKKyAgICAgIGFzc2VydCggZHN0ICk7CisgICAgICBmb3IoaiA9IDA7IGogPCBtYXg7ICsraikgeworICAgICAgICBkc3Rbal0gPSBzcmNbal07CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgYXNzZXJ0KCBpID09IHBjb2wgKTsgLy8gcHJvYmFibHkgd3Jvbmc/CisgICAgICBkc3QgPSBuZXdfY29tcHNbaV0uZGF0YTsKKyAgICAgIGFzc2VydCggZHN0ICk7CisgICAgICBmb3IoaiA9IDA7IGogPCBtYXg7ICsraikgeworICAgICAgICAvKiBUaGUgaW5kZXggKi8KKyAgICAgICAgaWYoKGsgPSBzcmNbal0pIDwgMCkgayA9IDA7IGVsc2UgaWYoayA+IHRvcF9rKSBrID0gdG9wX2s7CisKKyAgICAgICAgLyogVGhlIGNvbG91ciAqLworICAgICAgICBkc3Rbal0gPSAoT1BKX0lOVDMyKWVudHJpZXNbayAqIG5yX2NoYW5uZWxzICsgcGNvbF07CisgICAgICAgIH0KKyAgICB9CisJfQorCisJbWF4ID0gaW1hZ2UtPm51bWNvbXBzOworCWZvcihpID0gMDsgaSA8IG1heDsgKytpKSB7CisJCWlmKG9sZF9jb21wc1tpXS5kYXRhKSBvcGpfZnJlZShvbGRfY29tcHNbaV0uZGF0YSk7CisJfQorCisJb3BqX2ZyZWUob2xkX2NvbXBzKTsKKwlpbWFnZS0+Y29tcHMgPSBuZXdfY29tcHM7CisJaW1hZ2UtPm51bWNvbXBzID0gbnJfY2hhbm5lbHM7CisKKwlvcGpfanAyX2ZyZWVfcGNscihjb2xvcik7CisKK30vKiBhcHBseV9wY2xyKCkgKi8KKworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfcmVhZF9wY2xyKAlvcGpfanAyX3QgKmpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfcGNscl9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfcGNscl9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisJb3BqX2pwMl9wY2xyX3QgKmpwMl9wY2xyOworCU9QSl9CWVRFICpjaGFubmVsX3NpemUsICpjaGFubmVsX3NpZ247CisJT1BKX1VJTlQzMiAqZW50cmllczsKKwlPUEpfVUlOVDE2IG5yX2VudHJpZXMsbnJfY2hhbm5lbHM7CisJT1BKX1VJTlQxNiBpLCBqOworCU9QSl9VSU5UMzIgbF92YWx1ZTsKKwlPUEpfQllURSAqb3JpZ19oZWFkZXJfZGF0YSA9IHBfcGNscl9oZWFkZXJfZGF0YTsKKworCS8qIHByZWNvbmRpdGlvbnMgKi8KKwlhc3NlcnQocF9wY2xyX2hlYWRlcl9kYXRhICE9IDAwKTsKKwlhc3NlcnQoanAyICE9IDAwKTsKKwlhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAodm9pZClwX3BjbHJfaGVhZGVyX3NpemU7CisKKwlpZihqcDItPmNvbG9yLmpwMl9wY2xyKQorCQlyZXR1cm4gT1BKX0ZBTFNFOworCisJaWYgKHBfcGNscl9oZWFkZXJfc2l6ZSA8IDMpCisJCXJldHVybiBPUEpfRkFMU0U7CisKKwlvcGpfcmVhZF9ieXRlcyhwX3BjbHJfaGVhZGVyX2RhdGEsICZsX3ZhbHVlICwgMik7CS8qIE5FICovCisJcF9wY2xyX2hlYWRlcl9kYXRhICs9IDI7CisJbnJfZW50cmllcyA9IChPUEpfVUlOVDE2KSBsX3ZhbHVlOworCWlmICgobnJfZW50cmllcyA9PSAwVSkgfHwgKG5yX2VudHJpZXMgPiAxMDI0VSkpIHsKKwkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkludmFsaWQgUENMUiBib3guIFJlcG9ydHMgJWQgZW50cmllc1xuIiwgKGludClucl9lbnRyaWVzKTsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisKKwlvcGpfcmVhZF9ieXRlcyhwX3BjbHJfaGVhZGVyX2RhdGEsICZsX3ZhbHVlICwgMSk7CS8qIE5QQyAqLworCSsrcF9wY2xyX2hlYWRlcl9kYXRhOworCW5yX2NoYW5uZWxzID0gKE9QSl9VSU5UMTYpIGxfdmFsdWU7CisJaWYgKG5yX2NoYW5uZWxzID09IDBVKSB7CisJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJJbnZhbGlkIFBDTFIgYm94LiBSZXBvcnRzIDAgcGFsZXR0ZSBjb2x1bW5zXG4iKTsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisKKwlpZiAocF9wY2xyX2hlYWRlcl9zaXplIDwgMyArIChPUEpfVUlOVDMyKW5yX2NoYW5uZWxzKQorCQlyZXR1cm4gT1BKX0ZBTFNFOworCisJZW50cmllcyA9IChPUEpfVUlOVDMyKikgb3BqX21hbGxvYygoc2l6ZV90KW5yX2NoYW5uZWxzICogbnJfZW50cmllcyAqIHNpemVvZihPUEpfVUlOVDMyKSk7CisgICAgaWYgKCFlbnRyaWVzKQorICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworCWNoYW5uZWxfc2l6ZSA9IChPUEpfQllURSopIG9wal9tYWxsb2MobnJfY2hhbm5lbHMpOworICAgIGlmICghY2hhbm5lbF9zaXplKQorICAgIHsKKyAgICAgICAgb3BqX2ZyZWUoZW50cmllcyk7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCWNoYW5uZWxfc2lnbiA9IChPUEpfQllURSopIG9wal9tYWxsb2MobnJfY2hhbm5lbHMpOworCWlmICghY2hhbm5lbF9zaWduKQorCXsKKyAgICAgICAgb3BqX2ZyZWUoZW50cmllcyk7CisgICAgICAgIG9wal9mcmVlKGNoYW5uZWxfc2l6ZSk7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisJfQorCisJanAyX3BjbHIgPSAob3BqX2pwMl9wY2xyX3QqKW9wal9tYWxsb2Moc2l6ZW9mKG9wal9qcDJfcGNscl90KSk7CisgICAgaWYgKCFqcDJfcGNscikKKyAgICB7CisgICAgICAgIG9wal9mcmVlKGVudHJpZXMpOworICAgICAgICBvcGpfZnJlZShjaGFubmVsX3NpemUpOworICAgICAgICBvcGpfZnJlZShjaGFubmVsX3NpZ24pOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworCWpwMl9wY2xyLT5jaGFubmVsX3NpZ24gPSBjaGFubmVsX3NpZ247CisJanAyX3BjbHItPmNoYW5uZWxfc2l6ZSA9IGNoYW5uZWxfc2l6ZTsKKwlqcDJfcGNsci0+ZW50cmllcyA9IGVudHJpZXM7CisJanAyX3BjbHItPm5yX2VudHJpZXMgPSBucl9lbnRyaWVzOworCWpwMl9wY2xyLT5ucl9jaGFubmVscyA9IChPUEpfQllURSkgbF92YWx1ZTsKKwlqcDJfcGNsci0+Y21hcCA9IE5VTEw7CisKKwlqcDItPmNvbG9yLmpwMl9wY2xyID0ganAyX3BjbHI7CisKKwlmb3IoaSA9IDA7IGkgPCBucl9jaGFubmVsczsgKytpKSB7CisJCW9wal9yZWFkX2J5dGVzKHBfcGNscl9oZWFkZXJfZGF0YSwgJmxfdmFsdWUgLCAxKTsJLyogQmkgKi8KKwkJKytwX3BjbHJfaGVhZGVyX2RhdGE7CisKKwkJY2hhbm5lbF9zaXplW2ldID0gKE9QSl9CWVRFKSgobF92YWx1ZSAmIDB4N2YpICsgMSk7CisJCWNoYW5uZWxfc2lnbltpXSA9IChsX3ZhbHVlICYgMHg4MCkgPyAxIDogMDsKKwl9CisKKwlmb3IoaiA9IDA7IGogPCBucl9lbnRyaWVzOyArK2opIHsKKwkJZm9yKGkgPSAwOyBpIDwgbnJfY2hhbm5lbHM7ICsraSkgeworCQkJT1BKX1VJTlQzMiBieXRlc190b19yZWFkID0gKE9QSl9VSU5UMzIpKChjaGFubmVsX3NpemVbaV0rNyk+PjMpOworCisJCQlpZiAoYnl0ZXNfdG9fcmVhZCA+IHNpemVvZihPUEpfVUlOVDMyKSkKKwkJCQlieXRlc190b19yZWFkID0gc2l6ZW9mKE9QSl9VSU5UMzIpOworCQkJaWYgKChwdHJkaWZmX3QpcF9wY2xyX2hlYWRlcl9zaXplIDwgKHB0cmRpZmZfdCkocF9wY2xyX2hlYWRlcl9kYXRhIC0gb3JpZ19oZWFkZXJfZGF0YSkgKyAocHRyZGlmZl90KWJ5dGVzX3RvX3JlYWQpCisJCQkJcmV0dXJuIE9QSl9GQUxTRTsKKworCQkJb3BqX3JlYWRfYnl0ZXMocF9wY2xyX2hlYWRlcl9kYXRhLCAmbF92YWx1ZSAsIGJ5dGVzX3RvX3JlYWQpOwkvKiBDamkgKi8KKwkJCXBfcGNscl9oZWFkZXJfZGF0YSArPSBieXRlc190b19yZWFkOworCQkJKmVudHJpZXMgPSAoT1BKX1VJTlQzMikgbF92YWx1ZTsKKwkJCWVudHJpZXMrKzsKKwkJfQorCX0KKworCXJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfcmVhZF9jbWFwKAlvcGpfanAyX3QgKiBqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2NtYXBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NtYXBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworCW9wal9qcDJfY21hcF9jb21wX3QgKmNtYXA7CisJT1BKX0JZVEUgaSwgbnJfY2hhbm5lbHM7CisJT1BKX1VJTlQzMiBsX3ZhbHVlOworCisJLyogcHJlY29uZGl0aW9ucyAqLworCWFzc2VydChqcDIgIT0gMDApOworCWFzc2VydChwX2NtYXBfaGVhZGVyX2RhdGEgIT0gMDApOworCWFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgICh2b2lkKXBfY21hcF9oZWFkZXJfc2l6ZTsKKworCS8qIE5lZWQgbnJfY2hhbm5lbHM6ICovCisJaWYoanAyLT5jb2xvci5qcDJfcGNsciA9PSBOVUxMKSB7CisJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOZWVkIHRvIHJlYWQgYSBQQ0xSIGJveCBiZWZvcmUgdGhlIENNQVAgYm94LlxuIik7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCisJLyogUGFydCAxLCBJLjUuMy41OiAnVGhlcmUgc2hhbGwgYmUgYXQgbW9zdCBvbmUgQ29tcG9uZW50IE1hcHBpbmcgYm94CisJICogaW5zaWRlIGEgSlAyIEhlYWRlciBib3gnIDoKKwkqLworCWlmKGpwMi0+Y29sb3IuanAyX3BjbHItPmNtYXApIHsKKwkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk9ubHkgb25lIENNQVAgYm94IGlzIGFsbG93ZWQuXG4iKTsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisKKwlucl9jaGFubmVscyA9IGpwMi0+Y29sb3IuanAyX3BjbHItPm5yX2NoYW5uZWxzOworCWlmIChwX2NtYXBfaGVhZGVyX3NpemUgPCAoT1BKX1VJTlQzMilucl9jaGFubmVscyAqIDQpIHsKKwkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkluc3VmZmljaWVudCBkYXRhIGZvciBDTUFQIGJveC5cbiIpOworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKworCWNtYXAgPSAob3BqX2pwMl9jbWFwX2NvbXBfdCopIG9wal9tYWxsb2MobnJfY2hhbm5lbHMgKiBzaXplb2Yob3BqX2pwMl9jbWFwX2NvbXBfdCkpOworICAgIGlmICghY21hcCkKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKworCisJZm9yKGkgPSAwOyBpIDwgbnJfY2hhbm5lbHM7ICsraSkgeworCQlvcGpfcmVhZF9ieXRlc19CRShwX2NtYXBfaGVhZGVyX2RhdGEsICZsX3ZhbHVlLCAyKTsJCQkvKiBDTVBeaSAqLworCQlwX2NtYXBfaGVhZGVyX2RhdGEgKz0yOworCQljbWFwW2ldLmNtcCA9IChPUEpfVUlOVDE2KSBsX3ZhbHVlOworCisJCW9wal9yZWFkX2J5dGVzKHBfY21hcF9oZWFkZXJfZGF0YSwgJmxfdmFsdWUsIDEpOwkJCS8qIE1UWVBeaSAqLworCQkrK3BfY21hcF9oZWFkZXJfZGF0YTsKKwkJY21hcFtpXS5tdHlwID0gKE9QSl9CWVRFKSBsX3ZhbHVlOworCisJCW9wal9yZWFkX2J5dGVzKHBfY21hcF9oZWFkZXJfZGF0YSwgJmxfdmFsdWUsIDEpOwkJCS8qIFBDT0xeaSAqLworCQkrK3BfY21hcF9oZWFkZXJfZGF0YTsKKwkJY21hcFtpXS5wY29sID0gKE9QSl9CWVRFKSBsX3ZhbHVlOworCX0KKworCWpwMi0+Y29sb3IuanAyX3BjbHItPmNtYXAgPSBjbWFwOworCisJcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgdm9pZCBvcGpfanAyX2FwcGx5X2NkZWYob3BqX2ltYWdlX3QgKmltYWdlLCBvcGpfanAyX2NvbG9yX3QgKmNvbG9yLCBvcGpfZXZlbnRfbWdyX3QgKm1hbmFnZXIpCit7CisJb3BqX2pwMl9jZGVmX2luZm9fdCAqaW5mbzsKKwlPUEpfVUlOVDE2IGksIG4sIGNuLCBhc29jLCBhY247CisJCisJaW5mbyA9IGNvbG9yLT5qcDJfY2RlZi0+aW5mbzsKKwluID0gY29sb3ItPmpwMl9jZGVmLT5uOworCQorCWZvcihpID0gMDsgaSA8IG47ICsraSkKKwl7CisJCS8qIFdBVENIOiBhY24gPSBhc29jIC0gMSAhICovCisJCWFzb2MgPSBpbmZvW2ldLmFzb2M7CisJCWNuID0gaW5mb1tpXS5jbjsKKwkJCisJCWlmKCBjbiA+PSBpbWFnZS0+bnVtY29tcHMpCisJCXsKKwkJCW9wal9ldmVudF9tc2cobWFuYWdlciwgRVZUX1dBUk5JTkcsICJvcGpfanAyX2FwcGx5X2NkZWY6IGNuPSVkLCBudW1jb21wcz0lZFxuIiwgY24sIGltYWdlLT5udW1jb21wcyk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZihhc29jID09IDAgfHwgYXNvYyA9PSA2NTUzNSkKKwkJeworCQkJaW1hZ2UtPmNvbXBzW2NuXS5hbHBoYSA9IGluZm9baV0udHlwOworCQkJY29udGludWU7CisJCX0KKwkJCisJCWFjbiA9IChPUEpfVUlOVDE2KShhc29jIC0gMSk7CisJCWlmKCBhY24gPj0gaW1hZ2UtPm51bWNvbXBzICkKKwkJeworCQkJb3BqX2V2ZW50X21zZyhtYW5hZ2VyLCBFVlRfV0FSTklORywgIm9wal9qcDJfYXBwbHlfY2RlZjogYWNuPSVkLCBudW1jb21wcz0lZFxuIiwgYWNuLCBpbWFnZS0+bnVtY29tcHMpOworCQkJY29udGludWU7CisJCX0KKwkJCisJCS8qIFN3YXAgb25seSBpZiBjb2xvciBjaGFubmVsICovCisJCWlmKChjbiAhPSBhY24pICYmIChpbmZvW2ldLnR5cCA9PSAwKSkKKwkJeworCQkJb3BqX2ltYWdlX2NvbXBfdCBzYXZlZDsKKwkJCU9QSl9VSU5UMTYgajsKKwkJCQorCQkJbWVtY3B5KCZzYXZlZCwgJmltYWdlLT5jb21wc1tjbl0sIHNpemVvZihvcGpfaW1hZ2VfY29tcF90KSk7CisJCQltZW1jcHkoJmltYWdlLT5jb21wc1tjbl0sICZpbWFnZS0+Y29tcHNbYWNuXSwgc2l6ZW9mKG9wal9pbWFnZV9jb21wX3QpKTsKKwkJCW1lbWNweSgmaW1hZ2UtPmNvbXBzW2Fjbl0sICZzYXZlZCwgc2l6ZW9mKG9wal9pbWFnZV9jb21wX3QpKTsKKwkJCQorCQkJLyogU3dhcCBjaGFubmVscyBpbiBmb2xsb3dpbmcgY2hhbm5lbCBkZWZpbml0aW9ucywgZG9uJ3QgYm90aGVyIHdpdGggaiA8PSBpIHRoYXQgYXJlIGFscmVhZHkgcHJvY2Vzc2VkICovCisJCQlmb3IgKGogPSAoT1BKX1VJTlQxNikoaSArIDFVKTsgaiA8IG4gOyArK2opCisJCQl7CisJCQkJaWYgKGluZm9bal0uY24gPT0gY24pIHsKKwkJCQkJaW5mb1tqXS5jbiA9IGFjbjsKKwkJCQl9CisJCQkJZWxzZSBpZiAoaW5mb1tqXS5jbiA9PSBhY24pIHsKKwkJCQkJaW5mb1tqXS5jbiA9IGNuOworCQkJCX0KKwkJCQkvKiBhc29jIGlzIHJlbGF0ZWQgdG8gY29sb3IgaW5kZXguIERvIG5vdCB1cGRhdGUuICovCisJCQl9CisJCX0KKwkJCisJCWltYWdlLT5jb21wc1tjbl0uYWxwaGEgPSBpbmZvW2ldLnR5cDsKKwl9CisJCisJaWYoY29sb3ItPmpwMl9jZGVmLT5pbmZvKSBvcGpfZnJlZShjb2xvci0+anAyX2NkZWYtPmluZm8pOworCQorCW9wal9mcmVlKGNvbG9yLT5qcDJfY2RlZik7IGNvbG9yLT5qcDJfY2RlZiA9IE5VTEw7CisJCit9LyoganAyX2FwcGx5X2NkZWYoKSAqLworCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2NkZWYoCW9wal9qcDJfdCAqIGpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfY2RlZl9oZWFkZXJfZGF0YSwKKwkJCQkJCQlPUEpfVUlOVDMyIHBfY2RlZl9oZWFkZXJfc2l6ZSwKKwkJCQkJCQlvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisJb3BqX2pwMl9jZGVmX2luZm9fdCAqY2RlZl9pbmZvOworCU9QSl9VSU5UMTYgaTsKKwlPUEpfVUlOVDMyIGxfdmFsdWU7CisKKwkvKiBwcmVjb25kaXRpb25zICovCisJYXNzZXJ0KGpwMiAhPSAwMCk7CisJYXNzZXJ0KHBfY2RlZl9oZWFkZXJfZGF0YSAhPSAwMCk7CisJYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgKHZvaWQpcF9jZGVmX2hlYWRlcl9zaXplOworCisJLyogUGFydCAxLCBJLjUuMy42OiAnVGhlIHNoYWxsIGJlIGF0IG1vc3Qgb25lIENoYW5uZWwgRGVmaW5pdGlvbiBib3gKKwkgKiBpbnNpZGUgYSBKUDIgSGVhZGVyIGJveC4nKi8KKwlpZihqcDItPmNvbG9yLmpwMl9jZGVmKSByZXR1cm4gT1BKX0ZBTFNFOworCisJaWYgKHBfY2RlZl9oZWFkZXJfc2l6ZSA8IDIpIHsKKwkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkluc3VmZmljaWVudCBkYXRhIGZvciBDREVGIGJveC5cbiIpOworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKworCW9wal9yZWFkX2J5dGVzKHBfY2RlZl9oZWFkZXJfZGF0YSwmbF92YWx1ZSAsMik7CQkJLyogTiAqLworCXBfY2RlZl9oZWFkZXJfZGF0YSs9IDI7CisKKwlpZiAoIChPUEpfVUlOVDE2KWxfdmFsdWUgPT0gMCl7IC8qIHN6dWt3MDAwOiBGSVhNRSAqLworCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTnVtYmVyIG9mIGNoYW5uZWwgZGVzY3JpcHRpb24gaXMgZXF1YWwgdG8gemVybyBpbiBDREVGIGJveC5cbiIpOworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKworCWlmIChwX2NkZWZfaGVhZGVyX3NpemUgPCAyICsgKE9QSl9VSU5UMzIpKE9QSl9VSU5UMTYpbF92YWx1ZSAqIDYpIHsKKwkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkluc3VmZmljaWVudCBkYXRhIGZvciBDREVGIGJveC5cbiIpOworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKworCWNkZWZfaW5mbyA9IChvcGpfanAyX2NkZWZfaW5mb190Kikgb3BqX21hbGxvYyhsX3ZhbHVlICogc2l6ZW9mKG9wal9qcDJfY2RlZl9pbmZvX3QpKTsKKwlpZiAoIWNkZWZfaW5mbykKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKworCWpwMi0+Y29sb3IuanAyX2NkZWYgPSAob3BqX2pwMl9jZGVmX3QqKW9wal9tYWxsb2Moc2l6ZW9mKG9wal9qcDJfY2RlZl90KSk7CisJaWYoIWpwMi0+Y29sb3IuanAyX2NkZWYpCisJeworCQlvcGpfZnJlZShjZGVmX2luZm8pOworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKwlqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvID0gY2RlZl9pbmZvOworCWpwMi0+Y29sb3IuanAyX2NkZWYtPm4gPSAoT1BKX1VJTlQxNikgbF92YWx1ZTsKKworCWZvcihpID0gMDsgaSA8IGpwMi0+Y29sb3IuanAyX2NkZWYtPm47ICsraSkgeworCQlvcGpfcmVhZF9ieXRlcyhwX2NkZWZfaGVhZGVyX2RhdGEsICZsX3ZhbHVlLCAyKTsJCQkvKiBDbl5pICovCisJCXBfY2RlZl9oZWFkZXJfZGF0YSArPTI7CisJCWNkZWZfaW5mb1tpXS5jbiA9IChPUEpfVUlOVDE2KSBsX3ZhbHVlOworCisJCW9wal9yZWFkX2J5dGVzKHBfY2RlZl9oZWFkZXJfZGF0YSwgJmxfdmFsdWUsIDIpOwkJCS8qIFR5cF5pICovCisJCXBfY2RlZl9oZWFkZXJfZGF0YSArPTI7CisJCWNkZWZfaW5mb1tpXS50eXAgPSAoT1BKX1VJTlQxNikgbF92YWx1ZTsKKworCQlvcGpfcmVhZF9ieXRlcyhwX2NkZWZfaGVhZGVyX2RhdGEsICZsX3ZhbHVlLCAyKTsJCQkvKiBBc29jXmkgKi8KKwkJcF9jZGVmX2hlYWRlcl9kYXRhICs9MjsKKwkJY2RlZl9pbmZvW2ldLmFzb2MgPSAoT1BKX1VJTlQxNikgbF92YWx1ZTsKKyAgIH0KKworCXJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfcmVhZF9jb2xyKCBvcGpfanAyX3QgKmpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfY29scl9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29scl9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisJT1BKX1VJTlQzMiBsX3ZhbHVlOworCisJLyogcHJlY29uZGl0aW9ucyAqLworCWFzc2VydChqcDIgIT0gMDApOworCWFzc2VydChwX2NvbHJfaGVhZGVyX2RhdGEgIT0gMDApOworCWFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisJaWYgKHBfY29scl9oZWFkZXJfc2l6ZSA8IDMpIHsKKwkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkJhZCBDT0xSIGhlYWRlciBib3ggKGJhZCBzaXplKVxuIik7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCisJLyogUGFydCAxLCBJLjUuMy4zIDogJ0EgY29uZm9ybWluZyBKUDIgcmVhZGVyIHNoYWxsIGlnbm9yZSBhbGwgQ29sb3VyCisJICogU3BlY2lmaWNhdGlvbiBib3hlcyBhZnRlciB0aGUgZmlyc3QuJworCSovCisJaWYoanAyLT5jb2xvci5qcDJfaGFzX2NvbHIpIHsKKwkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9JTkZPLCAiQSBjb25mb3JtaW5nIEpQMiByZWFkZXIgc2hhbGwgaWdub3JlIGFsbCBDb2xvdXIgU3BlY2lmaWNhdGlvbiBib3hlcyBhZnRlciB0aGUgZmlyc3QsIHNvIHdlIGlnbm9yZSB0aGlzIG9uZS5cbiIpOworCQlwX2NvbHJfaGVhZGVyX2RhdGEgKz0gcF9jb2xyX2hlYWRlcl9zaXplOworCQlyZXR1cm4gT1BKX1RSVUU7CisJfQorCisJb3BqX3JlYWRfYnl0ZXMocF9jb2xyX2hlYWRlcl9kYXRhLCZqcDItPm1ldGggLDEpOwkJCS8qIE1FVEggKi8KKwkrK3BfY29scl9oZWFkZXJfZGF0YTsKKworCW9wal9yZWFkX2J5dGVzKHBfY29scl9oZWFkZXJfZGF0YSwmanAyLT5wcmVjZWRlbmNlICwxKTsJCS8qIFBSRUNFREVOQ0UgKi8KKwkrK3BfY29scl9oZWFkZXJfZGF0YTsKKworCW9wal9yZWFkX2J5dGVzKHBfY29scl9oZWFkZXJfZGF0YSwmanAyLT5hcHByb3ggLDEpOwkJCS8qIEFQUFJPWCAqLworCSsrcF9jb2xyX2hlYWRlcl9kYXRhOworCisJaWYgKGpwMi0+bWV0aCA9PSAxKSB7CisJCWlmIChwX2NvbHJfaGVhZGVyX3NpemUgPCA3KSB7CisJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQmFkIENPTFIgaGVhZGVyIGJveCAoYmFkIHNpemU6ICVkKVxuIiwgcF9jb2xyX2hlYWRlcl9zaXplKTsKKwkJCXJldHVybiBPUEpfRkFMU0U7CisJCX0KKwkJaWYgKChwX2NvbHJfaGVhZGVyX3NpemUgPiA3KSAmJiAoanAyLT5lbnVtY3MgIT0gMTQpKSB7IC8qIGhhbmRsZWQgYmVsb3cgZm9yIENJRUxhYikgKi8KKwkJCS8qIHRlc3RjYXNlIEFsdG9uYV9UZWNobmljYWxfdjIwX3g0LnBkZiAqLworCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiQmFkIENPTFIgaGVhZGVyIGJveCAoYmFkIHNpemU6ICVkKVxuIiwgcF9jb2xyX2hlYWRlcl9zaXplKTsKKwkJfQorCisJCW9wal9yZWFkX2J5dGVzKHBfY29scl9oZWFkZXJfZGF0YSwmanAyLT5lbnVtY3MgLDQpOwkJCS8qIEVudW1DUyAqLworCisJCXBfY29scl9oZWFkZXJfZGF0YSArPSA0OworCisJCWlmKGpwMi0+ZW51bWNzID09IDE0KS8qIENJRUxhYiAqLworCQl7CisJCQlPUEpfVUlOVDMyICpjaWVsYWI7CisJCQlPUEpfVUlOVDMyIHJsLCBvbCwgcmEsIG9hLCByYiwgb2IsIGlsOworCisJCQljaWVsYWIgPSAoT1BKX1VJTlQzMiopb3BqX21hbGxvYyg5ICogc2l6ZW9mKE9QSl9VSU5UMzIpKTsKKwkJCWNpZWxhYlswXSA9IDE0OyAvKiBlbnVtY3MgKi8KKwkJCQorCQkJLyogZGVmYXVsdCB2YWx1ZXMgKi8KKwkJCXJsID0gcmEgPSByYiA9IG9sID0gb2EgPSBvYiA9IDA7CisJCQlpbCA9IDB4MDA0NDM1MzA7IC8qIEQ1MCAqLworCQkJY2llbGFiWzFdID0gMHg0NDQ1NDYwMDsvKiBERUYgKi8KKworCQkJaWYocF9jb2xyX2hlYWRlcl9zaXplID09IDM1KQorCQkJeworCQkJCW9wal9yZWFkX2J5dGVzKHBfY29scl9oZWFkZXJfZGF0YSwgJnJsLCA0KTsKKwkJCQlwX2NvbHJfaGVhZGVyX2RhdGEgKz0gNDsKKwkJCQlvcGpfcmVhZF9ieXRlcyhwX2NvbHJfaGVhZGVyX2RhdGEsICZvbCwgNCk7CisJCQkJcF9jb2xyX2hlYWRlcl9kYXRhICs9IDQ7CisJCQkJb3BqX3JlYWRfYnl0ZXMocF9jb2xyX2hlYWRlcl9kYXRhLCAmcmEsIDQpOworCQkJCXBfY29scl9oZWFkZXJfZGF0YSArPSA0OworCQkJCW9wal9yZWFkX2J5dGVzKHBfY29scl9oZWFkZXJfZGF0YSwgJm9hLCA0KTsKKwkJCQlwX2NvbHJfaGVhZGVyX2RhdGEgKz0gNDsKKwkJCQlvcGpfcmVhZF9ieXRlcyhwX2NvbHJfaGVhZGVyX2RhdGEsICZyYiwgNCk7CisJCQkJcF9jb2xyX2hlYWRlcl9kYXRhICs9IDQ7CisJCQkJb3BqX3JlYWRfYnl0ZXMocF9jb2xyX2hlYWRlcl9kYXRhLCAmb2IsIDQpOworCQkJCXBfY29scl9oZWFkZXJfZGF0YSArPSA0OworCQkJCW9wal9yZWFkX2J5dGVzKHBfY29scl9oZWFkZXJfZGF0YSwgJmlsLCA0KTsKKwkJCQlwX2NvbHJfaGVhZGVyX2RhdGEgKz0gNDsKKwkJCQkKKwkJCQljaWVsYWJbMV0gPSAwOworCQkJfQorCQkJZWxzZSBpZihwX2NvbHJfaGVhZGVyX3NpemUgIT0gNykKKwkJCXsKKwkJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJCYWQgQ09MUiBoZWFkZXIgYm94IChDSUVMYWIsIGJhZCBzaXplOiAlZClcbiIsIHBfY29scl9oZWFkZXJfc2l6ZSk7CisJCQl9CisJCQljaWVsYWJbMl0gPSBybDsgY2llbGFiWzRdID0gcmE7IGNpZWxhYls2XSA9IHJiOworCQkJY2llbGFiWzNdID0gb2w7IGNpZWxhYls1XSA9IG9hOyBjaWVsYWJbN10gPSBvYjsKKwkJCWNpZWxhYls4XSA9IGlsOworCisJCQlqcDItPmNvbG9yLmljY19wcm9maWxlX2J1ZiA9IChPUEpfQllURSopY2llbGFiOworCQkJanAyLT5jb2xvci5pY2NfcHJvZmlsZV9sZW4gPSAwOworCQl9CisJCWpwMi0+Y29sb3IuanAyX2hhc19jb2xyID0gMTsKKwl9CisJZWxzZSBpZiAoanAyLT5tZXRoID09IDIpIHsKKwkJLyogSUNDIHByb2ZpbGUgKi8KKwkJT1BKX0lOVDMyIGl0X2ljY192YWx1ZSA9IDA7CisJCU9QSl9JTlQzMiBpY2NfbGVuID0gKE9QSl9JTlQzMilwX2NvbHJfaGVhZGVyX3NpemUgLSAzOworCisJCWpwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfbGVuID0gKE9QSl9VSU5UMzIpaWNjX2xlbjsKKwkJanAyLT5jb2xvci5pY2NfcHJvZmlsZV9idWYgPSAoT1BKX0JZVEUqKSBvcGpfY2FsbG9jKDEsKHNpemVfdClpY2NfbGVuKTsKKwkJaWYgKCFqcDItPmNvbG9yLmljY19wcm9maWxlX2J1ZikKKwkJeworCQkJanAyLT5jb2xvci5pY2NfcHJvZmlsZV9sZW4gPSAwOworCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJfQorCisJCWZvciAoaXRfaWNjX3ZhbHVlID0gMDsgaXRfaWNjX3ZhbHVlIDwgaWNjX2xlbjsgKytpdF9pY2NfdmFsdWUpCisJCXsKKwkJCW9wal9yZWFkX2J5dGVzKHBfY29scl9oZWFkZXJfZGF0YSwmbF92YWx1ZSwxKTsJCS8qIGljYyB2YWx1ZXMgKi8KKwkJCSsrcF9jb2xyX2hlYWRlcl9kYXRhOworCQkJanAyLT5jb2xvci5pY2NfcHJvZmlsZV9idWZbaXRfaWNjX3ZhbHVlXSA9IChPUEpfQllURSkgbF92YWx1ZTsKKwkJfQorCSAgICAKKwkJanAyLT5jb2xvci5qcDJfaGFzX2NvbHIgPSAxOworCX0KKwllbHNlIGlmIChqcDItPm1ldGggPiAyKQorCXsKKwkJLyoJSVNPL0lFQyAxNTQ0NC0xOjIwMDQgKEUpLCBUYWJsZSBJLjkgTGVnYWwgTUVUSCB2YWx1ZXM6CisJCWNvbmZvcm1pbmcgSlAyIHJlYWRlciBzaGFsbCBpZ25vcmUgdGhlIGVudGlyZSBDb2xvdXIgU3BlY2lmaWNhdGlvbiBib3guKi8KKwkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9JTkZPLCAiQ09MUiBCT1ggbWV0aCB2YWx1ZSBpcyBub3QgYSByZWd1bGFyIHZhbHVlICglZCksICIKKwkJCSJzbyB3ZSB3aWxsIGlnbm9yZSB0aGUgZW50aXJlIENvbG91ciBTcGVjaWZpY2F0aW9uIGJveC4gXG4iLCBqcDItPm1ldGgpOworCX0KKwlyZXR1cm4gT1BKX1RSVUU7Cit9CisKK09QSl9CT09MIG9wal9qcDJfZGVjb2RlKG9wal9qcDJfdCAqanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QqIHBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCit7CisJaWYgKCFwX2ltYWdlKQorCQlyZXR1cm4gT1BKX0ZBTFNFOworCisJLyogSjJLIGRlY29kaW5nICovCisJaWYoICEgb3BqX2oya19kZWNvZGUoanAyLT5qMmssIHBfc3RyZWFtLCBwX2ltYWdlLCBwX21hbmFnZXIpICkgeworCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRmFpbGVkIHRvIGRlY29kZSB0aGUgY29kZXN0cmVhbSBpbiB0aGUgSlAyIGZpbGVcbiIpOworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKworCWlmICghanAyLT5pZ25vcmVfcGNscl9jbWFwX2NkZWYpeworCQlpZiAoIW9wal9qcDJfY2hlY2tfY29sb3IocF9pbWFnZSwgJihqcDItPmNvbG9yKSwgcF9tYW5hZ2VyKSkgeworCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJfQorCisJCS8qIFNldCBJbWFnZSBDb2xvciBTcGFjZSAqLworCQlpZiAoanAyLT5lbnVtY3MgPT0gMTYpCisJCQlwX2ltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfU1JHQjsKKwkJZWxzZSBpZiAoanAyLT5lbnVtY3MgPT0gMTcpCisJCQlwX2ltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfR1JBWTsKKwkJZWxzZSBpZiAoanAyLT5lbnVtY3MgPT0gMTgpCisJCQlwX2ltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfU1lDQzsKKwkJZWxzZSBpZiAoanAyLT5lbnVtY3MgPT0gMjQpCisJCQlwX2ltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfRVlDQzsKKwkJZWxzZSBpZiAoanAyLT5lbnVtY3MgPT0gMTIpCisJCQlwX2ltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfQ01ZSzsKKwkJZWxzZQorCQkJcF9pbWFnZS0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX1VOS05PV047CisKKwkJaWYoanAyLT5jb2xvci5qcDJfcGNscikgeworCQkJLyogUGFydCAxLCBJLjUuMy40OiBFaXRoZXIgYm90aCBvciBub25lIDogKi8KKwkJCWlmKCAhanAyLT5jb2xvci5qcDJfcGNsci0+Y21hcCkKKwkJCQlvcGpfanAyX2ZyZWVfcGNscigmKGpwMi0+Y29sb3IpKTsKKwkJCWVsc2UgaWYgKHBfaW1hZ2UtPnBkZml1bV91c2VfY29sb3JzcGFjZSkKKwkJCQlvcGpfanAyX2FwcGx5X3BjbHIocF9pbWFnZSwgJihqcDItPmNvbG9yKSk7CisJCX0KKworCQkvKiBBcHBseSB0aGUgY29sb3Igc3BhY2UgaWYgbmVlZGVkICovCisJCWlmKGpwMi0+Y29sb3IuanAyX2NkZWYpIHsKKwkJCW9wal9qcDJfYXBwbHlfY2RlZihwX2ltYWdlLCAmKGpwMi0+Y29sb3IpLCBwX21hbmFnZXIpOworCQl9CisKKwkJaWYoanAyLT5jb2xvci5pY2NfcHJvZmlsZV9idWYpIHsKKwkJCXBfaW1hZ2UtPmljY19wcm9maWxlX2J1ZiA9IGpwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfYnVmOworCQkJcF9pbWFnZS0+aWNjX3Byb2ZpbGVfbGVuID0ganAyLT5jb2xvci5pY2NfcHJvZmlsZV9sZW47CisJCQlqcDItPmNvbG9yLmljY19wcm9maWxlX2J1ZiA9IE5VTEw7CisJCX0KKwl9CisKKwlyZXR1cm4gT1BKX1RSVUU7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3dyaXRlX2pwMmgob3BqX2pwMl90ICpqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisJb3BqX2pwMl9pbWdfaGVhZGVyX3dyaXRlcl9oYW5kbGVyX3QgbF93cml0ZXJzIFs0XTsKKwlvcGpfanAyX2ltZ19oZWFkZXJfd3JpdGVyX2hhbmRsZXJfdCAqIGxfY3VycmVudF93cml0ZXI7CisKKwlPUEpfSU5UMzIgaSwgbF9uYl9wYXNzOworCS8qIHNpemUgb2YgZGF0YSBmb3Igc3VwZXIgYm94Ki8KKwlPUEpfVUlOVDMyIGxfanAyaF9zaXplID0gODsKKwlPUEpfQk9PTCBsX3Jlc3VsdCA9IE9QSl9UUlVFOworCisJLyogdG8gc3RvcmUgdGhlIGRhdGEgb2YgdGhlIHN1cGVyIGJveCAqLworCU9QSl9CWVRFIGxfanAyaF9kYXRhIFs4XTsKKwkKKwkvKiBwcmVjb25kaXRpb25zICovCisJYXNzZXJ0KHN0cmVhbSAhPSAwMCk7CisJYXNzZXJ0KGpwMiAhPSAwMCk7CisJYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisKKwltZW1zZXQobF93cml0ZXJzLDAsc2l6ZW9mKGxfd3JpdGVycykpOworCisJaWYgKGpwMi0+YnBjID09IDI1NSkgeworCQlsX25iX3Bhc3MgPSAzOworCQlsX3dyaXRlcnNbMF0uaGFuZGxlciA9IG9wal9qcDJfd3JpdGVfaWhkcjsKKwkJbF93cml0ZXJzWzFdLmhhbmRsZXIgPSBvcGpfanAyX3dyaXRlX2JwY2M7CisJCWxfd3JpdGVyc1syXS5oYW5kbGVyID0gb3BqX2pwMl93cml0ZV9jb2xyOworCX0KKwllbHNlIHsKKwkJbF9uYl9wYXNzID0gMjsKKwkJbF93cml0ZXJzWzBdLmhhbmRsZXIgPSBvcGpfanAyX3dyaXRlX2loZHI7CisJCWxfd3JpdGVyc1sxXS5oYW5kbGVyID0gb3BqX2pwMl93cml0ZV9jb2xyOworCX0KKwkKKwlpZiAoanAyLT5jb2xvci5qcDJfY2RlZiAhPSBOVUxMKSB7CisJCWxfd3JpdGVyc1tsX25iX3Bhc3NdLmhhbmRsZXIgPSBvcGpfanAyX3dyaXRlX2NkZWY7CisJCWxfbmJfcGFzcysrOworCX0KKwkKKwkvKiB3cml0ZSBib3ggaGVhZGVyICovCisJLyogd3JpdGUgSlAySCB0eXBlICovCisJb3BqX3dyaXRlX2J5dGVzKGxfanAyaF9kYXRhKzQsSlAyX0pQMkgsNCk7CisKKwlsX2N1cnJlbnRfd3JpdGVyID0gbF93cml0ZXJzOworCWZvciAoaT0wO2k8bF9uYl9wYXNzOysraSkgeworCQlsX2N1cnJlbnRfd3JpdGVyLT5tX2RhdGEgPSBsX2N1cnJlbnRfd3JpdGVyLT5oYW5kbGVyKGpwMiwmKGxfY3VycmVudF93cml0ZXItPm1fc2l6ZSkpOworCQlpZiAobF9jdXJyZW50X3dyaXRlci0+bV9kYXRhID09IDAwKSB7CisJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gaG9sZCBKUDIgSGVhZGVyIGRhdGFcbiIpOworCQkJbF9yZXN1bHQgPSBPUEpfRkFMU0U7CisJCQlicmVhazsKKwkJfQorCisJCWxfanAyaF9zaXplICs9IGxfY3VycmVudF93cml0ZXItPm1fc2l6ZTsKKwkJKytsX2N1cnJlbnRfd3JpdGVyOworCX0KKworCWlmICghIGxfcmVzdWx0KSB7CisJCWxfY3VycmVudF93cml0ZXIgPSBsX3dyaXRlcnM7CisJCWZvciAoaT0wO2k8bF9uYl9wYXNzOysraSkgeworCQkJaWYgKGxfY3VycmVudF93cml0ZXItPm1fZGF0YSAhPSAwMCkgeworCQkJCW9wal9mcmVlKGxfY3VycmVudF93cml0ZXItPm1fZGF0YSApOworCQkJfQorCQkJKytsX2N1cnJlbnRfd3JpdGVyOworCQl9CisKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisKKwkvKiB3cml0ZSBzdXBlciBib3ggc2l6ZSAqLworCW9wal93cml0ZV9ieXRlcyhsX2pwMmhfZGF0YSxsX2pwMmhfc2l6ZSw0KTsKKwkKKwkvKiB3cml0ZSBzdXBlciBib3ggZGF0YSBvbiBzdHJlYW0gKi8KKwlpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKHN0cmVhbSxsX2pwMmhfZGF0YSw4LHBfbWFuYWdlcikgIT0gOCkgeworCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIGVycm9yIHdoaWxlIHdyaXRpbmcgSlAyIEhlYWRlciBib3hcbiIpOworCQlsX3Jlc3VsdCA9IE9QSl9GQUxTRTsKKwl9CisJCisJaWYgKGxfcmVzdWx0KSB7CisJCWxfY3VycmVudF93cml0ZXIgPSBsX3dyaXRlcnM7CisJCWZvciAoaT0wO2k8bF9uYl9wYXNzOysraSkgeworCQkJaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShzdHJlYW0sbF9jdXJyZW50X3dyaXRlci0+bV9kYXRhLGxfY3VycmVudF93cml0ZXItPm1fc2l6ZSxwX21hbmFnZXIpICE9IGxfY3VycmVudF93cml0ZXItPm1fc2l6ZSkgeworCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJTdHJlYW0gZXJyb3Igd2hpbGUgd3JpdGluZyBKUDIgSGVhZGVyIGJveFxuIik7CisJCQkJbF9yZXN1bHQgPSBPUEpfRkFMU0U7CisJCQkJYnJlYWs7CisJCQl9CisJCQkrK2xfY3VycmVudF93cml0ZXI7CisJCX0KKwl9CisKKwlsX2N1cnJlbnRfd3JpdGVyID0gbF93cml0ZXJzOworCQorCS8qIGNsZWFudXAgKi8KKwlmb3IgKGk9MDtpPGxfbmJfcGFzczsrK2kpIHsKKwkJaWYgKGxfY3VycmVudF93cml0ZXItPm1fZGF0YSAhPSAwMCkgeworCQkJb3BqX2ZyZWUobF9jdXJyZW50X3dyaXRlci0+bV9kYXRhICk7CisJCX0KKwkJKytsX2N1cnJlbnRfd3JpdGVyOworCX0KKworCXJldHVybiBsX3Jlc3VsdDsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfd3JpdGVfZnR5cChvcGpfanAyX3QgKmpwMiwKKwkJCQkJCQlvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAorCQkJCQkJCW9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCit7CisJT1BKX1VJTlQzMiBpOworCU9QSl9VSU5UMzIgbF9mdHlwX3NpemUgPSAxNiArIDQgKiBqcDItPm51bWNsOworCU9QSl9CWVRFICogbF9mdHlwX2RhdGEsICogbF9jdXJyZW50X2RhdGFfcHRyOworCU9QSl9CT09MIGxfcmVzdWx0OworCisJLyogcHJlY29uZGl0aW9ucyAqLworCWFzc2VydChjaW8gIT0gMDApOworCWFzc2VydChqcDIgIT0gMDApOworCWFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisJbF9mdHlwX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX2NhbGxvYygxLGxfZnR5cF9zaXplKTsKKwkKKwlpZiAobF9mdHlwX2RhdGEgPT0gMDApIHsKKwkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGhhbmRsZSBmdHlwIGRhdGFcbiIpOworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKworCWxfY3VycmVudF9kYXRhX3B0ciA9IGxfZnR5cF9kYXRhOworCisJb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhX3B0ciwgbF9mdHlwX3NpemUsNCk7IC8qIGJveCBzaXplICovCisJbF9jdXJyZW50X2RhdGFfcHRyICs9IDQ7CisKKwlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGFfcHRyLCBKUDJfRlRZUCw0KTsgLyogRlRZUCAqLworCWxfY3VycmVudF9kYXRhX3B0ciArPSA0OworCisJb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhX3B0ciwganAyLT5icmFuZCw0KTsgLyogQlIgKi8KKwlsX2N1cnJlbnRfZGF0YV9wdHIgKz0gNDsKKworCW9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YV9wdHIsIGpwMi0+bWludmVyc2lvbiw0KTsgLyogTWluViAqLworCWxfY3VycmVudF9kYXRhX3B0ciArPSA0OworCisJZm9yIChpID0gMDsgaSA8IGpwMi0+bnVtY2w7IGkrKykgIHsKKwkJb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhX3B0ciwganAyLT5jbFtpXSw0KTsJLyogQ0wgKi8KKwl9CisJCisJbF9yZXN1bHQgPSAob3BqX3N0cmVhbV93cml0ZV9kYXRhKGNpbyxsX2Z0eXBfZGF0YSxsX2Z0eXBfc2l6ZSxwX21hbmFnZXIpID09IGxfZnR5cF9zaXplKTsKKwlpZiAoISBsX3Jlc3VsdCkKKwl7CisJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciB3aGlsZSB3cml0aW5nIGZ0eXAgZGF0YSB0byBzdHJlYW1cbiIpOworCX0KKworCW9wal9mcmVlKGxfZnR5cF9kYXRhKTsKKwkKKwlyZXR1cm4gbF9yZXN1bHQ7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3dyaXRlX2pwMmMob3BqX2pwMl90ICpqcDIsCisJCQkJCQkJb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKKwkJCQkJCQlvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQoreworCU9QSl9PRkZfVCBqMmtfY29kZXN0cmVhbV9leGl0OworCU9QSl9CWVRFIGxfZGF0YV9oZWFkZXIgWzhdOworCQorCS8qIHByZWNvbmRpdGlvbnMgKi8KKwlhc3NlcnQoanAyICE9IDAwKTsKKwlhc3NlcnQoY2lvICE9IDAwKTsKKwlhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKwlhc3NlcnQob3BqX3N0cmVhbV9oYXNfc2VlayhjaW8pKTsKKwkKKwlqMmtfY29kZXN0cmVhbV9leGl0ID0gb3BqX3N0cmVhbV90ZWxsKGNpbyk7CisJb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgIChPUEpfVUlOVDMyKSAoajJrX2NvZGVzdHJlYW1fZXhpdCAtIGpwMi0+ajJrX2NvZGVzdHJlYW1fb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgNCk7IC8qIHNpemUgb2YgY29kZXN0cmVhbSAqLworCW9wal93cml0ZV9ieXRlcyhsX2RhdGFfaGVhZGVyICsgNCxKUDJfSlAyQyw0KTsJCQkJCQkJCQkgICAvKiBKUDJDICovCisKKwlpZiAoISBvcGpfc3RyZWFtX3NlZWsoY2lvLGpwMi0+ajJrX2NvZGVzdHJlYW1fb2Zmc2V0LHBfbWFuYWdlcikpIHsKKwkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWxlZCB0byBzZWVrIGluIHRoZSBzdHJlYW0uXG4iKTsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisJCisJaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShjaW8sbF9kYXRhX2hlYWRlciw4LHBfbWFuYWdlcikgIT0gOCkgeworCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRmFpbGVkIHRvIHNlZWsgaW4gdGhlIHN0cmVhbS5cbiIpOworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKworCWlmICghIG9wal9zdHJlYW1fc2VlayhjaW8sajJrX2NvZGVzdHJlYW1fZXhpdCxwX21hbmFnZXIpKSB7CisJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gc2VlayBpbiB0aGUgc3RyZWFtLlxuIik7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCisJcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl93cml0ZV9qcCgJb3BqX2pwMl90ICpqcDIsCisJCQkgICAgCQkgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKKwkJCQkgICAgCQlvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQoreworCS8qIDEyIGJ5dGVzIHdpbGwgYmUgcmVhZCAqLworCU9QSl9CWVRFIGxfc2lnbmF0dXJlX2RhdGEgWzEyXTsKKworCS8qIHByZWNvbmRpdGlvbnMgKi8KKwlhc3NlcnQoY2lvICE9IDAwKTsKKwlhc3NlcnQoanAyICE9IDAwKTsKKwlhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworCS8qIHdyaXRlIGJveCBsZW5ndGggKi8KKwlvcGpfd3JpdGVfYnl0ZXMobF9zaWduYXR1cmVfZGF0YSwxMiw0KTsKKwkvKiB3cml0ZXMgYm94IHR5cGUgKi8KKwlvcGpfd3JpdGVfYnl0ZXMobF9zaWduYXR1cmVfZGF0YSs0LEpQMl9KUCw0KTsKKwkvKiB3cml0ZXMgbWFnaWMgbnVtYmVyKi8KKwlvcGpfd3JpdGVfYnl0ZXMobF9zaWduYXR1cmVfZGF0YSs4LDB4MGQwYTg3MGEsNCk7CisJCisJaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShjaW8sbF9zaWduYXR1cmVfZGF0YSwxMixwX21hbmFnZXIpICE9IDEyKSB7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCisJcmV0dXJuIE9QSl9UUlVFOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogSlAyIGRlY29kZXIgaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgb3BqX2pwMl9zZXR1cF9kZWNvZGVyKG9wal9qcDJfdCAqanAyLCBvcGpfZHBhcmFtZXRlcnNfdCAqcGFyYW1ldGVycykKK3sKKwkvKiBzZXR1cCB0aGUgSjJLIGNvZGVjICovCisJb3BqX2oya19zZXR1cF9kZWNvZGVyKGpwMi0+ajJrLCBwYXJhbWV0ZXJzKTsKKworCS8qIGZ1cnRoZXIgSlAyIGluaXRpYWxpemF0aW9ucyBnbyBoZXJlICovCisJanAyLT5jb2xvci5qcDJfaGFzX2NvbHIgPSAwOworICAgIGpwMi0+aWdub3JlX3BjbHJfY21hcF9jZGVmID0gcGFyYW1ldGVycy0+ZmxhZ3MgJiBPUEpfRFBBUkFNRVRFUlNfSUdOT1JFX1BDTFJfQ01BUF9DREVGX0ZMQUc7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBKUDIgZW5jb2RlciBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworT1BKX0JPT0wgb3BqX2pwMl9zZXR1cF9lbmNvZGVyKAlvcGpfanAyX3QgKmpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY3BhcmFtZXRlcnNfdCAqcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQoreworCU9QSl9VSU5UMzIgaTsKKwlPUEpfVUlOVDMyIGRlcHRoXzA7CisgIE9QSl9VSU5UMzIgc2lnbjsKKwlPUEpfVUlOVDMyIGFscGhhX2NvdW50OworCU9QSl9VSU5UMzIgY29sb3JfY2hhbm5lbHMgPSAwVTsKKwlPUEpfVUlOVDMyIGFscGhhX2NoYW5uZWwgPSAwVTsKKwkKKworCWlmKCFqcDIgfHwgIXBhcmFtZXRlcnMgfHwgIWltYWdlKQorCQlyZXR1cm4gT1BKX0ZBTFNFOworCisJLyogc2V0dXAgdGhlIEoySyBjb2RlYyAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS8qIENoZWNrIGlmIG51bWJlciBvZiBjb21wb25lbnRzIHJlc3BlY3RzIHN0YW5kYXJkICovCisJaWYgKGltYWdlLT5udW1jb21wcyA8IDEgfHwgaW1hZ2UtPm51bWNvbXBzID4gMTYzODQpIHsKKwkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkludmFsaWQgbnVtYmVyIG9mIGNvbXBvbmVudHMgc3BlY2lmaWVkIHdoaWxlIHNldHRpbmcgdXAgSlAyIGVuY29kZXJcbiIpOworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKworCWlmIChvcGpfajJrX3NldHVwX2VuY29kZXIoanAyLT5qMmssIHBhcmFtZXRlcnMsIGltYWdlLCBwX21hbmFnZXIgKSA9PSBPUEpfRkFMU0UpIHsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisKKwkvKiBzZXR1cCB0aGUgSlAyIGNvZGVjICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCQorCS8qIFByb2ZpbGUgYm94ICovCisKKwlqcDItPmJyYW5kID0gSlAyX0pQMjsJLyogQlIgKi8KKwlqcDItPm1pbnZlcnNpb24gPSAwOwkvKiBNaW5WICovCisJanAyLT5udW1jbCA9IDE7CisJanAyLT5jbCA9IChPUEpfVUlOVDMyKikgb3BqX21hbGxvYyhqcDItPm51bWNsICogc2l6ZW9mKE9QSl9VSU5UMzIpKTsKKwlpZiAoIWpwMi0+Y2wpeworCQlqcDItPmNsID0gTlVMTDsKKwkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHdoZW4gc2V0dXAgdGhlIEpQMiBlbmNvZGVyXG4iKTsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisJanAyLT5jbFswXSA9IEpQMl9KUDI7CS8qIENMMCA6IEpQMiAqLworCisJLyogSW1hZ2UgSGVhZGVyIGJveCAqLworCisJanAyLT5udW1jb21wcyA9IGltYWdlLT5udW1jb21wczsJLyogTkMgKi8KKwlqcDItPmNvbXBzID0gKG9wal9qcDJfY29tcHNfdCopIG9wal9tYWxsb2MoanAyLT5udW1jb21wcyAqIHNpemVvZihvcGpfanAyX2NvbXBzX3QpKTsKKwlpZiAoIWpwMi0+Y29tcHMpIHsKKwkJanAyLT5jb21wcyA9IE5VTEw7CisJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB3aGVuIHNldHVwIHRoZSBKUDIgZW5jb2RlclxuIik7CisJCS8qIE1lbW9yeSBvZiBqcDItPmNsIHdpbGwgYmUgZnJlZWQgYnkgb3BqX2pwMl9kZXN0cm95ICovCisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCisJanAyLT5oID0gaW1hZ2UtPnkxIC0gaW1hZ2UtPnkwOwkJLyogSEVJR0hUICovCisJanAyLT53ID0gaW1hZ2UtPngxIC0gaW1hZ2UtPngwOwkJLyogV0lEVEggKi8KKwkvKiBCUEMgKi8KKwlkZXB0aF8wID0gaW1hZ2UtPmNvbXBzWzBdLnByZWMgLSAxOworCXNpZ24gPSBpbWFnZS0+Y29tcHNbMF0uc2duZDsKKwlqcDItPmJwYyA9IGRlcHRoXzAgKyAoc2lnbiA8PCA3KTsKKwlmb3IgKGkgPSAxOyBpIDwgaW1hZ2UtPm51bWNvbXBzOyBpKyspIHsKKwkJT1BKX1VJTlQzMiBkZXB0aCA9IGltYWdlLT5jb21wc1tpXS5wcmVjIC0gMTsKKwkJc2lnbiA9IGltYWdlLT5jb21wc1tpXS5zZ25kOworCQlpZiAoZGVwdGhfMCAhPSBkZXB0aCkKKwkJCWpwMi0+YnBjID0gMjU1OworCX0KKwlqcDItPkMgPSA3OwkJCS8qIEMgOiBBbHdheXMgNyAqLworCWpwMi0+VW5rQyA9IDA7CQkvKiBVbmtDLCBjb2xvcnNwYWNlIHNwZWNpZmllZCBpbiBjb2xyIGJveCAqLworCWpwMi0+SVBSID0gMDsJCS8qIElQUiwgbm8gaW50ZWxsZWN0dWFsIHByb3BlcnR5ICovCisJCisJLyogQml0c1BlckNvbXBvbmVudCBib3ggKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW1hZ2UtPm51bWNvbXBzOyBpKyspIHsKKwkJanAyLT5jb21wc1tpXS5icGNjID0gaW1hZ2UtPmNvbXBzW2ldLnByZWMgLSAxICsgKGltYWdlLT5jb21wc1tpXS5zZ25kIDw8IDcpOworCX0KKworCS8qIENvbG91ciBTcGVjaWZpY2F0aW9uIGJveCAqLworICAgIGlmKGltYWdlLT5pY2NfcHJvZmlsZV9sZW4pIHsKKyAgICAgICAganAyLT5tZXRoID0gMjsKKyAgICAgICAganAyLT5lbnVtY3MgPSAwOworICAgIH0gCisgICAgZWxzZSB7CisgICAgICAgIGpwMi0+bWV0aCA9IDE7CisgICAgICAgIGlmIChpbWFnZS0+Y29sb3Jfc3BhY2UgPT0gMSkKKyAgICAgICAgICAgIGpwMi0+ZW51bWNzID0gMTY7CS8qIHNSR0IgYXMgZGVmaW5lZCBieSBJRUMgNjE5NjYtMi0xICovCisgICAgICAgIGVsc2UgaWYgKGltYWdlLT5jb2xvcl9zcGFjZSA9PSAyKQorICAgICAgICAgICAganAyLT5lbnVtY3MgPSAxNzsJLyogZ3JleXNjYWxlICovCisgICAgICAgIGVsc2UgaWYgKGltYWdlLT5jb2xvcl9zcGFjZSA9PSAzKQorICAgICAgICAgICAganAyLT5lbnVtY3MgPSAxODsJLyogWVVWICovCisgICAgfQorCisJLyogQ2hhbm5lbCBEZWZpbml0aW9uIGJveCAqLworCS8qIEZJWE1FIG5vdCBwcm92aWRlZCBieSBwYXJhbWV0ZXJzICovCisJLyogV2UgdHJ5IHRvIGRvIHdoYXQgd2UgY2FuLi4uICovCisJYWxwaGFfY291bnQgPSAwVTsKKwlmb3IgKGkgPSAwOyBpIDwgaW1hZ2UtPm51bWNvbXBzOyBpKyspIHsKKwkJaWYgKGltYWdlLT5jb21wc1tpXS5hbHBoYSAhPSAwKSB7CisJCQlhbHBoYV9jb3VudCsrOworCQkJYWxwaGFfY2hhbm5lbCA9IGk7CisJCX0KKwl9CisJaWYgKGFscGhhX2NvdW50ID09IDFVKSB7IC8qIG5vIHdheSB0byBkZWFsIHdpdGggbW9yZSB0aGFuIDEgYWxwaGEgY2hhbm5lbCAqLworCQlzd2l0Y2ggKGpwMi0+ZW51bWNzKSB7CisJCQljYXNlIDE2OgorCQkJY2FzZSAxODoKKwkJCQljb2xvcl9jaGFubmVscyA9IDM7CisJCQkJYnJlYWs7CisJCQljYXNlIDE3OgorCQkJCWNvbG9yX2NoYW5uZWxzID0gMTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYWxwaGFfY291bnQgPSAwVTsKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoYWxwaGFfY291bnQgPT0gMFUpIHsKKwkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkFscGhhIGNoYW5uZWwgc3BlY2lmaWVkIGJ1dCB1bmtub3duIGVudW1jcy4gTm8gY2RlZiBib3ggd2lsbCBiZSBjcmVhdGVkLlxuIik7CisJCX0gZWxzZSBpZiAoaW1hZ2UtPm51bWNvbXBzIDwgKGNvbG9yX2NoYW5uZWxzKzEpKSB7CisJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJBbHBoYSBjaGFubmVsIHNwZWNpZmllZCBidXQgbm90IGVub3VnaCBpbWFnZSBjb21wb25lbnRzIGZvciBhbiBhdXRvbWF0aWMgY2RlZiBib3ggY3JlYXRpb24uXG4iKTsKKwkJCWFscGhhX2NvdW50ID0gMFU7CisJCX0gZWxzZSBpZiAoKE9QSl9VSU5UMzIpYWxwaGFfY2hhbm5lbCA8IGNvbG9yX2NoYW5uZWxzKSB7CisJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJBbHBoYSBjaGFubmVsIHBvc2l0aW9uIGNvbmZsaWN0cyB3aXRoIGNvbG9yIGNoYW5uZWwuIE5vIGNkZWYgYm94IHdpbGwgYmUgY3JlYXRlZC5cbiIpOworCQkJYWxwaGFfY291bnQgPSAwVTsKKwkJfQorCX0gZWxzZSBpZiAoYWxwaGFfY291bnQgPiAxKSB7CisJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIk11bHRpcGxlIGFscGhhIGNoYW5uZWxzIHNwZWNpZmllZC4gTm8gY2RlZiBib3ggd2lsbCBiZSBjcmVhdGVkLlxuIik7CisJfQorCWlmIChhbHBoYV9jb3VudCA9PSAxVSkgeyAvKiBpZiBoZXJlLCB3ZSBrbm93IHdoYXQgd2UgY2FuIGRvICovCisJCWpwMi0+Y29sb3IuanAyX2NkZWYgPSAob3BqX2pwMl9jZGVmX3QqKW9wal9tYWxsb2Moc2l6ZW9mKG9wal9qcDJfY2RlZl90KSk7CisJCWlmKCFqcDItPmNvbG9yLmpwMl9jZGVmKSB7CisJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gc2V0dXAgdGhlIEpQMiBlbmNvZGVyXG4iKTsKKwkJCXJldHVybiBPUEpfRkFMU0U7CisJCX0KKwkJLyogbm8gbWVtc2V0IG5lZWRlZCwgYWxsIHZhbHVlcyB3aWxsIGJlIG92ZXJ3cml0dGVuIGV4Y2VwdCBpZiBqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvIGFsbG9jYXRpb24gZmFpbHMsICovCisJCS8qIGluIHdoaWNoIGNhc2UganAyLT5jb2xvci5qcDJfY2RlZi0+aW5mbyB3aWxsIGJlIE5VTEwgPT4gdmFsaWQgZm9yIGRlc3RydWN0aW9uICovCisJCWpwMi0+Y29sb3IuanAyX2NkZWYtPmluZm8gPSAob3BqX2pwMl9jZGVmX2luZm9fdCopIG9wal9tYWxsb2MoaW1hZ2UtPm51bWNvbXBzICogc2l6ZW9mKG9wal9qcDJfY2RlZl9pbmZvX3QpKTsKKwkJaWYgKCFqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvKSB7CisJCQkvKiBtZW1vcnkgd2lsbCBiZSBmcmVlZCBieSBvcGpfanAyX2Rlc3Ryb3kgKi8KKwkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBzZXR1cCB0aGUgSlAyIGVuY29kZXJcbiIpOworCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJfQorCQlqcDItPmNvbG9yLmpwMl9jZGVmLT5uID0gKE9QSl9VSU5UMTYpIGltYWdlLT5udW1jb21wczsgLyogY2FzdCBpcyB2YWxpZCA6IGltYWdlLT5udW1jb21wcyBbMSwxNjM4NF0gKi8KKwkJZm9yIChpID0gMFU7IGkgPCBjb2xvcl9jaGFubmVsczsgaSsrKSB7CisJCQlqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvW2ldLmNuID0gKE9QSl9VSU5UMTYpaTsgLyogY2FzdCBpcyB2YWxpZCA6IGltYWdlLT5udW1jb21wcyBbMSwxNjM4NF0gKi8KKwkJCWpwMi0+Y29sb3IuanAyX2NkZWYtPmluZm9baV0udHlwID0gMFU7CisJCQlqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvW2ldLmFzb2MgPSAoT1BKX1VJTlQxNikoaSsxVSk7IC8qIE5vIG92ZXJmbG93ICsgY2FzdCBpcyB2YWxpZCA6IGltYWdlLT5udW1jb21wcyBbMSwxNjM4NF0gKi8KKwkJfQorCQlmb3IgKDsgaSA8IGltYWdlLT5udW1jb21wczsgaSsrKSB7CisJCQlpZiAoaW1hZ2UtPmNvbXBzW2ldLmFscGhhICE9IDApIHsgLyogd2UnbGwgYmUgaGVyZSBleGFjdGx5IG9uY2UgKi8KKwkJCQlqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvW2ldLmNuID0gKE9QSl9VSU5UMTYpaTsgLyogY2FzdCBpcyB2YWxpZCA6IGltYWdlLT5udW1jb21wcyBbMSwxNjM4NF0gKi8KKwkJCQlqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvW2ldLnR5cCA9IDFVOyAvKiBPcGFjaXR5IGNoYW5uZWwgKi8KKwkJCQlqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvW2ldLmFzb2MgPSAwVTsgLyogQXBwbHkgYWxwaGEgY2hhbm5lbCB0byB0aGUgd2hvbGUgaW1hZ2UgKi8KKwkJCX0gZWxzZSB7CisJCQkJLyogVW5rbm93biBjaGFubmVsICovCisJCQkJanAyLT5jb2xvci5qcDJfY2RlZi0+aW5mb1tpXS5jbiA9IChPUEpfVUlOVDE2KWk7IC8qIGNhc3QgaXMgdmFsaWQgOiBpbWFnZS0+bnVtY29tcHMgWzEsMTYzODRdICovCisJCQkJanAyLT5jb2xvci5qcDJfY2RlZi0+aW5mb1tpXS50eXAgPSA2NTUzNVU7CisJCQkJanAyLT5jb2xvci5qcDJfY2RlZi0+aW5mb1tpXS5hc29jID0gNjU1MzVVOworCQkJfQorCQl9CisJfQorCisJanAyLT5wcmVjZWRlbmNlID0gMDsJLyogUFJFQ0VERU5DRSAqLworCWpwMi0+YXBwcm94ID0gMDsJCS8qIEFQUFJPWCAqLworCisJanAyLT5qcGlwX29uID0gcGFyYW1ldGVycy0+anBpcF9vbjsKKworCXJldHVybiBPUEpfVFJVRTsKK30KKworT1BKX0JPT0wgb3BqX2pwMl9lbmNvZGUob3BqX2pwMl90ICpqcDIsCisJCQkJCQlvcGpfc3RyZWFtX3ByaXZhdGVfdCAqc3RyZWFtLAorCQkJCQkJb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQoreworCXJldHVybiBvcGpfajJrX2VuY29kZShqcDItPmoyaywgc3RyZWFtLCBwX21hbmFnZXIpOworfQorCitPUEpfQk9PTCBvcGpfanAyX2VuZF9kZWNvbXByZXNzKG9wal9qcDJfdCAqanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworCS8qIHByZWNvbmRpdGlvbnMgKi8KKwlhc3NlcnQoanAyICE9IDAwKTsKKwlhc3NlcnQoY2lvICE9IDAwKTsKKwlhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworCS8qIGN1c3RvbWl6YXRpb24gb2YgdGhlIGVuZCBlbmNvZGluZyAqLworCWlmICghIG9wal9qcDJfc2V0dXBfZW5kX2hlYWRlcl9yZWFkaW5nKGpwMiwgcF9tYW5hZ2VyKSkgeworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKworCS8qIHdyaXRlIGhlYWRlciAqLworCWlmICghIG9wal9qcDJfZXhlYyAoanAyLGpwMi0+bV9wcm9jZWR1cmVfbGlzdCxjaW8scF9tYW5hZ2VyKSkgeworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKworCXJldHVybiBvcGpfajJrX2VuZF9kZWNvbXByZXNzKGpwMi0+ajJrLCBjaW8sIHBfbWFuYWdlcik7Cit9CisKK09QSl9CT09MIG9wal9qcDJfZW5kX2NvbXByZXNzKAlvcGpfanAyX3QgKmpwMiwKKwkJCQkJCQkgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKKwkJCQkJCQkgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKwkvKiBwcmVjb25kaXRpb25zICovCisJYXNzZXJ0KGpwMiAhPSAwMCk7CisJYXNzZXJ0KGNpbyAhPSAwMCk7CisJYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisKKwkvKiBjdXN0b21pemF0aW9uIG9mIHRoZSBlbmQgZW5jb2RpbmcgKi8KKwlpZiAoISBvcGpfanAyX3NldHVwX2VuZF9oZWFkZXJfd3JpdGluZyhqcDIsIHBfbWFuYWdlcikpIHsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisKKwlpZiAoISBvcGpfajJrX2VuZF9jb21wcmVzcyhqcDItPmoyayxjaW8scF9tYW5hZ2VyKSkgeworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKworCS8qIHdyaXRlIGhlYWRlciAqLworCXJldHVybiBvcGpfanAyX2V4ZWMoanAyLGpwMi0+bV9wcm9jZWR1cmVfbGlzdCxjaW8scF9tYW5hZ2VyKTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfc2V0dXBfZW5kX2hlYWRlcl93cml0aW5nIChvcGpfanAyX3QgKmpwMiwgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQoreworCS8qIHByZWNvbmRpdGlvbnMgKi8KKwlhc3NlcnQoanAyICE9IDAwKTsKKwlhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworI2lmZGVmIFVTRV9KUElQCisJaWYoIGpwMi0+anBpcF9vbiApIHsKKwkJaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUoanAyLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qcGlwX3dyaXRlX2lwdHIsIHBfbWFuYWdlcikpIHsKKwkJCXJldHVybiBPUEpfRkFMU0U7CisJCX0KKwl9CisjZW5kaWYKKwlpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShqcDItPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2pwMl93cml0ZV9qcDJjLCBwX21hbmFnZXIpKSB7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCS8qIERFVkVMT1BFUiBDT1JORVIsIGFkZCB5b3VyIGN1c3RvbSBwcm9jZWR1cmVzICovCisjaWZkZWYgVVNFX0pQSVAKKyAgaWYoIGpwMi0+anBpcF9vbiApCisJeworCQlpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShqcDItPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2pwaXBfd3JpdGVfY2lkeCwgcF9tYW5hZ2VyKSkgeworCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJfQorCQlpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShqcDItPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2pwaXBfd3JpdGVfZmlkeCwgcF9tYW5hZ2VyKSkgeworCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJfQorCX0KKyNlbmRpZgorCXJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfc2V0dXBfZW5kX2hlYWRlcl9yZWFkaW5nIChvcGpfanAyX3QgKmpwMiwgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQoreworCS8qIHByZWNvbmRpdGlvbnMgKi8KKwlhc3NlcnQoanAyICE9IDAwKTsKKwlhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKwkKKwlpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShqcDItPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2pwMl9yZWFkX2hlYWRlcl9wcm9jZWR1cmUsIHBfbWFuYWdlcikpIHsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisJLyogREVWRUxPUEVSIENPUk5FUiwgYWRkIHlvdXIgY3VzdG9tIHByb2NlZHVyZXMgKi8KKwkKKwlyZXR1cm4gT1BKX1RSVUU7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX2RlZmF1bHRfdmFsaWRhdGlvbiAoCW9wal9qcDJfdCAqIGpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKwlPUEpfQk9PTCBsX2lzX3ZhbGlkID0gT1BKX1RSVUU7CisJT1BKX1VJTlQzMiBpOworCisJLyogcHJlY29uZGl0aW9ucyAqLworCWFzc2VydChqcDIgIT0gMDApOworCWFzc2VydChjaW8gIT0gMDApOworCWFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisJLyogSlBFRzIwMDAgY29kZWMgdmFsaWRhdGlvbiAqLworCisJLyogU1RBVEUgY2hlY2tpbmcgKi8KKwkvKiBtYWtlIHN1cmUgdGhlIHN0YXRlIGlzIGF0IDAgKi8KKwlsX2lzX3ZhbGlkICY9IChqcDItPmpwMl9zdGF0ZSA9PSBKUDJfU1RBVEVfTk9ORSk7CisKKwkvKiBtYWtlIHN1cmUgbm90IHJlYWRpbmcgYSBqcDJoID8/Pz8gV0VJUkQgKi8KKwlsX2lzX3ZhbGlkICY9IChqcDItPmpwMl9pbWdfc3RhdGUgPT0gSlAyX0lNR19TVEFURV9OT05FKTsKKworCS8qIFBPSU5URVIgdmFsaWRhdGlvbiAqLworCS8qIG1ha2Ugc3VyZSBhIGoyayBjb2RlYyBpcyBwcmVzZW50ICovCisJbF9pc192YWxpZCAmPSAoanAyLT5qMmsgIT0gMDApOworCisJLyogbWFrZSBzdXJlIGEgcHJvY2VkdXJlIGxpc3QgaXMgcHJlc2VudCAqLworCWxfaXNfdmFsaWQgJj0gKGpwMi0+bV9wcm9jZWR1cmVfbGlzdCAhPSAwMCk7CisKKwkvKiBtYWtlIHN1cmUgYSB2YWxpZGF0aW9uIGxpc3QgaXMgcHJlc2VudCAqLworCWxfaXNfdmFsaWQgJj0gKGpwMi0+bV92YWxpZGF0aW9uX2xpc3QgIT0gMDApOworCisJLyogUEFSQU1FVEVSIFZBTElEQVRJT04gKi8KKwkvKiBudW1iZXIgb2YgY29tcG9uZW50cyAqLworCWxfaXNfdmFsaWQgJj0gKGpwMi0+bnVtY2wgPiAwKTsKKwkvKiB3aWR0aCAqLworCWxfaXNfdmFsaWQgJj0gKGpwMi0+aCA+IDApOworCS8qIGhlaWdodCAqLworCWxfaXNfdmFsaWQgJj0gKGpwMi0+dyA+IDApOworCS8qIHByZWNpc2lvbiAqLworCWZvciAoaSA9IDA7IGkgPCBqcDItPm51bWNvbXBzOyArK2kpCXsKKwkJbF9pc192YWxpZCAmPSAoKGpwMi0+Y29tcHNbaV0uYnBjYyAmIDB4N0ZVKSA8IDM4VSk7IC8qIDAgaXMgdmFsaWQsIGlnbm9yZSBzaWduIGZvciBjaGVjayAqLworCX0KKworCS8qIE1FVEggKi8KKwlsX2lzX3ZhbGlkICY9ICgoanAyLT5tZXRoID4gMCkgJiYgKGpwMi0+bWV0aCA8IDMpKTsKKworCS8qIHN0cmVhbSB2YWxpZGF0aW9uICovCisJLyogYmFjayBhbmQgZm9ydGggaXMgbmVlZGVkICovCisJbF9pc192YWxpZCAmPSBvcGpfc3RyZWFtX2hhc19zZWVrKGNpbyk7CisKKwlyZXR1cm4gbF9pc192YWxpZDsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfcmVhZF9oZWFkZXJfcHJvY2VkdXJlKCAgb3BqX2pwMl90ICpqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisJb3BqX2pwMl9ib3hfdCBib3g7CisJT1BKX1VJTlQzMiBsX25iX2J5dGVzX3JlYWQ7CisJY29uc3Qgb3BqX2pwMl9oZWFkZXJfaGFuZGxlcl90ICogbF9jdXJyZW50X2hhbmRsZXI7CisJY29uc3Qgb3BqX2pwMl9oZWFkZXJfaGFuZGxlcl90ICogbF9jdXJyZW50X2hhbmRsZXJfbWlzcGxhY2VkOworCU9QSl9VSU5UMzIgbF9sYXN0X2RhdGFfc2l6ZSA9IE9QSl9CT1hfU0laRTsKKwlPUEpfVUlOVDMyIGxfY3VycmVudF9kYXRhX3NpemU7CisJT1BKX0JZVEUgKiBsX2N1cnJlbnRfZGF0YSA9IDAwOworCisJLyogcHJlY29uZGl0aW9ucyAqLworCWFzc2VydChzdHJlYW0gIT0gMDApOworCWFzc2VydChqcDIgIT0gMDApOworCWFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisJbF9jdXJyZW50X2RhdGEgPSAoT1BKX0JZVEUqKW9wal9jYWxsb2MoMSxsX2xhc3RfZGF0YV9zaXplKTsKKworCWlmIChsX2N1cnJlbnRfZGF0YSA9PSAwMCkgeworCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGpwZWcyMDAwIGZpbGUgaGVhZGVyXG4iKTsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisKKwl3aGlsZSAob3BqX2pwMl9yZWFkX2JveGhkcigmYm94LCZsX25iX2J5dGVzX3JlYWQsc3RyZWFtLHBfbWFuYWdlcikpIHsKKwkJLyogaXMgaXQgdGhlIGNvZGVzdHJlYW0gYm94ID8gKi8KKwkJaWYgKGJveC50eXBlID09IEpQMl9KUDJDKSB7CisJCQlpZiAoanAyLT5qcDJfc3RhdGUgJiBKUDJfU1RBVEVfSEVBREVSKSB7CisJCQkJanAyLT5qcDJfc3RhdGUgfD0gSlAyX1NUQVRFX0NPREVTVFJFQU07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKKwkJCQlyZXR1cm4gT1BKX1RSVUU7CisJCQl9CisJCQllbHNlIHsKKwkJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiYmFkIHBsYWNlZCBqcGVnIGNvZGVzdHJlYW1cbiIpOworCQkJCW9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKKwkJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQkJfQorCQl9CisJCWVsc2UgaWYJKGJveC5sZW5ndGggPT0gMCkgeworCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkNhbm5vdCBoYW5kbGUgYm94IG9mIHVuZGVmaW5lZCBzaXplc1xuIik7CisJCQlvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7CisJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQl9CisJCS8qIHRlc3RjYXNlIDE4NTEucGRmLlNJR1NFR1YuY2U5Ljk0OCAqLworICAgICAgICBlbHNlIGlmIChib3gubGVuZ3RoIDwgbF9uYl9ieXRlc19yZWFkKSB7CisJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiaW52YWxpZCBib3ggc2l6ZSAlZCAoJXgpXG4iLCBib3gubGVuZ3RoLCBib3gudHlwZSk7CisJCQlvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7CisJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQl9CisKKwkJbF9jdXJyZW50X2hhbmRsZXIgPSBvcGpfanAyX2ZpbmRfaGFuZGxlcihib3gudHlwZSk7CisJCWxfY3VycmVudF9oYW5kbGVyX21pc3BsYWNlZCA9IG9wal9qcDJfaW1nX2ZpbmRfaGFuZGxlcihib3gudHlwZSk7CisJCWxfY3VycmVudF9kYXRhX3NpemUgPSBib3gubGVuZ3RoIC0gbF9uYl9ieXRlc19yZWFkOworCisJCWlmICgobF9jdXJyZW50X2hhbmRsZXIgIT0gMDApIHx8IChsX2N1cnJlbnRfaGFuZGxlcl9taXNwbGFjZWQgIT0gMDApKSB7CisJCQlpZiAobF9jdXJyZW50X2hhbmRsZXIgPT0gMDApIHsKKwkJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJGb3VuZCBhIG1pc3BsYWNlZCAnJWMlYyVjJWMnIGJveCBvdXRzaWRlIGpwMmggYm94XG4iLCAoT1BKX0JZVEUpKGJveC50eXBlPj4yNCksIChPUEpfQllURSkoYm94LnR5cGU+PjE2KSwgKE9QSl9CWVRFKShib3gudHlwZT4+OCksIChPUEpfQllURSkoYm94LnR5cGU+PjApKTsKKwkJCQlpZiAoanAyLT5qcDJfc3RhdGUgJiBKUDJfU1RBVEVfSEVBREVSKSB7CisJCQkJCS8qIHJlYWQgYW55d2F5LCB3ZSBhbHJlYWR5IGhhdmUganAyaCAqLworCQkJCQlsX2N1cnJlbnRfaGFuZGxlciA9IGxfY3VycmVudF9oYW5kbGVyX21pc3BsYWNlZDsKKwkJCQl9IGVsc2UgeworCQkJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJKUEVHMjAwMCBIZWFkZXIgYm94IG5vdCByZWFkIHlldCwgJyVjJWMlYyVjJyBib3ggd2lsbCBiZSBpZ25vcmVkXG4iLCAoT1BKX0JZVEUpKGJveC50eXBlPj4yNCksIChPUEpfQllURSkoYm94LnR5cGU+PjE2KSwgKE9QSl9CWVRFKShib3gudHlwZT4+OCksIChPUEpfQllURSkoYm94LnR5cGU+PjApKTsKKwkJCQkJanAyLT5qcDJfc3RhdGUgfD0gSlAyX1NUQVRFX1VOS05PV047CisJCQkJCWlmIChvcGpfc3RyZWFtX3NraXAoc3RyZWFtLGxfY3VycmVudF9kYXRhX3NpemUscF9tYW5hZ2VyKSAhPSBsX2N1cnJlbnRfZGF0YV9zaXplKSB7CisJCQkJCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlByb2JsZW0gd2l0aCBza2lwcGluZyBKUEVHMjAwMCBib3gsIHN0cmVhbSBlcnJvclxuIik7CisJCQkJCQkJb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOworCQkJCQkJCXJldHVybiBPUEpfRkFMU0U7CisJCQkJCX0KKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJaWYgKChPUEpfT0ZGX1QpbF9jdXJyZW50X2RhdGFfc2l6ZSA+IG9wal9zdHJlYW1fZ2V0X251bWJlcl9ieXRlX2xlZnQoc3RyZWFtKSkgeworCQkJCS8qIGRvIG5vdCBldmVuIHRyeSB0byBtYWxsb2MgaWYgd2UgY2FuJ3QgcmVhZCAqLworCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJJbnZhbGlkIGJveCBzaXplICVkIGZvciBib3ggJyVjJWMlYyVjJy4gTmVlZCAlZCBieXRlcywgJWQgYnl0ZXMgcmVtYWluaW5nIFxuIiwgYm94Lmxlbmd0aCwgKE9QSl9CWVRFKShib3gudHlwZT4+MjQpLCAoT1BKX0JZVEUpKGJveC50eXBlPj4xNiksIChPUEpfQllURSkoYm94LnR5cGU+PjgpLCAoT1BKX0JZVEUpKGJveC50eXBlPj4wKSwgbF9jdXJyZW50X2RhdGFfc2l6ZSwgKE9QSl9VSU5UMzIpb3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdChzdHJlYW0pKTsKKwkJCQlvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7CisJCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJCX0KKwkJCWlmIChsX2N1cnJlbnRfZGF0YV9zaXplID4gbF9sYXN0X2RhdGFfc2l6ZSkgeworCQkJCU9QSl9CWVRFKiBuZXdfY3VycmVudF9kYXRhID0gKE9QSl9CWVRFKilvcGpfcmVhbGxvYyhsX2N1cnJlbnRfZGF0YSxsX2N1cnJlbnRfZGF0YV9zaXplKTsKKwkJCQlpZiAoIW5ld19jdXJyZW50X2RhdGEpIHsKKwkJCQkJb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOworICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGpwZWcyMDAwIGJveFxuIik7CisJCQkJCXJldHVybiBPUEpfRkFMU0U7CisJCQkJfQorICAgICAgICAgICAgICAgIGxfY3VycmVudF9kYXRhID0gbmV3X2N1cnJlbnRfZGF0YTsKKwkJCQlsX2xhc3RfZGF0YV9zaXplID0gbF9jdXJyZW50X2RhdGFfc2l6ZTsKKwkJCX0KKworCQkJbF9uYl9ieXRlc19yZWFkID0gKE9QSl9VSU5UMzIpb3BqX3N0cmVhbV9yZWFkX2RhdGEoc3RyZWFtLGxfY3VycmVudF9kYXRhLGxfY3VycmVudF9kYXRhX3NpemUscF9tYW5hZ2VyKTsKKwkJCWlmIChsX25iX2J5dGVzX3JlYWQgIT0gbF9jdXJyZW50X2RhdGFfc2l6ZSkgeworCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJQcm9ibGVtIHdpdGggcmVhZGluZyBKUEVHMjAwMCBib3gsIHN0cmVhbSBlcnJvclxuIik7CisgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOyAgICAgICAgICAgICAgICAKKwkJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQkJfQorCisJCQlpZiAoISBsX2N1cnJlbnRfaGFuZGxlci0+aGFuZGxlcihqcDIsbF9jdXJyZW50X2RhdGEsbF9jdXJyZW50X2RhdGFfc2l6ZSxwX21hbmFnZXIpKSB7CisJCQkJb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOworCQkJCXJldHVybiBPUEpfRkFMU0U7CisJCQl9CisJCX0KKwkJZWxzZSB7CisgICAgICAgICAgICBpZiAoIShqcDItPmpwMl9zdGF0ZSAmIEpQMl9TVEFURV9TSUdOQVRVUkUpKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk1hbGZvcm1lZCBKUDIgZmlsZSBmb3JtYXQ6IGZpcnN0IGJveCBtdXN0IGJlIEpQRUcgMjAwMCBzaWduYXR1cmUgYm94XG4iKTsKKyAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKGpwMi0+anAyX3N0YXRlICYgSlAyX1NUQVRFX0ZJTEVfVFlQRSkpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTWFsZm9ybWVkIEpQMiBmaWxlIGZvcm1hdDogc2Vjb25kIGJveCBtdXN0IGJlIGZpbGUgdHlwZSBib3hcbiIpOworICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorCQkJanAyLT5qcDJfc3RhdGUgfD0gSlAyX1NUQVRFX1VOS05PV047CisJCQlpZiAob3BqX3N0cmVhbV9za2lwKHN0cmVhbSxsX2N1cnJlbnRfZGF0YV9zaXplLHBfbWFuYWdlcikgIT0gbF9jdXJyZW50X2RhdGFfc2l6ZSkgeworCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJQcm9ibGVtIHdpdGggc2tpcHBpbmcgSlBFRzIwMDAgYm94LCBzdHJlYW0gZXJyb3JcbiIpOworCQkJCW9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKKwkJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQkJfQorCQl9CisJfQorCisJb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOworCisJcmV0dXJuIE9QSl9UUlVFOworfQorCisvKioKKyAqIEV4Y3V0ZXMgdGhlIGdpdmVuIHByb2NlZHVyZXMgb24gdGhlIGdpdmVuIGNvZGVjLgorICoKKyAqIEBwYXJhbQlwX3Byb2NlZHVyZV9saXN0CXRoZSBsaXN0IG9mIHByb2NlZHVyZXMgdG8gZXhlY3V0ZQorICogQHBhcmFtCWpwMgkJCQkJdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMgdG8gZXhlY3V0ZSB0aGUgcHJvY2VkdXJlcyBvbi4KKyAqIEBwYXJhbQlzdHJlYW0JCQkJCXRoZSBzdHJlYW0gdG8gZXhlY3V0ZSB0aGUgcHJvY2VkdXJlcyBvbi4KKyAqIEBwYXJhbQlwX21hbmFnZXIJCQl0aGUgdXNlciBtYW5hZ2VyLgorICoKKyAqIEByZXR1cm4JdHJ1ZQkJCQlpZiBhbGwgdGhlIHByb2NlZHVyZXMgd2VyZSBzdWNjZXNzZnVsbHkgZXhlY3V0ZWQuCisgKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX2V4ZWMgKCAgb3BqX2pwMl90ICoganAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcHJvY2VkdXJlX2xpc3RfdCAqIHBfcHJvY2VkdXJlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKK3sKKwlPUEpfQk9PTCAoKiogbF9wcm9jZWR1cmUpIChvcGpfanAyX3QgKiBqcDIsIG9wal9zdHJlYW1fcHJpdmF0ZV90ICosIG9wal9ldmVudF9tZ3JfdCAqKSA9IDAwOworCU9QSl9CT09MIGxfcmVzdWx0ID0gT1BKX1RSVUU7CisJT1BKX1VJTlQzMiBsX25iX3Byb2MsIGk7CisKKwkvKiBwcmVjb25kaXRpb25zICovCisJYXNzZXJ0KHBfcHJvY2VkdXJlX2xpc3QgIT0gMDApOworCWFzc2VydChqcDIgIT0gMDApOworCWFzc2VydChzdHJlYW0gIT0gMDApOworCWFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisJbF9uYl9wcm9jID0gb3BqX3Byb2NlZHVyZV9saXN0X2dldF9uYl9wcm9jZWR1cmVzKHBfcHJvY2VkdXJlX2xpc3QpOworCWxfcHJvY2VkdXJlID0gKE9QSl9CT09MICgqKikgKG9wal9qcDJfdCAqIGpwMiwgb3BqX3N0cmVhbV9wcml2YXRlX3QgKiwgb3BqX2V2ZW50X21ncl90ICopKSBvcGpfcHJvY2VkdXJlX2xpc3RfZ2V0X2ZpcnN0X3Byb2NlZHVyZShwX3Byb2NlZHVyZV9saXN0KTsKKworCWZvcgkoaT0wO2k8bF9uYl9wcm9jOysraSkgeworCQlsX3Jlc3VsdCA9IGxfcmVzdWx0ICYmICgqbF9wcm9jZWR1cmUpIChqcDIsc3RyZWFtLHBfbWFuYWdlcik7CisJCSsrbF9wcm9jZWR1cmU7CisJfQorCisJLyogYW5kIGNsZWFyIHRoZSBwcm9jZWR1cmUgbGlzdCBhdCB0aGUgZW5kLiAqLworCW9wal9wcm9jZWR1cmVfbGlzdF9jbGVhcihwX3Byb2NlZHVyZV9saXN0KTsKKwlyZXR1cm4gbF9yZXN1bHQ7Cit9CisKK09QSl9CT09MIG9wal9qcDJfc3RhcnRfY29tcHJlc3Mob3BqX2pwMl90ICpqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90ICogcF9pbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKwkvKiBwcmVjb25kaXRpb25zICovCisJYXNzZXJ0KGpwMiAhPSAwMCk7CisJYXNzZXJ0KHN0cmVhbSAhPSAwMCk7CisJYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisKKwkvKiBjdXN0b21pemF0aW9uIG9mIHRoZSB2YWxpZGF0aW9uICovCisJaWYgKCEgb3BqX2pwMl9zZXR1cF9lbmNvZGluZ192YWxpZGF0aW9uIChqcDIsIHBfbWFuYWdlcikpIHsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisKKwkvKiB2YWxpZGF0aW9uIG9mIHRoZSBwYXJhbWV0ZXJzIGNvZGVjICovCisJaWYgKCEgb3BqX2pwMl9leGVjKGpwMixqcDItPm1fdmFsaWRhdGlvbl9saXN0LHN0cmVhbSxwX21hbmFnZXIpKSB7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCisJLyogY3VzdG9taXphdGlvbiBvZiB0aGUgZW5jb2RpbmcgKi8KKwlpZiAoISBvcGpfanAyX3NldHVwX2hlYWRlcl93cml0aW5nKGpwMiwgcF9tYW5hZ2VyKSkgeworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKworCS8qIHdyaXRlIGhlYWRlciAqLworCWlmICghIG9wal9qcDJfZXhlYyAoanAyLGpwMi0+bV9wcm9jZWR1cmVfbGlzdCxzdHJlYW0scF9tYW5hZ2VyKSkgeworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKworCXJldHVybiBvcGpfajJrX3N0YXJ0X2NvbXByZXNzKGpwMi0+ajJrLHN0cmVhbSxwX2ltYWdlLHBfbWFuYWdlcik7Cit9CisKK3N0YXRpYyBjb25zdCBvcGpfanAyX2hlYWRlcl9oYW5kbGVyX3QgKiBvcGpfanAyX2ZpbmRfaGFuZGxlciAoT1BKX1VJTlQzMiBwX2lkKQoreworCU9QSl9VSU5UMzIgaSwgbF9oYW5kbGVyX3NpemUgPSBzaXplb2YoanAyX2hlYWRlcikgLyBzaXplb2Yob3BqX2pwMl9oZWFkZXJfaGFuZGxlcl90KTsKKworCWZvciAoaT0wO2k8bF9oYW5kbGVyX3NpemU7KytpKSB7CisJCWlmIChqcDJfaGVhZGVyW2ldLmlkID09IHBfaWQpIHsKKwkJCXJldHVybiAmanAyX2hlYWRlcltpXTsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBGaW5kcyB0aGUgaW1hZ2UgZXhlY3V0aW9uIGZ1bmN0aW9uIHJlbGF0ZWQgdG8gdGhlIGdpdmVuIGJveCBpZC4KKyAqCisgKiBAcGFyYW0JcF9pZAl0aGUgaWQgb2YgdGhlIGhhbmRsZXIgdG8gZmV0Y2guCisgKgorICogQHJldHVybgl0aGUgZ2l2ZW4gaGFuZGxlciBvciAwMCBpZiBpdCBjb3VsZCBub3QgYmUgZm91bmQuCisgKi8KK3N0YXRpYyBjb25zdCBvcGpfanAyX2hlYWRlcl9oYW5kbGVyX3QgKiBvcGpfanAyX2ltZ19maW5kX2hhbmRsZXIgKE9QSl9VSU5UMzIgcF9pZCkKK3sKKwlPUEpfVUlOVDMyIGksIGxfaGFuZGxlcl9zaXplID0gc2l6ZW9mKGpwMl9pbWdfaGVhZGVyKSAvIHNpemVvZihvcGpfanAyX2hlYWRlcl9oYW5kbGVyX3QpOworCWZvciAoaT0wO2k8bF9oYW5kbGVyX3NpemU7KytpKQorCXsKKwkJaWYgKGpwMl9pbWdfaGVhZGVyW2ldLmlkID09IHBfaWQpIHsKKwkJCXJldHVybiAmanAyX2ltZ19oZWFkZXJbaV07CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBSZWFkcyBhIGpwZWcyMDAwIGZpbGUgc2lnbmF0dXJlIGJveC4KKyAqCisgKiBAcGFyYW0JcF9oZWFkZXJfZGF0YQl0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIHNpZ25hdHVyZSBib3guCisgKiBAcGFyYW0JanAyCQkJCXRoZSBqcGVnMjAwMCBmaWxlIGNvZGVjLgorICogQHBhcmFtCXBfaGVhZGVyX3NpemUJdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBzaWduYXR1cmUgYm94LgorICogQHBhcmFtCXBfbWFuYWdlcgkJdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgc2lnbmF0dXJlIGJveCBpcyB2YWxpZC4KKyAqLworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfcmVhZF9qcChvcGpfanAyX3QgKmpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKK3sKKwlPUEpfVUlOVDMyIGxfbWFnaWNfbnVtYmVyOworCisJLyogcHJlY29uZGl0aW9ucyAqLworCWFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKKwlhc3NlcnQoanAyICE9IDAwKTsKKwlhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworCWlmIChqcDItPmpwMl9zdGF0ZSAhPSBKUDJfU1RBVEVfTk9ORSkgeworCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiVGhlIHNpZ25hdHVyZSBib3ggbXVzdCBiZSB0aGUgZmlyc3QgYm94IGluIHRoZSBmaWxlLlxuIik7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCisJLyogYXNzdXJlIGxlbmd0aCBvZiBkYXRhIGlzIGNvcnJlY3QgKDQgLT4gbWFnaWMgbnVtYmVyKSAqLworCWlmIChwX2hlYWRlcl9zaXplICE9IDQpIHsKKwkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdpdGggSlAgc2lnbmF0dXJlIEJveCBzaXplXG4iKTsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisKKwkvKiByZWFycmFuZ2UgZGF0YSAqLworCW9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfbWFnaWNfbnVtYmVyLDQpOworCWlmIChsX21hZ2ljX251bWJlciAhPSAweDBkMGE4NzBhICkgeworCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd2l0aCBKUCBTaWduYXR1cmUgOiBiYWQgbWFnaWMgbnVtYmVyXG4iKTsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisKKwlqcDItPmpwMl9zdGF0ZSB8PSBKUDJfU1RBVEVfU0lHTkFUVVJFOworCisJcmV0dXJuIE9QSl9UUlVFOworfQorCisvKioKKyAqIFJlYWRzIGEgYSBGVFlQIGJveCAtIEZpbGUgdHlwZSBib3gKKyAqCisgKiBAcGFyYW0JcF9oZWFkZXJfZGF0YQl0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIEZUWVAgYm94LgorICogQHBhcmFtCWpwMgkJCQl0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KKyAqIEBwYXJhbQlwX2hlYWRlcl9zaXplCXRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgRlRZUCBib3guCisgKiBAcGFyYW0JcF9tYW5hZ2VyCQl0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorICoKKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgRlRZUCBib3ggaXMgdmFsaWQuCisgKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfZnR5cCgJb3BqX2pwMl90ICpqcDIsCisJCQkJCQkJCQlPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisJCQkJCQkJCQlPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCisJCQkJCQkJCQlvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKwlPUEpfVUlOVDMyIGksIGxfcmVtYWluaW5nX2J5dGVzOworCisJLyogcHJlY29uZGl0aW9ucyAqLworCWFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKKwlhc3NlcnQoanAyICE9IDAwKTsKKwlhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworCWlmIChqcDItPmpwMl9zdGF0ZSAhPSBKUDJfU1RBVEVfU0lHTkFUVVJFKSB7CisJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJUaGUgZnR5cCBib3ggbXVzdCBiZSB0aGUgc2Vjb25kIGJveCBpbiB0aGUgZmlsZS5cbiIpOworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKworCS8qIGFzc3VyZSBsZW5ndGggb2YgZGF0YSBpcyBjb3JyZWN0ICovCisJaWYgKHBfaGVhZGVyX3NpemUgPCA4KSB7CisJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciB3aXRoIEZUWVAgc2lnbmF0dXJlIEJveCBzaXplXG4iKTsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisKKwlvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZqcDItPmJyYW5kLDQpOwkJLyogQlIgKi8KKwlwX2hlYWRlcl9kYXRhICs9IDQ7CisKKwlvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZqcDItPm1pbnZlcnNpb24sNCk7CQkvKiBNaW5WICovCisJcF9oZWFkZXJfZGF0YSArPSA0OworCisJbF9yZW1haW5pbmdfYnl0ZXMgPSBwX2hlYWRlcl9zaXplIC0gODsKKworCS8qIHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGJ5dGVzIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDQgKi8KKwlpZiAoKGxfcmVtYWluaW5nX2J5dGVzICYgMHgzKSAhPSAwKSB7CisJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciB3aXRoIEZUWVAgc2lnbmF0dXJlIEJveCBzaXplXG4iKTsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisKKwkvKiBkaXYgYnkgNCAqLworCWpwMi0+bnVtY2wgPSBsX3JlbWFpbmluZ19ieXRlcyA+PiAyOworCWlmIChqcDItPm51bWNsKSB7CisJCWpwMi0+Y2wgPSAoT1BKX1VJTlQzMiAqKSBvcGpfY2FsbG9jKGpwMi0+bnVtY2wsIHNpemVvZihPUEpfVUlOVDMyKSk7CisJCWlmIChqcDItPmNsID09IDAwKSB7CisJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgd2l0aCBGVFlQIEJveFxuIik7CisJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IGpwMi0+bnVtY2w7ICsraSkKKwl7CisJCW9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmpwMi0+Y2xbaV0sNCk7CQkvKiBDTGkgKi8KKwkJcF9oZWFkZXJfZGF0YSArPSA0OworCX0KKworCWpwMi0+anAyX3N0YXRlIHw9IEpQMl9TVEFURV9GSUxFX1RZUEU7CisKKwlyZXR1cm4gT1BKX1RSVUU7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3NraXBfanAyYygJb3BqX2pwMl90ICpqcDIsCisJCQkJCSAgICAJb3BqX3N0cmVhbV9wcml2YXRlX3QgKnN0cmVhbSwKKwkJCQkJICAgIAlvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQoreworCS8qIHByZWNvbmRpdGlvbnMgKi8KKwlhc3NlcnQoanAyICE9IDAwKTsKKwlhc3NlcnQoc3RyZWFtICE9IDAwKTsKKwlhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworCWpwMi0+ajJrX2NvZGVzdHJlYW1fb2Zmc2V0ID0gb3BqX3N0cmVhbV90ZWxsKHN0cmVhbSk7CisKKwlpZiAob3BqX3N0cmVhbV9za2lwKHN0cmVhbSw4LHBfbWFuYWdlcikgIT0gOCkgeworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKworCXJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qcGlwX3NraXBfaXB0cigJb3BqX2pwMl90ICpqcDIsCisgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpzdHJlYW0sCisgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCit7CisgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgYXNzZXJ0KGpwMiAhPSAwMCk7CisgIGFzc2VydChzdHJlYW0gIT0gMDApOworICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworICBqcDItPmpwaXBfaXB0cl9vZmZzZXQgPSBvcGpfc3RyZWFtX3RlbGwoc3RyZWFtKTsKKworICBpZiAob3BqX3N0cmVhbV9za2lwKHN0cmVhbSwyNCxwX21hbmFnZXIpICE9IDI0KSB7CisgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgfQorCisgIHJldHVybiBPUEpfVFJVRTsKK30KKworLyoqCisgKiBSZWFkcyB0aGUgSnBlZzIwMDAgZmlsZSBIZWFkZXIgYm94IC0gSlAyIEhlYWRlciBib3ggKHdhcm5pbmcsIHRoaXMgaXMgYSBzdXBlciBib3gpLgorICoKKyAqIEBwYXJhbQlwX2hlYWRlcl9kYXRhCXRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSBoZWFkZXIgYm94LgorICogQHBhcmFtCWpwMgkJCQl0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KKyAqIEBwYXJhbQlwX2hlYWRlcl9zaXplCXRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSBoZWFkZXIgYm94LgorICogQHBhcmFtCXBfbWFuYWdlcgkJdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIEpQMiBIZWFkZXIgYm94IHdhcyBzdWNjZXNzZnVsbHkgcmVjb2duaXplZC4KKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2pwMmgoICBvcGpfanAyX3QgKmpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisJT1BKX1VJTlQzMiBsX2JveF9zaXplPTAsIGxfY3VycmVudF9kYXRhX3NpemUgPSAwOworCW9wal9qcDJfYm94X3QgYm94OworCWNvbnN0IG9wal9qcDJfaGVhZGVyX2hhbmRsZXJfdCAqIGxfY3VycmVudF9oYW5kbGVyOworCU9QSl9CT09MIGxfaGFzX2loZHIgPSAwOworCisJLyogcHJlY29uZGl0aW9ucyAqLworCWFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKKwlhc3NlcnQoanAyICE9IDAwKTsKKwlhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworCS8qIG1ha2Ugc3VyZSB0aGUgYm94IGlzIHdlbGwgcGxhY2VkICovCisJaWYgKChqcDItPmpwMl9zdGF0ZSAmIEpQMl9TVEFURV9GSUxFX1RZUEUpICE9IEpQMl9TVEFURV9GSUxFX1RZUEUgKSB7CisJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJUaGUgIGJveCBtdXN0IGJlIHRoZSBmaXJzdCBib3ggaW4gdGhlIGZpbGUuXG4iKTsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisKKwlqcDItPmpwMl9pbWdfc3RhdGUgPSBKUDJfSU1HX1NUQVRFX05PTkU7CisKKwkvKiBpdGVyYXRlIHdoaWxlIHJlbWFpbmluZyBkYXRhICovCisJd2hpbGUgKHBfaGVhZGVyX3NpemUgPiAwKSB7CisKKwkJaWYgKCEgb3BqX2pwMl9yZWFkX2JveGhkcl9jaGFyKCZib3gscF9oZWFkZXJfZGF0YSwmbF9ib3hfc2l6ZSxwX2hlYWRlcl9zaXplLCBwX21hbmFnZXIpKSB7CisJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIGVycm9yIHdoaWxlIHJlYWRpbmcgSlAyIEhlYWRlciBib3hcbiIpOworCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJfQorCisJCWlmIChib3gubGVuZ3RoID4gcF9oZWFkZXJfc2l6ZSkgeworCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSBlcnJvciB3aGlsZSByZWFkaW5nIEpQMiBIZWFkZXIgYm94OiBib3ggbGVuZ3RoIGlzIGluY29uc2lzdGVudC5cbiIpOworCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJfQorCisJCWxfY3VycmVudF9oYW5kbGVyID0gb3BqX2pwMl9pbWdfZmluZF9oYW5kbGVyKGJveC50eXBlKTsKKwkJbF9jdXJyZW50X2RhdGFfc2l6ZSA9IGJveC5sZW5ndGggLSBsX2JveF9zaXplOworCQlwX2hlYWRlcl9kYXRhICs9IGxfYm94X3NpemU7CisKKwkJaWYgKGxfY3VycmVudF9oYW5kbGVyICE9IDAwKSB7CisJCQlpZiAoISBsX2N1cnJlbnRfaGFuZGxlci0+aGFuZGxlcihqcDIscF9oZWFkZXJfZGF0YSxsX2N1cnJlbnRfZGF0YV9zaXplLHBfbWFuYWdlcikpIHsKKwkJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJanAyLT5qcDJfaW1nX3N0YXRlIHw9IEpQMl9JTUdfU1RBVEVfVU5LTk9XTjsKKwkJfQorCisJCWlmIChib3gudHlwZSA9PSBKUDJfSUhEUikgeworCQkJbF9oYXNfaWhkciA9IDE7CisJCX0KKworCQlwX2hlYWRlcl9kYXRhICs9IGxfY3VycmVudF9kYXRhX3NpemU7CisJCXBfaGVhZGVyX3NpemUgLT0gYm94Lmxlbmd0aDsKKwl9CisKKwlpZiAobF9oYXNfaWhkciA9PSAwKSB7CisJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJTdHJlYW0gZXJyb3Igd2hpbGUgcmVhZGluZyBKUDIgSGVhZGVyIGJveDogbm8gJ2loZHInIGJveC5cbiIpOworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKworCWpwMi0+anAyX3N0YXRlIHw9IEpQMl9TVEFURV9IRUFERVI7CisKKwlyZXR1cm4gT1BKX1RSVUU7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfYm94aGRyX2NoYXIoICAgb3BqX2pwMl9ib3hfdCAqYm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX251bWJlcl9ieXRlc19yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9ib3hfbWF4X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworCU9QSl9VSU5UMzIgbF92YWx1ZTsKKworCS8qIHByZWNvbmRpdGlvbnMgKi8KKwlhc3NlcnQocF9kYXRhICE9IDAwKTsKKwlhc3NlcnQoYm94ICE9IDAwKTsKKwlhc3NlcnQocF9udW1iZXJfYnl0ZXNfcmVhZCAhPSAwMCk7CisJYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisKKwlpZiAocF9ib3hfbWF4X3NpemUgPCA4KSB7CisJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJDYW5ub3QgaGFuZGxlIGJveCBvZiBsZXNzIHRoYW4gOCBieXRlc1xuIik7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCisJLyogcHJvY2VzcyByZWFkIGRhdGEgKi8KKwlvcGpfcmVhZF9ieXRlcyhwX2RhdGEsICZsX3ZhbHVlLCA0KTsKKwlwX2RhdGEgKz0gNDsKKwlib3gtPmxlbmd0aCA9IChPUEpfVUlOVDMyKShsX3ZhbHVlKTsKKworCW9wal9yZWFkX2J5dGVzKHBfZGF0YSwgJmxfdmFsdWUsIDQpOworCXBfZGF0YSArPSA0OworCWJveC0+dHlwZSA9IChPUEpfVUlOVDMyKShsX3ZhbHVlKTsKKworCSpwX251bWJlcl9ieXRlc19yZWFkID0gODsKKworCS8qIGRvIHdlIGhhdmUgYSAic3BlY2lhbCB2ZXJ5IGxhcmdlIGJveCA/IiAqLworCS8qIHJlYWQgdGhlbiB0aGUgWExCb3ggKi8KKwlpZiAoYm94LT5sZW5ndGggPT0gMSkgeworCQlPUEpfVUlOVDMyIGxfeGxfcGFydF9zaXplOworCisJCWlmIChwX2JveF9tYXhfc2l6ZSA8IDE2KSB7CisJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ2Fubm90IGhhbmRsZSBYTCBib3ggb2YgbGVzcyB0aGFuIDE2IGJ5dGVzXG4iKTsKKwkJCXJldHVybiBPUEpfRkFMU0U7CisJCX0KKworCQlvcGpfcmVhZF9ieXRlcyhwX2RhdGEsJmxfeGxfcGFydF9zaXplLCA0KTsKKwkJcF9kYXRhICs9IDQ7CisJCSpwX251bWJlcl9ieXRlc19yZWFkICs9IDQ7CisKKwkJaWYgKGxfeGxfcGFydF9zaXplICE9IDApIHsKKwkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJDYW5ub3QgaGFuZGxlIGJveCBzaXplcyBoaWdoZXIgdGhhbiAyXjMyXG4iKTsKKwkJCXJldHVybiBPUEpfRkFMU0U7CisJCX0KKworCQlvcGpfcmVhZF9ieXRlcyhwX2RhdGEsICZsX3ZhbHVlLCA0KTsKKwkJKnBfbnVtYmVyX2J5dGVzX3JlYWQgKz0gNDsKKwkJYm94LT5sZW5ndGggPSAoT1BKX1VJTlQzMikobF92YWx1ZSk7CisKKwkJaWYgKGJveC0+bGVuZ3RoID09IDApIHsKKwkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJDYW5ub3QgaGFuZGxlIGJveCBvZiB1bmRlZmluZWQgc2l6ZXNcbiIpOworCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJfQorCX0KKwllbHNlIGlmIChib3gtPmxlbmd0aCA9PSAwKSB7CisJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJDYW5ub3QgaGFuZGxlIGJveCBvZiB1bmRlZmluZWQgc2l6ZXNcbiIpOworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKwlpZiAoYm94LT5sZW5ndGggPCAqcF9udW1iZXJfYnl0ZXNfcmVhZCkgeworCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQm94IGxlbmd0aCBpcyBpbmNvbnNpc3RlbnQuXG4iKTsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisJcmV0dXJuIE9QSl9UUlVFOworfQorCitPUEpfQk9PTCBvcGpfanAyX3JlYWRfaGVhZGVyKAlvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9qcDJfdCAqanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqKiBwX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworCS8qIHByZWNvbmRpdGlvbnMgKi8KKwlhc3NlcnQoanAyICE9IDAwKTsKKwlhc3NlcnQocF9zdHJlYW0gIT0gMDApOworCWFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisJLyogY3VzdG9taXphdGlvbiBvZiB0aGUgdmFsaWRhdGlvbiAqLworCWlmICghIG9wal9qcDJfc2V0dXBfZGVjb2RpbmdfdmFsaWRhdGlvbiAoanAyLCBwX21hbmFnZXIpKSB7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCisJLyogY3VzdG9taXphdGlvbiBvZiB0aGUgZW5jb2RpbmcgKi8KKwlpZiAoISBvcGpfanAyX3NldHVwX2hlYWRlcl9yZWFkaW5nKGpwMiwgcF9tYW5hZ2VyKSkgeworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKworCS8qIHZhbGlkYXRpb24gb2YgdGhlIHBhcmFtZXRlcnMgY29kZWMgKi8KKwlpZiAoISBvcGpfanAyX2V4ZWMoanAyLGpwMi0+bV92YWxpZGF0aW9uX2xpc3QscF9zdHJlYW0scF9tYW5hZ2VyKSkgeworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKworCS8qIHJlYWQgaGVhZGVyICovCisJaWYgKCEgb3BqX2pwMl9leGVjIChqcDIsanAyLT5tX3Byb2NlZHVyZV9saXN0LHBfc3RyZWFtLHBfbWFuYWdlcikpIHsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisKKwlyZXR1cm4gb3BqX2oya19yZWFkX2hlYWRlcigJcF9zdHJlYW0sCisJCQkJCQkJanAyLT5qMmssCisJCQkJCQkJcF9pbWFnZSwKKwkJCQkJCQlwX21hbmFnZXIpOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9zZXR1cF9lbmNvZGluZ192YWxpZGF0aW9uIChvcGpfanAyX3QgKmpwMiwgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQoreworCS8qIHByZWNvbmRpdGlvbnMgKi8KKwlhc3NlcnQoanAyICE9IDAwKTsKKwlhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworCWlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKGpwMi0+bV92YWxpZGF0aW9uX2xpc3QsIChvcGpfcHJvY2VkdXJlKW9wal9qcDJfZGVmYXVsdF92YWxpZGF0aW9uLCBwX21hbmFnZXIpKSB7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCS8qIERFVkVMT1BFUiBDT1JORVIsIGFkZCB5b3VyIGN1c3RvbSB2YWxpZGF0aW9uIHByb2NlZHVyZSAqLworCQorCXJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfc2V0dXBfZGVjb2RpbmdfdmFsaWRhdGlvbiAob3BqX2pwMl90ICpqcDIsIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKK3sKKwkvKiBwcmVjb25kaXRpb25zICovCisJYXNzZXJ0KGpwMiAhPSAwMCk7CisJYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisJCisJLyogREVWRUxPUEVSIENPUk5FUiwgYWRkIHlvdXIgY3VzdG9tIHZhbGlkYXRpb24gcHJvY2VkdXJlICovCisJCisJcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9zZXR1cF9oZWFkZXJfd3JpdGluZyAob3BqX2pwMl90ICpqcDIsIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKK3sKKwkvKiBwcmVjb25kaXRpb25zICovCisJYXNzZXJ0KGpwMiAhPSAwMCk7CisJYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisKKwlpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShqcDItPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2pwMl93cml0ZV9qcCwgcF9tYW5hZ2VyKSkgeworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKwlpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShqcDItPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2pwMl93cml0ZV9mdHlwLCBwX21hbmFnZXIpKSB7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCWlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKGpwMi0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfanAyX3dyaXRlX2pwMmgsIHBfbWFuYWdlcikpIHsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisJaWYoIGpwMi0+anBpcF9vbiApIHsKKwkJaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUoanAyLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qcGlwX3NraXBfaXB0ciwgcF9tYW5hZ2VyKSkgeworCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJfQorCX0KKwlpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShqcDItPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2pwMl9za2lwX2pwMmMscF9tYW5hZ2VyKSkgeworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKworCS8qIERFVkVMT1BFUiBDT1JORVIsIGluc2VydCB5b3VyIGN1c3RvbSBwcm9jZWR1cmVzICovCisKKwlyZXR1cm4gT1BKX1RSVUU7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3NldHVwX2hlYWRlcl9yZWFkaW5nIChvcGpfanAyX3QgKmpwMiwgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQoreworCS8qIHByZWNvbmRpdGlvbnMgKi8KKwlhc3NlcnQoanAyICE9IDAwKTsKKwlhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworCWlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKGpwMi0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfanAyX3JlYWRfaGVhZGVyX3Byb2NlZHVyZSwgcF9tYW5hZ2VyKSkgeworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKwkKKwkvKiBERVZFTE9QRVIgQ09STkVSLCBhZGQgeW91ciBjdXN0b20gcHJvY2VkdXJlcyAqLworCQorCXJldHVybiBPUEpfVFJVRTsKK30KKworT1BKX0JPT0wgb3BqX2pwMl9yZWFkX3RpbGVfaGVhZGVyICggb3BqX2pwMl90ICogcF9qcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF90aWxlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90aWxlX3gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90aWxlX3kwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90aWxlX3gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90aWxlX3kxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfbmJfY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQk9PTCAqIHBfZ29fb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKwlyZXR1cm4gb3BqX2oya19yZWFkX3RpbGVfaGVhZGVyKHBfanAyLT5qMmssCisJCQkJCQkJCXBfdGlsZV9pbmRleCwKKwkJCQkJCQkJcF9kYXRhX3NpemUsCisJCQkJCQkJCXBfdGlsZV94MCwgcF90aWxlX3kwLAorCQkJCQkJCQlwX3RpbGVfeDEsIHBfdGlsZV95MSwKKwkJCQkJCQkJcF9uYl9jb21wcywKKwkJCQkJCQkJcF9nb19vbiwKKwkJCQkJCQkJcF9zdHJlYW0sCisJCQkJCQkJCXBfbWFuYWdlcik7Cit9CisKK09QSl9CT09MIG9wal9qcDJfd3JpdGVfdGlsZSAoCW9wal9qcDJfdCAqcF9qcDIsCisJCQkJCSAJIAkgICAgT1BKX1VJTlQzMiBwX3RpbGVfaW5kZXgsCisJCQkJCSAJIAkgICAgT1BKX0JZVEUgKiBwX2RhdGEsCisJCQkJCSAJIAkgICAgT1BKX1VJTlQzMiBwX2RhdGFfc2l6ZSwKKwkJCQkJIAkgCSAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisJCQkJCSAJIAkgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKworeworCXJldHVybiBvcGpfajJrX3dyaXRlX3RpbGUgKHBfanAyLT5qMmsscF90aWxlX2luZGV4LHBfZGF0YSxwX2RhdGFfc2l6ZSxwX3N0cmVhbSxwX21hbmFnZXIpOworfQorCitPUEpfQk9PTCBvcGpfanAyX2RlY29kZV90aWxlICggIG9wal9qcDJfdCAqIHBfanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKwlyZXR1cm4gb3BqX2oya19kZWNvZGVfdGlsZSAocF9qcDItPmoyayxwX3RpbGVfaW5kZXgscF9kYXRhLHBfZGF0YV9zaXplLHBfc3RyZWFtLHBfbWFuYWdlcik7Cit9CisKK3ZvaWQgb3BqX2pwMl9kZXN0cm95KG9wal9qcDJfdCAqanAyKQoreworCWlmIChqcDIpIHsKKwkJLyogZGVzdHJveSB0aGUgSjJLIGNvZGVjICovCisJCW9wal9qMmtfZGVzdHJveShqcDItPmoyayk7CisJCWpwMi0+ajJrID0gMDA7CisKKwkJaWYgKGpwMi0+Y29tcHMpIHsKKwkJCW9wal9mcmVlKGpwMi0+Y29tcHMpOworCQkJanAyLT5jb21wcyA9IDAwOworCQl9CisKKwkJaWYgKGpwMi0+Y2wpIHsKKwkJCW9wal9mcmVlKGpwMi0+Y2wpOworCQkJanAyLT5jbCA9IDAwOworCQl9CisKKwkJaWYgKGpwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfYnVmKSB7CisJCQlvcGpfZnJlZShqcDItPmNvbG9yLmljY19wcm9maWxlX2J1Zik7CisJCQlqcDItPmNvbG9yLmljY19wcm9maWxlX2J1ZiA9IDAwOworCQl9CisKKwkJaWYgKGpwMi0+Y29sb3IuanAyX2NkZWYpIHsKKwkJCWlmIChqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvKSB7CisJCQkJb3BqX2ZyZWUoanAyLT5jb2xvci5qcDJfY2RlZi0+aW5mbyk7CisJCQkJanAyLT5jb2xvci5qcDJfY2RlZi0+aW5mbyA9IE5VTEw7CisJCQl9CisKKwkJCW9wal9mcmVlKGpwMi0+Y29sb3IuanAyX2NkZWYpOworCQkJanAyLT5jb2xvci5qcDJfY2RlZiA9IDAwOworCQl9CisKKwkJaWYgKGpwMi0+Y29sb3IuanAyX3BjbHIpIHsKKwkJCWlmIChqcDItPmNvbG9yLmpwMl9wY2xyLT5jbWFwKSB7CisJCQkJb3BqX2ZyZWUoanAyLT5jb2xvci5qcDJfcGNsci0+Y21hcCk7CisJCQkJanAyLT5jb2xvci5qcDJfcGNsci0+Y21hcCA9IE5VTEw7CisJCQl9CisJCQlpZiAoanAyLT5jb2xvci5qcDJfcGNsci0+Y2hhbm5lbF9zaWduKSB7CisJCQkJb3BqX2ZyZWUoanAyLT5jb2xvci5qcDJfcGNsci0+Y2hhbm5lbF9zaWduKTsKKwkJCQlqcDItPmNvbG9yLmpwMl9wY2xyLT5jaGFubmVsX3NpZ24gPSBOVUxMOworCQkJfQorCQkJaWYgKGpwMi0+Y29sb3IuanAyX3BjbHItPmNoYW5uZWxfc2l6ZSkgeworCQkJCW9wal9mcmVlKGpwMi0+Y29sb3IuanAyX3BjbHItPmNoYW5uZWxfc2l6ZSk7CisJCQkJanAyLT5jb2xvci5qcDJfcGNsci0+Y2hhbm5lbF9zaXplID0gTlVMTDsKKwkJCX0KKwkJCWlmIChqcDItPmNvbG9yLmpwMl9wY2xyLT5lbnRyaWVzKSB7CisJCQkJb3BqX2ZyZWUoanAyLT5jb2xvci5qcDJfcGNsci0+ZW50cmllcyk7CisJCQkJanAyLT5jb2xvci5qcDJfcGNsci0+ZW50cmllcyA9IE5VTEw7CisJCQl9CisKKwkJCW9wal9mcmVlKGpwMi0+Y29sb3IuanAyX3BjbHIpOworCQkJanAyLT5jb2xvci5qcDJfcGNsciA9IDAwOworCQl9CisKKwkJaWYgKGpwMi0+bV92YWxpZGF0aW9uX2xpc3QpIHsKKwkJCW9wal9wcm9jZWR1cmVfbGlzdF9kZXN0cm95KGpwMi0+bV92YWxpZGF0aW9uX2xpc3QpOworCQkJanAyLT5tX3ZhbGlkYXRpb25fbGlzdCA9IDAwOworCQl9CisKKwkJaWYgKGpwMi0+bV9wcm9jZWR1cmVfbGlzdCkgeworCQkJb3BqX3Byb2NlZHVyZV9saXN0X2Rlc3Ryb3koanAyLT5tX3Byb2NlZHVyZV9saXN0KTsKKwkJCWpwMi0+bV9wcm9jZWR1cmVfbGlzdCA9IDAwOworCQl9CisKKwkJb3BqX2ZyZWUoanAyKTsKKwl9Cit9CisKK09QSl9CT09MIG9wal9qcDJfc2V0X2RlY29kZV9hcmVhKAlvcGpfanAyX3QgKnBfanAyLAorCQkJCQkJCQkgICAgb3BqX2ltYWdlX3QqIHBfaW1hZ2UsCisJCQkJCQkJCSAgICBPUEpfSU5UMzIgcF9zdGFydF94LCBPUEpfSU5UMzIgcF9zdGFydF95LAorCQkJCQkJCQkgICAgT1BKX0lOVDMyIHBfZW5kX3gsIE9QSl9JTlQzMiBwX2VuZF95LAorCQkJCQkJCQkgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisJcmV0dXJuIG9wal9qMmtfc2V0X2RlY29kZV9hcmVhKHBfanAyLT5qMmssIHBfaW1hZ2UsIHBfc3RhcnRfeCwgcF9zdGFydF95LCBwX2VuZF94LCBwX2VuZF95LCBwX21hbmFnZXIpOworfQorCitPUEpfQk9PTCBvcGpfanAyX2dldF90aWxlKAlvcGpfanAyX3QgKnBfanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCogcF9pbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0aWxlX2luZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworCWlmICghcF9pbWFnZSkKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKworCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkpQMiBib3ggd2hpY2ggYXJlIGFmdGVyIHRoZSBjb2Rlc3RyZWFtIHdpbGwgbm90IGJlIHJlYWQgYnkgdGhpcyBmdW5jdGlvbi5cbiIpOworCisJaWYgKCEgb3BqX2oya19nZXRfdGlsZShwX2pwMi0+ajJrLCBwX3N0cmVhbSwgcF9pbWFnZSwgcF9tYW5hZ2VyLCB0aWxlX2luZGV4KSApeworCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRmFpbGVkIHRvIGRlY29kZSB0aGUgY29kZXN0cmVhbSBpbiB0aGUgSlAyIGZpbGVcbiIpOworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKworCWlmICghb3BqX2pwMl9jaGVja19jb2xvcihwX2ltYWdlLCAmKHBfanAyLT5jb2xvciksIHBfbWFuYWdlcikpIHsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisKKwkvKiBTZXQgSW1hZ2UgQ29sb3IgU3BhY2UgKi8KKwlpZiAocF9qcDItPmVudW1jcyA9PSAxNikKKwkJcF9pbWFnZS0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX1NSR0I7CisJZWxzZSBpZiAocF9qcDItPmVudW1jcyA9PSAxNykKKwkJcF9pbWFnZS0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX0dSQVk7CisJZWxzZSBpZiAocF9qcDItPmVudW1jcyA9PSAxOCkKKwkJcF9pbWFnZS0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX1NZQ0M7CisJZWxzZSBpZiAocF9qcDItPmVudW1jcyA9PSAyNCkKKwkJcF9pbWFnZS0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX0VZQ0M7CisJZWxzZSBpZiAocF9qcDItPmVudW1jcyA9PSAxMikKKwkJcF9pbWFnZS0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX0NNWUs7CisJZWxzZQorCQlwX2ltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfVU5LTk9XTjsKKworCWlmKHBfanAyLT5jb2xvci5qcDJfcGNscikgeworCQkvKiBQYXJ0IDEsIEkuNS4zLjQ6IEVpdGhlciBib3RoIG9yIG5vbmUgOiAqLworCQlpZiggIXBfanAyLT5jb2xvci5qcDJfcGNsci0+Y21hcCkKKwkJCW9wal9qcDJfZnJlZV9wY2xyKCYocF9qcDItPmNvbG9yKSk7CisJCWVsc2UKKwkJCW9wal9qcDJfYXBwbHlfcGNscihwX2ltYWdlLCAmKHBfanAyLT5jb2xvcikpOworCX0KKwkKKwkvKiBBcHBseSB0aGUgY29sb3Igc3BhY2UgaWYgbmVlZGVkICovCisJaWYocF9qcDItPmNvbG9yLmpwMl9jZGVmKSB7CisJCW9wal9qcDJfYXBwbHlfY2RlZihwX2ltYWdlLCAmKHBfanAyLT5jb2xvciksIHBfbWFuYWdlcik7CisJfQorCisJaWYocF9qcDItPmNvbG9yLmljY19wcm9maWxlX2J1ZikgeworCQlwX2ltYWdlLT5pY2NfcHJvZmlsZV9idWYgPSBwX2pwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfYnVmOworCQlwX2ltYWdlLT5pY2NfcHJvZmlsZV9sZW4gPSBwX2pwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfbGVuOworCQlwX2pwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfYnVmID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gT1BKX1RSVUU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBKUDIgZW5jb2RlciBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworb3BqX2pwMl90KiBvcGpfanAyX2NyZWF0ZShPUEpfQk9PTCBwX2lzX2RlY29kZXIpCit7CisJb3BqX2pwMl90ICpqcDIgPSAob3BqX2pwMl90KilvcGpfY2FsbG9jKDEsc2l6ZW9mKG9wal9qcDJfdCkpOworCWlmIChqcDIpIHsKKworCQkvKiBjcmVhdGUgdGhlIEoySyBjb2RlYyAqLworCQlpZiAoISBwX2lzX2RlY29kZXIpIHsKKwkJCWpwMi0+ajJrID0gb3BqX2oya19jcmVhdGVfY29tcHJlc3MoKTsKKwkJfQorCQllbHNlIHsKKwkJCWpwMi0+ajJrID0gb3BqX2oya19jcmVhdGVfZGVjb21wcmVzcygpOworCQl9CisKKwkJaWYgKGpwMi0+ajJrID09IDAwKSB7CisJCQlvcGpfanAyX2Rlc3Ryb3koanAyKTsKKwkJCXJldHVybiAwMDsKKwkJfQorCisJCS8qIENvbG9yIHN0cnVjdHVyZSAqLworCQlqcDItPmNvbG9yLmljY19wcm9maWxlX2J1ZiA9IE5VTEw7CisJCWpwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfbGVuID0gMDsKKwkJanAyLT5jb2xvci5qcDJfY2RlZiA9IE5VTEw7CisJCWpwMi0+Y29sb3IuanAyX3BjbHIgPSBOVUxMOworCQlqcDItPmNvbG9yLmpwMl9oYXNfY29sciA9IDA7CisKKwkJLyogdmFsaWRhdGlvbiBsaXN0IGNyZWF0aW9uICovCisJCWpwMi0+bV92YWxpZGF0aW9uX2xpc3QgPSBvcGpfcHJvY2VkdXJlX2xpc3RfY3JlYXRlKCk7CisJCWlmICghIGpwMi0+bV92YWxpZGF0aW9uX2xpc3QpIHsKKwkJCW9wal9qcDJfZGVzdHJveShqcDIpOworCQkJcmV0dXJuIDAwOworCQl9CisKKwkJLyogZXhlY3V0aW9uIGxpc3QgY3JlYXRpb24gKi8KKwkJanAyLT5tX3Byb2NlZHVyZV9saXN0ID0gb3BqX3Byb2NlZHVyZV9saXN0X2NyZWF0ZSgpOworCQlpZiAoISBqcDItPm1fcHJvY2VkdXJlX2xpc3QpIHsKKwkJCW9wal9qcDJfZGVzdHJveShqcDIpOworCQkJcmV0dXJuIDAwOworCQl9CisJfQorCisJcmV0dXJuIGpwMjsKK30KKwordm9pZCBqcDJfZHVtcChvcGpfanAyX3QqIHBfanAyLCBPUEpfSU5UMzIgZmxhZywgRklMRSogb3V0X3N0cmVhbSkKK3sKKwkvKiBwcmVjb25kaXRpb25zICovCisJYXNzZXJ0KHBfanAyICE9IDAwKTsKKworCWoya19kdW1wKHBfanAyLT5qMmssCisJCQkJCWZsYWcsCisJCQkJCW91dF9zdHJlYW0pOworfQorCitvcGpfY29kZXN0cmVhbV9pbmRleF90KiBqcDJfZ2V0X2NzdHJfaW5kZXgob3BqX2pwMl90KiBwX2pwMikKK3sKKwlyZXR1cm4gajJrX2dldF9jc3RyX2luZGV4KHBfanAyLT5qMmspOworfQorCitvcGpfY29kZXN0cmVhbV9pbmZvX3YyX3QqIGpwMl9nZXRfY3N0cl9pbmZvKG9wal9qcDJfdCogcF9qcDIpCit7CisJcmV0dXJuIGoya19nZXRfY3N0cl9pbmZvKHBfanAyLT5qMmspOworfQorCitPUEpfQk9PTCBvcGpfanAyX3NldF9kZWNvZGVkX3Jlc29sdXRpb25fZmFjdG9yKG9wal9qcDJfdCAqcF9qcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcmVzX2ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQoreworCXJldHVybiBvcGpfajJrX3NldF9kZWNvZGVkX3Jlc29sdXRpb25fZmFjdG9yKHBfanAyLT5qMmssIHJlc19mYWN0b3IsIHBfbWFuYWdlcik7Cit9CisKKy8qIEpQSVAgc3BlY2lmaWMgKi8KKworI2lmZGVmIFVTRV9KUElQCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwaXBfd3JpdGVfaXB0cihvcGpfanAyX3QgKmpwMiwKKyAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKKyAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3sKKyAgT1BKX09GRl9UIGoya19jb2Rlc3RyZWFtX2V4aXQ7CisgIE9QSl9CWVRFIGxfZGF0YV9oZWFkZXIgWzI0XTsKKworICAvKiBwcmVjb25kaXRpb25zICovCisgIGFzc2VydChqcDIgIT0gMDApOworICBhc3NlcnQoY2lvICE9IDAwKTsKKyAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgIGFzc2VydChvcGpfc3RyZWFtX2hhc19zZWVrKGNpbykpOworCisgIGoya19jb2Rlc3RyZWFtX2V4aXQgPSBvcGpfc3RyZWFtX3RlbGwoY2lvKTsKKyAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIsIDI0LCA0KTsgLyogc2l6ZSBvZiBpcHRyICovCisgIG9wal93cml0ZV9ieXRlcyhsX2RhdGFfaGVhZGVyICsgNCxKUElQX0lQVFIsNCk7CQkJCQkJCQkJICAgLyogSVBUUiAqLworI2lmIDAKKyAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIgKyA0ICsgNCwgMCwgOCk7IC8qIG9mZnNldCAqLworICBvcGpfd3JpdGVfYnl0ZXMobF9kYXRhX2hlYWRlciArIDggKyA4LCAwLCA4KTsgLyogbGVuZ3RoICovCisjZWxzZQorICBvcGpfd3JpdGVfZG91YmxlKGxfZGF0YV9oZWFkZXIgKyA0ICsgNCwgMCk7IC8qIG9mZnNldCAqLworICBvcGpfd3JpdGVfZG91YmxlKGxfZGF0YV9oZWFkZXIgKyA4ICsgOCwgMCk7IC8qIGxlbmd0aCAqLworI2VuZGlmCisKKyAgaWYgKCEgb3BqX3N0cmVhbV9zZWVrKGNpbyxqcDItPmpwaXBfaXB0cl9vZmZzZXQscF9tYW5hZ2VyKSkgeworICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gc2VlayBpbiB0aGUgc3RyZWFtLlxuIik7CisgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgfQorCisgIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEoY2lvLGxfZGF0YV9oZWFkZXIsMjQscF9tYW5hZ2VyKSAhPSAyNCkgeworICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gc2VlayBpbiB0aGUgc3RyZWFtLlxuIik7CisgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgfQorCisgIGlmICghIG9wal9zdHJlYW1fc2VlayhjaW8sajJrX2NvZGVzdHJlYW1fZXhpdCxwX21hbmFnZXIpKSB7CisgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWxlZCB0byBzZWVrIGluIHRoZSBzdHJlYW0uXG4iKTsKKyAgICByZXR1cm4gT1BKX0ZBTFNFOworICB9CisKKyAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwaXBfd3JpdGVfZmlkeChvcGpfanAyX3QgKmpwMiwKKyAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKKyAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3sKKyAgT1BKX09GRl9UIGoya19jb2Rlc3RyZWFtX2V4aXQ7CisgIE9QSl9CWVRFIGxfZGF0YV9oZWFkZXIgWzI0XTsKKworICAvKiBwcmVjb25kaXRpb25zICovCisgIGFzc2VydChqcDIgIT0gMDApOworICBhc3NlcnQoY2lvICE9IDAwKTsKKyAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgIGFzc2VydChvcGpfc3RyZWFtX2hhc19zZWVrKGNpbykpOworCisgIG9wal93cml0ZV9ieXRlcyhsX2RhdGFfaGVhZGVyLCAyNCwgNCk7IC8qIHNpemUgb2YgaXB0ciAqLworICBvcGpfd3JpdGVfYnl0ZXMobF9kYXRhX2hlYWRlciArIDQsSlBJUF9GSURYLDQpOwkJCQkJCQkJCSAgIC8qIElQVFIgKi8KKyAgb3BqX3dyaXRlX2RvdWJsZShsX2RhdGFfaGVhZGVyICsgNCArIDQsIDApOyAvKiBvZmZzZXQgKi8KKyAgb3BqX3dyaXRlX2RvdWJsZShsX2RhdGFfaGVhZGVyICsgOCArIDgsIDApOyAvKiBsZW5ndGggKi8KKworICBpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKGNpbyxsX2RhdGFfaGVhZGVyLDI0LHBfbWFuYWdlcikgIT0gMjQpIHsKKyAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRmFpbGVkIHRvIHNlZWsgaW4gdGhlIHN0cmVhbS5cbiIpOworICAgIHJldHVybiBPUEpfRkFMU0U7CisgIH0KKworICBqMmtfY29kZXN0cmVhbV9leGl0ID0gb3BqX3N0cmVhbV90ZWxsKGNpbyk7CisgIGlmICghIG9wal9zdHJlYW1fc2VlayhjaW8sajJrX2NvZGVzdHJlYW1fZXhpdCxwX21hbmFnZXIpKSB7CisgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWxlZCB0byBzZWVrIGluIHRoZSBzdHJlYW0uXG4iKTsKKyAgICByZXR1cm4gT1BKX0ZBTFNFOworICB9CisKKyAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwaXBfd3JpdGVfY2lkeChvcGpfanAyX3QgKmpwMiwKKyAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKKyAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3sKKyAgT1BKX09GRl9UIGoya19jb2Rlc3RyZWFtX2V4aXQ7CisgIE9QSl9CWVRFIGxfZGF0YV9oZWFkZXIgWzI0XTsKKworICAvKiBwcmVjb25kaXRpb25zICovCisgIGFzc2VydChqcDIgIT0gMDApOworICBhc3NlcnQoY2lvICE9IDAwKTsKKyAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgIGFzc2VydChvcGpfc3RyZWFtX2hhc19zZWVrKGNpbykpOworCisgIGoya19jb2Rlc3RyZWFtX2V4aXQgPSBvcGpfc3RyZWFtX3RlbGwoY2lvKTsKKyAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIsIDI0LCA0KTsgLyogc2l6ZSBvZiBpcHRyICovCisgIG9wal93cml0ZV9ieXRlcyhsX2RhdGFfaGVhZGVyICsgNCxKUElQX0NJRFgsNCk7CQkJCQkJCQkJICAgLyogSVBUUiAqLworI2lmIDAKKyAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIgKyA0ICsgNCwgMCwgOCk7IC8qIG9mZnNldCAqLworICBvcGpfd3JpdGVfYnl0ZXMobF9kYXRhX2hlYWRlciArIDggKyA4LCAwLCA4KTsgLyogbGVuZ3RoICovCisjZWxzZQorICBvcGpfd3JpdGVfZG91YmxlKGxfZGF0YV9oZWFkZXIgKyA0ICsgNCwgMCk7IC8qIG9mZnNldCAqLworICBvcGpfd3JpdGVfZG91YmxlKGxfZGF0YV9oZWFkZXIgKyA4ICsgOCwgMCk7IC8qIGxlbmd0aCAqLworI2VuZGlmCisKKyAgaWYgKCEgb3BqX3N0cmVhbV9zZWVrKGNpbyxqMmtfY29kZXN0cmVhbV9leGl0LHBfbWFuYWdlcikpIHsKKyAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRmFpbGVkIHRvIHNlZWsgaW4gdGhlIHN0cmVhbS5cbiIpOworICAgIHJldHVybiBPUEpfRkFMU0U7CisgIH0KKworICBpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKGNpbyxsX2RhdGFfaGVhZGVyLDI0LHBfbWFuYWdlcikgIT0gMjQpIHsKKyAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRmFpbGVkIHRvIHNlZWsgaW4gdGhlIHN0cmVhbS5cbiIpOworICAgIHJldHVybiBPUEpfRkFMU0U7CisgIH0KKworICBqMmtfY29kZXN0cmVhbV9leGl0ID0gb3BqX3N0cmVhbV90ZWxsKGNpbyk7CisgIGlmICghIG9wal9zdHJlYW1fc2VlayhjaW8sajJrX2NvZGVzdHJlYW1fZXhpdCxwX21hbmFnZXIpKSB7CisgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWxlZCB0byBzZWVrIGluIHRoZSBzdHJlYW0uXG4iKTsKKyAgICByZXR1cm4gT1BKX0ZBTFNFOworICB9CisKKyAgcmV0dXJuIE9QSl9UUlVFOworfQorCisjaWYgMAorc3RhdGljIHZvaWQgd3JpdGVfcHJ4eSggaW50IG9mZnNldF9qcDJjLCBpbnQgbGVuZ3RoX2pwMmMsIGludCBvZmZzZXRfaWR4LCBpbnQgbGVuZ3RoX2lkeCwgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKKyAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3sKKyAgT1BKX0JZVEUgbF9kYXRhX2hlYWRlciBbOF07CisgIE9QSl9PRkZfVCBsZW4sIGxlbnA7CisKKyAgbGVucCA9IG9wal9zdHJlYW1fdGVsbChjaW8pOworICBvcGpfc3RyZWFtX3NraXAoY2lvLCA0LCBwX21hbmFnZXIpOyAgICAgICAgIC8qIEwgW2F0IHRoZSBlbmRdICovCisgIG9wal93cml0ZV9ieXRlcyhsX2RhdGFfaGVhZGVyLEpQSVBfUFJYWSw0KTsgLyogSVBUUiAgICAgICAgICAgKi8KKyAgb3BqX3N0cmVhbV93cml0ZV9kYXRhKGNpbyxsX2RhdGFfaGVhZGVyLDQscF9tYW5hZ2VyKTsKKworICBvcGpfd3JpdGVfYnl0ZXMoIGxfZGF0YV9oZWFkZXIsIG9mZnNldF9qcDJjLCA4KTsgLyogT09GRiAgICAgICAgICAgKi8KKyAgb3BqX3N0cmVhbV93cml0ZV9kYXRhKGNpbyxsX2RhdGFfaGVhZGVyLDgscF9tYW5hZ2VyKTsKKyAgb3BqX3dyaXRlX2J5dGVzKCBsX2RhdGFfaGVhZGVyLCBsZW5ndGhfanAyYywgNCk7IC8qIE9CSCBwYXJ0IDEgICAgICovCisgIG9wal93cml0ZV9ieXRlcyggbF9kYXRhX2hlYWRlcis0LCBKUDJfSlAyQywgNCk7ICAvKiBPQkggcGFydCAyICAgICAqLworICBvcGpfc3RyZWFtX3dyaXRlX2RhdGEoY2lvLGxfZGF0YV9oZWFkZXIsOCxwX21hbmFnZXIpOworCisgIG9wal93cml0ZV9ieXRlcyggbF9kYXRhX2hlYWRlciwgMSwgMSk7LyogTkkgICAgICAgICAgICAgKi8KKyAgb3BqX3N0cmVhbV93cml0ZV9kYXRhKGNpbyxsX2RhdGFfaGVhZGVyLDEscF9tYW5hZ2VyKTsKKworICBvcGpfd3JpdGVfYnl0ZXMoIGxfZGF0YV9oZWFkZXIsIG9mZnNldF9pZHgsIDgpOyAgLyogSU9GRiAgICAgICAgICAgKi8KKyAgb3BqX3N0cmVhbV93cml0ZV9kYXRhKGNpbyxsX2RhdGFfaGVhZGVyLDgscF9tYW5hZ2VyKTsKKyAgb3BqX3dyaXRlX2J5dGVzKCBsX2RhdGFfaGVhZGVyLCBsZW5ndGhfaWR4LCA0KTsgIC8qIElCSCBwYXJ0IDEgICAgICovCisgIG9wal93cml0ZV9ieXRlcyggbF9kYXRhX2hlYWRlcis0LCBKUElQX0NJRFgsIDQpOyAgIC8qIElCSCBwYXJ0IDIgICAgICovCisgIG9wal9zdHJlYW1fd3JpdGVfZGF0YShjaW8sbF9kYXRhX2hlYWRlciw4LHBfbWFuYWdlcik7CisKKyAgbGVuID0gb3BqX3N0cmVhbV90ZWxsKGNpbyktbGVucDsKKyAgb3BqX3N0cmVhbV9za2lwKGNpbywgbGVucCwgcF9tYW5hZ2VyKTsKKyAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIsbGVuLDQpOy8qIEwgICAgICAgICAgICAgICovCisgIG9wal9zdHJlYW1fd3JpdGVfZGF0YShjaW8sbF9kYXRhX2hlYWRlciw0LHBfbWFuYWdlcik7CisgIG9wal9zdHJlYW1fc2VlayhjaW8sIGxlbnArbGVuLHBfbWFuYWdlcik7Cit9CisjZW5kaWYKKworCisjaWYgMAorc3RhdGljIGludCB3cml0ZV9maWR4KCBpbnQgb2Zmc2V0X2pwMmMsIGludCBsZW5ndGhfanAyYywgaW50IG9mZnNldF9pZHgsIGludCBsZW5ndGhfaWR4LCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAorICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQoreworICBPUEpfQllURSBsX2RhdGFfaGVhZGVyIFs0XTsKKyAgT1BKX09GRl9UIGxlbiwgbGVucDsKKworICBsZW5wID0gb3BqX3N0cmVhbV90ZWxsKGNpbyk7CisgIG9wal9zdHJlYW1fc2tpcChjaW8sIDQsIHBfbWFuYWdlcik7CisgIG9wal93cml0ZV9ieXRlcyhsX2RhdGFfaGVhZGVyLEpQSVBfRklEWCw0KTsgLyogRklEWCAqLworICBvcGpfc3RyZWFtX3dyaXRlX2RhdGEoY2lvLGxfZGF0YV9oZWFkZXIsNCxwX21hbmFnZXIpOworCisgIHdyaXRlX3ByeHkoIG9mZnNldF9qcDJjLCBsZW5ndGhfanAyYywgb2Zmc2V0X2lkeCwgbGVuZ3RoX2lkeCwgY2lvLHBfbWFuYWdlcik7CisKKyAgbGVuID0gb3BqX3N0cmVhbV90ZWxsKGNpbyktbGVucDsKKyAgb3BqX3N0cmVhbV9za2lwKGNpbywgbGVucCwgcF9tYW5hZ2VyKTsKKyAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIsbGVuLDQpOy8qIEwgICAgICAgICAgICAgICovCisgIG9wal9zdHJlYW1fd3JpdGVfZGF0YShjaW8sbF9kYXRhX2hlYWRlciw0LHBfbWFuYWdlcik7CisgIG9wal9zdHJlYW1fc2VlayhjaW8sIGxlbnArbGVuLHBfbWFuYWdlcik7CisKKyAgcmV0dXJuIGxlbjsKK30KKyNlbmRpZgorI2VuZGlmIC8qIFVTRV9KUElQICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2pwMi5oIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDEzODgzCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuaApAQCAtMCwwICsxLDQ4MyBAQAorLyoKKyAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzIAorICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIAorICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cworICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBVbml2ZXJzaXRlIGNhdGhvbGlxdWUgZGUgTG91dmFpbiAoVUNMKSwgQmVsZ2l1bQorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFByb2Zlc3NvciBCZW5vaXQgTWFjcQorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIFlhbm5pY2sgVmVyc2NodWVyZW4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExLTIwMTIsIENlbnRyZSBOYXRpb25hbCBkJ0V0dWRlcyBTcGF0aWFsZXMgKENORVMpLCBGUiAKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ1MgU3lzdGVtZXMgZCdJbmZvcm1hdGlvbiwgRnJhbmNlCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisjaWZuZGVmIF9fSlAyX0gKKyNkZWZpbmUgX19KUDJfSAorLyoqCitAZmlsZSBqcDIuaAorQGJyaWVmIFRoZSBKUEVHLTIwMDAgZmlsZSBmb3JtYXQgUmVhZGVyL1dyaXRlciAoSlAyKQorCisqLworCisvKiogQGRlZmdyb3VwIEpQMiBKUDIgLSBKUEVHLTIwMDAgZmlsZSBmb3JtYXQgcmVhZGVyL3dyaXRlciAqLworLypAeyovCisKKy8qI2RlZmluZSBKUElQX0pQSVAgMHg2YTcwNjk3MCovCisKKyNkZWZpbmUgICAgIEpQMl9KUCAgIDB4NmE1MDIwMjAgICAgLyoqPCBKUEVHIDIwMDAgc2lnbmF0dXJlIGJveCAqLworI2RlZmluZSAgICAgSlAyX0ZUWVAgMHg2Njc0Nzk3MCAgICAvKio8IEZpbGUgdHlwZSBib3ggKi8KKyNkZWZpbmUgICAgIEpQMl9KUDJIIDB4NmE3MDMyNjggICAgLyoqPCBKUDIgaGVhZGVyIGJveCAoc3VwZXItYm94KSAqLworI2RlZmluZSAgICAgSlAyX0lIRFIgMHg2OTY4NjQ3MiAgICAvKio8IEltYWdlIGhlYWRlciBib3ggKi8KKyNkZWZpbmUgICAgIEpQMl9DT0xSIDB4NjM2ZjZjNzIgICAgLyoqPCBDb2xvdXIgc3BlY2lmaWNhdGlvbiBib3ggKi8KKyNkZWZpbmUgICAgIEpQMl9KUDJDIDB4NmE3MDMyNjMgICAgLyoqPCBDb250aWd1b3VzIGNvZGVzdHJlYW0gYm94ICovCisjZGVmaW5lICAgICBKUDJfVVJMICAweDc1NzI2YzIwICAgIC8qKjwgRGF0YSBlbnRyeSBVUkwgYm94ICovCisjZGVmaW5lICAgICBKUDJfUENMUiAweDcwNjM2YzcyICAgIC8qKjwgUGFsZXR0ZSBib3ggKi8KKyNkZWZpbmUgICAgIEpQMl9DTUFQIDB4NjM2ZDYxNzAgICAgLyoqPCBDb21wb25lbnQgTWFwcGluZyBib3ggKi8KKyNkZWZpbmUgICAgIEpQMl9DREVGIDB4NjM2NDY1NjYgICAgLyoqPCBDaGFubmVsIERlZmluaXRpb24gYm94ICovCisjZGVmaW5lICAgICBKUDJfRFRCTCAweDY0NzQ2MjZjICAgIC8qKjwgRGF0YSBSZWZlcmVuY2UgYm94ICovCisjZGVmaW5lICAgICBKUDJfQlBDQyAweDYyNzA2MzYzICAgIC8qKjwgQml0cyBwZXIgY29tcG9uZW50IGJveCAqLworI2RlZmluZSAgICAgSlAyX0pQMiAgMHg2YTcwMzIyMCAgICAvKio8IEZpbGUgdHlwZSBmaWVsZHMgKi8KKworLyogRm9yIHRoZSBmdXR1cmUgKi8KKy8qICNkZWZpbmUgSlAyX1JFUyAweDcyNjU3MzIwICovICAvKio8IFJlc29sdXRpb24gYm94IChzdXBlci1ib3gpICovCisvKiAjZGVmaW5lIEpQMl9KUDJJIDB4NmE3MDMyNjkgKi8gIC8qKjwgSW50ZWxsZWN0dWFsIHByb3BlcnR5IGJveCAqLworLyogI2RlZmluZSBKUDJfWE1MICAweDc4NmQ2YzIwICovICAvKio8IFhNTCBib3ggKi8KKy8qICNkZWZpbmUgSlAyX1VVSUQgMHg3NTc1Njk5NCAqLyAgLyoqPCBVVUlEIGJveCAqLworLyogI2RlZmluZSBKUDJfVUlORiAweDc1Njk2ZTY2ICovICAvKio8IFVVSUQgaW5mbyBib3ggKHN1cGVyLWJveCkgKi8KKy8qICNkZWZpbmUgSlAyX1VMU1QgMHg3NTZjNzM3NCAqLyAgLyoqPCBVVUlEIGxpc3QgYm94ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3R5cGVkZWYgZW51bQoreworICBKUDJfU1RBVEVfTk9ORSAgICAgICAgICAgID0gMHgwLAorICBKUDJfU1RBVEVfU0lHTkFUVVJFICAgICAgID0gMHgxLAorICBKUDJfU1RBVEVfRklMRV9UWVBFICAgICAgID0gMHgyLAorICBKUDJfU1RBVEVfSEVBREVSICAgICAgICAgID0gMHg0LAorICBKUDJfU1RBVEVfQ09ERVNUUkVBTSAgICAgID0gMHg4LAorICBKUDJfU1RBVEVfRU5EX0NPREVTVFJFQU0gID0gMHgxMCwKKyAgSlAyX1NUQVRFX1VOS05PV04gICAgICAgICA9IDB4N2ZmZmZmZmYgLyogSVNPIEMgcmVzdHJpY3RzIGVudW1lcmF0b3IgdmFsdWVzIHRvIHJhbmdlIG9mICdpbnQnICovCit9CitKUDJfU1RBVEU7CisKK3R5cGVkZWYgZW51bQoreworICBKUDJfSU1HX1NUQVRFX05PTkUgICAgICAgID0gMHgwLAorICBKUDJfSU1HX1NUQVRFX1VOS05PV04gICAgID0gMHg3ZmZmZmZmZgorfQorSlAyX0lNR19TVEFURTsKKworLyoqIAorQ2hhbm5lbCBkZXNjcmlwdGlvbjogY2hhbm5lbCBpbmRleCwgdHlwZSwgYXNzb2NpYXRpb24KKyovCit0eXBlZGVmIHN0cnVjdCBvcGpfanAyX2NkZWZfaW5mbworeworICAgIE9QSl9VSU5UMTYgY24sIHR5cCwgYXNvYzsKK30gb3BqX2pwMl9jZGVmX2luZm9fdDsKKworLyoqIAorQ2hhbm5lbCBkZXNjcmlwdGlvbnMgYW5kIG51bWJlciBvZiBkZXNjcmlwdGlvbnMKKyovCit0eXBlZGVmIHN0cnVjdCBvcGpfanAyX2NkZWYKK3sKKyAgICBvcGpfanAyX2NkZWZfaW5mb190ICppbmZvOworICAgIE9QSl9VSU5UMTYgbjsKK30gb3BqX2pwMl9jZGVmX3Q7CisKKy8qKiAKK0NvbXBvbmVudCBtYXBwaW5nczogY2hhbm5lbCBpbmRleCwgbWFwcGluZyB0eXBlLCBwYWxldHRlIGluZGV4CisqLwordHlwZWRlZiBzdHJ1Y3Qgb3BqX2pwMl9jbWFwX2NvbXAKK3sKKyAgICBPUEpfVUlOVDE2IGNtcDsKKyAgICBPUEpfQllURSBtdHlwLCBwY29sOworfSBvcGpfanAyX2NtYXBfY29tcF90OworCisvKiogCitQYWxldHRlIGRhdGE6IHRhYmxlIGVudHJpZXMsIHBhbGV0dGUgY29sdW1ucworKi8KK3R5cGVkZWYgc3RydWN0IG9wal9qcDJfcGNscgoreworICAgIE9QSl9VSU5UMzIgKmVudHJpZXM7CisgICAgT1BKX0JZVEUgKmNoYW5uZWxfc2lnbjsKKyAgICBPUEpfQllURSAqY2hhbm5lbF9zaXplOworICAgIG9wal9qcDJfY21hcF9jb21wX3QgKmNtYXA7CisgICAgT1BKX1VJTlQxNiBucl9lbnRyaWVzOworICAgIE9QSl9CWVRFIG5yX2NoYW5uZWxzOworfSBvcGpfanAyX3BjbHJfdDsKKworLyoqIAorQ29sbGVjdG9yIGZvciBJQ0MgcHJvZmlsZSwgcGFsZXR0ZSwgY29tcG9uZW50IG1hcHBpbmcsIGNoYW5uZWwgZGVzY3JpcHRpb24gCisqLwordHlwZWRlZiBzdHJ1Y3Qgb3BqX2pwMl9jb2xvcgoreworICAgIE9QSl9CWVRFICppY2NfcHJvZmlsZV9idWY7CisgICAgT1BKX1VJTlQzMiBpY2NfcHJvZmlsZV9sZW47CisKKyAgICBvcGpfanAyX2NkZWZfdCAqanAyX2NkZWY7CisgICAgb3BqX2pwMl9wY2xyX3QgKmpwMl9wY2xyOworICAgIE9QSl9CWVRFIGpwMl9oYXNfY29scjsKK30gb3BqX2pwMl9jb2xvcl90OworCisvKiogCitKUDIgY29tcG9uZW50CisqLwordHlwZWRlZiBzdHJ1Y3Qgb3BqX2pwMl9jb21wcyB7CisgIE9QSl9VSU5UMzIgZGVwdGg7ICAgICAgCisgIE9QSl9VSU5UMzIgc2duZDsgICAgICAgCisgIE9QSl9VSU5UMzIgYnBjYzsKK30gb3BqX2pwMl9jb21wc190OworCisvKioKK0pQRUctMjAwMCBmaWxlIGZvcm1hdCByZWFkZXIvd3JpdGVyCisqLwordHlwZWRlZiBzdHJ1Y3Qgb3BqX2pwMgoreworICAvKiogaGFuZGxlIHRvIHRoZSBKMksgY29kZWMgICovCisgIG9wal9qMmtfdCAqajJrOworICAvKiogbGlzdCBvZiB2YWxpZGF0aW9uIHByb2NlZHVyZXMgKi8KKyAgc3RydWN0IG9wal9wcm9jZWR1cmVfbGlzdCAqIG1fdmFsaWRhdGlvbl9saXN0OworICAvKiogbGlzdCBvZiBleGVjdXRpb24gcHJvY2VkdXJlcyAqLworICBzdHJ1Y3Qgb3BqX3Byb2NlZHVyZV9saXN0ICogbV9wcm9jZWR1cmVfbGlzdDsKKworICAvKiB3aWR0aCBvZiBpbWFnZSAqLworICBPUEpfVUlOVDMyIHc7CisgIC8qIGhlaWdodCBvZiBpbWFnZSAqLworICBPUEpfVUlOVDMyIGg7CisgIC8qIG51bWJlciBvZiBjb21wb25lbnRzIGluIHRoZSBpbWFnZSAqLworICBPUEpfVUlOVDMyIG51bWNvbXBzOworICBPUEpfVUlOVDMyIGJwYzsKKyAgT1BKX1VJTlQzMiBDOworICBPUEpfVUlOVDMyIFVua0M7CisgIE9QSl9VSU5UMzIgSVBSOworICBPUEpfVUlOVDMyIG1ldGg7CisgIE9QSl9VSU5UMzIgYXBwcm94OworICBPUEpfVUlOVDMyIGVudW1jczsKKyAgT1BKX1VJTlQzMiBwcmVjZWRlbmNlOworICBPUEpfVUlOVDMyIGJyYW5kOworICBPUEpfVUlOVDMyIG1pbnZlcnNpb247CisgIE9QSl9VSU5UMzIgbnVtY2w7CisgIE9QSl9VSU5UMzIgKmNsOworICBvcGpfanAyX2NvbXBzX3QgKmNvbXBzOworICAvKiBGSVhNRTogVGhlIGZvbGxvd2luZyB0d28gdmFyaWFibGVzIGFyZSB1c2VkIHRvIHNhdmUgb2Zmc2V0CisgICAgYXMgd2Ugd3JpdGUgb3V0IGEgSlAyIGZpbGUgdG8gZGlzay4gVGhpcyBtZWNhbmlzbSBpcyBub3QgZmxleGlibGUKKyAgICBhcyBjb2RlYyB3cml0ZXJzIHdpbGwgbmVlZCB0byBleHRhbmQgdGhvc2UgZmllbGRzIGFzIG5ldyBwYXJ0CisgICAgb2YgdGhlIHN0YW5kYXJkIGFyZSBpbXBsZW1lbnRlZC4KKyAgKi8KKyAgICBPUEpfT0ZGX1QgajJrX2NvZGVzdHJlYW1fb2Zmc2V0OworICAgIE9QSl9PRkZfVCBqcGlwX2lwdHJfb2Zmc2V0OworCU9QSl9CT09MIGpwaXBfb247CisgIE9QSl9VSU5UMzIganAyX3N0YXRlOworICBPUEpfVUlOVDMyIGpwMl9pbWdfc3RhdGU7CisKKyAgb3BqX2pwMl9jb2xvcl90IGNvbG9yOworICAgIAorICAgIE9QSl9CT09MIGlnbm9yZV9wY2xyX2NtYXBfY2RlZjsKK30KK29wal9qcDJfdDsKKworLyoqCitKUDIgQm94CisqLwordHlwZWRlZiBzdHJ1Y3Qgb3BqX2pwMl9ib3ggeworICAgIE9QSl9VSU5UMzIgbGVuZ3RoOworICAgIE9QSl9VSU5UMzIgdHlwZTsKKyAgICBPUEpfSU5UMzIgaW5pdF9wb3M7Cit9IG9wal9qcDJfYm94X3Q7CisKK3R5cGVkZWYgc3RydWN0IG9wal9qcDJfaGVhZGVyX2hhbmRsZXIKK3sKKyAgLyogbWFya2VyIHZhbHVlICovCisgIE9QSl9VSU5UMzIgaWQ7CisgIC8qIGFjdGlvbiBsaW5rZWQgdG8gdGhlIG1hcmtlciAqLworICBPUEpfQk9PTCAoKmhhbmRsZXIpICggICAgIG9wal9qcDJfdCAqanAyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqcF9oZWFkZXJfZGF0YSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOworfQorb3BqX2pwMl9oZWFkZXJfaGFuZGxlcl90OworCisKK3R5cGVkZWYgc3RydWN0IG9wal9qcDJfaW1nX2hlYWRlcl93cml0ZXJfaGFuZGxlciAKK3sKKyAgLyogYWN0aW9uIHRvIHBlcmZvcm0gKi8KKyAgT1BKX0JZVEUqICAgKCpoYW5kbGVyKSAob3BqX2pwMl90ICpqcDIsIE9QSl9VSU5UMzIgKiBwX2RhdGFfc2l6ZSk7CisgIC8qIHJlc3VsdCBvZiB0aGUgYWN0aW9uIDogZGF0YSAqLworICBPUEpfQllURSogICBtX2RhdGE7CisgIC8qIHNpemUgb2YgZGF0YSAqLworICBPUEpfVUlOVDMyICBtX3NpemU7Cit9IAorb3BqX2pwMl9pbWdfaGVhZGVyX3dyaXRlcl9oYW5kbGVyX3Q7CisKKy8qKiBAbmFtZSBFeHBvcnRlZCBmdW5jdGlvbnMgKi8KKy8qQHsqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCitTZXR1cCB0aGUgZGVjb2RlciBkZWNvZGluZyBwYXJhbWV0ZXJzIHVzaW5nIHVzZXIgcGFyYW1ldGVycy4KK0RlY29kaW5nIHBhcmFtZXRlcnMgYXJlIHJldHVybmVkIGluIGpwMi0+ajJrLT5jcC4KK0BwYXJhbSBqcDIgSlAyIGRlY29tcHJlc3NvciBoYW5kbGUKK0BwYXJhbSBwYXJhbWV0ZXJzIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycworKi8KK3ZvaWQgb3BqX2pwMl9zZXR1cF9kZWNvZGVyKG9wal9qcDJfdCAqanAyLCBvcGpfZHBhcmFtZXRlcnNfdCAqcGFyYW1ldGVycyk7CisKKy8qKgorICogRGVjb2RlIGFuIGltYWdlIGZyb20gYSBKUEVHLTIwMDAgZmlsZSBzdHJlYW0KKyAqIEBwYXJhbSBqcDIgSlAyIGRlY29tcHJlc3NvciBoYW5kbGUKKyAqIEBwYXJhbSBwX3N0cmVhbSAgRklYTUUgRE9DCisgKiBAcGFyYW0gcF9pbWFnZSAgIEZJWE1FIERPQworICogQHBhcmFtIHBfbWFuYWdlciBGSVhNRSBET0MKKyAqCisgKiBAcmV0dXJuIFJldHVybnMgYSBkZWNvZGVkIGltYWdlIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKKyovCitPUEpfQk9PTCBvcGpfanAyX2RlY29kZShvcGpfanAyX3QgKmpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgIG9wal9pbWFnZV90KiBwX2ltYWdlLAorICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKKworLyoqCisgKiBTZXR1cCB0aGUgZW5jb2RlciBwYXJhbWV0ZXJzIHVzaW5nIHRoZSBjdXJyZW50IGltYWdlIGFuZCB1c2luZyB1c2VyIHBhcmFtZXRlcnMuIAorICogQ29kaW5nIHBhcmFtZXRlcnMgYXJlIHJldHVybmVkIGluIGpwMi0+ajJrLT5jcC4gCisgKgorICogQHBhcmFtIGpwMiBKUDIgY29tcHJlc3NvciBoYW5kbGUKKyAqIEBwYXJhbSBwYXJhbWV0ZXJzIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMKKyAqIEBwYXJhbSBpbWFnZSBpbnB1dCBmaWxsZWQgaW1hZ2UKKyAqIEBwYXJhbSBwX21hbmFnZXIgIEZJWE1FIERPQworICogQHJldHVybiBPUEpfVFJVRSBpZiBzdWNjZXNzZnVsLCBPUEpfRkFMU0Ugb3RoZXJ3aXNlCisqLworT1BKX0JPT0wgb3BqX2pwMl9zZXR1cF9lbmNvZGVyKCAgb3BqX2pwMl90ICpqcDIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jcGFyYW1ldGVyc190ICpwYXJhbWV0ZXJzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqaW1hZ2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CisKKy8qKgorRW5jb2RlIGFuIGltYWdlIGludG8gYSBKUEVHLTIwMDAgZmlsZSBzdHJlYW0KK0BwYXJhbSBqcDIgICAgICBKUDIgY29tcHJlc3NvciBoYW5kbGUKK0BwYXJhbSBzdHJlYW0gICAgT3V0cHV0IGJ1ZmZlciBzdHJlYW0KK0BwYXJhbSBwX21hbmFnZXIgIGV2ZW50IG1hbmFnZXIKK0ByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlCisqLworT1BKX0JPT0wgb3BqX2pwMl9lbmNvZGUoICBvcGpfanAyX3QgKmpwMiwgCisgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpzdHJlYW0sIAorICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOworCisKKy8qKgorICogU3RhcnRzIGEgY29tcHJlc3Npb24gc2NoZW1lLCBpLmUuIHZhbGlkYXRlcyB0aGUgY29kZWMgcGFyYW1ldGVycywgd3JpdGVzIHRoZSBoZWFkZXIuCisgKgorICogQHBhcmFtICBqcDIgICAgdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCisgKiBAcGFyYW0gIHN0cmVhbSAgICB0aGUgc3RyZWFtIG9iamVjdC4KKyAqIEBwYXJhbSAgcF9pbWFnZSAgIEZJWE1FIERPQworICogQHBhcmFtIHBfbWFuYWdlciBGSVhNRSBET0MKKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvZGVjIGlzIHZhbGlkLgorICovCitPUEpfQk9PTCBvcGpfanAyX3N0YXJ0X2NvbXByZXNzKG9wal9qcDJfdCAqanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqIHBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CisKKworLyoqCisgKiBFbmRzIHRoZSBjb21wcmVzc2lvbiBwcm9jZWR1cmVzIGFuZCBwb3NzaWJpbGl5IGFkZCBkYXRhIHRvIGJlIHJlYWQgYWZ0ZXIgdGhlCisgKiBjb2Rlc3RyZWFtLgorICovCitPUEpfQk9PTCBvcGpfanAyX2VuZF9jb21wcmVzcyggIG9wal9qcDJfdCAqanAyLAorICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKKyAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogRW5kcyB0aGUgZGVjb21wcmVzc2lvbiBwcm9jZWR1cmVzIGFuZCBwb3NzaWJpbGl5IGFkZCBkYXRhIHRvIGJlIHJlYWQgYWZ0ZXIgdGhlCisgKiBjb2Rlc3RyZWFtLgorICovCitPUEpfQk9PTCBvcGpfanAyX2VuZF9kZWNvbXByZXNzKG9wal9qcDJfdCAqanAyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKKworLyoqCisgKiBSZWFkcyBhIGpwZWcyMDAwIGZpbGUgaGVhZGVyIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gcF9zdHJlYW0gdGhlIHN0cmVhbSB0byByZWFkIGRhdGEgZnJvbS4KKyAqIEBwYXJhbSBqcDIgdGhlIGpwZWcyMDAwIGZpbGUgaGVhZGVyIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSBwX2ltYWdlICAgRklYTUUgRE9DCisgKiBAcGFyYW0gcF9tYW5hZ2VyIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisgKgorICogQHJldHVybiB0cnVlIGlmIHRoZSBib3ggaXMgdmFsaWQuCisgKi8KK09QSl9CT09MIG9wal9qcDJfcmVhZF9oZWFkZXIoICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9qcDJfdCAqanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqKiBwX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworLyoqCisgKiBSZWFkcyBhIHRpbGUgaGVhZGVyLgorICogQHBhcmFtICBwX2pwMiAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KKyAqIEBwYXJhbSAgcF90aWxlX2luZGV4ICBGSVhNRSBET0MKKyAqIEBwYXJhbSAgcF9kYXRhX3NpemUgICBGSVhNRSBET0MKKyAqIEBwYXJhbSAgcF90aWxlX3gwICAgICBGSVhNRSBET0MKKyAqIEBwYXJhbSAgcF90aWxlX3kwICAgICBGSVhNRSBET0MKKyAqIEBwYXJhbSAgcF90aWxlX3gxICAgICBGSVhNRSBET0MKKyAqIEBwYXJhbSAgcF90aWxlX3kxICAgICBGSVhNRSBET0MKKyAqIEBwYXJhbSAgcF9uYl9jb21wcyAgICBGSVhNRSBET0MKKyAqIEBwYXJhbSAgcF9nb19vbiAgICAgICBGSVhNRSBET0MKKyAqIEBwYXJhbSAgcF9zdHJlYW0gICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCisgKiBAcGFyYW0gIHBfbWFuYWdlciAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyAqLworT1BKX0JPT0wgb3BqX2pwMl9yZWFkX3RpbGVfaGVhZGVyICggb3BqX2pwMl90ICogcF9qcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF90aWxlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90aWxlX3gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90aWxlX3kwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90aWxlX3gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90aWxlX3kxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfbmJfY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQk9PTCAqIHBfZ29fb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworLyoqCisgKiBXcml0ZXMgYSB0aWxlLgorICoKKyAqIEBwYXJhbSAgcF9qcDIgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgorICogQHBhcmFtIHBfdGlsZV9pbmRleCAgRklYTUUgRE9DCisgKiBAcGFyYW0gcF9kYXRhICAgICAgICBGSVhNRSBET0MKKyAqIEBwYXJhbSBwX2RhdGFfc2l6ZSAgIEZJWE1FIERPQworICogQHBhcmFtICBwX3N0cmVhbSAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KKyAqIEBwYXJhbSAgcF9tYW5hZ2VyICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorICovCitPUEpfQk9PTCBvcGpfanAyX3dyaXRlX3RpbGUgKCAgb3BqX2pwMl90ICpwX2pwMiwKKyAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAorICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworCisvKioKKyAqIERlY29kZSB0aWxlIGRhdGEuCisgKiBAcGFyYW0gIHBfanAyICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KKyAqIEBwYXJhbSAgcF90aWxlX2luZGV4IEZJWE1FIERPQworICogQHBhcmFtICBwX2RhdGEgICAgICAgRklYTUUgRE9DCisgKiBAcGFyYW0gIHBfZGF0YV9zaXplICBGSVhNRSBET0MKKyAqIEBwYXJhbSAgcF9zdHJlYW0gICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCisgKiBAcGFyYW0gIHBfbWFuYWdlciAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyAqCisgKiBAcmV0dXJuIEZJWE1FIERPQworICovCitPUEpfQk9PTCBvcGpfanAyX2RlY29kZV90aWxlICggIG9wal9qcDJfdCAqIHBfanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisKKy8qKgorICogQ3JlYXRlcyBhIGpwZWcyMDAwIGZpbGUgZGVjb21wcmVzc29yLgorICoKKyAqIEByZXR1cm4gIGFuIGVtcHR5IGpwZWcyMDAwIGZpbGUgY29kZWMuCisgKi8KK29wal9qcDJfdCogb3BqX2pwMl9jcmVhdGUgKE9QSl9CT09MIHBfaXNfZGVjb2Rlcik7CisKKy8qKgorRGVzdHJveSBhIEpQMiBkZWNvbXByZXNzb3IgaGFuZGxlCitAcGFyYW0ganAyIEpQMiBkZWNvbXByZXNzb3IgaGFuZGxlIHRvIGRlc3Ryb3kKKyovCit2b2lkIG9wal9qcDJfZGVzdHJveShvcGpfanAyX3QgKmpwMik7CisKKworLyoqCisgKiBTZXRzIHRoZSBnaXZlbiBhcmVhIHRvIGJlIGRlY29kZWQuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCByaWdodCBhZnRlciBvcGpfcmVhZF9oZWFkZXIgYW5kIGJlZm9yZSBhbnkgdGlsZSBoZWFkZXIgcmVhZGluZy4KKyAqCisgKiBAcGFyYW0gIHBfanAyICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgorICogQHBhcmFtICBwX2ltYWdlICAgICBGSVhNRSBET0MKKyAqIEBwYXJhbSAgcF9zdGFydF94ICAgdGhlIGxlZnQgcG9zaXRpb24gb2YgdGhlIHJlY3RhbmdsZSB0byBkZWNvZGUgKGluIGltYWdlIGNvb3JkaW5hdGVzKS4KKyAqIEBwYXJhbSAgcF9zdGFydF95ICAgIHRoZSB1cCBwb3NpdGlvbiBvZiB0aGUgcmVjdGFuZ2xlIHRvIGRlY29kZSAoaW4gaW1hZ2UgY29vcmRpbmF0ZXMpLgorICogQHBhcmFtICBwX2VuZF94ICAgICAgdGhlIHJpZ2h0IHBvc2l0aW9uIG9mIHRoZSByZWN0YW5nbGUgdG8gZGVjb2RlIChpbiBpbWFnZSBjb29yZGluYXRlcykuCisgKiBAcGFyYW0gIHBfZW5kX3kgICAgICB0aGUgYm90dG9tIHBvc2l0aW9uIG9mIHRoZSByZWN0YW5nbGUgdG8gZGVjb2RlIChpbiBpbWFnZSBjb29yZGluYXRlcykuCisgKiBAcGFyYW0gIHBfbWFuYWdlciAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyCisgKgorICogQHJldHVybiAgdHJ1ZSAgICAgIGlmIHRoZSBhcmVhIGNvdWxkIGJlIHNldC4KKyAqLworT1BKX0JPT0wgb3BqX2pwMl9zZXRfZGVjb2RlX2FyZWEoICBvcGpfanAyX3QgKnBfanAyLAorICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCogcF9pbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfc3RhcnRfeCwgT1BKX0lOVDMyIHBfc3RhcnRfeSwKKyAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfZW5kX3gsIE9QSl9JTlQzMiBwX2VuZF95LAorICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKworIC8qKgorICogCisgKi8KK09QSl9CT09MIG9wal9qcDJfZ2V0X3RpbGUoICBvcGpfanAyX3QgKnBfanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCogcF9pbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0aWxlX2luZGV4ICk7CisKKworLyoqCisgKiAKKyAqLworT1BKX0JPT0wgb3BqX2pwMl9zZXRfZGVjb2RlZF9yZXNvbHV0aW9uX2ZhY3RvcihvcGpfanAyX3QgKnBfanAyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiByZXNfZmFjdG9yLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKKworCisvKiBUT0RPIE1TRDogY2xlYW4gdGhlc2UgMyBmdW5jdGlvbnMgKi8KKy8qKgorICogRHVtcCBzb21lIGVsZW1lbnRzIGZyb20gdGhlIEpQMiBkZWNvbXByZXNzaW9uIHN0cnVjdHVyZSAuCisgKgorICpAcGFyYW0gcF9qcDIgICAgICAgIHRoZSBqcDIgY29kZWMuCisgKkBwYXJhbSBmbGFnICAgICAgICBmbGFnIHRvIGRlc2NyaWJlIHdoYXQgZWxtZW50cyBhcmUgZHVtcC4KKyAqQHBhcmFtIG91dF9zdHJlYW0gICAgICBvdXRwdXQgc3RyZWFtIHdoZXJlIGR1bXAgdGhlIGVsZW1lbnRzLgorICoKKyovCit2b2lkIGpwMl9kdW1wIChvcGpfanAyX3QqIHBfanAyLCBPUEpfSU5UMzIgZmxhZywgRklMRSogb3V0X3N0cmVhbSk7CisKKy8qKgorICogR2V0IHRoZSBjb2Rlc3RyZWFtIGluZm8gZnJvbSBhIEpQRUcyMDAwIGNvZGVjLgorICoKKyAqQHBhcmFtICBwX2pwMiAgICAgICAganAyIGNvZGVjLgorICoKKyAqQHJldHVybiAgdGhlIGNvZGVzdHJlYW0gaW5mb3JtYXRpb24gZXh0cmFjdCBmcm9tIHRoZSBqcGcyMDAwIGNvZGVjCisgKi8KK29wal9jb2Rlc3RyZWFtX2luZm9fdjJfdCoganAyX2dldF9jc3RyX2luZm8ob3BqX2pwMl90KiBwX2pwMik7CisKKy8qKgorICogR2V0IHRoZSBjb2Rlc3RyZWFtIGluZGV4IGZyb20gYSBKUEVHMjAwMCBjb2RlYy4KKyAqCisgKkBwYXJhbSAgcF9qcDIgICAgICAgIGpwMiBjb2RlYy4KKyAqCisgKkByZXR1cm4gIHRoZSBjb2Rlc3RyZWFtIGluZGV4IGV4dHJhY3QgZnJvbSB0aGUganBnMjAwMCBjb2RlYworICovCitvcGpfY29kZXN0cmVhbV9pbmRleF90KiBqcDJfZ2V0X2NzdHJfaW5kZXgob3BqX2pwMl90KiBwX2pwMik7CisKKworLypAfSovCisKKy8qQH0qLworCisjZW5kaWYgLyogX19KUDJfSCAqLworCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL21jdC5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9tY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjAyNzZmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9tY3QuYwpAQCAtMCwwICsxLDU1MyBAQAorLyoKKyAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzIAorICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIAorICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cworICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBVbml2ZXJzaXRlIGNhdGhvbGlxdWUgZGUgTG91dmFpbiAoVUNMKSwgQmVsZ2l1bQorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFByb2Zlc3NvciBCZW5vaXQgTWFjcQorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMsIERhdmlkIEphbnNzZW5zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgWWFubmljayBWZXJzY2h1ZXJlbgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4IAorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTQsIEFudG9uaW4gRGVzY2FtcGUKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExLTIwMTIsIENlbnRyZSBOYXRpb25hbCBkJ0V0dWRlcyBTcGF0aWFsZXMgKENORVMpLCBGUiAKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ1MgU3lzdGVtZXMgZCdJbmZvcm1hdGlvbiwgRnJhbmNlCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZmRlZiBfX1NTRV9fCisjaW5jbHVkZSA8eG1taW50cmluLmg+CisjZW5kaWYKKyNpZmRlZiBfX1NTRTJfXworI2luY2x1ZGUgPGVtbWludHJpbi5oPgorI2VuZGlmCisjaWZkZWYgX19TU0U0XzFfXworI2luY2x1ZGUgPHNtbWludHJpbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJvcGpfaW5jbHVkZXMuaCIKKworLyogPHN1bW1hcnk+ICovCisvKiBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBub3JtcyBvZiB0aGUgYmFzaXMgZnVuY3Rpb24gb2YgdGhlIHJldmVyc2libGUgTUNULiAqLworLyogPC9zdW1tYXJ5PiAqLworc3RhdGljIGNvbnN0IE9QSl9GTE9BVDY0IG9wal9tY3Rfbm9ybXNbM10gPSB7IDEuNzMyLCAuODI5MiwgLjgyOTIgfTsKKworLyogPHN1bW1hcnk+ICovCisvKiBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBub3JtcyBvZiB0aGUgYmFzaXMgZnVuY3Rpb24gb2YgdGhlIGlycmV2ZXJzaWJsZSBNQ1QuICovCisvKiA8L3N1bW1hcnk+ICovCitzdGF0aWMgY29uc3QgT1BKX0ZMT0FUNjQgb3BqX21jdF9ub3Jtc19yZWFsWzNdID0geyAxLjczMiwgMS44MDUsIDEuNTczIH07CisKK2NvbnN0IE9QSl9GTE9BVDY0ICogb3BqX21jdF9nZXRfbWN0X25vcm1zICgpCit7CisJcmV0dXJuIG9wal9tY3Rfbm9ybXM7Cit9CisKK2NvbnN0IE9QSl9GTE9BVDY0ICogb3BqX21jdF9nZXRfbWN0X25vcm1zX3JlYWwgKCkKK3sKKwlyZXR1cm4gb3BqX21jdF9ub3Jtc19yZWFsOworfQorCisvKiA8c3VtbWFyeT4gKi8KKy8qIEZvcndhcmQgcmV2ZXJzaWJsZSBNQ1QuICovCisvKiA8L3N1bW1hcnk+ICovCisjaWZkZWYgX19TU0UyX18KK3ZvaWQgb3BqX21jdF9lbmNvZGUoCisJCU9QSl9JTlQzMiogcmVzdHJpY3QgYzAsCisJCU9QSl9JTlQzMiogcmVzdHJpY3QgYzEsCisJCU9QSl9JTlQzMiogcmVzdHJpY3QgYzIsCisJCU9QSl9VSU5UMzIgbikKK3sKKwlPUEpfU0laRV9UIGk7CisJY29uc3QgT1BKX1NJWkVfVCBsZW4gPSBuOworCQorCWZvcihpID0gMDsgaSA8IChsZW4gJiB+M1UpOyBpICs9IDQpIHsKKwkJX19tMTI4aSB5LCB1LCB2OworCQlfX20xMjhpIHIgPSBfbW1fbG9hZF9zaTEyOCgoY29uc3QgX19tMTI4aSAqKSYoYzBbaV0pKTsKKwkJX19tMTI4aSBnID0gX21tX2xvYWRfc2kxMjgoKGNvbnN0IF9fbTEyOGkgKikmKGMxW2ldKSk7CisJCV9fbTEyOGkgYiA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpICopJihjMltpXSkpOworCQl5ID0gX21tX2FkZF9lcGkzMihnLCBnKTsKKwkJeSA9IF9tbV9hZGRfZXBpMzIoeSwgYik7CisJCXkgPSBfbW1fYWRkX2VwaTMyKHksIHIpOworCQl5ID0gX21tX3NyYWlfZXBpMzIoeSwgMik7CisJCXUgPSBfbW1fc3ViX2VwaTMyKGIsIGcpOworCQl2ID0gX21tX3N1Yl9lcGkzMihyLCBnKTsKKwkJX21tX3N0b3JlX3NpMTI4KChfX20xMjhpICopJihjMFtpXSksIHkpOworCQlfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkgKikmKGMxW2ldKSwgdSk7CisJCV9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSAqKSYoYzJbaV0pLCB2KTsKKwl9CisJCisJZm9yKDsgaSA8IGxlbjsgKytpKSB7CisJCU9QSl9JTlQzMiByID0gYzBbaV07CisJCU9QSl9JTlQzMiBnID0gYzFbaV07CisJCU9QSl9JTlQzMiBiID0gYzJbaV07CisJCU9QSl9JTlQzMiB5ID0gKHIgKyAoZyAqIDIpICsgYikgPj4gMjsKKwkJT1BKX0lOVDMyIHUgPSBiIC0gZzsKKwkJT1BKX0lOVDMyIHYgPSByIC0gZzsKKwkJYzBbaV0gPSB5OworCQljMVtpXSA9IHU7CisJCWMyW2ldID0gdjsKKwl9Cit9CisjZWxzZQordm9pZCBvcGpfbWN0X2VuY29kZSgKKwkJT1BKX0lOVDMyKiByZXN0cmljdCBjMCwKKwkJT1BKX0lOVDMyKiByZXN0cmljdCBjMSwKKwkJT1BKX0lOVDMyKiByZXN0cmljdCBjMiwKKwkJT1BKX1VJTlQzMiBuKQoreworCU9QSl9TSVpFX1QgaTsKKwljb25zdCBPUEpfU0laRV9UIGxlbiA9IG47CisJCisJZm9yKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKwkJT1BKX0lOVDMyIHIgPSBjMFtpXTsKKwkJT1BKX0lOVDMyIGcgPSBjMVtpXTsKKwkJT1BKX0lOVDMyIGIgPSBjMltpXTsKKwkJT1BKX0lOVDMyIHkgPSAociArIChnICogMikgKyBiKSA+PiAyOworCQlPUEpfSU5UMzIgdSA9IGIgLSBnOworCQlPUEpfSU5UMzIgdiA9IHIgLSBnOworCQljMFtpXSA9IHk7CisJCWMxW2ldID0gdTsKKwkJYzJbaV0gPSB2OworCX0KK30KKyNlbmRpZgorCisvKiA8c3VtbWFyeT4gKi8KKy8qIEludmVyc2UgcmV2ZXJzaWJsZSBNQ1QuICovCisvKiA8L3N1bW1hcnk+ICovCisjaWZkZWYgX19TU0UyX18KK3ZvaWQgb3BqX21jdF9kZWNvZGUoCisJCU9QSl9JTlQzMiogcmVzdHJpY3QgYzAsCisJCU9QSl9JTlQzMiogcmVzdHJpY3QgYzEsCisJCU9QSl9JTlQzMiogcmVzdHJpY3QgYzIsCisJCU9QSl9VSU5UMzIgbikKK3sKKwlPUEpfU0laRV9UIGk7CisJY29uc3QgT1BKX1NJWkVfVCBsZW4gPSBuOworCQorCWZvcihpID0gMDsgaSA8IChsZW4gJiB+M1UpOyBpICs9IDQpIHsKKwkJX19tMTI4aSByLCBnLCBiOworCQlfX20xMjhpIHkgPSBfbW1fbG9hZF9zaTEyOCgoY29uc3QgX19tMTI4aSAqKSYoYzBbaV0pKTsKKwkJX19tMTI4aSB1ID0gX21tX2xvYWRfc2kxMjgoKGNvbnN0IF9fbTEyOGkgKikmKGMxW2ldKSk7CisJCV9fbTEyOGkgdiA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpICopJihjMltpXSkpOworCQlnID0geTsKKwkJZyA9IF9tbV9zdWJfZXBpMzIoZywgX21tX3NyYWlfZXBpMzIoX21tX2FkZF9lcGkzMih1LCB2KSwgMikpOworCQlyID0gX21tX2FkZF9lcGkzMih2LCBnKTsKKwkJYiA9IF9tbV9hZGRfZXBpMzIodSwgZyk7CisJCV9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSAqKSYoYzBbaV0pLCByKTsKKwkJX21tX3N0b3JlX3NpMTI4KChfX20xMjhpICopJihjMVtpXSksIGcpOworCQlfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkgKikmKGMyW2ldKSwgYik7CisJfQorCWZvciAoOyBpIDwgbGVuOyArK2kpIHsKKwkJT1BKX0lOVDMyIHkgPSBjMFtpXTsKKwkJT1BKX0lOVDMyIHUgPSBjMVtpXTsKKwkJT1BKX0lOVDMyIHYgPSBjMltpXTsKKwkJT1BKX0lOVDMyIGcgPSB5IC0gKCh1ICsgdikgPj4gMik7CisJCU9QSl9JTlQzMiByID0gdiArIGc7CisJCU9QSl9JTlQzMiBiID0gdSArIGc7CisJCWMwW2ldID0gcjsKKwkJYzFbaV0gPSBnOworCQljMltpXSA9IGI7CisJfQorfQorI2Vsc2UKK3ZvaWQgb3BqX21jdF9kZWNvZGUoCisJCU9QSl9JTlQzMiogcmVzdHJpY3QgYzAsCisJCU9QSl9JTlQzMiogcmVzdHJpY3QgYzEsIAorCQlPUEpfSU5UMzIqIHJlc3RyaWN0IGMyLCAKKwkJT1BKX1VJTlQzMiBuKQoreworCU9QSl9VSU5UMzIgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisJCU9QSl9JTlQzMiB5ID0gYzBbaV07CisJCU9QSl9JTlQzMiB1ID0gYzFbaV07CisJCU9QSl9JTlQzMiB2ID0gYzJbaV07CisJCU9QSl9JTlQzMiBnID0geSAtICgodSArIHYpID4+IDIpOworCQlPUEpfSU5UMzIgciA9IHYgKyBnOworCQlPUEpfSU5UMzIgYiA9IHUgKyBnOworCQljMFtpXSA9IHI7CisJCWMxW2ldID0gZzsKKwkJYzJbaV0gPSBiOworCX0KK30KKyNlbmRpZgorCisvKiA8c3VtbWFyeT4gKi8KKy8qIEdldCBub3JtIG9mIGJhc2lzIGZ1bmN0aW9uIG9mIHJldmVyc2libGUgTUNULiAqLworLyogPC9zdW1tYXJ5PiAqLworT1BKX0ZMT0FUNjQgb3BqX21jdF9nZXRub3JtKE9QSl9VSU5UMzIgY29tcG5vKSB7CisJcmV0dXJuIG9wal9tY3Rfbm9ybXNbY29tcG5vXTsKK30KKworLyogPHN1bW1hcnk+ICovCisvKiBGb3J3YXJkIGlycmV2ZXJzaWJsZSBNQ1QuICovCisvKiA8L3N1bW1hcnk+ICovCisjaWZkZWYgX19TU0U0XzFfXwordm9pZCBvcGpfbWN0X2VuY29kZV9yZWFsKAorCQkJCQkJCQkJCQkJIE9QSl9JTlQzMiogcmVzdHJpY3QgYzAsCisJCQkJCQkJCQkJCQkgT1BKX0lOVDMyKiByZXN0cmljdCBjMSwKKwkJCQkJCQkJCQkJCSBPUEpfSU5UMzIqIHJlc3RyaWN0IGMyLAorCQkJCQkJCQkJCQkJIE9QSl9VSU5UMzIgbikKK3sKKwlPUEpfU0laRV9UIGk7CisJY29uc3QgT1BKX1NJWkVfVCBsZW4gPSBuOworCQorCWNvbnN0IF9fbTEyOGkgcnkgPSBfbW1fc2V0MV9lcGkzMigyNDQ5KTsKKwljb25zdCBfX20xMjhpIGd5ID0gX21tX3NldDFfZXBpMzIoNDgwOSk7CisJY29uc3QgX19tMTI4aSBieSA9IF9tbV9zZXQxX2VwaTMyKDkzNCk7CisJY29uc3QgX19tMTI4aSBydSA9IF9tbV9zZXQxX2VwaTMyKDEzODIpOworCWNvbnN0IF9fbTEyOGkgZ3UgPSBfbW1fc2V0MV9lcGkzMigyNzE0KTsKKwkvKiBjb25zdCBfX20xMjhpIGJ1ID0gX21tX3NldDFfZXBpMzIoNDA5Nik7ICovCisJLyogY29uc3QgX19tMTI4aSBydiA9IF9tbV9zZXQxX2VwaTMyKDQwOTYpOyAqLworCWNvbnN0IF9fbTEyOGkgZ3YgPSBfbW1fc2V0MV9lcGkzMigzNDMwKTsKKwljb25zdCBfX20xMjhpIGJ2ID0gX21tX3NldDFfZXBpMzIoNjY2KTsKKwljb25zdCBfX20xMjhpIG11bHJvdW5kID0gX21tX3NodWZmbGVfZXBpMzIoX21tX2N2dHNpMzJfc2kxMjgoNDA5NiksIF9NTV9TSFVGRkxFKDEsIDAsIDEsIDApKTsKKwkKKwlmb3IoaSA9IDA7IGkgPCAobGVuICYgfjNVKTsgaSArPSA0KSB7CisJCV9fbTEyOGkgbG8sIGhpOworCQlfX20xMjhpIHksIHUsIHY7CisJCV9fbTEyOGkgciA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpICopJihjMFtpXSkpOworCQlfX20xMjhpIGcgPSBfbW1fbG9hZF9zaTEyOCgoY29uc3QgX19tMTI4aSAqKSYoYzFbaV0pKTsKKwkJX19tMTI4aSBiID0gX21tX2xvYWRfc2kxMjgoKGNvbnN0IF9fbTEyOGkgKikmKGMyW2ldKSk7CisJCQorCQlsbyA9IHI7CisJCWhpID0gX21tX3NodWZmbGVfZXBpMzIociwgX01NX1NIVUZGTEUoMywgMywgMSwgMSkpOworCQlsbyA9IF9tbV9tdWxfZXBpMzIobG8sIHJ5KTsKKwkJaGkgPSBfbW1fbXVsX2VwaTMyKGhpLCByeSk7CisJCWxvID0gX21tX2FkZF9lcGk2NChsbywgbXVscm91bmQpOworCQloaSA9IF9tbV9hZGRfZXBpNjQoaGksIG11bHJvdW5kKTsKKwkJbG8gPSBfbW1fc3JsaV9lcGk2NChsbywgMTMpOworCQloaSA9IF9tbV9zbGxpX2VwaTY0KGhpLCAzMi0xMyk7CisJCXkgPSBfbW1fYmxlbmRfZXBpMTYobG8sIGhpLCAweENDKTsKKwkJCisJCWxvID0gZzsKKwkJaGkgPSBfbW1fc2h1ZmZsZV9lcGkzMihnLCBfTU1fU0hVRkZMRSgzLCAzLCAxLCAxKSk7CisJCWxvID0gX21tX211bF9lcGkzMihsbywgZ3kpOworCQloaSA9IF9tbV9tdWxfZXBpMzIoaGksIGd5KTsKKwkJbG8gPSBfbW1fYWRkX2VwaTY0KGxvLCBtdWxyb3VuZCk7CisJCWhpID0gX21tX2FkZF9lcGk2NChoaSwgbXVscm91bmQpOworCQlsbyA9IF9tbV9zcmxpX2VwaTY0KGxvLCAxMyk7CisJCWhpID0gX21tX3NsbGlfZXBpNjQoaGksIDMyLTEzKTsKKwkJeSA9IF9tbV9hZGRfZXBpMzIoeSwgX21tX2JsZW5kX2VwaTE2KGxvLCBoaSwgMHhDQykpOworCQkKKwkJbG8gPSBiOworCQloaSA9IF9tbV9zaHVmZmxlX2VwaTMyKGIsIF9NTV9TSFVGRkxFKDMsIDMsIDEsIDEpKTsKKwkJbG8gPSBfbW1fbXVsX2VwaTMyKGxvLCBieSk7CisJCWhpID0gX21tX211bF9lcGkzMihoaSwgYnkpOworCQlsbyA9IF9tbV9hZGRfZXBpNjQobG8sIG11bHJvdW5kKTsKKwkJaGkgPSBfbW1fYWRkX2VwaTY0KGhpLCBtdWxyb3VuZCk7CisJCWxvID0gX21tX3NybGlfZXBpNjQobG8sIDEzKTsKKwkJaGkgPSBfbW1fc2xsaV9lcGk2NChoaSwgMzItMTMpOworCQl5ID0gX21tX2FkZF9lcGkzMih5LCBfbW1fYmxlbmRfZXBpMTYobG8sIGhpLCAweENDKSk7CisJCV9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSAqKSYoYzBbaV0pLCB5KTsKKwkJCisJCS8qbG8gPSBiOworCQloaSA9IF9tbV9zaHVmZmxlX2VwaTMyKGIsIF9NTV9TSFVGRkxFKDMsIDMsIDEsIDEpKTsKKwkJbG8gPSBfbW1fbXVsX2VwaTMyKGxvLCBtdWxyb3VuZCk7CisJCWhpID0gX21tX211bF9lcGkzMihoaSwgbXVscm91bmQpOyovCisJCWxvID0gX21tX2N2dGVwaTMyX2VwaTY0KF9tbV9zaHVmZmxlX2VwaTMyKGIsIF9NTV9TSFVGRkxFKDMsIDIsIDIsIDApKSk7CisJCWhpID0gX21tX2N2dGVwaTMyX2VwaTY0KF9tbV9zaHVmZmxlX2VwaTMyKGIsIF9NTV9TSFVGRkxFKDMsIDIsIDMsIDEpKSk7CisJCWxvID0gX21tX3NsbGlfZXBpNjQobG8sIDEyKTsKKwkJaGkgPSBfbW1fc2xsaV9lcGk2NChoaSwgMTIpOworCQlsbyA9IF9tbV9hZGRfZXBpNjQobG8sIG11bHJvdW5kKTsKKwkJaGkgPSBfbW1fYWRkX2VwaTY0KGhpLCBtdWxyb3VuZCk7CisJCWxvID0gX21tX3NybGlfZXBpNjQobG8sIDEzKTsKKwkJaGkgPSBfbW1fc2xsaV9lcGk2NChoaSwgMzItMTMpOworCQl1ID0gX21tX2JsZW5kX2VwaTE2KGxvLCBoaSwgMHhDQyk7CisJCQorCQlsbyA9IHI7CisJCWhpID0gX21tX3NodWZmbGVfZXBpMzIociwgX01NX1NIVUZGTEUoMywgMywgMSwgMSkpOworCQlsbyA9IF9tbV9tdWxfZXBpMzIobG8sIHJ1KTsKKwkJaGkgPSBfbW1fbXVsX2VwaTMyKGhpLCBydSk7CisJCWxvID0gX21tX2FkZF9lcGk2NChsbywgbXVscm91bmQpOworCQloaSA9IF9tbV9hZGRfZXBpNjQoaGksIG11bHJvdW5kKTsKKwkJbG8gPSBfbW1fc3JsaV9lcGk2NChsbywgMTMpOworCQloaSA9IF9tbV9zbGxpX2VwaTY0KGhpLCAzMi0xMyk7CisJCXUgPSBfbW1fc3ViX2VwaTMyKHUsIF9tbV9ibGVuZF9lcGkxNihsbywgaGksIDB4Q0MpKTsKKwkJCisJCWxvID0gZzsKKwkJaGkgPSBfbW1fc2h1ZmZsZV9lcGkzMihnLCBfTU1fU0hVRkZMRSgzLCAzLCAxLCAxKSk7CisJCWxvID0gX21tX211bF9lcGkzMihsbywgZ3UpOworCQloaSA9IF9tbV9tdWxfZXBpMzIoaGksIGd1KTsKKwkJbG8gPSBfbW1fYWRkX2VwaTY0KGxvLCBtdWxyb3VuZCk7CisJCWhpID0gX21tX2FkZF9lcGk2NChoaSwgbXVscm91bmQpOworCQlsbyA9IF9tbV9zcmxpX2VwaTY0KGxvLCAxMyk7CisJCWhpID0gX21tX3NsbGlfZXBpNjQoaGksIDMyLTEzKTsKKwkJdSA9IF9tbV9zdWJfZXBpMzIodSwgX21tX2JsZW5kX2VwaTE2KGxvLCBoaSwgMHhDQykpOworCQlfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkgKikmKGMxW2ldKSwgdSk7CisJCQorCQkvKmxvID0gcjsKKwkJaGkgPSBfbW1fc2h1ZmZsZV9lcGkzMihyLCBfTU1fU0hVRkZMRSgzLCAzLCAxLCAxKSk7CisJCWxvID0gX21tX211bF9lcGkzMihsbywgbXVscm91bmQpOworCQloaSA9IF9tbV9tdWxfZXBpMzIoaGksIG11bHJvdW5kKTsqLworCQlsbyA9IF9tbV9jdnRlcGkzMl9lcGk2NChfbW1fc2h1ZmZsZV9lcGkzMihyLCBfTU1fU0hVRkZMRSgzLCAyLCAyLCAwKSkpOworCQloaSA9IF9tbV9jdnRlcGkzMl9lcGk2NChfbW1fc2h1ZmZsZV9lcGkzMihyLCBfTU1fU0hVRkZMRSgzLCAyLCAzLCAxKSkpOworCQlsbyA9IF9tbV9zbGxpX2VwaTY0KGxvLCAxMik7CisJCWhpID0gX21tX3NsbGlfZXBpNjQoaGksIDEyKTsKKwkJbG8gPSBfbW1fYWRkX2VwaTY0KGxvLCBtdWxyb3VuZCk7CisJCWhpID0gX21tX2FkZF9lcGk2NChoaSwgbXVscm91bmQpOworCQlsbyA9IF9tbV9zcmxpX2VwaTY0KGxvLCAxMyk7CisJCWhpID0gX21tX3NsbGlfZXBpNjQoaGksIDMyLTEzKTsKKwkJdiA9IF9tbV9ibGVuZF9lcGkxNihsbywgaGksIDB4Q0MpOworCQkKKwkJbG8gPSBnOworCQloaSA9IF9tbV9zaHVmZmxlX2VwaTMyKGcsIF9NTV9TSFVGRkxFKDMsIDMsIDEsIDEpKTsKKwkJbG8gPSBfbW1fbXVsX2VwaTMyKGxvLCBndik7CisJCWhpID0gX21tX211bF9lcGkzMihoaSwgZ3YpOworCQlsbyA9IF9tbV9hZGRfZXBpNjQobG8sIG11bHJvdW5kKTsKKwkJaGkgPSBfbW1fYWRkX2VwaTY0KGhpLCBtdWxyb3VuZCk7CisJCWxvID0gX21tX3NybGlfZXBpNjQobG8sIDEzKTsKKwkJaGkgPSBfbW1fc2xsaV9lcGk2NChoaSwgMzItMTMpOworCQl2ID0gX21tX3N1Yl9lcGkzMih2LCBfbW1fYmxlbmRfZXBpMTYobG8sIGhpLCAweENDKSk7CisJCQorCQlsbyA9IGI7CisJCWhpID0gX21tX3NodWZmbGVfZXBpMzIoYiwgX01NX1NIVUZGTEUoMywgMywgMSwgMSkpOworCQlsbyA9IF9tbV9tdWxfZXBpMzIobG8sIGJ2KTsKKwkJaGkgPSBfbW1fbXVsX2VwaTMyKGhpLCBidik7CisJCWxvID0gX21tX2FkZF9lcGk2NChsbywgbXVscm91bmQpOworCQloaSA9IF9tbV9hZGRfZXBpNjQoaGksIG11bHJvdW5kKTsKKwkJbG8gPSBfbW1fc3JsaV9lcGk2NChsbywgMTMpOworCQloaSA9IF9tbV9zbGxpX2VwaTY0KGhpLCAzMi0xMyk7CisJCXYgPSBfbW1fc3ViX2VwaTMyKHYsIF9tbV9ibGVuZF9lcGkxNihsbywgaGksIDB4Q0MpKTsKKwkJX21tX3N0b3JlX3NpMTI4KChfX20xMjhpICopJihjMltpXSksIHYpOworCX0KKwlmb3IoOyBpIDwgbGVuOyArK2kpIHsKKwkJT1BKX0lOVDMyIHIgPSBjMFtpXTsKKwkJT1BKX0lOVDMyIGcgPSBjMVtpXTsKKwkJT1BKX0lOVDMyIGIgPSBjMltpXTsKKwkJT1BKX0lOVDMyIHkgPSAgb3BqX2ludF9maXhfbXVsKHIsIDI0NDkpICsgb3BqX2ludF9maXhfbXVsKGcsIDQ4MDkpICsgb3BqX2ludF9maXhfbXVsKGIsIDkzNCk7CisJCU9QSl9JTlQzMiB1ID0gLW9wal9pbnRfZml4X211bChyLCAxMzgyKSAtIG9wal9pbnRfZml4X211bChnLCAyNzE0KSArIG9wal9pbnRfZml4X211bChiLCA0MDk2KTsKKwkJT1BKX0lOVDMyIHYgPSAgb3BqX2ludF9maXhfbXVsKHIsIDQwOTYpIC0gb3BqX2ludF9maXhfbXVsKGcsIDM0MzApIC0gb3BqX2ludF9maXhfbXVsKGIsIDY2Nik7CisJCWMwW2ldID0geTsKKwkJYzFbaV0gPSB1OworCQljMltpXSA9IHY7CisJfQorfQorI2Vsc2UKK3ZvaWQgb3BqX21jdF9lbmNvZGVfcmVhbCgKKwkJT1BKX0lOVDMyKiByZXN0cmljdCBjMCwKKwkJT1BKX0lOVDMyKiByZXN0cmljdCBjMSwKKwkJT1BKX0lOVDMyKiByZXN0cmljdCBjMiwKKwkJT1BKX1VJTlQzMiBuKQoreworCU9QSl9VSU5UMzIgaTsKKwlmb3IoaSA9IDA7IGkgPCBuOyArK2kpIHsKKwkJT1BKX0lOVDMyIHIgPSBjMFtpXTsKKwkJT1BKX0lOVDMyIGcgPSBjMVtpXTsKKwkJT1BKX0lOVDMyIGIgPSBjMltpXTsKKwkJT1BKX0lOVDMyIHkgPSAgb3BqX2ludF9maXhfbXVsKHIsIDI0NDkpICsgb3BqX2ludF9maXhfbXVsKGcsIDQ4MDkpICsgb3BqX2ludF9maXhfbXVsKGIsIDkzNCk7CisJCU9QSl9JTlQzMiB1ID0gLW9wal9pbnRfZml4X211bChyLCAxMzgyKSAtIG9wal9pbnRfZml4X211bChnLCAyNzE0KSArIG9wal9pbnRfZml4X211bChiLCA0MDk2KTsKKwkJT1BKX0lOVDMyIHYgPSAgb3BqX2ludF9maXhfbXVsKHIsIDQwOTYpIC0gb3BqX2ludF9maXhfbXVsKGcsIDM0MzApIC0gb3BqX2ludF9maXhfbXVsKGIsIDY2Nik7CisJCWMwW2ldID0geTsKKwkJYzFbaV0gPSB1OworCQljMltpXSA9IHY7CisJfQorfQorI2VuZGlmCisKKy8qIDxzdW1tYXJ5PiAqLworLyogSW52ZXJzZSBpcnJldmVyc2libGUgTUNULiAqLworLyogPC9zdW1tYXJ5PiAqLwordm9pZCBvcGpfbWN0X2RlY29kZV9yZWFsKAorCQlPUEpfRkxPQVQzMiogcmVzdHJpY3QgYzAsCisJCU9QSl9GTE9BVDMyKiByZXN0cmljdCBjMSwKKwkJT1BKX0ZMT0FUMzIqIHJlc3RyaWN0IGMyLAorCQlPUEpfVUlOVDMyIG4pCit7CisJT1BKX1VJTlQzMiBpOworI2lmZGVmIF9fU1NFX18KKwlfX20xMjggdnJ2LCB2Z3UsIHZndiwgdmJ1OworCXZydiA9IF9tbV9zZXQxX3BzKDEuNDAyZik7CisJdmd1ID0gX21tX3NldDFfcHMoMC4zNDQxM2YpOworCXZndiA9IF9tbV9zZXQxX3BzKDAuNzE0MTRmKTsKKwl2YnUgPSBfbW1fc2V0MV9wcygxLjc3MmYpOworCWZvciAoaSA9IDA7IGkgPCAobiA+PiAzKTsgKytpKSB7CisJCV9fbTEyOCB2eSwgdnUsIHZ2OworCQlfX20xMjggdnIsIHZnLCB2YjsKKworCQl2eSA9IF9tbV9sb2FkX3BzKGMwKTsKKwkJdnUgPSBfbW1fbG9hZF9wcyhjMSk7CisJCXZ2ID0gX21tX2xvYWRfcHMoYzIpOworCQl2ciA9IF9tbV9hZGRfcHModnksIF9tbV9tdWxfcHModnYsIHZydikpOworCQl2ZyA9IF9tbV9zdWJfcHMoX21tX3N1Yl9wcyh2eSwgX21tX211bF9wcyh2dSwgdmd1KSksIF9tbV9tdWxfcHModnYsIHZndikpOworCQl2YiA9IF9tbV9hZGRfcHModnksIF9tbV9tdWxfcHModnUsIHZidSkpOworCQlfbW1fc3RvcmVfcHMoYzAsIHZyKTsKKwkJX21tX3N0b3JlX3BzKGMxLCB2Zyk7CisJCV9tbV9zdG9yZV9wcyhjMiwgdmIpOworCQljMCArPSA0OworCQljMSArPSA0OworCQljMiArPSA0OworCisJCXZ5ID0gX21tX2xvYWRfcHMoYzApOworCQl2dSA9IF9tbV9sb2FkX3BzKGMxKTsKKwkJdnYgPSBfbW1fbG9hZF9wcyhjMik7CisJCXZyID0gX21tX2FkZF9wcyh2eSwgX21tX211bF9wcyh2diwgdnJ2KSk7CisJCXZnID0gX21tX3N1Yl9wcyhfbW1fc3ViX3BzKHZ5LCBfbW1fbXVsX3BzKHZ1LCB2Z3UpKSwgX21tX211bF9wcyh2diwgdmd2KSk7CisJCXZiID0gX21tX2FkZF9wcyh2eSwgX21tX211bF9wcyh2dSwgdmJ1KSk7CisJCV9tbV9zdG9yZV9wcyhjMCwgdnIpOworCQlfbW1fc3RvcmVfcHMoYzEsIHZnKTsKKwkJX21tX3N0b3JlX3BzKGMyLCB2Yik7CisJCWMwICs9IDQ7CisJCWMxICs9IDQ7CisJCWMyICs9IDQ7CisJfQorCW4gJj0gNzsKKyNlbmRpZgorCWZvcihpID0gMDsgaSA8IG47ICsraSkgeworCQlPUEpfRkxPQVQzMiB5ID0gYzBbaV07CisJCU9QSl9GTE9BVDMyIHUgPSBjMVtpXTsKKwkJT1BKX0ZMT0FUMzIgdiA9IGMyW2ldOworCQlPUEpfRkxPQVQzMiByID0geSArICh2ICogMS40MDJmKTsKKwkJT1BKX0ZMT0FUMzIgZyA9IHkgLSAodSAqIDAuMzQ0MTNmKSAtICh2ICogKDAuNzE0MTRmKSk7CisJCU9QSl9GTE9BVDMyIGIgPSB5ICsgKHUgKiAxLjc3MmYpOworCQljMFtpXSA9IHI7CisJCWMxW2ldID0gZzsKKwkJYzJbaV0gPSBiOworCX0KK30KKworLyogPHN1bW1hcnk+ICovCisvKiBHZXQgbm9ybSBvZiBiYXNpcyBmdW5jdGlvbiBvZiBpcnJldmVyc2libGUgTUNULiAqLworLyogPC9zdW1tYXJ5PiAqLworT1BKX0ZMT0FUNjQgb3BqX21jdF9nZXRub3JtX3JlYWwoT1BKX1VJTlQzMiBjb21wbm8pIHsKKwlyZXR1cm4gb3BqX21jdF9ub3Jtc19yZWFsW2NvbXBub107Cit9CisKKworT1BKX0JPT0wgb3BqX21jdF9lbmNvZGVfY3VzdG9tKAorCQkJCQkgICBPUEpfQllURSAqIHBDb2RpbmdkYXRhLAorCQkJCQkgICBPUEpfVUlOVDMyIG4sCisJCQkJCSAgIE9QSl9CWVRFICoqIHBEYXRhLAorCQkJCQkgICBPUEpfVUlOVDMyIHBOYkNvbXAsCisJCQkJCSAgIE9QSl9VSU5UMzIgaXNTaWduZWQpCit7CisJT1BKX0ZMT0FUMzIgKiBsTWN0ID0gKE9QSl9GTE9BVDMyICopIHBDb2RpbmdkYXRhOworCU9QSl9VSU5UMzIgaTsKKwlPUEpfVUlOVDMyIGo7CisJT1BKX1VJTlQzMiBrOworCU9QSl9VSU5UMzIgbE5iTWF0Q29lZmYgPSBwTmJDb21wICogcE5iQ29tcDsKKwlPUEpfSU5UMzIgKiBsQ3VycmVudERhdGEgPSAwMDsKKwlPUEpfSU5UMzIgKiBsQ3VycmVudE1hdHJpeCA9IDAwOworCU9QSl9JTlQzMiAqKiBsRGF0YSA9IChPUEpfSU5UMzIgKiopIHBEYXRhOworCU9QSl9VSU5UMzIgbE11bHRpcGxpY2F0b3IgPSAxIDw8IDEzOworCU9QSl9JTlQzMiAqIGxNY3RQdHI7CisKKyAgICBPUEpfQVJHX05PVF9VU0VEKGlzU2lnbmVkKTsKKworCWxDdXJyZW50RGF0YSA9IChPUEpfSU5UMzIgKikgb3BqX21hbGxvYygocE5iQ29tcCArIGxOYk1hdENvZWZmKSAqIHNpemVvZihPUEpfSU5UMzIpKTsKKwlpZiAoISBsQ3VycmVudERhdGEpIHsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisKKwlsQ3VycmVudE1hdHJpeCA9IGxDdXJyZW50RGF0YSArIHBOYkNvbXA7CisKKwlmb3IgKGkgPTA7aTxsTmJNYXRDb2VmZjsrK2kpIHsKKwkJbEN1cnJlbnRNYXRyaXhbaV0gPSAoT1BKX0lOVDMyKSAoKihsTWN0KyspICogKE9QSl9GTE9BVDMyKWxNdWx0aXBsaWNhdG9yKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSAgeworCQlsTWN0UHRyID0gbEN1cnJlbnRNYXRyaXg7CisJCWZvciAoaj0wO2o8cE5iQ29tcDsrK2opIHsKKwkJCWxDdXJyZW50RGF0YVtqXSA9ICgqKGxEYXRhW2pdKSk7CisJCX0KKworCQlmb3IgKGo9MDtqPHBOYkNvbXA7KytqKSB7CisJCQkqKGxEYXRhW2pdKSA9IDA7CisJCQlmb3IgKGs9MDtrPHBOYkNvbXA7KytrKSB7CisJCQkJKihsRGF0YVtqXSkgKz0gb3BqX2ludF9maXhfbXVsKCpsTWN0UHRyLCBsQ3VycmVudERhdGFba10pOworCQkJCSsrbE1jdFB0cjsKKwkJCX0KKworCQkJKytsRGF0YVtqXTsKKwkJfQorCX0KKworCW9wal9mcmVlKGxDdXJyZW50RGF0YSk7CisKKwlyZXR1cm4gT1BKX1RSVUU7Cit9CisKK09QSl9CT09MIG9wal9tY3RfZGVjb2RlX2N1c3RvbSgKKwkJCQkJICAgT1BKX0JZVEUgKiBwRGVjb2RpbmdEYXRhLAorCQkJCQkgICBPUEpfVUlOVDMyIG4sCisJCQkJCSAgIE9QSl9CWVRFICoqIHBEYXRhLAorCQkJCQkgICBPUEpfVUlOVDMyIHBOYkNvbXAsCisJCQkJCSAgIE9QSl9VSU5UMzIgaXNTaWduZWQpCit7CisJT1BKX0ZMT0FUMzIgKiBsTWN0OworCU9QSl9VSU5UMzIgaTsKKwlPUEpfVUlOVDMyIGo7CisJT1BKX1VJTlQzMiBrOworCisJT1BKX0ZMT0FUMzIgKiBsQ3VycmVudERhdGEgPSAwMDsKKwlPUEpfRkxPQVQzMiAqIGxDdXJyZW50UmVzdWx0ID0gMDA7CisJT1BKX0ZMT0FUMzIgKiogbERhdGEgPSAoT1BKX0ZMT0FUMzIgKiopIHBEYXRhOworCisgICAgT1BKX0FSR19OT1RfVVNFRChpc1NpZ25lZCk7CisKKwlsQ3VycmVudERhdGEgPSAoT1BKX0ZMT0FUMzIgKikgb3BqX21hbGxvYyAoMiAqIHBOYkNvbXAgKiBzaXplb2YoT1BKX0ZMT0FUMzIpKTsKKwlpZiAoISBsQ3VycmVudERhdGEpIHsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisJbEN1cnJlbnRSZXN1bHQgPSBsQ3VycmVudERhdGEgKyBwTmJDb21wOworCisJZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworCQlsTWN0ID0gKE9QSl9GTE9BVDMyICopIHBEZWNvZGluZ0RhdGE7CisJCWZvciAoaj0wO2o8cE5iQ29tcDsrK2opIHsKKwkJCWxDdXJyZW50RGF0YVtqXSA9IChPUEpfRkxPQVQzMikgKCoobERhdGFbal0pKTsKKwkJfQorCQlmb3IgKGo9MDtqPHBOYkNvbXA7KytqKSB7CisJCQlsQ3VycmVudFJlc3VsdFtqXSA9IDA7CisJCQlmb3IJKGs9MDtrPHBOYkNvbXA7KytrKQl7CisJCQkJbEN1cnJlbnRSZXN1bHRbal0gKz0gKihsTWN0KyspICogbEN1cnJlbnREYXRhW2tdOworCQkJfQorCQkJKihsRGF0YVtqXSsrKSA9IChPUEpfRkxPQVQzMikgKGxDdXJyZW50UmVzdWx0W2pdKTsKKwkJfQorCX0KKwlvcGpfZnJlZShsQ3VycmVudERhdGEpOworCXJldHVybiBPUEpfVFJVRTsKK30KKwordm9pZCBvcGpfY2FsY3VsYXRlX25vcm1zKAlPUEpfRkxPQVQ2NCAqIHBOb3JtcywKKwkJCQkJCQlPUEpfVUlOVDMyIHBOYkNvbXBzLAorCQkJCQkJCU9QSl9GTE9BVDMyICogcE1hdHJpeCkKK3sKKwlPUEpfVUlOVDMyIGksaixsSW5kZXg7CisJT1BKX0ZMT0FUMzIgbEN1cnJlbnRWYWx1ZTsKKwlPUEpfRkxPQVQ2NCAqIGxOb3JtcyA9IChPUEpfRkxPQVQ2NCAqKSBwTm9ybXM7CisJT1BKX0ZMT0FUMzIgKiBsTWF0cml4ID0gKE9QSl9GTE9BVDMyICopIHBNYXRyaXg7CisKKwlmb3IJKGk9MDtpPHBOYkNvbXBzOysraSkgeworCQlsTm9ybXNbaV0gPSAwOworCQlsSW5kZXggPSBpOworCisJCWZvcgkoaj0wO2o8cE5iQ29tcHM7KytqKSB7CisJCQlsQ3VycmVudFZhbHVlID0gbE1hdHJpeFtsSW5kZXhdOworCQkJbEluZGV4ICs9IHBOYkNvbXBzOworCQkJbE5vcm1zW2ldICs9IGxDdXJyZW50VmFsdWUgKiBsQ3VycmVudFZhbHVlOworCQl9CisJCWxOb3Jtc1tpXSA9IHNxcnQobE5vcm1zW2ldKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvbWN0LmggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL21jdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvbWN0LmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvbWN0LmgKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvbXFjLmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL21xYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMGY1NjMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL21xYy5jCkBAIC0wLDAgKzEsNjE0IEBACisvKgorICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCisgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFVuaXZlcnNpdGUgY2F0aG9saXF1ZSBkZSBMb3V2YWluIChVQ0wpLCBCZWxnaXVtCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQorICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIEplcm9tZSBGaW1lcywgQ29tbXVuaWNhdGlvbnMgJiBTeXN0ZW1lcyA8amVyb21lLmZpbWVzQGMtcy5mcj4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgQVMgSVMnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIm9wal9pbmNsdWRlcy5oIgorCisvKiogQGRlZmdyb3VwIE1RQyBNUUMgLSBJbXBsZW1lbnRhdGlvbiBvZiBhbiBNUS1Db2RlciAqLworLypAeyovCisKKy8qKiBAbmFtZSBMb2NhbCBzdGF0aWMgZnVuY3Rpb25zICovCisvKkB7Ki8KKworLyoqCitPdXRwdXQgYSBieXRlLCBkb2luZyBiaXQtc3R1ZmZpbmcgaWYgbmVjZXNzYXJ5LgorQWZ0ZXIgYSAweGZmIGJ5dGUsIHRoZSBuZXh0IGJ5dGUgbXVzdCBiZSBzbWFsbGVyIHRoYW4gMHg5MC4KK0BwYXJhbSBtcWMgTVFDIGhhbmRsZQorKi8KK3N0YXRpYyB2b2lkIG9wal9tcWNfYnl0ZW91dChvcGpfbXFjX3QgKm1xYyk7CisvKioKK1Jlbm9ybWFsaXplIG1xYy0+YSBhbmQgbXFjLT5jIHdoaWxlIGVuY29kaW5nLCBzbyB0aGF0IG1xYy0+YSBzdGF5cyBiZXR3ZWVuIDB4ODAwMCBhbmQgMHgxMDAwMAorQHBhcmFtIG1xYyBNUUMgaGFuZGxlCisqLworc3RhdGljIHZvaWQgb3BqX21xY19yZW5vcm1lKG9wal9tcWNfdCAqbXFjKTsKKy8qKgorRW5jb2RlIHRoZSBtb3N0IHByb2JhYmxlIHN5bWJvbAorQHBhcmFtIG1xYyBNUUMgaGFuZGxlCisqLworc3RhdGljIHZvaWQgb3BqX21xY19jb2RlbXBzKG9wal9tcWNfdCAqbXFjKTsKKy8qKgorRW5jb2RlIHRoZSBtb3N0IGxlYXN0IHN5bWJvbAorQHBhcmFtIG1xYyBNUUMgaGFuZGxlCisqLworc3RhdGljIHZvaWQgb3BqX21xY19jb2RlbHBzKG9wal9tcWNfdCAqbXFjKTsKKy8qKgorRmlsbCBtcWMtPmMgd2l0aCAxJ3MgZm9yIGZsdXNoaW5nCitAcGFyYW0gbXFjIE1RQyBoYW5kbGUKKyovCitzdGF0aWMgdm9pZCBvcGpfbXFjX3NldGJpdHMob3BqX21xY190ICptcWMpOworLyoqCitGSVhNRSBET0MKK0BwYXJhbSBtcWMgTVFDIGhhbmRsZQorQHJldHVybiAKKyovCitzdGF0aWMgSU5MSU5FIE9QSl9JTlQzMiBvcGpfbXFjX21wc2V4Y2hhbmdlKG9wal9tcWNfdCAqY29uc3QgbXFjKTsKKy8qKgorRklYTUUgRE9DCitAcGFyYW0gbXFjIE1RQyBoYW5kbGUKK0ByZXR1cm4gCisqLworc3RhdGljIElOTElORSBPUEpfSU5UMzIgb3BqX21xY19scHNleGNoYW5nZShvcGpfbXFjX3QgKmNvbnN0IG1xYyk7CisvKioKK0lucHV0IGEgYnl0ZQorQHBhcmFtIG1xYyBNUUMgaGFuZGxlCisqLworc3RhdGljIElOTElORSB2b2lkIG9wal9tcWNfYnl0ZWluKG9wal9tcWNfdCAqY29uc3QgbXFjKTsKKy8qKgorUmVub3JtYWxpemUgbXFjLT5hIGFuZCBtcWMtPmMgd2hpbGUgZGVjb2RpbmcKK0BwYXJhbSBtcWMgTVFDIGhhbmRsZQorKi8KK3N0YXRpYyBJTkxJTkUgdm9pZCBvcGpfbXFjX3Jlbm9ybWQob3BqX21xY190ICpjb25zdCBtcWMpOworLypAfSovCisKKy8qQH0qLworCisvKiA8c3VtbWFyeT4gKi8KKy8qIFRoaXMgYXJyYXkgZGVmaW5lcyBhbGwgdGhlIHBvc3NpYmxlIHN0YXRlcyBmb3IgYSBjb250ZXh0LiAqLworLyogPC9zdW1tYXJ5PiAqLworc3RhdGljIG9wal9tcWNfc3RhdGVfdCBtcWNfc3RhdGVzWzQ3ICogMl0gPSB7CisJezB4NTYwMSwgMCwgJm1xY19zdGF0ZXNbMl0sICZtcWNfc3RhdGVzWzNdfSwKKwl7MHg1NjAxLCAxLCAmbXFjX3N0YXRlc1szXSwgJm1xY19zdGF0ZXNbMl19LAorCXsweDM0MDEsIDAsICZtcWNfc3RhdGVzWzRdLCAmbXFjX3N0YXRlc1sxMl19LAorCXsweDM0MDEsIDEsICZtcWNfc3RhdGVzWzVdLCAmbXFjX3N0YXRlc1sxM119LAorCXsweDE4MDEsIDAsICZtcWNfc3RhdGVzWzZdLCAmbXFjX3N0YXRlc1sxOF19LAorCXsweDE4MDEsIDEsICZtcWNfc3RhdGVzWzddLCAmbXFjX3N0YXRlc1sxOV19LAorCXsweDBhYzEsIDAsICZtcWNfc3RhdGVzWzhdLCAmbXFjX3N0YXRlc1syNF19LAorCXsweDBhYzEsIDEsICZtcWNfc3RhdGVzWzldLCAmbXFjX3N0YXRlc1syNV19LAorCXsweDA1MjEsIDAsICZtcWNfc3RhdGVzWzEwXSwgJm1xY19zdGF0ZXNbNThdfSwKKwl7MHgwNTIxLCAxLCAmbXFjX3N0YXRlc1sxMV0sICZtcWNfc3RhdGVzWzU5XX0sCisJezB4MDIyMSwgMCwgJm1xY19zdGF0ZXNbNzZdLCAmbXFjX3N0YXRlc1s2Nl19LAorCXsweDAyMjEsIDEsICZtcWNfc3RhdGVzWzc3XSwgJm1xY19zdGF0ZXNbNjddfSwKKwl7MHg1NjAxLCAwLCAmbXFjX3N0YXRlc1sxNF0sICZtcWNfc3RhdGVzWzEzXX0sCisJezB4NTYwMSwgMSwgJm1xY19zdGF0ZXNbMTVdLCAmbXFjX3N0YXRlc1sxMl19LAorCXsweDU0MDEsIDAsICZtcWNfc3RhdGVzWzE2XSwgJm1xY19zdGF0ZXNbMjhdfSwKKwl7MHg1NDAxLCAxLCAmbXFjX3N0YXRlc1sxN10sICZtcWNfc3RhdGVzWzI5XX0sCisJezB4NDgwMSwgMCwgJm1xY19zdGF0ZXNbMThdLCAmbXFjX3N0YXRlc1syOF19LAorCXsweDQ4MDEsIDEsICZtcWNfc3RhdGVzWzE5XSwgJm1xY19zdGF0ZXNbMjldfSwKKwl7MHgzODAxLCAwLCAmbXFjX3N0YXRlc1syMF0sICZtcWNfc3RhdGVzWzI4XX0sCisJezB4MzgwMSwgMSwgJm1xY19zdGF0ZXNbMjFdLCAmbXFjX3N0YXRlc1syOV19LAorCXsweDMwMDEsIDAsICZtcWNfc3RhdGVzWzIyXSwgJm1xY19zdGF0ZXNbMzRdfSwKKwl7MHgzMDAxLCAxLCAmbXFjX3N0YXRlc1syM10sICZtcWNfc3RhdGVzWzM1XX0sCisJezB4MjQwMSwgMCwgJm1xY19zdGF0ZXNbMjRdLCAmbXFjX3N0YXRlc1szNl19LAorCXsweDI0MDEsIDEsICZtcWNfc3RhdGVzWzI1XSwgJm1xY19zdGF0ZXNbMzddfSwKKwl7MHgxYzAxLCAwLCAmbXFjX3N0YXRlc1syNl0sICZtcWNfc3RhdGVzWzQwXX0sCisJezB4MWMwMSwgMSwgJm1xY19zdGF0ZXNbMjddLCAmbXFjX3N0YXRlc1s0MV19LAorCXsweDE2MDEsIDAsICZtcWNfc3RhdGVzWzU4XSwgJm1xY19zdGF0ZXNbNDJdfSwKKwl7MHgxNjAxLCAxLCAmbXFjX3N0YXRlc1s1OV0sICZtcWNfc3RhdGVzWzQzXX0sCisJezB4NTYwMSwgMCwgJm1xY19zdGF0ZXNbMzBdLCAmbXFjX3N0YXRlc1syOV19LAorCXsweDU2MDEsIDEsICZtcWNfc3RhdGVzWzMxXSwgJm1xY19zdGF0ZXNbMjhdfSwKKwl7MHg1NDAxLCAwLCAmbXFjX3N0YXRlc1szMl0sICZtcWNfc3RhdGVzWzI4XX0sCisJezB4NTQwMSwgMSwgJm1xY19zdGF0ZXNbMzNdLCAmbXFjX3N0YXRlc1syOV19LAorCXsweDUxMDEsIDAsICZtcWNfc3RhdGVzWzM0XSwgJm1xY19zdGF0ZXNbMzBdfSwKKwl7MHg1MTAxLCAxLCAmbXFjX3N0YXRlc1szNV0sICZtcWNfc3RhdGVzWzMxXX0sCisJezB4NDgwMSwgMCwgJm1xY19zdGF0ZXNbMzZdLCAmbXFjX3N0YXRlc1szMl19LAorCXsweDQ4MDEsIDEsICZtcWNfc3RhdGVzWzM3XSwgJm1xY19zdGF0ZXNbMzNdfSwKKwl7MHgzODAxLCAwLCAmbXFjX3N0YXRlc1szOF0sICZtcWNfc3RhdGVzWzM0XX0sCisJezB4MzgwMSwgMSwgJm1xY19zdGF0ZXNbMzldLCAmbXFjX3N0YXRlc1szNV19LAorCXsweDM0MDEsIDAsICZtcWNfc3RhdGVzWzQwXSwgJm1xY19zdGF0ZXNbMzZdfSwKKwl7MHgzNDAxLCAxLCAmbXFjX3N0YXRlc1s0MV0sICZtcWNfc3RhdGVzWzM3XX0sCisJezB4MzAwMSwgMCwgJm1xY19zdGF0ZXNbNDJdLCAmbXFjX3N0YXRlc1szOF19LAorCXsweDMwMDEsIDEsICZtcWNfc3RhdGVzWzQzXSwgJm1xY19zdGF0ZXNbMzldfSwKKwl7MHgyODAxLCAwLCAmbXFjX3N0YXRlc1s0NF0sICZtcWNfc3RhdGVzWzM4XX0sCisJezB4MjgwMSwgMSwgJm1xY19zdGF0ZXNbNDVdLCAmbXFjX3N0YXRlc1szOV19LAorCXsweDI0MDEsIDAsICZtcWNfc3RhdGVzWzQ2XSwgJm1xY19zdGF0ZXNbNDBdfSwKKwl7MHgyNDAxLCAxLCAmbXFjX3N0YXRlc1s0N10sICZtcWNfc3RhdGVzWzQxXX0sCisJezB4MjIwMSwgMCwgJm1xY19zdGF0ZXNbNDhdLCAmbXFjX3N0YXRlc1s0Ml19LAorCXsweDIyMDEsIDEsICZtcWNfc3RhdGVzWzQ5XSwgJm1xY19zdGF0ZXNbNDNdfSwKKwl7MHgxYzAxLCAwLCAmbXFjX3N0YXRlc1s1MF0sICZtcWNfc3RhdGVzWzQ0XX0sCisJezB4MWMwMSwgMSwgJm1xY19zdGF0ZXNbNTFdLCAmbXFjX3N0YXRlc1s0NV19LAorCXsweDE4MDEsIDAsICZtcWNfc3RhdGVzWzUyXSwgJm1xY19zdGF0ZXNbNDZdfSwKKwl7MHgxODAxLCAxLCAmbXFjX3N0YXRlc1s1M10sICZtcWNfc3RhdGVzWzQ3XX0sCisJezB4MTYwMSwgMCwgJm1xY19zdGF0ZXNbNTRdLCAmbXFjX3N0YXRlc1s0OF19LAorCXsweDE2MDEsIDEsICZtcWNfc3RhdGVzWzU1XSwgJm1xY19zdGF0ZXNbNDldfSwKKwl7MHgxNDAxLCAwLCAmbXFjX3N0YXRlc1s1Nl0sICZtcWNfc3RhdGVzWzUwXX0sCisJezB4MTQwMSwgMSwgJm1xY19zdGF0ZXNbNTddLCAmbXFjX3N0YXRlc1s1MV19LAorCXsweDEyMDEsIDAsICZtcWNfc3RhdGVzWzU4XSwgJm1xY19zdGF0ZXNbNTJdfSwKKwl7MHgxMjAxLCAxLCAmbXFjX3N0YXRlc1s1OV0sICZtcWNfc3RhdGVzWzUzXX0sCisJezB4MTEwMSwgMCwgJm1xY19zdGF0ZXNbNjBdLCAmbXFjX3N0YXRlc1s1NF19LAorCXsweDExMDEsIDEsICZtcWNfc3RhdGVzWzYxXSwgJm1xY19zdGF0ZXNbNTVdfSwKKwl7MHgwYWMxLCAwLCAmbXFjX3N0YXRlc1s2Ml0sICZtcWNfc3RhdGVzWzU2XX0sCisJezB4MGFjMSwgMSwgJm1xY19zdGF0ZXNbNjNdLCAmbXFjX3N0YXRlc1s1N119LAorCXsweDA5YzEsIDAsICZtcWNfc3RhdGVzWzY0XSwgJm1xY19zdGF0ZXNbNThdfSwKKwl7MHgwOWMxLCAxLCAmbXFjX3N0YXRlc1s2NV0sICZtcWNfc3RhdGVzWzU5XX0sCisJezB4MDhhMSwgMCwgJm1xY19zdGF0ZXNbNjZdLCAmbXFjX3N0YXRlc1s2MF19LAorCXsweDA4YTEsIDEsICZtcWNfc3RhdGVzWzY3XSwgJm1xY19zdGF0ZXNbNjFdfSwKKwl7MHgwNTIxLCAwLCAmbXFjX3N0YXRlc1s2OF0sICZtcWNfc3RhdGVzWzYyXX0sCisJezB4MDUyMSwgMSwgJm1xY19zdGF0ZXNbNjldLCAmbXFjX3N0YXRlc1s2M119LAorCXsweDA0NDEsIDAsICZtcWNfc3RhdGVzWzcwXSwgJm1xY19zdGF0ZXNbNjRdfSwKKwl7MHgwNDQxLCAxLCAmbXFjX3N0YXRlc1s3MV0sICZtcWNfc3RhdGVzWzY1XX0sCisJezB4MDJhMSwgMCwgJm1xY19zdGF0ZXNbNzJdLCAmbXFjX3N0YXRlc1s2Nl19LAorCXsweDAyYTEsIDEsICZtcWNfc3RhdGVzWzczXSwgJm1xY19zdGF0ZXNbNjddfSwKKwl7MHgwMjIxLCAwLCAmbXFjX3N0YXRlc1s3NF0sICZtcWNfc3RhdGVzWzY4XX0sCisJezB4MDIyMSwgMSwgJm1xY19zdGF0ZXNbNzVdLCAmbXFjX3N0YXRlc1s2OV19LAorCXsweDAxNDEsIDAsICZtcWNfc3RhdGVzWzc2XSwgJm1xY19zdGF0ZXNbNzBdfSwKKwl7MHgwMTQxLCAxLCAmbXFjX3N0YXRlc1s3N10sICZtcWNfc3RhdGVzWzcxXX0sCisJezB4MDExMSwgMCwgJm1xY19zdGF0ZXNbNzhdLCAmbXFjX3N0YXRlc1s3Ml19LAorCXsweDAxMTEsIDEsICZtcWNfc3RhdGVzWzc5XSwgJm1xY19zdGF0ZXNbNzNdfSwKKwl7MHgwMDg1LCAwLCAmbXFjX3N0YXRlc1s4MF0sICZtcWNfc3RhdGVzWzc0XX0sCisJezB4MDA4NSwgMSwgJm1xY19zdGF0ZXNbODFdLCAmbXFjX3N0YXRlc1s3NV19LAorCXsweDAwNDksIDAsICZtcWNfc3RhdGVzWzgyXSwgJm1xY19zdGF0ZXNbNzZdfSwKKwl7MHgwMDQ5LCAxLCAmbXFjX3N0YXRlc1s4M10sICZtcWNfc3RhdGVzWzc3XX0sCisJezB4MDAyNSwgMCwgJm1xY19zdGF0ZXNbODRdLCAmbXFjX3N0YXRlc1s3OF19LAorCXsweDAwMjUsIDEsICZtcWNfc3RhdGVzWzg1XSwgJm1xY19zdGF0ZXNbNzldfSwKKwl7MHgwMDE1LCAwLCAmbXFjX3N0YXRlc1s4Nl0sICZtcWNfc3RhdGVzWzgwXX0sCisJezB4MDAxNSwgMSwgJm1xY19zdGF0ZXNbODddLCAmbXFjX3N0YXRlc1s4MV19LAorCXsweDAwMDksIDAsICZtcWNfc3RhdGVzWzg4XSwgJm1xY19zdGF0ZXNbODJdfSwKKwl7MHgwMDA5LCAxLCAmbXFjX3N0YXRlc1s4OV0sICZtcWNfc3RhdGVzWzgzXX0sCisJezB4MDAwNSwgMCwgJm1xY19zdGF0ZXNbOTBdLCAmbXFjX3N0YXRlc1s4NF19LAorCXsweDAwMDUsIDEsICZtcWNfc3RhdGVzWzkxXSwgJm1xY19zdGF0ZXNbODVdfSwKKwl7MHgwMDAxLCAwLCAmbXFjX3N0YXRlc1s5MF0sICZtcWNfc3RhdGVzWzg2XX0sCisJezB4MDAwMSwgMSwgJm1xY19zdGF0ZXNbOTFdLCAmbXFjX3N0YXRlc1s4N119LAorCXsweDU2MDEsIDAsICZtcWNfc3RhdGVzWzkyXSwgJm1xY19zdGF0ZXNbOTJdfSwKKwl7MHg1NjAxLCAxLCAmbXFjX3N0YXRlc1s5M10sICZtcWNfc3RhdGVzWzkzXX0sCit9OworCisvKiAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIGxvY2FsIGZ1bmN0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworc3RhdGljIHZvaWQgb3BqX21xY19ieXRlb3V0KG9wal9tcWNfdCAqbXFjKSB7CisJaWYgKCptcWMtPmJwID09IDB4ZmYpIHsKKwkJbXFjLT5icCsrOworCQkqbXFjLT5icCA9IChPUEpfQllURSkobXFjLT5jID4+IDIwKTsKKwkJbXFjLT5jICY9IDB4ZmZmZmY7CisJCW1xYy0+Y3QgPSA3OworCX0gZWxzZSB7CisJCWlmICgobXFjLT5jICYgMHg4MDAwMDAwKSA9PSAwKSB7CS8qICgobXFjLT5jJjB4ODAwMDAwMCk9PTApIENIQU5HRSAqLworCQkJbXFjLT5icCsrOworCQkJKm1xYy0+YnAgPSAoT1BKX0JZVEUpKG1xYy0+YyA+PiAxOSk7CisJCQltcWMtPmMgJj0gMHg3ZmZmZjsKKwkJCW1xYy0+Y3QgPSA4OworCQl9IGVsc2UgeworCQkJKCptcWMtPmJwKSsrOworCQkJaWYgKCptcWMtPmJwID09IDB4ZmYpIHsKKwkJCQltcWMtPmMgJj0gMHg3ZmZmZmZmOworCQkJCW1xYy0+YnArKzsKKwkJCQkqbXFjLT5icCA9IChPUEpfQllURSkobXFjLT5jID4+IDIwKTsKKwkJCQltcWMtPmMgJj0gMHhmZmZmZjsKKwkJCQltcWMtPmN0ID0gNzsKKwkJCX0gZWxzZSB7CisJCQkJbXFjLT5icCsrOworCQkJCSptcWMtPmJwID0gKE9QSl9CWVRFKShtcWMtPmMgPj4gMTkpOworCQkJCW1xYy0+YyAmPSAweDdmZmZmOworCQkJCW1xYy0+Y3QgPSA4OworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBvcGpfbXFjX3Jlbm9ybWUob3BqX21xY190ICptcWMpIHsKKwlkbyB7CisJCW1xYy0+YSA8PD0gMTsKKwkJbXFjLT5jIDw8PSAxOworCQltcWMtPmN0LS07CisJCWlmIChtcWMtPmN0ID09IDApIHsKKwkJCW9wal9tcWNfYnl0ZW91dChtcWMpOworCQl9CisJfSB3aGlsZSAoKG1xYy0+YSAmIDB4ODAwMCkgPT0gMCk7Cit9CisKK3N0YXRpYyB2b2lkIG9wal9tcWNfY29kZW1wcyhvcGpfbXFjX3QgKm1xYykgeworCW1xYy0+YSAtPSAoKm1xYy0+Y3VyY3R4KS0+cWV2YWw7CisJaWYgKChtcWMtPmEgJiAweDgwMDApID09IDApIHsKKwkJaWYgKG1xYy0+YSA8ICgqbXFjLT5jdXJjdHgpLT5xZXZhbCkgeworCQkJbXFjLT5hID0gKCptcWMtPmN1cmN0eCktPnFldmFsOworCQl9IGVsc2UgeworCQkJbXFjLT5jICs9ICgqbXFjLT5jdXJjdHgpLT5xZXZhbDsKKwkJfQorCQkqbXFjLT5jdXJjdHggPSAoKm1xYy0+Y3VyY3R4KS0+bm1wczsKKwkJb3BqX21xY19yZW5vcm1lKG1xYyk7CisJfSBlbHNlIHsKKwkJbXFjLT5jICs9ICgqbXFjLT5jdXJjdHgpLT5xZXZhbDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9wal9tcWNfY29kZWxwcyhvcGpfbXFjX3QgKm1xYykgeworCW1xYy0+YSAtPSAoKm1xYy0+Y3VyY3R4KS0+cWV2YWw7CisJaWYgKG1xYy0+YSA8ICgqbXFjLT5jdXJjdHgpLT5xZXZhbCkgeworCQltcWMtPmMgKz0gKCptcWMtPmN1cmN0eCktPnFldmFsOworCX0gZWxzZSB7CisJCW1xYy0+YSA9ICgqbXFjLT5jdXJjdHgpLT5xZXZhbDsKKwl9CisJKm1xYy0+Y3VyY3R4ID0gKCptcWMtPmN1cmN0eCktPm5scHM7CisJb3BqX21xY19yZW5vcm1lKG1xYyk7Cit9CisKK3N0YXRpYyB2b2lkIG9wal9tcWNfc2V0Yml0cyhvcGpfbXFjX3QgKm1xYykgeworCU9QSl9VSU5UMzIgdGVtcGMgPSBtcWMtPmMgKyBtcWMtPmE7CisJbXFjLT5jIHw9IDB4ZmZmZjsKKwlpZiAobXFjLT5jID49IHRlbXBjKSB7CisJCW1xYy0+YyAtPSAweDgwMDA7CisJfQorfQorCitzdGF0aWMgSU5MSU5FIE9QSl9JTlQzMiBvcGpfbXFjX21wc2V4Y2hhbmdlKG9wal9tcWNfdCAqY29uc3QgbXFjKSB7CisJT1BKX0lOVDMyIGQ7CisJaWYgKG1xYy0+YSA8ICgqbXFjLT5jdXJjdHgpLT5xZXZhbCkgeworCQlkID0gKE9QSl9JTlQzMikoMSAtICgqbXFjLT5jdXJjdHgpLT5tcHMpOworCQkqbXFjLT5jdXJjdHggPSAoKm1xYy0+Y3VyY3R4KS0+bmxwczsKKwl9IGVsc2UgeworCQlkID0gKE9QSl9JTlQzMikoKm1xYy0+Y3VyY3R4KS0+bXBzOworCQkqbXFjLT5jdXJjdHggPSAoKm1xYy0+Y3VyY3R4KS0+bm1wczsKKwl9CisJCisJcmV0dXJuIGQ7Cit9CisKK3N0YXRpYyBJTkxJTkUgT1BKX0lOVDMyIG9wal9tcWNfbHBzZXhjaGFuZ2Uob3BqX21xY190ICpjb25zdCBtcWMpIHsKKwlPUEpfSU5UMzIgZDsKKwlpZiAobXFjLT5hIDwgKCptcWMtPmN1cmN0eCktPnFldmFsKSB7CisJCW1xYy0+YSA9ICgqbXFjLT5jdXJjdHgpLT5xZXZhbDsKKwkJZCA9IChPUEpfSU5UMzIpKCptcWMtPmN1cmN0eCktPm1wczsKKwkJKm1xYy0+Y3VyY3R4ID0gKCptcWMtPmN1cmN0eCktPm5tcHM7CisJfSBlbHNlIHsKKwkJbXFjLT5hID0gKCptcWMtPmN1cmN0eCktPnFldmFsOworCQlkID0gKE9QSl9JTlQzMikoMSAtICgqbXFjLT5jdXJjdHgpLT5tcHMpOworCQkqbXFjLT5jdXJjdHggPSAoKm1xYy0+Y3VyY3R4KS0+bmxwczsKKwl9CisJCisJcmV0dXJuIGQ7Cit9CisKKyNpZmRlZiBNUUNfUEVSRl9PUFQKK3N0YXRpYyBJTkxJTkUgdm9pZCBvcGpfbXFjX2J5dGVpbihvcGpfbXFjX3QgKmNvbnN0IG1xYykgeworCXVuc2lnbmVkIGludCBpID0gKigodW5zaWduZWQgaW50ICopIG1xYy0+YnApOworCW1xYy0+YyArPSBpICYgMHhmZmZmMDA7CisJbXFjLT5jdCA9IGkgJiAweDBmOworCW1xYy0+YnAgKz0gKGkgPj4gMikgJiAweDA0OworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIG9wal9tcWNfYnl0ZWluKG9wal9tcWNfdCAqY29uc3QgbXFjKSB7CisJaWYgKG1xYy0+YnAgIT0gbXFjLT5lbmQpIHsKKwkJT1BKX1VJTlQzMiBjOworCQlpZiAobXFjLT5icCArIDEgIT0gbXFjLT5lbmQpIHsKKwkJCWMgPSAqKG1xYy0+YnAgKyAxKTsKKwkJfSBlbHNlIHsKKwkJCWMgPSAweGZmOworCQl9CisJCWlmICgqbXFjLT5icCA9PSAweGZmKSB7CisJCQlpZiAoYyA+IDB4OGYpIHsKKwkJCQltcWMtPmMgKz0gMHhmZjAwOworCQkJCW1xYy0+Y3QgPSA4OworCQkJfSBlbHNlIHsKKwkJCQltcWMtPmJwKys7CisJCQkJbXFjLT5jICs9IGMgPDwgOTsKKwkJCQltcWMtPmN0ID0gNzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW1xYy0+YnArKzsKKwkJCW1xYy0+YyArPSBjIDw8IDg7CisJCQltcWMtPmN0ID0gODsKKwkJfQorCX0gZWxzZSB7CisJCW1xYy0+YyArPSAweGZmMDA7CisJCW1xYy0+Y3QgPSA4OworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgSU5MSU5FIHZvaWQgb3BqX21xY19yZW5vcm1kKG9wal9tcWNfdCAqY29uc3QgbXFjKSB7CisJZG8geworCQlpZiAobXFjLT5jdCA9PSAwKSB7CisJCQlvcGpfbXFjX2J5dGVpbihtcWMpOworCQl9CisJCW1xYy0+YSA8PD0gMTsKKwkJbXFjLT5jIDw8PSAxOworCQltcWMtPmN0LS07CisJfSB3aGlsZSAobXFjLT5hIDwgMHg4MDAwKTsKK30KKworLyogCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBNUS1Db2RlciBpbnRlcmZhY2UKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK29wal9tcWNfdCogb3BqX21xY19jcmVhdGUodm9pZCkgeworCW9wal9tcWNfdCAqbXFjID0gKG9wal9tcWNfdCopb3BqX21hbGxvYyhzaXplb2Yob3BqX21xY190KSk7CisjaWZkZWYgTVFDX1BFUkZfT1BUCisJaWYgKG1xYykgeworCQltcWMtPmJ1ZmZlciA9IE5VTEw7CisJfQorI2VuZGlmCisJcmV0dXJuIG1xYzsKK30KKwordm9pZCBvcGpfbXFjX2Rlc3Ryb3kob3BqX21xY190ICptcWMpIHsKKwlpZihtcWMpIHsKKyNpZmRlZiBNUUNfUEVSRl9PUFQKKwkJaWYgKG1xYy0+YnVmZmVyKSB7CisJCQlvcGpfZnJlZShtcWMtPmJ1ZmZlcik7CisJCX0KKyNlbmRpZgorCQlvcGpfZnJlZShtcWMpOworCX0KK30KKworT1BKX1VJTlQzMiBvcGpfbXFjX251bWJ5dGVzKG9wal9tcWNfdCAqbXFjKSB7CisJY29uc3QgcHRyZGlmZl90IGRpZmYgPSBtcWMtPmJwIC0gbXFjLT5zdGFydDsKKyNpZiAwCisgIGFzc2VydCggZGlmZiA8PSAweGZmZmZmZmZmICYmIGRpZmYgPj0gMCApOyAvKiBVSU5UMzJfTUFYICovCisjZW5kaWYKKwlyZXR1cm4gKE9QSl9VSU5UMzIpZGlmZjsKK30KKwordm9pZCBvcGpfbXFjX2luaXRfZW5jKG9wal9tcWNfdCAqbXFjLCBPUEpfQllURSAqYnApIHsKKyAgICAvKiBUT0RPIE1TRDogbmVlZCB0byB0YWtlIGEgbG9vayB0byB0aGUgdjIgdmVyc2lvbiAqLworCW9wal9tcWNfc2V0Y3VyY3R4KG1xYywgMCk7CisJbXFjLT5hID0gMHg4MDAwOworCW1xYy0+YyA9IDA7CisJbXFjLT5icCA9IGJwIC0gMTsKKwltcWMtPmN0ID0gMTI7CisJaWYgKCptcWMtPmJwID09IDB4ZmYpIHsKKwkJbXFjLT5jdCA9IDEzOworCX0KKwltcWMtPnN0YXJ0ID0gYnA7Cit9CisKK3ZvaWQgb3BqX21xY19lbmNvZGUob3BqX21xY190ICptcWMsIE9QSl9VSU5UMzIgZCkgeworCWlmICgoKm1xYy0+Y3VyY3R4KS0+bXBzID09IGQpIHsKKwkJb3BqX21xY19jb2RlbXBzKG1xYyk7CisJfSBlbHNlIHsKKwkJb3BqX21xY19jb2RlbHBzKG1xYyk7CisJfQorfQorCit2b2lkIG9wal9tcWNfZmx1c2gob3BqX21xY190ICptcWMpIHsKKwlvcGpfbXFjX3NldGJpdHMobXFjKTsKKwltcWMtPmMgPDw9IG1xYy0+Y3Q7CisJb3BqX21xY19ieXRlb3V0KG1xYyk7CisJbXFjLT5jIDw8PSBtcWMtPmN0OworCW9wal9tcWNfYnl0ZW91dChtcWMpOworCQorCWlmICgqbXFjLT5icCAhPSAweGZmKSB7CisJCW1xYy0+YnArKzsKKwl9Cit9CisKK3ZvaWQgb3BqX21xY19ieXBhc3NfaW5pdF9lbmMob3BqX21xY190ICptcWMpIHsKKwltcWMtPmMgPSAwOworCW1xYy0+Y3QgPSA4OworCS8qaWYgKCptcWMtPmJwID09IDB4ZmYpIHsKKwltcWMtPmN0ID0gNzsKKyAgICAgfSAqLworfQorCit2b2lkIG9wal9tcWNfYnlwYXNzX2VuYyhvcGpfbXFjX3QgKm1xYywgT1BKX1VJTlQzMiBkKSB7CisJbXFjLT5jdC0tOworCW1xYy0+YyA9IG1xYy0+YyArIChkIDw8IG1xYy0+Y3QpOworCWlmIChtcWMtPmN0ID09IDApIHsKKwkJbXFjLT5icCsrOworCQkqbXFjLT5icCA9IChPUEpfQllURSltcWMtPmM7CisJCW1xYy0+Y3QgPSA4OworCQlpZiAoKm1xYy0+YnAgPT0gMHhmZikgeworCQkJbXFjLT5jdCA9IDc7CisJCX0KKwkJbXFjLT5jID0gMDsKKwl9Cit9CisKK09QSl9VSU5UMzIgb3BqX21xY19ieXBhc3NfZmx1c2hfZW5jKG9wal9tcWNfdCAqbXFjKSB7CisJT1BKX0JZVEUgYml0X3BhZGRpbmc7CisJCisJYml0X3BhZGRpbmcgPSAwOworCQorCWlmIChtcWMtPmN0ICE9IDApIHsKKwkJd2hpbGUgKG1xYy0+Y3QgPiAwKSB7CisJCQltcWMtPmN0LS07CisJCQltcWMtPmMgKz0gKE9QSl9VSU5UMzIpKGJpdF9wYWRkaW5nIDw8IG1xYy0+Y3QpOworCQkJYml0X3BhZGRpbmcgPSAoYml0X3BhZGRpbmcgKyAxKSAmIDB4MDE7CisJCX0KKwkJbXFjLT5icCsrOworCQkqbXFjLT5icCA9IChPUEpfQllURSltcWMtPmM7CisJCW1xYy0+Y3QgPSA4OworCQltcWMtPmMgPSAwOworCX0KKwkKKwlyZXR1cm4gMTsKK30KKwordm9pZCBvcGpfbXFjX3Jlc2V0X2VuYyhvcGpfbXFjX3QgKm1xYykgeworCW9wal9tcWNfcmVzZXRzdGF0ZXMobXFjKTsKKwlvcGpfbXFjX3NldHN0YXRlKG1xYywgVDFfQ1RYTk9fVU5JLCAwLCA0Nik7CisJb3BqX21xY19zZXRzdGF0ZShtcWMsIFQxX0NUWE5PX0FHRywgMCwgMyk7CisJb3BqX21xY19zZXRzdGF0ZShtcWMsIFQxX0NUWE5PX1pDLCAwLCA0KTsKK30KKworT1BKX1VJTlQzMiBvcGpfbXFjX3Jlc3RhcnRfZW5jKG9wal9tcWNfdCAqbXFjKSB7CisJT1BKX1VJTlQzMiBjb3JyZWN0aW9uID0gMTsKKwkKKwkvKiA8Zmx1c2ggcGFydD4gKi8KKwlPUEpfSU5UMzIgbiA9IChPUEpfSU5UMzIpKDI3IC0gMTUgLSBtcWMtPmN0KTsKKwltcWMtPmMgPDw9IG1xYy0+Y3Q7CisJd2hpbGUgKG4gPiAwKSB7CisJCW9wal9tcWNfYnl0ZW91dChtcWMpOworCQluIC09IChPUEpfSU5UMzIpbXFjLT5jdDsKKwkJbXFjLT5jIDw8PSBtcWMtPmN0OworCX0KKwlvcGpfbXFjX2J5dGVvdXQobXFjKTsKKwkKKwlyZXR1cm4gY29ycmVjdGlvbjsKK30KKwordm9pZCBvcGpfbXFjX3Jlc3RhcnRfaW5pdF9lbmMob3BqX21xY190ICptcWMpIHsKKwkvKiA8UmUtaW5pdCBwYXJ0PiAqLworCW9wal9tcWNfc2V0Y3VyY3R4KG1xYywgMCk7CisJbXFjLT5hID0gMHg4MDAwOworCW1xYy0+YyA9IDA7CisJbXFjLT5jdCA9IDEyOworCW1xYy0+YnAtLTsKKwlpZiAoKm1xYy0+YnAgPT0gMHhmZikgeworCQltcWMtPmN0ID0gMTM7CisJfQorfQorCit2b2lkIG9wal9tcWNfZXJ0ZXJtX2VuYyhvcGpfbXFjX3QgKm1xYykgeworCU9QSl9JTlQzMiBrID0gKE9QSl9JTlQzMikoMTEgLSBtcWMtPmN0ICsgMSk7CisJCisJd2hpbGUgKGsgPiAwKSB7CisJCW1xYy0+YyA8PD0gbXFjLT5jdDsKKwkJbXFjLT5jdCA9IDA7CisJCW9wal9tcWNfYnl0ZW91dChtcWMpOworCQlrIC09IChPUEpfSU5UMzIpbXFjLT5jdDsKKwl9CisJCisJaWYgKCptcWMtPmJwICE9IDB4ZmYpIHsKKwkJb3BqX21xY19ieXRlb3V0KG1xYyk7CisJfQorfQorCit2b2lkIG9wal9tcWNfc2VnbWFya19lbmMob3BqX21xY190ICptcWMpIHsKKwlPUEpfVUlOVDMyIGk7CisJb3BqX21xY19zZXRjdXJjdHgobXFjLCAxOCk7CisJCisJZm9yIChpID0gMTsgaSA8IDU7IGkrKykgeworCQlvcGpfbXFjX2VuY29kZShtcWMsIGkgJSAyKTsKKwl9Cit9CisKK09QSl9CT09MIG9wal9tcWNfaW5pdF9kZWMob3BqX21xY190ICptcWMsIE9QSl9CWVRFICpicCwgT1BKX1VJTlQzMiBsZW4pIHsKKwlvcGpfbXFjX3NldGN1cmN0eChtcWMsIDApOworCW1xYy0+c3RhcnQgPSBicDsKKwltcWMtPmVuZCA9IGJwICsgbGVuOworCW1xYy0+YnAgPSBicDsKKwlpZiAobGVuPT0wKSBtcWMtPmMgPSAweGZmIDw8IDE2OworCWVsc2UgbXFjLT5jID0gKE9QSl9VSU5UMzIpKCptcWMtPmJwIDw8IDE2KTsKKworI2lmZGVmIE1RQ19QRVJGX09QVCAvKiBUT0RPX01TRDogY2hlY2sgdGhpcyBvcHRpb24gYW5kIHB1dCBpbiBleHBlcmltZW50YWwgKi8KKwl7CisgICAgICAgIE9QSl9VSU5UMzIgYzsKKwkJT1BKX1VJTlQzMiAqaXA7CisJCU9QSl9CWVRFICplbmQgPSBtcWMtPmVuZCAtIDE7CisgICAgICAgIHZvaWQqIG5ld19idWZmZXIgPSBvcGpfcmVhbGxvYyhtcWMtPmJ1ZmZlciwgKGxlbiArIDEpICogc2l6ZW9mKE9QSl9VSU5UMzIpKTsKKyAgICAgICAgaWYgKCEgbmV3X2J1ZmZlcikgeworICAgICAgICAgICAgb3BqX2ZyZWUobXFjLT5idWZmZXIpOworICAgICAgICAgICAgbXFjLT5idWZmZXIgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBtcWMtPmJ1ZmZlciA9IG5ld19idWZmZXI7CisJCQorICAgICAgICBpcCA9IChPUEpfVUlOVDMyICopIG1xYy0+YnVmZmVyOworCisJCXdoaWxlIChicCA8IGVuZCkgeworCQkJYyA9ICooYnAgKyAxKTsKKwkJCWlmICgqYnAgPT0gMHhmZikgeworCQkJCWlmIChjID4gMHg4ZikgeworCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgeworCQkJCQkqaXAgPSAweDAwMDAwMDE3IHwgKGMgPDwgOSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkqaXAgPSAweDAwMDAwMDE4IHwgKGMgPDwgOCk7CisJCQl9CisJCQlicCsrOworCQkJaXArKzsKKwkJfQorCisJCS8qIEhhbmRsZSBsYXN0IGJ5dGUgb2YgZGF0YSAqLworCQljID0gMHhmZjsKKwkJaWYgKCpicCA9PSAweGZmKSB7CisJCQkqaXAgPSAweDAwMDBmZjE4OworCQl9IGVsc2UgeworCQkJYnArKzsKKwkJCSppcCA9IDB4MDAwMDAwMTggfCAoYyA8PCA4KTsKKwkJfQorCQlpcCsrOworCisJCSppcCA9IDB4MDAwMGZmMDg7CisJCW1xYy0+YnAgPSBtcWMtPmJ1ZmZlcjsKKwl9CisjZW5kaWYKKwlvcGpfbXFjX2J5dGVpbihtcWMpOworCW1xYy0+YyA8PD0gNzsKKwltcWMtPmN0IC09IDc7CisJbXFjLT5hID0gMHg4MDAwOworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK09QSl9JTlQzMiBvcGpfbXFjX2RlY29kZShvcGpfbXFjX3QgKmNvbnN0IG1xYykgeworCU9QSl9JTlQzMiBkOworCW1xYy0+YSAtPSAoKm1xYy0+Y3VyY3R4KS0+cWV2YWw7CisJaWYgKChtcWMtPmMgPj4gMTYpIDwgKCptcWMtPmN1cmN0eCktPnFldmFsKSB7CisJCWQgPSBvcGpfbXFjX2xwc2V4Y2hhbmdlKG1xYyk7CisJCW9wal9tcWNfcmVub3JtZChtcWMpOworCX0gZWxzZSB7CisJCW1xYy0+YyAtPSAoKm1xYy0+Y3VyY3R4KS0+cWV2YWwgPDwgMTY7CisJCWlmICgobXFjLT5hICYgMHg4MDAwKSA9PSAwKSB7CisJCQlkID0gb3BqX21xY19tcHNleGNoYW5nZShtcWMpOworCQkJb3BqX21xY19yZW5vcm1kKG1xYyk7CisJCX0gZWxzZSB7CisJCQlkID0gKE9QSl9JTlQzMikoKm1xYy0+Y3VyY3R4KS0+bXBzOworCQl9CisJfQorCisJcmV0dXJuIGQ7Cit9CisKK3ZvaWQgb3BqX21xY19yZXNldHN0YXRlcyhvcGpfbXFjX3QgKm1xYykgeworCU9QSl9VSU5UMzIgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTVFDX05VTUNUWFM7IGkrKykgeworCQltcWMtPmN0eHNbaV0gPSBtcWNfc3RhdGVzOworCX0KK30KKwordm9pZCBvcGpfbXFjX3NldHN0YXRlKG9wal9tcWNfdCAqbXFjLCBPUEpfVUlOVDMyIGN0eG5vLCBPUEpfVUlOVDMyIG1zYiwgT1BKX0lOVDMyIHByb2IpIHsKKwltcWMtPmN0eHNbY3R4bm9dID0gJm1xY19zdGF0ZXNbbXNiICsgKE9QSl9VSU5UMzIpKHByb2IgPDwgMSldOworfQorCisKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9tcWMuaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvbXFjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9tcWMuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9tcWMuaApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGVuanBlZy5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGVuanBlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMTRjYzEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wZW5qcGVnLmMKQEAgLTAsMCArMSw5NjAgQEAKKy8qCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKKyAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKKyAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKKyAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMS0yMDEyLCBDZW50cmUgTmF0aW9uYWwgZCdFdHVkZXMgU3BhdGlhbGVzIChDTkVTKSwgRlIgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENTIFN5c3RlbWVzIGQnSW5mb3JtYXRpb24sIEZyYW5jZQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmIC8qIF9XSU4zMiAqLworCisjaW5jbHVkZSAib3BqX2luY2x1ZGVzLmgiCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogRnVuY3Rpb25zIHRvIHNldCB0aGUgbWVzc2FnZSBoYW5kbGVycyAqLworCitPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3NldF9pbmZvX2hhbmRsZXIoCW9wal9jb2RlY190ICogcF9jb2RlYywgCisJCQkJCQkJCQkJCW9wal9tc2dfY2FsbGJhY2sgcF9jYWxsYmFjaywKKwkJCQkJCQkJCQkJdm9pZCAqIHBfdXNlcl9kYXRhKQoreworCW9wal9jb2RlY19wcml2YXRlX3QgKiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QgKikgcF9jb2RlYzsKKwlpZighIGxfY29kZWMpeworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKwkKKwlsX2NvZGVjLT5tX2V2ZW50X21nci5pbmZvX2hhbmRsZXIgPSBwX2NhbGxiYWNrOworCWxfY29kZWMtPm1fZXZlbnRfbWdyLm1faW5mb19kYXRhID0gcF91c2VyX2RhdGE7CisJCisJcmV0dXJuIE9QSl9UUlVFOworfQorCitPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3NldF93YXJuaW5nX2hhbmRsZXIoCW9wal9jb2RlY190ICogcF9jb2RlYywgCisJCQkJCQkJCQkJCQlvcGpfbXNnX2NhbGxiYWNrIHBfY2FsbGJhY2ssCisJCQkJCQkJCQkJCQl2b2lkICogcF91c2VyX2RhdGEpCit7CisJb3BqX2NvZGVjX3ByaXZhdGVfdCAqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCAqKSBwX2NvZGVjOworCWlmICghIGxfY29kZWMpIHsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisJCisJbF9jb2RlYy0+bV9ldmVudF9tZ3Iud2FybmluZ19oYW5kbGVyID0gcF9jYWxsYmFjazsKKwlsX2NvZGVjLT5tX2V2ZW50X21nci5tX3dhcm5pbmdfZGF0YSA9IHBfdXNlcl9kYXRhOworCQorCXJldHVybiBPUEpfVFJVRTsKK30KKworT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9zZXRfZXJyb3JfaGFuZGxlcihvcGpfY29kZWNfdCAqIHBfY29kZWMsIAorCQkJCQkJCQkJCQlvcGpfbXNnX2NhbGxiYWNrIHBfY2FsbGJhY2ssCisJCQkJCQkJCQkJCXZvaWQgKiBwX3VzZXJfZGF0YSkKK3sKKwlvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfY29kZWM7CisJaWYgKCEgbF9jb2RlYykgeworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKwkKKwlsX2NvZGVjLT5tX2V2ZW50X21nci5lcnJvcl9oYW5kbGVyID0gcF9jYWxsYmFjazsKKwlsX2NvZGVjLT5tX2V2ZW50X21nci5tX2Vycm9yX2RhdGEgPSBwX3VzZXJfZGF0YTsKKwkKKwlyZXR1cm4gT1BKX1RSVUU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIE9QSl9TSVpFX1Qgb3BqX3JlYWRfZnJvbV9maWxlICh2b2lkICogcF9idWZmZXIsIE9QSl9TSVpFX1QgcF9uYl9ieXRlcywgRklMRSAqIHBfZmlsZSkKK3sKKwlPUEpfU0laRV9UIGxfbmJfcmVhZCA9IGZyZWFkKHBfYnVmZmVyLDEscF9uYl9ieXRlcyxwX2ZpbGUpOworCXJldHVybiBsX25iX3JlYWQgPyBsX25iX3JlYWQgOiAoT1BKX1NJWkVfVCktMTsKK30KKworc3RhdGljIE9QSl9VSU5UNjQgb3BqX2dldF9kYXRhX2xlbmd0aF9mcm9tX2ZpbGUgKEZJTEUgKiBwX2ZpbGUpCit7CisJT1BKX09GRl9UIGZpbGVfbGVuZ3RoID0gMDsKKworCU9QSl9GU0VFSyhwX2ZpbGUsIDAsIFNFRUtfRU5EKTsKKwlmaWxlX2xlbmd0aCA9IChPUEpfT0ZGX1QpT1BKX0ZURUxMKHBfZmlsZSk7CisJT1BKX0ZTRUVLKHBfZmlsZSwgMCwgU0VFS19TRVQpOworCisJcmV0dXJuIChPUEpfVUlOVDY0KWZpbGVfbGVuZ3RoOworfQorCitzdGF0aWMgT1BKX1NJWkVfVCBvcGpfd3JpdGVfZnJvbV9maWxlICh2b2lkICogcF9idWZmZXIsIE9QSl9TSVpFX1QgcF9uYl9ieXRlcywgRklMRSAqIHBfZmlsZSkKK3sKKwlyZXR1cm4gZndyaXRlKHBfYnVmZmVyLDEscF9uYl9ieXRlcyxwX2ZpbGUpOworfQorCitzdGF0aWMgT1BKX09GRl9UIG9wal9za2lwX2Zyb21fZmlsZSAoT1BKX09GRl9UIHBfbmJfYnl0ZXMsIEZJTEUgKiBwX3VzZXJfZGF0YSkKK3sKKwlpZiAoT1BKX0ZTRUVLKHBfdXNlcl9kYXRhLHBfbmJfYnl0ZXMsU0VFS19DVVIpKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gcF9uYl9ieXRlczsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9zZWVrX2Zyb21fZmlsZSAoT1BKX09GRl9UIHBfbmJfYnl0ZXMsIEZJTEUgKiBwX3VzZXJfZGF0YSkKK3sKKwlpZiAoT1BKX0ZTRUVLKHBfdXNlcl9kYXRhLHBfbmJfYnl0ZXMsU0VFS19TRVQpKSB7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCisJcmV0dXJuIE9QSl9UUlVFOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWZkZWYgX1dJTjMyCisjaWZuZGVmIE9QSl9TVEFUSUMKK0JPT0wgQVBJRU5UUlkKK0RsbE1haW4oSElOU1RBTkNFIGhNb2R1bGUsIERXT1JEIHVsX3JlYXNvbl9mb3JfY2FsbCwgTFBWT0lEIGxwUmVzZXJ2ZWQpIHsKKworCU9QSl9BUkdfTk9UX1VTRUQobHBSZXNlcnZlZCk7CisJT1BKX0FSR19OT1RfVVNFRChoTW9kdWxlKTsKKworCXN3aXRjaCAodWxfcmVhc29uX2Zvcl9jYWxsKSB7CisJCWNhc2UgRExMX1BST0NFU1NfQVRUQUNIIDoKKwkJCWJyZWFrOworCQljYXNlIERMTF9QUk9DRVNTX0RFVEFDSCA6CisJCQlicmVhazsKKwkJY2FzZSBETExfVEhSRUFEX0FUVEFDSCA6CisJCWNhc2UgRExMX1RIUkVBRF9ERVRBQ0ggOgorCQkJYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYgLyogT1BKX1NUQVRJQyAqLworI2VuZGlmIC8qIF9XSU4zMiAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2NvbnN0IGNoYXIqIE9QSl9DQUxMQ09OViBvcGpfdmVyc2lvbih2b2lkKSB7CisgICAgcmV0dXJuIE9QSl9QQUNLQUdFX1ZFUlNJT047Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIERFQ09NUFJFU1NJT04gRlVOQ1RJT05TKi8KKworb3BqX2NvZGVjX3QqIE9QSl9DQUxMQ09OViBvcGpfY3JlYXRlX2RlY29tcHJlc3MoT1BKX0NPREVDX0ZPUk1BVCBwX2Zvcm1hdCkKK3sKKwlvcGpfY29kZWNfcHJpdmF0ZV90ICpsX2NvZGVjID0gMDA7CisKKwlsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QqKSBvcGpfY2FsbG9jKDEsIHNpemVvZihvcGpfY29kZWNfcHJpdmF0ZV90KSk7CisJaWYgKCFsX2NvZGVjKXsKKwkJcmV0dXJuIDAwOworCX0KKworCWxfY29kZWMtPmlzX2RlY29tcHJlc3NvciA9IDE7CisKKwlzd2l0Y2ggKHBfZm9ybWF0KSB7CisJCWNhc2UgT1BKX0NPREVDX0oySzoKKwkJCWxfY29kZWMtPm9wal9kdW1wX2NvZGVjID0gKHZvaWQgKCopICh2b2lkKiwgT1BKX0lOVDMyLCBGSUxFKikpIGoya19kdW1wOworCisJCQlsX2NvZGVjLT5vcGpfZ2V0X2NvZGVjX2luZm8gPSAob3BqX2NvZGVzdHJlYW1faW5mb192Ml90KiAoKikgKHZvaWQqKSApIGoya19nZXRfY3N0cl9pbmZvOworCisJCQlsX2NvZGVjLT5vcGpfZ2V0X2NvZGVjX2luZGV4ID0gKG9wal9jb2Rlc3RyZWFtX2luZGV4X3QqICgqKSAodm9pZCopICkgajJrX2dldF9jc3RyX2luZGV4OworCisJCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9kZWNvZGUgPQorCQkJCQkoT1BKX0JPT0wgKCopICgJdm9pZCAqLAorCQkJCQkJCQkJc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAorCQkJCQkJCQkJb3BqX2ltYWdlX3QqLCBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqICkpIG9wal9qMmtfZGVjb2RlOworCisJCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9lbmRfZGVjb21wcmVzcyA9CisJCQkJCShPUEpfQk9PTCAoKikgKAl2b2lkICosCisJCQkJCQkJCQlzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICosCisJCQkJCQkJCQlzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqKSkgb3BqX2oya19lbmRfZGVjb21wcmVzczsKKworCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfcmVhZF9oZWFkZXIgPQorCQkJCQkoT1BKX0JPT0wgKCopICgJc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAorCQkJCQkJCQkJdm9pZCAqLAorCQkJCQkJCQkJb3BqX2ltYWdlX3QgKiosCisJCQkJCQkJCQlzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqICkpIG9wal9qMmtfcmVhZF9oZWFkZXI7CisKKwkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX2Rlc3Ryb3kgPQorCQkJCQkodm9pZCAoKikgKHZvaWQgKikpb3BqX2oya19kZXN0cm95OworCisJCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9zZXR1cF9kZWNvZGVyID0KKwkJCQkJKHZvaWQgKCopICh2b2lkICogLCBvcGpfZHBhcmFtZXRlcnNfdCAqICkpIG9wal9qMmtfc2V0dXBfZGVjb2RlcjsKKworCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfcmVhZF90aWxlX2hlYWRlciA9CisJCQkJCShPUEpfQk9PTCAoKikgKAl2b2lkICosCisJCQkJCQkJCQlPUEpfVUlOVDMyKiwKKwkJCQkJCQkJCU9QSl9VSU5UMzIqLAorCQkJCQkJCQkJT1BKX0lOVDMyKiwgT1BKX0lOVDMyKiwKKwkJCQkJCQkJCU9QSl9JTlQzMiosIE9QSl9JTlQzMiosCisJCQkJCQkJCQlPUEpfVUlOVDMyKiwKKwkJCQkJCQkJCU9QSl9CT09MKiwKKwkJCQkJCQkJCXN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiwKKwkJCQkJCQkJCXN0cnVjdCBvcGpfZXZlbnRfbWdyICogKSkgb3BqX2oya19yZWFkX3RpbGVfaGVhZGVyOworCisJCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9kZWNvZGVfdGlsZV9kYXRhID0KKwkJCQkJKE9QSl9CT09MICgqKSAoIHZvaWQgKiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFKiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICopKSBvcGpfajJrX2RlY29kZV90aWxlOworCisJCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9zZXRfZGVjb2RlX2FyZWEgPQorCQkJCQkoT1BKX0JPT0wgKCopICggdm9pZCAqLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90KiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIsIE9QSl9JTlQzMiwgT1BKX0lOVDMyLCBPUEpfSU5UMzIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKikpIG9wal9qMmtfc2V0X2RlY29kZV9hcmVhOworCisJCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9nZXRfZGVjb2RlZF90aWxlID0gCisgICAgICAgICAgICAgICAgICAgIChPUEpfQk9PTCAoKikgKCB2b2lkICpwX2NvZGVjLAorCQkJCQkJCQkgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfY2lvLAorCQkJCQkJCQkgICAgb3BqX2ltYWdlX3QgKnBfaW1hZ2UsCisJCQkJCQkJCSAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlciwKKwkJCQkJCQkJICAgIE9QSl9VSU5UMzIgdGlsZV9pbmRleCkpIG9wal9qMmtfZ2V0X3RpbGU7CisKKwkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX3NldF9kZWNvZGVkX3Jlc29sdXRpb25fZmFjdG9yID0gCisgICAgICAgICAgICAgICAgICAgIChPUEpfQk9PTCAoKikgKCB2b2lkICogcF9jb2RlYywKKwkJCQkJCQkJCU9QSl9VSU5UMzIgcmVzX2ZhY3RvciwKKwkJCQkJCQkJCXN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyKSkgb3BqX2oya19zZXRfZGVjb2RlZF9yZXNvbHV0aW9uX2ZhY3RvcjsKKworCQkJbF9jb2RlYy0+bV9jb2RlYyA9IG9wal9qMmtfY3JlYXRlX2RlY29tcHJlc3MoKTsKKworCQkJaWYgKCEgbF9jb2RlYy0+bV9jb2RlYykgeworCQkJCW9wal9mcmVlKGxfY29kZWMpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIE9QSl9DT0RFQ19KUDI6CisJCQkvKiBnZXQgYSBKUDIgZGVjb2RlciBoYW5kbGUgKi8KKwkJCWxfY29kZWMtPm9wal9kdW1wX2NvZGVjID0gKHZvaWQgKCopICh2b2lkKiwgT1BKX0lOVDMyLCBGSUxFKikpIGpwMl9kdW1wOworCisJCQlsX2NvZGVjLT5vcGpfZ2V0X2NvZGVjX2luZm8gPSAob3BqX2NvZGVzdHJlYW1faW5mb192Ml90KiAoKikgKHZvaWQqKSApIGpwMl9nZXRfY3N0cl9pbmZvOworCisJCQlsX2NvZGVjLT5vcGpfZ2V0X2NvZGVjX2luZGV4ID0gKG9wal9jb2Rlc3RyZWFtX2luZGV4X3QqICgqKSAodm9pZCopICkganAyX2dldF9jc3RyX2luZGV4OworCisJCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9kZWNvZGUgPQorCQkJCQkoT1BKX0JPT0wgKCopICgJdm9pZCAqLAorCQkJCQkJCQkJc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAorCQkJCQkJCQkJb3BqX2ltYWdlX3QqLAorCQkJCQkJCQkJc3RydWN0IG9wal9ldmVudF9tZ3IgKiApKSBvcGpfanAyX2RlY29kZTsKKworCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfZW5kX2RlY29tcHJlc3MgPSAgCisgICAgICAgICAgICAgICAgICAgIChPUEpfQk9PTCAoKikgKCB2b2lkICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqKSkgb3BqX2pwMl9lbmRfZGVjb21wcmVzczsKKworCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfcmVhZF9oZWFkZXIgPSAgCisgICAgICAgICAgICAgICAgICAgIChPUEpfQk9PTCAoKikgKCBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICosCisJCQkJCSAgICAgICAgICAgICAgICB2b2lkICosCisJCQkJCSAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqKiwKKwkJCQkJICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogKSkgb3BqX2pwMl9yZWFkX2hlYWRlcjsKKworCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfcmVhZF90aWxlX2hlYWRlciA9IAorICAgICAgICAgICAgICAgICAgICAoT1BKX0JPT0wgKCopICggdm9pZCAqLAorCQkJCQkgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiosCisJCQkJCSAgICAgICAgICAgICAgICBPUEpfVUlOVDMyKiwKKwkJCQkJICAgICAgICAgICAgICAgIE9QSl9JTlQzMiosCisJCQkJCSAgICAgICAgICAgICAgICBPUEpfSU5UMzIqLAorCQkJCQkgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogLAorCQkJCQkgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogLAorCQkJCQkgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqICwKKwkJCQkJICAgICAgICAgICAgICAgIE9QSl9CT09MICosCisJCQkJCSAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICosCisJCQkJCSAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqICkpIG9wal9qcDJfcmVhZF90aWxlX2hlYWRlcjsKKworCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfZGVjb2RlX3RpbGVfZGF0YSA9IAorICAgICAgICAgICAgICAgICAgICAoT1BKX0JPT0wgKCopICggdm9pZCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMixPUEpfQllURSosT1BKX1VJTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogKSkgb3BqX2pwMl9kZWNvZGVfdGlsZTsKKworCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfZGVzdHJveSA9ICh2b2lkICgqKSAodm9pZCAqKSlvcGpfanAyX2Rlc3Ryb3k7CisKKwkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX3NldHVwX2RlY29kZXIgPSAKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKCopICh2b2lkICogLG9wal9kcGFyYW1ldGVyc190ICogKSkgb3BqX2pwMl9zZXR1cF9kZWNvZGVyOworCisJCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9zZXRfZGVjb2RlX2FyZWEgPSAKKyAgICAgICAgICAgICAgICAgICAgKE9QSl9CT09MICgqKSAoIHZvaWQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90KiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIsT1BKX0lOVDMyLE9QSl9JTlQzMixPUEpfSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqICkpIG9wal9qcDJfc2V0X2RlY29kZV9hcmVhOworCisJCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9nZXRfZGVjb2RlZF90aWxlID0gCisgICAgICAgICAgICAgICAgICAgIChPUEpfQk9PTCAoKikgKCB2b2lkICpwX2NvZGVjLAorCQkJCQkJCQkJb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfY2lvLAorCQkJCQkJCQkJb3BqX2ltYWdlX3QgKnBfaW1hZ2UsCisJCQkJCQkJCQlzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlciwKKwkJCQkJCQkJCU9QSl9VSU5UMzIgdGlsZV9pbmRleCkpIG9wal9qcDJfZ2V0X3RpbGU7CisKKwkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX3NldF9kZWNvZGVkX3Jlc29sdXRpb25fZmFjdG9yID0gCisgICAgICAgICAgICAgICAgICAgIChPUEpfQk9PTCAoKikgKCB2b2lkICogcF9jb2RlYywKKwkJCQkJCSAgICAJCU9QSl9VSU5UMzIgcmVzX2ZhY3RvciwKKwkJCQkJCQkgICAgCW9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikpIG9wal9qcDJfc2V0X2RlY29kZWRfcmVzb2x1dGlvbl9mYWN0b3I7CisKKwkJCWxfY29kZWMtPm1fY29kZWMgPSBvcGpfanAyX2NyZWF0ZShPUEpfVFJVRSk7CisKKwkJCWlmICghIGxfY29kZWMtPm1fY29kZWMpIHsKKwkJCQlvcGpfZnJlZShsX2NvZGVjKTsKKwkJCQlyZXR1cm4gMDA7CisJCQl9CisKKwkJCWJyZWFrOworCQljYXNlIE9QSl9DT0RFQ19VTktOT1dOOgorCQljYXNlIE9QSl9DT0RFQ19KUFQ6CisJCWRlZmF1bHQ6CisJCQlvcGpfZnJlZShsX2NvZGVjKTsKKwkJCXJldHVybiAwMDsKKwl9CisKKwlvcGpfc2V0X2RlZmF1bHRfZXZlbnRfaGFuZGxlcigmKGxfY29kZWMtPm1fZXZlbnRfbWdyKSk7CisJcmV0dXJuIChvcGpfY29kZWNfdCopIGxfY29kZWM7Cit9CisKK3ZvaWQgT1BKX0NBTExDT05WIG9wal9zZXRfZGVmYXVsdF9kZWNvZGVyX3BhcmFtZXRlcnMob3BqX2RwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMpIHsKKwlpZihwYXJhbWV0ZXJzKSB7CisJCW1lbXNldChwYXJhbWV0ZXJzLCAwLCBzaXplb2Yob3BqX2RwYXJhbWV0ZXJzX3QpKTsKKwkJLyogZGVmYXVsdCBkZWNvZGluZyBwYXJhbWV0ZXJzICovCisJCXBhcmFtZXRlcnMtPmNwX2xheWVyID0gMDsKKwkJcGFyYW1ldGVycy0+Y3BfcmVkdWNlID0gMDsKKworCQlwYXJhbWV0ZXJzLT5kZWNvZF9mb3JtYXQgPSAtMTsKKwkJcGFyYW1ldGVycy0+Y29kX2Zvcm1hdCA9IC0xOworCQlwYXJhbWV0ZXJzLT5mbGFncyA9IDA7CQkKKy8qIFVuaVBHPj4gKi8KKyNpZmRlZiBVU0VfSlBXTAorCQlwYXJhbWV0ZXJzLT5qcHdsX2NvcnJlY3QgPSBPUEpfRkFMU0U7CisJCXBhcmFtZXRlcnMtPmpwd2xfZXhwX2NvbXBzID0gSlBXTF9FWFBFQ1RFRF9DT01QT05FTlRTOworCQlwYXJhbWV0ZXJzLT5qcHdsX21heF90aWxlcyA9IEpQV0xfTUFYSU1VTV9USUxFUzsKKyNlbmRpZiAvKiBVU0VfSlBXTCAqLworLyogPDxVbmlQRyAqLworCX0KK30KKworT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9zZXR1cF9kZWNvZGVyKG9wal9jb2RlY190ICpwX2NvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9kcGFyYW1ldGVyc190ICpwYXJhbWV0ZXJzIAorCQkJCQkJCQkJCSkKK3sKKwlpZiAocF9jb2RlYyAmJiBwYXJhbWV0ZXJzKSB7IAorCQlvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfY29kZWM7CisKKwkJaWYgKCEgbF9jb2RlYy0+aXNfZGVjb21wcmVzc29yKSB7CisJCQlvcGpfZXZlbnRfbXNnKCYobF9jb2RlYy0+bV9ldmVudF9tZ3IpLCBFVlRfRVJST1IsIAorICAgICAgICAgICAgICAgICJDb2RlYyBwcm92aWRlZCB0byB0aGUgb3BqX3NldHVwX2RlY29kZXIgZnVuY3Rpb24gaXMgbm90IGEgZGVjb21wcmVzc29yIGhhbmRsZXIuXG4iKTsKKwkJCXJldHVybiBPUEpfRkFMU0U7CisJCX0KKworCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9zZXR1cF9kZWNvZGVyKGxfY29kZWMtPm1fY29kZWMsCisJCQkJCQkJCQkJCQkJCQkJcGFyYW1ldGVycyk7CisJCXJldHVybiBPUEpfVFJVRTsKKwl9CisJcmV0dXJuIE9QSl9GQUxTRTsKK30KKworT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9yZWFkX2hlYWRlciAoCW9wal9zdHJlYW1fdCAqcF9zdHJlYW0sCisJCQkJCQkJCQkJb3BqX2NvZGVjX3QgKnBfY29kZWMsCisJCQkJCQkJCQkJb3BqX2ltYWdlX3QgKipwX2ltYWdlICkKK3sKKwlpZiAocF9jb2RlYyAmJiBwX3N0cmVhbSkgeworCQlvcGpfY29kZWNfcHJpdmF0ZV90KiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QqKSBwX2NvZGVjOworCQlvcGpfc3RyZWFtX3ByaXZhdGVfdCogbF9zdHJlYW0gPSAob3BqX3N0cmVhbV9wcml2YXRlX3QqKSBwX3N0cmVhbTsKKworCQlpZighIGxfY29kZWMtPmlzX2RlY29tcHJlc3NvcikgeworCQkJb3BqX2V2ZW50X21zZygmKGxfY29kZWMtPm1fZXZlbnRfbWdyKSwgRVZUX0VSUk9SLCAKKyAgICAgICAgICAgICAgICAiQ29kZWMgcHJvdmlkZWQgdG8gdGhlIG9wal9yZWFkX2hlYWRlciBmdW5jdGlvbiBpcyBub3QgYSBkZWNvbXByZXNzb3IgaGFuZGxlci5cbiIpOworCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJfQorCisJCXJldHVybiBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9yZWFkX2hlYWRlcigJbF9zdHJlYW0sCisJCQkJCQkJCQkJCQkJCQkJCQlsX2NvZGVjLT5tX2NvZGVjLAorCQkJCQkJCQkJCQkJCQkJCQkJcF9pbWFnZSwKKwkJCQkJCQkJCQkJCQkJCQkJCSYobF9jb2RlYy0+bV9ldmVudF9tZ3IpICk7CisJfQorCisJcmV0dXJuIE9QSl9GQUxTRTsKK30KKworT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9kZWNvZGUoICAgb3BqX2NvZGVjX3QgKnBfY29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QqIHBfaW1hZ2UpCit7CisJaWYgKHBfY29kZWMgJiYgcF9zdHJlYW0pIHsKKwkJb3BqX2NvZGVjX3ByaXZhdGVfdCAqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCAqKSBwX2NvZGVjOworCQlvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIGxfc3RyZWFtID0gKG9wal9zdHJlYW1fcHJpdmF0ZV90ICopIHBfc3RyZWFtOworCisJCWlmICghIGxfY29kZWMtPmlzX2RlY29tcHJlc3NvcikgeworCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJfQorCisJCXJldHVybiBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9kZWNvZGUobF9jb2RlYy0+bV9jb2RlYywKKwkJCQkJCQkJCQkJCQkJCQlsX3N0cmVhbSwKKwkJCQkJCQkJCQkJCQkJCQlwX2ltYWdlLAorCQkJCQkJCQkJCQkJCQkJCSYobF9jb2RlYy0+bV9ldmVudF9tZ3IpICk7CisJfQorCisJcmV0dXJuIE9QSl9GQUxTRTsKK30KKworT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9zZXRfZGVjb2RlX2FyZWEoCW9wal9jb2RlY190ICpwX2NvZGVjLAorCQkJCQkJCQkJCQlvcGpfaW1hZ2VfdCogcF9pbWFnZSwKKwkJCQkJCQkJCQkJT1BKX0lOVDMyIHBfc3RhcnRfeCwgT1BKX0lOVDMyIHBfc3RhcnRfeSwKKwkJCQkJCQkJCQkJT1BKX0lOVDMyIHBfZW5kX3gsIE9QSl9JTlQzMiBwX2VuZF95CisJCQkJCQkJCQkJCSkKK3sKKwlpZiAocF9jb2RlYykgeworCQlvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfY29kZWM7CisJCQorCQlpZiAoISBsX2NvZGVjLT5pc19kZWNvbXByZXNzb3IpIHsKKwkJCXJldHVybiBPUEpfRkFMU0U7CisJCX0KKworCQlyZXR1cm4gIGxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX3NldF9kZWNvZGVfYXJlYSgJbF9jb2RlYy0+bV9jb2RlYywKKwkJCQkJCQkJCQkJCQkJCQkJCQlwX2ltYWdlLAorCQkJCQkJCQkJCQkJCQkJCQkJCXBfc3RhcnRfeCwgcF9zdGFydF95LAorCQkJCQkJCQkJCQkJCQkJCQkJCXBfZW5kX3gsIHBfZW5kX3ksCisJCQkJCQkJCQkJCQkJCQkJCQkJJihsX2NvZGVjLT5tX2V2ZW50X21ncikgKTsKKwl9CisJcmV0dXJuIE9QSl9GQUxTRTsKK30KKworT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9yZWFkX3RpbGVfaGVhZGVyKAlvcGpfY29kZWNfdCAqcF9jb2RlYywKKwkJCQkJCQkJCQkJb3BqX3N0cmVhbV90ICogcF9zdHJlYW0sCisJCQkJCQkJCQkJCU9QSl9VSU5UMzIgKiBwX3RpbGVfaW5kZXgsCisJCQkJCQkJCQkJCU9QSl9VSU5UMzIgKiBwX2RhdGFfc2l6ZSwKKwkJCQkJCQkJCQkJT1BKX0lOVDMyICogcF90aWxlX3gwLCBPUEpfSU5UMzIgKiBwX3RpbGVfeTAsCisJCQkJCQkJCQkJCU9QSl9JTlQzMiAqIHBfdGlsZV94MSwgT1BKX0lOVDMyICogcF90aWxlX3kxLAorCQkJCQkJCQkJCQlPUEpfVUlOVDMyICogcF9uYl9jb21wcywKKwkJCQkJCQkJCQkJT1BKX0JPT0wgKiBwX3Nob3VsZF9nb19vbikKK3sKKwlpZiAocF9jb2RlYyAmJiBwX3N0cmVhbSAmJiBwX2RhdGFfc2l6ZSAmJiBwX3RpbGVfaW5kZXgpIHsKKwkJb3BqX2NvZGVjX3ByaXZhdGVfdCAqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCAqKSBwX2NvZGVjOworCQlvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIGxfc3RyZWFtID0gKG9wal9zdHJlYW1fcHJpdmF0ZV90ICopIHBfc3RyZWFtOworCisJCWlmICghIGxfY29kZWMtPmlzX2RlY29tcHJlc3NvcikgeworCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJfQorCisJCXJldHVybiBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9yZWFkX3RpbGVfaGVhZGVyKAlsX2NvZGVjLT5tX2NvZGVjLAorCQkJCQkJCQkJCQkJCQkJCQkJCXBfdGlsZV9pbmRleCwKKwkJCQkJCQkJCQkJCQkJCQkJCQlwX2RhdGFfc2l6ZSwKKwkJCQkJCQkJCQkJCQkJCQkJCQlwX3RpbGVfeDAsIHBfdGlsZV95MCwKKwkJCQkJCQkJCQkJCQkJCQkJCQlwX3RpbGVfeDEsIHBfdGlsZV95MSwKKwkJCQkJCQkJCQkJCQkJCQkJCQlwX25iX2NvbXBzLAorCQkJCQkJCQkJCQkJCQkJCQkJCXBfc2hvdWxkX2dvX29uLAorCQkJCQkJCQkJCQkJCQkJCQkJCWxfc3RyZWFtLAorCQkJCQkJCQkJCQkJCQkJCQkJCSYobF9jb2RlYy0+bV9ldmVudF9tZ3IpKTsKKwl9CisJcmV0dXJuIE9QSl9GQUxTRTsKK30KKworT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9kZWNvZGVfdGlsZV9kYXRhKAlvcGpfY29kZWNfdCAqcF9jb2RlYywKKwkJCQkJCQkJCQkJT1BKX1VJTlQzMiBwX3RpbGVfaW5kZXgsCisJCQkJCQkJCQkJCU9QSl9CWVRFICogcF9kYXRhLAorCQkJCQkJCQkJCQlPUEpfVUlOVDMyIHBfZGF0YV9zaXplLAorCQkJCQkJCQkJCQlvcGpfc3RyZWFtX3QgKnBfc3RyZWFtCisJCQkJCQkJCQkJCSkKK3sKKwlpZiAocF9jb2RlYyAmJiBwX2RhdGEgJiYgcF9zdHJlYW0pIHsKKwkJb3BqX2NvZGVjX3ByaXZhdGVfdCAqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCAqKSBwX2NvZGVjOworCQlvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIGxfc3RyZWFtID0gKG9wal9zdHJlYW1fcHJpdmF0ZV90ICopIHBfc3RyZWFtOworCisJCWlmICghIGxfY29kZWMtPmlzX2RlY29tcHJlc3NvcikgeworCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJfQorCisJCXJldHVybiBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9kZWNvZGVfdGlsZV9kYXRhKAlsX2NvZGVjLT5tX2NvZGVjLAorCQkJCQkJCQkJCQkJCQkJCQkJCXBfdGlsZV9pbmRleCwKKwkJCQkJCQkJCQkJCQkJCQkJCQlwX2RhdGEsCisJCQkJCQkJCQkJCQkJCQkJCQkJcF9kYXRhX3NpemUsCisJCQkJCQkJCQkJCQkJCQkJCQkJbF9zdHJlYW0sCisJCQkJCQkJCQkJCQkJCQkJCQkJJihsX2NvZGVjLT5tX2V2ZW50X21ncikgKTsKKwl9CisJcmV0dXJuIE9QSl9GQUxTRTsKK30KKworT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9nZXRfZGVjb2RlZF90aWxlKAlvcGpfY29kZWNfdCAqcF9jb2RlYywKKwkJCQkJCQkJCQkJb3BqX3N0cmVhbV90ICpwX3N0cmVhbSwKKwkJCQkJCQkJCQkJb3BqX2ltYWdlX3QgKnBfaW1hZ2UsCisJCQkJCQkJCQkJCU9QSl9VSU5UMzIgdGlsZV9pbmRleCkKK3sKKwlpZiAocF9jb2RlYyAmJiBwX3N0cmVhbSkgeworCQlvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfY29kZWM7CisJCW9wal9zdHJlYW1fcHJpdmF0ZV90ICogbF9zdHJlYW0gPSAob3BqX3N0cmVhbV9wcml2YXRlX3QgKikgcF9zdHJlYW07CisKKwkJaWYgKCEgbF9jb2RlYy0+aXNfZGVjb21wcmVzc29yKSB7CisJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQl9CisJCQorCQlyZXR1cm4gbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfZ2V0X2RlY29kZWRfdGlsZSgJbF9jb2RlYy0+bV9jb2RlYywKKwkJCQkJCQkJCQkJCQkJCQkJCQlsX3N0cmVhbSwKKwkJCQkJCQkJCQkJCQkJCQkJCQlwX2ltYWdlLAorCQkJCQkJCQkJCQkJCQkJCQkJCSYobF9jb2RlYy0+bV9ldmVudF9tZ3IpLAorCQkJCQkJCQkJCQkJCQkJCQkJCXRpbGVfaW5kZXgpOworCX0KKworCXJldHVybiBPUEpfRkFMU0U7Cit9CisKK09QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfc2V0X2RlY29kZWRfcmVzb2x1dGlvbl9mYWN0b3Iob3BqX2NvZGVjX3QgKnBfY29kZWMsIAorCQkJCQkJCQkJCQkJCQlPUEpfVUlOVDMyIHJlc19mYWN0b3IgKQoreworCW9wal9jb2RlY19wcml2YXRlX3QgKiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QgKikgcF9jb2RlYzsKKworCWlmICggIWxfY29kZWMgKXsKKwkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisKKwlyZXR1cm4gbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfc2V0X2RlY29kZWRfcmVzb2x1dGlvbl9mYWN0b3IobF9jb2RlYy0+bV9jb2RlYywKKwkJCQkJCQkJCQkJCQkJCQkJCQlyZXNfZmFjdG9yLAorCQkJCQkJCQkJCQkJCQkJCQkJCSYobF9jb2RlYy0+bV9ldmVudF9tZ3IpICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIENPTVBSRVNTSU9OIEZVTkNUSU9OUyovCisKK29wal9jb2RlY190KiBPUEpfQ0FMTENPTlYgb3BqX2NyZWF0ZV9jb21wcmVzcyhPUEpfQ09ERUNfRk9STUFUIHBfZm9ybWF0KQoreworCW9wal9jb2RlY19wcml2YXRlX3QgKmxfY29kZWMgPSAwMDsKKworCWxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCopb3BqX2NhbGxvYygxLCBzaXplb2Yob3BqX2NvZGVjX3ByaXZhdGVfdCkpOworCWlmICghbF9jb2RlYykgeworCQlyZXR1cm4gMDA7CisJfQorCQorCWxfY29kZWMtPmlzX2RlY29tcHJlc3NvciA9IDA7CisKKwlzd2l0Y2gocF9mb3JtYXQpIHsKKwkJY2FzZSBPUEpfQ09ERUNfSjJLOgorCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX2VuY29kZSA9IChPUEpfQk9PTCAoKikgKHZvaWQgKiwKKwkJCQkJCQkJCQkJCQkJCQkJCQlzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICosCisJCQkJCQkJCQkJCQkJCQkJCQkJc3RydWN0IG9wal9ldmVudF9tZ3IgKiApKSBvcGpfajJrX2VuY29kZTsKKworCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX2VuZF9jb21wcmVzcyA9IChPUEpfQk9PTCAoKikgKAl2b2lkICosCisJCQkJCQkJCQkJCQkJCQkJCQkJCQlzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICosCisJCQkJCQkJCQkJCQkJCQkJCQkJCQlzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqKSkgb3BqX2oya19lbmRfY29tcHJlc3M7CisKKwkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2NvbXByZXNzaW9uLm9wal9zdGFydF9jb21wcmVzcyA9IChPUEpfQk9PTCAoKikgKHZvaWQgKiwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCXN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCXN0cnVjdCBvcGpfaW1hZ2UgKiAsCisJCQkJCQkJCQkJCQkJCQkJCQkJCQlzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqKSkgb3BqX2oya19zdGFydF9jb21wcmVzczsKKworCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX3dyaXRlX3RpbGUgPSAoT1BKX0JPT0wgKCopICh2b2lkICosCisJCQkJCQkJCQkJCQkJCQkJCQkJCU9QSl9VSU5UMzIsCisJCQkJCQkJCQkJCQkJCQkJCQkJCU9QSl9CWVRFKiwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJT1BKX1VJTlQzMiwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAorCQkJCQkJCQkJCQkJCQkJCQkJCQlzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqKSApIG9wal9qMmtfd3JpdGVfdGlsZTsKKworCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX2Rlc3Ryb3kgPSAodm9pZCAoKikgKHZvaWQgKikpIG9wal9qMmtfZGVzdHJveTsKKworCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX3NldHVwX2VuY29kZXIgPSAoT1BKX0JPT0wgKCopICgJdm9pZCAqLAorCQkJCQkJCQkJCQkJCQkJCQkJCQlvcGpfY3BhcmFtZXRlcnNfdCAqLAorCQkJCQkJCQkJCQkJCQkJCQkJCQlzdHJ1Y3Qgb3BqX2ltYWdlICosCisJCQkJCQkJCQkJCQkJCQkJCQkJCXN0cnVjdCBvcGpfZXZlbnRfbWdyICogKSkgb3BqX2oya19zZXR1cF9lbmNvZGVyOworCisJCQlsX2NvZGVjLT5tX2NvZGVjID0gb3BqX2oya19jcmVhdGVfY29tcHJlc3MoKTsKKwkJCWlmICghIGxfY29kZWMtPm1fY29kZWMpIHsKKwkJCQlvcGpfZnJlZShsX2NvZGVjKTsKKwkJCQlyZXR1cm4gMDA7CisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgT1BKX0NPREVDX0pQMjoKKwkJCS8qIGdldCBhIEpQMiBkZWNvZGVyIGhhbmRsZSAqLworCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX2VuY29kZSA9IChPUEpfQk9PTCAoKikgKHZvaWQgKiwKKwkJCQkJCQkJCQkJCQkJCQkJCQlzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICosCisJCQkJCQkJCQkJCQkJCQkJCQkJc3RydWN0IG9wal9ldmVudF9tZ3IgKiApKSBvcGpfanAyX2VuY29kZTsKKworCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX2VuZF9jb21wcmVzcyA9IChPUEpfQk9PTCAoKikgKAl2b2lkICosCisJCQkJCQkJCQkJCQkJCQkJCQkJCQlzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICosCisJCQkJCQkJCQkJCQkJCQkJCQkJCQlzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqKSkgb3BqX2pwMl9lbmRfY29tcHJlc3M7CisKKwkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2NvbXByZXNzaW9uLm9wal9zdGFydF9jb21wcmVzcyA9IChPUEpfQk9PTCAoKikgKHZvaWQgKiwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCXN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCXN0cnVjdCBvcGpfaW1hZ2UgKiAsCisJCQkJCQkJCQkJCQkJCQkJCQkJCQlzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqKSkgIG9wal9qcDJfc3RhcnRfY29tcHJlc3M7CisKKwkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2NvbXByZXNzaW9uLm9wal93cml0ZV90aWxlID0gKE9QSl9CT09MICgqKSAodm9pZCAqLAorCQkJCQkJCQkJCQkJCQkJCQkJCQlPUEpfVUlOVDMyLAorCQkJCQkJCQkJCQkJCQkJCQkJCQlPUEpfQllURSosCisJCQkJCQkJCQkJCQkJCQkJCQkJCU9QSl9VSU5UMzIsCisJCQkJCQkJCQkJCQkJCQkJCQkJCXN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiwKKwkJCQkJCQkJCQkJCQkJCQkJCQkJc3RydWN0IG9wal9ldmVudF9tZ3IgKikpIG9wal9qcDJfd3JpdGVfdGlsZTsKKworCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX2Rlc3Ryb3kgPSAodm9pZCAoKikgKHZvaWQgKikpIG9wal9qcDJfZGVzdHJveTsKKworCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX3NldHVwX2VuY29kZXIgPSAoT1BKX0JPT0wgKCopICgJdm9pZCAqLAorCQkJCQkJCQkJCQkJCQkJCQkJCQlvcGpfY3BhcmFtZXRlcnNfdCAqLAorCQkJCQkJCQkJCQkJCQkJCQkJCQlzdHJ1Y3Qgb3BqX2ltYWdlICosCisJCQkJCQkJCQkJCQkJCQkJCQkJCXN0cnVjdCBvcGpfZXZlbnRfbWdyICogKSkgb3BqX2pwMl9zZXR1cF9lbmNvZGVyOworCisJCQlsX2NvZGVjLT5tX2NvZGVjID0gb3BqX2pwMl9jcmVhdGUoT1BKX0ZBTFNFKTsKKwkJCWlmICghIGxfY29kZWMtPm1fY29kZWMpIHsKKwkJCQlvcGpfZnJlZShsX2NvZGVjKTsKKwkJCQlyZXR1cm4gMDA7CisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgT1BKX0NPREVDX1VOS05PV046CisJCWNhc2UgT1BKX0NPREVDX0pQVDoKKwkJZGVmYXVsdDoKKwkJCW9wal9mcmVlKGxfY29kZWMpOworCQkJcmV0dXJuIDAwOworCX0KKworCW9wal9zZXRfZGVmYXVsdF9ldmVudF9oYW5kbGVyKCYobF9jb2RlYy0+bV9ldmVudF9tZ3IpKTsKKwlyZXR1cm4gKG9wal9jb2RlY190KikgbF9jb2RlYzsKK30KKwordm9pZCBPUEpfQ0FMTENPTlYgb3BqX3NldF9kZWZhdWx0X2VuY29kZXJfcGFyYW1ldGVycyhvcGpfY3BhcmFtZXRlcnNfdCAqcGFyYW1ldGVycykgeworCWlmKHBhcmFtZXRlcnMpIHsKKwkJbWVtc2V0KHBhcmFtZXRlcnMsIDAsIHNpemVvZihvcGpfY3BhcmFtZXRlcnNfdCkpOworCQkvKiBkZWZhdWx0IGNvZGluZyBwYXJhbWV0ZXJzICovCisgICAgICAgIHBhcmFtZXRlcnMtPmNwX2NpbmVtYSA9IE9QSl9PRkY7IC8qIERFUFJFQ0FURUQgKi8KKyAgICAgICAgcGFyYW1ldGVycy0+cnNpeiA9IE9QSl9QUk9GSUxFX05PTkU7CisJCXBhcmFtZXRlcnMtPm1heF9jb21wX3NpemUgPSAwOworCQlwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uID0gNjsKKyAgICAgICAgcGFyYW1ldGVycy0+Y3BfcnNpeiA9IE9QSl9TVERfUlNJWjsgLyogREVQUkVDQVRFRCAqLworCQlwYXJhbWV0ZXJzLT5jYmxvY2t3X2luaXQgPSA2NDsKKwkJcGFyYW1ldGVycy0+Y2Jsb2NraF9pbml0ID0gNjQ7CisJCXBhcmFtZXRlcnMtPnByb2dfb3JkZXIgPSBPUEpfTFJDUDsKKwkJcGFyYW1ldGVycy0+cm9pX2NvbXBubyA9IC0xOwkJLyogbm8gUk9JICovCisJCXBhcmFtZXRlcnMtPnN1YnNhbXBsaW5nX2R4ID0gMTsKKwkJcGFyYW1ldGVycy0+c3Vic2FtcGxpbmdfZHkgPSAxOworCQlwYXJhbWV0ZXJzLT50cF9vbiA9IDA7CisJCXBhcmFtZXRlcnMtPmRlY29kX2Zvcm1hdCA9IC0xOworCQlwYXJhbWV0ZXJzLT5jb2RfZm9ybWF0ID0gLTE7CisJCXBhcmFtZXRlcnMtPnRjcF9yYXRlc1swXSA9IDA7ICAgCisJCXBhcmFtZXRlcnMtPnRjcF9udW1sYXllcnMgPSAwOworCQlwYXJhbWV0ZXJzLT5jcF9kaXN0b19hbGxvYyA9IDA7CisJCXBhcmFtZXRlcnMtPmNwX2ZpeGVkX2FsbG9jID0gMDsKKwkJcGFyYW1ldGVycy0+Y3BfZml4ZWRfcXVhbGl0eSA9IDA7CisJCXBhcmFtZXRlcnMtPmpwaXBfb24gPSBPUEpfRkFMU0U7CisvKiBVbmlQRz4+ICovCisjaWZkZWYgVVNFX0pQV0wKKwkJcGFyYW1ldGVycy0+anB3bF9lcGNfb24gPSBPUEpfRkFMU0U7CisJCXBhcmFtZXRlcnMtPmpwd2xfaHByb3RfTUggPSAtMTsgLyogLTEgbWVhbnMgdW5hc3NpZ25lZCAqLworCQl7CisJCQlpbnQgaTsKKwkJCWZvciAoaSA9IDA7IGkgPCBKUFdMX01BWF9OT19USUxFU1BFQ1M7IGkrKykgeworCQkJCXBhcmFtZXRlcnMtPmpwd2xfaHByb3RfVFBIX3RpbGVub1tpXSA9IC0xOyAvKiB1bmFzc2lnbmVkICovCisJCQkJcGFyYW1ldGVycy0+anB3bF9ocHJvdF9UUEhbaV0gPSAwOyAvKiBhYnNlbnQgKi8KKwkJCX0KKwkJfTsKKwkJeworCQkJaW50IGk7CisJCQlmb3IgKGkgPSAwOyBpIDwgSlBXTF9NQVhfTk9fUEFDS1NQRUNTOyBpKyspIHsKKwkJCQlwYXJhbWV0ZXJzLT5qcHdsX3Bwcm90X3RpbGVub1tpXSA9IC0xOyAvKiB1bmFzc2lnbmVkICovCisJCQkJcGFyYW1ldGVycy0+anB3bF9wcHJvdF9wYWNrbm9baV0gPSAtMTsgLyogdW5hc3NpZ25lZCAqLworCQkJCXBhcmFtZXRlcnMtPmpwd2xfcHByb3RbaV0gPSAwOyAvKiBhYnNlbnQgKi8KKwkJCX0KKwkJfTsKKwkJcGFyYW1ldGVycy0+anB3bF9zZW5zX3NpemUgPSAwOyAvKiAwIG1lYW5zIG5vIEVTRCAqLworCQlwYXJhbWV0ZXJzLT5qcHdsX3NlbnNfYWRkciA9IDA7IC8qIDAgbWVhbnMgYXV0byAqLworCQlwYXJhbWV0ZXJzLT5qcHdsX3NlbnNfcmFuZ2UgPSAwOyAvKiAwIG1lYW5zIHBhY2tldCAqLworCQlwYXJhbWV0ZXJzLT5qcHdsX3NlbnNfTUggPSAtMTsgLyogLTEgbWVhbnMgdW5hc3NpZ25lZCAqLworCQl7CisJCQlpbnQgaTsKKwkJCWZvciAoaSA9IDA7IGkgPCBKUFdMX01BWF9OT19USUxFU1BFQ1M7IGkrKykgeworCQkJCXBhcmFtZXRlcnMtPmpwd2xfc2Vuc19UUEhfdGlsZW5vW2ldID0gLTE7IC8qIHVuYXNzaWduZWQgKi8KKwkJCQlwYXJhbWV0ZXJzLT5qcHdsX3NlbnNfVFBIW2ldID0gLTE7IC8qIGFic2VudCAqLworCQkJfQorCQl9OworI2VuZGlmIC8qIFVTRV9KUFdMICovCisvKiA8PFVuaVBHICovCisJfQorfQorCitPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3NldHVwX2VuY29kZXIob3BqX2NvZGVjX3QgKnBfY29kZWMsIAorCQkJCQkJCQkJCW9wal9jcGFyYW1ldGVyc190ICpwYXJhbWV0ZXJzLCAKKwkJCQkJCQkJCQlvcGpfaW1hZ2VfdCAqcF9pbWFnZSkKK3sKKwlpZiAocF9jb2RlYyAmJiBwYXJhbWV0ZXJzICYmIHBfaW1hZ2UpIHsKKwkJb3BqX2NvZGVjX3ByaXZhdGVfdCAqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCAqKSBwX2NvZGVjOworCisJCWlmICghIGxfY29kZWMtPmlzX2RlY29tcHJlc3NvcikgeworCQkJcmV0dXJuIGxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2NvbXByZXNzaW9uLm9wal9zZXR1cF9lbmNvZGVyKAlsX2NvZGVjLT5tX2NvZGVjLAorCQkJCQkJCQkJCQkJCQkJCQlwYXJhbWV0ZXJzLAorCQkJCQkJCQkJCQkJCQkJCQlwX2ltYWdlLAorCQkJCQkJCQkJCQkJCQkJCQkmKGxfY29kZWMtPm1fZXZlbnRfbWdyKSApOworCQl9CisJfQorCisJcmV0dXJuIE9QSl9GQUxTRTsKK30KKworT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9zdGFydF9jb21wcmVzcyAoCW9wal9jb2RlY190ICpwX2NvZGVjLAorCQkJCQkJCQkJCQlvcGpfaW1hZ2VfdCAqIHBfaW1hZ2UsCisJCQkJCQkJCQkJCW9wal9zdHJlYW1fdCAqcF9zdHJlYW0pCit7CisJaWYgKHBfY29kZWMgJiYgcF9zdHJlYW0pIHsKKwkJb3BqX2NvZGVjX3ByaXZhdGVfdCAqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCAqKSBwX2NvZGVjOworCQlvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIGxfc3RyZWFtID0gKG9wal9zdHJlYW1fcHJpdmF0ZV90ICopIHBfc3RyZWFtOworCisJCWlmICghIGxfY29kZWMtPmlzX2RlY29tcHJlc3NvcikgeworCQkJcmV0dXJuIGxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2NvbXByZXNzaW9uLm9wal9zdGFydF9jb21wcmVzcygJbF9jb2RlYy0+bV9jb2RlYywKKwkJCQkJCQkJCQkJCQkJCQkJCQlsX3N0cmVhbSwKKwkJCQkJCQkJCQkJCQkJCQkJCQlwX2ltYWdlLAorCQkJCQkJCQkJCQkJCQkJCQkJCSYobF9jb2RlYy0+bV9ldmVudF9tZ3IpKTsKKwkJfQorCX0KKworCXJldHVybiBPUEpfRkFMU0U7Cit9CisKK09QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfZW5jb2RlKG9wal9jb2RlY190ICpwX2luZm8sIG9wal9zdHJlYW1fdCAqcF9zdHJlYW0pCit7CisJaWYgKHBfaW5mbyAmJiBwX3N0cmVhbSkgeworCQlvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfaW5mbzsKKwkJb3BqX3N0cmVhbV9wcml2YXRlX3QgKiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqKSBwX3N0cmVhbTsKKworCQlpZiAoISBsX2NvZGVjLT5pc19kZWNvbXByZXNzb3IpIHsKKwkJCXJldHVybiBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfZW5jb2RlKAlsX2NvZGVjLT5tX2NvZGVjLAorCQkJCQkJCQkJCQkJCQkJbF9zdHJlYW0sCisJCQkJCQkJCQkJCQkJCQkmKGxfY29kZWMtPm1fZXZlbnRfbWdyKSk7CisJCX0KKwl9CisKKwlyZXR1cm4gT1BKX0ZBTFNFOworCit9CisKK09QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfZW5kX2NvbXByZXNzIChvcGpfY29kZWNfdCAqcF9jb2RlYywKKwkJCQkJCQkJCQlvcGpfc3RyZWFtX3QgKnBfc3RyZWFtKQoreworCWlmIChwX2NvZGVjICYmIHBfc3RyZWFtKSB7CisJCW9wal9jb2RlY19wcml2YXRlX3QgKiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QgKikgcF9jb2RlYzsKKwkJb3BqX3N0cmVhbV9wcml2YXRlX3QgKiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqKSBwX3N0cmVhbTsKKworCQlpZiAoISBsX2NvZGVjLT5pc19kZWNvbXByZXNzb3IpIHsKKwkJCXJldHVybiBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfZW5kX2NvbXByZXNzKGxfY29kZWMtPm1fY29kZWMsCisJCQkJCQkJCQkJCQkJCQkJCQlsX3N0cmVhbSwKKwkJCQkJCQkJCQkJCQkJCQkJCSYobF9jb2RlYy0+bV9ldmVudF9tZ3IpKTsKKwkJfQorCX0KKwlyZXR1cm4gT1BKX0ZBTFNFOworCit9CisKK09QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfZW5kX2RlY29tcHJlc3MgKAlvcGpfY29kZWNfdCAqcF9jb2RlYywKKwkJCQkJCQkJCQkJb3BqX3N0cmVhbV90ICpwX3N0cmVhbSkKK3sKKwlpZiAocF9jb2RlYyAmJiBwX3N0cmVhbSkgeworCQlvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfY29kZWM7CisJCW9wal9zdHJlYW1fcHJpdmF0ZV90ICogbF9zdHJlYW0gPSAob3BqX3N0cmVhbV9wcml2YXRlX3QgKikgcF9zdHJlYW07CisKKwkJaWYgKCEgbF9jb2RlYy0+aXNfZGVjb21wcmVzc29yKSB7CisJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQl9CisJCQorCQlyZXR1cm4gbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfZW5kX2RlY29tcHJlc3MobF9jb2RlYy0+bV9jb2RlYywKKwkJCQkJCQkJCQkJCQkJCQkJCWxfc3RyZWFtLAorCQkJCQkJCQkJCQkJCQkJCQkJJihsX2NvZGVjLT5tX2V2ZW50X21ncikgKTsKKwl9CisKKwlyZXR1cm4gT1BKX0ZBTFNFOworfQorCitPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3NldF9NQ1Qob3BqX2NwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIgKiBwRW5jb2RpbmdNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF9kY19zaGlmdCxPUEpfVUlOVDMyIHBOYkNvbXApCit7CisJT1BKX1VJTlQzMiBsX21hdHJpeF9zaXplID0gcE5iQ29tcCAqIHBOYkNvbXAgKiAoT1BKX1VJTlQzMilzaXplb2YoT1BKX0ZMT0FUMzIpOworCU9QSl9VSU5UMzIgbF9kY19zaGlmdF9zaXplID0gcE5iQ29tcCAqIChPUEpfVUlOVDMyKXNpemVvZihPUEpfSU5UMzIpOworCU9QSl9VSU5UMzIgbF9tY3RfdG90YWxfc2l6ZSA9IGxfbWF0cml4X3NpemUgKyBsX2RjX3NoaWZ0X3NpemU7CisKKwkvKiBhZGQgTUNUIGNhcGFiaWxpdHkgKi8KKyAgICBpZiAoT1BKX0lTX1BBUlQyKHBhcmFtZXRlcnMtPnJzaXopKSB7CisgICAgICAgIHBhcmFtZXRlcnMtPnJzaXogfD0gT1BKX0VYVEVOU0lPTl9NQ1Q7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGFyYW1ldGVycy0+cnNpeiA9ICgoT1BKX1BST0ZJTEVfUEFSVDIpIHwgKE9QSl9FWFRFTlNJT05fTUNUKSk7CisgICAgfQorCXBhcmFtZXRlcnMtPmlycmV2ZXJzaWJsZSA9IDE7CisKKwkvKiB1c2UgYXJyYXkgYmFzZWQgTUNUICovCisJcGFyYW1ldGVycy0+dGNwX21jdCA9IDI7CisJcGFyYW1ldGVycy0+bWN0X2RhdGEgPSBvcGpfbWFsbG9jKGxfbWN0X3RvdGFsX3NpemUpOworCWlmICghIHBhcmFtZXRlcnMtPm1jdF9kYXRhKSB7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCisJbWVtY3B5KHBhcmFtZXRlcnMtPm1jdF9kYXRhLHBFbmNvZGluZ01hdHJpeCxsX21hdHJpeF9zaXplKTsKKwltZW1jcHkoKChPUEpfQllURSAqKSBwYXJhbWV0ZXJzLT5tY3RfZGF0YSkgKyAgbF9tYXRyaXhfc2l6ZSxwX2RjX3NoaWZ0LGxfZGNfc2hpZnRfc2l6ZSk7CisKKwlyZXR1cm4gT1BKX1RSVUU7Cit9CisKK09QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfd3JpdGVfdGlsZSAoCW9wal9jb2RlY190ICpwX2NvZGVjLAorCQkJCQkJCQkJCU9QSl9VSU5UMzIgcF90aWxlX2luZGV4LAorCQkJCQkJCQkJCU9QSl9CWVRFICogcF9kYXRhLAorCQkJCQkJCQkJCU9QSl9VSU5UMzIgcF9kYXRhX3NpemUsCisJCQkJCQkJCQkJb3BqX3N0cmVhbV90ICpwX3N0cmVhbSApCit7CisJaWYgKHBfY29kZWMgJiYgcF9zdHJlYW0gJiYgcF9kYXRhKSB7CisJCW9wal9jb2RlY19wcml2YXRlX3QgKiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QgKikgcF9jb2RlYzsKKwkJb3BqX3N0cmVhbV9wcml2YXRlX3QgKiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqKSBwX3N0cmVhbTsKKworCQlpZiAobF9jb2RlYy0+aXNfZGVjb21wcmVzc29yKSB7CisJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQl9CisKKwkJcmV0dXJuIGxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2NvbXByZXNzaW9uLm9wal93cml0ZV90aWxlKAlsX2NvZGVjLT5tX2NvZGVjLAorCQkJCQkJCQkJCQkJCQkJCQlwX3RpbGVfaW5kZXgsCisJCQkJCQkJCQkJCQkJCQkJCXBfZGF0YSwKKwkJCQkJCQkJCQkJCQkJCQkJcF9kYXRhX3NpemUsCisJCQkJCQkJCQkJCQkJCQkJCWxfc3RyZWFtLAorCQkJCQkJCQkJCQkJCQkJCQkmKGxfY29kZWMtPm1fZXZlbnRfbWdyKSApOworCX0KKworCXJldHVybiBPUEpfRkFMU0U7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBPUEpfQ0FMTENPTlYgb3BqX2Rlc3Ryb3lfY29kZWMob3BqX2NvZGVjX3QgKnBfY29kZWMpCit7CisJaWYgKHBfY29kZWMpIHsKKwkJb3BqX2NvZGVjX3ByaXZhdGVfdCAqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCAqKSBwX2NvZGVjOworCisJCWlmIChsX2NvZGVjLT5pc19kZWNvbXByZXNzb3IpIHsKKwkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX2Rlc3Ryb3kobF9jb2RlYy0+bV9jb2RlYyk7CisJCX0KKwkJZWxzZSB7CisJCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfZGVzdHJveShsX2NvZGVjLT5tX2NvZGVjKTsKKwkJfQorCisJCWxfY29kZWMtPm1fY29kZWMgPSAwMDsKKwkJb3BqX2ZyZWUobF9jb2RlYyk7CisJfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgT1BKX0NBTExDT05WIG9wal9kdW1wX2NvZGVjKAlvcGpfY29kZWNfdCAqcF9jb2RlYywKKwkJCQkJCQkJCU9QSl9JTlQzMiBpbmZvX2ZsYWcsCisJCQkJCQkJCQlGSUxFKiBvdXRwdXRfc3RyZWFtKQoreworCWlmIChwX2NvZGVjKSB7CisJCW9wal9jb2RlY19wcml2YXRlX3QqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCopIHBfY29kZWM7CisKKwkJbF9jb2RlYy0+b3BqX2R1bXBfY29kZWMobF9jb2RlYy0+bV9jb2RlYywgaW5mb19mbGFnLCBvdXRwdXRfc3RyZWFtKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFRPRE8gcmV0dXJuIGVycm9yICovCisJLyogZnByaW50ZihzdGRlcnIsICJbRVJST1JdIElucHV0IHBhcmFtZXRlciBvZiB0aGUgZHVtcF9jb2RlYyBmdW5jdGlvbiBhcmUgaW5jb3JyZWN0LlxuIik7ICovCisJcmV0dXJuOworfQorCitvcGpfY29kZXN0cmVhbV9pbmZvX3YyX3QqIE9QSl9DQUxMQ09OViBvcGpfZ2V0X2NzdHJfaW5mbyhvcGpfY29kZWNfdCAqcF9jb2RlYykKK3sKKwlpZiAocF9jb2RlYykgeworCQlvcGpfY29kZWNfcHJpdmF0ZV90KiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QqKSBwX2NvZGVjOworCisJCXJldHVybiBsX2NvZGVjLT5vcGpfZ2V0X2NvZGVjX2luZm8obF9jb2RlYy0+bV9jb2RlYyk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgT1BKX0NBTExDT05WIG9wal9kZXN0cm95X2NzdHJfaW5mbyhvcGpfY29kZXN0cmVhbV9pbmZvX3YyX3QgKipjc3RyX2luZm8pIHsKKwlpZiAoY3N0cl9pbmZvKSB7CisKKwkJaWYgKCgqY3N0cl9pbmZvKS0+bV9kZWZhdWx0X3RpbGVfaW5mby50Y2NwX2luZm8peworCQkJb3BqX2ZyZWUoKCpjc3RyX2luZm8pLT5tX2RlZmF1bHRfdGlsZV9pbmZvLnRjY3BfaW5mbyk7CisJCX0KKworCQlpZiAoKCpjc3RyX2luZm8pLT50aWxlX2luZm8peworCQkJLyogRklYTUUgbm90IHVzZWQgZm9yIHRoZSBtb21lbnQqLworCQl9CisKKwkJb3BqX2ZyZWUoKCpjc3RyX2luZm8pKTsKKwkJKCpjc3RyX2luZm8pID0gTlVMTDsKKwl9Cit9CisKK29wal9jb2Rlc3RyZWFtX2luZGV4X3QgKiBPUEpfQ0FMTENPTlYgb3BqX2dldF9jc3RyX2luZGV4KG9wal9jb2RlY190ICpwX2NvZGVjKQoreworCWlmIChwX2NvZGVjKSB7CisJCW9wal9jb2RlY19wcml2YXRlX3QqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCopIHBfY29kZWM7CisKKwkJcmV0dXJuIGxfY29kZWMtPm9wal9nZXRfY29kZWNfaW5kZXgobF9jb2RlYy0+bV9jb2RlYyk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgT1BKX0NBTExDT05WIG9wal9kZXN0cm95X2NzdHJfaW5kZXgob3BqX2NvZGVzdHJlYW1faW5kZXhfdCAqKnBfY3N0cl9pbmRleCkKK3sKKwlpZiAoKnBfY3N0cl9pbmRleCl7CisJCWoya19kZXN0cm95X2NzdHJfaW5kZXgoKnBfY3N0cl9pbmRleCk7CisJCSgqcF9jc3RyX2luZGV4KSA9IE5VTEw7CisJfQorfQorCitvcGpfc3RyZWFtX3QqIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX2NyZWF0ZV9kZWZhdWx0X2ZpbGVfc3RyZWFtIChjb25zdCBjaGFyICpmbmFtZSwgT1BKX0JPT0wgcF9pc19yZWFkX3N0cmVhbSkKK3sKKyAgICByZXR1cm4gb3BqX3N0cmVhbV9jcmVhdGVfZmlsZV9zdHJlYW0oZm5hbWUsIE9QSl9KMktfU1RSRUFNX0NIVU5LX1NJWkUsIHBfaXNfcmVhZF9zdHJlYW0pOworfQorCitvcGpfc3RyZWFtX3QqIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX2NyZWF0ZV9maWxlX3N0cmVhbSAoCisgICAgICAgIGNvbnN0IGNoYXIgKmZuYW1lLCAKKwkJT1BKX1NJWkVfVCBwX3NpemUsIAorICAgICAgICBPUEpfQk9PTCBwX2lzX3JlYWRfc3RyZWFtKQoreworICAgIG9wal9zdHJlYW1fdCogbF9zdHJlYW0gPSAwMDsKKyAgICBGSUxFICpwX2ZpbGU7CisgICAgY29uc3QgY2hhciAqbW9kZTsKKworICAgIGlmICghIGZuYW1lKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAKKyAgICBpZihwX2lzX3JlYWRfc3RyZWFtKSBtb2RlID0gInJiIjsgZWxzZSBtb2RlID0gIndiIjsKKworICAgIHBfZmlsZSA9IGZvcGVuKGZuYW1lLCBtb2RlKTsKKworICAgIGlmICghIHBfZmlsZSkgeworCSAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBsX3N0cmVhbSA9IG9wal9zdHJlYW1fY3JlYXRlKHBfc2l6ZSxwX2lzX3JlYWRfc3RyZWFtKTsKKyAgICBpZiAoISBsX3N0cmVhbSkgeworICAgICAgICBmY2xvc2UocF9maWxlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgb3BqX3N0cmVhbV9zZXRfdXNlcl9kYXRhKGxfc3RyZWFtLCBwX2ZpbGUsIChvcGpfc3RyZWFtX2ZyZWVfdXNlcl9kYXRhX2ZuKSBmY2xvc2UpOworICAgIG9wal9zdHJlYW1fc2V0X3VzZXJfZGF0YV9sZW5ndGgobF9zdHJlYW0sIG9wal9nZXRfZGF0YV9sZW5ndGhfZnJvbV9maWxlKHBfZmlsZSkpOworICAgIG9wal9zdHJlYW1fc2V0X3JlYWRfZnVuY3Rpb24obF9zdHJlYW0sIChvcGpfc3RyZWFtX3JlYWRfZm4pIG9wal9yZWFkX2Zyb21fZmlsZSk7CisgICAgb3BqX3N0cmVhbV9zZXRfd3JpdGVfZnVuY3Rpb24obF9zdHJlYW0sIChvcGpfc3RyZWFtX3dyaXRlX2ZuKSBvcGpfd3JpdGVfZnJvbV9maWxlKTsKKyAgICBvcGpfc3RyZWFtX3NldF9za2lwX2Z1bmN0aW9uKGxfc3RyZWFtLCAob3BqX3N0cmVhbV9za2lwX2ZuKSBvcGpfc2tpcF9mcm9tX2ZpbGUpOworICAgIG9wal9zdHJlYW1fc2V0X3NlZWtfZnVuY3Rpb24obF9zdHJlYW0sIChvcGpfc3RyZWFtX3NlZWtfZm4pIG9wal9zZWVrX2Zyb21fZmlsZSk7CisKKyAgICByZXR1cm4gbF9zdHJlYW07Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wZW5qcGVnLmggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wZW5qcGVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3MTY3MgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BlbmpwZWcuaApAQCAtMCwwICsxLDE1NjYgQEAKKyAvKgorICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCisgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFVuaXZlcnNpdGUgY2F0aG9saXF1ZSBkZSBMb3V2YWluIChVQ0wpLCBCZWxnaXVtCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQorICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNywgUGFydmF0aGEgRWxhbmdvdmFuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIEplcm9tZSBGaW1lcywgQ29tbXVuaWNhdGlvbnMgJiBTeXN0ZW1lcyA8amVyb21lLmZpbWVzQGMtcy5mcj4KKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBLYW9yaSBIYWdpaGFyYQorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIENlbnRyZSBOYXRpb25hbCBkJ0V0dWRlcyBTcGF0aWFsZXMgKENORVMpLCBGcmFuY2UgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENTIFN5c3RlbWVzIGQnSW5mb3JtYXRpb24sIEZyYW5jZQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBPUEVOSlBFR19ICisjZGVmaW5lIE9QRU5KUEVHX0gKKworCisvKiAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIENvbXBpbGVyIGRpcmVjdGl2ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKy8qCitUaGUgaW5saW5lIGtleXdvcmQgaXMgc3VwcG9ydGVkIGJ5IEM5OSBidXQgbm90IGJ5IEM5MC4gCitNb3N0IGNvbXBpbGVycyBpbXBsZW1lbnQgdGhlaXIgb3duIHZlcnNpb24gb2YgdGhpcyBrZXl3b3JkIC4uLiAKKyovCisjaWZuZGVmIElOTElORQorCSNpZiBkZWZpbmVkKF9NU0NfVkVSKQorCQkjZGVmaW5lIElOTElORSBfX2ZvcmNlaW5saW5lCisJI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKKwkJI2RlZmluZSBJTkxJTkUgX19pbmxpbmVfXworCSNlbGlmIGRlZmluZWQoX19NV0VSS1NfXykKKwkJI2RlZmluZSBJTkxJTkUgaW5saW5lCisJI2Vsc2UgCisJCS8qIGFkZCBvdGhlciBjb21waWxlcnMgaGVyZSAuLi4gKi8KKwkJI2RlZmluZSBJTkxJTkUgCisJI2VuZGlmIC8qIGRlZmluZWQoPENvbXBpbGVyPikgKi8KKyNlbmRpZiAvKiBJTkxJTkUgKi8KKworLyogZGVwcmVjYXRlZCBhdHRyaWJ1dGUgKi8KKyNpZmRlZiBfX0dOVUNfXworCSNkZWZpbmUgT1BKX0RFUFJFQ0FURUQoZnVuYykgZnVuYyBfX2F0dHJpYnV0ZV9fICgoZGVwcmVjYXRlZCkpCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorCSNkZWZpbmUgT1BKX0RFUFJFQ0FURUQoZnVuYykgX19kZWNsc3BlYyhkZXByZWNhdGVkKSBmdW5jCisjZWxzZQorCSNwcmFnbWEgbWVzc2FnZSgiV0FSTklORzogWW91IG5lZWQgdG8gaW1wbGVtZW50IERFUFJFQ0FURUQgZm9yIHRoaXMgY29tcGlsZXIiKQorCSNkZWZpbmUgT1BKX0RFUFJFQ0FURUQoZnVuYykgZnVuYworI2VuZGlmCisKKyNpZiBkZWZpbmVkKE9QSl9TVEFUSUMpIHx8ICFkZWZpbmVkKF9XSU4zMikKKy8qIGh0dHA6Ly9nY2MuZ251Lm9yZy93aWtpL1Zpc2liaWxpdHkgKi8KKyMJaWYgX19HTlVDX18gPj0gNAorIwkJaWYgZGVmaW5lZChPUEpfU1RBVElDKSAvKiBzdGF0aWMgbGlicmFyeSB1c2VzICJoaWRkZW4iICovCisjCQkJZGVmaW5lIE9QSl9BUEkgICAgX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJoaWRkZW4iKSkpCisjCQllbHNlCisjCQkJZGVmaW5lIE9QSl9BUEkgICAgX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQorIwkJZW5kaWYKKyMJCWRlZmluZSBPUEpfTE9DQUwgIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiaGlkZGVuIikpKQorIwllbHNlCisjCQlkZWZpbmUgT1BKX0FQSQorIwkJZGVmaW5lIE9QSl9MT0NBTAorIwllbmRpZgorIwlkZWZpbmUgT1BKX0NBTExDT05WCisjZWxzZQorIwlkZWZpbmUgT1BKX0NBTExDT05WIF9fc3RkY2FsbAorLyoKK1RoZSBmb2xsb3dpbmcgaWZkZWYgYmxvY2sgaXMgdGhlIHN0YW5kYXJkIHdheSBvZiBjcmVhdGluZyBtYWNyb3Mgd2hpY2ggbWFrZSBleHBvcnRpbmcgCitmcm9tIGEgRExMIHNpbXBsZXIuIEFsbCBmaWxlcyB3aXRoaW4gdGhpcyBETEwgYXJlIGNvbXBpbGVkIHdpdGggdGhlIE9QSl9FWFBPUlRTCitzeW1ib2wgZGVmaW5lZCBvbiB0aGUgY29tbWFuZCBsaW5lLiB0aGlzIHN5bWJvbCBzaG91bGQgbm90IGJlIGRlZmluZWQgb24gYW55IHByb2plY3QKK3RoYXQgdXNlcyB0aGlzIERMTC4gVGhpcyB3YXkgYW55IG90aGVyIHByb2plY3Qgd2hvc2Ugc291cmNlIGZpbGVzIGluY2x1ZGUgdGhpcyBmaWxlIHNlZSAKK09QSl9BUEkgZnVuY3Rpb25zIGFzIGJlaW5nIGltcG9ydGVkIGZyb20gYSBETEwsIHdoZXJlYXMgdGhpcyBETEwgc2VlcyBzeW1ib2xzCitkZWZpbmVkIHdpdGggdGhpcyBtYWNybyBhcyBiZWluZyBleHBvcnRlZC4KKyovCisjCWlmIGRlZmluZWQoT1BKX0VYUE9SVFMpIHx8IGRlZmluZWQoRExMX0VYUE9SVCkKKyMJCWRlZmluZSBPUEpfQVBJIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIwllbHNlCisjCQlkZWZpbmUgT1BKX0FQSSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMJZW5kaWYgLyogT1BKX0VYUE9SVFMgKi8KKyNlbmRpZiAvKiAhT1BKX1NUQVRJQyB8fCAhX1dJTjMyICovCisKK3R5cGVkZWYgaW50IE9QSl9CT09MOworI2RlZmluZSBPUEpfVFJVRSAxCisjZGVmaW5lIE9QSl9GQUxTRSAwCisKK3R5cGVkZWYgY2hhciAgICAgICAgICBPUEpfQ0hBUjsKK3R5cGVkZWYgZmxvYXQgICAgICAgICBPUEpfRkxPQVQzMjsKK3R5cGVkZWYgZG91YmxlICAgICAgICBPUEpfRkxPQVQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBPUEpfQllURTsKKworI2luY2x1ZGUgIm9wal9zdGRpbnQuaCIKKwordHlwZWRlZiBpbnQ4X3QgICBPUEpfSU5UODsKK3R5cGVkZWYgdWludDhfdCAgT1BKX1VJTlQ4OwordHlwZWRlZiBpbnQxNl90ICBPUEpfSU5UMTY7Cit0eXBlZGVmIHVpbnQxNl90IE9QSl9VSU5UMTY7Cit0eXBlZGVmIGludDMyX3QgIE9QSl9JTlQzMjsKK3R5cGVkZWYgdWludDMyX3QgT1BKX1VJTlQzMjsKK3R5cGVkZWYgaW50NjRfdCAgT1BKX0lOVDY0OwordHlwZWRlZiB1aW50NjRfdCBPUEpfVUlOVDY0OworCit0eXBlZGVmIGludDY0X3QgIE9QSl9PRkZfVDsgLyogNjQtYml0IGZpbGUgb2Zmc2V0IHR5cGUgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+Cit0eXBlZGVmIHNpemVfdCAgIE9QSl9TSVpFX1Q7CisKKy8qIEF2b2lkIGNvbXBpbGUtdGltZSB3YXJuaW5nIGJlY2F1c2UgcGFyYW1ldGVyIGlzIG5vdCB1c2VkICovCisjZGVmaW5lIE9QSl9BUkdfTk9UX1VTRUQoeCkgKHZvaWQpKHgpCisKKy8qIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgVXNlZnVsIGNvbnN0YW50IGRlZmluaXRpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjZGVmaW5lIE9QSl9QQVRIX0xFTiA0MDk2IC8qKjwgTWF4aW11bSBhbGxvd2VkIHNpemUgZm9yIGZpbGVuYW1lcyAqLworCisjZGVmaW5lIE9QSl9KMktfTUFYUkxWTFMgMzMJCQkJCS8qKjwgTnVtYmVyIG9mIG1heGltdW0gcmVzb2x1dGlvbiBsZXZlbCBhdXRob3JpemVkICovCisjZGVmaW5lIE9QSl9KMktfTUFYQkFORFMgKDMqT1BKX0oyS19NQVhSTFZMUy0yKQkvKio8IE51bWJlciBvZiBtYXhpbXVtIHN1Yi1iYW5kIGxpbmtlZCB0byBudW1iZXIgb2YgcmVzb2x1dGlvbiBsZXZlbCAqLworCisjZGVmaW5lIE9QSl9KMktfREVGQVVMVF9OQl9TRUdTCQkJCTEwCisjZGVmaW5lIE9QSl9KMktfU1RSRUFNX0NIVU5LX1NJWkUJCQkweDEwMDAwMCAvKiogMSBtZWdhIGJ5IGRlZmF1bHQgKi8KKyNkZWZpbmUgT1BKX0oyS19ERUZBVUxUX0hFQURFUl9TSVpFCQkJMTAwMAorI2RlZmluZSBPUEpfSjJLX01DQ19ERUZBVUxUX05CX1JFQ09SRFMJCTEwCisjZGVmaW5lIE9QSl9KMktfTUNUX0RFRkFVTFRfTkJfUkVDT1JEUwkJMTAKKworLyogVW5pUEc+PiAqLyAvKiBOT1QgWUVUIFVTRUQgSU4gVEhFIFYyIFZFUlNJT04gT0YgT1BFTkpQRUcgKi8KKyNkZWZpbmUgSlBXTF9NQVhfTk9fVElMRVNQRUNTCTE2IC8qKjwgTWF4aW11bSBudW1iZXIgb2YgdGlsZSBwYXJ0cyBleHBlY3RlZCBieSBKUFdMOiBpbmNyZWFzZSBhdCB5b3VyIHdpbGwgKi8KKyNkZWZpbmUgSlBXTF9NQVhfTk9fUEFDS1NQRUNTCTE2IC8qKjwgTWF4aW11bSBudW1iZXIgb2YgcGFja2V0IHBhcnRzIGV4cGVjdGVkIGJ5IEpQV0w6IGluY3JlYXNlIGF0IHlvdXIgd2lsbCAqLworI2RlZmluZSBKUFdMX01BWF9OT19NQVJLRVJTCTUxMiAvKio8IE1heGltdW0gbnVtYmVyIG9mIEpQV0wgbWFya2VyczogaW5jcmVhc2UgYXQgeW91ciB3aWxsICovCisjZGVmaW5lIEpQV0xfUFJJVkFURUlOREVYX05BTUUgImpwd2xfaW5kZXhfcHJpdmF0ZWZpbGVuYW1lIiAvKio8IGluZGV4IGZpbGUgbmFtZSB1c2VkIHdoZW4gSlBXTCBpcyBvbiAqLworI2RlZmluZSBKUFdMX0VYUEVDVEVEX0NPTVBPTkVOVFMgMyAvKio8IEV4cGVjdCB0aGlzIG51bWJlciBvZiBjb21wb25lbnRzLCBzbyB5b3UnbGwgZmluZCBiZXR0ZXIgdGhlIGZpcnN0IEVQQiAqLworI2RlZmluZSBKUFdMX01BWElNVU1fVElMRVMgODE5MiAvKio8IEV4cGVjdCB0aGlzIG1heGltdW0gbnVtYmVyIG9mIHRpbGVzLCB0byBhdm9pZCBzb21lIGNyYXNoZXMgKi8KKyNkZWZpbmUgSlBXTF9NQVhJTVVNX0hBTU1JTkcgMiAvKio8IEV4cGVjdCB0aGlzIG1heGltdW0gbnVtYmVyIG9mIGJpdCBlcnJvcnMgaW4gbWFya2VyIGlkJ3MgKi8KKyNkZWZpbmUgSlBXTF9NQVhJTVVNX0VQQl9ST09NIDY1NDUwIC8qKjwgRXhwZWN0IHRoaXMgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgZm9yIGNvbXBvc2l0aW9uIG9mIEVQQnMgKi8KKy8qIDw8VW5pUEcgKi8KKworLyoqCisgKiBFWFBFUklNRU5UQUwgRk9SIFRIRSBNT01FTlQKKyAqIFN1cHBvcnRlZCBvcHRpb25zIGFib3V0IGZpbGUgaW5mb3JtYXRpb24gdXNlZCBvbmx5IGluIGoya19kdW1wCisqLworI2RlZmluZSBPUEpfSU1HX0lORk8JCTEJLyoqPCBCYXNpYyBpbWFnZSBpbmZvcm1hdGlvbiBwcm92aWRlZCB0byB0aGUgdXNlciAqLworI2RlZmluZSBPUEpfSjJLX01IX0lORk8JCTIJLyoqPCBDb2Rlc3RyZWFtIGluZm9ybWF0aW9uIGJhc2VkIG9ubHkgb24gdGhlIG1haW4gaGVhZGVyICovCisjZGVmaW5lIE9QSl9KMktfVEhfSU5GTwkJNAkvKio8IFRpbGUgaW5mb3JtYXRpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQgdGlsZSBoZWFkZXIgKi8KKyNkZWZpbmUgT1BKX0oyS19UQ0hfSU5GTwk4CS8qKjwgVGlsZS9Db21wb25lbnQgaW5mb3JtYXRpb24gb2YgYWxsIHRpbGVzICovCisjZGVmaW5lIE9QSl9KMktfTUhfSU5ECQkxNgkvKio8IENvZGVzdHJlYW0gaW5kZXggYmFzZWQgb25seSBvbiB0aGUgbWFpbiBoZWFkZXIgKi8KKyNkZWZpbmUgT1BKX0oyS19USF9JTkQJCTMyCS8qKjwgVGlsZSBpbmRleCBiYXNlZCBvbiB0aGUgY3VycmVudCB0aWxlICovCisvKkZJWE1FICNkZWZpbmUgT1BKX0oyS19DU1RSX0lORAk0OCovCS8qKjwgICovCisjZGVmaW5lIE9QSl9KUDJfSU5GTwkJMTI4CS8qKjwgSlAyIGZpbGUgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgT1BKX0pQMl9JTkQJCQkyNTYJLyoqPCBKUDIgZmlsZSBpbmRleCAqLworCisvKioKKyAqIEpQRUcgMjAwMCBQcm9maWxlcywgc2VlIFRhYmxlIEEuMTAgZnJvbSAxNTQ0NC0xICh1cGRhdGVkIGluIHZhcmlvdXMgQU1EKQorICogVGhlc2UgdmFsdWVzIGhlbHAgY2hvc2luZyB0aGUgUlNJWiB2YWx1ZSBmb3IgdGhlIEoySyBjb2Rlc3RyZWFtLgorICogVGhlIFJTSVogdmFsdWUgdHJpZ2dlcnMgdmFyaW91cyBlbmNvZGluZyBvcHRpb25zLCBhcyBkZXRhaWxlZCBpbiBUYWJsZSBBLjEwLgorICogSWYgT1BKX1BST0ZJTEVfUEFSVDIgaXMgY2hvc2VuLCBpdCBoYXMgdG8gYmUgY29tYmluZWQgd2l0aCBvbmUgb3IgbW9yZSBleHRlbnNpb25zCisgKiBkZXNjcmliZWQgaGVyZXVuZGVyLgorICogICBFeGFtcGxlOiByc2l6ID0gT1BKX1BST0ZJTEVfUEFSVDIgfCBPUEpfRVhURU5TSU9OX01DVDsKKyAqIEZvciBicm9hZGNhc3QgcHJvZmlsZXMsIHRoZSBPUEpfUFJPRklMRSB2YWx1ZSBoYXMgdG8gYmUgY29tYmluZWQgd2l0aCB0aGUgdGFyZ2V0ZWQKKyAqIG1haW5sZXZlbCAoMy0wIExTQiwgdmFsdWUgYmV0d2VlbiAwIGFuZCAxMSk6CisgKiAgIEV4YW1wbGU6IHJzaXogPSBPUEpfUFJPRklMRV9CQ19NVUxUSSB8IDB4MDAwNTsgKGhlcmUgbWFpbmxldmVsIDUpCisgKiBGb3IgSU1GIHByb2ZpbGVzLCB0aGUgT1BKX1BST0ZJTEUgdmFsdWUgaGFzIHRvIGJlIGNvbWJpbmVkIHdpdGggdGhlIHRhcmdldGVkIG1haW5sZXZlbAorICogKDMtMCBMU0IsIHZhbHVlIGJldHdlZW4gMCBhbmQgMTEpIGFuZCBzdWJsZXZlbCAoNy00IExTQiwgdmFsdWUgYmV0d2VlbiAwIGFuZCA5KToKKyAqICAgRXhhbXBsZTogcnNpeiA9IE9QSl9QUk9GSUxFX0lNRl8ySyB8IDB4MDA0MCB8IDB4MDAwNTsgKGhlcmUgbWFpbiA1IGFuZCBzdWJsZXZlbCA0KQorICogKi8KKyNkZWZpbmUgT1BKX1BST0ZJTEVfTk9ORSAgICAgICAgMHgwMDAwIC8qKiBubyBwcm9maWxlLCBjb25mb3JtIHRvIDE1NDQ0LTEgKi8KKyNkZWZpbmUgT1BKX1BST0ZJTEVfMCAgICAgICAgICAgMHgwMDAxIC8qKiBQcm9maWxlIDAgYXMgZGVzY3JpYmVkIGluIDE1NDQ0LTEsVGFibGUgQS40NSAqLworI2RlZmluZSBPUEpfUFJPRklMRV8xICAgICAgICAgICAweDAwMDIgLyoqIFByb2ZpbGUgMSBhcyBkZXNjcmliZWQgaW4gMTU0NDQtMSxUYWJsZSBBLjQ1ICovCisjZGVmaW5lIE9QSl9QUk9GSUxFX1BBUlQyICAgICAgIDB4ODAwMCAvKiogQXQgbGVhc3QgMSBleHRlbnNpb24gZGVmaW5lZCBpbiAxNTQ0NC0yIChQYXJ0LTIpICovCisjZGVmaW5lIE9QSl9QUk9GSUxFX0NJTkVNQV8ySyAgIDB4MDAwMyAvKiogMksgY2luZW1hIHByb2ZpbGUgZGVmaW5lZCBpbiAxNTQ0NC0xIEFNRDEgKi8KKyNkZWZpbmUgT1BKX1BST0ZJTEVfQ0lORU1BXzRLICAgMHgwMDA0IC8qKiA0SyBjaW5lbWEgcHJvZmlsZSBkZWZpbmVkIGluIDE1NDQ0LTEgQU1EMSAqLworI2RlZmluZSBPUEpfUFJPRklMRV9DSU5FTUFfUzJLICAweDAwMDUgLyoqIFNjYWxhYmxlIDJLIGNpbmVtYSBwcm9maWxlIGRlZmluZWQgaW4gMTU0NDQtMSBBTUQyICovCisjZGVmaW5lIE9QSl9QUk9GSUxFX0NJTkVNQV9TNEsgIDB4MDAwNiAvKiogU2NhbGFibGUgNEsgY2luZW1hIHByb2ZpbGUgZGVmaW5lZCBpbiAxNTQ0NC0xIEFNRDIgKi8KKyNkZWZpbmUgT1BKX1BST0ZJTEVfQ0lORU1BX0xUUyAgMHgwMDA3IC8qKiBMb25nIHRlcm0gc3RvcmFnZSBjaW5lbWEgcHJvZmlsZSBkZWZpbmVkIGluIDE1NDQ0LTEgQU1EMiAqLworI2RlZmluZSBPUEpfUFJPRklMRV9CQ19TSU5HTEUgICAweDAxMDAgLyoqIFNpbmdsZSBUaWxlIEJyb2FkY2FzdCBwcm9maWxlIGRlZmluZWQgaW4gMTU0NDQtMSBBTUQzICovCisjZGVmaW5lIE9QSl9QUk9GSUxFX0JDX01VTFRJICAgIDB4MDIwMCAvKiogTXVsdGkgVGlsZSBCcm9hZGNhc3QgcHJvZmlsZSBkZWZpbmVkIGluIDE1NDQ0LTEgQU1EMyAqLworI2RlZmluZSBPUEpfUFJPRklMRV9CQ19NVUxUSV9SICAweDAzMDAgLyoqIE11bHRpIFRpbGUgUmV2ZXJzaWJsZSBCcm9hZGNhc3QgcHJvZmlsZSBkZWZpbmVkIGluIDE1NDQ0LTEgQU1EMyAqLworI2RlZmluZSBPUEpfUFJPRklMRV9JTUZfMksgICAgICAweDA0MDAgLyoqIDJLIFNpbmdsZSBUaWxlIExvc3N5IElNRiBwcm9maWxlIGRlZmluZWQgaW4gMTU0NDQtMSBBTUQgOCAqLworI2RlZmluZSBPUEpfUFJPRklMRV9JTUZfNEsgICAgICAweDA0MDEgLyoqIDRLIFNpbmdsZSBUaWxlIExvc3N5IElNRiBwcm9maWxlIGRlZmluZWQgaW4gMTU0NDQtMSBBTUQgOCAqLworI2RlZmluZSBPUEpfUFJPRklMRV9JTUZfOEsgICAgICAweDA0MDIgLyoqIDhLIFNpbmdsZSBUaWxlIExvc3N5IElNRiBwcm9maWxlIGRlZmluZWQgaW4gMTU0NDQtMSBBTUQgOCAqLworI2RlZmluZSBPUEpfUFJPRklMRV9JTUZfMktfUiAgICAweDA0MDMgLyoqIDJLIFNpbmdsZS9NdWx0aSBUaWxlIFJldmVyc2libGUgSU1GIHByb2ZpbGUgZGVmaW5lZCBpbiAxNTQ0NC0xIEFNRCA4ICovCisjZGVmaW5lIE9QSl9QUk9GSUxFX0lNRl80S19SICAgIDB4MDgwMCAvKiogNEsgU2luZ2xlL011bHRpIFRpbGUgUmV2ZXJzaWJsZSBJTUYgcHJvZmlsZSBkZWZpbmVkIGluIDE1NDQ0LTEgQU1EIDggKi8KKyNkZWZpbmUgT1BKX1BST0ZJTEVfSU1GXzhLX1IgICAgMHgwODAxICAvKiogOEsgU2luZ2xlL011bHRpIFRpbGUgUmV2ZXJzaWJsZSBJTUYgcHJvZmlsZSBkZWZpbmVkIGluIDE1NDQ0LTEgQU1EIDggKi8KKworLyoqCisgKiBKUEVHIDIwMDAgUGFydC0yIGV4dGVuc2lvbnMKKyAqICovCisjZGVmaW5lIE9QSl9FWFRFTlNJT05fTk9ORSAgICAgIDB4MDAwMCAvKiogTm8gUGFydC0yIGV4dGVuc2lvbiAqLworI2RlZmluZSBPUEpfRVhURU5TSU9OX01DVCAgICAgICAweDAxMDAgIC8qKiBDdXN0b20gTUNUIHN1cHBvcnQgKi8KKworLyoqCisgKiBKUEVHIDIwMDAgcHJvZmlsZSBtYWNyb3MKKyAqICovCisjZGVmaW5lIE9QSl9JU19DSU5FTUEodikgICAgICgoKHYpID49IE9QSl9QUk9GSUxFX0NJTkVNQV8ySykmJigodikgPD0gT1BKX1BST0ZJTEVfQ0lORU1BX1M0SykpCisjZGVmaW5lIE9QSl9JU19TVE9SQUdFKHYpICAgICgodikgPT0gT1BKX1BST0ZJTEVfQ0lORU1BX0xUUykKKyNkZWZpbmUgT1BKX0lTX0JST0FEQ0FTVCh2KSAgKCgodikgPj0gT1BKX1BST0ZJTEVfQkNfU0lOR0xFKSYmKCh2KSA8PSAoKE9QSl9QUk9GSUxFX0JDX01VTFRJX1IpIHwgKDB4MDAwYikpKSkKKyNkZWZpbmUgT1BKX0lTX0lNRih2KSAgICAgICAgKCgodikgPj0gT1BKX1BST0ZJTEVfSU1GXzJLKSYmKCh2KSA8PSAoKE9QSl9QUk9GSUxFX0lNRl84S19SKSB8ICgweDAwOWIpKSkpCisjZGVmaW5lIE9QSl9JU19QQVJUMih2KSAgICAgICgodikgJiBPUEpfUFJPRklMRV9QQVJUMikKKworLyoqCisgKiBKUEVHIDIwMDAgY29kZXN0cmVhbSBhbmQgY29tcG9uZW50IHNpemUgbGltaXRzIGluIGNpbmVtYSBwcm9maWxlcworICogKi8KKyNkZWZpbmUgT1BKX0NJTkVNQV8yNF9DUyAgICAgMTMwMjA4MyAgIAkvKiogTWF4aW11bSBjb2Rlc3RyZWFtIGxlbmd0aCBmb3IgMjRmcHMgKi8KKyNkZWZpbmUgT1BKX0NJTkVNQV80OF9DUyAgICAgNjUxMDQxICAgICAvKiogTWF4aW11bSBjb2Rlc3RyZWFtIGxlbmd0aCBmb3IgNDhmcHMgKi8KKyNkZWZpbmUgT1BKX0NJTkVNQV8yNF9DT01QICAgMTA0MTY2NiAgICAvKiogTWF4aW11bSBzaXplIHBlciBjb2xvciBjb21wb25lbnQgZm9yIDJLICYgNEsgQCAyNGZwcyAqLworI2RlZmluZSBPUEpfQ0lORU1BXzQ4X0NPTVAgICA1MjA4MzMJCS8qKiBNYXhpbXVtIHNpemUgcGVyIGNvbG9yIGNvbXBvbmVudCBmb3IgMksgQCA0OGZwcyAqLworCisvKiAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIGVudW0gZGVmaW5pdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKy8qKgorICogREVQUkVDQVRFRDogdXNlIFJTSVosIE9QSl9QUk9GSUxFXyogYW5kIE9QSl9FWFRFTlNJT05fKiBpbnN0ZWFkCisgKiBSc2l6IENhcGFiaWxpdGllcworICogKi8KK3R5cGVkZWYgZW51bSBSU0laX0NBUEFCSUxJVElFUyB7CisgICAgT1BKX1NURF9SU0laID0gMCwJCS8qKiBTdGFuZGFyZCBKUEVHMjAwMCBwcm9maWxlKi8KKyAgICBPUEpfQ0lORU1BMksgPSAzLAkJLyoqIFByb2ZpbGUgbmFtZSBmb3IgYSAySyBpbWFnZSovCisgICAgT1BKX0NJTkVNQTRLID0gNCwJCS8qKiBQcm9maWxlIG5hbWUgZm9yIGEgNEsgaW1hZ2UqLworICAgIE9QSl9NQ1QgPSAweDgxMDAKK30gT1BKX1JTSVpfQ0FQQUJJTElUSUVTOworCisvKioKKyAqIERFUFJFQ0FURUQ6IHVzZSBSU0laLCBPUEpfUFJPRklMRV8qIGFuZCBPUEpfRVhURU5TSU9OXyogaW5zdGVhZAorICogRGlnaXRhbCBjaW5lbWEgb3BlcmF0aW9uIG1vZGUKKyAqICovCit0eXBlZGVmIGVudW0gQ0lORU1BX01PREUgeworICAgIE9QSl9PRkYgPSAwLAkJCS8qKiBOb3QgRGlnaXRhbCBDaW5lbWEqLworICAgIE9QSl9DSU5FTUEyS18yNCA9IDEsCS8qKiAySyBEaWdpdGFsIENpbmVtYSBhdCAyNCBmcHMqLworICAgIE9QSl9DSU5FTUEyS180OCA9IDIsCS8qKiAySyBEaWdpdGFsIENpbmVtYSBhdCA0OCBmcHMqLworICAgIE9QSl9DSU5FTUE0S18yNCA9IDMJCS8qKiA0SyBEaWdpdGFsIENpbmVtYSBhdCAyNCBmcHMqLworfU9QSl9DSU5FTUFfTU9ERTsKKworLyoqIAorICogUHJvZ3Jlc3Npb24gb3JkZXIKKyAqICovCit0eXBlZGVmIGVudW0gUFJPR19PUkRFUiB7CisJT1BKX1BST0dfVU5LTk9XTiA9IC0xLAkvKio8IHBsYWNlLWhvbGRlciAqLworCU9QSl9MUkNQID0gMCwJCQkvKio8IGxheWVyLXJlc29sdXRpb24tY29tcG9uZW50LXByZWNpbmN0IG9yZGVyICovCisJT1BKX1JMQ1AgPSAxLAkJCS8qKjwgcmVzb2x1dGlvbi1sYXllci1jb21wb25lbnQtcHJlY2luY3Qgb3JkZXIgKi8KKwlPUEpfUlBDTCA9IDIsCQkJLyoqPCByZXNvbHV0aW9uLXByZWNpbmN0LWNvbXBvbmVudC1sYXllciBvcmRlciAqLworCU9QSl9QQ1JMID0gMywJCQkvKio8IHByZWNpbmN0LWNvbXBvbmVudC1yZXNvbHV0aW9uLWxheWVyIG9yZGVyICovCisJT1BKX0NQUkwgPSA0CQkJLyoqPCBjb21wb25lbnQtcHJlY2luY3QtcmVzb2x1dGlvbi1sYXllciBvcmRlciAqLworfSBPUEpfUFJPR19PUkRFUjsKKworLyoqCisgKiBTdXBwb3J0ZWQgaW1hZ2UgY29sb3Igc3BhY2VzCisqLwordHlwZWRlZiBlbnVtIENPTE9SX1NQQUNFIHsKKyAgICBPUEpfQ0xSU1BDX1VOS05PV04gPSAtMSwJLyoqPCBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBsaWJyYXJ5ICovCisgICAgT1BKX0NMUlNQQ19VTlNQRUNJRklFRCA9IDAsCS8qKjwgbm90IHNwZWNpZmllZCBpbiB0aGUgY29kZXN0cmVhbSAqLworICAgIE9QSl9DTFJTUENfU1JHQiA9IDEsCQkvKio8IHNSR0IgKi8KKyAgICBPUEpfQ0xSU1BDX0dSQVkgPSAyLAkJLyoqPCBncmF5c2NhbGUgKi8KKyAgICBPUEpfQ0xSU1BDX1NZQ0MgPSAzLAkJLyoqPCBZVVYgKi8KKyAgICBPUEpfQ0xSU1BDX0VZQ0MgPSA0LCAgICAgICAgLyoqPCBlLVlDQyAqLworICAgIE9QSl9DTFJTUENfQ01ZSyA9IDUgICAgICAgICAvKio8IENNWUsgKi8KK30gT1BKX0NPTE9SX1NQQUNFOworCisvKioKKyAqIFN1cHBvcnRlZCBjb2RlYworKi8KK3R5cGVkZWYgZW51bSBDT0RFQ19GT1JNQVQgeworCU9QSl9DT0RFQ19VTktOT1dOID0gLTEsCS8qKjwgcGxhY2UtaG9sZGVyICovCisJT1BKX0NPREVDX0oySyAgPSAwLAkJLyoqPCBKUEVHLTIwMDAgY29kZXN0cmVhbSA6IHJlYWQvd3JpdGUgKi8KKwlPUEpfQ09ERUNfSlBUICA9IDEsCQkvKio8IEpQVC1zdHJlYW0gKEpQRUcgMjAwMCwgSlBJUCkgOiByZWFkIG9ubHkgKi8KKyAgICBPUEpfQ09ERUNfSlAyICA9IDIsCQkvKio8IEpQMiBmaWxlIGZvcm1hdCA6IHJlYWQvd3JpdGUgKi8KKyAgICBPUEpfQ09ERUNfSlBQICA9IDMsCQkvKio8IEpQUC1zdHJlYW0gKEpQRUcgMjAwMCwgSlBJUCkgOiB0byBiZSBjb2RlZCAqLworICAgIE9QSl9DT0RFQ19KUFggID0gNAkJLyoqPCBKUFggZmlsZSBmb3JtYXQgKEpQRUcgMjAwMCBQYXJ0LTIpIDogdG8gYmUgY29kZWQgKi8KK30gT1BKX0NPREVDX0ZPUk1BVDsKKworCisvKiAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIGV2ZW50IG1hbmFnZXIgdHlwZWRlZiBkZWZpbml0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworLyoqCisgKiBDYWxsYmFjayBmdW5jdGlvbiBwcm90b3R5cGUgZm9yIGV2ZW50cworICogQHBhcmFtIG1zZyAgICAgICAgICAgICAgIEV2ZW50IG1lc3NhZ2UKKyAqIEBwYXJhbSBjbGllbnRfZGF0YSAgICAgICBDbGllbnQgb2JqZWN0IHdoZXJlIHdpbGwgYmUgcmV0dXJuIHRoZSBldmVudCBtZXNzYWdlIAorICogKi8KK3R5cGVkZWYgdm9pZCAoKm9wal9tc2dfY2FsbGJhY2spIChjb25zdCBjaGFyICptc2csIHZvaWQgKmNsaWVudF9kYXRhKTsKKworLyogCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBjb2RlYyB0eXBlZGVmIGRlZmluaXRpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisvKioKKyAqIFByb2dyZXNzaW9uIG9yZGVyIGNoYW5nZXMKKyAqIAorICovCit0eXBlZGVmIHN0cnVjdCBvcGpfcG9jIHsKKwkvKiogUmVzb2x1dGlvbiBudW0gc3RhcnQsIENvbXBvbmVudCBudW0gc3RhcnQsIGdpdmVuIGJ5IFBPQyAqLworCU9QSl9VSU5UMzIgcmVzbm8wLCBjb21wbm8wOworCS8qKiBMYXllciBudW0gZW5kLFJlc29sdXRpb24gbnVtIGVuZCwgQ29tcG9uZW50IG51bSBlbmQsIGdpdmVuIGJ5IFBPQyAqLworCU9QSl9VSU5UMzIgbGF5bm8xLCByZXNubzEsIGNvbXBubzE7CisJLyoqIExheWVyIG51bSBzdGFydCxQcmVjaW5jdCBudW0gc3RhcnQsIFByZWNpbmN0IG51bSBlbmQgKi8KKwlPUEpfVUlOVDMyIGxheW5vMCwgcHJlY25vMCwgcHJlY25vMTsKKwkvKiogUHJvZ3Jlc3Npb24gb3JkZXIgZW51bSovCisJT1BKX1BST0dfT1JERVIgcHJnMSxwcmc7CisJLyoqIFByb2dyZXNzaW9uIG9yZGVyIHN0cmluZyovCisJT1BKX0NIQVIgcHJvZ29yZGVyWzVdOworCS8qKiBUaWxlIG51bWJlciAqLworCU9QSl9VSU5UMzIgdGlsZTsKKwkvKiogU3RhcnQgYW5kIGVuZCB2YWx1ZXMgZm9yIFRpbGUgd2lkdGggYW5kIGhlaWdodCovCisJT1BKX0lOVDMyIHR4MCx0eDEsdHkwLHR5MTsKKwkvKiogU3RhcnQgdmFsdWUsIGluaXRpYWxpc2VkIGluIHBpX2luaXRpYWxpc2VfZW5jb2RlKi8KKwlPUEpfVUlOVDMyIGxheVMsIHJlc1MsIGNvbXBTLCBwcmNTOworCS8qKiBFbmQgdmFsdWUsIGluaXRpYWxpc2VkIGluIHBpX2luaXRpYWxpc2VfZW5jb2RlICovCisJT1BKX1VJTlQzMiBsYXlFLCByZXNFLCBjb21wRSwgcHJjRTsKKwkvKiogU3RhcnQgYW5kIGVuZCB2YWx1ZXMgb2YgVGlsZSB3aWR0aCBhbmQgaGVpZ2h0LCBpbml0aWFsaXNlZCBpbiBwaV9pbml0aWFsaXNlX2VuY29kZSovCisJT1BKX1VJTlQzMiB0eFMsdHhFLHR5Uyx0eUUsZHgsZHk7CisJLyoqIFRlbXBvcmFyeSB2YWx1ZXMgZm9yIFRpbGUgcGFydHMsIGluaXRpYWxpc2VkIGluIHBpX2NyZWF0ZV9lbmNvZGUgKi8KKwlPUEpfVUlOVDMyIGxheV90LCByZXNfdCwgY29tcF90LCBwcmNfdCx0eDBfdCx0eTBfdDsKK30gb3BqX3BvY190OworCisvKioKKyAqIENvbXByZXNzaW9uIHBhcmFtZXRlcnMKKyAqICovCit0eXBlZGVmIHN0cnVjdCBvcGpfY3BhcmFtZXRlcnMgeworCS8qKiBzaXplIG9mIHRpbGU6IHRpbGVfc2l6ZV9vbiA9IGZhbHNlIChub3QgaW4gYXJndW1lbnQpIG9yID0gdHJ1ZSAoaW4gYXJndW1lbnQpICovCisJT1BKX0JPT0wgdGlsZV9zaXplX29uOworCS8qKiBYVE9zaXogKi8KKwlpbnQgY3BfdHgwOworCS8qKiBZVE9zaXogKi8KKwlpbnQgY3BfdHkwOworCS8qKiBYVHNpeiAqLworCWludCBjcF90ZHg7CisJLyoqIFlUc2l6ICovCisJaW50IGNwX3RkeTsKKwkvKiogYWxsb2NhdGlvbiBieSByYXRlL2Rpc3RvcnRpb24gKi8KKwlpbnQgY3BfZGlzdG9fYWxsb2M7CisJLyoqIGFsbG9jYXRpb24gYnkgZml4ZWQgbGF5ZXIgKi8KKwlpbnQgY3BfZml4ZWRfYWxsb2M7CisJLyoqIGFkZCBmaXhlZF9xdWFsaXR5ICovCisJaW50IGNwX2ZpeGVkX3F1YWxpdHk7CisJLyoqIGZpeGVkIGxheWVyICovCisJaW50ICpjcF9tYXRyaWNlOworCS8qKiBjb21tZW50IGZvciBjb2RpbmcgKi8KKwljaGFyICpjcF9jb21tZW50OworCS8qKiBjc3R5IDogY29kaW5nIHN0eWxlICovCisJaW50IGNzdHk7CisJLyoqIHByb2dyZXNzaW9uIG9yZGVyIChkZWZhdWx0IE9QSl9MUkNQKSAqLworCU9QSl9QUk9HX09SREVSIHByb2dfb3JkZXI7CisJLyoqIHByb2dyZXNzaW9uIG9yZGVyIGNoYW5nZXMgKi8KKwlvcGpfcG9jX3QgUE9DWzMyXTsKKwkvKiogbnVtYmVyIG9mIHByb2dyZXNzaW9uIG9yZGVyIGNoYW5nZXMgKFBPQyksIGRlZmF1bHQgdG8gMCAqLworCU9QSl9VSU5UMzIgbnVtcG9jczsKKwkvKiogbnVtYmVyIG9mIGxheWVycyAqLworCWludCB0Y3BfbnVtbGF5ZXJzOworICAgIC8qKiByYXRlcyBvZiBsYXllcnMgLSBtaWdodCBiZSBzdWJzZXF1ZW50bHkgbGltaXRlZCBieSB0aGUgbWF4X2NzX3NpemUgZmllbGQgKi8KKwlmbG9hdCB0Y3BfcmF0ZXNbMTAwXTsKKwkvKiogZGlmZmVyZW50IHBzbnIgZm9yIHN1Y2Nlc3NpdmUgbGF5ZXJzICovCisJZmxvYXQgdGNwX2Rpc3RvcmF0aW9bMTAwXTsKKwkvKiogbnVtYmVyIG9mIHJlc29sdXRpb25zICovCisJaW50IG51bXJlc29sdXRpb247CisJLyoqIGluaXRpYWwgY29kZSBibG9jayB3aWR0aCwgZGVmYXVsdCB0byA2NCAqLworIAlpbnQgY2Jsb2Nrd19pbml0OworCS8qKiBpbml0aWFsIGNvZGUgYmxvY2sgaGVpZ2h0LCBkZWZhdWx0IHRvIDY0ICovCisJaW50IGNibG9ja2hfaW5pdDsKKwkvKiogbW9kZSBzd2l0Y2ggKGNibGtfc3R5bGUpICovCisJaW50IG1vZGU7CisJLyoqIDEgOiB1c2UgdGhlIGlycmV2ZXJzaWJsZSBEV1QgOS03LCAwIDogdXNlIGxvc3NsZXNzIGNvbXByZXNzaW9uIChkZWZhdWx0KSAqLworCWludCBpcnJldmVyc2libGU7CisJLyoqIHJlZ2lvbiBvZiBpbnRlcmVzdDogYWZmZWN0ZWQgY29tcG9uZW50IGluIFswLi4zXSwgLTEgbWVhbnMgbm8gUk9JICovCisJaW50IHJvaV9jb21wbm87CisJLyoqIHJlZ2lvbiBvZiBpbnRlcmVzdDogdXBzaGlmdCB2YWx1ZSAqLworCWludCByb2lfc2hpZnQ7CisJLyogbnVtYmVyIG9mIHByZWNpbmN0IHNpemUgc3BlY2lmaWNhdGlvbnMgKi8KKwlpbnQgcmVzX3NwZWM7CisJLyoqIGluaXRpYWwgcHJlY2luY3Qgd2lkdGggKi8KKwlpbnQgcHJjd19pbml0W09QSl9KMktfTUFYUkxWTFNdOworCS8qKiBpbml0aWFsIHByZWNpbmN0IGhlaWdodCAqLworCWludCBwcmNoX2luaXRbT1BKX0oyS19NQVhSTFZMU107CisKKwkvKipAbmFtZSBjb21tYW5kIGxpbmUgZW5jb2RlciBwYXJhbWV0ZXJzIChub3QgdXNlZCBpbnNpZGUgdGhlIGxpYnJhcnkpICovCisJLypAeyovCisJLyoqIGlucHV0IGZpbGUgbmFtZSAqLworCWNoYXIgaW5maWxlW09QSl9QQVRIX0xFTl07CisJLyoqIG91dHB1dCBmaWxlIG5hbWUgKi8KKwljaGFyIG91dGZpbGVbT1BKX1BBVEhfTEVOXTsKKwkvKiogREVQUkVDQVRFRC4gSW5kZXggZ2VuZXJhdGlvbiBpcyBub3cgaGFuZGVsZCB3aXRoIHRoZSBvcGpfZW5jb2RlX3dpdGhfaW5mbygpIGZ1bmN0aW9uLiBTZXQgdG8gTlVMTCAqLworCWludCBpbmRleF9vbjsKKwkvKiogREVQUkVDQVRFRC4gSW5kZXggZ2VuZXJhdGlvbiBpcyBub3cgaGFuZGVsZCB3aXRoIHRoZSBvcGpfZW5jb2RlX3dpdGhfaW5mbygpIGZ1bmN0aW9uLiBTZXQgdG8gTlVMTCAqLworCWNoYXIgaW5kZXhbT1BKX1BBVEhfTEVOXTsKKwkvKiogc3ViaW1hZ2UgZW5jb2Rpbmc6IG9yaWdpbiBpbWFnZSBvZmZzZXQgaW4geCBkaXJlY3Rpb24gKi8KKwlpbnQgaW1hZ2Vfb2Zmc2V0X3gwOworCS8qKiBzdWJpbWFnZSBlbmNvZGluZzogb3JpZ2luIGltYWdlIG9mZnNldCBpbiB5IGRpcmVjdGlvbiAqLworCWludCBpbWFnZV9vZmZzZXRfeTA7CisJLyoqIHN1YnNhbXBsaW5nIHZhbHVlIGZvciBkeCAqLworCWludCBzdWJzYW1wbGluZ19keDsKKwkvKiogc3Vic2FtcGxpbmcgdmFsdWUgZm9yIGR5ICovCisJaW50IHN1YnNhbXBsaW5nX2R5OworCS8qKiBpbnB1dCBmaWxlIGZvcm1hdCAwOiBQR1gsIDE6IFB4TSwgMjogQk1QIDM6VElGKi8KKwlpbnQgZGVjb2RfZm9ybWF0OworCS8qKiBvdXRwdXQgZmlsZSBmb3JtYXQgMDogSjJLLCAxOiBKUDIsIDI6IEpQVCAqLworCWludCBjb2RfZm9ybWF0OworCS8qQH0qLworCisvKiBVbmlQRz4+ICovIC8qIE5PVCBZRVQgVVNFRCBJTiBUSEUgVjIgVkVSU0lPTiBPRiBPUEVOSlBFRyAqLworCS8qKkBuYW1lIEpQV0wgZW5jb2RpbmcgcGFyYW1ldGVycyAqLworCS8qQHsqLworCS8qKiBlbmFibGVzIHdyaXRpbmcgb2YgRVBDIGluIE1ILCB0aHVzIGFjdGl2YXRpbmcgSlBXTCAqLworCU9QSl9CT09MIGpwd2xfZXBjX29uOworCS8qKiBlcnJvciBwcm90ZWN0aW9uIG1ldGhvZCBmb3IgTUggKDAsMSwxNiwzMiwzNy0xMjgpICovCisJaW50IGpwd2xfaHByb3RfTUg7CisJLyoqIHRpbGUgbnVtYmVyIG9mIGhlYWRlciBwcm90ZWN0aW9uIHNwZWNpZmljYXRpb24gKD49MCkgKi8KKwlpbnQganB3bF9ocHJvdF9UUEhfdGlsZW5vW0pQV0xfTUFYX05PX1RJTEVTUEVDU107CisJLyoqIGVycm9yIHByb3RlY3Rpb24gbWV0aG9kcyBmb3IgVFBIcyAoMCwxLDE2LDMyLDM3LTEyOCkgKi8KKwlpbnQganB3bF9ocHJvdF9UUEhbSlBXTF9NQVhfTk9fVElMRVNQRUNTXTsKKwkvKiogdGlsZSBudW1iZXIgb2YgcGFja2V0IHByb3RlY3Rpb24gc3BlY2lmaWNhdGlvbiAoPj0wKSAqLworCWludCBqcHdsX3Bwcm90X3RpbGVub1tKUFdMX01BWF9OT19QQUNLU1BFQ1NdOworCS8qKiBwYWNrZXQgbnVtYmVyIG9mIHBhY2tldCBwcm90ZWN0aW9uIHNwZWNpZmljYXRpb24gKD49MCkgKi8KKwlpbnQganB3bF9wcHJvdF9wYWNrbm9bSlBXTF9NQVhfTk9fUEFDS1NQRUNTXTsKKwkvKiogZXJyb3IgcHJvdGVjdGlvbiBtZXRob2RzIGZvciBwYWNrZXRzICgwLDEsMTYsMzIsMzctMTI4KSAqLworCWludCBqcHdsX3Bwcm90W0pQV0xfTUFYX05PX1BBQ0tTUEVDU107CisJLyoqIGVuYWJsZXMgd3JpdGluZyBvZiBFU0QsICgwPW5vLzEvMiBieXRlcykgKi8KKwlpbnQganB3bF9zZW5zX3NpemU7CisJLyoqIHNlbnNpdGl2aXR5IGFkZHJlc3Npbmcgc2l6ZSAoMD1hdXRvLzIvNCBieXRlcykgKi8KKwlpbnQganB3bF9zZW5zX2FkZHI7CisJLyoqIHNlbnNpdGl2aXR5IHJhbmdlICgwLTMpICovCisJaW50IGpwd2xfc2Vuc19yYW5nZTsKKwkvKiogc2Vuc2l0aXZpdHkgbWV0aG9kIGZvciBNSCAoLTE9bm8sMC03KSAqLworCWludCBqcHdsX3NlbnNfTUg7CisJLyoqIHRpbGUgbnVtYmVyIG9mIHNlbnNpdGl2aXR5IHNwZWNpZmljYXRpb24gKD49MCkgKi8KKwlpbnQganB3bF9zZW5zX1RQSF90aWxlbm9bSlBXTF9NQVhfTk9fVElMRVNQRUNTXTsKKwkvKiogc2Vuc2l0aXZpdHkgbWV0aG9kcyBmb3IgVFBIcyAoLTE9bm8sMC03KSAqLworCWludCBqcHdsX3NlbnNfVFBIW0pQV0xfTUFYX05PX1RJTEVTUEVDU107CisJLypAfSovCisvKiA8PFVuaVBHICovCisKKyAgICAvKioKKyAgICAgKiBERVBSRUNBVEVEOiB1c2UgUlNJWiwgT1BKX1BST0ZJTEVfKiBhbmQgTUFYX0NPTVBfU0laRSBpbnN0ZWFkCisgICAgICogRGlnaXRhbCBDaW5lbWEgY29tcGxpYW5jZSAwLW5vdCBjb21wbGlhbnQsIDEtY29tcGxpYW50CisgICAgICogKi8KKyAgICBPUEpfQ0lORU1BX01PREUgY3BfY2luZW1hOworICAgIC8qKgorICAgICAqIE1heGltdW0gc2l6ZSAoaW4gYnl0ZXMpIGZvciBlYWNoIGNvbXBvbmVudC4KKyAgICAgKiBJZiA9PSAwLCBjb21wb25lbnQgc2l6ZSBsaW1pdGF0aW9uIGlzIG5vdCBjb25zaWRlcmVkCisgICAgICogKi8KKwlpbnQgbWF4X2NvbXBfc2l6ZTsKKyAgICAvKioKKyAgICAgKiBERVBSRUNBVEVEOiB1c2UgUlNJWiwgT1BKX1BST0ZJTEVfKiBhbmQgT1BKX0VYVEVOU0lPTl8qIGluc3RlYWQKKyAgICAgKiBQcm9maWxlIG5hbWUKKyAgICAgKiAqLworICAgIE9QSl9SU0laX0NBUEFCSUxJVElFUyBjcF9yc2l6OworCS8qKiBUaWxlIHBhcnQgZ2VuZXJhdGlvbiovCisJY2hhciB0cF9vbjsKKwkvKiogRmxhZyBmb3IgVGlsZSBwYXJ0IGdlbmVyYXRpb24qLworCWNoYXIgdHBfZmxhZzsKKwkvKiogTUNUIChtdWx0aXBsZSBjb21wb25lbnQgdHJhbnNmb3JtKSAqLworCWNoYXIgdGNwX21jdDsKKwkvKiogRW5hYmxlIEpQSVAgaW5kZXhpbmcqLworCU9QSl9CT09MIGpwaXBfb247CisJLyoqIE5haXZlIGltcGxlbWVudGF0aW9uIG9mIE1DVCByZXN0cmljdGVkIHRvIGEgc2luZ2xlIHJldmVyc2libGUgYXJyYXkgYmFzZWQgCisgICAgICAgIGVuY29kaW5nIHdpdGhvdXQgb2Zmc2V0IGNvbmNlcm5pbmcgYWxsIHRoZSBjb21wb25lbnRzLiAqLworCXZvaWQgKiBtY3RfZGF0YTsKKyAgICAvKioKKyAgICAgKiBNYXhpbXVtIHNpemUgKGluIGJ5dGVzKSBmb3IgdGhlIHdob2xlIGNvZGVzdHJlYW0uCisgICAgICogSWYgPT0gMCwgY29kZXN0cmVhbSBzaXplIGxpbWl0YXRpb24gaXMgbm90IGNvbnNpZGVyZWQKKyAgICAgKiBJZiBpdCBkb2VzIG5vdCBjb21wbHkgd2l0aCB0Y3BfcmF0ZXMsIG1heF9jc19zaXplIHByZXZhaWxzCisgICAgICogYW5kIGEgd2FybmluZyBpcyBpc3N1ZWQuCisgICAgICogKi8KKyAgICBpbnQgbWF4X2NzX3NpemU7CisgICAgLyoqIFJTSVogdmFsdWUKKyAgICAgICAgVG8gYmUgdXNlZCB0byBjb21iaW5lIE9QSl9QUk9GSUxFXyosIE9QSl9FWFRFTlNJT05fKiBhbmQgKHN1YilsZXZlbHMgdmFsdWVzLiAqLworICAgIE9QSl9VSU5UMTYgcnNpejsKK30gb3BqX2NwYXJhbWV0ZXJzX3Q7ICAKKworI2RlZmluZSBPUEpfRFBBUkFNRVRFUlNfSUdOT1JFX1BDTFJfQ01BUF9DREVGX0ZMQUcJMHgwMDAxCisKKy8qKgorICogRGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzCisgKiAqLwordHlwZWRlZiBzdHJ1Y3Qgb3BqX2RwYXJhbWV0ZXJzIHsKKwkvKiogCisJU2V0IHRoZSBudW1iZXIgb2YgaGlnaGVzdCByZXNvbHV0aW9uIGxldmVscyB0byBiZSBkaXNjYXJkZWQuIAorCVRoZSBpbWFnZSByZXNvbHV0aW9uIGlzIGVmZmVjdGl2ZWx5IGRpdmlkZWQgYnkgMiB0byB0aGUgcG93ZXIgb2YgdGhlIG51bWJlciBvZiBkaXNjYXJkZWQgbGV2ZWxzLiAKKwlUaGUgcmVkdWNlIGZhY3RvciBpcyBsaW1pdGVkIGJ5IHRoZSBzbWFsbGVzdCB0b3RhbCBudW1iZXIgb2YgZGVjb21wb3NpdGlvbiBsZXZlbHMgYW1vbmcgdGlsZXMuCisJaWYgIT0gMCwgdGhlbiBvcmlnaW5hbCBkaW1lbnNpb24gZGl2aWRlZCBieSAyXihyZWR1Y2UpOyAKKwlpZiA9PSAwIG9yIG5vdCB1c2VkLCBpbWFnZSBpcyBkZWNvZGVkIHRvIHRoZSBmdWxsIHJlc29sdXRpb24gCisJKi8KKwlPUEpfVUlOVDMyIGNwX3JlZHVjZTsKKwkvKiogCisJU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBxdWFsaXR5IGxheWVycyB0byBkZWNvZGUuIAorCUlmIHRoZXJlIGFyZSBsZXNzIHF1YWxpdHkgbGF5ZXJzIHRoYW4gdGhlIHNwZWNpZmllZCBudW1iZXIsIGFsbCB0aGUgcXVhbGl0eSBsYXllcnMgYXJlIGRlY29kZWQuCisJaWYgIT0gMCwgdGhlbiBvbmx5IHRoZSBmaXJzdCAibGF5ZXIiIGxheWVycyBhcmUgZGVjb2RlZDsgCisJaWYgPT0gMCBvciBub3QgdXNlZCwgYWxsIHRoZSBxdWFsaXR5IGxheWVycyBhcmUgZGVjb2RlZCAKKwkqLworCU9QSl9VSU5UMzIgY3BfbGF5ZXI7CisKKwkvKipAbmFtZSBjb21tYW5kIGxpbmUgZGVjb2RlciBwYXJhbWV0ZXJzIChub3QgdXNlZCBpbnNpZGUgdGhlIGxpYnJhcnkpICovCisJLypAeyovCisJLyoqIGlucHV0IGZpbGUgbmFtZSAqLworCWNoYXIgaW5maWxlW09QSl9QQVRIX0xFTl07CisJLyoqIG91dHB1dCBmaWxlIG5hbWUgKi8KKwljaGFyIG91dGZpbGVbT1BKX1BBVEhfTEVOXTsKKwkvKiogaW5wdXQgZmlsZSBmb3JtYXQgMDogSjJLLCAxOiBKUDIsIDI6IEpQVCAqLworCWludCBkZWNvZF9mb3JtYXQ7CisJLyoqIG91dHB1dCBmaWxlIGZvcm1hdCAwOiBQR1gsIDE6IFB4TSwgMjogQk1QICovCisJaW50IGNvZF9mb3JtYXQ7CisKKwkvKiogRGVjb2RpbmcgYXJlYSBsZWZ0IGJvdW5kYXJ5ICovCisJT1BKX1VJTlQzMiBEQV94MDsKKwkvKiogRGVjb2RpbmcgYXJlYSByaWdodCBib3VuZGFyeSAqLworCU9QSl9VSU5UMzIgREFfeDE7CisJLyoqIERlY29kaW5nIGFyZWEgdXAgYm91bmRhcnkgKi8KKwlPUEpfVUlOVDMyIERBX3kwOworCS8qKiBEZWNvZGluZyBhcmVhIGJvdHRvbSBib3VuZGFyeSAqLworCU9QSl9VSU5UMzIgREFfeTE7CisJLyoqIFZlcmJvc2UgbW9kZSAqLworCU9QSl9CT09MIG1fdmVyYm9zZTsKKworCS8qKiB0aWxlIG51bWJlciBvdCB0aGUgZGVjb2RlZCB0aWxlKi8KKwlPUEpfVUlOVDMyIHRpbGVfaW5kZXg7CisJLyoqIE5iIG9mIHRpbGUgdG8gZGVjb2RlICovCisJT1BKX1VJTlQzMiBuYl90aWxlX3RvX2RlY29kZTsKKworCS8qQH0qLworCisvKiBVbmlQRz4+ICovIC8qIE5PVCBZRVQgVVNFRCBJTiBUSEUgVjIgVkVSU0lPTiBPRiBPUEVOSlBFRyAqLworCS8qKkBuYW1lIEpQV0wgZGVjb2RpbmcgcGFyYW1ldGVycyAqLworCS8qQHsqLworCS8qKiBhY3RpdmF0ZXMgdGhlIEpQV0wgY29ycmVjdGlvbiBjYXBhYmlsaXRpZXMgKi8KKwlPUEpfQk9PTCBqcHdsX2NvcnJlY3Q7CisJLyoqIGV4cGVjdGVkIG51bWJlciBvZiBjb21wb25lbnRzICovCisJaW50IGpwd2xfZXhwX2NvbXBzOworCS8qKiBtYXhpbXVtIG51bWJlciBvZiB0aWxlcyAqLworCWludCBqcHdsX21heF90aWxlczsKKwkvKkB9Ki8KKy8qIDw8VW5pUEcgKi8KKworCXVuc2lnbmVkIGludCBmbGFnczsKKworfSBvcGpfZHBhcmFtZXRlcnNfdDsKKworCisvKioKKyAqIEpQRUcyMDAwIGNvZGVjIFYyLgorICogKi8KK3R5cGVkZWYgdm9pZCAqIG9wal9jb2RlY190OworCisvKiAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIEkvTyBzdHJlYW0gdHlwZWRlZiBkZWZpbml0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworLyoqCisgKiBTdHJlYW0gb3BlbiBmbGFncy4KKyAqICovCisvKiogVGhlIHN0cmVhbSB3YXMgb3BlbmVkIGZvciByZWFkaW5nLiAqLworI2RlZmluZSBPUEpfU1RSRUFNX1JFQUQJT1BKX1RSVUUKKy8qKiBUaGUgc3RyZWFtIHdhcyBvcGVuZWQgZm9yIHdyaXRpbmcuICovCisjZGVmaW5lIE9QSl9TVFJFQU1fV1JJVEUgT1BKX0ZBTFNFCisKKy8qCisgKiBDYWxsYmFjayBmdW5jdGlvbiBwcm90b3R5cGUgZm9yIHJlYWQgZnVuY3Rpb24KKyAqLwordHlwZWRlZiBPUEpfU0laRV9UICgqIG9wal9zdHJlYW1fcmVhZF9mbikgKHZvaWQgKiBwX2J1ZmZlciwgT1BKX1NJWkVfVCBwX25iX2J5dGVzLCB2b2lkICogcF91c2VyX2RhdGEpIDsKKworLyoKKyAqIENhbGxiYWNrIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3Igd3JpdGUgZnVuY3Rpb24KKyAqLwordHlwZWRlZiBPUEpfU0laRV9UICgqIG9wal9zdHJlYW1fd3JpdGVfZm4pICh2b2lkICogcF9idWZmZXIsIE9QSl9TSVpFX1QgcF9uYl9ieXRlcywgdm9pZCAqIHBfdXNlcl9kYXRhKSA7CisKKy8qCisgKiBDYWxsYmFjayBmdW5jdGlvbiBwcm90b3R5cGUgZm9yIHNraXAgZnVuY3Rpb24KKyAqLwordHlwZWRlZiBPUEpfT0ZGX1QgKCogb3BqX3N0cmVhbV9za2lwX2ZuKSAoT1BKX09GRl9UIHBfbmJfYnl0ZXMsIHZvaWQgKiBwX3VzZXJfZGF0YSkgOworCisvKgorICogQ2FsbGJhY2sgZnVuY3Rpb24gcHJvdG90eXBlIGZvciBzZWVrIGZ1bmN0aW9uCisgKi8KK3R5cGVkZWYgT1BKX0JPT0wgKCogb3BqX3N0cmVhbV9zZWVrX2ZuKSAoT1BKX09GRl9UIHBfbmJfYnl0ZXMsIHZvaWQgKiBwX3VzZXJfZGF0YSkgOworCisvKgorICogQ2FsbGJhY2sgZnVuY3Rpb24gcHJvdG90eXBlIGZvciBmcmVlIHVzZXIgZGF0YSBmdW5jdGlvbgorICovCit0eXBlZGVmIHZvaWQgKCogb3BqX3N0cmVhbV9mcmVlX3VzZXJfZGF0YV9mbikgKHZvaWQgKiBwX3VzZXJfZGF0YSkgOworCisvKgorICogSlBFRzIwMDAgU3RyZWFtLgorICovCit0eXBlZGVmIHZvaWQgKiBvcGpfc3RyZWFtX3Q7CisKKy8qIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgaW1hZ2UgdHlwZWRlZiBkZWZpbml0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworLyoqCisgKiBEZWZpbmVzIGEgc2luZ2xlIGltYWdlIGNvbXBvbmVudAorICogKi8KK3R5cGVkZWYgc3RydWN0IG9wal9pbWFnZV9jb21wIHsKKwkvKiogWFJzaXo6IGhvcml6b250YWwgc2VwYXJhdGlvbiBvZiBhIHNhbXBsZSBvZiBpdGggY29tcG9uZW50IHdpdGggcmVzcGVjdCB0byB0aGUgcmVmZXJlbmNlIGdyaWQgKi8KKwlPUEpfVUlOVDMyIGR4OworCS8qKiBZUnNpejogdmVydGljYWwgc2VwYXJhdGlvbiBvZiBhIHNhbXBsZSBvZiBpdGggY29tcG9uZW50IHdpdGggcmVzcGVjdCB0byB0aGUgcmVmZXJlbmNlIGdyaWQgKi8KKwlPUEpfVUlOVDMyIGR5OworCS8qKiBkYXRhIHdpZHRoICovCisJT1BKX1VJTlQzMiB3OworCS8qKiBkYXRhIGhlaWdodCAqLworCU9QSl9VSU5UMzIgaDsKKwkvKiogeCBjb21wb25lbnQgb2Zmc2V0IGNvbXBhcmVkIHRvIHRoZSB3aG9sZSBpbWFnZSAqLworCU9QSl9VSU5UMzIgeDA7CisJLyoqIHkgY29tcG9uZW50IG9mZnNldCBjb21wYXJlZCB0byB0aGUgd2hvbGUgaW1hZ2UgKi8KKwlPUEpfVUlOVDMyIHkwOworCS8qKiBwcmVjaXNpb24gKi8KKwlPUEpfVUlOVDMyIHByZWM7CisJLyoqIGltYWdlIGRlcHRoIGluIGJpdHMgKi8KKwlPUEpfVUlOVDMyIGJwcDsKKwkvKiogc2lnbmVkICgxKSAvIHVuc2lnbmVkICgwKSAqLworCU9QSl9VSU5UMzIgc2duZDsKKwkvKiogbnVtYmVyIG9mIGRlY29kZWQgcmVzb2x1dGlvbiAqLworCU9QSl9VSU5UMzIgcmVzbm9fZGVjb2RlZDsKKwkvKiogbnVtYmVyIG9mIGRpdmlzaW9uIGJ5IDIgb2YgdGhlIG91dCBpbWFnZSBjb21wYXJlZCB0byB0aGUgb3JpZ2luYWwgc2l6ZSBvZiBpbWFnZSAqLworCU9QSl9VSU5UMzIgZmFjdG9yOworCS8qKiBpbWFnZSBjb21wb25lbnQgZGF0YSAqLworCU9QSl9JTlQzMiAqZGF0YTsKKyAgLyoqIGFscGhhIGNoYW5uZWwgKi8KKyAgT1BKX1VJTlQxNiBhbHBoYTsKK30gb3BqX2ltYWdlX2NvbXBfdDsKKworLyoqIAorICogRGVmaW5lcyBpbWFnZSBkYXRhIGFuZCBjaGFyYWN0ZXJpc3RpY3MKKyAqICovCit0eXBlZGVmIHN0cnVjdCBvcGpfaW1hZ2UgeworCS8qKiBYT3NpejogaG9yaXpvbnRhbCBvZmZzZXQgZnJvbSB0aGUgb3JpZ2luIG9mIHRoZSByZWZlcmVuY2UgZ3JpZCB0byB0aGUgbGVmdCBzaWRlIG9mIHRoZSBpbWFnZSBhcmVhICovCisJT1BKX1VJTlQzMiB4MDsKKwkvKiogWU9zaXo6IHZlcnRpY2FsIG9mZnNldCBmcm9tIHRoZSBvcmlnaW4gb2YgdGhlIHJlZmVyZW5jZSBncmlkIHRvIHRoZSB0b3Agc2lkZSBvZiB0aGUgaW1hZ2UgYXJlYSAqLworCU9QSl9VSU5UMzIgeTA7CisJLyoqIFhzaXo6IHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgZ3JpZCAqLworCU9QSl9VSU5UMzIgeDE7CisJLyoqIFlzaXo6IGhlaWdodCBvZiB0aGUgcmVmZXJlbmNlIGdyaWQgKi8KKwlPUEpfVUlOVDMyIHkxOworCS8qKiBudW1iZXIgb2YgY29tcG9uZW50cyBpbiB0aGUgaW1hZ2UgKi8KKwlPUEpfVUlOVDMyIG51bWNvbXBzOworCS8qKiBjb2xvciBzcGFjZTogc1JHQiwgR3JleXNjYWxlIG9yIFlVViAqLworCU9QSl9DT0xPUl9TUEFDRSBjb2xvcl9zcGFjZTsKKwkvKiogaW1hZ2UgY29tcG9uZW50cyAqLworCW9wal9pbWFnZV9jb21wX3QgKmNvbXBzOworCS8qKiAncmVzdHJpY3RlZCcgSUNDIHByb2ZpbGUgKi8KKwlPUEpfQllURSAqaWNjX3Byb2ZpbGVfYnVmOworCS8qKiBzaXplIG9mIElDQyBwcm9maWxlICovCisJT1BKX1VJTlQzMiBpY2NfcHJvZmlsZV9sZW47CisKKwkvKiogV2hldGhlciB0byBhcHBseSBQQ0xSIG9yIG5vdCAqLworCU9QSl9CT09MIHBkZml1bV91c2VfY29sb3JzcGFjZTsKK30gb3BqX2ltYWdlX3Q7CisKKworLyoqCisgKiBDb21wb25lbnQgcGFyYW1ldGVycyBzdHJ1Y3R1cmUgdXNlZCBieSB0aGUgb3BqX2ltYWdlX2NyZWF0ZSBmdW5jdGlvbgorICogKi8KK3R5cGVkZWYgc3RydWN0IG9wal9pbWFnZV9jb21wdHBhcm0geworCS8qKiBYUnNpejogaG9yaXpvbnRhbCBzZXBhcmF0aW9uIG9mIGEgc2FtcGxlIG9mIGl0aCBjb21wb25lbnQgd2l0aCByZXNwZWN0IHRvIHRoZSByZWZlcmVuY2UgZ3JpZCAqLworCU9QSl9VSU5UMzIgZHg7CisJLyoqIFlSc2l6OiB2ZXJ0aWNhbCBzZXBhcmF0aW9uIG9mIGEgc2FtcGxlIG9mIGl0aCBjb21wb25lbnQgd2l0aCByZXNwZWN0IHRvIHRoZSByZWZlcmVuY2UgZ3JpZCAqLworCU9QSl9VSU5UMzIgZHk7CisJLyoqIGRhdGEgd2lkdGggKi8KKwlPUEpfVUlOVDMyIHc7CisJLyoqIGRhdGEgaGVpZ2h0ICovCisJT1BKX1VJTlQzMiBoOworCS8qKiB4IGNvbXBvbmVudCBvZmZzZXQgY29tcGFyZWQgdG8gdGhlIHdob2xlIGltYWdlICovCisJT1BKX1VJTlQzMiB4MDsKKwkvKiogeSBjb21wb25lbnQgb2Zmc2V0IGNvbXBhcmVkIHRvIHRoZSB3aG9sZSBpbWFnZSAqLworCU9QSl9VSU5UMzIgeTA7CisJLyoqIHByZWNpc2lvbiAqLworCU9QSl9VSU5UMzIgcHJlYzsKKwkvKiogaW1hZ2UgZGVwdGggaW4gYml0cyAqLworCU9QSl9VSU5UMzIgYnBwOworCS8qKiBzaWduZWQgKDEpIC8gdW5zaWduZWQgKDApICovCisJT1BKX1VJTlQzMiBzZ25kOworfSBvcGpfaW1hZ2VfY21wdHBhcm1fdDsKKworCisvKiAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIEluZm9ybWF0aW9uIG9uIHRoZSBKUEVHIDIwMDAgY29kZXN0cmVhbQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKy8qIFFVSVRFIEVYUEVSSU1FTlRBTCBGT1IgVEhFIE1PTUVOVCAqLworCisvKioKKyAqIEluZGV4IHN0cnVjdHVyZSA6IEluZm9ybWF0aW9uIGNvbmNlcm5pbmcgYSBwYWNrZXQgaW5zaWRlIHRpbGUKKyAqICovCit0eXBlZGVmIHN0cnVjdCBvcGpfcGFja2V0X2luZm8geworCS8qKiBwYWNrZXQgc3RhcnQgcG9zaXRpb24gKGluY2x1ZGluZyBTT1AgbWFya2VyIGlmIGl0IGV4aXN0cykgKi8KKwlPUEpfT0ZGX1Qgc3RhcnRfcG9zOworCS8qKiBlbmQgb2YgcGFja2V0IGhlYWRlciBwb3NpdGlvbiAoaW5jbHVkaW5nIEVQSCBtYXJrZXIgaWYgaXQgZXhpc3RzKSovCisJT1BKX09GRl9UIGVuZF9waF9wb3M7CisJLyoqIHBhY2tldCBlbmQgcG9zaXRpb24gKi8KKwlPUEpfT0ZGX1QgZW5kX3BvczsKKwkvKiogcGFja2V0IGRpc3RvcnNpb24gKi8KKwlkb3VibGUgZGlzdG87Cit9IG9wal9wYWNrZXRfaW5mb190OworCisKKy8qIFVuaVBHPj4gKi8KKy8qKgorICogTWFya2VyIHN0cnVjdHVyZQorICogKi8KK3R5cGVkZWYgc3RydWN0IG9wal9tYXJrZXJfaW5mbyB7CisJLyoqIG1hcmtlciB0eXBlICovCisJdW5zaWduZWQgc2hvcnQgaW50IHR5cGU7CisJLyoqIHBvc2l0aW9uIGluIGNvZGVzdHJlYW0gKi8KKwlPUEpfT0ZGX1QgcG9zOworCS8qKiBsZW5ndGgsIG1hcmtlciB2YWwgaW5jbHVkZWQgKi8KKwlpbnQgbGVuOworfSBvcGpfbWFya2VyX2luZm9fdDsKKy8qIDw8VW5pUEcgKi8KKworLyoqCisgKiBJbmRleCBzdHJ1Y3R1cmUgOiBJbmZvcm1hdGlvbiBjb25jZXJuaW5nIHRpbGUtcGFydHMKKyovCit0eXBlZGVmIHN0cnVjdCBvcGpfdHBfaW5mbyB7CisJLyoqIHN0YXJ0IHBvc2l0aW9uIG9mIHRpbGUgcGFydCAqLworCWludCB0cF9zdGFydF9wb3M7CisJLyoqIGVuZCBwb3NpdGlvbiBvZiB0aWxlIHBhcnQgaGVhZGVyICovCisJaW50IHRwX2VuZF9oZWFkZXI7CisJLyoqIGVuZCBwb3NpdGlvbiBvZiB0aWxlIHBhcnQgKi8KKwlpbnQgdHBfZW5kX3BvczsKKwkvKiogc3RhcnQgcGFja2V0IG9mIHRpbGUgcGFydCAqLworCWludCB0cF9zdGFydF9wYWNrOworCS8qKiBudW1iZXIgb2YgcGFja2V0cyBvZiB0aWxlIHBhcnQgKi8KKwlpbnQgdHBfbnVtcGFja3M7Cit9IG9wal90cF9pbmZvX3Q7CisKKy8qKgorICogSW5kZXggc3RydWN0dXJlIDogaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRpbGVzCisqLwordHlwZWRlZiBzdHJ1Y3Qgb3BqX3RpbGVfaW5mbyB7CisJLyoqIHZhbHVlIG9mIHRocmVzaCBmb3IgZWFjaCBsYXllciBieSB0aWxlIGNmci4gTWFyY2VsYSAgICovCisJZG91YmxlICp0aHJlc2g7CisJLyoqIG51bWJlciBvZiB0aWxlICovCisJaW50IHRpbGVubzsKKwkvKiogc3RhcnQgcG9zaXRpb24gKi8KKwlpbnQgc3RhcnRfcG9zOworCS8qKiBlbmQgcG9zaXRpb24gb2YgdGhlIGhlYWRlciAqLworCWludCBlbmRfaGVhZGVyOworCS8qKiBlbmQgcG9zaXRpb24gKi8KKwlpbnQgZW5kX3BvczsKKwkvKiogcHJlY2luY3QgbnVtYmVyIGZvciBlYWNoIHJlc29sdXRpb24gbGV2ZWwgKHdpZHRoKSAqLworCWludCBwd1szM107CisJLyoqIHByZWNpbmN0IG51bWJlciBmb3IgZWFjaCByZXNvbHV0aW9uIGxldmVsIChoZWlnaHQpICovCisJaW50IHBoWzMzXTsKKwkvKiogcHJlY2luY3Qgc2l6ZSAoaW4gcG93ZXIgb2YgMiksIGluIFggZm9yIGVhY2ggcmVzb2x1dGlvbiBsZXZlbCAqLworCWludCBwZHhbMzNdOworCS8qKiBwcmVjaW5jdCBzaXplIChpbiBwb3dlciBvZiAyKSwgaW4gWSBmb3IgZWFjaCByZXNvbHV0aW9uIGxldmVsICovCisJaW50IHBkeVszM107CisJLyoqIGluZm9ybWF0aW9uIGNvbmNlcm5pbmcgcGFja2V0cyBpbnNpZGUgdGlsZSAqLworCW9wal9wYWNrZXRfaW5mb190ICpwYWNrZXQ7CisJLyoqIGFkZCBmaXhlZF9xdWFsaXR5ICovCisJaW50IG51bXBpeDsKKwkvKiogYWRkIGZpeGVkX3F1YWxpdHkgKi8KKwlkb3VibGUgZGlzdG90aWxlOworICAJLyoqIG51bWJlciBvZiBtYXJrZXJzICovCisJaW50IG1hcmtudW07CisJLyoqIGxpc3Qgb2YgbWFya2VycyAqLworCW9wal9tYXJrZXJfaW5mb190ICptYXJrZXI7CisJLyoqIGFjdHVhbCBzaXplIG9mIG1hcmtlcnMgYXJyYXkgKi8KKwlpbnQgbWF4bWFya251bTsKKwkvKiogbnVtYmVyIG9mIHRpbGUgcGFydHMgKi8KKwlpbnQgbnVtX3RwczsKKwkvKiogaW5mb3JtYXRpb24gY29uY2VybmluZyB0aWxlIHBhcnRzICovCisJb3BqX3RwX2luZm9fdCAqdHA7Cit9IG9wal90aWxlX2luZm9fdDsKKworLyoqCisgKiBJbmRleCBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGVzdHJlYW0KKyovCit0eXBlZGVmIHN0cnVjdCBvcGpfY29kZXN0cmVhbV9pbmZvIHsKKwkvKiogbWF4aW11bSBkaXN0b3J0aW9uIHJlZHVjdGlvbiBvbiB0aGUgd2hvbGUgaW1hZ2UgKGFkZCBmb3IgTWFyY2VsYSkgKi8KKwlkb3VibGUgRF9tYXg7CisJLyoqIHBhY2tldCBudW1iZXIgKi8KKwlpbnQgcGFja25vOworCS8qKiB3cml0aW5nIHRoZSBwYWNrZXQgaW4gdGhlIGluZGV4IHdpdGggdDJfZW5jb2RlX3BhY2tldHMgKi8KKwlpbnQgaW5kZXhfd3JpdGU7CisJLyoqIGltYWdlIHdpZHRoICovCisJaW50IGltYWdlX3c7CisJLyoqIGltYWdlIGhlaWdodCAqLworCWludCBpbWFnZV9oOworCS8qKiBwcm9ncmVzc2lvbiBvcmRlciAqLworCU9QSl9QUk9HX09SREVSIHByb2c7CisJLyoqIHRpbGUgc2l6ZSBpbiB4ICovCisJaW50IHRpbGVfeDsKKwkvKiogdGlsZSBzaXplIGluIHkgKi8KKwlpbnQgdGlsZV95OworCS8qKiAqLworCWludCB0aWxlX094OworCS8qKiAqLworCWludCB0aWxlX095OworCS8qKiBudW1iZXIgb2YgdGlsZXMgaW4gWCAqLworCWludCB0dzsKKwkvKiogbnVtYmVyIG9mIHRpbGVzIGluIFkgKi8KKwlpbnQgdGg7CisJLyoqIGNvbXBvbmVudCBudW1iZXJzICovCisJaW50IG51bWNvbXBzOworCS8qKiBudW1iZXIgb2YgbGF5ZXIgKi8KKwlpbnQgbnVtbGF5ZXJzOworCS8qKiBudW1iZXIgb2YgZGVjb21wb3NpdGlvbiBmb3IgZWFjaCBjb21wb25lbnQgKi8KKwlpbnQgKm51bWRlY29tcG9zOworLyogVW5pUEc+PiAqLworCS8qKiBudW1iZXIgb2YgbWFya2VycyAqLworCWludCBtYXJrbnVtOworCS8qKiBsaXN0IG9mIG1hcmtlcnMgKi8KKwlvcGpfbWFya2VyX2luZm9fdCAqbWFya2VyOworCS8qKiBhY3R1YWwgc2l6ZSBvZiBtYXJrZXJzIGFycmF5ICovCisJaW50IG1heG1hcmtudW07CisvKiA8PFVuaVBHICovCisJLyoqIG1haW4gaGVhZGVyIHBvc2l0aW9uICovCisJaW50IG1haW5faGVhZF9zdGFydDsKKwkvKiogbWFpbiBoZWFkZXIgcG9zaXRpb24gKi8KKwlpbnQgbWFpbl9oZWFkX2VuZDsKKwkvKiogY29kZXN0cmVhbSdzIHNpemUgKi8KKwlpbnQgY29kZXN0cmVhbV9zaXplOworCS8qKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGlsZXMgaW5zaWRlIGltYWdlICovCisJb3BqX3RpbGVfaW5mb190ICp0aWxlOworfSBvcGpfY29kZXN0cmVhbV9pbmZvX3Q7CisKKy8qIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogbmV3IG91dHB1dCBtYW5hZ2VtZW50IG9mIHRoZSBjb2Rlc3RyZWFtIGluZm9ybWF0aW9uIGFuZCBpbmRleCAqLworCisvKioKKyAqIFRpbGUtY29tcG9uZW50IGNvZGluZyBwYXJhbWV0ZXJzIGluZm9ybWF0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IG9wal90Y2NwX2luZm8KK3sKKwkvKiogY29tcG9uZW50IGluZGV4ICovCisJT1BKX1VJTlQzMiBjb21wbm87CisJLyoqIGNvZGluZyBzdHlsZSAqLworCU9QSl9VSU5UMzIgY3N0eTsKKwkvKiogbnVtYmVyIG9mIHJlc29sdXRpb25zICovCisJT1BKX1VJTlQzMiBudW1yZXNvbHV0aW9uczsKKwkvKiogY29kZS1ibG9ja3Mgd2lkdGggKi8KKwlPUEpfVUlOVDMyIGNibGt3OworCS8qKiBjb2RlLWJsb2NrcyBoZWlnaHQgKi8KKwlPUEpfVUlOVDMyIGNibGtoOworCS8qKiBjb2RlLWJsb2NrIGNvZGluZyBzdHlsZSAqLworCU9QSl9VSU5UMzIgY2Jsa3N0eTsKKwkvKiogZGlzY3JldGUgd2F2ZWxldCB0cmFuc2Zvcm0gaWRlbnRpZmllciAqLworCU9QSl9VSU5UMzIgcW1mYmlkOworCS8qKiBxdWFudGlzYXRpb24gc3R5bGUgKi8KKwlPUEpfVUlOVDMyIHFudHN0eTsKKwkvKiogc3RlcHNpemVzIHVzZWQgZm9yIHF1YW50aXphdGlvbiAqLworCU9QSl9VSU5UMzIgc3RlcHNpemVzX21hbnRbT1BKX0oyS19NQVhCQU5EU107CisJLyoqIHN0ZXBzaXplcyB1c2VkIGZvciBxdWFudGl6YXRpb24gKi8KKwlPUEpfVUlOVDMyIHN0ZXBzaXplc19leHBuW09QSl9KMktfTUFYQkFORFNdOworCS8qKiBudW1iZXIgb2YgZ3VhcmQgYml0cyAqLworCU9QSl9VSU5UMzIgbnVtZ2JpdHM7CisJLyoqIFJlZ2lvbiBPZiBJbnRlcmVzdCBzaGlmdCAqLworCU9QSl9JTlQzMiByb2lzaGlmdDsKKwkvKiogcHJlY2luY3Qgd2lkdGggKi8KKwlPUEpfVUlOVDMyIHByY3dbT1BKX0oyS19NQVhSTFZMU107CisJLyoqIHByZWNpbmN0IGhlaWdodCAqLworCU9QSl9VSU5UMzIgcHJjaFtPUEpfSjJLX01BWFJMVkxTXTsKK30KK29wal90Y2NwX2luZm9fdDsKKworLyoqCisgKiBUaWxlIGNvZGluZyBwYXJhbWV0ZXJzIGluZm9ybWF0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IG9wal90aWxlX3YyX2luZm8geworCisJLyoqIG51bWJlciAoaW5kZXgpIG9mIHRpbGUgKi8KKwlpbnQgdGlsZW5vOworCS8qKiBjb2Rpbmcgc3R5bGUgKi8KKwlPUEpfVUlOVDMyIGNzdHk7CisJLyoqIHByb2dyZXNzaW9uIG9yZGVyICovCisJT1BKX1BST0dfT1JERVIgcHJnOworCS8qKiBudW1iZXIgb2YgbGF5ZXJzICovCisJT1BKX1VJTlQzMiBudW1sYXllcnM7CisJLyoqIG11bHRpLWNvbXBvbmVudCB0cmFuc2Zvcm0gaWRlbnRpZmllciAqLworCU9QSl9VSU5UMzIgbWN0OworCisJLyoqIGluZm9ybWF0aW9uIGNvbmNlcm5pbmcgdGlsZSBjb21wb25lbnQgcGFyYW1ldGVycyovCisJb3BqX3RjY3BfaW5mb190ICp0Y2NwX2luZm87CisKK30gb3BqX3RpbGVfaW5mb192Ml90OworCisvKioKKyAqIEluZm9ybWF0aW9uIHN0cnVjdHVyZSBhYm91dCB0aGUgY29kZXN0cmVhbSAoRklYTUUgc2hvdWxkIGJlIGV4cGFuZCBhbmQgZW5oYW5jZSkKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgb3BqX2NvZGVzdHJlYW1faW5mb192MiB7CisJLyogVGlsZSBpbmZvICovCisJLyoqIHRpbGUgb3JpZ2luIGluIHggPSBYVE9zaXogKi8KKwlPUEpfVUlOVDMyIHR4MDsKKwkvKiogdGlsZSBvcmlnaW4gaW4geSA9IFlUT3NpeiAqLworCU9QSl9VSU5UMzIgdHkwOworCS8qKiB0aWxlIHNpemUgaW4geCA9IFhUc2l6ICovCisJT1BKX1VJTlQzMiB0ZHg7CisJLyoqIHRpbGUgc2l6ZSBpbiB5ID0gWVRzaXogKi8KKwlPUEpfVUlOVDMyIHRkeTsKKwkvKiogbnVtYmVyIG9mIHRpbGVzIGluIFggKi8KKwlPUEpfVUlOVDMyIHR3OworCS8qKiBudW1iZXIgb2YgdGlsZXMgaW4gWSAqLworCU9QSl9VSU5UMzIgdGg7CisKKwkvKiogbnVtYmVyIG9mIGNvbXBvbmVudHMqLworCU9QSl9VSU5UMzIgbmJjb21wczsKKworCS8qKiBEZWZhdWx0IGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aWxlcyBpbnNpZGUgaW1hZ2UgKi8KKwlvcGpfdGlsZV9pbmZvX3YyX3QgbV9kZWZhdWx0X3RpbGVfaW5mbzsKKworCS8qKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGlsZXMgaW5zaWRlIGltYWdlICovCisJb3BqX3RpbGVfaW5mb192Ml90ICp0aWxlX2luZm87IC8qIEZJWE1FIG5vdCB1c2VkIGZvciB0aGUgbW9tZW50ICovCisKK30gb3BqX2NvZGVzdHJlYW1faW5mb192Ml90OworCisKKy8qKgorICogSW5kZXggc3RydWN0dXJlIGFib3V0IGEgdGlsZSBwYXJ0CisgKi8KK3R5cGVkZWYgc3RydWN0IG9wal90cF9pbmRleCB7CisJLyoqIHN0YXJ0IHBvc2l0aW9uICovCisJT1BKX09GRl9UIHN0YXJ0X3BvczsKKwkvKiogZW5kIHBvc2l0aW9uIG9mIHRoZSBoZWFkZXIgKi8KKwlPUEpfT0ZGX1QgZW5kX2hlYWRlcjsKKwkvKiogZW5kIHBvc2l0aW9uICovCisJT1BKX09GRl9UIGVuZF9wb3M7CisKK30gb3BqX3RwX2luZGV4X3Q7CisKKy8qKgorICogSW5kZXggc3RydWN0dXJlIGFib3V0IGEgdGlsZQorICovCit0eXBlZGVmIHN0cnVjdCBvcGpfdGlsZV9pbmRleCB7CisJLyoqIHRpbGUgaW5kZXggKi8KKwlPUEpfVUlOVDMyIHRpbGVubzsKKworCS8qKiBudW1iZXIgb2YgdGlsZSBwYXJ0cyAqLworCU9QSl9VSU5UMzIgbmJfdHBzOworCS8qKiBjdXJyZW50IG5iIG9mIHRpbGUgcGFydCAoYWxsb2NhdGVkKSovCisJT1BKX1VJTlQzMiBjdXJyZW50X25iX3RwczsKKwkvKiogY3VycmVudCB0aWxlLXBhcnQgaW5kZXggKi8KKwlPUEpfVUlOVDMyIGN1cnJlbnRfdHBzbm87CisJLyoqIGluZm9ybWF0aW9uIGNvbmNlcm5pbmcgdGlsZSBwYXJ0cyAqLworCW9wal90cF9pbmRleF90ICp0cF9pbmRleDsKKworCS8qIFVuaVBHPj4gKi8gLyogTk9UIFVTRUQgRk9SIFRIRSBNT01FTlQgSU4gVEhFIFYyIFZFUlNJT04gKi8KKwkJLyoqIG51bWJlciBvZiBtYXJrZXJzICovCisJCU9QSl9VSU5UMzIgbWFya251bTsKKwkJLyoqIGxpc3Qgb2YgbWFya2VycyAqLworCQlvcGpfbWFya2VyX2luZm9fdCAqbWFya2VyOworCQkvKiogYWN0dWFsIHNpemUgb2YgbWFya2VycyBhcnJheSAqLworCQlPUEpfVUlOVDMyIG1heG1hcmtudW07CisJLyogPDxVbmlQRyAqLworCisJLyoqIHBhY2tldCBudW1iZXIgKi8KKwlPUEpfVUlOVDMyIG5iX3BhY2tldDsKKwkvKiogaW5mb3JtYXRpb24gY29uY2VybmluZyBwYWNrZXRzIGluc2lkZSB0aWxlICovCisJb3BqX3BhY2tldF9pbmZvX3QgKnBhY2tldF9pbmRleDsKKworfSBvcGpfdGlsZV9pbmRleF90OworCisvKioKKyAqIEluZGV4IHN0cnVjdHVyZSBvZiB0aGUgY29kZXN0cmVhbSAoRklYTUUgc2hvdWxkIGJlIGV4cGFuZCBhbmQgZW5oYW5jZSkKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgb3BqX2NvZGVzdHJlYW1faW5kZXggeworCS8qKiBtYWluIGhlYWRlciBzdGFydCBwb3NpdGlvbiAoU09DIHBvc2l0aW9uKSAqLworCU9QSl9PRkZfVCBtYWluX2hlYWRfc3RhcnQ7CisJLyoqIG1haW4gaGVhZGVyIGVuZCBwb3NpdGlvbiAoZmlyc3QgU09UIHBvc2l0aW9uKSAqLworCU9QSl9PRkZfVCBtYWluX2hlYWRfZW5kOworCisJLyoqIGNvZGVzdHJlYW0ncyBzaXplICovCisJT1BKX1VJTlQ2NCBjb2Rlc3RyZWFtX3NpemU7CisKKy8qIFVuaVBHPj4gKi8gLyogTk9UIFVTRUQgRk9SIFRIRSBNT01FTlQgSU4gVEhFIFYyIFZFUlNJT04gKi8KKwkvKiogbnVtYmVyIG9mIG1hcmtlcnMgKi8KKwlPUEpfVUlOVDMyIG1hcmtudW07CisJLyoqIGxpc3Qgb2YgbWFya2VycyAqLworCW9wal9tYXJrZXJfaW5mb190ICptYXJrZXI7CisJLyoqIGFjdHVhbCBzaXplIG9mIG1hcmtlcnMgYXJyYXkgKi8KKwlPUEpfVUlOVDMyIG1heG1hcmtudW07CisvKiA8PFVuaVBHICovCisKKwkvKiogKi8KKwlPUEpfVUlOVDMyIG5iX29mX3RpbGVzOworCS8qKiAqLworCW9wal90aWxlX2luZGV4X3QgKnRpbGVfaW5kZXg7IC8qIEZJWE1FIG5vdCB1c2VkIGZvciB0aGUgbW9tZW50ICovCisKK31vcGpfY29kZXN0cmVhbV9pbmRleF90OworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+ICovCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBNZXRhZGF0YSBmcm9tIHRoZSBKUDJmaWxlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisvKioKKyAqIEluZm8gc3RydWN0dXJlIG9mIHRoZSBKUDIgZmlsZQorICogRVhQRVJJTUVOVEFMIEZPUiBUSEUgTU9NRU5UCisgKi8KK3R5cGVkZWYgc3RydWN0IG9wal9qcDJfbWV0YWRhdGEgeworCS8qKiAqLworCU9QSl9JTlQzMglub3RfdXNlZDsKKworfSBvcGpfanAyX21ldGFkYXRhX3Q7CisKKy8qKgorICogSW5kZXggc3RydWN0dXJlIG9mIHRoZSBKUDIgZmlsZQorICogRVhQRVJJTUVOVEFMIEZPUiBUSEUgTU9NRU5UCisgKi8KK3R5cGVkZWYgc3RydWN0IG9wal9qcDJfaW5kZXggeworCS8qKiAqLworCU9QSl9JTlQzMglub3RfdXNlZDsKKworfSBvcGpfanAyX2luZGV4X3Q7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgb3BlbmpwZWcgdmVyc2lvbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworLyogR2V0IHRoZSB2ZXJzaW9uIG9mIHRoZSBvcGVuanBlZyBsaWJyYXJ5Ki8KK09QSl9BUEkgY29uc3QgY2hhciAqIE9QSl9DQUxMQ09OViBvcGpfdmVyc2lvbih2b2lkKTsKKworLyogCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBpbWFnZSBmdW5jdGlvbnMgZGVmaW5pdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKy8qKgorICogQ3JlYXRlIGFuIGltYWdlCisgKgorICogQHBhcmFtIG51bWNtcHRzICAgICAgbnVtYmVyIG9mIGNvbXBvbmVudHMKKyAqIEBwYXJhbSBjbXB0cGFybXMgICAgIGNvbXBvbmVudHMgcGFyYW1ldGVycworICogQHBhcmFtIGNscnNwYyAgICAgICAgaW1hZ2UgY29sb3Igc3BhY2UKKyAqIEByZXR1cm4gcmV0dXJucyAgICAgIGEgbmV3IGltYWdlIHN0cnVjdHVyZSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIE5VTEwgb3RoZXJ3aXNlCisgKiAqLworT1BKX0FQSSBvcGpfaW1hZ2VfdCogT1BKX0NBTExDT05WIG9wal9pbWFnZV9jcmVhdGUoT1BKX1VJTlQzMiBudW1jbXB0cywgb3BqX2ltYWdlX2NtcHRwYXJtX3QgKmNtcHRwYXJtcywgT1BKX0NPTE9SX1NQQUNFIGNscnNwYyk7CisKKy8qKgorICogRGVhbGxvY2F0ZSBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhbiBpbWFnZQorICoKKyAqIEBwYXJhbSBpbWFnZSAgICAgICAgIGltYWdlIHRvIGJlIGRlc3Ryb3llZAorICovCitPUEpfQVBJIHZvaWQgT1BKX0NBTExDT05WIG9wal9pbWFnZV9kZXN0cm95KG9wal9pbWFnZV90ICppbWFnZSk7CisKKy8qKgorICogQ3JlYXRlcyBhbiBpbWFnZSB3aXRob3V0IGFsbG9jYXRpbmcgbWVtb3J5IGZvciB0aGUgaW1hZ2UgKHVzZWQgaW4gdGhlIG5ldyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5KS4KKyAqCisgKiBAcGFyYW0JbnVtY21wdHMgICAgdGhlIG51bWJlciBvZiBjb21wb25lbnRzCisgKiBAcGFyYW0JY21wdHBhcm1zICAgdGhlIGNvbXBvbmVudHMgcGFyYW1ldGVycworICogQHBhcmFtCWNscnNwYyAgICAgIHRoZSBpbWFnZSBjb2xvciBzcGFjZQorICoKKyAqIEByZXR1cm4JYSBuZXcgaW1hZ2Ugc3RydWN0dXJlIGlmIHN1Y2Nlc3NmdWwsIE5VTEwgb3RoZXJ3aXNlLgorKi8KK09QSl9BUEkgb3BqX2ltYWdlX3QqIE9QSl9DQUxMQ09OViBvcGpfaW1hZ2VfdGlsZV9jcmVhdGUoT1BKX1VJTlQzMiBudW1jbXB0cywgb3BqX2ltYWdlX2NtcHRwYXJtX3QgKmNtcHRwYXJtcywgT1BKX0NPTE9SX1NQQUNFIGNscnNwYyk7CisKKy8qIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgc3RyZWFtIGZ1bmN0aW9ucyBkZWZpbml0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworLyoqCisgKiBDcmVhdGVzIGFuIGFic3RyYWN0IHN0cmVhbS4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcgZXhjZXB0IGFsbG9jYXRpbmcgbWVtb3J5IGFuZCBpbml0aWFsaXppbmcgdGhlIGFic3RyYWN0IHN0cmVhbS4KKyAqCisgKiBAcGFyYW0JcF9pc19pbnB1dAkJaWYgc2V0IHRvIHRydWUgdGhlbiB0aGUgc3RyZWFtIHdpbGwgYmUgYW4gaW5wdXQgc3RyZWFtLCBhbiBvdXRwdXQgc3RyZWFtIGVsc2UuCisgKgorICogQHJldHVybglhIHN0cmVhbSBvYmplY3QuCisqLworT1BKX0FQSSBvcGpfc3RyZWFtX3QqIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX2RlZmF1bHRfY3JlYXRlKE9QSl9CT09MIHBfaXNfaW5wdXQpOworCisvKioKKyAqIENyZWF0ZXMgYW4gYWJzdHJhY3Qgc3RyZWFtLiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZyBleGNlcHQgYWxsb2NhdGluZyBtZW1vcnkgYW5kIGluaXRpYWxpemluZyB0aGUgYWJzdHJhY3Qgc3RyZWFtLgorICoKKyAqIEBwYXJhbQlwX2J1ZmZlcl9zaXplICBGSVhNRSBET0MKKyAqIEBwYXJhbQlwX2lzX2lucHV0CQlpZiBzZXQgdG8gdHJ1ZSB0aGVuIHRoZSBzdHJlYW0gd2lsbCBiZSBhbiBpbnB1dCBzdHJlYW0sIGFuIG91dHB1dCBzdHJlYW0gZWxzZS4KKyAqCisgKiBAcmV0dXJuCWEgc3RyZWFtIG9iamVjdC4KKyovCitPUEpfQVBJIG9wal9zdHJlYW1fdCogT1BKX0NBTExDT05WIG9wal9zdHJlYW1fY3JlYXRlKE9QSl9TSVpFX1QgcF9idWZmZXJfc2l6ZSwgT1BKX0JPT0wgcF9pc19pbnB1dCk7CisKKy8qKgorICogRGVzdHJveXMgYSBzdHJlYW0gY3JlYXRlZCBieSBvcGpfY3JlYXRlX3N0cmVhbS4gVGhpcyBmdW5jdGlvbiBkb2VzIE5PVCBjbG9zZSB0aGUgYWJzdHJhY3Qgc3RyZWFtLiBJZiBuZWVkZWQgdGhlIHVzZXIgbXVzdAorICogY2xvc2UgaXRzIG93biBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3RyZWFtLgorICoKKyAqIEBwYXJhbQlwX3N0cmVhbQl0aGUgc3RyZWFtIHRvIGRlc3Ryb3kuCisgKi8KK09QSl9BUEkgdm9pZCBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9kZXN0cm95KG9wal9zdHJlYW1fdCogcF9zdHJlYW0pOworIAorLyoqCisgKiBTZXRzIHRoZSBnaXZlbiBmdW5jdGlvbiB0byBiZSB1c2VkIGFzIGEgcmVhZCBmdW5jdGlvbi4KKyAqIEBwYXJhbQkJcF9zdHJlYW0JdGhlIHN0cmVhbSB0byBtb2RpZnkKKyAqIEBwYXJhbQkJcF9mdW5jdGlvbgl0aGUgZnVuY3Rpb24gdG8gdXNlIGEgcmVhZCBmdW5jdGlvbi4KKyovCitPUEpfQVBJIHZvaWQgT1BKX0NBTExDT05WIG9wal9zdHJlYW1fc2V0X3JlYWRfZnVuY3Rpb24ob3BqX3N0cmVhbV90KiBwX3N0cmVhbSwgb3BqX3N0cmVhbV9yZWFkX2ZuIHBfZnVuY3Rpb24pOworCisvKioKKyAqIFNldHMgdGhlIGdpdmVuIGZ1bmN0aW9uIHRvIGJlIHVzZWQgYXMgYSB3cml0ZSBmdW5jdGlvbi4KKyAqIEBwYXJhbQkJcF9zdHJlYW0JdGhlIHN0cmVhbSB0byBtb2RpZnkKKyAqIEBwYXJhbQkJcF9mdW5jdGlvbgl0aGUgZnVuY3Rpb24gdG8gdXNlIGEgd3JpdGUgZnVuY3Rpb24uCisqLworT1BKX0FQSSB2b2lkIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX3NldF93cml0ZV9mdW5jdGlvbihvcGpfc3RyZWFtX3QqIHBfc3RyZWFtLCBvcGpfc3RyZWFtX3dyaXRlX2ZuIHBfZnVuY3Rpb24pOworCisvKioKKyAqIFNldHMgdGhlIGdpdmVuIGZ1bmN0aW9uIHRvIGJlIHVzZWQgYXMgYSBza2lwIGZ1bmN0aW9uLgorICogQHBhcmFtCQlwX3N0cmVhbQl0aGUgc3RyZWFtIHRvIG1vZGlmeQorICogQHBhcmFtCQlwX2Z1bmN0aW9uCXRoZSBmdW5jdGlvbiB0byB1c2UgYSBza2lwIGZ1bmN0aW9uLgorKi8KK09QSl9BUEkgdm9pZCBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9zZXRfc2tpcF9mdW5jdGlvbihvcGpfc3RyZWFtX3QqIHBfc3RyZWFtLCBvcGpfc3RyZWFtX3NraXBfZm4gcF9mdW5jdGlvbik7CisKKy8qKgorICogU2V0cyB0aGUgZ2l2ZW4gZnVuY3Rpb24gdG8gYmUgdXNlZCBhcyBhIHNlZWsgZnVuY3Rpb24sIHRoZSBzdHJlYW0gaXMgdGhlbiBzZWVrYWJsZS4KKyAqIEBwYXJhbQkJcF9zdHJlYW0JdGhlIHN0cmVhbSB0byBtb2RpZnkKKyAqIEBwYXJhbQkJcF9mdW5jdGlvbgl0aGUgZnVuY3Rpb24gdG8gdXNlIGEgc2tpcCBmdW5jdGlvbi4KKyovCitPUEpfQVBJIHZvaWQgT1BKX0NBTExDT05WIG9wal9zdHJlYW1fc2V0X3NlZWtfZnVuY3Rpb24ob3BqX3N0cmVhbV90KiBwX3N0cmVhbSwgb3BqX3N0cmVhbV9zZWVrX2ZuIHBfZnVuY3Rpb24pOworCisvKioKKyAqIFNldHMgdGhlIGdpdmVuIGRhdGEgdG8gYmUgdXNlZCBhcyBhIHVzZXIgZGF0YSBmb3IgdGhlIHN0cmVhbS4KKyAqIEBwYXJhbQkJcF9zdHJlYW0JdGhlIHN0cmVhbSB0byBtb2RpZnkKKyAqIEBwYXJhbQkJcF9kYXRhCQl0aGUgZGF0YSB0byBzZXQuCisgKiBAcGFyYW0JCXBfZnVuY3Rpb24JdGhlIGZ1bmN0aW9uIHRvIGZyZWUgcF9kYXRhIHdoZW4gb3BqX3N0cmVhbV9kZXN0cm95KCkgaXMgY2FsbGVkLgorKi8KK09QSl9BUEkgdm9pZCBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9zZXRfdXNlcl9kYXRhIChvcGpfc3RyZWFtX3QqIHBfc3RyZWFtLCB2b2lkICogcF9kYXRhLCBvcGpfc3RyZWFtX2ZyZWVfdXNlcl9kYXRhX2ZuIHBfZnVuY3Rpb24pOworCisvKioKKyAqIFNldHMgdGhlIGxlbmd0aCBvZiB0aGUgdXNlciBkYXRhIGZvciB0aGUgc3RyZWFtLgorICoKKyAqIEBwYXJhbSBwX3N0cmVhbSAgICB0aGUgc3RyZWFtIHRvIG1vZGlmeQorICogQHBhcmFtIGRhdGFfbGVuZ3RoIGxlbmd0aCBvZiB0aGUgdXNlcl9kYXRhLgorKi8KK09QSl9BUEkgdm9pZCBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9zZXRfdXNlcl9kYXRhX2xlbmd0aChvcGpfc3RyZWFtX3QqIHBfc3RyZWFtLCBPUEpfVUlOVDY0IGRhdGFfbGVuZ3RoKTsKKworLyoqCisgKiBDcmVhdGUgYSBzdHJlYW0gZnJvbSBhIGZpbGUgaWRlbnRpZmllZCB3aXRoIGl0cyBmaWxlbmFtZSB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycyAoaGVscGVyIGZ1bmN0aW9uKQorICogQHBhcmFtIGZuYW1lICAgICAgICAgICAgIHRoZSBmaWxlbmFtZSBvZiB0aGUgZmlsZSB0byBzdHJlYW0KKyAqIEBwYXJhbSBwX2lzX3JlYWRfc3RyZWFtICB3aGV0aGVyIHRoZSBzdHJlYW0gaXMgYSByZWFkIHN0cmVhbSAodHJ1ZSkgb3Igbm90IChmYWxzZSkKKyovCitPUEpfQVBJIG9wal9zdHJlYW1fdCogT1BKX0NBTExDT05WIG9wal9zdHJlYW1fY3JlYXRlX2RlZmF1bHRfZmlsZV9zdHJlYW0gKGNvbnN0IGNoYXIgKmZuYW1lLCBPUEpfQk9PTCBwX2lzX3JlYWRfc3RyZWFtKTsKKyAKKy8qKiBDcmVhdGUgYSBzdHJlYW0gZnJvbSBhIGZpbGUgaWRlbnRpZmllZCB3aXRoIGl0cyBmaWxlbmFtZSB3aXRoIGEgc3BlY2lmaWMgYnVmZmVyIHNpemUKKyAqIEBwYXJhbSBmbmFtZSAgICAgICAgICAgICB0aGUgZmlsZW5hbWUgb2YgdGhlIGZpbGUgdG8gc3RyZWFtCisgKiBAcGFyYW0gcF9idWZmZXJfc2l6ZSAgICAgc2l6ZSBvZiB0aGUgY2h1bmsgdXNlZCB0byBzdHJlYW0KKyAqIEBwYXJhbSBwX2lzX3JlYWRfc3RyZWFtICB3aGV0aGVyIHRoZSBzdHJlYW0gaXMgYSByZWFkIHN0cmVhbSAodHJ1ZSkgb3Igbm90IChmYWxzZSkKKyovCitPUEpfQVBJIG9wal9zdHJlYW1fdCogT1BKX0NBTExDT05WIG9wal9zdHJlYW1fY3JlYXRlX2ZpbGVfc3RyZWFtIChjb25zdCBjaGFyICpmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9TSVpFX1QgcF9idWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CT09MIHBfaXNfcmVhZF9zdHJlYW0pOworIAorLyogCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBldmVudCBtYW5hZ2VyIGZ1bmN0aW9ucyBkZWZpbml0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKy8qKgorICogU2V0IHRoZSBpbmZvIGhhbmRsZXIgdXNlIGJ5IG9wZW5qcGVnLgorICogQHBhcmFtIHBfY29kZWMgICAgICAgdGhlIGNvZGVjIHByZXZpb3VzbHkgaW5pdGlhbGlzZQorICogQHBhcmFtIHBfY2FsbGJhY2sgICAgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgdXNlZAorICogQHBhcmFtIHBfdXNlcl9kYXRhICAgY2xpZW50IG9iamVjdCB3aGVyZSB3aWxsIGJlIHJldHVybmVkIHRoZSBtZXNzYWdlCisqLworT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3NldF9pbmZvX2hhbmRsZXIob3BqX2NvZGVjX3QgKiBwX2NvZGVjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9tc2dfY2FsbGJhY2sgcF9jYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBwX3VzZXJfZGF0YSk7CisvKioKKyAqIFNldCB0aGUgd2FybmluZyBoYW5kbGVyIHVzZSBieSBvcGVuanBlZy4KKyAqIEBwYXJhbSBwX2NvZGVjICAgICAgIHRoZSBjb2RlYyBwcmV2aW91c2x5IGluaXRpYWxpc2UKKyAqIEBwYXJhbSBwX2NhbGxiYWNrICAgIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIHVzZWQKKyAqIEBwYXJhbSBwX3VzZXJfZGF0YSAgIGNsaWVudCBvYmplY3Qgd2hlcmUgd2lsbCBiZSByZXR1cm5lZCB0aGUgbWVzc2FnZQorKi8KK09QSl9BUEkgT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9zZXRfd2FybmluZ19oYW5kbGVyKG9wal9jb2RlY190ICogcF9jb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9tc2dfY2FsbGJhY2sgcF9jYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBwX3VzZXJfZGF0YSk7CisvKioKKyAqIFNldCB0aGUgZXJyb3IgaGFuZGxlciB1c2UgYnkgb3BlbmpwZWcuCisgKiBAcGFyYW0gcF9jb2RlYyAgICAgICB0aGUgY29kZWMgcHJldmlvdXNseSBpbml0aWFsaXNlCisgKiBAcGFyYW0gcF9jYWxsYmFjayAgICB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSB1c2VkCisgKiBAcGFyYW0gcF91c2VyX2RhdGEgICBjbGllbnQgb2JqZWN0IHdoZXJlIHdpbGwgYmUgcmV0dXJuZWQgdGhlIG1lc3NhZ2UKKyovCitPUEpfQVBJIE9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfc2V0X2Vycm9yX2hhbmRsZXIob3BqX2NvZGVjX3QgKiBwX2NvZGVjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfbXNnX2NhbGxiYWNrIHBfY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIHBfdXNlcl9kYXRhKTsKKworLyogCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBjb2RlYyBmdW5jdGlvbnMgZGVmaW5pdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKy8qKgorICogQ3JlYXRlcyBhIEoySy9KUDIgZGVjb21wcmVzc2lvbiBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBmb3JtYXQgCQlEZWNvZGVyIHRvIHNlbGVjdAorICoKKyAqIEByZXR1cm4gUmV0dXJucyBhIGhhbmRsZSB0byBhIGRlY29tcHJlc3NvciBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIE5VTEwgb3RoZXJ3aXNlCisgKiAqLworT1BKX0FQSSBvcGpfY29kZWNfdCogT1BKX0NBTExDT05WIG9wal9jcmVhdGVfZGVjb21wcmVzcyhPUEpfQ09ERUNfRk9STUFUIGZvcm1hdCk7CisKKy8qKgorICogRGVzdHJveSBhIGRlY29tcHJlc3NvciBoYW5kbGUKKyAqCisgKiBAcGFyYW0JcF9jb2RlYwkJCWRlY29tcHJlc3NvciBoYW5kbGUgdG8gZGVzdHJveQorICovCitPUEpfQVBJIHZvaWQgT1BKX0NBTExDT05WIG9wal9kZXN0cm95X2NvZGVjKG9wal9jb2RlY190ICogcF9jb2RlYyk7CisKKy8qKgorICogUmVhZCBhZnRlciB0aGUgY29kZXN0cmVhbSBpZiBuZWNlc3NhcnkKKyAqIEBwYXJhbQlwX2NvZGVjCQkJdGhlIEpQRUcyMDAwIGNvZGVjIHRvIHJlYWQuCisgKiBAcGFyYW0JcF9zdHJlYW0JCXRoZSBKUEVHMjAwMCBzdHJlYW0uCisgKi8KK09QSl9BUEkgT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9lbmRfZGVjb21wcmVzcyAoCW9wal9jb2RlY190ICpwX2NvZGVjLAorCQkJCQkJCQkJCQkJCW9wal9zdHJlYW1fdCAqcF9zdHJlYW0pOworCisKKy8qKgorICogU2V0IGRlY29kaW5nIHBhcmFtZXRlcnMgdG8gZGVmYXVsdCB2YWx1ZXMKKyAqIEBwYXJhbSBwYXJhbWV0ZXJzIERlY29tcHJlc3Npb24gcGFyYW1ldGVycworICovCitPUEpfQVBJIHZvaWQgT1BKX0NBTExDT05WIG9wal9zZXRfZGVmYXVsdF9kZWNvZGVyX3BhcmFtZXRlcnMob3BqX2RwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMpOworCisvKioKKyAqIFNldHVwIHRoZSBkZWNvZGVyIHdpdGggZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIGFuZCB3aXRoIHRoZSBtZXNzYWdlIGhhbmRsZXIKKyAqIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLgorICoKKyAqIEBwYXJhbSBwX2NvZGVjIAkJZGVjb21wcmVzc29yIGhhbmRsZXIKKyAqIEBwYXJhbSBwYXJhbWV0ZXJzIAlkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMKKyAqCisgKiBAcmV0dXJuIHRydWUJCQlpZiB0aGUgZGVjb2RlciBpcyBjb3JyZWN0bHkgc2V0CisgKi8KK09QSl9BUEkgT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9zZXR1cF9kZWNvZGVyKG9wal9jb2RlY190ICpwX2NvZGVjLAorCQkJCQkJCQkJCQkJb3BqX2RwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMgKTsKKworLyoqCisgKiBEZWNvZGVzIGFuIGltYWdlIGhlYWRlci4KKyAqCisgKiBAcGFyYW0JcF9zdHJlYW0JCXRoZSBqcGVnMjAwMCBzdHJlYW0uCisgKiBAcGFyYW0JcF9jb2RlYwkJCXRoZSBqcGVnMjAwMCBjb2RlYyB0byByZWFkLgorICogQHBhcmFtCXBfaW1hZ2UJCQl0aGUgaW1hZ2Ugc3RydWN0dXJlIGluaXRpYWxpemVkIHdpdGggdGhlIGNoYXJhY3RlcmlzdGljcyBvZiBlbmNvZGVkIGltYWdlLgorICoKKyAqIEByZXR1cm4gdHJ1ZQkJCQlpZiB0aGUgbWFpbiBoZWFkZXIgb2YgdGhlIGNvZGVzdHJlYW0gYW5kIHRoZSBKUDIgaGVhZGVyIGlzIGNvcnJlY3RseSByZWFkLgorICovCitPUEpfQVBJIE9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfcmVhZF9oZWFkZXIgKAlvcGpfc3RyZWFtX3QgKnBfc3RyZWFtLAorCQkJCQkJCQkJCQkJb3BqX2NvZGVjX3QgKnBfY29kZWMsCisJCQkJCQkJCQkJCQlvcGpfaW1hZ2VfdCAqKnBfaW1hZ2UpOworCisvKioKKyAqIFNldHMgdGhlIGdpdmVuIGFyZWEgdG8gYmUgZGVjb2RlZC4gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHJpZ2h0IGFmdGVyIG9wal9yZWFkX2hlYWRlciBhbmQgYmVmb3JlIGFueSB0aWxlIGhlYWRlciByZWFkaW5nLgorICoKKyAqIEBwYXJhbQlwX2NvZGVjCQkJdGhlIGpwZWcyMDAwIGNvZGVjLgorICogQHBhcmFtCXBfaW1hZ2UgICAgICAgICB0aGUgZGVjb2RlZCBpbWFnZSBwcmV2aW91c2x5IHNldHRlZCBieSBvcGpfcmVhZF9oZWFkZXIKKyAqIEBwYXJhbQlwX3N0YXJ0X3gJCXRoZSBsZWZ0IHBvc2l0aW9uIG9mIHRoZSByZWN0YW5nbGUgdG8gZGVjb2RlIChpbiBpbWFnZSBjb29yZGluYXRlcykuCisgKiBAcGFyYW0JcF9lbmRfeAkJCXRoZSByaWdodCBwb3NpdGlvbiBvZiB0aGUgcmVjdGFuZ2xlIHRvIGRlY29kZSAoaW4gaW1hZ2UgY29vcmRpbmF0ZXMpLgorICogQHBhcmFtCXBfc3RhcnRfeQkJdGhlIHVwIHBvc2l0aW9uIG9mIHRoZSByZWN0YW5nbGUgdG8gZGVjb2RlIChpbiBpbWFnZSBjb29yZGluYXRlcykuCisgKiBAcGFyYW0JcF9lbmRfeQkJCXRoZSBib3R0b20gcG9zaXRpb24gb2YgdGhlIHJlY3RhbmdsZSB0byBkZWNvZGUgKGluIGltYWdlIGNvb3JkaW5hdGVzKS4KKyAqCisgKiBAcmV0dXJuCXRydWUJCQlpZiB0aGUgYXJlYSBjb3VsZCBiZSBzZXQuCisgKi8KK09QSl9BUEkgT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9zZXRfZGVjb2RlX2FyZWEoCW9wal9jb2RlY190ICpwX2NvZGVjLAorCQkJCQkJCQkJCQkJCW9wal9pbWFnZV90KiBwX2ltYWdlLAorCQkJCQkJCQkJCQkJCU9QSl9JTlQzMiBwX3N0YXJ0X3gsIE9QSl9JTlQzMiBwX3N0YXJ0X3ksCisJCQkJCQkJCQkJCQkJT1BKX0lOVDMyIHBfZW5kX3gsIE9QSl9JTlQzMiBwX2VuZF95ICk7CisKKy8qKgorICogRGVjb2RlIGFuIGltYWdlIGZyb20gYSBKUEVHLTIwMDAgY29kZXN0cmVhbQorICoKKyAqIEBwYXJhbSBwX2RlY29tcHJlc3NvciAJZGVjb21wcmVzc29yIGhhbmRsZQorICogQHBhcmFtIHBfc3RyZWFtCQkJSW5wdXQgYnVmZmVyIHN0cmVhbQorICogQHBhcmFtIHBfaW1hZ2UgCQkJdGhlIGRlY29kZWQgaW1hZ2UKKyAqIEByZXR1cm4gCQkJCQl0cnVlIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZQorICogKi8KK09QSl9BUEkgT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9kZWNvZGUoICAgb3BqX2NvZGVjX3QgKnBfZGVjb21wcmVzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqcF9pbWFnZSk7CisKKy8qKgorICogR2V0IHRoZSBkZWNvZGVkIHRpbGUgZnJvbSB0aGUgY29kZWMKKyAqCisgKiBAcGFyYW0JcF9jb2RlYwkJCXRoZSBqcGVnMjAwMCBjb2RlYy4KKyAqIEBwYXJhbQlwX3N0cmVhbQkJaW5wdXQgc3RyZWFtbQorICogQHBhcmFtCXBfaW1hZ2UJCQlvdXRwdXQgaW1hZ2UKKyAqIEBwYXJhbQl0aWxlX2luZGV4CQlpbmRleCBvZiB0aGUgdGlsZSB3aGljaCB3aWxsIGJlIGRlY29kZQorICoKKyAqIEByZXR1cm4JCQkJCXRydWUgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlCisgKi8KK09QSl9BUEkgT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9nZXRfZGVjb2RlZF90aWxlKAlvcGpfY29kZWNfdCAqcF9jb2RlYywKKwkJCQkJCQkJCQkJCQlvcGpfc3RyZWFtX3QgKnBfc3RyZWFtLAorCQkJCQkJCQkJCQkJCW9wal9pbWFnZV90ICpwX2ltYWdlLAorCQkJCQkJCQkJCQkJCU9QSl9VSU5UMzIgdGlsZV9pbmRleCk7CisKKy8qKgorICogU2V0IHRoZSByZXNvbHV0aW9uIGZhY3RvciBvZiB0aGUgZGVjb2RlZCBpbWFnZQorICogQHBhcmFtCXBfY29kZWMJCQl0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0JcmVzX2ZhY3RvcgkJcmVzb2x1dGlvbiBmYWN0b3IgdG8gc2V0CisgKgorICogQHJldHVybgkJCQkJdHJ1ZSBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UKKyAqLworT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3NldF9kZWNvZGVkX3Jlc29sdXRpb25fZmFjdG9yKG9wal9jb2RlY190ICpwX2NvZGVjLCBPUEpfVUlOVDMyIHJlc19mYWN0b3IpOworCisvKioKKyAqIFdyaXRlcyBhIHRpbGUgd2l0aCB0aGUgZ2l2ZW4gZGF0YS4KKyAqCisgKiBAcGFyYW0JcF9jb2RlYwkJICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0JcF90aWxlX2luZGV4CQl0aGUgaW5kZXggb2YgdGhlIHRpbGUgdG8gd3JpdGUuIEF0IHRoZSBtb21lbnQsIHRoZSB0aWxlcyBtdXN0IGJlIHdyaXR0ZW4gZnJvbSAwIHRvIG4tMSBpbiBzZXF1ZW5jZS4KKyAqIEBwYXJhbQlwX2RhdGEJCQkJcG9pbnRlciB0byB0aGUgZGF0YSB0byB3cml0ZS4gRGF0YSBpcyBhcnJhbmdlZCBpbiBzZXF1ZW5jZSwgZGF0YV9jb21wMCwgdGhlbiBkYXRhX2NvbXAxLCB0aGVuIC4uLiBOTyBJTlRFUkxFQVZJTkcgc2hvdWxkIGJlIHNldC4KKyAqIEBwYXJhbQlwX2RhdGFfc2l6ZQkJCXRoaXMgdmFsdWUgb3MgdXNlZCB0byBtYWtlIHN1cmUgdGhlIGRhdGEgYmVpbmcgd3JpdHRlbiBpcyBjb3JyZWN0LiBUaGUgc2l6ZSBtdXN0IGJlIGVxdWFsIHRvIHRoZSBzdW0gZm9yIGVhY2ggY29tcG9uZW50IG9mIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlX3dpZHRoICogdGlsZV9oZWlnaHQgKiBjb21wb25lbnRfc2l6ZS4gY29tcG9uZW50X3NpemUgY2FuIGJlIDEsMiBvciA0IGJ5dGVzLCBkZXBlbmRpbmcgb24gdGhlIHByZWNpc2lvbiBvZiB0aGUgZ2l2ZW4gY29tcG9uZW50LgorICogQHBhcmFtCXBfc3RyZWFtCQkJdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgorICoKKyAqIEByZXR1cm4JdHJ1ZSBpZiB0aGUgZGF0YSBjb3VsZCBiZSB3cml0dGVuLgorICovCitPUEpfQVBJIE9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfd3JpdGVfdGlsZSAoCW9wal9jb2RlY190ICpwX2NvZGVjLAorCQkJCQkJCQkJCQkJT1BKX1VJTlQzMiBwX3RpbGVfaW5kZXgsCisJCQkJCQkJCQkJCQlPUEpfQllURSAqIHBfZGF0YSwKKwkJCQkJCQkJCQkJCU9QSl9VSU5UMzIgcF9kYXRhX3NpemUsCisJCQkJCQkJCQkJCQlvcGpfc3RyZWFtX3QgKnBfc3RyZWFtICk7CisKKy8qKgorICogUmVhZHMgYSB0aWxlIGhlYWRlci4gVGhpcyBmdW5jdGlvbiBpcyBjb21wdWxzb3J5IGFuZCBhbGxvd3Mgb25lIHRvIGtub3cgdGhlIHNpemUgb2YgdGhlIHRpbGUgdGhhdCB3aWxsIGJlIGRlY29kZWQuCisgKiBUaGUgdXNlciBtYXkgbmVlZCB0byByZWZlciB0byB0aGUgaW1hZ2UgZ290IGJ5IG9wal9yZWFkX2hlYWRlciB0byB1bmRlcnN0YW5kIHRoZSBzaXplIGJlaW5nIHRha2VuIGJ5IHRoZSB0aWxlLgorICoKKyAqIEBwYXJhbQlwX2NvZGVjCQkJdGhlIGpwZWcyMDAwIGNvZGVjLgorICogQHBhcmFtCXBfdGlsZV9pbmRleAlwb2ludGVyIHRvIGEgdmFsdWUgdGhhdCB3aWxsIGhvbGQgdGhlIGluZGV4IG9mIHRoZSB0aWxlIGJlaW5nIGRlY29kZWQsIGluIGNhc2Ugb2Ygc3VjY2Vzcy4KKyAqIEBwYXJhbQlwX2RhdGFfc2l6ZQkJcG9pbnRlciB0byBhIHZhbHVlIHRoYXQgd2lsbCBob2xkIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGRlY29kZWQgZGF0YSwgaW4gY2FzZSBvZiBzdWNjZXNzLiBJbiBjYXNlCisgKgkJCQkJCQlvZiB0cnVuY2F0ZWQgY29kZXN0cmVhbXMsIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIGRlY29kZWQgbWF5IGJlIGxvd2VyLiBUaGUgY29tcHV0YXRpb24gb2YgdGhlIHNpemUgaXMgdGhlIHNhbWUKKyAqCQkJCQkJCWFzIGRlcGljdGVkIGluIG9wal93cml0ZV90aWxlLgorICogQHBhcmFtCXBfdGlsZV94MAkJcG9pbnRlciB0byBhIHZhbHVlIHRoYXQgd2lsbCBob2xkIHRoZSB4MCBwb3Mgb2YgdGhlIHRpbGUgKGluIHRoZSBpbWFnZSkuCisgKiBAcGFyYW0JcF90aWxlX3kwCQlwb2ludGVyIHRvIGEgdmFsdWUgdGhhdCB3aWxsIGhvbGQgdGhlIHkwIHBvcyBvZiB0aGUgdGlsZSAoaW4gdGhlIGltYWdlKS4KKyAqIEBwYXJhbQlwX3RpbGVfeDEJCXBvaW50ZXIgdG8gYSB2YWx1ZSB0aGF0IHdpbGwgaG9sZCB0aGUgeDEgcG9zIG9mIHRoZSB0aWxlIChpbiB0aGUgaW1hZ2UpLgorICogQHBhcmFtCXBfdGlsZV95MQkJcG9pbnRlciB0byBhIHZhbHVlIHRoYXQgd2lsbCBob2xkIHRoZSB5MSBwb3Mgb2YgdGhlIHRpbGUgKGluIHRoZSBpbWFnZSkuCisgKiBAcGFyYW0JcF9uYl9jb21wcwkJcG9pbnRlciB0byBhIHZhbHVlIHRoYXQgd2lsbCBob2xkIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyBpbiB0aGUgdGlsZS4KKyAqIEBwYXJhbQlwX3Nob3VsZF9nb19vbglwb2ludGVyIHRvIGEgYm9vbGVhbiB0aGF0IHdpbGwgaG9sZCB0aGUgZmFjdCB0aGF0IHRoZSBkZWNvZGluZyBzaG91bGQgZ28gb24uIEluIGNhc2UgdGhlCisgKgkJCQkJCQljb2Rlc3RyZWFtIGlzIG92ZXIgYXQgdGhlIHRpbWUgb2YgdGhlIGNhbGwsIHRoZSB2YWx1ZSB3aWxsIGJlIHNldCB0byBmYWxzZS4gVGhlIHVzZXIgc2hvdWxkIHRoZW4gc3RvcAorICoJCQkJCQkJdGhlIGRlY29kaW5nLgorICogQHBhcmFtCXBfc3RyZWFtCQl0aGUgc3RyZWFtIHRvIGRlY29kZS4KKyAqIEByZXR1cm4JdHJ1ZQkJCWlmIHRoZSB0aWxlIGhlYWRlciBjb3VsZCBiZSBkZWNvZGVkLiBJbiBjYXNlIHRoZSBkZWNvZGluZyBzaG91bGQgZW5kLCB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgc3RpbGwgdHJ1ZS4KKyAqCQkJCQkJCXJldHVybmluZyBmYWxzZSBtYXkgYmUgdGhlIHJlc3VsdCBvZiBhIHNob3J0YWdlIG9mIG1lbW9yeSBvciBhbiBpbnRlcm5hbCBlcnJvci4KKyAqLworT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3JlYWRfdGlsZV9oZWFkZXIoCW9wal9jb2RlY190ICpwX2NvZGVjLAorCQkJCQkJCQkJCQkJb3BqX3N0cmVhbV90ICogcF9zdHJlYW0sCisJCQkJCQkJCQkJCQlPUEpfVUlOVDMyICogcF90aWxlX2luZGV4LAorCQkJCQkJCQkJCQkJT1BKX1VJTlQzMiAqIHBfZGF0YV9zaXplLAorCQkJCQkJCQkJCQkJT1BKX0lOVDMyICogcF90aWxlX3gwLCBPUEpfSU5UMzIgKiBwX3RpbGVfeTAsCisJCQkJCQkJCQkJCQlPUEpfSU5UMzIgKiBwX3RpbGVfeDEsIE9QSl9JTlQzMiAqIHBfdGlsZV95MSwKKwkJCQkJCQkJCQkJCU9QSl9VSU5UMzIgKiBwX25iX2NvbXBzLAorCQkJCQkJCQkJCQkJT1BKX0JPT0wgKiBwX3Nob3VsZF9nb19vbiApOworCisvKioKKyAqIFJlYWRzIGEgdGlsZSBkYXRhLiBUaGlzIGZ1bmN0aW9uIGlzIGNvbXB1bHNvcnkgYW5kIGFsbG93cyBvbmUgdG8gZGVjb2RlIHRpbGUgZGF0YS4gb3BqX3JlYWRfdGlsZV9oZWFkZXIgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCisgKiBUaGUgdXNlciBtYXkgbmVlZCB0byByZWZlciB0byB0aGUgaW1hZ2UgZ290IGJ5IG9wal9yZWFkX2hlYWRlciB0byB1bmRlcnN0YW5kIHRoZSBzaXplIGJlaW5nIHRha2VuIGJ5IHRoZSB0aWxlLgorICoKKyAqIEBwYXJhbQlwX2NvZGVjCQkJdGhlIGpwZWcyMDAwIGNvZGVjLgorICogQHBhcmFtCXBfdGlsZV9pbmRleAl0aGUgaW5kZXggb2YgdGhlIHRpbGUgYmVpbmcgZGVjb2RlZCwgdGhpcyBzaG91bGQgYmUgdGhlIHZhbHVlIHNldCBieSBvcGpfcmVhZF90aWxlX2hlYWRlci4KKyAqIEBwYXJhbQlwX2RhdGEJCQlwb2ludGVyIHRvIGEgbWVtb3J5IGJsb2NrIHRoYXQgd2lsbCBob2xkIHRoZSBkZWNvZGVkIGRhdGEuCisgKiBAcGFyYW0JcF9kYXRhX3NpemUJCXNpemUgb2YgcF9kYXRhLiBwX2RhdGFfc2l6ZSBzaG91bGQgYmUgYmlnZ2VyIG9yIGVxdWFsIHRvIHRoZSB2YWx1ZSBzZXQgYnkgb3BqX3JlYWRfdGlsZV9oZWFkZXIuCisgKiBAcGFyYW0JcF9zdHJlYW0JCXRoZSBzdHJlYW0gdG8gZGVjb2RlLgorICoKKyAqIEByZXR1cm4JdHJ1ZQkJCWlmIHRoZSBkYXRhIGNvdWxkIGJlIGRlY29kZWQuCisgKi8KK09QSl9BUEkgT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9kZWNvZGVfdGlsZV9kYXRhKAlvcGpfY29kZWNfdCAqcF9jb2RlYywKKwkJCQkJCQkJCQkJCQlPUEpfVUlOVDMyIHBfdGlsZV9pbmRleCwKKwkJCQkJCQkJCQkJCQlPUEpfQllURSAqIHBfZGF0YSwKKwkJCQkJCQkJCQkJCQlPUEpfVUlOVDMyIHBfZGF0YV9zaXplLAorCQkJCQkJCQkJCQkJCW9wal9zdHJlYW1fdCAqcF9zdHJlYW0gKTsKKworLyogQ09NUFJFU1NJT04gRlVOQ1RJT05TKi8KKworLyoqCisgKiBDcmVhdGVzIGEgSjJLL0pQMiBjb21wcmVzc2lvbiBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSAJZm9ybWF0IAkJQ29kZXIgdG8gc2VsZWN0CisgKiBAcmV0dXJuIAkJCQlSZXR1cm5zIGEgaGFuZGxlIHRvIGEgY29tcHJlc3NvciBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIE5VTEwgb3RoZXJ3aXNlCisgKi8KK09QSl9BUEkgb3BqX2NvZGVjX3QqIE9QSl9DQUxMQ09OViBvcGpfY3JlYXRlX2NvbXByZXNzKE9QSl9DT0RFQ19GT1JNQVQgZm9ybWF0KTsKKworLyoqCitTZXQgZW5jb2RpbmcgcGFyYW1ldGVycyB0byBkZWZhdWx0IHZhbHVlcywgdGhhdCBtZWFucyA6IAorPHVsPgorPGxpPkxvc3NsZXNzCis8bGk+MSB0aWxlCis8bGk+U2l6ZSBvZiBwcmVjaW5jdCA6IDJeMTUgeCAyXjE1IChtZWFucyAxIHByZWNpbmN0KQorPGxpPlNpemUgb2YgY29kZS1ibG9jayA6IDY0IHggNjQKKzxsaT5OdW1iZXIgb2YgcmVzb2x1dGlvbnM6IDYKKzxsaT5ObyBTT1AgbWFya2VyIGluIHRoZSBjb2Rlc3RyZWFtCis8bGk+Tm8gRVBIIG1hcmtlciBpbiB0aGUgY29kZXN0cmVhbQorPGxpPk5vIHN1Yi1zYW1wbGluZyBpbiB4IG9yIHkgZGlyZWN0aW9uCis8bGk+Tm8gbW9kZSBzd2l0Y2ggYWN0aXZhdGVkCis8bGk+UHJvZ3Jlc3Npb24gb3JkZXI6IExSQ1AKKzxsaT5ObyBpbmRleCBmaWxlCis8bGk+Tm8gUk9JIHVwc2hpZnRlZAorPGxpPk5vIG9mZnNldCBvZiB0aGUgb3JpZ2luIG9mIHRoZSBpbWFnZQorPGxpPk5vIG9mZnNldCBvZiB0aGUgb3JpZ2luIG9mIHRoZSB0aWxlcworPGxpPlJldmVyc2libGUgRFdUIDUtMworPC91bD4KK0BwYXJhbSBwYXJhbWV0ZXJzIENvbXByZXNzaW9uIHBhcmFtZXRlcnMKKyovCitPUEpfQVBJIHZvaWQgT1BKX0NBTExDT05WIG9wal9zZXRfZGVmYXVsdF9lbmNvZGVyX3BhcmFtZXRlcnMob3BqX2NwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMpOworCisvKioKKyAqIFNldHVwIHRoZSBlbmNvZGVyIHBhcmFtZXRlcnMgdXNpbmcgdGhlIGN1cnJlbnQgaW1hZ2UgYW5kIHVzaW5nIHVzZXIgcGFyYW1ldGVycy4KKyAqIEBwYXJhbSBwX2NvZGVjIAkJQ29tcHJlc3NvciBoYW5kbGUKKyAqIEBwYXJhbSBwYXJhbWV0ZXJzIAlDb21wcmVzc2lvbiBwYXJhbWV0ZXJzCisgKiBAcGFyYW0gaW1hZ2UgCQlJbnB1dCBmaWxsZWQgaW1hZ2UKKyAqLworT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3NldHVwX2VuY29kZXIob3BqX2NvZGVjX3QgKnBfY29kZWMsIAorCQkJCQkJCQkJCQkJb3BqX2NwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMsIAorCQkJCQkJCQkJCQkJb3BqX2ltYWdlX3QgKmltYWdlKTsKKworLyoqCisgKiBTdGFydCB0byBjb21wcmVzcyB0aGUgY3VycmVudCBpbWFnZS4KKyAqIEBwYXJhbSBwX2NvZGVjIAkJQ29tcHJlc3NvciBoYW5kbGUKKyAqIEBwYXJhbSBpbWFnZSAJICAgIElucHV0IGZpbGxlZCBpbWFnZQorICogQHBhcmFtIHBfc3RyZWFtIAkJSW5wdXQgc3RncmVhbQorICovCitPUEpfQVBJIE9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfc3RhcnRfY29tcHJlc3MgKAlvcGpfY29kZWNfdCAqcF9jb2RlYywKKwkJCQkJCQkJCQkJCQlvcGpfaW1hZ2VfdCAqIHBfaW1hZ2UsCisJCQkJCQkJCQkJCQkJb3BqX3N0cmVhbV90ICpwX3N0cmVhbSk7CisKKy8qKgorICogRW5kIHRvIGNvbXByZXNzIHRoZSBjdXJyZW50IGltYWdlLgorICogQHBhcmFtIHBfY29kZWMgCQlDb21wcmVzc29yIGhhbmRsZQorICogQHBhcmFtIHBfc3RyZWFtIAkJSW5wdXQgc3RncmVhbQorICovCitPUEpfQVBJIE9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfZW5kX2NvbXByZXNzIChvcGpfY29kZWNfdCAqcF9jb2RlYywKKwkJCQkJCQkJCQkJCW9wal9zdHJlYW1fdCAqcF9zdHJlYW0pOworCisvKioKKyAqIEVuY29kZSBhbiBpbWFnZSBpbnRvIGEgSlBFRy0yMDAwIGNvZGVzdHJlYW0KKyAqIEBwYXJhbSBwX2NvZGVjIAkJY29tcHJlc3NvciBoYW5kbGUKKyAqIEBwYXJhbSBwX3N0cmVhbSAJCU91dHB1dCBidWZmZXIgc3RyZWFtCisgKgorICogQHJldHVybiAJCQkJUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK09QSl9BUEkgT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9lbmNvZGUob3BqX2NvZGVjX3QgKnBfY29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fdCAqcF9zdHJlYW0pOworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIGNvZGVjIG91dHB1dCBmdW5jdGlvbnMgZGVmaW5pdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisvKiBFWFBFUklNRU5UQUwgRlVOQ1RJT05TIEZPUiBOT1csIFVTRUQgT05MWSBJTiBKMktfRFVNUCovCisKKy8qKgorRGVzdHJveSBDb2Rlc3RyZWFtIGluZm9ybWF0aW9uIGFmdGVyIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24KK0BwYXJhbSBjc3RyX2luZm8gQ29kZXN0cmVhbSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKyovCitPUEpfQVBJIHZvaWQgT1BKX0NBTExDT05WIG9wal9kZXN0cm95X2NzdHJfaW5mbyhvcGpfY29kZXN0cmVhbV9pbmZvX3YyX3QgKipjc3RyX2luZm8pOworCisKKy8qKgorICogRHVtcCB0aGUgY29kZWMgaW5mb3JtYXRpb24gaW50byB0aGUgb3V0cHV0IHN0cmVhbQorICoKKyAqIEBwYXJhbQlwX2NvZGVjCQkJdGhlIGpwZWcyMDAwIGNvZGVjLgorICogQHBhcmFtCWluZm9fZmxhZwkJdHlwZSBvZiBpbmZvcm1hdGlvbiBkdW1wLgorICogQHBhcmFtCW91dHB1dF9zdHJlYW0Jb3V0cHV0IHN0cmVhbSB3aGVyZSBkdW1wIHRoZSBpbmZvcm1hdGlvbnMgZ2V0IGZyb20gdGhlIGNvZGVjLgorICoKKyAqLworT1BKX0FQSSB2b2lkIE9QSl9DQUxMQ09OViBvcGpfZHVtcF9jb2RlYygJb3BqX2NvZGVjX3QgKnBfY29kZWMsCisJCQkJCQkJCQkJCU9QSl9JTlQzMiBpbmZvX2ZsYWcsCisJCQkJCQkJCQkJCUZJTEUqIG91dHB1dF9zdHJlYW0pOworCisvKioKKyAqIEdldCB0aGUgY29kZXN0cmVhbSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjb2RlYworICoKKyAqIEBwYXJhbQlwX2NvZGVjCQkJdGhlIGpwZWcyMDAwIGNvZGVjLgorICoKKyAqIEByZXR1cm4JCQkJCWEgcG9pbnRlciB0byBhIGNvZGVzdHJlYW0gaW5mb3JtYXRpb24gc3RydWN0dXJlLgorICoKKyAqLworT1BKX0FQSSBvcGpfY29kZXN0cmVhbV9pbmZvX3YyX3QqIE9QSl9DQUxMQ09OViBvcGpfZ2V0X2NzdHJfaW5mbyhvcGpfY29kZWNfdCAqcF9jb2RlYyk7CisKKy8qKgorICogR2V0IHRoZSBjb2Rlc3RyZWFtIGluZGV4IGZyb20gdGhlIGNvZGVjCisgKgorICogQHBhcmFtCXBfY29kZWMJCQl0aGUganBlZzIwMDAgY29kZWMuCisgKgorICogQHJldHVybgkJCQkJYSBwb2ludGVyIHRvIGEgY29kZXN0cmVhbSBpbmRleCBzdHJ1Y3R1cmUuCisgKgorICovCitPUEpfQVBJIG9wal9jb2Rlc3RyZWFtX2luZGV4X3QgKiBPUEpfQ0FMTENPTlYgb3BqX2dldF9jc3RyX2luZGV4KG9wal9jb2RlY190ICpwX2NvZGVjKTsKKworT1BKX0FQSSB2b2lkIE9QSl9DQUxMQ09OViBvcGpfZGVzdHJveV9jc3RyX2luZGV4KG9wal9jb2Rlc3RyZWFtX2luZGV4X3QgKipwX2NzdHJfaW5kZXgpOworCisKKy8qKgorICogR2V0IHRoZSBKUDIgZmlsZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjb2RlYyBGSVhNRQorICoKKyAqIEBwYXJhbQlwX2NvZGVjCQkJdGhlIGpwZWcyMDAwIGNvZGVjLgorICoKKyAqIEByZXR1cm4JCQkJCWEgcG9pbnRlciB0byBhIEpQMiBtZXRhZGF0YSBzdHJ1Y3R1cmUuCisgKgorICovCitPUEpfQVBJIG9wal9qcDJfbWV0YWRhdGFfdCogT1BKX0NBTExDT05WIG9wal9nZXRfanAyX21ldGFkYXRhKG9wal9jb2RlY190ICpwX2NvZGVjKTsKKworLyoqCisgKiBHZXQgdGhlIEpQMiBmaWxlIGluZGV4IGZyb20gdGhlIGNvZGVjIEZJWE1FCisgKgorICogQHBhcmFtCXBfY29kZWMJCQl0aGUganBlZzIwMDAgY29kZWMuCisgKgorICogQHJldHVybgkJCQkJYSBwb2ludGVyIHRvIGEgSlAyIGluZGV4IHN0cnVjdHVyZS4KKyAqCisgKi8KK09QSl9BUEkgb3BqX2pwMl9pbmRleF90KiBPUEpfQ0FMTENPTlYgb3BqX2dldF9qcDJfaW5kZXgob3BqX2NvZGVjX3QgKnBfY29kZWMpOworCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBNQ1QgZnVuY3Rpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisvKioKKyAqIFNldHMgdGhlIE1DVCBtYXRyaXggdG8gdXNlLgorICoKKyAqIEBwYXJhbQlwYXJhbWV0ZXJzCQl0aGUgcGFyYW1ldGVycyB0byBjaGFuZ2UuCisgKiBAcGFyYW0JcEVuY29kaW5nTWF0cml4CXRoZSBlbmNvZGluZyBtYXRyaXguCisgKiBAcGFyYW0JcF9kY19zaGlmdAkJdGhlIGRjIHNoaWZ0IGNvZWZmaWNpZW50cyB0byB1c2UuCisgKiBAcGFyYW0JcE5iQ29tcAkJCXRoZSBudW1iZXIgb2YgY29tcG9uZW50cyBvZiB0aGUgaW1hZ2UuCisgKgorICogQHJldHVybgl0cnVlIGlmIHRoZSBwYXJhbWV0ZXJzIGNvdWxkIGJlIHNldC4KKyAqLworT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3NldF9NQ1QoIG9wal9jcGFyYW1ldGVyc190ICpwYXJhbWV0ZXJzLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgIE9QSl9GTE9BVDMyICogcEVuY29kaW5nTWF0cml4LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgIE9QSl9JTlQzMiAqIHBfZGNfc2hpZnQsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgT1BKX1VJTlQzMiBwTmJDb21wKTsKKworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBPUEVOSlBFR19IICovCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvb3BqX2Nsb2NrLmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9jbG9jay5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvb3BqX2Nsb2NrLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX2Nsb2NrLmMKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9vcGpfY2xvY2suaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX2Nsb2NrLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9vcGpfY2xvY2suaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGpfY2xvY2suaApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL29wal9jb2RlYy5oIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGpfY29kZWMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL29wal9jb2RlYy5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9jb2RlYy5oCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvb3BqX2NvbmZpZy5oIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGpfY29uZmlnLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9vcGpfY29uZmlnLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX2NvbmZpZy5oCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvb3BqX2NvbmZpZy5oLmNtYWtlLmluIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGpfY29uZmlnLmguY21ha2UuaW4Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9vcGpfY29uZmlnLmguY21ha2UuaW4KcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX2NvbmZpZy5oLmNtYWtlLmluCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvb3BqX2NvbmZpZ19wcml2YXRlLmggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9jb25maWdfcHJpdmF0ZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvb3BqX2NvbmZpZ19wcml2YXRlLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX2NvbmZpZ19wcml2YXRlLmgKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX2luY2x1ZGVzLmggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9pbmNsdWRlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NTViN2MKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9pbmNsdWRlcy5oCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCisgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZSIAorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDUyBTeXN0ZW1lcyBkJ0luZm9ybWF0aW9uLCBGcmFuY2UKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgQVMgSVMnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgT1BKX0lOQ0xVREVTX0gKKyNkZWZpbmUgT1BKX0lOQ0xVREVTX0gKKworLyoKKyAqIFRoaXMgbXVzdCBiZSBpbmNsdWRlZCBiZWZvcmUgYW55IHN5c3RlbSBoZWFkZXJzLAorICogc2luY2UgdGhleSBjYW4gcmVhY3QgdG8gbWFjcm8gZGVmaW5lZCB0aGVyZQorICovCisjaW5jbHVkZSAib3BqX2NvbmZpZ19wcml2YXRlLmgiCisKKy8qCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgU3RhbmRhcmQgaW5jbHVkZXMgdXNlZCBieSB0aGUgbGlicmFyeQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworLyoKKyAgVXNlIGZzZWVrbygpIGFuZCBmdGVsbG8oKSBpZiB0aGV5IGFyZSBhdmFpbGFibGUgc2luY2UgdGhleSB1c2UKKyAgJ29mZl90JyByYXRoZXIgdGhhbiAnbG9uZycuICBJdCBpcyB3cm9uZyB0byB1c2UgZnNlZWtvKCkgYW5kCisgIGZ0ZWxsbygpIG9ubHkgb24gc3lzdGVtcyB3aXRoIHNwZWNpYWwgTEZTIHN1cHBvcnQgc2luY2Ugc29tZSBzeXN0ZW1zCisgIChlLmcuIEZyZWVCU0QpIHN1cHBvcnQgYSA2NC1iaXQgb2ZmX3QgYnkgZGVmYXVsdC4KKyovCisjaWYgZGVmaW5lZChPUEpfSEFWRV9GU0VFS08pICYmICFkZWZpbmVkKGZzZWVrKQorIyAgZGVmaW5lIGZzZWVrICBmc2Vla28KKyMgIGRlZmluZSBmdGVsbCAgZnRlbGxvCisjZW5kaWYKKworCisjaWYgZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoV2luZG93czk1KSAmJiAhZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIFwKKyAgIShkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA8IDE0MDApICYmIFwKKyAgIShkZWZpbmVkKF9fTUlOR1czMl9fKSAmJiBfX01TVkNSVF9WRVJTSU9OX18gPCAweDgwMCkKKyAgLyoKKyAgICBXaW5kb3dzICc5NSBhbmQgQm9ybGFuZCBDIGRvIG5vdCBzdXBwb3J0IF9sc2Vla2k2NAorICAgIFZpc3VhbCBTdHVkaW8gZG9lcyBub3Qgc3VwcG9ydCBfZnNlZWtpNjQgYW5kIF9mdGVsbGk2NCB1bnRpbCB0aGUgMjAwNSByZWxlYXNlLgorICAgIFdpdGhvdXQgdGhlc2UgaW50ZXJmYWNlcywgZmlsZXMgb3ZlciAyR0IgaW4gc2l6ZSBhcmUgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cy4KKyAgKi8KKyMgIGRlZmluZSBPUEpfRlNFRUsoc3RyZWFtLG9mZnNldCx3aGVuY2UpIF9mc2Vla2k2NChzdHJlYW0sLyogX19pbnQ2NCAqLyBvZmZzZXQsd2hlbmNlKQorIyAgZGVmaW5lIE9QSl9GU1RBVChmaWxkZXMsc3RhdF9idWZmKSBfZnN0YXRpNjQoZmlsZGVzLC8qIHN0cnVjdCBfc3RhdGk2NCAqLyBzdGF0X2J1ZmYpCisjICBkZWZpbmUgT1BKX0ZURUxMKHN0cmVhbSkgLyogX19pbnQ2NCAqLyBfZnRlbGxpNjQoc3RyZWFtKQorIyAgZGVmaW5lIE9QSl9TVEFUX1NUUlVDVF9UIHN0cnVjdCBfc3RhdGk2NAorIyAgZGVmaW5lIE9QSl9TVEFUKHBhdGgsc3RhdF9idWZmKSBfc3RhdGk2NChwYXRoLC8qIHN0cnVjdCBfc3RhdGk2NCAqLyBzdGF0X2J1ZmYpCisjZWxzZQorIyAgZGVmaW5lIE9QSl9GU0VFSyhzdHJlYW0sb2Zmc2V0LHdoZW5jZSkgZnNlZWsoc3RyZWFtLG9mZnNldCx3aGVuY2UpCisjICBkZWZpbmUgT1BKX0ZTVEFUKGZpbGRlcyxzdGF0X2J1ZmYpIGZzdGF0KGZpbGRlcyxzdGF0X2J1ZmYpCisjICBkZWZpbmUgT1BKX0ZURUxMKHN0cmVhbSkgZnRlbGwoc3RyZWFtKQorIyAgZGVmaW5lIE9QSl9TVEFUX1NUUlVDVF9UIHN0cnVjdCBzdGF0CisjICBkZWZpbmUgT1BKX1NUQVQocGF0aCxzdGF0X2J1ZmYpIHN0YXQocGF0aCxzdGF0X2J1ZmYpCisjZW5kaWYKKworCisvKgorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIE9wZW5KUEVHIGludGVyZmFjZQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworI2luY2x1ZGUgIm9wZW5qcGVnLmgiCisKKy8qCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgT3BlbkpQRUcgbW9kdWxlcworID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKy8qIElnbm9yZSBHQ0MgYXR0cmlidXRlcyBpZiB0aGlzIGlzIG5vdCBHQ0MgKi8KKyNpZm5kZWYgX19HTlVDX18KKwkjZGVmaW5lIF9fYXR0cmlidXRlX18oeCkgLyogX19hdHRyaWJ1dGVfXyh4KSAqLworI2VuZGlmCisKKworLyogQXJlIHJlc3RyaWN0ZWQgcG9pbnRlcnMgYXZhaWxhYmxlPyAoQzk5KSAqLworI2lmIChfX1NURENfVkVSU0lPTl9fICE9IDE5OTkwMUwpCisJLyogTm90IGEgQzk5IGNvbXBpbGVyICovCisJI2lmZGVmIF9fR05VQ19fCisJCSNkZWZpbmUgcmVzdHJpY3QgX19yZXN0cmljdF9fCisJI2Vsc2UKKwkJI2RlZmluZSByZXN0cmljdCAvKiByZXN0cmljdCAqLworCSNlbmRpZgorI2VuZGlmCisKKworCisvKiBNU1ZDIGJlZm9yZSAyMDEzIGFuZCBCb3JsYW5kIEMgZG8gbm90IGhhdmUgbHJpbnRmICovCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNpbmNsdWRlIDxpbnRyaW4uaD4KK3N0YXRpYyBJTkxJTkUgbG9uZyBvcGpfbHJpbnRmKGZsb2F0IGYpeworI2lmZGVmIF9NX1g2NAorCXJldHVybiBfbW1fY3Z0X3NzMnNpKF9tbV9sb2FkX3NzKCZmKSk7CisKKwkvKiBjb21tZW50ZWQgb3V0IGxpbmUgYnJlYWtzIG1hbnkgdGVzdHMgKi8KKyAgLyogcmV0dXJuIChsb25nKSgoZj4wLjBmKSA/IChmICsgMC41Zik6KGYgLTAuNWYpKTsgKi8KKyNlbGlmIGRlZmluZWQoX01fSVg4NikKKyAgICBpbnQgaTsKKyAgICAgX2FzbXsKKyAgICAgICAgZmxkIGYKKyAgICAgICAgZmlzdHAgaQorICAgIH07CisgCisgICAgcmV0dXJuIGk7CisjZWxzZSAKKwlyZXR1cm4gKGxvbmcpKChmPjAuMGYpID8gKGYgKyAwLjVmKSA6IChmIC0gMC41ZikpOworI2VuZGlmCit9CisjZWxpZiBkZWZpbmVkKF9fQk9STEFORENfXykKK3N0YXRpYyBJTkxJTkUgbG9uZyBvcGpfbHJpbnRmKGZsb2F0IGYpIHsKKyNpZmRlZiBfTV9YNjQKKyAgICAgcmV0dXJuIChsb25nKSgoZj4wLjBmKSA/IChmICsgMC41Zik6KGYgLTAuNWYpKTsKKyNlbHNlCisJaW50IGk7CisKKwlfYXNtIHsKKwkJZmxkIGYKKwkJCWZpc3RwIGkKKwl9OworCisJcmV0dXJuIGk7CisjZW5kaWYKK30KKyNlbHNlCitzdGF0aWMgSU5MSU5FIGxvbmcgb3BqX2xyaW50ZihmbG9hdCBmKSB7CisJcmV0dXJuIGxyaW50ZihmKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSIDwgMTQwMCkKKwkjZGVmaW5lIHZzbnByaW50ZiBfdnNucHJpbnRmCisjZW5kaWYKKworLyogTVNWQyB4ODYgaXMgcmVhbGx5IGJhZCBhdCBkb2luZyBpbnQ2NCA9IGludDMyICogaW50MzIgb24gaXRzIG93bi4gVXNlIGludHJpbnNpYy4gKi8KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTQwMCkgJiYgIWRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgJiYgZGVmaW5lZChfTV9JWDg2KQorIwlpbmNsdWRlIDxpbnRyaW4uaD4KKyMJcHJhZ21hIGludHJpbnNpYyhfX2VtdWwpCisjZW5kaWYKKworI2luY2x1ZGUgIm9wal9pbnR0eXBlcy5oIgorI2luY2x1ZGUgIm9wal9jbG9jay5oIgorI2luY2x1ZGUgIm9wal9tYWxsb2MuaCIKKyNpbmNsdWRlICJldmVudC5oIgorI2luY2x1ZGUgImZ1bmN0aW9uX2xpc3QuaCIKKyNpbmNsdWRlICJiaW8uaCIKKyNpbmNsdWRlICJjaW8uaCIKKworI2luY2x1ZGUgImltYWdlLmgiCisjaW5jbHVkZSAiaW52ZXJ0LmgiCisjaW5jbHVkZSAiajJrLmgiCisjaW5jbHVkZSAianAyLmgiCisKKyNpbmNsdWRlICJtcWMuaCIKKyNpbmNsdWRlICJyYXcuaCIKKyNpbmNsdWRlICJiaW8uaCIKKworI2luY2x1ZGUgInBpLmgiCisjaW5jbHVkZSAidGd0LmgiCisjaW5jbHVkZSAidGNkLmgiCisjaW5jbHVkZSAidDEuaCIKKyNpbmNsdWRlICJkd3QuaCIKKyNpbmNsdWRlICJ0Mi5oIgorI2luY2x1ZGUgIm1jdC5oIgorI2luY2x1ZGUgIm9wal9pbnRtYXRoLmgiCisKKyNpZmRlZiBVU0VfSlBJUAorI2luY2x1ZGUgImNpZHhfbWFuYWdlci5oIgorI2luY2x1ZGUgImluZGV4Ym94X21hbmFnZXIuaCIKKyNlbmRpZgorCisvKiBKUFdMPj4gKi8KKyNpZmRlZiBVU0VfSlBXTAorI2luY2x1ZGUgIm9wZW5qcHdsL2pwd2wuaCIKKyNlbmRpZiAvKiBVU0VfSlBXTCAqLworLyogPDxKUFdMICovCisKKy8qIFYyICovCisjaW5jbHVkZSAib3BqX2NvZGVjLmgiCisKKworI2VuZGlmIC8qIE9QSl9JTkNMVURFU19IICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9pbnRtYXRoLmggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9pbnRtYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y3OTM0YwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX2ludG1hdGguaApAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzIAorICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIAorICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cworICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBVbml2ZXJzaXRlIGNhdGhvbGlxdWUgZGUgTG91dmFpbiAoVUNMKSwgQmVsZ2l1bQorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFByb2Zlc3NvciBCZW5vaXQgTWFjcQorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMsIERhdmlkIEphbnNzZW5zCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgWWFubmljayBWZXJzY2h1ZXJlbgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4IAorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTQsIEFudG9uaW4gRGVzY2FtcGUKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBfX0lOVF9ICisjZGVmaW5lIF9fSU5UX0gKKy8qKgorQGZpbGUgb3BqX2ludG1hdGguaAorQGJyaWVmIEltcGxlbWVudGF0aW9uIG9mIG9wZXJhdGlvbnMgb24gaW50ZWdlcnMgKElOVCkKKworVGhlIGZ1bmN0aW9ucyBpbiBPUEpfSU5UTUFUSC5IIGhhdmUgZm9yIGdvYWwgdG8gcmVhbGl6ZSBvcGVyYXRpb25zIG9uIGludGVnZXJzLgorKi8KKworLyoqIEBkZWZncm91cCBPUEpfSU5UTUFUSCBPUEpfSU5UTUFUSCAtIEltcGxlbWVudGF0aW9uIG9mIG9wZXJhdGlvbnMgb24gaW50ZWdlcnMgKi8KKy8qQHsqLworCisvKiogQG5hbWUgRXhwb3J0ZWQgZnVuY3Rpb25zIChzZWUgYWxzbyBvcGVuanBlZy5oKSAqLworLypAeyovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoqCitHZXQgdGhlIG1pbmltdW0gb2YgdHdvIGludGVnZXJzCitAcmV0dXJuIFJldHVybnMgYSBpZiBhIDwgYiBlbHNlIGIKKyovCitzdGF0aWMgSU5MSU5FIE9QSl9JTlQzMiBvcGpfaW50X21pbihPUEpfSU5UMzIgYSwgT1BKX0lOVDMyIGIpIHsKKwlyZXR1cm4gYSA8IGIgPyBhIDogYjsKK30KKworLyoqCitHZXQgdGhlIG1pbmltdW0gb2YgdHdvIGludGVnZXJzCitAcmV0dXJuIFJldHVybnMgYSBpZiBhIDwgYiBlbHNlIGIKKyovCitzdGF0aWMgSU5MSU5FIE9QSl9VSU5UMzIgb3BqX3VpbnRfbWluKE9QSl9VSU5UMzIgYSwgT1BKX1VJTlQzMiBiKSB7CisJcmV0dXJuIGEgPCBiID8gYSA6IGI7Cit9CisKKy8qKgorR2V0IHRoZSBtYXhpbXVtIG9mIHR3byBpbnRlZ2VycworQHJldHVybiBSZXR1cm5zIGEgaWYgYSA+IGIgZWxzZSBiCisqLworc3RhdGljIElOTElORSBPUEpfSU5UMzIgb3BqX2ludF9tYXgoT1BKX0lOVDMyIGEsIE9QSl9JTlQzMiBiKSB7CisJcmV0dXJuIChhID4gYikgPyBhIDogYjsKK30KKworLyoqCitHZXQgdGhlIG1heGltdW0gb2YgdHdvIGludGVnZXJzCitAcmV0dXJuIFJldHVybnMgYSBpZiBhID4gYiBlbHNlIGIKKyovCitzdGF0aWMgSU5MSU5FIE9QSl9VSU5UMzIgb3BqX3VpbnRfbWF4KE9QSl9VSU5UMzIgIGEsIE9QSl9VSU5UMzIgIGIpIHsKKwlyZXR1cm4gKGEgPiBiKSA/IGEgOiBiOworfQorCisvKioKKyBHZXQgdGhlIHNhdHVyYXRlZCBzdW0gb2YgdHdvIHVuc2lnbmVkIGludGVnZXJzCisgQHJldHVybiBSZXR1cm5zIHNhdHVyYXRlZCBzdW0gb2YgYStiCisgKi8KK3N0YXRpYyBJTkxJTkUgT1BKX1VJTlQzMiBvcGpfdWludF9hZGRzKE9QSl9VSU5UMzIgYSwgT1BKX1VJTlQzMiBiKSB7CisJT1BKX1VJTlQ2NCBzdW0gPSAoT1BKX1VJTlQ2NClhICsgKE9QSl9VSU5UNjQpYjsKKwlyZXR1cm4gKE9QSl9VSU5UMzIpKC0oT1BKX0lOVDMyKShzdW0gPj4gMzIpKSB8IChPUEpfVUlOVDMyKXN1bTsKK30KKworLyoqCitDbGFtcCBhbiBpbnRlZ2VyIGluc2lkZSBhbiBpbnRlcnZhbAorQHJldHVybgorPHVsPgorPGxpPlJldHVybnMgYSBpZiAobWluIDwgYSA8IG1heCkKKzxsaT5SZXR1cm5zIG1heCBpZiAoYSA+IG1heCkKKzxsaT5SZXR1cm5zIG1pbiBpZiAoYSA8IG1pbikgCis8L3VsPgorKi8KK3N0YXRpYyBJTkxJTkUgT1BKX0lOVDMyIG9wal9pbnRfY2xhbXAoT1BKX0lOVDMyIGEsIE9QSl9JTlQzMiBtaW4sIE9QSl9JTlQzMiBtYXgpIHsKKwlpZiAoYSA8IG1pbikKKwkJcmV0dXJuIG1pbjsKKwlpZiAoYSA+IG1heCkKKwkJcmV0dXJuIG1heDsKKwlyZXR1cm4gYTsKK30KKy8qKgorQHJldHVybiBHZXQgYWJzb2x1dGUgdmFsdWUgb2YgaW50ZWdlcgorKi8KK3N0YXRpYyBJTkxJTkUgT1BKX0lOVDMyIG9wal9pbnRfYWJzKE9QSl9JTlQzMiBhKSB7CisJcmV0dXJuIGEgPCAwID8gLWEgOiBhOworfQorLyoqCitEaXZpZGUgYW4gaW50ZWdlciBhbmQgcm91bmQgdXB3YXJkcworQHJldHVybiBSZXR1cm5zIGEgZGl2aWRlZCBieSBiCisqLworc3RhdGljIElOTElORSBPUEpfSU5UMzIgb3BqX2ludF9jZWlsZGl2KE9QSl9JTlQzMiBhLCBPUEpfSU5UMzIgYikgeworCWFzc2VydChiKTsKKwlyZXR1cm4gKGEgKyBiIC0gMSkgLyBiOworfQorCisvKioKK0RpdmlkZSBhbiBpbnRlZ2VyIGFuZCByb3VuZCB1cHdhcmRzCitAcmV0dXJuIFJldHVybnMgYSBkaXZpZGVkIGJ5IGIKKyovCitzdGF0aWMgSU5MSU5FIE9QSl9VSU5UMzIgIG9wal91aW50X2NlaWxkaXYoT1BKX1VJTlQzMiAgYSwgT1BKX1VJTlQzMiAgYikgeworCWFzc2VydChiKTsKKwlyZXR1cm4gKGEgKyBiIC0gMSkgLyBiOworfQorCisvKioKK0RpdmlkZSBhbiBpbnRlZ2VyIGJ5IGEgcG93ZXIgb2YgMiBhbmQgcm91bmQgdXB3YXJkcworQHJldHVybiBSZXR1cm5zIGEgZGl2aWRlZCBieSAyXmIKKyovCitzdGF0aWMgSU5MSU5FIE9QSl9JTlQzMiBvcGpfaW50X2NlaWxkaXZwb3cyKE9QSl9JTlQzMiBhLCBPUEpfSU5UMzIgYikgeworCXJldHVybiAoT1BKX0lOVDMyKSgoYSArICgoT1BKX0lOVDY0KTEgPDwgYikgLSAxKSA+PiBiKTsKK30KKworLyoqCisgRGl2aWRlIGEgNjRiaXRzIGludGVnZXIgYnkgYSBwb3dlciBvZiAyIGFuZCByb3VuZCB1cHdhcmRzCisgQHJldHVybiBSZXR1cm5zIGEgZGl2aWRlZCBieSAyXmIKKyAqLworc3RhdGljIElOTElORSBPUEpfSU5UMzIgb3BqX2ludDY0X2NlaWxkaXZwb3cyKE9QSl9JTlQ2NCBhLCBPUEpfSU5UMzIgYikgeworCXJldHVybiAoT1BKX0lOVDMyKSgoYSArICgoT1BKX0lOVDY0KTEgPDwgYikgLSAxKSA+PiBiKTsKK30KKworLyoqCisgRGl2aWRlIGFuIGludGVnZXIgYnkgYSBwb3dlciBvZiAyIGFuZCByb3VuZCB1cHdhcmRzCisgQHJldHVybiBSZXR1cm5zIGEgZGl2aWRlZCBieSAyXmIKKyAqLworc3RhdGljIElOTElORSBPUEpfVUlOVDMyIG9wal91aW50X2NlaWxkaXZwb3cyKE9QSl9VSU5UMzIgYSwgT1BKX1VJTlQzMiBiKSB7CisJcmV0dXJuIChPUEpfVUlOVDMyKSgoYSArICgoT1BKX1VJTlQ2NCkxVSA8PCBiKSAtIDFVKSA+PiBiKTsKK30KKworLyoqCitEaXZpZGUgYW4gaW50ZWdlciBieSBhIHBvd2VyIG9mIDIgYW5kIHJvdW5kIGRvd253YXJkcworQHJldHVybiBSZXR1cm5zIGEgZGl2aWRlZCBieSAyXmIKKyovCitzdGF0aWMgSU5MSU5FIE9QSl9JTlQzMiBvcGpfaW50X2Zsb29yZGl2cG93MihPUEpfSU5UMzIgYSwgT1BKX0lOVDMyIGIpIHsKKwlyZXR1cm4gYSA+PiBiOworfQorLyoqCitHZXQgbG9nYXJpdGhtIG9mIGFuIGludGVnZXIgYW5kIHJvdW5kIGRvd253YXJkcworQHJldHVybiBSZXR1cm5zIGxvZzIoYSkKKyovCitzdGF0aWMgSU5MSU5FIE9QSl9JTlQzMiBvcGpfaW50X2Zsb29ybG9nMihPUEpfSU5UMzIgYSkgeworCU9QSl9JTlQzMiBsOworCWZvciAobCA9IDA7IGEgPiAxOyBsKyspIHsKKwkJYSA+Pj0gMTsKKwl9CisJcmV0dXJuIGw7Cit9CisvKioKK0dldCBsb2dhcml0aG0gb2YgYW4gaW50ZWdlciBhbmQgcm91bmQgZG93bndhcmRzCitAcmV0dXJuIFJldHVybnMgbG9nMihhKQorKi8KK3N0YXRpYyBJTkxJTkUgT1BKX1VJTlQzMiAgb3BqX3VpbnRfZmxvb3Jsb2cyKE9QSl9VSU5UMzIgIGEpIHsKKwlPUEpfVUlOVDMyICBsOworCWZvciAobCA9IDA7IGEgPiAxOyArK2wpCisJeworCQlhID4+PSAxOworCX0KKwlyZXR1cm4gbDsKK30KKworLyoqCitNdWx0aXBseSB0d28gZml4ZWQtcHJlY2lzaW9uIHJhdGlvbmFsIG51bWJlcnMuCitAcGFyYW0gYQorQHBhcmFtIGIKK0ByZXR1cm4gUmV0dXJucyBhICogYgorKi8KK3N0YXRpYyBJTkxJTkUgT1BKX0lOVDMyIG9wal9pbnRfZml4X211bChPUEpfSU5UMzIgYSwgT1BKX0lOVDMyIGIpIHsKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTQwMCkgJiYgIWRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgJiYgZGVmaW5lZChfTV9JWDg2KQorCU9QSl9JTlQ2NCB0ZW1wID0gX19lbXVsKGEsIGIpOworI2Vsc2UKKwlPUEpfSU5UNjQgdGVtcCA9IChPUEpfSU5UNjQpIGEgKiAoT1BKX0lOVDY0KSBiIDsKKyNlbmRpZgorCXRlbXAgKz0gNDA5NjsKKwlhc3NlcnQoKHRlbXAgPj4gMTMpIDw9IChPUEpfSU5UNjQpMHg3RkZGRkZGRik7CisJYXNzZXJ0KCh0ZW1wID4+IDEzKSA+PSAoLShPUEpfSU5UNjQpMHg3RkZGRkZGRiAtIChPUEpfSU5UNjQpMSkpOworCXJldHVybiAoT1BKX0lOVDMyKSAodGVtcCA+PiAxMyk7Cit9CisKK3N0YXRpYyBJTkxJTkUgT1BKX0lOVDMyIG9wal9pbnRfZml4X211bF90MShPUEpfSU5UMzIgYSwgT1BKX0lOVDMyIGIpIHsKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTQwMCkgJiYgIWRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgJiYgZGVmaW5lZChfTV9JWDg2KQorCU9QSl9JTlQ2NCB0ZW1wID0gX19lbXVsKGEsIGIpOworI2Vsc2UKKwlPUEpfSU5UNjQgdGVtcCA9IChPUEpfSU5UNjQpIGEgKiAoT1BKX0lOVDY0KSBiIDsKKyNlbmRpZgorCXRlbXAgKz0gNDA5NjsKKwlhc3NlcnQoKHRlbXAgPj4gKDEzICsgMTEgLSBUMV9OTVNFREVDX0ZSQUNCSVRTKSkgPD0gKE9QSl9JTlQ2NCkweDdGRkZGRkZGKTsKKwlhc3NlcnQoKHRlbXAgPj4gKDEzICsgMTEgLSBUMV9OTVNFREVDX0ZSQUNCSVRTKSkgPj0gKC0oT1BKX0lOVDY0KTB4N0ZGRkZGRkYgLSAoT1BKX0lOVDY0KTEpKTsKKwlyZXR1cm4gKE9QSl9JTlQzMikgKHRlbXAgPj4gKDEzICsgMTEgLSBUMV9OTVNFREVDX0ZSQUNCSVRTKSkgOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLypAfSovCisKKy8qQH0qLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9vcGpfaW50dHlwZXMuaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX2ludHR5cGVzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9vcGpfaW50dHlwZXMuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGpfaW50dHlwZXMuaApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGpfbWFsbG9jLmggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9tYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTc3MDdmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGpfbWFsbG9jLmgKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKKyAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKKyAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKKyAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KKyAqIENvcHlyaWdodCAoYykgMjAwNywgQ2FsbHVtIExlcndpY2sgPHNlZ0BoYXh4ZWQuY29tPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBfX09QSl9NQUxMT0NfSAorI2RlZmluZSBfX09QSl9NQUxMT0NfSAorLyoqCitAZmlsZSBvcGpfbWFsbG9jLmgKK0BicmllZiBJbnRlcm5hbCBmdW5jdGlvbnMKKworVGhlIGZ1bmN0aW9ucyBpbiBvcGpfbWFsbG9jLmggYXJlIGludGVybmFsIHV0aWxpdGllcyB1c2VkIGZvciBtZW1vcnkgbWFuYWdlbWVudC4KKyovCisKKy8qKiBAZGVmZ3JvdXAgTUlTQyBNSVNDIC0gTWlzY2VsbGFuZW91cyBpbnRlcm5hbCBmdW5jdGlvbnMgKi8KKy8qQHsqLworCisvKiogQG5hbWUgRXhwb3J0ZWQgZnVuY3Rpb25zICovCisvKkB7Ki8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorQWxsb2NhdGUgYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgYmxvY2sKK0BwYXJhbSBzaXplIEJ5dGVzIHRvIGFsbG9jYXRlCitAcmV0dXJuIFJldHVybnMgYSB2b2lkIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBzcGFjZSwgb3IgTlVMTCBpZiB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgbWVtb3J5IGF2YWlsYWJsZQorKi8KKyNpZmRlZiBBTExPQ19QRVJGX09QVAordm9pZCAqIE9QSl9DQUxMQ09OViBvcGpfbWFsbG9jKHNpemVfdCBzaXplKTsKKyNlbHNlCisvKiBwcmV2ZW50IGFzc2VydGlvbiBvbiBvdmVyZmxvdyBmb3IgTVNWQyAqLworI2lmZGVmIF9NU0NfVkVSCisjZGVmaW5lIG9wal9tYWxsb2Moc2l6ZSkgKChzaXplX3QpKHNpemUpID49IChzaXplX3QpLTB4MTAwID8gTlVMTCA6IG1hbGxvYyhzaXplKSkKKyNlbHNlCisjZGVmaW5lIG9wal9tYWxsb2Moc2l6ZSkgbWFsbG9jKHNpemUpCisjZW5kaWYKKyNlbmRpZgorCisvKioKK0FsbG9jYXRlIGEgbWVtb3J5IGJsb2NrIHdpdGggZWxlbWVudHMgaW5pdGlhbGl6ZWQgdG8gMAorQHBhcmFtIG51bSBCbG9ja3MgdG8gYWxsb2NhdGUKK0BwYXJhbSBzaXplIEJ5dGVzIHBlciBibG9jayB0byBhbGxvY2F0ZQorQHJldHVybiBSZXR1cm5zIGEgdm9pZCBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgc3BhY2UsIG9yIE5VTEwgaWYgdGhlcmUgaXMgaW5zdWZmaWNpZW50IG1lbW9yeSBhdmFpbGFibGUKKyovCisjaWZkZWYgQUxMT0NfUEVSRl9PUFQKK3ZvaWQgKiBPUEpfQ0FMTENPTlYgb3BqX2NhbGxvYyhzaXplX3QgX051bU9mRWxlbWVudHMsIHNpemVfdCBfU2l6ZU9mRWxlbWVudHMpOworI2Vsc2UKKy8qIHByZXZlbnQgYXNzZXJ0aW9uIG9uIG92ZXJmbG93IGZvciBNU1ZDICovCisjaWZkZWYgX01TQ19WRVIKKyNkZWZpbmUgb3BqX2NhbGxvYyhudW0sIHNpemUpICgoc2l6ZV90KShudW0pICE9IDAgJiYgKHNpemVfdCkobnVtKSA+PSAoc2l6ZV90KS0weDEwMCAvIChzaXplX3QpKHNpemUpID8gTlVMTCA6IGNhbGxvYyhudW0sIHNpemUpKQorI2Vsc2UKKyNkZWZpbmUgb3BqX2NhbGxvYyhudW0sIHNpemUpIGNhbGxvYyhudW0sIHNpemUpCisjZW5kaWYKKyNlbmRpZgorCisvKioKK0FsbG9jYXRlIG1lbW9yeSBhbGlnbmVkIHRvIGEgMTYgYnl0ZSBib3VuZGFyeQorQHBhcmFtIHNpemUgQnl0ZXMgdG8gYWxsb2NhdGUKK0ByZXR1cm4gUmV0dXJucyBhIHZvaWQgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIHNwYWNlLCBvciBOVUxMIGlmIHRoZXJlIGlzIGluc3VmZmljaWVudCBtZW1vcnkgYXZhaWxhYmxlCisqLworLyogRklYTUU6IFRoZXNlIHNob3VsZCBiZSBzZXQgd2l0aCBjbWFrZSB0ZXN0cywgYnV0IHdlJ3JlIGN1cnJlbnRseSBub3QgcmVxdWlyaW5nIHVzZSBvZiBjbWFrZSAqLworI2lmZGVmIF9XSU4zMgorCS8qIFNvbWVvbmUgc2hvdWxkIHRlbGwgdGhlIG1pbmd3IHBlb3BsZSB0aGF0IHRoZWlyIG1hbGxvYy5oIG91Z2h0IHRvIHByb3ZpZGUgX21tX21hbGxvYygpICovCisJI2lmZGVmIF9fR05VQ19fCisJCSNpbmNsdWRlIDxtbV9tYWxsb2MuaD4KKwkJI2RlZmluZSBIQVZFX01NX01BTExPQworCSNlbHNlIC8qIE1TVkMsIEludGVsIEMrKyAqLworCQkjaW5jbHVkZSA8bWFsbG9jLmg+CisJCSNpZmRlZiBfbW1fbWFsbG9jCisJCQkjZGVmaW5lIEhBVkVfTU1fTUFMTE9DCisJCSNlbmRpZgorCSNlbmRpZgorI2Vsc2UgLyogTm90IF9XSU4zMiAqLworCSNpZiBkZWZpbmVkKF9fc3VuKQorCQkjZGVmaW5lIEhBVkVfTUVNQUxJR04KKyAgI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykKKyAgICAjZGVmaW5lIEhBVkVfUE9TSVhfTUVNQUxJR04KKwkvKiBMaW51eCB4ODZfNjQgYW5kIE9TWCBhbHdheXMgYWxpZ24gYWxsb2NhdGlvbnMgdG8gMTYgYnl0ZXMgKi8KKwkjZWxpZiAhZGVmaW5lZChfX2FtZDY0X18pICYmICFkZWZpbmVkKF9fQVBQTEVfXykgJiYgIWRlZmluZWQoX0FJWCkKKwkJI2RlZmluZSBIQVZFX01FTUFMSUdOCisJCSNpbmNsdWRlIDxtYWxsb2MuaD4JCQkKKwkjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIG9wal9hbGlnbmVkX21hbGxvYyhzaXplKSBtYWxsb2Moc2l6ZSkKKyNkZWZpbmUgb3BqX2FsaWduZWRfZnJlZShtKSBmcmVlKG0pCisKKyNpZmRlZiBIQVZFX01NX01BTExPQworCSN1bmRlZiBvcGpfYWxpZ25lZF9tYWxsb2MKKwkjZGVmaW5lIG9wal9hbGlnbmVkX21hbGxvYyhzaXplKSBfbW1fbWFsbG9jKHNpemUsIDE2KQorCSN1bmRlZiBvcGpfYWxpZ25lZF9mcmVlCisJI2RlZmluZSBvcGpfYWxpZ25lZF9mcmVlKG0pIF9tbV9mcmVlKG0pCisjZW5kaWYKKworI2lmZGVmIEhBVkVfTUVNQUxJR04KKwlleHRlcm4gdm9pZCogbWVtYWxpZ24oc2l6ZV90LCBzaXplX3QpOworCSN1bmRlZiBvcGpfYWxpZ25lZF9tYWxsb2MKKwkjZGVmaW5lIG9wal9hbGlnbmVkX21hbGxvYyhzaXplKSBtZW1hbGlnbigxNiwgKHNpemUpKQorCSN1bmRlZiBvcGpfYWxpZ25lZF9mcmVlCisJI2RlZmluZSBvcGpfYWxpZ25lZF9mcmVlKG0pIGZyZWUobSkKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9QT1NJWF9NRU1BTElHTgorCSN1bmRlZiBvcGpfYWxpZ25lZF9tYWxsb2MKKwlleHRlcm4gaW50IHBvc2l4X21lbWFsaWduKHZvaWQqKiwgc2l6ZV90LCBzaXplX3QpOworCisJc3RhdGljIElOTElORSB2b2lkKiBfX2F0dHJpYnV0ZV9fICgobWFsbG9jKSkgb3BqX2FsaWduZWRfbWFsbG9jKHNpemVfdCBzaXplKXsKKwkJdm9pZCogbWVtID0gTlVMTDsKKwkJcG9zaXhfbWVtYWxpZ24oJm1lbSwgMTYsIHNpemUpOworCQlyZXR1cm4gbWVtOworCX0KKwkjdW5kZWYgb3BqX2FsaWduZWRfZnJlZQorCSNkZWZpbmUgb3BqX2FsaWduZWRfZnJlZShtKSBmcmVlKG0pCisjZW5kaWYKKworI2lmZGVmIEFMTE9DX1BFUkZfT1BUCisJI3VuZGVmIG9wal9hbGlnbmVkX21hbGxvYworCSNkZWZpbmUgb3BqX2FsaWduZWRfbWFsbG9jKHNpemUpIG9wal9tYWxsb2Moc2l6ZSkKKwkjdW5kZWYgb3BqX2FsaWduZWRfZnJlZQorCSNkZWZpbmUgb3BqX2FsaWduZWRfZnJlZShtKSBvcGpfZnJlZShtKQorI2VuZGlmCisKKy8qKgorUmVhbGxvY2F0ZSBtZW1vcnkgYmxvY2tzLgorQHBhcmFtIG0gUG9pbnRlciB0byBwcmV2aW91c2x5IGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sKK0BwYXJhbSBzIE5ldyBzaXplIGluIGJ5dGVzCitAcmV0dXJuIFJldHVybnMgYSB2b2lkIHBvaW50ZXIgdG8gdGhlIHJlYWxsb2NhdGVkIChhbmQgcG9zc2libHkgbW92ZWQpIG1lbW9yeSBibG9jaworKi8KKyNpZmRlZiBBTExPQ19QRVJGX09QVAordm9pZCAqIE9QSl9DQUxMQ09OViBvcGpfcmVhbGxvYyh2b2lkICogbSwgc2l6ZV90IHMpOworI2Vsc2UKKy8qIHByZXZlbnQgYXNzZXJ0aW9uIG9uIG92ZXJmbG93IGZvciBNU1ZDICovCisjaWZkZWYgX01TQ19WRVIKKyNkZWZpbmUgb3BqX3JlYWxsb2MobSwgcykgKChzaXplX3QpKHMpID49IChzaXplX3QpLTB4MTAwID8gTlVMTCA6IHJlYWxsb2MobSwgcykpCisjZWxzZQorI2RlZmluZSBvcGpfcmVhbGxvYyhtLCBzKSByZWFsbG9jKG0sIHMpCisjZW5kaWYKKyNlbmRpZgorCisvKioKK0RlYWxsb2NhdGVzIG9yIGZyZWVzIGEgbWVtb3J5IGJsb2NrLgorQHBhcmFtIG0gUHJldmlvdXNseSBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrIHRvIGJlIGZyZWVkCisqLworI2lmZGVmIEFMTE9DX1BFUkZfT1BUCit2b2lkIE9QSl9DQUxMQ09OViBvcGpfZnJlZSh2b2lkICogbSk7CisjZWxzZQorI2RlZmluZSBvcGpfZnJlZShtKSBmcmVlKG0pCisjZW5kaWYKKworI2lmZGVmIF9fR05VQ19fCisjcHJhZ21hIEdDQyBwb2lzb24gbWFsbG9jIGNhbGxvYyByZWFsbG9jIGZyZWUKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLypAfSovCisKKy8qQH0qLworCisjZW5kaWYgLyogX19PUEpfTUFMTE9DX0ggKi8KKwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL29wal9zdGRpbnQuaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX3N0ZGludC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvb3BqX3N0ZGludC5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9zdGRpbnQuaApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9waS5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9waS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MmUwN2MKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3BpLmMKQEAgLTAsMCArMSwxODkzIEBACisvKgorICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCisgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFVuaXZlcnNpdGUgY2F0aG9saXF1ZSBkZSBMb3V2YWluIChVQ0wpLCBCZWxnaXVtCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQorICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNywgUGFydmF0aGEgRWxhbmdvdmFuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJvcGpfaW5jbHVkZXMuaCIKKworLyoqIEBkZWZncm91cCBQSSBQSSAtIEltcGxlbWVudGF0aW9uIG9mIGEgcGFja2V0IGl0ZXJhdG9yICovCisvKkB7Ki8KKworLyoqIEBuYW1lIExvY2FsIHN0YXRpYyBmdW5jdGlvbnMgKi8KKy8qQHsqLworCisvKioKK0dldCBuZXh0IHBhY2tldCBpbiBsYXllci1yZXNvbHV0aW9uLWNvbXBvbmVudC1wcmVjaW5jdCBvcmRlci4KK0BwYXJhbSBwaSBwYWNrZXQgaXRlcmF0b3IgdG8gbW9kaWZ5CitAcmV0dXJuIHJldHVybnMgZmFsc2UgaWYgcGkgcG9pbnRlZCB0byB0aGUgbGFzdCBwYWNrZXQgb3IgZWxzZSByZXR1cm5zIHRydWUKKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX3BpX25leHRfbHJjcChvcGpfcGlfaXRlcmF0b3JfdCAqIHBpKTsKKy8qKgorR2V0IG5leHQgcGFja2V0IGluIHJlc29sdXRpb24tbGF5ZXItY29tcG9uZW50LXByZWNpbmN0IG9yZGVyLgorQHBhcmFtIHBpIHBhY2tldCBpdGVyYXRvciB0byBtb2RpZnkKK0ByZXR1cm4gcmV0dXJucyBmYWxzZSBpZiBwaSBwb2ludGVkIHRvIHRoZSBsYXN0IHBhY2tldCBvciBlbHNlIHJldHVybnMgdHJ1ZQorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfcGlfbmV4dF9ybGNwKG9wal9waV9pdGVyYXRvcl90ICogcGkpOworLyoqCitHZXQgbmV4dCBwYWNrZXQgaW4gcmVzb2x1dGlvbi1wcmVjaW5jdC1jb21wb25lbnQtbGF5ZXIgb3JkZXIuCitAcGFyYW0gcGkgcGFja2V0IGl0ZXJhdG9yIHRvIG1vZGlmeQorQHJldHVybiByZXR1cm5zIGZhbHNlIGlmIHBpIHBvaW50ZWQgdG8gdGhlIGxhc3QgcGFja2V0IG9yIGVsc2UgcmV0dXJucyB0cnVlCisqLworc3RhdGljIE9QSl9CT09MIG9wal9waV9uZXh0X3JwY2wob3BqX3BpX2l0ZXJhdG9yX3QgKiBwaSk7CisvKioKK0dldCBuZXh0IHBhY2tldCBpbiBwcmVjaW5jdC1jb21wb25lbnQtcmVzb2x1dGlvbi1sYXllciBvcmRlci4KK0BwYXJhbSBwaSBwYWNrZXQgaXRlcmF0b3IgdG8gbW9kaWZ5CitAcmV0dXJuIHJldHVybnMgZmFsc2UgaWYgcGkgcG9pbnRlZCB0byB0aGUgbGFzdCBwYWNrZXQgb3IgZWxzZSByZXR1cm5zIHRydWUKKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX3BpX25leHRfcGNybChvcGpfcGlfaXRlcmF0b3JfdCAqIHBpKTsKKy8qKgorR2V0IG5leHQgcGFja2V0IGluIGNvbXBvbmVudC1wcmVjaW5jdC1yZXNvbHV0aW9uLWxheWVyIG9yZGVyLgorQHBhcmFtIHBpIHBhY2tldCBpdGVyYXRvciB0byBtb2RpZnkKK0ByZXR1cm4gcmV0dXJucyBmYWxzZSBpZiBwaSBwb2ludGVkIHRvIHRoZSBsYXN0IHBhY2tldCBvciBlbHNlIHJldHVybnMgdHJ1ZQorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfcGlfbmV4dF9jcHJsKG9wal9waV9pdGVyYXRvcl90ICogcGkpOworCisvKioKKyAqIFVwZGF0ZXMgdGhlIGNvZGluZyBwYXJhbWV0ZXJzIGlmIHRoZSBlbmNvZGluZyBpcyB1c2VkIHdpdGggUHJvZ3Jlc3Npb24gb3JkZXIgY2hhbmdlcyBhbmQgZmluYWwgKG9yIGNpbmVtYSBwYXJhbWV0ZXJzIGFyZSB1c2VkKS4KKyAqCisgKiBAcGFyYW0JcF9jcAkJdGhlIGNvZGluZyBwYXJhbWV0ZXJzIHRvIG1vZGlmeQorICogQHBhcmFtCXBfdGlsZW5vCXRoZSB0aWxlIGluZGV4IGJlaW5nIGNvbmNlcm5lZC4KKyAqIEBwYXJhbQlwX3R4MAkJWDAgcGFyYW1ldGVyIGZvciB0aGUgdGlsZQorICogQHBhcmFtCXBfdHgxCQlYMSBwYXJhbWV0ZXIgZm9yIHRoZSB0aWxlCisgKiBAcGFyYW0JcF90eTAJCVkwIHBhcmFtZXRlciBmb3IgdGhlIHRpbGUKKyAqIEBwYXJhbQlwX3R5MQkJWTEgcGFyYW1ldGVyIGZvciB0aGUgdGlsZQorICogQHBhcmFtCXBfbWF4X3ByZWMJdGhlIG1heGltdW0gcHJlY2lzaW9uIGZvciBhbGwgdGhlIGJhbmRzIG9mIHRoZSB0aWxlCisgKiBAcGFyYW0JcF9tYXhfcmVzCXRoZSBtYXhpbXVtIG51bWJlciBvZiByZXNvbHV0aW9ucyBmb3IgYWxsIHRoZSBwb2MgaW5zaWRlIHRoZSB0aWxlLgorICogQHBhcmFtCXBfZHhfbWluCQl0aGUgbWluaW11bSBkeCBvZiBhbGwgdGhlIGNvbXBvbmVudHMgb2YgYWxsIHRoZSByZXNvbHV0aW9ucyBmb3IgdGhlIHRpbGUuCisgKiBAcGFyYW0JcF9keV9taW4JCXRoZSBtaW5pbXVtIGR5IG9mIGFsbCB0aGUgY29tcG9uZW50cyBvZiBhbGwgdGhlIHJlc29sdXRpb25zIGZvciB0aGUgdGlsZS4KKyAqLworc3RhdGljIHZvaWQgb3BqX3BpX3VwZGF0ZV9lbmNvZGVfcG9jX2FuZF9maW5hbCAoIG9wal9jcF90ICpwX2NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfdHgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX3R4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcF90eTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfdHkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfcHJlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X3JlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZHhfbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9keV9taW4pOworCisvKioKKyAqIFVwZGF0ZXMgdGhlIGNvZGluZyBwYXJhbWV0ZXJzIGlmIHRoZSBlbmNvZGluZyBpcyBub3QgdXNlZCB3aXRoIFByb2dyZXNzaW9uIG9yZGVyIGNoYW5nZXMgYW5kIGZpbmFsIChhbmQgY2luZW1hIHBhcmFtZXRlcnMgYXJlIHVzZWQpLgorICoKKyAqIEBwYXJhbQlwX2NwCQl0aGUgY29kaW5nIHBhcmFtZXRlcnMgdG8gbW9kaWZ5CisgKiBAcGFyYW0JcF9udW1fY29tcHMJCXRoZSBudW1iZXIgb2YgY29tcG9uZW50cworICogQHBhcmFtCXBfdGlsZW5vCXRoZSB0aWxlIGluZGV4IGJlaW5nIGNvbmNlcm5lZC4KKyAqIEBwYXJhbQlwX3R4MAkJWDAgcGFyYW1ldGVyIGZvciB0aGUgdGlsZQorICogQHBhcmFtCXBfdHgxCQlYMSBwYXJhbWV0ZXIgZm9yIHRoZSB0aWxlCisgKiBAcGFyYW0JcF90eTAJCVkwIHBhcmFtZXRlciBmb3IgdGhlIHRpbGUKKyAqIEBwYXJhbQlwX3R5MQkJWTEgcGFyYW1ldGVyIGZvciB0aGUgdGlsZQorICogQHBhcmFtCXBfbWF4X3ByZWMJdGhlIG1heGltdW0gcHJlY2lzaW9uIGZvciBhbGwgdGhlIGJhbmRzIG9mIHRoZSB0aWxlCisgKiBAcGFyYW0JcF9tYXhfcmVzCXRoZSBtYXhpbXVtIG51bWJlciBvZiByZXNvbHV0aW9ucyBmb3IgYWxsIHRoZSBwb2MgaW5zaWRlIHRoZSB0aWxlLgorICogQHBhcmFtCXBfZHhfbWluCQl0aGUgbWluaW11bSBkeCBvZiBhbGwgdGhlIGNvbXBvbmVudHMgb2YgYWxsIHRoZSByZXNvbHV0aW9ucyBmb3IgdGhlIHRpbGUuCisgKiBAcGFyYW0JcF9keV9taW4JCXRoZSBtaW5pbXVtIGR5IG9mIGFsbCB0aGUgY29tcG9uZW50cyBvZiBhbGwgdGhlIHJlc29sdXRpb25zIGZvciB0aGUgdGlsZS4KKyAqLworc3RhdGljIHZvaWQgb3BqX3BpX3VwZGF0ZV9lbmNvZGVfbm90X3BvYyAoICBvcGpfY3BfdCAqcF9jcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX251bV9jb21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfdHgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcF90eDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX3R5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfdHkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X3ByZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfcmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZHhfbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZHlfbWluKTsKKy8qKgorICogR2V0cyB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycyBuZWVkZWQgdG8gdXBkYXRlIHRoZSBjb2RpbmcgcGFyYW1ldGVycyBhbmQgYWxsIHRoZSBwb2NzLgorICogCisgKiBAcGFyYW0JcF9pbWFnZQkJCXRoZSBpbWFnZSBiZWluZyBlbmNvZGVkLgorICogQHBhcmFtCXBfY3AJCQl0aGUgY29kaW5nIHBhcmFtZXRlcnMuCisgKiBAcGFyYW0JdGlsZW5vCQkJdGhlIHRpbGUgaW5kZXggb2YgdGhlIHRpbGUgYmVpbmcgZW5jb2RlZC4KKyAqIEBwYXJhbQlwX3R4MAkJCXBvaW50ZXIgdGhhdCB3aWxsIGhvbGQgdGhlIFgwIHBhcmFtZXRlciBmb3IgdGhlIHRpbGUKKyAqIEBwYXJhbQlwX3R4MQkJCXBvaW50ZXIgdGhhdCB3aWxsIGhvbGQgdGhlIFgxIHBhcmFtZXRlciBmb3IgdGhlIHRpbGUKKyAqIEBwYXJhbQlwX3R5MAkJCXBvaW50ZXIgdGhhdCB3aWxsIGhvbGQgdGhlIFkwIHBhcmFtZXRlciBmb3IgdGhlIHRpbGUKKyAqIEBwYXJhbQlwX3R5MQkJCXBvaW50ZXIgdGhhdCB3aWxsIGhvbGQgdGhlIFkxIHBhcmFtZXRlciBmb3IgdGhlIHRpbGUKKyAqIEBwYXJhbQlwX21heF9wcmVjCQlwb2ludGVyIHRoYXQgd2lsbCBob2xkIHRoZSB0aGUgbWF4aW11bSBwcmVjaXNpb24gZm9yIGFsbCB0aGUgYmFuZHMgb2YgdGhlIHRpbGUKKyAqIEBwYXJhbQlwX21heF9yZXMJCXBvaW50ZXIgdGhhdCB3aWxsIGhvbGQgdGhlIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXNvbHV0aW9ucyBmb3IgYWxsIHRoZSBwb2MgaW5zaWRlIHRoZSB0aWxlLgorICogQHBhcmFtCXBfZHhfbWluCQkJcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgdGhlIG1pbmltdW0gZHggb2YgYWxsIHRoZSBjb21wb25lbnRzIG9mIGFsbCB0aGUgcmVzb2x1dGlvbnMgZm9yIHRoZSB0aWxlLgorICogQHBhcmFtCXBfZHlfbWluCQkJcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgdGhlIG1pbmltdW0gZHkgb2YgYWxsIHRoZSBjb21wb25lbnRzIG9mIGFsbCB0aGUgcmVzb2x1dGlvbnMgZm9yIHRoZSB0aWxlLgorICovCitzdGF0aWMgdm9pZCBvcGpfZ2V0X2VuY29kaW5nX3BhcmFtZXRlcnMoY29uc3Qgb3BqX2ltYWdlX3QgKnBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BqX2NwX3QgKnBfY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAgdGlsZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAgKiBwX3R4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBwX3R4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBwX3R5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBwX3R5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9keF9taW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZHlfbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX21heF9wcmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX21heF9yZXMgKTsKKworLyoqCisgKiBHZXRzIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzIG5lZWRlZCB0byB1cGRhdGUgdGhlIGNvZGluZyBwYXJhbWV0ZXJzIGFuZCBhbGwgdGhlIHBvY3MuCisgKiBUaGUgcHJlY2luY3Qgd2lkdGhzLCBoZWlnaHRzLCBkeCBhbmQgZHkgZm9yIGVhY2ggY29tcG9uZW50IGF0IGVhY2ggcmVzb2x1dGlvbiB3aWxsIGJlIHN0b3JlZCBhcyB3ZWxsLgorICogdGhlIGxhc3QgcGFyYW1ldGVyIG9mIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgYW4gYXJyYXkgb2YgcG9pbnRlcnMgb2Ygc2l6ZSBuYiBjb21wb25lbnRzLCBlYWNoIHBvaW50ZXIgbGVhZGluZworICogdG8gYW4gYXJlYSBvZiBzaXplIDQgKiBtYXhfcmVzLiBUaGUgZGF0YSBpcyBzdG9yZWQgaW5zaWRlIHRoaXMgYXJlYSB3aXRoIHRoZSBmb2xsb3dpbmcgcGF0dGVybiA6CisgKiBkeF9jb21waV9yZXMwICwgZHlfY29tcGlfcmVzMCAsIHdfY29tcGlfcmVzMCwgaF9jb21waV9yZXMwICwgZHhfY29tcGlfcmVzMSAsIGR5X2NvbXBpX3JlczEgLCB3X2NvbXBpX3JlczEsIGhfY29tcGlfcmVzMSAsIC4uLgorICoKKyAqIEBwYXJhbQlwX2ltYWdlCQkJdGhlIGltYWdlIGJlaW5nIGVuY29kZWQuCisgKiBAcGFyYW0JcF9jcAkJCXRoZSBjb2RpbmcgcGFyYW1ldGVycy4KKyAqIEBwYXJhbQl0aWxlbm8JCQl0aGUgdGlsZSBpbmRleCBvZiB0aGUgdGlsZSBiZWluZyBlbmNvZGVkLgorICogQHBhcmFtCXBfdHgwCQkJcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgWDAgcGFyYW1ldGVyIGZvciB0aGUgdGlsZQorICogQHBhcmFtCXBfdHgxCQkJcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgWDEgcGFyYW1ldGVyIGZvciB0aGUgdGlsZQorICogQHBhcmFtCXBfdHkwCQkJcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgWTAgcGFyYW1ldGVyIGZvciB0aGUgdGlsZQorICogQHBhcmFtCXBfdHkxCQkJcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgWTEgcGFyYW1ldGVyIGZvciB0aGUgdGlsZQorICogQHBhcmFtCXBfbWF4X3ByZWMJCXBvaW50ZXIgdGhhdCB3aWxsIGhvbGQgdGhlIHRoZSBtYXhpbXVtIHByZWNpc2lvbiBmb3IgYWxsIHRoZSBiYW5kcyBvZiB0aGUgdGlsZQorICogQHBhcmFtCXBfbWF4X3JlcwkJcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlc29sdXRpb25zIGZvciBhbGwgdGhlIHBvYyBpbnNpZGUgdGhlIHRpbGUuCisgKiBAcGFyYW0JcF9keF9taW4JCXBvaW50ZXIgdGhhdCB3aWxsIGhvbGQgdGhlIHRoZSBtaW5pbXVtIGR4IG9mIGFsbCB0aGUgY29tcG9uZW50cyBvZiBhbGwgdGhlIHJlc29sdXRpb25zIGZvciB0aGUgdGlsZS4KKyAqIEBwYXJhbQlwX2R5X21pbgkJcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgdGhlIG1pbmltdW0gZHkgb2YgYWxsIHRoZSBjb21wb25lbnRzIG9mIGFsbCB0aGUgcmVzb2x1dGlvbnMgZm9yIHRoZSB0aWxlLgorICogQHBhcmFtCXBfcmVzb2x1dGlvbnMJcG9pbnRlciB0byBhbiBhcmVhIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG9uZSBkZXNjcmliZWQgYWJvdmUuCisgKi8KK3N0YXRpYyB2b2lkIG9wal9nZXRfYWxsX2VuY29kaW5nX3BhcmFtZXRlcnMoY29uc3Qgb3BqX2ltYWdlX3QgKnBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wal9jcF90ICpwX2NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHRpbGVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90eDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBwX3R5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90eTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2R4X21pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZHlfbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9tYXhfcHJlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfbWF4X3JlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqKiBwX3Jlc29sdXRpb25zICk7CisvKioKKyAqIEFsbG9jYXRlcyBtZW1vcnkgZm9yIGEgcGFja2V0IGl0ZXJhdG9yLiBEYXRhIGFuZCBkYXRhIHNpemVzIGFyZSBzZXQgYnkgdGhpcyBvcGVyYXRpb24uCisgKiBObyBvdGhlciBkYXRhIGlzIHNldC4gVGhlIGluY2x1ZGUgc2VjdGlvbiBvZiB0aGUgcGFja2V0ICBpdGVyYXRvciBpcyBub3QgYWxsb2NhdGVkLgorICogCisgKiBAcGFyYW0JcF9pbWFnZQkJdGhlIGltYWdlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcGFja2V0IGl0ZXJhdG9yIChpbiBmYWN0IG9ubHkgdGhlIG51bWJlciBvZiBjb21wb25lbnRzIGlzIHJlbGV2YW50LgorICogQHBhcmFtCXBfY3AJCXRoZSBjb2RpbmcgcGFyYW1ldGVycy4KKyAqIEBwYXJhbQl0aWxlbm8JdGhlIGluZGV4IG9mIHRoZSB0aWxlIGZyb20gd2hpY2ggY3JlYXRpbmcgdGhlIHBhY2tldCBpdGVyYXRvci4KKyAqLworc3RhdGljIG9wal9waV9pdGVyYXRvcl90ICogb3BqX3BpX2NyZWF0ZSgJY29uc3Qgb3BqX2ltYWdlX3QgKnBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wal9jcF90ICpwX2NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHRpbGVubyApOworLyoqCisgKiBGSVhNRSBET0MKKyAqLworc3RhdGljIHZvaWQgb3BqX3BpX3VwZGF0ZV9kZWNvZGVfbm90X3BvYyAob3BqX3BpX2l0ZXJhdG9yX3QgKiBwX3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjcF90ICogcF90Y3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X3ByZWNpc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfcmVzKTsKKy8qKgorICogRklYTUUgRE9DCisgKi8KK3N0YXRpYyB2b2lkIG9wal9waV91cGRhdGVfZGVjb2RlX3BvYyAoICBvcGpfcGlfaXRlcmF0b3JfdCAqIHBfcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjcF90ICogcF90Y3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9wcmVjaXNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9yZXMpOworCisvKioKKyAqIEZJWE1FIERPQworICovCitzdGF0aWMgT1BKX0JPT0wgb3BqX3BpX2NoZWNrX25leHRfbGV2ZWwoCU9QSl9JTlQzMiBwb3MsCisJCQkJCQkJCW9wal9jcF90ICpjcCwKKwkJCQkJCQkJT1BKX1VJTlQzMiB0aWxlbm8sCisJCQkJCQkJCU9QSl9VSU5UMzIgcGlubywKKwkJCQkJCQkJY29uc3QgT1BKX0NIQVIgKnByb2cpOworCisvKkB9Ki8KKworLypAfSovCisKKy8qCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBsb2NhbCBmdW5jdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfcGlfbmV4dF9scmNwKG9wal9waV9pdGVyYXRvcl90ICogcGkpIHsKKwlvcGpfcGlfY29tcF90ICpjb21wID0gTlVMTDsKKwlvcGpfcGlfcmVzb2x1dGlvbl90ICpyZXMgPSBOVUxMOworCU9QSl9VSU5UMzIgaW5kZXggPSAwOworCQorCWlmICghcGktPmZpcnN0KSB7CisJCWNvbXAgPSAmcGktPmNvbXBzW3BpLT5jb21wbm9dOworCQlyZXMgPSAmY29tcC0+cmVzb2x1dGlvbnNbcGktPnJlc25vXTsKKwkJZ290byBMQUJFTF9TS0lQOworCX0gZWxzZSB7CisJCXBpLT5maXJzdCA9IDA7CisJfQorCisJZm9yIChwaS0+bGF5bm8gPSBwaS0+cG9jLmxheW5vMDsgcGktPmxheW5vIDwgcGktPnBvYy5sYXlubzE7IHBpLT5sYXlubysrKSB7CisJCWZvciAocGktPnJlc25vID0gcGktPnBvYy5yZXNubzA7IHBpLT5yZXNubyA8IHBpLT5wb2MucmVzbm8xOworCQlwaS0+cmVzbm8rKykgeworCQkJZm9yIChwaS0+Y29tcG5vID0gcGktPnBvYy5jb21wbm8wOyBwaS0+Y29tcG5vIDwgcGktPnBvYy5jb21wbm8xOyBwaS0+Y29tcG5vKyspIHsKKwkJCQljb21wID0gJnBpLT5jb21wc1twaS0+Y29tcG5vXTsKKwkJCQlpZiAocGktPnJlc25vID49IGNvbXAtPm51bXJlc29sdXRpb25zKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlyZXMgPSAmY29tcC0+cmVzb2x1dGlvbnNbcGktPnJlc25vXTsKKwkJCQlpZiAoIXBpLT50cF9vbil7CisJCQkJCXBpLT5wb2MucHJlY25vMSA9IHJlcy0+cHcgKiByZXMtPnBoOworCQkJCX0KKwkJCQlmb3IgKHBpLT5wcmVjbm8gPSBwaS0+cG9jLnByZWNubzA7IHBpLT5wcmVjbm8gPCBwaS0+cG9jLnByZWNubzE7IHBpLT5wcmVjbm8rKykgeworCQkJCQlpbmRleCA9IHBpLT5sYXlubyAqIHBpLT5zdGVwX2wgKyBwaS0+cmVzbm8gKiBwaS0+c3RlcF9yICsgcGktPmNvbXBubyAqIHBpLT5zdGVwX2MgKyBwaS0+cHJlY25vICogcGktPnN0ZXBfcDsKKwkJCQkJaWYgKCFwaS0+aW5jbHVkZVtpbmRleF0pIHsKKwkJCQkJCXBpLT5pbmNsdWRlW2luZGV4XSA9IDE7CisJCQkJCQlyZXR1cm4gT1BKX1RSVUU7CisJCQkJCX0KK0xBQkVMX1NLSVA6OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKKwlyZXR1cm4gT1BKX0ZBTFNFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX3BpX25leHRfcmxjcChvcGpfcGlfaXRlcmF0b3JfdCAqIHBpKSB7CisJb3BqX3BpX2NvbXBfdCAqY29tcCA9IE5VTEw7CisJb3BqX3BpX3Jlc29sdXRpb25fdCAqcmVzID0gTlVMTDsKKwlPUEpfVUlOVDMyIGluZGV4ID0gMDsKKworCWlmICghcGktPmZpcnN0KSB7CisJCWNvbXAgPSAmcGktPmNvbXBzW3BpLT5jb21wbm9dOworCQlyZXMgPSAmY29tcC0+cmVzb2x1dGlvbnNbcGktPnJlc25vXTsKKwkJZ290byBMQUJFTF9TS0lQOworCX0gZWxzZSB7CisJCXBpLT5maXJzdCA9IDA7CisJfQorCisJZm9yIChwaS0+cmVzbm8gPSBwaS0+cG9jLnJlc25vMDsgcGktPnJlc25vIDwgcGktPnBvYy5yZXNubzE7IHBpLT5yZXNubysrKSB7CisJCWZvciAocGktPmxheW5vID0gcGktPnBvYy5sYXlubzA7IHBpLT5sYXlubyA8IHBpLT5wb2MubGF5bm8xOyBwaS0+bGF5bm8rKykgeworCQkJZm9yIChwaS0+Y29tcG5vID0gcGktPnBvYy5jb21wbm8wOyBwaS0+Y29tcG5vIDwgcGktPnBvYy5jb21wbm8xOyBwaS0+Y29tcG5vKyspIHsKKwkJCQljb21wID0gJnBpLT5jb21wc1twaS0+Y29tcG5vXTsKKwkJCQlpZiAocGktPnJlc25vID49IGNvbXAtPm51bXJlc29sdXRpb25zKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlyZXMgPSAmY29tcC0+cmVzb2x1dGlvbnNbcGktPnJlc25vXTsKKwkJCQlpZighcGktPnRwX29uKXsKKwkJCQkJcGktPnBvYy5wcmVjbm8xID0gcmVzLT5wdyAqIHJlcy0+cGg7CisJCQkJfQorCQkJCWZvciAocGktPnByZWNubyA9IHBpLT5wb2MucHJlY25vMDsgcGktPnByZWNubyA8IHBpLT5wb2MucHJlY25vMTsgcGktPnByZWNubysrKSB7CisJCQkJCWluZGV4ID0gcGktPmxheW5vICogcGktPnN0ZXBfbCArIHBpLT5yZXNubyAqIHBpLT5zdGVwX3IgKyBwaS0+Y29tcG5vICogcGktPnN0ZXBfYyArIHBpLT5wcmVjbm8gKiBwaS0+c3RlcF9wOworCQkJCQlpZiAoIXBpLT5pbmNsdWRlW2luZGV4XSkgeworCQkJCQkJcGktPmluY2x1ZGVbaW5kZXhdID0gMTsKKwkJCQkJCXJldHVybiBPUEpfVFJVRTsKKwkJCQkJfQorTEFCRUxfU0tJUDo7CisJCQkJfQorCQkJfQorCQl9CisJfQorCQorCXJldHVybiBPUEpfRkFMU0U7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfcGlfbmV4dF9ycGNsKG9wal9waV9pdGVyYXRvcl90ICogcGkpIHsKKwlvcGpfcGlfY29tcF90ICpjb21wID0gTlVMTDsKKwlvcGpfcGlfcmVzb2x1dGlvbl90ICpyZXMgPSBOVUxMOworCU9QSl9VSU5UMzIgaW5kZXggPSAwOworCisJaWYgKCFwaS0+Zmlyc3QpIHsKKwkJZ290byBMQUJFTF9TS0lQOworCX0gZWxzZSB7CisJCU9QSl9VSU5UMzIgY29tcG5vLCByZXNubzsKKwkJcGktPmZpcnN0ID0gMDsKKwkJcGktPmR4ID0gMDsKKwkJcGktPmR5ID0gMDsKKwkJZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBwaS0+bnVtY29tcHM7IGNvbXBubysrKSB7CisJCQljb21wID0gJnBpLT5jb21wc1tjb21wbm9dOworCQkJZm9yIChyZXNubyA9IDA7IHJlc25vIDwgY29tcC0+bnVtcmVzb2x1dGlvbnM7IHJlc25vKyspIHsKKwkJCQlPUEpfVUlOVDMyIGR4LCBkeTsKKwkJCQlyZXMgPSAmY29tcC0+cmVzb2x1dGlvbnNbcmVzbm9dOworCQkJCWR4ID0gY29tcC0+ZHggKiAoMXUgPDwgKHJlcy0+cGR4ICsgY29tcC0+bnVtcmVzb2x1dGlvbnMgLSAxIC0gcmVzbm8pKTsKKwkJCQlkeSA9IGNvbXAtPmR5ICogKDF1IDw8IChyZXMtPnBkeSArIGNvbXAtPm51bXJlc29sdXRpb25zIC0gMSAtIHJlc25vKSk7CisJCQkJcGktPmR4ID0gIXBpLT5keCA/IGR4IDogb3BqX3VpbnRfbWluKHBpLT5keCwgZHgpOworCQkJCXBpLT5keSA9ICFwaS0+ZHkgPyBkeSA6IG9wal91aW50X21pbihwaS0+ZHksIGR5KTsKKwkJCX0KKwkJfQorCX0KK2lmICghcGktPnRwX29uKXsKKwkJCXBpLT5wb2MudHkwID0gcGktPnR5MDsKKwkJCXBpLT5wb2MudHgwID0gcGktPnR4MDsKKwkJCXBpLT5wb2MudHkxID0gcGktPnR5MTsKKwkJCXBpLT5wb2MudHgxID0gcGktPnR4MTsKKwkJfQorCWZvciAocGktPnJlc25vID0gcGktPnBvYy5yZXNubzA7IHBpLT5yZXNubyA8IHBpLT5wb2MucmVzbm8xOyBwaS0+cmVzbm8rKykgeworCQlmb3IgKHBpLT55ID0gcGktPnBvYy50eTA7IHBpLT55IDwgcGktPnBvYy50eTE7IHBpLT55ICs9IChPUEpfSU5UMzIpKHBpLT5keSAtIChPUEpfVUlOVDMyKShwaS0+eSAlIChPUEpfSU5UMzIpcGktPmR5KSkpIHsKKwkJCWZvciAocGktPnggPSBwaS0+cG9jLnR4MDsgcGktPnggPCBwaS0+cG9jLnR4MTsgcGktPnggKz0gKE9QSl9JTlQzMikocGktPmR4IC0gKE9QSl9VSU5UMzIpKHBpLT54ICUgKE9QSl9JTlQzMilwaS0+ZHgpKSkgeworCQkJCWZvciAocGktPmNvbXBubyA9IHBpLT5wb2MuY29tcG5vMDsgcGktPmNvbXBubyA8IHBpLT5wb2MuY29tcG5vMTsgcGktPmNvbXBubysrKSB7CisJCQkJCU9QSl9VSU5UMzIgbGV2ZWxubzsKKwkJCQkJT1BKX0lOVDMyIHRyeDAsIHRyeTA7CisJCQkJCU9QSl9JTlQzMiAgdHJ4MSwgdHJ5MTsKKwkJCQkJT1BKX1VJTlQzMiAgcnB4LCBycHk7CisJCQkJCU9QSl9JTlQzMiAgcHJjaSwgcHJjajsKKwkJCQkJY29tcCA9ICZwaS0+Y29tcHNbcGktPmNvbXBub107CisJCQkJCWlmIChwaS0+cmVzbm8gPj0gY29tcC0+bnVtcmVzb2x1dGlvbnMpIHsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCXJlcyA9ICZjb21wLT5yZXNvbHV0aW9uc1twaS0+cmVzbm9dOworCQkJCQlsZXZlbG5vID0gY29tcC0+bnVtcmVzb2x1dGlvbnMgLSAxIC0gcGktPnJlc25vOworCQkJCQl0cngwID0gb3BqX2ludF9jZWlsZGl2KHBpLT50eDAsIChPUEpfSU5UMzIpKGNvbXAtPmR4IDw8IGxldmVsbm8pKTsKKwkJCQkJdHJ5MCA9IG9wal9pbnRfY2VpbGRpdihwaS0+dHkwLCAoT1BKX0lOVDMyKShjb21wLT5keSA8PCBsZXZlbG5vKSk7CisJCQkJCXRyeDEgPSBvcGpfaW50X2NlaWxkaXYocGktPnR4MSwgKE9QSl9JTlQzMikoY29tcC0+ZHggPDwgbGV2ZWxubykpOworCQkJCQl0cnkxID0gb3BqX2ludF9jZWlsZGl2KHBpLT50eTEsIChPUEpfSU5UMzIpKGNvbXAtPmR5IDw8IGxldmVsbm8pKTsKKwkJCQkJcnB4ID0gcmVzLT5wZHggKyBsZXZlbG5vOworCQkJCQlycHkgPSByZXMtPnBkeSArIGxldmVsbm87CisJCQkJCWlmICghKChwaS0+eSAlIChPUEpfSU5UMzIpKGNvbXAtPmR5IDw8IHJweSkgPT0gMCkgfHwgKChwaS0+eSA9PSBwaS0+dHkwKSAmJiAoKHRyeTAgPDwgbGV2ZWxubykgJSAoMSA8PCBycHkpKSkpKXsKKwkJCQkJCWNvbnRpbnVlOwkKKwkJCQkJfQorCQkJCQlpZiAoISgocGktPnggJSAoT1BKX0lOVDMyKShjb21wLT5keCA8PCBycHgpID09IDApIHx8ICgocGktPnggPT0gcGktPnR4MCkgJiYgKCh0cngwIDw8IGxldmVsbm8pICUgKDEgPDwgcnB4KSkpKSl7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJaWYgKChyZXMtPnB3PT0wKXx8KHJlcy0+cGg9PTApKSBjb250aW51ZTsKKwkJCQkJCisJCQkJCWlmICgodHJ4MD09dHJ4MSl8fCh0cnkwPT10cnkxKSkgY29udGludWU7CisJCQkJCQorCQkJCQlwcmNpID0gb3BqX2ludF9mbG9vcmRpdnBvdzIob3BqX2ludF9jZWlsZGl2KHBpLT54LCAoT1BKX0lOVDMyKShjb21wLT5keCA8PCBsZXZlbG5vKSksIChPUEpfSU5UMzIpcmVzLT5wZHgpCisJCQkJCQkgLSBvcGpfaW50X2Zsb29yZGl2cG93Mih0cngwLCAoT1BKX0lOVDMyKXJlcy0+cGR4KTsKKwkJCQkJcHJjaiA9IG9wal9pbnRfZmxvb3JkaXZwb3cyKG9wal9pbnRfY2VpbGRpdihwaS0+eSwgKE9QSl9JTlQzMikoY29tcC0+ZHkgPDwgbGV2ZWxubykpLCAoT1BKX0lOVDMyKXJlcy0+cGR5KQorCQkJCQkJIC0gb3BqX2ludF9mbG9vcmRpdnBvdzIodHJ5MCwgKE9QSl9JTlQzMilyZXMtPnBkeSk7CisJCQkJCXBpLT5wcmVjbm8gPSAoT1BKX1VJTlQzMikocHJjaSArIHByY2ogKiAoT1BKX0lOVDMyKXJlcy0+cHcpOworCQkJCQlpZiAocGktPnByZWNubyA+PSByZXMtPnB3ICogcmVzLT5waCkgeworCQkJCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJCQkJfQorCQkJCQlmb3IgKHBpLT5sYXlubyA9IHBpLT5wb2MubGF5bm8wOyBwaS0+bGF5bm8gPCBwaS0+cG9jLmxheW5vMTsgcGktPmxheW5vKyspIHsKKwkJCQkJCWluZGV4ID0gcGktPmxheW5vICogcGktPnN0ZXBfbCArIHBpLT5yZXNubyAqIHBpLT5zdGVwX3IgKyBwaS0+Y29tcG5vICogcGktPnN0ZXBfYyArIHBpLT5wcmVjbm8gKiBwaS0+c3RlcF9wOworCQkJCQkJaWYgKCFwaS0+aW5jbHVkZVtpbmRleF0pIHsKKwkJCQkJCQlwaS0+aW5jbHVkZVtpbmRleF0gPSAxOworCQkJCQkJCXJldHVybiBPUEpfVFJVRTsKKwkJCQkJCX0KK0xBQkVMX1NLSVA6OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCQorCXJldHVybiBPUEpfRkFMU0U7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfcGlfbmV4dF9wY3JsKG9wal9waV9pdGVyYXRvcl90ICogcGkpIHsKKwlvcGpfcGlfY29tcF90ICpjb21wID0gTlVMTDsKKwlvcGpfcGlfcmVzb2x1dGlvbl90ICpyZXMgPSBOVUxMOworCU9QSl9VSU5UMzIgaW5kZXggPSAwOworCisJaWYgKCFwaS0+Zmlyc3QpIHsKKwkJY29tcCA9ICZwaS0+Y29tcHNbcGktPmNvbXBub107CisJCWdvdG8gTEFCRUxfU0tJUDsKKwl9IGVsc2UgeworCQlPUEpfVUlOVDMyIGNvbXBubywgcmVzbm87CisJCXBpLT5maXJzdCA9IDA7CisJCXBpLT5keCA9IDA7CisJCXBpLT5keSA9IDA7CisJCWZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgcGktPm51bWNvbXBzOyBjb21wbm8rKykgeworCQkJY29tcCA9ICZwaS0+Y29tcHNbY29tcG5vXTsKKwkJCWZvciAocmVzbm8gPSAwOyByZXNubyA8IGNvbXAtPm51bXJlc29sdXRpb25zOyByZXNubysrKSB7CisJCQkJT1BKX1VJTlQzMiBkeCwgZHk7CisJCQkJcmVzID0gJmNvbXAtPnJlc29sdXRpb25zW3Jlc25vXTsKKwkJCQlkeCA9IGNvbXAtPmR4ICogKDF1IDw8IChyZXMtPnBkeCArIGNvbXAtPm51bXJlc29sdXRpb25zIC0gMSAtIHJlc25vKSk7CisJCQkJZHkgPSBjb21wLT5keSAqICgxdSA8PCAocmVzLT5wZHkgKyBjb21wLT5udW1yZXNvbHV0aW9ucyAtIDEgLSByZXNubykpOworCQkJCXBpLT5keCA9ICFwaS0+ZHggPyBkeCA6IG9wal91aW50X21pbihwaS0+ZHgsIGR4KTsKKwkJCQlwaS0+ZHkgPSAhcGktPmR5ID8gZHkgOiBvcGpfdWludF9taW4ocGktPmR5LCBkeSk7CisJCQl9CisJCX0KKwl9CisJaWYgKCFwaS0+dHBfb24peworCQkJcGktPnBvYy50eTAgPSBwaS0+dHkwOworCQkJcGktPnBvYy50eDAgPSBwaS0+dHgwOworCQkJcGktPnBvYy50eTEgPSBwaS0+dHkxOworCQkJcGktPnBvYy50eDEgPSBwaS0+dHgxOworCQl9CisJZm9yIChwaS0+eSA9IHBpLT5wb2MudHkwOyBwaS0+eSA8IHBpLT5wb2MudHkxOyBwaS0+eSArPSAoT1BKX0lOVDMyKShwaS0+ZHkgLSAoT1BKX1VJTlQzMikocGktPnkgJSAoT1BKX0lOVDMyKXBpLT5keSkpKSB7CisJCWZvciAocGktPnggPSBwaS0+cG9jLnR4MDsgcGktPnggPCBwaS0+cG9jLnR4MTsgcGktPnggKz0gKE9QSl9JTlQzMikocGktPmR4IC0gKE9QSl9VSU5UMzIpKHBpLT54ICUgKE9QSl9JTlQzMilwaS0+ZHgpKSkgeworCQkJZm9yIChwaS0+Y29tcG5vID0gcGktPnBvYy5jb21wbm8wOyBwaS0+Y29tcG5vIDwgcGktPnBvYy5jb21wbm8xOyBwaS0+Y29tcG5vKyspIHsKKwkJCQljb21wID0gJnBpLT5jb21wc1twaS0+Y29tcG5vXTsKKwkJCQlmb3IgKHBpLT5yZXNubyA9IHBpLT5wb2MucmVzbm8wOyBwaS0+cmVzbm8gPCBvcGpfdWludF9taW4ocGktPnBvYy5yZXNubzEsIGNvbXAtPm51bXJlc29sdXRpb25zKTsgcGktPnJlc25vKyspIHsKKwkJCQkJT1BKX1VJTlQzMiBsZXZlbG5vOworCQkJCQlPUEpfSU5UMzIgdHJ4MCwgdHJ5MDsKKwkJCQkJT1BKX0lOVDMyIHRyeDEsIHRyeTE7CisJCQkJCU9QSl9VSU5UMzIgcnB4LCBycHk7CisJCQkJCU9QSl9JTlQzMiBwcmNpLCBwcmNqOworCQkJCQlyZXMgPSAmY29tcC0+cmVzb2x1dGlvbnNbcGktPnJlc25vXTsKKwkJCQkJbGV2ZWxubyA9IGNvbXAtPm51bXJlc29sdXRpb25zIC0gMSAtIHBpLT5yZXNubzsKKwkJCQkJdHJ4MCA9IG9wal9pbnRfY2VpbGRpdihwaS0+dHgwLCAoT1BKX0lOVDMyKShjb21wLT5keCA8PCBsZXZlbG5vKSk7CisJCQkJCXRyeTAgPSBvcGpfaW50X2NlaWxkaXYocGktPnR5MCwgKE9QSl9JTlQzMikoY29tcC0+ZHkgPDwgbGV2ZWxubykpOworCQkJCQl0cngxID0gb3BqX2ludF9jZWlsZGl2KHBpLT50eDEsIChPUEpfSU5UMzIpKGNvbXAtPmR4IDw8IGxldmVsbm8pKTsKKwkJCQkJdHJ5MSA9IG9wal9pbnRfY2VpbGRpdihwaS0+dHkxLCAoT1BKX0lOVDMyKShjb21wLT5keSA8PCBsZXZlbG5vKSk7CisJCQkJCXJweCA9IHJlcy0+cGR4ICsgbGV2ZWxubzsKKwkJCQkJcnB5ID0gcmVzLT5wZHkgKyBsZXZlbG5vOworCQkJCQlpZiAoISgocGktPnkgJSAoT1BKX0lOVDMyKShjb21wLT5keSA8PCBycHkpID09IDApIHx8ICgocGktPnkgPT0gcGktPnR5MCkgJiYgKCh0cnkwIDw8IGxldmVsbm8pICUgKDEgPDwgcnB5KSkpKSl7CisJCQkJCQljb250aW51ZTsJCisJCQkJCX0KKwkJCQkJaWYgKCEoKHBpLT54ICUgKE9QSl9JTlQzMikoY29tcC0+ZHggPDwgcnB4KSA9PSAwKSB8fCAoKHBpLT54ID09IHBpLT50eDApICYmICgodHJ4MCA8PCBsZXZlbG5vKSAlICgxIDw8IHJweCkpKSkpeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJCisJCQkJCWlmICgocmVzLT5wdz09MCl8fChyZXMtPnBoPT0wKSkgY29udGludWU7CisJCQkJCQorCQkJCQlpZiAoKHRyeDA9PXRyeDEpfHwodHJ5MD09dHJ5MSkpIGNvbnRpbnVlOworCQkJCQkKKwkJCQkJcHJjaSA9IG9wal9pbnRfZmxvb3JkaXZwb3cyKG9wal9pbnRfY2VpbGRpdihwaS0+eCwgKE9QSl9JTlQzMikoY29tcC0+ZHggPDwgbGV2ZWxubykpLCAoT1BKX0lOVDMyKXJlcy0+cGR4KQorCQkJCQkJIC0gb3BqX2ludF9mbG9vcmRpdnBvdzIodHJ4MCwgKE9QSl9JTlQzMilyZXMtPnBkeCk7CisJCQkJCXByY2ogPSBvcGpfaW50X2Zsb29yZGl2cG93MihvcGpfaW50X2NlaWxkaXYocGktPnksIChPUEpfSU5UMzIpKGNvbXAtPmR5IDw8IGxldmVsbm8pKSwgKE9QSl9JTlQzMilyZXMtPnBkeSkKKwkJCQkJCSAtIG9wal9pbnRfZmxvb3JkaXZwb3cyKHRyeTAsIChPUEpfSU5UMzIpcmVzLT5wZHkpOworCQkJCQlwaS0+cHJlY25vID0gKE9QSl9VSU5UMzIpKHByY2kgKyBwcmNqICogKE9QSl9JTlQzMilyZXMtPnB3KTsKKwkJCQkJaWYgKHBpLT5wcmVjbm8gPj0gcmVzLT5wdyAqIHJlcy0+cGgpIHsKKwkJCQkJCXJldHVybiBPUEpfRkFMU0U7CisJCQkJCX0KKwkJCQkJZm9yIChwaS0+bGF5bm8gPSBwaS0+cG9jLmxheW5vMDsgcGktPmxheW5vIDwgcGktPnBvYy5sYXlubzE7IHBpLT5sYXlubysrKSB7CisJCQkJCQlpbmRleCA9IHBpLT5sYXlubyAqIHBpLT5zdGVwX2wgKyBwaS0+cmVzbm8gKiBwaS0+c3RlcF9yICsgcGktPmNvbXBubyAqIHBpLT5zdGVwX2MgKyBwaS0+cHJlY25vICogcGktPnN0ZXBfcDsKKwkJCQkJCWlmICghcGktPmluY2x1ZGVbaW5kZXhdKSB7CisJCQkJCQkJcGktPmluY2x1ZGVbaW5kZXhdID0gMTsKKwkJCQkJCQlyZXR1cm4gT1BKX1RSVUU7CisJCQkJCQl9CQorTEFCRUxfU0tJUDo7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJcmV0dXJuIE9QSl9GQUxTRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9waV9uZXh0X2Nwcmwob3BqX3BpX2l0ZXJhdG9yX3QgKiBwaSkgeworCW9wal9waV9jb21wX3QgKmNvbXAgPSBOVUxMOworCW9wal9waV9yZXNvbHV0aW9uX3QgKnJlcyA9IE5VTEw7CisJT1BKX1VJTlQzMiBpbmRleCA9IDA7CisKKwlpZiAoIXBpLT5maXJzdCkgeworCQljb21wID0gJnBpLT5jb21wc1twaS0+Y29tcG5vXTsKKwkJZ290byBMQUJFTF9TS0lQOworCX0gZWxzZSB7CisJCXBpLT5maXJzdCA9IDA7CisJfQorCisJZm9yIChwaS0+Y29tcG5vID0gcGktPnBvYy5jb21wbm8wOyBwaS0+Y29tcG5vIDwgcGktPnBvYy5jb21wbm8xOyBwaS0+Y29tcG5vKyspIHsKKwkJT1BKX1VJTlQzMiByZXNubzsKKwkJY29tcCA9ICZwaS0+Y29tcHNbcGktPmNvbXBub107CisJCXBpLT5keCA9IDA7CisJCXBpLT5keSA9IDA7CisJCWZvciAocmVzbm8gPSAwOyByZXNubyA8IGNvbXAtPm51bXJlc29sdXRpb25zOyByZXNubysrKSB7CisJCQlPUEpfVUlOVDMyIGR4LCBkeTsKKwkJCXJlcyA9ICZjb21wLT5yZXNvbHV0aW9uc1tyZXNub107CisJCQlkeCA9IGNvbXAtPmR4ICogKDF1IDw8IChyZXMtPnBkeCArIGNvbXAtPm51bXJlc29sdXRpb25zIC0gMSAtIHJlc25vKSk7CisJCQlkeSA9IGNvbXAtPmR5ICogKDF1IDw8IChyZXMtPnBkeSArIGNvbXAtPm51bXJlc29sdXRpb25zIC0gMSAtIHJlc25vKSk7CisJCQlwaS0+ZHggPSAhcGktPmR4ID8gZHggOiBvcGpfdWludF9taW4ocGktPmR4LCBkeCk7CisJCQlwaS0+ZHkgPSAhcGktPmR5ID8gZHkgOiBvcGpfdWludF9taW4ocGktPmR5LCBkeSk7CisJCX0KKwkJaWYgKCFwaS0+dHBfb24peworCQkJcGktPnBvYy50eTAgPSBwaS0+dHkwOworCQkJcGktPnBvYy50eDAgPSBwaS0+dHgwOworCQkJcGktPnBvYy50eTEgPSBwaS0+dHkxOworCQkJcGktPnBvYy50eDEgPSBwaS0+dHgxOworCQl9CisJCWZvciAocGktPnkgPSBwaS0+cG9jLnR5MDsgcGktPnkgPCBwaS0+cG9jLnR5MTsgcGktPnkgKz0gKE9QSl9JTlQzMikocGktPmR5IC0gKE9QSl9VSU5UMzIpKHBpLT55ICUgKE9QSl9JTlQzMilwaS0+ZHkpKSkgeworCQkJZm9yIChwaS0+eCA9IHBpLT5wb2MudHgwOyBwaS0+eCA8IHBpLT5wb2MudHgxOyBwaS0+eCArPSAoT1BKX0lOVDMyKShwaS0+ZHggLSAoT1BKX1VJTlQzMikocGktPnggJSAoT1BKX0lOVDMyKXBpLT5keCkpKSB7CisJCQkJZm9yIChwaS0+cmVzbm8gPSBwaS0+cG9jLnJlc25vMDsgcGktPnJlc25vIDwgb3BqX3VpbnRfbWluKHBpLT5wb2MucmVzbm8xLCBjb21wLT5udW1yZXNvbHV0aW9ucyk7IHBpLT5yZXNubysrKSB7CisJCQkJCU9QSl9VSU5UMzIgbGV2ZWxubzsKKwkJCQkJT1BKX0lOVDMyIHRyeDAsIHRyeTA7CisJCQkJCU9QSl9JTlQzMiB0cngxLCB0cnkxOworCQkJCQlPUEpfVUlOVDMyIHJweCwgcnB5OworCQkJCQlPUEpfSU5UMzIgcHJjaSwgcHJjajsKKwkJCQkJcmVzID0gJmNvbXAtPnJlc29sdXRpb25zW3BpLT5yZXNub107CisJCQkJCWxldmVsbm8gPSBjb21wLT5udW1yZXNvbHV0aW9ucyAtIDEgLSBwaS0+cmVzbm87CisJCQkJCXRyeDAgPSBvcGpfaW50X2NlaWxkaXYocGktPnR4MCwgKE9QSl9JTlQzMikoY29tcC0+ZHggPDwgbGV2ZWxubykpOworCQkJCQl0cnkwID0gb3BqX2ludF9jZWlsZGl2KHBpLT50eTAsIChPUEpfSU5UMzIpKGNvbXAtPmR5IDw8IGxldmVsbm8pKTsKKwkJCQkJdHJ4MSA9IG9wal9pbnRfY2VpbGRpdihwaS0+dHgxLCAoT1BKX0lOVDMyKShjb21wLT5keCA8PCBsZXZlbG5vKSk7CisJCQkJCXRyeTEgPSBvcGpfaW50X2NlaWxkaXYocGktPnR5MSwgKE9QSl9JTlQzMikoY29tcC0+ZHkgPDwgbGV2ZWxubykpOworCQkJCQlycHggPSByZXMtPnBkeCArIGxldmVsbm87CisJCQkJCXJweSA9IHJlcy0+cGR5ICsgbGV2ZWxubzsKKwkJCQkJaWYgKCEoKHBpLT55ICUgKE9QSl9JTlQzMikoY29tcC0+ZHkgPDwgcnB5KSA9PSAwKSB8fCAoKHBpLT55ID09IHBpLT50eTApICYmICgodHJ5MCA8PCBsZXZlbG5vKSAlICgxIDw8IHJweSkpKSkpeworCQkJCQkJY29udGludWU7CQorCQkJCQl9CisJCQkJCWlmICghKChwaS0+eCAlIChPUEpfSU5UMzIpKGNvbXAtPmR4IDw8IHJweCkgPT0gMCkgfHwgKChwaS0+eCA9PSBwaS0+dHgwKSAmJiAoKHRyeDAgPDwgbGV2ZWxubykgJSAoMSA8PCBycHgpKSkpKXsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCQorCQkJCQlpZiAoKHJlcy0+cHc9PTApfHwocmVzLT5waD09MCkpIGNvbnRpbnVlOworCQkJCQkKKwkJCQkJaWYgKCh0cngwPT10cngxKXx8KHRyeTA9PXRyeTEpKSBjb250aW51ZTsKKwkJCQkJCisJCQkJCXByY2kgPSBvcGpfaW50X2Zsb29yZGl2cG93MihvcGpfaW50X2NlaWxkaXYocGktPngsIChPUEpfSU5UMzIpKGNvbXAtPmR4IDw8IGxldmVsbm8pKSwgKE9QSl9JTlQzMilyZXMtPnBkeCkKKwkJCQkJCSAtIG9wal9pbnRfZmxvb3JkaXZwb3cyKHRyeDAsIChPUEpfSU5UMzIpcmVzLT5wZHgpOworCQkJCQlwcmNqID0gb3BqX2ludF9mbG9vcmRpdnBvdzIob3BqX2ludF9jZWlsZGl2KHBpLT55LCAoT1BKX0lOVDMyKShjb21wLT5keSA8PCBsZXZlbG5vKSksIChPUEpfSU5UMzIpcmVzLT5wZHkpCisJCQkJCQkgLSBvcGpfaW50X2Zsb29yZGl2cG93Mih0cnkwLCAoT1BKX0lOVDMyKXJlcy0+cGR5KTsKKwkJCQkJcGktPnByZWNubyA9IChPUEpfVUlOVDMyKShwcmNpICsgcHJjaiAqIChPUEpfSU5UMzIpcmVzLT5wdyk7CisJCQkJCWlmIChwaS0+cHJlY25vID49IHJlcy0+cHcgKiByZXMtPnBoKSB7CisJCQkJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQkJCQl9CisJCQkJCWZvciAocGktPmxheW5vID0gcGktPnBvYy5sYXlubzA7IHBpLT5sYXlubyA8IHBpLT5wb2MubGF5bm8xOyBwaS0+bGF5bm8rKykgeworCQkJCQkJaW5kZXggPSBwaS0+bGF5bm8gKiBwaS0+c3RlcF9sICsgcGktPnJlc25vICogcGktPnN0ZXBfciArIHBpLT5jb21wbm8gKiBwaS0+c3RlcF9jICsgcGktPnByZWNubyAqIHBpLT5zdGVwX3A7CisJCQkJCQlpZiAoIXBpLT5pbmNsdWRlW2luZGV4XSkgeworCQkJCQkJCXBpLT5pbmNsdWRlW2luZGV4XSA9IDE7CisJCQkJCQkJcmV0dXJuIE9QSl9UUlVFOworCQkJCQkJfQorTEFCRUxfU0tJUDo7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJcmV0dXJuIE9QSl9GQUxTRTsKK30KKworc3RhdGljIHZvaWQgb3BqX2dldF9lbmNvZGluZ19wYXJhbWV0ZXJzKAljb25zdCBvcGpfaW1hZ2VfdCAqcF9pbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wal9jcF90ICpwX2NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdHgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICAqIHBfdHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICAqIHBfdHkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICAqIHBfdHkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZHhfbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZHlfbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfbWF4X3ByZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9tYXhfcmVzICkKK3sKKwkvKiBsb29wICovCisJT1BKX1VJTlQzMiAgY29tcG5vLCByZXNubzsKKwkvKiBwb2ludGVycyAqLworCWNvbnN0IG9wal90Y3BfdCAqbF90Y3AgPSAwMDsKKwljb25zdCBvcGpfdGNjcF90ICogbF90Y2NwID0gMDA7CisJY29uc3Qgb3BqX2ltYWdlX2NvbXBfdCAqIGxfaW1nX2NvbXAgPSAwMDsKKworCS8qIHBvc2l0aW9uIGluIHggYW5kIHkgb2YgdGlsZSAqLworCU9QSl9VSU5UMzIgcCwgcTsKKworCS8qIHByZWNvbmRpdGlvbnMgKi8KKwlhc3NlcnQocF9jcCAhPSAwMCk7CisJYXNzZXJ0KHBfaW1hZ2UgIT0gMDApOworCWFzc2VydChwX3RpbGVubyA8IHBfY3AtPnR3ICogcF9jcC0+dGgpOworCisJLyogaW5pdGlhbGl6YXRpb25zICovCisJbF90Y3AgPSAmcF9jcC0+dGNwcyBbcF90aWxlbm9dOworCWxfaW1nX2NvbXAgPSBwX2ltYWdlLT5jb21wczsKKwlsX3RjY3AgPSBsX3RjcC0+dGNjcHM7CisKKwkvKiBoZXJlIGNhbGN1bGF0aW9uIG9mIHR4MCwgdHgxLCB0eTAsIHR5MSwgbWF4cHJlYywgZHggYW5kIGR5ICovCisJcCA9IHBfdGlsZW5vICUgcF9jcC0+dHc7CisJcSA9IHBfdGlsZW5vIC8gcF9jcC0+dHc7CisKKwkvKiBmaW5kIGV4dGVudCBvZiB0aWxlICovCisJKnBfdHgwID0gb3BqX2ludF9tYXgoKE9QSl9JTlQzMikocF9jcC0+dHgwICsgcCAqIHBfY3AtPnRkeCksIChPUEpfSU5UMzIpcF9pbWFnZS0+eDApOworCSpwX3R4MSA9IG9wal9pbnRfbWluKChPUEpfSU5UMzIpKHBfY3AtPnR4MCArIChwICsgMSkgKiBwX2NwLT50ZHgpLCAoT1BKX0lOVDMyKXBfaW1hZ2UtPngxKTsKKwkqcF90eTAgPSBvcGpfaW50X21heCgoT1BKX0lOVDMyKShwX2NwLT50eTAgKyBxICogcF9jcC0+dGR5KSwgKE9QSl9JTlQzMilwX2ltYWdlLT55MCk7CisJKnBfdHkxID0gb3BqX2ludF9taW4oKE9QSl9JTlQzMikocF9jcC0+dHkwICsgKHEgKyAxKSAqIHBfY3AtPnRkeSksIChPUEpfSU5UMzIpcF9pbWFnZS0+eTEpOworCisJLyogbWF4IHByZWNpc2lvbiBpcyAwIChjYW4gb25seSBncm93KSAqLworCSpwX21heF9wcmVjID0gMDsKKwkqcF9tYXhfcmVzID0gMDsKKworCS8qIHRha2UgdGhlIGxhcmdlc3QgdmFsdWUgZm9yIGR4X21pbiBhbmQgZHlfbWluICovCisJKnBfZHhfbWluID0gMHg3ZmZmZmZmZjsKKwkqcF9keV9taW4gID0gMHg3ZmZmZmZmZjsKKworCWZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgcF9pbWFnZS0+bnVtY29tcHM7ICsrY29tcG5vKSB7CisJCS8qIGFyaXRobWV0aWMgdmFyaWFibGVzIHRvIGNhbGN1bGF0ZSAqLworCQlPUEpfVUlOVDMyIGxfbGV2ZWxfbm87CisJCU9QSl9JTlQzMiBsX3J4MCwgbF9yeTAsIGxfcngxLCBsX3J5MTsKKwkJT1BKX0lOVDMyIGxfcHgwLCBsX3B5MCwgbF9weDEsIHB5MTsKKwkJT1BKX1VJTlQzMiBsX3BkeCwgbF9wZHk7CisJCU9QSl9VSU5UMzIgbF9wdywgbF9waDsKKwkJT1BKX1VJTlQzMiBsX3Byb2R1Y3Q7CisJCU9QSl9JTlQzMiBsX3RjeDAsIGxfdGN5MCwgbF90Y3gxLCBsX3RjeTE7CisKKwkJbF90Y3gwID0gb3BqX2ludF9jZWlsZGl2KCpwX3R4MCwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5keCk7CisJCWxfdGN5MCA9IG9wal9pbnRfY2VpbGRpdigqcF90eTAsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHkpOworCQlsX3RjeDEgPSBvcGpfaW50X2NlaWxkaXYoKnBfdHgxLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR4KTsKKwkJbF90Y3kxID0gb3BqX2ludF9jZWlsZGl2KCpwX3R5MSwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5keSk7CisKKwkJaWYgKGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMgPiAqcF9tYXhfcmVzKSB7CisJCQkqcF9tYXhfcmVzID0gbF90Y2NwLT5udW1yZXNvbHV0aW9uczsKKwkJfQorCisJCS8qIHVzZSBjdXN0b20gc2l6ZSBmb3IgcHJlY2luY3RzICovCisJCWZvciAocmVzbm8gPSAwOyByZXNubyA8IGxfdGNjcC0+bnVtcmVzb2x1dGlvbnM7ICsrcmVzbm8pIHsKKwkJCU9QSl9VSU5UMzIgbF9keCwgbF9keTsKKworCQkJLyogcHJlY2luY3Qgd2lkdGggYW5kIGhlaWdodCAqLworCQkJbF9wZHggPSBsX3RjY3AtPnByY3dbcmVzbm9dOworCQkJbF9wZHkgPSBsX3RjY3AtPnByY2hbcmVzbm9dOworCisJCQlsX2R4ID0gbF9pbWdfY29tcC0+ZHggKiAoMXUgPDwgKGxfcGR4ICsgbF90Y2NwLT5udW1yZXNvbHV0aW9ucyAtIDEgLSByZXNubykpOworCQkJbF9keSA9IGxfaW1nX2NvbXAtPmR5ICogKDF1IDw8IChsX3BkeSArIGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMgLSAxIC0gcmVzbm8pKTsKKworCQkJLyogdGFrZSB0aGUgbWluaW11bSBzaXplIGZvciBkeCBmb3IgZWFjaCBjb21wIGFuZCByZXNvbHV0aW9uICovCisJCQkqcF9keF9taW4gPSBvcGpfdWludF9taW4oKnBfZHhfbWluLCBsX2R4KTsKKwkJCSpwX2R5X21pbiA9IG9wal91aW50X21pbigqcF9keV9taW4sIGxfZHkpOworCisJCQkvKiB2YXJpb3VzIGNhbGN1bGF0aW9ucyBvZiBleHRlbnRzICovCisJCQlsX2xldmVsX25vID0gbF90Y2NwLT5udW1yZXNvbHV0aW9ucyAtIDEgLSByZXNubzsKKworCQkJbF9yeDAgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGN4MCwgKE9QSl9JTlQzMilsX2xldmVsX25vKTsKKwkJCWxfcnkwID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3RjeTAsIChPUEpfSU5UMzIpbF9sZXZlbF9ubyk7CisJCQlsX3J4MSA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF90Y3gxLCAoT1BKX0lOVDMyKWxfbGV2ZWxfbm8pOworCQkJbF9yeTEgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGN5MSwgKE9QSl9JTlQzMilsX2xldmVsX25vKTsKKworCQkJbF9weDAgPSBvcGpfaW50X2Zsb29yZGl2cG93MihsX3J4MCwgKE9QSl9JTlQzMilsX3BkeCkgPDwgbF9wZHg7CisJCQlsX3B5MCA9IG9wal9pbnRfZmxvb3JkaXZwb3cyKGxfcnkwLCAoT1BKX0lOVDMyKWxfcGR5KSA8PCBsX3BkeTsKKwkJCWxfcHgxID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3J4MSwgKE9QSl9JTlQzMilsX3BkeCkgPDwgbF9wZHg7CisKKwkJCXB5MSA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF9yeTEsIChPUEpfSU5UMzIpbF9wZHkpIDw8IGxfcGR5OworCisJCQlsX3B3ID0gKGxfcngwPT1sX3J4MSk/MDooT1BKX1VJTlQzMikoKGxfcHgxIC0gbF9weDApID4+IGxfcGR4KTsKKwkJCWxfcGggPSAobF9yeTA9PWxfcnkxKT8wOihPUEpfVUlOVDMyKSgocHkxIC0gbF9weTApID4+IGxfcGR5KTsKKworCQkJbF9wcm9kdWN0ID0gbF9wdyAqIGxfcGg7CisKKwkJCS8qIHVwZGF0ZSBwcmVjaXNpb24gKi8KKwkJCWlmIChsX3Byb2R1Y3QgPiAqcF9tYXhfcHJlYykgeworCQkJCSpwX21heF9wcmVjID0gbF9wcm9kdWN0OworCQkJfQorCQl9CisJCSsrbF9pbWdfY29tcDsKKwkJKytsX3RjY3A7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIG9wal9nZXRfYWxsX2VuY29kaW5nX3BhcmFtZXRlcnMoICAgY29uc3Qgb3BqX2ltYWdlX3QgKnBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BqX2NwX3QgKnBfY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0aWxlbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90eDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90eDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90eTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90eTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZHhfbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2R5X21pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9tYXhfcHJlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9tYXhfcmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiogcF9yZXNvbHV0aW9ucyApCit7CisJLyogbG9vcCovCisJT1BKX1VJTlQzMiBjb21wbm8sIHJlc25vOworCisJLyogcG9pbnRlcnMqLworCWNvbnN0IG9wal90Y3BfdCAqdGNwID0gMDA7CisJY29uc3Qgb3BqX3RjY3BfdCAqIGxfdGNjcCA9IDAwOworCWNvbnN0IG9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wID0gMDA7CisKKwkvKiB0byBzdG9yZSBsX2R4LCBsX2R5LCB3IGFuZCBoIGZvciBlYWNoIHJlc29sdXRpb24gYW5kIGNvbXBvbmVudC4qLworCU9QSl9VSU5UMzIgKiBsUmVzb2x1dGlvblB0cjsKKworCS8qIHBvc2l0aW9uIGluIHggYW5kIHkgb2YgdGlsZSovCisJT1BKX1VJTlQzMiBwLCBxOworCisJLyogbm9uLWNvcnJlY3RlZCAoaW4gcmVnYXJkIHRvIGltYWdlIG9mZnNldCkgdGlsZSBvZmZzZXQgKi8KKwlPUEpfVUlOVDMyIGxfdHgwLCBsX3R5MDsKKworCS8qIHByZWNvbmRpdGlvbnMgaW4gZGVidWcqLworCWFzc2VydChwX2NwICE9IDAwKTsKKwlhc3NlcnQocF9pbWFnZSAhPSAwMCk7CisJYXNzZXJ0KHRpbGVubyA8IHBfY3AtPnR3ICogcF9jcC0+dGgpOworCisJLyogaW5pdGlhbGl6YXRpb25zKi8KKwl0Y3AgPSAmcF9jcC0+dGNwcyBbdGlsZW5vXTsKKwlsX3RjY3AgPSB0Y3AtPnRjY3BzOworCWxfaW1nX2NvbXAgPSBwX2ltYWdlLT5jb21wczsKKworCS8qIHBvc2l0aW9uIGluIHggYW5kIHkgb2YgdGlsZSovCisJcCA9IHRpbGVubyAlIHBfY3AtPnR3OworCXEgPSB0aWxlbm8gLyBwX2NwLT50dzsKKworCS8qIGhlcmUgY2FsY3VsYXRpb24gb2YgdHgwLCB0eDEsIHR5MCwgdHkxLCBtYXhwcmVjLCBsX2R4IGFuZCBsX2R5ICovCisJbF90eDAgPSBwX2NwLT50eDAgKyBwICogcF9jcC0+dGR4OyAvKiBjYW4ndCBiZSBncmVhdGVyIHRoYW4gcF9pbWFnZS0+eDEgc28gd29uJ3Qgb3ZlcmZsb3cgKi8KKwkqcF90eDAgPSAoT1BKX0lOVDMyKW9wal91aW50X21heChsX3R4MCwgcF9pbWFnZS0+eDApOworCSpwX3R4MSA9IChPUEpfSU5UMzIpb3BqX3VpbnRfbWluKG9wal91aW50X2FkZHMobF90eDAsIHBfY3AtPnRkeCksIHBfaW1hZ2UtPngxKTsKKwlsX3R5MCA9IHBfY3AtPnR5MCArIHEgKiBwX2NwLT50ZHk7IC8qIGNhbid0IGJlIGdyZWF0ZXIgdGhhbiBwX2ltYWdlLT55MSBzbyB3b24ndCBvdmVyZmxvdyAqLworCSpwX3R5MCA9IChPUEpfSU5UMzIpb3BqX3VpbnRfbWF4KGxfdHkwLCBwX2ltYWdlLT55MCk7CisJKnBfdHkxID0gKE9QSl9JTlQzMilvcGpfdWludF9taW4ob3BqX3VpbnRfYWRkcyhsX3R5MCwgcF9jcC0+dGR5KSwgcF9pbWFnZS0+eTEpOworCisJLyogbWF4IHByZWNpc2lvbiBhbmQgcmVzb2x1dGlvbiBpcyAwIChjYW4gb25seSBncm93KSovCisJKnBfbWF4X3ByZWMgPSAwOworCSpwX21heF9yZXMgPSAwOworCisJLyogdGFrZSB0aGUgbGFyZ2VzdCB2YWx1ZSBmb3IgZHhfbWluIGFuZCBkeV9taW4qLworCSpwX2R4X21pbiA9IDB4N2ZmZmZmZmY7CisJKnBfZHlfbWluID0gMHg3ZmZmZmZmZjsKKworCWZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgcF9pbWFnZS0+bnVtY29tcHM7ICsrY29tcG5vKSB7CisJCS8qIGFyaXRtZXRpYyB2YXJpYWJsZXMgdG8gY2FsY3VsYXRlKi8KKwkJT1BKX1VJTlQzMiBsX2xldmVsX25vOworCQlPUEpfSU5UMzIgbF9yeDAsIGxfcnkwLCBsX3J4MSwgbF9yeTE7CisJCU9QSl9JTlQzMiBsX3B4MCwgbF9weTAsIGxfcHgxLCBweTE7CisJCU9QSl9VSU5UMzIgbF9wcm9kdWN0OworCQlPUEpfSU5UMzIgbF90Y3gwLCBsX3RjeTAsIGxfdGN4MSwgbF90Y3kxOworCQlPUEpfVUlOVDMyIGxfcGR4LCBsX3BkeSAsIGxfcHcgLCBsX3BoOworCisJCWxSZXNvbHV0aW9uUHRyID0gcF9yZXNvbHV0aW9uc1tjb21wbm9dOworCisJCWxfdGN4MCA9IG9wal9pbnRfY2VpbGRpdigqcF90eDAsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHgpOworCQlsX3RjeTAgPSBvcGpfaW50X2NlaWxkaXYoKnBfdHkwLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR5KTsKKwkJbF90Y3gxID0gb3BqX2ludF9jZWlsZGl2KCpwX3R4MSwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5keCk7CisJCWxfdGN5MSA9IG9wal9pbnRfY2VpbGRpdigqcF90eTEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHkpOworCisJCWlmIChsX3RjY3AtPm51bXJlc29sdXRpb25zID4gKnBfbWF4X3JlcykgeworCQkJKnBfbWF4X3JlcyA9IGxfdGNjcC0+bnVtcmVzb2x1dGlvbnM7CisJCX0KKworCQkvKiB1c2UgY3VzdG9tIHNpemUgZm9yIHByZWNpbmN0cyovCisJCWxfbGV2ZWxfbm8gPSBsX3RjY3AtPm51bXJlc29sdXRpb25zIC0gMTsKKwkJZm9yIChyZXNubyA9IDA7IHJlc25vIDwgbF90Y2NwLT5udW1yZXNvbHV0aW9uczsgKytyZXNubykgeworCQkJT1BKX1VJTlQzMiBsX2R4LCBsX2R5OworCisJCQkvKiBwcmVjaW5jdCB3aWR0aCBhbmQgaGVpZ2h0Ki8KKwkJCWxfcGR4ID0gbF90Y2NwLT5wcmN3W3Jlc25vXTsKKwkJCWxfcGR5ID0gbF90Y2NwLT5wcmNoW3Jlc25vXTsKKwkJCSpsUmVzb2x1dGlvblB0cisrID0gbF9wZHg7CisJCQkqbFJlc29sdXRpb25QdHIrKyA9IGxfcGR5OworCQkJbF9keCA9IGxfaW1nX2NvbXAtPmR4ICogKDF1IDw8IChsX3BkeCArIGxfbGV2ZWxfbm8pKTsKKwkJCWxfZHkgPSBsX2ltZ19jb21wLT5keSAqICgxdSA8PCAobF9wZHkgKyBsX2xldmVsX25vKSk7CisJCQkvKiB0YWtlIHRoZSBtaW5pbXVtIHNpemUgZm9yIGxfZHggZm9yIGVhY2ggY29tcCBhbmQgcmVzb2x1dGlvbiovCisJCQkqcF9keF9taW4gPSAoT1BKX1VJTlQzMilvcGpfaW50X21pbigoT1BKX0lOVDMyKSpwX2R4X21pbiwgKE9QSl9JTlQzMilsX2R4KTsKKwkJCSpwX2R5X21pbiA9IChPUEpfVUlOVDMyKW9wal9pbnRfbWluKChPUEpfSU5UMzIpKnBfZHlfbWluLCAoT1BKX0lOVDMyKWxfZHkpOworCisJCQkvKiB2YXJpb3VzIGNhbGN1bGF0aW9ucyBvZiBleHRlbnRzKi8KKwkJCWxfcngwID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3RjeDAsIChPUEpfSU5UMzIpbF9sZXZlbF9ubyk7CisJCQlsX3J5MCA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF90Y3kwLCAoT1BKX0lOVDMyKWxfbGV2ZWxfbm8pOworCQkJbF9yeDEgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGN4MSwgKE9QSl9JTlQzMilsX2xldmVsX25vKTsKKwkJCWxfcnkxID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3RjeTEsIChPUEpfSU5UMzIpbF9sZXZlbF9ubyk7CisJCQlsX3B4MCA9IG9wal9pbnRfZmxvb3JkaXZwb3cyKGxfcngwLCAoT1BKX0lOVDMyKWxfcGR4KSA8PCBsX3BkeDsKKwkJCWxfcHkwID0gb3BqX2ludF9mbG9vcmRpdnBvdzIobF9yeTAsIChPUEpfSU5UMzIpbF9wZHkpIDw8IGxfcGR5OworCQkJbF9weDEgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfcngxLCAoT1BKX0lOVDMyKWxfcGR4KSA8PCBsX3BkeDsKKwkJCXB5MSA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF9yeTEsIChPUEpfSU5UMzIpbF9wZHkpIDw8IGxfcGR5OworCQkJbF9wdyA9IChsX3J4MD09bF9yeDEpPzA6KE9QSl9VSU5UMzIpKChsX3B4MSAtIGxfcHgwKSA+PiBsX3BkeCk7CisJCQlsX3BoID0gKGxfcnkwPT1sX3J5MSk/MDooT1BKX1VJTlQzMikoKHB5MSAtIGxfcHkwKSA+PiBsX3BkeSk7CisJCQkqbFJlc29sdXRpb25QdHIrKyA9IGxfcHc7CisJCQkqbFJlc29sdXRpb25QdHIrKyA9IGxfcGg7CisJCQlsX3Byb2R1Y3QgPSBsX3B3ICogbF9waDsKKwkJCQorICAgICAgICAgICAgLyogdXBkYXRlIHByZWNpc2lvbiovCisJCQlpZiAobF9wcm9kdWN0ID4gKnBfbWF4X3ByZWMpIHsKKwkJCQkqcF9tYXhfcHJlYyA9IGxfcHJvZHVjdDsKKwkJCX0KKworCQkJLS1sX2xldmVsX25vOworCQl9CisJCSsrbF90Y2NwOworCQkrK2xfaW1nX2NvbXA7CisJfQorfQorCitzdGF0aWMgb3BqX3BpX2l0ZXJhdG9yX3QgKiBvcGpfcGlfY3JlYXRlKAljb25zdCBvcGpfaW1hZ2VfdCAqaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGpfY3BfdCAqY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHRpbGVubyApCit7CisJLyogbG9vcCovCisJT1BKX1VJTlQzMiBwaW5vLCBjb21wbm87CisJLyogbnVtYmVyIG9mIHBvYyBpbiB0aGUgcF9waSovCisJT1BKX1VJTlQzMiBsX3BvY19ib3VuZDsKKworCS8qIHBvaW50ZXJzIHRvIHRpbGUgY29kaW5nIHBhcmFtZXRlcnMgYW5kIGNvbXBvbmVudHMuKi8KKwlvcGpfcGlfaXRlcmF0b3JfdCAqbF9waSA9IDAwOworCW9wal90Y3BfdCAqdGNwID0gMDA7CisJY29uc3Qgb3BqX3RjY3BfdCAqdGNjcCA9IDAwOworCisJLyogY3VycmVudCBwYWNrZXQgaXRlcmF0b3IgYmVpbmcgYWxsb2NhdGVkKi8KKwlvcGpfcGlfaXRlcmF0b3JfdCAqbF9jdXJyZW50X3BpID0gMDA7CisKKwkvKiBwcmVjb25kaXRpb25zIGluIGRlYnVnKi8KKwlhc3NlcnQoY3AgIT0gMDApOworCWFzc2VydChpbWFnZSAhPSAwMCk7CisJYXNzZXJ0KHRpbGVubyA8IGNwLT50dyAqIGNwLT50aCk7CisKKwkvKiBpbml0aWFsaXphdGlvbnMqLworCXRjcCA9ICZjcC0+dGNwc1t0aWxlbm9dOworCWxfcG9jX2JvdW5kID0gdGNwLT5udW1wb2NzKzE7CisKKwkvKiBtZW1vcnkgYWxsb2NhdGlvbnMqLworCWxfcGkgPSAob3BqX3BpX2l0ZXJhdG9yX3QqKSBvcGpfY2FsbG9jKChsX3BvY19ib3VuZCksIHNpemVvZihvcGpfcGlfaXRlcmF0b3JfdCkpOworCWlmICghbF9waSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlsX2N1cnJlbnRfcGkgPSBsX3BpOworCWZvciAocGlubyA9IDA7IHBpbm8gPCBsX3BvY19ib3VuZCA7ICsrcGlubykgeworCisJCWxfY3VycmVudF9waS0+Y29tcHMgPSAob3BqX3BpX2NvbXBfdCopIG9wal9jYWxsb2MoaW1hZ2UtPm51bWNvbXBzLCBzaXplb2Yob3BqX3BpX2NvbXBfdCkpOworCQlpZiAoISBsX2N1cnJlbnRfcGktPmNvbXBzKSB7CisJCQlvcGpfcGlfZGVzdHJveShsX3BpLCBsX3BvY19ib3VuZCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWxfY3VycmVudF9waS0+bnVtY29tcHMgPSBpbWFnZS0+bnVtY29tcHM7CisKKwkJZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBpbWFnZS0+bnVtY29tcHM7ICsrY29tcG5vKSB7CisJCQlvcGpfcGlfY29tcF90ICpjb21wID0gJmxfY3VycmVudF9waS0+Y29tcHNbY29tcG5vXTsKKworCQkJdGNjcCA9ICZ0Y3AtPnRjY3BzW2NvbXBub107CisKKwkJCWNvbXAtPnJlc29sdXRpb25zID0gKG9wal9waV9yZXNvbHV0aW9uX3QqKSBvcGpfY2FsbG9jKHRjY3AtPm51bXJlc29sdXRpb25zLCBzaXplb2Yob3BqX3BpX3Jlc29sdXRpb25fdCkpOworCQkJaWYgKCFjb21wLT5yZXNvbHV0aW9ucykgeworCQkJCW9wal9waV9kZXN0cm95KGxfcGksIGxfcG9jX2JvdW5kKTsKKwkJCQlyZXR1cm4gMDA7CisJCQl9CisKKwkJCWNvbXAtPm51bXJlc29sdXRpb25zID0gdGNjcC0+bnVtcmVzb2x1dGlvbnM7CisJCX0KKwkJKytsX2N1cnJlbnRfcGk7CisJfQorCXJldHVybiBsX3BpOworfQorCitzdGF0aWMgdm9pZCBvcGpfcGlfdXBkYXRlX2VuY29kZV9wb2NfYW5kX2ZpbmFsICggICBvcGpfY3BfdCAqcF9jcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfdHgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcF90eDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX3R5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfdHkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X3ByZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfcmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZHhfbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZHlfbWluKQoreworCS8qIGxvb3AqLworCU9QSl9VSU5UMzIgcGlubzsKKwkvKiB0aWxlIGNvZGluZyBwYXJhbWV0ZXIqLworCW9wal90Y3BfdCAqbF90Y3AgPSAwMDsKKwkvKiBjdXJyZW50IHBvYyBiZWluZyB1cGRhdGVkKi8KKwlvcGpfcG9jX3QgKiBsX2N1cnJlbnRfcG9jID0gMDA7CisKKwkvKiBudW1iZXIgb2YgcG9jcyovCisJT1BKX1VJTlQzMiBsX3BvY19ib3VuZDsKKworICAgIE9QSl9BUkdfTk9UX1VTRUQocF9tYXhfcmVzKTsKKworCS8qIHByZWNvbmRpdGlvbnMgaW4gZGVidWcqLworCWFzc2VydChwX2NwICE9IDAwKTsKKwlhc3NlcnQocF90aWxlbm8gPCBwX2NwLT50dyAqIHBfY3AtPnRoKTsKKworCS8qIGluaXRpYWxpemF0aW9ucyovCisJbF90Y3AgPSAmcF9jcC0+dGNwcyBbcF90aWxlbm9dOworCS8qIG51bWJlciBvZiBpdGVyYXRpb25zIGluIHRoZSBsb29wICovCisJbF9wb2NfYm91bmQgPSBsX3RjcC0+bnVtcG9jcysxOworCisJLyogc3RhcnQgYXQgZmlyc3QgZWxlbWVudCwgYW5kIHRvIG1ha2Ugc3VyZSB0aGUgY29tcGlsZXIgd2lsbCBub3QgbWFrZSBhIGNhbGN1bGF0aW9uIGVhY2ggdGltZSBpbiB0aGUgbG9vcAorCSAgIHN0b3JlIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBlbGVtZW50IHRvIG1vZGlmeSByYXRoZXIgdGhhbiBsX3RjcC0+cG9jc1tpXSovCisJbF9jdXJyZW50X3BvYyA9IGxfdGNwLT5wb2NzOworCisJbF9jdXJyZW50X3BvYy0+Y29tcFMgPSBsX2N1cnJlbnRfcG9jLT5jb21wbm8wOworCWxfY3VycmVudF9wb2MtPmNvbXBFID0gbF9jdXJyZW50X3BvYy0+Y29tcG5vMTsKKwlsX2N1cnJlbnRfcG9jLT5yZXNTID0gbF9jdXJyZW50X3BvYy0+cmVzbm8wOworCWxfY3VycmVudF9wb2MtPnJlc0UgPSBsX2N1cnJlbnRfcG9jLT5yZXNubzE7CisJbF9jdXJyZW50X3BvYy0+bGF5RSA9IGxfY3VycmVudF9wb2MtPmxheW5vMTsKKworCS8qIHNwZWNpYWwgdHJlYXRtZW50IGZvciB0aGUgZmlyc3QgZWxlbWVudCovCisJbF9jdXJyZW50X3BvYy0+bGF5UyA9IDA7CisJbF9jdXJyZW50X3BvYy0+cHJnICA9IGxfY3VycmVudF9wb2MtPnByZzE7CisJbF9jdXJyZW50X3BvYy0+cHJjUyA9IDA7CisKKwlsX2N1cnJlbnRfcG9jLT5wcmNFID0gcF9tYXhfcHJlYzsKKwlsX2N1cnJlbnRfcG9jLT50eFMgPSAoT1BKX1VJTlQzMilwX3R4MDsKKwlsX2N1cnJlbnRfcG9jLT50eEUgPSAoT1BKX1VJTlQzMilwX3R4MTsKKwlsX2N1cnJlbnRfcG9jLT50eVMgPSAoT1BKX1VJTlQzMilwX3R5MDsKKwlsX2N1cnJlbnRfcG9jLT50eUUgPSAoT1BKX1VJTlQzMilwX3R5MTsKKwlsX2N1cnJlbnRfcG9jLT5keCA9IHBfZHhfbWluOworCWxfY3VycmVudF9wb2MtPmR5ID0gcF9keV9taW47CisKKwkrKyBsX2N1cnJlbnRfcG9jOworCWZvciAocGlubyA9IDE7cGlubyA8IGxfcG9jX2JvdW5kIDsgKytwaW5vKSB7CisJCWxfY3VycmVudF9wb2MtPmNvbXBTID0gbF9jdXJyZW50X3BvYy0+Y29tcG5vMDsKKwkJbF9jdXJyZW50X3BvYy0+Y29tcEU9IGxfY3VycmVudF9wb2MtPmNvbXBubzE7CisJCWxfY3VycmVudF9wb2MtPnJlc1MgPSBsX2N1cnJlbnRfcG9jLT5yZXNubzA7CisJCWxfY3VycmVudF9wb2MtPnJlc0UgPSBsX2N1cnJlbnRfcG9jLT5yZXNubzE7CisJCWxfY3VycmVudF9wb2MtPmxheUUgPSBsX2N1cnJlbnRfcG9jLT5sYXlubzE7CisJCWxfY3VycmVudF9wb2MtPnByZyAgPSBsX2N1cnJlbnRfcG9jLT5wcmcxOworCQlsX2N1cnJlbnRfcG9jLT5wcmNTID0gMDsKKwkJLyogc3BlY2lhbCB0cmVhdG1lbnQgaGVyZSBkaWZmZXJlbnQgZnJvbSB0aGUgZmlyc3QgZWxlbWVudCovCisJCWxfY3VycmVudF9wb2MtPmxheVMgPSAobF9jdXJyZW50X3BvYy0+bGF5RSA+IChsX2N1cnJlbnRfcG9jLTEpLT5sYXlFKSA/IGxfY3VycmVudF9wb2MtPmxheUUgOiAwOworCisJCWxfY3VycmVudF9wb2MtPnByY0UgPSBwX21heF9wcmVjOworCQlsX2N1cnJlbnRfcG9jLT50eFMgPSAoT1BKX1VJTlQzMilwX3R4MDsKKwkJbF9jdXJyZW50X3BvYy0+dHhFID0gKE9QSl9VSU5UMzIpcF90eDE7CisJCWxfY3VycmVudF9wb2MtPnR5UyA9IChPUEpfVUlOVDMyKXBfdHkwOworCQlsX2N1cnJlbnRfcG9jLT50eUUgPSAoT1BKX1VJTlQzMilwX3R5MTsKKwkJbF9jdXJyZW50X3BvYy0+ZHggPSBwX2R4X21pbjsKKwkJbF9jdXJyZW50X3BvYy0+ZHkgPSBwX2R5X21pbjsKKwkJKysgbF9jdXJyZW50X3BvYzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9wal9waV91cGRhdGVfZW5jb2RlX25vdF9wb2MgKAlvcGpfY3BfdCAqcF9jcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9udW1fY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfdHgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfdHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfdHkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfdHkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9wcmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9yZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZHhfbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2R5X21pbikKK3sKKwkvKiBsb29wKi8KKwlPUEpfVUlOVDMyIHBpbm87CisJLyogdGlsZSBjb2RpbmcgcGFyYW1ldGVyKi8KKwlvcGpfdGNwX3QgKmxfdGNwID0gMDA7CisJLyogY3VycmVudCBwb2MgYmVpbmcgdXBkYXRlZCovCisJb3BqX3BvY190ICogbF9jdXJyZW50X3BvYyA9IDAwOworCS8qIG51bWJlciBvZiBwb2NzKi8KKwlPUEpfVUlOVDMyIGxfcG9jX2JvdW5kOworCisJLyogcHJlY29uZGl0aW9ucyBpbiBkZWJ1ZyovCisJYXNzZXJ0KHBfY3AgIT0gMDApOworCWFzc2VydChwX3RpbGVubyA8IHBfY3AtPnR3ICogcF9jcC0+dGgpOworCisJLyogaW5pdGlhbGl6YXRpb25zKi8KKwlsX3RjcCA9ICZwX2NwLT50Y3BzIFtwX3RpbGVub107CisKKwkvKiBudW1iZXIgb2YgaXRlcmF0aW9ucyBpbiB0aGUgbG9vcCAqLworCWxfcG9jX2JvdW5kID0gbF90Y3AtPm51bXBvY3MrMTsKKworCS8qIHN0YXJ0IGF0IGZpcnN0IGVsZW1lbnQsIGFuZCB0byBtYWtlIHN1cmUgdGhlIGNvbXBpbGVyIHdpbGwgbm90IG1ha2UgYSBjYWxjdWxhdGlvbiBlYWNoIHRpbWUgaW4gdGhlIGxvb3AKKwkgICBzdG9yZSBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZWxlbWVudCB0byBtb2RpZnkgcmF0aGVyIHRoYW4gbF90Y3AtPnBvY3NbaV0qLworCWxfY3VycmVudF9wb2MgPSBsX3RjcC0+cG9jczsKKworCWZvciAocGlubyA9IDA7IHBpbm8gPCBsX3BvY19ib3VuZCA7ICsrcGlubykgeworCQlsX2N1cnJlbnRfcG9jLT5jb21wUyA9IDA7CisJCWxfY3VycmVudF9wb2MtPmNvbXBFID0gcF9udW1fY29tcHM7LypwX2ltYWdlLT5udW1jb21wczsqLworCQlsX2N1cnJlbnRfcG9jLT5yZXNTID0gMDsKKwkJbF9jdXJyZW50X3BvYy0+cmVzRSA9IHBfbWF4X3JlczsKKwkJbF9jdXJyZW50X3BvYy0+bGF5UyA9IDA7CisJCWxfY3VycmVudF9wb2MtPmxheUUgPSBsX3RjcC0+bnVtbGF5ZXJzOworCQlsX2N1cnJlbnRfcG9jLT5wcmcgID0gbF90Y3AtPnByZzsKKwkJbF9jdXJyZW50X3BvYy0+cHJjUyA9IDA7CisJCWxfY3VycmVudF9wb2MtPnByY0UgPSBwX21heF9wcmVjOworCQlsX2N1cnJlbnRfcG9jLT50eFMgPSAoT1BKX1VJTlQzMilwX3R4MDsKKwkJbF9jdXJyZW50X3BvYy0+dHhFID0gKE9QSl9VSU5UMzIpcF90eDE7CisJCWxfY3VycmVudF9wb2MtPnR5UyA9IChPUEpfVUlOVDMyKXBfdHkwOworCQlsX2N1cnJlbnRfcG9jLT50eUUgPSAoT1BKX1VJTlQzMilwX3R5MTsKKwkJbF9jdXJyZW50X3BvYy0+ZHggPSBwX2R4X21pbjsKKwkJbF9jdXJyZW50X3BvYy0+ZHkgPSBwX2R5X21pbjsKKwkJKysgbF9jdXJyZW50X3BvYzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9wal9waV91cGRhdGVfZGVjb2RlX3BvYyAob3BqX3BpX2l0ZXJhdG9yX3QgKiBwX3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y3BfdCAqIHBfdGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfcHJlY2lzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfcmVzKQoreworCS8qIGxvb3AqLworCU9QSl9VSU5UMzIgcGlubzsKKworCS8qIGVuY29kaW5nIHByYW1ldGVycyB0byBzZXQqLworCU9QSl9VSU5UMzIgbF9ib3VuZDsKKworCW9wal9waV9pdGVyYXRvcl90ICogbF9jdXJyZW50X3BpID0gMDA7CisJb3BqX3BvY190KiBsX2N1cnJlbnRfcG9jID0gMDsKKworICAgIE9QSl9BUkdfTk9UX1VTRUQocF9tYXhfcmVzKTsKKworCS8qIHByZWNvbmRpdGlvbnMgaW4gZGVidWcqLworCWFzc2VydChwX3BpICE9IDAwKTsKKwlhc3NlcnQocF90Y3AgIT0gMDApOworCisJLyogaW5pdGlhbGl6YXRpb25zKi8KKwlsX2JvdW5kID0gcF90Y3AtPm51bXBvY3MrMTsKKwlsX2N1cnJlbnRfcGkgPSBwX3BpOworCWxfY3VycmVudF9wb2MgPSBwX3RjcC0+cG9jczsKKworCWZvcgkocGlubyA9IDA7cGlubzxsX2JvdW5kOysrcGlubykgeworCQlsX2N1cnJlbnRfcGktPnBvYy5wcmcgPSBsX2N1cnJlbnRfcG9jLT5wcmc7IC8qIFByb2dyZXNzaW9uIE9yZGVyICMwICovCisJCWxfY3VycmVudF9waS0+Zmlyc3QgPSAxOworCisJCWxfY3VycmVudF9waS0+cG9jLnJlc25vMCA9IGxfY3VycmVudF9wb2MtPnJlc25vMDsgLyogUmVzb2x1dGlvbiBMZXZlbCBJbmRleCAjMCAoU3RhcnQpICovCisJCWxfY3VycmVudF9waS0+cG9jLmNvbXBubzAgPSBsX2N1cnJlbnRfcG9jLT5jb21wbm8wOyAvKiBDb21wb25lbnQgSW5kZXggIzAgKFN0YXJ0KSAqLworCQlsX2N1cnJlbnRfcGktPnBvYy5sYXlubzAgPSAwOworCQlsX2N1cnJlbnRfcGktPnBvYy5wcmVjbm8wID0gMDsKKwkJbF9jdXJyZW50X3BpLT5wb2MucmVzbm8xID0gbF9jdXJyZW50X3BvYy0+cmVzbm8xOyAvKiBSZXNvbHV0aW9uIExldmVsIEluZGV4ICMwIChFbmQpICovCisJCWxfY3VycmVudF9waS0+cG9jLmNvbXBubzEgPSBsX2N1cnJlbnRfcG9jLT5jb21wbm8xOyAvKiBDb21wb25lbnQgSW5kZXggIzAgKEVuZCkgKi8KKwkJbF9jdXJyZW50X3BpLT5wb2MubGF5bm8xID0gbF9jdXJyZW50X3BvYy0+bGF5bm8xOyAvKiBMYXllciBJbmRleCAjMCAoRW5kKSAqLworCQlsX2N1cnJlbnRfcGktPnBvYy5wcmVjbm8xID0gcF9tYXhfcHJlY2lzaW9uOworCQkrK2xfY3VycmVudF9waTsKKwkJKytsX2N1cnJlbnRfcG9jOworCX0KK30KKworc3RhdGljIHZvaWQgb3BqX3BpX3VwZGF0ZV9kZWNvZGVfbm90X3BvYyAob3BqX3BpX2l0ZXJhdG9yX3QgKiBwX3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNwX3QgKiBwX3RjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9wcmVjaXNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfcmVzKQoreworCS8qIGxvb3AqLworCU9QSl9VSU5UMzIgcGlubzsKKworCS8qIGVuY29kaW5nIHByYW1ldGVycyB0byBzZXQqLworCU9QSl9VSU5UMzIgbF9ib3VuZDsKKworCW9wal9waV9pdGVyYXRvcl90ICogbF9jdXJyZW50X3BpID0gMDA7CisJLyogcHJlY29uZGl0aW9ucyBpbiBkZWJ1ZyovCisJYXNzZXJ0KHBfdGNwICE9IDAwKTsKKwlhc3NlcnQocF9waSAhPSAwMCk7CisKKwkvKiBpbml0aWFsaXphdGlvbnMqLworCWxfYm91bmQgPSBwX3RjcC0+bnVtcG9jcysxOworCWxfY3VycmVudF9waSA9IHBfcGk7CisKKwlmb3IgKHBpbm8gPSAwO3Bpbm88bF9ib3VuZDsrK3Bpbm8pIHsKKwkJbF9jdXJyZW50X3BpLT5wb2MucHJnID0gcF90Y3AtPnByZzsKKwkJbF9jdXJyZW50X3BpLT5maXJzdCA9IDE7CisJCWxfY3VycmVudF9waS0+cG9jLnJlc25vMCA9IDA7CisJCWxfY3VycmVudF9waS0+cG9jLmNvbXBubzAgPSAwOworCQlsX2N1cnJlbnRfcGktPnBvYy5sYXlubzAgPSAwOworCQlsX2N1cnJlbnRfcGktPnBvYy5wcmVjbm8wID0gMDsKKwkJbF9jdXJyZW50X3BpLT5wb2MucmVzbm8xID0gcF9tYXhfcmVzOworCQlsX2N1cnJlbnRfcGktPnBvYy5jb21wbm8xID0gbF9jdXJyZW50X3BpLT5udW1jb21wczsKKwkJbF9jdXJyZW50X3BpLT5wb2MubGF5bm8xID0gcF90Y3AtPm51bWxheWVyczsKKwkJbF9jdXJyZW50X3BpLT5wb2MucHJlY25vMSA9IHBfbWF4X3ByZWNpc2lvbjsKKwkJKytsX2N1cnJlbnRfcGk7CisJfQorfQorCisKKworc3RhdGljIE9QSl9CT09MIG9wal9waV9jaGVja19uZXh0X2xldmVsKAlPUEpfSU5UMzIgcG9zLAorCQkJCQkJCQlvcGpfY3BfdCAqY3AsCisJCQkJCQkJCU9QSl9VSU5UMzIgdGlsZW5vLAorCQkJCQkJCQlPUEpfVUlOVDMyIHBpbm8sCisJCQkJCQkJCWNvbnN0IE9QSl9DSEFSICpwcm9nKQoreworCU9QSl9JTlQzMiBpOworCW9wal90Y3BfdCAqdGNwcyA9JmNwLT50Y3BzW3RpbGVub107CisJb3BqX3BvY190ICp0Y3AgPSAmdGNwcy0+cG9jc1twaW5vXTsKKworCWlmKHBvcz49MCl7CisJCWZvcihpPXBvcztwb3M+PTA7aS0tKXsKKwkJCXN3aXRjaChwcm9nW2ldKXsKKwkJICAgIGNhc2UgJ1InOgorCQkJICAgIGlmKHRjcC0+cmVzX3Q9PXRjcC0+cmVzRSl7CisJCQkJICAgIGlmKG9wal9waV9jaGVja19uZXh0X2xldmVsKHBvcy0xLGNwLHRpbGVubyxwaW5vLHByb2cpKXsKKwkJCQkJICAgIHJldHVybiBPUEpfVFJVRTsKKwkJCQkgICAgfWVsc2V7CisJCQkJCSAgICByZXR1cm4gT1BKX0ZBTFNFOworCQkJCSAgICB9CisJCQkgICAgfWVsc2V7CisJCQkJICAgIHJldHVybiBPUEpfVFJVRTsKKwkJCSAgICB9CisJCQkgICAgYnJlYWs7CisJCSAgICBjYXNlICdDJzoKKwkJCSAgICBpZih0Y3AtPmNvbXBfdD09dGNwLT5jb21wRSl7CisJCQkJICAgIGlmKG9wal9waV9jaGVja19uZXh0X2xldmVsKHBvcy0xLGNwLHRpbGVubyxwaW5vLHByb2cpKXsKKwkJCQkJICAgIHJldHVybiBPUEpfVFJVRTsKKwkJCQkgICAgfWVsc2V7CisJCQkJCSAgICByZXR1cm4gT1BKX0ZBTFNFOworCQkJCSAgICB9CisJCQkgICAgfWVsc2V7CisJCQkJICAgIHJldHVybiBPUEpfVFJVRTsKKwkJCSAgICB9CisJCQkgICAgYnJlYWs7CisJCSAgICBjYXNlICdMJzoKKwkJCSAgICBpZih0Y3AtPmxheV90PT10Y3AtPmxheUUpeworCQkJCSAgICBpZihvcGpfcGlfY2hlY2tfbmV4dF9sZXZlbChwb3MtMSxjcCx0aWxlbm8scGlubyxwcm9nKSl7CisJCQkJCSAgICByZXR1cm4gT1BKX1RSVUU7CisJCQkJICAgIH1lbHNleworCQkJCQkgICAgcmV0dXJuIE9QSl9GQUxTRTsKKwkJCQkgICAgfQorCQkJICAgIH1lbHNleworCQkJCSAgICByZXR1cm4gT1BKX1RSVUU7CisJCQkgICAgfQorCQkJICAgIGJyZWFrOworCQkgICAgY2FzZSAnUCc6CisJCQkgICAgc3dpdGNoKHRjcC0+cHJnKXsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUEpfTFJDUDogLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BKX1JMQ1A6CisJCQkJCSAgICBpZih0Y3AtPnByY190ID09IHRjcC0+cHJjRSl7CisJCQkJCQkgICAgaWYob3BqX3BpX2NoZWNrX25leHRfbGV2ZWwoaS0xLGNwLHRpbGVubyxwaW5vLHByb2cpKXsKKwkJCQkJCQkgICAgcmV0dXJuIE9QSl9UUlVFOworCQkJCQkJICAgIH1lbHNleworCQkJCQkJCSAgICByZXR1cm4gT1BKX0ZBTFNFOworCQkJCQkJICAgIH0KKwkJCQkJICAgIH1lbHNleworCQkJCQkJICAgIHJldHVybiBPUEpfVFJVRTsKKwkJCQkJICAgIH0KKwkJCQkJICAgIGJyZWFrOworCQkJICAgIGRlZmF1bHQ6CisJCQkJICAgIGlmKHRjcC0+dHgwX3QgPT0gdGNwLT50eEUpeworCQkJCQkgICAgLypUWSovCisJCQkJCSAgICBpZih0Y3AtPnR5MF90ID09IHRjcC0+dHlFKXsKKwkJCQkJCSAgICBpZihvcGpfcGlfY2hlY2tfbmV4dF9sZXZlbChpLTEsY3AsdGlsZW5vLHBpbm8scHJvZykpeworCQkJCQkJCSAgICByZXR1cm4gT1BKX1RSVUU7CisJCQkJCQkgICAgfWVsc2V7CisJCQkJCQkJICAgIHJldHVybiBPUEpfRkFMU0U7CisJCQkJCQkgICAgfQorCQkJCQkgICAgfWVsc2V7CisJCQkJCQkgICAgcmV0dXJuIE9QSl9UUlVFOworCQkJCQkgICAgfS8qVFkqLworCQkJCSAgICB9ZWxzZXsKKwkJCQkJICAgIHJldHVybiBPUEpfVFJVRTsKKwkJCQkgICAgfQorCQkJCSAgICBicmVhazsKKwkJCSAgICB9LyplbmQgY2FzZSBQKi8KKwkJICAgIH0vKmVuZCBzd2l0Y2gqLworCQl9LyplbmQgZm9yKi8KKwl9LyplbmQgaWYqLworCXJldHVybiBPUEpfRkFMU0U7Cit9CisKKworLyoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIFBhY2tldCBpdGVyYXRvciBpbnRlcmZhY2UKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCitvcGpfcGlfaXRlcmF0b3JfdCAqb3BqX3BpX2NyZWF0ZV9kZWNvZGUob3BqX2ltYWdlX3QgKnBfaW1hZ2UsCisJCQkJCQkJCQkJb3BqX2NwX3QgKnBfY3AsCisJCQkJCQkJCQkJT1BKX1VJTlQzMiBwX3RpbGVfbm8pCit7CisJLyogbG9vcCAqLworCU9QSl9VSU5UMzIgcGlubzsKKwlPUEpfVUlOVDMyIGNvbXBubywgcmVzbm87CisKKwkvKiB0byBzdG9yZSB3LCBoLCBkeCBhbmQgZHkgZnJvIGFsbCBjb21wb25lbnRzIGFuZCByZXNvbHV0aW9ucyAqLworCU9QSl9VSU5UMzIgKiBsX3RtcF9kYXRhOworCU9QSl9VSU5UMzIgKiogbF90bXBfcHRyOworCisJLyogZW5jb2RpbmcgcHJhbWV0ZXJzIHRvIHNldCAqLworCU9QSl9VSU5UMzIgbF9tYXhfcmVzOworCU9QSl9VSU5UMzIgbF9tYXhfcHJlYzsKKwlPUEpfSU5UMzIgbF90eDAsbF90eDEsbF90eTAsbF90eTE7CisJT1BKX1VJTlQzMiBsX2R4X21pbixsX2R5X21pbjsKKwlPUEpfVUlOVDMyIGxfYm91bmQ7CisJT1BKX1VJTlQzMiBsX3N0ZXBfcCAsIGxfc3RlcF9jICwgbF9zdGVwX3IgLCBsX3N0ZXBfbCA7CisJT1BKX1VJTlQzMiBsX2RhdGFfc3RyaWRlOworCisJLyogcG9pbnRlcnMgKi8KKwlvcGpfcGlfaXRlcmF0b3JfdCAqbF9waSA9IDAwOworCW9wal90Y3BfdCAqbF90Y3AgPSAwMDsKKwljb25zdCBvcGpfdGNjcF90ICpsX3RjY3AgPSAwMDsKKwlvcGpfcGlfY29tcF90ICpsX2N1cnJlbnRfY29tcCA9IDAwOworCW9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wID0gMDA7CisJb3BqX3BpX2l0ZXJhdG9yX3QgKiBsX2N1cnJlbnRfcGkgPSAwMDsKKwlPUEpfVUlOVDMyICogbF9lbmNvZGluZ192YWx1ZV9wdHIgPSAwMDsKKworCS8qIHByZWNvbmRpdGlvbnMgaW4gZGVidWcgKi8KKwlhc3NlcnQocF9jcCAhPSAwMCk7CisJYXNzZXJ0KHBfaW1hZ2UgIT0gMDApOworCWFzc2VydChwX3RpbGVfbm8gPCBwX2NwLT50dyAqIHBfY3AtPnRoKTsKKworCS8qIGluaXRpYWxpemF0aW9ucyAqLworCWxfdGNwID0gJnBfY3AtPnRjcHNbcF90aWxlX25vXTsKKwlsX2JvdW5kID0gbF90Y3AtPm51bXBvY3MrMTsKKworCWxfZGF0YV9zdHJpZGUgPSA0ICogT1BKX0oyS19NQVhSTFZMUzsKKwlsX3RtcF9kYXRhID0gKE9QSl9VSU5UMzIqKW9wal9tYWxsb2MoCisJCWxfZGF0YV9zdHJpZGUgKiBwX2ltYWdlLT5udW1jb21wcyAqIHNpemVvZihPUEpfVUlOVDMyKSk7CisJaWYKKwkJKCEgbF90bXBfZGF0YSkKKwl7CisJCXJldHVybiAwMDsKKwl9CisJbF90bXBfcHRyID0gKE9QSl9VSU5UMzIqKilvcGpfbWFsbG9jKAorCQlwX2ltYWdlLT5udW1jb21wcyAqIHNpemVvZihPUEpfVUlOVDMyICopKTsKKwlpZgorCQkoISBsX3RtcF9wdHIpCisJeworCQlvcGpfZnJlZShsX3RtcF9kYXRhKTsKKwkJcmV0dXJuIDAwOworCX0KKworCS8qIG1lbW9yeSBhbGxvY2F0aW9uIGZvciBwaSAqLworCWxfcGkgPSBvcGpfcGlfY3JlYXRlKHBfaW1hZ2UsIHBfY3AsIHBfdGlsZV9ubyk7CisJaWYgKCFsX3BpKSB7CisJCW9wal9mcmVlKGxfdG1wX2RhdGEpOworCQlvcGpfZnJlZShsX3RtcF9wdHIpOworCQlyZXR1cm4gMDA7CisJfQorCisJbF9lbmNvZGluZ192YWx1ZV9wdHIgPSBsX3RtcF9kYXRhOworCS8qIHVwZGF0ZSBwb2ludGVyIGFycmF5ICovCisJZm9yCisJCShjb21wbm8gPSAwOyBjb21wbm8gPCBwX2ltYWdlLT5udW1jb21wczsgKytjb21wbm8pCisJeworCQlsX3RtcF9wdHJbY29tcG5vXSA9IGxfZW5jb2RpbmdfdmFsdWVfcHRyOworCQlsX2VuY29kaW5nX3ZhbHVlX3B0ciArPSBsX2RhdGFfc3RyaWRlOworCX0KKwkvKiBnZXQgZW5jb2RpbmcgcGFyYW1ldGVycyAqLworCW9wal9nZXRfYWxsX2VuY29kaW5nX3BhcmFtZXRlcnMocF9pbWFnZSxwX2NwLHBfdGlsZV9ubywmbF90eDAsJmxfdHgxLCZsX3R5MCwmbF90eTEsJmxfZHhfbWluLCZsX2R5X21pbiwmbF9tYXhfcHJlYywmbF9tYXhfcmVzLGxfdG1wX3B0cik7CisKKwkvKiBzdGVwIGNhbGN1bGF0aW9ucyAqLworCWxfc3RlcF9wID0gMTsKKwlsX3N0ZXBfYyA9IGxfbWF4X3ByZWMgKiBsX3N0ZXBfcDsKKwlsX3N0ZXBfciA9IHBfaW1hZ2UtPm51bWNvbXBzICogbF9zdGVwX2M7CisJbF9zdGVwX2wgPSBsX21heF9yZXMgKiBsX3N0ZXBfcjsKKworCS8qIHNldCB2YWx1ZXMgZm9yIGZpcnN0IHBhY2tldCBpdGVyYXRvciAqLworCWxfY3VycmVudF9waSA9IGxfcGk7CisKKwkvKiBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgaW5jbHVkZSAqLworCWxfY3VycmVudF9waS0+aW5jbHVkZSA9IDAwOworCWlmCisJCShsX3N0ZXBfbCAmJiBsX3RjcC0+bnVtbGF5ZXJzIDwgVUlOVF9NQVggLyBsX3N0ZXBfbCAtIDEpCisJeworCQlsX2N1cnJlbnRfcGktPmluY2x1ZGUgPSAoT1BKX0lOVDE2KilvcGpfY2FsbG9jKChsX3RjcC0+bnVtbGF5ZXJzICsgMSkgKiBsX3N0ZXBfbCwgc2l6ZW9mKE9QSl9JTlQxNikpOworCX0KKworCWlmCisJCSghbF9jdXJyZW50X3BpLT5pbmNsdWRlKQorCXsKKwkJb3BqX2ZyZWUobF90bXBfZGF0YSk7CisJCW9wal9mcmVlKGxfdG1wX3B0cik7CisJCW9wal9waV9kZXN0cm95KGxfcGksIGxfYm91bmQpOworCQlyZXR1cm4gMDA7CisJfQorCisJLyogc3BlY2lhbCB0cmVhdG1lbnQgZm9yIHRoZSBmaXJzdCBwYWNrZXQgaXRlcmF0b3IgKi8KKwlsX2N1cnJlbnRfY29tcCA9IGxfY3VycmVudF9waS0+Y29tcHM7CisJbF9pbWdfY29tcCA9IHBfaW1hZ2UtPmNvbXBzOworCWxfdGNjcCA9IGxfdGNwLT50Y2NwczsKKworCWxfY3VycmVudF9waS0+dHgwID0gbF90eDA7CisJbF9jdXJyZW50X3BpLT50eTAgPSBsX3R5MDsKKwlsX2N1cnJlbnRfcGktPnR4MSA9IGxfdHgxOworCWxfY3VycmVudF9waS0+dHkxID0gbF90eTE7CisKKwkvKmxfY3VycmVudF9waS0+ZHggPSBsX2ltZ19jb21wLT5keDsqLworCS8qbF9jdXJyZW50X3BpLT5keSA9IGxfaW1nX2NvbXAtPmR5OyovCisKKwlsX2N1cnJlbnRfcGktPnN0ZXBfcCA9IGxfc3RlcF9wOworCWxfY3VycmVudF9waS0+c3RlcF9jID0gbF9zdGVwX2M7CisJbF9jdXJyZW50X3BpLT5zdGVwX3IgPSBsX3N0ZXBfcjsKKwlsX2N1cnJlbnRfcGktPnN0ZXBfbCA9IGxfc3RlcF9sOworCisJLyogYWxsb2NhdGlvbiBmb3IgY29tcG9uZW50cyBhbmQgbnVtYmVyIG9mIGNvbXBvbmVudHMgaGFzIGFscmVhZHkgYmVlbiBjYWxjdWxhdGVkIGJ5IG9wal9waV9jcmVhdGUgKi8KKwlmb3IKKwkJKGNvbXBubyA9IDA7IGNvbXBubyA8IGxfY3VycmVudF9waS0+bnVtY29tcHM7ICsrY29tcG5vKQorCXsKKwkJb3BqX3BpX3Jlc29sdXRpb25fdCAqbF9yZXMgPSBsX2N1cnJlbnRfY29tcC0+cmVzb2x1dGlvbnM7CisJCWxfZW5jb2RpbmdfdmFsdWVfcHRyID0gbF90bXBfcHRyW2NvbXBub107CisKKwkJbF9jdXJyZW50X2NvbXAtPmR4ID0gbF9pbWdfY29tcC0+ZHg7CisJCWxfY3VycmVudF9jb21wLT5keSA9IGxfaW1nX2NvbXAtPmR5OworCQkvKiByZXNvbHV0aW9ucyBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCAqLworCQlmb3IKKwkJCShyZXNubyA9IDA7IHJlc25vIDwgbF9jdXJyZW50X2NvbXAtPm51bXJlc29sdXRpb25zOyByZXNubysrKQorCQl7CisJCQlsX3Jlcy0+cGR4ID0gKihsX2VuY29kaW5nX3ZhbHVlX3B0cisrKTsKKwkJCWxfcmVzLT5wZHkgPSAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOworCQkJbF9yZXMtPnB3ID0gICoobF9lbmNvZGluZ192YWx1ZV9wdHIrKyk7CisJCQlsX3Jlcy0+cGggPSAgKihsX2VuY29kaW5nX3ZhbHVlX3B0cisrKTsKKwkJCSsrbF9yZXM7CisJCX0KKwkJKytsX2N1cnJlbnRfY29tcDsKKwkJKytsX2ltZ19jb21wOworCQkrK2xfdGNjcDsKKwl9CisJKytsX2N1cnJlbnRfcGk7CisKKwlmb3IgKHBpbm8gPSAxIDsgcGlubzxsX2JvdW5kIDsgKytwaW5vICkKKwl7CisJCWxfY3VycmVudF9jb21wID0gbF9jdXJyZW50X3BpLT5jb21wczsKKwkJbF9pbWdfY29tcCA9IHBfaW1hZ2UtPmNvbXBzOworCQlsX3RjY3AgPSBsX3RjcC0+dGNjcHM7CisKKwkJbF9jdXJyZW50X3BpLT50eDAgPSBsX3R4MDsKKwkJbF9jdXJyZW50X3BpLT50eTAgPSBsX3R5MDsKKwkJbF9jdXJyZW50X3BpLT50eDEgPSBsX3R4MTsKKwkJbF9jdXJyZW50X3BpLT50eTEgPSBsX3R5MTsKKwkJLypsX2N1cnJlbnRfcGktPmR4ID0gbF9keF9taW47Ki8KKwkJLypsX2N1cnJlbnRfcGktPmR5ID0gbF9keV9taW47Ki8KKwkJbF9jdXJyZW50X3BpLT5zdGVwX3AgPSBsX3N0ZXBfcDsKKwkJbF9jdXJyZW50X3BpLT5zdGVwX2MgPSBsX3N0ZXBfYzsKKwkJbF9jdXJyZW50X3BpLT5zdGVwX3IgPSBsX3N0ZXBfcjsKKwkJbF9jdXJyZW50X3BpLT5zdGVwX2wgPSBsX3N0ZXBfbDsKKworCQkvKiBhbGxvY2F0aW9uIGZvciBjb21wb25lbnRzIGFuZCBudW1iZXIgb2YgY29tcG9uZW50cyBoYXMgYWxyZWFkeSBiZWVuIGNhbGN1bGF0ZWQgYnkgb3BqX3BpX2NyZWF0ZSAqLworCQlmb3IKKwkJCShjb21wbm8gPSAwOyBjb21wbm8gPCBsX2N1cnJlbnRfcGktPm51bWNvbXBzOyArK2NvbXBubykKKwkJeworCQkJb3BqX3BpX3Jlc29sdXRpb25fdCAqbF9yZXMgPSBsX2N1cnJlbnRfY29tcC0+cmVzb2x1dGlvbnM7CisJCQlsX2VuY29kaW5nX3ZhbHVlX3B0ciA9IGxfdG1wX3B0cltjb21wbm9dOworCisJCQlsX2N1cnJlbnRfY29tcC0+ZHggPSBsX2ltZ19jb21wLT5keDsKKwkJCWxfY3VycmVudF9jb21wLT5keSA9IGxfaW1nX2NvbXAtPmR5OworCQkJLyogcmVzb2x1dGlvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgKi8KKwkJCWZvcgorCQkJCShyZXNubyA9IDA7IHJlc25vIDwgbF9jdXJyZW50X2NvbXAtPm51bXJlc29sdXRpb25zOyByZXNubysrKQorCQkJeworCQkJCWxfcmVzLT5wZHggPSAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOworCQkJCWxfcmVzLT5wZHkgPSAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOworCQkJCWxfcmVzLT5wdyA9ICAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOworCQkJCWxfcmVzLT5waCA9ICAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOworCQkJCSsrbF9yZXM7CisJCQl9CisJCQkrK2xfY3VycmVudF9jb21wOworCQkJKytsX2ltZ19jb21wOworCQkJKytsX3RjY3A7CisJCX0KKwkJLyogc3BlY2lhbCB0cmVhdG1lbnQqLworCQlsX2N1cnJlbnRfcGktPmluY2x1ZGUgPSAobF9jdXJyZW50X3BpLTEpLT5pbmNsdWRlOworCQkrK2xfY3VycmVudF9waTsKKwl9CisJb3BqX2ZyZWUobF90bXBfZGF0YSk7CisJbF90bXBfZGF0YSA9IDAwOworCW9wal9mcmVlKGxfdG1wX3B0cik7CisJbF90bXBfcHRyID0gMDA7CisJaWYKKwkJKGxfdGNwLT5QT0MpCisJeworCQlvcGpfcGlfdXBkYXRlX2RlY29kZV9wb2MgKGxfcGksbF90Y3AsbF9tYXhfcHJlYyxsX21heF9yZXMpOworCX0KKwllbHNlCisJeworCQlvcGpfcGlfdXBkYXRlX2RlY29kZV9ub3RfcG9jKGxfcGksbF90Y3AsbF9tYXhfcHJlYyxsX21heF9yZXMpOworCX0KKwlyZXR1cm4gbF9waTsKK30KKworCisKK29wal9waV9pdGVyYXRvcl90ICpvcGpfcGlfaW5pdGlhbGlzZV9lbmNvZGUoY29uc3Qgb3BqX2ltYWdlX3QgKnBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jcF90ICpwX2NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9ubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSjJLX1QyX01PREUgcF90Ml9tb2RlICkKK3sKKwkvKiBsb29wKi8KKwlPUEpfVUlOVDMyIHBpbm87CisJT1BKX1VJTlQzMiBjb21wbm8sIHJlc25vOworCisJLyogdG8gc3RvcmUgdywgaCwgZHggYW5kIGR5IGZybyBhbGwgY29tcG9uZW50cyBhbmQgcmVzb2x1dGlvbnMqLworCU9QSl9VSU5UMzIgKiBsX3RtcF9kYXRhOworCU9QSl9VSU5UMzIgKiogbF90bXBfcHRyOworCisJLyogZW5jb2RpbmcgcHJhbWV0ZXJzIHRvIHNldCovCisJT1BKX1VJTlQzMiBsX21heF9yZXM7CisJT1BKX1VJTlQzMiBsX21heF9wcmVjOworCU9QSl9JTlQzMiBsX3R4MCxsX3R4MSxsX3R5MCxsX3R5MTsKKwlPUEpfVUlOVDMyIGxfZHhfbWluLGxfZHlfbWluOworCU9QSl9VSU5UMzIgbF9ib3VuZDsKKwlPUEpfVUlOVDMyIGxfc3RlcF9wICwgbF9zdGVwX2MgLCBsX3N0ZXBfciAsIGxfc3RlcF9sIDsKKwlPUEpfVUlOVDMyIGxfZGF0YV9zdHJpZGU7CisKKwkvKiBwb2ludGVycyovCisJb3BqX3BpX2l0ZXJhdG9yX3QgKmxfcGkgPSAwMDsKKwlvcGpfdGNwX3QgKmxfdGNwID0gMDA7CisJY29uc3Qgb3BqX3RjY3BfdCAqbF90Y2NwID0gMDA7CisJb3BqX3BpX2NvbXBfdCAqbF9jdXJyZW50X2NvbXAgPSAwMDsKKwlvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IDAwOworCW9wal9waV9pdGVyYXRvcl90ICogbF9jdXJyZW50X3BpID0gMDA7CisJT1BKX1VJTlQzMiAqIGxfZW5jb2RpbmdfdmFsdWVfcHRyID0gMDA7CisKKwkvKiBwcmVjb25kaXRpb25zIGluIGRlYnVnKi8KKwlhc3NlcnQocF9jcCAhPSAwMCk7CisJYXNzZXJ0KHBfaW1hZ2UgIT0gMDApOworCWFzc2VydChwX3RpbGVfbm8gPCBwX2NwLT50dyAqIHBfY3AtPnRoKTsKKworCS8qIGluaXRpYWxpemF0aW9ucyovCisJbF90Y3AgPSAmcF9jcC0+dGNwc1twX3RpbGVfbm9dOworCWxfYm91bmQgPSBsX3RjcC0+bnVtcG9jcysxOworCisJbF9kYXRhX3N0cmlkZSA9IDQgKiBPUEpfSjJLX01BWFJMVkxTOworCWxfdG1wX2RhdGEgPSAoT1BKX1VJTlQzMiopb3BqX21hbGxvYygKKwkJbF9kYXRhX3N0cmlkZSAqIHBfaW1hZ2UtPm51bWNvbXBzICogc2l6ZW9mKE9QSl9VSU5UMzIpKTsKKwlpZiAoISBsX3RtcF9kYXRhKSB7CisJCXJldHVybiAwMDsKKwl9CisKKwlsX3RtcF9wdHIgPSAoT1BKX1VJTlQzMioqKW9wal9tYWxsb2MoCisJCXBfaW1hZ2UtPm51bWNvbXBzICogc2l6ZW9mKE9QSl9VSU5UMzIgKikpOworCWlmICghIGxfdG1wX3B0cikgeworCQlvcGpfZnJlZShsX3RtcF9kYXRhKTsKKwkJcmV0dXJuIDAwOworCX0KKworCS8qIG1lbW9yeSBhbGxvY2F0aW9uIGZvciBwaSovCisJbF9waSA9IG9wal9waV9jcmVhdGUocF9pbWFnZSxwX2NwLHBfdGlsZV9ubyk7CisJaWYgKCFsX3BpKSB7CisJCW9wal9mcmVlKGxfdG1wX2RhdGEpOworCQlvcGpfZnJlZShsX3RtcF9wdHIpOworCQlyZXR1cm4gMDA7CisJfQorCisJbF9lbmNvZGluZ192YWx1ZV9wdHIgPSBsX3RtcF9kYXRhOworCS8qIHVwZGF0ZSBwb2ludGVyIGFycmF5Ki8KKwlmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHBfaW1hZ2UtPm51bWNvbXBzOyArK2NvbXBubykgeworCQlsX3RtcF9wdHJbY29tcG5vXSA9IGxfZW5jb2RpbmdfdmFsdWVfcHRyOworCQlsX2VuY29kaW5nX3ZhbHVlX3B0ciArPSBsX2RhdGFfc3RyaWRlOworCX0KKworCS8qIGdldCBlbmNvZGluZyBwYXJhbWV0ZXJzKi8KKwlvcGpfZ2V0X2FsbF9lbmNvZGluZ19wYXJhbWV0ZXJzKHBfaW1hZ2UscF9jcCxwX3RpbGVfbm8sJmxfdHgwLCZsX3R4MSwmbF90eTAsJmxfdHkxLCZsX2R4X21pbiwmbF9keV9taW4sJmxfbWF4X3ByZWMsJmxfbWF4X3JlcyxsX3RtcF9wdHIpOworCisJLyogc3RlcCBjYWxjdWxhdGlvbnMqLworCWxfc3RlcF9wID0gMTsKKwlsX3N0ZXBfYyA9IGxfbWF4X3ByZWMgKiBsX3N0ZXBfcDsKKwlsX3N0ZXBfciA9IHBfaW1hZ2UtPm51bWNvbXBzICogbF9zdGVwX2M7CisJbF9zdGVwX2wgPSBsX21heF9yZXMgKiBsX3N0ZXBfcjsKKworCS8qIHNldCB2YWx1ZXMgZm9yIGZpcnN0IHBhY2tldCBpdGVyYXRvciovCisJbF9waS0+dHBfb24gPSAoT1BKX0JZVEUpcF9jcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX3RwX29uOworCWxfY3VycmVudF9waSA9IGxfcGk7CisKKwkvKiBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgaW5jbHVkZSovCisJbF9jdXJyZW50X3BpLT5pbmNsdWRlID0gKE9QSl9JTlQxNiopIG9wal9jYWxsb2MobF90Y3AtPm51bWxheWVycyAqIGxfc3RlcF9sLCBzaXplb2YoT1BKX0lOVDE2KSk7CisJaWYgKCFsX2N1cnJlbnRfcGktPmluY2x1ZGUpIHsKKwkJb3BqX2ZyZWUobF90bXBfZGF0YSk7CisJCW9wal9mcmVlKGxfdG1wX3B0cik7CisJCW9wal9waV9kZXN0cm95KGxfcGksIGxfYm91bmQpOworCQlyZXR1cm4gMDA7CisJfQorCisJLyogc3BlY2lhbCB0cmVhdG1lbnQgZm9yIHRoZSBmaXJzdCBwYWNrZXQgaXRlcmF0b3IqLworCWxfY3VycmVudF9jb21wID0gbF9jdXJyZW50X3BpLT5jb21wczsKKwlsX2ltZ19jb21wID0gcF9pbWFnZS0+Y29tcHM7CisJbF90Y2NwID0gbF90Y3AtPnRjY3BzOworCWxfY3VycmVudF9waS0+dHgwID0gbF90eDA7CisJbF9jdXJyZW50X3BpLT50eTAgPSBsX3R5MDsKKwlsX2N1cnJlbnRfcGktPnR4MSA9IGxfdHgxOworCWxfY3VycmVudF9waS0+dHkxID0gbF90eTE7CisJbF9jdXJyZW50X3BpLT5keCA9IGxfZHhfbWluOworCWxfY3VycmVudF9waS0+ZHkgPSBsX2R5X21pbjsKKwlsX2N1cnJlbnRfcGktPnN0ZXBfcCA9IGxfc3RlcF9wOworCWxfY3VycmVudF9waS0+c3RlcF9jID0gbF9zdGVwX2M7CisJbF9jdXJyZW50X3BpLT5zdGVwX3IgPSBsX3N0ZXBfcjsKKwlsX2N1cnJlbnRfcGktPnN0ZXBfbCA9IGxfc3RlcF9sOworCisJLyogYWxsb2NhdGlvbiBmb3IgY29tcG9uZW50cyBhbmQgbnVtYmVyIG9mIGNvbXBvbmVudHMgaGFzIGFscmVhZHkgYmVlbiBjYWxjdWxhdGVkIGJ5IG9wal9waV9jcmVhdGUgKi8KKwlmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IGxfY3VycmVudF9waS0+bnVtY29tcHM7ICsrY29tcG5vKSB7CisJCW9wal9waV9yZXNvbHV0aW9uX3QgKmxfcmVzID0gbF9jdXJyZW50X2NvbXAtPnJlc29sdXRpb25zOworCQlsX2VuY29kaW5nX3ZhbHVlX3B0ciA9IGxfdG1wX3B0cltjb21wbm9dOworCisJCWxfY3VycmVudF9jb21wLT5keCA9IGxfaW1nX2NvbXAtPmR4OworCQlsX2N1cnJlbnRfY29tcC0+ZHkgPSBsX2ltZ19jb21wLT5keTsKKworCQkvKiByZXNvbHV0aW9ucyBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCAqLworCQlmb3IgKHJlc25vID0gMDsgcmVzbm8gPCBsX2N1cnJlbnRfY29tcC0+bnVtcmVzb2x1dGlvbnM7IHJlc25vKyspIHsKKwkJCWxfcmVzLT5wZHggPSAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOworCQkJbF9yZXMtPnBkeSA9ICoobF9lbmNvZGluZ192YWx1ZV9wdHIrKyk7CisJCQlsX3Jlcy0+cHcgPSAgKihsX2VuY29kaW5nX3ZhbHVlX3B0cisrKTsKKwkJCWxfcmVzLT5waCA9ICAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOworCQkJKytsX3JlczsKKwkJfQorCisJCSsrbF9jdXJyZW50X2NvbXA7CisJCSsrbF9pbWdfY29tcDsKKwkJKytsX3RjY3A7CisJfQorCSsrbF9jdXJyZW50X3BpOworCisJZm9yIChwaW5vID0gMSA7IHBpbm88bF9ib3VuZCA7ICsrcGlubyApIHsKKwkJbF9jdXJyZW50X2NvbXAgPSBsX2N1cnJlbnRfcGktPmNvbXBzOworCQlsX2ltZ19jb21wID0gcF9pbWFnZS0+Y29tcHM7CisJCWxfdGNjcCA9IGxfdGNwLT50Y2NwczsKKworCQlsX2N1cnJlbnRfcGktPnR4MCA9IGxfdHgwOworCQlsX2N1cnJlbnRfcGktPnR5MCA9IGxfdHkwOworCQlsX2N1cnJlbnRfcGktPnR4MSA9IGxfdHgxOworCQlsX2N1cnJlbnRfcGktPnR5MSA9IGxfdHkxOworCQlsX2N1cnJlbnRfcGktPmR4ID0gbF9keF9taW47CisJCWxfY3VycmVudF9waS0+ZHkgPSBsX2R5X21pbjsKKwkJbF9jdXJyZW50X3BpLT5zdGVwX3AgPSBsX3N0ZXBfcDsKKwkJbF9jdXJyZW50X3BpLT5zdGVwX2MgPSBsX3N0ZXBfYzsKKwkJbF9jdXJyZW50X3BpLT5zdGVwX3IgPSBsX3N0ZXBfcjsKKwkJbF9jdXJyZW50X3BpLT5zdGVwX2wgPSBsX3N0ZXBfbDsKKworCQkvKiBhbGxvY2F0aW9uIGZvciBjb21wb25lbnRzIGFuZCBudW1iZXIgb2YgY29tcG9uZW50cyBoYXMgYWxyZWFkeSBiZWVuIGNhbGN1bGF0ZWQgYnkgb3BqX3BpX2NyZWF0ZSAqLworCQlmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IGxfY3VycmVudF9waS0+bnVtY29tcHM7ICsrY29tcG5vKSB7CisJCQlvcGpfcGlfcmVzb2x1dGlvbl90ICpsX3JlcyA9IGxfY3VycmVudF9jb21wLT5yZXNvbHV0aW9uczsKKwkJCWxfZW5jb2RpbmdfdmFsdWVfcHRyID0gbF90bXBfcHRyW2NvbXBub107CisKKwkJCWxfY3VycmVudF9jb21wLT5keCA9IGxfaW1nX2NvbXAtPmR4OworCQkJbF9jdXJyZW50X2NvbXAtPmR5ID0gbF9pbWdfY29tcC0+ZHk7CisJCQkvKiByZXNvbHV0aW9ucyBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCAqLworCQkJZm9yIChyZXNubyA9IDA7IHJlc25vIDwgbF9jdXJyZW50X2NvbXAtPm51bXJlc29sdXRpb25zOyByZXNubysrKSB7CisJCQkJbF9yZXMtPnBkeCA9ICoobF9lbmNvZGluZ192YWx1ZV9wdHIrKyk7CisJCQkJbF9yZXMtPnBkeSA9ICoobF9lbmNvZGluZ192YWx1ZV9wdHIrKyk7CisJCQkJbF9yZXMtPnB3ID0gICoobF9lbmNvZGluZ192YWx1ZV9wdHIrKyk7CisJCQkJbF9yZXMtPnBoID0gICoobF9lbmNvZGluZ192YWx1ZV9wdHIrKyk7CisJCQkJKytsX3JlczsKKwkJCX0KKwkJCSsrbF9jdXJyZW50X2NvbXA7CisJCQkrK2xfaW1nX2NvbXA7CisJCQkrK2xfdGNjcDsKKwkJfQorCisJCS8qIHNwZWNpYWwgdHJlYXRtZW50Ki8KKwkJbF9jdXJyZW50X3BpLT5pbmNsdWRlID0gKGxfY3VycmVudF9waS0xKS0+aW5jbHVkZTsKKwkJKytsX2N1cnJlbnRfcGk7CisJfQorCisJb3BqX2ZyZWUobF90bXBfZGF0YSk7CisJbF90bXBfZGF0YSA9IDAwOworCW9wal9mcmVlKGxfdG1wX3B0cik7CisJbF90bXBfcHRyID0gMDA7CisKKyAgICBpZiAobF90Y3AtPlBPQyAmJiAoT1BKX0lTX0NJTkVNQShwX2NwLT5yc2l6KSB8fCBwX3QyX21vZGUgPT0gRklOQUxfUEFTUykpIHsKKwkJb3BqX3BpX3VwZGF0ZV9lbmNvZGVfcG9jX2FuZF9maW5hbChwX2NwLHBfdGlsZV9ubyxsX3R4MCxsX3R4MSxsX3R5MCxsX3R5MSxsX21heF9wcmVjLGxfbWF4X3JlcyxsX2R4X21pbixsX2R5X21pbik7CisJfQorCWVsc2UgeworCQlvcGpfcGlfdXBkYXRlX2VuY29kZV9ub3RfcG9jKHBfY3AscF9pbWFnZS0+bnVtY29tcHMscF90aWxlX25vLGxfdHgwLGxfdHgxLGxfdHkwLGxfdHkxLGxfbWF4X3ByZWMsbF9tYXhfcmVzLGxfZHhfbWluLGxfZHlfbWluKTsKKwl9CisKKwlyZXR1cm4gbF9waTsKK30KKwordm9pZCBvcGpfcGlfY3JlYXRlX2VuY29kZSggCW9wal9waV9pdGVyYXRvcl90ICpwaSwKKwkJCQkJCQlvcGpfY3BfdCAqY3AsCisJCQkJCQkJT1BKX1VJTlQzMiB0aWxlbm8sCisJCQkJCQkJT1BKX1VJTlQzMiBwaW5vLAorCQkJCQkJCU9QSl9VSU5UMzIgdHBudW0sCisJCQkJCQkJT1BKX0lOVDMyIHRwcG9zLAorCQkJCQkJCUoyS19UMl9NT0RFIHQyX21vZGUpCit7CisJY29uc3QgT1BKX0NIQVIgKnByb2c7CisJT1BKX0lOVDMyIGk7CisJT1BKX1VJTlQzMiBpbmNyX3RvcD0xLHJlc2V0WD0wOworCW9wal90Y3BfdCAqdGNwcyA9JmNwLT50Y3BzW3RpbGVub107CisJb3BqX3BvY190ICp0Y3A9ICZ0Y3BzLT5wb2NzW3Bpbm9dOworCisJcHJvZyA9IG9wal9qMmtfY29udmVydF9wcm9ncmVzc2lvbl9vcmRlcih0Y3AtPnByZyk7CisKKwlwaVtwaW5vXS5maXJzdCA9IDE7CisJcGlbcGlub10ucG9jLnByZyA9IHRjcC0+cHJnOworCisgICAgaWYoIShjcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX3RwX29uICYmICgoIU9QSl9JU19DSU5FTUEoY3AtPnJzaXopICYmICh0Ml9tb2RlID09IEZJTkFMX1BBU1MpKSB8fCBPUEpfSVNfQ0lORU1BKGNwLT5yc2l6KSkpKXsKKwkJcGlbcGlub10ucG9jLnJlc25vMCA9IHRjcC0+cmVzUzsKKwkJcGlbcGlub10ucG9jLnJlc25vMSA9IHRjcC0+cmVzRTsKKwkJcGlbcGlub10ucG9jLmNvbXBubzAgPSB0Y3AtPmNvbXBTOworCQlwaVtwaW5vXS5wb2MuY29tcG5vMSA9IHRjcC0+Y29tcEU7CisJCXBpW3Bpbm9dLnBvYy5sYXlubzAgPSB0Y3AtPmxheVM7CisJCXBpW3Bpbm9dLnBvYy5sYXlubzEgPSB0Y3AtPmxheUU7CisJCXBpW3Bpbm9dLnBvYy5wcmVjbm8wID0gdGNwLT5wcmNTOworCQlwaVtwaW5vXS5wb2MucHJlY25vMSA9IHRjcC0+cHJjRTsKKwkJcGlbcGlub10ucG9jLnR4MCA9IChPUEpfSU5UMzIpdGNwLT50eFM7CisJCXBpW3Bpbm9dLnBvYy50eTAgPSAoT1BKX0lOVDMyKXRjcC0+dHlTOworCQlwaVtwaW5vXS5wb2MudHgxID0gKE9QSl9JTlQzMil0Y3AtPnR4RTsKKwkJcGlbcGlub10ucG9jLnR5MSA9IChPUEpfSU5UMzIpdGNwLT50eUU7CisJfWVsc2UgeworCQlmb3IoaT10cHBvcysxO2k8NDtpKyspeworCQkJc3dpdGNoKHByb2dbaV0peworCQkJY2FzZSAnUic6CisJCQkJcGlbcGlub10ucG9jLnJlc25vMCA9IHRjcC0+cmVzUzsKKwkJCQlwaVtwaW5vXS5wb2MucmVzbm8xID0gdGNwLT5yZXNFOworCQkJCWJyZWFrOworCQkJY2FzZSAnQyc6CisJCQkJcGlbcGlub10ucG9jLmNvbXBubzAgPSB0Y3AtPmNvbXBTOworCQkJCXBpW3Bpbm9dLnBvYy5jb21wbm8xID0gdGNwLT5jb21wRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ0wnOgorCQkJCXBpW3Bpbm9dLnBvYy5sYXlubzAgPSB0Y3AtPmxheVM7CisJCQkJcGlbcGlub10ucG9jLmxheW5vMSA9IHRjcC0+bGF5RTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1AnOgorCQkJCXN3aXRjaCh0Y3AtPnByZyl7CisJCQkJY2FzZSBPUEpfTFJDUDoKKwkJCQljYXNlIE9QSl9STENQOgorCQkJCQlwaVtwaW5vXS5wb2MucHJlY25vMCA9IHRjcC0+cHJjUzsKKwkJCQkJcGlbcGlub10ucG9jLnByZWNubzEgPSB0Y3AtPnByY0U7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXBpW3Bpbm9dLnBvYy50eDAgPSAoT1BKX0lOVDMyKXRjcC0+dHhTOworCQkJCQlwaVtwaW5vXS5wb2MudHkwID0gKE9QSl9JTlQzMil0Y3AtPnR5UzsKKwkJCQkJcGlbcGlub10ucG9jLnR4MSA9IChPUEpfSU5UMzIpdGNwLT50eEU7CisJCQkJCXBpW3Bpbm9dLnBvYy50eTEgPSAoT1BKX0lOVDMyKXRjcC0+dHlFOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZih0cG51bT09MCl7CisJCQlmb3IoaT10cHBvcztpPj0wO2ktLSl7CisJCQkJc3dpdGNoKHByb2dbaV0peworCQkJCWNhc2UgJ0MnOgorCQkJCQl0Y3AtPmNvbXBfdCA9IHRjcC0+Y29tcFM7CisJCQkJCXBpW3Bpbm9dLnBvYy5jb21wbm8wID0gdGNwLT5jb21wX3Q7CisJCQkJCXBpW3Bpbm9dLnBvYy5jb21wbm8xID0gdGNwLT5jb21wX3QrMTsKKwkJCQkJdGNwLT5jb21wX3QrPTE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1InOgorCQkJCQl0Y3AtPnJlc190ID0gdGNwLT5yZXNTOworCQkJCQlwaVtwaW5vXS5wb2MucmVzbm8wID0gdGNwLT5yZXNfdDsKKwkJCQkJcGlbcGlub10ucG9jLnJlc25vMSA9IHRjcC0+cmVzX3QrMTsKKwkJCQkJdGNwLT5yZXNfdCs9MTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnTCc6CisJCQkJCXRjcC0+bGF5X3QgPSB0Y3AtPmxheVM7CisJCQkJCXBpW3Bpbm9dLnBvYy5sYXlubzAgPSB0Y3AtPmxheV90OworCQkJCQlwaVtwaW5vXS5wb2MubGF5bm8xID0gdGNwLT5sYXlfdCsxOworCQkJCQl0Y3AtPmxheV90Kz0xOworCQkJCQlicmVhazsKKwkJCQljYXNlICdQJzoKKwkJCQkJc3dpdGNoKHRjcC0+cHJnKXsKKwkJCQkJY2FzZSBPUEpfTFJDUDoKKwkJCQkJY2FzZSBPUEpfUkxDUDoKKwkJCQkJCXRjcC0+cHJjX3QgPSB0Y3AtPnByY1M7CisJCQkJCQlwaVtwaW5vXS5wb2MucHJlY25vMCA9IHRjcC0+cHJjX3Q7CisJCQkJCQlwaVtwaW5vXS5wb2MucHJlY25vMSA9IHRjcC0+cHJjX3QrMTsKKwkJCQkJCXRjcC0+cHJjX3QrPTE7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXRjcC0+dHgwX3QgPSB0Y3AtPnR4UzsKKwkJCQkJCXRjcC0+dHkwX3QgPSB0Y3AtPnR5UzsKKwkJCQkJCXBpW3Bpbm9dLnBvYy50eDAgPSAoT1BKX0lOVDMyKXRjcC0+dHgwX3Q7CisJCQkJCQlwaVtwaW5vXS5wb2MudHgxID0gKE9QSl9JTlQzMikodGNwLT50eDBfdCArIHRjcC0+ZHggLSAodGNwLT50eDBfdCAlIHRjcC0+ZHgpKTsKKwkJCQkJCXBpW3Bpbm9dLnBvYy50eTAgPSAoT1BKX0lOVDMyKXRjcC0+dHkwX3Q7CisJCQkJCQlwaVtwaW5vXS5wb2MudHkxID0gKE9QSl9JTlQzMikodGNwLT50eTBfdCArIHRjcC0+ZHkgLSAodGNwLT50eTBfdCAlIHRjcC0+ZHkpKTsKKwkJCQkJCXRjcC0+dHgwX3QgPSAoT1BKX1VJTlQzMilwaVtwaW5vXS5wb2MudHgxOworCQkJCQkJdGNwLT50eTBfdCA9IChPUEpfVUlOVDMyKXBpW3Bpbm9dLnBvYy50eTE7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpbmNyX3RvcD0xOworCQl9ZWxzZXsKKwkJCWZvcihpPXRwcG9zO2k+PTA7aS0tKXsKKwkJCQlzd2l0Y2gocHJvZ1tpXSl7CisJCQkJY2FzZSAnQyc6CisJCQkJCXBpW3Bpbm9dLnBvYy5jb21wbm8wID0gdGNwLT5jb21wX3QtMTsKKwkJCQkJcGlbcGlub10ucG9jLmNvbXBubzEgPSB0Y3AtPmNvbXBfdDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnUic6CisJCQkJCXBpW3Bpbm9dLnBvYy5yZXNubzAgPSB0Y3AtPnJlc190LTE7CisJCQkJCXBpW3Bpbm9dLnBvYy5yZXNubzEgPSB0Y3AtPnJlc190OworCQkJCQlicmVhazsKKwkJCQljYXNlICdMJzoKKwkJCQkJcGlbcGlub10ucG9jLmxheW5vMCA9IHRjcC0+bGF5X3QtMTsKKwkJCQkJcGlbcGlub10ucG9jLmxheW5vMSA9IHRjcC0+bGF5X3Q7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1AnOgorCQkJCQlzd2l0Y2godGNwLT5wcmcpeworCQkJCQljYXNlIE9QSl9MUkNQOgorCQkJCQljYXNlIE9QSl9STENQOgorCQkJCQkJcGlbcGlub10ucG9jLnByZWNubzAgPSB0Y3AtPnByY190LTE7CisJCQkJCQlwaVtwaW5vXS5wb2MucHJlY25vMSA9IHRjcC0+cHJjX3Q7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCXBpW3Bpbm9dLnBvYy50eDAgPSAoT1BKX0lOVDMyKSh0Y3AtPnR4MF90IC0gdGNwLT5keCAtICh0Y3AtPnR4MF90ICUgdGNwLT5keCkpOworCQkJCQkJcGlbcGlub10ucG9jLnR4MSA9IChPUEpfSU5UMzIpdGNwLT50eDBfdCA7CisJCQkJCQlwaVtwaW5vXS5wb2MudHkwID0gKE9QSl9JTlQzMikodGNwLT50eTBfdCAtIHRjcC0+ZHkgLSAodGNwLT50eTBfdCAlIHRjcC0+ZHkpKTsKKwkJCQkJCXBpW3Bpbm9dLnBvYy50eTEgPSAoT1BKX0lOVDMyKXRjcC0+dHkwX3QgOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmKGluY3JfdG9wPT0xKXsKKwkJCQkJc3dpdGNoKHByb2dbaV0peworCQkJCQljYXNlICdSJzoKKwkJCQkJCWlmKHRjcC0+cmVzX3Q9PXRjcC0+cmVzRSl7CisJCQkJCQkJaWYob3BqX3BpX2NoZWNrX25leHRfbGV2ZWwoaS0xLGNwLHRpbGVubyxwaW5vLHByb2cpKXsKKwkJCQkJCQkJdGNwLT5yZXNfdCA9IHRjcC0+cmVzUzsKKwkJCQkJCQkJcGlbcGlub10ucG9jLnJlc25vMCA9IHRjcC0+cmVzX3Q7CisJCQkJCQkJCXBpW3Bpbm9dLnBvYy5yZXNubzEgPSB0Y3AtPnJlc190KzE7CisJCQkJCQkJCXRjcC0+cmVzX3QrPTE7CisJCQkJCQkJCWluY3JfdG9wPTE7CisJCQkJCQkJfWVsc2V7CisJCQkJCQkJCWluY3JfdG9wPTA7CisJCQkJCQkJfQorCQkJCQkJfWVsc2V7CisJCQkJCQkJcGlbcGlub10ucG9jLnJlc25vMCA9IHRjcC0+cmVzX3Q7CisJCQkJCQkJcGlbcGlub10ucG9jLnJlc25vMSA9IHRjcC0+cmVzX3QrMTsKKwkJCQkJCQl0Y3AtPnJlc190Kz0xOworCQkJCQkJCWluY3JfdG9wPTA7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAnQyc6CisJCQkJCQlpZih0Y3AtPmNvbXBfdCA9PXRjcC0+Y29tcEUpeworCQkJCQkJCWlmKG9wal9waV9jaGVja19uZXh0X2xldmVsKGktMSxjcCx0aWxlbm8scGlubyxwcm9nKSl7CisJCQkJCQkJCXRjcC0+Y29tcF90ID0gdGNwLT5jb21wUzsKKwkJCQkJCQkJcGlbcGlub10ucG9jLmNvbXBubzAgPSB0Y3AtPmNvbXBfdDsKKwkJCQkJCQkJcGlbcGlub10ucG9jLmNvbXBubzEgPSB0Y3AtPmNvbXBfdCsxOworCQkJCQkJCQl0Y3AtPmNvbXBfdCs9MTsKKwkJCQkJCQkJaW5jcl90b3A9MTsKKwkJCQkJCQl9ZWxzZXsKKwkJCQkJCQkJaW5jcl90b3A9MDsKKwkJCQkJCQl9CisJCQkJCQl9ZWxzZXsKKwkJCQkJCQlwaVtwaW5vXS5wb2MuY29tcG5vMCA9IHRjcC0+Y29tcF90OworCQkJCQkJCXBpW3Bpbm9dLnBvYy5jb21wbm8xID0gdGNwLT5jb21wX3QrMTsKKwkJCQkJCQl0Y3AtPmNvbXBfdCs9MTsKKwkJCQkJCQlpbmNyX3RvcD0wOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJ0wnOgorCQkJCQkJaWYodGNwLT5sYXlfdCA9PSB0Y3AtPmxheUUpeworCQkJCQkJCWlmKG9wal9waV9jaGVja19uZXh0X2xldmVsKGktMSxjcCx0aWxlbm8scGlubyxwcm9nKSl7CisJCQkJCQkJCXRjcC0+bGF5X3QgPSB0Y3AtPmxheVM7CisJCQkJCQkJCXBpW3Bpbm9dLnBvYy5sYXlubzAgPSB0Y3AtPmxheV90OworCQkJCQkJCQlwaVtwaW5vXS5wb2MubGF5bm8xID0gdGNwLT5sYXlfdCsxOworCQkJCQkJCQl0Y3AtPmxheV90Kz0xOworCQkJCQkJCQlpbmNyX3RvcD0xOworCQkJCQkJCX1lbHNleworCQkJCQkJCQlpbmNyX3RvcD0wOworCQkJCQkJCX0KKwkJCQkJCX1lbHNleworCQkJCQkJCXBpW3Bpbm9dLnBvYy5sYXlubzAgPSB0Y3AtPmxheV90OworCQkJCQkJCXBpW3Bpbm9dLnBvYy5sYXlubzEgPSB0Y3AtPmxheV90KzE7CisJCQkJCQkJdGNwLT5sYXlfdCs9MTsKKwkJCQkJCQlpbmNyX3RvcD0wOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgJ1AnOgorCQkJCQkJc3dpdGNoKHRjcC0+cHJnKXsKKwkJCQkJCWNhc2UgT1BKX0xSQ1A6CisJCQkJCQljYXNlIE9QSl9STENQOgorCQkJCQkJCWlmKHRjcC0+cHJjX3QgPT0gdGNwLT5wcmNFKXsKKwkJCQkJCQkJaWYob3BqX3BpX2NoZWNrX25leHRfbGV2ZWwoaS0xLGNwLHRpbGVubyxwaW5vLHByb2cpKXsKKwkJCQkJCQkJCXRjcC0+cHJjX3QgPSB0Y3AtPnByY1M7CisJCQkJCQkJCQlwaVtwaW5vXS5wb2MucHJlY25vMCA9IHRjcC0+cHJjX3Q7CisJCQkJCQkJCQlwaVtwaW5vXS5wb2MucHJlY25vMSA9IHRjcC0+cHJjX3QrMTsKKwkJCQkJCQkJCXRjcC0+cHJjX3QrPTE7CisJCQkJCQkJCQlpbmNyX3RvcD0xOworCQkJCQkJCQl9ZWxzZXsKKwkJCQkJCQkJCWluY3JfdG9wPTA7CisJCQkJCQkJCX0KKwkJCQkJCQl9ZWxzZXsKKwkJCQkJCQkJcGlbcGlub10ucG9jLnByZWNubzAgPSB0Y3AtPnByY190OworCQkJCQkJCQlwaVtwaW5vXS5wb2MucHJlY25vMSA9IHRjcC0+cHJjX3QrMTsKKwkJCQkJCQkJdGNwLT5wcmNfdCs9MTsKKwkJCQkJCQkJaW5jcl90b3A9MDsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQlkZWZhdWx0OgorCQkJCQkJCWlmKHRjcC0+dHgwX3QgPj0gdGNwLT50eEUpeworCQkJCQkJCQlpZih0Y3AtPnR5MF90ID49IHRjcC0+dHlFKXsKKwkJCQkJCQkJCWlmKG9wal9waV9jaGVja19uZXh0X2xldmVsKGktMSxjcCx0aWxlbm8scGlubyxwcm9nKSl7CisJCQkJCQkJCQkJdGNwLT50eTBfdCA9IHRjcC0+dHlTOworCQkJCQkJCQkJCXBpW3Bpbm9dLnBvYy50eTAgPSAoT1BKX0lOVDMyKXRjcC0+dHkwX3Q7CisJCQkJCQkJCQkJcGlbcGlub10ucG9jLnR5MSA9IChPUEpfSU5UMzIpKHRjcC0+dHkwX3QgKyB0Y3AtPmR5IC0gKHRjcC0+dHkwX3QgJSB0Y3AtPmR5KSk7CisJCQkJCQkJCQkJdGNwLT50eTBfdCA9IChPUEpfVUlOVDMyKXBpW3Bpbm9dLnBvYy50eTE7CisJCQkJCQkJCQkJaW5jcl90b3A9MTtyZXNldFg9MTsKKwkJCQkJCQkJCX1lbHNleworCQkJCQkJCQkJCWluY3JfdG9wPTA7cmVzZXRYPTA7CisJCQkJCQkJCQl9CisJCQkJCQkJCX1lbHNleworCQkJCQkJCQkJcGlbcGlub10ucG9jLnR5MCA9IChPUEpfSU5UMzIpdGNwLT50eTBfdDsKKwkJCQkJCQkJCXBpW3Bpbm9dLnBvYy50eTEgPSAoT1BKX0lOVDMyKSh0Y3AtPnR5MF90ICsgdGNwLT5keSAtICh0Y3AtPnR5MF90ICUgdGNwLT5keSkpOworCQkJCQkJCQkJdGNwLT50eTBfdCA9IChPUEpfVUlOVDMyKXBpW3Bpbm9dLnBvYy50eTE7CisJCQkJCQkJCQlpbmNyX3RvcD0wO3Jlc2V0WD0xOworCQkJCQkJCQl9CisJCQkJCQkJCWlmKHJlc2V0WD09MSl7CisJCQkJCQkJCQl0Y3AtPnR4MF90ID0gdGNwLT50eFM7CisJCQkJCQkJCQlwaVtwaW5vXS5wb2MudHgwID0gKE9QSl9JTlQzMil0Y3AtPnR4MF90OworCQkJCQkJCQkJcGlbcGlub10ucG9jLnR4MSA9IChPUEpfSU5UMzIpKHRjcC0+dHgwX3QgKyB0Y3AtPmR4LSAodGNwLT50eDBfdCAlIHRjcC0+ZHgpKTsKKwkJCQkJCQkJCXRjcC0+dHgwX3QgPSAoT1BKX1VJTlQzMilwaVtwaW5vXS5wb2MudHgxOworCQkJCQkJCQl9CisJCQkJCQkJfWVsc2V7CisJCQkJCQkJCXBpW3Bpbm9dLnBvYy50eDAgPSAoT1BKX0lOVDMyKXRjcC0+dHgwX3Q7CisJCQkJCQkJCXBpW3Bpbm9dLnBvYy50eDEgPSAoT1BKX0lOVDMyKSh0Y3AtPnR4MF90ICsgdGNwLT5keC0gKHRjcC0+dHgwX3QgJSB0Y3AtPmR4KSk7CisJCQkJCQkJCXRjcC0+dHgwX3QgPSAoT1BKX1VJTlQzMilwaVtwaW5vXS5wb2MudHgxOworCQkJCQkJCQlpbmNyX3RvcD0wOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCit2b2lkIG9wal9waV9kZXN0cm95KG9wal9waV9pdGVyYXRvcl90ICpwX3BpLAorICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbmJfZWxlbWVudHMpCit7CisJT1BKX1VJTlQzMiBjb21wbm8sIHBpbm87CisJb3BqX3BpX2l0ZXJhdG9yX3QgKmxfY3VycmVudF9waSA9IHBfcGk7CisgICAgaWYgKHBfcGkpIHsKKwkJaWYgKHBfcGktPmluY2x1ZGUpIHsKKwkJCW9wal9mcmVlKHBfcGktPmluY2x1ZGUpOworCQkJcF9waS0+aW5jbHVkZSA9IDAwOworCQl9CisJCWZvciAocGlubyA9IDA7IHBpbm8gPCBwX25iX2VsZW1lbnRzOyArK3Bpbm8peworCQkJaWYobF9jdXJyZW50X3BpLT5jb21wcykgeworCQkJCW9wal9waV9jb21wX3QgKmxfY3VycmVudF9jb21wb25lbnQgPSBsX2N1cnJlbnRfcGktPmNvbXBzOworICAgICAgICAgICAgICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgbF9jdXJyZW50X3BpLT5udW1jb21wczsgY29tcG5vKyspeworICAgICAgICAgICAgICAgICAgICBpZihsX2N1cnJlbnRfY29tcG9uZW50LT5yZXNvbHV0aW9ucykgeworCQkJCQkJb3BqX2ZyZWUobF9jdXJyZW50X2NvbXBvbmVudC0+cmVzb2x1dGlvbnMpOworCQkJCQkJbF9jdXJyZW50X2NvbXBvbmVudC0+cmVzb2x1dGlvbnMgPSAwMDsKKwkJCQkJfQorCisJCQkJCSsrbF9jdXJyZW50X2NvbXBvbmVudDsKKwkJCQl9CisJCQkJb3BqX2ZyZWUobF9jdXJyZW50X3BpLT5jb21wcyk7CisJCQkJbF9jdXJyZW50X3BpLT5jb21wcyA9IDA7CisJCQl9CisJCQkrK2xfY3VycmVudF9waTsKKwkJfQorCQlvcGpfZnJlZShwX3BpKTsKKwl9Cit9CisKKworCit2b2lkIG9wal9waV91cGRhdGVfZW5jb2RpbmdfcGFyYW1ldGVycygJY29uc3Qgb3BqX2ltYWdlX3QgKnBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NwX3QgKnBfY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8gKQoreworCS8qIGVuY29kaW5nIHBhcmFtZXRlcnMgdG8gc2V0ICovCisJT1BKX1VJTlQzMiBsX21heF9yZXM7CisJT1BKX1VJTlQzMiBsX21heF9wcmVjOworCU9QSl9JTlQzMiBsX3R4MCxsX3R4MSxsX3R5MCxsX3R5MTsKKwlPUEpfVUlOVDMyIGxfZHhfbWluLGxfZHlfbWluOworCisJLyogcG9pbnRlcnMgKi8KKwlvcGpfdGNwX3QgKmxfdGNwID0gMDA7CisKKwkvKiBwcmVjb25kaXRpb25zICovCisJYXNzZXJ0KHBfY3AgIT0gMDApOworCWFzc2VydChwX2ltYWdlICE9IDAwKTsKKwlhc3NlcnQocF90aWxlX25vIDwgcF9jcC0+dHcgKiBwX2NwLT50aCk7CisKKwlsX3RjcCA9ICYocF9jcC0+dGNwc1twX3RpbGVfbm9dKTsKKworCS8qIGdldCBlbmNvZGluZyBwYXJhbWV0ZXJzICovCisJb3BqX2dldF9lbmNvZGluZ19wYXJhbWV0ZXJzKHBfaW1hZ2UscF9jcCxwX3RpbGVfbm8sJmxfdHgwLCZsX3R4MSwmbF90eTAsJmxfdHkxLCZsX2R4X21pbiwmbF9keV9taW4sJmxfbWF4X3ByZWMsJmxfbWF4X3Jlcyk7CisKKwlpZiAobF90Y3AtPlBPQykgeworCQlvcGpfcGlfdXBkYXRlX2VuY29kZV9wb2NfYW5kX2ZpbmFsKHBfY3AscF90aWxlX25vLGxfdHgwLGxfdHgxLGxfdHkwLGxfdHkxLGxfbWF4X3ByZWMsbF9tYXhfcmVzLGxfZHhfbWluLGxfZHlfbWluKTsKKwl9CisJZWxzZSB7CisJCW9wal9waV91cGRhdGVfZW5jb2RlX25vdF9wb2MocF9jcCxwX2ltYWdlLT5udW1jb21wcyxwX3RpbGVfbm8sbF90eDAsbF90eDEsbF90eTAsbF90eTEsbF9tYXhfcHJlYyxsX21heF9yZXMsbF9keF9taW4sbF9keV9taW4pOworCX0KK30KKworT1BKX0JPT0wgb3BqX3BpX25leHQob3BqX3BpX2l0ZXJhdG9yX3QgKiBwaSkgeworCXN3aXRjaCAocGktPnBvYy5wcmcpIHsKKwkJY2FzZSBPUEpfTFJDUDoKKwkJCXJldHVybiBvcGpfcGlfbmV4dF9scmNwKHBpKTsKKwkJY2FzZSBPUEpfUkxDUDoKKwkJCXJldHVybiBvcGpfcGlfbmV4dF9ybGNwKHBpKTsKKwkJY2FzZSBPUEpfUlBDTDoKKwkJCXJldHVybiBvcGpfcGlfbmV4dF9ycGNsKHBpKTsKKwkJY2FzZSBPUEpfUENSTDoKKwkJCXJldHVybiBvcGpfcGlfbmV4dF9wY3JsKHBpKTsKKwkJY2FzZSBPUEpfQ1BSTDoKKwkJCXJldHVybiBvcGpfcGlfbmV4dF9jcHJsKHBpKTsKKwkJY2FzZSBPUEpfUFJPR19VTktOT1dOOgorCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwl9CisJCisJcmV0dXJuIE9QSl9GQUxTRTsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvcGkuaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjVkNWIxCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9waS5oCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCisgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFVuaXZlcnNpdGUgY2F0aG9saXF1ZSBkZSBMb3V2YWluIChVQ0wpLCBCZWxnaXVtCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQorICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX19QSV9ICisjZGVmaW5lIF9fUElfSAorLyoqCitAZmlsZSBwaS5oCitAYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYSBwYWNrZXQgaXRlcmF0b3IgKFBJKQorCitUaGUgZnVuY3Rpb25zIGluIFBJLkMgaGF2ZSBmb3IgZ29hbCB0byByZWFsaXplIGEgcGFja2V0IGl0ZXJhdG9yIHRoYXQgcGVybWl0cyB0byBnZXQgdGhlIG5leHQKK3BhY2tldCBmb2xsb3dpbmcgdGhlIHByb2dyZXNzaW9uIG9yZGVyIGFuZCBjaGFuZ2Ugb2YgaXQuIFRoZSBmdW5jdGlvbnMgaW4gUEkuQyBhcmUgdXNlZAorYnkgc29tZSBmdW5jdGlvbiBpbiBUMi5DLgorKi8KKworLyoqIEBkZWZncm91cCBQSSBQSSAtIEltcGxlbWVudGF0aW9uIG9mIGEgcGFja2V0IGl0ZXJhdG9yICovCisvKkB7Ki8KKworLyoqCitGSVhNRSBET0MKKyovCit0eXBlZGVmIHN0cnVjdCBvcGpfcGlfcmVzb2x1dGlvbiB7CisgIE9QSl9VSU5UMzIgcGR4LCBwZHk7CisgIE9QSl9VSU5UMzIgcHcsIHBoOworfSBvcGpfcGlfcmVzb2x1dGlvbl90OworCisvKioKK0ZJWE1FIERPQworKi8KK3R5cGVkZWYgc3RydWN0IG9wal9waV9jb21wIHsKKyAgT1BKX1VJTlQzMiBkeCwgZHk7CisgIC8qKiBudW1iZXIgb2YgcmVzb2x1dGlvbiBsZXZlbHMgKi8KKyAgT1BKX1VJTlQzMiBudW1yZXNvbHV0aW9uczsKKyAgb3BqX3BpX3Jlc29sdXRpb25fdCAqcmVzb2x1dGlvbnM7Cit9IG9wal9waV9jb21wX3Q7CisKKy8qKgorUGFja2V0IGl0ZXJhdG9yCisqLwordHlwZWRlZiBzdHJ1Y3Qgb3BqX3BpX2l0ZXJhdG9yIHsKKyAgLyoqIEVuYWJsaW5nIFRpbGUgcGFydCBnZW5lcmF0aW9uKi8KKyAgT1BKX0JZVEUgdHBfb247CisgIC8qKiBwcmVjaXNlIGlmIHRoZSBwYWNrZXQgaGFzIGJlZW4gYWxyZWFkeSB1c2VkICh1c2VmdWwgZm9yIHByb2dyZXNzaW9uIG9yZGVyIGNoYW5nZSkgKi8KKyAgT1BKX0lOVDE2ICppbmNsdWRlOworICAvKiogbGF5ZXIgc3RlcCB1c2VkIHRvIGxvY2FsaXplIHRoZSBwYWNrZXQgaW4gdGhlIGluY2x1ZGUgdmVjdG9yICovCisgIE9QSl9VSU5UMzIgc3RlcF9sOworICAvKiogcmVzb2x1dGlvbiBzdGVwIHVzZWQgdG8gbG9jYWxpemUgdGhlIHBhY2tldCBpbiB0aGUgaW5jbHVkZSB2ZWN0b3IgKi8KKyAgT1BKX1VJTlQzMiBzdGVwX3I7CisgIC8qKiBjb21wb25lbnQgc3RlcCB1c2VkIHRvIGxvY2FsaXplIHRoZSBwYWNrZXQgaW4gdGhlIGluY2x1ZGUgdmVjdG9yICovCisgIE9QSl9VSU5UMzIgc3RlcF9jOworICAvKiogcHJlY2luY3Qgc3RlcCB1c2VkIHRvIGxvY2FsaXplIHRoZSBwYWNrZXQgaW4gdGhlIGluY2x1ZGUgdmVjdG9yICovCisgIE9QSl9VSU5UMzIgc3RlcF9wOworICAvKiogY29tcG9uZW50IHRoYXQgaWRlbnRpZnkgdGhlIHBhY2tldCAqLworICBPUEpfVUlOVDMyIGNvbXBubzsKKyAgLyoqIHJlc29sdXRpb24gdGhhdCBpZGVudGlmeSB0aGUgcGFja2V0ICovCisgIE9QSl9VSU5UMzIgcmVzbm87CisgIC8qKiBwcmVjaW5jdCB0aGF0IGlkZW50aWZ5IHRoZSBwYWNrZXQgKi8KKyAgT1BKX1VJTlQzMiBwcmVjbm87CisgIC8qKiBsYXllciB0aGF0IGlkZW50aWZ5IHRoZSBwYWNrZXQgKi8KKyAgT1BKX1VJTlQzMiBsYXlubzsKKyAgLyoqIDAgaWYgdGhlIGZpcnN0IHBhY2tldCAqLworICBPUEpfQk9PTCBmaXJzdDsKKyAgLyoqIHByb2dyZXNzaW9uIG9yZGVyIGNoYW5nZSBpbmZvcm1hdGlvbiAqLworICBvcGpfcG9jX3QgcG9jOworICAvKiogbnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gdGhlIGltYWdlICovCisgIE9QSl9VSU5UMzIgbnVtY29tcHM7CisgIC8qKiBDb21wb25lbnRzKi8KKyAgb3BqX3BpX2NvbXBfdCAqY29tcHM7CisgIC8qKiBGSVhNRSBET0MqLworICBPUEpfSU5UMzIgdHgwLCB0eTAsIHR4MSwgdHkxOworICAvKiogRklYTUUgRE9DKi8KKyAgT1BKX0lOVDMyIHgsIHk7CisgIC8qKiBGSVhNRSBET0MqLworICBPUEpfVUlOVDMyIGR4LCBkeTsKK30gb3BqX3BpX2l0ZXJhdG9yX3Q7CisKKy8qKiBAbmFtZSBFeHBvcnRlZCBmdW5jdGlvbnMgKi8KKy8qQHsqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogQ3JlYXRlcyBhIHBhY2tldCBpdGVyYXRvciBmb3IgZW5jb2RpbmcuCisgKgorICogQHBhcmFtCWltYWdlCQl0aGUgaW1hZ2UgYmVpbmcgZW5jb2RlZC4KKyAqIEBwYXJhbQljcAkJdGhlIGNvZGluZyBwYXJhbWV0ZXJzLgorICogQHBhcmFtCXRpbGVubwlpbmRleCBvZiB0aGUgdGlsZSBiZWluZyBlbmNvZGVkLgorICogQHBhcmFtCXQyX21vZGUJdGhlIHR5cGUgb2YgcGFzcyBmb3IgZ2VuZXJhdGluZyB0aGUgcGFja2V0IGl0ZXJhdG9yCisgKgorICogQHJldHVybglhIGxpc3Qgb2YgcGFja2V0IGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdCBwYWNrZXQgb2YgdGhlIHRpbGUgKG5vdCB0cnVlKS4KKyovCitvcGpfcGlfaXRlcmF0b3JfdCAqb3BqX3BpX2luaXRpYWxpc2VfZW5jb2RlKGNvbnN0IG9wal9pbWFnZV90ICppbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NwX3QgKmNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHRpbGVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSjJLX1QyX01PREUgdDJfbW9kZSk7CisKKy8qKgorICogVXBkYXRlcyB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycyBvZiB0aGUgY29kZWMuCisgKgorICogQHBhcmFtCXBfaW1hZ2UJCXRoZSBpbWFnZSBiZWluZyBlbmNvZGVkLgorICogQHBhcmFtCXBfY3AJCXRoZSBjb2RpbmcgcGFyYW1ldGVycy4KKyAqIEBwYXJhbQlwX3RpbGVfbm8JaW5kZXggb2YgdGhlIHRpbGUgYmVpbmcgZW5jb2RlZC4KKyovCit2b2lkIG9wal9waV91cGRhdGVfZW5jb2RpbmdfcGFyYW1ldGVycygJY29uc3Qgb3BqX2ltYWdlX3QgKnBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NwX3QgKnBfY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8gKTsKKworLyoqCitNb2RpZnkgdGhlIHBhY2tldCBpdGVyYXRvciBmb3IgZW5hYmxpbmcgdGlsZSBwYXJ0IGdlbmVyYXRpb24KK0BwYXJhbSBwaSBIYW5kbGUgdG8gdGhlIHBhY2tldCBpdGVyYXRvciBnZW5lcmF0ZWQgaW4gcGlfaW5pdGlhbGlzZV9lbmNvZGUKK0BwYXJhbSBjcCBDb2RpbmcgcGFyYW1ldGVycworQHBhcmFtIHRpbGVubyBOdW1iZXIgdGhhdCBpZGVudGlmaWVzIHRoZSB0aWxlIGZvciB3aGljaCB0byBsaXN0IHRoZSBwYWNrZXRzCitAcGFyYW0gcGlubyAgIEZJWE1FIERPQworQHBhcmFtIHRwbnVtIFRpbGUgcGFydCBudW1iZXIgb2YgdGhlIGN1cnJlbnQgdGlsZQorQHBhcmFtIHRwcG9zIFRoZSBwb3NpdGlvbiBvZiB0aGUgdGlsZSBwYXJ0IGZsYWcgaW4gdGhlIHByb2dyZXNzaW9uIG9yZGVyCitAcGFyYW0gdDJfbW9kZSBGSVhNRSBET0MKKyovCit2b2lkIG9wal9waV9jcmVhdGVfZW5jb2RlKCAgb3BqX3BpX2l0ZXJhdG9yX3QgKnBpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY3BfdCAqY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0aWxlbm8sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcGlubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHRwbnVtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgdHBwb3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEoyS19UMl9NT0RFIHQyX21vZGUpOworCisvKioKK0NyZWF0ZSBhIHBhY2tldCBpdGVyYXRvciBmb3IgRGVjb2RlcgorQHBhcmFtIGltYWdlIFJhdyBpbWFnZSBmb3Igd2hpY2ggdGhlIHBhY2tldHMgd2lsbCBiZSBsaXN0ZWQKK0BwYXJhbSBjcCBDb2RpbmcgcGFyYW1ldGVycworQHBhcmFtIHRpbGVubyBOdW1iZXIgdGhhdCBpZGVudGlmaWVzIHRoZSB0aWxlIGZvciB3aGljaCB0byBsaXN0IHRoZSBwYWNrZXRzCitAcmV0dXJuIFJldHVybnMgYSBwYWNrZXQgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0IHBhY2tldCBvZiB0aGUgdGlsZQorQHNlZSBvcGpfcGlfZGVzdHJveQorKi8KK29wal9waV9pdGVyYXRvcl90ICpvcGpfcGlfY3JlYXRlX2RlY29kZShvcGpfaW1hZ2VfdCAqIGltYWdlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY3BfdCAqIGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdGlsZW5vKTsKKy8qKgorICogRGVzdHJveXMgYSBwYWNrZXQgaXRlcmF0b3IgYXJyYXkuCisgKgorICogQHBhcmFtCXBfcGkJCQl0aGUgcGFja2V0IGl0ZXJhdG9yIGFycmF5IHRvIGRlc3Ryb3kuCisgKiBAcGFyYW0JcF9uYl9lbGVtZW50cwl0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheS4KKyAqLwordm9pZCBvcGpfcGlfZGVzdHJveShvcGpfcGlfaXRlcmF0b3JfdCAqcF9waSwKKyAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX25iX2VsZW1lbnRzKTsKKworLyoqCitNb2RpZnkgdGhlIHBhY2tldCBpdGVyYXRvciB0byBwb2ludCB0byB0aGUgbmV4dCBwYWNrZXQKK0BwYXJhbSBwaSBQYWNrZXQgaXRlcmF0b3IgdG8gbW9kaWZ5CitAcmV0dXJuIFJldHVybnMgZmFsc2UgaWYgcGkgcG9pbnRlZCB0byB0aGUgbGFzdCBwYWNrZXQgb3IgZWxzZSByZXR1cm5zIHRydWUKKyovCitPUEpfQk9PTCBvcGpfcGlfbmV4dChvcGpfcGlfaXRlcmF0b3JfdCAqIHBpKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKkB9Ki8KKworLypAfSovCisKKyNlbmRpZiAvKiBfX1BJX0ggKi8KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9yYXcuYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvcmF3LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvZnhfbGlib3BlbmpwZWcvbGlib3BlbmpwZWcyMC9yYXcuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9yYXcuYwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL3Jhdy5oIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9yYXcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL3Jhdy5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3Jhdy5oCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3QxLmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3QxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA4Y2U3OAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdDEuYwpAQCAtMCwwICsxLDE3NjQgQEAKKy8qCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKKyAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKKyAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKKyAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgVW5pdmVyc2l0ZSBjYXRob2xpcXVlIGRlIExvdXZhaW4gKFVDTCksIEJlbGdpdW0KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBQcm9mZXNzb3IgQmVub2l0IE1hY3EKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzLCBEYXZpZCBKYW5zc2VucworICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIFlhbm5pY2sgVmVyc2NodWVyZW4KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eCAKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE0LCBBbnRvbmluIERlc2NhbXBlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KKyAqIENvcHlyaWdodCAoYykgMjAwNywgQ2FsbHVtIExlcndpY2sgPHNlZ0BoYXh4ZWQuY29tPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAib3BqX2luY2x1ZGVzLmgiCisjaW5jbHVkZSAidDFfbHV0cy5oIgorCisvKiogQGRlZmdyb3VwIFQxIFQxIC0gSW1wbGVtZW50YXRpb24gb2YgdGhlIHRpZXItMSBjb2RpbmcgKi8KKy8qQHsqLworCisvKiogQG5hbWUgTG9jYWwgc3RhdGljIGZ1bmN0aW9ucyAqLworLypAeyovCisKK3N0YXRpYyBJTkxJTkUgT1BKX0JZVEUgb3BqX3QxX2dldGN0eG5vX3pjKE9QSl9VSU5UMzIgZiwgT1BKX1VJTlQzMiBvcmllbnQpOworc3RhdGljIE9QSl9CWVRFIG9wal90MV9nZXRjdHhub19zYyhPUEpfVUlOVDMyIGYpOworc3RhdGljIElOTElORSBPUEpfVUlOVDMyIG9wal90MV9nZXRjdHhub19tYWcoT1BKX1VJTlQzMiBmKTsKK3N0YXRpYyBPUEpfQllURSBvcGpfdDFfZ2V0c3BiKE9QSl9VSU5UMzIgZik7CitzdGF0aWMgT1BKX0lOVDE2IG9wal90MV9nZXRubXNlZGVjX3NpZyhPUEpfVUlOVDMyIHgsIE9QSl9VSU5UMzIgYml0cG9zKTsKK3N0YXRpYyBPUEpfSU5UMTYgb3BqX3QxX2dldG5tc2VkZWNfcmVmKE9QSl9VSU5UMzIgeCwgT1BKX1VJTlQzMiBiaXRwb3MpOworc3RhdGljIHZvaWQgb3BqX3QxX3VwZGF0ZWZsYWdzKG9wal9mbGFnX3QgKmZsYWdzcCwgT1BKX1VJTlQzMiBzLCBPUEpfVUlOVDMyIHN0cmlkZSk7CisvKioKK0VuY29kZSBzaWduaWZpY2FudCBwYXNzCisqLworc3RhdGljIHZvaWQgb3BqX3QxX2VuY19zaWdwYXNzX3N0ZXAob3BqX3QxX3QgKnQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICpkYXRhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgb3JpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIGJwbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICpubXNlZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdnNjKTsKKworLyoqCitEZWNvZGUgc2lnbmlmaWNhbnQgcGFzcworKi8KKyNpZiAwCitzdGF0aWMgdm9pZCBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcChvcGpfdDFfdCAqdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZmxhZ190ICpmbGFnc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKmRhdGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBvcmllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgb25lcGx1c2hhbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB2c2MpOworI2VuZGlmCisKK3N0YXRpYyBJTkxJTkUgdm9pZCBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcF9yYXcoCisgICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAorICAgICAgICAgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKKyAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKmRhdGFwLAorICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvcmllbnQsCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIG9uZXBsdXNoYWxmLAorICAgICAgICAgICAgICAgIE9QSl9JTlQzMiB2c2MpOworc3RhdGljIElOTElORSB2b2lkIG9wal90MV9kZWNfc2lncGFzc19zdGVwX21xYygKKyAgICAgICAgICAgICAgICBvcGpfdDFfdCAqdDEsCisgICAgICAgICAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3NwLAorICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YXAsCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIG9yaWVudCwKKyAgICAgICAgICAgICAgICBPUEpfSU5UMzIgb25lcGx1c2hhbGYpOworc3RhdGljIElOTElORSB2b2lkIG9wal90MV9kZWNfc2lncGFzc19zdGVwX21xY192c2MoCisgICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAorICAgICAgICAgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKKyAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKmRhdGFwLAorICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvcmllbnQsCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIG9uZXBsdXNoYWxmLAorICAgICAgICAgICAgICAgIE9QSl9JTlQzMiB2c2MpOworCisKKy8qKgorRW5jb2RlIHNpZ25pZmljYW50IHBhc3MKKyovCitzdGF0aWMgdm9pZCBvcGpfdDFfZW5jX3NpZ3Bhc3MoIG9wal90MV90ICp0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIGJwbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgb3JpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKm5tc2VkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgY2Jsa3N0eSk7CisKKy8qKgorRGVjb2RlIHNpZ25pZmljYW50IHBhc3MKKyovCitzdGF0aWMgdm9pZCBvcGpfdDFfZGVjX3NpZ3Bhc3NfcmF3KAorICAgICAgICAgICAgICAgIG9wal90MV90ICp0MSwKKyAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYnBubywKKyAgICAgICAgICAgICAgICBPUEpfSU5UMzIgb3JpZW50LAorICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBjYmxrc3R5KTsKK3N0YXRpYyB2b2lkIG9wal90MV9kZWNfc2lncGFzc19tcWMoCisgICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAorICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBicG5vLAorICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvcmllbnQpOworc3RhdGljIHZvaWQgb3BqX3QxX2RlY19zaWdwYXNzX21xY192c2MoCisgICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAorICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBicG5vLAorICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvcmllbnQpOworCisKKworLyoqCitFbmNvZGUgcmVmaW5lbWVudCBwYXNzCisqLworc3RhdGljIHZvaWQgb3BqX3QxX2VuY19yZWZwYXNzX3N0ZXAob3BqX3QxX3QgKnQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICpkYXRhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBicG5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIG9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqbm1zZWRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHZzYyk7CisKKworLyoqCitFbmNvZGUgcmVmaW5lbWVudCBwYXNzCisqLworc3RhdGljIHZvaWQgb3BqX3QxX2VuY19yZWZwYXNzKCBvcGpfdDFfdCAqdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBicG5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKm5tc2VkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgY2Jsa3N0eSk7CisKKy8qKgorRGVjb2RlIHJlZmluZW1lbnQgcGFzcworKi8KK3N0YXRpYyB2b2lkIG9wal90MV9kZWNfcmVmcGFzc19yYXcoCisgICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAorICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBicG5vLAorICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBjYmxrc3R5KTsKK3N0YXRpYyB2b2lkIG9wal90MV9kZWNfcmVmcGFzc19tcWMoCisgICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAorICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBicG5vKTsKK3N0YXRpYyB2b2lkIG9wal90MV9kZWNfcmVmcGFzc19tcWNfdnNjKAorICAgICAgICAgICAgICAgIG9wal90MV90ICp0MSwKKyAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYnBubyk7CisKKworLyoqCitEZWNvZGUgcmVmaW5lbWVudCBwYXNzCisqLworI2lmIDAKK3N0YXRpYyB2b2lkIG9wal90MV9kZWNfcmVmcGFzc19zdGVwKG9wal90MV90ICp0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcG9zaGFsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBuZWdoYWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdnNjKTsKKyNlbmRpZgorCitzdGF0aWMgSU5MSU5FIHZvaWQgIG9wal90MV9kZWNfcmVmcGFzc19zdGVwX3JhdygKKyAgICAgICAgICAgICAgICBvcGpfdDFfdCAqdDEsCisgICAgICAgICAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3NwLAorICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YXAsCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBvc2hhbGYsCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIG5lZ2hhbGYsCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHZzYyk7CitzdGF0aWMgSU5MSU5FIHZvaWQgb3BqX3QxX2RlY19yZWZwYXNzX3N0ZXBfbXFjKAorICAgICAgICAgICAgICAgIG9wal90MV90ICp0MSwKKyAgICAgICAgICAgICAgICBvcGpfZmxhZ190ICpmbGFnc3AsCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyICpkYXRhcCwKKyAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcG9zaGFsZiwKKyAgICAgICAgICAgICAgICBPUEpfSU5UMzIgbmVnaGFsZik7CitzdGF0aWMgSU5MSU5FIHZvaWQgb3BqX3QxX2RlY19yZWZwYXNzX3N0ZXBfbXFjX3ZzYygKKyAgICAgICAgICAgICAgICBvcGpfdDFfdCAqdDEsCisgICAgICAgICAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3NwLAorICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YXAsCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBvc2hhbGYsCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIG5lZ2hhbGYsCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHZzYyk7CisKKworCisvKioKK0VuY29kZSBjbGVhbi11cCBwYXNzCisqLworc3RhdGljIHZvaWQgb3BqX3QxX2VuY19jbG5wYXNzX3N0ZXAoCisJCW9wal90MV90ICp0MSwKKwkJb3BqX2ZsYWdfdCAqZmxhZ3NwLAorCQlPUEpfSU5UMzIgKmRhdGFwLAorCQlPUEpfVUlOVDMyIG9yaWVudCwKKwkJT1BKX0lOVDMyIGJwbm8sCisJCU9QSl9JTlQzMiBvbmUsCisJCU9QSl9JTlQzMiAqbm1zZWRlYywKKwkJT1BKX1VJTlQzMiBwYXJ0aWFsLAorCQlPUEpfVUlOVDMyIHZzYyk7CisvKioKK0RlY29kZSBjbGVhbi11cCBwYXNzCisqLworc3RhdGljIHZvaWQgb3BqX3QxX2RlY19jbG5wYXNzX3N0ZXBfcGFydGlhbCgKKwkJb3BqX3QxX3QgKnQxLAorCQlvcGpfZmxhZ190ICpmbGFnc3AsCisJCU9QSl9JTlQzMiAqZGF0YXAsCisJCU9QSl9JTlQzMiBvcmllbnQsCisJCU9QSl9JTlQzMiBvbmVwbHVzaGFsZik7CitzdGF0aWMgdm9pZCBvcGpfdDFfZGVjX2NsbnBhc3Nfc3RlcCgKKwkJb3BqX3QxX3QgKnQxLAorCQlvcGpfZmxhZ190ICpmbGFnc3AsCisJCU9QSl9JTlQzMiAqZGF0YXAsCisJCU9QSl9JTlQzMiBvcmllbnQsCisJCU9QSl9JTlQzMiBvbmVwbHVzaGFsZik7CitzdGF0aWMgdm9pZCBvcGpfdDFfZGVjX2NsbnBhc3Nfc3RlcF92c2MoCisJCW9wal90MV90ICp0MSwKKwkJb3BqX2ZsYWdfdCAqZmxhZ3NwLAorCQlPUEpfSU5UMzIgKmRhdGFwLAorCQlPUEpfSU5UMzIgb3JpZW50LAorCQlPUEpfSU5UMzIgb25lcGx1c2hhbGYsCisJCU9QSl9JTlQzMiBwYXJ0aWFsLAorCQlPUEpfSU5UMzIgdnNjKTsKKy8qKgorRW5jb2RlIGNsZWFuLXVwIHBhc3MKKyovCitzdGF0aWMgdm9pZCBvcGpfdDFfZW5jX2NsbnBhc3MoCisJCW9wal90MV90ICp0MSwKKwkJT1BKX0lOVDMyIGJwbm8sCisJCU9QSl9VSU5UMzIgb3JpZW50LAorCQlPUEpfSU5UMzIgKm5tc2VkZWMsCisJCU9QSl9VSU5UMzIgY2Jsa3N0eSk7CisvKioKK0RlY29kZSBjbGVhbi11cCBwYXNzCisqLworc3RhdGljIHZvaWQgb3BqX3QxX2RlY19jbG5wYXNzKAorCQlvcGpfdDFfdCAqdDEsCisJCU9QSl9JTlQzMiBicG5vLAorCQlPUEpfSU5UMzIgb3JpZW50LAorCQlPUEpfSU5UMzIgY2Jsa3N0eSk7CisKK3N0YXRpYyBPUEpfRkxPQVQ2NCBvcGpfdDFfZ2V0d21zZWRlYygKKwkJT1BKX0lOVDMyIG5tc2VkZWMsCisJCU9QSl9VSU5UMzIgY29tcG5vLAorCQlPUEpfVUlOVDMyIGxldmVsLAorCQlPUEpfVUlOVDMyIG9yaWVudCwKKwkJT1BKX0lOVDMyIGJwbm8sCisJCU9QSl9VSU5UMzIgcW1mYmlkLAorCQlPUEpfRkxPQVQ2NCBzdGVwc2l6ZSwKKwkJT1BKX1VJTlQzMiBudW1jb21wcywKKwkJY29uc3QgT1BKX0ZMT0FUNjQgKiBtY3Rfbm9ybXMsCisJCU9QSl9VSU5UMzIgbWN0X251bWNvbXBzKTsKKworc3RhdGljIHZvaWQgb3BqX3QxX2VuY29kZV9jYmxrKCBvcGpfdDFfdCAqdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfY2Jsa19lbmNfdCogY2JsaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBvcmllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgY29tcG5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHFtZmJpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUNjQgc3RlcHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgY2Jsa3N0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBudW1jb21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlX3QgKiB0aWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUEpfRkxPQVQ2NCAqIG1jdF9ub3JtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBtY3RfbnVtY29tcHMpOworCisvKioKK0RlY29kZSAxIGNvZGUtYmxvY2sKK0BwYXJhbSB0MSBUMSBoYW5kbGUKK0BwYXJhbSBjYmxrIENvZGUtYmxvY2sgY29kaW5nIHBhcmFtZXRlcnMKK0BwYXJhbSBvcmllbnQKK0BwYXJhbSByb2lzaGlmdCBSZWdpb24gb2YgaW50ZXJlc3Qgc2hpZnRpbmcgdmFsdWUKK0BwYXJhbSBjYmxrc3R5IENvZGUtYmxvY2sgc3R5bGUKKyovCitzdGF0aWMgT1BKX0JPT0wgb3BqX3QxX2RlY29kZV9jYmxrKCBvcGpfdDFfdCAqdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX2NibGtfZGVjX3QqIGNibGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG9yaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcm9pc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNibGtzdHkpOworCitzdGF0aWMgT1BKX0JPT0wgb3BqX3QxX2FsbG9jYXRlX2J1ZmZlcnMoICAgb3BqX3QxX3QgKnQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBoKTsKKworLypAfSovCisKKy8qQH0qLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgT1BKX0JZVEUgb3BqX3QxX2dldGN0eG5vX3pjKE9QSl9VSU5UMzIgZiwgT1BKX1VJTlQzMiBvcmllbnQpIHsKKwlyZXR1cm4gbHV0X2N0eG5vX3pjWyhvcmllbnQgPDwgOCkgfCAoZiAmIFQxX1NJR19PVEgpXTsKK30KKworc3RhdGljIE9QSl9CWVRFIG9wal90MV9nZXRjdHhub19zYyhPUEpfVUlOVDMyIGYpIHsKKwlyZXR1cm4gbHV0X2N0eG5vX3NjWyhmICYgKFQxX1NJR19QUklNIHwgVDFfU0dOKSkgPj4gNF07Cit9CisKK3N0YXRpYyBPUEpfVUlOVDMyIG9wal90MV9nZXRjdHhub19tYWcoT1BKX1VJTlQzMiBmKSB7CisJT1BKX1VJTlQzMiB0bXAxID0gKGYgJiBUMV9TSUdfT1RIKSA/IFQxX0NUWE5PX01BRyArIDEgOiBUMV9DVFhOT19NQUc7CisJT1BKX1VJTlQzMiB0bXAyID0gKGYgJiBUMV9SRUZJTkUpID8gVDFfQ1RYTk9fTUFHICsgMiA6IHRtcDE7CisJcmV0dXJuICh0bXAyKTsKK30KKworc3RhdGljIE9QSl9CWVRFIG9wal90MV9nZXRzcGIoT1BKX1VJTlQzMiBmKSB7CisJcmV0dXJuIGx1dF9zcGJbKGYgJiAoVDFfU0lHX1BSSU0gfCBUMV9TR04pKSA+PiA0XTsKK30KKworc3RhdGljIE9QSl9JTlQxNiBvcGpfdDFfZ2V0bm1zZWRlY19zaWcoT1BKX1VJTlQzMiB4LCBPUEpfVUlOVDMyIGJpdHBvcykgeworCWlmIChiaXRwb3MgPiAwKSB7CisJCXJldHVybiBsdXRfbm1zZWRlY19zaWdbKHggPj4gKGJpdHBvcykpICYgKCgxIDw8IFQxX05NU0VERUNfQklUUykgLSAxKV07CisJfQorCQorCXJldHVybiBsdXRfbm1zZWRlY19zaWcwW3ggJiAoKDEgPDwgVDFfTk1TRURFQ19CSVRTKSAtIDEpXTsKK30KKworc3RhdGljIE9QSl9JTlQxNiBvcGpfdDFfZ2V0bm1zZWRlY19yZWYoT1BKX1VJTlQzMiB4LCBPUEpfVUlOVDMyIGJpdHBvcykgeworCWlmIChiaXRwb3MgPiAwKSB7CisJCXJldHVybiBsdXRfbm1zZWRlY19yZWZbKHggPj4gKGJpdHBvcykpICYgKCgxIDw8IFQxX05NU0VERUNfQklUUykgLSAxKV07CisJfQorCisgICAgcmV0dXJuIGx1dF9ubXNlZGVjX3JlZjBbeCAmICgoMSA8PCBUMV9OTVNFREVDX0JJVFMpIC0gMSldOworfQorCitzdGF0aWMgdm9pZCBvcGpfdDFfdXBkYXRlZmxhZ3Mob3BqX2ZsYWdfdCAqZmxhZ3NwLCBPUEpfVUlOVDMyIHMsIE9QSl9VSU5UMzIgc3RyaWRlKSB7CisJb3BqX2ZsYWdfdCAqbnAgPSBmbGFnc3AgLSBzdHJpZGU7CisJb3BqX2ZsYWdfdCAqc3AgPSBmbGFnc3AgKyBzdHJpZGU7CisKKwlzdGF0aWMgY29uc3Qgb3BqX2ZsYWdfdCBtb2RbXSA9IHsKKwkJVDFfU0lHX1MsIFQxX1NJR19TfFQxX1NHTl9TLAorCQlUMV9TSUdfRSwgVDFfU0lHX0V8VDFfU0dOX0UsCisJCVQxX1NJR19XLCBUMV9TSUdfV3xUMV9TR05fVywKKwkJVDFfU0lHX04sIFQxX1NJR19OfFQxX1NHTl9OCisJfTsKKworCW5wWy0xXSB8PSBUMV9TSUdfU0U7CisJbnBbMF0gIHw9IG1vZFtzXTsKKwlucFsxXSAgfD0gVDFfU0lHX1NXOworCisJZmxhZ3NwWy0xXSB8PSBtb2RbcysyXTsKKwlmbGFnc3BbMF0gIHw9IFQxX1NJRzsKKwlmbGFnc3BbMV0gIHw9IG1vZFtzKzRdOworCisJc3BbLTFdIHw9IFQxX1NJR19ORTsKKwlzcFswXSAgfD0gbW9kW3MrNl07CisJc3BbMV0gIHw9IFQxX1NJR19OVzsKK30KKworc3RhdGljIHZvaWQgb3BqX3QxX2VuY19zaWdwYXNzX3N0ZXAoICAgb3BqX3QxX3QgKnQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZmxhZ190ICpmbGFnc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgb3JpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYnBubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIG9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICpubXNlZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHZzYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisJT1BKX0lOVDMyIHY7CisgICAgT1BKX1VJTlQzMiBmbGFnOworCQorCW9wal9tcWNfdCAqbXFjID0gdDEtPm1xYzsJLyogTVFDIGNvbXBvbmVudCAqLworCQorCWZsYWcgPSB2c2MgPyAoT1BKX1VJTlQzMikoKCpmbGFnc3ApICYgKH4oVDFfU0lHX1MgfCBUMV9TSUdfU0UgfCBUMV9TSUdfU1cgfCBUMV9TR05fUykpKSA6IChPUEpfVUlOVDMyKSgqZmxhZ3NwKTsKKwlpZiAoKGZsYWcgJiBUMV9TSUdfT1RIKSAmJiAhKGZsYWcgJiAoVDFfU0lHIHwgVDFfVklTSVQpKSkgeworCQl2ID0gb3BqX2ludF9hYnMoKmRhdGFwKSAmIG9uZSA/IDEgOiAwOworCQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIG9wal90MV9nZXRjdHhub196YyhmbGFnLCBvcmllbnQpKTsJLyogRVNTQUkgKi8KKwkJaWYgKHR5cGUgPT0gVDFfVFlQRV9SQVcpIHsJLyogQllQQVNTL0xBWlkgTU9ERSAqLworCQkJb3BqX21xY19ieXBhc3NfZW5jKG1xYywgKE9QSl9VSU5UMzIpdik7CisJCX0gZWxzZSB7CisJCQlvcGpfbXFjX2VuY29kZShtcWMsIChPUEpfVUlOVDMyKXYpOworCQl9CisJCWlmICh2KSB7CisJCQl2ID0gKmRhdGFwIDwgMCA/IDEgOiAwOworCQkJKm5tc2VkZWMgKz0Jb3BqX3QxX2dldG5tc2VkZWNfc2lnKChPUEpfVUlOVDMyKW9wal9pbnRfYWJzKCpkYXRhcCksIChPUEpfVUlOVDMyKShicG5vKSk7CisJCQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIG9wal90MV9nZXRjdHhub19zYyhmbGFnKSk7CS8qIEVTU0FJICovCisJCQlpZiAodHlwZSA9PSBUMV9UWVBFX1JBVykgewkvKiBCWVBBU1MvTEFaWSBNT0RFICovCisJCQkJb3BqX21xY19ieXBhc3NfZW5jKG1xYywgKE9QSl9VSU5UMzIpdik7CisJCQl9IGVsc2UgeworCQkJCW9wal9tcWNfZW5jb2RlKG1xYywgKE9QSl9VSU5UMzIpKHYgXiBvcGpfdDFfZ2V0c3BiKChPUEpfVUlOVDMyKWZsYWcpKSk7CisJCQl9CisJCQlvcGpfdDFfdXBkYXRlZmxhZ3MoZmxhZ3NwLCAoT1BKX1VJTlQzMil2LCB0MS0+ZmxhZ3Nfc3RyaWRlKTsKKwkJfQorCQkqZmxhZ3NwIHw9IFQxX1ZJU0lUOworCX0KK30KKworCitzdGF0aWMgSU5MSU5FIHZvaWQgb3BqX3QxX2RlY19zaWdwYXNzX3N0ZXBfcmF3KAorICAgICAgICAgICAgICAgIG9wal90MV90ICp0MSwKKyAgICAgICAgICAgICAgICBvcGpfZmxhZ190ICpmbGFnc3AsCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyICpkYXRhcCwKKyAgICAgICAgICAgICAgICBPUEpfSU5UMzIgb3JpZW50LAorICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvbmVwbHVzaGFsZiwKKyAgICAgICAgICAgICAgICBPUEpfSU5UMzIgdnNjKQoreworICAgICAgICBPUEpfSU5UMzIgdiwgZmxhZzsKKyAgICAgICAgb3BqX3Jhd190ICpyYXcgPSB0MS0+cmF3OyAgICAgICAvKiBSQVcgY29tcG9uZW50ICovCisgICAgICAgIE9QSl9BUkdfTk9UX1VTRUQob3JpZW50KTsKKyAgICAgICAKKyAgICAgICAgZmxhZyA9IHZzYyA/ICgoKmZsYWdzcCkgJiAofihUMV9TSUdfUyB8IFQxX1NJR19TRSB8IFQxX1NJR19TVyB8IFQxX1NHTl9TKSkpIDogKCpmbGFnc3ApOworICAgICAgICBpZiAoKGZsYWcgJiBUMV9TSUdfT1RIKSAmJiAhKGZsYWcgJiAoVDFfU0lHIHwgVDFfVklTSVQpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wal9yYXdfZGVjb2RlKHJhdykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IChPUEpfSU5UMzIpb3BqX3Jhd19kZWNvZGUocmF3KTsgICAgLyogRVNTQUkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFwID0gdiA/IC1vbmVwbHVzaGFsZiA6IG9uZXBsdXNoYWxmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfdXBkYXRlZmxhZ3MoZmxhZ3NwLCAoT1BKX1VJTlQzMil2LCB0MS0+ZmxhZ3Nfc3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqZmxhZ3NwIHw9IFQxX1ZJU0lUOworICAgICAgICB9Cit9ICAgICAgCisKK3N0YXRpYyBJTkxJTkUgdm9pZCBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcF9tcWMoCisgICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAorICAgICAgICAgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKKyAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKmRhdGFwLAorICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvcmllbnQsCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIG9uZXBsdXNoYWxmKQoreworICAgICAgICBPUEpfSU5UMzIgdiwgZmxhZzsKKyAgICAgICAKKyAgICAgICAgb3BqX21xY190ICptcWMgPSB0MS0+bXFjOyAgICAgICAvKiBNUUMgY29tcG9uZW50ICovCisgICAgICAgCisgICAgICAgIGZsYWcgPSAqZmxhZ3NwOworICAgICAgICBpZiAoKGZsYWcgJiBUMV9TSUdfT1RIKSAmJiAhKGZsYWcgJiAoVDFfU0lHIHwgVDFfVklTSVQpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX21xY19zZXRjdXJjdHgobXFjLCBvcGpfdDFfZ2V0Y3R4bm9femMoKE9QSl9VSU5UMzIpZmxhZywgKE9QSl9VSU5UMzIpb3JpZW50KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BqX21xY19kZWNvZGUobXFjKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfbXFjX3NldGN1cmN0eChtcWMsIG9wal90MV9nZXRjdHhub19zYygoT1BKX1VJTlQzMilmbGFnKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBvcGpfbXFjX2RlY29kZShtcWMpIF4gb3BqX3QxX2dldHNwYigoT1BKX1VJTlQzMilmbGFnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFwID0gdiA/IC1vbmVwbHVzaGFsZiA6IG9uZXBsdXNoYWxmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfdXBkYXRlZmxhZ3MoZmxhZ3NwLCAoT1BKX1VJTlQzMil2LCB0MS0+ZmxhZ3Nfc3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqZmxhZ3NwIHw9IFQxX1ZJU0lUOworICAgICAgICB9Cit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZTQyBhbmQgIEJZUEFTUyBieSBBbnRvbmluICovCisKK3N0YXRpYyBJTkxJTkUgdm9pZCBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcF9tcWNfdnNjKAorICAgICAgICAgICAgICAgIG9wal90MV90ICp0MSwKKyAgICAgICAgICAgICAgICBvcGpfZmxhZ190ICpmbGFnc3AsCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyICpkYXRhcCwKKyAgICAgICAgICAgICAgICBPUEpfSU5UMzIgb3JpZW50LAorICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvbmVwbHVzaGFsZiwKKyAgICAgICAgICAgICAgICBPUEpfSU5UMzIgdnNjKQoreworICAgICAgICBPUEpfSU5UMzIgdiwgZmxhZzsKKyAgICAgICAKKyAgICAgICAgb3BqX21xY190ICptcWMgPSB0MS0+bXFjOyAgICAgICAvKiBNUUMgY29tcG9uZW50ICovCisgICAgICAgCisgICAgICAgIGZsYWcgPSB2c2MgPyAoKCpmbGFnc3ApICYgKH4oVDFfU0lHX1MgfCBUMV9TSUdfU0UgfCBUMV9TSUdfU1cgfCBUMV9TR05fUykpKSA6ICgqZmxhZ3NwKTsKKyAgICAgICAgaWYgKChmbGFnICYgVDFfU0lHX09USCkgJiYgIShmbGFnICYgKFQxX1NJRyB8IFQxX1ZJU0lUKSkpIHsKKyAgICAgICAgICAgICAgICBvcGpfbXFjX3NldGN1cmN0eChtcWMsIG9wal90MV9nZXRjdHhub196YygoT1BKX1VJTlQzMilmbGFnLCAoT1BKX1VJTlQzMilvcmllbnQpKTsKKyAgICAgICAgICAgICAgICBpZiAob3BqX21xY19kZWNvZGUobXFjKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX21xY19zZXRjdXJjdHgobXFjLCBvcGpfdDFfZ2V0Y3R4bm9fc2MoKE9QSl9VSU5UMzIpZmxhZykpOworICAgICAgICAgICAgICAgICAgICAgICAgdiA9IG9wal9tcWNfZGVjb2RlKG1xYykgXiBvcGpfdDFfZ2V0c3BiKChPUEpfVUlOVDMyKWZsYWcpOworICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFwID0gdiA/IC1vbmVwbHVzaGFsZiA6IG9uZXBsdXNoYWxmOworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QxX3VwZGF0ZWZsYWdzKGZsYWdzcCwgKE9QSl9VSU5UMzIpdiwgdDEtPmZsYWdzX3N0cmlkZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpmbGFnc3AgfD0gVDFfVklTSVQ7CisgICAgICAgIH0KK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVlNDIGFuZCAgQllQQVNTIGJ5IEFudG9uaW4gKi8KKworCisKK3N0YXRpYyB2b2lkIG9wal90MV9lbmNfc2lncGFzcyhvcGpfdDFfdCAqdDEsCisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYnBubywKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgb3JpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICpubXNlZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgY2Jsa3N0eQorICAgICAgICAgICAgICAgICAgICAgICAgKQoreworCU9QSl9VSU5UMzIgaSwgaiwgaywgdnNjOyAKKyAgICBPUEpfSU5UMzIgb25lOworCisJKm5tc2VkZWMgPSAwOworCW9uZSA9IDEgPDwgKGJwbm8gKyBUMV9OTVNFREVDX0ZSQUNCSVRTKTsKKwlmb3IgKGsgPSAwOyBrIDwgdDEtPmg7IGsgKz0gNCkgeworCQlmb3IgKGkgPSAwOyBpIDwgdDEtPnc7ICsraSkgeworCQkJZm9yIChqID0gazsgaiA8IGsgKyA0ICYmIGogPCB0MS0+aDsgKytqKSB7CisJCQkJdnNjID0gKChjYmxrc3R5ICYgSjJLX0NDUF9DQkxLU1RZX1ZTQykgJiYgKGogPT0gayArIDMgfHwgaiA9PSB0MS0+aCAtIDEpKSA/IDEgOiAwOworCQkJCW9wal90MV9lbmNfc2lncGFzc19zdGVwKAorCQkJCQkJdDEsCisJCQkJCQkmdDEtPmZsYWdzWygoaisxKSAqIHQxLT5mbGFnc19zdHJpZGUpICsgaSArIDFdLAorCQkJCQkJJnQxLT5kYXRhWyhqICogdDEtPmRhdGFfc3RyaWRlKSArIGldLAorCQkJCQkJb3JpZW50LAorCQkJCQkJYnBubywKKwkJCQkJCW9uZSwKKwkJCQkJCW5tc2VkZWMsCisJCQkJCQl0eXBlLAorCQkJCQkJdnNjKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgb3BqX3QxX2RlY19zaWdwYXNzX3JhdygKKyAgICAgICAgICAgICAgICBvcGpfdDFfdCAqdDEsCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIGJwbm8sCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIG9yaWVudCwKKyAgICAgICAgICAgICAgICBPUEpfSU5UMzIgY2Jsa3N0eSkKK3sKKyAgICAgICAgT1BKX0lOVDMyIG9uZSwgaGFsZiwgb25lcGx1c2hhbGYsIHZzYzsKKyAgICAgICAgT1BKX1VJTlQzMiBpLCBqLCBrOyAKKyAgICAgICAgb25lID0gMSA8PCBicG5vOworICAgICAgICBoYWxmID0gb25lID4+IDE7CisgICAgICAgIG9uZXBsdXNoYWxmID0gb25lIHwgaGFsZjsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IHQxLT5oOyBrICs9IDQpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdDEtPnc7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gazsgaiA8IGsgKyA0ICYmIGogPCB0MS0+aDsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZzYyA9ICgoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9WU0MpICYmIChqID09IGsgKyAzIHx8IGogPT0gdDEtPmggLSAxKSkgPyAxIDogMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19zaWdwYXNzX3N0ZXBfcmF3KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdDEtPmZsYWdzWygoaisxKSAqIHQxLT5mbGFnc19zdHJpZGUpICsgaSArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnQxLT5kYXRhWyhqICogdDEtPncpICsgaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVwbHVzaGFsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZzYyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9Cit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZTQyBhbmQgIEJZUEFTUyBieSBBbnRvbmluICovCisKK3N0YXRpYyB2b2lkIG9wal90MV9kZWNfc2lncGFzc19tcWMoCisgICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAorICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBicG5vLAorICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvcmllbnQpCit7CisgICAgICAgIE9QSl9JTlQzMiBvbmUsIGhhbGYsIG9uZXBsdXNoYWxmOworICAgICAgICBPUEpfVUlOVDMyIGksIGosIGs7CisgICAgICAgIE9QSl9JTlQzMiAqZGF0YTEgPSB0MS0+ZGF0YTsKKyAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3MxID0gJnQxLT5mbGFnc1sxXTsKKyAgICAgICAgb25lID0gMSA8PCBicG5vOworICAgICAgICBoYWxmID0gb25lID4+IDE7CisgICAgICAgIG9uZXBsdXNoYWxmID0gb25lIHwgaGFsZjsKKyAgICAgICAgZm9yIChrID0gMDsgayA8ICh0MS0+aCAmIH4zdSk7IGsgKz0gNCkgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0MS0+dzsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKmRhdGEyID0gZGF0YTEgKyBpOworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3MyID0gZmxhZ3MxICsgaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzMiArPSB0MS0+ZmxhZ3Nfc3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19zaWdwYXNzX3N0ZXBfbXFjKHQxLCBmbGFnczIsIGRhdGEyLCBvcmllbnQsIG9uZXBsdXNoYWxmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEyICs9IHQxLT53OworICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MyICs9IHQxLT5mbGFnc19zdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcF9tcWModDEsIGZsYWdzMiwgZGF0YTIsIG9yaWVudCwgb25lcGx1c2hhbGYpOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTIgKz0gdDEtPnc7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczIgKz0gdDEtPmZsYWdzX3N0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal90MV9kZWNfc2lncGFzc19zdGVwX21xYyh0MSwgZmxhZ3MyLCBkYXRhMiwgb3JpZW50LCBvbmVwbHVzaGFsZik7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhMiArPSB0MS0+dzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzMiArPSB0MS0+ZmxhZ3Nfc3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19zaWdwYXNzX3N0ZXBfbXFjKHQxLCBmbGFnczIsIGRhdGEyLCBvcmllbnQsIG9uZXBsdXNoYWxmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEyICs9IHQxLT53OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkYXRhMSArPSB0MS0+dyA8PCAyOworICAgICAgICAgICAgICAgIGZsYWdzMSArPSB0MS0+ZmxhZ3Nfc3RyaWRlIDw8IDI7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHQxLT53OyArK2kpIHsKKyAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKmRhdGEyID0gZGF0YTEgKyBpOworICAgICAgICAgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzMiA9IGZsYWdzMSArIGk7CisgICAgICAgICAgICAgICAgZm9yIChqID0gazsgaiA8IHQxLT5oOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzMiArPSB0MS0+ZmxhZ3Nfc3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19zaWdwYXNzX3N0ZXBfbXFjKHQxLCBmbGFnczIsIGRhdGEyLCBvcmllbnQsIG9uZXBsdXNoYWxmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEyICs9IHQxLT53OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWU0MgYW5kICBCWVBBU1MgYnkgQW50b25pbiAqLworCitzdGF0aWMgdm9pZCBvcGpfdDFfZGVjX3NpZ3Bhc3NfbXFjX3ZzYygKKyAgICAgICAgICAgICAgICBvcGpfdDFfdCAqdDEsCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIGJwbm8sCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIG9yaWVudCkKK3sKKyAgICAgICAgT1BKX0lOVDMyIG9uZSwgaGFsZiwgb25lcGx1c2hhbGYsIHZzYzsKKyAgICAgICAgT1BKX1VJTlQzMiBpLCBqLCBrOworICAgICAgICBvbmUgPSAxIDw8IGJwbm87CisgICAgICAgIGhhbGYgPSBvbmUgPj4gMTsKKyAgICAgICAgb25lcGx1c2hhbGYgPSBvbmUgfCBoYWxmOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgdDEtPmg7IGsgKz0gNCkgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0MS0+dzsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSBrOyBqIDwgayArIDQgJiYgaiA8IHQxLT5oOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnNjID0gKGogPT0gayArIDMgfHwgaiA9PSB0MS0+aCAtIDEpID8gMSA6IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90MV9kZWNfc2lncGFzc19zdGVwX21xY192c2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0MS0+ZmxhZ3NbKChqKzEpICogdDEtPmZsYWdzX3N0cmlkZSkgKyBpICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdDEtPmRhdGFbKGogKiB0MS0+dykgKyBpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZXBsdXNoYWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVlNDIGFuZCAgQllQQVNTIGJ5IEFudG9uaW4gKi8KKworCisKK3N0YXRpYyB2b2lkIG9wal90MV9lbmNfcmVmcGFzc19zdGVwKCAgIG9wal90MV90ICp0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKmRhdGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYnBubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIG9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICpubXNlZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHZzYykKK3sKKwlPUEpfSU5UMzIgdjsKKwlPUEpfVUlOVDMyIGZsYWc7CisJCisJb3BqX21xY190ICptcWMgPSB0MS0+bXFjOwkvKiBNUUMgY29tcG9uZW50ICovCisJCisJZmxhZyA9IHZzYyA/IChPUEpfVUlOVDMyKSgoKmZsYWdzcCkgJiAofihUMV9TSUdfUyB8IFQxX1NJR19TRSB8IFQxX1NJR19TVyB8IFQxX1NHTl9TKSkpIDogKE9QSl9VSU5UMzIpKCpmbGFnc3ApOworCWlmICgoZmxhZyAmIChUMV9TSUcgfCBUMV9WSVNJVCkpID09IFQxX1NJRykgeworCQkqbm1zZWRlYyArPSBvcGpfdDFfZ2V0bm1zZWRlY19yZWYoKE9QSl9VSU5UMzIpb3BqX2ludF9hYnMoKmRhdGFwKSwgKE9QSl9VSU5UMzIpKGJwbm8pKTsKKwkJdiA9IG9wal9pbnRfYWJzKCpkYXRhcCkgJiBvbmUgPyAxIDogMDsKKwkJb3BqX21xY19zZXRjdXJjdHgobXFjLCBvcGpfdDFfZ2V0Y3R4bm9fbWFnKGZsYWcpKTsJLyogRVNTQUkgKi8KKwkJaWYgKHR5cGUgPT0gVDFfVFlQRV9SQVcpIHsJLyogQllQQVNTL0xBWlkgTU9ERSAqLworCQkJb3BqX21xY19ieXBhc3NfZW5jKG1xYywgKE9QSl9VSU5UMzIpdik7CisJCX0gZWxzZSB7CisJCQlvcGpfbXFjX2VuY29kZShtcWMsIChPUEpfVUlOVDMyKXYpOworCQl9CisJCSpmbGFnc3AgfD0gVDFfUkVGSU5FOworCX0KK30KKworc3RhdGljIElOTElORSB2b2lkIG9wal90MV9kZWNfcmVmcGFzc19zdGVwX3JhdygKKyAgICAgICAgICAgICAgICBvcGpfdDFfdCAqdDEsCisgICAgICAgICAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3NwLAorICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YXAsCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBvc2hhbGYsCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIG5lZ2hhbGYsCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHZzYykKK3sKKyAgICAgICAgT1BKX0lOVDMyIHYsIHQsIGZsYWc7CisgICAgICAgCisgICAgICAgIG9wal9yYXdfdCAqcmF3ID0gdDEtPnJhdzsgICAgICAgLyogUkFXIGNvbXBvbmVudCAqLworICAgICAgIAorICAgICAgICBmbGFnID0gdnNjID8gKCgqZmxhZ3NwKSAmICh+KFQxX1NJR19TIHwgVDFfU0lHX1NFIHwgVDFfU0lHX1NXIHwgVDFfU0dOX1MpKSkgOiAoKmZsYWdzcCk7CisgICAgICAgIGlmICgoZmxhZyAmIChUMV9TSUcgfCBUMV9WSVNJVCkpID09IFQxX1NJRykgeworICAgICAgICAgICAgICAgICAgICAgICAgdiA9IChPUEpfSU5UMzIpb3BqX3Jhd19kZWNvZGUocmF3KTsKKyAgICAgICAgICAgICAgICB0ID0gdiA/IHBvc2hhbGYgOiBuZWdoYWxmOworICAgICAgICAgICAgICAgICpkYXRhcCArPSAqZGF0YXAgPCAwID8gLXQgOiB0OworICAgICAgICAgICAgICAgICpmbGFnc3AgfD0gVDFfUkVGSU5FOworICAgICAgICB9Cit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZTQyBhbmQgIEJZUEFTUyBieSBBbnRvbmluICAqLworCitzdGF0aWMgSU5MSU5FIHZvaWQgb3BqX3QxX2RlY19yZWZwYXNzX3N0ZXBfbXFjKAorICAgICAgICAgICAgICAgIG9wal90MV90ICp0MSwKKyAgICAgICAgICAgICAgICBvcGpfZmxhZ190ICpmbGFnc3AsCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyICpkYXRhcCwKKyAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcG9zaGFsZiwKKyAgICAgICAgICAgICAgICBPUEpfSU5UMzIgbmVnaGFsZikKK3sKKyAgICAgICAgT1BKX0lOVDMyIHYsIHQsIGZsYWc7CisgICAgICAgCisgICAgICAgIG9wal9tcWNfdCAqbXFjID0gdDEtPm1xYzsgICAgICAgLyogTVFDIGNvbXBvbmVudCAqLworICAgICAgIAorICAgICAgICBmbGFnID0gKmZsYWdzcDsKKyAgICAgICAgaWYgKChmbGFnICYgKFQxX1NJRyB8IFQxX1ZJU0lUKSkgPT0gVDFfU0lHKSB7CisgICAgICAgICAgICAgICAgb3BqX21xY19zZXRjdXJjdHgobXFjLCBvcGpfdDFfZ2V0Y3R4bm9fbWFnKChPUEpfVUlOVDMyKWZsYWcpKTsgICAgICAvKiBFU1NBSSAqLworICAgICAgICAgICAgICAgICAgICAgICAgdiA9IG9wal9tcWNfZGVjb2RlKG1xYyk7CisgICAgICAgICAgICAgICAgdCA9IHYgPyBwb3NoYWxmIDogbmVnaGFsZjsKKyAgICAgICAgICAgICAgICAqZGF0YXAgKz0gKmRhdGFwIDwgMCA/IC10IDogdDsKKyAgICAgICAgICAgICAgICAqZmxhZ3NwIHw9IFQxX1JFRklORTsKKyAgICAgICAgICAgICAgICB9Cit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZTQyBhbmQgIEJZUEFTUyBieSBBbnRvbmluICAqLworCitzdGF0aWMgSU5MSU5FIHZvaWQgb3BqX3QxX2RlY19yZWZwYXNzX3N0ZXBfbXFjX3ZzYygKKyAgICAgICAgICAgICAgICBvcGpfdDFfdCAqdDEsCisgICAgICAgICAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3NwLAorICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YXAsCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBvc2hhbGYsCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIG5lZ2hhbGYsCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHZzYykKK3sKKyAgICAgICAgT1BKX0lOVDMyIHYsIHQsIGZsYWc7CisgICAgICAgCisgICAgICAgIG9wal9tcWNfdCAqbXFjID0gdDEtPm1xYzsgICAgICAgLyogTVFDIGNvbXBvbmVudCAqLworICAgICAgIAorICAgICAgICBmbGFnID0gdnNjID8gKCgqZmxhZ3NwKSAmICh+KFQxX1NJR19TIHwgVDFfU0lHX1NFIHwgVDFfU0lHX1NXIHwgVDFfU0dOX1MpKSkgOiAoKmZsYWdzcCk7CisgICAgICAgIGlmICgoZmxhZyAmIChUMV9TSUcgfCBUMV9WSVNJVCkpID09IFQxX1NJRykgeworICAgICAgICAgICAgICAgIG9wal9tcWNfc2V0Y3VyY3R4KG1xYywgb3BqX3QxX2dldGN0eG5vX21hZygoT1BKX1VJTlQzMilmbGFnKSk7ICAgICAgLyogRVNTQUkgKi8KKyAgICAgICAgICAgICAgICB2ID0gb3BqX21xY19kZWNvZGUobXFjKTsKKyAgICAgICAgICAgICAgICB0ID0gdiA/IHBvc2hhbGYgOiBuZWdoYWxmOworICAgICAgICAgICAgICAgICpkYXRhcCArPSAqZGF0YXAgPCAwID8gLXQgOiB0OworICAgICAgICAgICAgICAgICpmbGFnc3AgfD0gVDFfUkVGSU5FOworICAgICAgICB9Cit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZTQyBhbmQgIEJZUEFTUyBieSBBbnRvbmluICAqLworCisKK3N0YXRpYyB2b2lkIG9wal90MV9lbmNfcmVmcGFzcygKKwkJb3BqX3QxX3QgKnQxLAorCQlPUEpfSU5UMzIgYnBubywKKwkJT1BKX0lOVDMyICpubXNlZGVjLAorCQlPUEpfQllURSB0eXBlLAorCQlPUEpfVUlOVDMyIGNibGtzdHkpCit7CisJT1BKX1VJTlQzMiBpLCBqLCBrLCB2c2M7CisgICAgT1BKX0lOVDMyIG9uZTsKKworCSpubXNlZGVjID0gMDsKKwlvbmUgPSAxIDw8IChicG5vICsgVDFfTk1TRURFQ19GUkFDQklUUyk7CisJZm9yIChrID0gMDsgayA8IHQxLT5oOyBrICs9IDQpIHsKKwkJZm9yIChpID0gMDsgaSA8IHQxLT53OyArK2kpIHsKKwkJCWZvciAoaiA9IGs7IGogPCBrICsgNCAmJiBqIDwgdDEtPmg7ICsraikgeworCQkJCXZzYyA9ICgoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9WU0MpICYmIChqID09IGsgKyAzIHx8IGogPT0gdDEtPmggLSAxKSkgPyAxIDogMDsKKwkJCQlvcGpfdDFfZW5jX3JlZnBhc3Nfc3RlcCgKKwkJCQkJCXQxLAorCQkJCQkJJnQxLT5mbGFnc1soKGorMSkgKiB0MS0+ZmxhZ3Nfc3RyaWRlKSArIGkgKyAxXSwKKwkJCQkJCSZ0MS0+ZGF0YVsoaiAqIHQxLT5kYXRhX3N0cmlkZSkgKyBpXSwKKwkJCQkJCWJwbm8sCisJCQkJCQlvbmUsCisJCQkJCQlubXNlZGVjLAorCQkJCQkJdHlwZSwKKwkJCQkJCXZzYyk7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9wal90MV9kZWNfcmVmcGFzc19yYXcoCisgICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAorICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBicG5vLAorICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBjYmxrc3R5KQoreworICAgICAgICBPUEpfSU5UMzIgb25lLCBwb3NoYWxmLCBuZWdoYWxmOworICAgICAgICBPUEpfVUlOVDMyIGksIGosIGs7CisgICAgICAgIE9QSl9JTlQzMiB2c2M7CisgICAgICAgIG9uZSA9IDEgPDwgYnBubzsKKyAgICAgICAgcG9zaGFsZiA9IG9uZSA+PiAxOworICAgICAgICBuZWdoYWxmID0gYnBubyA+IDAgPyAtcG9zaGFsZiA6IC0xOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgdDEtPmg7IGsgKz0gNCkgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0MS0+dzsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSBrOyBqIDwgayArIDQgJiYgaiA8IHQxLT5oOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnNjID0gKChjYmxrc3R5ICYgSjJLX0NDUF9DQkxLU1RZX1ZTQykgJiYgKGogPT0gayArIDMgfHwgaiA9PSB0MS0+aCAtIDEpKSA/IDEgOiAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3JlZnBhc3Nfc3RlcF9yYXcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0MS0+ZmxhZ3NbKChqKzEpICogdDEtPmZsYWdzX3N0cmlkZSkgKyBpICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdDEtPmRhdGFbKGogKiB0MS0+dykgKyBpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2hhbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWdoYWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVlNDIGFuZCAgQllQQVNTIGJ5IEFudG9uaW4gKi8KKworc3RhdGljIHZvaWQgb3BqX3QxX2RlY19yZWZwYXNzX21xYygKKyAgICAgICAgICAgICAgICBvcGpfdDFfdCAqdDEsCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIGJwbm8pCit7CisgICAgICAgIE9QSl9JTlQzMiBvbmUsIHBvc2hhbGYsIG5lZ2hhbGY7CisgICAgICAgIE9QSl9VSU5UMzIgaSwgaiwgazsKKyAgICAgICAgT1BKX0lOVDMyICpkYXRhMSA9IHQxLT5kYXRhOworICAgICAgICBvcGpfZmxhZ190ICpmbGFnczEgPSAmdDEtPmZsYWdzWzFdOworICAgICAgICBvbmUgPSAxIDw8IGJwbm87CisgICAgICAgIHBvc2hhbGYgPSBvbmUgPj4gMTsKKyAgICAgICAgbmVnaGFsZiA9IGJwbm8gPiAwID8gLXBvc2hhbGYgOiAtMTsKKyAgICAgICAgZm9yIChrID0gMDsgayA8ICh0MS0+aCAmIH4zdSk7IGsgKz0gNCkgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0MS0+dzsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKmRhdGEyID0gZGF0YTEgKyBpOworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3MyID0gZmxhZ3MxICsgaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzMiArPSB0MS0+ZmxhZ3Nfc3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19yZWZwYXNzX3N0ZXBfbXFjKHQxLCBmbGFnczIsIGRhdGEyLCBwb3NoYWxmLCBuZWdoYWxmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEyICs9IHQxLT53OworICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MyICs9IHQxLT5mbGFnc19zdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3JlZnBhc3Nfc3RlcF9tcWModDEsIGZsYWdzMiwgZGF0YTIsIHBvc2hhbGYsIG5lZ2hhbGYpOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTIgKz0gdDEtPnc7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczIgKz0gdDEtPmZsYWdzX3N0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal90MV9kZWNfcmVmcGFzc19zdGVwX21xYyh0MSwgZmxhZ3MyLCBkYXRhMiwgcG9zaGFsZiwgbmVnaGFsZik7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhMiArPSB0MS0+dzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzMiArPSB0MS0+ZmxhZ3Nfc3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19yZWZwYXNzX3N0ZXBfbXFjKHQxLCBmbGFnczIsIGRhdGEyLCBwb3NoYWxmLCBuZWdoYWxmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEyICs9IHQxLT53OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkYXRhMSArPSB0MS0+dyA8PCAyOworICAgICAgICAgICAgICAgIGZsYWdzMSArPSB0MS0+ZmxhZ3Nfc3RyaWRlIDw8IDI7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHQxLT53OyArK2kpIHsKKyAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKmRhdGEyID0gZGF0YTEgKyBpOworICAgICAgICAgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzMiA9IGZsYWdzMSArIGk7CisgICAgICAgICAgICAgICAgZm9yIChqID0gazsgaiA8IHQxLT5oOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzMiArPSB0MS0+ZmxhZ3Nfc3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19yZWZwYXNzX3N0ZXBfbXFjKHQxLCBmbGFnczIsIGRhdGEyLCBwb3NoYWxmLCBuZWdoYWxmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEyICs9IHQxLT53OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWU0MgYW5kICBCWVBBU1MgYnkgQW50b25pbiAqLworCitzdGF0aWMgdm9pZCBvcGpfdDFfZGVjX3JlZnBhc3NfbXFjX3ZzYygKKyAgICAgICAgICAgICAgICBvcGpfdDFfdCAqdDEsCisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIGJwbm8pCit7CisgICAgICAgIE9QSl9JTlQzMiBvbmUsIHBvc2hhbGYsIG5lZ2hhbGY7CisgICAgICAgIE9QSl9VSU5UMzIgaSwgaiwgazsKKyAgICAgICAgT1BKX0lOVDMyIHZzYzsKKyAgICAgICAgb25lID0gMSA8PCBicG5vOworICAgICAgICBwb3NoYWxmID0gb25lID4+IDE7CisgICAgICAgIG5lZ2hhbGYgPSBicG5vID4gMCA/IC1wb3NoYWxmIDogLTE7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCB0MS0+aDsgayArPSA0KSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHQxLT53OyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IGs7IGogPCBrICsgNCAmJiBqIDwgdDEtPmg7ICsraikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c2MgPSAoKGogPT0gayArIDMgfHwgaiA9PSB0MS0+aCAtIDEpKSA/IDEgOiAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3JlZnBhc3Nfc3RlcF9tcWNfdnNjKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdDEtPmZsYWdzWygoaisxKSAqIHQxLT5mbGFnc19zdHJpZGUpICsgaSArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnQxLT5kYXRhWyhqICogdDEtPncpICsgaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NoYWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnaGFsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZzYyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9Cit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZTQyBhbmQgIEJZUEFTUyBieSBBbnRvbmluICovCisKKworc3RhdGljIHZvaWQgb3BqX3QxX2VuY19jbG5wYXNzX3N0ZXAoCisJCW9wal90MV90ICp0MSwKKwkJb3BqX2ZsYWdfdCAqZmxhZ3NwLAorCQlPUEpfSU5UMzIgKmRhdGFwLAorCQlPUEpfVUlOVDMyIG9yaWVudCwKKwkJT1BKX0lOVDMyIGJwbm8sCisJCU9QSl9JTlQzMiBvbmUsCisJCU9QSl9JTlQzMiAqbm1zZWRlYywKKwkJT1BKX1VJTlQzMiBwYXJ0aWFsLAorCQlPUEpfVUlOVDMyIHZzYykKK3sKKwlPUEpfSU5UMzIgdjsKKwlPUEpfVUlOVDMyIGZsYWc7CisJCisJb3BqX21xY190ICptcWMgPSB0MS0+bXFjOwkvKiBNUUMgY29tcG9uZW50ICovCisJCisJZmxhZyA9IHZzYyA/IChPUEpfVUlOVDMyKSgoKmZsYWdzcCkgJiAofihUMV9TSUdfUyB8IFQxX1NJR19TRSB8IFQxX1NJR19TVyB8IFQxX1NHTl9TKSkpIDogKE9QSl9VSU5UMzIpKCpmbGFnc3ApOworCWlmIChwYXJ0aWFsKSB7CisJCWdvdG8gTEFCRUxfUEFSVElBTDsKKwl9CisJaWYgKCEoKmZsYWdzcCAmIChUMV9TSUcgfCBUMV9WSVNJVCkpKSB7CisJCW9wal9tcWNfc2V0Y3VyY3R4KG1xYywgb3BqX3QxX2dldGN0eG5vX3pjKGZsYWcsIG9yaWVudCkpOworCQl2ID0gb3BqX2ludF9hYnMoKmRhdGFwKSAmIG9uZSA/IDEgOiAwOworCQlvcGpfbXFjX2VuY29kZShtcWMsIChPUEpfVUlOVDMyKXYpOworCQlpZiAodikgeworTEFCRUxfUEFSVElBTDoKKwkJCSpubXNlZGVjICs9IG9wal90MV9nZXRubXNlZGVjX3NpZygoT1BKX1VJTlQzMilvcGpfaW50X2FicygqZGF0YXApLCAoT1BKX1VJTlQzMikoYnBubykpOworCQkJb3BqX21xY19zZXRjdXJjdHgobXFjLCBvcGpfdDFfZ2V0Y3R4bm9fc2MoZmxhZykpOworCQkJdiA9ICpkYXRhcCA8IDAgPyAxIDogMDsKKwkJCW9wal9tcWNfZW5jb2RlKG1xYywgKE9QSl9VSU5UMzIpKHYgXiBvcGpfdDFfZ2V0c3BiKChPUEpfVUlOVDMyKWZsYWcpKSk7CisJCQlvcGpfdDFfdXBkYXRlZmxhZ3MoZmxhZ3NwLCAoT1BKX1VJTlQzMil2LCB0MS0+ZmxhZ3Nfc3RyaWRlKTsKKwkJfQorCX0KKwkqZmxhZ3NwICY9IH5UMV9WSVNJVDsKK30KKworc3RhdGljIHZvaWQgb3BqX3QxX2RlY19jbG5wYXNzX3N0ZXBfcGFydGlhbCgKKwkJb3BqX3QxX3QgKnQxLAorCQlvcGpfZmxhZ190ICpmbGFnc3AsCisJCU9QSl9JTlQzMiAqZGF0YXAsCisJCU9QSl9JTlQzMiBvcmllbnQsCisJCU9QSl9JTlQzMiBvbmVwbHVzaGFsZikKK3sKKwlPUEpfSU5UMzIgdiwgZmxhZzsKKwlvcGpfbXFjX3QgKm1xYyA9IHQxLT5tcWM7CS8qIE1RQyBjb21wb25lbnQgKi8KKwkKKwlPUEpfQVJHX05PVF9VU0VEKG9yaWVudCk7CisJCisJZmxhZyA9ICpmbGFnc3A7CisJb3BqX21xY19zZXRjdXJjdHgobXFjLCBvcGpfdDFfZ2V0Y3R4bm9fc2MoKE9QSl9VSU5UMzIpZmxhZykpOworCXYgPSBvcGpfbXFjX2RlY29kZShtcWMpIF4gb3BqX3QxX2dldHNwYigoT1BKX1VJTlQzMilmbGFnKTsKKwkqZGF0YXAgPSB2ID8gLW9uZXBsdXNoYWxmIDogb25lcGx1c2hhbGY7CisJb3BqX3QxX3VwZGF0ZWZsYWdzKGZsYWdzcCwgKE9QSl9VSU5UMzIpdiwgdDEtPmZsYWdzX3N0cmlkZSk7CisJKmZsYWdzcCAmPSB+VDFfVklTSVQ7Cit9CQkJCS8qIFZTQyBhbmQgIEJZUEFTUyBieSBBbnRvbmluICovCisKK3N0YXRpYyB2b2lkIG9wal90MV9kZWNfY2xucGFzc19zdGVwKAorCQlvcGpfdDFfdCAqdDEsCisJCW9wal9mbGFnX3QgKmZsYWdzcCwKKwkJT1BKX0lOVDMyICpkYXRhcCwKKwkJT1BKX0lOVDMyIG9yaWVudCwKKwkJT1BKX0lOVDMyIG9uZXBsdXNoYWxmKQoreworCU9QSl9JTlQzMiB2LCBmbGFnOworCQorCW9wal9tcWNfdCAqbXFjID0gdDEtPm1xYzsJLyogTVFDIGNvbXBvbmVudCAqLworCQorCWZsYWcgPSAqZmxhZ3NwOworCWlmICghKGZsYWcgJiAoVDFfU0lHIHwgVDFfVklTSVQpKSkgeworCQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIG9wal90MV9nZXRjdHhub196YygoT1BKX1VJTlQzMilmbGFnLCAoT1BKX1VJTlQzMilvcmllbnQpKTsKKwkJaWYgKG9wal9tcWNfZGVjb2RlKG1xYykpIHsKKwkJCW9wal9tcWNfc2V0Y3VyY3R4KG1xYywgb3BqX3QxX2dldGN0eG5vX3NjKChPUEpfVUlOVDMyKWZsYWcpKTsKKwkJCXYgPSBvcGpfbXFjX2RlY29kZShtcWMpIF4gb3BqX3QxX2dldHNwYigoT1BKX1VJTlQzMilmbGFnKTsKKwkJCSpkYXRhcCA9IHYgPyAtb25lcGx1c2hhbGYgOiBvbmVwbHVzaGFsZjsKKwkJCW9wal90MV91cGRhdGVmbGFncyhmbGFnc3AsIChPUEpfVUlOVDMyKXYsIHQxLT5mbGFnc19zdHJpZGUpOworCQl9CisJfQorCSpmbGFnc3AgJj0gflQxX1ZJU0lUOworfQkJCQkvKiBWU0MgYW5kICBCWVBBU1MgYnkgQW50b25pbiAqLworCitzdGF0aWMgdm9pZCBvcGpfdDFfZGVjX2NsbnBhc3Nfc3RlcF92c2MoCisJCW9wal90MV90ICp0MSwKKwkJb3BqX2ZsYWdfdCAqZmxhZ3NwLAorCQlPUEpfSU5UMzIgKmRhdGFwLAorCQlPUEpfSU5UMzIgb3JpZW50LAorCQlPUEpfSU5UMzIgb25lcGx1c2hhbGYsCisJCU9QSl9JTlQzMiBwYXJ0aWFsLAorCQlPUEpfSU5UMzIgdnNjKQoreworCU9QSl9JTlQzMiB2LCBmbGFnOworCQorCW9wal9tcWNfdCAqbXFjID0gdDEtPm1xYzsJLyogTVFDIGNvbXBvbmVudCAqLworCQorCWZsYWcgPSB2c2MgPyAoKCpmbGFnc3ApICYgKH4oVDFfU0lHX1MgfCBUMV9TSUdfU0UgfCBUMV9TSUdfU1cgfCBUMV9TR05fUykpKSA6ICgqZmxhZ3NwKTsKKwlpZiAocGFydGlhbCkgeworCQlnb3RvIExBQkVMX1BBUlRJQUw7CisJfQorCWlmICghKGZsYWcgJiAoVDFfU0lHIHwgVDFfVklTSVQpKSkgeworCQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIG9wal90MV9nZXRjdHhub196YygoT1BKX1VJTlQzMilmbGFnLCAoT1BKX1VJTlQzMilvcmllbnQpKTsKKwkJaWYgKG9wal9tcWNfZGVjb2RlKG1xYykpIHsKK0xBQkVMX1BBUlRJQUw6CisJCQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIG9wal90MV9nZXRjdHhub19zYygoT1BKX1VJTlQzMilmbGFnKSk7CisJCQl2ID0gb3BqX21xY19kZWNvZGUobXFjKSBeIG9wal90MV9nZXRzcGIoKE9QSl9VSU5UMzIpZmxhZyk7CisJCQkqZGF0YXAgPSB2ID8gLW9uZXBsdXNoYWxmIDogb25lcGx1c2hhbGY7CisJCQlvcGpfdDFfdXBkYXRlZmxhZ3MoZmxhZ3NwLCAoT1BKX1VJTlQzMil2LCB0MS0+ZmxhZ3Nfc3RyaWRlKTsKKwkJfQorCX0KKwkqZmxhZ3NwICY9IH5UMV9WSVNJVDsKK30KKworc3RhdGljIHZvaWQgb3BqX3QxX2VuY19jbG5wYXNzKAorCQlvcGpfdDFfdCAqdDEsCisJCU9QSl9JTlQzMiBicG5vLAorCQlPUEpfVUlOVDMyIG9yaWVudCwKKwkJT1BKX0lOVDMyICpubXNlZGVjLAorCQlPUEpfVUlOVDMyIGNibGtzdHkpCit7CisJT1BKX1VJTlQzMiBpLCBqLCBrOworCU9QSl9JTlQzMiBvbmU7CisJT1BKX1VJTlQzMiBhZ2csIHJ1bmxlbiwgdnNjOworCQorCW9wal9tcWNfdCAqbXFjID0gdDEtPm1xYzsJLyogTVFDIGNvbXBvbmVudCAqLworCQorCSpubXNlZGVjID0gMDsKKwlvbmUgPSAxIDw8IChicG5vICsgVDFfTk1TRURFQ19GUkFDQklUUyk7CisJZm9yIChrID0gMDsgayA8IHQxLT5oOyBrICs9IDQpIHsKKwkJZm9yIChpID0gMDsgaSA8IHQxLT53OyArK2kpIHsKKwkJCWlmIChrICsgMyA8IHQxLT5oKSB7CisJCQkJaWYgKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfVlNDKSB7CisJCQkJCWFnZyA9ICEoTUFDUk9fdDFfZmxhZ3MoMSArIGssMSArIGkpICYgKFQxX1NJRyB8IFQxX1ZJU0lUIHwgVDFfU0lHX09USCkKKwkJCQkJCXx8IE1BQ1JPX3QxX2ZsYWdzKDEgKyBrICsgMSwxICsgaSkgJiAoVDFfU0lHIHwgVDFfVklTSVQgfCBUMV9TSUdfT1RIKQorCQkJCQkJfHwgTUFDUk9fdDFfZmxhZ3MoMSArIGsgKyAyLDEgKyBpKSAmIChUMV9TSUcgfCBUMV9WSVNJVCB8IFQxX1NJR19PVEgpCisJCQkJCQl8fCAoTUFDUk9fdDFfZmxhZ3MoMSArIGsgKyAzLDEgKyBpKSAKKwkJCQkJCSYgKH4oVDFfU0lHX1MgfCBUMV9TSUdfU0UgfCBUMV9TSUdfU1cgfAlUMV9TR05fUykpKSAmIChUMV9TSUcgfCBUMV9WSVNJVCB8IFQxX1NJR19PVEgpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlhZ2cgPSAhKChNQUNST190MV9mbGFncygxICsgaywxICsgaSkgfCAKKwkJCQkJCSAgICBNQUNST190MV9mbGFncygxICsgayArIDEsMSArIGkpIHwKKwkJCQkJCSAgICBNQUNST190MV9mbGFncygxICsgayArIDIsMSArIGkpIHwgCisJCQkJCQkgICAgIE1BQ1JPX3QxX2ZsYWdzKDEgKyBrICsgMywxICsgaSkpICYgKFQxX1NJRyB8IFQxX1ZJU0lUIHwgVDFfU0lHX09USCkpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJYWdnID0gMDsKKwkJCX0KKwkJCWlmIChhZ2cpIHsKKwkJCQlmb3IgKHJ1bmxlbiA9IDA7IHJ1bmxlbiA8IDQ7ICsrcnVubGVuKSB7CisJCQkJCWlmIChvcGpfaW50X2Ficyh0MS0+ZGF0YVsoKGsgKyBydW5sZW4pKnQxLT5kYXRhX3N0cmlkZSkgKyBpXSkgJiBvbmUpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJb3BqX21xY19zZXRjdXJjdHgobXFjLCBUMV9DVFhOT19BR0cpOworCQkJCW9wal9tcWNfZW5jb2RlKG1xYywgcnVubGVuICE9IDQpOworCQkJCWlmIChydW5sZW4gPT0gNCkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJb3BqX21xY19zZXRjdXJjdHgobXFjLCBUMV9DVFhOT19VTkkpOworCQkJCW9wal9tcWNfZW5jb2RlKG1xYywgcnVubGVuID4+IDEpOworCQkJCW9wal9tcWNfZW5jb2RlKG1xYywgcnVubGVuICYgMSk7CisJCQl9IGVsc2UgeworCQkJCXJ1bmxlbiA9IDA7CisJCQl9CisJCQlmb3IgKGogPSBrICsgcnVubGVuOyBqIDwgayArIDQgJiYgaiA8IHQxLT5oOyArK2opIHsKKwkJCQl2c2MgPSAoKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfVlNDKSAmJiAoaiA9PSBrICsgMyB8fCBqID09IHQxLT5oIC0gMSkpID8gMSA6IDA7CisJCQkJb3BqX3QxX2VuY19jbG5wYXNzX3N0ZXAoCisJCQkJCQl0MSwKKwkJCQkJCSZ0MS0+ZmxhZ3NbKChqKzEpICogdDEtPmZsYWdzX3N0cmlkZSkgKyBpICsgMV0sCisJCQkJCQkmdDEtPmRhdGFbKGogKiB0MS0+ZGF0YV9zdHJpZGUpICsgaV0sCisJCQkJCQlvcmllbnQsCisJCQkJCQlicG5vLAorCQkJCQkJb25lLAorCQkJCQkJbm1zZWRlYywKKwkJCQkJCWFnZyAmJiAoaiA9PSBrICsgcnVubGVuKSwKKwkJCQkJCXZzYyk7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9wal90MV9kZWNfY2xucGFzcygKKwkJb3BqX3QxX3QgKnQxLAorCQlPUEpfSU5UMzIgYnBubywKKwkJT1BKX0lOVDMyIG9yaWVudCwKKwkJT1BKX0lOVDMyIGNibGtzdHkpCit7CisJT1BKX0lOVDMyIG9uZSwgaGFsZiwgb25lcGx1c2hhbGYsIGFnZywgcnVubGVuLCB2c2M7CisgICAgT1BKX1VJTlQzMiBpLCBqLCBrOworCU9QSl9JTlQzMiBzZWdzeW0gPSBjYmxrc3R5ICYgSjJLX0NDUF9DQkxLU1RZX1NFR1NZTTsKKwkKKwlvcGpfbXFjX3QgKm1xYyA9IHQxLT5tcWM7CS8qIE1RQyBjb21wb25lbnQgKi8KKwkKKwlvbmUgPSAxIDw8IGJwbm87CisJaGFsZiA9IG9uZSA+PiAxOworCW9uZXBsdXNoYWxmID0gb25lIHwgaGFsZjsKKwlpZiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9WU0MpIHsKKwlmb3IgKGsgPSAwOyBrIDwgdDEtPmg7IGsgKz0gNCkgeworCQlmb3IgKGkgPSAwOyBpIDwgdDEtPnc7ICsraSkgeworCQkJaWYgKGsgKyAzIDwgdDEtPmgpIHsKKwkJCQkJYWdnID0gIShNQUNST190MV9mbGFncygxICsgaywxICsgaSkgJiAoVDFfU0lHIHwgVDFfVklTSVQgfCBUMV9TSUdfT1RIKQorCQkJCQkJfHwgTUFDUk9fdDFfZmxhZ3MoMSArIGsgKyAxLDEgKyBpKSAmIChUMV9TSUcgfCBUMV9WSVNJVCB8IFQxX1NJR19PVEgpCisJCQkJCQl8fCBNQUNST190MV9mbGFncygxICsgayArIDIsMSArIGkpICYgKFQxX1NJRyB8IFQxX1ZJU0lUIHwgVDFfU0lHX09USCkKKwkJCQkJCXx8IChNQUNST190MV9mbGFncygxICsgayArIDMsMSArIGkpIAorCQkJCQkJJiAofihUMV9TSUdfUyB8IFQxX1NJR19TRSB8IFQxX1NJR19TVyB8CVQxX1NHTl9TKSkpICYgKFQxX1NJRyB8IFQxX1ZJU0lUIHwgVDFfU0lHX09USCkpOworCQkJCX0gZWxzZSB7CisJCQkJYWdnID0gMDsKKwkJCX0KKwkJCWlmIChhZ2cpIHsKKwkJCQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIFQxX0NUWE5PX0FHRyk7CisJCQkJaWYgKCFvcGpfbXFjX2RlY29kZShtcWMpKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIFQxX0NUWE5PX1VOSSk7CisJCQkJcnVubGVuID0gb3BqX21xY19kZWNvZGUobXFjKTsKKwkJCQlydW5sZW4gPSAocnVubGVuIDw8IDEpIHwgb3BqX21xY19kZWNvZGUobXFjKTsKKwkJCX0gZWxzZSB7CisJCQkJcnVubGVuID0gMDsKKwkJCX0KKwkJCWZvciAoaiA9IGsgKyAoT1BKX1VJTlQzMilydW5sZW47IGogPCBrICsgNCAmJiBqIDwgdDEtPmg7ICsraikgeworCQkJCQl2c2MgPSAoaiA9PSBrICsgMyB8fCBqID09IHQxLT5oIC0gMSkgPyAxIDogMDsKKwkJCQkJb3BqX3QxX2RlY19jbG5wYXNzX3N0ZXBfdnNjKAorCQkJCQkJdDEsCisJCQkJCQkmdDEtPmZsYWdzWygoaisxKSAqIHQxLT5mbGFnc19zdHJpZGUpICsgaSArIDFdLAorCQkJCQkJJnQxLT5kYXRhWyhqICogdDEtPncpICsgaV0sCisJCQkJCQlvcmllbnQsCisJCQkJCQlvbmVwbHVzaGFsZiwKKwkJCQkJCWFnZyAmJiAoaiA9PSBrICsgKE9QSl9VSU5UMzIpcnVubGVuKSwKKwkJCQkJCXZzYyk7CisJCQl9CisJCX0KKwl9CisJfSBlbHNlIHsKKwkJT1BKX0lOVDMyICpkYXRhMSA9IHQxLT5kYXRhOworCQlvcGpfZmxhZ190ICpmbGFnczEgPSAmdDEtPmZsYWdzWzFdOworCQlmb3IgKGsgPSAwOyBrIDwgKHQxLT5oICYgfjN1KTsgayArPSA0KSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgdDEtPnc7ICsraSkgeworCQkJCU9QSl9JTlQzMiAqZGF0YTIgPSBkYXRhMSArIGk7CisJCQkJb3BqX2ZsYWdfdCAqZmxhZ3MyID0gZmxhZ3MxICsgaTsKKwkJCQlhZ2cgPSAhKChNQUNST190MV9mbGFncygxICsgaywgMSArIGkpIHwKKwkJCQkJCQlNQUNST190MV9mbGFncygxICsgayArIDEsIDEgKyBpKSB8CisJCQkJCQkJTUFDUk9fdDFfZmxhZ3MoMSArIGsgKyAyLCAxICsgaSkgfAorCQkJCQkJCU1BQ1JPX3QxX2ZsYWdzKDEgKyBrICsgMywgMSArIGkpKSAmIChUMV9TSUcgfCBUMV9WSVNJVCB8IFQxX1NJR19PVEgpKTsKKwkJCQlpZiAoYWdnKSB7CisJCQkJCW9wal9tcWNfc2V0Y3VyY3R4KG1xYywgVDFfQ1RYTk9fQUdHKTsKKwkJCQkJaWYgKCFvcGpfbXFjX2RlY29kZShtcWMpKSB7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIFQxX0NUWE5PX1VOSSk7CisJCQkJCXJ1bmxlbiA9IG9wal9tcWNfZGVjb2RlKG1xYyk7CisJCQkJCXJ1bmxlbiA9IChydW5sZW4gPDwgMSkgfCBvcGpfbXFjX2RlY29kZShtcWMpOworCQkJCQlmbGFnczIgKz0gKE9QSl9VSU5UMzIpcnVubGVuICogdDEtPmZsYWdzX3N0cmlkZTsKKwkJCQkJZGF0YTIgKz0gKE9QSl9VSU5UMzIpcnVubGVuICogdDEtPnc7CisJCQkJCWZvciAoaiA9IChPUEpfVUlOVDMyKXJ1bmxlbjsgaiA8IDQgJiYgaiA8IHQxLT5oOyArK2opIHsKKwkJCQkJCWZsYWdzMiArPSB0MS0+ZmxhZ3Nfc3RyaWRlOworCQkJCQkJaWYgKGFnZyAmJiAoaiA9PSAoT1BKX1VJTlQzMilydW5sZW4pKSB7CisJCQkJCQkJb3BqX3QxX2RlY19jbG5wYXNzX3N0ZXBfcGFydGlhbCh0MSwgZmxhZ3MyLCBkYXRhMiwgb3JpZW50LCBvbmVwbHVzaGFsZik7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCW9wal90MV9kZWNfY2xucGFzc19zdGVwKHQxLCBmbGFnczIsIGRhdGEyLCBvcmllbnQsIG9uZXBsdXNoYWxmKTsKKwkJCQkJCX0KKwkJCQkJCWRhdGEyICs9IHQxLT53OworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJZmxhZ3MyICs9IHQxLT5mbGFnc19zdHJpZGU7CisJCQkJCW9wal90MV9kZWNfY2xucGFzc19zdGVwKHQxLCBmbGFnczIsIGRhdGEyLCBvcmllbnQsIG9uZXBsdXNoYWxmKTsKKwkJCQkJZGF0YTIgKz0gdDEtPnc7CisJCQkJCWZsYWdzMiArPSB0MS0+ZmxhZ3Nfc3RyaWRlOworCQkJCQlvcGpfdDFfZGVjX2NsbnBhc3Nfc3RlcCh0MSwgZmxhZ3MyLCBkYXRhMiwgb3JpZW50LCBvbmVwbHVzaGFsZik7CisJCQkJCWRhdGEyICs9IHQxLT53OworCQkJCQlmbGFnczIgKz0gdDEtPmZsYWdzX3N0cmlkZTsKKwkJCQkJb3BqX3QxX2RlY19jbG5wYXNzX3N0ZXAodDEsIGZsYWdzMiwgZGF0YTIsIG9yaWVudCwgb25lcGx1c2hhbGYpOworCQkJCQlkYXRhMiArPSB0MS0+dzsKKwkJCQkJZmxhZ3MyICs9IHQxLT5mbGFnc19zdHJpZGU7CisJCQkJCW9wal90MV9kZWNfY2xucGFzc19zdGVwKHQxLCBmbGFnczIsIGRhdGEyLCBvcmllbnQsIG9uZXBsdXNoYWxmKTsKKwkJCQkJZGF0YTIgKz0gdDEtPnc7CisJCQkJfQorCQkJfQorCQkJZGF0YTEgKz0gdDEtPncgPDwgMjsKKwkJCWZsYWdzMSArPSB0MS0+ZmxhZ3Nfc3RyaWRlIDw8IDI7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IHQxLT53OyArK2kpIHsKKwkJCU9QSl9JTlQzMiAqZGF0YTIgPSBkYXRhMSArIGk7CisJCQlvcGpfZmxhZ190ICpmbGFnczIgPSBmbGFnczEgKyBpOworCQkJZm9yIChqID0gazsgaiA8IHQxLT5oOyArK2opIHsKKwkJCQlmbGFnczIgKz0gdDEtPmZsYWdzX3N0cmlkZTsKKwkJCQlvcGpfdDFfZGVjX2NsbnBhc3Nfc3RlcCh0MSwgZmxhZ3MyLCBkYXRhMiwgb3JpZW50LCBvbmVwbHVzaGFsZik7CisJCQkJZGF0YTIgKz0gdDEtPnc7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoc2Vnc3ltKSB7CisJCU9QSl9JTlQzMiB2ID0gMDsKKwkJb3BqX21xY19zZXRjdXJjdHgobXFjLCBUMV9DVFhOT19VTkkpOworCQl2ID0gb3BqX21xY19kZWNvZGUobXFjKTsKKwkJdiA9ICh2IDw8IDEpIHwgb3BqX21xY19kZWNvZGUobXFjKTsKKwkJdiA9ICh2IDw8IDEpIHwgb3BqX21xY19kZWNvZGUobXFjKTsKKwkJdiA9ICh2IDw8IDEpIHwgb3BqX21xY19kZWNvZGUobXFjKTsKKwkJLyoKKwkJaWYgKHYhPTB4YSkgeworCQkJb3BqX2V2ZW50X21zZyh0MS0+Y2luZm8sIEVWVF9XQVJOSU5HLCAiQmFkIHNlZ21lbnRhdGlvbiBzeW1ib2wgJXhcbiIsIHYpOworCQl9IAorCQkqLworCX0KK30JCQkJLyogVlNDIGFuZCAgQllQQVNTIGJ5IEFudG9uaW4gKi8KKworCisvKiogbW9kIGZpeGVkX3F1YWxpdHkgKi8KK3N0YXRpYyBPUEpfRkxPQVQ2NCBvcGpfdDFfZ2V0d21zZWRlYygKKwkJT1BKX0lOVDMyIG5tc2VkZWMsCisJCU9QSl9VSU5UMzIgY29tcG5vLAorCQlPUEpfVUlOVDMyIGxldmVsLAorCQlPUEpfVUlOVDMyIG9yaWVudCwKKwkJT1BKX0lOVDMyIGJwbm8sCisJCU9QSl9VSU5UMzIgcW1mYmlkLAorCQlPUEpfRkxPQVQ2NCBzdGVwc2l6ZSwKKwkJT1BKX1VJTlQzMiBudW1jb21wcywKKwkJY29uc3QgT1BKX0ZMT0FUNjQgKiBtY3Rfbm9ybXMsCisJCU9QSl9VSU5UMzIgbWN0X251bWNvbXBzKQoreworCU9QSl9GTE9BVDY0IHcxID0gMSwgdzIsIHdtc2VkZWM7CisJT1BKX0FSR19OT1RfVVNFRChudW1jb21wcyk7CisKKwlpZiAobWN0X25vcm1zICYmIChjb21wbm8gPCBtY3RfbnVtY29tcHMpKSB7CisJCXcxID0gbWN0X25vcm1zW2NvbXBub107CisJfQorCisJaWYgKHFtZmJpZCA9PSAxKSB7CisJCXcyID0gb3BqX2R3dF9nZXRub3JtKGxldmVsLCBvcmllbnQpOworCX0gZWxzZSB7CS8qIGlmIChxbWZiaWQgPT0gMCkgKi8KKwkJdzIgPSBvcGpfZHd0X2dldG5vcm1fcmVhbChsZXZlbCwgb3JpZW50KTsKKwl9CisKKwl3bXNlZGVjID0gdzEgKiB3MiAqIHN0ZXBzaXplICogKDEgPDwgYnBubyk7CisJd21zZWRlYyAqPSB3bXNlZGVjICogbm1zZWRlYyAvIDgxOTIuMDsKKworCXJldHVybiB3bXNlZGVjOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX3QxX2FsbG9jYXRlX2J1ZmZlcnMoCisJCW9wal90MV90ICp0MSwKKwkJT1BKX1VJTlQzMiB3LAorCQlPUEpfVUlOVDMyIGgpCit7CisJT1BKX1VJTlQzMiBkYXRhc2l6ZT13ICogaDsKKwlPUEpfVUlOVDMyIGZsYWdzc2l6ZTsKKworCS8qIGVuY29kZXIgdXNlcyB0aWxlIGJ1ZmZlciwgc28gbm8gbmVlZCB0byBhbGxvY2F0ZSAqLworCWlmICghdDEtPmVuY29kZXIpIHsKKwkJaWYoZGF0YXNpemUgPiB0MS0+ZGF0YXNpemUpeworCQkJb3BqX2FsaWduZWRfZnJlZSh0MS0+ZGF0YSk7CisJCQl0MS0+ZGF0YSA9IChPUEpfSU5UMzIqKSBvcGpfYWxpZ25lZF9tYWxsb2MoZGF0YXNpemUgKiBzaXplb2YoT1BKX0lOVDMyKSk7CisJCQlpZighdDEtPmRhdGEpeworCQkJCS8qIEZJWE1FIGV2ZW50IG1hbmFnZXIgZXJyb3IgY2FsbGJhY2sgKi8KKwkJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQkJfQorCQkJdDEtPmRhdGFzaXplPWRhdGFzaXplOworCQl9CisJCW1lbXNldCh0MS0+ZGF0YSwwLGRhdGFzaXplICogc2l6ZW9mKE9QSl9JTlQzMikpOworCX0KKwl0MS0+ZmxhZ3Nfc3RyaWRlPXcrMjsKKwlmbGFnc3NpemU9dDEtPmZsYWdzX3N0cmlkZSAqIChoKzIpOworCisJaWYoZmxhZ3NzaXplID4gdDEtPmZsYWdzc2l6ZSl7CisJCW9wal9hbGlnbmVkX2ZyZWUodDEtPmZsYWdzKTsKKwkJdDEtPmZsYWdzID0gKG9wal9mbGFnX3QqKSBvcGpfYWxpZ25lZF9tYWxsb2MoZmxhZ3NzaXplICogc2l6ZW9mKG9wal9mbGFnX3QpKTsKKwkJaWYoIXQxLT5mbGFncyl7CisJCQkvKiBGSVhNRSBldmVudCBtYW5hZ2VyIGVycm9yIGNhbGxiYWNrICovCisJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQl9CisJCXQxLT5mbGFnc3NpemU9ZmxhZ3NzaXplOworCX0KKwltZW1zZXQodDEtPmZsYWdzLDAsZmxhZ3NzaXplICogc2l6ZW9mKG9wal9mbGFnX3QpKTsKKworCXQxLT53PXc7CisJdDEtPmg9aDsKKworCXJldHVybiBPUEpfVFJVRTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogQ3JlYXRlcyBhIG5ldyBUaWVyIDEgaGFuZGxlCisgKiBhbmQgaW5pdGlhbGl6ZXMgdGhlIGxvb2stdXAgdGFibGVzIG9mIHRoZSBUaWVyLTEgY29kZXIvZGVjb2RlcgorICogQHJldHVybiBhIG5ldyBUMSBoYW5kbGUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQorKi8KK29wal90MV90KiBvcGpfdDFfY3JlYXRlKE9QSl9CT09MIGlzRW5jb2RlcikKK3sKKwlvcGpfdDFfdCAqbF90MSA9IDAwOworCisJbF90MSA9IChvcGpfdDFfdCopIG9wal9jYWxsb2MoMSxzaXplb2Yob3BqX3QxX3QpKTsKKwlpZiAoIWxfdDEpIHsKKwkJcmV0dXJuIDAwOworCX0KKworCS8qIGNyZWF0ZSBNUUMgYW5kIFJBVyBoYW5kbGVzICovCisJbF90MS0+bXFjID0gb3BqX21xY19jcmVhdGUoKTsKKwlpZiAoISBsX3QxLT5tcWMpIHsKKwkJb3BqX3QxX2Rlc3Ryb3kobF90MSk7CisJCXJldHVybiAwMDsKKwl9CisKKwlsX3QxLT5yYXcgPSBvcGpfcmF3X2NyZWF0ZSgpOworCWlmICghIGxfdDEtPnJhdykgeworCQlvcGpfdDFfZGVzdHJveShsX3QxKTsKKwkJcmV0dXJuIDAwOworCX0KKwlsX3QxLT5lbmNvZGVyID0gaXNFbmNvZGVyOworCisJcmV0dXJuIGxfdDE7Cit9CisKKworLyoqCisgKiBEZXN0cm95cyBhIHByZXZpb3VzbHkgY3JlYXRlZCBUMSBoYW5kbGUKKyAqCisgKiBAcGFyYW0gcF90MSBUaWVyIDEgaGFuZGxlIHRvIGRlc3Ryb3kKKyovCit2b2lkIG9wal90MV9kZXN0cm95KG9wal90MV90ICpwX3QxKQoreworCWlmICghIHBfdDEpIHsKKwkJcmV0dXJuOworCX0KKworCS8qIGRlc3Ryb3kgTVFDIGFuZCBSQVcgaGFuZGxlcyAqLworCW9wal9tcWNfZGVzdHJveShwX3QxLT5tcWMpOworCXBfdDEtPm1xYyA9IDAwOworCW9wal9yYXdfZGVzdHJveShwX3QxLT5yYXcpOworCXBfdDEtPnJhdyA9IDAwOworCQorCS8qIGVuY29kZXIgdXNlcyB0aWxlIGJ1ZmZlciwgc28gbm8gbmVlZCB0byBmcmVlICovCisJaWYgKCFwX3QxLT5lbmNvZGVyICYmIHBfdDEtPmRhdGEpIHsKKwkJb3BqX2FsaWduZWRfZnJlZShwX3QxLT5kYXRhKTsKKwkJcF90MS0+ZGF0YSA9IDAwOworCX0KKworCWlmIChwX3QxLT5mbGFncykgeworCQlvcGpfYWxpZ25lZF9mcmVlKHBfdDEtPmZsYWdzKTsKKwkJcF90MS0+ZmxhZ3MgPSAwMDsKKwl9CisKKwlvcGpfZnJlZShwX3QxKTsKK30KKworT1BKX0JPT0wgb3BqX3QxX2RlY29kZV9jYmxrcyggICBvcGpfdDFfdCogdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlY29tcF90KiB0aWxlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNjcF90KiB0Y2NwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworCU9QSl9VSU5UMzIgcmVzbm8sIGJhbmRubywgcHJlY25vLCBjYmxrbm87CisJT1BKX1VJTlQzMiB0aWxlX3cgPSAoT1BKX1VJTlQzMikodGlsZWMtPngxIC0gdGlsZWMtPngwKTsKKworCWZvciAocmVzbm8gPSAwOyByZXNubyA8IHRpbGVjLT5taW5pbXVtX251bV9yZXNvbHV0aW9uczsgKytyZXNubykgeworCQlvcGpfdGNkX3Jlc29sdXRpb25fdCogcmVzID0gJnRpbGVjLT5yZXNvbHV0aW9uc1tyZXNub107CisKKwkJZm9yIChiYW5kbm8gPSAwOyBiYW5kbm8gPCByZXMtPm51bWJhbmRzOyArK2JhbmRubykgeworCQkJb3BqX3RjZF9iYW5kX3QqIHJlc3RyaWN0IGJhbmQgPSAmcmVzLT5iYW5kc1tiYW5kbm9dOworCisJCQlmb3IgKHByZWNubyA9IDA7IHByZWNubyA8IHJlcy0+cHcgKiByZXMtPnBoOyArK3ByZWNubykgeworCQkJCW9wal90Y2RfcHJlY2luY3RfdCogcHJlY2luY3QgPSAmYmFuZC0+cHJlY2luY3RzW3ByZWNub107CisKKwkJCQlmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IHByZWNpbmN0LT5jdyAqIHByZWNpbmN0LT5jaDsgKytjYmxrbm8pIHsKKwkJCQkJb3BqX3RjZF9jYmxrX2RlY190KiBjYmxrID0gJnByZWNpbmN0LT5jYmxrcy5kZWNbY2Jsa25vXTsKKwkJCQkJT1BKX0lOVDMyKiByZXN0cmljdCBkYXRhcDsKKwkJCQkJT1BKX1VJTlQzMiBjYmxrX3csIGNibGtfaDsKKwkJCQkJT1BKX0lOVDMyIHgsIHk7CisJCQkJCU9QSl9VSU5UMzIgaSwgajsKKworICAgICAgICAgICAgICAgICAgICBpZiAoT1BKX0ZBTFNFID09IG9wal90MV9kZWNvZGVfY2JsaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmQtPmJhbmRubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9VSU5UMzIpdGNjcC0+cm9pc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPmNibGtzdHkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisJCQkJCXggPSBjYmxrLT54MCAtIGJhbmQtPngwOworCQkJCQl5ID0gY2Jsay0+eTAgLSBiYW5kLT55MDsKKwkJCQkJaWYgKGJhbmQtPmJhbmRubyAmIDEpIHsKKwkJCQkJCW9wal90Y2RfcmVzb2x1dGlvbl90KiBwcmVzID0gJnRpbGVjLT5yZXNvbHV0aW9uc1tyZXNubyAtIDFdOworCQkJCQkJeCArPSBwcmVzLT54MSAtIHByZXMtPngwOworCQkJCQl9CisJCQkJCWlmIChiYW5kLT5iYW5kbm8gJiAyKSB7CisJCQkJCQlvcGpfdGNkX3Jlc29sdXRpb25fdCogcHJlcyA9ICZ0aWxlYy0+cmVzb2x1dGlvbnNbcmVzbm8gLSAxXTsKKwkJCQkJCXkgKz0gcHJlcy0+eTEgLSBwcmVzLT55MDsKKwkJCQkJfQorCisJCQkJCWRhdGFwPXQxLT5kYXRhOworCQkJCQljYmxrX3cgPSB0MS0+dzsKKwkJCQkJY2Jsa19oID0gdDEtPmg7CisKKwkJCQkJaWYgKHRjY3AtPnJvaXNoaWZ0KSB7CisJCQkJCQlPUEpfSU5UMzIgdGhyZXNoID0gMSA8PCB0Y2NwLT5yb2lzaGlmdDsKKwkJCQkJCWZvciAoaiA9IDA7IGogPCBjYmxrX2g7ICsraikgeworCQkJCQkJCWZvciAoaSA9IDA7IGkgPCBjYmxrX3c7ICsraSkgeworCQkJCQkJCQlPUEpfSU5UMzIgdmFsID0gZGF0YXBbKGogKiBjYmxrX3cpICsgaV07CisJCQkJCQkJCU9QSl9JTlQzMiBtYWcgPSBhYnModmFsKTsKKwkJCQkJCQkJaWYgKG1hZyA+PSB0aHJlc2gpIHsKKwkJCQkJCQkJCW1hZyA+Pj0gdGNjcC0+cm9pc2hpZnQ7CisJCQkJCQkJCQlkYXRhcFsoaiAqIGNibGtfdykgKyBpXSA9IHZhbCA8IDAgPyAtbWFnIDogbWFnOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmICh0Y2NwLT5xbWZiaWQgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyKiByZXN0cmljdCB0aWxlZHAgPSAmdGlsZWMtPmRhdGFbKE9QSl9VSU5UMzIpeSAqIHRpbGVfdyArIChPUEpfVUlOVDMyKXhdOworCQkJCQkJZm9yIChqID0gMDsgaiA8IGNibGtfaDsgKytqKSB7CisJCQkJCQkJZm9yIChpID0gMDsgaSA8IGNibGtfdzsgKytpKSB7CisJCQkJCQkJCU9QSl9JTlQzMiB0bXAgPSBkYXRhcFsoaiAqIGNibGtfdykgKyBpXTsKKwkJCQkJCQkJKChPUEpfSU5UMzIqKXRpbGVkcClbKGogKiB0aWxlX3cpICsgaV0gPSB0bXAvMjsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CQkvKiBpZiAodGNjcC0+cW1mYmlkID09IDApICovCisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiogcmVzdHJpY3QgdGlsZWRwID0gKE9QSl9GTE9BVDMyKikgJnRpbGVjLT5kYXRhWyhPUEpfVUlOVDMyKXkgKiB0aWxlX3cgKyAoT1BKX1VJTlQzMil4XTsKKwkJCQkJCWZvciAoaiA9IDA7IGogPCBjYmxrX2g7ICsraikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyKiByZXN0cmljdCB0aWxlZHAyID0gdGlsZWRwOworCQkJCQkJCWZvciAoaSA9IDA7IGkgPCBjYmxrX3c7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiB0bXAgPSAoT1BKX0ZMT0FUMzIpKmRhdGFwICogYmFuZC0+c3RlcHNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aWxlZHAyID0gdG1wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhcCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlZHAyKys7CisJCQkJCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVkcCArPSB0aWxlX3c7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IC8qIGNibGtubyAqLworCQkJfSAvKiBwcmVjbm8gKi8KKwkJfSAvKiBiYW5kbm8gKi8KKwl9IC8qIHJlc25vICovCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworCitzdGF0aWMgT1BKX0JPT0wgb3BqX3QxX2RlY29kZV9jYmxrKG9wal90MV90ICp0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX2NibGtfZGVjX3QqIGNibGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBvcmllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiByb2lzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNibGtzdHkpCit7CisJb3BqX3Jhd190ICpyYXcgPSB0MS0+cmF3OwkvKiBSQVcgY29tcG9uZW50ICovCisJb3BqX21xY190ICptcWMgPSB0MS0+bXFjOwkvKiBNUUMgY29tcG9uZW50ICovCisKKwlPUEpfSU5UMzIgYnBub19wbHVzX29uZTsKKwlPUEpfVUlOVDMyIHBhc3N0eXBlOworCU9QSl9VSU5UMzIgc2Vnbm8sIHBhc3NubzsKKwlPUEpfQllURSB0eXBlID0gVDFfVFlQRV9NUTsgLyogQllQQVNTIG1vZGUgKi8KKworCWlmKCFvcGpfdDFfYWxsb2NhdGVfYnVmZmVycygKKwkJCQl0MSwKKwkJCQkoT1BKX1VJTlQzMikoY2Jsay0+eDEgLSBjYmxrLT54MCksCisJCQkJKE9QSl9VSU5UMzIpKGNibGstPnkxIC0gY2Jsay0+eTApKSkKKwl7CisJCXJldHVybiBPUEpfRkFMU0U7CisJfQorCisJYnBub19wbHVzX29uZSA9IChPUEpfSU5UMzIpKHJvaXNoaWZ0ICsgY2Jsay0+bnVtYnBzKTsKKwlwYXNzdHlwZSA9IDI7CisKKwlvcGpfbXFjX3Jlc2V0c3RhdGVzKG1xYyk7CisJb3BqX21xY19zZXRzdGF0ZShtcWMsIFQxX0NUWE5PX1VOSSwgMCwgNDYpOworCW9wal9tcWNfc2V0c3RhdGUobXFjLCBUMV9DVFhOT19BR0csIDAsIDMpOworCW9wal9tcWNfc2V0c3RhdGUobXFjLCBUMV9DVFhOT19aQywgMCwgNCk7CisKKwlmb3IgKHNlZ25vID0gMDsgc2Vnbm8gPCBjYmxrLT5yZWFsX251bV9zZWdzOyArK3NlZ25vKSB7CisJCW9wal90Y2Rfc2VnX3QgKnNlZyA9ICZjYmxrLT5zZWdzW3NlZ25vXTsKKworCQkvKiBCWVBBU1MgbW9kZSAqLworCQl0eXBlID0gKChicG5vX3BsdXNfb25lIDw9ICgoT1BKX0lOVDMyKSAoY2Jsay0+bnVtYnBzKSkgLSA0KSAmJiAocGFzc3R5cGUgPCAyKSAmJiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9MQVpZKSkgPyBUMV9UWVBFX1JBVyA6IFQxX1RZUEVfTVE7CisJCS8qIEZJWE1FOiBzbHZpZXdlciBnZXRzIGhlcmUgd2l0aCBhIG51bGwgcG9pbnRlci4gV2h5PyBQYXJ0aWFsbHkgZG93bmxvYWRlZCBhbmQvb3IgY29ycnVwdCB0ZXh0dXJlcz8gKi8KKwkJaWYoc2VnLT5kYXRhID09IDAwKXsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICh0eXBlID09IFQxX1RZUEVfUkFXKSB7CisJCQlvcGpfcmF3X2luaXRfZGVjKHJhdywgKCpzZWctPmRhdGEpICsgc2VnLT5kYXRhaW5kZXgsIHNlZy0+bGVuKTsKKwkJfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChPUEpfRkFMU0UgPT0gb3BqX21xY19pbml0X2RlYyhtcWMsICgqc2VnLT5kYXRhKSArIHNlZy0+ZGF0YWluZGV4LCBzZWctPmxlbikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKwkJfQorCisJCWZvciAocGFzc25vID0gMDsgcGFzc25vIDwgc2VnLT5yZWFsX251bV9wYXNzZXM7ICsrcGFzc25vKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHBhc3N0eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBUMV9UWVBFX1JBVykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19zaWdwYXNzX3Jhdyh0MSwgYnBub19wbHVzX29uZSwgKE9QSl9JTlQzMilvcmllbnQsIChPUEpfSU5UMzIpY2Jsa3N0eSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9WU0MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3NpZ3Bhc3NfbXFjX3ZzYyh0MSwgYnBub19wbHVzX29uZSwgKE9QSl9JTlQzMilvcmllbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3NpZ3Bhc3NfbXFjKHQxLCBicG5vX3BsdXNfb25lLCAoT1BKX0lOVDMyKW9yaWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBUMV9UWVBFX1JBVykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90MV9kZWNfcmVmcGFzc19yYXcodDEsIGJwbm9fcGx1c19vbmUsIChPUEpfSU5UMzIpY2Jsa3N0eSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9WU0MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3JlZnBhc3NfbXFjX3ZzYyh0MSwgYnBub19wbHVzX29uZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90MV9kZWNfcmVmcGFzc19tcWModDEsIGJwbm9fcGx1c19vbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19jbG5wYXNzKHQxLCBicG5vX3BsdXNfb25lLCAoT1BKX0lOVDMyKW9yaWVudCwgKE9QSl9JTlQzMiljYmxrc3R5KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKwkJCWlmICgoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9SRVNFVCkgJiYgdHlwZSA9PSBUMV9UWVBFX01RKSB7CisJCQkJb3BqX21xY19yZXNldHN0YXRlcyhtcWMpOworCQkJCW9wal9tcWNfc2V0c3RhdGUobXFjLCBUMV9DVFhOT19VTkksIDAsIDQ2KTsKKwkJCQlvcGpfbXFjX3NldHN0YXRlKG1xYywgVDFfQ1RYTk9fQUdHLCAwLCAzKTsKKwkJCQlvcGpfbXFjX3NldHN0YXRlKG1xYywgVDFfQ1RYTk9fWkMsIDAsIDQpOworCQkJfQorCQkJaWYgKCsrcGFzc3R5cGUgPT0gMykgeworCQkJCXBhc3N0eXBlID0gMDsKKwkJCQlicG5vX3BsdXNfb25lLS07CisJCQl9CisJCX0KKwl9CisgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCisKKworCitPUEpfQk9PTCBvcGpfdDFfZW5jb2RlX2NibGtzKCAgIG9wal90MV90ICp0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlX3QgKnRpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y3BfdCAqdGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUEpfRkxPQVQ2NCAqIG1jdF9ub3JtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBtY3RfbnVtY29tcHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworCU9QSl9VSU5UMzIgY29tcG5vLCByZXNubywgYmFuZG5vLCBwcmVjbm8sIGNibGtubzsKKworCXRpbGUtPmRpc3RvdGlsZSA9IDA7CQkvKiBmaXhlZF9xdWFsaXR5ICovCisKKwlmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHRpbGUtPm51bWNvbXBzOyArK2NvbXBubykgeworCQlvcGpfdGNkX3RpbGVjb21wX3QqIHRpbGVjID0gJnRpbGUtPmNvbXBzW2NvbXBub107CisJCW9wal90Y2NwX3QqIHRjY3AgPSAmdGNwLT50Y2Nwc1tjb21wbm9dOworCQlPUEpfVUlOVDMyIHRpbGVfdyA9IChPUEpfVUlOVDMyKSh0aWxlYy0+eDEgLSB0aWxlYy0+eDApOworCisJCWZvciAocmVzbm8gPSAwOyByZXNubyA8IHRpbGVjLT5udW1yZXNvbHV0aW9uczsgKytyZXNubykgeworCQkJb3BqX3RjZF9yZXNvbHV0aW9uX3QgKnJlcyA9ICZ0aWxlYy0+cmVzb2x1dGlvbnNbcmVzbm9dOworCisJCQlmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IHJlcy0+bnVtYmFuZHM7ICsrYmFuZG5vKSB7CisJCQkJb3BqX3RjZF9iYW5kX3QqIHJlc3RyaWN0IGJhbmQgPSAmcmVzLT5iYW5kc1tiYW5kbm9dOworICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBiYW5kY29uc3QgPSA4MTkyICogODE5MiAvICgoT1BKX0lOVDMyKSBmbG9vcihiYW5kLT5zdGVwc2l6ZSAqIDgxOTIpKTsKKworCQkJCWZvciAocHJlY25vID0gMDsgcHJlY25vIDwgcmVzLT5wdyAqIHJlcy0+cGg7ICsrcHJlY25vKSB7CisJCQkJCW9wal90Y2RfcHJlY2luY3RfdCAqcHJjID0gJmJhbmQtPnByZWNpbmN0c1twcmVjbm9dOworCisJCQkJCWZvciAoY2Jsa25vID0gMDsgY2Jsa25vIDwgcHJjLT5jdyAqIHByYy0+Y2g7ICsrY2Jsa25vKSB7CisJCQkJCQlvcGpfdGNkX2NibGtfZW5jX3QqIGNibGsgPSAmcHJjLT5jYmxrcy5lbmNbY2Jsa25vXTsKKwkJCQkJCU9QSl9JTlQzMiogcmVzdHJpY3QgdGlsZWRwOworCQkJCQkJT1BKX1VJTlQzMiBjYmxrX3c7CisJCQkJCQlPUEpfVUlOVDMyIGNibGtfaDsKKwkJCQkJCU9QSl9VSU5UMzIgaSwgaiwgdGlsZUluZGV4PTAsIHRpbGVMaW5lQWR2YW5jZTsKKworCQkJCQkJT1BKX0lOVDMyIHggPSBjYmxrLT54MCAtIGJhbmQtPngwOworCQkJCQkJT1BKX0lOVDMyIHkgPSBjYmxrLT55MCAtIGJhbmQtPnkwOworCQkJCQkJaWYgKGJhbmQtPmJhbmRubyAmIDEpIHsKKwkJCQkJCQlvcGpfdGNkX3Jlc29sdXRpb25fdCAqcHJlcyA9ICZ0aWxlYy0+cmVzb2x1dGlvbnNbcmVzbm8gLSAxXTsKKwkJCQkJCQl4ICs9IHByZXMtPngxIC0gcHJlcy0+eDA7CisJCQkJCQl9CisJCQkJCQlpZiAoYmFuZC0+YmFuZG5vICYgMikgeworCQkJCQkJCW9wal90Y2RfcmVzb2x1dGlvbl90ICpwcmVzID0gJnRpbGVjLT5yZXNvbHV0aW9uc1tyZXNubyAtIDFdOworCQkJCQkJCXkgKz0gcHJlcy0+eTEgLSBwcmVzLT55MDsKKwkJCQkJCX0KKworCQkJCQkJaWYoIW9wal90MV9hbGxvY2F0ZV9idWZmZXJzKAorCQkJCQkJCQkJdDEsCisJCQkJCQkJCQkoT1BKX1VJTlQzMikoY2Jsay0+eDEgLSBjYmxrLT54MCksCisJCQkJCQkJCQkoT1BKX1VJTlQzMikoY2Jsay0+eTEgLSBjYmxrLT55MCkpKQorCQkJCQkJeworCQkJCQkJCXJldHVybiBPUEpfRkFMU0U7CisJCQkJCQl9CisKKwkJCQkJCWNibGtfdyA9IHQxLT53OworCQkJCQkJY2Jsa19oID0gdDEtPmg7CisJCQkJCQl0aWxlTGluZUFkdmFuY2UgPSB0aWxlX3cgLSBjYmxrX3c7CisKKwkJCQkJCXRpbGVkcD0mdGlsZWMtPmRhdGFbKE9QSl9VSU5UMzIpeSAqIHRpbGVfdyArIChPUEpfVUlOVDMyKXhdOworCQkJCQkJdDEtPmRhdGEgPSB0aWxlZHA7CisJCQkJCQl0MS0+ZGF0YV9zdHJpZGUgPSB0aWxlX3c7CisJCQkJCQlpZiAodGNjcC0+cW1mYmlkID09IDEpIHsKKwkJCQkJCQlmb3IgKGogPSAwOyBqIDwgY2Jsa19oOyArK2opIHsKKwkJCQkJCQkJZm9yIChpID0gMDsgaSA8IGNibGtfdzsgKytpKSB7CisJCQkJCQkJCQl0aWxlZHBbdGlsZUluZGV4XSA8PD0gVDFfTk1TRURFQ19GUkFDQklUUzsKKwkJCQkJCQkJCXRpbGVJbmRleCsrOworCQkJCQkJCQl9CisJCQkJCQkJCXRpbGVJbmRleCArPSB0aWxlTGluZUFkdmFuY2U7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsJCS8qIGlmICh0Y2NwLT5xbWZiaWQgPT0gMCkgKi8KKwkJCQkJCQlmb3IgKGogPSAwOyBqIDwgY2Jsa19oOyArK2opIHsKKwkJCQkJCQkJZm9yIChpID0gMDsgaSA8IGNibGtfdzsgKytpKSB7CisJCQkJCQkJCQlPUEpfSU5UMzIgdG1wID0gdGlsZWRwW3RpbGVJbmRleF07CisJCQkJCQkJCQl0aWxlZHBbdGlsZUluZGV4XSA9CisJCQkJCQkJCQkJb3BqX2ludF9maXhfbXVsX3QxKAorCQkJCQkJCQkJCXRtcCwKKwkJCQkJCQkJCQliYW5kY29uc3QpOworCQkJCQkJCQkJdGlsZUluZGV4Kys7CisJCQkJCQkJCX0KKwkJCQkJCQkJdGlsZUluZGV4ICs9IHRpbGVMaW5lQWR2YW5jZTsKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCW9wal90MV9lbmNvZGVfY2JsaygKKwkJCQkJCQkJdDEsCisJCQkJCQkJCWNibGssCisJCQkJCQkJCWJhbmQtPmJhbmRubywKKwkJCQkJCQkJY29tcG5vLAorCQkJCQkJCQl0aWxlYy0+bnVtcmVzb2x1dGlvbnMgLSAxIC0gcmVzbm8sCisJCQkJCQkJCXRjY3AtPnFtZmJpZCwKKwkJCQkJCQkJYmFuZC0+c3RlcHNpemUsCisJCQkJCQkJCXRjY3AtPmNibGtzdHksCisJCQkJCQkJCXRpbGUtPm51bWNvbXBzLAorCQkJCQkJCQl0aWxlLAorCQkJCQkJCQltY3Rfbm9ybXMsCisJCQkJCQkJCW1jdF9udW1jb21wcyk7CisKKwkJCQkJfSAvKiBjYmxrbm8gKi8KKwkJCQl9IC8qIHByZWNubyAqLworCQkJfSAvKiBiYW5kbm8gKi8KKwkJfSAvKiByZXNubyAgKi8KKwl9IC8qIGNvbXBubyAgKi8KKwlyZXR1cm4gT1BKX1RSVUU7Cit9CisKKy8qKiBtb2QgZml4ZWRfcXVhbGl0eSAqLworc3RhdGljIHZvaWQgb3BqX3QxX2VuY29kZV9jYmxrKG9wal90MV90ICp0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfY2Jsa19lbmNfdCogY2JsaywKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgb3JpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBjb21wbm8sCisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBxbWZiaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQ2NCBzdGVwc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgY2Jsa3N0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbnVtY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVfdCAqIHRpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUEpfRkxPQVQ2NCAqIG1jdF9ub3JtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbWN0X251bWNvbXBzKQoreworCU9QSl9GTE9BVDY0IGN1bXdtc2VkZWMgPSAwLjA7CisKKwlvcGpfbXFjX3QgKm1xYyA9IHQxLT5tcWM7CS8qIE1RQyBjb21wb25lbnQgKi8KKworCU9QSl9VSU5UMzIgcGFzc25vOworCU9QSl9JTlQzMiBicG5vOworCU9QSl9VSU5UMzIgcGFzc3R5cGU7CisJT1BKX0lOVDMyIG5tc2VkZWMgPSAwOworCU9QSl9JTlQzMiBtYXg7CisJT1BKX1VJTlQzMiBpLCBqOworCU9QSl9CWVRFIHR5cGUgPSBUMV9UWVBFX01ROworCU9QSl9GTE9BVDY0IHRlbXB3bXNlZGVjOworCisJbWF4ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgdDEtPnc7ICsraSkgeworCQlmb3IgKGogPSAwOyBqIDwgdDEtPmg7ICsraikgeworCQkJT1BKX0lOVDMyIHRtcCA9IGFicyh0MS0+ZGF0YVtpICsgaip0MS0+ZGF0YV9zdHJpZGVdKTsKKwkJCW1heCA9IG9wal9pbnRfbWF4KG1heCwgdG1wKTsKKwkJfQorCX0KKworCWNibGstPm51bWJwcyA9IG1heCA/IChPUEpfVUlOVDMyKSgob3BqX2ludF9mbG9vcmxvZzIobWF4KSArIDEpIC0gVDFfTk1TRURFQ19GUkFDQklUUykgOiAwOworCisJYnBubyA9IChPUEpfSU5UMzIpKGNibGstPm51bWJwcyAtIDEpOworCXBhc3N0eXBlID0gMjsKKworCW9wal9tcWNfcmVzZXRzdGF0ZXMobXFjKTsKKwlvcGpfbXFjX3NldHN0YXRlKG1xYywgVDFfQ1RYTk9fVU5JLCAwLCA0Nik7CisJb3BqX21xY19zZXRzdGF0ZShtcWMsIFQxX0NUWE5PX0FHRywgMCwgMyk7CisJb3BqX21xY19zZXRzdGF0ZShtcWMsIFQxX0NUWE5PX1pDLCAwLCA0KTsKKwlvcGpfbXFjX2luaXRfZW5jKG1xYywgY2Jsay0+ZGF0YSk7CisKKwlmb3IgKHBhc3NubyA9IDA7IGJwbm8gPj0gMDsgKytwYXNzbm8pIHsKKwkJb3BqX3RjZF9wYXNzX3QgKnBhc3MgPSAmY2Jsay0+cGFzc2VzW3Bhc3Nub107CisJCU9QSl9VSU5UMzIgY29ycmVjdGlvbiA9IDM7CisJCXR5cGUgPSAoKGJwbm8gPCAoKE9QSl9JTlQzMikgKGNibGstPm51bWJwcykgLSA0KSkgJiYgKHBhc3N0eXBlIDwgMikgJiYgKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfTEFaWSkpID8gVDFfVFlQRV9SQVcgOiBUMV9UWVBFX01ROworCisJCXN3aXRjaCAocGFzc3R5cGUpIHsKKwkJCWNhc2UgMDoKKwkJCQlvcGpfdDFfZW5jX3NpZ3Bhc3ModDEsIGJwbm8sIG9yaWVudCwgJm5tc2VkZWMsIHR5cGUsIGNibGtzdHkpOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCW9wal90MV9lbmNfcmVmcGFzcyh0MSwgYnBubywgJm5tc2VkZWMsIHR5cGUsIGNibGtzdHkpOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCW9wal90MV9lbmNfY2xucGFzcyh0MSwgYnBubywgb3JpZW50LCAmbm1zZWRlYywgY2Jsa3N0eSk7CisJCQkJLyogY29kZSBzd2l0Y2ggU0VHTUFSSyAoaS5lLiBTRUdTWU0pICovCisJCQkJaWYgKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfU0VHU1lNKQorCQkJCQlvcGpfbXFjX3NlZ21hcmtfZW5jKG1xYyk7CisJCQkJYnJlYWs7CisJCX0KKworCQkvKiBmaXhlZF9xdWFsaXR5ICovCisJCXRlbXB3bXNlZGVjID0gb3BqX3QxX2dldHdtc2VkZWMobm1zZWRlYywgY29tcG5vLCBsZXZlbCwgb3JpZW50LCBicG5vLCBxbWZiaWQsIHN0ZXBzaXplLCBudW1jb21wcyxtY3Rfbm9ybXMsIG1jdF9udW1jb21wcykgOworCQljdW13bXNlZGVjICs9IHRlbXB3bXNlZGVjOworCQl0aWxlLT5kaXN0b3RpbGUgKz0gdGVtcHdtc2VkZWM7CisKKwkJLyogQ29kZSBzd2l0Y2ggIlJFU1RBUlQiIChpLmUuIFRFUk1BTEwpICovCisJCWlmICgoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9URVJNQUxMKQkmJiAhKChwYXNzdHlwZSA9PSAyKSAmJiAoYnBubyAtIDEgPCAwKSkpIHsKKwkJCWlmICh0eXBlID09IFQxX1RZUEVfUkFXKSB7CisJCQkJb3BqX21xY19mbHVzaChtcWMpOworCQkJCWNvcnJlY3Rpb24gPSAxOworCQkJCS8qIGNvcnJlY3Rpb24gPSBtcWNfYnlwYXNzX2ZsdXNoX2VuYygpOyAqLworCQkJfSBlbHNlIHsJCQkvKiBjb3JyZWN0aW9uID0gbXFjX3Jlc3RhcnRfZW5jKCk7ICovCisJCQkJb3BqX21xY19mbHVzaChtcWMpOworCQkJCWNvcnJlY3Rpb24gPSAxOworCQkJfQorCQkJcGFzcy0+dGVybSA9IDE7CisJCX0gZWxzZSB7CisJCQlpZiAoKChicG5vIDwgKChPUEpfSU5UMzIpIChjYmxrLT5udW1icHMpIC0gNCkgJiYgKHBhc3N0eXBlID4gMCkpCisJCQkJfHwgKChicG5vID09ICgoT1BKX0lOVDMyKWNibGstPm51bWJwcyAtIDQpKSAmJiAocGFzc3R5cGUgPT0gMikpKSAmJiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9MQVpZKSkgeworCQkJCWlmICh0eXBlID09IFQxX1RZUEVfUkFXKSB7CisJCQkJCW9wal9tcWNfZmx1c2gobXFjKTsKKwkJCQkJY29ycmVjdGlvbiA9IDE7CisJCQkJCS8qIGNvcnJlY3Rpb24gPSBtcWNfYnlwYXNzX2ZsdXNoX2VuYygpOyAqLworCQkJCX0gZWxzZSB7CQkvKiBjb3JyZWN0aW9uID0gbXFjX3Jlc3RhcnRfZW5jKCk7ICovCisJCQkJCW9wal9tcWNfZmx1c2gobXFjKTsKKwkJCQkJY29ycmVjdGlvbiA9IDE7CisJCQkJfQorCQkJCXBhc3MtPnRlcm0gPSAxOworCQkJfSBlbHNlIHsKKwkJCQlwYXNzLT50ZXJtID0gMDsKKwkJCX0KKwkJfQorCisJCWlmICgrK3Bhc3N0eXBlID09IDMpIHsKKwkJCXBhc3N0eXBlID0gMDsKKwkJCWJwbm8tLTsKKwkJfQorCisJCWlmIChwYXNzLT50ZXJtICYmIGJwbm8gPiAwKSB7CisJCQl0eXBlID0gKChicG5vIDwgKChPUEpfSU5UMzIpIChjYmxrLT5udW1icHMpIC0gNCkpICYmIChwYXNzdHlwZSA8IDIpICYmIChjYmxrc3R5ICYgSjJLX0NDUF9DQkxLU1RZX0xBWlkpKSA/IFQxX1RZUEVfUkFXIDogVDFfVFlQRV9NUTsKKwkJCWlmICh0eXBlID09IFQxX1RZUEVfUkFXKQorCQkJCW9wal9tcWNfYnlwYXNzX2luaXRfZW5jKG1xYyk7CisJCQllbHNlCisJCQkJb3BqX21xY19yZXN0YXJ0X2luaXRfZW5jKG1xYyk7CisJCX0KKworCQlwYXNzLT5kaXN0b3J0aW9uZGVjID0gY3Vtd21zZWRlYzsKKwkJcGFzcy0+cmF0ZSA9IG9wal9tcWNfbnVtYnl0ZXMobXFjKSArIGNvcnJlY3Rpb247CS8qIEZJWE1FICovCisKKwkJLyogQ29kZS1zd2l0Y2ggIlJFU0VUIiAqLworCQlpZiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9SRVNFVCkKKwkJCW9wal9tcWNfcmVzZXRfZW5jKG1xYyk7CisJfQorCisJLyogQ29kZSBzd2l0Y2ggIkVSVEVSTSIgKGkuZS4gUFRFUk0pICovCisJaWYgKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfUFRFUk0pCisJCW9wal9tcWNfZXJ0ZXJtX2VuYyhtcWMpOworCWVsc2UgLyogRGVmYXVsdCBjb2RpbmcgKi8gaWYgKCEoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9MQVpZKSkKKwkJb3BqX21xY19mbHVzaChtcWMpOworCisJY2Jsay0+dG90YWxwYXNzZXMgPSBwYXNzbm87CisKKwlmb3IgKHBhc3NubyA9IDA7IHBhc3NubzxjYmxrLT50b3RhbHBhc3NlczsgcGFzc25vKyspIHsKKwkJb3BqX3RjZF9wYXNzX3QgKnBhc3MgPSAmY2Jsay0+cGFzc2VzW3Bhc3Nub107CisJCWlmIChwYXNzLT5yYXRlID4gb3BqX21xY19udW1ieXRlcyhtcWMpKQorCQkJcGFzcy0+cmF0ZSA9IG9wal9tcWNfbnVtYnl0ZXMobXFjKTsKKwkJLypQcmV2ZW50aW5nIGdlbmVyYXRpb24gb2YgRkYgYXMgbGFzdCBkYXRhIGJ5dGUgb2YgYSBwYXNzKi8KKwkJaWYoKHBhc3MtPnJhdGU+MSkgJiYgKGNibGstPmRhdGFbcGFzcy0+cmF0ZSAtIDFdID09IDB4RkYpKXsKKwkJCXBhc3MtPnJhdGUtLTsKKwkJfQorCQlwYXNzLT5sZW4gPSBwYXNzLT5yYXRlIC0gKHBhc3NubyA9PSAwID8gMCA6IGNibGstPnBhc3Nlc1twYXNzbm8gLSAxXS5yYXRlKTsKKwl9Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCBvcGpfdDFfZGVjX3JlZnBhc3Nfc3RlcCggICBvcGpfdDFfdCAqdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICpkYXRhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBvc2hhbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBuZWdoYWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHZzYykKK3sKKwlPUEpfSU5UMzIgIHQ7CisJT1BKX1VJTlQzMiB2LGZsYWc7CisKKwlvcGpfbXFjX3QgKm1xYyA9IHQxLT5tcWM7CS8qIE1RQyBjb21wb25lbnQgKi8KKwlvcGpfcmF3X3QgKnJhdyA9IHQxLT5yYXc7CS8qIFJBVyBjb21wb25lbnQgKi8KKworCWZsYWcgPSB2c2MgPyAoKCpmbGFnc3ApICYgKH4oVDFfU0lHX1MgfCBUMV9TSUdfU0UgfCBUMV9TSUdfU1cgfCBUMV9TR05fUykpKSA6ICgqZmxhZ3NwKTsKKwlpZiAoKGZsYWcgJiAoVDFfU0lHIHwgVDFfVklTSVQpKSA9PSBUMV9TSUcpIHsKKwkJb3BqX21xY19zZXRjdXJjdHgobXFjLCBvcGpfdDFfZ2V0Y3R4bm9fbWFnKGZsYWcpKTsJLyogRVNTQUkgKi8KKwkJaWYgKHR5cGUgPT0gVDFfVFlQRV9SQVcpIHsKKwkJCXYgPSBvcGpfcmF3X2RlY29kZShyYXcpOworCQl9IGVsc2UgeworCQkJdiA9IG9wal9tcWNfZGVjb2RlKG1xYyk7CisJCX0KKwkJdCA9IHYgPyBwb3NoYWxmIDogbmVnaGFsZjsKKwkJKmRhdGFwICs9ICpkYXRhcCA8IDAgPyAtdCA6IHQ7CisJCSpmbGFnc3AgfD0gVDFfUkVGSU5FOworCX0KK30JCQkJLyogVlNDIGFuZCAgQllQQVNTIGJ5IEFudG9uaW4gICovCisjZW5kaWYKKworCisKKyNpZiAwCitzdGF0aWMgdm9pZCBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcCggICBvcGpfdDFfdCAqdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICpkYXRhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBvcmllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvbmVwbHVzaGFsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB2c2MpCit7CisJT1BKX1VJTlQzMiB2LCBmbGFnOworCisJb3BqX3Jhd190ICpyYXcgPSB0MS0+cmF3OwkvKiBSQVcgY29tcG9uZW50ICovCisJb3BqX21xY190ICptcWMgPSB0MS0+bXFjOwkvKiBNUUMgY29tcG9uZW50ICovCisKKwlmbGFnID0gdnNjID8gKCgqZmxhZ3NwKSAmICh+KFQxX1NJR19TIHwgVDFfU0lHX1NFIHwgVDFfU0lHX1NXIHwgVDFfU0dOX1MpKSkgOiAoKmZsYWdzcCk7CisJaWYgKChmbGFnICYgVDFfU0lHX09USCkgJiYgIShmbGFnICYgKFQxX1NJRyB8IFQxX1ZJU0lUKSkpIHsKKwkJaWYgKHR5cGUgPT0gVDFfVFlQRV9SQVcpIHsKKwkJCWlmIChvcGpfcmF3X2RlY29kZShyYXcpKSB7CisJCQkJdiA9IG9wal9yYXdfZGVjb2RlKHJhdyk7CS8qIEVTU0FJICovCisJCQkJKmRhdGFwID0gdiA/IC1vbmVwbHVzaGFsZiA6IG9uZXBsdXNoYWxmOworCQkJCW9wal90MV91cGRhdGVmbGFncyhmbGFnc3AsIHYsIHQxLT5mbGFnc19zdHJpZGUpOworCQkJfQorCQl9IGVsc2UgeworCQkJb3BqX21xY19zZXRjdXJjdHgobXFjLCBvcGpfdDFfZ2V0Y3R4bm9femMoZmxhZywgb3JpZW50KSk7CisJCQlpZiAob3BqX21xY19kZWNvZGUobXFjKSkgeworCQkJCW9wal9tcWNfc2V0Y3VyY3R4KG1xYywgb3BqX3QxX2dldGN0eG5vX3NjKGZsYWcpKTsKKwkJCQl2ID0gb3BqX21xY19kZWNvZGUobXFjKSBeIG9wal90MV9nZXRzcGIoZmxhZyk7CisJCQkJKmRhdGFwID0gdiA/IC1vbmVwbHVzaGFsZiA6IG9uZXBsdXNoYWxmOworCQkJCW9wal90MV91cGRhdGVmbGFncyhmbGFnc3AsIHYsIHQxLT5mbGFnc19zdHJpZGUpOworCQkJfQorCQl9CisJCSpmbGFnc3AgfD0gVDFfVklTSVQ7CisJfQorfQkJCQkvKiBWU0MgYW5kICBCWVBBU1MgYnkgQW50b25pbiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvdDEuaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdDEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL3QxLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdDEuaApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL3QxX2dlbmVyYXRlX2x1dHMuYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdDFfZ2VuZXJhdGVfbHV0cy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvdDFfZ2VuZXJhdGVfbHV0cy5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3QxX2dlbmVyYXRlX2x1dHMuYwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF9saWJvcGVuanBlZy9saWJvcGVuanBlZzIwL3QxX2x1dHMuaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdDFfbHV0cy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2Z4X2xpYm9wZW5qcGVnL2xpYm9wZW5qcGVnMjAvdDFfbHV0cy5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3QxX2x1dHMuaApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90Mi5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZjFhNjkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3QyLmMKQEAgLTAsMCArMSwxMzgxIEBACisvKgorICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCisgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFVuaXZlcnNpdGUgY2F0aG9saXF1ZSBkZSBMb3V2YWluIChVQ0wpLCBCZWxnaXVtCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQorICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZSIAorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDUyBTeXN0ZW1lcyBkJ0luZm9ybWF0aW9uLCBGcmFuY2UKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgQVMgSVMnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIm9wal9pbmNsdWRlcy5oIgorCisvKiogQGRlZmdyb3VwIFQyIFQyIC0gSW1wbGVtZW50YXRpb24gb2YgYSB0aWVyLTIgY29kaW5nICovCisvKkB7Ki8KKworLyoqIEBuYW1lIExvY2FsIHN0YXRpYyBmdW5jdGlvbnMgKi8KKy8qQHsqLworCitzdGF0aWMgdm9pZCBvcGpfdDJfcHV0Y29tbWFjb2RlKG9wal9iaW9fdCAqYmlvLCBPUEpfSU5UMzIgbik7CisKK3N0YXRpYyBPUEpfVUlOVDMyIG9wal90Ml9nZXRjb21tYWNvZGUob3BqX2Jpb190ICpiaW8pOyAKKy8qKgorVmFyaWFibGUgbGVuZ3RoIGNvZGUgZm9yIHNpZ25hbGxpbmcgZGVsdGEgWmlsICh0cnVuY2F0aW9uIHBvaW50KQorQHBhcmFtIGJpbyAgQml0IElucHV0L091dHB1dCBjb21wb25lbnQKK0BwYXJhbSBuICAgIGRlbHRhIFppbAorKi8KK3N0YXRpYyB2b2lkIG9wal90Ml9wdXRudW1wYXNzZXMob3BqX2Jpb190ICpiaW8sIE9QSl9VSU5UMzIgbik7CitzdGF0aWMgT1BKX1VJTlQzMiBvcGpfdDJfZ2V0bnVtcGFzc2VzKG9wal9iaW9fdCAqYmlvKTsKKworLyoqCitFbmNvZGUgYSBwYWNrZXQgb2YgYSB0aWxlIHRvIGEgZGVzdGluYXRpb24gYnVmZmVyCitAcGFyYW0gdGlsZW5vIE51bWJlciBvZiB0aGUgdGlsZSBlbmNvZGVkCitAcGFyYW0gdGlsZSBUaWxlIGZvciB3aGljaCB0byB3cml0ZSB0aGUgcGFja2V0cworQHBhcmFtIHRjcCBUaWxlIGNvZGluZyBwYXJhbWV0ZXJzCitAcGFyYW0gcGkgUGFja2V0IGlkZW50aXR5CitAcGFyYW0gZGVzdCBEZXN0aW5hdGlvbiBidWZmZXIKK0BwYXJhbSBwX2RhdGFfd3JpdHRlbiAgIEZJWE1FIERPQworQHBhcmFtIGxlbiBMZW5ndGggb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorQHBhcmFtIGNzdHJfaW5mbyBDb2Rlc3RyZWFtIGluZm9ybWF0aW9uIHN0cnVjdHVyZQorQHJldHVybgorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfdDJfZW5jb2RlX3BhY2tldCggICBPUEpfVUlOVDMyIHRpbGVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVfdCAqdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNwX3QgKnRjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfaXRlcmF0b3JfdCAqcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZm9fdCAqY3N0cl9pbmZvKTsKKworLyoqCitEZWNvZGUgYSBwYWNrZXQgb2YgYSB0aWxlIGZyb20gYSBzb3VyY2UgYnVmZmVyCitAcGFyYW0gdDIgVDIgaGFuZGxlCitAcGFyYW0gdGlsZSBUaWxlIGZvciB3aGljaCB0byB3cml0ZSB0aGUgcGFja2V0cworQHBhcmFtIHRjcCBUaWxlIGNvZGluZyBwYXJhbWV0ZXJzCitAcGFyYW0gcGkgUGFja2V0IGlkZW50aXR5CitAcGFyYW0gc3JjIFNvdXJjZSBidWZmZXIKK0BwYXJhbSBkYXRhX3JlYWQgICBGSVhNRSBET0MKK0BwYXJhbSBtYXhfbGVuZ3RoICBGSVhNRSBET0MKK0BwYXJhbSBwYWNrX2luZm8gUGFja2V0IGluZm9ybWF0aW9uCisKK0ByZXR1cm4gIEZJWE1FIERPQworKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfdDJfZGVjb2RlX3BhY2tldCggICBvcGpfdDJfdCogdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlX3QgKnRpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjcF90ICp0Y3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2l0ZXJhdG9yX3QgKnBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIGRhdGFfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG1heF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BhY2tldF9pbmZvX3QgKnBhY2tfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcik7CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdDJfc2tpcF9wYWNrZXQoIG9wal90Ml90KiBwX3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlX3QgKnBfdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y3BfdCAqcF90Y3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfaXRlcmF0b3JfdCAqcF9waSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpwX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BhY2tldF9pbmZvX3QgKnBfcGFja19pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIpOworCitzdGF0aWMgT1BKX0JPT0wgb3BqX3QyX3JlYWRfcGFja2V0X2hlYWRlciggIG9wal90Ml90KiBwX3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVfdCAqcF90aWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNwX3QgKnBfdGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfaXRlcmF0b3JfdCAqcF9waSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JPT0wgKiBwX2lzX2RhdGFfcHJlc2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKnBfc3JjX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9wYWNrZXRfaW5mb190ICpwX3BhY2tfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIpOworCitzdGF0aWMgT1BKX0JPT0wgb3BqX3QyX3JlYWRfcGFja2V0X2RhdGEob3BqX3QyX3QqIHBfdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlX3QgKnBfdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfaXRlcmF0b3JfdCAqcF9waSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqcF9zcmNfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BhY2tldF9pbmZvX3QgKnBhY2tfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcik7CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdDJfc2tpcF9wYWNrZXRfZGF0YShvcGpfdDJfdCogcF90MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVfdCAqcF90aWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9waV9pdGVyYXRvcl90ICpwX3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGFja2V0X2luZm9fdCAqcGFja19pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyKTsKKworLyoqCitAcGFyYW0gY2JsaworQHBhcmFtIGluZGV4CitAcGFyYW0gY2Jsa3N0eQorQHBhcmFtIGZpcnN0CisqLworc3RhdGljIE9QSl9CT09MIG9wal90Ml9pbml0X3NlZyggICAgb3BqX3RjZF9jYmxrX2RlY190KiBjYmxrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgY2Jsa3N0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgZmlyc3QpOworCisvKkB9Ki8KKworLypAfSovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qICNkZWZpbmUgUkVTVEFSVCAweDA0ICovCitzdGF0aWMgdm9pZCBvcGpfdDJfcHV0Y29tbWFjb2RlKG9wal9iaW9fdCAqYmlvLCBPUEpfSU5UMzIgbikgeworICAgICAgICB3aGlsZSAoLS1uID49IDApIHsKKyAgICAgICAgICAgICAgICBvcGpfYmlvX3dyaXRlKGJpbywgMSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgb3BqX2Jpb193cml0ZShiaW8sIDAsIDEpOworfQorCitzdGF0aWMgT1BKX1VJTlQzMiBvcGpfdDJfZ2V0Y29tbWFjb2RlKG9wal9iaW9fdCAqYmlvKQoreworICAgIE9QSl9VSU5UMzIgbiA9IDA7CisgICAgd2hpbGUgKG9wal9iaW9fcmVhZChiaW8sIDEpKSB7CisJICAgICsrbjsKKyAgICB9CisgICAgcmV0dXJuIG47Cit9CisKK3N0YXRpYyB2b2lkIG9wal90Ml9wdXRudW1wYXNzZXMob3BqX2Jpb190ICpiaW8sIE9QSl9VSU5UMzIgbikgeworICAgICAgICBpZiAobiA9PSAxKSB7CisgICAgICAgICAgICAgICAgb3BqX2Jpb193cml0ZShiaW8sIDAsIDEpOworICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMikgeworICAgICAgICAgICAgICAgIG9wal9iaW9fd3JpdGUoYmlvLCAyLCAyKTsKKyAgICAgICAgfSBlbHNlIGlmIChuIDw9IDUpIHsKKyAgICAgICAgICAgICAgICBvcGpfYmlvX3dyaXRlKGJpbywgMHhjIHwgKG4gLSAzKSwgNCk7CisgICAgICAgIH0gZWxzZSBpZiAobiA8PSAzNikgeworICAgICAgICAgICAgICAgIG9wal9iaW9fd3JpdGUoYmlvLCAweDFlMCB8IChuIC0gNiksIDkpOworICAgICAgICB9IGVsc2UgaWYgKG4gPD0gMTY0KSB7CisgICAgICAgICAgICAgICAgb3BqX2Jpb193cml0ZShiaW8sIDB4ZmY4MCB8IChuIC0gMzcpLCAxNik7CisgICAgICAgIH0KK30KKworc3RhdGljIE9QSl9VSU5UMzIgb3BqX3QyX2dldG51bXBhc3NlcyhvcGpfYmlvX3QgKmJpbykgeworICAgICAgICBPUEpfVUlOVDMyIG47CisgICAgICAgIGlmICghb3BqX2Jpb19yZWFkKGJpbywgMSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGlmICghb3BqX2Jpb19yZWFkKGJpbywgMSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIGlmICgobiA9IG9wal9iaW9fcmVhZChiaW8sIDIpKSAhPSAzKQorICAgICAgICAgICAgICAgIHJldHVybiAoMyArIG4pOworICAgICAgICBpZiAoKG4gPSBvcGpfYmlvX3JlYWQoYmlvLCA1KSkgIT0gMzEpCisgICAgICAgICAgICAgICAgcmV0dXJuICg2ICsgbik7CisgICAgICAgIHJldHVybiAoMzcgKyBvcGpfYmlvX3JlYWQoYmlvLCA3KSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK09QSl9CT09MIG9wal90Ml9lbmNvZGVfcGFja2V0cyggb3BqX3QyX3QqIHBfdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVfdCAqcF90aWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4bGF5ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqcF9kZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmZvX3QgKmNzdHJfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RwX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfdHBfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfcGlubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSjJLX1QyX01PREUgcF90Ml9tb2RlKQoreworICAgICAgICBPUEpfQllURSAqbF9jdXJyZW50X2RhdGEgPSBwX2Rlc3Q7CisgICAgICAgIE9QSl9VSU5UMzIgbF9uYl9ieXRlcyA9IDA7CisgICAgICAgIE9QSl9VSU5UMzIgY29tcG5vOworICAgICAgICBPUEpfVUlOVDMyIHBvYzsKKyAgICAgICAgb3BqX3BpX2l0ZXJhdG9yX3QgKmxfcGkgPSAwMDsKKyAgICAgICAgb3BqX3BpX2l0ZXJhdG9yX3QgKmxfY3VycmVudF9waSA9IDAwOworICAgICAgICBvcGpfaW1hZ2VfdCAqbF9pbWFnZSA9IHBfdDItPmltYWdlOworICAgICAgICBvcGpfY3BfdCAqbF9jcCA9IHBfdDItPmNwOworICAgICAgICBvcGpfdGNwX3QgKmxfdGNwID0gJmxfY3AtPnRjcHNbcF90aWxlX25vXTsKKyAgICAgICAgT1BKX1VJTlQzMiBwb2NubyA9IChsX2NwLT5yc2l6ID09IE9QSl9QUk9GSUxFX0NJTkVNQV80Syk/IDI6IDE7CisgICAgICAgIE9QSl9VSU5UMzIgbF9tYXhfY29tcCA9IGxfY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9tYXhfY29tcF9zaXplID4gMCA/IGxfaW1hZ2UtPm51bWNvbXBzIDogMTsKKyAgICAgICAgT1BKX1VJTlQzMiBsX25iX3BvY3MgPSBsX3RjcC0+bnVtcG9jcyArIDE7CisKKyAgICAgICAgbF9waSA9IG9wal9waV9pbml0aWFsaXNlX2VuY29kZShsX2ltYWdlLCBsX2NwLCBwX3RpbGVfbm8sIHBfdDJfbW9kZSk7CisgICAgICAgIGlmICghbF9waSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICAqIHBfZGF0YV93cml0dGVuID0gMDsKKworICAgICAgICBpZiAocF90Ml9tb2RlID09IFRIUkVTSF9DQUxDICl7IC8qIENhbGN1bGF0aW5nIHRocmVzaG9sZCAqLworICAgICAgICAgICAgICAgIGxfY3VycmVudF9waSA9IGxfcGk7CisKKyAgICAgICAgICAgICAgICBmb3IgICAgIChjb21wbm8gPSAwOyBjb21wbm8gPCBsX21heF9jb21wOyArK2NvbXBubykgeworICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsX2NvbXBfbGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9waSA9IGxfcGk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocG9jID0gMDsgcG9jIDwgcG9jbm8gOyArK3BvYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxfdHBfbnVtID0gY29tcG5vOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gTVNEIDogY2hlY2sgd2h5IHRoaXMgZnVuY3Rpb24gY2Fubm90IGZhaWwgKGNmLiB2MSkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2NyZWF0ZV9lbmNvZGUobF9waSwgbF9jcCxwX3RpbGVfbm8scG9jLGxfdHBfbnVtLHBfdHBfcG9zLHBfdDJfbW9kZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfY3VycmVudF9waS0+cG9jLnByZyA9PSBPUEpfUFJPR19VTktOT1dOKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPIEFERSA6IGFkZCBhbiBlcnJvciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2Rlc3Ryb3kobF9waSwgbF9uYl9wb2NzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG9wal9waV9uZXh0KGxfY3VycmVudF9waSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9jdXJyZW50X3BpLT5sYXlubyA8IHBfbWF4bGF5ZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX25iX2J5dGVzID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgb3BqX3QyX2VuY29kZV9wYWNrZXQocF90aWxlX25vLHBfdGlsZSwgbF90Y3AsIGxfY3VycmVudF9waSwgbF9jdXJyZW50X2RhdGEsICZsX25iX2J5dGVzLCBwX21heF9sZW4sIGNzdHJfaW5mbykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2Rlc3Ryb3kobF9waSwgbF9uYl9wb2NzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jb21wX2xlbiArPSBsX25iX2J5dGVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gbF9uYl9ieXRlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWF4X2xlbiAtPSBsX25iX2J5dGVzOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBfZGF0YV93cml0dGVuICs9IGxfbmJfYnl0ZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9tYXhfY29tcF9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfY29tcF9sZW4gPiBsX2NwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fbWF4X2NvbXBfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2Rlc3Ryb3kobF9waSwgbF9uYl9wb2NzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX2N1cnJlbnRfcGk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeyAgLyogdDJfbW9kZSA9PSBGSU5BTF9QQVNTICAqLworICAgICAgICAgICAgICAgIG9wal9waV9jcmVhdGVfZW5jb2RlKGxfcGksIGxfY3AscF90aWxlX25vLHBfcGlubyxwX3RwX251bSxwX3RwX3BvcyxwX3QyX21vZGUpOworCisgICAgICAgICAgICAgICAgbF9jdXJyZW50X3BpID0gJmxfcGlbcF9waW5vXTsKKyAgICAgICAgICAgICAgICBpZiAobF9jdXJyZW50X3BpLT5wb2MucHJnID09IE9QSl9QUk9HX1VOS05PV04pIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVE9ETyBBREUgOiBhZGQgYW4gZXJyb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2Rlc3Ryb3kobF9waSwgbF9uYl9wb2NzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKG9wal9waV9uZXh0KGxfY3VycmVudF9waSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2N1cnJlbnRfcGktPmxheW5vIDwgcF9tYXhsYXllcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9uYl9ieXRlcz0wOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG9wal90Ml9lbmNvZGVfcGFja2V0KHBfdGlsZV9ubyxwX3RpbGUsIGxfdGNwLCBsX2N1cnJlbnRfcGksIGxfY3VycmVudF9kYXRhLCAmbF9uYl9ieXRlcywgcF9tYXhfbGVuLCBjc3RyX2luZm8pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2Rlc3Ryb3kobF9waSwgbF9uYl9wb2NzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gbF9uYl9ieXRlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYXhfbGVuIC09IGxfbmJfYnl0ZXM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwX2RhdGFfd3JpdHRlbiArPSBsX25iX2J5dGVzOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElOREVYID4+ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNzdHJfaW5mbykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNzdHJfaW5mby0+aW5kZXhfd3JpdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90aWxlX2luZm9fdCAqaW5mb19UTCA9ICZjc3RyX2luZm8tPnRpbGVbcF90aWxlX25vXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9wYWNrZXRfaW5mb190ICppbmZvX1BLID0gJmluZm9fVEwtPnBhY2tldFtjc3RyX2luZm8tPnBhY2tub107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNzdHJfaW5mby0+cGFja25vKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fUEstPnN0YXJ0X3BvcyA9IGluZm9fVEwtPmVuZF9oZWFkZXIgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19QSy0+c3RhcnRfcG9zID0gKChsX2NwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fdHBfb24gfCBsX3RjcC0+UE9DKSYmIGluZm9fUEstPnN0YXJ0X3BvcykgPyBpbmZvX1BLLT5zdGFydF9wb3MgOiBpbmZvX1RMLT5wYWNrZXRbY3N0cl9pbmZvLT5wYWNrbm8gLSAxXS5lbmRfcG9zICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fUEstPmVuZF9wb3MgPSBpbmZvX1BLLT5zdGFydF9wb3MgKyBsX25iX2J5dGVzIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fUEstPmVuZF9waF9wb3MgKz0gaW5mb19QSy0+c3RhcnRfcG9zIC0gMTsgIC8qIEVuZCBvZiBwYWNrZXQgaGVhZGVyIHdoaWNoIG5vdyBvbmx5IHJlcHJlc2VudHMgdGhlIGRpc3RhbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzdGFydCBvZiBwYWNrZXQgaXMgaW5jcmVtZW50ZWQgYnkgdmFsdWUgb2Ygc3RhcnQgb2YgcGFja2V0Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZm8tPnBhY2tubysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDw8IElOREVYICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrcF90aWxlLT5wYWNrbm87CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3BqX3BpX2Rlc3Ryb3kobF9waSwgbF9uYl9wb2NzKTsKKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKKy8qIHNlZSBpc3N1ZSA4MCAqLworI2lmIDAKKyNkZWZpbmUgSkFTX0ZQUklOVEYgZnByaW50ZgorI2Vsc2UKKy8qIGlzc3VlIDI5MCAqLworc3RhdGljIHZvaWQgb3BqX251bGxfamFzX2ZwcmludGYoRklMRSogZmlsZSwgY29uc3QgY2hhciAqIGZvcm1hdCwgLi4uKQoreworICAodm9pZClmaWxlOworICAodm9pZClmb3JtYXQ7Cit9CisjZGVmaW5lIEpBU19GUFJJTlRGIG9wal9udWxsX2phc19mcHJpbnRmCisjZW5kaWYKKworT1BKX0JPT0wgb3BqX3QyX2RlY29kZV9wYWNrZXRzKCBvcGpfdDJfdCAqcF90MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICpwX3RpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpwX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV9yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NvZGVzdHJlYW1faW5kZXhfdCAqcF9jc3RyX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcikKK3sKKyAgICAgICAgT1BKX0JZVEUgKmxfY3VycmVudF9kYXRhID0gcF9zcmM7CisgICAgICAgIG9wal9waV9pdGVyYXRvcl90ICpsX3BpID0gMDA7CisgICAgICAgIE9QSl9VSU5UMzIgcGlubzsKKyAgICAgICAgb3BqX2ltYWdlX3QgKmxfaW1hZ2UgPSBwX3QyLT5pbWFnZTsKKyAgICAgICAgb3BqX2NwX3QgKmxfY3AgPSBwX3QyLT5jcDsKKyAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9ICYocF90Mi0+Y3AtPnRjcHNbcF90aWxlX25vXSk7CisgICAgICAgIE9QSl9VSU5UMzIgbF9uYl9ieXRlc19yZWFkOworICAgICAgICBPUEpfVUlOVDMyIGxfbmJfcG9jcyA9IGxfdGNwLT5udW1wb2NzICsgMTsKKyAgICAgICAgb3BqX3BpX2l0ZXJhdG9yX3QgKmxfY3VycmVudF9waSA9IDAwOworI2lmZGVmIFRPRE9fTVNECisgICAgICAgIE9QSl9VSU5UMzIgY3VydHAgPSAwOworICAgICAgICBPUEpfVUlOVDMyIHRwX3N0YXJ0X3BhY2tubzsKKyNlbmRpZiAKKyAgICAgICAgb3BqX3BhY2tldF9pbmZvX3QgKmxfcGFja19pbmZvID0gMDA7CisgICAgICAgIG9wal9pbWFnZV9jb21wX3QqIGxfaW1nX2NvbXAgPSAwMDsKKworICAgICAgICBPUEpfQVJHX05PVF9VU0VEKHBfY3N0cl9pbmRleCk7CisKKyNpZmRlZiBUT0RPX01TRAorICAgICAgICBpZiAocF9jc3RyX2luZGV4KSB7CisgICAgICAgICAgICAgICAgbF9wYWNrX2luZm8gPSBwX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF90aWxlX25vXS5wYWNrZXQ7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8qIGNyZWF0ZSBhIHBhY2tldCBpdGVyYXRvciAqLworICAgICAgICBsX3BpID0gb3BqX3BpX2NyZWF0ZV9kZWNvZGUobF9pbWFnZSwgbF9jcCwgcF90aWxlX25vKTsKKyAgICAgICAgaWYgKCFsX3BpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisKKyAgICAgICAgbF9jdXJyZW50X3BpID0gbF9waTsKKworICAgICAgICBmb3IgICAgIChwaW5vID0gMDsgcGlubyA8PSBsX3RjcC0+bnVtcG9jczsgKytwaW5vKSB7CisKKyAgICAgICAgICAgICAgICAvKiBpZiB0aGUgcmVzb2x1dGlvbiBuZWVkZWQgaXMgdG9vIGxvdywgb25lIGRpbSBvZiB0aGUgdGlsZWMgY291bGQgYmUgZXF1YWwgdG8gemVybworICAgICAgICAgICAgICAgICAqIGFuZCBubyBwYWNrZXRzIGFyZSB1c2VkIHRvIGRlY29kZSB0aGlzIHJlc29sdXRpb24gYW5kCisgICAgICAgICAgICAgICAgICogbF9jdXJyZW50X3BpLT5yZXNubyBpcyBhbHdheXMgPj0gcF90aWxlLT5jb21wc1tsX2N1cnJlbnRfcGktPmNvbXBub10ubWluaW11bV9udW1fcmVzb2x1dGlvbnMKKyAgICAgICAgICAgICAgICAgKiBhbmQgbm8gbF9pbWdfY29tcC0+cmVzbm9fZGVjb2RlZCBhcmUgY29tcHV0ZWQKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBPUEpfQk9PTCogZmlyc3RfcGFzc19mYWlsZWQgPSBOVUxMOworCQkJCQkKKyAgICAgICAgICAgICAgICBpZiAobF9jdXJyZW50X3BpLT5wb2MucHJnID09IE9QSl9QUk9HX1VOS05PV04pIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVE9ETyBBREUgOiBhZGQgYW4gZXJyb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2Rlc3Ryb3kobF9waSwgbF9uYl9wb2NzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisJCQkJCQorICAgICAgICAgICAgICAgIGZpcnN0X3Bhc3NfZmFpbGVkID0gKE9QSl9CT09MKilvcGpfbWFsbG9jKGxfaW1hZ2UtPm51bWNvbXBzICogc2l6ZW9mKE9QSl9CT09MKSk7CisgICAgICAgICAgICAgICAgaWYgKCFmaXJzdF9wYXNzX2ZhaWxlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG9wal9waV9kZXN0cm95KGxfcGksbF9uYl9wb2NzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVtc2V0KGZpcnN0X3Bhc3NfZmFpbGVkLCBPUEpfVFJVRSwgbF9pbWFnZS0+bnVtY29tcHMgKiBzaXplb2YoT1BKX0JPT0wpKTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChvcGpfcGlfbmV4dChsX2N1cnJlbnRfcGkpKSB7CisgICAgICAgICAgICAgICAgICBKQVNfRlBSSU5URiggc3RkZXJyLCAicGFja2V0IG9mZnNldD0wMDAwMDE2NiBwcmc9JWQgY21wdG5vPSUwMmQgcmx2bG5vPSUwMmQgcHJjbm89JTAzZCBseXJubz0lMDJkXG5cbiIsCisgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9waS0+cG9jLnByZzEsIGxfY3VycmVudF9waS0+Y29tcG5vLCBsX2N1cnJlbnRfcGktPnJlc25vLCBsX2N1cnJlbnRfcGktPnByZWNubywgbF9jdXJyZW50X3BpLT5sYXlubyApOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF90Y3AtPm51bV9sYXllcnNfdG9fZGVjb2RlID4gbF9jdXJyZW50X3BpLT5sYXlubworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxfY3VycmVudF9waS0+cmVzbm8gPCBwX3RpbGUtPmNvbXBzW2xfY3VycmVudF9waS0+Y29tcG5vXS5taW5pbXVtX251bV9yZXNvbHV0aW9ucykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX25iX2J5dGVzX3JlYWQgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3Bhc3NfZmFpbGVkW2xfY3VycmVudF9waS0+Y29tcG5vXSA9IE9QSl9GQUxTRTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBvcGpfdDJfZGVjb2RlX3BhY2tldChwX3QyLHBfdGlsZSxsX3RjcCxsX2N1cnJlbnRfcGksbF9jdXJyZW50X2RhdGEsJmxfbmJfYnl0ZXNfcmVhZCxwX21heF9sZW4sbF9wYWNrX2luZm8sIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfZGVzdHJveShsX3BpLGxfbmJfcG9jcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUoZmlyc3RfcGFzc19mYWlsZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2ltZ19jb21wID0gJihsX2ltYWdlLT5jb21wc1tsX2N1cnJlbnRfcGktPmNvbXBub10pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT5yZXNub19kZWNvZGVkID0gb3BqX3VpbnRfbWF4KGxfY3VycmVudF9waS0+cmVzbm8sIGxfaW1nX2NvbXAtPnJlc25vX2RlY29kZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfbmJfYnl0ZXNfcmVhZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG9wal90Ml9za2lwX3BhY2tldChwX3QyLHBfdGlsZSxsX3RjcCxsX2N1cnJlbnRfcGksbF9jdXJyZW50X2RhdGEsJmxfbmJfYnl0ZXNfcmVhZCxwX21heF9sZW4sbF9wYWNrX2luZm8sIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfZGVzdHJveShsX3BpLGxfbmJfcG9jcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUoZmlyc3RfcGFzc19mYWlsZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0X3Bhc3NfZmFpbGVkW2xfY3VycmVudF9waS0+Y29tcG5vXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2ltZ19jb21wID0gJihsX2ltYWdlLT5jb21wc1tsX2N1cnJlbnRfcGktPmNvbXBub10pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9pbWdfY29tcC0+cmVzbm9fZGVjb2RlZCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPnJlc25vX2RlY29kZWQgPSBwX3RpbGUtPmNvbXBzW2xfY3VycmVudF9waS0+Y29tcG5vXS5taW5pbXVtX251bV9yZXNvbHV0aW9ucyAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9kYXRhICs9IGxfbmJfYnl0ZXNfcmVhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfbWF4X2xlbiAtPSBsX25iX2J5dGVzX3JlYWQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIElOREVYID4+ICovCisjaWZkZWYgVE9ET19NU0QKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBfY3N0cl9pbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90aWxlX2luZm9fdjJfdCAqaW5mb19UTCA9ICZwX2NzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGFja2V0X2luZm9fdCAqaW5mb19QSyA9ICZpbmZvX1RMLT5wYWNrZXRbcF9jc3RyX2luZm8tPnBhY2tub107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwX3N0YXJ0X3BhY2tubyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcF9jc3RyX2luZm8tPnBhY2tubykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fUEstPnN0YXJ0X3BvcyA9IGluZm9fVEwtPmVuZF9oZWFkZXIgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluZm9fVEwtPnBhY2tldFtwX2NzdHJfaW5mby0+cGFja25vLTFdLmVuZF9wb3MgPj0gKE9QSl9JTlQzMilwX2NzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dLnRwW2N1cnRwXS50cF9lbmRfcG9zKXsgLyogTmV3IHRpbGUgcGFydCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fVEwtPnRwW2N1cnRwXS50cF9udW1wYWNrcyA9IHBfY3N0cl9pbmZvLT5wYWNrbm8gLSB0cF9zdGFydF9wYWNrbm87IC8qIE51bWJlciBvZiBwYWNrZXRzIGluIHByZXZpb3VzIHRpbGUtcGFydCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwX3N0YXJ0X3BhY2tubyA9IHBfY3N0cl9pbmZvLT5wYWNrbm87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VydHArKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX1BLLT5zdGFydF9wb3MgPSBwX2NzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dLnRwW2N1cnRwXS50cF9lbmRfaGVhZGVyKzE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19QSy0+c3RhcnRfcG9zID0gKGxfY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV90cF9vbiAmJiBpbmZvX1BLLT5zdGFydF9wb3MpID8gaW5mb19QSy0+c3RhcnRfcG9zIDogaW5mb19UTC0+cGFja2V0W3BfY3N0cl9pbmZvLT5wYWNrbm8gLSAxXS5lbmRfcG9zICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX1BLLT5lbmRfcG9zID0gaW5mb19QSy0+c3RhcnRfcG9zICsgbF9uYl9ieXRlc19yZWFkIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19QSy0+ZW5kX3BoX3BvcyArPSBpbmZvX1BLLT5zdGFydF9wb3MgLSAxOyAgLyogRW5kIG9mIHBhY2tldCBoZWFkZXIgd2hpY2ggbm93IG9ubHkgcmVwcmVzZW50cyB0aGUgZGlzdGFuY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytwX2NzdHJfaW5mby0+cGFja25vOworICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAvKiA8PCBJTkRFWCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK2xfY3VycmVudF9waTsKKworICAgICAgICAgICAgICAgIG9wal9mcmVlKGZpcnN0X3Bhc3NfZmFpbGVkKTsKKyAgICAgICAgfQorICAgICAgICAvKiBJTkRFWCA+PiAqLworI2lmZGVmIFRPRE9fTVNECisgICAgICAgIGlmCisgICAgICAgICAgICAgICAgKHBfY3N0cl9pbmZvKSB7CisgICAgICAgICAgICAgICAgcF9jc3RyX2luZm8tPnRpbGVbcF90aWxlX25vXS50cFtjdXJ0cF0udHBfbnVtcGFja3MgPSBwX2NzdHJfaW5mby0+cGFja25vIC0gdHBfc3RhcnRfcGFja25vOyAvKiBOdW1iZXIgb2YgcGFja2V0cyBpbiBsYXN0IHRpbGUtcGFydCAqLworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgLyogPDwgSU5ERVggKi8KKworICAgICAgICAvKiBkb24ndCBmb3JnZXQgdG8gcmVsZWFzZSBwaSAqLworICAgICAgICBvcGpfcGlfZGVzdHJveShsX3BpLGxfbmJfcG9jcyk7CisgICAgICAgICpwX2RhdGFfcmVhZCA9IChPUEpfVUlOVDMyKShsX2N1cnJlbnRfZGF0YSAtIHBfc3JjKTsKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIENyZWF0ZXMgYSBUaWVyIDIgaGFuZGxlCisgKgorICogQHBhcmFtICAgICAgIHBfaW1hZ2UgICAgICAgICBTb3VyY2Ugb3IgZGVzdGluYXRpb24gaW1hZ2UKKyAqIEBwYXJhbSAgICAgICBwX2NwICAgICAgICAgICAgSW1hZ2UgY29kaW5nIHBhcmFtZXRlcnMuCisgKiBAcmV0dXJuICAgICAgICAgICAgICBhIG5ldyBUMiBoYW5kbGUgaWYgc3VjY2Vzc2Z1bCwgTlVMTCBvdGhlcndpc2UuCisqLworb3BqX3QyX3QqIG9wal90Ml9jcmVhdGUob3BqX2ltYWdlX3QgKnBfaW1hZ2UsIG9wal9jcF90ICpwX2NwKQoreworICAgICAgICAvKiBjcmVhdGUgdGhlIHQyIHN0cnVjdHVyZSAqLworICAgICAgICBvcGpfdDJfdCAqbF90MiA9IChvcGpfdDJfdCopb3BqX2NhbGxvYygxLHNpemVvZihvcGpfdDJfdCkpOworICAgICAgICBpZiAoIWxfdDIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGxfdDItPmltYWdlID0gcF9pbWFnZTsKKyAgICAgICAgbF90Mi0+Y3AgPSBwX2NwOworCisgICAgICAgIHJldHVybiBsX3QyOworfQorCit2b2lkIG9wal90Ml9kZXN0cm95KG9wal90Ml90ICp0MikgeworICAgICAgICBpZih0MikgeworICAgICAgICAgICAgICAgIG9wal9mcmVlKHQyKTsKKyAgICAgICAgfQorfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX3QyX2RlY29kZV9wYWNrZXQoICBvcGpfdDJfdCogcF90MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlX3QgKnBfdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjcF90ICpwX3RjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2l0ZXJhdG9yX3QgKnBfcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpwX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV9yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BhY2tldF9pbmZvX3QgKnBfcGFja19pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcikKK3sKKyAgICAgICAgT1BKX0JPT0wgbF9yZWFkX2RhdGE7CisgICAgICAgIE9QSl9VSU5UMzIgbF9uYl9ieXRlc19yZWFkID0gMDsKKyAgICAgICAgT1BKX1VJTlQzMiBsX25iX3RvdGFsX2J5dGVzX3JlYWQgPSAwOworCisgICAgICAgICpwX2RhdGFfcmVhZCA9IDA7CisKKyAgICAgICAgaWYgKCEgb3BqX3QyX3JlYWRfcGFja2V0X2hlYWRlcihwX3QyLHBfdGlsZSxwX3RjcCxwX3BpLCZsX3JlYWRfZGF0YSxwX3NyYywmbF9uYl9ieXRlc19yZWFkLHBfbWF4X2xlbmd0aCxwX3BhY2tfaW5mbywgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBwX3NyYyArPSBsX25iX2J5dGVzX3JlYWQ7CisgICAgICAgIGxfbmJfdG90YWxfYnl0ZXNfcmVhZCArPSBsX25iX2J5dGVzX3JlYWQ7CisgICAgICAgIHBfbWF4X2xlbmd0aCAtPSBsX25iX2J5dGVzX3JlYWQ7CisKKyAgICAgICAgLyogd2Ugc2hvdWxkIHJlYWQgZGF0YSBmb3IgdGhlIHBhY2tldCAqLworICAgICAgICBpZiAobF9yZWFkX2RhdGEpIHsKKyAgICAgICAgICAgICAgICBsX25iX2J5dGVzX3JlYWQgPSAwOworCisgICAgICAgICAgICAgICAgaWYgKCEgb3BqX3QyX3JlYWRfcGFja2V0X2RhdGEocF90MixwX3RpbGUscF9waSxwX3NyYywmbF9uYl9ieXRlc19yZWFkLHBfbWF4X2xlbmd0aCxwX3BhY2tfaW5mbywgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsX25iX3RvdGFsX2J5dGVzX3JlYWQgKz0gbF9uYl9ieXRlc19yZWFkOworICAgICAgICB9CisKKyAgICAgICAgKnBfZGF0YV9yZWFkID0gbF9uYl90b3RhbF9ieXRlc19yZWFkOworCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal90Ml9lbmNvZGVfcGFja2V0KCAgT1BKX1VJTlQzMiB0aWxlbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICogdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjcF90ICogdGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfaXRlcmF0b3JfdCAqcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmZvX3QgKmNzdHJfaW5mbykKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBiYW5kbm8sIGNibGtubzsKKyAgICAgICAgT1BKX0JZVEUqIGMgPSBkZXN0OworICAgICAgICBPUEpfVUlOVDMyIGxfbmJfYnl0ZXM7CisgICAgICAgIE9QSl9VSU5UMzIgY29tcG5vID0gcGktPmNvbXBubzsgICAgIC8qIGNvbXBvbmVudCB2YWx1ZSAqLworICAgICAgICBPUEpfVUlOVDMyIHJlc25vICA9IHBpLT5yZXNubzsgICAgICAvKiByZXNvbHV0aW9uIGxldmVsIHZhbHVlICovCisgICAgICAgIE9QSl9VSU5UMzIgcHJlY25vID0gcGktPnByZWNubzsgICAgIC8qIHByZWNpbmN0IHZhbHVlICovCisgICAgICAgIE9QSl9VSU5UMzIgbGF5bm8gID0gcGktPmxheW5vOyAgICAgIC8qIHF1YWxpdHkgbGF5ZXIgdmFsdWUgKi8KKyAgICAgICAgT1BKX1VJTlQzMiBsX25iX2Jsb2NrczsKKyAgICAgICAgb3BqX3RjZF9iYW5kX3QgKmJhbmQgPSAwMDsKKyAgICAgICAgb3BqX3RjZF9jYmxrX2VuY190KiBjYmxrID0gMDA7CisgICAgICAgIG9wal90Y2RfcGFzc190ICpwYXNzID0gMDA7CisKKyAgICAgICAgb3BqX3RjZF90aWxlY29tcF90ICp0aWxlYyA9ICZ0aWxlLT5jb21wc1tjb21wbm9dOworICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCAqcmVzID0gJnRpbGVjLT5yZXNvbHV0aW9uc1tyZXNub107CisKKyAgICAgICAgb3BqX2Jpb190ICpiaW8gPSAwMDsgICAgLyogQklPIGNvbXBvbmVudCAqLworCisgICAgICAgIC8qIDxTT1AgMHhmZjkxPiAqLworICAgICAgICBpZiAodGNwLT5jc3R5ICYgSjJLX0NQX0NTVFlfU09QKSB7CisgICAgICAgICAgICAgICAgY1swXSA9IDI1NTsKKyAgICAgICAgICAgICAgICBjWzFdID0gMTQ1OworICAgICAgICAgICAgICAgIGNbMl0gPSAwOworICAgICAgICAgICAgICAgIGNbM10gPSA0OworI2lmIDAKKyAgICAgICAgICAgICAgICBjWzRdID0gKHRpbGUtPnBhY2tubyAlIDY1NTM2KSAvIDI1NjsKKyAgICAgICAgICAgICAgICBjWzVdID0gKHRpbGUtPnBhY2tubyAlIDY1NTM2KSAlIDI1NjsKKyNlbHNlCisgICAgICAgICAgICAgICAgY1s0XSA9ICh0aWxlLT5wYWNrbm8gPj4gOCkgJiAweGZmOyAvKiBwYWNrbm8gaXMgdWludDMyX3QgKi8KKyAgICAgICAgICAgICAgICBjWzVdID0gdGlsZS0+cGFja25vICYgMHhmZjsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGMgKz0gNjsKKyAgICAgICAgICAgICAgICBsZW5ndGggLT0gNjsKKyAgICAgICAgfQorICAgICAgICAvKiA8L1NPUD4gKi8KKworICAgICAgICBpZiAoIWxheW5vKSB7CisgICAgICAgICAgICAgICAgYmFuZCA9IHJlcy0+YmFuZHM7CisKKyAgICAgICAgICAgICAgICBmb3IoYmFuZG5vID0gMDsgYmFuZG5vIDwgcmVzLT5udW1iYW5kczsgKytiYW5kbm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfcHJlY2luY3RfdCAqcHJjID0gJmJhbmQtPnByZWNpbmN0c1twcmVjbm9dOworCisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGd0X3Jlc2V0KHByYy0+aW5jbHRyZWUpOworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RndF9yZXNldChwcmMtPmltc2J0cmVlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbF9uYl9ibG9ja3MgPSBwcmMtPmN3ICogcHJjLT5jaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAgICAgKGNibGtubyA9IDA7IGNibGtubyA8IGxfbmJfYmxvY2tzOyArK2NibGtubykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYmxrID0gJnByYy0+Y2Jsa3MuZW5jW2NibGtub107CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jsay0+bnVtcGFzc2VzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RndF9zZXR2YWx1ZShwcmMtPmltc2J0cmVlLCBjYmxrbm8sIGJhbmQtPm51bWJwcyAtIChPUEpfSU5UMzIpY2Jsay0+bnVtYnBzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICsrYmFuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBiaW8gPSBvcGpfYmlvX2NyZWF0ZSgpOworICAgICAgICBpZiAoIWJpbykgeworICAgICAgICAgICAgICAgIC8qIEZJWE1FIGV2ZW50IG1hbmFnZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIG9wal9iaW9faW5pdF9lbmMoYmlvLCBjLCBsZW5ndGgpOworICAgICAgICBvcGpfYmlvX3dyaXRlKGJpbywgMSwgMSk7ICAgICAgICAgICAvKiBFbXB0eSBoZWFkZXIgYml0ICovCisKKyAgICAgICAgLyogV3JpdGluZyBQYWNrZXQgaGVhZGVyICovCisgICAgICAgIGJhbmQgPSByZXMtPmJhbmRzOworICAgICAgICBmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IHJlcy0+bnVtYmFuZHM7ICsrYmFuZG5vKSAgICAgIHsKKyAgICAgICAgICAgICAgICBvcGpfdGNkX3ByZWNpbmN0X3QgKnByYyA9ICZiYW5kLT5wcmVjaW5jdHNbcHJlY25vXTsKKworICAgICAgICAgICAgICAgIGxfbmJfYmxvY2tzID0gcHJjLT5jdyAqIHByYy0+Y2g7CisgICAgICAgICAgICAgICAgY2JsayA9IHByYy0+Y2Jsa3MuZW5jOworCisgICAgICAgICAgICAgICAgZm9yIChjYmxrbm8gPSAwOyBjYmxrbm8gPCBsX25iX2Jsb2NrczsgKytjYmxrbm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfbGF5ZXJfdCAqbGF5ZXIgPSAmY2Jsay0+bGF5ZXJzW2xheW5vXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYmxrLT5udW1wYXNzZXMgJiYgbGF5ZXItPm51bXBhc3NlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGd0X3NldHZhbHVlKHByYy0+aW5jbHRyZWUsIGNibGtubywgKE9QSl9JTlQzMilsYXlubyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICsrY2JsazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYmxrID0gcHJjLT5jYmxrcy5lbmM7CisgICAgICAgICAgICAgICAgZm9yIChjYmxrbm8gPSAwOyBjYmxrbm8gPCBsX25iX2Jsb2NrczsgY2Jsa25vKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfbGF5ZXJfdCAqbGF5ZXIgPSAmY2Jsay0+bGF5ZXJzW2xheW5vXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgaW5jcmVtZW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbnVtcCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxlbiA9IDAsIHBhc3NubzsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbF9uYl9wYXNzZXM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNibGsgaW5jbHVzaW9uIGJpdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2Jsay0+bnVtcGFzc2VzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Z3RfZW5jb2RlKGJpbywgcHJjLT5pbmNsdHJlZSwgY2Jsa25vLCAoT1BKX0lOVDMyKShsYXlubyArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9iaW9fd3JpdGUoYmlvLCBsYXllci0+bnVtcGFzc2VzICE9IDAsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBjYmxrIG5vdCBpbmNsdWRlZCwgZ28gdG8gdGhlIG5leHQgY2JsayAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGF5ZXItPm51bXBhc3NlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2NibGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBmaXJzdCBpbnN0YW5jZSBvZiBjYmxrIC0tPiB6ZXJvIGJpdC1wbGFuZXMgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2Jsay0+bnVtcGFzc2VzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPm51bWxlbmJpdHMgPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGd0X2VuY29kZShiaW8sIHByYy0+aW1zYnRyZWUsIGNibGtubywgOTk5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGluZyBwYXNzZXMgaW5jbHVkZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Ml9wdXRudW1wYXNzZXMoYmlvLCBsYXllci0+bnVtcGFzc2VzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfbmJfcGFzc2VzID0gY2Jsay0+bnVtcGFzc2VzICsgbGF5ZXItPm51bXBhc3NlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBjYmxrLT5wYXNzZXMgKyAgY2Jsay0+bnVtcGFzc2VzOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21wdXRhdGlvbiBvZiB0aGUgaW5jcmVhc2Ugb2YgdGhlIGxlbmd0aCBpbmRpY2F0b3IgYW5kIGluc2VydGlvbiBpbiB0aGUgaGVhZGVyICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChwYXNzbm8gPSBjYmxrLT5udW1wYXNzZXM7IHBhc3NubyA8IGxfbmJfcGFzc2VzOyArK3Bhc3NubykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK251bXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiArPSBwYXNzLT5sZW47CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3MtPnRlcm0gfHwgcGFzc25vID09IChjYmxrLT5udW1wYXNzZXMgKyBsYXllci0+bnVtcGFzc2VzKSAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnQgPSAoT1BKX1VJTlQzMilvcGpfaW50X21heCgoT1BKX0lOVDMyKWluY3JlbWVudCwgb3BqX2ludF9mbG9vcmxvZzIoKE9QSl9JTlQzMilsZW4pICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoKE9QSl9JTlQzMiljYmxrLT5udW1sZW5iaXRzICsgb3BqX2ludF9mbG9vcmxvZzIoKE9QSl9JTlQzMiludW1wKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtcCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3Bhc3M7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDJfcHV0Y29tbWFjb2RlKGJpbywgKE9QSl9JTlQzMilpbmNyZW1lbnQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21wdXRhdGlvbiBvZiB0aGUgbmV3IExlbmd0aCBpbmRpY2F0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPm51bWxlbmJpdHMgKz0gaW5jcmVtZW50OworCisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gY2Jsay0+cGFzc2VzICsgIGNibGstPm51bXBhc3NlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluc2VydGlvbiBvZiB0aGUgY29kZXdvcmQgc2VnbWVudCBsZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocGFzc25vID0gY2Jsay0+bnVtcGFzc2VzOyBwYXNzbm8gPCBsX25iX3Bhc3NlczsgKytwYXNzbm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtcCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gKz0gcGFzcy0+bGVuOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzLT50ZXJtIHx8IHBhc3NubyA9PSAoY2Jsay0+bnVtcGFzc2VzICsgbGF5ZXItPm51bXBhc3NlcykgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2Jpb193cml0ZShiaW8sIChPUEpfVUlOVDMyKWxlbiwgY2Jsay0+bnVtbGVuYml0cyArIChPUEpfVUlOVDMyKW9wal9pbnRfZmxvb3Jsb2cyKChPUEpfSU5UMzIpbnVtcCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtcCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytwYXNzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICArK2NibGs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKytiYW5kOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFvcGpfYmlvX2ZsdXNoKGJpbykpIHsKKyAgICAgICAgICAgICAgICBvcGpfYmlvX2Rlc3Ryb3koYmlvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOyAgICAgICAgICAgICAgIC8qIG1vZGlmaWVkIHRvIGVsaW1pbmF0ZSBsb25nam1wICEhICovCisgICAgICAgIH0KKworICAgICAgICBsX25iX2J5dGVzID0gKE9QSl9VSU5UMzIpb3BqX2Jpb19udW1ieXRlcyhiaW8pOworICAgICAgICBjICs9IGxfbmJfYnl0ZXM7CisgICAgICAgIGxlbmd0aCAtPSBsX25iX2J5dGVzOworCisgICAgICAgIG9wal9iaW9fZGVzdHJveShiaW8pOworCisgICAgICAgIC8qIDxFUEggMHhmZjkyPiAqLworICAgICAgICBpZiAodGNwLT5jc3R5ICYgSjJLX0NQX0NTVFlfRVBIKSB7CisgICAgICAgICAgICAgICAgY1swXSA9IDI1NTsKKyAgICAgICAgICAgICAgICBjWzFdID0gMTQ2OworICAgICAgICAgICAgICAgIGMgKz0gMjsKKyAgICAgICAgICAgICAgICBsZW5ndGggLT0gMjsKKyAgICAgICAgfQorICAgICAgICAvKiA8L0VQSD4gKi8KKworICAgICAgICAvKiA8PCBJTkRFWCAqLworICAgICAgICAvKiBFbmQgb2YgcGFja2V0IGhlYWRlciBwb3NpdGlvbi4gQ3VycmVudGx5IG9ubHkgcmVwcmVzZW50cyB0aGUgZGlzdGFuY2UgdG8gc3RhcnQgb2YgcGFja2V0CisgICAgICAgICAgIFdpbGwgYmUgdXBkYXRlZCBsYXRlciBieSBpbmNyZW1lbnRpbmcgd2l0aCBwYWNrZXQgc3RhcnQgdmFsdWUqLworICAgICAgICBpZihjc3RyX2luZm8gJiYgY3N0cl9pbmZvLT5pbmRleF93cml0ZSkgeworICAgICAgICAgICAgICAgIG9wal9wYWNrZXRfaW5mb190ICppbmZvX1BLID0gJmNzdHJfaW5mby0+dGlsZVt0aWxlbm9dLnBhY2tldFtjc3RyX2luZm8tPnBhY2tub107CisgICAgICAgICAgICAgICAgaW5mb19QSy0+ZW5kX3BoX3BvcyA9IChPUEpfSU5UMzIpKGMgLSBkZXN0KTsKKyAgICAgICAgfQorICAgICAgICAvKiBJTkRFWCA+PiAqLworCisgICAgICAgIC8qIFdyaXRpbmcgdGhlIHBhY2tldCBib2R5ICovCisgICAgICAgIGJhbmQgPSByZXMtPmJhbmRzOworICAgICAgICBmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IHJlcy0+bnVtYmFuZHM7IGJhbmRubysrKSB7CisgICAgICAgICAgICAgICAgb3BqX3RjZF9wcmVjaW5jdF90ICpwcmMgPSAmYmFuZC0+cHJlY2luY3RzW3ByZWNub107CisKKyAgICAgICAgICAgICAgICBsX25iX2Jsb2NrcyA9IHByYy0+Y3cgKiBwcmMtPmNoOworICAgICAgICAgICAgICAgIGNibGsgPSBwcmMtPmNibGtzLmVuYzsKKworICAgICAgICAgICAgICAgIGZvciAoY2Jsa25vID0gMDsgY2Jsa25vIDwgbF9uYl9ibG9ja3M7ICsrY2Jsa25vKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX2xheWVyX3QgKmxheWVyID0gJmNibGstPmxheWVyc1tsYXlub107CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGF5ZXItPm51bXBhc3NlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2NibGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF5ZXItPmxlbiA+IGxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYywgbGF5ZXItPmRhdGEsIGxheWVyLT5sZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgY2Jsay0+bnVtcGFzc2VzICs9IGxheWVyLT5udW1wYXNzZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBjICs9IGxheWVyLT5sZW47CisgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggLT0gbGF5ZXItPmxlbjsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogPDwgSU5ERVggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNzdHJfaW5mbyAmJiBjc3RyX2luZm8tPmluZGV4X3dyaXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9wYWNrZXRfaW5mb190ICppbmZvX1BLID0gJmNzdHJfaW5mby0+dGlsZVt0aWxlbm9dLnBhY2tldFtjc3RyX2luZm8tPnBhY2tub107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fUEstPmRpc3RvICs9IGxheWVyLT5kaXN0bzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNzdHJfaW5mby0+RF9tYXggPCBpbmZvX1BLLT5kaXN0bykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5mby0+RF9tYXggPSBpbmZvX1BLLT5kaXN0bzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICArK2NibGs7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBJTkRFWCA+PiAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK2JhbmQ7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQoIGMgPj0gZGVzdCApOworICAgICAgICAqIHBfZGF0YV93cml0dGVuICs9IChPUEpfVUlOVDMyKShjIC0gZGVzdCk7CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX3QyX3NraXBfcGFja2V0KCBvcGpfdDJfdCogcF90MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICpwX3RpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNwX3QgKnBfdGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2l0ZXJhdG9yX3QgKnBfcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqcF9zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9wYWNrZXRfaW5mb190ICpwX3BhY2tfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyKQoreworICAgICAgICBPUEpfQk9PTCBsX3JlYWRfZGF0YTsKKyAgICAgICAgT1BKX1VJTlQzMiBsX25iX2J5dGVzX3JlYWQgPSAwOworICAgICAgICBPUEpfVUlOVDMyIGxfbmJfdG90YWxfYnl0ZXNfcmVhZCA9IDA7CisKKyAgICAgICAgKnBfZGF0YV9yZWFkID0gMDsKKworICAgICAgICBpZiAoISBvcGpfdDJfcmVhZF9wYWNrZXRfaGVhZGVyKHBfdDIscF90aWxlLHBfdGNwLHBfcGksJmxfcmVhZF9kYXRhLHBfc3JjLCZsX25iX2J5dGVzX3JlYWQscF9tYXhfbGVuZ3RoLHBfcGFja19pbmZvLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIHBfc3JjICs9IGxfbmJfYnl0ZXNfcmVhZDsKKyAgICAgICAgbF9uYl90b3RhbF9ieXRlc19yZWFkICs9IGxfbmJfYnl0ZXNfcmVhZDsKKyAgICAgICAgcF9tYXhfbGVuZ3RoIC09IGxfbmJfYnl0ZXNfcmVhZDsKKworICAgICAgICAvKiB3ZSBzaG91bGQgcmVhZCBkYXRhIGZvciB0aGUgcGFja2V0ICovCisgICAgICAgIGlmIChsX3JlYWRfZGF0YSkgeworICAgICAgICAgICAgICAgIGxfbmJfYnl0ZXNfcmVhZCA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiAoISBvcGpfdDJfc2tpcF9wYWNrZXRfZGF0YShwX3QyLHBfdGlsZSxwX3BpLCZsX25iX2J5dGVzX3JlYWQscF9tYXhfbGVuZ3RoLHBfcGFja19pbmZvLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGxfbmJfdG90YWxfYnl0ZXNfcmVhZCArPSBsX25iX2J5dGVzX3JlYWQ7CisgICAgICAgIH0KKyAgICAgICAgKnBfZGF0YV9yZWFkID0gbF9uYl90b3RhbF9ieXRlc19yZWFkOworCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworCitzdGF0aWMgT1BKX0JPT0wgb3BqX3QyX3JlYWRfcGFja2V0X2hlYWRlciggb3BqX3QyX3QqIHBfdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVfdCAqcF90aWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjcF90ICpwX3RjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9waV9pdGVyYXRvcl90ICpwX3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JPT0wgKiBwX2lzX2RhdGFfcHJlc2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpwX3NyY19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV9yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGFja2V0X2luZm9fdCAqcF9wYWNrX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcikKKworeworICAgICAgICAvKiBsb29wICovCisgICAgICAgIE9QSl9VSU5UMzIgYmFuZG5vLCBjYmxrbm87CisgICAgICAgIE9QSl9VSU5UMzIgbF9uYl9jb2RlX2Jsb2NrczsKKyAgICAgICAgT1BKX1VJTlQzMiBsX3JlbWFpbmluZ19sZW5ndGg7CisgICAgICAgIE9QSl9VSU5UMzIgbF9oZWFkZXJfbGVuZ3RoOworICAgICAgICBPUEpfVUlOVDMyICogbF9tb2RpZmllZF9sZW5ndGhfcHRyID0gMDA7CisgICAgICAgIE9QSl9CWVRFICpsX2N1cnJlbnRfZGF0YSA9IHBfc3JjX2RhdGE7CisgICAgICAgIG9wal9jcF90ICpsX2NwID0gcF90Mi0+Y3A7CisgICAgICAgIG9wal9iaW9fdCAqbF9iaW8gPSAwMDsgIC8qIEJJTyBjb21wb25lbnQgKi8KKyAgICAgICAgb3BqX3RjZF9iYW5kX3QgKmxfYmFuZCA9IDAwOworICAgICAgICBvcGpfdGNkX2NibGtfZGVjX3QqIGxfY2JsayA9IDAwOworICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCogbF9yZXMgPSAmcF90aWxlLT5jb21wc1twX3BpLT5jb21wbm9dLnJlc29sdXRpb25zW3BfcGktPnJlc25vXTsKKworICAgICAgICBPUEpfQllURSAqbF9oZWFkZXJfZGF0YSA9IDAwOworICAgICAgICBPUEpfQllURSAqKmxfaGVhZGVyX2RhdGFfc3RhcnQgPSAwMDsKKworICAgICAgICBPUEpfVUlOVDMyIGxfcHJlc2VudDsKKworICAgICAgICBpZiAocF9waS0+bGF5bm8gPT0gMCkgeworICAgICAgICAgICAgICAgIGxfYmFuZCA9IGxfcmVzLT5iYW5kczsKKworICAgICAgICAgICAgICAgIC8qIHJlc2V0IHRhZ3RyZWVzICovCisgICAgICAgICAgICAgICAgZm9yIChiYW5kbm8gPSAwOyBiYW5kbm8gPCBsX3Jlcy0+bnVtYmFuZHM7ICsrYmFuZG5vKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3ByZWNpbmN0X3QgKmxfcHJjID0gJmxfYmFuZC0+cHJlY2luY3RzW3BfcGktPnByZWNub107CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISAoKGxfYmFuZC0+eDEtbF9iYW5kLT54MCA9PSAwKXx8KGxfYmFuZC0+eTEtbF9iYW5kLT55MCA9PSAwKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Z3RfcmVzZXQobF9wcmMtPmluY2x0cmVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RndF9yZXNldChsX3ByYy0+aW1zYnRyZWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NibGsgPSBsX3ByYy0+Y2Jsa3MuZGVjOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfbmJfY29kZV9ibG9ja3MgPSBsX3ByYy0+Y3cgKiBsX3ByYy0+Y2g7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY2Jsa25vID0gMDsgY2Jsa25vIDwgbF9uYl9jb2RlX2Jsb2NrczsgKytjYmxrbm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NibGstPm51bXNlZ3MgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+cmVhbF9udW1fc2VncyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX2NibGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgKytsX2JhbmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogU09QIG1hcmtlcnMgKi8KKworICAgICAgICBpZiAocF90Y3AtPmNzdHkgJiBKMktfQ1BfQ1NUWV9TT1ApIHsKKyAgICAgICAgICAgICAgICBpZiAocF9tYXhfbGVuZ3RoIDwgNikgeworCQkJCQkJCQkJCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiTm90IGVub3VnaCBzcGFjZSBmb3IgZXhwZWN0ZWQgU09QIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoKmxfY3VycmVudF9kYXRhKSAhPSAweGZmIHx8ICgqKGxfY3VycmVudF9kYXRhICsgMSkgIT0gMHg5MSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkV4cGVjdGVkIFNPUCBtYXJrZXJcbiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSA2OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qKiBUT0RPIDogY2hlY2sgdGhlIE5zb3AgdmFsdWUgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgIFdoZW4gdGhlIG1hcmtlciBQUFQvUFBNIGlzIHVzZWQgdGhlIHBhY2tldCBoZWFkZXIgYXJlIHN0b3JlIGluIFBQVC9QUE0gbWFya2VyCisgICAgICAgIFRoaXMgcGFydCBkZWFsIHdpdGggdGhpcyBjYXJhY3RlcmlzdGljCisgICAgICAgIHN0ZXAgMTogUmVhZCBwYWNrZXQgaGVhZGVyIGluIHRoZSBzYXZlZCBzdHJ1Y3R1cmUKKyAgICAgICAgc3RlcCAyOiBSZXR1cm4gdG8gY29kZXN0cmVhbSBmb3IgZGVjb2RpbmcKKyAgICAgICAgKi8KKworICAgICAgICBsX2JpbyA9IG9wal9iaW9fY3JlYXRlKCk7CisgICAgICAgIGlmICghIGxfYmlvKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsX2NwLT5wcG0gPT0gMSkgeyAvKiBQUE0gKi8KKyAgICAgICAgICAgICAgICBsX2hlYWRlcl9kYXRhX3N0YXJ0ID0gJmxfY3AtPnBwbV9kYXRhOworICAgICAgICAgICAgICAgIGxfaGVhZGVyX2RhdGEgPSAqbF9oZWFkZXJfZGF0YV9zdGFydDsKKyAgICAgICAgICAgICAgICBsX21vZGlmaWVkX2xlbmd0aF9wdHIgPSAmKGxfY3AtPnBwbV9sZW4pOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocF90Y3AtPnBwdCA9PSAxKSB7IC8qIFBQVCAqLworICAgICAgICAgICAgICAgIGxfaGVhZGVyX2RhdGFfc3RhcnQgPSAmKHBfdGNwLT5wcHRfZGF0YSk7CisgICAgICAgICAgICAgICAgbF9oZWFkZXJfZGF0YSA9ICpsX2hlYWRlcl9kYXRhX3N0YXJ0OworICAgICAgICAgICAgICAgIGxfbW9kaWZpZWRfbGVuZ3RoX3B0ciA9ICYocF90Y3AtPnBwdF9sZW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeyAgLyogTm9ybWFsIENhc2UgKi8KKyAgICAgICAgICAgICAgICBsX2hlYWRlcl9kYXRhX3N0YXJ0ID0gJihsX2N1cnJlbnRfZGF0YSk7CisgICAgICAgICAgICAgICAgbF9oZWFkZXJfZGF0YSA9ICpsX2hlYWRlcl9kYXRhX3N0YXJ0OworICAgICAgICAgICAgICAgIGxfcmVtYWluaW5nX2xlbmd0aCA9IChPUEpfVUlOVDMyKShwX3NyY19kYXRhK3BfbWF4X2xlbmd0aC1sX2hlYWRlcl9kYXRhKTsKKyAgICAgICAgICAgICAgICBsX21vZGlmaWVkX2xlbmd0aF9wdHIgPSAmKGxfcmVtYWluaW5nX2xlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBvcGpfYmlvX2luaXRfZGVjKGxfYmlvLCBsX2hlYWRlcl9kYXRhLCpsX21vZGlmaWVkX2xlbmd0aF9wdHIpOworCisgICAgICAgIGxfcHJlc2VudCA9IG9wal9iaW9fcmVhZChsX2JpbywgMSk7CisgICAgICAgIEpBU19GUFJJTlRGKHN0ZGVyciwgInByZXNlbnQ9JWQgXG4iLCBsX3ByZXNlbnQgKTsKKyAgICAgICAgaWYgKCFsX3ByZXNlbnQpIHsKKyAgICAgICAgICAgIC8qIFRPRE8gTVNEOiBubyB0ZXN0IHRvIGNvbnRyb2wgdGhlIG91dHB1dCBvZiB0aGlzIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICBvcGpfYmlvX2luYWxpZ24obF9iaW8pOworICAgICAgICAgICAgICAgIGxfaGVhZGVyX2RhdGEgKz0gb3BqX2Jpb19udW1ieXRlcyhsX2Jpbyk7CisgICAgICAgICAgICAgICAgb3BqX2Jpb19kZXN0cm95KGxfYmlvKTsKKworICAgICAgICAgICAgICAgIC8qIEVQSCBtYXJrZXJzICovCisgICAgICAgICAgICAgICAgaWYgKHBfdGNwLT5jc3R5ICYgSjJLX0NQX0NTVFlfRVBIKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCpsX21vZGlmaWVkX2xlbmd0aF9wdHIgLSAoT1BKX1VJTlQzMikobF9oZWFkZXJfZGF0YSAtICpsX2hlYWRlcl9kYXRhX3N0YXJ0KSkgPCAyVSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJOb3QgZW5vdWdoIHNwYWNlIGZvciBleHBlY3RlZCBFUEggbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKCpsX2hlYWRlcl9kYXRhKSAhPSAweGZmIHx8ICgqKGxfaGVhZGVyX2RhdGEgKyAxKSAhPSAweDkyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJFeHBlY3RlZCBFUEggbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaGVhZGVyX2RhdGEgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsX2hlYWRlcl9sZW5ndGggPSAoT1BKX1VJTlQzMikobF9oZWFkZXJfZGF0YSAtICpsX2hlYWRlcl9kYXRhX3N0YXJ0KTsKKyAgICAgICAgICAgICAgICAqbF9tb2RpZmllZF9sZW5ndGhfcHRyIC09IGxfaGVhZGVyX2xlbmd0aDsKKyAgICAgICAgICAgICAgICAqbF9oZWFkZXJfZGF0YV9zdGFydCArPSBsX2hlYWRlcl9sZW5ndGg7CisKKyAgICAgICAgICAgICAgICAvKiA8PCBJTkRFWCAqLworICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBwYWNrZXQgaGVhZGVyIHBvc2l0aW9uLiBDdXJyZW50bHkgb25seSByZXByZXNlbnRzIHRoZSBkaXN0YW5jZSB0byBzdGFydCBvZiBwYWNrZXQKKyAgICAgICAgICAgICAgICAgICBXaWxsIGJlIHVwZGF0ZWQgbGF0ZXIgYnkgaW5jcmVtZW50aW5nIHdpdGggcGFja2V0IHN0YXJ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgaWYgKHBfcGFja19pbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwX3BhY2tfaW5mby0+ZW5kX3BoX3BvcyA9IChPUEpfSU5UMzIpKGxfY3VycmVudF9kYXRhIC0gcF9zcmNfZGF0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIElOREVYID4+ICovCisKKyAgICAgICAgICAgICAgICAqIHBfaXNfZGF0YV9wcmVzZW50ID0gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICpwX2RhdGFfcmVhZCA9IChPUEpfVUlOVDMyKShsX2N1cnJlbnRfZGF0YSAtIHBfc3JjX2RhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIGxfYmFuZCA9IGxfcmVzLT5iYW5kczsKKyAgICAgICAgZm9yIChiYW5kbm8gPSAwOyBiYW5kbm8gPCBsX3Jlcy0+bnVtYmFuZHM7ICsrYmFuZG5vKSB7CisgICAgICAgICAgICAgICAgb3BqX3RjZF9wcmVjaW5jdF90ICpsX3ByYyA9ICYobF9iYW5kLT5wcmVjaW5jdHNbcF9waS0+cHJlY25vXSk7CisKKyAgICAgICAgICAgICAgICBpZiAoKGxfYmFuZC0+eDEtbF9iYW5kLT54MCA9PSAwKXx8KGxfYmFuZC0+eTEtbF9iYW5kLT55MCA9PSAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgKytsX2JhbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsX25iX2NvZGVfYmxvY2tzID0gbF9wcmMtPmN3ICogbF9wcmMtPmNoOworICAgICAgICAgICAgICAgIGxfY2JsayA9IGxfcHJjLT5jYmxrcy5kZWM7CisgICAgICAgICAgICAgICAgZm9yIChjYmxrbm8gPSAwOyBjYmxrbm8gPCBsX25iX2NvZGVfYmxvY2tzOyBjYmxrbm8rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsX2luY2x1ZGVkLGxfaW5jcmVtZW50LCBsX3NlZ25vOworICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIG47CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIGNibGsgbm90IHlldCBpbmNsdWRlZCBiZWZvcmUgLS0+IGluY2x1c2lvbiB0YWd0cmVlICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxfY2Jsay0+bnVtc2VncykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2luY2x1ZGVkID0gb3BqX3RndF9kZWNvZGUobF9iaW8sIGxfcHJjLT5pbmNsdHJlZSwgY2Jsa25vLCAoT1BKX0lOVDMyKShwX3BpLT5sYXlubyArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxzZSBvbmUgYml0ICovCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9pbmNsdWRlZCA9IG9wal9iaW9fcmVhZChsX2JpbywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIGNibGsgbm90IGluY2x1ZGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxfaW5jbHVkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jYmxrLT5udW1uZXdwYXNzZXMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfY2JsazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFTX0ZQUklOVEYoc3RkZXJyLCAiaW5jbHVkZWQ9JWQgXG4iLCBsX2luY2x1ZGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIGNibGsgbm90IHlldCBpbmNsdWRlZCAtLT4gemVyby1iaXRwbGFuZSB0YWd0cmVlICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxfY2Jsay0+bnVtc2VncykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGkgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghb3BqX3RndF9kZWNvZGUobF9iaW8sIGxfcHJjLT5pbXNidHJlZSwgY2Jsa25vLCAoT1BKX0lOVDMyKWkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jYmxrLT5udW1icHMgPSAoT1BKX1VJTlQzMilsX2JhbmQtPm51bWJwcyArIDEgLSBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NibGstPm51bWxlbmJpdHMgPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kaW5nIHBhc3NlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgbF9jYmxrLT5udW1uZXdwYXNzZXMgPSBvcGpfdDJfZ2V0bnVtcGFzc2VzKGxfYmlvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfaW5jcmVtZW50ID0gb3BqX3QyX2dldGNvbW1hY29kZShsX2Jpbyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBpbmRpY2F0b3IgaW5jcmVtZW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICBsX2NibGstPm51bWxlbmJpdHMgKz0gbF9pbmNyZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBsX3NlZ25vID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsX2NibGstPm51bXNlZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgb3BqX3QyX2luaXRfc2VnKGxfY2JsaywgbF9zZWdubywgcF90Y3AtPnRjY3BzW3BfcGktPmNvbXBub10uY2Jsa3N0eSwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfYmlvX2Rlc3Ryb3kobF9iaW8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NlZ25vID0gbF9jYmxrLT5udW1zZWdzIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfY2Jsay0+c2Vnc1tsX3NlZ25vXS5udW1wYXNzZXMgPT0gbF9jYmxrLT5zZWdzW2xfc2Vnbm9dLm1heHBhc3NlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9zZWdubzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBvcGpfdDJfaW5pdF9zZWcobF9jYmxrLCBsX3NlZ25vLCBwX3RjcC0+dGNjcHNbcF9waS0+Y29tcG5vXS5jYmxrc3R5LCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2Jpb19kZXN0cm95KGxfYmlvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBuID0gKE9QSl9JTlQzMilsX2NibGstPm51bW5ld3Bhc3NlczsKKworICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NibGstPnNlZ3NbbF9zZWdub10ubnVtbmV3cGFzc2VzID0gKE9QSl9VSU5UMzIpb3BqX2ludF9taW4oKE9QSl9JTlQzMikobF9jYmxrLT5zZWdzW2xfc2Vnbm9dLm1heHBhc3NlcyAtIGxfY2Jsay0+c2Vnc1tsX3NlZ25vXS5udW1wYXNzZXMpLCBuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jYmxrLT5zZWdzW2xfc2Vnbm9dLm5ld2xlbiA9IG9wal9iaW9fcmVhZChsX2JpbywgbF9jYmxrLT5udW1sZW5iaXRzICsgb3BqX3VpbnRfZmxvb3Jsb2cyKGxfY2Jsay0+c2Vnc1tsX3NlZ25vXS5udW1uZXdwYXNzZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVNfRlBSSU5URihzdGRlcnIsICJpbmNsdWRlZD0lZCBudW1uZXdwYXNzZXM9JWQgaW5jcmVtZW50PSVkIGxlbj0lZCBcbiIsIGxfaW5jbHVkZWQsIGxfY2Jsay0+c2Vnc1tsX3NlZ25vXS5udW1uZXdwYXNzZXMsIGxfaW5jcmVtZW50LCBsX2NibGstPnNlZ3NbbF9zZWdub10ubmV3bGVuICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAtPSAoT1BKX0lOVDMyKWxfY2Jsay0+c2Vnc1tsX3NlZ25vXS5udW1uZXdwYXNzZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9zZWdubzsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG9wal90Ml9pbml0X3NlZyhsX2NibGssIGxfc2Vnbm8sIHBfdGNwLT50Y2Nwc1twX3BpLT5jb21wbm9dLmNibGtzdHksIDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfYmlvX2Rlc3Ryb3kobF9iaW8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKG4gPiAwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgKytsX2NibGs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKytsX2JhbmQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW9wal9iaW9faW5hbGlnbihsX2JpbykpIHsKKyAgICAgICAgICAgICAgICBvcGpfYmlvX2Rlc3Ryb3kobF9iaW8pOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBsX2hlYWRlcl9kYXRhICs9IG9wal9iaW9fbnVtYnl0ZXMobF9iaW8pOworICAgICAgICBvcGpfYmlvX2Rlc3Ryb3kobF9iaW8pOworCisgICAgICAgIC8qIEVQSCBtYXJrZXJzICovCisgICAgICAgIGlmIChwX3RjcC0+Y3N0eSAmIEoyS19DUF9DU1RZX0VQSCkgeworICAgICAgICAgICAgICAgIGlmICgoKmxfbW9kaWZpZWRfbGVuZ3RoX3B0ciAtIChPUEpfVUlOVDMyKShsX2hlYWRlcl9kYXRhIC0gKmxfaGVhZGVyX2RhdGFfc3RhcnQpKSA8IDJVKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJOb3QgZW5vdWdoIHNwYWNlIGZvciBleHBlY3RlZCBFUEggbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCgqbF9oZWFkZXJfZGF0YSkgIT0gMHhmZiB8fCAoKihsX2hlYWRlcl9kYXRhICsgMSkgIT0gMHg5MikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkV4cGVjdGVkIEVQSCBtYXJrZXJcbiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsX2hlYWRlcl9kYXRhICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbF9oZWFkZXJfbGVuZ3RoID0gKE9QSl9VSU5UMzIpKGxfaGVhZGVyX2RhdGEgLSAqbF9oZWFkZXJfZGF0YV9zdGFydCk7CisgICAgICAgIEpBU19GUFJJTlRGKCBzdGRlcnIsICJoZHJsZW49JWQgXG4iLCBsX2hlYWRlcl9sZW5ndGggKTsKKyAgICAgICAgSkFTX0ZQUklOVEYoIHN0ZGVyciwgInBhY2tldCBib2R5XG4iKTsKKyAgICAgICAgKmxfbW9kaWZpZWRfbGVuZ3RoX3B0ciAtPSBsX2hlYWRlcl9sZW5ndGg7CisgICAgICAgICpsX2hlYWRlcl9kYXRhX3N0YXJ0ICs9IGxfaGVhZGVyX2xlbmd0aDsKKworICAgICAgICAvKiA8PCBJTkRFWCAqLworICAgICAgICAvKiBFbmQgb2YgcGFja2V0IGhlYWRlciBwb3NpdGlvbi4gQ3VycmVudGx5IG9ubHkgcmVwcmVzZW50cyB0aGUgZGlzdGFuY2UgdG8gc3RhcnQgb2YgcGFja2V0CisgICAgICAgICBXaWxsIGJlIHVwZGF0ZWQgbGF0ZXIgYnkgaW5jcmVtZW50aW5nIHdpdGggcGFja2V0IHN0YXJ0IHZhbHVlICovCisgICAgICAgIGlmIChwX3BhY2tfaW5mbykgeworICAgICAgICAgICAgICAgIHBfcGFja19pbmZvLT5lbmRfcGhfcG9zID0gKE9QSl9JTlQzMikobF9jdXJyZW50X2RhdGEgLSBwX3NyY19kYXRhKTsKKyAgICAgICAgfQorICAgICAgICAvKiBJTkRFWCA+PiAqLworCisgICAgICAgICpwX2lzX2RhdGFfcHJlc2VudCA9IE9QSl9UUlVFOworICAgICAgICAqcF9kYXRhX3JlYWQgPSAoT1BKX1VJTlQzMikobF9jdXJyZW50X2RhdGEgLSBwX3NyY19kYXRhKTsKKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdDJfcmVhZF9wYWNrZXRfZGF0YSggICBvcGpfdDJfdCogcF90MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICpwX3RpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfaXRlcmF0b3JfdCAqcF9waSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpwX3NyY19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV9yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGFja2V0X2luZm9fdCAqcGFja19pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90KiBwX21hbmFnZXIpCit7CisgICAgICAgIE9QSl9VSU5UMzIgYmFuZG5vLCBjYmxrbm87CisgICAgICAgIE9QSl9VSU5UMzIgbF9uYl9jb2RlX2Jsb2NrczsKKyAgICAgICAgT1BKX0JZVEUgKmxfY3VycmVudF9kYXRhID0gcF9zcmNfZGF0YTsKKyAgICAgICAgb3BqX3RjZF9iYW5kX3QgKmxfYmFuZCA9IDAwOworICAgICAgICBvcGpfdGNkX2NibGtfZGVjX3QqIGxfY2JsayA9IDAwOworICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCogbF9yZXMgPSAmcF90aWxlLT5jb21wc1twX3BpLT5jb21wbm9dLnJlc29sdXRpb25zW3BfcGktPnJlc25vXTsKKworICAgICAgICBPUEpfQVJHX05PVF9VU0VEKHBfdDIpOworICAgICAgICBPUEpfQVJHX05PVF9VU0VEKHBhY2tfaW5mbyk7CisKKyAgICAgICAgbF9iYW5kID0gbF9yZXMtPmJhbmRzOworICAgICAgICBmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IGxfcmVzLT5udW1iYW5kczsgKytiYW5kbm8pIHsKKyAgICAgICAgICAgICAgICBvcGpfdGNkX3ByZWNpbmN0X3QgKmxfcHJjID0gJmxfYmFuZC0+cHJlY2luY3RzW3BfcGktPnByZWNub107CisKKyAgICAgICAgICAgICAgICBpZiAoKGxfYmFuZC0+eDEtbF9iYW5kLT54MCA9PSAwKXx8KGxfYmFuZC0+eTEtbF9iYW5kLT55MCA9PSAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgKytsX2JhbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsX25iX2NvZGVfYmxvY2tzID0gbF9wcmMtPmN3ICogbF9wcmMtPmNoOworICAgICAgICAgICAgICAgIGxfY2JsayA9IGxfcHJjLT5jYmxrcy5kZWM7CisKKyAgICAgICAgICAgICAgICBmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IGxfbmJfY29kZV9ibG9ja3M7ICsrY2Jsa25vKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3NlZ190ICpsX3NlZyA9IDAwOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxfY2Jsay0+bnVtbmV3cGFzc2VzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX2NibGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxfY2Jsay0+bnVtc2VncykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NlZyA9IGxfY2Jsay0+c2VnczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX2NibGstPm51bXNlZ3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+ZGF0YV9jdXJyZW50X3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2VnID0gJmxfY2Jsay0+c2Vnc1tsX2NibGstPm51bXNlZ3MgLSAxXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9zZWctPm51bXBhc3NlcyA9PSBsX3NlZy0+bWF4cGFzc2VzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX3NlZzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfY2Jsay0+bnVtc2VnczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIHBvc3NpYmxlIG92ZXJmbG93IChvbiBsX2N1cnJlbnRfZGF0YSBvbmx5LCBhc3N1bWVzIGlucHV0IGFyZ3MgYWxyZWFkeSBjaGVja2VkKSB0aGVuIHNpemUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoKE9QSl9TSVpFX1QpbF9jdXJyZW50X2RhdGEgKyAoT1BKX1NJWkVfVClsX3NlZy0+bmV3bGVuKSA8IChPUEpfU0laRV9UKWxfY3VycmVudF9kYXRhKSB8fCAobF9jdXJyZW50X2RhdGEgKyBsX3NlZy0+bmV3bGVuID4gcF9zcmNfZGF0YSArIHBfbWF4X2xlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAicmVhZDogc2VnbWVudCB0b28gbG9uZyAoJWQpIHdpdGggbWF4ICglZCkgZm9yIGNvZGVibG9jayAlZCAocD0lZCwgYj0lZCwgcj0lZCwgYz0lZClcbiIsCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlsX3NlZy0+bmV3bGVuLCBwX21heF9sZW5ndGgsIGNibGtubywgcF9waS0+cHJlY25vLCBiYW5kbm8sIHBfcGktPnJlc25vLCBwX3BpLT5jb21wbm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworI2lmZGVmIFVTRV9KUFdMCisgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBuZWVkIGhlcmUgYSBqMmsgaGFuZGxlIHRvIHZlcmlmeSBpZiBtYWtpbmcgYSBjaGVjayB0bworICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHZhbGlkaXR5IG9mIGNibG9ja3MgcGFyYW1ldGVycyBpcyBzZWxlY3RlZCBmcm9tIHVzZXIgKC1XKSAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldCdzIGNoZWNrIHRoYXQgd2UgYXJlIG5vdCBleGNlZWRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsX2NibGstPmxlbiArIGxfc2VnLT5uZXdsZW4pID4gODE5MikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKUFdMOiBzZWdtZW50IHRvbyBsb25nICglZCkgZm9yIGNvZGVibG9jayAlZCAocD0lZCwgYj0lZCwgcj0lZCwgYz0lZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NlZy0+bmV3bGVuLCBjYmxrbm8sIHBfcGktPnByZWNubywgYmFuZG5vLCBwX3BpLT5yZXNubywgcF9waS0+Y29tcG5vKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUpQV0xfQVNTVU1FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSlBXTDogZ2l2aW5nIHVwXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2VnLT5uZXdsZW4gPSA4MTkyIC0gbF9jYmxrLT5sZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiICAgICAgLSB0cnVuY2F0aW5nIHNlZ21lbnQgdG8gJWRcbiIsIGxfc2VnLT5uZXdsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisjZW5kaWYgLyogVVNFX0pQV0wgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgcG9zc2libGUgb3ZlcmZsb3cgb24gc2l6ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGxfY2Jsay0+ZGF0YV9jdXJyZW50X3NpemUgKyBsX3NlZy0+bmV3bGVuKSA8IGxfY2Jsay0+ZGF0YV9jdXJyZW50X3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAicmVhZDogc2VnbWVudCB0b28gbG9uZyAoJWQpIHdpdGggY3VycmVudCBzaXplICglZCA+ICVkKSBmb3IgY29kZWJsb2NrICVkIChwPSVkLCBiPSVkLCByPSVkLCBjPSVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2VnLT5uZXdsZW4sIGxfY2Jsay0+ZGF0YV9jdXJyZW50X3NpemUsIDB4RkZGRkZGRkYgLSBsX3NlZy0+bmV3bGVuLCBjYmxrbm8sIHBfcGktPnByZWNubywgYmFuZG5vLCBwX3BpLT5yZXNubywgcF9waS0+Y29tcG5vKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSBjYmxrLT5kYXRhIGhhdmUgYWxsb2NhdGVkIGVub3VnaCBtZW1vcnkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsX2NibGstPmRhdGFfY3VycmVudF9zaXplICsgbF9zZWctPm5ld2xlbikgPiBsX2NibGstPmRhdGFfbWF4X3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFKiBuZXdfY2Jsa19kYXRhID0gKE9QSl9CWVRFKikgb3BqX3JlYWxsb2MobF9jYmxrLT5kYXRhLCBsX2NibGstPmRhdGFfY3VycmVudF9zaXplICsgbF9zZWctPm5ld2xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighIG5ld19jYmxrX2RhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2NibGstPmRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+ZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jYmxrLT5kYXRhX21heF9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gcmVhbGxvYyBjb2RlIGJsb2NrIGNhdGEhXG4iKTsgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jYmxrLT5kYXRhX21heF9zaXplID0gbF9jYmxrLT5kYXRhX2N1cnJlbnRfc2l6ZSArIGxfc2VnLT5uZXdsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NibGstPmRhdGEgPSBuZXdfY2Jsa19kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShsX2NibGstPmRhdGEgKyBsX2NibGstPmRhdGFfY3VycmVudF9zaXplLCBsX2N1cnJlbnRfZGF0YSwgbF9zZWctPm5ld2xlbik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfc2VnLT5udW1wYXNzZXMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2VnLT5kYXRhID0gJmxfY2Jsay0+ZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NlZy0+ZGF0YWluZGV4ID0gbF9jYmxrLT5kYXRhX2N1cnJlbnRfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9kYXRhICs9IGxfc2VnLT5uZXdsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2VnLT5udW1wYXNzZXMgKz0gbF9zZWctPm51bW5ld3Bhc3NlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jYmxrLT5udW1uZXdwYXNzZXMgLT0gbF9zZWctPm51bW5ld3Bhc3NlczsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NlZy0+cmVhbF9udW1fcGFzc2VzID0gbF9zZWctPm51bXBhc3NlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jYmxrLT5kYXRhX2N1cnJlbnRfc2l6ZSArPSBsX3NlZy0+bmV3bGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NlZy0+bGVuICs9IGxfc2VnLT5uZXdsZW47CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfY2Jsay0+bnVtbmV3cGFzc2VzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9zZWc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX2NibGstPm51bXNlZ3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGxfY2Jsay0+bnVtbmV3cGFzc2VzID4gMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+cmVhbF9udW1fc2VncyA9IGxfY2Jsay0+bnVtc2VnczsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrbF9jYmxrOworICAgICAgICAgICAgICAgIH0gLyogbmV4dCBjb2RlX2Jsb2NrICovCisKKyAgICAgICAgICAgICAgICArK2xfYmFuZDsKKyAgICAgICAgfQorCisgICAgICAgICoocF9kYXRhX3JlYWQpID0gKE9QSl9VSU5UMzIpKGxfY3VycmVudF9kYXRhIC0gcF9zcmNfZGF0YSk7CisKKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdDJfc2tpcF9wYWNrZXRfZGF0YSggICBvcGpfdDJfdCogcF90MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICpwX3RpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfaXRlcmF0b3JfdCAqcF9waSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BhY2tldF9pbmZvX3QgKnBhY2tfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyKQoreworICAgICAgICBPUEpfVUlOVDMyIGJhbmRubywgY2Jsa25vOworICAgICAgICBPUEpfVUlOVDMyIGxfbmJfY29kZV9ibG9ja3M7CisgICAgICAgIG9wal90Y2RfYmFuZF90ICpsX2JhbmQgPSAwMDsKKyAgICAgICAgb3BqX3RjZF9jYmxrX2RlY190KiBsX2NibGsgPSAwMDsKKyAgICAgICAgb3BqX3RjZF9yZXNvbHV0aW9uX3QqIGxfcmVzID0gJnBfdGlsZS0+Y29tcHNbcF9waS0+Y29tcG5vXS5yZXNvbHV0aW9uc1twX3BpLT5yZXNub107CisKKyAgICAgICAgT1BKX0FSR19OT1RfVVNFRChwX3QyKTsKKyAgICAgICAgT1BKX0FSR19OT1RfVVNFRChwYWNrX2luZm8pOworCisgICAgICAgICpwX2RhdGFfcmVhZCA9IDA7CisgICAgICAgIGxfYmFuZCA9IGxfcmVzLT5iYW5kczsKKworICAgICAgICBmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IGxfcmVzLT5udW1iYW5kczsgKytiYW5kbm8pIHsKKyAgICAgICAgICAgICAgICBvcGpfdGNkX3ByZWNpbmN0X3QgKmxfcHJjID0gJmxfYmFuZC0+cHJlY2luY3RzW3BfcGktPnByZWNub107CisKKyAgICAgICAgICAgICAgICBpZiAoKGxfYmFuZC0+eDEtbF9iYW5kLT54MCA9PSAwKXx8KGxfYmFuZC0+eTEtbF9iYW5kLT55MCA9PSAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgKytsX2JhbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsX25iX2NvZGVfYmxvY2tzID0gbF9wcmMtPmN3ICogbF9wcmMtPmNoOworICAgICAgICAgICAgICAgIGxfY2JsayA9IGxfcHJjLT5jYmxrcy5kZWM7CisKKyAgICAgICAgICAgICAgICBmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IGxfbmJfY29kZV9ibG9ja3M7ICsrY2Jsa25vKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3NlZ190ICpsX3NlZyA9IDAwOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxfY2Jsay0+bnVtbmV3cGFzc2VzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX2NibGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxfY2Jsay0+bnVtc2VncykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NlZyA9IGxfY2Jsay0+c2VnczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX2NibGstPm51bXNlZ3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+ZGF0YV9jdXJyZW50X3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2VnID0gJmxfY2Jsay0+c2Vnc1tsX2NibGstPm51bXNlZ3MgLSAxXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9zZWctPm51bXBhc3NlcyA9PSBsX3NlZy0+bWF4cGFzc2VzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX3NlZzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfY2Jsay0+bnVtc2VnczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIHBvc3NpYmxlIG92ZXJmbG93IHRoZW4gc2l6ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCgqcF9kYXRhX3JlYWQgKyBsX3NlZy0+bmV3bGVuKSA8ICgqcF9kYXRhX3JlYWQpKSB8fCAoKCpwX2RhdGFfcmVhZCArIGxfc2VnLT5uZXdsZW4pID4gcF9tYXhfbGVuZ3RoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJza2lwOiBzZWdtZW50IHRvbyBsb25nICglZCkgd2l0aCBtYXggKCVkKSBmb3IgY29kZWJsb2NrICVkIChwPSVkLCBiPSVkLCByPSVkLCBjPSVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2VnLT5uZXdsZW4sIHBfbWF4X2xlbmd0aCwgY2Jsa25vLCBwX3BpLT5wcmVjbm8sIGJhbmRubywgcF9waS0+cmVzbm8sIHBfcGktPmNvbXBubyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisjaWZkZWYgVVNFX0pQV0wKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIG5lZWQgaGVyZSBhIGoyayBoYW5kbGUgdG8gdmVyaWZ5IGlmIG1ha2luZyBhIGNoZWNrIHRvCisgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmFsaWRpdHkgb2YgY2Jsb2NrcyBwYXJhbWV0ZXJzIGlzIHNlbGVjdGVkIGZyb20gdXNlciAoLVcpICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGV0J3MgY2hlY2sgdGhhdCB3ZSBhcmUgbm90IGV4Y2VlZGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGxfY2Jsay0+bGVuICsgbF9zZWctPm5ld2xlbikgPiA4MTkyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpQV0w6IHNlZ21lbnQgdG9vIGxvbmcgKCVkKSBmb3IgY29kZWJsb2NrICVkIChwPSVkLCBiPSVkLCByPSVkLCBjPSVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2VnLT5uZXdsZW4sIGNibGtubywgcF9waS0+cHJlY25vLCBiYW5kbm8sIHBfcGktPnJlc25vLCBwX3BpLT5jb21wbm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSlBXTF9BU1NVTUUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJKUFdMOiBnaXZpbmcgdXBcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC05OTk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2VnLT5uZXdsZW4gPSA4MTkyIC0gbF9jYmxrLT5sZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiICAgICAgLSB0cnVuY2F0aW5nIHNlZ21lbnQgdG8gJWRcbiIsIGxfc2VnLT5uZXdsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisjZW5kaWYgLyogVVNFX0pQV0wgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVNfRlBSSU5URihzdGRlcnIsICJwX2RhdGFfcmVhZCAoJWQpIG5ld2xlbiAoJWQpIFxuIiwgKnBfZGF0YV9yZWFkLCBsX3NlZy0+bmV3bGVuICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocF9kYXRhX3JlYWQpICs9IGxfc2VnLT5uZXdsZW47CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zZWctPm51bXBhc3NlcyArPSBsX3NlZy0+bnVtbmV3cGFzc2VzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NibGstPm51bW5ld3Bhc3NlcyAtPSBsX3NlZy0+bnVtbmV3cGFzc2VzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9jYmxrLT5udW1uZXdwYXNzZXMgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX3NlZzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfY2Jsay0+bnVtc2VnczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAobF9jYmxrLT5udW1uZXdwYXNzZXMgPiAwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgKytsX2NibGs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKytsX2JhbmQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKKworT1BKX0JPT0wgb3BqX3QyX2luaXRfc2VnKCAgIG9wal90Y2RfY2Jsa19kZWNfdCogY2JsaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGluZGV4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNibGtzdHksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgZmlyc3QpCit7CisgICAgICAgIG9wal90Y2Rfc2VnX3QqIHNlZyA9IDAwOworICAgICAgICBPUEpfVUlOVDMyIGxfbmJfc2VncyA9IGluZGV4ICsgMTsKKworICAgICAgICBpZiAobF9uYl9zZWdzID4gY2Jsay0+bV9jdXJyZW50X21heF9zZWdzKSB7CisgICAgICAgICAgICAgICAgb3BqX3RjZF9zZWdfdCogbmV3X3NlZ3M7CisgICAgICAgICAgICAgICAgY2Jsay0+bV9jdXJyZW50X21heF9zZWdzICs9IE9QSl9KMktfREVGQVVMVF9OQl9TRUdTOworCisgICAgICAgICAgICAgICAgbmV3X3NlZ3MgPSAob3BqX3RjZF9zZWdfdCopIG9wal9yZWFsbG9jKGNibGstPnNlZ3MsIGNibGstPm1fY3VycmVudF9tYXhfc2VncyAqIHNpemVvZihvcGpfdGNkX3NlZ190KSk7CisgICAgICAgICAgICAgICAgaWYoISBuZXdfc2VncykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUoY2Jsay0+c2Vncyk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYmxrLT5zZWdzID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPm1fY3VycmVudF9tYXhfc2VncyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gaW5pdGlhbGl6ZSBzZWdtZW50ICVkXG4iLCBsX25iX3NlZ3MpOyAqLworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2Jsay0+c2VncyA9IG5ld19zZWdzOworICAgICAgICB9CisKKyAgICAgICAgc2VnID0gJmNibGstPnNlZ3NbaW5kZXhdOworICAgICAgICBtZW1zZXQoc2VnLDAsc2l6ZW9mKG9wal90Y2Rfc2VnX3QpKTsKKworICAgICAgICBpZiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9URVJNQUxMKSB7CisgICAgICAgICAgICAgICAgc2VnLT5tYXhwYXNzZXMgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfTEFaWSkgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VnLT5tYXhwYXNzZXMgPSAxMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VnLT5tYXhwYXNzZXMgPSAoKChzZWcgLSAxKS0+bWF4cGFzc2VzID09IDEpIHx8ICgoc2VnIC0gMSktPm1heHBhc3NlcyA9PSAxMCkpID8gMiA6IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlZy0+bWF4cGFzc2VzID0gMTA5OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90Mi5oIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNjUyZWUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3QyLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKKyAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKKyAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKKyAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgVW5pdmVyc2l0ZSBjYXRob2xpcXVlIGRlIExvdXZhaW4gKFVDTCksIEJlbGdpdW0KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBQcm9mZXNzb3IgQmVub2l0IE1hY3EKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzLCBEYXZpZCBKYW5zc2VucworICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIFlhbm5pY2sgVmVyc2NodWVyZW4KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eCAKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE0LCBBbnRvbmluIERlc2NhbXBlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMS0yMDEyLCBDZW50cmUgTmF0aW9uYWwgZCdFdHVkZXMgU3BhdGlhbGVzIChDTkVTKSwgRlIgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENTIFN5c3RlbWVzIGQnSW5mb3JtYXRpb24sIEZyYW5jZQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBfX1QyX0gKKyNkZWZpbmUgX19UMl9ICisvKioKK0BmaWxlIHQyLmgKK0BicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBhIHRpZXItMiBjb2RpbmcgKHBhY2tldGl6YXRpb24gb2YgY29kZS1ibG9jayBkYXRhKSAoVDIpCisKKyovCisKKy8qKiBAZGVmZ3JvdXAgVDIgVDIgLSBJbXBsZW1lbnRhdGlvbiBvZiBhIHRpZXItMiBjb2RpbmcgKi8KKy8qQHsqLworCisvKioKK1RpZXItMiBjb2RpbmcKKyovCit0eXBlZGVmIHN0cnVjdCBvcGpfdDIgeworCisJLyoqIEVuY29kaW5nOiBwb2ludGVyIHRvIHRoZSBzcmMgaW1hZ2UuIERlY29kaW5nOiBwb2ludGVyIHRvIHRoZSBkc3QgaW1hZ2UuICovCisJb3BqX2ltYWdlX3QgKmltYWdlOworCS8qKiBwb2ludGVyIHRvIHRoZSBpbWFnZSBjb2RpbmcgcGFyYW1ldGVycyAqLworCW9wal9jcF90ICpjcDsKK30gb3BqX3QyX3Q7CisKKy8qKiBAbmFtZSBFeHBvcnRlZCBmdW5jdGlvbnMgKi8KKy8qQHsqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCitFbmNvZGUgdGhlIHBhY2tldHMgb2YgYSB0aWxlIHRvIGEgZGVzdGluYXRpb24gYnVmZmVyCitAcGFyYW0gdDIgICAgICAgICAgICAgICBUMiBoYW5kbGUKK0BwYXJhbSB0aWxlbm8gICAgICAgICAgIG51bWJlciBvZiB0aGUgdGlsZSBlbmNvZGVkCitAcGFyYW0gdGlsZSAgICAgICAgICAgICB0aGUgdGlsZSBmb3Igd2hpY2ggdG8gd3JpdGUgdGhlIHBhY2tldHMKK0BwYXJhbSBtYXhsYXllcnMgICAgICAgIG1heGltdW0gbnVtYmVyIG9mIGxheWVycworQHBhcmFtIGRlc3QgICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorQHBhcmFtIHBfZGF0YV93cml0dGVuICAgRklYTUUgRE9DCitAcGFyYW0gbGVuICAgICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKK0BwYXJhbSBjc3RyX2luZm8gICAgICAgIENvZGVzdHJlYW0gaW5mb3JtYXRpb24gc3RydWN0dXJlCitAcGFyYW0gdHBudW0gICAgICAgICAgICBUaWxlIHBhcnQgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHRpbGUKK0BwYXJhbSB0cHBvcyAgICAgICAgICAgIFRoZSBwb3NpdGlvbiBvZiB0aGUgdGlsZSBwYXJ0IGZsYWcgaW4gdGhlIHByb2dyZXNzaW9uIG9yZGVyCitAcGFyYW0gcGlubyAgICAgICAgICAgICBGSVhNRSBET0MKK0BwYXJhbSB0Ml9tb2RlICAgICAgICAgIElmID09IDAgSW4gVGhyZXNob2xkIGNhbGN1bGF0aW9uICxJZiA9PSAxIEZpbmFsIHBhc3MKKyovCitPUEpfQk9PTCBvcGpfdDJfZW5jb2RlX3BhY2tldHMoCW9wal90Ml90KiB0MiwKKwkJCQkJCQkJT1BKX1VJTlQzMiB0aWxlbm8sCisJCQkJCQkJCW9wal90Y2RfdGlsZV90ICp0aWxlLAorCQkJCQkJCQlPUEpfVUlOVDMyIG1heGxheWVycywKKwkJCQkJCQkJT1BKX0JZVEUgKmRlc3QsCisJCQkJCQkJCU9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKKwkJCQkJCQkJT1BKX1VJTlQzMiBsZW4sCisJCQkJCQkJCW9wal9jb2Rlc3RyZWFtX2luZm9fdCAqY3N0cl9pbmZvLAorCQkJCQkJCQlPUEpfVUlOVDMyIHRwbnVtLAorCQkJCQkJCQlPUEpfSU5UMzIgdHBwb3MsCisJCQkJCQkJCU9QSl9VSU5UMzIgcGlubywKKwkJCQkJCQkJSjJLX1QyX01PREUgdDJfbW9kZSk7CisKKy8qKgorRGVjb2RlIHRoZSBwYWNrZXRzIG9mIGEgdGlsZSBmcm9tIGEgc291cmNlIGJ1ZmZlcgorQHBhcmFtIHQyIFQyIGhhbmRsZQorQHBhcmFtIHRpbGVubyBudW1iZXIgdGhhdCBpZGVudGlmaWVzIHRoZSB0aWxlIGZvciB3aGljaCB0byBkZWNvZGUgdGhlIHBhY2tldHMKK0BwYXJhbSB0aWxlIHRpbGUgZm9yIHdoaWNoIHRvIGRlY29kZSB0aGUgcGFja2V0cworQHBhcmFtIHNyYyAgICAgICAgIEZJWE1FIERPQworQHBhcmFtIHBfZGF0YV9yZWFkIHRoZSBzb3VyY2UgYnVmZmVyCitAcGFyYW0gbGVuIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlcgorQHBhcmFtIGNzdHJfaW5mbyAgIEZJWE1FIERPQworCitAcmV0dXJuIEZJWE1FIERPQworICovCitPUEpfQk9PTCBvcGpfdDJfZGVjb2RlX3BhY2tldHMoCW9wal90Ml90ICp0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0aWxlbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICp0aWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmRleF90ICpjc3RyX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyKTsKKworLyoqCisgKiBDcmVhdGVzIGEgVGllciAyIGhhbmRsZQorICoKKyAqIEBwYXJhbQlwX2ltYWdlCQlTb3VyY2Ugb3IgZGVzdGluYXRpb24gaW1hZ2UKKyAqIEBwYXJhbQlwX2NwCQlJbWFnZSBjb2RpbmcgcGFyYW1ldGVycy4KKyAqIEByZXR1cm4JCWEgbmV3IFQyIGhhbmRsZSBpZiBzdWNjZXNzZnVsLCBOVUxMIG90aGVyd2lzZS4KKyovCitvcGpfdDJfdCogb3BqX3QyX2NyZWF0ZShvcGpfaW1hZ2VfdCAqcF9pbWFnZSwgb3BqX2NwX3QgKnBfY3ApOworCisvKioKK0Rlc3Ryb3kgYSBUMiBoYW5kbGUKK0BwYXJhbSB0MiBUMiBoYW5kbGUgdG8gZGVzdHJveQorKi8KK3ZvaWQgb3BqX3QyX2Rlc3Ryb3kob3BqX3QyX3QgKnQyKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qQH0qLworCisvKkB9Ki8KKworI2VuZGlmIC8qIF9fVDJfSCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90Y2QuYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdGNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWViZTliZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdGNkLmMKQEAgLTAsMCArMSwyMjA1IEBACisvKgorICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCisgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFVuaXZlcnNpdGUgY2F0aG9saXF1ZSBkZSBMb3V2YWluIChVQ0wpLCBCZWxnaXVtCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQorICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNywgUGFydmF0aGEgRWxhbmdvdmFuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZSIAorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDUyBTeXN0ZW1lcyBkJ0luZm9ybWF0aW9uLCBGcmFuY2UKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgQVMgSVMnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIm9wal9pbmNsdWRlcy5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBUT0RPIE1TRDogKi8KKyNpZmRlZiBUT0RPX01TRCAKK3ZvaWQgdGNkX2R1bXAoRklMRSAqZmQsIG9wal90Y2RfdCAqdGNkLCBvcGpfdGNkX2ltYWdlX3QgKiBpbWcpIHsKKyAgICAgICAgaW50IHRpbGVubywgY29tcG5vLCByZXNubywgYmFuZG5vLCBwcmVjbm87LyosIGNibGtubzsqLworCisgICAgICAgIGZwcmludGYoZmQsICJpbWFnZSB7XG4iKTsKKyAgICAgICAgZnByaW50ZihmZCwgIiAgdHc9JWQsIHRoPSVkIHgwPSVkIHgxPSVkIHkwPSVkIHkxPSVkXG4iLCAKKyAgICAgICAgICAgICAgICBpbWctPnR3LCBpbWctPnRoLCB0Y2QtPmltYWdlLT54MCwgdGNkLT5pbWFnZS0+eDEsIHRjZC0+aW1hZ2UtPnkwLCB0Y2QtPmltYWdlLT55MSk7CisKKyAgICAgICAgZm9yICh0aWxlbm8gPSAwOyB0aWxlbm8gPCBpbWctPnRoICogaW1nLT50dzsgdGlsZW5vKyspIHsKKyAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVfdCAqdGlsZSA9ICZ0Y2QtPnRjZF9pbWFnZS0+dGlsZXNbdGlsZW5vXTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICB0aWxlIHtcbiIpOworICAgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgeDA9JWQsIHkwPSVkLCB4MT0lZCwgeTE9JWQsIG51bWNvbXBzPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdGlsZS0+eDAsIHRpbGUtPnkwLCB0aWxlLT54MSwgdGlsZS0+eTEsIHRpbGUtPm51bWNvbXBzKTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHRpbGUtPm51bWNvbXBzOyBjb21wbm8rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlY29tcF90ICp0aWxlYyA9ICZ0aWxlLT5jb21wc1tjb21wbm9dOworICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgICB0aWxlYyB7XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICB4MD0lZCwgeTA9JWQsIHgxPSVkLCB5MT0lZCwgbnVtcmVzb2x1dGlvbnM9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVjLT54MCwgdGlsZWMtPnkwLCB0aWxlYy0+eDEsIHRpbGVjLT55MSwgdGlsZWMtPm51bXJlc29sdXRpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocmVzbm8gPSAwOyByZXNubyA8IHRpbGVjLT5udW1yZXNvbHV0aW9uczsgcmVzbm8rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCAqcmVzID0gJnRpbGVjLT5yZXNvbHV0aW9uc1tyZXNub107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmQsICJcbiAgIHJlcyB7XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgIHgwPSVkLCB5MD0lZCwgeDE9JWQsIHkxPSVkLCBwdz0lZCwgcGg9JWQsIG51bWJhbmRzPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy0+eDAsIHJlcy0+eTAsIHJlcy0+eDEsIHJlcy0+eTEsIHJlcy0+cHcsIHJlcy0+cGgsIHJlcy0+bnVtYmFuZHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IHJlcy0+bnVtYmFuZHM7IGJhbmRubysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9iYW5kX3QgKmJhbmQgPSAmcmVzLT5iYW5kc1tiYW5kbm9dOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgICAgIGJhbmQge1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgeDA9JWQsIHkwPSVkLCB4MT0lZCwgeTE9JWQsIHN0ZXBzaXplPSVmLCBudW1icHM9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kLT54MCwgYmFuZC0+eTAsIGJhbmQtPngxLCBiYW5kLT55MSwgYmFuZC0+c3RlcHNpemUsIGJhbmQtPm51bWJwcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChwcmVjbm8gPSAwOyBwcmVjbm8gPCByZXMtPnB3ICogcmVzLT5waDsgcHJlY25vKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfcHJlY2luY3RfdCAqcHJlYyA9ICZiYW5kLT5wcmVjaW5jdHNbcHJlY25vXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgICAgICAgcHJlYyB7XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICB4MD0lZCwgeTA9JWQsIHgxPSVkLCB5MT0lZCwgY3c9JWQsIGNoPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjLT54MCwgcHJlYy0+eTAsIHByZWMtPngxLCBwcmVjLT55MSwgcHJlYy0+Y3csIHByZWMtPmNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IHByZWMtPmN3ICogcHJlYy0+Y2g7IGNibGtubysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfY2Jsa190ICpjYmxrID0gJnByZWMtPmNibGtzW2NibGtub107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgICAgICAgICBjYmxrIHtcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIHgwPSVkLCB5MD0lZCwgeDE9JWQsIHkxPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPngwLCBjYmxrLT55MCwgY2Jsay0+eDEsIGNibGstPnkxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgICAgICAgICAgIH1cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgICAgICAgfVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgICAgIH1cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgICB9XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgfVxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgIH1cbiIpOworICAgICAgICB9CisgICAgICAgIGZwcmludGYoZmQsICJ9XG4iKTsKK30KKyNlbmRpZgorCisvKioKKyAqIEluaXRpYWxpemVzIHRpbGUgY29kaW5nL2RlY29kaW5nCisgKi8KK3N0YXRpYyBJTkxJTkUgT1BKX0JPT0wgb3BqX3RjZF9pbml0X3RpbGUob3BqX3RjZF90ICpwX3RjZCwgT1BKX1VJTlQzMiBwX3RpbGVfbm8sIE9QSl9CT09MIGlzRW5jb2RlciwgT1BKX0ZMT0FUMzIgZnJhY3Rpb24sIE9QSl9TSVpFX1Qgc2l6ZW9mX2Jsb2NrLCBvcGpfZXZlbnRfbWdyX3QqIG1hbmFnZXIpOworCisvKioKKyogQWxsb2NhdGVzIG1lbW9yeSBmb3IgYSBkZWNvZGluZyBjb2RlIGJsb2NrLgorKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX2NvZGVfYmxvY2tfZGVjX2FsbG9jYXRlIChvcGpfdGNkX2NibGtfZGVjX3QgKiBwX2NvZGVfYmxvY2spOworCisvKioKKyAqIERlYWxsb2NhdGVzIHRoZSBkZWNvZGluZyBkYXRhIG9mIHRoZSBnaXZlbiBwcmVjaW5jdC4KKyAqLworc3RhdGljIHZvaWQgb3BqX3RjZF9jb2RlX2Jsb2NrX2RlY19kZWFsbG9jYXRlIChvcGpfdGNkX3ByZWNpbmN0X3QgKiBwX3ByZWNpbmN0KTsKKworLyoqCisgKiBBbGxvY2F0ZXMgbWVtb3J5IGZvciBhbiBlbmNvZGluZyBjb2RlIGJsb2NrIChidXQgbm90IGRhdGEpLgorICovCitzdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF9jb2RlX2Jsb2NrX2VuY19hbGxvY2F0ZSAob3BqX3RjZF9jYmxrX2VuY190ICogcF9jb2RlX2Jsb2NrKTsKKworLyoqCisgKiBBbGxvY2F0ZXMgZGF0YSBmb3IgYW4gZW5jb2RpbmcgY29kZSBibG9jaworICovCitzdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF9jb2RlX2Jsb2NrX2VuY19hbGxvY2F0ZV9kYXRhIChvcGpfdGNkX2NibGtfZW5jX3QgKiBwX2NvZGVfYmxvY2spOworCisvKioKKyAqIERlYWxsb2NhdGVzIHRoZSBlbmNvZGluZyBkYXRhIG9mIHRoZSBnaXZlbiBwcmVjaW5jdC4KKyAqLworc3RhdGljIHZvaWQgb3BqX3RjZF9jb2RlX2Jsb2NrX2VuY19kZWFsbG9jYXRlIChvcGpfdGNkX3ByZWNpbmN0X3QgKiBwX3ByZWNpbmN0KTsKKworCisvKioKK0ZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGVuY29kaW5nCitAcGFyYW0gdGNkIFRDRCBoYW5kbGUKKyovCitzdGF0aWMgdm9pZCBvcGpfdGNkX2ZyZWVfdGlsZShvcGpfdGNkX3QgKnRjZCk7CisKKworc3RhdGljIE9QSl9CT09MIG9wal90Y2RfdDJfZGVjb2RlICggb3BqX3RjZF90ICpwX3RjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9zcmNfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmRleF90ICpwX2NzdHJfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcik7CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX3QxX2RlY29kZSAob3BqX3RjZF90ICpwX3RjZCk7CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX2R3dF9kZWNvZGUgKG9wal90Y2RfdCAqcF90Y2QpOworCitzdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF9tY3RfZGVjb2RlIChvcGpfdGNkX3QgKnBfdGNkLCBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcik7CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX2RjX2xldmVsX3NoaWZ0X2RlY29kZSAob3BqX3RjZF90ICpwX3RjZCk7CisKKworc3RhdGljIE9QSl9CT09MIG9wal90Y2RfZGNfbGV2ZWxfc2hpZnRfZW5jb2RlICggb3BqX3RjZF90ICpwX3RjZCApOworCitzdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF9tY3RfZW5jb2RlICggb3BqX3RjZF90ICpwX3RjZCApOworCitzdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF9kd3RfZW5jb2RlICggb3BqX3RjZF90ICpwX3RjZCApOworCitzdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF90MV9lbmNvZGUgKCBvcGpfdGNkX3QgKnBfdGNkICk7CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX3QyX2VuY29kZSAoICAgICBvcGpfdGNkX3QgKnBfdGNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGVzdF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfZGVzdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmZvX3QgKnBfY3N0cl9pbmZvICk7CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX3JhdGVfYWxsb2NhdGVfZW5jb2RlKCAgIG9wal90Y2RfdCAqcF90Y2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2Rlc3RfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X2Rlc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmZvX3QgKnBfY3N0cl9pbmZvICk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorQ3JlYXRlIGEgbmV3IFRDRCBoYW5kbGUKKyovCitvcGpfdGNkX3QqIG9wal90Y2RfY3JlYXRlKE9QSl9CT09MIHBfaXNfZGVjb2RlcikKK3sKKyAgICAgICAgb3BqX3RjZF90ICpsX3RjZCA9IDAwOworCisgICAgICAgIC8qIGNyZWF0ZSB0aGUgdGNkIHN0cnVjdHVyZSAqLworICAgICAgICBsX3RjZCA9IChvcGpfdGNkX3QqKSBvcGpfY2FsbG9jKDEsc2l6ZW9mKG9wal90Y2RfdCkpOworICAgICAgICBpZiAoIWxfdGNkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDAwOworICAgICAgICB9CisKKyAgICAgICAgbF90Y2QtPm1faXNfZGVjb2RlciA9IHBfaXNfZGVjb2RlciA/IDEgOiAwOworCisgICAgICAgIGxfdGNkLT50Y2RfaW1hZ2UgPSAob3BqX3RjZF9pbWFnZV90KilvcGpfY2FsbG9jKDEsc2l6ZW9mKG9wal90Y2RfaW1hZ2VfdCkpOworICAgICAgICBpZiAoIWxfdGNkLT50Y2RfaW1hZ2UpIHsKKyAgICAgICAgICAgICAgICBvcGpfZnJlZShsX3RjZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDAwOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxfdGNkOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgb3BqX3RjZF9yYXRlYWxsb2NhdGVfZml4ZWQob3BqX3RjZF90ICp0Y2QpIHsKKyAgICAgICAgT1BKX1VJTlQzMiBsYXlubzsKKworICAgICAgICBmb3IgKGxheW5vID0gMDsgbGF5bm8gPCB0Y2QtPnRjcC0+bnVtbGF5ZXJzOyBsYXlubysrKSB7CisgICAgICAgICAgICAgICAgb3BqX3RjZF9tYWtlbGF5ZXJfZml4ZWQodGNkLCBsYXlubywgMSk7CisgICAgICAgIH0KK30KKworCit2b2lkIG9wal90Y2RfbWFrZWxheWVyKCBvcGpfdGNkX3QgKnRjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbGF5bm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQ2NCB0aHJlc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGZpbmFsKQoreworICAgICAgICBPUEpfVUlOVDMyIGNvbXBubywgcmVzbm8sIGJhbmRubywgcHJlY25vLCBjYmxrbm87CisgICAgICAgIE9QSl9VSU5UMzIgcGFzc25vOworCisgICAgICAgIG9wal90Y2RfdGlsZV90ICp0Y2RfdGlsZSA9IHRjZC0+dGNkX2ltYWdlLT50aWxlczsKKworICAgICAgICB0Y2RfdGlsZS0+ZGlzdG9sYXllcltsYXlub10gPSAwOyAgICAgICAgLyogZml4ZWRfcXVhbGl0eSAqLworCisgICAgICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgdGNkX3RpbGUtPm51bWNvbXBzOyBjb21wbm8rKykgeworICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqdGlsZWMgPSAmdGNkX3RpbGUtPmNvbXBzW2NvbXBub107CisKKyAgICAgICAgICAgICAgICBmb3IgKHJlc25vID0gMDsgcmVzbm8gPCB0aWxlYy0+bnVtcmVzb2x1dGlvbnM7IHJlc25vKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90ICpyZXMgPSAmdGlsZWMtPnJlc29sdXRpb25zW3Jlc25vXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChiYW5kbm8gPSAwOyBiYW5kbm8gPCByZXMtPm51bWJhbmRzOyBiYW5kbm8rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX2JhbmRfdCAqYmFuZCA9ICZyZXMtPmJhbmRzW2JhbmRub107CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChwcmVjbm8gPSAwOyBwcmVjbm8gPCByZXMtPnB3ICogcmVzLT5waDsgcHJlY25vKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3ByZWNpbmN0X3QgKnByYyA9ICZiYW5kLT5wcmVjaW5jdHNbcHJlY25vXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY2Jsa25vID0gMDsgY2Jsa25vIDwgcHJjLT5jdyAqIHByYy0+Y2g7IGNibGtubysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX2NibGtfZW5jX3QgKmNibGsgPSAmcHJjLT5jYmxrcy5lbmNbY2Jsa25vXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfbGF5ZXJfdCAqbGF5ZXIgPSAmY2Jsay0+bGF5ZXJzW2xheW5vXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxheW5vID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jsay0+bnVtcGFzc2VzaW5sYXllcnMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gY2Jsay0+bnVtcGFzc2VzaW5sYXllcnM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocGFzc25vID0gY2Jsay0+bnVtcGFzc2VzaW5sYXllcnM7IHBhc3NubyA8IGNibGstPnRvdGFscGFzc2VzOyBwYXNzbm8rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGRyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQ2NCBkZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9wYXNzX3QgKnBhc3MgPSAmY2Jsay0+cGFzc2VzW3Bhc3Nub107CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyID0gcGFzcy0+cmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZCA9IHBhc3MtPmRpc3RvcnRpb25kZWM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHIgPSBwYXNzLT5yYXRlIC0gY2Jsay0+cGFzc2VzW24gLSAxXS5yYXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkID0gcGFzcy0+ZGlzdG9ydGlvbmRlYyAtIGNibGstPnBhc3Nlc1tuIC0gMV0uZGlzdG9ydGlvbmRlYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGQgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBwYXNzbm8gKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlc2ggLSAoZGQgLyBkcikgPCBEQkxfRVBTSUxPTikgLyogZG8gbm90IHJlbHkgb24gZmxvYXQgZXF1YWxpdHksIGNoZWNrIHdpdGggREJMX0VQU0lMT04gbWFyZ2luICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHBhc3NubyArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5udW1wYXNzZXMgPSBuIC0gY2Jsay0+bnVtcGFzc2VzaW5sYXllcnM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGF5ZXItPm51bXBhc3NlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci0+ZGlzdG8gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNibGstPm51bXBhc3Nlc2lubGF5ZXJzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXItPmxlbiA9IGNibGstPnBhc3Nlc1tuIC0gMV0ucmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXItPmRhdGEgPSBjYmxrLT5kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci0+ZGlzdG8gPSBjYmxrLT5wYXNzZXNbbiAtIDFdLmRpc3RvcnRpb25kZWM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci0+bGVuID0gY2Jsay0+cGFzc2VzW24gLSAxXS5yYXRlIC0gY2Jsay0+cGFzc2VzW2NibGstPm51bXBhc3Nlc2lubGF5ZXJzIC0gMV0ucmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXItPmRhdGEgPSBjYmxrLT5kYXRhICsgY2Jsay0+cGFzc2VzW2NibGstPm51bXBhc3Nlc2lubGF5ZXJzIC0gMV0ucmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXItPmRpc3RvID0gY2Jsay0+cGFzc2VzW24gLSAxXS5kaXN0b3J0aW9uZGVjIC0gY2Jsay0+cGFzc2VzW2NibGstPm51bXBhc3Nlc2lubGF5ZXJzIC0gMV0uZGlzdG9ydGlvbmRlYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNkX3RpbGUtPmRpc3RvbGF5ZXJbbGF5bm9dICs9IGxheWVyLT5kaXN0bzsgICAgLyogZml4ZWRfcXVhbGl0eSAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluYWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPm51bXBhc3Nlc2lubGF5ZXJzID0gbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KK30KKwordm9pZCBvcGpfdGNkX21ha2VsYXllcl9maXhlZChvcGpfdGNkX3QgKnRjZCwgT1BKX1VJTlQzMiBsYXlubywgT1BKX1VJTlQzMiBmaW5hbCkgeworICAgICAgICBPUEpfVUlOVDMyIGNvbXBubywgcmVzbm8sIGJhbmRubywgcHJlY25vLCBjYmxrbm87CisgICAgICAgIE9QSl9JTlQzMiB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAvKiwgbWF0cmljZVt0Y2RfdGNwLT5udW1sYXllcnNdW3RjZF90aWxlLT5jb21wc1swXS5udW1yZXNvbHV0aW9uc11bM107ICovCisgICAgICAgIE9QSl9JTlQzMiBtYXRyaWNlWzEwXVsxMF1bM107CisgICAgICAgIE9QSl9VSU5UMzIgaSwgaiwgazsKKworICAgICAgICBvcGpfY3BfdCAqY3AgPSB0Y2QtPmNwOworICAgICAgICBvcGpfdGNkX3RpbGVfdCAqdGNkX3RpbGUgPSB0Y2QtPnRjZF9pbWFnZS0+dGlsZXM7CisgICAgICAgIG9wal90Y3BfdCAqdGNkX3RjcCA9IHRjZC0+dGNwOworCisgICAgICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgdGNkX3RpbGUtPm51bWNvbXBzOyBjb21wbm8rKykgeworICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqdGlsZWMgPSAmdGNkX3RpbGUtPmNvbXBzW2NvbXBub107CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGNkX3RjcC0+bnVtbGF5ZXJzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB0aWxlYy0+bnVtcmVzb2x1dGlvbnM7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMzsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cmljZVtpXVtqXVtrXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0lOVDMyKSAoKE9QSl9GTE9BVDMyKWNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fbWF0cmljZVtpICogdGlsZWMtPm51bXJlc29sdXRpb25zICogMyArIGogKiAzICsga10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKE9QSl9GTE9BVDMyKSAodGNkLT5pbWFnZS0+Y29tcHNbY29tcG5vXS5wcmVjIC8gMTYuMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChyZXNubyA9IDA7IHJlc25vIDwgdGlsZWMtPm51bXJlc29sdXRpb25zOyByZXNubysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCAqcmVzID0gJnRpbGVjLT5yZXNvbHV0aW9uc1tyZXNub107CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgcmVzLT5udW1iYW5kczsgYmFuZG5vKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9iYW5kX3QgKmJhbmQgPSAmcmVzLT5iYW5kc1tiYW5kbm9dOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocHJlY25vID0gMDsgcHJlY25vIDwgcmVzLT5wdyAqIHJlcy0+cGg7IHByZWNubysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9wcmVjaW5jdF90ICpwcmMgPSAmYmFuZC0+cHJlY2luY3RzW3ByZWNub107CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IHByYy0+Y3cgKiBwcmMtPmNoOyBjYmxrbm8rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9jYmxrX2VuY190ICpjYmxrID0gJnByYy0+Y2Jsa3MuZW5jW2NibGtub107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX2xheWVyX3QgKmxheWVyID0gJmNibGstPmxheWVyc1tsYXlub107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgaW1zYiA9IChPUEpfSU5UMzIpKHRjZC0+aW1hZ2UtPmNvbXBzW2NvbXBub10ucHJlYyAtIGNibGstPm51bWJwcyk7IC8qIG51bWJlciBvZiBiaXQtcGxhbiBlcXVhbCB0byB6ZXJvICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvcnJlY3Rpb24gb2YgdGhlIG1hdHJpeCBvZiBjb2VmZmljaWVudCB0byBpbmNsdWRlIHRoZSBJTVNCIGluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF5bm8gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1hdHJpY2VbbGF5bm9dW3Jlc25vXVtiYW5kbm9dOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1zYiA+PSB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAtPSBpbXNiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1hdHJpY2VbbGF5bm9dW3Jlc25vXVtiYW5kbm9dIC0gbWF0cmljZVtsYXlubyAtIDFdW3Jlc25vXVtiYW5kbm9dOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1zYiA+PSBtYXRyaWNlW2xheW5vIC0gMV1bcmVzbm9dW2JhbmRub10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAtPSAoaW1zYiAtIG1hdHJpY2VbbGF5bm8gLSAxXVtyZXNub11bYmFuZG5vXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF5bm8gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYmxrLT5udW1wYXNzZXNpbmxheWVycyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBjYmxrLT5udW1wYXNzZXNpbmxheWVyczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYmxrLT5udW1wYXNzZXNpbmxheWVycyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IDMgKiAoT1BKX1VJTlQzMil2YWx1ZSAtIDIgKyBjYmxrLT5udW1wYXNzZXNpbmxheWVyczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gY2Jsay0+bnVtcGFzc2VzaW5sYXllcnM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAzICogKE9QSl9VSU5UMzIpdmFsdWUgKyBjYmxrLT5udW1wYXNzZXNpbmxheWVyczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXItPm51bXBhc3NlcyA9IG4gLSBjYmxrLT5udW1wYXNzZXNpbmxheWVyczsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXllci0+bnVtcGFzc2VzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNibGstPm51bXBhc3Nlc2lubGF5ZXJzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXItPmxlbiA9IGNibGstPnBhc3Nlc1tuIC0gMV0ucmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXItPmRhdGEgPSBjYmxrLT5kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXItPmxlbiA9IGNibGstPnBhc3Nlc1tuIC0gMV0ucmF0ZSAtIGNibGstPnBhc3Nlc1tjYmxrLT5udW1wYXNzZXNpbmxheWVycyAtIDFdLnJhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5kYXRhID0gY2Jsay0+ZGF0YSArIGNibGstPnBhc3Nlc1tjYmxrLT5udW1wYXNzZXNpbmxheWVycyAtIDFdLnJhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5hbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jsay0+bnVtcGFzc2VzaW5sYXllcnMgPSBuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorfQorCitPUEpfQk9PTCBvcGpfdGNkX3JhdGVhbGxvY2F0ZSggIG9wal90Y2RfdCAqdGNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmZvX3QgKmNzdHJfaW5mbykKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBjb21wbm8sIHJlc25vLCBiYW5kbm8sIHByZWNubywgY2Jsa25vLCBsYXlubzsKKyAgICAgICAgT1BKX1VJTlQzMiBwYXNzbm87CisgICAgICAgIE9QSl9GTE9BVDY0IG1pbiwgbWF4OworICAgICAgICBPUEpfRkxPQVQ2NCBjdW1kaXN0b1sxMDBdOyAgICAgIC8qIGZpeGVkX3F1YWxpdHkgKi8KKyAgICAgICAgY29uc3QgT1BKX0ZMT0FUNjQgSyA9IDE7ICAgICAgICAgICAgICAgIC8qIDEuMTsgZml4ZWRfcXVhbGl0eSAqLworICAgICAgICBPUEpfRkxPQVQ2NCBtYXhTRSA9IDA7CisKKyAgICAgICAgb3BqX2NwX3QgKmNwID0gdGNkLT5jcDsKKyAgICAgICAgb3BqX3RjZF90aWxlX3QgKnRjZF90aWxlID0gdGNkLT50Y2RfaW1hZ2UtPnRpbGVzOworICAgICAgICBvcGpfdGNwX3QgKnRjZF90Y3AgPSB0Y2QtPnRjcDsKKworICAgICAgICBtaW4gPSBEQkxfTUFYOworICAgICAgICBtYXggPSAwOworCisgICAgICAgIHRjZF90aWxlLT5udW1waXggPSAwOyAgICAgICAgICAgLyogZml4ZWRfcXVhbGl0eSAqLworCisgICAgICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgdGNkX3RpbGUtPm51bWNvbXBzOyBjb21wbm8rKykgeworICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqdGlsZWMgPSAmdGNkX3RpbGUtPmNvbXBzW2NvbXBub107CisgICAgICAgICAgICAgICAgdGlsZWMtPm51bXBpeCA9IDA7CisKKyAgICAgICAgICAgICAgICBmb3IgKHJlc25vID0gMDsgcmVzbm8gPCB0aWxlYy0+bnVtcmVzb2x1dGlvbnM7IHJlc25vKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90ICpyZXMgPSAmdGlsZWMtPnJlc29sdXRpb25zW3Jlc25vXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChiYW5kbm8gPSAwOyBiYW5kbm8gPCByZXMtPm51bWJhbmRzOyBiYW5kbm8rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX2JhbmRfdCAqYmFuZCA9ICZyZXMtPmJhbmRzW2JhbmRub107CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChwcmVjbm8gPSAwOyBwcmVjbm8gPCByZXMtPnB3ICogcmVzLT5waDsgcHJlY25vKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3ByZWNpbmN0X3QgKnByYyA9ICZiYW5kLT5wcmVjaW5jdHNbcHJlY25vXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY2Jsa25vID0gMDsgY2Jsa25vIDwgcHJjLT5jdyAqIHByYy0+Y2g7IGNibGtubysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX2NibGtfZW5jX3QgKmNibGsgPSAmcHJjLT5jYmxrcy5lbmNbY2Jsa25vXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChwYXNzbm8gPSAwOyBwYXNzbm8gPCBjYmxrLT50b3RhbHBhc3NlczsgcGFzc25vKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9wYXNzX3QgKnBhc3MgPSAmY2Jsay0+cGFzc2VzW3Bhc3Nub107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBkcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUNjQgZGQsIHJkc2xvcGU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NubyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHIgPSAoT1BKX0lOVDMyKXBhc3MtPnJhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGQgPSBwYXNzLT5kaXN0b3J0aW9uZGVjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyID0gKE9QSl9JTlQzMikocGFzcy0+cmF0ZSAtIGNibGstPnBhc3Nlc1twYXNzbm8gLSAxXS5yYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZCA9IHBhc3MtPmRpc3RvcnRpb25kZWMgLSBjYmxrLT5wYXNzZXNbcGFzc25vIC0gMV0uZGlzdG9ydGlvbmRlYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkciA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZHNsb3BlID0gZGQgLyBkcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJkc2xvcGUgPCBtaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4gPSByZHNsb3BlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJkc2xvcGUgPiBtYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXggPSByZHNsb3BlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8qIHBhc3NubyAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXhlZF9xdWFsaXR5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2RfdGlsZS0+bnVtcGl4ICs9ICgoY2Jsay0+eDEgLSBjYmxrLT54MCkgKiAoY2Jsay0+eTEgLSBjYmxrLT55MCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZWMtPm51bXBpeCArPSAoKGNibGstPngxIC0gY2Jsay0+eDApICogKGNibGstPnkxIC0gY2Jsay0+eTApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8qIGNia2xubyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8qIHByZWNubyAqLworICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBiYW5kbm8gKi8KKyAgICAgICAgICAgICAgICB9IC8qIHJlc25vICovCisKKyAgICAgICAgICAgICAgICBtYXhTRSArPSAoKChPUEpfRkxPQVQ2NCkoMSA8PCB0Y2QtPmltYWdlLT5jb21wc1tjb21wbm9dLnByZWMpIC0gMS4wKQorICAgICAgICAgICAgICAgICAgICAgICAgKiAoKE9QSl9GTE9BVDY0KSgxIDw8IHRjZC0+aW1hZ2UtPmNvbXBzW2NvbXBub10ucHJlYykgLTEuMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAqICgoT1BKX0ZMT0FUNjQpKHRpbGVjLT5udW1waXgpKTsKKyAgICAgICAgfSAvKiBjb21wbm8gKi8KKworICAgICAgICAvKiBpbmRleCBmaWxlICovCisgICAgICAgIGlmKGNzdHJfaW5mbykgeworICAgICAgICAgICAgICAgIG9wal90aWxlX2luZm9fdCAqdGlsZV9pbmZvID0gJmNzdHJfaW5mby0+dGlsZVt0Y2QtPnRjZF90aWxlbm9dOworICAgICAgICAgICAgICAgIHRpbGVfaW5mby0+bnVtcGl4ID0gdGNkX3RpbGUtPm51bXBpeDsKKyAgICAgICAgICAgICAgICB0aWxlX2luZm8tPmRpc3RvdGlsZSA9IHRjZF90aWxlLT5kaXN0b3RpbGU7CisgICAgICAgICAgICAgICAgdGlsZV9pbmZvLT50aHJlc2ggPSAoT1BKX0ZMT0FUNjQgKikgb3BqX21hbGxvYyh0Y2RfdGNwLT5udW1sYXllcnMgKiBzaXplb2YoT1BKX0ZMT0FUNjQpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXRpbGVfaW5mby0+dGhyZXNoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBGSVhNRSBldmVudCBtYW5hZ2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAobGF5bm8gPSAwOyBsYXlubyA8IHRjZF90Y3AtPm51bWxheWVyczsgbGF5bm8rKykgeworICAgICAgICAgICAgICAgIE9QSl9GTE9BVDY0IGxvID0gbWluOworICAgICAgICAgICAgICAgIE9QSl9GTE9BVDY0IGhpID0gbWF4OworICAgICAgICAgICAgICAgIE9QSl9CT09MIHN1Y2Nlc3MgPSBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBtYXhsZW4gPSB0Y2RfdGNwLT5yYXRlc1tsYXlub10gPyBvcGpfdWludF9taW4oKChPUEpfVUlOVDMyKSBjZWlsKHRjZF90Y3AtPnJhdGVzW2xheW5vXSkpLCBsZW4pIDogbGVuOworICAgICAgICAgICAgICAgIE9QSl9GTE9BVDY0IGdvb2R0aHJlc2ggPSAwOworICAgICAgICAgICAgICAgIE9QSl9GTE9BVDY0IHN0YWJsZV90aHJlc2ggPSAwOworICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgaTsKKyAgICAgICAgICAgICAgICBPUEpfRkxPQVQ2NCBkaXN0b3RhcmdldDsgICAgICAgICAgICAgICAgLyogZml4ZWRfcXVhbGl0eSAqLworCisgICAgICAgICAgICAgICAgLyogZml4ZWRfcXVhbGl0eSAqLworICAgICAgICAgICAgICAgIGRpc3RvdGFyZ2V0ID0gdGNkX3RpbGUtPmRpc3RvdGlsZSAtICgoSyAqIG1heFNFKSAvIHBvdygoT1BKX0ZMT0FUMzIpMTAsIHRjZF90Y3AtPmRpc3RvcmF0aW9bbGF5bm9dIC8gMTApKTsKKworICAgICAgICAgICAgICAgIC8qIERvbid0IHRyeSB0byBmaW5kIGFuIG9wdGltYWwgdGhyZXNob2xkIGJ1dCByYXRoZXIgdGFrZSBldmVyeXRoaW5nIG5vdCBpbmNsdWRlZCB5ZXQsIGlmCisgICAgICAgICAgICAgICAgICAtciB4eCx5eSx6eiwwICAgKGRpc3RvX2FsbG9jID09IDEgYW5kIHJhdGVzID09IDApCisgICAgICAgICAgICAgICAgICAtcSB4eCx5eSx6eiwwICAgKGZpeGVkX3F1YWxpdHkgPT0gMSBhbmQgZGlzdG9yYXRpbyA9PSAwKQorICAgICAgICAgICAgICAgICAgPT0+IHBvc3NpYmxlIHRvIGhhdmUgc29tZSBsb3NzeSBsYXllcnMgYW5kIHRoZSBsYXN0IGxheWVyIGZvciBzdXJlIGxvc3NsZXNzICovCisgICAgICAgICAgICAgICAgaWYgKCAoKGNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fZGlzdG9fYWxsb2M9PTEpICYmICh0Y2RfdGNwLT5yYXRlc1tsYXlub10+MCkpIHx8ICgoY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9maXhlZF9xdWFsaXR5PT0xKSAmJiAodGNkX3RjcC0+ZGlzdG9yYXRpb1tsYXlub10+MCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDJfdCp0MiA9IG9wal90Ml9jcmVhdGUodGNkLT5pbWFnZSwgY3ApOworICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUNjQgdGhyZXNoID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQyID09IDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAgICAgKGkgPSAwOyBpIDwgMTI4OyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUNjQgZGlzdG9hY2hpZXZlZCA9IDA7ICAvKiBmaXhlZF9xdWFsaXR5ICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNoID0gKGxvICsgaGkpIC8gMjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX21ha2VsYXllcih0Y2QsIGxheW5vLCB0aHJlc2gsIDApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX2ZpeGVkX3F1YWxpdHkpIHsgICAgICAgLyogZml4ZWRfcXVhbGl0eSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKE9QSl9JU19DSU5FTUEoY3AtPnJzaXopKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG9wal90Ml9lbmNvZGVfcGFja2V0cyh0Mix0Y2QtPnRjZF90aWxlbm8sIHRjZF90aWxlLCBsYXlubyArIDEsIGRlc3QsIHBfZGF0YV93cml0dGVuLCBtYXhsZW4sIGNzdHJfaW5mbyx0Y2QtPmN1cl90cF9udW0sdGNkLT50cF9wb3MsdGNkLT5jdXJfcGlubyxUSFJFU0hfQ0FMQykpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbyA9IHRocmVzaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdG9hY2hpZXZlZCA9IGxheW5vID09IDAgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNkX3RpbGUtPmRpc3RvbGF5ZXJbMF0gOiBjdW1kaXN0b1tsYXlubyAtIDFdICsgdGNkX3RpbGUtPmRpc3RvbGF5ZXJbbGF5bm9dOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXN0b2FjaGlldmVkIDwgZGlzdG90YXJnZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaT10aHJlc2g7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhYmxlX3RocmVzaCA9IHRocmVzaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG89dGhyZXNoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0b2FjaGlldmVkID0gKGxheW5vID09IDApID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2RfdGlsZS0+ZGlzdG9sYXllclswXSA6IChjdW1kaXN0b1tsYXlubyAtIDFdICsgdGNkX3RpbGUtPmRpc3RvbGF5ZXJbbGF5bm9dKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3RvYWNoaWV2ZWQgPCBkaXN0b3RhcmdldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaSA9IHRocmVzaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhYmxlX3RocmVzaCA9IHRocmVzaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbyA9IHRocmVzaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgb3BqX3QyX2VuY29kZV9wYWNrZXRzKHQyLCB0Y2QtPnRjZF90aWxlbm8sIHRjZF90aWxlLCBsYXlubyArIDEsIGRlc3QscF9kYXRhX3dyaXR0ZW4sIG1heGxlbiwgY3N0cl9pbmZvLHRjZC0+Y3VyX3RwX251bSx0Y2QtPnRwX3Bvcyx0Y2QtPmN1cl9waW5vLFRIUkVTSF9DQUxDKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPOiB3aGF0IHRvIGRvIHdpdGggbCA/Pz8gc2VlayAvIHRlbGwgPz8/ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGpfZXZlbnRfbXNnKHRjZC0+Y2luZm8sIEVWVF9JTkZPLCAicmF0ZSBhbGxvYzogbGVuPSVkLCBtYXg9JWRcbiIsIGwsIG1heGxlbik7ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbyA9IHRocmVzaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpID0gdGhyZXNoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWJsZV90aHJlc2ggPSB0aHJlc2g7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IE9QSl9UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgZ29vZHRocmVzaCA9IHN0YWJsZV90aHJlc2ggPT0gMD8gdGhyZXNoIDogc3RhYmxlX3RocmVzaDsKKworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QyX2Rlc3Ryb3kodDIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gT1BKX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBnb29kdGhyZXNoID0gbWluOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZihjc3RyX2luZm8pIHsgLyogVGhyZXNob2xkIGZvciBNYXJjZWxhIEluZGV4ICovCisgICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZm8tPnRpbGVbdGNkLT50Y2RfdGlsZW5vXS50aHJlc2hbbGF5bm9dID0gZ29vZHRocmVzaDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBvcGpfdGNkX21ha2VsYXllcih0Y2QsIGxheW5vLCBnb29kdGhyZXNoLCAxKTsKKworICAgICAgICAgICAgICAgIC8qIGZpeGVkX3F1YWxpdHkgKi8KKyAgICAgICAgICAgICAgICBjdW1kaXN0b1tsYXlub10gPSAobGF5bm8gPT0gMCkgPyB0Y2RfdGlsZS0+ZGlzdG9sYXllclswXSA6IChjdW1kaXN0b1tsYXlubyAtIDFdICsgdGNkX3RpbGUtPmRpc3RvbGF5ZXJbbGF5bm9dKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworT1BKX0JPT0wgb3BqX3RjZF9pbml0KCBvcGpfdGNkX3QgKnBfdGNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90ICogcF9pbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY3BfdCAqIHBfY3AgKQoreworICAgICAgICBwX3RjZC0+aW1hZ2UgPSBwX2ltYWdlOworICAgICAgICBwX3RjZC0+Y3AgPSBwX2NwOworCisgICAgICAgIHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzID0gKG9wal90Y2RfdGlsZV90ICopIG9wal9jYWxsb2MoMSxzaXplb2Yob3BqX3RjZF90aWxlX3QpKTsKKyAgICAgICAgaWYgKCEgcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPmNvbXBzID0gKG9wal90Y2RfdGlsZWNvbXBfdCAqKSBvcGpfY2FsbG9jKHBfaW1hZ2UtPm51bWNvbXBzLHNpemVvZihvcGpfdGNkX3RpbGVjb21wX3QpKTsKKyAgICAgICAgaWYgKCEgcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPmNvbXBzICkgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBwX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+bnVtY29tcHMgPSBwX2ltYWdlLT5udW1jb21wczsKKyAgICAgICAgcF90Y2QtPnRwX3BvcyA9IHBfY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV90cF9wb3M7CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCisvKioKK0Rlc3Ryb3kgYSBwcmV2aW91c2x5IGNyZWF0ZWQgVENEIGhhbmRsZQorKi8KK3ZvaWQgb3BqX3RjZF9kZXN0cm95KG9wal90Y2RfdCAqdGNkKSB7CisgICAgICAgIGlmICh0Y2QpIHsKKyAgICAgICAgICAgICAgICBvcGpfdGNkX2ZyZWVfdGlsZSh0Y2QpOworCisgICAgICAgICAgICAgICAgaWYgKHRjZC0+dGNkX2ltYWdlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZSh0Y2QtPnRjZF9pbWFnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2QtPnRjZF9pbWFnZSA9IDAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvcGpfZnJlZSh0Y2QpOworICAgICAgICB9Cit9CisKK09QSl9CT09MIG9wal9hbGxvY190aWxlX2NvbXBvbmVudF9kYXRhKG9wal90Y2RfdGlsZWNvbXBfdCAqbF90aWxlYykKK3sKKwlpZiAoKGxfdGlsZWMtPmRhdGEgPT0gMDApIHx8ICgobF90aWxlYy0+ZGF0YV9zaXplX25lZWRlZCA+IGxfdGlsZWMtPmRhdGFfc2l6ZSkgJiYgKGxfdGlsZWMtPm93bnNEYXRhID09IE9QSl9GQUxTRSkpKSB7CisJCWxfdGlsZWMtPmRhdGEgPSAoT1BKX0lOVDMyICopIG9wal9tYWxsb2MobF90aWxlYy0+ZGF0YV9zaXplX25lZWRlZCk7CisJCWlmICghIGxfdGlsZWMtPmRhdGEgKSB7CisJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQl9CisJCS8qZnByaW50ZihzdGRlcnIsICJ0QWxsb2NhdGUgZGF0YSBvZiB0aWxlYyAoaW50KTogJWQgeCBPUEpfVUlOVDMybiIsbF9kYXRhX3NpemUpOyovCisJCWxfdGlsZWMtPmRhdGFfc2l6ZSA9IGxfdGlsZWMtPmRhdGFfc2l6ZV9uZWVkZWQ7CisJCWxfdGlsZWMtPm93bnNEYXRhID0gT1BKX1RSVUU7CisJfQorCWVsc2UgaWYgKGxfdGlsZWMtPmRhdGFfc2l6ZV9uZWVkZWQgPiBsX3RpbGVjLT5kYXRhX3NpemUpIHsKKwkJT1BKX0lOVDMyICogbmV3X2RhdGEgPSAoT1BKX0lOVDMyICopIG9wal9yZWFsbG9jKGxfdGlsZWMtPmRhdGEsIGxfdGlsZWMtPmRhdGFfc2l6ZV9uZWVkZWQpOworCQkvKiBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIHRpbGUgZGF0YW4iKTsgKi8KKwkJLyogZnByaW50ZihzdGRlcnIsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBoYW5kbGUgdGlsZSBkYXRhIik7ICovCisJCWlmICghIG5ld19kYXRhKSB7CisJCQlvcGpfZnJlZShsX3RpbGVjLT5kYXRhKTsKKwkJCWxfdGlsZWMtPmRhdGEgPSBOVUxMOworCQkJbF90aWxlYy0+ZGF0YV9zaXplID0gMDsKKwkJCWxfdGlsZWMtPmRhdGFfc2l6ZV9uZWVkZWQgPSAwOworCQkJbF90aWxlYy0+b3duc0RhdGEgPSBPUEpfRkFMU0U7CisJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQl9CisJCWxfdGlsZWMtPmRhdGEgPSBuZXdfZGF0YTsKKwkJLypmcHJpbnRmKHN0ZGVyciwgInRSZWFsbG9jYXRlIGRhdGEgb2YgdGlsZWMgKGludCk6IGZyb20gJWQgdG8gJWQgeCBPUEpfVUlOVDMybiIsIGxfdGlsZWMtPmRhdGFfc2l6ZSwgbF9kYXRhX3NpemUpOyovCisJCWxfdGlsZWMtPmRhdGFfc2l6ZSA9IGxfdGlsZWMtPmRhdGFfc2l6ZV9uZWVkZWQ7CisJCWxfdGlsZWMtPm93bnNEYXRhID0gT1BKX1RSVUU7CisJfQorCXJldHVybiBPUEpfVFJVRTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIElOTElORSBPUEpfQk9PTCBvcGpfdGNkX2luaXRfdGlsZShvcGpfdGNkX3QgKnBfdGNkLCBPUEpfVUlOVDMyIHBfdGlsZV9ubywgT1BKX0JPT0wgaXNFbmNvZGVyLCBPUEpfRkxPQVQzMiBmcmFjdGlvbiwgT1BKX1NJWkVfVCBzaXplb2ZfYmxvY2ssIG9wal9ldmVudF9tZ3JfdCogbWFuYWdlcikKK3sKKwlPUEpfVUlOVDMyICgqbF9nYWluX3B0cikoT1BKX1VJTlQzMikgPSAwMDsKKwlPUEpfVUlOVDMyIGNvbXBubywgcmVzbm8sIGJhbmRubywgcHJlY25vLCBjYmxrbm87CisJb3BqX3RjcF90ICogbF90Y3AgPSAwMDsKKwlvcGpfY3BfdCAqIGxfY3AgPSAwMDsKKwlvcGpfdGNkX3RpbGVfdCAqIGxfdGlsZSA9IDAwOworCW9wal90Y2NwX3QgKmxfdGNjcCA9IDAwOworCW9wal90Y2RfdGlsZWNvbXBfdCAqbF90aWxlYyA9IDAwOworCW9wal9pbWFnZV9jb21wX3QgKiBsX2ltYWdlX2NvbXAgPSAwMDsKKwlvcGpfdGNkX3Jlc29sdXRpb25fdCAqbF9yZXMgPSAwMDsKKwlvcGpfdGNkX2JhbmRfdCAqbF9iYW5kID0gMDA7CisJb3BqX3N0ZXBzaXplX3QgKiBsX3N0ZXBfc2l6ZSA9IDAwOworCW9wal90Y2RfcHJlY2luY3RfdCAqbF9jdXJyZW50X3ByZWNpbmN0ID0gMDA7CisJb3BqX2ltYWdlX3QgKmxfaW1hZ2UgPSAwMDsKKwlPUEpfVUlOVDMyIHAscTsKKwlPUEpfVUlOVDMyIGxfbGV2ZWxfbm87CisJT1BKX1VJTlQzMiBsX3BkeCwgbF9wZHk7CisJT1BKX1VJTlQzMiBsX2dhaW47CisJT1BKX0lOVDMyIGxfeDBiLCBsX3kwYjsKKwlPUEpfVUlOVDMyIGxfdHgwLCBsX3R5MDsKKwkvKiBleHRlbnQgb2YgcHJlY2luY3RzICwgdG9wIGxlZnQsIGJvdHRvbSByaWdodCoqLworCU9QSl9JTlQzMiBsX3RsX3ByY194X3N0YXJ0LCBsX3RsX3ByY195X3N0YXJ0LCBsX2JyX3ByY194X2VuZCwgbF9icl9wcmNfeV9lbmQ7CisJLyogbnVtYmVyIG9mIHByZWNpbmN0IGZvciBhIHJlc29sdXRpb24gKi8KKwlPUEpfVUlOVDMyIGxfbmJfcHJlY2luY3RzOworCS8qIHJvb20gbmVlZGVkIHRvIHN0b3JlIGxfbmJfcHJlY2luY3QgcHJlY2luY3QgZm9yIGEgcmVzb2x1dGlvbiAqLworCU9QSl9VSU5UMzIgbF9uYl9wcmVjaW5jdF9zaXplOworCS8qIG51bWJlciBvZiBjb2RlIGJsb2NrcyBmb3IgYSBwcmVjaW5jdCovCisJT1BKX1VJTlQzMiBsX25iX2NvZGVfYmxvY2tzOworCS8qIHJvb20gbmVlZGVkIHRvIHN0b3JlIGxfbmJfY29kZV9ibG9ja3MgY29kZSBibG9ja3MgZm9yIGEgcHJlY2luY3QqLworCU9QSl9VSU5UMzIgbF9uYl9jb2RlX2Jsb2Nrc19zaXplOworCS8qIHNpemUgb2YgZGF0YSBmb3IgYSB0aWxlICovCisJT1BKX1VJTlQzMiBsX2RhdGFfc2l6ZTsKKwkKKwlsX2NwID0gcF90Y2QtPmNwOworCWxfdGNwID0gJihsX2NwLT50Y3BzW3BfdGlsZV9ub10pOworCWxfdGlsZSA9IHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzOworCWxfdGNjcCA9IGxfdGNwLT50Y2NwczsKKwlsX3RpbGVjID0gbF90aWxlLT5jb21wczsKKwlsX2ltYWdlID0gcF90Y2QtPmltYWdlOworCWxfaW1hZ2VfY29tcCA9IHBfdGNkLT5pbWFnZS0+Y29tcHM7CisJCisJcCA9IHBfdGlsZV9ubyAlIGxfY3AtPnR3OyAgICAgICAvKiB0aWxlIGNvb3JkaW5hdGVzICovCisJcSA9IHBfdGlsZV9ubyAvIGxfY3AtPnR3OworCS8qZnByaW50ZihzdGRlcnIsICJUaWxlIGNvb3JkaW5hdGUgPSAlZCwlZFxuIiwgcCwgcSk7Ki8KKwkKKwkvKiA0IGJvcmRlcnMgb2YgdGhlIHRpbGUgcmVzY2FsZSBvbiB0aGUgaW1hZ2UgaWYgbmVjZXNzYXJ5ICovCisJbF90eDAgPSBsX2NwLT50eDAgKyBwICogbF9jcC0+dGR4OyAvKiBjYW4ndCBiZSBncmVhdGVyIHRoYW4gbF9pbWFnZS0+eDEgc28gd29uJ3Qgb3ZlcmZsb3cgKi8KKwlsX3RpbGUtPngwID0gKE9QSl9JTlQzMilvcGpfdWludF9tYXgobF90eDAsIGxfaW1hZ2UtPngwKTsKKwlsX3RpbGUtPngxID0gKE9QSl9JTlQzMilvcGpfdWludF9taW4ob3BqX3VpbnRfYWRkcyhsX3R4MCwgbF9jcC0+dGR4KSwgbF9pbWFnZS0+eDEpOworCWxfdHkwID0gbF9jcC0+dHkwICsgcSAqIGxfY3AtPnRkeTsgLyogY2FuJ3QgYmUgZ3JlYXRlciB0aGFuIGxfaW1hZ2UtPnkxIHNvIHdvbid0IG92ZXJmbG93ICovCisJbF90aWxlLT55MCA9IChPUEpfSU5UMzIpb3BqX3VpbnRfbWF4KGxfdHkwLCBsX2ltYWdlLT55MCk7CisJbF90aWxlLT55MSA9IChPUEpfSU5UMzIpb3BqX3VpbnRfbWluKG9wal91aW50X2FkZHMobF90eTAsIGxfY3AtPnRkeSksIGxfaW1hZ2UtPnkxKTsKKworCS8qIHRlc3RjYXNlIDE4ODgucGRmLmFzYW4uMzUuOTg4ICovCisJaWYgKGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMgPT0gMCkgeworCQlvcGpfZXZlbnRfbXNnKG1hbmFnZXIsIEVWVF9FUlJPUiwgInRpbGVzIHJlcXVpcmUgYXQgbGVhc3Qgb25lIHJlc29sdXRpb25cbiIpOworCQlyZXR1cm4gT1BKX0ZBTFNFOworCX0KKwkvKmZwcmludGYoc3RkZXJyLCAiVGlsZSBib3JkZXIgPSAlZCwlZCwlZCwlZFxuIiwgbF90aWxlLT54MCwgbF90aWxlLT55MCxsX3RpbGUtPngxLGxfdGlsZS0+eTEpOyovCisJCisJLyp0aWxlLT5udW1jb21wcyA9IGltYWdlLT5udW1jb21wczsgKi8KKwlmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IGxfdGlsZS0+bnVtY29tcHM7ICsrY29tcG5vKSB7CisJCS8qZnByaW50ZihzdGRlcnIsICJjb21wbm8gPSAlZC8lZFxuIiwgY29tcG5vLCBsX3RpbGUtPm51bWNvbXBzKTsqLworCQlsX2ltYWdlX2NvbXAtPnJlc25vX2RlY29kZWQgPSAwOworCQkvKiBib3JkZXIgb2YgZWFjaCBsX3RpbGUgY29tcG9uZW50IChnbG9iYWwpICovCisJCWxfdGlsZWMtPngwID0gb3BqX2ludF9jZWlsZGl2KGxfdGlsZS0+eDAsIChPUEpfSU5UMzIpbF9pbWFnZV9jb21wLT5keCk7CisJCWxfdGlsZWMtPnkwID0gb3BqX2ludF9jZWlsZGl2KGxfdGlsZS0+eTAsIChPUEpfSU5UMzIpbF9pbWFnZV9jb21wLT5keSk7CisJCWxfdGlsZWMtPngxID0gb3BqX2ludF9jZWlsZGl2KGxfdGlsZS0+eDEsIChPUEpfSU5UMzIpbF9pbWFnZV9jb21wLT5keCk7CisJCWxfdGlsZWMtPnkxID0gb3BqX2ludF9jZWlsZGl2KGxfdGlsZS0+eTEsIChPUEpfSU5UMzIpbF9pbWFnZV9jb21wLT5keSk7CisJCS8qZnByaW50ZihzdGRlcnIsICJcdFRpbGUgY29tcG8gYm9yZGVyID0gJWQsJWQsJWQsJWRcbiIsIGxfdGlsZWMtPngwLCBsX3RpbGVjLT55MCxsX3RpbGVjLT54MSxsX3RpbGVjLT55MSk7Ki8KKwkJaWYgKGxfdGlsZWMtPngwID49IGxfdGlsZWMtPngxIHx8IGxfdGlsZWMtPnkwID49IGxfdGlsZWMtPnkxKSB7CisJCQlvcGpfZXZlbnRfbXNnKG1hbmFnZXIsIEVWVF9FUlJPUiwgIkludmFsaWQgdGlsZSBkYXRhXG4iKTsKKwkJCXJldHVybiBPUEpfRkFMU0U7CisJCX0KKwkJLyogY29tcHV0ZSBsX2RhdGFfc2l6ZSB3aXRoIG92ZXJmbG93IGNoZWNrICovCisJCWxfZGF0YV9zaXplID0gKE9QSl9VSU5UMzIpKGxfdGlsZWMtPngxIC0gbF90aWxlYy0+eDApOworCQlpZiAoKCgoT1BKX1VJTlQzMiktMSkgLyBsX2RhdGFfc2l6ZSkgPCAoT1BKX1VJTlQzMikobF90aWxlYy0+eTEgLSBsX3RpbGVjLT55MCkpIHsKKwkJCW9wal9ldmVudF9tc2cobWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgZm9yIHRpbGUgZGF0YVxuIik7CisJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQl9CisJCWxfZGF0YV9zaXplID0gbF9kYXRhX3NpemUgKiAoT1BKX1VJTlQzMikobF90aWxlYy0+eTEgLSBsX3RpbGVjLT55MCk7CisJCQorCQlpZiAoKCgoT1BKX1VJTlQzMiktMSkgLyAoT1BKX1VJTlQzMilzaXplb2YoT1BKX1VJTlQzMikpIDwgbF9kYXRhX3NpemUpIHsKKwkJCW9wal9ldmVudF9tc2cobWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgZm9yIHRpbGUgZGF0YVxuIik7CisJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQl9CisJCWxfZGF0YV9zaXplID0gbF9kYXRhX3NpemUgKiAoT1BKX1VJTlQzMilzaXplb2YoT1BKX1VJTlQzMik7CisJCWxfdGlsZWMtPm51bXJlc29sdXRpb25zID0gbF90Y2NwLT5udW1yZXNvbHV0aW9uczsKKwkJaWYgKGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMgPCBsX2NwLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjLm1fcmVkdWNlKSB7CisJCQlsX3RpbGVjLT5taW5pbXVtX251bV9yZXNvbHV0aW9ucyA9IDE7CisJCX0KKwkJZWxzZSB7CisJCQlsX3RpbGVjLT5taW5pbXVtX251bV9yZXNvbHV0aW9ucyA9IGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMgLSBsX2NwLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjLm1fcmVkdWNlOworCQl9CisJCQorCQlsX3RpbGVjLT5kYXRhX3NpemVfbmVlZGVkID0gbF9kYXRhX3NpemU7CisJCWlmIChwX3RjZC0+bV9pc19kZWNvZGVyICYmICFvcGpfYWxsb2NfdGlsZV9jb21wb25lbnRfZGF0YShsX3RpbGVjKSkgeworCQkJb3BqX2V2ZW50X21zZyhtYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgdGlsZSBkYXRhXG4iKTsKKwkJCXJldHVybiBPUEpfRkFMU0U7CisJCX0KKwkJCisJCWxfZGF0YV9zaXplID0gbF90aWxlYy0+bnVtcmVzb2x1dGlvbnMgKiAoT1BKX1VJTlQzMilzaXplb2Yob3BqX3RjZF9yZXNvbHV0aW9uX3QpOworCQkKKwkJaWYgKGxfdGlsZWMtPnJlc29sdXRpb25zID09IDAwKSB7CisJCQlsX3RpbGVjLT5yZXNvbHV0aW9ucyA9IChvcGpfdGNkX3Jlc29sdXRpb25fdCAqKSBvcGpfbWFsbG9jKGxfZGF0YV9zaXplKTsKKwkJCWlmICghIGxfdGlsZWMtPnJlc29sdXRpb25zICkgeworCQkJCXJldHVybiBPUEpfRkFMU0U7CisJCQl9CisJCQkvKmZwcmludGYoc3RkZXJyLCAiXHRBbGxvY2F0ZSByZXNvbHV0aW9ucyBvZiB0aWxlYyAob3BqX3RjZF9yZXNvbHV0aW9uX3QpOiAlZFxuIixsX2RhdGFfc2l6ZSk7Ki8KKwkJCWxfdGlsZWMtPnJlc29sdXRpb25zX3NpemUgPSBsX2RhdGFfc2l6ZTsKKwkJCW1lbXNldChsX3RpbGVjLT5yZXNvbHV0aW9ucywwLGxfZGF0YV9zaXplKTsKKwkJfQorCQllbHNlIGlmIChsX2RhdGFfc2l6ZSA+IGxfdGlsZWMtPnJlc29sdXRpb25zX3NpemUpIHsKKwkJCW9wal90Y2RfcmVzb2x1dGlvbl90KiBuZXdfcmVzb2x1dGlvbnMgPSAob3BqX3RjZF9yZXNvbHV0aW9uX3QgKikgb3BqX3JlYWxsb2MobF90aWxlYy0+cmVzb2x1dGlvbnMsIGxfZGF0YV9zaXplKTsKKwkJCWlmICghIG5ld19yZXNvbHV0aW9ucykgeworCQkJCW9wal9ldmVudF9tc2cobWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgZm9yIHRpbGUgcmVzb2x1dGlvbnNcbiIpOworCQkJCW9wal9mcmVlKGxfdGlsZWMtPnJlc29sdXRpb25zKTsKKwkJCQlsX3RpbGVjLT5yZXNvbHV0aW9ucyA9IE5VTEw7CisJCQkJbF90aWxlYy0+cmVzb2x1dGlvbnNfc2l6ZSA9IDA7CisJCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJCX0KKwkJCWxfdGlsZWMtPnJlc29sdXRpb25zID0gbmV3X3Jlc29sdXRpb25zOworCQkJLypmcHJpbnRmKHN0ZGVyciwgIlx0UmVhbGxvY2F0ZSBkYXRhIG9mIHRpbGVjIChpbnQpOiBmcm9tICVkIHRvICVkIHggT1BKX1VJTlQzMlxuIiwgbF90aWxlYy0+cmVzb2x1dGlvbnNfc2l6ZSwgbF9kYXRhX3NpemUpOyovCisJCQltZW1zZXQoKChPUEpfQllURSopIGxfdGlsZWMtPnJlc29sdXRpb25zKStsX3RpbGVjLT5yZXNvbHV0aW9uc19zaXplLDAsbF9kYXRhX3NpemUgLSBsX3RpbGVjLT5yZXNvbHV0aW9uc19zaXplKTsKKwkJCWxfdGlsZWMtPnJlc29sdXRpb25zX3NpemUgPSBsX2RhdGFfc2l6ZTsKKwkJfQorCQkKKwkJbF9sZXZlbF9ubyA9IGxfdGlsZWMtPm51bXJlc29sdXRpb25zIC0gMTsKKwkJbF9yZXMgPSBsX3RpbGVjLT5yZXNvbHV0aW9uczsKKwkJbF9zdGVwX3NpemUgPSBsX3RjY3AtPnN0ZXBzaXplczsKKwkJaWYgKGxfdGNjcC0+cW1mYmlkID09IDApIHsKKwkJCWxfZ2Fpbl9wdHIgPSAmb3BqX2R3dF9nZXRnYWluX3JlYWw7CisJCX0KKwkJZWxzZSB7CisJCQlsX2dhaW5fcHRyICA9ICZvcGpfZHd0X2dldGdhaW47CisJCX0KKwkJLypmcHJpbnRmKHN0ZGVyciwgIlx0bGV2ZWxfbm89JWRcbiIsbF9sZXZlbF9ubyk7Ki8KKwkJCisJCWZvciAocmVzbm8gPSAwOyByZXNubyA8IGxfdGlsZWMtPm51bXJlc29sdXRpb25zOyArK3Jlc25vKSB7CisJCQkvKmZwcmludGYoc3RkZXJyLCAiXHRcdHJlc25vID0gJWQvJWRcbiIsIHJlc25vLCBsX3RpbGVjLT5udW1yZXNvbHV0aW9ucyk7Ki8KKwkJCU9QSl9JTlQzMiB0bGNiZ3hzdGFydCwgdGxjYmd5c3RhcnQgLyosIGJyY2JneGVuZCwgYnJjYmd5ZW5kKi87CisJCQlPUEpfVUlOVDMyIGNiZ3dpZHRoZXhwbiwgY2JnaGVpZ2h0ZXhwbjsKKwkJCU9QSl9VSU5UMzIgY2Jsa3dpZHRoZXhwbiwgY2Jsa2hlaWdodGV4cG47CisJCQkKKwkJCS8qIGJvcmRlciBmb3IgZWFjaCByZXNvbHV0aW9uIGxldmVsIChnbG9iYWwpICovCisJCQlsX3Jlcy0+eDAgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGlsZWMtPngwLCAoT1BKX0lOVDMyKWxfbGV2ZWxfbm8pOworCQkJbF9yZXMtPnkwID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3RpbGVjLT55MCwgKE9QSl9JTlQzMilsX2xldmVsX25vKTsKKwkJCWxfcmVzLT54MSA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF90aWxlYy0+eDEsIChPUEpfSU5UMzIpbF9sZXZlbF9ubyk7CisJCQlsX3Jlcy0+eTEgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGlsZWMtPnkxLCAoT1BKX0lOVDMyKWxfbGV2ZWxfbm8pOworCQkJLypmcHJpbnRmKHN0ZGVyciwgIlx0XHRcdHJlc194MD0gJWQsIHJlc195MCA9JWQsIHJlc194MT0lZCwgcmVzX3kxPSVkXG4iLCBsX3Jlcy0+eDAsIGxfcmVzLT55MCwgbF9yZXMtPngxLCBsX3Jlcy0+eTEpOyovCisJCQkvKiBwLiAzNSwgdGFibGUgQS0yMywgSVNPL0lFQyBGRElTMTU0NDQ0LTEgOiAyMDAwICgxOCBhdWd1c3QgMjAwMCkgKi8KKwkJCWxfcGR4ID0gbF90Y2NwLT5wcmN3W3Jlc25vXTsKKwkJCWxfcGR5ID0gbF90Y2NwLT5wcmNoW3Jlc25vXTsKKwkJCS8qZnByaW50ZihzdGRlcnIsICJcdFx0XHRwZHg9JWQsIHBkeT0lZFxuIiwgbF9wZHgsIGxfcGR5KTsqLworCQkJLyogcC4gNjQsIEIuNiwgSVNPL0lFQyBGRElTMTU0NDQtMSA6IDIwMDAgKDE4IGF1Z3VzdCAyMDAwKSAgKi8KKwkJCWxfdGxfcHJjX3hfc3RhcnQgPSBvcGpfaW50X2Zsb29yZGl2cG93MihsX3Jlcy0+eDAsIChPUEpfSU5UMzIpbF9wZHgpIDw8IGxfcGR4OworCQkJbF90bF9wcmNfeV9zdGFydCA9IG9wal9pbnRfZmxvb3JkaXZwb3cyKGxfcmVzLT55MCwgKE9QSl9JTlQzMilsX3BkeSkgPDwgbF9wZHk7CisJCQlsX2JyX3ByY194X2VuZCA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF9yZXMtPngxLCAoT1BKX0lOVDMyKWxfcGR4KSA8PCBsX3BkeDsKKwkJCWxfYnJfcHJjX3lfZW5kID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3Jlcy0+eTEsIChPUEpfSU5UMzIpbF9wZHkpIDw8IGxfcGR5OworCQkJLypmcHJpbnRmKHN0ZGVyciwgIlx0XHRcdHByY194X3N0YXJ0PSVkLCBwcmNfeV9zdGFydD0lZCwgYnJfcHJjX3hfZW5kPSVkLCBicl9wcmNfeV9lbmQ9JWQgXG4iLCBsX3RsX3ByY194X3N0YXJ0LCBsX3RsX3ByY195X3N0YXJ0LCBsX2JyX3ByY194X2VuZCAsbF9icl9wcmNfeV9lbmQgKTsqLworCQkJCisJCQlsX3Jlcy0+cHcgPSAobF9yZXMtPngwID09IGxfcmVzLT54MSkgPyAwIDogKE9QSl9VSU5UMzIpKChsX2JyX3ByY194X2VuZCAtIGxfdGxfcHJjX3hfc3RhcnQpID4+IGxfcGR4KTsKKwkJCWxfcmVzLT5waCA9IChsX3Jlcy0+eTAgPT0gbF9yZXMtPnkxKSA/IDAgOiAoT1BKX1VJTlQzMikoKGxfYnJfcHJjX3lfZW5kIC0gbF90bF9wcmNfeV9zdGFydCkgPj4gbF9wZHkpOworCQkJLypmcHJpbnRmKHN0ZGVyciwgIlx0XHRcdHJlc19wdz0lZCwgcmVzX3BoPSVkXG4iLCBsX3Jlcy0+cHcsIGxfcmVzLT5waCApOyovCisJCQkKKwkJCWxfbmJfcHJlY2luY3RzID0gbF9yZXMtPnB3ICogbF9yZXMtPnBoOworCQkJbF9uYl9wcmVjaW5jdF9zaXplID0gbF9uYl9wcmVjaW5jdHMgKiAoT1BKX1VJTlQzMilzaXplb2Yob3BqX3RjZF9wcmVjaW5jdF90KTsKKwkJCWlmIChyZXNubyA9PSAwKSB7CisJCQkJdGxjYmd4c3RhcnQgPSBsX3RsX3ByY194X3N0YXJ0OworCQkJCXRsY2JneXN0YXJ0ID0gbF90bF9wcmNfeV9zdGFydDsKKwkJCQkvKmJyY2JneGVuZCA9IGxfYnJfcHJjX3hfZW5kOyovCisJCQkJLyogYnJjYmd5ZW5kID0gbF9icl9wcmNfeV9lbmQ7Ki8KKwkJCQljYmd3aWR0aGV4cG4gPSBsX3BkeDsKKwkJCQljYmdoZWlnaHRleHBuID0gbF9wZHk7CisJCQkJbF9yZXMtPm51bWJhbmRzID0gMTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXRsY2JneHN0YXJ0ID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3RsX3ByY194X3N0YXJ0LCAxKTsKKwkJCQl0bGNiZ3lzdGFydCA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF90bF9wcmNfeV9zdGFydCwgMSk7CisJCQkJLypicmNiZ3hlbmQgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfYnJfcHJjX3hfZW5kLCAxKTsqLworCQkJCS8qYnJjYmd5ZW5kID0gb3BqX2ludF9jZWlsZGl2cG93MihsX2JyX3ByY195X2VuZCwgMSk7Ki8KKwkJCQljYmd3aWR0aGV4cG4gPSBsX3BkeCAtIDE7CisJCQkJY2JnaGVpZ2h0ZXhwbiA9IGxfcGR5IC0gMTsKKwkJCQlsX3Jlcy0+bnVtYmFuZHMgPSAzOworCQkJfQorCQkJCisJCQljYmxrd2lkdGhleHBuID0gb3BqX3VpbnRfbWluKGxfdGNjcC0+Y2Jsa3csIGNiZ3dpZHRoZXhwbik7CisJCQljYmxraGVpZ2h0ZXhwbiA9IG9wal91aW50X21pbihsX3RjY3AtPmNibGtoLCBjYmdoZWlnaHRleHBuKTsKKwkJCWxfYmFuZCA9IGxfcmVzLT5iYW5kczsKKwkJCQorCQkJZm9yIChiYW5kbm8gPSAwOyBiYW5kbm8gPCBsX3Jlcy0+bnVtYmFuZHM7ICsrYmFuZG5vKSB7CisJCQkJT1BKX0lOVDMyIG51bWJwczsKKwkJCQkvKmZwcmludGYoc3RkZXJyLCAiXHRcdFx0YmFuZF9ubz0lZC8lZFxuIiwgYmFuZG5vLCBsX3Jlcy0+bnVtYmFuZHMgKTsqLworCQkJCQorCQkJCWlmIChyZXNubyA9PSAwKSB7CisJCQkJCWxfYmFuZC0+YmFuZG5vID0gMCA7CisJCQkJCWxfYmFuZC0+eDAgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGlsZWMtPngwLCAoT1BKX0lOVDMyKWxfbGV2ZWxfbm8pOworCQkJCQlsX2JhbmQtPnkwID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3RpbGVjLT55MCwgKE9QSl9JTlQzMilsX2xldmVsX25vKTsKKwkJCQkJbF9iYW5kLT54MSA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF90aWxlYy0+eDEsIChPUEpfSU5UMzIpbF9sZXZlbF9ubyk7CisJCQkJCWxfYmFuZC0+eTEgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGlsZWMtPnkxLCAoT1BKX0lOVDMyKWxfbGV2ZWxfbm8pOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJbF9iYW5kLT5iYW5kbm8gPSBiYW5kbm8gKyAxOworCQkJCQkvKiB4MGIgPSAxIGlmIGJhbmRubyA9IDEgb3IgMyAqLworCQkJCQlsX3gwYiA9IGxfYmFuZC0+YmFuZG5vJjE7CisJCQkJCS8qIHkwYiA9IDEgaWYgYmFuZG5vID0gMiBvciAzICovCisJCQkJCWxfeTBiID0gKE9QSl9JTlQzMikoKGxfYmFuZC0+YmFuZG5vKT4+MSk7CisJCQkJCS8qIGxfYmFuZCBib3JkZXIgKGdsb2JhbCkgKi8KKwkJCQkJbF9iYW5kLT54MCA9IG9wal9pbnQ2NF9jZWlsZGl2cG93MihsX3RpbGVjLT54MCAtICgoT1BKX0lOVDY0KWxfeDBiIDw8IGxfbGV2ZWxfbm8pLCAoT1BKX0lOVDMyKShsX2xldmVsX25vICsgMSkpOworCQkJCQlsX2JhbmQtPnkwID0gb3BqX2ludDY0X2NlaWxkaXZwb3cyKGxfdGlsZWMtPnkwIC0gKChPUEpfSU5UNjQpbF95MGIgPDwgbF9sZXZlbF9ubyksIChPUEpfSU5UMzIpKGxfbGV2ZWxfbm8gKyAxKSk7CisJCQkJCWxfYmFuZC0+eDEgPSBvcGpfaW50NjRfY2VpbGRpdnBvdzIobF90aWxlYy0+eDEgLSAoKE9QSl9JTlQ2NClsX3gwYiA8PCBsX2xldmVsX25vKSwgKE9QSl9JTlQzMikobF9sZXZlbF9ubyArIDEpKTsKKwkJCQkJbF9iYW5kLT55MSA9IG9wal9pbnQ2NF9jZWlsZGl2cG93MihsX3RpbGVjLT55MSAtICgoT1BKX0lOVDY0KWxfeTBiIDw8IGxfbGV2ZWxfbm8pLCAoT1BKX0lOVDMyKShsX2xldmVsX25vICsgMSkpOworCQkJCX0KKwkJCQkKKwkJCQkvKiogYXZvaWQgYW4gaWYgd2l0aCBzdG9yaW5nIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKwkJCQlsX2dhaW4gPSAoKmxfZ2Fpbl9wdHIpIChsX2JhbmQtPmJhbmRubyk7CisJCQkJbnVtYnBzID0gKE9QSl9JTlQzMikobF9pbWFnZV9jb21wLT5wcmVjICsgbF9nYWluKTsKKwkJCQlsX2JhbmQtPnN0ZXBzaXplID0gKE9QSl9GTE9BVDMyKSgoKDEuMCArIGxfc3RlcF9zaXplLT5tYW50IC8gMjA0OC4wKSAqIHBvdygyLjAsIChPUEpfSU5UMzIpIChudW1icHMgLSBsX3N0ZXBfc2l6ZS0+ZXhwbikpKSkgKiBmcmFjdGlvbjsKKwkJCQlsX2JhbmQtPm51bWJwcyA9IGxfc3RlcF9zaXplLT5leHBuICsgKE9QSl9JTlQzMilsX3RjY3AtPm51bWdiaXRzIC0gMTsgICAgICAvKiBXSFkgLTEgPyAqLworCQkJCQorCQkJCWlmICghIGxfYmFuZC0+cHJlY2luY3RzKSB7CisJCQkJCWxfYmFuZC0+cHJlY2luY3RzID0gKG9wal90Y2RfcHJlY2luY3RfdCAqKSBvcGpfbWFsbG9jKCAvKjMgKiAqLyBsX25iX3ByZWNpbmN0X3NpemUpOworCQkJCQlpZiAoISBsX2JhbmQtPnByZWNpbmN0cykgeworCQkJCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJCQkJfQorCQkJCQkvKmZwcmludGYoc3RkZXJyLCAiXHRcdFx0XHRBbGxvY2F0ZSBwcmVjaW5jdHMgb2YgYSBiYW5kIChvcGpfdGNkX3ByZWNpbmN0X3QpOiAlZFxuIixsX25iX3ByZWNpbmN0X3NpemUpOyAgICAgKi8KKwkJCQkJbWVtc2V0KGxfYmFuZC0+cHJlY2luY3RzLDAsbF9uYl9wcmVjaW5jdF9zaXplKTsKKwkJCQkJbF9iYW5kLT5wcmVjaW5jdHNfZGF0YV9zaXplID0gbF9uYl9wcmVjaW5jdF9zaXplOworCQkJCX0KKwkJCQllbHNlIGlmIChsX2JhbmQtPnByZWNpbmN0c19kYXRhX3NpemUgPCBsX25iX3ByZWNpbmN0X3NpemUpIHsKKwkJCQkJCisJCQkJCW9wal90Y2RfcHJlY2luY3RfdCAqIG5ld19wcmVjaW5jdHMgPSAob3BqX3RjZF9wcmVjaW5jdF90ICopIG9wal9yZWFsbG9jKGxfYmFuZC0+cHJlY2luY3RzLC8qMyAqICovIGxfbmJfcHJlY2luY3Rfc2l6ZSk7CisJCQkJCWlmICghIG5ld19wcmVjaW5jdHMpIHsKKwkJCQkJCW9wal9ldmVudF9tc2cobWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGJhbmQgcHJlY2ludHNcbiIpOworCQkJCQkJb3BqX2ZyZWUobF9iYW5kLT5wcmVjaW5jdHMpOworCQkJCQkJbF9iYW5kLT5wcmVjaW5jdHMgPSBOVUxMOworCQkJCQkJbF9iYW5kLT5wcmVjaW5jdHNfZGF0YV9zaXplID0gMDsKKwkJCQkJCXJldHVybiBPUEpfRkFMU0U7CisJCQkJCX0KKwkJCQkJbF9iYW5kLT5wcmVjaW5jdHMgPSBuZXdfcHJlY2luY3RzOworCQkJCQkvKmZwcmludGYoc3RkZXJyLCAiXHRcdFx0XHRSZWFsbG9jYXRlIHByZWNpbmN0cyBvZiBhIGJhbmQgKG9wal90Y2RfcHJlY2luY3RfdCk6IGZyb20gJWQgdG8gJWRcbiIsbF9iYW5kLT5wcmVjaW5jdHNfZGF0YV9zaXplLCBsX25iX3ByZWNpbmN0X3NpemUpOyovCisJCQkJCW1lbXNldCgoKE9QSl9CWVRFICopIGxfYmFuZC0+cHJlY2luY3RzKSArIGxfYmFuZC0+cHJlY2luY3RzX2RhdGFfc2l6ZSwwLGxfbmJfcHJlY2luY3Rfc2l6ZSAtIGxfYmFuZC0+cHJlY2luY3RzX2RhdGFfc2l6ZSk7CisJCQkJCWxfYmFuZC0+cHJlY2luY3RzX2RhdGFfc2l6ZSA9IGxfbmJfcHJlY2luY3Rfc2l6ZTsKKwkJCQl9CisJCQkJCisJCQkJbF9jdXJyZW50X3ByZWNpbmN0ID0gbF9iYW5kLT5wcmVjaW5jdHM7CisJCQkJZm9yIChwcmVjbm8gPSAwOyBwcmVjbm8gPCBsX25iX3ByZWNpbmN0czsgKytwcmVjbm8pIHsKKwkJCQkJT1BKX0lOVDMyIHRsY2Jsa3hzdGFydCwgdGxjYmxreXN0YXJ0LCBicmNibGt4ZW5kLCBicmNibGt5ZW5kOworCQkJCQlPUEpfSU5UMzIgY2JneHN0YXJ0ID0gdGxjYmd4c3RhcnQgKyAoT1BKX0lOVDMyKShwcmVjbm8gJSBsX3Jlcy0+cHcpICogKDEgPDwgY2Jnd2lkdGhleHBuKTsKKwkJCQkJT1BKX0lOVDMyIGNiZ3lzdGFydCA9IHRsY2JneXN0YXJ0ICsgKE9QSl9JTlQzMikocHJlY25vIC8gbF9yZXMtPnB3KSAqICgxIDw8IGNiZ2hlaWdodGV4cG4pOworCQkJCQlPUEpfSU5UMzIgY2JneGVuZCA9IGNiZ3hzdGFydCArICgxIDw8IGNiZ3dpZHRoZXhwbik7CisJCQkJCU9QSl9JTlQzMiBjYmd5ZW5kID0gY2JneXN0YXJ0ICsgKDEgPDwgY2JnaGVpZ2h0ZXhwbik7CisJCQkJCS8qZnByaW50ZihzdGRlcnIsICJcdCBwcmVjbm89JWQ7IGJhbmRubz0lZCwgcmVzbm89JWQ7IGNvbXBubz0lZFxuIiwgcHJlY25vLCBiYW5kbm8gLCByZXNubywgY29tcG5vKTsqLworCQkJCQkvKmZwcmludGYoc3RkZXJyLCAiXHQgdGxjYmd4c3RhcnQoPSVkKSArIChwcmVjbm8oPSVkKSBwZXJjZW50IHJlcy0+cHcoPSVkKSkgKiAoMSA8PCBjYmd3aWR0aGV4cG4oPSVkKSkgXG4iLHRsY2JneHN0YXJ0LHByZWNubyxsX3Jlcy0+cHcsY2Jnd2lkdGhleHBuKTsqLworCQkJCQkKKwkJCQkJLyogcHJlY2luY3Qgc2l6ZSAoZ2xvYmFsKSAqLworCQkJCQkvKmZwcmludGYoc3RkZXJyLCAiXHQgY2JneHN0YXJ0PSVkLCBsX2JhbmQtPngwID0gJWQgXG4iLGNiZ3hzdGFydCwgbF9iYW5kLT54MCk7Ki8KKwkJCQkJCisJCQkJCWxfY3VycmVudF9wcmVjaW5jdC0+eDAgPSBvcGpfaW50X21heChjYmd4c3RhcnQsIGxfYmFuZC0+eDApOworCQkJCQlsX2N1cnJlbnRfcHJlY2luY3QtPnkwID0gb3BqX2ludF9tYXgoY2JneXN0YXJ0LCBsX2JhbmQtPnkwKTsKKwkJCQkJbF9jdXJyZW50X3ByZWNpbmN0LT54MSA9IG9wal9pbnRfbWluKGNiZ3hlbmQsIGxfYmFuZC0+eDEpOworCQkJCQlsX2N1cnJlbnRfcHJlY2luY3QtPnkxID0gb3BqX2ludF9taW4oY2JneWVuZCwgbF9iYW5kLT55MSk7CisJCQkJCS8qZnByaW50ZihzdGRlcnIsICJcdCBwcmNfeDA9JWQ7IHByY195MD0lZCwgcHJjX3gxPSVkOyBwcmNfeTE9JWRcbiIsbF9jdXJyZW50X3ByZWNpbmN0LT54MCwgbF9jdXJyZW50X3ByZWNpbmN0LT55MCAsbF9jdXJyZW50X3ByZWNpbmN0LT54MSwgbF9jdXJyZW50X3ByZWNpbmN0LT55MSk7Ki8KKwkJCQkJCisJCQkJCXRsY2Jsa3hzdGFydCA9IG9wal9pbnRfZmxvb3JkaXZwb3cyKGxfY3VycmVudF9wcmVjaW5jdC0+eDAsIChPUEpfSU5UMzIpY2Jsa3dpZHRoZXhwbikgPDwgY2Jsa3dpZHRoZXhwbjsKKwkJCQkJLypmcHJpbnRmKHN0ZGVyciwgIlx0IHRsY2Jsa3hzdGFydCA9JWRcbiIsdGxjYmxreHN0YXJ0ICk7Ki8KKwkJCQkJdGxjYmxreXN0YXJ0ID0gb3BqX2ludF9mbG9vcmRpdnBvdzIobF9jdXJyZW50X3ByZWNpbmN0LT55MCwgKE9QSl9JTlQzMiljYmxraGVpZ2h0ZXhwbikgPDwgY2Jsa2hlaWdodGV4cG47CisJCQkJCS8qZnByaW50ZihzdGRlcnIsICJcdCB0bGNibGt5c3RhcnQgPSVkXG4iLHRsY2Jsa3lzdGFydCApOyovCisJCQkJCWJyY2Jsa3hlbmQgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfY3VycmVudF9wcmVjaW5jdC0+eDEsIChPUEpfSU5UMzIpY2Jsa3dpZHRoZXhwbikgPDwgY2Jsa3dpZHRoZXhwbjsKKwkJCQkJLypmcHJpbnRmKHN0ZGVyciwgIlx0IGJyY2Jsa3hlbmQgPSVkXG4iLGJyY2Jsa3hlbmQgKTsqLworCQkJCQlicmNibGt5ZW5kID0gb3BqX2ludF9jZWlsZGl2cG93MihsX2N1cnJlbnRfcHJlY2luY3QtPnkxLCAoT1BKX0lOVDMyKWNibGtoZWlnaHRleHBuKSA8PCBjYmxraGVpZ2h0ZXhwbjsKKwkJCQkJLypmcHJpbnRmKHN0ZGVyciwgIlx0IGJyY2Jsa3llbmQgPSVkXG4iLGJyY2Jsa3llbmQgKTsqLworCQkJCQlsX2N1cnJlbnRfcHJlY2luY3QtPmN3ID0gKE9QSl9VSU5UMzIpKChicmNibGt4ZW5kIC0gdGxjYmxreHN0YXJ0KSA+PiBjYmxrd2lkdGhleHBuKTsKKwkJCQkJbF9jdXJyZW50X3ByZWNpbmN0LT5jaCA9IChPUEpfVUlOVDMyKSgoYnJjYmxreWVuZCAtIHRsY2Jsa3lzdGFydCkgPj4gY2Jsa2hlaWdodGV4cG4pOworCQkJCQkKKwkJCQkJbF9uYl9jb2RlX2Jsb2NrcyA9IGxfY3VycmVudF9wcmVjaW5jdC0+Y3cgKiBsX2N1cnJlbnRfcHJlY2luY3QtPmNoOworCQkJCQkvKmZwcmludGYoc3RkZXJyLCAiXHRcdFx0XHQgcHJlY2luY3RfY3cgPSAlZCB4IHJlY2luY3RfY2ggPSAlZFxuIixsX2N1cnJlbnRfcHJlY2luY3QtPmN3LCBsX2N1cnJlbnRfcHJlY2luY3QtPmNoKTsgICAgICAqLworCQkJCQlsX25iX2NvZGVfYmxvY2tzX3NpemUgPSBsX25iX2NvZGVfYmxvY2tzICogKE9QSl9VSU5UMzIpc2l6ZW9mX2Jsb2NrOworCQkJCQkKKwkJCQkJaWYgKCEgbF9jdXJyZW50X3ByZWNpbmN0LT5jYmxrcy5ibG9ja3MpIHsKKwkJCQkJCWxfY3VycmVudF9wcmVjaW5jdC0+Y2Jsa3MuYmxvY2tzID0gb3BqX21hbGxvYyhsX25iX2NvZGVfYmxvY2tzX3NpemUpOworCQkJCQkJaWYgKCEgbF9jdXJyZW50X3ByZWNpbmN0LT5jYmxrcy5ibG9ja3MgKSB7CisJCQkJCQkJcmV0dXJuIE9QSl9GQUxTRTsKKwkJCQkJCX0KKwkJCQkJCS8qZnByaW50ZihzdGRlcnIsICJcdFx0XHRcdEFsbG9jYXRlIGNibGtzIG9mIGEgcHJlY2luY3QgKG9wal90Y2RfY2Jsa19kZWNfdCk6ICVkXG4iLGxfbmJfY29kZV9ibG9ja3Nfc2l6ZSk7Ki8KKwkJCQkJCQorCQkJCQkJbWVtc2V0KGxfY3VycmVudF9wcmVjaW5jdC0+Y2Jsa3MuYmxvY2tzLDAsbF9uYl9jb2RlX2Jsb2Nrc19zaXplKTsKKwkJCQkJCQorCQkJCQkJbF9jdXJyZW50X3ByZWNpbmN0LT5ibG9ja19zaXplID0gbF9uYl9jb2RlX2Jsb2Nrc19zaXplOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKGxfbmJfY29kZV9ibG9ja3Nfc2l6ZSA+IGxfY3VycmVudF9wcmVjaW5jdC0+YmxvY2tfc2l6ZSkgeworCQkJCQkJdm9pZCAqbmV3X2Jsb2NrcyA9IG9wal9yZWFsbG9jKGxfY3VycmVudF9wcmVjaW5jdC0+Y2Jsa3MuYmxvY2tzLCBsX25iX2NvZGVfYmxvY2tzX3NpemUpOworCQkJCQkJaWYgKCEgbmV3X2Jsb2NrcykgeworCQkJCQkJCW9wal9mcmVlKGxfY3VycmVudF9wcmVjaW5jdC0+Y2Jsa3MuYmxvY2tzKTsKKwkJCQkJCQlsX2N1cnJlbnRfcHJlY2luY3QtPmNibGtzLmJsb2NrcyA9IE5VTEw7CisJCQkJCQkJbF9jdXJyZW50X3ByZWNpbmN0LT5ibG9ja19zaXplID0gMDsKKwkJCQkJCQlvcGpfZXZlbnRfbXNnKG1hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IGZvciBjdXJyZW50IHByZWNpbmN0IGNvZGVibG9jayBlbGVtZW50XG4iKTsKKwkJCQkJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQkJCQkJfQorCQkJCQkJbF9jdXJyZW50X3ByZWNpbmN0LT5jYmxrcy5ibG9ja3MgPSBuZXdfYmxvY2tzOworCQkJCQkJLypmcHJpbnRmKHN0ZGVyciwgIlx0XHRcdFx0UmVhbGxvY2F0ZSBjYmxrcyBvZiBhIHByZWNpbmN0IChvcGpfdGNkX2NibGtfZGVjX3QpOiBmcm9tICVkIHRvICVkXG4iLGxfY3VycmVudF9wcmVjaW5jdC0+YmxvY2tfc2l6ZSwgbF9uYl9jb2RlX2Jsb2Nrc19zaXplKTsgICAgICovCisJCQkJCQkKKwkJCQkJCW1lbXNldCgoKE9QSl9CWVRFICopIGxfY3VycmVudF9wcmVjaW5jdC0+Y2Jsa3MuYmxvY2tzKSArIGxfY3VycmVudF9wcmVjaW5jdC0+YmxvY2tfc2l6ZQorCQkJCQkJCQkJICwwCisJCQkJCQkJCQkgLGxfbmJfY29kZV9ibG9ja3Nfc2l6ZSAtIGxfY3VycmVudF9wcmVjaW5jdC0+YmxvY2tfc2l6ZSk7CisJCQkJCQkKKwkJCQkJCWxfY3VycmVudF9wcmVjaW5jdC0+YmxvY2tfc2l6ZSA9IGxfbmJfY29kZV9ibG9ja3Nfc2l6ZTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJaWYgKCEgbF9jdXJyZW50X3ByZWNpbmN0LT5pbmNsdHJlZSkgeworCQkJCQkJbF9jdXJyZW50X3ByZWNpbmN0LT5pbmNsdHJlZSA9IG9wal90Z3RfY3JlYXRlKGxfY3VycmVudF9wcmVjaW5jdC0+Y3csIGxfY3VycmVudF9wcmVjaW5jdC0+Y2gsIG1hbmFnZXIpOworCQkJCQl9CisJCQkJCWVsc2V7CisJCQkJCQlsX2N1cnJlbnRfcHJlY2luY3QtPmluY2x0cmVlID0gb3BqX3RndF9pbml0KGxfY3VycmVudF9wcmVjaW5jdC0+aW5jbHRyZWUsIGxfY3VycmVudF9wcmVjaW5jdC0+Y3csIGxfY3VycmVudF9wcmVjaW5jdC0+Y2gsIG1hbmFnZXIpOworCQkJCQl9CisKKwkJCQkJaWYgKCEgbF9jdXJyZW50X3ByZWNpbmN0LT5pbmNsdHJlZSkgICAgIHsKKwkJCQkJCW9wal9ldmVudF9tc2cobWFuYWdlciwgRVZUX1dBUk5JTkcsICJObyBpbmNsdHJlZSBjcmVhdGVkLlxuIik7CisJCQkJCQkvKnJldHVybiBPUEpfRkFMU0U7Ki8KKwkJCQkJfQorCisJCQkJCWlmICghIGxfY3VycmVudF9wcmVjaW5jdC0+aW1zYnRyZWUpIHsKKwkJCQkJCWxfY3VycmVudF9wcmVjaW5jdC0+aW1zYnRyZWUgPSBvcGpfdGd0X2NyZWF0ZShsX2N1cnJlbnRfcHJlY2luY3QtPmN3LCBsX2N1cnJlbnRfcHJlY2luY3QtPmNoLCBtYW5hZ2VyKTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCWxfY3VycmVudF9wcmVjaW5jdC0+aW1zYnRyZWUgPSBvcGpfdGd0X2luaXQobF9jdXJyZW50X3ByZWNpbmN0LT5pbXNidHJlZSwgbF9jdXJyZW50X3ByZWNpbmN0LT5jdywgbF9jdXJyZW50X3ByZWNpbmN0LT5jaCwgbWFuYWdlcik7CisJCQkJCX0KKworCQkJCQlpZiAoISBsX2N1cnJlbnRfcHJlY2luY3QtPmltc2J0cmVlKSB7CisJCQkJCQlvcGpfZXZlbnRfbXNnKG1hbmFnZXIsIEVWVF9XQVJOSU5HLCAiTm8gaW1zYnRyZWUgY3JlYXRlZC5cbiIpOworCQkJCQkJLypyZXR1cm4gT1BKX0ZBTFNFOyovCisJCQkJCX0KKworCQkJCQlmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IGxfbmJfY29kZV9ibG9ja3M7ICsrY2Jsa25vKSB7CisJCQkJCQlPUEpfSU5UMzIgY2Jsa3hzdGFydCA9IHRsY2Jsa3hzdGFydCArIChPUEpfSU5UMzIpKGNibGtubyAlIGxfY3VycmVudF9wcmVjaW5jdC0+Y3cpICogKDEgPDwgY2Jsa3dpZHRoZXhwbik7CisJCQkJCQlPUEpfSU5UMzIgY2Jsa3lzdGFydCA9IHRsY2Jsa3lzdGFydCArIChPUEpfSU5UMzIpKGNibGtubyAvIGxfY3VycmVudF9wcmVjaW5jdC0+Y3cpICogKDEgPDwgY2Jsa2hlaWdodGV4cG4pOworCQkJCQkJT1BKX0lOVDMyIGNibGt4ZW5kID0gY2Jsa3hzdGFydCArICgxIDw8IGNibGt3aWR0aGV4cG4pOworCQkJCQkJT1BKX0lOVDMyIGNibGt5ZW5kID0gY2Jsa3lzdGFydCArICgxIDw8IGNibGtoZWlnaHRleHBuKTsKKwkJCQkJCQorCQkJCQkJaWYgKGlzRW5jb2RlcikgeworCQkJCQkJCW9wal90Y2RfY2Jsa19lbmNfdCogbF9jb2RlX2Jsb2NrID0gbF9jdXJyZW50X3ByZWNpbmN0LT5jYmxrcy5lbmMgKyBjYmxrbm87CisJCQkJCQkJCisJCQkJCQkJaWYgKCEgb3BqX3RjZF9jb2RlX2Jsb2NrX2VuY19hbGxvY2F0ZShsX2NvZGVfYmxvY2spKSB7CisJCQkJCQkJCXJldHVybiBPUEpfRkFMU0U7CisJCQkJCQkJfQorCQkJCQkJCS8qIGNvZGUtYmxvY2sgc2l6ZSAoZ2xvYmFsKSAqLworCQkJCQkJCWxfY29kZV9ibG9jay0+eDAgPSBvcGpfaW50X21heChjYmxreHN0YXJ0LCBsX2N1cnJlbnRfcHJlY2luY3QtPngwKTsKKwkJCQkJCQlsX2NvZGVfYmxvY2stPnkwID0gb3BqX2ludF9tYXgoY2Jsa3lzdGFydCwgbF9jdXJyZW50X3ByZWNpbmN0LT55MCk7CisJCQkJCQkJbF9jb2RlX2Jsb2NrLT54MSA9IG9wal9pbnRfbWluKGNibGt4ZW5kLCBsX2N1cnJlbnRfcHJlY2luY3QtPngxKTsKKwkJCQkJCQlsX2NvZGVfYmxvY2stPnkxID0gb3BqX2ludF9taW4oY2Jsa3llbmQsIGxfY3VycmVudF9wcmVjaW5jdC0+eTEpOworCQkJCQkJCQorCQkJCQkJCWlmICghIG9wal90Y2RfY29kZV9ibG9ja19lbmNfYWxsb2NhdGVfZGF0YShsX2NvZGVfYmxvY2spKSB7CisJCQkJCQkJCXJldHVybiBPUEpfRkFMU0U7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlvcGpfdGNkX2NibGtfZGVjX3QqIGxfY29kZV9ibG9jayA9IGxfY3VycmVudF9wcmVjaW5jdC0+Y2Jsa3MuZGVjICsgY2Jsa25vOworCQkJCQkJCQorCQkJCQkJCWlmICghIG9wal90Y2RfY29kZV9ibG9ja19kZWNfYWxsb2NhdGUobF9jb2RlX2Jsb2NrKSkgeworCQkJCQkJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQkJCQkJCX0KKwkJCQkJCQkvKiBjb2RlLWJsb2NrIHNpemUgKGdsb2JhbCkgKi8KKwkJCQkJCQlsX2NvZGVfYmxvY2stPngwID0gb3BqX2ludF9tYXgoY2Jsa3hzdGFydCwgbF9jdXJyZW50X3ByZWNpbmN0LT54MCk7CisJCQkJCQkJbF9jb2RlX2Jsb2NrLT55MCA9IG9wal9pbnRfbWF4KGNibGt5c3RhcnQsIGxfY3VycmVudF9wcmVjaW5jdC0+eTApOworCQkJCQkJCWxfY29kZV9ibG9jay0+eDEgPSBvcGpfaW50X21pbihjYmxreGVuZCwgbF9jdXJyZW50X3ByZWNpbmN0LT54MSk7CisJCQkJCQkJbF9jb2RlX2Jsb2NrLT55MSA9IG9wal9pbnRfbWluKGNibGt5ZW5kLCBsX2N1cnJlbnRfcHJlY2luY3QtPnkxKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkrK2xfY3VycmVudF9wcmVjaW5jdDsKKwkJCQl9IC8qIHByZWNubyAqLworCQkJCSsrbF9iYW5kOworCQkJCSsrbF9zdGVwX3NpemU7CisJCQl9IC8qIGJhbmRubyAqLworCQkJKytsX3JlczsKKwkJCS0tbF9sZXZlbF9ubzsKKwkJfSAvKiByZXNubyAqLworCQkrK2xfdGNjcDsKKwkJKytsX3RpbGVjOworCQkrK2xfaW1hZ2VfY29tcDsKKwl9IC8qIGNvbXBubyAqLworCXJldHVybiBPUEpfVFJVRTsKK30KKworT1BKX0JPT0wgb3BqX3RjZF9pbml0X2VuY29kZV90aWxlIChvcGpfdGNkX3QgKnBfdGNkLCBPUEpfVUlOVDMyIHBfdGlsZV9ubywgb3BqX2V2ZW50X21ncl90KiBwX21hbmFnZXIpCit7CisJcmV0dXJuIG9wal90Y2RfaW5pdF90aWxlKHBfdGNkLCBwX3RpbGVfbm8sIE9QSl9UUlVFLCAxLjBGLCBzaXplb2Yob3BqX3RjZF9jYmxrX2VuY190KSwgcF9tYW5hZ2VyKTsKK30KKworT1BKX0JPT0wgb3BqX3RjZF9pbml0X2RlY29kZV90aWxlIChvcGpfdGNkX3QgKnBfdGNkLCBPUEpfVUlOVDMyIHBfdGlsZV9ubywgb3BqX2V2ZW50X21ncl90KiBwX21hbmFnZXIpCit7CisJcmV0dXJuIG9wal90Y2RfaW5pdF90aWxlKHBfdGNkLCBwX3RpbGVfbm8sIE9QSl9GQUxTRSwgMC41Riwgc2l6ZW9mKG9wal90Y2RfY2Jsa19kZWNfdCksIHBfbWFuYWdlcik7Cit9CisKKy8qKgorICogQWxsb2NhdGVzIG1lbW9yeSBmb3IgYW4gZW5jb2RpbmcgY29kZSBibG9jayAoYnV0IG5vdCBkYXRhIG1lbW9yeSkuCisgKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX2NvZGVfYmxvY2tfZW5jX2FsbG9jYXRlIChvcGpfdGNkX2NibGtfZW5jX3QgKiBwX2NvZGVfYmxvY2spCit7CisJaWYgKCEgcF9jb2RlX2Jsb2NrLT5sYXllcnMpIHsKKwkJLyogbm8gbWVtc2V0IHNpbmNlIGRhdGEgKi8KKwkJcF9jb2RlX2Jsb2NrLT5sYXllcnMgPSAob3BqX3RjZF9sYXllcl90Kikgb3BqX2NhbGxvYygxMDAsIHNpemVvZihvcGpfdGNkX2xheWVyX3QpKTsKKwkJaWYgKCEgcF9jb2RlX2Jsb2NrLT5sYXllcnMpIHsKKwkJCXJldHVybiBPUEpfRkFMU0U7CisJCX0KKwl9CisJaWYgKCEgcF9jb2RlX2Jsb2NrLT5wYXNzZXMpIHsKKwkJcF9jb2RlX2Jsb2NrLT5wYXNzZXMgPSAob3BqX3RjZF9wYXNzX3QqKSBvcGpfY2FsbG9jKDEwMCwgc2l6ZW9mKG9wal90Y2RfcGFzc190KSk7CisJCWlmICghIHBfY29kZV9ibG9jay0+cGFzc2VzKSB7CisJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQl9CisJfQorCXJldHVybiBPUEpfVFJVRTsKK30KKworLyoqCisgKiBBbGxvY2F0ZXMgZGF0YSBtZW1vcnkgZm9yIGFuIGVuY29kaW5nIGNvZGUgYmxvY2suCisgKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX2NvZGVfYmxvY2tfZW5jX2FsbG9jYXRlX2RhdGEgKG9wal90Y2RfY2Jsa19lbmNfdCAqIHBfY29kZV9ibG9jaykKK3sKKwlPUEpfVUlOVDMyIGxfZGF0YV9zaXplOworCQorCWxfZGF0YV9zaXplID0gKE9QSl9VSU5UMzIpKChwX2NvZGVfYmxvY2stPngxIC0gcF9jb2RlX2Jsb2NrLT54MCkgKiAocF9jb2RlX2Jsb2NrLT55MSAtIHBfY29kZV9ibG9jay0+eTApICogKE9QSl9JTlQzMilzaXplb2YoT1BKX1VJTlQzMikpOworCQorCWlmIChsX2RhdGFfc2l6ZSA+IHBfY29kZV9ibG9jay0+ZGF0YV9zaXplKSB7CisJCWlmIChwX2NvZGVfYmxvY2stPmRhdGEpIHsKKwkJCW9wal9mcmVlKHBfY29kZV9ibG9jay0+ZGF0YSAtIDEpOyAvKiBhZ2Fpbiwgd2h5IC0xICovCisJCX0KKwkJcF9jb2RlX2Jsb2NrLT5kYXRhID0gKE9QSl9CWVRFKikgb3BqX21hbGxvYyhsX2RhdGFfc2l6ZSsxKTsKKwkJaWYoISBwX2NvZGVfYmxvY2stPmRhdGEpIHsKKwkJCXBfY29kZV9ibG9jay0+ZGF0YV9zaXplID0gMFU7CisJCQlyZXR1cm4gT1BKX0ZBTFNFOworCQl9CisJCXBfY29kZV9ibG9jay0+ZGF0YV9zaXplID0gbF9kYXRhX3NpemU7CisJCQorCQlwX2NvZGVfYmxvY2stPmRhdGFbMF0gPSAwOworCQlwX2NvZGVfYmxvY2stPmRhdGErPTE7ICAgLyp3aHkgKzEgPyovCisJfQorCXJldHVybiBPUEpfVFJVRTsKK30KKworLyoqCisgKiBBbGxvY2F0ZXMgbWVtb3J5IGZvciBhIGRlY29kaW5nIGNvZGUgYmxvY2suCisgKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX2NvZGVfYmxvY2tfZGVjX2FsbG9jYXRlIChvcGpfdGNkX2NibGtfZGVjX3QgKiBwX2NvZGVfYmxvY2spCit7CisgICAgICAgIGlmICghIHBfY29kZV9ibG9jay0+ZGF0YSkgeworCisgICAgICAgICAgICAgICAgcF9jb2RlX2Jsb2NrLT5kYXRhID0gKE9QSl9CWVRFKikgb3BqX21hbGxvYyhPUEpfSjJLX0RFRkFVTFRfQ0JMS19EQVRBX1NJWkUpOworICAgICAgICAgICAgICAgIGlmICghIHBfY29kZV9ibG9jay0+ZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcF9jb2RlX2Jsb2NrLT5kYXRhX21heF9zaXplID0gT1BKX0oyS19ERUZBVUxUX0NCTEtfREFUQV9TSVpFOworICAgICAgICAgICAgICAgIC8qZnByaW50ZihzdGRlcnIsICJBbGxvY2F0ZSA4MTkyIGVsZW1lbnRzIG9mIGNvZGVfYmxvY2stPmRhdGFcbiIpOyovCisKKyAgICAgICAgICAgICAgICBwX2NvZGVfYmxvY2stPnNlZ3MgPSAob3BqX3RjZF9zZWdfdCAqKSBvcGpfY2FsbG9jKE9QSl9KMktfREVGQVVMVF9OQl9TRUdTLHNpemVvZihvcGpfdGNkX3NlZ190KSk7CisgICAgICAgICAgICAgICAgaWYgKCEgcF9jb2RlX2Jsb2NrLT5zZWdzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKmZwcmludGYoc3RkZXJyLCAiQWxsb2NhdGUgJWQgZWxlbWVudHMgb2YgY29kZV9ibG9jay0+ZGF0YVxuIiwgT1BKX0oyS19ERUZBVUxUX05CX1NFR1MgKiBzaXplb2Yob3BqX3RjZF9zZWdfdCkpOyovCisKKyAgICAgICAgICAgICAgICBwX2NvZGVfYmxvY2stPm1fY3VycmVudF9tYXhfc2VncyA9IE9QSl9KMktfREVGQVVMVF9OQl9TRUdTOworICAgICAgICAgICAgICAgIC8qZnByaW50ZihzdGRlcnIsICJtX2N1cnJlbnRfbWF4X3NlZ3Mgb2YgY29kZV9ibG9jay0+ZGF0YSA9ICVkXG4iLCBwX2NvZGVfYmxvY2stPm1fY3VycmVudF9tYXhfc2Vncyk7Ki8KKyAgICAgICAgfSBlbHNlIHsKKwkJCQkJLyogc2FuaXRpemUgKi8KKwkJCQkJT1BKX0JZVEUqIGxfZGF0YSA9IHBfY29kZV9ibG9jay0+ZGF0YTsKKwkJCQkJT1BKX1VJTlQzMiBsX2RhdGFfbWF4X3NpemUgPSBwX2NvZGVfYmxvY2stPmRhdGFfbWF4X3NpemU7CisJCQkJCW9wal90Y2Rfc2VnX3QgKiBsX3NlZ3MgPSBwX2NvZGVfYmxvY2stPnNlZ3M7CisJCQkJCU9QSl9VSU5UMzIgbF9jdXJyZW50X21heF9zZWdzID0gcF9jb2RlX2Jsb2NrLT5tX2N1cnJlbnRfbWF4X3NlZ3M7CisKKwkJCQkJbWVtc2V0KHBfY29kZV9ibG9jaywgMCwgc2l6ZW9mKG9wal90Y2RfY2Jsa19kZWNfdCkpOworCQkJCQlwX2NvZGVfYmxvY2stPmRhdGEgPSBsX2RhdGE7CisJCQkJCXBfY29kZV9ibG9jay0+ZGF0YV9tYXhfc2l6ZSA9IGxfZGF0YV9tYXhfc2l6ZTsKKwkJCQkJcF9jb2RlX2Jsb2NrLT5zZWdzID0gbF9zZWdzOworCQkJCQlwX2NvZGVfYmxvY2stPm1fY3VycmVudF9tYXhfc2VncyA9IGxfY3VycmVudF9tYXhfc2VnczsKKwkJCQl9CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitPUEpfVUlOVDMyIG9wal90Y2RfZ2V0X2RlY29kZWRfdGlsZV9zaXplICggb3BqX3RjZF90ICpwX3RjZCApCit7CisgICAgICAgIE9QSl9VSU5UMzIgaTsKKyAgICAgICAgT1BKX1VJTlQzMiBsX2RhdGFfc2l6ZSA9IDA7CisgICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wID0gMDA7CisgICAgICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqIGxfdGlsZV9jb21wID0gMDA7CisgICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90ICogbF9yZXMgPSAwMDsKKyAgICAgICAgT1BKX1VJTlQzMiBsX3NpemVfY29tcCwgbF9yZW1haW5pbmc7CisKKyAgICAgICAgbF90aWxlX2NvbXAgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+Y29tcHM7CisgICAgICAgIGxfaW1nX2NvbXAgPSBwX3RjZC0+aW1hZ2UtPmNvbXBzOworCisgICAgICAgIGZvciAoaT0wO2k8cF90Y2QtPmltYWdlLT5udW1jb21wczsrK2kpIHsKKyAgICAgICAgICAgICAgICBsX3NpemVfY29tcCA9IGxfaW1nX2NvbXAtPnByZWMgPj4gMzsgLyooLyA4KSovCisgICAgICAgICAgICAgICAgbF9yZW1haW5pbmcgPSBsX2ltZ19jb21wLT5wcmVjICYgNzsgIC8qICglOCkgKi8KKworICAgICAgICAgICAgICAgIGlmKGxfcmVtYWluaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICArK2xfc2l6ZV9jb21wOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsX3NpemVfY29tcCA9PSAzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsX3NpemVfY29tcCA9IDQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbF9yZXMgPSBsX3RpbGVfY29tcC0+cmVzb2x1dGlvbnMgKyBsX3RpbGVfY29tcC0+bWluaW11bV9udW1fcmVzb2x1dGlvbnMgLSAxOworICAgICAgICAgICAgICAgIGxfZGF0YV9zaXplICs9IGxfc2l6ZV9jb21wICogKE9QSl9VSU5UMzIpKChsX3Jlcy0+eDEgLSBsX3Jlcy0+eDApICogKGxfcmVzLT55MSAtIGxfcmVzLT55MCkpOworICAgICAgICAgICAgICAgICsrbF9pbWdfY29tcDsKKyAgICAgICAgICAgICAgICArK2xfdGlsZV9jb21wOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxfZGF0YV9zaXplOworfQorCitPUEpfQk9PTCBvcGpfdGNkX2VuY29kZV90aWxlKCAgIG9wal90Y2RfdCAqcF90Y2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqcF9kZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmZvX3QgKnBfY3N0cl9pbmZvKQoreworCisgICAgICAgIGlmIChwX3RjZC0+Y3VyX3RwX251bSA9PSAwKSB7CisKKyAgICAgICAgICAgICAgICBwX3RjZC0+dGNkX3RpbGVubyA9IHBfdGlsZV9ubzsKKyAgICAgICAgICAgICAgICBwX3RjZC0+dGNwID0gJnBfdGNkLT5jcC0+dGNwc1twX3RpbGVfbm9dOworCisgICAgICAgICAgICAgICAgLyogSU5ERVggPj4gIlByZWNpbmN0X25iX1ggZXQgUHJlY2luY3RfbmJfWSIgKi8KKyAgICAgICAgICAgICAgICBpZihwX2NzdHJfaW5mbykgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbF9udW1fcGFja3MgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBpOworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlY29tcF90ICpsX3RpbGVjX2lkeCA9ICZwX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+Y29tcHNbMF07ICAgICAgICAvKiBiYXNlZCBvbiBjb21wb25lbnQgMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjY3BfdCAqbF90Y2NwID0gcF90Y2QtPnRjcC0+dGNjcHM7IC8qIGJhc2VkIG9uIGNvbXBvbmVudCAwICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsX3RpbGVjX2lkeC0+bnVtcmVzb2x1dGlvbnM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCAqbF9yZXNfaWR4ID0gJmxfdGlsZWNfaWR4LT5yZXNvbHV0aW9uc1tpXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dLnB3W2ldID0gKGludClsX3Jlc19pZHgtPnB3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dLnBoW2ldID0gKGludClsX3Jlc19pZHgtPnBoOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfbnVtX3BhY2tzICs9IGxfcmVzX2lkeC0+cHcgKiBsX3Jlc19pZHgtPnBoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dLnBkeFtpXSA9IChpbnQpbF90Y2NwLT5wcmN3W2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dLnBkeVtpXSA9IChpbnQpbF90Y2NwLT5wcmNoW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcF9jc3RyX2luZm8tPnRpbGVbcF90aWxlX25vXS5wYWNrZXQgPSAob3BqX3BhY2tldF9pbmZvX3QqKSBvcGpfY2FsbG9jKChzaXplX3QpcF9jc3RyX2luZm8tPm51bWNvbXBzICogKHNpemVfdClwX2NzdHJfaW5mby0+bnVtbGF5ZXJzICogbF9udW1fcGFja3MsIHNpemVvZihvcGpfcGFja2V0X2luZm9fdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwX2NzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dLnBhY2tldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGSVhNRSBldmVudCBtYW5hZ2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIDw8IElOREVYICovCisKKyAgICAgICAgICAgICAgICAvKiBGSVhNRSBfUHJvZlN0YXJ0KFBHUk9VUF9EQ19TSElGVCk7ICovCisgICAgICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS1USUxFLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAgICAgICAgICAgaWYgKCEgb3BqX3RjZF9kY19sZXZlbF9zaGlmdF9lbmNvZGUocF90Y2QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBGSVhNRSBfUHJvZlN0b3AoUEdST1VQX0RDX1NISUZUKTsgKi8KKworICAgICAgICAgICAgICAgIC8qIEZJWE1FIF9Qcm9mU3RhcnQoUEdST1VQX01DVCk7ICovCisgICAgICAgICAgICAgICAgaWYgKCEgb3BqX3RjZF9tY3RfZW5jb2RlKHBfdGNkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogRklYTUUgX1Byb2ZTdG9wKFBHUk9VUF9NQ1QpOyAqLworCisgICAgICAgICAgICAgICAgLyogRklYTUUgX1Byb2ZTdGFydChQR1JPVVBfRFdUKTsgKi8KKyAgICAgICAgICAgICAgICBpZiAoISBvcGpfdGNkX2R3dF9lbmNvZGUocF90Y2QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBGSVhNRSAgX1Byb2ZTdG9wKFBHUk9VUF9EV1QpOyAqLworCisgICAgICAgICAgICAgICAgLyogRklYTUUgIF9Qcm9mU3RhcnQoUEdST1VQX1QxKTsgKi8KKyAgICAgICAgICAgICAgICBpZiAoISBvcGpfdGNkX3QxX2VuY29kZShwX3RjZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIEZJWE1FIF9Qcm9mU3RvcChQR1JPVVBfVDEpOyAqLworCisgICAgICAgICAgICAgICAgLyogRklYTUUgX1Byb2ZTdGFydChQR1JPVVBfUkFURSk7ICovCisgICAgICAgICAgICAgICAgaWYgKCEgb3BqX3RjZF9yYXRlX2FsbG9jYXRlX2VuY29kZShwX3RjZCxwX2Rlc3QscF9tYXhfbGVuZ3RoLHBfY3N0cl9pbmZvKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogRklYTUUgX1Byb2ZTdG9wKFBHUk9VUF9SQVRFKTsgKi8KKworICAgICAgICB9CisgICAgICAgIC8qLS0tLS0tLS0tLS0tLS1USUVSMi0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAgICAgLyogSU5ERVggKi8KKyAgICAgICAgaWYgKHBfY3N0cl9pbmZvKSB7CisgICAgICAgICAgICAgICAgcF9jc3RyX2luZm8tPmluZGV4X3dyaXRlID0gMTsKKyAgICAgICAgfQorICAgICAgICAvKiBGSVhNRSBfUHJvZlN0YXJ0KFBHUk9VUF9UMik7ICovCisKKyAgICAgICAgaWYgKCEgb3BqX3RjZF90Ml9lbmNvZGUocF90Y2QscF9kZXN0LHBfZGF0YV93cml0dGVuLHBfbWF4X2xlbmd0aCxwX2NzdHJfaW5mbykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIC8qIEZJWE1FIF9Qcm9mU3RvcChQR1JPVVBfVDIpOyAqLworCisgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tQ0xFQU4tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK09QSl9CT09MIG9wal90Y2RfZGVjb2RlX3RpbGUoICAgb3BqX3RjZF90ICpwX3RjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKnBfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZGV4X3QgKnBfY3N0cl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgICAgICBPUEpfVUlOVDMyIGxfZGF0YV9yZWFkOworICAgICAgICBwX3RjZC0+dGNkX3RpbGVubyA9IHBfdGlsZV9ubzsKKyAgICAgICAgcF90Y2QtPnRjcCA9ICYocF90Y2QtPmNwLT50Y3BzW3BfdGlsZV9ub10pOworCisjaWZkZWYgVE9ET19NU0QgLyogRklYTUUgKi8KKyAgICAgICAgLyogSU5ERVggPj4gICovCisgICAgICAgIGlmKHBfY3N0cl9pbmZvKSB7CisgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiByZXNubywgY29tcG5vLCBudW1wcmVjID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IChPUEpfVUlOVDMyKSBwX2NzdHJfaW5mby0+bnVtY29tcHM7IGNvbXBubysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNwX3QgKnRjcCA9ICZwX3RjZC0+Y3AtPnRjcHNbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNjcF90ICp0Y2NwID0gJnRjcC0+dGNjcHNbY29tcG5vXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqdGlsZWNfaWR4ID0gJnBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT5jb21wc1tjb21wbm9dOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChyZXNubyA9IDA7IHJlc25vIDwgdGlsZWNfaWR4LT5udW1yZXNvbHV0aW9uczsgcmVzbm8rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCAqcmVzX2lkeCA9ICZ0aWxlY19pZHgtPnJlc29sdXRpb25zW3Jlc25vXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jc3RyX2luZm8tPnRpbGVbcF90aWxlX25vXS5wd1tyZXNub10gPSByZXNfaWR4LT5wdzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jc3RyX2luZm8tPnRpbGVbcF90aWxlX25vXS5waFtyZXNub10gPSByZXNfaWR4LT5waDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtcHJlYyArPSByZXNfaWR4LT5wdyAqIHJlc19pZHgtPnBoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dLnBkeFtyZXNub10gPSB0Y2NwLT5wcmN3W3Jlc25vXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jc3RyX2luZm8tPnRpbGVbcF90aWxlX25vXS5wZHlbcmVzbm9dID0gdGNjcC0+cHJjaFtyZXNub107CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBfY3N0cl9pbmZvLT50aWxlW3BfdGlsZV9ub10ucGFja2V0ID0gKG9wal9wYWNrZXRfaW5mb190ICopIG9wal9tYWxsb2MocF9jc3RyX2luZm8tPm51bWxheWVycyAqIG51bXByZWMgKiBzaXplb2Yob3BqX3BhY2tldF9pbmZvX3QpKTsKKyAgICAgICAgICAgICAgICBwX2NzdHJfaW5mby0+cGFja25vID0gMDsKKyAgICAgICAgfQorICAgICAgICAvKiA8PCBJTkRFWCAqLworI2VuZGlmCisKKyAgICAgICAgLyotLS0tLS0tLS0tLS0tLVRJRVIyLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgICAgLyogRklYTUUgX1Byb2ZTdGFydChQR1JPVVBfVDIpOyAqLworICAgICAgICBsX2RhdGFfcmVhZCA9IDA7CisgICAgICAgIGlmICghIG9wal90Y2RfdDJfZGVjb2RlKHBfdGNkLCBwX3NyYywgJmxfZGF0YV9yZWFkLCBwX21heF9sZW5ndGgsIHBfY3N0cl9pbmRleCwgcF9tYW5hZ2VyKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgLyogRklYTUUgX1Byb2ZTdG9wKFBHUk9VUF9UMik7ICovCisKKyAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS1USUVSMS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgICAgICAvKiBGSVhNRSBfUHJvZlN0YXJ0KFBHUk9VUF9UMSk7ICovCisgICAgICAgIGlmCisgICAgICAgICAgICAgICAgKCEgb3BqX3RjZF90MV9kZWNvZGUocF90Y2QpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICAvKiBGSVhNRSBfUHJvZlN0b3AoUEdST1VQX1QxKTsgKi8KKworICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS1EV1QtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgICAgIC8qIEZJWE1FIF9Qcm9mU3RhcnQoUEdST1VQX0RXVCk7ICovCisgICAgICAgIGlmCisgICAgICAgICAgICAgICAgKCEgb3BqX3RjZF9kd3RfZGVjb2RlKHBfdGNkKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgLyogRklYTUUgX1Byb2ZTdG9wKFBHUk9VUF9EV1QpOyAqLworCisgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLU1DVC0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgICAvKiBGSVhNRSBfUHJvZlN0YXJ0KFBHUk9VUF9NQ1QpOyAqLworICAgICAgICBpZgorICAgICAgICAgICAgICAgICghIG9wal90Y2RfbWN0X2RlY29kZShwX3RjZCwgcF9tYW5hZ2VyKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgLyogRklYTUUgX1Byb2ZTdG9wKFBHUk9VUF9NQ1QpOyAqLworCisgICAgICAgIC8qIEZJWE1FIF9Qcm9mU3RhcnQoUEdST1VQX0RDX1NISUZUKTsgKi8KKyAgICAgICAgaWYKKyAgICAgICAgICAgICAgICAoISBvcGpfdGNkX2RjX2xldmVsX3NoaWZ0X2RlY29kZShwX3RjZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIC8qIEZJWE1FIF9Qcm9mU3RvcChQR1JPVVBfRENfU0hJRlQpOyAqLworCisKKyAgICAgICAgLyotLS0tLS0tLS0tLS0tLS1USUxFLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworT1BKX0JPT0wgb3BqX3RjZF91cGRhdGVfdGlsZV9kYXRhICggb3BqX3RjZF90ICpwX3RjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2Rlc3RfbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgICAgIE9QSl9VSU5UMzIgaSxqLGssbF9kYXRhX3NpemUgPSAwOworICAgICAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IDAwOworICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKiBsX3RpbGVjID0gMDA7CisgICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90ICogbF9yZXM7CisgICAgICAgIE9QSl9VSU5UMzIgbF9zaXplX2NvbXAsIGxfcmVtYWluaW5nOworICAgICAgICBPUEpfVUlOVDMyIGxfc3RyaWRlLCBsX3dpZHRoLGxfaGVpZ2h0OworCisgICAgICAgIGxfZGF0YV9zaXplID0gb3BqX3RjZF9nZXRfZGVjb2RlZF90aWxlX3NpemUocF90Y2QpOworICAgICAgICBpZiAobF9kYXRhX3NpemUgPiBwX2Rlc3RfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGxfdGlsZWMgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+Y29tcHM7CisgICAgICAgIGxfaW1nX2NvbXAgPSBwX3RjZC0+aW1hZ2UtPmNvbXBzOworCisgICAgICAgIGZvciAoaT0wO2k8cF90Y2QtPmltYWdlLT5udW1jb21wczsrK2kpIHsKKyAgICAgICAgICAgICAgICBsX3NpemVfY29tcCA9IGxfaW1nX2NvbXAtPnByZWMgPj4gMzsgLyooLyA4KSovCisgICAgICAgICAgICAgICAgbF9yZW1haW5pbmcgPSBsX2ltZ19jb21wLT5wcmVjICYgNzsgIC8qICglOCkgKi8KKyAgICAgICAgICAgICAgICBsX3JlcyA9IGxfdGlsZWMtPnJlc29sdXRpb25zICsgbF9pbWdfY29tcC0+cmVzbm9fZGVjb2RlZDsKKyAgICAgICAgICAgICAgICBsX3dpZHRoID0gKE9QSl9VSU5UMzIpKGxfcmVzLT54MSAtIGxfcmVzLT54MCk7CisgICAgICAgICAgICAgICAgbF9oZWlnaHQgPSAoT1BKX1VJTlQzMikobF9yZXMtPnkxIC0gbF9yZXMtPnkwKTsKKyAgICAgICAgICAgICAgICBsX3N0cmlkZSA9IChPUEpfVUlOVDMyKShsX3RpbGVjLT54MSAtIGxfdGlsZWMtPngwKSAtIGxfd2lkdGg7CisKKyAgICAgICAgICAgICAgICBpZiAobF9yZW1haW5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrbF9zaXplX2NvbXA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGxfc2l6ZV9jb21wID09IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfc2l6ZV9jb21wID0gNDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGxfc2l6ZV9jb21wKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0NIQVIgKiBsX2Rlc3RfcHRyID0gKE9QSl9DSEFSICopIHBfZGVzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUEpfSU5UMzIgKiBsX3NyY19wdHIgPSBsX3RpbGVjLT5kYXRhOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfaW1nX2NvbXAtPnNnbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9oZWlnaHQ7KytqKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaz0wO2s8bF93aWR0aDsrK2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGxfZGVzdF9wdHIrKykgPSAoT1BKX0NIQVIpICgqKGxfc3JjX3B0cisrKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zcmNfcHRyICs9IGxfc3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9oZWlnaHQ7KytqKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAgICAgKGs9MDtrPGxfd2lkdGg7KytrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKE9QSl9DSEFSKSAoKCoobF9zcmNfcHRyKyspKSYweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NyY19wdHIgKz0gbF9zdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kZXN0ID0gKE9QSl9CWVRFICopbF9kZXN0X3B0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9QSl9JTlQzMiAqIGxfc3JjX3B0ciA9IGxfdGlsZWMtPmRhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDE2ICogbF9kZXN0X3B0ciA9IChPUEpfSU5UMTYgKikgcF9kZXN0OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfaW1nX2NvbXAtPnNnbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9oZWlnaHQ7KytqKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaz0wO2s8bF93aWR0aDsrK2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGxfZGVzdF9wdHIrKykgPSAoT1BKX0lOVDE2KSAoKihsX3NyY19wdHIrKykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX3N0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfaGVpZ2h0OysraikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGs9MDtrPGxfd2lkdGg7KytrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKE9QSl9JTlQxNikgKCgqKGxfc3JjX3B0cisrKSkmMHhmZmZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NyY19wdHIgKz0gbF9zdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kZXN0ID0gKE9QSl9CWVRFKikgbF9kZXN0X3B0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIGxfZGVzdF9wdHIgPSAoT1BKX0lOVDMyICopIHBfZGVzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBsX3NyY19wdHIgPSBsX3RpbGVjLT5kYXRhOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7ajxsX2hlaWdodDsrK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaz0wO2s8bF93aWR0aDsrK2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKCoobF9zcmNfcHRyKyspKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX3N0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Rlc3QgPSAoT1BKX0JZVEUqKSBsX2Rlc3RfcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICsrbF9pbWdfY29tcDsKKyAgICAgICAgICAgICAgICArK2xfdGlsZWM7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKKworCisKK3N0YXRpYyB2b2lkIG9wal90Y2RfZnJlZV90aWxlKG9wal90Y2RfdCAqcF90Y2QpCit7CisgICAgICAgIE9QSl9VSU5UMzIgY29tcG5vLCByZXNubywgYmFuZG5vLCBwcmVjbm87CisgICAgICAgIG9wal90Y2RfdGlsZV90ICpsX3RpbGUgPSAwMDsKKyAgICAgICAgb3BqX3RjZF90aWxlY29tcF90ICpsX3RpbGVfY29tcCA9IDAwOworICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCAqbF9yZXMgPSAwMDsKKyAgICAgICAgb3BqX3RjZF9iYW5kX3QgKmxfYmFuZCA9IDAwOworICAgICAgICBvcGpfdGNkX3ByZWNpbmN0X3QgKmxfcHJlY2luY3QgPSAwMDsKKyAgICAgICAgT1BKX1VJTlQzMiBsX25iX3Jlc29sdXRpb25zLCBsX25iX3ByZWNpbmN0czsKKyAgICAgICAgdm9pZCAoKiBsX3RjZF9jb2RlX2Jsb2NrX2RlYWxsb2NhdGUpIChvcGpfdGNkX3ByZWNpbmN0X3QgKikgPSAwMDsKKworICAgICAgICBpZiAoISBwX3RjZCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghIHBfdGNkLT50Y2RfaW1hZ2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAocF90Y2QtPm1faXNfZGVjb2RlcikgeworICAgICAgICAgICAgICAgIGxfdGNkX2NvZGVfYmxvY2tfZGVhbGxvY2F0ZSA9IG9wal90Y2RfY29kZV9ibG9ja19kZWNfZGVhbGxvY2F0ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsX3RjZF9jb2RlX2Jsb2NrX2RlYWxsb2NhdGUgPSBvcGpfdGNkX2NvZGVfYmxvY2tfZW5jX2RlYWxsb2NhdGU7CisgICAgICAgIH0KKworICAgICAgICBsX3RpbGUgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlczsKKyAgICAgICAgaWYgKCEgbF90aWxlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbF90aWxlX2NvbXAgPSBsX3RpbGUtPmNvbXBzOworCisgICAgICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgbF90aWxlLT5udW1jb21wczsgKytjb21wbm8pIHsKKyAgICAgICAgICAgICAgICBsX3JlcyA9IGxfdGlsZV9jb21wLT5yZXNvbHV0aW9uczsKKyAgICAgICAgICAgICAgICBpZiAobF9yZXMpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgbF9uYl9yZXNvbHV0aW9ucyA9IGxfdGlsZV9jb21wLT5yZXNvbHV0aW9uc19zaXplIC8gc2l6ZW9mKG9wal90Y2RfcmVzb2x1dGlvbl90KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocmVzbm8gPSAwOyByZXNubyA8IGxfbmJfcmVzb2x1dGlvbnM7ICsrcmVzbm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9iYW5kID0gbF9yZXMtPmJhbmRzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgICAgIChiYW5kbm8gPSAwOyBiYW5kbm8gPCAzOyArK2JhbmRubykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfcHJlY2luY3QgPSBsX2JhbmQtPnByZWNpbmN0czsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9wcmVjaW5jdCkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX25iX3ByZWNpbmN0cyA9IGxfYmFuZC0+cHJlY2luY3RzX2RhdGFfc2l6ZSAvIHNpemVvZihvcGpfdGNkX3ByZWNpbmN0X3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChwcmVjbm8gPSAwOyBwcmVjbm8gPCBsX25iX3ByZWNpbmN0czsgKytwcmVjbm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RndF9kZXN0cm95KGxfcHJlY2luY3QtPmluY2x0cmVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9wcmVjaW5jdC0+aW5jbHRyZWUgPSAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RndF9kZXN0cm95KGxfcHJlY2luY3QtPmltc2J0cmVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9wcmVjaW5jdC0+aW1zYnRyZWUgPSAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpsX3RjZF9jb2RlX2Jsb2NrX2RlYWxsb2NhdGUpIChsX3ByZWNpbmN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX3ByZWNpbmN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2JhbmQtPnByZWNpbmN0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2JhbmQtPnByZWNpbmN0cyA9IDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfYmFuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBmb3IgKHJlc25vICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9yZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfdGlsZV9jb21wLT5yZXNvbHV0aW9ucyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsX3RpbGVfY29tcC0+cmVzb2x1dGlvbnMgPSAwMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobF90aWxlX2NvbXAtPm93bnNEYXRhICYmIGxfdGlsZV9jb21wLT5kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX3RpbGVfY29tcC0+ZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsX3RpbGVfY29tcC0+ZGF0YSA9IDAwOworICAgICAgICAgICAgICAgICAgICAgICAgbF90aWxlX2NvbXAtPm93bnNEYXRhID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfdGlsZV9jb21wLT5kYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbF90aWxlX2NvbXAtPmRhdGFfc2l6ZV9uZWVkZWQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK2xfdGlsZV9jb21wOworICAgICAgICB9CisKKyAgICAgICAgb3BqX2ZyZWUobF90aWxlLT5jb21wcyk7CisgICAgICAgIGxfdGlsZS0+Y29tcHMgPSAwMDsKKyAgICAgICAgb3BqX2ZyZWUocF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMpOworICAgICAgICBwX3RjZC0+dGNkX2ltYWdlLT50aWxlcyA9IDAwOworfQorCisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX3QyX2RlY29kZSAob3BqX3RjZF90ICpwX3RjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfc3JjX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV9yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NvZGVzdHJlYW1faW5kZXhfdCAqcF9jc3RyX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgICAgICBvcGpfdDJfdCAqIGxfdDI7CisKKyAgICAgICAgbF90MiA9IG9wal90Ml9jcmVhdGUocF90Y2QtPmltYWdlLCBwX3RjZC0+Y3ApOworICAgICAgICBpZiAobF90MiA9PSAwMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoISBvcGpfdDJfZGVjb2RlX3BhY2tldHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3RjZC0+dGNkX3RpbGVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3RjZC0+dGNkX2ltYWdlLT50aWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3NyY19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YV9yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWF4X3NyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgb3BqX3QyX2Rlc3Ryb3kobF90Mik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIG9wal90Ml9kZXN0cm95KGxfdDIpOworCisgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tQ0xFQU4tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF90MV9kZWNvZGUgKCBvcGpfdGNkX3QgKnBfdGNkICkKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBjb21wbm87CisgICAgICAgIG9wal90MV90ICogbF90MTsKKyAgICAgICAgb3BqX3RjZF90aWxlX3QgKiBsX3RpbGUgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlczsKKyAgICAgICAgb3BqX3RjZF90aWxlY29tcF90KiBsX3RpbGVfY29tcCA9IGxfdGlsZS0+Y29tcHM7CisgICAgICAgIG9wal90Y2NwX3QgKiBsX3RjY3AgPSBwX3RjZC0+dGNwLT50Y2NwczsKKworCisgICAgICAgIGxfdDEgPSBvcGpfdDFfY3JlYXRlKE9QSl9GQUxTRSk7CisgICAgICAgIGlmIChsX3QxID09IDAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgbF90aWxlLT5udW1jb21wczsgKytjb21wbm8pIHsKKyAgICAgICAgICAgICAgICAvKiBUaGUgKzMgaXMgaGVhZHJvb20gcmVxdWlyZWQgYnkgdGhlIHZlY3Rvcml6ZWQgRFdUICovCisgICAgICAgICAgICAgICAgaWYgKE9QSl9GQUxTRSA9PSBvcGpfdDFfZGVjb2RlX2NibGtzKGxfdDEsIGxfdGlsZV9jb21wLCBsX3RjY3ApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVzdHJveShsX3QxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICsrbF90aWxlX2NvbXA7CisgICAgICAgICAgICAgICAgKytsX3RjY3A7CisgICAgICAgIH0KKworICAgICAgICBvcGpfdDFfZGVzdHJveShsX3QxKTsKKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKKworc3RhdGljIE9QSl9CT09MIG9wal90Y2RfZHd0X2RlY29kZSAoIG9wal90Y2RfdCAqcF90Y2QgKQoreworICAgICAgICBPUEpfVUlOVDMyIGNvbXBubzsKKyAgICAgICAgb3BqX3RjZF90aWxlX3QgKiBsX3RpbGUgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlczsKKyAgICAgICAgb3BqX3RjZF90aWxlY29tcF90ICogbF90aWxlX2NvbXAgPSBsX3RpbGUtPmNvbXBzOworICAgICAgICBvcGpfdGNjcF90ICogbF90Y2NwID0gcF90Y2QtPnRjcC0+dGNjcHM7CisgICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wID0gcF90Y2QtPmltYWdlLT5jb21wczsKKworICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IGxfdGlsZS0+bnVtY29tcHM7IGNvbXBubysrKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICBpZiAodGNkLT5jcC0+cmVkdWNlICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZC0+aW1hZ2UtPmNvbXBzW2NvbXBub10ucmVzbm9fZGVjb2RlZCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUtPmNvbXBzW2NvbXBub10ubnVtcmVzb2x1dGlvbnMgLSB0Y2QtPmNwLT5yZWR1Y2UgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRjZC0+aW1hZ2UtPmNvbXBzW2NvbXBub10ucmVzbm9fZGVjb2RlZCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbnVtcmVzMmRlY29kZSA9IHRjZC0+aW1hZ2UtPmNvbXBzW2NvbXBub10ucmVzbm9fZGVjb2RlZCArIDE7CisgICAgICAgICAgICAgICAgaWYobnVtcmVzMmRlY29kZSA+IDApeworICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICBpZiAobF90Y2NwLT5xbWZiaWQgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgb3BqX2R3dF9kZWNvZGUobF90aWxlX2NvbXAsIGxfaW1nX2NvbXAtPnJlc25vX2RlY29kZWQrMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBvcGpfZHd0X2RlY29kZV9yZWFsKGxfdGlsZV9jb21wLCBsX2ltZ19jb21wLT5yZXNub19kZWNvZGVkKzEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKytsX3RpbGVfY29tcDsKKyAgICAgICAgICAgICAgICArK2xfaW1nX2NvbXA7CisgICAgICAgICAgICAgICAgKytsX3RjY3A7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CitzdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF9tY3RfZGVjb2RlICggb3BqX3RjZF90ICpwX3RjZCwgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIpCit7CisgICAgICAgIG9wal90Y2RfdGlsZV90ICogbF90aWxlID0gcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXM7CisgICAgICAgIG9wal90Y3BfdCAqIGxfdGNwID0gcF90Y2QtPnRjcDsKKyAgICAgICAgb3BqX3RjZF90aWxlY29tcF90ICogbF90aWxlX2NvbXAgPSBsX3RpbGUtPmNvbXBzOworICAgICAgICBPUEpfVUlOVDMyIGxfc2FtcGxlcyxpOworCisgICAgICAgIGlmICghIGxfdGNwLT5tY3QpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgIH0KKworICAgICAgICBsX3NhbXBsZXMgPSAoT1BKX1VJTlQzMikoKGxfdGlsZV9jb21wLT54MSAtIGxfdGlsZV9jb21wLT54MCkgKiAobF90aWxlX2NvbXAtPnkxIC0gbF90aWxlX2NvbXAtPnkwKSk7CisKKyAgICAgICAgaWYgKGxfdGlsZS0+bnVtY29tcHMgPj0gMyApeworICAgICAgICAgICAgICAgIC8qIHRlc3RjYXNlIDEzMzYucGRmLmFzYW4uNDcuMzc2ICovCisgICAgICAgICAgICAgICAgaWYgKChsX3RpbGUtPmNvbXBzWzBdLngxIC0gbF90aWxlLT5jb21wc1swXS54MCkgKiAobF90aWxlLT5jb21wc1swXS55MSAtIGxfdGlsZS0+Y29tcHNbMF0ueTApIDwgKE9QSl9JTlQzMilsX3NhbXBsZXMgfHwKKyAgICAgICAgICAgICAgICAgICAgKGxfdGlsZS0+Y29tcHNbMV0ueDEgLSBsX3RpbGUtPmNvbXBzWzFdLngwKSAqIChsX3RpbGUtPmNvbXBzWzFdLnkxIC0gbF90aWxlLT5jb21wc1sxXS55MCkgPCAoT1BKX0lOVDMyKWxfc2FtcGxlcyB8fAorICAgICAgICAgICAgICAgICAgICAobF90aWxlLT5jb21wc1syXS54MSAtIGxfdGlsZS0+Y29tcHNbMl0ueDApICogKGxfdGlsZS0+Y29tcHNbMl0ueTEgLSBsX3RpbGUtPmNvbXBzWzJdLnkwKSA8IChPUEpfSU5UMzIpbF9zYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiVGlsZXMgZG9uJ3QgYWxsIGhhdmUgdGhlIHNhbWUgZGltZW5zaW9uLiBTa2lwIHRoZSBNQ1Qgc3RlcC5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobF90Y3AtPm1jdCA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqKiBsX2RhdGE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIGxfdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBsX2RhdGEgPSAoT1BKX0JZVEUgKiopIG9wal9tYWxsb2MobF90aWxlLT5udW1jb21wcypzaXplb2YoT1BKX0JZVEUqKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBsX2RhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7aTxsX3RpbGUtPm51bWNvbXBzOysraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2RhdGFbaV0gPSAoT1BKX0JZVEUqKSBsX3RpbGVfY29tcC0+ZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX3RpbGVfY29tcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgb3BqX21jdF9kZWNvZGVfY3VzdG9tKC8qIE1DVCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0JZVEUqKSBsX3RjcC0+bV9tY3RfZGVjb2RpbmdfbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiBjb21wb25lbnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21wb25lbnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYiBvZiBjb21wb25lbnRzIChpLmUuIHNpemUgb2YgcERhdGEpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RpbGUtPm51bWNvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVsbHMgaWYgdGhlIGRhdGEgaXMgc2lnbmVkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3RjZC0+aW1hZ2UtPmNvbXBzLT5zZ25kKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2RhdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX3RjcC0+dGNjcHMtPnFtZmJpZCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9tY3RfZGVjb2RlKCAgICAgbF90aWxlLT5jb21wc1swXS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RpbGUtPmNvbXBzWzFdLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGlsZS0+Y29tcHNbMl0uZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9tY3RfZGVjb2RlX3JlYWwoKE9QSl9GTE9BVDMyKilsX3RpbGUtPmNvbXBzWzBdLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0ZMT0FUMzIqKWxfdGlsZS0+Y29tcHNbMV0uZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfRkxPQVQzMiopbF90aWxlLT5jb21wc1syXS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk51bWJlciBvZiBjb21wb25lbnRzICglZCkgaXMgaW5jb25zaXN0ZW50IHdpdGggYSBNQ1QuIFNraXAgdGhlIE1DVCBzdGVwLlxuIixsX3RpbGUtPm51bWNvbXBzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworCitzdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF9kY19sZXZlbF9zaGlmdF9kZWNvZGUgKCBvcGpfdGNkX3QgKnBfdGNkICkKK3sKKyAgICAgICAgT1BKX1VJTlQzMiBjb21wbm87CisgICAgICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqIGxfdGlsZV9jb21wID0gMDA7CisgICAgICAgIG9wal90Y2NwX3QgKiBsX3RjY3AgPSAwMDsKKyAgICAgICAgb3BqX2ltYWdlX2NvbXBfdCAqIGxfaW1nX2NvbXAgPSAwMDsKKyAgICAgICAgb3BqX3RjZF9yZXNvbHV0aW9uX3QqIGxfcmVzID0gMDA7CisgICAgICAgIG9wal90Y2RfdGlsZV90ICogbF90aWxlOworICAgICAgICBPUEpfVUlOVDMyIGxfd2lkdGgsbF9oZWlnaHQsaSxqOworICAgICAgICBPUEpfSU5UMzIgKiBsX2N1cnJlbnRfcHRyOworICAgICAgICBPUEpfSU5UMzIgbF9taW4sIGxfbWF4OworICAgICAgICBPUEpfVUlOVDMyIGxfc3RyaWRlOworCisgICAgICAgIGxfdGlsZSA9IHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzOworICAgICAgICBsX3RpbGVfY29tcCA9IGxfdGlsZS0+Y29tcHM7CisgICAgICAgIGxfdGNjcCA9IHBfdGNkLT50Y3AtPnRjY3BzOworICAgICAgICBsX2ltZ19jb21wID0gcF90Y2QtPmltYWdlLT5jb21wczsKKworICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IGxfdGlsZS0+bnVtY29tcHM7IGNvbXBubysrKSB7CisgICAgICAgICAgICAgICAgbF9yZXMgPSBsX3RpbGVfY29tcC0+cmVzb2x1dGlvbnMgKyBsX2ltZ19jb21wLT5yZXNub19kZWNvZGVkOworICAgICAgICAgICAgICAgIGxfd2lkdGggPSAoT1BKX1VJTlQzMikobF9yZXMtPngxIC0gbF9yZXMtPngwKTsKKyAgICAgICAgICAgICAgICBsX2hlaWdodCA9IChPUEpfVUlOVDMyKShsX3Jlcy0+eTEgLSBsX3Jlcy0+eTApOworICAgICAgICAgICAgICAgIGxfc3RyaWRlID0gKE9QSl9VSU5UMzIpKGxfdGlsZV9jb21wLT54MSAtIGxfdGlsZV9jb21wLT54MCkgLSBsX3dpZHRoOworCisgICAgICAgICAgICAgICAgYXNzZXJ0KGxfaGVpZ2h0ID09IDAgfHwgbF93aWR0aCArIGxfc3RyaWRlIDw9IGxfdGlsZV9jb21wLT5kYXRhX3NpemUgLyBsX2hlaWdodCk7IC8qTVVQREYqLworCisgICAgICAgICAgICAgICAgaWYgKGxfaW1nX2NvbXAtPnNnbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfbWluID0gLSgxIDw8IChsX2ltZ19jb21wLT5wcmVjIC0gMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgbF9tYXggPSAoMSA8PCAobF9pbWdfY29tcC0+cHJlYyAtIDEpKSAtIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbF9taW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbF9tYXggPSAoMSA8PCBsX2ltZ19jb21wLT5wcmVjKSAtIDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbF9jdXJyZW50X3B0ciA9IGxfdGlsZV9jb21wLT5kYXRhOworCisgICAgICAgICAgICAgICAgaWYgKGxfdGNjcC0+cW1mYmlkID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9oZWlnaHQ7KytqKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsX3dpZHRoOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbF9jdXJyZW50X3B0ciA9IG9wal9pbnRfY2xhbXAoKmxfY3VycmVudF9wdHIgKyBsX3RjY3AtPm1fZGNfbGV2ZWxfc2hpZnQsIGxfbWluLCBsX21heCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX2N1cnJlbnRfcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9wdHIgKz0gbF9zdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7ajxsX2hlaWdodDsrK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxfd2lkdGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyIGxfdmFsdWUgPSAqKChPUEpfRkxPQVQzMiAqKSBsX2N1cnJlbnRfcHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbF9jdXJyZW50X3B0ciA9IG9wal9pbnRfY2xhbXAoKE9QSl9JTlQzMilvcGpfbHJpbnRmKGxfdmFsdWUpICsgbF90Y2NwLT5tX2RjX2xldmVsX3NoaWZ0LCBsX21pbiwgbF9tYXgpOyA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX2N1cnJlbnRfcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9wdHIgKz0gbF9zdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKytsX2ltZ19jb21wOworICAgICAgICAgICAgICAgICsrbF90Y2NwOworICAgICAgICAgICAgICAgICsrbF90aWxlX2NvbXA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKKworCisvKioKKyAqIERlYWxsb2NhdGVzIHRoZSBlbmNvZGluZyBkYXRhIG9mIHRoZSBnaXZlbiBwcmVjaW5jdC4KKyAqLworc3RhdGljIHZvaWQgb3BqX3RjZF9jb2RlX2Jsb2NrX2RlY19kZWFsbG9jYXRlIChvcGpfdGNkX3ByZWNpbmN0X3QgKiBwX3ByZWNpbmN0KQoreworICAgICAgICBPUEpfVUlOVDMyIGNibGtubyAsIGxfbmJfY29kZV9ibG9ja3M7CisKKyAgICAgICAgb3BqX3RjZF9jYmxrX2RlY190ICogbF9jb2RlX2Jsb2NrID0gcF9wcmVjaW5jdC0+Y2Jsa3MuZGVjOworICAgICAgICBpZiAobF9jb2RlX2Jsb2NrKSB7CisgICAgICAgICAgICAgICAgLypmcHJpbnRmKHN0ZGVyciwiZGVhbGxvY2F0ZSBjb2RlYmxvY2s6e1xuIik7Ki8KKyAgICAgICAgICAgICAgICAvKmZwcmludGYoc3RkZXJyLCJcdCB4MD0lZCwgeTA9JWQsIHgxPSVkLCB5MT0lZFxuIixsX2NvZGVfYmxvY2stPngwLCBsX2NvZGVfYmxvY2stPnkwLCBsX2NvZGVfYmxvY2stPngxLCBsX2NvZGVfYmxvY2stPnkxKTsqLworICAgICAgICAgICAgICAgIC8qZnByaW50ZihzdGRlcnIsIlx0IG51bWJwcz0lZCwgbnVtbGVuYml0cz0lZCwgbGVuPSVkLCBudW1uZXdwYXNzZXM9JWQsIHJlYWxfbnVtX3NlZ3M9JWQsIG1fY3VycmVudF9tYXhfc2Vncz0lZFxuICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY29kZV9ibG9jay0+bnVtYnBzLCBsX2NvZGVfYmxvY2stPm51bWxlbmJpdHMsIGxfY29kZV9ibG9jay0+bGVuLCBsX2NvZGVfYmxvY2stPm51bW5ld3Bhc3NlcywgbF9jb2RlX2Jsb2NrLT5yZWFsX251bV9zZWdzLCBsX2NvZGVfYmxvY2stPm1fY3VycmVudF9tYXhfc2VncyApOyovCisKKworICAgICAgICAgICAgICAgIGxfbmJfY29kZV9ibG9ja3MgPSBwX3ByZWNpbmN0LT5ibG9ja19zaXplIC8gc2l6ZW9mKG9wal90Y2RfY2Jsa19kZWNfdCk7CisgICAgICAgICAgICAgICAgLypmcHJpbnRmKHN0ZGVyciwibmJfY29kZV9ibG9ja3MgPSVkXHR9XG4iLCBsX25iX2NvZGVfYmxvY2tzKTsqLworCisgICAgICAgICAgICAgICAgZm9yIChjYmxrbm8gPSAwOyBjYmxrbm8gPCBsX25iX2NvZGVfYmxvY2tzOyArK2NibGtubykgeworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9jb2RlX2Jsb2NrLT5kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY29kZV9ibG9jay0+ZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY29kZV9ibG9jay0+ZGF0YSA9IDAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9jb2RlX2Jsb2NrLT5zZWdzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY29kZV9ibG9jay0+c2VncyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NvZGVfYmxvY2stPnNlZ3MgPSAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgKytsX2NvZGVfYmxvY2s7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9wcmVjaW5jdC0+Y2Jsa3MuZGVjKTsKKyAgICAgICAgICAgICAgICBwX3ByZWNpbmN0LT5jYmxrcy5kZWMgPSAwMDsKKyAgICAgICAgfQorfQorCisvKioKKyAqIERlYWxsb2NhdGVzIHRoZSBlbmNvZGluZyBkYXRhIG9mIHRoZSBnaXZlbiBwcmVjaW5jdC4KKyAqLworc3RhdGljIHZvaWQgb3BqX3RjZF9jb2RlX2Jsb2NrX2VuY19kZWFsbG9jYXRlIChvcGpfdGNkX3ByZWNpbmN0X3QgKiBwX3ByZWNpbmN0KQoreyAgICAgICAKKyAgICAgICAgT1BKX1VJTlQzMiBjYmxrbm8gLCBsX25iX2NvZGVfYmxvY2tzOworCisgICAgICAgIG9wal90Y2RfY2Jsa19lbmNfdCAqIGxfY29kZV9ibG9jayA9IHBfcHJlY2luY3QtPmNibGtzLmVuYzsKKyAgICAgICAgaWYgKGxfY29kZV9ibG9jaykgeworICAgICAgICAgICAgICAgIGxfbmJfY29kZV9ibG9ja3MgPSBwX3ByZWNpbmN0LT5ibG9ja19zaXplIC8gc2l6ZW9mKG9wal90Y2RfY2Jsa19lbmNfdCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZm9yICAgICAoY2Jsa25vID0gMDsgY2Jsa25vIDwgbF9uYl9jb2RlX2Jsb2NrczsgKytjYmxrbm8pICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9jb2RlX2Jsb2NrLT5kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY29kZV9ibG9jay0+ZGF0YSAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NvZGVfYmxvY2stPmRhdGEgPSAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfY29kZV9ibG9jay0+bGF5ZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY29kZV9ibG9jay0+bGF5ZXJzICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY29kZV9ibG9jay0+bGF5ZXJzID0gMDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2NvZGVfYmxvY2stPnBhc3NlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2NvZGVfYmxvY2stPnBhc3NlcyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NvZGVfYmxvY2stPnBhc3NlcyA9IDAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgKytsX2NvZGVfYmxvY2s7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9wcmVjaW5jdC0+Y2Jsa3MuZW5jKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBwX3ByZWNpbmN0LT5jYmxrcy5lbmMgPSAwMDsKKyAgICAgICAgfQorfQorCitPUEpfVUlOVDMyIG9wal90Y2RfZ2V0X2VuY29kZWRfdGlsZV9zaXplICggb3BqX3RjZF90ICpwX3RjZCApCit7CisgICAgICAgIE9QSl9VSU5UMzIgaSxsX2RhdGFfc2l6ZSA9IDA7CisgICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wID0gMDA7CisgICAgICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqIGxfdGlsZWMgPSAwMDsKKyAgICAgICAgT1BKX1VJTlQzMiBsX3NpemVfY29tcCwgbF9yZW1haW5pbmc7CisKKyAgICAgICAgbF90aWxlYyA9IHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT5jb21wczsKKyAgICAgICAgbF9pbWdfY29tcCA9IHBfdGNkLT5pbWFnZS0+Y29tcHM7CisgICAgICAgIGZvciAoaT0wO2k8cF90Y2QtPmltYWdlLT5udW1jb21wczsrK2kpIHsKKyAgICAgICAgICAgICAgICBsX3NpemVfY29tcCA9IGxfaW1nX2NvbXAtPnByZWMgPj4gMzsgLyooLyA4KSovCisgICAgICAgICAgICAgICAgbF9yZW1haW5pbmcgPSBsX2ltZ19jb21wLT5wcmVjICYgNzsgIC8qICglOCkgKi8KKworICAgICAgICAgICAgICAgIGlmIChsX3JlbWFpbmluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgKytsX3NpemVfY29tcDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobF9zaXplX2NvbXAgPT0gMykgeworICAgICAgICAgICAgICAgICAgICAgICAgbF9zaXplX2NvbXAgPSA0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGxfZGF0YV9zaXplICs9IGxfc2l6ZV9jb21wICogKE9QSl9VSU5UMzIpKChsX3RpbGVjLT54MSAtIGxfdGlsZWMtPngwKSAqIChsX3RpbGVjLT55MSAtIGxfdGlsZWMtPnkwKSk7CisgICAgICAgICAgICAgICAgKytsX2ltZ19jb21wOworICAgICAgICAgICAgICAgICsrbF90aWxlYzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsX2RhdGFfc2l6ZTsKK30KKyAgICAgICAgICAgICAgICAKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX2RjX2xldmVsX3NoaWZ0X2VuY29kZSAoIG9wal90Y2RfdCAqcF90Y2QgKQoreworICAgICAgICBPUEpfVUlOVDMyIGNvbXBubzsKKyAgICAgICAgb3BqX3RjZF90aWxlY29tcF90ICogbF90aWxlX2NvbXAgPSAwMDsKKyAgICAgICAgb3BqX3RjY3BfdCAqIGxfdGNjcCA9IDAwOworICAgICAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IDAwOworICAgICAgICBvcGpfdGNkX3RpbGVfdCAqIGxfdGlsZTsKKyAgICAgICAgT1BKX1VJTlQzMiBsX25iX2VsZW0saTsKKyAgICAgICAgT1BKX0lOVDMyICogbF9jdXJyZW50X3B0cjsKKworICAgICAgICBsX3RpbGUgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlczsKKyAgICAgICAgbF90aWxlX2NvbXAgPSBsX3RpbGUtPmNvbXBzOworICAgICAgICBsX3RjY3AgPSBwX3RjZC0+dGNwLT50Y2NwczsKKyAgICAgICAgbF9pbWdfY29tcCA9IHBfdGNkLT5pbWFnZS0+Y29tcHM7CisKKyAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBsX3RpbGUtPm51bWNvbXBzOyBjb21wbm8rKykgeworICAgICAgICAgICAgICAgIGxfY3VycmVudF9wdHIgPSBsX3RpbGVfY29tcC0+ZGF0YTsKKyAgICAgICAgICAgICAgICBsX25iX2VsZW0gPSAoT1BKX1VJTlQzMikoKGxfdGlsZV9jb21wLT54MSAtIGxfdGlsZV9jb21wLT54MCkgKiAobF90aWxlX2NvbXAtPnkxIC0gbF90aWxlX2NvbXAtPnkwKSk7CisKKyAgICAgICAgICAgICAgICBpZiAobF90Y2NwLT5xbWZiaWQgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICAgICAoaSA9IDA7IGkgPCBsX25iX2VsZW07ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbF9jdXJyZW50X3B0ciAtPSBsX3RjY3AtPm1fZGNfbGV2ZWxfc2hpZnQgOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfY3VycmVudF9wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxfbmJfZWxlbTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsX2N1cnJlbnRfcHRyID0gKCpsX2N1cnJlbnRfcHRyIC0gbF90Y2NwLT5tX2RjX2xldmVsX3NoaWZ0KSA8PCAxMSA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X3B0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICArK2xfaW1nX2NvbXA7CisgICAgICAgICAgICAgICAgKytsX3RjY3A7CisgICAgICAgICAgICAgICAgKytsX3RpbGVfY29tcDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal90Y2RfbWN0X2VuY29kZSAoIG9wal90Y2RfdCAqcF90Y2QgKQoreworICAgICAgICBvcGpfdGNkX3RpbGVfdCAqIGxfdGlsZSA9IHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzOworICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKiBsX3RpbGVfY29tcCA9IHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT5jb21wczsKKyAgICAgICAgT1BKX1VJTlQzMiBzYW1wbGVzID0gKE9QSl9VSU5UMzIpKChsX3RpbGVfY29tcC0+eDEgLSBsX3RpbGVfY29tcC0+eDApICogKGxfdGlsZV9jb21wLT55MSAtIGxfdGlsZV9jb21wLT55MCkpOworICAgICAgICBPUEpfVUlOVDMyIGk7CisgICAgICAgIE9QSl9CWVRFICoqIGxfZGF0YSA9IDAwOworICAgICAgICBvcGpfdGNwX3QgKiBsX3RjcCA9IHBfdGNkLT50Y3A7CisKKyAgICAgICAgaWYoIXBfdGNkLT50Y3AtPm1jdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwX3RjZC0+dGNwLT5tY3QgPT0gMikgeworICAgICAgICAgICAgICAgIGlmICghIHBfdGNkLT50Y3AtPm1fbWN0X2NvZGluZ19tYXRyaXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgbF9kYXRhID0gKE9QSl9CWVRFICoqKSBvcGpfbWFsbG9jKGxfdGlsZS0+bnVtY29tcHMqc2l6ZW9mKE9QSl9CWVRFKikpOworICAgICAgICAgICAgICAgIGlmICghIGxfZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDtpPGxfdGlsZS0+bnVtY29tcHM7KytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsX2RhdGFbaV0gPSAoT1BKX0JZVEUqKSBsX3RpbGVfY29tcC0+ZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrbF90aWxlX2NvbXA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCEgb3BqX21jdF9lbmNvZGVfY3VzdG9tKC8qIE1DVCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9CWVRFKikgcF90Y2QtPnRjcC0+bV9tY3RfY29kaW5nX21hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIGNvbXBvbmVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbXBvbmVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmIgb2YgY29tcG9uZW50cyAoaS5lLiBzaXplIG9mIHBEYXRhKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGlsZS0+bnVtY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVsbHMgaWYgdGhlIGRhdGEgaXMgc2lnbmVkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90Y2QtPmltYWdlLT5jb21wcy0+c2duZCkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG9wal9mcmVlKGxfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobF90Y3AtPnRjY3BzLT5xbWZiaWQgPT0gMCkgeworICAgICAgICAgICAgICAgIG9wal9tY3RfZW5jb2RlX3JlYWwobF90aWxlLT5jb21wc1swXS5kYXRhLCBsX3RpbGUtPmNvbXBzWzFdLmRhdGEsIGxfdGlsZS0+Y29tcHNbMl0uZGF0YSwgc2FtcGxlcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgb3BqX21jdF9lbmNvZGUobF90aWxlLT5jb21wc1swXS5kYXRhLCBsX3RpbGUtPmNvbXBzWzFdLmRhdGEsIGxfdGlsZS0+Y29tcHNbMl0uZGF0YSwgc2FtcGxlcyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX2R3dF9lbmNvZGUgKCBvcGpfdGNkX3QgKnBfdGNkICkKK3sKKyAgICAgICAgb3BqX3RjZF90aWxlX3QgKiBsX3RpbGUgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlczsKKyAgICAgICAgb3BqX3RjZF90aWxlY29tcF90ICogbF90aWxlX2NvbXAgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+Y29tcHM7CisgICAgICAgIG9wal90Y2NwX3QgKiBsX3RjY3AgPSBwX3RjZC0+dGNwLT50Y2NwczsKKyAgICAgICAgT1BKX1VJTlQzMiBjb21wbm87CisKKyAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBsX3RpbGUtPm51bWNvbXBzOyArK2NvbXBubykgeworICAgICAgICAgICAgICAgIGlmIChsX3RjY3AtPnFtZmJpZCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBvcGpfZHd0X2VuY29kZShsX3RpbGVfY29tcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobF90Y2NwLT5xbWZiaWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgb3BqX2R3dF9lbmNvZGVfcmVhbChsX3RpbGVfY29tcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICArK2xfdGlsZV9jb21wOworICAgICAgICAgICAgICAgICsrbF90Y2NwOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF90MV9lbmNvZGUgKCBvcGpfdGNkX3QgKnBfdGNkICkKK3sKKyAgICAgICAgb3BqX3QxX3QgKiBsX3QxOworICAgICAgICBjb25zdCBPUEpfRkxPQVQ2NCAqIGxfbWN0X25vcm1zOworICAgICAgICBPUEpfVUlOVDMyIGxfbWN0X251bWNvbXBzID0gMFU7CisgICAgICAgIG9wal90Y3BfdCAqIGxfdGNwID0gcF90Y2QtPnRjcDsKKworICAgICAgICBsX3QxID0gb3BqX3QxX2NyZWF0ZShPUEpfVFJVRSk7CisgICAgICAgIGlmIChsX3QxID09IDAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsX3RjcC0+bWN0ID09IDEpIHsKKyAgICAgICAgICAgICAgICBsX21jdF9udW1jb21wcyA9IDNVOworICAgICAgICAgICAgICAgIC8qIGlycmV2ZXJzaWJsZSBlbmNvZGluZyAqLworICAgICAgICAgICAgICAgIGlmIChsX3RjcC0+dGNjcHMtPnFtZmJpZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsX21jdF9ub3JtcyA9IG9wal9tY3RfZ2V0X21jdF9ub3Jtc19yZWFsKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbF9tY3Rfbm9ybXMgPSBvcGpfbWN0X2dldF9tY3Rfbm9ybXMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbF9tY3RfbnVtY29tcHMgPSBwX3RjZC0+aW1hZ2UtPm51bWNvbXBzOworICAgICAgICAgICAgICAgIGxfbWN0X25vcm1zID0gKGNvbnN0IE9QSl9GTE9BVDY0ICopIChsX3RjcC0+bWN0X25vcm1zKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghIG9wal90MV9lbmNvZGVfY2Jsa3MobF90MSwgcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMgLCBsX3RjcCwgbF9tY3Rfbm9ybXMsIGxfbWN0X251bWNvbXBzKSkgeworICAgICAgICBvcGpfdDFfZGVzdHJveShsX3QxKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgb3BqX3QxX2Rlc3Ryb3kobF90MSk7CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF90Ml9lbmNvZGUgKG9wal90Y2RfdCAqcF90Y2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGVzdF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9kZXN0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmZvX3QgKnBfY3N0cl9pbmZvICkKK3sKKyAgICAgICAgb3BqX3QyX3QgKiBsX3QyOworCisgICAgICAgIGxfdDIgPSBvcGpfdDJfY3JlYXRlKHBfdGNkLT5pbWFnZSwgcF90Y2QtPmNwKTsKKyAgICAgICAgaWYgKGxfdDIgPT0gMDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCEgb3BqX3QyX2VuY29kZV9wYWNrZXRzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90Y2QtPnRjZF90aWxlbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90Y2QtPnRjcC0+bnVtbGF5ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGVzdF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YV93cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWF4X2Rlc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NzdHJfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3RjZC0+dHBfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdGNkLT50cF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90Y2QtPmN1cl9waW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTkFMX1BBU1MpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgb3BqX3QyX2Rlc3Ryb3kobF90Mik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIG9wal90Ml9kZXN0cm95KGxfdDIpOworCisgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tQ0xFQU4tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX3JhdGVfYWxsb2NhdGVfZW5jb2RlKCAgb3BqX3RjZF90ICpwX3RjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGVzdF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfZGVzdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZm9fdCAqcF9jc3RyX2luZm8gKQoreworICAgICAgICBvcGpfY3BfdCAqIGxfY3AgPSBwX3RjZC0+Y3A7CisgICAgICAgIE9QSl9VSU5UMzIgbF9uYl93cml0dGVuID0gMDsKKworICAgICAgICBpZiAocF9jc3RyX2luZm8pICB7CisgICAgICAgICAgICAgICAgcF9jc3RyX2luZm8tPmluZGV4X3dyaXRlID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsX2NwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fZGlzdG9fYWxsb2N8fCBsX2NwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fZml4ZWRfcXVhbGl0eSkgIHsKKyAgICAgICAgICAgICAgICAvKiBmaXhlZF9xdWFsaXR5ICovCisgICAgICAgICAgICAgICAgLyogTm9ybWFsIFJhdGUvZGlzdG9ydGlvbiBhbGxvY2F0aW9uICovCisgICAgICAgICAgICAgICAgaWYgKCEgb3BqX3RjZF9yYXRlYWxsb2NhdGUocF90Y2QsIHBfZGVzdF9kYXRhLCZsX25iX3dyaXR0ZW4sIHBfbWF4X2Rlc3Rfc2l6ZSwgcF9jc3RyX2luZm8pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBGaXhlZCBsYXllciBhbGxvY2F0aW9uICovCisgICAgICAgICAgICAgICAgb3BqX3RjZF9yYXRlYWxsb2NhdGVfZml4ZWQocF90Y2QpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCisKK09QSl9CT09MIG9wal90Y2RfY29weV90aWxlX2RhdGEgKCAgICAgICBvcGpfdGNkX3QgKnBfdGNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfc3JjX2xlbmd0aCApCit7CisgICAgICAgIE9QSl9VSU5UMzIgaSxqLGxfZGF0YV9zaXplID0gMDsKKyAgICAgICAgb3BqX2ltYWdlX2NvbXBfdCAqIGxfaW1nX2NvbXAgPSAwMDsKKyAgICAgICAgb3BqX3RjZF90aWxlY29tcF90ICogbF90aWxlYyA9IDAwOworICAgICAgICBPUEpfVUlOVDMyIGxfc2l6ZV9jb21wLCBsX3JlbWFpbmluZzsKKyAgICAgICAgT1BKX1VJTlQzMiBsX25iX2VsZW07CisKKyAgICAgICAgbF9kYXRhX3NpemUgPSBvcGpfdGNkX2dldF9lbmNvZGVkX3RpbGVfc2l6ZShwX3RjZCk7CisgICAgICAgIGlmIChsX2RhdGFfc2l6ZSAhPSBwX3NyY19sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgbF90aWxlYyA9IHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT5jb21wczsKKyAgICAgICAgbF9pbWdfY29tcCA9IHBfdGNkLT5pbWFnZS0+Y29tcHM7CisgICAgICAgIGZvciAoaT0wO2k8cF90Y2QtPmltYWdlLT5udW1jb21wczsrK2kpIHsKKyAgICAgICAgICAgICAgICBsX3NpemVfY29tcCA9IGxfaW1nX2NvbXAtPnByZWMgPj4gMzsgLyooLyA4KSovCisgICAgICAgICAgICAgICAgbF9yZW1haW5pbmcgPSBsX2ltZ19jb21wLT5wcmVjICYgNzsgIC8qICglOCkgKi8KKyAgICAgICAgICAgICAgICBsX25iX2VsZW0gPSAoT1BKX1VJTlQzMikoKGxfdGlsZWMtPngxIC0gbF90aWxlYy0+eDApICogKGxfdGlsZWMtPnkxIC0gbF90aWxlYy0+eTApKTsKKworICAgICAgICAgICAgICAgIGlmIChsX3JlbWFpbmluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgKytsX3NpemVfY29tcDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobF9zaXplX2NvbXAgPT0gMykgeworICAgICAgICAgICAgICAgICAgICAgICAgbF9zaXplX2NvbXAgPSA0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAobF9zaXplX2NvbXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9DSEFSICogbF9zcmNfcHRyID0gKE9QSl9DSEFSICopIHBfc3JjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIGxfZGVzdF9wdHIgPSBsX3RpbGVjLT5kYXRhOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfaW1nX2NvbXAtPnNnbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9uYl9lbGVtOysraikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGxfZGVzdF9wdHIrKykgPSAoT1BKX0lOVDMyKSAoKihsX3NyY19wdHIrKykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9uYl9lbGVtOysraikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGxfZGVzdF9wdHIrKykgPSAoKihsX3NyY19wdHIrKykpJjB4ZmY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zcmMgPSAoT1BKX0JZVEUqKSBsX3NyY19wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBsX2Rlc3RfcHRyID0gbF90aWxlYy0+ZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMTYgKiBsX3NyY19wdHIgPSAoT1BKX0lOVDE2ICopIHBfc3JjOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfaW1nX2NvbXAtPnNnbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9uYl9lbGVtOysraikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGxfZGVzdF9wdHIrKykgPSAoT1BKX0lOVDMyKSAoKihsX3NyY19wdHIrKykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9uYl9lbGVtOysraikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGxfZGVzdF9wdHIrKykgPSAoKihsX3NyY19wdHIrKykpJjB4ZmZmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3NyYyA9IChPUEpfQllURSopIGxfc3JjX3B0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIGxfc3JjX3B0ciA9IChPUEpfSU5UMzIgKikgcF9zcmM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogbF9kZXN0X3B0ciA9IGxfdGlsZWMtPmRhdGE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfbmJfZWxlbTsrK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoobF9kZXN0X3B0cisrKSA9IChPUEpfSU5UMzIpICgqKGxfc3JjX3B0cisrKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zcmMgPSAoT1BKX0JZVEUqKSBsX3NyY19wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKytsX2ltZ19jb21wOworICAgICAgICAgICAgICAgICsrbF90aWxlYzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdGNkLmggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3RjZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZjgzNzkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3RjZC5oCkBAIC0wLDAgKzEsMzY5IEBACisvKgorICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCisgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFVuaXZlcnNpdGUgY2F0aG9saXF1ZSBkZSBMb3V2YWluIChVQ0wpLCBCZWxnaXVtCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQorICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZSIAorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDUyBTeXN0ZW1lcyBkJ0luZm9ybWF0aW9uLCBGcmFuY2UKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgQVMgSVMnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgX19UQ0RfSAorI2RlZmluZSBfX1RDRF9ICisvKioKK0BmaWxlIHRjZC5oCitAYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYSB0aWxlIGNvZGVyL2RlY29kZXIgKFRDRCkKKworVGhlIGZ1bmN0aW9ucyBpbiBUQ0QuQyBlbmNvZGUgb3IgZGVjb2RlIGVhY2ggdGlsZSBpbmRlcGVuZGVudGx5IGZyb20KK2VhY2ggb3RoZXIuIFRoZSBmdW5jdGlvbnMgaW4gVENELkMgYXJlIHVzZWQgYnkgb3RoZXIgZnVuY3Rpb25zIGluIEoySy5DLgorKi8KKworLyoqIEBkZWZncm91cCBUQ0QgVENEIC0gSW1wbGVtZW50YXRpb24gb2YgYSB0aWxlIGNvZGVyL2RlY29kZXIgKi8KKy8qQHsqLworCisvKioKK0ZJWE1FIERPQworKi8KK3R5cGVkZWYgc3RydWN0IG9wal90Y2Rfc2VnIHsKKwlPUEpfQllURSAqKiBkYXRhOworCU9QSl9VSU5UMzIgZGF0YWluZGV4OworCU9QSl9VSU5UMzIgbnVtcGFzc2VzOworCU9QSl9VSU5UMzIgcmVhbF9udW1fcGFzc2VzOworCU9QSl9VSU5UMzIgbGVuOworCU9QSl9VSU5UMzIgbWF4cGFzc2VzOworCU9QSl9VSU5UMzIgbnVtbmV3cGFzc2VzOworCU9QSl9VSU5UMzIgbmV3bGVuOworfSBvcGpfdGNkX3NlZ190OworCisvKioKK0ZJWE1FIERPQworKi8KK3R5cGVkZWYgc3RydWN0IG9wal90Y2RfcGFzcyB7CisJT1BKX1VJTlQzMiByYXRlOworCU9QSl9GTE9BVDY0IGRpc3RvcnRpb25kZWM7CisJT1BKX1VJTlQzMiBsZW47CisJT1BKX1VJTlQzMiB0ZXJtIDogMTsKK30gb3BqX3RjZF9wYXNzX3Q7CisKKy8qKgorRklYTUUgRE9DCisqLwordHlwZWRlZiBzdHJ1Y3Qgb3BqX3RjZF9sYXllciB7CisJT1BKX1VJTlQzMiBudW1wYXNzZXM7CQkvKiBOdW1iZXIgb2YgcGFzc2VzIGluIHRoZSBsYXllciAqLworCU9QSl9VSU5UMzIgbGVuOwkJCQkvKiBsZW4gb2YgaW5mb3JtYXRpb24gKi8KKwlPUEpfRkxPQVQ2NCBkaXN0bzsJCQkvKiBhZGQgZm9yIGluZGV4IChDZnIuIE1hcmNlbGEpICovCisJT1BKX0JZVEUgKmRhdGE7CQkJCS8qIGRhdGEgKi8KK30gb3BqX3RjZF9sYXllcl90OworCisvKioKK0ZJWE1FIERPQworKi8KK3R5cGVkZWYgc3RydWN0IG9wal90Y2RfY2Jsa19lbmMgeworCU9QSl9CWVRFKiBkYXRhOyAgICAgICAgICAgICAgIC8qIERhdGEgKi8KKwlvcGpfdGNkX2xheWVyX3QqIGxheWVyczsgICAgICAvKiBsYXllciBpbmZvcm1hdGlvbiAqLworCW9wal90Y2RfcGFzc190KiBwYXNzZXM7ICAgICAgIC8qIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXNzZXMgKi8KKwlPUEpfSU5UMzIgeDAsIHkwLCB4MSwgeTE7ICAgICAvKiBkaW1lbnNpb24gb2YgdGhlIGNvZGUtYmxvY2tzIDogbGVmdCB1cHBlciBjb3JuZXIgKHgwLCB5MCkgcmlnaHQgbG93IGNvcm5lciAoeDEseTEpICovCisJT1BKX1VJTlQzMiBudW1icHM7CisJT1BKX1VJTlQzMiBudW1sZW5iaXRzOworCU9QSl9VSU5UMzIgZGF0YV9zaXplOyAgICAgICAgIC8qIFNpemUgb2YgYWxsb2NhdGVkIGRhdGEgYnVmZmVyICovCisJT1BKX1VJTlQzMiBudW1wYXNzZXM7ICAgICAgICAgLyogbnVtYmVyIG9mIHBhc3MgYWxyZWFkeSBkb25lIGZvciB0aGUgY29kZS1ibG9ja3MgKi8KKwlPUEpfVUlOVDMyIG51bXBhc3Nlc2lubGF5ZXJzOyAvKiBudW1iZXIgb2YgcGFzc2VzIGluIHRoZSBsYXllciAqLworCU9QSl9VSU5UMzIgdG90YWxwYXNzZXM7CSAgICAgIC8qIHRvdGFsIG51bWJlciBvZiBwYXNzZXMgKi8KK30gb3BqX3RjZF9jYmxrX2VuY190OworCisKK3R5cGVkZWYgc3RydWN0IG9wal90Y2RfY2Jsa19kZWMgeworCU9QSl9CWVRFICogZGF0YTsJCQkJLyogRGF0YSAqLworCW9wal90Y2Rfc2VnX3QqIHNlZ3M7CQkJLyogc2VnbWVudHMgaW5mb3JtYXRpb24gKi8KKwlPUEpfSU5UMzIgeDAsIHkwLCB4MSwgeTE7CQkvKiBwb3NpdGlvbiBvZiB0aGUgY29kZS1ibG9ja3MgOiBsZWZ0IHVwcGVyIGNvcm5lciAoeDAsIHkwKSByaWdodCBsb3cgY29ybmVyICh4MSx5MSkgKi8KKwlPUEpfVUlOVDMyIG51bWJwczsKKwlPUEpfVUlOVDMyIG51bWxlbmJpdHM7CisJT1BKX1VJTlQzMiBkYXRhX21heF9zaXplOwkJLyogU2l6ZSBvZiBhbGxvY2F0ZWQgZGF0YSBidWZmZXIgKi8KKwlPUEpfVUlOVDMyIGRhdGFfY3VycmVudF9zaXplOwkvKiBTaXplIG9mIHVzZWQgZGF0YSBidWZmZXIgKi8KKwlPUEpfVUlOVDMyIG51bW5ld3Bhc3NlczsJCS8qIG51bWJlciBvZiBwYXNzIGFkZGVkIHRvIHRoZSBjb2RlLWJsb2NrcyAqLworCU9QSl9VSU5UMzIgbnVtc2VnczsJCQkJLyogbnVtYmVyIG9mIHNlZ21lbnRzICovCisJT1BKX1VJTlQzMiByZWFsX251bV9zZWdzOworCU9QSl9VSU5UMzIgbV9jdXJyZW50X21heF9zZWdzOworfSBvcGpfdGNkX2NibGtfZGVjX3Q7CisKKy8qKgorRklYTUUgRE9DCisqLwordHlwZWRlZiBzdHJ1Y3Qgb3BqX3RjZF9wcmVjaW5jdCB7CisJT1BKX0lOVDMyIHgwLCB5MCwgeDEsIHkxOwkJLyogZGltZW5zaW9uIG9mIHRoZSBwcmVjaW5jdCA6IGxlZnQgdXBwZXIgY29ybmVyICh4MCwgeTApIHJpZ2h0IGxvdyBjb3JuZXIgKHgxLHkxKSAqLworCU9QSl9VSU5UMzIgY3csIGNoOwkJCQkvKiBudW1iZXIgb2YgcHJlY2luY3QgaW4gd2lkdGggYW5kIGhlaWdodCAqLworCXVuaW9uewkJCQkJCQkvKiBjb2RlLWJsb2NrcyBpbmZvcm1hdGlvbiAqLworCQlvcGpfdGNkX2NibGtfZW5jX3QqIGVuYzsKKwkJb3BqX3RjZF9jYmxrX2RlY190KiBkZWM7CisJCXZvaWQqICAgICAgICAgICAgICAgYmxvY2tzOworCX0gY2Jsa3M7CisJT1BKX1VJTlQzMiBibG9ja19zaXplOwkJCS8qIHNpemUgdGFrZW4gYnkgY2Jsa3MgKGluIGJ5dGVzKSAqLworCW9wal90Z3RfdHJlZV90ICppbmNsdHJlZTsJICAgIC8qIGluY2x1c2lvbiB0cmVlICovCisJb3BqX3RndF90cmVlX3QgKmltc2J0cmVlOwkgICAgLyogSU1TQiB0cmVlICovCit9IG9wal90Y2RfcHJlY2luY3RfdDsKKworLyoqCitGSVhNRSBET0MKKyovCit0eXBlZGVmIHN0cnVjdCBvcGpfdGNkX2JhbmQgeworCU9QSl9JTlQzMiB4MCwgeTAsIHgxLCB5MTsJCS8qIGRpbWVuc2lvbiBvZiB0aGUgc3ViYmFuZCA6IGxlZnQgdXBwZXIgY29ybmVyICh4MCwgeTApIHJpZ2h0IGxvdyBjb3JuZXIgKHgxLHkxKSAqLworCU9QSl9VSU5UMzIgYmFuZG5vOworCW9wal90Y2RfcHJlY2luY3RfdCAqcHJlY2luY3RzOwkvKiBwcmVjaW5jdCBpbmZvcm1hdGlvbiAqLworCU9QSl9VSU5UMzIgcHJlY2luY3RzX2RhdGFfc2l6ZTsJLyogc2l6ZSBvZiBkYXRhIHRha2VuIGJ5IHByZWNpbmN0cyAqLworCU9QSl9JTlQzMiBudW1icHM7CisJT1BKX0ZMT0FUMzIgc3RlcHNpemU7Cit9IG9wal90Y2RfYmFuZF90OworCisvKioKK0ZJWE1FIERPQworKi8KK3R5cGVkZWYgc3RydWN0IG9wal90Y2RfcmVzb2x1dGlvbiB7CisJT1BKX0lOVDMyIHgwLCB5MCwgeDEsIHkxOwkJLyogZGltZW5zaW9uIG9mIHRoZSByZXNvbHV0aW9uIGxldmVsIDogbGVmdCB1cHBlciBjb3JuZXIgKHgwLCB5MCkgcmlnaHQgbG93IGNvcm5lciAoeDEseTEpICovCisJT1BKX1VJTlQzMiBwdywgcGg7CisJT1BKX1VJTlQzMiBudW1iYW5kczsJCQkvKiBudW1iZXIgc3ViLWJhbmQgZm9yIHRoZSByZXNvbHV0aW9uIGxldmVsICovCisJb3BqX3RjZF9iYW5kX3QgYmFuZHNbM107CQkvKiBzdWJiYW5kIGluZm9ybWF0aW9uICovCit9IG9wal90Y2RfcmVzb2x1dGlvbl90OworCisvKioKK0ZJWE1FIERPQworKi8KK3R5cGVkZWYgc3RydWN0IG9wal90Y2RfdGlsZWNvbXAKK3sKKwlPUEpfSU5UMzIgeDAsIHkwLCB4MSwgeTE7ICAgICAgICAgICAvKiBkaW1lbnNpb24gb2YgY29tcG9uZW50IDogbGVmdCB1cHBlciBjb3JuZXIgKHgwLCB5MCkgcmlnaHQgbG93IGNvcm5lciAoeDEseTEpICovCisJT1BKX1VJTlQzMiBudW1yZXNvbHV0aW9uczsgICAgICAgICAgLyogbnVtYmVyIG9mIHJlc29sdXRpb25zIGxldmVsICovCisJT1BKX1VJTlQzMiBtaW5pbXVtX251bV9yZXNvbHV0aW9uczsgLyogbnVtYmVyIG9mIHJlc29sdXRpb25zIGxldmVsIHRvIGRlY29kZSAoYXQgbWF4KSovCisJb3BqX3RjZF9yZXNvbHV0aW9uX3QgKnJlc29sdXRpb25zOyAgLyogcmVzb2x1dGlvbnMgaW5mb3JtYXRpb24gKi8KKwlPUEpfVUlOVDMyIHJlc29sdXRpb25zX3NpemU7ICAgICAgICAvKiBzaXplIG9mIGRhdGEgZm9yIHJlc29sdXRpb25zIChpbiBieXRlcykgKi8KKwlPUEpfSU5UMzIgKmRhdGE7ICAgICAgICAgICAgICAgICAgICAvKiBkYXRhIG9mIHRoZSBjb21wb25lbnQgKi8KKwlPUEpfQk9PTCAgb3duc0RhdGE7ICAgICAgICAgICAgICAgICAvKiBpZiB0cnVlLCB0aGVuIG5lZWQgdG8gZnJlZSBhZnRlciB1c2FnZSwgb3RoZXJ3aXNlIGRvIG5vdCBmcmVlICovCisJT1BKX1VJTlQzMiBkYXRhX3NpemVfbmVlZGVkOyAgICAgICAgLyogd2UgbWF5IGVpdGhlciBuZWVkIHRvIGFsbG9jYXRlIHRoaXMgYW1vdW50IG9mIGRhdGEsIG9yIHJlLXVzZSBpbWFnZSBkYXRhIGFuZCBpZ25vcmUgdGhpcyB2YWx1ZSAqLworCU9QSl9VSU5UMzIgZGF0YV9zaXplOyAgICAgICAgICAgICAgIC8qIHNpemUgb2YgdGhlIGRhdGEgb2YgdGhlIGNvbXBvbmVudCAqLworCU9QSl9JTlQzMiBudW1waXg7ICAgICAgICAgICAgICAgICAgIC8qIGFkZCBmaXhlZF9xdWFsaXR5ICovCit9IG9wal90Y2RfdGlsZWNvbXBfdDsKKworCisvKioKK0ZJWE1FIERPQworKi8KK3R5cGVkZWYgc3RydWN0IG9wal90Y2RfdGlsZSB7CisJT1BKX0lOVDMyIHgwLCB5MCwgeDEsIHkxOwkJLyogZGltZW5zaW9uIG9mIHRoZSB0aWxlIDogbGVmdCB1cHBlciBjb3JuZXIgKHgwLCB5MCkgcmlnaHQgbG93IGNvcm5lciAoeDEseTEpICovCisJT1BKX1VJTlQzMiBudW1jb21wczsJCQkvKiBudW1iZXIgb2YgY29tcG9uZW50cyBpbiB0aWxlICovCisJb3BqX3RjZF90aWxlY29tcF90ICpjb21wczsJLyogQ29tcG9uZW50cyBpbmZvcm1hdGlvbiAqLworCU9QSl9JTlQzMiBudW1waXg7CQkJCS8qIGFkZCBmaXhlZF9xdWFsaXR5ICovCisJT1BKX0ZMT0FUNjQgZGlzdG90aWxlOwkJCS8qIGFkZCBmaXhlZF9xdWFsaXR5ICovCisJT1BKX0ZMT0FUNjQgZGlzdG9sYXllclsxMDBdOwkvKiBhZGQgZml4ZWRfcXVhbGl0eSAqLworCU9QSl9VSU5UMzIgcGFja25vOyAgICAgICAgICAgICAgLyogcGFja2V0IG51bWJlciAqLworfSBvcGpfdGNkX3RpbGVfdDsKKworLyoqCitGSVhNRSBET0MKKyovCit0eXBlZGVmIHN0cnVjdCBvcGpfdGNkX2ltYWdlCit7CisJb3BqX3RjZF90aWxlX3QgKnRpbGVzOwkJLyogVGlsZXMgaW5mb3JtYXRpb24gKi8KK30KK29wal90Y2RfaW1hZ2VfdDsKKworCisvKioKK1RpbGUgY29kZXIvZGVjb2RlcgorKi8KK3R5cGVkZWYgc3RydWN0IG9wal90Y2QKK3sKKwkvKiogUG9zaXRpb24gb2YgdGhlIHRpbGVwYXJ0IGZsYWcgaW4gUHJvZ3Jlc3Npb24gb3JkZXIqLworCU9QSl9JTlQzMiB0cF9wb3M7CisJLyoqIFRpbGUgcGFydCBudW1iZXIqLworCU9QSl9VSU5UMzIgdHBfbnVtOworCS8qKiBDdXJyZW50IHRpbGUgcGFydCBudW1iZXIqLworCU9QSl9VSU5UMzIgY3VyX3RwX251bTsKKwkvKiogVG90YWwgbnVtYmVyIG9mIHRpbGVwYXJ0cyBvZiB0aGUgY3VycmVudCB0aWxlKi8KKwlPUEpfVUlOVDMyIGN1cl90b3RudW1fdHA7CisJLyoqIEN1cnJlbnQgUGFja2V0IGl0ZXJhdG9yIG51bWJlciAqLworCU9QSl9VSU5UMzIgY3VyX3Bpbm87CisJLyoqIGluZm8gb24gZWFjaCBpbWFnZSB0aWxlICovCisJb3BqX3RjZF9pbWFnZV90ICp0Y2RfaW1hZ2U7CisJLyoqIGltYWdlIGhlYWRlciAqLworCW9wal9pbWFnZV90ICppbWFnZTsKKwkvKiogY29kaW5nIHBhcmFtZXRlcnMgKi8KKwlvcGpfY3BfdCAqY3A7CisJLyoqIGNvZGluZy9kZWNvZGluZyBwYXJhbWV0ZXJzIGNvbW1vbiB0byBhbGwgdGlsZXMgKi8KKwlvcGpfdGNwX3QgKnRjcDsKKwkvKiogY3VycmVudCBlbmNvZGVkL2RlY29kZWQgdGlsZSAqLworCU9QSl9VSU5UMzIgdGNkX3RpbGVubzsKKwkvKiogdGVsbCBpZiB0aGUgdGNkIGlzIGEgZGVjb2Rlci4gKi8KKwlPUEpfVUlOVDMyIG1faXNfZGVjb2RlciA6IDE7Cit9IG9wal90Y2RfdDsKKworLyoqIEBuYW1lIEV4cG9ydGVkIGZ1bmN0aW9ucyAqLworLypAeyovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKK0R1bXAgdGhlIGNvbnRlbnQgb2YgYSB0Y2Qgc3RydWN0dXJlCisqLworLyp2b2lkIHRjZF9kdW1wKEZJTEUgKmZkLCBvcGpfdGNkX3QgKnRjZCwgb3BqX3RjZF9pbWFnZV90ICppbWcpOyovIC8qIFRPRE8gTVNEIHNob3VsIHVzZSB0aGUgbmV3IHYyIHN0cnVjdHVyZXMgKi8gCisKKy8qKgorQ3JlYXRlIGEgbmV3IFRDRCBoYW5kbGUKK0BwYXJhbSBwX2lzX2RlY29kZXIgRklYTUUgRE9DCitAcmV0dXJuIFJldHVybnMgYSBuZXcgVENEIGhhbmRsZSBpZiBzdWNjZXNzZnVsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKKyovCitvcGpfdGNkX3QqIG9wal90Y2RfY3JlYXRlKE9QSl9CT09MIHBfaXNfZGVjb2Rlcik7CisKKy8qKgorRGVzdHJveSBhIHByZXZpb3VzbHkgY3JlYXRlZCBUQ0QgaGFuZGxlCitAcGFyYW0gdGNkIFRDRCBoYW5kbGUgdG8gZGVzdHJveQorKi8KK3ZvaWQgb3BqX3RjZF9kZXN0cm95KG9wal90Y2RfdCAqdGNkKTsKKworLyoqCisgKiBJbml0aWFsaXplIHRoZSB0aWxlIGNvZGVyIGFuZCBtYXkgcmV1c2Ugc29tZSBtZW1vcnkuCisgKiBAcGFyYW0JcF90Y2QJCVRDRCBoYW5kbGUuCisgKiBAcGFyYW0JcF9pbWFnZQkJcmF3IGltYWdlLgorICogQHBhcmFtCXBfY3AJCWNvZGluZyBwYXJhbWV0ZXJzLgorICoKKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZW5jb2RpbmcgdmFsdWVzIGNvdWxkIGJlIHNldCAoZmFsc2Ugb3RoZXJ3aXNlKS4KKyovCitPUEpfQk9PTCBvcGpfdGNkX2luaXQoCW9wal90Y2RfdCAqcF90Y2QsCisJCQkJCQlvcGpfaW1hZ2VfdCAqIHBfaW1hZ2UsCisJCQkJCQlvcGpfY3BfdCAqIHBfY3AgKTsKKworLyoqCisgKiBBbGxvY2F0ZXMgbWVtb3J5IGZvciBkZWNvZGluZyBhIHNwZWNpZmljIHRpbGUuCisgKgorICogQHBhcmFtCXBfdGNkCQl0aGUgdGlsZSBkZWNvZGVyLgorICogQHBhcmFtCXBfdGlsZV9ubwl0aGUgaW5kZXggb2YgdGhlIHRpbGUgcmVjZWl2ZWQgaW4gc2VxdWVuY2UuIFRoaXMgbm90IG5lY2Vzc2FyaWx5IGxlYWQgdG8gdGhlCisgKiB0aWxlIGF0IGluZGV4IHBfdGlsZV9uby4KKyAqIEBwYXJhbSBwX21hbmFnZXIgdGhlIGV2ZW50IG1hbmFnZXIuCisgKgorICogQHJldHVybgl0cnVlIGlmIHRoZSByZW1haW5pbmcgZGF0YSBpcyBzdWZmaWNpZW50LgorICovCitPUEpfQk9PTCBvcGpfdGNkX2luaXRfZGVjb2RlX3RpbGUob3BqX3RjZF90ICpwX3RjZCwgT1BKX1VJTlQzMiBwX3RpbGVfbm8sIG9wal9ldmVudF9tZ3JfdCogcF9tYW5hZ2VyKTsKKwordm9pZCBvcGpfdGNkX21ha2VsYXllcl9maXhlZChvcGpfdGNkX3QgKnRjZCwgT1BKX1VJTlQzMiBsYXlubywgT1BKX1VJTlQzMiBmaW5hbCk7CisKK3ZvaWQgb3BqX3RjZF9yYXRlYWxsb2NhdGVfZml4ZWQob3BqX3RjZF90ICp0Y2QpOworCit2b2lkIG9wal90Y2RfbWFrZWxheWVyKAlvcGpfdGNkX3QgKnRjZCwKKwkJCQkJCU9QSl9VSU5UMzIgbGF5bm8sCisJCQkJCQlPUEpfRkxPQVQ2NCB0aHJlc2gsCisJCQkJCQlPUEpfVUlOVDMyIGZpbmFsKTsKKworT1BKX0JPT0wgb3BqX3RjZF9yYXRlYWxsb2NhdGUoCW9wal90Y2RfdCAqdGNkLAorCQkJCQkJCQlPUEpfQllURSAqZGVzdCwKKwkJCQkJCQkJT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAorCQkJCQkJCQlPUEpfVUlOVDMyIGxlbiwKKwkJCQkJCQkJb3BqX2NvZGVzdHJlYW1faW5mb190ICpjc3RyX2luZm8pOworCisvKioKKyAqIEdldHMgdGhlIG1heGltdW0gdGlsZSBzaXplIHRoYXQgd2lsbCBiZSB0YWtlbiBieSB0aGUgdGlsZSBvbmNlIGRlY29kZWQuCisgKi8KK09QSl9VSU5UMzIgb3BqX3RjZF9nZXRfZGVjb2RlZF90aWxlX3NpemUgKG9wal90Y2RfdCAqcF90Y2QgKTsKKworLyoqCisgKiBFbmNvZGVzIGEgdGlsZSBmcm9tIHRoZSByYXcgaW1hZ2UgaW50byB0aGUgZ2l2ZW4gYnVmZmVyLgorICogQHBhcmFtCXBfdGNkCQkJVGlsZSBDb2RlciBoYW5kbGUKKyAqIEBwYXJhbQlwX3RpbGVfbm8JCUluZGV4IG9mIHRoZSB0aWxlIHRvIGVuY29kZS4KKyAqIEBwYXJhbQlwX2Rlc3QJCQlEZXN0aW5hdGlvbiBidWZmZXIKKyAqIEBwYXJhbQlwX2RhdGFfd3JpdHRlbglwb2ludGVyIHRvIGFuIGludCB0aGF0IGlzIGluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhbGx5IHdyaXR0ZW4gb24gcF9kZXN0CisgKiBAcGFyYW0JcF9sZW4JCQlNYXhpbXVtIGxlbmd0aCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKiBAcGFyYW0JcF9jc3RyX2luZm8JCUNvZGVzdHJlYW0gaW5mb3JtYXRpb24gc3RydWN0dXJlCisgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBjb2RpbmcgaXMgc3VjY2Vzc2Z1bC4KKyovCitPUEpfQk9PTCBvcGpfdGNkX2VuY29kZV90aWxlKCAgIG9wal90Y2RfdCAqcF90Y2QsCisJCQkJCQkJICAgIE9QSl9VSU5UMzIgcF90aWxlX25vLAorCQkJCQkJCSAgICBPUEpfQllURSAqcF9kZXN0LAorCQkJCQkJCSAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCisJCQkJCQkJICAgIE9QSl9VSU5UMzIgcF9sZW4sCisJCQkJCQkJICAgIHN0cnVjdCBvcGpfY29kZXN0cmVhbV9pbmZvICpwX2NzdHJfaW5mbyk7CisKKworLyoqCitEZWNvZGUgYSB0aWxlIGZyb20gYSBidWZmZXIgaW50byBhIHJhdyBpbWFnZQorQHBhcmFtIHRjZCBUQ0QgaGFuZGxlCitAcGFyYW0gc3JjIFNvdXJjZSBidWZmZXIKK0BwYXJhbSBsZW4gTGVuZ3RoIG9mIHNvdXJjZSBidWZmZXIKK0BwYXJhbSB0aWxlbm8gTnVtYmVyIHRoYXQgaWRlbnRpZmllcyBvbmUgb2YgdGhlIHRpbGVzIHRvIGJlIGRlY29kZWQKK0BwYXJhbSBjc3RyX2luZm8gIEZJWE1FIERPQworQHBhcmFtIG1hbmFnZXIgdGhlIGV2ZW50IG1hbmFnZXIuCisqLworT1BKX0JPT0wgb3BqX3RjZF9kZWNvZGVfdGlsZSggICBvcGpfdGNkX3QgKnRjZCwKKwkJCQkJCQkgICAgT1BKX0JZVEUgKnNyYywKKwkJCQkJCQkgICAgT1BKX1VJTlQzMiBsZW4sCisJCQkJCQkJICAgIE9QSl9VSU5UMzIgdGlsZW5vLAorCQkJCQkJCSAgICBvcGpfY29kZXN0cmVhbV9pbmRleF90ICpjc3RyX2luZm8sCisJCQkJCQkJICAgIG9wal9ldmVudF9tZ3JfdCAqbWFuYWdlcik7CisKKworLyoqCisgKiBDb3BpZXMgdGlsZSBkYXRhIGZyb20gdGhlIHN5c3RlbSBvbnRvIHRoZSBnaXZlbiBtZW1vcnkgYmxvY2suCisgKi8KK09QSl9CT09MIG9wal90Y2RfdXBkYXRlX3RpbGVfZGF0YSAoCW9wal90Y2RfdCAqcF90Y2QsCisJCQkJCQkJCSAgICBPUEpfQllURSAqIHBfZGVzdCwKKwkJCQkJCQkJICAgIE9QSl9VSU5UMzIgcF9kZXN0X2xlbmd0aCApOworCisvKioKKyAqCisgKi8KK09QSl9VSU5UMzIgb3BqX3RjZF9nZXRfZW5jb2RlZF90aWxlX3NpemUgKCBvcGpfdGNkX3QgKnBfdGNkICk7CisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgdGlsZSBjb2RlciBhbmQgbWF5IHJldXNlIHNvbWUgbWVvcnkuCisgKgorICogQHBhcmFtCXBfdGNkCQlUQ0QgaGFuZGxlLgorICogQHBhcmFtCXBfdGlsZV9ubwljdXJyZW50IHRpbGUgaW5kZXggdG8gZW5jb2RlLgorICogQHBhcmFtIHBfbWFuYWdlciB0aGUgZXZlbnQgbWFuYWdlci4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGVuY29kaW5nIHZhbHVlcyBjb3VsZCBiZSBzZXQgKGZhbHNlIG90aGVyd2lzZSkuCisqLworT1BKX0JPT0wgb3BqX3RjZF9pbml0X2VuY29kZV90aWxlICgJb3BqX3RjZF90ICpwX3RjZCwKKwkJCQkJCQkJICAgIE9QSl9VSU5UMzIgcF90aWxlX25vLCBvcGpfZXZlbnRfbWdyX3QqIHBfbWFuYWdlciApOworCisvKioKKyAqIENvcGllcyB0aWxlIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gbWVtb3J5IGJsb2NrIG9udG8gdGhlIHN5c3RlbS4KKyAqLworT1BKX0JPT0wgb3BqX3RjZF9jb3B5X3RpbGVfZGF0YSAob3BqX3RjZF90ICpwX3RjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfc3JjX2xlbmd0aCApOworCisvKioKKyAqIEFsbG9jYXRlcyB0aWxlIGNvbXBvbmVudCBkYXRhCisgKgorICoKKyAqLworT1BKX0JPT0wgb3BqX2FsbG9jX3RpbGVfY29tcG9uZW50X2RhdGEob3BqX3RjZF90aWxlY29tcF90ICpsX3RpbGVjKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qQH0qLworCisvKkB9Ki8KKworI2VuZGlmIC8qIF9fVENEX0ggKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdGd0LmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3RndC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMzRhYTkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3RndC5jCkBAIC0wLDAgKzEsMzM1IEBACisvKgorICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCisgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFVuaXZlcnNpdGUgY2F0aG9saXF1ZSBkZSBMb3V2YWluIChVQ0wpLCBCZWxnaXVtCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQorICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZSIAorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDUyBTeXN0ZW1lcyBkJ0luZm9ybWF0aW9uLCBGcmFuY2UKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgQVMgSVMnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIm9wal9pbmNsdWRlcy5oIgorCisvKiAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIFRhZy10cmVlIGNvZGVyIGludGVyZmFjZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworb3BqX3RndF90cmVlX3QgKm9wal90Z3RfY3JlYXRlKE9QSl9VSU5UMzIgbnVtbGVhZnNoLCBPUEpfVUlOVDMyIG51bWxlYWZzdiwgb3BqX2V2ZW50X21ncl90ICptYW5hZ2VyKSB7CisgICAgICAgIE9QSl9JTlQzMiBucGxoWzMyXTsKKyAgICAgICAgT1BKX0lOVDMyIG5wbHZbMzJdOworICAgICAgICBvcGpfdGd0X25vZGVfdCAqbm9kZSA9IDAwOworICAgICAgICBvcGpfdGd0X25vZGVfdCAqbF9wYXJlbnRfbm9kZSA9IDAwOworICAgICAgICBvcGpfdGd0X25vZGVfdCAqbF9wYXJlbnRfbm9kZTAgPSAwMDsKKyAgICAgICAgb3BqX3RndF90cmVlX3QgKnRyZWUgPSAwMDsKKyAgICAgICAgT1BKX1VJTlQzMiBpOworICAgICAgICBPUEpfSU5UMzIgIGosazsKKyAgICAgICAgT1BKX1VJTlQzMiBudW1sdmxzOworICAgICAgICBPUEpfVUlOVDMyIG47CisKKyAgICAgICAgdHJlZSA9IChvcGpfdGd0X3RyZWVfdCAqKSBvcGpfY2FsbG9jKDEsc2l6ZW9mKG9wal90Z3RfdHJlZV90KSk7CisgICAgICAgIGlmKCF0cmVlKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhtYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgVGFnLXRyZWVcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAwMDsKKyAgICAgICAgfQorCisgICAgICAgIHRyZWUtPm51bWxlYWZzaCA9IG51bWxlYWZzaDsKKyAgICAgICAgdHJlZS0+bnVtbGVhZnN2ID0gbnVtbGVhZnN2OworCisgICAgICAgIG51bWx2bHMgPSAwOworICAgICAgICBucGxoWzBdID0gKE9QSl9JTlQzMiludW1sZWFmc2g7CisgICAgICAgIG5wbHZbMF0gPSAoT1BKX0lOVDMyKW51bWxlYWZzdjsKKyAgICAgICAgdHJlZS0+bnVtbm9kZXMgPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgbiA9IChPUEpfVUlOVDMyKShucGxoW251bWx2bHNdICogbnBsdltudW1sdmxzXSk7CisgICAgICAgICAgICAgICAgbnBsaFtudW1sdmxzICsgMV0gPSAobnBsaFtudW1sdmxzXSArIDEpIC8gMjsKKyAgICAgICAgICAgICAgICBucGx2W251bWx2bHMgKyAxXSA9IChucGx2W251bWx2bHNdICsgMSkgLyAyOworICAgICAgICAgICAgICAgIHRyZWUtPm51bW5vZGVzICs9IG47CisgICAgICAgICAgICAgICAgKytudW1sdmxzOworICAgICAgICB9IHdoaWxlIChuID4gMSk7CisKKyAgICAgICAgLyogQUREICovCisgICAgICAgIGlmICh0cmVlLT5udW1ub2RlcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgb3BqX2ZyZWUodHJlZSk7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhtYW5hZ2VyLCBFVlRfV0FSTklORywgInRndF9jcmVhdGUgdHJlZS0+bnVtbm9kZXMgPT0gMCwgbm8gdHJlZSBjcmVhdGVkLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDAwOworICAgICAgICB9CisKKyAgICAgICAgdHJlZS0+bm9kZXMgPSAob3BqX3RndF9ub2RlX3QqKSBvcGpfY2FsbG9jKHRyZWUtPm51bW5vZGVzLCBzaXplb2Yob3BqX3RndF9ub2RlX3QpKTsKKyAgICAgICAgaWYoIXRyZWUtPm5vZGVzKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhtYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgVGFnLXRyZWUgbm9kZXNcbiIpOworICAgICAgICAgICAgICAgIG9wal9mcmVlKHRyZWUpOworICAgICAgICAgICAgICAgIHJldHVybiAwMDsKKyAgICAgICAgfQorICAgICAgICB0cmVlLT5ub2Rlc19zaXplID0gdHJlZS0+bnVtbm9kZXMgKiAoT1BKX1VJTlQzMilzaXplb2Yob3BqX3RndF9ub2RlX3QpOworCisgICAgICAgIG5vZGUgPSB0cmVlLT5ub2RlczsKKyAgICAgICAgbF9wYXJlbnRfbm9kZSA9ICZ0cmVlLT5ub2Rlc1t0cmVlLT5udW1sZWFmc2ggKiB0cmVlLT5udW1sZWFmc3ZdOworICAgICAgICBsX3BhcmVudF9ub2RlMCA9IGxfcGFyZW50X25vZGU7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bWx2bHMgLSAxOyArK2kpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnBsdltpXTsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBrID0gbnBsaFtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgtLWsgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5wYXJlbnQgPSBsX3BhcmVudF9ub2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK25vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtLWsgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPnBhcmVudCA9IGxfcGFyZW50X25vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytub2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9wYXJlbnRfbm9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaiAmIDEpIHx8IGogPT0gbnBsdltpXSAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9wYXJlbnRfbm9kZTAgPSBsX3BhcmVudF9ub2RlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9wYXJlbnRfbm9kZSA9IGxfcGFyZW50X25vZGUwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3BhcmVudF9ub2RlMCArPSBucGxoW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBub2RlLT5wYXJlbnQgPSAwOworICAgICAgICBvcGpfdGd0X3Jlc2V0KHRyZWUpOworICAgICAgICByZXR1cm4gdHJlZTsKK30KKworLyoqCisgKiBSZWluaXRpYWxpc2VzIGEgdGFnLXRyZWUgZnJvbSBhbiBleGlzdGluZyBvbmUuCisgKgorICogQHBhcmFtICAgICAgIHBfdHJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRyZWUgdG8gcmVpbml0aWFsaXplLgorICogQHBhcmFtICAgICAgIHBfbnVtX2xlYWZzX2ggICAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgYXJyYXkgb2YgbGVhZnMgb2YgdGhlIHRyZWUKKyAqIEBwYXJhbSAgICAgICBwX251bV9sZWFmc192ICAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBhcnJheSBvZiBsZWFmcyBvZiB0aGUgdHJlZQorICogQHJldHVybiAgICAgIGEgbmV3IHRhZy10cmVlIGlmIHN1Y2Nlc3NmdWwsIE5VTEwgb3RoZXJ3aXNlCisqLworb3BqX3RndF90cmVlX3QgKm9wal90Z3RfaW5pdChvcGpfdGd0X3RyZWVfdCAqIHBfdHJlZSxPUEpfVUlOVDMyIHBfbnVtX2xlYWZzX2gsIE9QSl9VSU5UMzIgcF9udW1fbGVhZnNfdiwgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIpCit7CisgICAgICAgIE9QSl9JTlQzMiBsX25wbGhbMzJdOworICAgICAgICBPUEpfSU5UMzIgbF9ucGx2WzMyXTsKKyAgICAgICAgb3BqX3RndF9ub2RlX3QgKmxfbm9kZSA9IDAwOworICAgICAgICBvcGpfdGd0X25vZGVfdCAqbF9wYXJlbnRfbm9kZSA9IDAwOworICAgICAgICBvcGpfdGd0X25vZGVfdCAqbF9wYXJlbnRfbm9kZTAgPSAwMDsKKyAgICAgICAgT1BKX1VJTlQzMiBpOworICAgICAgICBPUEpfSU5UMzIgaixrOworICAgICAgICBPUEpfVUlOVDMyIGxfbnVtX2xldmVsczsKKyAgICAgICAgT1BKX1VJTlQzMiBuOworICAgICAgICBPUEpfVUlOVDMyIGxfbm9kZV9zaXplOworCisgICAgICAgIGlmICghIHBfdHJlZSl7CisgICAgICAgICAgICAgICAgcmV0dXJuIDAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChwX3RyZWUtPm51bWxlYWZzaCAhPSBwX251bV9sZWFmc19oKSB8fCAocF90cmVlLT5udW1sZWFmc3YgIT0gcF9udW1fbGVhZnNfdikpIHsKKyAgICAgICAgICAgICAgICBwX3RyZWUtPm51bWxlYWZzaCA9IHBfbnVtX2xlYWZzX2g7CisgICAgICAgICAgICAgICAgcF90cmVlLT5udW1sZWFmc3YgPSBwX251bV9sZWFmc192OworCisgICAgICAgICAgICAgICAgbF9udW1fbGV2ZWxzID0gMDsKKyAgICAgICAgICAgICAgICBsX25wbGhbMF0gPSAoT1BKX0lOVDMyKXBfbnVtX2xlYWZzX2g7CisgICAgICAgICAgICAgICAgbF9ucGx2WzBdID0gKE9QSl9JTlQzMilwX251bV9sZWFmc192OworICAgICAgICAgICAgICAgIHBfdHJlZS0+bnVtbm9kZXMgPSAwOworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbiA9IChPUEpfVUlOVDMyKShsX25wbGhbbF9udW1fbGV2ZWxzXSAqIGxfbnBsdltsX251bV9sZXZlbHNdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfbnBsaFtsX251bV9sZXZlbHMgKyAxXSA9IChsX25wbGhbbF9udW1fbGV2ZWxzXSArIDEpIC8gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfbnBsdltsX251bV9sZXZlbHMgKyAxXSA9IChsX25wbHZbbF9udW1fbGV2ZWxzXSArIDEpIC8gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfdHJlZS0+bnVtbm9kZXMgKz0gbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrbF9udW1fbGV2ZWxzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAobiA+IDEpOworCisgICAgICAgICAgICAgICAgLyogQUREICovCisgICAgICAgICAgICAgICAgaWYgKHBfdHJlZS0+bnVtbm9kZXMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RndF9kZXN0cm95KHBfdHJlZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxfbm9kZV9zaXplID0gcF90cmVlLT5udW1ub2RlcyAqIChPUEpfVUlOVDMyKXNpemVvZihvcGpfdGd0X25vZGVfdCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGxfbm9kZV9zaXplID4gcF90cmVlLT5ub2Rlc19zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGd0X25vZGVfdCogbmV3X25vZGVzID0gKG9wal90Z3Rfbm9kZV90Kikgb3BqX3JlYWxsb2MocF90cmVlLT5ub2RlcywgbF9ub2RlX3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmV3X25vZGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWluaXRpYWxpemUgdGhlIHRhZyB0cmVlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RndF9kZXN0cm95KHBfdHJlZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBfdHJlZS0+bm9kZXMgPSBuZXdfbm9kZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKChjaGFyICopIHBfdHJlZS0+bm9kZXMpICsgcF90cmVlLT5ub2Rlc19zaXplLCAwICwgbF9ub2RlX3NpemUgLSBwX3RyZWUtPm5vZGVzX3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgcF90cmVlLT5ub2Rlc19zaXplID0gbF9ub2RlX3NpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxfbm9kZSA9IHBfdHJlZS0+bm9kZXM7CisgICAgICAgICAgICAgICAgbF9wYXJlbnRfbm9kZSA9ICZwX3RyZWUtPm5vZGVzW3BfdHJlZS0+bnVtbGVhZnNoICogcF90cmVlLT5udW1sZWFmc3ZdOworICAgICAgICAgICAgICAgIGxfcGFyZW50X25vZGUwID0gbF9wYXJlbnRfbm9kZTsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsX251bV9sZXZlbHMgLSAxOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsX25wbHZbaV07ICsraikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrID0gbF9ucGxoW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoLS1rID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX25vZGUtPnBhcmVudCA9IGxfcGFyZW50X25vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX25vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0tayA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX25vZGUtPnBhcmVudCA9IGxfcGFyZW50X25vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfbm9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX3BhcmVudF9ub2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChqICYgMSkgfHwgaiA9PSBsX25wbHZbaV0gLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9wYXJlbnRfbm9kZTAgPSBsX3BhcmVudF9ub2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfcGFyZW50X25vZGUgPSBsX3BhcmVudF9ub2RlMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3BhcmVudF9ub2RlMCArPSBsX25wbGhbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbF9ub2RlLT5wYXJlbnQgPSAwOworICAgICAgICB9CisgICAgICAgIG9wal90Z3RfcmVzZXQocF90cmVlKTsKKworICAgICAgICByZXR1cm4gcF90cmVlOworfQorCit2b2lkIG9wal90Z3RfZGVzdHJveShvcGpfdGd0X3RyZWVfdCAqcF90cmVlKQoreworICAgICAgICBpZiAoISBwX3RyZWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAocF90cmVlLT5ub2RlcykgeworICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfdHJlZS0+bm9kZXMpOworICAgICAgICAgICAgICAgIHBfdHJlZS0+bm9kZXMgPSAwMDsKKyAgICAgICAgfQorICAgICAgICBvcGpfZnJlZShwX3RyZWUpOworfQorCit2b2lkIG9wal90Z3RfcmVzZXQob3BqX3RndF90cmVlX3QgKnBfdHJlZSkgeworICAgICAgICBPUEpfVUlOVDMyIGk7CisgICAgICAgIG9wal90Z3Rfbm9kZV90ICogbF9jdXJyZW50X25vZGUgPSAwMDs7CisKKyAgICAgICAgaWYgKCEgcF90cmVlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbF9jdXJyZW50X25vZGUgPSBwX3RyZWUtPm5vZGVzOworICAgICAgICBmb3IgICAgIChpID0gMDsgaSA8IHBfdHJlZS0+bnVtbm9kZXM7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGxfY3VycmVudF9ub2RlLT52YWx1ZSA9IDk5OTsKKyAgICAgICAgICAgICAgICBsX2N1cnJlbnRfbm9kZS0+bG93ID0gMDsKKyAgICAgICAgICAgICAgICBsX2N1cnJlbnRfbm9kZS0+a25vd24gPSAwOworICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X25vZGU7CisgICAgICAgIH0KK30KKwordm9pZCBvcGpfdGd0X3NldHZhbHVlKG9wal90Z3RfdHJlZV90ICp0cmVlLCBPUEpfVUlOVDMyIGxlYWZubywgT1BKX0lOVDMyIHZhbHVlKSB7CisgICAgICAgIG9wal90Z3Rfbm9kZV90ICpub2RlOworICAgICAgICBub2RlID0gJnRyZWUtPm5vZGVzW2xlYWZub107CisgICAgICAgIHdoaWxlIChub2RlICYmIG5vZGUtPnZhbHVlID4gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICBub2RlLT52YWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLT5wYXJlbnQ7CisgICAgICAgIH0KK30KKwordm9pZCBvcGpfdGd0X2VuY29kZShvcGpfYmlvX3QgKmJpbywgb3BqX3RndF90cmVlX3QgKnRyZWUsIE9QSl9VSU5UMzIgbGVhZm5vLCBPUEpfSU5UMzIgdGhyZXNob2xkKSB7CisgICAgICAgIG9wal90Z3Rfbm9kZV90ICpzdGtbMzFdOworICAgICAgICBvcGpfdGd0X25vZGVfdCAqKnN0a3B0cjsKKyAgICAgICAgb3BqX3RndF9ub2RlX3QgKm5vZGU7CisgICAgICAgIE9QSl9JTlQzMiBsb3c7CisKKyAgICAgICAgc3RrcHRyID0gc3RrOworICAgICAgICBub2RlID0gJnRyZWUtPm5vZGVzW2xlYWZub107CisgICAgICAgIHdoaWxlIChub2RlLT5wYXJlbnQpIHsKKyAgICAgICAgICAgICAgICAqc3RrcHRyKysgPSBub2RlOworICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLT5wYXJlbnQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGxvdyA9IDA7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICBpZiAobG93ID4gbm9kZS0+bG93KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5sb3cgPSBsb3c7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvdyA9IG5vZGUtPmxvdzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgd2hpbGUgKGxvdyA8IHRocmVzaG9sZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvdyA+PSBub2RlLT52YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5vZGUtPmtub3duKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2Jpb193cml0ZShiaW8sIDEsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmtub3duID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9iaW9fd3JpdGUoYmlvLCAwLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrbG93OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBub2RlLT5sb3cgPSBsb3c7CisgICAgICAgICAgICAgICAgaWYgKHN0a3B0ciA9PSBzdGspCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBub2RlID0gKi0tc3RrcHRyOworICAgICAgICB9Cit9CisKK09QSl9VSU5UMzIgb3BqX3RndF9kZWNvZGUob3BqX2Jpb190ICpiaW8sIG9wal90Z3RfdHJlZV90ICp0cmVlLCBPUEpfVUlOVDMyIGxlYWZubywgT1BKX0lOVDMyIHRocmVzaG9sZCkgeworICAgICAgICBvcGpfdGd0X25vZGVfdCAqc3RrWzMxXTsKKyAgICAgICAgb3BqX3RndF9ub2RlX3QgKipzdGtwdHI7CisgICAgICAgIG9wal90Z3Rfbm9kZV90ICpub2RlOworICAgICAgICBPUEpfSU5UMzIgbG93OworCisgICAgICAgIHN0a3B0ciA9IHN0azsKKyAgICAgICAgbm9kZSA9ICZ0cmVlLT5ub2Rlc1tsZWFmbm9dOworICAgICAgICB3aGlsZSAobm9kZS0+cGFyZW50KSB7CisgICAgICAgICAgICAgICAgKnN0a3B0cisrID0gbm9kZTsKKyAgICAgICAgICAgICAgICBub2RlID0gbm9kZS0+cGFyZW50OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBsb3cgPSAwOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgaWYgKGxvdyA+IG5vZGUtPmxvdykgeworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+bG93ID0gbG93OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb3cgPSBub2RlLT5sb3c7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlIChsb3cgPCB0aHJlc2hvbGQgJiYgbG93IDwgbm9kZS0+dmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGpfYmlvX3JlYWQoYmlvLCAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT52YWx1ZSA9IGxvdzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbG93OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub2RlLT5sb3cgPSBsb3c7CisgICAgICAgICAgICAgICAgaWYgKHN0a3B0ciA9PSBzdGspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub2RlID0gKi0tc3RrcHRyOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gKG5vZGUtPnZhbHVlIDwgdGhyZXNob2xkKSA/IDEgOiAwOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90Z3QuaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdGd0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAyMjM4MAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdGd0LmgKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKKyAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKKyAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKKyAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgVW5pdmVyc2l0ZSBjYXRob2xpcXVlIGRlIExvdXZhaW4gKFVDTCksIEJlbGdpdW0KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBQcm9mZXNzb3IgQmVub2l0IE1hY3EKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzLCBEYXZpZCBKYW5zc2VucworICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIFlhbm5pY2sgVmVyc2NodWVyZW4KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eCAKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE0LCBBbnRvbmluIERlc2NhbXBlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgSmVyb21lIEZpbWVzLCBDb21tdW5pY2F0aW9ucyAmIFN5c3RlbWVzIDxqZXJvbWUuZmltZXNAYy1zLmZyPgorICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIENlbnRyZSBOYXRpb25hbCBkJ0V0dWRlcyBTcGF0aWFsZXMgKENORVMpLCBGcmFuY2UgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENTIFN5c3RlbWVzIGQnSW5mb3JtYXRpb24sIEZyYW5jZQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9fVEdUX0gKKyNkZWZpbmUgX19UR1RfSAorLyoqCitAZmlsZSB0Z3QuaAorQGJyaWVmIEltcGxlbWVudGF0aW9uIG9mIGEgdGFnLXRyZWUgY29kZXIgKFRHVCkKKworVGhlIGZ1bmN0aW9ucyBpbiBUR1QuQyBoYXZlIGZvciBnb2FsIHRvIHJlYWxpemUgYSB0YWctdHJlZSBjb2Rlci4gVGhlIGZ1bmN0aW9ucyBpbiBUR1QuQworYXJlIHVzZWQgYnkgc29tZSBmdW5jdGlvbiBpbiBUMi5DLgorKi8KKworLyoqIEBkZWZncm91cCBUR1QgVEdUIC0gSW1wbGVtZW50YXRpb24gb2YgYSB0YWctdHJlZSBjb2RlciAqLworLypAeyovCisKKy8qKgorVGFnIG5vZGUKKyovCit0eXBlZGVmIHN0cnVjdCBvcGpfdGd0X25vZGUgeworICAgIHN0cnVjdCBvcGpfdGd0X25vZGUgKnBhcmVudDsKKyAgICBPUEpfSU5UMzIgdmFsdWU7CisgICAgT1BKX0lOVDMyIGxvdzsKKyAgICBPUEpfVUlOVDMyIGtub3duOworfSBvcGpfdGd0X25vZGVfdDsKKworLyoqCitUYWcgdHJlZQorKi8KK3R5cGVkZWYgc3RydWN0IG9wal90Z3RfdHJlZQoreworCU9QSl9VSU5UMzIgIG51bWxlYWZzaDsKKwlPUEpfVUlOVDMyICBudW1sZWFmc3Y7CisJT1BKX1VJTlQzMiBudW1ub2RlczsKKwlvcGpfdGd0X25vZGVfdCAqbm9kZXM7CisJT1BKX1VJTlQzMiAgbm9kZXNfc2l6ZTsJCS8qIG1heGltdW0gc2l6ZSB0YWtlbiBieSBub2RlcyAqLworfSBvcGpfdGd0X3RyZWVfdDsKKworCisvKiogQG5hbWUgRXhwb3J0ZWQgZnVuY3Rpb25zICovCisvKkB7Ki8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKioKK0NyZWF0ZSBhIHRhZy10cmVlCitAcGFyYW0gbnVtbGVhZnNoIFdpZHRoIG9mIHRoZSBhcnJheSBvZiBsZWFmcyBvZiB0aGUgdHJlZQorQHBhcmFtIG51bWxlYWZzdiBIZWlnaHQgb2YgdGhlIGFycmF5IG9mIGxlYWZzIG9mIHRoZSB0cmVlCitAcmV0dXJuIFJldHVybnMgYSBuZXcgdGFnLXRyZWUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQorKi8KK29wal90Z3RfdHJlZV90ICpvcGpfdGd0X2NyZWF0ZShPUEpfVUlOVDMyIG51bWxlYWZzaCwgT1BKX1VJTlQzMiBudW1sZWFmc3YsIG9wal9ldmVudF9tZ3JfdCAqbWFuYWdlcik7CisKKy8qKgorICogUmVpbml0aWFsaXNlcyBhIHRhZy10cmVlIGZyb20gYW4gZXhpeHRpbmcgb25lLgorICoKKyAqIEBwYXJhbQlwX3RyZWUJCQkJdGhlIHRyZWUgdG8gcmVpbml0aWFsaXplLgorICogQHBhcmFtCXBfbnVtX2xlYWZzX2gJCXRoZSB3aWR0aCBvZiB0aGUgYXJyYXkgb2YgbGVhZnMgb2YgdGhlIHRyZWUKKyAqIEBwYXJhbQlwX251bV9sZWFmc192CQl0aGUgaGVpZ2h0IG9mIHRoZSBhcnJheSBvZiBsZWFmcyBvZiB0aGUgdHJlZQorICogQHBhcmFtIHBfbWFuYWdlciAgICAgICB0aGUgZXZlbnQgbWFuYWdlcgorICogQHJldHVybglhIG5ldyB0YWctdHJlZSBpZiBzdWNjZXNzZnVsLCBOVUxMIG90aGVyd2lzZQorKi8KK29wal90Z3RfdHJlZV90ICpvcGpfdGd0X2luaXQob3BqX3RndF90cmVlX3QgKiBwX3RyZWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICBwX251bV9sZWFmc19oLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAgcF9udW1fbGVhZnNfdiwgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIpOworLyoqCitEZXN0cm95IGEgdGFnLXRyZWUsIGxpYmVyYXRpbmcgbWVtb3J5CitAcGFyYW0gdHJlZSBUYWctdHJlZSB0byBkZXN0cm95CisqLwordm9pZCBvcGpfdGd0X2Rlc3Ryb3kob3BqX3RndF90cmVlX3QgKnRyZWUpOworLyoqCitSZXNldCBhIHRhZy10cmVlIChzZXQgYWxsIGxlYXZlcyB0byAwKQorQHBhcmFtIHRyZWUgVGFnLXRyZWUgdG8gcmVzZXQKKyovCit2b2lkIG9wal90Z3RfcmVzZXQob3BqX3RndF90cmVlX3QgKnRyZWUpOworLyoqCitTZXQgdGhlIHZhbHVlIG9mIGEgbGVhZiBvZiBhIHRhZy10cmVlCitAcGFyYW0gdHJlZSBUYWctdHJlZSB0byBtb2RpZnkKK0BwYXJhbSBsZWFmbm8gTnVtYmVyIHRoYXQgaWRlbnRpZmllcyB0aGUgbGVhZiB0byBtb2RpZnkKK0BwYXJhbSB2YWx1ZSBOZXcgdmFsdWUgb2YgdGhlIGxlYWYKKyovCit2b2lkIG9wal90Z3Rfc2V0dmFsdWUob3BqX3RndF90cmVlX3QgKnRyZWUsIAorICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbGVhZm5vLCAKKyAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgdmFsdWUpOworLyoqCitFbmNvZGUgdGhlIHZhbHVlIG9mIGEgbGVhZiBvZiB0aGUgdGFnLXRyZWUgdXAgdG8gYSBnaXZlbiB0aHJlc2hvbGQKK0BwYXJhbSBiaW8gUG9pbnRlciB0byBhIEJJTyBoYW5kbGUKK0BwYXJhbSB0cmVlIFRhZy10cmVlIHRvIG1vZGlmeQorQHBhcmFtIGxlYWZubyBOdW1iZXIgdGhhdCBpZGVudGlmaWVzIHRoZSBsZWFmIHRvIGVuY29kZQorQHBhcmFtIHRocmVzaG9sZCBUaHJlc2hvbGQgdG8gdXNlIHdoZW4gZW5jb2RpbmcgdmFsdWUgb2YgdGhlIGxlYWYKKyovCit2b2lkIG9wal90Z3RfZW5jb2RlKG9wal9iaW9fdCAqYmlvLCAKKyAgICAgICAgICAgICAgICAgICAgb3BqX3RndF90cmVlX3QgKnRyZWUsIAorICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxlYWZubywgCisgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiB0aHJlc2hvbGQpOworLyoqCitEZWNvZGUgdGhlIHZhbHVlIG9mIGEgbGVhZiBvZiB0aGUgdGFnLXRyZWUgdXAgdG8gYSBnaXZlbiB0aHJlc2hvbGQKK0BwYXJhbSBiaW8gUG9pbnRlciB0byBhIEJJTyBoYW5kbGUKK0BwYXJhbSB0cmVlIFRhZy10cmVlIHRvIGRlY29kZQorQHBhcmFtIGxlYWZubyBOdW1iZXIgdGhhdCBpZGVudGlmaWVzIHRoZSBsZWFmIHRvIGRlY29kZQorQHBhcmFtIHRocmVzaG9sZCBUaHJlc2hvbGQgdG8gdXNlIHdoZW4gZGVjb2RpbmcgdmFsdWUgb2YgdGhlIGxlYWYKK0ByZXR1cm4gUmV0dXJucyAxIGlmIHRoZSBub2RlJ3MgdmFsdWUgPCB0aHJlc2hvbGQsIHJldHVybnMgMCBvdGhlcndpc2UKKyovCitPUEpfVUlOVDMyIG9wal90Z3RfZGVjb2RlKG9wal9iaW9fdCAqYmlvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RndF90cmVlX3QgKnRyZWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxlYWZubywgCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiB0aHJlc2hvbGQpOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qQH0qLworCisvKkB9Ki8KKworI2VuZGlmIC8qIF9fVEdUX0ggKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAwMC1idWlsZC1jb25maWcucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMDAtYnVpbGQtY29uZmlnLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZTg2ZTYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMDAtYnVpbGQtY29uZmlnLnBhdGNoCkBAIC0wLDAgKzEsMzQzIEBACitkaWZmIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZmaW9wLmggYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmZpb3AuaAorLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZmaW9wLmgKKysrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmZmlvcC5oCitAQCAtMzAsNyArMzAsNyBAQAorICAqIGBgTGlicmFyeS1wcml2YXRlJycgZGVmaW5pdGlvbnMuCisgICovCisgCistI2luY2x1ZGUgInRpZl9jb25maWcuaCIKKysjaW5jbHVkZSAidGlmZmNvbmYuaCIKKyAKKyAjaWZkZWYgSEFWRV9GQ05UTF9ICisgIyBpbmNsdWRlIDxmY250bC5oPgorQEAgLTU5LDggKzU5LDcgQEAKKyAKKyAjaWYgIWRlZmluZWQoSEFWRV9TTlBSSU5URikgJiYgIWRlZmluZWQoSEFWRV9fU05QUklOVEYpCisgI3VuZGVmIHNucHJpbnRmCistI2RlZmluZSBzbnByaW50ZiBfVElGRl9zbnByaW50Zl9mCistZXh0ZXJuIGludCBzbnByaW50ZihjaGFyKiBzdHIsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyKiBmb3JtYXQsIC4uLik7CisrI2RlZmluZSBzbnByaW50ZiBGWFNZU19zbnByaW50ZgorICNlbmRpZgorIAorICNpbmNsdWRlICJ0aWZmaW8uaCIKK2RpZmYgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9qcGVnLmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9qcGVnLmMKKy0tLSBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2pwZWcuYworKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfanBlZy5jCitAQCAtODUsOCArODUsMTYgQEAKKyAjIGRlZmluZSBIQVZFX0JPT0xFQU4gICAgICAgICAgICAvKiBwcmV2ZW50IGptb3JlY2ZnLmggZnJvbSByZWRlZmluaW5nIGl0ICovCisgI2VuZGlmCisgCistI2luY2x1ZGUgImpwZWdsaWIuaCIKKy0jaW5jbHVkZSAiamVycm9yLmgiCisrI2lmIGRlZmluZWQoVVNFX1NZU1RFTV9MSUJKUEVHKQorKyNpbmNsdWRlIDxqZXJyb3IuaD4KKysjaW5jbHVkZSA8anBlZ2xpYi5oPgorKyNlbGlmIGRlZmluZWQoVVNFX0xJQkpQRUdfVFVSQk8pCisrI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xpYmpwZWdfdHVyYm8vamVycm9yLmgiCisrI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xpYmpwZWdfdHVyYm8vanBlZ2xpYi5oIgorKyNlbHNlCisrI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xpYmpwZWcvamVycm9yLmgiCisrI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xpYmpwZWcvanBlZ2xpYi5oIgorKyNlbmRpZgorIAorIC8qIAorICAqIERvIHdlIHdhbnQgdG8gZG8gc3BlY2lhbCBwcm9jZXNzaW5nIHN1aXRhYmxlIGZvciB3aGVuIEpTQU1QTEUgaXMgYQorZGlmZiBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX29qcGVnLmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9vanBlZy5jCistLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9vanBlZy5jCisrKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9vanBlZy5jCitAQCAtMjE0LDggKzIxNCwxNyBAQAorICMgZGVmaW5lIEhBVkVfQk9PTEVBTiAgICAgICAgICAgIC8qIHByZXZlbnQgam1vcmVjZmcuaCBmcm9tIHJlZGVmaW5pbmcgaXQgKi8KKyAjZW5kaWYKKyAKKy0jaW5jbHVkZSAianBlZ2xpYi5oIgorLSNpbmNsdWRlICJqZXJyb3IuaCIKKysjaWYgZGVmaW5lZChVU0VfU1lTVEVNX0xJQkpQRUcpCisrI2luY2x1ZGUgPGplcnJvci5oPgorKyNpbmNsdWRlIDxqcGVnbGliLmg+CisrI2VsaWYgZGVmaW5lZChVU0VfTElCSlBFR19UVVJCTykKKysjaW5jbHVkZSAidGhpcmRfcGFydHkvbGlianBlZ190dXJiby9qZXJyb3IuaCIKKysjaW5jbHVkZSAidGhpcmRfcGFydHkvbGlianBlZ190dXJiby9qcGVnbGliLmgiCisrI2Vsc2UKKysjaW5jbHVkZSAidGhpcmRfcGFydHkvbGlianBlZy9qZXJyb3IuaCIKKysjaW5jbHVkZSAidGhpcmRfcGFydHkvbGlianBlZy9qcGVnbGliLmgiCisrI2VuZGlmCisrCisgCisgdHlwZWRlZiBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IganBlZ19lcnJvcl9tZ3I7CisgdHlwZWRlZiBzdHJ1Y3QganBlZ19jb21tb25fc3RydWN0IGpwZWdfY29tbW9uX3N0cnVjdDsKK2RpZmYgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9waXhhcmxvZy5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcGl4YXJsb2cuYworLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcGl4YXJsb2cuYworKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcGl4YXJsb2cuYworQEAgLTkwLDcgKzkwLDcgQEAKKyAgKi8KKyAKKyAjaW5jbHVkZSAidGlmX3ByZWRpY3QuaCIKKy0jaW5jbHVkZSAiemxpYi5oIgorKyNpbmNsdWRlICIuLi96bGliX3YxMjgvemxpYi5oIgorIAorICNpbmNsdWRlIDxzdGRpby5oPgorICNpbmNsdWRlIDxzdGRsaWIuaD4KK2RpZmYgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl96aXAuYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3ppcC5jCistLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl96aXAuYworKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfemlwLmMKK0BAIC00Nyw3ICs0Nyw3IEBACisgICogbGFzdCBmb3VuZCBhdCBmdHA6Ly9mdHAudXUubmV0L3B1Yi9hcmNoaXZpbmcvemlwL3psaWIvemxpYi0wLjk5LnRhci5nei4KKyAgKi8KKyAjaW5jbHVkZSAidGlmX3ByZWRpY3QuaCIKKy0jaW5jbHVkZSAiemxpYi5oIgorKyNpbmNsdWRlICIuLi96bGliX3YxMjgvemxpYi5oIgorIAorICNpbmNsdWRlIDxzdGRpby5oPgorIAorZGlmZiBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmZmNvbmYuaCBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmZmNvbmYuaAorLS0tIC9kZXYvbnVsbAorKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZmY29uZi5oCitAQCAtMCwwICsxLDI0OCBAQAorKy8qIGxpYnRpZmYvdGlmZmNvbmYuaC4gIEdlbmVyYXRlZCBieSBjb25maWd1cmUuICAqLworKy8qCisrICBDb25maWd1cmF0aW9uIGRlZmluZXMgZm9yIGluc3RhbGxlZCBsaWJ0aWZmLgorKyAgVGhpcyBmaWxlIG1haW50YWluZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIERvIG5vdCB1c2UgZGVmaW5pdGlvbnMKKysgIGZyb20gdGhpcyBmaWxlIGluIHlvdXIgcHJvZ3JhbXMuCisrKi8KKysjaWZuZGVmIF9USUZGQ09ORl8KKysjZGVmaW5lIF9USUZGQ09ORl8KKysKKysjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorKworKy8vTk9URTogVGhlIHRpZmYgY29kZWMgcmVxdWlyZXMgYW4gQU5TSSBDIGNvbXBpbGVyIGVudmlyb25tZW50IGZvciBidWlsZGluZyBhbmQgCisrLy8JCXByZXN1bWVzIGFuIEFOU0kgQyBlbnZpcm9ubWVudCBmb3IgdXNlLgorKworKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICovCisrLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisrI2lmIF9GWF9PU18gPT0gX0ZYX1dJTjMyX01PQklMRV8KKysjIGRlZmluZSBPX1JET05MWSAgICAgICAweDAwMDAgIC8qIG9wZW4gZm9yIHJlYWRpbmcgb25seSAqLworKyMgZGVmaW5lIE9fV1JPTkxZICAgICAgIDB4MDAwMSAgLyogb3BlbiBmb3Igd3JpdGluZyBvbmx5ICovCisrIyBkZWZpbmUgT19SRFdSICAgICAgICAgMHgwMDAyICAvKiBvcGVuIGZvciByZWFkaW5nIGFuZCB3cml0aW5nICovCisrIyBkZWZpbmUgT19DUkVBVCAgICAgICAgMHgwMTAwICAvKiBjcmVhdGUgYW5kIG9wZW4gZmlsZSAqLworKyMgZGVmaW5lIE9fVFJVTkMgICAgICAgIDB4MDIwMCAgLyogb3BlbiBhbmQgdHJ1bmNhdGUgKi8KKysjZWxzZQorKyMgZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQorKyMgZGVmaW5lIEhBVkVfRkNOVExfSCAxCisrI2VuZGlmCisrCisrLyogQ29tcGF0aWJpbGl0eSBzdHVmZi4gKi8KKysKKysvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGFzc2VydC5oPiBoZWFkZXIgZmlsZS4gKi8KKysjZGVmaW5lIEhBVkVfQVNTRVJUX0ggMQorKworKy8qIERlZmluZSBhcyAwIG9yIDEgYWNjb3JkaW5nIHRvIHRoZSBmbG9hdGluZyBwb2ludCBmb3JtYXQgc3Vwb3J0ZWQgYnkgdGhlCisrICAgbWFjaGluZSAqLworKyNkZWZpbmUgSEFWRV9JRUVFRlAgMQorKworKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLworKy8vI2RlZmluZSBIQVZFX1NUUklOR19IIDEKKysvL2Z4X3N5c3RlbS5oIGFscmVhZHkgaW5jbHVkZSB0aGUgc3RyaW5nLmggaW4gQU5TSUMKKysKKysvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHNlYXJjaC5oPiBoZWFkZXIgZmlsZS4gKi8KKysvKiNkZWZpbmUgSEFWRV9TRUFSQ0hfSCAxICovCisrCisrLyogVGhlIHNpemUgb2YgYSBgaW50JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworKy8qIEFjY29yZGluZyB0eXBlZGVmIGludAlpbnQzMl90OyBpbiB0aGUgZnhfc3lzdGVtLmgqLworKyNkZWZpbmUgU0laRU9GX0lOVCA0CisrCisrLyogU3VubGlhbmcuTGl1IDIwMTEwMzI1LiBXZSBzaG91bGQgY29uZmlnIHRoZSBjb3JyZWN0IGxvbmcgc2l6ZSBmb3IgdGlmIAorKyAgIGZheDRkZWNvZGUgb3B0aW1pemUgaW4gdGlmX2ZheDMuYyAgLS0gTGludXg2NCBkZWNvZGUgaXNzdWUuIAorKyAgIFRFU1RET0M6IEJ1ZyAjMjM2NjEgLSB6MS50aWYuICovCisrI2lmIF9GWF9DUFVfID09IF9GWF9XSU42NF8gfHwgX0ZYX0NQVV8gPT0gX0ZYX1g2NF8gfHwgX0ZYX0NQVV8gPT0gX0ZYX0lBNjRfCisrLyogVGhlIHNpemUgb2YgYHVuc2lnbmVkIGxvbmcnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisrI2RlZmluZSBTSVpFT0ZfVU5TSUdORURfTE9ORyA4CisrI2Vsc2UKKysjZGVmaW5lIFNJWkVPRl9VTlNJR05FRF9MT05HIDQKKysjZW5kaWYKKysKKysvKiBTaWduZWQgOC1iaXQgdHlwZSAqLworKyNkZWZpbmUgVElGRl9JTlQ4X1Qgc2lnbmVkIGNoYXIKKysKKysvKiBVbnNpZ25lZCA4LWJpdCB0eXBlICovCisrI2RlZmluZSBUSUZGX1VJTlQ4X1QgdW5zaWduZWQgY2hhcgorKworKy8qIFNpZ25lZCAxNi1iaXQgdHlwZSAqLworKyNkZWZpbmUgVElGRl9JTlQxNl9UIHNpZ25lZCBzaG9ydAorKworKy8qIFVuc2lnbmVkIDE2LWJpdCB0eXBlICovCisrI2RlZmluZSBUSUZGX1VJTlQxNl9UIHVuc2lnbmVkIHNob3J0CisrCisrLyogU2lnbmVkIDMyLWJpdCB0eXBlICovCisrI2RlZmluZSBUSUZGX0lOVDMyX1Qgc2lnbmVkIGludAorKworKy8qIFVuc2lnbmVkIDMyLWJpdCB0eXBlICovCisrI2RlZmluZSBUSUZGX1VJTlQzMl9UIHVuc2lnbmVkIGludAorKworKy8qIFNpZ25lZCAzMi1iaXQgdHlwZSBmb3JtYXR0ZXIgKi8KKysjZGVmaW5lIFRJRkZfSU5UMzJfRk9STUFUICIlZCIKKysKKysvKiBVbnNpZ25lZCAzMi1iaXQgdHlwZSBmb3JtYXR0ZXIgKi8KKysjZGVmaW5lIFRJRkZfVUlOVDMyX0ZPUk1BVCAiJXUiCisrCisrI2lmZGVmIF9NU0NfVkVSCQkvLyB3aW5kb3dzCisrCisrLyogU2lnbmVkIDY0LWJpdCB0eXBlIGZvcm1hdHRlciAqLworKyNkZWZpbmUgVElGRl9JTlQ2NF9GT1JNQVQgIiVJNjRkIgorKworKy8qIFVuc2lnbmVkIDY0LWJpdCB0eXBlIGZvcm1hdHRlciAqLworKyNkZWZpbmUgVElGRl9VSU5UNjRfRk9STUFUICIlSTY0dSIKKysKKysvKiBTaWduZWQgNjQtYml0IHR5cGUgKi8KKysjZGVmaW5lIFRJRkZfSU5UNjRfVCBzaWduZWQgX19pbnQ2NAorKworKy8qIFVuc2lnbmVkIDY0LWJpdCB0eXBlICovCisrI2RlZmluZSBUSUZGX1VJTlQ2NF9UIHVuc2lnbmVkIF9faW50NjQKKysKKysjZWxzZQkJCQkJCS8vIGxpbnV4L3VuaXgKKysKKysjaWYgMCAvL19GWF9DUFVfID09IF9GWF9YNjRfCS8vIGxpbnV4L3VuaXggNjQKKysKKysvKiBTaWduZWQgNjQtYml0IHR5cGUgZm9ybWF0dGVyICovCisrI2RlZmluZSBUSUZGX0lOVDY0X0ZPUk1BVCAiJWxkIgorKworKy8qIFVuc2lnbmVkIDY0LWJpdCB0eXBlIGZvcm1hdHRlciAqLworKyNkZWZpbmUgVElGRl9VSU5UNjRfRk9STUFUICIlbHUiCisrCisrLyogU2lnbmVkIDY0LWJpdCB0eXBlICovCisrI2RlZmluZSBUSUZGX0lOVDY0X1Qgc2lnbmVkIGxvbmcKKysKKysjZWxzZQkJCQkJCS8vIGxpbnV4L3VuaXggMzIKKysKKysvKiBTaWduZWQgNjQtYml0IHR5cGUgZm9ybWF0dGVyICovCisrI2RlZmluZSBUSUZGX0lOVDY0X0ZPUk1BVCAiJWxsZCIKKysKKysvKiBVbnNpZ25lZCA2NC1iaXQgdHlwZSBmb3JtYXR0ZXIgKi8KKysjZGVmaW5lIFRJRkZfVUlOVDY0X0ZPUk1BVCAiJWxsdSIKKysKKysvKiBTaWduZWQgNjQtYml0IHR5cGUgKi8KKysjZGVmaW5lIFRJRkZfSU5UNjRfVCBzaWduZWQgbG9uZyBsb25nCisrCisrI2VuZGlmCQkJCQkJLy8gZW5kIF9GWF9DUFVfCisrCisrLyogVW5zaWduZWQgNjQtYml0IHR5cGUgKi8KKysjZGVmaW5lIFRJRkZfVUlOVDY0X1QgdW5zaWduZWQgbG9uZyBsb25nCisrCisrI2VuZGlmCisrCisrCisrLyogU2lnbmVkIHNpemUgdHlwZSAqLworKyNpZmRlZiBfTVNDX1ZFUgorKworKyNpZiBkZWZpbmVkKF9XSU42NCkKKysjZGVmaW5lIFRJRkZfU1NJWkVfVCBzaWduZWQgX19pbnQ2NAorKyNlbHNlCisrI2RlZmluZSBUSUZGX1NTSVpFX1Qgc2lnbmVkIGludAorKyNlbmRpZgorKworKyNlbHNlCisrCisrI2RlZmluZSBUSUZGX1NTSVpFX1Qgc2lnbmVkIGxvbmcKKysKKysjZW5kaWYKKysKKysvKiBTaWduZWQgc2l6ZSB0eXBlIGZvcm1hdHRlciAqLworKyNpZiBkZWZpbmVkKF9XSU42NCkKKysjZGVmaW5lIFRJRkZfU1NJWkVfRk9STUFUICIlSTY0ZCIKKysjZWxzZQorKyNkZWZpbmUgVElGRl9TU0laRV9GT1JNQVQgIiVsZCIKKysjZW5kaWYKKysKKysvKiBQb2ludGVyIGRpZmZlcmVuY2UgdHlwZSAqLworKyNpZmRlZiBfTVNDX1ZFUgorKyNkZWZpbmUgVElGRl9QVFJESUZGX1QgbG9uZworKyNlbHNlCisrI2RlZmluZSBUSUZGX1BUUkRJRkZfVCBwdHJkaWZmX3QKKysjZW5kaWYKKysKKysvKiBTaWduZWQgNjQtYml0IHR5cGUgKi8KKysvKiNkZWZpbmUgVElGRl9JTlQ2NF9UIHNpZ25lZCBfX2ludDY0Ki8KKysKKysvKiBVbnNpZ25lZCA2NC1iaXQgdHlwZSAqLworKy8qI2RlZmluZSBUSUZGX1VJTlQ2NF9UIHVuc2lnbmVkIF9faW50NjQqLworKworKy8qIERlZmluZSB0byBgX19pbmxpbmVfXycgb3IgYF9faW5saW5lJyBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlcgorKyAgIGNhbGxzIGl0LCBvciB0byBub3RoaW5nIGlmICdpbmxpbmUnIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgYW55IG5hbWUuICAqLworKyNpZm5kZWYgX19jcGx1c3BsdXMKKysjIGlmbmRlZiBpbmxpbmUKKysjICBkZWZpbmUgaW5saW5lIF9faW5saW5lCisrIyBlbmRpZgorKyNlbmRpZgorKworKyNkZWZpbmUgbGZpbmQgX2xmaW5kCisrCisrI2RlZmluZSBCU0RUWVBFUworKworKy8qIFNldCB0aGUgbmF0aXZlIGNwdSBiaXQgb3JkZXIgKEZJTExPUkRFUl9MU0IyTVNCIG9yIEZJTExPUkRFUl9NU0IyTFNCKSAqLworKyNkZWZpbmUgSE9TVF9GSUxMT1JERVIgRklMTE9SREVSX0xTQjJNU0IKKysKKysvKiBOYXRpdmUgY3B1IGJ5dGUgb3JkZXI6IDEgaWYgYmlnLWVuZGlhbiAoTW90b3JvbGEpIG9yIDAgaWYgbGl0dGxlLWVuZGlhbgorKyAgIChJbnRlbCkgKi8KKysjaWYgX0ZYX0VORElBTl8gPT0gX0ZYX0JJR19FTkRJQU5fCisrIyBkZWZpbmUgSE9TVF9CSUdFTkRJQU4gMQorKyNlbHNlCisrIyBkZWZpbmUgSE9TVF9CSUdFTkRJQU4gMAorKyNlbmRpZgorKworKy8qIFN1cHBvcnQgQ0NJVFQgR3JvdXAgMyAmIDQgYWxnb3JpdGhtcyAqLworKyNkZWZpbmUgQ0NJVFRfU1VQUE9SVCAxCisrCisrLyogU3VwcG9ydCBKUEVHIGNvbXByZXNzaW9uIChyZXF1aXJlcyBJSkcgSlBFRyBsaWJyYXJ5KSAqLworKyNkZWZpbmUgSlBFR19TVVBQT1JUIDEKKysKKysvKiBTdXBwb3J0IExvZ0x1diBoaWdoIGR5bmFtaWMgcmFuZ2UgZW5jb2RpbmcgKi8KKysjZGVmaW5lIExPR0xVVl9TVVBQT1JUIDEKKysKKysvKiBTdXBwb3J0IExaVyBhbGdvcml0aG0gKi8KKysjZGVmaW5lIExaV19TVVBQT1JUIDEKKysKKysvKiBTdXBwb3J0IE5lWFQgMi1iaXQgUkxFIGFsZ29yaXRobSAqLworKyNkZWZpbmUgTkVYVF9TVVBQT1JUIDEKKysKKysvKiBTdXBwb3J0IE9sZCBKUEVHIGNvbXByZXNzb24gKHJlYWQgY29udHJpYi9vanBlZy9SRUFETUUgZmlyc3QhIENvbXBpbGF0aW9uCisrICAgZmFpbHMgd2l0aCB1bnBhdGNoZWQgSUpHIEpQRUcgbGlicmFyeSkgKi8KKysjZGVmaW5lICBPSlBFR19TVVBQT1JUCTEKKysKKysvKiBTdXBwb3J0IE1hY2ludG9zaCBQYWNrQml0cyBhbGdvcml0aG0gKi8KKysjZGVmaW5lIFBBQ0tCSVRTX1NVUFBPUlQgMQorKworKy8qIFN1cHBvcnQgUGl4YXIgbG9nLWZvcm1hdCBhbGdvcml0aG0gKHJlcXVpcmVzIFpsaWIpICovCisrI2RlZmluZSBQSVhBUkxPR19TVVBQT1JUIDEKKysKKysvKiBTdXBwb3J0IFRodW5kZXJTY2FuIDQtYml0IFJMRSBhbGdvcml0aG0gKi8KKysjZGVmaW5lIFRIVU5ERVJfU1VQUE9SVCAxCisrCisrLyogU3VwcG9ydCBEZWZsYXRlIGNvbXByZXNzaW9uICovCisrI2RlZmluZSBaSVBfU1VQUE9SVCAxCisrCisrLyogU3VwcG9ydCBzdHJpcCBjaG9wcGluZyAod2hldGhlciBvciBub3QgdG8gY29udmVydCBzaW5nbGUtc3RyaXAgdW5jb21wcmVzc2VkCisrICAgaW1hZ2VzIHRvIG11dGlwbGUgc3RyaXBzIG9mIH44S2IgdG8gcmVkdWNlIG1lbW9yeSB1c2FnZSkgKi8KKysjZGVmaW5lIFNUUklQQ0hPUF9ERUZBVUxUIFRJRkZfU1RSSVBDSE9QCisrCisrLyogRW5hYmxlIFN1YklGRCB0YWcgKDMzMCkgc3VwcG9ydCAqLworKyNkZWZpbmUgU1VCSUZEX1NVUFBPUlQgMQorKworKy8qIFRyZWF0IGV4dHJhIHNhbXBsZSBhcyBhbHBoYSAoZGVmYXVsdCBlbmFibGVkKS4gVGhlIFJHQkEgaW50ZXJmYWNlIHdpbGwKKysgICB0cmVhdCBhIGZvdXJ0aCBzYW1wbGUgd2l0aCBubyBFWFRSQVNBTVBMRV8gdmFsdWUgYXMgYmVpbmcgQVNTT0NBTFBIQS4gTWFueQorKyAgIHBhY2thZ2VzIHByb2R1Y2UgUkdCQSBmaWxlcyBidXQgZG9uJ3QgbWFyayB0aGUgYWxwaGEgcHJvcGVybHkuICovCisrI2RlZmluZSBERUZBVUxUX0VYVFJBU0FNUExFX0FTX0FMUEhBIDEKKysKKysvKiBQaWNrIHVwIFlDYkNyIHN1YnNhbXBsaW5nIGluZm8gZnJvbSB0aGUgSlBFRyBkYXRhIHN0cmVhbSB0byBzdXBwb3J0IGZpbGVzCisrICAgbGFja2luZyB0aGUgdGFnIChkZWZhdWx0IGVuYWJsZWQpLiAqLworKyNkZWZpbmUgQ0hFQ0tfSlBFR19ZQ0JDUl9TVUJTQU1QTElORyAxCisrCisrLyogU3VwcG9ydCBNUyBNREkgbWFnaWMgbnVtYmVyIGZpbGVzIGFzIFRJRkYgKi8KKysjZGVmaW5lIE1ESV9TVVBQT1JUIDEKKysKKysvKgorKyAqIEZlYXR1cmUgc3VwcG9ydCBkZWZpbml0aW9ucy4KKysgKiBYWFg6IFRoZXNlIG1hY3JvcyBhcmUgb2Jzb2xldGVkLiBEb24ndCB1c2UgdGhlbSBpbiB5b3VyIGFwcHMhCisrICogTWFjcm9zIHN0YXlzIGhlcmUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYW5kIHNob3VsZCBiZSBhbHdheXMgZGVmaW5lZC4KKysgKi8KKysjZGVmaW5lIENPTE9SSU1FVFJZX1NVUFBPUlQKKysjZGVmaW5lIFlDQkNSX1NVUFBPUlQKKysjZGVmaW5lIENNWUtfU1VQUE9SVAorKyNkZWZpbmUgSUNDX1NVUFBPUlQKKysjZGVmaW5lIFBIT1RPU0hPUF9TVVBQT1JUCisrI2RlZmluZSBJUFRDX1NVUFBPUlQKKysKKysjZW5kaWYgLyogX1RJRkZDT05GXyAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi9SRUFETUUucGRmaXVtIGIvdGhpcmRfcGFydHkvbGlidGlmZi9SRUFETUUucGRmaXVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZTQ3MjkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL1JFQURNRS5wZGZpdW0KQEAgLTAsMCArMSwxMiBAQAorTmFtZTogTGliVElGRgorVVJMOiBodHRwOi8vd3d3LnJlbW90ZXNlbnNpbmcub3JnL2xpYnRpZmYvCitWZXJzaW9uOiA0LjAuNgorU2VjdXJpdHkgQ3JpdGljYWw6IHllcworTGljZW5zZTogQlNECisKK0Rlc2NyaXB0aW9uOgorVElGRiBsaWJyYXJ5LgorCitMb2NhbCBNb2RpZmljYXRpb25zOgorCiswMDAwLWJ1aWxkLWNvbmZpZy5wYXRjaDogTG9jYWwgYnVpbGQgY29uZmlndXJhdGlvbiBjaGFuZ2VzLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90NC5oIGIvdGhpcmRfcGFydHkvbGlidGlmZi90NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MDhmNTQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3Q0LmgKQEAgLTAsMCArMSwyOTIgQEAKKy8qICRJZDogdDQuaCx2IDEuMyAyMDEwLTAzLTEwIDE4OjU2OjQ4IGJmcmllc2VuIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgKiB0aGF0IChpKSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisgKiBhbGwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uLCBhbmQgKGlpKSB0aGUgbmFtZXMgb2YKKyAqIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzIG1heSBub3QgYmUgdXNlZCBpbiBhbnkgYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCB0aGUgc3BlY2lmaWMsIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24gb2YgU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZCisgKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgU0FNIExFRkZMRVIgT1IgU0lMSUNPTiBHUkFQSElDUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELAorICogT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorICogV0hFVEhFUiBPUiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRQorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9UNF8KKyNkZWZpbmUJX1Q0XworLyoKKyAqIENDSVRUIFQuNCAxRCBIdWZmbWFuIHJ1bmxlbmd0aCBjb2RlcyBhbmQKKyAqIHJlbGF0ZWQgZGVmaW5pdGlvbnMuICBHaXZlbiB0aGUgc21hbGwgc2l6ZXMKKyAqIG9mIHRoZXNlIHRhYmxlcyBpdCBkb2VzIG5vdCBzZWVtCisgKiB3b3J0aHdoaWxlIHRvIG1ha2UgY29kZSAmIGxlbmd0aCA4IGJpdHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHRhYmxlZW50cnkgeworICAgIHVuc2lnbmVkIHNob3J0IGxlbmd0aDsgIC8qIGJpdCBsZW5ndGggb2YgZzMgY29kZSAqLworICAgIHVuc2lnbmVkIHNob3J0IGNvZGU7ICAgIC8qIGczIGNvZGUgKi8KKyAgICBzaG9ydCBydW5sZW47ICAgICAgICAgICAvKiBydW4gbGVuZ3RoIGluIGJpdHMgKi8KK30gdGFibGVlbnRyeTsKKworI2RlZmluZSBFT0wJMHgwMDEJLyogRU9MIGNvZGUgdmFsdWUgLSAwMDAwIDAwMDAgMDAwMCAxICovCisKKy8qIHN0YXR1cyB2YWx1ZXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhIHJ1biBsZW5ndGggKi8KKyNkZWZpbmUgRzNDT0RFX0VPTAktMQkvKiBOQjogQUNUX0VPTCAtIEFDVF9XUlVOVCAqLworI2RlZmluZSBHM0NPREVfSU5WQUxJRAktMgkvKiBOQjogQUNUX0lOVkFMSUQgLSBBQ1RfV1JVTlQgKi8KKyNkZWZpbmUgRzNDT0RFX0VPRgktMwkvKiBlbmQgb2YgaW5wdXQgZGF0YSAqLworI2RlZmluZSBHM0NPREVfSU5DT01QCS00CS8qIGluY29tcGxldGUgcnVuIGNvZGUgKi8KKworLyoKKyAqIE5vdGUgdGhhdCB0aGVzZSB0YWJsZXMgYXJlIG9yZGVyZWQgc3VjaCB0aGF0IHRoZQorICogaW5kZXggaW50byB0aGUgdGFibGUgaXMga25vd24gdG8gYmUgZWl0aGVyIHRoZQorICogcnVuIGxlbmd0aCwgb3IgKHJ1biBsZW5ndGggLyA2NCkgKyBhIGZpeGVkIG9mZnNldC4KKyAqCisgKiBOQjogVGhlIEczQ09ERV9JTlZBTElEIGVudHJpZXMgYXJlIG9ubHkgdXNlZAorICogICAgIGR1cmluZyBzdGF0ZSBnZW5lcmF0aW9uIChzZWUgbWtnM3N0YXRlcy5jKS4KKyAqLworI2lmZGVmIEczQ09ERVMKK2NvbnN0IHRhYmxlZW50cnkgVElGRkZheFdoaXRlQ29kZXNbXSA9IHsKKyAgICB7IDgsIDB4MzUsIDAgfSwJLyogMDAxMSAwMTAxICovCisgICAgeyA2LCAweDcsIDEgfSwJLyogMDAwMSAxMSAqLworICAgIHsgNCwgMHg3LCAyIH0sCS8qIDAxMTEgKi8KKyAgICB7IDQsIDB4OCwgMyB9LAkvKiAxMDAwICovCisgICAgeyA0LCAweEIsIDQgfSwJLyogMTAxMSAqLworICAgIHsgNCwgMHhDLCA1IH0sCS8qIDExMDAgKi8KKyAgICB7IDQsIDB4RSwgNiB9LAkvKiAxMTEwICovCisgICAgeyA0LCAweEYsIDcgfSwJLyogMTExMSAqLworICAgIHsgNSwgMHgxMywgOCB9LAkvKiAxMDAxIDEgKi8KKyAgICB7IDUsIDB4MTQsIDkgfSwJLyogMTAxMCAwICovCisgICAgeyA1LCAweDcsIDEwIH0sCS8qIDAwMTEgMSAqLworICAgIHsgNSwgMHg4LCAxMSB9LAkvKiAwMTAwIDAgKi8KKyAgICB7IDYsIDB4OCwgMTIgfSwJLyogMDAxMCAwMCAqLworICAgIHsgNiwgMHgzLCAxMyB9LAkvKiAwMDAwIDExICovCisgICAgeyA2LCAweDM0LCAxNCB9LAkvKiAxMTAxIDAwICovCisgICAgeyA2LCAweDM1LCAxNSB9LAkvKiAxMTAxIDAxICovCisgICAgeyA2LCAweDJBLCAxNiB9LAkvKiAxMDEwIDEwICovCisgICAgeyA2LCAweDJCLCAxNyB9LAkvKiAxMDEwIDExICovCisgICAgeyA3LCAweDI3LCAxOCB9LAkvKiAwMTAwIDExMSAqLworICAgIHsgNywgMHhDLCAxOSB9LAkvKiAwMDAxIDEwMCAqLworICAgIHsgNywgMHg4LCAyMCB9LAkvKiAwMDAxIDAwMCAqLworICAgIHsgNywgMHgxNywgMjEgfSwJLyogMDAxMCAxMTEgKi8KKyAgICB7IDcsIDB4MywgMjIgfSwJLyogMDAwMCAwMTEgKi8KKyAgICB7IDcsIDB4NCwgMjMgfSwJLyogMDAwMCAxMDAgKi8KKyAgICB7IDcsIDB4MjgsIDI0IH0sCS8qIDAxMDEgMDAwICovCisgICAgeyA3LCAweDJCLCAyNSB9LAkvKiAwMTAxIDAxMSAqLworICAgIHsgNywgMHgxMywgMjYgfSwJLyogMDAxMCAwMTEgKi8KKyAgICB7IDcsIDB4MjQsIDI3IH0sCS8qIDAxMDAgMTAwICovCisgICAgeyA3LCAweDE4LCAyOCB9LAkvKiAwMDExIDAwMCAqLworICAgIHsgOCwgMHgyLCAyOSB9LAkvKiAwMDAwIDAwMTAgKi8KKyAgICB7IDgsIDB4MywgMzAgfSwJLyogMDAwMCAwMDExICovCisgICAgeyA4LCAweDFBLCAzMSB9LAkvKiAwMDAxIDEwMTAgKi8KKyAgICB7IDgsIDB4MUIsIDMyIH0sCS8qIDAwMDEgMTAxMSAqLworICAgIHsgOCwgMHgxMiwgMzMgfSwJLyogMDAwMSAwMDEwICovCisgICAgeyA4LCAweDEzLCAzNCB9LAkvKiAwMDAxIDAwMTEgKi8KKyAgICB7IDgsIDB4MTQsIDM1IH0sCS8qIDAwMDEgMDEwMCAqLworICAgIHsgOCwgMHgxNSwgMzYgfSwJLyogMDAwMSAwMTAxICovCisgICAgeyA4LCAweDE2LCAzNyB9LAkvKiAwMDAxIDAxMTAgKi8KKyAgICB7IDgsIDB4MTcsIDM4IH0sCS8qIDAwMDEgMDExMSAqLworICAgIHsgOCwgMHgyOCwgMzkgfSwJLyogMDAxMCAxMDAwICovCisgICAgeyA4LCAweDI5LCA0MCB9LAkvKiAwMDEwIDEwMDEgKi8KKyAgICB7IDgsIDB4MkEsIDQxIH0sCS8qIDAwMTAgMTAxMCAqLworICAgIHsgOCwgMHgyQiwgNDIgfSwJLyogMDAxMCAxMDExICovCisgICAgeyA4LCAweDJDLCA0MyB9LAkvKiAwMDEwIDExMDAgKi8KKyAgICB7IDgsIDB4MkQsIDQ0IH0sCS8qIDAwMTAgMTEwMSAqLworICAgIHsgOCwgMHg0LCA0NSB9LAkvKiAwMDAwIDAxMDAgKi8KKyAgICB7IDgsIDB4NSwgNDYgfSwJLyogMDAwMCAwMTAxICovCisgICAgeyA4LCAweEEsIDQ3IH0sCS8qIDAwMDAgMTAxMCAqLworICAgIHsgOCwgMHhCLCA0OCB9LAkvKiAwMDAwIDEwMTEgKi8KKyAgICB7IDgsIDB4NTIsIDQ5IH0sCS8qIDAxMDEgMDAxMCAqLworICAgIHsgOCwgMHg1MywgNTAgfSwJLyogMDEwMSAwMDExICovCisgICAgeyA4LCAweDU0LCA1MSB9LAkvKiAwMTAxIDAxMDAgKi8KKyAgICB7IDgsIDB4NTUsIDUyIH0sCS8qIDAxMDEgMDEwMSAqLworICAgIHsgOCwgMHgyNCwgNTMgfSwJLyogMDAxMCAwMTAwICovCisgICAgeyA4LCAweDI1LCA1NCB9LAkvKiAwMDEwIDAxMDEgKi8KKyAgICB7IDgsIDB4NTgsIDU1IH0sCS8qIDAxMDEgMTAwMCAqLworICAgIHsgOCwgMHg1OSwgNTYgfSwJLyogMDEwMSAxMDAxICovCisgICAgeyA4LCAweDVBLCA1NyB9LAkvKiAwMTAxIDEwMTAgKi8KKyAgICB7IDgsIDB4NUIsIDU4IH0sCS8qIDAxMDEgMTAxMSAqLworICAgIHsgOCwgMHg0QSwgNTkgfSwJLyogMDEwMCAxMDEwICovCisgICAgeyA4LCAweDRCLCA2MCB9LAkvKiAwMTAwIDEwMTEgKi8KKyAgICB7IDgsIDB4MzIsIDYxIH0sCS8qIDAwMTEgMDAxMCAqLworICAgIHsgOCwgMHgzMywgNjIgfSwJLyogMDAxMSAwMDExICovCisgICAgeyA4LCAweDM0LCA2MyB9LAkvKiAwMDExIDAxMDAgKi8KKyAgICB7IDUsIDB4MUIsIDY0IH0sCS8qIDExMDEgMSAqLworICAgIHsgNSwgMHgxMiwgMTI4IH0sCS8qIDEwMDEgMCAqLworICAgIHsgNiwgMHgxNywgMTkyIH0sCS8qIDAxMDEgMTEgKi8KKyAgICB7IDcsIDB4MzcsIDI1NiB9LAkvKiAwMTEwIDExMSAqLworICAgIHsgOCwgMHgzNiwgMzIwIH0sCS8qIDAwMTEgMDExMCAqLworICAgIHsgOCwgMHgzNywgMzg0IH0sCS8qIDAwMTEgMDExMSAqLworICAgIHsgOCwgMHg2NCwgNDQ4IH0sCS8qIDAxMTAgMDEwMCAqLworICAgIHsgOCwgMHg2NSwgNTEyIH0sCS8qIDAxMTAgMDEwMSAqLworICAgIHsgOCwgMHg2OCwgNTc2IH0sCS8qIDAxMTAgMTAwMCAqLworICAgIHsgOCwgMHg2NywgNjQwIH0sCS8qIDAxMTAgMDExMSAqLworICAgIHsgOSwgMHhDQywgNzA0IH0sCS8qIDAxMTAgMDExMCAwICovCisgICAgeyA5LCAweENELCA3NjggfSwJLyogMDExMCAwMTEwIDEgKi8KKyAgICB7IDksIDB4RDIsIDgzMiB9LAkvKiAwMTEwIDEwMDEgMCAqLworICAgIHsgOSwgMHhEMywgODk2IH0sCS8qIDAxMTAgMTAwMSAxICovCisgICAgeyA5LCAweEQ0LCA5NjAgfSwJLyogMDExMCAxMDEwIDAgKi8KKyAgICB7IDksIDB4RDUsIDEwMjQgfSwJLyogMDExMCAxMDEwIDEgKi8KKyAgICB7IDksIDB4RDYsIDEwODggfSwJLyogMDExMCAxMDExIDAgKi8KKyAgICB7IDksIDB4RDcsIDExNTIgfSwJLyogMDExMCAxMDExIDEgKi8KKyAgICB7IDksIDB4RDgsIDEyMTYgfSwJLyogMDExMCAxMTAwIDAgKi8KKyAgICB7IDksIDB4RDksIDEyODAgfSwJLyogMDExMCAxMTAwIDEgKi8KKyAgICB7IDksIDB4REEsIDEzNDQgfSwJLyogMDExMCAxMTAxIDAgKi8KKyAgICB7IDksIDB4REIsIDE0MDggfSwJLyogMDExMCAxMTAxIDEgKi8KKyAgICB7IDksIDB4OTgsIDE0NzIgfSwJLyogMDEwMCAxMTAwIDAgKi8KKyAgICB7IDksIDB4OTksIDE1MzYgfSwJLyogMDEwMCAxMTAwIDEgKi8KKyAgICB7IDksIDB4OUEsIDE2MDAgfSwJLyogMDEwMCAxMTAxIDAgKi8KKyAgICB7IDYsIDB4MTgsIDE2NjQgfSwJLyogMDExMCAwMCAqLworICAgIHsgOSwgMHg5QiwgMTcyOCB9LAkvKiAwMTAwIDExMDEgMSAqLworICAgIHsgMTEsIDB4OCwgMTc5MiB9LAkvKiAwMDAwIDAwMDEgMDAwICovCisgICAgeyAxMSwgMHhDLCAxODU2IH0sCS8qIDAwMDAgMDAwMSAxMDAgKi8KKyAgICB7IDExLCAweEQsIDE5MjAgfSwJLyogMDAwMCAwMDAxIDEwMSAqLworICAgIHsgMTIsIDB4MTIsIDE5ODQgfSwJLyogMDAwMCAwMDAxIDAwMTAgKi8KKyAgICB7IDEyLCAweDEzLCAyMDQ4IH0sCS8qIDAwMDAgMDAwMSAwMDExICovCisgICAgeyAxMiwgMHgxNCwgMjExMiB9LAkvKiAwMDAwIDAwMDEgMDEwMCAqLworICAgIHsgMTIsIDB4MTUsIDIxNzYgfSwJLyogMDAwMCAwMDAxIDAxMDEgKi8KKyAgICB7IDEyLCAweDE2LCAyMjQwIH0sCS8qIDAwMDAgMDAwMSAwMTEwICovCisgICAgeyAxMiwgMHgxNywgMjMwNCB9LAkvKiAwMDAwIDAwMDEgMDExMSAqLworICAgIHsgMTIsIDB4MUMsIDIzNjggfSwJLyogMDAwMCAwMDAxIDExMDAgKi8KKyAgICB7IDEyLCAweDFELCAyNDMyIH0sCS8qIDAwMDAgMDAwMSAxMTAxICovCisgICAgeyAxMiwgMHgxRSwgMjQ5NiB9LAkvKiAwMDAwIDAwMDEgMTExMCAqLworICAgIHsgMTIsIDB4MUYsIDI1NjAgfSwJLyogMDAwMCAwMDAxIDExMTEgKi8KKyAgICB7IDEyLCAweDEsIEczQ09ERV9FT0wgfSwJLyogMDAwMCAwMDAwIDAwMDEgKi8KKyAgICB7IDksIDB4MSwgRzNDT0RFX0lOVkFMSUQgfSwJLyogMDAwMCAwMDAwIDEgKi8KKyAgICB7IDEwLCAweDEsIEczQ09ERV9JTlZBTElEIH0sCS8qIDAwMDAgMDAwMCAwMSAqLworICAgIHsgMTEsIDB4MSwgRzNDT0RFX0lOVkFMSUQgfSwJLyogMDAwMCAwMDAwIDAwMSAqLworICAgIHsgMTIsIDB4MCwgRzNDT0RFX0lOVkFMSUQgfSwJLyogMDAwMCAwMDAwIDAwMDAgKi8KK307CisKK2NvbnN0IHRhYmxlZW50cnkgVElGRkZheEJsYWNrQ29kZXNbXSA9IHsKKyAgICB7IDEwLCAweDM3LCAwIH0sCS8qIDAwMDAgMTEwMSAxMSAqLworICAgIHsgMywgMHgyLCAxIH0sCS8qIDAxMCAqLworICAgIHsgMiwgMHgzLCAyIH0sCS8qIDExICovCisgICAgeyAyLCAweDIsIDMgfSwJLyogMTAgKi8KKyAgICB7IDMsIDB4MywgNCB9LAkvKiAwMTEgKi8KKyAgICB7IDQsIDB4MywgNSB9LAkvKiAwMDExICovCisgICAgeyA0LCAweDIsIDYgfSwJLyogMDAxMCAqLworICAgIHsgNSwgMHgzLCA3IH0sCS8qIDAwMDEgMSAqLworICAgIHsgNiwgMHg1LCA4IH0sCS8qIDAwMDEgMDEgKi8KKyAgICB7IDYsIDB4NCwgOSB9LAkvKiAwMDAxIDAwICovCisgICAgeyA3LCAweDQsIDEwIH0sCS8qIDAwMDAgMTAwICovCisgICAgeyA3LCAweDUsIDExIH0sCS8qIDAwMDAgMTAxICovCisgICAgeyA3LCAweDcsIDEyIH0sCS8qIDAwMDAgMTExICovCisgICAgeyA4LCAweDQsIDEzIH0sCS8qIDAwMDAgMDEwMCAqLworICAgIHsgOCwgMHg3LCAxNCB9LAkvKiAwMDAwIDAxMTEgKi8KKyAgICB7IDksIDB4MTgsIDE1IH0sCS8qIDAwMDAgMTEwMCAwICovCisgICAgeyAxMCwgMHgxNywgMTYgfSwJLyogMDAwMCAwMTAxIDExICovCisgICAgeyAxMCwgMHgxOCwgMTcgfSwJLyogMDAwMCAwMTEwIDAwICovCisgICAgeyAxMCwgMHg4LCAxOCB9LAkvKiAwMDAwIDAwMTAgMDAgKi8KKyAgICB7IDExLCAweDY3LCAxOSB9LAkvKiAwMDAwIDExMDAgMTExICovCisgICAgeyAxMSwgMHg2OCwgMjAgfSwJLyogMDAwMCAxMTAxIDAwMCAqLworICAgIHsgMTEsIDB4NkMsIDIxIH0sCS8qIDAwMDAgMTEwMSAxMDAgKi8KKyAgICB7IDExLCAweDM3LCAyMiB9LAkvKiAwMDAwIDAxMTAgMTExICovCisgICAgeyAxMSwgMHgyOCwgMjMgfSwJLyogMDAwMCAwMTAxIDAwMCAqLworICAgIHsgMTEsIDB4MTcsIDI0IH0sCS8qIDAwMDAgMDAxMCAxMTEgKi8KKyAgICB7IDExLCAweDE4LCAyNSB9LAkvKiAwMDAwIDAwMTEgMDAwICovCisgICAgeyAxMiwgMHhDQSwgMjYgfSwJLyogMDAwMCAxMTAwIDEwMTAgKi8KKyAgICB7IDEyLCAweENCLCAyNyB9LAkvKiAwMDAwIDExMDAgMTAxMSAqLworICAgIHsgMTIsIDB4Q0MsIDI4IH0sCS8qIDAwMDAgMTEwMCAxMTAwICovCisgICAgeyAxMiwgMHhDRCwgMjkgfSwJLyogMDAwMCAxMTAwIDExMDEgKi8KKyAgICB7IDEyLCAweDY4LCAzMCB9LAkvKiAwMDAwIDAxMTAgMTAwMCAqLworICAgIHsgMTIsIDB4NjksIDMxIH0sCS8qIDAwMDAgMDExMCAxMDAxICovCisgICAgeyAxMiwgMHg2QSwgMzIgfSwJLyogMDAwMCAwMTEwIDEwMTAgKi8KKyAgICB7IDEyLCAweDZCLCAzMyB9LAkvKiAwMDAwIDAxMTAgMTAxMSAqLworICAgIHsgMTIsIDB4RDIsIDM0IH0sCS8qIDAwMDAgMTEwMSAwMDEwICovCisgICAgeyAxMiwgMHhEMywgMzUgfSwJLyogMDAwMCAxMTAxIDAwMTEgKi8KKyAgICB7IDEyLCAweEQ0LCAzNiB9LAkvKiAwMDAwIDExMDEgMDEwMCAqLworICAgIHsgMTIsIDB4RDUsIDM3IH0sCS8qIDAwMDAgMTEwMSAwMTAxICovCisgICAgeyAxMiwgMHhENiwgMzggfSwJLyogMDAwMCAxMTAxIDAxMTAgKi8KKyAgICB7IDEyLCAweEQ3LCAzOSB9LAkvKiAwMDAwIDExMDEgMDExMSAqLworICAgIHsgMTIsIDB4NkMsIDQwIH0sCS8qIDAwMDAgMDExMCAxMTAwICovCisgICAgeyAxMiwgMHg2RCwgNDEgfSwJLyogMDAwMCAwMTEwIDExMDEgKi8KKyAgICB7IDEyLCAweERBLCA0MiB9LAkvKiAwMDAwIDExMDEgMTAxMCAqLworICAgIHsgMTIsIDB4REIsIDQzIH0sCS8qIDAwMDAgMTEwMSAxMDExICovCisgICAgeyAxMiwgMHg1NCwgNDQgfSwJLyogMDAwMCAwMTAxIDAxMDAgKi8KKyAgICB7IDEyLCAweDU1LCA0NSB9LAkvKiAwMDAwIDAxMDEgMDEwMSAqLworICAgIHsgMTIsIDB4NTYsIDQ2IH0sCS8qIDAwMDAgMDEwMSAwMTEwICovCisgICAgeyAxMiwgMHg1NywgNDcgfSwJLyogMDAwMCAwMTAxIDAxMTEgKi8KKyAgICB7IDEyLCAweDY0LCA0OCB9LAkvKiAwMDAwIDAxMTAgMDEwMCAqLworICAgIHsgMTIsIDB4NjUsIDQ5IH0sCS8qIDAwMDAgMDExMCAwMTAxICovCisgICAgeyAxMiwgMHg1MiwgNTAgfSwJLyogMDAwMCAwMTAxIDAwMTAgKi8KKyAgICB7IDEyLCAweDUzLCA1MSB9LAkvKiAwMDAwIDAxMDEgMDAxMSAqLworICAgIHsgMTIsIDB4MjQsIDUyIH0sCS8qIDAwMDAgMDAxMCAwMTAwICovCisgICAgeyAxMiwgMHgzNywgNTMgfSwJLyogMDAwMCAwMDExIDAxMTEgKi8KKyAgICB7IDEyLCAweDM4LCA1NCB9LAkvKiAwMDAwIDAwMTEgMTAwMCAqLworICAgIHsgMTIsIDB4MjcsIDU1IH0sCS8qIDAwMDAgMDAxMCAwMTExICovCisgICAgeyAxMiwgMHgyOCwgNTYgfSwJLyogMDAwMCAwMDEwIDEwMDAgKi8KKyAgICB7IDEyLCAweDU4LCA1NyB9LAkvKiAwMDAwIDAxMDEgMTAwMCAqLworICAgIHsgMTIsIDB4NTksIDU4IH0sCS8qIDAwMDAgMDEwMSAxMDAxICovCisgICAgeyAxMiwgMHgyQiwgNTkgfSwJLyogMDAwMCAwMDEwIDEwMTEgKi8KKyAgICB7IDEyLCAweDJDLCA2MCB9LAkvKiAwMDAwIDAwMTAgMTEwMCAqLworICAgIHsgMTIsIDB4NUEsIDYxIH0sCS8qIDAwMDAgMDEwMSAxMDEwICovCisgICAgeyAxMiwgMHg2NiwgNjIgfSwJLyogMDAwMCAwMTEwIDAxMTAgKi8KKyAgICB7IDEyLCAweDY3LCA2MyB9LAkvKiAwMDAwIDAxMTAgMDExMSAqLworICAgIHsgMTAsIDB4RiwgNjQgfSwJLyogMDAwMCAwMDExIDExICovCisgICAgeyAxMiwgMHhDOCwgMTI4IH0sCS8qIDAwMDAgMTEwMCAxMDAwICovCisgICAgeyAxMiwgMHhDOSwgMTkyIH0sCS8qIDAwMDAgMTEwMCAxMDAxICovCisgICAgeyAxMiwgMHg1QiwgMjU2IH0sCS8qIDAwMDAgMDEwMSAxMDExICovCisgICAgeyAxMiwgMHgzMywgMzIwIH0sCS8qIDAwMDAgMDAxMSAwMDExICovCisgICAgeyAxMiwgMHgzNCwgMzg0IH0sCS8qIDAwMDAgMDAxMSAwMTAwICovCisgICAgeyAxMiwgMHgzNSwgNDQ4IH0sCS8qIDAwMDAgMDAxMSAwMTAxICovCisgICAgeyAxMywgMHg2QywgNTEyIH0sCS8qIDAwMDAgMDAxMSAwMTEwIDAgKi8KKyAgICB7IDEzLCAweDZELCA1NzYgfSwJLyogMDAwMCAwMDExIDAxMTAgMSAqLworICAgIHsgMTMsIDB4NEEsIDY0MCB9LAkvKiAwMDAwIDAwMTAgMDEwMSAwICovCisgICAgeyAxMywgMHg0QiwgNzA0IH0sCS8qIDAwMDAgMDAxMCAwMTAxIDEgKi8KKyAgICB7IDEzLCAweDRDLCA3NjggfSwJLyogMDAwMCAwMDEwIDAxMTAgMCAqLworICAgIHsgMTMsIDB4NEQsIDgzMiB9LAkvKiAwMDAwIDAwMTAgMDExMCAxICovCisgICAgeyAxMywgMHg3MiwgODk2IH0sCS8qIDAwMDAgMDAxMSAxMDAxIDAgKi8KKyAgICB7IDEzLCAweDczLCA5NjAgfSwJLyogMDAwMCAwMDExIDEwMDEgMSAqLworICAgIHsgMTMsIDB4NzQsIDEwMjQgfSwJLyogMDAwMCAwMDExIDEwMTAgMCAqLworICAgIHsgMTMsIDB4NzUsIDEwODggfSwJLyogMDAwMCAwMDExIDEwMTAgMSAqLworICAgIHsgMTMsIDB4NzYsIDExNTIgfSwJLyogMDAwMCAwMDExIDEwMTEgMCAqLworICAgIHsgMTMsIDB4NzcsIDEyMTYgfSwJLyogMDAwMCAwMDExIDEwMTEgMSAqLworICAgIHsgMTMsIDB4NTIsIDEyODAgfSwJLyogMDAwMCAwMDEwIDEwMDEgMCAqLworICAgIHsgMTMsIDB4NTMsIDEzNDQgfSwJLyogMDAwMCAwMDEwIDEwMDEgMSAqLworICAgIHsgMTMsIDB4NTQsIDE0MDggfSwJLyogMDAwMCAwMDEwIDEwMTAgMCAqLworICAgIHsgMTMsIDB4NTUsIDE0NzIgfSwJLyogMDAwMCAwMDEwIDEwMTAgMSAqLworICAgIHsgMTMsIDB4NUEsIDE1MzYgfSwJLyogMDAwMCAwMDEwIDExMDEgMCAqLworICAgIHsgMTMsIDB4NUIsIDE2MDAgfSwJLyogMDAwMCAwMDEwIDExMDEgMSAqLworICAgIHsgMTMsIDB4NjQsIDE2NjQgfSwJLyogMDAwMCAwMDExIDAwMTAgMCAqLworICAgIHsgMTMsIDB4NjUsIDE3MjggfSwJLyogMDAwMCAwMDExIDAwMTAgMSAqLworICAgIHsgMTEsIDB4OCwgMTc5MiB9LAkvKiAwMDAwIDAwMDEgMDAwICovCisgICAgeyAxMSwgMHhDLCAxODU2IH0sCS8qIDAwMDAgMDAwMSAxMDAgKi8KKyAgICB7IDExLCAweEQsIDE5MjAgfSwJLyogMDAwMCAwMDAxIDEwMSAqLworICAgIHsgMTIsIDB4MTIsIDE5ODQgfSwJLyogMDAwMCAwMDAxIDAwMTAgKi8KKyAgICB7IDEyLCAweDEzLCAyMDQ4IH0sCS8qIDAwMDAgMDAwMSAwMDExICovCisgICAgeyAxMiwgMHgxNCwgMjExMiB9LAkvKiAwMDAwIDAwMDEgMDEwMCAqLworICAgIHsgMTIsIDB4MTUsIDIxNzYgfSwJLyogMDAwMCAwMDAxIDAxMDEgKi8KKyAgICB7IDEyLCAweDE2LCAyMjQwIH0sCS8qIDAwMDAgMDAwMSAwMTEwICovCisgICAgeyAxMiwgMHgxNywgMjMwNCB9LAkvKiAwMDAwIDAwMDEgMDExMSAqLworICAgIHsgMTIsIDB4MUMsIDIzNjggfSwJLyogMDAwMCAwMDAxIDExMDAgKi8KKyAgICB7IDEyLCAweDFELCAyNDMyIH0sCS8qIDAwMDAgMDAwMSAxMTAxICovCisgICAgeyAxMiwgMHgxRSwgMjQ5NiB9LAkvKiAwMDAwIDAwMDEgMTExMCAqLworICAgIHsgMTIsIDB4MUYsIDI1NjAgfSwJLyogMDAwMCAwMDAxIDExMTEgKi8KKyAgICB7IDEyLCAweDEsIEczQ09ERV9FT0wgfSwJLyogMDAwMCAwMDAwIDAwMDEgKi8KKyAgICB7IDksIDB4MSwgRzNDT0RFX0lOVkFMSUQgfSwJLyogMDAwMCAwMDAwIDEgKi8KKyAgICB7IDEwLCAweDEsIEczQ09ERV9JTlZBTElEIH0sCS8qIDAwMDAgMDAwMCAwMSAqLworICAgIHsgMTEsIDB4MSwgRzNDT0RFX0lOVkFMSUQgfSwJLyogMDAwMCAwMDAwIDAwMSAqLworICAgIHsgMTIsIDB4MCwgRzNDT0RFX0lOVkFMSUQgfSwJLyogMDAwMCAwMDAwIDAwMDAgKi8KK307CisjZWxzZQorZXh0ZXJuIGNvbnN0IHRhYmxlZW50cnkgVElGRkZheFdoaXRlQ29kZXNbXTsKK2V4dGVybiBjb25zdCB0YWJsZWVudHJ5IFRJRkZGYXhCbGFja0NvZGVzW107CisjZW5kaWYKKyNlbmRpZiAvKiBfVDRfICovCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9hdXguYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2F1eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNzE1MGEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9hdXguYwpAQCAtMCwwICsxLDM1OCBAQAorLyogJElkOiB0aWZfYXV4LmMsdiAxLjI2IDIwMTAtMDctMDEgMTU6MzM6MjggZHJvbiBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCAKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgorICogU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcy4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSAKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTQU0gTEVGRkxFUiBPUiBTSUxJQ09OIEdSQVBISUNTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgKiBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgKiBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GIAorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSAKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRJRkYgTGlicmFyeS4KKyAqCisgKiBBdXhpbGlhcnkgU3VwcG9ydCBSb3V0aW5lcy4KKyAqLworI2luY2x1ZGUgInRpZmZpb3AuaCIKKyNpbmNsdWRlICJ0aWZfcHJlZGljdC5oIgorI2luY2x1ZGUgPG1hdGguaD4KKwordWludDMyCitfVElGRk11bHRpcGx5MzIoVElGRiogdGlmLCB1aW50MzIgZmlyc3QsIHVpbnQzMiBzZWNvbmQsIGNvbnN0IGNoYXIqIHdoZXJlKQoreworCXVpbnQzMiBieXRlcyA9IGZpcnN0ICogc2Vjb25kOworCisJaWYgKHNlY29uZCAmJiBieXRlcyAvIHNlY29uZCAhPSBmaXJzdCkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgd2hlcmUsICJJbnRlZ2VyIG92ZXJmbG93IGluICVzIiwgd2hlcmUpOworCQlieXRlcyA9IDA7CisJfQorCisJcmV0dXJuIGJ5dGVzOworfQorCit1aW50NjQKK19USUZGTXVsdGlwbHk2NChUSUZGKiB0aWYsIHVpbnQ2NCBmaXJzdCwgdWludDY0IHNlY29uZCwgY29uc3QgY2hhciogd2hlcmUpCit7CisJdWludDY0IGJ5dGVzID0gZmlyc3QgKiBzZWNvbmQ7CisKKwlpZiAoc2Vjb25kICYmIGJ5dGVzIC8gc2Vjb25kICE9IGZpcnN0KSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCB3aGVyZSwgIkludGVnZXIgb3ZlcmZsb3cgaW4gJXMiLCB3aGVyZSk7CisJCWJ5dGVzID0gMDsKKwl9CisKKwlyZXR1cm4gYnl0ZXM7Cit9CisKK3ZvaWQqCitfVElGRkNoZWNrUmVhbGxvYyhUSUZGKiB0aWYsIHZvaWQqIGJ1ZmZlciwKKwkJICB0bXNpemVfdCBubWVtYiwgdG1zaXplX3QgZWxlbV9zaXplLCBjb25zdCBjaGFyKiB3aGF0KQoreworCXZvaWQqIGNwID0gTlVMTDsKKwl0bXNpemVfdCBieXRlcyA9IG5tZW1iICogZWxlbV9zaXplOworCisJLyoKKwkgKiBYWFg6IENoZWNrIGZvciBpbnRlZ2VyIG92ZXJmbG93LgorCSAqLworCWlmIChubWVtYiAmJiBlbGVtX3NpemUgJiYgYnl0ZXMgLyBlbGVtX3NpemUgPT0gbm1lbWIpCisJCWNwID0gX1RJRkZyZWFsbG9jKGJ1ZmZlciwgYnl0ZXMpOworCisJaWYgKGNwID09IE5VTEwpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIHRpZi0+dGlmX25hbWUsCisJCQkgICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciAlcyAiCisJCQkgICAgICIoJWxkIGVsZW1lbnRzIG9mICVsZCBieXRlcyBlYWNoKSIsCisJCQkgICAgIHdoYXQsKGxvbmcpIG5tZW1iLCAobG9uZykgZWxlbV9zaXplKTsKKwl9CisKKwlyZXR1cm4gY3A7Cit9CisKK3ZvaWQqCitfVElGRkNoZWNrTWFsbG9jKFRJRkYqIHRpZiwgdG1zaXplX3Qgbm1lbWIsIHRtc2l6ZV90IGVsZW1fc2l6ZSwgY29uc3QgY2hhciogd2hhdCkKK3sKKwlyZXR1cm4gX1RJRkZDaGVja1JlYWxsb2ModGlmLCBOVUxMLCBubWVtYiwgZWxlbV9zaXplLCB3aGF0KTsgIAorfQorCitzdGF0aWMgaW50CitUSUZGRGVmYXVsdFRyYW5zZmVyRnVuY3Rpb24oVElGRkRpcmVjdG9yeSogdGQpCit7CisJdWludDE2ICoqdGYgPSB0ZC0+dGRfdHJhbnNmZXJmdW5jdGlvbjsKKwl0bXNpemVfdCBpLCBuLCBuYnl0ZXM7CisKKwl0ZlswXSA9IHRmWzFdID0gdGZbMl0gPSAwOworCWlmICh0ZC0+dGRfYml0c3BlcnNhbXBsZSA+PSBzaXplb2YodG1zaXplX3QpICogOCAtIDIpCisJCXJldHVybiAwOworCisJbiA9ICgodG1zaXplX3QpMSk8PHRkLT50ZF9iaXRzcGVyc2FtcGxlOworCW5ieXRlcyA9IG4gKiBzaXplb2YgKHVpbnQxNik7CisJaWYgKCEodGZbMF0gPSAodWludDE2ICopX1RJRkZtYWxsb2MobmJ5dGVzKSkpCisJCXJldHVybiAwOworCXRmWzBdWzBdID0gMDsKKwlmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKSB7CisJCWRvdWJsZSB0ID0gKGRvdWJsZSlpLygoZG91YmxlKSBuLTEuKTsKKwkJdGZbMF1baV0gPSAodWludDE2KWZsb29yKDY1NTM1Lipwb3codCwgMi4yKSArIC41KTsKKwl9CisKKwlpZiAodGQtPnRkX3NhbXBsZXNwZXJwaXhlbCAtIHRkLT50ZF9leHRyYXNhbXBsZXMgPiAxKSB7CisJCWlmICghKHRmWzFdID0gKHVpbnQxNiAqKV9USUZGbWFsbG9jKG5ieXRlcykpKQorCQkJZ290byBiYWQ7CisJCV9USUZGbWVtY3B5KHRmWzFdLCB0ZlswXSwgbmJ5dGVzKTsKKwkJaWYgKCEodGZbMl0gPSAodWludDE2ICopX1RJRkZtYWxsb2MobmJ5dGVzKSkpCisJCQlnb3RvIGJhZDsKKwkJX1RJRkZtZW1jcHkodGZbMl0sIHRmWzBdLCBuYnl0ZXMpOworCX0KKwlyZXR1cm4gMTsKKworYmFkOgorCWlmICh0ZlswXSkKKwkJX1RJRkZmcmVlKHRmWzBdKTsKKwlpZiAodGZbMV0pCisJCV9USUZGZnJlZSh0ZlsxXSk7CisJaWYgKHRmWzJdKQorCQlfVElGRmZyZWUodGZbMl0pOworCXRmWzBdID0gdGZbMV0gPSB0ZlsyXSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZEZWZhdWx0UmVmQmxhY2tXaGl0ZShUSUZGRGlyZWN0b3J5KiB0ZCkKK3sKKwlpbnQgaTsKKworCWlmICghKHRkLT50ZF9yZWZibGFja3doaXRlID0gKGZsb2F0ICopX1RJRkZtYWxsb2MoNipzaXplb2YgKGZsb2F0KSkpKQorCQlyZXR1cm4gMDsKKyAgICAgICAgaWYgKHRkLT50ZF9waG90b21ldHJpYyA9PSBQSE9UT01FVFJJQ19ZQ0JDUikgeworCQkvKgorCQkgKiBZQ2JDciAoQ2xhc3MgWSkgaW1hZ2VzIG11c3QgaGF2ZSB0aGUgUmVmZXJlbmNlQmxhY2tXaGl0ZQorCQkgKiB0YWcgc2V0LiBGaXggdGhlIGJyb2tlbiBpbWFnZXMsIHdoaWNoIGxhY2tzIHRoYXQgdGFnLgorCQkgKi8KKwkJdGQtPnRkX3JlZmJsYWNrd2hpdGVbMF0gPSAwLjBGOworCQl0ZC0+dGRfcmVmYmxhY2t3aGl0ZVsxXSA9IHRkLT50ZF9yZWZibGFja3doaXRlWzNdID0KKwkJCXRkLT50ZF9yZWZibGFja3doaXRlWzVdID0gMjU1LjBGOworCQl0ZC0+dGRfcmVmYmxhY2t3aGl0ZVsyXSA9IHRkLT50ZF9yZWZibGFja3doaXRlWzRdID0gMTI4LjBGOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEFzc3VtZSBSR0IgKENsYXNzIFIpCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCSAgICB0ZC0+dGRfcmVmYmxhY2t3aGl0ZVsyKmkrMF0gPSAwOworCQkgICAgdGQtPnRkX3JlZmJsYWNrd2hpdGVbMippKzFdID0KKwkJCSAgICAoZmxvYXQpKCgxTDw8dGQtPnRkX2JpdHNwZXJzYW1wbGUpLTFMKTsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIExpa2UgVElGRkdldEZpZWxkLCBidXQgcmV0dXJuIGFueSBkZWZhdWx0CisgKiB2YWx1ZSBpZiB0aGUgdGFnIGlzIG5vdCBwcmVzZW50IGluIHRoZSBkaXJlY3RvcnkuCisgKgorICogTkI6CVdlIHVzZSB0aGUgdmFsdWUgaW4gdGhlIGRpcmVjdG9yeSwgcmF0aGVyIHRoYW4KKyAqCWV4cGxjaXQgdmFsdWVzIHNvIHRoYXQgZGVmYXVsdHMgZXhpc3Qgb25seSBvbmUKKyAqCXBsYWNlIGluIHRoZSBsaWJyYXJ5IC0tIGluIFRJRkZEZWZhdWx0RGlyZWN0b3J5LgorICovCitpbnQKK1RJRkZWR2V0RmllbGREZWZhdWx0ZWQoVElGRiogdGlmLCB1aW50MzIgdGFnLCB2YV9saXN0IGFwKQoreworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKworCWlmIChUSUZGVkdldEZpZWxkKHRpZiwgdGFnLCBhcCkpCisJCXJldHVybiAoMSk7CisJc3dpdGNoICh0YWcpIHsKKwljYXNlIFRJRkZUQUdfU1VCRklMRVRZUEU6CisJCSp2YV9hcmcoYXAsIHVpbnQzMiAqKSA9IHRkLT50ZF9zdWJmaWxldHlwZTsKKwkJcmV0dXJuICgxKTsKKwljYXNlIFRJRkZUQUdfQklUU1BFUlNBTVBMRToKKwkJKnZhX2FyZyhhcCwgdWludDE2ICopID0gdGQtPnRkX2JpdHNwZXJzYW1wbGU7CisJCXJldHVybiAoMSk7CisJY2FzZSBUSUZGVEFHX1RIUkVTSEhPTERJTkc6CisJCSp2YV9hcmcoYXAsIHVpbnQxNiAqKSA9IHRkLT50ZF90aHJlc2hob2xkaW5nOworCQlyZXR1cm4gKDEpOworCWNhc2UgVElGRlRBR19GSUxMT1JERVI6CisJCSp2YV9hcmcoYXAsIHVpbnQxNiAqKSA9IHRkLT50ZF9maWxsb3JkZXI7CisJCXJldHVybiAoMSk7CisJY2FzZSBUSUZGVEFHX09SSUVOVEFUSU9OOgorCQkqdmFfYXJnKGFwLCB1aW50MTYgKikgPSB0ZC0+dGRfb3JpZW50YXRpb247CisJCXJldHVybiAoMSk7CisJY2FzZSBUSUZGVEFHX1NBTVBMRVNQRVJQSVhFTDoKKwkJKnZhX2FyZyhhcCwgdWludDE2ICopID0gdGQtPnRkX3NhbXBsZXNwZXJwaXhlbDsKKwkJcmV0dXJuICgxKTsKKwljYXNlIFRJRkZUQUdfUk9XU1BFUlNUUklQOgorCQkqdmFfYXJnKGFwLCB1aW50MzIgKikgPSB0ZC0+dGRfcm93c3BlcnN0cmlwOworCQlyZXR1cm4gKDEpOworCWNhc2UgVElGRlRBR19NSU5TQU1QTEVWQUxVRToKKwkJKnZhX2FyZyhhcCwgdWludDE2ICopID0gdGQtPnRkX21pbnNhbXBsZXZhbHVlOworCQlyZXR1cm4gKDEpOworCWNhc2UgVElGRlRBR19NQVhTQU1QTEVWQUxVRToKKwkJKnZhX2FyZyhhcCwgdWludDE2ICopID0gdGQtPnRkX21heHNhbXBsZXZhbHVlOworCQlyZXR1cm4gKDEpOworCWNhc2UgVElGRlRBR19QTEFOQVJDT05GSUc6CisJCSp2YV9hcmcoYXAsIHVpbnQxNiAqKSA9IHRkLT50ZF9wbGFuYXJjb25maWc7CisJCXJldHVybiAoMSk7CisJY2FzZSBUSUZGVEFHX1JFU09MVVRJT05VTklUOgorCQkqdmFfYXJnKGFwLCB1aW50MTYgKikgPSB0ZC0+dGRfcmVzb2x1dGlvbnVuaXQ7CisJCXJldHVybiAoMSk7CisJY2FzZSBUSUZGVEFHX1BSRURJQ1RPUjoKKyAgICAgICAgICAgICAgICB7CisJCQlUSUZGUHJlZGljdG9yU3RhdGUqIHNwID0gKFRJRkZQcmVkaWN0b3JTdGF0ZSopIHRpZi0+dGlmX2RhdGE7CisJCQkqdmFfYXJnKGFwLCB1aW50MTYqKSA9ICh1aW50MTYpIHNwLT5wcmVkaWN0b3I7CisJCQlyZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisJY2FzZSBUSUZGVEFHX0RPVFJBTkdFOgorCQkqdmFfYXJnKGFwLCB1aW50MTYgKikgPSAwOworCQkqdmFfYXJnKGFwLCB1aW50MTYgKikgPSAoMTw8dGQtPnRkX2JpdHNwZXJzYW1wbGUpLTE7CisJCXJldHVybiAoMSk7CisJY2FzZSBUSUZGVEFHX0lOS1NFVDoKKwkJKnZhX2FyZyhhcCwgdWludDE2ICopID0gSU5LU0VUX0NNWUs7CisJCXJldHVybiAxOworCWNhc2UgVElGRlRBR19OVU1CRVJPRklOS1M6CisJCSp2YV9hcmcoYXAsIHVpbnQxNiAqKSA9IDQ7CisJCXJldHVybiAoMSk7CisJY2FzZSBUSUZGVEFHX0VYVFJBU0FNUExFUzoKKwkJKnZhX2FyZyhhcCwgdWludDE2ICopID0gdGQtPnRkX2V4dHJhc2FtcGxlczsKKwkJKnZhX2FyZyhhcCwgdWludDE2ICoqKSA9IHRkLT50ZF9zYW1wbGVpbmZvOworCQlyZXR1cm4gKDEpOworCWNhc2UgVElGRlRBR19NQVRURUlORzoKKwkJKnZhX2FyZyhhcCwgdWludDE2ICopID0KKwkJICAgICh0ZC0+dGRfZXh0cmFzYW1wbGVzID09IDEgJiYKKwkJICAgICB0ZC0+dGRfc2FtcGxlaW5mb1swXSA9PSBFWFRSQVNBTVBMRV9BU1NPQ0FMUEhBKTsKKwkJcmV0dXJuICgxKTsKKwljYXNlIFRJRkZUQUdfVElMRURFUFRIOgorCQkqdmFfYXJnKGFwLCB1aW50MzIgKikgPSB0ZC0+dGRfdGlsZWRlcHRoOworCQlyZXR1cm4gKDEpOworCWNhc2UgVElGRlRBR19EQVRBVFlQRToKKwkJKnZhX2FyZyhhcCwgdWludDE2ICopID0gdGQtPnRkX3NhbXBsZWZvcm1hdC0xOworCQlyZXR1cm4gKDEpOworCWNhc2UgVElGRlRBR19TQU1QTEVGT1JNQVQ6CisJCSp2YV9hcmcoYXAsIHVpbnQxNiAqKSA9IHRkLT50ZF9zYW1wbGVmb3JtYXQ7CisgICAgICAgICAgICAgICAgcmV0dXJuKDEpOworCWNhc2UgVElGRlRBR19JTUFHRURFUFRIOgorCQkqdmFfYXJnKGFwLCB1aW50MzIgKikgPSB0ZC0+dGRfaW1hZ2VkZXB0aDsKKwkJcmV0dXJuICgxKTsKKwljYXNlIFRJRkZUQUdfWUNCQ1JDT0VGRklDSUVOVFM6CisJCXsKKwkJCS8qIGRlZmF1bHRzIGFyZSBmcm9tIENDSVIgUmVjb21tZW5kYXRpb24gNjAxLTEgKi8KKwkJCXN0YXRpYyBmbG9hdCB5Y2JjcmNvZWZmc1tdID0geyAwLjI5OWYsIDAuNTg3ZiwgMC4xMTRmIH07CisJCQkqdmFfYXJnKGFwLCBmbG9hdCAqKikgPSB5Y2JjcmNvZWZmczsKKwkJCXJldHVybiAxOworCQl9CisJY2FzZSBUSUZGVEFHX1lDQkNSU1VCU0FNUExJTkc6CisJCSp2YV9hcmcoYXAsIHVpbnQxNiAqKSA9IHRkLT50ZF95Y2JjcnN1YnNhbXBsaW5nWzBdOworCQkqdmFfYXJnKGFwLCB1aW50MTYgKikgPSB0ZC0+dGRfeWNiY3JzdWJzYW1wbGluZ1sxXTsKKwkJcmV0dXJuICgxKTsKKwljYXNlIFRJRkZUQUdfWUNCQ1JQT1NJVElPTklORzoKKwkJKnZhX2FyZyhhcCwgdWludDE2ICopID0gdGQtPnRkX3ljYmNycG9zaXRpb25pbmc7CisJCXJldHVybiAoMSk7CisJY2FzZSBUSUZGVEFHX1dISVRFUE9JTlQ6CisJCXsKKwkJCXN0YXRpYyBmbG9hdCB3aGl0ZXBvaW50WzJdOworCisJCQkvKiBUSUZGIDYuMCBzcGVjaWZpY2F0aW9uIHRlbGxzIHRoYXQgaXQgaXMgbm8gZGVmYXVsdAorCQkJICAgdmFsdWUgZm9yIHRoZSBXaGl0ZVBvaW50LCBidXQgQWRvYmVQaG90b3Nob3AgVElGRgorCQkJICAgVGVjaG5pY2FsIE5vdGUgdGVsbHMgdGhhdCBpdCBzaG91bGQgYmUgQ0lFIEQ1MC4gKi8KKwkJCXdoaXRlcG9pbnRbMF0gPQlENTBfWDAgLyAoRDUwX1gwICsgRDUwX1kwICsgRDUwX1owKTsKKwkJCXdoaXRlcG9pbnRbMV0gPQlENTBfWTAgLyAoRDUwX1gwICsgRDUwX1kwICsgRDUwX1owKTsKKwkJCSp2YV9hcmcoYXAsIGZsb2F0ICoqKSA9IHdoaXRlcG9pbnQ7CisJCQlyZXR1cm4gMTsKKwkJfQorCWNhc2UgVElGRlRBR19UUkFOU0ZFUkZVTkNUSU9OOgorCQlpZiAoIXRkLT50ZF90cmFuc2ZlcmZ1bmN0aW9uWzBdICYmCisJCSAgICAhVElGRkRlZmF1bHRUcmFuc2ZlckZ1bmN0aW9uKHRkKSkgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIHRpZi0+dGlmX25hbWUsICJObyBzcGFjZSBmb3IgXCJUcmFuc2ZlckZ1bmN0aW9uXCIgdGFnIik7CisJCQlyZXR1cm4gKDApOworCQl9CisJCSp2YV9hcmcoYXAsIHVpbnQxNiAqKikgPSB0ZC0+dGRfdHJhbnNmZXJmdW5jdGlvblswXTsKKwkJaWYgKHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwgLSB0ZC0+dGRfZXh0cmFzYW1wbGVzID4gMSkgeworCQkJKnZhX2FyZyhhcCwgdWludDE2ICoqKSA9IHRkLT50ZF90cmFuc2ZlcmZ1bmN0aW9uWzFdOworCQkJKnZhX2FyZyhhcCwgdWludDE2ICoqKSA9IHRkLT50ZF90cmFuc2ZlcmZ1bmN0aW9uWzJdOworCQl9CisJCXJldHVybiAoMSk7CisJY2FzZSBUSUZGVEFHX1JFRkVSRU5DRUJMQUNLV0hJVEU6CisJCWlmICghdGQtPnRkX3JlZmJsYWNrd2hpdGUgJiYgIVRJRkZEZWZhdWx0UmVmQmxhY2tXaGl0ZSh0ZCkpCisJCQlyZXR1cm4gKDApOworCQkqdmFfYXJnKGFwLCBmbG9hdCAqKikgPSB0ZC0+dGRfcmVmYmxhY2t3aGl0ZTsKKwkJcmV0dXJuICgxKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBMaWtlIFRJRkZHZXRGaWVsZCwgYnV0IHJldHVybiBhbnkgZGVmYXVsdAorICogdmFsdWUgaWYgdGhlIHRhZyBpcyBub3QgcHJlc2VudCBpbiB0aGUgZGlyZWN0b3J5LgorICovCitpbnQKK1RJRkZHZXRGaWVsZERlZmF1bHRlZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcsIC4uLikKK3sKKwlpbnQgb2s7CisJdmFfbGlzdCBhcDsKKworCXZhX3N0YXJ0KGFwLCB0YWcpOworCW9rID0gIFRJRkZWR2V0RmllbGREZWZhdWx0ZWQodGlmLCB0YWcsIGFwKTsKKwl2YV9lbmQoYXApOworCXJldHVybiAob2spOworfQorCitzdHJ1Y3QgX0ludDY0UGFydHMgeworCWludDMyIGxvdywgaGlnaDsKK307CisKK3R5cGVkZWYgdW5pb24geworCXN0cnVjdCBfSW50NjRQYXJ0cyBwYXJ0OworCWludDY0IHZhbHVlOworfSBfSW50NjQ7CisKK2Zsb2F0CitfVElGRlVJbnQ2NFRvRmxvYXQodWludDY0IHVpNjQpCit7CisJX0ludDY0IGk7CisKKwlpLnZhbHVlID0gdWk2NDsKKwlpZiAoaS5wYXJ0LmhpZ2ggPj0gMCkgeworCQlyZXR1cm4gKGZsb2F0KWkudmFsdWU7CisJfSBlbHNlIHsKKwkJbG9uZyBkb3VibGUgZGY7CisJCWRmID0gKGxvbmcgZG91YmxlKWkudmFsdWU7CisJCWRmICs9IDE4NDQ2NzQ0MDczNzA5NTUxNjE2LjA7IC8qIGFkZGluZyAyKio2NCAqLworCQlyZXR1cm4gKGZsb2F0KWRmOworCX0KK30KKworZG91YmxlCitfVElGRlVJbnQ2NFRvRG91YmxlKHVpbnQ2NCB1aTY0KQoreworCV9JbnQ2NCBpOworCisJaS52YWx1ZSA9IHVpNjQ7CisJaWYgKGkucGFydC5oaWdoID49IDApIHsKKwkJcmV0dXJuIChkb3VibGUpaS52YWx1ZTsKKwl9IGVsc2UgeworCQlsb25nIGRvdWJsZSBkZjsKKwkJZGYgPSAobG9uZyBkb3VibGUpaS52YWx1ZTsKKwkJZGYgKz0gMTg0NDY3NDQwNzM3MDk1NTE2MTYuMDsgLyogYWRkaW5nIDIqKjY0ICovCisJCXJldHVybiAoZG91YmxlKWRmOworCX0KK30KKworLyogdmltOiBzZXQgdHM9OCBzdHM9OCBzdz04IG5vZXQ6ICovCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9jbG9zZS5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfY2xvc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2QyYmFiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfY2xvc2UuYwpAQCAtMCwwICsxLDE0MCBAQAorLyogJElkOiB0aWZfY2xvc2UuYyx2IDEuMTkgMjAxMC0wMy0xMCAxODo1Njo0OCBiZnJpZXNlbiBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCAKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgorICogU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcy4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSAKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTQU0gTEVGRkxFUiBPUiBTSUxJQ09OIEdSQVBISUNTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgKiBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgKiBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GIAorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSAKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRJRkYgTGlicmFyeS4KKyAqLworI2luY2x1ZGUgInRpZmZpb3AuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJRkZDbGVhbnVwKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEF1eGlsaWFyeSBmdW5jdGlvbiB0byBmcmVlIHRoZSBUSUZGIHN0cnVjdHVyZS4gR2l2ZW4gc3RydWN0dXJlIHdpbGwgYmUKKyAqIGNvbXBsZXRldGx5IGZyZWVkLCBzbyB5b3Ugc2hvdWxkIHNhdmUgb3BlbmVkIGZpbGUgaGFuZGxlIGFuZCBwb2ludGVyCisgKiB0byB0aGUgY2xvc2UgcHJvY2VkdXJlIGluIGV4dGVybmFsIHZhcmlhYmxlcyBiZWZvcmUgY2FsbGluZworICogX1RJRkZDbGVhbnVwKCksIGlmIHlvdSB3aWxsIG5lZWQgdGhlc2Ugb25lcyB0byBjbG9zZSB0aGUgZmlsZS4KKyAqIAorICogQHBhcmFtIHRpZiBBIFRJRkYgcG9pbnRlci4KKyAqLworCit2b2lkCitUSUZGQ2xlYW51cChUSUZGKiB0aWYpCit7CisJLyoKKyAgICAgICAgICogRmx1c2ggYnVmZmVyZWQgZGF0YSBhbmQgZGlyZWN0b3J5IChpZiBkaXJ0eSkuCisgICAgICAgICAqLworCWlmICh0aWYtPnRpZl9tb2RlICE9IE9fUkRPTkxZKQorCQlUSUZGRmx1c2godGlmKTsKKwkoKnRpZi0+dGlmX2NsZWFudXApKHRpZik7CisJVElGRkZyZWVEaXJlY3RvcnkodGlmKTsKKworCWlmICh0aWYtPnRpZl9kaXJsaXN0KQorCQlfVElGRmZyZWUodGlmLT50aWZfZGlybGlzdCk7CisKKwkvKgorICAgICAgICAgKiBDbGVhbiB1cCBjbGllbnQgaW5mbyBsaW5rcy4KKyAgICAgICAgICovCisJd2hpbGUoIHRpZi0+dGlmX2NsaWVudGluZm8gKQorCXsKKwkJVElGRkNsaWVudEluZm9MaW5rICpsaW5rID0gdGlmLT50aWZfY2xpZW50aW5mbzsKKworCQl0aWYtPnRpZl9jbGllbnRpbmZvID0gbGluay0+bmV4dDsKKwkJX1RJRkZmcmVlKCBsaW5rLT5uYW1lICk7CisJCV9USUZGZnJlZSggbGluayApOworCX0KKworCWlmICh0aWYtPnRpZl9yYXdkYXRhICYmICh0aWYtPnRpZl9mbGFncyZUSUZGX01ZQlVGRkVSKSkKKwkJX1RJRkZmcmVlKHRpZi0+dGlmX3Jhd2RhdGEpOworCWlmIChpc01hcHBlZCh0aWYpKQorCQlUSUZGVW5tYXBGaWxlQ29udGVudHModGlmLCB0aWYtPnRpZl9iYXNlLCAodG9mZl90KXRpZi0+dGlmX3NpemUpOworCisJLyoKKyAgICAgICAgICogQ2xlYW4gdXAgY3VzdG9tIGZpZWxkcy4KKyAgICAgICAgICovCisJaWYgKHRpZi0+dGlmX2ZpZWxkcyAmJiB0aWYtPnRpZl9uZmllbGRzID4gMCkgeworCQl1aW50MzIgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgdGlmLT50aWZfbmZpZWxkczsgaSsrKSB7CisJCQlUSUZGRmllbGQgKmZsZCA9IHRpZi0+dGlmX2ZpZWxkc1tpXTsKKwkJCWlmIChmbGQtPmZpZWxkX2JpdCA9PSBGSUVMRF9DVVNUT00gJiYKKwkJCSAgICBzdHJuY21wKCJUYWcgIiwgZmxkLT5maWVsZF9uYW1lLCA0KSA9PSAwKSB7CisJCQkJX1RJRkZmcmVlKGZsZC0+ZmllbGRfbmFtZSk7CisJCQkJX1RJRkZmcmVlKGZsZCk7CisJCQl9CisJCX0KKworCQlfVElGRmZyZWUodGlmLT50aWZfZmllbGRzKTsKKwl9CisKKyAgICAgICAgaWYgKHRpZi0+dGlmX25maWVsZHNjb21wYXQgPiAwKSB7CisgICAgICAgICAgICAgICAgdWludDMyIGk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGlmLT50aWZfbmZpZWxkc2NvbXBhdDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGlmLT50aWZfZmllbGRzY29tcGF0W2ldLmFsbG9jYXRlZF9zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVElGRmZyZWUodGlmLT50aWZfZmllbGRzY29tcGF0W2ldLmZpZWxkcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9USUZGZnJlZSh0aWYtPnRpZl9maWVsZHNjb21wYXQpOworICAgICAgICB9CisKKwlfVElGRmZyZWUodGlmKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJRkZDbG9zZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIENsb3NlIGEgcHJldmlvdXNseSBvcGVuZWQgVElGRiBmaWxlLgorICoKKyAqIFRJRkZDbG9zZSBjbG9zZXMgYSBmaWxlIHRoYXQgd2FzIHByZXZpb3VzbHkgb3BlbmVkIHdpdGggVElGRk9wZW4oKS4KKyAqIEFueSBidWZmZXJlZCBkYXRhIGFyZSBmbHVzaGVkIHRvIHRoZSBmaWxlLCBpbmNsdWRpbmcgdGhlIGNvbnRlbnRzIG9mCisgKiB0aGUgY3VycmVudCBkaXJlY3RvcnkgKGlmIG1vZGlmaWVkKTsgYW5kIGFsbCByZXNvdXJjZXMgYXJlIHJlY2xhaW1lZC4KKyAqIAorICogQHBhcmFtIHRpZiBBIFRJRkYgcG9pbnRlci4KKyAqLworCit2b2lkCitUSUZGQ2xvc2UoVElGRiogdGlmKQoreworCVRJRkZDbG9zZVByb2MgY2xvc2Vwcm9jID0gdGlmLT50aWZfY2xvc2Vwcm9jOworCXRoYW5kbGVfdCBmZCA9IHRpZi0+dGlmX2NsaWVudGRhdGE7CisKKwlUSUZGQ2xlYW51cCh0aWYpOworCSh2b2lkKSAoKmNsb3NlcHJvYykoZmQpOworfQorCisvKiB2aW06IHNldCB0cz04IHN0cz04IHN3PTggbm9ldDogKi8KKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfY29kZWMuYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2NvZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NiNDZmNgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2NvZGVjLmMKQEAgLTAsMCArMSwxNjUgQEAKKy8qICRJZDogdGlmX2NvZGVjLmMsdiAxLjE3IDIwMTUtMDgtMTkgMDI6MzE6MDQgYmZyaWVzZW4gRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OC0xOTk3IFNhbSBMZWZmbGVyCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEtMTk5NyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgKiB0aGF0IChpKSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisgKiBhbGwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uLCBhbmQgKGlpKSB0aGUgbmFtZXMgb2YKKyAqIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzIG1heSBub3QgYmUgdXNlZCBpbiBhbnkgYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCB0aGUgc3BlY2lmaWMsIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24gb2YgU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgCisgKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIAorICogSU4gTk8gRVZFTlQgU0hBTEwgU0FNIExFRkZMRVIgT1IgU0lMSUNPTiBHUkFQSElDUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELAorICogT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorICogV0hFVEhFUiBPUiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRiAKKyAqIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgCisgKiBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUSUZGIExpYnJhcnkKKyAqCisgKiBCdWlsdGluIENvbXByZXNzaW9uIFNjaGVtZSBDb25maWd1cmF0aW9uIFN1cHBvcnQuCisgKi8KKyNpbmNsdWRlICJ0aWZmaW9wLmgiCisKK3N0YXRpYyBpbnQgTm90Q29uZmlndXJlZChUSUZGKiwgaW50KTsKKworI2lmbmRlZiBMWldfU1VQUE9SVAorI2RlZmluZSBUSUZGSW5pdExaVyBOb3RDb25maWd1cmVkCisjZW5kaWYKKyNpZm5kZWYgUEFDS0JJVFNfU1VQUE9SVAorI2RlZmluZSBUSUZGSW5pdFBhY2tCaXRzIE5vdENvbmZpZ3VyZWQKKyNlbmRpZgorI2lmbmRlZiBUSFVOREVSX1NVUFBPUlQKKyNkZWZpbmUgVElGRkluaXRUaHVuZGVyU2NhbiBOb3RDb25maWd1cmVkCisjZW5kaWYKKyNpZm5kZWYgTkVYVF9TVVBQT1JUCisjZGVmaW5lIFRJRkZJbml0TmVYVCBOb3RDb25maWd1cmVkCisjZW5kaWYKKyNpZm5kZWYgSlBFR19TVVBQT1JUCisjZGVmaW5lIFRJRkZJbml0SlBFRyBOb3RDb25maWd1cmVkCisjZW5kaWYKKyNpZm5kZWYgT0pQRUdfU1VQUE9SVAorI2RlZmluZSBUSUZGSW5pdE9KUEVHIE5vdENvbmZpZ3VyZWQKKyNlbmRpZgorI2lmbmRlZiBDQ0lUVF9TVVBQT1JUCisjZGVmaW5lIFRJRkZJbml0Q0NJVFRSTEUgTm90Q29uZmlndXJlZAorI2RlZmluZSBUSUZGSW5pdENDSVRUUkxFVyBOb3RDb25maWd1cmVkCisjZGVmaW5lIFRJRkZJbml0Q0NJVFRGYXgzIE5vdENvbmZpZ3VyZWQKKyNkZWZpbmUgVElGRkluaXRDQ0lUVEZheDQgTm90Q29uZmlndXJlZAorI2VuZGlmCisjaWZuZGVmIEpCSUdfU1VQUE9SVAorI2RlZmluZSBUSUZGSW5pdEpCSUcgTm90Q29uZmlndXJlZAorI2VuZGlmCisjaWZuZGVmIFpJUF9TVVBQT1JUCisjZGVmaW5lIFRJRkZJbml0WklQIE5vdENvbmZpZ3VyZWQKKyNlbmRpZgorI2lmbmRlZiBQSVhBUkxPR19TVVBQT1JUCisjZGVmaW5lIFRJRkZJbml0UGl4YXJMb2cgTm90Q29uZmlndXJlZAorI2VuZGlmCisjaWZuZGVmIExPR0xVVl9TVVBQT1JUCisjZGVmaW5lIFRJRkZJbml0U0dJTG9nIE5vdENvbmZpZ3VyZWQKKyNlbmRpZgorI2lmbmRlZiBMWk1BX1NVUFBPUlQKKyNkZWZpbmUgVElGRkluaXRMWk1BIE5vdENvbmZpZ3VyZWQKKyNlbmRpZgorCisvKgorICogQ29tcHJlc3Npb24gc2NoZW1lcyBzdGF0aWNhbGx5IGJ1aWx0IGludG8gdGhlIGxpYnJhcnkuCisgKi8KKyNpZmRlZiBWTVMKK2NvbnN0IFRJRkZDb2RlYyBfVElGRkJ1aWx0aW5DT0RFQ1NbXSA9IHsKKyNlbHNlCitUSUZGQ29kZWMgX1RJRkZCdWlsdGluQ09ERUNTW10gPSB7CisjZW5kaWYKKyAgICB7ICJOb25lIiwJCUNPTVBSRVNTSU9OX05PTkUsCVRJRkZJbml0RHVtcE1vZGUgfSwKKyAgICB7ICJMWlciLAkJQ09NUFJFU1NJT05fTFpXLAlUSUZGSW5pdExaVyB9LAorICAgIHsgIlBhY2tCaXRzIiwJQ09NUFJFU1NJT05fUEFDS0JJVFMsCVRJRkZJbml0UGFja0JpdHMgfSwKKyAgICB7ICJUaHVuZGVyU2NhbiIsCUNPTVBSRVNTSU9OX1RIVU5ERVJTQ0FOLFRJRkZJbml0VGh1bmRlclNjYW4gfSwKKyAgICB7ICJOZVhUIiwJCUNPTVBSRVNTSU9OX05FWFQsCVRJRkZJbml0TmVYVCB9LAorICAgIHsgIkpQRUciLAkJQ09NUFJFU1NJT05fSlBFRywJVElGRkluaXRKUEVHIH0sCisgICAgeyAiT2xkLXN0eWxlIEpQRUciLAlDT01QUkVTU0lPTl9PSlBFRywJVElGRkluaXRPSlBFRyB9LAorICAgIHsgIkNDSVRUIFJMRSIsCUNPTVBSRVNTSU9OX0NDSVRUUkxFLAlUSUZGSW5pdENDSVRUUkxFIH0sCisgICAgeyAiQ0NJVFQgUkxFL1ciLAlDT01QUkVTU0lPTl9DQ0lUVFJMRVcsCVRJRkZJbml0Q0NJVFRSTEVXIH0sCisgICAgeyAiQ0NJVFQgR3JvdXAgMyIsCUNPTVBSRVNTSU9OX0NDSVRURkFYMywJVElGRkluaXRDQ0lUVEZheDMgfSwKKyAgICB7ICJDQ0lUVCBHcm91cCA0IiwJQ09NUFJFU1NJT05fQ0NJVFRGQVg0LAlUSUZGSW5pdENDSVRURmF4NCB9LAorICAgIHsgIklTTyBKQklHIiwJQ09NUFJFU1NJT05fSkJJRywJVElGRkluaXRKQklHIH0sCisgICAgeyAiRGVmbGF0ZSIsCUNPTVBSRVNTSU9OX0RFRkxBVEUsCVRJRkZJbml0WklQIH0sCisgICAgeyAiQWRvYmVEZWZsYXRlIiwgICBDT01QUkVTU0lPTl9BRE9CRV9ERUZMQVRFICwgVElGRkluaXRaSVAgfSwgCisgICAgeyAiUGl4YXJMb2ciLAlDT01QUkVTU0lPTl9QSVhBUkxPRywJVElGRkluaXRQaXhhckxvZyB9LAorICAgIHsgIlNHSUxvZyIsCQlDT01QUkVTU0lPTl9TR0lMT0csCVRJRkZJbml0U0dJTG9nIH0sCisgICAgeyAiU0dJTG9nMjQiLAlDT01QUkVTU0lPTl9TR0lMT0cyNCwJVElGRkluaXRTR0lMb2cgfSwKKyAgICB7ICJMWk1BIiwJCUNPTVBSRVNTSU9OX0xaTUEsCVRJRkZJbml0TFpNQSB9LAorICAgIHsgTlVMTCwgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgTlVMTCB9Cit9OworCitzdGF0aWMgaW50Citfbm90Q29uZmlndXJlZChUSUZGKiB0aWYpCit7CisJY29uc3QgVElGRkNvZGVjKiBjID0gVElGRkZpbmRDT0RFQyh0aWYtPnRpZl9kaXIudGRfY29tcHJlc3Npb24pOworICAgICAgICBjaGFyIGNvbXByZXNzaW9uX2NvZGVbMjBdOworICAgICAgICAKKyAgICAgICAgc3ByaW50Zihjb21wcmVzc2lvbl9jb2RlLCAiJWQiLHRpZi0+dGlmX2Rpci50ZF9jb21wcmVzc2lvbiApOworCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCB0aWYtPnRpZl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIiVzIGNvbXByZXNzaW9uIHN1cHBvcnQgaXMgbm90IGNvbmZpZ3VyZWQiLCAKKyAgICAgICAgICAgICAgICAgICAgIGMgPyBjLT5uYW1lIDogY29tcHJlc3Npb25fY29kZSApOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK05vdENvbmZpZ3VyZWQoVElGRiogdGlmLCBpbnQgc2NoZW1lKQoreworCSh2b2lkKSBzY2hlbWU7CisKKwl0aWYtPnRpZl9maXh1cHRhZ3MgPSBfbm90Q29uZmlndXJlZDsKKwl0aWYtPnRpZl9kZWNvZGVzdGF0dXMgPSBGQUxTRTsKKwl0aWYtPnRpZl9zZXR1cGRlY29kZSA9IF9ub3RDb25maWd1cmVkOworCXRpZi0+dGlmX2VuY29kZXN0YXR1cyA9IEZBTFNFOworCXRpZi0+dGlmX3NldHVwZW5jb2RlID0gX25vdENvbmZpZ3VyZWQ7CisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICBUSUZGSXNDT0RFQ0NvbmZpZ3VyZWQoKSAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSB3b3JraW5nIGNvZGVjIGZvciB0aGUgc3BlY2lmaWMgY29kaW5nIHNjaGVtZS4KKyAqCisgKiBAcmV0dXJuIHJldHVybnMgMSBpZiB0aGUgY29kZWMgaXMgY29uZmlndXJlZCBhbmQgd29ya2luZy4gT3RoZXJ3aXNlCisgKiAwIHdpbGwgYmUgcmV0dXJuZWQuCisgKi8KKworaW50CitUSUZGSXNDT0RFQ0NvbmZpZ3VyZWQodWludDE2IHNjaGVtZSkKK3sKKwljb25zdCBUSUZGQ29kZWMqIGNvZGVjID0gVElGRkZpbmRDT0RFQyhzY2hlbWUpOworCisJaWYoY29kZWMgPT0gTlVMTCkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYoY29kZWMtPmluaXQgPT0gTlVMTCkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYoY29kZWMtPmluaXQgIT0gTm90Q29uZmlndXJlZCl7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfY29sb3IuYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2NvbG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU0ODUwYwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2NvbG9yLmMKQEAgLTAsMCArMSwyODcgQEAKKy8qICRJZDogdGlmX2NvbG9yLmMsdiAxLjE5IDIwMTAtMTItMTQgMDI6MjI6NDIgZmF4Z3V5IEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogQ0lFIEwqYSpiKiB0byBDSUUgWFlaIGFuZCBDSUUgWFlaIHRvIFJHQiBjb252ZXJzaW9uIHJvdXRpbmVzIGFyZSB0YWtlbgorICogZnJvbSB0aGUgVklQUyBsaWJyYXJ5IChodHRwOi8vd3d3LnZpcHMuZWNzLnNvdG9uLmFjLnVrKSB3aXRoCisgKiB0aGUgcGVybWlzc2lvbiBvZiBKb2huIEN1cGl0dCwgdGhlIFZJUFMgYXV0aG9yLgorICovCisKKy8qCisgKiBUSUZGIExpYnJhcnkuCisgKgorICogQ29sb3Igc3BhY2UgY29udmVyc2lvbiByb3V0aW5lcy4KKyAqLworCisjaW5jbHVkZSAidGlmZmlvcC5oIgorI2luY2x1ZGUgPG1hdGguaD4KKworLyoKKyAqIENvbnZlcnQgY29sb3IgdmFsdWUgZnJvbSB0aGUgQ0lFIEwqYSpiKiAxOTc2IHNwYWNlIHRvIENJRSBYWVouCisgKi8KK3ZvaWQKK1RJRkZDSUVMYWJUb1hZWihUSUZGQ0lFTGFiVG9SR0IgKmNpZWxhYiwgdWludDMyIGwsIGludDMyIGEsIGludDMyIGIsCisJCWZsb2F0ICpYLCBmbG9hdCAqWSwgZmxvYXQgKlopCit7CisJZmxvYXQgTCA9IChmbG9hdClsICogMTAwLjBGIC8gMjU1LjBGOworCWZsb2F0IGNieSwgdG1wOworCisJaWYoIEwgPCA4Ljg1NkYgKSB7CisJCSpZID0gKEwgKiBjaWVsYWItPlkwKSAvIDkwMy4yOTJGOworCQljYnkgPSA3Ljc4N0YgKiAoKlkgLyBjaWVsYWItPlkwKSArIDE2LjBGIC8gMTE2LjBGOworCX0gZWxzZSB7CisJCWNieSA9IChMICsgMTYuMEYpIC8gMTE2LjBGOworCQkqWSA9IGNpZWxhYi0+WTAgKiBjYnkgKiBjYnkgKiBjYnk7CisJfQorCisJdG1wID0gKGZsb2F0KWEgLyA1MDAuMEYgKyBjYnk7CisJaWYoIHRtcCA8IDAuMjA2OUYgKQorCQkqWCA9IGNpZWxhYi0+WDAgKiAodG1wIC0gMC4xMzc5M0YpIC8gNy43ODdGOworCWVsc2UgICAgCisJCSpYID0gY2llbGFiLT5YMCAqIHRtcCAqIHRtcCAqIHRtcDsKKworCXRtcCA9IGNieSAtIChmbG9hdCliIC8gMjAwLjBGOworCWlmKCB0bXAgPCAwLjIwNjlGICkKKwkJKlogPSBjaWVsYWItPlowICogKHRtcCAtIDAuMTM3OTNGKSAvIDcuNzg3RjsKKwllbHNlICAgIAorCQkqWiA9IGNpZWxhYi0+WjAgKiB0bXAgKiB0bXAgKiB0bXA7Cit9CisKKyNkZWZpbmUgUklOVChSKSAoKHVpbnQzMikoKFIpPjA/KChSKSswLjUpOigoUiktMC41KSkpCisvKgorICogQ29udmVydCBjb2xvciB2YWx1ZSBmcm9tIHRoZSBYWVogc3BhY2UgdG8gUkdCLgorICovCit2b2lkCitUSUZGWFlaVG9SR0IoVElGRkNJRUxhYlRvUkdCICpjaWVsYWIsIGZsb2F0IFgsIGZsb2F0IFksIGZsb2F0IFosCisJICAgICB1aW50MzIgKnIsIHVpbnQzMiAqZywgdWludDMyICpiKQoreworCWludCBpOworCWZsb2F0IFlyLCBZZywgWWI7CisJZmxvYXQgKm1hdHJpeCA9ICZjaWVsYWItPmRpc3BsYXkuZF9tYXRbMF1bMF07CisKKwkvKiBNdWx0aXBseSB0aHJvdWdoIHRoZSBtYXRyaXggdG8gZ2V0IGx1bWlub3NpdHkgdmFsdWVzLiAqLworCVlyID0gIG1hdHJpeFswXSAqIFggKyBtYXRyaXhbMV0gKiBZICsgbWF0cml4WzJdICogWjsKKwlZZyA9ICBtYXRyaXhbM10gKiBYICsgbWF0cml4WzRdICogWSArIG1hdHJpeFs1XSAqIFo7CisJWWIgPSAgbWF0cml4WzZdICogWCArIG1hdHJpeFs3XSAqIFkgKyBtYXRyaXhbOF0gKiBaOworCisJLyogQ2xpcCBpbnB1dCAqLworCVlyID0gVElGRm1heChZciwgY2llbGFiLT5kaXNwbGF5LmRfWTBSKTsKKwlZZyA9IFRJRkZtYXgoWWcsIGNpZWxhYi0+ZGlzcGxheS5kX1kwRyk7CisJWWIgPSBUSUZGbWF4KFliLCBjaWVsYWItPmRpc3BsYXkuZF9ZMEIpOworCisJLyogQXZvaWQgb3ZlcmZsb3cgaW4gY2FzZSBvZiB3cm9uZyBpbnB1dCB2YWx1ZXMgKi8KKwlZciA9IFRJRkZtaW4oWXIsIGNpZWxhYi0+ZGlzcGxheS5kX1lDUik7CisJWWcgPSBUSUZGbWluKFlnLCBjaWVsYWItPmRpc3BsYXkuZF9ZQ0cpOworCVliID0gVElGRm1pbihZYiwgY2llbGFiLT5kaXNwbGF5LmRfWUNCKTsKKworCS8qIFR1cm4gbHVtaW5vc2l0eSB0byBjb2xvdXIgdmFsdWUuICovCisJaSA9IChpbnQpKChZciAtIGNpZWxhYi0+ZGlzcGxheS5kX1kwUikgLyBjaWVsYWItPnJzdGVwKTsKKwlpID0gVElGRm1pbihjaWVsYWItPnJhbmdlLCBpKTsKKwkqciA9IFJJTlQoY2llbGFiLT5ZcjJyW2ldKTsKKworCWkgPSAoaW50KSgoWWcgLSBjaWVsYWItPmRpc3BsYXkuZF9ZMEcpIC8gY2llbGFiLT5nc3RlcCk7CisJaSA9IFRJRkZtaW4oY2llbGFiLT5yYW5nZSwgaSk7CisJKmcgPSBSSU5UKGNpZWxhYi0+WWcyZ1tpXSk7CisKKwlpID0gKGludCkoKFliIC0gY2llbGFiLT5kaXNwbGF5LmRfWTBCKSAvIGNpZWxhYi0+YnN0ZXApOworCWkgPSBUSUZGbWluKGNpZWxhYi0+cmFuZ2UsIGkpOworCSpiID0gUklOVChjaWVsYWItPlliMmJbaV0pOworCisJLyogQ2xpcCBvdXRwdXQuICovCisJKnIgPSBUSUZGbWluKCpyLCBjaWVsYWItPmRpc3BsYXkuZF9WcndyKTsKKwkqZyA9IFRJRkZtaW4oKmcsIGNpZWxhYi0+ZGlzcGxheS5kX1Zyd2cpOworCSpiID0gVElGRm1pbigqYiwgY2llbGFiLT5kaXNwbGF5LmRfVnJ3Yik7Cit9CisjdW5kZWYgUklOVAorCisvKiAKKyAqIEFsbG9jYXRlIGNvbnZlcnNpb24gc3RhdGUgc3RydWN0dXJlcyBhbmQgbWFrZSBsb29rX3VwIHRhYmxlcyBmb3IKKyAqIHRoZSBZcixZYixZZyA8PT4gcixnLGIgY29udmVyc2lvbnMuCisgKi8KK2ludAorVElGRkNJRUxhYlRvUkdCSW5pdChUSUZGQ0lFTGFiVG9SR0IqIGNpZWxhYiwKKwkJICAgIGNvbnN0IFRJRkZEaXNwbGF5ICpkaXNwbGF5LCBmbG9hdCAqcmVmV2hpdGUpCit7CisJaW50IGk7CisJZG91YmxlIGdhbW1hOworCisJY2llbGFiLT5yYW5nZSA9IENJRUxBQlRPUkdCX1RBQkxFX1JBTkdFOworCisJX1RJRkZtZW1jcHkoJmNpZWxhYi0+ZGlzcGxheSwgZGlzcGxheSwgc2l6ZW9mKFRJRkZEaXNwbGF5KSk7CisKKwkvKiBSZWQgKi8KKwlnYW1tYSA9IDEuMCAvIGNpZWxhYi0+ZGlzcGxheS5kX2dhbW1hUiA7CisJY2llbGFiLT5yc3RlcCA9CisJCShjaWVsYWItPmRpc3BsYXkuZF9ZQ1IgLSBjaWVsYWItPmRpc3BsYXkuZF9ZMFIpCS8gY2llbGFiLT5yYW5nZTsKKwlmb3IoaSA9IDA7IGkgPD0gY2llbGFiLT5yYW5nZTsgaSsrKSB7CisJCWNpZWxhYi0+WXIycltpXSA9IGNpZWxhYi0+ZGlzcGxheS5kX1Zyd3IKKwkJICAgICogKChmbG9hdClwb3coKGRvdWJsZSlpIC8gY2llbGFiLT5yYW5nZSwgZ2FtbWEpKTsKKwl9CisKKwkvKiBHcmVlbiAqLworCWdhbW1hID0gMS4wIC8gY2llbGFiLT5kaXNwbGF5LmRfZ2FtbWFHIDsKKwljaWVsYWItPmdzdGVwID0KKwkgICAgKGNpZWxhYi0+ZGlzcGxheS5kX1lDUiAtIGNpZWxhYi0+ZGlzcGxheS5kX1kwUikgLyBjaWVsYWItPnJhbmdlOworCWZvcihpID0gMDsgaSA8PSBjaWVsYWItPnJhbmdlOyBpKyspIHsKKwkJY2llbGFiLT5ZZzJnW2ldID0gY2llbGFiLT5kaXNwbGF5LmRfVnJ3ZworCQkgICAgKiAoKGZsb2F0KXBvdygoZG91YmxlKWkgLyBjaWVsYWItPnJhbmdlLCBnYW1tYSkpOworCX0KKworCS8qIEJsdWUgKi8KKwlnYW1tYSA9IDEuMCAvIGNpZWxhYi0+ZGlzcGxheS5kX2dhbW1hQiA7CisJY2llbGFiLT5ic3RlcCA9CisJICAgIChjaWVsYWItPmRpc3BsYXkuZF9ZQ1IgLSBjaWVsYWItPmRpc3BsYXkuZF9ZMFIpIC8gY2llbGFiLT5yYW5nZTsKKwlmb3IoaSA9IDA7IGkgPD0gY2llbGFiLT5yYW5nZTsgaSsrKSB7CisJCWNpZWxhYi0+WWIyYltpXSA9IGNpZWxhYi0+ZGlzcGxheS5kX1Zyd2IKKwkJICAgICogKChmbG9hdClwb3coKGRvdWJsZSlpIC8gY2llbGFiLT5yYW5nZSwgZ2FtbWEpKTsKKwl9CisKKwkvKiBJbml0IHJlZmVyZW5jZSB3aGl0ZSBwb2ludCAqLworCWNpZWxhYi0+WDAgPSByZWZXaGl0ZVswXTsKKwljaWVsYWItPlkwID0gcmVmV2hpdGVbMV07CisJY2llbGFiLT5aMCA9IHJlZldoaXRlWzJdOworCisJcmV0dXJuIDA7Cit9CisKKy8qIAorICogQ29udmVydCBjb2xvciB2YWx1ZSBmcm9tIHRoZSBZQ2JDciBzcGFjZSB0byBDSUUgWFlaLgorICogVGhlIGNvbG9yc3BhY2UgY29udmVyc2lvbiBhbGdvcml0aG0gY29tZXMgZnJvbSB0aGUgSUpHIHY1YSBjb2RlOworICogc2VlIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyBpdCB3b3Jrcy4KKyAqLworI2RlZmluZQlTSElGVAkJCTE2CisjZGVmaW5lCUZJWCh4KQkJCSgoaW50MzIpKCh4KSAqICgxTDw8U0hJRlQpICsgMC41KSkKKyNkZWZpbmUJT05FX0hBTEYJCSgoaW50MzIpKDE8PChTSElGVC0xKSkpCisjZGVmaW5lCUNvZGUyVihjLCBSQiwgUlcsIENSKQkoKCgoYyktKGludDMyKShSQikpKihmbG9hdCkoQ1IpKS8oZmxvYXQpKCgoUlcpLShSQikpID8gKChSVyktKFJCKSkgOiAxKSkKKyNkZWZpbmUJQ0xBTVAoZixtaW4sbWF4KQkoKGYpPChtaW4pPyhtaW4pOihmKT4obWF4KT8obWF4KTooZikpCisjZGVmaW5lIEhJQ0xBTVAoZixtYXgpCQkoKGYpPihtYXgpPyhtYXgpOihmKSkKKwordm9pZAorVElGRllDYkNydG9SR0IoVElGRllDYkNyVG9SR0IgKnljYmNyLCB1aW50MzIgWSwgaW50MzIgQ2IsIGludDMyIENyLAorCSAgICAgICB1aW50MzIgKnIsIHVpbnQzMiAqZywgdWludDMyICpiKQoreworCWludDMyIGk7CisKKwkvKiBYWFg6IE9ubHkgOC1iaXQgWUNiQ3IgaW5wdXQgc3VwcG9ydGVkIGZvciBub3cgKi8KKwlZID0gSElDTEFNUChZLCAyNTUpLCBDYiA9IENMQU1QKENiLCAwLCAyNTUpLCBDciA9IENMQU1QKENyLCAwLCAyNTUpOworCisJaSA9IHljYmNyLT5ZX3RhYltZXSArIHljYmNyLT5Dcl9yX3RhYltDcl07CisJKnIgPSBDTEFNUChpLCAwLCAyNTUpOworCWkgPSB5Y2Jjci0+WV90YWJbWV0KKwkgICAgKyAoaW50KSgoeWNiY3ItPkNiX2dfdGFiW0NiXSArIHljYmNyLT5Dcl9nX3RhYltDcl0pID4+IFNISUZUKTsKKwkqZyA9IENMQU1QKGksIDAsIDI1NSk7CisJaSA9IHljYmNyLT5ZX3RhYltZXSArIHljYmNyLT5DYl9iX3RhYltDYl07CisJKmIgPSBDTEFNUChpLCAwLCAyNTUpOworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgWUNiQ3ItPlJHQiBjb252ZXJzaW9uIHRhYmxlcy4gIFRoZSBjb252ZXJzaW9uCisgKiBpcyBkb25lIGFjY29yZGluZyB0byB0aGUgNi4wIHNwZWM6CisgKgorICogICAgUiA9IFkgKyBDciooMiAtIDIqTHVtYVJlZCkKKyAqICAgIEIgPSBZICsgQ2IqKDIgLSAyKkx1bWFCbHVlKQorICogICAgRyA9ICAgWQorICogICAgICAgIC0gTHVtYUJsdWUqQ2IqKDItMipMdW1hQmx1ZSkvTHVtYUdyZWVuCisgKiAgICAgICAgLSBMdW1hUmVkKkNyKigyLTIqTHVtYVJlZCkvTHVtYUdyZWVuCisgKgorICogVG8gYXZvaWQgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYyB0aGUgZnJhY3Rpb25hbCBjb25zdGFudHMgdGhhdAorICogY29tZSBvdXQgb2YgdGhlIGVxdWF0aW9ucyBhcmUgcmVwcmVzZW50ZWQgYXMgZml4ZWQgcG9pbnQgdmFsdWVzCisgKiBpbiB0aGUgcmFuZ2UgMC4uLjJeMTYuICBXZSBhbHNvIGVsaW1pbmF0ZSBtdWx0aXBsaWNhdGlvbnMgYnkKKyAqIHByZS1jYWxjdWxhdGluZyBwb3NzaWJsZSB2YWx1ZXMgaW5kZXhlZCBieSBDYiBhbmQgQ3IgKHRoaXMgY29kZQorICogYXNzdW1lcyBjb252ZXJzaW9uIGlzIGJlaW5nIGRvbmUgZm9yIDgtYml0IHNhbXBsZXMpLgorICovCitpbnQKK1RJRkZZQ2JDclRvUkdCSW5pdChUSUZGWUNiQ3JUb1JHQiogeWNiY3IsIGZsb2F0ICpsdW1hLCBmbG9hdCAqcmVmQmxhY2tXaGl0ZSkKK3sKKyAgICBUSUZGUkdCVmFsdWUqIGNsYW1wdGFiOworICAgIGludCBpOworICAgIAorI2RlZmluZSBMdW1hUmVkCSAgICBsdW1hWzBdCisjZGVmaW5lIEx1bWFHcmVlbiAgIGx1bWFbMV0KKyNkZWZpbmUgTHVtYUJsdWUgICAgbHVtYVsyXQorCisgICAgY2xhbXB0YWIgPSAoVElGRlJHQlZhbHVlKikoCisJKHVpbnQ4KikgeWNiY3IrVElGRnJvdW5kdXBfMzIoc2l6ZW9mIChUSUZGWUNiQ3JUb1JHQiksIHNpemVvZiAobG9uZykpKTsgIAorICAgIF9USUZGbWVtc2V0KGNsYW1wdGFiLCAwLCAyNTYpOwkJLyogdiA8IDAgPT4gMCAqLworICAgIHljYmNyLT5jbGFtcHRhYiA9IChjbGFtcHRhYiArPSAyNTYpOworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwljbGFtcHRhYltpXSA9IChUSUZGUkdCVmFsdWUpIGk7CisgICAgX1RJRkZtZW1zZXQoY2xhbXB0YWIrMjU2LCAyNTUsIDIqMjU2KTsJLyogdiA+IDI1NSA9PiAyNTUgKi8KKyAgICB5Y2Jjci0+Q3Jfcl90YWIgPSAoaW50KikgKGNsYW1wdGFiICsgMyoyNTYpOworICAgIHljYmNyLT5DYl9iX3RhYiA9IHljYmNyLT5Dcl9yX3RhYiArIDI1NjsKKyAgICB5Y2Jjci0+Q3JfZ190YWIgPSAoaW50MzIqKSAoeWNiY3ItPkNiX2JfdGFiICsgMjU2KTsKKyAgICB5Y2Jjci0+Q2JfZ190YWIgPSB5Y2Jjci0+Q3JfZ190YWIgKyAyNTY7CisgICAgeWNiY3ItPllfdGFiID0geWNiY3ItPkNiX2dfdGFiICsgMjU2OworCisgICAgeyBmbG9hdCBmMSA9IDItMipMdW1hUmVkOwkJaW50MzIgRDEgPSBGSVgoZjEpOworICAgICAgZmxvYXQgZjIgPSBMdW1hUmVkKmYxL0x1bWFHcmVlbjsJaW50MzIgRDIgPSAtRklYKGYyKTsKKyAgICAgIGZsb2F0IGYzID0gMi0yKkx1bWFCbHVlOwkJaW50MzIgRDMgPSBGSVgoZjMpOworICAgICAgZmxvYXQgZjQgPSBMdW1hQmx1ZSpmMy9MdW1hR3JlZW47CWludDMyIEQ0ID0gLUZJWChmNCk7CisgICAgICBpbnQgeDsKKworI3VuZGVmIEx1bWFCbHVlCisjdW5kZWYgTHVtYUdyZWVuCisjdW5kZWYgTHVtYVJlZAorICAgICAgCisgICAgICAvKgorICAgICAgICogaSBpcyB0aGUgYWN0dWFsIGlucHV0IHBpeGVsIHZhbHVlIGluIHRoZSByYW5nZSAwLi4yNTUKKyAgICAgICAqIENiIGFuZCBDciB2YWx1ZXMgYXJlIGluIHRoZSByYW5nZSAtMTI4Li4xMjcgKGFjdHVhbGx5CisgICAgICAgKiB0aGV5IGFyZSBpbiBhIHJhbmdlIGRlZmluZWQgYnkgdGhlIFJlZmVyZW5jZUJsYWNrV2hpdGUKKyAgICAgICAqIHRhZykgc28gdGhlcmUgaXMgc29tZSByYW5nZSBzaGlmdGluZyB0byBkbyBoZXJlIHdoZW4KKyAgICAgICAqIGNvbnN0cnVjdGluZyB0YWJsZXMgaW5kZXhlZCBieSB0aGUgcmF3IHBpeGVsIGRhdGEuCisgICAgICAgKi8KKyAgICAgIGZvciAoaSA9IDAsIHggPSAtMTI4OyBpIDwgMjU2OyBpKyssIHgrKykgeworCSAgICBpbnQzMiBDciA9IChpbnQzMilDb2RlMlYoeCwgcmVmQmxhY2tXaGl0ZVs0XSAtIDEyOC4wRiwKKwkJCSAgICByZWZCbGFja1doaXRlWzVdIC0gMTI4LjBGLCAxMjcpOworCSAgICBpbnQzMiBDYiA9IChpbnQzMilDb2RlMlYoeCwgcmVmQmxhY2tXaGl0ZVsyXSAtIDEyOC4wRiwKKwkJCSAgICByZWZCbGFja1doaXRlWzNdIC0gMTI4LjBGLCAxMjcpOworCisJICAgIHljYmNyLT5Dcl9yX3RhYltpXSA9IChpbnQzMikoKEQxKkNyICsgT05FX0hBTEYpPj5TSElGVCk7CisJICAgIHljYmNyLT5DYl9iX3RhYltpXSA9IChpbnQzMikoKEQzKkNiICsgT05FX0hBTEYpPj5TSElGVCk7CisJICAgIHljYmNyLT5Dcl9nX3RhYltpXSA9IEQyKkNyOworCSAgICB5Y2Jjci0+Q2JfZ190YWJbaV0gPSBENCpDYiArIE9ORV9IQUxGOworCSAgICB5Y2Jjci0+WV90YWJbaV0gPQorCQkgICAgKGludDMyKUNvZGUyVih4ICsgMTI4LCByZWZCbGFja1doaXRlWzBdLCByZWZCbGFja1doaXRlWzFdLCAyNTUpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorI3VuZGVmCUhJQ0xBTVAKKyN1bmRlZglDTEFNUAorI3VuZGVmCUNvZGUyVgorI3VuZGVmCVNISUZUCisjdW5kZWYJT05FX0hBTEYKKyN1bmRlZglGSVgKKworLyogdmltOiBzZXQgdHM9OCBzdHM9OCBzdz04IG5vZXQ6ICovCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9jb21wcmVzcy5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfY29tcHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGU3MmZkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfY29tcHJlc3MuYwpAQCAtMCwwICsxLDMwNCBAQAorLyogJElkOiB0aWZfY29tcHJlc3MuYyx2IDEuMjIgMjAxMC0wMy0xMCAxODo1Njo0OCBiZnJpZXNlbiBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCAKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgorICogU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcy4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSAKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTQU0gTEVGRkxFUiBPUiBTSUxJQ09OIEdSQVBISUNTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgKiBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgKiBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GIAorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSAKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRJRkYgTGlicmFyeQorICoKKyAqIENvbXByZXNzaW9uIFNjaGVtZSBDb25maWd1cmF0aW9uIFN1cHBvcnQuCisgKi8KKyNpbmNsdWRlICJ0aWZmaW9wLmgiCisKK3N0YXRpYyBpbnQKK1RJRkZOb0VuY29kZShUSUZGKiB0aWYsIGNvbnN0IGNoYXIqIG1ldGhvZCkKK3sKKwljb25zdCBUSUZGQ29kZWMqIGMgPSBUSUZGRmluZENPREVDKHRpZi0+dGlmX2Rpci50ZF9jb21wcmVzc2lvbik7CisKKwlpZiAoYykgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgdGlmLT50aWZfbmFtZSwKKwkJCSAgICAgIiVzICVzIGVuY29kaW5nIGlzIG5vdCBpbXBsZW1lbnRlZCIsCisJCQkgICAgIGMtPm5hbWUsIG1ldGhvZCk7CisJfSBlbHNlIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIHRpZi0+dGlmX25hbWUsCisJCQkiQ29tcHJlc3Npb24gc2NoZW1lICV1ICVzIGVuY29kaW5nIGlzIG5vdCBpbXBsZW1lbnRlZCIsCisJCQkgICAgIHRpZi0+dGlmX2Rpci50ZF9jb21wcmVzc2lvbiwgbWV0aG9kKTsKKwl9CisJcmV0dXJuICgtMSk7Cit9CisKK2ludAorX1RJRkZOb1Jvd0VuY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBwcCwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKQoreworCSh2b2lkKSBwcDsgKHZvaWQpIGNjOyAodm9pZCkgczsKKwlyZXR1cm4gKFRJRkZOb0VuY29kZSh0aWYsICJzY2FubGluZSIpKTsKK30KKworaW50CitfVElGRk5vU3RyaXBFbmNvZGUoVElGRiogdGlmLCB1aW50OCogcHAsIHRtc2l6ZV90IGNjLCB1aW50MTYgcykKK3sKKwkodm9pZCkgcHA7ICh2b2lkKSBjYzsgKHZvaWQpIHM7CisJcmV0dXJuIChUSUZGTm9FbmNvZGUodGlmLCAic3RyaXAiKSk7Cit9CisKK2ludAorX1RJRkZOb1RpbGVFbmNvZGUoVElGRiogdGlmLCB1aW50OCogcHAsIHRtc2l6ZV90IGNjLCB1aW50MTYgcykKK3sKKwkodm9pZCkgcHA7ICh2b2lkKSBjYzsgKHZvaWQpIHM7CisJcmV0dXJuIChUSUZGTm9FbmNvZGUodGlmLCAidGlsZSIpKTsKK30KKworc3RhdGljIGludAorVElGRk5vRGVjb2RlKFRJRkYqIHRpZiwgY29uc3QgY2hhciogbWV0aG9kKQoreworCWNvbnN0IFRJRkZDb2RlYyogYyA9IFRJRkZGaW5kQ09ERUModGlmLT50aWZfZGlyLnRkX2NvbXByZXNzaW9uKTsKKworCWlmIChjKQorCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgdGlmLT50aWZfbmFtZSwKKwkJCSAgICAgIiVzICVzIGRlY29kaW5nIGlzIG5vdCBpbXBsZW1lbnRlZCIsCisJCQkgICAgIGMtPm5hbWUsIG1ldGhvZCk7CisJZWxzZQorCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgdGlmLT50aWZfbmFtZSwKKwkJCSAgICAgIkNvbXByZXNzaW9uIHNjaGVtZSAldSAlcyBkZWNvZGluZyBpcyBub3QgaW1wbGVtZW50ZWQiLAorCQkJICAgICB0aWYtPnRpZl9kaXIudGRfY29tcHJlc3Npb24sIG1ldGhvZCk7CisJcmV0dXJuICgtMSk7Cit9CisKK2ludAorX1RJRkZOb0ZpeHVwVGFncyhUSUZGKiB0aWYpCit7CisJKHZvaWQpIHRpZjsKKwlyZXR1cm4gKDEpOworfQorCitpbnQKK19USUZGTm9Sb3dEZWNvZGUoVElGRiogdGlmLCB1aW50OCogcHAsIHRtc2l6ZV90IGNjLCB1aW50MTYgcykKK3sKKwkodm9pZCkgcHA7ICh2b2lkKSBjYzsgKHZvaWQpIHM7CisJcmV0dXJuIChUSUZGTm9EZWNvZGUodGlmLCAic2NhbmxpbmUiKSk7Cit9CisKK2ludAorX1RJRkZOb1N0cmlwRGVjb2RlKFRJRkYqIHRpZiwgdWludDgqIHBwLCB0bXNpemVfdCBjYywgdWludDE2IHMpCit7CisJKHZvaWQpIHBwOyAodm9pZCkgY2M7ICh2b2lkKSBzOworCXJldHVybiAoVElGRk5vRGVjb2RlKHRpZiwgInN0cmlwIikpOworfQorCitpbnQKK19USUZGTm9UaWxlRGVjb2RlKFRJRkYqIHRpZiwgdWludDgqIHBwLCB0bXNpemVfdCBjYywgdWludDE2IHMpCit7CisJKHZvaWQpIHBwOyAodm9pZCkgY2M7ICh2b2lkKSBzOworCXJldHVybiAoVElGRk5vRGVjb2RlKHRpZiwgInRpbGUiKSk7Cit9CisKK2ludAorX1RJRkZOb1NlZWsoVElGRiogdGlmLCB1aW50MzIgb2ZmKQoreworCSh2b2lkKSBvZmY7CisJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIHRpZi0+dGlmX25hbWUsCisJCSAgICAgIkNvbXByZXNzaW9uIGFsZ29yaXRobSBkb2VzIG5vdCBzdXBwb3J0IHJhbmRvbSBhY2Nlc3MiKTsKKwlyZXR1cm4gKDApOworfQorCitpbnQKK19USUZGTm9QcmVDb2RlKFRJRkYqIHRpZiwgdWludDE2IHMpCit7CisJKHZvaWQpIHRpZjsgKHZvaWQpIHM7CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIGludCBfVElGRnRydWUoVElGRiogdGlmKSB7ICh2b2lkKSB0aWY7IHJldHVybiAoMSk7IH0KK3N0YXRpYyB2b2lkIF9USUZGdm9pZChUSUZGKiB0aWYpIHsgKHZvaWQpIHRpZjsgfQorCit2b2lkCitfVElGRlNldERlZmF1bHRDb21wcmVzc2lvblN0YXRlKFRJRkYqIHRpZikKK3sKKwl0aWYtPnRpZl9maXh1cHRhZ3MgPSBfVElGRk5vRml4dXBUYWdzOyAKKwl0aWYtPnRpZl9kZWNvZGVzdGF0dXMgPSBUUlVFOworCXRpZi0+dGlmX3NldHVwZGVjb2RlID0gX1RJRkZ0cnVlOworCXRpZi0+dGlmX3ByZWRlY29kZSA9IF9USUZGTm9QcmVDb2RlOworCXRpZi0+dGlmX2RlY29kZXJvdyA9IF9USUZGTm9Sb3dEZWNvZGU7ICAKKwl0aWYtPnRpZl9kZWNvZGVzdHJpcCA9IF9USUZGTm9TdHJpcERlY29kZTsKKwl0aWYtPnRpZl9kZWNvZGV0aWxlID0gX1RJRkZOb1RpbGVEZWNvZGU7ICAKKwl0aWYtPnRpZl9lbmNvZGVzdGF0dXMgPSBUUlVFOworCXRpZi0+dGlmX3NldHVwZW5jb2RlID0gX1RJRkZ0cnVlOworCXRpZi0+dGlmX3ByZWVuY29kZSA9IF9USUZGTm9QcmVDb2RlOworCXRpZi0+dGlmX3Bvc3RlbmNvZGUgPSBfVElGRnRydWU7CisJdGlmLT50aWZfZW5jb2Rlcm93ID0gX1RJRkZOb1Jvd0VuY29kZTsKKwl0aWYtPnRpZl9lbmNvZGVzdHJpcCA9IF9USUZGTm9TdHJpcEVuY29kZTsgIAorCXRpZi0+dGlmX2VuY29kZXRpbGUgPSBfVElGRk5vVGlsZUVuY29kZTsgIAorCXRpZi0+dGlmX2Nsb3NlID0gX1RJRkZ2b2lkOworCXRpZi0+dGlmX3NlZWsgPSBfVElGRk5vU2VlazsKKwl0aWYtPnRpZl9jbGVhbnVwID0gX1RJRkZ2b2lkOworCXRpZi0+dGlmX2RlZnN0cmlwc2l6ZSA9IF9USUZGRGVmYXVsdFN0cmlwU2l6ZTsKKwl0aWYtPnRpZl9kZWZ0aWxlc2l6ZSA9IF9USUZGRGVmYXVsdFRpbGVTaXplOworCXRpZi0+dGlmX2ZsYWdzICY9IH4oVElGRl9OT0JJVFJFVnxUSUZGX05PUkVBRFJBVyk7Cit9CisKK2ludAorVElGRlNldENvbXByZXNzaW9uU2NoZW1lKFRJRkYqIHRpZiwgaW50IHNjaGVtZSkKK3sKKwljb25zdCBUSUZGQ29kZWMgKmMgPSBUSUZGRmluZENPREVDKCh1aW50MTYpIHNjaGVtZSk7CisKKwlfVElGRlNldERlZmF1bHRDb21wcmVzc2lvblN0YXRlKHRpZik7CisJLyoKKwkgKiBEb24ndCB0cmVhdCBhbiB1bmtub3duIGNvbXByZXNzaW9uIHNjaGVtZSBhcyBhbiBlcnJvci4KKwkgKiBUaGlzIHBlcm1pdHMgYXBwbGljYXRpb25zIHRvIG9wZW4gZmlsZXMgd2l0aCBkYXRhIHRoYXQKKwkgKiB0aGUgbGlicmFyeSBkb2VzIG5vdCBoYXZlIGJ1aWx0aW4gc3VwcG9ydCBmb3IsIGJ1dCB3aGljaAorCSAqIG1heSBzdGlsbCBiZSBtZWFuaW5nZnVsLgorCSAqLworCXJldHVybiAoYyA/ICgqYy0+aW5pdCkodGlmLCBzY2hlbWUpIDogMSk7Cit9CisKKy8qCisgKiBPdGhlciBjb21wcmVzc2lvbiBzY2hlbWVzIG1heSBiZSByZWdpc3RlcmVkLiAgUmVnaXN0ZXJlZAorICogc2NoZW1lcyBjYW4gYWxzbyBvdmVycmlkZSB0aGUgYnVpbHRpbiB2ZXJzaW9ucyBwcm92aWRlZAorICogYnkgdGhpcyBsaWJyYXJ5LgorICovCit0eXBlZGVmIHN0cnVjdCBfY29kZWMgeworCXN0cnVjdCBfY29kZWMqIG5leHQ7CisJVElGRkNvZGVjKiBpbmZvOworfSBjb2RlY190Oworc3RhdGljIGNvZGVjX3QqIHJlZ2lzdGVyZWRDT0RFQ1MgPSBOVUxMOworCitjb25zdCBUSUZGQ29kZWMqCitUSUZGRmluZENPREVDKHVpbnQxNiBzY2hlbWUpCit7CisJY29uc3QgVElGRkNvZGVjKiBjOworCWNvZGVjX3QqIGNkOworCisJZm9yIChjZCA9IHJlZ2lzdGVyZWRDT0RFQ1M7IGNkOyBjZCA9IGNkLT5uZXh0KQorCQlpZiAoY2QtPmluZm8tPnNjaGVtZSA9PSBzY2hlbWUpCisJCQlyZXR1cm4gKChjb25zdCBUSUZGQ29kZWMqKSBjZC0+aW5mbyk7CisJZm9yIChjID0gX1RJRkZCdWlsdGluQ09ERUNTOyBjLT5uYW1lOyBjKyspCisJCWlmIChjLT5zY2hlbWUgPT0gc2NoZW1lKQorCQkJcmV0dXJuIChjKTsKKwlyZXR1cm4gKChjb25zdCBUSUZGQ29kZWMqKSAwKTsKK30KKworVElGRkNvZGVjKgorVElGRlJlZ2lzdGVyQ09ERUModWludDE2IHNjaGVtZSwgY29uc3QgY2hhciogbmFtZSwgVElGRkluaXRNZXRob2QgaW5pdCkKK3sKKwljb2RlY190KiBjZCA9IChjb2RlY190KikKKwkgICAgX1RJRkZtYWxsb2MoKHRtc2l6ZV90KShzaXplb2YgKGNvZGVjX3QpICsgc2l6ZW9mIChUSUZGQ29kZWMpICsgc3RybGVuKG5hbWUpKzEpKTsKKworCWlmIChjZCAhPSBOVUxMKSB7CisJCWNkLT5pbmZvID0gKFRJRkZDb2RlYyopICgodWludDgqKSBjZCArIHNpemVvZiAoY29kZWNfdCkpOworCQljZC0+aW5mby0+bmFtZSA9IChjaGFyKikKKwkJICAgICgodWludDgqKSBjZC0+aW5mbyArIHNpemVvZiAoVElGRkNvZGVjKSk7CisJCXN0cmNweShjZC0+aW5mby0+bmFtZSwgbmFtZSk7CisJCWNkLT5pbmZvLT5zY2hlbWUgPSBzY2hlbWU7CisJCWNkLT5pbmZvLT5pbml0ID0gaW5pdDsKKwkJY2QtPm5leHQgPSByZWdpc3RlcmVkQ09ERUNTOworCQlyZWdpc3RlcmVkQ09ERUNTID0gY2Q7CisJfSBlbHNlIHsKKwkJVElGRkVycm9yRXh0KDAsICJUSUZGUmVnaXN0ZXJDT0RFQyIsCisJCSAgICAiTm8gc3BhY2UgdG8gcmVnaXN0ZXIgY29tcHJlc3Npb24gc2NoZW1lICVzIiwgbmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gKGNkLT5pbmZvKTsKK30KKwordm9pZAorVElGRlVuUmVnaXN0ZXJDT0RFQyhUSUZGQ29kZWMqIGMpCit7CisJY29kZWNfdCogY2Q7CisJY29kZWNfdCoqIHBjZDsKKworCWZvciAocGNkID0gJnJlZ2lzdGVyZWRDT0RFQ1M7IChjZCA9ICpwY2QpOyBwY2QgPSAmY2QtPm5leHQpCisJCWlmIChjZC0+aW5mbyA9PSBjKSB7CisJCQkqcGNkID0gY2QtPm5leHQ7CisJCQlfVElGRmZyZWUoY2QpOworCQkJcmV0dXJuOworCQl9CisJVElGRkVycm9yRXh0KDAsICJUSUZGVW5SZWdpc3RlckNPREVDIiwKKwkgICAgIkNhbm5vdCByZW1vdmUgY29tcHJlc3Npb24gc2NoZW1lICVzOyBub3QgcmVnaXN0ZXJlZCIsIGMtPm5hbWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgIFRJRkZHZXRDb25maXN1cmVkQ09ERUNzKCkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogR2V0IGxpc3Qgb2YgY29uZmlndXJlZCBjb2RlY3MsIGJvdGggYnVpbHQtaW4gYW5kIHJlZ2lzdGVyZWQgYnkgdXNlci4KKyAqIENhbGxlciBpcyByZXNwb25zaWJsZSB0byBmcmVlIHRoaXMgc3RydWN0dXJlLgorICogCisgKiBAcmV0dXJuIHJldHVybnMgYXJyYXkgb2YgVElGRkNvZGVjIHJlY29yZHMgKHRoZSBsYXN0IHJlY29yZCBzaG91bGQgYmUgTlVMTCkKKyAqIG9yIE5VTEwgaWYgZnVuY3Rpb24gZmFpbGVkLgorICovCisKK1RJRkZDb2RlYyoKK1RJRkZHZXRDb25maWd1cmVkQ09ERUNzKCkKK3sKKwlpbnQgaSA9IDE7CisJY29kZWNfdCAqY2Q7CisJY29uc3QgVElGRkNvZGVjKiBjOworCVRJRkZDb2RlYyogY29kZWNzID0gTlVMTDsKKwlUSUZGQ29kZWMqIG5ld19jb2RlY3M7CisKKwlmb3IgKGNkID0gcmVnaXN0ZXJlZENPREVDUzsgY2Q7IGNkID0gY2QtPm5leHQpIHsKKwkJbmV3X2NvZGVjcyA9IChUSUZGQ29kZWMgKikKKwkJCV9USUZGcmVhbGxvYyhjb2RlY3MsIGkgKiBzaXplb2YoVElGRkNvZGVjKSk7CisJCWlmICghbmV3X2NvZGVjcykgeworCQkJX1RJRkZmcmVlIChjb2RlY3MpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJY29kZWNzID0gbmV3X2NvZGVjczsKKwkJX1RJRkZtZW1jcHkoY29kZWNzICsgaSAtIDEsIGNkLCBzaXplb2YoVElGRkNvZGVjKSk7CisJCWkrKzsKKwl9CisJZm9yIChjID0gX1RJRkZCdWlsdGluQ09ERUNTOyBjLT5uYW1lOyBjKyspIHsKKwkJaWYgKFRJRkZJc0NPREVDQ29uZmlndXJlZChjLT5zY2hlbWUpKSB7CisJCQluZXdfY29kZWNzID0gKFRJRkZDb2RlYyAqKQorCQkJCV9USUZGcmVhbGxvYyhjb2RlY3MsIGkgKiBzaXplb2YoVElGRkNvZGVjKSk7CisJCQlpZiAoIW5ld19jb2RlY3MpIHsKKwkJCQlfVElGRmZyZWUgKGNvZGVjcyk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQljb2RlY3MgPSBuZXdfY29kZWNzOworCQkJX1RJRkZtZW1jcHkoY29kZWNzICsgaSAtIDEsIChjb25zdCB2b2lkKiljLCBzaXplb2YoVElGRkNvZGVjKSk7CisJCQlpKys7CisJCX0KKwl9CisKKwluZXdfY29kZWNzID0gKFRJRkZDb2RlYyAqKSBfVElGRnJlYWxsb2MoY29kZWNzLCBpICogc2l6ZW9mKFRJRkZDb2RlYykpOworCWlmICghbmV3X2NvZGVjcykgeworCQlfVElGRmZyZWUgKGNvZGVjcyk7CisJCXJldHVybiBOVUxMOworCX0KKwljb2RlY3MgPSBuZXdfY29kZWNzOworCV9USUZGbWVtc2V0KGNvZGVjcyArIGkgLSAxLCAwLCBzaXplb2YoVElGRkNvZGVjKSk7CisKKwlyZXR1cm4gY29kZWNzOworfQorCisvKiB2aW06IHNldCB0cz04IHN0cz04IHN3PTggbm9ldDogKi8KKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBjCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogZmlsbC1jb2x1bW46IDc4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2Rpci5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMyMTJjMAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2Rpci5jCkBAIC0wLDAgKzEsMTcwNSBAQAorLyogJElkOiB0aWZfZGlyLmMsdiAxLjEyMSAyMDE1LTA1LTMxIDIzOjExOjQzIGJmcmllc2VuIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVElGRiBMaWJyYXJ5LgorICoKKyAqIERpcmVjdG9yeSBUYWcgR2V0ICYgU2V0IFJvdXRpbmVzLgorICogKGFuZCBhbHNvIHNvbWUgbWlzY2VsbGFuZW91cyBzdHVmZikKKyAqLworI2luY2x1ZGUgInRpZmZpb3AuaCIKKworLyoKKyAqIFRoZXNlIGFyZSB1c2VkIGluIHRoZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjb2RlLi4uCisgKi8KKyNkZWZpbmUgREFUQVRZUEVfVk9JRAkJMCAgICAgICAvKiAhdW50eXBlZCBkYXRhICovCisjZGVmaW5lIERBVEFUWVBFX0lOVAkJMSAgICAgICAvKiAhc2lnbmVkIGludGVnZXIgZGF0YSAqLworI2RlZmluZSBEQVRBVFlQRV9VSU5UCQkyICAgICAgIC8qICF1bnNpZ25lZCBpbnRlZ2VyIGRhdGEgKi8KKyNkZWZpbmUgREFUQVRZUEVfSUVFRUZQCQkzICAgICAgIC8qICFJRUVFIGZsb2F0aW5nIHBvaW50IGRhdGEgKi8KKworc3RhdGljIHZvaWQKK3NldEJ5dGVBcnJheSh2b2lkKiogdnBwLCB2b2lkKiB2cCwgc2l6ZV90IG5tZW1iLCBzaXplX3QgZWxlbV9zaXplKQoreworCWlmICgqdnBwKQorCQlfVElGRmZyZWUoKnZwcCksICp2cHAgPSAwOworCWlmICh2cCkgeworCQl0bXNpemVfdCBieXRlcyA9ICh0bXNpemVfdCkobm1lbWIgKiBlbGVtX3NpemUpOworCQlpZiAoZWxlbV9zaXplICYmIGJ5dGVzIC8gZWxlbV9zaXplID09IG5tZW1iKQorCQkJKnZwcCA9ICh2b2lkKikgX1RJRkZtYWxsb2MoYnl0ZXMpOworCQlpZiAoKnZwcCkKKwkJCV9USUZGbWVtY3B5KCp2cHAsIHZwLCBieXRlcyk7CisJfQorfQordm9pZCBfVElGRnNldEJ5dGVBcnJheSh2b2lkKiogdnBwLCB2b2lkKiB2cCwgdWludDMyIG4pCisgICAgeyBzZXRCeXRlQXJyYXkodnBwLCB2cCwgbiwgMSk7IH0KK3ZvaWQgX1RJRkZzZXRTdHJpbmcoY2hhcioqIGNwcCwgY2hhciogY3ApCisgICAgeyBzZXRCeXRlQXJyYXkoKHZvaWQqKikgY3BwLCAodm9pZCopIGNwLCBzdHJsZW4oY3ApKzEsIDEpOyB9Cit2b2lkIF9USUZGc2V0TlN0cmluZyhjaGFyKiogY3BwLCBjaGFyKiBjcCwgdWludDMyIG4pCisgICAgeyBzZXRCeXRlQXJyYXkoKHZvaWQqKikgY3BwLCAodm9pZCopIGNwLCBuLCAxKTsgfQordm9pZCBfVElGRnNldFNob3J0QXJyYXkodWludDE2Kiogd3BwLCB1aW50MTYqIHdwLCB1aW50MzIgbikKKyAgICB7IHNldEJ5dGVBcnJheSgodm9pZCoqKSB3cHAsICh2b2lkKikgd3AsIG4sIHNpemVvZiAodWludDE2KSk7IH0KK3ZvaWQgX1RJRkZzZXRMb25nQXJyYXkodWludDMyKiogbHBwLCB1aW50MzIqIGxwLCB1aW50MzIgbikKKyAgICB7IHNldEJ5dGVBcnJheSgodm9pZCoqKSBscHAsICh2b2lkKikgbHAsIG4sIHNpemVvZiAodWludDMyKSk7IH0KK3ZvaWQgX1RJRkZzZXRMb25nOEFycmF5KHVpbnQ2NCoqIGxwcCwgdWludDY0KiBscCwgdWludDMyIG4pCisgICAgeyBzZXRCeXRlQXJyYXkoKHZvaWQqKikgbHBwLCAodm9pZCopIGxwLCBuLCBzaXplb2YgKHVpbnQ2NCkpOyB9Cit2b2lkIF9USUZGc2V0RmxvYXRBcnJheShmbG9hdCoqIGZwcCwgZmxvYXQqIGZwLCB1aW50MzIgbikKKyAgICB7IHNldEJ5dGVBcnJheSgodm9pZCoqKSBmcHAsICh2b2lkKikgZnAsIG4sIHNpemVvZiAoZmxvYXQpKTsgfQordm9pZCBfVElGRnNldERvdWJsZUFycmF5KGRvdWJsZSoqIGRwcCwgZG91YmxlKiBkcCwgdWludDMyIG4pCisgICAgeyBzZXRCeXRlQXJyYXkoKHZvaWQqKikgZHBwLCAodm9pZCopIGRwLCBuLCBzaXplb2YgKGRvdWJsZSkpOyB9CisKK3N0YXRpYyB2b2lkCitzZXREb3VibGVBcnJheU9uZVZhbHVlKGRvdWJsZSoqIHZwcCwgZG91YmxlIHZhbHVlLCBzaXplX3Qgbm1lbWIpCit7CisJaWYgKCp2cHApCisJCV9USUZGZnJlZSgqdnBwKTsKKwkqdnBwID0gX1RJRkZtYWxsb2Mobm1lbWIqc2l6ZW9mKGRvdWJsZSkpOworCWlmICgqdnBwKQorCXsKKwkJd2hpbGUgKG5tZW1iLS0pCisJCQkoKGRvdWJsZSopKnZwcClbbm1lbWJdID0gdmFsdWU7CisJfQorfQorCisvKgorICogSW5zdGFsbCBleHRyYSBzYW1wbGVzIGluZm9ybWF0aW9uLgorICovCitzdGF0aWMgaW50CitzZXRFeHRyYVNhbXBsZXMoVElGRkRpcmVjdG9yeSogdGQsIHZhX2xpc3QgYXAsIHVpbnQzMiogdikKK3sKKy8qIFhYWDogVW5hc3NvY2lhdGVkIGFscGhhIGRhdGEgPT0gOTk5IGlzIGEga25vd24gQ29yZWwgRHJhdyBidWcsIHNlZSBiZWxvdyAqLworI2RlZmluZSBFWFRSQVNBTVBMRV9DT1JFTF9VTkFTU0FMUEhBIDk5OSAKKworCXVpbnQxNiogdmE7CisJdWludDMyIGk7CisKKwkqdiA9ICh1aW50MTYpIHZhX2FyZyhhcCwgdWludDE2X3ZhcCk7CisJaWYgKCh1aW50MTYpICp2ID4gdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCkKKwkJcmV0dXJuIDA7CisJdmEgPSB2YV9hcmcoYXAsIHVpbnQxNiopOworCWlmICgqdiA+IDAgJiYgdmEgPT0gTlVMTCkJCS8qIHR5cGljYWxseSBtaXNzaW5nIHBhcmFtICovCisJCXJldHVybiAwOworCWZvciAoaSA9IDA7IGkgPCAqdjsgaSsrKSB7CisJCWlmICh2YVtpXSA+IEVYVFJBU0FNUExFX1VOQVNTQUxQSEEpIHsKKwkJCS8qCisJCQkgKiBYWFg6IENvcmVsIERyYXcgaXMga25vd24gdG8gcHJvZHVjZSBpbmNvcnJlY3QKKwkJCSAqIEV4dHJhU2FtcGxlcyB0YWdzIHdoaWNoIG11c3QgYmUgcGF0Y2hlZCBoZXJlIGlmIHdlCisJCQkgKiB3YW50IHRvIGJlIGFibGUgdG8gb3BlbiBzb21lIG9mIHRoZSBkYW1hZ2VkIFRJRkYKKwkJCSAqIGZpbGVzOiAKKwkJCSAqLworCQkJaWYgKHZhW2ldID09IEVYVFJBU0FNUExFX0NPUkVMX1VOQVNTQUxQSEEpCisJCQkJdmFbaV0gPSBFWFRSQVNBTVBMRV9VTkFTU0FMUEhBOworCQkJZWxzZQorCQkJCXJldHVybiAwOworCQl9CisJfQorCXRkLT50ZF9leHRyYXNhbXBsZXMgPSAodWludDE2KSAqdjsKKwlfVElGRnNldFNob3J0QXJyYXkoJnRkLT50ZF9zYW1wbGVpbmZvLCB2YSwgdGQtPnRkX2V4dHJhc2FtcGxlcyk7CisJcmV0dXJuIDE7CisKKyN1bmRlZiBFWFRSQVNBTVBMRV9DT1JFTF9VTkFTU0FMUEhBCit9CisKKy8qCisgKiBDb25maXJtIHdlIGhhdmUgInNhbXBsZXNwZXJwaXhlbCIgaW5rIG5hbWVzIHNlcGFyYXRlZCBieSBcMC4gIFJldHVybnMgCisgKiB6ZXJvIGlmIHRoZSBpbmsgbmFtZXMgYXJlIG5vdCBhcyBleHBlY3RlZC4KKyAqLworc3RhdGljIHVpbnQzMgorY2hlY2tJbmtOYW1lc1N0cmluZyhUSUZGKiB0aWYsIHVpbnQzMiBzbGVuLCBjb25zdCBjaGFyKiBzKQoreworCVRJRkZEaXJlY3RvcnkqIHRkID0gJnRpZi0+dGlmX2RpcjsKKwl1aW50MTYgaSA9IHRkLT50ZF9zYW1wbGVzcGVycGl4ZWw7CisKKwlpZiAoc2xlbiA+IDApIHsKKwkJY29uc3QgY2hhciogZXAgPSBzK3NsZW47CisJCWNvbnN0IGNoYXIqIGNwID0gczsKKwkJZm9yICg7IGkgPiAwOyBpLS0pIHsKKwkJCWZvciAoOyBjcCA8IGVwICYmICpjcCAhPSAnXDAnOyBjcCsrKSB7fQorCQkJaWYgKGNwID49IGVwKQorCQkJCWdvdG8gYmFkOworCQkJY3ArKzsJCQkJLyogc2tpcCBcMCAqLworCQl9CisJCXJldHVybiAoKHVpbnQzMikoY3AtcykpOworCX0KK2JhZDoKKwlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgIlRJRkZTZXRGaWVsZCIsCisJICAgICIlczogSW52YWxpZCBJbmtOYW1lcyB2YWx1ZTsgZXhwZWN0aW5nICVkIG5hbWVzLCBmb3VuZCAlZCIsCisJICAgIHRpZi0+dGlmX25hbWUsCisJICAgIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwsCisJICAgIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwtaSk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorX1RJRkZWU2V0RmllbGQoVElGRiogdGlmLCB1aW50MzIgdGFnLCB2YV9saXN0IGFwKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIl9USUZGVlNldEZpZWxkIjsKKworCVRJRkZEaXJlY3RvcnkqIHRkID0gJnRpZi0+dGlmX2RpcjsKKwlpbnQgc3RhdHVzID0gMTsKKwl1aW50MzIgdjMyLCBpLCB2OworICAgIGRvdWJsZSBkYmx2YWw7CisJY2hhciogczsKKwljb25zdCBUSUZGRmllbGQgKmZpcCA9IFRJRkZGaW5kRmllbGQodGlmLCB0YWcsIFRJRkZfQU5ZKTsKKwl1aW50MzIgc3RhbmRhcmRfdGFnID0gdGFnOworCWlmKCBmaXAgPT0gTlVMTCApIC8qIGNhbm5vdCBoYXBwZW4gc2luY2UgT2tUb0NoYW5nZVRhZygpIGFscmVhZHkgY2hlY2tzIGl0ICovCisJICAgIHJldHVybiAwOworCS8qCisJICogV2Ugd2FudCB0byBmb3JjZSB0aGUgY3VzdG9tIGNvZGUgdG8gYmUgdXNlZCBmb3IgY3VzdG9tCisJICogZmllbGRzIGV2ZW4gaWYgdGhlIHRhZyBoYXBwZW5zIHRvIG1hdGNoIGEgd2VsbCBrbm93biAKKwkgKiBvbmUgLSBpbXBvcnRhbnQgZm9yIHJlaW50ZXJwcmV0ZWQgaGFuZGxpbmcgb2Ygc3RhbmRhcmQKKwkgKiB0YWcgdmFsdWVzIGluIGN1c3RvbSBkaXJlY3RvcmllcyAoaWUuIEVYSUYpIAorCSAqLworCWlmIChmaXAtPmZpZWxkX2JpdCA9PSBGSUVMRF9DVVNUT00pIHsKKwkJc3RhbmRhcmRfdGFnID0gMDsKKwl9CisKKwlzd2l0Y2ggKHN0YW5kYXJkX3RhZykgeworCWNhc2UgVElGRlRBR19TVUJGSUxFVFlQRToKKwkJdGQtPnRkX3N1YmZpbGV0eXBlID0gKHVpbnQzMikgdmFfYXJnKGFwLCB1aW50MzIpOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfSU1BR0VXSURUSDoKKwkJdGQtPnRkX2ltYWdld2lkdGggPSAodWludDMyKSB2YV9hcmcoYXAsIHVpbnQzMik7CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19JTUFHRUxFTkdUSDoKKwkJdGQtPnRkX2ltYWdlbGVuZ3RoID0gKHVpbnQzMikgdmFfYXJnKGFwLCB1aW50MzIpOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfQklUU1BFUlNBTVBMRToKKwkJdGQtPnRkX2JpdHNwZXJzYW1wbGUgPSAodWludDE2KSB2YV9hcmcoYXAsIHVpbnQxNl92YXApOworCQkvKgorCQkgKiBJZiB0aGUgZGF0YSByZXF1aXJlIHBvc3QtZGVjb2RpbmcgcHJvY2Vzc2luZyB0byBieXRlLXN3YXAKKwkJICogc2FtcGxlcywgc2V0IGl0IHVwIGhlcmUuICBOb3RlIHRoYXQgc2luY2UgdGFncyBhcmUgcmVxdWlyZWQKKwkJICogdG8gYmUgb3JkZXJlZCwgY29tcHJlc3Npb24gY29kZSBjYW4gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvdXIKKwkJICogaW4gdGhlIHNldHVwIG1ldGhvZCBpZiBpdCB3YW50cyB0byByb2xsIHRoZSBwb3N0IGRlY29kaW5nCisJCSAqIHdvcmsgaW4gd2l0aCBpdHMgbm9ybWFsIHdvcmsuCisJCSAqLworCQlpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1NXQUIpIHsKKwkJCWlmICh0ZC0+dGRfYml0c3BlcnNhbXBsZSA9PSA4KQorCQkJCXRpZi0+dGlmX3Bvc3RkZWNvZGUgPSBfVElGRk5vUG9zdERlY29kZTsKKwkJCWVsc2UgaWYgKHRkLT50ZF9iaXRzcGVyc2FtcGxlID09IDE2KQorCQkJCXRpZi0+dGlmX3Bvc3RkZWNvZGUgPSBfVElGRlN3YWIxNkJpdERhdGE7CisJCQllbHNlIGlmICh0ZC0+dGRfYml0c3BlcnNhbXBsZSA9PSAyNCkKKwkJCQl0aWYtPnRpZl9wb3N0ZGVjb2RlID0gX1RJRkZTd2FiMjRCaXREYXRhOworCQkJZWxzZSBpZiAodGQtPnRkX2JpdHNwZXJzYW1wbGUgPT0gMzIpCisJCQkJdGlmLT50aWZfcG9zdGRlY29kZSA9IF9USUZGU3dhYjMyQml0RGF0YTsKKwkJCWVsc2UgaWYgKHRkLT50ZF9iaXRzcGVyc2FtcGxlID09IDY0KQorCQkJCXRpZi0+dGlmX3Bvc3RkZWNvZGUgPSBfVElGRlN3YWI2NEJpdERhdGE7CisJCQllbHNlIGlmICh0ZC0+dGRfYml0c3BlcnNhbXBsZSA9PSAxMjgpIC8qIHR3byA2NCdzICovCisJCQkJdGlmLT50aWZfcG9zdGRlY29kZSA9IF9USUZGU3dhYjY0Qml0RGF0YTsKKwkJfQorCQlicmVhazsKKwljYXNlIFRJRkZUQUdfQ09NUFJFU1NJT046CisJCXYgPSAodWludDE2KSB2YV9hcmcoYXAsIHVpbnQxNl92YXApOworCQkvKgorCQkgKiBJZiB3ZSdyZSBjaGFuZ2luZyB0aGUgY29tcHJlc3Npb24gc2NoZW1lLCB0aGUgbm90aWZ5IHRoZQorCQkgKiBwcmV2aW91cyBtb2R1bGUgc28gdGhhdCBpdCBjYW4gY2xlYW51cCBhbnkgc3RhdGUgaXQncworCQkgKiBzZXR1cC4KKwkJICovCisJCWlmIChUSUZGRmllbGRTZXQodGlmLCBGSUVMRF9DT01QUkVTU0lPTikpIHsKKwkJCWlmICgodWludDMyKXRkLT50ZF9jb21wcmVzc2lvbiA9PSB2KQorCQkJCWJyZWFrOworCQkJKCp0aWYtPnRpZl9jbGVhbnVwKSh0aWYpOworCQkJdGlmLT50aWZfZmxhZ3MgJj0gflRJRkZfQ09ERVJTRVRVUDsKKwkJfQorCQkvKgorCQkgKiBTZXR1cCBuZXcgY29tcHJlc3Npb24gcm91dGluZSBzdGF0ZS4KKwkJICovCisJCWlmKCAoc3RhdHVzID0gVElGRlNldENvbXByZXNzaW9uU2NoZW1lKHRpZiwgdikpICE9IDAgKQorCQkgICAgdGQtPnRkX2NvbXByZXNzaW9uID0gKHVpbnQxNikgdjsKKwkJZWxzZQorCQkgICAgc3RhdHVzID0gMDsKKwkJYnJlYWs7CisJY2FzZSBUSUZGVEFHX1BIT1RPTUVUUklDOgorCQl0ZC0+dGRfcGhvdG9tZXRyaWMgPSAodWludDE2KSB2YV9hcmcoYXAsIHVpbnQxNl92YXApOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfVEhSRVNISE9MRElORzoKKwkJdGQtPnRkX3RocmVzaGhvbGRpbmcgPSAodWludDE2KSB2YV9hcmcoYXAsIHVpbnQxNl92YXApOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfRklMTE9SREVSOgorCQl2ID0gKHVpbnQxNikgdmFfYXJnKGFwLCB1aW50MTZfdmFwKTsKKwkJaWYgKHYgIT0gRklMTE9SREVSX0xTQjJNU0IgJiYgdiAhPSBGSUxMT1JERVJfTVNCMkxTQikKKwkJCWdvdG8gYmFkdmFsdWU7CisJCXRkLT50ZF9maWxsb3JkZXIgPSAodWludDE2KSB2OworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfT1JJRU5UQVRJT046CisJCXYgPSAodWludDE2KSB2YV9hcmcoYXAsIHVpbnQxNl92YXApOworCQlpZiAodiA8IE9SSUVOVEFUSU9OX1RPUExFRlQgfHwgT1JJRU5UQVRJT05fTEVGVEJPVCA8IHYpCisJCQlnb3RvIGJhZHZhbHVlOworCQllbHNlCisJCQl0ZC0+dGRfb3JpZW50YXRpb24gPSAodWludDE2KSB2OworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfU0FNUExFU1BFUlBJWEVMOgorCQl2ID0gKHVpbnQxNikgdmFfYXJnKGFwLCB1aW50MTZfdmFwKTsKKwkJaWYgKHYgPT0gMCkKKwkJCWdvdG8gYmFkdmFsdWU7CisJCXRkLT50ZF9zYW1wbGVzcGVycGl4ZWwgPSAodWludDE2KSB2OworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfUk9XU1BFUlNUUklQOgorCQl2MzIgPSAodWludDMyKSB2YV9hcmcoYXAsIHVpbnQzMik7CisJCWlmICh2MzIgPT0gMCkKKwkJCWdvdG8gYmFkdmFsdWUzMjsKKwkJdGQtPnRkX3Jvd3NwZXJzdHJpcCA9IHYzMjsKKwkJaWYgKCFUSUZGRmllbGRTZXQodGlmLCBGSUVMRF9USUxFRElNRU5TSU9OUykpIHsKKwkJCXRkLT50ZF90aWxlbGVuZ3RoID0gdjMyOworCQkJdGQtPnRkX3RpbGV3aWR0aCA9IHRkLT50ZF9pbWFnZXdpZHRoOworCQl9CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19NSU5TQU1QTEVWQUxVRToKKwkJdGQtPnRkX21pbnNhbXBsZXZhbHVlID0gKHVpbnQxNikgdmFfYXJnKGFwLCB1aW50MTZfdmFwKTsKKwkJYnJlYWs7CisJY2FzZSBUSUZGVEFHX01BWFNBTVBMRVZBTFVFOgorCQl0ZC0+dGRfbWF4c2FtcGxldmFsdWUgPSAodWludDE2KSB2YV9hcmcoYXAsIHVpbnQxNl92YXApOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfU01JTlNBTVBMRVZBTFVFOgorCQlpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1BFUlNBTVBMRSkKKwkJCV9USUZGc2V0RG91YmxlQXJyYXkoJnRkLT50ZF9zbWluc2FtcGxldmFsdWUsIHZhX2FyZyhhcCwgZG91YmxlKiksIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwpOworCQllbHNlCisJCQlzZXREb3VibGVBcnJheU9uZVZhbHVlKCZ0ZC0+dGRfc21pbnNhbXBsZXZhbHVlLCB2YV9hcmcoYXAsIGRvdWJsZSksIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwpOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfU01BWFNBTVBMRVZBTFVFOgorCQlpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1BFUlNBTVBMRSkKKwkJCV9USUZGc2V0RG91YmxlQXJyYXkoJnRkLT50ZF9zbWF4c2FtcGxldmFsdWUsIHZhX2FyZyhhcCwgZG91YmxlKiksIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwpOworCQllbHNlCisJCQlzZXREb3VibGVBcnJheU9uZVZhbHVlKCZ0ZC0+dGRfc21heHNhbXBsZXZhbHVlLCB2YV9hcmcoYXAsIGRvdWJsZSksIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwpOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfWFJFU09MVVRJT046CisgICAgICAgIGRibHZhbCA9IHZhX2FyZyhhcCwgZG91YmxlKTsKKyAgICAgICAgaWYoIGRibHZhbCA8IDAgKQorICAgICAgICAgICAgZ290byBiYWR2YWx1ZWRvdWJsZTsKKwkJdGQtPnRkX3hyZXNvbHV0aW9uID0gKGZsb2F0KSBkYmx2YWw7CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19ZUkVTT0xVVElPTjoKKyAgICAgICAgZGJsdmFsID0gdmFfYXJnKGFwLCBkb3VibGUpOworICAgICAgICBpZiggZGJsdmFsIDwgMCApCisgICAgICAgICAgICBnb3RvIGJhZHZhbHVlZG91YmxlOworCQl0ZC0+dGRfeXJlc29sdXRpb24gPSAoZmxvYXQpIGRibHZhbDsKKwkJYnJlYWs7CisJY2FzZSBUSUZGVEFHX1BMQU5BUkNPTkZJRzoKKwkJdiA9ICh1aW50MTYpIHZhX2FyZyhhcCwgdWludDE2X3ZhcCk7CisJCWlmICh2ICE9IFBMQU5BUkNPTkZJR19DT05USUcgJiYgdiAhPSBQTEFOQVJDT05GSUdfU0VQQVJBVEUpCisJCQlnb3RvIGJhZHZhbHVlOworCQl0ZC0+dGRfcGxhbmFyY29uZmlnID0gKHVpbnQxNikgdjsKKwkJYnJlYWs7CisJY2FzZSBUSUZGVEFHX1hQT1NJVElPTjoKKwkJdGQtPnRkX3hwb3NpdGlvbiA9IChmbG9hdCkgdmFfYXJnKGFwLCBkb3VibGUpOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfWVBPU0lUSU9OOgorCQl0ZC0+dGRfeXBvc2l0aW9uID0gKGZsb2F0KSB2YV9hcmcoYXAsIGRvdWJsZSk7CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19SRVNPTFVUSU9OVU5JVDoKKwkJdiA9ICh1aW50MTYpIHZhX2FyZyhhcCwgdWludDE2X3ZhcCk7CisJCWlmICh2IDwgUkVTVU5JVF9OT05FIHx8IFJFU1VOSVRfQ0VOVElNRVRFUiA8IHYpCisJCQlnb3RvIGJhZHZhbHVlOworCQl0ZC0+dGRfcmVzb2x1dGlvbnVuaXQgPSAodWludDE2KSB2OworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfUEFHRU5VTUJFUjoKKwkJdGQtPnRkX3BhZ2VudW1iZXJbMF0gPSAodWludDE2KSB2YV9hcmcoYXAsIHVpbnQxNl92YXApOworCQl0ZC0+dGRfcGFnZW51bWJlclsxXSA9ICh1aW50MTYpIHZhX2FyZyhhcCwgdWludDE2X3ZhcCk7CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19IQUxGVE9ORUhJTlRTOgorCQl0ZC0+dGRfaGFsZnRvbmVoaW50c1swXSA9ICh1aW50MTYpIHZhX2FyZyhhcCwgdWludDE2X3ZhcCk7CisJCXRkLT50ZF9oYWxmdG9uZWhpbnRzWzFdID0gKHVpbnQxNikgdmFfYXJnKGFwLCB1aW50MTZfdmFwKTsKKwkJYnJlYWs7CisJY2FzZSBUSUZGVEFHX0NPTE9STUFQOgorCQl2MzIgPSAodWludDMyKSgxTDw8dGQtPnRkX2JpdHNwZXJzYW1wbGUpOworCQlfVElGRnNldFNob3J0QXJyYXkoJnRkLT50ZF9jb2xvcm1hcFswXSwgdmFfYXJnKGFwLCB1aW50MTYqKSwgdjMyKTsKKwkJX1RJRkZzZXRTaG9ydEFycmF5KCZ0ZC0+dGRfY29sb3JtYXBbMV0sIHZhX2FyZyhhcCwgdWludDE2KiksIHYzMik7CisJCV9USUZGc2V0U2hvcnRBcnJheSgmdGQtPnRkX2NvbG9ybWFwWzJdLCB2YV9hcmcoYXAsIHVpbnQxNiopLCB2MzIpOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfRVhUUkFTQU1QTEVTOgorCQlpZiAoIXNldEV4dHJhU2FtcGxlcyh0ZCwgYXAsICZ2KSkKKwkJCWdvdG8gYmFkdmFsdWU7CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19NQVRURUlORzoKKwkJdGQtPnRkX2V4dHJhc2FtcGxlcyA9ICAoKCh1aW50MTYpIHZhX2FyZyhhcCwgdWludDE2X3ZhcCkpICE9IDApOworCQlpZiAodGQtPnRkX2V4dHJhc2FtcGxlcykgeworCQkJdWludDE2IHN2ID0gRVhUUkFTQU1QTEVfQVNTT0NBTFBIQTsKKwkJCV9USUZGc2V0U2hvcnRBcnJheSgmdGQtPnRkX3NhbXBsZWluZm8sICZzdiwgMSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUSUZGVEFHX1RJTEVXSURUSDoKKwkJdjMyID0gKHVpbnQzMikgdmFfYXJnKGFwLCB1aW50MzIpOworCQlpZiAodjMyICUgMTYpIHsKKwkJCWlmICh0aWYtPnRpZl9tb2RlICE9IE9fUkRPTkxZKQorCQkJCWdvdG8gYmFkdmFsdWUzMjsKKwkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIHRpZi0+dGlmX25hbWUsCisJCQkJIk5vbnN0YW5kYXJkIHRpbGUgd2lkdGggJWQsIGNvbnZlcnQgZmlsZSIsIHYzMik7CisJCX0KKwkJdGQtPnRkX3RpbGV3aWR0aCA9IHYzMjsKKwkJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9JU1RJTEVEOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfVElMRUxFTkdUSDoKKwkJdjMyID0gKHVpbnQzMikgdmFfYXJnKGFwLCB1aW50MzIpOworCQlpZiAodjMyICUgMTYpIHsKKwkJCWlmICh0aWYtPnRpZl9tb2RlICE9IE9fUkRPTkxZKQorCQkJCWdvdG8gYmFkdmFsdWUzMjsKKwkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIHRpZi0+dGlmX25hbWUsCisJCQkgICAgIk5vbnN0YW5kYXJkIHRpbGUgbGVuZ3RoICVkLCBjb252ZXJ0IGZpbGUiLCB2MzIpOworCQl9CisJCXRkLT50ZF90aWxlbGVuZ3RoID0gdjMyOworCQl0aWYtPnRpZl9mbGFncyB8PSBUSUZGX0lTVElMRUQ7CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19USUxFREVQVEg6CisJCXYzMiA9ICh1aW50MzIpIHZhX2FyZyhhcCwgdWludDMyKTsKKwkJaWYgKHYzMiA9PSAwKQorCQkJZ290byBiYWR2YWx1ZTMyOworCQl0ZC0+dGRfdGlsZWRlcHRoID0gdjMyOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfREFUQVRZUEU6CisJCXYgPSAodWludDE2KSB2YV9hcmcoYXAsIHVpbnQxNl92YXApOworCQlzd2l0Y2ggKHYpIHsKKwkJY2FzZSBEQVRBVFlQRV9WT0lEOgl2ID0gU0FNUExFRk9STUFUX1ZPSUQ7CWJyZWFrOworCQljYXNlIERBVEFUWVBFX0lOVDoJdiA9IFNBTVBMRUZPUk1BVF9JTlQ7CWJyZWFrOworCQljYXNlIERBVEFUWVBFX1VJTlQ6CXYgPSBTQU1QTEVGT1JNQVRfVUlOVDsJYnJlYWs7CisJCWNhc2UgREFUQVRZUEVfSUVFRUZQOgl2ID0gU0FNUExFRk9STUFUX0lFRUVGUDticmVhazsKKwkJZGVmYXVsdDoJCWdvdG8gYmFkdmFsdWU7CisJCX0KKwkJdGQtPnRkX3NhbXBsZWZvcm1hdCA9ICh1aW50MTYpIHY7CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19TQU1QTEVGT1JNQVQ6CisJCXYgPSAodWludDE2KSB2YV9hcmcoYXAsIHVpbnQxNl92YXApOworCQlpZiAodiA8IFNBTVBMRUZPUk1BVF9VSU5UIHx8IFNBTVBMRUZPUk1BVF9DT01QTEVYSUVFRUZQIDwgdikKKwkJCWdvdG8gYmFkdmFsdWU7CisJCXRkLT50ZF9zYW1wbGVmb3JtYXQgPSAodWludDE2KSB2OworCisJCS8qICBUcnkgdG8gZml4IHVwIHRoZSBTV0FCIGZ1bmN0aW9uIGZvciBjb21wbGV4IGRhdGEuICovCisJCWlmKCB0ZC0+dGRfc2FtcGxlZm9ybWF0ID09IFNBTVBMRUZPUk1BVF9DT01QTEVYSU5UCisJCSAgICAmJiB0ZC0+dGRfYml0c3BlcnNhbXBsZSA9PSAzMgorCQkgICAgJiYgdGlmLT50aWZfcG9zdGRlY29kZSA9PSBfVElGRlN3YWIzMkJpdERhdGEgKQorCQkgICAgdGlmLT50aWZfcG9zdGRlY29kZSA9IF9USUZGU3dhYjE2Qml0RGF0YTsKKwkJZWxzZSBpZiggKHRkLT50ZF9zYW1wbGVmb3JtYXQgPT0gU0FNUExFRk9STUFUX0NPTVBMRVhJTlQKKwkJCSAgfHwgdGQtPnRkX3NhbXBsZWZvcm1hdCA9PSBTQU1QTEVGT1JNQVRfQ09NUExFWElFRUVGUCkKKwkJCSAmJiB0ZC0+dGRfYml0c3BlcnNhbXBsZSA9PSA2NAorCQkJICYmIHRpZi0+dGlmX3Bvc3RkZWNvZGUgPT0gX1RJRkZTd2FiNjRCaXREYXRhICkKKwkJICAgIHRpZi0+dGlmX3Bvc3RkZWNvZGUgPSBfVElGRlN3YWIzMkJpdERhdGE7CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19JTUFHRURFUFRIOgorCQl0ZC0+dGRfaW1hZ2VkZXB0aCA9ICh1aW50MzIpIHZhX2FyZyhhcCwgdWludDMyKTsKKwkJYnJlYWs7CisJY2FzZSBUSUZGVEFHX1NVQklGRDoKKwkJaWYgKCh0aWYtPnRpZl9mbGFncyAmIFRJRkZfSU5TVUJJRkQpID09IDApIHsKKwkJCXRkLT50ZF9uc3ViaWZkID0gKHVpbnQxNikgdmFfYXJnKGFwLCB1aW50MTZfdmFwKTsKKwkJCV9USUZGc2V0TG9uZzhBcnJheSgmdGQtPnRkX3N1YmlmZCwgKHVpbnQ2NCopIHZhX2FyZyhhcCwgdWludDY0KiksCisJCQkgICAgKGxvbmcpIHRkLT50ZF9uc3ViaWZkKTsKKwkJfSBlbHNlIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJICAgICAiJXM6IFNvcnJ5LCBjYW5ub3QgbmVzdCBTdWJJRkRzIiwKKwkJCQkgICAgIHRpZi0+dGlmX25hbWUpOworCQkJc3RhdHVzID0gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIFRJRkZUQUdfWUNCQ1JQT1NJVElPTklORzoKKwkJdGQtPnRkX3ljYmNycG9zaXRpb25pbmcgPSAodWludDE2KSB2YV9hcmcoYXAsIHVpbnQxNl92YXApOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfWUNCQ1JTVUJTQU1QTElORzoKKwkJdGQtPnRkX3ljYmNyc3Vic2FtcGxpbmdbMF0gPSAodWludDE2KSB2YV9hcmcoYXAsIHVpbnQxNl92YXApOworCQl0ZC0+dGRfeWNiY3JzdWJzYW1wbGluZ1sxXSA9ICh1aW50MTYpIHZhX2FyZyhhcCwgdWludDE2X3ZhcCk7CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19UUkFOU0ZFUkZVTkNUSU9OOgorCQl2ID0gKHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwgLSB0ZC0+dGRfZXh0cmFzYW1wbGVzKSA+IDEgPyAzIDogMTsKKwkJZm9yIChpID0gMDsgaSA8IHY7IGkrKykKKwkJCV9USUZGc2V0U2hvcnRBcnJheSgmdGQtPnRkX3RyYW5zZmVyZnVuY3Rpb25baV0sCisJCQkgICAgdmFfYXJnKGFwLCB1aW50MTYqKSwgMUw8PHRkLT50ZF9iaXRzcGVyc2FtcGxlKTsKKwkJYnJlYWs7CisJY2FzZSBUSUZGVEFHX1JFRkVSRU5DRUJMQUNLV0hJVEU6CisJCS8qIFhYWCBzaG91bGQgY2hlY2sgZm9yIG51bGwgcmFuZ2UgKi8KKwkJX1RJRkZzZXRGbG9hdEFycmF5KCZ0ZC0+dGRfcmVmYmxhY2t3aGl0ZSwgdmFfYXJnKGFwLCBmbG9hdCopLCA2KTsKKwkJYnJlYWs7CisJY2FzZSBUSUZGVEFHX0lOS05BTUVTOgorCQl2ID0gKHVpbnQxNikgdmFfYXJnKGFwLCB1aW50MTZfdmFwKTsKKwkJcyA9IHZhX2FyZyhhcCwgY2hhciopOworCQl2ID0gY2hlY2tJbmtOYW1lc1N0cmluZyh0aWYsIHYsIHMpOworCQlzdGF0dXMgPSB2ID4gMDsKKwkJaWYoIHYgPiAwICkgeworCQkJX1RJRkZzZXROU3RyaW5nKCZ0ZC0+dGRfaW5rbmFtZXMsIHMsIHYpOworCQkJdGQtPnRkX2lua25hbWVzbGVuID0gdjsKKwkJfQorCQlicmVhazsKKwljYXNlIFRJRkZUQUdfUEVSU0FNUExFOgorCQl2ID0gKHVpbnQxNikgdmFfYXJnKGFwLCB1aW50MTZfdmFwKTsKKwkJaWYoIHYgPT0gUEVSU0FNUExFX01VTFRJICkKKwkJCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfUEVSU0FNUExFOworCQllbHNlCisJCQl0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9QRVJTQU1QTEU7CisJCWJyZWFrOworCWRlZmF1bHQ6IHsKKwkJVElGRlRhZ1ZhbHVlICp0djsKKwkJaW50IHR2X3NpemUsIGlDdXN0b207CisKKwkJLyoKKwkJICogVGhpcyBjYW4gaGFwcGVuIGlmIG11bHRpcGxlIGltYWdlcyBhcmUgb3BlbiB3aXRoIGRpZmZlcmVudAorCQkgKiBjb2RlY3Mgd2hpY2ggaGF2ZSBwcml2YXRlIHRhZ3MuICBUaGUgZ2xvYmFsIHRhZyBpbmZvcm1hdGlvbgorCQkgKiB0YWJsZSBtYXkgdGhlbiBoYXZlIHRhZ3MgdGhhdCBhcmUgdmFsaWQgZm9yIG9uZSBmaWxlIGJ1dCBub3QKKwkJICogdGhlIG90aGVyLiBJZiB0aGUgY2xpZW50IHRyaWVzIHRvIHNldCBhIHRhZyB0aGF0IGlzIG5vdCB2YWxpZAorCQkgKiBmb3IgdGhlIGltYWdlJ3MgY29kZWMgdGhlbiB3ZSdsbCBhcnJpdmUgaGVyZS4gIFRoaXMKKwkJICogaGFwcGVucywgZm9yIGV4YW1wbGUsIHdoZW4gdGlmZmNwIGlzIHVzZWQgdG8gY29udmVydCBiZXR3ZWVuCisJCSAqIGNvbXByZXNzaW9uIHNjaGVtZXMgYW5kIGNvZGVjLXNwZWNpZmljIHRhZ3MgYXJlIGJsaW5kbHkgY29waWVkLgorCQkgKi8KKwkJaWYoZmlwLT5maWVsZF9iaXQgIT0gRklFTERfQ1VTVE9NKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICIlczogSW52YWxpZCAlc3RhZyBcIiVzXCIgKG5vdCBzdXBwb3J0ZWQgYnkgY29kZWMpIiwKKwkJCSAgICB0aWYtPnRpZl9uYW1lLCBpc1BzZXVkb1RhZyh0YWcpID8gInBzZXVkby0iIDogIiIsCisJCQkgICAgZmlwLT5maWVsZF9uYW1lKTsKKwkJCXN0YXR1cyA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIEZpbmQgdGhlIGV4aXN0aW5nIGVudHJ5IGZvciB0aGlzIGN1c3RvbSB2YWx1ZS4KKwkJICovCisJCXR2ID0gTlVMTDsKKwkJZm9yIChpQ3VzdG9tID0gMDsgaUN1c3RvbSA8IHRkLT50ZF9jdXN0b21WYWx1ZUNvdW50OyBpQ3VzdG9tKyspIHsKKwkJCWlmICh0ZC0+dGRfY3VzdG9tVmFsdWVzW2lDdXN0b21dLmluZm8tPmZpZWxkX3RhZyA9PSB0YWcpIHsKKwkJCQl0diA9IHRkLT50ZF9jdXN0b21WYWx1ZXMgKyBpQ3VzdG9tOworCQkJCWlmICh0di0+dmFsdWUgIT0gTlVMTCkgeworCQkJCQlfVElGRmZyZWUodHYtPnZhbHVlKTsKKwkJCQkJdHYtPnZhbHVlID0gTlVMTDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBHcm93IHRoZSBjdXN0b20gbGlzdCBpZiB0aGUgZW50cnkgd2FzIG5vdCBmb3VuZC4KKwkJICovCisJCWlmKHR2ID09IE5VTEwpIHsKKwkJCVRJRkZUYWdWYWx1ZSAqbmV3X2N1c3RvbVZhbHVlczsKKworCQkJdGQtPnRkX2N1c3RvbVZhbHVlQ291bnQrKzsKKwkJCW5ld19jdXN0b21WYWx1ZXMgPSAoVElGRlRhZ1ZhbHVlICopCisJCQkgICAgX1RJRkZyZWFsbG9jKHRkLT50ZF9jdXN0b21WYWx1ZXMsCisJCQkgICAgc2l6ZW9mKFRJRkZUYWdWYWx1ZSkgKiB0ZC0+dGRfY3VzdG9tVmFsdWVDb3VudCk7CisJCQlpZiAoIW5ld19jdXN0b21WYWx1ZXMpIHsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCSAgICAiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgbGlzdCBvZiBjdXN0b20gdmFsdWVzIiwKKwkJCQkgICAgdGlmLT50aWZfbmFtZSk7CisJCQkJc3RhdHVzID0gMDsKKwkJCQlnb3RvIGVuZDsKKwkJCX0KKworCQkJdGQtPnRkX2N1c3RvbVZhbHVlcyA9IG5ld19jdXN0b21WYWx1ZXM7CisKKwkJCXR2ID0gdGQtPnRkX2N1c3RvbVZhbHVlcyArICh0ZC0+dGRfY3VzdG9tVmFsdWVDb3VudCAtIDEpOworCQkJdHYtPmluZm8gPSBmaXA7CisJCQl0di0+dmFsdWUgPSBOVUxMOworCQkJdHYtPmNvdW50ID0gMDsKKwkJfQorCisJCS8qCisJCSAqIFNldCBjdXN0b20gdmFsdWUgLi4uIHNhdmUgYSBjb3B5IG9mIHRoZSBjdXN0b20gdGFnIHZhbHVlLgorCQkgKi8KKwkJdHZfc2l6ZSA9IF9USUZGRGF0YVNpemUoZmlwLT5maWVsZF90eXBlKTsKKwkJaWYgKHR2X3NpemUgPT0gMCkgeworCQkJc3RhdHVzID0gMDsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgIiVzOiBCYWQgZmllbGQgdHlwZSAlZCBmb3IgXCIlc1wiIiwKKwkJCSAgICB0aWYtPnRpZl9uYW1lLCBmaXAtPmZpZWxkX3R5cGUsCisJCQkgICAgZmlwLT5maWVsZF9uYW1lKTsKKwkJCWdvdG8gZW5kOworCQl9CisKKwkJaWYgKGZpcC0+ZmllbGRfdHlwZSA9PSBUSUZGX0FTQ0lJKQorCQl7CisJCQl1aW50MzIgbWE7CisJCQljaGFyKiBtYjsKKwkJCWlmIChmaXAtPmZpZWxkX3Bhc3Njb3VudCkKKwkJCXsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF93cml0ZWNvdW50PT1USUZGX1ZBUklBQkxFMik7CisJCQkJbWE9KHVpbnQzMil2YV9hcmcoYXAsdWludDMyKTsKKwkJCQltYj0oY2hhciopdmFfYXJnKGFwLGNoYXIqKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltYj0oY2hhciopdmFfYXJnKGFwLGNoYXIqKTsKKwkJCQltYT0odWludDMyKShzdHJsZW4obWIpKzEpOworCQkJfQorCQkJdHYtPmNvdW50PW1hOworCQkJc2V0Qnl0ZUFycmF5KCZ0di0+dmFsdWUsbWIsbWEsMSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoZmlwLT5maWVsZF9wYXNzY291bnQpIHsKKwkJCQlpZiAoZmlwLT5maWVsZF93cml0ZWNvdW50ID09IFRJRkZfVkFSSUFCTEUyKQorCQkJCQl0di0+Y291bnQgPSAodWludDMyKSB2YV9hcmcoYXAsIHVpbnQzMik7CisJCQkJZWxzZQorCQkJCQl0di0+Y291bnQgPSAoaW50KSB2YV9hcmcoYXAsIGludCk7CisJCQl9IGVsc2UgaWYgKGZpcC0+ZmllbGRfd3JpdGVjb3VudCA9PSBUSUZGX1ZBUklBQkxFCisJCQkgICB8fCBmaXAtPmZpZWxkX3dyaXRlY291bnQgPT0gVElGRl9WQVJJQUJMRTIpCisJCQkJdHYtPmNvdW50ID0gMTsKKwkJCWVsc2UgaWYgKGZpcC0+ZmllbGRfd3JpdGVjb3VudCA9PSBUSUZGX1NQUCkKKwkJCQl0di0+Y291bnQgPSB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsOworCQkJZWxzZQorCQkJCXR2LT5jb3VudCA9IGZpcC0+ZmllbGRfd3JpdGVjb3VudDsKKworCQkJaWYgKHR2LT5jb3VudCA9PSAwKSB7CisJCQkJc3RhdHVzID0gMDsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCQkgICAgICIlczogTnVsbCBjb3VudCBmb3IgXCIlc1wiICh0eXBlICIKKwkJCQkJICAgICAiJWQsIHdyaXRlY291bnQgJWQsIHBhc3Njb3VudCAlZCkiLAorCQkJCQkgICAgIHRpZi0+dGlmX25hbWUsCisJCQkJCSAgICAgZmlwLT5maWVsZF9uYW1lLAorCQkJCQkgICAgIGZpcC0+ZmllbGRfdHlwZSwKKwkJCQkJICAgICBmaXAtPmZpZWxkX3dyaXRlY291bnQsCisJCQkJCSAgICAgZmlwLT5maWVsZF9wYXNzY291bnQpOworCQkJCWdvdG8gZW5kOworCQkJfQorCisJCQl0di0+dmFsdWUgPSBfVElGRkNoZWNrTWFsbG9jKHRpZiwgdHYtPmNvdW50LCB0dl9zaXplLAorCQkJICAgICJjdXN0b20gdGFnIGJpbmFyeSBvYmplY3QiKTsKKwkJCWlmICghdHYtPnZhbHVlKSB7CisJCQkJc3RhdHVzID0gMDsKKwkJCQlnb3RvIGVuZDsKKwkJCX0KKworCQkJaWYgKGZpcC0+ZmllbGRfdGFnID09IFRJRkZUQUdfRE9UUkFOR0UgCisJCQkgICAgJiYgc3RyY21wKGZpcC0+ZmllbGRfbmFtZSwiRG90UmFuZ2UiKSA9PSAwKSB7CisJCQkJLyogVE9ETzogVGhpcyBpcyBhbiBldmlsIGV4Y2VwdGlvbiBhbmQgc2hvdWxkIG5vdCBoYXZlIGJlZW4KKwkJCQkgICBoYW5kbGVkIHRoaXMgd2F5IC4uLiBsaWtlbHkgYmVzdCBpZiB3ZSBtb3ZlIGl0IGludG8KKwkJCQkgICB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZSB3aXRoIGFuIGV4cGxpY2l0IGZpZWxkIGluIAorCQkJCSAgIGxpYnRpZmYgNC4xIGFuZCBhc3NpZ24gaXQgYSBGSUVMRF8gdmFsdWUgKi8KKwkJCQl1aW50MTYgdlsyXTsKKwkJCQl2WzBdID0gKHVpbnQxNil2YV9hcmcoYXAsIGludCk7CisJCQkJdlsxXSA9ICh1aW50MTYpdmFfYXJnKGFwLCBpbnQpOworCQkJCV9USUZGbWVtY3B5KHR2LT52YWx1ZSwgJnYsIDQpOworCQkJfQorCisJCQllbHNlIGlmIChmaXAtPmZpZWxkX3Bhc3Njb3VudAorCQkJCSAgfHwgZmlwLT5maWVsZF93cml0ZWNvdW50ID09IFRJRkZfVkFSSUFCTEUKKwkJCQkgIHx8IGZpcC0+ZmllbGRfd3JpdGVjb3VudCA9PSBUSUZGX1ZBUklBQkxFMgorCQkJCSAgfHwgZmlwLT5maWVsZF93cml0ZWNvdW50ID09IFRJRkZfU1BQCisJCQkJICB8fCB0di0+Y291bnQgPiAxKSB7CisJCQkJX1RJRkZtZW1jcHkodHYtPnZhbHVlLCB2YV9hcmcoYXAsIHZvaWQgKiksCisJCQkJICAgIHR2LT5jb3VudCAqIHR2X3NpemUpOworCQkJfSBlbHNlIHsKKwkJCQljaGFyICp2YWwgPSAoY2hhciAqKXR2LT52YWx1ZTsKKwkJCQlhc3NlcnQoIHR2LT5jb3VudCA9PSAxICk7CisKKwkJCQlzd2l0Y2ggKGZpcC0+ZmllbGRfdHlwZSkgeworCQkJCWNhc2UgVElGRl9CWVRFOgorCQkJCWNhc2UgVElGRl9VTkRFRklORUQ6CisJCQkJCXsKKwkJCQkJCXVpbnQ4IHYgPSAodWludDgpdmFfYXJnKGFwLCBpbnQpOworCQkJCQkJX1RJRkZtZW1jcHkodmFsLCAmdiwgdHZfc2l6ZSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUSUZGX1NCWVRFOgorCQkJCQl7CisJCQkJCQlpbnQ4IHYgPSAoaW50OCl2YV9hcmcoYXAsIGludCk7CisJCQkJCQlfVElGRm1lbWNweSh2YWwsICZ2LCB0dl9zaXplKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFRJRkZfU0hPUlQ6CisJCQkJCXsKKwkJCQkJCXVpbnQxNiB2ID0gKHVpbnQxNil2YV9hcmcoYXAsIGludCk7CisJCQkJCQlfVElGRm1lbWNweSh2YWwsICZ2LCB0dl9zaXplKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFRJRkZfU1NIT1JUOgorCQkJCQl7CisJCQkJCQlpbnQxNiB2ID0gKGludDE2KXZhX2FyZyhhcCwgaW50KTsKKwkJCQkJCV9USUZGbWVtY3B5KHZhbCwgJnYsIHR2X3NpemUpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVElGRl9MT05HOgorCQkJCWNhc2UgVElGRl9JRkQ6CisJCQkJCXsKKwkJCQkJCXVpbnQzMiB2ID0gdmFfYXJnKGFwLCB1aW50MzIpOworCQkJCQkJX1RJRkZtZW1jcHkodmFsLCAmdiwgdHZfc2l6ZSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUSUZGX1NMT05HOgorCQkJCQl7CisJCQkJCQlpbnQzMiB2ID0gdmFfYXJnKGFwLCBpbnQzMik7CisJCQkJCQlfVElGRm1lbWNweSh2YWwsICZ2LCB0dl9zaXplKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFRJRkZfTE9ORzg6CisJCQkJY2FzZSBUSUZGX0lGRDg6CisJCQkJCXsKKwkJCQkJCXVpbnQ2NCB2ID0gdmFfYXJnKGFwLCB1aW50NjQpOworCQkJCQkJX1RJRkZtZW1jcHkodmFsLCAmdiwgdHZfc2l6ZSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUSUZGX1NMT05HODoKKwkJCQkJeworCQkJCQkJaW50NjQgdiA9IHZhX2FyZyhhcCwgaW50NjQpOworCQkJCQkJX1RJRkZtZW1jcHkodmFsLCAmdiwgdHZfc2l6ZSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUSUZGX1JBVElPTkFMOgorCQkJCWNhc2UgVElGRl9TUkFUSU9OQUw6CisJCQkJY2FzZSBUSUZGX0ZMT0FUOgorCQkJCQl7CisJCQkJCQlmbG9hdCB2ID0gKGZsb2F0KXZhX2FyZyhhcCwgZG91YmxlKTsKKwkJCQkJCV9USUZGbWVtY3B5KHZhbCwgJnYsIHR2X3NpemUpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVElGRl9ET1VCTEU6CisJCQkJCXsKKwkJCQkJCWRvdWJsZSB2ID0gdmFfYXJnKGFwLCBkb3VibGUpOworCQkJCQkJX1RJRkZtZW1jcHkodmFsLCAmdiwgdHZfc2l6ZSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJX1RJRkZtZW1zZXQodmFsLCAwLCB0dl9zaXplKTsKKwkJCQkJc3RhdHVzID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCX0KKwlpZiAoc3RhdHVzKSB7CisJCWNvbnN0IFRJRkZGaWVsZCogZmlwPVRJRkZGaWVsZFdpdGhUYWcodGlmLHRhZyk7CisJCWlmIChmaXApICAgICAgICAgICAgICAgIAorCQkJVElGRlNldEZpZWxkQml0KHRpZiwgZmlwLT5maWVsZF9iaXQpOworCQl0aWYtPnRpZl9mbGFncyB8PSBUSUZGX0RJUlRZRElSRUNUOworCX0KKworZW5kOgorCXZhX2VuZChhcCk7CisJcmV0dXJuIChzdGF0dXMpOworYmFkdmFsdWU6CisgICAgICAgIHsKKwkJY29uc3QgVElGRkZpZWxkKiBmaXA9VElGRkZpZWxkV2l0aFRhZyh0aWYsdGFnKTsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJICAgICAiJXM6IEJhZCB2YWx1ZSAldSBmb3IgXCIlc1wiIHRhZyIsCisJCSAgICAgdGlmLT50aWZfbmFtZSwgdiwKKwkJICAgICBmaXAgPyBmaXAtPmZpZWxkX25hbWUgOiAiVW5rbm93biIpOworCQl2YV9lbmQoYXApOworICAgICAgICB9CisJcmV0dXJuICgwKTsKK2JhZHZhbHVlMzI6CisgICAgICAgIHsKKwkJY29uc3QgVElGRkZpZWxkKiBmaXA9VElGRkZpZWxkV2l0aFRhZyh0aWYsdGFnKTsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJICAgICAiJXM6IEJhZCB2YWx1ZSAldSBmb3IgXCIlc1wiIHRhZyIsCisJCSAgICAgdGlmLT50aWZfbmFtZSwgdjMyLAorCQkgICAgIGZpcCA/IGZpcC0+ZmllbGRfbmFtZSA6ICJVbmtub3duIik7CisJCXZhX2VuZChhcCk7CisgICAgICAgIH0KKwlyZXR1cm4gKDApOworYmFkdmFsdWVkb3VibGU6CisgICAgICAgIHsKKyAgICAgICAgY29uc3QgVElGRkZpZWxkKiBmaXA9VElGRkZpZWxkV2l0aFRhZyh0aWYsdGFnKTsKKyAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKyAgICAgICAgICAgICAiJXM6IEJhZCB2YWx1ZSAlZiBmb3IgXCIlc1wiIHRhZyIsCisgICAgICAgICAgICAgdGlmLT50aWZfbmFtZSwgZGJsdmFsLAorICAgICAgICAgICAgIGZpcCA/IGZpcC0+ZmllbGRfbmFtZSA6ICJVbmtub3duIik7CisgICAgICAgIHZhX2VuZChhcCk7CisgICAgICAgIH0KKyAgICByZXR1cm4gKDApOworfQorCisvKgorICogUmV0dXJuIDEvMCBhY2NvcmRpbmcgdG8gd2hldGhlciBvciBub3QKKyAqIGl0IGlzIHBlcm1pc3NpYmxlIHRvIHNldCB0aGUgdGFnJ3MgdmFsdWUuCisgKiBOb3RlIHRoYXQgd2UgYWxsb3cgSW1hZ2VMZW5ndGggdG8gYmUgY2hhbmdlZAorICogc28gdGhhdCB3ZSBjYW4gYXBwZW5kIGFuZCBleHRlbmQgdG8gaW1hZ2VzLgorICogQW55IG90aGVyIHRhZyBtYXkgbm90IGJlIGFsdGVyZWQgb25jZSB3cml0aW5nCisgKiBoYXMgY29tbWVuY2VkLCB1bmxlc3MgaXRzIHZhbHVlIGhhcyBubyBlZmZlY3QKKyAqIG9uIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGEgdGhhdCBpcyB3cml0dGVuLgorICovCitzdGF0aWMgaW50CitPa1RvQ2hhbmdlVGFnKFRJRkYqIHRpZiwgdWludDMyIHRhZykKK3sKKwljb25zdCBUSUZGRmllbGQqIGZpcCA9IFRJRkZGaW5kRmllbGQodGlmLCB0YWcsIFRJRkZfQU5ZKTsKKwlpZiAoIWZpcCkgewkJCS8qIHVua25vd24gdGFnICovCisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCAiVElGRlNldEZpZWxkIiwgIiVzOiBVbmtub3duICVzdGFnICV1IiwKKwkJICAgIHRpZi0+dGlmX25hbWUsIGlzUHNldWRvVGFnKHRhZykgPyAicHNldWRvLSIgOiAiIiwgdGFnKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKHRhZyAhPSBUSUZGVEFHX0lNQUdFTEVOR1RIICYmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfQkVFTldSSVRJTkcpICYmCisJICAgICFmaXAtPmZpZWxkX29rdG9jaGFuZ2UpIHsKKwkJLyoKKwkJICogQ29uc3VsdCBpbmZvIHRhYmxlIHRvIHNlZSBpZiB0YWcgY2FuIGJlIGNoYW5nZWQKKwkJICogYWZ0ZXIgd2UndmUgc3RhcnRlZCB3cml0aW5nLiAgV2Ugb25seSBhbGxvdyBjaGFuZ2VzCisJCSAqIHRvIHRob3NlIHRhZ3MgdGhhdCBkb24ndC9zaG91bGRuJ3QgYWZmZWN0IHRoZQorCQkgKiBjb21wcmVzc2lvbiBhbmQvb3IgZm9ybWF0IG9mIHRoZSBkYXRhLgorCQkgKi8KKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsICJUSUZGU2V0RmllbGQiLAorCQkgICAgIiVzOiBDYW5ub3QgbW9kaWZ5IHRhZyBcIiVzXCIgd2hpbGUgd3JpdGluZyIsCisJCSAgICB0aWYtPnRpZl9uYW1lLCBmaXAtPmZpZWxkX25hbWUpOworCQlyZXR1cm4gKDApOworCX0KKwlyZXR1cm4gKDEpOworfQorCisvKgorICogUmVjb3JkIHRoZSB2YWx1ZSBvZiBhIGZpZWxkIGluIHRoZQorICogaW50ZXJuYWwgZGlyZWN0b3J5IHN0cnVjdHVyZS4gIFRoZQorICogZmllbGQgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBmaWxlCisgKiB3aGVuL2lmIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGlzCisgKiB1cGRhdGVkLgorICovCitpbnQKK1RJRkZTZXRGaWVsZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCWludCBzdGF0dXM7CisKKwl2YV9zdGFydChhcCwgdGFnKTsKKwlzdGF0dXMgPSBUSUZGVlNldEZpZWxkKHRpZiwgdGFnLCBhcCk7CisJdmFfZW5kKGFwKTsKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qCisgKiBDbGVhciB0aGUgY29udGVudHMgb2YgdGhlIGZpZWxkIGluIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUuCisgKi8KK2ludAorVElGRlVuc2V0RmllbGQoVElGRiogdGlmLCB1aW50MzIgdGFnKQoreworICAgIGNvbnN0IFRJRkZGaWVsZCAqZmlwID0gIFRJRkZGaWVsZFdpdGhUYWcodGlmLCB0YWcpOworICAgIFRJRkZEaXJlY3RvcnkqIHRkID0gJnRpZi0+dGlmX2RpcjsKKworICAgIGlmKCAhZmlwICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiggZmlwLT5maWVsZF9iaXQgIT0gRklFTERfQ1VTVE9NICkKKyAgICAgICAgVElGRkNsckZpZWxkQml0KHRpZiwgZmlwLT5maWVsZF9iaXQpOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIFRJRkZUYWdWYWx1ZSAqdHYgPSBOVUxMOworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGQtPnRkX2N1c3RvbVZhbHVlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgdHYgPSB0ZC0+dGRfY3VzdG9tVmFsdWVzICsgaTsKKyAgICAgICAgICAgIGlmKCB0di0+aW5mby0+ZmllbGRfdGFnID09IHRhZyApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiggaSA8IHRkLT50ZF9jdXN0b21WYWx1ZUNvdW50ICkKKyAgICAgICAgeworICAgICAgICAgICAgX1RJRkZmcmVlKHR2LT52YWx1ZSk7CisgICAgICAgICAgICBmb3IoIDsgaSA8IHRkLT50ZF9jdXN0b21WYWx1ZUNvdW50LTE7IGkrKykgeworICAgICAgICAgICAgICAgIHRkLT50ZF9jdXN0b21WYWx1ZXNbaV0gPSB0ZC0+dGRfY3VzdG9tVmFsdWVzW2krMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ZC0+dGRfY3VzdG9tVmFsdWVDb3VudC0tOworICAgICAgICB9CisgICAgfQorICAgICAgICAKKyAgICB0aWYtPnRpZl9mbGFncyB8PSBUSUZGX0RJUlRZRElSRUNUOworCisgICAgcmV0dXJuICgxKTsKK30KKworLyoKKyAqIExpa2UgVElGRlNldEZpZWxkLCBidXQgdGFraW5nIGEgdmFyYXJncworICogcGFyYW1ldGVyIGxpc3QuICBUaGlzIHJvdXRpbmUgaXMgdXNlZnVsCisgKiBmb3IgYnVpbGRpbmcgaGlnaGVyLWxldmVsIGludGVyZmFjZXMgb24KKyAqIHRvcCBvZiB0aGUgbGlicmFyeS4KKyAqLworaW50CitUSUZGVlNldEZpZWxkKFRJRkYqIHRpZiwgdWludDMyIHRhZywgdmFfbGlzdCBhcCkKK3sKKwlyZXR1cm4gT2tUb0NoYW5nZVRhZyh0aWYsIHRhZykgPworCSAgICAoKnRpZi0+dGlmX3RhZ21ldGhvZHMudnNldGZpZWxkKSh0aWYsIHRhZywgYXApIDogMDsKK30KKworc3RhdGljIGludAorX1RJRkZWR2V0RmllbGQoVElGRiogdGlmLCB1aW50MzIgdGFnLCB2YV9saXN0IGFwKQoreworCVRJRkZEaXJlY3RvcnkqIHRkID0gJnRpZi0+dGlmX2RpcjsKKwlpbnQgcmV0X3ZhbCA9IDE7CisJdWludDMyIHN0YW5kYXJkX3RhZyA9IHRhZzsKKwljb25zdCBUSUZGRmllbGQqIGZpcCA9IFRJRkZGaW5kRmllbGQodGlmLCB0YWcsIFRJRkZfQU5ZKTsKKwlpZiggZmlwID09IE5VTEwgKSAvKiBjYW5ub3QgaGFwcGVuIHNpbmNlIFRJRkZHZXRGaWVsZCgpIGFscmVhZHkgY2hlY2tzIGl0ICovCisJICAgIHJldHVybiAwOworCQorCS8qCisJICogV2Ugd2FudCB0byBmb3JjZSB0aGUgY3VzdG9tIGNvZGUgdG8gYmUgdXNlZCBmb3IgY3VzdG9tCisJICogZmllbGRzIGV2ZW4gaWYgdGhlIHRhZyBoYXBwZW5zIHRvIG1hdGNoIGEgd2VsbCBrbm93biAKKwkgKiBvbmUgLSBpbXBvcnRhbnQgZm9yIHJlaW50ZXJwcmV0ZWQgaGFuZGxpbmcgb2Ygc3RhbmRhcmQKKwkgKiB0YWcgdmFsdWVzIGluIGN1c3RvbSBkaXJlY3RvcmllcyAoaWUuIEVYSUYpIAorCSAqLworCWlmIChmaXAtPmZpZWxkX2JpdCA9PSBGSUVMRF9DVVNUT00pIHsKKwkJc3RhbmRhcmRfdGFnID0gMDsKKwl9CisKKwlzd2l0Y2ggKHN0YW5kYXJkX3RhZykgeworCQljYXNlIFRJRkZUQUdfU1VCRklMRVRZUEU6CisJCQkqdmFfYXJnKGFwLCB1aW50MzIqKSA9IHRkLT50ZF9zdWJmaWxldHlwZTsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfSU1BR0VXSURUSDoKKwkJCSp2YV9hcmcoYXAsIHVpbnQzMiopID0gdGQtPnRkX2ltYWdld2lkdGg7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX0lNQUdFTEVOR1RIOgorCQkJKnZhX2FyZyhhcCwgdWludDMyKikgPSB0ZC0+dGRfaW1hZ2VsZW5ndGg7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX0JJVFNQRVJTQU1QTEU6CisJCQkqdmFfYXJnKGFwLCB1aW50MTYqKSA9IHRkLT50ZF9iaXRzcGVyc2FtcGxlOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19DT01QUkVTU0lPTjoKKwkJCSp2YV9hcmcoYXAsIHVpbnQxNiopID0gdGQtPnRkX2NvbXByZXNzaW9uOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19QSE9UT01FVFJJQzoKKwkJCSp2YV9hcmcoYXAsIHVpbnQxNiopID0gdGQtPnRkX3Bob3RvbWV0cmljOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19USFJFU0hIT0xESU5HOgorCQkJKnZhX2FyZyhhcCwgdWludDE2KikgPSB0ZC0+dGRfdGhyZXNoaG9sZGluZzsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfRklMTE9SREVSOgorCQkJKnZhX2FyZyhhcCwgdWludDE2KikgPSB0ZC0+dGRfZmlsbG9yZGVyOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19PUklFTlRBVElPTjoKKwkJCSp2YV9hcmcoYXAsIHVpbnQxNiopID0gdGQtPnRkX29yaWVudGF0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19TQU1QTEVTUEVSUElYRUw6CisJCQkqdmFfYXJnKGFwLCB1aW50MTYqKSA9IHRkLT50ZF9zYW1wbGVzcGVycGl4ZWw7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX1JPV1NQRVJTVFJJUDoKKwkJCSp2YV9hcmcoYXAsIHVpbnQzMiopID0gdGQtPnRkX3Jvd3NwZXJzdHJpcDsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfTUlOU0FNUExFVkFMVUU6CisJCQkqdmFfYXJnKGFwLCB1aW50MTYqKSA9IHRkLT50ZF9taW5zYW1wbGV2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfTUFYU0FNUExFVkFMVUU6CisJCQkqdmFfYXJnKGFwLCB1aW50MTYqKSA9IHRkLT50ZF9tYXhzYW1wbGV2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfU01JTlNBTVBMRVZBTFVFOgorCQkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9QRVJTQU1QTEUpCisJCQkJKnZhX2FyZyhhcCwgZG91YmxlKiopID0gdGQtPnRkX3NtaW5zYW1wbGV2YWx1ZTsKKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBsaWJ0aWZmIGhpc3RvcmlhbGx5IHRyZWF0cyB0aGlzIGFzIGEgc2luZ2xlIHZhbHVlLiAqLworCQkJCXVpbnQxNiBpOworCQkJCWRvdWJsZSB2ID0gdGQtPnRkX3NtaW5zYW1wbGV2YWx1ZVswXTsKKwkJCQlmb3IgKGk9MTsgaSA8IHRkLT50ZF9zYW1wbGVzcGVycGl4ZWw7ICsraSkKKwkJCQkJaWYoIHRkLT50ZF9zbWluc2FtcGxldmFsdWVbaV0gPCB2ICkKKwkJCQkJCXYgPSB0ZC0+dGRfc21pbnNhbXBsZXZhbHVlW2ldOworCQkJCSp2YV9hcmcoYXAsIGRvdWJsZSopID0gdjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfU01BWFNBTVBMRVZBTFVFOgorCQkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9QRVJTQU1QTEUpCisJCQkJKnZhX2FyZyhhcCwgZG91YmxlKiopID0gdGQtPnRkX3NtYXhzYW1wbGV2YWx1ZTsKKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBsaWJ0aWZmIGhpc3RvcmlhbGx5IHRyZWF0cyB0aGlzIGFzIGEgc2luZ2xlIHZhbHVlLiAqLworCQkJCXVpbnQxNiBpOworCQkJCWRvdWJsZSB2ID0gdGQtPnRkX3NtYXhzYW1wbGV2YWx1ZVswXTsKKwkJCQlmb3IgKGk9MTsgaSA8IHRkLT50ZF9zYW1wbGVzcGVycGl4ZWw7ICsraSkKKwkJCQkJaWYoIHRkLT50ZF9zbWF4c2FtcGxldmFsdWVbaV0gPiB2ICkKKwkJCQkJCXYgPSB0ZC0+dGRfc21heHNhbXBsZXZhbHVlW2ldOworCQkJCSp2YV9hcmcoYXAsIGRvdWJsZSopID0gdjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfWFJFU09MVVRJT046CisJCQkqdmFfYXJnKGFwLCBmbG9hdCopID0gdGQtPnRkX3hyZXNvbHV0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19ZUkVTT0xVVElPTjoKKwkJCSp2YV9hcmcoYXAsIGZsb2F0KikgPSB0ZC0+dGRfeXJlc29sdXRpb247CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX1BMQU5BUkNPTkZJRzoKKwkJCSp2YV9hcmcoYXAsIHVpbnQxNiopID0gdGQtPnRkX3BsYW5hcmNvbmZpZzsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfWFBPU0lUSU9OOgorCQkJKnZhX2FyZyhhcCwgZmxvYXQqKSA9IHRkLT50ZF94cG9zaXRpb247CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX1lQT1NJVElPTjoKKwkJCSp2YV9hcmcoYXAsIGZsb2F0KikgPSB0ZC0+dGRfeXBvc2l0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19SRVNPTFVUSU9OVU5JVDoKKwkJCSp2YV9hcmcoYXAsIHVpbnQxNiopID0gdGQtPnRkX3Jlc29sdXRpb251bml0OworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19QQUdFTlVNQkVSOgorCQkJKnZhX2FyZyhhcCwgdWludDE2KikgPSB0ZC0+dGRfcGFnZW51bWJlclswXTsKKwkJCSp2YV9hcmcoYXAsIHVpbnQxNiopID0gdGQtPnRkX3BhZ2VudW1iZXJbMV07CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX0hBTEZUT05FSElOVFM6CisJCQkqdmFfYXJnKGFwLCB1aW50MTYqKSA9IHRkLT50ZF9oYWxmdG9uZWhpbnRzWzBdOworCQkJKnZhX2FyZyhhcCwgdWludDE2KikgPSB0ZC0+dGRfaGFsZnRvbmVoaW50c1sxXTsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfQ09MT1JNQVA6CisJCQkqdmFfYXJnKGFwLCB1aW50MTYqKikgPSB0ZC0+dGRfY29sb3JtYXBbMF07CisJCQkqdmFfYXJnKGFwLCB1aW50MTYqKikgPSB0ZC0+dGRfY29sb3JtYXBbMV07CisJCQkqdmFfYXJnKGFwLCB1aW50MTYqKikgPSB0ZC0+dGRfY29sb3JtYXBbMl07CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX1NUUklQT0ZGU0VUUzoKKwkJY2FzZSBUSUZGVEFHX1RJTEVPRkZTRVRTOgorCQkJX1RJRkZGaWxsU3RyaWxlcyggdGlmICk7CisJCQkqdmFfYXJnKGFwLCB1aW50NjQqKikgPSB0ZC0+dGRfc3RyaXBvZmZzZXQ7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX1NUUklQQllURUNPVU5UUzoKKwkJY2FzZSBUSUZGVEFHX1RJTEVCWVRFQ09VTlRTOgorCQkJX1RJRkZGaWxsU3RyaWxlcyggdGlmICk7CisJCQkqdmFfYXJnKGFwLCB1aW50NjQqKikgPSB0ZC0+dGRfc3RyaXBieXRlY291bnQ7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX01BVFRFSU5HOgorCQkJKnZhX2FyZyhhcCwgdWludDE2KikgPQorCQkJICAgICh0ZC0+dGRfZXh0cmFzYW1wbGVzID09IDEgJiYKKwkJCSAgICB0ZC0+dGRfc2FtcGxlaW5mb1swXSA9PSBFWFRSQVNBTVBMRV9BU1NPQ0FMUEhBKTsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfRVhUUkFTQU1QTEVTOgorCQkJKnZhX2FyZyhhcCwgdWludDE2KikgPSB0ZC0+dGRfZXh0cmFzYW1wbGVzOworCQkJKnZhX2FyZyhhcCwgdWludDE2KiopID0gdGQtPnRkX3NhbXBsZWluZm87CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX1RJTEVXSURUSDoKKwkJCSp2YV9hcmcoYXAsIHVpbnQzMiopID0gdGQtPnRkX3RpbGV3aWR0aDsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfVElMRUxFTkdUSDoKKwkJCSp2YV9hcmcoYXAsIHVpbnQzMiopID0gdGQtPnRkX3RpbGVsZW5ndGg7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX1RJTEVERVBUSDoKKwkJCSp2YV9hcmcoYXAsIHVpbnQzMiopID0gdGQtPnRkX3RpbGVkZXB0aDsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfREFUQVRZUEU6CisJCQlzd2l0Y2ggKHRkLT50ZF9zYW1wbGVmb3JtYXQpIHsKKwkJCQljYXNlIFNBTVBMRUZPUk1BVF9VSU5UOgorCQkJCQkqdmFfYXJnKGFwLCB1aW50MTYqKSA9IERBVEFUWVBFX1VJTlQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0FNUExFRk9STUFUX0lOVDoKKwkJCQkJKnZhX2FyZyhhcCwgdWludDE2KikgPSBEQVRBVFlQRV9JTlQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0FNUExFRk9STUFUX0lFRUVGUDoKKwkJCQkJKnZhX2FyZyhhcCwgdWludDE2KikgPSBEQVRBVFlQRV9JRUVFRlA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0FNUExFRk9STUFUX1ZPSUQ6CisJCQkJCSp2YV9hcmcoYXAsIHVpbnQxNiopID0gREFUQVRZUEVfVk9JRDsKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX1NBTVBMRUZPUk1BVDoKKwkJCSp2YV9hcmcoYXAsIHVpbnQxNiopID0gdGQtPnRkX3NhbXBsZWZvcm1hdDsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfSU1BR0VERVBUSDoKKwkJCSp2YV9hcmcoYXAsIHVpbnQzMiopID0gdGQtPnRkX2ltYWdlZGVwdGg7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX1NVQklGRDoKKwkJCSp2YV9hcmcoYXAsIHVpbnQxNiopID0gdGQtPnRkX25zdWJpZmQ7CisJCQkqdmFfYXJnKGFwLCB1aW50NjQqKikgPSB0ZC0+dGRfc3ViaWZkOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19ZQ0JDUlBPU0lUSU9OSU5HOgorCQkJKnZhX2FyZyhhcCwgdWludDE2KikgPSB0ZC0+dGRfeWNiY3Jwb3NpdGlvbmluZzsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfWUNCQ1JTVUJTQU1QTElORzoKKwkJCSp2YV9hcmcoYXAsIHVpbnQxNiopID0gdGQtPnRkX3ljYmNyc3Vic2FtcGxpbmdbMF07CisJCQkqdmFfYXJnKGFwLCB1aW50MTYqKSA9IHRkLT50ZF95Y2JjcnN1YnNhbXBsaW5nWzFdOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19UUkFOU0ZFUkZVTkNUSU9OOgorCQkJKnZhX2FyZyhhcCwgdWludDE2KiopID0gdGQtPnRkX3RyYW5zZmVyZnVuY3Rpb25bMF07CisJCQlpZiAodGQtPnRkX3NhbXBsZXNwZXJwaXhlbCAtIHRkLT50ZF9leHRyYXNhbXBsZXMgPiAxKSB7CisJCQkJKnZhX2FyZyhhcCwgdWludDE2KiopID0gdGQtPnRkX3RyYW5zZmVyZnVuY3Rpb25bMV07CisJCQkJKnZhX2FyZyhhcCwgdWludDE2KiopID0gdGQtPnRkX3RyYW5zZmVyZnVuY3Rpb25bMl07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX1JFRkVSRU5DRUJMQUNLV0hJVEU6CisJCQkqdmFfYXJnKGFwLCBmbG9hdCoqKSA9IHRkLT50ZF9yZWZibGFja3doaXRlOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19JTktOQU1FUzoKKwkJCSp2YV9hcmcoYXAsIGNoYXIqKikgPSB0ZC0+dGRfaW5rbmFtZXM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXsKKwkJCQlpbnQgaTsKKworCQkJCS8qCisJCQkJICogVGhpcyBjYW4gaGFwcGVuIGlmIG11bHRpcGxlIGltYWdlcyBhcmUgb3BlbgorCQkJCSAqIHdpdGggZGlmZmVyZW50IGNvZGVjcyB3aGljaCBoYXZlIHByaXZhdGUKKwkJCQkgKiB0YWdzLiAgVGhlIGdsb2JhbCB0YWcgaW5mb3JtYXRpb24gdGFibGUgbWF5CisJCQkJICogdGhlbiBoYXZlIHRhZ3MgdGhhdCBhcmUgdmFsaWQgZm9yIG9uZSBmaWxlCisJCQkJICogYnV0IG5vdCB0aGUgb3RoZXIuIElmIHRoZSBjbGllbnQgdHJpZXMgdG8KKwkJCQkgKiBnZXQgYSB0YWcgdGhhdCBpcyBub3QgdmFsaWQgZm9yIHRoZSBpbWFnZSdzCisJCQkJICogY29kZWMgdGhlbiB3ZSdsbCBhcnJpdmUgaGVyZS4KKwkJCQkgKi8KKwkJCQlpZiggZmlwLT5maWVsZF9iaXQgIT0gRklFTERfQ1VTVE9NICkKKwkJCQl7CisJCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCAiX1RJRkZWR2V0RmllbGQiLAorCQkJCQkgICAgIiVzOiBJbnZhbGlkICVzdGFnIFwiJXNcIiAiCisJCQkJCSAgICAiKG5vdCBzdXBwb3J0ZWQgYnkgY29kZWMpIiwKKwkJCQkJICAgIHRpZi0+dGlmX25hbWUsCisJCQkJCSAgICBpc1BzZXVkb1RhZyh0YWcpID8gInBzZXVkby0iIDogIiIsCisJCQkJCSAgICBmaXAtPmZpZWxkX25hbWUpOworCQkJCQlyZXRfdmFsID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBEbyB3ZSBoYXZlIGEgY3VzdG9tIHZhbHVlPworCQkJCSAqLworCQkJCXJldF92YWwgPSAwOworCQkJCWZvciAoaSA9IDA7IGkgPCB0ZC0+dGRfY3VzdG9tVmFsdWVDb3VudDsgaSsrKSB7CisJCQkJCVRJRkZUYWdWYWx1ZSAqdHYgPSB0ZC0+dGRfY3VzdG9tVmFsdWVzICsgaTsKKworCQkJCQlpZiAodHYtPmluZm8tPmZpZWxkX3RhZyAhPSB0YWcpCisJCQkJCQljb250aW51ZTsKKworCQkJCQlpZiAoZmlwLT5maWVsZF9wYXNzY291bnQpIHsKKwkJCQkJCWlmIChmaXAtPmZpZWxkX3JlYWRjb3VudCA9PSBUSUZGX1ZBUklBQkxFMikKKwkJCQkJCQkqdmFfYXJnKGFwLCB1aW50MzIqKSA9ICh1aW50MzIpdHYtPmNvdW50OworCQkJCQkJZWxzZSAgLyogQXNzdW1lIFRJRkZfVkFSSUFCTEUgKi8KKwkJCQkJCQkqdmFfYXJnKGFwLCB1aW50MTYqKSA9ICh1aW50MTYpdHYtPmNvdW50OworCQkJCQkJKnZhX2FyZyhhcCwgdm9pZCAqKikgPSB0di0+dmFsdWU7CisJCQkJCQlyZXRfdmFsID0gMTsKKwkJCQkJfSBlbHNlIGlmIChmaXAtPmZpZWxkX3RhZyA9PSBUSUZGVEFHX0RPVFJBTkdFCisJCQkJCQkgICAmJiBzdHJjbXAoZmlwLT5maWVsZF9uYW1lLCJEb3RSYW5nZSIpID09IDApIHsKKwkJCQkJCS8qIFRPRE86IFRoaXMgaXMgYW4gZXZpbCBleGNlcHRpb24gYW5kIHNob3VsZCBub3QgaGF2ZSBiZWVuCisJCQkJCQkgICBoYW5kbGVkIHRoaXMgd2F5IC4uLiBsaWtlbHkgYmVzdCBpZiB3ZSBtb3ZlIGl0IGludG8KKwkJCQkJCSAgIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIHdpdGggYW4gZXhwbGljaXQgZmllbGQgaW4gCisJCQkJCQkgICBsaWJ0aWZmIDQuMSBhbmQgYXNzaWduIGl0IGEgRklFTERfIHZhbHVlICovCisJCQkJCQkqdmFfYXJnKGFwLCB1aW50MTYqKSA9ICgodWludDE2ICopdHYtPnZhbHVlKVswXTsKKwkJCQkJCSp2YV9hcmcoYXAsIHVpbnQxNiopID0gKCh1aW50MTYgKil0di0+dmFsdWUpWzFdOworCQkJCQkJcmV0X3ZhbCA9IDE7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAoZmlwLT5maWVsZF90eXBlID09IFRJRkZfQVNDSUkKKwkJCQkJCSAgICB8fCBmaXAtPmZpZWxkX3JlYWRjb3VudCA9PSBUSUZGX1ZBUklBQkxFCisJCQkJCQkgICAgfHwgZmlwLT5maWVsZF9yZWFkY291bnQgPT0gVElGRl9WQVJJQUJMRTIKKwkJCQkJCSAgICB8fCBmaXAtPmZpZWxkX3JlYWRjb3VudCA9PSBUSUZGX1NQUAorCQkJCQkJICAgIHx8IHR2LT5jb3VudCA+IDEpIHsKKwkJCQkJCQkqdmFfYXJnKGFwLCB2b2lkICoqKSA9IHR2LT52YWx1ZTsKKwkJCQkJCQlyZXRfdmFsID0gMTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJY2hhciAqdmFsID0gKGNoYXIgKil0di0+dmFsdWU7CisJCQkJCQkJYXNzZXJ0KCB0di0+Y291bnQgPT0gMSApOworCQkJCQkJCXN3aXRjaCAoZmlwLT5maWVsZF90eXBlKSB7CisJCQkJCQkJY2FzZSBUSUZGX0JZVEU6CisJCQkJCQkJY2FzZSBUSUZGX1VOREVGSU5FRDoKKwkJCQkJCQkJKnZhX2FyZyhhcCwgdWludDgqKSA9CisJCQkJCQkJCQkqKHVpbnQ4ICopdmFsOworCQkJCQkJCQlyZXRfdmFsID0gMTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBUSUZGX1NCWVRFOgorCQkJCQkJCQkqdmFfYXJnKGFwLCBpbnQ4KikgPQorCQkJCQkJCQkJKihpbnQ4ICopdmFsOworCQkJCQkJCQlyZXRfdmFsID0gMTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBUSUZGX1NIT1JUOgorCQkJCQkJCQkqdmFfYXJnKGFwLCB1aW50MTYqKSA9CisJCQkJCQkJCQkqKHVpbnQxNiAqKXZhbDsKKwkJCQkJCQkJcmV0X3ZhbCA9IDE7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgVElGRl9TU0hPUlQ6CisJCQkJCQkJCSp2YV9hcmcoYXAsIGludDE2KikgPQorCQkJCQkJCQkJKihpbnQxNiAqKXZhbDsKKwkJCQkJCQkJcmV0X3ZhbCA9IDE7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgVElGRl9MT05HOgorCQkJCQkJCWNhc2UgVElGRl9JRkQ6CisJCQkJCQkJCSp2YV9hcmcoYXAsIHVpbnQzMiopID0KKwkJCQkJCQkJCSoodWludDMyICopdmFsOworCQkJCQkJCQlyZXRfdmFsID0gMTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBUSUZGX1NMT05HOgorCQkJCQkJCQkqdmFfYXJnKGFwLCBpbnQzMiopID0KKwkJCQkJCQkJCSooaW50MzIgKil2YWw7CisJCQkJCQkJCXJldF92YWwgPSAxOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIFRJRkZfTE9ORzg6CisJCQkJCQkJY2FzZSBUSUZGX0lGRDg6CisJCQkJCQkJCSp2YV9hcmcoYXAsIHVpbnQ2NCopID0KKwkJCQkJCQkJCSoodWludDY0ICopdmFsOworCQkJCQkJCQlyZXRfdmFsID0gMTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBUSUZGX1NMT05HODoKKwkJCQkJCQkJKnZhX2FyZyhhcCwgaW50NjQqKSA9CisJCQkJCQkJCQkqKGludDY0ICopdmFsOworCQkJCQkJCQlyZXRfdmFsID0gMTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSBUSUZGX1JBVElPTkFMOgorCQkJCQkJCWNhc2UgVElGRl9TUkFUSU9OQUw6CisJCQkJCQkJY2FzZSBUSUZGX0ZMT0FUOgorCQkJCQkJCQkqdmFfYXJnKGFwLCBmbG9hdCopID0KKwkJCQkJCQkJCSooZmxvYXQgKil2YWw7CisJCQkJCQkJCXJldF92YWwgPSAxOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIFRJRkZfRE9VQkxFOgorCQkJCQkJCQkqdmFfYXJnKGFwLCBkb3VibGUqKSA9CisJCQkJCQkJCQkqKGRvdWJsZSAqKXZhbDsKKwkJCQkJCQkJcmV0X3ZhbCA9IDE7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCXJldF92YWwgPSAwOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCX0KKwlyZXR1cm4ocmV0X3ZhbCk7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIGEgZmllbGQgaW4gdGhlCisgKiBpbnRlcm5hbCBkaXJlY3Rvcnkgc3RydWN0dXJlLgorICovCitpbnQKK1RJRkZHZXRGaWVsZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcsIC4uLikKK3sKKwlpbnQgc3RhdHVzOworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgdGFnKTsKKwlzdGF0dXMgPSBUSUZGVkdldEZpZWxkKHRpZiwgdGFnLCBhcCk7CisJdmFfZW5kKGFwKTsKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qCisgKiBMaWtlIFRJRkZHZXRGaWVsZCwgYnV0IHRha2luZyBhIHZhcmFyZ3MKKyAqIHBhcmFtZXRlciBsaXN0LiAgVGhpcyByb3V0aW5lIGlzIHVzZWZ1bAorICogZm9yIGJ1aWxkaW5nIGhpZ2hlci1sZXZlbCBpbnRlcmZhY2VzIG9uCisgKiB0b3Agb2YgdGhlIGxpYnJhcnkuCisgKi8KK2ludAorVElGRlZHZXRGaWVsZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcsIHZhX2xpc3QgYXApCit7CisJY29uc3QgVElGRkZpZWxkKiBmaXAgPSBUSUZGRmluZEZpZWxkKHRpZiwgdGFnLCBUSUZGX0FOWSk7CisJcmV0dXJuIChmaXAgJiYgKGlzUHNldWRvVGFnKHRhZykgfHwgVElGRkZpZWxkU2V0KHRpZiwgZmlwLT5maWVsZF9iaXQpKSA/CisJICAgICgqdGlmLT50aWZfdGFnbWV0aG9kcy52Z2V0ZmllbGQpKHRpZiwgdGFnLCBhcCkgOiAwKTsKK30KKworI2RlZmluZQlDbGVhbnVwRmllbGQobWVtYmVyKSB7CQlcCisgICAgaWYgKHRkLT5tZW1iZXIpIHsJCQlcCisJX1RJRkZmcmVlKHRkLT5tZW1iZXIpOwkJXAorCXRkLT5tZW1iZXIgPSAwOwkJCVwKKyAgICB9CQkJCQlcCit9CisKKy8qCisgKiBSZWxlYXNlIHN0b3JhZ2UgYXNzb2NpYXRlZCB3aXRoIGEgZGlyZWN0b3J5LgorICovCit2b2lkCitUSUZGRnJlZURpcmVjdG9yeShUSUZGKiB0aWYpCit7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCWludCAgICAgICAgICAgIGk7CisKKwlfVElGRm1lbXNldCh0ZC0+dGRfZmllbGRzc2V0LCAwLCBGSUVMRF9TRVRMT05HUyk7CisJQ2xlYW51cEZpZWxkKHRkX3NtaW5zYW1wbGV2YWx1ZSk7CisJQ2xlYW51cEZpZWxkKHRkX3NtYXhzYW1wbGV2YWx1ZSk7CisJQ2xlYW51cEZpZWxkKHRkX2NvbG9ybWFwWzBdKTsKKwlDbGVhbnVwRmllbGQodGRfY29sb3JtYXBbMV0pOworCUNsZWFudXBGaWVsZCh0ZF9jb2xvcm1hcFsyXSk7CisJQ2xlYW51cEZpZWxkKHRkX3NhbXBsZWluZm8pOworCUNsZWFudXBGaWVsZCh0ZF9zdWJpZmQpOworCUNsZWFudXBGaWVsZCh0ZF9pbmtuYW1lcyk7CisJQ2xlYW51cEZpZWxkKHRkX3JlZmJsYWNrd2hpdGUpOworCUNsZWFudXBGaWVsZCh0ZF90cmFuc2ZlcmZ1bmN0aW9uWzBdKTsKKwlDbGVhbnVwRmllbGQodGRfdHJhbnNmZXJmdW5jdGlvblsxXSk7CisJQ2xlYW51cEZpZWxkKHRkX3RyYW5zZmVyZnVuY3Rpb25bMl0pOworCUNsZWFudXBGaWVsZCh0ZF9zdHJpcG9mZnNldCk7CisJQ2xlYW51cEZpZWxkKHRkX3N0cmlwYnl0ZWNvdW50KTsKKwlUSUZGQ2xyRmllbGRCaXQodGlmLCBGSUVMRF9ZQ0JDUlNVQlNBTVBMSU5HKTsKKwlUSUZGQ2xyRmllbGRCaXQodGlmLCBGSUVMRF9ZQ0JDUlBPU0lUSU9OSU5HKTsKKworCS8qIENsZWFudXAgY3VzdG9tIHRhZyB2YWx1ZXMgKi8KKwlmb3IoIGkgPSAwOyBpIDwgdGQtPnRkX2N1c3RvbVZhbHVlQ291bnQ7IGkrKyApIHsKKwkJaWYgKHRkLT50ZF9jdXN0b21WYWx1ZXNbaV0udmFsdWUpCisJCQlfVElGRmZyZWUodGQtPnRkX2N1c3RvbVZhbHVlc1tpXS52YWx1ZSk7CisJfQorCisJdGQtPnRkX2N1c3RvbVZhbHVlQ291bnQgPSAwOworCUNsZWFudXBGaWVsZCh0ZF9jdXN0b21WYWx1ZXMpOworCisjaWYgZGVmaW5lZChERUZFUl9TVFJJTEVfTE9BRCkKKyAgICAgICAgX1RJRkZtZW1zZXQoICYodGQtPnRkX3N0cmlwb2Zmc2V0X2VudHJ5KSwgMCwgc2l6ZW9mKFRJRkZEaXJFbnRyeSkpOworICAgICAgICBfVElGRm1lbXNldCggJih0ZC0+dGRfc3RyaXBieXRlY291bnRfZW50cnkpLCAwLCBzaXplb2YoVElGRkRpckVudHJ5KSk7CisjZW5kaWYgICAgICAgIAorfQorI3VuZGVmIENsZWFudXBGaWVsZAorCisvKgorICogQ2xpZW50IFRhZyBleHRlbnNpb24gc3VwcG9ydCAoZnJvbSBOaWxlcyBSaXR0ZXIpLgorICovCitzdGF0aWMgVElGRkV4dGVuZFByb2MgX1RJRkZleHRlbmRlciA9IChUSUZGRXh0ZW5kUHJvYykgTlVMTDsKKworVElGRkV4dGVuZFByb2MKK1RJRkZTZXRUYWdFeHRlbmRlcihUSUZGRXh0ZW5kUHJvYyBleHRlbmRlcikKK3sKKwlUSUZGRXh0ZW5kUHJvYyBwcmV2ID0gX1RJRkZleHRlbmRlcjsKKwlfVElGRmV4dGVuZGVyID0gZXh0ZW5kZXI7CisJcmV0dXJuIChwcmV2KTsKK30KKworLyoKKyAqIFNldHVwIGZvciBhIG5ldyBkaXJlY3RvcnkuICBTaG91bGQgd2UgYXV0b21hdGljYWxseSBjYWxsCisgKiBUSUZGV3JpdGVEaXJlY3RvcnkoKSBpZiB0aGUgY3VycmVudCBvbmUgaXMgZGlydHk/CisgKgorICogVGhlIG5ld2x5IGNyZWF0ZWQgZGlyZWN0b3J5IHdpbGwgbm90IGV4aXN0IG9uIHRoZSBmaWxlIHRpbGwKKyAqIFRJRkZXcml0ZURpcmVjdG9yeSgpLCBUSUZGRmx1c2goKSBvciBUSUZGQ2xvc2UoKSBpcyBjYWxsZWQuCisgKi8KK2ludAorVElGRkNyZWF0ZURpcmVjdG9yeShUSUZGKiB0aWYpCit7CisJVElGRkRlZmF1bHREaXJlY3RvcnkodGlmKTsKKwl0aWYtPnRpZl9kaXJvZmYgPSAwOworCXRpZi0+dGlmX25leHRkaXJvZmYgPSAwOworCXRpZi0+dGlmX2N1cm9mZiA9IDA7CisJdGlmLT50aWZfcm93ID0gKHVpbnQzMikgLTE7CisJdGlmLT50aWZfY3Vyc3RyaXAgPSAodWludDMyKSAtMTsKKworCXJldHVybiAwOworfQorCitpbnQKK1RJRkZDcmVhdGVDdXN0b21EaXJlY3RvcnkoVElGRiogdGlmLCBjb25zdCBUSUZGRmllbGRBcnJheSogaW5mb2FycmF5KQoreworCVRJRkZEZWZhdWx0RGlyZWN0b3J5KHRpZik7CisKKwkvKgorCSAqIFJlc2V0IHRoZSBmaWVsZCBkZWZpbml0aW9ucyB0byBtYXRjaCB0aGUgYXBwbGljYXRpb24gcHJvdmlkZWQgbGlzdC4gCisJICogSG9wZWZ1bGx5IFRJRkZEZWZhdWx0RGlyZWN0b3J5KCkgd29uJ3QgaGF2ZSBkb25lIGFueXRoaW5nIGlycmV2ZXJzYWJsZQorCSAqIGJhc2VkIG9uIGl0J3MgYXNzdW1wdGlvbiB0aGlzIGlzIGFuIGltYWdlIGRpcmVjdG9yeS4KKwkgKi8KKwlfVElGRlNldHVwRmllbGRzKHRpZiwgaW5mb2FycmF5KTsKKworCXRpZi0+dGlmX2Rpcm9mZiA9IDA7CisJdGlmLT50aWZfbmV4dGRpcm9mZiA9IDA7CisJdGlmLT50aWZfY3Vyb2ZmID0gMDsKKwl0aWYtPnRpZl9yb3cgPSAodWludDMyKSAtMTsKKwl0aWYtPnRpZl9jdXJzdHJpcCA9ICh1aW50MzIpIC0xOworCisJcmV0dXJuIDA7Cit9CisKK2ludAorVElGRkNyZWF0ZUVYSUZEaXJlY3RvcnkoVElGRiogdGlmKQoreworCWNvbnN0IFRJRkZGaWVsZEFycmF5KiBleGlmRmllbGRBcnJheTsKKwlleGlmRmllbGRBcnJheSA9IF9USUZGR2V0RXhpZkZpZWxkcygpOworCXJldHVybiBUSUZGQ3JlYXRlQ3VzdG9tRGlyZWN0b3J5KHRpZiwgZXhpZkZpZWxkQXJyYXkpOworfQorCisvKgorICogU2V0dXAgYSBkZWZhdWx0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCisgKi8KK2ludAorVElGRkRlZmF1bHREaXJlY3RvcnkoVElGRiogdGlmKQoreworCXJlZ2lzdGVyIFRJRkZEaXJlY3RvcnkqIHRkID0gJnRpZi0+dGlmX2RpcjsKKwljb25zdCBUSUZGRmllbGRBcnJheSogdGlmZkZpZWxkQXJyYXk7CisKKwl0aWZmRmllbGRBcnJheSA9IF9USUZGR2V0RmllbGRzKCk7CisJX1RJRkZTZXR1cEZpZWxkcyh0aWYsIHRpZmZGaWVsZEFycmF5KTsgICAKKworCV9USUZGbWVtc2V0KHRkLCAwLCBzaXplb2YgKCp0ZCkpOworCXRkLT50ZF9maWxsb3JkZXIgPSBGSUxMT1JERVJfTVNCMkxTQjsKKwl0ZC0+dGRfYml0c3BlcnNhbXBsZSA9IDE7CisJdGQtPnRkX3RocmVzaGhvbGRpbmcgPSBUSFJFU0hIT0xEX0JJTEVWRUw7CisJdGQtPnRkX29yaWVudGF0aW9uID0gT1JJRU5UQVRJT05fVE9QTEVGVDsKKwl0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsID0gMTsKKwl0ZC0+dGRfcm93c3BlcnN0cmlwID0gKHVpbnQzMikgLTE7CisJdGQtPnRkX3RpbGV3aWR0aCA9IDA7CisJdGQtPnRkX3RpbGVsZW5ndGggPSAwOworCXRkLT50ZF90aWxlZGVwdGggPSAxOworCXRkLT50ZF9zdHJpcGJ5dGVjb3VudHNvcnRlZCA9IDE7IC8qIE91ciBvd24gYXJyYXlzIGFsd2F5cyBzb3J0ZWQuICovICAKKwl0ZC0+dGRfcmVzb2x1dGlvbnVuaXQgPSBSRVNVTklUX0lOQ0g7CisJdGQtPnRkX3NhbXBsZWZvcm1hdCA9IFNBTVBMRUZPUk1BVF9VSU5UOworCXRkLT50ZF9pbWFnZWRlcHRoID0gMTsKKwl0ZC0+dGRfeWNiY3JzdWJzYW1wbGluZ1swXSA9IDI7CisJdGQtPnRkX3ljYmNyc3Vic2FtcGxpbmdbMV0gPSAyOworCXRkLT50ZF95Y2JjcnBvc2l0aW9uaW5nID0gWUNCQ1JQT1NJVElPTl9DRU5URVJFRDsKKwl0aWYtPnRpZl9wb3N0ZGVjb2RlID0gX1RJRkZOb1Bvc3REZWNvZGU7ICAKKwl0aWYtPnRpZl9mb3VuZGZpZWxkID0gTlVMTDsKKwl0aWYtPnRpZl90YWdtZXRob2RzLnZzZXRmaWVsZCA9IF9USUZGVlNldEZpZWxkOyAgCisJdGlmLT50aWZfdGFnbWV0aG9kcy52Z2V0ZmllbGQgPSBfVElGRlZHZXRGaWVsZDsKKwl0aWYtPnRpZl90YWdtZXRob2RzLnByaW50ZGlyID0gTlVMTDsKKwkvKgorCSAqICBHaXZlIGNsaWVudCBjb2RlIGEgY2hhbmNlIHRvIGluc3RhbGwgdGhlaXIgb3duCisJICogIHRhZyBleHRlbnNpb25zICYgbWV0aG9kcywgcHJpb3IgdG8gY29tcHJlc3Npb24gb3ZlcmxvYWRzLAorCSAqICBidXQgZG8gc29tZSBwcmlvciBjbGVhbnVwIGZpcnN0LiAoaHR0cDovL3RyYWMub3NnZW8ub3JnL2dkYWwvdGlja2V0LzUwNTQpCisJICovCisJaWYgKHRpZi0+dGlmX25maWVsZHNjb21wYXQgPiAwKSB7CisJCXVpbnQzMiBpOworCisJCWZvciAoaSA9IDA7IGkgPCB0aWYtPnRpZl9uZmllbGRzY29tcGF0OyBpKyspIHsKKwkJCQlpZiAodGlmLT50aWZfZmllbGRzY29tcGF0W2ldLmFsbG9jYXRlZF9zaXplKQorCQkJCQkJX1RJRkZmcmVlKHRpZi0+dGlmX2ZpZWxkc2NvbXBhdFtpXS5maWVsZHMpOworCQl9CisJCV9USUZGZnJlZSh0aWYtPnRpZl9maWVsZHNjb21wYXQpOworCQl0aWYtPnRpZl9uZmllbGRzY29tcGF0ID0gMDsKKwkJdGlmLT50aWZfZmllbGRzY29tcGF0ID0gTlVMTDsKKwl9CisJaWYgKF9USUZGZXh0ZW5kZXIpCisJCSgqX1RJRkZleHRlbmRlcikodGlmKTsKKwkodm9pZCkgVElGRlNldEZpZWxkKHRpZiwgVElGRlRBR19DT01QUkVTU0lPTiwgQ09NUFJFU1NJT05fTk9ORSk7CisJLyoKKwkgKiBOQjogVGhlIGRpcmVjdG9yeSBpcyBtYXJrZWQgZGlydHkgYXMgYSByZXN1bHQgb2Ygc2V0dGluZworCSAqIHVwIHRoZSBkZWZhdWx0IGNvbXByZXNzaW9uIHNjaGVtZS4gIEhvd2V2ZXIsIHRoaXMgcmVhbGx5CisJICogaXNuJ3QgY29ycmVjdCAtLSB3ZSB3YW50IFRJRkZfRElSVFlESVJFQ1QgdG8gYmUgc2V0IG9ubHkKKwkgKiBpZiB0aGUgdXNlciBkb2VzIHNvbWV0aGluZy4gIFdlIGNvdWxkIGp1c3QgZG8gdGhlIHNldHVwCisJICogYnkgaGFuZCwgYnV0IGl0IHNlZW1zIGJldHRlciB0byB1c2UgdGhlIG5vcm1hbCBtZWNoYW5pc20KKwkgKiAoaS5lLiBUSUZGU2V0RmllbGQpLgorCSAqLworCXRpZi0+dGlmX2ZsYWdzICY9IH5USUZGX0RJUlRZRElSRUNUOworCisJLyoKKwkgKiBBcyBwZXIgaHR0cDovL2J1Z3ppbGxhLnJlbW90ZXNlbnNpbmcub3JnL3Nob3dfYnVnLmNnaT9pZD0xOQorCSAqIHdlIGNsZWFyIHRoZSBJU1RJTEVEIGZsYWcgd2hlbiBzZXR0aW5nIHVwIGEgbmV3IGRpcmVjdG9yeS4KKwkgKiBTaG91bGQgd2UgYWxzbyBiZSBjbGVhcmluZyBzdHVmZiBsaWtlIElOU1VCSUZEPworCSAqLworCXRpZi0+dGlmX2ZsYWdzICY9IH5USUZGX0lTVElMRUQ7CisKKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW50CitUSUZGQWR2YW5jZURpcmVjdG9yeShUSUZGKiB0aWYsIHVpbnQ2NCogbmV4dGRpciwgdWludDY0KiBvZmYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRkFkdmFuY2VEaXJlY3RvcnkiOworCWlmIChpc01hcHBlZCh0aWYpKQorCXsKKwkJdWludDY0IHBvZmY9Km5leHRkaXI7CisJCWlmICghKHRpZi0+dGlmX2ZsYWdzJlRJRkZfQklHVElGRikpCisJCXsKKwkJCXRtc2l6ZV90IHBvZmZhLHBvZmZiLHBvZmZjLHBvZmZkOworCQkJdWludDE2IGRpcmNvdW50OworCQkJdWludDMyIG5leHRkaXIzMjsKKwkJCXBvZmZhPSh0bXNpemVfdClwb2ZmOworCQkJcG9mZmI9cG9mZmErc2l6ZW9mKHVpbnQxNik7CisJCQlpZiAoKCh1aW50NjQpcG9mZmEhPXBvZmYpfHwocG9mZmI8cG9mZmEpfHwocG9mZmI8KHRtc2l6ZV90KXNpemVvZih1aW50MTYpKXx8KHBvZmZiPnRpZi0+dGlmX3NpemUpKQorCQkJeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiRXJyb3IgZmV0Y2hpbmcgZGlyZWN0b3J5IGNvdW50Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5leHRkaXI9MDsKKwkJCQlyZXR1cm4oMCk7CisJCQl9CisJCQlfVElGRm1lbWNweSgmZGlyY291bnQsdGlmLT50aWZfYmFzZStwb2ZmYSxzaXplb2YodWludDE2KSk7CisJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiU2hvcnQoJmRpcmNvdW50KTsKKwkJCXBvZmZjPXBvZmZiK2RpcmNvdW50KjEyOworCQkJcG9mZmQ9cG9mZmMrc2l6ZW9mKHVpbnQzMik7CisJCQlpZiAoKHBvZmZjPHBvZmZiKXx8KHBvZmZjPGRpcmNvdW50KjEyKXx8KHBvZmZkPHBvZmZjKXx8KHBvZmZkPCh0bXNpemVfdClzaXplb2YodWludDMyKSl8fChwb2ZmZD50aWYtPnRpZl9zaXplKSkKKwkJCXsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkVycm9yIGZldGNoaW5nIGRpcmVjdG9yeSBsaW5rIik7CisJCQkJcmV0dXJuKDApOworCQkJfQorCQkJaWYgKG9mZiE9TlVMTCkKKwkJCQkqb2ZmPSh1aW50NjQpcG9mZmM7CisJCQlfVElGRm1lbWNweSgmbmV4dGRpcjMyLHRpZi0+dGlmX2Jhc2UrcG9mZmMsc2l6ZW9mKHVpbnQzMikpOworCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYkxvbmcoJm5leHRkaXIzMik7CisJCQkqbmV4dGRpcj1uZXh0ZGlyMzI7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0bXNpemVfdCBwb2ZmYSxwb2ZmYixwb2ZmYyxwb2ZmZDsKKwkJCXVpbnQ2NCBkaXJjb3VudDY0OworCQkJdWludDE2IGRpcmNvdW50MTY7CisJCQlwb2ZmYT0odG1zaXplX3QpcG9mZjsKKwkJCXBvZmZiPXBvZmZhK3NpemVvZih1aW50NjQpOworCQkJaWYgKCgodWludDY0KXBvZmZhIT1wb2ZmKXx8KHBvZmZiPHBvZmZhKXx8KHBvZmZiPCh0bXNpemVfdClzaXplb2YodWludDY0KSl8fChwb2ZmYj50aWYtPnRpZl9zaXplKSkKKwkJCXsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkVycm9yIGZldGNoaW5nIGRpcmVjdG9yeSBjb3VudCIpOworCQkJCXJldHVybigwKTsKKwkJCX0KKwkJCV9USUZGbWVtY3B5KCZkaXJjb3VudDY0LHRpZi0+dGlmX2Jhc2UrcG9mZmEsc2l6ZW9mKHVpbnQ2NCkpOworCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYkxvbmc4KCZkaXJjb3VudDY0KTsKKwkJCWlmIChkaXJjb3VudDY0PjB4RkZGRikKKwkJCXsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIlNhbml0eSBjaGVjayBvbiBkaXJlY3RvcnkgY291bnQgZmFpbGVkIik7CisJCQkJcmV0dXJuKDApOworCQkJfQorCQkJZGlyY291bnQxNj0odWludDE2KWRpcmNvdW50NjQ7CisJCQlwb2ZmYz1wb2ZmYitkaXJjb3VudDE2KjIwOworCQkJcG9mZmQ9cG9mZmMrc2l6ZW9mKHVpbnQ2NCk7CisJCQlpZiAoKHBvZmZjPHBvZmZiKXx8KHBvZmZjPGRpcmNvdW50MTYqMjApfHwocG9mZmQ8cG9mZmMpfHwocG9mZmQ8KHRtc2l6ZV90KXNpemVvZih1aW50NjQpKXx8KHBvZmZkPnRpZi0+dGlmX3NpemUpKQorCQkJeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiRXJyb3IgZmV0Y2hpbmcgZGlyZWN0b3J5IGxpbmsiKTsKKwkJCQlyZXR1cm4oMCk7CisJCQl9CisJCQlpZiAob2ZmIT1OVUxMKQorCQkJCSpvZmY9KHVpbnQ2NClwb2ZmYzsKKwkJCV9USUZGbWVtY3B5KG5leHRkaXIsdGlmLT50aWZfYmFzZStwb2ZmYyxzaXplb2YodWludDY0KSk7CisJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiTG9uZzgobmV4dGRpcik7CisJCX0KKwkJcmV0dXJuKDEpOworCX0KKwllbHNlCisJeworCQlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCQl7CisJCQl1aW50MTYgZGlyY291bnQ7CisJCQl1aW50MzIgbmV4dGRpcjMyOworCQkJaWYgKCFTZWVrT0sodGlmLCAqbmV4dGRpcikgfHwKKwkJCSAgICAhUmVhZE9LKHRpZiwgJmRpcmNvdW50LCBzaXplb2YgKHVpbnQxNikpKSB7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIiVzOiBFcnJvciBmZXRjaGluZyBkaXJlY3RvcnkgY291bnQiLAorCQkJCSAgICB0aWYtPnRpZl9uYW1lKTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiU2hvcnQoJmRpcmNvdW50KTsKKwkJCWlmIChvZmYgIT0gTlVMTCkKKwkJCQkqb2ZmID0gVElGRlNlZWtGaWxlKHRpZiwKKwkJCQkgICAgZGlyY291bnQqMTIsIFNFRUtfQ1VSKTsKKwkJCWVsc2UKKwkJCQkodm9pZCkgVElGRlNlZWtGaWxlKHRpZiwKKwkJCQkgICAgZGlyY291bnQqMTIsIFNFRUtfQ1VSKTsKKwkJCWlmICghUmVhZE9LKHRpZiwgJm5leHRkaXIzMiwgc2l6ZW9mICh1aW50MzIpKSkgeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICIlczogRXJyb3IgZmV0Y2hpbmcgZGlyZWN0b3J5IGxpbmsiLAorCQkJCSAgICB0aWYtPnRpZl9uYW1lKTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiTG9uZygmbmV4dGRpcjMyKTsKKwkJCSpuZXh0ZGlyPW5leHRkaXIzMjsKKwkJfQorCQllbHNlCisJCXsKKwkJCXVpbnQ2NCBkaXJjb3VudDY0OworCQkJdWludDE2IGRpcmNvdW50MTY7CisJCQlpZiAoIVNlZWtPSyh0aWYsICpuZXh0ZGlyKSB8fAorCQkJICAgICFSZWFkT0sodGlmLCAmZGlyY291bnQ2NCwgc2l6ZW9mICh1aW50NjQpKSkgeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICIlczogRXJyb3IgZmV0Y2hpbmcgZGlyZWN0b3J5IGNvdW50IiwKKwkJCQkgICAgdGlmLT50aWZfbmFtZSk7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYkxvbmc4KCZkaXJjb3VudDY0KTsKKwkJCWlmIChkaXJjb3VudDY0PjB4RkZGRikKKwkJCXsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiRXJyb3IgZmV0Y2hpbmcgZGlyZWN0b3J5IGNvdW50Iik7CisJCQkJcmV0dXJuKDApOworCQkJfQorCQkJZGlyY291bnQxNiA9ICh1aW50MTYpZGlyY291bnQ2NDsKKwkJCWlmIChvZmYgIT0gTlVMTCkKKwkJCQkqb2ZmID0gVElGRlNlZWtGaWxlKHRpZiwKKwkJCQkgICAgZGlyY291bnQxNioyMCwgU0VFS19DVVIpOworCQkJZWxzZQorCQkJCSh2b2lkKSBUSUZGU2Vla0ZpbGUodGlmLAorCQkJCSAgICBkaXJjb3VudDE2KjIwLCBTRUVLX0NVUik7CisJCQlpZiAoIVJlYWRPSyh0aWYsIG5leHRkaXIsIHNpemVvZiAodWludDY0KSkpIHsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBFcnJvciBmZXRjaGluZyBkaXJlY3RvcnkgbGluayIsCisJCQkJICAgIHRpZi0+dGlmX25hbWUpOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCQlpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJMb25nOChuZXh0ZGlyKTsKKwkJfQorCQlyZXR1cm4gKDEpOworCX0KK30KKworLyoKKyAqIENvdW50IHRoZSBudW1iZXIgb2YgZGlyZWN0b3JpZXMgaW4gYSBmaWxlLgorICovCit1aW50MTYKK1RJRkZOdW1iZXJPZkRpcmVjdG9yaWVzKFRJRkYqIHRpZikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGTnVtYmVyT2ZEaXJlY3RvcmllcyI7CisJdWludDY0IG5leHRkaXI7CisJdWludDE2IG47CisJaWYgKCEodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKSkKKwkJbmV4dGRpciA9IHRpZi0+dGlmX2hlYWRlci5jbGFzc2ljLnRpZmZfZGlyb2ZmOworCWVsc2UKKwkJbmV4dGRpciA9IHRpZi0+dGlmX2hlYWRlci5iaWcudGlmZl9kaXJvZmY7CisJbiA9IDA7CisJd2hpbGUgKG5leHRkaXIgIT0gMCAmJiBUSUZGQWR2YW5jZURpcmVjdG9yeSh0aWYsICZuZXh0ZGlyLCBOVUxMKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChuICE9IDY1NTM1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICArK247CisgICAgICAgICAgICAgICAgfQorCQllbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlyZWN0b3J5IGNvdW50IGV4Y2VlZGVkIDY1NTM1IGxpbWl0LCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGdpdmluZyB1cCBvbiBjb3VudGluZy4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoNjU1MzUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCXJldHVybiAobik7Cit9CisKKy8qCisgKiBTZXQgdGhlIG4tdGggZGlyZWN0b3J5IGFzIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKyAqIE5COiBEaXJlY3RvcmllcyBhcmUgbnVtYmVyZWQgc3RhcnRpbmcgYXQgMC4KKyAqLworaW50CitUSUZGU2V0RGlyZWN0b3J5KFRJRkYqIHRpZiwgdWludDE2IGRpcm4pCit7CisJdWludDY0IG5leHRkaXI7CisJdWludDE2IG47CisKKwlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCQluZXh0ZGlyID0gdGlmLT50aWZfaGVhZGVyLmNsYXNzaWMudGlmZl9kaXJvZmY7CisJZWxzZQorCQluZXh0ZGlyID0gdGlmLT50aWZfaGVhZGVyLmJpZy50aWZmX2Rpcm9mZjsKKwlmb3IgKG4gPSBkaXJuOyBuID4gMCAmJiBuZXh0ZGlyICE9IDA7IG4tLSkKKwkJaWYgKCFUSUZGQWR2YW5jZURpcmVjdG9yeSh0aWYsICZuZXh0ZGlyLCBOVUxMKSkKKwkJCXJldHVybiAoMCk7CisJdGlmLT50aWZfbmV4dGRpcm9mZiA9IG5leHRkaXI7CisJLyoKKwkgKiBTZXQgY3VyZGlyIHRvIHRoZSBhY3R1YWwgZGlyZWN0b3J5IGluZGV4LiAgVGhlCisJICogLTEgaXMgYmVjYXVzZSBUSUZGUmVhZERpcmVjdG9yeSB3aWxsIGluY3JlbWVudAorCSAqIHRpZl9jdXJkaXIgYWZ0ZXIgc3VjY2Vzc2Z1bGx5IHJlYWRpbmcgdGhlIGRpcmVjdG9yeS4KKwkgKi8KKwl0aWYtPnRpZl9jdXJkaXIgPSAoZGlybiAtIG4pIC0gMTsKKwkvKgorCSAqIFJlc2V0IHRpZl9kaXJudW1iZXIgY291bnRlciBhbmQgc3RhcnQgbmV3IGxpc3Qgb2Ygc2VlbiBkaXJlY3Rvcmllcy4KKwkgKiBXZSBuZWVkIHRoaXMgdG8gcHJldmVudCBJRkQgbG9vcHMuCisJICovCisJdGlmLT50aWZfZGlybnVtYmVyID0gMDsKKwlyZXR1cm4gKFRJRkZSZWFkRGlyZWN0b3J5KHRpZikpOworfQorCisvKgorICogU2V0IHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0byBiZSB0aGUgZGlyZWN0b3J5CisgKiBsb2NhdGVkIGF0IHRoZSBzcGVjaWZpZWQgZmlsZSBvZmZzZXQuICBUaGlzIGludGVyZmFjZQorICogaXMgdXNlZCBtYWlubHkgdG8gYWNjZXNzIGRpcmVjdG9yaWVzIGxpbmtlZCB3aXRoCisgKiB0aGUgU3ViSUZEIHRhZyAoZS5nLiB0aHVtYm5haWwgaW1hZ2VzKS4KKyAqLworaW50CitUSUZGU2V0U3ViRGlyZWN0b3J5KFRJRkYqIHRpZiwgdWludDY0IGRpcm9mZikKK3sKKwl0aWYtPnRpZl9uZXh0ZGlyb2ZmID0gZGlyb2ZmOworCS8qCisJICogUmVzZXQgdGlmX2Rpcm51bWJlciBjb3VudGVyIGFuZCBzdGFydCBuZXcgbGlzdCBvZiBzZWVuIGRpcmVjdG9yaWVzLgorCSAqIFdlIG5lZWQgdGhpcyB0byBwcmV2ZW50IElGRCBsb29wcy4KKwkgKi8KKwl0aWYtPnRpZl9kaXJudW1iZXIgPSAwOworCXJldHVybiAoVElGRlJlYWREaXJlY3RvcnkodGlmKSk7Cit9CisKKy8qCisgKiBSZXR1cm4gZmlsZSBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorICovCit1aW50NjQKK1RJRkZDdXJyZW50RGlyT2Zmc2V0KFRJRkYqIHRpZikKK3sKKwlyZXR1cm4gKHRpZi0+dGlmX2Rpcm9mZik7Cit9CisKKy8qCisgKiBSZXR1cm4gYW4gaW5kaWNhdGlvbiBvZiB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUKKyAqIGF0IHRoZSBsYXN0IGRpcmVjdG9yeSBpbiB0aGUgZmlsZS4KKyAqLworaW50CitUSUZGTGFzdERpcmVjdG9yeShUSUZGKiB0aWYpCit7CisJcmV0dXJuICh0aWYtPnRpZl9uZXh0ZGlyb2ZmID09IDApOworfQorCisvKgorICogVW5saW5rIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGZyb20gdGhlIGRpcmVjdG9yeSBjaGFpbi4KKyAqLworaW50CitUSUZGVW5saW5rRGlyZWN0b3J5KFRJRkYqIHRpZiwgdWludDE2IGRpcm4pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRlVubGlua0RpcmVjdG9yeSI7CisJdWludDY0IG5leHRkaXI7CisJdWludDY0IG9mZjsKKwl1aW50MTYgbjsKKworCWlmICh0aWYtPnRpZl9tb2RlID09IE9fUkRPTkxZKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW4gbm90IHVubGluayBkaXJlY3RvcnkgaW4gcmVhZC1vbmx5IGZpbGUiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJLyoKKwkgKiBHbyB0byB0aGUgZGlyZWN0b3J5IGJlZm9yZSB0aGUgb25lIHdlIHdhbnQKKwkgKiB0byB1bmxpbmsgYW5kIG5hYiB0aGUgb2Zmc2V0IG9mIHRoZSBsaW5rCisJICogZmllbGQgd2UnbGwgbmVlZCB0byBwYXRjaC4KKwkgKi8KKwlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCXsKKwkJbmV4dGRpciA9IHRpZi0+dGlmX2hlYWRlci5jbGFzc2ljLnRpZmZfZGlyb2ZmOworCQlvZmYgPSA0OworCX0KKwllbHNlCisJeworCQluZXh0ZGlyID0gdGlmLT50aWZfaGVhZGVyLmJpZy50aWZmX2Rpcm9mZjsKKwkJb2ZmID0gODsKKwl9CisJZm9yIChuID0gZGlybi0xOyBuID4gMDsgbi0tKSB7CisJCWlmIChuZXh0ZGlyID09IDApIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJEaXJlY3RvcnkgJWQgZG9lcyBub3QgZXhpc3QiLCBkaXJuKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJaWYgKCFUSUZGQWR2YW5jZURpcmVjdG9yeSh0aWYsICZuZXh0ZGlyLCAmb2ZmKSkKKwkJCXJldHVybiAoMCk7CisJfQorCS8qCisJICogQWR2YW5jZSB0byB0aGUgZGlyZWN0b3J5IHRvIGJlIHVubGlua2VkIGFuZCBmZXRjaAorCSAqIHRoZSBvZmZzZXQgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGZvbGxvd3MuCisJICovCisJaWYgKCFUSUZGQWR2YW5jZURpcmVjdG9yeSh0aWYsICZuZXh0ZGlyLCBOVUxMKSkKKwkJcmV0dXJuICgwKTsKKwkvKgorCSAqIEdvIGJhY2sgYW5kIHBhdGNoIHRoZSBsaW5rIGZpZWxkIG9mIHRoZSBwcmVjZWRpbmcKKwkgKiBkaXJlY3RvcnkgdG8gcG9pbnQgdG8gdGhlIG9mZnNldCBvZiB0aGUgZGlyZWN0b3J5CisJICogdGhhdCBmb2xsb3dzLgorCSAqLworCSh2b2lkKSBUSUZGU2Vla0ZpbGUodGlmLCBvZmYsIFNFRUtfU0VUKTsKKwlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCXsKKwkJdWludDMyIG5leHRkaXIzMjsKKwkJbmV4dGRpcjMyPSh1aW50MzIpbmV4dGRpcjsKKwkJYXNzZXJ0KCh1aW50NjQpbmV4dGRpcjMyPT1uZXh0ZGlyKTsKKwkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKQorCQkJVElGRlN3YWJMb25nKCZuZXh0ZGlyMzIpOworCQlpZiAoIVdyaXRlT0sodGlmLCAmbmV4dGRpcjMyLCBzaXplb2YgKHVpbnQzMikpKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiRXJyb3Igd3JpdGluZyBkaXJlY3RvcnkgbGluayIpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1NXQUIpCisJCQlUSUZGU3dhYkxvbmc4KCZuZXh0ZGlyKTsKKwkJaWYgKCFXcml0ZU9LKHRpZiwgJm5leHRkaXIsIHNpemVvZiAodWludDY0KSkpIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJFcnJvciB3cml0aW5nIGRpcmVjdG9yeSBsaW5rIik7CisJCQlyZXR1cm4gKDApOworCQl9CisJfQorCS8qCisJICogTGVhdmUgZGlyZWN0b3J5IHN0YXRlIHNldHVwIHNhZmVseS4gIFdlIGRvbid0IGhhdmUKKwkgKiBmYWNpbGl0aWVzIGZvciBkb2luZyBpbnNlcnRpbmcgYW5kIHJlbW92aW5nIGRpcmVjdG9yaWVzLAorCSAqIHNvIGl0J3Mgc2FmZXN0IHRvIGp1c3QgaW52YWxpZGF0ZSBldmVyeXRoaW5nLiAgVGhpcworCSAqIG1lYW5zIHRoYXQgdGhlIGNhbGxlciBjYW4gb25seSBhcHBlbmQgdG8gdGhlIGRpcmVjdG9yeQorCSAqIGNoYWluLgorCSAqLworCSgqdGlmLT50aWZfY2xlYW51cCkodGlmKTsKKwlpZiAoKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9NWUJVRkZFUikgJiYgdGlmLT50aWZfcmF3ZGF0YSkgeworCQlfVElGRmZyZWUodGlmLT50aWZfcmF3ZGF0YSk7CisJCXRpZi0+dGlmX3Jhd2RhdGEgPSBOVUxMOworCQl0aWYtPnRpZl9yYXdjYyA9IDA7CisgICAgICAgICAgICAgICAgdGlmLT50aWZfcmF3ZGF0YW9mZiA9IDA7CisgICAgICAgICAgICAgICAgdGlmLT50aWZfcmF3ZGF0YWxvYWRlZCA9IDA7CisJfQorCXRpZi0+dGlmX2ZsYWdzICY9IH4oVElGRl9CRUVOV1JJVElOR3xUSUZGX0JVRkZFUlNFVFVQfFRJRkZfUE9TVEVOQ09ERXxUSUZGX0JVRjRXUklURSk7CisJVElGRkZyZWVEaXJlY3RvcnkodGlmKTsKKwlUSUZGRGVmYXVsdERpcmVjdG9yeSh0aWYpOworCXRpZi0+dGlmX2Rpcm9mZiA9IDA7CQkJLyogZm9yY2UgbGluayBvbiBuZXh0IHdyaXRlICovCisJdGlmLT50aWZfbmV4dGRpcm9mZiA9IDA7CQkvKiBuZXh0IHdyaXRlIG11c3QgYmUgYXQgZW5kICovCisJdGlmLT50aWZfY3Vyb2ZmID0gMDsKKwl0aWYtPnRpZl9yb3cgPSAodWludDMyKSAtMTsKKwl0aWYtPnRpZl9jdXJzdHJpcCA9ICh1aW50MzIpIC0xOworCXJldHVybiAoMSk7Cit9CisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTggc3c9OCBub2V0OiAqLworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZGlyLmggYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9kaXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWY1ZjNkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZGlyLmgKQEAgLTAsMCArMSwzMDggQEAKKy8qICRJZDogdGlmX2Rpci5oLHYgMS41NCAyMDExLTAyLTE4IDIwOjUzOjA1IGZ3YXJtZXJkYW0gRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OC0xOTk3IFNhbSBMZWZmbGVyCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEtMTk5NyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgKiB0aGF0IChpKSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisgKiBhbGwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uLCBhbmQgKGlpKSB0aGUgbmFtZXMgb2YKKyAqIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzIG1heSBub3QgYmUgdXNlZCBpbiBhbnkgYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCB0aGUgc3BlY2lmaWMsIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24gb2YgU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgCisgKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIAorICogSU4gTk8gRVZFTlQgU0hBTEwgU0FNIExFRkZMRVIgT1IgU0lMSUNPTiBHUkFQSElDUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELAorICogT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorICogV0hFVEhFUiBPUiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRiAKKyAqIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgCisgKiBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX1RJRkZESVJfCisjZGVmaW5lCV9USUZGRElSXworLyoKKyAqIGBgTGlicmFyeS1wcml2YXRlJycgRGlyZWN0b3J5LXJlbGF0ZWQgRGVmaW5pdGlvbnMuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCWNvbnN0IFRJRkZGaWVsZCAqaW5mbzsKKwlpbnQgICAgICAgICAgICAgY291bnQ7CisJdm9pZCAgICAgICAgICAgKnZhbHVlOworfSBUSUZGVGFnVmFsdWU7CisKKy8qCisgKiBUSUZGIEltYWdlIEZpbGUgRGlyZWN0b3JpZXMgYXJlIGNvbXByaXNlZCBvZiBhIHRhYmxlIG9mIGZpZWxkCisgKiBkZXNjcmlwdG9ycyBvZiB0aGUgZm9ybSBzaG93biBiZWxvdy4gIFRoZSB0YWJsZSBpcyBzb3J0ZWQgaW4KKyAqIGFzY2VuZGluZyBvcmRlciBieSB0YWcuICBUaGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGVudHJ5IGFyZQorICogZGlzam9pbnQgYW5kIG1heSBhcHBlYXIgYW55d2hlcmUgaW4gdGhlIGZpbGUgKHNvIGxvbmcgYXMgdGhleSBhcmUKKyAqIHBsYWNlZCBvbiBhIHdvcmQgYm91bmRhcnkpLgorICoKKyAqIElmIHRoZSB2YWx1ZSBpcyA0IGJ5dGVzIG9yIGxlc3MsIGluIENsYXNzaWNUSUZGLCBvciA4IGJ5dGVzIG9yIGxlc3MgaW4KKyAqIEJpZ1RJRkYsIHRoZW4gaXQgaXMgcGxhY2VkIGluIHRoZSBvZmZzZXQgZmllbGQgdG8gc2F2ZSBzcGFjZS4gSWYgc28sCisgKiBpdCBpcyBsZWZ0LWp1c3RpZmllZCBpbiB0aGUgb2Zmc2V0IGZpZWxkLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2IHRkaXJfdGFnOyAgICAgICAgLyogc2VlIGJlbG93ICovCisJdWludDE2IHRkaXJfdHlwZTsgICAgICAgLyogZGF0YSB0eXBlOyBzZWUgYmVsb3cgKi8KKwl1aW50NjQgdGRpcl9jb3VudDsgICAgICAvKiBudW1iZXIgb2YgaXRlbXM7IGxlbmd0aCBpbiBzcGVjICovCisJdW5pb24geworCQl1aW50MTYgdG9mZl9zaG9ydDsKKwkJdWludDMyIHRvZmZfbG9uZzsKKwkJdWludDY0IHRvZmZfbG9uZzg7CisJfSB0ZGlyX29mZnNldDsJCS8qIGVpdGhlciBvZmZzZXQgb3IgdGhlIGRhdGEgaXRzZWxmIGlmIGZpdHMgKi8KK30gVElGRkRpckVudHJ5OworCisvKgorICogSW50ZXJuYWwgZm9ybWF0IG9mIGEgVElGRiBkaXJlY3RvcnkgZW50cnkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyNkZWZpbmUgRklFTERfU0VUTE9OR1MgNAorCS8qIGJpdCB2ZWN0b3Igb2YgZmllbGRzIHRoYXQgYXJlIHNldCAqLworCXVuc2lnbmVkIGxvbmcgdGRfZmllbGRzc2V0W0ZJRUxEX1NFVExPTkdTXTsKKworCXVpbnQzMiAgdGRfaW1hZ2V3aWR0aCwgdGRfaW1hZ2VsZW5ndGgsIHRkX2ltYWdlZGVwdGg7CisJdWludDMyICB0ZF90aWxld2lkdGgsIHRkX3RpbGVsZW5ndGgsIHRkX3RpbGVkZXB0aDsKKwl1aW50MzIgIHRkX3N1YmZpbGV0eXBlOworCXVpbnQxNiAgdGRfYml0c3BlcnNhbXBsZTsKKwl1aW50MTYgIHRkX3NhbXBsZWZvcm1hdDsKKwl1aW50MTYgIHRkX2NvbXByZXNzaW9uOworCXVpbnQxNiAgdGRfcGhvdG9tZXRyaWM7CisJdWludDE2ICB0ZF90aHJlc2hob2xkaW5nOworCXVpbnQxNiAgdGRfZmlsbG9yZGVyOworCXVpbnQxNiAgdGRfb3JpZW50YXRpb247CisJdWludDE2ICB0ZF9zYW1wbGVzcGVycGl4ZWw7CisJdWludDMyICB0ZF9yb3dzcGVyc3RyaXA7CisJdWludDE2ICB0ZF9taW5zYW1wbGV2YWx1ZSwgdGRfbWF4c2FtcGxldmFsdWU7CisJZG91YmxlKiB0ZF9zbWluc2FtcGxldmFsdWU7CisJZG91YmxlKiB0ZF9zbWF4c2FtcGxldmFsdWU7CisJZmxvYXQgICB0ZF94cmVzb2x1dGlvbiwgdGRfeXJlc29sdXRpb247CisJdWludDE2ICB0ZF9yZXNvbHV0aW9udW5pdDsKKwl1aW50MTYgIHRkX3BsYW5hcmNvbmZpZzsKKwlmbG9hdCAgIHRkX3hwb3NpdGlvbiwgdGRfeXBvc2l0aW9uOworCXVpbnQxNiAgdGRfcGFnZW51bWJlclsyXTsKKwl1aW50MTYqIHRkX2NvbG9ybWFwWzNdOworCXVpbnQxNiAgdGRfaGFsZnRvbmVoaW50c1syXTsKKwl1aW50MTYgIHRkX2V4dHJhc2FtcGxlczsKKwl1aW50MTYqIHRkX3NhbXBsZWluZm87CisJLyogZXZlbiB0aG91Z2ggdGhlIG5hbWUgaXMgbWlzbGVhZGluZywgdGRfc3RyaXBzcGVyaW1hZ2UgaXMgdGhlIG51bWJlcgorCSAqIG9mIHN0cmlsZXMgKD1zdHJpcHMgb3IgdGlsZXMpIHBlciBwbGFuZSwgYW5kIHRkX25zdHJpcHMgdGhlIHRvdGFsCisJICogbnVtYmVyIG9mIHN0cmlsZXMgKi8KKwl1aW50MzIgIHRkX3N0cmlwc3BlcmltYWdlOyAgCisJdWludDMyICB0ZF9uc3RyaXBzOyAgICAgICAgICAgICAgLyogc2l6ZSBvZiBvZmZzZXQgJiBieXRlY291bnQgYXJyYXlzICovCisJdWludDY0KiB0ZF9zdHJpcG9mZnNldDsKKwl1aW50NjQqIHRkX3N0cmlwYnl0ZWNvdW50OworCWludCAgICAgdGRfc3RyaXBieXRlY291bnRzb3J0ZWQ7IC8qIGlzIHRoZSBieXRlY291bnQgYXJyYXkgc29ydGVkIGFzY2VuZGluZz8gKi8KKyNpZiBkZWZpbmVkKERFRkVSX1NUUklMRV9MT0FEKQorICAgICAgICBUSUZGRGlyRW50cnkgdGRfc3RyaXBvZmZzZXRfZW50cnk7ICAgIC8qIGZvciBkZWZlcnJlZCBsb2FkaW5nICovCisgICAgICAgIFRJRkZEaXJFbnRyeSB0ZF9zdHJpcGJ5dGVjb3VudF9lbnRyeTsgLyogZm9yIGRlZmVycmVkIGxvYWRpbmcgKi8KKyNlbmRpZgorCXVpbnQxNiAgdGRfbnN1YmlmZDsKKwl1aW50NjQqIHRkX3N1YmlmZDsKKwkvKiBZQ2JDciBwYXJhbWV0ZXJzICovCisJdWludDE2ICB0ZF95Y2JjcnN1YnNhbXBsaW5nWzJdOworCXVpbnQxNiAgdGRfeWNiY3Jwb3NpdGlvbmluZzsKKwkvKiBDb2xvcmltZXRyeSBwYXJhbWV0ZXJzICovCisJdWludDE2KiB0ZF90cmFuc2ZlcmZ1bmN0aW9uWzNdOworCWZsb2F0Kgl0ZF9yZWZibGFja3doaXRlOworCS8qIENNWUsgcGFyYW1ldGVycyAqLworCWludCAgICAgdGRfaW5rbmFtZXNsZW47CisJY2hhciogICB0ZF9pbmtuYW1lczsKKworCWludCAgICAgdGRfY3VzdG9tVmFsdWVDb3VudDsKKyAgICAgICAgVElGRlRhZ1ZhbHVlICp0ZF9jdXN0b21WYWx1ZXM7Cit9IFRJRkZEaXJlY3Rvcnk7CisKKy8qCisgKiBGaWVsZCBmbGFncyB1c2VkIHRvIGluZGljYXRlIGZpZWxkcyB0aGF0IGhhdmUgYmVlbiBzZXQgaW4gYSBkaXJlY3RvcnksIGFuZAorICogdG8gcmVmZXJlbmNlIGZpZWxkcyB3aGVuIG1hbmlwdWxhdGluZyBhIGRpcmVjdG9yeS4KKyAqLworCisvKgorICogRklFTERfSUdOT1JFIGlzIHVzZWQgdG8gc2lnbmlmeSB0YWdzIHRoYXQgYXJlIHRvIGJlIHByb2Nlc3NlZCBidXQgb3RoZXJ3aXNlCisgKiBpZ25vcmVkLiAgVGhpcyBwZXJtaXRzIGFudGlxdWF0ZWQgdGFncyB0byBiZSBxdWlldGx5IHJlYWQgYW5kIGRpc2NhcmRlZC4KKyAqIE5vdGUgdGhhdCBhIGJpdCAqaXMqIGFsbG9jYXRlZCBmb3IgaWdub3JlZCB0YWdzOyB0aGlzIGlzIHVuZGVyc3Rvb2QgYnkgdGhlCisgKiBkaXJlY3RvcnkgcmVhZGluZyBsb2dpYyB3aGljaCB1c2VzIHRoaXMgZmFjdCB0byBhdm9pZCBzcGVjaWFsLWNhc2UgaGFuZGxpbmcKKyAqLworI2RlZmluZSBGSUVMRF9JR05PUkUgICAgICAgICAgICAgICAgICAgMAorCisvKiBtdWx0aS1pdGVtIGZpZWxkcyAqLworI2RlZmluZSBGSUVMRF9JTUFHRURJTUVOU0lPTlMgICAgICAgICAgMQorI2RlZmluZSBGSUVMRF9USUxFRElNRU5TSU9OUyAgICAgICAgICAgMgorI2RlZmluZSBGSUVMRF9SRVNPTFVUSU9OICAgICAgICAgICAgICAgMworI2RlZmluZSBGSUVMRF9QT1NJVElPTiAgICAgICAgICAgICAgICAgNAorCisvKiBzaW5nbGUtaXRlbSBmaWVsZHMgKi8KKyNkZWZpbmUgRklFTERfU1VCRklMRVRZUEUgICAgICAgICAgICAgIDUKKyNkZWZpbmUgRklFTERfQklUU1BFUlNBTVBMRSAgICAgICAgICAgIDYKKyNkZWZpbmUgRklFTERfQ09NUFJFU1NJT04gICAgICAgICAgICAgIDcKKyNkZWZpbmUgRklFTERfUEhPVE9NRVRSSUMgICAgICAgICAgICAgIDgKKyNkZWZpbmUgRklFTERfVEhSRVNISE9MRElORyAgICAgICAgICAgIDkKKyNkZWZpbmUgRklFTERfRklMTE9SREVSICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIEZJRUxEX09SSUVOVEFUSU9OICAgICAgICAgICAgICAxNQorI2RlZmluZSBGSUVMRF9TQU1QTEVTUEVSUElYRUwgICAgICAgICAgMTYKKyNkZWZpbmUgRklFTERfUk9XU1BFUlNUUklQICAgICAgICAgICAgIDE3CisjZGVmaW5lIEZJRUxEX01JTlNBTVBMRVZBTFVFICAgICAgICAgICAxOAorI2RlZmluZSBGSUVMRF9NQVhTQU1QTEVWQUxVRSAgICAgICAgICAgMTkKKyNkZWZpbmUgRklFTERfUExBTkFSQ09ORklHICAgICAgICAgICAgIDIwCisjZGVmaW5lIEZJRUxEX1JFU09MVVRJT05VTklUICAgICAgICAgICAyMgorI2RlZmluZSBGSUVMRF9QQUdFTlVNQkVSICAgICAgICAgICAgICAgMjMKKyNkZWZpbmUgRklFTERfU1RSSVBCWVRFQ09VTlRTICAgICAgICAgIDI0CisjZGVmaW5lIEZJRUxEX1NUUklQT0ZGU0VUUyAgICAgICAgICAgICAyNQorI2RlZmluZSBGSUVMRF9DT0xPUk1BUCAgICAgICAgICAgICAgICAgMjYKKyNkZWZpbmUgRklFTERfRVhUUkFTQU1QTEVTICAgICAgICAgICAgIDMxCisjZGVmaW5lIEZJRUxEX1NBTVBMRUZPUk1BVCAgICAgICAgICAgICAzMgorI2RlZmluZSBGSUVMRF9TTUlOU0FNUExFVkFMVUUgICAgICAgICAgMzMKKyNkZWZpbmUgRklFTERfU01BWFNBTVBMRVZBTFVFICAgICAgICAgIDM0CisjZGVmaW5lIEZJRUxEX0lNQUdFREVQVEggICAgICAgICAgICAgICAzNQorI2RlZmluZSBGSUVMRF9USUxFREVQVEggICAgICAgICAgICAgICAgMzYKKyNkZWZpbmUgRklFTERfSEFMRlRPTkVISU5UUyAgICAgICAgICAgIDM3CisjZGVmaW5lIEZJRUxEX1lDQkNSU1VCU0FNUExJTkcgICAgICAgICAzOQorI2RlZmluZSBGSUVMRF9ZQ0JDUlBPU0lUSU9OSU5HICAgICAgICAgNDAKKyNkZWZpbmUJRklFTERfUkVGQkxBQ0tXSElURSAgICAgICAgICAgIDQxCisjZGVmaW5lIEZJRUxEX1RSQU5TRkVSRlVOQ1RJT04gICAgICAgICA0NAorI2RlZmluZSBGSUVMRF9JTktOQU1FUyAgICAgICAgICAgICAgICAgNDYKKyNkZWZpbmUgRklFTERfU1VCSUZEICAgICAgICAgICAgICAgICAgIDQ5CisvKiAgICAgIEZJRUxEX0NVU1RPTSAoc2VlIHRpZmZpby5oKSAgICA2NSAqLworLyogZW5kIG9mIHN1cHBvcnQgZm9yIHdlbGwta25vd24gdGFnczsgY29kZWMtcHJpdmF0ZSB0YWdzIGZvbGxvdyAqLworI2RlZmluZSBGSUVMRF9DT0RFQyAgICAgICAgICAgICAgICAgICAgNjYgIC8qIGJhc2Ugb2YgY29kZWMtcHJpdmF0ZSB0YWdzICovCisKKworLyoKKyAqIFBzZXVkby10YWdzIGRvbid0IG5vcm1hbGx5IG5lZWQgZmllbGQgYml0cyBzaW5jZSB0aGV5IGFyZSBub3Qgd3JpdHRlbiB0byBhbgorICogb3V0cHV0IGZpbGUgKGJ5IGRlZmluaXRpb24pLiBUaGUgbGlicmFyeSBhbHNvIGhhcyBleHByZXNzIGxvZ2ljIHRvIGFsd2F5cworICogcXVlcnkgYSBjb2RlYyBmb3IgYSBwc2V1ZG8tdGFnIHNvIGFsbG9jYXRpbmcgYSBmaWVsZCBiaXQgZm9yIG9uZSBpcyBhCisgKiB3YXN0ZS4gICBJZiBjb2RlYyB3YW50cyB0byBwcm9tb3RlIHRoZSBub3Rpb24gb2YgYSBwc2V1ZG8tdGFnIGJlaW5nIGBgc2V0JycKKyAqIG9yIGBgdW5zZXQnJyB0aGVuIGl0IGNhbiBkbyB1c2luZyBpbnRlcm5hbCBzdGF0ZSBmbGFncyB3aXRob3V0IHBvbGx1dGluZworICogdGhlIGZpZWxkIGJpdCBzcGFjZSBkZWZpbmVkIGZvciByZWFsIHRhZ3MuCisgKi8KKyNkZWZpbmUgRklFTERfUFNFVURPCQkJMAorCisjZGVmaW5lIEZJRUxEX0xBU1QJCQkoMzIqRklFTERfU0VUTE9OR1MtMSkKKworI2RlZmluZSBCSVRuKG4pCQkJCSgoKHVuc2lnbmVkIGxvbmcpMUwpPDwoKG4pJjB4MWYpKQorI2RlZmluZSBCSVRGSUVMRG4odGlmLCBuKQkJKCh0aWYpLT50aWZfZGlyLnRkX2ZpZWxkc3NldFsobikvMzJdKQorI2RlZmluZSBUSUZGRmllbGRTZXQodGlmLCBmaWVsZCkJKEJJVEZJRUxEbih0aWYsIGZpZWxkKSAmIEJJVG4oZmllbGQpKQorI2RlZmluZSBUSUZGU2V0RmllbGRCaXQodGlmLCBmaWVsZCkJKEJJVEZJRUxEbih0aWYsIGZpZWxkKSB8PSBCSVRuKGZpZWxkKSkKKyNkZWZpbmUgVElGRkNsckZpZWxkQml0KHRpZiwgZmllbGQpCShCSVRGSUVMRG4odGlmLCBmaWVsZCkgJj0gfkJJVG4oZmllbGQpKQorCisjZGVmaW5lIEZpZWxkU2V0KGZpZWxkcywgZikJCShmaWVsZHNbKGYpLzMyXSAmIEJJVG4oZikpCisjZGVmaW5lIFJlc2V0RmllbGRCaXQoZmllbGRzLCBmKQkoZmllbGRzWyhmKS8zMl0gJj0gfkJJVG4oZikpCisKK3R5cGVkZWYgZW51bSB7CisJVElGRl9TRVRHRVRfVU5ERUZJTkVEID0gMCwKKwlUSUZGX1NFVEdFVF9BU0NJSSA9IDEsCisJVElGRl9TRVRHRVRfVUlOVDggPSAyLAorCVRJRkZfU0VUR0VUX1NJTlQ4ID0gMywKKwlUSUZGX1NFVEdFVF9VSU5UMTYgPSA0LAorCVRJRkZfU0VUR0VUX1NJTlQxNiA9IDUsCisJVElGRl9TRVRHRVRfVUlOVDMyID0gNiwKKwlUSUZGX1NFVEdFVF9TSU5UMzIgPSA3LAorCVRJRkZfU0VUR0VUX1VJTlQ2NCA9IDgsCisJVElGRl9TRVRHRVRfU0lOVDY0ID0gOSwKKwlUSUZGX1NFVEdFVF9GTE9BVCA9IDEwLAorCVRJRkZfU0VUR0VUX0RPVUJMRSA9IDExLAorCVRJRkZfU0VUR0VUX0lGRDggPSAxMiwKKwlUSUZGX1NFVEdFVF9JTlQgPSAxMywKKwlUSUZGX1NFVEdFVF9VSU5UMTZfUEFJUiA9IDE0LAorCVRJRkZfU0VUR0VUX0MwX0FTQ0lJID0gMTUsCisJVElGRl9TRVRHRVRfQzBfVUlOVDggPSAxNiwKKwlUSUZGX1NFVEdFVF9DMF9TSU5UOCA9IDE3LAorCVRJRkZfU0VUR0VUX0MwX1VJTlQxNiA9IDE4LAorCVRJRkZfU0VUR0VUX0MwX1NJTlQxNiA9IDE5LAorCVRJRkZfU0VUR0VUX0MwX1VJTlQzMiA9IDIwLAorCVRJRkZfU0VUR0VUX0MwX1NJTlQzMiA9IDIxLAorCVRJRkZfU0VUR0VUX0MwX1VJTlQ2NCA9IDIyLAorCVRJRkZfU0VUR0VUX0MwX1NJTlQ2NCA9IDIzLAorCVRJRkZfU0VUR0VUX0MwX0ZMT0FUID0gMjQsCisJVElGRl9TRVRHRVRfQzBfRE9VQkxFID0gMjUsCisJVElGRl9TRVRHRVRfQzBfSUZEOCA9IDI2LAorCVRJRkZfU0VUR0VUX0MxNl9BU0NJSSA9IDI3LAorCVRJRkZfU0VUR0VUX0MxNl9VSU5UOCA9IDI4LAorCVRJRkZfU0VUR0VUX0MxNl9TSU5UOCA9IDI5LAorCVRJRkZfU0VUR0VUX0MxNl9VSU5UMTYgPSAzMCwKKwlUSUZGX1NFVEdFVF9DMTZfU0lOVDE2ID0gMzEsCisJVElGRl9TRVRHRVRfQzE2X1VJTlQzMiA9IDMyLAorCVRJRkZfU0VUR0VUX0MxNl9TSU5UMzIgPSAzMywKKwlUSUZGX1NFVEdFVF9DMTZfVUlOVDY0ID0gMzQsCisJVElGRl9TRVRHRVRfQzE2X1NJTlQ2NCA9IDM1LAorCVRJRkZfU0VUR0VUX0MxNl9GTE9BVCA9IDM2LAorCVRJRkZfU0VUR0VUX0MxNl9ET1VCTEUgPSAzNywKKwlUSUZGX1NFVEdFVF9DMTZfSUZEOCA9IDM4LAorCVRJRkZfU0VUR0VUX0MzMl9BU0NJSSA9IDM5LAorCVRJRkZfU0VUR0VUX0MzMl9VSU5UOCA9IDQwLAorCVRJRkZfU0VUR0VUX0MzMl9TSU5UOCA9IDQxLAorCVRJRkZfU0VUR0VUX0MzMl9VSU5UMTYgPSA0MiwKKwlUSUZGX1NFVEdFVF9DMzJfU0lOVDE2ID0gNDMsCisJVElGRl9TRVRHRVRfQzMyX1VJTlQzMiA9IDQ0LAorCVRJRkZfU0VUR0VUX0MzMl9TSU5UMzIgPSA0NSwKKwlUSUZGX1NFVEdFVF9DMzJfVUlOVDY0ID0gNDYsCisJVElGRl9TRVRHRVRfQzMyX1NJTlQ2NCA9IDQ3LAorCVRJRkZfU0VUR0VUX0MzMl9GTE9BVCA9IDQ4LAorCVRJRkZfU0VUR0VUX0MzMl9ET1VCTEUgPSA0OSwKKwlUSUZGX1NFVEdFVF9DMzJfSUZEOCA9IDUwLAorCVRJRkZfU0VUR0VUX09USEVSID0gNTEKK30gVElGRlNldEdldEZpZWxkVHlwZTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitleHRlcm4gY29uc3QgVElGRkZpZWxkQXJyYXkqIF9USUZGR2V0RmllbGRzKHZvaWQpOworZXh0ZXJuIGNvbnN0IFRJRkZGaWVsZEFycmF5KiBfVElGRkdldEV4aWZGaWVsZHModm9pZCk7CitleHRlcm4gdm9pZCBfVElGRlNldHVwRmllbGRzKFRJRkYqIHRpZiwgY29uc3QgVElGRkZpZWxkQXJyYXkqIGluZm9hcnJheSk7CitleHRlcm4gdm9pZCBfVElGRlByaW50RmllbGRJbmZvKFRJRkYqLCBGSUxFKik7CisKK2V4dGVybiBpbnQgX1RJRkZGaWxsU3RyaWxlcyhUSUZGKik7ICAgICAgICAKKwordHlwZWRlZiBlbnVtIHsKKwl0ZmlhdEltYWdlLAorCXRmaWF0RXhpZiwKKwl0ZmlhdE90aGVyCit9IFRJRkZGaWVsZEFycmF5VHlwZTsKKworc3RydWN0IF9USUZGRmllbGRBcnJheSB7CisJVElGRkZpZWxkQXJyYXlUeXBlIHR5cGU7ICAgIC8qIGFycmF5IHR5cGUsIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgSUZEIGlzIGltYWdlIGFuZCBzdWNoICovCisJdWludDMyIGFsbG9jYXRlZF9zaXplOyAgICAgIC8qIDAgaWYgYXJyYXkgaXMgY29uc3RhbnQsIG90aGVyIGlmIG1vZGlmaWVkIGJ5IGZ1dHVyZSBkZWZpbml0aW9uIGV4dGVuc2lvbiBzdXBwb3J0ICovCisJdWludDMyIGNvdW50OyAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiBmaWVsZHMgYXJyYXkgKi8KKwlUSUZGRmllbGQqIGZpZWxkczsgICAgICAgICAgLyogYWN0dWFsIGZpZWxkIGluZm8gKi8KK307CisKK3N0cnVjdCBfVElGRkZpZWxkIHsKKwl1aW50MzIgZmllbGRfdGFnOyAgICAgICAgICAgICAgICAgICAgICAgLyogZmllbGQncyB0YWcgKi8KKwlzaG9ydCBmaWVsZF9yZWFkY291bnQ7ICAgICAgICAgICAgICAgICAgLyogcmVhZCBjb3VudC9USUZGX1ZBUklBQkxFL1RJRkZfU1BQICovCisJc2hvcnQgZmllbGRfd3JpdGVjb3VudDsgICAgICAgICAgICAgICAgIC8qIHdyaXRlIGNvdW50L1RJRkZfVkFSSUFCTEUgKi8KKwlUSUZGRGF0YVR5cGUgZmllbGRfdHlwZTsgICAgICAgICAgICAgICAgLyogdHlwZSBvZiBhc3NvY2lhdGVkIGRhdGEgKi8KKwl1aW50MzIgcmVzZXJ2ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHRlbnNpb24gKi8KKwlUSUZGU2V0R2V0RmllbGRUeXBlIHNldF9maWVsZF90eXBlOyAgICAgLyogdHlwZSB0byBiZSBwYXNzZWQgdG8gVElGRlNldEZpZWxkICovCisJVElGRlNldEdldEZpZWxkVHlwZSBnZXRfZmllbGRfdHlwZTsgICAgIC8qIHR5cGUgdG8gYmUgcGFzc2VkIHRvIFRJRkZHZXRGaWVsZCAqLworCXVuc2lnbmVkIHNob3J0IGZpZWxkX2JpdDsgICAgICAgICAgICAgICAvKiBiaXQgaW4gZmllbGRzc2V0IGJpdCB2ZWN0b3IgKi8KKwl1bnNpZ25lZCBjaGFyIGZpZWxkX29rdG9jaGFuZ2U7ICAgICAgICAgLyogaWYgdHJ1ZSwgY2FuIGNoYW5nZSB3aGlsZSB3cml0aW5nICovCisJdW5zaWduZWQgY2hhciBmaWVsZF9wYXNzY291bnQ7ICAgICAgICAgIC8qIGlmIHRydWUsIHBhc3MgZGlyIGNvdW50IG9uIHNldCAqLworCWNoYXIqIGZpZWxkX25hbWU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBBU0NJSSBuYW1lICovCisJVElGRkZpZWxkQXJyYXkqIGZpZWxkX3N1YmZpZWxkczsgICAgICAgIC8qIGlmIGZpZWxkIHBvaW50cyB0byBjaGlsZCBpZmRzLCBjaGlsZCBpZmQgZmllbGQgZGVmaW5pdGlvbiBhcnJheSAqLworfTsKKworZXh0ZXJuIGludCBfVElGRk1lcmdlRmllbGRzKFRJRkYqLCBjb25zdCBUSUZGRmllbGRbXSwgdWludDMyKTsKK2V4dGVybiBjb25zdCBUSUZGRmllbGQqIF9USUZGRmluZE9yUmVnaXN0ZXJGaWVsZChUSUZGICosIHVpbnQzMiwgVElGRkRhdGFUeXBlKTsKK2V4dGVybiAgVElGRkZpZWxkKiBfVElGRkNyZWF0ZUFub25GaWVsZChUSUZGICosIHVpbnQzMiwgVElGRkRhdGFUeXBlKTsKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKyNlbmRpZiAvKiBfVElGRkRJUl8gKi8KKworLyogdmltOiBzZXQgdHM9OCBzdHM9OCBzdz04IG5vZXQ6ICovCisKKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBjCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogZmlsbC1jb2x1bW46IDc4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2RpcmluZm8uYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2RpcmluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGI0YmRiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZGlyaW5mby5jCkBAIC0wLDAgKzEsOTU5IEBACisvKiAkSWQ6IHRpZl9kaXJpbmZvLmMsdiAxLjEyMSAyMDE0LTA1LTA3IDAxOjU4OjQ2IGJmcmllc2VuIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgKiB0aGF0IChpKSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisgKiBhbGwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uLCBhbmQgKGlpKSB0aGUgbmFtZXMgb2YKKyAqIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzIG1heSBub3QgYmUgdXNlZCBpbiBhbnkgYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCB0aGUgc3BlY2lmaWMsIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24gb2YgU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZCisgKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgU0FNIExFRkZMRVIgT1IgU0lMSUNPTiBHUkFQSElDUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELAorICogT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorICogV0hFVEhFUiBPUiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRQorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVElGRiBMaWJyYXJ5LgorICoKKyAqIENvcmUgRGlyZWN0b3J5IFRhZyBTdXBwb3J0LgorICovCisjaW5jbHVkZSAidGlmZmlvcC5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKgorICogTk9URTogVEhJUyBBUlJBWSBJUyBBU1NVTUVEIFRPIEJFIFNPUlRFRCBCWSBUQUcuCisgKgorICogTk9URTogVGhlIHNlY29uZCBmaWVsZCAoZmllbGRfcmVhZGNvdW50KSBhbmQgdGhpcmQgZmllbGQgKGZpZWxkX3dyaXRlY291bnQpCisgKiAgICAgICBzb21ldGltZXMgdXNlIHRoZSB2YWx1ZXMgVElGRl9WQVJJQUJMRSAoLTEpLCBUSUZGX1ZBUklBQkxFMiAoLTMpCisgKiAgICAgICBhbmQgVElGRl9TUFAgKC0yKS4gVGhlIG1hY3JvcyBzaG91bGQgYmUgdXNlZCBidXQgd291bGQgdGhyb3cgb2ZmCisgKiAgICAgICB0aGUgZm9ybWF0dGluZyBvZiB0aGUgY29kZSwgc28gcGxlYXNlIGludGVycHJldGUgdGhlIC0xLCAtMiBhbmQgLTMKKyAqICAgICAgIHZhbHVlcyBhY2NvcmRpbmdseS4KKyAqLworCitzdGF0aWMgVElGRkZpZWxkQXJyYXkgdGlmZkZpZWxkQXJyYXk7CitzdGF0aWMgVElGRkZpZWxkQXJyYXkgZXhpZkZpZWxkQXJyYXk7CisKK3N0YXRpYyBUSUZGRmllbGQKK3RpZmZGaWVsZHNbXSA9IHsKKwl7IFRJRkZUQUdfU1VCRklMRVRZUEUsIDEsIDEsIFRJRkZfTE9ORywgMCwgVElGRl9TRVRHRVRfVUlOVDMyLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1NVQkZJTEVUWVBFLCAxLCAwLCAiU3ViZmlsZVR5cGUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX09TVUJGSUxFVFlQRSwgMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1NVQkZJTEVUWVBFLCAxLCAwLCAiT2xkU3ViZmlsZVR5cGUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0lNQUdFV0lEVEgsIDEsIDEsIFRJRkZfTE9ORywgMCwgVElGRl9TRVRHRVRfVUlOVDMyLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0lNQUdFRElNRU5TSU9OUywgMCwgMCwgIkltYWdlV2lkdGgiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0lNQUdFTEVOR1RILCAxLCAxLCBUSUZGX0xPTkcsIDAsIFRJRkZfU0VUR0VUX1VJTlQzMiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9JTUFHRURJTUVOU0lPTlMsIDEsIDAsICJJbWFnZUxlbmd0aCIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfQklUU1BFUlNBTVBMRSwgLTEsIC0xLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQklUU1BFUlNBTVBMRSwgMCwgMCwgIkJpdHNQZXJTYW1wbGUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0NPTVBSRVNTSU9OLCAtMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NPTVBSRVNTSU9OLCAwLCAwLCAiQ29tcHJlc3Npb24iLCBOVUxMIH0sCisJeyBUSUZGVEFHX1BIT1RPTUVUUklDLCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfUEhPVE9NRVRSSUMsIDAsIDAsICJQaG90b21ldHJpY0ludGVycHJldGF0aW9uIiwgTlVMTCB9LAorCXsgVElGRlRBR19USFJFU0hIT0xESU5HLCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfVEhSRVNISE9MRElORywgMSwgMCwgIlRocmVzaGhvbGRpbmciLCBOVUxMIH0sCisJeyBUSUZGVEFHX0NFTExXSURUSCwgMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0lHTk9SRSwgMSwgMCwgIkNlbGxXaWR0aCIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfQ0VMTExFTkdUSCwgMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0lHTk9SRSwgMSwgMCwgIkNlbGxMZW5ndGgiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0ZJTExPUkRFUiwgMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0ZJTExPUkRFUiwgMCwgMCwgIkZpbGxPcmRlciIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfRE9DVU1FTlROQU1FLCAtMSwgLTEsIFRJRkZfQVNDSUksIDAsIFRJRkZfU0VUR0VUX0FTQ0lJLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIkRvY3VtZW50TmFtZSIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfSU1BR0VERVNDUklQVElPTiwgLTEsIC0xLCBUSUZGX0FTQ0lJLCAwLCBUSUZGX1NFVEdFVF9BU0NJSSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJJbWFnZURlc2NyaXB0aW9uIiwgTlVMTCB9LAorCXsgVElGRlRBR19NQUtFLCAtMSwgLTEsIFRJRkZfQVNDSUksIDAsIFRJRkZfU0VUR0VUX0FTQ0lJLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIk1ha2UiLCBOVUxMIH0sCisJeyBUSUZGVEFHX01PREVMLCAtMSwgLTEsIFRJRkZfQVNDSUksIDAsIFRJRkZfU0VUR0VUX0FTQ0lJLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIk1vZGVsIiwgTlVMTCB9LAorCXsgVElGRlRBR19TVFJJUE9GRlNFVFMsIC0xLCAtMSwgVElGRl9MT05HOCwgMCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1NUUklQT0ZGU0VUUywgMCwgMCwgIlN0cmlwT2Zmc2V0cyIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfT1JJRU5UQVRJT04sIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9PUklFTlRBVElPTiwgMCwgMCwgIk9yaWVudGF0aW9uIiwgTlVMTCB9LAorCXsgVElGRlRBR19TQU1QTEVTUEVSUElYRUwsIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9TQU1QTEVTUEVSUElYRUwsIDAsIDAsICJTYW1wbGVzUGVyUGl4ZWwiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1JPV1NQRVJTVFJJUCwgMSwgMSwgVElGRl9MT05HLCAwLCBUSUZGX1NFVEdFVF9VSU5UMzIsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfUk9XU1BFUlNUUklQLCAwLCAwLCAiUm93c1BlclN0cmlwIiwgTlVMTCB9LAorCXsgVElGRlRBR19TVFJJUEJZVEVDT1VOVFMsIC0xLCAtMSwgVElGRl9MT05HOCwgMCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1NUUklQQllURUNPVU5UUywgMCwgMCwgIlN0cmlwQnl0ZUNvdW50cyIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfTUlOU0FNUExFVkFMVUUsIC0yLCAtMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX01JTlNBTVBMRVZBTFVFLCAxLCAwLCAiTWluU2FtcGxlVmFsdWUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX01BWFNBTVBMRVZBTFVFLCAtMiwgLTEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9NQVhTQU1QTEVWQUxVRSwgMSwgMCwgIk1heFNhbXBsZVZhbHVlIiwgTlVMTCB9LAorCXsgVElGRlRBR19YUkVTT0xVVElPTiwgMSwgMSwgVElGRl9SQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1JFU09MVVRJT04sIDEsIDAsICJYUmVzb2x1dGlvbiIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfWVJFU09MVVRJT04sIDEsIDEsIFRJRkZfUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0RPVUJMRSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9SRVNPTFVUSU9OLCAxLCAwLCAiWVJlc29sdXRpb24iLCBOVUxMIH0sCisJeyBUSUZGVEFHX1BMQU5BUkNPTkZJRywgMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1BMQU5BUkNPTkZJRywgMCwgMCwgIlBsYW5hckNvbmZpZ3VyYXRpb24iLCBOVUxMIH0sCisJeyBUSUZGVEFHX1BBR0VOQU1FLCAtMSwgLTEsIFRJRkZfQVNDSUksIDAsIFRJRkZfU0VUR0VUX0FTQ0lJLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIlBhZ2VOYW1lIiwgTlVMTCB9LAorCXsgVElGRlRBR19YUE9TSVRJT04sIDEsIDEsIFRJRkZfUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0RPVUJMRSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9QT1NJVElPTiwgMSwgMCwgIlhQb3NpdGlvbiIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfWVBPU0lUSU9OLCAxLCAxLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9ET1VCTEUsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfUE9TSVRJT04sIDEsIDAsICJZUG9zaXRpb24iLCBOVUxMIH0sCisJeyBUSUZGVEFHX0ZSRUVPRkZTRVRTLCAtMSwgLTEsIFRJRkZfTE9ORzgsIDAsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9JR05PUkUsIDAsIDAsICJGcmVlT2Zmc2V0cyIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfRlJFRUJZVEVDT1VOVFMsIC0xLCAtMSwgVElGRl9MT05HOCwgMCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0lHTk9SRSwgMCwgMCwgIkZyZWVCeXRlQ291bnRzIiwgTlVMTCB9LAorCXsgVElGRlRBR19HUkFZUkVTUE9OU0VVTklULCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfSUdOT1JFLCAxLCAwLCAiR3JheVJlc3BvbnNlVW5pdCIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfR1JBWVJFU1BPTlNFQ1VSVkUsIC0xLCAtMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0lHTk9SRSwgMSwgMCwgIkdyYXlSZXNwb25zZUN1cnZlIiwgTlVMTCB9LAorCXsgVElGRlRBR19SRVNPTFVUSU9OVU5JVCwgMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1JFU09MVVRJT05VTklULCAxLCAwLCAiUmVzb2x1dGlvblVuaXQiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1BBR0VOVU1CRVIsIDIsIDIsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNl9QQUlSLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1BBR0VOVU1CRVIsIDEsIDAsICJQYWdlTnVtYmVyIiwgTlVMTCB9LAorCXsgVElGRlRBR19DT0xPUlJFU1BPTlNFVU5JVCwgMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0lHTk9SRSwgMSwgMCwgIkNvbG9yUmVzcG9uc2VVbml0IiwgTlVMTCB9LAorCXsgVElGRlRBR19UUkFOU0ZFUkZVTkNUSU9OLCAtMSwgLTEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX09USEVSLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1RSQU5TRkVSRlVOQ1RJT04sIDEsIDAsICJUcmFuc2ZlckZ1bmN0aW9uIiwgTlVMTCB9LAorCXsgVElGRlRBR19TT0ZUV0FSRSwgLTEsIC0xLCBUSUZGX0FTQ0lJLCAwLCBUSUZGX1NFVEdFVF9BU0NJSSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJTb2Z0d2FyZSIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfREFURVRJTUUsIDIwLCAyMCwgVElGRl9BU0NJSSwgMCwgVElGRl9TRVRHRVRfQVNDSUksIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiRGF0ZVRpbWUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0FSVElTVCwgLTEsIC0xLCBUSUZGX0FTQ0lJLCAwLCBUSUZGX1NFVEdFVF9BU0NJSSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJBcnRpc3QiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0hPU1RDT01QVVRFUiwgLTEsIC0xLCBUSUZGX0FTQ0lJLCAwLCBUSUZGX1NFVEdFVF9BU0NJSSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJIb3N0Q29tcHV0ZXIiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1dISVRFUE9JTlQsIDIsIDIsIFRJRkZfUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0MwX0ZMT0FULCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIldoaXRlUG9pbnQiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1BSSU1BUllDSFJPTUFUSUNJVElFUywgNiwgNiwgVElGRl9SQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfQzBfRkxPQVQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiUHJpbWFyeUNocm9tYXRpY2l0aWVzIiwgTlVMTCB9LAorCXsgVElGRlRBR19DT0xPUk1BUCwgLTEsIC0xLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9PVEhFUiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DT0xPUk1BUCwgMSwgMCwgIkNvbG9yTWFwIiwgTlVMTCB9LAorCXsgVElGRlRBR19IQUxGVE9ORUhJTlRTLCAyLCAyLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTZfUEFJUiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9IQUxGVE9ORUhJTlRTLCAxLCAwLCAiSGFsZnRvbmVIaW50cyIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfVElMRVdJRFRILCAxLCAxLCBUSUZGX0xPTkcsIDAsIFRJRkZfU0VUR0VUX1VJTlQzMiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9USUxFRElNRU5TSU9OUywgMCwgMCwgIlRpbGVXaWR0aCIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfVElMRUxFTkdUSCwgMSwgMSwgVElGRl9MT05HLCAwLCBUSUZGX1NFVEdFVF9VSU5UMzIsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfVElMRURJTUVOU0lPTlMsIDAsIDAsICJUaWxlTGVuZ3RoIiwgTlVMTCB9LAorCXsgVElGRlRBR19USUxFT0ZGU0VUUywgLTEsIDEsIFRJRkZfTE9ORzgsIDAsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9TVFJJUE9GRlNFVFMsIDAsIDAsICJUaWxlT2Zmc2V0cyIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfVElMRUJZVEVDT1VOVFMsIC0xLCAxLCBUSUZGX0xPTkc4LCAwLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfU1RSSVBCWVRFQ09VTlRTLCAwLCAwLCAiVGlsZUJ5dGVDb3VudHMiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1NVQklGRCwgLTEsIC0xLCBUSUZGX0lGRDgsIDAsIFRJRkZfU0VUR0VUX0MxNl9JRkQ4LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1NVQklGRCwgMSwgMSwgIlN1YklGRCIsICZ0aWZmRmllbGRBcnJheSB9LAorCXsgVElGRlRBR19JTktTRVQsIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJJbmtTZXQiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0lOS05BTUVTLCAtMSwgLTEsIFRJRkZfQVNDSUksIDAsIFRJRkZfU0VUR0VUX0MxNl9BU0NJSSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9JTktOQU1FUywgMSwgMSwgIklua05hbWVzIiwgTlVMTCB9LAorCXsgVElGRlRBR19OVU1CRVJPRklOS1MsIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJOdW1iZXJPZklua3MiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0RPVFJBTkdFLCAyLCAyLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTZfUEFJUiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJEb3RSYW5nZSIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfVEFSR0VUUFJJTlRFUiwgLTEsIC0xLCBUSUZGX0FTQ0lJLCAwLCBUSUZGX1NFVEdFVF9BU0NJSSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJUYXJnZXRQcmludGVyIiwgTlVMTCB9LAorCXsgVElGRlRBR19FWFRSQVNBTVBMRVMsIC0xLCAtMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfQzE2X1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9FWFRSQVNBTVBMRVMsIDAsIDEsICJFeHRyYVNhbXBsZXMiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1NBTVBMRUZPUk1BVCwgLTEsIC0xLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfU0FNUExFRk9STUFULCAwLCAwLCAiU2FtcGxlRm9ybWF0IiwgTlVMTCB9LAorCXsgVElGRlRBR19TTUlOU0FNUExFVkFMVUUsIC0yLCAtMSwgVElGRl9BTlksIDAsIFRJRkZfU0VUR0VUX0RPVUJMRSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9TTUlOU0FNUExFVkFMVUUsIDEsIDAsICJTTWluU2FtcGxlVmFsdWUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1NNQVhTQU1QTEVWQUxVRSwgLTIsIC0xLCBUSUZGX0FOWSwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1NNQVhTQU1QTEVWQUxVRSwgMSwgMCwgIlNNYXhTYW1wbGVWYWx1ZSIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfQ0xJUFBBVEgsIC0xLCAtMywgVElGRl9CWVRFLCAwLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAxLCAiQ2xpcFBhdGgiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1hDTElQUEFUSFVOSVRTLCAxLCAxLCBUSUZGX1NMT05HLCAwLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiWENsaXBQYXRoVW5pdHMiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1hDTElQUEFUSFVOSVRTLCAxLCAxLCBUSUZGX1NCWVRFLCAwLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiWENsaXBQYXRoVW5pdHMiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1lDTElQUEFUSFVOSVRTLCAxLCAxLCBUSUZGX1NMT05HLCAwLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiWUNsaXBQYXRoVW5pdHMiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1lDQkNSQ09FRkZJQ0lFTlRTLCAzLCAzLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9DMF9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJZQ2JDckNvZWZmaWNpZW50cyIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfWUNCQ1JTVUJTQU1QTElORywgMiwgMiwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVUlOVDE2X1BBSVIsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfWUNCQ1JTVUJTQU1QTElORywgMCwgMCwgIllDYkNyU3Vic2FtcGxpbmciLCBOVUxMIH0sCisJeyBUSUZGVEFHX1lDQkNSUE9TSVRJT05JTkcsIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9ZQ0JDUlBPU0lUSU9OSU5HLCAwLCAwLCAiWUNiQ3JQb3NpdGlvbmluZyIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfUkVGRVJFTkNFQkxBQ0tXSElURSwgNiwgNiwgVElGRl9SQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfQzBfRkxPQVQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfUkVGQkxBQ0tXSElURSwgMSwgMCwgIlJlZmVyZW5jZUJsYWNrV2hpdGUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1hNTFBBQ0tFVCwgLTMsIC0zLCBUSUZGX0JZVEUsIDAsIFRJRkZfU0VUR0VUX0MzMl9VSU5UOCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDEsICJYTUxQYWNrZXQiLCBOVUxMIH0sCisJLyogYmVnaW4gU0dJIHRhZ3MgKi8KKwl7IFRJRkZUQUdfTUFUVEVJTkcsIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9FWFRSQVNBTVBMRVMsIDAsIDAsICJNYXR0ZWluZyIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfREFUQVRZUEUsIC0yLCAtMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1NBTVBMRUZPUk1BVCwgMCwgMCwgIkRhdGFUeXBlIiwgTlVMTCB9LAorCXsgVElGRlRBR19JTUFHRURFUFRILCAxLCAxLCBUSUZGX0xPTkcsIDAsIFRJRkZfU0VUR0VUX1VJTlQzMiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9JTUFHRURFUFRILCAwLCAwLCAiSW1hZ2VEZXB0aCIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfVElMRURFUFRILCAxLCAxLCBUSUZGX0xPTkcsIDAsIFRJRkZfU0VUR0VUX1VJTlQzMiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9USUxFREVQVEgsIDAsIDAsICJUaWxlRGVwdGgiLCBOVUxMIH0sCisJLyogZW5kIFNHSSB0YWdzICovCisJLyogYmVnaW4gUGl4YXIgdGFncyAqLworCXsgVElGRlRBR19QSVhBUl9JTUFHRUZVTExXSURUSCwgMSwgMSwgVElGRl9MT05HLCAwLCBUSUZGX1NFVEdFVF9VSU5UMzIsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiSW1hZ2VGdWxsV2lkdGgiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1BJWEFSX0lNQUdFRlVMTExFTkdUSCwgMSwgMSwgVElGRl9MT05HLCAwLCBUSUZGX1NFVEdFVF9VSU5UMzIsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiSW1hZ2VGdWxsTGVuZ3RoIiwgTlVMTCB9LAorCXsgVElGRlRBR19QSVhBUl9URVhUVVJFRk9STUFULCAtMSwgLTEsIFRJRkZfQVNDSUksIDAsIFRJRkZfU0VUR0VUX0FTQ0lJLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIlRleHR1cmVGb3JtYXQiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1BJWEFSX1dSQVBNT0RFUywgLTEsIC0xLCBUSUZGX0FTQ0lJLCAwLCBUSUZGX1NFVEdFVF9BU0NJSSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJUZXh0dXJlV3JhcE1vZGVzIiwgTlVMTCB9LAorCXsgVElGRlRBR19QSVhBUl9GT1ZDT1QsIDEsIDEsIFRJRkZfRkxPQVQsIDAsIFRJRkZfU0VUR0VUX0ZMT0FULCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIkZpZWxkT2ZWaWV3Q290YW5nZW50IiwgTlVMTCB9LAorCXsgVElGRlRBR19QSVhBUl9NQVRSSVhfV09STERUT1NDUkVFTiwgMTYsIDE2LCBUSUZGX0ZMT0FULCAwLCBUSUZGX1NFVEdFVF9DMF9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJNYXRyaXhXb3JsZFRvU2NyZWVuIiwgTlVMTCB9LAorCXsgVElGRlRBR19QSVhBUl9NQVRSSVhfV09STERUT0NBTUVSQSwgMTYsIDE2LCBUSUZGX0ZMT0FULCAwLCBUSUZGX1NFVEdFVF9DMF9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJNYXRyaXhXb3JsZFRvQ2FtZXJhIiwgTlVMTCB9LAorCXsgVElGRlRBR19DRkFSRVBFQVRQQVRURVJORElNLCAyLCAyLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9DMF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwJRklFTERfQ1VTVE9NLCAwLAkwLAkiQ0ZBUmVwZWF0UGF0dGVybkRpbSIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfQ0ZBUEFUVEVSTiwJNCwgNCwJVElGRl9CWVRFLCAwLCBUSUZGX1NFVEdFVF9DMF9VSU5UOCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsCTAsCSJDRkFQYXR0ZXJuIiAsIE5VTEx9LAorCXsgVElGRlRBR19DT1BZUklHSFQsIC0xLCAtMSwgVElGRl9BU0NJSSwgMCwgVElGRl9TRVRHRVRfQVNDSUksIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiQ29weXJpZ2h0IiwgTlVMTCB9LAorCS8qIGVuZCBQaXhhciB0YWdzICovCisJeyBUSUZGVEFHX1JJQ0hUSUZGSVBUQywgLTMsIC0zLCBUSUZGX0xPTkcsIDAsIFRJRkZfU0VUR0VUX0MzMl9VSU5UMzIsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAxLCAiUmljaFRJRkZJUFRDIiwgTlVMTCB9LAorCXsgVElGRlRBR19QSE9UT1NIT1AsIC0zLCAtMywgVElGRl9CWVRFLCAwLCBUSUZGX1NFVEdFVF9DMzJfVUlOVDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAxLCAiUGhvdG9zaG9wIiwgTlVMTCB9LAorCXsgVElGRlRBR19FWElGSUZELCAxLCAxLCBUSUZGX0lGRDgsIDAsIFRJRkZfU0VUR0VUX0lGRDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiRVhJRklGRE9mZnNldCIsICZleGlmRmllbGRBcnJheSB9LAorCXsgVElGRlRBR19JQ0NQUk9GSUxFLCAtMywgLTMsIFRJRkZfVU5ERUZJTkVELCAwLCBUSUZGX1NFVEdFVF9DMzJfVUlOVDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAxLCAiSUNDIFByb2ZpbGUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0dQU0lGRCwgMSwgMSwgVElGRl9JRkQ4LCAwLCBUSUZGX1NFVEdFVF9JRkQ4LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMCwgIkdQU0lGRE9mZnNldCIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfRkFYUkVDVlBBUkFNUywgMSwgMSwgVElGRl9MT05HLCAwLCBUSUZGX1NFVEdFVF9VSU5UMzIsIFRJRkZfU0VUR0VUX1VJTlQzMiwgRklFTERfQ1VTVE9NLCBUUlVFLCBGQUxTRSwgIkZheFJlY3ZQYXJhbXMiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0ZBWFNVQkFERFJFU1MsIC0xLCAtMSwgVElGRl9BU0NJSSwgMCwgVElGRl9TRVRHRVRfQVNDSUksIFRJRkZfU0VUR0VUX0FTQ0lJLCBGSUVMRF9DVVNUT00sIFRSVUUsIEZBTFNFLCAiRmF4U3ViQWRkcmVzcyIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfRkFYUkVDVlRJTUUsIDEsIDEsIFRJRkZfTE9ORywgMCwgVElGRl9TRVRHRVRfVUlOVDMyLCBUSUZGX1NFVEdFVF9VSU5UMzIsIEZJRUxEX0NVU1RPTSwgVFJVRSwgRkFMU0UsICJGYXhSZWN2VGltZSIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfRkFYRENTLCAtMSwgLTEsIFRJRkZfQVNDSUksIDAsIFRJRkZfU0VUR0VUX0FTQ0lJLCBUSUZGX1NFVEdFVF9BU0NJSSwgRklFTERfQ1VTVE9NLCBUUlVFLCBGQUxTRSwgIkZheERjcyIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfU1RPTklUUywgMSwgMSwgVElGRl9ET1VCTEUsIDAsIFRJRkZfU0VUR0VUX0RPVUJMRSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJTdG9OaXRzIiwgTlVMTCB9LAorCXsgVElGRlRBR19JTlRFUk9QRVJBQklMSVRZSUZELCAxLCAxLCBUSUZGX0lGRDgsIDAsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJJbnRlcm9wZXJhYmlsaXR5SUZET2Zmc2V0IiwgTlVMTCB9LAorCS8qIGJlZ2luIERORyB0YWdzICovCisJeyBUSUZGVEFHX0ROR1ZFUlNJT04sIDQsIDQsIFRJRkZfQllURSwgMCwgVElGRl9TRVRHRVRfQzBfVUlOVDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiRE5HVmVyc2lvbiIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfRE5HQkFDS1dBUkRWRVJTSU9OLCA0LCA0LCBUSUZGX0JZVEUsIDAsIFRJRkZfU0VUR0VUX0MwX1VJTlQ4LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMCwgIkROR0JhY2t3YXJkVmVyc2lvbiIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfVU5JUVVFQ0FNRVJBTU9ERUwsIC0xLCAtMSwgVElGRl9BU0NJSSwgMCwgVElGRl9TRVRHRVRfQVNDSUksIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiVW5pcXVlQ2FtZXJhTW9kZWwiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0xPQ0FMSVpFRENBTUVSQU1PREVMLCAtMSwgLTEsIFRJRkZfQllURSwgMCwgVElGRl9TRVRHRVRfQzE2X1VJTlQ4LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMSwgIkxvY2FsaXplZENhbWVyYU1vZGVsIiwgTlVMTCB9LAorCXsgVElGRlRBR19DRkFQTEFORUNPTE9SLCAtMSwgLTEsIFRJRkZfQllURSwgMCwgVElGRl9TRVRHRVRfQzE2X1VJTlQ4LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMSwgIkNGQVBsYW5lQ29sb3IiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0NGQUxBWU9VVCwgMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMCwgIkNGQUxheW91dCIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfTElORUFSSVpBVElPTlRBQkxFLCAtMSwgLTEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX0MxNl9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAxLCAiTGluZWFyaXphdGlvblRhYmxlIiwgTlVMTCB9LAorCXsgVElGRlRBR19CTEFDS0xFVkVMUkVQRUFURElNLCAyLCAyLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9DMF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiQmxhY2tMZXZlbFJlcGVhdERpbSIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfQkxBQ0tMRVZFTCwgLTEsIC0xLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9DMTZfRkxPQVQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAxLCAiQmxhY2tMZXZlbCIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfQkxBQ0tMRVZFTERFTFRBSCwgLTEsIC0xLCBUSUZGX1NSQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfQzE2X0ZMT0FULCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMSwgIkJsYWNrTGV2ZWxEZWx0YUgiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0JMQUNLTEVWRUxERUxUQVYsIC0xLCAtMSwgVElGRl9TUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0MxNl9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDEsICJCbGFja0xldmVsRGVsdGFWIiwgTlVMTCB9LAorCXsgVElGRlRBR19XSElURUxFVkVMLCAtMSwgLTEsIFRJRkZfTE9ORywgMCwgVElGRl9TRVRHRVRfQzE2X1VJTlQzMiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDEsICJXaGl0ZUxldmVsIiwgTlVMTCB9LAorCXsgVElGRlRBR19ERUZBVUxUU0NBTEUsIDIsIDIsIFRJRkZfUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0MwX0ZMT0FULCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMCwgIkRlZmF1bHRTY2FsZSIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfQkVTVFFVQUxJVFlTQ0FMRSwgMSwgMSwgVElGRl9SQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMCwgIkJlc3RRdWFsaXR5U2NhbGUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0RFRkFVTFRDUk9QT1JJR0lOLCAyLCAyLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9DMF9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJEZWZhdWx0Q3JvcE9yaWdpbiIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfREVGQVVMVENST1BTSVpFLCAyLCAyLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9DMF9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJEZWZhdWx0Q3JvcFNpemUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0NPTE9STUFUUklYMSwgLTEsIC0xLCBUSUZGX1NSQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfQzE2X0ZMT0FULCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMSwgIkNvbG9yTWF0cml4MSIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfQ09MT1JNQVRSSVgyLCAtMSwgLTEsIFRJRkZfU1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9DMTZfRkxPQVQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAxLCAiQ29sb3JNYXRyaXgyIiwgTlVMTCB9LAorCXsgVElGRlRBR19DQU1FUkFDQUxJQlJBVElPTjEsIC0xLCAtMSwgVElGRl9TUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0MxNl9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDEsICJDYW1lcmFDYWxpYnJhdGlvbjEiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0NBTUVSQUNBTElCUkFUSU9OMiwgLTEsIC0xLCBUSUZGX1NSQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfQzE2X0ZMT0FULCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMSwgIkNhbWVyYUNhbGlicmF0aW9uMiIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfUkVEVUNUSU9OTUFUUklYMSwgLTEsIC0xLCBUSUZGX1NSQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfQzE2X0ZMT0FULCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMSwgIlJlZHVjdGlvbk1hdHJpeDEiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1JFRFVDVElPTk1BVFJJWDIsIC0xLCAtMSwgVElGRl9TUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0MxNl9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDEsICJSZWR1Y3Rpb25NYXRyaXgyIiwgTlVMTCB9LAorCXsgVElGRlRBR19BTkFMT0dCQUxBTkNFLCAtMSwgLTEsIFRJRkZfUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0MxNl9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDEsICJBbmFsb2dCYWxhbmNlIiwgTlVMTCB9LAorCXsgVElGRlRBR19BU1NIT1RORVVUUkFMLCAtMSwgLTEsIFRJRkZfUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0MxNl9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDEsICJBc1Nob3ROZXV0cmFsIiwgTlVMTCB9LAorCXsgVElGRlRBR19BU1NIT1RXSElURVhZLCAyLCAyLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9DMF9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJBc1Nob3RXaGl0ZVhZIiwgTlVMTCB9LAorCXsgVElGRlRBR19CQVNFTElORUVYUE9TVVJFLCAxLCAxLCBUSUZGX1NSQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMCwgIkJhc2VsaW5lRXhwb3N1cmUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0JBU0VMSU5FTk9JU0UsIDEsIDEsIFRJRkZfUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0RPVUJMRSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJCYXNlbGluZU5vaXNlIiwgTlVMTCB9LAorCXsgVElGRlRBR19CQVNFTElORVNIQVJQTkVTUywgMSwgMSwgVElGRl9SQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMCwgIkJhc2VsaW5lU2hhcnBuZXNzIiwgTlVMTCB9LAorCXsgVElGRlRBR19CQVlFUkdSRUVOU1BMSVQsIDEsIDEsIFRJRkZfTE9ORywgMCwgVElGRl9TRVRHRVRfVUlOVDMyLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMCwgIkJheWVyR3JlZW5TcGxpdCIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfTElORUFSUkVTUE9OU0VMSU1JVCwgMSwgMSwgVElGRl9SQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMCwgIkxpbmVhclJlc3BvbnNlTGltaXQiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0NBTUVSQVNFUklBTE5VTUJFUiwgLTEsIC0xLCBUSUZGX0FTQ0lJLCAwLCBUSUZGX1NFVEdFVF9BU0NJSSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJDYW1lcmFTZXJpYWxOdW1iZXIiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0xFTlNJTkZPLCA0LCA0LCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9DMF9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJMZW5zSW5mbyIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfQ0hST01BQkxVUlJBRElVUywgMSwgMSwgVElGRl9SQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMCwgIkNocm9tYUJsdXJSYWRpdXMiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0FOVElBTElBU1NUUkVOR1RILCAxLCAxLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9ET1VCTEUsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiQW50aUFsaWFzU3RyZW5ndGgiLCBOVUxMIH0sCisJeyBUSUZGVEFHX1NIQURPV1NDQUxFLCAxLCAxLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9ET1VCTEUsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiU2hhZG93U2NhbGUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0ROR1BSSVZBVEVEQVRBLCAtMSwgLTEsIFRJRkZfQllURSwgMCwgVElGRl9TRVRHRVRfQzE2X1VJTlQ4LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMSwgIkROR1ByaXZhdGVEYXRhIiwgTlVMTCB9LAorCXsgVElGRlRBR19NQUtFUk5PVEVTQUZFVFksIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJNYWtlck5vdGVTYWZldHkiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0NBTElCUkFUSU9OSUxMVU1JTkFOVDEsIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJDYWxpYnJhdGlvbklsbHVtaW5hbnQxIiwgTlVMTCB9LAorCXsgVElGRlRBR19DQUxJQlJBVElPTklMTFVNSU5BTlQyLCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiQ2FsaWJyYXRpb25JbGx1bWluYW50MiIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfUkFXREFUQVVOSVFVRUlELCAxNiwgMTYsIFRJRkZfQllURSwgMCwgVElGRl9TRVRHRVRfQzBfVUlOVDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiUmF3RGF0YVVuaXF1ZUlEIiwgTlVMTCB9LAorCXsgVElGRlRBR19PUklHSU5BTFJBV0ZJTEVOQU1FLCAtMSwgLTEsIFRJRkZfQllURSwgMCwgVElGRl9TRVRHRVRfQzE2X1VJTlQ4LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMSwgIk9yaWdpbmFsUmF3RmlsZU5hbWUiLCBOVUxMIH0sCisJeyBUSUZGVEFHX09SSUdJTkFMUkFXRklMRURBVEEsIC0xLCAtMSwgVElGRl9VTkRFRklORUQsIDAsIFRJRkZfU0VUR0VUX0MxNl9VSU5UOCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDEsICJPcmlnaW5hbFJhd0ZpbGVEYXRhIiwgTlVMTCB9LAorCXsgVElGRlRBR19BQ1RJVkVBUkVBLCA0LCA0LCBUSUZGX0xPTkcsIDAsIFRJRkZfU0VUR0VUX0MwX1VJTlQzMiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJBY3RpdmVBcmVhIiwgTlVMTCB9LAorCXsgVElGRlRBR19NQVNLRURBUkVBUywgLTEsIC0xLCBUSUZGX0xPTkcsIDAsIFRJRkZfU0VUR0VUX0MxNl9VSU5UMzIsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAxLCAiTWFza2VkQXJlYXMiLCBOVUxMIH0sCisJeyBUSUZGVEFHX0FTU0hPVElDQ1BST0ZJTEUsIC0xLCAtMSwgVElGRl9VTkRFRklORUQsIDAsIFRJRkZfU0VUR0VUX0MxNl9VSU5UOCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDEsICJBc1Nob3RJQ0NQcm9maWxlIiwgTlVMTCB9LAorCXsgVElGRlRBR19BU1NIT1RQUkVQUk9GSUxFTUFUUklYLCAtMSwgLTEsIFRJRkZfU1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9DMTZfRkxPQVQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAxLCAiQXNTaG90UHJlUHJvZmlsZU1hdHJpeCIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfQ1VSUkVOVElDQ1BST0ZJTEUsIC0xLCAtMSwgVElGRl9VTkRFRklORUQsIDAsIFRJRkZfU0VUR0VUX0MxNl9VSU5UOCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDEsICJDdXJyZW50SUNDUHJvZmlsZSIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfQ1VSUkVOVFBSRVBST0ZJTEVNQVRSSVgsIC0xLCAtMSwgVElGRl9TUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0MxNl9GTE9BVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDEsICJDdXJyZW50UHJlUHJvZmlsZU1hdHJpeCIsIE5VTEwgfSwKKwl7IFRJRkZUQUdfUEVSU0FNUExFLCAwLCAwLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfUFNFVURPLCBUUlVFLCBGQUxTRSwgIlBlclNhbXBsZSIsIE5VTEx9LAorCS8qIGVuZCBETkcgdGFncyAqLworCS8qIGJlZ2luIFRJRkYvRlggdGFncyAqLworICAgICAgICB7IFRJRkZUQUdfSU5ERVhFRCwgMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMCwgIkluZGV4ZWQiLCBOVUxMIH0sCisgICAgICAgIHsgVElGRlRBR19HTE9CQUxQQVJBTUVURVJTSUZELCAxLCAxLCBUSUZGX0lGRDgsIDAsIFRJRkZfU0VUR0VUX0lGRDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiR2xvYmFsUGFyYW1ldGVyc0lGRCIsIE5VTEwgfSwKKyAgICAgICAgeyBUSUZGVEFHX1BST0ZJTEVUWVBFLCAxLCAxLCBUSUZGX0xPTkcsIDAsIFRJRkZfU0VUR0VUX1VJTlQzMiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJQcm9maWxlVHlwZSIsIE5VTEwgfSwKKyAgICAgICAgeyBUSUZGVEFHX0ZBWFBST0ZJTEUsIDEsIDEsIFRJRkZfQllURSwgMCwgVElGRl9TRVRHRVRfVUlOVDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiRmF4UHJvZmlsZSIsIE5VTEwgfSwKKyAgICAgICAgeyBUSUZGVEFHX0NPRElOR01FVEhPRFMsIDEsIDEsIFRJRkZfTE9ORywgMCwgVElGRl9TRVRHRVRfVUlOVDMyLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMCwgIkNvZGluZ01ldGhvZHMiLCBOVUxMIH0sCisgICAgICAgIHsgVElGRlRBR19WRVJTSU9OWUVBUiwgNCwgNCwgVElGRl9CWVRFLCAwLCBUSUZGX1NFVEdFVF9DMF9VSU5UOCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJWZXJzaW9uWWVhciIsIE5VTEwgfSwKKyAgICAgICAgeyBUSUZGVEFHX01PREVOVU1CRVIsIDEsIDEsIFRJRkZfQllURSwgMCwgVElGRl9TRVRHRVRfVUlOVDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiTW9kZU51bWJlciIsIE5VTEwgfSwKKyAgICAgICAgeyBUSUZGVEFHX0RFQ09ERSwgLTEsIC0xLCBUSUZGX1NSQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfQzE2X0ZMT0FULCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMSwgIkRlY29kZSIsIE5VTEwgfSwKKyAgICAgICAgeyBUSUZGVEFHX0lNQUdFQkFTRUNPTE9SLCAtMSwgLTEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX0MxNl9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAxLCAiSW1hZ2VCYXNlQ29sb3IiLCBOVUxMIH0sCisgICAgICAgIHsgVElGRlRBR19UODJPUFRJT05TLCAxLCAxLCBUSUZGX0xPTkcsIDAsIFRJRkZfU0VUR0VUX1VJTlQzMiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDAsIDAsICJUODJPcHRpb25zIiwgTlVMTCB9LAorICAgICAgICB7IFRJRkZUQUdfU1RSSVBST1dDT1VOVFMsIC0xLCAtMSwgVElGRl9MT05HLCAwLCBUSUZGX1NFVEdFVF9DMTZfVUlOVDMyLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMSwgIlN0cmlwUm93Q291bnRzIiwgTlVMTCB9LAorICAgICAgICB7IFRJRkZUQUdfSU1BR0VMQVlFUiwgMiwgMiwgVElGRl9MT05HLCAwLCBUSUZGX1NFVEdFVF9DMF9VSU5UMzIsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiSW1hZ2VMYXllciIsIE5VTEwgfSwKKwkvKiBlbmQgVElGRi9GWCB0YWdzICovCisJLyogYmVnaW4gcHNldWRvIHRhZ3MgKi8KK307CisKK3N0YXRpYyBUSUZGRmllbGQKK2V4aWZGaWVsZHNbXSA9IHsKKwl7IEVYSUZUQUdfRVhQT1NVUkVUSU1FLCAxLCAxLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9ET1VCTEUsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiRXhwb3N1cmVUaW1lIiwgTlVMTCB9LAorCXsgRVhJRlRBR19GTlVNQkVSLCAxLCAxLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9ET1VCTEUsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiRk51bWJlciIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfRVhQT1NVUkVQUk9HUkFNLCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiRXhwb3N1cmVQcm9ncmFtIiwgTlVMTCB9LAorCXsgRVhJRlRBR19TUEVDVFJBTFNFTlNJVElWSVRZLCAtMSwgLTEsIFRJRkZfQVNDSUksIDAsIFRJRkZfU0VUR0VUX0FTQ0lJLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIlNwZWN0cmFsU2Vuc2l0aXZpdHkiLCBOVUxMIH0sCisJeyBFWElGVEFHX0lTT1NQRUVEUkFUSU5HUywgLTEsIC0xLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9DMTZfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMSwgIklTT1NwZWVkUmF0aW5ncyIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfT0VDRiwgLTEsIC0xLCBUSUZGX1VOREVGSU5FRCwgMCwgVElGRl9TRVRHRVRfQzE2X1VJTlQ4LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMSwgIk9wdG9lbGVjdHJpY0NvbnZlcnNpb25GYWN0b3IiLCBOVUxMIH0sCisJeyBFWElGVEFHX0VYSUZWRVJTSU9OLCA0LCA0LCBUSUZGX1VOREVGSU5FRCwgMCwgVElGRl9TRVRHRVRfQzBfVUlOVDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiRXhpZlZlcnNpb24iLCBOVUxMIH0sCisJeyBFWElGVEFHX0RBVEVUSU1FT1JJR0lOQUwsIDIwLCAyMCwgVElGRl9BU0NJSSwgMCwgVElGRl9TRVRHRVRfQVNDSUksIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiRGF0ZVRpbWVPcmlnaW5hbCIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfREFURVRJTUVESUdJVElaRUQsIDIwLCAyMCwgVElGRl9BU0NJSSwgMCwgVElGRl9TRVRHRVRfQVNDSUksIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiRGF0ZVRpbWVEaWdpdGl6ZWQiLCBOVUxMIH0sCisJeyBFWElGVEFHX0NPTVBPTkVOVFNDT05GSUdVUkFUSU9OLCA0LCA0LCBUSUZGX1VOREVGSU5FRCwgMCwgVElGRl9TRVRHRVRfQzBfVUlOVDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiQ29tcG9uZW50c0NvbmZpZ3VyYXRpb24iLCBOVUxMIH0sCisJeyBFWElGVEFHX0NPTVBSRVNTRURCSVRTUEVSUElYRUwsIDEsIDEsIFRJRkZfUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0RPVUJMRSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJDb21wcmVzc2VkQml0c1BlclBpeGVsIiwgTlVMTCB9LAorCXsgRVhJRlRBR19TSFVUVEVSU1BFRURWQUxVRSwgMSwgMSwgVElGRl9TUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0RPVUJMRSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJTaHV0dGVyU3BlZWRWYWx1ZSIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfQVBFUlRVUkVWQUxVRSwgMSwgMSwgVElGRl9SQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIkFwZXJ0dXJlVmFsdWUiLCBOVUxMIH0sCisJeyBFWElGVEFHX0JSSUdIVE5FU1NWQUxVRSwgMSwgMSwgVElGRl9TUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0RPVUJMRSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJCcmlnaHRuZXNzVmFsdWUiLCBOVUxMIH0sCisJeyBFWElGVEFHX0VYUE9TVVJFQklBU1ZBTFVFLCAxLCAxLCBUSUZGX1NSQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIkV4cG9zdXJlQmlhc1ZhbHVlIiwgTlVMTCB9LAorCXsgRVhJRlRBR19NQVhBUEVSVFVSRVZBTFVFLCAxLCAxLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9ET1VCTEUsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiTWF4QXBlcnR1cmVWYWx1ZSIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfU1VCSkVDVERJU1RBTkNFLCAxLCAxLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9ET1VCTEUsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiU3ViamVjdERpc3RhbmNlIiwgTlVMTCB9LAorCXsgRVhJRlRBR19NRVRFUklOR01PREUsIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJNZXRlcmluZ01vZGUiLCBOVUxMIH0sCisJeyBFWElGVEFHX0xJR0hUU09VUkNFLCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiTGlnaHRTb3VyY2UiLCBOVUxMIH0sCisJeyBFWElGVEFHX0ZMQVNILCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiRmxhc2giLCBOVUxMIH0sCisJeyBFWElGVEFHX0ZPQ0FMTEVOR1RILCAxLCAxLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9ET1VCTEUsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiRm9jYWxMZW5ndGgiLCBOVUxMIH0sCisJeyBFWElGVEFHX1NVQkpFQ1RBUkVBLCAtMSwgLTEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX0MxNl9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAxLCAiU3ViamVjdEFyZWEiLCBOVUxMIH0sCisJeyBFWElGVEFHX01BS0VSTk9URSwgLTEsIC0xLCBUSUZGX1VOREVGSU5FRCwgMCwgVElGRl9TRVRHRVRfQzE2X1VJTlQ4LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMSwgIk1ha2VyTm90ZSIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfVVNFUkNPTU1FTlQsIC0xLCAtMSwgVElGRl9VTkRFRklORUQsIDAsIFRJRkZfU0VUR0VUX0MxNl9VSU5UOCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDEsICJVc2VyQ29tbWVudCIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfU1VCU0VDVElNRSwgLTEsIC0xLCBUSUZGX0FTQ0lJLCAwLCBUSUZGX1NFVEdFVF9BU0NJSSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJTdWJTZWNUaW1lIiwgTlVMTCB9LAorCXsgRVhJRlRBR19TVUJTRUNUSU1FT1JJR0lOQUwsIC0xLCAtMSwgVElGRl9BU0NJSSwgMCwgVElGRl9TRVRHRVRfQVNDSUksIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiU3ViU2VjVGltZU9yaWdpbmFsIiwgTlVMTCB9LAorCXsgRVhJRlRBR19TVUJTRUNUSU1FRElHSVRJWkVELCAtMSwgLTEsIFRJRkZfQVNDSUksIDAsIFRJRkZfU0VUR0VUX0FTQ0lJLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIlN1YlNlY1RpbWVEaWdpdGl6ZWQiLCBOVUxMIH0sCisJeyBFWElGVEFHX0ZMQVNIUElYVkVSU0lPTiwgNCwgNCwgVElGRl9VTkRFRklORUQsIDAsIFRJRkZfU0VUR0VUX0MwX1VJTlQ4LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIkZsYXNocGl4VmVyc2lvbiIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfQ09MT1JTUEFDRSwgMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIkNvbG9yU3BhY2UiLCBOVUxMIH0sCisJeyBFWElGVEFHX1BJWEVMWERJTUVOU0lPTiwgMSwgMSwgVElGRl9MT05HLCAwLCBUSUZGX1NFVEdFVF9VSU5UMzIsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiUGl4ZWxYRGltZW5zaW9uIiwgTlVMTCB9LAorCXsgRVhJRlRBR19QSVhFTFlESU1FTlNJT04sIDEsIDEsIFRJRkZfTE9ORywgMCwgVElGRl9TRVRHRVRfVUlOVDMyLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIlBpeGVsWURpbWVuc2lvbiIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfUkVMQVRFRFNPVU5ERklMRSwgMTMsIDEzLCBUSUZGX0FTQ0lJLCAwLCBUSUZGX1NFVEdFVF9BU0NJSSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJSZWxhdGVkU291bmRGaWxlIiwgTlVMTCB9LAorCXsgRVhJRlRBR19GTEFTSEVORVJHWSwgMSwgMSwgVElGRl9SQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIkZsYXNoRW5lcmd5IiwgTlVMTCB9LAorCXsgRVhJRlRBR19TUEFUSUFMRlJFUVVFTkNZUkVTUE9OU0UsIC0xLCAtMSwgVElGRl9VTkRFRklORUQsIDAsIFRJRkZfU0VUR0VUX0MxNl9VSU5UOCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDEsICJTcGF0aWFsRnJlcXVlbmN5UmVzcG9uc2UiLCBOVUxMIH0sCisJeyBFWElGVEFHX0ZPQ0FMUExBTkVYUkVTT0xVVElPTiwgMSwgMSwgVElGRl9SQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIkZvY2FsUGxhbmVYUmVzb2x1dGlvbiIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfRk9DQUxQTEFORVlSRVNPTFVUSU9OLCAxLCAxLCBUSUZGX1JBVElPTkFMLCAwLCBUSUZGX1NFVEdFVF9ET1VCTEUsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiRm9jYWxQbGFuZVlSZXNvbHV0aW9uIiwgTlVMTCB9LAorCXsgRVhJRlRBR19GT0NBTFBMQU5FUkVTT0xVVElPTlVOSVQsIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJGb2NhbFBsYW5lUmVzb2x1dGlvblVuaXQiLCBOVUxMIH0sCisJeyBFWElGVEFHX1NVQkpFQ1RMT0NBVElPTiwgMiwgMiwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfQzBfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIlN1YmplY3RMb2NhdGlvbiIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfRVhQT1NVUkVJTkRFWCwgMSwgMSwgVElGRl9SQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIkV4cG9zdXJlSW5kZXgiLCBOVUxMIH0sCisJeyBFWElGVEFHX1NFTlNJTkdNRVRIT0QsIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJTZW5zaW5nTWV0aG9kIiwgTlVMTCB9LAorCXsgRVhJRlRBR19GSUxFU09VUkNFLCAxLCAxLCBUSUZGX1VOREVGSU5FRCwgMCwgVElGRl9TRVRHRVRfVUlOVDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiRmlsZVNvdXJjZSIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfU0NFTkVUWVBFLCAxLCAxLCBUSUZGX1VOREVGSU5FRCwgMCwgVElGRl9TRVRHRVRfVUlOVDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiU2NlbmVUeXBlIiwgTlVMTCB9LAorCXsgRVhJRlRBR19DRkFQQVRURVJOLCAtMSwgLTEsIFRJRkZfVU5ERUZJTkVELCAwLCBUSUZGX1NFVEdFVF9DMTZfVUlOVDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAxLCAiQ0ZBUGF0dGVybiIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfQ1VTVE9NUkVOREVSRUQsIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJDdXN0b21SZW5kZXJlZCIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfRVhQT1NVUkVNT0RFLCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiRXhwb3N1cmVNb2RlIiwgTlVMTCB9LAorCXsgRVhJRlRBR19XSElURUJBTEFOQ0UsIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJXaGl0ZUJhbGFuY2UiLCBOVUxMIH0sCisJeyBFWElGVEFHX0RJR0lUQUxaT09NUkFUSU8sIDEsIDEsIFRJRkZfUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0RPVUJMRSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJEaWdpdGFsWm9vbVJhdGlvIiwgTlVMTCB9LAorCXsgRVhJRlRBR19GT0NBTExFTkdUSElOMzVNTUZJTE0sIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJGb2NhbExlbmd0aEluMzVtbUZpbG0iLCBOVUxMIH0sCisJeyBFWElGVEFHX1NDRU5FQ0FQVFVSRVRZUEUsIDEsIDEsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX1VJTlQxNiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJTY2VuZUNhcHR1cmVUeXBlIiwgTlVMTCB9LAorCXsgRVhJRlRBR19HQUlOQ09OVFJPTCwgMSwgMSwgVElGRl9SQVRJT05BTCwgMCwgVElGRl9TRVRHRVRfRE9VQkxFLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIkdhaW5Db250cm9sIiwgTlVMTCB9LAorCXsgRVhJRlRBR19DT05UUkFTVCwgMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIkNvbnRyYXN0IiwgTlVMTCB9LAorCXsgRVhJRlRBR19TQVRVUkFUSU9OLCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiU2F0dXJhdGlvbiIsIE5VTEwgfSwKKwl7IEVYSUZUQUdfU0hBUlBORVNTLCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiU2hhcnBuZXNzIiwgTlVMTCB9LAorCXsgRVhJRlRBR19ERVZJQ0VTRVRUSU5HREVTQ1JJUFRJT04sIC0xLCAtMSwgVElGRl9VTkRFRklORUQsIDAsIFRJRkZfU0VUR0VUX0MxNl9VSU5UOCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDEsICJEZXZpY2VTZXR0aW5nRGVzY3JpcHRpb24iLCBOVUxMIH0sCisJeyBFWElGVEFHX1NVQkpFQ1RESVNUQU5DRVJBTkdFLCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiU3ViamVjdERpc3RhbmNlUmFuZ2UiLCBOVUxMIH0sCisJeyBFWElGVEFHX0lNQUdFVU5JUVVFSUQsIDMzLCAzMywgVElGRl9BU0NJSSwgMCwgVElGRl9TRVRHRVRfQVNDSUksIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAxLCAwLCAiSW1hZ2VVbmlxdWVJRCIsIE5VTEwgfQorfTsKKworc3RhdGljIFRJRkZGaWVsZEFycmF5Cit0aWZmRmllbGRBcnJheSA9IHsgdGZpYXRJbWFnZSwgMCwgVElGRkFycmF5Q291bnQodGlmZkZpZWxkcyksIHRpZmZGaWVsZHMgfTsKK3N0YXRpYyBUSUZGRmllbGRBcnJheQorZXhpZkZpZWxkQXJyYXkgPSB7IHRmaWF0RXhpZiwgMCwgVElGRkFycmF5Q291bnQoZXhpZkZpZWxkcyksIGV4aWZGaWVsZHMgfTsKKworLyoKKyAqICBXZSBoYXZlIG91ciBvd24gbG9jYWwgbGZpbmQoKSBlcXVpdmVsZW50IHRvIGF2b2lkIHN1YnRsZSBkaWZmZXJlbmNlcworICogIGluIHR5cGVzIHBhc3NlZCB0byBsZmluZCgpIG9uIGRpZmZlcmVudCBzeXN0ZW1zLiAKKyAqLworCitzdGF0aWMgdm9pZCAqCit0ZF9sZmluZChjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKmJhc2UsIHNpemVfdCAqbm1lbWIsIHNpemVfdCBzaXplLAorICAgICAgICAgaW50KCpjb21wYXIpKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkKK3sKKyAgICBjaGFyICplbGVtZW50LCAqZW5kOworCisgICAgZW5kID0gKGNoYXIgKiliYXNlICsgKm5tZW1iICogc2l6ZTsKKyAgICBmb3IgKGVsZW1lbnQgPSAoY2hhciAqKWJhc2U7IGVsZW1lbnQgPCBlbmQ7IGVsZW1lbnQgKz0gc2l6ZSkKKyAgICAgICAgaWYgKCFjb21wYXIoa2V5LCBlbGVtZW50KSkJCS8qIGtleSBmb3VuZCAqLworICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworY29uc3QgVElGRkZpZWxkQXJyYXkqCitfVElGRkdldEZpZWxkcyh2b2lkKQoreworCXJldHVybigmdGlmZkZpZWxkQXJyYXkpOworfQorCitjb25zdCBUSUZGRmllbGRBcnJheSoKK19USUZGR2V0RXhpZkZpZWxkcyh2b2lkKQoreworCXJldHVybigmZXhpZkZpZWxkQXJyYXkpOworfQorCit2b2lkCitfVElGRlNldHVwRmllbGRzKFRJRkYqIHRpZiwgY29uc3QgVElGRkZpZWxkQXJyYXkqIGZpZWxkYXJyYXkpCit7CisJaWYgKHRpZi0+dGlmX2ZpZWxkcyAmJiB0aWYtPnRpZl9uZmllbGRzID4gMCkgeworCQl1aW50MzIgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgdGlmLT50aWZfbmZpZWxkczsgaSsrKSB7CisJCQlUSUZGRmllbGQgKmZsZCA9IHRpZi0+dGlmX2ZpZWxkc1tpXTsKKwkJCWlmIChmbGQtPmZpZWxkX2JpdCA9PSBGSUVMRF9DVVNUT00gJiYKKwkJCQlzdHJuY21wKCJUYWcgIiwgZmxkLT5maWVsZF9uYW1lLCA0KSA9PSAwKSB7CisJCQkJCV9USUZGZnJlZShmbGQtPmZpZWxkX25hbWUpOworCQkJCQlfVElGRmZyZWUoZmxkKTsKKwkJCQl9CisJCX0KKworCQlfVElGRmZyZWUodGlmLT50aWZfZmllbGRzKTsKKwkJdGlmLT50aWZfZmllbGRzID0gTlVMTDsKKwkJdGlmLT50aWZfbmZpZWxkcyA9IDA7CisJfQorCWlmICghX1RJRkZNZXJnZUZpZWxkcyh0aWYsIGZpZWxkYXJyYXktPmZpZWxkcywgZmllbGRhcnJheS0+Y291bnQpKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCAiX1RJRkZTZXR1cEZpZWxkcyIsCisJCQkgICAgICJTZXR0aW5nIHVwIGZpZWxkIGluZm8gZmFpbGVkIik7CisJfQorfQorCitzdGF0aWMgaW50Cit0YWdDb21wYXJlKGNvbnN0IHZvaWQqIGEsIGNvbnN0IHZvaWQqIGIpCit7CisJY29uc3QgVElGRkZpZWxkKiB0YSA9ICooY29uc3QgVElGRkZpZWxkKiopIGE7CisJY29uc3QgVElGRkZpZWxkKiB0YiA9ICooY29uc3QgVElGRkZpZWxkKiopIGI7CisJLyogTkI6IGJlIGNhcmVmdWwgb2YgcmV0dXJuIHZhbHVlcyBmb3IgMTYtYml0IHBsYXRmb3JtcyAqLworCWlmICh0YS0+ZmllbGRfdGFnICE9IHRiLT5maWVsZF90YWcpCisJCXJldHVybiAoaW50KXRhLT5maWVsZF90YWcgLSAoaW50KXRiLT5maWVsZF90YWc7CisJZWxzZQorCQlyZXR1cm4gKHRhLT5maWVsZF90eXBlID09IFRJRkZfQU5ZKSA/CisJCQkwIDogKChpbnQpdGItPmZpZWxkX3R5cGUgLSAoaW50KXRhLT5maWVsZF90eXBlKTsKK30KKworc3RhdGljIGludAordGFnTmFtZUNvbXBhcmUoY29uc3Qgdm9pZCogYSwgY29uc3Qgdm9pZCogYikKK3sKKwljb25zdCBUSUZGRmllbGQqIHRhID0gKihjb25zdCBUSUZGRmllbGQqKikgYTsKKwljb25zdCBUSUZGRmllbGQqIHRiID0gKihjb25zdCBUSUZGRmllbGQqKikgYjsKKwlpbnQgcmV0ID0gc3RyY21wKHRhLT5maWVsZF9uYW1lLCB0Yi0+ZmllbGRfbmFtZSk7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWVsc2UKKwkJcmV0dXJuICh0YS0+ZmllbGRfdHlwZSA9PSBUSUZGX0FOWSkgPworCQkJMCA6ICgoaW50KXRiLT5maWVsZF90eXBlIC0gKGludCl0YS0+ZmllbGRfdHlwZSk7Cit9CisKK2ludAorX1RJRkZNZXJnZUZpZWxkcyhUSUZGKiB0aWYsIGNvbnN0IFRJRkZGaWVsZCBpbmZvW10sIHVpbnQzMiBuKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIl9USUZGTWVyZ2VGaWVsZHMiOworCXN0YXRpYyBjb25zdCBjaGFyIHJlYXNvbltdID0gImZvciBmaWVsZHMgYXJyYXkiOworCS8qIFRJRkZGaWVsZCoqIHRwOyAqLworCXVpbnQzMiBpOworCisgICAgICAgIHRpZi0+dGlmX2ZvdW5kZmllbGQgPSBOVUxMOworCisJaWYgKHRpZi0+dGlmX2ZpZWxkcyAmJiB0aWYtPnRpZl9uZmllbGRzID4gMCkgeworCQl0aWYtPnRpZl9maWVsZHMgPSAoVElGRkZpZWxkKiopCisJCQlfVElGRkNoZWNrUmVhbGxvYyh0aWYsIHRpZi0+dGlmX2ZpZWxkcywKKwkJCQkJICAodGlmLT50aWZfbmZpZWxkcyArIG4pLAorCQkJCQkgIHNpemVvZihUSUZGRmllbGQgKiksIHJlYXNvbik7CisJfSBlbHNlIHsKKwkJdGlmLT50aWZfZmllbGRzID0gKFRJRkZGaWVsZCAqKikKKwkJCV9USUZGQ2hlY2tNYWxsb2ModGlmLCBuLCBzaXplb2YoVElGRkZpZWxkICopLAorCQkJCQkgcmVhc29uKTsKKwl9CisJaWYgKCF0aWYtPnRpZl9maWVsZHMpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBmaWVsZHMgYXJyYXkiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogdHAgPSB0aWYtPnRpZl9maWVsZHMgKyB0aWYtPnRpZl9uZmllbGRzOyAqLworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJY29uc3QgVElGRkZpZWxkICpmaXAgPQorCQkJVElGRkZpbmRGaWVsZCh0aWYsIGluZm9baV0uZmllbGRfdGFnLCBUSUZGX0FOWSk7CisKKyAgICAgICAgICAgICAgICAvKiBvbmx5IGFkZCBkZWZpbml0aW9ucyB0aGF0IGFyZW4ndCBhbHJlYWR5IHByZXNlbnQgKi8KKwkJaWYgKCFmaXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX2ZpZWxkc1t0aWYtPnRpZl9uZmllbGRzXSA9IChUSUZGRmllbGQgKikgKGluZm8raSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aWYtPnRpZl9uZmllbGRzKys7CisgICAgICAgICAgICAgICAgfQorCX0KKworICAgICAgICAvKiBTb3J0IHRoZSBmaWVsZCBpbmZvIGJ5IHRhZyBudW1iZXIgKi8KKwlxc29ydCh0aWYtPnRpZl9maWVsZHMsIHRpZi0+dGlmX25maWVsZHMsCisJICAgICAgc2l6ZW9mKFRJRkZGaWVsZCAqKSwgdGFnQ29tcGFyZSk7CisKKwlyZXR1cm4gbjsKK30KKwordm9pZAorX1RJRkZQcmludEZpZWxkSW5mbyhUSUZGKiB0aWYsIEZJTEUqIGZkKQoreworCXVpbnQzMiBpOworCisJZnByaW50ZihmZCwgIiVzOiBcbiIsIHRpZi0+dGlmX25hbWUpOworCWZvciAoaSA9IDA7IGkgPCB0aWYtPnRpZl9uZmllbGRzOyBpKyspIHsKKwkJY29uc3QgVElGRkZpZWxkKiBmaXAgPSB0aWYtPnRpZl9maWVsZHNbaV07CisJCWZwcmludGYoZmQsICJmaWVsZFslMmRdICU1bHUsICUyZCwgJTJkLCAlZCwgJTJkLCAlNXMsICU1cywgJXNcbiIKKwkJCSwgKGludClpCisJCQksICh1bnNpZ25lZCBsb25nKSBmaXAtPmZpZWxkX3RhZworCQkJLCBmaXAtPmZpZWxkX3JlYWRjb3VudCwgZmlwLT5maWVsZF93cml0ZWNvdW50CisJCQksIGZpcC0+ZmllbGRfdHlwZQorCQkJLCBmaXAtPmZpZWxkX2JpdAorCQkJLCBmaXAtPmZpZWxkX29rdG9jaGFuZ2UgPyAiVFJVRSIgOiAiRkFMU0UiCisJCQksIGZpcC0+ZmllbGRfcGFzc2NvdW50ID8gIlRSVUUiIDogIkZBTFNFIgorCQkJLCBmaXAtPmZpZWxkX25hbWUKKwkJKTsKKwl9Cit9CisKKy8qCisgKiBSZXR1cm4gc2l6ZSBvZiBUSUZGRGF0YVR5cGUgaW4gYnl0ZXMKKyAqLworaW50CitUSUZGRGF0YVdpZHRoKFRJRkZEYXRhVHlwZSB0eXBlKQoreworCXN3aXRjaCh0eXBlKQorCXsKKwkJY2FzZSAwOiAgLyogbm90aGluZyAqLworCQljYXNlIFRJRkZfQllURToKKwkJY2FzZSBUSUZGX0FTQ0lJOgorCQljYXNlIFRJRkZfU0JZVEU6CisJCWNhc2UgVElGRl9VTkRFRklORUQ6CisJCQlyZXR1cm4gMTsKKwkJY2FzZSBUSUZGX1NIT1JUOgorCQljYXNlIFRJRkZfU1NIT1JUOgorCQkJcmV0dXJuIDI7CisJCWNhc2UgVElGRl9MT05HOgorCQljYXNlIFRJRkZfU0xPTkc6CisJCWNhc2UgVElGRl9GTE9BVDoKKwkJY2FzZSBUSUZGX0lGRDoKKwkJCXJldHVybiA0OworCQljYXNlIFRJRkZfUkFUSU9OQUw6CisJCWNhc2UgVElGRl9TUkFUSU9OQUw6CisJCWNhc2UgVElGRl9ET1VCTEU6CisJCWNhc2UgVElGRl9MT05HODoKKwkJY2FzZSBUSUZGX1NMT05HODoKKwkJY2FzZSBUSUZGX0lGRDg6CisJCQlyZXR1cm4gODsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOyAvKiB3aWxsIHJldHVybiAwIGZvciB1bmtub3duIHR5cGVzICovCisJfQorfQorCisvKgorICogUmV0dXJuIHNpemUgb2YgVElGRkRhdGFUeXBlIGluIGJ5dGVzLgorICoKKyAqIFhYWDogV2UgbmVlZCBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGUgc3BhY2UgbmVlZGVkCisgKiB0byBzdG9yZSB0aGUgdmFsdWUuIEZvciBUSUZGX1JBVElPTkFMIHZhbHVlcyBUSUZGRGF0YVdpZHRoKCkgcmV0dXJucyA4LAorICogYnV0IHdlIHVzZSA0LWJ5dGUgZmxvYXQgdG8gcmVwcmVzZW50IHJhdGlvbmFscy4KKyAqLworaW50CitfVElGRkRhdGFTaXplKFRJRkZEYXRhVHlwZSB0eXBlKQoreworCXN3aXRjaCAodHlwZSkKKwl7CisJCWNhc2UgVElGRl9CWVRFOgorCQljYXNlIFRJRkZfU0JZVEU6CisJCWNhc2UgVElGRl9BU0NJSToKKwkJY2FzZSBUSUZGX1VOREVGSU5FRDoKKwkJICAgIHJldHVybiAxOworCQljYXNlIFRJRkZfU0hPUlQ6CisJCWNhc2UgVElGRl9TU0hPUlQ6CisJCSAgICByZXR1cm4gMjsKKwkJY2FzZSBUSUZGX0xPTkc6CisJCWNhc2UgVElGRl9TTE9ORzoKKwkJY2FzZSBUSUZGX0ZMT0FUOgorCQljYXNlIFRJRkZfSUZEOgorCQljYXNlIFRJRkZfUkFUSU9OQUw6CisJCWNhc2UgVElGRl9TUkFUSU9OQUw6CisJCSAgICByZXR1cm4gNDsKKwkJY2FzZSBUSUZGX0RPVUJMRToKKwkJY2FzZSBUSUZGX0xPTkc4OgorCQljYXNlIFRJRkZfU0xPTkc4OgorCQljYXNlIFRJRkZfSUZEODoKKwkJICAgIHJldHVybiA4OworCQlkZWZhdWx0OgorCQkgICAgcmV0dXJuIDA7CisJfQorfQorCitjb25zdCBUSUZGRmllbGQqCitUSUZGRmluZEZpZWxkKFRJRkYqIHRpZiwgdWludDMyIHRhZywgVElGRkRhdGFUeXBlIGR0KQoreworCVRJRkZGaWVsZCBrZXkgPSB7MCwgMCwgMCwgVElGRl9OT1RZUEUsIDAsIDAsIDAsIDAsIDAsIDAsIE5VTEwsIE5VTEx9OworCVRJRkZGaWVsZCogcGtleSA9ICZrZXk7CisJY29uc3QgVElGRkZpZWxkICoqcmV0OworCWlmICh0aWYtPnRpZl9mb3VuZGZpZWxkICYmIHRpZi0+dGlmX2ZvdW5kZmllbGQtPmZpZWxkX3RhZyA9PSB0YWcgJiYKKwkgICAgKGR0ID09IFRJRkZfQU5ZIHx8IGR0ID09IHRpZi0+dGlmX2ZvdW5kZmllbGQtPmZpZWxkX3R5cGUpKQorCQlyZXR1cm4gdGlmLT50aWZfZm91bmRmaWVsZDsKKworCS8qIElmIHdlIGFyZSBpbnZva2VkIHdpdGggbm8gZmllbGQgaW5mb3JtYXRpb24sIHRoZW4ganVzdCByZXR1cm4uICovCisJaWYgKCF0aWYtPnRpZl9maWVsZHMpCisJCXJldHVybiBOVUxMOworCisJLyogTkI6IHVzZSBzb3J0ZWQgc2VhcmNoIChlLmcuIGJpbmFyeSBzZWFyY2gpICovCisKKwlrZXkuZmllbGRfdGFnID0gdGFnOworCWtleS5maWVsZF90eXBlID0gZHQ7CisKKwlyZXQgPSAoY29uc3QgVElGRkZpZWxkICoqKSBic2VhcmNoKCZwa2V5LCB0aWYtPnRpZl9maWVsZHMsCisJCQkJCSAgIHRpZi0+dGlmX25maWVsZHMsCisJCQkJCSAgIHNpemVvZihUSUZGRmllbGQgKiksIHRhZ0NvbXBhcmUpOworCXJldHVybiB0aWYtPnRpZl9mb3VuZGZpZWxkID0gKHJldCA/ICpyZXQgOiBOVUxMKTsKK30KKworY29uc3QgVElGRkZpZWxkKgorX1RJRkZGaW5kRmllbGRCeU5hbWUoVElGRiogdGlmLCBjb25zdCBjaGFyICpmaWVsZF9uYW1lLCBUSUZGRGF0YVR5cGUgZHQpCit7CisJVElGRkZpZWxkIGtleSA9IHswLCAwLCAwLCBUSUZGX05PVFlQRSwgMCwgMCwgMCwgMCwgMCwgMCwgTlVMTCwgTlVMTH07CisJVElGRkZpZWxkKiBwa2V5ID0gJmtleTsKKwljb25zdCBUSUZGRmllbGQgKipyZXQ7CisJaWYgKHRpZi0+dGlmX2ZvdW5kZmllbGQKKwkgICAgJiYgc3RyZXEodGlmLT50aWZfZm91bmRmaWVsZC0+ZmllbGRfbmFtZSwgZmllbGRfbmFtZSkKKwkgICAgJiYgKGR0ID09IFRJRkZfQU5ZIHx8IGR0ID09IHRpZi0+dGlmX2ZvdW5kZmllbGQtPmZpZWxkX3R5cGUpKQorCQlyZXR1cm4gKHRpZi0+dGlmX2ZvdW5kZmllbGQpOworCisJLyogSWYgd2UgYXJlIGludm9rZWQgd2l0aCBubyBmaWVsZCBpbmZvcm1hdGlvbiwgdGhlbiBqdXN0IHJldHVybi4gKi8KKwlpZiAoIXRpZi0+dGlmX2ZpZWxkcykKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBOQjogdXNlIGxpbmVhciBzZWFyY2ggc2luY2UgbGlzdCBpcyBzb3J0ZWQgYnkga2V5Iywgbm90IG5hbWUgKi8KKworCWtleS5maWVsZF9uYW1lID0gKGNoYXIgKilmaWVsZF9uYW1lOworCWtleS5maWVsZF90eXBlID0gZHQ7CisKKwlyZXQgPSAoY29uc3QgVElGRkZpZWxkICoqKSAKKyAgICAgICAgICAgIHRkX2xmaW5kKCZwa2V5LCB0aWYtPnRpZl9maWVsZHMsICZ0aWYtPnRpZl9uZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFRJRkZGaWVsZCAqKSwgdGFnTmFtZUNvbXBhcmUpOworCisJcmV0dXJuIHRpZi0+dGlmX2ZvdW5kZmllbGQgPSAocmV0ID8gKnJldCA6IE5VTEwpOworfQorCitjb25zdCBUSUZGRmllbGQqCitUSUZGRmllbGRXaXRoVGFnKFRJRkYqIHRpZiwgdWludDMyIHRhZykKK3sKKwljb25zdCBUSUZGRmllbGQqIGZpcCA9IFRJRkZGaW5kRmllbGQodGlmLCB0YWcsIFRJRkZfQU5ZKTsKKwlpZiAoIWZpcCkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgIlRJRkZGaWVsZFdpdGhUYWciLAorCQkJICAgICAiSW50ZXJuYWwgZXJyb3IsIHVua25vd24gdGFnIDB4JXgiLAorCQkJICAgICAodW5zaWduZWQgaW50KSB0YWcpOworCX0KKwlyZXR1cm4gKGZpcCk7Cit9CisKK2NvbnN0IFRJRkZGaWVsZCoKK1RJRkZGaWVsZFdpdGhOYW1lKFRJRkYqIHRpZiwgY29uc3QgY2hhciAqZmllbGRfbmFtZSkKK3sKKwljb25zdCBUSUZGRmllbGQqIGZpcCA9CisJCV9USUZGRmluZEZpZWxkQnlOYW1lKHRpZiwgZmllbGRfbmFtZSwgVElGRl9BTlkpOworCWlmICghZmlwKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCAiVElGRkZpZWxkV2l0aE5hbWUiLAorCQkJICAgICAiSW50ZXJuYWwgZXJyb3IsIHVua25vd24gdGFnICVzIiwgZmllbGRfbmFtZSk7CisJfQorCXJldHVybiAoZmlwKTsKK30KKwordWludDMyCitUSUZGRmllbGRUYWcoY29uc3QgVElGRkZpZWxkKiBmaXApCit7CisJcmV0dXJuIGZpcC0+ZmllbGRfdGFnOworfQorCitjb25zdCBjaGFyICoKK1RJRkZGaWVsZE5hbWUoY29uc3QgVElGRkZpZWxkKiBmaXApCit7CisJcmV0dXJuIGZpcC0+ZmllbGRfbmFtZTsKK30KKworVElGRkRhdGFUeXBlCitUSUZGRmllbGREYXRhVHlwZShjb25zdCBUSUZGRmllbGQqIGZpcCkKK3sKKwlyZXR1cm4gZmlwLT5maWVsZF90eXBlOworfQorCitpbnQKK1RJRkZGaWVsZFBhc3NDb3VudChjb25zdCBUSUZGRmllbGQqIGZpcCkKK3sKKwlyZXR1cm4gZmlwLT5maWVsZF9wYXNzY291bnQ7Cit9CisKK2ludAorVElGRkZpZWxkUmVhZENvdW50KGNvbnN0IFRJRkZGaWVsZCogZmlwKQoreworCXJldHVybiBmaXAtPmZpZWxkX3JlYWRjb3VudDsKK30KKworaW50CitUSUZGRmllbGRXcml0ZUNvdW50KGNvbnN0IFRJRkZGaWVsZCogZmlwKQoreworCXJldHVybiBmaXAtPmZpZWxkX3dyaXRlY291bnQ7Cit9CisKK2NvbnN0IFRJRkZGaWVsZCoKK19USUZGRmluZE9yUmVnaXN0ZXJGaWVsZChUSUZGICp0aWYsIHVpbnQzMiB0YWcsIFRJRkZEYXRhVHlwZSBkdCkKKworeworCWNvbnN0IFRJRkZGaWVsZCAqZmxkOworCisJZmxkID0gVElGRkZpbmRGaWVsZCh0aWYsIHRhZywgZHQpOworCWlmIChmbGQgPT0gTlVMTCkgeworCQlmbGQgPSBfVElGRkNyZWF0ZUFub25GaWVsZCh0aWYsIHRhZywgZHQpOworCQlpZiAoIV9USUZGTWVyZ2VGaWVsZHModGlmLCBmbGQsIDEpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGZsZDsKK30KKworVElGRkZpZWxkKgorX1RJRkZDcmVhdGVBbm9uRmllbGQoVElGRiAqdGlmLCB1aW50MzIgdGFnLCBUSUZGRGF0YVR5cGUgZmllbGRfdHlwZSkKK3sKKwlUSUZGRmllbGQgKmZsZDsKKwkodm9pZCkgdGlmOworCisJZmxkID0gKFRJRkZGaWVsZCAqKSBfVElGRm1hbGxvYyhzaXplb2YgKFRJRkZGaWVsZCkpOworCWlmIChmbGQgPT0gTlVMTCkKKwkgICAgcmV0dXJuIE5VTEw7CisJX1RJRkZtZW1zZXQoZmxkLCAwLCBzaXplb2YoVElGRkZpZWxkKSk7CisKKwlmbGQtPmZpZWxkX3RhZyA9IHRhZzsKKwlmbGQtPmZpZWxkX3JlYWRjb3VudCA9IFRJRkZfVkFSSUFCTEUyOworCWZsZC0+ZmllbGRfd3JpdGVjb3VudCA9IFRJRkZfVkFSSUFCTEUyOworCWZsZC0+ZmllbGRfdHlwZSA9IGZpZWxkX3R5cGU7CisJZmxkLT5yZXNlcnZlZCA9IDA7CisJc3dpdGNoIChmaWVsZF90eXBlKQorCXsKKwkJY2FzZSBUSUZGX0JZVEU6CisJCWNhc2UgVElGRl9VTkRFRklORUQ6CisJCQlmbGQtPnNldF9maWVsZF90eXBlID0gVElGRl9TRVRHRVRfQzMyX1VJTlQ4OworCQkJZmxkLT5nZXRfZmllbGRfdHlwZSA9IFRJRkZfU0VUR0VUX0MzMl9VSU5UODsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZfQVNDSUk6CisJCQlmbGQtPnNldF9maWVsZF90eXBlID0gVElGRl9TRVRHRVRfQzMyX0FTQ0lJOworCQkJZmxkLT5nZXRfZmllbGRfdHlwZSA9IFRJRkZfU0VUR0VUX0MzMl9BU0NJSTsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0hPUlQ6CisJCQlmbGQtPnNldF9maWVsZF90eXBlID0gVElGRl9TRVRHRVRfQzMyX1VJTlQxNjsKKwkJCWZsZC0+Z2V0X2ZpZWxkX3R5cGUgPSBUSUZGX1NFVEdFVF9DMzJfVUlOVDE2OworCQkJYnJlYWs7CisJCWNhc2UgVElGRl9MT05HOgorCQkJZmxkLT5zZXRfZmllbGRfdHlwZSA9IFRJRkZfU0VUR0VUX0MzMl9VSU5UMzI7CisJCQlmbGQtPmdldF9maWVsZF90eXBlID0gVElGRl9TRVRHRVRfQzMyX1VJTlQzMjsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZfUkFUSU9OQUw6CisJCWNhc2UgVElGRl9TUkFUSU9OQUw6CisJCWNhc2UgVElGRl9GTE9BVDoKKwkJCWZsZC0+c2V0X2ZpZWxkX3R5cGUgPSBUSUZGX1NFVEdFVF9DMzJfRkxPQVQ7CisJCQlmbGQtPmdldF9maWVsZF90eXBlID0gVElGRl9TRVRHRVRfQzMyX0ZMT0FUOworCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TQllURToKKwkJCWZsZC0+c2V0X2ZpZWxkX3R5cGUgPSBUSUZGX1NFVEdFVF9DMzJfU0lOVDg7CisJCQlmbGQtPmdldF9maWVsZF90eXBlID0gVElGRl9TRVRHRVRfQzMyX1NJTlQ4OworCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TU0hPUlQ6CisJCQlmbGQtPnNldF9maWVsZF90eXBlID0gVElGRl9TRVRHRVRfQzMyX1NJTlQxNjsKKwkJCWZsZC0+Z2V0X2ZpZWxkX3R5cGUgPSBUSUZGX1NFVEdFVF9DMzJfU0lOVDE2OworCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TTE9ORzoKKwkJCWZsZC0+c2V0X2ZpZWxkX3R5cGUgPSBUSUZGX1NFVEdFVF9DMzJfU0lOVDMyOworCQkJZmxkLT5nZXRfZmllbGRfdHlwZSA9IFRJRkZfU0VUR0VUX0MzMl9TSU5UMzI7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX0RPVUJMRToKKwkJCWZsZC0+c2V0X2ZpZWxkX3R5cGUgPSBUSUZGX1NFVEdFVF9DMzJfRE9VQkxFOworCQkJZmxkLT5nZXRfZmllbGRfdHlwZSA9IFRJRkZfU0VUR0VUX0MzMl9ET1VCTEU7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX0lGRDoKKwkJY2FzZSBUSUZGX0lGRDg6CisJCQlmbGQtPnNldF9maWVsZF90eXBlID0gVElGRl9TRVRHRVRfQzMyX0lGRDg7CisJCQlmbGQtPmdldF9maWVsZF90eXBlID0gVElGRl9TRVRHRVRfQzMyX0lGRDg7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX0xPTkc4OgorCQkJZmxkLT5zZXRfZmllbGRfdHlwZSA9IFRJRkZfU0VUR0VUX0MzMl9VSU5UNjQ7CisJCQlmbGQtPmdldF9maWVsZF90eXBlID0gVElGRl9TRVRHRVRfQzMyX1VJTlQ2NDsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJZmxkLT5zZXRfZmllbGRfdHlwZSA9IFRJRkZfU0VUR0VUX0MzMl9TSU5UNjQ7CisJCQlmbGQtPmdldF9maWVsZF90eXBlID0gVElGRl9TRVRHRVRfQzMyX1NJTlQ2NDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZmxkLT5zZXRfZmllbGRfdHlwZSA9IFRJRkZfU0VUR0VUX1VOREVGSU5FRDsKKwkJCWZsZC0+Z2V0X2ZpZWxkX3R5cGUgPSBUSUZGX1NFVEdFVF9VTkRFRklORUQ7CisJCQlicmVhazsKKwl9CisJZmxkLT5maWVsZF9iaXQgPSBGSUVMRF9DVVNUT007CisJZmxkLT5maWVsZF9va3RvY2hhbmdlID0gVFJVRTsKKwlmbGQtPmZpZWxkX3Bhc3Njb3VudCA9IFRSVUU7CisJZmxkLT5maWVsZF9uYW1lID0gKGNoYXIgKikgX1RJRkZtYWxsb2MoMzIpOworCWlmIChmbGQtPmZpZWxkX25hbWUgPT0gTlVMTCkgeworCSAgICBfVElGRmZyZWUoZmxkKTsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorCWZsZC0+ZmllbGRfc3ViZmllbGRzID0gTlVMTDsKKworCS8qIAorCSAqIG5vdGUgdGhhdCB0aGlzIG5hbWUgaXMgYSBzcGVjaWFsIHNpZ24gdG8gVElGRkNsb3NlKCkgYW5kCisJICogX1RJRkZTZXR1cEZpZWxkcygpIHRvIGZyZWUgdGhlIGZpZWxkCisJICovCisJc25wcmludGYoZmxkLT5maWVsZF9uYW1lLCAzMiwgIlRhZyAlZCIsIChpbnQpIHRhZyk7CisKKwlyZXR1cm4gZmxkOyAgICAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgTyBCIFMgTyBMIEUgVCBFIEQgICAgSSBOIFQgRSBSIEYgQSBDIEUgUworICoKKyAqIERvbid0IHVzZSB0aGlzIHN0dWZmIGluIHlvdXIgYXBwbGljYXRpb25zLCBpdCBtYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlCisgKiBsaWJ0aWZmIHZlcnNpb25zLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBUSUZGU2V0R2V0RmllbGRUeXBlCitfVElGRlNldEdldFR5cGUoVElGRkRhdGFUeXBlIHR5cGUsIHNob3J0IGNvdW50LCB1bnNpZ25lZCBjaGFyIHBhc3Njb3VudCkKK3sKKwlpZiAodHlwZSA9PSBUSUZGX0FTQ0lJICYmIGNvdW50ID09IFRJRkZfVkFSSUFCTEUgJiYgcGFzc2NvdW50ID09IDApCisJCXJldHVybiBUSUZGX1NFVEdFVF9BU0NJSTsKKworCWVsc2UgaWYgKGNvdW50ID09IDEgJiYgcGFzc2NvdW50ID09IDApIHsKKwkJc3dpdGNoICh0eXBlKQorCQl7CisJCQljYXNlIFRJRkZfQllURToKKwkJCWNhc2UgVElGRl9VTkRFRklORUQ6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX1VJTlQ4OworCQkJY2FzZSBUSUZGX0FTQ0lJOgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9BU0NJSTsKKwkJCWNhc2UgVElGRl9TSE9SVDoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfVUlOVDE2OworCQkJY2FzZSBUSUZGX0xPTkc6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX1VJTlQzMjsKKwkJCWNhc2UgVElGRl9SQVRJT05BTDoKKwkJCWNhc2UgVElGRl9TUkFUSU9OQUw6CisJCQljYXNlIFRJRkZfRkxPQVQ6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX0ZMT0FUOworCQkJY2FzZSBUSUZGX1NCWVRFOgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9TSU5UODsKKwkJCWNhc2UgVElGRl9TU0hPUlQ6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX1NJTlQxNjsKKwkJCWNhc2UgVElGRl9TTE9ORzoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfU0lOVDMyOworCQkJY2FzZSBUSUZGX0RPVUJMRToKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfRE9VQkxFOworCQkJY2FzZSBUSUZGX0lGRDoKKwkJCWNhc2UgVElGRl9JRkQ4OgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9JRkQ4OworCQkJY2FzZSBUSUZGX0xPTkc4OgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9VSU5UNjQ7CisJCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9TSU5UNjQ7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9VTkRFRklORUQ7CisJCX0KKwl9CisKKwllbHNlIGlmIChjb3VudCA+PSAxICYmIHBhc3Njb3VudCA9PSAwKSB7CisJCXN3aXRjaCAodHlwZSkKKwkJeworCQkJY2FzZSBUSUZGX0JZVEU6CisJCQljYXNlIFRJRkZfVU5ERUZJTkVEOgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMF9VSU5UODsKKwkJCWNhc2UgVElGRl9BU0NJSToKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfQzBfQVNDSUk7CisJCQljYXNlIFRJRkZfU0hPUlQ6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX0MwX1VJTlQxNjsKKwkJCWNhc2UgVElGRl9MT05HOgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMF9VSU5UMzI7CisJCQljYXNlIFRJRkZfUkFUSU9OQUw6CisJCQljYXNlIFRJRkZfU1JBVElPTkFMOgorCQkJY2FzZSBUSUZGX0ZMT0FUOgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMF9GTE9BVDsKKwkJCWNhc2UgVElGRl9TQllURToKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfQzBfU0lOVDg7CisJCQljYXNlIFRJRkZfU1NIT1JUOgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMF9TSU5UMTY7CisJCQljYXNlIFRJRkZfU0xPTkc6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX0MwX1NJTlQzMjsKKwkJCWNhc2UgVElGRl9ET1VCTEU6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX0MwX0RPVUJMRTsKKwkJCWNhc2UgVElGRl9JRkQ6CisJCQljYXNlIFRJRkZfSUZEODoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfQzBfSUZEODsKKwkJCWNhc2UgVElGRl9MT05HODoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfQzBfVUlOVDY0OworCQkJY2FzZSBUSUZGX1NMT05HODoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfQzBfU0lOVDY0OworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfVU5ERUZJTkVEOworCQl9CisJfQorCisJZWxzZSBpZiAoY291bnQgPT0gVElGRl9WQVJJQUJMRSAmJiBwYXNzY291bnQgPT0gMSkgeworCQlzd2l0Y2ggKHR5cGUpCisJCXsKKwkJCWNhc2UgVElGRl9CWVRFOgorCQkJY2FzZSBUSUZGX1VOREVGSU5FRDoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfQzE2X1VJTlQ4OworCQkJY2FzZSBUSUZGX0FTQ0lJOgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMTZfQVNDSUk7CisJCQljYXNlIFRJRkZfU0hPUlQ6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX0MxNl9VSU5UMTY7CisJCQljYXNlIFRJRkZfTE9ORzoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfQzE2X1VJTlQzMjsKKwkJCWNhc2UgVElGRl9SQVRJT05BTDoKKwkJCWNhc2UgVElGRl9TUkFUSU9OQUw6CisJCQljYXNlIFRJRkZfRkxPQVQ6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX0MxNl9GTE9BVDsKKwkJCWNhc2UgVElGRl9TQllURToKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfQzE2X1NJTlQ4OworCQkJY2FzZSBUSUZGX1NTSE9SVDoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfQzE2X1NJTlQxNjsKKwkJCWNhc2UgVElGRl9TTE9ORzoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfQzE2X1NJTlQzMjsKKwkJCWNhc2UgVElGRl9ET1VCTEU6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX0MxNl9ET1VCTEU7CisJCQljYXNlIFRJRkZfSUZEOgorCQkJY2FzZSBUSUZGX0lGRDg6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX0MxNl9JRkQ4OworCQkJY2FzZSBUSUZGX0xPTkc4OgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMTZfVUlOVDY0OworCQkJY2FzZSBUSUZGX1NMT05HODoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfQzE2X1NJTlQ2NDsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX1VOREVGSU5FRDsKKwkJfQorCX0KKworCWVsc2UgaWYgKGNvdW50ID09IFRJRkZfVkFSSUFCTEUyICYmIHBhc3Njb3VudCA9PSAxKSB7CisJCXN3aXRjaCAodHlwZSkKKwkJeworCQkJY2FzZSBUSUZGX0JZVEU6CisJCQljYXNlIFRJRkZfVU5ERUZJTkVEOgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMzJfVUlOVDg7CisJCQljYXNlIFRJRkZfQVNDSUk6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX0MzMl9BU0NJSTsKKwkJCWNhc2UgVElGRl9TSE9SVDoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfQzMyX1VJTlQxNjsKKwkJCWNhc2UgVElGRl9MT05HOgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMzJfVUlOVDMyOworCQkJY2FzZSBUSUZGX1JBVElPTkFMOgorCQkJY2FzZSBUSUZGX1NSQVRJT05BTDoKKwkJCWNhc2UgVElGRl9GTE9BVDoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfQzMyX0ZMT0FUOworCQkJY2FzZSBUSUZGX1NCWVRFOgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMzJfU0lOVDg7CisJCQljYXNlIFRJRkZfU1NIT1JUOgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMzJfU0lOVDE2OworCQkJY2FzZSBUSUZGX1NMT05HOgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMzJfU0lOVDMyOworCQkJY2FzZSBUSUZGX0RPVUJMRToKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfQzMyX0RPVUJMRTsKKwkJCWNhc2UgVElGRl9JRkQ6CisJCQljYXNlIFRJRkZfSUZEODoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfQzMyX0lGRDg7CisJCQljYXNlIFRJRkZfTE9ORzg6CisJCQkJcmV0dXJuIFRJRkZfU0VUR0VUX0MzMl9VSU5UNjQ7CisJCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJCXJldHVybiBUSUZGX1NFVEdFVF9DMzJfU0lOVDY0OworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gVElGRl9TRVRHRVRfVU5ERUZJTkVEOworCQl9CisJfQorCisJcmV0dXJuIFRJRkZfU0VUR0VUX1VOREVGSU5FRDsKK30KKworaW50CitUSUZGTWVyZ2VGaWVsZEluZm8oVElGRiogdGlmLCBjb25zdCBUSUZGRmllbGRJbmZvIGluZm9bXSwgdWludDMyIG4pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRk1lcmdlRmllbGRJbmZvIjsKKwlzdGF0aWMgY29uc3QgY2hhciByZWFzb25bXSA9ICJmb3IgZmllbGRzIGFycmF5IjsKKwlUSUZGRmllbGQgKnRwOworCXNpemVfdCBuZmllbGRzOworCXVpbnQzMiBpOworCisJaWYgKHRpZi0+dGlmX25maWVsZHNjb21wYXQgPiAwKSB7CisJCXRpZi0+dGlmX2ZpZWxkc2NvbXBhdCA9IChUSUZGRmllbGRBcnJheSAqKQorCQkJX1RJRkZDaGVja1JlYWxsb2ModGlmLCB0aWYtPnRpZl9maWVsZHNjb21wYXQsCisJCQkJCSAgdGlmLT50aWZfbmZpZWxkc2NvbXBhdCArIDEsCisJCQkJCSAgc2l6ZW9mKFRJRkZGaWVsZEFycmF5KSwgcmVhc29uKTsKKwl9IGVsc2UgeworCQl0aWYtPnRpZl9maWVsZHNjb21wYXQgPSAoVElGRkZpZWxkQXJyYXkgKikKKwkJCV9USUZGQ2hlY2tNYWxsb2ModGlmLCAxLCBzaXplb2YoVElGRkZpZWxkQXJyYXkpLAorCQkJCQkgcmVhc29uKTsKKwl9CisJaWYgKCF0aWYtPnRpZl9maWVsZHNjb21wYXQpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBmaWVsZHMgYXJyYXkiKTsKKwkJcmV0dXJuIC0xOworCX0KKwluZmllbGRzID0gdGlmLT50aWZfbmZpZWxkc2NvbXBhdCsrOworCisJdGlmLT50aWZfZmllbGRzY29tcGF0W25maWVsZHNdLnR5cGUgPSB0ZmlhdE90aGVyOworCXRpZi0+dGlmX2ZpZWxkc2NvbXBhdFtuZmllbGRzXS5hbGxvY2F0ZWRfc2l6ZSA9IG47CisJdGlmLT50aWZfZmllbGRzY29tcGF0W25maWVsZHNdLmNvdW50ID0gbjsKKwl0aWYtPnRpZl9maWVsZHNjb21wYXRbbmZpZWxkc10uZmllbGRzID0KKwkJKFRJRkZGaWVsZCAqKV9USUZGQ2hlY2tNYWxsb2ModGlmLCBuLCBzaXplb2YoVElGRkZpZWxkKSwKKwkJCQkJICAgICAgcmVhc29uKTsKKwlpZiAoIXRpZi0+dGlmX2ZpZWxkc2NvbXBhdFtuZmllbGRzXS5maWVsZHMpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBmaWVsZHMgYXJyYXkiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXRwID0gdGlmLT50aWZfZmllbGRzY29tcGF0W25maWVsZHNdLmZpZWxkczsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCXRwLT5maWVsZF90YWcgPSBpbmZvW2ldLmZpZWxkX3RhZzsKKwkJdHAtPmZpZWxkX3JlYWRjb3VudCA9IGluZm9baV0uZmllbGRfcmVhZGNvdW50OworCQl0cC0+ZmllbGRfd3JpdGVjb3VudCA9IGluZm9baV0uZmllbGRfd3JpdGVjb3VudDsKKwkJdHAtPmZpZWxkX3R5cGUgPSBpbmZvW2ldLmZpZWxkX3R5cGU7CisJCXRwLT5yZXNlcnZlZCA9IDA7CisJCXRwLT5zZXRfZmllbGRfdHlwZSA9CisJCSAgICAgX1RJRkZTZXRHZXRUeXBlKGluZm9baV0uZmllbGRfdHlwZSwKKwkJCQlpbmZvW2ldLmZpZWxkX3JlYWRjb3VudCwKKwkJCQlpbmZvW2ldLmZpZWxkX3Bhc3Njb3VudCk7CisJCXRwLT5nZXRfZmllbGRfdHlwZSA9CisJCSAgICAgX1RJRkZTZXRHZXRUeXBlKGluZm9baV0uZmllbGRfdHlwZSwKKwkJCQlpbmZvW2ldLmZpZWxkX3JlYWRjb3VudCwKKwkJCQlpbmZvW2ldLmZpZWxkX3Bhc3Njb3VudCk7CisJCXRwLT5maWVsZF9iaXQgPSBpbmZvW2ldLmZpZWxkX2JpdDsKKwkJdHAtPmZpZWxkX29rdG9jaGFuZ2UgPSBpbmZvW2ldLmZpZWxkX29rdG9jaGFuZ2U7CisJCXRwLT5maWVsZF9wYXNzY291bnQgPSBpbmZvW2ldLmZpZWxkX3Bhc3Njb3VudDsKKwkJdHAtPmZpZWxkX25hbWUgPSBpbmZvW2ldLmZpZWxkX25hbWU7CisJCXRwLT5maWVsZF9zdWJmaWVsZHMgPSBOVUxMOworCQl0cCsrOworCX0KKworCWlmICghX1RJRkZNZXJnZUZpZWxkcyh0aWYsIHRpZi0+dGlmX2ZpZWxkc2NvbXBhdFtuZmllbGRzXS5maWVsZHMsIG4pKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgICJTZXR0aW5nIHVwIGZpZWxkIGluZm8gZmFpbGVkIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogdmltOiBzZXQgdHM9OCBzdHM9OCBzdz04IG5vZXQ6ICovCisKKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBjCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogZmlsbC1jb2x1bW46IDc4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2RpcnJlYWQuYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2RpcnJlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGRjNjhiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZGlycmVhZC5jCkBAIC0wLDAgKzEsNTYxNCBAQAorLyogJElkOiB0aWZfZGlycmVhZC5jLHYgMS4xOTEgMjAxNS0wOS0wNSAyMDozMTo0MSBiZnJpZXNlbiBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWQorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRJRkYgTGlicmFyeS4KKyAqCisgKiBEaXJlY3RvcnkgUmVhZCBTdXBwb3J0IFJvdXRpbmVzLgorICovCisKKy8qIFN1Z2dlc3RlZCBwZW5kaW5nIGltcHJvdmVtZW50czoKKyAqIC0gYWRkIGEgZmllbGQgJ2lnbm9yZScgdG8gdGhlIFRJRkZEaXJFbnRyeSBzdHJ1Y3R1cmUsIHRvIGZsYWcgc3RhdHVzLAorICogICBlbGltaW5hdGluZyBjdXJyZW50IHVzZSBvZiB0aGUgSUdOT1JFIHZhbHVlLCBhbmQgdGhlcmVmb3JlIGVsaW1pbmF0aW5nCisgKiAgIGN1cnJlbnQgaXJyYXRpb25hbCBiZWhhdmlvdXIgb24gdGFncyB3aXRoIHRhZyBpZCBjb2RlIDAKKyAqIC0gYWRkIGEgZmllbGQgJ2ZpZWxkX2luZm8nIHRvIHRoZSBUSUZGRGlyRW50cnkgc3RydWN0dXJlLCBhbmQgc2V0IHRoYXQgd2l0aAorICogICB0aGUgcG9pbnRlciB0byB0aGUgYXBwcm9wcmlhdGUgVElGRkZpZWxkIHN0cnVjdHVyZSBlYXJseSBvbiBpbgorICogICBUSUZGUmVhZERpcmVjdG9yeSwgc28gYXMgdG8gZWxpbWluYXRlIGN1cnJlbnQgcG9zc2libHkgcmVwZXRpdGl2ZSBsb29rdXAuCisgKi8KKworI2luY2x1ZGUgInRpZmZpb3AuaCIKKworI2RlZmluZSBJR05PUkUgMCAgICAgICAgICAvKiB0YWcgcGxhY2Vob2xkZXIgdXNlZCBiZWxvdyAqLworI2RlZmluZSBGQUlMRURfRklJICAgICgodWludDMyKSAtMSkKKworI2lmZGVmIEhBVkVfSUVFRUZQCisjIGRlZmluZSBUSUZGQ3Z0SUVFRUZsb2F0VG9OYXRpdmUodGlmLCBuLCBmcCkKKyMgZGVmaW5lIFRJRkZDdnRJRUVFRG91YmxlVG9OYXRpdmUodGlmLCBuLCBkcCkKKyNlbHNlCitleHRlcm4gdm9pZCBUSUZGQ3Z0SUVFRUZsb2F0VG9OYXRpdmUoVElGRiosIHVpbnQzMiwgZmxvYXQqKTsKK2V4dGVybiB2b2lkIFRJRkZDdnRJRUVFRG91YmxlVG9OYXRpdmUoVElGRiosIHVpbnQzMiwgZG91YmxlKik7CisjZW5kaWYKKworZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIHsKKwlUSUZGUmVhZERpckVudHJ5RXJyT2sgPSAwLAorCVRJRkZSZWFkRGlyRW50cnlFcnJDb3VudCA9IDEsCisJVElGRlJlYWREaXJFbnRyeUVyclR5cGUgPSAyLAorCVRJRkZSZWFkRGlyRW50cnlFcnJJbyA9IDMsCisJVElGRlJlYWREaXJFbnRyeUVyclJhbmdlID0gNCwKKwlUSUZGUmVhZERpckVudHJ5RXJyUHNkaWYgPSA1LAorCVRJRkZSZWFkRGlyRW50cnlFcnJTaXplc2FuID0gNiwKKwlUSUZGUmVhZERpckVudHJ5RXJyQWxsb2MgPSA3LAorfTsKKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Qnl0ZShUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQ4KiB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlTaG9ydChUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQxNiogdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5TG9uZyhUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQzMiogdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5TG9uZzgoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCB1aW50NjQqIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUZsb2F0KFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgZmxvYXQqIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeURvdWJsZShUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIGRvdWJsZSogdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5SWZkOChUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQ2NCogdmFsdWUpOworCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlBcnJheShUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQzMiogY291bnQsIHVpbnQzMiBkZXN0dHlwZXNpemUsIHZvaWQqKiB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlCeXRlQXJyYXkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCB1aW50OCoqIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeVNieXRlQXJyYXkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBpbnQ4KiogdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5U2hvcnRBcnJheShUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQxNioqIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeVNzaG9ydEFycmF5KFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgaW50MTYqKiB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlMb25nQXJyYXkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCB1aW50MzIqKiB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlTbG9uZ0FycmF5KFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgaW50MzIqKiB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlMb25nOEFycmF5KFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgdWludDY0KiogdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5U2xvbmc4QXJyYXkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBpbnQ2NCoqIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUZsb2F0QXJyYXkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBmbG9hdCoqIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeURvdWJsZUFycmF5KFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgZG91YmxlKiogdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5SWZkOEFycmF5KFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgdWludDY0KiogdmFsdWUpOworCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlQZXJzYW1wbGVTaG9ydChUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQxNiogdmFsdWUpOworI2lmIDAKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeVBlcnNhbXBsZURvdWJsZShUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIGRvdWJsZSogdmFsdWUpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIFRJRkZSZWFkRGlyRW50cnlDaGVja2VkQnl0ZShUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQ4KiB2YWx1ZSk7CitzdGF0aWMgdm9pZCBUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNieXRlKFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgaW50OCogdmFsdWUpOworc3RhdGljIHZvaWQgVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTaG9ydChUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQxNiogdmFsdWUpOworc3RhdGljIHZvaWQgVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTc2hvcnQoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBpbnQxNiogdmFsdWUpOworc3RhdGljIHZvaWQgVElGRlJlYWREaXJFbnRyeUNoZWNrZWRMb25nKFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgdWludDMyKiB2YWx1ZSk7CitzdGF0aWMgdm9pZCBUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNsb25nKFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgaW50MzIqIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrZWRMb25nOChUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQ2NCogdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNsb25nOChUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIGludDY0KiB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja2VkUmF0aW9uYWwoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBkb3VibGUqIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTcmF0aW9uYWwoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBkb3VibGUqIHZhbHVlKTsKK3N0YXRpYyB2b2lkIFRJRkZSZWFkRGlyRW50cnlDaGVja2VkRmxvYXQoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBmbG9hdCogdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tlZERvdWJsZShUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIGRvdWJsZSogdmFsdWUpOworCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlQnl0ZVNieXRlKGludDggdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUJ5dGVTaG9ydCh1aW50MTYgdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUJ5dGVTc2hvcnQoaW50MTYgdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUJ5dGVMb25nKHVpbnQzMiB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlQnl0ZVNsb25nKGludDMyIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VCeXRlTG9uZzgodWludDY0IHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VCeXRlU2xvbmc4KGludDY0IHZhbHVlKTsKKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNieXRlQnl0ZSh1aW50OCB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2J5dGVTaG9ydCh1aW50MTYgdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNieXRlU3Nob3J0KGludDE2IHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTYnl0ZUxvbmcodWludDMyIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTYnl0ZVNsb25nKGludDMyIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTYnl0ZUxvbmc4KHVpbnQ2NCB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2J5dGVTbG9uZzgoaW50NjQgdmFsdWUpOworCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2hvcnRTYnl0ZShpbnQ4IHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTaG9ydFNzaG9ydChpbnQxNiB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2hvcnRMb25nKHVpbnQzMiB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2hvcnRTbG9uZyhpbnQzMiB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2hvcnRMb25nOCh1aW50NjQgdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNob3J0U2xvbmc4KGludDY0IHZhbHVlKTsKKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNzaG9ydFNob3J0KHVpbnQxNiB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU3Nob3J0TG9uZyh1aW50MzIgdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNzaG9ydFNsb25nKGludDMyIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTc2hvcnRMb25nOCh1aW50NjQgdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNzaG9ydFNsb25nOChpbnQ2NCB2YWx1ZSk7CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VMb25nU2J5dGUoaW50OCB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlTG9uZ1NzaG9ydChpbnQxNiB2YWx1ZSk7CitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlTG9uZ1Nsb25nKGludDMyIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VMb25nTG9uZzgodWludDY0IHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VMb25nU2xvbmc4KGludDY0IHZhbHVlKTsKKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNsb25nTG9uZyh1aW50MzIgdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNsb25nTG9uZzgodWludDY0IHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTbG9uZ1Nsb25nOChpbnQ2NCB2YWx1ZSk7CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VMb25nOFNieXRlKGludDggdmFsdWUpOworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmc4U3Nob3J0KGludDE2IHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VMb25nOFNsb25nKGludDMyIHZhbHVlKTsKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VMb25nOFNsb25nOChpbnQ2NCB2YWx1ZSk7CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTbG9uZzhMb25nOCh1aW50NjQgdmFsdWUpOworCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlEYXRhKFRJRkYqIHRpZiwgdWludDY0IG9mZnNldCwgdG1zaXplX3Qgc2l6ZSwgdm9pZCogZGVzdCk7CitzdGF0aWMgdm9pZCBUSUZGUmVhZERpckVudHJ5T3V0cHV0RXJyKFRJRkYqIHRpZiwgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIGVyciwgY29uc3QgY2hhciogbW9kdWxlLCBjb25zdCBjaGFyKiB0YWduYW1lLCBpbnQgcmVjb3Zlcik7CisKK3N0YXRpYyB2b2lkIFRJRkZSZWFkRGlyZWN0b3J5Q2hlY2tPcmRlcihUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgZGlyY291bnQpOworc3RhdGljIFRJRkZEaXJFbnRyeSogVElGRlJlYWREaXJlY3RvcnlGaW5kRW50cnkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IGRpcmNvdW50LCB1aW50MTYgdGFnaWQpOworc3RhdGljIHZvaWQgVElGRlJlYWREaXJlY3RvcnlGaW5kRmllbGRJbmZvKFRJRkYqIHRpZiwgdWludDE2IHRhZ2lkLCB1aW50MzIqIGZpaSk7CisKK3N0YXRpYyBpbnQgRXN0aW1hdGVTdHJpcEJ5dGVDb3VudHMoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IGRpcmNvdW50KTsKK3N0YXRpYyB2b2lkIE1pc3NpbmdSZXF1aXJlZChUSUZGKiwgY29uc3QgY2hhciopOworc3RhdGljIGludCBUSUZGQ2hlY2tEaXJPZmZzZXQoVElGRiogdGlmLCB1aW50NjQgZGlyb2ZmKTsKK3N0YXRpYyBpbnQgQ2hlY2tEaXJDb3VudChUSUZGKiwgVElGRkRpckVudHJ5KiwgdWludDMyKTsKK3N0YXRpYyB1aW50MTYgVElGRkZldGNoRGlyZWN0b3J5KFRJRkYqIHRpZiwgdWludDY0IGRpcm9mZiwgVElGRkRpckVudHJ5KiogcGRpciwgdWludDY0KiBuZXh0ZGlyb2ZmKTsKK3N0YXRpYyBpbnQgVElGRkZldGNoTm9ybWFsVGFnKFRJRkYqLCBUSUZGRGlyRW50cnkqLCBpbnQgcmVjb3Zlcik7CitzdGF0aWMgaW50IFRJRkZGZXRjaFN0cmlwVGhpbmcoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDMyIG5zdHJpcHMsIHVpbnQ2NCoqIGxwcCk7CitzdGF0aWMgaW50IFRJRkZGZXRjaFN1YmplY3REaXN0YW5jZShUSUZGKiwgVElGRkRpckVudHJ5Kik7CitzdGF0aWMgdm9pZCBDaG9wVXBTaW5nbGVVbmNvbXByZXNzZWRTdHJpcChUSUZGKik7CitzdGF0aWMgdWludDY0IFRJRkZSZWFkVUludDY0KGNvbnN0IHVpbnQ4ICp2YWx1ZSk7CisKK3R5cGVkZWYgdW5pb24gX1VJbnQ2NEFsaWduZWRfdAoreworICAgICAgICBkb3VibGUgZDsKKwl1aW50NjQgbDsKKwl1aW50MzIgaVsyXTsKKwl1aW50MTYgc1s0XTsKKwl1aW50OCAgY1s4XTsKK30gVUludDY0QWxpZ25lZF90OworCisvKgorICBVbmFsaWduZWQgc2FmZSBjb3B5IG9mIGEgdWludDY0IHZhbHVlIGZyb20gYW4gb2N0ZXQgYXJyYXkuCisqLworc3RhdGljIHVpbnQ2NCBUSUZGUmVhZFVJbnQ2NChjb25zdCB1aW50OCAqdmFsdWUpCit7CisJVUludDY0QWxpZ25lZF90IHJlc3VsdDsKKworCXJlc3VsdC5jWzBdPXZhbHVlWzBdOworCXJlc3VsdC5jWzFdPXZhbHVlWzFdOworCXJlc3VsdC5jWzJdPXZhbHVlWzJdOworCXJlc3VsdC5jWzNdPXZhbHVlWzNdOworCXJlc3VsdC5jWzRdPXZhbHVlWzRdOworCXJlc3VsdC5jWzVdPXZhbHVlWzVdOworCXJlc3VsdC5jWzZdPXZhbHVlWzZdOworCXJlc3VsdC5jWzddPXZhbHVlWzddOworCisJcmV0dXJuIHJlc3VsdC5sOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlCeXRlKFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgdWludDgqIHZhbHVlKQoreworCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJaWYgKGRpcmVudHJ5LT50ZGlyX2NvdW50IT0xKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyckNvdW50KTsKKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfQllURToKKwkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkQnl0ZSh0aWYsZGlyZW50cnksdmFsdWUpOworCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCWNhc2UgVElGRl9TQllURToKKwkJCXsKKwkJCQlpbnQ4IG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTYnl0ZSh0aWYsZGlyZW50cnksJm0pOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUJ5dGVTYnl0ZShtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCSp2YWx1ZT0odWludDgpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX1NIT1JUOgorCQkJeworCQkJCXVpbnQxNiBtOworCQkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkU2hvcnQodGlmLGRpcmVudHJ5LCZtKTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VCeXRlU2hvcnQobSk7CisJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQlyZXR1cm4oZXJyKTsKKwkJCQkqdmFsdWU9KHVpbnQ4KW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9TU0hPUlQ6CisJCQl7CisJCQkJaW50MTYgbTsKKwkJCQlUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNzaG9ydCh0aWYsZGlyZW50cnksJm0pOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUJ5dGVTc2hvcnQobSk7CisJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQlyZXR1cm4oZXJyKTsKKwkJCQkqdmFsdWU9KHVpbnQ4KW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9MT05HOgorCQkJeworCQkJCXVpbnQzMiBtOworCQkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkTG9uZyh0aWYsZGlyZW50cnksJm0pOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUJ5dGVMb25nKG0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJKnZhbHVlPSh1aW50OCltOworCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQljYXNlIFRJRkZfU0xPTkc6CisJCQl7CisJCQkJaW50MzIgbTsKKwkJCQlUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNsb25nKHRpZixkaXJlbnRyeSwmbSk7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlQnl0ZVNsb25nKG0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJKnZhbHVlPSh1aW50OCltOworCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQljYXNlIFRJRkZfTE9ORzg6CisJCQl7CisJCQkJdWludDY0IG07CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja2VkTG9uZzgodGlmLGRpcmVudHJ5LCZtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUJ5dGVMb25nOChtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCSp2YWx1ZT0odWludDgpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX1NMT05HODoKKwkJCXsKKwkJCQlpbnQ2NCBtOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tlZFNsb25nOCh0aWYsZGlyZW50cnksJm0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlQnl0ZVNsb25nOChtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCSp2YWx1ZT0odWludDgpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJZGVmYXVsdDoKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyVHlwZSk7CisJfQorfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlTaG9ydChUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQxNiogdmFsdWUpCit7CisJZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIGVycjsKKwlpZiAoZGlyZW50cnktPnRkaXJfY291bnQhPTEpCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyQ291bnQpOworCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9CWVRFOgorCQkJeworCQkJCXVpbnQ4IG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRCeXRlKHRpZixkaXJlbnRyeSwmbSk7CisJCQkJKnZhbHVlPSh1aW50MTYpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX1NCWVRFOgorCQkJeworCQkJCWludDggbTsKKwkJCQlUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNieXRlKHRpZixkaXJlbnRyeSwmbSk7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2hvcnRTYnl0ZShtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCSp2YWx1ZT0odWludDE2KW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9TSE9SVDoKKwkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkU2hvcnQodGlmLGRpcmVudHJ5LHZhbHVlKTsKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQljYXNlIFRJRkZfU1NIT1JUOgorCQkJeworCQkJCWludDE2IG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTc2hvcnQodGlmLGRpcmVudHJ5LCZtKTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTaG9ydFNzaG9ydChtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCSp2YWx1ZT0odWludDE2KW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9MT05HOgorCQkJeworCQkJCXVpbnQzMiBtOworCQkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkTG9uZyh0aWYsZGlyZW50cnksJm0pOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNob3J0TG9uZyhtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCSp2YWx1ZT0odWludDE2KW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9TTE9ORzoKKwkJCXsKKwkJCQlpbnQzMiBtOworCQkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkU2xvbmcodGlmLGRpcmVudHJ5LCZtKTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTaG9ydFNsb25nKG0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJKnZhbHVlPSh1aW50MTYpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX0xPTkc4OgorCQkJeworCQkJCXVpbnQ2NCBtOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tlZExvbmc4KHRpZixkaXJlbnRyeSwmbSk7CisJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQlyZXR1cm4oZXJyKTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTaG9ydExvbmc4KG0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJKnZhbHVlPSh1aW50MTYpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX1NMT05HODoKKwkJCXsKKwkJCQlpbnQ2NCBtOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tlZFNsb25nOCh0aWYsZGlyZW50cnksJm0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2hvcnRTbG9uZzgobSk7CisJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQlyZXR1cm4oZXJyKTsKKwkJCQkqdmFsdWU9KHVpbnQxNiltOworCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQlkZWZhdWx0OgorCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJUeXBlKTsKKwl9Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUxvbmcoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCB1aW50MzIqIHZhbHVlKQoreworCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJaWYgKGRpcmVudHJ5LT50ZGlyX2NvdW50IT0xKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyckNvdW50KTsKKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfQllURToKKwkJCXsKKwkJCQl1aW50OCBtOworCQkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkQnl0ZSh0aWYsZGlyZW50cnksJm0pOworCQkJCSp2YWx1ZT0odWludDMyKW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9TQllURToKKwkJCXsKKwkJCQlpbnQ4IG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTYnl0ZSh0aWYsZGlyZW50cnksJm0pOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmdTYnl0ZShtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCSp2YWx1ZT0odWludDMyKW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9TSE9SVDoKKwkJCXsKKwkJCQl1aW50MTYgbTsKKwkJCQlUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNob3J0KHRpZixkaXJlbnRyeSwmbSk7CisJCQkJKnZhbHVlPSh1aW50MzIpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX1NTSE9SVDoKKwkJCXsKKwkJCQlpbnQxNiBtOworCQkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkU3Nob3J0KHRpZixkaXJlbnRyeSwmbSk7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlTG9uZ1NzaG9ydChtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCSp2YWx1ZT0odWludDMyKW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9MT05HOgorCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRMb25nKHRpZixkaXJlbnRyeSx2YWx1ZSk7CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJY2FzZSBUSUZGX1NMT05HOgorCQkJeworCQkJCWludDMyIG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTbG9uZyh0aWYsZGlyZW50cnksJm0pOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmdTbG9uZyhtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCSp2YWx1ZT0odWludDMyKW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9MT05HODoKKwkJCXsKKwkJCQl1aW50NjQgbTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrZWRMb25nOCh0aWYsZGlyZW50cnksJm0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlTG9uZ0xvbmc4KG0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJKnZhbHVlPSh1aW50MzIpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX1NMT05HODoKKwkJCXsKKwkJCQlpbnQ2NCBtOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tlZFNsb25nOCh0aWYsZGlyZW50cnksJm0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlTG9uZ1Nsb25nOChtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCSp2YWx1ZT0odWludDMyKW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclR5cGUpOworCX0KK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5TG9uZzgoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCB1aW50NjQqIHZhbHVlKQoreworCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJaWYgKGRpcmVudHJ5LT50ZGlyX2NvdW50IT0xKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyckNvdW50KTsKKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfQllURToKKwkJCXsKKwkJCQl1aW50OCBtOworCQkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkQnl0ZSh0aWYsZGlyZW50cnksJm0pOworCQkJCSp2YWx1ZT0odWludDY0KW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9TQllURToKKwkJCXsKKwkJCQlpbnQ4IG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTYnl0ZSh0aWYsZGlyZW50cnksJm0pOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmc4U2J5dGUobSk7CisJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQlyZXR1cm4oZXJyKTsKKwkJCQkqdmFsdWU9KHVpbnQ2NCltOworCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQljYXNlIFRJRkZfU0hPUlQ6CisJCQl7CisJCQkJdWludDE2IG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTaG9ydCh0aWYsZGlyZW50cnksJm0pOworCQkJCSp2YWx1ZT0odWludDY0KW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9TU0hPUlQ6CisJCQl7CisJCQkJaW50MTYgbTsKKwkJCQlUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNzaG9ydCh0aWYsZGlyZW50cnksJm0pOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmc4U3Nob3J0KG0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJKnZhbHVlPSh1aW50NjQpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX0xPTkc6CisJCQl7CisJCQkJdWludDMyIG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRMb25nKHRpZixkaXJlbnRyeSwmbSk7CisJCQkJKnZhbHVlPSh1aW50NjQpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX1NMT05HOgorCQkJeworCQkJCWludDMyIG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTbG9uZyh0aWYsZGlyZW50cnksJm0pOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmc4U2xvbmcobSk7CisJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQlyZXR1cm4oZXJyKTsKKwkJCQkqdmFsdWU9KHVpbnQ2NCltOworCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQljYXNlIFRJRkZfTE9ORzg6CisJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrZWRMb25nOCh0aWYsZGlyZW50cnksdmFsdWUpOworCQkJcmV0dXJuKGVycik7CisJCWNhc2UgVElGRl9TTE9ORzg6CisJCQl7CisJCQkJaW50NjQgbTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrZWRTbG9uZzgodGlmLGRpcmVudHJ5LCZtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmc4U2xvbmc4KG0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJKnZhbHVlPSh1aW50NjQpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJZGVmYXVsdDoKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyVHlwZSk7CisJfQorfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlGbG9hdChUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIGZsb2F0KiB2YWx1ZSkKK3sKKwllbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgZXJyOworCWlmIChkaXJlbnRyeS0+dGRpcl9jb3VudCE9MSkKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJDb3VudCk7CisJc3dpdGNoIChkaXJlbnRyeS0+dGRpcl90eXBlKQorCXsKKwkJY2FzZSBUSUZGX0JZVEU6CisJCQl7CisJCQkJdWludDggbTsKKwkJCQlUSUZGUmVhZERpckVudHJ5Q2hlY2tlZEJ5dGUodGlmLGRpcmVudHJ5LCZtKTsKKwkJCQkqdmFsdWU9KGZsb2F0KW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9TQllURToKKwkJCXsKKwkJCQlpbnQ4IG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTYnl0ZSh0aWYsZGlyZW50cnksJm0pOworCQkJCSp2YWx1ZT0oZmxvYXQpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX1NIT1JUOgorCQkJeworCQkJCXVpbnQxNiBtOworCQkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkU2hvcnQodGlmLGRpcmVudHJ5LCZtKTsKKwkJCQkqdmFsdWU9KGZsb2F0KW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9TU0hPUlQ6CisJCQl7CisJCQkJaW50MTYgbTsKKwkJCQlUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNzaG9ydCh0aWYsZGlyZW50cnksJm0pOworCQkJCSp2YWx1ZT0oZmxvYXQpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX0xPTkc6CisJCQl7CisJCQkJdWludDMyIG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRMb25nKHRpZixkaXJlbnRyeSwmbSk7CisJCQkJKnZhbHVlPShmbG9hdCltOworCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQljYXNlIFRJRkZfU0xPTkc6CisJCQl7CisJCQkJaW50MzIgbTsKKwkJCQlUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNsb25nKHRpZixkaXJlbnRyeSwmbSk7CisJCQkJKnZhbHVlPShmbG9hdCltOworCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQljYXNlIFRJRkZfTE9ORzg6CisJCQl7CisJCQkJdWludDY0IG07CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja2VkTG9uZzgodGlmLGRpcmVudHJ5LCZtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworI2lmIGRlZmluZWQoX19XSU4zMl9fKSAmJiAoX01TQ19WRVIgPCAxNTAwKQorCQkJCS8qCisJCQkJICogWFhYOiBNU1ZDIDYuMCBkb2VzIG5vdCBzdXBwb3J0IGNvbnZlcnNpb24KKwkJCQkgKiBvZiA2NC1iaXQgaW50ZWdlcnMgaW50byBmbG9hdGluZyBwb2ludAorCQkJCSAqIHZhbHVlcy4KKwkJCQkgKi8KKwkJCQkqdmFsdWUgPSBfVElGRlVJbnQ2NFRvRmxvYXQobSk7CisjZWxzZQorCQkJCSp2YWx1ZT0oZmxvYXQpbTsKKyNlbmRpZgorCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJeworCQkJCWludDY0IG07CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja2VkU2xvbmc4KHRpZixkaXJlbnRyeSwmbSk7CisJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQlyZXR1cm4oZXJyKTsKKwkJCQkqdmFsdWU9KGZsb2F0KW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9SQVRJT05BTDoKKwkJCXsKKwkJCQlkb3VibGUgbTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrZWRSYXRpb25hbCh0aWYsZGlyZW50cnksJm0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJKnZhbHVlPShmbG9hdCltOworCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQljYXNlIFRJRkZfU1JBVElPTkFMOgorCQkJeworCQkJCWRvdWJsZSBtOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tlZFNyYXRpb25hbCh0aWYsZGlyZW50cnksJm0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisJCQkJKnZhbHVlPShmbG9hdCltOworCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQljYXNlIFRJRkZfRkxPQVQ6CisJCQlUSUZGUmVhZERpckVudHJ5Q2hlY2tlZEZsb2F0KHRpZixkaXJlbnRyeSx2YWx1ZSk7CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJY2FzZSBUSUZGX0RPVUJMRToKKwkJCXsKKwkJCQlkb3VibGUgbTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrZWREb3VibGUodGlmLGRpcmVudHJ5LCZtKTsKKwkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXJldHVybihlcnIpOworCQkJCSp2YWx1ZT0oZmxvYXQpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJZGVmYXVsdDoKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyVHlwZSk7CisJfQorfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlEb3VibGUoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBkb3VibGUqIHZhbHVlKQoreworCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJaWYgKGRpcmVudHJ5LT50ZGlyX2NvdW50IT0xKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyckNvdW50KTsKKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfQllURToKKwkJCXsKKwkJCQl1aW50OCBtOworCQkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkQnl0ZSh0aWYsZGlyZW50cnksJm0pOworCQkJCSp2YWx1ZT0oZG91YmxlKW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9TQllURToKKwkJCXsKKwkJCQlpbnQ4IG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTYnl0ZSh0aWYsZGlyZW50cnksJm0pOworCQkJCSp2YWx1ZT0oZG91YmxlKW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9TSE9SVDoKKwkJCXsKKwkJCQl1aW50MTYgbTsKKwkJCQlUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNob3J0KHRpZixkaXJlbnRyeSwmbSk7CisJCQkJKnZhbHVlPShkb3VibGUpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX1NTSE9SVDoKKwkJCXsKKwkJCQlpbnQxNiBtOworCQkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkU3Nob3J0KHRpZixkaXJlbnRyeSwmbSk7CisJCQkJKnZhbHVlPShkb3VibGUpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX0xPTkc6CisJCQl7CisJCQkJdWludDMyIG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRMb25nKHRpZixkaXJlbnRyeSwmbSk7CisJCQkJKnZhbHVlPShkb3VibGUpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX1NMT05HOgorCQkJeworCQkJCWludDMyIG07CisJCQkJVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTbG9uZyh0aWYsZGlyZW50cnksJm0pOworCQkJCSp2YWx1ZT0oZG91YmxlKW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9MT05HODoKKwkJCXsKKwkJCQl1aW50NjQgbTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrZWRMb25nOCh0aWYsZGlyZW50cnksJm0pOworCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJcmV0dXJuKGVycik7CisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChfTVNDX1ZFUiA8IDE1MDApCisJCQkJLyoKKwkJCQkgKiBYWFg6IE1TVkMgNi4wIGRvZXMgbm90IHN1cHBvcnQgY29udmVyc2lvbgorCQkJCSAqIG9mIDY0LWJpdCBpbnRlZ2VycyBpbnRvIGZsb2F0aW5nIHBvaW50CisJCQkJICogdmFsdWVzLgorCQkJCSAqLworCQkJCSp2YWx1ZSA9IF9USUZGVUludDY0VG9Eb3VibGUobSk7CisjZWxzZQorCQkJCSp2YWx1ZSA9IChkb3VibGUpbTsKKyNlbmRpZgorCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJeworCQkJCWludDY0IG07CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja2VkU2xvbmc4KHRpZixkaXJlbnRyeSwmbSk7CisJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQlyZXR1cm4oZXJyKTsKKwkJCQkqdmFsdWU9KGRvdWJsZSltOworCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQljYXNlIFRJRkZfUkFUSU9OQUw6CisJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrZWRSYXRpb25hbCh0aWYsZGlyZW50cnksdmFsdWUpOworCQkJcmV0dXJuKGVycik7CisJCWNhc2UgVElGRl9TUkFUSU9OQUw6CisJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrZWRTcmF0aW9uYWwodGlmLGRpcmVudHJ5LHZhbHVlKTsKKwkJCXJldHVybihlcnIpOworCQljYXNlIFRJRkZfRkxPQVQ6CisJCQl7CisJCQkJZmxvYXQgbTsKKwkJCQlUSUZGUmVhZERpckVudHJ5Q2hlY2tlZEZsb2F0KHRpZixkaXJlbnRyeSwmbSk7CisJCQkJKnZhbHVlPShkb3VibGUpbTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX0RPVUJMRToKKwkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tlZERvdWJsZSh0aWYsZGlyZW50cnksdmFsdWUpOworCQkJcmV0dXJuKGVycik7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclR5cGUpOworCX0KK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5SWZkOChUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQ2NCogdmFsdWUpCit7CisJZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIGVycjsKKwlpZiAoZGlyZW50cnktPnRkaXJfY291bnQhPTEpCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyQ291bnQpOworCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9MT05HOgorCQljYXNlIFRJRkZfSUZEOgorCQkJeworCQkJCXVpbnQzMiBtOworCQkJCVRJRkZSZWFkRGlyRW50cnlDaGVja2VkTG9uZyh0aWYsZGlyZW50cnksJm0pOworCQkJCSp2YWx1ZT0odWludDY0KW07CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9MT05HODoKKwkJY2FzZSBUSUZGX0lGRDg6CisJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrZWRMb25nOCh0aWYsZGlyZW50cnksdmFsdWUpOworCQkJcmV0dXJuKGVycik7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclR5cGUpOworCX0KK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5QXJyYXkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCB1aW50MzIqIGNvdW50LCB1aW50MzIgZGVzdHR5cGVzaXplLCB2b2lkKiogdmFsdWUpCit7CisJaW50IHR5cGVzaXplOworCXVpbnQzMiBkYXRhc2l6ZTsKKwl2b2lkKiBkYXRhOworCXR5cGVzaXplPVRJRkZEYXRhV2lkdGgoZGlyZW50cnktPnRkaXJfdHlwZSk7CisJaWYgKChkaXJlbnRyeS0+dGRpcl9jb3VudD09MCl8fCh0eXBlc2l6ZT09MCkpCisJeworCQkqdmFsdWU9MDsKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJfQorICAgICAgICAodm9pZCkgZGVzdHR5cGVzaXplOworCisgICAgICAgIC8qIAorICAgICAgICAgKiBBcyBhIHNhbml0eSBjaGVjaywgbWFrZSBzdXJlIHdlIGhhdmUgbm8gbW9yZSB0aGFuIGEgMkdCIHRhZyBhcnJheSAKKyAgICAgICAgICogaW4gZWl0aGVyIHRoZSBjdXJyZW50IGRhdGEgdHlwZSBvciB0aGUgZGVzdCBkYXRhIHR5cGUuICBUaGlzIGFsc28KKyAgICAgICAgICogYXZvaWRzIHByb2JsZW1zIHdpdGggb3ZlcmZsb3cgb2YgdG1zaXplX3Qgb24gMzJiaXQgc3lzdGVtcy4KKyAgICAgICAgICovCisJaWYgKCh1aW50NjQpKDIxNDc0ODM2NDcvdHlwZXNpemUpPGRpcmVudHJ5LT50ZGlyX2NvdW50KQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclNpemVzYW4pOworCWlmICgodWludDY0KSgyMTQ3NDgzNjQ3L2Rlc3R0eXBlc2l6ZSk8ZGlyZW50cnktPnRkaXJfY291bnQpCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyU2l6ZXNhbik7CisKKwkqY291bnQ9KHVpbnQzMilkaXJlbnRyeS0+dGRpcl9jb3VudDsKKwlkYXRhc2l6ZT0oKmNvdW50KSp0eXBlc2l6ZTsKKwlhc3NlcnQoKHRtc2l6ZV90KWRhdGFzaXplPjApOworCWRhdGE9X1RJRkZDaGVja01hbGxvYyh0aWYsICpjb3VudCwgdHlwZXNpemUsICJSZWFkRGlyRW50cnlBcnJheSIpOworCWlmIChkYXRhPT0wKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyckFsbG9jKTsKKwlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCXsKKwkJaWYgKGRhdGFzaXplPD00KQorCQkJX1RJRkZtZW1jcHkoZGF0YSwmZGlyZW50cnktPnRkaXJfb2Zmc2V0LGRhdGFzaXplKTsKKwkJZWxzZQorCQl7CisJCQllbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgZXJyOworCQkJdWludDMyIG9mZnNldCA9IGRpcmVudHJ5LT50ZGlyX29mZnNldC50b2ZmX2xvbmc7CisJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiTG9uZygmb2Zmc2V0KTsKKwkJCWVycj1USUZGUmVhZERpckVudHJ5RGF0YSh0aWYsKHVpbnQ2NClvZmZzZXQsKHRtc2l6ZV90KWRhdGFzaXplLGRhdGEpOworCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJeworCQkJCV9USUZGZnJlZShkYXRhKTsKKwkJCQlyZXR1cm4oZXJyKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlpZiAoZGF0YXNpemU8PTgpCisJCQlfVElGRm1lbWNweShkYXRhLCZkaXJlbnRyeS0+dGRpcl9vZmZzZXQsZGF0YXNpemUpOworCQllbHNlCisJCXsKKwkJCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJCQl1aW50NjQgb2Zmc2V0ID0gZGlyZW50cnktPnRkaXJfb2Zmc2V0LnRvZmZfbG9uZzg7CisJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiTG9uZzgoJm9mZnNldCk7CisJCQllcnI9VElGRlJlYWREaXJFbnRyeURhdGEodGlmLG9mZnNldCwodG1zaXplX3QpZGF0YXNpemUsZGF0YSk7CisJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQl7CisJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCXJldHVybihlcnIpOworCQkJfQorCQl9CisJfQorCSp2YWx1ZT1kYXRhOworCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlCeXRlQXJyYXkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCB1aW50OCoqIHZhbHVlKQoreworCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJdWludDMyIGNvdW50OworCXZvaWQqIG9yaWdkYXRhOworCXVpbnQ4KiBkYXRhOworCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9BU0NJSToKKwkJY2FzZSBUSUZGX1VOREVGSU5FRDoKKwkJY2FzZSBUSUZGX0JZVEU6CisJCWNhc2UgVElGRl9TQllURToKKwkJY2FzZSBUSUZGX1NIT1JUOgorCQljYXNlIFRJRkZfU1NIT1JUOgorCQljYXNlIFRJRkZfTE9ORzoKKwkJY2FzZSBUSUZGX1NMT05HOgorCQljYXNlIFRJRkZfTE9ORzg6CisJCWNhc2UgVElGRl9TTE9ORzg6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyVHlwZSk7CisJfQorCWVycj1USUZGUmVhZERpckVudHJ5QXJyYXkodGlmLGRpcmVudHJ5LCZjb3VudCwxLCZvcmlnZGF0YSk7CisJaWYgKChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPayl8fChvcmlnZGF0YT09MCkpCisJeworCQkqdmFsdWU9MDsKKwkJcmV0dXJuKGVycik7CisJfQorCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9BU0NJSToKKwkJY2FzZSBUSUZGX1VOREVGSU5FRDoKKwkJY2FzZSBUSUZGX0JZVEU6CisJCQkqdmFsdWU9KHVpbnQ4KilvcmlnZGF0YTsKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQljYXNlIFRJRkZfU0JZVEU6CisJCQl7CisJCQkJaW50OCogbTsKKwkJCQl1aW50MzIgbjsKKwkJCQltPShpbnQ4KilvcmlnZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlQnl0ZVNieXRlKCptKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQl7CisJCQkJCQlfVElGRmZyZWUob3JpZ2RhdGEpOworCQkJCQkJcmV0dXJuKGVycik7CisJCQkJCX0KKwkJCQkJbSsrOworCQkJCX0KKwkJCQkqdmFsdWU9KHVpbnQ4KilvcmlnZGF0YTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwl9CisJZGF0YT0odWludDgqKV9USUZGbWFsbG9jKGNvdW50KTsKKwlpZiAoZGF0YT09MCkKKwl7CisJCV9USUZGZnJlZShvcmlnZGF0YSk7CisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyQWxsb2MpOworCX0KKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfU0hPUlQ6CisJCQl7CisJCQkJdWludDE2KiBtYTsKKwkJCQl1aW50OCogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQxNiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiU2hvcnQobWEpOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VCeXRlU2hvcnQoKm1hKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQkJYnJlYWs7CisJCQkJCSptYisrPSh1aW50OCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU1NIT1JUOgorCQkJeworCQkJCWludDE2KiBtYTsKKwkJCQl1aW50OCogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KGludDE2KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJTaG9ydCgodWludDE2KiltYSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUJ5dGVTc2hvcnQoKm1hKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQkJYnJlYWs7CisJCQkJCSptYisrPSh1aW50OCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfTE9ORzoKKwkJCXsKKwkJCQl1aW50MzIqIG1hOworCQkJCXVpbnQ4KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDMyKilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nKG1hKTsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlQnl0ZUxvbmcoKm1hKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQkJYnJlYWs7CisJCQkJCSptYisrPSh1aW50OCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0xPTkc6CisJCQl7CisJCQkJaW50MzIqIG1hOworCQkJCXVpbnQ4KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0oaW50MzIqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQl7CisJCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCQlUSUZGU3dhYkxvbmcoKHVpbnQzMiopbWEpOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VCeXRlU2xvbmcoKm1hKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQkJYnJlYWs7CisJCQkJCSptYisrPSh1aW50OCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfTE9ORzg6CisJCQl7CisJCQkJdWludDY0KiBtYTsKKwkJCQl1aW50OCogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQ2NCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZzgobWEpOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VCeXRlTG9uZzgoKm1hKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQkJYnJlYWs7CisJCQkJCSptYisrPSh1aW50OCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJeworCQkJCWludDY0KiBtYTsKKwkJCQl1aW50OCogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KGludDY0KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nOCgodWludDY0KiltYSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUJ5dGVTbG9uZzgoKm1hKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQkJYnJlYWs7CisJCQkJCSptYisrPSh1aW50OCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCX0KKwlfVElGRmZyZWUob3JpZ2RhdGEpOworCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwl7CisJCV9USUZGZnJlZShkYXRhKTsKKwkJcmV0dXJuKGVycik7CisJfQorCSp2YWx1ZT1kYXRhOworCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlTYnl0ZUFycmF5KFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgaW50OCoqIHZhbHVlKQoreworCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJdWludDMyIGNvdW50OworCXZvaWQqIG9yaWdkYXRhOworCWludDgqIGRhdGE7CisJc3dpdGNoIChkaXJlbnRyeS0+dGRpcl90eXBlKQorCXsKKwkJY2FzZSBUSUZGX1VOREVGSU5FRDoKKwkJY2FzZSBUSUZGX0JZVEU6CisJCWNhc2UgVElGRl9TQllURToKKwkJY2FzZSBUSUZGX1NIT1JUOgorCQljYXNlIFRJRkZfU1NIT1JUOgorCQljYXNlIFRJRkZfTE9ORzoKKwkJY2FzZSBUSUZGX1NMT05HOgorCQljYXNlIFRJRkZfTE9ORzg6CisJCWNhc2UgVElGRl9TTE9ORzg6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyVHlwZSk7CisJfQorCWVycj1USUZGUmVhZERpckVudHJ5QXJyYXkodGlmLGRpcmVudHJ5LCZjb3VudCwxLCZvcmlnZGF0YSk7CisJaWYgKChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPayl8fChvcmlnZGF0YT09MCkpCisJeworCQkqdmFsdWU9MDsKKwkJcmV0dXJuKGVycik7CisJfQorCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9VTkRFRklORUQ6CisJCWNhc2UgVElGRl9CWVRFOgorCQkJeworCQkJCXVpbnQ4KiBtOworCQkJCXVpbnQzMiBuOworCQkJCW09KHVpbnQ4KilvcmlnZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2J5dGVCeXRlKCptKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQl7CisJCQkJCQlfVElGRmZyZWUob3JpZ2RhdGEpOworCQkJCQkJcmV0dXJuKGVycik7CisJCQkJCX0KKwkJCQkJbSsrOworCQkJCX0KKwkJCQkqdmFsdWU9KGludDgqKW9yaWdkYXRhOworCQkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQkJfQorCQljYXNlIFRJRkZfU0JZVEU6CisJCQkqdmFsdWU9KGludDgqKW9yaWdkYXRhOworCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJfQorCWRhdGE9KGludDgqKV9USUZGbWFsbG9jKGNvdW50KTsKKwlpZiAoZGF0YT09MCkKKwl7CisJCV9USUZGZnJlZShvcmlnZGF0YSk7CisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyQWxsb2MpOworCX0KKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfU0hPUlQ6CisJCQl7CisJCQkJdWludDE2KiBtYTsKKwkJCQlpbnQ4KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDE2KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJTaG9ydChtYSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNieXRlU2hvcnQoKm1hKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQkJYnJlYWs7CisJCQkJCSptYisrPShpbnQ4KSgqbWErKyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TU0hPUlQ6CisJCQl7CisJCQkJaW50MTYqIG1hOworCQkJCWludDgqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQxNiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiU2hvcnQoKHVpbnQxNiopbWEpOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTYnl0ZVNzaG9ydCgqbWEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCQlicmVhazsKKwkJCQkJKm1iKys9KGludDgpKCptYSsrKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX0xPTkc6CisJCQl7CisJCQkJdWludDMyKiBtYTsKKwkJCQlpbnQ4KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDMyKilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nKG1hKTsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2J5dGVMb25nKCptYSk7CisJCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJCWJyZWFrOworCQkJCQkqbWIrKz0oaW50OCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0xPTkc6CisJCQl7CisJCQkJaW50MzIqIG1hOworCQkJCWludDgqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQzMiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZygodWludDMyKiltYSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNieXRlU2xvbmcoKm1hKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQkJYnJlYWs7CisJCQkJCSptYisrPShpbnQ4KSgqbWErKyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9MT05HODoKKwkJCXsKKwkJCQl1aW50NjQqIG1hOworCQkJCWludDgqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPSh1aW50NjQqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQl7CisJCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCQlUSUZGU3dhYkxvbmc4KG1hKTsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2J5dGVMb25nOCgqbWEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCQlicmVhazsKKwkJCQkJKm1iKys9KGludDgpKCptYSsrKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NMT05HODoKKwkJCXsKKwkJCQlpbnQ2NCogbWE7CisJCQkJaW50OCogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KGludDY0KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nOCgodWludDY0KiltYSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNieXRlU2xvbmc4KCptYSk7CisJCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJCWJyZWFrOworCQkJCQkqbWIrKz0oaW50OCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCX0KKwlfVElGRmZyZWUob3JpZ2RhdGEpOworCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwl7CisJCV9USUZGZnJlZShkYXRhKTsKKwkJcmV0dXJuKGVycik7CisJfQorCSp2YWx1ZT1kYXRhOworCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlTaG9ydEFycmF5KFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgdWludDE2KiogdmFsdWUpCit7CisJZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIGVycjsKKwl1aW50MzIgY291bnQ7CisJdm9pZCogb3JpZ2RhdGE7CisJdWludDE2KiBkYXRhOworCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9CWVRFOgorCQljYXNlIFRJRkZfU0JZVEU6CisJCWNhc2UgVElGRl9TSE9SVDoKKwkJY2FzZSBUSUZGX1NTSE9SVDoKKwkJY2FzZSBUSUZGX0xPTkc6CisJCWNhc2UgVElGRl9TTE9ORzoKKwkJY2FzZSBUSUZGX0xPTkc4OgorCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclR5cGUpOworCX0KKwllcnI9VElGRlJlYWREaXJFbnRyeUFycmF5KHRpZixkaXJlbnRyeSwmY291bnQsMiwmb3JpZ2RhdGEpOworCWlmICgoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spfHwob3JpZ2RhdGE9PTApKQorCXsKKwkJKnZhbHVlPTA7CisJCXJldHVybihlcnIpOworCX0KKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfU0hPUlQ6CisJCQkqdmFsdWU9KHVpbnQxNiopb3JpZ2RhdGE7CisJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiQXJyYXlPZlNob3J0KCp2YWx1ZSxjb3VudCk7ICAKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQljYXNlIFRJRkZfU1NIT1JUOgorCQkJeworCQkJCWludDE2KiBtOworCQkJCXVpbnQzMiBuOworCQkJCW09KGludDE2KilvcmlnZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiU2hvcnQoKHVpbnQxNiopbSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNob3J0U3Nob3J0KCptKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQl7CisJCQkJCQlfVElGRmZyZWUob3JpZ2RhdGEpOworCQkJCQkJcmV0dXJuKGVycik7CisJCQkJCX0KKwkJCQkJbSsrOworCQkJCX0KKwkJCQkqdmFsdWU9KHVpbnQxNiopb3JpZ2RhdGE7CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJfQorCWRhdGE9KHVpbnQxNiopX1RJRkZtYWxsb2MoY291bnQqMik7CisJaWYgKGRhdGE9PTApCisJeworCQlfVElGRmZyZWUob3JpZ2RhdGEpOworCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyckFsbG9jKTsKKwl9CisJc3dpdGNoIChkaXJlbnRyeS0+dGRpcl90eXBlKQorCXsKKwkJY2FzZSBUSUZGX0JZVEU6CisJCQl7CisJCQkJdWludDgqIG1hOworCQkJCXVpbnQxNiogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQ4KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJCSptYisrPSh1aW50MTYpKCptYSsrKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0JZVEU6CisJCQl7CisJCQkJaW50OCogbWE7CisJCQkJdWludDE2KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0oaW50OCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2hvcnRTYnl0ZSgqbWEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCQlicmVhazsKKwkJCQkJKm1iKys9KHVpbnQxNikoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfTE9ORzoKKwkJCXsKKwkJCQl1aW50MzIqIG1hOworCQkJCXVpbnQxNiogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQzMiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZyhtYSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNob3J0TG9uZygqbWEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCQlicmVhazsKKwkJCQkJKm1iKys9KHVpbnQxNikoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0xPTkc6CisJCQl7CisJCQkJaW50MzIqIG1hOworCQkJCXVpbnQxNiogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KGludDMyKilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nKCh1aW50MzIqKW1hKTsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2hvcnRTbG9uZygqbWEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCQlicmVhazsKKwkJCQkJKm1iKys9KHVpbnQxNikoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfTE9ORzg6CisJCQl7CisJCQkJdWludDY0KiBtYTsKKwkJCQl1aW50MTYqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPSh1aW50NjQqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQl7CisJCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCQlUSUZGU3dhYkxvbmc4KG1hKTsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2hvcnRMb25nOCgqbWEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCQlicmVhazsKKwkJCQkJKm1iKys9KHVpbnQxNikoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJeworCQkJCWludDY0KiBtYTsKKwkJCQl1aW50MTYqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQ2NCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZzgoKHVpbnQ2NCopbWEpOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTaG9ydFNsb25nOCgqbWEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCQlicmVhazsKKwkJCQkJKm1iKys9KHVpbnQxNikoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCX0KKwlfVElGRmZyZWUob3JpZ2RhdGEpOworCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwl7CisJCV9USUZGZnJlZShkYXRhKTsKKwkJcmV0dXJuKGVycik7CisJfQorCSp2YWx1ZT1kYXRhOworCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlTc2hvcnRBcnJheShUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIGludDE2KiogdmFsdWUpCit7CisJZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIGVycjsKKwl1aW50MzIgY291bnQ7CisJdm9pZCogb3JpZ2RhdGE7CisJaW50MTYqIGRhdGE7CisJc3dpdGNoIChkaXJlbnRyeS0+dGRpcl90eXBlKQorCXsKKwkJY2FzZSBUSUZGX0JZVEU6CisJCWNhc2UgVElGRl9TQllURToKKwkJY2FzZSBUSUZGX1NIT1JUOgorCQljYXNlIFRJRkZfU1NIT1JUOgorCQljYXNlIFRJRkZfTE9ORzoKKwkJY2FzZSBUSUZGX1NMT05HOgorCQljYXNlIFRJRkZfTE9ORzg6CisJCWNhc2UgVElGRl9TTE9ORzg6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyVHlwZSk7CisJfQorCWVycj1USUZGUmVhZERpckVudHJ5QXJyYXkodGlmLGRpcmVudHJ5LCZjb3VudCwyLCZvcmlnZGF0YSk7CisJaWYgKChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPayl8fChvcmlnZGF0YT09MCkpCisJeworCQkqdmFsdWU9MDsKKwkJcmV0dXJuKGVycik7CisJfQorCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9TSE9SVDoKKwkJCXsKKwkJCQl1aW50MTYqIG07CisJCQkJdWludDMyIG47CisJCQkJbT0odWludDE2KilvcmlnZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiU2hvcnQobSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNzaG9ydFNob3J0KCptKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQl7CisJCQkJCQlfVElGRmZyZWUob3JpZ2RhdGEpOworCQkJCQkJcmV0dXJuKGVycik7CisJCQkJCX0KKwkJCQkJbSsrOworCQkJCX0KKwkJCQkqdmFsdWU9KGludDE2KilvcmlnZGF0YTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX1NTSE9SVDoKKwkJCSp2YWx1ZT0oaW50MTYqKW9yaWdkYXRhOworCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYkFycmF5T2ZTaG9ydCgodWludDE2KikoKnZhbHVlKSxjb3VudCk7CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwl9CisJZGF0YT0oaW50MTYqKV9USUZGbWFsbG9jKGNvdW50KjIpOworCWlmIChkYXRhPT0wKQorCXsKKwkJX1RJRkZmcmVlKG9yaWdkYXRhKTsKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJBbGxvYyk7CisJfQorCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9CWVRFOgorCQkJeworCQkJCXVpbnQ4KiBtYTsKKwkJCQlpbnQxNiogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQ4KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJCSptYisrPShpbnQxNikoKm1hKyspOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TQllURToKKwkJCXsKKwkJCQlpbnQ4KiBtYTsKKwkJCQlpbnQxNiogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KGludDgqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQkJKm1iKys9KGludDE2KSgqbWErKyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX0xPTkc6CisJCQl7CisJCQkJdWludDMyKiBtYTsKKwkJCQlpbnQxNiogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQzMiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZyhtYSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNzaG9ydExvbmcoKm1hKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQkJYnJlYWs7CisJCQkJCSptYisrPShpbnQxNikoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0xPTkc6CisJCQl7CisJCQkJaW50MzIqIG1hOworCQkJCWludDE2KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0oaW50MzIqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQl7CisJCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCQlUSUZGU3dhYkxvbmcoKHVpbnQzMiopbWEpOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTc2hvcnRTbG9uZygqbWEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCQlicmVhazsKKwkJCQkJKm1iKys9KGludDE2KSgqbWErKyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9MT05HODoKKwkJCXsKKwkJCQl1aW50NjQqIG1hOworCQkJCWludDE2KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDY0KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nOChtYSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNzaG9ydExvbmc4KCptYSk7CisJCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJCWJyZWFrOworCQkJCQkqbWIrKz0oaW50MTYpKCptYSsrKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NMT05HODoKKwkJCXsKKwkJCQlpbnQ2NCogbWE7CisJCQkJaW50MTYqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQ2NCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZzgoKHVpbnQ2NCopbWEpOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTc2hvcnRTbG9uZzgoKm1hKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQkJYnJlYWs7CisJCQkJCSptYisrPShpbnQxNikoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCX0KKwlfVElGRmZyZWUob3JpZ2RhdGEpOworCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwl7CisJCV9USUZGZnJlZShkYXRhKTsKKwkJcmV0dXJuKGVycik7CisJfQorCSp2YWx1ZT1kYXRhOworCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlMb25nQXJyYXkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCB1aW50MzIqKiB2YWx1ZSkKK3sKKwllbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgZXJyOworCXVpbnQzMiBjb3VudDsKKwl2b2lkKiBvcmlnZGF0YTsKKwl1aW50MzIqIGRhdGE7CisJc3dpdGNoIChkaXJlbnRyeS0+dGRpcl90eXBlKQorCXsKKwkJY2FzZSBUSUZGX0JZVEU6CisJCWNhc2UgVElGRl9TQllURToKKwkJY2FzZSBUSUZGX1NIT1JUOgorCQljYXNlIFRJRkZfU1NIT1JUOgorCQljYXNlIFRJRkZfTE9ORzoKKwkJY2FzZSBUSUZGX1NMT05HOgorCQljYXNlIFRJRkZfTE9ORzg6CisJCWNhc2UgVElGRl9TTE9ORzg6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyVHlwZSk7CisJfQorCWVycj1USUZGUmVhZERpckVudHJ5QXJyYXkodGlmLGRpcmVudHJ5LCZjb3VudCw0LCZvcmlnZGF0YSk7CisJaWYgKChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPayl8fChvcmlnZGF0YT09MCkpCisJeworCQkqdmFsdWU9MDsKKwkJcmV0dXJuKGVycik7CisJfQorCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9MT05HOgorCQkJKnZhbHVlPSh1aW50MzIqKW9yaWdkYXRhOworCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYkFycmF5T2ZMb25nKCp2YWx1ZSxjb3VudCk7CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJY2FzZSBUSUZGX1NMT05HOgorCQkJeworCQkJCWludDMyKiBtOworCQkJCXVpbnQzMiBuOworCQkJCW09KGludDMyKilvcmlnZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZygodWludDMyKiltKTsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlTG9uZ1Nsb25nKCptKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQl7CisJCQkJCQlfVElGRmZyZWUob3JpZ2RhdGEpOworCQkJCQkJcmV0dXJuKGVycik7CisJCQkJCX0KKwkJCQkJbSsrOworCQkJCX0KKwkJCQkqdmFsdWU9KHVpbnQzMiopb3JpZ2RhdGE7CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJfQorCWRhdGE9KHVpbnQzMiopX1RJRkZtYWxsb2MoY291bnQqNCk7CisJaWYgKGRhdGE9PTApCisJeworCQlfVElGRmZyZWUob3JpZ2RhdGEpOworCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyckFsbG9jKTsKKwl9CisJc3dpdGNoIChkaXJlbnRyeS0+dGRpcl90eXBlKQorCXsKKwkJY2FzZSBUSUZGX0JZVEU6CisJCQl7CisJCQkJdWludDgqIG1hOworCQkJCXVpbnQzMiogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQ4KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJCSptYisrPSh1aW50MzIpKCptYSsrKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0JZVEU6CisJCQl7CisJCQkJaW50OCogbWE7CisJCQkJdWludDMyKiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0oaW50OCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlTG9uZ1NieXRlKCptYSk7CisJCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJCWJyZWFrOworCQkJCQkqbWIrKz0odWludDMyKSgqbWErKyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TSE9SVDoKKwkJCXsKKwkJCQl1aW50MTYqIG1hOworCQkJCXVpbnQzMiogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQxNiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiU2hvcnQobWEpOworCQkJCQkqbWIrKz0odWludDMyKSgqbWErKyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TU0hPUlQ6CisJCQl7CisJCQkJaW50MTYqIG1hOworCQkJCXVpbnQzMiogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KGludDE2KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJTaG9ydCgodWludDE2KiltYSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmdTc2hvcnQoKm1hKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQkJYnJlYWs7CisJCQkJCSptYisrPSh1aW50MzIpKCptYSsrKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX0xPTkc4OgorCQkJeworCQkJCXVpbnQ2NCogbWE7CisJCQkJdWludDMyKiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDY0KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nOChtYSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmdMb25nOCgqbWEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCQlicmVhazsKKwkJCQkJKm1iKys9KHVpbnQzMikoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJeworCQkJCWludDY0KiBtYTsKKwkJCQl1aW50MzIqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQ2NCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZzgoKHVpbnQ2NCopbWEpOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VMb25nU2xvbmc4KCptYSk7CisJCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJCWJyZWFrOworCQkJCQkqbWIrKz0odWludDMyKSgqbWErKyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJfQorCV9USUZGZnJlZShvcmlnZGF0YSk7CisJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCXsKKwkJX1RJRkZmcmVlKGRhdGEpOworCQlyZXR1cm4oZXJyKTsKKwl9CisJKnZhbHVlPWRhdGE7CisJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeVNsb25nQXJyYXkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBpbnQzMioqIHZhbHVlKQoreworCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJdWludDMyIGNvdW50OworCXZvaWQqIG9yaWdkYXRhOworCWludDMyKiBkYXRhOworCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9CWVRFOgorCQljYXNlIFRJRkZfU0JZVEU6CisJCWNhc2UgVElGRl9TSE9SVDoKKwkJY2FzZSBUSUZGX1NTSE9SVDoKKwkJY2FzZSBUSUZGX0xPTkc6CisJCWNhc2UgVElGRl9TTE9ORzoKKwkJY2FzZSBUSUZGX0xPTkc4OgorCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclR5cGUpOworCX0KKwllcnI9VElGRlJlYWREaXJFbnRyeUFycmF5KHRpZixkaXJlbnRyeSwmY291bnQsNCwmb3JpZ2RhdGEpOworCWlmICgoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spfHwob3JpZ2RhdGE9PTApKQorCXsKKwkJKnZhbHVlPTA7CisJCXJldHVybihlcnIpOworCX0KKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfTE9ORzoKKwkJCXsKKwkJCQl1aW50MzIqIG07CisJCQkJdWludDMyIG47CisJCQkJbT0odWludDMyKilvcmlnZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZygodWludDMyKiltKTsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2xvbmdMb25nKCptKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQl7CisJCQkJCQlfVElGRmZyZWUob3JpZ2RhdGEpOworCQkJCQkJcmV0dXJuKGVycik7CisJCQkJCX0KKwkJCQkJbSsrOworCQkJCX0KKwkJCQkqdmFsdWU9KGludDMyKilvcmlnZGF0YTsKKwkJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwkJCX0KKwkJY2FzZSBUSUZGX1NMT05HOgorCQkJKnZhbHVlPShpbnQzMiopb3JpZ2RhdGE7CisJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiQXJyYXlPZkxvbmcoKHVpbnQzMiopKCp2YWx1ZSksY291bnQpOworCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJfQorCWRhdGE9KGludDMyKilfVElGRm1hbGxvYyhjb3VudCo0KTsKKwlpZiAoZGF0YT09MCkKKwl7CisJCV9USUZGZnJlZShvcmlnZGF0YSk7CisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyQWxsb2MpOworCX0KKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfQllURToKKwkJCXsKKwkJCQl1aW50OCogbWE7CisJCQkJaW50MzIqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPSh1aW50OCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCQkqbWIrKz0oaW50MzIpKCptYSsrKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0JZVEU6CisJCQl7CisJCQkJaW50OCogbWE7CisJCQkJaW50MzIqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQ4KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJCSptYisrPShpbnQzMikoKm1hKyspOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TSE9SVDoKKwkJCXsKKwkJCQl1aW50MTYqIG1hOworCQkJCWludDMyKiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDE2KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJTaG9ydChtYSk7CisJCQkJCSptYisrPShpbnQzMikoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU1NIT1JUOgorCQkJeworCQkJCWludDE2KiBtYTsKKwkJCQlpbnQzMiogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KGludDE2KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJTaG9ydCgodWludDE2KiltYSk7CisJCQkJCSptYisrPShpbnQzMikoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfTE9ORzg6CisJCQl7CisJCQkJdWludDY0KiBtYTsKKwkJCQlpbnQzMiogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQ2NCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZzgobWEpOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTbG9uZ0xvbmc4KCptYSk7CisJCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJCWJyZWFrOworCQkJCQkqbWIrKz0oaW50MzIpKCptYSsrKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NMT05HODoKKwkJCXsKKwkJCQlpbnQ2NCogbWE7CisJCQkJaW50MzIqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQ2NCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZzgoKHVpbnQ2NCopbWEpOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTbG9uZ1Nsb25nOCgqbWEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCQlicmVhazsKKwkJCQkJKm1iKys9KGludDMyKSgqbWErKyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJfQorCV9USUZGZnJlZShvcmlnZGF0YSk7CisJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCXsKKwkJX1RJRkZmcmVlKGRhdGEpOworCQlyZXR1cm4oZXJyKTsKKwl9CisJKnZhbHVlPWRhdGE7CisJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUxvbmc4QXJyYXkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCB1aW50NjQqKiB2YWx1ZSkKK3sKKwllbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgZXJyOworCXVpbnQzMiBjb3VudDsKKwl2b2lkKiBvcmlnZGF0YTsKKwl1aW50NjQqIGRhdGE7CisJc3dpdGNoIChkaXJlbnRyeS0+dGRpcl90eXBlKQorCXsKKwkJY2FzZSBUSUZGX0JZVEU6CisJCWNhc2UgVElGRl9TQllURToKKwkJY2FzZSBUSUZGX1NIT1JUOgorCQljYXNlIFRJRkZfU1NIT1JUOgorCQljYXNlIFRJRkZfTE9ORzoKKwkJY2FzZSBUSUZGX1NMT05HOgorCQljYXNlIFRJRkZfTE9ORzg6CisJCWNhc2UgVElGRl9TTE9ORzg6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyVHlwZSk7CisJfQorCWVycj1USUZGUmVhZERpckVudHJ5QXJyYXkodGlmLGRpcmVudHJ5LCZjb3VudCw4LCZvcmlnZGF0YSk7CisJaWYgKChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPayl8fChvcmlnZGF0YT09MCkpCisJeworCQkqdmFsdWU9MDsKKwkJcmV0dXJuKGVycik7CisJfQorCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9MT05HODoKKwkJCSp2YWx1ZT0odWludDY0KilvcmlnZGF0YTsKKwkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJBcnJheU9mTG9uZzgoKnZhbHVlLGNvdW50KTsKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJeworCQkJCWludDY0KiBtOworCQkJCXVpbnQzMiBuOworCQkJCW09KGludDY0KilvcmlnZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZzgoKHVpbnQ2NCopbSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmc4U2xvbmc4KCptKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQl7CisJCQkJCQlfVElGRmZyZWUob3JpZ2RhdGEpOworCQkJCQkJcmV0dXJuKGVycik7CisJCQkJCX0KKwkJCQkJbSsrOworCQkJCX0KKwkJCQkqdmFsdWU9KHVpbnQ2NCopb3JpZ2RhdGE7CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJfQorCWRhdGE9KHVpbnQ2NCopX1RJRkZtYWxsb2MoY291bnQqOCk7CisJaWYgKGRhdGE9PTApCisJeworCQlfVElGRmZyZWUob3JpZ2RhdGEpOworCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyckFsbG9jKTsKKwl9CisJc3dpdGNoIChkaXJlbnRyeS0+dGRpcl90eXBlKQorCXsKKwkJY2FzZSBUSUZGX0JZVEU6CisJCQl7CisJCQkJdWludDgqIG1hOworCQkJCXVpbnQ2NCogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQ4KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJCSptYisrPSh1aW50NjQpKCptYSsrKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0JZVEU6CisJCQl7CisJCQkJaW50OCogbWE7CisJCQkJdWludDY0KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0oaW50OCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlTG9uZzhTYnl0ZSgqbWEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCQlicmVhazsKKwkJCQkJKm1iKys9KHVpbnQ2NCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0hPUlQ6CisJCQl7CisJCQkJdWludDE2KiBtYTsKKwkJCQl1aW50NjQqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPSh1aW50MTYqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQl7CisJCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCQlUSUZGU3dhYlNob3J0KG1hKTsKKwkJCQkJKm1iKys9KHVpbnQ2NCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU1NIT1JUOgorCQkJeworCQkJCWludDE2KiBtYTsKKwkJCQl1aW50NjQqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQxNiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiU2hvcnQoKHVpbnQxNiopbWEpOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VMb25nOFNzaG9ydCgqbWEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCQlicmVhazsKKwkJCQkJKm1iKys9KHVpbnQ2NCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfTE9ORzoKKwkJCXsKKwkJCQl1aW50MzIqIG1hOworCQkJCXVpbnQ2NCogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQzMiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZyhtYSk7CisJCQkJCSptYisrPSh1aW50NjQpKCptYSsrKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NMT05HOgorCQkJeworCQkJCWludDMyKiBtYTsKKwkJCQl1aW50NjQqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQzMiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZygodWludDMyKiltYSk7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmc4U2xvbmcoKm1hKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQkJYnJlYWs7CisJCQkJCSptYisrPSh1aW50NjQpKCptYSsrKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwl9CisJX1RJRkZmcmVlKG9yaWdkYXRhKTsKKwlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJeworCQlfVElGRmZyZWUoZGF0YSk7CisJCXJldHVybihlcnIpOworCX0KKwkqdmFsdWU9ZGF0YTsKKwlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5U2xvbmc4QXJyYXkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBpbnQ2NCoqIHZhbHVlKQoreworCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJdWludDMyIGNvdW50OworCXZvaWQqIG9yaWdkYXRhOworCWludDY0KiBkYXRhOworCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9CWVRFOgorCQljYXNlIFRJRkZfU0JZVEU6CisJCWNhc2UgVElGRl9TSE9SVDoKKwkJY2FzZSBUSUZGX1NTSE9SVDoKKwkJY2FzZSBUSUZGX0xPTkc6CisJCWNhc2UgVElGRl9TTE9ORzoKKwkJY2FzZSBUSUZGX0xPTkc4OgorCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclR5cGUpOworCX0KKwllcnI9VElGRlJlYWREaXJFbnRyeUFycmF5KHRpZixkaXJlbnRyeSwmY291bnQsOCwmb3JpZ2RhdGEpOworCWlmICgoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spfHwob3JpZ2RhdGE9PTApKQorCXsKKwkJKnZhbHVlPTA7CisJCXJldHVybihlcnIpOworCX0KKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfTE9ORzg6CisJCQl7CisJCQkJdWludDY0KiBtOworCQkJCXVpbnQzMiBuOworCQkJCW09KHVpbnQ2NCopb3JpZ2RhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQl7CisJCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCQlUSUZGU3dhYkxvbmc4KG0pOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTbG9uZzhMb25nOCgqbSk7CisJCQkJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJeworCQkJCQkJX1RJRkZmcmVlKG9yaWdkYXRhKTsKKwkJCQkJCXJldHVybihlcnIpOworCQkJCQl9CisJCQkJCW0rKzsKKwkJCQl9CisJCQkJKnZhbHVlPShpbnQ2NCopb3JpZ2RhdGE7CisJCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJCQl9CisJCWNhc2UgVElGRl9TTE9ORzg6CisJCQkqdmFsdWU9KGludDY0KilvcmlnZGF0YTsKKwkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJBcnJheU9mTG9uZzgoKHVpbnQ2NCopKCp2YWx1ZSksY291bnQpOworCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7CisJfQorCWRhdGE9KGludDY0KilfVElGRm1hbGxvYyhjb3VudCo4KTsKKwlpZiAoZGF0YT09MCkKKwl7CisJCV9USUZGZnJlZShvcmlnZGF0YSk7CisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyQWxsb2MpOworCX0KKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfQllURToKKwkJCXsKKwkJCQl1aW50OCogbWE7CisJCQkJaW50NjQqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPSh1aW50OCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCQkqbWIrKz0oaW50NjQpKCptYSsrKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0JZVEU6CisJCQl7CisJCQkJaW50OCogbWE7CisJCQkJaW50NjQqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQ4KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJCSptYisrPShpbnQ2NCkoKm1hKyspOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TSE9SVDoKKwkJCXsKKwkJCQl1aW50MTYqIG1hOworCQkJCWludDY0KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDE2KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJTaG9ydChtYSk7CisJCQkJCSptYisrPShpbnQ2NCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU1NIT1JUOgorCQkJeworCQkJCWludDE2KiBtYTsKKwkJCQlpbnQ2NCogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KGludDE2KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJTaG9ydCgodWludDE2KiltYSk7CisJCQkJCSptYisrPShpbnQ2NCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfTE9ORzoKKwkJCXsKKwkJCQl1aW50MzIqIG1hOworCQkJCWludDY0KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDMyKilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nKG1hKTsKKwkJCQkJKm1iKys9KGludDY0KSgqbWErKyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TTE9ORzoKKwkJCXsKKwkJCQlpbnQzMiogbWE7CisJCQkJaW50NjQqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQzMiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZygodWludDMyKiltYSk7CisJCQkJCSptYisrPShpbnQ2NCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCX0KKwlfVElGRmZyZWUob3JpZ2RhdGEpOworCSp2YWx1ZT1kYXRhOworCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlGbG9hdEFycmF5KFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgZmxvYXQqKiB2YWx1ZSkKK3sKKwllbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgZXJyOworCXVpbnQzMiBjb3VudDsKKwl2b2lkKiBvcmlnZGF0YTsKKwlmbG9hdCogZGF0YTsKKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfQllURToKKwkJY2FzZSBUSUZGX1NCWVRFOgorCQljYXNlIFRJRkZfU0hPUlQ6CisJCWNhc2UgVElGRl9TU0hPUlQ6CisJCWNhc2UgVElGRl9MT05HOgorCQljYXNlIFRJRkZfU0xPTkc6CisJCWNhc2UgVElGRl9MT05HODoKKwkJY2FzZSBUSUZGX1NMT05HODoKKwkJY2FzZSBUSUZGX1JBVElPTkFMOgorCQljYXNlIFRJRkZfU1JBVElPTkFMOgorCQljYXNlIFRJRkZfRkxPQVQ6CisJCWNhc2UgVElGRl9ET1VCTEU6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyVHlwZSk7CisJfQorCWVycj1USUZGUmVhZERpckVudHJ5QXJyYXkodGlmLGRpcmVudHJ5LCZjb3VudCw0LCZvcmlnZGF0YSk7CisJaWYgKChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPayl8fChvcmlnZGF0YT09MCkpCisJeworCQkqdmFsdWU9MDsKKwkJcmV0dXJuKGVycik7CisJfQorCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9GTE9BVDoKKwkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJBcnJheU9mTG9uZygodWludDMyKilvcmlnZGF0YSxjb3VudCk7ICAKKwkJCVRJRkZDdnRJRUVFRG91YmxlVG9OYXRpdmUodGlmLGNvdW50LChmbG9hdCopb3JpZ2RhdGEpOworCQkJKnZhbHVlPShmbG9hdCopb3JpZ2RhdGE7CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwl9CisJZGF0YT0oZmxvYXQqKV9USUZGbWFsbG9jKGNvdW50KnNpemVvZihmbG9hdCkpOworCWlmIChkYXRhPT0wKQorCXsKKwkJX1RJRkZmcmVlKG9yaWdkYXRhKTsKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJBbGxvYyk7CisJfQorCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9CWVRFOgorCQkJeworCQkJCXVpbnQ4KiBtYTsKKwkJCQlmbG9hdCogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQ4KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJCSptYisrPShmbG9hdCkoKm1hKyspOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TQllURToKKwkJCXsKKwkJCQlpbnQ4KiBtYTsKKwkJCQlmbG9hdCogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KGludDgqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQkJKm1iKys9KGZsb2F0KSgqbWErKyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NIT1JUOgorCQkJeworCQkJCXVpbnQxNiogbWE7CisJCQkJZmxvYXQqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPSh1aW50MTYqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQl7CisJCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCQlUSUZGU3dhYlNob3J0KG1hKTsKKwkJCQkJKm1iKys9KGZsb2F0KSgqbWErKyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TU0hPUlQ6CisJCQl7CisJCQkJaW50MTYqIG1hOworCQkJCWZsb2F0KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0oaW50MTYqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQl7CisJCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCQlUSUZGU3dhYlNob3J0KCh1aW50MTYqKW1hKTsKKwkJCQkJKm1iKys9KGZsb2F0KSgqbWErKyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9MT05HOgorCQkJeworCQkJCXVpbnQzMiogbWE7CisJCQkJZmxvYXQqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPSh1aW50MzIqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQl7CisJCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCQlUSUZGU3dhYkxvbmcobWEpOworCQkJCQkqbWIrKz0oZmxvYXQpKCptYSsrKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NMT05HOgorCQkJeworCQkJCWludDMyKiBtYTsKKwkJCQlmbG9hdCogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KGludDMyKilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nKCh1aW50MzIqKW1hKTsKKwkJCQkJKm1iKys9KGZsb2F0KSgqbWErKyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9MT05HODoKKwkJCXsKKwkJCQl1aW50NjQqIG1hOworCQkJCWZsb2F0KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDY0KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nOChtYSk7CisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChfTVNDX1ZFUiA8IDE1MDApCisJCQkJCS8qCisJCQkJCSAqIFhYWDogTVNWQyA2LjAgZG9lcyBub3Qgc3VwcG9ydAorCQkJCQkgKiBjb252ZXJzaW9uIG9mIDY0LWJpdCBpbnRlZ2VycyBpbnRvCisJCQkJCSAqIGZsb2F0aW5nIHBvaW50IHZhbHVlcy4KKwkJCQkJICovCisJCQkJCSptYisrID0gX1RJRkZVSW50NjRUb0Zsb2F0KCptYSsrKTsKKyNlbHNlCisJCQkJCSptYisrID0gKGZsb2F0KSgqbWErKyk7CisjZW5kaWYKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NMT05HODoKKwkJCXsKKwkJCQlpbnQ2NCogbWE7CisJCQkJZmxvYXQqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQ2NCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZzgoKHVpbnQ2NCopbWEpOworCQkJCQkqbWIrKz0oZmxvYXQpKCptYSsrKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1JBVElPTkFMOgorCQkJeworCQkJCXVpbnQzMiogbWE7CisJCQkJdWludDMyIG1hYTsKKwkJCQl1aW50MzIgbWFiOworCQkJCWZsb2F0KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDMyKilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nKG1hKTsKKwkJCQkJbWFhPSptYSsrOworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nKG1hKTsKKwkJCQkJbWFiPSptYSsrOworCQkJCQlpZiAobWFiPT0wKQorCQkJCQkJKm1iKys9MC4wOworCQkJCQllbHNlCisJCQkJCQkqbWIrKz0oZmxvYXQpbWFhLyhmbG9hdCltYWI7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TUkFUSU9OQUw6CisJCQl7CisJCQkJdWludDMyKiBtYTsKKwkJCQlpbnQzMiBtYWE7CisJCQkJdWludDMyIG1hYjsKKwkJCQlmbG9hdCogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQzMiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZyhtYSk7CisJCQkJCW1hYT0qKGludDMyKiltYTsKKwkJCQkJbWErKzsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZyhtYSk7CisJCQkJCW1hYj0qbWErKzsKKwkJCQkJaWYgKG1hYj09MCkKKwkJCQkJCSptYisrPTAuMDsKKwkJCQkJZWxzZQorCQkJCQkJKm1iKys9KGZsb2F0KW1hYS8oZmxvYXQpbWFiOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfRE9VQkxFOgorCQkJeworCQkJCWRvdWJsZSogbWE7CisJCQkJZmxvYXQqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCVRJRkZTd2FiQXJyYXlPZkxvbmc4KCh1aW50NjQqKW9yaWdkYXRhLGNvdW50KTsKKwkJCQlUSUZGQ3Z0SUVFRURvdWJsZVRvTmF0aXZlKHRpZixjb3VudCwoZG91YmxlKilvcmlnZGF0YSk7CisJCQkJbWE9KGRvdWJsZSopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCQkqbWIrKz0oZmxvYXQpKCptYSsrKTsKKwkJCX0KKwkJCWJyZWFrOworCX0KKwlfVElGRmZyZWUob3JpZ2RhdGEpOworCSp2YWx1ZT1kYXRhOworCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyCitUSUZGUmVhZERpckVudHJ5RG91YmxlQXJyYXkoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBkb3VibGUqKiB2YWx1ZSkKK3sKKwllbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgZXJyOworCXVpbnQzMiBjb3VudDsKKwl2b2lkKiBvcmlnZGF0YTsKKwlkb3VibGUqIGRhdGE7CisJc3dpdGNoIChkaXJlbnRyeS0+dGRpcl90eXBlKQorCXsKKwkJY2FzZSBUSUZGX0JZVEU6CisJCWNhc2UgVElGRl9TQllURToKKwkJY2FzZSBUSUZGX1NIT1JUOgorCQljYXNlIFRJRkZfU1NIT1JUOgorCQljYXNlIFRJRkZfTE9ORzoKKwkJY2FzZSBUSUZGX1NMT05HOgorCQljYXNlIFRJRkZfTE9ORzg6CisJCWNhc2UgVElGRl9TTE9ORzg6CisJCWNhc2UgVElGRl9SQVRJT05BTDoKKwkJY2FzZSBUSUZGX1NSQVRJT05BTDoKKwkJY2FzZSBUSUZGX0ZMT0FUOgorCQljYXNlIFRJRkZfRE9VQkxFOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclR5cGUpOworCX0KKwllcnI9VElGRlJlYWREaXJFbnRyeUFycmF5KHRpZixkaXJlbnRyeSwmY291bnQsOCwmb3JpZ2RhdGEpOworCWlmICgoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spfHwob3JpZ2RhdGE9PTApKQorCXsKKwkJKnZhbHVlPTA7CisJCXJldHVybihlcnIpOworCX0KKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfRE9VQkxFOgorCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYkFycmF5T2ZMb25nOCgodWludDY0KilvcmlnZGF0YSxjb3VudCk7CisJCQlUSUZGQ3Z0SUVFRURvdWJsZVRvTmF0aXZlKHRpZixjb3VudCwoZG91YmxlKilvcmlnZGF0YSk7CisJCQkqdmFsdWU9KGRvdWJsZSopb3JpZ2RhdGE7CisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKKwl9CisJZGF0YT0oZG91YmxlKilfVElGRm1hbGxvYyhjb3VudCpzaXplb2YoZG91YmxlKSk7CisJaWYgKGRhdGE9PTApCisJeworCQlfVElGRmZyZWUob3JpZ2RhdGEpOworCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyckFsbG9jKTsKKwl9CisJc3dpdGNoIChkaXJlbnRyeS0+dGRpcl90eXBlKQorCXsKKwkJY2FzZSBUSUZGX0JZVEU6CisJCQl7CisJCQkJdWludDgqIG1hOworCQkJCWRvdWJsZSogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQ4KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJCSptYisrPShkb3VibGUpKCptYSsrKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0JZVEU6CisJCQl7CisJCQkJaW50OCogbWE7CisJCQkJZG91YmxlKiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0oaW50OCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCQkqbWIrKz0oZG91YmxlKSgqbWErKyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NIT1JUOgorCQkJeworCQkJCXVpbnQxNiogbWE7CisJCQkJZG91YmxlKiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDE2KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJTaG9ydChtYSk7CisJCQkJCSptYisrPShkb3VibGUpKCptYSsrKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NTSE9SVDoKKwkJCXsKKwkJCQlpbnQxNiogbWE7CisJCQkJZG91YmxlKiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0oaW50MTYqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQl7CisJCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCQlUSUZGU3dhYlNob3J0KCh1aW50MTYqKW1hKTsKKwkJCQkJKm1iKys9KGRvdWJsZSkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfTE9ORzoKKwkJCXsKKwkJCQl1aW50MzIqIG1hOworCQkJCWRvdWJsZSogbWI7CisJCQkJdWludDMyIG47CisJCQkJbWE9KHVpbnQzMiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZyhtYSk7CisJCQkJCSptYisrPShkb3VibGUpKCptYSsrKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NMT05HOgorCQkJeworCQkJCWludDMyKiBtYTsKKwkJCQlkb3VibGUqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQzMiopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZygodWludDMyKiltYSk7CisJCQkJCSptYisrPShkb3VibGUpKCptYSsrKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX0xPTkc4OgorCQkJeworCQkJCXVpbnQ2NCogbWE7CisJCQkJZG91YmxlKiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDY0KilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nOChtYSk7CisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChfTVNDX1ZFUiA8IDE1MDApCisJCQkJCS8qCisJCQkJCSAqIFhYWDogTVNWQyA2LjAgZG9lcyBub3Qgc3VwcG9ydAorCQkJCQkgKiBjb252ZXJzaW9uIG9mIDY0LWJpdCBpbnRlZ2VycyBpbnRvCisJCQkJCSAqIGZsb2F0aW5nIHBvaW50IHZhbHVlcy4KKwkJCQkJICovCisJCQkJCSptYisrID0gX1RJRkZVSW50NjRUb0RvdWJsZSgqbWErKyk7CisjZWxzZQorCQkJCQkqbWIrKyA9IChkb3VibGUpKCptYSsrKTsKKyNlbmRpZgorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJeworCQkJCWludDY0KiBtYTsKKwkJCQlkb3VibGUqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPShpbnQ2NCopb3JpZ2RhdGE7CisJCQkJbWI9ZGF0YTsKKwkJCQlmb3IgKG49MDsgbjxjb3VudDsgbisrKQorCQkJCXsKKwkJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQkJCVRJRkZTd2FiTG9uZzgoKHVpbnQ2NCopbWEpOworCQkJCQkqbWIrKz0oZG91YmxlKSgqbWErKyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9SQVRJT05BTDoKKwkJCXsKKwkJCQl1aW50MzIqIG1hOworCQkJCXVpbnQzMiBtYWE7CisJCQkJdWludDMyIG1hYjsKKwkJCQlkb3VibGUqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCW1hPSh1aW50MzIqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQl7CisJCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCQlUSUZGU3dhYkxvbmcobWEpOworCQkJCQltYWE9Km1hKys7CisJCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCQlUSUZGU3dhYkxvbmcobWEpOworCQkJCQltYWI9Km1hKys7CisJCQkJCWlmIChtYWI9PTApCisJCQkJCQkqbWIrKz0wLjA7CisJCQkJCWVsc2UKKwkJCQkJCSptYisrPShkb3VibGUpbWFhLyhkb3VibGUpbWFiOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU1JBVElPTkFMOgorCQkJeworCQkJCXVpbnQzMiogbWE7CisJCQkJaW50MzIgbWFhOworCQkJCXVpbnQzMiBtYWI7CisJCQkJZG91YmxlKiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDMyKilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nKG1hKTsKKwkJCQkJbWFhPSooaW50MzIqKW1hOworCQkJCQltYSsrOworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nKG1hKTsKKwkJCQkJbWFiPSptYSsrOworCQkJCQlpZiAobWFiPT0wKQorCQkJCQkJKm1iKys9MC4wOworCQkJCQllbHNlCisJCQkJCQkqbWIrKz0oZG91YmxlKW1hYS8oZG91YmxlKW1hYjsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX0ZMT0FUOgorCQkJeworCQkJCWZsb2F0KiBtYTsKKwkJCQlkb3VibGUqIG1iOworCQkJCXVpbnQzMiBuOworCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCVRJRkZTd2FiQXJyYXlPZkxvbmcoKHVpbnQzMiopb3JpZ2RhdGEsY291bnQpOyAgCisJCQkJVElGRkN2dElFRUVGbG9hdFRvTmF0aXZlKHRpZixjb3VudCwoZmxvYXQqKW9yaWdkYXRhKTsKKwkJCQltYT0oZmxvYXQqKW9yaWdkYXRhOworCQkJCW1iPWRhdGE7CisJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKKwkJCQkJKm1iKys9KGRvdWJsZSkoKm1hKyspOworCQkJfQorCQkJYnJlYWs7CisJfQorCV9USUZGZnJlZShvcmlnZGF0YSk7CisJKnZhbHVlPWRhdGE7CisJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUlmZDhBcnJheShUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQ2NCoqIHZhbHVlKQoreworCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJdWludDMyIGNvdW50OworCXZvaWQqIG9yaWdkYXRhOworCXVpbnQ2NCogZGF0YTsKKwlzd2l0Y2ggKGRpcmVudHJ5LT50ZGlyX3R5cGUpCisJeworCQljYXNlIFRJRkZfTE9ORzoKKwkJY2FzZSBUSUZGX0xPTkc4OgorCQljYXNlIFRJRkZfSUZEOgorCQljYXNlIFRJRkZfSUZEODoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJUeXBlKTsKKwl9CisJZXJyPVRJRkZSZWFkRGlyRW50cnlBcnJheSh0aWYsZGlyZW50cnksJmNvdW50LDgsJm9yaWdkYXRhKTsKKwlpZiAoKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKXx8KG9yaWdkYXRhPT0wKSkKKwl7CisJCSp2YWx1ZT0wOworCQlyZXR1cm4oZXJyKTsKKwl9CisJc3dpdGNoIChkaXJlbnRyeS0+dGRpcl90eXBlKQorCXsKKwkJY2FzZSBUSUZGX0xPTkc4OgorCQljYXNlIFRJRkZfSUZEODoKKwkJCSp2YWx1ZT0odWludDY0KilvcmlnZGF0YTsKKwkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJBcnJheU9mTG9uZzgoKnZhbHVlLGNvdW50KTsKKwkJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworCX0KKwlkYXRhPSh1aW50NjQqKV9USUZGbWFsbG9jKGNvdW50KjgpOworCWlmIChkYXRhPT0wKQorCXsKKwkJX1RJRkZmcmVlKG9yaWdkYXRhKTsKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJBbGxvYyk7CisJfQorCXN3aXRjaCAoZGlyZW50cnktPnRkaXJfdHlwZSkKKwl7CisJCWNhc2UgVElGRl9MT05HOgorCQljYXNlIFRJRkZfSUZEOgorCQkJeworCQkJCXVpbnQzMiogbWE7CisJCQkJdWludDY0KiBtYjsKKwkJCQl1aW50MzIgbjsKKwkJCQltYT0odWludDMyKilvcmlnZGF0YTsKKwkJCQltYj1kYXRhOworCQkJCWZvciAobj0wOyBuPGNvdW50OyBuKyspCisJCQkJeworCQkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQkJVElGRlN3YWJMb25nKG1hKTsKKwkJCQkJKm1iKys9KHVpbnQ2NCkoKm1hKyspOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCX0KKwlfVElGRmZyZWUob3JpZ2RhdGEpOworCSp2YWx1ZT1kYXRhOworCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlQZXJzYW1wbGVTaG9ydChUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIHVpbnQxNiogdmFsdWUpCit7CisJZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIGVycjsKKwl1aW50MTYqIG07CisJdWludDE2KiBuYTsKKwl1aW50MTYgbmI7CisJaWYgKGRpcmVudHJ5LT50ZGlyX2NvdW50PCh1aW50NjQpdGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbCkKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJDb3VudCk7CisJZXJyPVRJRkZSZWFkRGlyRW50cnlTaG9ydEFycmF5KHRpZixkaXJlbnRyeSwmbSk7CisJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQlyZXR1cm4oZXJyKTsKKwluYT1tOworCW5iPXRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWw7CisJKnZhbHVlPSpuYSsrOworCW5iLS07CisJd2hpbGUgKG5iPjApCisJeworCQlpZiAoKm5hKyshPSp2YWx1ZSkKKwkJeworCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlFcnJQc2RpZjsKKwkJCWJyZWFrOworCQl9CisJCW5iLS07CisJfQorCV9USUZGZnJlZShtKTsKKwlyZXR1cm4oZXJyKTsKK30KKworI2lmIDAKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeVBlcnNhbXBsZURvdWJsZShUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIGRvdWJsZSogdmFsdWUpCit7CisJZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIGVycjsKKwlkb3VibGUqIG07CisJZG91YmxlKiBuYTsKKwl1aW50MTYgbmI7CisJaWYgKGRpcmVudHJ5LT50ZGlyX2NvdW50PCh1aW50NjQpdGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbCkKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJDb3VudCk7CisJZXJyPVRJRkZSZWFkRGlyRW50cnlEb3VibGVBcnJheSh0aWYsZGlyZW50cnksJm0pOworCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJcmV0dXJuKGVycik7CisJbmE9bTsKKwluYj10aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsOworCSp2YWx1ZT0qbmErKzsKKwluYi0tOworCXdoaWxlIChuYj4wKQorCXsKKwkJaWYgKCpuYSsrIT0qdmFsdWUpCisJCXsKKwkJCWVycj1USUZGUmVhZERpckVudHJ5RXJyUHNkaWY7CisJCQlicmVhazsKKwkJfQorCQluYi0tOworCX0KKwlfVElGRmZyZWUobSk7CisJcmV0dXJuKGVycik7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgVElGRlJlYWREaXJFbnRyeUNoZWNrZWRCeXRlKFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgdWludDgqIHZhbHVlKQoreworCSh2b2lkKSB0aWY7CisJKnZhbHVlPSoodWludDgqKSgmZGlyZW50cnktPnRkaXJfb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTYnl0ZShUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIGludDgqIHZhbHVlKQoreworCSh2b2lkKSB0aWY7CisJKnZhbHVlPSooaW50OCopKCZkaXJlbnRyeS0+dGRpcl9vZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNob3J0KFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgdWludDE2KiB2YWx1ZSkKK3sKKwkqdmFsdWUgPSBkaXJlbnRyeS0+dGRpcl9vZmZzZXQudG9mZl9zaG9ydDsKKwkvKiAqdmFsdWU9Kih1aW50MTYqKSgmZGlyZW50cnktPnRkaXJfb2Zmc2V0KTsgKi8KKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQlUSUZGU3dhYlNob3J0KHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTc2hvcnQoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBpbnQxNiogdmFsdWUpCit7CisJKnZhbHVlPSooaW50MTYqKSgmZGlyZW50cnktPnRkaXJfb2Zmc2V0KTsKKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQlUSUZGU3dhYlNob3J0KCh1aW50MTYqKXZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgVElGRlJlYWREaXJFbnRyeUNoZWNrZWRMb25nKFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgdWludDMyKiB2YWx1ZSkKK3sKKwkqdmFsdWU9Kih1aW50MzIqKSgmZGlyZW50cnktPnRkaXJfb2Zmc2V0KTsKKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQlUSUZGU3dhYkxvbmcodmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNsb25nKFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgaW50MzIqIHZhbHVlKQoreworCSp2YWx1ZT0qKGludDMyKikoJmRpcmVudHJ5LT50ZGlyX29mZnNldCk7CisJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJVElGRlN3YWJMb25nKCh1aW50MzIqKXZhbHVlKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tlZExvbmc4KFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgdWludDY0KiB2YWx1ZSkKK3sKKwlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCXsKKwkJZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIGVycjsKKwkJdWludDMyIG9mZnNldCA9IGRpcmVudHJ5LT50ZGlyX29mZnNldC50b2ZmX2xvbmc7CisJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQlUSUZGU3dhYkxvbmcoJm9mZnNldCk7CisJCWVycj1USUZGUmVhZERpckVudHJ5RGF0YSh0aWYsb2Zmc2V0LDgsdmFsdWUpOworCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQlyZXR1cm4oZXJyKTsKKwl9CisJZWxzZQorCQkqdmFsdWUgPSBkaXJlbnRyeS0+dGRpcl9vZmZzZXQudG9mZl9sb25nODsKKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQlUSUZGU3dhYkxvbmc4KHZhbHVlKTsKKwlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tlZFNsb25nOChUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIGludDY0KiB2YWx1ZSkKK3sKKwlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCXsKKwkJZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIGVycjsKKwkJdWludDMyIG9mZnNldCA9IGRpcmVudHJ5LT50ZGlyX29mZnNldC50b2ZmX2xvbmc7CisJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQlUSUZGU3dhYkxvbmcoJm9mZnNldCk7CisJCWVycj1USUZGUmVhZERpckVudHJ5RGF0YSh0aWYsb2Zmc2V0LDgsdmFsdWUpOworCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQlyZXR1cm4oZXJyKTsKKwl9CisJZWxzZQorCQkqdmFsdWU9KihpbnQ2NCopKCZkaXJlbnRyeS0+dGRpcl9vZmZzZXQpOworCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCVRJRkZTd2FiTG9uZzgoKHVpbnQ2NCopdmFsdWUpOworCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja2VkUmF0aW9uYWwoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBkb3VibGUqIHZhbHVlKQoreworCVVJbnQ2NEFsaWduZWRfdCBtOworCisJYXNzZXJ0KHNpemVvZihkb3VibGUpPT04KTsKKwlhc3NlcnQoc2l6ZW9mKHVpbnQ2NCk9PTgpOworCWFzc2VydChzaXplb2YodWludDMyKT09NCk7CisJaWYgKCEodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKSkKKwl7CisJCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJCXVpbnQzMiBvZmZzZXQgPSBkaXJlbnRyeS0+dGRpcl9vZmZzZXQudG9mZl9sb25nOworCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJVElGRlN3YWJMb25nKCZvZmZzZXQpOworCQllcnI9VElGRlJlYWREaXJFbnRyeURhdGEodGlmLG9mZnNldCw4LG0uaSk7CisJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCXJldHVybihlcnIpOworCX0KKwllbHNlCisJCW0ubCA9IGRpcmVudHJ5LT50ZGlyX29mZnNldC50b2ZmX2xvbmc4OworCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCVRJRkZTd2FiQXJyYXlPZkxvbmcobS5pLDIpOworCWlmIChtLmlbMF09PTApCisJCSp2YWx1ZT0wLjA7CisJZWxzZQorCQkqdmFsdWU9KGRvdWJsZSltLmlbMF0vKGRvdWJsZSltLmlbMV07CisJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrZWRTcmF0aW9uYWwoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpcmVudHJ5LCBkb3VibGUqIHZhbHVlKQoreworCVVJbnQ2NEFsaWduZWRfdCBtOworCWFzc2VydChzaXplb2YoZG91YmxlKT09OCk7CisJYXNzZXJ0KHNpemVvZih1aW50NjQpPT04KTsKKwlhc3NlcnQoc2l6ZW9mKGludDMyKT09NCk7CisJYXNzZXJ0KHNpemVvZih1aW50MzIpPT00KTsKKwlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCXsKKwkJZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIGVycjsKKwkJdWludDMyIG9mZnNldCA9IGRpcmVudHJ5LT50ZGlyX29mZnNldC50b2ZmX2xvbmc7CisJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQlUSUZGU3dhYkxvbmcoJm9mZnNldCk7CisJCWVycj1USUZGUmVhZERpckVudHJ5RGF0YSh0aWYsb2Zmc2V0LDgsbS5pKTsKKwkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJcmV0dXJuKGVycik7CisJfQorCWVsc2UKKwkJbS5sPWRpcmVudHJ5LT50ZGlyX29mZnNldC50b2ZmX2xvbmc4OworCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCVRJRkZTd2FiQXJyYXlPZkxvbmcobS5pLDIpOworCWlmICgoaW50MzIpbS5pWzBdPT0wKQorCQkqdmFsdWU9MC4wOworCWVsc2UKKwkJKnZhbHVlPShkb3VibGUpKChpbnQzMiltLmlbMF0pLyhkb3VibGUpbS5pWzFdOworCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgdm9pZCBUSUZGUmVhZERpckVudHJ5Q2hlY2tlZEZsb2F0KFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXJlbnRyeSwgZmxvYXQqIHZhbHVlKQoreworICAgICAgICAgdW5pb24KKwkgeworCSAgIGZsb2F0ICBmOworCSAgIHVpbnQzMiBpOworCSB9IGZsb2F0X3VuaW9uOworCWFzc2VydChzaXplb2YoZmxvYXQpPT00KTsKKwlhc3NlcnQoc2l6ZW9mKHVpbnQzMik9PTQpOworCWFzc2VydChzaXplb2YoZmxvYXRfdW5pb24pPT00KTsKKwlmbG9hdF91bmlvbi5pPSoodWludDMyKikoJmRpcmVudHJ5LT50ZGlyX29mZnNldCk7CisJKnZhbHVlPWZsb2F0X3VuaW9uLmY7CisJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJVElGRlN3YWJMb25nKCh1aW50MzIqKXZhbHVlKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tlZERvdWJsZShUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyZW50cnksIGRvdWJsZSogdmFsdWUpCit7CisJYXNzZXJ0KHNpemVvZihkb3VibGUpPT04KTsKKwlhc3NlcnQoc2l6ZW9mKHVpbnQ2NCk9PTgpOworCWFzc2VydChzaXplb2YoVUludDY0QWxpZ25lZF90KT09OCk7CisJaWYgKCEodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKSkKKwl7CisJCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJCXVpbnQzMiBvZmZzZXQgPSBkaXJlbnRyeS0+dGRpcl9vZmZzZXQudG9mZl9sb25nOworCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJVElGRlN3YWJMb25nKCZvZmZzZXQpOworCQllcnI9VElGRlJlYWREaXJFbnRyeURhdGEodGlmLG9mZnNldCw4LHZhbHVlKTsKKwkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJcmV0dXJuKGVycik7CisJfQorCWVsc2UKKwl7CisJICAgICAgIFVJbnQ2NEFsaWduZWRfdCB1aW50NjRfdW5pb247CisJICAgICAgIHVpbnQ2NF91bmlvbi5sPWRpcmVudHJ5LT50ZGlyX29mZnNldC50b2ZmX2xvbmc4OworCSAgICAgICAqdmFsdWU9dWludDY0X3VuaW9uLmQ7CisJfQorCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCVRJRkZTd2FiTG9uZzgoKHVpbnQ2NCopdmFsdWUpOworCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlQnl0ZVNieXRlKGludDggdmFsdWUpCit7CisJaWYgKHZhbHVlPDApCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyUmFuZ2UpOworCWVsc2UKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VCeXRlU2hvcnQodWludDE2IHZhbHVlKQoreworCWlmICh2YWx1ZT4weEZGKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlQnl0ZVNzaG9ydChpbnQxNiB2YWx1ZSkKK3sKKwlpZiAoKHZhbHVlPDApfHwodmFsdWU+MHhGRikpCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyUmFuZ2UpOworCWVsc2UKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VCeXRlTG9uZyh1aW50MzIgdmFsdWUpCit7CisJaWYgKHZhbHVlPjB4RkYpCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyUmFuZ2UpOworCWVsc2UKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VCeXRlU2xvbmcoaW50MzIgdmFsdWUpCit7CisJaWYgKCh2YWx1ZTwwKXx8KHZhbHVlPjB4RkYpKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlQnl0ZUxvbmc4KHVpbnQ2NCB2YWx1ZSkKK3sKKwlpZiAodmFsdWU+MHhGRikKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJSYW5nZSk7CisJZWxzZQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUJ5dGVTbG9uZzgoaW50NjQgdmFsdWUpCit7CisJaWYgKCh2YWx1ZTwwKXx8KHZhbHVlPjB4RkYpKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2J5dGVCeXRlKHVpbnQ4IHZhbHVlKQoreworCWlmICh2YWx1ZT4weDdGKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2J5dGVTaG9ydCh1aW50MTYgdmFsdWUpCit7CisJaWYgKHZhbHVlPjB4N0YpCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyUmFuZ2UpOworCWVsc2UKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTYnl0ZVNzaG9ydChpbnQxNiB2YWx1ZSkKK3sKKwlpZiAoKHZhbHVlPC0weDgwKXx8KHZhbHVlPjB4N0YpKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2J5dGVMb25nKHVpbnQzMiB2YWx1ZSkKK3sKKwlpZiAodmFsdWU+MHg3RikKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJSYW5nZSk7CisJZWxzZQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNieXRlU2xvbmcoaW50MzIgdmFsdWUpCit7CisJaWYgKCh2YWx1ZTwtMHg4MCl8fCh2YWx1ZT4weDdGKSkKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJSYW5nZSk7CisJZWxzZQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNieXRlTG9uZzgodWludDY0IHZhbHVlKQoreworCWlmICh2YWx1ZT4weDdGKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2J5dGVTbG9uZzgoaW50NjQgdmFsdWUpCit7CisJaWYgKCh2YWx1ZTwtMHg4MCl8fCh2YWx1ZT4weDdGKSkKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJSYW5nZSk7CisJZWxzZQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNob3J0U2J5dGUoaW50OCB2YWx1ZSkKK3sKKwlpZiAodmFsdWU8MCkKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJSYW5nZSk7CisJZWxzZQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNob3J0U3Nob3J0KGludDE2IHZhbHVlKQoreworCWlmICh2YWx1ZTwwKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2hvcnRMb25nKHVpbnQzMiB2YWx1ZSkKK3sKKwlpZiAodmFsdWU+MHhGRkZGKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU2hvcnRTbG9uZyhpbnQzMiB2YWx1ZSkKK3sKKwlpZiAoKHZhbHVlPDApfHwodmFsdWU+MHhGRkZGKSkKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJSYW5nZSk7CisJZWxzZQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNob3J0TG9uZzgodWludDY0IHZhbHVlKQoreworCWlmICh2YWx1ZT4weEZGRkYpCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyUmFuZ2UpOworCWVsc2UKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTaG9ydFNsb25nOChpbnQ2NCB2YWx1ZSkKK3sKKwlpZiAoKHZhbHVlPDApfHwodmFsdWU+MHhGRkZGKSkKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJSYW5nZSk7CisJZWxzZQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNzaG9ydFNob3J0KHVpbnQxNiB2YWx1ZSkKK3sKKwlpZiAodmFsdWU+MHg3RkZGKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU3Nob3J0TG9uZyh1aW50MzIgdmFsdWUpCit7CisJaWYgKHZhbHVlPjB4N0ZGRikKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJSYW5nZSk7CisJZWxzZQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNzaG9ydFNsb25nKGludDMyIHZhbHVlKQoreworCWlmICgodmFsdWU8LTB4ODAwMCl8fCh2YWx1ZT4weDdGRkYpKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIFRJRkZSZWFkRGlyRW50cnlDaGVja1JhbmdlU3Nob3J0TG9uZzgodWludDY0IHZhbHVlKQoreworCWlmICh2YWx1ZT4weDdGRkYpCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyUmFuZ2UpOworCWVsc2UKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTc2hvcnRTbG9uZzgoaW50NjQgdmFsdWUpCit7CisJaWYgKCh2YWx1ZTwtMHg4MDAwKXx8KHZhbHVlPjB4N0ZGRikpCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyUmFuZ2UpOworCWVsc2UKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VMb25nU2J5dGUoaW50OCB2YWx1ZSkKK3sKKwlpZiAodmFsdWU8MCkKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJSYW5nZSk7CisJZWxzZQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmdTc2hvcnQoaW50MTYgdmFsdWUpCit7CisJaWYgKHZhbHVlPDApCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyUmFuZ2UpOworCWVsc2UKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKK3N0YXRpYyBlbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VMb25nU2xvbmcoaW50MzIgdmFsdWUpCit7CisJaWYgKHZhbHVlPDApCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyUmFuZ2UpOworCWVsc2UKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKKy8qCisgKiBMYXJnZXN0IDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlLgorICovCisjZGVmaW5lIFRJRkZfVUlOVDMyX01BWCAweEZGRkZGRkZGVQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyCitUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmdMb25nOCh1aW50NjQgdmFsdWUpCit7CisJaWYgKHZhbHVlID4gVElGRl9VSU5UMzJfTUFYKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyCitUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmdTbG9uZzgoaW50NjQgdmFsdWUpCit7CisJaWYgKCh2YWx1ZSA8IDApIHx8ICh2YWx1ZSA+IChpbnQ2NCkgVElGRl9VSU5UMzJfTUFYKSkKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJSYW5nZSk7CisJZWxzZQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworI3VuZGVmIFRJRkZfVUlOVDMyX01BWAorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyCitUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNsb25nTG9uZyh1aW50MzIgdmFsdWUpCit7CisJaWYgKHZhbHVlID4gMHg3RkZGRkZGRlVMKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCisvKiBDaGVjayB0aGF0IHRoZSA4LWJ5dGUgdW5zaWduZWQgdmFsdWUgY2FuIGZpdCBpbiBhIDQtYnl0ZSB1bnNpZ25lZCByYW5nZSAqLworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVycgorVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTbG9uZ0xvbmc4KHVpbnQ2NCB2YWx1ZSkKK3sKKwlpZiAodmFsdWUgPiAweDdGRkZGRkZGKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCisvKiBDaGVjayB0aGF0IHRoZSA4LWJ5dGUgc2lnbmVkIHZhbHVlIGNhbiBmaXQgaW4gYSA0LWJ5dGUgc2lnbmVkIHJhbmdlICovCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyCitUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZVNsb25nU2xvbmc4KGludDY0IHZhbHVlKQoreworICAgICAgICBpZiAoKHZhbHVlIDwgMC0oKGludDY0KSAweDdGRkZGRkZGKzEpKSB8fCAodmFsdWUgPiAweDdGRkZGRkZGKSkKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJSYW5nZSk7CisJZWxzZQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVycgorVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VMb25nOFNieXRlKGludDggdmFsdWUpCit7CisJaWYgKHZhbHVlIDwgMCkKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJSYW5nZSk7CisJZWxzZQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVycgorVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VMb25nOFNzaG9ydChpbnQxNiB2YWx1ZSkKK3sKKwlpZiAodmFsdWUgPCAwKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyCitUSUZGUmVhZERpckVudHJ5Q2hlY2tSYW5nZUxvbmc4U2xvbmcoaW50MzIgdmFsdWUpCit7CisJaWYgKHZhbHVlIDwgMCkKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJSYW5nZSk7CisJZWxzZQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVycgorVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VMb25nOFNsb25nOChpbnQ2NCB2YWx1ZSkKK3sKKwlpZiAodmFsdWUgPCAwKQorCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyclJhbmdlKTsKKwllbHNlCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyT2spOworfQorCisvKgorICogTGFyZ2VzdCA2NC1iaXQgc2lnbmVkIGludGVnZXIgdmFsdWUuCisgKi8KKyNkZWZpbmUgVElGRl9JTlQ2NF9NQVggKChpbnQ2NCkoKCh1aW50NjQpIH4wKSA+PiAxKSkKKworc3RhdGljIGVudW0gVElGRlJlYWREaXJFbnRyeUVycgorVElGRlJlYWREaXJFbnRyeUNoZWNrUmFuZ2VTbG9uZzhMb25nOCh1aW50NjQgdmFsdWUpCit7CisJaWYgKHZhbHVlID4gVElGRl9JTlQ2NF9NQVgpCisJCXJldHVybihUSUZGUmVhZERpckVudHJ5RXJyUmFuZ2UpOworCWVsc2UKKwkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJPayk7Cit9CisKKyN1bmRlZiBUSUZGX0lOVDY0X01BWAorCitzdGF0aWMgZW51bSBUSUZGUmVhZERpckVudHJ5RXJyCitUSUZGUmVhZERpckVudHJ5RGF0YShUSUZGKiB0aWYsIHVpbnQ2NCBvZmZzZXQsIHRtc2l6ZV90IHNpemUsIHZvaWQqIGRlc3QpCit7CisJYXNzZXJ0KHNpemU+MCk7CisJaWYgKCFpc01hcHBlZCh0aWYpKSB7CisJCWlmICghU2Vla09LKHRpZixvZmZzZXQpKQorCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJJbyk7CisJCWlmICghUmVhZE9LKHRpZixkZXN0LHNpemUpKQorCQkJcmV0dXJuKFRJRkZSZWFkRGlyRW50cnlFcnJJbyk7CisJfSBlbHNlIHsKKwkJc2l6ZV90IG1hLG1iOworCQltYT0oc2l6ZV90KW9mZnNldDsKKwkJbWI9bWErc2l6ZTsKKwkJaWYgKCgodWludDY0KW1hIT1vZmZzZXQpCisJCSAgICB8fCAobWIgPCBtYSkKKwkJICAgIHx8IChtYiAtIG1hICE9IChzaXplX3QpIHNpemUpCisJCSAgICB8fCAobWIgPCAoc2l6ZV90KXNpemUpCisJCSAgICB8fCAobWIgPiAoc2l6ZV90KXRpZi0+dGlmX3NpemUpCisJCSAgICApCisJCQlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVycklvKTsKKwkJX1RJRkZtZW1jcHkoZGVzdCx0aWYtPnRpZl9iYXNlK21hLHNpemUpOworCX0KKwlyZXR1cm4oVElGRlJlYWREaXJFbnRyeUVyck9rKTsKK30KKworc3RhdGljIHZvaWQgVElGRlJlYWREaXJFbnRyeU91dHB1dEVycihUSUZGKiB0aWYsIGVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnIsIGNvbnN0IGNoYXIqIG1vZHVsZSwgY29uc3QgY2hhciogdGFnbmFtZSwgaW50IHJlY292ZXIpCit7CisJaWYgKCFyZWNvdmVyKSB7CisJCXN3aXRjaCAoZXJyKSB7CisJCQljYXNlIFRJRkZSZWFkRGlyRW50cnlFcnJDb3VudDoKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCQkgICAgICJJbmNvcnJlY3QgY291bnQgZm9yIFwiJXNcIiIsCisJCQkJCSAgICAgdGFnbmFtZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRJRkZSZWFkRGlyRW50cnlFcnJUeXBlOgorCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJCSAgICAgIkluY29tcGF0aWJsZSB0eXBlIGZvciBcIiVzXCIiLAorCQkJCQkgICAgIHRhZ25hbWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBUSUZGUmVhZERpckVudHJ5RXJySW86CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkJICAgICAiSU8gZXJyb3IgZHVyaW5nIHJlYWRpbmcgb2YgXCIlc1wiIiwKKwkJCQkJICAgICB0YWduYW1lKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVElGRlJlYWREaXJFbnRyeUVyclJhbmdlOgorCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJCSAgICAgIkluY29ycmVjdCB2YWx1ZSBmb3IgXCIlc1wiIiwKKwkJCQkJICAgICB0YWduYW1lKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVElGRlJlYWREaXJFbnRyeUVyclBzZGlmOgorCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkiQ2Fubm90IGhhbmRsZSBkaWZmZXJlbnQgdmFsdWVzIHBlciBzYW1wbGUgZm9yIFwiJXNcIiIsCisJCQkJCSAgICAgdGFnbmFtZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRJRkZSZWFkRGlyRW50cnlFcnJTaXplc2FuOgorCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJIlNhbml0eSBjaGVjayBvbiBzaXplIG9mIFwiJXNcIiB2YWx1ZSBmYWlsZWQiLAorCQkJCQkgICAgIHRhZ25hbWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBUSUZGUmVhZERpckVudHJ5RXJyQWxsb2M6CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkJICAgICAiT3V0IG9mIG1lbW9yeSByZWFkaW5nIG9mIFwiJXNcIiIsCisJCQkJCSAgICAgdGFnbmFtZSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWFzc2VydCgwKTsgICAvKiB3ZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKi8KKwkJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAoZXJyKSB7CisJCQljYXNlIFRJRkZSZWFkRGlyRW50cnlFcnJDb3VudDoKKwkJCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJIkluY29ycmVjdCBjb3VudCBmb3IgXCIlc1wiOyB0YWcgaWdub3JlZCIsCisJCQkJCSAgICAgdGFnbmFtZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRJRkZSZWFkRGlyRW50cnlFcnJUeXBlOgorCQkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkiSW5jb21wYXRpYmxlIHR5cGUgZm9yIFwiJXNcIjsgdGFnIGlnbm9yZWQiLAorCQkJCQkgICAgICAgdGFnbmFtZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRJRkZSZWFkRGlyRW50cnlFcnJJbzoKKwkJCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkiSU8gZXJyb3IgZHVyaW5nIHJlYWRpbmcgb2YgXCIlc1wiOyB0YWcgaWdub3JlZCIsCisJCQkJCSAgICAgICB0YWduYW1lKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVElGRlJlYWREaXJFbnRyeUVyclJhbmdlOgorCQkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkiSW5jb3JyZWN0IHZhbHVlIGZvciBcIiVzXCI7IHRhZyBpZ25vcmVkIiwKKwkJCQkJICAgICAgIHRhZ25hbWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBUSUZGUmVhZERpckVudHJ5RXJyUHNkaWY6CisJCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCSJDYW5ub3QgaGFuZGxlIGRpZmZlcmVudCB2YWx1ZXMgcGVyIHNhbXBsZSBmb3IgXCIlc1wiOyB0YWcgaWdub3JlZCIsCisJCQkJCSAgICAgICB0YWduYW1lKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVElGRlJlYWREaXJFbnRyeUVyclNpemVzYW46CisJCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkiU2FuaXR5IGNoZWNrIG9uIHNpemUgb2YgXCIlc1wiIHZhbHVlIGZhaWxlZDsgdGFnIGlnbm9yZWQiLAorCQkJCQkgICAgICAgdGFnbmFtZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFRJRkZSZWFkRGlyRW50cnlFcnJBbGxvYzoKKwkJCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJIk91dCBvZiBtZW1vcnkgcmVhZGluZyBvZiBcIiVzXCI7IHRhZyBpZ25vcmVkIiwKKwkJCQkJICAgICAgIHRhZ25hbWUpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlhc3NlcnQoMCk7ICAgLyogd2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlICovCisJCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qCisgKiBSZWFkIHRoZSBuZXh0IFRJRkYgZGlyZWN0b3J5IGZyb20gYSBmaWxlIGFuZCBjb252ZXJ0IGl0IHRvIHRoZSBpbnRlcm5hbAorICogZm9ybWF0LiBXZSByZWFkIGRpcmVjdG9yaWVzIHNlcXVlbnRpYWxseS4KKyAqLworaW50CitUSUZGUmVhZERpcmVjdG9yeShUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRlJlYWREaXJlY3RvcnkiOworCVRJRkZEaXJFbnRyeSogZGlyOworCXVpbnQxNiBkaXJjb3VudDsKKwlUSUZGRGlyRW50cnkqIGRwOworCXVpbnQxNiBkaTsKKwljb25zdCBUSUZGRmllbGQqIGZpcDsKKwl1aW50MzIgZmlpPUZBSUxFRF9GSUk7CisgICAgICAgIHRvZmZfdCBuZXh0ZGlyb2ZmOworICAgIGludCBiaXRzcGVyc2FtcGxlX3JlYWQgPSBGQUxTRTsKKworCXRpZi0+dGlmX2Rpcm9mZj10aWYtPnRpZl9uZXh0ZGlyb2ZmOworCWlmICghVElGRkNoZWNrRGlyT2Zmc2V0KHRpZix0aWYtPnRpZl9uZXh0ZGlyb2ZmKSkKKwkJcmV0dXJuIDA7ICAgICAgICAgICAvKiBsYXN0IG9mZnNldCBvciBiYWQgb2Zmc2V0IChJRkQgbG9vcGluZykgKi8KKwkoKnRpZi0+dGlmX2NsZWFudXApKHRpZik7ICAgLyogY2xlYW51cCBhbnkgcHJldmlvdXMgY29tcHJlc3Npb24gc3RhdGUgKi8KKwl0aWYtPnRpZl9jdXJkaXIrKzsKKyAgICAgICAgbmV4dGRpcm9mZiA9IHRpZi0+dGlmX25leHRkaXJvZmY7CisJZGlyY291bnQ9VElGRkZldGNoRGlyZWN0b3J5KHRpZixuZXh0ZGlyb2ZmLCZkaXIsJnRpZi0+dGlmX25leHRkaXJvZmYpOworCWlmICghZGlyY291bnQpCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsCisJCSAgICAiRmFpbGVkIHRvIHJlYWQgZGlyZWN0b3J5IGF0IG9mZnNldCAiIFRJRkZfVUlOVDY0X0ZPUk1BVCxuZXh0ZGlyb2ZmKTsKKwkJcmV0dXJuIDA7CisJfQorCVRJRkZSZWFkRGlyZWN0b3J5Q2hlY2tPcmRlcih0aWYsZGlyLGRpcmNvdW50KTsKKworICAgICAgICAvKgorICAgICAgICAgKiBNYXJrIGR1cGxpY2F0ZXMgb2YgYW55IHRhZyB0byBiZSBpZ25vcmVkIChidWd6aWxsYSAxOTk0KQorICAgICAgICAgKiB0byBhdm9pZCBjZXJ0YWluIHBhdGhvbG9naWNhbCBwcm9ibGVtcy4KKyAgICAgICAgICovCisJeworCQlUSUZGRGlyRW50cnkqIG1hOworCQl1aW50MTYgbWI7CisJCWZvciAobWE9ZGlyLCBtYj0wOyBtYjxkaXJjb3VudDsgbWErKywgbWIrKykKKwkJeworCQkJVElGRkRpckVudHJ5KiBuYTsKKwkJCXVpbnQxNiBuYjsKKwkJCWZvciAobmE9bWErMSwgbmI9bWIrMTsgbmI8ZGlyY291bnQ7IG5hKyssIG5iKyspCisJCQl7CisJCQkJaWYgKG1hLT50ZGlyX3RhZz09bmEtPnRkaXJfdGFnKQorCQkJCQluYS0+dGRpcl90YWc9SUdOT1JFOworCQkJfQorCQl9CisJfQorICAgICAgICAKKwl0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9CRUVOV1JJVElORzsgICAgLyogcmVzZXQgYmVmb3JlIG5ldyBkaXIgKi8KKwl0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9CVUY0V1JJVEU7ICAgICAgLyogcmVzZXQgYmVmb3JlIG5ldyBkaXIgKi8KKwkvKiBmcmVlIGFueSBvbGQgc3R1ZmYgYW5kIHJlaW5pdCAqLworCVRJRkZGcmVlRGlyZWN0b3J5KHRpZik7CisJVElGRkRlZmF1bHREaXJlY3RvcnkodGlmKTsKKwkvKgorCSAqIEVsZWN0cm9uaWMgQXJ0cyB3cml0ZXMgZ3JheS1zY2FsZSBUSUZGIGZpbGVzCisJICogd2l0aG91dCBhIFBsYW5hckNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5IGVudHJ5LgorCSAqIFRodXMgd2Ugc2V0dXAgYSBkZWZhdWx0IHZhbHVlIGhlcmUsIGV2ZW4gdGhvdWdoCisJICogdGhlIFRJRkYgc3BlYyBzYXlzIHRoZXJlIGlzIG5vIGRlZmF1bHQgdmFsdWUuCisJICovCisJVElGRlNldEZpZWxkKHRpZixUSUZGVEFHX1BMQU5BUkNPTkZJRyxQTEFOQVJDT05GSUdfQ09OVElHKTsKKwkvKgorCSAqIFNldHVwIGRlZmF1bHQgdmFsdWUgYW5kIHRoZW4gbWFrZSBhIHBhc3Mgb3ZlcgorCSAqIHRoZSBmaWVsZHMgdG8gY2hlY2sgdHlwZSBhbmQgdGFnIGluZm9ybWF0aW9uLAorCSAqIGFuZCB0byBleHRyYWN0IGluZm8gcmVxdWlyZWQgdG8gc2l6ZSBkYXRhCisJICogc3RydWN0dXJlcy4gIEEgc2Vjb25kIHBhc3MgaXMgbWFkZSBhZnRlcndhcmRzCisJICogdG8gcmVhZCBpbiBldmVydGhpbmcgbm90IHRha2VuIGluIHRoZSBmaXJzdCBwYXNzLgorCSAqIEJ1dCB3ZSBtdXN0IHByb2Nlc3MgdGhlIENvbXByZXNzaW9uIHRhZyBmaXJzdAorCSAqIGluIG9yZGVyIHRvIG1lcmdlIGluIGNvZGVjLXByaXZhdGUgdGFnIGRlZmluaXRpb25zIChvdGhlcndpc2UKKwkgKiB3ZSBtYXkgZ2V0IGNvbXBsYWludHMgYWJvdXQgdW5rbm93biB0YWdzKS4gIEhvd2V2ZXIsIHRoZQorCSAqIENvbXByZXNzaW9uIHRhZyBtYXkgYmUgZGVwZW5kZW50IG9uIHRoZSBTYW1wbGVzUGVyUGl4ZWwKKwkgKiB0YWcgdmFsdWUgYmVjYXVzZSBvbGRlciBUSUZGIHNwZWNzIHBlcm1pdGVkIENvbXByZXNzaW9uCisJICogdG8gYmUgd3JpdHRlbiBhcyBhIFNhbXBsZXNQZXJQaXhlbC1jb3VudCB0YWcgZW50cnkuCisJICogVGh1cyBpZiB3ZSBkb24ndCBmaXJzdCBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0IFNhbXBsZXNQZXJQaXhlbAorCSAqIHRhZyB2YWx1ZSB0aGVuIHdlIG1heSBlbmQgdXAgaWdub3JpbmcgdGhlIENvbXByZXNzaW9uIHRhZworCSAqIHZhbHVlIGJlY2F1c2UgaXQgaGFzIGFuIGluY29ycmVjdCBjb3VudCB2YWx1ZSAoaWYgdGhlCisJICogdHJ1ZSB2YWx1ZSBvZiBTYW1wbGVzUGVyUGl4ZWwgaXMgbm90IDEpLgorCSAqLworCWRwPVRJRkZSZWFkRGlyZWN0b3J5RmluZEVudHJ5KHRpZixkaXIsZGlyY291bnQsVElGRlRBR19TQU1QTEVTUEVSUElYRUwpOworCWlmIChkcCkKKwl7CisJCWlmICghVElGRkZldGNoTm9ybWFsVGFnKHRpZixkcCwwKSkKKwkJCWdvdG8gYmFkOworCQlkcC0+dGRpcl90YWc9SUdOT1JFOworCX0KKwlkcD1USUZGUmVhZERpcmVjdG9yeUZpbmRFbnRyeSh0aWYsZGlyLGRpcmNvdW50LFRJRkZUQUdfQ09NUFJFU1NJT04pOworCWlmIChkcCkKKwl7CisJCS8qCisJCSAqIFRoZSA1LjAgc3BlYyBzYXlzIHRoZSBDb21wcmVzc2lvbiB0YWcgaGFzIG9uZSB2YWx1ZSwgd2hpbGUKKwkJICogZWFybGllciBzcGVjcyBzYXkgaXQgaGFzIG9uZSB2YWx1ZSBwZXIgc2FtcGxlLiAgQmVjYXVzZSBvZgorCQkgKiB0aGlzLCB3ZSBhY2NlcHQgdGhlIHRhZyBpZiBvbmUgdmFsdWUgaXMgc3VwcGxpZWQgd2l0aCBlaXRoZXIKKwkJICogY291bnQuCisJCSAqLworCQl1aW50MTYgdmFsdWU7CisJCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJCWVycj1USUZGUmVhZERpckVudHJ5U2hvcnQodGlmLGRwLCZ2YWx1ZSk7CisJCWlmIChlcnI9PVRJRkZSZWFkRGlyRW50cnlFcnJDb3VudCkKKwkJCWVycj1USUZGUmVhZERpckVudHJ5UGVyc2FtcGxlU2hvcnQodGlmLGRwLCZ2YWx1ZSk7CisJCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJeworCQkJVElGRlJlYWREaXJFbnRyeU91dHB1dEVycih0aWYsZXJyLG1vZHVsZSwiQ29tcHJlc3Npb24iLDApOworCQkJZ290byBiYWQ7CisJCX0KKwkJaWYgKCFUSUZGU2V0RmllbGQodGlmLFRJRkZUQUdfQ09NUFJFU1NJT04sdmFsdWUpKQorCQkJZ290byBiYWQ7CisJCWRwLT50ZGlyX3RhZz1JR05PUkU7CisJfQorCWVsc2UKKwl7CisJCWlmICghVElGRlNldEZpZWxkKHRpZixUSUZGVEFHX0NPTVBSRVNTSU9OLENPTVBSRVNTSU9OX05PTkUpKQorCQkJZ290byBiYWQ7CisJfQorCS8qCisJICogRmlyc3QgcmVhbCBwYXNzIG92ZXIgdGhlIGRpcmVjdG9yeS4KKwkgKi8KKwlmb3IgKGRpPTAsIGRwPWRpcjsgZGk8ZGlyY291bnQ7IGRpKyssIGRwKyspCisJeworCQlpZiAoZHAtPnRkaXJfdGFnIT1JR05PUkUpCisJCXsKKwkJCVRJRkZSZWFkRGlyZWN0b3J5RmluZEZpZWxkSW5mbyh0aWYsZHAtPnRkaXJfdGFnLCZmaWkpOworCQkJaWYgKGZpaSA9PSBGQUlMRURfRklJKQorCQkJeworCQkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkgICAgIlVua25vd24gZmllbGQgd2l0aCB0YWcgJWQgKDB4JXgpIGVuY291bnRlcmVkIiwKKwkJCQkgICAgZHAtPnRkaXJfdGFnLGRwLT50ZGlyX3RhZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBmb2xsb3dpbmcga25vd2luZ2x5IGxlYWtzIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5vbnltb3VzIGZpZWxkIHN0cnVjdHVyZSAqLworCQkJCWlmICghX1RJRkZNZXJnZUZpZWxkcyh0aWYsCisJCQkJCV9USUZGQ3JlYXRlQW5vbkZpZWxkKHRpZiwKKwkJCQkJCWRwLT50ZGlyX3RhZywKKwkJCQkJCShUSUZGRGF0YVR5cGUpIGRwLT50ZGlyX3R5cGUpLAorCQkJCQkxKSkgeworCQkJCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLAorCQkJCQkgICAgbW9kdWxlLAorCQkJCQkgICAgIlJlZ2lzdGVyaW5nIGFub255bW91cyBmaWVsZCB3aXRoIHRhZyAlZCAoMHgleCkgZmFpbGVkIiwKKwkJCQkJICAgIGRwLT50ZGlyX3RhZywKKwkJCQkJICAgIGRwLT50ZGlyX3RhZyk7CisJCQkJCWRwLT50ZGlyX3RhZz1JR05PUkU7CisJCQkJfSBlbHNlIHsKKwkJCQkJVElGRlJlYWREaXJlY3RvcnlGaW5kRmllbGRJbmZvKHRpZixkcC0+dGRpcl90YWcsJmZpaSk7CisJCQkJCWFzc2VydChmaWkgIT0gRkFJTEVEX0ZJSSk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChkcC0+dGRpcl90YWchPUlHTk9SRSkKKwkJeworCQkJZmlwPXRpZi0+dGlmX2ZpZWxkc1tmaWldOworCQkJaWYgKGZpcC0+ZmllbGRfYml0PT1GSUVMRF9JR05PUkUpCisJCQkJZHAtPnRkaXJfdGFnPUlHTk9SRTsKKwkJCWVsc2UKKwkJCXsKKwkJCQlzd2l0Y2ggKGRwLT50ZGlyX3RhZykKKwkJCQl7CisJCQkJCWNhc2UgVElGRlRBR19TVFJJUE9GRlNFVFM6CisJCQkJCWNhc2UgVElGRlRBR19TVFJJUEJZVEVDT1VOVFM6CisJCQkJCWNhc2UgVElGRlRBR19USUxFT0ZGU0VUUzoKKwkJCQkJY2FzZSBUSUZGVEFHX1RJTEVCWVRFQ09VTlRTOgorCQkJCQkJVElGRlNldEZpZWxkQml0KHRpZixmaXAtPmZpZWxkX2JpdCk7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBUSUZGVEFHX0lNQUdFV0lEVEg6CisJCQkJCWNhc2UgVElGRlRBR19JTUFHRUxFTkdUSDoKKwkJCQkJY2FzZSBUSUZGVEFHX0lNQUdFREVQVEg6CisJCQkJCWNhc2UgVElGRlRBR19USUxFTEVOR1RIOgorCQkJCQljYXNlIFRJRkZUQUdfVElMRVdJRFRIOgorCQkJCQljYXNlIFRJRkZUQUdfVElMRURFUFRIOgorCQkJCQljYXNlIFRJRkZUQUdfUExBTkFSQ09ORklHOgorCQkJCQljYXNlIFRJRkZUQUdfUk9XU1BFUlNUUklQOgorCQkJCQljYXNlIFRJRkZUQUdfRVhUUkFTQU1QTEVTOgorCQkJCQkJaWYgKCFUSUZGRmV0Y2hOb3JtYWxUYWcodGlmLGRwLDApKQorCQkJCQkJCWdvdG8gYmFkOworCQkJCQkJZHAtPnRkaXJfdGFnPUlHTk9SRTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqIFhYWDogT0pQRUcgaGFjay4KKwkgKiBJZiBhKSBjb21wcmVzc2lvbiBpcyBPSlBFRywgYikgcGxhbmFyY29uZmlnIHRhZyBzYXlzIGl0J3Mgc2VwYXJhdGUsCisJICogYykgc3RyaXAgb2Zmc2V0cy9ieXRlY291bnRzIHRhZyBhcmUgYm90aCBwcmVzZW50IGFuZAorCSAqIGQpIGJvdGggY29udGFpbiBleGFjdGx5IG9uZSB2YWx1ZSwgdGhlbiB3ZSBjb25zaXN0ZW50bHkgZmluZAorCSAqIHRoYXQgdGhlIGJ1Z2d5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBidWdneSBjb21wcmVzc2lvbiBzY2hlbWUKKwkgKiBtYXRjaGVzIGNvbnRpZyBwbGFuYXJjb25maWcgYmVzdC4gU28gd2UgJ2ZpeC11cCcgdGhlIHRhZyBoZXJlCisJICovCisJaWYgKCh0aWYtPnRpZl9kaXIudGRfY29tcHJlc3Npb249PUNPTVBSRVNTSU9OX09KUEVHKSYmCisJICAgICh0aWYtPnRpZl9kaXIudGRfcGxhbmFyY29uZmlnPT1QTEFOQVJDT05GSUdfU0VQQVJBVEUpKQorCXsKKyAgICAgICAgaWYgKCFfVElGRkZpbGxTdHJpbGVzKHRpZikpCisgICAgICAgICAgICBnb3RvIGJhZDsKKwkJZHA9VElGRlJlYWREaXJlY3RvcnlGaW5kRW50cnkodGlmLGRpcixkaXJjb3VudCxUSUZGVEFHX1NUUklQT0ZGU0VUUyk7CisJCWlmICgoZHAhPTApJiYoZHAtPnRkaXJfY291bnQ9PTEpKQorCQl7CisJCQlkcD1USUZGUmVhZERpcmVjdG9yeUZpbmRFbnRyeSh0aWYsZGlyLGRpcmNvdW50LAorCQkJICAgIFRJRkZUQUdfU1RSSVBCWVRFQ09VTlRTKTsKKwkJCWlmICgoZHAhPTApJiYoZHAtPnRkaXJfY291bnQ9PTEpKQorCQkJeworCQkJCXRpZi0+dGlmX2Rpci50ZF9wbGFuYXJjb25maWc9UExBTkFSQ09ORklHX0NPTlRJRzsKKwkJCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwKKwkJCQkgICAgIlBsYW5hcmNvbmZpZyB0YWcgdmFsdWUgYXNzdW1lZCBpbmNvcnJlY3QsICIKKwkJCQkgICAgImFzc3VtaW5nIGRhdGEgaXMgY29udGlnIGluc3RlYWQgb2YgY2h1bmt5Iik7CisJCQl9CisJCX0KKwl9CisJLyoKKwkgKiBBbGxvY2F0ZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGFuZCBzZXR1cCBkZWZhdWx0cy4KKwkgKi8KKwlpZiAoIVRJRkZGaWVsZFNldCh0aWYsRklFTERfSU1BR0VESU1FTlNJT05TKSkKKwl7CisJCU1pc3NpbmdSZXF1aXJlZCh0aWYsIkltYWdlTGVuZ3RoIik7CisJCWdvdG8gYmFkOworCX0KKwkvKgorCSAqIFNldHVwIGFwcHJvcHJpYXRlIHN0cnVjdHVyZXMgKGJ5IHN0cmlwIG9yIGJ5IHRpbGUpCisJICovCisJaWYgKCFUSUZGRmllbGRTZXQodGlmLCBGSUVMRF9USUxFRElNRU5TSU9OUykpIHsKKwkJdGlmLT50aWZfZGlyLnRkX25zdHJpcHMgPSBUSUZGTnVtYmVyT2ZTdHJpcHModGlmKTsgIAorCQl0aWYtPnRpZl9kaXIudGRfdGlsZXdpZHRoID0gdGlmLT50aWZfZGlyLnRkX2ltYWdld2lkdGg7CisJCXRpZi0+dGlmX2Rpci50ZF90aWxlbGVuZ3RoID0gdGlmLT50aWZfZGlyLnRkX3Jvd3NwZXJzdHJpcDsKKwkJdGlmLT50aWZfZGlyLnRkX3RpbGVkZXB0aCA9IHRpZi0+dGlmX2Rpci50ZF9pbWFnZWRlcHRoOworCQl0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9JU1RJTEVEOworCX0gZWxzZSB7CisJCXRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzID0gVElGRk51bWJlck9mVGlsZXModGlmKTsKKwkJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9JU1RJTEVEOworCX0KKwlpZiAoIXRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCSAgICAiQ2Fubm90IGhhbmRsZSB6ZXJvIG51bWJlciBvZiAlcyIsCisJCSAgICBpc1RpbGVkKHRpZikgPyAidGlsZXMiIDogInN0cmlwcyIpOworCQlnb3RvIGJhZDsKKwl9CisJdGlmLT50aWZfZGlyLnRkX3N0cmlwc3BlcmltYWdlID0gdGlmLT50aWZfZGlyLnRkX25zdHJpcHM7CisJaWYgKHRpZi0+dGlmX2Rpci50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX1NFUEFSQVRFKQorCQl0aWYtPnRpZl9kaXIudGRfc3RyaXBzcGVyaW1hZ2UgLz0gdGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbDsKKwlpZiAoIVRJRkZGaWVsZFNldCh0aWYsIEZJRUxEX1NUUklQT0ZGU0VUUykpIHsKKwkJaWYgKCh0aWYtPnRpZl9kaXIudGRfY29tcHJlc3Npb249PUNPTVBSRVNTSU9OX09KUEVHKSAmJgorCQkgICAgKGlzVGlsZWQodGlmKT09MCkgJiYKKwkJICAgICh0aWYtPnRpZl9kaXIudGRfbnN0cmlwcz09MSkpIHsKKwkJCS8qCisJCQkgKiBYWFg6IE9KUEVHIGhhY2suCisJCQkgKiBJZiBhKSBjb21wcmVzc2lvbiBpcyBPSlBFRywgYikgaXQncyBub3QgYSB0aWxlZCBUSUZGLAorCQkJICogYW5kIGMpIHRoZSBudW1iZXIgb2Ygc3RyaXBzIGlzIDEsCisJCQkgKiB0aGVuIHdlIHRvbGVyYXRlIHRoZSBhYnNlbmNlIG9mIHN0cmlwb2Zmc2V0cyB0YWcsCisJCQkgKiBiZWNhdXNlLCBwcmVzdW1hYmx5LCBhbGwgcmVxdWlyZWQgZGF0YSBpcyBpbiB0aGUKKwkJCSAqIEpwZWdJbnRlcmNoYW5nZUZvcm1hdCBzdHJlYW0uCisJCQkgKi8KKwkJCVRJRkZTZXRGaWVsZEJpdCh0aWYsIEZJRUxEX1NUUklQT0ZGU0VUUyk7CisJCX0gZWxzZSB7CisJCQlNaXNzaW5nUmVxdWlyZWQodGlmLAorCQkJCWlzVGlsZWQodGlmKSA/ICJUaWxlT2Zmc2V0cyIgOiAiU3RyaXBPZmZzZXRzIik7CisJCQlnb3RvIGJhZDsKKwkJfQorCX0KKwkvKgorCSAqIFNlY29uZCBwYXNzOiBleHRyYWN0IG90aGVyIGluZm9ybWF0aW9uLgorCSAqLworCWZvciAoZGk9MCwgZHA9ZGlyOyBkaTxkaXJjb3VudDsgZGkrKywgZHArKykKKwl7CisJCXN3aXRjaCAoZHAtPnRkaXJfdGFnKQorCQl7CisJCQljYXNlIElHTk9SRToKKwkJCQlicmVhazsKKwkJCWNhc2UgVElGRlRBR19NSU5TQU1QTEVWQUxVRToKKwkJCWNhc2UgVElGRlRBR19NQVhTQU1QTEVWQUxVRToKKwkJCWNhc2UgVElGRlRBR19CSVRTUEVSU0FNUExFOgorCQkJY2FzZSBUSUZGVEFHX0RBVEFUWVBFOgorCQkJY2FzZSBUSUZGVEFHX1NBTVBMRUZPUk1BVDoKKwkJCQkvKgorCQkJCSAqIFRoZSBNaW5TYW1wbGVWYWx1ZSwgTWF4U2FtcGxlVmFsdWUsIEJpdHNQZXJTYW1wbGUKKwkJCQkgKiBEYXRhVHlwZSBhbmQgU2FtcGxlRm9ybWF0IHRhZ3MgYXJlIHN1cHBvc2VkIHRvIGJlCisJCQkJICogd3JpdHRlbiBhcyBvbmUgdmFsdWUvc2FtcGxlLCBidXQgc29tZSB2ZW5kb3JzCisJCQkJICogaW5jb3JyZWN0bHkgd3JpdGUgb25lIHZhbHVlIG9ubHkgLS0gc28gd2UgYWNjZXB0CisJCQkJICogdGhhdCBhcyB3ZWxsICh5ZWNoKS4gT3RoZXIgdmVuZG9ycyB3cml0ZSBjb3JyZWN0CisJCQkJICogdmFsdWUgZm9yIE51bWJlck9mU2FtcGxlcywgYnV0IGluY29ycmVjdCBvbmUgZm9yCisJCQkJICogQml0c1BlclNhbXBsZSBhbmQgZnJpZW5kcywgYW5kIHdlIHdpbGwgcmVhZCB0aGlzCisJCQkJICogdG9vLgorCQkJCSAqLworCQkJCXsKKwkJCQkJdWludDE2IHZhbHVlOworCQkJCQllbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgZXJyOworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeVNob3J0KHRpZixkcCwmdmFsdWUpOworCQkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyQ291bnQpCisJCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeVBlcnNhbXBsZVNob3J0KHRpZixkcCwmdmFsdWUpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXsKKwkJCQkJCWZpcCA9IFRJRkZGaWVsZFdpdGhUYWcodGlmLGRwLT50ZGlyX3RhZyk7CisJCQkJCQlUSUZGUmVhZERpckVudHJ5T3V0cHV0RXJyKHRpZixlcnIsbW9kdWxlLGZpcCA/IGZpcC0+ZmllbGRfbmFtZSA6ICJ1bmtub3duIHRhZ25hbWUiLDApOworCQkJCQkJZ290byBiYWQ7CisJCQkJCX0KKwkJCQkJaWYgKCFUSUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZyx2YWx1ZSkpCisJCQkJCQlnb3RvIGJhZDsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGRwLT50ZGlyX3RhZyA9PSBUSUZGVEFHX0JJVFNQRVJTQU1QTEUgKQorICAgICAgICAgICAgICAgICAgICAgICAgYml0c3BlcnNhbXBsZV9yZWFkID0gVFJVRTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRJRkZUQUdfU01JTlNBTVBMRVZBTFVFOgorCQkJY2FzZSBUSUZGVEFHX1NNQVhTQU1QTEVWQUxVRToKKwkJCQl7CisKKwkJCQkJZG91YmxlICpkYXRhOworCQkJCQllbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgZXJyOworCQkJCQl1aW50MzIgc2F2ZWRfZmxhZ3M7CisJCQkJCWludCBtOworCQkJCQlpZiAoZHAtPnRkaXJfY291bnQgIT0gKHVpbnQ2NCl0aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsKQorCQkJCQkJZXJyID0gVElGRlJlYWREaXJFbnRyeUVyckNvdW50OworCQkJCQllbHNlCisJCQkJCQllcnIgPSBUSUZGUmVhZERpckVudHJ5RG91YmxlQXJyYXkodGlmLCBkcCwgJmRhdGEpOworCQkJCQlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXsKKwkJCQkJCWZpcCA9IFRJRkZGaWVsZFdpdGhUYWcodGlmLGRwLT50ZGlyX3RhZyk7CisJCQkJCQlUSUZGUmVhZERpckVudHJ5T3V0cHV0RXJyKHRpZixlcnIsbW9kdWxlLGZpcCA/IGZpcC0+ZmllbGRfbmFtZSA6ICJ1bmtub3duIHRhZ25hbWUiLDApOworCQkJCQkJZ290byBiYWQ7CisJCQkJCX0KKwkJCQkJc2F2ZWRfZmxhZ3MgPSB0aWYtPnRpZl9mbGFnczsKKwkJCQkJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9QRVJTQU1QTEU7CisJCQkJCW0gPSBUSUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZyxkYXRhKTsKKwkJCQkJdGlmLT50aWZfZmxhZ3MgPSBzYXZlZF9mbGFnczsKKwkJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCQlpZiAoIW0pCisJCQkJCQlnb3RvIGJhZDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRJRkZUQUdfU1RSSVBPRkZTRVRTOgorCQkJY2FzZSBUSUZGVEFHX1RJTEVPRkZTRVRTOgorI2lmIGRlZmluZWQoREVGRVJfU1RSSUxFX0xPQUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9USUZGbWVtY3B5KCAmKHRpZi0+dGlmX2Rpci50ZF9zdHJpcG9mZnNldF9lbnRyeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcCwgc2l6ZW9mKFRJRkZEaXJFbnRyeSkgKTsKKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQlpZiAoIVRJRkZGZXRjaFN0cmlwVGhpbmcodGlmLGRwLHRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzLCZ0aWYtPnRpZl9kaXIudGRfc3RyaXBvZmZzZXQpKSAgCisJCQkJCWdvdG8gYmFkOworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQlicmVhazsKKwkJCWNhc2UgVElGRlRBR19TVFJJUEJZVEVDT1VOVFM6CisJCQljYXNlIFRJRkZUQUdfVElMRUJZVEVDT1VOVFM6CisjaWYgZGVmaW5lZChERUZFUl9TVFJJTEVfTE9BRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RJRkZtZW1jcHkoICYodGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50X2VudHJ5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwLCBzaXplb2YoVElGRkRpckVudHJ5KSApOworI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCWlmICghVElGRkZldGNoU3RyaXBUaGluZyh0aWYsZHAsdGlmLT50aWZfZGlyLnRkX25zdHJpcHMsJnRpZi0+dGlmX2Rpci50ZF9zdHJpcGJ5dGVjb3VudCkpICAKKwkJCQkJZ290byBiYWQ7CisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCWJyZWFrOworCQkJY2FzZSBUSUZGVEFHX0NPTE9STUFQOgorCQkJY2FzZSBUSUZGVEFHX1RSQU5TRkVSRlVOQ1RJT046CisJCQkJeworCQkJCQllbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgZXJyOworCQkJCQl1aW50MzIgY291bnRwZXJzYW1wbGU7CisJCQkJCXVpbnQzMiBjb3VudHJlcXVpcmVkOworCQkJCQl1aW50MzIgaW5jcmVtZW50cGVyc2FtcGxlOworCQkJCQl1aW50MTYqIHZhbHVlPU5VTEw7CisgICAgICAgICAgICAgICAgICAgIC8qIEl0IHdvdWxkIGJlIGRhbmdlcm91cyB0byBpbnN0YW5jaWF0ZSB0aG9zZSB0YWcgdmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgIC8qIHNpbmNlIGlmIHRkX2JpdHNwZXJzYW1wbGUgaGFzIG5vdCB5ZXQgYmVlbiByZWFkIChkdWUgdG8gKi8KKyAgICAgICAgICAgICAgICAgICAgLyogdW5vcmRlcmVkIHRhZ3MpLCBpdCBjb3VsZCBiZSByZWFkIGFmdGVyd2FyZHMgd2l0aCBhICovCisgICAgICAgICAgICAgICAgICAgIC8qIHZhbHVlcyBncmVhdGVyIHRoYW4gdGhlIGRlZmF1bHQgb25lICgxKSwgd2hpY2ggbWF5IGNhdXNlICovCisgICAgICAgICAgICAgICAgICAgIC8qIGNyYXNoZXMgaW4gdXNlciBjb2RlICovCisgICAgICAgICAgICAgICAgICAgIGlmKCAhYml0c3BlcnNhbXBsZV9yZWFkICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlwID0gVElGRkZpZWxkV2l0aFRhZyh0aWYsZHAtPnRkaXJfdGFnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklnbm9yaW5nICVzIHNpbmNlIEJpdHNQZXJTYW1wbGUgdGFnIG5vdCBmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXAgPyBmaXAtPmZpZWxkX25hbWUgOiAidW5rbm93biB0YWduYW1lIik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCQkJCQljb3VudHBlcnNhbXBsZT0oMUw8PHRpZi0+dGlmX2Rpci50ZF9iaXRzcGVyc2FtcGxlKTsKKwkJCQkJaWYgKChkcC0+dGRpcl90YWc9PVRJRkZUQUdfVFJBTlNGRVJGVU5DVElPTikmJihkcC0+dGRpcl9jb3VudD09KHVpbnQ2NCljb3VudHBlcnNhbXBsZSkpCisJCQkJCXsKKwkJCQkJCWNvdW50cmVxdWlyZWQ9Y291bnRwZXJzYW1wbGU7CisJCQkJCQlpbmNyZW1lbnRwZXJzYW1wbGU9MDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWNvdW50cmVxdWlyZWQ9Mypjb3VudHBlcnNhbXBsZTsKKwkJCQkJCWluY3JlbWVudHBlcnNhbXBsZT1jb3VudHBlcnNhbXBsZTsKKwkJCQkJfQorCQkJCQlpZiAoZHAtPnRkaXJfY291bnQhPSh1aW50NjQpY291bnRyZXF1aXJlZCkKKwkJCQkJCWVycj1USUZGUmVhZERpckVudHJ5RXJyQ291bnQ7CisJCQkJCWVsc2UKKwkJCQkJCWVycj1USUZGUmVhZERpckVudHJ5U2hvcnRBcnJheSh0aWYsZHAsJnZhbHVlKTsKKwkJCQkJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQorICAgICAgICAgICAgICAgICAgICB7CisJCQkJCQlmaXAgPSBUSUZGRmllbGRXaXRoVGFnKHRpZixkcC0+dGRpcl90YWcpOworCQkJCQkJVElGRlJlYWREaXJFbnRyeU91dHB1dEVycih0aWYsZXJyLG1vZHVsZSxmaXAgPyBmaXAtPmZpZWxkX25hbWUgOiAidW5rbm93biB0YWduYW1lIiwxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCVRJRkZTZXRGaWVsZCh0aWYsZHAtPnRkaXJfdGFnLHZhbHVlLHZhbHVlK2luY3JlbWVudHBlcnNhbXBsZSx2YWx1ZSsyKmluY3JlbWVudHBlcnNhbXBsZSk7CisJCQkJCQlfVElGRmZyZWUodmFsdWUpOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworLyogQkVHSU4gUkVWIDQuMCBDT01QQVRJQklMSVRZICovCisJCQljYXNlIFRJRkZUQUdfT1NVQkZJTEVUWVBFOgorCQkJCXsKKwkJCQkJdWludDE2IHZhbHVlbzsKKwkJCQkJdWludDMyIHZhbHVlOworCQkJCQlpZiAoVElGRlJlYWREaXJFbnRyeVNob3J0KHRpZixkcCwmdmFsdWVvKT09VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQl7CisJCQkJCQlzd2l0Y2ggKHZhbHVlbykKKwkJCQkJCXsKKwkJCQkJCQljYXNlIE9GSUxFVFlQRV9SRURVQ0VESU1BR0U6IHZhbHVlPUZJTEVUWVBFX1JFRFVDRURJTUFHRTsgYnJlYWs7CisJCQkJCQkJY2FzZSBPRklMRVRZUEVfUEFHRTogdmFsdWU9RklMRVRZUEVfUEFHRTsgYnJlYWs7CisJCQkJCQkJZGVmYXVsdDogdmFsdWU9MDsgYnJlYWs7CisJCQkJCQl9CisJCQkJCQlpZiAodmFsdWUhPTApCisJCQkJCQkJVElGRlNldEZpZWxkKHRpZixUSUZGVEFHX1NVQkZJTEVUWVBFLHZhbHVlKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKy8qIEVORCBSRVYgNC4wIENPTVBBVElCSUxJVFkgKi8KKwkJCWRlZmF1bHQ6CisJCQkJKHZvaWQpIFRJRkZGZXRjaE5vcm1hbFRhZyh0aWYsIGRwLCBUUlVFKTsKKwkJCQlicmVhazsKKwkJfQorCX0KKwkvKgorCSAqIE9KUEVHIGhhY2s6CisJICogLSBJZiBhKSBjb21wcmVzc2lvbiBpcyBPSlBFRywgYW5kIGIpIHBob3RvbWV0cmljIHRhZyBpcyBtaXNzaW5nLAorCSAqIHRoZW4gd2UgY29uc2lzdGVudGx5IGZpbmQgdGhhdCBwaG90b21ldHJpYyBzaG91bGQgYmUgWUNiQ3IKKwkgKiAtIElmIGEpIGNvbXByZXNzaW9uIGlzIE9KUEVHLCBhbmQgYikgcGhvdG9tZXRyaWMgdGFnIHNheXMgaXQncyBSR0IsCisJICogdGhlbiB3ZSBjb25zaXN0ZW50bHkgZmluZCB0aGF0IHRoZSBidWdneSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKwkgKiBidWdneSBjb21wcmVzc2lvbiBzY2hlbWUgbWF0Y2hlcyBwaG90b21ldHJpYyBZQ2JDciBpbnN0ZWFkLgorCSAqIC0gSWYgYSkgY29tcHJlc3Npb24gaXMgT0pQRUcsIGFuZCBiKSBiaXRzcGVyc2FtcGxlIHRhZyBpcyBtaXNzaW5nLAorCSAqIHRoZW4gd2UgY29uc2lzdGVudGx5IGZpbmQgYml0c3BlcnNhbXBsZSBzaG91bGQgYmUgOC4KKwkgKiAtIElmIGEpIGNvbXByZXNzaW9uIGlzIE9KUEVHLCBiKSBzYW1wbGVzcGVycGl4ZWwgdGFnIGlzIG1pc3NpbmcsCisJICogYW5kIGMpIHBob3RvbWV0cmljIGlzIFJHQiBvciBZQ2JDciwgdGhlbiB3ZSBjb25zaXN0ZW50bHkgZmluZAorCSAqIHNhbXBsZXNwZXJwaXhlbCBzaG91bGQgYmUgMworCSAqIC0gSWYgYSkgY29tcHJlc3Npb24gaXMgT0pQRUcsIGIpIHNhbXBsZXNwZXJwaXhlbCB0YWcgaXMgbWlzc2luZywKKwkgKiBhbmQgYykgcGhvdG9tZXRyaWMgaXMgTUlOSVNXSElURSBvciBNSU5JU0JMQUNLLCB0aGVuIHdlIGNvbnNpc3RlbnRseQorCSAqIGZpbmQgc2FtcGxlc3BlcnBpeGVsIHNob3VsZCBiZSAzCisJICovCisJaWYgKHRpZi0+dGlmX2Rpci50ZF9jb21wcmVzc2lvbj09Q09NUFJFU1NJT05fT0pQRUcpCisJeworCQlpZiAoIVRJRkZGaWVsZFNldCh0aWYsRklFTERfUEhPVE9NRVRSSUMpKQorCQl7CisJCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgIlBob3RvbWV0cmljIHRhZyBpcyBtaXNzaW5nLCBhc3N1bWluZyBkYXRhIGlzIFlDYkNyIik7CisJCQlpZiAoIVRJRkZTZXRGaWVsZCh0aWYsVElGRlRBR19QSE9UT01FVFJJQyxQSE9UT01FVFJJQ19ZQ0JDUikpCisJCQkJZ290byBiYWQ7CisJCX0KKwkJZWxzZSBpZiAodGlmLT50aWZfZGlyLnRkX3Bob3RvbWV0cmljPT1QSE9UT01FVFJJQ19SR0IpCisJCXsKKwkJCXRpZi0+dGlmX2Rpci50ZF9waG90b21ldHJpYz1QSE9UT01FVFJJQ19ZQ0JDUjsKKwkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAiUGhvdG9tZXRyaWMgdGFnIHZhbHVlIGFzc3VtZWQgaW5jb3JyZWN0LCAiCisJCQkgICAgImFzc3VtaW5nIGRhdGEgaXMgWUNiQ3IgaW5zdGVhZCBvZiBSR0IiKTsKKwkJfQorCQlpZiAoIVRJRkZGaWVsZFNldCh0aWYsRklFTERfQklUU1BFUlNBTVBMRSkpCisJCXsKKwkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLAorCQkJICAgICJCaXRzUGVyU2FtcGxlIHRhZyBpcyBtaXNzaW5nLCBhc3N1bWluZyA4IGJpdHMgcGVyIHNhbXBsZSIpOworCQkJaWYgKCFUSUZGU2V0RmllbGQodGlmLFRJRkZUQUdfQklUU1BFUlNBTVBMRSw4KSkKKwkJCQlnb3RvIGJhZDsKKwkJfQorCQlpZiAoIVRJRkZGaWVsZFNldCh0aWYsRklFTERfU0FNUExFU1BFUlBJWEVMKSkKKwkJeworCQkJaWYgKHRpZi0+dGlmX2Rpci50ZF9waG90b21ldHJpYz09UEhPVE9NRVRSSUNfUkdCKQorCQkJeworCQkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLAorCQkJCSAgICAiU2FtcGxlc1BlclBpeGVsIHRhZyBpcyBtaXNzaW5nLCAiCisJCQkJICAgICJhc3N1bWluZyBjb3JyZWN0IFNhbXBsZXNQZXJQaXhlbCB2YWx1ZSBpcyAzIik7CisJCQkJaWYgKCFUSUZGU2V0RmllbGQodGlmLFRJRkZUQUdfU0FNUExFU1BFUlBJWEVMLDMpKQorCQkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlmICh0aWYtPnRpZl9kaXIudGRfcGhvdG9tZXRyaWM9PVBIT1RPTUVUUklDX1lDQkNSKQorCQkJeworCQkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLAorCQkJCSAgICAiU2FtcGxlc1BlclBpeGVsIHRhZyBpcyBtaXNzaW5nLCAiCisJCQkJICAgICJhcHBseWluZyBjb3JyZWN0IFNhbXBsZXNQZXJQaXhlbCB2YWx1ZSBvZiAzIik7CisJCQkJaWYgKCFUSUZGU2V0RmllbGQodGlmLFRJRkZUQUdfU0FNUExFU1BFUlBJWEVMLDMpKQorCQkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWVsc2UgaWYgKCh0aWYtPnRpZl9kaXIudGRfcGhvdG9tZXRyaWM9PVBIT1RPTUVUUklDX01JTklTV0hJVEUpCisJCQkJIHx8ICh0aWYtPnRpZl9kaXIudGRfcGhvdG9tZXRyaWM9PVBIT1RPTUVUUklDX01JTklTQkxBQ0spKQorCQkJeworCQkJCS8qCisJCQkJICogU2FtcGxlc1BlclBpeGVsIHRhZyBpcyBtaXNzaW5nLCBidXQgaXMgbm90IHJlcXVpcmVkCisJCQkJICogYnkgc3BlYy4gIEFzc3VtZSBjb3JyZWN0IFNhbXBsZXNQZXJQaXhlbCB2YWx1ZSBvZiAxLgorCQkJCSAqLworCQkJCWlmICghVElGRlNldEZpZWxkKHRpZixUSUZGVEFHX1NBTVBMRVNQRVJQSVhFTCwxKSkKKwkJCQkJZ290byBiYWQ7CisJCQl9CisJCX0KKwl9CisJLyoKKwkgKiBWZXJpZnkgUGFsZXR0ZSBpbWFnZSBoYXMgYSBDb2xvcm1hcC4KKwkgKi8KKwlpZiAodGlmLT50aWZfZGlyLnRkX3Bob3RvbWV0cmljID09IFBIT1RPTUVUUklDX1BBTEVUVEUgJiYKKwkgICAgIVRJRkZGaWVsZFNldCh0aWYsIEZJRUxEX0NPTE9STUFQKSkgeworCQlpZiAoIHRpZi0+dGlmX2Rpci50ZF9iaXRzcGVyc2FtcGxlPj04ICYmIHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWw9PTMpCisJCQl0aWYtPnRpZl9kaXIudGRfcGhvdG9tZXRyaWMgPSBQSE9UT01FVFJJQ19SR0I7CisJCWVsc2UgaWYgKHRpZi0+dGlmX2Rpci50ZF9iaXRzcGVyc2FtcGxlPj04KQorCQkJdGlmLT50aWZfZGlyLnRkX3Bob3RvbWV0cmljID0gUEhPVE9NRVRSSUNfTUlOSVNCTEFDSzsKKwkJZWxzZSB7CisJCQlNaXNzaW5nUmVxdWlyZWQodGlmLCAiQ29sb3JtYXAiKTsKKwkJCWdvdG8gYmFkOworCQl9CisJfQorCS8qCisJICogT0pQRUcgaGFjazoKKwkgKiBXZSBkbyBubyBmdXJ0aGVyIG1lc3Npbmcgd2l0aCBzdHJpcC90aWxlIG9mZnNldHMvYnl0ZWNvdW50cyBpbiBPSlBFRworCSAqIFRJRkZzCisJICovCisJaWYgKHRpZi0+dGlmX2Rpci50ZF9jb21wcmVzc2lvbiE9Q09NUFJFU1NJT05fT0pQRUcpCisJeworCQkvKgorCQkgKiBBdHRlbXB0IHRvIGRlYWwgd2l0aCBhIG1pc3NpbmcgU3RyaXBCeXRlQ291bnRzIHRhZy4KKwkJICovCisJCWlmICghVElGRkZpZWxkU2V0KHRpZiwgRklFTERfU1RSSVBCWVRFQ09VTlRTKSkgeworCQkJLyoKKwkJCSAqIFNvbWUgbWFudWZhY3R1cmVycyB2aW9sYXRlIHRoZSBzcGVjIGJ5IG5vdCBnaXZpbmcKKwkJCSAqIHRoZSBzaXplIG9mIHRoZSBzdHJpcHMuICBJbiB0aGlzIGNhc2UsIGFzc3VtZSB0aGVyZQorCQkJICogaXMgb25lIHVuY29tcHJlc3NlZCBzdHJpcCBvZiBkYXRhLgorCQkJICovCisJCQlpZiAoKHRpZi0+dGlmX2Rpci50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX0NPTlRJRyAmJgorCQkJICAgIHRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzID4gMSkgfHwKKwkJCSAgICAodGlmLT50aWZfZGlyLnRkX3BsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfU0VQQVJBVEUgJiYKKwkJCSAgICAgdGlmLT50aWZfZGlyLnRkX25zdHJpcHMgIT0gKHVpbnQzMil0aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsKSkgeworCQkJICAgIE1pc3NpbmdSZXF1aXJlZCh0aWYsICJTdHJpcEJ5dGVDb3VudHMiKTsKKwkJCSAgICBnb3RvIGJhZDsKKwkJCX0KKwkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkiVElGRiBkaXJlY3RvcnkgaXMgbWlzc2luZyByZXF1aXJlZCAiCisJCQkJIlwiU3RyaXBCeXRlQ291bnRzXCIgZmllbGQsIGNhbGN1bGF0aW5nIGZyb20gaW1hZ2VsZW5ndGgiKTsKKwkJCWlmIChFc3RpbWF0ZVN0cmlwQnl0ZUNvdW50cyh0aWYsIGRpciwgZGlyY291bnQpIDwgMCkKKwkJCSAgICBnb3RvIGJhZDsKKwkJLyoKKwkJICogQXNzdW1lIHdlIGhhdmUgd3JvbmcgU3RyaXBCeXRlQ291bnQgdmFsdWUgKGluIGNhc2UKKwkJICogb2Ygc2luZ2xlIHN0cmlwKSBpbiBmb2xsb3dpbmcgY2FzZXM6CisJCSAqICAgLSBpdCBpcyBlcXVhbCB0byB6ZXJvIGFsb25nIHdpdGggU3RyaXBPZmZzZXQ7CisJCSAqICAgLSBpdCBpcyBsYXJnZXIgdGhhbiBmaWxlIGl0c2VsZiAoaW4gY2FzZSBvZiB1bmNvbXByZXNzZWQKKwkJICogICAgIGltYWdlKTsKKwkJICogICAtIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgYnl0ZXMgcGVyIHJvdworCQkgKiAgICAgbXVsdGlwbGllZCBvbiB0aGUgbnVtYmVyIG9mIHJvd3MuICBUaGUgbGFzdCBjYXNlIHNob3VsZAorCQkgKiAgICAgbm90IGJlIGNoZWNrZWQgaW4gdGhlIGNhc2Ugb2Ygd3JpdGluZyBuZXcgaW1hZ2UsCisJCSAqICAgICBiZWNhdXNlIHdlIG1heSBkbyBub3Qga25vdyB0aGUgZXhhY3Qgc3RyaXAgc2l6ZQorCQkgKiAgICAgdW50aWwgdGhlIHdob2xlIGltYWdlIHdpbGwgYmUgd3JpdHRlbiBhbmQgZGlyZWN0b3J5CisJCSAqICAgICBkdW1wZWQgb3V0LgorCQkgKi8KKwkJI2RlZmluZQlCWVRFQ09VTlRMT09LU0JBRCBcCisJCSAgICAoICh0aWYtPnRpZl9kaXIudGRfc3RyaXBieXRlY291bnRbMF0gPT0gMCAmJiB0aWYtPnRpZl9kaXIudGRfc3RyaXBvZmZzZXRbMF0gIT0gMCkgfHwgXAorCQkgICAgICAodGlmLT50aWZfZGlyLnRkX2NvbXByZXNzaW9uID09IENPTVBSRVNTSU9OX05PTkUgJiYgXAorCQkgICAgICAgdGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50WzBdID4gVElGRkdldEZpbGVTaXplKHRpZikgLSB0aWYtPnRpZl9kaXIudGRfc3RyaXBvZmZzZXRbMF0pIHx8IFwKKwkJICAgICAgKHRpZi0+dGlmX21vZGUgPT0gT19SRE9OTFkgJiYgXAorCQkgICAgICAgdGlmLT50aWZfZGlyLnRkX2NvbXByZXNzaW9uID09IENPTVBSRVNTSU9OX05PTkUgJiYgXAorCQkgICAgICAgdGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50WzBdIDwgVElGRlNjYW5saW5lU2l6ZTY0KHRpZikgKiB0aWYtPnRpZl9kaXIudGRfaW1hZ2VsZW5ndGgpICkKKworCQl9IGVsc2UgaWYgKHRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIF9USUZGRmlsbFN0cmlsZXModGlmKQorCQkJICAgJiYgdGlmLT50aWZfZGlyLnRkX3N0cmlwb2Zmc2V0WzBdICE9IDAKKwkJCSAgICYmIEJZVEVDT1VOVExPT0tTQkFEKSB7CisJCQkvKgorCQkJICogWFhYOiBQbGV4dXMgKGFuZCBvdGhlcnMpIHNvbWV0aW1lcyBnaXZlIGEgdmFsdWUgb2YKKwkJCSAqIHplcm8gZm9yIGEgdGFnIHdoZW4gdGhleSBkb24ndCBrbm93IHdoYXQgdGhlCisJCQkgKiBjb3JyZWN0IHZhbHVlIGlzISAgVHJ5IGFuZCBoYW5kbGUgdGhlIHNpbXBsZSBjYXNlCisJCQkgKiBvZiBlc3RpbWF0aW5nIHRoZSBzaXplIG9mIGEgb25lIHN0cmlwIGltYWdlLgorCQkJICovCisJCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgIkJvZ3VzIFwiU3RyaXBCeXRlQ291bnRzXCIgZmllbGQsIGlnbm9yaW5nIGFuZCBjYWxjdWxhdGluZyBmcm9tIGltYWdlbGVuZ3RoIik7CisJCQlpZihFc3RpbWF0ZVN0cmlwQnl0ZUNvdW50cyh0aWYsIGRpciwgZGlyY291bnQpIDwgMCkKKwkJCSAgICBnb3RvIGJhZDsKKworI2lmICFkZWZpbmVkKERFRkVSX1NUUklMRV9MT0FEKQorCQl9IGVsc2UgaWYgKHRpZi0+dGlmX2Rpci50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX0NPTlRJRworCQkJICAgJiYgdGlmLT50aWZfZGlyLnRkX25zdHJpcHMgPiAyCisJCQkgICAmJiB0aWYtPnRpZl9kaXIudGRfY29tcHJlc3Npb24gPT0gQ09NUFJFU1NJT05fTk9ORQorCQkJICAgJiYgdGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50WzBdICE9IHRpZi0+dGlmX2Rpci50ZF9zdHJpcGJ5dGVjb3VudFsxXQorCQkJICAgJiYgdGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50WzBdICE9IDAKKwkJCSAgICYmIHRpZi0+dGlmX2Rpci50ZF9zdHJpcGJ5dGVjb3VudFsxXSAhPSAwICkgeworCQkJLyoKKwkJCSAqIFhYWDogU29tZSB2ZW5kb3JzIGZpbGwgU3RyaXBCeXRlQ291bnQgYXJyYXkgd2l0aAorCQkJICogYWJzb2x1dGVseSB3cm9uZyB2YWx1ZXMgKGl0IGNhbiBiZSBlcXVhbCB0bworCQkJICogU3RyaXBPZmZzZXQgYXJyYXksIGZvciBleGFtcGxlKS4gQ2F0Y2ggdGhpcyBjYXNlCisJCQkgKiBoZXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFdlIGF2b2lkIHRoaXMgY2hlY2sgaWYgZGVmZXJyaW5nIHN0cmlsZSBsb2FkaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBhcyBpdCB3b3VsZCBhbHdheXMgZm9yY2UgdXMgdG8gbG9hZCB0aGUgc3RyaXAvdGlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICogaW5mb3JtYXRpb24uCisJCQkgKi8KKwkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAiV3JvbmcgXCJTdHJpcEJ5dGVDb3VudHNcIiBmaWVsZCwgaWdub3JpbmcgYW5kIGNhbGN1bGF0aW5nIGZyb20gaW1hZ2VsZW5ndGgiKTsKKwkJCWlmIChFc3RpbWF0ZVN0cmlwQnl0ZUNvdW50cyh0aWYsIGRpciwgZGlyY291bnQpIDwgMCkKKwkJCSAgICBnb3RvIGJhZDsKKyNlbmRpZiAvKiAhZGVmaW5lZChERUZFUl9TVFJJTEVfTE9BRCkgKi8gICAgICAgICAgICAgICAgICAgICAgICAKKwkJfQorCX0KKwlpZiAoZGlyKQorCXsKKwkJX1RJRkZmcmVlKGRpcik7CisJCWRpcj1OVUxMOworCX0KKwlpZiAoIVRJRkZGaWVsZFNldCh0aWYsIEZJRUxEX01BWFNBTVBMRVZBTFVFKSkKKwl7CisJCWlmICh0aWYtPnRpZl9kaXIudGRfYml0c3BlcnNhbXBsZT49MTYpCisJCQl0aWYtPnRpZl9kaXIudGRfbWF4c2FtcGxldmFsdWU9MHhGRkZGOworCQllbHNlCisJCQl0aWYtPnRpZl9kaXIudGRfbWF4c2FtcGxldmFsdWUgPSAodWludDE2KSgoMUw8PHRpZi0+dGlmX2Rpci50ZF9iaXRzcGVyc2FtcGxlKS0xKTsKKwl9CisJLyoKKwkgKiBYWFg6IFdlIGNhbiBvcHRpbWl6ZSBjaGVja2luZyBmb3IgdGhlIHN0cmlwIGJvdW5kcyB1c2luZyB0aGUgc29ydGVkCisJICogYnl0ZWNvdW50cyBhcnJheS4gU2VlIGFsc28gY29tbWVudHMgZm9yIFRJRkZBcHBlbmRUb1N0cmlwKCkKKwkgKiBmdW5jdGlvbiBpbiB0aWZfd3JpdGUuYy4KKwkgKi8KKyNpZiAhZGVmaW5lZChERUZFUl9TVFJJTEVfTE9BRCkgICAgICAgIAorCWlmICh0aWYtPnRpZl9kaXIudGRfbnN0cmlwcyA+IDEpIHsKKwkJdWludDMyIHN0cmlwOworCisJCXRpZi0+dGlmX2Rpci50ZF9zdHJpcGJ5dGVjb3VudHNvcnRlZCA9IDE7CisJCWZvciAoc3RyaXAgPSAxOyBzdHJpcCA8IHRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzOyBzdHJpcCsrKSB7CisJCQlpZiAodGlmLT50aWZfZGlyLnRkX3N0cmlwb2Zmc2V0W3N0cmlwIC0gMV0gPgorCQkJICAgIHRpZi0+dGlmX2Rpci50ZF9zdHJpcG9mZnNldFtzdHJpcF0pIHsKKwkJCQl0aWYtPnRpZl9kaXIudGRfc3RyaXBieXRlY291bnRzb3J0ZWQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorI2VuZGlmIC8qICFkZWZpbmVkKERFRkVSX1NUUklMRV9MT0FEKSAqLworICAgICAgICAKKwkvKgorCSAqIEFuIG9wcG9ydHVuaXR5IGZvciBjb21wcmVzc2lvbiBtb2RlIGRlcGVuZGVudCB0YWcgZml4dXAKKwkgKi8KKwkoKnRpZi0+dGlmX2ZpeHVwdGFncykodGlmKTsKKworCS8qCisJICogU29tZSBtYW51ZmFjdHVyZXJzIG1ha2UgbGlmZSBkaWZmaWN1bHQgYnkgd3JpdGluZworCSAqIGxhcmdlIGFtb3VudHMgb2YgdW5jb21wcmVzc2VkIGRhdGEgYXMgYSBzaW5nbGUgc3RyaXAuCisJICogVGhpcyBpcyBjb250cmFyeSB0byB0aGUgcmVjb21tZW5kYXRpb25zIG9mIHRoZSBzcGVjLgorCSAqIFRoZSBmb2xsb3dpbmcgbWFrZXMgYW4gYXR0ZW1wdCBhdCBicmVha2luZyBzdWNoIGltYWdlcworCSAqIGludG8gc3RyaXBzIGNsb3NlciB0byB0aGUgcmVjb21tZW5kZWQgOGsgYnl0ZXMuICBBCisJICogc2lkZSBlZmZlY3QsIGhvd2V2ZXIsIGlzIHRoYXQgdGhlIFJvd3NQZXJTdHJpcCB0YWcKKwkgKiB2YWx1ZSBtYXkgYmUgY2hhbmdlZC4KKwkgKi8KKwlpZiAoKHRpZi0+dGlmX2Rpci50ZF9wbGFuYXJjb25maWc9PVBMQU5BUkNPTkZJR19DT05USUcpJiYKKwkgICAgKHRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzPT0xKSYmCisJICAgICh0aWYtPnRpZl9kaXIudGRfY29tcHJlc3Npb249PUNPTVBSRVNTSU9OX05PTkUpJiYgIAorCSAgICAoKHRpZi0+dGlmX2ZsYWdzJihUSUZGX1NUUklQQ0hPUHxUSUZGX0lTVElMRUQpKT09VElGRl9TVFJJUENIT1ApKQorICAgIHsKKyAgICAgICAgaWYgKCAhX1RJRkZGaWxsU3RyaWxlcyh0aWYpIHx8ICF0aWYtPnRpZl9kaXIudGRfc3RyaXBieXRlY291bnQgKQorICAgICAgICAgICAgcmV0dXJuIDA7CisJCUNob3BVcFNpbmdsZVVuY29tcHJlc3NlZFN0cmlwKHRpZik7CisgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIENsZWFyIHRoZSBkaXJ0eSBkaXJlY3RvcnkgZmxhZy4gCisgICAgICAgICAqLworCXRpZi0+dGlmX2ZsYWdzICY9IH5USUZGX0RJUlRZRElSRUNUOworCXRpZi0+dGlmX2ZsYWdzICY9IH5USUZGX0RJUlRZU1RSSVA7CisKKwkvKgorCSAqIFJlaW5pdGlhbGl6ZSBpL28gc2luY2Ugd2UgYXJlIHN0YXJ0aW5nIG9uIGEgbmV3IGRpcmVjdG9yeS4KKwkgKi8KKwl0aWYtPnRpZl9yb3cgPSAodWludDMyKSAtMTsKKwl0aWYtPnRpZl9jdXJzdHJpcCA9ICh1aW50MzIpIC0xOworCXRpZi0+dGlmX2NvbCA9ICh1aW50MzIpIC0xOworCXRpZi0+dGlmX2N1cnRpbGUgPSAodWludDMyKSAtMTsKKwl0aWYtPnRpZl90aWxlc2l6ZSA9ICh0bXNpemVfdCkgLTE7CisKKwl0aWYtPnRpZl9zY2FubGluZXNpemUgPSBUSUZGU2NhbmxpbmVTaXplKHRpZik7CisJaWYgKCF0aWYtPnRpZl9zY2FubGluZXNpemUpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJICAgICJDYW5ub3QgaGFuZGxlIHplcm8gc2NhbmxpbmUgc2l6ZSIpOworCQlyZXR1cm4gKDApOworCX0KKworCWlmIChpc1RpbGVkKHRpZikpIHsKKwkJdGlmLT50aWZfdGlsZXNpemUgPSBUSUZGVGlsZVNpemUodGlmKTsKKwkJaWYgKCF0aWYtPnRpZl90aWxlc2l6ZSkgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAgIkNhbm5vdCBoYW5kbGUgemVybyB0aWxlIHNpemUiKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIVRJRkZTdHJpcFNpemUodGlmKSkgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAiQ2Fubm90IGhhbmRsZSB6ZXJvIHN0cmlwIHNpemUiKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CisJcmV0dXJuICgxKTsKK2JhZDoKKwlpZiAoZGlyKQorCQlfVElGRmZyZWUoZGlyKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgdm9pZAorVElGRlJlYWREaXJlY3RvcnlDaGVja09yZGVyKFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiBkaXJjb3VudCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGUmVhZERpcmVjdG9yeUNoZWNrT3JkZXIiOworCXVpbnQxNiBtOworCXVpbnQxNiBuOworCVRJRkZEaXJFbnRyeSogbzsKKwltPTA7CisJZm9yIChuPTAsIG89ZGlyOyBuPGRpcmNvdW50OyBuKyssIG8rKykKKwl7CisJCWlmIChvLT50ZGlyX3RhZzxtKQorCQl7CisJCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwKKwkJCSAgICAiSW52YWxpZCBUSUZGIGRpcmVjdG9yeTsgdGFncyBhcmUgbm90IHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIiKTsKKwkJCWJyZWFrOworCQl9CisJCW09by0+dGRpcl90YWcrMTsKKwl9Cit9CisKK3N0YXRpYyBUSUZGRGlyRW50cnkqCitUSUZGUmVhZERpcmVjdG9yeUZpbmRFbnRyeShUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgZGlyY291bnQsIHVpbnQxNiB0YWdpZCkKK3sKKwlUSUZGRGlyRW50cnkqIG07CisJdWludDE2IG47CisJKHZvaWQpIHRpZjsKKwlmb3IgKG09ZGlyLCBuPTA7IG48ZGlyY291bnQ7IG0rKywgbisrKQorCXsKKwkJaWYgKG0tPnRkaXJfdGFnPT10YWdpZCkKKwkJCXJldHVybihtKTsKKwl9CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgdm9pZAorVElGRlJlYWREaXJlY3RvcnlGaW5kRmllbGRJbmZvKFRJRkYqIHRpZiwgdWludDE2IHRhZ2lkLCB1aW50MzIqIGZpaSkKK3sKKwlpbnQzMiBtYSxtYixtYzsKKwltYT0tMTsKKwltYz0oaW50MzIpdGlmLT50aWZfbmZpZWxkczsKKwl3aGlsZSAoMSkKKwl7CisJCWlmIChtYSsxPT1tYykKKwkJeworCQkJKmZpaSA9IEZBSUxFRF9GSUk7CisJCQlyZXR1cm47CisJCX0KKwkJbWI9KG1hK21jKS8yOworCQlpZiAodGlmLT50aWZfZmllbGRzW21iXS0+ZmllbGRfdGFnPT0odWludDMyKXRhZ2lkKQorCQkJYnJlYWs7CisJCWlmICh0aWYtPnRpZl9maWVsZHNbbWJdLT5maWVsZF90YWc8KHVpbnQzMil0YWdpZCkKKwkJCW1hPW1iOworCQllbHNlCisJCQltYz1tYjsKKwl9CisJd2hpbGUgKDEpCisJeworCQlpZiAobWI9PTApCisJCQlicmVhazsKKwkJaWYgKHRpZi0+dGlmX2ZpZWxkc1ttYi0xXS0+ZmllbGRfdGFnIT0odWludDMyKXRhZ2lkKQorCQkJYnJlYWs7CisJCW1iLS07CisJfQorCSpmaWk9bWI7Cit9CisKKy8qCisgKiBSZWFkIGN1c3RvbSBkaXJlY3RvcnkgZnJvbSB0aGUgYXJiaXRhcnJ5IG9mZnNldC4KKyAqIFRoZSBjb2RlIGlzIHZlcnkgc2ltaWxhciB0byBUSUZGUmVhZERpcmVjdG9yeSgpLgorICovCitpbnQKK1RJRkZSZWFkQ3VzdG9tRGlyZWN0b3J5KFRJRkYqIHRpZiwgdG9mZl90IGRpcm9mZiwKKwkJCWNvbnN0IFRJRkZGaWVsZEFycmF5KiBpbmZvYXJyYXkpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRlJlYWRDdXN0b21EaXJlY3RvcnkiOworCVRJRkZEaXJFbnRyeSogZGlyOworCXVpbnQxNiBkaXJjb3VudDsKKwlUSUZGRGlyRW50cnkqIGRwOworCXVpbnQxNiBkaTsKKwljb25zdCBUSUZGRmllbGQqIGZpcDsKKwl1aW50MzIgZmlpOworCV9USUZGU2V0dXBGaWVsZHModGlmLCBpbmZvYXJyYXkpOworCWRpcmNvdW50PVRJRkZGZXRjaERpcmVjdG9yeSh0aWYsZGlyb2ZmLCZkaXIsTlVMTCk7CisJaWYgKCFkaXJjb3VudCkKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwKKwkJICAgICJGYWlsZWQgdG8gcmVhZCBjdXN0b20gZGlyZWN0b3J5IGF0IG9mZnNldCAiIFRJRkZfVUlOVDY0X0ZPUk1BVCxkaXJvZmYpOworCQlyZXR1cm4gMDsKKwl9CisJVElGRkZyZWVEaXJlY3RvcnkodGlmKTsKKwlfVElGRm1lbXNldCgmdGlmLT50aWZfZGlyLCAwLCBzaXplb2YoVElGRkRpcmVjdG9yeSkpOworCVRJRkZSZWFkRGlyZWN0b3J5Q2hlY2tPcmRlcih0aWYsZGlyLGRpcmNvdW50KTsKKwlmb3IgKGRpPTAsIGRwPWRpcjsgZGk8ZGlyY291bnQ7IGRpKyssIGRwKyspCisJeworCQlUSUZGUmVhZERpcmVjdG9yeUZpbmRGaWVsZEluZm8odGlmLGRwLT50ZGlyX3RhZywmZmlpKTsKKwkJaWYgKGZpaSA9PSBGQUlMRURfRklJKQorCQl7CisJCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgIlVua25vd24gZmllbGQgd2l0aCB0YWcgJWQgKDB4JXgpIGVuY291bnRlcmVkIiwKKwkJCSAgICBkcC0+dGRpcl90YWcsIGRwLT50ZGlyX3RhZyk7CisJCQlpZiAoIV9USUZGTWVyZ2VGaWVsZHModGlmLCBfVElGRkNyZWF0ZUFub25GaWVsZCh0aWYsCisJCQkJCQlkcC0+dGRpcl90YWcsCisJCQkJCQkoVElGRkRhdGFUeXBlKSBkcC0+dGRpcl90eXBlKSwKKwkJCQkJICAgICAxKSkgeworCQkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkgICAgIlJlZ2lzdGVyaW5nIGFub255bW91cyBmaWVsZCB3aXRoIHRhZyAlZCAoMHgleCkgZmFpbGVkIiwKKwkJCQkgICAgZHAtPnRkaXJfdGFnLCBkcC0+dGRpcl90YWcpOworCQkJCWRwLT50ZGlyX3RhZz1JR05PUkU7CisJCQl9IGVsc2UgeworCQkJCVRJRkZSZWFkRGlyZWN0b3J5RmluZEZpZWxkSW5mbyh0aWYsZHAtPnRkaXJfdGFnLCZmaWkpOworCQkJCWFzc2VydCggZmlpICE9IEZBSUxFRF9GSUkgKTsKKwkJCX0KKwkJfQorCQlpZiAoZHAtPnRkaXJfdGFnIT1JR05PUkUpCisJCXsKKwkJCWZpcD10aWYtPnRpZl9maWVsZHNbZmlpXTsKKwkJCWlmIChmaXAtPmZpZWxkX2JpdD09RklFTERfSUdOT1JFKQorCQkJCWRwLT50ZGlyX3RhZz1JR05PUkU7CisJCQllbHNlCisJCQl7CisJCQkJLyogY2hlY2sgZGF0YSB0eXBlICovCisJCQkJd2hpbGUgKChmaXAtPmZpZWxkX3R5cGUhPVRJRkZfQU5ZKSYmKGZpcC0+ZmllbGRfdHlwZSE9ZHAtPnRkaXJfdHlwZSkpCisJCQkJeworCQkJCQlmaWkrKzsKKwkJCQkJaWYgKChmaWk9PXRpZi0+dGlmX25maWVsZHMpfHwKKwkJCQkJICAgICh0aWYtPnRpZl9maWVsZHNbZmlpXS0+ZmllbGRfdGFnIT0odWludDMyKWRwLT50ZGlyX3RhZykpCisJCQkJCXsKKwkJCQkJCWZpaT0weEZGRkY7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlmaXA9dGlmLT50aWZfZmllbGRzW2ZpaV07CisJCQkJfQorCQkJCWlmIChmaWk9PTB4RkZGRikKKwkJCQl7CisJCQkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkJICAgICJXcm9uZyBkYXRhIHR5cGUgJWQgZm9yIFwiJXNcIjsgdGFnIGlnbm9yZWQiLAorCQkJCQkgICAgZHAtPnRkaXJfdHlwZSxmaXAtPmZpZWxkX25hbWUpOworCQkJCQlkcC0+dGRpcl90YWc9SUdOT1JFOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvKiBjaGVjayBjb3VudCBpZiBrbm93biBpbiBhZHZhbmNlICovCisJCQkJCWlmICgoZmlwLT5maWVsZF9yZWFkY291bnQhPVRJRkZfVkFSSUFCTEUpJiYKKwkJCQkJICAgIChmaXAtPmZpZWxkX3JlYWRjb3VudCE9VElGRl9WQVJJQUJMRTIpKQorCQkJCQl7CisJCQkJCQl1aW50MzIgZXhwZWN0ZWQ7CisJCQkJCQlpZiAoZmlwLT5maWVsZF9yZWFkY291bnQ9PVRJRkZfU1BQKQorCQkJCQkJCWV4cGVjdGVkPSh1aW50MzIpdGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbDsKKwkJCQkJCWVsc2UKKwkJCQkJCQlleHBlY3RlZD0odWludDMyKWZpcC0+ZmllbGRfcmVhZGNvdW50OworCQkJCQkJaWYgKCFDaGVja0RpckNvdW50KHRpZixkcCxleHBlY3RlZCkpCisJCQkJCQkJZHAtPnRkaXJfdGFnPUlHTk9SRTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXN3aXRjaCAoZHAtPnRkaXJfdGFnKQorCQkJeworCQkJCWNhc2UgSUdOT1JFOgorCQkJCQlicmVhazsKKwkJCQljYXNlIEVYSUZUQUdfU1VCSkVDVERJU1RBTkNFOgorCQkJCQkodm9pZCkgVElGRkZldGNoU3ViamVjdERpc3RhbmNlKHRpZixkcCk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCSh2b2lkKSBUSUZGRmV0Y2hOb3JtYWxUYWcodGlmLCBkcCwgVFJVRSk7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWlmIChkaXIpCisJCV9USUZGZnJlZShkaXIpOworCXJldHVybiAxOworfQorCisvKgorICogRVhJRiBpcyBpbXBvcnRhbnQgc3BlY2lhbCBjYXNlIG9mIGN1c3RvbSBJRkQsIHNvIHdlIGhhdmUgYSBzcGVjaWFsCisgKiBmdW5jdGlvbiB0byByZWFkIGl0LgorICovCitpbnQKK1RJRkZSZWFkRVhJRkRpcmVjdG9yeShUSUZGKiB0aWYsIHRvZmZfdCBkaXJvZmYpCit7CisJY29uc3QgVElGRkZpZWxkQXJyYXkqIGV4aWZGaWVsZEFycmF5OworCWV4aWZGaWVsZEFycmF5ID0gX1RJRkZHZXRFeGlmRmllbGRzKCk7CisJcmV0dXJuIFRJRkZSZWFkQ3VzdG9tRGlyZWN0b3J5KHRpZiwgZGlyb2ZmLCBleGlmRmllbGRBcnJheSk7ICAKK30KKworc3RhdGljIGludAorRXN0aW1hdGVTdHJpcEJ5dGVDb3VudHMoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IGRpcmNvdW50KQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIkVzdGltYXRlU3RyaXBCeXRlQ291bnRzIjsKKworCVRJRkZEaXJFbnRyeSAqZHA7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCXVpbnQzMiBzdHJpcDsKKworICAgIGlmKCAhX1RJRkZGaWxsU3RyaWxlcyggdGlmICkgKQorICAgICAgICByZXR1cm4gLTE7CisKKwlpZiAodGQtPnRkX3N0cmlwYnl0ZWNvdW50KQorCQlfVElGRmZyZWUodGQtPnRkX3N0cmlwYnl0ZWNvdW50KTsKKwl0ZC0+dGRfc3RyaXBieXRlY291bnQgPSAodWludDY0KikKKwkgICAgX1RJRkZDaGVja01hbGxvYyh0aWYsIHRkLT50ZF9uc3RyaXBzLCBzaXplb2YgKHVpbnQ2NCksCisJCSJmb3IgXCJTdHJpcEJ5dGVDb3VudHNcIiBhcnJheSIpOworICAgICAgICBpZiggdGQtPnRkX3N0cmlwYnl0ZWNvdW50ID09IE5VTEwgKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisJaWYgKHRkLT50ZF9jb21wcmVzc2lvbiAhPSBDT01QUkVTU0lPTl9OT05FKSB7CisJCXVpbnQ2NCBzcGFjZTsKKwkJdWludDY0IGZpbGVzaXplOworCQl1aW50MTYgbjsKKwkJZmlsZXNpemUgPSBUSUZGR2V0RmlsZVNpemUodGlmKTsKKwkJaWYgKCEodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKSkKKwkJCXNwYWNlPXNpemVvZihUSUZGSGVhZGVyQ2xhc3NpYykrMitkaXJjb3VudCoxMis0OworCQllbHNlCisJCQlzcGFjZT1zaXplb2YoVElGRkhlYWRlckJpZykrOCtkaXJjb3VudCoyMCs4OworCQkvKiBjYWxjdWxhdGUgYW1vdW50IG9mIHNwYWNlIHVzZWQgYnkgaW5kaXJlY3QgdmFsdWVzICovCisJCWZvciAoZHAgPSBkaXIsIG4gPSBkaXJjb3VudDsgbiA+IDA7IG4tLSwgZHArKykKKwkJeworCQkJdWludDMyIHR5cGV3aWR0aCA9IFRJRkZEYXRhV2lkdGgoKFRJRkZEYXRhVHlwZSkgZHAtPnRkaXJfdHlwZSk7CisJCQl1aW50NjQgZGF0YXNpemU7CisJCQl0eXBld2lkdGggPSBUSUZGRGF0YVdpZHRoKChUSUZGRGF0YVR5cGUpIGRwLT50ZGlyX3R5cGUpOworCQkJaWYgKHR5cGV3aWR0aCA9PSAwKSB7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkgICAgIkNhbm5vdCBkZXRlcm1pbmUgc2l6ZSBvZiB1bmtub3duIHRhZyB0eXBlICVkIiwKKwkJCQkgICAgZHAtPnRkaXJfdHlwZSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJZGF0YXNpemU9KHVpbnQ2NCl0eXBld2lkdGgqZHAtPnRkaXJfY291bnQ7CisJCQlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCQkJeworCQkJCWlmIChkYXRhc2l6ZTw9NCkKKwkJCQkJZGF0YXNpemU9MDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoZGF0YXNpemU8PTgpCisJCQkJCWRhdGFzaXplPTA7CisJCQl9CisJCQlzcGFjZSs9ZGF0YXNpemU7CisJCX0KKwkJc3BhY2UgPSBmaWxlc2l6ZSAtIHNwYWNlOworCQlpZiAodGQtPnRkX3BsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfU0VQQVJBVEUpCisJCQlzcGFjZSAvPSB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsOworCQlmb3IgKHN0cmlwID0gMDsgc3RyaXAgPCB0ZC0+dGRfbnN0cmlwczsgc3RyaXArKykKKwkJCXRkLT50ZF9zdHJpcGJ5dGVjb3VudFtzdHJpcF0gPSBzcGFjZTsKKwkJLyoKKwkJICogVGhpcyBncm9zcyBoYWNrIGhhbmRsZXMgdGhlIGNhc2Ugd2VyZSB0aGUgb2Zmc2V0IHRvCisJCSAqIHRoZSBsYXN0IHN0cmlwIGlzIHBhc3QgdGhlIHBsYWNlIHdoZXJlIHdlIHRoaW5rIHRoZSBzdHJpcAorCQkgKiBzaG91bGQgYmVnaW4uICBTaW5jZSBhIHN0cmlwIG9mIGRhdGEgbXVzdCBiZSBjb250aWd1b3VzLAorCQkgKiBpdCdzIHNhZmUgdG8gYXNzdW1lIHRoYXQgd2UndmUgb3ZlcmVzdGltYXRlZCB0aGUgYW1vdW50CisJCSAqIG9mIGRhdGEgaW4gdGhlIHN0cmlwIGFuZCB0cmltIHRoaXMgbnVtYmVyIGJhY2sgYWNjb3JkaW5nbHkuCisJCSAqLworCQlzdHJpcC0tOworCQlpZiAodGQtPnRkX3N0cmlwb2Zmc2V0W3N0cmlwXSt0ZC0+dGRfc3RyaXBieXRlY291bnRbc3RyaXBdID4gZmlsZXNpemUpCisJCQl0ZC0+dGRfc3RyaXBieXRlY291bnRbc3RyaXBdID0gZmlsZXNpemUgLSB0ZC0+dGRfc3RyaXBvZmZzZXRbc3RyaXBdOworCX0gZWxzZSBpZiAoaXNUaWxlZCh0aWYpKSB7CisJCXVpbnQ2NCBieXRlc3BlcnRpbGUgPSBUSUZGVGlsZVNpemU2NCh0aWYpOworCisJCWZvciAoc3RyaXAgPSAwOyBzdHJpcCA8IHRkLT50ZF9uc3RyaXBzOyBzdHJpcCsrKQorCQkgICAgdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3N0cmlwXSA9IGJ5dGVzcGVydGlsZTsKKwl9IGVsc2UgeworCQl1aW50NjQgcm93Ynl0ZXMgPSBUSUZGU2NhbmxpbmVTaXplNjQodGlmKTsKKwkJdWludDMyIHJvd3NwZXJzdHJpcCA9IHRkLT50ZF9pbWFnZWxlbmd0aC90ZC0+dGRfc3RyaXBzcGVyaW1hZ2U7CisJCWZvciAoc3RyaXAgPSAwOyBzdHJpcCA8IHRkLT50ZF9uc3RyaXBzOyBzdHJpcCsrKQorCQkJdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3N0cmlwXSA9IHJvd2J5dGVzICogcm93c3BlcnN0cmlwOworCX0KKwlUSUZGU2V0RmllbGRCaXQodGlmLCBGSUVMRF9TVFJJUEJZVEVDT1VOVFMpOworCWlmICghVElGRkZpZWxkU2V0KHRpZiwgRklFTERfUk9XU1BFUlNUUklQKSkKKwkJdGQtPnRkX3Jvd3NwZXJzdHJpcCA9IHRkLT50ZF9pbWFnZWxlbmd0aDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK01pc3NpbmdSZXF1aXJlZChUSUZGKiB0aWYsIGNvbnN0IGNoYXIqIHRhZ25hbWUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiTWlzc2luZ1JlcXVpcmVkIjsKKworCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJICAgICJUSUZGIGRpcmVjdG9yeSBpcyBtaXNzaW5nIHJlcXVpcmVkIFwiJXNcIiBmaWVsZCIsCisJICAgIHRhZ25hbWUpOworfQorCisvKgorICogQ2hlY2sgdGhlIGRpcmVjdG9yeSBvZmZzZXQgYWdhaW5zdCB0aGUgbGlzdCBvZiBhbHJlYWR5IHNlZW4gZGlyZWN0b3J5CisgKiBvZmZzZXRzLiBUaGlzIGlzIGEgdHJpY2sgdG8gcHJldmVudCBJRkQgbG9vcGluZy4gVGhlIG9uZSBjYW4gY3JlYXRlIFRJRkYKKyAqIGZpbGUgd2l0aCBsb29wZWQgZGlyZWN0b3J5IHBvaW50ZXJzLiBXZSB3aWxsIG1haW50YWluIGEgbGlzdCBvZiBhbHJlYWR5CisgKiBzZWVuIGRpcmVjdG9yaWVzIGFuZCBjaGVjayBldmVyeSBJRkQgb2Zmc2V0IGFnYWluc3QgdGhhdCBsaXN0LgorICovCitzdGF0aWMgaW50CitUSUZGQ2hlY2tEaXJPZmZzZXQoVElGRiogdGlmLCB1aW50NjQgZGlyb2ZmKQoreworCXVpbnQxNiBuOworCisJaWYgKGRpcm9mZiA9PSAwKQkJCS8qIG5vIG1vcmUgZGlyZWN0b3JpZXMgKi8KKwkJcmV0dXJuIDA7CisJaWYgKHRpZi0+dGlmX2Rpcm51bWJlciA9PSA2NTUzNSkgeworCSAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgIlRJRkZDaGVja0Rpck9mZnNldCIsCisJCQkgIkNhbm5vdCBoYW5kbGUgbW9yZSB0aGFuIDY1NTM1IFRJRkYgZGlyZWN0b3JpZXMiKTsKKwkgICAgcmV0dXJuIDA7CisJfQorCisJZm9yIChuID0gMDsgbiA8IHRpZi0+dGlmX2Rpcm51bWJlciAmJiB0aWYtPnRpZl9kaXJsaXN0OyBuKyspIHsKKwkJaWYgKHRpZi0+dGlmX2Rpcmxpc3Rbbl0gPT0gZGlyb2ZmKQorCQkJcmV0dXJuIDA7CisJfQorCisJdGlmLT50aWZfZGlybnVtYmVyKys7CisKKwlpZiAodGlmLT50aWZfZGlybnVtYmVyID4gdGlmLT50aWZfZGlybGlzdHNpemUpIHsKKwkJdWludDY0KiBuZXdfZGlybGlzdDsKKworCQkvKgorCQkgKiBYWFg6IFJlZHVjZSBtZW1vcnkgYWxsb2NhdGlvbiBncmFudWxhcml0eSBvZiB0aGUgZGlybGlzdAorCQkgKiBhcnJheS4KKwkJICovCisJCW5ld19kaXJsaXN0ID0gKHVpbnQ2NCopX1RJRkZDaGVja1JlYWxsb2ModGlmLCB0aWYtPnRpZl9kaXJsaXN0LAorCQkgICAgdGlmLT50aWZfZGlybnVtYmVyLCAyICogc2l6ZW9mKHVpbnQ2NCksICJmb3IgSUZEIGxpc3QiKTsKKwkJaWYgKCFuZXdfZGlybGlzdCkKKwkJCXJldHVybiAwOworCQlpZiggdGlmLT50aWZfZGlybnVtYmVyID49IDMyNzY4ICkKKwkJICAgIHRpZi0+dGlmX2Rpcmxpc3RzaXplID0gNjU1MzU7CisJCWVsc2UKKwkJICAgIHRpZi0+dGlmX2Rpcmxpc3RzaXplID0gMiAqIHRpZi0+dGlmX2Rpcm51bWJlcjsKKwkJdGlmLT50aWZfZGlybGlzdCA9IG5ld19kaXJsaXN0OworCX0KKworCXRpZi0+dGlmX2Rpcmxpc3RbdGlmLT50aWZfZGlybnVtYmVyIC0gMV0gPSBkaXJvZmY7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIENoZWNrIHRoZSBjb3VudCBmaWVsZCBvZiBhIGRpcmVjdG9yeSBlbnRyeSBhZ2FpbnN0IGEga25vd24gdmFsdWUuICBUaGUKKyAqIGNhbGxlciBpcyBleHBlY3RlZCB0byBza2lwL2lnbm9yZSB0aGUgdGFnIGlmIHRoZXJlIGlzIGEgbWlzbWF0Y2guCisgKi8KK3N0YXRpYyBpbnQKK0NoZWNrRGlyQ291bnQoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDMyIGNvdW50KQoreworCWlmICgodWludDY0KWNvdW50ID4gZGlyLT50ZGlyX2NvdW50KSB7CisJCWNvbnN0IFRJRkZGaWVsZCogZmlwID0gVElGRkZpZWxkV2l0aFRhZyh0aWYsIGRpci0+dGRpcl90YWcpOworCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCB0aWYtPnRpZl9uYW1lLAorCSJpbmNvcnJlY3QgY291bnQgZm9yIGZpZWxkIFwiJXNcIiAoIiBUSUZGX1VJTlQ2NF9GT1JNQVQgIiwgZXhwZWN0aW5nICV1KTsgdGFnIGlnbm9yZWQiLAorCQkgICAgZmlwID8gZmlwLT5maWVsZF9uYW1lIDogInVua25vd24gdGFnbmFtZSIsCisJCSAgICBkaXItPnRkaXJfY291bnQsIGNvdW50KTsKKwkJcmV0dXJuICgwKTsKKwl9IGVsc2UgaWYgKCh1aW50NjQpY291bnQgPCBkaXItPnRkaXJfY291bnQpIHsKKwkJY29uc3QgVElGRkZpZWxkKiBmaXAgPSBUSUZGRmllbGRXaXRoVGFnKHRpZiwgZGlyLT50ZGlyX3RhZyk7CisJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIHRpZi0+dGlmX25hbWUsCisJImluY29ycmVjdCBjb3VudCBmb3IgZmllbGQgXCIlc1wiICgiIFRJRkZfVUlOVDY0X0ZPUk1BVCAiLCBleHBlY3RpbmcgJXUpOyB0YWcgdHJpbW1lZCIsCisJCSAgICBmaXAgPyBmaXAtPmZpZWxkX25hbWUgOiAidW5rbm93biB0YWduYW1lIiwKKwkJICAgIGRpci0+dGRpcl9jb3VudCwgY291bnQpOworCQlkaXItPnRkaXJfY291bnQgPSBjb3VudDsKKwkJcmV0dXJuICgxKTsKKwl9CisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIFJlYWQgSUZEIHN0cnVjdHVyZSBmcm9tIHRoZSBzcGVjaWZpZWQgb2Zmc2V0LiBJZiB0aGUgcG9pbnRlciB0bworICogbmV4dGRpcm9mZiB2YXJpYWJsZSBoYXMgYmVlbiBzcGVjaWZpZWQsIHJlYWQgaXQgdG9vLiBGdW5jdGlvbiByZXR1cm5zIGEKKyAqIG51bWJlciBvZiBmaWVsZHMgaW4gdGhlIGRpcmVjdG9yeSBvciAwIGlmIGZhaWxlZC4KKyAqLworc3RhdGljIHVpbnQxNgorVElGRkZldGNoRGlyZWN0b3J5KFRJRkYqIHRpZiwgdWludDY0IGRpcm9mZiwgVElGRkRpckVudHJ5KiogcGRpciwKKyAgICAgICAgICAgICAgICAgICB1aW50NjQgKm5leHRkaXJvZmYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRkZldGNoRGlyZWN0b3J5IjsKKworCXZvaWQqIG9yaWdkaXI7CisJdWludDE2IGRpcmNvdW50MTY7CisJdWludDMyIGRpcnNpemU7CisJVElGRkRpckVudHJ5KiBkaXI7CisJdWludDgqIG1hOworCVRJRkZEaXJFbnRyeSogbWI7CisJdWludDE2IG47CisKKwlhc3NlcnQocGRpcik7CisKKwl0aWYtPnRpZl9kaXJvZmYgPSBkaXJvZmY7CisJaWYgKG5leHRkaXJvZmYpCisJCSpuZXh0ZGlyb2ZmID0gMDsKKwlpZiAoIWlzTWFwcGVkKHRpZikpIHsKKwkJaWYgKCFTZWVrT0sodGlmLCB0aWYtPnRpZl9kaXJvZmYpKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCSIlczogU2VlayBlcnJvciBhY2Nlc3NpbmcgVElGRiBkaXJlY3RvcnkiLAorCQkJCXRpZi0+dGlmX25hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCEodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKSkKKwkJeworCQkJaWYgKCFSZWFkT0sodGlmLCAmZGlyY291bnQxNiwgc2l6ZW9mICh1aW50MTYpKSkgeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJICAgICIlczogQ2FuIG5vdCByZWFkIFRJRkYgZGlyZWN0b3J5IGNvdW50IiwKKwkJCQkgICAgdGlmLT50aWZfbmFtZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJTaG9ydCgmZGlyY291bnQxNik7CisJCQlpZiAoZGlyY291bnQxNj40MDk2KQorCQkJeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJICAgICJTYW5pdHkgY2hlY2sgb24gZGlyZWN0b3J5IGNvdW50IGZhaWxlZCwgdGhpcyBpcyBwcm9iYWJseSBub3QgYSB2YWxpZCBJRkQgb2Zmc2V0Iik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlkaXJzaXplID0gMTI7CisJCX0gZWxzZSB7CisJCQl1aW50NjQgZGlyY291bnQ2NDsKKwkJCWlmICghUmVhZE9LKHRpZiwgJmRpcmNvdW50NjQsIHNpemVvZiAodWludDY0KSkpIHsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCQkiJXM6IENhbiBub3QgcmVhZCBUSUZGIGRpcmVjdG9yeSBjb3VudCIsCisJCQkJCXRpZi0+dGlmX25hbWUpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiTG9uZzgoJmRpcmNvdW50NjQpOworCQkJaWYgKGRpcmNvdW50NjQ+NDA5NikKKwkJCXsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCSAgICAiU2FuaXR5IGNoZWNrIG9uIGRpcmVjdG9yeSBjb3VudCBmYWlsZWQsIHRoaXMgaXMgcHJvYmFibHkgbm90IGEgdmFsaWQgSUZEIG9mZnNldCIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJZGlyY291bnQxNiA9ICh1aW50MTYpZGlyY291bnQ2NDsKKwkJCWRpcnNpemUgPSAyMDsKKwkJfQorCQlvcmlnZGlyID0gX1RJRkZDaGVja01hbGxvYyh0aWYsIGRpcmNvdW50MTYsCisJCSAgICBkaXJzaXplLCAidG8gcmVhZCBUSUZGIGRpcmVjdG9yeSIpOworCQlpZiAob3JpZ2RpciA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCWlmICghUmVhZE9LKHRpZiwgb3JpZ2RpciwgKHRtc2l6ZV90KShkaXJjb3VudDE2KmRpcnNpemUpKSkgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkiJS4xMDBzOiBDYW4gbm90IHJlYWQgVElGRiBkaXJlY3RvcnkiLAorCQkJCXRpZi0+dGlmX25hbWUpOworCQkJX1RJRkZmcmVlKG9yaWdkaXIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJLyoKKwkJICogUmVhZCBvZmZzZXQgdG8gbmV4dCBkaXJlY3RvcnkgZm9yIHNlcXVlbnRpYWwgc2NhbnMgaWYKKwkJICogbmVlZGVkLgorCQkgKi8KKwkJaWYgKG5leHRkaXJvZmYpCisJCXsKKwkJCWlmICghKHRpZi0+dGlmX2ZsYWdzJlRJRkZfQklHVElGRikpCisJCQl7CisJCQkJdWludDMyIG5leHRkaXJvZmYzMjsKKwkJCQlpZiAoIVJlYWRPSyh0aWYsICZuZXh0ZGlyb2ZmMzIsIHNpemVvZih1aW50MzIpKSkKKwkJCQkJbmV4dGRpcm9mZjMyID0gMDsKKwkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQlUSUZGU3dhYkxvbmcoJm5leHRkaXJvZmYzMik7CisJCQkJKm5leHRkaXJvZmY9bmV4dGRpcm9mZjMyOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIVJlYWRPSyh0aWYsIG5leHRkaXJvZmYsIHNpemVvZih1aW50NjQpKSkKKwkJCQkJKm5leHRkaXJvZmYgPSAwOworCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCVRJRkZTd2FiTG9uZzgobmV4dGRpcm9mZik7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQl0bXNpemVfdCBtOworCQl0bXNpemVfdCBvZmYgPSAodG1zaXplX3QpIHRpZi0+dGlmX2Rpcm9mZjsKKwkJaWYgKCh1aW50NjQpb2ZmIT10aWYtPnRpZl9kaXJvZmYpCisJCXsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiQ2FuIG5vdCByZWFkIFRJRkYgZGlyZWN0b3J5IGNvdW50Iik7CisJCQlyZXR1cm4oMCk7CisJCX0KKworCQkvKgorCQkgKiBDaGVjayBmb3IgaW50ZWdlciBvdmVyZmxvdyB3aGVuIHZhbGlkYXRpbmcgdGhlIGRpcl9vZmYsCisJCSAqIG90aGVyd2lzZSBhIHZlcnkgaGlnaCBvZmZzZXQgbWF5IGNhdXNlIGFuIE9PQiByZWFkIGFuZAorCQkgKiBjcmFzaCB0aGUgY2xpZW50LiBNYWtlIHR3byBjb21wYXJpc29ucyBpbnN0ZWFkIG9mCisJCSAqCisJCSAqICBvZmYgKyBzaXplb2YodWludDE2KSA+IHRpZi0+dGlmX3NpemUKKwkJICoKKwkJICogdG8gYXZvaWQgb3ZlcmZsb3cuCisJCSAqLworCQlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCQl7CisJCQltPW9mZitzaXplb2YodWludDE2KTsKKwkJCWlmICgobTxvZmYpfHwobTwodG1zaXplX3Qpc2l6ZW9mKHVpbnQxNikpfHwobT50aWYtPnRpZl9zaXplKSkgeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJCSJDYW4gbm90IHJlYWQgVElGRiBkaXJlY3RvcnkgY291bnQiKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0gZWxzZSB7CisJCQkJX1RJRkZtZW1jcHkoJmRpcmNvdW50MTYsIHRpZi0+dGlmX2Jhc2UgKyBvZmYsCisJCQkJCSAgICBzaXplb2YodWludDE2KSk7CisJCQl9CisJCQlvZmYgKz0gc2l6ZW9mICh1aW50MTYpOworCQkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiU2hvcnQoJmRpcmNvdW50MTYpOworCQkJaWYgKGRpcmNvdW50MTY+NDA5NikKKwkJCXsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCSAgICAiU2FuaXR5IGNoZWNrIG9uIGRpcmVjdG9yeSBjb3VudCBmYWlsZWQsIHRoaXMgaXMgcHJvYmFibHkgbm90IGEgdmFsaWQgSUZEIG9mZnNldCIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJZGlyc2l6ZSA9IDEyOworCQl9CisJCWVsc2UKKwkJeworCQkJdG1zaXplX3QgbTsKKwkJCXVpbnQ2NCBkaXJjb3VudDY0OworCQkJbT1vZmYrc2l6ZW9mKHVpbnQ2NCk7CisJCQlpZiAoKG08b2ZmKXx8KG08KHRtc2l6ZV90KXNpemVvZih1aW50NjQpKXx8KG0+dGlmLT50aWZfc2l6ZSkpIHsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCQkiQ2FuIG5vdCByZWFkIFRJRkYgZGlyZWN0b3J5IGNvdW50Iik7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UgeworCQkJCV9USUZGbWVtY3B5KCZkaXJjb3VudDY0LCB0aWYtPnRpZl9iYXNlICsgb2ZmLAorCQkJCQkgICAgc2l6ZW9mKHVpbnQ2NCkpOworCQkJfQorCQkJb2ZmICs9IHNpemVvZiAodWludDY0KTsKKwkJCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYkxvbmc4KCZkaXJjb3VudDY0KTsKKwkJCWlmIChkaXJjb3VudDY0PjQwOTYpCisJCQl7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkgICAgIlNhbml0eSBjaGVjayBvbiBkaXJlY3RvcnkgY291bnQgZmFpbGVkLCB0aGlzIGlzIHByb2JhYmx5IG5vdCBhIHZhbGlkIElGRCBvZmZzZXQiKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWRpcmNvdW50MTYgPSAodWludDE2KWRpcmNvdW50NjQ7CisJCQlkaXJzaXplID0gMjA7CisJCX0KKwkJaWYgKGRpcmNvdW50MTYgPT0gMCApCisJCXsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgICAgICAgICAgIlNhbml0eSBjaGVjayBvbiBkaXJlY3RvcnkgY291bnQgZmFpbGVkLCB6ZXJvIHRhZyBkaXJlY3RvcmllcyBub3Qgc3VwcG9ydGVkIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlvcmlnZGlyID0gX1RJRkZDaGVja01hbGxvYyh0aWYsIGRpcmNvdW50MTYsCisJCQkJCQlkaXJzaXplLAorCQkJCQkJInRvIHJlYWQgVElGRiBkaXJlY3RvcnkiKTsKKwkJaWYgKG9yaWdkaXIgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCQltPW9mZitkaXJjb3VudDE2KmRpcnNpemU7CisJCWlmICgobTxvZmYpfHwobTwodG1zaXplX3QpKGRpcmNvdW50MTYqZGlyc2l6ZSkpfHwobT50aWYtPnRpZl9zaXplKSkgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkgICAgICJDYW4gbm90IHJlYWQgVElGRiBkaXJlY3RvcnkiKTsKKwkJCV9USUZGZnJlZShvcmlnZGlyKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJX1RJRkZtZW1jcHkob3JpZ2RpciwgdGlmLT50aWZfYmFzZSArIG9mZiwKKwkJCQkgICAgZGlyY291bnQxNiAqIGRpcnNpemUpOworCQl9CisJCWlmIChuZXh0ZGlyb2ZmKSB7CisJCQlvZmYgKz0gZGlyY291bnQxNiAqIGRpcnNpemU7CisJCQlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCQkJeworCQkJCXVpbnQzMiBuZXh0ZGlyb2ZmMzI7CisJCQkJbT1vZmYrc2l6ZW9mKHVpbnQzMik7CisJCQkJaWYgKChtPG9mZil8fChtPCh0bXNpemVfdClzaXplb2YodWludDMyKSl8fChtPnRpZi0+dGlmX3NpemUpKQorCQkJCQluZXh0ZGlyb2ZmMzIgPSAwOworCQkJCWVsc2UKKwkJCQkJX1RJRkZtZW1jcHkoJm5leHRkaXJvZmYzMiwgdGlmLT50aWZfYmFzZSArIG9mZiwKKwkJCQkJCSAgICBzaXplb2YgKHVpbnQzMikpOworCQkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJCVRJRkZTd2FiTG9uZygmbmV4dGRpcm9mZjMyKTsKKwkJCQkqbmV4dGRpcm9mZiA9IG5leHRkaXJvZmYzMjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltPW9mZitzaXplb2YodWludDY0KTsKKwkJCQlpZiAoKG08b2ZmKXx8KG08KHRtc2l6ZV90KXNpemVvZih1aW50NjQpKXx8KG0+dGlmLT50aWZfc2l6ZSkpCisJCQkJCSpuZXh0ZGlyb2ZmID0gMDsKKwkJCQllbHNlCisJCQkJCV9USUZGbWVtY3B5KG5leHRkaXJvZmYsIHRpZi0+dGlmX2Jhc2UgKyBvZmYsCisJCQkJCQkgICAgc2l6ZW9mICh1aW50NjQpKTsKKwkJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCQlUSUZGU3dhYkxvbmc4KG5leHRkaXJvZmYpOworCQkJfQorCQl9CisJfQorCWRpciA9IChUSUZGRGlyRW50cnkqKV9USUZGQ2hlY2tNYWxsb2ModGlmLCBkaXJjb3VudDE2LAorCQkJCQkJc2l6ZW9mKFRJRkZEaXJFbnRyeSksCisJCQkJCQkidG8gcmVhZCBUSUZGIGRpcmVjdG9yeSIpOworCWlmIChkaXI9PTApCisJeworCQlfVElGRmZyZWUob3JpZ2Rpcik7CisJCXJldHVybiAwOworCX0KKwltYT0odWludDgqKW9yaWdkaXI7CisJbWI9ZGlyOworCWZvciAobj0wOyBuPGRpcmNvdW50MTY7IG4rKykKKwl7CisJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQlUSUZGU3dhYlNob3J0KCh1aW50MTYqKW1hKTsKKwkJbWItPnRkaXJfdGFnPSoodWludDE2KiltYTsKKwkJbWErPXNpemVvZih1aW50MTYpOworCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJVElGRlN3YWJTaG9ydCgodWludDE2KiltYSk7CisJCW1iLT50ZGlyX3R5cGU9Kih1aW50MTYqKW1hOworCQltYSs9c2l6ZW9mKHVpbnQxNik7CisJCWlmICghKHRpZi0+dGlmX2ZsYWdzJlRJRkZfQklHVElGRikpCisJCXsKKwkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJMb25nKCh1aW50MzIqKW1hKTsKKwkJCW1iLT50ZGlyX2NvdW50PSh1aW50NjQpKCoodWludDMyKiltYSk7CisJCQltYSs9c2l6ZW9mKHVpbnQzMik7CisJCQkqKHVpbnQzMiopKCZtYi0+dGRpcl9vZmZzZXQpPSoodWludDMyKiltYTsKKwkJCW1hKz1zaXplb2YodWludDMyKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJMb25nOCgodWludDY0KiltYSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtYi0+dGRpcl9jb3VudD1USUZGUmVhZFVJbnQ2NChtYSk7CisJCQltYSs9c2l6ZW9mKHVpbnQ2NCk7CisJCQltYi0+dGRpcl9vZmZzZXQudG9mZl9sb25nOD1USUZGUmVhZFVJbnQ2NChtYSk7CisJCQltYSs9c2l6ZW9mKHVpbnQ2NCk7CisJCX0KKwkJbWIrKzsKKwl9CisJX1RJRkZmcmVlKG9yaWdkaXIpOworCSpwZGlyID0gZGlyOworCXJldHVybiBkaXJjb3VudDE2OworfQorCisvKgorICogRmV0Y2ggYSB0YWcgdGhhdCBpcyBub3QgaGFuZGxlZCBieSBzcGVjaWFsIGNhc2UgY29kZS4KKyAqLworc3RhdGljIGludAorVElGRkZldGNoTm9ybWFsVGFnKFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkcCwgaW50IHJlY292ZXIpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRkZldGNoTm9ybWFsVGFnIjsKKwllbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgZXJyOworCXVpbnQzMiBmaWk7CisJY29uc3QgVElGRkZpZWxkKiBmaXAgPSBOVUxMOworCVRJRkZSZWFkRGlyZWN0b3J5RmluZEZpZWxkSW5mbyh0aWYsZHAtPnRkaXJfdGFnLCZmaWkpOworICAgICAgICBpZiggZmlpID09IEZBSUxFRF9GSUkgKQorICAgICAgICB7CisgICAgICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgIlRJRkZGZXRjaE5vcm1hbFRhZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIGRlZmluaXRpb24gZm91bmQgZm9yIHRhZyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZHAtPnRkaXJfdGFnKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisJZmlwPXRpZi0+dGlmX2ZpZWxkc1tmaWldOworCWFzc2VydChmaXAgIT0gTlVMTCk7IC8qIHNob3VsZCBub3QgaGFwcGVuICovCisJYXNzZXJ0KGZpcC0+c2V0X2ZpZWxkX3R5cGUhPVRJRkZfU0VUR0VUX09USEVSKTsgIC8qIGlmIHNvLCB3ZSBzaG91bGRuJ3QgYXJyaXZlIGhlcmUgYnV0IGRlYWwgd2l0aCB0aGlzIGluIHNwZWNpYWxpemVkIGNvZGUgKi8KKwlhc3NlcnQoZmlwLT5zZXRfZmllbGRfdHlwZSE9VElGRl9TRVRHRVRfSU5UKTsgICAgLyogaWYgc28sIHdlIHNob3VsZG4ndCBhcnJpdmUgaGVyZSBhcyB0aGlzIGlzIG9ubHkgdGhlIGNhc2UgZm9yIHBzZXVkby10YWdzICovCisJZXJyPVRJRkZSZWFkRGlyRW50cnlFcnJPazsKKwlzd2l0Y2ggKGZpcC0+c2V0X2ZpZWxkX3R5cGUpCisJeworCQljYXNlIFRJRkZfU0VUR0VUX1VOREVGSU5FRDoKKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX0FTQ0lJOgorCQkJeworCQkJCXVpbnQ4KiBkYXRhOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MCk7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlCeXRlQXJyYXkodGlmLGRwLCZkYXRhKTsKKwkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJeworCQkJCQl1aW50OCogbWE7CisJCQkJCXVpbnQzMiBtYjsKKwkJCQkJaW50IG47CisJCQkJCW1hPWRhdGE7CisJCQkJCW1iPTA7CisJCQkJCXdoaWxlIChtYjwodWludDMyKWRwLT50ZGlyX2NvdW50KQorCQkJCQl7CisJCQkJCQlpZiAoKm1hPT0wKQorCQkJCQkJCWJyZWFrOworCQkJCQkJbWErKzsKKwkJCQkJCW1iKys7CisJCQkJCX0KKwkJCQkJaWYgKG1iKzE8KHVpbnQzMilkcC0+dGRpcl9jb3VudCkKKwkJCQkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJBU0NJSSB2YWx1ZSBmb3IgdGFnIFwiJXNcIiBjb250YWlucyBudWxsIGJ5dGUgaW4gdmFsdWU7IHZhbHVlIGluY29ycmVjdGx5IHRydW5jYXRlZCBkdXJpbmcgcmVhZGluZyBkdWUgdG8gaW1wbGVtZW50YXRpb24gbGltaXRhdGlvbnMiLGZpcC0+ZmllbGRfbmFtZSk7CisJCQkJCWVsc2UgaWYgKG1iKzE+KHVpbnQzMilkcC0+dGRpcl9jb3VudCkKKwkJCQkJeworCQkJCQkJdWludDgqIG87CisJCQkJCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiQVNDSUkgdmFsdWUgZm9yIHRhZyBcIiVzXCIgZG9lcyBub3QgZW5kIGluIG51bGwgYnl0ZSIsZmlwLT5maWVsZF9uYW1lKTsKKwkJCQkJCWlmICgodWludDMyKWRwLT50ZGlyX2NvdW50KzEhPWRwLT50ZGlyX2NvdW50KzEpCisJCQkJCQkJbz1OVUxMOworCQkJCQkJZWxzZQorCQkJCQkJCW89X1RJRkZtYWxsb2MoKHVpbnQzMilkcC0+dGRpcl9jb3VudCsxKTsKKwkJCQkJCWlmIChvPT1OVUxMKQorCQkJCQkJeworCQkJCQkJCWlmIChkYXRhIT1OVUxMKQorCQkJCQkJCQlfVElGRmZyZWUoZGF0YSk7CisJCQkJCQkJcmV0dXJuKDApOworCQkJCQkJfQorCQkJCQkJX1RJRkZtZW1jcHkobyxkYXRhLCh1aW50MzIpZHAtPnRkaXJfY291bnQpOworCQkJCQkJb1sodWludDMyKWRwLT50ZGlyX2NvdW50XT0wOworCQkJCQkJaWYgKGRhdGEhPTApCisJCQkJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCQkJZGF0YT1vOworCQkJCQl9CisJCQkJCW49VElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsZGF0YSk7CisJCQkJCWlmIChkYXRhIT0wKQorCQkJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCQlpZiAoIW4pCisJCQkJCQlyZXR1cm4oMCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TRVRHRVRfVUlOVDg6CisJCQl7CisJCQkJdWludDggZGF0YT0wOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3JlYWRjb3VudD09MSk7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcGFzc2NvdW50PT0wKTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeUJ5dGUodGlmLGRwLCZkYXRhKTsKKwkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJeworCQkJCQlpZiAoIVRJRkZTZXRGaWVsZCh0aWYsZHAtPnRkaXJfdGFnLGRhdGEpKQorCQkJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX1VJTlQxNjoKKwkJCXsKKwkJCQl1aW50MTYgZGF0YTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9yZWFkY291bnQ9PTEpOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MCk7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlTaG9ydCh0aWYsZHAsJmRhdGEpOworCQkJCWlmIChlcnI9PVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQl7CisJCQkJCWlmICghVElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsZGF0YSkpCisJCQkJCQlyZXR1cm4oMCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TRVRHRVRfVUlOVDMyOgorCQkJeworCQkJCXVpbnQzMiBkYXRhOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3JlYWRjb3VudD09MSk7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcGFzc2NvdW50PT0wKTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeUxvbmcodGlmLGRwLCZkYXRhKTsKKwkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJeworCQkJCQlpZiAoIVRJRkZTZXRGaWVsZCh0aWYsZHAtPnRkaXJfdGFnLGRhdGEpKQorCQkJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX1VJTlQ2NDoKKwkJCXsKKwkJCQl1aW50NjQgZGF0YTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9yZWFkY291bnQ9PTEpOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MCk7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlMb25nOCh0aWYsZHAsJmRhdGEpOworCQkJCWlmIChlcnI9PVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQl7CisJCQkJCWlmICghVElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsZGF0YSkpCisJCQkJCQlyZXR1cm4oMCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TRVRHRVRfRkxPQVQ6CisJCQl7CisJCQkJZmxvYXQgZGF0YTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9yZWFkY291bnQ9PTEpOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MCk7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlGbG9hdCh0aWYsZHAsJmRhdGEpOworCQkJCWlmIChlcnI9PVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQl7CisJCQkJCWlmICghVElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsZGF0YSkpCisJCQkJCQlyZXR1cm4oMCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TRVRHRVRfRE9VQkxFOgorCQkJeworCQkJCWRvdWJsZSBkYXRhOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3JlYWRjb3VudD09MSk7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcGFzc2NvdW50PT0wKTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeURvdWJsZSh0aWYsZHAsJmRhdGEpOworCQkJCWlmIChlcnI9PVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQl7CisJCQkJCWlmICghVElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsZGF0YSkpCisJCQkJCQlyZXR1cm4oMCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TRVRHRVRfSUZEODoKKwkJCXsKKwkJCQl1aW50NjQgZGF0YTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9yZWFkY291bnQ9PTEpOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MCk7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlJZmQ4KHRpZixkcCwmZGF0YSk7CisJCQkJaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCXsKKwkJCQkJaWYgKCFUSUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZyxkYXRhKSkKKwkJCQkJCXJldHVybigwKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NFVEdFVF9VSU5UMTZfUEFJUjoKKwkJCXsKKwkJCQl1aW50MTYqIGRhdGE7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcmVhZGNvdW50PT0yKTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9wYXNzY291bnQ9PTApOworCQkJCWlmIChkcC0+dGRpcl9jb3VudCE9MikgeworCQkJCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwKKwkJCQkJCSAgICAgICAiaW5jb3JyZWN0IGNvdW50IGZvciBmaWVsZCBcIiVzXCIsIGV4cGVjdGVkIDIsIGdvdCAlZCIsCisJCQkJCQkgICAgICAgZmlwLT5maWVsZF9uYW1lLChpbnQpZHAtPnRkaXJfY291bnQpOworCQkJCQlyZXR1cm4oMCk7CisJCQkJfQorCQkJCWVycj1USUZGUmVhZERpckVudHJ5U2hvcnRBcnJheSh0aWYsZHAsJmRhdGEpOworCQkJCWlmIChlcnI9PVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQl7CisJCQkJCWludCBtOworCQkJCQltPVRJRkZTZXRGaWVsZCh0aWYsZHAtPnRkaXJfdGFnLGRhdGFbMF0sZGF0YVsxXSk7CisJCQkJCV9USUZGZnJlZShkYXRhKTsKKwkJCQkJaWYgKCFtKQorCQkJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX0MwX1VJTlQ4OgorCQkJeworCQkJCXVpbnQ4KiBkYXRhOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3JlYWRjb3VudD49MSk7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcGFzc2NvdW50PT0wKTsKKwkJCQlpZiAoZHAtPnRkaXJfY291bnQhPSh1aW50NjQpZmlwLT5maWVsZF9yZWFkY291bnQpIHsKKwkJCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsCisJCQkJCQkgICAgICAgImluY29ycmVjdCBjb3VudCBmb3IgZmllbGQgXCIlc1wiLCBleHBlY3RlZCAlZCwgZ290ICVkIiwKKwkJCQkJCSAgICAgICBmaXAtPmZpZWxkX25hbWUsKGludCkgZmlwLT5maWVsZF9yZWFkY291bnQsIChpbnQpZHAtPnRkaXJfY291bnQpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlCeXRlQXJyYXkodGlmLGRwLCZkYXRhKTsKKwkJCQkJaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQl7CisJCQkJCQlpbnQgbTsKKwkJCQkJCW09VElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsZGF0YSk7CisJCQkJCQlpZiAoZGF0YSE9MCkKKwkJCQkJCQlfVElGRmZyZWUoZGF0YSk7CisJCQkJCQlpZiAoIW0pCisJCQkJCQkJcmV0dXJuKDApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TRVRHRVRfQzBfVUlOVDE2OgorCQkJeworCQkJCXVpbnQxNiogZGF0YTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9yZWFkY291bnQ+PTEpOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MCk7CisJCQkJaWYgKGRwLT50ZGlyX2NvdW50IT0odWludDY0KWZpcC0+ZmllbGRfcmVhZGNvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29ycnVwdCBmaWxlICovOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5U2hvcnRBcnJheSh0aWYsZHAsJmRhdGEpOworCQkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXsKKwkJCQkJCWludCBtOworCQkJCQkJbT1USUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZyxkYXRhKTsKKwkJCQkJCWlmIChkYXRhIT0wKQorCQkJCQkJCV9USUZGZnJlZShkYXRhKTsKKwkJCQkJCWlmICghbSkKKwkJCQkJCQlyZXR1cm4oMCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NFVEdFVF9DMF9VSU5UMzI6CisJCQl7CisJCQkJdWludDMyKiBkYXRhOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3JlYWRjb3VudD49MSk7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcGFzc2NvdW50PT0wKTsKKwkJCQlpZiAoZHAtPnRkaXJfY291bnQhPSh1aW50NjQpZmlwLT5maWVsZF9yZWFkY291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3JydXB0IGZpbGUgKi87CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlMb25nQXJyYXkodGlmLGRwLCZkYXRhKTsKKwkJCQkJaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQl7CisJCQkJCQlpbnQgbTsKKwkJCQkJCW09VElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsZGF0YSk7CisJCQkJCQlpZiAoZGF0YSE9MCkKKwkJCQkJCQlfVElGRmZyZWUoZGF0YSk7CisJCQkJCQlpZiAoIW0pCisJCQkJCQkJcmV0dXJuKDApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TRVRHRVRfQzBfRkxPQVQ6CisJCQl7CisJCQkJZmxvYXQqIGRhdGE7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcmVhZGNvdW50Pj0xKTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9wYXNzY291bnQ9PTApOworCQkJCWlmIChkcC0+dGRpcl9jb3VudCE9KHVpbnQ2NClmaXAtPmZpZWxkX3JlYWRjb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvcnJ1cHQgZmlsZSAqLzsKKwkJCQllbHNlCisJCQkJeworCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUZsb2F0QXJyYXkodGlmLGRwLCZkYXRhKTsKKwkJCQkJaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQl7CisJCQkJCQlpbnQgbTsKKwkJCQkJCW09VElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsZGF0YSk7CisJCQkJCQlpZiAoZGF0YSE9MCkKKwkJCQkJCQlfVElGRmZyZWUoZGF0YSk7CisJCQkJCQlpZiAoIW0pCisJCQkJCQkJcmV0dXJuKDApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TRVRHRVRfQzE2X0FTQ0lJOgorCQkJeworCQkJCXVpbnQ4KiBkYXRhOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3JlYWRjb3VudD09VElGRl9WQVJJQUJMRSk7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcGFzc2NvdW50PT0xKTsKKwkJCQlpZiAoZHAtPnRkaXJfY291bnQ+MHhGRkZGKQorCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUVyckNvdW50OworCQkJCWVsc2UKKwkJCQl7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5Qnl0ZUFycmF5KHRpZixkcCwmZGF0YSk7CisJCQkJCWlmIChlcnI9PVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJeworCQkJCQkJaW50IG07CisJCQkJCQltPVRJRkZTZXRGaWVsZCh0aWYsZHAtPnRkaXJfdGFnLCh1aW50MTYpKGRwLT50ZGlyX2NvdW50KSxkYXRhKTsKKwkJCQkJCWlmIChkYXRhIT0wKQorCQkJCQkJCV9USUZGZnJlZShkYXRhKTsKKwkJCQkJCWlmICghbSkKKwkJCQkJCQlyZXR1cm4oMCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NFVEdFVF9DMTZfVUlOVDg6CisJCQl7CisJCQkJdWludDgqIGRhdGE7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcmVhZGNvdW50PT1USUZGX1ZBUklBQkxFKTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9wYXNzY291bnQ9PTEpOworCQkJCWlmIChkcC0+dGRpcl9jb3VudD4weEZGRkYpCisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5RXJyQ291bnQ7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlCeXRlQXJyYXkodGlmLGRwLCZkYXRhKTsKKwkJCQkJaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQl7CisJCQkJCQlpbnQgbTsKKwkJCQkJCW09VElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsKHVpbnQxNikoZHAtPnRkaXJfY291bnQpLGRhdGEpOworCQkJCQkJaWYgKGRhdGEhPTApCisJCQkJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCQkJaWYgKCFtKQorCQkJCQkJCXJldHVybigwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX0MxNl9VSU5UMTY6CisJCQl7CisJCQkJdWludDE2KiBkYXRhOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3JlYWRjb3VudD09VElGRl9WQVJJQUJMRSk7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcGFzc2NvdW50PT0xKTsKKwkJCQlpZiAoZHAtPnRkaXJfY291bnQ+MHhGRkZGKQorCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUVyckNvdW50OworCQkJCWVsc2UKKwkJCQl7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5U2hvcnRBcnJheSh0aWYsZHAsJmRhdGEpOworCQkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXsKKwkJCQkJCWludCBtOworCQkJCQkJbT1USUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZywodWludDE2KShkcC0+dGRpcl9jb3VudCksZGF0YSk7CisJCQkJCQlpZiAoZGF0YSE9MCkKKwkJCQkJCQlfVElGRmZyZWUoZGF0YSk7CisJCQkJCQlpZiAoIW0pCisJCQkJCQkJcmV0dXJuKDApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TRVRHRVRfQzE2X1VJTlQzMjoKKwkJCXsKKwkJCQl1aW50MzIqIGRhdGE7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcmVhZGNvdW50PT1USUZGX1ZBUklBQkxFKTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9wYXNzY291bnQ9PTEpOworCQkJCWlmIChkcC0+dGRpcl9jb3VudD4weEZGRkYpCisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5RXJyQ291bnQ7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlMb25nQXJyYXkodGlmLGRwLCZkYXRhKTsKKwkJCQkJaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCQl7CisJCQkJCQlpbnQgbTsKKwkJCQkJCW09VElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsKHVpbnQxNikoZHAtPnRkaXJfY291bnQpLGRhdGEpOworCQkJCQkJaWYgKGRhdGEhPTApCisJCQkJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCQkJaWYgKCFtKQorCQkJCQkJCXJldHVybigwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX0MxNl9VSU5UNjQ6CisJCQl7CisJCQkJdWludDY0KiBkYXRhOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3JlYWRjb3VudD09VElGRl9WQVJJQUJMRSk7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcGFzc2NvdW50PT0xKTsKKwkJCQlpZiAoZHAtPnRkaXJfY291bnQ+MHhGRkZGKQorCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUVyckNvdW50OworCQkJCWVsc2UKKwkJCQl7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5TG9uZzhBcnJheSh0aWYsZHAsJmRhdGEpOworCQkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXsKKwkJCQkJCWludCBtOworCQkJCQkJbT1USUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZywodWludDE2KShkcC0+dGRpcl9jb3VudCksZGF0YSk7CisJCQkJCQlpZiAoZGF0YSE9MCkKKwkJCQkJCQlfVElGRmZyZWUoZGF0YSk7CisJCQkJCQlpZiAoIW0pCisJCQkJCQkJcmV0dXJuKDApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TRVRHRVRfQzE2X0ZMT0FUOgorCQkJeworCQkJCWZsb2F0KiBkYXRhOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3JlYWRjb3VudD09VElGRl9WQVJJQUJMRSk7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcGFzc2NvdW50PT0xKTsKKwkJCQlpZiAoZHAtPnRkaXJfY291bnQ+MHhGRkZGKQorCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUVyckNvdW50OworCQkJCWVsc2UKKwkJCQl7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5RmxvYXRBcnJheSh0aWYsZHAsJmRhdGEpOworCQkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXsKKwkJCQkJCWludCBtOworCQkJCQkJbT1USUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZywodWludDE2KShkcC0+dGRpcl9jb3VudCksZGF0YSk7CisJCQkJCQlpZiAoZGF0YSE9MCkKKwkJCQkJCQlfVElGRmZyZWUoZGF0YSk7CisJCQkJCQlpZiAoIW0pCisJCQkJCQkJcmV0dXJuKDApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TRVRHRVRfQzE2X0RPVUJMRToKKwkJCXsKKwkJCQlkb3VibGUqIGRhdGE7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcmVhZGNvdW50PT1USUZGX1ZBUklBQkxFKTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9wYXNzY291bnQ9PTEpOworCQkJCWlmIChkcC0+dGRpcl9jb3VudD4weEZGRkYpCisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5RXJyQ291bnQ7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlEb3VibGVBcnJheSh0aWYsZHAsJmRhdGEpOworCQkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJCXsKKwkJCQkJCWludCBtOworCQkJCQkJbT1USUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZywodWludDE2KShkcC0+dGRpcl9jb3VudCksZGF0YSk7CisJCQkJCQlpZiAoZGF0YSE9MCkKKwkJCQkJCQlfVElGRmZyZWUoZGF0YSk7CisJCQkJCQlpZiAoIW0pCisJCQkJCQkJcmV0dXJuKDApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TRVRHRVRfQzE2X0lGRDg6CisJCQl7CisJCQkJdWludDY0KiBkYXRhOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3JlYWRjb3VudD09VElGRl9WQVJJQUJMRSk7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcGFzc2NvdW50PT0xKTsKKwkJCQlpZiAoZHAtPnRkaXJfY291bnQ+MHhGRkZGKQorCQkJCQllcnI9VElGRlJlYWREaXJFbnRyeUVyckNvdW50OworCQkJCWVsc2UKKwkJCQl7CisJCQkJCWVycj1USUZGUmVhZERpckVudHJ5SWZkOEFycmF5KHRpZixkcCwmZGF0YSk7CisJCQkJCWlmIChlcnI9PVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQkJeworCQkJCQkJaW50IG07CisJCQkJCQltPVRJRkZTZXRGaWVsZCh0aWYsZHAtPnRkaXJfdGFnLCh1aW50MTYpKGRwLT50ZGlyX2NvdW50KSxkYXRhKTsKKwkJCQkJCWlmIChkYXRhIT0wKQorCQkJCQkJCV9USUZGZnJlZShkYXRhKTsKKwkJCQkJCWlmICghbSkKKwkJCQkJCQlyZXR1cm4oMCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NFVEdFVF9DMzJfQVNDSUk6CisJCQl7CisJCQkJdWludDgqIGRhdGE7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcmVhZGNvdW50PT1USUZGX1ZBUklBQkxFMik7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcGFzc2NvdW50PT0xKTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeUJ5dGVBcnJheSh0aWYsZHAsJmRhdGEpOworCQkJCWlmIChlcnI9PVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQl7CisJCQkJCWludCBtOworCQkJCQltPVRJRkZTZXRGaWVsZCh0aWYsZHAtPnRkaXJfdGFnLCh1aW50MzIpKGRwLT50ZGlyX2NvdW50KSxkYXRhKTsKKwkJCQkJaWYgKGRhdGEhPTApCisJCQkJCQlfVElGRmZyZWUoZGF0YSk7CisJCQkJCWlmICghbSkKKwkJCQkJCXJldHVybigwKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NFVEdFVF9DMzJfVUlOVDg6CisJCQl7CisJCQkJdWludDgqIGRhdGE7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcmVhZGNvdW50PT1USUZGX1ZBUklBQkxFMik7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcGFzc2NvdW50PT0xKTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeUJ5dGVBcnJheSh0aWYsZHAsJmRhdGEpOworCQkJCWlmIChlcnI9PVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQl7CisJCQkJCWludCBtOworCQkJCQltPVRJRkZTZXRGaWVsZCh0aWYsZHAtPnRkaXJfdGFnLCh1aW50MzIpKGRwLT50ZGlyX2NvdW50KSxkYXRhKTsKKwkJCQkJaWYgKGRhdGEhPTApCisJCQkJCQlfVElGRmZyZWUoZGF0YSk7CisJCQkJCWlmICghbSkKKwkJCQkJCXJldHVybigwKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NFVEdFVF9DMzJfU0lOVDg6CisJCQl7CisJCQkJaW50OCogZGF0YSA9IE5VTEw7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcmVhZGNvdW50PT1USUZGX1ZBUklBQkxFMik7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcGFzc2NvdW50PT0xKTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeVNieXRlQXJyYXkodGlmLGRwLCZkYXRhKTsKKwkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJeworCQkJCQlpbnQgbTsKKwkJCQkJbT1USUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZywodWludDMyKShkcC0+dGRpcl9jb3VudCksZGF0YSk7CisJCQkJCWlmIChkYXRhIT0wKQorCQkJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCQlpZiAoIW0pCisJCQkJCQlyZXR1cm4oMCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TRVRHRVRfQzMyX1VJTlQxNjoKKwkJCXsKKwkJCQl1aW50MTYqIGRhdGE7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcmVhZGNvdW50PT1USUZGX1ZBUklBQkxFMik7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcGFzc2NvdW50PT0xKTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeVNob3J0QXJyYXkodGlmLGRwLCZkYXRhKTsKKwkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJeworCQkJCQlpbnQgbTsKKwkJCQkJbT1USUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZywodWludDMyKShkcC0+dGRpcl9jb3VudCksZGF0YSk7CisJCQkJCWlmIChkYXRhIT0wKQorCQkJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCQlpZiAoIW0pCisJCQkJCQlyZXR1cm4oMCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TRVRHRVRfQzMyX1NJTlQxNjoKKwkJCXsKKwkJCQlpbnQxNiogZGF0YSA9IE5VTEw7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcmVhZGNvdW50PT1USUZGX1ZBUklBQkxFMik7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcGFzc2NvdW50PT0xKTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeVNzaG9ydEFycmF5KHRpZixkcCwmZGF0YSk7CisJCQkJaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCXsKKwkJCQkJaW50IG07CisJCQkJCW09VElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsKHVpbnQzMikoZHAtPnRkaXJfY291bnQpLGRhdGEpOworCQkJCQlpZiAoZGF0YSE9MCkKKwkJCQkJCV9USUZGZnJlZShkYXRhKTsKKwkJCQkJaWYgKCFtKQorCQkJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX0MzMl9VSU5UMzI6CisJCQl7CisJCQkJdWludDMyKiBkYXRhOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3JlYWRjb3VudD09VElGRl9WQVJJQUJMRTIpOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MSk7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlMb25nQXJyYXkodGlmLGRwLCZkYXRhKTsKKwkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJeworCQkJCQlpbnQgbTsKKwkJCQkJbT1USUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZywodWludDMyKShkcC0+dGRpcl9jb3VudCksZGF0YSk7CisJCQkJCWlmIChkYXRhIT0wKQorCQkJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCQlpZiAoIW0pCisJCQkJCQlyZXR1cm4oMCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TRVRHRVRfQzMyX1NJTlQzMjoKKwkJCXsKKwkJCQlpbnQzMiogZGF0YSA9IE5VTEw7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcmVhZGNvdW50PT1USUZGX1ZBUklBQkxFMik7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcGFzc2NvdW50PT0xKTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeVNsb25nQXJyYXkodGlmLGRwLCZkYXRhKTsKKwkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJeworCQkJCQlpbnQgbTsKKwkJCQkJbT1USUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZywodWludDMyKShkcC0+dGRpcl9jb3VudCksZGF0YSk7CisJCQkJCWlmIChkYXRhIT0wKQorCQkJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCQlpZiAoIW0pCisJCQkJCQlyZXR1cm4oMCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TRVRHRVRfQzMyX1VJTlQ2NDoKKwkJCXsKKwkJCQl1aW50NjQqIGRhdGE7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcmVhZGNvdW50PT1USUZGX1ZBUklBQkxFMik7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcGFzc2NvdW50PT0xKTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeUxvbmc4QXJyYXkodGlmLGRwLCZkYXRhKTsKKwkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJeworCQkJCQlpbnQgbTsKKwkJCQkJbT1USUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZywodWludDMyKShkcC0+dGRpcl9jb3VudCksZGF0YSk7CisJCQkJCWlmIChkYXRhIT0wKQorCQkJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCQlpZiAoIW0pCisJCQkJCQlyZXR1cm4oMCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TRVRHRVRfQzMyX1NJTlQ2NDoKKwkJCXsKKwkJCQlpbnQ2NCogZGF0YSA9IE5VTEw7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcmVhZGNvdW50PT1USUZGX1ZBUklBQkxFMik7CisJCQkJYXNzZXJ0KGZpcC0+ZmllbGRfcGFzc2NvdW50PT0xKTsKKwkJCQllcnI9VElGRlJlYWREaXJFbnRyeVNsb25nOEFycmF5KHRpZixkcCwmZGF0YSk7CisJCQkJaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQorCQkJCXsKKwkJCQkJaW50IG07CisJCQkJCW09VElGRlNldEZpZWxkKHRpZixkcC0+dGRpcl90YWcsKHVpbnQzMikoZHAtPnRkaXJfY291bnQpLGRhdGEpOworCQkJCQlpZiAoZGF0YSE9MCkKKwkJCQkJCV9USUZGZnJlZShkYXRhKTsKKwkJCQkJaWYgKCFtKQorCQkJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZfU0VUR0VUX0MzMl9GTE9BVDoKKwkJCXsKKwkJCQlmbG9hdCogZGF0YTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9yZWFkY291bnQ9PVRJRkZfVkFSSUFCTEUyKTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9wYXNzY291bnQ9PTEpOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5RmxvYXRBcnJheSh0aWYsZHAsJmRhdGEpOworCQkJCWlmIChlcnI9PVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwkJCQl7CisJCQkJCWludCBtOworCQkJCQltPVRJRkZTZXRGaWVsZCh0aWYsZHAtPnRkaXJfdGFnLCh1aW50MzIpKGRwLT50ZGlyX2NvdW50KSxkYXRhKTsKKwkJCQkJaWYgKGRhdGEhPTApCisJCQkJCQlfVElGRmZyZWUoZGF0YSk7CisJCQkJCWlmICghbSkKKwkJCQkJCXJldHVybigwKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGX1NFVEdFVF9DMzJfRE9VQkxFOgorCQkJeworCQkJCWRvdWJsZSogZGF0YTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9yZWFkY291bnQ9PVRJRkZfVkFSSUFCTEUyKTsKKwkJCQlhc3NlcnQoZmlwLT5maWVsZF9wYXNzY291bnQ9PTEpOworCQkJCWVycj1USUZGUmVhZERpckVudHJ5RG91YmxlQXJyYXkodGlmLGRwLCZkYXRhKTsKKwkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJeworCQkJCQlpbnQgbTsKKwkJCQkJbT1USUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZywodWludDMyKShkcC0+dGRpcl9jb3VudCksZGF0YSk7CisJCQkJCWlmIChkYXRhIT0wKQorCQkJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCQlpZiAoIW0pCisJCQkJCQlyZXR1cm4oMCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRl9TRVRHRVRfQzMyX0lGRDg6CisJCQl7CisJCQkJdWludDY0KiBkYXRhOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3JlYWRjb3VudD09VElGRl9WQVJJQUJMRTIpOworCQkJCWFzc2VydChmaXAtPmZpZWxkX3Bhc3Njb3VudD09MSk7CisJCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlJZmQ4QXJyYXkodGlmLGRwLCZkYXRhKTsKKwkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJCQkJeworCQkJCQlpbnQgbTsKKwkJCQkJbT1USUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZywodWludDMyKShkcC0+dGRpcl9jb3VudCksZGF0YSk7CisJCQkJCWlmIChkYXRhIT0wKQorCQkJCQkJX1RJRkZmcmVlKGRhdGEpOworCQkJCQlpZiAoIW0pCisJCQkJCQlyZXR1cm4oMCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlhc3NlcnQoMCk7ICAgIC8qIHdlIHNob3VsZCBuZXZlciBnZXQgaGVyZSAqLworCQkJYnJlYWs7CisJfQorCWlmIChlcnIhPVRJRkZSZWFkRGlyRW50cnlFcnJPaykKKwl7CisJCVRJRkZSZWFkRGlyRW50cnlPdXRwdXRFcnIodGlmLGVycixtb2R1bGUsZmlwLT5maWVsZF9uYW1lLHJlY292ZXIpOworCQlyZXR1cm4oMCk7CisJfQorCXJldHVybigxKTsKK30KKworLyoKKyAqIEZldGNoIGEgc2V0IG9mIG9mZnNldHMgb3IgbGVuZ3Rocy4KKyAqIFdoaWxlIHRoaXMgcm91dGluZSBzYXlzICJzdHJpcHMiLCBpbiBmYWN0IGl0J3MgYWxzbyB1c2VkIGZvciB0aWxlcy4KKyAqLworc3RhdGljIGludAorVElGRkZldGNoU3RyaXBUaGluZyhUSUZGKiB0aWYsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MzIgbnN0cmlwcywgdWludDY0KiogbHBwKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZGZXRjaFN0cmlwVGhpbmciOworCWVudW0gVElGRlJlYWREaXJFbnRyeUVyciBlcnI7CisJdWludDY0KiBkYXRhOworCWVycj1USUZGUmVhZERpckVudHJ5TG9uZzhBcnJheSh0aWYsZGlyLCZkYXRhKTsKKwlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJeworCQljb25zdCBUSUZGRmllbGQqIGZpcCA9IFRJRkZGaWVsZFdpdGhUYWcodGlmLGRpci0+dGRpcl90YWcpOyAKKwkJVElGRlJlYWREaXJFbnRyeU91dHB1dEVycih0aWYsZXJyLG1vZHVsZSxmaXAgPyBmaXAtPmZpZWxkX25hbWUgOiAidW5rbm93biB0YWduYW1lIiwwKTsKKwkJcmV0dXJuKDApOworCX0KKwlpZiAoZGlyLT50ZGlyX2NvdW50IT0odWludDY0KW5zdHJpcHMpCisJeworCQl1aW50NjQqIHJlc2l6ZWRkYXRhOworCQlyZXNpemVkZGF0YT0odWludDY0KilfVElGRkNoZWNrTWFsbG9jKHRpZixuc3RyaXBzLHNpemVvZih1aW50NjQpLCJmb3Igc3RyaXAgYXJyYXkiKTsKKwkJaWYgKHJlc2l6ZWRkYXRhPT0wKSB7CisJCQlfVElGRmZyZWUoZGF0YSk7CisJCQlyZXR1cm4oMCk7CisJCX0KKwkJaWYgKGRpci0+dGRpcl9jb3VudDwodWludDY0KW5zdHJpcHMpCisJCXsKKwkJCV9USUZGbWVtY3B5KHJlc2l6ZWRkYXRhLGRhdGEsKHVpbnQzMilkaXItPnRkaXJfY291bnQqc2l6ZW9mKHVpbnQ2NCkpOworCQkJX1RJRkZtZW1zZXQocmVzaXplZGRhdGErKHVpbnQzMilkaXItPnRkaXJfY291bnQsMCwobnN0cmlwcy0odWludDMyKWRpci0+dGRpcl9jb3VudCkqc2l6ZW9mKHVpbnQ2NCkpOworCQl9CisJCWVsc2UKKwkJCV9USUZGbWVtY3B5KHJlc2l6ZWRkYXRhLGRhdGEsbnN0cmlwcypzaXplb2YodWludDY0KSk7CisJCV9USUZGZnJlZShkYXRhKTsKKwkJZGF0YT1yZXNpemVkZGF0YTsKKwl9CisJKmxwcD1kYXRhOworCXJldHVybigxKTsKK30KKworLyoKKyAqIEZldGNoIGFuZCBzZXQgdGhlIFN1YmplY3REaXN0YW5jZSBFWElGIHRhZy4KKyAqLworc3RhdGljIGludAorVElGRkZldGNoU3ViamVjdERpc3RhbmNlKFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXIpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRkZldGNoU3ViamVjdERpc3RhbmNlIjsKKwllbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgZXJyOworCVVJbnQ2NEFsaWduZWRfdCBtOworICAgIG0ubD0wOworCWFzc2VydChzaXplb2YoZG91YmxlKT09OCk7CisJYXNzZXJ0KHNpemVvZih1aW50NjQpPT04KTsKKwlhc3NlcnQoc2l6ZW9mKHVpbnQzMik9PTQpOworCWlmIChkaXItPnRkaXJfY291bnQhPTEpCisJCWVycj1USUZGUmVhZERpckVudHJ5RXJyQ291bnQ7CisJZWxzZSBpZiAoZGlyLT50ZGlyX3R5cGUhPVRJRkZfUkFUSU9OQUwpCisJCWVycj1USUZGUmVhZERpckVudHJ5RXJyVHlwZTsKKwllbHNlCisJeworCQlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCQl7CisJCQl1aW50MzIgb2Zmc2V0OworCQkJb2Zmc2V0PSoodWludDMyKikoJmRpci0+dGRpcl9vZmZzZXQpOworCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYkxvbmcoJm9mZnNldCk7CisJCQllcnI9VElGRlJlYWREaXJFbnRyeURhdGEodGlmLG9mZnNldCw4LG0uaSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQltLmw9ZGlyLT50ZGlyX29mZnNldC50b2ZmX2xvbmc4OworCQkJZXJyPVRJRkZSZWFkRGlyRW50cnlFcnJPazsKKwkJfQorCX0KKwlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCisJeworCQlkb3VibGUgbjsKKwkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCVRJRkZTd2FiQXJyYXlPZkxvbmcobS5pLDIpOworCQlpZiAobS5pWzBdPT0wKQorCQkJbj0wLjA7CisJCWVsc2UgaWYgKG0uaVswXT09MHhGRkZGRkZGRikKKwkJCS8qCisJCQkgKiBYWFg6IE51bWVyYXRvciAweEZGRkZGRkZGIG1lYW5zIHRoYXQgd2UgaGF2ZSBpbmZpbml0ZQorCQkJICogZGlzdGFuY2UuIEluZGljYXRlIHRoYXQgd2l0aCBhIG5lZ2F0aXZlIGZsb2F0aW5nIHBvaW50CisJCQkgKiBTdWJqZWN0RGlzdGFuY2UgdmFsdWUuCisJCQkgKi8KKwkJCW49LTEuMDsKKwkJZWxzZQorCQkJbj0oZG91YmxlKW0uaVswXS8oZG91YmxlKW0uaVsxXTsKKwkJcmV0dXJuKFRJRkZTZXRGaWVsZCh0aWYsZGlyLT50ZGlyX3RhZyxuKSk7CisJfQorCWVsc2UKKwl7CisJCVRJRkZSZWFkRGlyRW50cnlPdXRwdXRFcnIodGlmLGVycixtb2R1bGUsIlN1YmplY3REaXN0YW5jZSIsVFJVRSk7CisJCXJldHVybigwKTsKKwl9Cit9CisKKy8qCisgKiBSZXBsYWNlIGEgc2luZ2xlIHN0cmlwICh0aWxlKSBvZiB1bmNvbXByZXNzZWQgZGF0YSBieSBtdWx0aXBsZSBzdHJpcHMKKyAqICh0aWxlcyksIGVhY2ggYXBwcm94aW1hdGVseSBTVFJJUF9TSVpFX0RFRkFVTFQgYnl0ZXMuIFRoaXMgaXMgdXNlZnVsIGZvcgorICogZGVhbGluZyB3aXRoIGxhcmdlIGltYWdlcyBvciBmb3IgZGVhbGluZyB3aXRoIG1hY2hpbmVzIHdpdGggYSBsaW1pdGVkCisgKiBhbW91bnQgbWVtb3J5LgorICovCitzdGF0aWMgdm9pZAorQ2hvcFVwU2luZ2xlVW5jb21wcmVzc2VkU3RyaXAoVElGRiogdGlmKQoreworCXJlZ2lzdGVyIFRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKwl1aW50NjQgYnl0ZWNvdW50OworCXVpbnQ2NCBvZmZzZXQ7CisJdWludDMyIHJvd2Jsb2NrOworCXVpbnQ2NCByb3dibG9ja2J5dGVzOworCXVpbnQ2NCBzdHJpcGJ5dGVzOworCXVpbnQzMiBzdHJpcDsKKwl1aW50NjQgbnN0cmlwczY0OworCXVpbnQzMiBuc3RyaXBzMzI7CisJdWludDMyIHJvd3NwZXJzdHJpcDsKKwl1aW50NjQqIG5ld2NvdW50czsKKwl1aW50NjQqIG5ld29mZnNldHM7CisKKwlieXRlY291bnQgPSB0ZC0+dGRfc3RyaXBieXRlY291bnRbMF07CisJb2Zmc2V0ID0gdGQtPnRkX3N0cmlwb2Zmc2V0WzBdOworCWFzc2VydCh0ZC0+dGRfcGxhbmFyY29uZmlnID09IFBMQU5BUkNPTkZJR19DT05USUcpOworCWlmICgodGQtPnRkX3Bob3RvbWV0cmljID09IFBIT1RPTUVUUklDX1lDQkNSKSYmCisJICAgICghaXNVcFNhbXBsZWQodGlmKSkpCisJCXJvd2Jsb2NrID0gdGQtPnRkX3ljYmNyc3Vic2FtcGxpbmdbMV07CisJZWxzZQorCQlyb3dibG9jayA9IDE7CisJcm93YmxvY2tieXRlcyA9IFRJRkZWVGlsZVNpemU2NCh0aWYsIHJvd2Jsb2NrKTsKKwkvKgorCSAqIE1ha2UgdGhlIHJvd3MgaG9sZCBhdCBsZWFzdCBvbmUgc2NhbmxpbmUsIGJ1dCBmaWxsIHNwZWNpZmllZCBhbW91bnQKKwkgKiBvZiBkYXRhIGlmIHBvc3NpYmxlLgorCSAqLworCWlmIChyb3dibG9ja2J5dGVzID4gU1RSSVBfU0laRV9ERUZBVUxUKSB7CisJCXN0cmlwYnl0ZXMgPSByb3dibG9ja2J5dGVzOworCQlyb3dzcGVyc3RyaXAgPSByb3dibG9jazsKKwl9IGVsc2UgaWYgKHJvd2Jsb2NrYnl0ZXMgPiAwICkgeworCQl1aW50MzIgcm93YmxvY2tzcGVyc3RyaXA7CisJCXJvd2Jsb2Nrc3BlcnN0cmlwID0gKHVpbnQzMikgKFNUUklQX1NJWkVfREVGQVVMVCAvIHJvd2Jsb2NrYnl0ZXMpOworCQlyb3dzcGVyc3RyaXAgPSByb3dibG9ja3NwZXJzdHJpcCAqIHJvd2Jsb2NrOworCQlzdHJpcGJ5dGVzID0gcm93YmxvY2tzcGVyc3RyaXAgKiByb3dibG9ja2J5dGVzOworCX0KKwllbHNlCisJICAgIHJldHVybjsKKworCS8qCisJICogbmV2ZXIgaW5jcmVhc2UgdGhlIG51bWJlciBvZiBzdHJpcHMgaW4gYW4gaW1hZ2UKKwkgKi8KKwlpZiAocm93c3BlcnN0cmlwID49IHRkLT50ZF9yb3dzcGVyc3RyaXApCisJCXJldHVybjsKKwluc3RyaXBzNjQgPSBUSUZGaG93bWFueV82NChieXRlY291bnQsIHN0cmlwYnl0ZXMpOworCWlmICgobnN0cmlwczY0PT0wKXx8KG5zdHJpcHM2ND4weEZGRkZGRkZGKSkgLyogc29tZXRoaW5nIGlzIHdvbmt5LCBkbyBub3RoaW5nLiAqLworCSAgICByZXR1cm47CisJbnN0cmlwczMyID0gKHVpbnQzMiluc3RyaXBzNjQ7CisKKwluZXdjb3VudHMgPSAodWludDY0KikgX1RJRkZDaGVja01hbGxvYyh0aWYsIG5zdHJpcHMzMiwgc2l6ZW9mICh1aW50NjQpLAorCQkJCSJmb3IgY2hvcHBlZCBcIlN0cmlwQnl0ZUNvdW50c1wiIGFycmF5Iik7CisJbmV3b2Zmc2V0cyA9ICh1aW50NjQqKSBfVElGRkNoZWNrTWFsbG9jKHRpZiwgbnN0cmlwczMyLCBzaXplb2YgKHVpbnQ2NCksCisJCQkJImZvciBjaG9wcGVkIFwiU3RyaXBPZmZzZXRzXCIgYXJyYXkiKTsKKwlpZiAobmV3Y291bnRzID09IE5VTEwgfHwgbmV3b2Zmc2V0cyA9PSBOVUxMKSB7CisJCS8qCisJCSAqIFVuYWJsZSB0byBhbGxvY2F0ZSBuZXcgc3RyaXAgaW5mb3JtYXRpb24sIGdpdmUgdXAgYW5kIHVzZQorCQkgKiB0aGUgb3JpZ2luYWwgb25lIHN0cmlwIGluZm9ybWF0aW9uLgorCQkgKi8KKwkJaWYgKG5ld2NvdW50cyAhPSBOVUxMKQorCQkJX1RJRkZmcmVlKG5ld2NvdW50cyk7CisJCWlmIChuZXdvZmZzZXRzICE9IE5VTEwpCisJCQlfVElGRmZyZWUobmV3b2Zmc2V0cyk7CisJCXJldHVybjsKKwl9CisJLyoKKwkgKiBGaWxsIHRoZSBzdHJpcCBpbmZvcm1hdGlvbiBhcnJheXMgd2l0aCBuZXcgYnl0ZWNvdW50cyBhbmQgb2Zmc2V0cworCSAqIHRoYXQgcmVmbGVjdCB0aGUgYnJva2VuLXVwIGZvcm1hdC4KKwkgKi8KKwlmb3IgKHN0cmlwID0gMDsgc3RyaXAgPCBuc3RyaXBzMzI7IHN0cmlwKyspIHsKKwkJaWYgKHN0cmlwYnl0ZXMgPiBieXRlY291bnQpCisJCQlzdHJpcGJ5dGVzID0gYnl0ZWNvdW50OworCQluZXdjb3VudHNbc3RyaXBdID0gc3RyaXBieXRlczsKKwkJbmV3b2Zmc2V0c1tzdHJpcF0gPSBvZmZzZXQ7CisJCW9mZnNldCArPSBzdHJpcGJ5dGVzOworCQlieXRlY291bnQgLT0gc3RyaXBieXRlczsKKwl9CisJLyoKKwkgKiBSZXBsYWNlIG9sZCBzaW5nbGUgc3RyaXAgaW5mbyB3aXRoIG11bHRpLXN0cmlwIGluZm8uCisJICovCisJdGQtPnRkX3N0cmlwc3BlcmltYWdlID0gdGQtPnRkX25zdHJpcHMgPSBuc3RyaXBzMzI7CisJVElGRlNldEZpZWxkKHRpZiwgVElGRlRBR19ST1dTUEVSU1RSSVAsIHJvd3NwZXJzdHJpcCk7CisKKwlfVElGRmZyZWUodGQtPnRkX3N0cmlwYnl0ZWNvdW50KTsKKwlfVElGRmZyZWUodGQtPnRkX3N0cmlwb2Zmc2V0KTsKKwl0ZC0+dGRfc3RyaXBieXRlY291bnQgPSBuZXdjb3VudHM7CisJdGQtPnRkX3N0cmlwb2Zmc2V0ID0gbmV3b2Zmc2V0czsKKwl0ZC0+dGRfc3RyaXBieXRlY291bnRzb3J0ZWQgPSAxOworfQorCitpbnQgX1RJRkZGaWxsU3RyaWxlcyggVElGRiAqdGlmICkKK3sKKyNpZiBkZWZpbmVkKERFRkVSX1NUUklMRV9MT0FEKQorICAgICAgICByZWdpc3RlciBUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisgICAgICAgIGludCByZXR1cm5fdmFsdWUgPSAxOworCisgICAgICAgIGlmKCB0ZC0+dGRfc3RyaXBvZmZzZXQgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgaWYoIHRkLT50ZF9zdHJpcG9mZnNldF9lbnRyeS50ZGlyX2NvdW50ID09IDAgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmICghVElGRkZldGNoU3RyaXBUaGluZyh0aWYsJih0ZC0+dGRfc3RyaXBvZmZzZXRfZW50cnkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQtPnRkX25zdHJpcHMsJnRkLT50ZF9zdHJpcG9mZnNldCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm5fdmFsdWUgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFUSUZGRmV0Y2hTdHJpcFRoaW5nKHRpZiwmKHRkLT50ZF9zdHJpcGJ5dGVjb3VudF9lbnRyeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+dGRfbnN0cmlwcywmdGQtPnRkX3N0cmlwYnl0ZWNvdW50KSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybl92YWx1ZSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBfVElGRm1lbXNldCggJih0ZC0+dGRfc3RyaXBvZmZzZXRfZW50cnkpLCAwLCBzaXplb2YoVElGRkRpckVudHJ5KSk7CisgICAgICAgIF9USUZGbWVtc2V0KCAmKHRkLT50ZF9zdHJpcGJ5dGVjb3VudF9lbnRyeSksIDAsIHNpemVvZihUSUZGRGlyRW50cnkpKTsKKworCWlmICh0aWYtPnRpZl9kaXIudGRfbnN0cmlwcyA+IDEgJiYgcmV0dXJuX3ZhbHVlID09IDEgKSB7CisJCXVpbnQzMiBzdHJpcDsKKworCQl0aWYtPnRpZl9kaXIudGRfc3RyaXBieXRlY291bnRzb3J0ZWQgPSAxOworCQlmb3IgKHN0cmlwID0gMTsgc3RyaXAgPCB0aWYtPnRpZl9kaXIudGRfbnN0cmlwczsgc3RyaXArKykgeworCQkJaWYgKHRpZi0+dGlmX2Rpci50ZF9zdHJpcG9mZnNldFtzdHJpcCAtIDFdID4KKwkJCSAgICB0aWYtPnRpZl9kaXIudGRfc3RyaXBvZmZzZXRbc3RyaXBdKSB7CisJCQkJdGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50c29ydGVkID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworICAgICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOworI2Vsc2UgLyogIWRlZmluZWQoREVGRVJfU1RSSUxFX0xPQUQpICovCisgICAgICAgICh2b2lkKSB0aWY7CisgICAgICAgIHJldHVybiAxOworI2VuZGlmIAorfQorCisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTggc3c9OCBub2V0OiAqLworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZGlyd3JpdGUuYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2RpcndyaXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBmZDhkYwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2RpcndyaXRlLmMKQEAgLTAsMCArMSwyOTExIEBACisvKiAkSWQ6IHRpZl9kaXJ3cml0ZS5jLHYgMS43OCAyMDE1LTA1LTMxIDAwOjM4OjQ2IGJmcmllc2VuIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgKiB0aGF0IChpKSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisgKiBhbGwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uLCBhbmQgKGlpKSB0aGUgbmFtZXMgb2YKKyAqIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzIG1heSBub3QgYmUgdXNlZCBpbiBhbnkgYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCB0aGUgc3BlY2lmaWMsIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24gb2YgU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZCisgKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgU0FNIExFRkZMRVIgT1IgU0lMSUNPTiBHUkFQSElDUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELAorICogT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorICogV0hFVEhFUiBPUiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRQorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVElGRiBMaWJyYXJ5LgorICoKKyAqIERpcmVjdG9yeSBXcml0ZSBTdXBwb3J0IFJvdXRpbmVzLgorICovCisjaW5jbHVkZSAidGlmZmlvcC5oIgorCisjaWZkZWYgSEFWRV9JRUVFRlAKKyNkZWZpbmUgVElGRkN2dE5hdGl2ZVRvSUVFRUZsb2F0KHRpZiwgbiwgZnApCisjZGVmaW5lIFRJRkZDdnROYXRpdmVUb0lFRUVEb3VibGUodGlmLCBuLCBkcCkKKyNlbHNlCitleHRlcm4gdm9pZCBUSUZGQ3Z0TmF0aXZlVG9JRUVFRmxvYXQoVElGRiogdGlmLCB1aW50MzIgbiwgZmxvYXQqIGZwKTsKK2V4dGVybiB2b2lkIFRJRkZDdnROYXRpdmVUb0lFRUVEb3VibGUoVElGRiogdGlmLCB1aW50MzIgbiwgZG91YmxlKiBkcCk7CisjZW5kaWYKKworc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlTZWMoVElGRiogdGlmLCBpbnQgaXNpbWFnZSwgaW50IGltYWdlZG9uZSwgdWludDY0KiBwZGlyb2ZmKTsKKworc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdTYW1wbGVmb3JtYXRBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgZG91YmxlKiB2YWx1ZSk7CisjaWYgMAorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdTYW1wbGVmb3JtYXRQZXJTYW1wbGUoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCBkb3VibGUgdmFsdWUpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnQXNjaWkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGNoYXIqIHZhbHVlKTsKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnVW5kZWZpbmVkQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQ4KiB2YWx1ZSk7CisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0J5dGUoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50OCB2YWx1ZSk7CisjZW5kaWYKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnQnl0ZUFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCB1aW50OCogdmFsdWUpOworI2lmIDAKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnQnl0ZVBlclNhbXBsZShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQ4IHZhbHVlKTsKKyNlbmRpZgorI2lmZGVmIG5vdGRlZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdTYnl0ZShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGludDggdmFsdWUpOworI2VuZGlmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ1NieXRlQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGludDgqIHZhbHVlKTsKKyNpZiAwCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ1NieXRlUGVyU2FtcGxlKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgaW50OCB2YWx1ZSk7CisjZW5kaWYKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnQoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MTYgdmFsdWUpOworc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdTaG9ydEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCB1aW50MTYqIHZhbHVlKTsKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnRQZXJTYW1wbGUoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MTYgdmFsdWUpOworI2lmZGVmIG5vdGRlZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdTc2hvcnQoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCBpbnQxNiB2YWx1ZSk7CisjZW5kaWYKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnU3Nob3J0QXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGludDE2KiB2YWx1ZSk7CisjaWYgMAorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdTc2hvcnRQZXJTYW1wbGUoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCBpbnQxNiB2YWx1ZSk7CisjZW5kaWYKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnTG9uZyhUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiB2YWx1ZSk7CitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmdBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgdWludDMyKiB2YWx1ZSk7CisjaWYgMAorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdMb25nUGVyU2FtcGxlKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIHZhbHVlKTsKKyNlbmRpZgorI2lmZGVmIG5vdGRlZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdTbG9uZyhUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGludDMyIHZhbHVlKTsKKyNlbmRpZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdTbG9uZ0FycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCBpbnQzMiogdmFsdWUpOworI2lmIDAKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnU2xvbmdQZXJTYW1wbGUoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCBpbnQzMiB2YWx1ZSk7CisjZW5kaWYKKyNpZmRlZiBub3RkZWYKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnTG9uZzgoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50NjQgdmFsdWUpOworI2VuZGlmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmc4QXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQ2NCogdmFsdWUpOworI2lmZGVmIG5vdGRlZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdTbG9uZzgoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCBpbnQ2NCB2YWx1ZSk7CisjZW5kaWYKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnU2xvbmc4QXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGludDY0KiB2YWx1ZSk7CitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ1JhdGlvbmFsKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgZG91YmxlIHZhbHVlKTsKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnUmF0aW9uYWxBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgZmxvYXQqIHZhbHVlKTsKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnU3JhdGlvbmFsQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGZsb2F0KiB2YWx1ZSk7CisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0Zsb2F0KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgZmxvYXQgdmFsdWUpOworI2VuZGlmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0Zsb2F0QXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGZsb2F0KiB2YWx1ZSk7CisjaWYgMAorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdGbG9hdFBlclNhbXBsZShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGZsb2F0IHZhbHVlKTsKKyNlbmRpZgorI2lmZGVmIG5vdGRlZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdEb3VibGUoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCBkb3VibGUgdmFsdWUpOworI2VuZGlmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0RvdWJsZUFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCBkb3VibGUqIHZhbHVlKTsKKyNpZiAwCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0RvdWJsZVBlclNhbXBsZShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGRvdWJsZSB2YWx1ZSk7CisjZW5kaWYKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnSWZkQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQzMiogdmFsdWUpOworI2lmZGVmIG5vdGRlZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdJZmQ4QXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQ2NCogdmFsdWUpOworI2VuZGlmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0TG9uZyhUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiB2YWx1ZSk7CitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmdMb25nOEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCB1aW50NjQqIHZhbHVlKTsKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnSWZkSWZkOEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCB1aW50NjQqIHZhbHVlKTsKKyNpZmRlZiBub3RkZWYKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnRMb25nTG9uZzhBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgdWludDY0KiB2YWx1ZSk7CisjZW5kaWYKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnQ29sb3JtYXAoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyKTsKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnVHJhbnNmZXJmdW5jdGlvbihUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIpOworc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdTdWJpZmQoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyKTsKKworc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkQXNjaWkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGNoYXIqIHZhbHVlKTsKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFVuZGVmaW5lZEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCB1aW50OCogdmFsdWUpOworI2lmZGVmIG5vdGRlZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkQnl0ZShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQ4IHZhbHVlKTsKKyNlbmRpZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkQnl0ZUFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCB1aW50OCogdmFsdWUpOworI2lmZGVmIG5vdGRlZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU2J5dGUoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCBpbnQ4IHZhbHVlKTsKKyNlbmRpZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU2J5dGVBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgaW50OCogdmFsdWUpOworc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU2hvcnQoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MTYgdmFsdWUpOworc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU2hvcnRBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgdWludDE2KiB2YWx1ZSk7CisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTc2hvcnQoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCBpbnQxNiB2YWx1ZSk7CisjZW5kaWYKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNzaG9ydEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCBpbnQxNiogdmFsdWUpOworc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkTG9uZyhUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiB2YWx1ZSk7CitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRMb25nQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQzMiogdmFsdWUpOworI2lmZGVmIG5vdGRlZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU2xvbmcoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCBpbnQzMiB2YWx1ZSk7CisjZW5kaWYKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNsb25nQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGludDMyKiB2YWx1ZSk7CisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRMb25nOChUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQ2NCB2YWx1ZSk7CisjZW5kaWYKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZExvbmc4QXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQ2NCogdmFsdWUpOworI2lmZGVmIG5vdGRlZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU2xvbmc4KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgaW50NjQgdmFsdWUpOworI2VuZGlmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTbG9uZzhBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgaW50NjQqIHZhbHVlKTsKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFJhdGlvbmFsKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgZG91YmxlIHZhbHVlKTsKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFJhdGlvbmFsQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGZsb2F0KiB2YWx1ZSk7CitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTcmF0aW9uYWxBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgZmxvYXQqIHZhbHVlKTsKKyNpZmRlZiBub3RkZWYKK3N0YXRpYyBpbnQgVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZEZsb2F0KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgZmxvYXQgdmFsdWUpOworI2VuZGlmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRGbG9hdEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCBmbG9hdCogdmFsdWUpOworI2lmZGVmIG5vdGRlZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkRG91YmxlKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgZG91YmxlIHZhbHVlKTsKKyNlbmRpZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkRG91YmxlQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGRvdWJsZSogdmFsdWUpOworc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkSWZkQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQzMiogdmFsdWUpOworc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkSWZkOEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCB1aW50NjQqIHZhbHVlKTsKKworc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdEYXRhKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDE2IGRhdGF0eXBlLCB1aW50MzIgY291bnQsIHVpbnQzMiBkYXRhbGVuZ3RoLCB2b2lkKiBkYXRhKTsKKworc3RhdGljIGludCBUSUZGTGlua0RpcmVjdG9yeShUSUZGKik7CisKKy8qCisgKiBXcml0ZSB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgZGlyZWN0b3J5CisgKiB0byB0aGUgc3BlY2lmaWVkIGZpbGUuICBUaGlzIHJvdXRpbmUgZG9lc24ndAorICogaGFuZGxlIG92ZXJ3cml0aW5nIGEgZGlyZWN0b3J5IHdpdGggYXV4aWxpYXJ5CisgKiBzdG9yYWdlIHRoYXQncyBiZWVuIGNoYW5nZWQuCisgKi8KK2ludAorVElGRldyaXRlRGlyZWN0b3J5KFRJRkYqIHRpZikKK3sKKwlyZXR1cm4gVElGRldyaXRlRGlyZWN0b3J5U2VjKHRpZixUUlVFLFRSVUUsTlVMTCk7Cit9CisKKy8qCisgKiBTaW1pbGFyIHRvIFRJRkZXcml0ZURpcmVjdG9yeSgpLCB3cml0ZXMgdGhlIGRpcmVjdG9yeSBvdXQKKyAqIGJ1dCBsZWF2ZXMgYWxsIGRhdGEgc3RydWN0dXJlcyBpbiBtZW1vcnkgc28gdGhhdCBpdCBjYW4gYmUKKyAqIHdyaXR0ZW4gYWdhaW4uICBUaGlzIHdpbGwgbWFrZSBhIHBhcnRpYWxseSB3cml0dGVuIFRJRkYgZmlsZQorICogcmVhZGFibGUgYmVmb3JlIGl0IGlzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQvY2xvc2VkLgorICovCitpbnQKK1RJRkZDaGVja3BvaW50RGlyZWN0b3J5KFRJRkYqIHRpZikKK3sKKwlpbnQgcmM7CisJLyogU2V0dXAgdGhlIHN0cmlwcyBhcnJheXMsIGlmIHRoZXkgaGF2ZW4ndCBhbHJlYWR5IGJlZW4uICovCisJaWYgKHRpZi0+dGlmX2Rpci50ZF9zdHJpcG9mZnNldCA9PSBOVUxMKQorCSAgICAodm9pZCkgVElGRlNldHVwU3RyaXBzKHRpZik7CisJcmMgPSBUSUZGV3JpdGVEaXJlY3RvcnlTZWModGlmLFRSVUUsRkFMU0UsTlVMTCk7CisJKHZvaWQpIFRJRkZTZXRXcml0ZU9mZnNldCh0aWYsIFRJRkZTZWVrRmlsZSh0aWYsIDAsIFNFRUtfRU5EKSk7CisJcmV0dXJuIHJjOworfQorCitpbnQKK1RJRkZXcml0ZUN1c3RvbURpcmVjdG9yeShUSUZGKiB0aWYsIHVpbnQ2NCogcGRpcm9mZikKK3sKKwlyZXR1cm4gVElGRldyaXRlRGlyZWN0b3J5U2VjKHRpZixGQUxTRSxGQUxTRSxwZGlyb2ZmKTsKK30KKworLyoKKyAqIFNpbWlsYXIgdG8gVElGRldyaXRlRGlyZWN0b3J5KCksIGJ1dCBpZiB0aGUgZGlyZWN0b3J5IGhhcyBhbHJlYWR5CisgKiBiZWVuIHdyaXR0ZW4gb25jZSwgaXQgaXMgcmVsb2NhdGVkIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGluIGNhc2UgaXQKKyAqIGhhcyBjaGFuZ2VkIGluIHNpemUuICBOb3RlIHRoYXQgdGhpcyB3aWxsIHJlc3VsdCBpbiB0aGUgbG9zcyBvZiB0aGUKKyAqIHByZXZpb3VzbHkgdXNlZCBkaXJlY3Rvcnkgc3BhY2UuIAorICovIAoraW50CitUSUZGUmV3cml0ZURpcmVjdG9yeSggVElGRiAqdGlmICkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGUmV3cml0ZURpcmVjdG9yeSI7CisKKwkvKiBXZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwgaWYgaXQgaGFzbid0IGJlZW4gd3JpdHRlbi4gKi8KKwlpZiggdGlmLT50aWZfZGlyb2ZmID09IDAgKQorCQlyZXR1cm4gVElGRldyaXRlRGlyZWN0b3J5KCB0aWYgKTsKKworCS8qCisJICogRmluZCBhbmQgemVybyB0aGUgcG9pbnRlciB0byB0aGlzIGRpcmVjdG9yeSwgc28gdGhhdCBUSUZGTGlua0RpcmVjdG9yeQorCSAqIHdpbGwgY2F1c2UgaXQgdG8gYmUgYWRkZWQgYWZ0ZXIgdGhpcyBkaXJlY3RvcmllcyBjdXJyZW50IHByZS1saW5rLgorCSAqLworCisJaWYgKCEodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKSkKKwl7CisJCWlmICh0aWYtPnRpZl9oZWFkZXIuY2xhc3NpYy50aWZmX2Rpcm9mZiA9PSB0aWYtPnRpZl9kaXJvZmYpCisJCXsKKwkJCXRpZi0+dGlmX2hlYWRlci5jbGFzc2ljLnRpZmZfZGlyb2ZmID0gMDsKKwkJCXRpZi0+dGlmX2Rpcm9mZiA9IDA7CisKKwkJCVRJRkZTZWVrRmlsZSh0aWYsNCxTRUVLX1NFVCk7CisJCQlpZiAoIVdyaXRlT0sodGlmLCAmKHRpZi0+dGlmX2hlYWRlci5jbGFzc2ljLnRpZmZfZGlyb2ZmKSw0KSkKKwkJCXsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgdGlmLT50aWZfbmFtZSwKKwkJCQkgICAgIkVycm9yIHVwZGF0aW5nIFRJRkYgaGVhZGVyIik7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXVpbnQzMiBuZXh0ZGlyOworCQkJbmV4dGRpciA9IHRpZi0+dGlmX2hlYWRlci5jbGFzc2ljLnRpZmZfZGlyb2ZmOworCQkJd2hpbGUoMSkgeworCQkJCXVpbnQxNiBkaXJjb3VudDsKKwkJCQl1aW50MzIgbmV4dG5leHRkaXI7CisKKwkJCQlpZiAoIVNlZWtPSyh0aWYsIG5leHRkaXIpIHx8CisJCQkJICAgICFSZWFkT0sodGlmLCAmZGlyY291bnQsIDIpKSB7CisJCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJCSAgICAgIkVycm9yIGZldGNoaW5nIGRpcmVjdG9yeSBjb3VudCIpOworCQkJCQlyZXR1cm4gKDApOworCQkJCX0KKwkJCQlpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1NXQUIpCisJCQkJCVRJRkZTd2FiU2hvcnQoJmRpcmNvdW50KTsKKwkJCQkodm9pZCkgVElGRlNlZWtGaWxlKHRpZiwKKwkJCQkgICAgbmV4dGRpcisyK2RpcmNvdW50KjEyLCBTRUVLX1NFVCk7CisJCQkJaWYgKCFSZWFkT0sodGlmLCAmbmV4dG5leHRkaXIsIDQpKSB7CisJCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJCSAgICAgIkVycm9yIGZldGNoaW5nIGRpcmVjdG9yeSBsaW5rIik7CisJCQkJCXJldHVybiAoMCk7CisJCQkJfQorCQkJCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfU1dBQikKKwkJCQkJVElGRlN3YWJMb25nKCZuZXh0bmV4dGRpcik7CisJCQkJaWYgKG5leHRuZXh0ZGlyPT10aWYtPnRpZl9kaXJvZmYpCisJCQkJeworCQkJCQl1aW50MzIgbTsKKwkJCQkJbT0wOworCQkJCQkodm9pZCkgVElGRlNlZWtGaWxlKHRpZiwKKwkJCQkJICAgIG5leHRkaXIrMitkaXJjb3VudCoxMiwgU0VFS19TRVQpOworCQkJCQlpZiAoIVdyaXRlT0sodGlmLCAmbSwgNCkpIHsKKwkJCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJCQkgICAgICJFcnJvciB3cml0aW5nIGRpcmVjdG9yeSBsaW5rIik7CisJCQkJCQlyZXR1cm4gKDApOworCQkJCQl9CisJCQkJCXRpZi0+dGlmX2Rpcm9mZj0wOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJbmV4dGRpcj1uZXh0bmV4dGRpcjsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlpZiAodGlmLT50aWZfaGVhZGVyLmJpZy50aWZmX2Rpcm9mZiA9PSB0aWYtPnRpZl9kaXJvZmYpCisJCXsKKwkJCXRpZi0+dGlmX2hlYWRlci5iaWcudGlmZl9kaXJvZmYgPSAwOworCQkJdGlmLT50aWZfZGlyb2ZmID0gMDsKKworCQkJVElGRlNlZWtGaWxlKHRpZiw4LFNFRUtfU0VUKTsKKwkJCWlmICghV3JpdGVPSyh0aWYsICYodGlmLT50aWZfaGVhZGVyLmJpZy50aWZmX2Rpcm9mZiksOCkpCisJCQl7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIHRpZi0+dGlmX25hbWUsCisJCQkJICAgICJFcnJvciB1cGRhdGluZyBUSUZGIGhlYWRlciIpOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQl1aW50NjQgbmV4dGRpcjsKKwkJCW5leHRkaXIgPSB0aWYtPnRpZl9oZWFkZXIuYmlnLnRpZmZfZGlyb2ZmOworCQkJd2hpbGUoMSkgeworCQkJCXVpbnQ2NCBkaXJjb3VudDY0OworCQkJCXVpbnQxNiBkaXJjb3VudDsKKwkJCQl1aW50NjQgbmV4dG5leHRkaXI7CisKKwkJCQlpZiAoIVNlZWtPSyh0aWYsIG5leHRkaXIpIHx8CisJCQkJICAgICFSZWFkT0sodGlmLCAmZGlyY291bnQ2NCwgOCkpIHsKKwkJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkJICAgICAiRXJyb3IgZmV0Y2hpbmcgZGlyZWN0b3J5IGNvdW50Iik7CisJCQkJCXJldHVybiAoMCk7CisJCQkJfQorCQkJCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfU1dBQikKKwkJCQkJVElGRlN3YWJMb25nOCgmZGlyY291bnQ2NCk7CisJCQkJaWYgKGRpcmNvdW50NjQ+MHhGRkZGKQorCQkJCXsKKwkJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkJICAgICAiU2FuaXR5IGNoZWNrIG9uIHRhZyBjb3VudCBmYWlsZWQsIGxpa2VseSBjb3JydXB0IFRJRkYiKTsKKwkJCQkJcmV0dXJuICgwKTsKKwkJCQl9CisJCQkJZGlyY291bnQ9KHVpbnQxNilkaXJjb3VudDY0OworCQkJCSh2b2lkKSBUSUZGU2Vla0ZpbGUodGlmLAorCQkJCSAgICBuZXh0ZGlyKzgrZGlyY291bnQqMjAsIFNFRUtfU0VUKTsKKwkJCQlpZiAoIVJlYWRPSyh0aWYsICZuZXh0bmV4dGRpciwgOCkpIHsKKwkJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkJICAgICAiRXJyb3IgZmV0Y2hpbmcgZGlyZWN0b3J5IGxpbmsiKTsKKwkJCQkJcmV0dXJuICgwKTsKKwkJCQl9CisJCQkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKQorCQkJCQlUSUZGU3dhYkxvbmc4KCZuZXh0bmV4dGRpcik7CisJCQkJaWYgKG5leHRuZXh0ZGlyPT10aWYtPnRpZl9kaXJvZmYpCisJCQkJeworCQkJCQl1aW50NjQgbTsKKwkJCQkJbT0wOworCQkJCQkodm9pZCkgVElGRlNlZWtGaWxlKHRpZiwKKwkJCQkJICAgIG5leHRkaXIrOCtkaXJjb3VudCoyMCwgU0VFS19TRVQpOworCQkJCQlpZiAoIVdyaXRlT0sodGlmLCAmbSwgOCkpIHsKKwkJCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJCQkgICAgICJFcnJvciB3cml0aW5nIGRpcmVjdG9yeSBsaW5rIik7CisJCQkJCQlyZXR1cm4gKDApOworCQkJCQl9CisJCQkJCXRpZi0+dGlmX2Rpcm9mZj0wOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJbmV4dGRpcj1uZXh0bmV4dGRpcjsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogTm93IHVzZSBUSUZGV3JpdGVEaXJlY3RvcnkoKSBub3JtYWxseS4KKwkgKi8KKworCXJldHVybiBUSUZGV3JpdGVEaXJlY3RvcnkoIHRpZiApOworfQorCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlTZWMoVElGRiogdGlmLCBpbnQgaXNpbWFnZSwgaW50IGltYWdlZG9uZSwgdWludDY0KiBwZGlyb2ZmKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZXcml0ZURpcmVjdG9yeVNlYyI7CisJdWludDMyIG5kaXI7CisJVElGRkRpckVudHJ5KiBkaXI7CisJdWludDMyIGRpcnNpemU7CisJdm9pZCogZGlybWVtOworCXVpbnQzMiBtOworCWlmICh0aWYtPnRpZl9tb2RlID09IE9fUkRPTkxZKQorCQlyZXR1cm4gKDEpOworCisgICAgICAgIF9USUZGRmlsbFN0cmlsZXMoIHRpZiApOworICAgICAgICAKKwkvKgorCSAqIENsZWFyIHdyaXRlIHN0YXRlIHNvIHRoYXQgc3Vic2VxdWVudCBpbWFnZXMgd2l0aAorCSAqIGRpZmZlcmVudCBjaGFyYWN0ZXJpc3RpY3MgZ2V0IHRoZSByaWdodCBidWZmZXJzCisJICogc2V0dXAgZm9yIHRoZW0uCisJICovCisJaWYgKGltYWdlZG9uZSkKKwl7CisJCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfUE9TVEVOQ09ERSkKKwkJeworCQkJdGlmLT50aWZfZmxhZ3MgJj0gflRJRkZfUE9TVEVOQ09ERTsKKwkJCWlmICghKCp0aWYtPnRpZl9wb3N0ZW5jb2RlKSh0aWYpKQorCQkJeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwKKwkJCQkgICAgIkVycm9yIHBvc3QtZW5jb2RpbmcgYmVmb3JlIGRpcmVjdG9yeSB3cml0ZSIpOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCX0KKwkJKCp0aWYtPnRpZl9jbG9zZSkodGlmKTsgICAgICAgLyogc2h1dGRvd24gZW5jb2RlciAqLworCQkvKgorCQkgKiBGbHVzaCBhbnkgZGF0YSB0aGF0IG1pZ2h0IGhhdmUgYmVlbiB3cml0dGVuCisJCSAqIGJ5IHRoZSBjb21wcmVzc2lvbiBjbG9zZStjbGVhbnVwIHJvdXRpbmVzLiAgQnV0CisgICAgICAgICAgICAgICAgICogYmUgY2FyZWZ1bCBub3QgdG8gd3JpdGUgc3R1ZmYgaWYgd2UgZGlkbid0IGFkZCBkYXRhCisgICAgICAgICAgICAgICAgICogaW4gdGhlIHByZXZpb3VzIHN0ZXBzIGFzIHRoZSAicmF3Y2MiIGRhdGEgbWF5IHdlbGwgYmUKKyAgICAgICAgICAgICAgICAgKiBhIHByZXZpb3VzbHkgcmVhZCB0aWxlL3N0cmlwIGluIG1peGVkIHJlYWQvd3JpdGUgbW9kZS4KKwkJICovCisJCWlmICh0aWYtPnRpZl9yYXdjYyA+IDAgCisJCSAgICAmJiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX0JFRU5XUklUSU5HKSAhPSAwICkKKwkJeworCQkgICAgaWYoICFUSUZGRmx1c2hEYXRhMSh0aWYpICkKKyAgICAgICAgICAgICAgICAgICAgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAiRXJyb3IgZmx1c2hpbmcgZGF0YSBiZWZvcmUgZGlyZWN0b3J5IHdyaXRlIik7CisJCQlyZXR1cm4gKDApOworICAgICAgICAgICAgICAgICAgICB9CisJCX0KKwkJaWYgKCh0aWYtPnRpZl9mbGFncyAmIFRJRkZfTVlCVUZGRVIpICYmIHRpZi0+dGlmX3Jhd2RhdGEpCisJCXsKKwkJCV9USUZGZnJlZSh0aWYtPnRpZl9yYXdkYXRhKTsKKwkJCXRpZi0+dGlmX3Jhd2RhdGEgPSBOVUxMOworCQkJdGlmLT50aWZfcmF3Y2MgPSAwOworCQkJdGlmLT50aWZfcmF3ZGF0YXNpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfcmF3ZGF0YW9mZiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB0aWYtPnRpZl9yYXdkYXRhbG9hZGVkID0gMDsKKwkJfQorCQl0aWYtPnRpZl9mbGFncyAmPSB+KFRJRkZfQkVFTldSSVRJTkd8VElGRl9CVUZGRVJTRVRVUCk7CisJfQorCWRpcj1OVUxMOworCWRpcm1lbT1OVUxMOworCWRpcnNpemU9MDsKKwl3aGlsZSAoMSkKKwl7CisJCW5kaXI9MDsKKwkJaWYgKGlzaW1hZ2UpCisJCXsKKwkJCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX0lNQUdFRElNRU5TSU9OUykpCisJCQl7CisJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdTaG9ydExvbmcodGlmLCZuZGlyLGRpcixUSUZGVEFHX0lNQUdFV0lEVEgsdGlmLT50aWZfZGlyLnRkX2ltYWdld2lkdGgpKQorCQkJCQlnb3RvIGJhZDsKKwkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0TG9uZyh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfSU1BR0VMRU5HVEgsdGlmLT50aWZfZGlyLnRkX2ltYWdlbGVuZ3RoKSkKKwkJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9USUxFRElNRU5TSU9OUykpCisJCQl7CisJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdTaG9ydExvbmcodGlmLCZuZGlyLGRpcixUSUZGVEFHX1RJTEVXSURUSCx0aWYtPnRpZl9kaXIudGRfdGlsZXdpZHRoKSkKKwkJCQkJZ290byBiYWQ7CisJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdTaG9ydExvbmcodGlmLCZuZGlyLGRpcixUSUZGVEFHX1RJTEVMRU5HVEgsdGlmLT50aWZfZGlyLnRkX3RpbGVsZW5ndGgpKQorCQkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1JFU09MVVRJT04pKQorCQkJeworCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnUmF0aW9uYWwodGlmLCZuZGlyLGRpcixUSUZGVEFHX1hSRVNPTFVUSU9OLHRpZi0+dGlmX2Rpci50ZF94cmVzb2x1dGlvbikpCisJCQkJCWdvdG8gYmFkOworCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnUmF0aW9uYWwodGlmLCZuZGlyLGRpcixUSUZGVEFHX1lSRVNPTFVUSU9OLHRpZi0+dGlmX2Rpci50ZF95cmVzb2x1dGlvbikpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfUE9TSVRJT04pKQorCQkJeworCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnUmF0aW9uYWwodGlmLCZuZGlyLGRpcixUSUZGVEFHX1hQT1NJVElPTix0aWYtPnRpZl9kaXIudGRfeHBvc2l0aW9uKSkKKwkJCQkJZ290byBiYWQ7CisJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdSYXRpb25hbCh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfWVBPU0lUSU9OLHRpZi0+dGlmX2Rpci50ZF95cG9zaXRpb24pKQorCQkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1NVQkZJTEVUWVBFKSkKKwkJCXsKKwkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmcodGlmLCZuZGlyLGRpcixUSUZGVEFHX1NVQkZJTEVUWVBFLHRpZi0+dGlmX2Rpci50ZF9zdWJmaWxldHlwZSkpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfQklUU1BFUlNBTVBMRSkpCisJCQl7CisJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdTaG9ydFBlclNhbXBsZSh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfQklUU1BFUlNBTVBMRSx0aWYtPnRpZl9kaXIudGRfYml0c3BlcnNhbXBsZSkpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfQ09NUFJFU1NJT04pKQorCQkJeworCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnQodGlmLCZuZGlyLGRpcixUSUZGVEFHX0NPTVBSRVNTSU9OLHRpZi0+dGlmX2Rpci50ZF9jb21wcmVzc2lvbikpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfUEhPVE9NRVRSSUMpKQorCQkJeworCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnQodGlmLCZuZGlyLGRpcixUSUZGVEFHX1BIT1RPTUVUUklDLHRpZi0+dGlmX2Rpci50ZF9waG90b21ldHJpYykpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfVEhSRVNISE9MRElORykpCisJCQl7CisJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdTaG9ydCh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfVEhSRVNISE9MRElORyx0aWYtPnRpZl9kaXIudGRfdGhyZXNoaG9sZGluZykpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfRklMTE9SREVSKSkKKwkJCXsKKwkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0KHRpZiwmbmRpcixkaXIsVElGRlRBR19GSUxMT1JERVIsdGlmLT50aWZfZGlyLnRkX2ZpbGxvcmRlcikpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfT1JJRU5UQVRJT04pKQorCQkJeworCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnQodGlmLCZuZGlyLGRpcixUSUZGVEFHX09SSUVOVEFUSU9OLHRpZi0+dGlmX2Rpci50ZF9vcmllbnRhdGlvbikpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfU0FNUExFU1BFUlBJWEVMKSkKKwkJCXsKKwkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0KHRpZiwmbmRpcixkaXIsVElGRlRBR19TQU1QTEVTUEVSUElYRUwsdGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbCkpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfUk9XU1BFUlNUUklQKSkKKwkJCXsKKwkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0TG9uZyh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfUk9XU1BFUlNUUklQLHRpZi0+dGlmX2Rpci50ZF9yb3dzcGVyc3RyaXApKQorCQkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX01JTlNBTVBMRVZBTFVFKSkKKwkJCXsKKwkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0UGVyU2FtcGxlKHRpZiwmbmRpcixkaXIsVElGRlRBR19NSU5TQU1QTEVWQUxVRSx0aWYtPnRpZl9kaXIudGRfbWluc2FtcGxldmFsdWUpKQorCQkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX01BWFNBTVBMRVZBTFVFKSkKKwkJCXsKKwkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0UGVyU2FtcGxlKHRpZiwmbmRpcixkaXIsVElGRlRBR19NQVhTQU1QTEVWQUxVRSx0aWYtPnRpZl9kaXIudGRfbWF4c2FtcGxldmFsdWUpKQorCQkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1BMQU5BUkNPTkZJRykpCisJCQl7CisJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdTaG9ydCh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfUExBTkFSQ09ORklHLHRpZi0+dGlmX2Rpci50ZF9wbGFuYXJjb25maWcpKQorCQkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1JFU09MVVRJT05VTklUKSkKKwkJCXsKKwkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0KHRpZiwmbmRpcixkaXIsVElGRlRBR19SRVNPTFVUSU9OVU5JVCx0aWYtPnRpZl9kaXIudGRfcmVzb2x1dGlvbnVuaXQpKQorCQkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1BBR0VOVU1CRVIpKQorCQkJeworCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnRBcnJheSh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfUEFHRU5VTUJFUiwyLCZ0aWYtPnRpZl9kaXIudGRfcGFnZW51bWJlclswXSkpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfU1RSSVBCWVRFQ09VTlRTKSkKKwkJCXsKKwkJCQlpZiAoIWlzVGlsZWQodGlmKSkKKwkJCQl7CisJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnTG9uZ0xvbmc4QXJyYXkodGlmLCZuZGlyLGRpcixUSUZGVEFHX1NUUklQQllURUNPVU5UUyx0aWYtPnRpZl9kaXIudGRfbnN0cmlwcyx0aWYtPnRpZl9kaXIudGRfc3RyaXBieXRlY291bnQpKQorCQkJCQkJZ290byBiYWQ7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnTG9uZ0xvbmc4QXJyYXkodGlmLCZuZGlyLGRpcixUSUZGVEFHX1RJTEVCWVRFQ09VTlRTLHRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzLHRpZi0+dGlmX2Rpci50ZF9zdHJpcGJ5dGVjb3VudCkpCisJCQkJCQlnb3RvIGJhZDsKKwkJCQl9CisJCQl9CisJCQlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9TVFJJUE9GRlNFVFMpKQorCQkJeworCQkJCWlmICghaXNUaWxlZCh0aWYpKQorCQkJCXsKKwkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdMb25nTG9uZzhBcnJheSh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfU1RSSVBPRkZTRVRTLHRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzLHRpZi0+dGlmX2Rpci50ZF9zdHJpcG9mZnNldCkpCisJCQkJCQlnb3RvIGJhZDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdMb25nTG9uZzhBcnJheSh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfVElMRU9GRlNFVFMsdGlmLT50aWZfZGlyLnRkX25zdHJpcHMsdGlmLT50aWZfZGlyLnRkX3N0cmlwb2Zmc2V0KSkKKwkJCQkJCWdvdG8gYmFkOworCQkJCX0KKwkJCX0KKwkJCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX0NPTE9STUFQKSkKKwkJCXsKKwkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ0NvbG9ybWFwKHRpZiwmbmRpcixkaXIpKQorCQkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX0VYVFJBU0FNUExFUykpCisJCQl7CisJCQkJaWYgKHRpZi0+dGlmX2Rpci50ZF9leHRyYXNhbXBsZXMpCisJCQkJeworCQkJCQl1aW50MTYgbmE7CisJCQkJCXVpbnQxNiogbmI7CisJCQkJCVRJRkZHZXRGaWVsZERlZmF1bHRlZCh0aWYsVElGRlRBR19FWFRSQVNBTVBMRVMsJm5hLCZuYik7CisJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnRBcnJheSh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfRVhUUkFTQU1QTEVTLG5hLG5iKSkKKwkJCQkJCWdvdG8gYmFkOworCQkJCX0KKwkJCX0KKwkJCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1NBTVBMRUZPUk1BVCkpCisJCQl7CisJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdTaG9ydFBlclNhbXBsZSh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfU0FNUExFRk9STUFULHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVmb3JtYXQpKQorCQkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1NNSU5TQU1QTEVWQUxVRSkpCisJCQl7CisJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdTYW1wbGVmb3JtYXRBcnJheSh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfU01JTlNBTVBMRVZBTFVFLHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWwsdGlmLT50aWZfZGlyLnRkX3NtaW5zYW1wbGV2YWx1ZSkpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfU01BWFNBTVBMRVZBTFVFKSkKKwkJCXsKKwkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1NhbXBsZWZvcm1hdEFycmF5KHRpZiwmbmRpcixkaXIsVElGRlRBR19TTUFYU0FNUExFVkFMVUUsdGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbCx0aWYtPnRpZl9kaXIudGRfc21heHNhbXBsZXZhbHVlKSkKKwkJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9JTUFHRURFUFRIKSkKKwkJCXsKKwkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmcodGlmLCZuZGlyLGRpcixUSUZGVEFHX0lNQUdFREVQVEgsdGlmLT50aWZfZGlyLnRkX2ltYWdlZGVwdGgpKQorCQkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1RJTEVERVBUSCkpCisJCQl7CisJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdMb25nKHRpZiwmbmRpcixkaXIsVElGRlRBR19USUxFREVQVEgsdGlmLT50aWZfZGlyLnRkX3RpbGVkZXB0aCkpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfSEFMRlRPTkVISU5UUykpCisJCQl7CisJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdTaG9ydEFycmF5KHRpZiwmbmRpcixkaXIsVElGRlRBR19IQUxGVE9ORUhJTlRTLDIsJnRpZi0+dGlmX2Rpci50ZF9oYWxmdG9uZWhpbnRzWzBdKSkKKwkJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9ZQ0JDUlNVQlNBTVBMSU5HKSkKKwkJCXsKKwkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0QXJyYXkodGlmLCZuZGlyLGRpcixUSUZGVEFHX1lDQkNSU1VCU0FNUExJTkcsMiwmdGlmLT50aWZfZGlyLnRkX3ljYmNyc3Vic2FtcGxpbmdbMF0pKQorCQkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1lDQkNSUE9TSVRJT05JTkcpKQorCQkJeworCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnQodGlmLCZuZGlyLGRpcixUSUZGVEFHX1lDQkNSUE9TSVRJT05JTkcsdGlmLT50aWZfZGlyLnRkX3ljYmNycG9zaXRpb25pbmcpKQorCQkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1JFRkJMQUNLV0hJVEUpKQorCQkJeworCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnUmF0aW9uYWxBcnJheSh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfUkVGRVJFTkNFQkxBQ0tXSElURSw2LHRpZi0+dGlmX2Rpci50ZF9yZWZibGFja3doaXRlKSkKKwkJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9UUkFOU0ZFUkZVTkNUSU9OKSkKKwkJCXsKKwkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1RyYW5zZmVyZnVuY3Rpb24odGlmLCZuZGlyLGRpcikpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfSU5LTkFNRVMpKQorCQkJeworCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnQXNjaWkodGlmLCZuZGlyLGRpcixUSUZGVEFHX0lOS05BTUVTLHRpZi0+dGlmX2Rpci50ZF9pbmtuYW1lc2xlbix0aWYtPnRpZl9kaXIudGRfaW5rbmFtZXMpKQorCQkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1NVQklGRCkpCisJCQl7CisJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdTdWJpZmQodGlmLCZuZGlyLGRpcikpCisJCQkJCWdvdG8gYmFkOworCQkJfQorCQkJeworCQkJCXVpbnQzMiBuOworCQkJCWZvciAobj0wOyBuPHRpZi0+dGlmX25maWVsZHM7IG4rKykgeworCQkJCQljb25zdCBUSUZGRmllbGQqIG87CisJCQkJCW8gPSB0aWYtPnRpZl9maWVsZHNbbl07CisJCQkJCWlmICgoby0+ZmllbGRfYml0Pj1GSUVMRF9DT0RFQykmJihUSUZGRmllbGRTZXQodGlmLG8tPmZpZWxkX2JpdCkpKQorCQkJCQl7CisJCQkJCQlzd2l0Y2ggKG8tPmdldF9maWVsZF90eXBlKQorCQkJCQkJeworCQkJCQkJCWNhc2UgVElGRl9TRVRHRVRfQVNDSUk6CisJCQkJCQkJCXsKKwkJCQkJCQkJCXVpbnQzMiBwYTsKKwkJCQkJCQkJCWNoYXIqIHBiOworCQkJCQkJCQkJYXNzZXJ0KG8tPmZpZWxkX3R5cGU9PVRJRkZfQVNDSUkpOworCQkJCQkJCQkJYXNzZXJ0KG8tPmZpZWxkX3JlYWRjb3VudD09VElGRl9WQVJJQUJMRSk7CisJCQkJCQkJCQlhc3NlcnQoby0+ZmllbGRfcGFzc2NvdW50PT0wKTsKKwkJCQkJCQkJCVRJRkZHZXRGaWVsZCh0aWYsby0+ZmllbGRfdGFnLCZwYik7CisJCQkJCQkJCQlwYT0odWludDMyKShzdHJsZW4ocGIpKTsKKwkJCQkJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnQXNjaWkodGlmLCZuZGlyLGRpcixvLT5maWVsZF90YWcscGEscGIpKQorCQkJCQkJCQkJCWdvdG8gYmFkOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgVElGRl9TRVRHRVRfVUlOVDE2OgorCQkJCQkJCQl7CisJCQkJCQkJCQl1aW50MTYgcDsKKwkJCQkJCQkJCWFzc2VydChvLT5maWVsZF90eXBlPT1USUZGX1NIT1JUKTsKKwkJCQkJCQkJCWFzc2VydChvLT5maWVsZF9yZWFkY291bnQ9PTEpOworCQkJCQkJCQkJYXNzZXJ0KG8tPmZpZWxkX3Bhc3Njb3VudD09MCk7CisJCQkJCQkJCQlUSUZGR2V0RmllbGQodGlmLG8tPmZpZWxkX3RhZywmcCk7CisJCQkJCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0KHRpZiwmbmRpcixkaXIsby0+ZmllbGRfdGFnLHApKQorCQkJCQkJCQkJCWdvdG8gYmFkOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgVElGRl9TRVRHRVRfVUlOVDMyOgorCQkJCQkJCQl7CisJCQkJCQkJCQl1aW50MzIgcDsKKwkJCQkJCQkJCWFzc2VydChvLT5maWVsZF90eXBlPT1USUZGX0xPTkcpOworCQkJCQkJCQkJYXNzZXJ0KG8tPmZpZWxkX3JlYWRjb3VudD09MSk7CisJCQkJCQkJCQlhc3NlcnQoby0+ZmllbGRfcGFzc2NvdW50PT0wKTsKKwkJCQkJCQkJCVRJRkZHZXRGaWVsZCh0aWYsby0+ZmllbGRfdGFnLCZwKTsKKwkJCQkJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnTG9uZyh0aWYsJm5kaXIsZGlyLG8tPmZpZWxkX3RhZyxwKSkKKwkJCQkJCQkJCQlnb3RvIGJhZDsKKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIFRJRkZfU0VUR0VUX0MzMl9VSU5UODoKKwkJCQkJCQkJeworCQkJCQkJCQkJdWludDMyIHBhOworCQkJCQkJCQkJdm9pZCogcGI7CisJCQkJCQkJCQlhc3NlcnQoby0+ZmllbGRfdHlwZT09VElGRl9VTkRFRklORUQpOworCQkJCQkJCQkJYXNzZXJ0KG8tPmZpZWxkX3JlYWRjb3VudD09VElGRl9WQVJJQUJMRTIpOworCQkJCQkJCQkJYXNzZXJ0KG8tPmZpZWxkX3Bhc3Njb3VudD09MSk7CisJCQkJCQkJCQlUSUZGR2V0RmllbGQodGlmLG8tPmZpZWxkX3RhZywmcGEsJnBiKTsKKwkJCQkJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnVW5kZWZpbmVkQXJyYXkodGlmLCZuZGlyLGRpcixvLT5maWVsZF90YWcscGEscGIpKQorCQkJCQkJCQkJCWdvdG8gYmFkOworCQkJCQkJCQl9CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJCWFzc2VydCgwKTsgICAvKiB3ZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKi8KKwkJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJZm9yIChtPTA7IG08KHVpbnQzMikodGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlQ291bnQpOyBtKyspCisJCXsKKwkJCXN3aXRjaCAodGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5pbmZvLT5maWVsZF90eXBlKQorCQkJeworCQkJCWNhc2UgVElGRl9BU0NJSToKKwkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdBc2NpaSh0aWYsJm5kaXIsZGlyLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uaW5mby0+ZmllbGRfdGFnLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCisJCQkJCQlnb3RvIGJhZDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUSUZGX1VOREVGSU5FRDoKKwkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdVbmRlZmluZWRBcnJheSh0aWYsJm5kaXIsZGlyLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uaW5mby0+ZmllbGRfdGFnLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCisJCQkJCQlnb3RvIGJhZDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUSUZGX0JZVEU6CisJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnQnl0ZUFycmF5KHRpZiwmbmRpcixkaXIsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5pbmZvLT5maWVsZF90YWcsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5jb3VudCx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLnZhbHVlKSkKKwkJCQkJCWdvdG8gYmFkOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRJRkZfU0JZVEU6CisJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnU2J5dGVBcnJheSh0aWYsJm5kaXIsZGlyLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uaW5mby0+ZmllbGRfdGFnLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCisJCQkJCQlnb3RvIGJhZDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUSUZGX1NIT1JUOgorCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0QXJyYXkodGlmLCZuZGlyLGRpcix0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmluZm8tPmZpZWxkX3RhZyx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmNvdW50LHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0udmFsdWUpKQorCQkJCQkJZ290byBiYWQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVElGRl9TU0hPUlQ6CisJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnU3Nob3J0QXJyYXkodGlmLCZuZGlyLGRpcix0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmluZm8tPmZpZWxkX3RhZyx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmNvdW50LHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0udmFsdWUpKQorCQkJCQkJZ290byBiYWQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVElGRl9MT05HOgorCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmdBcnJheSh0aWYsJm5kaXIsZGlyLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uaW5mby0+ZmllbGRfdGFnLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCisJCQkJCQlnb3RvIGJhZDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUSUZGX1NMT05HOgorCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nsb25nQXJyYXkodGlmLCZuZGlyLGRpcix0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmluZm8tPmZpZWxkX3RhZyx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmNvdW50LHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0udmFsdWUpKQorCQkJCQkJZ290byBiYWQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVElGRl9MT05HODoKKwkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdMb25nOEFycmF5KHRpZiwmbmRpcixkaXIsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5pbmZvLT5maWVsZF90YWcsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5jb3VudCx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLnZhbHVlKSkKKwkJCQkJCWdvdG8gYmFkOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRJRkZfU0xPTkc4OgorCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nsb25nOEFycmF5KHRpZiwmbmRpcixkaXIsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5pbmZvLT5maWVsZF90YWcsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5jb3VudCx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLnZhbHVlKSkKKwkJCQkJCWdvdG8gYmFkOworCQkJCQlicmVhazsKKwkJCQljYXNlIFRJRkZfUkFUSU9OQUw6CisJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnUmF0aW9uYWxBcnJheSh0aWYsJm5kaXIsZGlyLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uaW5mby0+ZmllbGRfdGFnLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCisJCQkJCQlnb3RvIGJhZDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUSUZGX1NSQVRJT05BTDoKKwkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdTcmF0aW9uYWxBcnJheSh0aWYsJm5kaXIsZGlyLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uaW5mby0+ZmllbGRfdGFnLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCisJCQkJCQlnb3RvIGJhZDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBUSUZGX0ZMT0FUOgorCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ0Zsb2F0QXJyYXkodGlmLCZuZGlyLGRpcix0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmluZm8tPmZpZWxkX3RhZyx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmNvdW50LHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0udmFsdWUpKQorCQkJCQkJZ290byBiYWQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVElGRl9ET1VCTEU6CisJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnRG91YmxlQXJyYXkodGlmLCZuZGlyLGRpcix0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmluZm8tPmZpZWxkX3RhZyx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmNvdW50LHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0udmFsdWUpKQorCQkJCQkJZ290byBiYWQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVElGRl9JRkQ6CisJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnSWZkQXJyYXkodGlmLCZuZGlyLGRpcix0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmluZm8tPmZpZWxkX3RhZyx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmNvdW50LHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0udmFsdWUpKQorCQkJCQkJZ290byBiYWQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVElGRl9JRkQ4OgorCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ0lmZElmZDhBcnJheSh0aWYsJm5kaXIsZGlyLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uaW5mby0+ZmllbGRfdGFnLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCisJCQkJCQlnb3RvIGJhZDsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJYXNzZXJ0KDApOyAgIC8qIHdlIHNob3VsZCBuZXZlciBnZXQgaGVyZSAqLworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoZGlyIT1OVUxMKQorCQkJYnJlYWs7CisJCWRpcj1fVElGRm1hbGxvYyhuZGlyKnNpemVvZihUSUZGRGlyRW50cnkpKTsKKwkJaWYgKGRpcj09TlVMTCkKKwkJeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJPdXQgb2YgbWVtb3J5Iik7CisJCQlnb3RvIGJhZDsKKwkJfQorCQlpZiAoaXNpbWFnZSkKKwkJeworCQkJaWYgKCh0aWYtPnRpZl9kaXJvZmY9PTApJiYoIVRJRkZMaW5rRGlyZWN0b3J5KHRpZikpKQorCQkJCWdvdG8gYmFkOworCQl9CisJCWVsc2UKKwkJCXRpZi0+dGlmX2Rpcm9mZj0oVElGRlNlZWtGaWxlKHRpZiwwLFNFRUtfRU5EKSsxKSYofjEpOworCQlpZiAocGRpcm9mZiE9TlVMTCkKKwkJCSpwZGlyb2ZmPXRpZi0+dGlmX2Rpcm9mZjsKKwkJaWYgKCEodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKSkKKwkJCWRpcnNpemU9MituZGlyKjEyKzQ7CisJCWVsc2UKKwkJCWRpcnNpemU9OCtuZGlyKjIwKzg7CisJCXRpZi0+dGlmX2RhdGFvZmY9dGlmLT50aWZfZGlyb2ZmK2RpcnNpemU7CisJCWlmICghKHRpZi0+dGlmX2ZsYWdzJlRJRkZfQklHVElGRikpCisJCQl0aWYtPnRpZl9kYXRhb2ZmPSh1aW50MzIpdGlmLT50aWZfZGF0YW9mZjsKKwkJaWYgKCh0aWYtPnRpZl9kYXRhb2ZmPHRpZi0+dGlmX2Rpcm9mZil8fCh0aWYtPnRpZl9kYXRhb2ZmPCh1aW50NjQpZGlyc2l6ZSkpCisJCXsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiTWF4aW11bSBUSUZGIGZpbGUgc2l6ZSBleGNlZWRlZCIpOworCQkJZ290byBiYWQ7CisJCX0KKwkJaWYgKHRpZi0+dGlmX2RhdGFvZmYmMSkKKwkJCXRpZi0+dGlmX2RhdGFvZmYrKzsKKwkJaWYgKGlzaW1hZ2UpCisJCQl0aWYtPnRpZl9jdXJkaXIrKzsKKwl9CisJaWYgKGlzaW1hZ2UpCisJeworCQlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9TVUJJRkQpJiYodGlmLT50aWZfc3ViaWZkb2ZmPT0wKSkKKwkJeworCQkJdWludDMyIG5hOworCQkJVElGRkRpckVudHJ5KiBuYjsKKwkJCWZvciAobmE9MCwgbmI9ZGlyOyA7IG5hKyssIG5iKyspCisJCQl7CisJCQkJYXNzZXJ0KG5hPG5kaXIpOworCQkJCWlmIChuYi0+dGRpcl90YWc9PVRJRkZUQUdfU1VCSUZEKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghKHRpZi0+dGlmX2ZsYWdzJlRJRkZfQklHVElGRikpCisJCQkJdGlmLT50aWZfc3ViaWZkb2ZmPXRpZi0+dGlmX2Rpcm9mZisyK25hKjEyKzg7CisJCQllbHNlCisJCQkJdGlmLT50aWZfc3ViaWZkb2ZmPXRpZi0+dGlmX2Rpcm9mZis4K25hKjIwKzEyOworCQl9CisJfQorCWRpcm1lbT1fVElGRm1hbGxvYyhkaXJzaXplKTsKKwlpZiAoZGlybWVtPT1OVUxMKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJPdXQgb2YgbWVtb3J5Iik7CisJCWdvdG8gYmFkOworCX0KKwlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCXsKKwkJdWludDgqIG47CisJCXVpbnQzMiBuVG1wOworCQlUSUZGRGlyRW50cnkqIG87CisJCW49ZGlybWVtOworCQkqKHVpbnQxNiopbj1uZGlyOworCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJVElGRlN3YWJTaG9ydCgodWludDE2KiluKTsKKwkJbis9MjsKKwkJbz1kaXI7CisJCWZvciAobT0wOyBtPG5kaXI7IG0rKykKKwkJeworCQkJKih1aW50MTYqKW49by0+dGRpcl90YWc7CisJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiU2hvcnQoKHVpbnQxNiopbik7CisJCQluKz0yOworCQkJKih1aW50MTYqKW49by0+dGRpcl90eXBlOworCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYlNob3J0KCh1aW50MTYqKW4pOworCQkJbis9MjsKKwkJCW5UbXAgPSAodWludDMyKW8tPnRkaXJfY291bnQ7CisJCQlfVElGRm1lbWNweShuLCZuVG1wLDQpOworCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYkxvbmcoKHVpbnQzMiopbik7CisJCQluKz00OworCQkJLyogVGhpcyBpcyBjb3JyZWN0LiBUaGUgZGF0YSBoYXMgYmVlbiAqLworCQkJLyogc3dhYmJlZCBwcmV2aW91c2x5IGluIFRJRkZXcml0ZURpcmVjdG9yeVRhZ0RhdGEgKi8KKwkJCV9USUZGbWVtY3B5KG4sJm8tPnRkaXJfb2Zmc2V0LDQpOworCQkJbis9NDsKKwkJCW8rKzsKKwkJfQorCQluVG1wID0gKHVpbnQzMil0aWYtPnRpZl9uZXh0ZGlyb2ZmOworCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJVElGRlN3YWJMb25nKCZuVG1wKTsKKwkJX1RJRkZtZW1jcHkobiwmblRtcCw0KTsKKwl9CisJZWxzZQorCXsKKwkJdWludDgqIG47CisJCVRJRkZEaXJFbnRyeSogbzsKKwkJbj1kaXJtZW07CisJCSoodWludDY0KiluPW5kaXI7CisJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQlUSUZGU3dhYkxvbmc4KCh1aW50NjQqKW4pOworCQluKz04OworCQlvPWRpcjsKKwkJZm9yIChtPTA7IG08bmRpcjsgbSsrKQorCQl7CisJCQkqKHVpbnQxNiopbj1vLT50ZGlyX3RhZzsKKwkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJTaG9ydCgodWludDE2KiluKTsKKwkJCW4rPTI7CisJCQkqKHVpbnQxNiopbj1vLT50ZGlyX3R5cGU7CisJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQkJCVRJRkZTd2FiU2hvcnQoKHVpbnQxNiopbik7CisJCQluKz0yOworCQkJX1RJRkZtZW1jcHkobiwmby0+dGRpcl9jb3VudCw4KTsKKwkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJMb25nOCgodWludDY0KiluKTsKKwkJCW4rPTg7CisJCQlfVElGRm1lbWNweShuLCZvLT50ZGlyX29mZnNldCw4KTsKKwkJCW4rPTg7CisJCQlvKys7CisJCX0KKwkJX1RJRkZtZW1jcHkobiwmdGlmLT50aWZfbmV4dGRpcm9mZiw4KTsKKwkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCVRJRkZTd2FiTG9uZzgoKHVpbnQ2NCopbik7CisJfQorCV9USUZGZnJlZShkaXIpOworCWRpcj1OVUxMOworCWlmICghU2Vla09LKHRpZix0aWYtPnRpZl9kaXJvZmYpKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJJTyBlcnJvciB3cml0aW5nIGRpcmVjdG9yeSIpOworCQlnb3RvIGJhZDsKKwl9CisJaWYgKCFXcml0ZU9LKHRpZixkaXJtZW0sKHRtc2l6ZV90KWRpcnNpemUpKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJJTyBlcnJvciB3cml0aW5nIGRpcmVjdG9yeSIpOworCQlnb3RvIGJhZDsKKwl9CisJX1RJRkZmcmVlKGRpcm1lbSk7CisJaWYgKGltYWdlZG9uZSkKKwl7CisJCVRJRkZGcmVlRGlyZWN0b3J5KHRpZik7CisJCXRpZi0+dGlmX2ZsYWdzICY9IH5USUZGX0RJUlRZRElSRUNUOworCQl0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9ESVJUWVNUUklQOworCQkoKnRpZi0+dGlmX2NsZWFudXApKHRpZik7CisJCS8qCisJCSogUmVzZXQgZGlyZWN0b3J5LXJlbGF0ZWQgc3RhdGUgZm9yIHN1YnNlcXVlbnQKKwkJKiBkaXJlY3Rvcmllcy4KKwkJKi8KKwkJVElGRkNyZWF0ZURpcmVjdG9yeSh0aWYpOworCX0KKwlyZXR1cm4oMSk7CitiYWQ6CisJaWYgKGRpciE9TlVMTCkKKwkJX1RJRkZmcmVlKGRpcik7CisJaWYgKGRpcm1lbSE9TlVMTCkKKwkJX1RJRkZmcmVlKGRpcm1lbSk7CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdTYW1wbGVmb3JtYXRBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgZG91YmxlKiB2YWx1ZSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGV3JpdGVEaXJlY3RvcnlUYWdTYW1wbGVmb3JtYXRBcnJheSI7CisJdm9pZCogY29udjsKKwl1aW50MzIgaTsKKwlpbnQgb2s7CisJY29udiA9IF9USUZGbWFsbG9jKGNvdW50KnNpemVvZihkb3VibGUpKTsKKwlpZiAoY29udiA9PSBOVUxMKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIk91dCBvZiBtZW1vcnkiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwlzd2l0Y2ggKHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVmb3JtYXQpCisJeworCQljYXNlIFNBTVBMRUZPUk1BVF9JRUVFRlA6CisJCQlpZiAodGlmLT50aWZfZGlyLnRkX2JpdHNwZXJzYW1wbGU8PTMyKQorCQkJeworCQkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKQorCQkJCQkoKGZsb2F0Kiljb252KVtpXSA9IChmbG9hdCl2YWx1ZVtpXTsKKwkJCQlvayA9IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0Zsb2F0QXJyYXkodGlmLG5kaXIsZGlyLHRhZyxjb3VudCwoZmxvYXQqKWNvbnYpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW9rID0gVElGRldyaXRlRGlyZWN0b3J5VGFnRG91YmxlQXJyYXkodGlmLG5kaXIsZGlyLHRhZyxjb3VudCx2YWx1ZSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTQU1QTEVGT1JNQVRfSU5UOgorCQkJaWYgKHRpZi0+dGlmX2Rpci50ZF9iaXRzcGVyc2FtcGxlPD04KQorCQkJeworCQkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKQorCQkJCQkoKGludDgqKWNvbnYpW2ldID0gKGludDgpdmFsdWVbaV07CisJCQkJb2sgPSBUSUZGV3JpdGVEaXJlY3RvcnlUYWdTYnl0ZUFycmF5KHRpZixuZGlyLGRpcix0YWcsY291bnQsKGludDgqKWNvbnYpOworCQkJfQorCQkJZWxzZSBpZiAodGlmLT50aWZfZGlyLnRkX2JpdHNwZXJzYW1wbGU8PTE2KQorCQkJeworCQkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKQorCQkJCQkoKGludDE2Kiljb252KVtpXSA9IChpbnQxNil2YWx1ZVtpXTsKKwkJCQlvayA9IFRJRkZXcml0ZURpcmVjdG9yeVRhZ1NzaG9ydEFycmF5KHRpZixuZGlyLGRpcix0YWcsY291bnQsKGludDE2Kiljb252KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKwkJCQkJKChpbnQzMiopY29udilbaV0gPSAoaW50MzIpdmFsdWVbaV07CisJCQkJb2sgPSBUSUZGV3JpdGVEaXJlY3RvcnlUYWdTbG9uZ0FycmF5KHRpZixuZGlyLGRpcix0YWcsY291bnQsKGludDMyKiljb252KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNBTVBMRUZPUk1BVF9VSU5UOgorCQkJaWYgKHRpZi0+dGlmX2Rpci50ZF9iaXRzcGVyc2FtcGxlPD04KQorCQkJeworCQkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKQorCQkJCQkoKHVpbnQ4Kiljb252KVtpXSA9ICh1aW50OCl2YWx1ZVtpXTsKKwkJCQlvayA9IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0J5dGVBcnJheSh0aWYsbmRpcixkaXIsdGFnLGNvdW50LCh1aW50OCopY29udik7CisJCQl9CisJCQllbHNlIGlmICh0aWYtPnRpZl9kaXIudGRfYml0c3BlcnNhbXBsZTw9MTYpCisJCQl7CisJCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCisJCQkJCSgodWludDE2Kiljb252KVtpXSA9ICh1aW50MTYpdmFsdWVbaV07CisJCQkJb2sgPSBUSUZGV3JpdGVEaXJlY3RvcnlUYWdTaG9ydEFycmF5KHRpZixuZGlyLGRpcix0YWcsY291bnQsKHVpbnQxNiopY29udik7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCisJCQkJCSgodWludDMyKiljb252KVtpXSA9ICh1aW50MzIpdmFsdWVbaV07CisJCQkJb2sgPSBUSUZGV3JpdGVEaXJlY3RvcnlUYWdMb25nQXJyYXkodGlmLG5kaXIsZGlyLHRhZyxjb3VudCwodWludDMyKiljb252KTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJb2sgPSAwOworCX0KKworCV9USUZGZnJlZShjb252KTsKKwlyZXR1cm4gKG9rKTsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ1NhbXBsZWZvcm1hdFBlclNhbXBsZShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGRvdWJsZSB2YWx1ZSkKK3sKKwlzd2l0Y2ggKHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVmb3JtYXQpCisJeworCQljYXNlIFNBTVBMRUZPUk1BVF9JRUVFRlA6CisJCQlpZiAodGlmLT50aWZfZGlyLnRkX2JpdHNwZXJzYW1wbGU8PTMyKQorCQkJCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdGbG9hdFBlclNhbXBsZSh0aWYsbmRpcixkaXIsdGFnLChmbG9hdCl2YWx1ZSkpOworCQkJZWxzZQorCQkJCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdEb3VibGVQZXJTYW1wbGUodGlmLG5kaXIsZGlyLHRhZyx2YWx1ZSkpOworCQljYXNlIFNBTVBMRUZPUk1BVF9JTlQ6CisJCQlpZiAodGlmLT50aWZfZGlyLnRkX2JpdHNwZXJzYW1wbGU8PTgpCisJCQkJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ1NieXRlUGVyU2FtcGxlKHRpZixuZGlyLGRpcix0YWcsKGludDgpdmFsdWUpKTsKKwkJCWVsc2UgaWYgKHRpZi0+dGlmX2Rpci50ZF9iaXRzcGVyc2FtcGxlPD0xNikKKwkJCQlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnU3Nob3J0UGVyU2FtcGxlKHRpZixuZGlyLGRpcix0YWcsKGludDE2KXZhbHVlKSk7CisJCQllbHNlCisJCQkJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nsb25nUGVyU2FtcGxlKHRpZixuZGlyLGRpcix0YWcsKGludDMyKXZhbHVlKSk7CisJCWNhc2UgU0FNUExFRk9STUFUX1VJTlQ6CisJCQlpZiAodGlmLT50aWZfZGlyLnRkX2JpdHNwZXJzYW1wbGU8PTgpCisJCQkJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0J5dGVQZXJTYW1wbGUodGlmLG5kaXIsZGlyLHRhZywodWludDgpdmFsdWUpKTsKKwkJCWVsc2UgaWYgKHRpZi0+dGlmX2Rpci50ZF9iaXRzcGVyc2FtcGxlPD0xNikKKwkJCQlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnRQZXJTYW1wbGUodGlmLG5kaXIsZGlyLHRhZywodWludDE2KXZhbHVlKSk7CisJCQllbHNlCisJCQkJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmdQZXJTYW1wbGUodGlmLG5kaXIsZGlyLHRhZywodWludDMyKXZhbHVlKSk7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4oMSk7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0FzY2lpKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCBjaGFyKiB2YWx1ZSkKK3sKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkQXNjaWkodGlmLG5kaXIsZGlyLHRhZyxjb3VudCx2YWx1ZSkpOworfQorCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdVbmRlZmluZWRBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgdWludDgqIHZhbHVlKQoreworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRVbmRlZmluZWRBcnJheSh0aWYsbmRpcixkaXIsdGFnLGNvdW50LHZhbHVlKSk7Cit9CisKKyNpZmRlZiBub3RkZWYKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0J5dGUoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50OCB2YWx1ZSkKK3sKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkQnl0ZSh0aWYsbmRpcixkaXIsdGFnLHZhbHVlKSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnQnl0ZUFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCB1aW50OCogdmFsdWUpCit7CisJaWYgKGRpcj09TlVMTCkKKwl7CisJCSgqbmRpcikrKzsKKwkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZEJ5dGVBcnJheSh0aWYsbmRpcixkaXIsdGFnLGNvdW50LHZhbHVlKSk7Cit9CisKKyNpZiAwCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdCeXRlUGVyU2FtcGxlKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDggdmFsdWUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRldyaXRlRGlyZWN0b3J5VGFnQnl0ZVBlclNhbXBsZSI7CisJdWludDgqIG07CisJdWludDgqIG5hOworCXVpbnQxNiBuYjsKKwlpbnQgbzsKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCW09X1RJRkZtYWxsb2ModGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbCpzaXplb2YodWludDgpKTsKKwlpZiAobT09TlVMTCkKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiT3V0IG9mIG1lbW9yeSIpOworCQlyZXR1cm4oMCk7CisJfQorCWZvciAobmE9bSwgbmI9MDsgbmI8dGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbDsgbmErKywgbmIrKykKKwkJKm5hPXZhbHVlOworCW89VElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZEJ5dGVBcnJheSh0aWYsbmRpcixkaXIsdGFnLHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWwsbSk7CisJX1RJRkZmcmVlKG0pOworCXJldHVybihvKTsKK30KKyNlbmRpZgorCisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdTYnl0ZShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGludDggdmFsdWUpCit7CisJaWYgKGRpcj09TlVMTCkKKwl7CisJCSgqbmRpcikrKzsKKwkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNieXRlKHRpZixuZGlyLGRpcix0YWcsdmFsdWUpKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdTYnl0ZUFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCBpbnQ4KiB2YWx1ZSkKK3sKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU2J5dGVBcnJheSh0aWYsbmRpcixkaXIsdGFnLGNvdW50LHZhbHVlKSk7Cit9CisKKyNpZiAwCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdTYnl0ZVBlclNhbXBsZShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGludDggdmFsdWUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRldyaXRlRGlyZWN0b3J5VGFnU2J5dGVQZXJTYW1wbGUiOworCWludDgqIG07CisJaW50OCogbmE7CisJdWludDE2IG5iOworCWludCBvOworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJbT1fVElGRm1hbGxvYyh0aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsKnNpemVvZihpbnQ4KSk7CisJaWYgKG09PU5VTEwpCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKwkJcmV0dXJuKDApOworCX0KKwlmb3IgKG5hPW0sIG5iPTA7IG5iPHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWw7IG5hKyssIG5iKyspCisJCSpuYT12YWx1ZTsKKwlvPVRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTYnl0ZUFycmF5KHRpZixuZGlyLGRpcix0YWcsdGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbCxtKTsKKwlfVElGRmZyZWUobSk7CisJcmV0dXJuKG8pOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDE2IHZhbHVlKQoreworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTaG9ydCh0aWYsbmRpcixkaXIsdGFnLHZhbHVlKSk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0QXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQxNiogdmFsdWUpCit7CisJaWYgKGRpcj09TlVMTCkKKwl7CisJCSgqbmRpcikrKzsKKwkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNob3J0QXJyYXkodGlmLG5kaXIsZGlyLHRhZyxjb3VudCx2YWx1ZSkpOworfQorCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdTaG9ydFBlclNhbXBsZShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQxNiB2YWx1ZSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGV3JpdGVEaXJlY3RvcnlUYWdTaG9ydFBlclNhbXBsZSI7CisJdWludDE2KiBtOworCXVpbnQxNiogbmE7CisJdWludDE2IG5iOworCWludCBvOworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJbT1fVElGRm1hbGxvYyh0aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsKnNpemVvZih1aW50MTYpKTsKKwlpZiAobT09TlVMTCkKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiT3V0IG9mIG1lbW9yeSIpOworCQlyZXR1cm4oMCk7CisJfQorCWZvciAobmE9bSwgbmI9MDsgbmI8dGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbDsgbmErKywgbmIrKykKKwkJKm5hPXZhbHVlOworCW89VElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNob3J0QXJyYXkodGlmLG5kaXIsZGlyLHRhZyx0aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsLG0pOworCV9USUZGZnJlZShtKTsKKwlyZXR1cm4obyk7Cit9CisKKyNpZmRlZiBub3RkZWYKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ1NzaG9ydChUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGludDE2IHZhbHVlKQoreworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTc2hvcnQodGlmLG5kaXIsZGlyLHRhZyx2YWx1ZSkpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ1NzaG9ydEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCBpbnQxNiogdmFsdWUpCit7CisJaWYgKGRpcj09TlVMTCkKKwl7CisJCSgqbmRpcikrKzsKKwkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNzaG9ydEFycmF5KHRpZixuZGlyLGRpcix0YWcsY291bnQsdmFsdWUpKTsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ1NzaG9ydFBlclNhbXBsZShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGludDE2IHZhbHVlKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZXcml0ZURpcmVjdG9yeVRhZ1NzaG9ydFBlclNhbXBsZSI7CisJaW50MTYqIG07CisJaW50MTYqIG5hOworCXVpbnQxNiBuYjsKKwlpbnQgbzsKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCW09X1RJRkZtYWxsb2ModGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbCpzaXplb2YoaW50MTYpKTsKKwlpZiAobT09TlVMTCkKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiT3V0IG9mIG1lbW9yeSIpOworCQlyZXR1cm4oMCk7CisJfQorCWZvciAobmE9bSwgbmI9MDsgbmI8dGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbDsgbmErKywgbmIrKykKKwkJKm5hPXZhbHVlOworCW89VElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNzaG9ydEFycmF5KHRpZixuZGlyLGRpcix0YWcsdGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbCxtKTsKKwlfVElGRmZyZWUobSk7CisJcmV0dXJuKG8pOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmcoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgdmFsdWUpCit7CisJaWYgKGRpcj09TlVMTCkKKwl7CisJCSgqbmRpcikrKzsKKwkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZExvbmcodGlmLG5kaXIsZGlyLHRhZyx2YWx1ZSkpOworfQorCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdMb25nQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQzMiogdmFsdWUpCit7CisJaWYgKGRpcj09TlVMTCkKKwl7CisJCSgqbmRpcikrKzsKKwkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZExvbmdBcnJheSh0aWYsbmRpcixkaXIsdGFnLGNvdW50LHZhbHVlKSk7Cit9CisKKyNpZiAwCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdMb25nUGVyU2FtcGxlKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIHZhbHVlKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmdQZXJTYW1wbGUiOworCXVpbnQzMiogbTsKKwl1aW50MzIqIG5hOworCXVpbnQxNiBuYjsKKwlpbnQgbzsKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCW09X1RJRkZtYWxsb2ModGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbCpzaXplb2YodWludDMyKSk7CisJaWYgKG09PU5VTEwpCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKwkJcmV0dXJuKDApOworCX0KKwlmb3IgKG5hPW0sIG5iPTA7IG5iPHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWw7IG5hKyssIG5iKyspCisJCSpuYT12YWx1ZTsKKwlvPVRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRMb25nQXJyYXkodGlmLG5kaXIsZGlyLHRhZyx0aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsLG0pOworCV9USUZGZnJlZShtKTsKKwlyZXR1cm4obyk7Cit9CisjZW5kaWYKKworI2lmZGVmIG5vdGRlZgorc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnU2xvbmcoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCBpbnQzMiB2YWx1ZSkKK3sKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU2xvbmcodGlmLG5kaXIsZGlyLHRhZyx2YWx1ZSkpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ1Nsb25nQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGludDMyKiB2YWx1ZSkKK3sKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU2xvbmdBcnJheSh0aWYsbmRpcixkaXIsdGFnLGNvdW50LHZhbHVlKSk7Cit9CisKKyNpZiAwCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdTbG9uZ1BlclNhbXBsZShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGludDMyIHZhbHVlKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nsb25nUGVyU2FtcGxlIjsKKwlpbnQzMiogbTsKKwlpbnQzMiogbmE7CisJdWludDE2IG5iOworCWludCBvOworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJbT1fVElGRm1hbGxvYyh0aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsKnNpemVvZihpbnQzMikpOworCWlmIChtPT1OVUxMKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJPdXQgb2YgbWVtb3J5Iik7CisJCXJldHVybigwKTsKKwl9CisJZm9yIChuYT1tLCBuYj0wOyBuYjx0aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsOyBuYSsrLCBuYisrKQorCQkqbmE9dmFsdWU7CisJbz1USUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU2xvbmdBcnJheSh0aWYsbmRpcixkaXIsdGFnLHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWwsbSk7CisJX1RJRkZmcmVlKG0pOworCXJldHVybihvKTsKK30KKyNlbmRpZgorCisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdMb25nOChUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQ2NCB2YWx1ZSkKK3sKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkTG9uZzgodGlmLG5kaXIsZGlyLHRhZyx2YWx1ZSkpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmc4QXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQ2NCogdmFsdWUpCit7CisJaWYgKGRpcj09TlVMTCkKKwl7CisJCSgqbmRpcikrKzsKKwkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZExvbmc4QXJyYXkodGlmLG5kaXIsZGlyLHRhZyxjb3VudCx2YWx1ZSkpOworfQorCisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdTbG9uZzgoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCBpbnQ2NCB2YWx1ZSkKK3sKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU2xvbmc4KHRpZixuZGlyLGRpcix0YWcsdmFsdWUpKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdTbG9uZzhBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgaW50NjQqIHZhbHVlKQoreworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTbG9uZzhBcnJheSh0aWYsbmRpcixkaXIsdGFnLGNvdW50LHZhbHVlKSk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ1JhdGlvbmFsKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgZG91YmxlIHZhbHVlKQoreworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRSYXRpb25hbCh0aWYsbmRpcixkaXIsdGFnLHZhbHVlKSk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ1JhdGlvbmFsQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGZsb2F0KiB2YWx1ZSkKK3sKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkUmF0aW9uYWxBcnJheSh0aWYsbmRpcixkaXIsdGFnLGNvdW50LHZhbHVlKSk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ1NyYXRpb25hbEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCBmbG9hdCogdmFsdWUpCit7CisJaWYgKGRpcj09TlVMTCkKKwl7CisJCSgqbmRpcikrKzsKKwkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNyYXRpb25hbEFycmF5KHRpZixuZGlyLGRpcix0YWcsY291bnQsdmFsdWUpKTsKK30KKworI2lmZGVmIG5vdGRlZgorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdGbG9hdChUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGZsb2F0IHZhbHVlKQoreworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRGbG9hdCh0aWYsbmRpcixkaXIsdGFnLHZhbHVlKSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdGbG9hdEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCBmbG9hdCogdmFsdWUpCit7CisJaWYgKGRpcj09TlVMTCkKKwl7CisJCSgqbmRpcikrKzsKKwkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZEZsb2F0QXJyYXkodGlmLG5kaXIsZGlyLHRhZyxjb3VudCx2YWx1ZSkpOworfQorCisjaWYgMAorc3RhdGljIGludCBUSUZGV3JpdGVEaXJlY3RvcnlUYWdGbG9hdFBlclNhbXBsZShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGZsb2F0IHZhbHVlKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZXcml0ZURpcmVjdG9yeVRhZ0Zsb2F0UGVyU2FtcGxlIjsKKwlmbG9hdCogbTsKKwlmbG9hdCogbmE7CisJdWludDE2IG5iOworCWludCBvOworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJbT1fVElGRm1hbGxvYyh0aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsKnNpemVvZihmbG9hdCkpOworCWlmIChtPT1OVUxMKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJPdXQgb2YgbWVtb3J5Iik7CisJCXJldHVybigwKTsKKwl9CisJZm9yIChuYT1tLCBuYj0wOyBuYjx0aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsOyBuYSsrLCBuYisrKQorCQkqbmE9dmFsdWU7CisJbz1USUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkRmxvYXRBcnJheSh0aWYsbmRpcixkaXIsdGFnLHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWwsbSk7CisJX1RJRkZmcmVlKG0pOworCXJldHVybihvKTsKK30KKyNlbmRpZgorCisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0RvdWJsZShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGRvdWJsZSB2YWx1ZSkKK3sKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkRG91YmxlKHRpZixuZGlyLGRpcix0YWcsdmFsdWUpKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0RvdWJsZUFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCBkb3VibGUqIHZhbHVlKQoreworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWREb3VibGVBcnJheSh0aWYsbmRpcixkaXIsdGFnLGNvdW50LHZhbHVlKSk7Cit9CisKKyNpZiAwCitzdGF0aWMgaW50IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0RvdWJsZVBlclNhbXBsZShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGRvdWJsZSB2YWx1ZSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGV3JpdGVEaXJlY3RvcnlUYWdEb3VibGVQZXJTYW1wbGUiOworCWRvdWJsZSogbTsKKwlkb3VibGUqIG5hOworCXVpbnQxNiBuYjsKKwlpbnQgbzsKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCW09X1RJRkZtYWxsb2ModGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbCpzaXplb2YoZG91YmxlKSk7CisJaWYgKG09PU5VTEwpCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKwkJcmV0dXJuKDApOworCX0KKwlmb3IgKG5hPW0sIG5iPTA7IG5iPHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWw7IG5hKyssIG5iKyspCisJCSpuYT12YWx1ZTsKKwlvPVRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWREb3VibGVBcnJheSh0aWYsbmRpcixkaXIsdGFnLHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWwsbSk7CisJX1RJRkZmcmVlKG0pOworCXJldHVybihvKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdJZmRBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgdWludDMyKiB2YWx1ZSkKK3sKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkSWZkQXJyYXkodGlmLG5kaXIsZGlyLHRhZyxjb3VudCx2YWx1ZSkpOworfQorCisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdJZmQ4QXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQ2NCogdmFsdWUpCit7CisJaWYgKGRpcj09TlVMTCkKKwl7CisJCSgqbmRpcikrKzsKKwkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZElmZDhBcnJheSh0aWYsbmRpcixkaXIsdGFnLGNvdW50LHZhbHVlKSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnRMb25nKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIHZhbHVlKQoreworCWlmIChkaXI9PU5VTEwpCisJeworCQkoKm5kaXIpKys7CisJCXJldHVybigxKTsKKwl9CisJaWYgKHZhbHVlPD0weEZGRkYpCisJCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU2hvcnQodGlmLG5kaXIsZGlyLHRhZywodWludDE2KXZhbHVlKSk7CisJZWxzZQorCQlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZExvbmcodGlmLG5kaXIsZGlyLHRhZyx2YWx1ZSkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgVElGRldyaXRlRGlyZWN0b3J5VGFnTG9uZ0xvbmc4QXJyYXkoKSAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFdyaXRlIG91dCBMT05HOCBhcnJheSBhcyBMT05HOCBmb3IgQmlnVElGRiBvciBMT05HIGZvciAgICAgICAgICAqLworLyogICAgICBDbGFzc2ljIFRJRkYgd2l0aCBzb21lIGNoZWNraW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmdMb25nOEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCB1aW50NjQqIHZhbHVlKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmdMb25nOEFycmF5IjsKKyAgICB1aW50NjQqIG1hOworICAgIHVpbnQzMiBtYjsKKyAgICB1aW50MzIqIHA7CisgICAgdWludDMyKiBxOworICAgIGludCBvOworCisgICAgLyogaXMgdGhpcyBqdXN0IGEgY291bnRpbmcgcGFzcz8gKi8KKyAgICBpZiAoZGlyPT1OVUxMKQorICAgIHsKKyAgICAgICAgKCpuZGlyKSsrOworICAgICAgICByZXR1cm4oMSk7CisgICAgfQorCisgICAgLyogV2UgYWx3YXlzIHdyaXRlIExPTkc4IGZvciBCaWdUSUZGLCBubyBjaGVja2luZyBuZWVkZWQuICovCisgICAgaWYoIHRpZi0+dGlmX2ZsYWdzJlRJRkZfQklHVElGRiApCisgICAgICAgIHJldHVybiBUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkTG9uZzhBcnJheSh0aWYsbmRpcixkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcsY291bnQsdmFsdWUpOworCisgICAgLyoKKyAgICAqKiBGb3IgY2xhc3NpYyB0aWZmIHdlIHdhbnQgdG8gdmVyaWZ5IGV2ZXJ5dGhpbmcgaXMgaW4gcmFuZ2UgZm9yIExPTkcKKyAgICAqKiBhbmQgY29udmVydCB0byBsb25nIGZvcm1hdC4KKyAgICAqLworCisgICAgcCA9IF9USUZGbWFsbG9jKGNvdW50KnNpemVvZih1aW50MzIpKTsKKyAgICBpZiAocD09TlVMTCkKKyAgICB7CisgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiT3V0IG9mIG1lbW9yeSIpOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorCisgICAgZm9yIChxPXAsIG1hPXZhbHVlLCBtYj0wOyBtYjxjb3VudDsgbWErKywgbWIrKywgcSsrKQorICAgIHsKKyAgICAgICAgaWYgKCptYT4weEZGRkZGRkZGKQorICAgICAgICB7CisgICAgICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHQgdG8gd3JpdGUgdmFsdWUgbGFyZ2VyIHRoYW4gMHhGRkZGRkZGRiBpbiBDbGFzc2ljIFRJRkYgZmlsZS4iKTsKKyAgICAgICAgICAgIF9USUZGZnJlZShwKTsKKyAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfQorICAgICAgICAqcT0gKHVpbnQzMikoKm1hKTsKKyAgICB9CisKKyAgICBvPVRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRMb25nQXJyYXkodGlmLG5kaXIsZGlyLHRhZyxjb3VudCxwKTsKKyAgICBfVElGRmZyZWUocCk7CisKKyAgICByZXR1cm4obyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgVElGRldyaXRlRGlyZWN0b3J5VGFnSWZkSWZkOEFycmF5KCkgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgV3JpdGUgZWl0aGVyIElGRDggb3IgSUZEIGFycmF5IGRlcGVuZGluZyBvbiBmaWxlIHR5cGUuICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdJZmRJZmQ4QXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQ2NCogdmFsdWUpCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRldyaXRlRGlyZWN0b3J5VGFnSWZkSWZkOEFycmF5IjsKKyAgICB1aW50NjQqIG1hOworICAgIHVpbnQzMiBtYjsKKyAgICB1aW50MzIqIHA7CisgICAgdWludDMyKiBxOworICAgIGludCBvOworCisgICAgLyogaXMgdGhpcyBqdXN0IGEgY291bnRpbmcgcGFzcz8gKi8KKyAgICBpZiAoZGlyPT1OVUxMKQorICAgIHsKKyAgICAgICAgKCpuZGlyKSsrOworICAgICAgICByZXR1cm4oMSk7CisgICAgfQorCisgICAgLyogV2UgYWx3YXlzIHdyaXRlIElGRDggZm9yIEJpZ1RJRkYsIG5vIGNoZWNraW5nIG5lZWRlZC4gKi8KKyAgICBpZiggdGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGICkKKyAgICAgICAgcmV0dXJuIFRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRJZmQ4QXJyYXkodGlmLG5kaXIsZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcsY291bnQsdmFsdWUpOworCisgICAgLyoKKyAgICAqKiBGb3IgY2xhc3NpYyB0aWZmIHdlIHdhbnQgdG8gdmVyaWZ5IGV2ZXJ5dGhpbmcgaXMgaW4gcmFuZ2UgZm9yIElGRAorICAgICoqIGFuZCBjb252ZXJ0IHRvIGxvbmcgZm9ybWF0LgorICAgICovCisKKyAgICBwID0gX1RJRkZtYWxsb2MoY291bnQqc2l6ZW9mKHVpbnQzMikpOworICAgIGlmIChwPT1OVUxMKQorICAgIHsKKyAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJPdXQgb2YgbWVtb3J5Iik7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisKKyAgICBmb3IgKHE9cCwgbWE9dmFsdWUsIG1iPTA7IG1iPGNvdW50OyBtYSsrLCBtYisrLCBxKyspCisgICAgeworICAgICAgICBpZiAoKm1hPjB4RkZGRkZGRkYpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdCB0byB3cml0ZSB2YWx1ZSBsYXJnZXIgdGhhbiAweEZGRkZGRkZGIGluIENsYXNzaWMgVElGRiBmaWxlLiIpOworICAgICAgICAgICAgX1RJRkZmcmVlKHApOworICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisgICAgICAgICpxPSAodWludDMyKSgqbWEpOworICAgIH0KKworICAgIG89VElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZElmZEFycmF5KHRpZixuZGlyLGRpcix0YWcsY291bnQscCk7CisgICAgX1RJRkZmcmVlKHApOworCisgICAgcmV0dXJuKG8pOworfQorCisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdTaG9ydExvbmdMb25nOEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCB1aW50NjQqIHZhbHVlKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0TG9uZ0xvbmc4QXJyYXkiOworCXVpbnQ2NCogbWE7CisJdWludDMyIG1iOworCXVpbnQ4IG47CisJaW50IG87CisJaWYgKGRpcj09TlVMTCkKKwl7CisJCSgqbmRpcikrKzsKKwkJcmV0dXJuKDEpOworCX0KKwluPTA7CisJZm9yIChtYT12YWx1ZSwgbWI9MDsgbWI8Y291bnQ7IG1hKyssIG1iKyspCisJeworCQlpZiAoKG49PTApJiYoKm1hPjB4RkZGRikpCisJCQluPTE7CisJCWlmICgobj09MSkmJigqbWE+MHhGRkZGRkZGRikpCisJCXsKKwkJCW49MjsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChuPT0wKQorCXsKKwkJdWludDE2KiBwOworCQl1aW50MTYqIHE7CisJCXA9X1RJRkZtYWxsb2MoY291bnQqc2l6ZW9mKHVpbnQxNikpOworCQlpZiAocD09TlVMTCkKKwkJeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJPdXQgb2YgbWVtb3J5Iik7CisJCQlyZXR1cm4oMCk7CisJCX0KKwkJZm9yIChtYT12YWx1ZSwgbWI9MCwgcT1wOyBtYjxjb3VudDsgbWErKywgbWIrKywgcSsrKQorCQkJKnE9KHVpbnQxNikoKm1hKTsKKwkJbz1USUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU2hvcnRBcnJheSh0aWYsbmRpcixkaXIsdGFnLGNvdW50LHApOworCQlfVElGRmZyZWUocCk7CisJfQorCWVsc2UgaWYgKG49PTEpCisJeworCQl1aW50MzIqIHA7CisJCXVpbnQzMiogcTsKKwkJcD1fVElGRm1hbGxvYyhjb3VudCpzaXplb2YodWludDMyKSk7CisJCWlmIChwPT1OVUxMKQorCQl7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKwkJCXJldHVybigwKTsKKwkJfQorCQlmb3IgKG1hPXZhbHVlLCBtYj0wLCBxPXA7IG1iPGNvdW50OyBtYSsrLCBtYisrLCBxKyspCisJCQkqcT0odWludDMyKSgqbWEpOworCQlvPVRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRMb25nQXJyYXkodGlmLG5kaXIsZGlyLHRhZyxjb3VudCxwKTsKKwkJX1RJRkZmcmVlKHApOworCX0KKwllbHNlCisJeworCQlhc3NlcnQobj09Mik7CisJCW89VElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZExvbmc4QXJyYXkodGlmLG5kaXIsZGlyLHRhZyxjb3VudCx2YWx1ZSk7CisJfQorCXJldHVybihvKTsKK30KKyNlbmRpZgorc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnQ29sb3JtYXAoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZXcml0ZURpcmVjdG9yeVRhZ0NvbG9ybWFwIjsKKwl1aW50MzIgbTsKKwl1aW50MTYqIG47CisJaW50IG87CisJaWYgKGRpcj09TlVMTCkKKwl7CisJCSgqbmRpcikrKzsKKwkJcmV0dXJuKDEpOworCX0KKwltPSgxPDx0aWYtPnRpZl9kaXIudGRfYml0c3BlcnNhbXBsZSk7CisJbj1fVElGRm1hbGxvYygzKm0qc2l6ZW9mKHVpbnQxNikpOworCWlmIChuPT1OVUxMKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJPdXQgb2YgbWVtb3J5Iik7CisJCXJldHVybigwKTsKKwl9CisJX1RJRkZtZW1jcHkoJm5bMF0sdGlmLT50aWZfZGlyLnRkX2NvbG9ybWFwWzBdLG0qc2l6ZW9mKHVpbnQxNikpOworCV9USUZGbWVtY3B5KCZuW21dLHRpZi0+dGlmX2Rpci50ZF9jb2xvcm1hcFsxXSxtKnNpemVvZih1aW50MTYpKTsKKwlfVElGRm1lbWNweSgmblsyKm1dLHRpZi0+dGlmX2Rpci50ZF9jb2xvcm1hcFsyXSxtKnNpemVvZih1aW50MTYpKTsKKwlvPVRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTaG9ydEFycmF5KHRpZixuZGlyLGRpcixUSUZGVEFHX0NPTE9STUFQLDMqbSxuKTsKKwlfVElGRmZyZWUobik7CisJcmV0dXJuKG8pOworfQorCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdUcmFuc2ZlcmZ1bmN0aW9uKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpcikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGV3JpdGVEaXJlY3RvcnlUYWdUcmFuc2ZlcmZ1bmN0aW9uIjsKKwl1aW50MzIgbTsKKwl1aW50MTYgbjsKKwl1aW50MTYqIG87CisJaW50IHA7CisJaWYgKGRpcj09TlVMTCkKKwl7CisJCSgqbmRpcikrKzsKKwkJcmV0dXJuKDEpOworCX0KKwltPSgxPDx0aWYtPnRpZl9kaXIudGRfYml0c3BlcnNhbXBsZSk7CisJbj10aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsLXRpZi0+dGlmX2Rpci50ZF9leHRyYXNhbXBsZXM7CisJLyoKKwkgKiBDaGVjayBpZiB0aGUgdGFibGUgY2FuIGJlIHdyaXR0ZW4gYXMgYSBzaW5nbGUgY29sdW1uLAorCSAqIG9yIGlmIGl0IG11c3QgYmUgd3JpdHRlbiBhcyAzIGNvbHVtbnMuICBOb3RlIHRoYXQgd2UKKwkgKiB3cml0ZSBhIDMtY29sdW1uIHRhZyBpZiB0aGVyZSBhcmUgMiBzYW1wbGVzL3BpeGVsIGFuZAorCSAqIGEgc2luZ2xlIGNvbHVtbiBvZiBkYXRhIHdvbid0IHN1ZmZpY2UtLWhtbS4KKwkgKi8KKwlpZiAobj4zKQorCQluPTM7CisJaWYgKG49PTMpCisJeworCQlpZiAoIV9USUZGbWVtY21wKHRpZi0+dGlmX2Rpci50ZF90cmFuc2ZlcmZ1bmN0aW9uWzBdLHRpZi0+dGlmX2Rpci50ZF90cmFuc2ZlcmZ1bmN0aW9uWzJdLG0qc2l6ZW9mKHVpbnQxNikpKQorCQkJbj0yOworCX0KKwlpZiAobj09MikKKwl7CisJCWlmICghX1RJRkZtZW1jbXAodGlmLT50aWZfZGlyLnRkX3RyYW5zZmVyZnVuY3Rpb25bMF0sdGlmLT50aWZfZGlyLnRkX3RyYW5zZmVyZnVuY3Rpb25bMV0sbSpzaXplb2YodWludDE2KSkpCisJCQluPTE7CisJfQorCWlmIChuPT0wKQorCQluPTE7CisJbz1fVElGRm1hbGxvYyhuKm0qc2l6ZW9mKHVpbnQxNikpOworCWlmIChvPT1OVUxMKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJPdXQgb2YgbWVtb3J5Iik7CisJCXJldHVybigwKTsKKwl9CisJX1RJRkZtZW1jcHkoJm9bMF0sdGlmLT50aWZfZGlyLnRkX3RyYW5zZmVyZnVuY3Rpb25bMF0sbSpzaXplb2YodWludDE2KSk7CisJaWYgKG4+MSkKKwkJX1RJRkZtZW1jcHkoJm9bbV0sdGlmLT50aWZfZGlyLnRkX3RyYW5zZmVyZnVuY3Rpb25bMV0sbSpzaXplb2YodWludDE2KSk7CisJaWYgKG4+MikKKwkJX1RJRkZtZW1jcHkoJm9bMiptXSx0aWYtPnRpZl9kaXIudGRfdHJhbnNmZXJmdW5jdGlvblsyXSxtKnNpemVvZih1aW50MTYpKTsKKwlwPVRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTaG9ydEFycmF5KHRpZixuZGlyLGRpcixUSUZGVEFHX1RSQU5TRkVSRlVOQ1RJT04sbiptLG8pOworCV9USUZGZnJlZShvKTsKKwlyZXR1cm4ocCk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ1N1YmlmZChUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRldyaXRlRGlyZWN0b3J5VGFnU3ViaWZkIjsKKwl1aW50NjQgbTsKKwlpbnQgbjsKKwlpZiAodGlmLT50aWZfZGlyLnRkX25zdWJpZmQ9PTApCisJCXJldHVybigxKTsKKwlpZiAoZGlyPT1OVUxMKQorCXsKKwkJKCpuZGlyKSsrOworCQlyZXR1cm4oMSk7CisJfQorCW09dGlmLT50aWZfZGF0YW9mZjsKKwlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCXsKKwkJdWludDMyKiBvOworCQl1aW50NjQqIHBhOworCQl1aW50MzIqIHBiOworCQl1aW50MTYgcDsKKwkJbz1fVElGRm1hbGxvYyh0aWYtPnRpZl9kaXIudGRfbnN1YmlmZCpzaXplb2YodWludDMyKSk7CisJCWlmIChvPT1OVUxMKQorCQl7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKwkJCXJldHVybigwKTsKKwkJfQorCQlwYT10aWYtPnRpZl9kaXIudGRfc3ViaWZkOworCQlwYj1vOworCQlmb3IgKHA9MDsgcCA8IHRpZi0+dGlmX2Rpci50ZF9uc3ViaWZkOyBwKyspCisJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChwYSAhPSAwKTsKKwkJCWFzc2VydCgqcGEgPD0gMHhGRkZGRkZGRlVMKTsKKwkJCSpwYisrPSh1aW50MzIpKCpwYSsrKTsKKwkJfQorCQluPVRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRJZmRBcnJheSh0aWYsbmRpcixkaXIsVElGRlRBR19TVUJJRkQsdGlmLT50aWZfZGlyLnRkX25zdWJpZmQsbyk7CisJCV9USUZGZnJlZShvKTsKKwl9CisJZWxzZQorCQluPVRJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRJZmQ4QXJyYXkodGlmLG5kaXIsZGlyLFRJRkZUQUdfU1VCSUZELHRpZi0+dGlmX2Rpci50ZF9uc3ViaWZkLHRpZi0+dGlmX2Rpci50ZF9zdWJpZmQpOworCWlmICghbikKKwkJcmV0dXJuKDApOworCS8qCisJICogVG90YWwgaGFjazogaWYgdGhpcyBkaXJlY3RvcnkgaW5jbHVkZXMgYSBTdWJJRkQKKwkgKiB0YWcgdGhlbiBmb3JjZSB0aGUgbmV4dCA8bj4gZGlyZWN0b3JpZXMgdG8gYmUKKwkgKiB3cml0dGVuIGFzIGBgc3ViIGRpcmVjdG9yaWVzJycgb2YgdGhpcyBvbmUuICBUaGlzCisJICogaXMgdXNlZCB0byB3cml0ZSB0aGluZ3MgbGlrZSB0aHVtYm5haWxzIGFuZAorCSAqIGltYWdlIG1hc2tzIHRoYXQgb25lIHdhbnRzIHRvIGtlZXAgb3V0IG9mIHRoZQorCSAqIG5vcm1hbCBkaXJlY3RvcnkgbGlua2FnZSBhY2Nlc3MgbWVjaGFuaXNtLgorCSAqLworCXRpZi0+dGlmX2ZsYWdzfD1USUZGX0lOU1VCSUZEOworCXRpZi0+dGlmX25zdWJpZmQ9dGlmLT50aWZfZGlyLnRkX25zdWJpZmQ7CisJaWYgKHRpZi0+dGlmX2Rpci50ZF9uc3ViaWZkPT0xKQorCQl0aWYtPnRpZl9zdWJpZmRvZmY9MDsKKwllbHNlCisJCXRpZi0+dGlmX3N1YmlmZG9mZj1tOworCXJldHVybigxKTsKK30KKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZEFzY2lpKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCBjaGFyKiB2YWx1ZSkKK3sKKwlhc3NlcnQoc2l6ZW9mKGNoYXIpPT0xKTsKKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnRGF0YSh0aWYsbmRpcixkaXIsdGFnLFRJRkZfQVNDSUksY291bnQsY291bnQsdmFsdWUpKTsKK30KKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFVuZGVmaW5lZEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCB1aW50OCogdmFsdWUpCit7CisJYXNzZXJ0KHNpemVvZih1aW50OCk9PTEpOworCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdEYXRhKHRpZixuZGlyLGRpcix0YWcsVElGRl9VTkRFRklORUQsY291bnQsY291bnQsdmFsdWUpKTsKK30KKworI2lmZGVmIG5vdGRlZgorc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZEJ5dGUoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50OCB2YWx1ZSkKK3sKKwlhc3NlcnQoc2l6ZW9mKHVpbnQ4KT09MSk7CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0RhdGEodGlmLG5kaXIsZGlyLHRhZyxUSUZGX0JZVEUsMSwxLCZ2YWx1ZSkpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRCeXRlQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIHVpbnQ4KiB2YWx1ZSkKK3sKKwlhc3NlcnQoc2l6ZW9mKHVpbnQ4KT09MSk7CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0RhdGEodGlmLG5kaXIsZGlyLHRhZyxUSUZGX0JZVEUsY291bnQsY291bnQsdmFsdWUpKTsKK30KKworI2lmZGVmIG5vdGRlZgorc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNieXRlKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgaW50OCB2YWx1ZSkKK3sKKwlhc3NlcnQoc2l6ZW9mKGludDgpPT0xKTsKKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnRGF0YSh0aWYsbmRpcixkaXIsdGFnLFRJRkZfU0JZVEUsMSwxLCZ2YWx1ZSkpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTYnl0ZUFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCBpbnQ4KiB2YWx1ZSkKK3sKKwlhc3NlcnQoc2l6ZW9mKGludDgpPT0xKTsKKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnRGF0YSh0aWYsbmRpcixkaXIsdGFnLFRJRkZfU0JZVEUsY291bnQsY291bnQsdmFsdWUpKTsKK30KKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNob3J0KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDE2IHZhbHVlKQoreworCXVpbnQxNiBtOworCWFzc2VydChzaXplb2YodWludDE2KT09Mik7CisJbT12YWx1ZTsKKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQlUSUZGU3dhYlNob3J0KCZtKTsKKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnRGF0YSh0aWYsbmRpcixkaXIsdGFnLFRJRkZfU0hPUlQsMSwyLCZtKSk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTaG9ydEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCB1aW50MTYqIHZhbHVlKQoreworCWFzc2VydChjb3VudDwweDgwMDAwMDAwKTsKKwlhc3NlcnQoc2l6ZW9mKHVpbnQxNik9PTIpOworCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCVRJRkZTd2FiQXJyYXlPZlNob3J0KHZhbHVlLGNvdW50KTsKKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnRGF0YSh0aWYsbmRpcixkaXIsdGFnLFRJRkZfU0hPUlQsY291bnQsY291bnQqMix2YWx1ZSkpOworfQorCisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU3Nob3J0KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgaW50MTYgdmFsdWUpCit7CisJaW50MTYgbTsKKwlhc3NlcnQoc2l6ZW9mKGludDE2KT09Mik7CisJbT12YWx1ZTsKKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQlUSUZGU3dhYlNob3J0KCh1aW50MTYqKSgmbSkpOworCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdEYXRhKHRpZixuZGlyLGRpcix0YWcsVElGRl9TU0hPUlQsMSwyLCZtKSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNzaG9ydEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCBpbnQxNiogdmFsdWUpCit7CisJYXNzZXJ0KGNvdW50PDB4ODAwMDAwMDApOworCWFzc2VydChzaXplb2YoaW50MTYpPT0yKTsKKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQlUSUZGU3dhYkFycmF5T2ZTaG9ydCgodWludDE2Kil2YWx1ZSxjb3VudCk7CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0RhdGEodGlmLG5kaXIsZGlyLHRhZyxUSUZGX1NTSE9SVCxjb3VudCxjb3VudCoyLHZhbHVlKSk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRMb25nKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIHZhbHVlKQoreworCXVpbnQzMiBtOworCWFzc2VydChzaXplb2YodWludDMyKT09NCk7CisJbT12YWx1ZTsKKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQlUSUZGU3dhYkxvbmcoJm0pOworCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdEYXRhKHRpZixuZGlyLGRpcix0YWcsVElGRl9MT05HLDEsNCwmbSkpOworfQorCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkTG9uZ0FycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCB1aW50MzIqIHZhbHVlKQoreworCWFzc2VydChjb3VudDwweDQwMDAwMDAwKTsKKwlhc3NlcnQoc2l6ZW9mKHVpbnQzMik9PTQpOworCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCVRJRkZTd2FiQXJyYXlPZkxvbmcodmFsdWUsY291bnQpOworCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdEYXRhKHRpZixuZGlyLGRpcix0YWcsVElGRl9MT05HLGNvdW50LGNvdW50KjQsdmFsdWUpKTsKK30KKworI2lmZGVmIG5vdGRlZgorc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNsb25nKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgaW50MzIgdmFsdWUpCit7CisJaW50MzIgbTsKKwlhc3NlcnQoc2l6ZW9mKGludDMyKT09NCk7CisJbT12YWx1ZTsKKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQlUSUZGU3dhYkxvbmcoKHVpbnQzMiopKCZtKSk7CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0RhdGEodGlmLG5kaXIsZGlyLHRhZyxUSUZGX1NMT05HLDEsNCwmbSkpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTbG9uZ0FycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCBpbnQzMiogdmFsdWUpCit7CisJYXNzZXJ0KGNvdW50PDB4NDAwMDAwMDApOworCWFzc2VydChzaXplb2YoaW50MzIpPT00KTsKKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQlUSUZGU3dhYkFycmF5T2ZMb25nKCh1aW50MzIqKXZhbHVlLGNvdW50KTsKKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnRGF0YSh0aWYsbmRpcixkaXIsdGFnLFRJRkZfU0xPTkcsY291bnQsY291bnQqNCx2YWx1ZSkpOworfQorCisjaWZkZWYgbm90ZGVmCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkTG9uZzgoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50NjQgdmFsdWUpCit7CisJdWludDY0IG07CisJYXNzZXJ0KHNpemVvZih1aW50NjQpPT04KTsKKwlhc3NlcnQodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKTsKKwltPXZhbHVlOworCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCVRJRkZTd2FiTG9uZzgoJm0pOworCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdEYXRhKHRpZixuZGlyLGRpcix0YWcsVElGRl9MT05HOCwxLDgsJm0pKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkTG9uZzhBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgdWludDY0KiB2YWx1ZSkKK3sKKwlhc3NlcnQoY291bnQ8MHgyMDAwMDAwMCk7CisJYXNzZXJ0KHNpemVvZih1aW50NjQpPT04KTsKKwlhc3NlcnQodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKTsKKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQlUSUZGU3dhYkFycmF5T2ZMb25nOCh2YWx1ZSxjb3VudCk7CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0RhdGEodGlmLG5kaXIsZGlyLHRhZyxUSUZGX0xPTkc4LGNvdW50LGNvdW50KjgsdmFsdWUpKTsKK30KKworI2lmZGVmIG5vdGRlZgorc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFNsb25nOChUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGludDY0IHZhbHVlKQoreworCWludDY0IG07CisJYXNzZXJ0KHNpemVvZihpbnQ2NCk9PTgpOworCWFzc2VydCh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpOworCW09dmFsdWU7CisJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJVElGRlN3YWJMb25nOCgodWludDY0KikoJm0pKTsKKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnRGF0YSh0aWYsbmRpcixkaXIsdGFnLFRJRkZfU0xPTkc4LDEsOCwmbSkpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRTbG9uZzhBcnJheShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIHVpbnQzMiBjb3VudCwgaW50NjQqIHZhbHVlKQoreworCWFzc2VydChjb3VudDwweDIwMDAwMDAwKTsKKwlhc3NlcnQoc2l6ZW9mKGludDY0KT09OCk7CisJYXNzZXJ0KHRpZi0+dGlmX2ZsYWdzJlRJRkZfQklHVElGRik7CisJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJVElGRlN3YWJBcnJheU9mTG9uZzgoKHVpbnQ2NCopdmFsdWUsY291bnQpOworCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdEYXRhKHRpZixuZGlyLGRpcix0YWcsVElGRl9TTE9ORzgsY291bnQsY291bnQqOCx2YWx1ZSkpOworfQorCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkUmF0aW9uYWwoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCBkb3VibGUgdmFsdWUpCit7CisJdWludDMyIG1bMl07CisJYXNzZXJ0KHZhbHVlPj0wLjApOworCWFzc2VydChzaXplb2YodWludDMyKT09NCk7CisJaWYgKHZhbHVlPD0wLjApCisJeworCQltWzBdPTA7CisJCW1bMV09MTsKKwl9CisJZWxzZSBpZiAodmFsdWU9PShkb3VibGUpKHVpbnQzMil2YWx1ZSkKKwl7CisJCW1bMF09KHVpbnQzMil2YWx1ZTsKKwkJbVsxXT0xOworCX0KKwllbHNlIGlmICh2YWx1ZTwxLjApCisJeworCQltWzBdPSh1aW50MzIpKHZhbHVlKjB4RkZGRkZGRkYpOworCQltWzFdPTB4RkZGRkZGRkY7CisJfQorCWVsc2UKKwl7CisJCW1bMF09MHhGRkZGRkZGRjsKKwkJbVsxXT0odWludDMyKSgweEZGRkZGRkZGL3ZhbHVlKTsKKwl9CisJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwl7CisJCVRJRkZTd2FiTG9uZygmbVswXSk7CisJCVRJRkZTd2FiTG9uZygmbVsxXSk7CisJfQorCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdEYXRhKHRpZixuZGlyLGRpcix0YWcsVElGRl9SQVRJT05BTCwxLDgsJm1bMF0pKTsKK30KKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFJhdGlvbmFsQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGZsb2F0KiB2YWx1ZSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkUmF0aW9uYWxBcnJheSI7CisJdWludDMyKiBtOworCWZsb2F0KiBuYTsKKwl1aW50MzIqIG5iOworCXVpbnQzMiBuYzsKKwlpbnQgbzsKKwlhc3NlcnQoc2l6ZW9mKHVpbnQzMik9PTQpOworCW09X1RJRkZtYWxsb2MoY291bnQqMipzaXplb2YodWludDMyKSk7CisJaWYgKG09PU5VTEwpCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKwkJcmV0dXJuKDApOworCX0KKwlmb3IgKG5hPXZhbHVlLCBuYj1tLCBuYz0wOyBuYzxjb3VudDsgbmErKywgbmIrPTIsIG5jKyspCisJeworCQlpZiAoKm5hPD0wLjApCisJCXsKKwkJCW5iWzBdPTA7CisJCQluYlsxXT0xOworCQl9CisJCWVsc2UgaWYgKCpuYT09KGZsb2F0KSh1aW50MzIpKCpuYSkpCisJCXsKKwkJCW5iWzBdPSh1aW50MzIpKCpuYSk7CisJCQluYlsxXT0xOworCQl9CisJCWVsc2UgaWYgKCpuYTwxLjApCisJCXsKKwkJCW5iWzBdPSh1aW50MzIpKCgqbmEpKjB4RkZGRkZGRkYpOworCQkJbmJbMV09MHhGRkZGRkZGRjsKKwkJfQorCQllbHNlCisJCXsKKwkJCW5iWzBdPTB4RkZGRkZGRkY7CisJCQluYlsxXT0odWludDMyKSgweEZGRkZGRkZGLygqbmEpKTsKKwkJfQorCX0KKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQlUSUZGU3dhYkFycmF5T2ZMb25nKG0sY291bnQqMik7CisJbz1USUZGV3JpdGVEaXJlY3RvcnlUYWdEYXRhKHRpZixuZGlyLGRpcix0YWcsVElGRl9SQVRJT05BTCxjb3VudCxjb3VudCo4LCZtWzBdKTsKKwlfVElGRmZyZWUobSk7CisJcmV0dXJuKG8pOworfQorCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU3JhdGlvbmFsQXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGZsb2F0KiB2YWx1ZSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkU3JhdGlvbmFsQXJyYXkiOworCWludDMyKiBtOworCWZsb2F0KiBuYTsKKwlpbnQzMiogbmI7CisJdWludDMyIG5jOworCWludCBvOworCWFzc2VydChzaXplb2YoaW50MzIpPT00KTsKKwltPV9USUZGbWFsbG9jKGNvdW50KjIqc2l6ZW9mKGludDMyKSk7CisJaWYgKG09PU5VTEwpCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKwkJcmV0dXJuKDApOworCX0KKwlmb3IgKG5hPXZhbHVlLCBuYj1tLCBuYz0wOyBuYzxjb3VudDsgbmErKywgbmIrPTIsIG5jKyspCisJeworCQlpZiAoKm5hPDAuMCkKKwkJeworCQkJaWYgKCpuYT09KGludDMyKSgqbmEpKQorCQkJeworCQkJCW5iWzBdPShpbnQzMikoKm5hKTsKKwkJCQluYlsxXT0xOworCQkJfQorCQkJZWxzZSBpZiAoKm5hPi0xLjApCisJCQl7CisJCQkJbmJbMF09LShpbnQzMikoKC0qbmEpKjB4N0ZGRkZGRkYpOworCQkJCW5iWzFdPTB4N0ZGRkZGRkY7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbmJbMF09LTB4N0ZGRkZGRkY7CisJCQkJbmJbMV09KGludDMyKSgweDdGRkZGRkZGLygtKm5hKSk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoKm5hPT0oaW50MzIpKCpuYSkpCisJCQl7CisJCQkJbmJbMF09KGludDMyKSgqbmEpOworCQkJCW5iWzFdPTE7CisJCQl9CisJCQllbHNlIGlmICgqbmE8MS4wKQorCQkJeworCQkJCW5iWzBdPShpbnQzMikoKCpuYSkqMHg3RkZGRkZGRik7CisJCQkJbmJbMV09MHg3RkZGRkZGRjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQluYlswXT0weDdGRkZGRkZGOworCQkJCW5iWzFdPShpbnQzMikoMHg3RkZGRkZGRi8oKm5hKSk7CisJCQl9CisJCX0KKwl9CisJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJVElGRlN3YWJBcnJheU9mTG9uZygodWludDMyKiltLGNvdW50KjIpOworCW89VElGRldyaXRlRGlyZWN0b3J5VGFnRGF0YSh0aWYsbmRpcixkaXIsdGFnLFRJRkZfU1JBVElPTkFMLGNvdW50LGNvdW50KjgsJm1bMF0pOworCV9USUZGZnJlZShtKTsKKwlyZXR1cm4obyk7Cit9CisKKyNpZmRlZiBub3RkZWYKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0NoZWNrZWRGbG9hdChUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGZsb2F0IHZhbHVlKQoreworCWZsb2F0IG07CisJYXNzZXJ0KHNpemVvZihmbG9hdCk9PTQpOworCW09dmFsdWU7CisJVElGRkN2dE5hdGl2ZVRvSUVFRUZsb2F0KHRpZiwxLCZtKTsKKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQlUSUZGU3dhYkZsb2F0KCZtKTsKKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnRGF0YSh0aWYsbmRpcixkaXIsdGFnLFRJRkZfRkxPQVQsMSw0LCZtKSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZEZsb2F0QXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGZsb2F0KiB2YWx1ZSkKK3sKKwlhc3NlcnQoY291bnQ8MHg0MDAwMDAwMCk7CisJYXNzZXJ0KHNpemVvZihmbG9hdCk9PTQpOworCVRJRkZDdnROYXRpdmVUb0lFRUVGbG9hdCh0aWYsY291bnQsJnZhbHVlKTsKKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorCQlUSUZGU3dhYkFycmF5T2ZGbG9hdCh2YWx1ZSxjb3VudCk7CisJcmV0dXJuKFRJRkZXcml0ZURpcmVjdG9yeVRhZ0RhdGEodGlmLG5kaXIsZGlyLHRhZyxUSUZGX0ZMT0FULGNvdW50LGNvdW50KjQsdmFsdWUpKTsKK30KKworI2lmZGVmIG5vdGRlZgorc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZERvdWJsZShUSUZGKiB0aWYsIHVpbnQzMiogbmRpciwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQxNiB0YWcsIGRvdWJsZSB2YWx1ZSkKK3sKKwlkb3VibGUgbTsKKwlhc3NlcnQoc2l6ZW9mKGRvdWJsZSk9PTgpOworCW09dmFsdWU7CisJVElGRkN2dE5hdGl2ZVRvSUVFRURvdWJsZSh0aWYsMSwmbSk7CisJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJVElGRlN3YWJEb3VibGUoJm0pOworCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdEYXRhKHRpZixuZGlyLGRpcix0YWcsVElGRl9ET1VCTEUsMSw4LCZtKSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZERvdWJsZUFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCBkb3VibGUqIHZhbHVlKQoreworCWFzc2VydChjb3VudDwweDIwMDAwMDAwKTsKKwlhc3NlcnQoc2l6ZW9mKGRvdWJsZSk9PTgpOworCVRJRkZDdnROYXRpdmVUb0lFRUVEb3VibGUodGlmLGNvdW50LCZ2YWx1ZSk7CisJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJVElGRlN3YWJBcnJheU9mRG91YmxlKHZhbHVlLGNvdW50KTsKKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnRGF0YSh0aWYsbmRpcixkaXIsdGFnLFRJRkZfRE9VQkxFLGNvdW50LGNvdW50KjgsdmFsdWUpKTsKK30KKworc3RhdGljIGludAorVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZElmZEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCB1aW50MzIqIHZhbHVlKQoreworCWFzc2VydChjb3VudDwweDQwMDAwMDAwKTsKKwlhc3NlcnQoc2l6ZW9mKHVpbnQzMik9PTQpOworCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCVRJRkZTd2FiQXJyYXlPZkxvbmcodmFsdWUsY291bnQpOworCXJldHVybihUSUZGV3JpdGVEaXJlY3RvcnlUYWdEYXRhKHRpZixuZGlyLGRpcix0YWcsVElGRl9JRkQsY291bnQsY291bnQqNCx2YWx1ZSkpOworfQorCitzdGF0aWMgaW50CitUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkSWZkOEFycmF5KFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgdWludDMyIGNvdW50LCB1aW50NjQqIHZhbHVlKQoreworCWFzc2VydChjb3VudDwweDIwMDAwMDAwKTsKKwlhc3NlcnQoc2l6ZW9mKHVpbnQ2NCk9PTgpOworCWFzc2VydCh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpOworCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCVRJRkZTd2FiQXJyYXlPZkxvbmc4KHZhbHVlLGNvdW50KTsKKwlyZXR1cm4oVElGRldyaXRlRGlyZWN0b3J5VGFnRGF0YSh0aWYsbmRpcixkaXIsdGFnLFRJRkZfSUZEOCxjb3VudCxjb3VudCo4LHZhbHVlKSk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZXcml0ZURpcmVjdG9yeVRhZ0RhdGEoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MTYgZGF0YXR5cGUsIHVpbnQzMiBjb3VudCwgdWludDMyIGRhdGFsZW5ndGgsIHZvaWQqIGRhdGEpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRldyaXRlRGlyZWN0b3J5VGFnRGF0YSI7CisJdWludDMyIG07CisJbT0wOworCXdoaWxlIChtPCgqbmRpcikpCisJeworCQlhc3NlcnQoZGlyW21dLnRkaXJfdGFnIT10YWcpOworCQlpZiAoZGlyW21dLnRkaXJfdGFnPnRhZykKKwkJCWJyZWFrOworCQltKys7CisJfQorCWlmIChtPCgqbmRpcikpCisJeworCQl1aW50MzIgbjsKKwkJZm9yIChuPSpuZGlyOyBuPm07IG4tLSkKKwkJCWRpcltuXT1kaXJbbi0xXTsKKwl9CisJZGlyW21dLnRkaXJfdGFnPXRhZzsKKwlkaXJbbV0udGRpcl90eXBlPWRhdGF0eXBlOworCWRpclttXS50ZGlyX2NvdW50PWNvdW50OworCWRpclttXS50ZGlyX29mZnNldC50b2ZmX2xvbmc4ID0gMDsKKwlpZiAoZGF0YWxlbmd0aDw9KCh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpPzB4OFU6MHg0VSkpCisJCV9USUZGbWVtY3B5KCZkaXJbbV0udGRpcl9vZmZzZXQsZGF0YSxkYXRhbGVuZ3RoKTsKKwllbHNlCisJeworCQl1aW50NjQgbmEsbmI7CisJCW5hPXRpZi0+dGlmX2RhdGFvZmY7CisJCW5iPW5hK2RhdGFsZW5ndGg7CisJCWlmICghKHRpZi0+dGlmX2ZsYWdzJlRJRkZfQklHVElGRikpCisJCQluYj0odWludDMyKW5iOworCQlpZiAoKG5iPG5hKXx8KG5iPGRhdGFsZW5ndGgpKQorCQl7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk1heGltdW0gVElGRiBmaWxlIHNpemUgZXhjZWVkZWQiKTsKKwkJCXJldHVybigwKTsKKwkJfQorCQlpZiAoIVNlZWtPSyh0aWYsbmEpKQorCQl7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIklPIGVycm9yIHdyaXRpbmcgdGFnIGRhdGEiKTsKKwkJCXJldHVybigwKTsKKwkJfQorCQlhc3NlcnQoZGF0YWxlbmd0aDwweDgwMDAwMDAwVUwpOworCQlpZiAoIVdyaXRlT0sodGlmLGRhdGEsKHRtc2l6ZV90KWRhdGFsZW5ndGgpKQorCQl7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIklPIGVycm9yIHdyaXRpbmcgdGFnIGRhdGEiKTsKKwkJCXJldHVybigwKTsKKwkJfQorCQl0aWYtPnRpZl9kYXRhb2ZmPW5iOworCQlpZiAodGlmLT50aWZfZGF0YW9mZiYxKQorCQkJdGlmLT50aWZfZGF0YW9mZisrOworCQlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCQl7CisJCQl1aW50MzIgbzsKKwkJCW89KHVpbnQzMiluYTsKKwkJCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJMb25nKCZvKTsKKwkJCV9USUZGbWVtY3B5KCZkaXJbbV0udGRpcl9vZmZzZXQsJm8sNCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlkaXJbbV0udGRpcl9vZmZzZXQudG9mZl9sb25nOCA9IG5hOworCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYkxvbmc4KCZkaXJbbV0udGRpcl9vZmZzZXQudG9mZl9sb25nOCk7CisJCX0KKwl9CisJKCpuZGlyKSsrOworCXJldHVybigxKTsKK30KKworLyoKKyAqIExpbmsgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGludG8gdGhlIGRpcmVjdG9yeSBjaGFpbiBmb3IgdGhlIGZpbGUuCisgKi8KK3N0YXRpYyBpbnQKK1RJRkZMaW5rRGlyZWN0b3J5KFRJRkYqIHRpZikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGTGlua0RpcmVjdG9yeSI7CisKKwl0aWYtPnRpZl9kaXJvZmYgPSAoVElGRlNlZWtGaWxlKHRpZiwwLFNFRUtfRU5EKSsxKSAmfiAxOworCisJLyoKKwkgKiBIYW5kbGUgU3ViSUZEcworCSAqLworCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfSU5TVUJJRkQpCisJeworCQlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCQl7CisJCQl1aW50MzIgbTsKKwkJCW0gPSAodWludDMyKXRpZi0+dGlmX2Rpcm9mZjsKKwkJCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYkxvbmcoJm0pOworCQkJKHZvaWQpIFRJRkZTZWVrRmlsZSh0aWYsIHRpZi0+dGlmX3N1YmlmZG9mZiwgU0VFS19TRVQpOworCQkJaWYgKCFXcml0ZU9LKHRpZiwgJm0sIDQpKSB7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkgICAgICJFcnJvciB3cml0aW5nIFN1YklGRCBkaXJlY3RvcnkgbGluayIpOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCQkvKgorCQkJICogQWR2YW5jZSB0byB0aGUgbmV4dCBTdWJJRkQgb3IsIGlmIHRoaXMgaXMKKwkJCSAqIHRoZSBsYXN0IG9uZSBjb25maWd1cmVkLCByZXZlcnQgYmFjayB0byB0aGUKKwkJCSAqIG5vcm1hbCBkaXJlY3RvcnkgbGlua2FnZS4KKwkJCSAqLworCQkJaWYgKC0tdGlmLT50aWZfbnN1YmlmZCkKKwkJCQl0aWYtPnRpZl9zdWJpZmRvZmYgKz0gNDsKKwkJCWVsc2UKKwkJCQl0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9JTlNVQklGRDsKKwkJCXJldHVybiAoMSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl1aW50NjQgbTsKKwkJCW0gPSB0aWYtPnRpZl9kaXJvZmY7CisJCQlpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1NXQUIpCisJCQkJVElGRlN3YWJMb25nOCgmbSk7CisJCQkodm9pZCkgVElGRlNlZWtGaWxlKHRpZiwgdGlmLT50aWZfc3ViaWZkb2ZmLCBTRUVLX1NFVCk7CisJCQlpZiAoIVdyaXRlT0sodGlmLCAmbSwgOCkpIHsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCSAgICAgIkVycm9yIHdyaXRpbmcgU3ViSUZEIGRpcmVjdG9yeSBsaW5rIik7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBBZHZhbmNlIHRvIHRoZSBuZXh0IFN1YklGRCBvciwgaWYgdGhpcyBpcworCQkJICogdGhlIGxhc3Qgb25lIGNvbmZpZ3VyZWQsIHJldmVydCBiYWNrIHRvIHRoZQorCQkJICogbm9ybWFsIGRpcmVjdG9yeSBsaW5rYWdlLgorCQkJICovCisJCQlpZiAoLS10aWYtPnRpZl9uc3ViaWZkKQorCQkJCXRpZi0+dGlmX3N1YmlmZG9mZiArPSA4OworCQkJZWxzZQorCQkJCXRpZi0+dGlmX2ZsYWdzICY9IH5USUZGX0lOU1VCSUZEOworCQkJcmV0dXJuICgxKTsKKwkJfQorCX0KKworCWlmICghKHRpZi0+dGlmX2ZsYWdzJlRJRkZfQklHVElGRikpCisJeworCQl1aW50MzIgbTsKKwkJdWludDMyIG5leHRkaXI7CisJCW0gPSAodWludDMyKSh0aWYtPnRpZl9kaXJvZmYpOworCQlpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1NXQUIpCisJCQlUSUZGU3dhYkxvbmcoJm0pOworCQlpZiAodGlmLT50aWZfaGVhZGVyLmNsYXNzaWMudGlmZl9kaXJvZmYgPT0gMCkgeworCQkJLyoKKwkJCSAqIEZpcnN0IGRpcmVjdG9yeSwgb3ZlcndyaXRlIG9mZnNldCBpbiBoZWFkZXIuCisJCQkgKi8KKwkJCXRpZi0+dGlmX2hlYWRlci5jbGFzc2ljLnRpZmZfZGlyb2ZmID0gKHVpbnQzMikgdGlmLT50aWZfZGlyb2ZmOworCQkJKHZvaWQpIFRJRkZTZWVrRmlsZSh0aWYsNCwgU0VFS19TRVQpOworCQkJaWYgKCFXcml0ZU9LKHRpZiwgJm0sIDQpKSB7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIHRpZi0+dGlmX25hbWUsCisJCQkJCSAgICAgIkVycm9yIHdyaXRpbmcgVElGRiBoZWFkZXIiKTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJcmV0dXJuICgxKTsKKwkJfQorCQkvKgorCQkgKiBOb3QgdGhlIGZpcnN0IGRpcmVjdG9yeSwgc2VhcmNoIHRvIHRoZSBsYXN0IGFuZCBhcHBlbmQuCisJCSAqLworCQluZXh0ZGlyID0gdGlmLT50aWZfaGVhZGVyLmNsYXNzaWMudGlmZl9kaXJvZmY7CisJCXdoaWxlKDEpIHsKKwkJCXVpbnQxNiBkaXJjb3VudDsKKwkJCXVpbnQzMiBuZXh0bmV4dGRpcjsKKworCQkJaWYgKCFTZWVrT0sodGlmLCBuZXh0ZGlyKSB8fAorCQkJICAgICFSZWFkT0sodGlmLCAmZGlyY291bnQsIDIpKSB7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkJICAgICAiRXJyb3IgZmV0Y2hpbmcgZGlyZWN0b3J5IGNvdW50Iik7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYlNob3J0KCZkaXJjb3VudCk7CisJCQkodm9pZCkgVElGRlNlZWtGaWxlKHRpZiwKKwkJCSAgICBuZXh0ZGlyKzIrZGlyY291bnQqMTIsIFNFRUtfU0VUKTsKKwkJCWlmICghUmVhZE9LKHRpZiwgJm5leHRuZXh0ZGlyLCA0KSkgeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJCSAgICAgIkVycm9yIGZldGNoaW5nIGRpcmVjdG9yeSBsaW5rIik7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYkxvbmcoJm5leHRuZXh0ZGlyKTsKKwkJCWlmIChuZXh0bmV4dGRpcj09MCkKKwkJCXsKKwkJCQkodm9pZCkgVElGRlNlZWtGaWxlKHRpZiwKKwkJCQkgICAgbmV4dGRpcisyK2RpcmNvdW50KjEyLCBTRUVLX1NFVCk7CisJCQkJaWYgKCFXcml0ZU9LKHRpZiwgJm0sIDQpKSB7CisJCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJCSAgICAgIkVycm9yIHdyaXRpbmcgZGlyZWN0b3J5IGxpbmsiKTsKKwkJCQkJcmV0dXJuICgwKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQluZXh0ZGlyPW5leHRuZXh0ZGlyOworCQl9CisJfQorCWVsc2UKKwl7CisJCXVpbnQ2NCBtOworCQl1aW50NjQgbmV4dGRpcjsKKwkJbSA9IHRpZi0+dGlmX2Rpcm9mZjsKKwkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKQorCQkJVElGRlN3YWJMb25nOCgmbSk7CisJCWlmICh0aWYtPnRpZl9oZWFkZXIuYmlnLnRpZmZfZGlyb2ZmID09IDApIHsKKwkJCS8qCisJCQkgKiBGaXJzdCBkaXJlY3RvcnksIG92ZXJ3cml0ZSBvZmZzZXQgaW4gaGVhZGVyLgorCQkJICovCisJCQl0aWYtPnRpZl9oZWFkZXIuYmlnLnRpZmZfZGlyb2ZmID0gdGlmLT50aWZfZGlyb2ZmOworCQkJKHZvaWQpIFRJRkZTZWVrRmlsZSh0aWYsOCwgU0VFS19TRVQpOworCQkJaWYgKCFXcml0ZU9LKHRpZiwgJm0sIDgpKSB7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIHRpZi0+dGlmX25hbWUsCisJCQkJCSAgICAgIkVycm9yIHdyaXRpbmcgVElGRiBoZWFkZXIiKTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJcmV0dXJuICgxKTsKKwkJfQorCQkvKgorCQkgKiBOb3QgdGhlIGZpcnN0IGRpcmVjdG9yeSwgc2VhcmNoIHRvIHRoZSBsYXN0IGFuZCBhcHBlbmQuCisJCSAqLworCQluZXh0ZGlyID0gdGlmLT50aWZfaGVhZGVyLmJpZy50aWZmX2Rpcm9mZjsKKwkJd2hpbGUoMSkgeworCQkJdWludDY0IGRpcmNvdW50NjQ7CisJCQl1aW50MTYgZGlyY291bnQ7CisJCQl1aW50NjQgbmV4dG5leHRkaXI7CisKKwkJCWlmICghU2Vla09LKHRpZiwgbmV4dGRpcikgfHwKKwkJCSAgICAhUmVhZE9LKHRpZiwgJmRpcmNvdW50NjQsIDgpKSB7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkJICAgICAiRXJyb3IgZmV0Y2hpbmcgZGlyZWN0b3J5IGNvdW50Iik7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYkxvbmc4KCZkaXJjb3VudDY0KTsKKwkJCWlmIChkaXJjb3VudDY0PjB4RkZGRikKKwkJCXsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCQkgICAgICJTYW5pdHkgY2hlY2sgb24gdGFnIGNvdW50IGZhaWxlZCwgbGlrZWx5IGNvcnJ1cHQgVElGRiIpOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCQlkaXJjb3VudD0odWludDE2KWRpcmNvdW50NjQ7CisJCQkodm9pZCkgVElGRlNlZWtGaWxlKHRpZiwKKwkJCSAgICBuZXh0ZGlyKzgrZGlyY291bnQqMjAsIFNFRUtfU0VUKTsKKwkJCWlmICghUmVhZE9LKHRpZiwgJm5leHRuZXh0ZGlyLCA4KSkgeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJCSAgICAgIkVycm9yIGZldGNoaW5nIGRpcmVjdG9yeSBsaW5rIik7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYkxvbmc4KCZuZXh0bmV4dGRpcik7CisJCQlpZiAobmV4dG5leHRkaXI9PTApCisJCQl7CisJCQkJKHZvaWQpIFRJRkZTZWVrRmlsZSh0aWYsCisJCQkJICAgIG5leHRkaXIrOCtkaXJjb3VudCoyMCwgU0VFS19TRVQpOworCQkJCWlmICghV3JpdGVPSyh0aWYsICZtLCA4KSkgeworCQkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCQkgICAgICJFcnJvciB3cml0aW5nIGRpcmVjdG9yeSBsaW5rIik7CisJCQkJCXJldHVybiAoMCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJbmV4dGRpcj1uZXh0bmV4dGRpcjsKKwkJfQorCX0KKwlyZXR1cm4gKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIFRJRkZSZXdyaXRlRmllbGQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFJld3JpdGUgYSBmaWVsZCBpbiB0aGUgZGlyZWN0b3J5IG9uIGRpc2sgd2l0aG91dCByZWdhcmQgdG8gICAgICAqLworLyogICAgICB1cGRhdGluZyB0aGUgVElGRiBkaXJlY3Rvcnkgc3RydWN0dXJlIGluIG1lbW9yeS4gIEN1cnJlbnRseSAgICAgKi8KKy8qICAgICAgb25seSBzdXBwb3J0ZWQgZm9yIGZpZWxkIHRoYXQgYWxyZWFkeSBleGlzdCBpbiB0aGUgb24tZGlzayAgICAgICovCisvKiAgICAgIGRpcmVjdG9yeS4gIE1haW5seSB1c2VkIGZvciB1cGRhdGluZyBzdHJpcG9mZnNldCAvICAgICAgICAgICAgICAqLworLyogICAgICBzdHJpcGJ5dGVjb3VudCB2YWx1ZXMgYWZ0ZXIgdGhlIGRpcmVjdG9yeSBpcyBhbHJlYWR5IG9uICAgICAgICAgKi8KKy8qICAgICAgZGlzay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBSZXR1cm5zIHplcm8gb24gZmFpbHVyZSwgYW5kIG9uZSBvbiBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludAorX1RJRkZSZXdyaXRlRmllbGQoVElGRiogdGlmLCB1aW50MTYgdGFnLCBUSUZGRGF0YVR5cGUgaW5fZGF0YXR5cGUsIAorICAgICAgICAgICAgICAgICAgdG1zaXplX3QgY291bnQsIHZvaWQqIGRhdGEpCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRlJlc2V0RmllbGQiOworICAgIC8qIGNvbnN0IFRJRkZGaWVsZCogZmlwID0gTlVMTDsgKi8KKyAgICB1aW50MTYgZGlyY291bnQ7CisgICAgdG1zaXplX3QgZGlyc2l6ZTsKKyAgICB1aW50OCBkaXJlbnRyeV9yYXdbMjBdOworICAgIHVpbnQxNiBlbnRyeV90YWcgPSAwOworICAgIHVpbnQxNiBlbnRyeV90eXBlID0gMDsKKyAgICB1aW50NjQgZW50cnlfY291bnQgPSAwOworICAgIHVpbnQ2NCBlbnRyeV9vZmZzZXQgPSAwOworICAgIGludCAgICB2YWx1ZV9pbl9lbnRyeSA9IDA7CisgICAgdWludDY0IHJlYWRfb2Zmc2V0OworICAgIHVpbnQ4ICpidWZfdG9fd3JpdGUgPSBOVUxMOworICAgIFRJRkZEYXRhVHlwZSBkYXRhdHlwZTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgRmluZCBmaWVsZCBkZWZpbml0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIC8qZmlwID0qLyBUSUZGRmluZEZpZWxkKHRpZiwgdGFnLCBUSUZGX0FOWSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgIERvIHNvbWUgY2hlY2tpbmcgdGhpcyBpcyBhIHN0cmFpZ2h0IGZvcndhcmQgY2FzZS4gICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBpZiggaXNNYXBwZWQodGlmKSApCisgICAgeworICAgICAgICBUSUZGRXJyb3JFeHQoIHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgCisgICAgICAgICAgICAgICAgICAgICAgIk1lbW9yeSBtYXBwZWQgZmlsZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIHRoaXMgb3BlcmF0aW9uLiIgKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYoIHRpZi0+dGlmX2Rpcm9mZiA9PSAwICkKKyAgICB7CisgICAgICAgIFRJRkZFcnJvckV4dCggdGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdCB0byByZXNldCBmaWVsZCBvbiBkaXJlY3Rvcnkgbm90IGFscmVhZHkgb24gZGlzay4iICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgUmVhZCB0aGUgZGlyZWN0b3J5IGVudHJ5IGNvdW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIGlmICghU2Vla09LKHRpZiwgdGlmLT50aWZfZGlyb2ZmKSkgeworICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgIiVzOiBTZWVrIGVycm9yIGFjY2Vzc2luZyBUSUZGIGRpcmVjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICB0aWYtPnRpZl9uYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmVhZF9vZmZzZXQgPSB0aWYtPnRpZl9kaXJvZmY7CisKKyAgICBpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorICAgIHsKKyAgICAgICAgaWYgKCFSZWFkT0sodGlmLCAmZGlyY291bnQsIHNpemVvZiAodWludDE2KSkpIHsKKyAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBDYW4gbm90IHJlYWQgVElGRiBkaXJlY3RvcnkgY291bnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKQorICAgICAgICAgICAgVElGRlN3YWJTaG9ydCgmZGlyY291bnQpOworICAgICAgICBkaXJzaXplID0gMTI7CisgICAgICAgIHJlYWRfb2Zmc2V0ICs9IDI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDY0IGRpcmNvdW50NjQ7CisgICAgICAgIGlmICghUmVhZE9LKHRpZiwgJmRpcmNvdW50NjQsIHNpemVvZiAodWludDY0KSkpIHsKKyAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBDYW4gbm90IHJlYWQgVElGRiBkaXJlY3RvcnkgY291bnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKQorICAgICAgICAgICAgVElGRlN3YWJMb25nOCgmZGlyY291bnQ2NCk7CisgICAgICAgIGRpcmNvdW50ID0gKHVpbnQxNilkaXJjb3VudDY0OworICAgICAgICBkaXJzaXplID0gMjA7CisgICAgICAgIHJlYWRfb2Zmc2V0ICs9IDg7CisgICAgfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgICBSZWFkIHRocm91Z2ggZGlyZWN0b3J5IHRvIGZpbmQgdGFyZ2V0IHRhZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgd2hpbGUoIGRpcmNvdW50ID4gMCApCisgICAgeworICAgICAgICBpZiAoIVJlYWRPSyh0aWYsIGRpcmVudHJ5X3JhdywgZGlyc2l6ZSkpIHsKKyAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBDYW4gbm90IHJlYWQgVElGRiBkaXJlY3RvcnkgZW50cnkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aWYtPnRpZl9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgbWVtY3B5KCAmZW50cnlfdGFnLCBkaXJlbnRyeV9yYXcgKyAwLCBzaXplb2YodWludDE2KSApOworICAgICAgICBpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorICAgICAgICAgICAgVElGRlN3YWJTaG9ydCggJmVudHJ5X3RhZyApOworCisgICAgICAgIGlmKCBlbnRyeV90YWcgPT0gdGFnICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHJlYWRfb2Zmc2V0ICs9IGRpcnNpemU7CisgICAgfQorCisgICAgaWYoIGVudHJ5X3RhZyAhPSB0YWcgKQorICAgIHsKKyAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICIlczogQ291bGQgbm90IGZpbmQgdGFnICVkLiIsCisgICAgICAgICAgICAgICAgICAgICB0aWYtPnRpZl9uYW1lLCB0YWcgKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgICBFeHRyYWN0IHRoZSB0eXBlLCBjb3VudCBhbmQgb2Zmc2V0IGZvciB0aGlzIGVudHJ5LiAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgbWVtY3B5KCAmZW50cnlfdHlwZSwgZGlyZW50cnlfcmF3ICsgMiwgc2l6ZW9mKHVpbnQxNikgKTsKKyAgICBpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorICAgICAgICBUSUZGU3dhYlNob3J0KCAmZW50cnlfdHlwZSApOworCisgICAgaWYgKCEodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKSkKKyAgICB7CisgICAgICAgIHVpbnQzMiB2YWx1ZTsKKyAgICAgICAgCisgICAgICAgIG1lbWNweSggJnZhbHVlLCBkaXJlbnRyeV9yYXcgKyA0LCBzaXplb2YodWludDMyKSApOworICAgICAgICBpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorICAgICAgICAgICAgVElGRlN3YWJMb25nKCAmdmFsdWUgKTsKKyAgICAgICAgZW50cnlfY291bnQgPSB2YWx1ZTsKKworICAgICAgICBtZW1jcHkoICZ2YWx1ZSwgZGlyZW50cnlfcmF3ICsgOCwgc2l6ZW9mKHVpbnQzMikgKTsKKyAgICAgICAgaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKyAgICAgICAgICAgIFRJRkZTd2FiTG9uZyggJnZhbHVlICk7CisgICAgICAgIGVudHJ5X29mZnNldCA9IHZhbHVlOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBtZW1jcHkoICZlbnRyeV9jb3VudCwgZGlyZW50cnlfcmF3ICsgNCwgc2l6ZW9mKHVpbnQ2NCkgKTsKKyAgICAgICAgaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKyAgICAgICAgICAgIFRJRkZTd2FiTG9uZzgoICZlbnRyeV9jb3VudCApOworCisgICAgICAgIG1lbWNweSggJmVudHJ5X29mZnNldCwgZGlyZW50cnlfcmF3ICsgMTIsIHNpemVvZih1aW50NjQpICk7CisgICAgICAgIGlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisgICAgICAgICAgICBUSUZGU3dhYkxvbmc4KCAmZW50cnlfb2Zmc2V0ICk7CisgICAgfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgICBXaGF0IGRhdGEgdHlwZSBkbyB3ZSB3YW50IHRvIHdyaXRlIHRoaXMgYXM/ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgaWYoIFRJRkZEYXRhV2lkdGgoaW5fZGF0YXR5cGUpID09IDggJiYgISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpICkKKyAgICB7CisgICAgICAgIGlmKCBpbl9kYXRhdHlwZSA9PSBUSUZGX0xPTkc4ICkKKyAgICAgICAgICAgIGRhdGF0eXBlID0gVElGRl9MT05HOworICAgICAgICBlbHNlIGlmKCBpbl9kYXRhdHlwZSA9PSBUSUZGX1NMT05HOCApCisgICAgICAgICAgICBkYXRhdHlwZSA9IFRJRkZfU0xPTkc7CisgICAgICAgIGVsc2UgaWYoIGluX2RhdGF0eXBlID09IFRJRkZfSUZEOCApCisgICAgICAgICAgICBkYXRhdHlwZSA9IFRJRkZfSUZEOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkYXRhdHlwZSA9IGluX2RhdGF0eXBlOworICAgIH0KKyAgICBlbHNlIAorICAgICAgICBkYXRhdHlwZSA9IGluX2RhdGF0eXBlOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgICBQcmVwYXJlIGJ1ZmZlciBvZiBhY3R1YWwgZGF0YSB0byB3cml0ZS4gIFRoaXMgaW5jbHVkZXMgICAgICAgICAgKi8KKy8qICAgICAgc3dhYmJpbmcgYXMgbmVlZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIGJ1Zl90b193cml0ZSA9CisJICAgICh1aW50OCAqKV9USUZGQ2hlY2tNYWxsb2ModGlmLCBjb3VudCwgVElGRkRhdGFXaWR0aChkYXRhdHlwZSksCisJCQkJICAgICAgImZvciBmaWVsZCBidWZmZXIuIik7CisgICAgaWYgKCFidWZfdG9fd3JpdGUpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYoIGRhdGF0eXBlID09IGluX2RhdGF0eXBlICkKKyAgICAgICAgbWVtY3B5KCBidWZfdG9fd3JpdGUsIGRhdGEsIGNvdW50ICogVElGRkRhdGFXaWR0aChkYXRhdHlwZSkgKTsKKyAgICBlbHNlIGlmKCBkYXRhdHlwZSA9PSBUSUZGX1NMT05HICYmIGluX2RhdGF0eXBlID09IFRJRkZfU0xPTkc4ICkKKyAgICB7CisJdG1zaXplX3QgaTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgICgoaW50MzIgKikgYnVmX3RvX3dyaXRlKVtpXSA9IAorICAgICAgICAgICAgICAgIChpbnQzMikgKChpbnQ2NCAqKSBkYXRhKVtpXTsKKyAgICAgICAgICAgIGlmKCAoaW50NjQpICgoaW50MzIgKikgYnVmX3RvX3dyaXRlKVtpXSAhPSAoKGludDY0ICopIGRhdGEpW2ldICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfVElGRmZyZWUoIGJ1Zl90b193cml0ZSApOworICAgICAgICAgICAgICAgIFRJRkZFcnJvckV4dCggdGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBleGNlZWRzIDMyYml0IHJhbmdlIG9mIG91dHB1dCB0eXBlLiIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKCAoZGF0YXR5cGUgPT0gVElGRl9MT05HICYmIGluX2RhdGF0eXBlID09IFRJRkZfTE9ORzgpCisgICAgICAgICAgICAgfHwgKGRhdGF0eXBlID09IFRJRkZfSUZEICYmIGluX2RhdGF0eXBlID09IFRJRkZfSUZEOCkgKQorICAgIHsKKwl0bXNpemVfdCBpOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgKCh1aW50MzIgKikgYnVmX3RvX3dyaXRlKVtpXSA9IAorICAgICAgICAgICAgICAgICh1aW50MzIpICgodWludDY0ICopIGRhdGEpW2ldOworICAgICAgICAgICAgaWYoICh1aW50NjQpICgodWludDMyICopIGJ1Zl90b193cml0ZSlbaV0gIT0gKCh1aW50NjQgKikgZGF0YSlbaV0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9USUZGZnJlZSggYnVmX3RvX3dyaXRlICk7CisgICAgICAgICAgICAgICAgVElGRkVycm9yRXh0KCB0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIGV4Y2VlZHMgMzJiaXQgcmFuZ2Ugb2Ygb3V0cHV0IHR5cGUuIiApOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYoIFRJRkZEYXRhV2lkdGgoZGF0YXR5cGUpID4gMSAmJiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKSApCisgICAgeworICAgICAgICBpZiggVElGRkRhdGFXaWR0aChkYXRhdHlwZSkgPT0gMiApCisgICAgICAgICAgICBUSUZGU3dhYkFycmF5T2ZTaG9ydCggKHVpbnQxNiAqKSBidWZfdG9fd3JpdGUsIGNvdW50ICk7CisgICAgICAgIGVsc2UgaWYoIFRJRkZEYXRhV2lkdGgoZGF0YXR5cGUpID09IDQgKQorICAgICAgICAgICAgVElGRlN3YWJBcnJheU9mTG9uZyggKHVpbnQzMiAqKSBidWZfdG9fd3JpdGUsIGNvdW50ICk7CisgICAgICAgIGVsc2UgaWYoIFRJRkZEYXRhV2lkdGgoZGF0YXR5cGUpID09IDggKQorICAgICAgICAgICAgVElGRlN3YWJBcnJheU9mTG9uZzgoICh1aW50NjQgKikgYnVmX3RvX3dyaXRlLCBjb3VudCApOworICAgIH0KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qICAgICAgSXMgdGhpcyBhIHZhbHVlIHRoYXQgZml0cyBpbnRvIHRoZSBkaXJlY3RvcnkgZW50cnk/ICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIGlmICghKHRpZi0+dGlmX2ZsYWdzJlRJRkZfQklHVElGRikpCisgICAgeworICAgICAgICBpZiggVElGRkRhdGFXaWR0aChkYXRhdHlwZSkgKiBjb3VudCA8PSA0ICkKKyAgICAgICAgeworICAgICAgICAgICAgZW50cnlfb2Zmc2V0ID0gcmVhZF9vZmZzZXQgKyA4OworICAgICAgICAgICAgdmFsdWVfaW5fZW50cnkgPSAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCBUSUZGRGF0YVdpZHRoKGRhdGF0eXBlKSAqIGNvdW50IDw9IDggKQorICAgICAgICB7CisgICAgICAgICAgICBlbnRyeV9vZmZzZXQgPSByZWFkX29mZnNldCArIDEyOworICAgICAgICAgICAgdmFsdWVfaW5fZW50cnkgPSAxOworICAgICAgICB9CisgICAgfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgICBJZiB0aGUgdGFnIHR5cGUsIGFuZCBjb3VudCBtYXRjaCwgdGhlbiB3ZSBqdXN0IHdyaXRlIGl0IG91dCAgICAgKi8KKy8qICAgICAgb3ZlciB0aGUgb2xkIHZhbHVlcyB3aXRob3V0IGFsdGVyaW5nIHRoZSBkaXJlY3RvcnkgZW50cnkgYXQgICAgICovCisvKiAgICAgIGFsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBpZiggZW50cnlfY291bnQgPT0gKHVpbnQ2NCljb3VudCAmJiBlbnRyeV90eXBlID09ICh1aW50MTYpIGRhdGF0eXBlICkKKyAgICB7CisgICAgICAgIGlmICghU2Vla09LKHRpZiwgZW50cnlfb2Zmc2V0KSkgeworICAgICAgICAgICAgX1RJRkZmcmVlKCBidWZfdG9fd3JpdGUgKTsKKyAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBTZWVrIGVycm9yIGFjY2Vzc2luZyBUSUZGIGRpcmVjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVdyaXRlT0sodGlmLCBidWZfdG9fd3JpdGUsIGNvdW50KlRJRkZEYXRhV2lkdGgoZGF0YXR5cGUpKSkgeworICAgICAgICAgICAgX1RJRkZmcmVlKCBidWZfdG9fd3JpdGUgKTsKKyAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdyaXRpbmcgZGlyZWN0b3J5IGxpbmsiKTsKKyAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIH0KKworICAgICAgICBfVElGRmZyZWUoIGJ1Zl90b193cml0ZSApOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgIE90aGVyd2lzZSwgd2Ugd3JpdGUgdGhlIG5ldyB0YWcgZGF0YSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBpZiggIXZhbHVlX2luX2VudHJ5ICkKKyAgICB7CisgICAgICAgIGVudHJ5X29mZnNldCA9IFRJRkZTZWVrRmlsZSh0aWYsMCxTRUVLX0VORCk7CisgICAgICAgIAorICAgICAgICBpZiAoIVdyaXRlT0sodGlmLCBidWZfdG9fd3JpdGUsIGNvdW50KlRJRkZEYXRhV2lkdGgoZGF0YXR5cGUpKSkgeworICAgICAgICAgICAgX1RJRkZmcmVlKCBidWZfdG9fd3JpdGUgKTsKKyAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdyaXRpbmcgZGlyZWN0b3J5IGxpbmsiKTsKKyAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbWVtY3B5KCAmZW50cnlfb2Zmc2V0LCBidWZfdG9fd3JpdGUsIGNvdW50KlRJRkZEYXRhV2lkdGgoZGF0YXR5cGUpKTsKKyAgICB9CisKKyAgICBfVElGRmZyZWUoIGJ1Zl90b193cml0ZSApOworICAgIGJ1Zl90b193cml0ZSA9IDA7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgIEFkanVzdCB0aGUgZGlyZWN0b3J5IGVudHJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBlbnRyeV90eXBlID0gZGF0YXR5cGU7CisgICAgbWVtY3B5KCBkaXJlbnRyeV9yYXcgKyAyLCAmZW50cnlfdHlwZSwgc2l6ZW9mKHVpbnQxNikgKTsKKyAgICBpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorICAgICAgICBUSUZGU3dhYlNob3J0KCAodWludDE2ICopIChkaXJlbnRyeV9yYXcgKyAyKSApOworCisgICAgaWYgKCEodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKSkKKyAgICB7CisgICAgICAgIHVpbnQzMiB2YWx1ZTsKKworICAgICAgICB2YWx1ZSA9ICh1aW50MzIpIGVudHJ5X2NvdW50OworICAgICAgICBtZW1jcHkoIGRpcmVudHJ5X3JhdyArIDQsICZ2YWx1ZSwgc2l6ZW9mKHVpbnQzMikgKTsKKyAgICAgICAgaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfU1dBQikKKyAgICAgICAgICAgIFRJRkZTd2FiTG9uZyggKHVpbnQzMiAqKSAoZGlyZW50cnlfcmF3ICsgNCkgKTsKKworICAgICAgICB2YWx1ZSA9ICh1aW50MzIpIGVudHJ5X29mZnNldDsKKyAgICAgICAgbWVtY3B5KCBkaXJlbnRyeV9yYXcgKyA4LCAmdmFsdWUsIHNpemVvZih1aW50MzIpICk7CisgICAgICAgIGlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCisgICAgICAgICAgICBUSUZGU3dhYkxvbmcoICh1aW50MzIgKikgKGRpcmVudHJ5X3JhdyArIDgpICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1lbWNweSggZGlyZW50cnlfcmF3ICsgNCwgJmVudHJ5X2NvdW50LCBzaXplb2YodWludDY0KSApOworICAgICAgICBpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorICAgICAgICAgICAgVElGRlN3YWJMb25nOCggKHVpbnQ2NCAqKSAoZGlyZW50cnlfcmF3ICsgNCkgKTsKKworICAgICAgICBtZW1jcHkoIGRpcmVudHJ5X3JhdyArIDEyLCAmZW50cnlfb2Zmc2V0LCBzaXplb2YodWludDY0KSApOworICAgICAgICBpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQorICAgICAgICAgICAgVElGRlN3YWJMb25nOCggKHVpbnQ2NCAqKSAoZGlyZW50cnlfcmF3ICsgMTIpICk7CisgICAgfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgICBXcml0ZSB0aGUgZGlyZWN0b3J5IGVudHJ5IG91dCB0byBkaXNrLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgaWYgKCFTZWVrT0sodGlmLCByZWFkX29mZnNldCApKSB7CisgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAiJXM6IFNlZWsgZXJyb3IgYWNjZXNzaW5nIFRJRkYgZGlyZWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX25hbWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIVdyaXRlT0sodGlmLCBkaXJlbnRyeV9yYXcsZGlyc2l6ZSkpCisgICAgeworICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgIiVzOiBDYW4gbm90IHdyaXRlIFRJRkYgZGlyZWN0b3J5IGVudHJ5LiIsCisgICAgICAgICAgICAgICAgICAgICB0aWYtPnRpZl9uYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIHJldHVybiAxOworfQorLyogdmltOiBzZXQgdHM9OCBzdHM9OCBzdz04IG5vZXQ6ICovCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9kdW1wbW9kZS5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZHVtcG1vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTRjZjBiCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZHVtcG1vZGUuYwpAQCAtMCwwICsxLDE0MyBAQAorLyogJEhlYWRlcjogL2N2cy9tYXB0b29scy9jdnNyb290L2xpYnRpZmYvbGlidGlmZi90aWZfZHVtcG1vZGUuYyx2IDEuMTQgMjAxMS0wNC0wMiAyMDo1NDowOSBiZnJpZXNlbiBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCAKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgorICogU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcy4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSAKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTQU0gTEVGRkxFUiBPUiBTSUxJQ09OIEdSQVBISUNTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgKiBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgKiBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GIAorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSAKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRJRkYgTGlicmFyeS4KKyAqCisgKiAiTnVsbCIgQ29tcHJlc3Npb24gQWxnb3JpdGhtIFN1cHBvcnQuCisgKi8KKyNpbmNsdWRlICJ0aWZmaW9wLmgiCisKK3N0YXRpYyBpbnQKK0R1bXBGaXh1cFRhZ3MoVElGRiogdGlmKQoreworCSh2b2lkKSB0aWY7CisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIEVuY29kZSBhIGh1bmsgb2YgcGl4ZWxzLgorICovCitzdGF0aWMgaW50CitEdW1wTW9kZUVuY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBwcCwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKQoreworCSh2b2lkKSBzOworCXdoaWxlIChjYyA+IDApIHsKKwkJdG1zaXplX3QgbjsKKworCQluID0gY2M7CisJCWlmICh0aWYtPnRpZl9yYXdjYyArIG4gPiB0aWYtPnRpZl9yYXdkYXRhc2l6ZSkKKwkJCW4gPSB0aWYtPnRpZl9yYXdkYXRhc2l6ZSAtIHRpZi0+dGlmX3Jhd2NjOworCisJCWFzc2VydCggbiA+IDAgKTsKKworCQkvKgorCQkgKiBBdm9pZCBjb3B5IGlmIGNsaWVudCBoYXMgc2V0dXAgcmF3CisJCSAqIGRhdGEgYnVmZmVyIHRvIGF2b2lkIGV4dHJhIGNvcHkuCisJCSAqLworCQlpZiAodGlmLT50aWZfcmF3Y3AgIT0gcHApCisJCQlfVElGRm1lbWNweSh0aWYtPnRpZl9yYXdjcCwgcHAsIG4pOworCQl0aWYtPnRpZl9yYXdjcCArPSBuOworCQl0aWYtPnRpZl9yYXdjYyArPSBuOworCQlwcCArPSBuOworCQljYyAtPSBuOworCQlpZiAodGlmLT50aWZfcmF3Y2MgPj0gdGlmLT50aWZfcmF3ZGF0YXNpemUgJiYKKwkJICAgICFUSUZGRmx1c2hEYXRhMSh0aWYpKQorCQkJcmV0dXJuICgtMSk7CisJfQorCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBEZWNvZGUgYSBodW5rIG9mIHBpeGVscy4KKyAqLworc3RhdGljIGludAorRHVtcE1vZGVEZWNvZGUoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBjYywgdWludDE2IHMpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiRHVtcE1vZGVEZWNvZGUiOworCSh2b2lkKSBzOworCWlmICh0aWYtPnRpZl9yYXdjYyA8IGNjKSB7CisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKyJOb3QgZW5vdWdoIGRhdGEgZm9yIHNjYW5saW5lICVsdSwgZXhwZWN0ZWQgYSByZXF1ZXN0IGZvciBhdCBtb3N0ICVJNjRkIGJ5dGVzLCBnb3QgYSByZXF1ZXN0IGZvciAlSTY0ZCBieXRlcyIsCisJCSAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgdGlmLT50aWZfcm93LAorCQkgICAgICAgICAgICAgKHNpZ25lZCBfX2ludDY0KSB0aWYtPnRpZl9yYXdjYywKKwkJICAgICAgICAgICAgIChzaWduZWQgX19pbnQ2NCkgY2MpOworI2Vsc2UKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKyJOb3QgZW5vdWdoIGRhdGEgZm9yIHNjYW5saW5lICVsdSwgZXhwZWN0ZWQgYSByZXF1ZXN0IGZvciBhdCBtb3N0ICVsbGQgYnl0ZXMsIGdvdCBhIHJlcXVlc3QgZm9yICVsbGQgYnl0ZXMiLAorCQkgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX3JvdywKKwkJICAgICAgICAgICAgIChzaWduZWQgbG9uZyBsb25nKSB0aWYtPnRpZl9yYXdjYywKKwkJICAgICAgICAgICAgIChzaWduZWQgbG9uZyBsb25nKSBjYyk7CisjZW5kaWYKKwkJcmV0dXJuICgwKTsKKwl9CisJLyoKKwkgKiBBdm9pZCBjb3B5IGlmIGNsaWVudCBoYXMgc2V0dXAgcmF3CisJICogZGF0YSBidWZmZXIgdG8gYXZvaWQgZXh0cmEgY29weS4KKwkgKi8KKwlpZiAodGlmLT50aWZfcmF3Y3AgIT0gYnVmKQorCQlfVElGRm1lbWNweShidWYsIHRpZi0+dGlmX3Jhd2NwLCBjYyk7CisJdGlmLT50aWZfcmF3Y3AgKz0gY2M7CisJdGlmLT50aWZfcmF3Y2MgLT0gY2M7ICAKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogU2VlayBmb3J3YXJkcyBucm93cyBpbiB0aGUgY3VycmVudCBzdHJpcC4KKyAqLworc3RhdGljIGludAorRHVtcE1vZGVTZWVrKFRJRkYqIHRpZiwgdWludDMyIG5yb3dzKQoreworCXRpZi0+dGlmX3Jhd2NwICs9IG5yb3dzICogdGlmLT50aWZfc2NhbmxpbmVzaXplOworCXRpZi0+dGlmX3Jhd2NjIC09IG5yb3dzICogdGlmLT50aWZfc2NhbmxpbmVzaXplOworCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGR1bXAgbW9kZS4KKyAqLworaW50CitUSUZGSW5pdER1bXBNb2RlKFRJRkYqIHRpZiwgaW50IHNjaGVtZSkKK3sKKwkodm9pZCkgc2NoZW1lOworCXRpZi0+dGlmX2ZpeHVwdGFncyA9IER1bXBGaXh1cFRhZ3M7ICAKKwl0aWYtPnRpZl9kZWNvZGVyb3cgPSBEdW1wTW9kZURlY29kZTsKKwl0aWYtPnRpZl9kZWNvZGVzdHJpcCA9IER1bXBNb2RlRGVjb2RlOworCXRpZi0+dGlmX2RlY29kZXRpbGUgPSBEdW1wTW9kZURlY29kZTsKKwl0aWYtPnRpZl9lbmNvZGVyb3cgPSBEdW1wTW9kZUVuY29kZTsKKwl0aWYtPnRpZl9lbmNvZGVzdHJpcCA9IER1bXBNb2RlRW5jb2RlOworCXRpZi0+dGlmX2VuY29kZXRpbGUgPSBEdW1wTW9kZUVuY29kZTsgCisJdGlmLT50aWZfc2VlayA9IER1bXBNb2RlU2VlazsKKwlyZXR1cm4gKDEpOworfQorLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZXJyb3IuYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2Vycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJjOGI4NwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2Vycm9yLmMKQEAgLTAsMCArMSw4MCBAQAorLyogJEhlYWRlcjogL2N2cy9tYXB0b29scy9jdnNyb290L2xpYnRpZmYvbGlidGlmZi90aWZfZXJyb3IuYyx2IDEuNSAyMDEwLTAzLTEwIDE4OjU2OjQ4IGJmcmllc2VuIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVElGRiBMaWJyYXJ5LgorICovCisjaW5jbHVkZSAidGlmZmlvcC5oIgorCitUSUZGRXJyb3JIYW5kbGVyRXh0IF9USUZGZXJyb3JIYW5kbGVyRXh0ID0gTlVMTDsKKworVElGRkVycm9ySGFuZGxlcgorVElGRlNldEVycm9ySGFuZGxlcihUSUZGRXJyb3JIYW5kbGVyIGhhbmRsZXIpCit7CisJVElGRkVycm9ySGFuZGxlciBwcmV2ID0gX1RJRkZlcnJvckhhbmRsZXI7CisJX1RJRkZlcnJvckhhbmRsZXIgPSBoYW5kbGVyOworCXJldHVybiAocHJldik7Cit9CisKK1RJRkZFcnJvckhhbmRsZXJFeHQKK1RJRkZTZXRFcnJvckhhbmRsZXJFeHQoVElGRkVycm9ySGFuZGxlckV4dCBoYW5kbGVyKQoreworCVRJRkZFcnJvckhhbmRsZXJFeHQgcHJldiA9IF9USUZGZXJyb3JIYW5kbGVyRXh0OworCV9USUZGZXJyb3JIYW5kbGVyRXh0ID0gaGFuZGxlcjsKKwlyZXR1cm4gKHByZXYpOworfQorCit2b2lkCitUSUZGRXJyb3IoY29uc3QgY2hhciogbW9kdWxlLCBjb25zdCBjaGFyKiBmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCWlmIChfVElGRmVycm9ySGFuZGxlcikKKwkJKCpfVElGRmVycm9ySGFuZGxlcikobW9kdWxlLCBmbXQsIGFwKTsKKwlpZiAoX1RJRkZlcnJvckhhbmRsZXJFeHQpCisJCSgqX1RJRkZlcnJvckhhbmRsZXJFeHQpKDAsIG1vZHVsZSwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKK30KKwordm9pZAorVElGRkVycm9yRXh0KHRoYW5kbGVfdCBmZCwgY29uc3QgY2hhciogbW9kdWxlLCBjb25zdCBjaGFyKiBmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCWlmIChfVElGRmVycm9ySGFuZGxlcikKKwkJKCpfVElGRmVycm9ySGFuZGxlcikobW9kdWxlLCBmbXQsIGFwKTsKKwlpZiAoX1RJRkZlcnJvckhhbmRsZXJFeHQpCisJCSgqX1RJRkZlcnJvckhhbmRsZXJFeHQpKGZkLCBtb2R1bGUsIGZtdCwgYXApOworCXZhX2VuZChhcCk7Cit9CisKKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBjCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogZmlsbC1jb2x1bW46IDc4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2V4dGVuc2lvbi5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZXh0ZW5zaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBhZmQ0MQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2V4dGVuc2lvbi5jCkBAIC0wLDAgKzEsMTE4IEBACisvKiAkSGVhZGVyOiAvY3ZzL21hcHRvb2xzL2N2c3Jvb3QvbGlidGlmZi9saWJ0aWZmL3RpZl9leHRlbnNpb24uYyx2IDEuNyAyMDEwLTAzLTEwIDE4OjU2OjQ4IGJmcmllc2VuIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVElGRiBMaWJyYXJ5LgorICoKKyAqIFZhcmlvdXMgcm91dGluZXMgc3VwcG9ydCBleHRlcm5hbCBleHRlbnNpb24gb2YgdGhlIHRhZyBzZXQsIGFuZCBvdGhlcgorICogYXBwbGljYXRpb24gZXh0ZW5zaW9uIGNhcGFiaWxpdGllcy4gCisgKi8KKworI2luY2x1ZGUgInRpZmZpb3AuaCIKKworaW50IFRJRkZHZXRUYWdMaXN0Q291bnQoIFRJRkYgKnRpZiApCisKK3sKKyAgICBUSUZGRGlyZWN0b3J5KiB0ZCA9ICZ0aWYtPnRpZl9kaXI7CisgICAgCisgICAgcmV0dXJuIHRkLT50ZF9jdXN0b21WYWx1ZUNvdW50OworfQorCit1aW50MzIgVElGRkdldFRhZ0xpc3RFbnRyeSggVElGRiAqdGlmLCBpbnQgdGFnX2luZGV4ICkKKworeworICAgIFRJRkZEaXJlY3RvcnkqIHRkID0gJnRpZi0+dGlmX2RpcjsKKworICAgIGlmKCB0YWdfaW5kZXggPCAwIHx8IHRhZ19pbmRleCA+PSB0ZC0+dGRfY3VzdG9tVmFsdWVDb3VudCApCisgICAgICAgIHJldHVybiAodWludDMyKSgtMSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gdGQtPnRkX2N1c3RvbVZhbHVlc1t0YWdfaW5kZXhdLmluZm8tPmZpZWxkX3RhZzsKK30KKworLyoKKyoqIFRoaXMgcHJvdmlkZXMgcmVhZC93cml0ZSBhY2Nlc3MgdG8gdGhlIFRJRkZUYWdNZXRob2RzIHdpdGhpbiB0aGUgVElGRgorKiogc3RydWN0dXJlIHRvIGFwcGxpY2F0aW9uIGNvZGUgd2l0aG91dCBnaXZpbmcgYWNjZXNzIHRvIHRoZSBwcml2YXRlCisqKiBUSUZGIHN0cnVjdHVyZS4KKyovCitUSUZGVGFnTWV0aG9kcyAqVElGRkFjY2Vzc1RhZ01ldGhvZHMoIFRJRkYgKnRpZiApCisKK3sKKyAgICByZXR1cm4gJih0aWYtPnRpZl90YWdtZXRob2RzKTsKK30KKwordm9pZCAqVElGRkdldENsaWVudEluZm8oIFRJRkYgKnRpZiwgY29uc3QgY2hhciAqbmFtZSApCisKK3sKKyAgICBUSUZGQ2xpZW50SW5mb0xpbmsgKmxpbmsgPSB0aWYtPnRpZl9jbGllbnRpbmZvOworCisgICAgd2hpbGUoIGxpbmsgIT0gTlVMTCAmJiBzdHJjbXAobGluay0+bmFtZSxuYW1lKSAhPSAwICkKKyAgICAgICAgbGluayA9IGxpbmstPm5leHQ7CisKKyAgICBpZiggbGluayAhPSBOVUxMICkKKyAgICAgICAgcmV0dXJuIGxpbmstPmRhdGE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBUSUZGU2V0Q2xpZW50SW5mbyggVElGRiAqdGlmLCB2b2lkICpkYXRhLCBjb25zdCBjaGFyICpuYW1lICkKKworeworICAgIFRJRkZDbGllbnRJbmZvTGluayAqbGluayA9IHRpZi0+dGlmX2NsaWVudGluZm87CisKKyAgICAvKgorICAgICoqIERvIHdlIGhhdmUgYW4gZXhpc3RpbmcgbGluayB3aXRoIHRoaXMgbmFtZT8gIElmIHNvLCBqdXN0CisgICAgKiogc2V0IGl0LgorICAgICovCisgICAgd2hpbGUoIGxpbmsgIT0gTlVMTCAmJiBzdHJjbXAobGluay0+bmFtZSxuYW1lKSAhPSAwICkKKyAgICAgICAgbGluayA9IGxpbmstPm5leHQ7CisKKyAgICBpZiggbGluayAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIGxpbmstPmRhdGEgPSBkYXRhOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICAqKiBDcmVhdGUgYSBuZXcgbGluay4KKyAgICAqLworCisgICAgbGluayA9IChUSUZGQ2xpZW50SW5mb0xpbmsgKikgX1RJRkZtYWxsb2Moc2l6ZW9mKFRJRkZDbGllbnRJbmZvTGluaykpOworICAgIGFzc2VydCAobGluayAhPSBOVUxMKTsKKyAgICBsaW5rLT5uZXh0ID0gdGlmLT50aWZfY2xpZW50aW5mbzsKKyAgICBsaW5rLT5uYW1lID0gKGNoYXIgKikgX1RJRkZtYWxsb2MoKHRtc2l6ZV90KShzdHJsZW4obmFtZSkrMSkpOworICAgIGFzc2VydCAobGluay0+bmFtZSAhPSBOVUxMKTsKKyAgICBzdHJjcHkobGluay0+bmFtZSwgbmFtZSk7CisgICAgbGluay0+ZGF0YSA9IGRhdGE7CisKKyAgICB0aWYtPnRpZl9jbGllbnRpbmZvID0gbGluazsKK30KKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBjCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogZmlsbC1jb2x1bW46IDc4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2ZheDMuYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2ZheDMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmU3MjU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZmF4My5jCkBAIC0wLDAgKzEsMTU5NiBAQAorLyogJElkOiB0aWZfZmF4My5jLHYgMS43NSAyMDE1LTA4LTMwIDIwOjQ5OjU1IGVyb3VhdWx0IEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAidGlmZmlvcC5oIgorI2lmZGVmIENDSVRUX1NVUFBPUlQKKy8qCisgKiBUSUZGIExpYnJhcnkuCisgKgorICogQ0NJVFQgR3JvdXAgMyAoVC40KSBhbmQgR3JvdXAgNCAoVC42KSBDb21wcmVzc2lvbiBTdXBwb3J0LgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBzdXBwb3J0IGZvciBkZWNvZGluZyBhbmQgZW5jb2RpbmcgVElGRgorICogY29tcHJlc3Npb24gYWxnb3JpdGhtcyAyLCAzLCA0LCBhbmQgMzI3NzEuCisgKgorICogRGVjb2RlciBzdXBwb3J0IGlzIGRlcml2ZWQsIHdpdGggcGVybWlzc2lvbiwgZnJvbSB0aGUgY29kZQorICogaW4gRnJhbmsgQ3JpbmdsZSdzIHZpZXdmYXggcHJvZ3JhbTsKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTk1ICBGcmFuayBELiBDcmluZ2xlLgorICovCisjaW5jbHVkZSAidGlmX2ZheDMuaCIKKyNkZWZpbmUJRzNDT0RFUworI2luY2x1ZGUgInQ0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyoKKyAqIENvbXByZXNzaW9uK2RlY29tcHJlc3Npb24gc3RhdGUgYmxvY2tzIGFyZQorICogZGVyaXZlZCBmcm9tIHRoaXMgYGBiYXNlIHN0YXRlJycgYmxvY2suCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgICAgICByd19tb2RlOyAgICAgICAgICAgICAgICAvKiBPX1JET05MWSBmb3IgZGVjb2RlLCBlbHNlIGVuY29kZSAqLworCWludCAgICAgIG1vZGU7ICAgICAgICAgICAgICAgICAgIC8qIG9wZXJhdGluZyBtb2RlICovCisJdG1zaXplX3Qgcm93Ynl0ZXM7ICAgICAgICAgICAgICAgLyogYnl0ZXMgaW4gYSBkZWNvZGVkIHNjYW5saW5lICovCisJdWludDMyICAgcm93cGl4ZWxzOyAgICAgICAgICAgICAgLyogcGl4ZWxzIGluIGEgc2NhbmxpbmUgKi8KKworCXVpbnQxNiAgIGNsZWFuZmF4ZGF0YTsgICAgICAgICAgIC8qIENsZWFuRmF4RGF0YSB0YWcgKi8KKwl1aW50MzIgICBiYWRmYXhydW47ICAgICAgICAgICAgICAvKiBCYWRGYXhSdW4gdGFnICovCisJdWludDMyICAgYmFkZmF4bGluZXM7ICAgICAgICAgICAgLyogQmFkRmF4TGluZXMgdGFnICovCisJdWludDMyICAgZ3JvdXBvcHRpb25zOyAgICAgICAgICAgLyogR3JvdXAgMy80IG9wdGlvbnMgdGFnICovCisKKwlUSUZGVkdldE1ldGhvZCAgdmdldHBhcmVudDsgICAgICAvKiBzdXBlci1jbGFzcyBtZXRob2QgKi8KKwlUSUZGVlNldE1ldGhvZCAgdnNldHBhcmVudDsgICAgICAvKiBzdXBlci1jbGFzcyBtZXRob2QgKi8KKwlUSUZGUHJpbnRNZXRob2QgcHJpbnRkaXI7ICAgICAgICAvKiBzdXBlci1jbGFzcyBtZXRob2QgKi8KK30gRmF4M0Jhc2VTdGF0ZTsKKyNkZWZpbmUJRmF4M1N0YXRlKHRpZikJCSgoRmF4M0Jhc2VTdGF0ZSopICh0aWYpLT50aWZfZGF0YSkKKwordHlwZWRlZiBlbnVtIHsgRzNfMUQsIEczXzJEIH0gVHRhZzsKK3R5cGVkZWYgc3RydWN0IHsKKwlGYXgzQmFzZVN0YXRlIGI7CisKKwkvKiBEZWNvZGVyIHN0YXRlIGluZm8gKi8KKwljb25zdCB1bnNpZ25lZCBjaGFyKiBiaXRtYXA7CS8qIGJpdCByZXZlcnNhbCB0YWJsZSAqLworCXVpbnQzMglkYXRhOwkJCS8qIGN1cnJlbnQgaS9vIGJ5dGUvd29yZCAqLworCWludAliaXQ7CQkJLyogY3VycmVudCBpL28gYml0IGluIGJ5dGUgKi8KKwlpbnQJRU9MY250OwkJCS8qIGNvdW50IG9mIEVPTCBjb2RlcyByZWNvZ25pemVkICovCisJVElGRkZheEZpbGxGdW5jIGZpbGw7CQkvKiBmaWxsIHJvdXRpbmUgKi8KKwl1aW50MzIqCXJ1bnM7CQkJLyogYiZ3IHJ1bnMgZm9yIGN1cnJlbnQvcHJldmlvdXMgcm93ICovCisJdWludDMyKglyZWZydW5zOwkJLyogcnVucyBmb3IgcmVmZXJlbmNlIGxpbmUgKi8KKwl1aW50MzIqCWN1cnJ1bnM7CQkvKiBydW5zIGZvciBjdXJyZW50IGxpbmUgKi8KKworCS8qIEVuY29kZXIgc3RhdGUgaW5mbyAqLworCVR0YWcgICAgdGFnOwkJCS8qIGVuY29kaW5nIHN0YXRlICovCisJdW5zaWduZWQgY2hhcioJcmVmbGluZTsJLyogcmVmZXJlbmNlIGxpbmUgZm9yIDJkIGRlY29kaW5nICovCisJaW50CWs7CQkJLyogI3Jvd3MgbGVmdCB0aGF0IGNhbiBiZSAyZCBlbmNvZGVkICovCisJaW50CW1heGs7CQkJLyogbWF4ICNyb3dzIHRoYXQgY2FuIGJlIDJkIGVuY29kZWQgKi8KKworCWludCBsaW5lOworfSBGYXgzQ29kZWNTdGF0ZTsKKyNkZWZpbmUgRGVjb2RlclN0YXRlKHRpZikgKChGYXgzQ29kZWNTdGF0ZSopIEZheDNTdGF0ZSh0aWYpKQorI2RlZmluZSBFbmNvZGVyU3RhdGUodGlmKSAoKEZheDNDb2RlY1N0YXRlKikgRmF4M1N0YXRlKHRpZikpCisKKyNkZWZpbmUgaXMyREVuY29kaW5nKHNwKSAoc3AtPmIuZ3JvdXBvcHRpb25zICYgR1JPVVAzT1BUXzJERU5DT0RJTkcpCisjZGVmaW5lIGlzQWxpZ25lZChwLHQpICgoKChzaXplX3QpKHApKSAmIChzaXplb2YgKHQpLTEpKSA9PSAwKQorCisvKgorICogR3JvdXAgMyBhbmQgR3JvdXAgNCBEZWNvZGluZy4KKyAqLworCisvKgorICogVGhlc2UgbWFjcm9zIGdsdWUgdGhlIFRJRkYgbGlicmFyeSBzdGF0ZSB0bworICogdGhlIHN0YXRlIGV4cGVjdGVkIGJ5IEZyYW5rJ3MgZGVjb2Rlci4KKyAqLworI2RlZmluZQlERUNMQVJFX1NUQVRFKHRpZiwgc3AsIG1vZCkJCQkJCVwKKyAgICBzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9IG1vZDsJCQkJCVwKKyAgICBGYXgzQ29kZWNTdGF0ZSogc3AgPSBEZWNvZGVyU3RhdGUodGlmKTsJCQkJXAorICAgIGludCBhMDsJCQkJLyogcmVmZXJlbmNlIGVsZW1lbnQgKi8JCVwKKyAgICBpbnQgbGFzdHggPSBzcC0+Yi5yb3dwaXhlbHM7CS8qIGxhc3QgZWxlbWVudCBpbiByb3cgKi8JXAorICAgIHVpbnQzMiBCaXRBY2M7CQkJLyogYml0IGFjY3VtdWxhdG9yICovCQlcCisgICAgaW50IEJpdHNBdmFpbDsJCQkvKiAjIHZhbGlkIGJpdHMgaW4gQml0QWNjICovCVwKKyAgICBpbnQgUnVuTGVuZ3RoOwkJCS8qIGxlbmd0aCBvZiBjdXJyZW50IHJ1biAqLwlcCisgICAgdW5zaWduZWQgY2hhciogY3A7CQkJLyogbmV4dCBieXRlIG9mIGlucHV0IGRhdGEgKi8JXAorICAgIHVuc2lnbmVkIGNoYXIqIGVwOwkJCS8qIGVuZCBvZiBpbnB1dCBkYXRhICovCQlcCisgICAgdWludDMyKiBwYTsJCQkJLyogcGxhY2UgdG8gc3R1ZmYgbmV4dCBydW4gKi8JXAorICAgIHVpbnQzMiogdGhpc3J1bjsJCQkvKiBjdXJyZW50IHJvdydzIHJ1biBhcnJheSAqLwlcCisgICAgaW50IEVPTGNudDsJCQkJLyogIyBFT0wgY29kZXMgcmVjb2duaXplZCAqLwlcCisgICAgY29uc3QgdW5zaWduZWQgY2hhciogYml0bWFwID0gc3AtPmJpdG1hcDsJLyogaW5wdXQgZGF0YSBiaXQgcmV2ZXJzZXIgKi8JXAorICAgIGNvbnN0IFRJRkZGYXhUYWJFbnQqIFRhYkVudAorI2RlZmluZQlERUNMQVJFX1NUQVRFXzJEKHRpZiwgc3AsIG1vZCkJCQkJCVwKKyAgICBERUNMQVJFX1NUQVRFKHRpZiwgc3AsIG1vZCk7CQkJCQlcCisgICAgaW50IGIxOwkJCQkvKiBuZXh0IGNoYW5nZSBvbiBwcmV2IGxpbmUgKi8JXAorICAgIHVpbnQzMiogcGIJCQkJLyogbmV4dCBydW4gaW4gcmVmZXJlbmNlIGxpbmUgKi9cCisvKgorICogTG9hZCBhbnkgc3RhdGUgdGhhdCBtYXkgYmUgY2hhbmdlZCBkdXJpbmcgZGVjb2RpbmcuCisgKi8KKyNkZWZpbmUJQ0FDSEVfU1RBVEUodGlmLCBzcCkgZG8gewkJCQkJXAorICAgIEJpdEFjYyA9IHNwLT5kYXRhOwkJCQkJCQlcCisgICAgQml0c0F2YWlsID0gc3AtPmJpdDsJCQkJCQlcCisgICAgRU9MY250ID0gc3AtPkVPTGNudDsJCQkJCQlcCisgICAgY3AgPSAodW5zaWduZWQgY2hhciopIHRpZi0+dGlmX3Jhd2NwOwkJCQlcCisgICAgZXAgPSBjcCArIHRpZi0+dGlmX3Jhd2NjOwkJCQkJCVwKK30gd2hpbGUgKDApCisvKgorICogU2F2ZSBzdGF0ZSBwb3NzaWJseSBjaGFuZ2VkIGR1cmluZyBkZWNvZGluZy4KKyAqLworI2RlZmluZQlVTkNBQ0hFX1NUQVRFKHRpZiwgc3ApIGRvIHsJCQkJCVwKKyAgICBzcC0+Yml0ID0gQml0c0F2YWlsOwkJCQkJCVwKKyAgICBzcC0+ZGF0YSA9IEJpdEFjYzsJCQkJCQkJXAorICAgIHNwLT5FT0xjbnQgPSBFT0xjbnQ7CQkJCQkJXAorICAgIHRpZi0+dGlmX3Jhd2NjIC09ICh0bXNpemVfdCkoKHVpbnQ4KikgY3AgLSB0aWYtPnRpZl9yYXdjcCk7CQlcCisgICAgdGlmLT50aWZfcmF3Y3AgPSAodWludDgqKSBjcDsJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBTZXR1cCBzdGF0ZSBmb3IgZGVjb2RpbmcgYSBzdHJpcC4KKyAqLworc3RhdGljIGludAorRmF4M1ByZURlY29kZShUSUZGKiB0aWYsIHVpbnQxNiBzKQoreworCUZheDNDb2RlY1N0YXRlKiBzcCA9IERlY29kZXJTdGF0ZSh0aWYpOworCisJKHZvaWQpIHM7CisJYXNzZXJ0KHNwICE9IE5VTEwpOworCXNwLT5iaXQgPSAwOwkJCS8qIGZvcmNlIGluaXRpYWwgcmVhZCAqLworCXNwLT5kYXRhID0gMDsKKwlzcC0+RU9MY250ID0gMDsJCQkvKiBmb3JjZSBpbml0aWFsIHNjYW4gZm9yIEVPTCAqLworCS8qCisJICogRGVjb2RlciBhc3N1bWVzIGxzYi10by1tc2IgYml0IG9yZGVyLiAgTm90ZSB0aGF0IHdlIHNlbGVjdAorCSAqIHRoaXMgaGVyZSByYXRoZXIgdGhhbiBpbiBGYXgzU2V0dXBTdGF0ZSBzbyB0aGF0IHZpZXdlcnMgY2FuCisJICogaG9sZCB0aGUgaW1hZ2Ugb3BlbiwgZmlkZGxlIHdpdGggdGhlIEZpbGxPcmRlciB0YWcgdmFsdWUsCisJICogYW5kIHRoZW4gcmUtZGVjb2RlIHRoZSBpbWFnZS4gIE90aGVyd2lzZSB0aGV5J2QgbmVlZCB0byBjbG9zZQorCSAqIGFuZCBvcGVuIHRoZSBpbWFnZSB0byBnZXQgdGhlIHN0YXRlIHJlc2V0LgorCSAqLworCXNwLT5iaXRtYXAgPQorCSAgICBUSUZGR2V0Qml0UmV2VGFibGUodGlmLT50aWZfZGlyLnRkX2ZpbGxvcmRlciAhPSBGSUxMT1JERVJfTFNCMk1TQik7CisJaWYgKHNwLT5yZWZydW5zKSB7CQkvKiBpbml0IHJlZmVyZW5jZSBsaW5lIHRvIHdoaXRlICovCisJCXNwLT5yZWZydW5zWzBdID0gKHVpbnQzMikgc3AtPmIucm93cGl4ZWxzOworCQlzcC0+cmVmcnVuc1sxXSA9IDA7CisJfQorCXNwLT5saW5lID0gMDsKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogUm91dGluZSBmb3IgaGFuZGxpbmcgdmFyaW91cyBlcnJvcnMvY29uZGl0aW9ucy4KKyAqIE5vdGUgaG93IHRoZXkgYXJlICJnbHVlZCBpbnRvIHRoZSBkZWNvZGVyIiBieQorICogb3ZlcnJpZGluZyB0aGUgZGVmaW5pdGlvbnMgdXNlZCBieSB0aGUgZGVjb2Rlci4KKyAqLworCitzdGF0aWMgdm9pZAorRmF4M1VuZXhwZWN0ZWQoY29uc3QgY2hhciogbW9kdWxlLCBUSUZGKiB0aWYsIHVpbnQzMiBsaW5lLCB1aW50MzIgYTApCit7CisJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIkJhZCBjb2RlIHdvcmQgYXQgbGluZSAldSBvZiAlcyAldSAoeCAldSkiLAorCSAgICBsaW5lLCBpc1RpbGVkKHRpZikgPyAidGlsZSIgOiAic3RyaXAiLAorCSAgICAoaXNUaWxlZCh0aWYpID8gdGlmLT50aWZfY3VydGlsZSA6IHRpZi0+dGlmX2N1cnN0cmlwKSwKKwkgICAgYTApOworfQorI2RlZmluZQl1bmV4cGVjdGVkKHRhYmxlLCBhMCkJRmF4M1VuZXhwZWN0ZWQobW9kdWxlLCB0aWYsIHNwLT5saW5lLCBhMCkKKworc3RhdGljIHZvaWQKK0ZheDNFeHRlbnNpb24oY29uc3QgY2hhciogbW9kdWxlLCBUSUZGKiB0aWYsIHVpbnQzMiBsaW5lLCB1aW50MzIgYTApCit7CisJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkgICAgIlVuY29tcHJlc3NlZCBkYXRhIChub3Qgc3VwcG9ydGVkKSBhdCBsaW5lICV1IG9mICVzICV1ICh4ICV1KSIsCisJICAgIGxpbmUsIGlzVGlsZWQodGlmKSA/ICJ0aWxlIiA6ICJzdHJpcCIsCisJICAgIChpc1RpbGVkKHRpZikgPyB0aWYtPnRpZl9jdXJ0aWxlIDogdGlmLT50aWZfY3Vyc3RyaXApLAorCSAgICBhMCk7Cit9CisjZGVmaW5lCWV4dGVuc2lvbihhMCkJRmF4M0V4dGVuc2lvbihtb2R1bGUsIHRpZiwgc3AtPmxpbmUsIGEwKQorCitzdGF0aWMgdm9pZAorRmF4M0JhZExlbmd0aChjb25zdCBjaGFyKiBtb2R1bGUsIFRJRkYqIHRpZiwgdWludDMyIGxpbmUsIHVpbnQzMiBhMCwgdWludDMyIGxhc3R4KQoreworCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIiVzIGF0IGxpbmUgJXUgb2YgJXMgJXUgKGdvdCAldSwgZXhwZWN0ZWQgJXUpIiwKKwkgICAgYTAgPCBsYXN0eCA/ICJQcmVtYXR1cmUgRU9MIiA6ICJMaW5lIGxlbmd0aCBtaXNtYXRjaCIsCisJICAgIGxpbmUsIGlzVGlsZWQodGlmKSA/ICJ0aWxlIiA6ICJzdHJpcCIsCisJICAgIChpc1RpbGVkKHRpZikgPyB0aWYtPnRpZl9jdXJ0aWxlIDogdGlmLT50aWZfY3Vyc3RyaXApLAorCSAgICBhMCwgbGFzdHgpOworfQorI2RlZmluZQliYWRsZW5ndGgoYTAsbGFzdHgpCUZheDNCYWRMZW5ndGgobW9kdWxlLCB0aWYsIHNwLT5saW5lLCBhMCwgbGFzdHgpCisKK3N0YXRpYyB2b2lkCitGYXgzUHJlbWF0dXJlRU9GKGNvbnN0IGNoYXIqIG1vZHVsZSwgVElGRiogdGlmLCB1aW50MzIgbGluZSwgdWludDMyIGEwKQoreworCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIlByZW1hdHVyZSBFT0YgYXQgbGluZSAldSBvZiAlcyAldSAoeCAldSkiLAorCSAgICBsaW5lLCBpc1RpbGVkKHRpZikgPyAidGlsZSIgOiAic3RyaXAiLAorCSAgICAoaXNUaWxlZCh0aWYpID8gdGlmLT50aWZfY3VydGlsZSA6IHRpZi0+dGlmX2N1cnN0cmlwKSwKKwkgICAgYTApOworfQorI2RlZmluZQlwcmVtYXR1cmVFT0YoYTApCUZheDNQcmVtYXR1cmVFT0YobW9kdWxlLCB0aWYsIHNwLT5saW5lLCBhMCkKKworI2RlZmluZQlOb3AKKworLyoKKyAqIERlY29kZSB0aGUgcmVxdWVzdGVkIGFtb3VudCBvZiBHMyAxRC1lbmNvZGVkIGRhdGEuCisgKi8KK3N0YXRpYyBpbnQKK0ZheDNEZWNvZGUxRChUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IG9jYywgdWludDE2IHMpCit7CisJREVDTEFSRV9TVEFURSh0aWYsIHNwLCAiRmF4M0RlY29kZTFEIik7CisJKHZvaWQpIHM7CisJaWYgKG9jYyAlIHNwLT5iLnJvd2J5dGVzKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIkZyYWN0aW9uYWwgc2NhbmxpbmVzIGNhbm5vdCBiZSByZWFkIik7CisJCXJldHVybiAoLTEpOworCX0KKwlDQUNIRV9TVEFURSh0aWYsIHNwKTsKKwl0aGlzcnVuID0gc3AtPmN1cnJ1bnM7CisJd2hpbGUgKG9jYyA+IDApIHsKKwkJYTAgPSAwOworCQlSdW5MZW5ndGggPSAwOworCQlwYSA9IHRoaXNydW47CisjaWZkZWYgRkFYM19ERUJVRworCQlwcmludGYoIlxuQml0QWNjPSUwOFgsIEJpdHNBdmFpbCA9ICVkXG4iLCBCaXRBY2MsIEJpdHNBdmFpbCk7CisJCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0gJWRcbiIsIHRpZi0+dGlmX3Jvdyk7CisJCWZmbHVzaChzdGRvdXQpOworI2VuZGlmCisJCVNZTkNfRU9MKEVPRjFEKTsKKwkJRVhQQU5EMUQoRU9GMURhKTsKKwkJKCpzcC0+ZmlsbCkoYnVmLCB0aGlzcnVuLCBwYSwgbGFzdHgpOworCQlidWYgKz0gc3AtPmIucm93Ynl0ZXM7CisJCW9jYyAtPSBzcC0+Yi5yb3dieXRlczsKKwkJc3AtPmxpbmUrKzsKKwkJY29udGludWU7CisJRU9GMUQ6CQkJCS8qIHByZW1hdHVyZSBFT0YgKi8KKwkJQ0xFQU5VUF9SVU5TKCk7CisJRU9GMURhOgkJCQkvKiBwcmVtYXR1cmUgRU9GICovCisJCSgqc3AtPmZpbGwpKGJ1ZiwgdGhpc3J1biwgcGEsIGxhc3R4KTsKKwkJVU5DQUNIRV9TVEFURSh0aWYsIHNwKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCVVOQ0FDSEVfU1RBVEUodGlmLCBzcCk7CisJcmV0dXJuICgxKTsKK30KKworI2RlZmluZQlTV0FQKHQsYSxiKQl7IHQgeDsgeCA9IChhKTsgKGEpID0gKGIpOyAoYikgPSB4OyB9CisvKgorICogRGVjb2RlIHRoZSByZXF1ZXN0ZWQgYW1vdW50IG9mIEczIDJELWVuY29kZWQgZGF0YS4KKyAqLworc3RhdGljIGludAorRmF4M0RlY29kZTJEKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3Qgb2NjLCB1aW50MTYgcykKK3sKKwlERUNMQVJFX1NUQVRFXzJEKHRpZiwgc3AsICJGYXgzRGVjb2RlMkQiKTsKKwlpbnQgaXMxRDsJCQkvKiBjdXJyZW50IGxpbmUgaXMgMWQvMmQtZW5jb2RlZCAqLworCSh2b2lkKSBzOworCWlmIChvY2MgJSBzcC0+Yi5yb3dieXRlcykKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJGcmFjdGlvbmFsIHNjYW5saW5lcyBjYW5ub3QgYmUgcmVhZCIpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJQ0FDSEVfU1RBVEUodGlmLCBzcCk7CisJd2hpbGUgKG9jYyA+IDApIHsKKwkJYTAgPSAwOworCQlSdW5MZW5ndGggPSAwOworCQlwYSA9IHRoaXNydW4gPSBzcC0+Y3VycnVuczsKKyNpZmRlZiBGQVgzX0RFQlVHCisJCXByaW50ZigiXG5CaXRBY2M9JTA4WCwgQml0c0F2YWlsID0gJWQgRU9MY250ID0gJWQiLAorCQkgICAgQml0QWNjLCBCaXRzQXZhaWwsIEVPTGNudCk7CisjZW5kaWYKKwkJU1lOQ19FT0woRU9GMkQpOworCQlOZWVkQml0czgoMSwgRU9GMkQpOworCQlpczFEID0gR2V0Qml0cygxKTsJLyogMUQvMkQtZW5jb2RpbmcgdGFnIGJpdCAqLworCQlDbHJCaXRzKDEpOworI2lmZGVmIEZBWDNfREVCVUcKKwkJcHJpbnRmKCIgJXNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tICVkXG4iLAorCQkgICAgaXMxRCA/ICIxRCIgOiAiMkQiLCB0aWYtPnRpZl9yb3cpOworCQlmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorCQlwYiA9IHNwLT5yZWZydW5zOworCQliMSA9ICpwYisrOworCQlpZiAoaXMxRCkKKwkJCUVYUEFORDFEKEVPRjJEYSk7CisJCWVsc2UKKwkJCUVYUEFORDJEKEVPRjJEYSk7CisJCSgqc3AtPmZpbGwpKGJ1ZiwgdGhpc3J1biwgcGEsIGxhc3R4KTsKKwkJU0VUVkFMVUUoMCk7CQkvKiBpbWFnaW5hcnkgY2hhbmdlIGZvciByZWZlcmVuY2UgKi8KKwkJU1dBUCh1aW50MzIqLCBzcC0+Y3VycnVucywgc3AtPnJlZnJ1bnMpOworCQlidWYgKz0gc3AtPmIucm93Ynl0ZXM7CisJCW9jYyAtPSBzcC0+Yi5yb3dieXRlczsKKwkJc3AtPmxpbmUrKzsKKwkJY29udGludWU7CisJRU9GMkQ6CQkJCS8qIHByZW1hdHVyZSBFT0YgKi8KKwkJQ0xFQU5VUF9SVU5TKCk7CisJRU9GMkRhOgkJCQkvKiBwcmVtYXR1cmUgRU9GICovCisJCSgqc3AtPmZpbGwpKGJ1ZiwgdGhpc3J1biwgcGEsIGxhc3R4KTsKKwkJVU5DQUNIRV9TVEFURSh0aWYsIHNwKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCVVOQ0FDSEVfU1RBVEUodGlmLCBzcCk7CisJcmV0dXJuICgxKTsKK30KKyN1bmRlZiBTV0FQCisKKy8qCisgKiBUaGUgWkVSTyAmIEZJTEwgbWFjcm9zIG11c3QgaGFuZGxlIHNwYW5zIDwgMipzaXplb2YobG9uZykgYnl0ZXMuCisgKiBGb3IgbWFjaGluZXMgd2l0aCA2NC1iaXQgbG9uZ3MgdGhpcyBpcyA8MTYgYnl0ZXM7IG90aGVyd2lzZQorICogdGhpcyBpcyA8OCBieXRlcy4gIFdlIG9wdGltaXplIHRoZSBjb2RlIGhlcmUgdG8gcmVmbGVjdCB0aGUKKyAqIG1hY2hpbmUgY2hhcmFjdGVyaXN0aWNzLgorICovCisjaWYgU0laRU9GX1VOU0lHTkVEX0xPTkcgPT0gOAorIyBkZWZpbmUgRklMTChuLCBjcCkJCQkJCQkJICAgIFwKKyAgICBzd2l0Y2ggKG4pIHsJCQkJCQkJICAgIFwKKyAgICBjYXNlIDE1OihjcClbMTRdID0gMHhmZjsgY2FzZSAxNDooY3ApWzEzXSA9IDB4ZmY7IGNhc2UgMTM6IChjcClbMTJdID0gMHhmZjtcCisgICAgY2FzZSAxMjooY3ApWzExXSA9IDB4ZmY7IGNhc2UgMTE6KGNwKVsxMF0gPSAweGZmOyBjYXNlIDEwOiAoY3ApWzldID0gMHhmZjtcCisgICAgY2FzZSAgOTogKGNwKVs4XSA9IDB4ZmY7IGNhc2UgIDg6IChjcClbN10gPSAweGZmOyBjYXNlICA3OiAoY3ApWzZdID0gMHhmZjtcCisgICAgY2FzZSAgNjogKGNwKVs1XSA9IDB4ZmY7IGNhc2UgIDU6IChjcClbNF0gPSAweGZmOyBjYXNlICA0OiAoY3ApWzNdID0gMHhmZjtcCisgICAgY2FzZSAgMzogKGNwKVsyXSA9IDB4ZmY7IGNhc2UgIDI6IChjcClbMV0gPSAweGZmOwkJCSAgICAgIFwKKyAgICBjYXNlICAxOiAoY3ApWzBdID0gMHhmZjsgKGNwKSArPSAobik7IGNhc2UgMDogIDsJCQkgICAgICBcCisgICAgfQorIyBkZWZpbmUgWkVSTyhuLCBjcCkJCQkJCQkJXAorICAgIHN3aXRjaCAobikgewkJCQkJCQlcCisgICAgY2FzZSAxNTooY3ApWzE0XSA9IDA7IGNhc2UgMTQ6KGNwKVsxM10gPSAwOyBjYXNlIDEzOiAoY3ApWzEyXSA9IDA7CVwKKyAgICBjYXNlIDEyOihjcClbMTFdID0gMDsgY2FzZSAxMTooY3ApWzEwXSA9IDA7IGNhc2UgMTA6IChjcClbOV0gPSAwOwlcCisgICAgY2FzZSAgOTogKGNwKVs4XSA9IDA7IGNhc2UgIDg6IChjcClbN10gPSAwOyBjYXNlICA3OiAoY3ApWzZdID0gMDsJXAorICAgIGNhc2UgIDY6IChjcClbNV0gPSAwOyBjYXNlICA1OiAoY3ApWzRdID0gMDsgY2FzZSAgNDogKGNwKVszXSA9IDA7CVwKKyAgICBjYXNlICAzOiAoY3ApWzJdID0gMDsgY2FzZSAgMjogKGNwKVsxXSA9IDA7CQkJCVwKKyAgICBjYXNlICAxOiAoY3ApWzBdID0gMDsgKGNwKSArPSAobik7IGNhc2UgMDogIDsJCQlcCisgICAgfQorI2Vsc2UKKyMgZGVmaW5lIEZJTEwobiwgY3ApCQkJCQkJCSAgICBcCisgICAgc3dpdGNoIChuKSB7CQkJCQkJCSAgICBcCisgICAgY2FzZSA3OiAoY3ApWzZdID0gMHhmZjsgY2FzZSA2OiAoY3ApWzVdID0gMHhmZjsgY2FzZSA1OiAoY3ApWzRdID0gMHhmZjsgXAorICAgIGNhc2UgNDogKGNwKVszXSA9IDB4ZmY7IGNhc2UgMzogKGNwKVsyXSA9IDB4ZmY7IGNhc2UgMjogKGNwKVsxXSA9IDB4ZmY7IFwKKyAgICBjYXNlIDE6IChjcClbMF0gPSAweGZmOyAoY3ApICs9IChuKTsgY2FzZSAwOiAgOwkJCSAgICBcCisgICAgfQorIyBkZWZpbmUgWkVSTyhuLCBjcCkJCQkJCQkJXAorICAgIHN3aXRjaCAobikgewkJCQkJCQlcCisgICAgY2FzZSA3OiAoY3ApWzZdID0gMDsgY2FzZSA2OiAoY3ApWzVdID0gMDsgY2FzZSA1OiAoY3ApWzRdID0gMDsJXAorICAgIGNhc2UgNDogKGNwKVszXSA9IDA7IGNhc2UgMzogKGNwKVsyXSA9IDA7IGNhc2UgMjogKGNwKVsxXSA9IDA7CVwKKyAgICBjYXNlIDE6IChjcClbMF0gPSAwOyAoY3ApICs9IChuKTsgY2FzZSAwOiAgOwkJCVwKKyAgICB9CisjZW5kaWYKKworLyoKKyAqIEJpdC1maWxsIGEgcm93IGFjY29yZGluZyB0byB0aGUgd2hpdGUvYmxhY2sKKyAqIHJ1bnMgZ2VuZXJhdGVkIGR1cmluZyBHMy9HNCBkZWNvZGluZy4KKyAqLwordm9pZAorX1RJRkZGYXgzZmlsbHJ1bnModW5zaWduZWQgY2hhciogYnVmLCB1aW50MzIqIHJ1bnMsIHVpbnQzMiogZXJ1biwgdWludDMyIGxhc3R4KQoreworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIF9maWxsbWFza3NbXSA9CisJICAgIHsgMHgwMCwgMHg4MCwgMHhjMCwgMHhlMCwgMHhmMCwgMHhmOCwgMHhmYywgMHhmZSwgMHhmZiB9OworCXVuc2lnbmVkIGNoYXIqIGNwOworCXVpbnQzMiB4LCBieCwgcnVuOworCWludDMyIG4sIG53OworCWxvbmcqIGxwOworCisJaWYgKChlcnVuLXJ1bnMpJjEpCisJICAgICplcnVuKysgPSAwOworCXggPSAwOworCWZvciAoOyBydW5zIDwgZXJ1bjsgcnVucyArPSAyKSB7CisJICAgIHJ1biA9IHJ1bnNbMF07CisJICAgIGlmICh4K3J1biA+IGxhc3R4IHx8IHJ1biA+IGxhc3R4ICkKKwkJcnVuID0gcnVuc1swXSA9ICh1aW50MzIpIChsYXN0eCAtIHgpOworCSAgICBpZiAocnVuKSB7CisJCWNwID0gYnVmICsgKHg+PjMpOworCQlieCA9IHgmNzsKKwkJaWYgKHJ1biA+IDgtYngpIHsKKwkJICAgIGlmIChieCkgewkJCS8qIGFsaWduIHRvIGJ5dGUgYm91bmRhcnkgKi8KKwkJCSpjcCsrICY9IDB4ZmYgPDwgKDgtYngpOworCQkJcnVuIC09IDgtYng7CisJCSAgICB9CisJCSAgICBpZiggKG4gPSBydW4gPj4gMykgIT0gMCApIHsJLyogbXVsdGlwbGUgYnl0ZXMgdG8gZmlsbCAqLworCQkJaWYgKChuL3NpemVvZiAobG9uZykpID4gMSkgeworCQkJICAgIC8qCisJCQkgICAgICogQWxpZ24gdG8gbG9uZ3dvcmQgYm91bmRhcnkgYW5kIGZpbGwuCisJCQkgICAgICovCisJCQkgICAgZm9yICg7IG4gJiYgIWlzQWxpZ25lZChjcCwgbG9uZyk7IG4tLSkKKwkJCQkgICAgKmNwKysgPSAweDAwOworCQkJICAgIGxwID0gKGxvbmcqKSBjcDsKKwkJCSAgICBudyA9IChpbnQzMikobiAvIHNpemVvZiAobG9uZykpOworCQkJICAgIG4gLT0gbncgKiBzaXplb2YgKGxvbmcpOworCQkJICAgIGRvIHsKKwkJCQkgICAgKmxwKysgPSAwTDsKKwkJCSAgICB9IHdoaWxlICgtLW53KTsKKwkJCSAgICBjcCA9ICh1bnNpZ25lZCBjaGFyKikgbHA7CisJCQl9CisJCQlaRVJPKG4sIGNwKTsKKwkJCXJ1biAmPSA3OworCQkgICAgfQorCQkgICAgaWYgKHJ1bikKKwkJCWNwWzBdICY9IDB4ZmYgPj4gcnVuOworCQl9IGVsc2UKKwkJICAgIGNwWzBdICY9IH4oX2ZpbGxtYXNrc1tydW5dPj5ieCk7CisJCXggKz0gcnVuc1swXTsKKwkgICAgfQorCSAgICBydW4gPSBydW5zWzFdOworCSAgICBpZiAoeCtydW4gPiBsYXN0eCB8fCBydW4gPiBsYXN0eCApCisJCXJ1biA9IHJ1bnNbMV0gPSBsYXN0eCAtIHg7CisJICAgIGlmIChydW4pIHsKKwkJY3AgPSBidWYgKyAoeD4+Myk7CisJCWJ4ID0geCY3OworCQlpZiAocnVuID4gOC1ieCkgeworCQkgICAgaWYgKGJ4KSB7CQkJLyogYWxpZ24gdG8gYnl0ZSBib3VuZGFyeSAqLworCQkJKmNwKysgfD0gMHhmZiA+PiBieDsKKwkJCXJ1biAtPSA4LWJ4OworCQkgICAgfQorCQkgICAgaWYoIChuID0gcnVuPj4zKSAhPSAwICkgewkvKiBtdWx0aXBsZSBieXRlcyB0byBmaWxsICovCisJCQlpZiAoKG4vc2l6ZW9mIChsb25nKSkgPiAxKSB7CisJCQkgICAgLyoKKwkJCSAgICAgKiBBbGlnbiB0byBsb25nd29yZCBib3VuZGFyeSBhbmQgZmlsbC4KKwkJCSAgICAgKi8KKwkJCSAgICBmb3IgKDsgbiAmJiAhaXNBbGlnbmVkKGNwLCBsb25nKTsgbi0tKQorCQkJCSpjcCsrID0gMHhmZjsKKwkJCSAgICBscCA9IChsb25nKikgY3A7CisJCQkgICAgbncgPSAoaW50MzIpKG4gLyBzaXplb2YgKGxvbmcpKTsKKwkJCSAgICBuIC09IG53ICogc2l6ZW9mIChsb25nKTsKKwkJCSAgICBkbyB7CisJCQkJKmxwKysgPSAtMUw7CisJCQkgICAgfSB3aGlsZSAoLS1udyk7CisJCQkgICAgY3AgPSAodW5zaWduZWQgY2hhciopIGxwOworCQkJfQorCQkJRklMTChuLCBjcCk7CisJCQlydW4gJj0gNzsKKwkJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogRXhwbGljaXQgMHhmZiBtYXNraW5nIHRvIG1ha2UgaWNjIC1jaGVjaz1jb252ZXJzaW9ucyBoYXBweSAqLworCQkgICAgaWYgKHJ1bikKKwkJCWNwWzBdID0gKHVuc2lnbmVkIGNoYXIpKChjcFswXSB8ICgweGZmMDAgPj4gcnVuKSkmMHhmZik7CisJCX0gZWxzZQorCQkgICAgY3BbMF0gfD0gX2ZpbGxtYXNrc1tydW5dPj5ieDsKKwkJeCArPSBydW5zWzFdOworCSAgICB9CisJfQorCWFzc2VydCh4ID09IGxhc3R4KTsKK30KKyN1bmRlZglaRVJPCisjdW5kZWYJRklMTAorCitzdGF0aWMgaW50CitGYXgzRml4dXBUYWdzKFRJRkYqIHRpZikKK3sKKwkodm9pZCkgdGlmOworCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBTZXR1cCBHMy9HNC1yZWxhdGVkIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gc3RhdGUKKyAqIGJlZm9yZSBkYXRhIGlzIHByb2Nlc3NlZC4gIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgb25jZQorICogcGVyIGltYWdlIC0tIGl0IHNldHMgdXAgZGlmZmVyZW50IHN0YXRlIGJhc2VkIG9uIHdoZXRoZXIKKyAqIG9yIG5vdCBkZWNvZGluZyBvciBlbmNvZGluZyBpcyBiZWluZyBkb25lIGFuZCB3aGV0aGVyCisgKiAxRC0gb3IgMkQtZW5jb2RlZCBkYXRhIGlzIGludm9sdmVkLgorICovCitzdGF0aWMgaW50CitGYXgzU2V0dXBTdGF0ZShUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiRmF4M1NldHVwU3RhdGUiOworCVRJRkZEaXJlY3RvcnkqIHRkID0gJnRpZi0+dGlmX2RpcjsKKwlGYXgzQmFzZVN0YXRlKiBzcCA9IEZheDNTdGF0ZSh0aWYpOworCWludCBuZWVkc1JlZkxpbmU7CisJRmF4M0NvZGVjU3RhdGUqIGRzcCA9IChGYXgzQ29kZWNTdGF0ZSopIEZheDNTdGF0ZSh0aWYpOworCXRtc2l6ZV90IHJvd2J5dGVzOworCXVpbnQzMiByb3dwaXhlbHMsIG5ydW5zOworCisJaWYgKHRkLT50ZF9iaXRzcGVyc2FtcGxlICE9IDEpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJICAgICJCaXRzL3NhbXBsZSBtdXN0IGJlIDEgZm9yIEdyb3VwIDMvNCBlbmNvZGluZy9kZWNvZGluZyIpOworCQlyZXR1cm4gKDApOworCX0KKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgc2NhbmxpbmUvdGlsZSB3aWR0aHMuCisJICovCisJaWYgKGlzVGlsZWQodGlmKSkgeworCQlyb3dieXRlcyA9IFRJRkZUaWxlUm93U2l6ZSh0aWYpOworCQlyb3dwaXhlbHMgPSB0ZC0+dGRfdGlsZXdpZHRoOworCX0gZWxzZSB7CisJCXJvd2J5dGVzID0gVElGRlNjYW5saW5lU2l6ZSh0aWYpOworCQlyb3dwaXhlbHMgPSB0ZC0+dGRfaW1hZ2V3aWR0aDsKKwl9CisJc3AtPnJvd2J5dGVzID0gcm93Ynl0ZXM7CisJc3AtPnJvd3BpeGVscyA9IHJvd3BpeGVsczsKKwkvKgorCSAqIEFsbG9jYXRlIGFueSBhZGRpdGlvbmFsIHNwYWNlIHJlcXVpcmVkIGZvciBkZWNvZGluZy9lbmNvZGluZy4KKwkgKi8KKwluZWVkc1JlZkxpbmUgPSAoCisJICAgIChzcC0+Z3JvdXBvcHRpb25zICYgR1JPVVAzT1BUXzJERU5DT0RJTkcpIHx8CisJICAgIHRkLT50ZF9jb21wcmVzc2lvbiA9PSBDT01QUkVTU0lPTl9DQ0lUVEZBWDQKKwkpOworCisJLyoKKwkgIEFzc3VyZSB0aGF0IGFsbG9jYXRpb24gY29tcHV0YXRpb25zIGRvIG5vdCBvdmVyZmxvdy4KKwkgIAorCSAgVElGRnJvdW5kdXAgYW5kIFRJRkZTYWZlTXVsdGlwbHkgcmV0dXJuIHplcm8gb24gaW50ZWdlciBvdmVyZmxvdworCSovCisJZHNwLT5ydW5zPSh1aW50MzIqKSBOVUxMOworCW5ydW5zID0gVElGRnJvdW5kdXBfMzIocm93cGl4ZWxzLDMyKTsKKwlpZiAobmVlZHNSZWZMaW5lKSB7CisJCW5ydW5zID0gVElGRlNhZmVNdWx0aXBseSh1aW50MzIsbnJ1bnMsMik7CisJfQorCWlmICgobnJ1bnMgPT0gMCkgfHwgKFRJRkZTYWZlTXVsdGlwbHkodWludDMyLG5ydW5zLDIpID09IDApKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCB0aWYtPnRpZl9uYW1lLAorCQkJICAgICAiUm93IHBpeGVscyBpbnRlZ2VyIG92ZXJmbG93IChyb3dwaXhlbHMgJXUpIiwKKwkJCSAgICAgcm93cGl4ZWxzKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJZHNwLT5ydW5zID0gKHVpbnQzMiopIF9USUZGQ2hlY2tNYWxsb2ModGlmLAorCQkJCQkgICAgICAgVElGRlNhZmVNdWx0aXBseSh1aW50MzIsbnJ1bnMsMiksCisJCQkJCSAgICAgICBzaXplb2YgKHVpbnQzMiksCisJCQkJCSAgICAgICAiZm9yIEdyb3VwIDMvNCBydW4gYXJyYXlzIik7CisJaWYgKGRzcC0+cnVucyA9PSBOVUxMKQorCQlyZXR1cm4gKDApOworCW1lbXNldCggZHNwLT5ydW5zLCAwLCBUSUZGU2FmZU11bHRpcGx5KHVpbnQzMixucnVucywyKSpzaXplb2YodWludDMyKSk7CisJZHNwLT5jdXJydW5zID0gZHNwLT5ydW5zOworCWlmIChuZWVkc1JlZkxpbmUpCisJCWRzcC0+cmVmcnVucyA9IGRzcC0+cnVucyArIG5ydW5zOworCWVsc2UKKwkJZHNwLT5yZWZydW5zID0gTlVMTDsKKwlpZiAodGQtPnRkX2NvbXByZXNzaW9uID09IENPTVBSRVNTSU9OX0NDSVRURkFYMworCSAgICAmJiBpczJERW5jb2RpbmcoZHNwKSkgewkvKiBOQjogZGVmYXVsdCBpcyAxRCByb3V0aW5lICovCisJCXRpZi0+dGlmX2RlY29kZXJvdyA9IEZheDNEZWNvZGUyRDsKKwkJdGlmLT50aWZfZGVjb2Rlc3RyaXAgPSBGYXgzRGVjb2RlMkQ7CisJCXRpZi0+dGlmX2RlY29kZXRpbGUgPSBGYXgzRGVjb2RlMkQ7CisJfQorCisJaWYgKG5lZWRzUmVmTGluZSkgewkJLyogMmQgZW5jb2RpbmcgKi8KKwkJRmF4M0NvZGVjU3RhdGUqIGVzcCA9IEVuY29kZXJTdGF0ZSh0aWYpOworCQkvKgorCQkgKiAyZCBlbmNvZGluZyByZXF1aXJlcyBhIHNjYW5saW5lCisJCSAqIGJ1ZmZlciBmb3IgdGhlIGBgcmVmZXJlbmNlIGxpbmUnJzsgdGhlCisJCSAqIHNjYW5saW5lIGFnYWluc3Qgd2hpY2ggZGVsdGEgZW5jb2RpbmcKKwkJICogaXMgcmVmZXJlbmNlZC4gIFRoZSByZWZlcmVuY2UgbGluZSBtdXN0CisJCSAqIGJlIGluaXRpYWxpemVkIHRvIGJlIGBgd2hpdGUnJyAoZG9uZSBlbHNld2hlcmUpLgorCQkgKi8KKwkJZXNwLT5yZWZsaW5lID0gKHVuc2lnbmVkIGNoYXIqKSBfVElGRm1hbGxvYyhyb3dieXRlcyk7CisJCWlmIChlc3AtPnJlZmxpbmUgPT0gTlVMTCkgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAiTm8gc3BhY2UgZm9yIEdyb3VwIDMvNCByZWZlcmVuY2UgbGluZSIpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCX0gZWxzZQkJCQkJLyogMWQgZW5jb2RpbmcgKi8KKwkJRW5jb2RlclN0YXRlKHRpZiktPnJlZmxpbmUgPSBOVUxMOworCisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIENDSVRUIEdyb3VwIDMgRkFYIEVuY29kaW5nLgorICovCisKKyNkZWZpbmUJRmF4M0ZsdXNoQml0cyh0aWYsIHNwKSB7CQkJCVwKKwlpZiAoKHRpZiktPnRpZl9yYXdjYyA+PSAodGlmKS0+dGlmX3Jhd2RhdGFzaXplKQkJXAorCQkodm9pZCkgVElGRkZsdXNoRGF0YTEodGlmKTsJCQlcCisJKih0aWYpLT50aWZfcmF3Y3ArKyA9ICh1aW50OCkgKHNwKS0+ZGF0YTsJCVwKKwkodGlmKS0+dGlmX3Jhd2NjKys7CQkJCQlcCisJKHNwKS0+ZGF0YSA9IDAsIChzcCktPmJpdCA9IDg7CQkJCVwKK30KKyNkZWZpbmUJX0ZsdXNoQml0cyh0aWYpIHsJCQkJCVwKKwlpZiAoKHRpZiktPnRpZl9yYXdjYyA+PSAodGlmKS0+dGlmX3Jhd2RhdGFzaXplKQkJXAorCQkodm9pZCkgVElGRkZsdXNoRGF0YTEodGlmKTsJCQlcCisJKih0aWYpLT50aWZfcmF3Y3ArKyA9ICh1aW50OCkgZGF0YTsJCVwKKwkodGlmKS0+dGlmX3Jhd2NjKys7CQkJCQlcCisJZGF0YSA9IDAsIGJpdCA9IDg7CQkJCQlcCit9CitzdGF0aWMgY29uc3QgaW50IF9tc2JtYXNrWzldID0KKyAgICB7IDB4MDAsIDB4MDEsIDB4MDMsIDB4MDcsIDB4MGYsIDB4MWYsIDB4M2YsIDB4N2YsIDB4ZmYgfTsKKyNkZWZpbmUJX1B1dEJpdHModGlmLCBiaXRzLCBsZW5ndGgpIHsJCQkJXAorCXdoaWxlIChsZW5ndGggPiBiaXQpIHsJCQkJCVwKKwkJZGF0YSB8PSBiaXRzID4+IChsZW5ndGggLSBiaXQpOwkJCVwKKwkJbGVuZ3RoIC09IGJpdDsJCQkJCVwKKwkJX0ZsdXNoQml0cyh0aWYpOwkJCQlcCisJfQkJCQkJCQlcCisgICAgICAgIGFzc2VydCggbGVuZ3RoIDwgOSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWRhdGEgfD0gKGJpdHMgJiBfbXNibWFza1tsZW5ndGhdKSA8PCAoYml0IC0gbGVuZ3RoKTsJXAorCWJpdCAtPSBsZW5ndGg7CQkJCQkJXAorCWlmIChiaXQgPT0gMCkJCQkJCQlcCisJCV9GbHVzaEJpdHModGlmKTsJCQkJXAorfQorCQorLyoKKyAqIFdyaXRlIGEgdmFyaWFibGUtbGVuZ3RoIGJpdC12YWx1ZSB0bworICogdGhlIG91dHB1dCBzdHJlYW0uICBWYWx1ZXMgYXJlCisgKiBhc3N1bWVkIHRvIGJlIGF0IG1vc3QgMTYgYml0cy4KKyAqLworc3RhdGljIHZvaWQKK0ZheDNQdXRCaXRzKFRJRkYqIHRpZiwgdW5zaWduZWQgaW50IGJpdHMsIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisJRmF4M0NvZGVjU3RhdGUqIHNwID0gRW5jb2RlclN0YXRlKHRpZik7CisJdW5zaWduZWQgaW50IGJpdCA9IHNwLT5iaXQ7CisJaW50IGRhdGEgPSBzcC0+ZGF0YTsKKworCV9QdXRCaXRzKHRpZiwgYml0cywgbGVuZ3RoKTsKKworCXNwLT5kYXRhID0gZGF0YTsKKwlzcC0+Yml0ID0gYml0OworfQorCisvKgorICogV3JpdGUgYSBjb2RlIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgorICovCisjZGVmaW5lIHB1dGNvZGUodGlmLCB0ZSkJRmF4M1B1dEJpdHModGlmLCAodGUpLT5jb2RlLCAodGUpLT5sZW5ndGgpCisKKyNpZmRlZiBGQVgzX0RFQlVHCisjZGVmaW5lCURFQlVHX0NPTE9SKHcpICh0YWIgPT0gVElGRkZheFdoaXRlQ29kZXMgPyB3ICJXIiA6IHcgIkIiKQorI2RlZmluZQlERUJVR19QUklOVCh3aGF0LGxlbikgewkJCQkJCVwKKyAgICBpbnQgdDsJCQkJCQkJCVwKKyAgICBwcmludGYoIiUwOFgvJS0yZDogJXMlNWRcdCIsIGRhdGEsIGJpdCwgREVCVUdfQ09MT1Iod2hhdCksIGxlbik7CVwKKyAgICBmb3IgKHQgPSBsZW5ndGgtMTsgdCA+PSAwOyB0LS0pCQkJCQlcCisJcHV0Y2hhcihjb2RlICYgKDE8PHQpID8gJzEnIDogJzAnKTsJCQkJXAorICAgIHB1dGNoYXIoJ1xuJyk7CQkJCQkJCVwKK30KKyNlbmRpZgorCisvKgorICogV3JpdGUgdGhlIHNlcXVlbmNlIG9mIGNvZGVzIHRoYXQgZGVzY3JpYmVzCisgKiB0aGUgc3BlY2lmaWVkIHNwYW4gb2YgemVybydzIG9yIG9uZSdzLiAgVGhlCisgKiBhcHByb3ByaWF0ZSB0YWJsZSB0aGF0IGhvbGRzIHRoZSBtYWtlLXVwIGFuZAorICogdGVybWluYXRpbmcgY29kZXMgaXMgc3VwcGxpZWQuCisgKi8KK3N0YXRpYyB2b2lkCitwdXRzcGFuKFRJRkYqIHRpZiwgaW50MzIgc3BhbiwgY29uc3QgdGFibGVlbnRyeSogdGFiKQoreworCUZheDNDb2RlY1N0YXRlKiBzcCA9IEVuY29kZXJTdGF0ZSh0aWYpOworCXVuc2lnbmVkIGludCBiaXQgPSBzcC0+Yml0OworCWludCBkYXRhID0gc3AtPmRhdGE7CisJdW5zaWduZWQgaW50IGNvZGUsIGxlbmd0aDsKKworCXdoaWxlIChzcGFuID49IDI2MjQpIHsKKwkJY29uc3QgdGFibGVlbnRyeSogdGUgPSAmdGFiWzYzICsgKDI1NjA+PjYpXTsKKwkJY29kZSA9IHRlLT5jb2RlLCBsZW5ndGggPSB0ZS0+bGVuZ3RoOworI2lmZGVmIEZBWDNfREVCVUcKKwkJREVCVUdfUFJJTlQoIk1ha2VVcCIsIHRlLT5ydW5sZW4pOworI2VuZGlmCisJCV9QdXRCaXRzKHRpZiwgY29kZSwgbGVuZ3RoKTsKKwkJc3BhbiAtPSB0ZS0+cnVubGVuOworCX0KKwlpZiAoc3BhbiA+PSA2NCkgeworCQljb25zdCB0YWJsZWVudHJ5KiB0ZSA9ICZ0YWJbNjMgKyAoc3Bhbj4+NildOworCQlhc3NlcnQodGUtPnJ1bmxlbiA9PSA2NCooc3Bhbj4+NikpOworCQljb2RlID0gdGUtPmNvZGUsIGxlbmd0aCA9IHRlLT5sZW5ndGg7CisjaWZkZWYgRkFYM19ERUJVRworCQlERUJVR19QUklOVCgiTWFrZVVwIiwgdGUtPnJ1bmxlbik7CisjZW5kaWYKKwkJX1B1dEJpdHModGlmLCBjb2RlLCBsZW5ndGgpOworCQlzcGFuIC09IHRlLT5ydW5sZW47CisJfQorCWNvZGUgPSB0YWJbc3Bhbl0uY29kZSwgbGVuZ3RoID0gdGFiW3NwYW5dLmxlbmd0aDsKKyNpZmRlZiBGQVgzX0RFQlVHCisJREVCVUdfUFJJTlQoIiAgVGVybSIsIHRhYltzcGFuXS5ydW5sZW4pOworI2VuZGlmCisJX1B1dEJpdHModGlmLCBjb2RlLCBsZW5ndGgpOworCisJc3AtPmRhdGEgPSBkYXRhOworCXNwLT5iaXQgPSBiaXQ7Cit9CisKKy8qCisgKiBXcml0ZSBhbiBFT0wgY29kZSB0byB0aGUgb3V0cHV0IHN0cmVhbS4gIFRoZSB6ZXJvLWZpbGwKKyAqIGxvZ2ljIGZvciBieXRlLWFsaWduaW5nIGVuY29kZWQgc2NhbmxpbmVzIGlzIGhhbmRsZWQKKyAqIGhlcmUuICBXZSBhbHNvIGhhbmRsZSB3cml0aW5nIHRoZSB0YWcgYml0IGZvciB0aGUgbmV4dAorICogc2NhbmxpbmUgd2hlbiBkb2luZyAyZCBlbmNvZGluZy4KKyAqLworc3RhdGljIHZvaWQKK0ZheDNQdXRFT0woVElGRiogdGlmKQoreworCUZheDNDb2RlY1N0YXRlKiBzcCA9IEVuY29kZXJTdGF0ZSh0aWYpOworCXVuc2lnbmVkIGludCBiaXQgPSBzcC0+Yml0OworCWludCBkYXRhID0gc3AtPmRhdGE7CisJdW5zaWduZWQgaW50IGNvZGUsIGxlbmd0aCwgdHBhcm07CisKKwlpZiAoc3AtPmIuZ3JvdXBvcHRpb25zICYgR1JPVVAzT1BUX0ZJTExCSVRTKSB7CisJCS8qCisJCSAqIEZvcmNlIGJpdCBhbGlnbm1lbnQgc28gRU9MIHdpbGwgdGVybWluYXRlIG9uCisJCSAqIGEgYnl0ZSBib3VuZGFyeS4gIFRoYXQgaXMsIGZvcmNlIHRoZSBiaXQgYWxpZ25tZW50CisJCSAqIHRvIDE2LTEyID0gNCBiZWZvcmUgcHV0dGluZyBvdXQgdGhlIEVPTCBjb2RlLgorCQkgKi8KKwkJaW50IGFsaWduID0gOCAtIDQ7CisJCWlmIChhbGlnbiAhPSBzcC0+Yml0KSB7CisJCQlpZiAoYWxpZ24gPiBzcC0+Yml0KQorCQkJCWFsaWduID0gc3AtPmJpdCArICg4IC0gYWxpZ24pOworCQkJZWxzZQorCQkJCWFsaWduID0gc3AtPmJpdCAtIGFsaWduOworCQkJY29kZSA9IDA7CisJCQl0cGFybT1hbGlnbjsgCisJCQlfUHV0Qml0cyh0aWYsIDAsIHRwYXJtKTsKKwkJfQorCX0KKwljb2RlID0gRU9MLCBsZW5ndGggPSAxMjsKKwlpZiAoaXMyREVuY29kaW5nKHNwKSkKKwkJY29kZSA9IChjb2RlPDwxKSB8IChzcC0+dGFnID09IEczXzFEKSwgbGVuZ3RoKys7CisJX1B1dEJpdHModGlmLCBjb2RlLCBsZW5ndGgpOworCisJc3AtPmRhdGEgPSBkYXRhOworCXNwLT5iaXQgPSBiaXQ7Cit9CisKKy8qCisgKiBSZXNldCBlbmNvZGluZyBzdGF0ZSBhdCB0aGUgc3RhcnQgb2YgYSBzdHJpcC4KKyAqLworc3RhdGljIGludAorRmF4M1ByZUVuY29kZShUSUZGKiB0aWYsIHVpbnQxNiBzKQoreworCUZheDNDb2RlY1N0YXRlKiBzcCA9IEVuY29kZXJTdGF0ZSh0aWYpOworCisJKHZvaWQpIHM7CisJYXNzZXJ0KHNwICE9IE5VTEwpOworCXNwLT5iaXQgPSA4OworCXNwLT5kYXRhID0gMDsKKwlzcC0+dGFnID0gRzNfMUQ7CisJLyoKKwkgKiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgR3JvdXAgNDsgb3RoZXJ3aXNlIGl0IGlzbid0CisJICogbmVlZGVkIGJlY2F1c2UgdGhlIGZpcnN0IHNjYW5saW5lIG9mIGVhY2ggc3RyaXAgZW5kcworCSAqIHVwIGJlaW5nIGNvcGllZCBpbnRvIHRoZSByZWZsaW5lLgorCSAqLworCWlmIChzcC0+cmVmbGluZSkKKwkJX1RJRkZtZW1zZXQoc3AtPnJlZmxpbmUsIDB4MDAsIHNwLT5iLnJvd2J5dGVzKTsKKwlpZiAoaXMyREVuY29kaW5nKHNwKSkgeworCQlmbG9hdCByZXMgPSB0aWYtPnRpZl9kaXIudGRfeXJlc29sdXRpb247CisJCS8qCisJCSAqIFRoZSBDQ0lUVCBzcGVjIHNheXMgdGhhdCB3aGVuIGRvaW5nIDJkIGVuY29kaW5nLCB5b3UKKwkJICogc2hvdWxkIG9ubHkgZG8gaXQgb24gSyBjb25zZWN1dGl2ZSBzY2FubGluZXMsIHdoZXJlIEsKKwkJICogZGVwZW5kcyBvbiB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgaW1hZ2UgYmVpbmcgZW5jb2RlZAorCQkgKiAoMiBmb3IgPD0gMjAwIGxwaSwgNCBmb3IgPiAyMDAgbHBpKS4gIFNpbmNlIHRoZSBkaXJlY3RvcnkKKwkJICogY29kZSBpbml0aWFsaXplcyB0ZF95cmVzb2x1dGlvbiB0byAwLCB0aGlzIGNvZGUgd2lsbAorCQkgKiBzZWxlY3QgYSBLIG9mIDIgdW5sZXNzIHRoZSBZUmVzb2x1dGlvbiB0YWcgaXMgc2V0CisJCSAqIGFwcHJvcHJpYXRlbHkuICAoTm90ZSBhbHNvIHRoYXQgd2UgZnVkZ2UgYSBsaXR0bGUgaGVyZQorCQkgKiBhbmQgdXNlIDE1MCBscGkgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCB1bml0cyBjb252ZXJzaW9uLikKKwkJICovCisJCWlmICh0aWYtPnRpZl9kaXIudGRfcmVzb2x1dGlvbnVuaXQgPT0gUkVTVU5JVF9DRU5USU1FVEVSKQorCQkJcmVzICo9IDIuNTRmOwkJLyogY29udmVydCB0byBpbmNoZXMgKi8KKwkJc3AtPm1heGsgPSAocmVzID4gMTUwID8gNCA6IDIpOworCQlzcC0+ayA9IHNwLT5tYXhrLTE7CisJfSBlbHNlCisJCXNwLT5rID0gc3AtPm1heGsgPSAwOworCXNwLT5saW5lID0gMDsKKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB6ZXJvcnVuc1syNTZdID0geworICAgIDgsIDcsIDYsIDYsIDUsIDUsIDUsIDUsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCS8qIDB4MDAgLSAweDBmICovCisgICAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywJLyogMHgxMCAtIDB4MWYgKi8KKyAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAkvKiAweDIwIC0gMHgyZiAqLworICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCS8qIDB4MzAgLSAweDNmICovCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwJLyogMHg0MCAtIDB4NGYgKi8KKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAkvKiAweDUwIC0gMHg1ZiAqLworICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCS8qIDB4NjAgLSAweDZmICovCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwJLyogMHg3MCAtIDB4N2YgKi8KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAweDgwIC0gMHg4ZiAqLworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDB4OTAgLSAweDlmICovCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMHhhMCAtIDB4YWYgKi8KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAweGIwIC0gMHhiZiAqLworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDB4YzAgLSAweGNmICovCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMHhkMCAtIDB4ZGYgKi8KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAweGUwIC0gMHhlZiAqLworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDB4ZjAgLSAweGZmICovCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgb25lcnVuc1syNTZdID0geworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDB4MDAgLSAweDBmICovCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMHgxMCAtIDB4MWYgKi8KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAweDIwIC0gMHgyZiAqLworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDB4MzAgLSAweDNmICovCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMHg0MCAtIDB4NGYgKi8KKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAweDUwIC0gMHg1ZiAqLworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDB4NjAgLSAweDZmICovCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMHg3MCAtIDB4N2YgKi8KKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAkvKiAweDgwIC0gMHg4ZiAqLworICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCS8qIDB4OTAgLSAweDlmICovCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwJLyogMHhhMCAtIDB4YWYgKi8KKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAkvKiAweGIwIC0gMHhiZiAqLworICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCS8qIDB4YzAgLSAweGNmICovCisgICAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwJLyogMHhkMCAtIDB4ZGYgKi8KKyAgICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAkvKiAweGUwIC0gMHhlZiAqLworICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIDUsIDYsIDYsIDcsIDgsCS8qIDB4ZjAgLSAweGZmICovCit9OworCisvKgorICogT24gY2VydGFpbiBzeXN0ZW1zIGl0IHBheXMgdG8gaW5saW5lCisgKiB0aGUgcm91dGluZXMgdGhhdCBmaW5kIHBpeGVsIHNwYW5zLgorICovCisjaWZkZWYgVkFYQworc3RhdGljCWludDMyIGZpbmQwc3Bhbih1bnNpZ25lZCBjaGFyKiwgaW50MzIsIGludDMyKTsKK3N0YXRpYwlpbnQzMiBmaW5kMXNwYW4odW5zaWduZWQgY2hhciosIGludDMyLCBpbnQzMik7CisjcHJhZ21hIGlubGluZShmaW5kMHNwYW4sZmluZDFzcGFuKQorI2VuZGlmCisKKy8qCisgKiBGaW5kIGEgc3BhbiBvZiBvbmVzIG9yIHplcm9zIHVzaW5nIHRoZSBzdXBwbGllZAorICogdGFibGUuICBUaGUgYGBiYXNlJycgb2YgdGhlIGJpdCBzdHJpbmcgaXMgc3VwcGxpZWQKKyAqIGFsb25nIHdpdGggdGhlIHN0YXJ0K2VuZCBiaXQgaW5kaWNlcy4KKyAqLworaW5saW5lIHN0YXRpYyBpbnQzMgorZmluZDBzcGFuKHVuc2lnbmVkIGNoYXIqIGJwLCBpbnQzMiBicywgaW50MzIgYmUpCit7CisJaW50MzIgYml0cyA9IGJlIC0gYnM7CisJaW50MzIgbiwgc3BhbjsKKworCWJwICs9IGJzPj4zOworCS8qCisJICogQ2hlY2sgcGFydGlhbCBieXRlIG9uIGxocy4KKwkgKi8KKwlpZiAoYml0cyA+IDAgJiYgKG4gPSAoYnMgJiA3KSkpIHsKKwkJc3BhbiA9IHplcm9ydW5zWygqYnAgPDwgbikgJiAweGZmXTsKKwkJaWYgKHNwYW4gPiA4LW4pCQkvKiB0YWJsZSB2YWx1ZSB0b28gZ2VuZXJvdXMgKi8KKwkJCXNwYW4gPSA4LW47CisJCWlmIChzcGFuID4gYml0cykJLyogY29uc3RyYWluIHNwYW4gdG8gYml0IHJhbmdlICovCisJCQlzcGFuID0gYml0czsKKwkJaWYgKG4rc3BhbiA8IDgpCQkvKiBkb2Vzbid0IGV4dGVuZCB0byBlZGdlIG9mIGJ5dGUgKi8KKwkJCXJldHVybiAoc3Bhbik7CisJCWJpdHMgLT0gc3BhbjsKKwkJYnArKzsKKwl9IGVsc2UKKwkJc3BhbiA9IDA7CisJaWYgKGJpdHMgPj0gKGludDMyKSgyICogOCAqIHNpemVvZihsb25nKSkpIHsKKwkJbG9uZyogbHA7CisJCS8qCisJCSAqIEFsaWduIHRvIGxvbmd3b3JkIGJvdW5kYXJ5IGFuZCBjaGVjayBsb25nd29yZHMuCisJCSAqLworCQl3aGlsZSAoIWlzQWxpZ25lZChicCwgbG9uZykpIHsKKwkJCWlmICgqYnAgIT0gMHgwMCkKKwkJCQlyZXR1cm4gKHNwYW4gKyB6ZXJvcnVuc1sqYnBdKTsKKwkJCXNwYW4gKz0gOCwgYml0cyAtPSA4OworCQkJYnArKzsKKwkJfQorCQlscCA9IChsb25nKikgYnA7CisJCXdoaWxlICgoYml0cyA+PSAoaW50MzIpKDggKiBzaXplb2YobG9uZykpKSAmJiAoMCA9PSAqbHApKSB7CisJCQlzcGFuICs9IDgqc2l6ZW9mIChsb25nKSwgYml0cyAtPSA4KnNpemVvZiAobG9uZyk7CisJCQlscCsrOworCQl9CisJCWJwID0gKHVuc2lnbmVkIGNoYXIqKSBscDsKKwl9CisJLyoKKwkgKiBTY2FuIGZ1bGwgYnl0ZXMgZm9yIGFsbCAwJ3MuCisJICovCisJd2hpbGUgKGJpdHMgPj0gOCkgeworCQlpZiAoKmJwICE9IDB4MDApCS8qIGVuZCBvZiBydW4gKi8KKwkJCXJldHVybiAoc3BhbiArIHplcm9ydW5zWypicF0pOworCQlzcGFuICs9IDgsIGJpdHMgLT0gODsKKwkJYnArKzsKKwl9CisJLyoKKwkgKiBDaGVjayBwYXJ0aWFsIGJ5dGUgb24gcmhzLgorCSAqLworCWlmIChiaXRzID4gMCkgeworCQluID0gemVyb3J1bnNbKmJwXTsKKwkJc3BhbiArPSAobiA+IGJpdHMgPyBiaXRzIDogbik7CisJfQorCXJldHVybiAoc3Bhbik7Cit9CisKK2lubGluZSBzdGF0aWMgaW50MzIKK2ZpbmQxc3Bhbih1bnNpZ25lZCBjaGFyKiBicCwgaW50MzIgYnMsIGludDMyIGJlKQoreworCWludDMyIGJpdHMgPSBiZSAtIGJzOworCWludDMyIG4sIHNwYW47CisKKwlicCArPSBicz4+MzsKKwkvKgorCSAqIENoZWNrIHBhcnRpYWwgYnl0ZSBvbiBsaHMuCisJICovCisJaWYgKGJpdHMgPiAwICYmIChuID0gKGJzICYgNykpKSB7CisJCXNwYW4gPSBvbmVydW5zWygqYnAgPDwgbikgJiAweGZmXTsKKwkJaWYgKHNwYW4gPiA4LW4pCQkvKiB0YWJsZSB2YWx1ZSB0b28gZ2VuZXJvdXMgKi8KKwkJCXNwYW4gPSA4LW47CisJCWlmIChzcGFuID4gYml0cykJLyogY29uc3RyYWluIHNwYW4gdG8gYml0IHJhbmdlICovCisJCQlzcGFuID0gYml0czsKKwkJaWYgKG4rc3BhbiA8IDgpCQkvKiBkb2Vzbid0IGV4dGVuZCB0byBlZGdlIG9mIGJ5dGUgKi8KKwkJCXJldHVybiAoc3Bhbik7CisJCWJpdHMgLT0gc3BhbjsKKwkJYnArKzsKKwl9IGVsc2UKKwkJc3BhbiA9IDA7CisJaWYgKGJpdHMgPj0gKGludDMyKSgyICogOCAqIHNpemVvZihsb25nKSkpIHsKKwkJbG9uZyogbHA7CisJCS8qCisJCSAqIEFsaWduIHRvIGxvbmd3b3JkIGJvdW5kYXJ5IGFuZCBjaGVjayBsb25nd29yZHMuCisJCSAqLworCQl3aGlsZSAoIWlzQWxpZ25lZChicCwgbG9uZykpIHsKKwkJCWlmICgqYnAgIT0gMHhmZikKKwkJCQlyZXR1cm4gKHNwYW4gKyBvbmVydW5zWypicF0pOworCQkJc3BhbiArPSA4LCBiaXRzIC09IDg7CisJCQlicCsrOworCQl9CisJCWxwID0gKGxvbmcqKSBicDsKKwkJd2hpbGUgKChiaXRzID49IChpbnQzMikoOCAqIHNpemVvZihsb25nKSkpICYmICh+MCA9PSAqbHApKSB7CisJCQlzcGFuICs9IDgqc2l6ZW9mIChsb25nKSwgYml0cyAtPSA4KnNpemVvZiAobG9uZyk7CisJCQlscCsrOworCQl9CisJCWJwID0gKHVuc2lnbmVkIGNoYXIqKSBscDsKKwl9CisJLyoKKwkgKiBTY2FuIGZ1bGwgYnl0ZXMgZm9yIGFsbCAxJ3MuCisJICovCisJd2hpbGUgKGJpdHMgPj0gOCkgeworCQlpZiAoKmJwICE9IDB4ZmYpCS8qIGVuZCBvZiBydW4gKi8KKwkJCXJldHVybiAoc3BhbiArIG9uZXJ1bnNbKmJwXSk7CisJCXNwYW4gKz0gOCwgYml0cyAtPSA4OworCQlicCsrOworCX0KKwkvKgorCSAqIENoZWNrIHBhcnRpYWwgYnl0ZSBvbiByaHMuCisJICovCisJaWYgKGJpdHMgPiAwKSB7CisJCW4gPSBvbmVydW5zWypicF07CisJCXNwYW4gKz0gKG4gPiBiaXRzID8gYml0cyA6IG4pOworCX0KKwlyZXR1cm4gKHNwYW4pOworfQorCisvKgorICogUmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgYml0IGluIHRoZSByYW5nZQorICogW2JzLi5iZV0gdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgc3BlY2lmaWVkCisgKiBjb2xvci4gIFRoZSBlbmQsIGJlLCBpcyByZXR1cm5lZCBpZiBubyBzdWNoIGJpdAorICogZXhpc3RzLgorICovCisjZGVmaW5lCWZpbmRkaWZmKF9jcCwgX2JzLCBfYmUsIF9jb2xvcikJXAorCShfYnMgKyAoX2NvbG9yID8gZmluZDFzcGFuKF9jcCxfYnMsX2JlKSA6IGZpbmQwc3BhbihfY3AsX2JzLF9iZSkpKQorLyoKKyAqIExpa2UgZmluZGRpZmYsIGJ1dCBhbHNvIGNoZWNrIHRoZSBzdGFydGluZyBiaXQKKyAqIGFnYWluc3QgdGhlIGVuZCBpbiBjYXNlIHN0YXJ0ID4gZW5kLgorICovCisjZGVmaW5lCWZpbmRkaWZmMihfY3AsIF9icywgX2JlLCBfY29sb3IpIFwKKwkoX2JzIDwgX2JlID8gZmluZGRpZmYoX2NwLF9icyxfYmUsX2NvbG9yKSA6IF9iZSkKKworLyoKKyAqIDFkLWVuY29kZSBhIHJvdyBvZiBwaXhlbHMuICBUaGUgZW5jb2RpbmcgaXMKKyAqIGEgc2VxdWVuY2Ugb2YgYWxsLXdoaXRlIG9yIGFsbC1ibGFjayBzcGFucworICogb2YgcGl4ZWxzIGVuY29kZWQgd2l0aCBIdWZmbWFuIGNvZGVzLgorICovCitzdGF0aWMgaW50CitGYXgzRW5jb2RlMURSb3coVElGRiogdGlmLCB1bnNpZ25lZCBjaGFyKiBicCwgdWludDMyIGJpdHMpCit7CisJRmF4M0NvZGVjU3RhdGUqIHNwID0gRW5jb2RlclN0YXRlKHRpZik7CisJaW50MzIgc3BhbjsKKyAgICAgICAgdWludDMyIGJzID0gMDsKKworCWZvciAoOzspIHsKKwkJc3BhbiA9IGZpbmQwc3BhbihicCwgYnMsIGJpdHMpOwkJLyogd2hpdGUgc3BhbiAqLworCQlwdXRzcGFuKHRpZiwgc3BhbiwgVElGRkZheFdoaXRlQ29kZXMpOworCQlicyArPSBzcGFuOworCQlpZiAoYnMgPj0gYml0cykKKwkJCWJyZWFrOworCQlzcGFuID0gZmluZDFzcGFuKGJwLCBicywgYml0cyk7CQkvKiBibGFjayBzcGFuICovCisJCXB1dHNwYW4odGlmLCBzcGFuLCBUSUZGRmF4QmxhY2tDb2Rlcyk7CisJCWJzICs9IHNwYW47CisJCWlmIChicyA+PSBiaXRzKQorCQkJYnJlYWs7CisJfQorCWlmIChzcC0+Yi5tb2RlICYgKEZBWE1PREVfQllURUFMSUdOfEZBWE1PREVfV09SREFMSUdOKSkgeworCQlpZiAoc3AtPmJpdCAhPSA4KQkJCS8qIGJ5dGUtYWxpZ24gKi8KKwkJCUZheDNGbHVzaEJpdHModGlmLCBzcCk7CisJCWlmICgoc3AtPmIubW9kZSZGQVhNT0RFX1dPUkRBTElHTikgJiYKKwkJICAgICFpc0FsaWduZWQodGlmLT50aWZfcmF3Y3AsIHVpbnQxNikpCisJCQlGYXgzRmx1c2hCaXRzKHRpZiwgc3ApOworCX0KKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgY29uc3QgdGFibGVlbnRyeSBob3JpemNvZGUgPQorICAgIHsgMywgMHgxLCAwIH07CS8qIDAwMSAqLworc3RhdGljIGNvbnN0IHRhYmxlZW50cnkgcGFzc2NvZGUgPQorICAgIHsgNCwgMHgxLCAwIH07CS8qIDAwMDEgKi8KK3N0YXRpYyBjb25zdCB0YWJsZWVudHJ5IHZjb2Rlc1s3XSA9IHsKKyAgICB7IDcsIDB4MDMsIDAgfSwJLyogMDAwMCAwMTEgKi8KKyAgICB7IDYsIDB4MDMsIDAgfSwJLyogMDAwMCAxMSAqLworICAgIHsgMywgMHgwMywgMCB9LAkvKiAwMTEgKi8KKyAgICB7IDEsIDB4MSwgMCB9LAkvKiAxICovCisgICAgeyAzLCAweDIsIDAgfSwJLyogMDEwICovCisgICAgeyA2LCAweDAyLCAwIH0sCS8qIDAwMDAgMTAgKi8KKyAgICB7IDcsIDB4MDIsIDAgfQkvKiAwMDAwIDAxMCAqLworfTsKKworLyoKKyAqIDJkLWVuY29kZSBhIHJvdyBvZiBwaXhlbHMuICBDb25zdWx0IHRoZSBDQ0lUVAorICogZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGFsZ29yaXRobS4KKyAqLworc3RhdGljIGludAorRmF4M0VuY29kZTJEUm93KFRJRkYqIHRpZiwgdW5zaWduZWQgY2hhciogYnAsIHVuc2lnbmVkIGNoYXIqIHJwLCB1aW50MzIgYml0cykKK3sKKyNkZWZpbmUJUElYRUwoYnVmLGl4KQkoKCgoYnVmKVsoaXgpPj4zXSkgPj4gKDctKChpeCkmNykpKSAmIDEpCisgICAgICAgIHVpbnQzMiBhMCA9IDA7CisJdWludDMyIGExID0gKFBJWEVMKGJwLCAwKSAhPSAwID8gMCA6IGZpbmRkaWZmKGJwLCAwLCBiaXRzLCAwKSk7CisJdWludDMyIGIxID0gKFBJWEVMKHJwLCAwKSAhPSAwID8gMCA6IGZpbmRkaWZmKHJwLCAwLCBiaXRzLCAwKSk7CisJdWludDMyIGEyLCBiMjsKKworCWZvciAoOzspIHsKKwkJYjIgPSBmaW5kZGlmZjIocnAsIGIxLCBiaXRzLCBQSVhFTChycCxiMSkpOworCQlpZiAoYjIgPj0gYTEpIHsKKwkJCWludDMyIGQgPSBiMSAtIGExOworCQkJaWYgKCEoLTMgPD0gZCAmJiBkIDw9IDMpKSB7CS8qIGhvcml6b250YWwgbW9kZSAqLworCQkJCWEyID0gZmluZGRpZmYyKGJwLCBhMSwgYml0cywgUElYRUwoYnAsYTEpKTsKKwkJCQlwdXRjb2RlKHRpZiwgJmhvcml6Y29kZSk7CisJCQkJaWYgKGEwK2ExID09IDAgfHwgUElYRUwoYnAsIGEwKSA9PSAwKSB7CisJCQkJCXB1dHNwYW4odGlmLCBhMS1hMCwgVElGRkZheFdoaXRlQ29kZXMpOworCQkJCQlwdXRzcGFuKHRpZiwgYTItYTEsIFRJRkZGYXhCbGFja0NvZGVzKTsKKwkJCQl9IGVsc2UgeworCQkJCQlwdXRzcGFuKHRpZiwgYTEtYTAsIFRJRkZGYXhCbGFja0NvZGVzKTsKKwkJCQkJcHV0c3Bhbih0aWYsIGEyLWExLCBUSUZGRmF4V2hpdGVDb2Rlcyk7CisJCQkJfQorCQkJCWEwID0gYTI7CisJCQl9IGVsc2UgewkJCS8qIHZlcnRpY2FsIG1vZGUgKi8KKwkJCQlwdXRjb2RlKHRpZiwgJnZjb2Rlc1tkKzNdKTsKKwkJCQlhMCA9IGExOworCQkJfQorCQl9IGVsc2UgewkJCQkvKiBwYXNzIG1vZGUgKi8KKwkJCXB1dGNvZGUodGlmLCAmcGFzc2NvZGUpOworCQkJYTAgPSBiMjsKKwkJfQorCQlpZiAoYTAgPj0gYml0cykKKwkJCWJyZWFrOworCQlhMSA9IGZpbmRkaWZmKGJwLCBhMCwgYml0cywgUElYRUwoYnAsYTApKTsKKwkJYjEgPSBmaW5kZGlmZihycCwgYTAsIGJpdHMsICFQSVhFTChicCxhMCkpOworCQliMSA9IGZpbmRkaWZmKHJwLCBiMSwgYml0cywgUElYRUwoYnAsYTApKTsKKwl9CisJcmV0dXJuICgxKTsKKyN1bmRlZiBQSVhFTAorfQorCisvKgorICogRW5jb2RlIGEgYnVmZmVyIG9mIHBpeGVscy4KKyAqLworc3RhdGljIGludAorRmF4M0VuY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBicCwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIkZheDNFbmNvZGUiOworCUZheDNDb2RlY1N0YXRlKiBzcCA9IEVuY29kZXJTdGF0ZSh0aWYpOworCSh2b2lkKSBzOworCWlmIChjYyAlIHNwLT5iLnJvd2J5dGVzKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIkZyYWN0aW9uYWwgc2NhbmxpbmVzIGNhbm5vdCBiZSB3cml0dGVuIik7CisJCXJldHVybiAoMCk7CisJfQorCXdoaWxlIChjYyA+IDApIHsKKwkJaWYgKChzcC0+Yi5tb2RlICYgRkFYTU9ERV9OT0VPTCkgPT0gMCkKKwkJCUZheDNQdXRFT0wodGlmKTsKKwkJaWYgKGlzMkRFbmNvZGluZyhzcCkpIHsKKwkJCWlmIChzcC0+dGFnID09IEczXzFEKSB7CisJCQkJaWYgKCFGYXgzRW5jb2RlMURSb3codGlmLCBicCwgc3AtPmIucm93cGl4ZWxzKSkKKwkJCQkJcmV0dXJuICgwKTsKKwkJCQlzcC0+dGFnID0gRzNfMkQ7CisJCQl9IGVsc2UgeworCQkJCWlmICghRmF4M0VuY29kZTJEUm93KHRpZiwgYnAsIHNwLT5yZWZsaW5lLAorCQkJCSAgICBzcC0+Yi5yb3dwaXhlbHMpKQorCQkJCQlyZXR1cm4gKDApOworCQkJCXNwLT5rLS07CisJCQl9CisJCQlpZiAoc3AtPmsgPT0gMCkgeworCQkJCXNwLT50YWcgPSBHM18xRDsKKwkJCQlzcC0+ayA9IHNwLT5tYXhrLTE7CisJCQl9IGVsc2UKKwkJCQlfVElGRm1lbWNweShzcC0+cmVmbGluZSwgYnAsIHNwLT5iLnJvd2J5dGVzKTsKKwkJfSBlbHNlIHsKKwkJCWlmICghRmF4M0VuY29kZTFEUm93KHRpZiwgYnAsIHNwLT5iLnJvd3BpeGVscykpCisJCQkJcmV0dXJuICgwKTsKKwkJfQorCQlicCArPSBzcC0+Yi5yb3dieXRlczsKKwkJY2MgLT0gc3AtPmIucm93Ynl0ZXM7CisJfQorCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbnQKK0ZheDNQb3N0RW5jb2RlKFRJRkYqIHRpZikKK3sKKwlGYXgzQ29kZWNTdGF0ZSogc3AgPSBFbmNvZGVyU3RhdGUodGlmKTsKKworCWlmIChzcC0+Yml0ICE9IDgpCisJCUZheDNGbHVzaEJpdHModGlmLCBzcCk7CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIHZvaWQKK0ZheDNDbG9zZShUSUZGKiB0aWYpCit7CisJaWYgKChGYXgzU3RhdGUodGlmKS0+bW9kZSAmIEZBWE1PREVfTk9SVEMpID09IDApIHsKKwkJRmF4M0NvZGVjU3RhdGUqIHNwID0gRW5jb2RlclN0YXRlKHRpZik7CisJCXVuc2lnbmVkIGludCBjb2RlID0gRU9MOworCQl1bnNpZ25lZCBpbnQgbGVuZ3RoID0gMTI7CisJCWludCBpOworCisJCWlmIChpczJERW5jb2Rpbmcoc3ApKQorCQkJY29kZSA9IChjb2RlPDwxKSB8IChzcC0+dGFnID09IEczXzFEKSwgbGVuZ3RoKys7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlGYXgzUHV0Qml0cyh0aWYsIGNvZGUsIGxlbmd0aCk7CisJCUZheDNGbHVzaEJpdHModGlmLCBzcCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorRmF4M0NsZWFudXAoVElGRiogdGlmKQoreworCUZheDNDb2RlY1N0YXRlKiBzcCA9IERlY29kZXJTdGF0ZSh0aWYpOworCQorCWFzc2VydChzcCAhPSAwKTsKKworCXRpZi0+dGlmX3RhZ21ldGhvZHMudmdldGZpZWxkID0gc3AtPmIudmdldHBhcmVudDsKKwl0aWYtPnRpZl90YWdtZXRob2RzLnZzZXRmaWVsZCA9IHNwLT5iLnZzZXRwYXJlbnQ7CisJdGlmLT50aWZfdGFnbWV0aG9kcy5wcmludGRpciA9IHNwLT5iLnByaW50ZGlyOworCisJaWYgKHNwLT5ydW5zKQorCQlfVElGRmZyZWUoc3AtPnJ1bnMpOworCWlmIChzcC0+cmVmbGluZSkKKwkJX1RJRkZmcmVlKHNwLT5yZWZsaW5lKTsKKworCV9USUZGZnJlZSh0aWYtPnRpZl9kYXRhKTsKKwl0aWYtPnRpZl9kYXRhID0gTlVMTDsKKworCV9USUZGU2V0RGVmYXVsdENvbXByZXNzaW9uU3RhdGUodGlmKTsKK30KKworI2RlZmluZQlGSUVMRF9CQURGQVhMSU5FUwkoRklFTERfQ09ERUMrMCkKKyNkZWZpbmUJRklFTERfQ0xFQU5GQVhEQVRBCShGSUVMRF9DT0RFQysxKQorI2RlZmluZQlGSUVMRF9CQURGQVhSVU4JCShGSUVMRF9DT0RFQysyKQorCisjZGVmaW5lCUZJRUxEX09QVElPTlMJCShGSUVMRF9DT0RFQys3KQorCitzdGF0aWMgY29uc3QgVElGRkZpZWxkIGZheEZpZWxkc1tdID0geworICAgIHsgVElGRlRBR19GQVhNT0RFLCAwLCAwLCBUSUZGX0FOWSwgMCwgVElGRl9TRVRHRVRfSU5ULCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1BTRVVETywgRkFMU0UsIEZBTFNFLCAiRmF4TW9kZSIsIE5VTEwgfSwKKyAgICB7IFRJRkZUQUdfRkFYRklMTEZVTkMsIDAsIDAsIFRJRkZfQU5ZLCAwLCBUSUZGX1NFVEdFVF9PVEhFUiwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9QU0VVRE8sIEZBTFNFLCBGQUxTRSwgIkZheEZpbGxGdW5jIiwgTlVMTCB9LAorICAgIHsgVElGRlRBR19CQURGQVhMSU5FUywgMSwgMSwgVElGRl9MT05HLCAwLCBUSUZGX1NFVEdFVF9VSU5UMzIsIFRJRkZfU0VUR0VUX1VJTlQzMiwgRklFTERfQkFERkFYTElORVMsIFRSVUUsIEZBTFNFLCAiQmFkRmF4TGluZXMiLCBOVUxMIH0sCisgICAgeyBUSUZGVEFHX0NMRUFORkFYREFUQSwgMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVUlOVDE2LCBUSUZGX1NFVEdFVF9VSU5UMTYsIEZJRUxEX0NMRUFORkFYREFUQSwgVFJVRSwgRkFMU0UsICJDbGVhbkZheERhdGEiLCBOVUxMIH0sCisgICAgeyBUSUZGVEFHX0NPTlNFQ1VUSVZFQkFERkFYTElORVMsIDEsIDEsIFRJRkZfTE9ORywgMCwgVElGRl9TRVRHRVRfVUlOVDMyLCBUSUZGX1NFVEdFVF9VSU5UMzIsIEZJRUxEX0JBREZBWFJVTiwgVFJVRSwgRkFMU0UsICJDb25zZWN1dGl2ZUJhZEZheExpbmVzIiwgTlVMTCB9fTsKK3N0YXRpYyBjb25zdCBUSUZGRmllbGQgZmF4M0ZpZWxkc1tdID0geworICAgIHsgVElGRlRBR19HUk9VUDNPUFRJT05TLCAxLCAxLCBUSUZGX0xPTkcsIDAsIFRJRkZfU0VUR0VUX1VJTlQzMiwgVElGRl9TRVRHRVRfVUlOVDMyLCBGSUVMRF9PUFRJT05TLCBGQUxTRSwgRkFMU0UsICJHcm91cDNPcHRpb25zIiwgTlVMTCB9LAorfTsKK3N0YXRpYyBjb25zdCBUSUZGRmllbGQgZmF4NEZpZWxkc1tdID0geworICAgIHsgVElGRlRBR19HUk9VUDRPUFRJT05TLCAxLCAxLCBUSUZGX0xPTkcsIDAsIFRJRkZfU0VUR0VUX1VJTlQzMiwgVElGRl9TRVRHRVRfVUlOVDMyLCBGSUVMRF9PUFRJT05TLCBGQUxTRSwgRkFMU0UsICJHcm91cDRPcHRpb25zIiwgTlVMTCB9LAorfTsKKworc3RhdGljIGludAorRmF4M1ZTZXRGaWVsZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcsIHZhX2xpc3QgYXApCit7CisJRmF4M0Jhc2VTdGF0ZSogc3AgPSBGYXgzU3RhdGUodGlmKTsKKwljb25zdCBUSUZGRmllbGQqIGZpcDsKKworCWFzc2VydChzcCAhPSAwKTsKKwlhc3NlcnQoc3AtPnZzZXRwYXJlbnQgIT0gMCk7CisKKwlzd2l0Y2ggKHRhZykgeworCWNhc2UgVElGRlRBR19GQVhNT0RFOgorCQlzcC0+bW9kZSA9IChpbnQpIHZhX2FyZyhhcCwgaW50KTsKKwkJcmV0dXJuIDE7CQkJLyogTkI6IHBzZXVkbyB0YWcgKi8KKwljYXNlIFRJRkZUQUdfRkFYRklMTEZVTkM6CisJCURlY29kZXJTdGF0ZSh0aWYpLT5maWxsID0gdmFfYXJnKGFwLCBUSUZGRmF4RmlsbEZ1bmMpOworCQlyZXR1cm4gMTsJCQkvKiBOQjogcHNldWRvIHRhZyAqLworCWNhc2UgVElGRlRBR19HUk9VUDNPUFRJT05TOgorCQkvKiBYWFg6IGF2b2lkIHJlYWRpbmcgb3B0aW9ucyBpZiBjb21wcmVzc2lvbiBtaXNtYXRjaGVzLiAqLworCQlpZiAodGlmLT50aWZfZGlyLnRkX2NvbXByZXNzaW9uID09IENPTVBSRVNTSU9OX0NDSVRURkFYMykKKwkJCXNwLT5ncm91cG9wdGlvbnMgPSAodWludDMyKSB2YV9hcmcoYXAsIHVpbnQzMik7CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19HUk9VUDRPUFRJT05TOgorCQkvKiBYWFg6IGF2b2lkIHJlYWRpbmcgb3B0aW9ucyBpZiBjb21wcmVzc2lvbiBtaXNtYXRjaGVzLiAqLworCQlpZiAodGlmLT50aWZfZGlyLnRkX2NvbXByZXNzaW9uID09IENPTVBSRVNTSU9OX0NDSVRURkFYNCkKKwkJCXNwLT5ncm91cG9wdGlvbnMgPSAodWludDMyKSB2YV9hcmcoYXAsIHVpbnQzMik7CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19CQURGQVhMSU5FUzoKKwkJc3AtPmJhZGZheGxpbmVzID0gKHVpbnQzMikgdmFfYXJnKGFwLCB1aW50MzIpOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfQ0xFQU5GQVhEQVRBOgorCQlzcC0+Y2xlYW5mYXhkYXRhID0gKHVpbnQxNikgdmFfYXJnKGFwLCB1aW50MTZfdmFwKTsKKwkJYnJlYWs7CisJY2FzZSBUSUZGVEFHX0NPTlNFQ1VUSVZFQkFERkFYTElORVM6CisJCXNwLT5iYWRmYXhydW4gPSAodWludDMyKSB2YV9hcmcoYXAsIHVpbnQzMik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAoKnNwLT52c2V0cGFyZW50KSh0aWYsIHRhZywgYXApOworCX0KKwkKKwlpZiAoKGZpcCA9IFRJRkZGaWVsZFdpdGhUYWcodGlmLCB0YWcpKSkKKwkJVElGRlNldEZpZWxkQml0KHRpZiwgZmlwLT5maWVsZF9iaXQpOworCWVsc2UKKwkJcmV0dXJuIDA7CisKKwl0aWYtPnRpZl9mbGFncyB8PSBUSUZGX0RJUlRZRElSRUNUOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitGYXgzVkdldEZpZWxkKFRJRkYqIHRpZiwgdWludDMyIHRhZywgdmFfbGlzdCBhcCkKK3sKKwlGYXgzQmFzZVN0YXRlKiBzcCA9IEZheDNTdGF0ZSh0aWYpOworCisJYXNzZXJ0KHNwICE9IDApOworCisJc3dpdGNoICh0YWcpIHsKKwljYXNlIFRJRkZUQUdfRkFYTU9ERToKKwkJKnZhX2FyZyhhcCwgaW50KikgPSBzcC0+bW9kZTsKKwkJYnJlYWs7CisJY2FzZSBUSUZGVEFHX0ZBWEZJTExGVU5DOgorCQkqdmFfYXJnKGFwLCBUSUZGRmF4RmlsbEZ1bmMqKSA9IERlY29kZXJTdGF0ZSh0aWYpLT5maWxsOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfR1JPVVAzT1BUSU9OUzoKKwljYXNlIFRJRkZUQUdfR1JPVVA0T1BUSU9OUzoKKwkJKnZhX2FyZyhhcCwgdWludDMyKikgPSBzcC0+Z3JvdXBvcHRpb25zOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfQkFERkFYTElORVM6CisJCSp2YV9hcmcoYXAsIHVpbnQzMiopID0gc3AtPmJhZGZheGxpbmVzOworCQlicmVhazsKKwljYXNlIFRJRkZUQUdfQ0xFQU5GQVhEQVRBOgorCQkqdmFfYXJnKGFwLCB1aW50MTYqKSA9IHNwLT5jbGVhbmZheGRhdGE7CisJCWJyZWFrOworCWNhc2UgVElGRlRBR19DT05TRUNVVElWRUJBREZBWExJTkVTOgorCQkqdmFfYXJnKGFwLCB1aW50MzIqKSA9IHNwLT5iYWRmYXhydW47CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAoKnNwLT52Z2V0cGFyZW50KSh0aWYsIHRhZywgYXApOworCX0KKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgdm9pZAorRmF4M1ByaW50RGlyKFRJRkYqIHRpZiwgRklMRSogZmQsIGxvbmcgZmxhZ3MpCit7CisJRmF4M0Jhc2VTdGF0ZSogc3AgPSBGYXgzU3RhdGUodGlmKTsKKworCWFzc2VydChzcCAhPSAwKTsKKworCSh2b2lkKSBmbGFnczsKKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9PUFRJT05TKSkgeworCQljb25zdCBjaGFyKiBzZXAgPSAiICI7CisJCWlmICh0aWYtPnRpZl9kaXIudGRfY29tcHJlc3Npb24gPT0gQ09NUFJFU1NJT05fQ0NJVFRGQVg0KSB7CisJCQlmcHJpbnRmKGZkLCAiICBHcm91cCA0IE9wdGlvbnM6Iik7CisJCQlpZiAoc3AtPmdyb3Vwb3B0aW9ucyAmIEdST1VQNE9QVF9VTkNPTVBSRVNTRUQpCisJCQkJZnByaW50ZihmZCwgIiVzdW5jb21wcmVzc2VkIGRhdGEiLCBzZXApOworCQl9IGVsc2UgeworCisJCQlmcHJpbnRmKGZkLCAiICBHcm91cCAzIE9wdGlvbnM6Iik7CisJCQlpZiAoc3AtPmdyb3Vwb3B0aW9ucyAmIEdST1VQM09QVF8yREVOQ09ESU5HKQorCQkJCWZwcmludGYoZmQsICIlczItZCBlbmNvZGluZyIsIHNlcCksIHNlcCA9ICIrIjsKKwkJCWlmIChzcC0+Z3JvdXBvcHRpb25zICYgR1JPVVAzT1BUX0ZJTExCSVRTKQorCQkJCWZwcmludGYoZmQsICIlc0VPTCBwYWRkaW5nIiwgc2VwKSwgc2VwID0gIisiOworCQkJaWYgKHNwLT5ncm91cG9wdGlvbnMgJiBHUk9VUDNPUFRfVU5DT01QUkVTU0VEKQorCQkJCWZwcmludGYoZmQsICIlc3VuY29tcHJlc3NlZCBkYXRhIiwgc2VwKTsKKwkJfQorCQlmcHJpbnRmKGZkLCAiICglbHUgPSAweCVseClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgc3AtPmdyb3Vwb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBzcC0+Z3JvdXBvcHRpb25zKTsKKwl9CisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfQ0xFQU5GQVhEQVRBKSkgeworCQlmcHJpbnRmKGZkLCAiICBGYXggRGF0YToiKTsKKwkJc3dpdGNoIChzcC0+Y2xlYW5mYXhkYXRhKSB7CisJCWNhc2UgQ0xFQU5GQVhEQVRBX0NMRUFOOgorCQkJZnByaW50ZihmZCwgIiBjbGVhbiIpOworCQkJYnJlYWs7CisJCWNhc2UgQ0xFQU5GQVhEQVRBX1JFR0VORVJBVEVEOgorCQkJZnByaW50ZihmZCwgIiByZWNlaXZlciByZWdlbmVyYXRlZCIpOworCQkJYnJlYWs7CisJCWNhc2UgQ0xFQU5GQVhEQVRBX1VOQ0xFQU46CisJCQlmcHJpbnRmKGZkLCAiIHVuY29ycmVjdGVkIGVycm9ycyIpOworCQkJYnJlYWs7CisJCX0KKwkJZnByaW50ZihmZCwgIiAoJXUgPSAweCV4KVxuIiwKKwkJICAgIHNwLT5jbGVhbmZheGRhdGEsIHNwLT5jbGVhbmZheGRhdGEpOworCX0KKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9CQURGQVhMSU5FUykpCisJCWZwcmludGYoZmQsICIgIEJhZCBGYXggTGluZXM6ICVsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBzcC0+YmFkZmF4bGluZXMpOworCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX0JBREZBWFJVTikpCisJCWZwcmludGYoZmQsICIgIENvbnNlY3V0aXZlIEJhZCBGYXggTGluZXM6ICVsdVxuIiwKKwkJICAgICh1bnNpZ25lZCBsb25nKSBzcC0+YmFkZmF4cnVuKTsKKwlpZiAoc3AtPnByaW50ZGlyKQorCQkoKnNwLT5wcmludGRpcikodGlmLCBmZCwgZmxhZ3MpOworfQorCitzdGF0aWMgaW50CitJbml0Q0NJVFRGYXgzKFRJRkYqIHRpZikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJJbml0Q0NJVFRGYXgzIjsKKwlGYXgzQmFzZVN0YXRlKiBzcDsKKworCS8qCisJICogTWVyZ2UgY29kZWMtc3BlY2lmaWMgdGFnIGluZm9ybWF0aW9uLgorCSAqLworCWlmICghX1RJRkZNZXJnZUZpZWxkcyh0aWYsIGZheEZpZWxkcywgVElGRkFycmF5Q291bnQoZmF4RmllbGRzKSkpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsICJJbml0Q0NJVFRGYXgzIiwKKwkJCSJNZXJnaW5nIGNvbW1vbiBDQ0lUVCBGYXggY29kZWMtc3BlY2lmaWMgdGFncyBmYWlsZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSBzdGF0ZSBibG9jayBzbyB0YWcgbWV0aG9kcyBoYXZlIHN0b3JhZ2UgdG8gcmVjb3JkIHZhbHVlcy4KKwkgKi8KKwl0aWYtPnRpZl9kYXRhID0gKHVpbnQ4KikKKwkJX1RJRkZtYWxsb2Moc2l6ZW9mIChGYXgzQ29kZWNTdGF0ZSkpOworCisJaWYgKHRpZi0+dGlmX2RhdGEgPT0gTlVMTCkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkgICAgIk5vIHNwYWNlIGZvciBzdGF0ZSBibG9jayIpOworCQlyZXR1cm4gKDApOworCX0KKworCXNwID0gRmF4M1N0YXRlKHRpZik7CisgICAgICAgIHNwLT5yd19tb2RlID0gdGlmLT50aWZfbW9kZTsKKworCS8qCisJICogT3ZlcnJpZGUgcGFyZW50IGdldC9zZXQgZmllbGQgbWV0aG9kcy4KKwkgKi8KKwlzcC0+dmdldHBhcmVudCA9IHRpZi0+dGlmX3RhZ21ldGhvZHMudmdldGZpZWxkOworCXRpZi0+dGlmX3RhZ21ldGhvZHMudmdldGZpZWxkID0gRmF4M1ZHZXRGaWVsZDsgLyogaG9vayBmb3IgY29kZWMgdGFncyAqLworCXNwLT52c2V0cGFyZW50ID0gdGlmLT50aWZfdGFnbWV0aG9kcy52c2V0ZmllbGQ7CisJdGlmLT50aWZfdGFnbWV0aG9kcy52c2V0ZmllbGQgPSBGYXgzVlNldEZpZWxkOyAvKiBob29rIGZvciBjb2RlYyB0YWdzICovCisJc3AtPnByaW50ZGlyID0gdGlmLT50aWZfdGFnbWV0aG9kcy5wcmludGRpcjsKKwl0aWYtPnRpZl90YWdtZXRob2RzLnByaW50ZGlyID0gRmF4M1ByaW50RGlyOyAgIC8qIGhvb2sgZm9yIGNvZGVjIHRhZ3MgKi8KKwlzcC0+Z3JvdXBvcHRpb25zID0gMDsJCisKKwlpZiAoc3AtPnJ3X21vZGUgPT0gT19SRE9OTFkpIC8qIEZJWE1FOiBpbXByb3ZlIGZvciBpbiBwbGFjZSB1cGRhdGUgKi8KKwkJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9OT0JJVFJFVjsgLyogZGVjb2RlciBkb2VzIGJpdCByZXZlcnNhbCAqLworCURlY29kZXJTdGF0ZSh0aWYpLT5ydW5zID0gTlVMTDsKKwlUSUZGU2V0RmllbGQodGlmLCBUSUZGVEFHX0ZBWEZJTExGVU5DLCBfVElGRkZheDNmaWxscnVucyk7CisJRW5jb2RlclN0YXRlKHRpZiktPnJlZmxpbmUgPSBOVUxMOworCisJLyoKKwkgKiBJbnN0YWxsIGNvZGVjIG1ldGhvZHMuCisJICovCisJdGlmLT50aWZfZml4dXB0YWdzID0gRmF4M0ZpeHVwVGFnczsKKwl0aWYtPnRpZl9zZXR1cGRlY29kZSA9IEZheDNTZXR1cFN0YXRlOworCXRpZi0+dGlmX3ByZWRlY29kZSA9IEZheDNQcmVEZWNvZGU7CisJdGlmLT50aWZfZGVjb2Rlcm93ID0gRmF4M0RlY29kZTFEOworCXRpZi0+dGlmX2RlY29kZXN0cmlwID0gRmF4M0RlY29kZTFEOworCXRpZi0+dGlmX2RlY29kZXRpbGUgPSBGYXgzRGVjb2RlMUQ7CisJdGlmLT50aWZfc2V0dXBlbmNvZGUgPSBGYXgzU2V0dXBTdGF0ZTsKKwl0aWYtPnRpZl9wcmVlbmNvZGUgPSBGYXgzUHJlRW5jb2RlOworCXRpZi0+dGlmX3Bvc3RlbmNvZGUgPSBGYXgzUG9zdEVuY29kZTsKKwl0aWYtPnRpZl9lbmNvZGVyb3cgPSBGYXgzRW5jb2RlOworCXRpZi0+dGlmX2VuY29kZXN0cmlwID0gRmF4M0VuY29kZTsKKwl0aWYtPnRpZl9lbmNvZGV0aWxlID0gRmF4M0VuY29kZTsKKwl0aWYtPnRpZl9jbG9zZSA9IEZheDNDbG9zZTsKKwl0aWYtPnRpZl9jbGVhbnVwID0gRmF4M0NsZWFudXA7CisKKwlyZXR1cm4gKDEpOworfQorCitpbnQKK1RJRkZJbml0Q0NJVFRGYXgzKFRJRkYqIHRpZiwgaW50IHNjaGVtZSkKK3sKKwkodm9pZCkgc2NoZW1lOworCWlmIChJbml0Q0NJVFRGYXgzKHRpZikpIHsKKwkJLyoKKwkJICogTWVyZ2UgY29kZWMtc3BlY2lmaWMgdGFnIGluZm9ybWF0aW9uLgorCQkgKi8KKwkJaWYgKCFfVElGRk1lcmdlRmllbGRzKHRpZiwgZmF4M0ZpZWxkcywKKwkJCQkgICAgICBUSUZGQXJyYXlDb3VudChmYXgzRmllbGRzKSkpIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCAiVElGRkluaXRDQ0lUVEZheDMiLAorCQkJIk1lcmdpbmcgQ0NJVFQgRmF4IDMgY29kZWMtc3BlY2lmaWMgdGFncyBmYWlsZWQiKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyoKKwkJICogVGhlIGRlZmF1bHQgZm9ybWF0IGlzIENsYXNzL0Ytc3R5bGUgdy9vIFJUQy4KKwkJICovCisJCXJldHVybiBUSUZGU2V0RmllbGQodGlmLCBUSUZGVEFHX0ZBWE1PREUsIEZBWE1PREVfQ0xBU1NGKTsKKwl9IGVsc2UKKwkJcmV0dXJuIDAxOworfQorCisvKgorICogQ0NJVFQgR3JvdXAgNCAoVC42KSBGYWNzaW1pbGUtY29tcGF0aWJsZQorICogQ29tcHJlc3Npb24gU2NoZW1lIFN1cHBvcnQuCisgKi8KKworI2RlZmluZSBTV0FQKHQsYSxiKSB7IHQgeDsgeCA9IChhKTsgKGEpID0gKGIpOyAoYikgPSB4OyB9CisvKgorICogRGVjb2RlIHRoZSByZXF1ZXN0ZWQgYW1vdW50IG9mIEc0LWVuY29kZWQgZGF0YS4KKyAqLworc3RhdGljIGludAorRmF4NERlY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IG9jYywgdWludDE2IHMpCit7CisJREVDTEFSRV9TVEFURV8yRCh0aWYsIHNwLCAiRmF4NERlY29kZSIpOworCSh2b2lkKSBzOworCWlmIChvY2MgJSBzcC0+Yi5yb3dieXRlcykKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJGcmFjdGlvbmFsIHNjYW5saW5lcyBjYW5ub3QgYmUgcmVhZCIpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJQ0FDSEVfU1RBVEUodGlmLCBzcCk7CisJd2hpbGUgKG9jYyA+IDApIHsKKwkJYTAgPSAwOworCQlSdW5MZW5ndGggPSAwOworCQlwYSA9IHRoaXNydW4gPSBzcC0+Y3VycnVuczsKKwkJcGIgPSBzcC0+cmVmcnVuczsKKwkJYjEgPSAqcGIrKzsKKyNpZmRlZiBGQVgzX0RFQlVHCisJCXByaW50ZigiXG5CaXRBY2M9JTA4WCwgQml0c0F2YWlsID0gJWRcbiIsIEJpdEFjYywgQml0c0F2YWlsKTsKKwkJcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLSAlZFxuIiwgdGlmLT50aWZfcm93KTsKKwkJZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKwkJRVhQQU5EMkQoRU9GRzQpOworICAgICAgICAgICAgICAgIGlmIChFT0xjbnQpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gRU9GRzQ7CisJCSgqc3AtPmZpbGwpKGJ1ZiwgdGhpc3J1biwgcGEsIGxhc3R4KTsKKwkJU0VUVkFMVUUoMCk7CQkvKiBpbWFnaW5hcnkgY2hhbmdlIGZvciByZWZlcmVuY2UgKi8KKwkJU1dBUCh1aW50MzIqLCBzcC0+Y3VycnVucywgc3AtPnJlZnJ1bnMpOworCQlidWYgKz0gc3AtPmIucm93Ynl0ZXM7CisJCW9jYyAtPSBzcC0+Yi5yb3dieXRlczsKKwkJc3AtPmxpbmUrKzsKKwkJY29udGludWU7CisJRU9GRzQ6CisgICAgICAgICAgICAgICAgTmVlZEJpdHMxNiggMTMsIEJBREc0ICk7CisgICAgICAgIEJBREc0OgorI2lmZGVmIEZBWDNfREVCVUcKKyAgICAgICAgICAgICAgICBpZiggR2V0Qml0cygxMykgIT0gMHgxMDAxICkKKyAgICAgICAgICAgICAgICAgICAgZnB1dHMoICJCYWQgRU9GQlxuIiwgc3RkZXJyICk7CisjZW5kaWYgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQ2xyQml0cyggMTMgKTsKKwkJKCpzcC0+ZmlsbCkoYnVmLCB0aGlzcnVuLCBwYSwgbGFzdHgpOworCQlVTkNBQ0hFX1NUQVRFKHRpZiwgc3ApOworCQlyZXR1cm4gKCBzcC0+bGluZSA/IDEgOiAtMSk7CS8qIGRvbid0IGVycm9yIG9uIGJhZGx5LXRlcm1pbmF0ZWQgc3RyaXBzICovCisJfQorCVVOQ0FDSEVfU1RBVEUodGlmLCBzcCk7CisJcmV0dXJuICgxKTsKK30KKyN1bmRlZglTV0FQCisKKy8qCisgKiBFbmNvZGUgdGhlIHJlcXVlc3RlZCBhbW91bnQgb2YgZGF0YS4KKyAqLworc3RhdGljIGludAorRmF4NEVuY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBicCwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIkZheDRFbmNvZGUiOworCUZheDNDb2RlY1N0YXRlICpzcCA9IEVuY29kZXJTdGF0ZSh0aWYpOworCSh2b2lkKSBzOworCWlmIChjYyAlIHNwLT5iLnJvd2J5dGVzKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIkZyYWN0aW9uYWwgc2NhbmxpbmVzIGNhbm5vdCBiZSB3cml0dGVuIik7CisJCXJldHVybiAoMCk7CisJfQorCXdoaWxlIChjYyA+IDApIHsKKwkJaWYgKCFGYXgzRW5jb2RlMkRSb3codGlmLCBicCwgc3AtPnJlZmxpbmUsIHNwLT5iLnJvd3BpeGVscykpCisJCQlyZXR1cm4gKDApOworCQlfVElGRm1lbWNweShzcC0+cmVmbGluZSwgYnAsIHNwLT5iLnJvd2J5dGVzKTsKKwkJYnAgKz0gc3AtPmIucm93Ynl0ZXM7CisJCWNjIC09IHNwLT5iLnJvd2J5dGVzOworCX0KKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW50CitGYXg0UG9zdEVuY29kZShUSUZGKiB0aWYpCit7CisJRmF4M0NvZGVjU3RhdGUgKnNwID0gRW5jb2RlclN0YXRlKHRpZik7CisKKwkvKiB0ZXJtaW5hdGUgc3RyaXAgdy8gRU9GQiAqLworCUZheDNQdXRCaXRzKHRpZiwgRU9MLCAxMik7CisJRmF4M1B1dEJpdHModGlmLCBFT0wsIDEyKTsKKwlpZiAoc3AtPmJpdCAhPSA4KQorCQlGYXgzRmx1c2hCaXRzKHRpZiwgc3ApOworCXJldHVybiAoMSk7Cit9CisKK2ludAorVElGRkluaXRDQ0lUVEZheDQoVElGRiogdGlmLCBpbnQgc2NoZW1lKQoreworCSh2b2lkKSBzY2hlbWU7CisJaWYgKEluaXRDQ0lUVEZheDModGlmKSkgewkJLyogcmV1c2UgRzMgc3VwcG9ydCAqLworCQkvKgorCQkgKiBNZXJnZSBjb2RlYy1zcGVjaWZpYyB0YWcgaW5mb3JtYXRpb24uCisJCSAqLworCQlpZiAoIV9USUZGTWVyZ2VGaWVsZHModGlmLCBmYXg0RmllbGRzLAorCQkJCSAgICAgIFRJRkZBcnJheUNvdW50KGZheDRGaWVsZHMpKSkgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsICJUSUZGSW5pdENDSVRURmF4NCIsCisJCQkiTWVyZ2luZyBDQ0lUVCBGYXggNCBjb2RlYy1zcGVjaWZpYyB0YWdzIGZhaWxlZCIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQl0aWYtPnRpZl9kZWNvZGVyb3cgPSBGYXg0RGVjb2RlOworCQl0aWYtPnRpZl9kZWNvZGVzdHJpcCA9IEZheDREZWNvZGU7CisJCXRpZi0+dGlmX2RlY29kZXRpbGUgPSBGYXg0RGVjb2RlOworCQl0aWYtPnRpZl9lbmNvZGVyb3cgPSBGYXg0RW5jb2RlOworCQl0aWYtPnRpZl9lbmNvZGVzdHJpcCA9IEZheDRFbmNvZGU7CisJCXRpZi0+dGlmX2VuY29kZXRpbGUgPSBGYXg0RW5jb2RlOworCQl0aWYtPnRpZl9wb3N0ZW5jb2RlID0gRmF4NFBvc3RFbmNvZGU7CisJCS8qCisJCSAqIFN1cHByZXNzIFJUQyBhdCB0aGUgZW5kIG9mIGVhY2ggc3RyaXAuCisJCSAqLworCQlyZXR1cm4gVElGRlNldEZpZWxkKHRpZiwgVElGRlRBR19GQVhNT0RFLCBGQVhNT0RFX05PUlRDKTsKKwl9IGVsc2UKKwkJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIENDSVRUIEdyb3VwIDMgMS1EIE1vZGlmaWVkIEh1ZmZtYW4gUkxFIENvbXByZXNzaW9uIFN1cHBvcnQuCisgKiAoQ29tcHJlc3Npb24gYWxnb3JpdGhtcyAyIGFuZCAzMjc3MSkKKyAqLworCisvKgorICogRGVjb2RlIHRoZSByZXF1ZXN0ZWQgYW1vdW50IG9mIFJMRS1lbmNvZGVkIGRhdGEuCisgKi8KK3N0YXRpYyBpbnQKK0ZheDNEZWNvZGVSTEUoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBvY2MsIHVpbnQxNiBzKQoreworCURFQ0xBUkVfU1RBVEUodGlmLCBzcCwgIkZheDNEZWNvZGVSTEUiKTsKKwlpbnQgbW9kZSA9IHNwLT5iLm1vZGU7CisJKHZvaWQpIHM7CisJaWYgKG9jYyAlIHNwLT5iLnJvd2J5dGVzKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIkZyYWN0aW9uYWwgc2NhbmxpbmVzIGNhbm5vdCBiZSByZWFkIik7CisJCXJldHVybiAoLTEpOworCX0KKwlDQUNIRV9TVEFURSh0aWYsIHNwKTsKKwl0aGlzcnVuID0gc3AtPmN1cnJ1bnM7CisJd2hpbGUgKG9jYyA+IDApIHsKKwkJYTAgPSAwOworCQlSdW5MZW5ndGggPSAwOworCQlwYSA9IHRoaXNydW47CisjaWZkZWYgRkFYM19ERUJVRworCQlwcmludGYoIlxuQml0QWNjPSUwOFgsIEJpdHNBdmFpbCA9ICVkXG4iLCBCaXRBY2MsIEJpdHNBdmFpbCk7CisJCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0gJWRcbiIsIHRpZi0+dGlmX3Jvdyk7CisJCWZmbHVzaChzdGRvdXQpOworI2VuZGlmCisJCUVYUEFORDFEKEVPRlJMRSk7CisJCSgqc3AtPmZpbGwpKGJ1ZiwgdGhpc3J1biwgcGEsIGxhc3R4KTsKKwkJLyoKKwkJICogQ2xlYW51cCBhdCB0aGUgZW5kIG9mIHRoZSByb3cuCisJCSAqLworCQlpZiAobW9kZSAmIEZBWE1PREVfQllURUFMSUdOKSB7CisJCQlpbnQgbiA9IEJpdHNBdmFpbCAtIChCaXRzQXZhaWwgJn4gNyk7CisJCQlDbHJCaXRzKG4pOworCQl9IGVsc2UgaWYgKG1vZGUgJiBGQVhNT0RFX1dPUkRBTElHTikgeworCQkJaW50IG4gPSBCaXRzQXZhaWwgLSAoQml0c0F2YWlsICZ+IDE1KTsKKwkJCUNsckJpdHMobik7CisJCQlpZiAoQml0c0F2YWlsID09IDAgJiYgIWlzQWxpZ25lZChjcCwgdWludDE2KSkKKwkJCSAgICBjcCsrOworCQl9CisJCWJ1ZiArPSBzcC0+Yi5yb3dieXRlczsKKwkJb2NjIC09IHNwLT5iLnJvd2J5dGVzOworCQlzcC0+bGluZSsrOworCQljb250aW51ZTsKKwlFT0ZSTEU6CQkJCS8qIHByZW1hdHVyZSBFT0YgKi8KKwkJKCpzcC0+ZmlsbCkoYnVmLCB0aGlzcnVuLCBwYSwgbGFzdHgpOworCQlVTkNBQ0hFX1NUQVRFKHRpZiwgc3ApOworCQlyZXR1cm4gKC0xKTsKKwl9CisJVU5DQUNIRV9TVEFURSh0aWYsIHNwKTsKKwlyZXR1cm4gKDEpOworfQorCitpbnQKK1RJRkZJbml0Q0NJVFRSTEUoVElGRiogdGlmLCBpbnQgc2NoZW1lKQoreworCSh2b2lkKSBzY2hlbWU7CisJaWYgKEluaXRDQ0lUVEZheDModGlmKSkgewkJLyogcmV1c2UgRzMgc3VwcG9ydCAqLworCQl0aWYtPnRpZl9kZWNvZGVyb3cgPSBGYXgzRGVjb2RlUkxFOworCQl0aWYtPnRpZl9kZWNvZGVzdHJpcCA9IEZheDNEZWNvZGVSTEU7CisJCXRpZi0+dGlmX2RlY29kZXRpbGUgPSBGYXgzRGVjb2RlUkxFOworCQkvKgorCQkgKiBTdXBwcmVzcyBSVEMrRU9McyB3aGVuIGVuY29kaW5nIGFuZCBieXRlLWFsaWduIGRhdGEuCisJCSAqLworCQlyZXR1cm4gVElGRlNldEZpZWxkKHRpZiwgVElGRlRBR19GQVhNT0RFLAorCQkgICAgRkFYTU9ERV9OT1JUQ3xGQVhNT0RFX05PRU9MfEZBWE1PREVfQllURUFMSUdOKTsKKwl9IGVsc2UKKwkJcmV0dXJuICgwKTsKK30KKworaW50CitUSUZGSW5pdENDSVRUUkxFVyhUSUZGKiB0aWYsIGludCBzY2hlbWUpCit7CisJKHZvaWQpIHNjaGVtZTsKKwlpZiAoSW5pdENDSVRURmF4Myh0aWYpKSB7CQkvKiByZXVzZSBHMyBzdXBwb3J0ICovCisJCXRpZi0+dGlmX2RlY29kZXJvdyA9IEZheDNEZWNvZGVSTEU7CisJCXRpZi0+dGlmX2RlY29kZXN0cmlwID0gRmF4M0RlY29kZVJMRTsKKwkJdGlmLT50aWZfZGVjb2RldGlsZSA9IEZheDNEZWNvZGVSTEU7ICAKKwkJLyoKKwkJICogU3VwcHJlc3MgUlRDK0VPTHMgd2hlbiBlbmNvZGluZyBhbmQgd29yZC1hbGlnbiBkYXRhLgorCQkgKi8KKwkJcmV0dXJuIFRJRkZTZXRGaWVsZCh0aWYsIFRJRkZUQUdfRkFYTU9ERSwKKwkJICAgIEZBWE1PREVfTk9SVEN8RkFYTU9ERV9OT0VPTHxGQVhNT0RFX1dPUkRBTElHTik7CisJfSBlbHNlCisJCXJldHVybiAoMCk7Cit9CisjZW5kaWYgLyogQ0NJVFRfU1VQUE9SVCAqLworCisvKiB2aW06IHNldCB0cz04IHN0cz04IHN3PTggbm9ldDogKi8KKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBjCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogZmlsbC1jb2x1bW46IDc4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2ZheDMuaCBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2ZheDMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGY0NmM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZmF4My5oCkBAIC0wLDAgKzEsNTM4IEBACisvKiAkSWQ6IHRpZl9mYXgzLmgsdiAxLjkgMjAxMS0wMy0xMCAyMDoyMzowNyBmd2FybWVyZGFtIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9GQVgzXworI2RlZmluZQlfRkFYM18KKy8qCisgKiBUSUZGIExpYnJhcnkuCisgKgorICogQ0NJVFQgR3JvdXAgMyAoVC40KSBhbmQgR3JvdXAgNCAoVC42KSBEZWNvbXByZXNzaW9uIFN1cHBvcnQuCisgKgorICogRGVjb2RlciBzdXBwb3J0IGlzIGRlcml2ZWQsIHdpdGggcGVybWlzc2lvbiwgZnJvbSB0aGUgY29kZQorICogaW4gRnJhbmsgQ3JpbmdsZSdzIHZpZXdmYXggcHJvZ3JhbTsKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTk1ICBGcmFuayBELiBDcmluZ2xlLgorICovCisjaW5jbHVkZSAidGlmZi5oIgorCisvKgorICogVG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcm91dGluZSB1c2VkIHRvIGltYWdlIGRlY29kZWQKKyAqIHNwYW5zIG9uZSBjYW4gdXNlIHRoZSBwc2VkdW8gdGFnIFRJRkZUQUdfRkFYRklMTEZVTkMuCisgKiBUaGUgcm91dGluZSBtdXN0IGhhdmUgdGhlIHR5cGUgc2lnbmF0dXJlIGdpdmVuIGJlbG93OworICogZm9yIGV4YW1wbGU6CisgKgorICogZmlsbHJ1bnModW5zaWduZWQgY2hhciogYnVmLCB1aW50MzIqIHJ1bnMsIHVpbnQzMiogZXJ1biwgdWludDMyIGxhc3R4KQorICoKKyAqIHdoZXJlIGJ1ZiBpcyBwbGFjZSB0byBzZXQgdGhlIGJpdHMsIHJ1bnMgaXMgdGhlIGFycmF5IG9mIGImdyBydW4KKyAqIGxlbmd0aHMgKHdoaXRlIHRoZW4gYmxhY2spLCBlcnVuIGlzIHRoZSBsYXN0IHJ1biBpbiB0aGUgYXJyYXksIGFuZAorICogbGFzdHggaXMgdGhlIHdpZHRoIG9mIHRoZSByb3cgaW4gcGl4ZWxzLiAgRmlsbCByb3V0aW5lcyBjYW4gYXNzdW1lCisgKiB0aGUgcnVuIGFycmF5IGhhcyByb29tIGZvciBhdCBsZWFzdCBsYXN0eCBydW5zIGFuZCBjYW4gb3ZlcndyaXRlCisgKiBkYXRhIGluIHRoZSBydW4gYXJyYXkgYXMgbmVlZGVkIChlLmcuIHRvIGFwcGVuZCB6ZXJvIHJ1bnMgdG8gYnJpbmcKKyAqIHRoZSBjb3VudCB1cCB0byBhIG5pY2UgbXVsdGlwbGUpLgorICovCit0eXBlZGVmIHZvaWQgKCpUSUZGRmF4RmlsbEZ1bmMpKHVuc2lnbmVkIGNoYXIqLCB1aW50MzIqLCB1aW50MzIqLCB1aW50MzIpOworCisvKgorICogVGhlIGRlZmF1bHQgcnVuIGZpbGxlcjsgbWFkZSBleHRlcm5hbCBmb3Igb3RoZXIgZGVjb2RlcnMuCisgKi8KKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKK2V4dGVybiB2b2lkIF9USUZGRmF4M2ZpbGxydW5zKHVuc2lnbmVkIGNoYXIqLCB1aW50MzIqLCB1aW50MzIqLCB1aW50MzIpOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworCisvKiBmaW5pdGUgc3RhdGUgbWFjaGluZSBjb2RlcyAqLworI2RlZmluZSBTX051bGwgICAgIDAKKyNkZWZpbmUgU19QYXNzICAgICAxCisjZGVmaW5lIFNfSG9yaXogICAgMgorI2RlZmluZSBTX1YwICAgICAgIDMKKyNkZWZpbmUgU19WUiAgICAgICA0CisjZGVmaW5lIFNfVkwgICAgICAgNQorI2RlZmluZSBTX0V4dCAgICAgIDYKKyNkZWZpbmUgU19UZXJtVyAgICA3CisjZGVmaW5lIFNfVGVybUIgICAgOAorI2RlZmluZSBTX01ha2VVcFcgIDkKKyNkZWZpbmUgU19NYWtlVXBCICAxMAorI2RlZmluZSBTX01ha2VVcCAgIDExCisjZGVmaW5lIFNfRU9MICAgICAgMTIKKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAvKiBzdGF0ZSB0YWJsZSBlbnRyeSAqLworCXVuc2lnbmVkIGNoYXIgU3RhdGU7ICAgIC8qIHNlZSBhYm92ZSAqLworCXVuc2lnbmVkIGNoYXIgV2lkdGg7ICAgIC8qIHdpZHRoIG9mIGNvZGUgaW4gYml0cyAqLworCXVpbnQzMiBQYXJhbTsgICAgICAgICAgIC8qIHVuc2lnbmVkIDMyLWJpdCBydW4gbGVuZ3RoIGluIGJpdHMgKi8KK30gVElGRkZheFRhYkVudDsKKworZXh0ZXJuIGNvbnN0IFRJRkZGYXhUYWJFbnQgVElGRkZheE1haW5UYWJsZVtdOworZXh0ZXJuIGNvbnN0IFRJRkZGYXhUYWJFbnQgVElGRkZheFdoaXRlVGFibGVbXTsKK2V4dGVybiBjb25zdCBUSUZGRmF4VGFiRW50IFRJRkZGYXhCbGFja1RhYmxlW107CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIG1hY3JvcyBkZWZpbmUgdGhlIG1ham9yaXR5IG9mIHRoZSBHMy9HNCBkZWNvZGVyCisgKiBhbGdvcml0aG0gdXNpbmcgdGhlIHN0YXRlIHRhYmxlcyBkZWZpbmVkIGVsc2V3aGVyZS4gIFRvIGJ1aWxkCisgKiBhIGRlY29kZXIgeW91IG5lZWQgc29tZSBzZXR1cCBjb2RlIGFuZCBzb21lIGdsdWUgY29kZS4gTm90ZQorICogdGhhdCB5b3UgbWF5IGFsc28gbmVlZC93YW50IHRvIGNoYW5nZSB0aGUgd2F5IHRoZSBOZWVkQml0cyoKKyAqIG1hY3JvcyBnZXQgaW5wdXQgZGF0YSBpZiwgZm9yIGV4YW1wbGUsIHlvdSBrbm93IHRoZSBkYXRhIHRvIGJlCisgKiBkZWNvZGVkIGlzIHByb3Blcmx5IGFsaWduZWQgYW5kIG9yaWVudGVkIChkb2luZyBzbyBiZWZvcmUgcnVubmluZworICogdGhlIGRlY29kZXIgY2FuIGJlIGEgYmlnIHBlcmZvcm1hbmNlIHdpbikuCisgKgorICogQ29uc3VsdCB0aGUgZGVjb2RlciBpbiB0aGUgVElGRiBsaWJyYXJ5IGZvciBhbiBpZGVhIG9mIHdoYXQgeW91CisgKiBuZWVkIHRvIGRlZmluZSBhbmQgc2V0dXAgdG8gbWFrZSB1c2Ugb2YgdGhlc2UgZGVmaW5pdGlvbnMuCisgKgorICogTkI6IHRvIGVuYWJsZSBhIGRlYnVnZ2luZyB2ZXJzaW9uIG9mIHRoZXNlIG1hY3JvcyBkZWZpbmUgRkFYM19ERUJVRworICogICAgIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmaWxlLiAgVHJhY2Ugb3V0cHV0IGdvZXMgdG8gc3Rkb3V0LgorICovCisKKyNpZm5kZWYgRW5kT2ZEYXRhCisjZGVmaW5lIEVuZE9mRGF0YSgpCShjcCA+PSBlcCkKKyNlbmRpZgorLyoKKyAqIE5lZWQgPD04IG9yIDw9MTYgYml0cyBvZiBpbnB1dCBkYXRhLiAgVW5saWtlIHZpZXdmYXggd2UKKyAqIGNhbm5vdCB1c2UvYXNzdW1lIGEgd29yZC1hbGlnbmVkLCBwcm9wZXJseSBiaXQgc3dpenpsZWQKKyAqIGlucHV0IGRhdGEgc2V0IGJlY2F1c2UgZGF0YSBtYXkgY29tZSBmcm9tIGFuIGFyYml0cmFyaWx5CisgKiBhbGlnbmVkLCByZWFkLW9ubHkgc291cmNlIHN1Y2ggYXMgYSBtZW1vcnktbWFwcGVkIGZpbGUuCisgKiBOb3RlIGFsc28gdGhhdCB0aGUgdmlld2ZheCBkZWNvZGVyIGRvZXMgbm90IGNoZWNrIGZvcgorICogcnVubmluZyBvZmYgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZGF0YSBidWZmZXIuICBUaGlzIGlzCisgKiBwb3NzaWJsZSBmb3IgRzMtZW5jb2RlZCBkYXRhIGJlY2F1c2UgaXQgcHJlc2NhbnMgdGhlIGlucHV0CisgKiBkYXRhIHRvIGNvdW50IEVPTCBtYXJrZXJzLCBidXQgY2FuIGNhdXNlIHByb2JsZW1zIGZvciBHNAorICogZGF0YS4gIEluIGFueSBldmVudCwgd2UgZG9uJ3QgcHJlc2NhbiBhbmQgbXVzdCB3YXRjaCBmb3IKKyAqIHJ1bm5pbmcgb3V0IG9mIGRhdGEgc2luY2Ugd2UgY2FuJ3QgcGVybWl0IHRoZSBsaWJyYXJ5IHRvCisgKiBzY2FuIHBhc3QgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZGF0YSBidWZmZXIuCisgKgorICogRmluYWxseSwgbm90ZSB0aGF0IHdlIG11c3QgaGFuZGxlIHJlbWFpbmRlcmVkIGRhdGEgYXQgdGhlIGVuZAorICogb2YgYSBzdHJpcCBzcGVjaWFsbHkuICBUaGUgY29kZXIgYXNrcyBmb3IgYSBmaXhlZCBudW1iZXIgb2YKKyAqIGJpdHMgd2hlbiBzY2FubmluZyBmb3IgdGhlIG5leHQgY29kZS4gIFRoaXMgbWF5IGJlIG1vcmUgYml0cworICogdGhhbiBhcmUgYWN0dWFsbHkgcHJlc2VudCBpbiB0aGUgZGF0YSBzdHJlYW0uICBJZiB3ZSBhcHBlYXIKKyAqIHRvIHJ1biBvdXQgb2YgZGF0YSBidXQgc3RpbGwgaGF2ZSBzb21lIG51bWJlciBvZiB2YWxpZCBiaXRzCisgKiByZW1haW5pbmcgdGhlbiB3ZSBtYWtldXAgdGhlIHJlcXVlc3RlZCBhbW91bnQgd2l0aCB6ZXJvcyBhbmQKKyAqIHJldHVybiBzdWNjZXNzZnVsbHkuICBJZiB0aGUgcmV0dXJuZWQgZGF0YSBpcyBpbmNvcnJlY3QgdGhlbgorICogd2Ugc2hvdWxkIGJlIGNhbGxlZCBhZ2FpbiBhbmQgZ2V0IGEgcHJlbWF0dXJlIEVPRiBlcnJvcjsKKyAqIG90aGVyd2lzZSB3ZSBzaG91bGQgZ2V0IHRoZSByaWdodCBhbnN3ZXIuCisgKi8KKyNpZm5kZWYgTmVlZEJpdHM4CisjZGVmaW5lIE5lZWRCaXRzOChuLGVvZmxhYikgZG8gewkJCQkJXAorICAgIGlmIChCaXRzQXZhaWwgPCAobikpIHsJCQkJCQlcCisJaWYgKEVuZE9mRGF0YSgpKSB7CQkJCQkJXAorCSAgICBpZiAoQml0c0F2YWlsID09IDApCQkJLyogbm8gdmFsaWQgYml0cyAqLwlcCisJCWdvdG8gZW9mbGFiOwkJCQkJCVwKKwkgICAgQml0c0F2YWlsID0gKG4pOwkJCS8qIHBhZCB3aXRoIHplcm9zICovCVwKKwl9IGVsc2UgewkJCQkJCQlcCisJICAgIEJpdEFjYyB8PSAoKHVpbnQzMikgYml0bWFwWypjcCsrXSk8PEJpdHNBdmFpbDsJCVwKKwkgICAgQml0c0F2YWlsICs9IDg7CQkJCQkJXAorCX0JCQkJCQkJCVwKKyAgICB9CQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKyNlbmRpZgorI2lmbmRlZiBOZWVkQml0czE2CisjZGVmaW5lIE5lZWRCaXRzMTYobixlb2ZsYWIpIGRvIHsJCQkJCVwKKyAgICBpZiAoQml0c0F2YWlsIDwgKG4pKSB7CQkJCQkJXAorCWlmIChFbmRPZkRhdGEoKSkgewkJCQkJCVwKKwkgICAgaWYgKEJpdHNBdmFpbCA9PSAwKQkJCS8qIG5vIHZhbGlkIGJpdHMgKi8JXAorCQlnb3RvIGVvZmxhYjsJCQkJCQlcCisJICAgIEJpdHNBdmFpbCA9IChuKTsJCQkvKiBwYWQgd2l0aCB6ZXJvcyAqLwlcCisJfSBlbHNlIHsJCQkJCQkJXAorCSAgICBCaXRBY2MgfD0gKCh1aW50MzIpIGJpdG1hcFsqY3ArK10pPDxCaXRzQXZhaWw7CQlcCisJICAgIGlmICgoQml0c0F2YWlsICs9IDgpIDwgKG4pKSB7CQkJCVwKKwkJaWYgKEVuZE9mRGF0YSgpKSB7CQkJCQlcCisJCSAgICAvKiBOQjogd2Uga25vdyBCaXRzQXZhaWwgaXMgbm9uLXplcm8gaGVyZSAqLwlcCisJCSAgICBCaXRzQXZhaWwgPSAobik7CQkvKiBwYWQgd2l0aCB6ZXJvcyAqLwlcCisJCX0gZWxzZSB7CQkJCQkJXAorCQkgICAgQml0QWNjIHw9ICgodWludDMyKSBiaXRtYXBbKmNwKytdKTw8Qml0c0F2YWlsOwlcCisJCSAgICBCaXRzQXZhaWwgKz0gODsJCQkJCVwKKwkJfQkJCQkJCQlcCisJICAgIH0JCQkJCQkJCVwKKwl9CQkJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKK30gd2hpbGUgKDApCisjZW5kaWYKKyNkZWZpbmUgR2V0Qml0cyhuKQkoQml0QWNjICYgKCgxPDwobikpLTEpKQorI2RlZmluZSBDbHJCaXRzKG4pIGRvIHsJCQkJCQkJXAorICAgIEJpdHNBdmFpbCAtPSAobik7CQkJCQkJCVwKKyAgICBCaXRBY2MgPj49IChuKTsJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2lmZGVmIEZBWDNfREVCVUcKK3N0YXRpYyBjb25zdCBjaGFyKiBTdGF0ZU5hbWVzW10gPSB7CisgICAgIk51bGwgICAiLAorICAgICJQYXNzICAgIiwKKyAgICAiSG9yaXogICIsCisgICAgIlYwICAgICAiLAorICAgICJWUiAgICAgIiwKKyAgICAiVkwgICAgICIsCisgICAgIkV4dCAgICAiLAorICAgICJUZXJtVyAgIiwKKyAgICAiVGVybUIgICIsCisgICAgIk1ha2VVcFciLAorICAgICJNYWtlVXBCIiwKKyAgICAiTWFrZVVwICIsCisgICAgIkVPTCAgICAiLAorfTsKKyNkZWZpbmUgREVCVUdfU0hPVyBwdXRjaGFyKEJpdEFjYyAmICgxIDw8IHQpID8gJzEnIDogJzAnKQorI2RlZmluZSBMT09LVVA4KHdpZCx0YWIsZW9mbGFiKSBkbyB7CQkJCQlcCisgICAgaW50IHQ7CQkJCQkJCQlcCisgICAgTmVlZEJpdHM4KHdpZCxlb2ZsYWIpOwkJCQkJCVwKKyAgICBUYWJFbnQgPSB0YWIgKyBHZXRCaXRzKHdpZCk7CQkJCQlcCisgICAgcHJpbnRmKCIlMDhsWC8lZDogJXMlNWRcdCIsIChsb25nKSBCaXRBY2MsIEJpdHNBdmFpbCwJCVwKKwkgICBTdGF0ZU5hbWVzW1RhYkVudC0+U3RhdGVdLCBUYWJFbnQtPlBhcmFtKTsJCQlcCisgICAgZm9yICh0ID0gMDsgdCA8IFRhYkVudC0+V2lkdGg7IHQrKykJCQkJCVwKKwlERUJVR19TSE9XOwkJCQkJCQlcCisgICAgcHV0Y2hhcignXG4nKTsJCQkJCQkJXAorICAgIGZmbHVzaChzdGRvdXQpOwkJCQkJCQlcCisgICAgQ2xyQml0cyhUYWJFbnQtPldpZHRoKTsJCQkJCQlcCit9IHdoaWxlICgwKQorI2RlZmluZSBMT09LVVAxNih3aWQsdGFiLGVvZmxhYikgZG8gewkJCQkJXAorICAgIGludCB0OwkJCQkJCQkJXAorICAgIE5lZWRCaXRzMTYod2lkLGVvZmxhYik7CQkJCQkJXAorICAgIFRhYkVudCA9IHRhYiArIEdldEJpdHMod2lkKTsJCQkJCVwKKyAgICBwcmludGYoIiUwOGxYLyVkOiAlcyU1ZFx0IiwgKGxvbmcpIEJpdEFjYywgQml0c0F2YWlsLAkJXAorCSAgIFN0YXRlTmFtZXNbVGFiRW50LT5TdGF0ZV0sIFRhYkVudC0+UGFyYW0pOwkJCVwKKyAgICBmb3IgKHQgPSAwOyB0IDwgVGFiRW50LT5XaWR0aDsgdCsrKQkJCQkJXAorCURFQlVHX1NIT1c7CQkJCQkJCVwKKyAgICBwdXRjaGFyKCdcbicpOwkJCQkJCQlcCisgICAgZmZsdXNoKHN0ZG91dCk7CQkJCQkJCVwKKyAgICBDbHJCaXRzKFRhYkVudC0+V2lkdGgpOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU0VUVkFMVUUoeCkgZG8gewkJCQkJCQlcCisgICAgKnBhKysgPSBSdW5MZW5ndGggKyAoeCk7CQkJCQkJXAorICAgIHByaW50ZigiU0VUVkFMVUU6ICVkXHQlZFxuIiwgUnVuTGVuZ3RoICsgKHgpLCBhMCk7CQkJXAorICAgIGEwICs9IHg7CQkJCQkJCQlcCisgICAgUnVuTGVuZ3RoID0gMDsJCQkJCQkJXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIExPT0tVUDgod2lkLHRhYixlb2ZsYWIpIGRvIHsJCQkJCVwKKyAgICBOZWVkQml0czgod2lkLGVvZmxhYik7CQkJCQkJXAorICAgIFRhYkVudCA9IHRhYiArIEdldEJpdHMod2lkKTsJCQkJCVwKKyAgICBDbHJCaXRzKFRhYkVudC0+V2lkdGgpOwkJCQkJCVwKK30gd2hpbGUgKDApCisjZGVmaW5lIExPT0tVUDE2KHdpZCx0YWIsZW9mbGFiKSBkbyB7CQkJCQlcCisgICAgTmVlZEJpdHMxNih3aWQsZW9mbGFiKTsJCQkJCQlcCisgICAgVGFiRW50ID0gdGFiICsgR2V0Qml0cyh3aWQpOwkJCQkJXAorICAgIENsckJpdHMoVGFiRW50LT5XaWR0aCk7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIEFwcGVuZCBhIHJ1biB0byB0aGUgcnVuIGxlbmd0aCBhcnJheSBmb3IgdGhlCisgKiBjdXJyZW50IHJvdyBhbmQgcmVzZXQgZGVjb2Rpbmcgc3RhdGUuCisgKi8KKyNkZWZpbmUgU0VUVkFMVUUoeCkgZG8gewkJCQkJCQlcCisgICAgKnBhKysgPSBSdW5MZW5ndGggKyAoeCk7CQkJCQkJXAorICAgIGEwICs9ICh4KTsJCQkJCQkJCVwKKyAgICBSdW5MZW5ndGggPSAwOwkJCQkJCQlcCit9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qCisgKiBTeW5jaHJvbml6ZSBpbnB1dCBkZWNvZGluZyBhdCB0aGUgc3RhcnQgb2YgZWFjaAorICogcm93IGJ5IHNjYW5uaW5nIGZvciBhbiBFT0wgKGlmIGFwcHJvcHJpYXRlKSBhbmQKKyAqIHNraXBwaW5nIGFueSB0cmFzaCBkYXRhIHRoYXQgbWlnaHQgYmUgcHJlc2VudAorICogYWZ0ZXIgYSBkZWNvZGluZyBlcnJvci4gIE5vdGUgdGhhdCB0aGUgZGVjb2RpbmcKKyAqIGRvbmUgZWxzZXdoZXJlIHRoYXQgcmVjb2duaXplcyBhbiBFT0wgb25seSBjb25zdW1lcworICogMTEgY29uc2VjdXRpdmUgemVybyBiaXRzLiAgVGhpcyBtZWFucyB0aGF0IGlmIEVPTGNudAorICogaXMgbm9uLXplcm8gdGhlbiB3ZSBzdGlsbCBuZWVkIHRvIHNjYW4gZm9yIHRoZSBmaW5hbCBmbGFnCisgKiBiaXQgdGhhdCBpcyBwYXJ0IG9mIHRoZSBFT0wgY29kZS4KKyAqLworI2RlZmluZQlTWU5DX0VPTChlb2ZsYWIpIGRvIHsJCQkJCQlcCisgICAgaWYgKEVPTGNudCA9PSAwKSB7CQkJCQkJCVwKKwlmb3IgKDs7KSB7CQkJCQkJCVwKKwkgICAgTmVlZEJpdHMxNigxMSxlb2ZsYWIpOwkJCQkJXAorCSAgICBpZiAoR2V0Qml0cygxMSkgPT0gMCkJCQkJCVwKKwkJYnJlYWs7CQkJCQkJCVwKKwkgICAgQ2xyQml0cygxKTsJCQkJCQkJXAorCX0JCQkJCQkJCVwKKyAgICB9CQkJCQkJCQkJXAorICAgIGZvciAoOzspIHsJCQkJCQkJCVwKKwlOZWVkQml0czgoOCxlb2ZsYWIpOwkJCQkJCVwKKwlpZiAoR2V0Qml0cyg4KSkJCQkJCQkJXAorCSAgICBicmVhazsJCQkJCQkJXAorCUNsckJpdHMoOCk7CQkJCQkJCVwKKyAgICB9CQkJCQkJCQkJXAorICAgIHdoaWxlIChHZXRCaXRzKDEpID09IDApCQkJCQkJXAorCUNsckJpdHMoMSk7CQkJCQkJCVwKKyAgICBDbHJCaXRzKDEpOwkJCQkvKiBFT0wgYml0ICovCQkJXAorICAgIEVPTGNudCA9IDA7CQkJCS8qIHJlc2V0IEVPTCBjb3VudGVyL2ZsYWcgKi8JXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIENsZWFudXAgdGhlIGFycmF5IG9mIHJ1bnMgYWZ0ZXIgZGVjb2RpbmcgYSByb3cuCisgKiBXZSBhZGp1c3QgZmluYWwgcnVucyB0byBpbnN1cmUgdGhlIHVzZXIgYnVmZmVyIGlzIG5vdAorICogb3ZlcndyaXR0ZW4gYW5kL29yIHVuZGVjb2RlZCBhcmVhIGlzIHdoaXRlIGZpbGxlZC4KKyAqLworI2RlZmluZQlDTEVBTlVQX1JVTlMoKSBkbyB7CQkJCQkJXAorICAgIGlmIChSdW5MZW5ndGgpCQkJCQkJCVwKKwlTRVRWQUxVRSgwKTsJCQkJCQkJXAorICAgIGlmIChhMCAhPSBsYXN0eCkgewkJCQkJCQlcCisJYmFkbGVuZ3RoKGEwLCBsYXN0eCk7CQkJCQkJXAorCXdoaWxlIChhMCA+IGxhc3R4ICYmIHBhID4gdGhpc3J1bikJCQkJXAorCSAgICBhMCAtPSAqLS1wYTsJCQkJCQlcCisJaWYgKGEwIDwgbGFzdHgpIHsJCQkJCQlcCisJICAgIGlmIChhMCA8IDApCQkJCQkJCVwKKwkJYTAgPSAwOwkJCQkJCQlcCisJICAgIGlmICgocGEtdGhpc3J1bikmMSkJCQkJCQlcCisJCVNFVFZBTFVFKDApOwkJCQkJCVwKKwkgICAgU0VUVkFMVUUobGFzdHggLSBhMCk7CQkJCQkJXAorCX0gZWxzZSBpZiAoYTAgPiBsYXN0eCkgewkJCQkJXAorCSAgICBTRVRWQUxVRShsYXN0eCk7CQkJCQkJXAorCSAgICBTRVRWQUxVRSgwKTsJCQkJCQkJXAorCX0JCQkJCQkJCVwKKyAgICB9CQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIERlY29kZSBhIGxpbmUgb2YgMUQtZW5jb2RlZCBkYXRhLgorICoKKyAqIFRoZSBsaW5lIGV4cGFuZGVycyBhcmUgd3JpdHRlbiBhcyBtYWNyb3Mgc28gdGhhdCB0aGV5IGNhbiBiZSByZXVzZWQKKyAqIGJ1dCBzdGlsbCBoYXZlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGUgImNhbGxpbmciCisgKiBmdW5jdGlvbi4KKyAqCisgKiBOb3RlIHRoYXQgdW5saWtlIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIHdlIGhhdmUgdG8gZXhwbGljaXRseSB0ZXN0IGZvcgorICogYTAgPj0gbGFzdHggYWZ0ZXIgZWFjaCBibGFjay93aGl0ZSBydW4gaXMgZGVjb2RlZC4gIFRoaXMgaXMgYmVjYXVzZQorICogdGhlIG9yaWdpbmFsIGNvZGUgZGVwZW5kZWQgb24gdGhlIGlucHV0IGRhdGEgYmVpbmcgemVyby1wYWRkZWQgdG8KKyAqIGluc3VyZSB0aGUgZGVjb2RlciByZWNvZ25pemVkIGFuIEVPTCBiZWZvcmUgcnVubmluZyBvdXQgb2YgZGF0YS4KKyAqLworI2RlZmluZSBFWFBBTkQxRChlb2ZsYWIpIGRvIHsJCQkJCQlcCisgICAgZm9yICg7OykgewkJCQkJCQkJXAorCWZvciAoOzspIHsJCQkJCQkJXAorCSAgICBMT09LVVAxNigxMiwgVElGRkZheFdoaXRlVGFibGUsIGVvZjFkKTsJCQlcCisJICAgIHN3aXRjaCAoVGFiRW50LT5TdGF0ZSkgewkJCQkJXAorCSAgICBjYXNlIFNfRU9MOgkJCQkJCQlcCisJCUVPTGNudCA9IDE7CQkJCQkJXAorCQlnb3RvIGRvbmUxZDsJCQkJCQlcCisJICAgIGNhc2UgU19UZXJtVzoJCQkJCQlcCisJCVNFVFZBTFVFKFRhYkVudC0+UGFyYW0pOwkJCQkJXAorCQlnb3RvIGRvbmVXaGl0ZTFkOwkJCQkJXAorCSAgICBjYXNlIFNfTWFrZVVwVzoJCQkJCQlcCisJICAgIGNhc2UgU19NYWtlVXA6CQkJCQkJXAorCQlhMCArPSBUYWJFbnQtPlBhcmFtOwkJCQkJXAorCQlSdW5MZW5ndGggKz0gVGFiRW50LT5QYXJhbTsJCQkJXAorCQlicmVhazsJCQkJCQkJXAorCSAgICBkZWZhdWx0OgkJCQkJCQlcCisJCXVuZXhwZWN0ZWQoIldoaXRlVGFibGUiLCBhMCk7CQkJCVwKKwkJZ290byBkb25lMWQ7CQkJCQkJXAorCSAgICB9CQkJCQkJCQlcCisJfQkJCQkJCQkJXAorICAgIGRvbmVXaGl0ZTFkOgkJCQkJCQlcCisJaWYgKGEwID49IGxhc3R4KQkJCQkJCVwKKwkgICAgZ290byBkb25lMWQ7CQkJCQkJXAorCWZvciAoOzspIHsJCQkJCQkJXAorCSAgICBMT09LVVAxNigxMywgVElGRkZheEJsYWNrVGFibGUsIGVvZjFkKTsJCQlcCisJICAgIHN3aXRjaCAoVGFiRW50LT5TdGF0ZSkgewkJCQkJXAorCSAgICBjYXNlIFNfRU9MOgkJCQkJCQlcCisJCUVPTGNudCA9IDE7CQkJCQkJXAorCQlnb3RvIGRvbmUxZDsJCQkJCQlcCisJICAgIGNhc2UgU19UZXJtQjoJCQkJCQlcCisJCVNFVFZBTFVFKFRhYkVudC0+UGFyYW0pOwkJCQkJXAorCQlnb3RvIGRvbmVCbGFjazFkOwkJCQkJXAorCSAgICBjYXNlIFNfTWFrZVVwQjoJCQkJCQlcCisJICAgIGNhc2UgU19NYWtlVXA6CQkJCQkJXAorCQlhMCArPSBUYWJFbnQtPlBhcmFtOwkJCQkJXAorCQlSdW5MZW5ndGggKz0gVGFiRW50LT5QYXJhbTsJCQkJXAorCQlicmVhazsJCQkJCQkJXAorCSAgICBkZWZhdWx0OgkJCQkJCQlcCisJCXVuZXhwZWN0ZWQoIkJsYWNrVGFibGUiLCBhMCk7CQkJCVwKKwkJZ290byBkb25lMWQ7CQkJCQkJXAorCSAgICB9CQkJCQkJCQlcCisJfQkJCQkJCQkJXAorICAgIGRvbmVCbGFjazFkOgkJCQkJCQlcCisJaWYgKGEwID49IGxhc3R4KQkJCQkJCVwKKwkgICAgZ290byBkb25lMWQ7CQkJCQkJXAorICAgICAgICBpZiggKihwYS0xKSA9PSAwICYmICoocGEtMikgPT0gMCApCQkJCVwKKyAgICAgICAgICAgIHBhIC09IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CQkJCQkJCQkJXAorZW9mMWQ6CQkJCQkJCQkJXAorICAgIHByZW1hdHVyZUVPRihhMCk7CQkJCQkJCVwKKyAgICBDTEVBTlVQX1JVTlMoKTsJCQkJCQkJXAorICAgIGdvdG8gZW9mbGFiOwkJCQkJCQlcCitkb25lMWQ6CQkJCQkJCQkJXAorICAgIENMRUFOVVBfUlVOUygpOwkJCQkJCQlcCit9IHdoaWxlICgwKQorCisvKgorICogVXBkYXRlIHRoZSB2YWx1ZSBvZiBiMSB1c2luZyB0aGUgYXJyYXkKKyAqIG9mIHJ1bnMgZm9yIHRoZSByZWZlcmVuY2UgbGluZS4KKyAqLworI2RlZmluZSBDSEVDS19iMSBkbyB7CQkJCQkJCVwKKyAgICBpZiAocGEgIT0gdGhpc3J1bikgd2hpbGUgKGIxIDw9IGEwICYmIGIxIDwgbGFzdHgpIHsJCQlcCisJYjEgKz0gcGJbMF0gKyBwYlsxXTsJCQkJCQlcCisJcGIgKz0gMjsJCQkJCQkJXAorICAgIH0JCQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisvKgorICogRXhwYW5kIGEgcm93IG9mIDJELWVuY29kZWQgZGF0YS4KKyAqLworI2RlZmluZSBFWFBBTkQyRChlb2ZsYWIpIGRvIHsJCQkJCQlcCisgICAgd2hpbGUgKGEwIDwgbGFzdHgpIHsJCQkJCQlcCisJTE9PS1VQOCg3LCBUSUZGRmF4TWFpblRhYmxlLCBlb2YyZCk7CQkJCVwKKwlzd2l0Y2ggKFRhYkVudC0+U3RhdGUpIHsJCQkJCVwKKwljYXNlIFNfUGFzczoJCQkJCQkJXAorCSAgICBDSEVDS19iMTsJCQkJCQkJXAorCSAgICBiMSArPSAqcGIrKzsJCQkJCQlcCisJICAgIFJ1bkxlbmd0aCArPSBiMSAtIGEwOwkJCQkJXAorCSAgICBhMCA9IGIxOwkJCQkJCQlcCisJICAgIGIxICs9ICpwYisrOwkJCQkJCVwKKwkgICAgYnJlYWs7CQkJCQkJCVwKKwljYXNlIFNfSG9yaXo6CQkJCQkJCVwKKwkgICAgaWYgKChwYS10aGlzcnVuKSYxKSB7CQkJCQlcCisJCWZvciAoOzspIHsJLyogYmxhY2sgZmlyc3QgKi8JCQlcCisJCSAgICBMT09LVVAxNigxMywgVElGRkZheEJsYWNrVGFibGUsIGVvZjJkKTsJCVwKKwkJICAgIHN3aXRjaCAoVGFiRW50LT5TdGF0ZSkgewkJCQlcCisJCSAgICBjYXNlIFNfVGVybUI6CQkJCQlcCisJCQlTRVRWQUxVRShUYWJFbnQtPlBhcmFtKTsJCQkJXAorCQkJZ290byBkb25lV2hpdGUyZGE7CQkJCVwKKwkJICAgIGNhc2UgU19NYWtlVXBCOgkJCQkJXAorCQkgICAgY2FzZSBTX01ha2VVcDoJCQkJCVwKKwkJCWEwICs9IFRhYkVudC0+UGFyYW07CQkJCVwKKwkJCVJ1bkxlbmd0aCArPSBUYWJFbnQtPlBhcmFtOwkJCVwKKwkJCWJyZWFrOwkJCQkJCVwKKwkJICAgIGRlZmF1bHQ6CQkJCQkJXAorCQkJZ290byBiYWRCbGFjazJkOwkJCQlcCisJCSAgICB9CQkJCQkJCVwKKwkJfQkJCQkJCQlcCisJICAgIGRvbmVXaGl0ZTJkYTo7CQkJCQkJXAorCQlmb3IgKDs7KSB7CS8qIHRoZW4gd2hpdGUgKi8JCQlcCisJCSAgICBMT09LVVAxNigxMiwgVElGRkZheFdoaXRlVGFibGUsIGVvZjJkKTsJCVwKKwkJICAgIHN3aXRjaCAoVGFiRW50LT5TdGF0ZSkgewkJCQlcCisJCSAgICBjYXNlIFNfVGVybVc6CQkJCQlcCisJCQlTRVRWQUxVRShUYWJFbnQtPlBhcmFtKTsJCQkJXAorCQkJZ290byBkb25lQmxhY2syZGE7CQkJCVwKKwkJICAgIGNhc2UgU19NYWtlVXBXOgkJCQkJXAorCQkgICAgY2FzZSBTX01ha2VVcDoJCQkJCVwKKwkJCWEwICs9IFRhYkVudC0+UGFyYW07CQkJCVwKKwkJCVJ1bkxlbmd0aCArPSBUYWJFbnQtPlBhcmFtOwkJCVwKKwkJCWJyZWFrOwkJCQkJCVwKKwkJICAgIGRlZmF1bHQ6CQkJCQkJXAorCQkJZ290byBiYWRXaGl0ZTJkOwkJCQlcCisJCSAgICB9CQkJCQkJCVwKKwkJfQkJCQkJCQlcCisJICAgIGRvbmVCbGFjazJkYTo7CQkJCQkJXAorCSAgICB9IGVsc2UgewkJCQkJCQlcCisJCWZvciAoOzspIHsJLyogd2hpdGUgZmlyc3QgKi8JCQlcCisJCSAgICBMT09LVVAxNigxMiwgVElGRkZheFdoaXRlVGFibGUsIGVvZjJkKTsJCVwKKwkJICAgIHN3aXRjaCAoVGFiRW50LT5TdGF0ZSkgewkJCQlcCisJCSAgICBjYXNlIFNfVGVybVc6CQkJCQlcCisJCQlTRVRWQUxVRShUYWJFbnQtPlBhcmFtKTsJCQkJXAorCQkJZ290byBkb25lV2hpdGUyZGI7CQkJCVwKKwkJICAgIGNhc2UgU19NYWtlVXBXOgkJCQkJXAorCQkgICAgY2FzZSBTX01ha2VVcDoJCQkJCVwKKwkJCWEwICs9IFRhYkVudC0+UGFyYW07CQkJCVwKKwkJCVJ1bkxlbmd0aCArPSBUYWJFbnQtPlBhcmFtOwkJCVwKKwkJCWJyZWFrOwkJCQkJCVwKKwkJICAgIGRlZmF1bHQ6CQkJCQkJXAorCQkJZ290byBiYWRXaGl0ZTJkOwkJCQlcCisJCSAgICB9CQkJCQkJCVwKKwkJfQkJCQkJCQlcCisJICAgIGRvbmVXaGl0ZTJkYjo7CQkJCQkJXAorCQlmb3IgKDs7KSB7CS8qIHRoZW4gYmxhY2sgKi8JCQlcCisJCSAgICBMT09LVVAxNigxMywgVElGRkZheEJsYWNrVGFibGUsIGVvZjJkKTsJCVwKKwkJICAgIHN3aXRjaCAoVGFiRW50LT5TdGF0ZSkgewkJCQlcCisJCSAgICBjYXNlIFNfVGVybUI6CQkJCQlcCisJCQlTRVRWQUxVRShUYWJFbnQtPlBhcmFtKTsJCQkJXAorCQkJZ290byBkb25lQmxhY2syZGI7CQkJCVwKKwkJICAgIGNhc2UgU19NYWtlVXBCOgkJCQkJXAorCQkgICAgY2FzZSBTX01ha2VVcDoJCQkJCVwKKwkJCWEwICs9IFRhYkVudC0+UGFyYW07CQkJCVwKKwkJCVJ1bkxlbmd0aCArPSBUYWJFbnQtPlBhcmFtOwkJCVwKKwkJCWJyZWFrOwkJCQkJCVwKKwkJICAgIGRlZmF1bHQ6CQkJCQkJXAorCQkJZ290byBiYWRCbGFjazJkOwkJCQlcCisJCSAgICB9CQkJCQkJCVwKKwkJfQkJCQkJCQlcCisJICAgIGRvbmVCbGFjazJkYjo7CQkJCQkJXAorCSAgICB9CQkJCQkJCQlcCisJICAgIENIRUNLX2IxOwkJCQkJCQlcCisJICAgIGJyZWFrOwkJCQkJCQlcCisJY2FzZSBTX1YwOgkJCQkJCQlcCisJICAgIENIRUNLX2IxOwkJCQkJCQlcCisJICAgIFNFVFZBTFVFKGIxIC0gYTApOwkJCQkJCVwKKwkgICAgYjEgKz0gKnBiKys7CQkJCQkJXAorCSAgICBicmVhazsJCQkJCQkJXAorCWNhc2UgU19WUjoJCQkJCQkJXAorCSAgICBDSEVDS19iMTsJCQkJCQkJXAorCSAgICBTRVRWQUxVRShiMSAtIGEwICsgVGFiRW50LT5QYXJhbSk7CQkJCVwKKwkgICAgYjEgKz0gKnBiKys7CQkJCQkJXAorCSAgICBicmVhazsJCQkJCQkJXAorCWNhc2UgU19WTDoJCQkJCQkJXAorCSAgICBDSEVDS19iMTsJCQkJCQkJXAorCSAgICBpZiAoYjEgPD0gKGludCkgKGEwICsgVGFiRW50LT5QYXJhbSkpIHsJCQlcCisJCWlmIChiMSA8IChpbnQpIChhMCArIFRhYkVudC0+UGFyYW0pIHx8IHBhICE9IHRoaXNydW4pIHsJXAorCQkgICAgdW5leHBlY3RlZCgiVkwiLCBhMCk7CQkJCVwKKwkJICAgIGdvdG8gZW9sMmQ7CQkJCQkJXAorCQl9CQkJCQkJCVwKKwkgICAgfQkJCQkJCQkJXAorCSAgICBTRVRWQUxVRShiMSAtIGEwIC0gVGFiRW50LT5QYXJhbSk7CQkJCVwKKwkgICAgYjEgLT0gKi0tcGI7CQkJCQkJXAorCSAgICBicmVhazsJCQkJCQkJXAorCWNhc2UgU19FeHQ6CQkJCQkJCVwKKwkgICAgKnBhKysgPSBsYXN0eCAtIGEwOwkJCQkJCVwKKwkgICAgZXh0ZW5zaW9uKGEwKTsJCQkJCQlcCisJICAgIGdvdG8gZW9sMmQ7CQkJCQkJCVwKKwljYXNlIFNfRU9MOgkJCQkJCQlcCisJICAgICpwYSsrID0gbGFzdHggLSBhMDsJCQkJCQlcCisJICAgIE5lZWRCaXRzOCg0LGVvZjJkKTsJCQkJCQlcCisJICAgIGlmIChHZXRCaXRzKDQpKQkJCQkJCVwKKwkJdW5leHBlY3RlZCgiRU9MIiwgYTApOwkJCQkJXAorICAgICAgICAgICAgQ2xyQml0cyg0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICBFT0xjbnQgPSAxOwkJCQkJCQlcCisJICAgIGdvdG8gZW9sMmQ7CQkJCQkJCVwKKwlkZWZhdWx0OgkJCQkJCQlcCisJYmFkTWFpbjJkOgkJCQkJCQlcCisJICAgIHVuZXhwZWN0ZWQoIk1haW5UYWJsZSIsIGEwKTsJCQkJXAorCSAgICBnb3RvIGVvbDJkOwkJCQkJCQlcCisJYmFkQmxhY2syZDoJCQkJCQkJXAorCSAgICB1bmV4cGVjdGVkKCJCbGFja1RhYmxlIiwgYTApOwkJCQlcCisJICAgIGdvdG8gZW9sMmQ7CQkJCQkJCVwKKwliYWRXaGl0ZTJkOgkJCQkJCQlcCisJICAgIHVuZXhwZWN0ZWQoIldoaXRlVGFibGUiLCBhMCk7CQkJCVwKKwkgICAgZ290byBlb2wyZDsJCQkJCQkJXAorCWVvZjJkOgkJCQkJCQkJXAorCSAgICBwcmVtYXR1cmVFT0YoYTApOwkJCQkJCVwKKwkgICAgQ0xFQU5VUF9SVU5TKCk7CQkJCQkJXAorCSAgICBnb3RvIGVvZmxhYjsJCQkJCQlcCisJfQkJCQkJCQkJXAorICAgIH0JCQkJCQkJCQlcCisgICAgaWYgKFJ1bkxlbmd0aCkgewkJCQkJCQlcCisJaWYgKFJ1bkxlbmd0aCArIGEwIDwgbGFzdHgpIHsJCQkJCVwKKwkgICAgLyogZXhwZWN0IGEgZmluYWwgVjAgKi8JCQkJCVwKKwkgICAgTmVlZEJpdHM4KDEsZW9mMmQpOwkJCQkJCVwKKwkgICAgaWYgKCFHZXRCaXRzKDEpKQkJCQkJCVwKKwkJZ290byBiYWRNYWluMmQ7CQkJCQkJXAorCSAgICBDbHJCaXRzKDEpOwkJCQkJCQlcCisJfQkJCQkJCQkJXAorCVNFVFZBTFVFKDApOwkJCQkJCQlcCisgICAgfQkJCQkJCQkJCVwKK2VvbDJkOgkJCQkJCQkJCVwKKyAgICBDTEVBTlVQX1JVTlMoKTsJCQkJCQkJXAorfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBfRkFYM18gKi8KKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBjCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogZmlsbC1jb2x1bW46IDc4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2ZheDNzbS5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZmF4M3NtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIyMTkxZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2ZheDNzbS5jCkBAIC0wLDAgKzEsMTI2MCBAQAorLyogV0FSTklORywgdGhpcyBmaWxlIHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUKKyAgICBta2czc3RhdGVzIHByb2dyYW0gKi8KKyNpbmNsdWRlICJ0aWZmLmgiCisjaW5jbHVkZSAidGlmX2ZheDMuaCIKKyBjb25zdCBUSUZGRmF4VGFiRW50IFRJRkZGYXhNYWluVGFibGVbMTI4XSA9IHsKK3sxMiw3LDB9LHszLDEsMH0sezUsMywxfSx7MywxLDB9LHsyLDMsMH0sezMsMSwwfSx7NCwzLDF9LHszLDEsMH0sezEsNCwwfSx7MywxLDB9LAorezUsMywxfSx7MywxLDB9LHsyLDMsMH0sezMsMSwwfSx7NCwzLDF9LHszLDEsMH0sezUsNiwyfSx7MywxLDB9LHs1LDMsMX0sezMsMSwwfSwKK3syLDMsMH0sezMsMSwwfSx7NCwzLDF9LHszLDEsMH0sezEsNCwwfSx7MywxLDB9LHs1LDMsMX0sezMsMSwwfSx7MiwzLDB9LHszLDEsMH0sCit7NCwzLDF9LHszLDEsMH0sezUsNywzfSx7MywxLDB9LHs1LDMsMX0sezMsMSwwfSx7MiwzLDB9LHszLDEsMH0sezQsMywxfSx7MywxLDB9LAorezEsNCwwfSx7MywxLDB9LHs1LDMsMX0sezMsMSwwfSx7MiwzLDB9LHszLDEsMH0sezQsMywxfSx7MywxLDB9LHs0LDYsMn0sezMsMSwwfSwKK3s1LDMsMX0sezMsMSwwfSx7MiwzLDB9LHszLDEsMH0sezQsMywxfSx7MywxLDB9LHsxLDQsMH0sezMsMSwwfSx7NSwzLDF9LHszLDEsMH0sCit7MiwzLDB9LHszLDEsMH0sezQsMywxfSx7MywxLDB9LHs2LDcsMH0sezMsMSwwfSx7NSwzLDF9LHszLDEsMH0sezIsMywwfSx7MywxLDB9LAorezQsMywxfSx7MywxLDB9LHsxLDQsMH0sezMsMSwwfSx7NSwzLDF9LHszLDEsMH0sezIsMywwfSx7MywxLDB9LHs0LDMsMX0sezMsMSwwfSwKK3s1LDYsMn0sezMsMSwwfSx7NSwzLDF9LHszLDEsMH0sezIsMywwfSx7MywxLDB9LHs0LDMsMX0sezMsMSwwfSx7MSw0LDB9LHszLDEsMH0sCit7NSwzLDF9LHszLDEsMH0sezIsMywwfSx7MywxLDB9LHs0LDMsMX0sezMsMSwwfSx7NCw3LDN9LHszLDEsMH0sezUsMywxfSx7MywxLDB9LAorezIsMywwfSx7MywxLDB9LHs0LDMsMX0sezMsMSwwfSx7MSw0LDB9LHszLDEsMH0sezUsMywxfSx7MywxLDB9LHsyLDMsMH0sezMsMSwwfSwKK3s0LDMsMX0sezMsMSwwfSx7NCw2LDJ9LHszLDEsMH0sezUsMywxfSx7MywxLDB9LHsyLDMsMH0sezMsMSwwfSx7NCwzLDF9LHszLDEsMH0sCit7MSw0LDB9LHszLDEsMH0sezUsMywxfSx7MywxLDB9LHsyLDMsMH0sezMsMSwwfSx7NCwzLDF9LHszLDEsMH0KK307CisgY29uc3QgVElGRkZheFRhYkVudCBUSUZGRmF4V2hpdGVUYWJsZVs0MDk2XSA9IHsKK3sxMiwxMSwwfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsNywyMH0sezksNSwxMjh9LAorezcsNywyNH0sezcsNiwxNH0sezcsNywyOH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyM30sezcsNCwzfSx7Nyw3LDI3fSx7Nyw0LDV9LAorezcsOCwzOX0sezcsNiwxNn0sezksOCw1NzZ9LHs3LDQsNn0sezcsNywxOX0sezcsNSw4fSx7Nyw4LDU1fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDV9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw4LDUzfSx7Nyw1LDl9LHs5LDgsNDQ4fSx7Nyw0LDZ9LAorezcsOCwzNX0sezksNSwxMjh9LHs3LDgsNTF9LHs3LDYsMTV9LHs3LDgsNjN9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sCit7OSw5LDE0NzJ9LHs3LDQsNX0sezcsOCw0M30sezcsNiwxN30sezksOSwxMjE2fSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sCit7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDI5fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSwKK3s5LDYsMTY2NH0sezcsNCw2fSx7Nyw4LDMzfSx7OSw1LDEyOH0sezcsOCw0OX0sezcsNiwxNH0sezcsOCw2MX0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw4LDQ3fSx7Nyw0LDN9LHs3LDgsNTl9LHs3LDQsNX0sezcsOCw0MX0sezcsNiwxNn0sezksOSw5NjB9LHs3LDQsNn0sezcsOCwzMX0sezcsNSw4fSwKK3s3LDgsNTd9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjJ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSwKK3s3LDcsMjZ9LHs3LDUsOX0sezksOSw3MDR9LHs3LDQsNn0sezcsOCwzN30sezksNSwxMjh9LHs3LDcsMjV9LHs3LDYsMTV9LHs5LDgsMzIwfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezcsNywxOH0sezcsNCw1fSx7Nyw3LDIxfSx7Nyw2LDE3fSx7OSw3LDI1Nn0sezcsNCw2fSwKK3s3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezExLDExLDE3OTJ9LHs3LDQsM30sCit7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sezksNiwxNjY0fSx7Nyw0LDZ9LHs3LDcsMjB9LHs5LDUsMTI4fSx7Nyw3LDI0fSx7Nyw2LDE0fSwKK3s3LDcsMjh9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjN9LHs3LDQsM30sezcsNywyN30sezcsNCw1fSx7Nyw4LDQwfSx7Nyw2LDE2fSwKK3s5LDksODMyfSx7Nyw0LDZ9LHs3LDcsMTl9LHs3LDUsOH0sezcsOCw1Nn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw4LDQ2fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsOCw1NH0sezcsNSw5fSx7OSw4LDUxMn0sezcsNCw2fSx7Nyw4LDM2fSx7OSw1LDEyOH0sCit7Nyw4LDUyfSx7Nyw2LDE1fSx7Nyw4LDB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezksOSwxNjAwfSx7Nyw0LDV9LAorezcsOCw0NH0sezcsNiwxN30sezksOSwxMzQ0fSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7Nyw4LDMwfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sCit7Nyw4LDM0fSx7OSw1LDEyOH0sezcsOCw1MH0sezcsNiwxNH0sezcsOCw2Mn0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0OH0sezcsNCwzfSwKK3s3LDgsNjB9LHs3LDQsNX0sezcsOCw0Mn0sezcsNiwxNn0sezksOSwxMDg4fSx7Nyw0LDZ9LHs3LDgsMzJ9LHs3LDUsOH0sezcsOCw1OH0sezksNSw2NH0sCit7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw3LDIyfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNywyNn0sezcsNSw5fSwKK3s5LDgsNjQwfSx7Nyw0LDZ9LHs3LDgsMzh9LHs5LDUsMTI4fSx7Nyw3LDI1fSx7Nyw2LDE1fSx7OSw4LDM4NH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw2LDEzfSx7Nyw0LDN9LHs3LDcsMTh9LHs3LDQsNX0sezcsNywyMX0sezcsNiwxN30sezksNywyNTZ9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LAorezksNiwxOTJ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHswLDAsMH0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LAorezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsNywyMH0sezksNSwxMjh9LHs3LDcsMjR9LHs3LDYsMTR9LHs3LDcsMjh9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsNywyM30sezcsNCwzfSx7Nyw3LDI3fSx7Nyw0LDV9LHs3LDgsMzl9LHs3LDYsMTZ9LHs5LDgsNTc2fSx7Nyw0LDZ9LAorezcsNywxOX0sezcsNSw4fSx7Nyw4LDU1fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ1fSx7Nyw0LDN9LAorezcsNSwxMX0sezcsNCw1fSx7Nyw4LDUzfSx7Nyw1LDl9LHs5LDgsNDQ4fSx7Nyw0LDZ9LHs3LDgsMzV9LHs5LDUsMTI4fSx7Nyw4LDUxfSx7Nyw2LDE1fSwKK3s3LDgsNjN9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezksOSwxNTM2fSx7Nyw0LDV9LHs3LDgsNDN9LHs3LDYsMTd9LAorezksOSwxMjgwfSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw4LDI5fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsOCwzM30sezksNSwxMjh9LAorezcsOCw0OX0sezcsNiwxNH0sezcsOCw2MX0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0N30sezcsNCwzfSx7Nyw4LDU5fSx7Nyw0LDV9LAorezcsOCw0MX0sezcsNiwxNn0sezksOSwxMDI0fSx7Nyw0LDZ9LHs3LDgsMzF9LHs3LDUsOH0sezcsOCw1N30sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7Nyw3LDIyfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNywyNn0sezcsNSw5fSx7OSw5LDc2OH0sezcsNCw2fSwKK3s3LDgsMzd9LHs5LDUsMTI4fSx7Nyw3LDI1fSx7Nyw2LDE1fSx7OSw4LDMyMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSwKK3s3LDcsMTh9LHs3LDQsNX0sezcsNywyMX0sezcsNiwxN30sezksNywyNTZ9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSwKK3s3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHsxMSwxMSwxODU2fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSwKK3s5LDYsMTY2NH0sezcsNCw2fSx7Nyw3LDIwfSx7OSw1LDEyOH0sezcsNywyNH0sezcsNiwxNH0sezcsNywyOH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw3LDIzfSx7Nyw0LDN9LHs3LDcsMjd9LHs3LDQsNX0sezcsOCw0MH0sezcsNiwxNn0sezksOSw4OTZ9LHs3LDQsNn0sezcsNywxOX0sezcsNSw4fSwKK3s3LDgsNTZ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDZ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSwKK3s3LDgsNTR9LHs3LDUsOX0sezksOCw1MTJ9LHs3LDQsNn0sezcsOCwzNn0sezksNSwxMjh9LHs3LDgsNTJ9LHs3LDYsMTV9LHs3LDgsMH0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LHs5LDksMTcyOH0sezcsNCw1fSx7Nyw4LDQ0fSx7Nyw2LDE3fSx7OSw5LDE0MDh9LHs3LDQsNn0sCit7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsMzB9LHs3LDQsM30sCit7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sezksNiwxNjY0fSx7Nyw0LDZ9LHs3LDgsMzR9LHs5LDUsMTI4fSx7Nyw4LDUwfSx7Nyw2LDE0fSwKK3s3LDgsNjJ9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDh9LHs3LDQsM30sezcsOCw2MH0sezcsNCw1fSx7Nyw4LDQyfSx7Nyw2LDE2fSwKK3s5LDksMTE1Mn0sezcsNCw2fSx7Nyw4LDMyfSx7Nyw1LDh9LHs3LDgsNTh9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsNywyMn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDcsMjZ9LHs3LDUsOX0sezksOCw2NDB9LHs3LDQsNn0sezcsOCwzOH0sezksNSwxMjh9LAorezcsNywyNX0sezcsNiwxNX0sezksOCwzODR9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezcsNywxOH0sezcsNCw1fSwKK3s3LDcsMjF9LHs3LDYsMTd9LHs5LDcsMjU2fSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7MCwwLDB9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSwKK3s3LDcsMjB9LHs5LDUsMTI4fSx7Nyw3LDI0fSx7Nyw2LDE0fSx7Nyw3LDI4fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw3LDIzfSx7Nyw0LDN9LAorezcsNywyN30sezcsNCw1fSx7Nyw4LDM5fSx7Nyw2LDE2fSx7OSw4LDU3Nn0sezcsNCw2fSx7Nyw3LDE5fSx7Nyw1LDh9LHs3LDgsNTV9LHs5LDUsNjR9LAorezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0NX0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDgsNTN9LHs3LDUsOX0sCit7OSw4LDQ0OH0sezcsNCw2fSx7Nyw4LDM1fSx7OSw1LDEyOH0sezcsOCw1MX0sezcsNiwxNX0sezcsOCw2M30sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw2LDEzfSx7Nyw0LDN9LHs5LDksMTQ3Mn0sezcsNCw1fSx7Nyw4LDQzfSx7Nyw2LDE3fSx7OSw5LDEyMTZ9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LAorezksNiwxOTJ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsMjl9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSwKK3s3LDYsMTJ9LHs3LDUsOX0sezksNiwxNjY0fSx7Nyw0LDZ9LHs3LDgsMzN9LHs5LDUsMTI4fSx7Nyw4LDQ5fSx7Nyw2LDE0fSx7Nyw4LDYxfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDd9LHs3LDQsM30sezcsOCw1OX0sezcsNCw1fSx7Nyw4LDQxfSx7Nyw2LDE2fSx7OSw5LDk2MH0sezcsNCw2fSwKK3s3LDgsMzF9LHs3LDUsOH0sezcsOCw1N30sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyMn0sezcsNCwzfSwKK3s3LDUsMTF9LHs3LDQsNX0sezcsNywyNn0sezcsNSw5fSx7OSw5LDcwNH0sezcsNCw2fSx7Nyw4LDM3fSx7OSw1LDEyOH0sezcsNywyNX0sezcsNiwxNX0sCit7OSw4LDMyMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7Nyw3LDE4fSx7Nyw0LDV9LHs3LDcsMjF9LHs3LDYsMTd9LAorezksNywyNTZ9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3sxMSwxMiwyMTEyfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsNywyMH0sezksNSwxMjh9LAorezcsNywyNH0sezcsNiwxNH0sezcsNywyOH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyM30sezcsNCwzfSx7Nyw3LDI3fSx7Nyw0LDV9LAorezcsOCw0MH0sezcsNiwxNn0sezksOSw4MzJ9LHs3LDQsNn0sezcsNywxOX0sezcsNSw4fSx7Nyw4LDU2fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDZ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw4LDU0fSx7Nyw1LDl9LHs5LDgsNTEyfSx7Nyw0LDZ9LAorezcsOCwzNn0sezksNSwxMjh9LHs3LDgsNTJ9LHs3LDYsMTV9LHs3LDgsMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSwKK3s5LDksMTYwMH0sezcsNCw1fSx7Nyw4LDQ0fSx7Nyw2LDE3fSx7OSw5LDEzNDR9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSwKK3s3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsMzB9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LAorezksNiwxNjY0fSx7Nyw0LDZ9LHs3LDgsMzR9LHs5LDUsMTI4fSx7Nyw4LDUwfSx7Nyw2LDE0fSx7Nyw4LDYyfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDgsNDh9LHs3LDQsM30sezcsOCw2MH0sezcsNCw1fSx7Nyw4LDQyfSx7Nyw2LDE2fSx7OSw5LDEwODh9LHs3LDQsNn0sezcsOCwzMn0sezcsNSw4fSwKK3s3LDgsNTh9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjJ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSwKK3s3LDcsMjZ9LHs3LDUsOX0sezksOCw2NDB9LHs3LDQsNn0sezcsOCwzOH0sezksNSwxMjh9LHs3LDcsMjV9LHs3LDYsMTV9LHs5LDgsMzg0fSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezcsNywxOH0sezcsNCw1fSx7Nyw3LDIxfSx7Nyw2LDE3fSx7OSw3LDI1Nn0sezcsNCw2fSwKK3s3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezAsMCwwfSx7Nyw0LDN9LAorezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw3LDIwfSx7OSw1LDEyOH0sezcsNywyNH0sezcsNiwxNH0sCit7Nyw3LDI4fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw3LDIzfSx7Nyw0LDN9LHs3LDcsMjd9LHs3LDQsNX0sezcsOCwzOX0sezcsNiwxNn0sCit7OSw4LDU3Nn0sezcsNCw2fSx7Nyw3LDE5fSx7Nyw1LDh9LHs3LDgsNTV9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsOCw0NX0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDgsNTN9LHs3LDUsOX0sezksOCw0NDh9LHs3LDQsNn0sezcsOCwzNX0sezksNSwxMjh9LAorezcsOCw1MX0sezcsNiwxNX0sezcsOCw2M30sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7OSw5LDE1MzZ9LHs3LDQsNX0sCit7Nyw4LDQzfSx7Nyw2LDE3fSx7OSw5LDEyODB9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDgsMjl9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSwKK3s3LDgsMzN9LHs5LDUsMTI4fSx7Nyw4LDQ5fSx7Nyw2LDE0fSx7Nyw4LDYxfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ3fSx7Nyw0LDN9LAorezcsOCw1OX0sezcsNCw1fSx7Nyw4LDQxfSx7Nyw2LDE2fSx7OSw5LDEwMjR9LHs3LDQsNn0sezcsOCwzMX0sezcsNSw4fSx7Nyw4LDU3fSx7OSw1LDY0fSwKK3s3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjJ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw3LDI2fSx7Nyw1LDl9LAorezksOSw3Njh9LHs3LDQsNn0sezcsOCwzN30sezksNSwxMjh9LHs3LDcsMjV9LHs3LDYsMTV9LHs5LDgsMzIwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDYsMTN9LHs3LDQsM30sezcsNywxOH0sezcsNCw1fSx7Nyw3LDIxfSx7Nyw2LDE3fSx7OSw3LDI1Nn0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sCit7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezExLDEyLDIzNjh9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSwKK3s3LDYsMTJ9LHs3LDUsOX0sezksNiwxNjY0fSx7Nyw0LDZ9LHs3LDcsMjB9LHs5LDUsMTI4fSx7Nyw3LDI0fSx7Nyw2LDE0fSx7Nyw3LDI4fSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjN9LHs3LDQsM30sezcsNywyN30sezcsNCw1fSx7Nyw4LDQwfSx7Nyw2LDE2fSx7OSw5LDg5Nn0sezcsNCw2fSwKK3s3LDcsMTl9LHs3LDUsOH0sezcsOCw1Nn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0Nn0sezcsNCwzfSwKK3s3LDUsMTF9LHs3LDQsNX0sezcsOCw1NH0sezcsNSw5fSx7OSw4LDUxMn0sezcsNCw2fSx7Nyw4LDM2fSx7OSw1LDEyOH0sezcsOCw1Mn0sezcsNiwxNX0sCit7Nyw4LDB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezksOSwxNzI4fSx7Nyw0LDV9LHs3LDgsNDR9LHs3LDYsMTd9LAorezksOSwxNDA4fSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw4LDMwfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsOCwzNH0sezksNSwxMjh9LAorezcsOCw1MH0sezcsNiwxNH0sezcsOCw2Mn0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0OH0sezcsNCwzfSx7Nyw4LDYwfSx7Nyw0LDV9LAorezcsOCw0Mn0sezcsNiwxNn0sezksOSwxMTUyfSx7Nyw0LDZ9LHs3LDgsMzJ9LHs3LDUsOH0sezcsOCw1OH0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7Nyw3LDIyfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNywyNn0sezcsNSw5fSx7OSw4LDY0MH0sezcsNCw2fSwKK3s3LDgsMzh9LHs5LDUsMTI4fSx7Nyw3LDI1fSx7Nyw2LDE1fSx7OSw4LDM4NH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSwKK3s3LDcsMTh9LHs3LDQsNX0sezcsNywyMX0sezcsNiwxN30sezksNywyNTZ9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSwKK3s3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHswLDAsMH0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sCit7OSw2LDE2NjR9LHs3LDQsNn0sezcsNywyMH0sezksNSwxMjh9LHs3LDcsMjR9LHs3LDYsMTR9LHs3LDcsMjh9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsNywyM30sezcsNCwzfSx7Nyw3LDI3fSx7Nyw0LDV9LHs3LDgsMzl9LHs3LDYsMTZ9LHs5LDgsNTc2fSx7Nyw0LDZ9LHs3LDcsMTl9LHs3LDUsOH0sCit7Nyw4LDU1fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ1fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sCit7Nyw4LDUzfSx7Nyw1LDl9LHs5LDgsNDQ4fSx7Nyw0LDZ9LHs3LDgsMzV9LHs5LDUsMTI4fSx7Nyw4LDUxfSx7Nyw2LDE1fSx7Nyw4LDYzfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezksOSwxNDcyfSx7Nyw0LDV9LHs3LDgsNDN9LHs3LDYsMTd9LHs5LDksMTIxNn0sezcsNCw2fSwKK3s3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCwyOX0sezcsNCwzfSwKK3s3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsOCwzM30sezksNSwxMjh9LHs3LDgsNDl9LHs3LDYsMTR9LAorezcsOCw2MX0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0N30sezcsNCwzfSx7Nyw4LDU5fSx7Nyw0LDV9LHs3LDgsNDF9LHs3LDYsMTZ9LAorezksOSw5NjB9LHs3LDQsNn0sezcsOCwzMX0sezcsNSw4fSx7Nyw4LDU3fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDcsMjJ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw3LDI2fSx7Nyw1LDl9LHs5LDksNzA0fSx7Nyw0LDZ9LHs3LDgsMzd9LHs5LDUsMTI4fSwKK3s3LDcsMjV9LHs3LDYsMTV9LHs5LDgsMzIwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LHs3LDcsMTh9LHs3LDQsNX0sCit7Nyw3LDIxfSx7Nyw2LDE3fSx7OSw3LDI1Nn0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezExLDEyLDE5ODR9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSwKK3s3LDcsMjB9LHs5LDUsMTI4fSx7Nyw3LDI0fSx7Nyw2LDE0fSx7Nyw3LDI4fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw3LDIzfSx7Nyw0LDN9LAorezcsNywyN30sezcsNCw1fSx7Nyw4LDQwfSx7Nyw2LDE2fSx7OSw5LDgzMn0sezcsNCw2fSx7Nyw3LDE5fSx7Nyw1LDh9LHs3LDgsNTZ9LHs5LDUsNjR9LAorezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0Nn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDgsNTR9LHs3LDUsOX0sCit7OSw4LDUxMn0sezcsNCw2fSx7Nyw4LDM2fSx7OSw1LDEyOH0sezcsOCw1Mn0sezcsNiwxNX0sezcsOCwwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDYsMTN9LHs3LDQsM30sezksOSwxNjAwfSx7Nyw0LDV9LHs3LDgsNDR9LHs3LDYsMTd9LHs5LDksMTM0NH0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sCit7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCwzMH0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LAorezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsOCwzNH0sezksNSwxMjh9LHs3LDgsNTB9LHs3LDYsMTR9LHs3LDgsNjJ9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsOCw0OH0sezcsNCwzfSx7Nyw4LDYwfSx7Nyw0LDV9LHs3LDgsNDJ9LHs3LDYsMTZ9LHs5LDksMTA4OH0sezcsNCw2fSwKK3s3LDgsMzJ9LHs3LDUsOH0sezcsOCw1OH0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyMn0sezcsNCwzfSwKK3s3LDUsMTF9LHs3LDQsNX0sezcsNywyNn0sezcsNSw5fSx7OSw4LDY0MH0sezcsNCw2fSx7Nyw4LDM4fSx7OSw1LDEyOH0sezcsNywyNX0sezcsNiwxNX0sCit7OSw4LDM4NH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7Nyw3LDE4fSx7Nyw0LDV9LHs3LDcsMjF9LHs3LDYsMTd9LAorezksNywyNTZ9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3swLDAsMH0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sezksNiwxNjY0fSx7Nyw0LDZ9LHs3LDcsMjB9LHs5LDUsMTI4fSwKK3s3LDcsMjR9LHs3LDYsMTR9LHs3LDcsMjh9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjN9LHs3LDQsM30sezcsNywyN30sezcsNCw1fSwKK3s3LDgsMzl9LHs3LDYsMTZ9LHs5LDgsNTc2fSx7Nyw0LDZ9LHs3LDcsMTl9LHs3LDUsOH0sezcsOCw1NX0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7Nyw4LDQ1fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsOCw1M30sezcsNSw5fSx7OSw4LDQ0OH0sezcsNCw2fSwKK3s3LDgsMzV9LHs5LDUsMTI4fSx7Nyw4LDUxfSx7Nyw2LDE1fSx7Nyw4LDYzfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LAorezksOSwxNTM2fSx7Nyw0LDV9LHs3LDgsNDN9LHs3LDYsMTd9LHs5LDksMTI4MH0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LAorezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCwyOX0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sCit7OSw2LDE2NjR9LHs3LDQsNn0sezcsOCwzM30sezksNSwxMjh9LHs3LDgsNDl9LHs3LDYsMTR9LHs3LDgsNjF9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsOCw0N30sezcsNCwzfSx7Nyw4LDU5fSx7Nyw0LDV9LHs3LDgsNDF9LHs3LDYsMTZ9LHs5LDksMTAyNH0sezcsNCw2fSx7Nyw4LDMxfSx7Nyw1LDh9LAorezcsOCw1N30sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyMn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LAorezcsNywyNn0sezcsNSw5fSx7OSw5LDc2OH0sezcsNCw2fSx7Nyw4LDM3fSx7OSw1LDEyOH0sezcsNywyNX0sezcsNiwxNX0sezksOCwzMjB9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7Nyw3LDE4fSx7Nyw0LDV9LHs3LDcsMjF9LHs3LDYsMTd9LHs5LDcsMjU2fSx7Nyw0LDZ9LAorezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7MTEsMTEsMTkyMH0sezcsNCwzfSwKK3s3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsNywyMH0sezksNSwxMjh9LHs3LDcsMjR9LHs3LDYsMTR9LAorezcsNywyOH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyM30sezcsNCwzfSx7Nyw3LDI3fSx7Nyw0LDV9LHs3LDgsNDB9LHs3LDYsMTZ9LAorezksOSw4OTZ9LHs3LDQsNn0sezcsNywxOX0sezcsNSw4fSx7Nyw4LDU2fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDgsNDZ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw4LDU0fSx7Nyw1LDl9LHs5LDgsNTEyfSx7Nyw0LDZ9LHs3LDgsMzZ9LHs5LDUsMTI4fSwKK3s3LDgsNTJ9LHs3LDYsMTV9LHs3LDgsMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7OSw5LDE3Mjh9LHs3LDQsNX0sCit7Nyw4LDQ0fSx7Nyw2LDE3fSx7OSw5LDE0MDh9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDgsMzB9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSwKK3s3LDgsMzR9LHs5LDUsMTI4fSx7Nyw4LDUwfSx7Nyw2LDE0fSx7Nyw4LDYyfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ4fSx7Nyw0LDN9LAorezcsOCw2MH0sezcsNCw1fSx7Nyw4LDQyfSx7Nyw2LDE2fSx7OSw5LDExNTJ9LHs3LDQsNn0sezcsOCwzMn0sezcsNSw4fSx7Nyw4LDU4fSx7OSw1LDY0fSwKK3s3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjJ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw3LDI2fSx7Nyw1LDl9LAorezksOCw2NDB9LHs3LDQsNn0sezcsOCwzOH0sezksNSwxMjh9LHs3LDcsMjV9LHs3LDYsMTV9LHs5LDgsMzg0fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDYsMTN9LHs3LDQsM30sezcsNywxOH0sezcsNCw1fSx7Nyw3LDIxfSx7Nyw2LDE3fSx7OSw3LDI1Nn0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sCit7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezAsMCwwfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sCit7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw3LDIwfSx7OSw1LDEyOH0sezcsNywyNH0sezcsNiwxNH0sezcsNywyOH0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7Nyw3LDIzfSx7Nyw0LDN9LHs3LDcsMjd9LHs3LDQsNX0sezcsOCwzOX0sezcsNiwxNn0sezksOCw1NzZ9LHs3LDQsNn0sCit7Nyw3LDE5fSx7Nyw1LDh9LHs3LDgsNTV9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDV9LHs3LDQsM30sCit7Nyw1LDExfSx7Nyw0LDV9LHs3LDgsNTN9LHs3LDUsOX0sezksOCw0NDh9LHs3LDQsNn0sezcsOCwzNX0sezksNSwxMjh9LHs3LDgsNTF9LHs3LDYsMTV9LAorezcsOCw2M30sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7OSw5LDE0NzJ9LHs3LDQsNX0sezcsOCw0M30sezcsNiwxN30sCit7OSw5LDEyMTZ9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDgsMjl9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw4LDMzfSx7OSw1LDEyOH0sCit7Nyw4LDQ5fSx7Nyw2LDE0fSx7Nyw4LDYxfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ3fSx7Nyw0LDN9LHs3LDgsNTl9LHs3LDQsNX0sCit7Nyw4LDQxfSx7Nyw2LDE2fSx7OSw5LDk2MH0sezcsNCw2fSx7Nyw4LDMxfSx7Nyw1LDh9LHs3LDgsNTd9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsNywyMn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDcsMjZ9LHs3LDUsOX0sezksOSw3MDR9LHs3LDQsNn0sCit7Nyw4LDM3fSx7OSw1LDEyOH0sezcsNywyNX0sezcsNiwxNX0sezksOCwzMjB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sCit7Nyw3LDE4fSx7Nyw0LDV9LHs3LDcsMjF9LHs3LDYsMTd9LHs5LDcsMjU2fSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sCit7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7MTEsMTIsMjI0MH0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sCit7OSw2LDE2NjR9LHs3LDQsNn0sezcsNywyMH0sezksNSwxMjh9LHs3LDcsMjR9LHs3LDYsMTR9LHs3LDcsMjh9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsNywyM30sezcsNCwzfSx7Nyw3LDI3fSx7Nyw0LDV9LHs3LDgsNDB9LHs3LDYsMTZ9LHs5LDksODMyfSx7Nyw0LDZ9LHs3LDcsMTl9LHs3LDUsOH0sCit7Nyw4LDU2fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ2fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sCit7Nyw4LDU0fSx7Nyw1LDl9LHs5LDgsNTEyfSx7Nyw0LDZ9LHs3LDgsMzZ9LHs5LDUsMTI4fSx7Nyw4LDUyfSx7Nyw2LDE1fSx7Nyw4LDB9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7OSw5LDE2MDB9LHs3LDQsNX0sezcsOCw0NH0sezcsNiwxN30sezksOSwxMzQ0fSx7Nyw0LDZ9LAorezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDMwfSx7Nyw0LDN9LAorezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw4LDM0fSx7OSw1LDEyOH0sezcsOCw1MH0sezcsNiwxNH0sCit7Nyw4LDYyfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ4fSx7Nyw0LDN9LHs3LDgsNjB9LHs3LDQsNX0sezcsOCw0Mn0sezcsNiwxNn0sCit7OSw5LDEwODh9LHs3LDQsNn0sezcsOCwzMn0sezcsNSw4fSx7Nyw4LDU4fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDcsMjJ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw3LDI2fSx7Nyw1LDl9LHs5LDgsNjQwfSx7Nyw0LDZ9LHs3LDgsMzh9LHs5LDUsMTI4fSwKK3s3LDcsMjV9LHs3LDYsMTV9LHs5LDgsMzg0fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LHs3LDcsMTh9LHs3LDQsNX0sCit7Nyw3LDIxfSx7Nyw2LDE3fSx7OSw3LDI1Nn0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezAsMCwwfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sCit7Nyw3LDIwfSx7OSw1LDEyOH0sezcsNywyNH0sezcsNiwxNH0sezcsNywyOH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyM30sezcsNCwzfSwKK3s3LDcsMjd9LHs3LDQsNX0sezcsOCwzOX0sezcsNiwxNn0sezksOCw1NzZ9LHs3LDQsNn0sezcsNywxOX0sezcsNSw4fSx7Nyw4LDU1fSx7OSw1LDY0fSwKK3s3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDV9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw4LDUzfSx7Nyw1LDl9LAorezksOCw0NDh9LHs3LDQsNn0sezcsOCwzNX0sezksNSwxMjh9LHs3LDgsNTF9LHs3LDYsMTV9LHs3LDgsNjN9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsNiwxM30sezcsNCwzfSx7OSw5LDE1MzZ9LHs3LDQsNX0sezcsOCw0M30sezcsNiwxN30sezksOSwxMjgwfSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSwKK3s5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDI5fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sCit7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw4LDMzfSx7OSw1LDEyOH0sezcsOCw0OX0sezcsNiwxNH0sezcsOCw2MX0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7Nyw4LDQ3fSx7Nyw0LDN9LHs3LDgsNTl9LHs3LDQsNX0sezcsOCw0MX0sezcsNiwxNn0sezksOSwxMDI0fSx7Nyw0LDZ9LAorezcsOCwzMX0sezcsNSw4fSx7Nyw4LDU3fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw3LDIyfSx7Nyw0LDN9LAorezcsNSwxMX0sezcsNCw1fSx7Nyw3LDI2fSx7Nyw1LDl9LHs5LDksNzY4fSx7Nyw0LDZ9LHs3LDgsMzd9LHs5LDUsMTI4fSx7Nyw3LDI1fSx7Nyw2LDE1fSwKK3s5LDgsMzIwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LHs3LDcsMTh9LHs3LDQsNX0sezcsNywyMX0sezcsNiwxN30sCit7OSw3LDI1Nn0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezExLDEyLDI0OTZ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw3LDIwfSx7OSw1LDEyOH0sCit7Nyw3LDI0fSx7Nyw2LDE0fSx7Nyw3LDI4fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw3LDIzfSx7Nyw0LDN9LHs3LDcsMjd9LHs3LDQsNX0sCit7Nyw4LDQwfSx7Nyw2LDE2fSx7OSw5LDg5Nn0sezcsNCw2fSx7Nyw3LDE5fSx7Nyw1LDh9LHs3LDgsNTZ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsOCw0Nn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDgsNTR9LHs3LDUsOX0sezksOCw1MTJ9LHs3LDQsNn0sCit7Nyw4LDM2fSx7OSw1LDEyOH0sezcsOCw1Mn0sezcsNiwxNX0sezcsOCwwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LAorezksOSwxNzI4fSx7Nyw0LDV9LHs3LDgsNDR9LHs3LDYsMTd9LHs5LDksMTQwOH0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LAorezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCwzMH0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sCit7OSw2LDE2NjR9LHs3LDQsNn0sezcsOCwzNH0sezksNSwxMjh9LHs3LDgsNTB9LHs3LDYsMTR9LHs3LDgsNjJ9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsOCw0OH0sezcsNCwzfSx7Nyw4LDYwfSx7Nyw0LDV9LHs3LDgsNDJ9LHs3LDYsMTZ9LHs5LDksMTE1Mn0sezcsNCw2fSx7Nyw4LDMyfSx7Nyw1LDh9LAorezcsOCw1OH0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyMn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LAorezcsNywyNn0sezcsNSw5fSx7OSw4LDY0MH0sezcsNCw2fSx7Nyw4LDM4fSx7OSw1LDEyOH0sezcsNywyNX0sezcsNiwxNX0sezksOCwzODR9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7Nyw3LDE4fSx7Nyw0LDV9LHs3LDcsMjF9LHs3LDYsMTd9LHs5LDcsMjU2fSx7Nyw0LDZ9LAorezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7MTIsMTEsMH0sezcsNCwzfSwKK3s3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsNywyMH0sezksNSwxMjh9LHs3LDcsMjR9LHs3LDYsMTR9LAorezcsNywyOH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyM30sezcsNCwzfSx7Nyw3LDI3fSx7Nyw0LDV9LHs3LDgsMzl9LHs3LDYsMTZ9LAorezksOCw1NzZ9LHs3LDQsNn0sezcsNywxOX0sezcsNSw4fSx7Nyw4LDU1fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDgsNDV9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw4LDUzfSx7Nyw1LDl9LHs5LDgsNDQ4fSx7Nyw0LDZ9LHs3LDgsMzV9LHs5LDUsMTI4fSwKK3s3LDgsNTF9LHs3LDYsMTV9LHs3LDgsNjN9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezksOSwxNDcyfSx7Nyw0LDV9LAorezcsOCw0M30sezcsNiwxN30sezksOSwxMjE2fSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7Nyw4LDI5fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sCit7Nyw4LDMzfSx7OSw1LDEyOH0sezcsOCw0OX0sezcsNiwxNH0sezcsOCw2MX0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0N30sezcsNCwzfSwKK3s3LDgsNTl9LHs3LDQsNX0sezcsOCw0MX0sezcsNiwxNn0sezksOSw5NjB9LHs3LDQsNn0sezcsOCwzMX0sezcsNSw4fSx7Nyw4LDU3fSx7OSw1LDY0fSwKK3s3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjJ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw3LDI2fSx7Nyw1LDl9LAorezksOSw3MDR9LHs3LDQsNn0sezcsOCwzN30sezksNSwxMjh9LHs3LDcsMjV9LHs3LDYsMTV9LHs5LDgsMzIwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDYsMTN9LHs3LDQsM30sezcsNywxOH0sezcsNCw1fSx7Nyw3LDIxfSx7Nyw2LDE3fSx7OSw3LDI1Nn0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sCit7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezExLDExLDE3OTJ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSwKK3s3LDYsMTJ9LHs3LDUsOX0sezksNiwxNjY0fSx7Nyw0LDZ9LHs3LDcsMjB9LHs5LDUsMTI4fSx7Nyw3LDI0fSx7Nyw2LDE0fSx7Nyw3LDI4fSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjN9LHs3LDQsM30sezcsNywyN30sezcsNCw1fSx7Nyw4LDQwfSx7Nyw2LDE2fSx7OSw5LDgzMn0sezcsNCw2fSwKK3s3LDcsMTl9LHs3LDUsOH0sezcsOCw1Nn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0Nn0sezcsNCwzfSwKK3s3LDUsMTF9LHs3LDQsNX0sezcsOCw1NH0sezcsNSw5fSx7OSw4LDUxMn0sezcsNCw2fSx7Nyw4LDM2fSx7OSw1LDEyOH0sezcsOCw1Mn0sezcsNiwxNX0sCit7Nyw4LDB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezksOSwxNjAwfSx7Nyw0LDV9LHs3LDgsNDR9LHs3LDYsMTd9LAorezksOSwxMzQ0fSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw4LDMwfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsOCwzNH0sezksNSwxMjh9LAorezcsOCw1MH0sezcsNiwxNH0sezcsOCw2Mn0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0OH0sezcsNCwzfSx7Nyw4LDYwfSx7Nyw0LDV9LAorezcsOCw0Mn0sezcsNiwxNn0sezksOSwxMDg4fSx7Nyw0LDZ9LHs3LDgsMzJ9LHs3LDUsOH0sezcsOCw1OH0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7Nyw3LDIyfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNywyNn0sezcsNSw5fSx7OSw4LDY0MH0sezcsNCw2fSwKK3s3LDgsMzh9LHs5LDUsMTI4fSx7Nyw3LDI1fSx7Nyw2LDE1fSx7OSw4LDM4NH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSwKK3s3LDcsMTh9LHs3LDQsNX0sezcsNywyMX0sezcsNiwxN30sezksNywyNTZ9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSwKK3s3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHswLDAsMH0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sCit7OSw2LDE2NjR9LHs3LDQsNn0sezcsNywyMH0sezksNSwxMjh9LHs3LDcsMjR9LHs3LDYsMTR9LHs3LDcsMjh9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsNywyM30sezcsNCwzfSx7Nyw3LDI3fSx7Nyw0LDV9LHs3LDgsMzl9LHs3LDYsMTZ9LHs5LDgsNTc2fSx7Nyw0LDZ9LHs3LDcsMTl9LHs3LDUsOH0sCit7Nyw4LDU1fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ1fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sCit7Nyw4LDUzfSx7Nyw1LDl9LHs5LDgsNDQ4fSx7Nyw0LDZ9LHs3LDgsMzV9LHs5LDUsMTI4fSx7Nyw4LDUxfSx7Nyw2LDE1fSx7Nyw4LDYzfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezksOSwxNTM2fSx7Nyw0LDV9LHs3LDgsNDN9LHs3LDYsMTd9LHs5LDksMTI4MH0sezcsNCw2fSwKK3s3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCwyOX0sezcsNCwzfSwKK3s3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsOCwzM30sezksNSwxMjh9LHs3LDgsNDl9LHs3LDYsMTR9LAorezcsOCw2MX0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0N30sezcsNCwzfSx7Nyw4LDU5fSx7Nyw0LDV9LHs3LDgsNDF9LHs3LDYsMTZ9LAorezksOSwxMDI0fSx7Nyw0LDZ9LHs3LDgsMzF9LHs3LDUsOH0sezcsOCw1N30sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw3LDIyfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNywyNn0sezcsNSw5fSx7OSw5LDc2OH0sezcsNCw2fSx7Nyw4LDM3fSx7OSw1LDEyOH0sCit7Nyw3LDI1fSx7Nyw2LDE1fSx7OSw4LDMyMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7Nyw3LDE4fSx7Nyw0LDV9LAorezcsNywyMX0sezcsNiwxN30sezksNywyNTZ9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHsxMSwxMSwxODU2fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sCit7Nyw3LDIwfSx7OSw1LDEyOH0sezcsNywyNH0sezcsNiwxNH0sezcsNywyOH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyM30sezcsNCwzfSwKK3s3LDcsMjd9LHs3LDQsNX0sezcsOCw0MH0sezcsNiwxNn0sezksOSw4OTZ9LHs3LDQsNn0sezcsNywxOX0sezcsNSw4fSx7Nyw4LDU2fSx7OSw1LDY0fSwKK3s3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDZ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw4LDU0fSx7Nyw1LDl9LAorezksOCw1MTJ9LHs3LDQsNn0sezcsOCwzNn0sezksNSwxMjh9LHs3LDgsNTJ9LHs3LDYsMTV9LHs3LDgsMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw2LDEzfSx7Nyw0LDN9LHs5LDksMTcyOH0sezcsNCw1fSx7Nyw4LDQ0fSx7Nyw2LDE3fSx7OSw5LDE0MDh9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LAorezksNiwxOTJ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsMzB9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSwKK3s3LDYsMTJ9LHs3LDUsOX0sezksNiwxNjY0fSx7Nyw0LDZ9LHs3LDgsMzR9LHs5LDUsMTI4fSx7Nyw4LDUwfSx7Nyw2LDE0fSx7Nyw4LDYyfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDh9LHs3LDQsM30sezcsOCw2MH0sezcsNCw1fSx7Nyw4LDQyfSx7Nyw2LDE2fSx7OSw5LDExNTJ9LHs3LDQsNn0sCit7Nyw4LDMyfSx7Nyw1LDh9LHs3LDgsNTh9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjJ9LHs3LDQsM30sCit7Nyw1LDExfSx7Nyw0LDV9LHs3LDcsMjZ9LHs3LDUsOX0sezksOCw2NDB9LHs3LDQsNn0sezcsOCwzOH0sezksNSwxMjh9LHs3LDcsMjV9LHs3LDYsMTV9LAorezksOCwzODR9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezcsNywxOH0sezcsNCw1fSx7Nyw3LDIxfSx7Nyw2LDE3fSwKK3s5LDcsMjU2fSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7MCwwLDB9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw3LDIwfSx7OSw1LDEyOH0sCit7Nyw3LDI0fSx7Nyw2LDE0fSx7Nyw3LDI4fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw3LDIzfSx7Nyw0LDN9LHs3LDcsMjd9LHs3LDQsNX0sCit7Nyw4LDM5fSx7Nyw2LDE2fSx7OSw4LDU3Nn0sezcsNCw2fSx7Nyw3LDE5fSx7Nyw1LDh9LHs3LDgsNTV9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsOCw0NX0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDgsNTN9LHs3LDUsOX0sezksOCw0NDh9LHs3LDQsNn0sCit7Nyw4LDM1fSx7OSw1LDEyOH0sezcsOCw1MX0sezcsNiwxNX0sezcsOCw2M30sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSwKK3s5LDksMTQ3Mn0sezcsNCw1fSx7Nyw4LDQzfSx7Nyw2LDE3fSx7OSw5LDEyMTZ9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSwKK3s3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsMjl9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LAorezksNiwxNjY0fSx7Nyw0LDZ9LHs3LDgsMzN9LHs5LDUsMTI4fSx7Nyw4LDQ5fSx7Nyw2LDE0fSx7Nyw4LDYxfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDgsNDd9LHs3LDQsM30sezcsOCw1OX0sezcsNCw1fSx7Nyw4LDQxfSx7Nyw2LDE2fSx7OSw5LDk2MH0sezcsNCw2fSx7Nyw4LDMxfSx7Nyw1LDh9LAorezcsOCw1N30sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyMn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LAorezcsNywyNn0sezcsNSw5fSx7OSw5LDcwNH0sezcsNCw2fSx7Nyw4LDM3fSx7OSw1LDEyOH0sezcsNywyNX0sezcsNiwxNX0sezksOCwzMjB9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7Nyw3LDE4fSx7Nyw0LDV9LHs3LDcsMjF9LHs3LDYsMTd9LHs5LDcsMjU2fSx7Nyw0LDZ9LAorezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7MTEsMTIsMjE3Nn0sezcsNCwzfSwKK3s3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsNywyMH0sezksNSwxMjh9LHs3LDcsMjR9LHs3LDYsMTR9LAorezcsNywyOH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyM30sezcsNCwzfSx7Nyw3LDI3fSx7Nyw0LDV9LHs3LDgsNDB9LHs3LDYsMTZ9LAorezksOSw4MzJ9LHs3LDQsNn0sezcsNywxOX0sezcsNSw4fSx7Nyw4LDU2fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDgsNDZ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw4LDU0fSx7Nyw1LDl9LHs5LDgsNTEyfSx7Nyw0LDZ9LHs3LDgsMzZ9LHs5LDUsMTI4fSwKK3s3LDgsNTJ9LHs3LDYsMTV9LHs3LDgsMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7OSw5LDE2MDB9LHs3LDQsNX0sCit7Nyw4LDQ0fSx7Nyw2LDE3fSx7OSw5LDEzNDR9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDgsMzB9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSwKK3s3LDgsMzR9LHs5LDUsMTI4fSx7Nyw4LDUwfSx7Nyw2LDE0fSx7Nyw4LDYyfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ4fSx7Nyw0LDN9LAorezcsOCw2MH0sezcsNCw1fSx7Nyw4LDQyfSx7Nyw2LDE2fSx7OSw5LDEwODh9LHs3LDQsNn0sezcsOCwzMn0sezcsNSw4fSx7Nyw4LDU4fSx7OSw1LDY0fSwKK3s3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjJ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw3LDI2fSx7Nyw1LDl9LAorezksOCw2NDB9LHs3LDQsNn0sezcsOCwzOH0sezksNSwxMjh9LHs3LDcsMjV9LHs3LDYsMTV9LHs5LDgsMzg0fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDYsMTN9LHs3LDQsM30sezcsNywxOH0sezcsNCw1fSx7Nyw3LDIxfSx7Nyw2LDE3fSx7OSw3LDI1Nn0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sCit7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezAsMCwwfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sCit7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw3LDIwfSx7OSw1LDEyOH0sezcsNywyNH0sezcsNiwxNH0sezcsNywyOH0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7Nyw3LDIzfSx7Nyw0LDN9LHs3LDcsMjd9LHs3LDQsNX0sezcsOCwzOX0sezcsNiwxNn0sezksOCw1NzZ9LHs3LDQsNn0sCit7Nyw3LDE5fSx7Nyw1LDh9LHs3LDgsNTV9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDV9LHs3LDQsM30sCit7Nyw1LDExfSx7Nyw0LDV9LHs3LDgsNTN9LHs3LDUsOX0sezksOCw0NDh9LHs3LDQsNn0sezcsOCwzNX0sezksNSwxMjh9LHs3LDgsNTF9LHs3LDYsMTV9LAorezcsOCw2M30sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7OSw5LDE1MzZ9LHs3LDQsNX0sezcsOCw0M30sezcsNiwxN30sCit7OSw5LDEyODB9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDgsMjl9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw4LDMzfSx7OSw1LDEyOH0sCit7Nyw4LDQ5fSx7Nyw2LDE0fSx7Nyw4LDYxfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ3fSx7Nyw0LDN9LHs3LDgsNTl9LHs3LDQsNX0sCit7Nyw4LDQxfSx7Nyw2LDE2fSx7OSw5LDEwMjR9LHs3LDQsNn0sezcsOCwzMX0sezcsNSw4fSx7Nyw4LDU3fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjJ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw3LDI2fSx7Nyw1LDl9LHs5LDksNzY4fSx7Nyw0LDZ9LAorezcsOCwzN30sezksNSwxMjh9LHs3LDcsMjV9LHs3LDYsMTV9LHs5LDgsMzIwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LAorezcsNywxOH0sezcsNCw1fSx7Nyw3LDIxfSx7Nyw2LDE3fSx7OSw3LDI1Nn0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LAorezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezExLDEyLDI0MzJ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LAorezksNiwxNjY0fSx7Nyw0LDZ9LHs3LDcsMjB9LHs5LDUsMTI4fSx7Nyw3LDI0fSx7Nyw2LDE0fSx7Nyw3LDI4fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDcsMjN9LHs3LDQsM30sezcsNywyN30sezcsNCw1fSx7Nyw4LDQwfSx7Nyw2LDE2fSx7OSw5LDg5Nn0sezcsNCw2fSx7Nyw3LDE5fSx7Nyw1LDh9LAorezcsOCw1Nn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0Nn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LAorezcsOCw1NH0sezcsNSw5fSx7OSw4LDUxMn0sezcsNCw2fSx7Nyw4LDM2fSx7OSw1LDEyOH0sezcsOCw1Mn0sezcsNiwxNX0sezcsOCwwfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezksOSwxNzI4fSx7Nyw0LDV9LHs3LDgsNDR9LHs3LDYsMTd9LHs5LDksMTQwOH0sezcsNCw2fSwKK3s3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCwzMH0sezcsNCwzfSwKK3s3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsOCwzNH0sezksNSwxMjh9LHs3LDgsNTB9LHs3LDYsMTR9LAorezcsOCw2Mn0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCw0OH0sezcsNCwzfSx7Nyw4LDYwfSx7Nyw0LDV9LHs3LDgsNDJ9LHs3LDYsMTZ9LAorezksOSwxMTUyfSx7Nyw0LDZ9LHs3LDgsMzJ9LHs3LDUsOH0sezcsOCw1OH0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw3LDIyfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNywyNn0sezcsNSw5fSx7OSw4LDY0MH0sezcsNCw2fSx7Nyw4LDM4fSx7OSw1LDEyOH0sCit7Nyw3LDI1fSx7Nyw2LDE1fSx7OSw4LDM4NH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7Nyw3LDE4fSx7Nyw0LDV9LAorezcsNywyMX0sezcsNiwxN30sezksNywyNTZ9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHswLDAsMH0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sezksNiwxNjY0fSx7Nyw0LDZ9LAorezcsNywyMH0sezksNSwxMjh9LHs3LDcsMjR9LHs3LDYsMTR9LHs3LDcsMjh9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjN9LHs3LDQsM30sCit7Nyw3LDI3fSx7Nyw0LDV9LHs3LDgsMzl9LHs3LDYsMTZ9LHs5LDgsNTc2fSx7Nyw0LDZ9LHs3LDcsMTl9LHs3LDUsOH0sezcsOCw1NX0sezksNSw2NH0sCit7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ1fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsOCw1M30sezcsNSw5fSwKK3s5LDgsNDQ4fSx7Nyw0LDZ9LHs3LDgsMzV9LHs5LDUsMTI4fSx7Nyw4LDUxfSx7Nyw2LDE1fSx7Nyw4LDYzfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDYsMTN9LHs3LDQsM30sezksOSwxNDcyfSx7Nyw0LDV9LHs3LDgsNDN9LHs3LDYsMTd9LHs5LDksMTIxNn0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sCit7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCwyOX0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LAorezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsOCwzM30sezksNSwxMjh9LHs3LDgsNDl9LHs3LDYsMTR9LHs3LDgsNjF9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsOCw0N30sezcsNCwzfSx7Nyw4LDU5fSx7Nyw0LDV9LHs3LDgsNDF9LHs3LDYsMTZ9LHs5LDksOTYwfSx7Nyw0LDZ9LAorezcsOCwzMX0sezcsNSw4fSx7Nyw4LDU3fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw3LDIyfSx7Nyw0LDN9LAorezcsNSwxMX0sezcsNCw1fSx7Nyw3LDI2fSx7Nyw1LDl9LHs5LDksNzA0fSx7Nyw0LDZ9LHs3LDgsMzd9LHs5LDUsMTI4fSx7Nyw3LDI1fSx7Nyw2LDE1fSwKK3s5LDgsMzIwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LHs3LDcsMTh9LHs3LDQsNX0sezcsNywyMX0sezcsNiwxN30sCit7OSw3LDI1Nn0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezExLDEyLDIwNDh9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw3LDIwfSx7OSw1LDEyOH0sCit7Nyw3LDI0fSx7Nyw2LDE0fSx7Nyw3LDI4fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw3LDIzfSx7Nyw0LDN9LHs3LDcsMjd9LHs3LDQsNX0sCit7Nyw4LDQwfSx7Nyw2LDE2fSx7OSw5LDgzMn0sezcsNCw2fSx7Nyw3LDE5fSx7Nyw1LDh9LHs3LDgsNTZ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsOCw0Nn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDgsNTR9LHs3LDUsOX0sezksOCw1MTJ9LHs3LDQsNn0sCit7Nyw4LDM2fSx7OSw1LDEyOH0sezcsOCw1Mn0sezcsNiwxNX0sezcsOCwwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LAorezksOSwxNjAwfSx7Nyw0LDV9LHs3LDgsNDR9LHs3LDYsMTd9LHs5LDksMTM0NH0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LAorezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsOCwzMH0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sCit7OSw2LDE2NjR9LHs3LDQsNn0sezcsOCwzNH0sezksNSwxMjh9LHs3LDgsNTB9LHs3LDYsMTR9LHs3LDgsNjJ9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsOCw0OH0sezcsNCwzfSx7Nyw4LDYwfSx7Nyw0LDV9LHs3LDgsNDJ9LHs3LDYsMTZ9LHs5LDksMTA4OH0sezcsNCw2fSx7Nyw4LDMyfSx7Nyw1LDh9LAorezcsOCw1OH0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyMn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LAorezcsNywyNn0sezcsNSw5fSx7OSw4LDY0MH0sezcsNCw2fSx7Nyw4LDM4fSx7OSw1LDEyOH0sezcsNywyNX0sezcsNiwxNX0sezksOCwzODR9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7Nyw3LDE4fSx7Nyw0LDV9LHs3LDcsMjF9LHs3LDYsMTd9LHs5LDcsMjU2fSx7Nyw0LDZ9LAorezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7MCwwLDB9LHs3LDQsM30sCit7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sezksNiwxNjY0fSx7Nyw0LDZ9LHs3LDcsMjB9LHs5LDUsMTI4fSx7Nyw3LDI0fSx7Nyw2LDE0fSwKK3s3LDcsMjh9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjN9LHs3LDQsM30sezcsNywyN30sezcsNCw1fSx7Nyw4LDM5fSx7Nyw2LDE2fSwKK3s5LDgsNTc2fSx7Nyw0LDZ9LHs3LDcsMTl9LHs3LDUsOH0sezcsOCw1NX0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw4LDQ1fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsOCw1M30sezcsNSw5fSx7OSw4LDQ0OH0sezcsNCw2fSx7Nyw4LDM1fSx7OSw1LDEyOH0sCit7Nyw4LDUxfSx7Nyw2LDE1fSx7Nyw4LDYzfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LHs5LDksMTUzNn0sezcsNCw1fSwKK3s3LDgsNDN9LHs3LDYsMTd9LHs5LDksMTI4MH0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsOCwyOX0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sezksNiwxNjY0fSx7Nyw0LDZ9LAorezcsOCwzM30sezksNSwxMjh9LHs3LDgsNDl9LHs3LDYsMTR9LHs3LDgsNjF9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDd9LHs3LDQsM30sCit7Nyw4LDU5fSx7Nyw0LDV9LHs3LDgsNDF9LHs3LDYsMTZ9LHs5LDksMTAyNH0sezcsNCw2fSx7Nyw4LDMxfSx7Nyw1LDh9LHs3LDgsNTd9LHs5LDUsNjR9LAorezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyMn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDcsMjZ9LHs3LDUsOX0sCit7OSw5LDc2OH0sezcsNCw2fSx7Nyw4LDM3fSx7OSw1LDEyOH0sezcsNywyNX0sezcsNiwxNX0sezksOCwzMjB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsNiwxM30sezcsNCwzfSx7Nyw3LDE4fSx7Nyw0LDV9LHs3LDcsMjF9LHs3LDYsMTd9LHs5LDcsMjU2fSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSwKK3s5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7MTEsMTEsMTkyMH0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LAorezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsNywyMH0sezksNSwxMjh9LHs3LDcsMjR9LHs3LDYsMTR9LHs3LDcsMjh9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsNywyM30sezcsNCwzfSx7Nyw3LDI3fSx7Nyw0LDV9LHs3LDgsNDB9LHs3LDYsMTZ9LHs5LDksODk2fSx7Nyw0LDZ9LAorezcsNywxOX0sezcsNSw4fSx7Nyw4LDU2fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ2fSx7Nyw0LDN9LAorezcsNSwxMX0sezcsNCw1fSx7Nyw4LDU0fSx7Nyw1LDl9LHs5LDgsNTEyfSx7Nyw0LDZ9LHs3LDgsMzZ9LHs5LDUsMTI4fSx7Nyw4LDUyfSx7Nyw2LDE1fSwKK3s3LDgsMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7OSw5LDE3Mjh9LHs3LDQsNX0sezcsOCw0NH0sezcsNiwxN30sCit7OSw5LDE0MDh9LHs3LDQsNn0sezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSwKK3s3LDgsMzB9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw4LDM0fSx7OSw1LDEyOH0sCit7Nyw4LDUwfSx7Nyw2LDE0fSx7Nyw4LDYyfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ4fSx7Nyw0LDN9LHs3LDgsNjB9LHs3LDQsNX0sCit7Nyw4LDQyfSx7Nyw2LDE2fSx7OSw5LDExNTJ9LHs3LDQsNn0sezcsOCwzMn0sezcsNSw4fSx7Nyw4LDU4fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjJ9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw3LDI2fSx7Nyw1LDl9LHs5LDgsNjQwfSx7Nyw0LDZ9LAorezcsOCwzOH0sezksNSwxMjh9LHs3LDcsMjV9LHs3LDYsMTV9LHs5LDgsMzg0fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LAorezcsNywxOH0sezcsNCw1fSx7Nyw3LDIxfSx7Nyw2LDE3fSx7OSw3LDI1Nn0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LAorezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezAsMCwwfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSwKK3s5LDYsMTY2NH0sezcsNCw2fSx7Nyw3LDIwfSx7OSw1LDEyOH0sezcsNywyNH0sezcsNiwxNH0sezcsNywyOH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw3LDIzfSx7Nyw0LDN9LHs3LDcsMjd9LHs3LDQsNX0sezcsOCwzOX0sezcsNiwxNn0sezksOCw1NzZ9LHs3LDQsNn0sezcsNywxOX0sezcsNSw4fSwKK3s3LDgsNTV9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDV9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSwKK3s3LDgsNTN9LHs3LDUsOX0sezksOCw0NDh9LHs3LDQsNn0sezcsOCwzNX0sezksNSwxMjh9LHs3LDgsNTF9LHs3LDYsMTV9LHs3LDgsNjN9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsNiwxM30sezcsNCwzfSx7OSw5LDE0NzJ9LHs3LDQsNX0sezcsOCw0M30sezcsNiwxN30sezksOSwxMjE2fSx7Nyw0LDZ9LAorezcsNiwxfSx7Nyw1LDh9LHs5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDI5fSx7Nyw0LDN9LAorezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw4LDMzfSx7OSw1LDEyOH0sezcsOCw0OX0sezcsNiwxNH0sCit7Nyw4LDYxfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ3fSx7Nyw0LDN9LHs3LDgsNTl9LHs3LDQsNX0sezcsOCw0MX0sezcsNiwxNn0sCit7OSw5LDk2MH0sezcsNCw2fSx7Nyw4LDMxfSx7Nyw1LDh9LHs3LDgsNTd9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsNywyMn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDcsMjZ9LHs3LDUsOX0sezksOSw3MDR9LHs3LDQsNn0sezcsOCwzN30sezksNSwxMjh9LAorezcsNywyNX0sezcsNiwxNX0sezksOCwzMjB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sezcsNywxOH0sezcsNCw1fSwKK3s3LDcsMjF9LHs3LDYsMTd9LHs5LDcsMjU2fSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sezcsNSwxMH0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7MTEsMTIsMjMwNH0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sezksNiwxNjY0fSx7Nyw0LDZ9LAorezcsNywyMH0sezksNSwxMjh9LHs3LDcsMjR9LHs3LDYsMTR9LHs3LDcsMjh9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDcsMjN9LHs3LDQsM30sCit7Nyw3LDI3fSx7Nyw0LDV9LHs3LDgsNDB9LHs3LDYsMTZ9LHs5LDksODMyfSx7Nyw0LDZ9LHs3LDcsMTl9LHs3LDUsOH0sezcsOCw1Nn0sezksNSw2NH0sCit7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDQ2fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsOCw1NH0sezcsNSw5fSwKK3s5LDgsNTEyfSx7Nyw0LDZ9LHs3LDgsMzZ9LHs5LDUsMTI4fSx7Nyw4LDUyfSx7Nyw2LDE1fSx7Nyw4LDB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsNiwxM30sezcsNCwzfSx7OSw5LDE2MDB9LHs3LDQsNX0sezcsOCw0NH0sezcsNiwxN30sezksOSwxMzQ0fSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSwKK3s5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDMwfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sCit7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw4LDM0fSx7OSw1LDEyOH0sezcsOCw1MH0sezcsNiwxNH0sezcsOCw2Mn0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7Nyw4LDQ4fSx7Nyw0LDN9LHs3LDgsNjB9LHs3LDQsNX0sezcsOCw0Mn0sezcsNiwxNn0sezksOSwxMDg4fSx7Nyw0LDZ9LAorezcsOCwzMn0sezcsNSw4fSx7Nyw4LDU4fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw3LDIyfSx7Nyw0LDN9LAorezcsNSwxMX0sezcsNCw1fSx7Nyw3LDI2fSx7Nyw1LDl9LHs5LDgsNjQwfSx7Nyw0LDZ9LHs3LDgsMzh9LHs5LDUsMTI4fSx7Nyw3LDI1fSx7Nyw2LDE1fSwKK3s5LDgsMzg0fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LHs3LDcsMTh9LHs3LDQsNX0sezcsNywyMX0sezcsNiwxN30sCit7OSw3LDI1Nn0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezAsMCwwfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSx7OSw2LDE2NjR9LHs3LDQsNn0sezcsNywyMH0sezksNSwxMjh9LAorezcsNywyNH0sezcsNiwxNH0sezcsNywyOH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyM30sezcsNCwzfSx7Nyw3LDI3fSx7Nyw0LDV9LAorezcsOCwzOX0sezcsNiwxNn0sezksOCw1NzZ9LHs3LDQsNn0sezcsNywxOX0sezcsNSw4fSx7Nyw4LDU1fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LAorezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDV9LHs3LDQsM30sezcsNSwxMX0sezcsNCw1fSx7Nyw4LDUzfSx7Nyw1LDl9LHs5LDgsNDQ4fSx7Nyw0LDZ9LAorezcsOCwzNX0sezksNSwxMjh9LHs3LDgsNTF9LHs3LDYsMTV9LHs3LDgsNjN9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDYsMTN9LHs3LDQsM30sCit7OSw5LDE1MzZ9LHs3LDQsNX0sezcsOCw0M30sezcsNiwxN30sezksOSwxMjgwfSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSx7OSw2LDE5Mn0sezksNSw2NH0sCit7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw4LDI5fSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sezcsNiwxMn0sezcsNSw5fSwKK3s5LDYsMTY2NH0sezcsNCw2fSx7Nyw4LDMzfSx7OSw1LDEyOH0sezcsOCw0OX0sezcsNiwxNH0sezcsOCw2MX0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sCit7Nyw4LDQ3fSx7Nyw0LDN9LHs3LDgsNTl9LHs3LDQsNX0sezcsOCw0MX0sezcsNiwxNn0sezksOSwxMDI0fSx7Nyw0LDZ9LHs3LDgsMzF9LHs3LDUsOH0sCit7Nyw4LDU3fSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw3LDIyfSx7Nyw0LDN9LHs3LDUsMTF9LHs3LDQsNX0sCit7Nyw3LDI2fSx7Nyw1LDl9LHs5LDksNzY4fSx7Nyw0LDZ9LHs3LDgsMzd9LHs5LDUsMTI4fSx7Nyw3LDI1fSx7Nyw2LDE1fSx7OSw4LDMyMH0sezcsNCw0fSwKK3s3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LHs3LDcsMTh9LHs3LDQsNX0sezcsNywyMX0sezcsNiwxN30sezksNywyNTZ9LHs3LDQsNn0sCit7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHsxMSwxMiwyNTYwfSx7Nyw0LDN9LAorezcsNSwxMX0sezcsNCw1fSx7Nyw2LDEyfSx7Nyw1LDl9LHs5LDYsMTY2NH0sezcsNCw2fSx7Nyw3LDIwfSx7OSw1LDEyOH0sezcsNywyNH0sezcsNiwxNH0sCit7Nyw3LDI4fSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw3LDIzfSx7Nyw0LDN9LHs3LDcsMjd9LHs3LDQsNX0sezcsOCw0MH0sezcsNiwxNn0sCit7OSw5LDg5Nn0sezcsNCw2fSx7Nyw3LDE5fSx7Nyw1LDh9LHs3LDgsNTZ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsOCw0Nn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDgsNTR9LHs3LDUsOX0sezksOCw1MTJ9LHs3LDQsNn0sezcsOCwzNn0sezksNSwxMjh9LAorezcsOCw1Mn0sezcsNiwxNX0sezcsOCwwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fSx7Nyw2LDEzfSx7Nyw0LDN9LHs5LDksMTcyOH0sezcsNCw1fSwKK3s3LDgsNDR9LHs3LDYsMTd9LHs5LDksMTQwOH0sezcsNCw2fSx7Nyw2LDF9LHs3LDUsOH0sezksNiwxOTJ9LHs5LDUsNjR9LHs3LDUsMTB9LHs3LDQsNH0sCit7Nyw0LDJ9LHs3LDQsN30sezcsOCwzMH0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDYsMTJ9LHs3LDUsOX0sezksNiwxNjY0fSx7Nyw0LDZ9LAorezcsOCwzNH0sezksNSwxMjh9LHs3LDgsNTB9LHs3LDYsMTR9LHs3LDgsNjJ9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LHs3LDgsNDh9LHs3LDQsM30sCit7Nyw4LDYwfSx7Nyw0LDV9LHs3LDgsNDJ9LHs3LDYsMTZ9LHs5LDksMTE1Mn0sezcsNCw2fSx7Nyw4LDMyfSx7Nyw1LDh9LHs3LDgsNTh9LHs5LDUsNjR9LAorezcsNSwxMH0sezcsNCw0fSx7Nyw0LDJ9LHs3LDQsN30sezcsNywyMn0sezcsNCwzfSx7Nyw1LDExfSx7Nyw0LDV9LHs3LDcsMjZ9LHs3LDUsOX0sCit7OSw4LDY0MH0sezcsNCw2fSx7Nyw4LDM4fSx7OSw1LDEyOH0sezcsNywyNX0sezcsNiwxNX0sezksOCwzODR9LHs3LDQsNH0sezcsNCwyfSx7Nyw0LDd9LAorezcsNiwxM30sezcsNCwzfSx7Nyw3LDE4fSx7Nyw0LDV9LHs3LDcsMjF9LHs3LDYsMTd9LHs5LDcsMjU2fSx7Nyw0LDZ9LHs3LDYsMX0sezcsNSw4fSwKK3s5LDYsMTkyfSx7OSw1LDY0fSx7Nyw1LDEwfSx7Nyw0LDR9LHs3LDQsMn0sezcsNCw3fQorfTsKKyBjb25zdCBUSUZGRmF4VGFiRW50IFRJRkZGYXhCbGFja1RhYmxlWzgxOTJdID0geworezEyLDExLDB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOSwxNX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEwLDE4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMCwxN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezExLDExLDE3OTJ9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsMTEsMjN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTEsMjB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCwxMSwyNX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxNH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezAsMCwwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw4LDEzfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezEwLDEyLDEyOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDEyLDU2fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCwxMiwzMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezExLDExLDE4NTZ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDU3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsMTEsMjF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsNTR9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsOCwxNH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezAsMCwwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw4LDEzfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsOSwxNX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiw1Mn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsNDh9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezExLDEyLDIxMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDQ0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDM2fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezEwLDEyLDM4NH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxNH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezAsMCwwfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDgsMTN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsMjh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCwxMiw2MH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsNDB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMSwxMiwyMzY4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMCwxNn0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEwLDB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7MTAsMTAsNjR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHswLDAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxM30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDksMTV9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTAsMTh9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsMTAsMTd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHsxMSwxMiwxOTg0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiw1MH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDEyLDM0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMCwxMywxNjY0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw4LDE0fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3swLDAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsOCwxM30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiwyNn0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMCwxMywxNDA4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiwzMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezExLDExLDE5MjB9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsMTIsNjF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsNDJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7MTAsMTMsMTAyNH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxNH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezAsMCwwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw4LDEzfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOSwxNX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3sxMCwxMyw3Njh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDYyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTEsMTIsMjI0MH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsNDZ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCwxMiwzOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTAsMTMsNTEyfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDgsMTR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHswLDAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxM30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDExLDE5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDExLDI0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMSwyMn0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7MTEsMTIsMjQ5Nn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsMTAsMTZ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTAsMH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMCwxMCw2NH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxNH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezEyLDExLDB9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsOCwxM30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw5LDE1fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsMTAsMTh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEwLDE3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTEsMTEsMTc5Mn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTEsMjN9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMSwyMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDExLDI1fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw4LDE0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MCwwLDB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7MTAsMTIsMTkyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMCwxMywxMjgwfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDEyLDMxfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7MTEsMTEsMTg1Nn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsNTh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCwxMSwyMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTAsMTMsODk2fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw4LDE0fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3swLDAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsOCwxM30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw5LDE1fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezEwLDEzLDY0MH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsNDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMSwxMiwyMTc2fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDEyLDQ1fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDM3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezEwLDEyLDQ0OH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxNH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezAsMCwwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw4LDEzfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsMjl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7MTAsMTMsMTUzNn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsMTIsNDF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMSwxMiwyNDMyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMCwxNn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDEwLDB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezEwLDEwLDY0fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDgsMTR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHswLDAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxM30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDksMTV9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTAsMTh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEwLDE3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3sxMSwxMiwyMDQ4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCwxMiw1MX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiwzNX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMCwxMiwzMjB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHswLDAsMH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw4LDEzfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDI3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsMTIsNTl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDMzfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTEsMTEsMTkyMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezEwLDEyLDI1Nn0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDQzfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezEwLDEzLDExNTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHswLDAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxM30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDksMTV9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsNTV9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsMTIsNjN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHsxMSwxMiwyMzA0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiw0N30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDEyLDM5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDUzfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw4LDE0fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3swLDAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsOCwxM30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMSwxOX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDExLDI0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMSwyMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezExLDEyLDI1NjB9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsMTAsMTZ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHsxMCwxMCw2NH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxNH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezEyLDExLDB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTN9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw5LDE1fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsMTAsMTh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDEwLDE3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTEsMTEsMTc5Mn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTEsMjN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCwxMSwyMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMSwyNX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw4LDE0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7MCwwLDB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7MTAsMTIsMTI4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDU2fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiwzMH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7MTEsMTEsMTg1Nn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsMTIsNTd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTEsMjF9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiw1NH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxNH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezAsMCwwfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDgsMTN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOSwxNX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDUyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiw0OH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezExLDEyLDIxMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDQ0fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsMzZ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7MTAsMTIsMzg0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw4LDE0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MCwwLDB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCwxMiwyOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiw2MH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCwxMiw0MH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezExLDEyLDIzNjh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEwLDE2fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsMTAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTAsMTAsNjR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTR9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezAsMCwwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw4LDEzfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDksMTV9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMCwxOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTAsMTd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMSwxMiwxOTg0fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDEyLDUwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDM0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezEwLDEzLDE3Mjh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHswLDAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxM30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDI2fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezEwLDEzLDE0NzJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDMyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTEsMTEsMTkyMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsNjF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCwxMiw0Mn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTAsMTMsMTA4OH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw4LDE0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7MCwwLDB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw5LDE1fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMCwxMyw4MzJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDYyfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3sxMSwxMiwyMjQwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCwxMiw0Nn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiwzOH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMCwxMyw1NzZ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHswLDAsMH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw4LDEzfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDExLDE5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsMTEsMjR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDExLDIyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTEsMTIsMjQ5Nn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTAsMTZ9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMCwwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezEwLDEwLDY0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw4LDE0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTIsMTEsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxM30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDksMTV9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTAsMTh9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsMTAsMTd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHsxMSwxMSwxNzkyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMSwyM30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDExLDIwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDExLDI1fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw4LDE0fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3swLDAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsOCwxM30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTAsMTIsMTkyfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezEwLDEzLDEzNDR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDMxfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTEsMTEsMTg1Nn0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCwxMiw1OH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMSwyMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHsxMCwxMyw5NjB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHswLDAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxM30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDksMTV9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7MTAsMTMsNzA0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCwxMiw0OX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezExLDEyLDIxNzZ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDEwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDQ1fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsMTIsMzd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezEwLDEyLDQ0OH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw4LDE0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7MCwwLDB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCwxMiwyOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTAsMTMsMTYwMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsNDF9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezExLDEyLDI0MzJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDEwLDE2fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEwLDB9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTAsMTAsNjR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHswLDAsMH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw4LDEzfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDksMTV9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCwxMCwxOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTAsMTd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMSwxMiwyMDQ4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiw1MX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDM1fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezEwLDEyLDMyMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsOCwxNH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezAsMCwwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw4LDEzfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsMTIsMjd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsNTl9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsMTIsMzN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMn0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHsxMSwxMSwxOTIwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTAsMTIsMjU2fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsMTIsNDN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezEwLDEzLDEyMTZ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw3LDExfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTR9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezAsMCwwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw4LDEzfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDksMTV9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCwxMiw1NX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTIsNjN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMSwxMiwyMzA0fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDEyLDQ3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDEyLDM5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSwKK3s4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsMTIsNTN9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw2LDl9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDgsMTR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw3LDEyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHswLDAsMH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsOCwxM30sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDExLDE5fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sCit7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsMTEsMjR9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNiw5fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNywxMX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDUsN30sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDExLDIyfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNiw4fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sCit7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7MTEsMTIsMjU2MH0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw2fSx7OCwyLDN9LAorezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sezgsNCw1fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSwKK3s4LDcsMTB9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsNSw3fSx7OCwyLDN9LAorezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sezgsMTAsMTZ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw2LDh9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCwxMCwwfSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LAorezgsNSw3fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHsxMCwxMCw2NH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOX0sezgsMiwzfSx7OCwzLDF9LHs4LDIsMn0sCit7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTF9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNn0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSx7OCwzLDR9LHs4LDIsMn0sCit7OCw4LDE0fSx7OCwyLDN9LHs4LDMsMX0sezgsMiwyfSx7OCw0LDZ9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDYsOH0sezgsMiwzfSwKK3s4LDMsMX0sezgsMiwyfSx7OCw0LDV9LHs4LDIsM30sezgsMyw0fSx7OCwyLDJ9LHs4LDcsMTJ9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LAorezgsNCw2fSx7OCwyLDN9LHs4LDMsNH0sezgsMiwyfSx7OCw1LDd9LHs4LDIsM30sezgsMywxfSx7OCwyLDJ9LHs4LDQsNX0sezgsMiwzfSwKK3s4LDMsNH0sezgsMiwyfQorfTsKKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBjCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogZmlsbC1jb2x1bW46IDc4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2ZsdXNoLmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9mbHVzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMTRlNGMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9mbHVzaC5jCkBAIC0wLDAgKzEsMTE4IEBACisvKiAkSWQ6IHRpZl9mbHVzaC5jLHYgMS45IDIwMTAtMDMtMzEgMDY6NDA6MTAgZndhcm1lcmRhbSBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCAKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgorICogU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcy4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSAKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTQU0gTEVGRkxFUiBPUiBTSUxJQ09OIEdSQVBISUNTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgKiBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgKiBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GIAorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSAKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRJRkYgTGlicmFyeS4KKyAqLworI2luY2x1ZGUgInRpZmZpb3AuaCIKKworaW50CitUSUZGRmx1c2goVElGRiogdGlmKQoreworICAgIGlmKCB0aWYtPnRpZl9tb2RlID09IE9fUkRPTkxZICkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBpZiAoIVRJRkZGbHVzaERhdGEodGlmKSkKKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgICAgICAgICAKKyAgICAvKiBJbiB1cGRhdGUgKHIrKSBtb2RlIHdlIHRyeSB0byBkZXRlY3QgdGhlIGNhc2Ugd2hlcmUgCisgICAgICAgb25seSB0aGUgc3RyaXAvdGlsZSBtYXAgaGFzIGJlZW4gYWx0ZXJlZCwgYW5kIHdlIHRyeSB0byAKKyAgICAgICByZXdyaXRlIG9ubHkgdGhhdCBwb3J0aW9uIG9mIHRoZSBkaXJlY3Rvcnkgd2l0aG91dCAKKyAgICAgICBtYWtpbmcgYW55IG90aGVyIGNoYW5nZXMgKi8KKyAgICAgICAgICAgICAgICAKKyAgICBpZiggKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9ESVJUWVNUUklQKQorICAgICAgICAmJiAhKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9ESVJUWURJUkVDVCkgCisgICAgICAgICYmIHRpZi0+dGlmX21vZGUgPT0gT19SRFdSICkKKyAgICB7CisgICAgICAgIHVpbnQ2NCAgKm9mZnNldHM9TlVMTCwgKnNpemVzPU5VTEw7CisKKyAgICAgICAgaWYoIFRJRkZJc1RpbGVkKHRpZikgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggVElGRkdldEZpZWxkKCB0aWYsIFRJRkZUQUdfVElMRU9GRlNFVFMsICZvZmZzZXRzICkgCisgICAgICAgICAgICAgICAgJiYgVElGRkdldEZpZWxkKCB0aWYsIFRJRkZUQUdfVElMRUJZVEVDT1VOVFMsICZzaXplcyApIAorICAgICAgICAgICAgICAgICYmIF9USUZGUmV3cml0ZUZpZWxkKCB0aWYsIFRJRkZUQUdfVElMRU9GRlNFVFMsIFRJRkZfTE9ORzgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWYtPnRpZl9kaXIudGRfbnN0cmlwcywgb2Zmc2V0cyApCisgICAgICAgICAgICAgICAgJiYgX1RJRkZSZXdyaXRlRmllbGQoIHRpZiwgVElGRlRBR19USUxFQllURUNPVU5UUywgVElGRl9MT05HOCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzLCBzaXplcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9ESVJUWVNUUklQOworICAgICAgICAgICAgICAgIHRpZi0+dGlmX2ZsYWdzICY9IH5USUZGX0JFRU5XUklUSU5HOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIFRJRkZHZXRGaWVsZCggdGlmLCBUSUZGVEFHX1NUUklQT0ZGU0VUUywgJm9mZnNldHMgKSAKKyAgICAgICAgICAgICAgICAmJiBUSUZGR2V0RmllbGQoIHRpZiwgVElGRlRBR19TVFJJUEJZVEVDT1VOVFMsICZzaXplcyApIAorICAgICAgICAgICAgICAgICYmIF9USUZGUmV3cml0ZUZpZWxkKCB0aWYsIFRJRkZUQUdfU1RSSVBPRkZTRVRTLCBUSUZGX0xPTkc4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfZGlyLnRkX25zdHJpcHMsIG9mZnNldHMgKQorICAgICAgICAgICAgICAgICYmIF9USUZGUmV3cml0ZUZpZWxkKCB0aWYsIFRJRkZUQUdfU1RSSVBCWVRFQ09VTlRTLCBUSUZGX0xPTkc4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfZGlyLnRkX25zdHJpcHMsIHNpemVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRpZi0+dGlmX2ZsYWdzICY9IH5USUZGX0RJUlRZU1RSSVA7CisgICAgICAgICAgICAgICAgdGlmLT50aWZfZmxhZ3MgJj0gflRJRkZfQkVFTldSSVRJTkc7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHRpZi0+dGlmX2ZsYWdzICYgKFRJRkZfRElSVFlESVJFQ1R8VElGRl9ESVJUWVNUUklQKSkgCisgICAgICAgICYmICFUSUZGUmV3cml0ZURpcmVjdG9yeSh0aWYpKQorICAgICAgICByZXR1cm4gKDApOworCisgICAgcmV0dXJuICgxKTsKK30KKworLyoKKyAqIEZsdXNoIGJ1ZmZlcmVkIGRhdGEgdG8gdGhlIGZpbGUuCisgKgorICogRnJhbmsgV2FybWVyZGFtJzIwMDA6IEkgbW9kaWZpZWQgdGhpcyB0byByZXR1cm4gMSBpZiBUSUZGX0JFRU5XUklUSU5HCisgKiBpcyBub3Qgc2V0LCBzbyB0aGF0IFRJRkZGbHVzaCgpIHdpbGwgcHJvY2VlZCB0byB3cml0ZSBvdXQgdGhlIGRpcmVjdG9yeS4KKyAqIFRoZSBkb2N1bWVudGF0aW9uIHNheXMgcmV0dXJuaW5nIDEgaXMgYW4gZXJyb3IgaW5kaWNhdG9yLCBidXQgbm90IGhhdmluZworICogYmVlbiB3cml0aW5nIGlzbid0IGV4YWN0bHkgYSBhbiBlcnJvci4gIEhvcGVmdWxseSB0aGlzIGRvZXNuJ3QgY2F1c2UKKyAqIHByb2JsZW1zIGZvciBvdGhlciBwZW9wbGUuIAorICovCitpbnQKK1RJRkZGbHVzaERhdGEoVElGRiogdGlmKQoreworCWlmICgodGlmLT50aWZfZmxhZ3MgJiBUSUZGX0JFRU5XUklUSU5HKSA9PSAwKQorCQlyZXR1cm4gKDEpOworCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfUE9TVEVOQ09ERSkgeworCQl0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9QT1NURU5DT0RFOworCQlpZiAoISgqdGlmLT50aWZfcG9zdGVuY29kZSkodGlmKSkKKwkJCXJldHVybiAoMCk7CisJfQorCXJldHVybiAoVElGRkZsdXNoRGF0YTEodGlmKSk7Cit9CisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTggc3c9OCBub2V0OiAqLworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZ2V0aW1hZ2UuYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2dldGltYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ5YjczZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2dldGltYWdlLmMKQEAgLTAsMCArMSwyOTI4IEBACisvKiAkSWQ6IHRpZl9nZXRpbWFnZS5jLHYgMS45MCAyMDE1LTA2LTE3IDAxOjM0OjA4IGJmcmllc2VuIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVElGRiBMaWJyYXJ5CisgKgorICogUmVhZCBhbmQgcmV0dXJuIGEgcGFja2VkIFJHQkEgaW1hZ2UuCisgKi8KKyNpbmNsdWRlICJ0aWZmaW9wLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIGludCBndFRpbGVDb250aWcoVElGRlJHQkFJbWFnZSosIHVpbnQzMiosIHVpbnQzMiwgdWludDMyKTsKK3N0YXRpYyBpbnQgZ3RUaWxlU2VwYXJhdGUoVElGRlJHQkFJbWFnZSosIHVpbnQzMiosIHVpbnQzMiwgdWludDMyKTsKK3N0YXRpYyBpbnQgZ3RTdHJpcENvbnRpZyhUSUZGUkdCQUltYWdlKiwgdWludDMyKiwgdWludDMyLCB1aW50MzIpOworc3RhdGljIGludCBndFN0cmlwU2VwYXJhdGUoVElGRlJHQkFJbWFnZSosIHVpbnQzMiosIHVpbnQzMiwgdWludDMyKTsKK3N0YXRpYyBpbnQgUGlja0NvbnRpZ0Nhc2UoVElGRlJHQkFJbWFnZSopOworc3RhdGljIGludCBQaWNrU2VwYXJhdGVDYXNlKFRJRkZSR0JBSW1hZ2UqKTsKKworc3RhdGljIGludCBCdWlsZE1hcFVhVG9BYShUSUZGUkdCQUltYWdlKiBpbWcpOworc3RhdGljIGludCBCdWlsZE1hcEJpdGRlcHRoMTZUbzgoVElGRlJHQkFJbWFnZSogaW1nKTsKKworc3RhdGljIGNvbnN0IGNoYXIgcGhvdG9UYWdbXSA9ICJQaG90b21ldHJpY0ludGVycHJldGF0aW9uIjsKKworLyogCisgKiBIZWxwZXIgY29uc3RhbnRzIHVzZWQgaW4gT3JpZW50YXRpb24gdGFnIGhhbmRsaW5nCisgKi8KKyNkZWZpbmUgRkxJUF9WRVJUSUNBTExZIDB4MDEKKyNkZWZpbmUgRkxJUF9IT1JJWk9OVEFMTFkgMHgwMgorCisvKgorICogQ29sb3IgY29udmVyc2lvbiBjb25zdGFudHMuIFdlIHdpbGwgZGVmaW5lIGRpc3BsYXkgdHlwZXMgaGVyZS4KKyAqLworCitzdGF0aWMgY29uc3QgVElGRkRpc3BsYXkgZGlzcGxheV9zUkdCID0geworCXsJCQkvKiBYWVogLT4gbHVtaW5hbmNlIG1hdHJpeCAqLworCQl7ICAzLjI0MTBGLCAtMS41Mzc0RiwgLTAuNDk4NkYgfSwKKwkJeyAgLTAuOTY5MkYsIDEuODc2MEYsIDAuMDQxNkYgfSwKKwkJeyAgMC4wNTU2RiwgLTAuMjA0MEYsIDEuMDU3MEYgfQorCX0sCQorCTEwMC4wRiwgMTAwLjBGLCAxMDAuMEYsCS8qIExpZ2h0IG8vcCBmb3IgcmVmZXJlbmNlIHdoaXRlICovCisJMjU1LCAyNTUsIDI1NSwJCS8qIFBpeGVsIHZhbHVlcyBmb3IgcmVmLiB3aGl0ZSAqLworCTEuMEYsIDEuMEYsIDEuMEYsCS8qIFJlc2lkdWFsIGxpZ2h0IG8vcCBmb3IgYmxhY2sgcGl4ZWwgKi8KKwkyLjRGLCAyLjRGLCAyLjRGLAkvKiBHYW1tYSB2YWx1ZXMgZm9yIHRoZSB0aHJlZSBndW5zICovCit9OworCisvKgorICogQ2hlY2sgdGhlIGltYWdlIHRvIHNlZSBpZiBUSUZGUmVhZFJHQkFJbWFnZSBjYW4gZGVhbCB3aXRoIGl0LgorICogMS8wIGlzIHJldHVybmVkIGFjY29yZGluZyB0byB3aGV0aGVyIG9yIG5vdCB0aGUgaW1hZ2UgY2FuCisgKiBiZSBoYW5kbGVkLiAgSWYgMCBpcyByZXR1cm5lZCwgZW1zZyBjb250YWlucyB0aGUgcmVhc29uCisgKiB3aHkgaXQgaXMgYmVpbmcgcmVqZWN0ZWQuCisgKi8KK2ludAorVElGRlJHQkFJbWFnZU9LKFRJRkYqIHRpZiwgY2hhciBlbXNnWzEwMjRdKQoreworCVRJRkZEaXJlY3RvcnkqIHRkID0gJnRpZi0+dGlmX2RpcjsKKwl1aW50MTYgcGhvdG9tZXRyaWM7CisJaW50IGNvbG9yY2hhbm5lbHM7CisKKwlpZiAoIXRpZi0+dGlmX2RlY29kZXN0YXR1cykgeworCQlzcHJpbnRmKGVtc2csICJTb3JyeSwgcmVxdWVzdGVkIGNvbXByZXNzaW9uIG1ldGhvZCBpcyBub3QgY29uZmlndXJlZCIpOworCQlyZXR1cm4gKDApOworCX0KKwlzd2l0Y2ggKHRkLT50ZF9iaXRzcGVyc2FtcGxlKSB7CisJCWNhc2UgMToKKwkJY2FzZSAyOgorCQljYXNlIDQ6CisJCWNhc2UgODoKKwkJY2FzZSAxNjoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihlbXNnLCAiU29ycnksIGNhbiBub3QgaGFuZGxlIGltYWdlcyB3aXRoICVkLWJpdCBzYW1wbGVzIiwKKwkJCSAgICB0ZC0+dGRfYml0c3BlcnNhbXBsZSk7CisJCQlyZXR1cm4gKDApOworCX0KKwljb2xvcmNoYW5uZWxzID0gdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCAtIHRkLT50ZF9leHRyYXNhbXBsZXM7CisJaWYgKCFUSUZGR2V0RmllbGQodGlmLCBUSUZGVEFHX1BIT1RPTUVUUklDLCAmcGhvdG9tZXRyaWMpKSB7CisJCXN3aXRjaCAoY29sb3JjaGFubmVscykgeworCQkJY2FzZSAxOgorCQkJCXBob3RvbWV0cmljID0gUEhPVE9NRVRSSUNfTUlOSVNCTEFDSzsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQlwaG90b21ldHJpYyA9IFBIT1RPTUVUUklDX1JHQjsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJc3ByaW50ZihlbXNnLCAiTWlzc2luZyBuZWVkZWQgJXMgdGFnIiwgcGhvdG9UYWcpOworCQkJCXJldHVybiAoMCk7CisJCX0KKwl9CisJc3dpdGNoIChwaG90b21ldHJpYykgeworCQljYXNlIFBIT1RPTUVUUklDX01JTklTV0hJVEU6CisJCWNhc2UgUEhPVE9NRVRSSUNfTUlOSVNCTEFDSzoKKwkJY2FzZSBQSE9UT01FVFJJQ19QQUxFVFRFOgorCQkJaWYgKHRkLT50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX0NPTlRJRworCQkJICAgICYmIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwgIT0gMQorCQkJICAgICYmIHRkLT50ZF9iaXRzcGVyc2FtcGxlIDwgOCApIHsKKwkJCQlzcHJpbnRmKGVtc2csCisJCQkJICAgICJTb3JyeSwgY2FuIG5vdCBoYW5kbGUgY29udGlndW91cyBkYXRhIHdpdGggJXM9JWQsICIKKwkJCQkgICAgImFuZCAlcz0lZCBhbmQgQml0cy9TYW1wbGU9JWQiLAorCQkJCSAgICBwaG90b1RhZywgcGhvdG9tZXRyaWMsCisJCQkJICAgICJTYW1wbGVzL3BpeGVsIiwgdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCwKKwkJCQkgICAgdGQtPnRkX2JpdHNwZXJzYW1wbGUpOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCQkvKgorCQkJICogV2Ugc2hvdWxkIGxpa2VseSB2YWxpZGF0ZSB0aGF0IGFueSBleHRyYSBzYW1wbGVzIGFyZSBlaXRoZXIKKwkJCSAqIHRvIGJlIGlnbm9yZWQsIG9yIGFyZSBhbHBoYSwgYW5kIGlmIGFscGhhIHdlIHNob3VsZCB0cnkgdG8gdXNlCisJCQkgKiB0aGVtLiAgQnV0IGZvciBub3cgd2Ugd29uJ3QgYm90aGVyIHdpdGggdGhpcy4KKwkJCSovCisJCQlicmVhazsKKwkJY2FzZSBQSE9UT01FVFJJQ19ZQ0JDUjoKKwkJCS8qCisJCQkgKiBUT0RPOiBpZiBhdCBhbGwgbWVhbmluZ2Z1bCBhbmQgdXNlZnVsLCBtYWtlIG1vcmUgY29tcGxldGUKKwkJCSAqIHN1cHBvcnQgY2hlY2sgaGVyZSwgb3IgYmV0dGVyIHN0aWxsLCByZWZhY3RvciB0byBsZXQgc3VwcG9ydGluZworCQkJICogY29kZSBkZWNpZGUgd2hldGhlciB0aGVyZSBpcyBzdXBwb3J0IGFuZCB3aGF0IG1lYW5pbmdmdWxsCisJCQkgKiBlcnJvciB0byByZXR1cm4KKwkJCSAqLworCQkJYnJlYWs7CisJCWNhc2UgUEhPVE9NRVRSSUNfUkdCOgorCQkJaWYgKGNvbG9yY2hhbm5lbHMgPCAzKSB7CisJCQkJc3ByaW50ZihlbXNnLCAiU29ycnksIGNhbiBub3QgaGFuZGxlIFJHQiBpbWFnZSB3aXRoICVzPSVkIiwKKwkJCQkgICAgIkNvbG9yIGNoYW5uZWxzIiwgY29sb3JjaGFubmVscyk7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFBIT1RPTUVUUklDX1NFUEFSQVRFRDoKKwkJCXsKKwkJCQl1aW50MTYgaW5rc2V0OworCQkJCVRJRkZHZXRGaWVsZERlZmF1bHRlZCh0aWYsIFRJRkZUQUdfSU5LU0VULCAmaW5rc2V0KTsKKwkJCQlpZiAoaW5rc2V0ICE9IElOS1NFVF9DTVlLKSB7CisJCQkJCXNwcmludGYoZW1zZywKKwkJCQkJICAgICJTb3JyeSwgY2FuIG5vdCBoYW5kbGUgc2VwYXJhdGVkIGltYWdlIHdpdGggJXM9JWQiLAorCQkJCQkgICAgIklua1NldCIsIGlua3NldCk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlpZiAodGQtPnRkX3NhbXBsZXNwZXJwaXhlbCA8IDQpIHsKKwkJCQkJc3ByaW50ZihlbXNnLAorCQkJCQkgICAgIlNvcnJ5LCBjYW4gbm90IGhhbmRsZSBzZXBhcmF0ZWQgaW1hZ2Ugd2l0aCAlcz0lZCIsCisJCQkJCSAgICAiU2FtcGxlcy9waXhlbCIsIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCWNhc2UgUEhPVE9NRVRSSUNfTE9HTDoKKwkJCWlmICh0ZC0+dGRfY29tcHJlc3Npb24gIT0gQ09NUFJFU1NJT05fU0dJTE9HKSB7CisJCQkJc3ByaW50ZihlbXNnLCAiU29ycnksIExvZ0wgZGF0YSBtdXN0IGhhdmUgJXM9JWQiLAorCQkJCSAgICAiQ29tcHJlc3Npb24iLCBDT01QUkVTU0lPTl9TR0lMT0cpOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBQSE9UT01FVFJJQ19MT0dMVVY6CisJCQlpZiAodGQtPnRkX2NvbXByZXNzaW9uICE9IENPTVBSRVNTSU9OX1NHSUxPRyAmJgorCQkJICAgIHRkLT50ZF9jb21wcmVzc2lvbiAhPSBDT01QUkVTU0lPTl9TR0lMT0cyNCkgeworCQkJCXNwcmludGYoZW1zZywgIlNvcnJ5LCBMb2dMdXYgZGF0YSBtdXN0IGhhdmUgJXM9JWQgb3IgJWQiLAorCQkJCSAgICAiQ29tcHJlc3Npb24iLCBDT01QUkVTU0lPTl9TR0lMT0csIENPTVBSRVNTSU9OX1NHSUxPRzI0KTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJaWYgKHRkLT50ZF9wbGFuYXJjb25maWcgIT0gUExBTkFSQ09ORklHX0NPTlRJRykgeworCQkJCXNwcmludGYoZW1zZywgIlNvcnJ5LCBjYW4gbm90IGhhbmRsZSBMb2dMdXYgaW1hZ2VzIHdpdGggJXM9JWQiLAorCQkJCSAgICAiUGxhbmFyY29uZmlndXJhdGlvbiIsIHRkLT50ZF9wbGFuYXJjb25maWcpOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCQlpZiggdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCAhPSAzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGVtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAiU29ycnksIGNhbiBub3QgaGFuZGxlIGltYWdlIHdpdGggJXM9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIlNhbXBsZXMvcGl4ZWwiLCB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKwkJCWJyZWFrOworCQljYXNlIFBIT1RPTUVUUklDX0NJRUxBQjoKKyAgICAgICAgICAgIGlmKCB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsICE9IDMgfHwgdGQtPnRkX2JpdHNwZXJzYW1wbGUgIT0gOCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3ByaW50ZihlbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgIlNvcnJ5LCBjYW4gbm90IGhhbmRsZSBpbWFnZSB3aXRoICVzPSVkIGFuZCAlcz0lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiU2FtcGxlcy9waXhlbCIsIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAiQml0cy9zYW1wbGUiLCB0ZC0+dGRfYml0c3BlcnNhbXBsZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNwcmludGYoZW1zZywgIlNvcnJ5LCBjYW4gbm90IGhhbmRsZSBpbWFnZSB3aXRoICVzPSVkIiwKKwkJCSAgICBwaG90b1RhZywgcGhvdG9tZXRyaWMpOworCQkJcmV0dXJuICgwKTsKKwl9CisJcmV0dXJuICgxKTsKK30KKwordm9pZAorVElGRlJHQkFJbWFnZUVuZChUSUZGUkdCQUltYWdlKiBpbWcpCit7CisJaWYgKGltZy0+TWFwKQorCQlfVElGRmZyZWUoaW1nLT5NYXApLCBpbWctPk1hcCA9IE5VTEw7CisJaWYgKGltZy0+QldtYXApCisJCV9USUZGZnJlZShpbWctPkJXbWFwKSwgaW1nLT5CV21hcCA9IE5VTEw7CisJaWYgKGltZy0+UEFMbWFwKQorCQlfVElGRmZyZWUoaW1nLT5QQUxtYXApLCBpbWctPlBBTG1hcCA9IE5VTEw7CisJaWYgKGltZy0+eWNiY3IpCisJCV9USUZGZnJlZShpbWctPnljYmNyKSwgaW1nLT55Y2JjciA9IE5VTEw7CisJaWYgKGltZy0+Y2llbGFiKQorCQlfVElGRmZyZWUoaW1nLT5jaWVsYWIpLCBpbWctPmNpZWxhYiA9IE5VTEw7CisJaWYgKGltZy0+VWFUb0FhKQorCQlfVElGRmZyZWUoaW1nLT5VYVRvQWEpLCBpbWctPlVhVG9BYSA9IE5VTEw7CisJaWYgKGltZy0+Qml0ZGVwdGgxNlRvOCkKKwkJX1RJRkZmcmVlKGltZy0+Qml0ZGVwdGgxNlRvOCksIGltZy0+Qml0ZGVwdGgxNlRvOCA9IE5VTEw7CisKKwlpZiggaW1nLT5yZWRjbWFwICkgeworCQlfVElGRmZyZWUoIGltZy0+cmVkY21hcCApOworCQlfVElGRmZyZWUoIGltZy0+Z3JlZW5jbWFwICk7CisJCV9USUZGZnJlZSggaW1nLT5ibHVlY21hcCApOworICAgICAgICAgICAgICAgIGltZy0+cmVkY21hcCA9IGltZy0+Z3JlZW5jbWFwID0gaW1nLT5ibHVlY21hcCA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50Citpc0NDSVRUQ29tcHJlc3Npb24oVElGRiogdGlmKQoreworICAgIHVpbnQxNiBjb21wcmVzczsKKyAgICBUSUZGR2V0RmllbGQodGlmLCBUSUZGVEFHX0NPTVBSRVNTSU9OLCAmY29tcHJlc3MpOworICAgIHJldHVybiAoY29tcHJlc3MgPT0gQ09NUFJFU1NJT05fQ0NJVFRGQVgzIHx8CisJICAgIGNvbXByZXNzID09IENPTVBSRVNTSU9OX0NDSVRURkFYNCB8fAorCSAgICBjb21wcmVzcyA9PSBDT01QUkVTU0lPTl9DQ0lUVFJMRSB8fAorCSAgICBjb21wcmVzcyA9PSBDT01QUkVTU0lPTl9DQ0lUVFJMRVcpOworfQorCitpbnQKK1RJRkZSR0JBSW1hZ2VCZWdpbihUSUZGUkdCQUltYWdlKiBpbWcsIFRJRkYqIHRpZiwgaW50IHN0b3AsIGNoYXIgZW1zZ1sxMDI0XSkKK3sKKwl1aW50MTYqIHNhbXBsZWluZm87CisJdWludDE2IGV4dHJhc2FtcGxlczsKKwl1aW50MTYgcGxhbmFyY29uZmlnOworCXVpbnQxNiBjb21wcmVzczsKKwlpbnQgY29sb3JjaGFubmVsczsKKwl1aW50MTYgKnJlZF9vcmlnLCAqZ3JlZW5fb3JpZywgKmJsdWVfb3JpZzsKKwlpbnQgbl9jb2xvcjsKKworCS8qIEluaXRpYWxpemUgdG8gbm9ybWFsIHZhbHVlcyAqLworCWltZy0+cm93X29mZnNldCA9IDA7CisJaW1nLT5jb2xfb2Zmc2V0ID0gMDsKKwlpbWctPnJlZGNtYXAgPSBOVUxMOworCWltZy0+Z3JlZW5jbWFwID0gTlVMTDsKKwlpbWctPmJsdWVjbWFwID0gTlVMTDsKKwlpbWctPnJlcV9vcmllbnRhdGlvbiA9IE9SSUVOVEFUSU9OX0JPVExFRlQ7ICAgICAvKiBJdCBpcyB0aGUgZGVmYXVsdCAqLworCisJaW1nLT50aWYgPSB0aWY7CisJaW1nLT5zdG9wb25lcnIgPSBzdG9wOworCVRJRkZHZXRGaWVsZERlZmF1bHRlZCh0aWYsIFRJRkZUQUdfQklUU1BFUlNBTVBMRSwgJmltZy0+Yml0c3BlcnNhbXBsZSk7CisJc3dpdGNoIChpbWctPmJpdHNwZXJzYW1wbGUpIHsKKwkJY2FzZSAxOgorCQljYXNlIDI6CisJCWNhc2UgNDoKKwkJY2FzZSA4OgorCQljYXNlIDE2OgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzcHJpbnRmKGVtc2csICJTb3JyeSwgY2FuIG5vdCBoYW5kbGUgaW1hZ2VzIHdpdGggJWQtYml0IHNhbXBsZXMiLAorCQkJICAgIGltZy0+Yml0c3BlcnNhbXBsZSk7CisJCQlnb3RvIGZhaWxfcmV0dXJuOworCX0KKwlpbWctPmFscGhhID0gMDsKKwlUSUZGR2V0RmllbGREZWZhdWx0ZWQodGlmLCBUSUZGVEFHX1NBTVBMRVNQRVJQSVhFTCwgJmltZy0+c2FtcGxlc3BlcnBpeGVsKTsKKwlUSUZGR2V0RmllbGREZWZhdWx0ZWQodGlmLCBUSUZGVEFHX0VYVFJBU0FNUExFUywKKwkgICAgJmV4dHJhc2FtcGxlcywgJnNhbXBsZWluZm8pOworCWlmIChleHRyYXNhbXBsZXMgPj0gMSkKKwl7CisJCXN3aXRjaCAoc2FtcGxlaW5mb1swXSkgeworCQkJY2FzZSBFWFRSQVNBTVBMRV9VTlNQRUNJRklFRDogICAgICAgICAgLyogV29ya2Fyb3VuZCBmb3Igc29tZSBpbWFnZXMgd2l0aG91dCAqLworCQkJCWlmIChpbWctPnNhbXBsZXNwZXJwaXhlbCA+IDMpICAvKiBjb3JyZWN0IGluZm8gYWJvdXQgYWxwaGEgY2hhbm5lbCAqLworCQkJCQlpbWctPmFscGhhID0gRVhUUkFTQU1QTEVfQVNTT0NBTFBIQTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRVhUUkFTQU1QTEVfQVNTT0NBTFBIQTogICAgICAgICAgIC8qIGRhdGEgaXMgcHJlLW11bHRpcGxpZWQgKi8KKwkJCWNhc2UgRVhUUkFTQU1QTEVfVU5BU1NBTFBIQTogICAgICAgICAgIC8qIGRhdGEgaXMgbm90IHByZS1tdWx0aXBsaWVkICovCisJCQkJaW1nLT5hbHBoYSA9IHNhbXBsZWluZm9bMF07CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKyNpZmRlZiBERUZBVUxUX0VYVFJBU0FNUExFX0FTX0FMUEhBCisJaWYoICFUSUZGR2V0RmllbGQodGlmLCBUSUZGVEFHX1BIT1RPTUVUUklDLCAmaW1nLT5waG90b21ldHJpYykpCisJCWltZy0+cGhvdG9tZXRyaWMgPSBQSE9UT01FVFJJQ19NSU5JU1dISVRFOworCisJaWYoIGV4dHJhc2FtcGxlcyA9PSAwCisJICAgICYmIGltZy0+c2FtcGxlc3BlcnBpeGVsID09IDQKKwkgICAgJiYgaW1nLT5waG90b21ldHJpYyA9PSBQSE9UT01FVFJJQ19SR0IgKQorCXsKKwkJaW1nLT5hbHBoYSA9IEVYVFJBU0FNUExFX0FTU09DQUxQSEE7CisJCWV4dHJhc2FtcGxlcyA9IDE7CisJfQorI2VuZGlmCisKKwljb2xvcmNoYW5uZWxzID0gaW1nLT5zYW1wbGVzcGVycGl4ZWwgLSBleHRyYXNhbXBsZXM7CisJVElGRkdldEZpZWxkRGVmYXVsdGVkKHRpZiwgVElGRlRBR19DT01QUkVTU0lPTiwgJmNvbXByZXNzKTsKKwlUSUZGR2V0RmllbGREZWZhdWx0ZWQodGlmLCBUSUZGVEFHX1BMQU5BUkNPTkZJRywgJnBsYW5hcmNvbmZpZyk7CisJaWYgKCFUSUZGR2V0RmllbGQodGlmLCBUSUZGVEFHX1BIT1RPTUVUUklDLCAmaW1nLT5waG90b21ldHJpYykpIHsKKwkJc3dpdGNoIChjb2xvcmNoYW5uZWxzKSB7CisJCQljYXNlIDE6CisJCQkJaWYgKGlzQ0NJVFRDb21wcmVzc2lvbih0aWYpKQorCQkJCQlpbWctPnBob3RvbWV0cmljID0gUEhPVE9NRVRSSUNfTUlOSVNXSElURTsKKwkJCQllbHNlCisJCQkJCWltZy0+cGhvdG9tZXRyaWMgPSBQSE9UT01FVFJJQ19NSU5JU0JMQUNLOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCWltZy0+cGhvdG9tZXRyaWMgPSBQSE9UT01FVFJJQ19SR0I7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXNwcmludGYoZW1zZywgIk1pc3NpbmcgbmVlZGVkICVzIHRhZyIsIHBob3RvVGFnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsX3JldHVybjsKKwkJfQorCX0KKwlzd2l0Y2ggKGltZy0+cGhvdG9tZXRyaWMpIHsKKwkJY2FzZSBQSE9UT01FVFJJQ19QQUxFVFRFOgorCQkJaWYgKCFUSUZGR2V0RmllbGQodGlmLCBUSUZGVEFHX0NPTE9STUFQLAorCQkJICAgICZyZWRfb3JpZywgJmdyZWVuX29yaWcsICZibHVlX29yaWcpKSB7CisJCQkJc3ByaW50ZihlbXNnLCAiTWlzc2luZyByZXF1aXJlZCBcIkNvbG9ybWFwXCIgdGFnIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbF9yZXR1cm47CisJCQl9CisKKwkJCS8qIGNvcHkgdGhlIGNvbG9ybWFwcyBzbyB3ZSBjYW4gbW9kaWZ5IHRoZW0gKi8KKwkJCW5fY29sb3IgPSAoMUwgPDwgaW1nLT5iaXRzcGVyc2FtcGxlKTsKKwkJCWltZy0+cmVkY21hcCA9ICh1aW50MTYgKikgX1RJRkZtYWxsb2Moc2l6ZW9mKHVpbnQxNikqbl9jb2xvcik7CisJCQlpbWctPmdyZWVuY21hcCA9ICh1aW50MTYgKikgX1RJRkZtYWxsb2Moc2l6ZW9mKHVpbnQxNikqbl9jb2xvcik7CisJCQlpbWctPmJsdWVjbWFwID0gKHVpbnQxNiAqKSBfVElGRm1hbGxvYyhzaXplb2YodWludDE2KSpuX2NvbG9yKTsKKwkJCWlmKCAhaW1nLT5yZWRjbWFwIHx8ICFpbWctPmdyZWVuY21hcCB8fCAhaW1nLT5ibHVlY21hcCApIHsKKwkJCQlzcHJpbnRmKGVtc2csICJPdXQgb2YgbWVtb3J5IGZvciBjb2xvcm1hcCBjb3B5Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbF9yZXR1cm47CisJCQl9CisKKwkJCV9USUZGbWVtY3B5KCBpbWctPnJlZGNtYXAsIHJlZF9vcmlnLCBuX2NvbG9yICogMiApOworCQkJX1RJRkZtZW1jcHkoIGltZy0+Z3JlZW5jbWFwLCBncmVlbl9vcmlnLCBuX2NvbG9yICogMiApOworCQkJX1RJRkZtZW1jcHkoIGltZy0+Ymx1ZWNtYXAsIGJsdWVfb3JpZywgbl9jb2xvciAqIDIgKTsKKworCQkJLyogZmFsbCB0aHJ1Li4uICovCisJCWNhc2UgUEhPVE9NRVRSSUNfTUlOSVNXSElURToKKwkJY2FzZSBQSE9UT01FVFJJQ19NSU5JU0JMQUNLOgorCQkJaWYgKHBsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfQ09OVElHCisJCQkgICAgJiYgaW1nLT5zYW1wbGVzcGVycGl4ZWwgIT0gMQorCQkJICAgICYmIGltZy0+Yml0c3BlcnNhbXBsZSA8IDggKSB7CisJCQkJc3ByaW50ZihlbXNnLAorCQkJCSAgICAiU29ycnksIGNhbiBub3QgaGFuZGxlIGNvbnRpZ3VvdXMgZGF0YSB3aXRoICVzPSVkLCAiCisJCQkJICAgICJhbmQgJXM9JWQgYW5kIEJpdHMvU2FtcGxlPSVkIiwKKwkJCQkgICAgcGhvdG9UYWcsIGltZy0+cGhvdG9tZXRyaWMsCisJCQkJICAgICJTYW1wbGVzL3BpeGVsIiwgaW1nLT5zYW1wbGVzcGVycGl4ZWwsCisJCQkJICAgIGltZy0+Yml0c3BlcnNhbXBsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbF9yZXR1cm47CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBQSE9UT01FVFJJQ19ZQ0JDUjoKKwkJCS8qIEl0IHdvdWxkIHByb2JhYmx5IGJlIG5pY2UgdG8gaGF2ZSBhIHJlYWxpdHkgY2hlY2sgaGVyZS4gKi8KKwkJCWlmIChwbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX0NPTlRJRykKKwkJCQkvKiBjYW4gcmVseSBvbiBsaWJqcGVnIHRvIGNvbnZlcnQgdG8gUkdCICovCisJCQkJLyogWFhYIHNob3VsZCByZXN0b3JlIGN1cnJlbnQgc3RhdGUgb24gZXhpdCAqLworCQkJCXN3aXRjaCAoY29tcHJlc3MpIHsKKwkJCQkJY2FzZSBDT01QUkVTU0lPTl9KUEVHOgorCQkJCQkJLyoKKwkJCQkJCSAqIFRPRE86IHdoZW4gY29tcGxldGUgdGVzdHMgdmVyaWZ5IGNvbXBsZXRlIGRlc3Vic2FtcGxpbmcKKwkJCQkJCSAqIGFuZCBZQ2JDciBoYW5kbGluZywgcmVtb3ZlIHVzZSBvZiBUSUZGVEFHX0pQRUdDT0xPUk1PREUgaW4KKwkJCQkJCSAqIGZhdm9yIG9mIHRpZl9nZXRpbWFnZS5jIG5hdGl2ZSBoYW5kbGluZworCQkJCQkJICovCisJCQkJCQlUSUZGU2V0RmllbGQodGlmLCBUSUZGVEFHX0pQRUdDT0xPUk1PREUsIEpQRUdDT0xPUk1PREVfUkdCKTsKKwkJCQkJCWltZy0+cGhvdG9tZXRyaWMgPSBQSE9UT01FVFJJQ19SR0I7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCS8qIGRvIG5vdGhpbmcgKi87CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkvKgorCQkJICogVE9ETzogaWYgYXQgYWxsIG1lYW5pbmdmdWwgYW5kIHVzZWZ1bCwgbWFrZSBtb3JlIGNvbXBsZXRlCisJCQkgKiBzdXBwb3J0IGNoZWNrIGhlcmUsIG9yIGJldHRlciBzdGlsbCwgcmVmYWN0b3IgdG8gbGV0IHN1cHBvcnRpbmcKKwkJCSAqIGNvZGUgZGVjaWRlIHdoZXRoZXIgdGhlcmUgaXMgc3VwcG9ydCBhbmQgd2hhdCBtZWFuaW5nZnVsbAorCQkJICogZXJyb3IgdG8gcmV0dXJuCisJCQkgKi8KKwkJCWJyZWFrOworCQljYXNlIFBIT1RPTUVUUklDX1JHQjoKKwkJCWlmIChjb2xvcmNoYW5uZWxzIDwgMykgeworCQkJCXNwcmludGYoZW1zZywgIlNvcnJ5LCBjYW4gbm90IGhhbmRsZSBSR0IgaW1hZ2Ugd2l0aCAlcz0lZCIsCisJCQkJICAgICJDb2xvciBjaGFubmVscyIsIGNvbG9yY2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxfcmV0dXJuOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUEhPVE9NRVRSSUNfU0VQQVJBVEVEOgorCQkJeworCQkJCXVpbnQxNiBpbmtzZXQ7CisJCQkJVElGRkdldEZpZWxkRGVmYXVsdGVkKHRpZiwgVElGRlRBR19JTktTRVQsICZpbmtzZXQpOworCQkJCWlmIChpbmtzZXQgIT0gSU5LU0VUX0NNWUspIHsKKwkJCQkJc3ByaW50ZihlbXNnLCAiU29ycnksIGNhbiBub3QgaGFuZGxlIHNlcGFyYXRlZCBpbWFnZSB3aXRoICVzPSVkIiwKKwkJCQkJICAgICJJbmtTZXQiLCBpbmtzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbF9yZXR1cm47CisJCQkJfQorCQkJCWlmIChpbWctPnNhbXBsZXNwZXJwaXhlbCA8IDQpIHsKKwkJCQkJc3ByaW50ZihlbXNnLCAiU29ycnksIGNhbiBub3QgaGFuZGxlIHNlcGFyYXRlZCBpbWFnZSB3aXRoICVzPSVkIiwKKwkJCQkJICAgICJTYW1wbGVzL3BpeGVsIiwgaW1nLT5zYW1wbGVzcGVycGl4ZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbF9yZXR1cm47CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUEhPVE9NRVRSSUNfTE9HTDoKKwkJCWlmIChjb21wcmVzcyAhPSBDT01QUkVTU0lPTl9TR0lMT0cpIHsKKwkJCQlzcHJpbnRmKGVtc2csICJTb3JyeSwgTG9nTCBkYXRhIG11c3QgaGF2ZSAlcz0lZCIsCisJCQkJICAgICJDb21wcmVzc2lvbiIsIENPTVBSRVNTSU9OX1NHSUxPRyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbF9yZXR1cm47CisJCQl9CisJCQlUSUZGU2V0RmllbGQodGlmLCBUSUZGVEFHX1NHSUxPR0RBVEFGTVQsIFNHSUxPR0RBVEFGTVRfOEJJVCk7CisJCQlpbWctPnBob3RvbWV0cmljID0gUEhPVE9NRVRSSUNfTUlOSVNCTEFDSzsJLyogbGl0dGxlIHdoaXRlIGxpZSAqLworCQkJaW1nLT5iaXRzcGVyc2FtcGxlID0gODsKKwkJCWJyZWFrOworCQljYXNlIFBIT1RPTUVUUklDX0xPR0xVVjoKKwkJCWlmIChjb21wcmVzcyAhPSBDT01QUkVTU0lPTl9TR0lMT0cgJiYgY29tcHJlc3MgIT0gQ09NUFJFU1NJT05fU0dJTE9HMjQpIHsKKwkJCQlzcHJpbnRmKGVtc2csICJTb3JyeSwgTG9nTHV2IGRhdGEgbXVzdCBoYXZlICVzPSVkIG9yICVkIiwKKwkJCQkgICAgIkNvbXByZXNzaW9uIiwgQ09NUFJFU1NJT05fU0dJTE9HLCBDT01QUkVTU0lPTl9TR0lMT0cyNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbF9yZXR1cm47CisJCQl9CisJCQlpZiAocGxhbmFyY29uZmlnICE9IFBMQU5BUkNPTkZJR19DT05USUcpIHsKKwkJCQlzcHJpbnRmKGVtc2csICJTb3JyeSwgY2FuIG5vdCBoYW5kbGUgTG9nTHV2IGltYWdlcyB3aXRoICVzPSVkIiwKKwkJCQkgICAgIlBsYW5hcmNvbmZpZ3VyYXRpb24iLCBwbGFuYXJjb25maWcpOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCQlUSUZGU2V0RmllbGQodGlmLCBUSUZGVEFHX1NHSUxPR0RBVEFGTVQsIFNHSUxPR0RBVEFGTVRfOEJJVCk7CisJCQlpbWctPnBob3RvbWV0cmljID0gUEhPVE9NRVRSSUNfUkdCOwkJLyogbGl0dGxlIHdoaXRlIGxpZSAqLworCQkJaW1nLT5iaXRzcGVyc2FtcGxlID0gODsKKwkJCWJyZWFrOworCQljYXNlIFBIT1RPTUVUUklDX0NJRUxBQjoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3ByaW50ZihlbXNnLCAiU29ycnksIGNhbiBub3QgaGFuZGxlIGltYWdlIHdpdGggJXM9JWQiLAorCQkJICAgIHBob3RvVGFnLCBpbWctPnBob3RvbWV0cmljKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbF9yZXR1cm47CisJfQorCWltZy0+TWFwID0gTlVMTDsKKwlpbWctPkJXbWFwID0gTlVMTDsKKwlpbWctPlBBTG1hcCA9IE5VTEw7CisJaW1nLT55Y2JjciA9IE5VTEw7CisJaW1nLT5jaWVsYWIgPSBOVUxMOworCWltZy0+VWFUb0FhID0gTlVMTDsKKwlpbWctPkJpdGRlcHRoMTZUbzggPSBOVUxMOworCVRJRkZHZXRGaWVsZCh0aWYsIFRJRkZUQUdfSU1BR0VXSURUSCwgJmltZy0+d2lkdGgpOworCVRJRkZHZXRGaWVsZCh0aWYsIFRJRkZUQUdfSU1BR0VMRU5HVEgsICZpbWctPmhlaWdodCk7CisJVElGRkdldEZpZWxkRGVmYXVsdGVkKHRpZiwgVElGRlRBR19PUklFTlRBVElPTiwgJmltZy0+b3JpZW50YXRpb24pOworCWltZy0+aXNDb250aWcgPQorCSAgICAhKHBsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfU0VQQVJBVEUgJiYgaW1nLT5zYW1wbGVzcGVycGl4ZWwgPiAxKTsKKwlpZiAoaW1nLT5pc0NvbnRpZykgeworCQlpZiAoIVBpY2tDb250aWdDYXNlKGltZykpIHsKKwkJCXNwcmludGYoZW1zZywgIlNvcnJ5LCBjYW4gbm90IGhhbmRsZSBpbWFnZSIpOworCQkJZ290byBmYWlsX3JldHVybjsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghUGlja1NlcGFyYXRlQ2FzZShpbWcpKSB7CisJCQlzcHJpbnRmKGVtc2csICJTb3JyeSwgY2FuIG5vdCBoYW5kbGUgaW1hZ2UiKTsKKwkJCWdvdG8gZmFpbF9yZXR1cm47CisJCX0KKwl9CisJcmV0dXJuIDE7CisKKyAgZmFpbF9yZXR1cm46CisgICAgICAgIF9USUZGZnJlZSggaW1nLT5yZWRjbWFwICk7CisgICAgICAgIF9USUZGZnJlZSggaW1nLT5ncmVlbmNtYXAgKTsKKyAgICAgICAgX1RJRkZmcmVlKCBpbWctPmJsdWVjbWFwICk7CisgICAgICAgIGltZy0+cmVkY21hcCA9IGltZy0+Z3JlZW5jbWFwID0gaW1nLT5ibHVlY21hcCA9IE5VTEw7CisgICAgICAgIHJldHVybiAwOworfQorCitpbnQKK1RJRkZSR0JBSW1hZ2VHZXQoVElGRlJHQkFJbWFnZSogaW1nLCB1aW50MzIqIHJhc3RlciwgdWludDMyIHcsIHVpbnQzMiBoKQoreworICAgIGlmIChpbWctPmdldCA9PSBOVUxMKSB7CisJCVRJRkZFcnJvckV4dChpbWctPnRpZi0+dGlmX2NsaWVudGRhdGEsIFRJRkZGaWxlTmFtZShpbWctPnRpZiksICJObyBcImdldFwiIHJvdXRpbmUgc2V0dXAiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKGltZy0+cHV0LmFueSA9PSBOVUxMKSB7CisJCVRJRkZFcnJvckV4dChpbWctPnRpZi0+dGlmX2NsaWVudGRhdGEsIFRJRkZGaWxlTmFtZShpbWctPnRpZiksCisJCSJObyBcInB1dFwiIHJvdXRpbmUgc2V0dXBsOyBwcm9iYWJseSBjYW4gbm90IGhhbmRsZSBpbWFnZSBmb3JtYXQiKTsKKwkJcmV0dXJuICgwKTsKKyAgICB9CisgICAgcmV0dXJuICgqaW1nLT5nZXQpKGltZywgcmFzdGVyLCB3LCBoKTsKK30KKworLyoKKyAqIFJlYWQgdGhlIHNwZWNpZmllZCBpbWFnZSBpbnRvIGFuIEFCR1ItZm9ybWF0IHJhc3RlcnRha2luZyBpbiBhY2NvdW50CisgKiBzcGVjaWZpZWQgb3JpZW50YXRpb24uCisgKi8KK2ludAorVElGRlJlYWRSR0JBSW1hZ2VPcmllbnRlZChUSUZGKiB0aWYsCisJCQkgIHVpbnQzMiByd2lkdGgsIHVpbnQzMiByaGVpZ2h0LCB1aW50MzIqIHJhc3RlciwKKwkJCSAgaW50IG9yaWVudGF0aW9uLCBpbnQgc3RvcCkKK3sKKyAgICBjaGFyIGVtc2dbMTAyNF0gPSAiIjsKKyAgICBUSUZGUkdCQUltYWdlIGltZzsKKyAgICBpbnQgb2s7CisKKwlpZiAoVElGRlJHQkFJbWFnZU9LKHRpZiwgZW1zZykgJiYgVElGRlJHQkFJbWFnZUJlZ2luKCZpbWcsIHRpZiwgc3RvcCwgZW1zZykpIHsKKwkJaW1nLnJlcV9vcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uOworCQkvKiBYWFggdmVyaWZ5IHJ3aWR0aCBhbmQgcmhlaWdodCBhZ2FpbnN0IHdpZHRoIGFuZCBoZWlnaHQgKi8KKwkJb2sgPSBUSUZGUkdCQUltYWdlR2V0KCZpbWcsIHJhc3RlcisocmhlaWdodC1pbWcuaGVpZ2h0KSpyd2lkdGgsCisJCQlyd2lkdGgsIGltZy5oZWlnaHQpOworCQlUSUZGUkdCQUltYWdlRW5kKCZpbWcpOworCX0gZWxzZSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBUSUZGRmlsZU5hbWUodGlmKSwgIiVzIiwgZW1zZyk7CisJCW9rID0gMDsKKyAgICB9CisgICAgcmV0dXJuIChvayk7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBzcGVjaWZpZWQgaW1hZ2UgaW50byBhbiBBQkdSLWZvcm1hdCByYXN0ZXIuIFVzZSBib3R0b20gbGVmdAorICogb3JpZ2luIGZvciByYXN0ZXIgYnkgZGVmYXVsdC4KKyAqLworaW50CitUSUZGUmVhZFJHQkFJbWFnZShUSUZGKiB0aWYsCisJCSAgdWludDMyIHJ3aWR0aCwgdWludDMyIHJoZWlnaHQsIHVpbnQzMiogcmFzdGVyLCBpbnQgc3RvcCkKK3sKKwlyZXR1cm4gVElGRlJlYWRSR0JBSW1hZ2VPcmllbnRlZCh0aWYsIHJ3aWR0aCwgcmhlaWdodCwgcmFzdGVyLAorCQkJCQkgT1JJRU5UQVRJT05fQk9UTEVGVCwgc3RvcCk7Cit9CisKK3N0YXRpYyBpbnQgCitzZXRvcmllbnRhdGlvbihUSUZGUkdCQUltYWdlKiBpbWcpCit7CisJc3dpdGNoIChpbWctPm9yaWVudGF0aW9uKSB7CisJCWNhc2UgT1JJRU5UQVRJT05fVE9QTEVGVDoKKwkJY2FzZSBPUklFTlRBVElPTl9MRUZUVE9QOgorCQkJaWYgKGltZy0+cmVxX29yaWVudGF0aW9uID09IE9SSUVOVEFUSU9OX1RPUFJJR0hUIHx8CisJCQkgICAgaW1nLT5yZXFfb3JpZW50YXRpb24gPT0gT1JJRU5UQVRJT05fUklHSFRUT1ApCisJCQkJcmV0dXJuIEZMSVBfSE9SSVpPTlRBTExZOworCQkJZWxzZSBpZiAoaW1nLT5yZXFfb3JpZW50YXRpb24gPT0gT1JJRU5UQVRJT05fQk9UUklHSFQgfHwKKwkJCSAgICBpbWctPnJlcV9vcmllbnRhdGlvbiA9PSBPUklFTlRBVElPTl9SSUdIVEJPVCkKKwkJCQlyZXR1cm4gRkxJUF9IT1JJWk9OVEFMTFkgfCBGTElQX1ZFUlRJQ0FMTFk7CisJCQllbHNlIGlmIChpbWctPnJlcV9vcmllbnRhdGlvbiA9PSBPUklFTlRBVElPTl9CT1RMRUZUIHx8CisJCQkgICAgaW1nLT5yZXFfb3JpZW50YXRpb24gPT0gT1JJRU5UQVRJT05fTEVGVEJPVCkKKwkJCQlyZXR1cm4gRkxJUF9WRVJUSUNBTExZOworCQkJZWxzZQorCQkJCXJldHVybiAwOworCQljYXNlIE9SSUVOVEFUSU9OX1RPUFJJR0hUOgorCQljYXNlIE9SSUVOVEFUSU9OX1JJR0hUVE9QOgorCQkJaWYgKGltZy0+cmVxX29yaWVudGF0aW9uID09IE9SSUVOVEFUSU9OX1RPUExFRlQgfHwKKwkJCSAgICBpbWctPnJlcV9vcmllbnRhdGlvbiA9PSBPUklFTlRBVElPTl9MRUZUVE9QKQorCQkJCXJldHVybiBGTElQX0hPUklaT05UQUxMWTsKKwkJCWVsc2UgaWYgKGltZy0+cmVxX29yaWVudGF0aW9uID09IE9SSUVOVEFUSU9OX0JPVFJJR0hUIHx8CisJCQkgICAgaW1nLT5yZXFfb3JpZW50YXRpb24gPT0gT1JJRU5UQVRJT05fUklHSFRCT1QpCisJCQkJcmV0dXJuIEZMSVBfVkVSVElDQUxMWTsKKwkJCWVsc2UgaWYgKGltZy0+cmVxX29yaWVudGF0aW9uID09IE9SSUVOVEFUSU9OX0JPVExFRlQgfHwKKwkJCSAgICBpbWctPnJlcV9vcmllbnRhdGlvbiA9PSBPUklFTlRBVElPTl9MRUZUQk9UKQorCQkJCXJldHVybiBGTElQX0hPUklaT05UQUxMWSB8IEZMSVBfVkVSVElDQUxMWTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gMDsKKwkJY2FzZSBPUklFTlRBVElPTl9CT1RSSUdIVDoKKwkJY2FzZSBPUklFTlRBVElPTl9SSUdIVEJPVDoKKwkJCWlmIChpbWctPnJlcV9vcmllbnRhdGlvbiA9PSBPUklFTlRBVElPTl9UT1BMRUZUIHx8CisJCQkgICAgaW1nLT5yZXFfb3JpZW50YXRpb24gPT0gT1JJRU5UQVRJT05fTEVGVFRPUCkKKwkJCQlyZXR1cm4gRkxJUF9IT1JJWk9OVEFMTFkgfCBGTElQX1ZFUlRJQ0FMTFk7CisJCQllbHNlIGlmIChpbWctPnJlcV9vcmllbnRhdGlvbiA9PSBPUklFTlRBVElPTl9UT1BSSUdIVCB8fAorCQkJICAgIGltZy0+cmVxX29yaWVudGF0aW9uID09IE9SSUVOVEFUSU9OX1JJR0hUVE9QKQorCQkJCXJldHVybiBGTElQX1ZFUlRJQ0FMTFk7CisJCQllbHNlIGlmIChpbWctPnJlcV9vcmllbnRhdGlvbiA9PSBPUklFTlRBVElPTl9CT1RMRUZUIHx8CisJCQkgICAgaW1nLT5yZXFfb3JpZW50YXRpb24gPT0gT1JJRU5UQVRJT05fTEVGVEJPVCkKKwkJCQlyZXR1cm4gRkxJUF9IT1JJWk9OVEFMTFk7CisJCQllbHNlCisJCQkJcmV0dXJuIDA7CisJCWNhc2UgT1JJRU5UQVRJT05fQk9UTEVGVDoKKwkJY2FzZSBPUklFTlRBVElPTl9MRUZUQk9UOgorCQkJaWYgKGltZy0+cmVxX29yaWVudGF0aW9uID09IE9SSUVOVEFUSU9OX1RPUExFRlQgfHwKKwkJCSAgICBpbWctPnJlcV9vcmllbnRhdGlvbiA9PSBPUklFTlRBVElPTl9MRUZUVE9QKQorCQkJCXJldHVybiBGTElQX1ZFUlRJQ0FMTFk7CisJCQllbHNlIGlmIChpbWctPnJlcV9vcmllbnRhdGlvbiA9PSBPUklFTlRBVElPTl9UT1BSSUdIVCB8fAorCQkJICAgIGltZy0+cmVxX29yaWVudGF0aW9uID09IE9SSUVOVEFUSU9OX1JJR0hUVE9QKQorCQkJCXJldHVybiBGTElQX0hPUklaT05UQUxMWSB8IEZMSVBfVkVSVElDQUxMWTsKKwkJCWVsc2UgaWYgKGltZy0+cmVxX29yaWVudGF0aW9uID09IE9SSUVOVEFUSU9OX0JPVFJJR0hUIHx8CisJCQkgICAgaW1nLT5yZXFfb3JpZW50YXRpb24gPT0gT1JJRU5UQVRJT05fUklHSFRCT1QpCisJCQkJcmV0dXJuIEZMSVBfSE9SSVpPTlRBTExZOworCQkJZWxzZQorCQkJCXJldHVybiAwOworCQlkZWZhdWx0OgkvKiBOT1RSRUFDSEVEICovCisJCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qCisgKiBHZXQgYW4gdGlsZS1vcmdhbml6ZWQgaW1hZ2UgdGhhdCBoYXMKKyAqCVBsYW5hckNvbmZpZ3VyYXRpb24gY29udGlndW91cyBpZiBTYW1wbGVzUGVyUGl4ZWwgPiAxCisgKiBvcgorICoJU2FtcGxlc1BlclBpeGVsID09IDEKKyAqLwkKK3N0YXRpYyBpbnQKK2d0VGlsZUNvbnRpZyhUSUZGUkdCQUltYWdlKiBpbWcsIHVpbnQzMiogcmFzdGVyLCB1aW50MzIgdywgdWludDMyIGgpCit7CisgICAgVElGRiogdGlmID0gaW1nLT50aWY7CisgICAgdGlsZUNvbnRpZ1JvdXRpbmUgcHV0ID0gaW1nLT5wdXQuY29udGlnOworICAgIHVpbnQzMiBjb2wsIHJvdywgeSwgcm93c3RvcmVhZDsKKyAgICB0bXNpemVfdCBwb3M7CisgICAgdWludDMyIHR3LCB0aDsKKyAgICB1bnNpZ25lZCBjaGFyKiBidWY7CisgICAgaW50MzIgZnJvbXNrZXcsIHRvc2tldzsKKyAgICB1aW50MzIgbnJvdzsKKyAgICBpbnQgcmV0ID0gMSwgZmxpcDsKKyAgICB1aW50MzIgdGhpc190dywgdG9jb2w7CisgICAgaW50MzIgdGhpc190b3NrZXcsIGxlZnRtb3N0X3Rvc2tldzsKKyAgICBpbnQzMiBsZWZ0bW9zdF9mcm9tc2tldzsKKyAgICB1aW50MzIgbGVmdG1vc3RfdHc7CisKKyAgICBidWYgPSAodW5zaWduZWQgY2hhciopIF9USUZGbWFsbG9jKFRJRkZUaWxlU2l6ZSh0aWYpKTsKKyAgICBpZiAoYnVmID09IDApIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIFRJRkZGaWxlTmFtZSh0aWYpLCAiJXMiLCAiTm8gc3BhY2UgZm9yIHRpbGUgYnVmZmVyIik7CisJCXJldHVybiAoMCk7CisgICAgfQorICAgIF9USUZGbWVtc2V0KGJ1ZiwgMCwgVElGRlRpbGVTaXplKHRpZikpOworICAgIFRJRkZHZXRGaWVsZCh0aWYsIFRJRkZUQUdfVElMRVdJRFRILCAmdHcpOworICAgIFRJRkZHZXRGaWVsZCh0aWYsIFRJRkZUQUdfVElMRUxFTkdUSCwgJnRoKTsKKworICAgIGZsaXAgPSBzZXRvcmllbnRhdGlvbihpbWcpOworICAgIGlmIChmbGlwICYgRkxJUF9WRVJUSUNBTExZKSB7CisJICAgIHkgPSBoIC0gMTsKKwkgICAgdG9za2V3ID0gLShpbnQzMikodHcgKyB3KTsKKyAgICB9CisgICAgZWxzZSB7CisJICAgIHkgPSAwOworCSAgICB0b3NrZXcgPSAtKGludDMyKSh0dyAtIHcpOworICAgIH0KKyAgICAgCisgICAgLyoKKyAgICAgKglMZWZ0bW9zdCB0aWxlIGlzIGNsaXBwZWQgb24gbGVmdCBzaWRlIGlmIGNvbF9vZmZzZXQgPiAwLgorICAgICAqLworICAgIGxlZnRtb3N0X2Zyb21za2V3ID0gaW1nLT5jb2xfb2Zmc2V0ICUgdHc7CisgICAgbGVmdG1vc3RfdHcgPSB0dyAtIGxlZnRtb3N0X2Zyb21za2V3OworICAgIGxlZnRtb3N0X3Rvc2tldyA9IHRvc2tldyArIGxlZnRtb3N0X2Zyb21za2V3OworICAgIGZvciAocm93ID0gMDsgcm93IDwgaDsgcm93ICs9IG5yb3cpCisgICAgeworICAgICAgICByb3dzdG9yZWFkID0gdGggLSAocm93ICsgaW1nLT5yb3dfb2Zmc2V0KSAlIHRoOworICAgIAlucm93ID0gKHJvdyArIHJvd3N0b3JlYWQgPiBoID8gaCAtIHJvdyA6IHJvd3N0b3JlYWQpOworCWZyb21za2V3ID0gbGVmdG1vc3RfZnJvbXNrZXc7CisJdGhpc190dyA9IGxlZnRtb3N0X3R3OworCXRoaXNfdG9za2V3ID0gbGVmdG1vc3RfdG9za2V3OworCXRvY29sID0gMDsKKwljb2wgPSBpbWctPmNvbF9vZmZzZXQ7CisJd2hpbGUgKHRvY29sIDwgdykKKyAgICAgICAgeworCSAgICBpZiAoVElGRlJlYWRUaWxlKHRpZiwgYnVmLCBjb2wsICAKKwkJCSAgICAgcm93K2ltZy0+cm93X29mZnNldCwgMCwgMCk9PSh0bXNpemVfdCkoLTEpICYmIGltZy0+c3RvcG9uZXJyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3MgPSAoKHJvdytpbWctPnJvd19vZmZzZXQpICUgdGgpICogVElGRlRpbGVSb3dTaXplKHRpZikgKyBcCisJCSAgICgodG1zaXplX3QpIGZyb21za2V3ICogaW1nLT5zYW1wbGVzcGVycGl4ZWwpOworCSAgICBpZiAodG9jb2wgKyB0aGlzX3R3ID4gdykgCisJICAgIHsKKwkJLyoKKwkJICogUmlnaHRtb3N0IHRpbGUgaXMgY2xpcHBlZCBvbiByaWdodCBzaWRlLgorCQkgKi8KKwkJZnJvbXNrZXcgPSB0dyAtICh3IC0gdG9jb2wpOworCQl0aGlzX3R3ID0gdHcgLSBmcm9tc2tldzsKKwkJdGhpc190b3NrZXcgPSB0b3NrZXcgKyBmcm9tc2tldzsKKwkgICAgfQorCSAgICAoKnB1dCkoaW1nLCByYXN0ZXIreSp3K3RvY29sLCB0b2NvbCwgeSwgdGhpc190dywgbnJvdywgZnJvbXNrZXcsIHRoaXNfdG9za2V3LCBidWYgKyBwb3MpOworCSAgICB0b2NvbCArPSB0aGlzX3R3OworCSAgICBjb2wgKz0gdGhpc190dzsKKwkgICAgLyoKKwkgICAgICogQWZ0ZXIgdGhlIGxlZnRtb3N0IHRpbGUsIHRpbGVzIGFyZSBubyBsb25nZXIgY2xpcHBlZCBvbiBsZWZ0IHNpZGUuCisJICAgICAqLworCSAgICBmcm9tc2tldyA9IDA7CisJICAgIHRoaXNfdHcgPSB0dzsKKwkgICAgdGhpc190b3NrZXcgPSB0b3NrZXc7CisJfQorCisgICAgICAgIHkgKz0gKGZsaXAgJiBGTElQX1ZFUlRJQ0FMTFkgPyAtKGludDMyKSBucm93IDogKGludDMyKSBucm93KTsKKyAgICB9CisgICAgX1RJRkZmcmVlKGJ1Zik7CisKKyAgICBpZiAoZmxpcCAmIEZMSVBfSE9SSVpPTlRBTExZKSB7CisJICAgIHVpbnQzMiBsaW5lOworCisJICAgIGZvciAobGluZSA9IDA7IGxpbmUgPCBoOyBsaW5lKyspIHsKKwkJICAgIHVpbnQzMiAqbGVmdCA9IHJhc3RlciArIChsaW5lICogdyk7CisJCSAgICB1aW50MzIgKnJpZ2h0ID0gbGVmdCArIHcgLSAxOworCQkgICAgCisJCSAgICB3aGlsZSAoIGxlZnQgPCByaWdodCApIHsKKwkJCSAgICB1aW50MzIgdGVtcCA9ICpsZWZ0OworCQkJICAgICpsZWZ0ID0gKnJpZ2h0OworCQkJICAgICpyaWdodCA9IHRlbXA7CisJCQkgICAgbGVmdCsrLCByaWdodC0tOworCQkgICAgfQorCSAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChyZXQpOworfQorCisvKgorICogR2V0IGFuIHRpbGUtb3JnYW5pemVkIGltYWdlIHRoYXQgaGFzCisgKgkgU2FtcGxlc1BlclBpeGVsID4gMQorICoJIFBsYW5hckNvbmZpZ3VyYXRpb24gc2VwYXJhdGVkCisgKiBXZSBhc3N1bWUgdGhhdCBhbGwgc3VjaCBpbWFnZXMgYXJlIFJHQi4KKyAqLwkKK3N0YXRpYyBpbnQKK2d0VGlsZVNlcGFyYXRlKFRJRkZSR0JBSW1hZ2UqIGltZywgdWludDMyKiByYXN0ZXIsIHVpbnQzMiB3LCB1aW50MzIgaCkKK3sKKwlUSUZGKiB0aWYgPSBpbWctPnRpZjsKKwl0aWxlU2VwYXJhdGVSb3V0aW5lIHB1dCA9IGltZy0+cHV0LnNlcGFyYXRlOworCXVpbnQzMiBjb2wsIHJvdywgeSwgcm93c3RvcmVhZDsKKwl0bXNpemVfdCBwb3M7CisJdWludDMyIHR3LCB0aDsKKwl1bnNpZ25lZCBjaGFyKiBidWY7CisJdW5zaWduZWQgY2hhciogcDA7CisJdW5zaWduZWQgY2hhciogcDE7CisJdW5zaWduZWQgY2hhciogcDI7CisJdW5zaWduZWQgY2hhciogcGE7CisJdG1zaXplX3QgdGlsZXNpemU7CisJdG1zaXplX3QgYnVmc2l6ZTsKKwlpbnQzMiBmcm9tc2tldywgdG9za2V3OworCWludCBhbHBoYSA9IGltZy0+YWxwaGE7CisJdWludDMyIG5yb3c7CisJaW50IHJldCA9IDEsIGZsaXA7CisgICAgICAgIGludCBjb2xvcmNoYW5uZWxzOworCXVpbnQzMiB0aGlzX3R3LCB0b2NvbDsKKwlpbnQzMiB0aGlzX3Rvc2tldywgbGVmdG1vc3RfdG9za2V3OworCWludDMyIGxlZnRtb3N0X2Zyb21za2V3OworCXVpbnQzMiBsZWZ0bW9zdF90dzsKKworCXRpbGVzaXplID0gVElGRlRpbGVTaXplKHRpZik7ICAKKwlidWZzaXplID0gVElGRlNhZmVNdWx0aXBseSh0bXNpemVfdCxhbHBoYT80OjMsdGlsZXNpemUpOworCWlmIChidWZzaXplID09IDApIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIFRJRkZGaWxlTmFtZSh0aWYpLCAiSW50ZWdlciBvdmVyZmxvdyBpbiAlcyIsICJndFRpbGVTZXBhcmF0ZSIpOworCQlyZXR1cm4gKDApOworCX0KKwlidWYgPSAodW5zaWduZWQgY2hhciopIF9USUZGbWFsbG9jKGJ1ZnNpemUpOworCWlmIChidWYgPT0gMCkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgVElGRkZpbGVOYW1lKHRpZiksICIlcyIsICJObyBzcGFjZSBmb3IgdGlsZSBidWZmZXIiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJX1RJRkZtZW1zZXQoYnVmLCAwLCBidWZzaXplKTsKKwlwMCA9IGJ1ZjsKKwlwMSA9IHAwICsgdGlsZXNpemU7CisJcDIgPSBwMSArIHRpbGVzaXplOworCXBhID0gKGFscGhhPyhwMit0aWxlc2l6ZSk6TlVMTCk7CisJVElGRkdldEZpZWxkKHRpZiwgVElGRlRBR19USUxFV0lEVEgsICZ0dyk7CisJVElGRkdldEZpZWxkKHRpZiwgVElGRlRBR19USUxFTEVOR1RILCAmdGgpOworCisJZmxpcCA9IHNldG9yaWVudGF0aW9uKGltZyk7CisJaWYgKGZsaXAgJiBGTElQX1ZFUlRJQ0FMTFkpIHsKKwkJeSA9IGggLSAxOworCQl0b3NrZXcgPSAtKGludDMyKSh0dyArIHcpOworCX0KKwllbHNlIHsKKwkJeSA9IDA7CisJCXRvc2tldyA9IC0oaW50MzIpKHR3IC0gdyk7CisJfQorCisgICAgICAgIHN3aXRjaCggaW1nLT5waG90b21ldHJpYyApCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIFBIT1RPTUVUUklDX01JTklTV0hJVEU6CisgICAgICAgICAgY2FzZSBQSE9UT01FVFJJQ19NSU5JU0JMQUNLOgorICAgICAgICAgIGNhc2UgUEhPVE9NRVRSSUNfUEFMRVRURToKKyAgICAgICAgICAgIGNvbG9yY2hhbm5lbHMgPSAxOworICAgICAgICAgICAgcDIgPSBwMSA9IHAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY29sb3JjaGFubmVscyA9IDM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisJLyoKKwkgKglMZWZ0bW9zdCB0aWxlIGlzIGNsaXBwZWQgb24gbGVmdCBzaWRlIGlmIGNvbF9vZmZzZXQgPiAwLgorCSAqLworCWxlZnRtb3N0X2Zyb21za2V3ID0gaW1nLT5jb2xfb2Zmc2V0ICUgdHc7CisJbGVmdG1vc3RfdHcgPSB0dyAtIGxlZnRtb3N0X2Zyb21za2V3OworCWxlZnRtb3N0X3Rvc2tldyA9IHRvc2tldyArIGxlZnRtb3N0X2Zyb21za2V3OworCWZvciAocm93ID0gMDsgcm93IDwgaDsgcm93ICs9IG5yb3cpCisJeworCQlyb3dzdG9yZWFkID0gdGggLSAocm93ICsgaW1nLT5yb3dfb2Zmc2V0KSAlIHRoOworCQlucm93ID0gKHJvdyArIHJvd3N0b3JlYWQgPiBoID8gaCAtIHJvdyA6IHJvd3N0b3JlYWQpOworCQlmcm9tc2tldyA9IGxlZnRtb3N0X2Zyb21za2V3OworCQl0aGlzX3R3ID0gbGVmdG1vc3RfdHc7CisJCXRoaXNfdG9za2V3ID0gbGVmdG1vc3RfdG9za2V3OworCQl0b2NvbCA9IDA7CisJCWNvbCA9IGltZy0+Y29sX29mZnNldDsKKwkJd2hpbGUgKHRvY29sIDwgdykKKwkJeworCQkJaWYgKFRJRkZSZWFkVGlsZSh0aWYsIHAwLCBjb2wsICAKKwkJCSAgICByb3craW1nLT5yb3dfb2Zmc2V0LDAsMCk9PSh0bXNpemVfdCkoLTEpICYmIGltZy0+c3RvcG9uZXJyKQorCQkJeworCQkJCXJldCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoY29sb3JjaGFubmVscyA+IDEgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgVElGRlJlYWRUaWxlKHRpZiwgcDEsIGNvbCwgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3craW1nLT5yb3dfb2Zmc2V0LDAsMSkgPT0gKHRtc2l6ZV90KSgtMSkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW1nLT5zdG9wb25lcnIpCisJCQl7CisJCQkJcmV0ID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChjb2xvcmNoYW5uZWxzID4gMSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBUSUZGUmVhZFRpbGUodGlmLCBwMiwgY29sLCAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdytpbWctPnJvd19vZmZzZXQsMCwyKSA9PSAodG1zaXplX3QpKC0xKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbWctPnN0b3BvbmVycikKKwkJCXsKKwkJCQlyZXQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGFscGhhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgVElGRlJlYWRUaWxlKHRpZixwYSxjb2wsICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93K2ltZy0+cm93X29mZnNldCwwLGNvbG9yY2hhbm5lbHMpID09ICh0bXNpemVfdCkoLTEpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGltZy0+c3RvcG9uZXJyKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQl9CisKKwkJCXBvcyA9ICgocm93K2ltZy0+cm93X29mZnNldCkgJSB0aCkgKiBUSUZGVGlsZVJvd1NpemUodGlmKSArIFwKKwkJCSAgICgodG1zaXplX3QpIGZyb21za2V3ICogaW1nLT5zYW1wbGVzcGVycGl4ZWwpOworCQkJaWYgKHRvY29sICsgdGhpc190dyA+IHcpIAorCQkJeworCQkJCS8qCisJCQkJICogUmlnaHRtb3N0IHRpbGUgaXMgY2xpcHBlZCBvbiByaWdodCBzaWRlLgorCQkJCSAqLworCQkJCWZyb21za2V3ID0gdHcgLSAodyAtIHRvY29sKTsKKwkJCQl0aGlzX3R3ID0gdHcgLSBmcm9tc2tldzsKKwkJCQl0aGlzX3Rvc2tldyA9IHRvc2tldyArIGZyb21za2V3OworCQkJfQorCQkJKCpwdXQpKGltZywgcmFzdGVyK3kqdyt0b2NvbCwgdG9jb2wsIHksIHRoaXNfdHcsIG5yb3csIGZyb21za2V3LCB0aGlzX3Rvc2tldywgXAorCQkJCXAwICsgcG9zLCBwMSArIHBvcywgcDIgKyBwb3MsIChhbHBoYT8ocGErcG9zKTpOVUxMKSk7CisJCQl0b2NvbCArPSB0aGlzX3R3OworCQkJY29sICs9IHRoaXNfdHc7CisJCQkvKgorCQkJKiBBZnRlciB0aGUgbGVmdG1vc3QgdGlsZSwgdGlsZXMgYXJlIG5vIGxvbmdlciBjbGlwcGVkIG9uIGxlZnQgc2lkZS4KKwkJCSovCisJCQlmcm9tc2tldyA9IDA7CisJCQl0aGlzX3R3ID0gdHc7CisJCQl0aGlzX3Rvc2tldyA9IHRvc2tldzsKKwkJfQorCisJCXkgKz0gKGZsaXAgJiBGTElQX1ZFUlRJQ0FMTFkgPy0oaW50MzIpIG5yb3cgOiAoaW50MzIpIG5yb3cpOworCX0KKworCWlmIChmbGlwICYgRkxJUF9IT1JJWk9OVEFMTFkpIHsKKwkJdWludDMyIGxpbmU7CisKKwkJZm9yIChsaW5lID0gMDsgbGluZSA8IGg7IGxpbmUrKykgeworCQkJdWludDMyICpsZWZ0ID0gcmFzdGVyICsgKGxpbmUgKiB3KTsKKwkJCXVpbnQzMiAqcmlnaHQgPSBsZWZ0ICsgdyAtIDE7CisKKwkJCXdoaWxlICggbGVmdCA8IHJpZ2h0ICkgeworCQkJCXVpbnQzMiB0ZW1wID0gKmxlZnQ7CisJCQkJKmxlZnQgPSAqcmlnaHQ7CisJCQkJKnJpZ2h0ID0gdGVtcDsKKwkJCQlsZWZ0KyssIHJpZ2h0LS07CisJCQl9CisJCX0KKwl9CisKKwlfVElGRmZyZWUoYnVmKTsKKwlyZXR1cm4gKHJldCk7Cit9CisKKy8qCisgKiBHZXQgYSBzdHJpcC1vcmdhbml6ZWQgaW1hZ2UgdGhhdCBoYXMKKyAqCVBsYW5hckNvbmZpZ3VyYXRpb24gY29udGlndW91cyBpZiBTYW1wbGVzUGVyUGl4ZWwgPiAxCisgKiBvcgorICoJU2FtcGxlc1BlclBpeGVsID09IDEKKyAqLwkKK3N0YXRpYyBpbnQKK2d0U3RyaXBDb250aWcoVElGRlJHQkFJbWFnZSogaW1nLCB1aW50MzIqIHJhc3RlciwgdWludDMyIHcsIHVpbnQzMiBoKQoreworCVRJRkYqIHRpZiA9IGltZy0+dGlmOworCXRpbGVDb250aWdSb3V0aW5lIHB1dCA9IGltZy0+cHV0LmNvbnRpZzsKKwl1aW50MzIgcm93LCB5LCBucm93LCBucm93c3ViLCByb3dzdG9yZWFkOworCXRtc2l6ZV90IHBvczsKKwl1bnNpZ25lZCBjaGFyKiBidWY7CisJdWludDMyIHJvd3NwZXJzdHJpcDsKKwl1aW50MTYgc3Vic2FtcGxpbmdob3Isc3Vic2FtcGxpbmd2ZXI7CisJdWludDMyIGltYWdld2lkdGggPSBpbWctPndpZHRoOworCXRtc2l6ZV90IHNjYW5saW5lOworCWludDMyIGZyb21za2V3LCB0b3NrZXc7CisJaW50IHJldCA9IDEsIGZsaXA7CisKKwlUSUZGR2V0RmllbGREZWZhdWx0ZWQodGlmLCBUSUZGVEFHX1lDQkNSU1VCU0FNUExJTkcsICZzdWJzYW1wbGluZ2hvciwgJnN1YnNhbXBsaW5ndmVyKTsKKwlpZiggc3Vic2FtcGxpbmd2ZXIgPT0gMCApIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIFRJRkZGaWxlTmFtZSh0aWYpLCAiSW52YWxpZCB2ZXJ0aWNhbCBZQ2JDciBzdWJzYW1wbGluZyIpOworCQlyZXR1cm4gKDApOworCX0KKworCWJ1ZiA9ICh1bnNpZ25lZCBjaGFyKikgX1RJRkZtYWxsb2MoVElGRlN0cmlwU2l6ZSh0aWYpKTsKKwlpZiAoYnVmID09IDApIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIFRJRkZGaWxlTmFtZSh0aWYpLCAiTm8gc3BhY2UgZm9yIHN0cmlwIGJ1ZmZlciIpOworCQlyZXR1cm4gKDApOworCX0KKwlfVElGRm1lbXNldChidWYsIDAsIFRJRkZTdHJpcFNpemUodGlmKSk7CisKKwlmbGlwID0gc2V0b3JpZW50YXRpb24oaW1nKTsKKwlpZiAoZmxpcCAmIEZMSVBfVkVSVElDQUxMWSkgeworCQl5ID0gaCAtIDE7CisJCXRvc2tldyA9IC0oaW50MzIpKHcgKyB3KTsKKwl9IGVsc2UgeworCQl5ID0gMDsKKwkJdG9za2V3ID0gLShpbnQzMikodyAtIHcpOworCX0KKworCVRJRkZHZXRGaWVsZERlZmF1bHRlZCh0aWYsIFRJRkZUQUdfUk9XU1BFUlNUUklQLCAmcm93c3BlcnN0cmlwKTsKKworCXNjYW5saW5lID0gVElGRlNjYW5saW5lU2l6ZSh0aWYpOworCWZyb21za2V3ID0gKHcgPCBpbWFnZXdpZHRoID8gaW1hZ2V3aWR0aCAtIHcgOiAwKTsKKwlmb3IgKHJvdyA9IDA7IHJvdyA8IGg7IHJvdyArPSBucm93KQorCXsKKwkJcm93c3RvcmVhZCA9IHJvd3NwZXJzdHJpcCAtIChyb3cgKyBpbWctPnJvd19vZmZzZXQpICUgcm93c3BlcnN0cmlwOworCQlucm93ID0gKHJvdyArIHJvd3N0b3JlYWQgPiBoID8gaCAtIHJvdyA6IHJvd3N0b3JlYWQpOworCQlucm93c3ViID0gbnJvdzsKKwkJaWYgKChucm93c3ViJXN1YnNhbXBsaW5ndmVyKSE9MCkKKwkJCW5yb3dzdWIrPXN1YnNhbXBsaW5ndmVyLW5yb3dzdWIlc3Vic2FtcGxpbmd2ZXI7CisJCWlmIChUSUZGUmVhZEVuY29kZWRTdHJpcCh0aWYsCisJCSAgICBUSUZGQ29tcHV0ZVN0cmlwKHRpZixyb3craW1nLT5yb3dfb2Zmc2V0LCAwKSwKKwkJICAgIGJ1ZiwKKwkJICAgICgocm93ICsgaW1nLT5yb3dfb2Zmc2V0KSVyb3dzcGVyc3RyaXAgKyBucm93c3ViKSAqIHNjYW5saW5lKT09KHRtc2l6ZV90KSgtMSkKKwkJICAgICYmIGltZy0+c3RvcG9uZXJyKQorCQl7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlwb3MgPSAoKHJvdyArIGltZy0+cm93X29mZnNldCkgJSByb3dzcGVyc3RyaXApICogc2NhbmxpbmUgKyBcCisJCQkoKHRtc2l6ZV90KSBpbWctPmNvbF9vZmZzZXQgKiBpbWctPnNhbXBsZXNwZXJwaXhlbCk7CisJCSgqcHV0KShpbWcsIHJhc3Rlcit5KncsIDAsIHksIHcsIG5yb3csIGZyb21za2V3LCB0b3NrZXcsIGJ1ZiArIHBvcyk7CisJCXkgKz0gKGZsaXAgJiBGTElQX1ZFUlRJQ0FMTFkgPyAtKGludDMyKSBucm93IDogKGludDMyKSBucm93KTsKKwl9CisKKwlpZiAoZmxpcCAmIEZMSVBfSE9SSVpPTlRBTExZKSB7CisJCXVpbnQzMiBsaW5lOworCisJCWZvciAobGluZSA9IDA7IGxpbmUgPCBoOyBsaW5lKyspIHsKKwkJCXVpbnQzMiAqbGVmdCA9IHJhc3RlciArIChsaW5lICogdyk7CisJCQl1aW50MzIgKnJpZ2h0ID0gbGVmdCArIHcgLSAxOworCisJCQl3aGlsZSAoIGxlZnQgPCByaWdodCApIHsKKwkJCQl1aW50MzIgdGVtcCA9ICpsZWZ0OworCQkJCSpsZWZ0ID0gKnJpZ2h0OworCQkJCSpyaWdodCA9IHRlbXA7CisJCQkJbGVmdCsrLCByaWdodC0tOworCQkJfQorCQl9CisJfQorCisJX1RJRkZmcmVlKGJ1Zik7CisJcmV0dXJuIChyZXQpOworfQorCisvKgorICogR2V0IGEgc3RyaXAtb3JnYW5pemVkIGltYWdlIHdpdGgKKyAqCSBTYW1wbGVzUGVyUGl4ZWwgPiAxCisgKgkgUGxhbmFyQ29uZmlndXJhdGlvbiBzZXBhcmF0ZWQKKyAqIFdlIGFzc3VtZSB0aGF0IGFsbCBzdWNoIGltYWdlcyBhcmUgUkdCLgorICovCitzdGF0aWMgaW50CitndFN0cmlwU2VwYXJhdGUoVElGRlJHQkFJbWFnZSogaW1nLCB1aW50MzIqIHJhc3RlciwgdWludDMyIHcsIHVpbnQzMiBoKQoreworCVRJRkYqIHRpZiA9IGltZy0+dGlmOworCXRpbGVTZXBhcmF0ZVJvdXRpbmUgcHV0ID0gaW1nLT5wdXQuc2VwYXJhdGU7CisJdW5zaWduZWQgY2hhciAqYnVmOworCXVuc2lnbmVkIGNoYXIgKnAwLCAqcDEsICpwMiwgKnBhOworCXVpbnQzMiByb3csIHksIG5yb3csIHJvd3N0b3JlYWQ7CisJdG1zaXplX3QgcG9zOworCXRtc2l6ZV90IHNjYW5saW5lOworCXVpbnQzMiByb3dzcGVyc3RyaXAsIG9mZnNldF9yb3c7CisJdWludDMyIGltYWdld2lkdGggPSBpbWctPndpZHRoOworCXRtc2l6ZV90IHN0cmlwc2l6ZTsKKwl0bXNpemVfdCBidWZzaXplOworCWludDMyIGZyb21za2V3LCB0b3NrZXc7CisJaW50IGFscGhhID0gaW1nLT5hbHBoYTsKKwlpbnQgcmV0ID0gMSwgZmxpcCwgY29sb3JjaGFubmVsczsKKworCXN0cmlwc2l6ZSA9IFRJRkZTdHJpcFNpemUodGlmKTsgIAorCWJ1ZnNpemUgPSBUSUZGU2FmZU11bHRpcGx5KHRtc2l6ZV90LGFscGhhPzQ6MyxzdHJpcHNpemUpOworCWlmIChidWZzaXplID09IDApIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIFRJRkZGaWxlTmFtZSh0aWYpLCAiSW50ZWdlciBvdmVyZmxvdyBpbiAlcyIsICJndFN0cmlwU2VwYXJhdGUiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJcDAgPSBidWYgPSAodW5zaWduZWQgY2hhciAqKV9USUZGbWFsbG9jKGJ1ZnNpemUpOworCWlmIChidWYgPT0gMCkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgVElGRkZpbGVOYW1lKHRpZiksICJObyBzcGFjZSBmb3IgdGlsZSBidWZmZXIiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJX1RJRkZtZW1zZXQoYnVmLCAwLCBidWZzaXplKTsKKwlwMSA9IHAwICsgc3RyaXBzaXplOworCXAyID0gcDEgKyBzdHJpcHNpemU7CisJcGEgPSAoYWxwaGE/KHAyK3N0cmlwc2l6ZSk6TlVMTCk7CisKKwlmbGlwID0gc2V0b3JpZW50YXRpb24oaW1nKTsKKwlpZiAoZmxpcCAmIEZMSVBfVkVSVElDQUxMWSkgeworCQl5ID0gaCAtIDE7CisJCXRvc2tldyA9IC0oaW50MzIpKHcgKyB3KTsKKwl9CisJZWxzZSB7CisJCXkgPSAwOworCQl0b3NrZXcgPSAtKGludDMyKSh3IC0gdyk7CisJfQorCisgICAgICAgIHN3aXRjaCggaW1nLT5waG90b21ldHJpYyApCisgICAgICAgIHsKKyAgICAgICAgICBjYXNlIFBIT1RPTUVUUklDX01JTklTV0hJVEU6CisgICAgICAgICAgY2FzZSBQSE9UT01FVFJJQ19NSU5JU0JMQUNLOgorICAgICAgICAgIGNhc2UgUEhPVE9NRVRSSUNfUEFMRVRURToKKyAgICAgICAgICAgIGNvbG9yY2hhbm5lbHMgPSAxOworICAgICAgICAgICAgcDIgPSBwMSA9IHAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY29sb3JjaGFubmVscyA9IDM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisJVElGRkdldEZpZWxkRGVmYXVsdGVkKHRpZiwgVElGRlRBR19ST1dTUEVSU1RSSVAsICZyb3dzcGVyc3RyaXApOworCXNjYW5saW5lID0gVElGRlNjYW5saW5lU2l6ZSh0aWYpOyAgCisJZnJvbXNrZXcgPSAodyA8IGltYWdld2lkdGggPyBpbWFnZXdpZHRoIC0gdyA6IDApOworCWZvciAocm93ID0gMDsgcm93IDwgaDsgcm93ICs9IG5yb3cpCisJeworCQlyb3dzdG9yZWFkID0gcm93c3BlcnN0cmlwIC0gKHJvdyArIGltZy0+cm93X29mZnNldCkgJSByb3dzcGVyc3RyaXA7CisJCW5yb3cgPSAocm93ICsgcm93c3RvcmVhZCA+IGggPyBoIC0gcm93IDogcm93c3RvcmVhZCk7CisJCW9mZnNldF9yb3cgPSByb3cgKyBpbWctPnJvd19vZmZzZXQ7CisJCWlmIChUSUZGUmVhZEVuY29kZWRTdHJpcCh0aWYsIFRJRkZDb21wdXRlU3RyaXAodGlmLCBvZmZzZXRfcm93LCAwKSwKKwkJICAgIHAwLCAoKHJvdyArIGltZy0+cm93X29mZnNldCklcm93c3BlcnN0cmlwICsgbnJvdykgKiBzY2FubGluZSk9PSh0bXNpemVfdCkoLTEpCisJCSAgICAmJiBpbWctPnN0b3BvbmVycikKKwkJeworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjb2xvcmNoYW5uZWxzID4gMSAKKyAgICAgICAgICAgICAgICAgICAgJiYgVElGRlJlYWRFbmNvZGVkU3RyaXAodGlmLCBUSUZGQ29tcHV0ZVN0cmlwKHRpZiwgb2Zmc2V0X3JvdywgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAxLCAoKHJvdyArIGltZy0+cm93X29mZnNldCklcm93c3BlcnN0cmlwICsgbnJvdykgKiBzY2FubGluZSkgPT0gKHRtc2l6ZV90KSgtMSkKKwkJICAgICYmIGltZy0+c3RvcG9uZXJyKQorCQl7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNvbG9yY2hhbm5lbHMgPiAxIAorICAgICAgICAgICAgICAgICAgICAmJiBUSUZGUmVhZEVuY29kZWRTdHJpcCh0aWYsIFRJRkZDb21wdXRlU3RyaXAodGlmLCBvZmZzZXRfcm93LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDIsICgocm93ICsgaW1nLT5yb3dfb2Zmc2V0KSVyb3dzcGVyc3RyaXAgKyBucm93KSAqIHNjYW5saW5lKSA9PSAodG1zaXplX3QpKC0xKQorCQkgICAgJiYgaW1nLT5zdG9wb25lcnIpCisJCXsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJfQorCQlpZiAoYWxwaGEpCisJCXsKKwkJCWlmIChUSUZGUmVhZEVuY29kZWRTdHJpcCh0aWYsIFRJRkZDb21wdXRlU3RyaXAodGlmLCBvZmZzZXRfcm93LCBjb2xvcmNoYW5uZWxzKSwKKwkJCSAgICBwYSwgKChyb3cgKyBpbWctPnJvd19vZmZzZXQpJXJvd3NwZXJzdHJpcCArIG5yb3cpICogc2NhbmxpbmUpPT0odG1zaXplX3QpKC0xKQorCQkJICAgICYmIGltZy0+c3RvcG9uZXJyKQorCQkJeworCQkJCXJldCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlwb3MgPSAoKHJvdyArIGltZy0+cm93X29mZnNldCkgJSByb3dzcGVyc3RyaXApICogc2NhbmxpbmUgKyBcCisJCQkoKHRtc2l6ZV90KSBpbWctPmNvbF9vZmZzZXQgKiBpbWctPnNhbXBsZXNwZXJwaXhlbCk7CisJCSgqcHV0KShpbWcsIHJhc3Rlcit5KncsIDAsIHksIHcsIG5yb3csIGZyb21za2V3LCB0b3NrZXcsIHAwICsgcG9zLCBwMSArIHBvcywKKwkJICAgIHAyICsgcG9zLCAoYWxwaGE/KHBhK3Bvcyk6TlVMTCkpOworCQl5ICs9IChmbGlwICYgRkxJUF9WRVJUSUNBTExZID8gLShpbnQzMikgbnJvdyA6IChpbnQzMikgbnJvdyk7CisJfQorCisJaWYgKGZsaXAgJiBGTElQX0hPUklaT05UQUxMWSkgeworCQl1aW50MzIgbGluZTsKKworCQlmb3IgKGxpbmUgPSAwOyBsaW5lIDwgaDsgbGluZSsrKSB7CisJCQl1aW50MzIgKmxlZnQgPSByYXN0ZXIgKyAobGluZSAqIHcpOworCQkJdWludDMyICpyaWdodCA9IGxlZnQgKyB3IC0gMTsKKworCQkJd2hpbGUgKCBsZWZ0IDwgcmlnaHQgKSB7CisJCQkJdWludDMyIHRlbXAgPSAqbGVmdDsKKwkJCQkqbGVmdCA9ICpyaWdodDsKKwkJCQkqcmlnaHQgPSB0ZW1wOworCQkJCWxlZnQrKywgcmlnaHQtLTsKKwkJCX0KKwkJfQorCX0KKworCV9USUZGZnJlZShidWYpOworCXJldHVybiAocmV0KTsKK30KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgbW92ZSBkZWNvZGVkIGRhdGEgcmV0dXJuZWQKKyAqIGZyb20gdGhlIFRJRkYgbGlicmFyeSBpbnRvIHJhc3RlcnMgZmlsbGVkIHdpdGggcGFja2VkCisgKiBBQkdSIHBpeGVscyAoaS5lLiBzdWl0YWJsZSBmb3IgcGFzc2luZyB0byBscmVjd3JpdGUuKQorICoKKyAqIFRoZSByb3V0aW5lcyBoYXZlIGJlZW4gY3JlYXRlZCBhY2NvcmRpbmcgdG8gdGhlIG1vc3QKKyAqIGltcG9ydGFudCBjYXNlcyBhbmQgb3B0aW1pemVkLiAgUGlja0NvbnRpZ0Nhc2UgYW5kCisgKiBQaWNrU2VwYXJhdGVDYXNlIGFuYWx5emUgdGhlIHBhcmFtZXRlcnMgYW5kIHNlbGVjdAorICogdGhlIGFwcHJvcHJpYXRlICJnZXQiIGFuZCAicHV0IiByb3V0aW5lIHRvIHVzZS4KKyAqLworI2RlZmluZQlSRVBFQVQ4KG9wKQlSRVBFQVQ0KG9wKTsgUkVQRUFUNChvcCkKKyNkZWZpbmUJUkVQRUFUNChvcCkJUkVQRUFUMihvcCk7IFJFUEVBVDIob3ApCisjZGVmaW5lCVJFUEVBVDIob3ApCW9wOyBvcAorI2RlZmluZQlDQVNFOCh4LG9wKQkJCVwKKyAgICBzd2l0Y2ggKHgpIHsJCQlcCisgICAgY2FzZSA3OiBvcDsgY2FzZSA2OiBvcDsgY2FzZSA1OiBvcDsJXAorICAgIGNhc2UgNDogb3A7IGNhc2UgMzogb3A7IGNhc2UgMjogb3A7CVwKKyAgICBjYXNlIDE6IG9wOwkJCQlcCisgICAgfQorI2RlZmluZQlDQVNFNCh4LG9wKQlzd2l0Y2ggKHgpIHsgY2FzZSAzOiBvcDsgY2FzZSAyOiBvcDsgY2FzZSAxOiBvcDsgfQorI2RlZmluZQlOT1AKKworI2RlZmluZQlVTlJPTEw4KHcsIG9wMSwgb3AyKSB7CQlcCisgICAgdWludDMyIF94OwkJCQlcCisgICAgZm9yIChfeCA9IHc7IF94ID49IDg7IF94IC09IDgpIHsJXAorCW9wMTsJCQkJXAorCVJFUEVBVDgob3AyKTsJCQlcCisgICAgfQkJCQkJXAorICAgIGlmIChfeCA+IDApIHsJCQlcCisJb3AxOwkJCQlcCisJQ0FTRTgoX3gsb3AyKTsJCQlcCisgICAgfQkJCQkJXAorfQorI2RlZmluZQlVTlJPTEw0KHcsIG9wMSwgb3AyKSB7CQlcCisgICAgdWludDMyIF94OwkJCQlcCisgICAgZm9yIChfeCA9IHc7IF94ID49IDQ7IF94IC09IDQpIHsJXAorCW9wMTsJCQkJXAorCVJFUEVBVDQob3AyKTsJCQlcCisgICAgfQkJCQkJXAorICAgIGlmIChfeCA+IDApIHsJCQlcCisJb3AxOwkJCQlcCisJQ0FTRTQoX3gsb3AyKTsJCQlcCisgICAgfQkJCQkJXAorfQorI2RlZmluZQlVTlJPTEwyKHcsIG9wMSwgb3AyKSB7CQlcCisgICAgdWludDMyIF94OwkJCQlcCisgICAgZm9yIChfeCA9IHc7IF94ID49IDI7IF94IC09IDIpIHsJXAorCW9wMTsJCQkJXAorCVJFUEVBVDIob3AyKTsJCQlcCisgICAgfQkJCQkJXAorICAgIGlmIChfeCkgewkJCQlcCisJb3AxOwkJCQlcCisJb3AyOwkJCQlcCisgICAgfQkJCQkJXAorfQorICAgIAorI2RlZmluZQlTS0VXKHIsZyxiLHNrZXcpCXsgciArPSBza2V3OyBnICs9IHNrZXc7IGIgKz0gc2tldzsgfQorI2RlZmluZQlTS0VXNChyLGcsYixhLHNrZXcpCXsgciArPSBza2V3OyBnICs9IHNrZXc7IGIgKz0gc2tldzsgYSs9IHNrZXc7IH0KKworI2RlZmluZSBBMSAoKCh1aW50MzIpMHhmZkwpPDwyNCkKKyNkZWZpbmUJUEFDSyhyLGcsYikJXAorCSgodWludDMyKShyKXwoKHVpbnQzMikoZyk8PDgpfCgodWludDMyKShiKTw8MTYpfEExKQorI2RlZmluZQlQQUNLNChyLGcsYixhKQlcCisJKCh1aW50MzIpKHIpfCgodWludDMyKShnKTw8OCl8KCh1aW50MzIpKGIpPDwxNil8KCh1aW50MzIpKGEpPDwyNCkpCisjZGVmaW5lIFcyQih2KSAoKCh2KT4+OCkmMHhmZikKKy8qIFRPRE86IFBBQ0tXIHNob3VsZCBoYXZlIGJlIG1hZGUgcmVkdW5kYW50IGluIGZhdm9yIG9mIEJpdGRlcHRoMTZUbzggTFVUICovCisjZGVmaW5lCVBBQ0tXKHIsZyxiKQlcCisJKCh1aW50MzIpVzJCKHIpfCgodWludDMyKVcyQihnKTw8OCl8KCh1aW50MzIpVzJCKGIpPDwxNil8QTEpCisjZGVmaW5lCVBBQ0tXNChyLGcsYixhKQlcCisJKCh1aW50MzIpVzJCKHIpfCgodWludDMyKVcyQihnKTw8OCl8KCh1aW50MzIpVzJCKGIpPDwxNil8KCh1aW50MzIpVzJCKGEpPDwyNCkpCisKKyNkZWZpbmUJREVDTEFSRUNvbnRpZ1B1dEZ1bmMobmFtZSkgXAorc3RhdGljIHZvaWQgbmFtZShcCisgICAgVElGRlJHQkFJbWFnZSogaW1nLCBcCisgICAgdWludDMyKiBjcCwgXAorICAgIHVpbnQzMiB4LCB1aW50MzIgeSwgXAorICAgIHVpbnQzMiB3LCB1aW50MzIgaCwgXAorICAgIGludDMyIGZyb21za2V3LCBpbnQzMiB0b3NrZXcsIFwKKyAgICB1bnNpZ25lZCBjaGFyKiBwcCBcCispCisKKy8qCisgKiA4LWJpdCBwYWxldHRlID0+IGNvbG9ybWFwL1JHQgorICovCitERUNMQVJFQ29udGlnUHV0RnVuYyhwdXQ4Yml0Y21hcHRpbGUpCit7CisgICAgdWludDMyKiogUEFMbWFwID0gaW1nLT5QQUxtYXA7CisgICAgaW50IHNhbXBsZXNwZXJwaXhlbCA9IGltZy0+c2FtcGxlc3BlcnBpeGVsOworCisgICAgKHZvaWQpIHk7CisgICAgd2hpbGUgKGgtLSA+IDApIHsKKwlmb3IgKHggPSB3OyB4LS0gPiAwOykKKyAgICAgICAgeworCSAgICAqY3ArKyA9IFBBTG1hcFsqcHBdWzBdOworICAgICAgICAgICAgcHAgKz0gc2FtcGxlc3BlcnBpeGVsOworICAgICAgICB9CisJY3AgKz0gdG9za2V3OworCXBwICs9IGZyb21za2V3OworICAgIH0KK30KKworLyoKKyAqIDQtYml0IHBhbGV0dGUgPT4gY29sb3JtYXAvUkdCCisgKi8KK0RFQ0xBUkVDb250aWdQdXRGdW5jKHB1dDRiaXRjbWFwdGlsZSkKK3sKKyAgICB1aW50MzIqKiBQQUxtYXAgPSBpbWctPlBBTG1hcDsKKworICAgICh2b2lkKSB4OyAodm9pZCkgeTsKKyAgICBmcm9tc2tldyAvPSAyOworICAgIHdoaWxlIChoLS0gPiAwKSB7CisJdWludDMyKiBidzsKKwlVTlJPTEwyKHcsIGJ3ID0gUEFMbWFwWypwcCsrXSwgKmNwKysgPSAqYncrKyk7CisJY3AgKz0gdG9za2V3OworCXBwICs9IGZyb21za2V3OworICAgIH0KK30KKworLyoKKyAqIDItYml0IHBhbGV0dGUgPT4gY29sb3JtYXAvUkdCCisgKi8KK0RFQ0xBUkVDb250aWdQdXRGdW5jKHB1dDJiaXRjbWFwdGlsZSkKK3sKKyAgICB1aW50MzIqKiBQQUxtYXAgPSBpbWctPlBBTG1hcDsKKworICAgICh2b2lkKSB4OyAodm9pZCkgeTsKKyAgICBmcm9tc2tldyAvPSA0OworICAgIHdoaWxlIChoLS0gPiAwKSB7CisJdWludDMyKiBidzsKKwlVTlJPTEw0KHcsIGJ3ID0gUEFMbWFwWypwcCsrXSwgKmNwKysgPSAqYncrKyk7CisJY3AgKz0gdG9za2V3OworCXBwICs9IGZyb21za2V3OworICAgIH0KK30KKworLyoKKyAqIDEtYml0IHBhbGV0dGUgPT4gY29sb3JtYXAvUkdCCisgKi8KK0RFQ0xBUkVDb250aWdQdXRGdW5jKHB1dDFiaXRjbWFwdGlsZSkKK3sKKyAgICB1aW50MzIqKiBQQUxtYXAgPSBpbWctPlBBTG1hcDsKKworICAgICh2b2lkKSB4OyAodm9pZCkgeTsKKyAgICBmcm9tc2tldyAvPSA4OworICAgIHdoaWxlIChoLS0gPiAwKSB7CisJdWludDMyKiBidzsKKwlVTlJPTEw4KHcsIGJ3ID0gUEFMbWFwWypwcCsrXSwgKmNwKysgPSAqYncrKyk7CisJY3AgKz0gdG9za2V3OworCXBwICs9IGZyb21za2V3OworICAgIH0KK30KKworLyoKKyAqIDgtYml0IGdyZXlzY2FsZSA9PiBjb2xvcm1hcC9SR0IKKyAqLworREVDTEFSRUNvbnRpZ1B1dEZ1bmMocHV0Z3JleXRpbGUpCit7CisgICAgaW50IHNhbXBsZXNwZXJwaXhlbCA9IGltZy0+c2FtcGxlc3BlcnBpeGVsOworICAgIHVpbnQzMioqIEJXbWFwID0gaW1nLT5CV21hcDsKKworICAgICh2b2lkKSB5OworICAgIHdoaWxlIChoLS0gPiAwKSB7CisJZm9yICh4ID0gdzsgeC0tID4gMDspCisgICAgICAgIHsKKwkgICAgKmNwKysgPSBCV21hcFsqcHBdWzBdOworICAgICAgICAgICAgcHAgKz0gc2FtcGxlc3BlcnBpeGVsOworICAgICAgICB9CisJY3AgKz0gdG9za2V3OworCXBwICs9IGZyb21za2V3OworICAgIH0KK30KKworLyoKKyAqIDgtYml0IGdyZXlzY2FsZSB3aXRoIGFzc29jaWF0ZWQgYWxwaGEgPT4gY29sb3JtYXAvUkdCQQorICovCitERUNMQVJFQ29udGlnUHV0RnVuYyhwdXRhZ3JleXRpbGUpCit7CisgICAgaW50IHNhbXBsZXNwZXJwaXhlbCA9IGltZy0+c2FtcGxlc3BlcnBpeGVsOworICAgIHVpbnQzMioqIEJXbWFwID0gaW1nLT5CV21hcDsKKworICAgICh2b2lkKSB5OworICAgIHdoaWxlIChoLS0gPiAwKSB7CisJZm9yICh4ID0gdzsgeC0tID4gMDspCisgICAgICAgIHsKKyAgICAgICAgICAgICpjcCsrID0gQldtYXBbKnBwXVswXSAmICgqKHBwKzEpIDw8IDI0IHwgfkExKTsKKyAgICAgICAgICAgIHBwICs9IHNhbXBsZXNwZXJwaXhlbDsKKyAgICAgICAgfQorCWNwICs9IHRvc2tldzsKKwlwcCArPSBmcm9tc2tldzsKKyAgICB9Cit9CisKKy8qCisgKiAxNi1iaXQgZ3JleXNjYWxlID0+IGNvbG9ybWFwL1JHQgorICovCitERUNMQVJFQ29udGlnUHV0RnVuYyhwdXQxNmJpdGJ3dGlsZSkKK3sKKyAgICBpbnQgc2FtcGxlc3BlcnBpeGVsID0gaW1nLT5zYW1wbGVzcGVycGl4ZWw7CisgICAgdWludDMyKiogQldtYXAgPSBpbWctPkJXbWFwOworCisgICAgKHZvaWQpIHk7CisgICAgd2hpbGUgKGgtLSA+IDApIHsKKyAgICAgICAgdWludDE2ICp3cCA9ICh1aW50MTYgKikgcHA7CisKKwlmb3IgKHggPSB3OyB4LS0gPiAwOykKKyAgICAgICAgeworICAgICAgICAgICAgLyogdXNlIGhpZ2ggb3JkZXIgYnl0ZSBvZiAxNmJpdCB2YWx1ZSAqLworCisJICAgICpjcCsrID0gQldtYXBbKndwID4+IDhdWzBdOworICAgICAgICAgICAgcHAgKz0gMiAqIHNhbXBsZXNwZXJwaXhlbDsKKyAgICAgICAgICAgIHdwICs9IHNhbXBsZXNwZXJwaXhlbDsKKyAgICAgICAgfQorCWNwICs9IHRvc2tldzsKKwlwcCArPSBmcm9tc2tldzsKKyAgICB9Cit9CisKKy8qCisgKiAxLWJpdCBiaWxldmVsID0+IGNvbG9ybWFwL1JHQgorICovCitERUNMQVJFQ29udGlnUHV0RnVuYyhwdXQxYml0Ynd0aWxlKQoreworICAgIHVpbnQzMioqIEJXbWFwID0gaW1nLT5CV21hcDsKKworICAgICh2b2lkKSB4OyAodm9pZCkgeTsKKyAgICBmcm9tc2tldyAvPSA4OworICAgIHdoaWxlIChoLS0gPiAwKSB7CisJdWludDMyKiBidzsKKwlVTlJPTEw4KHcsIGJ3ID0gQldtYXBbKnBwKytdLCAqY3ArKyA9ICpidysrKTsKKwljcCArPSB0b3NrZXc7CisJcHAgKz0gZnJvbXNrZXc7CisgICAgfQorfQorCisvKgorICogMi1iaXQgZ3JleXNjYWxlID0+IGNvbG9ybWFwL1JHQgorICovCitERUNMQVJFQ29udGlnUHV0RnVuYyhwdXQyYml0Ynd0aWxlKQoreworICAgIHVpbnQzMioqIEJXbWFwID0gaW1nLT5CV21hcDsKKworICAgICh2b2lkKSB4OyAodm9pZCkgeTsKKyAgICBmcm9tc2tldyAvPSA0OworICAgIHdoaWxlIChoLS0gPiAwKSB7CisJdWludDMyKiBidzsKKwlVTlJPTEw0KHcsIGJ3ID0gQldtYXBbKnBwKytdLCAqY3ArKyA9ICpidysrKTsKKwljcCArPSB0b3NrZXc7CisJcHAgKz0gZnJvbXNrZXc7CisgICAgfQorfQorCisvKgorICogNC1iaXQgZ3JleXNjYWxlID0+IGNvbG9ybWFwL1JHQgorICovCitERUNMQVJFQ29udGlnUHV0RnVuYyhwdXQ0Yml0Ynd0aWxlKQoreworICAgIHVpbnQzMioqIEJXbWFwID0gaW1nLT5CV21hcDsKKworICAgICh2b2lkKSB4OyAodm9pZCkgeTsKKyAgICBmcm9tc2tldyAvPSAyOworICAgIHdoaWxlIChoLS0gPiAwKSB7CisJdWludDMyKiBidzsKKwlVTlJPTEwyKHcsIGJ3ID0gQldtYXBbKnBwKytdLCAqY3ArKyA9ICpidysrKTsKKwljcCArPSB0b3NrZXc7CisJcHAgKz0gZnJvbXNrZXc7CisgICAgfQorfQorCisvKgorICogOC1iaXQgcGFja2VkIHNhbXBsZXMsIG5vIE1hcCA9PiBSR0IKKyAqLworREVDTEFSRUNvbnRpZ1B1dEZ1bmMocHV0UkdCY29udGlnOGJpdHRpbGUpCit7CisgICAgaW50IHNhbXBsZXNwZXJwaXhlbCA9IGltZy0+c2FtcGxlc3BlcnBpeGVsOworCisgICAgKHZvaWQpIHg7ICh2b2lkKSB5OworICAgIGZyb21za2V3ICo9IHNhbXBsZXNwZXJwaXhlbDsKKyAgICB3aGlsZSAoaC0tID4gMCkgeworCVVOUk9MTDgodywgTk9QLAorCSAgICAqY3ArKyA9IFBBQ0socHBbMF0sIHBwWzFdLCBwcFsyXSk7CisJICAgIHBwICs9IHNhbXBsZXNwZXJwaXhlbCk7CisJY3AgKz0gdG9za2V3OworCXBwICs9IGZyb21za2V3OworICAgIH0KK30KKworLyoKKyAqIDgtYml0IHBhY2tlZCBzYW1wbGVzID0+IFJHQkEgdy8gYXNzb2NpYXRlZCBhbHBoYQorICogKGtub3duIHRvIGhhdmUgTWFwID09IE5VTEwpCisgKi8KK0RFQ0xBUkVDb250aWdQdXRGdW5jKHB1dFJHQkFBY29udGlnOGJpdHRpbGUpCit7CisgICAgaW50IHNhbXBsZXNwZXJwaXhlbCA9IGltZy0+c2FtcGxlc3BlcnBpeGVsOworCisgICAgKHZvaWQpIHg7ICh2b2lkKSB5OworICAgIGZyb21za2V3ICo9IHNhbXBsZXNwZXJwaXhlbDsKKyAgICB3aGlsZSAoaC0tID4gMCkgeworCVVOUk9MTDgodywgTk9QLAorCSAgICAqY3ArKyA9IFBBQ0s0KHBwWzBdLCBwcFsxXSwgcHBbMl0sIHBwWzNdKTsKKwkgICAgcHAgKz0gc2FtcGxlc3BlcnBpeGVsKTsKKwljcCArPSB0b3NrZXc7CisJcHAgKz0gZnJvbXNrZXc7CisgICAgfQorfQorCisvKgorICogOC1iaXQgcGFja2VkIHNhbXBsZXMgPT4gUkdCQSB3LyB1bmFzc29jaWF0ZWQgYWxwaGEKKyAqIChrbm93biB0byBoYXZlIE1hcCA9PSBOVUxMKQorICovCitERUNMQVJFQ29udGlnUHV0RnVuYyhwdXRSR0JVQWNvbnRpZzhiaXR0aWxlKQoreworCWludCBzYW1wbGVzcGVycGl4ZWwgPSBpbWctPnNhbXBsZXNwZXJwaXhlbDsKKwkodm9pZCkgeTsKKwlmcm9tc2tldyAqPSBzYW1wbGVzcGVycGl4ZWw7CisJd2hpbGUgKGgtLSA+IDApIHsKKwkJdWludDMyIHIsIGcsIGIsIGE7CisJCXVpbnQ4KiBtOworCQlmb3IgKHggPSB3OyB4LS0gPiAwOykgeworCQkJYSA9IHBwWzNdOworCQkJbSA9IGltZy0+VWFUb0FhKyhhPDw4KTsKKwkJCXIgPSBtW3BwWzBdXTsKKwkJCWcgPSBtW3BwWzFdXTsKKwkJCWIgPSBtW3BwWzJdXTsKKwkJCSpjcCsrID0gUEFDSzQocixnLGIsYSk7CisJCQlwcCArPSBzYW1wbGVzcGVycGl4ZWw7CisJCX0KKwkJY3AgKz0gdG9za2V3OworCQlwcCArPSBmcm9tc2tldzsKKwl9Cit9CisKKy8qCisgKiAxNi1iaXQgcGFja2VkIHNhbXBsZXMgPT4gUkdCCisgKi8KK0RFQ0xBUkVDb250aWdQdXRGdW5jKHB1dFJHQmNvbnRpZzE2Yml0dGlsZSkKK3sKKwlpbnQgc2FtcGxlc3BlcnBpeGVsID0gaW1nLT5zYW1wbGVzcGVycGl4ZWw7CisJdWludDE2ICp3cCA9ICh1aW50MTYgKilwcDsKKwkodm9pZCkgeTsKKwlmcm9tc2tldyAqPSBzYW1wbGVzcGVycGl4ZWw7CisJd2hpbGUgKGgtLSA+IDApIHsKKwkJZm9yICh4ID0gdzsgeC0tID4gMDspIHsKKwkJCSpjcCsrID0gUEFDSyhpbWctPkJpdGRlcHRoMTZUbzhbd3BbMF1dLAorCQkJICAgIGltZy0+Qml0ZGVwdGgxNlRvOFt3cFsxXV0sCisJCQkgICAgaW1nLT5CaXRkZXB0aDE2VG84W3dwWzJdXSk7CisJCQl3cCArPSBzYW1wbGVzcGVycGl4ZWw7CisJCX0KKwkJY3AgKz0gdG9za2V3OworCQl3cCArPSBmcm9tc2tldzsKKwl9Cit9CisKKy8qCisgKiAxNi1iaXQgcGFja2VkIHNhbXBsZXMgPT4gUkdCQSB3LyBhc3NvY2lhdGVkIGFscGhhCisgKiAoa25vd24gdG8gaGF2ZSBNYXAgPT0gTlVMTCkKKyAqLworREVDTEFSRUNvbnRpZ1B1dEZ1bmMocHV0UkdCQUFjb250aWcxNmJpdHRpbGUpCit7CisJaW50IHNhbXBsZXNwZXJwaXhlbCA9IGltZy0+c2FtcGxlc3BlcnBpeGVsOworCXVpbnQxNiAqd3AgPSAodWludDE2ICopcHA7CisJKHZvaWQpIHk7CisJZnJvbXNrZXcgKj0gc2FtcGxlc3BlcnBpeGVsOworCXdoaWxlIChoLS0gPiAwKSB7CisJCWZvciAoeCA9IHc7IHgtLSA+IDA7KSB7CisJCQkqY3ArKyA9IFBBQ0s0KGltZy0+Qml0ZGVwdGgxNlRvOFt3cFswXV0sCisJCQkgICAgaW1nLT5CaXRkZXB0aDE2VG84W3dwWzFdXSwKKwkJCSAgICBpbWctPkJpdGRlcHRoMTZUbzhbd3BbMl1dLAorCQkJICAgIGltZy0+Qml0ZGVwdGgxNlRvOFt3cFszXV0pOworCQkJd3AgKz0gc2FtcGxlc3BlcnBpeGVsOworCQl9CisJCWNwICs9IHRvc2tldzsKKwkJd3AgKz0gZnJvbXNrZXc7CisJfQorfQorCisvKgorICogMTYtYml0IHBhY2tlZCBzYW1wbGVzID0+IFJHQkEgdy8gdW5hc3NvY2lhdGVkIGFscGhhCisgKiAoa25vd24gdG8gaGF2ZSBNYXAgPT0gTlVMTCkKKyAqLworREVDTEFSRUNvbnRpZ1B1dEZ1bmMocHV0UkdCVUFjb250aWcxNmJpdHRpbGUpCit7CisJaW50IHNhbXBsZXNwZXJwaXhlbCA9IGltZy0+c2FtcGxlc3BlcnBpeGVsOworCXVpbnQxNiAqd3AgPSAodWludDE2ICopcHA7CisJKHZvaWQpIHk7CisJZnJvbXNrZXcgKj0gc2FtcGxlc3BlcnBpeGVsOworCXdoaWxlIChoLS0gPiAwKSB7CisJCXVpbnQzMiByLGcsYixhOworCQl1aW50OCogbTsKKwkJZm9yICh4ID0gdzsgeC0tID4gMDspIHsKKwkJCWEgPSBpbWctPkJpdGRlcHRoMTZUbzhbd3BbM11dOworCQkJbSA9IGltZy0+VWFUb0FhKyhhPDw4KTsKKwkJCXIgPSBtW2ltZy0+Qml0ZGVwdGgxNlRvOFt3cFswXV1dOworCQkJZyA9IG1baW1nLT5CaXRkZXB0aDE2VG84W3dwWzFdXV07CisJCQliID0gbVtpbWctPkJpdGRlcHRoMTZUbzhbd3BbMl1dXTsKKwkJCSpjcCsrID0gUEFDSzQocixnLGIsYSk7CisJCQl3cCArPSBzYW1wbGVzcGVycGl4ZWw7CisJCX0KKwkJY3AgKz0gdG9za2V3OworCQl3cCArPSBmcm9tc2tldzsKKwl9Cit9CisKKy8qCisgKiA4LWJpdCBwYWNrZWQgQ01ZSyBzYW1wbGVzIHcvbyBNYXAgPT4gUkdCCisgKgorICogTkI6IFRoZSBjb252ZXJzaW9uIG9mIENNWUstPlJHQiBpcyAqdmVyeSogY3J1ZGUuCisgKi8KK0RFQ0xBUkVDb250aWdQdXRGdW5jKHB1dFJHQmNvbnRpZzhiaXRDTVlLdGlsZSkKK3sKKyAgICBpbnQgc2FtcGxlc3BlcnBpeGVsID0gaW1nLT5zYW1wbGVzcGVycGl4ZWw7CisgICAgdWludDE2IHIsIGcsIGIsIGs7CisKKyAgICAodm9pZCkgeDsgKHZvaWQpIHk7CisgICAgZnJvbXNrZXcgKj0gc2FtcGxlc3BlcnBpeGVsOworICAgIHdoaWxlIChoLS0gPiAwKSB7CisJVU5ST0xMOCh3LCBOT1AsCisJICAgIGsgPSAyNTUgLSBwcFszXTsKKwkgICAgciA9IChrKigyNTUtcHBbMF0pKS8yNTU7CisJICAgIGcgPSAoayooMjU1LXBwWzFdKSkvMjU1OworCSAgICBiID0gKGsqKDI1NS1wcFsyXSkpLzI1NTsKKwkgICAgKmNwKysgPSBQQUNLKHIsIGcsIGIpOworCSAgICBwcCArPSBzYW1wbGVzcGVycGl4ZWwpOworCWNwICs9IHRvc2tldzsKKwlwcCArPSBmcm9tc2tldzsKKyAgICB9Cit9CisKKy8qCisgKiA4LWJpdCBwYWNrZWQgQ01ZSyBzYW1wbGVzIHcvTWFwID0+IFJHQgorICoKKyAqIE5COiBUaGUgY29udmVyc2lvbiBvZiBDTVlLLT5SR0IgaXMgKnZlcnkqIGNydWRlLgorICovCitERUNMQVJFQ29udGlnUHV0RnVuYyhwdXRSR0Jjb250aWc4Yml0Q01ZS01hcHRpbGUpCit7CisgICAgaW50IHNhbXBsZXNwZXJwaXhlbCA9IGltZy0+c2FtcGxlc3BlcnBpeGVsOworICAgIFRJRkZSR0JWYWx1ZSogTWFwID0gaW1nLT5NYXA7CisgICAgdWludDE2IHIsIGcsIGIsIGs7CisKKyAgICAodm9pZCkgeTsKKyAgICBmcm9tc2tldyAqPSBzYW1wbGVzcGVycGl4ZWw7CisgICAgd2hpbGUgKGgtLSA+IDApIHsKKwlmb3IgKHggPSB3OyB4LS0gPiAwOykgeworCSAgICBrID0gMjU1IC0gcHBbM107CisJICAgIHIgPSAoayooMjU1LXBwWzBdKSkvMjU1OworCSAgICBnID0gKGsqKDI1NS1wcFsxXSkpLzI1NTsKKwkgICAgYiA9IChrKigyNTUtcHBbMl0pKS8yNTU7CisJICAgICpjcCsrID0gUEFDSyhNYXBbcl0sIE1hcFtnXSwgTWFwW2JdKTsKKwkgICAgcHAgKz0gc2FtcGxlc3BlcnBpeGVsOworCX0KKwlwcCArPSBmcm9tc2tldzsKKwljcCArPSB0b3NrZXc7CisgICAgfQorfQorCisjZGVmaW5lCURFQ0xBUkVTZXBQdXRGdW5jKG5hbWUpIFwKK3N0YXRpYyB2b2lkIG5hbWUoXAorICAgIFRJRkZSR0JBSW1hZ2UqIGltZyxcCisgICAgdWludDMyKiBjcCxcCisgICAgdWludDMyIHgsIHVpbnQzMiB5LCBcCisgICAgdWludDMyIHcsIHVpbnQzMiBoLFwKKyAgICBpbnQzMiBmcm9tc2tldywgaW50MzIgdG9za2V3LFwKKyAgICB1bnNpZ25lZCBjaGFyKiByLCB1bnNpZ25lZCBjaGFyKiBnLCB1bnNpZ25lZCBjaGFyKiBiLCB1bnNpZ25lZCBjaGFyKiBhXAorKQorCisvKgorICogOC1iaXQgdW5wYWNrZWQgc2FtcGxlcyA9PiBSR0IKKyAqLworREVDTEFSRVNlcFB1dEZ1bmMocHV0UkdCc2VwYXJhdGU4Yml0dGlsZSkKK3sKKyAgICAodm9pZCkgaW1nOyAodm9pZCkgeDsgKHZvaWQpIHk7ICh2b2lkKSBhOworICAgIHdoaWxlIChoLS0gPiAwKSB7CisJVU5ST0xMOCh3LCBOT1AsICpjcCsrID0gUEFDSygqcisrLCAqZysrLCAqYisrKSk7CisJU0tFVyhyLCBnLCBiLCBmcm9tc2tldyk7CisJY3AgKz0gdG9za2V3OworICAgIH0KK30KKworLyoKKyAqIDgtYml0IHVucGFja2VkIHNhbXBsZXMgPT4gUkdCQSB3LyBhc3NvY2lhdGVkIGFscGhhCisgKi8KK0RFQ0xBUkVTZXBQdXRGdW5jKHB1dFJHQkFBc2VwYXJhdGU4Yml0dGlsZSkKK3sKKwkodm9pZCkgaW1nOyAodm9pZCkgeDsgKHZvaWQpIHk7IAorCXdoaWxlIChoLS0gPiAwKSB7CisJCVVOUk9MTDgodywgTk9QLCAqY3ArKyA9IFBBQ0s0KCpyKyssICpnKyssICpiKyssICphKyspKTsKKwkJU0tFVzQociwgZywgYiwgYSwgZnJvbXNrZXcpOworCQljcCArPSB0b3NrZXc7CisJfQorfQorCisvKgorICogOC1iaXQgdW5wYWNrZWQgQ01ZSyBzYW1wbGVzID0+IFJHQkEKKyAqLworREVDTEFSRVNlcFB1dEZ1bmMocHV0Q01ZS3NlcGFyYXRlOGJpdHRpbGUpCit7CisJKHZvaWQpIGltZzsgKHZvaWQpIHk7CisJd2hpbGUgKGgtLSA+IDApIHsKKwkJdWludDMyIHJ2LCBndiwgYnYsIGt2OworCQlmb3IgKHggPSB3OyB4LS0gPiAwOykgeworCQkJa3YgPSAyNTUgLSAqYSsrOworCQkJcnYgPSAoa3YqKDI1NS0qcisrKSkvMjU1OworCQkJZ3YgPSAoa3YqKDI1NS0qZysrKSkvMjU1OworCQkJYnYgPSAoa3YqKDI1NS0qYisrKSkvMjU1OworCQkJKmNwKysgPSBQQUNLNChydixndixidiwyNTUpOworCQl9CisJCVNLRVc0KHIsIGcsIGIsIGEsIGZyb21za2V3KTsKKwkJY3AgKz0gdG9za2V3OworCX0KK30KKworLyoKKyAqIDgtYml0IHVucGFja2VkIHNhbXBsZXMgPT4gUkdCQSB3LyB1bmFzc29jaWF0ZWQgYWxwaGEKKyAqLworREVDTEFSRVNlcFB1dEZ1bmMocHV0UkdCVUFzZXBhcmF0ZThiaXR0aWxlKQoreworCSh2b2lkKSBpbWc7ICh2b2lkKSB5OworCXdoaWxlIChoLS0gPiAwKSB7CisJCXVpbnQzMiBydiwgZ3YsIGJ2LCBhdjsKKwkJdWludDgqIG07CisJCWZvciAoeCA9IHc7IHgtLSA+IDA7KSB7CisJCQlhdiA9ICphKys7CisJCQltID0gaW1nLT5VYVRvQWErKGF2PDw4KTsKKwkJCXJ2ID0gbVsqcisrXTsKKwkJCWd2ID0gbVsqZysrXTsKKwkJCWJ2ID0gbVsqYisrXTsKKwkJCSpjcCsrID0gUEFDSzQocnYsZ3YsYnYsYXYpOworCQl9CisJCVNLRVc0KHIsIGcsIGIsIGEsIGZyb21za2V3KTsKKwkJY3AgKz0gdG9za2V3OworCX0KK30KKworLyoKKyAqIDE2LWJpdCB1bnBhY2tlZCBzYW1wbGVzID0+IFJHQgorICovCitERUNMQVJFU2VwUHV0RnVuYyhwdXRSR0JzZXBhcmF0ZTE2Yml0dGlsZSkKK3sKKwl1aW50MTYgKndyID0gKHVpbnQxNiopIHI7CisJdWludDE2ICp3ZyA9ICh1aW50MTYqKSBnOworCXVpbnQxNiAqd2IgPSAodWludDE2KikgYjsKKwkodm9pZCkgaW1nOyAodm9pZCkgeTsgKHZvaWQpIGE7CisJd2hpbGUgKGgtLSA+IDApIHsKKwkJZm9yICh4ID0gMDsgeCA8IHc7IHgrKykKKwkJCSpjcCsrID0gUEFDSyhpbWctPkJpdGRlcHRoMTZUbzhbKndyKytdLAorCQkJICAgIGltZy0+Qml0ZGVwdGgxNlRvOFsqd2crK10sCisJCQkgICAgaW1nLT5CaXRkZXB0aDE2VG84Wyp3YisrXSk7CisJCVNLRVcod3IsIHdnLCB3YiwgZnJvbXNrZXcpOworCQljcCArPSB0b3NrZXc7CisJfQorfQorCisvKgorICogMTYtYml0IHVucGFja2VkIHNhbXBsZXMgPT4gUkdCQSB3LyBhc3NvY2lhdGVkIGFscGhhCisgKi8KK0RFQ0xBUkVTZXBQdXRGdW5jKHB1dFJHQkFBc2VwYXJhdGUxNmJpdHRpbGUpCit7CisJdWludDE2ICp3ciA9ICh1aW50MTYqKSByOworCXVpbnQxNiAqd2cgPSAodWludDE2KikgZzsKKwl1aW50MTYgKndiID0gKHVpbnQxNiopIGI7CisJdWludDE2ICp3YSA9ICh1aW50MTYqKSBhOworCSh2b2lkKSBpbWc7ICh2b2lkKSB5OworCXdoaWxlIChoLS0gPiAwKSB7CisJCWZvciAoeCA9IDA7IHggPCB3OyB4KyspCisJCQkqY3ArKyA9IFBBQ0s0KGltZy0+Qml0ZGVwdGgxNlRvOFsqd3IrK10sCisJCQkgICAgaW1nLT5CaXRkZXB0aDE2VG84Wyp3ZysrXSwKKwkJCSAgICBpbWctPkJpdGRlcHRoMTZUbzhbKndiKytdLAorCQkJICAgIGltZy0+Qml0ZGVwdGgxNlRvOFsqd2ErK10pOworCQlTS0VXNCh3ciwgd2csIHdiLCB3YSwgZnJvbXNrZXcpOworCQljcCArPSB0b3NrZXc7CisJfQorfQorCisvKgorICogMTYtYml0IHVucGFja2VkIHNhbXBsZXMgPT4gUkdCQSB3LyB1bmFzc29jaWF0ZWQgYWxwaGEKKyAqLworREVDTEFSRVNlcFB1dEZ1bmMocHV0UkdCVUFzZXBhcmF0ZTE2Yml0dGlsZSkKK3sKKwl1aW50MTYgKndyID0gKHVpbnQxNiopIHI7CisJdWludDE2ICp3ZyA9ICh1aW50MTYqKSBnOworCXVpbnQxNiAqd2IgPSAodWludDE2KikgYjsKKwl1aW50MTYgKndhID0gKHVpbnQxNiopIGE7CisJKHZvaWQpIGltZzsgKHZvaWQpIHk7CisJd2hpbGUgKGgtLSA+IDApIHsKKwkJdWludDMyIHIsZyxiLGE7CisJCXVpbnQ4KiBtOworCQlmb3IgKHggPSB3OyB4LS0gPiAwOykgeworCQkJYSA9IGltZy0+Qml0ZGVwdGgxNlRvOFsqd2ErK107CisJCQltID0gaW1nLT5VYVRvQWErKGE8PDgpOworCQkJciA9IG1baW1nLT5CaXRkZXB0aDE2VG84Wyp3cisrXV07CisJCQlnID0gbVtpbWctPkJpdGRlcHRoMTZUbzhbKndnKytdXTsKKwkJCWIgPSBtW2ltZy0+Qml0ZGVwdGgxNlRvOFsqd2IrK11dOworCQkJKmNwKysgPSBQQUNLNChyLGcsYixhKTsKKwkJfQorCQlTS0VXNCh3ciwgd2csIHdiLCB3YSwgZnJvbXNrZXcpOworCQljcCArPSB0b3NrZXc7CisJfQorfQorCisvKgorICogOC1iaXQgcGFja2VkIENJRSBMKmEqYiAxOTc2IHNhbXBsZXMgPT4gUkdCCisgKi8KK0RFQ0xBUkVDb250aWdQdXRGdW5jKHB1dGNvbnRpZzhiaXRDSUVMYWIpCit7CisJZmxvYXQgWCwgWSwgWjsKKwl1aW50MzIgciwgZywgYjsKKwkodm9pZCkgeTsKKwlmcm9tc2tldyAqPSAzOworCXdoaWxlIChoLS0gPiAwKSB7CisJCWZvciAoeCA9IHc7IHgtLSA+IDA7KSB7CisJCQlUSUZGQ0lFTGFiVG9YWVooaW1nLT5jaWVsYWIsCisJCQkJCSh1bnNpZ25lZCBjaGFyKXBwWzBdLAorCQkJCQkoc2lnbmVkIGNoYXIpcHBbMV0sCisJCQkJCShzaWduZWQgY2hhcilwcFsyXSwKKwkJCQkJJlgsICZZLCAmWik7CisJCQlUSUZGWFlaVG9SR0IoaW1nLT5jaWVsYWIsIFgsIFksIFosICZyLCAmZywgJmIpOworCQkJKmNwKysgPSBQQUNLKHIsIGcsIGIpOworCQkJcHAgKz0gMzsKKwkJfQorCQljcCArPSB0b3NrZXc7CisJCXBwICs9IGZyb21za2V3OworCX0KK30KKworLyoKKyAqIFlDYkNyIC0+IFJHQiBjb252ZXJzaW9uIGFuZCBwYWNraW5nIHJvdXRpbmVzLgorICovCisKKyNkZWZpbmUJWUNiQ3J0b1JHQihkc3QsIFkpIHsJCQkJCQlcCisJdWludDMyIHIsIGcsIGI7CQkJCQkJCVwKKwlUSUZGWUNiQ3J0b1JHQihpbWctPnljYmNyLCAoWSksIENiLCBDciwgJnIsICZnLCAmYik7CQlcCisJZHN0ID0gUEFDSyhyLCBnLCBiKTsJCQkJCQlcCit9CisKKy8qCisgKiA4LWJpdCBwYWNrZWQgWUNiQ3Igc2FtcGxlcyA9PiBSR0IgCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGdlbmVyaWMgZm9yIGRpZmZlcmVudCBzYW1wbGluZyBzaXplcywgCisgKiBhbmQgY2FuIGhhbmRsZSBibG9ja3Mgc2l6ZXMgdGhhdCBhcmVuJ3QgbXVsdGlwbGVzIG9mIHRoZQorICogc2FtcGxpbmcgc2l6ZS4gIEhvd2V2ZXIsIGl0IGlzIHN1YnN0YW50aWFsbHkgbGVzcyBvcHRpbWl6ZWQKKyAqIHRoYW4gdGhlIHNwZWNpZmljIHNhbXBsaW5nIGNhc2VzLiAgSXQgaXMgdXNlZCBhcyBhIGZhbGxiYWNrCisgKiBmb3IgZGlmZmljdWx0IGJsb2Nrcy4KKyAqLworI2lmZGVmIG5vdGRlZgorc3RhdGljIHZvaWQgcHV0Y29udGlnOGJpdFlDYkNyR2VuZXJpY1RpbGUoIAorICAgIFRJRkZSR0JBSW1hZ2UqIGltZywgCisgICAgdWludDMyKiBjcCwgCisgICAgdWludDMyIHgsIHVpbnQzMiB5LCAKKyAgICB1aW50MzIgdywgdWludDMyIGgsIAorICAgIGludDMyIGZyb21za2V3LCBpbnQzMiB0b3NrZXcsIAorICAgIHVuc2lnbmVkIGNoYXIqIHBwLAorICAgIGludCBoX2dyb3VwLCAKKyAgICBpbnQgdl9ncm91cCApCisKK3sKKyAgICB1aW50MzIqIGNwMSA9IGNwK3crdG9za2V3OworICAgIHVpbnQzMiogY3AyID0gY3AxK3crdG9za2V3OworICAgIHVpbnQzMiogY3AzID0gY3AyK3crdG9za2V3OworICAgIGludDMyIGluY3IgPSAzKncrNCp0b3NrZXc7CisgICAgaW50MzIgICBDYiwgQ3I7CisgICAgaW50ICAgICBncm91cF9zaXplID0gdl9ncm91cCAqIGhfZ3JvdXAgKyAyOworCisgICAgKHZvaWQpIHk7CisgICAgZnJvbXNrZXcgPSAoZnJvbXNrZXcgKiBncm91cF9zaXplKSAvIGhfZ3JvdXA7CisKKyAgICBmb3IoIHl5ID0gMDsgeXkgPCBoOyB5eSsrICkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBwX2xpbmU7CisgICAgICAgIGludCAgICAgeV9saW5lX2dyb3VwID0geXkgLyB2X2dyb3VwOworICAgICAgICBpbnQgICAgIHlfcmVtYWluZGVyID0geXkgLSB5X2xpbmVfZ3JvdXAgKiB2X2dyb3VwOworCisgICAgICAgIHBwX2xpbmUgPSBwcCArIHZfbGluZV9ncm91cCAqIAorCisgICAgICAgIAorICAgICAgICBmb3IoIHh4ID0gMDsgeHggPCB3OyB4eCsrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ2IgPSBwcAorICAgICAgICB9CisgICAgfQorICAgIGZvciAoOyBoID49IDQ7IGggLT0gNCkgeworCXggPSB3Pj4yOworCWRvIHsKKwkgICAgQ2IgPSBwcFsxNl07CisJICAgIENyID0gcHBbMTddOworCisJICAgIFlDYkNydG9SR0IoY3AgWzBdLCBwcFsgMF0pOworCSAgICBZQ2JDcnRvUkdCKGNwIFsxXSwgcHBbIDFdKTsKKwkgICAgWUNiQ3J0b1JHQihjcCBbMl0sIHBwWyAyXSk7CisJICAgIFlDYkNydG9SR0IoY3AgWzNdLCBwcFsgM10pOworCSAgICBZQ2JDcnRvUkdCKGNwMVswXSwgcHBbIDRdKTsKKwkgICAgWUNiQ3J0b1JHQihjcDFbMV0sIHBwWyA1XSk7CisJICAgIFlDYkNydG9SR0IoY3AxWzJdLCBwcFsgNl0pOworCSAgICBZQ2JDcnRvUkdCKGNwMVszXSwgcHBbIDddKTsKKwkgICAgWUNiQ3J0b1JHQihjcDJbMF0sIHBwWyA4XSk7CisJICAgIFlDYkNydG9SR0IoY3AyWzFdLCBwcFsgOV0pOworCSAgICBZQ2JDcnRvUkdCKGNwMlsyXSwgcHBbMTBdKTsKKwkgICAgWUNiQ3J0b1JHQihjcDJbM10sIHBwWzExXSk7CisJICAgIFlDYkNydG9SR0IoY3AzWzBdLCBwcFsxMl0pOworCSAgICBZQ2JDcnRvUkdCKGNwM1sxXSwgcHBbMTNdKTsKKwkgICAgWUNiQ3J0b1JHQihjcDNbMl0sIHBwWzE0XSk7CisJICAgIFlDYkNydG9SR0IoY3AzWzNdLCBwcFsxNV0pOworCisJICAgIGNwICs9IDQsIGNwMSArPSA0LCBjcDIgKz0gNCwgY3AzICs9IDQ7CisJICAgIHBwICs9IDE4OworCX0gd2hpbGUgKC0teCk7CisJY3AgKz0gaW5jciwgY3AxICs9IGluY3IsIGNwMiArPSBpbmNyLCBjcDMgKz0gaW5jcjsKKwlwcCArPSBmcm9tc2tldzsKKyAgICB9Cit9CisjZW5kaWYKKworLyoKKyAqIDgtYml0IHBhY2tlZCBZQ2JDciBzYW1wbGVzIHcvIDQsNCBzdWJzYW1wbGluZyA9PiBSR0IKKyAqLworREVDTEFSRUNvbnRpZ1B1dEZ1bmMocHV0Y29udGlnOGJpdFlDYkNyNDR0aWxlKQoreworICAgIHVpbnQzMiogY3AxID0gY3Ardyt0b3NrZXc7CisgICAgdWludDMyKiBjcDIgPSBjcDErdyt0b3NrZXc7CisgICAgdWludDMyKiBjcDMgPSBjcDIrdyt0b3NrZXc7CisgICAgaW50MzIgaW5jciA9IDMqdys0KnRvc2tldzsKKworICAgICh2b2lkKSB5OworICAgIC8qIGFkanVzdCBmcm9tc2tldyAqLworICAgIGZyb21za2V3ID0gKGZyb21za2V3ICogMTgpIC8gNDsKKyAgICBpZiAoKGggJiAzKSA9PSAwICYmICh3ICYgMykgPT0gMCkgewkJCQkgICAgICAgIAorICAgICAgICBmb3IgKDsgaCA+PSA0OyBoIC09IDQpIHsKKyAgICAgICAgICAgIHggPSB3Pj4yOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludDMyIENiID0gcHBbMTZdOworICAgICAgICAgICAgICAgIGludDMyIENyID0gcHBbMTddOworCisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcCBbMF0sIHBwWyAwXSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcCBbMV0sIHBwWyAxXSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcCBbMl0sIHBwWyAyXSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcCBbM10sIHBwWyAzXSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDFbMF0sIHBwWyA0XSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDFbMV0sIHBwWyA1XSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDFbMl0sIHBwWyA2XSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDFbM10sIHBwWyA3XSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDJbMF0sIHBwWyA4XSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDJbMV0sIHBwWyA5XSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDJbMl0sIHBwWzEwXSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDJbM10sIHBwWzExXSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDNbMF0sIHBwWzEyXSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDNbMV0sIHBwWzEzXSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDNbMl0sIHBwWzE0XSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDNbM10sIHBwWzE1XSk7CisKKyAgICAgICAgICAgICAgICBjcCArPSA0LCBjcDEgKz0gNCwgY3AyICs9IDQsIGNwMyArPSA0OworICAgICAgICAgICAgICAgIHBwICs9IDE4OworICAgICAgICAgICAgfSB3aGlsZSAoLS14KTsKKyAgICAgICAgICAgIGNwICs9IGluY3IsIGNwMSArPSBpbmNyLCBjcDIgKz0gaW5jciwgY3AzICs9IGluY3I7CisgICAgICAgICAgICBwcCArPSBmcm9tc2tldzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHdoaWxlIChoID4gMCkgeworICAgICAgICAgICAgZm9yICh4ID0gdzsgeCA+IDA7KSB7CisgICAgICAgICAgICAgICAgaW50MzIgQ2IgPSBwcFsxNl07CisgICAgICAgICAgICAgICAgaW50MzIgQ3IgPSBwcFsxN107CisgICAgICAgICAgICAgICAgc3dpdGNoICh4KSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChoKSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFlDYkNydG9SR0IoY3AzWzNdLCBwcFsxNV0pOyAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgICAgICAgICBjYXNlIDM6ICBZQ2JDcnRvUkdCKGNwMlszXSwgcHBbMTFdKTsgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiAgWUNiQ3J0b1JHQihjcDFbM10sIHBwWyA3XSk7IC8qIEZBTExUSFJPVUdIICovCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogIFlDYkNydG9SR0IoY3AgWzNdLCBwcFsgM10pOyAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaCkgeworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBZQ2JDcnRvUkdCKGNwM1syXSwgcHBbMTRdKTsgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiAgWUNiQ3J0b1JHQihjcDJbMl0sIHBwWzEwXSk7IC8qIEZBTExUSFJPVUdIICovCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogIFlDYkNydG9SR0IoY3AxWzJdLCBwcFsgNl0pOyAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6ICBZQ2JDcnRvUkdCKGNwIFsyXSwgcHBbIDJdKTsgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGgpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogWUNiQ3J0b1JHQihjcDNbMV0sIHBwWzEzXSk7IC8qIEZBTExUSFJPVUdIICovCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogIFlDYkNydG9SR0IoY3AyWzFdLCBwcFsgOV0pOyAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6ICBZQ2JDcnRvUkdCKGNwMVsxXSwgcHBbIDVdKTsgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiAgWUNiQ3J0b1JHQihjcCBbMV0sIHBwWyAxXSk7IC8qIEZBTExUSFJPVUdIICovCisgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChoKSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFlDYkNydG9SR0IoY3AzWzBdLCBwcFsxMl0pOyAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgICAgICAgICBjYXNlIDM6ICBZQ2JDcnRvUkdCKGNwMlswXSwgcHBbIDhdKTsgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiAgWUNiQ3J0b1JHQihjcDFbMF0sIHBwWyA0XSk7IC8qIEZBTExUSFJPVUdIICovCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogIFlDYkNydG9SR0IoY3AgWzBdLCBwcFsgMF0pOyAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHggPCA0KSB7CisgICAgICAgICAgICAgICAgICAgIGNwICs9IHg7IGNwMSArPSB4OyBjcDIgKz0geDsgY3AzICs9IHg7CisgICAgICAgICAgICAgICAgICAgIHggPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY3AgKz0gNDsgY3AxICs9IDQ7IGNwMiArPSA0OyBjcDMgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgeCAtPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcCArPSAxODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoIDw9IDQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBoIC09IDQ7CisgICAgICAgICAgICBjcCArPSBpbmNyLCBjcDEgKz0gaW5jciwgY3AyICs9IGluY3IsIGNwMyArPSBpbmNyOworICAgICAgICAgICAgcHAgKz0gZnJvbXNrZXc7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qCisgKiA4LWJpdCBwYWNrZWQgWUNiQ3Igc2FtcGxlcyB3LyA0LDIgc3Vic2FtcGxpbmcgPT4gUkdCCisgKi8KK0RFQ0xBUkVDb250aWdQdXRGdW5jKHB1dGNvbnRpZzhiaXRZQ2JDcjQydGlsZSkKK3sKKyAgICB1aW50MzIqIGNwMSA9IGNwK3crdG9za2V3OworICAgIGludDMyIGluY3IgPSAyKnRvc2tldyt3OworCisgICAgKHZvaWQpIHk7CisgICAgZnJvbXNrZXcgPSAoZnJvbXNrZXcgKiAxMCkgLyA0OworICAgIGlmICgodyAmIDMpID09IDAgJiYgKGggJiAxKSA9PSAwKSB7CisgICAgICAgIGZvciAoOyBoID49IDI7IGggLT0gMikgeworICAgICAgICAgICAgeCA9IHc+PjI7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50MzIgQ2IgPSBwcFs4XTsKKyAgICAgICAgICAgICAgICBpbnQzMiBDciA9IHBwWzldOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFlDYkNydG9SR0IoY3AgWzBdLCBwcFswXSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcCBbMV0sIHBwWzFdKTsKKyAgICAgICAgICAgICAgICBZQ2JDcnRvUkdCKGNwIFsyXSwgcHBbMl0pOworICAgICAgICAgICAgICAgIFlDYkNydG9SR0IoY3AgWzNdLCBwcFszXSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDFbMF0sIHBwWzRdKTsKKyAgICAgICAgICAgICAgICBZQ2JDcnRvUkdCKGNwMVsxXSwgcHBbNV0pOworICAgICAgICAgICAgICAgIFlDYkNydG9SR0IoY3AxWzJdLCBwcFs2XSk7CisgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDFbM10sIHBwWzddKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjcCArPSA0LCBjcDEgKz0gNDsKKyAgICAgICAgICAgICAgICBwcCArPSAxMDsKKyAgICAgICAgICAgIH0gd2hpbGUgKC0teCk7CisgICAgICAgICAgICBjcCArPSBpbmNyLCBjcDEgKz0gaW5jcjsKKyAgICAgICAgICAgIHBwICs9IGZyb21za2V3OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2hpbGUgKGggPiAwKSB7CisgICAgICAgICAgICBmb3IgKHggPSB3OyB4ID4gMDspIHsKKyAgICAgICAgICAgICAgICBpbnQzMiBDYiA9IHBwWzhdOworICAgICAgICAgICAgICAgIGludDMyIENyID0gcHBbOV07CisgICAgICAgICAgICAgICAgc3dpdGNoICh4KSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChoKSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFlDYkNydG9SR0IoY3AxWzNdLCBwcFsgN10pOyAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6ICBZQ2JDcnRvUkdCKGNwIFszXSwgcHBbIDNdKTsgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGgpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogWUNiQ3J0b1JHQihjcDFbMl0sIHBwWyA2XSk7IC8qIEZBTExUSFJPVUdIICovCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogIFlDYkNydG9SR0IoY3AgWzJdLCBwcFsgMl0pOyAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaCkgeworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBZQ2JDcnRvUkdCKGNwMVsxXSwgcHBbIDVdKTsgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiAgWUNiQ3J0b1JHQihjcCBbMV0sIHBwWyAxXSk7IC8qIEZBTExUSFJPVUdIICovCisgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChoKSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFlDYkNydG9SR0IoY3AxWzBdLCBwcFsgNF0pOyAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6ICBZQ2JDcnRvUkdCKGNwIFswXSwgcHBbIDBdKTsgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh4IDwgNCkgeworICAgICAgICAgICAgICAgICAgICBjcCArPSB4OyBjcDEgKz0geDsKKyAgICAgICAgICAgICAgICAgICAgeCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjcCArPSA0OyBjcDEgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgeCAtPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcCArPSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoIDw9IDIpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBoIC09IDI7CisgICAgICAgICAgICBjcCArPSBpbmNyLCBjcDEgKz0gaW5jcjsKKyAgICAgICAgICAgIHBwICs9IGZyb21za2V3OworICAgICAgICB9CisgICAgfQorfQorCisvKgorICogOC1iaXQgcGFja2VkIFlDYkNyIHNhbXBsZXMgdy8gNCwxIHN1YnNhbXBsaW5nID0+IFJHQgorICovCitERUNMQVJFQ29udGlnUHV0RnVuYyhwdXRjb250aWc4Yml0WUNiQ3I0MXRpbGUpCit7CisgICAgKHZvaWQpIHk7CisgICAgLyogWFhYIGFkanVzdCBmcm9tc2tldyAqLworICAgIGRvIHsKKwl4ID0gdz4+MjsKKwl3aGlsZSh4PjApIHsKKwkgICAgaW50MzIgQ2IgPSBwcFs0XTsKKwkgICAgaW50MzIgQ3IgPSBwcFs1XTsKKworCSAgICBZQ2JDcnRvUkdCKGNwIFswXSwgcHBbMF0pOworCSAgICBZQ2JDcnRvUkdCKGNwIFsxXSwgcHBbMV0pOworCSAgICBZQ2JDcnRvUkdCKGNwIFsyXSwgcHBbMl0pOworCSAgICBZQ2JDcnRvUkdCKGNwIFszXSwgcHBbM10pOworCisJICAgIGNwICs9IDQ7CisJICAgIHBwICs9IDY7CisJCXgtLTsKKwl9CisKKyAgICAgICAgaWYoICh3JjMpICE9IDAgKQorICAgICAgICB7CisJICAgIGludDMyIENiID0gcHBbNF07CisJICAgIGludDMyIENyID0gcHBbNV07CisKKyAgICAgICAgICAgIHN3aXRjaCggKHcmMykgKSB7CisgICAgICAgICAgICAgIGNhc2UgMzogWUNiQ3J0b1JHQihjcCBbMl0sIHBwWzJdKTsKKyAgICAgICAgICAgICAgY2FzZSAyOiBZQ2JDcnRvUkdCKGNwIFsxXSwgcHBbMV0pOworICAgICAgICAgICAgICBjYXNlIDE6IFlDYkNydG9SR0IoY3AgWzBdLCBwcFswXSk7CisgICAgICAgICAgICAgIGNhc2UgMDogYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNwICs9ICh3JjMpOworICAgICAgICAgICAgcHAgKz0gNjsKKyAgICAgICAgfQorCisJY3AgKz0gdG9za2V3OworCXBwICs9IGZyb21za2V3OworICAgIH0gd2hpbGUgKC0taCk7CisKK30KKworLyoKKyAqIDgtYml0IHBhY2tlZCBZQ2JDciBzYW1wbGVzIHcvIDIsMiBzdWJzYW1wbGluZyA9PiBSR0IKKyAqLworREVDTEFSRUNvbnRpZ1B1dEZ1bmMocHV0Y29udGlnOGJpdFlDYkNyMjJ0aWxlKQoreworCXVpbnQzMiogY3AyOworCWludDMyIGluY3IgPSAyKnRvc2tldyt3OworCSh2b2lkKSB5OworCWZyb21za2V3ID0gKGZyb21za2V3IC8gMikgKiA2OworCWNwMiA9IGNwK3crdG9za2V3OworCXdoaWxlIChoPj0yKSB7CisJCXggPSB3OworCQl3aGlsZSAoeD49MikgeworCQkJdWludDMyIENiID0gcHBbNF07CisJCQl1aW50MzIgQ3IgPSBwcFs1XTsKKwkJCVlDYkNydG9SR0IoY3BbMF0sIHBwWzBdKTsKKwkJCVlDYkNydG9SR0IoY3BbMV0sIHBwWzFdKTsKKwkJCVlDYkNydG9SR0IoY3AyWzBdLCBwcFsyXSk7CisJCQlZQ2JDcnRvUkdCKGNwMlsxXSwgcHBbM10pOworCQkJY3AgKz0gMjsKKwkJCWNwMiArPSAyOworCQkJcHAgKz0gNjsKKwkJCXggLT0gMjsKKwkJfQorCQlpZiAoeD09MSkgeworCQkJdWludDMyIENiID0gcHBbNF07CisJCQl1aW50MzIgQ3IgPSBwcFs1XTsKKwkJCVlDYkNydG9SR0IoY3BbMF0sIHBwWzBdKTsKKwkJCVlDYkNydG9SR0IoY3AyWzBdLCBwcFsyXSk7CisJCQljcCArKyA7CisJCQljcDIgKysgOworCQkJcHAgKz0gNjsKKwkJfQorCQljcCArPSBpbmNyOworCQljcDIgKz0gaW5jcjsKKwkJcHAgKz0gZnJvbXNrZXc7CisJCWgtPTI7CisJfQorCWlmIChoPT0xKSB7CisJCXggPSB3OworCQl3aGlsZSAoeD49MikgeworCQkJdWludDMyIENiID0gcHBbNF07CisJCQl1aW50MzIgQ3IgPSBwcFs1XTsKKwkJCVlDYkNydG9SR0IoY3BbMF0sIHBwWzBdKTsKKwkJCVlDYkNydG9SR0IoY3BbMV0sIHBwWzFdKTsKKwkJCWNwICs9IDI7CisJCQljcDIgKz0gMjsKKwkJCXBwICs9IDY7CisJCQl4IC09IDI7CisJCX0KKwkJaWYgKHg9PTEpIHsKKwkJCXVpbnQzMiBDYiA9IHBwWzRdOworCQkJdWludDMyIENyID0gcHBbNV07CisJCQlZQ2JDcnRvUkdCKGNwWzBdLCBwcFswXSk7CisJCX0KKwl9Cit9CisKKy8qCisgKiA4LWJpdCBwYWNrZWQgWUNiQ3Igc2FtcGxlcyB3LyAyLDEgc3Vic2FtcGxpbmcgPT4gUkdCCisgKi8KK0RFQ0xBUkVDb250aWdQdXRGdW5jKHB1dGNvbnRpZzhiaXRZQ2JDcjIxdGlsZSkKK3sKKwkodm9pZCkgeTsKKwlmcm9tc2tldyA9IChmcm9tc2tldyAqIDQpIC8gMjsKKwlkbyB7CisJCXggPSB3Pj4xOworCQl3aGlsZSh4PjApIHsKKwkJCWludDMyIENiID0gcHBbMl07CisJCQlpbnQzMiBDciA9IHBwWzNdOworCisJCQlZQ2JDcnRvUkdCKGNwWzBdLCBwcFswXSk7CisJCQlZQ2JDcnRvUkdCKGNwWzFdLCBwcFsxXSk7CisKKwkJCWNwICs9IDI7CisJCQlwcCArPSA0OworCQkJeCAtLTsKKwkJfQorCisJCWlmKCAodyYxKSAhPSAwICkKKwkJeworCQkJaW50MzIgQ2IgPSBwcFsyXTsKKwkJCWludDMyIENyID0gcHBbM107CisKKwkJCVlDYkNydG9SR0IoY3BbMF0sIHBwWzBdKTsKKworCQkJY3AgKz0gMTsKKwkJCXBwICs9IDQ7CisJCX0KKworCQljcCArPSB0b3NrZXc7CisJCXBwICs9IGZyb21za2V3OworCX0gd2hpbGUgKC0taCk7Cit9CisKKy8qCisgKiA4LWJpdCBwYWNrZWQgWUNiQ3Igc2FtcGxlcyB3LyAxLDIgc3Vic2FtcGxpbmcgPT4gUkdCCisgKi8KK0RFQ0xBUkVDb250aWdQdXRGdW5jKHB1dGNvbnRpZzhiaXRZQ2JDcjEydGlsZSkKK3sKKwl1aW50MzIqIGNwMjsKKwlpbnQzMiBpbmNyID0gMip0b3NrZXcrdzsKKwkodm9pZCkgeTsKKwlmcm9tc2tldyA9IChmcm9tc2tldyAvIDIpICogNDsKKwljcDIgPSBjcCt3K3Rvc2tldzsKKwl3aGlsZSAoaD49MikgeworCQl4ID0gdzsKKwkJZG8geworCQkJdWludDMyIENiID0gcHBbMl07CisJCQl1aW50MzIgQ3IgPSBwcFszXTsKKwkJCVlDYkNydG9SR0IoY3BbMF0sIHBwWzBdKTsKKwkJCVlDYkNydG9SR0IoY3AyWzBdLCBwcFsxXSk7CisJCQljcCArKzsKKwkJCWNwMiArKzsKKwkJCXBwICs9IDQ7CisJCX0gd2hpbGUgKC0teCk7CisJCWNwICs9IGluY3I7CisJCWNwMiArPSBpbmNyOworCQlwcCArPSBmcm9tc2tldzsKKwkJaC09MjsKKwl9CisJaWYgKGg9PTEpIHsKKwkJeCA9IHc7CisJCWRvIHsKKwkJCXVpbnQzMiBDYiA9IHBwWzJdOworCQkJdWludDMyIENyID0gcHBbM107CisJCQlZQ2JDcnRvUkdCKGNwWzBdLCBwcFswXSk7CisJCQljcCArKzsKKwkJCXBwICs9IDQ7CisJCX0gd2hpbGUgKC0teCk7CisJfQorfQorCisvKgorICogOC1iaXQgcGFja2VkIFlDYkNyIHNhbXBsZXMgdy8gbm8gc3Vic2FtcGxpbmcgPT4gUkdCCisgKi8KK0RFQ0xBUkVDb250aWdQdXRGdW5jKHB1dGNvbnRpZzhiaXRZQ2JDcjExdGlsZSkKK3sKKwkodm9pZCkgeTsKKwlmcm9tc2tldyAqPSAzOworCWRvIHsKKwkJeCA9IHc7IC8qIHdhcyB4ID0gdz4+MTsgcGF0Y2hlZCAyMDAwLzA5LzI1IHdhcm1lcmRhQGhvbWUuY29tICovCisJCWRvIHsKKwkJCWludDMyIENiID0gcHBbMV07CisJCQlpbnQzMiBDciA9IHBwWzJdOworCisJCQlZQ2JDcnRvUkdCKCpjcCsrLCBwcFswXSk7CisKKwkJCXBwICs9IDM7CisJCX0gd2hpbGUgKC0teCk7CisJCWNwICs9IHRvc2tldzsKKwkJcHAgKz0gZnJvbXNrZXc7CisJfSB3aGlsZSAoLS1oKTsKK30KKworLyoKKyAqIDgtYml0IHBhY2tlZCBZQ2JDciBzYW1wbGVzIHcvIG5vIHN1YnNhbXBsaW5nID0+IFJHQgorICovCitERUNMQVJFU2VwUHV0RnVuYyhwdXRzZXBhcmF0ZThiaXRZQ2JDcjExdGlsZSkKK3sKKwkodm9pZCkgeTsKKwkodm9pZCkgYTsKKwkvKiBUT0RPOiBuYW1pbmcgb2YgaW5wdXQgdmFycyBpcyBzdGlsbCBvZmYsIGNoYW5nZSBvYmZ1c2NhdGluZyBkZWNsYXJhdGlvbiBpbnNpZGUgZGVmaW5lLCBvciByZXNvbHZlIG9iZnVzY2F0aW9uICovCisJd2hpbGUgKGgtLSA+IDApIHsKKwkJeCA9IHc7CisJCWRvIHsKKwkJCXVpbnQzMiBkciwgZGcsIGRiOworCQkJVElGRllDYkNydG9SR0IoaW1nLT55Y2JjciwqcisrLCpnKyssKmIrKywmZHIsJmRnLCZkYik7CisJCQkqY3ArKyA9IFBBQ0soZHIsZGcsZGIpOworCQl9IHdoaWxlICgtLXgpOworCQlTS0VXKHIsIGcsIGIsIGZyb21za2V3KTsKKwkJY3AgKz0gdG9za2V3OworCX0KK30KKyN1bmRlZiBZQ2JDcnRvUkdCCisKK3N0YXRpYyBpbnQKK2luaXRZQ2JDckNvbnZlcnNpb24oVElGRlJHQkFJbWFnZSogaW1nKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gImluaXRZQ2JDckNvbnZlcnNpb24iOworCisJZmxvYXQgKmx1bWEsICpyZWZCbGFja1doaXRlOworCisJaWYgKGltZy0+eWNiY3IgPT0gTlVMTCkgeworCQlpbWctPnljYmNyID0gKFRJRkZZQ2JDclRvUkdCKikgX1RJRkZtYWxsb2MoCisJCSAgICBUSUZGcm91bmR1cF8zMihzaXplb2YgKFRJRkZZQ2JDclRvUkdCKSwgc2l6ZW9mIChsb25nKSkgIAorCQkgICAgKyA0KjI1NipzaXplb2YgKFRJRkZSR0JWYWx1ZSkKKwkJICAgICsgMioyNTYqc2l6ZW9mIChpbnQpCisJCSAgICArIDMqMjU2KnNpemVvZiAoaW50MzIpCisJCSAgICApOworCQlpZiAoaW1nLT55Y2JjciA9PSBOVUxMKSB7CisJCQlUSUZGRXJyb3JFeHQoaW1nLT50aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgIk5vIHNwYWNlIGZvciBZQ2JDci0+UkdCIGNvbnZlcnNpb24gc3RhdGUiKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CisKKwlUSUZGR2V0RmllbGREZWZhdWx0ZWQoaW1nLT50aWYsIFRJRkZUQUdfWUNCQ1JDT0VGRklDSUVOVFMsICZsdW1hKTsKKwlUSUZGR2V0RmllbGREZWZhdWx0ZWQoaW1nLT50aWYsIFRJRkZUQUdfUkVGRVJFTkNFQkxBQ0tXSElURSwKKwkgICAgJnJlZkJsYWNrV2hpdGUpOworCWlmIChUSUZGWUNiQ3JUb1JHQkluaXQoaW1nLT55Y2JjciwgbHVtYSwgcmVmQmxhY2tXaGl0ZSkgPCAwKQorCQlyZXR1cm4oMCk7CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIHRpbGVDb250aWdSb3V0aW5lCitpbml0Q0lFTGFiQ29udmVyc2lvbihUSUZGUkdCQUltYWdlKiBpbWcpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiaW5pdENJRUxhYkNvbnZlcnNpb24iOworCisJZmxvYXQgICAqd2hpdGVQb2ludDsKKwlmbG9hdCAgIHJlZldoaXRlWzNdOworCisJaWYgKCFpbWctPmNpZWxhYikgeworCQlpbWctPmNpZWxhYiA9IChUSUZGQ0lFTGFiVG9SR0IgKikKKwkJCV9USUZGbWFsbG9jKHNpemVvZihUSUZGQ0lFTGFiVG9SR0IpKTsKKwkJaWYgKCFpbWctPmNpZWxhYikgeworCQkJVElGRkVycm9yRXh0KGltZy0+dGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICJObyBzcGFjZSBmb3IgQ0lFIEwqYSpiKi0+UkdCIGNvbnZlcnNpb24gc3RhdGUuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCVRJRkZHZXRGaWVsZERlZmF1bHRlZChpbWctPnRpZiwgVElGRlRBR19XSElURVBPSU5ULCAmd2hpdGVQb2ludCk7CisJcmVmV2hpdGVbMV0gPSAxMDAuMEY7CisJcmVmV2hpdGVbMF0gPSB3aGl0ZVBvaW50WzBdIC8gd2hpdGVQb2ludFsxXSAqIHJlZldoaXRlWzFdOworCXJlZldoaXRlWzJdID0gKDEuMEYgLSB3aGl0ZVBvaW50WzBdIC0gd2hpdGVQb2ludFsxXSkKKwkJICAgICAgLyB3aGl0ZVBvaW50WzFdICogcmVmV2hpdGVbMV07CisJaWYgKFRJRkZDSUVMYWJUb1JHQkluaXQoaW1nLT5jaWVsYWIsICZkaXNwbGF5X3NSR0IsIHJlZldoaXRlKSA8IDApIHsKKwkJVElGRkVycm9yRXh0KGltZy0+dGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkgICAgIkZhaWxlZCB0byBpbml0aWFsaXplIENJRSBMKmEqYiotPlJHQiBjb252ZXJzaW9uIHN0YXRlLiIpOworCQlfVElGRmZyZWUoaW1nLT5jaWVsYWIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gcHV0Y29udGlnOGJpdENJRUxhYjsKK30KKworLyoKKyAqIEdyZXlzY2FsZSBpbWFnZXMgd2l0aCBsZXNzIHRoYW4gOCBiaXRzL3NhbXBsZSBhcmUgaGFuZGxlZAorICogd2l0aCBhIHRhYmxlIHRvIGF2b2lkIGxvdHMgb2Ygc2hpZnRzIGFuZCBtYXNrcy4gIFRoZSB0YWJsZQorICogaXMgc2V0dXAgc28gdGhhdCBwdXQqYnd0aWxlIChiZWxvdykgY2FuIHJldHJpZXZlIDgvYml0c3BlcnNhbXBsZQorICogcGl4ZWwgdmFsdWVzIHNpbXBseSBieSBpbmRleGluZyBpbnRvIHRoZSB0YWJsZSB3aXRoIG9uZQorICogbnVtYmVyLgorICovCitzdGF0aWMgaW50CittYWtlYndtYXAoVElGRlJHQkFJbWFnZSogaW1nKQoreworICAgIFRJRkZSR0JWYWx1ZSogTWFwID0gaW1nLT5NYXA7CisgICAgaW50IGJpdHNwZXJzYW1wbGUgPSBpbWctPmJpdHNwZXJzYW1wbGU7CisgICAgaW50IG5zYW1wbGVzID0gOCAvIGJpdHNwZXJzYW1wbGU7CisgICAgaW50IGk7CisgICAgdWludDMyKiBwOworCisgICAgaWYoIG5zYW1wbGVzID09IDAgKQorICAgICAgICBuc2FtcGxlcyA9IDE7CisKKyAgICBpbWctPkJXbWFwID0gKHVpbnQzMioqKSBfVElGRm1hbGxvYygKKwkyNTYqc2l6ZW9mICh1aW50MzIgKikrKDI1Nipuc2FtcGxlcypzaXplb2YodWludDMyKSkpOworICAgIGlmIChpbWctPkJXbWFwID09IE5VTEwpIHsKKwkJVElGRkVycm9yRXh0KGltZy0+dGlmLT50aWZfY2xpZW50ZGF0YSwgVElGRkZpbGVOYW1lKGltZy0+dGlmKSwgIk5vIHNwYWNlIGZvciBCJlcgbWFwcGluZyB0YWJsZSIpOworCQlyZXR1cm4gKDApOworICAgIH0KKyAgICBwID0gKHVpbnQzMiopKGltZy0+QldtYXAgKyAyNTYpOworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCVRJRkZSR0JWYWx1ZSBjOworCWltZy0+QldtYXBbaV0gPSBwOworCXN3aXRjaCAoYml0c3BlcnNhbXBsZSkgeworI2RlZmluZQlHUkVZKHgpCWMgPSBNYXBbeF07ICpwKysgPSBQQUNLKGMsYyxjKTsKKwljYXNlIDE6CisJICAgIEdSRVkoaT4+Nyk7CisJICAgIEdSRVkoKGk+PjYpJjEpOworCSAgICBHUkVZKChpPj41KSYxKTsKKwkgICAgR1JFWSgoaT4+NCkmMSk7CisJICAgIEdSRVkoKGk+PjMpJjEpOworCSAgICBHUkVZKChpPj4yKSYxKTsKKwkgICAgR1JFWSgoaT4+MSkmMSk7CisJICAgIEdSRVkoaSYxKTsKKwkgICAgYnJlYWs7CisJY2FzZSAyOgorCSAgICBHUkVZKGk+PjYpOworCSAgICBHUkVZKChpPj40KSYzKTsKKwkgICAgR1JFWSgoaT4+MikmMyk7CisJICAgIEdSRVkoaSYzKTsKKwkgICAgYnJlYWs7CisJY2FzZSA0OgorCSAgICBHUkVZKGk+PjQpOworCSAgICBHUkVZKGkmMHhmKTsKKwkgICAgYnJlYWs7CisJY2FzZSA4OgorICAgICAgICBjYXNlIDE2OgorCSAgICBHUkVZKGkpOworCSAgICBicmVhazsKKwl9CisjdW5kZWYJR1JFWQorICAgIH0KKyAgICByZXR1cm4gKDEpOworfQorCisvKgorICogQ29uc3RydWN0IGEgbWFwcGluZyB0YWJsZSB0byBjb252ZXJ0IGZyb20gdGhlIHJhbmdlCisgKiBvZiB0aGUgZGF0YSBzYW1wbGVzIHRvIFswLDI1NV0gLS1mb3IgZGlzcGxheS4gIFRoaXMKKyAqIHByb2Nlc3MgYWxzbyBoYW5kbGVzIGludmVydGluZyBCJlcgaW1hZ2VzIHdoZW4gbmVlZGVkLgorICovIAorc3RhdGljIGludAorc2V0dXBNYXAoVElGRlJHQkFJbWFnZSogaW1nKQoreworICAgIGludDMyIHgsIHJhbmdlOworCisgICAgcmFuZ2UgPSAoaW50MzIpKCgxTDw8aW1nLT5iaXRzcGVyc2FtcGxlKS0xKTsKKyAgICAKKyAgICAvKiB0cmVhdCAxNiBiaXQgdGhlIHNhbWUgYXMgZWlnaHQgYml0ICovCisgICAgaWYoIGltZy0+Yml0c3BlcnNhbXBsZSA9PSAxNiApCisgICAgICAgIHJhbmdlID0gKGludDMyKSAyNTU7CisKKyAgICBpbWctPk1hcCA9IChUSUZGUkdCVmFsdWUqKSBfVElGRm1hbGxvYygocmFuZ2UrMSkgKiBzaXplb2YgKFRJRkZSR0JWYWx1ZSkpOworICAgIGlmIChpbWctPk1hcCA9PSBOVUxMKSB7CisJCVRJRkZFcnJvckV4dChpbWctPnRpZi0+dGlmX2NsaWVudGRhdGEsIFRJRkZGaWxlTmFtZShpbWctPnRpZiksCisJCQkiTm8gc3BhY2UgZm9yIHBob3RvbWV0cmljIGNvbnZlcnNpb24gdGFibGUiKTsKKwkJcmV0dXJuICgwKTsKKyAgICB9CisgICAgaWYgKGltZy0+cGhvdG9tZXRyaWMgPT0gUEhPVE9NRVRSSUNfTUlOSVNXSElURSkgeworCWZvciAoeCA9IDA7IHggPD0gcmFuZ2U7IHgrKykKKwkgICAgaW1nLT5NYXBbeF0gPSAoVElGRlJHQlZhbHVlKSAoKChyYW5nZSAtIHgpICogMjU1KSAvIHJhbmdlKTsKKyAgICB9IGVsc2UgeworCWZvciAoeCA9IDA7IHggPD0gcmFuZ2U7IHgrKykKKwkgICAgaW1nLT5NYXBbeF0gPSAoVElGRlJHQlZhbHVlKSAoKHggKiAyNTUpIC8gcmFuZ2UpOworICAgIH0KKyAgICBpZiAoaW1nLT5iaXRzcGVyc2FtcGxlIDw9IDE2ICYmCisJKGltZy0+cGhvdG9tZXRyaWMgPT0gUEhPVE9NRVRSSUNfTUlOSVNCTEFDSyB8fAorCSBpbWctPnBob3RvbWV0cmljID09IFBIT1RPTUVUUklDX01JTklTV0hJVEUpKSB7CisJLyoKKwkgKiBVc2UgcGhvdG9tZXRyaWMgbWFwcGluZyB0YWJsZSB0byBjb25zdHJ1Y3QKKwkgKiB1bnBhY2tpbmcgdGFibGVzIGZvciBzYW1wbGVzIDw9IDggYml0cy4KKwkgKi8KKwlpZiAoIW1ha2Vid21hcChpbWcpKQorCSAgICByZXR1cm4gKDApOworCS8qIG5vIGxvbmdlciBuZWVkIE1hcCwgZnJlZSBpdCAqLworCV9USUZGZnJlZShpbWctPk1hcCksIGltZy0+TWFwID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuICgxKTsKK30KKworc3RhdGljIGludAorY2hlY2tjbWFwKFRJRkZSR0JBSW1hZ2UqIGltZykKK3sKKyAgICB1aW50MTYqIHIgPSBpbWctPnJlZGNtYXA7CisgICAgdWludDE2KiBnID0gaW1nLT5ncmVlbmNtYXA7CisgICAgdWludDE2KiBiID0gaW1nLT5ibHVlY21hcDsKKyAgICBsb25nIG4gPSAxTDw8aW1nLT5iaXRzcGVyc2FtcGxlOworCisgICAgd2hpbGUgKG4tLSA+IDApCisJaWYgKCpyKysgPj0gMjU2IHx8ICpnKysgPj0gMjU2IHx8ICpiKysgPj0gMjU2KQorCSAgICByZXR1cm4gKDE2KTsKKyAgICByZXR1cm4gKDgpOworfQorCitzdGF0aWMgdm9pZAorY3Z0Y21hcChUSUZGUkdCQUltYWdlKiBpbWcpCit7CisgICAgdWludDE2KiByID0gaW1nLT5yZWRjbWFwOworICAgIHVpbnQxNiogZyA9IGltZy0+Z3JlZW5jbWFwOworICAgIHVpbnQxNiogYiA9IGltZy0+Ymx1ZWNtYXA7CisgICAgbG9uZyBpOworCisgICAgZm9yIChpID0gKDFMPDxpbWctPmJpdHNwZXJzYW1wbGUpLTE7IGkgPj0gMDsgaS0tKSB7CisjZGVmaW5lCUNWVCh4KQkJKCh1aW50MTYpKCh4KT4+OCkpCisJcltpXSA9IENWVChyW2ldKTsKKwlnW2ldID0gQ1ZUKGdbaV0pOworCWJbaV0gPSBDVlQoYltpXSk7CisjdW5kZWYJQ1ZUCisgICAgfQorfQorCisvKgorICogUGFsZXR0ZSBpbWFnZXMgd2l0aCA8PSA4IGJpdHMvc2FtcGxlIGFyZSBoYW5kbGVkCisgKiB3aXRoIGEgdGFibGUgdG8gYXZvaWQgbG90cyBvZiBzaGlmdHMgYW5kIG1hc2tzLiAgVGhlIHRhYmxlCisgKiBpcyBzZXR1cCBzbyB0aGF0IHB1dCpjbWFwdGlsZSAoYmVsb3cpIGNhbiByZXRyaWV2ZSA4L2JpdHNwZXJzYW1wbGUKKyAqIHBpeGVsIHZhbHVlcyBzaW1wbHkgYnkgaW5kZXhpbmcgaW50byB0aGUgdGFibGUgd2l0aCBvbmUKKyAqIG51bWJlci4KKyAqLworc3RhdGljIGludAorbWFrZWNtYXAoVElGRlJHQkFJbWFnZSogaW1nKQoreworICAgIGludCBiaXRzcGVyc2FtcGxlID0gaW1nLT5iaXRzcGVyc2FtcGxlOworICAgIGludCBuc2FtcGxlcyA9IDggLyBiaXRzcGVyc2FtcGxlOworICAgIHVpbnQxNiogciA9IGltZy0+cmVkY21hcDsKKyAgICB1aW50MTYqIGcgPSBpbWctPmdyZWVuY21hcDsKKyAgICB1aW50MTYqIGIgPSBpbWctPmJsdWVjbWFwOworICAgIHVpbnQzMiAqcDsKKyAgICBpbnQgaTsKKworICAgIGltZy0+UEFMbWFwID0gKHVpbnQzMioqKSBfVElGRm1hbGxvYygKKwkyNTYqc2l6ZW9mICh1aW50MzIgKikrKDI1Nipuc2FtcGxlcypzaXplb2YodWludDMyKSkpOworICAgIGlmIChpbWctPlBBTG1hcCA9PSBOVUxMKSB7CisJCVRJRkZFcnJvckV4dChpbWctPnRpZi0+dGlmX2NsaWVudGRhdGEsIFRJRkZGaWxlTmFtZShpbWctPnRpZiksICJObyBzcGFjZSBmb3IgUGFsZXR0ZSBtYXBwaW5nIHRhYmxlIik7CisJCXJldHVybiAoMCk7CisJfQorICAgIHAgPSAodWludDMyKikoaW1nLT5QQUxtYXAgKyAyNTYpOworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCVRJRkZSR0JWYWx1ZSBjOworCWltZy0+UEFMbWFwW2ldID0gcDsKKyNkZWZpbmUJQ01BUCh4KQljID0gKFRJRkZSR0JWYWx1ZSkgeDsgKnArKyA9IFBBQ0socltjXSYweGZmLCBnW2NdJjB4ZmYsIGJbY10mMHhmZik7CisJc3dpdGNoIChiaXRzcGVyc2FtcGxlKSB7CisJY2FzZSAxOgorCSAgICBDTUFQKGk+PjcpOworCSAgICBDTUFQKChpPj42KSYxKTsKKwkgICAgQ01BUCgoaT4+NSkmMSk7CisJICAgIENNQVAoKGk+PjQpJjEpOworCSAgICBDTUFQKChpPj4zKSYxKTsKKwkgICAgQ01BUCgoaT4+MikmMSk7CisJICAgIENNQVAoKGk+PjEpJjEpOworCSAgICBDTUFQKGkmMSk7CisJICAgIGJyZWFrOworCWNhc2UgMjoKKwkgICAgQ01BUChpPj42KTsKKwkgICAgQ01BUCgoaT4+NCkmMyk7CisJICAgIENNQVAoKGk+PjIpJjMpOworCSAgICBDTUFQKGkmMyk7CisJICAgIGJyZWFrOworCWNhc2UgNDoKKwkgICAgQ01BUChpPj40KTsKKwkgICAgQ01BUChpJjB4Zik7CisJICAgIGJyZWFrOworCWNhc2UgODoKKwkgICAgQ01BUChpKTsKKwkgICAgYnJlYWs7CisJfQorI3VuZGVmIENNQVAKKyAgICB9CisgICAgcmV0dXJuICgxKTsKK30KKworLyogCisgKiBDb25zdHJ1Y3QgYW55IG1hcHBpbmcgdGFibGUgdXNlZAorICogYnkgdGhlIGFzc29jaWF0ZWQgcHV0IHJvdXRpbmUuCisgKi8KK3N0YXRpYyBpbnQKK2J1aWxkTWFwKFRJRkZSR0JBSW1hZ2UqIGltZykKK3sKKyAgICBzd2l0Y2ggKGltZy0+cGhvdG9tZXRyaWMpIHsKKyAgICBjYXNlIFBIT1RPTUVUUklDX1JHQjoKKyAgICBjYXNlIFBIT1RPTUVUUklDX1lDQkNSOgorICAgIGNhc2UgUEhPVE9NRVRSSUNfU0VQQVJBVEVEOgorCWlmIChpbWctPmJpdHNwZXJzYW1wbGUgPT0gOCkKKwkgICAgYnJlYWs7CisJLyogZmFsbCB0aHJ1Li4uICovCisgICAgY2FzZSBQSE9UT01FVFJJQ19NSU5JU0JMQUNLOgorICAgIGNhc2UgUEhPVE9NRVRSSUNfTUlOSVNXSElURToKKwlpZiAoIXNldHVwTWFwKGltZykpCisJICAgIHJldHVybiAoMCk7CisJYnJlYWs7CisgICAgY2FzZSBQSE9UT01FVFJJQ19QQUxFVFRFOgorCS8qCisJICogQ29udmVydCAxNi1iaXQgY29sb3JtYXAgdG8gOC1iaXQgKHVubGVzcyBpdCBsb29rcworCSAqIGxpa2UgYW4gb2xkLXN0eWxlIDgtYml0IGNvbG9ybWFwKS4KKwkgKi8KKwlpZiAoY2hlY2tjbWFwKGltZykgPT0gMTYpCisJICAgIGN2dGNtYXAoaW1nKTsKKwllbHNlCisJICAgIFRJRkZXYXJuaW5nRXh0KGltZy0+dGlmLT50aWZfY2xpZW50ZGF0YSwgVElGRkZpbGVOYW1lKGltZy0+dGlmKSwgIkFzc3VtaW5nIDgtYml0IGNvbG9ybWFwIik7CisJLyoKKwkgKiBVc2UgbWFwcGluZyB0YWJsZSBhbmQgY29sb3JtYXAgdG8gY29uc3RydWN0CisJICogdW5wYWNraW5nIHRhYmxlcyBmb3Igc2FtcGxlcyA8IDggYml0cy4KKwkgKi8KKwlpZiAoaW1nLT5iaXRzcGVyc2FtcGxlIDw9IDggJiYgIW1ha2VjbWFwKGltZykpCisJICAgIHJldHVybiAoMCk7CisJYnJlYWs7CisgICAgfQorICAgIHJldHVybiAoMSk7Cit9CisKKy8qCisgKiBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIGNvbnZlcnNpb24gcm91dGluZSBmb3IgcGFja2VkIGRhdGEuCisgKi8KK3N0YXRpYyBpbnQKK1BpY2tDb250aWdDYXNlKFRJRkZSR0JBSW1hZ2UqIGltZykKK3sKKwlpbWctPmdldCA9IFRJRkZJc1RpbGVkKGltZy0+dGlmKSA/IGd0VGlsZUNvbnRpZyA6IGd0U3RyaXBDb250aWc7CisJaW1nLT5wdXQuY29udGlnID0gTlVMTDsKKwlzd2l0Y2ggKGltZy0+cGhvdG9tZXRyaWMpIHsKKwkJY2FzZSBQSE9UT01FVFJJQ19SR0I6CisJCQlzd2l0Y2ggKGltZy0+Yml0c3BlcnNhbXBsZSkgeworCQkJCWNhc2UgODoKKwkJCQkJaWYgKGltZy0+YWxwaGEgPT0gRVhUUkFTQU1QTEVfQVNTT0NBTFBIQSkKKwkJCQkJCWltZy0+cHV0LmNvbnRpZyA9IHB1dFJHQkFBY29udGlnOGJpdHRpbGU7CisJCQkJCWVsc2UgaWYgKGltZy0+YWxwaGEgPT0gRVhUUkFTQU1QTEVfVU5BU1NBTFBIQSkKKwkJCQkJeworCQkJCQkJaWYgKEJ1aWxkTWFwVWFUb0FhKGltZykpCisJCQkJCQkJaW1nLT5wdXQuY29udGlnID0gcHV0UkdCVUFjb250aWc4Yml0dGlsZTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCQlpbWctPnB1dC5jb250aWcgPSBwdXRSR0Jjb250aWc4Yml0dGlsZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAxNjoKKwkJCQkJaWYgKGltZy0+YWxwaGEgPT0gRVhUUkFTQU1QTEVfQVNTT0NBTFBIQSkKKwkJCQkJeworCQkJCQkJaWYgKEJ1aWxkTWFwQml0ZGVwdGgxNlRvOChpbWcpKQorCQkJCQkJCWltZy0+cHV0LmNvbnRpZyA9IHB1dFJHQkFBY29udGlnMTZiaXR0aWxlOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKGltZy0+YWxwaGEgPT0gRVhUUkFTQU1QTEVfVU5BU1NBTFBIQSkKKwkJCQkJeworCQkJCQkJaWYgKEJ1aWxkTWFwQml0ZGVwdGgxNlRvOChpbWcpICYmCisJCQkJCQkgICAgQnVpbGRNYXBVYVRvQWEoaW1nKSkKKwkJCQkJCQlpbWctPnB1dC5jb250aWcgPSBwdXRSR0JVQWNvbnRpZzE2Yml0dGlsZTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWlmIChCdWlsZE1hcEJpdGRlcHRoMTZUbzgoaW1nKSkKKwkJCQkJCQlpbWctPnB1dC5jb250aWcgPSBwdXRSR0Jjb250aWcxNmJpdHRpbGU7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBQSE9UT01FVFJJQ19TRVBBUkFURUQ6CisJCQlpZiAoYnVpbGRNYXAoaW1nKSkgeworCQkJCWlmIChpbWctPmJpdHNwZXJzYW1wbGUgPT0gOCkgeworCQkJCQlpZiAoIWltZy0+TWFwKQorCQkJCQkJaW1nLT5wdXQuY29udGlnID0gcHV0UkdCY29udGlnOGJpdENNWUt0aWxlOworCQkJCQllbHNlCisJCQkJCQlpbWctPnB1dC5jb250aWcgPSBwdXRSR0Jjb250aWc4Yml0Q01ZS01hcHRpbGU7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUEhPVE9NRVRSSUNfUEFMRVRURToKKwkJCWlmIChidWlsZE1hcChpbWcpKSB7CisJCQkJc3dpdGNoIChpbWctPmJpdHNwZXJzYW1wbGUpIHsKKwkJCQkJY2FzZSA4OgorCQkJCQkJaW1nLT5wdXQuY29udGlnID0gcHV0OGJpdGNtYXB0aWxlOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgNDoKKwkJCQkJCWltZy0+cHV0LmNvbnRpZyA9IHB1dDRiaXRjbWFwdGlsZTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDI6CisJCQkJCQlpbWctPnB1dC5jb250aWcgPSBwdXQyYml0Y21hcHRpbGU7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxOgorCQkJCQkJaW1nLT5wdXQuY29udGlnID0gcHV0MWJpdGNtYXB0aWxlOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUEhPVE9NRVRSSUNfTUlOSVNXSElURToKKwkJY2FzZSBQSE9UT01FVFJJQ19NSU5JU0JMQUNLOgorCQkJaWYgKGJ1aWxkTWFwKGltZykpIHsKKwkJCQlzd2l0Y2ggKGltZy0+Yml0c3BlcnNhbXBsZSkgeworCQkJCQljYXNlIDE2OgorCQkJCQkJaW1nLT5wdXQuY29udGlnID0gcHV0MTZiaXRid3RpbGU7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA4OgorCQkJCQkJaWYgKGltZy0+YWxwaGEgJiYgaW1nLT5zYW1wbGVzcGVycGl4ZWwgPT0gMikKKwkJCQkJCQlpbWctPnB1dC5jb250aWcgPSBwdXRhZ3JleXRpbGU7CisJCQkJCQllbHNlCisJCQkJCQkJaW1nLT5wdXQuY29udGlnID0gcHV0Z3JleXRpbGU7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSA0OgorCQkJCQkJaW1nLT5wdXQuY29udGlnID0gcHV0NGJpdGJ3dGlsZTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDI6CisJCQkJCQlpbWctPnB1dC5jb250aWcgPSBwdXQyYml0Ynd0aWxlOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMToKKwkJCQkJCWltZy0+cHV0LmNvbnRpZyA9IHB1dDFiaXRid3RpbGU7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBQSE9UT01FVFJJQ19ZQ0JDUjoKKwkJCWlmICgoaW1nLT5iaXRzcGVyc2FtcGxlPT04KSAmJiAoaW1nLT5zYW1wbGVzcGVycGl4ZWw9PTMpKQorCQkJeworCQkJCWlmIChpbml0WUNiQ3JDb252ZXJzaW9uKGltZykhPTApCisJCQkJeworCQkJCQkvKgorCQkJCQkgKiBUaGUgNi4wIHNwZWMgc2F5cyB0aGF0IHN1YnNhbXBsaW5nIG11c3QgYmUKKwkJCQkJICogb25lIG9mIDEsIDIsIG9yIDQsIGFuZCB0aGF0IHZlcnRpY2FsIHN1YnNhbXBsaW5nCisJCQkJCSAqIG11c3QgYWx3YXlzIGJlIDw9IGhvcml6b250YWwgc3Vic2FtcGxpbmc7IHNvCisJCQkJCSAqIHRoZXJlIGFyZSBvbmx5IGEgZmV3IHBvc3NpYmlsaXRpZXMgYW5kIHdlIGp1c3QKKwkJCQkJICogZW51bWVyYXRlIHRoZSBjYXNlcy4KKwkJCQkJICogSm9yaXM6IGFkZGVkIHN1cHBvcnQgZm9yIHRoZSBbMSwyXSBjYXNlLCBub25ldGhlbGVzcywgdG8gYWNjb21tb2RhdGUKKwkJCQkJICogc29tZSBPSlBFRyBmaWxlcworCQkJCQkgKi8KKwkJCQkJdWludDE2IFN1YnNhbXBsaW5nSG9yOworCQkJCQl1aW50MTYgU3Vic2FtcGxpbmdWZXI7CisJCQkJCVRJRkZHZXRGaWVsZERlZmF1bHRlZChpbWctPnRpZiwgVElGRlRBR19ZQ0JDUlNVQlNBTVBMSU5HLCAmU3Vic2FtcGxpbmdIb3IsICZTdWJzYW1wbGluZ1Zlcik7CisJCQkJCXN3aXRjaCAoKFN1YnNhbXBsaW5nSG9yPDw0KXxTdWJzYW1wbGluZ1ZlcikgeworCQkJCQkJY2FzZSAweDQ0OgorCQkJCQkJCWltZy0+cHV0LmNvbnRpZyA9IHB1dGNvbnRpZzhiaXRZQ2JDcjQ0dGlsZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMHg0MjoKKwkJCQkJCQlpbWctPnB1dC5jb250aWcgPSBwdXRjb250aWc4Yml0WUNiQ3I0MnRpbGU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDB4NDE6CisJCQkJCQkJaW1nLT5wdXQuY29udGlnID0gcHV0Y29udGlnOGJpdFlDYkNyNDF0aWxlOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAweDIyOgorCQkJCQkJCWltZy0+cHV0LmNvbnRpZyA9IHB1dGNvbnRpZzhiaXRZQ2JDcjIydGlsZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgMHgyMToKKwkJCQkJCQlpbWctPnB1dC5jb250aWcgPSBwdXRjb250aWc4Yml0WUNiQ3IyMXRpbGU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDB4MTI6CisJCQkJCQkJaW1nLT5wdXQuY29udGlnID0gcHV0Y29udGlnOGJpdFlDYkNyMTJ0aWxlOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAweDExOgorCQkJCQkJCWltZy0+cHV0LmNvbnRpZyA9IHB1dGNvbnRpZzhiaXRZQ2JDcjExdGlsZTsKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFBIT1RPTUVUUklDX0NJRUxBQjoKKwkJCWlmIChidWlsZE1hcChpbWcpKSB7CisJCQkJaWYgKGltZy0+Yml0c3BlcnNhbXBsZSA9PSA4KQorCQkJCQlpbWctPnB1dC5jb250aWcgPSBpbml0Q0lFTGFiQ29udmVyc2lvbihpbWcpOworCQkJCWJyZWFrOworCQkJfQorCX0KKwlyZXR1cm4gKChpbWctPmdldCE9TlVMTCkgJiYgKGltZy0+cHV0LmNvbnRpZyE9TlVMTCkpOworfQorCisvKgorICogU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBjb252ZXJzaW9uIHJvdXRpbmUgZm9yIHVucGFja2VkIGRhdGEuCisgKgorICogTkI6IHdlIGFzc3VtZSB0aGF0IHVucGFja2VkIHNpbmdsZSBjaGFubmVsIGRhdGEgaXMgZGlyZWN0ZWQKKyAqCSB0byB0aGUgInBhY2tlZCByb3V0aW5lcy4KKyAqLworc3RhdGljIGludAorUGlja1NlcGFyYXRlQ2FzZShUSUZGUkdCQUltYWdlKiBpbWcpCit7CisJaW1nLT5nZXQgPSBUSUZGSXNUaWxlZChpbWctPnRpZikgPyBndFRpbGVTZXBhcmF0ZSA6IGd0U3RyaXBTZXBhcmF0ZTsKKwlpbWctPnB1dC5zZXBhcmF0ZSA9IE5VTEw7CisJc3dpdGNoIChpbWctPnBob3RvbWV0cmljKSB7CisJY2FzZSBQSE9UT01FVFJJQ19NSU5JU1dISVRFOgorCWNhc2UgUEhPVE9NRVRSSUNfTUlOSVNCTEFDSzoKKwkJLyogZ3JleXNjYWxlIGltYWdlcyBwcm9jZXNzZWQgcHJldHR5IG11Y2ggYXMgUkdCIGJ5IGd0VGlsZVNlcGFyYXRlICovCisJY2FzZSBQSE9UT01FVFJJQ19SR0I6CisJCXN3aXRjaCAoaW1nLT5iaXRzcGVyc2FtcGxlKSB7CisJCWNhc2UgODoKKwkJCWlmIChpbWctPmFscGhhID09IEVYVFJBU0FNUExFX0FTU09DQUxQSEEpCisJCQkJaW1nLT5wdXQuc2VwYXJhdGUgPSBwdXRSR0JBQXNlcGFyYXRlOGJpdHRpbGU7CisJCQllbHNlIGlmIChpbWctPmFscGhhID09IEVYVFJBU0FNUExFX1VOQVNTQUxQSEEpCisJCQl7CisJCQkJaWYgKEJ1aWxkTWFwVWFUb0FhKGltZykpCisJCQkJCWltZy0+cHV0LnNlcGFyYXRlID0gcHV0UkdCVUFzZXBhcmF0ZThiaXR0aWxlOworCQkJfQorCQkJZWxzZQorCQkJCWltZy0+cHV0LnNlcGFyYXRlID0gcHV0UkdCc2VwYXJhdGU4Yml0dGlsZTsKKwkJCWJyZWFrOworCQljYXNlIDE2OgorCQkJaWYgKGltZy0+YWxwaGEgPT0gRVhUUkFTQU1QTEVfQVNTT0NBTFBIQSkKKwkJCXsKKwkJCQlpZiAoQnVpbGRNYXBCaXRkZXB0aDE2VG84KGltZykpCisJCQkJCWltZy0+cHV0LnNlcGFyYXRlID0gcHV0UkdCQUFzZXBhcmF0ZTE2Yml0dGlsZTsKKwkJCX0KKwkJCWVsc2UgaWYgKGltZy0+YWxwaGEgPT0gRVhUUkFTQU1QTEVfVU5BU1NBTFBIQSkKKwkJCXsKKwkJCQlpZiAoQnVpbGRNYXBCaXRkZXB0aDE2VG84KGltZykgJiYKKwkJCQkgICAgQnVpbGRNYXBVYVRvQWEoaW1nKSkKKwkJCQkJaW1nLT5wdXQuc2VwYXJhdGUgPSBwdXRSR0JVQXNlcGFyYXRlMTZiaXR0aWxlOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmIChCdWlsZE1hcEJpdGRlcHRoMTZUbzgoaW1nKSkKKwkJCQkJaW1nLT5wdXQuc2VwYXJhdGUgPSBwdXRSR0JzZXBhcmF0ZTE2Yml0dGlsZTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgUEhPVE9NRVRSSUNfU0VQQVJBVEVEOgorCQlpZiAoaW1nLT5iaXRzcGVyc2FtcGxlID09IDggJiYgaW1nLT5zYW1wbGVzcGVycGl4ZWwgPT0gNCkKKwkJeworCQkJaW1nLT5hbHBoYSA9IDE7IC8vIE5vdCBhbHBoYSwgYnV0IHNlZW1zIGxpa2UgdGhlIG9ubHkgd2F5IHRvIGdldCA0dGggYmFuZAorCQkJaW1nLT5wdXQuc2VwYXJhdGUgPSBwdXRDTVlLc2VwYXJhdGU4Yml0dGlsZTsKKwkJfQorCQlicmVhazsKKwljYXNlIFBIT1RPTUVUUklDX1lDQkNSOgorCQlpZiAoKGltZy0+Yml0c3BlcnNhbXBsZT09OCkgJiYgKGltZy0+c2FtcGxlc3BlcnBpeGVsPT0zKSkKKwkJeworCQkJaWYgKGluaXRZQ2JDckNvbnZlcnNpb24oaW1nKSE9MCkKKwkJCXsKKwkJCQl1aW50MTYgaHMsIHZzOworCQkJCVRJRkZHZXRGaWVsZERlZmF1bHRlZChpbWctPnRpZiwgVElGRlRBR19ZQ0JDUlNVQlNBTVBMSU5HLCAmaHMsICZ2cyk7CisJCQkJc3dpdGNoICgoaHM8PDQpfHZzKSB7CisJCQkJY2FzZSAweDExOgorCQkJCQlpbWctPnB1dC5zZXBhcmF0ZSA9IHB1dHNlcGFyYXRlOGJpdFlDYkNyMTF0aWxlOworCQkJCQlicmVhazsKKwkJCQkJLyogVE9ETzogYWRkIG90aGVyIGNhc2VzIGhlcmUgKi8KKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiAoKGltZy0+Z2V0IT1OVUxMKSAmJiAoaW1nLT5wdXQuc2VwYXJhdGUhPU5VTEwpKTsKK30KKworc3RhdGljIGludAorQnVpbGRNYXBVYVRvQWEoVElGRlJHQkFJbWFnZSogaW1nKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdPSJCdWlsZE1hcFVhVG9BYSI7CisJdWludDgqIG07CisJdWludDE2IG5hLG52OworCWFzc2VydChpbWctPlVhVG9BYT09TlVMTCk7CisJaW1nLT5VYVRvQWE9X1RJRkZtYWxsb2MoNjU1MzYpOworCWlmIChpbWctPlVhVG9BYT09TlVMTCkKKwl7CisJCVRJRkZFcnJvckV4dChpbWctPnRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJPdXQgb2YgbWVtb3J5Iik7CisJCXJldHVybigwKTsKKwl9CisJbT1pbWctPlVhVG9BYTsKKwlmb3IgKG5hPTA7IG5hPDI1NjsgbmErKykKKwl7CisJCWZvciAobnY9MDsgbnY8MjU2OyBudisrKQorCQkJKm0rKz0obnYqbmErMTI3KS8yNTU7CisJfQorCXJldHVybigxKTsKK30KKworc3RhdGljIGludAorQnVpbGRNYXBCaXRkZXB0aDE2VG84KFRJRkZSR0JBSW1hZ2UqIGltZykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXT0iQnVpbGRNYXBCaXRkZXB0aDE2VG84IjsKKwl1aW50OCogbTsKKwl1aW50MzIgbjsKKwlhc3NlcnQoaW1nLT5CaXRkZXB0aDE2VG84PT1OVUxMKTsKKwlpbWctPkJpdGRlcHRoMTZUbzg9X1RJRkZtYWxsb2MoNjU1MzYpOworCWlmIChpbWctPkJpdGRlcHRoMTZUbzg9PU5VTEwpCisJeworCQlUSUZGRXJyb3JFeHQoaW1nLT50aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiT3V0IG9mIG1lbW9yeSIpOworCQlyZXR1cm4oMCk7CisJfQorCW09aW1nLT5CaXRkZXB0aDE2VG84OworCWZvciAobj0wOyBuPDY1NTM2OyBuKyspCisJCSptKys9KG4rMTI4KS8yNTc7CisJcmV0dXJuKDEpOworfQorCisKKy8qCisgKiBSZWFkIGEgd2hvbGUgc3RyaXAgb2ZmIGRhdGEgZnJvbSB0aGUgZmlsZSwgYW5kIGNvbnZlcnQgdG8gUkdCQSBmb3JtLgorICogSWYgdGhpcyBpcyB0aGUgbGFzdCBzdHJpcCwgdGhlbiBpdCB3aWxsIG9ubHkgY29udGFpbiB0aGUgcG9ydGlvbiBvZgorICogdGhlIHN0cmlwIHRoYXQgaXMgYWN0dWFsbHkgd2l0aGluIHRoZSBpbWFnZSBzcGFjZS4gIFRoZSByZXN1bHQgaXMKKyAqIG9yZ2FuaXplZCBpbiBib3R0b20gdG8gdG9wIGZvcm0uCisgKi8KKworCitpbnQKK1RJRkZSZWFkUkdCQVN0cmlwKFRJRkYqIHRpZiwgdWludDMyIHJvdywgdWludDMyICogcmFzdGVyICkKKworeworICAgIGNoYXIgCWVtc2dbMTAyNF0gPSAiIjsKKyAgICBUSUZGUkdCQUltYWdlIGltZzsKKyAgICBpbnQgCW9rOworICAgIHVpbnQzMglyb3dzcGVyc3RyaXAsIHJvd3NfdG9fcmVhZDsKKworICAgIGlmKCBUSUZGSXNUaWxlZCggdGlmICkgKQorICAgIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIFRJRkZGaWxlTmFtZSh0aWYpLAorICAgICAgICAgICAgICAgICAgIkNhbid0IHVzZSBUSUZGUmVhZFJHQkFTdHJpcCgpIHdpdGggdGlsZWQgZmlsZS4iKTsKKwlyZXR1cm4gKDApOworICAgIH0KKyAgICAKKyAgICBUSUZGR2V0RmllbGREZWZhdWx0ZWQodGlmLCBUSUZGVEFHX1JPV1NQRVJTVFJJUCwgJnJvd3NwZXJzdHJpcCk7CisgICAgaWYoIChyb3cgJSByb3dzcGVyc3RyaXApICE9IDAgKQorICAgIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIFRJRkZGaWxlTmFtZSh0aWYpLAorCQkJCSJSb3cgcGFzc2VkIHRvIFRJRkZSZWFkUkdCQVN0cmlwKCkgbXVzdCBiZSBmaXJzdCBpbiBhIHN0cmlwLiIpOworCQlyZXR1cm4gKDApOworICAgIH0KKworICAgIGlmIChUSUZGUkdCQUltYWdlT0sodGlmLCBlbXNnKSAmJiBUSUZGUkdCQUltYWdlQmVnaW4oJmltZywgdGlmLCAwLCBlbXNnKSkgeworCisgICAgICAgIGltZy5yb3dfb2Zmc2V0ID0gcm93OworICAgICAgICBpbWcuY29sX29mZnNldCA9IDA7CisKKyAgICAgICAgaWYoIHJvdyArIHJvd3NwZXJzdHJpcCA+IGltZy5oZWlnaHQgKQorICAgICAgICAgICAgcm93c190b19yZWFkID0gaW1nLmhlaWdodCAtIHJvdzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcm93c190b19yZWFkID0gcm93c3BlcnN0cmlwOworICAgICAgICAKKwlvayA9IFRJRkZSR0JBSW1hZ2VHZXQoJmltZywgcmFzdGVyLCBpbWcud2lkdGgsIHJvd3NfdG9fcmVhZCApOworICAgICAgICAKKwlUSUZGUkdCQUltYWdlRW5kKCZpbWcpOworICAgIH0gZWxzZSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBUSUZGRmlsZU5hbWUodGlmKSwgIiVzIiwgZW1zZyk7CisJCW9rID0gMDsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIChvayk7Cit9CisKKy8qCisgKiBSZWFkIGEgd2hvbGUgdGlsZSBvZmYgZGF0YSBmcm9tIHRoZSBmaWxlLCBhbmQgY29udmVydCB0byBSR0JBIGZvcm0uCisgKiBUaGUgcmV0dXJuZWQgUkdCQSBkYXRhIGlzIG9yZ2FuaXplZCBmcm9tIGJvdHRvbSB0byB0b3Agb2YgdGlsZSwKKyAqIGFuZCBtYXkgaW5jbHVkZSB6ZXJvZWQgYXJlYXMgaWYgdGhlIHRpbGUgZXh0ZW5kcyBvZmYgdGhlIGltYWdlLgorICovCisKK2ludAorVElGRlJlYWRSR0JBVGlsZShUSUZGKiB0aWYsIHVpbnQzMiBjb2wsIHVpbnQzMiByb3csIHVpbnQzMiAqIHJhc3RlcikKKworeworICAgIGNoYXIgCWVtc2dbMTAyNF0gPSAiIjsKKyAgICBUSUZGUkdCQUltYWdlIGltZzsKKyAgICBpbnQgCW9rOworICAgIHVpbnQzMgl0aWxlX3hzaXplLCB0aWxlX3lzaXplOworICAgIHVpbnQzMglyZWFkX3hzaXplLCByZWFkX3lzaXplOworICAgIHVpbnQzMglpX3JvdzsKKworICAgIC8qCisgICAgICogVmVyaWZ5IHRoYXQgb3VyIHJlcXVlc3QgaXMgbGVnYWwgLSBvbiBhIHRpbGUgZmlsZSwgYW5kIG9uIGEKKyAgICAgKiB0aWxlIGJvdW5kYXJ5LgorICAgICAqLworICAgIAorICAgIGlmKCAhVElGRklzVGlsZWQoIHRpZiApICkKKyAgICB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBUSUZGRmlsZU5hbWUodGlmKSwKKwkJCQkgICJDYW4ndCB1c2UgVElGRlJlYWRSR0JBVGlsZSgpIHdpdGggc3RyaXBwZWQgZmlsZS4iKTsKKwkJcmV0dXJuICgwKTsKKyAgICB9CisgICAgCisgICAgVElGRkdldEZpZWxkRGVmYXVsdGVkKHRpZiwgVElGRlRBR19USUxFV0lEVEgsICZ0aWxlX3hzaXplKTsKKyAgICBUSUZGR2V0RmllbGREZWZhdWx0ZWQodGlmLCBUSUZGVEFHX1RJTEVMRU5HVEgsICZ0aWxlX3lzaXplKTsKKyAgICBpZiggKGNvbCAlIHRpbGVfeHNpemUpICE9IDAgfHwgKHJvdyAlIHRpbGVfeXNpemUpICE9IDAgKQorICAgIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIFRJRkZGaWxlTmFtZSh0aWYpLAorICAgICAgICAgICAgICAgICAgIlJvdy9jb2wgcGFzc2VkIHRvIFRJRkZSZWFkUkdCQVRpbGUoKSBtdXN0IGJlIHRvcCIKKyAgICAgICAgICAgICAgICAgICJsZWZ0IGNvcm5lciBvZiBhIHRpbGUuIik7CisJcmV0dXJuICgwKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldHVwIHRoZSBSR0JBIHJlYWRlci4KKyAgICAgKi8KKyAgICAKKyAgICBpZiAoIVRJRkZSR0JBSW1hZ2VPSyh0aWYsIGVtc2cpIAorCXx8ICFUSUZGUkdCQUltYWdlQmVnaW4oJmltZywgdGlmLCAwLCBlbXNnKSkgeworCSAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgVElGRkZpbGVOYW1lKHRpZiksICIlcyIsIGVtc2cpOworCSAgICByZXR1cm4oIDAgKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRoZSBUSUZGUkdCQUltYWdlR2V0KCkgZnVuY3Rpb24gZG9lc24ndCBhbGxvdyB1cyB0byBnZXQgb2ZmIHRoZQorICAgICAqIGVkZ2Ugb2YgdGhlIGltYWdlLCBldmVuIHRvIGZpbGwgYW4gb3RoZXJ3aXNlIHZhbGlkIHRpbGUuICBTbyB3ZQorICAgICAqIGZpZ3VyZSBvdXQgaG93IG11Y2ggd2UgY2FuIHJlYWQsIGFuZCBmaXggdXAgdGhlIHRpbGUgYnVmZmVyIHRvCisgICAgICogYSBmdWxsIHRpbGUgY29uZmlndXJhdGlvbiBhZnRlcndhcmRzLgorICAgICAqLworCisgICAgaWYoIHJvdyArIHRpbGVfeXNpemUgPiBpbWcuaGVpZ2h0ICkKKyAgICAgICAgcmVhZF95c2l6ZSA9IGltZy5oZWlnaHQgLSByb3c7CisgICAgZWxzZQorICAgICAgICByZWFkX3lzaXplID0gdGlsZV95c2l6ZTsKKyAgICAKKyAgICBpZiggY29sICsgdGlsZV94c2l6ZSA+IGltZy53aWR0aCApCisgICAgICAgIHJlYWRfeHNpemUgPSBpbWcud2lkdGggLSBjb2w7CisgICAgZWxzZQorICAgICAgICByZWFkX3hzaXplID0gdGlsZV94c2l6ZTsKKworICAgIC8qCisgICAgICogUmVhZCB0aGUgY2h1bmsgb2YgaW1hZ2VyeS4KKyAgICAgKi8KKyAgICAKKyAgICBpbWcucm93X29mZnNldCA9IHJvdzsKKyAgICBpbWcuY29sX29mZnNldCA9IGNvbDsKKworICAgIG9rID0gVElGRlJHQkFJbWFnZUdldCgmaW1nLCByYXN0ZXIsIHJlYWRfeHNpemUsIHJlYWRfeXNpemUgKTsKKyAgICAgICAgCisgICAgVElGRlJHQkFJbWFnZUVuZCgmaW1nKTsKKworICAgIC8qCisgICAgICogSWYgb3VyIHJlYWQgd2FzIGluY29tcGxldGUgd2Ugd2lsbCBuZWVkIHRvIGZpeCB1cCB0aGUgdGlsZSBieQorICAgICAqIHNoaWZ0aW5nIHRoZSBkYXRhIGFyb3VuZCBhcyBpZiBhIGZ1bGwgdGlsZSBvZiBkYXRhIGlzIGJlaW5nIHJldHVybmVkLgorICAgICAqCisgICAgICogVGhpcyBpcyBhbGwgdGhlIG1vcmUgY29tcGxpY2F0ZWQgYmVjYXVzZSB0aGUgaW1hZ2UgaXMgb3JnYW5pemVkIGluCisgICAgICogYm90dG9tIHRvIHRvcCBmb3JtYXQuIAorICAgICAqLworCisgICAgaWYoIHJlYWRfeHNpemUgPT0gdGlsZV94c2l6ZSAmJiByZWFkX3lzaXplID09IHRpbGVfeXNpemUgKQorICAgICAgICByZXR1cm4oIG9rICk7CisKKyAgICBmb3IoIGlfcm93ID0gMDsgaV9yb3cgPCByZWFkX3lzaXplOyBpX3JvdysrICkgeworICAgICAgICBtZW1tb3ZlKCByYXN0ZXIgKyAodGlsZV95c2l6ZSAtIGlfcm93IC0gMSkgKiB0aWxlX3hzaXplLAorICAgICAgICAgICAgICAgICByYXN0ZXIgKyAocmVhZF95c2l6ZSAtIGlfcm93IC0gMSkgKiByZWFkX3hzaXplLAorICAgICAgICAgICAgICAgICByZWFkX3hzaXplICogc2l6ZW9mKHVpbnQzMikgKTsKKyAgICAgICAgX1RJRkZtZW1zZXQoIHJhc3RlciArICh0aWxlX3lzaXplIC0gaV9yb3cgLSAxKSAqIHRpbGVfeHNpemUrcmVhZF94c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIDAsIHNpemVvZih1aW50MzIpICogKHRpbGVfeHNpemUgLSByZWFkX3hzaXplKSApOworICAgIH0KKworICAgIGZvciggaV9yb3cgPSByZWFkX3lzaXplOyBpX3JvdyA8IHRpbGVfeXNpemU7IGlfcm93KysgKSB7CisgICAgICAgIF9USUZGbWVtc2V0KCByYXN0ZXIgKyAodGlsZV95c2l6ZSAtIGlfcm93IC0gMSkgKiB0aWxlX3hzaXplLAorICAgICAgICAgICAgICAgICAgICAgMCwgc2l6ZW9mKHVpbnQzMikgKiB0aWxlX3hzaXplICk7CisgICAgfQorCisgICAgcmV0dXJuIChvayk7Cit9CisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTggc3c9OCBub2V0OiAqLworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfanBlZy5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfanBlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NTk5MDkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9qcGVnLmMKQEAgLTAsMCArMSwyNDI5IEBACisvKiAkSWQ6IHRpZl9qcGVnLmMsdiAxLjExOSAyMDE1LTA4LTE1IDIwOjEzOjA3IGJmcmllc2VuIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTk0LTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNkZWZpbmUgVkNfRVhUUkFMRUFOCisKKyNpbmNsdWRlICJ0aWZmaW9wLmgiCisjaWZkZWYgSlBFR19TVVBQT1JUCisKKy8qCisgKiBUSUZGIExpYnJhcnkKKyAqCisgKiBKUEVHIENvbXByZXNzaW9uIHN1cHBvcnQgcGVyIFRJRkYgVGVjaG5pY2FsIE5vdGUgIzIKKyAqICgqbm90KiBwZXIgdGhlIG9yaWdpbmFsIFRJRkYgNi4wIHNwZWMpLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzaW1wbHkgYW4gaW50ZXJmYWNlIHRvIHRoZSBsaWJqcGVnIGxpYnJhcnkgd3JpdHRlbiBieQorICogdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAuICBZb3UgbmVlZCByZWxlYXNlIDUgb3IgbGF0ZXIgb2YgdGhlIElKRworICogY29kZSwgd2hpY2ggeW91IGNhbiBmaW5kIG9uIHRoZSBJbnRlcm5ldCBhdCBmdHAudXUubmV0Oi9ncmFwaGljcy9qcGVnLy4KKyAqCisgKiBDb250cmlidXRlZCBieSBUb20gTGFuZSA8dGdsQHNzcy5wZ2gucGEudXM+LgorICovCisjaW5jbHVkZSA8c2V0am1wLmg+CisKK2ludCBUSUZGRmlsbFN0cmlwKFRJRkYqIHRpZiwgdWludDMyIHN0cmlwKTsKK2ludCBUSUZGRmlsbFRpbGUoVElGRiogdGlmLCB1aW50MzIgdGlsZSk7CitpbnQgVElGRlJlSW5pdEpQRUdfMTIoIFRJRkYgKnRpZiwgaW50IHNjaGVtZSwgaW50IGlzX2VuY29kZSApOworCisvKiBXZSB1bmRlZmluZSBGQVIgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBKUEVHIGRlZmluaXRpb24gKi8KKworI2lmZGVmIEZBUgorI3VuZGVmIEZBUgorI2VuZGlmCisKKy8qCisgIExpYmpwZWcncyBqbW9yZWNmZy5oIGRlZmluZXMgSU5UMTYgYW5kIElOVDMyLCBidXQgb25seSBpZiBYTURfSCBpcworICBub3QgZGVmaW5lZC4gIFVuZm9ydHVuYXRlbHksIHRoZSBNaW5HVyBhbmQgQm9ybGFuZCBjb21waWxlcnMgaW5jbHVkZQorICBhIHR5cGVkZWYgZm9yIElOVDMyLCB3aGljaCBjYXVzZXMgYSBjb25mbGljdC4gIE1TVkMgZG9lcyBub3QgaW5jbHVkZQorICBhIGNvbmZpY3RpbmcgdHlwZWRlZiBnaXZlbiB0aGUgaGVhZGVycyB3aGljaCBhcmUgaW5jbHVkZWQuCisqLworI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQorIyBkZWZpbmUgWE1EX0ggMQorI2VuZGlmCisKKy8qCisgICBUaGUgd2luZG93cyBSUENORFIuSCBmaWxlIGRlZmluZXMgYm9vbGVhbiwgYnV0IGRlZmluZXMgaXQgd2l0aCB0aGUKKyAgIHVuc2lnbmVkIGNoYXIgc2l6ZS4gIFlvdSBzaG91bGQgY29tcGlsZSBKUEVHIGxpYnJhcnkgdXNpbmcgYXBwcm9wcmlhdGUKKyAgIGRlZmluaXRpb25zIGluIGpjb25maWcuaCBoZWFkZXIsIGJ1dCBtYW55IHVzZXJzIGNvbXBpbGUgbGlicmFyeSBpbiB3cm9uZworICAgd2F5LiBUaGF0IGNhdXNlcyBlcnJvcnMgb2YgdGhlIGZvbGxvd2luZyB0eXBlOgorCisgICAiSlBFR0xpYjogSlBFRyBwYXJhbWV0ZXIgc3RydWN0IG1pc21hdGNoOiBsaWJyYXJ5IHRoaW5rcyBzaXplIGlzIDQzMiwKKyAgIGNhbGxlciBleHBlY3RzIDQ2NCIKKworICAgRm9yIHN1Y2ggdXNlcnMgd2Ugd2lsIGZpeCB0aGUgcHJvYmxlbSBoZXJlLiBTZWUgaW5zdGFsbC5kb2MgZmlsZSBmcm9tCisgICB0aGUgSlBFRyBsaWJyYXJ5IGRpc3RyaWJ1dGlvbiBmb3IgZGV0YWlscy4KKyovCisKKy8qIERlZmluZSAiYm9vbGVhbiIgYXMgdW5zaWduZWQgY2hhciwgbm90IGludCwgcGVyIFdpbmRvd3MgY3VzdG9tLiAqLworI2lmIGRlZmluZWQoX19XSU4zMl9fKSAmJiAhZGVmaW5lZChfX01JTkdXMzJfXykKKyMgaWZuZGVmIF9fUlBDTkRSX0hfXyAgICAgICAgICAgIC8qIGRvbid0IGNvbmZsaWN0IGlmIHJwY25kci5oIGFscmVhZHkgcmVhZCAqLworICAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyIGJvb2xlYW47CisjIGVuZGlmCisjIGRlZmluZSBIQVZFX0JPT0xFQU4gICAgICAgICAgICAvKiBwcmV2ZW50IGptb3JlY2ZnLmggZnJvbSByZWRlZmluaW5nIGl0ICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoVVNFX1NZU1RFTV9MSUJKUEVHKQorI2luY2x1ZGUgPGplcnJvci5oPgorI2luY2x1ZGUgPGpwZWdsaWIuaD4KKyNlbGlmIGRlZmluZWQoVVNFX0xJQkpQRUdfVFVSQk8pCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbGlianBlZ190dXJiby9qZXJyb3IuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9saWJqcGVnX3R1cmJvL2pwZWdsaWIuaCIKKyNlbHNlCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbGlianBlZy9qZXJyb3IuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9saWJqcGVnL2pwZWdsaWIuaCIKKyNlbmRpZgorCisvKiAKKyAqIERvIHdlIHdhbnQgdG8gZG8gc3BlY2lhbCBwcm9jZXNzaW5nIHN1aXRhYmxlIGZvciB3aGVuIEpTQU1QTEUgaXMgYQorICogMTZiaXQgdmFsdWU/ICAKKyAqLworCisjaWYgZGVmaW5lZChKUEVHX0xJQl9NSzEpCisjICBkZWZpbmUgSlBFR19MSUJfTUsxX09SXzEyQklUIDEKKyNlbGlmIEJJVFNfSU5fSlNBTVBMRSA9PSAxMgorIyAgZGVmaW5lIEpQRUdfTElCX01LMV9PUl8xMkJJVCAxCisjZW5kaWYKKworLyoKKyAqIFdlIGFyZSB1c2luZyB3aWR0aF9pbl9ibG9ja3Mgd2hpY2ggaXMgc3VwcG9zZWQgdG8gYmUgcHJpdmF0ZSB0bworICogbGlianBlZy4gVW5mb3J0dW5hdGVseSwgdGhlIGxpYmpwZWcgZGVsaXZlcmVkIHdpdGggQ3lnd2luIGhhcworICogcmVuYW1lZCB0aGlzIG1lbWJlciB0byB3aWR0aF9pbl9kYXRhX3VuaXRzLiAgU2luY2UgdGhlIGhlYWRlciBoYXMKKyAqIGFsc28gcmVuYW1lZCBhIGRlZmluZSwgdXNlIHRoYXQgdW5pcXVlIGRlZmluZSBuYW1lIGluIG9yZGVyIHRvCisgKiBkZXRlY3QgdGhlIHByb2JsZW0gaGVhZGVyIGFuZCBhZGp1c3QgdG8gc3VpdC4KKyAqLworI2lmIGRlZmluZWQoRF9NQVhfREFUQV9VTklUU19JTl9NQ1UpCisjZGVmaW5lIHdpZHRoX2luX2Jsb2NrcyB3aWR0aF9pbl9kYXRhX3VuaXRzCisjZW5kaWYKKworLyoKKyAqIE9uIHNvbWUgbWFjaGluZXMgaXQgbWF5IGJlIHdvcnRod2hpbGUgdG8gdXNlIF9zZXRqbXAgb3Igc2lnc2V0am1wCisgKiBpbiBwbGFjZSBvZiBwbGFpbiBzZXRqbXAuICBUaGVzZSBtYWNyb3Mgd2lsbCBtYWtlIGl0IGVhc2llci4KKyAqLworI2RlZmluZSBTRVRKTVAoamJ1ZikJCXNldGptcChqYnVmKQorI2RlZmluZSBMT05HSk1QKGpidWYsY29kZSkJbG9uZ2ptcChqYnVmLGNvZGUpCisjZGVmaW5lIEpNUF9CVUYJCQlqbXBfYnVmCisKK3R5cGVkZWYgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyIGpwZWdfZGVzdGluYXRpb25fbWdyOwordHlwZWRlZiBzdHJ1Y3QganBlZ19zb3VyY2VfbWdyIGpwZWdfc291cmNlX21ncjsKK3R5cGVkZWYgc3RydWN0IGpwZWdfZXJyb3JfbWdyIGpwZWdfZXJyb3JfbWdyOworCisvKgorICogU3RhdGUgYmxvY2sgZm9yIGVhY2ggb3BlbiBUSUZGIGZpbGUgdXNpbmcKKyAqIGxpYmpwZWcgdG8gZG8gSlBFRyBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uLgorICoKKyAqIGxpYmpwZWcncyB2aXNpYmxlIHN0YXRlIGlzIGVpdGhlciBhIGpwZWdfY29tcHJlc3Nfc3RydWN0CisgKiBvciBqcGVnX2RlY29tcHJlc3Nfc3RydWN0IGRlcGVuZGluZyBvbiB3aGljaCB3YXkgd2UKKyAqIGFyZSBnb2luZy4gIGNvbW0gY2FuIGJlIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGZpZWxkcworICogd2hpY2ggYXJlIGNvbW1vbiB0byBib3RoLgorICoKKyAqIE5COiBjaW5mbyBpcyByZXF1aXJlZCB0byBiZSB0aGUgZmlyc3QgbWVtYmVyIG9mIEpQRUdTdGF0ZSwKKyAqICAgICBzbyB3ZSBjYW4gc2FmZWx5IGNhc3QgSlBFR1N0YXRlKiAtPiBqcGVnX3h4eF9zdHJ1Y3QqCisgKiAgICAgYW5kIHZpY2UgdmVyc2EhCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bmlvbiB7CisJCXN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBjOworCQlzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCBkOworCQlzdHJ1Y3QganBlZ19jb21tb25fc3RydWN0IGNvbW07CisJfSBjaW5mbzsJCQkvKiBOQjogbXVzdCBiZSBmaXJzdCAqLworCWludCAgICAgICAgICAgICBjaW5mb19pbml0aWFsaXplZDsKKworCWpwZWdfZXJyb3JfbWdyCWVycjsJCS8qIGxpYmpwZWcgZXJyb3IgbWFuYWdlciAqLworCUpNUF9CVUYJCWV4aXRfam1wYnVmOwkvKiBmb3IgY2F0Y2hpbmcgbGlianBlZyBmYWlsdXJlcyAqLworCS8qCisJICogVGhlIGZvbGxvd2luZyB0d28gbWVtYmVycyBjb3VsZCBiZSBhIHVuaW9uLCBidXQKKwkgKiB0aGV5J3JlIHNtYWxsIGVub3VnaCB0aGF0IGl0J3Mgbm90IHdvcnRoIHRoZSBlZmZvcnQuCisJICovCisJanBlZ19kZXN0aW5hdGlvbl9tZ3IgZGVzdDsJLyogZGF0YSBkZXN0IGZvciBjb21wcmVzc2lvbiAqLworCWpwZWdfc291cmNlX21ncglzcmM7CQkvKiBkYXRhIHNvdXJjZSBmb3IgZGVjb21wcmVzc2lvbiAqLworCQkJCQkvKiBwcml2YXRlIHN0YXRlICovCisJVElGRioJCXRpZjsJCS8qIGJhY2sgbGluayBuZWVkZWQgYnkgc29tZSBjb2RlICovCisJdWludDE2CQlwaG90b21ldHJpYzsJLyogY29weSBvZiBQaG90b21ldHJpY0ludGVycHJldGF0aW9uICovCisJdWludDE2CQloX3NhbXBsaW5nOwkvKiBsdW1pbmFuY2Ugc2FtcGxpbmcgZmFjdG9ycyAqLworCXVpbnQxNgkJdl9zYW1wbGluZzsKKwl0bXNpemVfdCAgIAlieXRlc3BlcmxpbmU7CS8qIGRlY29tcHJlc3NlZCBieXRlcyBwZXIgc2NhbmxpbmUgKi8KKwkvKiBwb2ludGVycyB0byBpbnRlcm1lZGlhdGUgYnVmZmVycyB3aGVuIHByb2Nlc3NpbmcgZG93bnNhbXBsZWQgZGF0YSAqLworCUpTQU1QQVJSQVkJZHNfYnVmZmVyW01BWF9DT01QT05FTlRTXTsKKwlpbnQJCXNjYW5jb3VudDsJLyogbnVtYmVyIG9mICJzY2FubGluZXMiIGFjY3VtdWxhdGVkICovCisJaW50CQlzYW1wbGVzcGVyY2x1bXA7CisKKwlUSUZGVkdldE1ldGhvZAl2Z2V0cGFyZW50OwkvKiBzdXBlci1jbGFzcyBtZXRob2QgKi8KKwlUSUZGVlNldE1ldGhvZAl2c2V0cGFyZW50OwkvKiBzdXBlci1jbGFzcyBtZXRob2QgKi8KKwlUSUZGUHJpbnRNZXRob2QgcHJpbnRkaXI7CS8qIHN1cGVyLWNsYXNzIG1ldGhvZCAqLworCVRJRkZTdHJpcE1ldGhvZAlkZWZzcGFyZW50OwkvKiBzdXBlci1jbGFzcyBtZXRob2QgKi8KKwlUSUZGVGlsZU1ldGhvZAlkZWZ0cGFyZW50OwkvKiBzdXBlci1jbGFzcyBtZXRob2QgKi8KKwkJCQkJLyogcHNldWRvLXRhZyBmaWVsZHMgKi8KKwl2b2lkKgkJanBlZ3RhYmxlczsJLyogSlBFR1RhYmxlcyB0YWcgdmFsdWUsIG9yIE5VTEwgKi8KKwl1aW50MzIJCWpwZWd0YWJsZXNfbGVuZ3RoOyAvKiBudW1iZXIgb2YgYnl0ZXMgaW4gc2FtZSAqLworCWludAkJanBlZ3F1YWxpdHk7CS8qIENvbXByZXNzaW9uIHF1YWxpdHkgbGV2ZWwgKi8KKwlpbnQJCWpwZWdjb2xvcm1vZGU7CS8qIEF1dG8gUkdCPD0+WUNiQ3IgY29udmVydD8gKi8KKwlpbnQJCWpwZWd0YWJsZXNtb2RlOwkvKiBXaGF0IHRvIHB1dCBpbiBKUEVHVGFibGVzICovCisKKyAgICAgICAgaW50ICAgICAgICAgICAgIHljYmNyc2FtcGxpbmdfZmV0Y2hlZDsKK30gSlBFR1N0YXRlOworCisjZGVmaW5lCUpTdGF0ZSh0aWYpCSgoSlBFR1N0YXRlKikodGlmKS0+dGlmX2RhdGEpCisKK3N0YXRpYyBpbnQgSlBFR0RlY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IGNjLCB1aW50MTYgcyk7CitzdGF0aWMgaW50IEpQRUdEZWNvZGVSYXcoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBjYywgdWludDE2IHMpOworc3RhdGljIGludCBKUEVHRW5jb2RlKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKTsKK3N0YXRpYyBpbnQgSlBFR0VuY29kZVJhdyhUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IGNjLCB1aW50MTYgcyk7CitzdGF0aWMgaW50IEpQRUdJbml0aWFsaXplTGliSlBFRyhUSUZGICogdGlmLCBpbnQgZGVjb2RlICk7CitzdGF0aWMgaW50IERlY29kZVJvd0Vycm9yKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKTsKKworI2RlZmluZQlGSUVMRF9KUEVHVEFCTEVTCShGSUVMRF9DT0RFQyswKQorCitzdGF0aWMgY29uc3QgVElGRkZpZWxkIGpwZWdGaWVsZHNbXSA9IHsKKyAgICB7IFRJRkZUQUdfSlBFR1RBQkxFUywgLTMsIC0zLCBUSUZGX1VOREVGSU5FRCwgMCwgVElGRl9TRVRHRVRfQzMyX1VJTlQ4LCBUSUZGX1NFVEdFVF9DMzJfVUlOVDgsIEZJRUxEX0pQRUdUQUJMRVMsIEZBTFNFLCBUUlVFLCAiSlBFR1RhYmxlcyIsIE5VTEwgfSwKKyAgICB7IFRJRkZUQUdfSlBFR1FVQUxJVFksIDAsIDAsIFRJRkZfQU5ZLCAwLCBUSUZGX1NFVEdFVF9JTlQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfUFNFVURPLCBUUlVFLCBGQUxTRSwgIiIsIE5VTEwgfSwKKyAgICB7IFRJRkZUQUdfSlBFR0NPTE9STU9ERSwgMCwgMCwgVElGRl9BTlksIDAsIFRJRkZfU0VUR0VUX0lOVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9QU0VVRE8sIEZBTFNFLCBGQUxTRSwgIiIsIE5VTEwgfSwKKyAgICB7IFRJRkZUQUdfSlBFR1RBQkxFU01PREUsIDAsIDAsIFRJRkZfQU5ZLCAwLCBUSUZGX1NFVEdFVF9JTlQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfUFNFVURPLCBGQUxTRSwgRkFMU0UsICIiLCBOVUxMIH0KK307CisKKy8qCisgKiBsaWJqcGVnIGludGVyZmFjZSBsYXllci4KKyAqCisgKiBXZSB1c2Ugc2V0am1wL2xvbmdqbXAgdG8gcmV0dXJuIGNvbnRyb2wgdG8gbGlidGlmZgorICogd2hlbiBhIGZhdGFsIGVycm9yIGlzIGVuY291bnRlcmVkIHdpdGhpbiB0aGUgSlBFRworICogbGlicmFyeS4gIFdlIGFsc28gZGlyZWN0IGxpYmpwZWcgZXJyb3IgYW5kIHdhcm5pbmcKKyAqIG1lc3NhZ2VzIHRocm91Z2ggdGhlIGFwcHJvcHJpYXRlIGxpYnRpZmYgaGFuZGxlcnMuCisgKi8KKworLyoKKyAqIEVycm9yIGhhbmRsaW5nIHJvdXRpbmVzICh0aGVzZSByZXBsYWNlIGNvcnJlc3BvbmRpbmcKKyAqIElKRyByb3V0aW5lcyBmcm9tIGplcnJvci5jKS4gIFRoZXNlIGFyZSB1c2VkIGZvciBib3RoCisgKiBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbi4KKyAqLworc3RhdGljIHZvaWQKK1RJRkZqcGVnX2Vycm9yX2V4aXQoal9jb21tb25fcHRyIGNpbmZvKQoreworCUpQRUdTdGF0ZSAqc3AgPSAoSlBFR1N0YXRlICopIGNpbmZvOwkvKiBOQjogY2luZm8gYXNzdW1lZCBmaXJzdCAqLworCWNoYXIgYnVmZmVyW0pNU0dfTEVOR1RIX01BWF07CisKKwkoKmNpbmZvLT5lcnItPmZvcm1hdF9tZXNzYWdlKSAoY2luZm8sIGJ1ZmZlcik7CisJVElGRkVycm9yRXh0KHNwLT50aWYtPnRpZl9jbGllbnRkYXRhLCAiSlBFR0xpYiIsICIlcyIsIGJ1ZmZlcik7CQkvKiBkaXNwbGF5IHRoZSBlcnJvciBtZXNzYWdlICovCisJanBlZ19hYm9ydChjaW5mbyk7CQkJLyogY2xlYW4gdXAgbGlianBlZyBzdGF0ZSAqLworCUxPTkdKTVAoc3AtPmV4aXRfam1wYnVmLCAxKTsJCS8qIHJldHVybiB0byBsaWJ0aWZmIGNhbGxlciAqLworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGludm9rZWQgb25seSBmb3Igd2FybmluZyBtZXNzYWdlcywKKyAqIHNpbmNlIGVycm9yX2V4aXQgZG9lcyBpdHMgb3duIHRoaW5nIGFuZCB0cmFjZV9sZXZlbAorICogaXMgbmV2ZXIgc2V0ID4gMC4KKyAqLworc3RhdGljIHZvaWQKK1RJRkZqcGVnX291dHB1dF9tZXNzYWdlKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKwljaGFyIGJ1ZmZlcltKTVNHX0xFTkdUSF9NQVhdOworCisJKCpjaW5mby0+ZXJyLT5mb3JtYXRfbWVzc2FnZSkgKGNpbmZvLCBidWZmZXIpOworCVRJRkZXYXJuaW5nRXh0KCgoSlBFR1N0YXRlICopIGNpbmZvKS0+dGlmLT50aWZfY2xpZW50ZGF0YSwgIkpQRUdMaWIiLCAiJXMiLCBidWZmZXIpOworfQorCisvKgorICogSW50ZXJmYWNlIHJvdXRpbmVzLiAgVGhpcyBsYXllciBvZiByb3V0aW5lcyBleGlzdHMKKyAqIHByaW1hcmlseSB0byBsaW1pdCBzaWRlLWVmZmVjdHMgZnJvbSB1c2luZyBzZXRqbXAuCisgKiBBbHNvLCBub3JtYWwvZXJyb3IgcmV0dXJucyBhcmUgY29udmVydGVkIGludG8gcmV0dXJuCisgKiB2YWx1ZXMgcGVyIGxpYnRpZmYgcHJhY3RpY2UuCisgKi8KKyNkZWZpbmUJQ0FMTEpQRUcoc3AsIGZhaWwsIG9wKQkoU0VUSk1QKChzcCktPmV4aXRfam1wYnVmKSA/IChmYWlsKSA6IChvcCkpCisjZGVmaW5lCUNBTExWSlBFRyhzcCwgb3ApCUNBTExKUEVHKHNwLCAwLCAoKG9wKSwxKSkKKworc3RhdGljIGludAorVElGRmpwZWdfY3JlYXRlX2NvbXByZXNzKEpQRUdTdGF0ZSogc3ApCit7CisJLyogaW5pdGlhbGl6ZSBKUEVHIGVycm9yIGhhbmRsaW5nICovCisJc3AtPmNpbmZvLmMuZXJyID0ganBlZ19zdGRfZXJyb3IoJnNwLT5lcnIpOworCXNwLT5lcnIuZXJyb3JfZXhpdCA9IFRJRkZqcGVnX2Vycm9yX2V4aXQ7CisJc3AtPmVyci5vdXRwdXRfbWVzc2FnZSA9IFRJRkZqcGVnX291dHB1dF9tZXNzYWdlOworCisJLyogc2V0IGNsaWVudF9kYXRhIHRvIGF2b2lkIFVNUiB3YXJuaW5nIGZyb20gdG9vbHMgbGlrZSBQdXJpZnkgKi8KKwlzcC0+Y2luZm8uYy5jbGllbnRfZGF0YSA9IE5VTEw7CisKKwlyZXR1cm4gQ0FMTFZKUEVHKHNwLCBqcGVnX2NyZWF0ZV9jb21wcmVzcygmc3AtPmNpbmZvLmMpKTsKK30KKworc3RhdGljIGludAorVElGRmpwZWdfY3JlYXRlX2RlY29tcHJlc3MoSlBFR1N0YXRlKiBzcCkKK3sKKwkvKiBpbml0aWFsaXplIEpQRUcgZXJyb3IgaGFuZGxpbmcgKi8KKwlzcC0+Y2luZm8uZC5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmc3AtPmVycik7CisJc3AtPmVyci5lcnJvcl9leGl0ID0gVElGRmpwZWdfZXJyb3JfZXhpdDsKKwlzcC0+ZXJyLm91dHB1dF9tZXNzYWdlID0gVElGRmpwZWdfb3V0cHV0X21lc3NhZ2U7CisKKwkvKiBzZXQgY2xpZW50X2RhdGEgdG8gYXZvaWQgVU1SIHdhcm5pbmcgZnJvbSB0b29scyBsaWtlIFB1cmlmeSAqLworCXNwLT5jaW5mby5kLmNsaWVudF9kYXRhID0gTlVMTDsKKworCXJldHVybiBDQUxMVkpQRUcoc3AsIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoJnNwLT5jaW5mby5kKSk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZqcGVnX3NldF9kZWZhdWx0cyhKUEVHU3RhdGUqIHNwKQoreworCXJldHVybiBDQUxMVkpQRUcoc3AsIGpwZWdfc2V0X2RlZmF1bHRzKCZzcC0+Y2luZm8uYykpOworfQorCitzdGF0aWMgaW50CitUSUZGanBlZ19zZXRfY29sb3JzcGFjZShKUEVHU3RhdGUqIHNwLCBKX0NPTE9SX1NQQUNFIGNvbG9yc3BhY2UpCit7CisJcmV0dXJuIENBTExWSlBFRyhzcCwganBlZ19zZXRfY29sb3JzcGFjZSgmc3AtPmNpbmZvLmMsIGNvbG9yc3BhY2UpKTsKK30KKworc3RhdGljIGludAorVElGRmpwZWdfc2V0X3F1YWxpdHkoSlBFR1N0YXRlKiBzcCwgaW50IHF1YWxpdHksIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpCit7CisJcmV0dXJuIENBTExWSlBFRyhzcCwKKwkgICAganBlZ19zZXRfcXVhbGl0eSgmc3AtPmNpbmZvLmMsIHF1YWxpdHksIGZvcmNlX2Jhc2VsaW5lKSk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZqcGVnX3N1cHByZXNzX3RhYmxlcyhKUEVHU3RhdGUqIHNwLCBib29sZWFuIHN1cHByZXNzKQoreworCXJldHVybiBDQUxMVkpQRUcoc3AsIGpwZWdfc3VwcHJlc3NfdGFibGVzKCZzcC0+Y2luZm8uYywgc3VwcHJlc3MpKTsKK30KKworc3RhdGljIGludAorVElGRmpwZWdfc3RhcnRfY29tcHJlc3MoSlBFR1N0YXRlKiBzcCwgYm9vbGVhbiB3cml0ZV9hbGxfdGFibGVzKQoreworCXJldHVybiBDQUxMVkpQRUcoc3AsCisJICAgIGpwZWdfc3RhcnRfY29tcHJlc3MoJnNwLT5jaW5mby5jLCB3cml0ZV9hbGxfdGFibGVzKSk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZqcGVnX3dyaXRlX3NjYW5saW5lcyhKUEVHU3RhdGUqIHNwLCBKU0FNUEFSUkFZIHNjYW5saW5lcywgaW50IG51bV9saW5lcykKK3sKKwlyZXR1cm4gQ0FMTEpQRUcoc3AsIC0xLCAoaW50KSBqcGVnX3dyaXRlX3NjYW5saW5lcygmc3AtPmNpbmZvLmMsCisJICAgIHNjYW5saW5lcywgKEpESU1FTlNJT04pIG51bV9saW5lcykpOworfQorCitzdGF0aWMgaW50CitUSUZGanBlZ193cml0ZV9yYXdfZGF0YShKUEVHU3RhdGUqIHNwLCBKU0FNUElNQUdFIGRhdGEsIGludCBudW1fbGluZXMpCit7CisJcmV0dXJuIENBTExKUEVHKHNwLCAtMSwgKGludCkganBlZ193cml0ZV9yYXdfZGF0YSgmc3AtPmNpbmZvLmMsCisJICAgIGRhdGEsIChKRElNRU5TSU9OKSBudW1fbGluZXMpKTsKK30KKworc3RhdGljIGludAorVElGRmpwZWdfZmluaXNoX2NvbXByZXNzKEpQRUdTdGF0ZSogc3ApCit7CisJcmV0dXJuIENBTExWSlBFRyhzcCwganBlZ19maW5pc2hfY29tcHJlc3MoJnNwLT5jaW5mby5jKSk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZqcGVnX3dyaXRlX3RhYmxlcyhKUEVHU3RhdGUqIHNwKQoreworCXJldHVybiBDQUxMVkpQRUcoc3AsIGpwZWdfd3JpdGVfdGFibGVzKCZzcC0+Y2luZm8uYykpOworfQorCitzdGF0aWMgaW50CitUSUZGanBlZ19yZWFkX2hlYWRlcihKUEVHU3RhdGUqIHNwLCBib29sZWFuIHJlcXVpcmVfaW1hZ2UpCit7CisJcmV0dXJuIENBTExKUEVHKHNwLCAtMSwganBlZ19yZWFkX2hlYWRlcigmc3AtPmNpbmZvLmQsIHJlcXVpcmVfaW1hZ2UpKTsKK30KKworc3RhdGljIGludAorVElGRmpwZWdfc3RhcnRfZGVjb21wcmVzcyhKUEVHU3RhdGUqIHNwKQoreworCXJldHVybiBDQUxMVkpQRUcoc3AsIGpwZWdfc3RhcnRfZGVjb21wcmVzcygmc3AtPmNpbmZvLmQpKTsKK30KKworc3RhdGljIGludAorVElGRmpwZWdfcmVhZF9zY2FubGluZXMoSlBFR1N0YXRlKiBzcCwgSlNBTVBBUlJBWSBzY2FubGluZXMsIGludCBtYXhfbGluZXMpCit7CisJcmV0dXJuIENBTExKUEVHKHNwLCAtMSwgKGludCkganBlZ19yZWFkX3NjYW5saW5lcygmc3AtPmNpbmZvLmQsCisJICAgIHNjYW5saW5lcywgKEpESU1FTlNJT04pIG1heF9saW5lcykpOworfQorCitzdGF0aWMgaW50CitUSUZGanBlZ19yZWFkX3Jhd19kYXRhKEpQRUdTdGF0ZSogc3AsIEpTQU1QSU1BR0UgZGF0YSwgaW50IG1heF9saW5lcykKK3sKKwlyZXR1cm4gQ0FMTEpQRUcoc3AsIC0xLCAoaW50KSBqcGVnX3JlYWRfcmF3X2RhdGEoJnNwLT5jaW5mby5kLAorCSAgICBkYXRhLCAoSkRJTUVOU0lPTikgbWF4X2xpbmVzKSk7Cit9CisKK3N0YXRpYyBpbnQKK1RJRkZqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKEpQRUdTdGF0ZSogc3ApCit7CisJcmV0dXJuIENBTExKUEVHKHNwLCAtMSwgKGludCkganBlZ19maW5pc2hfZGVjb21wcmVzcygmc3AtPmNpbmZvLmQpKTsKK30KKworc3RhdGljIGludAorVElGRmpwZWdfYWJvcnQoSlBFR1N0YXRlKiBzcCkKK3sKKwlyZXR1cm4gQ0FMTFZKUEVHKHNwLCBqcGVnX2Fib3J0KCZzcC0+Y2luZm8uY29tbSkpOworfQorCitzdGF0aWMgaW50CitUSUZGanBlZ19kZXN0cm95KEpQRUdTdGF0ZSogc3ApCit7CisJcmV0dXJuIENBTExWSlBFRyhzcCwganBlZ19kZXN0cm95KCZzcC0+Y2luZm8uY29tbSkpOworfQorCitzdGF0aWMgSlNBTVBBUlJBWQorVElGRmpwZWdfYWxsb2Nfc2FycmF5KEpQRUdTdGF0ZSogc3AsIGludCBwb29sX2lkLAorCQkgICAgICBKRElNRU5TSU9OIHNhbXBsZXNwZXJyb3csIEpESU1FTlNJT04gbnVtcm93cykKK3sKKwlyZXR1cm4gQ0FMTEpQRUcoc3AsIChKU0FNUEFSUkFZKSBOVUxMLAorCSAgICAoKnNwLT5jaW5mby5jb21tLm1lbS0+YWxsb2Nfc2FycmF5KQorCQkoJnNwLT5jaW5mby5jb21tLCBwb29sX2lkLCBzYW1wbGVzcGVycm93LCBudW1yb3dzKSk7Cit9CisKKy8qCisgKiBKUEVHIGxpYnJhcnkgZGVzdGluYXRpb24gZGF0YSBtYW5hZ2VyLgorICogVGhlc2Ugcm91dGluZXMgZGlyZWN0IGNvbXByZXNzZWQgZGF0YSBmcm9tIGxpYmpwZWcgaW50byB0aGUKKyAqIGxpYnRpZmYgb3V0cHV0IGJ1ZmZlci4KKyAqLworCitzdGF0aWMgdm9pZAorc3RkX2luaXRfZGVzdGluYXRpb24oal9jb21wcmVzc19wdHIgY2luZm8pCit7CisJSlBFR1N0YXRlKiBzcCA9IChKUEVHU3RhdGUqKSBjaW5mbzsKKwlUSUZGKiB0aWYgPSBzcC0+dGlmOworCisJc3AtPmRlc3QubmV4dF9vdXRwdXRfYnl0ZSA9IChKT0NURVQqKSB0aWYtPnRpZl9yYXdkYXRhOworCXNwLT5kZXN0LmZyZWVfaW5fYnVmZmVyID0gKHNpemVfdCkgdGlmLT50aWZfcmF3ZGF0YXNpemU7Cit9CisKK3N0YXRpYyBib29sZWFuCitzdGRfZW1wdHlfb3V0cHV0X2J1ZmZlcihqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKwlKUEVHU3RhdGUqIHNwID0gKEpQRUdTdGF0ZSopIGNpbmZvOworCVRJRkYqIHRpZiA9IHNwLT50aWY7CisKKwkvKiB0aGUgZW50aXJlIGJ1ZmZlciBoYXMgYmVlbiBmaWxsZWQgKi8KKwl0aWYtPnRpZl9yYXdjYyA9IHRpZi0+dGlmX3Jhd2RhdGFzaXplOworCisjaWZkZWYgSVBQSl9IVUZGCisgICAgICAgLyoKKyAgICAgICAgKiBUaGUgSW50ZWwgSVBQIHBlcmZvcm1hbmNlIGxpYnJhcnkgZG9lcyBub3QgbmVjZXNzYXJpbHkgZmlsbCB1cAorICAgICAgICAqIHRoZSB3aG9sZSBvdXRwdXQgYnVmZmVyIG9uIGVhY2ggcGFzcywgc28gb25seSBkdW1wIG91dCB0aGUgcGFydHMKKyAgICAgICAgKiB0aGF0IGhhdmUgYmVlbiBmaWxsZWQuCisgICAgICAgICogICBodHRwOi8vdHJhYy5vc2dlby5vcmcvZ2RhbC93aWtpL0pwZWdJUFAKKyAgICAgICAgKi8KKyAgICAgICBpZiAoIHNwLT5kZXN0LmZyZWVfaW5fYnVmZmVyID49IDAgKSB7CisgICAgICAgICAgICAgICB0aWYtPnRpZl9yYXdjYyA9IHRpZi0+dGlmX3Jhd2RhdGFzaXplIC0gc3AtPmRlc3QuZnJlZV9pbl9idWZmZXI7CisgICAgICAgfQorI2VuZGlmCisKKwlUSUZGRmx1c2hEYXRhMSh0aWYpOworCXNwLT5kZXN0Lm5leHRfb3V0cHV0X2J5dGUgPSAoSk9DVEVUKikgdGlmLT50aWZfcmF3ZGF0YTsKKwlzcC0+ZGVzdC5mcmVlX2luX2J1ZmZlciA9IChzaXplX3QpIHRpZi0+dGlmX3Jhd2RhdGFzaXplOworCisJcmV0dXJuIChUUlVFKTsKK30KKworc3RhdGljIHZvaWQKK3N0ZF90ZXJtX2Rlc3RpbmF0aW9uKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworCUpQRUdTdGF0ZSogc3AgPSAoSlBFR1N0YXRlKikgY2luZm87CisJVElGRiogdGlmID0gc3AtPnRpZjsKKworCXRpZi0+dGlmX3Jhd2NwID0gKHVpbnQ4Kikgc3AtPmRlc3QubmV4dF9vdXRwdXRfYnl0ZTsKKwl0aWYtPnRpZl9yYXdjYyA9CisJICAgIHRpZi0+dGlmX3Jhd2RhdGFzaXplIC0gKHRtc2l6ZV90KSBzcC0+ZGVzdC5mcmVlX2luX2J1ZmZlcjsKKwkvKiBOQjogbGlidGlmZiBkb2VzIHRoZSBmaW5hbCBidWZmZXIgZmx1c2ggKi8KK30KKworc3RhdGljIHZvaWQKK1RJRkZqcGVnX2RhdGFfZGVzdChKUEVHU3RhdGUqIHNwLCBUSUZGKiB0aWYpCit7CisJKHZvaWQpIHRpZjsKKwlzcC0+Y2luZm8uYy5kZXN0ID0gJnNwLT5kZXN0OworCXNwLT5kZXN0LmluaXRfZGVzdGluYXRpb24gPSBzdGRfaW5pdF9kZXN0aW5hdGlvbjsKKwlzcC0+ZGVzdC5lbXB0eV9vdXRwdXRfYnVmZmVyID0gc3RkX2VtcHR5X291dHB1dF9idWZmZXI7CisJc3AtPmRlc3QudGVybV9kZXN0aW5hdGlvbiA9IHN0ZF90ZXJtX2Rlc3RpbmF0aW9uOworfQorCisvKgorICogQWx0ZXJuYXRlIGRlc3RpbmF0aW9uIG1hbmFnZXIgZm9yIG91dHB1dHRpbmcgdG8gSlBFR1RhYmxlcyBmaWVsZC4KKyAqLworCitzdGF0aWMgdm9pZAordGFibGVzX2luaXRfZGVzdGluYXRpb24oal9jb21wcmVzc19wdHIgY2luZm8pCit7CisJSlBFR1N0YXRlKiBzcCA9IChKUEVHU3RhdGUqKSBjaW5mbzsKKworCS8qIHdoaWxlIGJ1aWxkaW5nLCBqcGVndGFibGVzX2xlbmd0aCBpcyBhbGxvY2F0ZWQgYnVmZmVyIHNpemUgKi8KKwlzcC0+ZGVzdC5uZXh0X291dHB1dF9ieXRlID0gKEpPQ1RFVCopIHNwLT5qcGVndGFibGVzOworCXNwLT5kZXN0LmZyZWVfaW5fYnVmZmVyID0gKHNpemVfdCkgc3AtPmpwZWd0YWJsZXNfbGVuZ3RoOworfQorCitzdGF0aWMgYm9vbGVhbgordGFibGVzX2VtcHR5X291dHB1dF9idWZmZXIoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisJSlBFR1N0YXRlKiBzcCA9IChKUEVHU3RhdGUqKSBjaW5mbzsKKwl2b2lkKiBuZXdidWY7CisKKwkvKiB0aGUgZW50aXJlIGJ1ZmZlciBoYXMgYmVlbiBmaWxsZWQ7IGVubGFyZ2UgaXQgYnkgMTAwMCBieXRlcyAqLworCW5ld2J1ZiA9IF9USUZGcmVhbGxvYygodm9pZCopIHNwLT5qcGVndGFibGVzLAorCQkJICAgICAgKHRtc2l6ZV90KSAoc3AtPmpwZWd0YWJsZXNfbGVuZ3RoICsgMTAwMCkpOworCWlmIChuZXdidWYgPT0gTlVMTCkKKwkJRVJSRVhJVDEoY2luZm8sIEpFUlJfT1VUX09GX01FTU9SWSwgMTAwKTsKKwlzcC0+ZGVzdC5uZXh0X291dHB1dF9ieXRlID0gKEpPQ1RFVCopIG5ld2J1ZiArIHNwLT5qcGVndGFibGVzX2xlbmd0aDsKKwlzcC0+ZGVzdC5mcmVlX2luX2J1ZmZlciA9IChzaXplX3QpIDEwMDA7CisJc3AtPmpwZWd0YWJsZXMgPSBuZXdidWY7CisJc3AtPmpwZWd0YWJsZXNfbGVuZ3RoICs9IDEwMDA7CisJcmV0dXJuIChUUlVFKTsKK30KKworc3RhdGljIHZvaWQKK3RhYmxlc190ZXJtX2Rlc3RpbmF0aW9uKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworCUpQRUdTdGF0ZSogc3AgPSAoSlBFR1N0YXRlKikgY2luZm87CisKKwkvKiBzZXQgdGFibGVzIGxlbmd0aCB0byBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgZW1pdHRlZCAqLworCXNwLT5qcGVndGFibGVzX2xlbmd0aCAtPSAodWludDMyKSBzcC0+ZGVzdC5mcmVlX2luX2J1ZmZlcjsKK30KKworc3RhdGljIGludAorVElGRmpwZWdfdGFibGVzX2Rlc3QoSlBFR1N0YXRlKiBzcCwgVElGRiogdGlmKQoreworCSh2b2lkKSB0aWY7CisJLyoKKwkgKiBBbGxvY2F0ZSBhIHdvcmtpbmcgYnVmZmVyIGZvciBidWlsZGluZyB0YWJsZXMuCisJICogSW5pdGlhbCBzaXplIGlzIDEwMDAgYnl0ZXMsIHdoaWNoIGlzIHVzdWFsbHkgYWRlcXVhdGUuCisJICovCisJaWYgKHNwLT5qcGVndGFibGVzKQorCQlfVElGRmZyZWUoc3AtPmpwZWd0YWJsZXMpOworCXNwLT5qcGVndGFibGVzX2xlbmd0aCA9IDEwMDA7CisJc3AtPmpwZWd0YWJsZXMgPSAodm9pZCopIF9USUZGbWFsbG9jKCh0bXNpemVfdCkgc3AtPmpwZWd0YWJsZXNfbGVuZ3RoKTsKKwlpZiAoc3AtPmpwZWd0YWJsZXMgPT0gTlVMTCkgeworCQlzcC0+anBlZ3RhYmxlc19sZW5ndGggPSAwOworCQlUSUZGRXJyb3JFeHQoc3AtPnRpZi0+dGlmX2NsaWVudGRhdGEsICJUSUZGanBlZ190YWJsZXNfZGVzdCIsICJObyBzcGFjZSBmb3IgSlBFR1RhYmxlcyIpOworCQlyZXR1cm4gKDApOworCX0KKwlzcC0+Y2luZm8uYy5kZXN0ID0gJnNwLT5kZXN0OworCXNwLT5kZXN0LmluaXRfZGVzdGluYXRpb24gPSB0YWJsZXNfaW5pdF9kZXN0aW5hdGlvbjsKKwlzcC0+ZGVzdC5lbXB0eV9vdXRwdXRfYnVmZmVyID0gdGFibGVzX2VtcHR5X291dHB1dF9idWZmZXI7CisJc3AtPmRlc3QudGVybV9kZXN0aW5hdGlvbiA9IHRhYmxlc190ZXJtX2Rlc3RpbmF0aW9uOworCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBKUEVHIGxpYnJhcnkgc291cmNlIGRhdGEgbWFuYWdlci4KKyAqIFRoZXNlIHJvdXRpbmVzIHN1cHBseSBjb21wcmVzc2VkIGRhdGEgdG8gbGlianBlZy4KKyAqLworCitzdGF0aWMgdm9pZAorc3RkX2luaXRfc291cmNlKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisJSlBFR1N0YXRlKiBzcCA9IChKUEVHU3RhdGUqKSBjaW5mbzsKKwlUSUZGKiB0aWYgPSBzcC0+dGlmOworCisJc3AtPnNyYy5uZXh0X2lucHV0X2J5dGUgPSAoY29uc3QgSk9DVEVUKikgdGlmLT50aWZfcmF3ZGF0YTsKKwlzcC0+c3JjLmJ5dGVzX2luX2J1ZmZlciA9IChzaXplX3QpIHRpZi0+dGlmX3Jhd2NjOworfQorCitzdGF0aWMgYm9vbGVhbgorc3RkX2ZpbGxfaW5wdXRfYnVmZmVyKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisJSlBFR1N0YXRlKiBzcCA9IChKUEVHU3RhdGUqICkgY2luZm87CisJc3RhdGljIGNvbnN0IEpPQ1RFVCBkdW1teV9FT0lbMl0gPSB7IDB4RkYsIEpQRUdfRU9JIH07CisKKyNpZmRlZiBJUFBKX0hVRkYKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIEludGVsIElQUCBwZXJmb3JtYW5jZSBsaWJyYXJ5IGRvZXMgbm90IG5lY2Vzc2FyaWx5IHJlYWQgdGhlIHdob2xlCisgICAgICAgICAqIGlucHV0IGJ1ZmZlciBpbiBvbmUgcGFzcywgc28gaXQgaXMgcG9zc2libGUgdG8gZ2V0IGhlcmUgd2l0aCBkYXRhCisgICAgICAgICAqIHlldCB0byByZWFkLiAKKyAgICAgICAgICogCisgICAgICAgICAqIFdlIGp1c3QgcmV0dXJuIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcsIHVudGlsIHRoZSBlbnRpcmUgYnVmZmVyIGhhcworICAgICAgICAgKiBiZWVuIHJlYWQuICAKKyAgICAgICAgICogaHR0cDovL3RyYWMub3NnZW8ub3JnL2dkYWwvd2lraS9KcGVnSVBQCisgICAgICAgICAqLworICAgICAgICBpZiggc3AtPnNyYy5ieXRlc19pbl9idWZmZXIgPiAwICkgeworICAgICAgICAgICAgcmV0dXJuIChUUlVFKTsKKyAgICAgICAgfQorI2VuZGlmCisKKwkvKgorICAgICAgICAgKiBOb3JtYWxseSB0aGUgd2hvbGUgc3RyaXAvdGlsZSBpcyByZWFkIGFuZCBzbyB3ZSBkb24ndCBuZWVkIHRvIGRvCisgICAgICAgICAqIGEgZmlsbC4gIEluIHRoZSBjYXNlIG9mIENIVU5LWV9TVFJJUF9SRUFEX1NVUFBPUlQgd2UgbWlnaHQgbm90IGhhdmUKKyAgICAgICAgICogYWxsIHRoZSBkYXRhLCBidXQgdGhlIHJhd2RhdGEgaXMgcmVmcmVzaGVkIGJldHdlZW4gc2NhbmxpbmVzIGFuZAorICAgICAgICAgKiB3ZSBwdXNoIHRoaXMgaW50byB0aGUgaW8gbWFjaGluZXJ5IGluIEpQRUdEZWNvZGUoKS4gCSAKKyAgICAgICAgICogaHR0cDovL3RyYWMub3NnZW8ub3JnL2dkYWwvdGlja2V0LzM4OTQKKwkgKi8KKyAgICAgICAgCisJV0FSTk1TKGNpbmZvLCBKV1JOX0pQRUdfRU9GKTsKKwkvKiBpbnNlcnQgYSBmYWtlIEVPSSBtYXJrZXIgKi8KKwlzcC0+c3JjLm5leHRfaW5wdXRfYnl0ZSA9IGR1bW15X0VPSTsKKwlzcC0+c3JjLmJ5dGVzX2luX2J1ZmZlciA9IDI7CisJcmV0dXJuIChUUlVFKTsKK30KKworc3RhdGljIHZvaWQKK3N0ZF9za2lwX2lucHV0X2RhdGEoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgbG9uZyBudW1fYnl0ZXMpCit7CisJSlBFR1N0YXRlKiBzcCA9IChKUEVHU3RhdGUqKSBjaW5mbzsKKworCWlmIChudW1fYnl0ZXMgPiAwKSB7CisJCWlmICgoc2l6ZV90KW51bV9ieXRlcyA+IHNwLT5zcmMuYnl0ZXNfaW5fYnVmZmVyKSB7CisJCQkvKiBvb3BzLCBidWZmZXIgb3ZlcnJ1biAqLworCQkJKHZvaWQpIHN0ZF9maWxsX2lucHV0X2J1ZmZlcihjaW5mbyk7CisJCX0gZWxzZSB7CisJCQlzcC0+c3JjLm5leHRfaW5wdXRfYnl0ZSArPSAoc2l6ZV90KSBudW1fYnl0ZXM7CisJCQlzcC0+c3JjLmJ5dGVzX2luX2J1ZmZlciAtPSAoc2l6ZV90KSBudW1fYnl0ZXM7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitzdGRfdGVybV9zb3VyY2Uoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKwkvKiBObyB3b3JrIG5lY2Vzc2FyeSBoZXJlICovCisJKHZvaWQpIGNpbmZvOworfQorCitzdGF0aWMgdm9pZAorVElGRmpwZWdfZGF0YV9zcmMoSlBFR1N0YXRlKiBzcCwgVElGRiogdGlmKQoreworCSh2b2lkKSB0aWY7CisJc3AtPmNpbmZvLmQuc3JjID0gJnNwLT5zcmM7CisJc3AtPnNyYy5pbml0X3NvdXJjZSA9IHN0ZF9pbml0X3NvdXJjZTsKKwlzcC0+c3JjLmZpbGxfaW5wdXRfYnVmZmVyID0gc3RkX2ZpbGxfaW5wdXRfYnVmZmVyOworCXNwLT5zcmMuc2tpcF9pbnB1dF9kYXRhID0gc3RkX3NraXBfaW5wdXRfZGF0YTsKKwlzcC0+c3JjLnJlc3luY190b19yZXN0YXJ0ID0ganBlZ19yZXN5bmNfdG9fcmVzdGFydDsKKwlzcC0+c3JjLnRlcm1fc291cmNlID0gc3RkX3Rlcm1fc291cmNlOworCXNwLT5zcmMuYnl0ZXNfaW5fYnVmZmVyID0gMDsJCS8qIGZvciBzYWZldHkgKi8KKwlzcC0+c3JjLm5leHRfaW5wdXRfYnl0ZSA9IE5VTEw7Cit9CisKKy8qCisgKiBBbHRlcm5hdGUgc291cmNlIG1hbmFnZXIgZm9yIHJlYWRpbmcgZnJvbSBKUEVHVGFibGVzLgorICogV2UgY2FuIHNoYXJlIGFsbCB0aGUgY29kZSBleGNlcHQgZm9yIHRoZSBpbml0IHJvdXRpbmUuCisgKi8KKworc3RhdGljIHZvaWQKK3RhYmxlc19pbml0X3NvdXJjZShqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworCUpQRUdTdGF0ZSogc3AgPSAoSlBFR1N0YXRlKikgY2luZm87CisKKwlzcC0+c3JjLm5leHRfaW5wdXRfYnl0ZSA9IChjb25zdCBKT0NURVQqKSBzcC0+anBlZ3RhYmxlczsKKwlzcC0+c3JjLmJ5dGVzX2luX2J1ZmZlciA9IChzaXplX3QpIHNwLT5qcGVndGFibGVzX2xlbmd0aDsKK30KKworc3RhdGljIHZvaWQKK1RJRkZqcGVnX3RhYmxlc19zcmMoSlBFR1N0YXRlKiBzcCwgVElGRiogdGlmKQoreworCVRJRkZqcGVnX2RhdGFfc3JjKHNwLCB0aWYpOworCXNwLT5zcmMuaW5pdF9zb3VyY2UgPSB0YWJsZXNfaW5pdF9zb3VyY2U7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBkb3duc2FtcGxlZC1kYXRhIGJ1ZmZlcnMgbmVlZGVkIGZvciBkb3duc2FtcGxlZCBJL08uCisgKiBXZSB1c2UgdmFsdWVzIGNvbXB1dGVkIGluIGpwZWdfc3RhcnRfY29tcHJlc3Mgb3IganBlZ19zdGFydF9kZWNvbXByZXNzLgorICogV2UgdXNlIGxpYmpwZWcncyBhbGxvY2F0b3Igc28gdGhhdCBidWZmZXJzIHdpbGwgYmUgcmVsZWFzZWQgYXV0b21hdGljYWxseQorICogd2hlbiBkb25lIHdpdGggc3RyaXAvdGlsZS4KKyAqIFRoaXMgaXMgYWxzbyBhIGhhbmR5IHBsYWNlIHRvIGNvbXB1dGUgc2FtcGxlc3BlcmNsdW1wLCBieXRlc3BlcmxpbmUuCisgKi8KK3N0YXRpYyBpbnQKK2FsbG9jX2Rvd25zYW1wbGVkX2J1ZmZlcnMoVElGRiogdGlmLCBqcGVnX2NvbXBvbmVudF9pbmZvKiBjb21wX2luZm8sCisJCQkgIGludCBudW1fY29tcG9uZW50cykKK3sKKwlKUEVHU3RhdGUqIHNwID0gSlN0YXRlKHRpZik7CisJaW50IGNpOworCWpwZWdfY29tcG9uZW50X2luZm8qIGNvbXBwdHI7CisJSlNBTVBBUlJBWSBidWY7CisJaW50IHNhbXBsZXNfcGVyX2NsdW1wID0gMDsKKworCWZvciAoY2kgPSAwLCBjb21wcHRyID0gY29tcF9pbmZvOyBjaSA8IG51bV9jb21wb25lbnRzOworCSAgICAgY2krKywgY29tcHB0cisrKSB7CisJCXNhbXBsZXNfcGVyX2NsdW1wICs9IGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgKgorCQkJY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKwkJYnVmID0gVElGRmpwZWdfYWxsb2Nfc2FycmF5KHNwLCBKUE9PTF9JTUFHRSwKKwkJCQljb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFLAorCQkJCShKRElNRU5TSU9OKSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvcipEQ1RTSVpFKSk7CisJCWlmIChidWYgPT0gTlVMTCkKKwkJCXJldHVybiAoMCk7CisJCXNwLT5kc19idWZmZXJbY2ldID0gYnVmOworCX0KKwlzcC0+c2FtcGxlc3BlcmNsdW1wID0gc2FtcGxlc19wZXJfY2x1bXA7CisJcmV0dXJuICgxKTsKK30KKworCisvKgorICogSlBFRyBEZWNvZGluZy4KKyAqLworCisjaWZkZWYgQ0hFQ0tfSlBFR19ZQ0JDUl9TVUJTQU1QTElORworCisjZGVmaW5lIEpQRUdfTUFSS0VSX1NPRjAgMHhDMAorI2RlZmluZSBKUEVHX01BUktFUl9TT0YxIDB4QzEKKyNkZWZpbmUgSlBFR19NQVJLRVJfU09GMiAweEMyCisjZGVmaW5lIEpQRUdfTUFSS0VSX1NPRjkgMHhDOQorI2RlZmluZSBKUEVHX01BUktFUl9TT0YxMCAweENBCisjZGVmaW5lIEpQRUdfTUFSS0VSX0RIVCAweEM0CisjZGVmaW5lIEpQRUdfTUFSS0VSX1NPSSAweEQ4CisjZGVmaW5lIEpQRUdfTUFSS0VSX1NPUyAweERBCisjZGVmaW5lIEpQRUdfTUFSS0VSX0RRVCAweERCCisjZGVmaW5lIEpQRUdfTUFSS0VSX0RSSSAweERECisjZGVmaW5lIEpQRUdfTUFSS0VSX0FQUDAgMHhFMAorI2RlZmluZSBKUEVHX01BUktFUl9DT00gMHhGRQorc3RydWN0IEpQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZ0RhdGEKK3sKKwlUSUZGKiB0aWY7CisJdm9pZCogYnVmZmVyOworCXVpbnQzMiBidWZmZXJzaXplOworCXVpbnQ4KiBidWZmZXJjdXJyZW50Ynl0ZTsKKwl1aW50MzIgYnVmZmVyYnl0ZXNsZWZ0OworCXVpbnQ2NCBmaWxlb2Zmc2V0OworCXVpbnQ2NCBmaWxlYnl0ZXNsZWZ0OworCXVpbnQ4IGZpbGVwb3NpdGlvbmVkOworfTsKK3N0YXRpYyB2b2lkIEpQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZyhUSUZGKiB0aWYpOworc3RhdGljIGludCBKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdTZWMoc3RydWN0IEpQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZ0RhdGEqIGRhdGEpOworc3RhdGljIGludCBKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdSZWFkQnl0ZShzdHJ1Y3QgSlBFR0ZpeHVwVGFnc1N1YnNhbXBsaW5nRGF0YSogZGF0YSwgdWludDgqIHJlc3VsdCk7CitzdGF0aWMgaW50IEpQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZ1JlYWRXb3JkKHN0cnVjdCBKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdEYXRhKiBkYXRhLCB1aW50MTYqIHJlc3VsdCk7CitzdGF0aWMgdm9pZCBKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdTa2lwKHN0cnVjdCBKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdEYXRhKiBkYXRhLCB1aW50MTYgc2tpcGxlbmd0aCk7CisKKyNlbmRpZgorCitzdGF0aWMgaW50CitKUEVHRml4dXBUYWdzKFRJRkYqIHRpZikKK3sKKyNpZmRlZiBDSEVDS19KUEVHX1lDQkNSX1NVQlNBTVBMSU5HCisJaWYgKCh0aWYtPnRpZl9kaXIudGRfcGhvdG9tZXRyaWM9PVBIT1RPTUVUUklDX1lDQkNSKSYmCisJICAgICh0aWYtPnRpZl9kaXIudGRfcGxhbmFyY29uZmlnPT1QTEFOQVJDT05GSUdfQ09OVElHKSYmCisJICAgICh0aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsPT0zKSkKKwkJSlBFR0ZpeHVwVGFnc1N1YnNhbXBsaW5nKHRpZik7CisjZW5kaWYKKyAgICAgICAgCisJcmV0dXJuKDEpOworfQorCisjaWZkZWYgQ0hFQ0tfSlBFR19ZQ0JDUl9TVUJTQU1QTElORworCitzdGF0aWMgdm9pZAorSlBFR0ZpeHVwVGFnc1N1YnNhbXBsaW5nKFRJRkYqIHRpZikKK3sKKwkvKgorCSAqIFNvbWUgSlBFRy1pbi1USUZGIHByb2R1Y2VzIGRvIG5vdCBlbWl0IHRoZSBZQ0JDUlNVQlNBTVBMSU5HIHZhbHVlcyBpbgorCSAqIHRoZSBUSUZGIHRhZ3MsIGJ1dCBzdGlsbCB1c2Ugbm9uLWRlZmF1bHQgKDIsMikgdmFsdWVzIHdpdGhpbiB0aGUganBlZworCSAqIGRhdGEgc3RyZWFtIGl0c2VsZi4gIEluIG9yZGVyIGZvciBUSUZGIGFwcGxpY2F0aW9ucyB0byB3b3JrIHByb3Blcmx5CisJICogLSBmb3IgaW5zdGFuY2UgdG8gZ2V0IHRoZSBzdHJpcCBidWZmZXIgc2l6ZSByaWdodCAtIGl0IGlzIGltcGVyYXRpdmUKKwkgKiB0aGF0IHRoZSBzdWJzYW1wbGluZyBiZSBhdmFpbGFibGUgYmVmb3JlIHdlIHN0YXJ0IHJlYWRpbmcgdGhlIGltYWdlCisJICogZGF0YSBub3JtYWxseS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBhdHRlbXB0IHRvIGFuYWx5emUgdGhlIGZpcnN0IHN0cmlwIGluCisJICogb3JkZXIgdG8gZ2V0IHRoZSBzYW1wbGluZyB2YWx1ZXMgZnJvbSB0aGUganBlZyBkYXRhIHN0cmVhbS4KKwkgKgorCSAqIE5vdGUgdGhhdCBKUEVHUHJlRGVvY29kZSgpIHdpbGwgcHJvZHVjZSBhIGZhaXJseSBsb3VkIHdhcm5pbmcgd2hlbiB0aGUKKwkgKiBkaXNjb3ZlcmVkIHNhbXBsaW5nIGRvZXMgbm90IG1hdGNoIHRoZSBkZWZhdWx0IHNhbXBsaW5nICgyLDIpIG9yIHdoYXRldmVyCisJICogd2FzIGFjdHVhbGx5IGluIHRoZSB0aWZmIHRhZ3MuCisJICoKKwkgKiBTZWUgdGhlIGJ1ZyBpbiBidWd6aWxsYSBmb3IgZGV0YWlsczoKKwkgKgorCSAqIGh0dHA6Ly9idWd6aWxsYS5yZW1vdGVzZW5zaW5nLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY4CisJICoKKwkgKiBGcmFuayBXYXJtZXJkYW0sIEp1bHkgMjAwMgorCSAqIEpvcmlzIFZhbiBEYW1tZSwgTWF5IDIwMDcKKwkgKi8KKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmciOworCXN0cnVjdCBKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdEYXRhIG07CisKKyAgICAgICAgX1RJRkZGaWxsU3RyaWxlcyggdGlmICk7CisgICAgICAgIAorICAgICAgICBpZiggdGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50ID09IE5VTEwKKyAgICAgICAgICAgIHx8IHRpZi0+dGlmX2Rpci50ZF9zdHJpcG9mZnNldCA9PSBOVUxMCisgICAgICAgICAgICB8fCB0aWYtPnRpZl9kaXIudGRfc3RyaXBieXRlY291bnRbMF0gPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIERvIG5vdCBldmVuIHRyeSB0byBjaGVjayBpZiB0aGUgZmlyc3Qgc3RyaXAvdGlsZSBkb2VzIG5vdAorICAgICAgICAgICAgICAgeWV0IGV4aXN0LCBhcyBvY2N1cnMgd2hlbiBHREFMIGhhcyBjcmVhdGVkIGEgbmV3IE5VTEwgZmlsZQorICAgICAgICAgICAgICAgZm9yIGluc3RhbmNlLiAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKwltLnRpZj10aWY7CisJbS5idWZmZXJzaXplPTIwNDg7CisJbS5idWZmZXI9X1RJRkZtYWxsb2MobS5idWZmZXJzaXplKTsKKwlpZiAobS5idWZmZXI9PU5VTEwpCisJeworCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwKKwkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBhdXRvLWNvcnJlY3Rpbmcgb2Ygc3Vic2FtcGxpbmcgdmFsdWVzOyBhdXRvLWNvcnJlY3Rpbmcgc2tpcHBlZCIpOworCQlyZXR1cm47CisJfQorCW0uYnVmZmVyY3VycmVudGJ5dGU9TlVMTDsKKwltLmJ1ZmZlcmJ5dGVzbGVmdD0wOworCW0uZmlsZW9mZnNldD10aWYtPnRpZl9kaXIudGRfc3RyaXBvZmZzZXRbMF07CisJbS5maWxlcG9zaXRpb25lZD0wOworCW0uZmlsZWJ5dGVzbGVmdD10aWYtPnRpZl9kaXIudGRfc3RyaXBieXRlY291bnRbMF07CisJaWYgKCFKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdTZWMoJm0pKQorCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwKKwkJICAgICJVbmFibGUgdG8gYXV0by1jb3JyZWN0IHN1YnNhbXBsaW5nIHZhbHVlcywgbGlrZWx5IGNvcnJ1cHQgSlBFRyBjb21wcmVzc2VkIGRhdGEgaW4gZmlyc3Qgc3RyaXAvdGlsZTsgYXV0by1jb3JyZWN0aW5nIHNraXBwZWQiKTsKKwlfVElGRmZyZWUobS5idWZmZXIpOworfQorCitzdGF0aWMgaW50CitKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdTZWMoc3RydWN0IEpQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZ0RhdGEqIGRhdGEpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiSlBFR0ZpeHVwVGFnc1N1YnNhbXBsaW5nU2VjIjsKKwl1aW50OCBtOworCXdoaWxlICgxKQorCXsKKwkJd2hpbGUgKDEpCisJCXsKKwkJCWlmICghSlBFR0ZpeHVwVGFnc1N1YnNhbXBsaW5nUmVhZEJ5dGUoZGF0YSwmbSkpCisJCQkJcmV0dXJuKDApOworCQkJaWYgKG09PTI1NSkKKwkJCQlicmVhazsKKwkJfQorCQl3aGlsZSAoMSkKKwkJeworCQkJaWYgKCFKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdSZWFkQnl0ZShkYXRhLCZtKSkKKwkJCQlyZXR1cm4oMCk7CisJCQlpZiAobSE9MjU1KQorCQkJCWJyZWFrOworCQl9CisJCXN3aXRjaCAobSkKKwkJeworCQkJY2FzZSBKUEVHX01BUktFUl9TT0k6CisJCQkJLyogdGhpcyB0eXBlIG9mIG1hcmtlciBoYXMgbm8gZGF0YSBhbmQgc2hvdWxkIGJlIHNraXBwZWQgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgSlBFR19NQVJLRVJfQ09NOgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwOgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwKzE6CisJCQljYXNlIEpQRUdfTUFSS0VSX0FQUDArMjoKKwkJCWNhc2UgSlBFR19NQVJLRVJfQVBQMCszOgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwKzQ6CisJCQljYXNlIEpQRUdfTUFSS0VSX0FQUDArNToKKwkJCWNhc2UgSlBFR19NQVJLRVJfQVBQMCs2OgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwKzc6CisJCQljYXNlIEpQRUdfTUFSS0VSX0FQUDArODoKKwkJCWNhc2UgSlBFR19NQVJLRVJfQVBQMCs5OgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwKzEwOgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwKzExOgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwKzEyOgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwKzEzOgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwKzE0OgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwKzE1OgorCQkJY2FzZSBKUEVHX01BUktFUl9EUVQ6CisJCQljYXNlIEpQRUdfTUFSS0VSX1NPUzoKKwkJCWNhc2UgSlBFR19NQVJLRVJfREhUOgorCQkJY2FzZSBKUEVHX01BUktFUl9EUkk6CisJCQkJLyogdGhpcyB0eXBlIG9mIG1hcmtlciBoYXMgZGF0YSwgYnV0IGl0IGhhcyBubyB1c2UgdG8gdXMgYW5kIHNob3VsZCBiZSBza2lwcGVkICovCisJCQkJeworCQkJCQl1aW50MTYgbjsKKwkJCQkJaWYgKCFKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdSZWFkV29yZChkYXRhLCZuKSkKKwkJCQkJCXJldHVybigwKTsKKwkJCQkJaWYgKG48MikKKwkJCQkJCXJldHVybigwKTsKKwkJCQkJbi09MjsKKwkJCQkJaWYgKG4+MCkKKwkJCQkJCUpQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZ1NraXAoZGF0YSxuKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEpQRUdfTUFSS0VSX1NPRjA6IC8qIEJhc2VsaW5lIHNlcXVlbnRpYWwgSHVmZm1hbiAqLworCQkJY2FzZSBKUEVHX01BUktFUl9TT0YxOiAvKiBFeHRlbmRlZCBzZXF1ZW50aWFsIEh1ZmZtYW4gKi8KKwkJCWNhc2UgSlBFR19NQVJLRVJfU09GMjogLyogUHJvZ3Jlc3NpdmUgSHVmZm1hbjogbm9ybWFsbHkgbm90IGFsbG93ZWQgYnkgVGVjaE5vdGUsIGJ1dCB0aGF0IGRvZXNuJ3QgaHVydCBzdXBwb3J0aW5nIGl0ICovCisJCQljYXNlIEpQRUdfTUFSS0VSX1NPRjk6IC8qIEV4dGVuZGVkIHNlcXVlbnRpYWwgYXJpdGhtZXRpYyAqLworCQkJY2FzZSBKUEVHX01BUktFUl9TT0YxMDogLyogUHJvZ3Jlc3NpdmUgYXJpdGhtZXRpYzogbm9ybWFsbHkgbm90IGFsbG93ZWQgYnkgVGVjaE5vdGUsIGJ1dCB0aGF0IGRvZXNuJ3QgaHVydCBzdXBwb3J0aW5nIGl0ICovCisJCQkJLyogdGhpcyBtYXJrZXIgY29udGFpbnMgdGhlIHN1YnNhbXBsaW5nIGZhY3RvcnMgd2UncmUgc2Nhbm5pbmcgZm9yICovCisJCQkJeworCQkJCQl1aW50MTYgbjsKKwkJCQkJdWludDE2IG87CisJCQkJCXVpbnQ4IHA7CisJCQkJCXVpbnQ4IHBoLHB2OworCQkJCQlpZiAoIUpQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZ1JlYWRXb3JkKGRhdGEsJm4pKQorCQkJCQkJcmV0dXJuKDApOworCQkJCQlpZiAobiE9OCtkYXRhLT50aWYtPnRpZl9kaXIudGRfc2FtcGxlc3BlcnBpeGVsKjMpCisJCQkJCQlyZXR1cm4oMCk7CisJCQkJCUpQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZ1NraXAoZGF0YSw3KTsKKwkJCQkJaWYgKCFKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdSZWFkQnl0ZShkYXRhLCZwKSkKKwkJCQkJCXJldHVybigwKTsKKwkJCQkJcGg9KHA+PjQpOworCQkJCQlwdj0ocCYxNSk7CisJCQkJCUpQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZ1NraXAoZGF0YSwxKTsKKwkJCQkJZm9yIChvPTE7IG88ZGF0YS0+dGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbDsgbysrKQorCQkJCQl7CisJCQkJCQlKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdTa2lwKGRhdGEsMSk7CisJCQkJCQlpZiAoIUpQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZ1JlYWRCeXRlKGRhdGEsJnApKQorCQkJCQkJCXJldHVybigwKTsKKwkJCQkJCWlmIChwIT0weDExKQorCQkJCQkJeworCQkJCQkJCVRJRkZXYXJuaW5nRXh0KGRhdGEtPnRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLAorCQkJCQkJCSAgICAiU3Vic2FtcGxpbmcgdmFsdWVzIGluc2lkZSBKUEVHIGNvbXByZXNzZWQgZGF0YSBoYXZlIG5vIFRJRkYgZXF1aXZhbGVudCwgYXV0by1jb3JyZWN0aW9uIG9mIFRJRkYgc3Vic2FtcGxpbmcgdmFsdWVzIGZhaWxlZCIpOworCQkJCQkJCXJldHVybigxKTsKKwkJCQkJCX0KKwkJCQkJCUpQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZ1NraXAoZGF0YSwxKTsKKwkJCQkJfQorCQkJCQlpZiAoKChwaCE9MSkmJihwaCE9MikmJihwaCE9NCkpfHwoKHB2IT0xKSYmKHB2IT0yKSYmKHB2IT00KSkpCisJCQkJCXsKKwkJCQkJCVRJRkZXYXJuaW5nRXh0KGRhdGEtPnRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLAorCQkJCQkJICAgICJTdWJzYW1wbGluZyB2YWx1ZXMgaW5zaWRlIEpQRUcgY29tcHJlc3NlZCBkYXRhIGhhdmUgbm8gVElGRiBlcXVpdmFsZW50LCBhdXRvLWNvcnJlY3Rpb24gb2YgVElGRiBzdWJzYW1wbGluZyB2YWx1ZXMgZmFpbGVkIik7CisJCQkJCQlyZXR1cm4oMSk7CisJCQkJCX0KKwkJCQkJaWYgKChwaCE9ZGF0YS0+dGlmLT50aWZfZGlyLnRkX3ljYmNyc3Vic2FtcGxpbmdbMF0pfHwocHYhPWRhdGEtPnRpZi0+dGlmX2Rpci50ZF95Y2JjcnN1YnNhbXBsaW5nWzFdKSkKKwkJCQkJeworCQkJCQkJVElGRldhcm5pbmdFeHQoZGF0YS0+dGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsCisJCQkJCQkgICAgIkF1dG8tY29ycmVjdGVkIGZvcm1lciBUSUZGIHN1YnNhbXBsaW5nIHZhbHVlcyBbJWQsJWRdIHRvIG1hdGNoIHN1YnNhbXBsaW5nIHZhbHVlcyBpbnNpZGUgSlBFRyBjb21wcmVzc2VkIGRhdGEgWyVkLCVkXSIsCisJCQkJCQkgICAgKGludClkYXRhLT50aWYtPnRpZl9kaXIudGRfeWNiY3JzdWJzYW1wbGluZ1swXSwKKwkJCQkJCSAgICAoaW50KWRhdGEtPnRpZi0+dGlmX2Rpci50ZF95Y2JjcnN1YnNhbXBsaW5nWzFdLAorCQkJCQkJICAgIChpbnQpcGgsKGludClwdik7CisJCQkJCQlkYXRhLT50aWYtPnRpZl9kaXIudGRfeWNiY3JzdWJzYW1wbGluZ1swXT1waDsKKwkJCQkJCWRhdGEtPnRpZi0+dGlmX2Rpci50ZF95Y2JjcnN1YnNhbXBsaW5nWzFdPXB2OworCQkJCQl9CisJCQkJfQorCQkJCXJldHVybigxKTsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuKDApOworCQl9CisJfQorfQorCitzdGF0aWMgaW50CitKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdSZWFkQnl0ZShzdHJ1Y3QgSlBFR0ZpeHVwVGFnc1N1YnNhbXBsaW5nRGF0YSogZGF0YSwgdWludDgqIHJlc3VsdCkKK3sKKwlpZiAoZGF0YS0+YnVmZmVyYnl0ZXNsZWZ0PT0wKQorCXsKKwkJdWludDMyIG07CisJCWlmIChkYXRhLT5maWxlYnl0ZXNsZWZ0PT0wKQorCQkJcmV0dXJuKDApOworCQlpZiAoIWRhdGEtPmZpbGVwb3NpdGlvbmVkKQorCQl7CisJCQlUSUZGU2Vla0ZpbGUoZGF0YS0+dGlmLGRhdGEtPmZpbGVvZmZzZXQsU0VFS19TRVQpOworCQkJZGF0YS0+ZmlsZXBvc2l0aW9uZWQ9MTsKKwkJfQorCQltPWRhdGEtPmJ1ZmZlcnNpemU7CisJCWlmICgodWludDY0KW0+ZGF0YS0+ZmlsZWJ5dGVzbGVmdCkKKwkJCW09KHVpbnQzMilkYXRhLT5maWxlYnl0ZXNsZWZ0OworCQlhc3NlcnQobTwweDgwMDAwMDAwVUwpOworCQlpZiAoVElGRlJlYWRGaWxlKGRhdGEtPnRpZixkYXRhLT5idWZmZXIsKHRtc2l6ZV90KW0pIT0odG1zaXplX3QpbSkKKwkJCXJldHVybigwKTsKKwkJZGF0YS0+YnVmZmVyY3VycmVudGJ5dGU9ZGF0YS0+YnVmZmVyOworCQlkYXRhLT5idWZmZXJieXRlc2xlZnQ9bTsKKwkJZGF0YS0+ZmlsZW9mZnNldCs9bTsKKwkJZGF0YS0+ZmlsZWJ5dGVzbGVmdC09bTsKKwl9CisJKnJlc3VsdD0qZGF0YS0+YnVmZmVyY3VycmVudGJ5dGU7CisJZGF0YS0+YnVmZmVyY3VycmVudGJ5dGUrKzsKKwlkYXRhLT5idWZmZXJieXRlc2xlZnQtLTsKKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyBpbnQKK0pQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZ1JlYWRXb3JkKHN0cnVjdCBKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmdEYXRhKiBkYXRhLCB1aW50MTYqIHJlc3VsdCkKK3sKKwl1aW50OCBtYTsKKwl1aW50OCBtYjsKKwlpZiAoIUpQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZ1JlYWRCeXRlKGRhdGEsJm1hKSkKKwkJcmV0dXJuKDApOworCWlmICghSlBFR0ZpeHVwVGFnc1N1YnNhbXBsaW5nUmVhZEJ5dGUoZGF0YSwmbWIpKQorCQlyZXR1cm4oMCk7CisJKnJlc3VsdD0obWE8PDgpfG1iOworCXJldHVybigxKTsKK30KKworc3RhdGljIHZvaWQKK0pQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZ1NraXAoc3RydWN0IEpQRUdGaXh1cFRhZ3NTdWJzYW1wbGluZ0RhdGEqIGRhdGEsIHVpbnQxNiBza2lwbGVuZ3RoKQoreworCWlmICgodWludDMyKXNraXBsZW5ndGg8PWRhdGEtPmJ1ZmZlcmJ5dGVzbGVmdCkKKwl7CisJCWRhdGEtPmJ1ZmZlcmN1cnJlbnRieXRlKz1za2lwbGVuZ3RoOworCQlkYXRhLT5idWZmZXJieXRlc2xlZnQtPXNraXBsZW5ndGg7CisJfQorCWVsc2UKKwl7CisJCXVpbnQxNiBtOworCQltPXNraXBsZW5ndGgtZGF0YS0+YnVmZmVyYnl0ZXNsZWZ0OworCQlpZiAobTw9ZGF0YS0+ZmlsZWJ5dGVzbGVmdCkKKwkJeworCQkJZGF0YS0+YnVmZmVyYnl0ZXNsZWZ0PTA7CisJCQlkYXRhLT5maWxlb2Zmc2V0Kz1tOworCQkJZGF0YS0+ZmlsZWJ5dGVzbGVmdC09bTsKKwkJCWRhdGEtPmZpbGVwb3NpdGlvbmVkPTA7CisJCX0KKwkJZWxzZQorCQl7CisJCQlkYXRhLT5idWZmZXJieXRlc2xlZnQ9MDsKKwkJCWRhdGEtPmZpbGVieXRlc2xlZnQ9MDsKKwkJfQorCX0KK30KKworI2VuZGlmCisKKworc3RhdGljIGludAorSlBFR1NldHVwRGVjb2RlKFRJRkYqIHRpZikKK3sKKwlKUEVHU3RhdGUqIHNwID0gSlN0YXRlKHRpZik7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCisjaWYgZGVmaW5lZChKUEVHX0RVQUxfTU9ERV84XzEyKSAmJiAhZGVmaW5lZChUSUZGSW5pdEpQRUcpCisgICAgICAgIGlmKCB0aWYtPnRpZl9kaXIudGRfYml0c3BlcnNhbXBsZSA9PSAxMiApCisgICAgICAgICAgICByZXR1cm4gVElGRlJlSW5pdEpQRUdfMTIoIHRpZiwgQ09NUFJFU1NJT05fSlBFRywgMCApOworI2VuZGlmCisKKwlKUEVHSW5pdGlhbGl6ZUxpYkpQRUcoIHRpZiwgVFJVRSApOworCisJYXNzZXJ0KHNwICE9IE5VTEwpOworCWFzc2VydChzcC0+Y2luZm8uY29tbS5pc19kZWNvbXByZXNzb3IpOworCisJLyogUmVhZCBKUEVHVGFibGVzIGlmIGl0IGlzIHByZXNlbnQgKi8KKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9KUEVHVEFCTEVTKSkgeworCQlUSUZGanBlZ190YWJsZXNfc3JjKHNwLCB0aWYpOworCQlpZihUSUZGanBlZ19yZWFkX2hlYWRlcihzcCxGQUxTRSkgIT0gSlBFR19IRUFERVJfVEFCTEVTX09OTFkpIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCAiSlBFR1NldHVwRGVjb2RlIiwgIkJvZ3VzIEpQRUdUYWJsZXMgZmllbGQiKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CisKKwkvKiBHcmFiIHBhcmFtZXRlcnMgdGhhdCBhcmUgc2FtZSBmb3IgYWxsIHN0cmlwcy90aWxlcyAqLworCXNwLT5waG90b21ldHJpYyA9IHRkLT50ZF9waG90b21ldHJpYzsKKwlzd2l0Y2ggKHNwLT5waG90b21ldHJpYykgeworCWNhc2UgUEhPVE9NRVRSSUNfWUNCQ1I6CisJCXNwLT5oX3NhbXBsaW5nID0gdGQtPnRkX3ljYmNyc3Vic2FtcGxpbmdbMF07CisJCXNwLT52X3NhbXBsaW5nID0gdGQtPnRkX3ljYmNyc3Vic2FtcGxpbmdbMV07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFRJRkYgNi4wIGZvcmJpZHMgc3Vic2FtcGxpbmcgb2YgYWxsIG90aGVyIGNvbG9yIHNwYWNlcyAqLworCQlzcC0+aF9zYW1wbGluZyA9IDE7CisJCXNwLT52X3NhbXBsaW5nID0gMTsKKwkJYnJlYWs7CisJfQorCisJLyogU2V0IHVwIGZvciByZWFkaW5nIG5vcm1hbCBkYXRhICovCisJVElGRmpwZWdfZGF0YV9zcmMoc3AsIHRpZik7CisJdGlmLT50aWZfcG9zdGRlY29kZSA9IF9USUZGTm9Qb3N0RGVjb2RlOyAvKiBvdmVycmlkZSBieXRlIHN3YXBwaW5nICovCisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIFNldCB1cCBmb3IgZGVjb2RpbmcgYSBzdHJpcCBvciB0aWxlLgorICovCisvKkFSR1NVU0VEKi8gc3RhdGljIGludAorSlBFR1ByZURlY29kZShUSUZGKiB0aWYsIHVpbnQxNiBzKQoreworCUpQRUdTdGF0ZSAqc3AgPSBKU3RhdGUodGlmKTsKKwlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiSlBFR1ByZURlY29kZSI7CisJdWludDMyIHNlZ21lbnRfd2lkdGgsIHNlZ21lbnRfaGVpZ2h0OworCWludCBkb3duc2FtcGxlZF9vdXRwdXQ7CisJaW50IGNpOworCisJYXNzZXJ0KHNwICE9IE5VTEwpOworICAKKwlpZiAoc3AtPmNpbmZvLmNvbW0uaXNfZGVjb21wcmVzc29yID09IDApCisJeworCQl0aWYtPnRpZl9zZXR1cGRlY29kZSggdGlmICk7CisJfQorICAKKwlhc3NlcnQoc3AtPmNpbmZvLmNvbW0uaXNfZGVjb21wcmVzc29yKTsKKwkvKgorCSAqIFJlc2V0IGRlY29kZXIgc3RhdGUgZnJvbSBhbnkgcHJldmlvdXMgc3RyaXAvdGlsZSwKKwkgKiBpbiBjYXNlIGFwcGxpY2F0aW9uIGRpZG4ndCByZWFkIHRoZSB3aG9sZSBzdHJpcC4KKwkgKi8KKwlpZiAoIVRJRkZqcGVnX2Fib3J0KHNwKSkKKwkJcmV0dXJuICgwKTsKKwkvKgorCSAqIFJlYWQgdGhlIGhlYWRlciBmb3IgdGhpcyBzdHJpcC90aWxlLgorCSAqLworICAgICAgICAKKwlpZiAoVElGRmpwZWdfcmVhZF9oZWFkZXIoc3AsIFRSVUUpICE9IEpQRUdfSEVBREVSX09LKQorCQlyZXR1cm4gKDApOworCisgICAgICAgIHRpZi0+dGlmX3Jhd2NwID0gKHVpbnQ4Kikgc3AtPnNyYy5uZXh0X2lucHV0X2J5dGU7CisgICAgICAgIHRpZi0+dGlmX3Jhd2NjID0gc3AtPnNyYy5ieXRlc19pbl9idWZmZXI7CisKKwkvKgorCSAqIENoZWNrIGltYWdlIHBhcmFtZXRlcnMgYW5kIHNldCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMuCisJICovCisJc2VnbWVudF93aWR0aCA9IHRkLT50ZF9pbWFnZXdpZHRoOworCXNlZ21lbnRfaGVpZ2h0ID0gdGQtPnRkX2ltYWdlbGVuZ3RoIC0gdGlmLT50aWZfcm93OworCWlmIChpc1RpbGVkKHRpZikpIHsKKyAgICAgICAgICAgICAgICBzZWdtZW50X3dpZHRoID0gdGQtPnRkX3RpbGV3aWR0aDsKKyAgICAgICAgICAgICAgICBzZWdtZW50X2hlaWdodCA9IHRkLT50ZF90aWxlbGVuZ3RoOworCQlzcC0+Ynl0ZXNwZXJsaW5lID0gVElGRlRpbGVSb3dTaXplKHRpZik7CisJfSBlbHNlIHsKKwkJaWYgKHNlZ21lbnRfaGVpZ2h0ID4gdGQtPnRkX3Jvd3NwZXJzdHJpcCkKKwkJCXNlZ21lbnRfaGVpZ2h0ID0gdGQtPnRkX3Jvd3NwZXJzdHJpcDsKKwkJc3AtPmJ5dGVzcGVybGluZSA9IFRJRkZTY2FubGluZVNpemUodGlmKTsKKwl9CisJaWYgKHRkLT50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX1NFUEFSQVRFICYmIHMgPiAwKSB7CisJCS8qCisJCSAqIEZvciBQQyAyLCBzY2FsZSBkb3duIHRoZSBleHBlY3RlZCBzdHJpcC90aWxlIHNpemUKKwkJICogdG8gbWF0Y2ggYSBkb3duc2FtcGxlZCBjb21wb25lbnQKKwkJICovCisJCXNlZ21lbnRfd2lkdGggPSBUSUZGaG93bWFueV8zMihzZWdtZW50X3dpZHRoLCBzcC0+aF9zYW1wbGluZyk7CisJCXNlZ21lbnRfaGVpZ2h0ID0gVElGRmhvd21hbnlfMzIoc2VnbWVudF9oZWlnaHQsIHNwLT52X3NhbXBsaW5nKTsKKwl9CisJaWYgKHNwLT5jaW5mby5kLmltYWdlX3dpZHRoIDwgc2VnbWVudF93aWR0aCB8fAorCSAgICBzcC0+Y2luZm8uZC5pbWFnZV9oZWlnaHQgPCBzZWdtZW50X2hlaWdodCkgeworCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgICAgIkltcHJvcGVyIEpQRUcgc3RyaXAvdGlsZSBzaXplLCAiCisJCQkgICAgICAgImV4cGVjdGVkICVkeCVkLCBnb3QgJWR4JWQiLAorCQkJICAgICAgIHNlZ21lbnRfd2lkdGgsIHNlZ21lbnRfaGVpZ2h0LAorCQkJICAgICAgIHNwLT5jaW5mby5kLmltYWdlX3dpZHRoLAorCQkJICAgICAgIHNwLT5jaW5mby5kLmltYWdlX2hlaWdodCk7CisJfSAKKwlpZiAoc3AtPmNpbmZvLmQuaW1hZ2Vfd2lkdGggPiBzZWdtZW50X3dpZHRoIHx8CisJICAgIHNwLT5jaW5mby5kLmltYWdlX2hlaWdodCA+IHNlZ21lbnRfaGVpZ2h0KSB7CisJCS8qCisJCSAqIFRoaXMgY2FzZSBjb3VsZCBiZSBkYW5nZXJvdXMsIGlmIHRoZSBzdHJpcCBvciB0aWxlIHNpemUgaGFzCisJCSAqIGJlZW4gcmVwb3J0ZWQgYXMgbGVzcyB0aGFuIHRoZSBhbW91bnQgb2YgZGF0YSBqcGVnIHdpbGwKKwkJICogcmV0dXJuLCBzb21lIHBvdGVudGlhbCBzZWN1cml0eSBpc3N1ZXMgYXJpc2UuIENhdGNoIHRoaXMKKwkJICogY2FzZSBhbmQgZXJyb3Igb3V0LgorCQkgKi8KKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAgIkpQRUcgc3RyaXAvdGlsZSBzaXplIGV4Y2VlZHMgZXhwZWN0ZWQgZGltZW5zaW9ucywiCisJCQkgICAgICIgZXhwZWN0ZWQgJWR4JWQsIGdvdCAlZHglZCIsCisJCQkgICAgIHNlZ21lbnRfd2lkdGgsIHNlZ21lbnRfaGVpZ2h0LAorCQkJICAgICBzcC0+Y2luZm8uZC5pbWFnZV93aWR0aCwgc3AtPmNpbmZvLmQuaW1hZ2VfaGVpZ2h0KTsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKHNwLT5jaW5mby5kLm51bV9jb21wb25lbnRzICE9CisJICAgICh0ZC0+dGRfcGxhbmFyY29uZmlnID09IFBMQU5BUkNPTkZJR19DT05USUcgPworCSAgICAgdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCA6IDEpKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJJbXByb3BlciBKUEVHIGNvbXBvbmVudCBjb3VudCIpOworCQlyZXR1cm4gKDApOworCX0KKyNpZmRlZiBKUEVHX0xJQl9NSzEKKwlpZiAoMTIgIT0gdGQtPnRkX2JpdHNwZXJzYW1wbGUgJiYgOCAhPSB0ZC0+dGRfYml0c3BlcnNhbXBsZSkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiSW1wcm9wZXIgSlBFRyBkYXRhIHByZWNpc2lvbiIpOworCQlyZXR1cm4gKDApOworCX0KKwlzcC0+Y2luZm8uZC5kYXRhX3ByZWNpc2lvbiA9IHRkLT50ZF9iaXRzcGVyc2FtcGxlOworCXNwLT5jaW5mby5kLmJpdHNfaW5fanNhbXBsZSA9IHRkLT50ZF9iaXRzcGVyc2FtcGxlOworI2Vsc2UKKwlpZiAoc3AtPmNpbmZvLmQuZGF0YV9wcmVjaXNpb24gIT0gdGQtPnRkX2JpdHNwZXJzYW1wbGUpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIkltcHJvcGVyIEpQRUcgZGF0YSBwcmVjaXNpb24iKTsKKwkJcmV0dXJuICgwKTsKKwl9CisjZW5kaWYKKwlpZiAodGQtPnRkX3BsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfQ09OVElHKSB7CisJCS8qIENvbXBvbmVudCAwIHNob3VsZCBoYXZlIGV4cGVjdGVkIHNhbXBsaW5nIGZhY3RvcnMgKi8KKwkJaWYgKHNwLT5jaW5mby5kLmNvbXBfaW5mb1swXS5oX3NhbXBfZmFjdG9yICE9IHNwLT5oX3NhbXBsaW5nIHx8CisJCSAgICBzcC0+Y2luZm8uZC5jb21wX2luZm9bMF0udl9zYW1wX2ZhY3RvciAhPSBzcC0+dl9zYW1wbGluZykgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkgICAgICAgIkltcHJvcGVyIEpQRUcgc2FtcGxpbmcgZmFjdG9ycyAlZCwlZFxuIgorCQkJCSAgICAgICAiQXBwYXJlbnRseSBzaG91bGQgYmUgJWQsJWQuIiwKKwkJCQkgICAgICAgc3AtPmNpbmZvLmQuY29tcF9pbmZvWzBdLmhfc2FtcF9mYWN0b3IsCisJCQkJICAgICAgIHNwLT5jaW5mby5kLmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yLAorCQkJCSAgICAgICBzcC0+aF9zYW1wbGluZywgc3AtPnZfc2FtcGxpbmcpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQkvKiBSZXN0IHNob3VsZCBoYXZlIHNhbXBsaW5nIGZhY3RvcnMgMSwxICovCisJCWZvciAoY2kgPSAxOyBjaSA8IHNwLT5jaW5mby5kLm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisJCQlpZiAoc3AtPmNpbmZvLmQuY29tcF9pbmZvW2NpXS5oX3NhbXBfZmFjdG9yICE9IDEgfHwKKwkJCSAgICBzcC0+Y2luZm8uZC5jb21wX2luZm9bY2ldLnZfc2FtcF9mYWN0b3IgIT0gMSkgeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJJbXByb3BlciBKUEVHIHNhbXBsaW5nIGZhY3RvcnMiKTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogUEMgMidzIHNpbmdsZSBjb21wb25lbnQgc2hvdWxkIGhhdmUgc2FtcGxpbmcgZmFjdG9ycyAxLDEgKi8KKwkJaWYgKHNwLT5jaW5mby5kLmNvbXBfaW5mb1swXS5oX3NhbXBfZmFjdG9yICE9IDEgfHwKKwkJICAgIHNwLT5jaW5mby5kLmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yICE9IDEpIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJJbXByb3BlciBKUEVHIHNhbXBsaW5nIGZhY3RvcnMiKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CisJZG93bnNhbXBsZWRfb3V0cHV0ID0gRkFMU0U7CisJaWYgKHRkLT50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX0NPTlRJRyAmJgorCSAgICBzcC0+cGhvdG9tZXRyaWMgPT0gUEhPVE9NRVRSSUNfWUNCQ1IgJiYKKwkgICAgc3AtPmpwZWdjb2xvcm1vZGUgPT0gSlBFR0NPTE9STU9ERV9SR0IpIHsKKwkJLyogQ29udmVydCBZQ2JDciB0byBSR0IgKi8KKwkJc3AtPmNpbmZvLmQuanBlZ19jb2xvcl9zcGFjZSA9IEpDU19ZQ2JDcjsKKwkJc3AtPmNpbmZvLmQub3V0X2NvbG9yX3NwYWNlID0gSkNTX1JHQjsKKwl9IGVsc2UgeworCQkvKiBTdXBwcmVzcyBjb2xvcnNwYWNlIGhhbmRsaW5nICovCisJCXNwLT5jaW5mby5kLmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfVU5LTk9XTjsKKwkJc3AtPmNpbmZvLmQub3V0X2NvbG9yX3NwYWNlID0gSkNTX1VOS05PV047CisJCWlmICh0ZC0+dGRfcGxhbmFyY29uZmlnID09IFBMQU5BUkNPTkZJR19DT05USUcgJiYKKwkJICAgIChzcC0+aF9zYW1wbGluZyAhPSAxIHx8IHNwLT52X3NhbXBsaW5nICE9IDEpKQorCQkJZG93bnNhbXBsZWRfb3V0cHV0ID0gVFJVRTsKKwkJLyogWFhYIHdoYXQgYWJvdXQgdXAtc2FtcGxpbmc/ICovCisJfQorCWlmIChkb3duc2FtcGxlZF9vdXRwdXQpIHsKKwkJLyogTmVlZCB0byB1c2UgcmF3LWRhdGEgaW50ZXJmYWNlIHRvIGxpYmpwZWcgKi8KKwkJc3AtPmNpbmZvLmQucmF3X2RhdGFfb3V0ID0gVFJVRTsKKyNpZiBKUEVHX0xJQl9WRVJTSU9OID49IDcwCisJCXNwLT5jaW5mby5kLmRvX2ZhbmN5X3Vwc2FtcGxpbmcgPSBGQUxTRTsKKyNlbmRpZiAvKiBKUEVHX0xJQl9WRVJTSU9OID49IDcwICovCisJCXRpZi0+dGlmX2RlY29kZXJvdyA9IERlY29kZVJvd0Vycm9yOworCQl0aWYtPnRpZl9kZWNvZGVzdHJpcCA9IEpQRUdEZWNvZGVSYXc7CisJCXRpZi0+dGlmX2RlY29kZXRpbGUgPSBKUEVHRGVjb2RlUmF3OworCX0gZWxzZSB7CisJCS8qIFVzZSBub3JtYWwgaW50ZXJmYWNlIHRvIGxpYmpwZWcgKi8KKwkJc3AtPmNpbmZvLmQucmF3X2RhdGFfb3V0ID0gRkFMU0U7CisJCXRpZi0+dGlmX2RlY29kZXJvdyA9IEpQRUdEZWNvZGU7CisJCXRpZi0+dGlmX2RlY29kZXN0cmlwID0gSlBFR0RlY29kZTsKKwkJdGlmLT50aWZfZGVjb2RldGlsZSA9IEpQRUdEZWNvZGU7ICAKKwl9CisJLyogU3RhcnQgSlBFRyBkZWNvbXByZXNzb3IgKi8KKwlpZiAoIVRJRkZqcGVnX3N0YXJ0X2RlY29tcHJlc3Moc3ApKQorCQlyZXR1cm4gKDApOworCS8qIEFsbG9jYXRlIGRvd25zYW1wbGVkLWRhdGEgYnVmZmVycyBpZiBuZWVkZWQgKi8KKwlpZiAoZG93bnNhbXBsZWRfb3V0cHV0KSB7CisJCWlmICghYWxsb2NfZG93bnNhbXBsZWRfYnVmZmVycyh0aWYsIHNwLT5jaW5mby5kLmNvbXBfaW5mbywKKwkJCQkJICAgICAgIHNwLT5jaW5mby5kLm51bV9jb21wb25lbnRzKSkKKwkJCXJldHVybiAoMCk7CisJCXNwLT5zY2FuY291bnQgPSBEQ1RTSVpFOwkvKiBtYXJrIGJ1ZmZlciBlbXB0eSAqLworCX0KKwlyZXR1cm4gKDEpOworfQorCisvKgorICogRGVjb2RlIGEgY2h1bmsgb2YgcGl4ZWxzLgorICogIlN0YW5kYXJkIiBjYXNlOiByZXR1cm5lZCBkYXRhIGlzIG5vdCBkb3duc2FtcGxlZC4KKyAqLworI2lmICFKUEVHX0xJQl9NSzFfT1JfMTJCSVQKK3N0YXRpYyBpbnQKK0pQRUdEZWNvZGUoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBjYywgdWludDE2IHMpCit7CisJSlBFR1N0YXRlICpzcCA9IEpTdGF0ZSh0aWYpOworCXRtc2l6ZV90IG5yb3dzOworCSh2b2lkKSBzOworCisgICAgICAgIC8qCisgICAgICAgICoqIFVwZGF0ZSBhdmFpbGFibGUgaW5mb3JtYXRpb24sIGJ1ZmZlciBtYXkgaGF2ZSBiZWVuIHJlZmlsbGVkCisgICAgICAgICoqIGJldHdlZW4gZGVjb2RlIHJlcXVlc3RzCisgICAgICAgICovCisJc3AtPnNyYy5uZXh0X2lucHV0X2J5dGUgPSAoY29uc3QgSk9DVEVUKikgdGlmLT50aWZfcmF3Y3A7CisJc3AtPnNyYy5ieXRlc19pbl9idWZmZXIgPSAoc2l6ZV90KSB0aWYtPnRpZl9yYXdjYzsKKworICAgICAgICBpZiggc3AtPmJ5dGVzcGVybGluZSA9PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgCisJbnJvd3MgPSBjYyAvIHNwLT5ieXRlc3BlcmxpbmU7CisJaWYgKGNjICUgc3AtPmJ5dGVzcGVybGluZSkKKwkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgdGlmLT50aWZfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJhY3Rpb25hbCBzY2FubGluZSBub3QgcmVhZCIpOworCisJaWYoIG5yb3dzID4gKHRtc2l6ZV90KSBzcC0+Y2luZm8uZC5pbWFnZV9oZWlnaHQgKQorCQlucm93cyA9IHNwLT5jaW5mby5kLmltYWdlX2hlaWdodDsKKworCS8qIGRhdGEgaXMgZXhwZWN0ZWQgdG8gYmUgcmVhZCBpbiBtdWx0aXBsZXMgb2YgYSBzY2FubGluZSAqLworCWlmIChucm93cykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIEluIHRoZSBsaWJqcGVnNmItOWEgOGJpdCBjYXNlLiAgV2UgcmVhZCBkaXJlY3RseSBpbnRvCisgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgVElGRiBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIEpTQU1QUk9XIGJ1ZnB0ciA9IChKU0FNUFJPVylidWY7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChUSUZGanBlZ19yZWFkX3NjYW5saW5lcyhzcCwgJmJ1ZnB0ciwgMSkgIT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgKyt0aWYtPnRpZl9yb3c7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYgKz0gc3AtPmJ5dGVzcGVybGluZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNjIC09IHNwLT5ieXRlc3BlcmxpbmU7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1ucm93cyA+IDApOworICAgICAgICB9CisKKyAgICAgICAgLyogVXBkYXRlIGluZm9ybWF0aW9uIG9uIGNvbnN1bWVkIGRhdGEgKi8KKyAgICAgICAgdGlmLT50aWZfcmF3Y3AgPSAodWludDgqKSBzcC0+c3JjLm5leHRfaW5wdXRfYnl0ZTsKKyAgICAgICAgdGlmLT50aWZfcmF3Y2MgPSBzcC0+c3JjLmJ5dGVzX2luX2J1ZmZlcjsKKyAgICAgICAgICAgICAgICAKKwkvKiBDbG9zZSBkb3duIHRoZSBkZWNvbXByZXNzb3IgaWYgd2UndmUgZmluaXNoZWQgdGhlIHN0cmlwIG9yIHRpbGUuICovCisJcmV0dXJuIHNwLT5jaW5mby5kLm91dHB1dF9zY2FubGluZSA8IHNwLT5jaW5mby5kLm91dHB1dF9oZWlnaHQKKyAgICAgICAgICAgICAgICB8fCBUSUZGanBlZ19maW5pc2hfZGVjb21wcmVzcyhzcCk7Cit9CisjZW5kaWYgLyogIUpQRUdfTElCX01LMV9PUl8xMkJJVCAqLworCisjaWYgSlBFR19MSUJfTUsxX09SXzEyQklUCisvKkFSR1NVU0VEKi8gc3RhdGljIGludAorSlBFR0RlY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IGNjLCB1aW50MTYgcykKK3sKKwlKUEVHU3RhdGUgKnNwID0gSlN0YXRlKHRpZik7CisJdG1zaXplX3QgbnJvd3M7CisJKHZvaWQpIHM7CisKKyAgICAgICAgLyoKKyAgICAgICAgKiogVXBkYXRlIGF2YWlsYWJsZSBpbmZvcm1hdGlvbiwgYnVmZmVyIG1heSBoYXZlIGJlZW4gcmVmaWxsZWQKKyAgICAgICAgKiogYmV0d2VlbiBkZWNvZGUgcmVxdWVzdHMKKyAgICAgICAgKi8KKwlzcC0+c3JjLm5leHRfaW5wdXRfYnl0ZSA9IChjb25zdCBKT0NURVQqKSB0aWYtPnRpZl9yYXdjcDsKKwlzcC0+c3JjLmJ5dGVzX2luX2J1ZmZlciA9IChzaXplX3QpIHRpZi0+dGlmX3Jhd2NjOworCisgICAgICAgIGlmKCBzcC0+Ynl0ZXNwZXJsaW5lID09IDAgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAKKwlucm93cyA9IGNjIC8gc3AtPmJ5dGVzcGVybGluZTsKKwlpZiAoY2MgJSBzcC0+Ynl0ZXNwZXJsaW5lKQorCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCB0aWYtPnRpZl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcmFjdGlvbmFsIHNjYW5saW5lIG5vdCByZWFkIik7CisKKwlpZiggbnJvd3MgPiAodG1zaXplX3QpIHNwLT5jaW5mby5kLmltYWdlX2hlaWdodCApCisJCW5yb3dzID0gc3AtPmNpbmZvLmQuaW1hZ2VfaGVpZ2h0OworCisJLyogZGF0YSBpcyBleHBlY3RlZCB0byBiZSByZWFkIGluIG11bHRpcGxlcyBvZiBhIHNjYW5saW5lICovCisJaWYgKG5yb3dzKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgSlNBTVBST1cgbGluZV93b3JrX2J1ZiA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEZvciA2Qiwgb25seSB1c2UgdGVtcG9yYXJ5IGJ1ZmZlciBmb3IgMTIgYml0IGltYWdlcnkuCisgICAgICAgICAgICAgICAgICogRm9yIE1rMSBhbHdheXMgdXNlIGl0LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmKCBzcC0+Y2luZm8uZC5kYXRhX3ByZWNpc2lvbiA9PSAxMiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZV93b3JrX2J1ZiA9IChKU0FNUFJPVykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RJRkZtYWxsb2Moc2l6ZW9mKHNob3J0KSAqIHNwLT5jaW5mby5kLm91dHB1dF93aWR0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNwLT5jaW5mby5kLm51bV9jb21wb25lbnRzICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICBpZiggbGluZV93b3JrX2J1ZiAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSW4gdGhlIE1LMSBjYXNlLCB3ZSBhd2F5cyByZWFkIGludG8gYSAxNmJpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJ1ZmZlciwgYW5kIHRoZW4gcGFjayBkb3duIHRvIDEyYml0IG9yIDhiaXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSW4gNkIgY2FzZSB3ZSBvbmx5IHJlYWQgaW50byAxNiBiaXQgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZm9yIDEyYml0IGRhdGEsIHdoaWNoIHdlIG5lZWQgdG8gcmVwYWNrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChUSUZGanBlZ19yZWFkX3NjYW5saW5lcyhzcCwgJmxpbmVfd29ya19idWYsIDEpICE9IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNwLT5jaW5mby5kLmRhdGFfcHJlY2lzaW9uID09IDEyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWVfcGFpcnMgPSAoc3AtPmNpbmZvLmQub3V0cHV0X3dpZHRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzcC0+Y2luZm8uZC5udW1fY29tcG9uZW50cykgLyAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlQYWlyOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGlQYWlyID0gMDsgaVBhaXIgPCB2YWx1ZV9wYWlyczsgaVBhaXIrKyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dF9wdHIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQgY2hhciAqKSBidWYpICsgaVBhaXIgKiAzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUExFICppbl9wdHIgPSBsaW5lX3dvcmtfYnVmICsgaVBhaXIgKiAyOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9wdHJbMF0gPSAoaW5fcHRyWzBdICYgMHhmZjApID4+IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9wdHJbMV0gPSAoKGluX3B0clswXSAmIDB4ZikgPDwgNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoaW5fcHRyWzFdICYgMHhmMDApID4+IDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfcHRyWzJdID0gKChpbl9wdHJbMV0gJiAweGZmKSA+PiAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggc3AtPmNpbmZvLmQuZGF0YV9wcmVjaXNpb24gPT0gOCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlX2NvdW50ID0gKHNwLT5jaW5mby5kLm91dHB1dF93aWR0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3AtPmNpbmZvLmQubnVtX2NvbXBvbmVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlWYWx1ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBpVmFsdWUgPSAwOyBpVmFsdWUgPCB2YWx1ZV9jb3VudDsgaVZhbHVlKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGNoYXIgKikgYnVmKVtpVmFsdWVdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX3dvcmtfYnVmW2lWYWx1ZV0gJiAweGZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICsrdGlmLT50aWZfcm93OworICAgICAgICAgICAgICAgICAgICAgICBidWYgKz0gc3AtPmJ5dGVzcGVybGluZTsKKyAgICAgICAgICAgICAgICAgICAgICAgY2MgLT0gc3AtPmJ5dGVzcGVybGluZTsKKyAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbnJvd3MgPiAwKTsKKworICAgICAgICAgICAgICAgaWYoIGxpbmVfd29ya19idWYgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgIF9USUZGZnJlZSggbGluZV93b3JrX2J1ZiApOworICAgICAgICB9CisKKyAgICAgICAgLyogVXBkYXRlIGluZm9ybWF0aW9uIG9uIGNvbnN1bWVkIGRhdGEgKi8KKyAgICAgICAgdGlmLT50aWZfcmF3Y3AgPSAodWludDgqKSBzcC0+c3JjLm5leHRfaW5wdXRfYnl0ZTsKKyAgICAgICAgdGlmLT50aWZfcmF3Y2MgPSBzcC0+c3JjLmJ5dGVzX2luX2J1ZmZlcjsKKyAgICAgICAgICAgICAgICAKKwkvKiBDbG9zZSBkb3duIHRoZSBkZWNvbXByZXNzb3IgaWYgd2UndmUgZmluaXNoZWQgdGhlIHN0cmlwIG9yIHRpbGUuICovCisJcmV0dXJuIHNwLT5jaW5mby5kLm91dHB1dF9zY2FubGluZSA8IHNwLT5jaW5mby5kLm91dHB1dF9oZWlnaHQKKyAgICAgICAgICAgICAgICB8fCBUSUZGanBlZ19maW5pc2hfZGVjb21wcmVzcyhzcCk7Cit9CisjZW5kaWYgLyogSlBFR19MSUJfTUsxX09SXzEyQklUICovCisKKy8qQVJHU1VTRUQqLyBzdGF0aWMgaW50CitEZWNvZGVSb3dFcnJvcihUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IGNjLCB1aW50MTYgcykKKworeworICAgICh2b2lkKSBidWY7CisgICAgKHZvaWQpIGNjOworICAgICh2b2lkKSBzOworCisgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsICJUSUZGUmVhZFNjYW5saW5lIiwKKyAgICAgICAgICAgICAgICAgInNjYW5saW5lIG9yaWVudGVkIGFjY2VzcyBpcyBub3Qgc3VwcG9ydGVkIGZvciBkb3duc2FtcGxlZCBKUEVHIGNvbXByZXNzZWQgaW1hZ2VzLCBjb25zaWRlciBlbmFibGluZyBUSUZGX0pQRUdDT0xPUk1PREUgYXMgSlBFR0NPTE9STU9ERV9SR0IuIiApOworICAgIHJldHVybiAwOworfQorCisvKgorICogRGVjb2RlIGEgY2h1bmsgb2YgcGl4ZWxzLgorICogUmV0dXJuZWQgZGF0YSBpcyBkb3duc2FtcGxlZCBwZXIgc2FtcGxpbmcgZmFjdG9ycy4KKyAqLworLypBUkdTVVNFRCovIHN0YXRpYyBpbnQKK0pQRUdEZWNvZGVSYXcoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBjYywgdWludDE2IHMpCit7CisJSlBFR1N0YXRlICpzcCA9IEpTdGF0ZSh0aWYpOworCXRtc2l6ZV90IG5yb3dzOworCSh2b2lkKSBzOworCisJLyogZGF0YSBpcyBleHBlY3RlZCB0byBiZSByZWFkIGluIG11bHRpcGxlcyBvZiBhIHNjYW5saW5lICovCisJaWYgKCAobnJvd3MgPSBzcC0+Y2luZm8uZC5pbWFnZV9oZWlnaHQpICkgeworCisJCS8qIENiLENyIGJvdGggaGF2ZSBzYW1wbGluZyBmYWN0b3JzIDEsIHNvIHRoaXMgaXMgY29ycmVjdCAqLworCQlKRElNRU5TSU9OIGNsdW1wc19wZXJfbGluZSA9IHNwLT5jaW5mby5kLmNvbXBfaW5mb1sxXS5kb3duc2FtcGxlZF93aWR0aDsgICAgICAgICAgICAKKwkJaW50IHNhbXBsZXNfcGVyX2NsdW1wID0gc3AtPnNhbXBsZXNwZXJjbHVtcDsKKworI2lmIGRlZmluZWQoSlBFR19MSUJfTUsxX09SXzEyQklUKQorCQl1bnNpZ25lZCBzaG9ydCogdG1wYnVmID0gX1RJRkZtYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSAqCisJCQkJCQkgICAgIHNwLT5jaW5mby5kLm91dHB1dF93aWR0aCAqCisJCQkJCQkgICAgIHNwLT5jaW5mby5kLm51bV9jb21wb25lbnRzKTsKKwkJaWYodG1wYnVmPT1OVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgIkpQRUdEZWNvZGVSYXciLAorCQkJCSAgICAgIk91dCBvZiBtZW1vcnkiKTsKKwkJCXJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisJCWRvIHsKKwkJCWpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisJCQlpbnQgY2ksIGNsdW1wb2Zmc2V0OworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggY2MgPCBzcC0+Ynl0ZXNwZXJsaW5lICkgeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCAiSlBFR0RlY29kZVJhdyIsCisJCQkJCSAgICAgImFwcGxpY2F0aW9uIGJ1ZmZlciBub3QgbGFyZ2UgZW5vdWdoIGZvciBhbGwgZGF0YS4iKTsKKwkJCQlyZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCQkJLyogUmVsb2FkIGRvd25zYW1wbGVkLWRhdGEgYnVmZmVyIGlmIG5lZWRlZCAqLworCQkJaWYgKHNwLT5zY2FuY291bnQgPj0gRENUU0laRSkgeworCQkJCWludCBuID0gc3AtPmNpbmZvLmQubWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFOworCQkJCWlmIChUSUZGanBlZ19yZWFkX3Jhd19kYXRhKHNwLCBzcC0+ZHNfYnVmZmVyLCBuKSAhPSBuKQorCQkJCQlyZXR1cm4gKDApOworCQkJCXNwLT5zY2FuY291bnQgPSAwOworCQkJfQorCQkJLyoKKwkJCSAqIEZhc3Rlc3Qgd2F5IHRvIHVuc2VwYXJhdGUgZGF0YSBpcyB0byBtYWtlIG9uZSBwYXNzCisJCQkgKiBvdmVyIHRoZSBzY2FubGluZSBmb3IgZWFjaCByb3cgb2YgZWFjaCBjb21wb25lbnQuCisJCQkgKi8KKwkJCWNsdW1wb2Zmc2V0ID0gMDsgICAgLyogZmlyc3Qgc2FtcGxlIGluIGNsdW1wICovCisJCQlmb3IgKGNpID0gMCwgY29tcHB0ciA9IHNwLT5jaW5mby5kLmNvbXBfaW5mbzsKKwkJCSAgICAgY2kgPCBzcC0+Y2luZm8uZC5udW1fY29tcG9uZW50czsKKwkJCSAgICAgY2krKywgY29tcHB0cisrKSB7CisJCQkJaW50IGhzYW1wID0gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKwkJCQlpbnQgdnNhbXAgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworCQkJCWludCB5cG9zOworCisJCQkJZm9yICh5cG9zID0gMDsgeXBvcyA8IHZzYW1wOyB5cG9zKyspIHsKKwkJCQkJSlNBTVBMRSAqaW5wdHIgPSBzcC0+ZHNfYnVmZmVyW2NpXVtzcC0+c2NhbmNvdW50KnZzYW1wICsgeXBvc107CisJCQkJCUpESU1FTlNJT04gbmNsdW1wOworI2lmIGRlZmluZWQoSlBFR19MSUJfTUsxX09SXzEyQklUKQorCQkJCQlKU0FNUExFICpvdXRwdHIgPSAoSlNBTVBMRSopdG1wYnVmICsgY2x1bXBvZmZzZXQ7CisjZWxzZQorCQkJCQlKU0FNUExFICpvdXRwdHIgPSAoSlNBTVBMRSopYnVmICsgY2x1bXBvZmZzZXQ7CisJCQkJCWlmIChjYyA8ICh0bXNpemVfdCkgKGNsdW1wb2Zmc2V0ICsgc2FtcGxlc19wZXJfY2x1bXAqKGNsdW1wc19wZXJfbGluZS0xKSArIGhzYW1wKSkgeworCQkJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsICJKUEVHRGVjb2RlUmF3IiwKKwkJCQkJCQkgICAgICJhcHBsaWNhdGlvbiBidWZmZXIgbm90IGxhcmdlIGVub3VnaCBmb3IgYWxsIGRhdGEsIHBvc3NpYmxlIHN1YnNhbXBsaW5nIGlzc3VlIik7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorI2VuZGlmCisKKwkJCQkJaWYgKGhzYW1wID09IDEpIHsKKwkJCQkJCS8qIGZhc3QgcGF0aCBmb3IgYXQgbGVhc3QgQ2IgYW5kIENyICovCisJCQkJCQlmb3IgKG5jbHVtcCA9IGNsdW1wc19wZXJfbGluZTsgbmNsdW1wLS0gPiAwOyApIHsKKwkJCQkJCQlvdXRwdHJbMF0gPSAqaW5wdHIrKzsKKwkJCQkJCQlvdXRwdHIgKz0gc2FtcGxlc19wZXJfY2x1bXA7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpbnQgeHBvczsKKworCQkJCQkJLyogZ2VuZXJhbCBjYXNlICovCisJCQkJCQlmb3IgKG5jbHVtcCA9IGNsdW1wc19wZXJfbGluZTsgbmNsdW1wLS0gPiAwOyApIHsKKwkJCQkJCQlmb3IgKHhwb3MgPSAwOyB4cG9zIDwgaHNhbXA7IHhwb3MrKykKKwkJCQkJCQkJb3V0cHRyW3hwb3NdID0gKmlucHRyKys7CisJCQkJCQkJb3V0cHRyICs9IHNhbXBsZXNfcGVyX2NsdW1wOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWNsdW1wb2Zmc2V0ICs9IGhzYW1wOworCQkJCX0KKwkJCX0KKworI2lmIGRlZmluZWQoSlBFR19MSUJfTUsxX09SXzEyQklUKQorCQkJeworCQkJCWlmIChzcC0+Y2luZm8uZC5kYXRhX3ByZWNpc2lvbiA9PSA4KQorCQkJCXsKKwkJCQkJaW50IGk9MDsKKwkJCQkJaW50IGxlbiA9IHNwLT5jaW5mby5kLm91dHB1dF93aWR0aCAqIHNwLT5jaW5mby5kLm51bV9jb21wb25lbnRzOworCQkJCQlmb3IgKGk9MDsgaTxsZW47IGkrKykKKwkJCQkJeworCQkJCQkJKCh1bnNpZ25lZCBjaGFyKilidWYpW2ldID0gdG1wYnVmW2ldICYgMHhmZjsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeyAgICAgICAgIC8qIDEyLWJpdCAqLworCQkJCQlpbnQgdmFsdWVfcGFpcnMgPSAoc3AtPmNpbmZvLmQub3V0cHV0X3dpZHRoCisJCQkJCQkJICAgKiBzcC0+Y2luZm8uZC5udW1fY29tcG9uZW50cykgLyAyOworCQkJCQlpbnQgaVBhaXI7CisJCQkJCWZvciggaVBhaXIgPSAwOyBpUGFpciA8IHZhbHVlX3BhaXJzOyBpUGFpcisrICkKKwkJCQkJeworCQkJCQkJdW5zaWduZWQgY2hhciAqb3V0X3B0ciA9ICgodW5zaWduZWQgY2hhciAqKSBidWYpICsgaVBhaXIgKiAzOworCQkJCQkJSlNBTVBMRSAqaW5fcHRyID0gKEpTQU1QTEUgKikgKHRtcGJ1ZiArIGlQYWlyICogMik7CisJCQkJCQlvdXRfcHRyWzBdID0gKGluX3B0clswXSAmIDB4ZmYwKSA+PiA0OworCQkJCQkJb3V0X3B0clsxXSA9ICgoaW5fcHRyWzBdICYgMHhmKSA8PCA0KQorCQkJCQkJCXwgKChpbl9wdHJbMV0gJiAweGYwMCkgPj4gOCk7CisJCQkJCQlvdXRfcHRyWzJdID0gKChpbl9wdHJbMV0gJiAweGZmKSA+PiAwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKyNlbmRpZgorCisJCQlzcC0+c2NhbmNvdW50ICsrOworCQkJdGlmLT50aWZfcm93ICs9IHNwLT52X3NhbXBsaW5nOworCisJCQlidWYgKz0gc3AtPmJ5dGVzcGVybGluZTsKKwkJCWNjIC09IHNwLT5ieXRlc3BlcmxpbmU7CisKKwkJCW5yb3dzIC09IHNwLT52X3NhbXBsaW5nOworCQl9IHdoaWxlIChucm93cyA+IDApOworCisjaWYgZGVmaW5lZChKUEVHX0xJQl9NSzFfT1JfMTJCSVQpCisJCV9USUZGZnJlZSh0bXBidWYpOworI2VuZGlmCisKKwl9CisKKwkvKiBDbG9zZSBkb3duIHRoZSBkZWNvbXByZXNzb3IgaWYgZG9uZS4gKi8KKwlyZXR1cm4gc3AtPmNpbmZvLmQub3V0cHV0X3NjYW5saW5lIDwgc3AtPmNpbmZvLmQub3V0cHV0X2hlaWdodAorCQl8fCBUSUZGanBlZ19maW5pc2hfZGVjb21wcmVzcyhzcCk7Cit9CisKKworLyoKKyAqIEpQRUcgRW5jb2RpbmcuCisgKi8KKworc3RhdGljIHZvaWQKK3Vuc3VwcHJlc3NfcXVhbnRfdGFibGUgKEpQRUdTdGF0ZSogc3AsIGludCB0YmxubykKK3sKKwlKUVVBTlRfVEJMKiBxdGJsOworCisJaWYgKChxdGJsID0gc3AtPmNpbmZvLmMucXVhbnRfdGJsX3B0cnNbdGJsbm9dKSAhPSBOVUxMKQorCQlxdGJsLT5zZW50X3RhYmxlID0gRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkCitzdXBwcmVzc19xdWFudF90YWJsZSAoSlBFR1N0YXRlKiBzcCwgaW50IHRibG5vKQoreworCUpRVUFOVF9UQkwqIHF0Ymw7CisKKwlpZiAoKHF0YmwgPSBzcC0+Y2luZm8uYy5xdWFudF90YmxfcHRyc1t0Ymxub10pICE9IE5VTEwpCisJCXF0YmwtPnNlbnRfdGFibGUgPSBUUlVFOworfQorCitzdGF0aWMgdm9pZAordW5zdXBwcmVzc19odWZmX3RhYmxlIChKUEVHU3RhdGUqIHNwLCBpbnQgdGJsbm8pCit7CisJSkhVRkZfVEJMKiBodGJsOworCisJaWYgKChodGJsID0gc3AtPmNpbmZvLmMuZGNfaHVmZl90YmxfcHRyc1t0Ymxub10pICE9IE5VTEwpCisJCWh0YmwtPnNlbnRfdGFibGUgPSBGQUxTRTsKKwlpZiAoKGh0YmwgPSBzcC0+Y2luZm8uYy5hY19odWZmX3RibF9wdHJzW3RibG5vXSkgIT0gTlVMTCkKKwkJaHRibC0+c2VudF90YWJsZSA9IEZBTFNFOworfQorCitzdGF0aWMgdm9pZAorc3VwcHJlc3NfaHVmZl90YWJsZSAoSlBFR1N0YXRlKiBzcCwgaW50IHRibG5vKQoreworCUpIVUZGX1RCTCogaHRibDsKKworCWlmICgoaHRibCA9IHNwLT5jaW5mby5jLmRjX2h1ZmZfdGJsX3B0cnNbdGJsbm9dKSAhPSBOVUxMKQorCQlodGJsLT5zZW50X3RhYmxlID0gVFJVRTsKKwlpZiAoKGh0YmwgPSBzcC0+Y2luZm8uYy5hY19odWZmX3RibF9wdHJzW3RibG5vXSkgIT0gTlVMTCkKKwkJaHRibC0+c2VudF90YWJsZSA9IFRSVUU7Cit9CisKK3N0YXRpYyBpbnQKK3ByZXBhcmVfSlBFR1RhYmxlcyhUSUZGKiB0aWYpCit7CisJSlBFR1N0YXRlKiBzcCA9IEpTdGF0ZSh0aWYpOworCisJLyogSW5pdGlhbGl6ZSBxdWFudCB0YWJsZXMgZm9yIGN1cnJlbnQgcXVhbGl0eSBzZXR0aW5nICovCisJaWYgKCFUSUZGanBlZ19zZXRfcXVhbGl0eShzcCwgc3AtPmpwZWdxdWFsaXR5LCBGQUxTRSkpCisJCXJldHVybiAoMCk7CisJLyogTWFyayBvbmx5IHRoZSB0YWJsZXMgd2Ugd2FudCBmb3Igb3V0cHV0ICovCisJLyogTkI6IGNocm9taW5hbmNlIHRhYmxlcyBhcmUgY3VycmVudGx5IHVzZWQgb25seSB3aXRoIFlDYkNyICovCisJaWYgKCFUSUZGanBlZ19zdXBwcmVzc190YWJsZXMoc3AsIFRSVUUpKQorCQlyZXR1cm4gKDApOworCWlmIChzcC0+anBlZ3RhYmxlc21vZGUgJiBKUEVHVEFCTEVTTU9ERV9RVUFOVCkgeworCQl1bnN1cHByZXNzX3F1YW50X3RhYmxlKHNwLCAwKTsKKwkJaWYgKHNwLT5waG90b21ldHJpYyA9PSBQSE9UT01FVFJJQ19ZQ0JDUikKKwkJCXVuc3VwcHJlc3NfcXVhbnRfdGFibGUoc3AsIDEpOworCX0KKwlpZiAoc3AtPmpwZWd0YWJsZXNtb2RlICYgSlBFR1RBQkxFU01PREVfSFVGRikgeworCQl1bnN1cHByZXNzX2h1ZmZfdGFibGUoc3AsIDApOworCQlpZiAoc3AtPnBob3RvbWV0cmljID09IFBIT1RPTUVUUklDX1lDQkNSKQorCQkJdW5zdXBwcmVzc19odWZmX3RhYmxlKHNwLCAxKTsKKwl9CisJLyogRGlyZWN0IGxpYmpwZWcgb3V0cHV0IGludG8ganBlZ3RhYmxlcyAqLworCWlmICghVElGRmpwZWdfdGFibGVzX2Rlc3Qoc3AsIHRpZikpCisJCXJldHVybiAoMCk7CisJLyogRW1pdCB0YWJsZXMtb25seSBkYXRhc3RyZWFtICovCisJaWYgKCFUSUZGanBlZ193cml0ZV90YWJsZXMoc3ApKQorCQlyZXR1cm4gKDApOworCisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIGludAorSlBFR1NldHVwRW5jb2RlKFRJRkYqIHRpZikKK3sKKwlKUEVHU3RhdGUqIHNwID0gSlN0YXRlKHRpZik7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIkpQRUdTZXR1cEVuY29kZSI7CisKKyNpZiBkZWZpbmVkKEpQRUdfRFVBTF9NT0RFXzhfMTIpICYmICFkZWZpbmVkKFRJRkZJbml0SlBFRykKKyAgICAgICAgaWYoIHRpZi0+dGlmX2Rpci50ZF9iaXRzcGVyc2FtcGxlID09IDEyICkKKyAgICAgICAgICAgIHJldHVybiBUSUZGUmVJbml0SlBFR18xMiggdGlmLCBDT01QUkVTU0lPTl9KUEVHLCAxICk7CisjZW5kaWYKKworICAgICAgICBKUEVHSW5pdGlhbGl6ZUxpYkpQRUcoIHRpZiwgRkFMU0UgKTsKKworCWFzc2VydChzcCAhPSBOVUxMKTsKKwlhc3NlcnQoIXNwLT5jaW5mby5jb21tLmlzX2RlY29tcHJlc3Nvcik7CisKKwlzcC0+cGhvdG9tZXRyaWMgPSB0ZC0+dGRfcGhvdG9tZXRyaWM7CisKKwkvKgorCSAqIEluaXRpYWxpemUgYWxsIEpQRUcgcGFyYW1ldGVycyB0byBkZWZhdWx0IHZhbHVlcy4KKwkgKiBOb3RlIHRoYXQganBlZ19zZXRfZGVmYXVsdHMgbmVlZHMgbGVnYWwgdmFsdWVzIGZvcgorCSAqIGluX2NvbG9yX3NwYWNlIGFuZCBpbnB1dF9jb21wb25lbnRzLgorCSAqLworCWlmICh0ZC0+dGRfcGxhbmFyY29uZmlnID09IFBMQU5BUkNPTkZJR19DT05USUcpIHsKKwkJc3AtPmNpbmZvLmMuaW5wdXRfY29tcG9uZW50cyA9IHRkLT50ZF9zYW1wbGVzcGVycGl4ZWw7CisJCWlmIChzcC0+cGhvdG9tZXRyaWMgPT0gUEhPVE9NRVRSSUNfWUNCQ1IpIHsKKwkJCWlmIChzcC0+anBlZ2NvbG9ybW9kZSA9PSBKUEVHQ09MT1JNT0RFX1JHQikgeworCQkJCXNwLT5jaW5mby5jLmluX2NvbG9yX3NwYWNlID0gSkNTX1JHQjsKKwkJCX0gZWxzZSB7CisJCQkJc3AtPmNpbmZvLmMuaW5fY29sb3Jfc3BhY2UgPSBKQ1NfWUNiQ3I7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoKHRkLT50ZF9waG90b21ldHJpYyA9PSBQSE9UT01FVFJJQ19NSU5JU1dISVRFIHx8IHRkLT50ZF9waG90b21ldHJpYyA9PSBQSE9UT01FVFJJQ19NSU5JU0JMQUNLKSAmJiB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsID09IDEpCisJCQkJc3AtPmNpbmZvLmMuaW5fY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOworCQkJZWxzZSBpZiAodGQtPnRkX3Bob3RvbWV0cmljID09IFBIT1RPTUVUUklDX1JHQiAmJiB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsID09IDMpCisJCQkJc3AtPmNpbmZvLmMuaW5fY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOworCQkJZWxzZSBpZiAodGQtPnRkX3Bob3RvbWV0cmljID09IFBIT1RPTUVUUklDX1NFUEFSQVRFRCAmJiB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsID09IDQpCisJCQkJc3AtPmNpbmZvLmMuaW5fY29sb3Jfc3BhY2UgPSBKQ1NfQ01ZSzsKKwkJCWVsc2UKKwkJCQlzcC0+Y2luZm8uYy5pbl9jb2xvcl9zcGFjZSA9IEpDU19VTktOT1dOOworCQl9CisJfSBlbHNlIHsKKwkJc3AtPmNpbmZvLmMuaW5wdXRfY29tcG9uZW50cyA9IDE7CisJCXNwLT5jaW5mby5jLmluX2NvbG9yX3NwYWNlID0gSkNTX1VOS05PV047CisJfQorCWlmICghVElGRmpwZWdfc2V0X2RlZmF1bHRzKHNwKSkKKwkJcmV0dXJuICgwKTsKKwkvKiBTZXQgcGVyLWZpbGUgcGFyYW1ldGVycyAqLworCXN3aXRjaCAoc3AtPnBob3RvbWV0cmljKSB7CisJY2FzZSBQSE9UT01FVFJJQ19ZQ0JDUjoKKwkJc3AtPmhfc2FtcGxpbmcgPSB0ZC0+dGRfeWNiY3JzdWJzYW1wbGluZ1swXTsKKwkJc3AtPnZfc2FtcGxpbmcgPSB0ZC0+dGRfeWNiY3JzdWJzYW1wbGluZ1sxXTsKKwkJLyoKKwkJICogQSBSZWZlcmVuY2VCbGFja1doaXRlIGZpZWxkICptdXN0KiBiZSBwcmVzZW50IHNpbmNlIHRoZQorCQkgKiBkZWZhdWx0IHZhbHVlIGlzIGluYXBwcm9wcmlhdGUgZm9yIFlDYkNyLiAgRmlsbCBpbiB0aGUKKwkJICogcHJvcGVyIHZhbHVlIGlmIGFwcGxpY2F0aW9uIGRpZG4ndCBzZXQgaXQuCisJCSAqLworCQl7CisJCQlmbG9hdCAqcmVmOworCQkJaWYgKCFUSUZGR2V0RmllbGQodGlmLCBUSUZGVEFHX1JFRkVSRU5DRUJMQUNLV0hJVEUsCisJCQkJCSAgJnJlZikpIHsKKwkJCQlmbG9hdCByZWZid1s2XTsKKwkJCQlsb25nIHRvcCA9IDFMIDw8IHRkLT50ZF9iaXRzcGVyc2FtcGxlOworCQkJCXJlZmJ3WzBdID0gMDsKKwkJCQlyZWZid1sxXSA9IChmbG9hdCkodG9wLTFMKTsKKwkJCQlyZWZid1syXSA9IChmbG9hdCkodG9wPj4xKTsKKwkJCQlyZWZid1szXSA9IHJlZmJ3WzFdOworCQkJCXJlZmJ3WzRdID0gcmVmYndbMl07CisJCQkJcmVmYndbNV0gPSByZWZid1sxXTsKKwkJCQlUSUZGU2V0RmllbGQodGlmLCBUSUZGVEFHX1JFRkVSRU5DRUJMQUNLV0hJVEUsCisJCQkJCSAgICAgcmVmYncpOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgUEhPVE9NRVRSSUNfUEFMRVRURToJCS8qIGRpc2FsbG93ZWQgYnkgVGVjaCBOb3RlICovCisJY2FzZSBQSE9UT01FVFJJQ19NQVNLOgorCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAiUGhvdG9tZXRyaWNJbnRlcnByZXRhdGlvbiAlZCBub3QgYWxsb3dlZCBmb3IgSlBFRyIsCisJCQkgIChpbnQpIHNwLT5waG90b21ldHJpYyk7CisJCXJldHVybiAoMCk7CisJZGVmYXVsdDoKKwkJLyogVElGRiA2LjAgZm9yYmlkcyBzdWJzYW1wbGluZyBvZiBhbGwgb3RoZXIgY29sb3Igc3BhY2VzICovCisJCXNwLT5oX3NhbXBsaW5nID0gMTsKKwkJc3AtPnZfc2FtcGxpbmcgPSAxOworCQlicmVhazsKKwl9CisKKwkvKiBWZXJpZnkgbWlzY2VsbGFuZW91cyBwYXJhbWV0ZXJzICovCisKKwkvKgorCSAqIFRoaXMgd291bGQgbmVlZCB3b3JrIGlmIGxpYnRpZmYgZXZlciBzdXBwb3J0cyBkaWZmZXJlbnQKKwkgKiBkZXB0aHMgZm9yIGRpZmZlcmVudCBjb21wb25lbnRzLCBvciBpZiBsaWJqcGVnIGV2ZXIgc3VwcG9ydHMKKwkgKiBydW4tdGltZSBzZWxlY3Rpb24gb2YgZGVwdGguICBOZWl0aGVyIGlzIGltbWluZW50LgorCSAqLworI2lmZGVmIEpQRUdfTElCX01LMQorICAgICAgICAvKiBCSVRTX0lOX0pTQU1QTEUgbm93IHBlcm1pdHMgOCBhbmQgMTIgLS0tIGRnaWxiZXJ0ICovCisJaWYgKHRkLT50ZF9iaXRzcGVyc2FtcGxlICE9IDggJiYgdGQtPnRkX2JpdHNwZXJzYW1wbGUgIT0gMTIpIAorI2Vsc2UKKwlpZiAodGQtPnRkX2JpdHNwZXJzYW1wbGUgIT0gQklUU19JTl9KU0FNUExFICkKKyNlbmRpZgorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIkJpdHNQZXJTYW1wbGUgJWQgbm90IGFsbG93ZWQgZm9yIEpQRUciLAorCQkJICAoaW50KSB0ZC0+dGRfYml0c3BlcnNhbXBsZSk7CisJCXJldHVybiAoMCk7CisJfQorCXNwLT5jaW5mby5jLmRhdGFfcHJlY2lzaW9uID0gdGQtPnRkX2JpdHNwZXJzYW1wbGU7CisjaWZkZWYgSlBFR19MSUJfTUsxCisgICAgICAgIHNwLT5jaW5mby5jLmJpdHNfaW5fanNhbXBsZSA9IHRkLT50ZF9iaXRzcGVyc2FtcGxlOworI2VuZGlmCisJaWYgKGlzVGlsZWQodGlmKSkgeworCQlpZiAoKHRkLT50ZF90aWxlbGVuZ3RoICUgKHNwLT52X3NhbXBsaW5nICogRENUU0laRSkpICE9IDApIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJICAiSlBFRyB0aWxlIGhlaWdodCBtdXN0IGJlIG11bHRpcGxlIG9mICVkIiwKKwkJCQkgIHNwLT52X3NhbXBsaW5nICogRENUU0laRSk7CisJCQlyZXR1cm4gKDApOworCQl9CisJCWlmICgodGQtPnRkX3RpbGV3aWR0aCAlIChzcC0+aF9zYW1wbGluZyAqIERDVFNJWkUpKSAhPSAwKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCSAgIkpQRUcgdGlsZSB3aWR0aCBtdXN0IGJlIG11bHRpcGxlIG9mICVkIiwKKwkJCQkgIHNwLT5oX3NhbXBsaW5nICogRENUU0laRSk7CisJCQlyZXR1cm4gKDApOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHRkLT50ZF9yb3dzcGVyc3RyaXAgPCB0ZC0+dGRfaW1hZ2VsZW5ndGggJiYKKwkJICAgICh0ZC0+dGRfcm93c3BlcnN0cmlwICUgKHNwLT52X3NhbXBsaW5nICogRENUU0laRSkpICE9IDApIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJICAiUm93c1BlclN0cmlwIG11c3QgYmUgbXVsdGlwbGUgb2YgJWQgZm9yIEpQRUciLAorCQkJCSAgc3AtPnZfc2FtcGxpbmcgKiBEQ1RTSVpFKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CisKKwkvKiBDcmVhdGUgYSBKUEVHVGFibGVzIGZpZWxkIGlmIGFwcHJvcHJpYXRlICovCisJaWYgKHNwLT5qcGVndGFibGVzbW9kZSAmIChKUEVHVEFCTEVTTU9ERV9RVUFOVHxKUEVHVEFCTEVTTU9ERV9IVUZGKSkgeworICAgICAgICAgICAgICAgIGlmKCBzcC0+anBlZ3RhYmxlcyA9PSBOVUxMCisgICAgICAgICAgICAgICAgICAgIHx8IG1lbWNtcChzcC0+anBlZ3RhYmxlcywiXDBcMFwwXDBcMFwwXDBcMFwwIiw4KSA9PSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByZXBhcmVfSlBFR1RhYmxlcyh0aWYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFyayB0aGUgZmllbGQgcHJlc2VudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FuJ3QgdXNlIFRJRkZTZXRGaWVsZCBzaW5jZSBCRUVOV1JJVElORyBpcyBhbHJlYWR5IHNldCEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfRElSVFlESVJFQ1Q7CisgICAgICAgICAgICAgICAgICAgICAgICBUSUZGU2V0RmllbGRCaXQodGlmLCBGSUVMRF9KUEVHVEFCTEVTKTsKKyAgICAgICAgICAgICAgICB9CisJfSBlbHNlIHsKKwkJLyogV2UgZG8gbm90IHN1cHBvcnQgYXBwbGljYXRpb24tc3VwcGxpZWQgSlBFR1RhYmxlcywgKi8KKwkJLyogc28gbWFyayB0aGUgZmllbGQgbm90IHByZXNlbnQgKi8KKwkJVElGRkNsckZpZWxkQml0KHRpZiwgRklFTERfSlBFR1RBQkxFUyk7CisJfQorCisJLyogRGlyZWN0IGxpYmpwZWcgb3V0cHV0IHRvIGxpYnRpZmYncyBvdXRwdXQgYnVmZmVyICovCisJVElGRmpwZWdfZGF0YV9kZXN0KHNwLCB0aWYpOworCisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIFNldCBlbmNvZGluZyBzdGF0ZSBhdCB0aGUgc3RhcnQgb2YgYSBzdHJpcCBvciB0aWxlLgorICovCitzdGF0aWMgaW50CitKUEVHUHJlRW5jb2RlKFRJRkYqIHRpZiwgdWludDE2IHMpCit7CisJSlBFR1N0YXRlICpzcCA9IEpTdGF0ZSh0aWYpOworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJKUEVHUHJlRW5jb2RlIjsKKwl1aW50MzIgc2VnbWVudF93aWR0aCwgc2VnbWVudF9oZWlnaHQ7CisJaW50IGRvd25zYW1wbGVkX2lucHV0OworCisJYXNzZXJ0KHNwICE9IE5VTEwpOworICAKKwlpZiAoc3AtPmNpbmZvLmNvbW0uaXNfZGVjb21wcmVzc29yID09IDEpCisJeworCQl0aWYtPnRpZl9zZXR1cGVuY29kZSggdGlmICk7CisJfQorICAKKwlhc3NlcnQoIXNwLT5jaW5mby5jb21tLmlzX2RlY29tcHJlc3Nvcik7CisJLyoKKwkgKiBTZXQgZW5jb2RpbmcgcGFyYW1ldGVycyBmb3IgdGhpcyBzdHJpcC90aWxlLgorCSAqLworCWlmIChpc1RpbGVkKHRpZikpIHsKKwkJc2VnbWVudF93aWR0aCA9IHRkLT50ZF90aWxld2lkdGg7CisJCXNlZ21lbnRfaGVpZ2h0ID0gdGQtPnRkX3RpbGVsZW5ndGg7CisJCXNwLT5ieXRlc3BlcmxpbmUgPSBUSUZGVGlsZVJvd1NpemUodGlmKTsKKwl9IGVsc2UgeworCQlzZWdtZW50X3dpZHRoID0gdGQtPnRkX2ltYWdld2lkdGg7CisJCXNlZ21lbnRfaGVpZ2h0ID0gdGQtPnRkX2ltYWdlbGVuZ3RoIC0gdGlmLT50aWZfcm93OworCQlpZiAoc2VnbWVudF9oZWlnaHQgPiB0ZC0+dGRfcm93c3BlcnN0cmlwKQorCQkJc2VnbWVudF9oZWlnaHQgPSB0ZC0+dGRfcm93c3BlcnN0cmlwOworCQlzcC0+Ynl0ZXNwZXJsaW5lID0gVElGRlNjYW5saW5lU2l6ZSh0aWYpOworCX0KKwlpZiAodGQtPnRkX3BsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfU0VQQVJBVEUgJiYgcyA+IDApIHsKKwkJLyogZm9yIFBDIDIsIHNjYWxlIGRvd24gdGhlIHN0cmlwL3RpbGUgc2l6ZQorCQkgKiB0byBtYXRjaCBhIGRvd25zYW1wbGVkIGNvbXBvbmVudAorCQkgKi8KKwkJc2VnbWVudF93aWR0aCA9IFRJRkZob3dtYW55XzMyKHNlZ21lbnRfd2lkdGgsIHNwLT5oX3NhbXBsaW5nKTsgCisJCXNlZ21lbnRfaGVpZ2h0ID0gVElGRmhvd21hbnlfMzIoc2VnbWVudF9oZWlnaHQsIHNwLT52X3NhbXBsaW5nKTsKKwl9CisJaWYgKHNlZ21lbnRfd2lkdGggPiA2NTUzNSB8fCBzZWdtZW50X2hlaWdodCA+IDY1NTM1KSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJTdHJpcC90aWxlIHRvbyBsYXJnZSBmb3IgSlBFRyIpOworCQlyZXR1cm4gKDApOworCX0KKwlzcC0+Y2luZm8uYy5pbWFnZV93aWR0aCA9IHNlZ21lbnRfd2lkdGg7CisJc3AtPmNpbmZvLmMuaW1hZ2VfaGVpZ2h0ID0gc2VnbWVudF9oZWlnaHQ7CisJZG93bnNhbXBsZWRfaW5wdXQgPSBGQUxTRTsKKwlpZiAodGQtPnRkX3BsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfQ09OVElHKSB7CisJCXNwLT5jaW5mby5jLmlucHV0X2NvbXBvbmVudHMgPSB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsOworCQlpZiAoc3AtPnBob3RvbWV0cmljID09IFBIT1RPTUVUUklDX1lDQkNSKSB7CisJCQlpZiAoc3AtPmpwZWdjb2xvcm1vZGUgIT0gSlBFR0NPTE9STU9ERV9SR0IpIHsKKwkJCQlpZiAoc3AtPmhfc2FtcGxpbmcgIT0gMSB8fCBzcC0+dl9zYW1wbGluZyAhPSAxKQorCQkJCQlkb3duc2FtcGxlZF9pbnB1dCA9IFRSVUU7CisJCQl9CisJCQlpZiAoIVRJRkZqcGVnX3NldF9jb2xvcnNwYWNlKHNwLCBKQ1NfWUNiQ3IpKQorCQkJCXJldHVybiAoMCk7CisJCQkvKgorCQkJICogU2V0IFkgc2FtcGxpbmcgZmFjdG9yczsKKwkJCSAqIHdlIGFzc3VtZSBqcGVnX3NldF9jb2xvcnNwYWNlKCkgc2V0IHRoZSByZXN0IHRvIDEKKwkJCSAqLworCQkJc3AtPmNpbmZvLmMuY29tcF9pbmZvWzBdLmhfc2FtcF9mYWN0b3IgPSBzcC0+aF9zYW1wbGluZzsKKwkJCXNwLT5jaW5mby5jLmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yID0gc3AtPnZfc2FtcGxpbmc7CisJCX0gZWxzZSB7CisJCQlpZiAoIVRJRkZqcGVnX3NldF9jb2xvcnNwYWNlKHNwLCBzcC0+Y2luZm8uYy5pbl9jb2xvcl9zcGFjZSkpCisJCQkJcmV0dXJuICgwKTsKKwkJCS8qIGpwZWdfc2V0X2NvbG9yc3BhY2Ugc2V0IGFsbCBzYW1wbGluZyBmYWN0b3JzIHRvIDEgKi8KKwkJfQorCX0gZWxzZSB7CisJCWlmICghVElGRmpwZWdfc2V0X2NvbG9yc3BhY2Uoc3AsIEpDU19VTktOT1dOKSkKKwkJCXJldHVybiAoMCk7CisJCXNwLT5jaW5mby5jLmNvbXBfaW5mb1swXS5jb21wb25lbnRfaWQgPSBzOworCQkvKiBqcGVnX3NldF9jb2xvcnNwYWNlKCkgc2V0IHNhbXBsaW5nIGZhY3RvcnMgdG8gMSAqLworCQlpZiAoc3AtPnBob3RvbWV0cmljID09IFBIT1RPTUVUUklDX1lDQkNSICYmIHMgPiAwKSB7CisJCQlzcC0+Y2luZm8uYy5jb21wX2luZm9bMF0ucXVhbnRfdGJsX25vID0gMTsKKwkJCXNwLT5jaW5mby5jLmNvbXBfaW5mb1swXS5kY190Ymxfbm8gPSAxOworCQkJc3AtPmNpbmZvLmMuY29tcF9pbmZvWzBdLmFjX3RibF9ubyA9IDE7CisJCX0KKwl9CisJLyogZW5zdXJlIGxpYmpwZWcgd29uJ3Qgd3JpdGUgYW55IGV4dHJhbmVvdXMgbWFya2VycyAqLworCXNwLT5jaW5mby5jLndyaXRlX0pGSUZfaGVhZGVyID0gRkFMU0U7CisJc3AtPmNpbmZvLmMud3JpdGVfQWRvYmVfbWFya2VyID0gRkFMU0U7CisJLyogc2V0IHVwIHRhYmxlIGhhbmRsaW5nIGNvcnJlY3RseSAqLworCS8qIGNhbGxpbmcgVElGRmpwZWdfc2V0X3F1YWxpdHkoKSBjYXVzZXMgcXVhbnRpemF0aW9uIHRhYmxlcyB0byBiZSBmbGFnZ2VkICovCisJLyogYXMgYmVpbmcgdG8gYmUgZW1pdHRlZCwgd2hpY2ggd2UgZG9uJ3Qgd2FudCBpbiB0aGUgSlBFR1RBQkxFU01PREVfUVVBTlQgKi8KKwkvKiBtb2RlLCBzbyB3ZSBtdXN0IG1hbnVhbGx5IHN1cHByZXNzIHRoZW0uIEhvd2V2ZXIgVElGRmpwZWdfc2V0X3F1YWxpdHkoKSAqLworCS8qIHNob3VsZCByZWFsbHkgYmUgY2FsbGVkIHdoZW4gZGVhbGluZyB3aXRoIGZpbGVzIHdpdGggZGlyZWN0b3JpZXMgd2l0aCAqLworCS8qIG1peGVkIHF1YWxpdGllcy4gc2VlIGh0dHA6Ly90cmFjLm9zZ2VvLm9yZy9nZGFsL3RpY2tldC8zNTM5ICovCisJaWYgKCFUSUZGanBlZ19zZXRfcXVhbGl0eShzcCwgc3AtPmpwZWdxdWFsaXR5LCBGQUxTRSkpCisJCXJldHVybiAoMCk7CisJaWYgKHNwLT5qcGVndGFibGVzbW9kZSAmIEpQRUdUQUJMRVNNT0RFX1FVQU5UKSB7CisJCXN1cHByZXNzX3F1YW50X3RhYmxlKHNwLCAwKTsKKwkJc3VwcHJlc3NfcXVhbnRfdGFibGUoc3AsIDEpOworCX0KKwllbHNlIHsKKwkJdW5zdXBwcmVzc19xdWFudF90YWJsZShzcCwgMCk7CisJCXVuc3VwcHJlc3NfcXVhbnRfdGFibGUoc3AsIDEpOworCX0KKwlpZiAoc3AtPmpwZWd0YWJsZXNtb2RlICYgSlBFR1RBQkxFU01PREVfSFVGRikKKwl7CisJCS8qIEV4cGxpY2l0IHN1cHByZXNzaW9uIGlzIG9ubHkgbmVlZGVkIGlmIHdlIGRpZCBub3QgZ28gdGhyb3VnaCB0aGUgKi8KKwkJLyogcHJlcGFyZV9KUEVHVGFibGVzKCkgY29kZSBwYXRoLCB3aGljaCBtYXkgYmUgdGhlIGNhc2UgaWYgdXBkYXRpbmcgKi8KKwkJLyogYW4gZXhpc3RpbmcgZmlsZSAqLworCQlzdXBwcmVzc19odWZmX3RhYmxlKHNwLCAwKTsKKwkJc3VwcHJlc3NfaHVmZl90YWJsZShzcCwgMSk7CisJCXNwLT5jaW5mby5jLm9wdGltaXplX2NvZGluZyA9IEZBTFNFOworCX0KKwllbHNlCisJCXNwLT5jaW5mby5jLm9wdGltaXplX2NvZGluZyA9IFRSVUU7CisJaWYgKGRvd25zYW1wbGVkX2lucHV0KSB7CisJCS8qIE5lZWQgdG8gdXNlIHJhdy1kYXRhIGludGVyZmFjZSB0byBsaWJqcGVnICovCisJCXNwLT5jaW5mby5jLnJhd19kYXRhX2luID0gVFJVRTsKKwkJdGlmLT50aWZfZW5jb2Rlcm93ID0gSlBFR0VuY29kZVJhdzsKKwkJdGlmLT50aWZfZW5jb2Rlc3RyaXAgPSBKUEVHRW5jb2RlUmF3OworCQl0aWYtPnRpZl9lbmNvZGV0aWxlID0gSlBFR0VuY29kZVJhdzsKKwl9IGVsc2UgeworCQkvKiBVc2Ugbm9ybWFsIGludGVyZmFjZSB0byBsaWJqcGVnICovCisJCXNwLT5jaW5mby5jLnJhd19kYXRhX2luID0gRkFMU0U7CisJCXRpZi0+dGlmX2VuY29kZXJvdyA9IEpQRUdFbmNvZGU7CisJCXRpZi0+dGlmX2VuY29kZXN0cmlwID0gSlBFR0VuY29kZTsKKwkJdGlmLT50aWZfZW5jb2RldGlsZSA9IEpQRUdFbmNvZGU7CisJfQorCS8qIFN0YXJ0IEpQRUcgY29tcHJlc3NvciAqLworCWlmICghVElGRmpwZWdfc3RhcnRfY29tcHJlc3Moc3AsIEZBTFNFKSkKKwkJcmV0dXJuICgwKTsKKwkvKiBBbGxvY2F0ZSBkb3duc2FtcGxlZC1kYXRhIGJ1ZmZlcnMgaWYgbmVlZGVkICovCisJaWYgKGRvd25zYW1wbGVkX2lucHV0KSB7CisJCWlmICghYWxsb2NfZG93bnNhbXBsZWRfYnVmZmVycyh0aWYsIHNwLT5jaW5mby5jLmNvbXBfaW5mbywKKwkJCQkJICAgICAgIHNwLT5jaW5mby5jLm51bV9jb21wb25lbnRzKSkKKwkJCXJldHVybiAoMCk7CisJfQorCXNwLT5zY2FuY291bnQgPSAwOworCisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIEVuY29kZSBhIGNodW5rIG9mIHBpeGVscy4KKyAqICJTdGFuZGFyZCIgY2FzZTogaW5jb21pbmcgZGF0YSBpcyBub3QgZG93bnNhbXBsZWQuCisgKi8KK3N0YXRpYyBpbnQKK0pQRUdFbmNvZGUoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBjYywgdWludDE2IHMpCit7CisJSlBFR1N0YXRlICpzcCA9IEpTdGF0ZSh0aWYpOworCXRtc2l6ZV90IG5yb3dzOworCUpTQU1QUk9XIGJ1ZnB0clsxXTsKKyAgICAgICAgc2hvcnQgKmxpbmUxNiA9IE5VTEw7CisgICAgICAgIGludCAgICBsaW5lMTZfY291bnQgPSAwOworCisJKHZvaWQpIHM7CisJYXNzZXJ0KHNwICE9IE5VTEwpOworCS8qIGRhdGEgaXMgZXhwZWN0ZWQgdG8gYmUgc3VwcGxpZWQgaW4gbXVsdGlwbGVzIG9mIGEgc2NhbmxpbmUgKi8KKwlucm93cyA9IGNjIC8gc3AtPmJ5dGVzcGVybGluZTsKKwlpZiAoY2MgJSBzcC0+Ynl0ZXNwZXJsaW5lKQorICAgICAgICAgICAgVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgdGlmLT50aWZfbmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJhY3Rpb25hbCBzY2FubGluZSBkaXNjYXJkZWQiKTsKKworICAgICAgICAvKiBUaGUgbGFzdCBzdHJpcCB3aWxsIGJlIGxpbWl0ZWQgdG8gaW1hZ2Ugc2l6ZSAqLworICAgICAgICBpZiggIWlzVGlsZWQodGlmKSAmJiB0aWYtPnRpZl9yb3crbnJvd3MgPiB0aWYtPnRpZl9kaXIudGRfaW1hZ2VsZW5ndGggKQorICAgICAgICAgICAgbnJvd3MgPSB0aWYtPnRpZl9kaXIudGRfaW1hZ2VsZW5ndGggLSB0aWYtPnRpZl9yb3c7CisKKyAgICAgICAgaWYoIHNwLT5jaW5mby5jLmRhdGFfcHJlY2lzaW9uID09IDEyICkKKyAgICAgICAgeworICAgICAgICAgICAgbGluZTE2X2NvdW50ID0gKHNwLT5ieXRlc3BlcmxpbmUgKiAyKSAvIDM7CisgICAgICAgICAgICBsaW5lMTYgPSAoc2hvcnQgKikgX1RJRkZtYWxsb2Moc2l6ZW9mKHNob3J0KSAqIGxpbmUxNl9jb3VudCk7CisgICAgICAgICAgICBpZiAoIWxpbmUxNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwKKwkJCSAgICAgIkpQRUdFbmNvZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgICAgIAorCXdoaWxlIChucm93cy0tID4gMCkgeworCisgICAgICAgICAgICBpZiggc3AtPmNpbmZvLmMuZGF0YV9wcmVjaXNpb24gPT0gMTIgKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgaW50IHZhbHVlX3BhaXJzID0gbGluZTE2X2NvdW50IC8gMjsKKyAgICAgICAgICAgICAgICBpbnQgaVBhaXI7CisKKwkJYnVmcHRyWzBdID0gKEpTQU1QUk9XKSBsaW5lMTY7CisKKyAgICAgICAgICAgICAgICBmb3IoIGlQYWlyID0gMDsgaVBhaXIgPCB2YWx1ZV9wYWlyczsgaVBhaXIrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICppbl9wdHIgPQorICAgICAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCBjaGFyICopIGJ1ZikgKyBpUGFpciAqIDM7CisgICAgICAgICAgICAgICAgICAgIEpTQU1QTEUgKm91dF9wdHIgPSAoSlNBTVBMRSAqKSAobGluZTE2ICsgaVBhaXIgKiAyKTsKKworICAgICAgICAgICAgICAgICAgICBvdXRfcHRyWzBdID0gKGluX3B0clswXSA8PCA0KSB8ICgoaW5fcHRyWzFdICYgMHhmMCkgPj4gNCk7CisgICAgICAgICAgICAgICAgICAgIG91dF9wdHJbMV0gPSAoKGluX3B0clsxXSAmIDB4MGYpIDw8IDgpIHwgaW5fcHRyWzJdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKwkJYnVmcHRyWzBdID0gKEpTQU1QUk9XKSBidWY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoVElGRmpwZWdfd3JpdGVfc2NhbmxpbmVzKHNwLCBidWZwdHIsIDEpICE9IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgICAgIGlmIChucm93cyA+IDApCisgICAgICAgICAgICAgICAgdGlmLT50aWZfcm93Kys7CisgICAgICAgICAgICBidWYgKz0gc3AtPmJ5dGVzcGVybGluZTsKKwl9CisKKyAgICAgICAgaWYoIHNwLT5jaW5mby5jLmRhdGFfcHJlY2lzaW9uID09IDEyICkKKyAgICAgICAgeworICAgICAgICAgICAgX1RJRkZmcmVlKCBsaW5lMTYgKTsKKyAgICAgICAgfQorICAgICAgICAgICAgCisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIEVuY29kZSBhIGNodW5rIG9mIHBpeGVscy4KKyAqIEluY29taW5nIGRhdGEgaXMgZXhwZWN0ZWQgdG8gYmUgZG93bnNhbXBsZWQgcGVyIHNhbXBsaW5nIGZhY3RvcnMuCisgKi8KK3N0YXRpYyBpbnQKK0pQRUdFbmNvZGVSYXcoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBjYywgdWludDE2IHMpCit7CisJSlBFR1N0YXRlICpzcCA9IEpTdGF0ZSh0aWYpOworCUpTQU1QTEUqIGlucHRyOworCUpTQU1QTEUqIG91dHB0cjsKKwl0bXNpemVfdCBucm93czsKKwlKRElNRU5TSU9OIGNsdW1wc19wZXJfbGluZSwgbmNsdW1wOworCWludCBjbHVtcG9mZnNldCwgY2ksIHhwb3MsIHlwb3M7CisJanBlZ19jb21wb25lbnRfaW5mbyogY29tcHB0cjsKKwlpbnQgc2FtcGxlc19wZXJfY2x1bXAgPSBzcC0+c2FtcGxlc3BlcmNsdW1wOworCXRtc2l6ZV90IGJ5dGVzcGVyY2x1bXBsaW5lOworCisJKHZvaWQpIHM7CisJYXNzZXJ0KHNwICE9IE5VTEwpOworCS8qIGRhdGEgaXMgZXhwZWN0ZWQgdG8gYmUgc3VwcGxpZWQgaW4gbXVsdGlwbGVzIG9mIGEgY2x1bXBsaW5lICovCisJLyogYSBjbHVtcGxpbmUgaXMgZXF1aXZhbGVudCB0byB2X3NhbXBsaW5nIGRlc3Vic2FtcGxlZCBzY2FubGluZXMgKi8KKwkvKiBUT0RPOiB0aGUgZm9sbG93aW5nIGNhbGN1bGF0aW9uIG9mIGJ5dGVzcGVyY2x1bXBsaW5lLCBzaG91bGQgc3Vic3RpdHV0ZSBjYWxjdWxhdGlvbiBvZiBzcC0+Ynl0ZXNwZXJsaW5lLCBleGNlcHQgdGhhdCBpdCBpcyBwZXIgdl9zYW1wbGluZyBsaW5lcyAqLworCWJ5dGVzcGVyY2x1bXBsaW5lID0gKCgoc3AtPmNpbmZvLmMuaW1hZ2Vfd2lkdGgrc3AtPmhfc2FtcGxpbmctMSkvc3AtPmhfc2FtcGxpbmcpCisJCQkgICAgICooc3AtPmhfc2FtcGxpbmcqc3AtPnZfc2FtcGxpbmcrMikqc3AtPmNpbmZvLmMuZGF0YV9wcmVjaXNpb24rNykKKwkJCSAgICAvODsKKworCW5yb3dzID0gKCBjYyAvIGJ5dGVzcGVyY2x1bXBsaW5lICkgKiBzcC0+dl9zYW1wbGluZzsKKwlpZiAoY2MgJSBieXRlc3BlcmNsdW1wbGluZSkKKwkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgdGlmLT50aWZfbmFtZSwgImZyYWN0aW9uYWwgc2NhbmxpbmUgZGlzY2FyZGVkIik7CisKKwkvKiBDYixDciBib3RoIGhhdmUgc2FtcGxpbmcgZmFjdG9ycyAxLCBzbyB0aGlzIGlzIGNvcnJlY3QgKi8KKwljbHVtcHNfcGVyX2xpbmUgPSBzcC0+Y2luZm8uYy5jb21wX2luZm9bMV0uZG93bnNhbXBsZWRfd2lkdGg7CisKKwl3aGlsZSAobnJvd3MgPiAwKSB7CisJCS8qCisJCSAqIEZhc3Rlc3Qgd2F5IHRvIHNlcGFyYXRlIHRoZSBkYXRhIGlzIHRvIG1ha2Ugb25lIHBhc3MKKwkJICogb3ZlciB0aGUgc2NhbmxpbmUgZm9yIGVhY2ggcm93IG9mIGVhY2ggY29tcG9uZW50LgorCQkgKi8KKwkJY2x1bXBvZmZzZXQgPSAwOwkJLyogZmlyc3Qgc2FtcGxlIGluIGNsdW1wICovCisJCWZvciAoY2kgPSAwLCBjb21wcHRyID0gc3AtPmNpbmZvLmMuY29tcF9pbmZvOworCQkgICAgIGNpIDwgc3AtPmNpbmZvLmMubnVtX2NvbXBvbmVudHM7CisJCSAgICAgY2krKywgY29tcHB0cisrKSB7CisJCSAgICBpbnQgaHNhbXAgPSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOworCQkgICAgaW50IHZzYW1wID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKwkJICAgIGludCBwYWRkaW5nID0gKGludCkgKGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUgLQorCQkJCQkgY2x1bXBzX3Blcl9saW5lICogaHNhbXApOworCQkgICAgZm9yICh5cG9zID0gMDsgeXBvcyA8IHZzYW1wOyB5cG9zKyspIHsKKwkJCWlucHRyID0gKChKU0FNUExFKikgYnVmKSArIGNsdW1wb2Zmc2V0OworCQkJb3V0cHRyID0gc3AtPmRzX2J1ZmZlcltjaV1bc3AtPnNjYW5jb3VudCp2c2FtcCArIHlwb3NdOworCQkJaWYgKGhzYW1wID09IDEpIHsKKwkJCSAgICAvKiBmYXN0IHBhdGggZm9yIGF0IGxlYXN0IENiIGFuZCBDciAqLworCQkJICAgIGZvciAobmNsdW1wID0gY2x1bXBzX3Blcl9saW5lOyBuY2x1bXAtLSA+IDA7ICkgeworCQkJCSpvdXRwdHIrKyA9IGlucHRyWzBdOworCQkJCWlucHRyICs9IHNhbXBsZXNfcGVyX2NsdW1wOworCQkJICAgIH0KKwkJCX0gZWxzZSB7CisJCQkgICAgLyogZ2VuZXJhbCBjYXNlICovCisJCQkgICAgZm9yIChuY2x1bXAgPSBjbHVtcHNfcGVyX2xpbmU7IG5jbHVtcC0tID4gMDsgKSB7CisJCQkJZm9yICh4cG9zID0gMDsgeHBvcyA8IGhzYW1wOyB4cG9zKyspCisJCQkJICAgICpvdXRwdHIrKyA9IGlucHRyW3hwb3NdOworCQkJCWlucHRyICs9IHNhbXBsZXNfcGVyX2NsdW1wOworCQkJICAgIH0KKwkJCX0KKwkJCS8qIHBhZCBlYWNoIHNjYW5saW5lIGFzIG5lZWRlZCAqLworCQkJZm9yICh4cG9zID0gMDsgeHBvcyA8IHBhZGRpbmc7IHhwb3MrKykgeworCQkJICAgICpvdXRwdHIgPSBvdXRwdHJbLTFdOworCQkJICAgIG91dHB0cisrOworCQkJfQorCQkJY2x1bXBvZmZzZXQgKz0gaHNhbXA7CisJCSAgICB9CisJCX0KKwkJc3AtPnNjYW5jb3VudCsrOworCQlpZiAoc3AtPnNjYW5jb3VudCA+PSBEQ1RTSVpFKSB7CisJCQlpbnQgbiA9IHNwLT5jaW5mby5jLm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRTsKKwkJCWlmIChUSUZGanBlZ193cml0ZV9yYXdfZGF0YShzcCwgc3AtPmRzX2J1ZmZlciwgbikgIT0gbikKKwkJCQlyZXR1cm4gKDApOworCQkJc3AtPnNjYW5jb3VudCA9IDA7CisJCX0KKwkJdGlmLT50aWZfcm93ICs9IHNwLT52X3NhbXBsaW5nOworCQlidWYgKz0gYnl0ZXNwZXJjbHVtcGxpbmU7CisJCW5yb3dzIC09IHNwLT52X3NhbXBsaW5nOworCX0KKwlyZXR1cm4gKDEpOworfQorCisvKgorICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgYSBzdHJpcCBvciB0aWxlLgorICovCitzdGF0aWMgaW50CitKUEVHUG9zdEVuY29kZShUSUZGKiB0aWYpCit7CisJSlBFR1N0YXRlICpzcCA9IEpTdGF0ZSh0aWYpOworCisJaWYgKHNwLT5zY2FuY291bnQgPiAwKSB7CisJCS8qCisJCSAqIE5lZWQgdG8gZW1pdCBhIHBhcnRpYWwgYnVmZmVybG9hZCBvZiBkb3duc2FtcGxlZCBkYXRhLgorCQkgKiBQYWQgdGhlIGRhdGEgdmVydGljYWxseS4KKwkJICovCisJCWludCBjaSwgeXBvcywgbjsKKwkJanBlZ19jb21wb25lbnRfaW5mbyogY29tcHB0cjsKKworCQlmb3IgKGNpID0gMCwgY29tcHB0ciA9IHNwLT5jaW5mby5jLmNvbXBfaW5mbzsKKwkJICAgICBjaSA8IHNwLT5jaW5mby5jLm51bV9jb21wb25lbnRzOworCQkgICAgIGNpKyssIGNvbXBwdHIrKykgeworCQkJaW50IHZzYW1wID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKwkJCXRtc2l6ZV90IHJvd193aWR0aCA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUKKwkJCQkqIHNpemVvZihKU0FNUExFKTsKKwkJCWZvciAoeXBvcyA9IHNwLT5zY2FuY291bnQgKiB2c2FtcDsKKwkJCSAgICAgeXBvcyA8IERDVFNJWkUgKiB2c2FtcDsgeXBvcysrKSB7CisJCQkJX1RJRkZtZW1jcHkoKHZvaWQqKXNwLT5kc19idWZmZXJbY2ldW3lwb3NdLAorCQkJCQkgICAgKHZvaWQqKXNwLT5kc19idWZmZXJbY2ldW3lwb3MtMV0sCisJCQkJCSAgICByb3dfd2lkdGgpOworCisJCQl9CisJCX0KKwkJbiA9IHNwLT5jaW5mby5jLm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRTsKKwkJaWYgKFRJRkZqcGVnX3dyaXRlX3Jhd19kYXRhKHNwLCBzcC0+ZHNfYnVmZmVyLCBuKSAhPSBuKQorCQkJcmV0dXJuICgwKTsKKwl9CisKKwlyZXR1cm4gKFRJRkZqcGVnX2ZpbmlzaF9jb21wcmVzcyhKU3RhdGUodGlmKSkpOworfQorCitzdGF0aWMgdm9pZAorSlBFR0NsZWFudXAoVElGRiogdGlmKQoreworCUpQRUdTdGF0ZSAqc3AgPSBKU3RhdGUodGlmKTsKKwkKKwlhc3NlcnQoc3AgIT0gMCk7CisKKwl0aWYtPnRpZl90YWdtZXRob2RzLnZnZXRmaWVsZCA9IHNwLT52Z2V0cGFyZW50OworCXRpZi0+dGlmX3RhZ21ldGhvZHMudnNldGZpZWxkID0gc3AtPnZzZXRwYXJlbnQ7CisJdGlmLT50aWZfdGFnbWV0aG9kcy5wcmludGRpciA9IHNwLT5wcmludGRpcjsKKyAgICAgICAgaWYoIHNwLT5jaW5mb19pbml0aWFsaXplZCApCisgICAgICAgICAgICAgICAgVElGRmpwZWdfZGVzdHJveShzcCk7CS8qIHJlbGVhc2UgbGlianBlZyByZXNvdXJjZXMgKi8KKyAgICAgICAgaWYgKHNwLT5qcGVndGFibGVzKQkJLyogdGFnIHZhbHVlICovCisgICAgICAgICAgICAgICAgX1RJRkZmcmVlKHNwLT5qcGVndGFibGVzKTsKKwlfVElGRmZyZWUodGlmLT50aWZfZGF0YSk7CS8qIHJlbGVhc2UgbG9jYWwgc3RhdGUgKi8KKwl0aWYtPnRpZl9kYXRhID0gTlVMTDsKKworCV9USUZGU2V0RGVmYXVsdENvbXByZXNzaW9uU3RhdGUodGlmKTsKK30KKworc3RhdGljIHZvaWQgCitKUEVHUmVzZXRVcHNhbXBsZWQoIFRJRkYqIHRpZiApCit7CisJSlBFR1N0YXRlKiBzcCA9IEpTdGF0ZSh0aWYpOworCVRJRkZEaXJlY3RvcnkqIHRkID0gJnRpZi0+dGlmX2RpcjsKKworCS8qCisJICogTWFyayB3aGV0aGVyIHJldHVybmVkIGRhdGEgaXMgdXAtc2FtcGxlZCBvciBub3Qgc28gVElGRlN0cmlwU2l6ZQorCSAqIGFuZCBUSUZGVGlsZVNpemUgcmV0dXJuIHZhbHVlcyB0aGF0IHJlZmxlY3QgdGhlIHRydWUgYW1vdW50IG9mCisJICogZGF0YS4KKwkgKi8KKwl0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9VUFNBTVBMRUQ7CisJaWYgKHRkLT50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX0NPTlRJRykgeworCQlpZiAodGQtPnRkX3Bob3RvbWV0cmljID09IFBIT1RPTUVUUklDX1lDQkNSICYmCisJCSAgICBzcC0+anBlZ2NvbG9ybW9kZSA9PSBKUEVHQ09MT1JNT0RFX1JHQikgeworCQkJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9VUFNBTVBMRUQ7CisJCX0gZWxzZSB7CisjaWZkZWYgbm90ZGVmCisJCQlpZiAodGQtPnRkX3ljYmNyc3Vic2FtcGxpbmdbMF0gIT0gMSB8fAorCQkJICAgIHRkLT50ZF95Y2JjcnN1YnNhbXBsaW5nWzFdICE9IDEpCisJCQkJOyAvKiBYWFggd2hhdCBhYm91dCB1cC1zYW1wbGluZz8gKi8KKyNlbmRpZgorCQl9CisJfQorCisJLyoKKwkgKiBNdXN0IHJlY2FsY3VsYXRlIGNhY2hlZCB0aWxlIHNpemUgaW4gY2FzZSBzYW1wbGluZyBzdGF0ZSBjaGFuZ2VkLgorCSAqIFNob3VsZCB3ZSByZWFsbHkgYmUgZG9pbmcgdGhpcyBub3cgaWYgaW1hZ2Ugc2l6ZSBpc24ndCBzZXQ/IAorCSAqLworICAgICAgICBpZiggdGlmLT50aWZfdGlsZXNpemUgPiAwICkKKyAgICAgICAgICAgIHRpZi0+dGlmX3RpbGVzaXplID0gaXNUaWxlZCh0aWYpID8gVElGRlRpbGVTaXplKHRpZikgOiAodG1zaXplX3QpKC0xKTsgICAKKyAgICAgICAgaWYoIHRpZi0+dGlmX3NjYW5saW5lc2l6ZSA+IDAgKQorICAgICAgICAgICAgdGlmLT50aWZfc2NhbmxpbmVzaXplID0gVElGRlNjYW5saW5lU2l6ZSh0aWYpOyAKK30KKworc3RhdGljIGludAorSlBFR1ZTZXRGaWVsZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcsIHZhX2xpc3QgYXApCit7CisJSlBFR1N0YXRlKiBzcCA9IEpTdGF0ZSh0aWYpOworCWNvbnN0IFRJRkZGaWVsZCogZmlwOworCXVpbnQzMiB2MzI7CisKKwlhc3NlcnQoc3AgIT0gTlVMTCk7CisKKwlzd2l0Y2ggKHRhZykgeworCWNhc2UgVElGRlRBR19KUEVHVEFCTEVTOgorCQl2MzIgPSAodWludDMyKSB2YV9hcmcoYXAsIHVpbnQzMik7CisJCWlmICh2MzIgPT0gMCkgeworCQkJLyogWFhYICovCisJCQlyZXR1cm4gKDApOworCQl9CisJCV9USUZGc2V0Qnl0ZUFycmF5KCZzcC0+anBlZ3RhYmxlcywgdmFfYXJnKGFwLCB2b2lkKiksCisJCSAgICAobG9uZykgdjMyKTsKKwkJc3AtPmpwZWd0YWJsZXNfbGVuZ3RoID0gdjMyOworCQlUSUZGU2V0RmllbGRCaXQodGlmLCBGSUVMRF9KUEVHVEFCTEVTKTsKKwkJYnJlYWs7CisJY2FzZSBUSUZGVEFHX0pQRUdRVUFMSVRZOgorCQlzcC0+anBlZ3F1YWxpdHkgPSAoaW50KSB2YV9hcmcoYXAsIGludCk7CisJCXJldHVybiAoMSk7CQkJLyogcHNldWRvIHRhZyAqLworCWNhc2UgVElGRlRBR19KUEVHQ09MT1JNT0RFOgorCQlzcC0+anBlZ2NvbG9ybW9kZSA9IChpbnQpIHZhX2FyZyhhcCwgaW50KTsKKwkJSlBFR1Jlc2V0VXBzYW1wbGVkKCB0aWYgKTsKKwkJcmV0dXJuICgxKTsJCQkvKiBwc2V1ZG8gdGFnICovCisJY2FzZSBUSUZGVEFHX1BIT1RPTUVUUklDOgorCXsKKwkJaW50IHJldF92YWx1ZSA9ICgqc3AtPnZzZXRwYXJlbnQpKHRpZiwgdGFnLCBhcCk7CisJCUpQRUdSZXNldFVwc2FtcGxlZCggdGlmICk7CisJCXJldHVybiByZXRfdmFsdWU7CisJfQorCWNhc2UgVElGRlRBR19KUEVHVEFCTEVTTU9ERToKKwkJc3AtPmpwZWd0YWJsZXNtb2RlID0gKGludCkgdmFfYXJnKGFwLCBpbnQpOworCQlyZXR1cm4gKDEpOwkJCS8qIHBzZXVkbyB0YWcgKi8KKwljYXNlIFRJRkZUQUdfWUNCQ1JTVUJTQU1QTElORzoKKwkJLyogbWFyayB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgYSByZWFsIHljYmNyc3Vic2FtcGxpbmchICovCisJCXNwLT55Y2JjcnNhbXBsaW5nX2ZldGNoZWQgPSAxOworCQkvKiBzaG91bGQgd2UgYmUgcmVjb21wdXRpbmcgdXBzYW1wbGluZyBpbmZvIGhlcmU/ICovCisJCXJldHVybiAoKnNwLT52c2V0cGFyZW50KSh0aWYsIHRhZywgYXApOworCWRlZmF1bHQ6CisJCXJldHVybiAoKnNwLT52c2V0cGFyZW50KSh0aWYsIHRhZywgYXApOworCX0KKworCWlmICgoZmlwID0gVElGRkZpZWxkV2l0aFRhZyh0aWYsIHRhZykpKSB7CisJCVRJRkZTZXRGaWVsZEJpdCh0aWYsIGZpcC0+ZmllbGRfYml0KTsKKwl9IGVsc2UgeworCQlyZXR1cm4gKDApOworCX0KKworCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfRElSVFlESVJFQ1Q7CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIGludAorSlBFR1ZHZXRGaWVsZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcsIHZhX2xpc3QgYXApCit7CisJSlBFR1N0YXRlKiBzcCA9IEpTdGF0ZSh0aWYpOworCisJYXNzZXJ0KHNwICE9IE5VTEwpOworCisJc3dpdGNoICh0YWcpIHsKKwkJY2FzZSBUSUZGVEFHX0pQRUdUQUJMRVM6CisJCQkqdmFfYXJnKGFwLCB1aW50MzIqKSA9IHNwLT5qcGVndGFibGVzX2xlbmd0aDsKKwkJCSp2YV9hcmcoYXAsIHZvaWQqKikgPSBzcC0+anBlZ3RhYmxlczsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfSlBFR1FVQUxJVFk6CisJCQkqdmFfYXJnKGFwLCBpbnQqKSA9IHNwLT5qcGVncXVhbGl0eTsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfSlBFR0NPTE9STU9ERToKKwkJCSp2YV9hcmcoYXAsIGludCopID0gc3AtPmpwZWdjb2xvcm1vZGU7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX0pQRUdUQUJMRVNNT0RFOgorCQkJKnZhX2FyZyhhcCwgaW50KikgPSBzcC0+anBlZ3RhYmxlc21vZGU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAoKnNwLT52Z2V0cGFyZW50KSh0aWYsIHRhZywgYXApOworCX0KKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgdm9pZAorSlBFR1ByaW50RGlyKFRJRkYqIHRpZiwgRklMRSogZmQsIGxvbmcgZmxhZ3MpCit7CisJSlBFR1N0YXRlKiBzcCA9IEpTdGF0ZSh0aWYpOworCisJYXNzZXJ0KHNwICE9IE5VTEwpOworCSh2b2lkKSBmbGFnczsKKworICAgICAgICBpZiggc3AgIT0gTlVMTCApIHsKKwkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfSlBFR1RBQkxFUykpCisJCQlmcHJpbnRmKGZkLCAiICBKUEVHIFRhYmxlczogKCVsdSBieXRlcylcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpIHNwLT5qcGVndGFibGVzX2xlbmd0aCk7CisJCWlmIChzcC0+cHJpbnRkaXIpCisJCQkoKnNwLT5wcmludGRpcikodGlmLCBmZCwgZmxhZ3MpOworCX0KK30KKworc3RhdGljIHVpbnQzMgorSlBFR0RlZmF1bHRTdHJpcFNpemUoVElGRiogdGlmLCB1aW50MzIgcykKK3sKKwlKUEVHU3RhdGUqIHNwID0gSlN0YXRlKHRpZik7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCisJcyA9ICgqc3AtPmRlZnNwYXJlbnQpKHRpZiwgcyk7CisJaWYgKHMgPCB0ZC0+dGRfaW1hZ2VsZW5ndGgpCisJCXMgPSBUSUZGcm91bmR1cF8zMihzLCB0ZC0+dGRfeWNiY3JzdWJzYW1wbGluZ1sxXSAqIERDVFNJWkUpOworCXJldHVybiAocyk7Cit9CisKK3N0YXRpYyB2b2lkCitKUEVHRGVmYXVsdFRpbGVTaXplKFRJRkYqIHRpZiwgdWludDMyKiB0dywgdWludDMyKiB0aCkKK3sKKwlKUEVHU3RhdGUqIHNwID0gSlN0YXRlKHRpZik7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCisJKCpzcC0+ZGVmdHBhcmVudCkodGlmLCB0dywgdGgpOworCSp0dyA9IFRJRkZyb3VuZHVwXzMyKCp0dywgdGQtPnRkX3ljYmNyc3Vic2FtcGxpbmdbMF0gKiBEQ1RTSVpFKTsKKwkqdGggPSBUSUZGcm91bmR1cF8zMigqdGgsIHRkLT50ZF95Y2JjcnN1YnNhbXBsaW5nWzFdICogRENUU0laRSk7Cit9CisKKy8qCisgKiBUaGUgSlBFRyBsaWJyYXJ5IGluaXRpYWxpemVkIHVzZWQgdG8gYmUgZG9uZSBpbiBUSUZGSW5pdEpQRUcoKSwgYnV0CisgKiBub3cgdGhhdCB3ZSBhbGxvdyBhIFRJRkYgZmlsZSB0byBiZSBvcGVuZWQgaW4gdXBkYXRlIG1vZGUgaXQgaXMgbmVjZXNzYXJ5CisgKiB0byBoYXZlIHNvbWUgd2F5IG9mIGRlY2lkaW5nIHdoZXRoZXIgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBpcworICogZGVzaXJlZCBvdGhlciB0aGFuIGxvb2tpbmcgYXQgdGlmLT50aWZfbW9kZS4gIFdlIGFjY29tcGxpc2ggdGhpcyBieSAKKyAqIGV4YW1pbmluZyB7VElMRS9TVFJJUH1CWVRFQ09VTlRTIHRvIHNlZSBpZiB0aGVyZSBpcyBhIG5vbi16ZXJvIGVudHJ5LgorICogSWYgc28sIHdlIGFzc3VtZSBkZWNvbXByZXNzaW9uIGlzIGRlc2lyZWQuIAorICoKKyAqIFRoaXMgaXMgdHJpY2t5LCBiZWNhdXNlIFRJRkZJbml0SlBFRygpIGlzIGNhbGxlZCB3aGlsZSB0aGUgZGlyZWN0b3J5IGlzCisgKiBiZWluZyByZWFkLCBhbmQgZ2VuZXJhbGx5IHNwZWFraW5nIHRoZSBCWVRFQ09VTlRTIHRhZyB3b24ndCBoYXZlIGJlZW4gcmVhZAorICogYXQgdGhhdCBwb2ludC4gIFNvIHdlIHRyeSB0byBkZWZlciBqcGVnIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gdGlsbCB3ZQorICogZG8gaGF2ZSB0aGF0IHRhZyAuLi4gYmFzaWNhbGx5IGFueSBhY2Nlc3MgdGhhdCBtaWdodCByZXF1aXJlIHRoZSBjb21wcmVzc29yCisgKiBvciBkZWNvbXByZXNzb3IgdGhhdCBvY2N1cnMgYWZ0ZXIgdGhlIHJlYWRpbmcgb2YgdGhlIGRpcmVjdG9yeS4gCisgKgorICogSW4gYW4gaWRlYWwgd29ybGQgY29tcHJlc3NvcnMgb3IgZGVjb21wcmVzc29ycyB3b3VsZCBiZSBzZXR1cAorICogYXQgdGhlIHBvaW50IHdoZXJlIGEgc2luZ2xlIHRpbGUgb3Igc3RyaXAgd2FzIGFjY2Vzc2VkIChmb3IgcmVhZCBvciB3cml0ZSkKKyAqIHNvIHRoYXQgc3R1ZmYgbGlrZSB1cGRhdGUgb2YgbWlzc2luZyB0aWxlcywgb3IgcmVwbGFjZW1lbnQgb2YgdGlsZXMgY291bGQKKyAqIGJlIGRvbmUuIEhvd2V2ZXIsIHdlIGFyZW4ndCB0cnlpbmcgdG8gY3JhY2sgdGhhdCBudXQganVzdCB5ZXQgLi4uCisgKgorICogTkZXLCBGZWIgM3JkLCAyMDAzLgorICovCisKK3N0YXRpYyBpbnQgSlBFR0luaXRpYWxpemVMaWJKUEVHKCBUSUZGICogdGlmLCBpbnQgZGVjb21wcmVzcyApCit7CisgICAgSlBFR1N0YXRlKiBzcCA9IEpTdGF0ZSh0aWYpOworCisgICAgaWYoc3AtPmNpbmZvX2luaXRpYWxpemVkKQorICAgIHsKKyAgICAgICAgaWYoICFkZWNvbXByZXNzICYmIHNwLT5jaW5mby5jb21tLmlzX2RlY29tcHJlc3NvciApCisgICAgICAgICAgICBUSUZGanBlZ19kZXN0cm95KCBzcCApOworICAgICAgICBlbHNlIGlmKCBkZWNvbXByZXNzICYmICFzcC0+Y2luZm8uY29tbS5pc19kZWNvbXByZXNzb3IgKQorICAgICAgICAgICAgVElGRmpwZWdfZGVzdHJveSggc3AgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgc3AtPmNpbmZvX2luaXRpYWxpemVkID0gMDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpemUgbGlianBlZy4KKyAgICAgKi8KKyAgICBpZiAoIGRlY29tcHJlc3MgKSB7CisgICAgICAgIGlmICghVElGRmpwZWdfY3JlYXRlX2RlY29tcHJlc3Moc3ApKQorICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIVRJRkZqcGVnX2NyZWF0ZV9jb21wcmVzcyhzcCkpCisgICAgICAgICAgICByZXR1cm4gKDApOworICAgIH0KKworICAgIHNwLT5jaW5mb19pbml0aWFsaXplZCA9IFRSVUU7CisKKyAgICByZXR1cm4gMTsKK30KKworaW50CitUSUZGSW5pdEpQRUcoVElGRiogdGlmLCBpbnQgc2NoZW1lKQoreworCUpQRUdTdGF0ZSogc3A7CisKKwlhc3NlcnQoc2NoZW1lID09IENPTVBSRVNTSU9OX0pQRUcpOworCisJLyoKKwkgKiBNZXJnZSBjb2RlYy1zcGVjaWZpYyB0YWcgaW5mb3JtYXRpb24uCisJICovCisJaWYgKCFfVElGRk1lcmdlRmllbGRzKHRpZiwganBlZ0ZpZWxkcywgVElGRkFycmF5Q291bnQoanBlZ0ZpZWxkcykpKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLAorCQkJICAgICAiVElGRkluaXRKUEVHIiwKKwkJCSAgICAgIk1lcmdpbmcgSlBFRyBjb2RlYy1zcGVjaWZpYyB0YWdzIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIEFsbG9jYXRlIHN0YXRlIGJsb2NrIHNvIHRhZyBtZXRob2RzIGhhdmUgc3RvcmFnZSB0byByZWNvcmQgdmFsdWVzLgorCSAqLworCXRpZi0+dGlmX2RhdGEgPSAodWludDgqKSBfVElGRm1hbGxvYyhzaXplb2YgKEpQRUdTdGF0ZSkpOworCisJaWYgKHRpZi0+dGlmX2RhdGEgPT0gTlVMTCkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwKKwkJCSAgICAgIlRJRkZJbml0SlBFRyIsICJObyBzcGFjZSBmb3IgSlBFRyBzdGF0ZSBibG9jayIpOworCQlyZXR1cm4gMDsKKwl9CisgICAgICAgIF9USUZGbWVtc2V0KHRpZi0+dGlmX2RhdGEsIDAsIHNpemVvZihKUEVHU3RhdGUpKTsKKworCXNwID0gSlN0YXRlKHRpZik7CisJc3AtPnRpZiA9IHRpZjsJCQkJLyogYmFjayBsaW5rICovCisKKwkvKgorCSAqIE92ZXJyaWRlIHBhcmVudCBnZXQvc2V0IGZpZWxkIG1ldGhvZHMuCisJICovCisJc3AtPnZnZXRwYXJlbnQgPSB0aWYtPnRpZl90YWdtZXRob2RzLnZnZXRmaWVsZDsKKwl0aWYtPnRpZl90YWdtZXRob2RzLnZnZXRmaWVsZCA9IEpQRUdWR2V0RmllbGQ7IC8qIGhvb2sgZm9yIGNvZGVjIHRhZ3MgKi8KKwlzcC0+dnNldHBhcmVudCA9IHRpZi0+dGlmX3RhZ21ldGhvZHMudnNldGZpZWxkOworCXRpZi0+dGlmX3RhZ21ldGhvZHMudnNldGZpZWxkID0gSlBFR1ZTZXRGaWVsZDsgLyogaG9vayBmb3IgY29kZWMgdGFncyAqLworCXNwLT5wcmludGRpciA9IHRpZi0+dGlmX3RhZ21ldGhvZHMucHJpbnRkaXI7CisJdGlmLT50aWZfdGFnbWV0aG9kcy5wcmludGRpciA9IEpQRUdQcmludERpcjsgICAvKiBob29rIGZvciBjb2RlYyB0YWdzICovCisKKwkvKiBEZWZhdWx0IHZhbHVlcyBmb3IgY29kZWMtc3BlY2lmaWMgZmllbGRzICovCisJc3AtPmpwZWd0YWJsZXMgPSBOVUxMOworCXNwLT5qcGVndGFibGVzX2xlbmd0aCA9IDA7CisJc3AtPmpwZWdxdWFsaXR5ID0gNzU7CQkJLyogRGVmYXVsdCBJSkcgcXVhbGl0eSAqLworCXNwLT5qcGVnY29sb3Jtb2RlID0gSlBFR0NPTE9STU9ERV9SQVc7CisJc3AtPmpwZWd0YWJsZXNtb2RlID0gSlBFR1RBQkxFU01PREVfUVVBTlQgfCBKUEVHVEFCTEVTTU9ERV9IVUZGOworICAgICAgICBzcC0+eWNiY3JzYW1wbGluZ19mZXRjaGVkID0gMDsKKworCS8qCisJICogSW5zdGFsbCBjb2RlYyBtZXRob2RzLgorCSAqLworCXRpZi0+dGlmX2ZpeHVwdGFncyA9IEpQRUdGaXh1cFRhZ3M7CisJdGlmLT50aWZfc2V0dXBkZWNvZGUgPSBKUEVHU2V0dXBEZWNvZGU7CisJdGlmLT50aWZfcHJlZGVjb2RlID0gSlBFR1ByZURlY29kZTsKKwl0aWYtPnRpZl9kZWNvZGVyb3cgPSBKUEVHRGVjb2RlOworCXRpZi0+dGlmX2RlY29kZXN0cmlwID0gSlBFR0RlY29kZTsKKwl0aWYtPnRpZl9kZWNvZGV0aWxlID0gSlBFR0RlY29kZTsKKwl0aWYtPnRpZl9zZXR1cGVuY29kZSA9IEpQRUdTZXR1cEVuY29kZTsKKwl0aWYtPnRpZl9wcmVlbmNvZGUgPSBKUEVHUHJlRW5jb2RlOworCXRpZi0+dGlmX3Bvc3RlbmNvZGUgPSBKUEVHUG9zdEVuY29kZTsKKwl0aWYtPnRpZl9lbmNvZGVyb3cgPSBKUEVHRW5jb2RlOworCXRpZi0+dGlmX2VuY29kZXN0cmlwID0gSlBFR0VuY29kZTsKKwl0aWYtPnRpZl9lbmNvZGV0aWxlID0gSlBFR0VuY29kZTsgIAorCXRpZi0+dGlmX2NsZWFudXAgPSBKUEVHQ2xlYW51cDsKKwlzcC0+ZGVmc3BhcmVudCA9IHRpZi0+dGlmX2RlZnN0cmlwc2l6ZTsKKwl0aWYtPnRpZl9kZWZzdHJpcHNpemUgPSBKUEVHRGVmYXVsdFN0cmlwU2l6ZTsKKwlzcC0+ZGVmdHBhcmVudCA9IHRpZi0+dGlmX2RlZnRpbGVzaXplOworCXRpZi0+dGlmX2RlZnRpbGVzaXplID0gSlBFR0RlZmF1bHRUaWxlU2l6ZTsKKwl0aWYtPnRpZl9mbGFncyB8PSBUSUZGX05PQklUUkVWOwkvKiBubyBiaXQgcmV2ZXJzYWwsIHBsZWFzZSAqLworCisgICAgICAgIHNwLT5jaW5mb19pbml0aWFsaXplZCA9IEZBTFNFOworCisJLyoKKyAgICAgICAgKiogQ3JlYXRlIGEgSlBFR1RhYmxlcyBmaWVsZCBpZiBubyBkaXJlY3RvcnkgaGFzIHlldCBiZWVuIGNyZWF0ZWQuIAorICAgICAgICAqKiBXZSBkbyB0aGlzIGp1c3QgdG8gZW5zdXJlIHRoYXQgc3VmZmljaWVudCBzcGFjZSBpcyByZXNlcnZlZCBmb3IKKyAgICAgICAgKiogdGhlIEpQRUdUYWJsZXMgZmllbGQuICBJdCB3aWxsIGJlIHByb3Blcmx5IGNyZWF0ZWQgdGhlIHJpZ2h0CisgICAgICAgICoqIHNpemUgbGF0ZXIuIAorICAgICAgICAqLworICAgICAgICBpZiggdGlmLT50aWZfZGlyb2ZmID09IDAgKQorICAgICAgICB7CisjZGVmaW5lIFNJWkVfT0ZfSlBFR1RBQkxFUyAyMDAwCisvKgorVGhlIGZvbGxvd2luZyBsaW5lIGFzc3VtZXMgaW5jb3JyZWN0bHkgdGhhdCBhbGwgSlBFRy1pbi1USUZGIGZpbGVzIHdpbGwgaGF2ZQorYSBKUEVHVEFCTEVTIHRhZyBnZW5lcmF0ZWQgYW5kIGNhdXNlcyBudWxsLWZpbGxlZCBKUEVHVEFCTEVTIHRhZ3MgdG8gYmUgd3JpdHRlbgord2hlbiB0aGUgSlBFRyBkYXRhIGlzIHBsYWNlZCB3aXRoIFRJRkZXcml0ZVJhd1N0cmlwLiAgVGhlIGZpZWxkIGJpdCBzaG91bGQgYmUgCitzZXQsIGFueXdheSwgbGF0ZXIgd2hlbiBhY3R1YWwgSlBFR1RBQkxFUyBoZWFkZXIgaXMgZ2VuZXJhdGVkLCBzbyByZW1vdmluZyBpdCAKK2hlcmUgaG9wZWZ1bGx5IGlzIGhhcm1sZXNzLgorICAgICAgICAgICAgVElGRlNldEZpZWxkQml0KHRpZiwgRklFTERfSlBFR1RBQkxFUyk7CisqLworICAgICAgICAgICAgc3AtPmpwZWd0YWJsZXNfbGVuZ3RoID0gU0laRV9PRl9KUEVHVEFCTEVTOworICAgICAgICAgICAgc3AtPmpwZWd0YWJsZXMgPSAodm9pZCAqKSBfVElGRm1hbGxvYyhzcC0+anBlZ3RhYmxlc19sZW5ndGgpOworICAgICAgICAgICAgaWYgKHNwLT5qcGVndGFibGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9USUZGbWVtc2V0KHNwLT5qcGVndGFibGVzLCAwLCBTSVpFX09GX0pQRUdUQUJMRVMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLAorCQkJICAgICAiVElGRkluaXRKUEVHIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEpQRUcgdGFibGVzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisjdW5kZWYgU0laRV9PRl9KUEVHVEFCTEVTCisgICAgICAgIH0KKworCXJldHVybiAxOworfQorI2VuZGlmIC8qIEpQRUdfU1VQUE9SVCAqLworCisvKiB2aW06IHNldCB0cz04IHN0cz04IHN3PTggbm9ldDogKi8KKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfbHV2LmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9sdXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTMyOGJhCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfbHV2LmMKQEAgLTAsMCArMSwxNjk3IEBACisvKiAkSWQ6IHRpZl9sdXYuYyx2IDEuNDAgMjAxNS0wNi0yMSAwMTowOTowOSBiZnJpZXNlbiBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk3IEdyZWcgV2FyZCBMYXJzb24KKyAqIENvcHlyaWdodCAoYykgMTk5NyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgKiB0aGF0IChpKSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisgKiBhbGwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uLCBhbmQgKGlpKSB0aGUgbmFtZXMgb2YKKyAqIFNhbSBMZWZmbGVyLCBHcmVnIExhcnNvbiBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55CisgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLAorICogcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyLCBHcmVnIExhcnNvbiBhbmQgU2lsaWNvbiBHcmFwaGljcy4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSAKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTQU0gTEVGRkxFUiwgR1JFRyBMQVJTT04gT1IgU0lMSUNPTiBHUkFQSElDUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELAorICogT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorICogV0hFVEhFUiBPUiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRiAKKyAqIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgCisgKiBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJ0aWZmaW9wLmgiCisjaWZkZWYgTE9HTFVWX1NVUFBPUlQKKworLyoKKyAqIFRJRkYgTGlicmFyeS4KKyAqIExvZ0x1diBjb21wcmVzc2lvbiBzdXBwb3J0IGZvciBoaWdoIGR5bmFtaWMgcmFuZ2UgaW1hZ2VzLgorICoKKyAqIENvbnRyaWJ1dGVkIGJ5IEdyZWcgTGFyc29uLgorICoKKyAqIExvZ0x1diBpbWFnZSBzdXBwb3J0IHVzZXMgdGhlIFRJRkYgbGlicmFyeSB0byBzdG9yZSAxNiBvciAxMC1iaXQKKyAqIGxvZyBsdW1pbmFuY2UgdmFsdWVzIHdpdGggOCBiaXRzIGVhY2ggb2YgdSBhbmQgdiBvciBhIDE0LWJpdCBpbmRleC4KKyAqCisgKiBUaGUgY29kZWMgY2FuIHRha2UgYXMgaW5wdXQgYW5kIHByb2R1Y2UgYXMgb3V0cHV0IDMyLWJpdCBJRUVFIGZsb2F0IHZhbHVlcyAKKyAqIGFzIHdlbGwgYXMgMTYtYml0IGludGVnZXIgdmFsdWVzLiAgQSAxNi1iaXQgbHVtaW5hbmNlIGlzIGludGVycHJldGVkCisgKiBhcyBhIHNpZ24gYml0IGZvbGxvd2VkIGJ5IGEgMTUtYml0IGludGVnZXIgdGhhdCBpcyBjb252ZXJ0ZWQKKyAqIHRvIGFuZCBmcm9tIGEgbGluZWFyIG1hZ25pdHVkZSB1c2luZyB0aGUgdHJhbnNmb3JtYXRpb246CisgKgorICoJTCA9IDJeKCAoTGUrLjUpLzI1NiAtIDY0ICkJCSMgcmVhbCBmcm9tIDE1LWJpdAorICoKKyAqCUxlID0gZmxvb3IoIDI1NioobG9nMihMKSArIDY0KSApCSMgMTUtYml0IGZyb20gcmVhbAorICoKKyAqIFRoZSBhY3R1YWwgY29udmVyc2lvbiB0byB3b3JsZCBsdW1pbmFuY2UgdW5pdHMgaW4gY2FuZGVsYXMgcGVyIHNxLiBtZXRlcgorICogcmVxdWlyZXMgYW4gYWRkaXRpb25hbCBtdWx0aXBsaWVyLCB3aGljaCBpcyBzdG9yZWQgaW4gdGhlIFRJRkZUQUdfU1RPTklUUy4KKyAqIFRoaXMgdmFsdWUgaXMgdXN1YWxseSBzZXQgc3VjaCB0aGF0IGEgcmVhc29uYWJsZSBleHBvc3VyZSBjb21lcyBmcm9tCisgKiBjbGFtcGluZyBkZWNvZGVkIGx1bWluYW5jZXMgYWJvdmUgMSB0byAxIGluIHRoZSBkaXNwbGF5ZWQgaW1hZ2UuCisgKgorICogVGhlIDE2LWJpdCB2YWx1ZXMgZm9yIHUgYW5kIHYgbWF5IGJlIGNvbnZlcnRlZCB0byByZWFsIHZhbHVlcyBieSBkaXZpZGluZworICogZWFjaCBieSAzMjc2OC4gIChUaGlzIGFsbG93cyBmb3IgbmVnYXRpdmUgdmFsdWVzLCB3aGljaCBhcmVuJ3QgdXNlZnVsIGFzCisgKiBmYXIgYXMgd2Uga25vdywgYnV0IGFyZSBsZWZ0IGluIGNhc2Ugb2YgZnV0dXJlIGltcHJvdmVtZW50cyBpbiBodW1hbgorICogY29sb3IgdmlzaW9uLikKKyAqCisgKiBDb252ZXJzaW9uIGZyb20gKHUsdiksIHdoaWNoIGlzIGFjdHVhbGx5IHRoZSBDSUUgKHUnLHYnKSBzeXN0ZW0gZm9yCisgKiB5b3UgY29sb3Igc2NpZW50aXN0cywgaXMgYWNjb21wbGlzaGVkIGJ5IHRoZSBmb2xsb3dpbmcgdHJhbnNmb3JtYXRpb246CisgKgorICoJdSA9IDQqeCAvICgtMip4ICsgMTIqeSArIDMpCisgKgl2ID0gOSp5IC8gKC0yKnggKyAxMip5ICsgMykKKyAqCisgKgl4ID0gOSp1IC8gKDYqdSAtIDE2KnYgKyAxMikKKyAqCXkgPSA0KnYgLyAoNip1IC0gMTYqdiArIDEyKQorICoKKyAqIFRoaXMgcHJvY2VzcyBpcyBncmVhdGx5IHNpbXBsaWZpZWQgYnkgcGFzc2luZyAzMi1iaXQgSUVFRSBmbG9hdHMKKyAqIGZvciBlYWNoIG9mIHRocmVlIENJRSBYWVogY29vcmRpbmF0ZXMuICBUaGUgY29kZWMgdGhlbiB0YWtlcyBjYXJlCisgKiBvZiBjb252ZXJzaW9uIHRvIGFuZCBmcm9tIExvZ0x1diwgdGhvdWdoIHRoZSBhcHBsaWNhdGlvbiBpcyBzdGlsbAorICogcmVzcG9uc2libGUgZm9yIGludGVycHJldGluZyB0aGUgVElGRlRBR19TVE9OSVRTIGNhbGlicmF0aW9uIGZhY3Rvci4KKyAqCisgKiBCeSBkZWZpbml0aW9uLCBhIENJRSBYWVogdmVjdG9yIG9mIFsxIDEgMV0gY29ycmVzcG9uZHMgdG8gYSBuZXV0cmFsIHdoaXRlCisgKiBwb2ludCBvZiAoeCx5KT0oMS8zLDEvMykuICBIb3dldmVyLCBtb3N0IGNvbG9yIHN5c3RlbXMgYXNzdW1lIHNvbWUgb3RoZXIKKyAqIHdoaXRlIHBvaW50LCBzdWNoIGFzIEQ2NSwgYW5kIGFuIGFic29sdXRlIGNvbG9yIGNvbnZlcnNpb24gdG8gWFlaIHRoZW4KKyAqIHRvIGFub3RoZXIgY29sb3Igc3BhY2Ugd2l0aCBhIGRpZmZlcmVudCB3aGl0ZSBwb2ludCBtYXkgaW50cm9kdWNlIGFuCisgKiB1bndhbnRlZCBjb2xvciBjYXN0IHRvIHRoZSBpbWFnZS4gIEl0IGlzIG9mdGVuIGRlc2lyYWJsZSwgdGhlcmVmb3JlLCB0bworICogcGVyZm9ybSBhIHdoaXRlIHBvaW50IGNvbnZlcnNpb24gdGhhdCBtYXBzIHRoZSBpbnB1dCB3aGl0ZSB0byBbMSAxIDFdCisgKiBpbiBYWVosIHRoZW4gcmVjb3JkIHRoZSBvcmlnaW5hbCB3aGl0ZSBwb2ludCB1c2luZyB0aGUgVElGRlRBR19XSElURVBPSU5UCisgKiB0YWcgdmFsdWUuICBBIGRlY29kZXIgdGhhdCBkZW1hbmRzIGFic29sdXRlIGNvbG9yIGNhbGlicmF0aW9uIG1heSB1c2UKKyAqIHRoaXMgd2hpdGUgcG9pbnQgdGFnIHRvIGdldCBiYWNrIHRoZSBvcmlnaW5hbCBjb2xvcnMsIGJ1dCB1c3VhbGx5IGl0CisgKiB3aWxsIGJlIGlnbm9yZWQgYW5kIHRoZSBuZXcgd2hpdGUgcG9pbnQgd2lsbCBiZSB1c2VkIGluc3RlYWQgdGhhdAorICogbWF0Y2hlcyB0aGUgb3V0cHV0IGNvbG9yIHNwYWNlLgorICoKKyAqIFBpeGVsIGluZm9ybWF0aW9uIGlzIGNvbXByZXNzZWQgaW50byBvbmUgb2YgdHdvIGJhc2ljIGVuY29kaW5ncywgZGVwZW5kaW5nCisgKiBvbiB0aGUgc2V0dGluZyBvZiB0aGUgY29tcHJlc3Npb24gdGFnLCB3aGljaCBpcyBvbmUgb2YgQ09NUFJFU1NJT05fU0dJTE9HCisgKiBvciBDT01QUkVTU0lPTl9TR0lMT0cyNC4gIEZvciBDT01QUkVTU0lPTl9TR0lMT0csIGdyZXlzY2FsZSBkYXRhIGlzCisgKiBzdG9yZWQgYXM6CisgKgorICoJIDEgICAgICAgMTUKKyAqCXwtKy0tLS0tLS0tLS0tLS0tLXwKKyAqCisgKiBDT01QUkVTU0lPTl9TR0lMT0cgY29sb3IgZGF0YSBpcyBzdG9yZWQgYXM6CisgKgorICoJIDEgICAgICAgMTUgICAgICAgICAgIDggICAgICAgIDgKKyAqCXwtKy0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLSstLS0tLS0tLXwKKyAqCSBTICAgICAgIExlICAgICAgICAgICB1ZSAgICAgICB2ZQorICoKKyAqIEZvciB0aGUgMjQtYml0IENPTVBSRVNTSU9OX1NHSUxPRzI0IGNvbG9yIGZvcm1hdCwgdGhlIGRhdGEgaXMgc3RvcmVkIGFzOgorICoKKyAqCSAgICAgMTAgICAgICAgICAgIDE0CisgKgl8LS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwKKyAqCSAgICAgTGUnICAgICAgICAgIENlCisgKgorICogVGhlcmUgaXMgbm8gc2lnbiBiaXQgaW4gdGhlIDI0LWJpdCBjYXNlLCBhbmQgdGhlICh1LHYpIGNocm9tYXRpY2l0eSBpcworICogZW5jb2RlZCBhcyBhbiBpbmRleCBmb3Igb3B0aW1hbCBjb2xvciByZXNvbHV0aW9uLiAgVGhlIDEwIGxvZyBiaXRzIGFyZQorICogZGVmaW5lZCBieSB0aGUgZm9sbG93aW5nIGNvbnZlcnNpb25zOgorICoKKyAqCUwgPSAyXigoTGUnKy41KS82NCAtIDEyKQkJIyByZWFsIGZyb20gMTAtYml0CisgKgorICoJTGUnID0gZmxvb3IoIDY0Kihsb2cyKEwpICsgMTIpICkJIyAxMC1iaXQgZnJvbSByZWFsCisgKgorICogVGhlIDEwIGJpdHMgb2YgdGhlIHNtYWxsZXIgZm9ybWF0IG1heSBiZSBjb252ZXJ0ZWQgaW50byB0aGUgMTUgYml0cyBvZgorICogdGhlIGxhcmdlciBmb3JtYXQgYnkgbXVsdGlwbHlpbmcgYnkgNCBhbmQgYWRkaW5nIDEzMzE0LiAgT2J2aW91c2x5LAorICogYSBzbWFsbGVyIHJhbmdlIG9mIG1hZ25pdHVkZXMgaXMgY292ZXJlZCAoYWJvdXQgNSBvcmRlcnMgb2YgbWFnbml0dWRlCisgKiBpbnN0ZWFkIG9mIDM4KSwgYW5kIHRoZSBsYWNrIG9mIGEgc2lnbiBiaXQgbWVhbnMgdGhhdCBuZWdhdGl2ZSBsdW1pbmFuY2VzCisgKiBhcmUgbm90IGFsbG93ZWQuICAoV2VsbCwgdGhleSBhcmVuJ3QgYWxsb3dlZCBpbiB0aGUgcmVhbCB3b3JsZCwgZWl0aGVyLAorICogYnV0IHRoZXkgYXJlIHVzZWZ1bCBmb3IgY2VydGFpbiB0eXBlcyBvZiBpbWFnZSBwcm9jZXNzaW5nLikKKyAqCisgKiBUaGUgZGVzaXJlZCB1c2VyIGZvcm1hdCBpcyBjb250cm9sbGVkIGJ5IHRoZSBzZXR0aW5nIHRoZSBpbnRlcm5hbAorICogcHNldWRvIHRhZyBUSUZGVEFHX1NHSUxPR0RBVEFGTVQgdG8gb25lIG9mOgorICogIFNHSUxPR0RBVEFGTVRfRkxPQVQgICAgICAgPSBJRUVFIDMyLWJpdCBmbG9hdCBYWVogdmFsdWVzCisgKiAgU0dJTE9HREFUQUZNVF8xNkJJVAkgICAgICA9IDE2LWJpdCBpbnRlZ2VyIGVuY29kaW5ncyBvZiBsb2dMLCB1IGFuZCB2CisgKiBSYXcgZGF0YSBpL28gaXMgYWxzbyBwb3NzaWJsZSB1c2luZzoKKyAqICBTR0lMT0dEQVRBRk1UX1JBVyAgICAgICAgID0gMzItYml0IHVuc2lnbmVkIGludGVnZXIgd2l0aCBlbmNvZGVkIHBpeGVsCisgKiBJbiBhZGRpdGlvbiwgdGhlIGZvbGxvd2luZyBkZWNvZGluZyBpcyBwcm92aWRlZCBmb3IgZWFzZSBvZiBkaXNwbGF5OgorICogIFNHSUxPR0RBVEFGTVRfOEJJVCAgICAgICAgPSA4LWJpdCBkZWZhdWx0IFJHQiBnYW1tYS1jb3JyZWN0ZWQgdmFsdWVzCisgKgorICogRm9yIGdyYXlzY2FsZSBpbWFnZXMsIHdlIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBkYXRhIGZvcm1hdHM6CisgKiAgU0dJTE9HREFUQUZNVF9GTE9BVCAgICAgICA9IElFRUUgMzItYml0IGZsb2F0IFkgdmFsdWVzCisgKiAgU0dJTE9HREFUQUZNVF8xNkJJVCAgICAgICA9IDE2LWJpdCBpbnRlZ2VyIHcvIGVuY29kZWQgbHVtaW5hbmNlCisgKiAgU0dJTE9HREFUQUZNVF84QklUICAgICAgICA9IDgtYml0IGdyYXkgbW9uaXRvciB2YWx1ZXMKKyAqCisgKiBOb3RlIHRoYXQgdGhlIENPTVBSRVNTSU9OX1NHSUxPRyBhcHBsaWVzIGEgc2ltcGxlIHJ1bi1sZW5ndGggZW5jb2RpbmcKKyAqIHNjaGVtZSBieSBzZXBhcmF0aW5nIHRoZSBsb2dMLCB1IGFuZCB2IGJ5dGVzIGZvciBlYWNoIHJvdyBhbmQgYXBwbHlpbmcKKyAqIGEgUGFja0JpdHMgdHlwZSBvZiBjb21wcmVzc2lvbi4gIFNpbmNlIHRoZSAyNC1iaXQgZW5jb2RpbmcgaXMgbm90CisgKiBhZGFwdGl2ZSwgdGhlIDMyLWJpdCBjb2xvciBmb3JtYXQgdGFrZXMgbGVzcyBzcGFjZSBpbiBtYW55IGNhc2VzLgorICoKKyAqIEZ1cnRoZXIgY29udHJvbCBpcyBwcm92aWRlZCBvdmVyIHRoZSBjb252ZXJzaW9uIGZyb20gaGlnaGVyLXJlc29sdXRpb24KKyAqIGZvcm1hdHMgdG8gZmluYWwgZW5jb2RlZCB2YWx1ZXMgdGhyb3VnaCB0aGUgcHNldWRvIHRhZworICogVElGRlRBR19TR0lMT0dFTkNPREU6CisgKiAgU0dJTE9HRU5DT0RFX05PRElUSEVSICAgICA9IGRvIG5vdCBkaXRoZXIgZW5jb2RlZCB2YWx1ZXMKKyAqICBTR0lMT0dFTkNPREVfUkFORElUSEVSICAgID0gYXBwbHkgcmFuZG9tIGRpdGhlcmluZyBkdXJpbmcgZW5jb2RpbmcKKyAqCisgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIHRhZyBpcyBTR0lMT0dFTkNPREVfTk9ESVRIRVIgZm9yCisgKiBDT01QUkVTU0lPTl9TR0lMT0cgdG8gbWF4aW1pemUgcnVuLWxlbmd0aCBlbmNvZGluZyBhbmQKKyAqIFNHSUxPR0VOQ09ERV9SQU5ESVRIRVIgZm9yIENPTVBSRVNTSU9OX1NHSUxPRzI0IHRvIHR1cm4KKyAqIHF1YW50aXphdGlvbiBlcnJvcnMgaW50byBub2lzZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKy8qCisgKiBTdGF0ZSBibG9jayBmb3IgZWFjaCBvcGVuIFRJRkYKKyAqIGZpbGUgdXNpbmcgTG9nTHV2IGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IGxvZ0x1dlN0YXRlIExvZ0x1dlN0YXRlOworCitzdHJ1Y3QgbG9nTHV2U3RhdGUgeworCWludCAgICAgICAgICAgICAgICAgICAgIHVzZXJfZGF0YWZtdDsgICAvKiB1c2VyIGRhdGEgZm9ybWF0ICovCisJaW50ICAgICAgICAgICAgICAgICAgICAgZW5jb2RlX21ldGg7ICAgIC8qIGVuY29kaW5nIG1ldGhvZCAqLworCWludCAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3NpemU7ICAgICAvKiBieXRlcyBwZXIgcGl4ZWwgKi8KKworCXVpbnQ4KiAgICAgICAgICAgICAgICAgIHRidWY7ICAgICAgICAgICAvKiB0cmFuc2xhdGlvbiBidWZmZXIgKi8KKwl0bXNpemVfdCAgICAgICAgICAgICAgICB0YnVmbGVuOyAgICAgICAgLyogYnVmZmVyIGxlbmd0aCAqLworCXZvaWQgKCp0ZnVuYykoTG9nTHV2U3RhdGUqLCB1aW50OCosIHRtc2l6ZV90KTsKKworCVRJRkZWU2V0TWV0aG9kICAgICAgICAgIHZnZXRwYXJlbnQ7ICAgICAvKiBzdXBlci1jbGFzcyBtZXRob2QgKi8KKwlUSUZGVlNldE1ldGhvZCAgICAgICAgICB2c2V0cGFyZW50OyAgICAgLyogc3VwZXItY2xhc3MgbWV0aG9kICovCit9OworCisjZGVmaW5lIERlY29kZXJTdGF0ZSh0aWYpCSgoTG9nTHV2U3RhdGUqKSAodGlmKS0+dGlmX2RhdGEpCisjZGVmaW5lIEVuY29kZXJTdGF0ZSh0aWYpCSgoTG9nTHV2U3RhdGUqKSAodGlmKS0+dGlmX2RhdGEpCisKKyNkZWZpbmUgU0dJTE9HREFUQUZNVF9VTktOT1dOIC0xCisKKyNkZWZpbmUgTUlOUlVOIDQgLyogbWluaW11bSBydW4gbGVuZ3RoICovCisKKy8qCisgKiBEZWNvZGUgYSBzdHJpbmcgb2YgMTYtYml0IGdyYXkgcGl4ZWxzLgorICovCitzdGF0aWMgaW50CitMb2dMMTZEZWNvZGUoVElGRiogdGlmLCB1aW50OCogb3AsIHRtc2l6ZV90IG9jYywgdWludDE2IHMpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiTG9nTDE2RGVjb2RlIjsKKwlMb2dMdXZTdGF0ZSogc3AgPSBEZWNvZGVyU3RhdGUodGlmKTsKKwlpbnQgc2hmdDsKKwl0bXNpemVfdCBpOworCXRtc2l6ZV90IG5waXhlbHM7CisJdW5zaWduZWQgY2hhciogYnA7CisJaW50MTYqIHRwOworCWludDE2IGI7CisJdG1zaXplX3QgY2M7CisJaW50IHJjOworCisJYXNzZXJ0KHMgPT0gMCk7CisJYXNzZXJ0KHNwICE9IE5VTEwpOworCisJbnBpeGVscyA9IG9jYyAvIHNwLT5waXhlbF9zaXplOworCisJaWYgKHNwLT51c2VyX2RhdGFmbXQgPT0gU0dJTE9HREFUQUZNVF8xNkJJVCkKKwkJdHAgPSAoaW50MTYqKSBvcDsKKwllbHNlIHsKKwkJYXNzZXJ0KHNwLT50YnVmbGVuID49IG5waXhlbHMpOworCQl0cCA9IChpbnQxNiopIHNwLT50YnVmOworCX0KKwlfVElGRm1lbXNldCgodm9pZCopIHRwLCAwLCBucGl4ZWxzKnNpemVvZiAodHBbMF0pKTsKKworCWJwID0gKHVuc2lnbmVkIGNoYXIqKSB0aWYtPnRpZl9yYXdjcDsKKwljYyA9IHRpZi0+dGlmX3Jhd2NjOworCS8qIGdldCBlYWNoIGJ5dGUgc3RyaW5nICovCisJZm9yIChzaGZ0ID0gMio4OyAoc2hmdCAtPSA4KSA+PSAwOyApIHsKKwkJZm9yIChpID0gMDsgaSA8IG5waXhlbHMgJiYgY2MgPiAwOyApCisJCQlpZiAoKmJwID49IDEyOCkgewkJLyogcnVuICovCisJCQkJcmMgPSAqYnArKyArICgyLTEyOCk7ICAgLyogVE9ETzogcG90ZW50aWFsIGlucHV0IGJ1ZmZlciBvdmVycnVuIHdoZW4gZGVjb2RpbmcgY29ycnVwdCBvciB0cnVuY2F0ZWQgZGF0YSAqLworCQkJCWIgPSAoaW50MTYpKCpicCsrIDw8IHNoZnQpOworCQkJCWNjIC09IDI7CisJCQkJd2hpbGUgKHJjLS0gJiYgaSA8IG5waXhlbHMpCisJCQkJCXRwW2krK10gfD0gYjsKKwkJCX0gZWxzZSB7CQkJLyogbm9uLXJ1biAqLworCQkJCXJjID0gKmJwKys7CQkvKiBudWwgaXMgbm9vcCAqLworCQkJCXdoaWxlICgtLWNjICYmIHJjLS0gJiYgaSA8IG5waXhlbHMpCisJCQkJCXRwW2krK10gfD0gKGludDE2KSpicCsrIDw8IHNoZnQ7CisJCQl9CisJCWlmIChpICE9IG5waXhlbHMpIHsKKyNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgKGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKQorCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAiTm90IGVub3VnaCBkYXRhIGF0IHJvdyAlbHUgKHNob3J0ICVJNjRkIHBpeGVscykiLAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX3JvdywKKwkJCQkgICAgICh1bnNpZ25lZCBfX2ludDY0KSAobnBpeGVscyAtIGkpKTsKKyNlbHNlCisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICJOb3QgZW5vdWdoIGRhdGEgYXQgcm93ICVsdSAoc2hvcnQgJWxsdSBwaXhlbHMpIiwKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3csCisJCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSAobnBpeGVscyAtIGkpKTsKKyNlbmRpZgorCQkJdGlmLT50aWZfcmF3Y3AgPSAodWludDgqKSBicDsKKwkJCXRpZi0+dGlmX3Jhd2NjID0gY2M7CisJCQlyZXR1cm4gKDApOworCQl9CisJfQorCSgqc3AtPnRmdW5jKShzcCwgb3AsIG5waXhlbHMpOworCXRpZi0+dGlmX3Jhd2NwID0gKHVpbnQ4KikgYnA7CisJdGlmLT50aWZfcmF3Y2MgPSBjYzsKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogRGVjb2RlIGEgc3RyaW5nIG9mIDI0LWJpdCBwaXhlbHMuCisgKi8KK3N0YXRpYyBpbnQKK0xvZ0x1dkRlY29kZTI0KFRJRkYqIHRpZiwgdWludDgqIG9wLCB0bXNpemVfdCBvY2MsIHVpbnQxNiBzKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIkxvZ0x1dkRlY29kZTI0IjsKKwlMb2dMdXZTdGF0ZSogc3AgPSBEZWNvZGVyU3RhdGUodGlmKTsKKwl0bXNpemVfdCBjYzsKKwl0bXNpemVfdCBpOworCXRtc2l6ZV90IG5waXhlbHM7CisJdW5zaWduZWQgY2hhciogYnA7CisJdWludDMyKiB0cDsKKworCWFzc2VydChzID09IDApOworCWFzc2VydChzcCAhPSBOVUxMKTsKKworCW5waXhlbHMgPSBvY2MgLyBzcC0+cGl4ZWxfc2l6ZTsKKworCWlmIChzcC0+dXNlcl9kYXRhZm10ID09IFNHSUxPR0RBVEFGTVRfUkFXKQorCQl0cCA9ICh1aW50MzIgKilvcDsKKwllbHNlIHsKKwkJYXNzZXJ0KHNwLT50YnVmbGVuID49IG5waXhlbHMpOworCQl0cCA9ICh1aW50MzIgKikgc3AtPnRidWY7CisJfQorCS8qIGNvcHkgdG8gYXJyYXkgb2YgdWludDMyICovCisJYnAgPSAodW5zaWduZWQgY2hhciopIHRpZi0+dGlmX3Jhd2NwOworCWNjID0gdGlmLT50aWZfcmF3Y2M7CisJZm9yIChpID0gMDsgaSA8IG5waXhlbHMgJiYgY2MgPiAwOyBpKyspIHsKKwkJdHBbaV0gPSBicFswXSA8PCAxNiB8IGJwWzFdIDw8IDggfCBicFsyXTsKKwkJYnAgKz0gMzsKKwkJY2MgLT0gMzsKKwl9CisJdGlmLT50aWZfcmF3Y3AgPSAodWludDgqKSBicDsKKwl0aWYtPnRpZl9yYXdjYyA9IGNjOworCWlmIChpICE9IG5waXhlbHMpIHsKKyNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgKGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKQorCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJIk5vdCBlbm91Z2ggZGF0YSBhdCByb3cgJWx1IChzaG9ydCAlSTY0ZCBwaXhlbHMpIiwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX3JvdywKKwkJCSAgICAgKHVuc2lnbmVkIF9faW50NjQpIChucGl4ZWxzIC0gaSkpOworI2Vsc2UKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSJOb3QgZW5vdWdoIGRhdGEgYXQgcm93ICVsdSAoc2hvcnQgJWxsdSBwaXhlbHMpIiwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX3JvdywKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgKG5waXhlbHMgLSBpKSk7CisjZW5kaWYKKwkJcmV0dXJuICgwKTsKKwl9CisJKCpzcC0+dGZ1bmMpKHNwLCBvcCwgbnBpeGVscyk7CisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIERlY29kZSBhIHN0cmluZyBvZiAzMi1iaXQgcGl4ZWxzLgorICovCitzdGF0aWMgaW50CitMb2dMdXZEZWNvZGUzMihUSUZGKiB0aWYsIHVpbnQ4KiBvcCwgdG1zaXplX3Qgb2NjLCB1aW50MTYgcykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJMb2dMdXZEZWNvZGUzMiI7CisJTG9nTHV2U3RhdGUqIHNwOworCWludCBzaGZ0OworCXRtc2l6ZV90IGk7CisJdG1zaXplX3QgbnBpeGVsczsKKwl1bnNpZ25lZCBjaGFyKiBicDsKKwl1aW50MzIqIHRwOworCXVpbnQzMiBiOworCXRtc2l6ZV90IGNjOworCWludCByYzsKKworCWFzc2VydChzID09IDApOworCXNwID0gRGVjb2RlclN0YXRlKHRpZik7CisJYXNzZXJ0KHNwICE9IE5VTEwpOworCisJbnBpeGVscyA9IG9jYyAvIHNwLT5waXhlbF9zaXplOworCisJaWYgKHNwLT51c2VyX2RhdGFmbXQgPT0gU0dJTE9HREFUQUZNVF9SQVcpCisJCXRwID0gKHVpbnQzMiopIG9wOworCWVsc2UgeworCQlhc3NlcnQoc3AtPnRidWZsZW4gPj0gbnBpeGVscyk7CisJCXRwID0gKHVpbnQzMiopIHNwLT50YnVmOworCX0KKwlfVElGRm1lbXNldCgodm9pZCopIHRwLCAwLCBucGl4ZWxzKnNpemVvZiAodHBbMF0pKTsKKworCWJwID0gKHVuc2lnbmVkIGNoYXIqKSB0aWYtPnRpZl9yYXdjcDsKKwljYyA9IHRpZi0+dGlmX3Jhd2NjOworCS8qIGdldCBlYWNoIGJ5dGUgc3RyaW5nICovCisJZm9yIChzaGZ0ID0gNCo4OyAoc2hmdCAtPSA4KSA+PSAwOyApIHsKKwkJZm9yIChpID0gMDsgaSA8IG5waXhlbHMgJiYgY2MgPiAwOyApCisJCQlpZiAoKmJwID49IDEyOCkgewkJLyogcnVuICovCisJCQkJcmMgPSAqYnArKyArICgyLTEyOCk7CisJCQkJYiA9ICh1aW50MzIpKmJwKysgPDwgc2hmdDsKKwkJCQljYyAtPSAyOyAgICAgICAgICAgICAgICAvKiBUT0RPOiBwb3RlbnRpYWwgaW5wdXQgYnVmZmVyIG92ZXJydW4gd2hlbiBkZWNvZGluZyBjb3JydXB0IG9yIHRydW5jYXRlZCBkYXRhICovCisJCQkJd2hpbGUgKHJjLS0gJiYgaSA8IG5waXhlbHMpCisJCQkJCXRwW2krK10gfD0gYjsKKwkJCX0gZWxzZSB7CQkJLyogbm9uLXJ1biAqLworCQkJCXJjID0gKmJwKys7CQkvKiBudWwgaXMgbm9vcCAqLworCQkJCXdoaWxlICgtLWNjICYmIHJjLS0gJiYgaSA8IG5waXhlbHMpCisJCQkJCXRwW2krK10gfD0gKHVpbnQzMikqYnArKyA8PCBzaGZ0OworCQkJfQorCQlpZiAoaSAhPSBucGl4ZWxzKSB7CisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkiTm90IGVub3VnaCBkYXRhIGF0IHJvdyAlbHUgKHNob3J0ICVJNjRkIHBpeGVscykiLAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX3JvdywKKwkJCQkgICAgICh1bnNpZ25lZCBfX2ludDY0KSAobnBpeGVscyAtIGkpKTsKKyNlbHNlCisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJIk5vdCBlbm91Z2ggZGF0YSBhdCByb3cgJWx1IChzaG9ydCAlbGx1IHBpeGVscykiLAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX3JvdywKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIChucGl4ZWxzIC0gaSkpOworI2VuZGlmCisJCQl0aWYtPnRpZl9yYXdjcCA9ICh1aW50OCopIGJwOworCQkJdGlmLT50aWZfcmF3Y2MgPSBjYzsKKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CisJKCpzcC0+dGZ1bmMpKHNwLCBvcCwgbnBpeGVscyk7CisJdGlmLT50aWZfcmF3Y3AgPSAodWludDgqKSBicDsKKwl0aWYtPnRpZl9yYXdjYyA9IGNjOworCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBEZWNvZGUgYSBzdHJpcCBvZiBwaXhlbHMuICBXZSBicmVhayBpdCBpbnRvIHJvd3MgdG8KKyAqIG1haW50YWluIHN5bmNocm9ueSB3aXRoIHRoZSBlbmNvZGUgYWxnb3JpdGhtLCB3aGljaAorICogaXMgcm93IGJ5IHJvdy4KKyAqLworc3RhdGljIGludAorTG9nTHV2RGVjb2RlU3RyaXAoVElGRiogdGlmLCB1aW50OCogYnAsIHRtc2l6ZV90IGNjLCB1aW50MTYgcykKK3sKKwl0bXNpemVfdCByb3dsZW4gPSBUSUZGU2NhbmxpbmVTaXplKHRpZik7CisKKyAgICAgICAgaWYgKHJvd2xlbiA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisJYXNzZXJ0KGNjJXJvd2xlbiA9PSAwKTsKKwl3aGlsZSAoY2MgJiYgKCp0aWYtPnRpZl9kZWNvZGVyb3cpKHRpZiwgYnAsIHJvd2xlbiwgcykpCisJCWJwICs9IHJvd2xlbiwgY2MgLT0gcm93bGVuOworCXJldHVybiAoY2MgPT0gMCk7Cit9CisKKy8qCisgKiBEZWNvZGUgYSB0aWxlIG9mIHBpeGVscy4gIFdlIGJyZWFrIGl0IGludG8gcm93cyB0bworICogbWFpbnRhaW4gc3luY2hyb255IHdpdGggdGhlIGVuY29kZSBhbGdvcml0aG0sIHdoaWNoCisgKiBpcyByb3cgYnkgcm93LgorICovCitzdGF0aWMgaW50CitMb2dMdXZEZWNvZGVUaWxlKFRJRkYqIHRpZiwgdWludDgqIGJwLCB0bXNpemVfdCBjYywgdWludDE2IHMpCit7CisJdG1zaXplX3Qgcm93bGVuID0gVElGRlRpbGVSb3dTaXplKHRpZik7CisKKyAgICAgICAgaWYgKHJvd2xlbiA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisJYXNzZXJ0KGNjJXJvd2xlbiA9PSAwKTsKKwl3aGlsZSAoY2MgJiYgKCp0aWYtPnRpZl9kZWNvZGVyb3cpKHRpZiwgYnAsIHJvd2xlbiwgcykpCisJCWJwICs9IHJvd2xlbiwgY2MgLT0gcm93bGVuOworCXJldHVybiAoY2MgPT0gMCk7Cit9CisKKy8qCisgKiBFbmNvZGUgYSByb3cgb2YgMTYtYml0IHBpeGVscy4KKyAqLworc3RhdGljIGludAorTG9nTDE2RW5jb2RlKFRJRkYqIHRpZiwgdWludDgqIGJwLCB0bXNpemVfdCBjYywgdWludDE2IHMpCit7CisJTG9nTHV2U3RhdGUqIHNwID0gRW5jb2RlclN0YXRlKHRpZik7CisJaW50IHNoZnQ7CisJdG1zaXplX3QgaTsKKwl0bXNpemVfdCBqOworCXRtc2l6ZV90IG5waXhlbHM7CisJdWludDgqIG9wOworCWludDE2KiB0cDsKKwlpbnQxNiBiOworCXRtc2l6ZV90IG9jYzsKKwlpbnQgcmM9MCwgbWFzazsKKwl0bXNpemVfdCBiZWc7CisKKwlhc3NlcnQocyA9PSAwKTsKKwlhc3NlcnQoc3AgIT0gTlVMTCk7CisJbnBpeGVscyA9IGNjIC8gc3AtPnBpeGVsX3NpemU7CisKKwlpZiAoc3AtPnVzZXJfZGF0YWZtdCA9PSBTR0lMT0dEQVRBRk1UXzE2QklUKQorCQl0cCA9IChpbnQxNiopIGJwOworCWVsc2UgeworCQl0cCA9IChpbnQxNiopIHNwLT50YnVmOworCQlhc3NlcnQoc3AtPnRidWZsZW4gPj0gbnBpeGVscyk7CisJCSgqc3AtPnRmdW5jKShzcCwgYnAsIG5waXhlbHMpOworCX0KKwkvKiBjb21wcmVzcyBlYWNoIGJ5dGUgc3RyaW5nICovCisJb3AgPSB0aWYtPnRpZl9yYXdjcDsKKwlvY2MgPSB0aWYtPnRpZl9yYXdkYXRhc2l6ZSAtIHRpZi0+dGlmX3Jhd2NjOworCWZvciAoc2hmdCA9IDIqODsgKHNoZnQgLT0gOCkgPj0gMDsgKQorCQlmb3IgKGkgPSAwOyBpIDwgbnBpeGVsczsgaSArPSByYykgeworCQkJaWYgKG9jYyA8IDQpIHsKKwkJCQl0aWYtPnRpZl9yYXdjcCA9IG9wOworCQkJCXRpZi0+dGlmX3Jhd2NjID0gdGlmLT50aWZfcmF3ZGF0YXNpemUgLSBvY2M7CisJCQkJaWYgKCFUSUZGRmx1c2hEYXRhMSh0aWYpKQorCQkJCQlyZXR1cm4gKC0xKTsKKwkJCQlvcCA9IHRpZi0+dGlmX3Jhd2NwOworCQkJCW9jYyA9IHRpZi0+dGlmX3Jhd2RhdGFzaXplIC0gdGlmLT50aWZfcmF3Y2M7CisJCQl9CisJCQltYXNrID0gMHhmZiA8PCBzaGZ0OwkJLyogZmluZCBuZXh0IHJ1biAqLworCQkJZm9yIChiZWcgPSBpOyBiZWcgPCBucGl4ZWxzOyBiZWcgKz0gcmMpIHsKKwkJCQliID0gKGludDE2KSAodHBbYmVnXSAmIG1hc2spOworCQkJCXJjID0gMTsKKwkJCQl3aGlsZSAocmMgPCAxMjcrMiAmJiBiZWcrcmMgPCBucGl4ZWxzICYmCisJCQkJICAgICh0cFtiZWcrcmNdICYgbWFzaykgPT0gYikKKwkJCQkJcmMrKzsKKwkJCQlpZiAocmMgPj0gTUlOUlVOKQorCQkJCQlicmVhazsJCS8qIGxvbmcgZW5vdWdoICovCisJCQl9CisJCQlpZiAoYmVnLWkgPiAxICYmIGJlZy1pIDwgTUlOUlVOKSB7CisJCQkJYiA9IChpbnQxNikgKHRwW2ldICYgbWFzayk7LypjaGVjayBzaG9ydCBydW4gKi8KKwkJCQlqID0gaSsxOworCQkJCXdoaWxlICgodHBbaisrXSAmIG1hc2spID09IGIpCisJCQkJCWlmIChqID09IGJlZykgeworCQkJCQkJKm9wKysgPSAodWludDgpKDEyOC0yK2otaSk7CisJCQkJCQkqb3ArKyA9ICh1aW50OCkoYiA+PiBzaGZ0KTsKKwkJCQkJCW9jYyAtPSAyOworCQkJCQkJaSA9IGJlZzsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQl9CisJCQl3aGlsZSAoaSA8IGJlZykgewkJLyogd3JpdGUgb3V0IG5vbi1ydW4gKi8KKwkJCQlpZiAoKGogPSBiZWctaSkgPiAxMjcpIGogPSAxMjc7CisJCQkJaWYgKG9jYyA8IGorMykgeworCQkJCQl0aWYtPnRpZl9yYXdjcCA9IG9wOworCQkJCQl0aWYtPnRpZl9yYXdjYyA9IHRpZi0+dGlmX3Jhd2RhdGFzaXplIC0gb2NjOworCQkJCQlpZiAoIVRJRkZGbHVzaERhdGExKHRpZikpCisJCQkJCQlyZXR1cm4gKC0xKTsKKwkJCQkJb3AgPSB0aWYtPnRpZl9yYXdjcDsKKwkJCQkJb2NjID0gdGlmLT50aWZfcmF3ZGF0YXNpemUgLSB0aWYtPnRpZl9yYXdjYzsKKwkJCQl9CisJCQkJKm9wKysgPSAodWludDgpIGo7IG9jYy0tOworCQkJCXdoaWxlIChqLS0pIHsKKwkJCQkJKm9wKysgPSAodWludDgpICh0cFtpKytdID4+IHNoZnQgJiAweGZmKTsKKwkJCQkJb2NjLS07CisJCQkJfQorCQkJfQorCQkJaWYgKHJjID49IE1JTlJVTikgewkJLyogd3JpdGUgb3V0IHJ1biAqLworCQkJCSpvcCsrID0gKHVpbnQ4KSAoMTI4LTIrcmMpOworCQkJCSpvcCsrID0gKHVpbnQ4KSAodHBbYmVnXSA+PiBzaGZ0ICYgMHhmZik7CisJCQkJb2NjIC09IDI7CisJCQl9IGVsc2UKKwkJCQlyYyA9IDA7CisJCX0KKwl0aWYtPnRpZl9yYXdjcCA9IG9wOworCXRpZi0+dGlmX3Jhd2NjID0gdGlmLT50aWZfcmF3ZGF0YXNpemUgLSBvY2M7CisKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogRW5jb2RlIGEgcm93IG9mIDI0LWJpdCBwaXhlbHMuCisgKi8KK3N0YXRpYyBpbnQKK0xvZ0x1dkVuY29kZTI0KFRJRkYqIHRpZiwgdWludDgqIGJwLCB0bXNpemVfdCBjYywgdWludDE2IHMpCit7CisJTG9nTHV2U3RhdGUqIHNwID0gRW5jb2RlclN0YXRlKHRpZik7CisJdG1zaXplX3QgaTsKKwl0bXNpemVfdCBucGl4ZWxzOworCXRtc2l6ZV90IG9jYzsKKwl1aW50OCogb3A7CisJdWludDMyKiB0cDsKKworCWFzc2VydChzID09IDApOworCWFzc2VydChzcCAhPSBOVUxMKTsKKwlucGl4ZWxzID0gY2MgLyBzcC0+cGl4ZWxfc2l6ZTsKKworCWlmIChzcC0+dXNlcl9kYXRhZm10ID09IFNHSUxPR0RBVEFGTVRfUkFXKQorCQl0cCA9ICh1aW50MzIqKSBicDsKKwllbHNlIHsKKwkJdHAgPSAodWludDMyKikgc3AtPnRidWY7CisJCWFzc2VydChzcC0+dGJ1ZmxlbiA+PSBucGl4ZWxzKTsKKwkJKCpzcC0+dGZ1bmMpKHNwLCBicCwgbnBpeGVscyk7CisJfQorCS8qIHdyaXRlIG91dCBlbmNvZGVkIHBpeGVscyAqLworCW9wID0gdGlmLT50aWZfcmF3Y3A7CisJb2NjID0gdGlmLT50aWZfcmF3ZGF0YXNpemUgLSB0aWYtPnRpZl9yYXdjYzsKKwlmb3IgKGkgPSBucGl4ZWxzOyBpLS07ICkgeworCQlpZiAob2NjIDwgMykgeworCQkJdGlmLT50aWZfcmF3Y3AgPSBvcDsKKwkJCXRpZi0+dGlmX3Jhd2NjID0gdGlmLT50aWZfcmF3ZGF0YXNpemUgLSBvY2M7CisJCQlpZiAoIVRJRkZGbHVzaERhdGExKHRpZikpCisJCQkJcmV0dXJuICgtMSk7CisJCQlvcCA9IHRpZi0+dGlmX3Jhd2NwOworCQkJb2NjID0gdGlmLT50aWZfcmF3ZGF0YXNpemUgLSB0aWYtPnRpZl9yYXdjYzsKKwkJfQorCQkqb3ArKyA9ICh1aW50OCkoKnRwID4+IDE2KTsKKwkJKm9wKysgPSAodWludDgpKCp0cCA+PiA4ICYgMHhmZik7CisJCSpvcCsrID0gKHVpbnQ4KSgqdHArKyAmIDB4ZmYpOworCQlvY2MgLT0gMzsKKwl9CisJdGlmLT50aWZfcmF3Y3AgPSBvcDsKKwl0aWYtPnRpZl9yYXdjYyA9IHRpZi0+dGlmX3Jhd2RhdGFzaXplIC0gb2NjOworCisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIEVuY29kZSBhIHJvdyBvZiAzMi1iaXQgcGl4ZWxzLgorICovCitzdGF0aWMgaW50CitMb2dMdXZFbmNvZGUzMihUSUZGKiB0aWYsIHVpbnQ4KiBicCwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKQoreworCUxvZ0x1dlN0YXRlKiBzcCA9IEVuY29kZXJTdGF0ZSh0aWYpOworCWludCBzaGZ0OworCXRtc2l6ZV90IGk7CisJdG1zaXplX3QgajsKKwl0bXNpemVfdCBucGl4ZWxzOworCXVpbnQ4KiBvcDsKKwl1aW50MzIqIHRwOworCXVpbnQzMiBiOworCXRtc2l6ZV90IG9jYzsKKwlpbnQgcmM9MCwgbWFzazsKKwl0bXNpemVfdCBiZWc7CisKKwlhc3NlcnQocyA9PSAwKTsKKwlhc3NlcnQoc3AgIT0gTlVMTCk7CisKKwlucGl4ZWxzID0gY2MgLyBzcC0+cGl4ZWxfc2l6ZTsKKworCWlmIChzcC0+dXNlcl9kYXRhZm10ID09IFNHSUxPR0RBVEFGTVRfUkFXKQorCQl0cCA9ICh1aW50MzIqKSBicDsKKwllbHNlIHsKKwkJdHAgPSAodWludDMyKikgc3AtPnRidWY7CisJCWFzc2VydChzcC0+dGJ1ZmxlbiA+PSBucGl4ZWxzKTsKKwkJKCpzcC0+dGZ1bmMpKHNwLCBicCwgbnBpeGVscyk7CisJfQorCS8qIGNvbXByZXNzIGVhY2ggYnl0ZSBzdHJpbmcgKi8KKwlvcCA9IHRpZi0+dGlmX3Jhd2NwOworCW9jYyA9IHRpZi0+dGlmX3Jhd2RhdGFzaXplIC0gdGlmLT50aWZfcmF3Y2M7CisJZm9yIChzaGZ0ID0gNCo4OyAoc2hmdCAtPSA4KSA+PSAwOyApCisJCWZvciAoaSA9IDA7IGkgPCBucGl4ZWxzOyBpICs9IHJjKSB7CisJCQlpZiAob2NjIDwgNCkgeworCQkJCXRpZi0+dGlmX3Jhd2NwID0gb3A7CisJCQkJdGlmLT50aWZfcmF3Y2MgPSB0aWYtPnRpZl9yYXdkYXRhc2l6ZSAtIG9jYzsKKwkJCQlpZiAoIVRJRkZGbHVzaERhdGExKHRpZikpCisJCQkJCXJldHVybiAoLTEpOworCQkJCW9wID0gdGlmLT50aWZfcmF3Y3A7CisJCQkJb2NjID0gdGlmLT50aWZfcmF3ZGF0YXNpemUgLSB0aWYtPnRpZl9yYXdjYzsKKwkJCX0KKwkJCW1hc2sgPSAweGZmIDw8IHNoZnQ7CQkvKiBmaW5kIG5leHQgcnVuICovCisJCQlmb3IgKGJlZyA9IGk7IGJlZyA8IG5waXhlbHM7IGJlZyArPSByYykgeworCQkJCWIgPSB0cFtiZWddICYgbWFzazsKKwkJCQlyYyA9IDE7CisJCQkJd2hpbGUgKHJjIDwgMTI3KzIgJiYgYmVnK3JjIDwgbnBpeGVscyAmJgorCQkJCQkJKHRwW2JlZytyY10gJiBtYXNrKSA9PSBiKQorCQkJCQlyYysrOworCQkJCWlmIChyYyA+PSBNSU5SVU4pCisJCQkJCWJyZWFrOwkJLyogbG9uZyBlbm91Z2ggKi8KKwkJCX0KKwkJCWlmIChiZWctaSA+IDEgJiYgYmVnLWkgPCBNSU5SVU4pIHsKKwkJCQliID0gdHBbaV0gJiBtYXNrOwkvKiBjaGVjayBzaG9ydCBydW4gKi8KKwkJCQlqID0gaSsxOworCQkJCXdoaWxlICgodHBbaisrXSAmIG1hc2spID09IGIpCisJCQkJCWlmIChqID09IGJlZykgeworCQkJCQkJKm9wKysgPSAodWludDgpKDEyOC0yK2otaSk7CisJCQkJCQkqb3ArKyA9ICh1aW50OCkoYiA+PiBzaGZ0KTsKKwkJCQkJCW9jYyAtPSAyOworCQkJCQkJaSA9IGJlZzsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQl9CisJCQl3aGlsZSAoaSA8IGJlZykgewkJLyogd3JpdGUgb3V0IG5vbi1ydW4gKi8KKwkJCQlpZiAoKGogPSBiZWctaSkgPiAxMjcpIGogPSAxMjc7CisJCQkJaWYgKG9jYyA8IGorMykgeworCQkJCQl0aWYtPnRpZl9yYXdjcCA9IG9wOworCQkJCQl0aWYtPnRpZl9yYXdjYyA9IHRpZi0+dGlmX3Jhd2RhdGFzaXplIC0gb2NjOworCQkJCQlpZiAoIVRJRkZGbHVzaERhdGExKHRpZikpCisJCQkJCQlyZXR1cm4gKC0xKTsKKwkJCQkJb3AgPSB0aWYtPnRpZl9yYXdjcDsKKwkJCQkJb2NjID0gdGlmLT50aWZfcmF3ZGF0YXNpemUgLSB0aWYtPnRpZl9yYXdjYzsKKwkJCQl9CisJCQkJKm9wKysgPSAodWludDgpIGo7IG9jYy0tOworCQkJCXdoaWxlIChqLS0pIHsKKwkJCQkJKm9wKysgPSAodWludDgpKHRwW2krK10gPj4gc2hmdCAmIDB4ZmYpOworCQkJCQlvY2MtLTsKKwkJCQl9CisJCQl9CisJCQlpZiAocmMgPj0gTUlOUlVOKSB7CQkvKiB3cml0ZSBvdXQgcnVuICovCisJCQkJKm9wKysgPSAodWludDgpICgxMjgtMityYyk7CisJCQkJKm9wKysgPSAodWludDgpKHRwW2JlZ10gPj4gc2hmdCAmIDB4ZmYpOworCQkJCW9jYyAtPSAyOworCQkJfSBlbHNlCisJCQkJcmMgPSAwOworCQl9CisJdGlmLT50aWZfcmF3Y3AgPSBvcDsKKwl0aWYtPnRpZl9yYXdjYyA9IHRpZi0+dGlmX3Jhd2RhdGFzaXplIC0gb2NjOworCisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIEVuY29kZSBhIHN0cmlwIG9mIHBpeGVscy4gIFdlIGJyZWFrIGl0IGludG8gcm93cyB0bworICogYXZvaWQgZW5jb2RpbmcgcnVucyBhY3Jvc3Mgcm93IGJvdW5kYXJpZXMuCisgKi8KK3N0YXRpYyBpbnQKK0xvZ0x1dkVuY29kZVN0cmlwKFRJRkYqIHRpZiwgdWludDgqIGJwLCB0bXNpemVfdCBjYywgdWludDE2IHMpCit7CisJdG1zaXplX3Qgcm93bGVuID0gVElGRlNjYW5saW5lU2l6ZSh0aWYpOworCisgICAgICAgIGlmIChyb3dsZW4gPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworCWFzc2VydChjYyVyb3dsZW4gPT0gMCk7CisJd2hpbGUgKGNjICYmICgqdGlmLT50aWZfZW5jb2Rlcm93KSh0aWYsIGJwLCByb3dsZW4sIHMpID09IDEpCisJCWJwICs9IHJvd2xlbiwgY2MgLT0gcm93bGVuOworCXJldHVybiAoY2MgPT0gMCk7Cit9CisKKy8qCisgKiBFbmNvZGUgYSB0aWxlIG9mIHBpeGVscy4gIFdlIGJyZWFrIGl0IGludG8gcm93cyB0bworICogYXZvaWQgZW5jb2RpbmcgcnVucyBhY3Jvc3Mgcm93IGJvdW5kYXJpZXMuCisgKi8KK3N0YXRpYyBpbnQKK0xvZ0x1dkVuY29kZVRpbGUoVElGRiogdGlmLCB1aW50OCogYnAsIHRtc2l6ZV90IGNjLCB1aW50MTYgcykKK3sKKwl0bXNpemVfdCByb3dsZW4gPSBUSUZGVGlsZVJvd1NpemUodGlmKTsKKworICAgICAgICBpZiAocm93bGVuID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKwlhc3NlcnQoY2Mlcm93bGVuID09IDApOworCXdoaWxlIChjYyAmJiAoKnRpZi0+dGlmX2VuY29kZXJvdykodGlmLCBicCwgcm93bGVuLCBzKSA9PSAxKQorCQlicCArPSByb3dsZW4sIGNjIC09IHJvd2xlbjsKKwlyZXR1cm4gKGNjID09IDApOworfQorCisvKgorICogRW5jb2RlL0RlY29kZSBmdW5jdGlvbnMgZm9yIGNvbnZlcnRpbmcgdG8gYW5kIGZyb20gdXNlciBmb3JtYXRzLgorICovCisKKyNpbmNsdWRlICJ1dmNvZGUuaCIKKworI2lmbmRlZiBVVlNDQUxFCisjZGVmaW5lIFVfTkVVCQkwLjIxMDUyNjMxNgorI2RlZmluZSBWX05FVQkJMC40NzM2ODQyMTEKKyNkZWZpbmUgVVZTQ0FMRQkJNDEwLgorI2VuZGlmCisKKyNpZm5kZWYJTV9MTjIKKyNkZWZpbmUgTV9MTjIJCTAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDIKKyNlbmRpZgorI2lmbmRlZiBNX1BJCisjZGVmaW5lIE1fUEkJCTMuMTQxNTkyNjUzNTg5NzkzMjM4NDYKKyNlbmRpZgorI3VuZGVmIGxvZzIgLyogQ29uZmxpY3Qgd2l0aCBDJzk5IGZ1bmN0aW9uICovCisjZGVmaW5lIGxvZzIoeCkJCSgoMS4vTV9MTjIpKmxvZyh4KSkKKyN1bmRlZiBleHAyICAvKiBDb25mbGljdCB3aXRoIEMnOTkgZnVuY3Rpb24gKi8KKyNkZWZpbmUgZXhwMih4KQkJZXhwKE1fTE4yKih4KSkKKworI2RlZmluZSBpdHJ1bmMoeCxtKQkoKG0pPT1TR0lMT0dFTkNPREVfTk9ESVRIRVIgPyBcCisJCQkJKGludCkoeCkgOiBcCisJCQkJKGludCkoKHgpICsgcmFuZCgpKigxLi9SQU5EX01BWCkgLSAuNSkpCisKKyNpZiAhTE9HTFVWX1BVQkxJQworc3RhdGljCisjZW5kaWYKK2RvdWJsZQorTG9nTDE2dG9ZKGludCBwMTYpCQkvKiBjb21wdXRlIGx1bWluYW5jZSBmcm9tIDE2LWJpdCBMb2dMICovCit7CisJaW50CUxlID0gcDE2ICYgMHg3ZmZmOworCWRvdWJsZQlZOworCisJaWYgKCFMZSkKKwkJcmV0dXJuICgwLik7CisJWSA9IGV4cChNX0xOMi8yNTYuKihMZSsuNSkgLSBNX0xOMio2NC4pOworCXJldHVybiAoIShwMTYgJiAweDgwMDApID8gWSA6IC1ZKTsKK30KKworI2lmICFMT0dMVVZfUFVCTElDCitzdGF0aWMKKyNlbmRpZgoraW50CitMb2dMMTZmcm9tWShkb3VibGUgWSwgaW50IGVtKQkvKiBnZXQgMTYtYml0IExvZ0wgZnJvbSBZICovCit7CisJaWYgKFkgPj0gMS44MzcxOTc2ZTE5KQorCQlyZXR1cm4gKDB4N2ZmZik7CisJaWYgKFkgPD0gLTEuODM3MTk3NmUxOSkKKwkJcmV0dXJuICgweGZmZmYpOworCWlmIChZID4gNS40MTM2NzY5ZS0yMCkKKwkJcmV0dXJuIGl0cnVuYygyNTYuKihsb2cyKFkpICsgNjQuKSwgZW0pOworCWlmIChZIDwgLTUuNDEzNjc2OWUtMjApCisJCXJldHVybiAofjB4N2ZmZiB8IGl0cnVuYygyNTYuKihsb2cyKC1ZKSArIDY0LiksIGVtKSk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQKK0wxNnRvWShMb2dMdXZTdGF0ZSogc3AsIHVpbnQ4KiBvcCwgdG1zaXplX3QgbikKK3sKKwlpbnQxNiogbDE2ID0gKGludDE2Kikgc3AtPnRidWY7CisJZmxvYXQqIHlwID0gKGZsb2F0Kikgb3A7CisKKwl3aGlsZSAobi0tID4gMCkKKwkJKnlwKysgPSAoZmxvYXQpTG9nTDE2dG9ZKCpsMTYrKyk7Cit9CisKK3N0YXRpYyB2b2lkCitMMTZ0b0dyeShMb2dMdXZTdGF0ZSogc3AsIHVpbnQ4KiBvcCwgdG1zaXplX3QgbikKK3sKKwlpbnQxNiogbDE2ID0gKGludDE2Kikgc3AtPnRidWY7CisJdWludDgqIGdwID0gKHVpbnQ4Kikgb3A7CisKKwl3aGlsZSAobi0tID4gMCkgeworCQlkb3VibGUgWSA9IExvZ0wxNnRvWSgqbDE2KyspOworCQkqZ3ArKyA9ICh1aW50OCkgKChZIDw9IDAuKSA/IDAgOiAoWSA+PSAxLikgPyAyNTUgOiAoaW50KSgyNTYuKnNxcnQoWSkpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitMMTZmcm9tWShMb2dMdXZTdGF0ZSogc3AsIHVpbnQ4KiBvcCwgdG1zaXplX3QgbikKK3sKKwlpbnQxNiogbDE2ID0gKGludDE2Kikgc3AtPnRidWY7CisJZmxvYXQqIHlwID0gKGZsb2F0Kikgb3A7CisKKwl3aGlsZSAobi0tID4gMCkKKwkJKmwxNisrID0gKGludDE2KSAoTG9nTDE2ZnJvbVkoKnlwKyssIHNwLT5lbmNvZGVfbWV0aCkpOworfQorCisjaWYgIUxPR0xVVl9QVUJMSUMKK3N0YXRpYworI2VuZGlmCit2b2lkCitYWVp0b1JHQjI0KGZsb2F0IHh5elszXSwgdWludDggcmdiWzNdKQoreworCWRvdWJsZQlyLCBnLCBiOworCQkJCQkvKiBhc3N1bWUgQ0NJUi03MDkgcHJpbWFyaWVzICovCisJciA9ICAyLjY5MCp4eXpbMF0gKyAtMS4yNzYqeHl6WzFdICsgLTAuNDE0Knh5elsyXTsKKwlnID0gLTEuMDIyKnh5elswXSArICAxLjk3OCp4eXpbMV0gKyAgMC4wNDQqeHl6WzJdOworCWIgPSAgMC4wNjEqeHl6WzBdICsgLTAuMjI0Knh5elsxXSArICAxLjE2Myp4eXpbMl07CisJCQkJCS8qIGFzc3VtZSAyLjAgZ2FtbWEgZm9yIHNwZWVkICovCisJLyogY291bGQgdXNlIGludGVnZXIgc3FydCBhcHByb3guLCBidXQgdGhpcyBpcyBwcm9iYWJseSBmYXN0ZXIgKi8KKwlyZ2JbMF0gPSAodWludDgpKChyPD0wLikgPyAwIDogKHIgPj0gMS4pID8gMjU1IDogKGludCkoMjU2LipzcXJ0KHIpKSk7CisJcmdiWzFdID0gKHVpbnQ4KSgoZzw9MC4pID8gMCA6IChnID49IDEuKSA/IDI1NSA6IChpbnQpKDI1Ni4qc3FydChnKSkpOworCXJnYlsyXSA9ICh1aW50OCkoKGI8PTAuKSA/IDAgOiAoYiA+PSAxLikgPyAyNTUgOiAoaW50KSgyNTYuKnNxcnQoYikpKTsKK30KKworI2lmICFMT0dMVVZfUFVCTElDCitzdGF0aWMKKyNlbmRpZgorZG91YmxlCitMb2dMMTB0b1koaW50IHAxMCkJCS8qIGNvbXB1dGUgbHVtaW5hbmNlIGZyb20gMTAtYml0IExvZ0wgKi8KK3sKKwlpZiAocDEwID09IDApCisJCXJldHVybiAoMC4pOworCXJldHVybiAoZXhwKE1fTE4yLzY0LioocDEwKy41KSAtIE1fTE4yKjEyLikpOworfQorCisjaWYgIUxPR0xVVl9QVUJMSUMKK3N0YXRpYworI2VuZGlmCitpbnQKK0xvZ0wxMGZyb21ZKGRvdWJsZSBZLCBpbnQgZW0pCS8qIGdldCAxMC1iaXQgTG9nTCBmcm9tIFkgKi8KK3sKKwlpZiAoWSA+PSAxNS43NDIpCisJCXJldHVybiAoMHgzZmYpOworCWVsc2UgaWYgKFkgPD0gLjAwMDI0MjgzKQorCQlyZXR1cm4gKDApOworCWVsc2UKKwkJcmV0dXJuIGl0cnVuYyg2NC4qKGxvZzIoWSkgKyAxMi4pLCBlbSk7Cit9CisKKyNkZWZpbmUgTkFOR0xFUwkJMTAwCisjZGVmaW5lIHV2MmFuZyh1LCB2KQkoIChOQU5HTEVTKi40OTk5OTk5OTkvTV9QSSkgXAorCQkJCSogYXRhbjIoKHYpLVZfTkVVLCh1KS1VX05FVSkgKyAuNSpOQU5HTEVTICkKKworc3RhdGljIGludAorb29nX2VuY29kZShkb3VibGUgdSwgZG91YmxlIHYpCQkvKiBlbmNvZGUgb3V0LW9mLWdhbXV0IGNocm9tYSAqLworeworCXN0YXRpYyBpbnQJb29nX3RhYmxlW05BTkdMRVNdOworCXN0YXRpYyBpbnQJaW5pdGlhbGl6ZWQgPSAwOworCXJlZ2lzdGVyIGludAlpOworCisJaWYgKCFpbml0aWFsaXplZCkgewkJLyogc2V0IHVwIHBlcmltZXRlciB0YWJsZSAqLworCQlkb3VibGUJZXBzW05BTkdMRVNdLCB1YSwgdmEsIGFuZywgZXBzYTsKKwkJaW50CXVpLCB2aSwgdXN0ZXA7CisJCWZvciAoaSA9IE5BTkdMRVM7IGktLTsgKQorCQkJZXBzW2ldID0gMi47CisJCWZvciAodmkgPSBVVl9OVlM7IHZpLS07ICkgeworCQkJdmEgPSBVVl9WU1RBUlQgKyAodmkrLjUpKlVWX1NRU0laOworCQkJdXN0ZXAgPSB1dl9yb3dbdmldLm51cy0xOworCQkJaWYgKHZpID09IFVWX05WUy0xIHx8IHZpID09IDAgfHwgdXN0ZXAgPD0gMCkKKwkJCQl1c3RlcCA9IDE7CisJCQlmb3IgKHVpID0gdXZfcm93W3ZpXS5udXMtMTsgdWkgPj0gMDsgdWkgLT0gdXN0ZXApIHsKKwkJCQl1YSA9IHV2X3Jvd1t2aV0udXN0YXJ0ICsgKHVpKy41KSpVVl9TUVNJWjsKKwkJCQlhbmcgPSB1djJhbmcodWEsIHZhKTsKKwkJCQlpID0gKGludCkgYW5nOworCQkJCWVwc2EgPSBmYWJzKGFuZyAtIChpKy41KSk7CisJCQkJaWYgKGVwc2EgPCBlcHNbaV0pIHsKKwkJCQkJb29nX3RhYmxlW2ldID0gdXZfcm93W3ZpXS5uY3VtICsgdWk7CisJCQkJCWVwc1tpXSA9IGVwc2E7CisJCQkJfQorCQkJfQorCQl9CisJCWZvciAoaSA9IE5BTkdMRVM7IGktLTsgKQkvKiBmaWxsIGFueSBob2xlcyAqLworCQkJaWYgKGVwc1tpXSA+IDEuNSkgeworCQkJCWludAlpMSwgaTI7CisJCQkJZm9yIChpMSA9IDE7IGkxIDwgTkFOR0xFUy8yOyBpMSsrKQorCQkJCQlpZiAoZXBzWyhpK2kxKSVOQU5HTEVTXSA8IDEuNSkKKwkJCQkJCWJyZWFrOworCQkJCWZvciAoaTIgPSAxOyBpMiA8IE5BTkdMRVMvMjsgaTIrKykKKwkJCQkJaWYgKGVwc1soaStOQU5HTEVTLWkyKSVOQU5HTEVTXSA8IDEuNSkKKwkJCQkJCWJyZWFrOworCQkJCWlmIChpMSA8IGkyKQorCQkJCQlvb2dfdGFibGVbaV0gPQorCQkJCQkJb29nX3RhYmxlWyhpK2kxKSVOQU5HTEVTXTsKKwkJCQllbHNlCisJCQkJCW9vZ190YWJsZVtpXSA9CisJCQkJCQlvb2dfdGFibGVbKGkrTkFOR0xFUy1pMiklTkFOR0xFU107CisJCQl9CisJCWluaXRpYWxpemVkID0gMTsKKwl9CisJaSA9IChpbnQpIHV2MmFuZyh1LCB2KTsJCS8qIGxvb2sgdXAgaHVlIGFuZ2xlICovCisJcmV0dXJuIChvb2dfdGFibGVbaV0pOworfQorCisjdW5kZWYgdXYyYW5nCisjdW5kZWYgTkFOR0xFUworCisjaWYgIUxPR0xVVl9QVUJMSUMKK3N0YXRpYworI2VuZGlmCitpbnQKK3V2X2VuY29kZShkb3VibGUgdSwgZG91YmxlIHYsIGludCBlbSkJLyogZW5jb2RlICh1Jyx2JykgY29vcmRpbmF0ZXMgKi8KK3sKKwlyZWdpc3RlciBpbnQJdmksIHVpOworCisJaWYgKHYgPCBVVl9WU1RBUlQpCisJCXJldHVybiBvb2dfZW5jb2RlKHUsIHYpOworCXZpID0gaXRydW5jKCh2IC0gVVZfVlNUQVJUKSooMS4vVVZfU1FTSVopLCBlbSk7CisJaWYgKHZpID49IFVWX05WUykKKwkJcmV0dXJuIG9vZ19lbmNvZGUodSwgdik7CisJaWYgKHUgPCB1dl9yb3dbdmldLnVzdGFydCkKKwkJcmV0dXJuIG9vZ19lbmNvZGUodSwgdik7CisJdWkgPSBpdHJ1bmMoKHUgLSB1dl9yb3dbdmldLnVzdGFydCkqKDEuL1VWX1NRU0laKSwgZW0pOworCWlmICh1aSA+PSB1dl9yb3dbdmldLm51cykKKwkJcmV0dXJuIG9vZ19lbmNvZGUodSwgdik7CisKKwlyZXR1cm4gKHV2X3Jvd1t2aV0ubmN1bSArIHVpKTsKK30KKworI2lmICFMT0dMVVZfUFVCTElDCitzdGF0aWMKKyNlbmRpZgoraW50Cit1dl9kZWNvZGUoZG91YmxlICp1cCwgZG91YmxlICp2cCwgaW50IGMpCS8qIGRlY29kZSAodScsdicpIGluZGV4ICovCit7CisJaW50CXVwcGVyLCBsb3dlcjsKKwlyZWdpc3RlciBpbnQJdWksIHZpOworCisJaWYgKGMgPCAwIHx8IGMgPj0gVVZfTkRJVlMpCisJCXJldHVybiAoLTEpOworCWxvd2VyID0gMDsJCQkJLyogYmluYXJ5IHNlYXJjaCAqLworCXVwcGVyID0gVVZfTlZTOworCXdoaWxlICh1cHBlciAtIGxvd2VyID4gMSkgeworCQl2aSA9IChsb3dlciArIHVwcGVyKSA+PiAxOworCQl1aSA9IGMgLSB1dl9yb3dbdmldLm5jdW07CisJCWlmICh1aSA+IDApCisJCQlsb3dlciA9IHZpOworCQllbHNlIGlmICh1aSA8IDApCisJCQl1cHBlciA9IHZpOworCQllbHNlIHsKKwkJCWxvd2VyID0gdmk7CisJCQlicmVhazsKKwkJfQorCX0KKwl2aSA9IGxvd2VyOworCXVpID0gYyAtIHV2X3Jvd1t2aV0ubmN1bTsKKwkqdXAgPSB1dl9yb3dbdmldLnVzdGFydCArICh1aSsuNSkqVVZfU1FTSVo7CisJKnZwID0gVVZfVlNUQVJUICsgKHZpKy41KSpVVl9TUVNJWjsKKwlyZXR1cm4gKDApOworfQorCisjaWYgIUxPR0xVVl9QVUJMSUMKK3N0YXRpYworI2VuZGlmCit2b2lkCitMb2dMdXYyNHRvWFlaKHVpbnQzMiBwLCBmbG9hdCBYWVpbM10pCit7CisJaW50CUNlOworCWRvdWJsZQlMLCB1LCB2LCBzLCB4LCB5OworCQkJCQkvKiBkZWNvZGUgbHVtaW5hbmNlICovCisJTCA9IExvZ0wxMHRvWShwPj4xNCAmIDB4M2ZmKTsKKwlpZiAoTCA8PSAwLikgeworCQlYWVpbMF0gPSBYWVpbMV0gPSBYWVpbMl0gPSAwLjsKKwkJcmV0dXJuOworCX0KKwkJCQkJLyogZGVjb2RlIGNvbG9yICovCisJQ2UgPSBwICYgMHgzZmZmOworCWlmICh1dl9kZWNvZGUoJnUsICZ2LCBDZSkgPCAwKSB7CisJCXUgPSBVX05FVTsgdiA9IFZfTkVVOworCX0KKwlzID0gMS4vKDYuKnUgLSAxNi4qdiArIDEyLik7CisJeCA9IDkuKnUgKiBzOworCXkgPSA0Lip2ICogczsKKwkJCQkJLyogY29udmVydCB0byBYWVogKi8KKwlYWVpbMF0gPSAoZmxvYXQpKHgveSAqIEwpOworCVhZWlsxXSA9IChmbG9hdClMOworCVhZWlsyXSA9IChmbG9hdCkoKDEuLXgteSkveSAqIEwpOworfQorCisjaWYgIUxPR0xVVl9QVUJMSUMKK3N0YXRpYworI2VuZGlmCit1aW50MzIKK0xvZ0x1djI0ZnJvbVhZWihmbG9hdCBYWVpbM10sIGludCBlbSkKK3sKKwlpbnQJTGUsIENlOworCWRvdWJsZQl1LCB2LCBzOworCQkJCQkvKiBlbmNvZGUgbHVtaW5hbmNlICovCisJTGUgPSBMb2dMMTBmcm9tWShYWVpbMV0sIGVtKTsKKwkJCQkJLyogZW5jb2RlIGNvbG9yICovCisJcyA9IFhZWlswXSArIDE1LipYWVpbMV0gKyAzLipYWVpbMl07CisJaWYgKCFMZSB8fCBzIDw9IDAuKSB7CisJCXUgPSBVX05FVTsKKwkJdiA9IFZfTkVVOworCX0gZWxzZSB7CisJCXUgPSA0LipYWVpbMF0gLyBzOworCQl2ID0gOS4qWFlaWzFdIC8gczsKKwl9CisJQ2UgPSB1dl9lbmNvZGUodSwgdiwgZW0pOworCWlmIChDZSA8IDApCQkJLyogbmV2ZXIgaGFwcGVucyAqLworCQlDZSA9IHV2X2VuY29kZShVX05FVSwgVl9ORVUsIFNHSUxPR0VOQ09ERV9OT0RJVEhFUik7CisJCQkJCS8qIGNvbWJpbmUgZW5jb2RpbmdzICovCisJcmV0dXJuIChMZSA8PCAxNCB8IENlKTsKK30KKworc3RhdGljIHZvaWQKK0x1djI0dG9YWVooTG9nTHV2U3RhdGUqIHNwLCB1aW50OCogb3AsIHRtc2l6ZV90IG4pCit7CisJdWludDMyKiBsdXYgPSAodWludDMyKikgc3AtPnRidWY7ICAKKwlmbG9hdCogeHl6ID0gKGZsb2F0Kikgb3A7CisKKwl3aGlsZSAobi0tID4gMCkgeworCQlMb2dMdXYyNHRvWFlaKCpsdXYsIHh5eik7CisJCXh5eiArPSAzOworCQlsdXYrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitMdXYyNHRvTHV2NDgoTG9nTHV2U3RhdGUqIHNwLCB1aW50OCogb3AsIHRtc2l6ZV90IG4pCit7CisJdWludDMyKiBsdXYgPSAodWludDMyKikgc3AtPnRidWY7ICAKKwlpbnQxNiogbHV2MyA9IChpbnQxNiopIG9wOworCisJd2hpbGUgKG4tLSA+IDApIHsKKwkJZG91YmxlIHUsIHY7CisKKwkJKmx1djMrKyA9IChpbnQxNikoKCpsdXYgPj4gMTIgJiAweGZmZCkgKyAxMzMxNCk7CisJCWlmICh1dl9kZWNvZGUoJnUsICZ2LCAqbHV2JjB4M2ZmZikgPCAwKSB7CisJCQl1ID0gVV9ORVU7CisJCQl2ID0gVl9ORVU7CisJCX0KKwkJKmx1djMrKyA9IChpbnQxNikodSAqICgxTDw8MTUpKTsKKwkJKmx1djMrKyA9IChpbnQxNikodiAqICgxTDw8MTUpKTsKKwkJbHV2Kys7CisJfQorfQorCitzdGF0aWMgdm9pZAorTHV2MjR0b1JHQihMb2dMdXZTdGF0ZSogc3AsIHVpbnQ4KiBvcCwgdG1zaXplX3QgbikKK3sKKwl1aW50MzIqIGx1diA9ICh1aW50MzIqKSBzcC0+dGJ1ZjsgIAorCXVpbnQ4KiByZ2IgPSAodWludDgqKSBvcDsKKworCXdoaWxlIChuLS0gPiAwKSB7CisJCWZsb2F0IHh5elszXTsKKworCQlMb2dMdXYyNHRvWFlaKCpsdXYrKywgeHl6KTsKKwkJWFladG9SR0IyNCh4eXosIHJnYik7CisJCXJnYiArPSAzOworCX0KK30KKworc3RhdGljIHZvaWQKK0x1djI0ZnJvbVhZWihMb2dMdXZTdGF0ZSogc3AsIHVpbnQ4KiBvcCwgdG1zaXplX3QgbikKK3sKKwl1aW50MzIqIGx1diA9ICh1aW50MzIqKSBzcC0+dGJ1ZjsgIAorCWZsb2F0KiB4eXogPSAoZmxvYXQqKSBvcDsKKworCXdoaWxlIChuLS0gPiAwKSB7CisJCSpsdXYrKyA9IExvZ0x1djI0ZnJvbVhZWih4eXosIHNwLT5lbmNvZGVfbWV0aCk7CisJCXh5eiArPSAzOworCX0KK30KKworc3RhdGljIHZvaWQKK0x1djI0ZnJvbUx1djQ4KExvZ0x1dlN0YXRlKiBzcCwgdWludDgqIG9wLCB0bXNpemVfdCBuKQoreworCXVpbnQzMiogbHV2ID0gKHVpbnQzMiopIHNwLT50YnVmOyAgCisJaW50MTYqIGx1djMgPSAoaW50MTYqKSBvcDsKKworCXdoaWxlIChuLS0gPiAwKSB7CisJCWludCBMZSwgQ2U7CisKKwkJaWYgKGx1djNbMF0gPD0gMCkKKwkJCUxlID0gMDsKKwkJZWxzZSBpZiAobHV2M1swXSA+PSAoMTw8MTIpKzMzMTQpCisJCQlMZSA9ICgxPDwxMCkgLSAxOworCQllbHNlIGlmIChzcC0+ZW5jb2RlX21ldGggPT0gU0dJTE9HRU5DT0RFX05PRElUSEVSKQorCQkJTGUgPSAobHV2M1swXS0zMzE0KSA+PiAyOworCQllbHNlCisJCQlMZSA9IGl0cnVuYyguMjUqKGx1djNbMF0tMzMxNC4pLCBzcC0+ZW5jb2RlX21ldGgpOworCisJCUNlID0gdXZfZW5jb2RlKChsdXYzWzFdKy41KS8oMTw8MTUpLCAobHV2M1syXSsuNSkvKDE8PDE1KSwKKwkJCQkJc3AtPmVuY29kZV9tZXRoKTsKKwkJaWYgKENlIDwgMCkJLyogbmV2ZXIgaGFwcGVucyAqLworCQkJQ2UgPSB1dl9lbmNvZGUoVV9ORVUsIFZfTkVVLCBTR0lMT0dFTkNPREVfTk9ESVRIRVIpOworCQkqbHV2KysgPSAodWludDMyKUxlIDw8IDE0IHwgQ2U7CisJCWx1djMgKz0gMzsKKwl9Cit9CisKKyNpZiAhTE9HTFVWX1BVQkxJQworc3RhdGljCisjZW5kaWYKK3ZvaWQKK0xvZ0x1djMydG9YWVoodWludDMyIHAsIGZsb2F0IFhZWlszXSkKK3sKKwlkb3VibGUJTCwgdSwgdiwgcywgeCwgeTsKKwkJCQkJLyogZGVjb2RlIGx1bWluYW5jZSAqLworCUwgPSBMb2dMMTZ0b1koKGludClwID4+IDE2KTsKKwlpZiAoTCA8PSAwLikgeworCQlYWVpbMF0gPSBYWVpbMV0gPSBYWVpbMl0gPSAwLjsKKwkJcmV0dXJuOworCX0KKwkJCQkJLyogZGVjb2RlIGNvbG9yICovCisJdSA9IDEuL1VWU0NBTEUgKiAoKHA+PjggJiAweGZmKSArIC41KTsKKwl2ID0gMS4vVVZTQ0FMRSAqICgocCAmIDB4ZmYpICsgLjUpOworCXMgPSAxLi8oNi4qdSAtIDE2Lip2ICsgMTIuKTsKKwl4ID0gOS4qdSAqIHM7CisJeSA9IDQuKnYgKiBzOworCQkJCQkvKiBjb252ZXJ0IHRvIFhZWiAqLworCVhZWlswXSA9IChmbG9hdCkoeC95ICogTCk7CisJWFlaWzFdID0gKGZsb2F0KUw7CisJWFlaWzJdID0gKGZsb2F0KSgoMS4teC15KS95ICogTCk7Cit9CisKKyNpZiAhTE9HTFVWX1BVQkxJQworc3RhdGljCisjZW5kaWYKK3VpbnQzMgorTG9nTHV2MzJmcm9tWFlaKGZsb2F0IFhZWlszXSwgaW50IGVtKQoreworCXVuc2lnbmVkIGludAlMZSwgdWUsIHZlOworCWRvdWJsZQl1LCB2LCBzOworCQkJCQkvKiBlbmNvZGUgbHVtaW5hbmNlICovCisJTGUgPSAodW5zaWduZWQgaW50KUxvZ0wxNmZyb21ZKFhZWlsxXSwgZW0pOworCQkJCQkvKiBlbmNvZGUgY29sb3IgKi8KKwlzID0gWFlaWzBdICsgMTUuKlhZWlsxXSArIDMuKlhZWlsyXTsKKwlpZiAoIUxlIHx8IHMgPD0gMC4pIHsKKwkJdSA9IFVfTkVVOworCQl2ID0gVl9ORVU7CisJfSBlbHNlIHsKKwkJdSA9IDQuKlhZWlswXSAvIHM7CisJCXYgPSA5LipYWVpbMV0gLyBzOworCX0KKwlpZiAodSA8PSAwLikgdWUgPSAwOworCWVsc2UgdWUgPSBpdHJ1bmMoVVZTQ0FMRSp1LCBlbSk7CisJaWYgKHVlID4gMjU1KSB1ZSA9IDI1NTsKKwlpZiAodiA8PSAwLikgdmUgPSAwOworCWVsc2UgdmUgPSBpdHJ1bmMoVVZTQ0FMRSp2LCBlbSk7CisJaWYgKHZlID4gMjU1KSB2ZSA9IDI1NTsKKwkJCQkJLyogY29tYmluZSBlbmNvZGluZ3MgKi8KKwlyZXR1cm4gKExlIDw8IDE2IHwgdWUgPDwgOCB8IHZlKTsKK30KKworc3RhdGljIHZvaWQKK0x1djMydG9YWVooTG9nTHV2U3RhdGUqIHNwLCB1aW50OCogb3AsIHRtc2l6ZV90IG4pCit7CisJdWludDMyKiBsdXYgPSAodWludDMyKikgc3AtPnRidWY7ICAKKwlmbG9hdCogeHl6ID0gKGZsb2F0Kikgb3A7CisKKwl3aGlsZSAobi0tID4gMCkgeworCQlMb2dMdXYzMnRvWFlaKCpsdXYrKywgeHl6KTsKKwkJeHl6ICs9IDM7CisJfQorfQorCitzdGF0aWMgdm9pZAorTHV2MzJ0b0x1djQ4KExvZ0x1dlN0YXRlKiBzcCwgdWludDgqIG9wLCB0bXNpemVfdCBuKQoreworCXVpbnQzMiogbHV2ID0gKHVpbnQzMiopIHNwLT50YnVmOyAgCisJaW50MTYqIGx1djMgPSAoaW50MTYqKSBvcDsKKworCXdoaWxlIChuLS0gPiAwKSB7CisJCWRvdWJsZSB1LCB2OworCisJCSpsdXYzKysgPSAoaW50MTYpKCpsdXYgPj4gMTYpOworCQl1ID0gMS4vVVZTQ0FMRSAqICgoKmx1dj4+OCAmIDB4ZmYpICsgLjUpOworCQl2ID0gMS4vVVZTQ0FMRSAqICgoKmx1diAmIDB4ZmYpICsgLjUpOworCQkqbHV2MysrID0gKGludDE2KSh1ICogKDFMPDwxNSkpOworCQkqbHV2MysrID0gKGludDE2KSh2ICogKDFMPDwxNSkpOworCQlsdXYrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitMdXYzMnRvUkdCKExvZ0x1dlN0YXRlKiBzcCwgdWludDgqIG9wLCB0bXNpemVfdCBuKQoreworCXVpbnQzMiogbHV2ID0gKHVpbnQzMiopIHNwLT50YnVmOyAgCisJdWludDgqIHJnYiA9ICh1aW50OCopIG9wOworCisJd2hpbGUgKG4tLSA+IDApIHsKKwkJZmxvYXQgeHl6WzNdOworCisJCUxvZ0x1djMydG9YWVooKmx1disrLCB4eXopOworCQlYWVp0b1JHQjI0KHh5eiwgcmdiKTsKKwkJcmdiICs9IDM7CisJfQorfQorCitzdGF0aWMgdm9pZAorTHV2MzJmcm9tWFlaKExvZ0x1dlN0YXRlKiBzcCwgdWludDgqIG9wLCB0bXNpemVfdCBuKQoreworCXVpbnQzMiogbHV2ID0gKHVpbnQzMiopIHNwLT50YnVmOyAgCisJZmxvYXQqIHh5eiA9IChmbG9hdCopIG9wOworCisJd2hpbGUgKG4tLSA+IDApIHsKKwkJKmx1disrID0gTG9nTHV2MzJmcm9tWFlaKHh5eiwgc3AtPmVuY29kZV9tZXRoKTsKKwkJeHl6ICs9IDM7CisJfQorfQorCitzdGF0aWMgdm9pZAorTHV2MzJmcm9tTHV2NDgoTG9nTHV2U3RhdGUqIHNwLCB1aW50OCogb3AsIHRtc2l6ZV90IG4pCit7CisJdWludDMyKiBsdXYgPSAodWludDMyKikgc3AtPnRidWY7CisJaW50MTYqIGx1djMgPSAoaW50MTYqKSBvcDsKKworCWlmIChzcC0+ZW5jb2RlX21ldGggPT0gU0dJTE9HRU5DT0RFX05PRElUSEVSKSB7CisJCXdoaWxlIChuLS0gPiAwKSB7CisJCQkqbHV2KysgPSAodWludDMyKWx1djNbMF0gPDwgMTYgfAorCQkJCShsdXYzWzFdKih1aW50MzIpKFVWU0NBTEUrLjUpID4+IDcgJiAweGZmMDApIHwKKwkJCQkobHV2M1syXSoodWludDMyKShVVlNDQUxFKy41KSA+PiAxNSAmIDB4ZmYpOworCQkJbHV2MyArPSAzOworCQl9CisJCXJldHVybjsKKwl9CisJd2hpbGUgKG4tLSA+IDApIHsKKwkJKmx1disrID0gKHVpbnQzMilsdXYzWzBdIDw8IDE2IHwKKwkoaXRydW5jKGx1djNbMV0qKFVWU0NBTEUvKDE8PDE1KSksIHNwLT5lbmNvZGVfbWV0aCkgPDwgOCAmIDB4ZmYwMCkgfAorCQkoaXRydW5jKGx1djNbMl0qKFVWU0NBTEUvKDE8PDE1KSksIHNwLT5lbmNvZGVfbWV0aCkgJiAweGZmKTsKKwkJbHV2MyArPSAzOworCX0KK30KKworc3RhdGljIHZvaWQKK19sb2dMdXZOb3AoTG9nTHV2U3RhdGUqIHNwLCB1aW50OCogb3AsIHRtc2l6ZV90IG4pCit7CisJKHZvaWQpIHNwOyAodm9pZCkgb3A7ICh2b2lkKSBuOworfQorCitzdGF0aWMgaW50CitMb2dMMTZHdWVzc0RhdGFGbXQoVElGRkRpcmVjdG9yeSAqdGQpCit7CisjZGVmaW5lCVBBQ0socyxiLGYpCSgoKGIpPDw2KXwoKHMpPDwzKXwoZikpCisJc3dpdGNoIChQQUNLKHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwsIHRkLT50ZF9iaXRzcGVyc2FtcGxlLCB0ZC0+dGRfc2FtcGxlZm9ybWF0KSkgeworCWNhc2UgUEFDSygxLCAzMiwgU0FNUExFRk9STUFUX0lFRUVGUCk6CisJCXJldHVybiAoU0dJTE9HREFUQUZNVF9GTE9BVCk7CisJY2FzZSBQQUNLKDEsIDE2LCBTQU1QTEVGT1JNQVRfVk9JRCk6CisJY2FzZSBQQUNLKDEsIDE2LCBTQU1QTEVGT1JNQVRfSU5UKToKKwljYXNlIFBBQ0soMSwgMTYsIFNBTVBMRUZPUk1BVF9VSU5UKToKKwkJcmV0dXJuIChTR0lMT0dEQVRBRk1UXzE2QklUKTsKKwljYXNlIFBBQ0soMSwgIDgsIFNBTVBMRUZPUk1BVF9WT0lEKToKKwljYXNlIFBBQ0soMSwgIDgsIFNBTVBMRUZPUk1BVF9VSU5UKToKKwkJcmV0dXJuIChTR0lMT0dEQVRBRk1UXzhCSVQpOworCX0KKyN1bmRlZiBQQUNLCisJcmV0dXJuIChTR0lMT0dEQVRBRk1UX1VOS05PV04pOworfQorCitzdGF0aWMgdG1zaXplX3QKK211bHRpcGx5X21zKHRtc2l6ZV90IG0xLCB0bXNpemVfdCBtMikKK3sKKwl0bXNpemVfdCBieXRlcyA9IG0xICogbTI7CisKKwlpZiAobTEgJiYgYnl0ZXMgLyBtMSAhPSBtMikKKwkJYnl0ZXMgPSAwOworCisJcmV0dXJuIGJ5dGVzOworfQorCitzdGF0aWMgaW50CitMb2dMMTZJbml0U3RhdGUoVElGRiogdGlmKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIkxvZ0wxNkluaXRTdGF0ZSI7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCUxvZ0x1dlN0YXRlKiBzcCA9IERlY29kZXJTdGF0ZSh0aWYpOworCisJYXNzZXJ0KHNwICE9IE5VTEwpOworCWFzc2VydCh0ZC0+dGRfcGhvdG9tZXRyaWMgPT0gUEhPVE9NRVRSSUNfTE9HTCk7CisKKwkvKiBmb3Igc29tZSByZWFzb24sIHdlIGNhbid0IGRvIHRoaXMgaW4gVElGRkluaXRMb2dMMTYgKi8KKwlpZiAoc3AtPnVzZXJfZGF0YWZtdCA9PSBTR0lMT0dEQVRBRk1UX1VOS05PV04pCisJCXNwLT51c2VyX2RhdGFmbXQgPSBMb2dMMTZHdWVzc0RhdGFGbXQodGQpOworCXN3aXRjaCAoc3AtPnVzZXJfZGF0YWZtdCkgeworCWNhc2UgU0dJTE9HREFUQUZNVF9GTE9BVDoKKwkJc3AtPnBpeGVsX3NpemUgPSBzaXplb2YgKGZsb2F0KTsKKwkJYnJlYWs7CisJY2FzZSBTR0lMT0dEQVRBRk1UXzE2QklUOgorCQlzcC0+cGl4ZWxfc2l6ZSA9IHNpemVvZiAoaW50MTYpOworCQlicmVhazsKKwljYXNlIFNHSUxPR0RBVEFGTVRfOEJJVDoKKwkJc3AtPnBpeGVsX3NpemUgPSBzaXplb2YgKHVpbnQ4KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJICAgICJObyBzdXBwb3J0IGZvciBjb252ZXJ0aW5nIHVzZXIgZGF0YSBmb3JtYXQgdG8gTG9nTCIpOworCQlyZXR1cm4gKDApOworCX0KKyAgICAgICAgaWYoIGlzVGlsZWQodGlmKSApCisgICAgICAgICAgICBzcC0+dGJ1ZmxlbiA9IG11bHRpcGx5X21zKHRkLT50ZF90aWxld2lkdGgsIHRkLT50ZF90aWxlbGVuZ3RoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3AtPnRidWZsZW4gPSBtdWx0aXBseV9tcyh0ZC0+dGRfaW1hZ2V3aWR0aCwgdGQtPnRkX3Jvd3NwZXJzdHJpcCk7CisJaWYgKG11bHRpcGx5X21zKHNwLT50YnVmbGVuLCBzaXplb2YgKGludDE2KSkgPT0gMCB8fAorCSAgICAoc3AtPnRidWYgPSAodWludDgqKSBfVElGRm1hbGxvYyhzcC0+dGJ1ZmxlbiAqIHNpemVvZiAoaW50MTYpKSkgPT0gTlVMTCkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiTm8gc3BhY2UgZm9yIFNHSUxvZyB0cmFuc2xhdGlvbiBidWZmZXIiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIGludAorTG9nTHV2R3Vlc3NEYXRhRm10KFRJRkZEaXJlY3RvcnkgKnRkKQoreworCWludCBndWVzczsKKworCS8qCisJICogSWYgdGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgdGhlaXIgZGF0YWZtdCwKKwkgKiB0YWtlIG91ciBiZXN0IGd1ZXNzIGZyb20gdGhlIGJpdHNwZXJzYW1wbGUuCisJICovCisjZGVmaW5lCVBBQ0soYSxiKQkoKChhKTw8Myl8KGIpKQorCXN3aXRjaCAoUEFDSyh0ZC0+dGRfYml0c3BlcnNhbXBsZSwgdGQtPnRkX3NhbXBsZWZvcm1hdCkpIHsKKwljYXNlIFBBQ0soMzIsIFNBTVBMRUZPUk1BVF9JRUVFRlApOgorCQlndWVzcyA9IFNHSUxPR0RBVEFGTVRfRkxPQVQ7CisJCWJyZWFrOworCWNhc2UgUEFDSygzMiwgU0FNUExFRk9STUFUX1ZPSUQpOgorCWNhc2UgUEFDSygzMiwgU0FNUExFRk9STUFUX1VJTlQpOgorCWNhc2UgUEFDSygzMiwgU0FNUExFRk9STUFUX0lOVCk6CisJCWd1ZXNzID0gU0dJTE9HREFUQUZNVF9SQVc7CisJCWJyZWFrOworCWNhc2UgUEFDSygxNiwgU0FNUExFRk9STUFUX1ZPSUQpOgorCWNhc2UgUEFDSygxNiwgU0FNUExFRk9STUFUX0lOVCk6CisJY2FzZSBQQUNLKDE2LCBTQU1QTEVGT1JNQVRfVUlOVCk6CisJCWd1ZXNzID0gU0dJTE9HREFUQUZNVF8xNkJJVDsKKwkJYnJlYWs7CisJY2FzZSBQQUNLKCA4LCBTQU1QTEVGT1JNQVRfVk9JRCk6CisJY2FzZSBQQUNLKCA4LCBTQU1QTEVGT1JNQVRfVUlOVCk6CisJCWd1ZXNzID0gU0dJTE9HREFUQUZNVF84QklUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlndWVzcyA9IFNHSUxPR0RBVEFGTVRfVU5LTk9XTjsKKwkJYnJlYWs7CisjdW5kZWYgUEFDSworCX0KKwkvKgorCSAqIERvdWJsZS1jaGVjayBzYW1wbGVzIHBlciBwaXhlbC4KKwkgKi8KKwlzd2l0Y2ggKHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwpIHsKKwljYXNlIDE6CisJCWlmIChndWVzcyAhPSBTR0lMT0dEQVRBRk1UX1JBVykKKwkJCWd1ZXNzID0gU0dJTE9HREFUQUZNVF9VTktOT1dOOworCQlicmVhazsKKwljYXNlIDM6CisJCWlmIChndWVzcyA9PSBTR0lMT0dEQVRBRk1UX1JBVykKKwkJCWd1ZXNzID0gU0dJTE9HREFUQUZNVF9VTktOT1dOOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlndWVzcyA9IFNHSUxPR0RBVEFGTVRfVU5LTk9XTjsKKwkJYnJlYWs7CisJfQorCXJldHVybiAoZ3Vlc3MpOworfQorCitzdGF0aWMgaW50CitMb2dMdXZJbml0U3RhdGUoVElGRiogdGlmKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIkxvZ0x1dkluaXRTdGF0ZSI7CisJVElGRkRpcmVjdG9yeSogdGQgPSAmdGlmLT50aWZfZGlyOworCUxvZ0x1dlN0YXRlKiBzcCA9IERlY29kZXJTdGF0ZSh0aWYpOworCisJYXNzZXJ0KHNwICE9IE5VTEwpOworCWFzc2VydCh0ZC0+dGRfcGhvdG9tZXRyaWMgPT0gUEhPVE9NRVRSSUNfTE9HTFVWKTsKKworCS8qIGZvciBzb21lIHJlYXNvbiwgd2UgY2FuJ3QgZG8gdGhpcyBpbiBUSUZGSW5pdExvZ0x1diAqLworCWlmICh0ZC0+dGRfcGxhbmFyY29uZmlnICE9IFBMQU5BUkNPTkZJR19DT05USUcpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJICAgICJTR0lMb2cgY29tcHJlc3Npb24gY2Fubm90IGhhbmRsZSBub24tY29udGlndW91cyBkYXRhIik7CisJCXJldHVybiAoMCk7CisJfQorCWlmIChzcC0+dXNlcl9kYXRhZm10ID09IFNHSUxPR0RBVEFGTVRfVU5LTk9XTikKKwkJc3AtPnVzZXJfZGF0YWZtdCA9IExvZ0x1dkd1ZXNzRGF0YUZtdCh0ZCk7CisJc3dpdGNoIChzcC0+dXNlcl9kYXRhZm10KSB7CisJY2FzZSBTR0lMT0dEQVRBRk1UX0ZMT0FUOgorCQlzcC0+cGl4ZWxfc2l6ZSA9IDMqc2l6ZW9mIChmbG9hdCk7CisJCWJyZWFrOworCWNhc2UgU0dJTE9HREFUQUZNVF8xNkJJVDoKKwkJc3AtPnBpeGVsX3NpemUgPSAzKnNpemVvZiAoaW50MTYpOworCQlicmVhazsKKwljYXNlIFNHSUxPR0RBVEFGTVRfUkFXOgorCQlzcC0+cGl4ZWxfc2l6ZSA9IHNpemVvZiAodWludDMyKTsKKwkJYnJlYWs7CisJY2FzZSBTR0lMT0dEQVRBRk1UXzhCSVQ6CisJCXNwLT5waXhlbF9zaXplID0gMypzaXplb2YgKHVpbnQ4KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJICAgICJObyBzdXBwb3J0IGZvciBjb252ZXJ0aW5nIHVzZXIgZGF0YSBmb3JtYXQgdG8gTG9nTHV2Iik7CisJCXJldHVybiAoMCk7CisJfQorICAgICAgICBpZiggaXNUaWxlZCh0aWYpICkKKyAgICAgICAgICAgIHNwLT50YnVmbGVuID0gbXVsdGlwbHlfbXModGQtPnRkX3RpbGV3aWR0aCwgdGQtPnRkX3RpbGVsZW5ndGgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzcC0+dGJ1ZmxlbiA9IG11bHRpcGx5X21zKHRkLT50ZF9pbWFnZXdpZHRoLCB0ZC0+dGRfcm93c3BlcnN0cmlwKTsKKwlpZiAobXVsdGlwbHlfbXMoc3AtPnRidWZsZW4sIHNpemVvZiAodWludDMyKSkgPT0gMCB8fAorCSAgICAoc3AtPnRidWYgPSAodWludDgqKSBfVElGRm1hbGxvYyhzcC0+dGJ1ZmxlbiAqIHNpemVvZiAodWludDMyKSkpID09IE5VTEwpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIk5vIHNwYWNlIGZvciBTR0lMb2cgdHJhbnNsYXRpb24gYnVmZmVyIik7CisJCXJldHVybiAoMCk7CisJfQorCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbnQKK0xvZ0x1dkZpeHVwVGFncyhUSUZGKiB0aWYpCit7CisJKHZvaWQpIHRpZjsKKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW50CitMb2dMdXZTZXR1cERlY29kZShUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiTG9nTHV2U2V0dXBEZWNvZGUiOworCUxvZ0x1dlN0YXRlKiBzcCA9IERlY29kZXJTdGF0ZSh0aWYpOworCVRJRkZEaXJlY3RvcnkqIHRkID0gJnRpZi0+dGlmX2RpcjsKKworCXRpZi0+dGlmX3Bvc3RkZWNvZGUgPSBfVElGRk5vUG9zdERlY29kZTsKKwlzd2l0Y2ggKHRkLT50ZF9waG90b21ldHJpYykgeworCWNhc2UgUEhPVE9NRVRSSUNfTE9HTFVWOgorCQlpZiAoIUxvZ0x1dkluaXRTdGF0ZSh0aWYpKQorCQkJYnJlYWs7CisJCWlmICh0ZC0+dGRfY29tcHJlc3Npb24gPT0gQ09NUFJFU1NJT05fU0dJTE9HMjQpIHsKKwkJCXRpZi0+dGlmX2RlY29kZXJvdyA9IExvZ0x1dkRlY29kZTI0OworCQkJc3dpdGNoIChzcC0+dXNlcl9kYXRhZm10KSB7CisJCQljYXNlIFNHSUxPR0RBVEFGTVRfRkxPQVQ6CisJCQkJc3AtPnRmdW5jID0gTHV2MjR0b1hZWjsgIAorCQkJCWJyZWFrOworCQkJY2FzZSBTR0lMT0dEQVRBRk1UXzE2QklUOgorCQkJCXNwLT50ZnVuYyA9IEx1djI0dG9MdXY0ODsgIAorCQkJCWJyZWFrOworCQkJY2FzZSBTR0lMT0dEQVRBRk1UXzhCSVQ6CisJCQkJc3AtPnRmdW5jID0gTHV2MjR0b1JHQjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXRpZi0+dGlmX2RlY29kZXJvdyA9IExvZ0x1dkRlY29kZTMyOworCQkJc3dpdGNoIChzcC0+dXNlcl9kYXRhZm10KSB7CisJCQljYXNlIFNHSUxPR0RBVEFGTVRfRkxPQVQ6CisJCQkJc3AtPnRmdW5jID0gTHV2MzJ0b1hZWjsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0dJTE9HREFUQUZNVF8xNkJJVDoKKwkJCQlzcC0+dGZ1bmMgPSBMdXYzMnRvTHV2NDg7CisJCQkJYnJlYWs7CisJCQljYXNlIFNHSUxPR0RBVEFGTVRfOEJJVDoKKwkJCQlzcC0+dGZ1bmMgPSBMdXYzMnRvUkdCOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiAoMSk7CisJY2FzZSBQSE9UT01FVFJJQ19MT0dMOgorCQlpZiAoIUxvZ0wxNkluaXRTdGF0ZSh0aWYpKQorCQkJYnJlYWs7CisJCXRpZi0+dGlmX2RlY29kZXJvdyA9IExvZ0wxNkRlY29kZTsKKwkJc3dpdGNoIChzcC0+dXNlcl9kYXRhZm10KSB7CisJCWNhc2UgU0dJTE9HREFUQUZNVF9GTE9BVDoKKwkJCXNwLT50ZnVuYyA9IEwxNnRvWTsKKwkJCWJyZWFrOworCQljYXNlIFNHSUxPR0RBVEFGTVRfOEJJVDoKKwkJCXNwLT50ZnVuYyA9IEwxNnRvR3J5OworCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuICgxKTsKKwlkZWZhdWx0OgorCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkgICAgIkluYXBwcm9wcmlhdGUgcGhvdG9tZXRyaWMgaW50ZXJwcmV0YXRpb24gJWQgZm9yIFNHSUxvZyBjb21wcmVzc2lvbjsgJXMiLAorCQkgICAgdGQtPnRkX3Bob3RvbWV0cmljLCAibXVzdCBiZSBlaXRoZXIgTG9nTFVWIG9yIExvZ0wiKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK0xvZ0x1dlNldHVwRW5jb2RlKFRJRkYqIHRpZikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJMb2dMdXZTZXR1cEVuY29kZSI7CisJTG9nTHV2U3RhdGUqIHNwID0gRW5jb2RlclN0YXRlKHRpZik7CisJVElGRkRpcmVjdG9yeSogdGQgPSAmdGlmLT50aWZfZGlyOworCisJc3dpdGNoICh0ZC0+dGRfcGhvdG9tZXRyaWMpIHsKKwljYXNlIFBIT1RPTUVUUklDX0xPR0xVVjoKKwkJaWYgKCFMb2dMdXZJbml0U3RhdGUodGlmKSkKKwkJCWJyZWFrOworCQlpZiAodGQtPnRkX2NvbXByZXNzaW9uID09IENPTVBSRVNTSU9OX1NHSUxPRzI0KSB7CisJCQl0aWYtPnRpZl9lbmNvZGVyb3cgPSBMb2dMdXZFbmNvZGUyNDsKKwkJCXN3aXRjaCAoc3AtPnVzZXJfZGF0YWZtdCkgeworCQkJY2FzZSBTR0lMT0dEQVRBRk1UX0ZMT0FUOgorCQkJCXNwLT50ZnVuYyA9IEx1djI0ZnJvbVhZWjsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0dJTE9HREFUQUZNVF8xNkJJVDoKKwkJCQlzcC0+dGZ1bmMgPSBMdXYyNGZyb21MdXY0ODsgIAorCQkJCWJyZWFrOworCQkJY2FzZSBTR0lMT0dEQVRBRk1UX1JBVzoKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZ290byBub3RzdXBwb3J0ZWQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0aWYtPnRpZl9lbmNvZGVyb3cgPSBMb2dMdXZFbmNvZGUzMjsgIAorCQkJc3dpdGNoIChzcC0+dXNlcl9kYXRhZm10KSB7CisJCQljYXNlIFNHSUxPR0RBVEFGTVRfRkxPQVQ6CisJCQkJc3AtPnRmdW5jID0gTHV2MzJmcm9tWFlaOyAgCisJCQkJYnJlYWs7CisJCQljYXNlIFNHSUxPR0RBVEFGTVRfMTZCSVQ6CisJCQkJc3AtPnRmdW5jID0gTHV2MzJmcm9tTHV2NDg7ICAKKwkJCQlicmVhazsKKwkJCWNhc2UgU0dJTE9HREFUQUZNVF9SQVc6CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWdvdG8gbm90c3VwcG9ydGVkOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgUEhPVE9NRVRSSUNfTE9HTDoKKwkJaWYgKCFMb2dMMTZJbml0U3RhdGUodGlmKSkKKwkJCWJyZWFrOworCQl0aWYtPnRpZl9lbmNvZGVyb3cgPSBMb2dMMTZFbmNvZGU7ICAKKwkJc3dpdGNoIChzcC0+dXNlcl9kYXRhZm10KSB7CisJCWNhc2UgU0dJTE9HREFUQUZNVF9GTE9BVDoKKwkJCXNwLT50ZnVuYyA9IEwxNmZyb21ZOworCQkJYnJlYWs7CisJCWNhc2UgU0dJTE9HREFUQUZNVF8xNkJJVDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBub3RzdXBwb3J0ZWQ7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJICAgICJJbmFwcHJvcHJpYXRlIHBob3RvbWV0cmljIGludGVycHJldGF0aW9uICVkIGZvciBTR0lMb2cgY29tcHJlc3Npb247ICVzIiwKKwkJICAgIHRkLT50ZF9waG90b21ldHJpYywgIm11c3QgYmUgZWl0aGVyIExvZ0xVViBvciBMb2dMIik7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gKDEpOworbm90c3VwcG9ydGVkOgorCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJICAgICJTR0lMb2cgY29tcHJlc3Npb24gc3VwcG9ydGVkIG9ubHkgZm9yICVzLCBvciByYXcgZGF0YSIsCisJICAgIHRkLT50ZF9waG90b21ldHJpYyA9PSBQSE9UT01FVFJJQ19MT0dMID8gIlksIEwiIDogIlhZWiwgTHV2Iik7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQKK0xvZ0x1dkNsb3NlKFRJRkYqIHRpZikKK3sKKwlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisKKwkvKgorCSAqIEZvciBjb25zaXN0ZW5jeSwgd2UgYWx3YXlzIHdhbnQgdG8gd3JpdGUgb3V0IHRoZSBzYW1lCisJICogYml0c3BlcnNhbXBsZSBhbmQgc2FtcGxlZm9ybWF0IGZvciBvdXIgVElGRiBmaWxlLAorCSAqIHJlZ2FyZGxlc3Mgb2YgdGhlIGRhdGEgZm9ybWF0IGJlaW5nIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorCSAqIFNpbmNlIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgYWZ0ZXIgdGFncyBoYXZlIGJlZW4gc2V0IGJ1dAorCSAqIGJlZm9yZSB0aGV5IGhhdmUgYmVlbiByZWNvcmRlZCBpbiB0aGUgZmlsZSwgd2UgcmVzZXQgdGhlbSBoZXJlLgorCSAqLworCXRkLT50ZF9zYW1wbGVzcGVycGl4ZWwgPQorCSAgICAodGQtPnRkX3Bob3RvbWV0cmljID09IFBIT1RPTUVUUklDX0xPR0wpID8gMSA6IDM7CisJdGQtPnRkX2JpdHNwZXJzYW1wbGUgPSAxNjsKKwl0ZC0+dGRfc2FtcGxlZm9ybWF0ID0gU0FNUExFRk9STUFUX0lOVDsKK30KKworc3RhdGljIHZvaWQKK0xvZ0x1dkNsZWFudXAoVElGRiogdGlmKQoreworCUxvZ0x1dlN0YXRlKiBzcCA9IChMb2dMdXZTdGF0ZSAqKXRpZi0+dGlmX2RhdGE7CisKKwlhc3NlcnQoc3AgIT0gMCk7CisKKwl0aWYtPnRpZl90YWdtZXRob2RzLnZnZXRmaWVsZCA9IHNwLT52Z2V0cGFyZW50OworCXRpZi0+dGlmX3RhZ21ldGhvZHMudnNldGZpZWxkID0gc3AtPnZzZXRwYXJlbnQ7CisKKwlpZiAoc3AtPnRidWYpCisJCV9USUZGZnJlZShzcC0+dGJ1Zik7CisJX1RJRkZmcmVlKHNwKTsKKwl0aWYtPnRpZl9kYXRhID0gTlVMTDsKKworCV9USUZGU2V0RGVmYXVsdENvbXByZXNzaW9uU3RhdGUodGlmKTsKK30KKworc3RhdGljIGludAorTG9nTHV2VlNldEZpZWxkKFRJRkYqIHRpZiwgdWludDMyIHRhZywgdmFfbGlzdCBhcCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJMb2dMdXZWU2V0RmllbGQiOworCUxvZ0x1dlN0YXRlKiBzcCA9IERlY29kZXJTdGF0ZSh0aWYpOworCWludCBicHMsIGZtdDsKKworCXN3aXRjaCAodGFnKSB7CisJY2FzZSBUSUZGVEFHX1NHSUxPR0RBVEFGTVQ6CisJCXNwLT51c2VyX2RhdGFmbXQgPSAoaW50KSB2YV9hcmcoYXAsIGludCk7CisJCS8qCisJCSAqIFR3ZWFrIHRoZSBUSUZGIGhlYWRlciBzbyB0aGF0IHRoZSByZXN0IG9mIGxpYnRpZmYga25vd3Mgd2hhdAorCQkgKiBzaXplIG9mIGRhdGEgd2lsbCBiZSBwYXNzZWQgYmV0d2VlbiBhcHAgYW5kIGxpYnJhcnksIGFuZAorCQkgKiBhc3N1bWUgdGhhdCB0aGUgYXBwIGtub3dzIHdoYXQgaXQgaXMgZG9pbmcgYW5kIGlzIG5vdAorCQkgKiBjb25mdXNlZCBieSB0aGVzZSBoZWFkZXIgbWFuaXB1bGF0aW9ucy4uLgorCQkgKi8KKwkJc3dpdGNoIChzcC0+dXNlcl9kYXRhZm10KSB7CisJCWNhc2UgU0dJTE9HREFUQUZNVF9GTE9BVDoKKwkJCWJwcyA9IDMyLCBmbXQgPSBTQU1QTEVGT1JNQVRfSUVFRUZQOworCQkJYnJlYWs7CisJCWNhc2UgU0dJTE9HREFUQUZNVF8xNkJJVDoKKwkJCWJwcyA9IDE2LCBmbXQgPSBTQU1QTEVGT1JNQVRfSU5UOworCQkJYnJlYWs7CisJCWNhc2UgU0dJTE9HREFUQUZNVF9SQVc6CisJCQlicHMgPSAzMiwgZm10ID0gU0FNUExFRk9STUFUX1VJTlQ7CisJCQlUSUZGU2V0RmllbGQodGlmLCBUSUZGVEFHX1NBTVBMRVNQRVJQSVhFTCwgMSk7CisJCQlicmVhazsKKwkJY2FzZSBTR0lMT0dEQVRBRk1UXzhCSVQ6CisJCQlicHMgPSA4LCBmbXQgPSBTQU1QTEVGT1JNQVRfVUlOVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIHRpZi0+dGlmX25hbWUsCisJCQkgICAgIlVua25vd24gZGF0YSBmb3JtYXQgJWQgZm9yIExvZ0x1diBjb21wcmVzc2lvbiIsCisJCQkgICAgc3AtPnVzZXJfZGF0YWZtdCk7CisJCQlyZXR1cm4gKDApOworCQl9CisJCVRJRkZTZXRGaWVsZCh0aWYsIFRJRkZUQUdfQklUU1BFUlNBTVBMRSwgYnBzKTsKKwkJVElGRlNldEZpZWxkKHRpZiwgVElGRlRBR19TQU1QTEVGT1JNQVQsIGZtdCk7CisJCS8qCisJCSAqIE11c3QgcmVjYWxjdWxhdGUgc2l6ZXMgc2hvdWxkIGJpdHMvc2FtcGxlIGNoYW5nZS4KKwkJICovCisJCXRpZi0+dGlmX3RpbGVzaXplID0gaXNUaWxlZCh0aWYpID8gVElGRlRpbGVTaXplKHRpZikgOiAodG1zaXplX3QpIC0xOworCQl0aWYtPnRpZl9zY2FubGluZXNpemUgPSBUSUZGU2NhbmxpbmVTaXplKHRpZik7CisJCXJldHVybiAoMSk7CisJY2FzZSBUSUZGVEFHX1NHSUxPR0VOQ09ERToKKwkJc3AtPmVuY29kZV9tZXRoID0gKGludCkgdmFfYXJnKGFwLCBpbnQpOworCQlpZiAoc3AtPmVuY29kZV9tZXRoICE9IFNHSUxPR0VOQ09ERV9OT0RJVEhFUiAmJgorCQkgICAgc3AtPmVuY29kZV9tZXRoICE9IFNHSUxPR0VOQ09ERV9SQU5ESVRIRVIpIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgIlVua25vd24gZW5jb2RpbmcgJWQgZm9yIExvZ0x1diBjb21wcmVzc2lvbiIsCisJCQkgICAgc3AtPmVuY29kZV9tZXRoKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJcmV0dXJuICgxKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKCpzcC0+dnNldHBhcmVudCkodGlmLCB0YWcsIGFwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK0xvZ0x1dlZHZXRGaWVsZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcsIHZhX2xpc3QgYXApCit7CisJTG9nTHV2U3RhdGUgKnNwID0gKExvZ0x1dlN0YXRlICopdGlmLT50aWZfZGF0YTsKKworCXN3aXRjaCAodGFnKSB7CisJY2FzZSBUSUZGVEFHX1NHSUxPR0RBVEFGTVQ6CisJCSp2YV9hcmcoYXAsIGludCopID0gc3AtPnVzZXJfZGF0YWZtdDsKKwkJcmV0dXJuICgxKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKCpzcC0+dmdldHBhcmVudCkodGlmLCB0YWcsIGFwKTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBUSUZGRmllbGQgTG9nTHV2RmllbGRzW10gPSB7CisgICAgeyBUSUZGVEFHX1NHSUxPR0RBVEFGTVQsIDAsIDAsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX0lOVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9QU0VVRE8sIFRSVUUsIEZBTFNFLCAiU0dJTG9nRGF0YUZtdCIsIE5VTEx9LAorICAgIHsgVElGRlRBR19TR0lMT0dFTkNPREUsIDAsIDAsIFRJRkZfU0hPUlQsIDAsIFRJRkZfU0VUR0VUX0lOVCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9QU0VVRE8sIFRSVUUsIEZBTFNFLCAiU0dJTG9nRW5jb2RlIiwgTlVMTH0KK307CisKK2ludAorVElGRkluaXRTR0lMb2coVElGRiogdGlmLCBpbnQgc2NoZW1lKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZJbml0U0dJTG9nIjsKKwlMb2dMdXZTdGF0ZSogc3A7CisKKwlhc3NlcnQoc2NoZW1lID09IENPTVBSRVNTSU9OX1NHSUxPRzI0IHx8IHNjaGVtZSA9PSBDT01QUkVTU0lPTl9TR0lMT0cpOworCisJLyoKKwkgKiBNZXJnZSBjb2RlYy1zcGVjaWZpYyB0YWcgaW5mb3JtYXRpb24uCisJICovCisJaWYgKCFfVElGRk1lcmdlRmllbGRzKHRpZiwgTG9nTHV2RmllbGRzLAorCQkJICAgICAgVElGRkFycmF5Q291bnQoTG9nTHV2RmllbGRzKSkpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJICAgICJNZXJnaW5nIFNHSUxvZyBjb2RlYy1zcGVjaWZpYyB0YWdzIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIEFsbG9jYXRlIHN0YXRlIGJsb2NrIHNvIHRhZyBtZXRob2RzIGhhdmUgc3RvcmFnZSB0byByZWNvcmQgdmFsdWVzLgorCSAqLworCXRpZi0+dGlmX2RhdGEgPSAodWludDgqKSBfVElGRm1hbGxvYyhzaXplb2YgKExvZ0x1dlN0YXRlKSk7CisJaWYgKHRpZi0+dGlmX2RhdGEgPT0gTlVMTCkKKwkJZ290byBiYWQ7CisJc3AgPSAoTG9nTHV2U3RhdGUqKSB0aWYtPnRpZl9kYXRhOworCV9USUZGbWVtc2V0KCh2b2lkKilzcCwgMCwgc2l6ZW9mICgqc3ApKTsKKwlzcC0+dXNlcl9kYXRhZm10ID0gU0dJTE9HREFUQUZNVF9VTktOT1dOOworCXNwLT5lbmNvZGVfbWV0aCA9IChzY2hlbWUgPT0gQ09NUFJFU1NJT05fU0dJTE9HMjQpID8KKwkgICAgU0dJTE9HRU5DT0RFX1JBTkRJVEhFUiA6IFNHSUxPR0VOQ09ERV9OT0RJVEhFUjsKKwlzcC0+dGZ1bmMgPSBfbG9nTHV2Tm9wOworCisJLyoKKwkgKiBJbnN0YWxsIGNvZGVjIG1ldGhvZHMuCisJICogTkI6IHRpZl9kZWNvZGVyb3cgJiB0aWZfZW5jb2Rlcm93IGFyZSBmaWxsZWQKKwkgKiAgICAgaW4gYXQgc2V0dXAgdGltZS4KKwkgKi8KKwl0aWYtPnRpZl9maXh1cHRhZ3MgPSBMb2dMdXZGaXh1cFRhZ3M7ICAKKwl0aWYtPnRpZl9zZXR1cGRlY29kZSA9IExvZ0x1dlNldHVwRGVjb2RlOworCXRpZi0+dGlmX2RlY29kZXN0cmlwID0gTG9nTHV2RGVjb2RlU3RyaXA7CisJdGlmLT50aWZfZGVjb2RldGlsZSA9IExvZ0x1dkRlY29kZVRpbGU7CisJdGlmLT50aWZfc2V0dXBlbmNvZGUgPSBMb2dMdXZTZXR1cEVuY29kZTsKKwl0aWYtPnRpZl9lbmNvZGVzdHJpcCA9IExvZ0x1dkVuY29kZVN0cmlwOyAgCisJdGlmLT50aWZfZW5jb2RldGlsZSA9IExvZ0x1dkVuY29kZVRpbGU7CisJdGlmLT50aWZfY2xvc2UgPSBMb2dMdXZDbG9zZTsKKwl0aWYtPnRpZl9jbGVhbnVwID0gTG9nTHV2Q2xlYW51cDsKKworCS8qCisJICogT3ZlcnJpZGUgcGFyZW50IGdldC9zZXQgZmllbGQgbWV0aG9kcy4KKwkgKi8KKwlzcC0+dmdldHBhcmVudCA9IHRpZi0+dGlmX3RhZ21ldGhvZHMudmdldGZpZWxkOworCXRpZi0+dGlmX3RhZ21ldGhvZHMudmdldGZpZWxkID0gTG9nTHV2VkdldEZpZWxkOyAgIC8qIGhvb2sgZm9yIGNvZGVjIHRhZ3MgKi8KKwlzcC0+dnNldHBhcmVudCA9IHRpZi0+dGlmX3RhZ21ldGhvZHMudnNldGZpZWxkOworCXRpZi0+dGlmX3RhZ21ldGhvZHMudnNldGZpZWxkID0gTG9nTHV2VlNldEZpZWxkOyAgIC8qIGhvb2sgZm9yIGNvZGVjIHRhZ3MgKi8KKworCXJldHVybiAoMSk7CitiYWQ6CisJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJICAgICAiJXM6IE5vIHNwYWNlIGZvciBMb2dMdXYgc3RhdGUgYmxvY2siLCB0aWYtPnRpZl9uYW1lKTsKKwlyZXR1cm4gKDApOworfQorI2VuZGlmIC8qIExPR0xVVl9TVVBQT1JUICovCisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTggc3c9OCBub2V0OiAqLworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfbHp3LmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9sencuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yjc2ZGQwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfbHp3LmMKQEAgLTAsMCArMSwxMTc4IEBACisvKiAkSWQ6IHRpZl9sencuYyx2IDEuNDkgMjAxNS0wOC0zMCAyMTowNzo0NCBlcm91YXVsdCBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCAKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgorICogU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcy4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSAKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTQU0gTEVGRkxFUiBPUiBTSUxJQ09OIEdSQVBISUNTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgKiBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgKiBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GIAorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSAKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgInRpZmZpb3AuaCIKKyNpZmRlZiBMWldfU1VQUE9SVAorLyoKKyAqIFRJRkYgTGlicmFyeS4gIAorICogUmV2IDUuMCBMZW1wZWwtWml2ICYgV2VsY2ggQ29tcHJlc3Npb24gU3VwcG9ydAorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gdGhlIGNvbXByZXNzIHByb2dyYW0gd2hvc2UgY29kZSBpcworICogZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5IEphbWVzIEEuIFdvb2RzLAorICogZGVyaXZlZCBmcm9tIG9yaWdpbmFsIHdvcmsgYnkgU3BlbmNlciBUaG9tYXMgYW5kIEpvc2VwaCBPcm9zdC4KKyAqCisgKiBUaGUgb3JpZ2luYWwgQmVya2VsZXkgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGJlbG93IGluIGl0cyBlbnRpcmV0eS4KKyAqLworI2luY2x1ZGUgInRpZl9wcmVkaWN0LmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKgorICogTkI6IFRoZSA1LjAgc3BlYyBkZXNjcmliZXMgYSBkaWZmZXJlbnQgYWxnb3JpdGhtIHRoYW4gQWxkdXMKKyAqICAgICBpbXBsZW1lbnRzLiAgU3BlY2lmaWNhbGx5LCBBbGR1cyBkb2VzIGNvZGUgbGVuZ3RoIHRyYW5zaXRpb25zCisgKiAgICAgb25lIGNvZGUgZWFybGllciB0aGFuIHNob3VsZCBiZSBkb25lIChmb3IgcmVhbCBMWlcpLgorICogICAgIEVhcmxpZXIgdmVyc2lvbnMgb2YgdGhpcyBsaWJyYXJ5IGltcGxlbWVudGVkIHRoZSBjb3JyZWN0CisgKiAgICAgTFpXIGFsZ29yaXRobSwgYnV0IGVtaXR0ZWQgY29kZXMgaW4gYSBiaXQgb3JkZXIgb3Bwb3NpdGUKKyAqICAgICB0byB0aGUgVElGRiBzcGVjLiAgVGh1cywgdG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3LyBBbGR1cworICogICAgIHdlIGludGVycHJldCBNU0ItTFNCIG9yZGVyZWQgY29kZXMgdG8gYmUgaW1hZ2VzIHdyaXR0ZW4gdy8KKyAqICAgICBvbGQgdmVyc2lvbnMgb2YgdGhpcyBsaWJyYXJ5LCBidXQgb3RoZXJ3aXNlIGFkaGVyZSB0byB0aGUKKyAqICAgICBBbGR1cyAib2ZmIGJ5IG9uZSIgYWxnb3JpdGhtLgorICoKKyAqIEZ1dHVyZSByZXZpc2lvbnMgdG8gdGhlIFRJRkYgc3BlYyBhcmUgZXhwZWN0ZWQgdG8gImNsYXJpZnkgdGhpcyBpc3N1ZSIuCisgKi8KKyNkZWZpbmUgTFpXX0NPTVBBVCAgICAgICAgICAgICAgLyogaW5jbHVkZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjb2RlICovCisvKgorICogRWFjaCBzdHJpcCBvZiBkYXRhIGlzIHN1cHBvc2VkIHRvIGJlIHRlcm1pbmF0ZWQgYnkgYSBDT0RFX0VPSS4KKyAqIElmIHRoZSBmb2xsb3dpbmcgI2RlZmluZSBpcyBpbmNsdWRlZCwgdGhlIGRlY29kZXIgd2lsbCBhbHNvCisgKiBjaGVjayBmb3IgZW5kLW9mLXN0cmlwIHcvbyBzZWVpbmcgdGhpcyBjb2RlLiAgVGhpcyBtYWtlcyB0aGUKKyAqIGxpYnJhcnkgbW9yZSByb2J1c3QsIGJ1dCBhbHNvIHNsb3dlci4KKyAqLworI2RlZmluZSBMWldfQ0hFQ0tFT1MgICAgICAgICAgICAvKiBpbmNsdWRlIGNoZWNrcyBmb3Igc3RyaXBzIHcvbyBFT0kgY29kZSAqLworCisjZGVmaW5lIE1BWENPREUobikJKCgxTDw8KG4pKS0xKQorLyoKKyAqIFRoZSBUSUZGIHNwZWMgc3BlY2lmaWVzIHRoYXQgZW5jb2RlZCBiaXQKKyAqIHN0cmluZ3MgcmFuZ2UgZnJvbSA5IHRvIDEyIGJpdHMuCisgKi8KKyNkZWZpbmUgQklUU19NSU4gICAgICAgIDkgICAgICAgICAgICAgICAvKiBzdGFydCB3aXRoIDkgYml0cyAqLworI2RlZmluZSBCSVRTX01BWCAgICAgICAgMTIgICAgICAgICAgICAgIC8qIG1heCBvZiAxMiBiaXQgc3RyaW5ncyAqLworLyogcHJlZGVmaW5lZCBjb2RlcyAqLworI2RlZmluZSBDT0RFX0NMRUFSICAgICAgMjU2ICAgICAgICAgICAgIC8qIGNvZGUgdG8gY2xlYXIgc3RyaW5nIHRhYmxlICovCisjZGVmaW5lIENPREVfRU9JICAgICAgICAyNTcgICAgICAgICAgICAgLyogZW5kLW9mLWluZm9ybWF0aW9uIGNvZGUgKi8KKyNkZWZpbmUgQ09ERV9GSVJTVCAgICAgIDI1OCAgICAgICAgICAgICAvKiBmaXJzdCBmcmVlIGNvZGUgZW50cnkgKi8KKyNkZWZpbmUgQ09ERV9NQVggICAgICAgIE1BWENPREUoQklUU19NQVgpCisjZGVmaW5lIEhTSVpFICAgICAgICAgICA5MDAxTCAgICAgICAgICAgLyogOTElIG9jY3VwYW5jeSAqLworI2RlZmluZSBIU0hJRlQgICAgICAgICAgKDEzLTgpCisjaWZkZWYgTFpXX0NPTVBBVAorLyogTkI6ICsxMDI0IGlzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGZpbGVzICovCisjZGVmaW5lIENTSVpFICAgICAgICAgICAoTUFYQ09ERShCSVRTX01BWCkrMTAyNEwpCisjZWxzZQorI2RlZmluZSBDU0laRSAgICAgICAgICAgKE1BWENPREUoQklUU19NQVgpKzFMKQorI2VuZGlmCisKKy8qCisgKiBTdGF0ZSBibG9jayBmb3IgZWFjaCBvcGVuIFRJRkYgZmlsZSB1c2luZyBMWlcKKyAqIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24uICBOb3RlIHRoYXQgdGhlIHByZWRpY3RvcgorICogc3RhdGUgYmxvY2sgbXVzdCBiZSBmaXJzdCBpbiB0aGlzIGRhdGEgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJVElGRlByZWRpY3RvclN0YXRlIHByZWRpY3Q7ICAgICAvKiBwcmVkaWN0b3Igc3VwZXIgY2xhc3MgKi8KKworCXVuc2lnbmVkIHNob3J0ICBuYml0czsgICAgICAgICAgLyogIyBvZiBiaXRzL2NvZGUgKi8KKwl1bnNpZ25lZCBzaG9ydCAgbWF4Y29kZTsgICAgICAgIC8qIG1heGltdW0gY29kZSBmb3IgbHp3X25iaXRzICovCisJdW5zaWduZWQgc2hvcnQgIGZyZWVfZW50OyAgICAgICAvKiBuZXh0IGZyZWUgZW50cnkgaW4gaGFzaCB0YWJsZSAqLworCXVuc2lnbmVkIGxvbmcgICBuZXh0ZGF0YTsgICAgICAgLyogbmV4dCBiaXRzIG9mIGkvbyAqLworCWxvbmcgICAgICAgICAgICBuZXh0Yml0czsgICAgICAgLyogIyBvZiB2YWxpZCBiaXRzIGluIGx6d19uZXh0ZGF0YSAqLworCisJaW50ICAgICAgICAgICAgIHJ3X21vZGU7ICAgICAgICAvKiBwcmVzZXJ2ZSByd19tb2RlIGZyb20gaW5pdCAqLworfSBMWldCYXNlU3RhdGU7CisKKyNkZWZpbmUgbHp3X25iaXRzICAgICAgIGJhc2UubmJpdHMKKyNkZWZpbmUgbHp3X21heGNvZGUgICAgIGJhc2UubWF4Y29kZQorI2RlZmluZSBsendfZnJlZV9lbnQgICAgYmFzZS5mcmVlX2VudAorI2RlZmluZSBsendfbmV4dGRhdGEgICAgYmFzZS5uZXh0ZGF0YQorI2RlZmluZSBsendfbmV4dGJpdHMgICAgYmFzZS5uZXh0Yml0cworCisvKgorICogRW5jb2Rpbmctc3BlY2lmaWMgc3RhdGUuCisgKi8KK3R5cGVkZWYgdWludDE2IGhjb2RlX3Q7CQkJLyogY29kZXMgZml0IGluIDE2IGJpdHMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlsb25nCWhhc2g7CisJaGNvZGVfdAljb2RlOworfSBoYXNoX3Q7CisKKy8qCisgKiBEZWNvZGluZy1zcGVjaWZpYyBzdGF0ZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgY29kZV9lbnQgeworCXN0cnVjdCBjb2RlX2VudCAqbmV4dDsKKwl1bnNpZ25lZCBzaG9ydAlsZW5ndGg7CQkvKiBzdHJpbmcgbGVuLCBpbmNsdWRpbmcgdGhpcyB0b2tlbiAqLworCXVuc2lnbmVkIGNoYXIJdmFsdWU7CQkvKiBkYXRhIHZhbHVlICovCisJdW5zaWduZWQgY2hhcglmaXJzdGNoYXI7CS8qIGZpcnN0IHRva2VuIG9mIHN0cmluZyAqLworfSBjb2RlX3Q7CisKK3R5cGVkZWYgaW50ICgqZGVjb2RlRnVuYykoVElGRiosIHVpbnQ4KiwgdG1zaXplX3QsIHVpbnQxNik7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlMWldCYXNlU3RhdGUgYmFzZTsKKworCS8qIERlY29kaW5nIHNwZWNpZmljIGRhdGEgKi8KKwlsb25nICAgIGRlY19uYml0c21hc2s7CQkvKiBsendfbmJpdHMgMSBiaXRzLCByaWdodCBhZGp1c3RlZCAqLworCWxvbmcgICAgZGVjX3Jlc3RhcnQ7CQkvKiByZXN0YXJ0IGNvdW50ICovCisjaWZkZWYgTFpXX0NIRUNLRU9TCisJdWludDY0ICBkZWNfYml0c2xlZnQ7CQkvKiBhdmFpbGFibGUgYml0cyBpbiByYXcgZGF0YSAqLworI2VuZGlmCisJZGVjb2RlRnVuYyBkZWNfZGVjb2RlOwkJLyogcmVndWxhciBvciBiYWNrd2FyZHMgY29tcGF0aWJsZSAqLworCWNvZGVfdCogZGVjX2NvZGVwOwkJLyogY3VycmVudCByZWNvZ25pemVkIGNvZGUgKi8KKwljb2RlX3QqIGRlY19vbGRjb2RlcDsJCS8qIHByZXZpb3VzbHkgcmVjb2duaXplZCBjb2RlICovCisJY29kZV90KiBkZWNfZnJlZV9lbnRwOwkJLyogbmV4dCBmcmVlIGVudHJ5ICovCisJY29kZV90KiBkZWNfbWF4Y29kZXA7CQkvKiBtYXggYXZhaWxhYmxlIGVudHJ5ICovCisJY29kZV90KiBkZWNfY29kZXRhYjsJCS8qIGtlcHQgc2VwYXJhdGUgZm9yIHNtYWxsIG1hY2hpbmVzICovCisKKwkvKiBFbmNvZGluZyBzcGVjaWZpYyBkYXRhICovCisJaW50ICAgICBlbmNfb2xkY29kZTsJCS8qIGxhc3QgY29kZSBlbmNvdW50ZXJlZCAqLworCWxvbmcgICAgZW5jX2NoZWNrcG9pbnQ7CQkvKiBwb2ludCBhdCB3aGljaCB0byBjbGVhciB0YWJsZSAqLworI2RlZmluZSBDSEVDS19HQVAJMTAwMDAJCS8qIGVuY19yYXRpbyBjaGVjayBpbnRlcnZhbCAqLworCWxvbmcgICAgZW5jX3JhdGlvOwkJLyogY3VycmVudCBjb21wcmVzc2lvbiByYXRpbyAqLworCWxvbmcgICAgZW5jX2luY291bnQ7CQkvKiAoaW5wdXQpIGRhdGEgYnl0ZXMgZW5jb2RlZCAqLworCWxvbmcgICAgZW5jX291dGNvdW50OwkJLyogZW5jb2RlZCAob3V0cHV0KSBieXRlcyAqLworCXVpbnQ4KiAgZW5jX3Jhd2xpbWl0OwkJLyogYm91bmQgb24gdGlmX3Jhd2RhdGEgYnVmZmVyICovCisJaGFzaF90KiBlbmNfaGFzaHRhYjsJCS8qIGtlcHQgc2VwYXJhdGUgZm9yIHNtYWxsIG1hY2hpbmVzICovCit9IExaV0NvZGVjU3RhdGU7CisKKyNkZWZpbmUgTFpXU3RhdGUodGlmKQkJKChMWldCYXNlU3RhdGUqKSAodGlmKS0+dGlmX2RhdGEpCisjZGVmaW5lIERlY29kZXJTdGF0ZSh0aWYpCSgoTFpXQ29kZWNTdGF0ZSopIExaV1N0YXRlKHRpZikpCisjZGVmaW5lIEVuY29kZXJTdGF0ZSh0aWYpCSgoTFpXQ29kZWNTdGF0ZSopIExaV1N0YXRlKHRpZikpCisKK3N0YXRpYyBpbnQgTFpXRGVjb2RlKFRJRkYqIHRpZiwgdWludDgqIG9wMCwgdG1zaXplX3Qgb2NjMCwgdWludDE2IHMpOworI2lmZGVmIExaV19DT01QQVQKK3N0YXRpYyBpbnQgTFpXRGVjb2RlQ29tcGF0KFRJRkYqIHRpZiwgdWludDgqIG9wMCwgdG1zaXplX3Qgb2NjMCwgdWludDE2IHMpOworI2VuZGlmCitzdGF0aWMgdm9pZCBjbF9oYXNoKExaV0NvZGVjU3RhdGUqKTsKKworLyoKKyAqIExaVyBEZWNvZGVyLgorICovCisKKyNpZmRlZiBMWldfQ0hFQ0tFT1MKKy8qCisgKiBUaGlzIGNoZWNrIHNob3VsZG4ndCBiZSBuZWNlc3NhcnkgYmVjYXVzZSBlYWNoCisgKiBzdHJpcCBpcyBzdXBwb3NlIHRvIGJlIHRlcm1pbmF0ZWQgd2l0aCBDT0RFX0VPSS4KKyAqLworI2RlZmluZQlOZXh0Q29kZShfdGlmLCBfc3AsIF9icCwgX2NvZGUsIF9nZXQpIHsJCQkJXAorCWlmICgoX3NwKS0+ZGVjX2JpdHNsZWZ0IDwgKHVpbnQ2NCluYml0cykgewkJCVwKKwkJVElGRldhcm5pbmdFeHQoX3RpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwJCVwKKwkJICAgICJMWldEZWNvZGU6IFN0cmlwICVkIG5vdCB0ZXJtaW5hdGVkIHdpdGggRU9JIGNvZGUiLCBcCisJCSAgICBfdGlmLT50aWZfY3Vyc3RyaXApOwkJCQlcCisJCV9jb2RlID0gQ09ERV9FT0k7CQkJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQlfZ2V0KF9zcCxfYnAsX2NvZGUpOwkJCQkJXAorCQkoX3NwKS0+ZGVjX2JpdHNsZWZ0IC09IG5iaXRzOwkJCQlcCisJfQkJCQkJCQkJXAorfQorI2Vsc2UKKyNkZWZpbmUJTmV4dENvZGUodGlmLCBzcCwgYnAsIGNvZGUsIGdldCkgZ2V0KHNwLCBicCwgY29kZSkKKyNlbmRpZgorCitzdGF0aWMgaW50CitMWldGaXh1cFRhZ3MoVElGRiogdGlmKQoreworCSh2b2lkKSB0aWY7CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIGludAorTFpXU2V0dXBEZWNvZGUoVElGRiogdGlmKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIkxaV1NldHVwRGVjb2RlIjsKKwlMWldDb2RlY1N0YXRlKiBzcCA9IERlY29kZXJTdGF0ZSh0aWYpOworCWludCBjb2RlOworCisJaWYoIHNwID09IE5VTEwgKQorCXsKKwkJLyoKKwkJICogQWxsb2NhdGUgc3RhdGUgYmxvY2sgc28gdGFnIG1ldGhvZHMgaGF2ZSBzdG9yYWdlIHRvIHJlY29yZAorCQkgKiB2YWx1ZXMuCisJCSovCisJCXRpZi0+dGlmX2RhdGEgPSAodWludDgqKSBfVElGRm1hbGxvYyhzaXplb2YoTFpXQ29kZWNTdGF0ZSkpOworCQlpZiAodGlmLT50aWZfZGF0YSA9PSBOVUxMKQorCQl7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiTm8gc3BhY2UgZm9yIExaVyBzdGF0ZSBibG9jayIpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCisJCURlY29kZXJTdGF0ZSh0aWYpLT5kZWNfY29kZXRhYiA9IE5VTEw7CisJCURlY29kZXJTdGF0ZSh0aWYpLT5kZWNfZGVjb2RlID0gTlVMTDsKKworCQkvKgorCQkgKiBTZXR1cCBwcmVkaWN0b3Igc2V0dXAuCisJCSAqLworCQkodm9pZCkgVElGRlByZWRpY3RvckluaXQodGlmKTsKKworCQlzcCA9IERlY29kZXJTdGF0ZSh0aWYpOworCX0KKworCWFzc2VydChzcCAhPSBOVUxMKTsKKworCWlmIChzcC0+ZGVjX2NvZGV0YWIgPT0gTlVMTCkgeworCQlzcC0+ZGVjX2NvZGV0YWIgPSAoY29kZV90KilfVElGRm1hbGxvYyhDU0laRSpzaXplb2YgKGNvZGVfdCkpOworCQlpZiAoc3AtPmRlY19jb2RldGFiID09IE5VTEwpIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJICAgICAiTm8gc3BhY2UgZm9yIExaVyBjb2RlIHRhYmxlIik7CisJCQlyZXR1cm4gKDApOworCQl9CisJCS8qCisJCSAqIFByZS1sb2FkIHRoZSB0YWJsZS4KKwkJICovCisJCWNvZGUgPSAyNTU7CisJCWRvIHsKKwkJCXNwLT5kZWNfY29kZXRhYltjb2RlXS52YWx1ZSA9IGNvZGU7CisJCQlzcC0+ZGVjX2NvZGV0YWJbY29kZV0uZmlyc3RjaGFyID0gY29kZTsKKwkJCXNwLT5kZWNfY29kZXRhYltjb2RlXS5sZW5ndGggPSAxOworCQkJc3AtPmRlY19jb2RldGFiW2NvZGVdLm5leHQgPSBOVUxMOworCQl9IHdoaWxlIChjb2RlLS0pOworCQkvKgorCQkgKiBaZXJvLW91dCB0aGUgdW51c2VkIGVudHJpZXMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgX1RJRkZtZW1zZXQoJnNwLT5kZWNfY29kZXRhYltDT0RFX0NMRUFSXSwgMCwKKwkJCSAgICAgKENPREVfRklSU1QgLSBDT0RFX0NMRUFSKSAqIHNpemVvZiAoY29kZV90KSk7CisJfQorCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBTZXR1cCBzdGF0ZSBmb3IgZGVjb2RpbmcgYSBzdHJpcC4KKyAqLworc3RhdGljIGludAorTFpXUHJlRGVjb2RlKFRJRkYqIHRpZiwgdWludDE2IHMpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiTFpXUHJlRGVjb2RlIjsKKwlMWldDb2RlY1N0YXRlICpzcCA9IERlY29kZXJTdGF0ZSh0aWYpOworCisJKHZvaWQpIHM7CisJYXNzZXJ0KHNwICE9IE5VTEwpOworCWlmKCBzcC0+ZGVjX2NvZGV0YWIgPT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRpZi0+dGlmX3NldHVwZGVjb2RlKCB0aWYgKTsKKwkgICAgaWYoIHNwLT5kZWNfY29kZXRhYiA9PSBOVUxMICkKKwkJcmV0dXJuICgwKTsKKyAgICAgICAgfQorCisJLyoKKwkgKiBDaGVjayBmb3Igb2xkIGJpdC1yZXZlcnNlZCBjb2Rlcy4KKwkgKi8KKwlpZiAodGlmLT50aWZfcmF3ZGF0YVswXSA9PSAwICYmICh0aWYtPnRpZl9yYXdkYXRhWzFdICYgMHgxKSkgeworI2lmZGVmIExaV19DT01QQVQKKwkJaWYgKCFzcC0+ZGVjX2RlY29kZSkgeworCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICJPbGQtc3R5bGUgTFpXIGNvZGVzLCBjb252ZXJ0IGZpbGUiKTsKKwkJCS8qCisJCQkgKiBPdmVycmlkZSBkZWZhdWx0IGRlY29kaW5nIG1ldGhvZHMgd2l0aAorCQkJICogb25lcyB0aGF0IGRlYWwgd2l0aCB0aGUgb2xkIGNvZGluZy4KKwkJCSAqIE90aGVyd2lzZSB0aGUgcHJlZGljdG9yIHZlcnNpb25zIHNldAorCQkJICogYWJvdmUgd2lsbCBjYWxsIHRoZSBjb21wYXRpYmlsaXR5IHJvdXRpbmVzCisJCQkgKiB0aHJvdWdoIHRoZSBkZWNfZGVjb2RlIG1ldGhvZC4KKwkJCSAqLworCQkJdGlmLT50aWZfZGVjb2Rlcm93ID0gTFpXRGVjb2RlQ29tcGF0OworCQkJdGlmLT50aWZfZGVjb2Rlc3RyaXAgPSBMWldEZWNvZGVDb21wYXQ7CisJCQl0aWYtPnRpZl9kZWNvZGV0aWxlID0gTFpXRGVjb2RlQ29tcGF0OworCQkJLyoKKwkJCSAqIElmIGRvaW5nIGhvcml6b250YWwgZGlmZmVyZW5jaW5nLCBtdXN0CisJCQkgKiByZS1zZXR1cCB0aGUgcHJlZGljdG9yIGxvZ2ljIHNpbmNlIHdlCisJCQkgKiBzd2l0Y2hlZCB0aGUgYmFzaWMgZGVjb2RlciBtZXRob2RzLi4uCisJCQkgKi8KKwkJCSgqdGlmLT50aWZfc2V0dXBkZWNvZGUpKHRpZik7CisJCQlzcC0+ZGVjX2RlY29kZSA9IExaV0RlY29kZUNvbXBhdDsKKwkJfQorCQlzcC0+bHp3X21heGNvZGUgPSBNQVhDT0RFKEJJVFNfTUlOKTsKKyNlbHNlIC8qICFMWldfQ09NUEFUICovCisJCWlmICghc3AtPmRlY19kZWNvZGUpIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgIk9sZC1zdHlsZSBMWlcgY29kZXMgbm90IHN1cHBvcnRlZCIpOworCQkJc3AtPmRlY19kZWNvZGUgPSBMWldEZWNvZGU7CisJCX0KKwkJcmV0dXJuICgwKTsKKyNlbmRpZi8qICFMWldfQ09NUEFUICovCisJfSBlbHNlIHsKKwkJc3AtPmx6d19tYXhjb2RlID0gTUFYQ09ERShCSVRTX01JTiktMTsKKwkJc3AtPmRlY19kZWNvZGUgPSBMWldEZWNvZGU7CisJfQorCXNwLT5sendfbmJpdHMgPSBCSVRTX01JTjsKKwlzcC0+bHp3X25leHRiaXRzID0gMDsKKwlzcC0+bHp3X25leHRkYXRhID0gMDsKKworCXNwLT5kZWNfcmVzdGFydCA9IDA7CisJc3AtPmRlY19uYml0c21hc2sgPSBNQVhDT0RFKEJJVFNfTUlOKTsKKyNpZmRlZiBMWldfQ0hFQ0tFT1MKKwlzcC0+ZGVjX2JpdHNsZWZ0ID0gKCh1aW50NjQpdGlmLT50aWZfcmF3Y2MpIDw8IDM7CisjZW5kaWYKKwlzcC0+ZGVjX2ZyZWVfZW50cCA9IHNwLT5kZWNfY29kZXRhYiArIENPREVfRklSU1Q7CisJLyoKKwkgKiBaZXJvIGVudHJpZXMgdGhhdCBhcmUgbm90IHlldCBmaWxsZWQgaW4uICBXZSBkbworCSAqIHRoaXMgdG8gZ3VhcmQgYWdhaW5zdCBib2d1cyBpbnB1dCBkYXRhIHRoYXQgY2F1c2VzCisJICogdXMgdG8gaW5kZXggaW50byB1bmRlZmluZWQgZW50cmllcy4gIElmIHlvdSBjYW4KKwkgKiBjb21lIHVwIHdpdGggYSB3YXkgdG8gc2FmZWx5IGJvdW5kcy1jaGVjayBpbnB1dCBjb2RlcworCSAqIHdoaWxlIGRlY29kaW5nIHRoZW4geW91IGNhbiByZW1vdmUgdGhpcyBvcGVyYXRpb24uCisJICovCisJX1RJRkZtZW1zZXQoc3AtPmRlY19mcmVlX2VudHAsIDAsIChDU0laRS1DT0RFX0ZJUlNUKSpzaXplb2YgKGNvZGVfdCkpOworCXNwLT5kZWNfb2xkY29kZXAgPSAmc3AtPmRlY19jb2RldGFiWy0xXTsKKwlzcC0+ZGVjX21heGNvZGVwID0gJnNwLT5kZWNfY29kZXRhYltzcC0+ZGVjX25iaXRzbWFzay0xXTsKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogRGVjb2RlIGEgImh1bmsgb2YgZGF0YSIuCisgKi8KKyNkZWZpbmUJR2V0TmV4dENvZGUoc3AsIGJwLCBjb2RlKSB7CQkJCVwKKwluZXh0ZGF0YSA9IChuZXh0ZGF0YTw8OCkgfCAqKGJwKSsrOwkJCVwKKwluZXh0Yml0cyArPSA4OwkJCQkJCVwKKwlpZiAobmV4dGJpdHMgPCBuYml0cykgewkJCQkJXAorCQluZXh0ZGF0YSA9IChuZXh0ZGF0YTw8OCkgfCAqKGJwKSsrOwkJXAorCQluZXh0Yml0cyArPSA4OwkJCQkJXAorCX0JCQkJCQkJXAorCWNvZGUgPSAoaGNvZGVfdCkoKG5leHRkYXRhID4+IChuZXh0Yml0cy1uYml0cykpICYgbmJpdHNtYXNrKTsJXAorCW5leHRiaXRzIC09IG5iaXRzOwkJCQkJXAorfQorCitzdGF0aWMgdm9pZAorY29kZUxvb3AoVElGRiogdGlmLCBjb25zdCBjaGFyKiBtb2R1bGUpCit7CisJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkgICAgIkJvZ3VzIGVuY29kaW5nLCBsb29wIGluIHRoZSBjb2RlIHRhYmxlOyBzY2FubGluZSAlZCIsCisJICAgIHRpZi0+dGlmX3Jvdyk7Cit9CisKK3N0YXRpYyBpbnQKK0xaV0RlY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBvcDAsIHRtc2l6ZV90IG9jYzAsIHVpbnQxNiBzKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIkxaV0RlY29kZSI7CisJTFpXQ29kZWNTdGF0ZSAqc3AgPSBEZWNvZGVyU3RhdGUodGlmKTsKKwljaGFyICpvcCA9IChjaGFyKikgb3AwOworCWxvbmcgb2NjID0gKGxvbmcpIG9jYzA7CisJY2hhciAqdHA7CisJdW5zaWduZWQgY2hhciAqYnA7CisJaGNvZGVfdCBjb2RlOworCWludCBsZW47CisJbG9uZyBuYml0cywgbmV4dGJpdHMsIG5iaXRzbWFzazsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBuZXh0ZGF0YTsKKwljb2RlX3QgKmNvZGVwLCAqZnJlZV9lbnRwLCAqbWF4Y29kZXAsICpvbGRjb2RlcDsKKworCSh2b2lkKSBzOworCWFzc2VydChzcCAhPSBOVUxMKTsKKyAgICAgICAgYXNzZXJ0KHNwLT5kZWNfY29kZXRhYiAhPSBOVUxMKTsKKworCS8qCisJICBGYWlsIGlmIHZhbHVlIGRvZXMgbm90IGZpdCBpbiBsb25nLgorCSovCisJaWYgKCh0bXNpemVfdCkgb2NjICE9IG9jYzApCisJICAgICAgICByZXR1cm4gKDApOworCS8qCisJICogUmVzdGFydCBpbnRlcnJ1cHRlZCBvdXRwdXQgb3BlcmF0aW9uLgorCSAqLworCWlmIChzcC0+ZGVjX3Jlc3RhcnQpIHsKKwkJbG9uZyByZXNpZHVlOworCisJCWNvZGVwID0gc3AtPmRlY19jb2RlcDsKKwkJcmVzaWR1ZSA9IGNvZGVwLT5sZW5ndGggLSBzcC0+ZGVjX3Jlc3RhcnQ7CisJCWlmIChyZXNpZHVlID4gb2NjKSB7CisJCQkvKgorCQkJICogUmVzaWR1ZSBmcm9tIHByZXZpb3VzIGRlY29kZSBpcyBzdWZmaWNpZW50CisJCQkgKiB0byBzYXRpc2Z5IGRlY29kZSByZXF1ZXN0LiAgU2tpcCB0byB0aGUKKwkJCSAqIHN0YXJ0IG9mIHRoZSBkZWNvZGVkIHN0cmluZywgcGxhY2UgZGVjb2RlZAorCQkJICogdmFsdWVzIGluIHRoZSBvdXRwdXQgYnVmZmVyLCBhbmQgcmV0dXJuLgorCQkJICovCisJCQlzcC0+ZGVjX3Jlc3RhcnQgKz0gb2NjOworCQkJZG8geworCQkJCWNvZGVwID0gY29kZXAtPm5leHQ7CisJCQl9IHdoaWxlICgtLXJlc2lkdWUgPiBvY2MgJiYgY29kZXApOworCQkJaWYgKGNvZGVwKSB7CisJCQkJdHAgPSBvcCArIG9jYzsKKwkJCQlkbyB7CisJCQkJCSotLXRwID0gY29kZXAtPnZhbHVlOworCQkJCQljb2RlcCA9IGNvZGVwLT5uZXh0OworCQkJCX0gd2hpbGUgKC0tb2NjICYmIGNvZGVwKTsKKwkJCX0KKwkJCXJldHVybiAoMSk7CisJCX0KKwkJLyoKKwkJICogUmVzaWR1ZSBzYXRpc2ZpZXMgb25seSBwYXJ0IG9mIHRoZSBkZWNvZGUgcmVxdWVzdC4KKwkJICovCisJCW9wICs9IHJlc2lkdWUsIG9jYyAtPSByZXNpZHVlOworCQl0cCA9IG9wOworCQlkbyB7CisJCQlpbnQgdDsKKwkJCS0tdHA7CisJCQl0ID0gY29kZXAtPnZhbHVlOworCQkJY29kZXAgPSBjb2RlcC0+bmV4dDsKKwkJCSp0cCA9IHQ7CisJCX0gd2hpbGUgKC0tcmVzaWR1ZSAmJiBjb2RlcCk7CisJCXNwLT5kZWNfcmVzdGFydCA9IDA7CisJfQorCisJYnAgPSAodW5zaWduZWQgY2hhciAqKXRpZi0+dGlmX3Jhd2NwOworCW5iaXRzID0gc3AtPmx6d19uYml0czsKKwluZXh0ZGF0YSA9IHNwLT5sendfbmV4dGRhdGE7CisJbmV4dGJpdHMgPSBzcC0+bHp3X25leHRiaXRzOworCW5iaXRzbWFzayA9IHNwLT5kZWNfbmJpdHNtYXNrOworCW9sZGNvZGVwID0gc3AtPmRlY19vbGRjb2RlcDsKKwlmcmVlX2VudHAgPSBzcC0+ZGVjX2ZyZWVfZW50cDsKKwltYXhjb2RlcCA9IHNwLT5kZWNfbWF4Y29kZXA7CisKKwl3aGlsZSAob2NjID4gMCkgeworCQlOZXh0Q29kZSh0aWYsIHNwLCBicCwgY29kZSwgR2V0TmV4dENvZGUpOworCQlpZiAoY29kZSA9PSBDT0RFX0VPSSkKKwkJCWJyZWFrOworCQlpZiAoY29kZSA9PSBDT0RFX0NMRUFSKSB7CisJCQlkbyB7CisJCQkJZnJlZV9lbnRwID0gc3AtPmRlY19jb2RldGFiICsgQ09ERV9GSVJTVDsKKwkJCQlfVElGRm1lbXNldChmcmVlX2VudHAsIDAsCisJCQkJCSAgICAoQ1NJWkUgLSBDT0RFX0ZJUlNUKSAqIHNpemVvZiAoY29kZV90KSk7CisJCQkJbmJpdHMgPSBCSVRTX01JTjsKKwkJCQluYml0c21hc2sgPSBNQVhDT0RFKEJJVFNfTUlOKTsKKwkJCQltYXhjb2RlcCA9IHNwLT5kZWNfY29kZXRhYiArIG5iaXRzbWFzay0xOworCQkJCU5leHRDb2RlKHRpZiwgc3AsIGJwLCBjb2RlLCBHZXROZXh0Q29kZSk7CisJCQl9IHdoaWxlIChjb2RlID09IENPREVfQ0xFQVIpOwkvKiBjb25zZWN1dGl2ZSBDT0RFX0NMRUFSIGNvZGVzICovCisJCQlpZiAoY29kZSA9PSBDT0RFX0VPSSkKKwkJCQlicmVhazsKKwkJCWlmIChjb2RlID4gQ09ERV9DTEVBUikgeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCB0aWYtPnRpZl9uYW1lLAorCQkJCSJMWldEZWNvZGU6IENvcnJ1cHRlZCBMWlcgdGFibGUgYXQgc2NhbmxpbmUgJWQiLAorCQkJCQkgICAgIHRpZi0+dGlmX3Jvdyk7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCSpvcCsrID0gKGNoYXIpY29kZSwgb2NjLS07CisJCQlvbGRjb2RlcCA9IHNwLT5kZWNfY29kZXRhYiArIGNvZGU7CisJCQljb250aW51ZTsKKwkJfQorCQljb2RlcCA9IHNwLT5kZWNfY29kZXRhYiArIGNvZGU7CisKKwkJLyoKKwkJICogQWRkIHRoZSBuZXcgZW50cnkgdG8gdGhlIGNvZGUgdGFibGUuCisJCSAqLworCQlpZiAoZnJlZV9lbnRwIDwgJnNwLT5kZWNfY29kZXRhYlswXSB8fAorCQkgICAgZnJlZV9lbnRwID49ICZzcC0+ZGVjX2NvZGV0YWJbQ1NJWkVdKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICJDb3JydXB0ZWQgTFpXIHRhYmxlIGF0IHNjYW5saW5lICVkIiwKKwkJCSAgICB0aWYtPnRpZl9yb3cpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCisJCWZyZWVfZW50cC0+bmV4dCA9IG9sZGNvZGVwOworCQlpZiAoZnJlZV9lbnRwLT5uZXh0IDwgJnNwLT5kZWNfY29kZXRhYlswXSB8fAorCQkgICAgZnJlZV9lbnRwLT5uZXh0ID49ICZzcC0+ZGVjX2NvZGV0YWJbQ1NJWkVdKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICJDb3JydXB0ZWQgTFpXIHRhYmxlIGF0IHNjYW5saW5lICVkIiwKKwkJCSAgICB0aWYtPnRpZl9yb3cpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQlmcmVlX2VudHAtPmZpcnN0Y2hhciA9IGZyZWVfZW50cC0+bmV4dC0+Zmlyc3RjaGFyOworCQlmcmVlX2VudHAtPmxlbmd0aCA9IGZyZWVfZW50cC0+bmV4dC0+bGVuZ3RoKzE7CisJCWZyZWVfZW50cC0+dmFsdWUgPSAoY29kZXAgPCBmcmVlX2VudHApID8KKwkJICAgIGNvZGVwLT5maXJzdGNoYXIgOiBmcmVlX2VudHAtPmZpcnN0Y2hhcjsKKwkJaWYgKCsrZnJlZV9lbnRwID4gbWF4Y29kZXApIHsKKwkJCWlmICgrK25iaXRzID4gQklUU19NQVgpCQkvKiBzaG91bGQgbm90IGhhcHBlbiAqLworCQkJCW5iaXRzID0gQklUU19NQVg7CisJCQluYml0c21hc2sgPSBNQVhDT0RFKG5iaXRzKTsKKwkJCW1heGNvZGVwID0gc3AtPmRlY19jb2RldGFiICsgbmJpdHNtYXNrLTE7CisJCX0KKwkJb2xkY29kZXAgPSBjb2RlcDsKKwkJaWYgKGNvZGUgPj0gMjU2KSB7CisJCQkvKgorCQkJICogQ29kZSBtYXBzIHRvIGEgc3RyaW5nLCBjb3B5IHN0cmluZworCQkJICogdmFsdWUgdG8gb3V0cHV0ICh3cml0dGVuIGluIHJldmVyc2UpLgorCQkJICovCisJCQlpZihjb2RlcC0+bGVuZ3RoID09IDApIHsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCSAgICAiV3JvbmcgbGVuZ3RoIG9mIGRlY29kZWQgc3RyaW5nOiAiCisJCQkJICAgICJkYXRhIHByb2JhYmx5IGNvcnJ1cHRlZCBhdCBzY2FubGluZSAlZCIsCisJCQkJICAgIHRpZi0+dGlmX3Jvdyk7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCWlmIChjb2RlcC0+bGVuZ3RoID4gb2NjKSB7CisJCQkJLyoKKwkJCQkgKiBTdHJpbmcgaXMgdG9vIGxvbmcgZm9yIGRlY29kZSBidWZmZXIsCisJCQkJICogbG9jYXRlIHBvcnRpb24gdGhhdCB3aWxsIGZpdCwgY29weSB0bworCQkJCSAqIHRoZSBkZWNvZGUgYnVmZmVyLCBhbmQgc2V0dXAgcmVzdGFydAorCQkJCSAqIGxvZ2ljIGZvciB0aGUgbmV4dCBkZWNvZGluZyBjYWxsLgorCQkJCSAqLworCQkJCXNwLT5kZWNfY29kZXAgPSBjb2RlcDsKKwkJCQlkbyB7CisJCQkJCWNvZGVwID0gY29kZXAtPm5leHQ7CisJCQkJfSB3aGlsZSAoY29kZXAgJiYgY29kZXAtPmxlbmd0aCA+IG9jYyk7CisJCQkJaWYgKGNvZGVwKSB7CisJCQkJCXNwLT5kZWNfcmVzdGFydCA9IChsb25nKW9jYzsKKwkJCQkJdHAgPSBvcCArIG9jYzsKKwkJCQkJZG8gIHsKKwkJCQkJCSotLXRwID0gY29kZXAtPnZhbHVlOworCQkJCQkJY29kZXAgPSBjb2RlcC0+bmV4dDsKKwkJCQkJfSAgd2hpbGUgKC0tb2NjICYmIGNvZGVwKTsKKwkJCQkJaWYgKGNvZGVwKQorCQkJCQkJY29kZUxvb3AodGlmLCBtb2R1bGUpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCWxlbiA9IGNvZGVwLT5sZW5ndGg7CisJCQl0cCA9IG9wICsgbGVuOworCQkJZG8geworCQkJCWludCB0OworCQkJCS0tdHA7CisJCQkJdCA9IGNvZGVwLT52YWx1ZTsKKwkJCQljb2RlcCA9IGNvZGVwLT5uZXh0OworCQkJCSp0cCA9IHQ7CisJCQl9IHdoaWxlIChjb2RlcCAmJiB0cCA+IG9wKTsKKwkJCWlmIChjb2RlcCkgeworCQkJICAgIGNvZGVMb29wKHRpZiwgbW9kdWxlKTsKKwkJCSAgICBicmVhazsKKwkJCX0KKwkJCWFzc2VydChvY2MgPj0gbGVuKTsKKwkJCW9wICs9IGxlbiwgb2NjIC09IGxlbjsKKwkJfSBlbHNlCisJCQkqb3ArKyA9IChjaGFyKWNvZGUsIG9jYy0tOworCX0KKworCXRpZi0+dGlmX3Jhd2NwID0gKHVpbnQ4KikgYnA7CisJc3AtPmx6d19uYml0cyA9ICh1bnNpZ25lZCBzaG9ydCkgbmJpdHM7CisJc3AtPmx6d19uZXh0ZGF0YSA9IG5leHRkYXRhOworCXNwLT5sendfbmV4dGJpdHMgPSBuZXh0Yml0czsKKwlzcC0+ZGVjX25iaXRzbWFzayA9IG5iaXRzbWFzazsKKwlzcC0+ZGVjX29sZGNvZGVwID0gb2xkY29kZXA7CisJc3AtPmRlY19mcmVlX2VudHAgPSBmcmVlX2VudHA7CisJc3AtPmRlY19tYXhjb2RlcCA9IG1heGNvZGVwOworCisJaWYgKG9jYyA+IDApIHsKKyNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgKGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKQorCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJIk5vdCBlbm91Z2ggZGF0YSBhdCBzY2FubGluZSAlZCAoc2hvcnQgJUk2NGQgYnl0ZXMpIiwKKwkJCSAgICAgdGlmLT50aWZfcm93LCAodW5zaWduZWQgX19pbnQ2NCkgb2NjKTsKKyNlbHNlCisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkiTm90IGVub3VnaCBkYXRhIGF0IHNjYW5saW5lICVkIChzaG9ydCAlbGx1IGJ5dGVzKSIsCisJCQkgICAgIHRpZi0+dGlmX3JvdywgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2NjKTsKKyNlbmRpZgorCQlyZXR1cm4gKDApOworCX0KKwlyZXR1cm4gKDEpOworfQorCisjaWZkZWYgTFpXX0NPTVBBVAorLyoKKyAqIERlY29kZSBhICJodW5rIG9mIGRhdGEiIGZvciBvbGQgaW1hZ2VzLgorICovCisjZGVmaW5lCUdldE5leHRDb2RlQ29tcGF0KHNwLCBicCwgY29kZSkgewkJCVwKKwluZXh0ZGF0YSB8PSAodW5zaWduZWQgbG9uZykgKihicCkrKyA8PCBuZXh0Yml0czsJXAorCW5leHRiaXRzICs9IDg7CQkJCQkJXAorCWlmIChuZXh0Yml0cyA8IG5iaXRzKSB7CQkJCQlcCisJCW5leHRkYXRhIHw9ICh1bnNpZ25lZCBsb25nKSAqKGJwKSsrIDw8IG5leHRiaXRzO1wKKwkJbmV4dGJpdHMgKz0gODsJCQkJCVwKKwl9CQkJCQkJCVwKKwljb2RlID0gKGhjb2RlX3QpKG5leHRkYXRhICYgbmJpdHNtYXNrKTsJCQlcCisJbmV4dGRhdGEgPj49IG5iaXRzOwkJCQkJXAorCW5leHRiaXRzIC09IG5iaXRzOwkJCQkJXAorfQorCitzdGF0aWMgaW50CitMWldEZWNvZGVDb21wYXQoVElGRiogdGlmLCB1aW50OCogb3AwLCB0bXNpemVfdCBvY2MwLCB1aW50MTYgcykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJMWldEZWNvZGVDb21wYXQiOworCUxaV0NvZGVjU3RhdGUgKnNwID0gRGVjb2RlclN0YXRlKHRpZik7CisJY2hhciAqb3AgPSAoY2hhciopIG9wMDsKKwlsb25nIG9jYyA9IChsb25nKSBvY2MwOworCWNoYXIgKnRwOworCXVuc2lnbmVkIGNoYXIgKmJwOworCWludCBjb2RlLCBuYml0czsKKwlsb25nIG5leHRiaXRzLCBuZXh0ZGF0YSwgbmJpdHNtYXNrOworCWNvZGVfdCAqY29kZXAsICpmcmVlX2VudHAsICptYXhjb2RlcCwgKm9sZGNvZGVwOworCisJKHZvaWQpIHM7CisJYXNzZXJ0KHNwICE9IE5VTEwpOworCisJLyoKKwkgIEZhaWwgaWYgdmFsdWUgZG9lcyBub3QgZml0IGluIGxvbmcuCisJKi8KKwlpZiAoKHRtc2l6ZV90KSBvY2MgIT0gb2NjMCkKKwkgICAgICAgIHJldHVybiAoMCk7CisKKwkvKgorCSAqIFJlc3RhcnQgaW50ZXJydXB0ZWQgb3V0cHV0IG9wZXJhdGlvbi4KKwkgKi8KKwlpZiAoc3AtPmRlY19yZXN0YXJ0KSB7CisJCWxvbmcgcmVzaWR1ZTsKKworCQljb2RlcCA9IHNwLT5kZWNfY29kZXA7CisJCXJlc2lkdWUgPSBjb2RlcC0+bGVuZ3RoIC0gc3AtPmRlY19yZXN0YXJ0OworCQlpZiAocmVzaWR1ZSA+IG9jYykgeworCQkJLyoKKwkJCSAqIFJlc2lkdWUgZnJvbSBwcmV2aW91cyBkZWNvZGUgaXMgc3VmZmljaWVudAorCQkJICogdG8gc2F0aXNmeSBkZWNvZGUgcmVxdWVzdC4gIFNraXAgdG8gdGhlCisJCQkgKiBzdGFydCBvZiB0aGUgZGVjb2RlZCBzdHJpbmcsIHBsYWNlIGRlY29kZWQKKwkJCSAqIHZhbHVlcyBpbiB0aGUgb3V0cHV0IGJ1ZmZlciwgYW5kIHJldHVybi4KKwkJCSAqLworCQkJc3AtPmRlY19yZXN0YXJ0ICs9IG9jYzsKKwkJCWRvIHsKKwkJCQljb2RlcCA9IGNvZGVwLT5uZXh0OworCQkJfSB3aGlsZSAoLS1yZXNpZHVlID4gb2NjKTsKKwkJCXRwID0gb3AgKyBvY2M7CisJCQlkbyB7CisJCQkJKi0tdHAgPSBjb2RlcC0+dmFsdWU7CisJCQkJY29kZXAgPSBjb2RlcC0+bmV4dDsKKwkJCX0gd2hpbGUgKC0tb2NjKTsKKwkJCXJldHVybiAoMSk7CisJCX0KKwkJLyoKKwkJICogUmVzaWR1ZSBzYXRpc2ZpZXMgb25seSBwYXJ0IG9mIHRoZSBkZWNvZGUgcmVxdWVzdC4KKwkJICovCisJCW9wICs9IHJlc2lkdWUsIG9jYyAtPSByZXNpZHVlOworCQl0cCA9IG9wOworCQlkbyB7CisJCQkqLS10cCA9IGNvZGVwLT52YWx1ZTsKKwkJCWNvZGVwID0gY29kZXAtPm5leHQ7CisJCX0gd2hpbGUgKC0tcmVzaWR1ZSk7CisJCXNwLT5kZWNfcmVzdGFydCA9IDA7CisJfQorCisJYnAgPSAodW5zaWduZWQgY2hhciAqKXRpZi0+dGlmX3Jhd2NwOworCW5iaXRzID0gc3AtPmx6d19uYml0czsKKwluZXh0ZGF0YSA9IHNwLT5sendfbmV4dGRhdGE7CisJbmV4dGJpdHMgPSBzcC0+bHp3X25leHRiaXRzOworCW5iaXRzbWFzayA9IHNwLT5kZWNfbmJpdHNtYXNrOworCW9sZGNvZGVwID0gc3AtPmRlY19vbGRjb2RlcDsKKwlmcmVlX2VudHAgPSBzcC0+ZGVjX2ZyZWVfZW50cDsKKwltYXhjb2RlcCA9IHNwLT5kZWNfbWF4Y29kZXA7CisKKwl3aGlsZSAob2NjID4gMCkgeworCQlOZXh0Q29kZSh0aWYsIHNwLCBicCwgY29kZSwgR2V0TmV4dENvZGVDb21wYXQpOworCQlpZiAoY29kZSA9PSBDT0RFX0VPSSkKKwkJCWJyZWFrOworCQlpZiAoY29kZSA9PSBDT0RFX0NMRUFSKSB7CisJCQlkbyB7CisJCQkJZnJlZV9lbnRwID0gc3AtPmRlY19jb2RldGFiICsgQ09ERV9GSVJTVDsKKwkJCQlfVElGRm1lbXNldChmcmVlX2VudHAsIDAsCisJCQkJCSAgICAoQ1NJWkUgLSBDT0RFX0ZJUlNUKSAqIHNpemVvZiAoY29kZV90KSk7CisJCQkJbmJpdHMgPSBCSVRTX01JTjsKKwkJCQluYml0c21hc2sgPSBNQVhDT0RFKEJJVFNfTUlOKTsKKwkJCQltYXhjb2RlcCA9IHNwLT5kZWNfY29kZXRhYiArIG5iaXRzbWFzazsKKwkJCQlOZXh0Q29kZSh0aWYsIHNwLCBicCwgY29kZSwgR2V0TmV4dENvZGVDb21wYXQpOworCQkJfSB3aGlsZSAoY29kZSA9PSBDT0RFX0NMRUFSKTsJLyogY29uc2VjdXRpdmUgQ09ERV9DTEVBUiBjb2RlcyAqLworCQkJaWYgKGNvZGUgPT0gQ09ERV9FT0kpCisJCQkJYnJlYWs7CisJCQlpZiAoY29kZSA+IENPREVfQ0xFQVIpIHsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgdGlmLT50aWZfbmFtZSwKKwkJCQkiTFpXRGVjb2RlOiBDb3JydXB0ZWQgTFpXIHRhYmxlIGF0IHNjYW5saW5lICVkIiwKKwkJCQkJICAgICB0aWYtPnRpZl9yb3cpOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCQkqb3ArKyA9IGNvZGUsIG9jYy0tOworCQkJb2xkY29kZXAgPSBzcC0+ZGVjX2NvZGV0YWIgKyBjb2RlOworCQkJY29udGludWU7CisJCX0KKwkJY29kZXAgPSBzcC0+ZGVjX2NvZGV0YWIgKyBjb2RlOworCisJCS8qCisJCSAqIEFkZCB0aGUgbmV3IGVudHJ5IHRvIHRoZSBjb2RlIHRhYmxlLgorCQkgKi8KKwkJaWYgKGZyZWVfZW50cCA8ICZzcC0+ZGVjX2NvZGV0YWJbMF0gfHwKKwkJICAgIGZyZWVfZW50cCA+PSAmc3AtPmRlY19jb2RldGFiW0NTSVpFXSkgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAiQ29ycnVwdGVkIExaVyB0YWJsZSBhdCBzY2FubGluZSAlZCIsIHRpZi0+dGlmX3Jvdyk7CisJCQlyZXR1cm4gKDApOworCQl9CisKKwkJZnJlZV9lbnRwLT5uZXh0ID0gb2xkY29kZXA7CisJCWlmIChmcmVlX2VudHAtPm5leHQgPCAmc3AtPmRlY19jb2RldGFiWzBdIHx8CisJCSAgICBmcmVlX2VudHAtPm5leHQgPj0gJnNwLT5kZWNfY29kZXRhYltDU0laRV0pIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgIkNvcnJ1cHRlZCBMWlcgdGFibGUgYXQgc2NhbmxpbmUgJWQiLCB0aWYtPnRpZl9yb3cpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQlmcmVlX2VudHAtPmZpcnN0Y2hhciA9IGZyZWVfZW50cC0+bmV4dC0+Zmlyc3RjaGFyOworCQlmcmVlX2VudHAtPmxlbmd0aCA9IGZyZWVfZW50cC0+bmV4dC0+bGVuZ3RoKzE7CisJCWZyZWVfZW50cC0+dmFsdWUgPSAoY29kZXAgPCBmcmVlX2VudHApID8KKwkJICAgIGNvZGVwLT5maXJzdGNoYXIgOiBmcmVlX2VudHAtPmZpcnN0Y2hhcjsKKwkJaWYgKCsrZnJlZV9lbnRwID4gbWF4Y29kZXApIHsKKwkJCWlmICgrK25iaXRzID4gQklUU19NQVgpCQkvKiBzaG91bGQgbm90IGhhcHBlbiAqLworCQkJCW5iaXRzID0gQklUU19NQVg7CisJCQluYml0c21hc2sgPSBNQVhDT0RFKG5iaXRzKTsKKwkJCW1heGNvZGVwID0gc3AtPmRlY19jb2RldGFiICsgbmJpdHNtYXNrOworCQl9CisJCW9sZGNvZGVwID0gY29kZXA7CisJCWlmIChjb2RlID49IDI1NikgeworCQkJLyoKKwkJCSAqIENvZGUgbWFwcyB0byBhIHN0cmluZywgY29weSBzdHJpbmcKKwkJCSAqIHZhbHVlIHRvIG91dHB1dCAod3JpdHRlbiBpbiByZXZlcnNlKS4KKwkJCSAqLworCQkJaWYoY29kZXAtPmxlbmd0aCA9PSAwKSB7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkgICAgIldyb25nIGxlbmd0aCBvZiBkZWNvZGVkICIKKwkJCQkgICAgInN0cmluZzogZGF0YSBwcm9iYWJseSBjb3JydXB0ZWQgYXQgc2NhbmxpbmUgJWQiLAorCQkJCSAgICB0aWYtPnRpZl9yb3cpOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCQlpZiAoY29kZXAtPmxlbmd0aCA+IG9jYykgeworCQkJCS8qCisJCQkJICogU3RyaW5nIGlzIHRvbyBsb25nIGZvciBkZWNvZGUgYnVmZmVyLAorCQkJCSAqIGxvY2F0ZSBwb3J0aW9uIHRoYXQgd2lsbCBmaXQsIGNvcHkgdG8KKwkJCQkgKiB0aGUgZGVjb2RlIGJ1ZmZlciwgYW5kIHNldHVwIHJlc3RhcnQKKwkJCQkgKiBsb2dpYyBmb3IgdGhlIG5leHQgZGVjb2RpbmcgY2FsbC4KKwkJCQkgKi8KKwkJCQlzcC0+ZGVjX2NvZGVwID0gY29kZXA7CisJCQkJZG8geworCQkJCQljb2RlcCA9IGNvZGVwLT5uZXh0OworCQkJCX0gd2hpbGUgKGNvZGVwLT5sZW5ndGggPiBvY2MpOworCQkJCXNwLT5kZWNfcmVzdGFydCA9IG9jYzsKKwkJCQl0cCA9IG9wICsgb2NjOworCQkJCWRvICB7CisJCQkJCSotLXRwID0gY29kZXAtPnZhbHVlOworCQkJCQljb2RlcCA9IGNvZGVwLT5uZXh0OworCQkJCX0gIHdoaWxlICgtLW9jYyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlhc3NlcnQob2NjID49IGNvZGVwLT5sZW5ndGgpOworCQkJb3AgKz0gY29kZXAtPmxlbmd0aCwgb2NjIC09IGNvZGVwLT5sZW5ndGg7CisJCQl0cCA9IG9wOworCQkJZG8geworCQkJCSotLXRwID0gY29kZXAtPnZhbHVlOworCQkJfSB3aGlsZSggKGNvZGVwID0gY29kZXAtPm5leHQpICE9IE5VTEwgKTsKKwkJfSBlbHNlCisJCQkqb3ArKyA9IGNvZGUsIG9jYy0tOworCX0KKworCXRpZi0+dGlmX3Jhd2NwID0gKHVpbnQ4KikgYnA7CisJc3AtPmx6d19uYml0cyA9IG5iaXRzOworCXNwLT5sendfbmV4dGRhdGEgPSBuZXh0ZGF0YTsKKwlzcC0+bHp3X25leHRiaXRzID0gbmV4dGJpdHM7CisJc3AtPmRlY19uYml0c21hc2sgPSBuYml0c21hc2s7CisJc3AtPmRlY19vbGRjb2RlcCA9IG9sZGNvZGVwOworCXNwLT5kZWNfZnJlZV9lbnRwID0gZnJlZV9lbnRwOworCXNwLT5kZWNfbWF4Y29kZXAgPSBtYXhjb2RlcDsKKworCWlmIChvY2MgPiAwKSB7CisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSJOb3QgZW5vdWdoIGRhdGEgYXQgc2NhbmxpbmUgJWQgKHNob3J0ICVJNjRkIGJ5dGVzKSIsCisJCQkgICAgIHRpZi0+dGlmX3JvdywgKHVuc2lnbmVkIF9faW50NjQpIG9jYyk7CisjZWxzZQorCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJIk5vdCBlbm91Z2ggZGF0YSBhdCBzY2FubGluZSAlZCAoc2hvcnQgJWxsdSBieXRlcykiLAorCQkJICAgICB0aWYtPnRpZl9yb3csICh1bnNpZ25lZCBsb25nIGxvbmcpIG9jYyk7CisjZW5kaWYKKwkJcmV0dXJuICgwKTsKKwl9CisJcmV0dXJuICgxKTsKK30KKyNlbmRpZiAvKiBMWldfQ09NUEFUICovCisKKy8qCisgKiBMWlcgRW5jb2RpbmcuCisgKi8KKworc3RhdGljIGludAorTFpXU2V0dXBFbmNvZGUoVElGRiogdGlmKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIkxaV1NldHVwRW5jb2RlIjsKKwlMWldDb2RlY1N0YXRlKiBzcCA9IEVuY29kZXJTdGF0ZSh0aWYpOworCisJYXNzZXJ0KHNwICE9IE5VTEwpOworCXNwLT5lbmNfaGFzaHRhYiA9IChoYXNoX3QqKSBfVElGRm1hbGxvYyhIU0laRSpzaXplb2YgKGhhc2hfdCkpOworCWlmIChzcC0+ZW5jX2hhc2h0YWIgPT0gTlVMTCkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICAiTm8gc3BhY2UgZm9yIExaVyBoYXNoIHRhYmxlIik7CisJCXJldHVybiAoMCk7CisJfQorCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBSZXNldCBlbmNvZGluZyBzdGF0ZSBhdCB0aGUgc3RhcnQgb2YgYSBzdHJpcC4KKyAqLworc3RhdGljIGludAorTFpXUHJlRW5jb2RlKFRJRkYqIHRpZiwgdWludDE2IHMpCit7CisJTFpXQ29kZWNTdGF0ZSAqc3AgPSBFbmNvZGVyU3RhdGUodGlmKTsKKworCSh2b2lkKSBzOworCWFzc2VydChzcCAhPSBOVUxMKTsKKworCWlmKCBzcC0+ZW5jX2hhc2h0YWIgPT0gTlVMTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRpZi0+dGlmX3NldHVwZW5jb2RlKCB0aWYgKTsKKyAgICAgICAgfQorCisJc3AtPmx6d19uYml0cyA9IEJJVFNfTUlOOworCXNwLT5sendfbWF4Y29kZSA9IE1BWENPREUoQklUU19NSU4pOworCXNwLT5sendfZnJlZV9lbnQgPSBDT0RFX0ZJUlNUOworCXNwLT5sendfbmV4dGJpdHMgPSAwOworCXNwLT5sendfbmV4dGRhdGEgPSAwOworCXNwLT5lbmNfY2hlY2twb2ludCA9IENIRUNLX0dBUDsKKwlzcC0+ZW5jX3JhdGlvID0gMDsKKwlzcC0+ZW5jX2luY291bnQgPSAwOworCXNwLT5lbmNfb3V0Y291bnQgPSAwOworCS8qCisJICogVGhlIDQgaGVyZSBpbnN1cmVzIHRoZXJlIGlzIHNwYWNlIGZvciAyIG1heC1zaXplZAorCSAqIGNvZGVzIGluIExaV0VuY29kZSBhbmQgTFpXUG9zdERlY29kZS4KKwkgKi8KKwlzcC0+ZW5jX3Jhd2xpbWl0ID0gdGlmLT50aWZfcmF3ZGF0YSArIHRpZi0+dGlmX3Jhd2RhdGFzaXplLTEgLSA0OworCWNsX2hhc2goc3ApOwkJLyogY2xlYXIgaGFzaCB0YWJsZSAqLworCXNwLT5lbmNfb2xkY29kZSA9IChoY29kZV90KSAtMTsJLyogZ2VuZXJhdGVzIENPREVfQ0xFQVIgaW4gTFpXRW5jb2RlICovCisJcmV0dXJuICgxKTsKK30KKworI2RlZmluZQlDQUxDUkFUSU8oc3AsIHJhdCkgewkJCQkJXAorCWlmIChpbmNvdW50ID4gMHgwMDdmZmZmZikgeyAvKiBOQjogc2hpZnQgd2lsbCBvdmVyZmxvdyAqL1wKKwkJcmF0ID0gb3V0Y291bnQgPj4gODsJCQkJXAorCQlyYXQgPSAocmF0ID09IDAgPyAweDdmZmZmZmZmIDogaW5jb3VudC9yYXQpOwlcCisJfSBlbHNlCQkJCQkJCVwKKwkJcmF0ID0gKGluY291bnQ8PDgpIC8gb3V0Y291bnQ7CQkJXAorfQorCisvKiBFeHBsaWNpdCAweGZmIG1hc2tpbmcgdG8gbWFrZSBpY2MgLWNoZWNrPWNvbnZlcnNpb25zIGhhcHB5ICovCisjZGVmaW5lCVB1dE5leHRDb2RlKG9wLCBjKSB7CQkJCQlcCisJbmV4dGRhdGEgPSAobmV4dGRhdGEgPDwgbmJpdHMpIHwgYzsJCQlcCisJbmV4dGJpdHMgKz0gbmJpdHM7CQkJCQlcCisJKm9wKysgPSAodW5zaWduZWQgY2hhcikoKG5leHRkYXRhID4+IChuZXh0Yml0cy04KSkmMHhmZik7CQlcCisJbmV4dGJpdHMgLT0gODsJCQkJCQlcCisJaWYgKG5leHRiaXRzID49IDgpIHsJCQkJCVwKKwkJKm9wKysgPSAodW5zaWduZWQgY2hhcikoKG5leHRkYXRhID4+IChuZXh0Yml0cy04KSkmMHhmZik7CVwKKwkJbmV4dGJpdHMgLT0gODsJCQkJCVwKKwl9CQkJCQkJCVwKKwlvdXRjb3VudCArPSBuYml0czsJCQkJCVwKK30KKworLyoKKyAqIEVuY29kZSBhIGNodW5rIG9mIHBpeGVscy4KKyAqCisgKiBVc2VzIGFuIG9wZW4gYWRkcmVzc2luZyBkb3VibGUgaGFzaGluZyAobm8gY2hhaW5pbmcpIG9uIHRoZSAKKyAqIHByZWZpeCBjb2RlL25leHQgY2hhcmFjdGVyIGNvbWJpbmF0aW9uLiAgV2UgZG8gYSB2YXJpYW50IG9mCisgKiBLbnV0aCdzIGFsZ29yaXRobSBEICh2b2wuIDMsIHNlYy4gNi40KSBhbG9uZyB3aXRoIEcuIEtub3R0J3MKKyAqIHJlbGF0aXZlbHktcHJpbWUgc2Vjb25kYXJ5IHByb2JlLiAgSGVyZSwgdGhlIG1vZHVsYXIgZGl2aXNpb24KKyAqIGZpcnN0IHByb2JlIGlzIGdpdmVzIHdheSB0byBhIGZhc3RlciBleGNsdXNpdmUtb3IgbWFuaXB1bGF0aW9uLiAKKyAqIEFsc28gZG8gYmxvY2sgY29tcHJlc3Npb24gd2l0aCBhbiBhZGFwdGl2ZSByZXNldCwgd2hlcmVieSB0aGUKKyAqIGNvZGUgdGFibGUgaXMgY2xlYXJlZCB3aGVuIHRoZSBjb21wcmVzc2lvbiByYXRpbyBkZWNyZWFzZXMsCisgKiBidXQgYWZ0ZXIgdGhlIHRhYmxlIGZpbGxzLiAgVGhlIHZhcmlhYmxlLWxlbmd0aCBvdXRwdXQgY29kZXMKKyAqIGFyZSByZS1zaXplZCBhdCB0aGlzIHBvaW50LCBhbmQgYSBDT0RFX0NMRUFSIGlzIGdlbmVyYXRlZAorICogZm9yIHRoZSBkZWNvZGVyLiAKKyAqLworc3RhdGljIGludAorTFpXRW5jb2RlKFRJRkYqIHRpZiwgdWludDgqIGJwLCB0bXNpemVfdCBjYywgdWludDE2IHMpCit7CisJcmVnaXN0ZXIgTFpXQ29kZWNTdGF0ZSAqc3AgPSBFbmNvZGVyU3RhdGUodGlmKTsKKwlyZWdpc3RlciBsb25nIGZjb2RlOworCXJlZ2lzdGVyIGhhc2hfdCAqaHA7CisJcmVnaXN0ZXIgaW50IGgsIGM7CisJaGNvZGVfdCBlbnQ7CisJbG9uZyBkaXNwOworCWxvbmcgaW5jb3VudCwgb3V0Y291bnQsIGNoZWNrcG9pbnQ7CisJdW5zaWduZWQgbG9uZyBuZXh0ZGF0YTsKKyAgICAgICAgbG9uZyBuZXh0Yml0czsKKwlpbnQgZnJlZV9lbnQsIG1heGNvZGUsIG5iaXRzOworCXVpbnQ4KiBvcDsKKwl1aW50OCogbGltaXQ7CisKKwkodm9pZCkgczsKKwlpZiAoc3AgPT0gTlVMTCkKKwkJcmV0dXJuICgwKTsKKworICAgICAgICBhc3NlcnQoc3AtPmVuY19oYXNodGFiICE9IE5VTEwpOworCisJLyoKKwkgKiBMb2FkIGxvY2FsIHN0YXRlLgorCSAqLworCWluY291bnQgPSBzcC0+ZW5jX2luY291bnQ7CisJb3V0Y291bnQgPSBzcC0+ZW5jX291dGNvdW50OworCWNoZWNrcG9pbnQgPSBzcC0+ZW5jX2NoZWNrcG9pbnQ7CisJbmV4dGRhdGEgPSBzcC0+bHp3X25leHRkYXRhOworCW5leHRiaXRzID0gc3AtPmx6d19uZXh0Yml0czsKKwlmcmVlX2VudCA9IHNwLT5sendfZnJlZV9lbnQ7CisJbWF4Y29kZSA9IHNwLT5sendfbWF4Y29kZTsKKwluYml0cyA9IHNwLT5sendfbmJpdHM7CisJb3AgPSB0aWYtPnRpZl9yYXdjcDsKKwlsaW1pdCA9IHNwLT5lbmNfcmF3bGltaXQ7CisJZW50ID0gc3AtPmVuY19vbGRjb2RlOworCisJaWYgKGVudCA9PSAoaGNvZGVfdCkgLTEgJiYgY2MgPiAwKSB7CisJCS8qCisJCSAqIE5COiBUaGlzIGlzIHNhZmUgYmVjYXVzZSBpdCBjYW4gb25seSBoYXBwZW4KKwkJICogICAgIGF0IHRoZSBzdGFydCBvZiBhIHN0cmlwIHdoZXJlIHdlIGtub3cgdGhlcmUKKwkJICogICAgIGlzIHNwYWNlIGluIHRoZSBkYXRhIGJ1ZmZlci4KKwkJICovCisJCVB1dE5leHRDb2RlKG9wLCBDT0RFX0NMRUFSKTsKKwkJZW50ID0gKmJwKys7IGNjLS07IGluY291bnQrKzsKKwl9CisJd2hpbGUgKGNjID4gMCkgeworCQljID0gKmJwKys7IGNjLS07IGluY291bnQrKzsKKwkJZmNvZGUgPSAoKGxvbmcpYyA8PCBCSVRTX01BWCkgKyBlbnQ7CisJCWggPSAoYyA8PCBIU0hJRlQpIF4gZW50OwkvKiB4b3IgaGFzaGluZyAqLworI2lmZGVmIF9XSU5ET1dTCisJCS8qCisJCSAqIENoZWNrIGhhc2ggaW5kZXggZm9yIGFuIG92ZXJmbG93LgorCQkgKi8KKwkJaWYgKGggPj0gSFNJWkUpCisJCQloIC09IEhTSVpFOworI2VuZGlmCisJCWhwID0gJnNwLT5lbmNfaGFzaHRhYltoXTsKKwkJaWYgKGhwLT5oYXNoID09IGZjb2RlKSB7CisJCQllbnQgPSBocC0+Y29kZTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChocC0+aGFzaCA+PSAwKSB7CisJCQkvKgorCQkJICogUHJpbWFyeSBoYXNoIGZhaWxlZCwgY2hlY2sgc2Vjb25kYXJ5IGhhc2guCisJCQkgKi8KKwkJCWRpc3AgPSBIU0laRSAtIGg7CisJCQlpZiAoaCA9PSAwKQorCQkJCWRpc3AgPSAxOworCQkJZG8geworCQkJCS8qCisJCQkJICogQXZvaWQgcG9pbnRlciBhcml0aG1ldGljICdjdXogb2YKKwkJCQkgKiB3cmFwYXJvdW5kIHByb2JsZW1zIHdpdGggc2VnbWVudHMuCisJCQkJICovCisJCQkJaWYgKChoIC09IGRpc3ApIDwgMCkKKwkJCQkJaCArPSBIU0laRTsKKwkJCQlocCA9ICZzcC0+ZW5jX2hhc2h0YWJbaF07CisJCQkJaWYgKGhwLT5oYXNoID09IGZjb2RlKSB7CisJCQkJCWVudCA9IGhwLT5jb2RlOworCQkJCQlnb3RvIGhpdDsKKwkJCQl9CisJCQl9IHdoaWxlIChocC0+aGFzaCA+PSAwKTsKKwkJfQorCQkvKgorCQkgKiBOZXcgZW50cnksIGVtaXQgY29kZSBhbmQgYWRkIHRvIHRhYmxlLgorCQkgKi8KKwkJLyoKKwkJICogVmVyaWZ5IHRoZXJlIGlzIHNwYWNlIGluIHRoZSBidWZmZXIgZm9yIHRoZSBjb2RlCisJCSAqIGFuZCBhbnkgcG90ZW50aWFsIENsZWFyIGNvZGUgdGhhdCBtaWdodCBiZSBlbWl0dGVkCisJCSAqIGJlbG93LiAgVGhlIHZhbHVlIG9mIGxpbWl0IGlzIHNldHVwIHNvIHRoYXQgdGhlcmUKKwkJICogYXJlIGF0IGxlYXN0IDQgYnl0ZXMgZnJlZS0tcm9vbSBmb3IgMiBjb2Rlcy4KKwkJICovCisJCWlmIChvcCA+IGxpbWl0KSB7CisJCQl0aWYtPnRpZl9yYXdjYyA9ICh0bXNpemVfdCkob3AgLSB0aWYtPnRpZl9yYXdkYXRhKTsKKwkJCVRJRkZGbHVzaERhdGExKHRpZik7CisJCQlvcCA9IHRpZi0+dGlmX3Jhd2RhdGE7CisJCX0KKwkJUHV0TmV4dENvZGUob3AsIGVudCk7CisJCWVudCA9IGM7CisJCWhwLT5jb2RlID0gZnJlZV9lbnQrKzsKKwkJaHAtPmhhc2ggPSBmY29kZTsKKwkJaWYgKGZyZWVfZW50ID09IENPREVfTUFYLTEpIHsKKwkJCS8qIHRhYmxlIGlzIGZ1bGwsIGVtaXQgY2xlYXIgY29kZSBhbmQgcmVzZXQgKi8KKwkJCWNsX2hhc2goc3ApOworCQkJc3AtPmVuY19yYXRpbyA9IDA7CisJCQlpbmNvdW50ID0gMDsKKwkJCW91dGNvdW50ID0gMDsKKwkJCWZyZWVfZW50ID0gQ09ERV9GSVJTVDsKKwkJCVB1dE5leHRDb2RlKG9wLCBDT0RFX0NMRUFSKTsKKwkJCW5iaXRzID0gQklUU19NSU47CisJCQltYXhjb2RlID0gTUFYQ09ERShCSVRTX01JTik7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogSWYgdGhlIG5leHQgZW50cnkgaXMgZ29pbmcgdG8gYmUgdG9vIGJpZyBmb3IKKwkJCSAqIHRoZSBjb2RlIHNpemUsIHRoZW4gaW5jcmVhc2UgaXQsIGlmIHBvc3NpYmxlLgorCQkJICovCisJCQlpZiAoZnJlZV9lbnQgPiBtYXhjb2RlKSB7CisJCQkJbmJpdHMrKzsKKwkJCQlhc3NlcnQobmJpdHMgPD0gQklUU19NQVgpOworCQkJCW1heGNvZGUgPSAoaW50KSBNQVhDT0RFKG5iaXRzKTsKKwkJCX0gZWxzZSBpZiAoaW5jb3VudCA+PSBjaGVja3BvaW50KSB7CisJCQkJbG9uZyByYXQ7CisJCQkJLyoKKwkJCQkgKiBDaGVjayBjb21wcmVzc2lvbiByYXRpbyBhbmQsIGlmIHRoaW5ncyBzZWVtCisJCQkJICogdG8gYmUgc2xpcHBpbmcsIGNsZWFyIHRoZSBoYXNoIHRhYmxlIGFuZAorCQkJCSAqIHJlc2V0IHN0YXRlLiAgVGhlIGNvbXByZXNzaW9uIHJhdGlvIGlzIGEKKwkJCQkgKiAyNCs4LWJpdCBmcmFjdGlvbmFsIG51bWJlci4KKwkJCQkgKi8KKwkJCQljaGVja3BvaW50ID0gaW5jb3VudCtDSEVDS19HQVA7CisJCQkJQ0FMQ1JBVElPKHNwLCByYXQpOworCQkJCWlmIChyYXQgPD0gc3AtPmVuY19yYXRpbykgeworCQkJCQljbF9oYXNoKHNwKTsKKwkJCQkJc3AtPmVuY19yYXRpbyA9IDA7CisJCQkJCWluY291bnQgPSAwOworCQkJCQlvdXRjb3VudCA9IDA7CisJCQkJCWZyZWVfZW50ID0gQ09ERV9GSVJTVDsKKwkJCQkJUHV0TmV4dENvZGUob3AsIENPREVfQ0xFQVIpOworCQkJCQluYml0cyA9IEJJVFNfTUlOOworCQkJCQltYXhjb2RlID0gTUFYQ09ERShCSVRTX01JTik7CisJCQkJfSBlbHNlCisJCQkJCXNwLT5lbmNfcmF0aW8gPSByYXQ7CisJCQl9CisJCX0KKwloaXQ6CisJCTsKKwl9CisKKwkvKgorCSAqIFJlc3RvcmUgZ2xvYmFsIHN0YXRlLgorCSAqLworCXNwLT5lbmNfaW5jb3VudCA9IGluY291bnQ7CisJc3AtPmVuY19vdXRjb3VudCA9IG91dGNvdW50OworCXNwLT5lbmNfY2hlY2twb2ludCA9IGNoZWNrcG9pbnQ7CisJc3AtPmVuY19vbGRjb2RlID0gZW50OworCXNwLT5sendfbmV4dGRhdGEgPSBuZXh0ZGF0YTsKKwlzcC0+bHp3X25leHRiaXRzID0gbmV4dGJpdHM7CisJc3AtPmx6d19mcmVlX2VudCA9IGZyZWVfZW50OworCXNwLT5sendfbWF4Y29kZSA9IG1heGNvZGU7CisJc3AtPmx6d19uYml0cyA9IG5iaXRzOworCXRpZi0+dGlmX3Jhd2NwID0gb3A7CisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIEZpbmlzaCBvZmYgYW4gZW5jb2RlZCBzdHJpcCBieSBmbHVzaGluZyB0aGUgbGFzdAorICogc3RyaW5nIGFuZCB0YWNraW5nIG9uIGFuIEVuZCBPZiBJbmZvcm1hdGlvbiBjb2RlLgorICovCitzdGF0aWMgaW50CitMWldQb3N0RW5jb2RlKFRJRkYqIHRpZikKK3sKKwlyZWdpc3RlciBMWldDb2RlY1N0YXRlICpzcCA9IEVuY29kZXJTdGF0ZSh0aWYpOworCXVpbnQ4KiBvcCA9IHRpZi0+dGlmX3Jhd2NwOworCWxvbmcgbmV4dGJpdHMgPSBzcC0+bHp3X25leHRiaXRzOworCXVuc2lnbmVkIGxvbmcgbmV4dGRhdGEgPSBzcC0+bHp3X25leHRkYXRhOworCWxvbmcgb3V0Y291bnQgPSBzcC0+ZW5jX291dGNvdW50OworCWludCBuYml0cyA9IHNwLT5sendfbmJpdHM7CisKKwlpZiAob3AgPiBzcC0+ZW5jX3Jhd2xpbWl0KSB7CisJCXRpZi0+dGlmX3Jhd2NjID0gKHRtc2l6ZV90KShvcCAtIHRpZi0+dGlmX3Jhd2RhdGEpOworCQlUSUZGRmx1c2hEYXRhMSh0aWYpOworCQlvcCA9IHRpZi0+dGlmX3Jhd2RhdGE7CisJfQorCWlmIChzcC0+ZW5jX29sZGNvZGUgIT0gKGhjb2RlX3QpIC0xKSB7CisJCVB1dE5leHRDb2RlKG9wLCBzcC0+ZW5jX29sZGNvZGUpOworCQlzcC0+ZW5jX29sZGNvZGUgPSAoaGNvZGVfdCkgLTE7CisJfQorCVB1dE5leHRDb2RlKG9wLCBDT0RFX0VPSSk7CisgICAgICAgIC8qIEV4cGxpY2l0IDB4ZmYgbWFza2luZyB0byBtYWtlIGljYyAtY2hlY2s9Y29udmVyc2lvbnMgaGFwcHkgKi8KKwlpZiAobmV4dGJpdHMgPiAwKSAKKwkJKm9wKysgPSAodW5zaWduZWQgY2hhcikoKG5leHRkYXRhIDw8ICg4LW5leHRiaXRzKSkmMHhmZik7CisJdGlmLT50aWZfcmF3Y2MgPSAodG1zaXplX3QpKG9wIC0gdGlmLT50aWZfcmF3ZGF0YSk7CisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIFJlc2V0IGVuY29kaW5nIGhhc2ggdGFibGUuCisgKi8KK3N0YXRpYyB2b2lkCitjbF9oYXNoKExaV0NvZGVjU3RhdGUqIHNwKQoreworCXJlZ2lzdGVyIGhhc2hfdCAqaHAgPSAmc3AtPmVuY19oYXNodGFiW0hTSVpFLTFdOworCXJlZ2lzdGVyIGxvbmcgaSA9IEhTSVpFLTg7CisKKwlkbyB7CisJCWkgLT0gODsKKwkJaHBbLTddLmhhc2ggPSAtMTsKKwkJaHBbLTZdLmhhc2ggPSAtMTsKKwkJaHBbLTVdLmhhc2ggPSAtMTsKKwkJaHBbLTRdLmhhc2ggPSAtMTsKKwkJaHBbLTNdLmhhc2ggPSAtMTsKKwkJaHBbLTJdLmhhc2ggPSAtMTsKKwkJaHBbLTFdLmhhc2ggPSAtMTsKKwkJaHBbIDBdLmhhc2ggPSAtMTsKKwkJaHAgLT0gODsKKwl9IHdoaWxlIChpID49IDApOworCWZvciAoaSArPSA4OyBpID4gMDsgaS0tLCBocC0tKQorCQlocC0+aGFzaCA9IC0xOworfQorCitzdGF0aWMgdm9pZAorTFpXQ2xlYW51cChUSUZGKiB0aWYpCit7CisJKHZvaWQpVElGRlByZWRpY3RvckNsZWFudXAodGlmKTsKKworCWFzc2VydCh0aWYtPnRpZl9kYXRhICE9IDApOworCisJaWYgKERlY29kZXJTdGF0ZSh0aWYpLT5kZWNfY29kZXRhYikKKwkJX1RJRkZmcmVlKERlY29kZXJTdGF0ZSh0aWYpLT5kZWNfY29kZXRhYik7CisKKwlpZiAoRW5jb2RlclN0YXRlKHRpZiktPmVuY19oYXNodGFiKQorCQlfVElGRmZyZWUoRW5jb2RlclN0YXRlKHRpZiktPmVuY19oYXNodGFiKTsKKworCV9USUZGZnJlZSh0aWYtPnRpZl9kYXRhKTsKKwl0aWYtPnRpZl9kYXRhID0gTlVMTDsKKworCV9USUZGU2V0RGVmYXVsdENvbXByZXNzaW9uU3RhdGUodGlmKTsKK30KKworaW50CitUSUZGSW5pdExaVyhUSUZGKiB0aWYsIGludCBzY2hlbWUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRkluaXRMWlciOworCWFzc2VydChzY2hlbWUgPT0gQ09NUFJFU1NJT05fTFpXKTsKKwkvKgorCSAqIEFsbG9jYXRlIHN0YXRlIGJsb2NrIHNvIHRhZyBtZXRob2RzIGhhdmUgc3RvcmFnZSB0byByZWNvcmQgdmFsdWVzLgorCSAqLworCXRpZi0+dGlmX2RhdGEgPSAodWludDgqKSBfVElGRm1hbGxvYyhzaXplb2YgKExaV0NvZGVjU3RhdGUpKTsKKwlpZiAodGlmLT50aWZfZGF0YSA9PSBOVUxMKQorCQlnb3RvIGJhZDsKKwlEZWNvZGVyU3RhdGUodGlmKS0+ZGVjX2NvZGV0YWIgPSBOVUxMOworCURlY29kZXJTdGF0ZSh0aWYpLT5kZWNfZGVjb2RlID0gTlVMTDsKKwlFbmNvZGVyU3RhdGUodGlmKS0+ZW5jX2hhc2h0YWIgPSBOVUxMOworICAgICAgICBMWldTdGF0ZSh0aWYpLT5yd19tb2RlID0gdGlmLT50aWZfbW9kZTsKKworCS8qCisJICogSW5zdGFsbCBjb2RlYyBtZXRob2RzLgorCSAqLworCXRpZi0+dGlmX2ZpeHVwdGFncyA9IExaV0ZpeHVwVGFnczsgCisJdGlmLT50aWZfc2V0dXBkZWNvZGUgPSBMWldTZXR1cERlY29kZTsKKwl0aWYtPnRpZl9wcmVkZWNvZGUgPSBMWldQcmVEZWNvZGU7CisJdGlmLT50aWZfZGVjb2Rlcm93ID0gTFpXRGVjb2RlOworCXRpZi0+dGlmX2RlY29kZXN0cmlwID0gTFpXRGVjb2RlOworCXRpZi0+dGlmX2RlY29kZXRpbGUgPSBMWldEZWNvZGU7CisJdGlmLT50aWZfc2V0dXBlbmNvZGUgPSBMWldTZXR1cEVuY29kZTsKKwl0aWYtPnRpZl9wcmVlbmNvZGUgPSBMWldQcmVFbmNvZGU7CisJdGlmLT50aWZfcG9zdGVuY29kZSA9IExaV1Bvc3RFbmNvZGU7CisJdGlmLT50aWZfZW5jb2Rlcm93ID0gTFpXRW5jb2RlOworCXRpZi0+dGlmX2VuY29kZXN0cmlwID0gTFpXRW5jb2RlOworCXRpZi0+dGlmX2VuY29kZXRpbGUgPSBMWldFbmNvZGU7CisJdGlmLT50aWZfY2xlYW51cCA9IExaV0NsZWFudXA7CisJLyoKKwkgKiBTZXR1cCBwcmVkaWN0b3Igc2V0dXAuCisJICovCisJKHZvaWQpIFRJRkZQcmVkaWN0b3JJbml0KHRpZik7CisJcmV0dXJuICgxKTsKK2JhZDoKKwlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAKKwkJICAgICAiTm8gc3BhY2UgZm9yIExaVyBzdGF0ZSBibG9jayIpOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODUsIDE5ODYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogSmFtZXMgQS4gV29vZHMsIGRlcml2ZWQgZnJvbSBvcmlnaW5hbCB3b3JrIGJ5IFNwZW5jZXIgVGhvbWFzCisgKiBhbmQgSm9zZXBoIE9yb3N0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlCisgKiBkdXBsaWNhdGVkIGluIGFsbCBzdWNoIGZvcm1zIGFuZCB0aGF0IGFueSBkb2N1bWVudGF0aW9uLAorICogYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAorICogZGlzdHJpYnV0aW9uIGFuZCB1c2UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgc29mdHdhcmUgd2FzIGRldmVsb3BlZAorICogYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkuICBUaGUgbmFtZSBvZiB0aGUKKyAqIFVuaXZlcnNpdHkgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworI2VuZGlmIC8qIExaV19TVVBQT1JUICovCisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTggc3c9OCBub2V0OiAqLworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfbmV4dC5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfbmV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZTAzMTEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9uZXh0LmMKQEAgLTAsMCArMSwxODEgQEAKKy8qICRJZDogdGlmX25leHQuYyx2IDEuMTYgMjAxNC0xMi0yOSAxMjowOToxMSBlcm91YXVsdCBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCAKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgorICogU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcy4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSAKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTQU0gTEVGRkxFUiBPUiBTSUxJQ09OIEdSQVBISUNTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgKiBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgKiBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GIAorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSAKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgInRpZmZpb3AuaCIKKyNpZmRlZiBORVhUX1NVUFBPUlQKKy8qCisgKiBUSUZGIExpYnJhcnkuCisgKgorICogTmVYVCAyLWJpdCBHcmV5IFNjYWxlIENvbXByZXNzaW9uIEFsZ29yaXRobSBTdXBwb3J0CisgKi8KKworI2RlZmluZSBTRVRQSVhFTChvcCwgdikgewkJCVwKKwlzd2l0Y2ggKG5waXhlbHMrKyAmIDMpIHsJCVwKKwljYXNlIDA6CW9wWzBdICA9ICh1bnNpZ25lZCBjaGFyKSAoKHYpIDw8IDYpOyBicmVhazsJXAorCWNhc2UgMToJb3BbMF0gfD0gKHYpIDw8IDQ7IGJyZWFrOwlcCisJY2FzZSAyOglvcFswXSB8PSAodikgPDwgMjsgYnJlYWs7CVwKKwljYXNlIDM6CSpvcCsrIHw9ICh2KTsJICAgYnJlYWs7CVwKKwl9CQkJCQlcCit9CisKKyNkZWZpbmUgTElURVJBTFJPVwkweDAwCisjZGVmaW5lIExJVEVSQUxTUEFOCTB4NDAKKyNkZWZpbmUgV0hJVEUgICAJKCgxPDwyKS0xKQorCitzdGF0aWMgaW50CitOZVhURGVjb2RlKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3Qgb2NjLCB1aW50MTYgcykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJOZVhURGVjb2RlIjsKKwl1bnNpZ25lZCBjaGFyICpicCwgKm9wOworCXRtc2l6ZV90IGNjOworCXVpbnQ4KiByb3c7CisJdG1zaXplX3Qgc2NhbmxpbmUsIG47CisKKwkodm9pZCkgczsKKwkvKgorCSAqIEVhY2ggc2NhbmxpbmUgaXMgYXNzdW1lZCB0byBzdGFydCBvZmYgYXMgYWxsCisJICogd2hpdGUgKHdlIGFzc3VtZSBhIFBob3RvbWV0cmljSW50ZXJwcmV0YXRpb24KKwkgKiBvZiBgYG1pbi1pcy1ibGFjaycnKS4KKwkgKi8KKwlmb3IgKG9wID0gKHVuc2lnbmVkIGNoYXIqKSBidWYsIGNjID0gb2NjOyBjYy0tID4gMDspCisJCSpvcCsrID0gMHhmZjsKKworCWJwID0gKHVuc2lnbmVkIGNoYXIgKil0aWYtPnRpZl9yYXdjcDsKKwljYyA9IHRpZi0+dGlmX3Jhd2NjOworCXNjYW5saW5lID0gdGlmLT50aWZfc2NhbmxpbmVzaXplOworCWlmIChvY2MgJSBzY2FubGluZSkKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJGcmFjdGlvbmFsIHNjYW5saW5lcyBjYW5ub3QgYmUgcmVhZCIpOworCQlyZXR1cm4gKDApOworCX0KKwlmb3IgKHJvdyA9IGJ1ZjsgY2MgPiAwICYmIG9jYyA+IDA7IG9jYyAtPSBzY2FubGluZSwgcm93ICs9IHNjYW5saW5lKSB7CisJCW4gPSAqYnArKywgY2MtLTsKKwkJc3dpdGNoIChuKSB7CisJCWNhc2UgTElURVJBTFJPVzoKKwkJCS8qCisJCQkgKiBUaGUgZW50aXJlIHNjYW5saW5lIGlzIGdpdmVuIGFzIGxpdGVyYWwgdmFsdWVzLgorCQkJICovCisJCQlpZiAoY2MgPCBzY2FubGluZSkKKwkJCQlnb3RvIGJhZDsKKwkJCV9USUZGbWVtY3B5KHJvdywgYnAsIHNjYW5saW5lKTsKKwkJCWJwICs9IHNjYW5saW5lOworCQkJY2MgLT0gc2NhbmxpbmU7CisJCQlicmVhazsKKwkJY2FzZSBMSVRFUkFMU1BBTjogeworCQkJdG1zaXplX3Qgb2ZmOworCQkJLyoKKwkJCSAqIFRoZSBzY2FubGluZSBoYXMgYSBsaXRlcmFsIHNwYW4gdGhhdCBiZWdpbnMgYXQgc29tZQorCQkJICogb2Zmc2V0LgorCQkJICovCisJCQlpZiggY2MgPCA0ICkKKwkJCQlnb3RvIGJhZDsKKwkJCW9mZiA9IChicFswXSAqIDI1NikgKyBicFsxXTsKKwkJCW4gPSAoYnBbMl0gKiAyNTYpICsgYnBbM107CisJCQlpZiAoY2MgPCA0K24gfHwgb2ZmK24gPiBzY2FubGluZSkKKwkJCQlnb3RvIGJhZDsKKwkJCV9USUZGbWVtY3B5KHJvdytvZmYsIGJwKzQsIG4pOworCQkJYnAgKz0gNCtuOworCQkJY2MgLT0gNCtuOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDogeworCQkJdWludDMyIG5waXhlbHMgPSAwLCBncmV5OworCQkJdWludDMyIGltYWdld2lkdGggPSB0aWYtPnRpZl9kaXIudGRfaW1hZ2V3aWR0aDsKKyAgICAgICAgICAgIGlmKCBpc1RpbGVkKHRpZikgKQorICAgICAgICAgICAgICAgIGltYWdld2lkdGggPSB0aWYtPnRpZl9kaXIudGRfdGlsZXdpZHRoOworCisJCQkvKgorCQkJICogVGhlIHNjYW5saW5lIGlzIGNvbXBvc2VkIG9mIGEgc2VxdWVuY2Ugb2YgY29uc3RhbnQKKwkJCSAqIGNvbG9yIGBgcnVucycnLiAgV2Ugc2hpZnQgaW50byBgYHJ1biBtb2RlJycgYW5kCisJCQkgKiBpbnRlcnByZXQgYnl0ZXMgYXMgY29kZXMgb2YgdGhlIGZvcm0KKwkJCSAqIDxjb2xvcj48bnBpeGVscz4gdW50aWwgd2UndmUgZmlsbGVkIHRoZSBzY2FubGluZS4KKwkJCSAqLworCQkJb3AgPSByb3c7CisJCQlmb3IgKDs7KSB7CisJCQkJZ3JleSA9ICh1aW50MzIpKChuPj42KSAmIDB4Myk7CisJCQkJbiAmPSAweDNmOworCQkJCS8qCisJCQkJICogRW5zdXJlIHRoZSBydW4gZG9lcyBub3QgZXhjZWVkIHRoZSBzY2FubGluZQorCQkJCSAqIGJvdW5kcywgcG90ZW50aWFsbHkgcmVzdWx0aW5nIGluIGEgc2VjdXJpdHkKKwkJCQkgKiBpc3N1ZS4KKwkJCQkgKi8KKwkJCQl3aGlsZSAobi0tID4gMCAmJiBucGl4ZWxzIDwgaW1hZ2V3aWR0aCkKKwkJCQkJU0VUUElYRUwob3AsIGdyZXkpOworCQkJCWlmIChucGl4ZWxzID49IGltYWdld2lkdGgpCisJCQkJCWJyZWFrOworCQkJCWlmIChjYyA9PSAwKQorCQkJCQlnb3RvIGJhZDsKKwkJCQluID0gKmJwKyssIGNjLS07CisJCQl9CisJCQlicmVhazsKKwkJfQorCQl9CisJfQorCXRpZi0+dGlmX3Jhd2NwID0gKHVpbnQ4KikgYnA7CisJdGlmLT50aWZfcmF3Y2MgPSBjYzsKKwlyZXR1cm4gKDEpOworYmFkOgorCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJOb3QgZW5vdWdoIGRhdGEgZm9yIHNjYW5saW5lICVsZCIsCisJICAgIChsb25nKSB0aWYtPnRpZl9yb3cpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK05lWFRQcmVEZWNvZGUoVElGRiogdGlmLCB1aW50MTYgcykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJOZVhUUHJlRGVjb2RlIjsKKwlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisJKHZvaWQpczsKKworCWlmKCB0ZC0+dGRfYml0c3BlcnNhbXBsZSAhPSAyICkKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJVbnN1cHBvcnRlZCBCaXRzUGVyU2FtcGxlID0gJWQiLAorCQkJCQkgdGQtPnRkX2JpdHNwZXJzYW1wbGUpOworCQlyZXR1cm4gKDApOworCX0KKwlyZXR1cm4gKDEpOworfQorCQoraW50CitUSUZGSW5pdE5lWFQoVElGRiogdGlmLCBpbnQgc2NoZW1lKQoreworCSh2b2lkKSBzY2hlbWU7CisJdGlmLT50aWZfcHJlZGVjb2RlID0gTmVYVFByZURlY29kZTsgIAorCXRpZi0+dGlmX2RlY29kZXJvdyA9IE5lWFREZWNvZGU7ICAKKwl0aWYtPnRpZl9kZWNvZGVzdHJpcCA9IE5lWFREZWNvZGU7ICAKKwl0aWYtPnRpZl9kZWNvZGV0aWxlID0gTmVYVERlY29kZTsKKwlyZXR1cm4gKDEpOworfQorI2VuZGlmIC8qIE5FWFRfU1VQUE9SVCAqLworCisvKiB2aW06IHNldCB0cz04IHN0cz04IHN3PTggbm9ldDogKi8KKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBjCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogZmlsbC1jb2x1bW46IDc4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX29qcGVnLmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9vanBlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNTQ0OWMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9vanBlZy5jCkBAIC0wLDAgKzEsMjUxNiBAQAorLyogJElkOiB0aWZfb2pwZWcuYyx2IDEuNjAgMjAxNS0wNS0zMSAwMDozODo0NiBiZnJpZXNlbiBFeHAgJCAqLworCisvKiBXQVJOSU5HOiBUaGUgdHlwZSBvZiBKUEVHIGVuY2Fwc3VsYXRpb24gZGVmaW5lZCBieSB0aGUgVElGRiBWZXJzaW9uIDYuMAorICAgc3BlY2lmaWNhdGlvbiBpcyBub3cgdG90YWxseSBvYnNvbGV0ZSBhbmQgZGVwcmVjYXRlZCBmb3IgbmV3IGFwcGxpY2F0aW9ucyBhbmQKKyAgIGltYWdlcy4gVGhpcyBmaWxlIHdhcyB3YXMgY3JlYXRlZCBzb2xlbHkgaW4gb3JkZXIgdG8gcmVhZCB1bmNvbnZlcnRlZCBpbWFnZXMKKyAgIHN0aWxsIHByZXNlbnQgb24gc29tZSB1c2VycycgY29tcHV0ZXIgc3lzdGVtcy4gSXQgd2lsbCBuZXZlciBiZSBleHRlbmRlZAorICAgdG8gd3JpdGUgc3VjaCBmaWxlcy4gV3JpdGluZyBuZXctc3R5bGUgSlBFRyBjb21wcmVzc2VkIFRJRkZzIGlzIGltcGxlbWVudGVkCisgICBpbiB0aWZfanBlZy5jLgorCisgICBUaGUgY29kZSBpcyBjYXJlZnVsbHkgY3JhZnRlZCB0byByb2J1c3RseSByZWFkIGFsbCBnYXRoZXJlZCBKUEVHLWluLVRJRkYKKyAgIHRlc3RmaWxlcywgYW5kIGFudGljaXBhdGUgYXMgbXVjaCBhcyBwb3NzaWJsZSBhbGwgb3RoZXIuLi4gQnV0IHN0aWxsLCBpdCBtYXkKKyAgIGZhaWwgb24gc29tZS4gSWYgeW91IGVuY291bnRlciBwcm9ibGVtcywgcGxlYXNlIHJlcG9ydCB0aGVtIG9uIHRoZSBUSUZGCisgICBtYWlsaW5nIGxpc3QgYW5kL29yIHRvIEpvcmlzIFZhbiBEYW1tZSA8aW5mb0Bhd2FyZXN5c3RlbXMuYmU+LgorCisgICBQbGVhc2UgcmVhZCB0aGUgZmlsZSBjYWxsZWQgIlRJRkYgVGVjaG5pY2FsIE5vdGUgIzIiIGlmIHlvdSBuZWVkIHRvIGJlCisgICBjb252aW5jZWQgdGhpcyBjb21wcmVzc2lvbiBzY2hlbWUgaXMgYmFkIGFuZCBicmVha3MgVElGRi4gVGhhdCBkb2N1bWVudAorICAgaXMgbGlua2VkIHRvIGZyb20gdGhlIExpYlRpZmYgc2l0ZSA8aHR0cDovL3d3dy5yZW1vdGVzZW5zaW5nLm9yZy9saWJ0aWZmLz4KKyAgIGFuZCBmcm9tIEFXYXJlIFN5c3RlbXMnIFRJRkYgc2VjdGlvbgorICAgPGh0dHA6Ly93d3cuYXdhcmVzeXN0ZW1zLmJlL2ltYWdpbmcvdGlmZi5odG1sPi4gSXQgaXMgYWxzbyBhYnNvcmJlZAorICAgaW4gQWRvYmUncyBzcGVjaWZpY2F0aW9uIHN1cHBsZW1lbnRzLCBtYXJrZWQgImRyYWZ0IiB1cCB0byB0aGlzIGRheSwgYnV0CisgICBzdXBwb3J0ZWQgYnkgdGhlIFRJRkYgY29tbXVuaXR5LgorCisgICBUaGlzIGZpbGUgaW50ZXJmYWNlcyB3aXRoIFJlbGVhc2UgNkIgb2YgdGhlIEpQRUcgTGlicmFyeSB3cml0dGVuIGJ5IHRoZQorICAgSW5kZXBlbmRlbnQgSlBFRyBHcm91cC4gUHJldmlvdXMgdmVyc2lvbnMgb2YgdGhpcyBmaWxlIHJlcXVpcmVkIGEgaGFjayBpbnNpZGUKKyAgIHRoZSBMaWJKcGVnIGxpYnJhcnkuIFRoaXMgdmVyc2lvbiBubyBsb25nZXIgcmVxdWlyZXMgdGhhdC4gUmVtZW1iZXIgdG8KKyAgIHJlbW92ZSB0aGUgaGFjayBpZiB5b3UgdXBkYXRlIGZyb20gdGhlIG9sZCB2ZXJzaW9uLgorCisgICBDb3B5cmlnaHQgKGMpIEpvcmlzIFZhbiBEYW1tZSA8aW5mb0Bhd2FyZXN5c3RlbXMuYmU+CisgICBDb3B5cmlnaHQgKGMpIEFXYXJlIFN5c3RlbXMgPGh0dHA6Ly93d3cuYXdhcmVzeXN0ZW1zLmJlLz4KKworICAgVGhlIGxpY2VuY2UgYWdyZWVtZW50IGZvciB0aGlzIGZpbGUgaXMgdGhlIHNhbWUgYXMgdGhlIHJlc3Qgb2YgdGhlIExpYlRpZmYKKyAgIGxpYnJhcnkuCisKKyAgIElOIE5PIEVWRU5UIFNIQUxMIEpPUklTIFZBTiBEQU1NRSBPUiBBV0FSRSBTWVNURU1TIEJFIExJQUJMRSBGT1IKKyAgIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgICBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgICBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgICBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFCisgICBPRiBUSElTIFNPRlRXQVJFLgorCisgICBKb3JpcyBWYW4gRGFtbWUgYW5kL29yIEFXYXJlIFN5c3RlbXMgbWF5IGJlIGF2YWlsYWJsZSBmb3IgY3VzdG9tCisgICBkZXZlbG9wbWVudC4gSWYgeW91IGxpa2Ugd2hhdCB5b3Ugc2VlLCBhbmQgbmVlZCBhbnl0aGluZyBzaW1pbGFyIG9yIHJlbGF0ZWQsCisgICBjb250YWN0IDxpbmZvQGF3YXJlc3lzdGVtcy5iZT4uCisqLworCisvKiBXaGF0IGlzIHdoYXQsIGFuZCB3aGF0IGlzIG5vdD8KKworICAgVGhpcyBkZWNvZGVyIHN0YXJ0cyB3aXRoIGFuIGlucHV0IHN0cmVhbSwgdGhhdCBpcyBlc3NlbnRpYWxseSB0aGUgSnBlZ0ludGVyY2hhbmdlRm9ybWF0CisgICBzdHJlYW0sIGlmIGFueSwgZm9sbG93ZWQgYnkgdGhlIHN0cmlsZSBkYXRhLCBpZiBhbnkuIFRoaXMgc3RyZWFtIGlzIHJlYWQgaW4KKyAgIE9KUEVHUmVhZEJ5dGUgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zLgorCisgICBJdCBhbmFseXplcyB0aGUgc3RhcnQgb2YgdGhpcyBzdHJlYW0sIHVudGlsIGl0IGVuY291bnRlcnMgbm9uLW1hcmtlciBkYXRhLCBpLmUuCisgICBjb21wcmVzc2VkIGltYWdlIGRhdGEuIFNvbWUgb2YgdGhlIGhlYWRlciBtYXJrZXJzIGl0IHNlZXMgaGF2ZSBubyBhY3R1YWwgY29udGVudCwKKyAgIGxpa2UgdGhlIFNPSSBtYXJrZXIsIGFuZCBBUFAvQ09NIG1hcmtlcnMgdGhhdCByZWFsbHkgc2hvdWxkbid0IGV2ZW4gYmUgdGhlcmUuIFNvbWUKKyAgIG90aGVyIG1hcmtlcnMgZG8gaGF2ZSBjb250ZW50LCBhbmQgdGhlIHZhbHVhYmxlIGJpdHMgYW5kIHBpZWNlcyBvZiBpbmZvcm1hdGlvbgorICAgaW4gdGhlc2UgbWFya2VycyBhcmUgc2F2ZWQsIGNoZWNraW5nIGFsbCB0byB2ZXJpZnkgdGhhdCB0aGUgc3RyZWFtIGlzIG1vcmUgb3IKKyAgIGxlc3Mgd2l0aGluIGV4cGVjdGVkIGJvdW5kcy4gVGhpcyBoYXBwZW5zIGluc2lkZSB0aGUgT0pQRUdSZWFkSGVhZGVySW5mb1NlY1N0cmVhbVh4eAorICAgZnVuY3Rpb25zLgorCisgICBTb21lIE9KUEVHIGltYWdlcnkgY29udGFpbnMgbm8gdmFsaWQgSlBFRyBoZWFkZXIgbWFya2Vycy4gVGhpcyBzaXR1YXRpb24gaXMgcGlja2VkCisgICB1cCBvbiBpZiB3ZSd2ZSBzZWVuIG5vIFNPRiBtYXJrZXIgd2hlbiB3ZSdyZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGNvbXByZXNzZWQgaW1hZ2UKKyAgIGRhdGEuIEluIHRoaXMgY2FzZSwgdGhlIHRhYmxlcyBhcmUgcmVhZCBmcm9tIEpwZWdYeHhUYWJsZXMgdGFncywgYW5kIHRoZSBvdGhlcgorICAgYml0cyBhbmQgcGllY2VzIG9mIGluZm9ybWF0aW9uIGlzIGluaXRpYWxpemVkIHRvIGl0cyBtb3N0IGJhc2ljIHZhbHVlLiBUaGlzIGlzCisgICBpbXBsZW1lbnRlZCBpbiB0aGUgT0pQRUdSZWFkSGVhZGVySW5mb1NlY1RhYmxlc1h4eCBmdW5jdGlvbnMuCisKKyAgIFdoZW4gdGhpcyBpcyBjb21wbGV0ZSwgYSBnb29kIGFuZCB2YWxpZCBKUEVHIGhlYWRlciBjYW4gYmUgYXNzZW1ibGVkLCBhbmQgdGhpcyBpcworICAgcGFzc2VkIHRocm91Z2ggdG8gTGliSnBlZy4gV2hlbiB0aGF0J3MgZG9uZSwgdGhlIHJlbWFpbmRlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBpLmUuCisgICB0aGUgY29tcHJlc3NlZCBpbWFnZSBkYXRhLCBjYW4gYmUgcGFzc2VkIHRocm91Z2ggdW5jaGFuZ2VkLiBUaGlzIGlzIGRvbmUgaW4KKyAgIE9KUEVHV3JpdGVTdHJlYW0gZnVuY3Rpb25zLgorCisgICBMaWJUaWZmIHJpZ2h0bHkgZXhwZWN0cyB0byBrbm93IHRoZSBzdWJzYW1wbGluZyB2YWx1ZXMgYmVmb3JlIGRlY29tcHJlc3Npb24uIEp1c3QgbGlrZQorICAgaW4gbmV3LXN0eWxlIEpQRUctaW4tVElGRiwgdGhvdWdoLCBvciBldmVuIG1vcmUgc28sIGFjdHVhbGx5LCB0aGUgWUNiQ3JzdWJzYW1wbGluZworICAgdGFnIGlzIG5vdG9yaW91c2x5IHVucmVsaWFibGUuIFRvIGNvcnJlY3QgdGhlc2UgdGFnIHZhbHVlcyB3aXRoIHRoZSBvbmVzIGluc2lkZQorICAgdGhlIEpQRUcgc3RyZWFtLCB0aGUgZmlyc3QgcGFydCBvZiB0aGUgaW5wdXQgc3RyZWFtIGlzIHByZS1zY2FubmVkIGluCisgICBPSlBFR1N1YnNhbXBsaW5nQ29ycmVjdCwgbWFraW5nIG5vIG5vdGUgb2YgYW55IG90aGVyIGRhdGEsIHJlcG9ydGluZyBubyB3YXJuaW5ncworICAgb3IgZXJyb3JzLCB1cCB0byB0aGUgcG9pbnQgd2hlcmUgZWl0aGVyIHRoZXNlIHZhbHVlcyBhcmUgcmVhZCwgb3IgaXQncyBjbGVhciB0aGV5CisgICBhcmVuJ3QgdGhlcmUuIFRoaXMgbWVhbnMgdGhhdCBzb21lIG9mIHRoZSBkYXRhIGlzIHJlYWQgdHdpY2UsIGJ1dCB3ZSBmZWVsIHNwZWVkCisgICBpbiBjb3JyZWN0aW5nIHRoZXNlIHZhbHVlcyBpcyBpbXBvcnRhbnQgZW5vdWdoIHRvIHdhcnJhbnQgdGhpcyBzYWNyaWZpY2UuIEFsbHRob3VnaAorICAgdGhlcmUgaXMgY3VycmVudGx5IG5vIGRlZmluZSBvciBvdGhlciBjb25maWd1cmF0aW9uIG1lY2hhbmlzbSB0byBkaXNhYmxlIHRoaXMgYmVoYXZpb3VyLAorICAgdGhlIGFjdHVhbCBoZWFkZXIgc2Nhbm5pbmcgaXMgYnVpbGQgdG8gcm9idXN0bHkgcmVzcG9uZCB3aXRoIGVycm9yIHJlcG9ydCBpZiBpdAorICAgc2hvdWxkIGVuY291bnRlciBhbiB1bmNvcnJlY3RlZCBtaXNtYXRjaCBvZiBzdWJzYW1wbGluZyB2YWx1ZXMuIFNlZQorICAgT0pQRUdSZWFkSGVhZGVySW5mb1NlY1N0cmVhbVNvZi4KKworICAgVGhlIHJlc3RhcnQgaW50ZXJ2YWwgYW5kIHJlc3RhcnQgbWFya2VycyBhcmUgdGhlIG1vc3QgdHJpY2t5IHBhcnQuLi4gVGhlIHJlc3RhcnQKKyAgIGludGVydmFsIGNhbiBiZSBzcGVjaWZpZWQgaW4gYSB0YWcuIEl0IGNhbiBhbHNvIGJlIHNldCBpbnNpZGUgdGhlIGlucHV0IEpQRUcgc3RyZWFtLgorICAgSXQgY2FuIGJlIHVzZWQgaW5zaWRlIHRoZSBpbnB1dCBKUEVHIHN0cmVhbS4gSWYgcmVhZGluZyBmcm9tIHN0cmlsZSBkYXRhLCB3ZSd2ZQorICAgY29uc2lzdGVubHkgZGlzY292ZXJlZCB0aGUgbmVlZCB0byBpbnNlcnQgcmVzdGFydCBtYXJrZXJzIGluIGJldHdlZW4gdGhlIGRpZmZlcmVudAorICAgc3RyaWxlcywgYXMgaXMgYWxzbyBwcm9iYWJseSB0aGUgbW9zdCBsaWtlbHkgaW50ZXJwcmV0YXRpb24gb2YgdGhlIG9yaWdpbmFsIFRJRkYgNi4wCisgICBzcGVjaWZpY2F0aW9uLiBXaXRoIGFsbCB0aGlzIHNldHRpbmcgb2YgaW50ZXJ2YWwsIGFuZCBhY3R1YWwgdXNlIG9mIG1hcmtlcnMgdGhhdCBpcyBub3QKKyAgIHByZWRpY3RhYmxlIGF0IHRoZSB0aW1lIG9mIHZhbGlkIEpQRUcgaGVhZGVyIGFzc2VtYmx5LCB0aGUgcmVzdGFydCB0aGluZyBtYXkgdHVybgorICAgb3V0IHRoZSBBY2hpbGxlcyBoZWVsIG9mIHRoaXMgaW1wbGVtZW50YXRpb24uIEZvcnR1bmF0ZWx5LCBtb3N0IE9KUEVHIHdyaXRlciB2ZW5kb3JzCisgICBzdWNjZWVkIGluIHJlYWRpbmcgYmFjayB3aGF0IHRoZXkgd3JpdGUsIHdoaWNoIG1heSBiZSB0aGUgcmVhc29uIHdoeSB3ZSd2ZSBiZWVuIGFibGUKKyAgIHRvIGRpc2NvdmVyIHdheXMgdGhhdCBzZWVtIHRvIHdvcmsuCisKKyAgIFNvbWUgc3BlY2lhbCBwcm92aXNpb24gaXMgbWFkZSBmb3IgcGxhbmFyY29uZmlnIHNlcGFyYXRlIE9KUEVHIGZpbGVzLiBUaGVzZSBzZWVtCisgICB0byBjb25zaXN0ZW50bHkgY29udGFpbiBoZWFkZXIgaW5mbywgYSBTT1MgbWFya2VyLCBhIHBsYW5lLCBTT1MgbWFya2VyLCBwbGFuZSwgU09TLAorICAgYW5kIHBsYW5lLiBUaGlzIG1heSBvciBtYXkgbm90IGJlIGEgdmFsaWQgSlBFRyBjb25maWd1cmF0aW9uLCB3ZSBkb24ndCBrbm93IGFuZCBkb24ndAorICAgY2FyZS4gV2Ugd2FudCBMaWJUaWZmIHRvIGJlIGFibGUgdG8gYWNjZXNzIHRoZSBwbGFuZXMgaW5kaXZpZHVhbGx5LCB3aXRob3V0IGh1Z2UKKyAgIGJ1ZmZlcmluZyBpbnNpZGUgTGliSnBlZywgYW55d2F5LiBTbyB3ZSBjb21wb3NlIGhlYWRlcnMgdG8gZmVlZCB0byBMaWJKcGVnLCBpbiB0aGlzCisgICBjYXNlLCB0aGF0IGFsbG93IHVzIHRvIHBhc3MgYSBzaW5nbGUgcGxhbmUgc3VjaCB0aGF0IExpYkpwZWcgc2VlcyBhIHZhbGlkCisgICBzaW5nbGUtY2hhbm5lbCBKUEVHIHN0cmVhbS4gTG9jYXRpbmcgc3Vic2VxdWVudCBTT1MgbWFya2VycywgYW5kIHRodXMgc3Vic2VxdWVudAorICAgcGxhbmVzLCBpcyBkb25lIGluc2lkZSBPSlBFR1JlYWRTZWNvbmRhcnlTb3MuCisKKyAgIFRoZSBiZW5lZml0IG9mIHRoZSBzY2hlbWUgaXMuLi4gdGhhdCBpdCB3b3JrcywgYmFzaWNhbGx5LiBXZSBrbm93IG9mIG5vIG90aGVyIHRoYXQKKyAgIGRvZXMuIEl0IHdvcmtzIHdpdGhvdXQgY2hlY2tpbmcgc29mdHdhcmUgdGFnLCBvciBvdGhlcndpc2UgZ29pbmcgYWJvdXQgdGhpbmdzIGluIGFuCisgICBPSlBFRyBmbGF2b3Igc3BlY2lmaWMgbWFubmVyLiBJbnN0ZWFkLCBpdCBpcyBhIHNpbmdsZSBzY2hlbWUsIHRoYXQgY292ZXJzIHRoZSBjYXNlcworICAgd2l0aCBhbmQgd2l0aG91dCBKcGVnSW50ZXJjaGFuZ2VGb3JtYXQsIHdpdGggYW5kIHdpdGhvdXQgc3RyaWxlcywgd2l0aCBwYXJ0IG9mCisgICB0aGUgaGVhZGVyIGluIEpwZWdJbnRlcmNoYW5nZUZvcm1hdCBhbmQgcmVtYWluZGVyIGluIGZpcnN0IHN0cmlsZSwgZXRjLiBJdCBpcyBmb3JnaXZpbmcKKyAgIGFuZCByb2J1c3QsIG1heSBsaWtlbHkgd29yayB3aXRoIE9KUEVHIGZsYXZvcnMgd2UndmUgbm90IHNlZW4geWV0LCBhbmQgbWFrZXMgbW9zdCBvdXQKKyAgIG9mIHRoZSBkYXRhLgorCisgICBBbm90aGVyIG5pY2Ugc2lkZS1lZmZlY3QgaXMgdGhhdCBhIGNvbXBsZXRlIEpQRUcgc2luZ2xlIHZhbGlkIHN0cmVhbSBpcyBidWlsZCBpZgorICAgcGxhbmFyY29uZmlnIGlzIG5vdCBzZXBhcmF0ZSAodmFzdCBtYWpvcml0eSkuIFdlIG1heSBvbmUgZGF5IHVzZSB0aGF0IHRvIGJ1aWxkCisgICBjb252ZXJ0ZXJzIHRvIEpQRUcsIGFuZC9vciB0byBuZXctc3R5bGUgSlBFRyBjb21wcmVzc2lvbiBpbnNpZGUgVElGRi4KKworICAgQSBkaXNzYWR2YW50YWdlIGlzIHRoZSBsYWNrIG9mIHJhbmRvbSBhY2Nlc3MgdG8gdGhlIGluZGl2aWR1YWwgc3RyaWxlcy4gVGhpcyBpcyB0aGUKKyAgIHJlYXNvbiBmb3IgbXVjaCBvZiB0aGUgY29tcGxpY2F0ZWQgcmVzdGFydC1hbmQtcG9zaXRpb24gc3R1ZmYgaW5zaWRlIE9KUEVHUHJlRGVjb2RlLgorICAgQXBwbGljYXRpb25zIHdvdWxkIGRvIHdlbGwgYWNjZXNzaW5nIGFsbCBzdHJpbGVzIGluIG9yZGVyLCBhcyB0aGlzIHdpbGwgcmVzdWx0IGluCisgICBhIHNpbmdsZSBzZXF1ZW50aWFsIHNjYW4gb2YgdGhlIGlucHV0IHN0cmVhbSwgYW5kIG5vIHJlc3RhcnRpbmcgb2YgTGliSnBlZyBkZWNvZGluZworICAgc2Vzc2lvbi4KKyovCisKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2RlZmluZSBWQ19FWFRSQUxFQU4KKworI2luY2x1ZGUgInRpZmZpb3AuaCIKKyNpZmRlZiBPSlBFR19TVVBQT1JUCisKKy8qIENvbmZpZ3VyYXRpb24gZGVmaW5lcyBoZXJlIGFyZToKKyAqIEpQRUdfRU5DQVBfRVhURVJOQUw6IFRoZSBub3JtYWwgd2F5IHRvIGNhbGwgbGlianBlZywgdXNlcyBsb25nanVtcC4gSW4gc29tZSBlbnZpcm9ubWVudHMsCisgKiAJbGlrZSBlZyBMaWJUaWZmRGVscGhpLCB0aGlzIGlzIG5vdCBwb3NzaWJsZS4gRm9yIHRoaXMgcmVhc29uLCB0aGUgYWN0dWFsIGNhbGxzIHRvCisgKiAJbGlianBlZywgd2l0aCBsb25nanVtcCBzdHVmZiwgYXJlIGVuY2Fwc3VsYXRlZCBpbiBkZWRpY2F0ZWQgZnVuY3Rpb25zLiBXaGVuCisgKiAJSlBFR19FTkNBUF9FWFRFUk5BTCBpcyBkZWZpbmVkLCB0aGVzZSBlbmNhcHN1bGF0aW5nIGZ1bmN0aW9ucyBhcmUgZGVjbGFyZWQgZXh0ZXJuYWwKKyAqIAl0byB0aGlzIHVuaXQsIGFuZCBjYW4gYmUgZGVmaW5lZCBlbHNld2hlcmUgdG8gdXNlIHN0dWZmIG90aGVyIHRoZW4gbG9uZ2p1bXAuCisgKiAJVGhlIGRlZmF1bHQgbW9kZSwgd2l0aG91dCBKUEVHX0VOQ0FQX0VYVEVSTkFMLCBpbXBsZW1lbnRzIHRoZSBjYWxsIGVuY2Fwc3VsYXRvcnMKKyAqIAloZXJlLCBpbnRlcm5hbGx5LCB3aXRoIG5vcm1hbCBsb25nanVtcC4KKyAqIFNFVEpNUCwgTE9OR0pNUCwgSk1QX0JVRjogT24gc29tZSBtYWNoaW5lcy9lbnZpcm9ubWVudHMgYSBsb25nanVtcCBlcXVpdmFsZW50IGlzCisgKiAJY29udmluaWVudGx5IGF2YWlsYWJsZSwgYnV0IHN0aWxsIGl0IG1heSBiZSB3b3J0aHdoaWxlIHRvIHVzZSBfc2V0am1wIG9yIHNpZ3NldGptcAorICogCWluIHBsYWNlIG9mIHBsYWluIHNldGptcC4gVGhlc2UgbWFjcm9zIHdpbGwgbWFrZSBpdCBlYXNpZXIuIEl0IGlzIHVzZWxlc3MKKyAqIAl0byBmaWRkbGUgd2l0aCB0aGVzZSBpZiB5b3UgZGVmaW5lIEpQRUdfRU5DQVBfRVhURVJOQUwuCisgKiBPSlBFR19CVUZGRVI6IERlZmluZSB0aGUgc2l6ZSBvZiB0aGUgZGVzaXJlZCBidWZmZXIgaGVyZS4gU2hvdWxkIGJlIHNtYWxsIGVub3VnaCBzbyBhcyB0byBndWFyYW50ZWUKKyAqIAlpbnN0YW50IHByb2Nlc3NpbmcsIG9wdGltYWwgc3RyZWFtaW5nIGFuZCBvcHRpbWFsIHVzZSBvZiBwcm9jZXNzb3IgY2FjaGUsIGJ1dCBhbHNvIGJpZworICogCWVub3VnaCBzbyBhcyB0byBub3QgcmVzdWx0IGluIHNpZ25pZmljYW50IGNhbGwgb3ZlcmhlYWQuIEl0IHNob3VsZCBiZSBhdCBsZWFzdCBhIGZldworICogCWJ5dGVzIHRvIGFjY29tbW9kYXRlIHNvbWUgc3RydWN0dXJlcyAodGhpcyBpcyB2ZXJpZmllZCBpbiBhc3NlcnRzKSwgYnV0IGl0IHdvdWxkIG5vdCBiZQorICogCXNlbnNpYmxlIHRvIG1ha2UgaXQgdGhpcyBzbWFsbCBhbnl3YXksIGFuZCBpdCBzaG91bGQgYmUgYXQgbW9zdCA2NEsgc2luY2UgaXQgaXMgaW5kZXhlZAorICogCXdpdGggdWludDE2LiBXZSByZWNvbW1lbmQgMksuCisgKiBFR1lQVElBTldBTEs6IFlvdSBjb3VsZCBhbHNvIGRlZmluZSBFR1lQVElBTldBTEsgaGVyZSwgYnV0IGl0IGlzIG5vdCB1c2VkIGFueXdoZXJlIGFuZCBoYXMKKyAqIAlhYnNvbHV0ZWx5IG5vIGVmZmVjdC4gVGhhdCBpcyB3aHkgbW9zdCBwZW9wbGUgaW5zaXN0IHRoZSBFR1lQVElBTldBTEsgaXMgYSBiaXQgc2lsbHkuCisgKi8KKworLyogZGVmaW5lIExJQkpQRUdfRU5DQVBfRVhURVJOQUwgKi8KKyNkZWZpbmUgU0VUSk1QKGpidWYpIHNldGptcChqYnVmKQorI2RlZmluZSBMT05HSk1QKGpidWYsY29kZSkgbG9uZ2ptcChqYnVmLGNvZGUpCisjZGVmaW5lIEpNUF9CVUYgam1wX2J1ZgorI2RlZmluZSBPSlBFR19CVUZGRVIgMjA0OAorLyogZGVmaW5lIEVHWVBUSUFOV0FMSyAqLworCisjZGVmaW5lIEpQRUdfTUFSS0VSX1NPRjAgMHhDMAorI2RlZmluZSBKUEVHX01BUktFUl9TT0YxIDB4QzEKKyNkZWZpbmUgSlBFR19NQVJLRVJfU09GMyAweEMzCisjZGVmaW5lIEpQRUdfTUFSS0VSX0RIVCAweEM0CisjZGVmaW5lIEpQRUdfTUFSS0VSX1JTVDAgMFhEMAorI2RlZmluZSBKUEVHX01BUktFUl9TT0kgMHhEOAorI2RlZmluZSBKUEVHX01BUktFUl9FT0kgMHhEOQorI2RlZmluZSBKUEVHX01BUktFUl9TT1MgMHhEQQorI2RlZmluZSBKUEVHX01BUktFUl9EUVQgMHhEQgorI2RlZmluZSBKUEVHX01BUktFUl9EUkkgMHhERAorI2RlZmluZSBKUEVHX01BUktFUl9BUFAwIDB4RTAKKyNkZWZpbmUgSlBFR19NQVJLRVJfQ09NIDB4RkUKKworI2RlZmluZSBGSUVMRF9PSlBFR19KUEVHSU5URVJDSEFOR0VGT1JNQVQgKEZJRUxEX0NPREVDKzApCisjZGVmaW5lIEZJRUxEX09KUEVHX0pQRUdJTlRFUkNIQU5HRUZPUk1BVExFTkdUSCAoRklFTERfQ09ERUMrMSkKKyNkZWZpbmUgRklFTERfT0pQRUdfSlBFR1FUQUJMRVMgKEZJRUxEX0NPREVDKzIpCisjZGVmaW5lIEZJRUxEX09KUEVHX0pQRUdEQ1RBQkxFUyAoRklFTERfQ09ERUMrMykKKyNkZWZpbmUgRklFTERfT0pQRUdfSlBFR0FDVEFCTEVTIChGSUVMRF9DT0RFQys0KQorI2RlZmluZSBGSUVMRF9PSlBFR19KUEVHUFJPQyAoRklFTERfQ09ERUMrNSkKKyNkZWZpbmUgRklFTERfT0pQRUdfSlBFR1JFU1RBUlRJTlRFUlZBTCAoRklFTERfQ09ERUMrNikKKworc3RhdGljIGNvbnN0IFRJRkZGaWVsZCBvanBlZ0ZpZWxkc1tdID0geworCXtUSUZGVEFHX0pQRUdJRk9GRlNFVCwxLDEsVElGRl9MT05HOCwwLFRJRkZfU0VUR0VUX1VJTlQ2NCxUSUZGX1NFVEdFVF9VTkRFRklORUQsRklFTERfT0pQRUdfSlBFR0lOVEVSQ0hBTkdFRk9STUFULFRSVUUsRkFMU0UsIkpwZWdJbnRlcmNoYW5nZUZvcm1hdCIsTlVMTH0sCisJe1RJRkZUQUdfSlBFR0lGQllURUNPVU5ULDEsMSxUSUZGX0xPTkc4LDAsVElGRl9TRVRHRVRfVUlOVDY0LFRJRkZfU0VUR0VUX1VOREVGSU5FRCxGSUVMRF9PSlBFR19KUEVHSU5URVJDSEFOR0VGT1JNQVRMRU5HVEgsVFJVRSxGQUxTRSwiSnBlZ0ludGVyY2hhbmdlRm9ybWF0TGVuZ3RoIixOVUxMfSwKKwl7VElGRlRBR19KUEVHUVRBQkxFUyxUSUZGX1ZBUklBQkxFMixUSUZGX1ZBUklBQkxFMixUSUZGX0xPTkc4LDAsVElGRl9TRVRHRVRfQzMyX1VJTlQ2NCxUSUZGX1NFVEdFVF9VTkRFRklORUQsRklFTERfT0pQRUdfSlBFR1FUQUJMRVMsRkFMU0UsVFJVRSwiSnBlZ1FUYWJsZXMiLE5VTEx9LAorCXtUSUZGVEFHX0pQRUdEQ1RBQkxFUyxUSUZGX1ZBUklBQkxFMixUSUZGX1ZBUklBQkxFMixUSUZGX0xPTkc4LDAsVElGRl9TRVRHRVRfQzMyX1VJTlQ2NCxUSUZGX1NFVEdFVF9VTkRFRklORUQsRklFTERfT0pQRUdfSlBFR0RDVEFCTEVTLEZBTFNFLFRSVUUsIkpwZWdEY1RhYmxlcyIsTlVMTH0sCisJe1RJRkZUQUdfSlBFR0FDVEFCTEVTLFRJRkZfVkFSSUFCTEUyLFRJRkZfVkFSSUFCTEUyLFRJRkZfTE9ORzgsMCxUSUZGX1NFVEdFVF9DMzJfVUlOVDY0LFRJRkZfU0VUR0VUX1VOREVGSU5FRCxGSUVMRF9PSlBFR19KUEVHQUNUQUJMRVMsRkFMU0UsVFJVRSwiSnBlZ0FjVGFibGVzIixOVUxMfSwKKwl7VElGRlRBR19KUEVHUFJPQywxLDEsVElGRl9TSE9SVCwwLFRJRkZfU0VUR0VUX1VJTlQxNixUSUZGX1NFVEdFVF9VTkRFRklORUQsRklFTERfT0pQRUdfSlBFR1BST0MsRkFMU0UsRkFMU0UsIkpwZWdQcm9jIixOVUxMfSwKKwl7VElGRlRBR19KUEVHUkVTVEFSVElOVEVSVkFMLDEsMSxUSUZGX1NIT1JULDAsVElGRl9TRVRHRVRfVUlOVDE2LFRJRkZfU0VUR0VUX1VOREVGSU5FRCxGSUVMRF9PSlBFR19KUEVHUkVTVEFSVElOVEVSVkFMLEZBTFNFLEZBTFNFLCJKcGVnUmVzdGFydEludGVydmFsIixOVUxMfSwKK307CisKKyNpZm5kZWYgTElCSlBFR19FTkNBUF9FWFRFUk5BTAorI2luY2x1ZGUgPHNldGptcC5oPgorI2VuZGlmCisKKy8qIFdlIHVuZGVmaW5lIEZBUiB0byBhdm9pZCBjb25mbGljdCB3aXRoIEpQRUcgZGVmaW5pdGlvbiAqLworCisjaWZkZWYgRkFSCisjdW5kZWYgRkFSCisjZW5kaWYKKworLyoKKyAgTGlianBlZydzIGptb3JlY2ZnLmggZGVmaW5lcyBJTlQxNiBhbmQgSU5UMzIsIGJ1dCBvbmx5IGlmIFhNRF9IIGlzCisgIG5vdCBkZWZpbmVkLiAgVW5mb3J0dW5hdGVseSwgdGhlIE1pbkdXIGFuZCBCb3JsYW5kIGNvbXBpbGVycyBpbmNsdWRlCisgIGEgdHlwZWRlZiBmb3IgSU5UMzIsIHdoaWNoIGNhdXNlcyBhIGNvbmZsaWN0LiAgTVNWQyBkb2VzIG5vdCBpbmNsdWRlCisgIGEgY29uZmljdGluZyB0eXBlZGVmIGdpdmVuIHRoZSBoZWFkZXJzIHdoaWNoIGFyZSBpbmNsdWRlZC4KKyovCisjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IGRlZmluZWQoX19NSU5HVzMyX18pCisjIGRlZmluZSBYTURfSCAxCisjZW5kaWYKKworLyogRGVmaW5lICJib29sZWFuIiBhcyB1bnNpZ25lZCBjaGFyLCBub3QgaW50LCBwZXIgV2luZG93cyBjdXN0b20uICovCisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmICFkZWZpbmVkKF9fTUlOR1czMl9fKQorIyBpZm5kZWYgX19SUENORFJfSF9fICAgICAgICAgICAgLyogZG9uJ3QgY29uZmxpY3QgaWYgcnBjbmRyLmggYWxyZWFkeSByZWFkICovCisgICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgYm9vbGVhbjsKKyMgZW5kaWYKKyMgZGVmaW5lIEhBVkVfQk9PTEVBTiAgICAgICAgICAgIC8qIHByZXZlbnQgam1vcmVjZmcuaCBmcm9tIHJlZGVmaW5pbmcgaXQgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChVU0VfU1lTVEVNX0xJQkpQRUcpCisjaW5jbHVkZSA8amVycm9yLmg+CisjaW5jbHVkZSA8anBlZ2xpYi5oPgorI2VsaWYgZGVmaW5lZChVU0VfTElCSlBFR19UVVJCTykKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9saWJqcGVnX3R1cmJvL2plcnJvci5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xpYmpwZWdfdHVyYm8vanBlZ2xpYi5oIgorI2Vsc2UKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9saWJqcGVnL2plcnJvci5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xpYmpwZWcvanBlZ2xpYi5oIgorI2VuZGlmCisKKwordHlwZWRlZiBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IganBlZ19lcnJvcl9tZ3I7Cit0eXBlZGVmIHN0cnVjdCBqcGVnX2NvbW1vbl9zdHJ1Y3QganBlZ19jb21tb25fc3RydWN0OwordHlwZWRlZiBzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0OwordHlwZWRlZiBzdHJ1Y3QganBlZ19zb3VyY2VfbWdyIGpwZWdfc291cmNlX21ncjsKKwordHlwZWRlZiBlbnVtIHsKKwlvc2lic05vdFNldFlldCwKKwlvc2lic0pwZWdJbnRlcmNoYW5nZUZvcm1hdCwKKwlvc2lic1N0cmlsZSwKKwlvc2lic0VvZgorfSBPSlBFR1N0YXRlSW5CdWZmZXJTb3VyY2U7CisKK3R5cGVkZWYgZW51bSB7CisJb3Nvc1NvaSwKKwlvc29zUVRhYmxlMCxvc29zUVRhYmxlMSxvc29zUVRhYmxlMixvc29zUVRhYmxlMywKKwlvc29zRGNUYWJsZTAsb3Nvc0RjVGFibGUxLG9zb3NEY1RhYmxlMixvc29zRGNUYWJsZTMsCisJb3Nvc0FjVGFibGUwLG9zb3NBY1RhYmxlMSxvc29zQWNUYWJsZTIsb3Nvc0FjVGFibGUzLAorCW9zb3NEcmksCisJb3Nvc1NvZiwKKwlvc29zU29zLAorCW9zb3NDb21wcmVzc2VkLAorCW9zb3NSc3QsCisJb3Nvc0VvaQorfSBPSlBFR1N0YXRlT3V0U3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlUSUZGKiB0aWY7CisJI2lmbmRlZiBMSUJKUEVHX0VOQ0FQX0VYVEVSTkFMCisJSk1QX0JVRiBleGl0X2ptcGJ1ZjsKKwkjZW5kaWYKKwlUSUZGVkdldE1ldGhvZCB2Z2V0cGFyZW50OworCVRJRkZWU2V0TWV0aG9kIHZzZXRwYXJlbnQ7CisJVElGRlByaW50TWV0aG9kIHByaW50ZGlyOworCXVpbnQ2NCBmaWxlX3NpemU7CisJdWludDMyIGltYWdlX3dpZHRoOworCXVpbnQzMiBpbWFnZV9sZW5ndGg7CisJdWludDMyIHN0cmlsZV93aWR0aDsKKwl1aW50MzIgc3RyaWxlX2xlbmd0aDsKKwl1aW50MzIgc3RyaWxlX2xlbmd0aF90b3RhbDsKKwl1aW50OCBzYW1wbGVzX3Blcl9waXhlbDsKKwl1aW50OCBwbGFuZV9zYW1wbGVfb2Zmc2V0OworCXVpbnQ4IHNhbXBsZXNfcGVyX3BpeGVsX3Blcl9wbGFuZTsKKwl1aW50NjQganBlZ19pbnRlcmNoYW5nZV9mb3JtYXQ7CisJdWludDY0IGpwZWdfaW50ZXJjaGFuZ2VfZm9ybWF0X2xlbmd0aDsKKwl1aW50OCBqcGVnX3Byb2M7CisJdWludDggc3Vic2FtcGxpbmdjb3JyZWN0OworCXVpbnQ4IHN1YnNhbXBsaW5nY29ycmVjdF9kb25lOworCXVpbnQ4IHN1YnNhbXBsaW5nX3RhZzsKKwl1aW50OCBzdWJzYW1wbGluZ19ob3I7CisJdWludDggc3Vic2FtcGxpbmdfdmVyOworCXVpbnQ4IHN1YnNhbXBsaW5nX2ZvcmNlX2Rlc3Vic2FtcGxpbmdfaW5zaWRlX2RlY29tcHJlc3Npb247CisJdWludDggcXRhYmxlX29mZnNldF9jb3VudDsKKwl1aW50OCBkY3RhYmxlX29mZnNldF9jb3VudDsKKwl1aW50OCBhY3RhYmxlX29mZnNldF9jb3VudDsKKwl1aW50NjQgcXRhYmxlX29mZnNldFszXTsKKwl1aW50NjQgZGN0YWJsZV9vZmZzZXRbM107CisJdWludDY0IGFjdGFibGVfb2Zmc2V0WzNdOworCXVpbnQ4KiBxdGFibGVbNF07CisJdWludDgqIGRjdGFibGVbNF07CisJdWludDgqIGFjdGFibGVbNF07CisJdWludDE2IHJlc3RhcnRfaW50ZXJ2YWw7CisJdWludDggcmVzdGFydF9pbmRleDsKKwl1aW50OCBzb2ZfbG9nOworCXVpbnQ4IHNvZl9tYXJrZXJfaWQ7CisJdWludDMyIHNvZl94OworCXVpbnQzMiBzb2ZfeTsKKwl1aW50OCBzb2ZfY1szXTsKKwl1aW50OCBzb2ZfaHZbM107CisJdWludDggc29mX3RxWzNdOworCXVpbnQ4IHNvc19jc1szXTsKKwl1aW50OCBzb3NfdGRhWzNdOworCXN0cnVjdCB7CisJCXVpbnQ4IGxvZzsKKwkJT0pQRUdTdGF0ZUluQnVmZmVyU291cmNlIGluX2J1ZmZlcl9zb3VyY2U7CisJCXVpbnQzMiBpbl9idWZmZXJfbmV4dF9zdHJpbGU7CisJCXVpbnQ2NCBpbl9idWZmZXJfZmlsZV9wb3M7CisJCXVpbnQ2NCBpbl9idWZmZXJfZmlsZV90b2dvOworCX0gc29zX2VuZFszXTsKKwl1aW50OCByZWFkaGVhZGVyX2RvbmU7CisJdWludDggd3JpdGVoZWFkZXJfZG9uZTsKKwl1aW50MTYgd3JpdGVfY3Vyc2FtcGxlOworCXVpbnQzMiB3cml0ZV9jdXJzdHJpbGU7CisJdWludDggbGlianBlZ19zZXNzaW9uX2FjdGl2ZTsKKwl1aW50OCBsaWJqcGVnX2pwZWdfcXVlcnlfc3R5bGU7CisJanBlZ19lcnJvcl9tZ3IgbGlianBlZ19qcGVnX2Vycm9yX21ncjsKKwlqcGVnX2RlY29tcHJlc3Nfc3RydWN0IGxpYmpwZWdfanBlZ19kZWNvbXByZXNzX3N0cnVjdDsKKwlqcGVnX3NvdXJjZV9tZ3IgbGlianBlZ19qcGVnX3NvdXJjZV9tZ3I7CisJdWludDggc3Vic2FtcGxpbmdfY29udmVydF9sb2c7CisJdWludDMyIHN1YnNhbXBsaW5nX2NvbnZlcnRfeWxpbmVsZW47CisJdWludDMyIHN1YnNhbXBsaW5nX2NvbnZlcnRfeWxpbmVzOworCXVpbnQzMiBzdWJzYW1wbGluZ19jb252ZXJ0X2NsaW5lbGVuOworCXVpbnQzMiBzdWJzYW1wbGluZ19jb252ZXJ0X2NsaW5lczsKKwl1aW50MzIgc3Vic2FtcGxpbmdfY29udmVydF95YnVmbGVuOworCXVpbnQzMiBzdWJzYW1wbGluZ19jb252ZXJ0X2NidWZsZW47CisJdWludDMyIHN1YnNhbXBsaW5nX2NvbnZlcnRfeWNiY3JidWZsZW47CisJdWludDgqIHN1YnNhbXBsaW5nX2NvbnZlcnRfeWNiY3JidWY7CisJdWludDgqIHN1YnNhbXBsaW5nX2NvbnZlcnRfeWJ1ZjsKKwl1aW50OCogc3Vic2FtcGxpbmdfY29udmVydF9jYmJ1ZjsKKwl1aW50OCogc3Vic2FtcGxpbmdfY29udmVydF9jcmJ1ZjsKKwl1aW50MzIgc3Vic2FtcGxpbmdfY29udmVydF95Y2JjcmltYWdlbGVuOworCXVpbnQ4Kiogc3Vic2FtcGxpbmdfY29udmVydF95Y2JjcmltYWdlOworCXVpbnQzMiBzdWJzYW1wbGluZ19jb252ZXJ0X2NsaW5lbGVub3V0OworCXVpbnQzMiBzdWJzYW1wbGluZ19jb252ZXJ0X3N0YXRlOworCXVpbnQzMiBieXRlc19wZXJfbGluZTsgICAvKiBpZiB0aGUgY29kZWMgb3V0cHV0cyBzdWJzYW1wbGVkIGRhdGEsIGEgJ2xpbmUnIGluIGJ5dGVzX3Blcl9saW5lICovCisJdWludDMyIGxpbmVzX3Blcl9zdHJpbGU7IC8qIGFuZCBsaW5lc19wZXJfc3RyaWxlIG1lYW5zIHN1YnNhbXBsaW5nX3ZlciBkZXN1YnNhbXBsZWQgcm93cyAgICAgKi8KKwlPSlBFR1N0YXRlSW5CdWZmZXJTb3VyY2UgaW5fYnVmZmVyX3NvdXJjZTsKKwl1aW50MzIgaW5fYnVmZmVyX25leHRfc3RyaWxlOworCXVpbnQzMiBpbl9idWZmZXJfc3RyaWxlX2NvdW50OworCXVpbnQ2NCBpbl9idWZmZXJfZmlsZV9wb3M7CisJdWludDggaW5fYnVmZmVyX2ZpbGVfcG9zX2xvZzsKKwl1aW50NjQgaW5fYnVmZmVyX2ZpbGVfdG9nbzsKKwl1aW50MTYgaW5fYnVmZmVyX3RvZ287CisJdWludDgqIGluX2J1ZmZlcl9jdXI7CisJdWludDggaW5fYnVmZmVyW09KUEVHX0JVRkZFUl07CisJT0pQRUdTdGF0ZU91dFN0YXRlIG91dF9zdGF0ZTsKKwl1aW50OCBvdXRfYnVmZmVyW09KUEVHX0JVRkZFUl07CisJdWludDgqIHNraXBfYnVmZmVyOworfSBPSlBFR1N0YXRlOworCitzdGF0aWMgaW50IE9KUEVHVkdldEZpZWxkKFRJRkYqIHRpZiwgdWludDMyIHRhZywgdmFfbGlzdCBhcCk7CitzdGF0aWMgaW50IE9KUEVHVlNldEZpZWxkKFRJRkYqIHRpZiwgdWludDMyIHRhZywgdmFfbGlzdCBhcCk7CitzdGF0aWMgdm9pZCBPSlBFR1ByaW50RGlyKFRJRkYqIHRpZiwgRklMRSogZmQsIGxvbmcgZmxhZ3MpOworCitzdGF0aWMgaW50IE9KUEVHRml4dXBUYWdzKFRJRkYqIHRpZik7CitzdGF0aWMgaW50IE9KUEVHU2V0dXBEZWNvZGUoVElGRiogdGlmKTsKK3N0YXRpYyBpbnQgT0pQRUdQcmVEZWNvZGUoVElGRiogdGlmLCB1aW50MTYgcyk7CitzdGF0aWMgaW50IE9KUEVHUHJlRGVjb2RlU2tpcFJhdyhUSUZGKiB0aWYpOworc3RhdGljIGludCBPSlBFR1ByZURlY29kZVNraXBTY2FubGluZXMoVElGRiogdGlmKTsKK3N0YXRpYyBpbnQgT0pQRUdEZWNvZGUoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBjYywgdWludDE2IHMpOworc3RhdGljIGludCBPSlBFR0RlY29kZVJhdyhUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IGNjKTsKK3N0YXRpYyBpbnQgT0pQRUdEZWNvZGVTY2FubGluZXMoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBjYyk7CitzdGF0aWMgdm9pZCBPSlBFR1Bvc3REZWNvZGUoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBjYyk7CitzdGF0aWMgaW50IE9KUEVHU2V0dXBFbmNvZGUoVElGRiogdGlmKTsKK3N0YXRpYyBpbnQgT0pQRUdQcmVFbmNvZGUoVElGRiogdGlmLCB1aW50MTYgcyk7CitzdGF0aWMgaW50IE9KUEVHRW5jb2RlKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKTsKK3N0YXRpYyBpbnQgT0pQRUdQb3N0RW5jb2RlKFRJRkYqIHRpZik7CitzdGF0aWMgdm9pZCBPSlBFR0NsZWFudXAoVElGRiogdGlmKTsKKworc3RhdGljIHZvaWQgT0pQRUdTdWJzYW1wbGluZ0NvcnJlY3QoVElGRiogdGlmKTsKK3N0YXRpYyBpbnQgT0pQRUdSZWFkSGVhZGVySW5mbyhUSUZGKiB0aWYpOworc3RhdGljIGludCBPSlBFR1JlYWRTZWNvbmRhcnlTb3MoVElGRiogdGlmLCB1aW50MTYgcyk7CitzdGF0aWMgaW50IE9KUEVHV3JpdGVIZWFkZXJJbmZvKFRJRkYqIHRpZik7CitzdGF0aWMgdm9pZCBPSlBFR0xpYmpwZWdTZXNzaW9uQWJvcnQoVElGRiogdGlmKTsKKworc3RhdGljIGludCBPSlBFR1JlYWRIZWFkZXJJbmZvU2VjKFRJRkYqIHRpZik7CitzdGF0aWMgaW50IE9KUEVHUmVhZEhlYWRlckluZm9TZWNTdHJlYW1EcmkoVElGRiogdGlmKTsKK3N0YXRpYyBpbnQgT0pQRUdSZWFkSGVhZGVySW5mb1NlY1N0cmVhbURxdChUSUZGKiB0aWYpOworc3RhdGljIGludCBPSlBFR1JlYWRIZWFkZXJJbmZvU2VjU3RyZWFtRGh0KFRJRkYqIHRpZik7CitzdGF0aWMgaW50IE9KUEVHUmVhZEhlYWRlckluZm9TZWNTdHJlYW1Tb2YoVElGRiogdGlmLCB1aW50OCBtYXJrZXJfaWQpOworc3RhdGljIGludCBPSlBFR1JlYWRIZWFkZXJJbmZvU2VjU3RyZWFtU29zKFRJRkYqIHRpZik7CitzdGF0aWMgaW50IE9KUEVHUmVhZEhlYWRlckluZm9TZWNUYWJsZXNRVGFibGUoVElGRiogdGlmKTsKK3N0YXRpYyBpbnQgT0pQRUdSZWFkSGVhZGVySW5mb1NlY1RhYmxlc0RjVGFibGUoVElGRiogdGlmKTsKK3N0YXRpYyBpbnQgT0pQRUdSZWFkSGVhZGVySW5mb1NlY1RhYmxlc0FjVGFibGUoVElGRiogdGlmKTsKKworc3RhdGljIGludCBPSlBFR1JlYWRCdWZmZXJGaWxsKE9KUEVHU3RhdGUqIHNwKTsKK3N0YXRpYyBpbnQgT0pQRUdSZWFkQnl0ZShPSlBFR1N0YXRlKiBzcCwgdWludDgqIGJ5dGUpOworc3RhdGljIGludCBPSlBFR1JlYWRCeXRlUGVlayhPSlBFR1N0YXRlKiBzcCwgdWludDgqIGJ5dGUpOworc3RhdGljIHZvaWQgT0pQRUdSZWFkQnl0ZUFkdmFuY2UoT0pQRUdTdGF0ZSogc3ApOworc3RhdGljIGludCBPSlBFR1JlYWRXb3JkKE9KUEVHU3RhdGUqIHNwLCB1aW50MTYqIHdvcmQpOworc3RhdGljIGludCBPSlBFR1JlYWRCbG9jayhPSlBFR1N0YXRlKiBzcCwgdWludDE2IGxlbiwgdm9pZCogbWVtKTsKK3N0YXRpYyB2b2lkIE9KUEVHUmVhZFNraXAoT0pQRUdTdGF0ZSogc3AsIHVpbnQxNiBsZW4pOworCitzdGF0aWMgaW50IE9KUEVHV3JpdGVTdHJlYW0oVElGRiogdGlmLCB2b2lkKiogbWVtLCB1aW50MzIqIGxlbik7CitzdGF0aWMgdm9pZCBPSlBFR1dyaXRlU3RyZWFtU29pKFRJRkYqIHRpZiwgdm9pZCoqIG1lbSwgdWludDMyKiBsZW4pOworc3RhdGljIHZvaWQgT0pQRUdXcml0ZVN0cmVhbVFUYWJsZShUSUZGKiB0aWYsIHVpbnQ4IHRhYmxlX2luZGV4LCB2b2lkKiogbWVtLCB1aW50MzIqIGxlbik7CitzdGF0aWMgdm9pZCBPSlBFR1dyaXRlU3RyZWFtRGNUYWJsZShUSUZGKiB0aWYsIHVpbnQ4IHRhYmxlX2luZGV4LCB2b2lkKiogbWVtLCB1aW50MzIqIGxlbik7CitzdGF0aWMgdm9pZCBPSlBFR1dyaXRlU3RyZWFtQWNUYWJsZShUSUZGKiB0aWYsIHVpbnQ4IHRhYmxlX2luZGV4LCB2b2lkKiogbWVtLCB1aW50MzIqIGxlbik7CitzdGF0aWMgdm9pZCBPSlBFR1dyaXRlU3RyZWFtRHJpKFRJRkYqIHRpZiwgdm9pZCoqIG1lbSwgdWludDMyKiBsZW4pOworc3RhdGljIHZvaWQgT0pQRUdXcml0ZVN0cmVhbVNvZihUSUZGKiB0aWYsIHZvaWQqKiBtZW0sIHVpbnQzMiogbGVuKTsKK3N0YXRpYyB2b2lkIE9KUEVHV3JpdGVTdHJlYW1Tb3MoVElGRiogdGlmLCB2b2lkKiogbWVtLCB1aW50MzIqIGxlbik7CitzdGF0aWMgaW50IE9KUEVHV3JpdGVTdHJlYW1Db21wcmVzc2VkKFRJRkYqIHRpZiwgdm9pZCoqIG1lbSwgdWludDMyKiBsZW4pOworc3RhdGljIHZvaWQgT0pQRUdXcml0ZVN0cmVhbVJzdChUSUZGKiB0aWYsIHZvaWQqKiBtZW0sIHVpbnQzMiogbGVuKTsKK3N0YXRpYyB2b2lkIE9KUEVHV3JpdGVTdHJlYW1Fb2koVElGRiogdGlmLCB2b2lkKiogbWVtLCB1aW50MzIqIGxlbik7CisKKyNpZmRlZiBMSUJKUEVHX0VOQ0FQX0VYVEVSTkFMCitleHRlcm4gaW50IGpwZWdfY3JlYXRlX2RlY29tcHJlc3NfZW5jYXAoT0pQRUdTdGF0ZSogc3AsIGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNpbmZvKTsKK2V4dGVybiBpbnQganBlZ19yZWFkX2hlYWRlcl9lbmNhcChPSlBFR1N0YXRlKiBzcCwganBlZ19kZWNvbXByZXNzX3N0cnVjdCogY2luZm8sIHVpbnQ4IHJlcXVpcmVfaW1hZ2UpOworZXh0ZXJuIGludCBqcGVnX3N0YXJ0X2RlY29tcHJlc3NfZW5jYXAoT0pQRUdTdGF0ZSogc3AsIGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNpbmZvKTsKK2V4dGVybiBpbnQganBlZ19yZWFkX3NjYW5saW5lc19lbmNhcChPSlBFR1N0YXRlKiBzcCwganBlZ19kZWNvbXByZXNzX3N0cnVjdCogY2luZm8sIHZvaWQqIHNjYW5saW5lcywgdWludDMyIG1heF9saW5lcyk7CitleHRlcm4gaW50IGpwZWdfcmVhZF9yYXdfZGF0YV9lbmNhcChPSlBFR1N0YXRlKiBzcCwganBlZ19kZWNvbXByZXNzX3N0cnVjdCogY2luZm8sIHZvaWQqIGRhdGEsIHVpbnQzMiBtYXhfbGluZXMpOworZXh0ZXJuIHZvaWQganBlZ19lbmNhcF91bndpbmQoVElGRiogdGlmKTsKKyNlbHNlCitzdGF0aWMgaW50IGpwZWdfY3JlYXRlX2RlY29tcHJlc3NfZW5jYXAoT0pQRUdTdGF0ZSogc3AsIGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGopOworc3RhdGljIGludCBqcGVnX3JlYWRfaGVhZGVyX2VuY2FwKE9KUEVHU3RhdGUqIHNwLCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBjaW5mbywgdWludDggcmVxdWlyZV9pbWFnZSk7CitzdGF0aWMgaW50IGpwZWdfc3RhcnRfZGVjb21wcmVzc19lbmNhcChPSlBFR1N0YXRlKiBzcCwganBlZ19kZWNvbXByZXNzX3N0cnVjdCogY2luZm8pOworc3RhdGljIGludCBqcGVnX3JlYWRfc2NhbmxpbmVzX2VuY2FwKE9KUEVHU3RhdGUqIHNwLCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBjaW5mbywgdm9pZCogc2NhbmxpbmVzLCB1aW50MzIgbWF4X2xpbmVzKTsKK3N0YXRpYyBpbnQganBlZ19yZWFkX3Jhd19kYXRhX2VuY2FwKE9KUEVHU3RhdGUqIHNwLCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBjaW5mbywgdm9pZCogZGF0YSwgdWludDMyIG1heF9saW5lcyk7CitzdGF0aWMgdm9pZCBqcGVnX2VuY2FwX3Vud2luZChUSUZGKiB0aWYpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIE9KUEVHTGlianBlZ0pwZWdFcnJvck1nck91dHB1dE1lc3NhZ2UoanBlZ19jb21tb25fc3RydWN0KiBjaW5mbyk7CitzdGF0aWMgdm9pZCBPSlBFR0xpYmpwZWdKcGVnRXJyb3JNZ3JFcnJvckV4aXQoanBlZ19jb21tb25fc3RydWN0KiBjaW5mbyk7CitzdGF0aWMgdm9pZCBPSlBFR0xpYmpwZWdKcGVnU291cmNlTWdySW5pdFNvdXJjZShqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBjaW5mbyk7CitzdGF0aWMgYm9vbGVhbiBPSlBFR0xpYmpwZWdKcGVnU291cmNlTWdyRmlsbElucHV0QnVmZmVyKGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNpbmZvKTsKK3N0YXRpYyB2b2lkIE9KUEVHTGlianBlZ0pwZWdTb3VyY2VNZ3JTa2lwSW5wdXREYXRhKGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNpbmZvLCBsb25nIG51bV9ieXRlcyk7CitzdGF0aWMgYm9vbGVhbiBPSlBFR0xpYmpwZWdKcGVnU291cmNlTWdyUmVzeW5jVG9SZXN0YXJ0KGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNpbmZvLCBpbnQgZGVzaXJlZCk7CitzdGF0aWMgdm9pZCBPSlBFR0xpYmpwZWdKcGVnU291cmNlTWdyVGVybVNvdXJjZShqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBjaW5mbyk7CisKK2ludAorVElGRkluaXRPSlBFRyhUSUZGKiB0aWYsIGludCBzY2hlbWUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW109IlRJRkZJbml0T0pQRUciOworCU9KUEVHU3RhdGUqIHNwOworCisJYXNzZXJ0KHNjaGVtZT09Q09NUFJFU1NJT05fT0pQRUcpOworCisgICAgICAgIC8qCisJICogTWVyZ2UgY29kZWMtc3BlY2lmaWMgdGFnIGluZm9ybWF0aW9uLgorCSAqLworCWlmICghX1RJRkZNZXJnZUZpZWxkcyh0aWYsIG9qcGVnRmllbGRzLCBUSUZGQXJyYXlDb3VudChvanBlZ0ZpZWxkcykpKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCSAgICAiTWVyZ2luZyBPbGQgSlBFRyBjb2RlYy1zcGVjaWZpYyB0YWdzIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBzdGF0ZSBibG9jayAqLworCXNwPV9USUZGbWFsbG9jKHNpemVvZihPSlBFR1N0YXRlKSk7CisJaWYgKHNwPT1OVUxMKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJObyBzcGFjZSBmb3IgT0pQRUcgc3RhdGUgYmxvY2siKTsKKwkJcmV0dXJuKDApOworCX0KKwlfVElGRm1lbXNldChzcCwwLHNpemVvZihPSlBFR1N0YXRlKSk7CisJc3AtPnRpZj10aWY7CisJc3AtPmpwZWdfcHJvYz0xOworCXNwLT5zdWJzYW1wbGluZ19ob3I9MjsKKwlzcC0+c3Vic2FtcGxpbmdfdmVyPTI7CisJVElGRlNldEZpZWxkKHRpZixUSUZGVEFHX1lDQkNSU1VCU0FNUExJTkcsMiwyKTsKKwkvKiB0aWYgY29kZWMgbWV0aG9kcyAqLworCXRpZi0+dGlmX2ZpeHVwdGFncz1PSlBFR0ZpeHVwVGFnczsgIAorCXRpZi0+dGlmX3NldHVwZGVjb2RlPU9KUEVHU2V0dXBEZWNvZGU7CisJdGlmLT50aWZfcHJlZGVjb2RlPU9KUEVHUHJlRGVjb2RlOworCXRpZi0+dGlmX3Bvc3RkZWNvZGU9T0pQRUdQb3N0RGVjb2RlOyAgCisJdGlmLT50aWZfZGVjb2Rlcm93PU9KUEVHRGVjb2RlOyAgCisJdGlmLT50aWZfZGVjb2Rlc3RyaXA9T0pQRUdEZWNvZGU7ICAKKwl0aWYtPnRpZl9kZWNvZGV0aWxlPU9KUEVHRGVjb2RlOyAgCisJdGlmLT50aWZfc2V0dXBlbmNvZGU9T0pQRUdTZXR1cEVuY29kZTsKKwl0aWYtPnRpZl9wcmVlbmNvZGU9T0pQRUdQcmVFbmNvZGU7CisJdGlmLT50aWZfcG9zdGVuY29kZT1PSlBFR1Bvc3RFbmNvZGU7CisJdGlmLT50aWZfZW5jb2Rlcm93PU9KUEVHRW5jb2RlOyAgCisJdGlmLT50aWZfZW5jb2Rlc3RyaXA9T0pQRUdFbmNvZGU7ICAKKwl0aWYtPnRpZl9lbmNvZGV0aWxlPU9KUEVHRW5jb2RlOyAgCisJdGlmLT50aWZfY2xlYW51cD1PSlBFR0NsZWFudXA7CisJdGlmLT50aWZfZGF0YT0odWludDgqKXNwOworCS8qIHRpZiB0YWcgbWV0aG9kcyAqLworCXNwLT52Z2V0cGFyZW50PXRpZi0+dGlmX3RhZ21ldGhvZHMudmdldGZpZWxkOworCXRpZi0+dGlmX3RhZ21ldGhvZHMudmdldGZpZWxkPU9KUEVHVkdldEZpZWxkOworCXNwLT52c2V0cGFyZW50PXRpZi0+dGlmX3RhZ21ldGhvZHMudnNldGZpZWxkOworCXRpZi0+dGlmX3RhZ21ldGhvZHMudnNldGZpZWxkPU9KUEVHVlNldEZpZWxkOworCXNwLT5wcmludGRpcj10aWYtPnRpZl90YWdtZXRob2RzLnByaW50ZGlyOworCXRpZi0+dGlmX3RhZ21ldGhvZHMucHJpbnRkaXI9T0pQRUdQcmludERpcjsKKwkvKiBTb21lIE9KUEVHIGZpbGVzIGRvbid0IGhhdmUgc3RyaXAgb3IgdGlsZSBvZmZzZXRzIG9yIGJ5dGVjb3VudHMgdGFncy4KKwkgICBTb21lIG90aGVycyBkbywgYnV0IGhhdmUgdG90YWxseSBtZWFuaW5nbGVzcyBvciBjb3JydXB0IHZhbHVlcworCSAgIGluIHRoZXNlIHRhZ3MuIEluIHRoZXNlIGNhc2VzLCB0aGUgSnBlZ0ludGVyY2hhbmdlRm9ybWF0IHN0cmVhbSBpcworCSAgIHJlbGlhYmxlLiBJbiBhbnkgY2FzZSwgdGhpcyBkZWNvZGVyIHJlYWRzIHRoZSBjb21wcmVzc2VkIGRhdGEgaXRzZWxmLAorCSAgIGZyb20gdGhlIG1vc3QgcmVsaWFibGUgbG9jYXRpb25zLCBhbmQgd2UgbmVlZCB0byBub3RpZnkgZW5jYXBzdWxhdGluZworCSAgIExpYlRpZmYgbm90IHRvIHJlYWQgcmF3IHN0cmlwcyBvciB0aWxlcyBmb3IgdXMuICovCisJdGlmLT50aWZfZmxhZ3N8PVRJRkZfTk9SRUFEUkFXOworCXJldHVybigxKTsKK30KKworc3RhdGljIGludAorT0pQRUdWR2V0RmllbGQoVElGRiogdGlmLCB1aW50MzIgdGFnLCB2YV9saXN0IGFwKQoreworCU9KUEVHU3RhdGUqIHNwPShPSlBFR1N0YXRlKil0aWYtPnRpZl9kYXRhOworCXN3aXRjaCh0YWcpCisJeworCQljYXNlIFRJRkZUQUdfSlBFR0lGT0ZGU0VUOgorCQkJKnZhX2FyZyhhcCx1aW50NjQqKT0odWludDY0KXNwLT5qcGVnX2ludGVyY2hhbmdlX2Zvcm1hdDsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfSlBFR0lGQllURUNPVU5UOgorCQkJKnZhX2FyZyhhcCx1aW50NjQqKT0odWludDY0KXNwLT5qcGVnX2ludGVyY2hhbmdlX2Zvcm1hdF9sZW5ndGg7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX1lDQkNSU1VCU0FNUExJTkc6CisJCQlpZiAoc3AtPnN1YnNhbXBsaW5nY29ycmVjdF9kb25lPT0wKQorCQkJCU9KUEVHU3Vic2FtcGxpbmdDb3JyZWN0KHRpZik7CisJCQkqdmFfYXJnKGFwLHVpbnQxNiopPSh1aW50MTYpc3AtPnN1YnNhbXBsaW5nX2hvcjsKKwkJCSp2YV9hcmcoYXAsdWludDE2Kik9KHVpbnQxNilzcC0+c3Vic2FtcGxpbmdfdmVyOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19KUEVHUVRBQkxFUzoKKwkJCSp2YV9hcmcoYXAsdWludDMyKik9KHVpbnQzMilzcC0+cXRhYmxlX29mZnNldF9jb3VudDsKKwkJCSp2YV9hcmcoYXAsdm9pZCoqKT0odm9pZCopc3AtPnF0YWJsZV9vZmZzZXQ7IAorCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19KUEVHRENUQUJMRVM6CisJCQkqdmFfYXJnKGFwLHVpbnQzMiopPSh1aW50MzIpc3AtPmRjdGFibGVfb2Zmc2V0X2NvdW50OworCQkJKnZhX2FyZyhhcCx2b2lkKiopPSh2b2lkKilzcC0+ZGN0YWJsZV9vZmZzZXQ7ICAKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfSlBFR0FDVEFCTEVTOgorCQkJKnZhX2FyZyhhcCx1aW50MzIqKT0odWludDMyKXNwLT5hY3RhYmxlX29mZnNldF9jb3VudDsKKwkJCSp2YV9hcmcoYXAsdm9pZCoqKT0odm9pZCopc3AtPmFjdGFibGVfb2Zmc2V0OworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19KUEVHUFJPQzoKKwkJCSp2YV9hcmcoYXAsdWludDE2Kik9KHVpbnQxNilzcC0+anBlZ19wcm9jOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19KUEVHUkVTVEFSVElOVEVSVkFMOgorCQkJKnZhX2FyZyhhcCx1aW50MTYqKT1zcC0+cmVzdGFydF9pbnRlcnZhbDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuICgqc3AtPnZnZXRwYXJlbnQpKHRpZix0YWcsYXApOworCX0KKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW50CitPSlBFR1ZTZXRGaWVsZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcsIHZhX2xpc3QgYXApCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW109Ik9KUEVHVlNldEZpZWxkIjsKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwl1aW50MzIgbWE7CisJdWludDY0KiBtYjsKKwl1aW50MzIgbjsKKwljb25zdCBUSUZGRmllbGQqIGZpcDsKKworCXN3aXRjaCh0YWcpCisJeworCQljYXNlIFRJRkZUQUdfSlBFR0lGT0ZGU0VUOgorCQkJc3AtPmpwZWdfaW50ZXJjaGFuZ2VfZm9ybWF0PSh1aW50NjQpdmFfYXJnKGFwLHVpbnQ2NCk7CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX0pQRUdJRkJZVEVDT1VOVDoKKwkJCXNwLT5qcGVnX2ludGVyY2hhbmdlX2Zvcm1hdF9sZW5ndGg9KHVpbnQ2NCl2YV9hcmcoYXAsdWludDY0KTsKKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfWUNCQ1JTVUJTQU1QTElORzoKKwkJCXNwLT5zdWJzYW1wbGluZ190YWc9MTsKKwkJCXNwLT5zdWJzYW1wbGluZ19ob3I9KHVpbnQ4KXZhX2FyZyhhcCx1aW50MTZfdmFwKTsKKwkJCXNwLT5zdWJzYW1wbGluZ192ZXI9KHVpbnQ4KXZhX2FyZyhhcCx1aW50MTZfdmFwKTsKKwkJCXRpZi0+dGlmX2Rpci50ZF95Y2JjcnN1YnNhbXBsaW5nWzBdPXNwLT5zdWJzYW1wbGluZ19ob3I7CisJCQl0aWYtPnRpZl9kaXIudGRfeWNiY3JzdWJzYW1wbGluZ1sxXT1zcC0+c3Vic2FtcGxpbmdfdmVyOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19KUEVHUVRBQkxFUzoKKwkJCW1hPSh1aW50MzIpdmFfYXJnKGFwLHVpbnQzMik7CisJCQlpZiAobWEhPTApCisJCQl7CisJCQkJaWYgKG1hPjMpCisJCQkJeworCQkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkpwZWdRVGFibGVzIHRhZyBoYXMgaW5jb3JyZWN0IGNvdW50Iik7CisJCQkJCXJldHVybigwKTsKKwkJCQl9CisJCQkJc3AtPnF0YWJsZV9vZmZzZXRfY291bnQ9KHVpbnQ4KW1hOworCQkJCW1iPSh1aW50NjQqKXZhX2FyZyhhcCx1aW50NjQqKTsKKwkJCQlmb3IgKG49MDsgbjxtYTsgbisrKQorCQkJCQlzcC0+cXRhYmxlX29mZnNldFtuXT1tYltuXTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRJRkZUQUdfSlBFR0RDVEFCTEVTOgorCQkJbWE9KHVpbnQzMil2YV9hcmcoYXAsdWludDMyKTsKKwkJCWlmIChtYSE9MCkKKwkJCXsKKwkJCQlpZiAobWE+MykKKwkJCQl7CisJCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiSnBlZ0RjVGFibGVzIHRhZyBoYXMgaW5jb3JyZWN0IGNvdW50Iik7CisJCQkJCXJldHVybigwKTsKKwkJCQl9CisJCQkJc3AtPmRjdGFibGVfb2Zmc2V0X2NvdW50PSh1aW50OCltYTsKKwkJCQltYj0odWludDY0Kil2YV9hcmcoYXAsdWludDY0Kik7CisJCQkJZm9yIChuPTA7IG48bWE7IG4rKykKKwkJCQkJc3AtPmRjdGFibGVfb2Zmc2V0W25dPW1iW25dOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19KUEVHQUNUQUJMRVM6CisJCQltYT0odWludDMyKXZhX2FyZyhhcCx1aW50MzIpOworCQkJaWYgKG1hIT0wKQorCQkJeworCQkJCWlmIChtYT4zKQorCQkJCXsKKwkJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJKcGVnQWNUYWJsZXMgdGFnIGhhcyBpbmNvcnJlY3QgY291bnQiKTsKKwkJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCQlzcC0+YWN0YWJsZV9vZmZzZXRfY291bnQ9KHVpbnQ4KW1hOworCQkJCW1iPSh1aW50NjQqKXZhX2FyZyhhcCx1aW50NjQqKTsKKwkJCQlmb3IgKG49MDsgbjxtYTsgbisrKQorCQkJCQlzcC0+YWN0YWJsZV9vZmZzZXRbbl09bWJbbl07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUSUZGVEFHX0pQRUdQUk9DOgorCQkJc3AtPmpwZWdfcHJvYz0odWludDgpdmFfYXJnKGFwLHVpbnQxNl92YXApOworCQkJYnJlYWs7CisJCWNhc2UgVElGRlRBR19KUEVHUkVTVEFSVElOVEVSVkFMOgorCQkJc3AtPnJlc3RhcnRfaW50ZXJ2YWw9KHVpbnQxNil2YV9hcmcoYXAsdWludDE2X3ZhcCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAoKnNwLT52c2V0cGFyZW50KSh0aWYsdGFnLGFwKTsKKwl9CisJZmlwID0gVElGRkZpZWxkV2l0aFRhZyh0aWYsdGFnKTsKKwlpZiggZmlwID09IE5VTEwgKSAvKiBzaG91bGRuJ3QgaGFwcGVuICovCisJICAgIHJldHVybigwKTsKKwlUSUZGU2V0RmllbGRCaXQodGlmLGZpcC0+ZmllbGRfYml0KTsKKwl0aWYtPnRpZl9mbGFnc3w9VElGRl9ESVJUWURJUkVDVDsKKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyB2b2lkCitPSlBFR1ByaW50RGlyKFRJRkYqIHRpZiwgRklMRSogZmQsIGxvbmcgZmxhZ3MpCit7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJdWludDggbTsKKwkodm9pZClmbGFnczsKKwlhc3NlcnQoc3AhPU5VTEwpOworCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX09KUEVHX0pQRUdJTlRFUkNIQU5HRUZPUk1BVCkpCisJCWZwcmludGYoZmQsIiAgSnBlZ0ludGVyY2hhbmdlRm9ybWF0OiAiIFRJRkZfVUlOVDY0X0ZPUk1BVCAiXG4iLChUSUZGX1VJTlQ2NF9UKXNwLT5qcGVnX2ludGVyY2hhbmdlX2Zvcm1hdCk7ICAKKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9PSlBFR19KUEVHSU5URVJDSEFOR0VGT1JNQVRMRU5HVEgpKQorCQlmcHJpbnRmKGZkLCIgIEpwZWdJbnRlcmNoYW5nZUZvcm1hdExlbmd0aDogIiBUSUZGX1VJTlQ2NF9GT1JNQVQgIlxuIiwoVElGRl9VSU5UNjRfVClzcC0+anBlZ19pbnRlcmNoYW5nZV9mb3JtYXRfbGVuZ3RoKTsgIAorCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX09KUEVHX0pQRUdRVEFCTEVTKSkKKwl7CisJCWZwcmludGYoZmQsIiAgSnBlZ1FUYWJsZXM6Iik7CisJCWZvciAobT0wOyBtPHNwLT5xdGFibGVfb2Zmc2V0X2NvdW50OyBtKyspCisJCQlmcHJpbnRmKGZkLCIgIiBUSUZGX1VJTlQ2NF9GT1JNQVQsKFRJRkZfVUlOVDY0X1Qpc3AtPnF0YWJsZV9vZmZzZXRbbV0pOworCQlmcHJpbnRmKGZkLCJcbiIpOworCX0KKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9PSlBFR19KUEVHRENUQUJMRVMpKQorCXsKKwkJZnByaW50ZihmZCwiICBKcGVnRGNUYWJsZXM6Iik7CisJCWZvciAobT0wOyBtPHNwLT5kY3RhYmxlX29mZnNldF9jb3VudDsgbSsrKQorCQkJZnByaW50ZihmZCwiICIgVElGRl9VSU5UNjRfRk9STUFULChUSUZGX1VJTlQ2NF9UKXNwLT5kY3RhYmxlX29mZnNldFttXSk7CisJCWZwcmludGYoZmQsIlxuIik7CisJfQorCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX09KUEVHX0pQRUdBQ1RBQkxFUykpCisJeworCQlmcHJpbnRmKGZkLCIgIEpwZWdBY1RhYmxlczoiKTsKKwkJZm9yIChtPTA7IG08c3AtPmFjdGFibGVfb2Zmc2V0X2NvdW50OyBtKyspCisJCQlmcHJpbnRmKGZkLCIgIiBUSUZGX1VJTlQ2NF9GT1JNQVQsKFRJRkZfVUlOVDY0X1Qpc3AtPmFjdGFibGVfb2Zmc2V0W21dKTsKKwkJZnByaW50ZihmZCwiXG4iKTsKKwl9CisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfT0pQRUdfSlBFR1BST0MpKQorCQlmcHJpbnRmKGZkLCIgIEpwZWdQcm9jOiAldVxuIiwodW5zaWduZWQgaW50KXNwLT5qcGVnX3Byb2MpOworCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX09KUEVHX0pQRUdSRVNUQVJUSU5URVJWQUwpKQorCQlmcHJpbnRmKGZkLCIgIEpwZWdSZXN0YXJ0SW50ZXJ2YWw6ICV1XG4iLCh1bnNpZ25lZCBpbnQpc3AtPnJlc3RhcnRfaW50ZXJ2YWwpOworCWlmIChzcC0+cHJpbnRkaXIpCisJCSgqc3AtPnByaW50ZGlyKSh0aWYsIGZkLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQKK09KUEVHRml4dXBUYWdzKFRJRkYqIHRpZikKK3sKKwkodm9pZCkgdGlmOworCXJldHVybigxKTsKK30KKworc3RhdGljIGludAorT0pQRUdTZXR1cERlY29kZShUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW109Ik9KUEVHU2V0dXBEZWNvZGUiOworCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJEZXByZWNpYXRlZCBhbmQgdHJvdWJsZXNvbWUgb2xkLXN0eWxlIEpQRUcgY29tcHJlc3Npb24gbW9kZSwgcGxlYXNlIGNvbnZlcnQgdG8gbmV3LXN0eWxlIEpQRUcgY29tcHJlc3Npb24gYW5kIG5vdGlmeSB2ZW5kb3Igb2Ygd3JpdGluZyBzb2Z0d2FyZSIpOworCXJldHVybigxKTsKK30KKworc3RhdGljIGludAorT0pQRUdQcmVEZWNvZGUoVElGRiogdGlmLCB1aW50MTYgcykKK3sKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwl1aW50MzIgbTsKKwlpZiAoc3AtPnN1YnNhbXBsaW5nY29ycmVjdF9kb25lPT0wKQorCQlPSlBFR1N1YnNhbXBsaW5nQ29ycmVjdCh0aWYpOworCWlmIChzcC0+cmVhZGhlYWRlcl9kb25lPT0wKQorCXsKKwkJaWYgKE9KUEVHUmVhZEhlYWRlckluZm8odGlmKT09MCkKKwkJCXJldHVybigwKTsKKwl9CisJaWYgKHNwLT5zb3NfZW5kW3NdLmxvZz09MCkKKwl7CisJCWlmIChPSlBFR1JlYWRTZWNvbmRhcnlTb3ModGlmLHMpPT0wKQorCQkJcmV0dXJuKDApOworCX0KKwlpZiBpc1RpbGVkKHRpZikKKwkJbT10aWYtPnRpZl9jdXJ0aWxlOworCWVsc2UKKwkJbT10aWYtPnRpZl9jdXJzdHJpcDsKKwlpZiAoKHNwLT53cml0ZWhlYWRlcl9kb25lIT0wKSAmJiAoKHNwLT53cml0ZV9jdXJzYW1wbGUhPXMpIHx8IChzcC0+d3JpdGVfY3Vyc3RyaWxlPm0pKSkKKwl7CisJCWlmIChzcC0+bGlianBlZ19zZXNzaW9uX2FjdGl2ZSE9MCkKKwkJCU9KUEVHTGlianBlZ1Nlc3Npb25BYm9ydCh0aWYpOworCQlzcC0+d3JpdGVoZWFkZXJfZG9uZT0wOworCX0KKwlpZiAoc3AtPndyaXRlaGVhZGVyX2RvbmU9PTApCisJeworCQlzcC0+cGxhbmVfc2FtcGxlX29mZnNldD0odWludDgpczsKKwkJc3AtPndyaXRlX2N1cnNhbXBsZT1zOworCQlzcC0+d3JpdGVfY3Vyc3RyaWxlPXMqdGlmLT50aWZfZGlyLnRkX3N0cmlwc3BlcmltYWdlOworCQlpZiAoKHNwLT5pbl9idWZmZXJfZmlsZV9wb3NfbG9nPT0wKSB8fAorCQkgICAgKHNwLT5pbl9idWZmZXJfZmlsZV9wb3Mtc3AtPmluX2J1ZmZlcl90b2dvIT1zcC0+c29zX2VuZFtzXS5pbl9idWZmZXJfZmlsZV9wb3MpKQorCQl7CisJCQlzcC0+aW5fYnVmZmVyX3NvdXJjZT1zcC0+c29zX2VuZFtzXS5pbl9idWZmZXJfc291cmNlOworCQkJc3AtPmluX2J1ZmZlcl9uZXh0X3N0cmlsZT1zcC0+c29zX2VuZFtzXS5pbl9idWZmZXJfbmV4dF9zdHJpbGU7CisJCQlzcC0+aW5fYnVmZmVyX2ZpbGVfcG9zPXNwLT5zb3NfZW5kW3NdLmluX2J1ZmZlcl9maWxlX3BvczsKKwkJCXNwLT5pbl9idWZmZXJfZmlsZV9wb3NfbG9nPTA7CisJCQlzcC0+aW5fYnVmZmVyX2ZpbGVfdG9nbz1zcC0+c29zX2VuZFtzXS5pbl9idWZmZXJfZmlsZV90b2dvOworCQkJc3AtPmluX2J1ZmZlcl90b2dvPTA7CisJCQlzcC0+aW5fYnVmZmVyX2N1cj0wOworCQl9CisJCWlmIChPSlBFR1dyaXRlSGVhZGVySW5mbyh0aWYpPT0wKQorCQkJcmV0dXJuKDApOworCX0KKwl3aGlsZSAoc3AtPndyaXRlX2N1cnN0cmlsZTxtKSAgICAgICAgICAKKwl7CisJCWlmIChzcC0+bGlianBlZ19qcGVnX3F1ZXJ5X3N0eWxlPT0wKQorCQl7CisJCQlpZiAoT0pQRUdQcmVEZWNvZGVTa2lwUmF3KHRpZik9PTApCisJCQkJcmV0dXJuKDApOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKE9KUEVHUHJlRGVjb2RlU2tpcFNjYW5saW5lcyh0aWYpPT0wKQorCQkJCXJldHVybigwKTsKKwkJfQorCQlzcC0+d3JpdGVfY3Vyc3RyaWxlKys7CisJfQorCXJldHVybigxKTsKK30KKworc3RhdGljIGludAorT0pQRUdQcmVEZWNvZGVTa2lwUmF3KFRJRkYqIHRpZikKK3sKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwl1aW50MzIgbTsKKwltPXNwLT5saW5lc19wZXJfc3RyaWxlOworCWlmIChzcC0+c3Vic2FtcGxpbmdfY29udmVydF9zdGF0ZSE9MCkKKwl7CisJCWlmIChzcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZXMtc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfc3RhdGU+PW0pCisJCXsKKwkJCXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3N0YXRlKz1tOworCQkJaWYgKHNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3N0YXRlPT1zcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZXMpCisJCQkJc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfc3RhdGU9MDsKKwkJCXJldHVybigxKTsKKwkJfQorCQltLT1zcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZXMtc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfc3RhdGU7CisJCXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3N0YXRlPTA7CisJfQorCXdoaWxlIChtPj1zcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZXMpCisJeworCQlpZiAoanBlZ19yZWFkX3Jhd19kYXRhX2VuY2FwKHNwLCYoc3AtPmxpYmpwZWdfanBlZ19kZWNvbXByZXNzX3N0cnVjdCksc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWNiY3JpbWFnZSxzcC0+c3Vic2FtcGxpbmdfdmVyKjgpPT0wKQorCQkJcmV0dXJuKDApOworCQltLT1zcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZXM7CisJfQorCWlmIChtPjApCisJeworCQlpZiAoanBlZ19yZWFkX3Jhd19kYXRhX2VuY2FwKHNwLCYoc3AtPmxpYmpwZWdfanBlZ19kZWNvbXByZXNzX3N0cnVjdCksc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWNiY3JpbWFnZSxzcC0+c3Vic2FtcGxpbmdfdmVyKjgpPT0wKQorCQkJcmV0dXJuKDApOworCQlzcC0+c3Vic2FtcGxpbmdfY29udmVydF9zdGF0ZT1tOworCX0KKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyBpbnQKK09KUEVHUHJlRGVjb2RlU2tpcFNjYW5saW5lcyhUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW109Ik9KUEVHUHJlRGVjb2RlU2tpcFNjYW5saW5lcyI7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJdWludDMyIG07CisJaWYgKHNwLT5za2lwX2J1ZmZlcj09TlVMTCkKKwl7CisJCXNwLT5za2lwX2J1ZmZlcj1fVElGRm1hbGxvYyhzcC0+Ynl0ZXNfcGVyX2xpbmUpOworCQlpZiAoc3AtPnNraXBfYnVmZmVyPT1OVUxMKQorCQl7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKwkJCXJldHVybigwKTsKKwkJfQorCX0KKwlmb3IgKG09MDsgbTxzcC0+bGluZXNfcGVyX3N0cmlsZTsgbSsrKQorCXsKKwkJaWYgKGpwZWdfcmVhZF9zY2FubGluZXNfZW5jYXAoc3AsJihzcC0+bGlianBlZ19qcGVnX2RlY29tcHJlc3Nfc3RydWN0KSwmc3AtPnNraXBfYnVmZmVyLDEpPT0wKQorCQkJcmV0dXJuKDApOworCX0KKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyBpbnQKK09KUEVHRGVjb2RlKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKQoreworCU9KUEVHU3RhdGUqIHNwPShPSlBFR1N0YXRlKil0aWYtPnRpZl9kYXRhOworCSh2b2lkKXM7CisJaWYgKHNwLT5saWJqcGVnX2pwZWdfcXVlcnlfc3R5bGU9PTApCisJeworCQlpZiAoT0pQRUdEZWNvZGVSYXcodGlmLGJ1ZixjYyk9PTApCisJCQlyZXR1cm4oMCk7CisJfQorCWVsc2UKKwl7CisJCWlmIChPSlBFR0RlY29kZVNjYW5saW5lcyh0aWYsYnVmLGNjKT09MCkKKwkJCXJldHVybigwKTsKKwl9CisJcmV0dXJuKDEpOworfQorCitzdGF0aWMgaW50CitPSlBFR0RlY29kZVJhdyhUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IGNjKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdPSJPSlBFR0RlY29kZVJhdyI7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJdWludDgqIG07CisJdG1zaXplX3QgbjsKKwl1aW50OCogb3k7CisJdWludDgqIG9jYjsKKwl1aW50OCogb2NyOworCXVpbnQ4KiBwOworCXVpbnQzMiBxOworCXVpbnQ4KiByOworCXVpbnQ4IHN4LHN5OworCWlmIChjYyVzcC0+Ynl0ZXNfcGVyX2xpbmUhPTApCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkZyYWN0aW9uYWwgc2NhbmxpbmUgbm90IHJlYWQiKTsKKwkJcmV0dXJuKDApOworCX0KKwlhc3NlcnQoY2M+MCk7CisJbT1idWY7CisJbj1jYzsKKwlkbworCXsKKwkJaWYgKHNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3N0YXRlPT0wKQorCQl7CisJCQlpZiAoanBlZ19yZWFkX3Jhd19kYXRhX2VuY2FwKHNwLCYoc3AtPmxpYmpwZWdfanBlZ19kZWNvbXByZXNzX3N0cnVjdCksc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWNiY3JpbWFnZSxzcC0+c3Vic2FtcGxpbmdfdmVyKjgpPT0wKQorCQkJCXJldHVybigwKTsKKwkJfQorCQlveT1zcC0+c3Vic2FtcGxpbmdfY29udmVydF95YnVmK3NwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3N0YXRlKnNwLT5zdWJzYW1wbGluZ192ZXIqc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWxpbmVsZW47CisJCW9jYj1zcC0+c3Vic2FtcGxpbmdfY29udmVydF9jYmJ1ZitzcC0+c3Vic2FtcGxpbmdfY29udmVydF9zdGF0ZSpzcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZWxlbjsKKwkJb2NyPXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X2NyYnVmK3NwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3N0YXRlKnNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X2NsaW5lbGVuOworCQlwPW07CisJCWZvciAocT0wOyBxPHNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X2NsaW5lbGVub3V0OyBxKyspCisJCXsKKwkJCXI9b3k7CisJCQlmb3IgKHN5PTA7IHN5PHNwLT5zdWJzYW1wbGluZ192ZXI7IHN5KyspCisJCQl7CisJCQkJZm9yIChzeD0wOyBzeDxzcC0+c3Vic2FtcGxpbmdfaG9yOyBzeCsrKQorCQkJCQkqcCsrPSpyKys7CisJCQkJcis9c3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWxpbmVsZW4tc3AtPnN1YnNhbXBsaW5nX2hvcjsKKwkJCX0KKwkJCW95Kz1zcC0+c3Vic2FtcGxpbmdfaG9yOworCQkJKnArKz0qb2NiKys7CisJCQkqcCsrPSpvY3IrKzsKKwkJfQorCQlzcC0+c3Vic2FtcGxpbmdfY29udmVydF9zdGF0ZSsrOworCQlpZiAoc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfc3RhdGU9PXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X2NsaW5lcykKKwkJCXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3N0YXRlPTA7CisJCW0rPXNwLT5ieXRlc19wZXJfbGluZTsKKwkJbi09c3AtPmJ5dGVzX3Blcl9saW5lOworCX0gd2hpbGUobj4wKTsKKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyBpbnQKK09KUEVHRGVjb2RlU2NhbmxpbmVzKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3QgY2MpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW109Ik9KUEVHRGVjb2RlU2NhbmxpbmVzIjsKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwl1aW50OCogbTsKKwl0bXNpemVfdCBuOworCWlmIChjYyVzcC0+Ynl0ZXNfcGVyX2xpbmUhPTApCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkZyYWN0aW9uYWwgc2NhbmxpbmUgbm90IHJlYWQiKTsKKwkJcmV0dXJuKDApOworCX0KKwlhc3NlcnQoY2M+MCk7CisJbT1idWY7CisJbj1jYzsKKwlkbworCXsKKwkJaWYgKGpwZWdfcmVhZF9zY2FubGluZXNfZW5jYXAoc3AsJihzcC0+bGlianBlZ19qcGVnX2RlY29tcHJlc3Nfc3RydWN0KSwmbSwxKT09MCkKKwkJCXJldHVybigwKTsKKwkJbSs9c3AtPmJ5dGVzX3Blcl9saW5lOworCQluLT1zcC0+Ynl0ZXNfcGVyX2xpbmU7CisJfSB3aGlsZShuPjApOworCXJldHVybigxKTsKK30KKworc3RhdGljIHZvaWQKK09KUEVHUG9zdERlY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IGNjKQoreworCU9KUEVHU3RhdGUqIHNwPShPSlBFR1N0YXRlKil0aWYtPnRpZl9kYXRhOworCSh2b2lkKWJ1ZjsKKwkodm9pZCljYzsKKwlzcC0+d3JpdGVfY3Vyc3RyaWxlKys7CisJaWYgKHNwLT53cml0ZV9jdXJzdHJpbGUldGlmLT50aWZfZGlyLnRkX3N0cmlwc3BlcmltYWdlPT0wKSAgCisJeworCQlhc3NlcnQoc3AtPmxpYmpwZWdfc2Vzc2lvbl9hY3RpdmUhPTApOworCQlPSlBFR0xpYmpwZWdTZXNzaW9uQWJvcnQodGlmKTsKKwkJc3AtPndyaXRlaGVhZGVyX2RvbmU9MDsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK09KUEVHU2V0dXBFbmNvZGUoVElGRiogdGlmKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdPSJPSlBFR1NldHVwRW5jb2RlIjsKKwlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk9KUEVHIGVuY29kaW5nIG5vdCBzdXBwb3J0ZWQ7IHVzZSBuZXctc3R5bGUgSlBFRyBjb21wcmVzc2lvbiBpbnN0ZWFkIik7CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50CitPSlBFR1ByZUVuY29kZShUSUZGKiB0aWYsIHVpbnQxNiBzKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdPSJPSlBFR1ByZUVuY29kZSI7CisJKHZvaWQpczsKKwlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk9KUEVHIGVuY29kaW5nIG5vdCBzdXBwb3J0ZWQ7IHVzZSBuZXctc3R5bGUgSlBFRyBjb21wcmVzc2lvbiBpbnN0ZWFkIik7CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50CitPSlBFR0VuY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IGNjLCB1aW50MTYgcykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXT0iT0pQRUdFbmNvZGUiOworCSh2b2lkKWJ1ZjsKKwkodm9pZCljYzsKKwkodm9pZClzOworCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiT0pQRUcgZW5jb2Rpbmcgbm90IHN1cHBvcnRlZDsgdXNlIG5ldy1zdHlsZSBKUEVHIGNvbXByZXNzaW9uIGluc3RlYWQiKTsKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQKK09KUEVHUG9zdEVuY29kZShUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW109Ik9KUEVHUG9zdEVuY29kZSI7CisJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJPSlBFRyBlbmNvZGluZyBub3Qgc3VwcG9ydGVkOyB1c2UgbmV3LXN0eWxlIEpQRUcgY29tcHJlc3Npb24gaW5zdGVhZCIpOworCXJldHVybigwKTsKK30KKworc3RhdGljIHZvaWQKK09KUEVHQ2xlYW51cChUSUZGKiB0aWYpCit7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJaWYgKHNwIT0wKQorCXsKKwkJdGlmLT50aWZfdGFnbWV0aG9kcy52Z2V0ZmllbGQ9c3AtPnZnZXRwYXJlbnQ7CisJCXRpZi0+dGlmX3RhZ21ldGhvZHMudnNldGZpZWxkPXNwLT52c2V0cGFyZW50OworCQl0aWYtPnRpZl90YWdtZXRob2RzLnByaW50ZGlyPXNwLT5wcmludGRpcjsKKwkJaWYgKHNwLT5xdGFibGVbMF0hPTApCisJCQlfVElGRmZyZWUoc3AtPnF0YWJsZVswXSk7CisJCWlmIChzcC0+cXRhYmxlWzFdIT0wKQorCQkJX1RJRkZmcmVlKHNwLT5xdGFibGVbMV0pOworCQlpZiAoc3AtPnF0YWJsZVsyXSE9MCkKKwkJCV9USUZGZnJlZShzcC0+cXRhYmxlWzJdKTsKKwkJaWYgKHNwLT5xdGFibGVbM10hPTApCisJCQlfVElGRmZyZWUoc3AtPnF0YWJsZVszXSk7CisJCWlmIChzcC0+ZGN0YWJsZVswXSE9MCkKKwkJCV9USUZGZnJlZShzcC0+ZGN0YWJsZVswXSk7CisJCWlmIChzcC0+ZGN0YWJsZVsxXSE9MCkKKwkJCV9USUZGZnJlZShzcC0+ZGN0YWJsZVsxXSk7CisJCWlmIChzcC0+ZGN0YWJsZVsyXSE9MCkKKwkJCV9USUZGZnJlZShzcC0+ZGN0YWJsZVsyXSk7CisJCWlmIChzcC0+ZGN0YWJsZVszXSE9MCkKKwkJCV9USUZGZnJlZShzcC0+ZGN0YWJsZVszXSk7CisJCWlmIChzcC0+YWN0YWJsZVswXSE9MCkKKwkJCV9USUZGZnJlZShzcC0+YWN0YWJsZVswXSk7CisJCWlmIChzcC0+YWN0YWJsZVsxXSE9MCkKKwkJCV9USUZGZnJlZShzcC0+YWN0YWJsZVsxXSk7CisJCWlmIChzcC0+YWN0YWJsZVsyXSE9MCkKKwkJCV9USUZGZnJlZShzcC0+YWN0YWJsZVsyXSk7CisJCWlmIChzcC0+YWN0YWJsZVszXSE9MCkKKwkJCV9USUZGZnJlZShzcC0+YWN0YWJsZVszXSk7CisJCWlmIChzcC0+bGlianBlZ19zZXNzaW9uX2FjdGl2ZSE9MCkKKwkJCU9KUEVHTGlianBlZ1Nlc3Npb25BYm9ydCh0aWYpOworCQlpZiAoc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWNiY3JidWYhPTApCisJCQlfVElGRmZyZWUoc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWNiY3JidWYpOworCQlpZiAoc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWNiY3JpbWFnZSE9MCkKKwkJCV9USUZGZnJlZShzcC0+c3Vic2FtcGxpbmdfY29udmVydF95Y2JjcmltYWdlKTsKKwkJaWYgKHNwLT5za2lwX2J1ZmZlciE9MCkKKwkJCV9USUZGZnJlZShzcC0+c2tpcF9idWZmZXIpOworCQlfVElGRmZyZWUoc3ApOworCQl0aWYtPnRpZl9kYXRhPU5VTEw7CisJCV9USUZGU2V0RGVmYXVsdENvbXByZXNzaW9uU3RhdGUodGlmKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitPSlBFR1N1YnNhbXBsaW5nQ29ycmVjdChUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW109Ik9KUEVHU3Vic2FtcGxpbmdDb3JyZWN0IjsKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwl1aW50OCBtaDsKKwl1aW50OCBtdjsKKyAgICAgICAgX1RJRkZGaWxsU3RyaWxlcyggdGlmICk7CisgICAgICAgIAorCWFzc2VydChzcC0+c3Vic2FtcGxpbmdjb3JyZWN0X2RvbmU9PTApOworCWlmICgodGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbCE9MykgfHwgKCh0aWYtPnRpZl9kaXIudGRfcGhvdG9tZXRyaWMhPVBIT1RPTUVUUklDX1lDQkNSKSAmJgorCSAgICAodGlmLT50aWZfZGlyLnRkX3Bob3RvbWV0cmljIT1QSE9UT01FVFJJQ19JVFVMQUIpKSkKKwl7CisJCWlmIChzcC0+c3Vic2FtcGxpbmdfdGFnIT0wKQorCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIlN1YnNhbXBsaW5nIHRhZyBub3QgYXBwcm9wcmlhdGUgZm9yIHRoaXMgUGhvdG9tZXRyaWMgYW5kL29yIFNhbXBsZXNQZXJQaXhlbCIpOworCQlzcC0+c3Vic2FtcGxpbmdfaG9yPTE7CisJCXNwLT5zdWJzYW1wbGluZ192ZXI9MTsKKwkJc3AtPnN1YnNhbXBsaW5nX2ZvcmNlX2Rlc3Vic2FtcGxpbmdfaW5zaWRlX2RlY29tcHJlc3Npb249MDsKKwl9CisJZWxzZQorCXsKKwkJc3AtPnN1YnNhbXBsaW5nY29ycmVjdF9kb25lPTE7CisJCW1oPXNwLT5zdWJzYW1wbGluZ19ob3I7CisJCW12PXNwLT5zdWJzYW1wbGluZ192ZXI7CisJCXNwLT5zdWJzYW1wbGluZ2NvcnJlY3Q9MTsKKwkJT0pQRUdSZWFkSGVhZGVySW5mb1NlYyh0aWYpOworCQlpZiAoc3AtPnN1YnNhbXBsaW5nX2ZvcmNlX2Rlc3Vic2FtcGxpbmdfaW5zaWRlX2RlY29tcHJlc3Npb24hPTApCisJCXsKKwkJCXNwLT5zdWJzYW1wbGluZ19ob3I9MTsKKwkJCXNwLT5zdWJzYW1wbGluZ192ZXI9MTsKKwkJfQorCQlzcC0+c3Vic2FtcGxpbmdjb3JyZWN0PTA7CisJCWlmICgoKHNwLT5zdWJzYW1wbGluZ19ob3IhPW1oKSB8fCAoc3AtPnN1YnNhbXBsaW5nX3ZlciE9bXYpKSAmJiAoc3AtPnN1YnNhbXBsaW5nX2ZvcmNlX2Rlc3Vic2FtcGxpbmdfaW5zaWRlX2RlY29tcHJlc3Npb249PTApKQorCQl7CisJCQlpZiAoc3AtPnN1YnNhbXBsaW5nX3RhZz09MCkKKwkJCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiU3Vic2FtcGxpbmcgdGFnIGlzIG5vdCBzZXQsIHlldCBzdWJzYW1wbGluZyBpbnNpZGUgSlBFRyBkYXRhIFslZCwlZF0gZG9lcyBub3QgbWF0Y2ggZGVmYXVsdCB2YWx1ZXMgWzIsMl07IGFzc3VtaW5nIHN1YnNhbXBsaW5nIGluc2lkZSBKUEVHIGRhdGEgaXMgY29ycmVjdCIsc3AtPnN1YnNhbXBsaW5nX2hvcixzcC0+c3Vic2FtcGxpbmdfdmVyKTsKKwkJCWVsc2UKKwkJCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiU3Vic2FtcGxpbmcgaW5zaWRlIEpQRUcgZGF0YSBbJWQsJWRdIGRvZXMgbm90IG1hdGNoIHN1YnNhbXBsaW5nIHRhZyB2YWx1ZXMgWyVkLCVkXTsgYXNzdW1pbmcgc3Vic2FtcGxpbmcgaW5zaWRlIEpQRUcgZGF0YSBpcyBjb3JyZWN0IixzcC0+c3Vic2FtcGxpbmdfaG9yLHNwLT5zdWJzYW1wbGluZ192ZXIsbWgsbXYpOworCQl9CisJCWlmIChzcC0+c3Vic2FtcGxpbmdfZm9yY2VfZGVzdWJzYW1wbGluZ19pbnNpZGVfZGVjb21wcmVzc2lvbiE9MCkKKwkJeworCQkJaWYgKHNwLT5zdWJzYW1wbGluZ190YWc9PTApCisJCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIlN1YnNhbXBsaW5nIHRhZyBpcyBub3Qgc2V0LCB5ZXQgc3Vic2FtcGxpbmcgaW5zaWRlIEpQRUcgZGF0YSBkb2VzIG5vdCBtYXRjaCBkZWZhdWx0IHZhbHVlcyBbMiwyXSAobm9yIGFueSBvdGhlciB2YWx1ZXMgYWxsb3dlZCBpbiBUSUZGKTsgYXNzdW1pbmcgc3Vic2FtcGxpbmcgaW5zaWRlIEpQRUcgZGF0YSBpcyBjb3JyZWN0IGFuZCBkZXN1YnNhbXBsaW5nIGluc2lkZSBKUEVHIGRlY29tcHJlc3Npb24iKTsKKwkJCWVsc2UKKwkJCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiU3Vic2FtcGxpbmcgaW5zaWRlIEpQRUcgZGF0YSBkb2VzIG5vdCBtYXRjaCBzdWJzYW1wbGluZyB0YWcgdmFsdWVzIFslZCwlZF0gKG5vciBhbnkgb3RoZXIgdmFsdWVzIGFsbG93ZWQgaW4gVElGRik7IGFzc3VtaW5nIHN1YnNhbXBsaW5nIGluc2lkZSBKUEVHIGRhdGEgaXMgY29ycmVjdCBhbmQgZGVzdWJzYW1wbGluZyBpbnNpZGUgSlBFRyBkZWNvbXByZXNzaW9uIixtaCxtdik7CisJCX0KKwkJaWYgKHNwLT5zdWJzYW1wbGluZ19mb3JjZV9kZXN1YnNhbXBsaW5nX2luc2lkZV9kZWNvbXByZXNzaW9uPT0wKQorCQl7CisJCQlpZiAoc3AtPnN1YnNhbXBsaW5nX2hvcjxzcC0+c3Vic2FtcGxpbmdfdmVyKQorCQkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJTdWJzYW1wbGluZyB2YWx1ZXMgWyVkLCVkXSBhcmUgbm90IGFsbG93ZWQgaW4gVElGRiIsc3AtPnN1YnNhbXBsaW5nX2hvcixzcC0+c3Vic2FtcGxpbmdfdmVyKTsKKwkJfQorCX0KKwlzcC0+c3Vic2FtcGxpbmdjb3JyZWN0X2RvbmU9MTsKK30KKworc3RhdGljIGludAorT0pQRUdSZWFkSGVhZGVySW5mbyhUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW109Ik9KUEVHUmVhZEhlYWRlckluZm8iOworCU9KUEVHU3RhdGUqIHNwPShPSlBFR1N0YXRlKil0aWYtPnRpZl9kYXRhOworCWFzc2VydChzcC0+cmVhZGhlYWRlcl9kb25lPT0wKTsKKwlzcC0+aW1hZ2Vfd2lkdGg9dGlmLT50aWZfZGlyLnRkX2ltYWdld2lkdGg7CisJc3AtPmltYWdlX2xlbmd0aD10aWYtPnRpZl9kaXIudGRfaW1hZ2VsZW5ndGg7CisJaWYgaXNUaWxlZCh0aWYpCisJeworCQlzcC0+c3RyaWxlX3dpZHRoPXRpZi0+dGlmX2Rpci50ZF90aWxld2lkdGg7CisJCXNwLT5zdHJpbGVfbGVuZ3RoPXRpZi0+dGlmX2Rpci50ZF90aWxlbGVuZ3RoOworCQlzcC0+c3RyaWxlX2xlbmd0aF90b3RhbD0oKHNwLT5pbWFnZV9sZW5ndGgrc3AtPnN0cmlsZV9sZW5ndGgtMSkvc3AtPnN0cmlsZV9sZW5ndGgpKnNwLT5zdHJpbGVfbGVuZ3RoOworCX0KKwllbHNlCisJeworCQlzcC0+c3RyaWxlX3dpZHRoPXNwLT5pbWFnZV93aWR0aDsKKwkJc3AtPnN0cmlsZV9sZW5ndGg9dGlmLT50aWZfZGlyLnRkX3Jvd3NwZXJzdHJpcDsKKwkJc3AtPnN0cmlsZV9sZW5ndGhfdG90YWw9c3AtPmltYWdlX2xlbmd0aDsKKwl9CisJaWYgKHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWw9PTEpCisJeworCQlzcC0+c2FtcGxlc19wZXJfcGl4ZWw9MTsKKwkJc3AtPnBsYW5lX3NhbXBsZV9vZmZzZXQ9MDsKKwkJc3AtPnNhbXBsZXNfcGVyX3BpeGVsX3Blcl9wbGFuZT1zcC0+c2FtcGxlc19wZXJfcGl4ZWw7CisJCXNwLT5zdWJzYW1wbGluZ19ob3I9MTsKKwkJc3AtPnN1YnNhbXBsaW5nX3Zlcj0xOworCX0KKwllbHNlCisJeworCQlpZiAodGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbCE9MykKKwkJeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJTYW1wbGVzUGVyUGl4ZWwgJWQgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBjb21wcmVzc2lvbiBzY2hlbWUiLHNwLT5zYW1wbGVzX3Blcl9waXhlbCk7CisJCQlyZXR1cm4oMCk7CisJCX0KKwkJc3AtPnNhbXBsZXNfcGVyX3BpeGVsPTM7CisJCXNwLT5wbGFuZV9zYW1wbGVfb2Zmc2V0PTA7CisJCWlmICh0aWYtPnRpZl9kaXIudGRfcGxhbmFyY29uZmlnPT1QTEFOQVJDT05GSUdfQ09OVElHKQorCQkJc3AtPnNhbXBsZXNfcGVyX3BpeGVsX3Blcl9wbGFuZT0zOworCQllbHNlCisJCQlzcC0+c2FtcGxlc19wZXJfcGl4ZWxfcGVyX3BsYW5lPTE7CisJfQorCWlmIChzcC0+c3RyaWxlX2xlbmd0aDxzcC0+aW1hZ2VfbGVuZ3RoKQorCXsKKwkJaWYgKHNwLT5zdHJpbGVfbGVuZ3RoJShzcC0+c3Vic2FtcGxpbmdfdmVyKjgpIT0wKQorCQl7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkluY29tcGF0aWJsZSB2ZXJ0aWNhbCBzdWJzYW1wbGluZyBhbmQgaW1hZ2Ugc3RyaXAvdGlsZSBsZW5ndGgiKTsKKwkJCXJldHVybigwKTsKKwkJfQorCQlzcC0+cmVzdGFydF9pbnRlcnZhbD0oKHNwLT5zdHJpbGVfd2lkdGgrc3AtPnN1YnNhbXBsaW5nX2hvcio4LTEpLyhzcC0+c3Vic2FtcGxpbmdfaG9yKjgpKSooc3AtPnN0cmlsZV9sZW5ndGgvKHNwLT5zdWJzYW1wbGluZ192ZXIqOCkpOworCX0KKwlpZiAoT0pQRUdSZWFkSGVhZGVySW5mb1NlYyh0aWYpPT0wKQorCQlyZXR1cm4oMCk7CisJc3AtPnNvc19lbmRbMF0ubG9nPTE7CisJc3AtPnNvc19lbmRbMF0uaW5fYnVmZmVyX3NvdXJjZT1zcC0+aW5fYnVmZmVyX3NvdXJjZTsKKwlzcC0+c29zX2VuZFswXS5pbl9idWZmZXJfbmV4dF9zdHJpbGU9c3AtPmluX2J1ZmZlcl9uZXh0X3N0cmlsZTsKKwlzcC0+c29zX2VuZFswXS5pbl9idWZmZXJfZmlsZV9wb3M9c3AtPmluX2J1ZmZlcl9maWxlX3Bvcy1zcC0+aW5fYnVmZmVyX3RvZ287CisJc3AtPnNvc19lbmRbMF0uaW5fYnVmZmVyX2ZpbGVfdG9nbz1zcC0+aW5fYnVmZmVyX2ZpbGVfdG9nbytzcC0+aW5fYnVmZmVyX3RvZ287IAorCXNwLT5yZWFkaGVhZGVyX2RvbmU9MTsKKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyBpbnQKK09KUEVHUmVhZFNlY29uZGFyeVNvcyhUSUZGKiB0aWYsIHVpbnQxNiBzKQoreworCU9KUEVHU3RhdGUqIHNwPShPSlBFR1N0YXRlKil0aWYtPnRpZl9kYXRhOworCXVpbnQ4IG07CisJYXNzZXJ0KHM+MCk7CisJYXNzZXJ0KHM8Myk7CisJYXNzZXJ0KHNwLT5zb3NfZW5kWzBdLmxvZyE9MCk7CisJYXNzZXJ0KHNwLT5zb3NfZW5kW3NdLmxvZz09MCk7CisJc3AtPnBsYW5lX3NhbXBsZV9vZmZzZXQ9cy0xOworCXdoaWxlKHNwLT5zb3NfZW5kW3NwLT5wbGFuZV9zYW1wbGVfb2Zmc2V0XS5sb2c9PTApCisJCXNwLT5wbGFuZV9zYW1wbGVfb2Zmc2V0LS07CisJc3AtPmluX2J1ZmZlcl9zb3VyY2U9c3AtPnNvc19lbmRbc3AtPnBsYW5lX3NhbXBsZV9vZmZzZXRdLmluX2J1ZmZlcl9zb3VyY2U7CisJc3AtPmluX2J1ZmZlcl9uZXh0X3N0cmlsZT1zcC0+c29zX2VuZFtzcC0+cGxhbmVfc2FtcGxlX29mZnNldF0uaW5fYnVmZmVyX25leHRfc3RyaWxlOworCXNwLT5pbl9idWZmZXJfZmlsZV9wb3M9c3AtPnNvc19lbmRbc3AtPnBsYW5lX3NhbXBsZV9vZmZzZXRdLmluX2J1ZmZlcl9maWxlX3BvczsKKwlzcC0+aW5fYnVmZmVyX2ZpbGVfcG9zX2xvZz0wOworCXNwLT5pbl9idWZmZXJfZmlsZV90b2dvPXNwLT5zb3NfZW5kW3NwLT5wbGFuZV9zYW1wbGVfb2Zmc2V0XS5pbl9idWZmZXJfZmlsZV90b2dvOworCXNwLT5pbl9idWZmZXJfdG9nbz0wOworCXNwLT5pbl9idWZmZXJfY3VyPTA7CisJd2hpbGUoc3AtPnBsYW5lX3NhbXBsZV9vZmZzZXQ8cykKKwl7CisJCWRvCisJCXsKKwkJCWlmIChPSlBFR1JlYWRCeXRlKHNwLCZtKT09MCkKKwkJCQlyZXR1cm4oMCk7CisJCQlpZiAobT09MjU1KQorCQkJeworCQkJCWRvCisJCQkJeworCQkJCQlpZiAoT0pQRUdSZWFkQnl0ZShzcCwmbSk9PTApCisJCQkJCQlyZXR1cm4oMCk7CisJCQkJCWlmIChtIT0yNTUpCisJCQkJCQlicmVhazsKKwkJCQl9IHdoaWxlKDEpOworCQkJCWlmIChtPT1KUEVHX01BUktFUl9TT1MpCisJCQkJCWJyZWFrOworCQkJfQorCQl9IHdoaWxlKDEpOworCQlzcC0+cGxhbmVfc2FtcGxlX29mZnNldCsrOworCQlpZiAoT0pQRUdSZWFkSGVhZGVySW5mb1NlY1N0cmVhbVNvcyh0aWYpPT0wKQorCQkJcmV0dXJuKDApOworCQlzcC0+c29zX2VuZFtzcC0+cGxhbmVfc2FtcGxlX29mZnNldF0ubG9nPTE7CisJCXNwLT5zb3NfZW5kW3NwLT5wbGFuZV9zYW1wbGVfb2Zmc2V0XS5pbl9idWZmZXJfc291cmNlPXNwLT5pbl9idWZmZXJfc291cmNlOworCQlzcC0+c29zX2VuZFtzcC0+cGxhbmVfc2FtcGxlX29mZnNldF0uaW5fYnVmZmVyX25leHRfc3RyaWxlPXNwLT5pbl9idWZmZXJfbmV4dF9zdHJpbGU7CisJCXNwLT5zb3NfZW5kW3NwLT5wbGFuZV9zYW1wbGVfb2Zmc2V0XS5pbl9idWZmZXJfZmlsZV9wb3M9c3AtPmluX2J1ZmZlcl9maWxlX3Bvcy1zcC0+aW5fYnVmZmVyX3RvZ287CisJCXNwLT5zb3NfZW5kW3NwLT5wbGFuZV9zYW1wbGVfb2Zmc2V0XS5pbl9idWZmZXJfZmlsZV90b2dvPXNwLT5pbl9idWZmZXJfZmlsZV90b2dvK3NwLT5pbl9idWZmZXJfdG9nbzsKKwl9CisJcmV0dXJuKDEpOworfQorCitzdGF0aWMgaW50CitPSlBFR1dyaXRlSGVhZGVySW5mbyhUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW109Ik9KUEVHV3JpdGVIZWFkZXJJbmZvIjsKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwl1aW50OCoqIG07CisJdWludDMyIG47CisJLyogaWYgYSBwcmV2aW91cyBhdHRlbXB0IGZhaWxlZCwgZG9uJ3QgdHJ5IGFnYWluICovCisJaWYgKHNwLT5saWJqcGVnX3Nlc3Npb25fYWN0aXZlICE9IDApIAorCQlyZXR1cm4gMDsKKwlzcC0+b3V0X3N0YXRlPW9zb3NTb2k7CisJc3AtPnJlc3RhcnRfaW5kZXg9MDsKKwlqcGVnX3N0ZF9lcnJvcigmKHNwLT5saWJqcGVnX2pwZWdfZXJyb3JfbWdyKSk7CisJc3AtPmxpYmpwZWdfanBlZ19lcnJvcl9tZ3Iub3V0cHV0X21lc3NhZ2U9T0pQRUdMaWJqcGVnSnBlZ0Vycm9yTWdyT3V0cHV0TWVzc2FnZTsKKwlzcC0+bGlianBlZ19qcGVnX2Vycm9yX21nci5lcnJvcl9leGl0PU9KUEVHTGlianBlZ0pwZWdFcnJvck1nckVycm9yRXhpdDsKKwlzcC0+bGlianBlZ19qcGVnX2RlY29tcHJlc3Nfc3RydWN0LmVycj0mKHNwLT5saWJqcGVnX2pwZWdfZXJyb3JfbWdyKTsKKwlzcC0+bGlianBlZ19qcGVnX2RlY29tcHJlc3Nfc3RydWN0LmNsaWVudF9kYXRhPSh2b2lkKil0aWY7CisJaWYgKGpwZWdfY3JlYXRlX2RlY29tcHJlc3NfZW5jYXAoc3AsJihzcC0+bGlianBlZ19qcGVnX2RlY29tcHJlc3Nfc3RydWN0KSk9PTApCisJCXJldHVybigwKTsKKwlzcC0+bGlianBlZ19zZXNzaW9uX2FjdGl2ZT0xOworCXNwLT5saWJqcGVnX2pwZWdfc291cmNlX21nci5ieXRlc19pbl9idWZmZXI9MDsKKwlzcC0+bGlianBlZ19qcGVnX3NvdXJjZV9tZ3IuaW5pdF9zb3VyY2U9T0pQRUdMaWJqcGVnSnBlZ1NvdXJjZU1nckluaXRTb3VyY2U7CisJc3AtPmxpYmpwZWdfanBlZ19zb3VyY2VfbWdyLmZpbGxfaW5wdXRfYnVmZmVyPU9KUEVHTGlianBlZ0pwZWdTb3VyY2VNZ3JGaWxsSW5wdXRCdWZmZXI7CisJc3AtPmxpYmpwZWdfanBlZ19zb3VyY2VfbWdyLnNraXBfaW5wdXRfZGF0YT1PSlBFR0xpYmpwZWdKcGVnU291cmNlTWdyU2tpcElucHV0RGF0YTsKKwlzcC0+bGlianBlZ19qcGVnX3NvdXJjZV9tZ3IucmVzeW5jX3RvX3Jlc3RhcnQ9T0pQRUdMaWJqcGVnSnBlZ1NvdXJjZU1nclJlc3luY1RvUmVzdGFydDsKKwlzcC0+bGlianBlZ19qcGVnX3NvdXJjZV9tZ3IudGVybV9zb3VyY2U9T0pQRUdMaWJqcGVnSnBlZ1NvdXJjZU1nclRlcm1Tb3VyY2U7CisJc3AtPmxpYmpwZWdfanBlZ19kZWNvbXByZXNzX3N0cnVjdC5zcmM9JihzcC0+bGlianBlZ19qcGVnX3NvdXJjZV9tZ3IpOworCWlmIChqcGVnX3JlYWRfaGVhZGVyX2VuY2FwKHNwLCYoc3AtPmxpYmpwZWdfanBlZ19kZWNvbXByZXNzX3N0cnVjdCksMSk9PTApCisJCXJldHVybigwKTsKKwlpZiAoKHNwLT5zdWJzYW1wbGluZ19mb3JjZV9kZXN1YnNhbXBsaW5nX2luc2lkZV9kZWNvbXByZXNzaW9uPT0wKSAmJiAoc3AtPnNhbXBsZXNfcGVyX3BpeGVsX3Blcl9wbGFuZT4xKSkKKwl7CisJCXNwLT5saWJqcGVnX2pwZWdfZGVjb21wcmVzc19zdHJ1Y3QucmF3X2RhdGFfb3V0PTE7CisjaWYgSlBFR19MSUJfVkVSU0lPTiA+PSA3MAorCQlzcC0+bGlianBlZ19qcGVnX2RlY29tcHJlc3Nfc3RydWN0LmRvX2ZhbmN5X3Vwc2FtcGxpbmc9RkFMU0U7CisjZW5kaWYKKwkJc3AtPmxpYmpwZWdfanBlZ19xdWVyeV9zdHlsZT0wOworCQlpZiAoc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfbG9nPT0wKQorCQl7CisJCQlhc3NlcnQoc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWNiY3JidWY9PTApOworCQkJYXNzZXJ0KHNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3ljYmNyaW1hZ2U9PTApOworCQkJc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWxpbmVsZW49KChzcC0+c3RyaWxlX3dpZHRoK3NwLT5zdWJzYW1wbGluZ19ob3IqOC0xKS8oc3AtPnN1YnNhbXBsaW5nX2hvcio4KSpzcC0+c3Vic2FtcGxpbmdfaG9yKjgpOworCQkJc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWxpbmVzPXNwLT5zdWJzYW1wbGluZ192ZXIqODsKKwkJCXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X2NsaW5lbGVuPXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3lsaW5lbGVuL3NwLT5zdWJzYW1wbGluZ19ob3I7CisJCQlzcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZXM9ODsKKwkJCXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3lidWZsZW49c3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWxpbmVsZW4qc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWxpbmVzOworCQkJc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfY2J1Zmxlbj1zcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZWxlbipzcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZXM7CisJCQlzcC0+c3Vic2FtcGxpbmdfY29udmVydF95Y2JjcmJ1Zmxlbj1zcC0+c3Vic2FtcGxpbmdfY29udmVydF95YnVmbGVuKzIqc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfY2J1ZmxlbjsKKwkJCXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3ljYmNyYnVmPV9USUZGbWFsbG9jKHNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3ljYmNyYnVmbGVuKTsKKwkJCWlmIChzcC0+c3Vic2FtcGxpbmdfY29udmVydF95Y2JjcmJ1Zj09MCkKKwkJCXsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKwkJCQlyZXR1cm4oMCk7CisJCQl9CisJCQlzcC0+c3Vic2FtcGxpbmdfY29udmVydF95YnVmPXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3ljYmNyYnVmOworCQkJc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfY2JidWY9c3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWJ1ZitzcC0+c3Vic2FtcGxpbmdfY29udmVydF95YnVmbGVuOworCQkJc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfY3JidWY9c3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfY2JidWYrc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfY2J1ZmxlbjsKKwkJCXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3ljYmNyaW1hZ2VsZW49MytzcC0+c3Vic2FtcGxpbmdfY29udmVydF95bGluZXMrMipzcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZXM7CisJCQlzcC0+c3Vic2FtcGxpbmdfY29udmVydF95Y2JjcmltYWdlPV9USUZGbWFsbG9jKHNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3ljYmNyaW1hZ2VsZW4qc2l6ZW9mKHVpbnQ4KikpOworCQkJaWYgKHNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3ljYmNyaW1hZ2U9PTApCisJCQl7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJPdXQgb2YgbWVtb3J5Iik7CisJCQkJcmV0dXJuKDApOworCQkJfQorCQkJbT1zcC0+c3Vic2FtcGxpbmdfY29udmVydF95Y2JjcmltYWdlOworCQkJKm0rKz0odWludDgqKShzcC0+c3Vic2FtcGxpbmdfY29udmVydF95Y2JjcmltYWdlKzMpOworCQkJKm0rKz0odWludDgqKShzcC0+c3Vic2FtcGxpbmdfY29udmVydF95Y2JjcmltYWdlKzMrc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWxpbmVzKTsKKwkJCSptKys9KHVpbnQ4Kikoc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWNiY3JpbWFnZSszK3NwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3lsaW5lcytzcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZXMpOworCQkJZm9yIChuPTA7IG48c3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWxpbmVzOyBuKyspCisJCQkJKm0rKz1zcC0+c3Vic2FtcGxpbmdfY29udmVydF95YnVmK24qc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfeWxpbmVsZW47CisJCQlmb3IgKG49MDsgbjxzcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZXM7IG4rKykKKwkJCQkqbSsrPXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X2NiYnVmK24qc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfY2xpbmVsZW47CisJCQlmb3IgKG49MDsgbjxzcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZXM7IG4rKykKKwkJCQkqbSsrPXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X2NyYnVmK24qc3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfY2xpbmVsZW47CisJCQlzcC0+c3Vic2FtcGxpbmdfY29udmVydF9jbGluZWxlbm91dD0oKHNwLT5zdHJpbGVfd2lkdGgrc3AtPnN1YnNhbXBsaW5nX2hvci0xKS9zcC0+c3Vic2FtcGxpbmdfaG9yKTsKKwkJCXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X3N0YXRlPTA7CisJCQlzcC0+Ynl0ZXNfcGVyX2xpbmU9c3AtPnN1YnNhbXBsaW5nX2NvbnZlcnRfY2xpbmVsZW5vdXQqKHNwLT5zdWJzYW1wbGluZ192ZXIqc3AtPnN1YnNhbXBsaW5nX2hvcisyKTsKKwkJCXNwLT5saW5lc19wZXJfc3RyaWxlPSgoc3AtPnN0cmlsZV9sZW5ndGgrc3AtPnN1YnNhbXBsaW5nX3Zlci0xKS9zcC0+c3Vic2FtcGxpbmdfdmVyKTsKKwkJCXNwLT5zdWJzYW1wbGluZ19jb252ZXJ0X2xvZz0xOworCQl9CisJfQorCWVsc2UKKwl7CisJCXNwLT5saWJqcGVnX2pwZWdfZGVjb21wcmVzc19zdHJ1Y3QuanBlZ19jb2xvcl9zcGFjZT1KQ1NfVU5LTk9XTjsKKwkJc3AtPmxpYmpwZWdfanBlZ19kZWNvbXByZXNzX3N0cnVjdC5vdXRfY29sb3Jfc3BhY2U9SkNTX1VOS05PV047CisJCXNwLT5saWJqcGVnX2pwZWdfcXVlcnlfc3R5bGU9MTsKKwkJc3AtPmJ5dGVzX3Blcl9saW5lPXNwLT5zYW1wbGVzX3Blcl9waXhlbF9wZXJfcGxhbmUqc3AtPnN0cmlsZV93aWR0aDsKKwkJc3AtPmxpbmVzX3Blcl9zdHJpbGU9c3AtPnN0cmlsZV9sZW5ndGg7CisJfQorCWlmIChqcGVnX3N0YXJ0X2RlY29tcHJlc3NfZW5jYXAoc3AsJihzcC0+bGlianBlZ19qcGVnX2RlY29tcHJlc3Nfc3RydWN0KSk9PTApCisJCXJldHVybigwKTsKKwlzcC0+d3JpdGVoZWFkZXJfZG9uZT0xOworCXJldHVybigxKTsKK30KKworc3RhdGljIHZvaWQKK09KUEVHTGlianBlZ1Nlc3Npb25BYm9ydChUSUZGKiB0aWYpCit7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJYXNzZXJ0KHNwLT5saWJqcGVnX3Nlc3Npb25fYWN0aXZlIT0wKTsKKwlqcGVnX2Rlc3Ryb3koKGpwZWdfY29tbW9uX3N0cnVjdCopKCYoc3AtPmxpYmpwZWdfanBlZ19kZWNvbXByZXNzX3N0cnVjdCkpKTsKKwlzcC0+bGlianBlZ19zZXNzaW9uX2FjdGl2ZT0wOworfQorCitzdGF0aWMgaW50CitPSlBFR1JlYWRIZWFkZXJJbmZvU2VjKFRJRkYqIHRpZikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXT0iT0pQRUdSZWFkSGVhZGVySW5mb1NlYyI7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJdWludDggbTsKKwl1aW50MTYgbjsKKwl1aW50OCBvOworCWlmIChzcC0+ZmlsZV9zaXplPT0wKQorCQlzcC0+ZmlsZV9zaXplPVRJRkZHZXRGaWxlU2l6ZSh0aWYpOworCWlmIChzcC0+anBlZ19pbnRlcmNoYW5nZV9mb3JtYXQhPTApCisJeworCQlpZiAoc3AtPmpwZWdfaW50ZXJjaGFuZ2VfZm9ybWF0Pj1zcC0+ZmlsZV9zaXplKQorCQl7CisJCQlzcC0+anBlZ19pbnRlcmNoYW5nZV9mb3JtYXQ9MDsKKwkJCXNwLT5qcGVnX2ludGVyY2hhbmdlX2Zvcm1hdF9sZW5ndGg9MDsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmICgoc3AtPmpwZWdfaW50ZXJjaGFuZ2VfZm9ybWF0X2xlbmd0aD09MCkgfHwgKHNwLT5qcGVnX2ludGVyY2hhbmdlX2Zvcm1hdCtzcC0+anBlZ19pbnRlcmNoYW5nZV9mb3JtYXRfbGVuZ3RoPnNwLT5maWxlX3NpemUpKQorCQkJCXNwLT5qcGVnX2ludGVyY2hhbmdlX2Zvcm1hdF9sZW5ndGg9c3AtPmZpbGVfc2l6ZS1zcC0+anBlZ19pbnRlcmNoYW5nZV9mb3JtYXQ7CisJCX0KKwl9CisJc3AtPmluX2J1ZmZlcl9zb3VyY2U9b3NpYnNOb3RTZXRZZXQ7CisJc3AtPmluX2J1ZmZlcl9uZXh0X3N0cmlsZT0wOworCXNwLT5pbl9idWZmZXJfc3RyaWxlX2NvdW50PXRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzOworCXNwLT5pbl9idWZmZXJfZmlsZV90b2dvPTA7CisJc3AtPmluX2J1ZmZlcl90b2dvPTA7CisJZG8KKwl7CisJCWlmIChPSlBFR1JlYWRCeXRlUGVlayhzcCwmbSk9PTApCisJCQlyZXR1cm4oMCk7CisJCWlmIChtIT0yNTUpCisJCQlicmVhazsKKwkJT0pQRUdSZWFkQnl0ZUFkdmFuY2Uoc3ApOworCQlkbworCQl7CisJCQlpZiAoT0pQRUdSZWFkQnl0ZShzcCwmbSk9PTApCisJCQkJcmV0dXJuKDApOworCQl9IHdoaWxlKG09PTI1NSk7CisJCXN3aXRjaChtKQorCQl7CisJCQljYXNlIEpQRUdfTUFSS0VSX1NPSToKKwkJCQkvKiB0aGlzIHR5cGUgb2YgbWFya2VyIGhhcyBubyBkYXRhLCBhbmQgc2hvdWxkIGJlIHNraXBwZWQgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgSlBFR19NQVJLRVJfQ09NOgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwOgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwKzE6CisJCQljYXNlIEpQRUdfTUFSS0VSX0FQUDArMjoKKwkJCWNhc2UgSlBFR19NQVJLRVJfQVBQMCszOgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwKzQ6CisJCQljYXNlIEpQRUdfTUFSS0VSX0FQUDArNToKKwkJCWNhc2UgSlBFR19NQVJLRVJfQVBQMCs2OgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwKzc6CisJCQljYXNlIEpQRUdfTUFSS0VSX0FQUDArODoKKwkJCWNhc2UgSlBFR19NQVJLRVJfQVBQMCs5OgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwKzEwOgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwKzExOgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwKzEyOgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwKzEzOgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwKzE0OgorCQkJY2FzZSBKUEVHX01BUktFUl9BUFAwKzE1OgorCQkJCS8qIHRoaXMgdHlwZSBvZiBtYXJrZXIgaGFzIGRhdGEsIGJ1dCBpdCBoYXMgbm8gdXNlIHRvIHVzIChhbmQgbm8gcGxhY2UgaGVyZSkgYW5kIHNob3VsZCBiZSBza2lwcGVkICovCisJCQkJaWYgKE9KUEVHUmVhZFdvcmQoc3AsJm4pPT0wKQorCQkJCQlyZXR1cm4oMCk7CisJCQkJaWYgKG48MikKKwkJCQl7CisJCQkJCWlmIChzcC0+c3Vic2FtcGxpbmdjb3JyZWN0PT0wKQorCQkJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJDb3JydXB0IEpQRUcgZGF0YSIpOworCQkJCQlyZXR1cm4oMCk7CisJCQkJfQorCQkJCWlmIChuPjIpCisJCQkJCU9KUEVHUmVhZFNraXAoc3Asbi0yKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSlBFR19NQVJLRVJfRFJJOgorCQkJCWlmIChPSlBFR1JlYWRIZWFkZXJJbmZvU2VjU3RyZWFtRHJpKHRpZik9PTApCisJCQkJCXJldHVybigwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSlBFR19NQVJLRVJfRFFUOgorCQkJCWlmIChPSlBFR1JlYWRIZWFkZXJJbmZvU2VjU3RyZWFtRHF0KHRpZik9PTApCisJCQkJCXJldHVybigwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSlBFR19NQVJLRVJfREhUOgorCQkJCWlmIChPSlBFR1JlYWRIZWFkZXJJbmZvU2VjU3RyZWFtRGh0KHRpZik9PTApCisJCQkJCXJldHVybigwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSlBFR19NQVJLRVJfU09GMDoKKwkJCWNhc2UgSlBFR19NQVJLRVJfU09GMToKKwkJCWNhc2UgSlBFR19NQVJLRVJfU09GMzoKKwkJCQlpZiAoT0pQRUdSZWFkSGVhZGVySW5mb1NlY1N0cmVhbVNvZih0aWYsbSk9PTApCisJCQkJCXJldHVybigwKTsKKwkJCQlpZiAoc3AtPnN1YnNhbXBsaW5nY29ycmVjdCE9MCkKKwkJCQkJcmV0dXJuKDEpOworCQkJCWJyZWFrOworCQkJY2FzZSBKUEVHX01BUktFUl9TT1M6CisJCQkJaWYgKHNwLT5zdWJzYW1wbGluZ2NvcnJlY3QhPTApCisJCQkJCXJldHVybigxKTsKKwkJCQlhc3NlcnQoc3AtPnBsYW5lX3NhbXBsZV9vZmZzZXQ9PTApOworCQkJCWlmIChPSlBFR1JlYWRIZWFkZXJJbmZvU2VjU3RyZWFtU29zKHRpZik9PTApCisJCQkJCXJldHVybigwKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJVbmtub3duIG1hcmtlciB0eXBlICVkIGluIEpQRUcgZGF0YSIsbSk7CisJCQkJcmV0dXJuKDApOworCQl9CisJfSB3aGlsZShtIT1KUEVHX01BUktFUl9TT1MpOworCWlmIChzcC0+c3Vic2FtcGxpbmdjb3JyZWN0KQorCQlyZXR1cm4oMSk7CisJaWYgKHNwLT5zb2ZfbG9nPT0wKQorCXsKKwkJaWYgKE9KUEVHUmVhZEhlYWRlckluZm9TZWNUYWJsZXNRVGFibGUodGlmKT09MCkKKwkJCXJldHVybigwKTsKKwkJc3AtPnNvZl9tYXJrZXJfaWQ9SlBFR19NQVJLRVJfU09GMDsKKwkJZm9yIChvPTA7IG88c3AtPnNhbXBsZXNfcGVyX3BpeGVsOyBvKyspCisJCQlzcC0+c29mX2Nbb109bzsKKwkJc3AtPnNvZl9odlswXT0oKHNwLT5zdWJzYW1wbGluZ19ob3I8PDQpfHNwLT5zdWJzYW1wbGluZ192ZXIpOworCQlmb3IgKG89MTsgbzxzcC0+c2FtcGxlc19wZXJfcGl4ZWw7IG8rKykKKwkJCXNwLT5zb2ZfaHZbb109MTc7CisJCXNwLT5zb2ZfeD1zcC0+c3RyaWxlX3dpZHRoOworCQlzcC0+c29mX3k9c3AtPnN0cmlsZV9sZW5ndGhfdG90YWw7CisJCXNwLT5zb2ZfbG9nPTE7CisJCWlmIChPSlBFR1JlYWRIZWFkZXJJbmZvU2VjVGFibGVzRGNUYWJsZSh0aWYpPT0wKQorCQkJcmV0dXJuKDApOworCQlpZiAoT0pQRUdSZWFkSGVhZGVySW5mb1NlY1RhYmxlc0FjVGFibGUodGlmKT09MCkKKwkJCXJldHVybigwKTsKKwkJZm9yIChvPTE7IG88c3AtPnNhbXBsZXNfcGVyX3BpeGVsOyBvKyspCisJCQlzcC0+c29zX2NzW29dPW87CisJfQorCXJldHVybigxKTsKK30KKworc3RhdGljIGludAorT0pQRUdSZWFkSGVhZGVySW5mb1NlY1N0cmVhbURyaShUSUZGKiB0aWYpCit7CisJLyogdGhpcyBjb3VsZCBlYXNpbGx5IGNhdXNlIHRyb3VibGUgaW4gc29tZSBjYXNlcy4uLiBidXQgbm8gc3VjaCBjYXNlcyBoYXZlIG9jY3VyZWQgc29mYXIgKi8KKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXT0iT0pQRUdSZWFkSGVhZGVySW5mb1NlY1N0cmVhbURyaSI7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJdWludDE2IG07CisJaWYgKE9KUEVHUmVhZFdvcmQoc3AsJm0pPT0wKQorCQlyZXR1cm4oMCk7CisJaWYgKG0hPTQpCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkNvcnJ1cHQgRFJJIG1hcmtlciBpbiBKUEVHIGRhdGEiKTsKKwkJcmV0dXJuKDApOworCX0KKwlpZiAoT0pQRUdSZWFkV29yZChzcCwmbSk9PTApCisJCXJldHVybigwKTsKKwlzcC0+cmVzdGFydF9pbnRlcnZhbD1tOworCXJldHVybigxKTsKK30KKworc3RhdGljIGludAorT0pQRUdSZWFkSGVhZGVySW5mb1NlY1N0cmVhbURxdChUSUZGKiB0aWYpCit7CisJLyogdGhpcyBpcyBhIHRhYmxlIG1hcmtlciwgYW5kIGl0IGlzIHRvIGJlIHNhdmVkIGFzIGEgd2hvbGUgZm9yIGV4YWN0IHB1c2hpbmcgb24gdGhlIGpwZWcgc3RyZWFtIGxhdGVyIG9uICovCisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW109Ik9KUEVHUmVhZEhlYWRlckluZm9TZWNTdHJlYW1EcXQiOworCU9KUEVHU3RhdGUqIHNwPShPSlBFR1N0YXRlKil0aWYtPnRpZl9kYXRhOworCXVpbnQxNiBtOworCXVpbnQzMiBuYTsKKwl1aW50OCogbmI7CisJdWludDggbzsKKwlpZiAoT0pQRUdSZWFkV29yZChzcCwmbSk9PTApCisJCXJldHVybigwKTsKKwlpZiAobTw9MikKKwl7CisJCWlmIChzcC0+c3Vic2FtcGxpbmdjb3JyZWN0PT0wKQorCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJDb3JydXB0IERRVCBtYXJrZXIgaW4gSlBFRyBkYXRhIik7CisJCXJldHVybigwKTsKKwl9CisJaWYgKHNwLT5zdWJzYW1wbGluZ2NvcnJlY3QhPTApCisJCU9KUEVHUmVhZFNraXAoc3AsbS0yKTsKKwllbHNlCisJeworCQltLT0yOworCQlkbworCQl7CisJCQlpZiAobTw2NSkKKwkJCXsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkNvcnJ1cHQgRFFUIG1hcmtlciBpbiBKUEVHIGRhdGEiKTsKKwkJCQlyZXR1cm4oMCk7CisJCQl9CisJCQluYT1zaXplb2YodWludDMyKSs2OTsKKwkJCW5iPV9USUZGbWFsbG9jKG5hKTsKKwkJCWlmIChuYj09MCkKKwkJCXsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKwkJCQlyZXR1cm4oMCk7CisJCQl9CisJCQkqKHVpbnQzMiopbmI9bmE7CisJCQluYltzaXplb2YodWludDMyKV09MjU1OworCQkJbmJbc2l6ZW9mKHVpbnQzMikrMV09SlBFR19NQVJLRVJfRFFUOworCQkJbmJbc2l6ZW9mKHVpbnQzMikrMl09MDsKKwkJCW5iW3NpemVvZih1aW50MzIpKzNdPTY3OworCQkJaWYgKE9KUEVHUmVhZEJsb2NrKHNwLDY1LCZuYltzaXplb2YodWludDMyKSs0XSk9PTApIHsKKwkJCQlfVElGRmZyZWUobmIpOworCQkJCXJldHVybigwKTsKKwkJCX0KKwkJCW89bmJbc2l6ZW9mKHVpbnQzMikrNF0mMTU7CisJCQlpZiAoMzxvKQorCQkJeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiQ29ycnVwdCBEUVQgbWFya2VyIGluIEpQRUcgZGF0YSIpOworCQkJCV9USUZGZnJlZShuYik7CisJCQkJcmV0dXJuKDApOworCQkJfQorCQkJaWYgKHNwLT5xdGFibGVbb10hPTApCisJCQkJX1RJRkZmcmVlKHNwLT5xdGFibGVbb10pOworCQkJc3AtPnF0YWJsZVtvXT1uYjsKKwkJCW0tPTY1OworCQl9IHdoaWxlKG0+MCk7CisJfQorCXJldHVybigxKTsKK30KKworc3RhdGljIGludAorT0pQRUdSZWFkSGVhZGVySW5mb1NlY1N0cmVhbURodChUSUZGKiB0aWYpCit7CisJLyogdGhpcyBpcyBhIHRhYmxlIG1hcmtlciwgYW5kIGl0IGlzIHRvIGJlIHNhdmVkIGFzIGEgd2hvbGUgZm9yIGV4YWN0IHB1c2hpbmcgb24gdGhlIGpwZWcgc3RyZWFtIGxhdGVyIG9uICovCisJLyogVE9ETzogdGhlIGZvbGxvd2luZyBhc3N1bWVzIHRoZXJlIGlzIG9ubHkgb25lIHRhYmxlIGluIHRoaXMgbWFya2VyLi4uIGJ1dCBpJ20gbm90IHF1aXRlIHN1cmUgdGhhdCBhc3N1bXB0aW9uIGlzIGd1YXJhbnRlZWQgY29ycmVjdCAqLworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdPSJPSlBFR1JlYWRIZWFkZXJJbmZvU2VjU3RyZWFtRGh0IjsKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwl1aW50MTYgbTsKKwl1aW50MzIgbmE7CisJdWludDgqIG5iOworCXVpbnQ4IG87CisJaWYgKE9KUEVHUmVhZFdvcmQoc3AsJm0pPT0wKQorCQlyZXR1cm4oMCk7CisJaWYgKG08PTIpCisJeworCQlpZiAoc3AtPnN1YnNhbXBsaW5nY29ycmVjdD09MCkKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiQ29ycnVwdCBESFQgbWFya2VyIGluIEpQRUcgZGF0YSIpOworCQlyZXR1cm4oMCk7CisJfQorCWlmIChzcC0+c3Vic2FtcGxpbmdjb3JyZWN0IT0wKQorCXsKKwkJT0pQRUdSZWFkU2tpcChzcCxtLTIpOworCX0KKwllbHNlCisJeworCQluYT1zaXplb2YodWludDMyKSsyK207CisJCW5iPV9USUZGbWFsbG9jKG5hKTsKKwkJaWYgKG5iPT0wKQorCQl7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKwkJCXJldHVybigwKTsKKwkJfQorCQkqKHVpbnQzMiopbmI9bmE7CisJCW5iW3NpemVvZih1aW50MzIpXT0yNTU7CisJCW5iW3NpemVvZih1aW50MzIpKzFdPUpQRUdfTUFSS0VSX0RIVDsKKwkJbmJbc2l6ZW9mKHVpbnQzMikrMl09KG0+PjgpOworCQluYltzaXplb2YodWludDMyKSszXT0obSYyNTUpOworCQlpZiAoT0pQRUdSZWFkQmxvY2soc3AsbS0yLCZuYltzaXplb2YodWludDMyKSs0XSk9PTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9USUZGZnJlZShuYik7CisJCQlyZXR1cm4oMCk7CisgICAgICAgICAgICAgICAgfQorCQlvPW5iW3NpemVvZih1aW50MzIpKzRdOworCQlpZiAoKG8mMjQwKT09MCkKKwkJeworCQkJaWYgKDM8bykKKwkJCXsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkNvcnJ1cHQgREhUIG1hcmtlciBpbiBKUEVHIGRhdGEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RJRkZmcmVlKG5iKTsKKwkJCQlyZXR1cm4oMCk7CisJCQl9CisJCQlpZiAoc3AtPmRjdGFibGVbb10hPTApCisJCQkJX1RJRkZmcmVlKHNwLT5kY3RhYmxlW29dKTsKKwkJCXNwLT5kY3RhYmxlW29dPW5iOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKChvJjI0MCkhPTE2KQorCQkJeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiQ29ycnVwdCBESFQgbWFya2VyIGluIEpQRUcgZGF0YSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVElGRmZyZWUobmIpOworCQkJCXJldHVybigwKTsKKwkJCX0KKwkJCW8mPTE1OworCQkJaWYgKDM8bykKKwkJCXsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkNvcnJ1cHQgREhUIG1hcmtlciBpbiBKUEVHIGRhdGEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RJRkZmcmVlKG5iKTsKKwkJCQlyZXR1cm4oMCk7CisJCQl9CisJCQlpZiAoc3AtPmFjdGFibGVbb10hPTApCisJCQkJX1RJRkZmcmVlKHNwLT5hY3RhYmxlW29dKTsKKwkJCXNwLT5hY3RhYmxlW29dPW5iOworCQl9CisJfQorCXJldHVybigxKTsKK30KKworc3RhdGljIGludAorT0pQRUdSZWFkSGVhZGVySW5mb1NlY1N0cmVhbVNvZihUSUZGKiB0aWYsIHVpbnQ4IG1hcmtlcl9pZCkKK3sKKwkvKiB0aGlzIG1hcmtlciBuZWVkcyB0byBiZSBjaGVja2VkLCBhbmQgcGFydCBvZiBpdHMgZGF0YSBuZWVkcyB0byBiZSBzYXZlZCBmb3IgcmVnZW5lcmF0aW9uIGxhdGVyIG9uICovCisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW109Ik9KUEVHUmVhZEhlYWRlckluZm9TZWNTdHJlYW1Tb2YiOworCU9KUEVHU3RhdGUqIHNwPShPSlBFR1N0YXRlKil0aWYtPnRpZl9kYXRhOworCXVpbnQxNiBtOworCXVpbnQxNiBuOworCXVpbnQ4IG87CisJdWludDE2IHA7CisJdWludDE2IHE7CisJaWYgKHNwLT5zb2ZfbG9nIT0wKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJDb3JydXB0IEpQRUcgZGF0YSIpOworCQlyZXR1cm4oMCk7CisJfQorCWlmIChzcC0+c3Vic2FtcGxpbmdjb3JyZWN0PT0wKQorCQlzcC0+c29mX21hcmtlcl9pZD1tYXJrZXJfaWQ7CisJLyogTGY6IGRhdGEgbGVuZ3RoICovCisJaWYgKE9KUEVHUmVhZFdvcmQoc3AsJm0pPT0wKQorCQlyZXR1cm4oMCk7CisJaWYgKG08MTEpCisJeworCQlpZiAoc3AtPnN1YnNhbXBsaW5nY29ycmVjdD09MCkKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiQ29ycnVwdCBTT0YgbWFya2VyIGluIEpQRUcgZGF0YSIpOworCQlyZXR1cm4oMCk7CisJfQorCW0tPTg7CisJaWYgKG0lMyE9MCkKKwl7CisJCWlmIChzcC0+c3Vic2FtcGxpbmdjb3JyZWN0PT0wKQorCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJDb3JydXB0IFNPRiBtYXJrZXIgaW4gSlBFRyBkYXRhIik7CisJCXJldHVybigwKTsKKwl9CisJbj1tLzM7CisJaWYgKHNwLT5zdWJzYW1wbGluZ2NvcnJlY3Q9PTApCisJeworCQlpZiAobiE9c3AtPnNhbXBsZXNfcGVyX3BpeGVsKQorCQl7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkpQRUcgY29tcHJlc3NlZCBkYXRhIGluZGljYXRlcyB1bmV4cGVjdGVkIG51bWJlciBvZiBzYW1wbGVzIik7CisJCQlyZXR1cm4oMCk7CisJCX0KKwl9CisJLyogUDogU2FtcGxlIHByZWNpc2lvbiAqLworCWlmIChPSlBFR1JlYWRCeXRlKHNwLCZvKT09MCkKKwkJcmV0dXJuKDApOworCWlmIChvIT04KQorCXsKKwkJaWYgKHNwLT5zdWJzYW1wbGluZ2NvcnJlY3Q9PTApCisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkpQRUcgY29tcHJlc3NlZCBkYXRhIGluZGljYXRlcyB1bmV4cGVjdGVkIG51bWJlciBvZiBiaXRzIHBlciBzYW1wbGUiKTsKKwkJcmV0dXJuKDApOworCX0KKwkvKiBZOiBOdW1iZXIgb2YgbGluZXMsIFg6IE51bWJlciBvZiBzYW1wbGVzIHBlciBsaW5lICovCisJaWYgKHNwLT5zdWJzYW1wbGluZ2NvcnJlY3QpCisJCU9KUEVHUmVhZFNraXAoc3AsNCk7CisJZWxzZQorCXsKKwkJLyogWTogTnVtYmVyIG9mIGxpbmVzICovCisJCWlmIChPSlBFR1JlYWRXb3JkKHNwLCZwKT09MCkKKwkJCXJldHVybigwKTsKKwkJaWYgKCgodWludDMyKXA8c3AtPmltYWdlX2xlbmd0aCkgJiYgKCh1aW50MzIpcDxzcC0+c3RyaWxlX2xlbmd0aF90b3RhbCkpCisJCXsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiSlBFRyBjb21wcmVzc2VkIGRhdGEgaW5kaWNhdGVzIHVuZXhwZWN0ZWQgaGVpZ2h0Iik7CisJCQlyZXR1cm4oMCk7CisJCX0KKwkJc3AtPnNvZl95PXA7CisJCS8qIFg6IE51bWJlciBvZiBzYW1wbGVzIHBlciBsaW5lICovCisJCWlmIChPSlBFR1JlYWRXb3JkKHNwLCZwKT09MCkKKwkJCXJldHVybigwKTsKKwkJaWYgKCgodWludDMyKXA8c3AtPmltYWdlX3dpZHRoKSAmJiAoKHVpbnQzMilwPHNwLT5zdHJpbGVfd2lkdGgpKQorCQl7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkpQRUcgY29tcHJlc3NlZCBkYXRhIGluZGljYXRlcyB1bmV4cGVjdGVkIHdpZHRoIik7CisJCQlyZXR1cm4oMCk7CisJCX0KKwkJaWYgKCh1aW50MzIpcD5zcC0+c3RyaWxlX3dpZHRoKQorCQl7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkpQRUcgY29tcHJlc3NlZCBkYXRhIGltYWdlIHdpZHRoIGV4Y2VlZHMgZXhwZWN0ZWQgaW1hZ2Ugd2lkdGgiKTsKKwkJCXJldHVybigwKTsKKwkJfQorCQlzcC0+c29mX3g9cDsKKwl9CisJLyogTmY6IE51bWJlciBvZiBpbWFnZSBjb21wb25lbnRzIGluIGZyYW1lICovCisJaWYgKE9KUEVHUmVhZEJ5dGUoc3AsJm8pPT0wKQorCQlyZXR1cm4oMCk7CisJaWYgKG8hPW4pCisJeworCQlpZiAoc3AtPnN1YnNhbXBsaW5nY29ycmVjdD09MCkKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiQ29ycnVwdCBTT0YgbWFya2VyIGluIEpQRUcgZGF0YSIpOworCQlyZXR1cm4oMCk7CisJfQorCS8qIHBlciBjb21wb25lbnQgc3R1ZmYgKi8KKwkvKiBUT0RPOiBkb3VibGUtY2hlY2sgdGhhdCBmbG93IGltcGxpZXMgdGhhdCBuIGNhbm5vdCBiZSBhcyBiaWcgYXMgdG8gbWFrZSB1cyBvdmVyZmxvdyBzb2ZfYywgc29mX2h2IGFuZCBzb2ZfdHEgYXJyYXlzICovCisJZm9yIChxPTA7IHE8bjsgcSsrKQorCXsKKwkJLyogQzogQ29tcG9uZW50IGlkZW50aWZpZXIgKi8KKwkJaWYgKE9KUEVHUmVhZEJ5dGUoc3AsJm8pPT0wKQorCQkJcmV0dXJuKDApOworCQlpZiAoc3AtPnN1YnNhbXBsaW5nY29ycmVjdD09MCkKKwkJCXNwLT5zb2ZfY1txXT1vOworCQkvKiBIOiBIb3Jpem9udGFsIHNhbXBsaW5nIGZhY3RvciwgYW5kIFY6IFZlcnRpY2FsIHNhbXBsaW5nIGZhY3RvciAqLworCQlpZiAoT0pQRUdSZWFkQnl0ZShzcCwmbyk9PTApCisJCQlyZXR1cm4oMCk7CisJCWlmIChzcC0+c3Vic2FtcGxpbmdjb3JyZWN0IT0wKQorCQl7CisJCQlpZiAocT09MCkKKwkJCXsKKwkJCQlzcC0+c3Vic2FtcGxpbmdfaG9yPShvPj40KTsKKwkJCQlzcC0+c3Vic2FtcGxpbmdfdmVyPShvJjE1KTsKKwkJCQlpZiAoKChzcC0+c3Vic2FtcGxpbmdfaG9yIT0xKSAmJiAoc3AtPnN1YnNhbXBsaW5nX2hvciE9MikgJiYgKHNwLT5zdWJzYW1wbGluZ19ob3IhPTQpKSB8fAorCQkJCQkoKHNwLT5zdWJzYW1wbGluZ192ZXIhPTEpICYmIChzcC0+c3Vic2FtcGxpbmdfdmVyIT0yKSAmJiAoc3AtPnN1YnNhbXBsaW5nX3ZlciE9NCkpKQorCQkJCQlzcC0+c3Vic2FtcGxpbmdfZm9yY2VfZGVzdWJzYW1wbGluZ19pbnNpZGVfZGVjb21wcmVzc2lvbj0xOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmIChvIT0xNykKKwkJCQkJc3AtPnN1YnNhbXBsaW5nX2ZvcmNlX2Rlc3Vic2FtcGxpbmdfaW5zaWRlX2RlY29tcHJlc3Npb249MTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXNwLT5zb2ZfaHZbcV09bzsKKwkJCWlmIChzcC0+c3Vic2FtcGxpbmdfZm9yY2VfZGVzdWJzYW1wbGluZ19pbnNpZGVfZGVjb21wcmVzc2lvbj09MCkKKwkJCXsKKwkJCQlpZiAocT09MCkKKwkJCQl7CisJCQkJCWlmIChvIT0oKHNwLT5zdWJzYW1wbGluZ19ob3I8PDQpfHNwLT5zdWJzYW1wbGluZ192ZXIpKQorCQkJCQl7CisJCQkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkpQRUcgY29tcHJlc3NlZCBkYXRhIGluZGljYXRlcyB1bmV4cGVjdGVkIHN1YnNhbXBsaW5nIHZhbHVlcyIpOworCQkJCQkJcmV0dXJuKDApOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlmIChvIT0xNykKKwkJCQkJeworCQkJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJKUEVHIGNvbXByZXNzZWQgZGF0YSBpbmRpY2F0ZXMgdW5leHBlY3RlZCBzdWJzYW1wbGluZyB2YWx1ZXMiKTsKKwkJCQkJCXJldHVybigwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQkvKiBUcTogUXVhbnRpemF0aW9uIHRhYmxlIGRlc3RpbmF0aW9uIHNlbGVjdG9yICovCisJCWlmIChPSlBFR1JlYWRCeXRlKHNwLCZvKT09MCkKKwkJCXJldHVybigwKTsKKwkJaWYgKHNwLT5zdWJzYW1wbGluZ2NvcnJlY3Q9PTApCisJCQlzcC0+c29mX3RxW3FdPW87CisJfQorCWlmIChzcC0+c3Vic2FtcGxpbmdjb3JyZWN0PT0wKQorCQlzcC0+c29mX2xvZz0xOworCXJldHVybigxKTsKK30KKworc3RhdGljIGludAorT0pQRUdSZWFkSGVhZGVySW5mb1NlY1N0cmVhbVNvcyhUSUZGKiB0aWYpCit7CisJLyogdGhpcyBtYXJrZXIgbmVlZHMgdG8gYmUgY2hlY2tlZCwgYW5kIHBhcnQgb2YgaXRzIGRhdGEgbmVlZHMgdG8gYmUgc2F2ZWQgZm9yIHJlZ2VuZXJhdGlvbiBsYXRlciBvbiAqLworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdPSJPSlBFR1JlYWRIZWFkZXJJbmZvU2VjU3RyZWFtU29zIjsKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwl1aW50MTYgbTsKKwl1aW50OCBuOworCXVpbnQ4IG87CisJYXNzZXJ0KHNwLT5zdWJzYW1wbGluZ2NvcnJlY3Q9PTApOworCWlmIChzcC0+c29mX2xvZz09MCkKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiQ29ycnVwdCBTT1MgbWFya2VyIGluIEpQRUcgZGF0YSIpOworCQlyZXR1cm4oMCk7CisJfQorCS8qIExzICovCisJaWYgKE9KUEVHUmVhZFdvcmQoc3AsJm0pPT0wKQorCQlyZXR1cm4oMCk7CisJaWYgKG0hPTYrc3AtPnNhbXBsZXNfcGVyX3BpeGVsX3Blcl9wbGFuZSoyKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJDb3JydXB0IFNPUyBtYXJrZXIgaW4gSlBFRyBkYXRhIik7CisJCXJldHVybigwKTsKKwl9CisJLyogTnMgKi8KKwlpZiAoT0pQRUdSZWFkQnl0ZShzcCwmbik9PTApCisJCXJldHVybigwKTsKKwlpZiAobiE9c3AtPnNhbXBsZXNfcGVyX3BpeGVsX3Blcl9wbGFuZSkKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiQ29ycnVwdCBTT1MgbWFya2VyIGluIEpQRUcgZGF0YSIpOworCQlyZXR1cm4oMCk7CisJfQorCS8qIENzLCBUZCwgYW5kIFRhICovCisJZm9yIChvPTA7IG88c3AtPnNhbXBsZXNfcGVyX3BpeGVsX3Blcl9wbGFuZTsgbysrKQorCXsKKwkJLyogQ3MgKi8KKwkJaWYgKE9KUEVHUmVhZEJ5dGUoc3AsJm4pPT0wKQorCQkJcmV0dXJuKDApOworCQlzcC0+c29zX2NzW3NwLT5wbGFuZV9zYW1wbGVfb2Zmc2V0K29dPW47CisJCS8qIFRkIGFuZCBUYSAqLworCQlpZiAoT0pQRUdSZWFkQnl0ZShzcCwmbik9PTApCisJCQlyZXR1cm4oMCk7CisJCXNwLT5zb3NfdGRhW3NwLT5wbGFuZV9zYW1wbGVfb2Zmc2V0K29dPW47CisJfQorCS8qIHNraXAgU3MsIFNlLCBBaCwgZW4gQWwgLT4gbm8gY2hlY2ssIGFzIHBlciBUb20gTGFuZSByZWNvbW1lbmRhdGlvbiwgYXMgcGVyIExpYkpwZWcgc291cmNlICovCisJT0pQRUdSZWFkU2tpcChzcCwzKTsKKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyBpbnQKK09KUEVHUmVhZEhlYWRlckluZm9TZWNUYWJsZXNRVGFibGUoVElGRiogdGlmKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdPSJPSlBFR1JlYWRIZWFkZXJJbmZvU2VjVGFibGVzUVRhYmxlIjsKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwl1aW50OCBtOworCXVpbnQ4IG47CisJdWludDMyIG9hOworCXVpbnQ4KiBvYjsKKwl1aW50MzIgcDsKKwlpZiAoc3AtPnF0YWJsZV9vZmZzZXRbMF09PTApCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk1pc3NpbmcgSlBFRyB0YWJsZXMiKTsKKwkJcmV0dXJuKDApOworCX0KKwlzcC0+aW5fYnVmZmVyX2ZpbGVfcG9zX2xvZz0wOworCWZvciAobT0wOyBtPHNwLT5zYW1wbGVzX3Blcl9waXhlbDsgbSsrKQorCXsKKwkJaWYgKChzcC0+cXRhYmxlX29mZnNldFttXSE9MCkgJiYgKChtPT0wKSB8fCAoc3AtPnF0YWJsZV9vZmZzZXRbbV0hPXNwLT5xdGFibGVfb2Zmc2V0W20tMV0pKSkKKwkJeworCQkJZm9yIChuPTA7IG48bS0xOyBuKyspCisJCQl7CisJCQkJaWYgKHNwLT5xdGFibGVfb2Zmc2V0W21dPT1zcC0+cXRhYmxlX29mZnNldFtuXSkKKwkJCQl7CisJCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiQ29ycnVwdCBKcGVnUVRhYmxlcyB0YWcgdmFsdWUiKTsKKwkJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCX0KKwkJCW9hPXNpemVvZih1aW50MzIpKzY5OworCQkJb2I9X1RJRkZtYWxsb2Mob2EpOworCQkJaWYgKG9iPT0wKQorCQkJeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiT3V0IG9mIG1lbW9yeSIpOworCQkJCXJldHVybigwKTsKKwkJCX0KKwkJCSoodWludDMyKilvYj1vYTsKKwkJCW9iW3NpemVvZih1aW50MzIpXT0yNTU7CisJCQlvYltzaXplb2YodWludDMyKSsxXT1KUEVHX01BUktFUl9EUVQ7CisJCQlvYltzaXplb2YodWludDMyKSsyXT0wOworCQkJb2Jbc2l6ZW9mKHVpbnQzMikrM109Njc7CisJCQlvYltzaXplb2YodWludDMyKSs0XT1tOworCQkJVElGRlNlZWtGaWxlKHRpZixzcC0+cXRhYmxlX29mZnNldFttXSxTRUVLX1NFVCk7IAorCQkJcD1USUZGUmVhZEZpbGUodGlmLCZvYltzaXplb2YodWludDMyKSs1XSw2NCk7CisJCQlpZiAocCE9NjQpCisJCQkJcmV0dXJuKDApOworCQkJc3AtPnF0YWJsZVttXT1vYjsKKwkJCXNwLT5zb2ZfdHFbbV09bTsKKwkJfQorCQllbHNlCisJCQlzcC0+c29mX3RxW21dPXNwLT5zb2ZfdHFbbS0xXTsKKwl9CisJcmV0dXJuKDEpOworfQorCitzdGF0aWMgaW50CitPSlBFR1JlYWRIZWFkZXJJbmZvU2VjVGFibGVzRGNUYWJsZShUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW109Ik9KUEVHUmVhZEhlYWRlckluZm9TZWNUYWJsZXNEY1RhYmxlIjsKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwl1aW50OCBtOworCXVpbnQ4IG47CisJdWludDggb1sxNl07CisJdWludDMyIHA7CisJdWludDMyIHE7CisJdWludDMyIHJhOworCXVpbnQ4KiByYjsKKwlpZiAoc3AtPmRjdGFibGVfb2Zmc2V0WzBdPT0wKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJNaXNzaW5nIEpQRUcgdGFibGVzIik7CisJCXJldHVybigwKTsKKwl9CisJc3AtPmluX2J1ZmZlcl9maWxlX3Bvc19sb2c9MDsKKwlmb3IgKG09MDsgbTxzcC0+c2FtcGxlc19wZXJfcGl4ZWw7IG0rKykKKwl7CisJCWlmICgoc3AtPmRjdGFibGVfb2Zmc2V0W21dIT0wKSAmJiAoKG09PTApIHx8IChzcC0+ZGN0YWJsZV9vZmZzZXRbbV0hPXNwLT5kY3RhYmxlX29mZnNldFttLTFdKSkpCisJCXsKKwkJCWZvciAobj0wOyBuPG0tMTsgbisrKQorCQkJeworCQkJCWlmIChzcC0+ZGN0YWJsZV9vZmZzZXRbbV09PXNwLT5kY3RhYmxlX29mZnNldFtuXSkKKwkJCQl7CisJCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiQ29ycnVwdCBKcGVnRGNUYWJsZXMgdGFnIHZhbHVlIik7CisJCQkJCXJldHVybigwKTsKKwkJCQl9CisJCQl9CisJCQlUSUZGU2Vla0ZpbGUodGlmLHNwLT5kY3RhYmxlX29mZnNldFttXSxTRUVLX1NFVCk7CisJCQlwPVRJRkZSZWFkRmlsZSh0aWYsbywxNik7CisJCQlpZiAocCE9MTYpCisJCQkJcmV0dXJuKDApOworCQkJcT0wOworCQkJZm9yIChuPTA7IG48MTY7IG4rKykKKwkJCQlxKz1vW25dOworCQkJcmE9c2l6ZW9mKHVpbnQzMikrMjErcTsKKwkJCXJiPV9USUZGbWFsbG9jKHJhKTsKKwkJCWlmIChyYj09MCkKKwkJCXsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIk91dCBvZiBtZW1vcnkiKTsKKwkJCQlyZXR1cm4oMCk7CisJCQl9CisJCQkqKHVpbnQzMiopcmI9cmE7CisJCQlyYltzaXplb2YodWludDMyKV09MjU1OworCQkJcmJbc2l6ZW9mKHVpbnQzMikrMV09SlBFR19NQVJLRVJfREhUOworCQkJcmJbc2l6ZW9mKHVpbnQzMikrMl09KCgxOStxKT4+OCk7CisJCQlyYltzaXplb2YodWludDMyKSszXT0oKDE5K3EpJjI1NSk7CisJCQlyYltzaXplb2YodWludDMyKSs0XT1tOworCQkJZm9yIChuPTA7IG48MTY7IG4rKykKKwkJCQlyYltzaXplb2YodWludDMyKSs1K25dPW9bbl07CisJCQlwPVRJRkZSZWFkRmlsZSh0aWYsJihyYltzaXplb2YodWludDMyKSsyMV0pLHEpOworCQkJaWYgKHAhPXEpCisJCQkJcmV0dXJuKDApOworCQkJc3AtPmRjdGFibGVbbV09cmI7CisJCQlzcC0+c29zX3RkYVttXT0obTw8NCk7CisJCX0KKwkJZWxzZQorCQkJc3AtPnNvc190ZGFbbV09c3AtPnNvc190ZGFbbS0xXTsKKwl9CisJcmV0dXJuKDEpOworfQorCitzdGF0aWMgaW50CitPSlBFR1JlYWRIZWFkZXJJbmZvU2VjVGFibGVzQWNUYWJsZShUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW109Ik9KUEVHUmVhZEhlYWRlckluZm9TZWNUYWJsZXNBY1RhYmxlIjsKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwl1aW50OCBtOworCXVpbnQ4IG47CisJdWludDggb1sxNl07CisJdWludDMyIHA7CisJdWludDMyIHE7CisJdWludDMyIHJhOworCXVpbnQ4KiByYjsKKwlpZiAoc3AtPmFjdGFibGVfb2Zmc2V0WzBdPT0wKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJNaXNzaW5nIEpQRUcgdGFibGVzIik7CisJCXJldHVybigwKTsKKwl9CisJc3AtPmluX2J1ZmZlcl9maWxlX3Bvc19sb2c9MDsKKwlmb3IgKG09MDsgbTxzcC0+c2FtcGxlc19wZXJfcGl4ZWw7IG0rKykKKwl7CisJCWlmICgoc3AtPmFjdGFibGVfb2Zmc2V0W21dIT0wKSAmJiAoKG09PTApIHx8IChzcC0+YWN0YWJsZV9vZmZzZXRbbV0hPXNwLT5hY3RhYmxlX29mZnNldFttLTFdKSkpCisJCXsKKwkJCWZvciAobj0wOyBuPG0tMTsgbisrKQorCQkJeworCQkJCWlmIChzcC0+YWN0YWJsZV9vZmZzZXRbbV09PXNwLT5hY3RhYmxlX29mZnNldFtuXSkKKwkJCQl7CisJCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiQ29ycnVwdCBKcGVnQWNUYWJsZXMgdGFnIHZhbHVlIik7CisJCQkJCXJldHVybigwKTsKKwkJCQl9CisJCQl9CisJCQlUSUZGU2Vla0ZpbGUodGlmLHNwLT5hY3RhYmxlX29mZnNldFttXSxTRUVLX1NFVCk7ICAKKwkJCXA9VElGRlJlYWRGaWxlKHRpZixvLDE2KTsKKwkJCWlmIChwIT0xNikKKwkJCQlyZXR1cm4oMCk7CisJCQlxPTA7CisJCQlmb3IgKG49MDsgbjwxNjsgbisrKQorCQkJCXErPW9bbl07CisJCQlyYT1zaXplb2YodWludDMyKSsyMStxOworCQkJcmI9X1RJRkZtYWxsb2MocmEpOworCQkJaWYgKHJiPT0wKQorCQkJeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiT3V0IG9mIG1lbW9yeSIpOworCQkJCXJldHVybigwKTsKKwkJCX0KKwkJCSoodWludDMyKilyYj1yYTsKKwkJCXJiW3NpemVvZih1aW50MzIpXT0yNTU7CisJCQlyYltzaXplb2YodWludDMyKSsxXT1KUEVHX01BUktFUl9ESFQ7CisJCQlyYltzaXplb2YodWludDMyKSsyXT0oKDE5K3EpPj44KTsKKwkJCXJiW3NpemVvZih1aW50MzIpKzNdPSgoMTkrcSkmMjU1KTsKKwkJCXJiW3NpemVvZih1aW50MzIpKzRdPSgxNnxtKTsKKwkJCWZvciAobj0wOyBuPDE2OyBuKyspCisJCQkJcmJbc2l6ZW9mKHVpbnQzMikrNStuXT1vW25dOworCQkJcD1USUZGUmVhZEZpbGUodGlmLCYocmJbc2l6ZW9mKHVpbnQzMikrMjFdKSxxKTsKKwkJCWlmIChwIT1xKQorCQkJCXJldHVybigwKTsKKwkJCXNwLT5hY3RhYmxlW21dPXJiOworCQkJc3AtPnNvc190ZGFbbV09KHNwLT5zb3NfdGRhW21dfG0pOworCQl9CisJCWVsc2UKKwkJCXNwLT5zb3NfdGRhW21dPShzcC0+c29zX3RkYVttXXwoc3AtPnNvc190ZGFbbS0xXSYxNSkpOworCX0KKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyBpbnQKK09KUEVHUmVhZEJ1ZmZlckZpbGwoT0pQRUdTdGF0ZSogc3ApCit7CisJdWludDE2IG07CisJdG1zaXplX3QgbjsKKwkvKiBUT0RPOiBkb3VibGUtY2hlY2s6IHdoZW4gc3Vic2FtcGxpbmdjb3JyZWN0IGlzIHNldCwgbm8gY2FsbCB0byBUSUZGRXJyb3JFeHQgb3IgVElGRldhcm5pbmdFeHQgc2hvdWxkIGJlIG1hZGUKKwkgKiBpbiBhbnkgb3RoZXIgY2FzZSwgc2VlayBvciByZWFkIGVycm9ycyBzaG91bGQgYmUgcGFzc2VkIHRocm91Z2ggKi8KKwlkbworCXsKKwkJaWYgKHNwLT5pbl9idWZmZXJfZmlsZV90b2dvIT0wKQorCQl7CisJCQlpZiAoc3AtPmluX2J1ZmZlcl9maWxlX3Bvc19sb2c9PTApCisJCQl7CisJCQkJVElGRlNlZWtGaWxlKHNwLT50aWYsc3AtPmluX2J1ZmZlcl9maWxlX3BvcyxTRUVLX1NFVCk7CisJCQkJc3AtPmluX2J1ZmZlcl9maWxlX3Bvc19sb2c9MTsKKwkJCX0KKwkJCW09T0pQRUdfQlVGRkVSOworCQkJaWYgKCh1aW50NjQpbT5zcC0+aW5fYnVmZmVyX2ZpbGVfdG9nbykKKwkJCQltPSh1aW50MTYpc3AtPmluX2J1ZmZlcl9maWxlX3RvZ287CisJCQluPVRJRkZSZWFkRmlsZShzcC0+dGlmLHNwLT5pbl9idWZmZXIsKHRtc2l6ZV90KW0pOworCQkJaWYgKG49PTApCisJCQkJcmV0dXJuKDApOworCQkJYXNzZXJ0KG4+MCk7CisJCQlhc3NlcnQobjw9T0pQRUdfQlVGRkVSKTsKKwkJCWFzc2VydChuPDY1NTM2KTsKKwkJCWFzc2VydCgodWludDY0KW48PXNwLT5pbl9idWZmZXJfZmlsZV90b2dvKTsKKwkJCW09KHVpbnQxNiluOworCQkJc3AtPmluX2J1ZmZlcl90b2dvPW07CisJCQlzcC0+aW5fYnVmZmVyX2N1cj1zcC0+aW5fYnVmZmVyOworCQkJc3AtPmluX2J1ZmZlcl9maWxlX3RvZ28tPW07CisJCQlzcC0+aW5fYnVmZmVyX2ZpbGVfcG9zKz1tOworCQkJYnJlYWs7CisJCX0KKwkJc3AtPmluX2J1ZmZlcl9maWxlX3Bvc19sb2c9MDsKKwkJc3dpdGNoKHNwLT5pbl9idWZmZXJfc291cmNlKQorCQl7CisJCQljYXNlIG9zaWJzTm90U2V0WWV0OgorCQkJCWlmIChzcC0+anBlZ19pbnRlcmNoYW5nZV9mb3JtYXQhPTApCisJCQkJeworCQkJCQlzcC0+aW5fYnVmZmVyX2ZpbGVfcG9zPXNwLT5qcGVnX2ludGVyY2hhbmdlX2Zvcm1hdDsKKwkJCQkJc3AtPmluX2J1ZmZlcl9maWxlX3RvZ289c3AtPmpwZWdfaW50ZXJjaGFuZ2VfZm9ybWF0X2xlbmd0aDsKKwkJCQl9CisJCQkJc3AtPmluX2J1ZmZlcl9zb3VyY2U9b3NpYnNKcGVnSW50ZXJjaGFuZ2VGb3JtYXQ7CisJCQkJYnJlYWs7CisJCQljYXNlIG9zaWJzSnBlZ0ludGVyY2hhbmdlRm9ybWF0OgorCQkJCXNwLT5pbl9idWZmZXJfc291cmNlPW9zaWJzU3RyaWxlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCWNhc2Ugb3NpYnNTdHJpbGU6CisJCQkJaWYgKCFfVElGRkZpbGxTdHJpbGVzKCBzcC0+dGlmICkgCisJCQkJICAgIHx8IHNwLT50aWYtPnRpZl9kaXIudGRfc3RyaXBvZmZzZXQgPT0gTlVMTAorCQkJCSAgICB8fCBzcC0+dGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50ID09IE5VTEwpCisJCQkJCXJldHVybiAwOworCisJCQkJaWYgKHNwLT5pbl9idWZmZXJfbmV4dF9zdHJpbGU9PXNwLT5pbl9idWZmZXJfc3RyaWxlX2NvdW50KQorCQkJCQlzcC0+aW5fYnVmZmVyX3NvdXJjZT1vc2lic0VvZjsKKwkJCQllbHNlCisJCQkJeworCQkJCQlzcC0+aW5fYnVmZmVyX2ZpbGVfcG9zPXNwLT50aWYtPnRpZl9kaXIudGRfc3RyaXBvZmZzZXRbc3AtPmluX2J1ZmZlcl9uZXh0X3N0cmlsZV07CisJCQkJCWlmIChzcC0+aW5fYnVmZmVyX2ZpbGVfcG9zIT0wKQorCQkJCQl7CisJCQkJCQlpZiAoc3AtPmluX2J1ZmZlcl9maWxlX3Bvcz49c3AtPmZpbGVfc2l6ZSkKKwkJCQkJCQlzcC0+aW5fYnVmZmVyX2ZpbGVfcG9zPTA7CisJCQkJCQllbHNlIGlmIChzcC0+dGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50PT1OVUxMKQorCQkJCQkJCXNwLT5pbl9idWZmZXJfZmlsZV90b2dvPXNwLT5maWxlX3NpemUtc3AtPmluX2J1ZmZlcl9maWxlX3BvczsKKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlpZiAoc3AtPnRpZi0+dGlmX2Rpci50ZF9zdHJpcGJ5dGVjb3VudCA9PSAwKSB7CisJCQkJCQkJCVRJRkZFcnJvckV4dChzcC0+dGlmLT50aWZfY2xpZW50ZGF0YSxzcC0+dGlmLT50aWZfbmFtZSwiU3RyaXAgYnl0ZSBjb3VudHMgYXJlIG1pc3NpbmciKTsKKwkJCQkJCQkJcmV0dXJuKDApOworCQkJCQkJCX0KKwkJCQkJCQlzcC0+aW5fYnVmZmVyX2ZpbGVfdG9nbz1zcC0+dGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50W3NwLT5pbl9idWZmZXJfbmV4dF9zdHJpbGVdOworCQkJCQkJCWlmIChzcC0+aW5fYnVmZmVyX2ZpbGVfdG9nbz09MCkKKwkJCQkJCQkJc3AtPmluX2J1ZmZlcl9maWxlX3Bvcz0wOworCQkJCQkJCWVsc2UgaWYgKHNwLT5pbl9idWZmZXJfZmlsZV9wb3Mrc3AtPmluX2J1ZmZlcl9maWxlX3RvZ28+c3AtPmZpbGVfc2l6ZSkKKwkJCQkJCQkJc3AtPmluX2J1ZmZlcl9maWxlX3RvZ289c3AtPmZpbGVfc2l6ZS1zcC0+aW5fYnVmZmVyX2ZpbGVfcG9zOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXNwLT5pbl9idWZmZXJfbmV4dF9zdHJpbGUrKzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybigwKTsKKwkJfQorCX0gd2hpbGUgKDEpOworCXJldHVybigxKTsKK30KKworc3RhdGljIGludAorT0pQRUdSZWFkQnl0ZShPSlBFR1N0YXRlKiBzcCwgdWludDgqIGJ5dGUpCit7CisJaWYgKHNwLT5pbl9idWZmZXJfdG9nbz09MCkKKwl7CisJCWlmIChPSlBFR1JlYWRCdWZmZXJGaWxsKHNwKT09MCkKKwkJCXJldHVybigwKTsKKwkJYXNzZXJ0KHNwLT5pbl9idWZmZXJfdG9nbz4wKTsKKwl9CisJKmJ5dGU9KihzcC0+aW5fYnVmZmVyX2N1cik7CisJc3AtPmluX2J1ZmZlcl9jdXIrKzsKKwlzcC0+aW5fYnVmZmVyX3RvZ28tLTsKKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyBpbnQKK09KUEVHUmVhZEJ5dGVQZWVrKE9KUEVHU3RhdGUqIHNwLCB1aW50OCogYnl0ZSkKK3sKKwlpZiAoc3AtPmluX2J1ZmZlcl90b2dvPT0wKQorCXsKKwkJaWYgKE9KUEVHUmVhZEJ1ZmZlckZpbGwoc3ApPT0wKQorCQkJcmV0dXJuKDApOworCQlhc3NlcnQoc3AtPmluX2J1ZmZlcl90b2dvPjApOworCX0KKwkqYnl0ZT0qKHNwLT5pbl9idWZmZXJfY3VyKTsKKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyB2b2lkCitPSlBFR1JlYWRCeXRlQWR2YW5jZShPSlBFR1N0YXRlKiBzcCkKK3sKKwlhc3NlcnQoc3AtPmluX2J1ZmZlcl90b2dvPjApOworCXNwLT5pbl9idWZmZXJfY3VyKys7CisJc3AtPmluX2J1ZmZlcl90b2dvLS07Cit9CisKK3N0YXRpYyBpbnQKK09KUEVHUmVhZFdvcmQoT0pQRUdTdGF0ZSogc3AsIHVpbnQxNiogd29yZCkKK3sKKwl1aW50OCBtOworCWlmIChPSlBFR1JlYWRCeXRlKHNwLCZtKT09MCkKKwkJcmV0dXJuKDApOworCSp3b3JkPShtPDw4KTsKKwlpZiAoT0pQRUdSZWFkQnl0ZShzcCwmbSk9PTApCisJCXJldHVybigwKTsKKwkqd29yZHw9bTsKKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyBpbnQKK09KUEVHUmVhZEJsb2NrKE9KUEVHU3RhdGUqIHNwLCB1aW50MTYgbGVuLCB2b2lkKiBtZW0pCit7CisJdWludDE2IG1sZW47CisJdWludDgqIG1tZW07CisJdWludDE2IG47CisJYXNzZXJ0KGxlbj4wKTsKKwltbGVuPWxlbjsKKwltbWVtPW1lbTsKKwlkbworCXsKKwkJaWYgKHNwLT5pbl9idWZmZXJfdG9nbz09MCkKKwkJeworCQkJaWYgKE9KUEVHUmVhZEJ1ZmZlckZpbGwoc3ApPT0wKQorCQkJCXJldHVybigwKTsKKwkJCWFzc2VydChzcC0+aW5fYnVmZmVyX3RvZ28+MCk7CisJCX0KKwkJbj1tbGVuOworCQlpZiAobj5zcC0+aW5fYnVmZmVyX3RvZ28pCisJCQluPXNwLT5pbl9idWZmZXJfdG9nbzsKKwkJX1RJRkZtZW1jcHkobW1lbSxzcC0+aW5fYnVmZmVyX2N1cixuKTsKKwkJc3AtPmluX2J1ZmZlcl9jdXIrPW47CisJCXNwLT5pbl9idWZmZXJfdG9nby09bjsKKwkJbWxlbi09bjsKKwkJbW1lbSs9bjsKKwl9IHdoaWxlKG1sZW4+MCk7CisJcmV0dXJuKDEpOworfQorCitzdGF0aWMgdm9pZAorT0pQRUdSZWFkU2tpcChPSlBFR1N0YXRlKiBzcCwgdWludDE2IGxlbikKK3sKKwl1aW50MTYgbTsKKwl1aW50MTYgbjsKKwltPWxlbjsKKwluPW07CisJaWYgKG4+c3AtPmluX2J1ZmZlcl90b2dvKQorCQluPXNwLT5pbl9idWZmZXJfdG9nbzsKKwlzcC0+aW5fYnVmZmVyX2N1cis9bjsKKwlzcC0+aW5fYnVmZmVyX3RvZ28tPW47CisJbS09bjsKKwlpZiAobT4wKQorCXsKKwkJYXNzZXJ0KHNwLT5pbl9idWZmZXJfdG9nbz09MCk7CisJCW49bTsKKwkJaWYgKCh1aW50NjQpbj5zcC0+aW5fYnVmZmVyX2ZpbGVfdG9nbykKKwkJCW49KHVpbnQxNilzcC0+aW5fYnVmZmVyX2ZpbGVfdG9nbzsKKwkJc3AtPmluX2J1ZmZlcl9maWxlX3Bvcys9bjsKKwkJc3AtPmluX2J1ZmZlcl9maWxlX3RvZ28tPW47CisJCXNwLT5pbl9idWZmZXJfZmlsZV9wb3NfbG9nPTA7CisJCS8qIHdlIGRvbid0IHNraXAgcGFzdCBqcGVnaW50ZXJjaGFuZ2Vmb3JtYXQvc3RyaWxlIGJsb2NrLi4uCisJCSAqIGlmIHRoYXQgaXMgYXNrZWQgZnJvbSB1cywgd2UncmUgZGVhbGluZyB3aXRoIHRvdGFsbHkgYmF6dXJrCisJCSAqIGRhdGEgYW55d2F5LCBhbmQgd2UndmUgbm90IHNlZW4gdGhpcyBoYXBwZW5pbmcgb24gYW55CisJCSAqIHRlc3RmaWxlLCBzbyB3ZSBtaWdodCBhcyB3ZWxsIGxpa2VseSBjYXVzZSBzb21lIG90aGVyCisJCSAqIG1lYW5pbmdsZXNzIGVycm9yIHRvIGJlIHBhc3NlZCBhdCBzb21lIGxhdGVyIHRpbWUKKwkJICovCisJfQorfQorCitzdGF0aWMgaW50CitPSlBFR1dyaXRlU3RyZWFtKFRJRkYqIHRpZiwgdm9pZCoqIG1lbSwgdWludDMyKiBsZW4pCit7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJKmxlbj0wOworCWRvCisJeworCQlhc3NlcnQoc3AtPm91dF9zdGF0ZTw9b3Nvc0VvaSk7CisJCXN3aXRjaChzcC0+b3V0X3N0YXRlKQorCQl7CisJCQljYXNlIG9zb3NTb2k6CisJCQkJT0pQRUdXcml0ZVN0cmVhbVNvaSh0aWYsbWVtLGxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIG9zb3NRVGFibGUwOgorCQkJCU9KUEVHV3JpdGVTdHJlYW1RVGFibGUodGlmLDAsbWVtLGxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIG9zb3NRVGFibGUxOgorCQkJCU9KUEVHV3JpdGVTdHJlYW1RVGFibGUodGlmLDEsbWVtLGxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIG9zb3NRVGFibGUyOgorCQkJCU9KUEVHV3JpdGVTdHJlYW1RVGFibGUodGlmLDIsbWVtLGxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIG9zb3NRVGFibGUzOgorCQkJCU9KUEVHV3JpdGVTdHJlYW1RVGFibGUodGlmLDMsbWVtLGxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIG9zb3NEY1RhYmxlMDoKKwkJCQlPSlBFR1dyaXRlU3RyZWFtRGNUYWJsZSh0aWYsMCxtZW0sbGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2Ugb3Nvc0RjVGFibGUxOgorCQkJCU9KUEVHV3JpdGVTdHJlYW1EY1RhYmxlKHRpZiwxLG1lbSxsZW4pOworCQkJCWJyZWFrOworCQkJY2FzZSBvc29zRGNUYWJsZTI6CisJCQkJT0pQRUdXcml0ZVN0cmVhbURjVGFibGUodGlmLDIsbWVtLGxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIG9zb3NEY1RhYmxlMzoKKwkJCQlPSlBFR1dyaXRlU3RyZWFtRGNUYWJsZSh0aWYsMyxtZW0sbGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2Ugb3Nvc0FjVGFibGUwOgorCQkJCU9KUEVHV3JpdGVTdHJlYW1BY1RhYmxlKHRpZiwwLG1lbSxsZW4pOworCQkJCWJyZWFrOworCQkJY2FzZSBvc29zQWNUYWJsZTE6CisJCQkJT0pQRUdXcml0ZVN0cmVhbUFjVGFibGUodGlmLDEsbWVtLGxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIG9zb3NBY1RhYmxlMjoKKwkJCQlPSlBFR1dyaXRlU3RyZWFtQWNUYWJsZSh0aWYsMixtZW0sbGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2Ugb3Nvc0FjVGFibGUzOgorCQkJCU9KUEVHV3JpdGVTdHJlYW1BY1RhYmxlKHRpZiwzLG1lbSxsZW4pOworCQkJCWJyZWFrOworCQkJY2FzZSBvc29zRHJpOgorCQkJCU9KUEVHV3JpdGVTdHJlYW1EcmkodGlmLG1lbSxsZW4pOworCQkJCWJyZWFrOworCQkJY2FzZSBvc29zU29mOgorCQkJCU9KUEVHV3JpdGVTdHJlYW1Tb2YodGlmLG1lbSxsZW4pOworCQkJCWJyZWFrOworCQkJY2FzZSBvc29zU29zOgorCQkJCU9KUEVHV3JpdGVTdHJlYW1Tb3ModGlmLG1lbSxsZW4pOworCQkJCWJyZWFrOworCQkJY2FzZSBvc29zQ29tcHJlc3NlZDoKKwkJCQlpZiAoT0pQRUdXcml0ZVN0cmVhbUNvbXByZXNzZWQodGlmLG1lbSxsZW4pPT0wKQorCQkJCQlyZXR1cm4oMCk7CisJCQkJYnJlYWs7CisJCQljYXNlIG9zb3NSc3Q6CisJCQkJT0pQRUdXcml0ZVN0cmVhbVJzdCh0aWYsbWVtLGxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIG9zb3NFb2k6CisJCQkJT0pQRUdXcml0ZVN0cmVhbUVvaSh0aWYsbWVtLGxlbik7CisJCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICgqbGVuPT0wKTsKKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyB2b2lkCitPSlBFR1dyaXRlU3RyZWFtU29pKFRJRkYqIHRpZiwgdm9pZCoqIG1lbSwgdWludDMyKiBsZW4pCit7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJYXNzZXJ0KE9KUEVHX0JVRkZFUj49Mik7CisJc3AtPm91dF9idWZmZXJbMF09MjU1OworCXNwLT5vdXRfYnVmZmVyWzFdPUpQRUdfTUFSS0VSX1NPSTsKKwkqbGVuPTI7CisJKm1lbT0odm9pZCopc3AtPm91dF9idWZmZXI7CisJc3AtPm91dF9zdGF0ZSsrOworfQorCitzdGF0aWMgdm9pZAorT0pQRUdXcml0ZVN0cmVhbVFUYWJsZShUSUZGKiB0aWYsIHVpbnQ4IHRhYmxlX2luZGV4LCB2b2lkKiogbWVtLCB1aW50MzIqIGxlbikKK3sKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwlpZiAoc3AtPnF0YWJsZVt0YWJsZV9pbmRleF0hPTApCisJeworCQkqbWVtPSh2b2lkKikoc3AtPnF0YWJsZVt0YWJsZV9pbmRleF0rc2l6ZW9mKHVpbnQzMikpOworCQkqbGVuPSooKHVpbnQzMiopc3AtPnF0YWJsZVt0YWJsZV9pbmRleF0pLXNpemVvZih1aW50MzIpOworCX0KKwlzcC0+b3V0X3N0YXRlKys7Cit9CisKK3N0YXRpYyB2b2lkCitPSlBFR1dyaXRlU3RyZWFtRGNUYWJsZShUSUZGKiB0aWYsIHVpbnQ4IHRhYmxlX2luZGV4LCB2b2lkKiogbWVtLCB1aW50MzIqIGxlbikKK3sKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwlpZiAoc3AtPmRjdGFibGVbdGFibGVfaW5kZXhdIT0wKQorCXsKKwkJKm1lbT0odm9pZCopKHNwLT5kY3RhYmxlW3RhYmxlX2luZGV4XStzaXplb2YodWludDMyKSk7CisJCSpsZW49KigodWludDMyKilzcC0+ZGN0YWJsZVt0YWJsZV9pbmRleF0pLXNpemVvZih1aW50MzIpOworCX0KKwlzcC0+b3V0X3N0YXRlKys7Cit9CisKK3N0YXRpYyB2b2lkCitPSlBFR1dyaXRlU3RyZWFtQWNUYWJsZShUSUZGKiB0aWYsIHVpbnQ4IHRhYmxlX2luZGV4LCB2b2lkKiogbWVtLCB1aW50MzIqIGxlbikKK3sKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwlpZiAoc3AtPmFjdGFibGVbdGFibGVfaW5kZXhdIT0wKQorCXsKKwkJKm1lbT0odm9pZCopKHNwLT5hY3RhYmxlW3RhYmxlX2luZGV4XStzaXplb2YodWludDMyKSk7CisJCSpsZW49KigodWludDMyKilzcC0+YWN0YWJsZVt0YWJsZV9pbmRleF0pLXNpemVvZih1aW50MzIpOworCX0KKwlzcC0+b3V0X3N0YXRlKys7Cit9CisKK3N0YXRpYyB2b2lkCitPSlBFR1dyaXRlU3RyZWFtRHJpKFRJRkYqIHRpZiwgdm9pZCoqIG1lbSwgdWludDMyKiBsZW4pCit7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJYXNzZXJ0KE9KUEVHX0JVRkZFUj49Nik7CisJaWYgKHNwLT5yZXN0YXJ0X2ludGVydmFsIT0wKQorCXsKKwkJc3AtPm91dF9idWZmZXJbMF09MjU1OworCQlzcC0+b3V0X2J1ZmZlclsxXT1KUEVHX01BUktFUl9EUkk7CisJCXNwLT5vdXRfYnVmZmVyWzJdPTA7CisJCXNwLT5vdXRfYnVmZmVyWzNdPTQ7CisJCXNwLT5vdXRfYnVmZmVyWzRdPShzcC0+cmVzdGFydF9pbnRlcnZhbD4+OCk7CisJCXNwLT5vdXRfYnVmZmVyWzVdPShzcC0+cmVzdGFydF9pbnRlcnZhbCYyNTUpOworCQkqbGVuPTY7CisJCSptZW09KHZvaWQqKXNwLT5vdXRfYnVmZmVyOworCX0KKwlzcC0+b3V0X3N0YXRlKys7Cit9CisKK3N0YXRpYyB2b2lkCitPSlBFR1dyaXRlU3RyZWFtU29mKFRJRkYqIHRpZiwgdm9pZCoqIG1lbSwgdWludDMyKiBsZW4pCit7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJdWludDggbTsKKwlhc3NlcnQoT0pQRUdfQlVGRkVSPj0yKzgrc3AtPnNhbXBsZXNfcGVyX3BpeGVsX3Blcl9wbGFuZSozKTsKKwlhc3NlcnQoMjU1Pj04K3NwLT5zYW1wbGVzX3Blcl9waXhlbF9wZXJfcGxhbmUqMyk7CisJc3AtPm91dF9idWZmZXJbMF09MjU1OworCXNwLT5vdXRfYnVmZmVyWzFdPXNwLT5zb2ZfbWFya2VyX2lkOworCS8qIExmICovCisJc3AtPm91dF9idWZmZXJbMl09MDsKKwlzcC0+b3V0X2J1ZmZlclszXT04K3NwLT5zYW1wbGVzX3Blcl9waXhlbF9wZXJfcGxhbmUqMzsKKwkvKiBQICovCisJc3AtPm91dF9idWZmZXJbNF09ODsKKwkvKiBZICovCisJc3AtPm91dF9idWZmZXJbNV09KHNwLT5zb2ZfeT4+OCk7CisJc3AtPm91dF9idWZmZXJbNl09KHNwLT5zb2ZfeSYyNTUpOworCS8qIFggKi8KKwlzcC0+b3V0X2J1ZmZlcls3XT0oc3AtPnNvZl94Pj44KTsKKwlzcC0+b3V0X2J1ZmZlcls4XT0oc3AtPnNvZl94JjI1NSk7CisJLyogTmYgKi8KKwlzcC0+b3V0X2J1ZmZlcls5XT1zcC0+c2FtcGxlc19wZXJfcGl4ZWxfcGVyX3BsYW5lOworCWZvciAobT0wOyBtPHNwLT5zYW1wbGVzX3Blcl9waXhlbF9wZXJfcGxhbmU7IG0rKykKKwl7CisJCS8qIEMgKi8KKwkJc3AtPm91dF9idWZmZXJbMTArbSozXT1zcC0+c29mX2Nbc3AtPnBsYW5lX3NhbXBsZV9vZmZzZXQrbV07CisJCS8qIEggYW5kIFYgKi8KKwkJc3AtPm91dF9idWZmZXJbMTArbSozKzFdPXNwLT5zb2ZfaHZbc3AtPnBsYW5lX3NhbXBsZV9vZmZzZXQrbV07CisJCS8qIFRxICovCisJCXNwLT5vdXRfYnVmZmVyWzEwK20qMysyXT1zcC0+c29mX3RxW3NwLT5wbGFuZV9zYW1wbGVfb2Zmc2V0K21dOworCX0KKwkqbGVuPTEwK3NwLT5zYW1wbGVzX3Blcl9waXhlbF9wZXJfcGxhbmUqMzsKKwkqbWVtPSh2b2lkKilzcC0+b3V0X2J1ZmZlcjsKKwlzcC0+b3V0X3N0YXRlKys7Cit9CisKK3N0YXRpYyB2b2lkCitPSlBFR1dyaXRlU3RyZWFtU29zKFRJRkYqIHRpZiwgdm9pZCoqIG1lbSwgdWludDMyKiBsZW4pCit7CisJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CisJdWludDggbTsKKwlhc3NlcnQoT0pQRUdfQlVGRkVSPj0yKzYrc3AtPnNhbXBsZXNfcGVyX3BpeGVsX3Blcl9wbGFuZSoyKTsKKwlhc3NlcnQoMjU1Pj02K3NwLT5zYW1wbGVzX3Blcl9waXhlbF9wZXJfcGxhbmUqMik7CisJc3AtPm91dF9idWZmZXJbMF09MjU1OworCXNwLT5vdXRfYnVmZmVyWzFdPUpQRUdfTUFSS0VSX1NPUzsKKwkvKiBMcyAqLworCXNwLT5vdXRfYnVmZmVyWzJdPTA7CisJc3AtPm91dF9idWZmZXJbM109NitzcC0+c2FtcGxlc19wZXJfcGl4ZWxfcGVyX3BsYW5lKjI7CisJLyogTnMgKi8KKwlzcC0+b3V0X2J1ZmZlcls0XT1zcC0+c2FtcGxlc19wZXJfcGl4ZWxfcGVyX3BsYW5lOworCWZvciAobT0wOyBtPHNwLT5zYW1wbGVzX3Blcl9waXhlbF9wZXJfcGxhbmU7IG0rKykKKwl7CisJCS8qIENzICovCisJCXNwLT5vdXRfYnVmZmVyWzUrbSoyXT1zcC0+c29zX2NzW3NwLT5wbGFuZV9zYW1wbGVfb2Zmc2V0K21dOworCQkvKiBUZCBhbmQgVGEgKi8KKwkJc3AtPm91dF9idWZmZXJbNSttKjIrMV09c3AtPnNvc190ZGFbc3AtPnBsYW5lX3NhbXBsZV9vZmZzZXQrbV07CisJfQorCS8qIFNzICovCisJc3AtPm91dF9idWZmZXJbNStzcC0+c2FtcGxlc19wZXJfcGl4ZWxfcGVyX3BsYW5lKjJdPTA7CisJLyogU2UgKi8KKwlzcC0+b3V0X2J1ZmZlcls1K3NwLT5zYW1wbGVzX3Blcl9waXhlbF9wZXJfcGxhbmUqMisxXT02MzsKKwkvKiBBaCBhbmQgQWwgKi8KKwlzcC0+b3V0X2J1ZmZlcls1K3NwLT5zYW1wbGVzX3Blcl9waXhlbF9wZXJfcGxhbmUqMisyXT0wOworCSpsZW49OCtzcC0+c2FtcGxlc19wZXJfcGl4ZWxfcGVyX3BsYW5lKjI7CisJKm1lbT0odm9pZCopc3AtPm91dF9idWZmZXI7CisJc3AtPm91dF9zdGF0ZSsrOworfQorCitzdGF0aWMgaW50CitPSlBFR1dyaXRlU3RyZWFtQ29tcHJlc3NlZChUSUZGKiB0aWYsIHZvaWQqKiBtZW0sIHVpbnQzMiogbGVuKQoreworCU9KUEVHU3RhdGUqIHNwPShPSlBFR1N0YXRlKil0aWYtPnRpZl9kYXRhOworCWlmIChzcC0+aW5fYnVmZmVyX3RvZ289PTApCisJeworCQlpZiAoT0pQRUdSZWFkQnVmZmVyRmlsbChzcCk9PTApCisJCQlyZXR1cm4oMCk7CisJCWFzc2VydChzcC0+aW5fYnVmZmVyX3RvZ28+MCk7CisJfQorCSpsZW49c3AtPmluX2J1ZmZlcl90b2dvOworCSptZW09KHZvaWQqKXNwLT5pbl9idWZmZXJfY3VyOworCXNwLT5pbl9idWZmZXJfdG9nbz0wOworCWlmIChzcC0+aW5fYnVmZmVyX2ZpbGVfdG9nbz09MCkKKwl7CisJCXN3aXRjaChzcC0+aW5fYnVmZmVyX3NvdXJjZSkKKwkJeworCQkJY2FzZSBvc2lic1N0cmlsZToKKwkJCQlpZiAoc3AtPmluX2J1ZmZlcl9uZXh0X3N0cmlsZTxzcC0+aW5fYnVmZmVyX3N0cmlsZV9jb3VudCkKKwkJCQkJc3AtPm91dF9zdGF0ZT1vc29zUnN0OworCQkJCWVsc2UKKwkJCQkJc3AtPm91dF9zdGF0ZT1vc29zRW9pOworCQkJCWJyZWFrOworCQkJY2FzZSBvc2lic0VvZjoKKwkJCQlzcC0+b3V0X3N0YXRlPW9zb3NFb2k7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQl9CisJfQorCXJldHVybigxKTsKK30KKworc3RhdGljIHZvaWQKK09KUEVHV3JpdGVTdHJlYW1Sc3QoVElGRiogdGlmLCB2b2lkKiogbWVtLCB1aW50MzIqIGxlbikKK3sKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwlhc3NlcnQoT0pQRUdfQlVGRkVSPj0yKTsKKwlzcC0+b3V0X2J1ZmZlclswXT0yNTU7CisJc3AtPm91dF9idWZmZXJbMV09SlBFR19NQVJLRVJfUlNUMCtzcC0+cmVzdGFydF9pbmRleDsKKwlzcC0+cmVzdGFydF9pbmRleCsrOworCWlmIChzcC0+cmVzdGFydF9pbmRleD09OCkKKwkJc3AtPnJlc3RhcnRfaW5kZXg9MDsKKwkqbGVuPTI7CisJKm1lbT0odm9pZCopc3AtPm91dF9idWZmZXI7CisJc3AtPm91dF9zdGF0ZT1vc29zQ29tcHJlc3NlZDsKK30KKworc3RhdGljIHZvaWQKK09KUEVHV3JpdGVTdHJlYW1Fb2koVElGRiogdGlmLCB2b2lkKiogbWVtLCB1aW50MzIqIGxlbikKK3sKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwlhc3NlcnQoT0pQRUdfQlVGRkVSPj0yKTsKKwlzcC0+b3V0X2J1ZmZlclswXT0yNTU7CisJc3AtPm91dF9idWZmZXJbMV09SlBFR19NQVJLRVJfRU9JOworCSpsZW49MjsKKwkqbWVtPSh2b2lkKilzcC0+b3V0X2J1ZmZlcjsKK30KKworI2lmbmRlZiBMSUJKUEVHX0VOQ0FQX0VYVEVSTkFMCitzdGF0aWMgaW50CitqcGVnX2NyZWF0ZV9kZWNvbXByZXNzX2VuY2FwKE9KUEVHU3RhdGUqIHNwLCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBjaW5mbykKK3sKKwlyZXR1cm4oU0VUSk1QKHNwLT5leGl0X2ptcGJ1Zik/MDooanBlZ19jcmVhdGVfZGVjb21wcmVzcyhjaW5mbyksMSkpOworfQorI2VuZGlmCisKKyNpZm5kZWYgTElCSlBFR19FTkNBUF9FWFRFUk5BTAorc3RhdGljIGludAoranBlZ19yZWFkX2hlYWRlcl9lbmNhcChPSlBFR1N0YXRlKiBzcCwganBlZ19kZWNvbXByZXNzX3N0cnVjdCogY2luZm8sIHVpbnQ4IHJlcXVpcmVfaW1hZ2UpCit7CisJcmV0dXJuKFNFVEpNUChzcC0+ZXhpdF9qbXBidWYpPzA6KGpwZWdfcmVhZF9oZWFkZXIoY2luZm8scmVxdWlyZV9pbWFnZSksMSkpOworfQorI2VuZGlmCisKKyNpZm5kZWYgTElCSlBFR19FTkNBUF9FWFRFUk5BTAorc3RhdGljIGludAoranBlZ19zdGFydF9kZWNvbXByZXNzX2VuY2FwKE9KUEVHU3RhdGUqIHNwLCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBjaW5mbykKK3sKKwlyZXR1cm4oU0VUSk1QKHNwLT5leGl0X2ptcGJ1Zik/MDooanBlZ19zdGFydF9kZWNvbXByZXNzKGNpbmZvKSwxKSk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBMSUJKUEVHX0VOQ0FQX0VYVEVSTkFMCitzdGF0aWMgaW50CitqcGVnX3JlYWRfc2NhbmxpbmVzX2VuY2FwKE9KUEVHU3RhdGUqIHNwLCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBjaW5mbywgdm9pZCogc2NhbmxpbmVzLCB1aW50MzIgbWF4X2xpbmVzKQoreworCXJldHVybihTRVRKTVAoc3AtPmV4aXRfam1wYnVmKT8wOihqcGVnX3JlYWRfc2NhbmxpbmVzKGNpbmZvLHNjYW5saW5lcyxtYXhfbGluZXMpLDEpKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIExJQkpQRUdfRU5DQVBfRVhURVJOQUwKK3N0YXRpYyBpbnQKK2pwZWdfcmVhZF9yYXdfZGF0YV9lbmNhcChPSlBFR1N0YXRlKiBzcCwganBlZ19kZWNvbXByZXNzX3N0cnVjdCogY2luZm8sIHZvaWQqIGRhdGEsIHVpbnQzMiBtYXhfbGluZXMpCit7CisJcmV0dXJuKFNFVEpNUChzcC0+ZXhpdF9qbXBidWYpPzA6KGpwZWdfcmVhZF9yYXdfZGF0YShjaW5mbyxkYXRhLG1heF9saW5lcyksMSkpOworfQorI2VuZGlmCisKKyNpZm5kZWYgTElCSlBFR19FTkNBUF9FWFRFUk5BTAorc3RhdGljIHZvaWQKK2pwZWdfZW5jYXBfdW53aW5kKFRJRkYqIHRpZikKK3sKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwlMT05HSk1QKHNwLT5leGl0X2ptcGJ1ZiwxKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorT0pQRUdMaWJqcGVnSnBlZ0Vycm9yTWdyT3V0cHV0TWVzc2FnZShqcGVnX2NvbW1vbl9zdHJ1Y3QqIGNpbmZvKQoreworCWNoYXIgYnVmZmVyW0pNU0dfTEVOR1RIX01BWF07CisJKCpjaW5mby0+ZXJyLT5mb3JtYXRfbWVzc2FnZSkoY2luZm8sYnVmZmVyKTsKKwlUSUZGV2FybmluZ0V4dCgoKFRJRkYqKShjaW5mby0+Y2xpZW50X2RhdGEpKS0+dGlmX2NsaWVudGRhdGEsIkxpYkpwZWciLCIlcyIsYnVmZmVyKTsKK30KKworc3RhdGljIHZvaWQKK09KUEVHTGlianBlZ0pwZWdFcnJvck1nckVycm9yRXhpdChqcGVnX2NvbW1vbl9zdHJ1Y3QqIGNpbmZvKQoreworCWNoYXIgYnVmZmVyW0pNU0dfTEVOR1RIX01BWF07CisJKCpjaW5mby0+ZXJyLT5mb3JtYXRfbWVzc2FnZSkoY2luZm8sYnVmZmVyKTsKKwlUSUZGRXJyb3JFeHQoKChUSUZGKikoY2luZm8tPmNsaWVudF9kYXRhKSktPnRpZl9jbGllbnRkYXRhLCJMaWJKcGVnIiwiJXMiLGJ1ZmZlcik7CisJanBlZ19lbmNhcF91bndpbmQoKFRJRkYqKShjaW5mby0+Y2xpZW50X2RhdGEpKTsKK30KKworc3RhdGljIHZvaWQKK09KUEVHTGlianBlZ0pwZWdTb3VyY2VNZ3JJbml0U291cmNlKGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNpbmZvKQoreworCSh2b2lkKWNpbmZvOworfQorCitzdGF0aWMgYm9vbGVhbgorT0pQRUdMaWJqcGVnSnBlZ1NvdXJjZU1nckZpbGxJbnB1dEJ1ZmZlcihqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBjaW5mbykKK3sKKwlUSUZGKiB0aWY9KFRJRkYqKWNpbmZvLT5jbGllbnRfZGF0YTsKKwlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKKwl2b2lkKiBtZW09MDsKKwl1aW50MzIgbGVuPTBVOworCWlmIChPSlBFR1dyaXRlU3RyZWFtKHRpZiwmbWVtLCZsZW4pPT0wKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIkxpYkpwZWciLCJQcmVtYXR1cmUgZW5kIG9mIEpQRUcgZGF0YSIpOworCQlqcGVnX2VuY2FwX3Vud2luZCh0aWYpOworCX0KKwlzcC0+bGlianBlZ19qcGVnX3NvdXJjZV9tZ3IuYnl0ZXNfaW5fYnVmZmVyPWxlbjsKKwlzcC0+bGlianBlZ19qcGVnX3NvdXJjZV9tZ3IubmV4dF9pbnB1dF9ieXRlPW1lbTsKKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyB2b2lkCitPSlBFR0xpYmpwZWdKcGVnU291cmNlTWdyU2tpcElucHV0RGF0YShqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBjaW5mbywgbG9uZyBudW1fYnl0ZXMpCit7CisJVElGRiogdGlmPShUSUZGKiljaW5mby0+Y2xpZW50X2RhdGE7CisJKHZvaWQpbnVtX2J5dGVzOworCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCJMaWJKcGVnIiwiVW5leHBlY3RlZCBlcnJvciIpOworCWpwZWdfZW5jYXBfdW53aW5kKHRpZik7Cit9CisKK3N0YXRpYyBib29sZWFuCitPSlBFR0xpYmpwZWdKcGVnU291cmNlTWdyUmVzeW5jVG9SZXN0YXJ0KGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNpbmZvLCBpbnQgZGVzaXJlZCkKK3sKKwlUSUZGKiB0aWY9KFRJRkYqKWNpbmZvLT5jbGllbnRfZGF0YTsKKwkodm9pZClkZXNpcmVkOworCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCJMaWJKcGVnIiwiVW5leHBlY3RlZCBlcnJvciIpOworCWpwZWdfZW5jYXBfdW53aW5kKHRpZik7CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgdm9pZAorT0pQRUdMaWJqcGVnSnBlZ1NvdXJjZU1nclRlcm1Tb3VyY2UoanBlZ19kZWNvbXByZXNzX3N0cnVjdCogY2luZm8pCit7CisJKHZvaWQpY2luZm87Cit9CisKKyNlbmRpZgorCisKKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBjCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogZmlsbC1jb2x1bW46IDc4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX29wZW4uYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX29wZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yzg4MzI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfb3Blbi5jCkBAIC0wLDAgKzEsNzI1IEBACisvKiAkSWQ6IHRpZl9vcGVuLmMsdiAxLjQ2IDIwMTAtMTItMDYgMTY6NTQ6NTQgZmF4Z3V5IEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVElGRiBMaWJyYXJ5LgorICovCisjaW5jbHVkZSAidGlmZmlvcC5oIgorCisvKgorICogRHVtbXkgZnVuY3Rpb25zIHRvIGZpbGwgdGhlIG9taXR0ZWQgY2xpZW50IHByb2NlZHVyZXMuCisgKi8KK3N0YXRpYyBpbnQKK190aWZmRHVtbXlNYXBQcm9jKHRoYW5kbGVfdCBmZCwgdm9pZCoqIHBiYXNlLCB0b2ZmX3QqIHBzaXplKQoreworCSh2b2lkKSBmZDsgKHZvaWQpIHBiYXNlOyAodm9pZCkgcHNpemU7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQKK190aWZmRHVtbXlVbm1hcFByb2ModGhhbmRsZV90IGZkLCB2b2lkKiBiYXNlLCB0b2ZmX3Qgc2l6ZSkKK3sKKwkodm9pZCkgZmQ7ICh2b2lkKSBiYXNlOyAodm9pZCkgc2l6ZTsKK30KKworaW50CitfVElGRmdldE1vZGUoY29uc3QgY2hhciogbW9kZSwgY29uc3QgY2hhciogbW9kdWxlKQoreworCWludCBtID0gLTE7CisKKwlzd2l0Y2ggKG1vZGVbMF0pIHsKKwljYXNlICdyJzoKKwkJbSA9IE9fUkRPTkxZOworCQlpZiAobW9kZVsxXSA9PSAnKycpCisJCQltID0gT19SRFdSOworCQlicmVhazsKKwljYXNlICd3JzoKKwljYXNlICdhJzoKKwkJbSA9IE9fUkRXUnxPX0NSRUFUOworCQlpZiAobW9kZVswXSA9PSAndycpCisJCQltIHw9IE9fVFJVTkM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVRJRkZFcnJvckV4dCgwLCBtb2R1bGUsICJcIiVzXCI6IEJhZCBtb2RlIiwgbW9kZSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gKG0pOworfQorCitUSUZGKgorVElGRkNsaWVudE9wZW4oCisJY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogbW9kZSwKKwl0aGFuZGxlX3QgY2xpZW50ZGF0YSwKKwlUSUZGUmVhZFdyaXRlUHJvYyByZWFkcHJvYywKKwlUSUZGUmVhZFdyaXRlUHJvYyB3cml0ZXByb2MsCisJVElGRlNlZWtQcm9jIHNlZWtwcm9jLAorCVRJRkZDbG9zZVByb2MgY2xvc2Vwcm9jLAorCVRJRkZTaXplUHJvYyBzaXplcHJvYywKKwlUSUZGTWFwRmlsZVByb2MgbWFwcHJvYywKKwlUSUZGVW5tYXBGaWxlUHJvYyB1bm1hcHByb2MKKykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGQ2xpZW50T3BlbiI7CisJVElGRiAqdGlmOworCWludCBtOworCWNvbnN0IGNoYXIqIGNwOworCisJLyogVGhlIGZvbGxvd2luZyBhcmUgY29uZmlndXJhdGlvbiBjaGVja3MuIFRoZXkgc2hvdWxkIGJlIHJlZHVuZGFudCwgYnV0IHNob3VsZCBub3QKKwkgKiBjb21waWxlIHRvIGFueSBhY3R1YWwgY29kZSBpbiBhbiBvcHRpbWlzZWQgcmVsZWFzZSBidWlsZCBhbnl3YXkuIElmIGFueSBvZiB0aGVtCisJICogZmFpbCwgKG1ha2VmaWxlLWJhc2VkIG9yIG90aGVyKSBjb25maWd1cmF0aW9uIGlzIG5vdCBjb3JyZWN0ICovCisJYXNzZXJ0KHNpemVvZih1aW50OCk9PTEpOworCWFzc2VydChzaXplb2YoaW50OCk9PTEpOworCWFzc2VydChzaXplb2YodWludDE2KT09Mik7CisJYXNzZXJ0KHNpemVvZihpbnQxNik9PTIpOworCWFzc2VydChzaXplb2YodWludDMyKT09NCk7CisJYXNzZXJ0KHNpemVvZihpbnQzMik9PTQpOworCWFzc2VydChzaXplb2YodWludDY0KT09OCk7CisJYXNzZXJ0KHNpemVvZihpbnQ2NCk9PTgpOworCWFzc2VydChzaXplb2YodG1zaXplX3QpPT1zaXplb2Yodm9pZCopKTsKKwl7CisJCXVuaW9ueworCQkJdWludDggYThbMl07CisJCQl1aW50MTYgYTE2OworCQl9IG47CisJCW4uYThbMF09MTsKKwkJbi5hOFsxXT0wOworCQkjaWZkZWYgV09SRFNfQklHRU5ESUFOCisJCWFzc2VydChuLmExNj09MjU2KTsKKwkJI2Vsc2UKKwkJYXNzZXJ0KG4uYTE2PT0xKTsKKwkJI2VuZGlmCisJfQorCisJbSA9IF9USUZGZ2V0TW9kZShtb2RlLCBtb2R1bGUpOworCWlmIChtID09IC0xKQorCQlnb3RvIGJhZDI7CisJdGlmID0gKFRJRkYgKilfVElGRm1hbGxvYygodG1zaXplX3QpKHNpemVvZiAoVElGRikgKyBzdHJsZW4obmFtZSkgKyAxKSk7CisJaWYgKHRpZiA9PSBOVUxMKSB7CisJCVRJRkZFcnJvckV4dChjbGllbnRkYXRhLCBtb2R1bGUsICIlczogT3V0IG9mIG1lbW9yeSAoVElGRiBzdHJ1Y3R1cmUpIiwgbmFtZSk7CisJCWdvdG8gYmFkMjsKKwl9CisJX1RJRkZtZW1zZXQodGlmLCAwLCBzaXplb2YgKCp0aWYpKTsKKwl0aWYtPnRpZl9uYW1lID0gKGNoYXIgKil0aWYgKyBzaXplb2YgKFRJRkYpOworCXN0cmNweSh0aWYtPnRpZl9uYW1lLCBuYW1lKTsKKwl0aWYtPnRpZl9tb2RlID0gbSAmfiAoT19DUkVBVHxPX1RSVU5DKTsKKwl0aWYtPnRpZl9jdXJkaXIgPSAodWludDE2KSAtMTsJCS8qIG5vbi1leGlzdGVudCBkaXJlY3RvcnkgKi8KKwl0aWYtPnRpZl9jdXJvZmYgPSAwOworCXRpZi0+dGlmX2N1cnN0cmlwID0gKHVpbnQzMikgLTE7CS8qIGludmFsaWQgc3RyaXAgKi8KKwl0aWYtPnRpZl9yb3cgPSAodWludDMyKSAtMTsJCS8qIHJlYWQvd3JpdGUgcHJlLWluY3JlbWVudCAqLworCXRpZi0+dGlmX2NsaWVudGRhdGEgPSBjbGllbnRkYXRhOworCWlmICghcmVhZHByb2MgfHwgIXdyaXRlcHJvYyB8fCAhc2Vla3Byb2MgfHwgIWNsb3NlcHJvYyB8fCAhc2l6ZXByb2MpIHsKKwkJVElGRkVycm9yRXh0KGNsaWVudGRhdGEsIG1vZHVsZSwKKwkJICAgICJPbmUgb2YgdGhlIGNsaWVudCBwcm9jZWR1cmVzIGlzIE5VTEwgcG9pbnRlci4iKTsKKwkJZ290byBiYWQyOworCX0KKwl0aWYtPnRpZl9yZWFkcHJvYyA9IHJlYWRwcm9jOworCXRpZi0+dGlmX3dyaXRlcHJvYyA9IHdyaXRlcHJvYzsKKwl0aWYtPnRpZl9zZWVrcHJvYyA9IHNlZWtwcm9jOworCXRpZi0+dGlmX2Nsb3NlcHJvYyA9IGNsb3NlcHJvYzsKKwl0aWYtPnRpZl9zaXplcHJvYyA9IHNpemVwcm9jOworCWlmIChtYXBwcm9jKQorCQl0aWYtPnRpZl9tYXBwcm9jID0gbWFwcHJvYzsKKwllbHNlCisJCXRpZi0+dGlmX21hcHByb2MgPSBfdGlmZkR1bW15TWFwUHJvYzsKKwlpZiAodW5tYXBwcm9jKQorCQl0aWYtPnRpZl91bm1hcHByb2MgPSB1bm1hcHByb2M7CisJZWxzZQorCQl0aWYtPnRpZl91bm1hcHByb2MgPSBfdGlmZkR1bW15VW5tYXBQcm9jOworCV9USUZGU2V0RGVmYXVsdENvbXByZXNzaW9uU3RhdGUodGlmKTsgICAgLyogc2V0dXAgZGVmYXVsdCBzdGF0ZSAqLworCS8qCisJICogRGVmYXVsdCBpcyB0byByZXR1cm4gZGF0YSBNU0IyTFNCIGFuZCBlbmFibGUgdGhlCisJICogdXNlIG9mIG1lbW9yeS1tYXBwZWQgZmlsZXMgYW5kIHN0cmlwIGNob3BwaW5nIHdoZW4KKwkgKiBhIGZpbGUgaXMgb3BlbmVkIHJlYWQtb25seS4KKwkgKi8KKwl0aWYtPnRpZl9mbGFncyA9IEZJTExPUkRFUl9NU0IyTFNCOworCWlmIChtID09IE9fUkRPTkxZICkKKwkJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9NQVBQRUQ7CisKKwkjaWZkZWYgU1RSSVBDSE9QX0RFRkFVTFQKKwlpZiAobSA9PSBPX1JET05MWSB8fCBtID09IE9fUkRXUikKKwkJdGlmLT50aWZfZmxhZ3MgfD0gU1RSSVBDSE9QX0RFRkFVTFQ7CisJI2VuZGlmCisKKwkvKgorCSAqIFByb2Nlc3MgbGlicmFyeS1zcGVjaWZpYyBmbGFncyBpbiB0aGUgb3BlbiBtb2RlIHN0cmluZy4KKwkgKiBUaGUgZm9sbG93aW5nIGZsYWdzIG1heSBiZSB1c2VkIHRvIGNvbnRyb2wgaW50cmluc2ljIGxpYnJhcnkKKwkgKiBiZWhhdmlvdXIgdGhhdCBtYXkgb3IgbWF5IG5vdCBiZSBkZXNpcmFibGUgKHVzdWFsbHkgZm9yCisJICogY29tcGF0aWJpbGl0eSB3aXRoIHNvbWUgYXBwbGljYXRpb24gdGhhdCBjbGFpbXMgdG8gc3VwcG9ydAorCSAqIFRJRkYgYnV0IG9ubHkgc3VwcG9ydHMgc29tZSBicmFpbmRlYWQgaWRlYSBvZiB3aGF0IHRoZQorCSAqIHZlbmRvciB0aGlua3MgVElGRiBpcyk6CisJICoKKwkgKiAnbCcgdXNlIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlciBmb3IgY3JlYXRpbmcgYSBmaWxlCisJICogJ2InIHVzZSBiaWctZW5kaWFuIGJ5dGUgb3JkZXIgZm9yIGNyZWF0aW5nIGEgZmlsZQorCSAqICdMJyByZWFkL3dyaXRlIGluZm9ybWF0aW9uIHVzaW5nIExTQjJNU0IgYml0IG9yZGVyCisJICogJ0InIHJlYWQvd3JpdGUgaW5mb3JtYXRpb24gdXNpbmcgTVNCMkxTQiBiaXQgb3JkZXIKKwkgKiAnSCcgcmVhZC93cml0ZSBpbmZvcm1hdGlvbiB1c2luZyBob3N0IGJpdCBvcmRlcgorCSAqICdNJyBlbmFibGUgdXNlIG9mIG1lbW9yeS1tYXBwZWQgZmlsZXMgd2hlbiBzdXBwb3J0ZWQKKwkgKiAnbScgZGlzYWJsZSB1c2Ugb2YgbWVtb3J5LW1hcHBlZCBmaWxlcworCSAqICdDJyBlbmFibGUgc3RyaXAgY2hvcHBpbmcgc3VwcG9ydCB3aGVuIHJlYWRpbmcKKwkgKiAnYycgZGlzYWJsZSBzdHJpcCBjaG9wcGluZyBzdXBwb3J0CisJICogJ2gnIHJlYWQgVElGRiBoZWFkZXIgb25seSwgZG8gbm90IGxvYWQgdGhlIGZpcnN0IElGRAorCSAqICc0JyBDbGFzc2ljVElGRiBmb3IgY3JlYXRpbmcgYSBmaWxlIChkZWZhdWx0KQorCSAqICc4JyBCaWdUSUZGIGZvciBjcmVhdGluZyBhIGZpbGUKKwkgKgorCSAqIFRoZSB1c2Ugb2YgdGhlICdsJyBhbmQgJ2InIGZsYWdzIGlzIHN0cm9uZ2x5IGRpc2NvdXJhZ2VkLgorCSAqIFRoZXNlIGZsYWdzIGFyZSBwcm92aWRlZCBzb2xlbHkgYmVjYXVzZSBudW1lcm91cyB2ZW5kb3JzLAorCSAqIHR5cGljYWxseSBvbiB0aGUgUEMsIGRvIG5vdCBjb3JyZWN0bHkgc3VwcG9ydCBUSUZGOyB0aGV5CisJICogb25seSBzdXBwb3J0IHRoZSBJbnRlbCBsaXR0bGUtZW5kaWFuIGJ5dGUgb3JkZXIuICBUaGlzCisJICogc3VwcG9ydCBpcyBub3QgY29uZmlndXJlZCBieSBkZWZhdWx0IGJlY2F1c2UgaXQgc3VwcG9ydHMKKwkgKiB0aGUgdmlvbGF0aW9uIG9mIHRoZSBUSUZGIHNwZWMgdGhhdCBzYXlzIHRoYXQgcmVhZGVycyAqTVVTVCoKKwkgKiBzdXBwb3J0IGJvdGggYnl0ZSBvcmRlcnMuICBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0CisJICogeW91IG5vdCB1c2UgdGhpcyBmZWF0dXJlIGV4Y2VwdCB0byBkZWFsIHdpdGggYnVzdGVkIGFwcHMKKwkgKiB0aGF0IHdyaXRlIGludmFsaWQgVElGRi4gIEFuZCBldmVuIGluIHRob3NlIGNhc2VzIHlvdSBzaG91bGQKKwkgKiBiYW5nIG9uIHRoZSB2ZW5kb3JzIHRvIGZpeCB0aGVpciBzb2Z0d2FyZS4KKwkgKgorCSAqIFRoZSAnTCcsICdCJywgYW5kICdIJyBmbGFncyBhcmUgaW50ZW5kZWQgZm9yIGFwcGxpY2F0aW9ucworCSAqIHRoYXQgY2FuIG9wdGltaXplIG9wZXJhdGlvbnMgb24gZGF0YSBieSB1c2luZyBhIHBhcnRpY3VsYXIKKwkgKiBiaXQgb3JkZXIuICBCeSBkZWZhdWx0IHRoZSBsaWJyYXJ5IHJldHVybnMgZGF0YSBpbiBNU0IyTFNCCisJICogYml0IG9yZGVyIGZvciBjb21wYXRpYmlsdGl5IHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgdGhpcworCSAqIGxpYnJhcnkuICBSZXR1cm5pbmcgZGF0YSBpbiB0aGUgYml0IG9yZGVyIG9mIHRoZSBuYXRpdmUgY3B1CisJICogbWFrZXMgdGhlIG1vc3Qgc2Vuc2UgYnV0IGFsc28gcmVxdWlyZXMgYXBwbGljYXRpb25zIHRvIGNoZWNrCisJICogdGhlIHZhbHVlIG9mIHRoZSBGaWxsT3JkZXIgdGFnOyBzb21ldGhpbmcgdGhleSBwcm9iYWJseSBkbworCSAqIG5vdCBkbyByaWdodCBub3cuCisJICoKKwkgKiBUaGUgJ00nIGFuZCAnbScgZmxhZ3MgYXJlIHByb3ZpZGVkIGJlY2F1c2Ugc29tZSB2aXJ0dWFsIG1lbW9yeQorCSAqIHN5c3RlbXMgZXhoaWJpdCBwb29yIGJlaGF2aW91ciB3aGVuIGxhcmdlIGltYWdlcyBhcmUgbWFwcGVkLgorCSAqIFRoZXNlIG9wdGlvbnMgcGVybWl0IGNsaWVudHMgdG8gY29udHJvbCB0aGUgdXNlIG9mIG1lbW9yeS1tYXBwZWQKKwkgKiBmaWxlcyBvbiBhIHBlci1maWxlIGJhc2lzLgorCSAqCisJICogVGhlICdDJyBhbmQgJ2MnIGZsYWdzIGFyZSBwcm92aWRlZCBiZWNhdXNlIHRoZSBsaWJyYXJ5IHN1cHBvcnQKKwkgKiBmb3IgY2hvcHBpbmcgdXAgbGFyZ2Ugc3RyaXBzIGludG8gbXVsdGlwbGUgc21hbGxlciBzdHJpcHMgaXMgbm90CisJICogYXBwbGljYXRpb24tdHJhbnNwYXJlbnQgYW5kIGFzIHN1Y2ggY2FuIGNhdXNlIHByb2JsZW1zLiAgVGhlICdjJworCSAqIG9wdGlvbiBwZXJtaXRzIGFwcGxpY2F0aW9ucyB0aGF0IG9ubHkgd2FudCB0byBsb29rIGF0IHRoZSB0YWdzLAorCSAqIGZvciBleGFtcGxlLCB0byBnZXQgdGhlIHVuYWR1bHRlcmF0ZWQgVElGRiB0YWcgaW5mb3JtYXRpb24uCisJICovCisJZm9yIChjcCA9IG1vZGU7ICpjcDsgY3ArKykKKwkJc3dpdGNoICgqY3ApIHsKKwkJCWNhc2UgJ2InOgorCQkJCSNpZm5kZWYgV09SRFNfQklHRU5ESUFOCisJCQkJaWYgKG0mT19DUkVBVCkKKwkJCQkJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9TV0FCOworCQkJCSNlbmRpZgorCQkJCWJyZWFrOworCQkJY2FzZSAnbCc6CisJCQkJI2lmZGVmIFdPUkRTX0JJR0VORElBTgorCQkJCWlmICgobSZPX0NSRUFUKSkKKwkJCQkJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9TV0FCOworCQkJCSNlbmRpZgorCQkJCWJyZWFrOworCQkJY2FzZSAnQic6CisJCQkJdGlmLT50aWZfZmxhZ3MgPSAodGlmLT50aWZfZmxhZ3MgJn4gVElGRl9GSUxMT1JERVIpIHwKKwkJCQkgICAgRklMTE9SREVSX01TQjJMU0I7CisJCQkJYnJlYWs7CisJCQljYXNlICdMJzoKKwkJCQl0aWYtPnRpZl9mbGFncyA9ICh0aWYtPnRpZl9mbGFncyAmfiBUSUZGX0ZJTExPUkRFUikgfAorCQkJCSAgICBGSUxMT1JERVJfTFNCMk1TQjsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ0gnOgorCQkJCXRpZi0+dGlmX2ZsYWdzID0gKHRpZi0+dGlmX2ZsYWdzICZ+IFRJRkZfRklMTE9SREVSKSB8CisJCQkJICAgIEhPU1RfRklMTE9SREVSOworCQkJCWJyZWFrOworCQkJY2FzZSAnTSc6CisJCQkJaWYgKG0gPT0gT19SRE9OTFkpCisJCQkJCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfTUFQUEVEOworCQkJCWJyZWFrOworCQkJY2FzZSAnbSc6CisJCQkJaWYgKG0gPT0gT19SRE9OTFkpCisJCQkJCXRpZi0+dGlmX2ZsYWdzICY9IH5USUZGX01BUFBFRDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ0MnOgorCQkJCWlmIChtID09IE9fUkRPTkxZKQorCQkJCQl0aWYtPnRpZl9mbGFncyB8PSBUSUZGX1NUUklQQ0hPUDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2MnOgorCQkJCWlmIChtID09IE9fUkRPTkxZKQorCQkJCQl0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9TVFJJUENIT1A7CisJCQkJYnJlYWs7CisJCQljYXNlICdoJzoKKwkJCQl0aWYtPnRpZl9mbGFncyB8PSBUSUZGX0hFQURFUk9OTFk7CisJCQkJYnJlYWs7CisJCQljYXNlICc4JzoKKwkJCQlpZiAobSZPX0NSRUFUKQorCQkJCQl0aWYtPnRpZl9mbGFncyB8PSBUSUZGX0JJR1RJRkY7CisJCQkJYnJlYWs7CisJCX0KKwkvKgorCSAqIFJlYWQgaW4gVElGRiBoZWFkZXIuCisJICovCisJaWYgKChtICYgT19UUlVOQykgfHwKKwkgICAgIVJlYWRPSyh0aWYsICZ0aWYtPnRpZl9oZWFkZXIsIHNpemVvZiAoVElGRkhlYWRlckNsYXNzaWMpKSkgeworCQlpZiAodGlmLT50aWZfbW9kZSA9PSBPX1JET05MWSkgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG5hbWUsCisJCQkgICAgIkNhbm5vdCByZWFkIFRJRkYgaGVhZGVyIik7CisJCQlnb3RvIGJhZDsKKwkJfQorCQkvKgorCQkgKiBTZXR1cCBoZWFkZXIgYW5kIHdyaXRlLgorCQkgKi8KKwkJI2lmZGVmIFdPUkRTX0JJR0VORElBTgorCQl0aWYtPnRpZl9oZWFkZXIuY29tbW9uLnRpZmZfbWFnaWMgPSB0aWYtPnRpZl9mbGFncyAmIFRJRkZfU1dBQgorCQkgICAgPyBUSUZGX0xJVFRMRUVORElBTiA6IFRJRkZfQklHRU5ESUFOOworCQkjZWxzZQorCQl0aWYtPnRpZl9oZWFkZXIuY29tbW9uLnRpZmZfbWFnaWMgPSB0aWYtPnRpZl9mbGFncyAmIFRJRkZfU1dBQgorCQkgICAgPyBUSUZGX0JJR0VORElBTiA6IFRJRkZfTElUVExFRU5ESUFOOworCQkjZW5kaWYKKwkJaWYgKCEodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKSkKKwkJeworCQkJdGlmLT50aWZfaGVhZGVyLmNvbW1vbi50aWZmX3ZlcnNpb24gPSBUSUZGX1ZFUlNJT05fQ0xBU1NJQzsKKwkJCXRpZi0+dGlmX2hlYWRlci5jbGFzc2ljLnRpZmZfZGlyb2ZmID0gMDsKKwkJCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfU1dBQikKKwkJCQlUSUZGU3dhYlNob3J0KCZ0aWYtPnRpZl9oZWFkZXIuY29tbW9uLnRpZmZfdmVyc2lvbik7CisJCQl0aWYtPnRpZl9oZWFkZXJfc2l6ZSA9IHNpemVvZihUSUZGSGVhZGVyQ2xhc3NpYyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0aWYtPnRpZl9oZWFkZXIuY29tbW9uLnRpZmZfdmVyc2lvbiA9IFRJRkZfVkVSU0lPTl9CSUc7CisJCQl0aWYtPnRpZl9oZWFkZXIuYmlnLnRpZmZfb2Zmc2V0c2l6ZSA9IDg7CisJCQl0aWYtPnRpZl9oZWFkZXIuYmlnLnRpZmZfdW51c2VkID0gMDsKKwkJCXRpZi0+dGlmX2hlYWRlci5iaWcudGlmZl9kaXJvZmYgPSAwOworCQkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKQorCQkJeworCQkJCVRJRkZTd2FiU2hvcnQoJnRpZi0+dGlmX2hlYWRlci5jb21tb24udGlmZl92ZXJzaW9uKTsKKwkJCQlUSUZGU3dhYlNob3J0KCZ0aWYtPnRpZl9oZWFkZXIuYmlnLnRpZmZfb2Zmc2V0c2l6ZSk7CisJCQl9CisJCQl0aWYtPnRpZl9oZWFkZXJfc2l6ZSA9IHNpemVvZiAoVElGRkhlYWRlckJpZyk7CisJCX0KKwkJLyoKKwkJICogVGhlIGRvYyBmb3IgImZvcGVuIiBmb3Igc29tZSBTVERfQ19MSUJzIHNheXMgdGhhdCBpZiB5b3UKKwkJICogb3BlbiBhIGZpbGUgZm9yIG1vZGlmeSAoIisiKSwgdGhlbiB5b3UgbXVzdCBmc2VlayAob3IKKwkJICogZmZsdXNoPykgYmV0d2VlbiBhbnkgZnJlYWRzIGFuZCBmd3JpdGVzLiAgVGhpcyBpcyBub3QKKwkJICogbmVjZXNzYXJ5IG9uIG1vc3Qgc3lzdGVtcywgYnV0IGhhcyBiZWVuIHNob3duIHRvIGJlIG5lZWRlZAorCQkgKiBvbiBTb2xhcmlzLgorCQkgKi8KKwkJVElGRlNlZWtGaWxlKCB0aWYsIDAsIFNFRUtfU0VUICk7CisJCWlmICghV3JpdGVPSyh0aWYsICZ0aWYtPnRpZl9oZWFkZXIsICh0bXNpemVfdCkodGlmLT50aWZfaGVhZGVyX3NpemUpKSkgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG5hbWUsCisJCQkgICAgIkVycm9yIHdyaXRpbmcgVElGRiBoZWFkZXIiKTsKKwkJCWdvdG8gYmFkOworCQl9CisJCS8qCisJCSAqIFNldHVwIHRoZSBieXRlIG9yZGVyIGhhbmRsaW5nLgorCQkgKi8KKwkJaWYgKHRpZi0+dGlmX2hlYWRlci5jb21tb24udGlmZl9tYWdpYyA9PSBUSUZGX0JJR0VORElBTikgeworCQkJI2lmbmRlZiBXT1JEU19CSUdFTkRJQU4KKwkJCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfU1dBQjsKKwkJCSNlbmRpZgorCQl9IGVsc2UgeworCQkJI2lmZGVmIFdPUkRTX0JJR0VORElBTgorCQkJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9TV0FCOworCQkJI2VuZGlmCisJCX0KKwkJLyoKKwkJICogU2V0dXAgZGVmYXVsdCBkaXJlY3RvcnkuCisJCSAqLworCQlpZiAoIVRJRkZEZWZhdWx0RGlyZWN0b3J5KHRpZikpCisJCQlnb3RvIGJhZDsKKwkJdGlmLT50aWZfZGlyb2ZmID0gMDsKKwkJdGlmLT50aWZfZGlybGlzdCA9IE5VTEw7CisJCXRpZi0+dGlmX2Rpcmxpc3RzaXplID0gMDsKKwkJdGlmLT50aWZfZGlybnVtYmVyID0gMDsKKwkJcmV0dXJuICh0aWYpOworCX0KKwkvKgorCSAqIFNldHVwIHRoZSBieXRlIG9yZGVyIGhhbmRsaW5nLgorCSAqLworCWlmICh0aWYtPnRpZl9oZWFkZXIuY29tbW9uLnRpZmZfbWFnaWMgIT0gVElGRl9CSUdFTkRJQU4gJiYKKwkgICAgdGlmLT50aWZfaGVhZGVyLmNvbW1vbi50aWZmX21hZ2ljICE9IFRJRkZfTElUVExFRU5ESUFOCisJICAgICNpZiBNRElfU1VQUE9SVAorCSAgICAmJgorCSAgICAjaWYgSE9TVF9CSUdFTkRJQU4KKwkgICAgdGlmLT50aWZfaGVhZGVyLmNvbW1vbi50aWZmX21hZ2ljICE9IE1ESV9CSUdFTkRJQU4KKwkgICAgI2Vsc2UKKwkgICAgdGlmLT50aWZfaGVhZGVyLmNvbW1vbi50aWZmX21hZ2ljICE9IE1ESV9MSVRUTEVFTkRJQU4KKwkgICAgI2VuZGlmCisJICAgICkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbmFtZSwKKwkJICAgICJOb3QgYSBUSUZGIG9yIE1ESSBmaWxlLCBiYWQgbWFnaWMgbnVtYmVyICVkICgweCV4KSIsCisJICAgICNlbHNlCisJICAgICkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbmFtZSwKKwkJICAgICJOb3QgYSBUSUZGIGZpbGUsIGJhZCBtYWdpYyBudW1iZXIgJWQgKDB4JXgpIiwKKwkgICAgI2VuZGlmCisJCSAgICB0aWYtPnRpZl9oZWFkZXIuY29tbW9uLnRpZmZfbWFnaWMsCisJCSAgICB0aWYtPnRpZl9oZWFkZXIuY29tbW9uLnRpZmZfbWFnaWMpOworCQlnb3RvIGJhZDsKKwl9CisJaWYgKHRpZi0+dGlmX2hlYWRlci5jb21tb24udGlmZl9tYWdpYyA9PSBUSUZGX0JJR0VORElBTikgeworCQkjaWZuZGVmIFdPUkRTX0JJR0VORElBTgorCQl0aWYtPnRpZl9mbGFncyB8PSBUSUZGX1NXQUI7CisJCSNlbmRpZgorCX0gZWxzZSB7CisJCSNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKwkJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9TV0FCOworCQkjZW5kaWYKKwl9CisJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKSAKKwkJVElGRlN3YWJTaG9ydCgmdGlmLT50aWZfaGVhZGVyLmNvbW1vbi50aWZmX3ZlcnNpb24pOworCWlmICgodGlmLT50aWZfaGVhZGVyLmNvbW1vbi50aWZmX3ZlcnNpb24gIT0gVElGRl9WRVJTSU9OX0NMQVNTSUMpJiYKKwkgICAgKHRpZi0+dGlmX2hlYWRlci5jb21tb24udGlmZl92ZXJzaW9uICE9IFRJRkZfVkVSU0lPTl9CSUcpKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBuYW1lLAorCQkgICAgIk5vdCBhIFRJRkYgZmlsZSwgYmFkIHZlcnNpb24gbnVtYmVyICVkICgweCV4KSIsCisJCSAgICB0aWYtPnRpZl9oZWFkZXIuY29tbW9uLnRpZmZfdmVyc2lvbiwKKwkJICAgIHRpZi0+dGlmX2hlYWRlci5jb21tb24udGlmZl92ZXJzaW9uKTsKKwkJZ290byBiYWQ7CisJfQorCWlmICh0aWYtPnRpZl9oZWFkZXIuY29tbW9uLnRpZmZfdmVyc2lvbiA9PSBUSUZGX1ZFUlNJT05fQ0xBU1NJQykKKwl7CisJCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfU1dBQikKKwkJCVRJRkZTd2FiTG9uZygmdGlmLT50aWZfaGVhZGVyLmNsYXNzaWMudGlmZl9kaXJvZmYpOworCQl0aWYtPnRpZl9oZWFkZXJfc2l6ZSA9IHNpemVvZihUSUZGSGVhZGVyQ2xhc3NpYyk7CisJfQorCWVsc2UKKwl7CisJCWlmICghUmVhZE9LKHRpZiwgKCh1aW50OCopKCZ0aWYtPnRpZl9oZWFkZXIpICsgc2l6ZW9mKFRJRkZIZWFkZXJDbGFzc2ljKSksIChzaXplb2YoVElGRkhlYWRlckJpZyktc2l6ZW9mKFRJRkZIZWFkZXJDbGFzc2ljKSkpKQorCQl7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbmFtZSwKKwkJCSAgICAiQ2Fubm90IHJlYWQgVElGRiBoZWFkZXIiKTsKKwkJCWdvdG8gYmFkOworCQl9CisJCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfU1dBQikKKwkJeworCQkJVElGRlN3YWJTaG9ydCgmdGlmLT50aWZfaGVhZGVyLmJpZy50aWZmX29mZnNldHNpemUpOworCQkJVElGRlN3YWJMb25nOCgmdGlmLT50aWZfaGVhZGVyLmJpZy50aWZmX2Rpcm9mZik7CisJCX0KKwkJaWYgKHRpZi0+dGlmX2hlYWRlci5iaWcudGlmZl9vZmZzZXRzaXplICE9IDgpCisJCXsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBuYW1lLAorCQkJICAgICJOb3QgYSBUSUZGIGZpbGUsIGJhZCBCaWdUSUZGIG9mZnNldHNpemUgJWQgKDB4JXgpIiwKKwkJCSAgICB0aWYtPnRpZl9oZWFkZXIuYmlnLnRpZmZfb2Zmc2V0c2l6ZSwKKwkJCSAgICB0aWYtPnRpZl9oZWFkZXIuYmlnLnRpZmZfb2Zmc2V0c2l6ZSk7CisJCQlnb3RvIGJhZDsKKwkJfQorCQlpZiAodGlmLT50aWZfaGVhZGVyLmJpZy50aWZmX3VudXNlZCAhPSAwKQorCQl7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbmFtZSwKKwkJCSAgICAiTm90IGEgVElGRiBmaWxlLCBiYWQgQmlnVElGRiB1bnVzZWQgJWQgKDB4JXgpIiwKKwkJCSAgICB0aWYtPnRpZl9oZWFkZXIuYmlnLnRpZmZfdW51c2VkLAorCQkJICAgIHRpZi0+dGlmX2hlYWRlci5iaWcudGlmZl91bnVzZWQpOworCQkJZ290byBiYWQ7CisJCX0KKwkJdGlmLT50aWZfaGVhZGVyX3NpemUgPSBzaXplb2YoVElGRkhlYWRlckJpZyk7CisJCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfQklHVElGRjsKKwl9CisJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9NWUJVRkZFUjsKKwl0aWYtPnRpZl9yYXdjcCA9IHRpZi0+dGlmX3Jhd2RhdGEgPSAwOworCXRpZi0+dGlmX3Jhd2RhdGFzaXplID0gMDsKKyAgICAgICAgdGlmLT50aWZfcmF3ZGF0YW9mZiA9IDA7CisgICAgICAgIHRpZi0+dGlmX3Jhd2RhdGFsb2FkZWQgPSAwOworCisJc3dpdGNoIChtb2RlWzBdKSB7CisJCWNhc2UgJ3InOgorCQkJaWYgKCEodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKSkKKwkJCQl0aWYtPnRpZl9uZXh0ZGlyb2ZmID0gdGlmLT50aWZfaGVhZGVyLmNsYXNzaWMudGlmZl9kaXJvZmY7CisJCQllbHNlCisJCQkJdGlmLT50aWZfbmV4dGRpcm9mZiA9IHRpZi0+dGlmX2hlYWRlci5iaWcudGlmZl9kaXJvZmY7CisJCQkvKgorCQkJICogVHJ5IHRvIHVzZSBhIG1lbW9yeS1tYXBwZWQgZmlsZSBpZiB0aGUgY2xpZW50CisJCQkgKiBoYXMgbm90IGV4cGxpY2l0bHkgc3VwcHJlc3NlZCB1c2FnZSB3aXRoIHRoZQorCQkJICogJ20nIGZsYWcgaW4gdGhlIG9wZW4gbW9kZSAoc2VlIGFib3ZlKS4KKwkJCSAqLworCQkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9NQVBQRUQpCisJCQl7CisJCQkJdG9mZl90IG47CisJCQkJaWYgKFRJRkZNYXBGaWxlQ29udGVudHModGlmLCh2b2lkKiopKCZ0aWYtPnRpZl9iYXNlKSwmbikpCisJCQkJeworCQkJCQl0aWYtPnRpZl9zaXplPSh0bXNpemVfdCluOworCQkJCQlhc3NlcnQoKHRvZmZfdCl0aWYtPnRpZl9zaXplPT1uKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQl0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9NQVBQRUQ7CisJCQl9CisJCQkvKgorCQkJICogU29tZXRpbWVzIHdlIGRvIG5vdCB3YW50IHRvIHJlYWQgdGhlIGZpcnN0IGRpcmVjdG9yeSAoZm9yIGV4YW1wbGUsCisJCQkgKiBpdCBtYXkgYmUgYnJva2VuKSBhbmQgd2FudCB0byBwcm9jZWVkIHRvIG90aGVyIGRpcmVjdG9yaWVzLiBJIHRoaXMKKwkJCSAqIGNhc2Ugd2UgdXNlIHRoZSBUSUZGX0hFQURFUk9OTFkgZmxhZyB0byBvcGVuIGZpbGUgYW5kIHJldHVybgorCQkJICogaW1tZWRpYXRlbHkgYWZ0ZXIgcmVhZGluZyBUSUZGIGhlYWRlci4KKwkJCSAqLworCQkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9IRUFERVJPTkxZKQorCQkJCXJldHVybiAodGlmKTsKKworCQkJLyoKKwkJCSAqIFNldHVwIGluaXRpYWwgZGlyZWN0b3J5LgorCQkJICovCisJCQlpZiAoVElGRlJlYWREaXJlY3RvcnkodGlmKSkgeworCQkJCXRpZi0+dGlmX3Jhd2NjID0gKHRtc2l6ZV90KS0xOworCQkJCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfQlVGRkVSU0VUVVA7CisJCQkJcmV0dXJuICh0aWYpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ2EnOgorCQkJLyoKKwkJCSAqIE5ldyBkaXJlY3RvcmllcyBhcmUgYXV0b21hdGljYWxseSBhcHBlbmQKKwkJCSAqIHRvIHRoZSBlbmQgb2YgdGhlIGRpcmVjdG9yeSBjaGFpbiB3aGVuIHRoZXkKKwkJCSAqIGFyZSB3cml0dGVuIG91dCAoc2VlIFRJRkZXcml0ZURpcmVjdG9yeSkuCisJCQkgKi8KKwkJCWlmICghVElGRkRlZmF1bHREaXJlY3RvcnkodGlmKSkKKwkJCQlnb3RvIGJhZDsKKwkJCXJldHVybiAodGlmKTsKKwl9CitiYWQ6CisJdGlmLT50aWZfbW9kZSA9IE9fUkRPTkxZOwkvKiBYWFggYXZvaWQgZmx1c2ggKi8KKyAgICAgICAgVElGRkNsZWFudXAodGlmKTsKK2JhZDI6CisJcmV0dXJuICgoVElGRiopMCk7Cit9CisKKy8qCisgKiBRdWVyeSBmdW5jdGlvbnMgdG8gYWNjZXNzIHByaXZhdGUgZGF0YS4KKyAqLworCisvKgorICogUmV0dXJuIG9wZW4gZmlsZSdzIG5hbWUuCisgKi8KK2NvbnN0IGNoYXIgKgorVElGRkZpbGVOYW1lKFRJRkYqIHRpZikKK3sKKwlyZXR1cm4gKHRpZi0+dGlmX25hbWUpOworfQorCisvKgorICogU2V0IHRoZSBmaWxlIG5hbWUuCisgKi8KK2NvbnN0IGNoYXIgKgorVElGRlNldEZpbGVOYW1lKFRJRkYqIHRpZiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwljb25zdCBjaGFyKiBvbGRfbmFtZSA9IHRpZi0+dGlmX25hbWU7CisJdGlmLT50aWZfbmFtZSA9IChjaGFyICopbmFtZTsKKwlyZXR1cm4gKG9sZF9uYW1lKTsKK30KKworLyoKKyAqIFJldHVybiBvcGVuIGZpbGUncyBJL08gZGVzY3JpcHRvci4KKyAqLworaW50CitUSUZGRmlsZW5vKFRJRkYqIHRpZikKK3sKKwlyZXR1cm4gKHRpZi0+dGlmX2ZkKTsKK30KKworLyoKKyAqIFNldCBvcGVuIGZpbGUncyBJL08gZGVzY3JpcHRvciwgYW5kIHJldHVybiBwcmV2aW91cyB2YWx1ZS4KKyAqLworaW50CitUSUZGU2V0RmlsZW5vKFRJRkYqIHRpZiwgaW50IGZkKQoreworICAgICAgICBpbnQgb2xkX2ZkID0gdGlmLT50aWZfZmQ7CisJdGlmLT50aWZfZmQgPSBmZDsKKwlyZXR1cm4gb2xkX2ZkOworfQorCisvKgorICogUmV0dXJuIG9wZW4gZmlsZSdzIGNsaWVudGRhdGEuCisgKi8KK3RoYW5kbGVfdAorVElGRkNsaWVudGRhdGEoVElGRiogdGlmKQoreworCXJldHVybiAodGlmLT50aWZfY2xpZW50ZGF0YSk7Cit9CisKKy8qCisgKiBTZXQgb3BlbiBmaWxlJ3MgY2xpZW50ZGF0YSwgYW5kIHJldHVybiBwcmV2aW91cyB2YWx1ZS4KKyAqLwordGhhbmRsZV90CitUSUZGU2V0Q2xpZW50ZGF0YShUSUZGKiB0aWYsIHRoYW5kbGVfdCBuZXd2YWx1ZSkKK3sKKwl0aGFuZGxlX3QgbSA9IHRpZi0+dGlmX2NsaWVudGRhdGE7CisJdGlmLT50aWZfY2xpZW50ZGF0YSA9IG5ld3ZhbHVlOworCXJldHVybiBtOworfQorCisvKgorICogUmV0dXJuIHJlYWQvd3JpdGUgbW9kZS4KKyAqLworaW50CitUSUZGR2V0TW9kZShUSUZGKiB0aWYpCit7CisJcmV0dXJuICh0aWYtPnRpZl9tb2RlKTsKK30KKworLyoKKyAqIFJldHVybiByZWFkL3dyaXRlIG1vZGUuCisgKi8KK2ludAorVElGRlNldE1vZGUoVElGRiogdGlmLCBpbnQgbW9kZSkKK3sKKwlpbnQgb2xkX21vZGUgPSB0aWYtPnRpZl9tb2RlOworCXRpZi0+dGlmX21vZGUgPSBtb2RlOworCXJldHVybiAob2xkX21vZGUpOworfQorCisvKgorICogUmV0dXJuIG5vbnplcm8gaWYgZmlsZSBpcyBvcmdhbml6ZWQgaW4KKyAqIHRpbGVzOyB6ZXJvIGlmIG9yZ2FuaXplZCBhcyBzdHJpcHMuCisgKi8KK2ludAorVElGRklzVGlsZWQoVElGRiogdGlmKQoreworCXJldHVybiAoaXNUaWxlZCh0aWYpKTsKK30KKworLyoKKyAqIFJldHVybiBjdXJyZW50IHJvdyBiZWluZyByZWFkL3dyaXR0ZW4uCisgKi8KK3VpbnQzMgorVElGRkN1cnJlbnRSb3coVElGRiogdGlmKQoreworCXJldHVybiAodGlmLT50aWZfcm93KTsKK30KKworLyoKKyAqIFJldHVybiBpbmRleCBvZiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisgKi8KK3VpbnQxNgorVElGRkN1cnJlbnREaXJlY3RvcnkoVElGRiogdGlmKQoreworCXJldHVybiAodGlmLT50aWZfY3VyZGlyKTsKK30KKworLyoKKyAqIFJldHVybiBjdXJyZW50IHN0cmlwLgorICovCit1aW50MzIKK1RJRkZDdXJyZW50U3RyaXAoVElGRiogdGlmKQoreworCXJldHVybiAodGlmLT50aWZfY3Vyc3RyaXApOworfQorCisvKgorICogUmV0dXJuIGN1cnJlbnQgdGlsZS4KKyAqLwordWludDMyCitUSUZGQ3VycmVudFRpbGUoVElGRiogdGlmKQoreworCXJldHVybiAodGlmLT50aWZfY3VydGlsZSk7Cit9CisKKy8qCisgKiBSZXR1cm4gbm9uemVybyBpZiB0aGUgZmlsZSBoYXMgYnl0ZS1zd2FwcGVkIGRhdGEuCisgKi8KK2ludAorVElGRklzQnl0ZVN3YXBwZWQoVElGRiogdGlmKQoreworCXJldHVybiAoKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKSAhPSAwKTsKK30KKworLyoKKyAqIFJldHVybiBub256ZXJvIGlmIHRoZSBkYXRhIGlzIHJldHVybmVkIHVwLXNhbXBsZWQuCisgKi8KK2ludAorVElGRklzVXBTYW1wbGVkKFRJRkYqIHRpZikKK3sKKwlyZXR1cm4gKGlzVXBTYW1wbGVkKHRpZikpOworfQorCisvKgorICogUmV0dXJuIG5vbnplcm8gaWYgdGhlIGRhdGEgaXMgcmV0dXJuZWQgaW4gTVNCLXRvLUxTQiBiaXQgb3JkZXIuCisgKi8KK2ludAorVElGRklzTVNCMkxTQihUSUZGKiB0aWYpCit7CisJcmV0dXJuIChpc0ZpbGxPcmRlcih0aWYsIEZJTExPUkRFUl9NU0IyTFNCKSk7Cit9CisKKy8qCisgKiBSZXR1cm4gbm9uemVybyBpZiBnaXZlbiBmaWxlIHdhcyB3cml0dGVuIGluIGJpZy1lbmRpYW4gb3JkZXIuCisgKi8KK2ludAorVElGRklzQmlnRW5kaWFuKFRJRkYqIHRpZikKK3sKKwlyZXR1cm4gKHRpZi0+dGlmX2hlYWRlci5jb21tb24udGlmZl9tYWdpYyA9PSBUSUZGX0JJR0VORElBTik7Cit9CisKKy8qCisgKiBSZXR1cm4gcG9pbnRlciB0byBmaWxlIHJlYWQgbWV0aG9kLgorICovCitUSUZGUmVhZFdyaXRlUHJvYworVElGRkdldFJlYWRQcm9jKFRJRkYqIHRpZikKK3sKKwlyZXR1cm4gKHRpZi0+dGlmX3JlYWRwcm9jKTsKK30KKworLyoKKyAqIFJldHVybiBwb2ludGVyIHRvIGZpbGUgd3JpdGUgbWV0aG9kLgorICovCitUSUZGUmVhZFdyaXRlUHJvYworVElGRkdldFdyaXRlUHJvYyhUSUZGKiB0aWYpCit7CisJcmV0dXJuICh0aWYtPnRpZl93cml0ZXByb2MpOworfQorCisvKgorICogUmV0dXJuIHBvaW50ZXIgdG8gZmlsZSBzZWVrIG1ldGhvZC4KKyAqLworVElGRlNlZWtQcm9jCitUSUZGR2V0U2Vla1Byb2MoVElGRiogdGlmKQoreworCXJldHVybiAodGlmLT50aWZfc2Vla3Byb2MpOworfQorCisvKgorICogUmV0dXJuIHBvaW50ZXIgdG8gZmlsZSBjbG9zZSBtZXRob2QuCisgKi8KK1RJRkZDbG9zZVByb2MKK1RJRkZHZXRDbG9zZVByb2MoVElGRiogdGlmKQoreworCXJldHVybiAodGlmLT50aWZfY2xvc2Vwcm9jKTsKK30KKworLyoKKyAqIFJldHVybiBwb2ludGVyIHRvIGZpbGUgc2l6ZSByZXF1ZXN0aW5nIG1ldGhvZC4KKyAqLworVElGRlNpemVQcm9jCitUSUZGR2V0U2l6ZVByb2MoVElGRiogdGlmKQoreworCXJldHVybiAodGlmLT50aWZfc2l6ZXByb2MpOworfQorCisvKgorICogUmV0dXJuIHBvaW50ZXIgdG8gbWVtb3J5IG1hcHBpbmcgbWV0aG9kLgorICovCitUSUZGTWFwRmlsZVByb2MKK1RJRkZHZXRNYXBGaWxlUHJvYyhUSUZGKiB0aWYpCit7CisJcmV0dXJuICh0aWYtPnRpZl9tYXBwcm9jKTsKK30KKworLyoKKyAqIFJldHVybiBwb2ludGVyIHRvIG1lbW9yeSB1bm1hcHBpbmcgbWV0aG9kLgorICovCitUSUZGVW5tYXBGaWxlUHJvYworVElGRkdldFVubWFwRmlsZVByb2MoVElGRiogdGlmKQoreworCXJldHVybiAodGlmLT50aWZfdW5tYXBwcm9jKTsKK30KKworLyogdmltOiBzZXQgdHM9OCBzdHM9OCBzdz04IG5vZXQ6ICovCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9wYWNrYml0cy5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcGFja2JpdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTc3MTkwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcGFja2JpdHMuYwpAQCAtMCwwICsxLDMwMCBAQAorLyogJElkOiB0aWZfcGFja2JpdHMuYyx2IDEuMjIgMjAxMi0wNi0yMCAwNToyNTozMyBmd2FybWVyZGFtIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAidGlmZmlvcC5oIgorI2lmZGVmIFBBQ0tCSVRTX1NVUFBPUlQKKy8qCisgKiBUSUZGIExpYnJhcnkuCisgKgorICogUGFja0JpdHMgQ29tcHJlc3Npb24gQWxnb3JpdGhtIFN1cHBvcnQKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3N0YXRpYyBpbnQKK1BhY2tCaXRzUHJlRW5jb2RlKFRJRkYqIHRpZiwgdWludDE2IHMpCit7CisJKHZvaWQpIHM7CisKKwlpZiAoISh0aWYtPnRpZl9kYXRhID0gKHVpbnQ4KilfVElGRm1hbGxvYyhzaXplb2YodG1zaXplX3QpKSkpCisJCXJldHVybiAoMCk7CisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIHNjYW5saW5lL3RpbGUtd2lkdGggc2l6ZSBpbiBieXRlcy4KKwkgKi8KKwlpZiAoaXNUaWxlZCh0aWYpKQorCQkqKHRtc2l6ZV90Kil0aWYtPnRpZl9kYXRhID0gVElGRlRpbGVSb3dTaXplKHRpZik7CisJZWxzZQorCQkqKHRtc2l6ZV90Kil0aWYtPnRpZl9kYXRhID0gVElGRlNjYW5saW5lU2l6ZSh0aWYpOworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbnQKK1BhY2tCaXRzUG9zdEVuY29kZShUSUZGKiB0aWYpCit7CisgICAgICAgIGlmICh0aWYtPnRpZl9kYXRhKQorICAgICAgICAgICAgX1RJRkZmcmVlKHRpZi0+dGlmX2RhdGEpOworCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBFbmNvZGUgYSBydW4gb2YgcGl4ZWxzLgorICovCitzdGF0aWMgaW50CitQYWNrQml0c0VuY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IGNjLCB1aW50MTYgcykKK3sKKwl1bnNpZ25lZCBjaGFyKiBicCA9ICh1bnNpZ25lZCBjaGFyKikgYnVmOworCXVpbnQ4KiBvcDsKKwl1aW50OCogZXA7CisJdWludDgqIGxhc3RsaXRlcmFsOworCWxvbmcgbiwgc2xvcDsKKwlpbnQgYjsKKwllbnVtIHsgQkFTRSwgTElURVJBTCwgUlVOLCBMSVRFUkFMX1JVTiB9IHN0YXRlOworCisJKHZvaWQpIHM7CisJb3AgPSB0aWYtPnRpZl9yYXdjcDsKKwllcCA9IHRpZi0+dGlmX3Jhd2RhdGEgKyB0aWYtPnRpZl9yYXdkYXRhc2l6ZTsKKwlzdGF0ZSA9IEJBU0U7CisJbGFzdGxpdGVyYWwgPSAwOworCXdoaWxlIChjYyA+IDApIHsKKwkJLyoKKwkJICogRmluZCB0aGUgbG9uZ2VzdCBzdHJpbmcgb2YgaWRlbnRpY2FsIGJ5dGVzLgorCQkgKi8KKwkJYiA9ICpicCsrLCBjYy0tLCBuID0gMTsKKwkJZm9yICg7IGNjID4gMCAmJiBiID09ICpicDsgY2MtLSwgYnArKykKKwkJCW4rKzsKKwlhZ2FpbjoKKwkJaWYgKG9wICsgMiA+PSBlcCkgewkJLyogaW5zdXJlIHNwYWNlIGZvciBuZXcgZGF0YSAqLworCQkJLyoKKwkJCSAqIEJlIGNhcmVmdWwgYWJvdXQgd3JpdGluZyB0aGUgbGFzdAorCQkJICogbGl0ZXJhbC4gIE11c3Qgd3JpdGUgdXAgdG8gdGhhdCBwb2ludAorCQkJICogYW5kIHRoZW4gY29weSB0aGUgcmVtYWluZGVyIHRvIHRoZQorCQkJICogZnJvbnQgb2YgdGhlIGJ1ZmZlci4KKwkJCSAqLworCQkJaWYgKHN0YXRlID09IExJVEVSQUwgfHwgc3RhdGUgPT0gTElURVJBTF9SVU4pIHsKKwkJCQlzbG9wID0gKGxvbmcpKG9wIC0gbGFzdGxpdGVyYWwpOworCQkJCXRpZi0+dGlmX3Jhd2NjICs9ICh0bXNpemVfdCkobGFzdGxpdGVyYWwgLSB0aWYtPnRpZl9yYXdjcCk7CisJCQkJaWYgKCFUSUZGRmx1c2hEYXRhMSh0aWYpKQorCQkJCQlyZXR1cm4gKC0xKTsKKwkJCQlvcCA9IHRpZi0+dGlmX3Jhd2NwOworCQkJCXdoaWxlIChzbG9wLS0gPiAwKQorCQkJCQkqb3ArKyA9ICpsYXN0bGl0ZXJhbCsrOworCQkJCWxhc3RsaXRlcmFsID0gdGlmLT50aWZfcmF3Y3A7CisJCQl9IGVsc2UgeworCQkJCXRpZi0+dGlmX3Jhd2NjICs9ICh0bXNpemVfdCkob3AgLSB0aWYtPnRpZl9yYXdjcCk7CisJCQkJaWYgKCFUSUZGRmx1c2hEYXRhMSh0aWYpKQorCQkJCQlyZXR1cm4gKC0xKTsKKwkJCQlvcCA9IHRpZi0+dGlmX3Jhd2NwOworCQkJfQorCQl9CisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBCQVNFOgkJLyogaW5pdGlhbCBzdGF0ZSwgc2V0IHJ1bi9saXRlcmFsICovCisJCQlpZiAobiA+IDEpIHsKKwkJCQlzdGF0ZSA9IFJVTjsKKwkJCQlpZiAobiA+IDEyOCkgeworCQkJCQkqb3ArKyA9ICh1aW50OCkgLTEyNzsKKwkJCQkJKm9wKysgPSAodWludDgpIGI7CisJCQkJCW4gLT0gMTI4OworCQkJCQlnb3RvIGFnYWluOworCQkJCX0KKwkJCQkqb3ArKyA9ICh1aW50OCkoLShuLTEpKTsKKwkJCQkqb3ArKyA9ICh1aW50OCkgYjsKKwkJCX0gZWxzZSB7CisJCQkJbGFzdGxpdGVyYWwgPSBvcDsKKwkJCQkqb3ArKyA9IDA7CisJCQkJKm9wKysgPSAodWludDgpIGI7CisJCQkJc3RhdGUgPSBMSVRFUkFMOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgTElURVJBTDoJCS8qIGxhc3Qgb2JqZWN0IHdhcyBsaXRlcmFsIHN0cmluZyAqLworCQkJaWYgKG4gPiAxKSB7CisJCQkJc3RhdGUgPSBMSVRFUkFMX1JVTjsKKwkJCQlpZiAobiA+IDEyOCkgeworCQkJCQkqb3ArKyA9ICh1aW50OCkgLTEyNzsKKwkJCQkJKm9wKysgPSAodWludDgpIGI7CisJCQkJCW4gLT0gMTI4OworCQkJCQlnb3RvIGFnYWluOworCQkJCX0KKwkJCQkqb3ArKyA9ICh1aW50OCkoLShuLTEpKTsJLyogZW5jb2RlIHJ1biAqLworCQkJCSpvcCsrID0gKHVpbnQ4KSBiOworCQkJfSBlbHNlIHsJCQkvKiBleHRlbmQgbGl0ZXJhbCAqLworCQkJCWlmICgrKygqbGFzdGxpdGVyYWwpID09IDEyNykKKwkJCQkJc3RhdGUgPSBCQVNFOworCQkJCSpvcCsrID0gKHVpbnQ4KSBiOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUlVOOgkJLyogbGFzdCBvYmplY3Qgd2FzIHJ1biAqLworCQkJaWYgKG4gPiAxKSB7CisJCQkJaWYgKG4gPiAxMjgpIHsKKwkJCQkJKm9wKysgPSAodWludDgpIC0xMjc7CisJCQkJCSpvcCsrID0gKHVpbnQ4KSBiOworCQkJCQluIC09IDEyODsKKwkJCQkJZ290byBhZ2FpbjsKKwkJCQl9CisJCQkJKm9wKysgPSAodWludDgpKC0obi0xKSk7CisJCQkJKm9wKysgPSAodWludDgpIGI7CisJCQl9IGVsc2UgeworCQkJCWxhc3RsaXRlcmFsID0gb3A7CisJCQkJKm9wKysgPSAwOworCQkJCSpvcCsrID0gKHVpbnQ4KSBiOworCQkJCXN0YXRlID0gTElURVJBTDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIExJVEVSQUxfUlVOOgkvKiBsaXRlcmFsIGZvbGxvd2VkIGJ5IGEgcnVuICovCisJCQkvKgorCQkJICogQ2hlY2sgdG8gc2VlIGlmIHByZXZpb3VzIHJ1biBzaG91bGQKKwkJCSAqIGJlIGNvbnZlcnRlZCB0byBhIGxpdGVyYWwsIGluIHdoaWNoCisJCQkgKiBjYXNlIHdlIGNvbnZlcnQgbGl0ZXJhbC1ydW4tbGl0ZXJhbAorCQkJICogdG8gYSBzaW5nbGUgbGl0ZXJhbC4KKwkJCSAqLworCQkJaWYgKG4gPT0gMSAmJiBvcFstMl0gPT0gKHVpbnQ4KSAtMSAmJgorCQkJICAgICpsYXN0bGl0ZXJhbCA8IDEyNikgeworCQkJCXN0YXRlID0gKCgoKmxhc3RsaXRlcmFsKSArPSAyKSA9PSAxMjcgPworCQkJCSAgICBCQVNFIDogTElURVJBTCk7CisJCQkJb3BbLTJdID0gb3BbLTFdOwkvKiByZXBsaWNhdGUgKi8KKwkJCX0gZWxzZQorCQkJCXN0YXRlID0gUlVOOworCQkJZ290byBhZ2FpbjsKKwkJfQorCX0KKwl0aWYtPnRpZl9yYXdjYyArPSAodG1zaXplX3QpKG9wIC0gdGlmLT50aWZfcmF3Y3ApOworCXRpZi0+dGlmX3Jhd2NwID0gb3A7CisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIEVuY29kZSBhIHJlY3Rhbmd1bGFyIGNodW5rIG9mIHBpeGVscy4gIFdlIGJyZWFrIGl0IHVwCisgKiBpbnRvIHJvdy1zaXplZCBwaWVjZXMgdG8gaW5zdXJlIHRoYXQgZW5jb2RlZCBydW5zIGRvCisgKiBub3Qgc3BhbiByb3dzLiAgT3RoZXJ3aXNlLCB0aGVyZSBjYW4gYmUgcHJvYmxlbXMgd2l0aAorICogdGhlIGRlY29kZXIgaWYgZGF0YSBpcyByZWFkLCBmb3IgZXhhbXBsZSwgYnkgc2NhbmxpbmVzCisgKiB3aGVuIGl0IHdhcyBlbmNvZGVkIGJ5IHN0cmlwcy4KKyAqLworc3RhdGljIGludAorUGFja0JpdHNFbmNvZGVDaHVuayhUSUZGKiB0aWYsIHVpbnQ4KiBicCwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKQoreworCXRtc2l6ZV90IHJvd3NpemUgPSAqKHRtc2l6ZV90Kil0aWYtPnRpZl9kYXRhOworCisJd2hpbGUgKGNjID4gMCkgeworCQl0bXNpemVfdCBjaHVuayA9IHJvd3NpemU7CisJCQorCQlpZiggY2MgPCBjaHVuayApCisJCSAgICBjaHVuayA9IGNjOworCisJCWlmIChQYWNrQml0c0VuY29kZSh0aWYsIGJwLCBjaHVuaywgcykgPCAwKQorCQkgICAgcmV0dXJuICgtMSk7CisJCWJwICs9IGNodW5rOworCQljYyAtPSBjaHVuazsKKwl9CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIGludAorUGFja0JpdHNEZWNvZGUoVElGRiogdGlmLCB1aW50OCogb3AsIHRtc2l6ZV90IG9jYywgdWludDE2IHMpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiUGFja0JpdHNEZWNvZGUiOworCWNoYXIgKmJwOworCXRtc2l6ZV90IGNjOworCWxvbmcgbjsKKwlpbnQgYjsKKworCSh2b2lkKSBzOworCWJwID0gKGNoYXIqKSB0aWYtPnRpZl9yYXdjcDsKKwljYyA9IHRpZi0+dGlmX3Jhd2NjOworCXdoaWxlIChjYyA+IDAgJiYgb2NjID4gMCkgeworCQluID0gKGxvbmcpICpicCsrLCBjYy0tOworCQkvKgorCQkgKiBXYXRjaCBvdXQgZm9yIGNvbXBpbGVycyB0aGF0CisJCSAqIGRvbid0IHNpZ24gZXh0ZW5kIGNoYXJzLi4uCisJCSAqLworCQlpZiAobiA+PSAxMjgpCisJCQluIC09IDI1NjsKKwkJaWYgKG4gPCAwKSB7CQkvKiByZXBsaWNhdGUgbmV4dCBieXRlIC1uKzEgdGltZXMgKi8KKwkJCWlmIChuID09IC0xMjgpCS8qIG5vcCAqLworCQkJCWNvbnRpbnVlOworCQkJbiA9IC1uICsgMTsKKwkJCWlmKCBvY2MgPCAodG1zaXplX3QpbiApCisJCQl7CisJCQkJVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCSAgICAiRGlzY2FyZGluZyAlbHUgYnl0ZXMgdG8gYXZvaWQgYnVmZmVyIG92ZXJydW4iLAorCQkJCSAgICAodW5zaWduZWQgbG9uZykgKCh0bXNpemVfdCluIC0gb2NjKSk7CisJCQkJbiA9IChsb25nKW9jYzsKKwkJCX0KKwkJCW9jYyAtPSBuOworCQkJYiA9ICpicCsrLCBjYy0tOworCQkJd2hpbGUgKG4tLSA+IDApCisJCQkJKm9wKysgPSAodWludDgpIGI7CisJCX0gZWxzZSB7CQkvKiBjb3B5IG5leHQgbisxIGJ5dGVzIGxpdGVyYWxseSAqLworCQkJaWYgKG9jYyA8ICh0bXNpemVfdCkobiArIDEpKQorCQkJeworCQkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkgICAgIkRpc2NhcmRpbmcgJWx1IGJ5dGVzIHRvIGF2b2lkIGJ1ZmZlciBvdmVycnVuIiwKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcpICgodG1zaXplX3QpbiAtIG9jYyArIDEpKTsKKwkJCQluID0gKGxvbmcpb2NjIC0gMTsKKwkJCX0KKwkJCWlmIChjYyA8ICh0bXNpemVfdCkgKG4rMSkpIAorCQkJeworCQkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkJICAgICAgICJUZXJtaW5hdGluZyBQYWNrQml0c0RlY29kZSBkdWUgdG8gbGFjayBvZiBkYXRhLiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJX1RJRkZtZW1jcHkob3AsIGJwLCArK24pOworCQkJb3AgKz0gbjsgb2NjIC09IG47CisJCQlicCArPSBuOyBjYyAtPSBuOworCQl9CisJfQorCXRpZi0+dGlmX3Jhd2NwID0gKHVpbnQ4KikgYnA7CisJdGlmLT50aWZfcmF3Y2MgPSBjYzsKKwlpZiAob2NjID4gMCkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkgICAgIk5vdCBlbm91Z2ggZGF0YSBmb3Igc2NhbmxpbmUgJWx1IiwKKwkJICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3cpOworCQlyZXR1cm4gKDApOworCX0KKwlyZXR1cm4gKDEpOworfQorCitpbnQKK1RJRkZJbml0UGFja0JpdHMoVElGRiogdGlmLCBpbnQgc2NoZW1lKQoreworCSh2b2lkKSBzY2hlbWU7CisJdGlmLT50aWZfZGVjb2Rlcm93ID0gUGFja0JpdHNEZWNvZGU7CisJdGlmLT50aWZfZGVjb2Rlc3RyaXAgPSBQYWNrQml0c0RlY29kZTsKKwl0aWYtPnRpZl9kZWNvZGV0aWxlID0gUGFja0JpdHNEZWNvZGU7CisJdGlmLT50aWZfcHJlZW5jb2RlID0gUGFja0JpdHNQcmVFbmNvZGU7CisJdGlmLT50aWZfcG9zdGVuY29kZSA9IFBhY2tCaXRzUG9zdEVuY29kZTsKKwl0aWYtPnRpZl9lbmNvZGVyb3cgPSBQYWNrQml0c0VuY29kZTsKKwl0aWYtPnRpZl9lbmNvZGVzdHJpcCA9IFBhY2tCaXRzRW5jb2RlQ2h1bms7CisJdGlmLT50aWZfZW5jb2RldGlsZSA9IFBhY2tCaXRzRW5jb2RlQ2h1bms7CisJcmV0dXJuICgxKTsKK30KKyNlbmRpZiAvKiBQQUNLQklUU19TVVBQT1JUICovCisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTggc3c9OCBub2V0OiAqLworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcGl4YXJsb2cuYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3BpeGFybG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkzYjRjNwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3BpeGFybG9nLmMKQEAgLTAsMCArMSwxNDQyIEBACisvKiAkSWQ6IHRpZl9waXhhcmxvZy5jLHYgMS4zOSAyMDEyLTEyLTEwIDE3OjI3OjEzIHRnbCBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5NiBQaXhhcgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBQaXhhciwgU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiBQaXhhciwgU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgCisgKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIAorICogSU4gTk8gRVZFTlQgU0hBTEwgUElYQVIsIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAidGlmZmlvcC5oIgorI2lmZGVmIFBJWEFSTE9HX1NVUFBPUlQKKworLyoKKyAqIFRJRkYgTGlicmFyeS4KKyAqIFBpeGFyTG9nIENvbXByZXNzaW9uIFN1cHBvcnQKKyAqCisgKiBDb250cmlidXRlZCBieSBEYW4gTWNDb3kuCisgKgorICogUGl4YXJMb2cgZmlsbSBzdXBwb3J0IHVzZXMgdGhlIFRJRkYgbGlicmFyeSB0byBzdG9yZSBjb21wYW5kZWQKKyAqIDExIGJpdCB2YWx1ZXMgaW50byBhIHRpZmYgZmlsZSwgd2hpY2ggYXJlIGNvbXByZXNzZWQgdXNpbmcgdGhlIAorICogemlwIGNvbXByZXNzb3IuICAKKyAqCisgKiBUaGUgY29kZWMgY2FuIHRha2UgYXMgaW5wdXQgYW5kIHByb2R1Y2UgYXMgb3V0cHV0IDMyLWJpdCBJRUVFIGZsb2F0IHZhbHVlcyAKKyAqIGFzIHdlbGwgYXMgMTYtYml0IG9yIDgtYml0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLgorICoKKyAqIE9uIHdyaXRpbmcgYW55IG9mIHRoZSBhYm92ZSBhcmUgY29udmVydGVkIGludG8gdGhlIGludGVybmFsCisgKiAxMS1iaXQgbG9nIGZvcm1hdC4gICBJbiB0aGUgY2FzZSBvZiAgOCBhbmQgMTYgYml0IHZhbHVlcywgdGhlCisgKiBpbnB1dCBpcyBhc3N1bWVkIHRvIGJlIHVuc2lnbmVkIGxpbmVhciBjb2xvciB2YWx1ZXMgdGhhdCByZXByZXNlbnQKKyAqIHRoZSByYW5nZSAwLTEuICBJbiB0aGUgY2FzZSBvZiBJRUVFIHZhbHVlcywgdGhlIDAtMSByYW5nZSBpcyBhc3N1bWVkIHRvCisgKiBiZSB0aGUgbm9ybWFsIGxpbmVhciBjb2xvciByYW5nZSwgaW4gYWRkaXRpb24gb3ZlciAxIHZhbHVlcyBhcmUKKyAqIGFjY2VwdGVkIHVwIHRvIGEgdmFsdWUgb2YgYWJvdXQgMjUuMCB0byBlbmNvZGUgImhvdCIgaGlnaHRsaWdodHMgYW5kIHN1Y2guCisgKiBUaGUgZW5jb2RpbmcgaXMgbG9zc2xlc3MgZm9yIDgtYml0IHZhbHVlcywgc2xpZ2h0bHkgbG9zc3kgZm9yIHRoZQorICogb3RoZXIgYml0IGRlcHRocy4gIFRoZSBhY3R1YWwgY29sb3IgcHJlY2lzaW9uIHNob3VsZCBiZSBiZXR0ZXIKKyAqIHRoYW4gdGhlIGh1bWFuIGV5ZSBjYW4gcGVyY2VpdmUgd2l0aCBleHRyYSByb29tIHRvIGFsbG93IGZvcgorICogZXJyb3IgaW50cm9kdWNlZCBieSBmdXJ0aGVyIGltYWdlIGNvbXB1dGF0aW9uLiAgQXMgd2l0aCBhbnkgcXVhbnRpemVkCisgKiBjb2xvciBmb3JtYXQsIGl0IGlzIHBvc3NpYmxlIHRvIHBlcmZvcm0gaW1hZ2UgY2FsY3VsYXRpb25zIHdoaWNoCisgKiBleHBvc2UgdGhlIHF1YW50aXphdGlvbiBlcnJvci4gVGhpcyBmb3JtYXQgc2hvdWxkIGNlcnRhaW5seSBiZSBsZXNzIAorICogc3VzY2VwdGFibGUgdG8gc3VjaCBlcnJvcnMgdGhhbiBzdGFuZGFyZCA4LWJpdCBlbmNvZGluZ3MsIGJ1dCBtb3JlCisgKiBzdXNjZXB0YWJsZSB0aGFuIHN0cmFpZ2h0IDE2LWJpdCBvciAzMi1iaXQgZW5jb2RpbmdzLgorICoKKyAqIE9uIHJlYWRpbmcgdGhlIGludGVybmFsIGZvcm1hdCBpcyBjb252ZXJ0ZWQgdG8gdGhlIGRlc2lyZWQgb3V0cHV0IGZvcm1hdC4KKyAqIFRoZSBwcm9ncmFtIGNhbiByZXF1ZXN0IHdoaWNoIGZvcm1hdCBpdCBkZXNpcmVzIGJ5IHNldHRpbmcgdGhlIGludGVybmFsCisgKiBwc2V1ZG8gdGFnIFRJRkZUQUdfUElYQVJMT0dEQVRBRk1UIHRvIG9uZSBvZiB0aGVzZSBwb3NzaWJsZSB2YWx1ZXM6CisgKiAgUElYQVJMT0dEQVRBRk1UX0ZMT0FUICAgICA9IHByb3ZpZGUgSUVFRSBmbG9hdCB2YWx1ZXMuCisgKiAgUElYQVJMT0dEQVRBRk1UXzE2QklUICAgICA9IHByb3ZpZGUgdW5zaWduZWQgMTYtYml0IGludGVnZXIgdmFsdWVzCisgKiAgUElYQVJMT0dEQVRBRk1UXzhCSVQgICAgICA9IHByb3ZpZGUgdW5zaWduZWQgOC1iaXQgaW50ZWdlciB2YWx1ZXMKKyAqCisgKiBhbHRlcm5hdGVseSBQSVhBUkxPR0RBVEFGTVRfOEJJVEFCR1IgcHJvdmlkZXMgdW5zaWduZWQgOC1iaXQgaW50ZWdlcgorICogdmFsdWVzIHdpdGggdGhlIGRpZmZlcmVuY2UgdGhhdCBpZiB0aGVyZSBhcmUgZXhhY3RseSB0aHJlZSBvciBmb3VyIGNoYW5uZWxzCisgKiAocmdiIG9yIHJnYmEpIGl0IHN3YXBzIHRoZSBjaGFubmVsIG9yZGVyIChiZ3Igb3IgYWJncikuCisgKgorICogUElYQVJMT0dEQVRBRk1UXzExQklUTE9HIHByb3ZpZGVzIHRoZSBpbnRlcm5hbCBlbmNvZGluZyBkaXJlY3RseQorICogcGFja2VkIGluIDE2LWJpdCB2YWx1ZXMuICAgSG93ZXZlciBubyB0b29scyBhcmUgc3VwcGxpZWQgZm9yIGludGVycHJldGluZworICogdGhlc2UgdmFsdWVzLgorICoKKyAqICJob3QiIChvdmVyIDEuMCkgYXJlYXMgd3JpdHRlbiBpbiBmbG9hdGluZyBwb2ludCBnZXQgY2xhbXBlZCB0bworICogMS4wIGluIHRoZSBpbnRlZ2VyIGRhdGEgdHlwZXMuCisgKgorICogV2hlbiB0aGUgZmlsZSBpcyBjbG9zZWQgYWZ0ZXIgd3JpdGluZywgdGhlIGJpdCBkZXB0aCBhbmQgc2FtcGxlIGZvcm1hdAorICogYXJlIHNldCBhbHdheXMgdG8gYXBwZWFyIGFzIGlmIDgtYml0IGRhdGEgaGFzIGJlZW4gd3JpdHRlbiBpbnRvIGl0LgorICogVGhhdCB3YXkgYSBuYWl2ZSBwcm9ncmFtIHVuYXdhcmUgb2YgdGhlIHBhcnRpY3VsYXJzIG9mIHRoZSBlbmNvZGluZworICogZ2V0cyB0aGUgZm9ybWF0IGl0IGlzIG1vc3QgbGlrZWx5IGFibGUgdG8gaGFuZGxlLgorICoKKyAqIFRoZSBjb2RlYyBkb2VzIGl0J3Mgb3duIGhvcml6b250YWwgZGlmZmVyZW5jaW5nIHN0ZXAgb24gdGhlIGNvZGVkCisgKiB2YWx1ZXMgc28gdGhlIGxpYnJhcmllcyBwcmVkaWN0b3Igc3R1ZmYgc2hvdWxkIGJlIHR1cm5lZCBvZmYuCisgKiBUaGUgY29kZWMgYWxzbyBoYW5kbGUgYnl0ZSBzd2FwcGluZyB0aGUgZW5jb2RlZCB2YWx1ZXMgYXMgbmVjZXNzYXJ5CisgKiBzaW5jZSB0aGUgbGlicmFyeSBkb2VzIG5vdCBoYXZlIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkKKyAqIHRvIGtub3cgdGhlIGJpdCBkZXB0aCBvZiB0aGUgcmF3IHVuZW5jb2RlZCBidWZmZXIuCisgKgorICogTk9URTogVGhpcyBkZWNvZGVyIGRvZXMgbm90IGFwcGVhciB0byB1cGRhdGUgdGlmX3Jhd2NwLCBhbmQgdGlmX3Jhd2NjLgorICogVGhpcyBjYW4gY2F1c2UgcHJvYmxlbXMgd2l0aCB0aGUgaW1wbGVtZW50YXRpb24gb2YgQ0hVTktZX1NUUklQX1JFQURfU1VQUE9SVAorICogYXMgbm90ZWQgaW4gaHR0cDovL3RyYWMub3NnZW8ub3JnL2dkYWwvdGlja2V0LzM4OTQuICAgRnJhbmtXIC0gSmFuJzExCisgKi8KKworI2luY2x1ZGUgInRpZl9wcmVkaWN0LmgiCisjaW5jbHVkZSAiLi4vemxpYl92MTI4L3psaWIuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisvKiBUYWJsZXMgZm9yIGNvbnZlcnRpbmcgdG8vZnJvbSAxMSBiaXQgY29kZWQgdmFsdWVzICovCisKKyNkZWZpbmUgIFRTSVpFCSAyMDQ4CQkvKiBkZWNvZGUgdGFibGUgc2l6ZSAoMTEtYml0IHRva2VucykgKi8KKyNkZWZpbmUgIFRTSVpFUDEgMjA0OQkJLyogUGx1cyBvbmUgZm9yIHNsb3AgKi8KKyNkZWZpbmUgIE9ORQkgMTI1MAkJLyogdG9rZW4gdmFsdWUgb2YgMS4wIGV4YWN0bHkgKi8KKyNkZWZpbmUgIFJBVElPCSAxLjAwNAkJLyogbm9taW5hbCByYXRpbyBmb3IgbG9nIHBhcnQgKi8KKworI2RlZmluZSBDT0RFX01BU0sgMHg3ZmYgICAgICAgICAvKiAxMSBiaXRzLiAqLworCitzdGF0aWMgZmxvYXQgIEZsdHNpemU7CitzdGF0aWMgZmxvYXQgIExvZ0sxLCBMb2dLMjsKKworI2RlZmluZSBSRVBFQVQobiwgb3ApICAgeyBpbnQgaTsgaT1uOyBkbyB7IGktLTsgb3A7IH0gd2hpbGUgKGk+MCk7IH0KKworc3RhdGljIHZvaWQKK2hvcml6b250YWxBY2N1bXVsYXRlRih1aW50MTYgKndwLCBpbnQgbiwgaW50IHN0cmlkZSwgZmxvYXQgKm9wLAorCWZsb2F0ICpUb0xpbmVhckYpCit7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50ICBjciwgY2csIGNiLCBjYSwgbWFzazsKKyAgICByZWdpc3RlciBmbG9hdCAgdDAsIHQxLCB0MiwgdDM7CisKKyAgICBpZiAobiA+PSBzdHJpZGUpIHsKKwltYXNrID0gQ09ERV9NQVNLOworCWlmIChzdHJpZGUgPT0gMykgeworCSAgICB0MCA9IFRvTGluZWFyRltjciA9ICh3cFswXSAmIG1hc2spXTsKKwkgICAgdDEgPSBUb0xpbmVhckZbY2cgPSAod3BbMV0gJiBtYXNrKV07CisJICAgIHQyID0gVG9MaW5lYXJGW2NiID0gKHdwWzJdICYgbWFzayldOworCSAgICBvcFswXSA9IHQwOworCSAgICBvcFsxXSA9IHQxOworCSAgICBvcFsyXSA9IHQyOworCSAgICBuIC09IDM7CisJICAgIHdoaWxlIChuID4gMCkgeworCQl3cCArPSAzOworCQlvcCArPSAzOworCQluIC09IDM7CisJCXQwID0gVG9MaW5lYXJGWyhjciArPSB3cFswXSkgJiBtYXNrXTsKKwkJdDEgPSBUb0xpbmVhckZbKGNnICs9IHdwWzFdKSAmIG1hc2tdOworCQl0MiA9IFRvTGluZWFyRlsoY2IgKz0gd3BbMl0pICYgbWFza107CisJCW9wWzBdID0gdDA7CisJCW9wWzFdID0gdDE7CisJCW9wWzJdID0gdDI7CisJICAgIH0KKwl9IGVsc2UgaWYgKHN0cmlkZSA9PSA0KSB7CisJICAgIHQwID0gVG9MaW5lYXJGW2NyID0gKHdwWzBdICYgbWFzayldOworCSAgICB0MSA9IFRvTGluZWFyRltjZyA9ICh3cFsxXSAmIG1hc2spXTsKKwkgICAgdDIgPSBUb0xpbmVhckZbY2IgPSAod3BbMl0gJiBtYXNrKV07CisJICAgIHQzID0gVG9MaW5lYXJGW2NhID0gKHdwWzNdICYgbWFzayldOworCSAgICBvcFswXSA9IHQwOworCSAgICBvcFsxXSA9IHQxOworCSAgICBvcFsyXSA9IHQyOworCSAgICBvcFszXSA9IHQzOworCSAgICBuIC09IDQ7CisJICAgIHdoaWxlIChuID4gMCkgeworCQl3cCArPSA0OworCQlvcCArPSA0OworCQluIC09IDQ7CisJCXQwID0gVG9MaW5lYXJGWyhjciArPSB3cFswXSkgJiBtYXNrXTsKKwkJdDEgPSBUb0xpbmVhckZbKGNnICs9IHdwWzFdKSAmIG1hc2tdOworCQl0MiA9IFRvTGluZWFyRlsoY2IgKz0gd3BbMl0pICYgbWFza107CisJCXQzID0gVG9MaW5lYXJGWyhjYSArPSB3cFszXSkgJiBtYXNrXTsKKwkJb3BbMF0gPSB0MDsKKwkJb3BbMV0gPSB0MTsKKwkJb3BbMl0gPSB0MjsKKwkJb3BbM10gPSB0MzsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIFJFUEVBVChzdHJpZGUsICpvcCA9IFRvTGluZWFyRlsqd3AmbWFza107IHdwKys7IG9wKyspCisJICAgIG4gLT0gc3RyaWRlOworCSAgICB3aGlsZSAobiA+IDApIHsKKwkJUkVQRUFUKHN0cmlkZSwKKwkJICAgIHdwW3N0cmlkZV0gKz0gKndwOyAqb3AgPSBUb0xpbmVhckZbKndwJm1hc2tdOyB3cCsrOyBvcCsrKQorCQluIC09IHN0cmlkZTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitob3Jpem9udGFsQWNjdW11bGF0ZTEyKHVpbnQxNiAqd3AsIGludCBuLCBpbnQgc3RyaWRlLCBpbnQxNiAqb3AsCisJZmxvYXQgKlRvTGluZWFyRikKK3sKKyAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgIGNyLCBjZywgY2IsIGNhLCBtYXNrOworICAgIHJlZ2lzdGVyIGZsb2F0ICB0MCwgdDEsIHQyLCB0MzsKKworI2RlZmluZSBTQ0FMRTEyIDIwNDguMEYKKyNkZWZpbmUgQ0xBTVAxMih0KSAoKCh0KSA8IDMwNzEpID8gKHVpbnQxNikgKHQpIDogMzA3MSkKKworICAgIGlmIChuID49IHN0cmlkZSkgeworCW1hc2sgPSBDT0RFX01BU0s7CisJaWYgKHN0cmlkZSA9PSAzKSB7CisJICAgIHQwID0gVG9MaW5lYXJGW2NyID0gKHdwWzBdICYgbWFzayldICogU0NBTEUxMjsKKwkgICAgdDEgPSBUb0xpbmVhckZbY2cgPSAod3BbMV0gJiBtYXNrKV0gKiBTQ0FMRTEyOworCSAgICB0MiA9IFRvTGluZWFyRltjYiA9ICh3cFsyXSAmIG1hc2spXSAqIFNDQUxFMTI7CisJICAgIG9wWzBdID0gQ0xBTVAxMih0MCk7CisJICAgIG9wWzFdID0gQ0xBTVAxMih0MSk7CisJICAgIG9wWzJdID0gQ0xBTVAxMih0Mik7CisJICAgIG4gLT0gMzsKKwkgICAgd2hpbGUgKG4gPiAwKSB7CisJCXdwICs9IDM7CisJCW9wICs9IDM7CisJCW4gLT0gMzsKKwkJdDAgPSBUb0xpbmVhckZbKGNyICs9IHdwWzBdKSAmIG1hc2tdICogU0NBTEUxMjsKKwkJdDEgPSBUb0xpbmVhckZbKGNnICs9IHdwWzFdKSAmIG1hc2tdICogU0NBTEUxMjsKKwkJdDIgPSBUb0xpbmVhckZbKGNiICs9IHdwWzJdKSAmIG1hc2tdICogU0NBTEUxMjsKKwkJb3BbMF0gPSBDTEFNUDEyKHQwKTsKKwkJb3BbMV0gPSBDTEFNUDEyKHQxKTsKKwkJb3BbMl0gPSBDTEFNUDEyKHQyKTsKKwkgICAgfQorCX0gZWxzZSBpZiAoc3RyaWRlID09IDQpIHsKKwkgICAgdDAgPSBUb0xpbmVhckZbY3IgPSAod3BbMF0gJiBtYXNrKV0gKiBTQ0FMRTEyOworCSAgICB0MSA9IFRvTGluZWFyRltjZyA9ICh3cFsxXSAmIG1hc2spXSAqIFNDQUxFMTI7CisJICAgIHQyID0gVG9MaW5lYXJGW2NiID0gKHdwWzJdICYgbWFzayldICogU0NBTEUxMjsKKwkgICAgdDMgPSBUb0xpbmVhckZbY2EgPSAod3BbM10gJiBtYXNrKV0gKiBTQ0FMRTEyOworCSAgICBvcFswXSA9IENMQU1QMTIodDApOworCSAgICBvcFsxXSA9IENMQU1QMTIodDEpOworCSAgICBvcFsyXSA9IENMQU1QMTIodDIpOworCSAgICBvcFszXSA9IENMQU1QMTIodDMpOworCSAgICBuIC09IDQ7CisJICAgIHdoaWxlIChuID4gMCkgeworCQl3cCArPSA0OworCQlvcCArPSA0OworCQluIC09IDQ7CisJCXQwID0gVG9MaW5lYXJGWyhjciArPSB3cFswXSkgJiBtYXNrXSAqIFNDQUxFMTI7CisJCXQxID0gVG9MaW5lYXJGWyhjZyArPSB3cFsxXSkgJiBtYXNrXSAqIFNDQUxFMTI7CisJCXQyID0gVG9MaW5lYXJGWyhjYiArPSB3cFsyXSkgJiBtYXNrXSAqIFNDQUxFMTI7CisJCXQzID0gVG9MaW5lYXJGWyhjYSArPSB3cFszXSkgJiBtYXNrXSAqIFNDQUxFMTI7CisJCW9wWzBdID0gQ0xBTVAxMih0MCk7CisJCW9wWzFdID0gQ0xBTVAxMih0MSk7CisJCW9wWzJdID0gQ0xBTVAxMih0Mik7CisJCW9wWzNdID0gQ0xBTVAxMih0Myk7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBSRVBFQVQoc3RyaWRlLCB0MCA9IFRvTGluZWFyRlsqd3AmbWFza10gKiBTQ0FMRTEyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9wID0gQ0xBTVAxMih0MCk7IHdwKys7IG9wKyspCisJICAgIG4gLT0gc3RyaWRlOworCSAgICB3aGlsZSAobiA+IDApIHsKKwkJUkVQRUFUKHN0cmlkZSwKKwkJICAgIHdwW3N0cmlkZV0gKz0gKndwOyB0MCA9IFRvTGluZWFyRlt3cFtzdHJpZGVdJm1hc2tdKlNDQUxFMTI7CisJCSAgICAqb3AgPSBDTEFNUDEyKHQwKTsgIHdwKys7IG9wKyspCisJCW4gLT0gc3RyaWRlOworCSAgICB9CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK2hvcml6b250YWxBY2N1bXVsYXRlMTYodWludDE2ICp3cCwgaW50IG4sIGludCBzdHJpZGUsIHVpbnQxNiAqb3AsCisJdWludDE2ICpUb0xpbmVhcjE2KQoreworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCAgY3IsIGNnLCBjYiwgY2EsIG1hc2s7CisKKyAgICBpZiAobiA+PSBzdHJpZGUpIHsKKwltYXNrID0gQ09ERV9NQVNLOworCWlmIChzdHJpZGUgPT0gMykgeworCSAgICBvcFswXSA9IFRvTGluZWFyMTZbY3IgPSAod3BbMF0gJiBtYXNrKV07CisJICAgIG9wWzFdID0gVG9MaW5lYXIxNltjZyA9ICh3cFsxXSAmIG1hc2spXTsKKwkgICAgb3BbMl0gPSBUb0xpbmVhcjE2W2NiID0gKHdwWzJdICYgbWFzayldOworCSAgICBuIC09IDM7CisJICAgIHdoaWxlIChuID4gMCkgeworCQl3cCArPSAzOworCQlvcCArPSAzOworCQluIC09IDM7CisJCW9wWzBdID0gVG9MaW5lYXIxNlsoY3IgKz0gd3BbMF0pICYgbWFza107CisJCW9wWzFdID0gVG9MaW5lYXIxNlsoY2cgKz0gd3BbMV0pICYgbWFza107CisJCW9wWzJdID0gVG9MaW5lYXIxNlsoY2IgKz0gd3BbMl0pICYgbWFza107CisJICAgIH0KKwl9IGVsc2UgaWYgKHN0cmlkZSA9PSA0KSB7CisJICAgIG9wWzBdID0gVG9MaW5lYXIxNltjciA9ICh3cFswXSAmIG1hc2spXTsKKwkgICAgb3BbMV0gPSBUb0xpbmVhcjE2W2NnID0gKHdwWzFdICYgbWFzayldOworCSAgICBvcFsyXSA9IFRvTGluZWFyMTZbY2IgPSAod3BbMl0gJiBtYXNrKV07CisJICAgIG9wWzNdID0gVG9MaW5lYXIxNltjYSA9ICh3cFszXSAmIG1hc2spXTsKKwkgICAgbiAtPSA0OworCSAgICB3aGlsZSAobiA+IDApIHsKKwkJd3AgKz0gNDsKKwkJb3AgKz0gNDsKKwkJbiAtPSA0OworCQlvcFswXSA9IFRvTGluZWFyMTZbKGNyICs9IHdwWzBdKSAmIG1hc2tdOworCQlvcFsxXSA9IFRvTGluZWFyMTZbKGNnICs9IHdwWzFdKSAmIG1hc2tdOworCQlvcFsyXSA9IFRvTGluZWFyMTZbKGNiICs9IHdwWzJdKSAmIG1hc2tdOworCQlvcFszXSA9IFRvTGluZWFyMTZbKGNhICs9IHdwWzNdKSAmIG1hc2tdOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgUkVQRUFUKHN0cmlkZSwgKm9wID0gVG9MaW5lYXIxNlsqd3AmbWFza107IHdwKys7IG9wKyspCisJICAgIG4gLT0gc3RyaWRlOworCSAgICB3aGlsZSAobiA+IDApIHsKKwkJUkVQRUFUKHN0cmlkZSwKKwkJICAgIHdwW3N0cmlkZV0gKz0gKndwOyAqb3AgPSBUb0xpbmVhcjE2Wyp3cCZtYXNrXTsgd3ArKzsgb3ArKykKKwkJbiAtPSBzdHJpZGU7CisJICAgIH0KKwl9CisgICAgfQorfQorCisvKiAKKyAqIFJldHVybnMgdGhlIGxvZyBlbmNvZGVkIDExLWJpdCB2YWx1ZXMgd2l0aCB0aGUgaG9yaXpvbnRhbAorICogZGlmZmVyZW5jaW5nIHVuZG9uZS4KKyAqLworc3RhdGljIHZvaWQKK2hvcml6b250YWxBY2N1bXVsYXRlMTEodWludDE2ICp3cCwgaW50IG4sIGludCBzdHJpZGUsIHVpbnQxNiAqb3ApCit7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50ICBjciwgY2csIGNiLCBjYSwgbWFzazsKKworICAgIGlmIChuID49IHN0cmlkZSkgeworCW1hc2sgPSBDT0RFX01BU0s7CisJaWYgKHN0cmlkZSA9PSAzKSB7CisJICAgIG9wWzBdID0gY3IgPSB3cFswXTsgIG9wWzFdID0gY2cgPSB3cFsxXTsgIG9wWzJdID0gY2IgPSB3cFsyXTsKKwkgICAgbiAtPSAzOworCSAgICB3aGlsZSAobiA+IDApIHsKKwkJd3AgKz0gMzsKKwkJb3AgKz0gMzsKKwkJbiAtPSAzOworCQlvcFswXSA9IChjciArPSB3cFswXSkgJiBtYXNrOworCQlvcFsxXSA9IChjZyArPSB3cFsxXSkgJiBtYXNrOworCQlvcFsyXSA9IChjYiArPSB3cFsyXSkgJiBtYXNrOworCSAgICB9CisJfSBlbHNlIGlmIChzdHJpZGUgPT0gNCkgeworCSAgICBvcFswXSA9IGNyID0gd3BbMF07ICBvcFsxXSA9IGNnID0gd3BbMV07CisJICAgIG9wWzJdID0gY2IgPSB3cFsyXTsgIG9wWzNdID0gY2EgPSB3cFszXTsKKwkgICAgbiAtPSA0OworCSAgICB3aGlsZSAobiA+IDApIHsKKwkJd3AgKz0gNDsKKwkJb3AgKz0gNDsKKwkJbiAtPSA0OworCQlvcFswXSA9IChjciArPSB3cFswXSkgJiBtYXNrOworCQlvcFsxXSA9IChjZyArPSB3cFsxXSkgJiBtYXNrOworCQlvcFsyXSA9IChjYiArPSB3cFsyXSkgJiBtYXNrOworCQlvcFszXSA9IChjYSArPSB3cFszXSkgJiBtYXNrOworCSAgICB9IAorCX0gZWxzZSB7CisJICAgIFJFUEVBVChzdHJpZGUsICpvcCA9ICp3cCZtYXNrOyB3cCsrOyBvcCsrKQorCSAgICBuIC09IHN0cmlkZTsKKwkgICAgd2hpbGUgKG4gPiAwKSB7CisJCVJFUEVBVChzdHJpZGUsCisJCSAgICB3cFtzdHJpZGVdICs9ICp3cDsgKm9wID0gKndwJm1hc2s7IHdwKys7IG9wKyspCisJCW4gLT0gc3RyaWRlOworCSAgICB9CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK2hvcml6b250YWxBY2N1bXVsYXRlOCh1aW50MTYgKndwLCBpbnQgbiwgaW50IHN0cmlkZSwgdW5zaWduZWQgY2hhciAqb3AsCisJdW5zaWduZWQgY2hhciAqVG9MaW5lYXI4KQoreworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCAgY3IsIGNnLCBjYiwgY2EsIG1hc2s7CisKKyAgICBpZiAobiA+PSBzdHJpZGUpIHsKKwltYXNrID0gQ09ERV9NQVNLOworCWlmIChzdHJpZGUgPT0gMykgeworCSAgICBvcFswXSA9IFRvTGluZWFyOFtjciA9ICh3cFswXSAmIG1hc2spXTsKKwkgICAgb3BbMV0gPSBUb0xpbmVhcjhbY2cgPSAod3BbMV0gJiBtYXNrKV07CisJICAgIG9wWzJdID0gVG9MaW5lYXI4W2NiID0gKHdwWzJdICYgbWFzayldOworCSAgICBuIC09IDM7CisJICAgIHdoaWxlIChuID4gMCkgeworCQluIC09IDM7CisJCXdwICs9IDM7CisJCW9wICs9IDM7CisJCW9wWzBdID0gVG9MaW5lYXI4WyhjciArPSB3cFswXSkgJiBtYXNrXTsKKwkJb3BbMV0gPSBUb0xpbmVhcjhbKGNnICs9IHdwWzFdKSAmIG1hc2tdOworCQlvcFsyXSA9IFRvTGluZWFyOFsoY2IgKz0gd3BbMl0pICYgbWFza107CisJICAgIH0KKwl9IGVsc2UgaWYgKHN0cmlkZSA9PSA0KSB7CisJICAgIG9wWzBdID0gVG9MaW5lYXI4W2NyID0gKHdwWzBdICYgbWFzayldOworCSAgICBvcFsxXSA9IFRvTGluZWFyOFtjZyA9ICh3cFsxXSAmIG1hc2spXTsKKwkgICAgb3BbMl0gPSBUb0xpbmVhcjhbY2IgPSAod3BbMl0gJiBtYXNrKV07CisJICAgIG9wWzNdID0gVG9MaW5lYXI4W2NhID0gKHdwWzNdICYgbWFzayldOworCSAgICBuIC09IDQ7CisJICAgIHdoaWxlIChuID4gMCkgeworCQluIC09IDQ7CisJCXdwICs9IDQ7CisJCW9wICs9IDQ7CisJCW9wWzBdID0gVG9MaW5lYXI4WyhjciArPSB3cFswXSkgJiBtYXNrXTsKKwkJb3BbMV0gPSBUb0xpbmVhcjhbKGNnICs9IHdwWzFdKSAmIG1hc2tdOworCQlvcFsyXSA9IFRvTGluZWFyOFsoY2IgKz0gd3BbMl0pICYgbWFza107CisJCW9wWzNdID0gVG9MaW5lYXI4WyhjYSArPSB3cFszXSkgJiBtYXNrXTsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIFJFUEVBVChzdHJpZGUsICpvcCA9IFRvTGluZWFyOFsqd3AmbWFza107IHdwKys7IG9wKyspCisJICAgIG4gLT0gc3RyaWRlOworCSAgICB3aGlsZSAobiA+IDApIHsKKwkJUkVQRUFUKHN0cmlkZSwKKwkJICAgIHdwW3N0cmlkZV0gKz0gKndwOyAqb3AgPSBUb0xpbmVhcjhbKndwJm1hc2tdOyB3cCsrOyBvcCsrKQorCQluIC09IHN0cmlkZTsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK2hvcml6b250YWxBY2N1bXVsYXRlOGFiZ3IodWludDE2ICp3cCwgaW50IG4sIGludCBzdHJpZGUsIHVuc2lnbmVkIGNoYXIgKm9wLAorCXVuc2lnbmVkIGNoYXIgKlRvTGluZWFyOCkKK3sKKyAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgIGNyLCBjZywgY2IsIGNhLCBtYXNrOworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgIHQwLCB0MSwgdDIsIHQzOworCisgICAgaWYgKG4gPj0gc3RyaWRlKSB7CisJbWFzayA9IENPREVfTUFTSzsKKwlpZiAoc3RyaWRlID09IDMpIHsKKwkgICAgb3BbMF0gPSAwOworCSAgICB0MSA9IFRvTGluZWFyOFtjYiA9ICh3cFsyXSAmIG1hc2spXTsKKwkgICAgdDIgPSBUb0xpbmVhcjhbY2cgPSAod3BbMV0gJiBtYXNrKV07CisJICAgIHQzID0gVG9MaW5lYXI4W2NyID0gKHdwWzBdICYgbWFzayldOworCSAgICBvcFsxXSA9IHQxOworCSAgICBvcFsyXSA9IHQyOworCSAgICBvcFszXSA9IHQzOworCSAgICBuIC09IDM7CisJICAgIHdoaWxlIChuID4gMCkgeworCQluIC09IDM7CisJCXdwICs9IDM7CisJCW9wICs9IDQ7CisJCW9wWzBdID0gMDsKKwkJdDEgPSBUb0xpbmVhcjhbKGNiICs9IHdwWzJdKSAmIG1hc2tdOworCQl0MiA9IFRvTGluZWFyOFsoY2cgKz0gd3BbMV0pICYgbWFza107CisJCXQzID0gVG9MaW5lYXI4WyhjciArPSB3cFswXSkgJiBtYXNrXTsKKwkJb3BbMV0gPSB0MTsKKwkJb3BbMl0gPSB0MjsKKwkJb3BbM10gPSB0MzsKKwkgICAgfQorCX0gZWxzZSBpZiAoc3RyaWRlID09IDQpIHsKKwkgICAgdDAgPSBUb0xpbmVhcjhbY2EgPSAod3BbM10gJiBtYXNrKV07CisJICAgIHQxID0gVG9MaW5lYXI4W2NiID0gKHdwWzJdICYgbWFzayldOworCSAgICB0MiA9IFRvTGluZWFyOFtjZyA9ICh3cFsxXSAmIG1hc2spXTsKKwkgICAgdDMgPSBUb0xpbmVhcjhbY3IgPSAod3BbMF0gJiBtYXNrKV07CisJICAgIG9wWzBdID0gdDA7CisJICAgIG9wWzFdID0gdDE7CisJICAgIG9wWzJdID0gdDI7CisJICAgIG9wWzNdID0gdDM7CisJICAgIG4gLT0gNDsKKwkgICAgd2hpbGUgKG4gPiAwKSB7CisJCW4gLT0gNDsKKwkJd3AgKz0gNDsKKwkJb3AgKz0gNDsKKwkJdDAgPSBUb0xpbmVhcjhbKGNhICs9IHdwWzNdKSAmIG1hc2tdOworCQl0MSA9IFRvTGluZWFyOFsoY2IgKz0gd3BbMl0pICYgbWFza107CisJCXQyID0gVG9MaW5lYXI4WyhjZyArPSB3cFsxXSkgJiBtYXNrXTsKKwkJdDMgPSBUb0xpbmVhcjhbKGNyICs9IHdwWzBdKSAmIG1hc2tdOworCQlvcFswXSA9IHQwOworCQlvcFsxXSA9IHQxOworCQlvcFsyXSA9IHQyOworCQlvcFszXSA9IHQzOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgUkVQRUFUKHN0cmlkZSwgKm9wID0gVG9MaW5lYXI4Wyp3cCZtYXNrXTsgd3ArKzsgb3ArKykKKwkgICAgbiAtPSBzdHJpZGU7CisJICAgIHdoaWxlIChuID4gMCkgeworCQlSRVBFQVQoc3RyaWRlLAorCQkgICAgd3Bbc3RyaWRlXSArPSAqd3A7ICpvcCA9IFRvTGluZWFyOFsqd3AmbWFza107IHdwKys7IG9wKyspCisJCW4gLT0gc3RyaWRlOworCSAgICB9CisJfQorICAgIH0KK30KKworLyoKKyAqIFN0YXRlIGJsb2NrIGZvciBlYWNoIG9wZW4gVElGRgorICogZmlsZSB1c2luZyBQaXhhckxvZyBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uLgorICovCit0eXBlZGVmCXN0cnVjdCB7CisJVElGRlByZWRpY3RvclN0YXRlCXByZWRpY3Q7CisJel9zdHJlYW0JCXN0cmVhbTsKKwl1aW50MTYJCQkqdGJ1ZjsgCisJdWludDE2CQkJc3RyaWRlOworCWludAkJCXN0YXRlOworCWludAkJCXVzZXJfZGF0YWZtdDsKKwlpbnQJCQlxdWFsaXR5OworI2RlZmluZSBQTFNUQVRFX0lOSVQgMQorCisJVElGRlZTZXRNZXRob2QJCXZnZXRwYXJlbnQ7CS8qIHN1cGVyLWNsYXNzIG1ldGhvZCAqLworCVRJRkZWU2V0TWV0aG9kCQl2c2V0cGFyZW50OwkvKiBzdXBlci1jbGFzcyBtZXRob2QgKi8KKworCWZsb2F0ICpUb0xpbmVhckY7CisJdWludDE2ICpUb0xpbmVhcjE2OworCXVuc2lnbmVkIGNoYXIgKlRvTGluZWFyODsKKwl1aW50MTYgICpGcm9tTFQyOworCXVpbnQxNiAgKkZyb20xNDsgLyogUmVhbGx5IGZvciAxNi1iaXQgZGF0YSwgYnV0IHdlIHNoaWZ0IGRvd24gMiAqLworCXVpbnQxNiAgKkZyb204OworCQorfSBQaXhhckxvZ1N0YXRlOworCitzdGF0aWMgaW50CitQaXhhckxvZ01ha2VUYWJsZXMoUGl4YXJMb2dTdGF0ZSAqc3ApCit7CisKKy8qCisgKiAgICBXZSBtYWtlIHNldmVyYWwgdGFibGVzIGhlcmUgdG8gY29udmVydCBiZXR3ZWVuIHZhcmlvdXMgZXh0ZXJuYWwKKyAqICAgIHJlcHJlc2VudGF0aW9ucyAoZmxvYXQsIDE2LWJpdCwgYW5kIDgtYml0KSBhbmQgdGhlIGludGVybmFsCisgKiAgICAxMS1iaXQgY29tcGFuZGVkIHJlcHJlc2VudGF0aW9uLiAgVGhlIDExLWJpdCByZXByZXNlbnRhdGlvbiBoYXMgdHdvCisgKiAgICBkaXN0aW5jdCByZWdpb25zLiAgQSBsaW5lYXIgYm90dG9tIGVuZCB1cCB0aHJvdWdoIC4wMTgzMTYgaW4gc3RlcHMKKyAqICAgIG9mIGFib3V0IC4wMDAwNzMsIGFuZCBhIHJlZ2lvbiBvZiBjb25zdGFudCByYXRpbyB1cCB0byBhYm91dCAyNS4KKyAqICAgIFRoZXNlIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgYXJlIHN0b3JlZCBpbiB0aGUgbWFpbiB0YWJsZSBUb0xpbmVhckYuIAorICogICAgQWxsIG90aGVyIHRhYmxlcyBhcmUgZGVyaXZlZCBmcm9tIHRoaXMgb25lLiAgVGhlIHRhYmxlcyAoYW5kIHRoZQorICogICAgcmF0aW9zKSBhcmUgY29udGludW91cyBhdCB0aGUgaW50ZXJuYWwgc2VhbS4KKyAqLworCisgICAgaW50ICBubGluLCBsdDJzaXplOworICAgIGludCAgaSwgajsKKyAgICBkb3VibGUgIGIsIGMsIGxpbnN0ZXAsIHY7CisgICAgZmxvYXQgKlRvTGluZWFyRjsKKyAgICB1aW50MTYgKlRvTGluZWFyMTY7CisgICAgdW5zaWduZWQgY2hhciAqVG9MaW5lYXI4OworICAgIHVpbnQxNiAgKkZyb21MVDI7CisgICAgdWludDE2ICAqRnJvbTE0OyAvKiBSZWFsbHkgZm9yIDE2LWJpdCBkYXRhLCBidXQgd2Ugc2hpZnQgZG93biAyICovCisgICAgdWludDE2ICAqRnJvbTg7CisKKyAgICBjID0gbG9nKFJBVElPKTsJCisgICAgbmxpbiA9IChpbnQpKDEuL2MpOwkvKiBubGluIG11c3QgYmUgYW4gaW50ZWdlciAqLworICAgIGMgPSAxLi9ubGluOworICAgIGIgPSBleHAoLWMqT05FKTsJLyogbXVsdGlwbGljYXRpdmUgc2NhbGUgZmFjdG9yIFtiKmV4cChjKk9ORSkgPSAxXSAqLworICAgIGxpbnN0ZXAgPSBiKmMqZXhwKDEuKTsKKworICAgIExvZ0sxID0gKGZsb2F0KSgxLi9jKTsJLyogaWYgKHYgPj0gMikgIHRva2VuID0gazEqbG9nKHYqazIpICovCisgICAgTG9nSzIgPSAoZmxvYXQpKDEuL2IpOworICAgIGx0MnNpemUgPSAoaW50KSgyLi9saW5zdGVwKSArIDE7CisgICAgRnJvbUxUMiA9ICh1aW50MTYgKilfVElGRm1hbGxvYyhsdDJzaXplKnNpemVvZih1aW50MTYpKTsKKyAgICBGcm9tMTQgPSAodWludDE2ICopX1RJRkZtYWxsb2MoMTYzODQqc2l6ZW9mKHVpbnQxNikpOworICAgIEZyb204ID0gKHVpbnQxNiAqKV9USUZGbWFsbG9jKDI1NipzaXplb2YodWludDE2KSk7CisgICAgVG9MaW5lYXJGID0gKGZsb2F0ICopX1RJRkZtYWxsb2MoVFNJWkVQMSAqIHNpemVvZihmbG9hdCkpOworICAgIFRvTGluZWFyMTYgPSAodWludDE2ICopX1RJRkZtYWxsb2MoVFNJWkVQMSAqIHNpemVvZih1aW50MTYpKTsKKyAgICBUb0xpbmVhcjggPSAodW5zaWduZWQgY2hhciAqKV9USUZGbWFsbG9jKFRTSVpFUDEgKiBzaXplb2YodW5zaWduZWQgY2hhcikpOworICAgIGlmIChGcm9tTFQyID09IE5VTEwgfHwgRnJvbTE0ICA9PSBOVUxMIHx8IEZyb204ICAgPT0gTlVMTCB8fAorCSBUb0xpbmVhckYgPT0gTlVMTCB8fCBUb0xpbmVhcjE2ID09IE5VTEwgfHwgVG9MaW5lYXI4ID09IE5VTEwpIHsKKwlpZiAoRnJvbUxUMikgX1RJRkZmcmVlKEZyb21MVDIpOworCWlmIChGcm9tMTQpIF9USUZGZnJlZShGcm9tMTQpOworCWlmIChGcm9tOCkgX1RJRkZmcmVlKEZyb204KTsKKwlpZiAoVG9MaW5lYXJGKSBfVElGRmZyZWUoVG9MaW5lYXJGKTsKKwlpZiAoVG9MaW5lYXIxNikgX1RJRkZmcmVlKFRvTGluZWFyMTYpOworCWlmIChUb0xpbmVhcjgpIF9USUZGZnJlZShUb0xpbmVhcjgpOworCXNwLT5Gcm9tTFQyID0gTlVMTDsKKwlzcC0+RnJvbTE0ID0gTlVMTDsKKwlzcC0+RnJvbTggPSBOVUxMOworCXNwLT5Ub0xpbmVhckYgPSBOVUxMOworCXNwLT5Ub0xpbmVhcjE2ID0gTlVMTDsKKwlzcC0+VG9MaW5lYXI4ID0gTlVMTDsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICBqID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBubGluOyBpKyspICB7CisJdiA9IGkgKiBsaW5zdGVwOworCVRvTGluZWFyRltqKytdID0gKGZsb2F0KXY7CisgICAgfQorCisgICAgZm9yIChpID0gbmxpbjsgaSA8IFRTSVpFOyBpKyspCisJVG9MaW5lYXJGW2orK10gPSAoZmxvYXQpKGIqZXhwKGMqaSkpOworCisgICAgVG9MaW5lYXJGWzIwNDhdID0gVG9MaW5lYXJGWzIwNDddOworCisgICAgZm9yIChpID0gMDsgaSA8IFRTSVpFUDE7IGkrKykgIHsKKwl2ID0gVG9MaW5lYXJGW2ldKjY1NTM1LjAgKyAwLjU7CisJVG9MaW5lYXIxNltpXSA9ICh2ID4gNjU1MzUuMCkgPyA2NTUzNSA6ICh1aW50MTYpdjsKKwl2ID0gVG9MaW5lYXJGW2ldKjI1NS4wICArIDAuNTsKKwlUb0xpbmVhcjhbaV0gID0gKHYgPiAyNTUuMCkgPyAyNTUgOiAodW5zaWduZWQgY2hhcil2OworICAgIH0KKworICAgIGogPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBsdDJzaXplOyBpKyspICB7CisJaWYgKChpKmxpbnN0ZXApKihpKmxpbnN0ZXApID4gVG9MaW5lYXJGW2pdKlRvTGluZWFyRltqKzFdKQorCSAgICBqKys7CisJRnJvbUxUMltpXSA9IGo7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTaW5jZSB3ZSBsb3NlIGluZm8gYW55d2F5IG9uIDE2LWJpdCBkYXRhLCB3ZSBzZXQgdXAgYSAxNC1iaXQKKyAgICAgKiB0YWJsZSBhbmQgc2hpZnQgMTYtYml0IHZhbHVlcyBkb3duIHR3byBiaXRzIG9uIGlucHV0LgorICAgICAqIHNhdmVzIGEgbGl0dGxlIHRhYmxlIHNwYWNlLgorICAgICAqLworICAgIGogPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjM4NDsgaSsrKSAgeworCXdoaWxlICgoaS8xNjM4My4pKihpLzE2MzgzLikgPiBUb0xpbmVhckZbal0qVG9MaW5lYXJGW2orMV0pCisJICAgIGorKzsKKwlGcm9tMTRbaV0gPSBqOworICAgIH0KKworICAgIGogPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgIHsKKwl3aGlsZSAoKGkvMjU1LikqKGkvMjU1LikgPiBUb0xpbmVhckZbal0qVG9MaW5lYXJGW2orMV0pCisJICAgIGorKzsKKwlGcm9tOFtpXSA9IGo7CisgICAgfQorCisgICAgRmx0c2l6ZSA9IChmbG9hdCkobHQyc2l6ZS8yKTsKKworICAgIHNwLT5Ub0xpbmVhckYgPSBUb0xpbmVhckY7CisgICAgc3AtPlRvTGluZWFyMTYgPSBUb0xpbmVhcjE2OworICAgIHNwLT5Ub0xpbmVhcjggPSBUb0xpbmVhcjg7CisgICAgc3AtPkZyb21MVDIgPSBGcm9tTFQyOworICAgIHNwLT5Gcm9tMTQgPSBGcm9tMTQ7CisgICAgc3AtPkZyb204ID0gRnJvbTg7CisKKyAgICByZXR1cm4gMTsKK30KKworI2RlZmluZSBEZWNvZGVyU3RhdGUodGlmKQkoKFBpeGFyTG9nU3RhdGUqKSAodGlmKS0+dGlmX2RhdGEpCisjZGVmaW5lIEVuY29kZXJTdGF0ZSh0aWYpCSgoUGl4YXJMb2dTdGF0ZSopICh0aWYpLT50aWZfZGF0YSkKKworc3RhdGljIGludCBQaXhhckxvZ0VuY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBicCwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKTsKK3N0YXRpYyBpbnQgUGl4YXJMb2dEZWNvZGUoVElGRiogdGlmLCB1aW50OCogb3AsIHRtc2l6ZV90IG9jYywgdWludDE2IHMpOworCisjZGVmaW5lIFBJWEFSTE9HREFUQUZNVF9VTktOT1dOCS0xCisKK3N0YXRpYyBpbnQKK1BpeGFyTG9nR3Vlc3NEYXRhRm10KFRJRkZEaXJlY3RvcnkgKnRkKQoreworCWludCBndWVzcyA9IFBJWEFSTE9HREFUQUZNVF9VTktOT1dOOworCWludCBmb3JtYXQgPSB0ZC0+dGRfc2FtcGxlZm9ybWF0OworCisJLyogSWYgdGhlIHVzZXIgZGlkbid0IHRlbGwgdXMgaGlzIGRhdGFmbXQsCisJICogdGFrZSBvdXIgYmVzdCBndWVzcyBmcm9tIHRoZSBiaXRzcGVyc2FtcGxlLgorCSAqLworCXN3aXRjaCAodGQtPnRkX2JpdHNwZXJzYW1wbGUpIHsKKwkgY2FzZSAzMjoKKwkJaWYgKGZvcm1hdCA9PSBTQU1QTEVGT1JNQVRfSUVFRUZQKQorCQkJZ3Vlc3MgPSBQSVhBUkxPR0RBVEFGTVRfRkxPQVQ7CisJCWJyZWFrOworCSBjYXNlIDE2OgorCQlpZiAoZm9ybWF0ID09IFNBTVBMRUZPUk1BVF9WT0lEIHx8IGZvcm1hdCA9PSBTQU1QTEVGT1JNQVRfVUlOVCkKKwkJCWd1ZXNzID0gUElYQVJMT0dEQVRBRk1UXzE2QklUOworCQlicmVhazsKKwkgY2FzZSAxMjoKKwkJaWYgKGZvcm1hdCA9PSBTQU1QTEVGT1JNQVRfVk9JRCB8fCBmb3JtYXQgPT0gU0FNUExFRk9STUFUX0lOVCkKKwkJCWd1ZXNzID0gUElYQVJMT0dEQVRBRk1UXzEyQklUUElDSU87CisJCWJyZWFrOworCSBjYXNlIDExOgorCQlpZiAoZm9ybWF0ID09IFNBTVBMRUZPUk1BVF9WT0lEIHx8IGZvcm1hdCA9PSBTQU1QTEVGT1JNQVRfVUlOVCkKKwkJCWd1ZXNzID0gUElYQVJMT0dEQVRBRk1UXzExQklUTE9HOworCQlicmVhazsKKwkgY2FzZSA4OgorCQlpZiAoZm9ybWF0ID09IFNBTVBMRUZPUk1BVF9WT0lEIHx8IGZvcm1hdCA9PSBTQU1QTEVGT1JNQVRfVUlOVCkKKwkJCWd1ZXNzID0gUElYQVJMT0dEQVRBRk1UXzhCSVQ7CisJCWJyZWFrOworCX0KKworCXJldHVybiBndWVzczsKK30KKworc3RhdGljIHRtc2l6ZV90CittdWx0aXBseV9tcyh0bXNpemVfdCBtMSwgdG1zaXplX3QgbTIpCit7CisJdG1zaXplX3QgYnl0ZXMgPSBtMSAqIG0yOworCisJaWYgKG0xICYmIGJ5dGVzIC8gbTEgIT0gbTIpCisJCWJ5dGVzID0gMDsKKworCXJldHVybiBieXRlczsKK30KKworc3RhdGljIHRtc2l6ZV90CithZGRfbXModG1zaXplX3QgbTEsIHRtc2l6ZV90IG0yKQoreworCXRtc2l6ZV90IGJ5dGVzID0gbTEgKyBtMjsKKworCS8qIGlmIGVpdGhlciBpbnB1dCBpcyB6ZXJvLCBhc3N1bWUgb3ZlcmZsb3cgYWxyZWFkeSBvY2N1cnJlZCAqLworCWlmIChtMSA9PSAwIHx8IG0yID09IDApCisJCWJ5dGVzID0gMDsKKwllbHNlIGlmIChieXRlcyA8PSBtMSB8fCBieXRlcyA8PSBtMikKKwkJYnl0ZXMgPSAwOworCisJcmV0dXJuIGJ5dGVzOworfQorCitzdGF0aWMgaW50CitQaXhhckxvZ0ZpeHVwVGFncyhUSUZGKiB0aWYpCit7CisJKHZvaWQpIHRpZjsKKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW50CitQaXhhckxvZ1NldHVwRGVjb2RlKFRJRkYqIHRpZikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJQaXhhckxvZ1NldHVwRGVjb2RlIjsKKwlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisJUGl4YXJMb2dTdGF0ZSogc3AgPSBEZWNvZGVyU3RhdGUodGlmKTsKKwl0bXNpemVfdCB0YnVmX3NpemU7CisKKwlhc3NlcnQoc3AgIT0gTlVMTCk7CisKKwkvKiBNYWtlIHN1cmUgbm8gYnl0ZSBzd2FwcGluZyBoYXBwZW5zIG9uIHRoZSBkYXRhCisJICogYWZ0ZXIgZGVjb21wcmVzc2lvbi4gKi8KKwl0aWYtPnRpZl9wb3N0ZGVjb2RlID0gX1RJRkZOb1Bvc3REZWNvZGU7ICAKKworCS8qIGZvciBzb21lIHJlYXNvbiwgd2UgY2FuJ3QgZG8gdGhpcyBpbiBUSUZGSW5pdFBpeGFyTG9nICovCisKKwlzcC0+c3RyaWRlID0gKHRkLT50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX0NPTlRJRyA/CisJICAgIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwgOiAxKTsKKwl0YnVmX3NpemUgPSBtdWx0aXBseV9tcyhtdWx0aXBseV9tcyhtdWx0aXBseV9tcyhzcC0+c3RyaWRlLCB0ZC0+dGRfaW1hZ2V3aWR0aCksCisJCQkJICAgICAgdGQtPnRkX3Jvd3NwZXJzdHJpcCksIHNpemVvZih1aW50MTYpKTsKKwkvKiBhZGQgb25lIG1vcmUgc3RyaWRlIGluIGNhc2UgaW5wdXQgZW5kcyBtaWQtc3RyaWRlICovCisJdGJ1Zl9zaXplID0gYWRkX21zKHRidWZfc2l6ZSwgc2l6ZW9mKHVpbnQxNikgKiBzcC0+c3RyaWRlKTsKKwlpZiAodGJ1Zl9zaXplID09IDApCisJCXJldHVybiAoMCk7ICAgLyogVE9ETzogdGhpcyBpcyBhbiBlcnJvciByZXR1cm4gd2l0aG91dCBlcnJvciByZXBvcnQgdGhyb3VnaCBUSUZGRXJyb3JFeHQgKi8KKwlzcC0+dGJ1ZiA9ICh1aW50MTYgKikgX1RJRkZtYWxsb2ModGJ1Zl9zaXplKTsKKwlpZiAoc3AtPnRidWYgPT0gTlVMTCkKKwkJcmV0dXJuICgwKTsKKwlpZiAoc3AtPnVzZXJfZGF0YWZtdCA9PSBQSVhBUkxPR0RBVEFGTVRfVU5LTk9XTikKKwkJc3AtPnVzZXJfZGF0YWZtdCA9IFBpeGFyTG9nR3Vlc3NEYXRhRm10KHRkKTsKKwlpZiAoc3AtPnVzZXJfZGF0YWZtdCA9PSBQSVhBUkxPR0RBVEFGTVRfVU5LTk9XTikgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJIlBpeGFyTG9nIGNvbXByZXNzaW9uIGNhbid0IGhhbmRsZSBiaXRzIGRlcHRoL2RhdGEgZm9ybWF0IGNvbWJpbmF0aW9uIChkZXB0aDogJWQpIiwgCisJCQl0ZC0+dGRfYml0c3BlcnNhbXBsZSk7CisJCXJldHVybiAoMCk7CisJfQorCisJaWYgKGluZmxhdGVJbml0KCZzcC0+c3RyZWFtKSAhPSBaX09LKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICIlcyIsIHNwLT5zdHJlYW0ubXNnKTsKKwkJcmV0dXJuICgwKTsKKwl9IGVsc2UgeworCQlzcC0+c3RhdGUgfD0gUExTVEFURV9JTklUOworCQlyZXR1cm4gKDEpOworCX0KK30KKworLyoKKyAqIFNldHVwIHN0YXRlIGZvciBkZWNvZGluZyBhIHN0cmlwLgorICovCitzdGF0aWMgaW50CitQaXhhckxvZ1ByZURlY29kZShUSUZGKiB0aWYsIHVpbnQxNiBzKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlBpeGFyTG9nUHJlRGVjb2RlIjsKKwlQaXhhckxvZ1N0YXRlKiBzcCA9IERlY29kZXJTdGF0ZSh0aWYpOworCisJKHZvaWQpIHM7CisJYXNzZXJ0KHNwICE9IE5VTEwpOworCXNwLT5zdHJlYW0ubmV4dF9pbiA9IHRpZi0+dGlmX3Jhd2RhdGE7CisJYXNzZXJ0KHNpemVvZihzcC0+c3RyZWFtLmF2YWlsX2luKT09NCk7ICAvKiBpZiB0aGlzIGFzc2VydCBnZXRzIHJhaXNlZCwKKwkgICAgd2UgbmVlZCB0byBzaW1wbGlmeSB0aGlzIGNvZGUgdG8gcmVmbGVjdCBhIFpMaWIgdGhhdCBpcyBsaWtlbHkgdXBkYXRlZAorCSAgICB0byBkZWFsIHdpdGggOGJ5dGUgbWVtb3J5IHNpemVzLCB0aG91Z2ggdGhpcyBjb2RlIHdpbGwgcmVzcG9uZAorCSAgICBhcHJvcHJpYXRlbHkgZXZlbiBiZWZvcmUgd2Ugc2ltcGxpZnkgaXQgKi8KKwlzcC0+c3RyZWFtLmF2YWlsX2luID0gKHVJbnQpIHRpZi0+dGlmX3Jhd2NjOworCWlmICgodG1zaXplX3Qpc3AtPnN0cmVhbS5hdmFpbF9pbiAhPSB0aWYtPnRpZl9yYXdjYykKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJaTGliIGNhbm5vdCBkZWFsIHdpdGggYnVmZmVycyB0aGlzIHNpemUiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJcmV0dXJuIChpbmZsYXRlUmVzZXQoJnNwLT5zdHJlYW0pID09IFpfT0spOworfQorCitzdGF0aWMgaW50CitQaXhhckxvZ0RlY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBvcCwgdG1zaXplX3Qgb2NjLCB1aW50MTYgcykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJQaXhhckxvZ0RlY29kZSI7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCVBpeGFyTG9nU3RhdGUqIHNwID0gRGVjb2RlclN0YXRlKHRpZik7CisJdG1zaXplX3QgaTsKKwl0bXNpemVfdCBuc2FtcGxlczsKKwlpbnQgbGxlbjsKKwl1aW50MTYgKnVwOworCisJc3dpdGNoIChzcC0+dXNlcl9kYXRhZm10KSB7CisJY2FzZSBQSVhBUkxPR0RBVEFGTVRfRkxPQVQ6CisJCW5zYW1wbGVzID0gb2NjIC8gc2l6ZW9mKGZsb2F0KTsJLyogWFhYIGZsb2F0ID09IDMyIGJpdHMgKi8KKwkJYnJlYWs7CisJY2FzZSBQSVhBUkxPR0RBVEFGTVRfMTZCSVQ6CisJY2FzZSBQSVhBUkxPR0RBVEFGTVRfMTJCSVRQSUNJTzoKKwljYXNlIFBJWEFSTE9HREFUQUZNVF8xMUJJVExPRzoKKwkJbnNhbXBsZXMgPSBvY2MgLyBzaXplb2YodWludDE2KTsgLyogWFhYIHVpbnQxNiA9PSAxNiBiaXRzICovCisJCWJyZWFrOworCWNhc2UgUElYQVJMT0dEQVRBRk1UXzhCSVQ6CisJY2FzZSBQSVhBUkxPR0RBVEFGTVRfOEJJVEFCR1I6CisJCW5zYW1wbGVzID0gb2NjOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJIiVkIGJpdCBpbnB1dCBub3Qgc3VwcG9ydGVkIGluIFBpeGFyTG9nIiwKKwkJCXRkLT50ZF9iaXRzcGVyc2FtcGxlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbGxlbiA9IHNwLT5zdHJpZGUgKiB0ZC0+dGRfaW1hZ2V3aWR0aDsKKworCSh2b2lkKSBzOworCWFzc2VydChzcCAhPSBOVUxMKTsKKwlzcC0+c3RyZWFtLm5leHRfb3V0ID0gKHVuc2lnbmVkIGNoYXIgKikgc3AtPnRidWY7CisJYXNzZXJ0KHNpemVvZihzcC0+c3RyZWFtLmF2YWlsX291dCk9PTQpOyAgLyogaWYgdGhpcyBhc3NlcnQgZ2V0cyByYWlzZWQsCisJICAgIHdlIG5lZWQgdG8gc2ltcGxpZnkgdGhpcyBjb2RlIHRvIHJlZmxlY3QgYSBaTGliIHRoYXQgaXMgbGlrZWx5IHVwZGF0ZWQKKwkgICAgdG8gZGVhbCB3aXRoIDhieXRlIG1lbW9yeSBzaXplcywgdGhvdWdoIHRoaXMgY29kZSB3aWxsIHJlc3BvbmQKKwkgICAgYXByb3ByaWF0ZWx5IGV2ZW4gYmVmb3JlIHdlIHNpbXBsaWZ5IGl0ICovCisJc3AtPnN0cmVhbS5hdmFpbF9vdXQgPSAodUludCkgKG5zYW1wbGVzICogc2l6ZW9mKHVpbnQxNikpOworCWlmIChzcC0+c3RyZWFtLmF2YWlsX291dCAhPSBuc2FtcGxlcyAqIHNpemVvZih1aW50MTYpKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIlpMaWIgY2Fubm90IGRlYWwgd2l0aCBidWZmZXJzIHRoaXMgc2l6ZSIpOworCQlyZXR1cm4gKDApOworCX0KKwlkbyB7CisJCWludCBzdGF0ZSA9IGluZmxhdGUoJnNwLT5zdHJlYW0sIFpfUEFSVElBTF9GTFVTSCk7CisJCWlmIChzdGF0ZSA9PSBaX1NUUkVBTV9FTkQpIHsKKwkJCWJyZWFrOwkJCS8qIFhYWCAqLworCQl9CisJCWlmIChzdGF0ZSA9PSBaX0RBVEFfRVJST1IpIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgIkRlY29kaW5nIGVycm9yIGF0IHNjYW5saW5lICVsdSwgJXMiLAorCQkJICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3csIHNwLT5zdHJlYW0ubXNnKTsKKwkJCWlmIChpbmZsYXRlU3luYygmc3AtPnN0cmVhbSkgIT0gWl9PSykKKwkJCQlyZXR1cm4gKDApOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHN0YXRlICE9IFpfT0spIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJaTGliIGVycm9yOiAlcyIsCisJCQkgICAgc3AtPnN0cmVhbS5tc2cpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCX0gd2hpbGUgKHNwLT5zdHJlYW0uYXZhaWxfb3V0ID4gMCk7CisKKwkvKiBob3BlZnVsbHksIHdlIGdvdCBhbGwgdGhlIGJ5dGVzIHdlIG5lZWRlZCAqLworCWlmIChzcC0+c3RyZWFtLmF2YWlsX291dCAhPSAwKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCSAgICAiTm90IGVub3VnaCBkYXRhIGF0IHNjYW5saW5lICVsdSAoc2hvcnQgIiBUSUZGX1VJTlQ2NF9GT1JNQVQgIiBieXRlcykiLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX3JvdywgKFRJRkZfVUlOVDY0X1QpIHNwLT5zdHJlYW0uYXZhaWxfb3V0KTsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwl1cCA9IHNwLT50YnVmOworCS8qIFN3YXAgYnl0ZXMgaW4gdGhlIGRhdGEgaWYgZnJvbSBhIGRpZmZlcmVudCBlbmRpYW4gbWFjaGluZS4gKi8KKwlpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1NXQUIpCisJCVRJRkZTd2FiQXJyYXlPZlNob3J0KHVwLCBuc2FtcGxlcyk7CisKKwkvKgorCSAqIGlmIGxsZW4gaXMgbm90IGFuIGV4YWN0IG11bHRpcGxlIG9mIG5zYW1wbGVzLCB0aGUgZGVjb2RlIG9wZXJhdGlvbgorCSAqIG1heSBvdmVyZmxvdyB0aGUgb3V0cHV0IGJ1ZmZlciwgc28gdHJ1bmNhdGUgaXQgZW5vdWdoIHRvIHByZXZlbnQKKwkgKiB0aGF0IGJ1dCBzdGlsbCBzYWx2YWdlIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZS4KKwkgKi8KKwlpZiAobnNhbXBsZXMgJSBsbGVuKSB7IAorCQlUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkic3RyaWRlICVsdSBpcyBub3QgYSBtdWx0aXBsZSBvZiBzYW1wbGUgY291bnQsICIKKwkJCSIlbHUsIGRhdGEgdHJ1bmNhdGVkLiIsICh1bnNpZ25lZCBsb25nKSBsbGVuLCAodW5zaWduZWQgbG9uZykgbnNhbXBsZXMpOworCQluc2FtcGxlcyAtPSBuc2FtcGxlcyAlIGxsZW47CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5zYW1wbGVzOyBpICs9IGxsZW4sIHVwICs9IGxsZW4pIHsKKwkJc3dpdGNoIChzcC0+dXNlcl9kYXRhZm10KSAgeworCQljYXNlIFBJWEFSTE9HREFUQUZNVF9GTE9BVDoKKwkJCWhvcml6b250YWxBY2N1bXVsYXRlRih1cCwgbGxlbiwgc3AtPnN0cmlkZSwKKwkJCQkJKGZsb2F0ICopb3AsIHNwLT5Ub0xpbmVhckYpOworCQkJb3AgKz0gbGxlbiAqIHNpemVvZihmbG9hdCk7CisJCQlicmVhazsKKwkJY2FzZSBQSVhBUkxPR0RBVEFGTVRfMTZCSVQ6CisJCQlob3Jpem9udGFsQWNjdW11bGF0ZTE2KHVwLCBsbGVuLCBzcC0+c3RyaWRlLAorCQkJCQkodWludDE2ICopb3AsIHNwLT5Ub0xpbmVhcjE2KTsKKwkJCW9wICs9IGxsZW4gKiBzaXplb2YodWludDE2KTsKKwkJCWJyZWFrOworCQljYXNlIFBJWEFSTE9HREFUQUZNVF8xMkJJVFBJQ0lPOgorCQkJaG9yaXpvbnRhbEFjY3VtdWxhdGUxMih1cCwgbGxlbiwgc3AtPnN0cmlkZSwKKwkJCQkJKGludDE2ICopb3AsIHNwLT5Ub0xpbmVhckYpOworCQkJb3AgKz0gbGxlbiAqIHNpemVvZihpbnQxNik7CisJCQlicmVhazsKKwkJY2FzZSBQSVhBUkxPR0RBVEFGTVRfMTFCSVRMT0c6CisJCQlob3Jpem9udGFsQWNjdW11bGF0ZTExKHVwLCBsbGVuLCBzcC0+c3RyaWRlLAorCQkJCQkodWludDE2ICopb3ApOworCQkJb3AgKz0gbGxlbiAqIHNpemVvZih1aW50MTYpOworCQkJYnJlYWs7CisJCWNhc2UgUElYQVJMT0dEQVRBRk1UXzhCSVQ6CisJCQlob3Jpem9udGFsQWNjdW11bGF0ZTgodXAsIGxsZW4sIHNwLT5zdHJpZGUsCisJCQkJCSh1bnNpZ25lZCBjaGFyICopb3AsIHNwLT5Ub0xpbmVhcjgpOworCQkJb3AgKz0gbGxlbiAqIHNpemVvZih1bnNpZ25lZCBjaGFyKTsKKwkJCWJyZWFrOworCQljYXNlIFBJWEFSTE9HREFUQUZNVF84QklUQUJHUjoKKwkJCWhvcml6b250YWxBY2N1bXVsYXRlOGFiZ3IodXAsIGxsZW4sIHNwLT5zdHJpZGUsCisJCQkJCSh1bnNpZ25lZCBjaGFyICopb3AsIHNwLT5Ub0xpbmVhcjgpOworCQkJb3AgKz0gbGxlbiAqIHNpemVvZih1bnNpZ25lZCBjaGFyKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkgICJVbnN1cHBvcnRlZCBiaXRzL3NhbXBsZTogJWQiLAorCQkJCSAgdGQtPnRkX2JpdHNwZXJzYW1wbGUpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCX0KKworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbnQKK1BpeGFyTG9nU2V0dXBFbmNvZGUoVElGRiogdGlmKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlBpeGFyTG9nU2V0dXBFbmNvZGUiOworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKwlQaXhhckxvZ1N0YXRlKiBzcCA9IEVuY29kZXJTdGF0ZSh0aWYpOworCXRtc2l6ZV90IHRidWZfc2l6ZTsKKworCWFzc2VydChzcCAhPSBOVUxMKTsKKworCS8qIGZvciBzb21lIHJlYXNvbiwgd2UgY2FuJ3QgZG8gdGhpcyBpbiBUSUZGSW5pdFBpeGFyTG9nICovCisKKwlzcC0+c3RyaWRlID0gKHRkLT50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX0NPTlRJRyA/CisJICAgIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwgOiAxKTsKKwl0YnVmX3NpemUgPSBtdWx0aXBseV9tcyhtdWx0aXBseV9tcyhtdWx0aXBseV9tcyhzcC0+c3RyaWRlLCB0ZC0+dGRfaW1hZ2V3aWR0aCksCisJCQkJICAgICAgdGQtPnRkX3Jvd3NwZXJzdHJpcCksIHNpemVvZih1aW50MTYpKTsKKwlpZiAodGJ1Zl9zaXplID09IDApCisJCXJldHVybiAoMCk7ICAvKiBUT0RPOiB0aGlzIGlzIGFuIGVycm9yIHJldHVybiB3aXRob3V0IGVycm9yIHJlcG9ydCB0aHJvdWdoIFRJRkZFcnJvckV4dCAqLworCXNwLT50YnVmID0gKHVpbnQxNiAqKSBfVElGRm1hbGxvYyh0YnVmX3NpemUpOworCWlmIChzcC0+dGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gKDApOworCWlmIChzcC0+dXNlcl9kYXRhZm10ID09IFBJWEFSTE9HREFUQUZNVF9VTktOT1dOKQorCQlzcC0+dXNlcl9kYXRhZm10ID0gUGl4YXJMb2dHdWVzc0RhdGFGbXQodGQpOworCWlmIChzcC0+dXNlcl9kYXRhZm10ID09IFBJWEFSTE9HREFUQUZNVF9VTktOT1dOKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJQaXhhckxvZyBjb21wcmVzc2lvbiBjYW4ndCBoYW5kbGUgJWQgYml0IGxpbmVhciBlbmNvZGluZ3MiLCB0ZC0+dGRfYml0c3BlcnNhbXBsZSk7CisJCXJldHVybiAoMCk7CisJfQorCisJaWYgKGRlZmxhdGVJbml0KCZzcC0+c3RyZWFtLCBzcC0+cXVhbGl0eSkgIT0gWl9PSykgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiJXMiLCBzcC0+c3RyZWFtLm1zZyk7CisJCXJldHVybiAoMCk7CisJfSBlbHNlIHsKKwkJc3AtPnN0YXRlIHw9IFBMU1RBVEVfSU5JVDsKKwkJcmV0dXJuICgxKTsKKwl9Cit9CisKKy8qCisgKiBSZXNldCBlbmNvZGluZyBzdGF0ZSBhdCB0aGUgc3RhcnQgb2YgYSBzdHJpcC4KKyAqLworc3RhdGljIGludAorUGl4YXJMb2dQcmVFbmNvZGUoVElGRiogdGlmLCB1aW50MTYgcykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJQaXhhckxvZ1ByZUVuY29kZSI7CisJUGl4YXJMb2dTdGF0ZSAqc3AgPSBFbmNvZGVyU3RhdGUodGlmKTsKKworCSh2b2lkKSBzOworCWFzc2VydChzcCAhPSBOVUxMKTsKKwlzcC0+c3RyZWFtLm5leHRfb3V0ID0gdGlmLT50aWZfcmF3ZGF0YTsKKwlhc3NlcnQoc2l6ZW9mKHNwLT5zdHJlYW0uYXZhaWxfb3V0KT09NCk7ICAvKiBpZiB0aGlzIGFzc2VydCBnZXRzIHJhaXNlZCwKKwkgICAgd2UgbmVlZCB0byBzaW1wbGlmeSB0aGlzIGNvZGUgdG8gcmVmbGVjdCBhIFpMaWIgdGhhdCBpcyBsaWtlbHkgdXBkYXRlZAorCSAgICB0byBkZWFsIHdpdGggOGJ5dGUgbWVtb3J5IHNpemVzLCB0aG91Z2ggdGhpcyBjb2RlIHdpbGwgcmVzcG9uZAorCSAgICBhcHJvcHJpYXRlbHkgZXZlbiBiZWZvcmUgd2Ugc2ltcGxpZnkgaXQgKi8KKwlzcC0+c3RyZWFtLmF2YWlsX291dCA9IHRpZi0+dGlmX3Jhd2RhdGFzaXplOworCWlmICgodG1zaXplX3Qpc3AtPnN0cmVhbS5hdmFpbF9vdXQgIT0gdGlmLT50aWZfcmF3ZGF0YXNpemUpCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiWkxpYiBjYW5ub3QgZGVhbCB3aXRoIGJ1ZmZlcnMgdGhpcyBzaXplIik7CisJCXJldHVybiAoMCk7CisJfQorCXJldHVybiAoZGVmbGF0ZVJlc2V0KCZzcC0+c3RyZWFtKSA9PSBaX09LKTsKK30KKworc3RhdGljIHZvaWQKK2hvcml6b250YWxEaWZmZXJlbmNlRihmbG9hdCAqaXAsIGludCBuLCBpbnQgc3RyaWRlLCB1aW50MTYgKndwLCB1aW50MTYgKkZyb21MVDIpCit7CisgICAgaW50MzIgcjEsIGcxLCBiMSwgYTEsIHIyLCBnMiwgYjIsIGEyLCBtYXNrOworICAgIGZsb2F0IGZsdHNpemUgPSBGbHRzaXplOworCisjZGVmaW5lICBDTEFNUCh2KSAoICh2PChmbG9hdCkwLikgICA/IDAJCQkJXAorCQkgIDogKHY8KGZsb2F0KTIuKSAgID8gRnJvbUxUMlsoaW50KSh2KmZsdHNpemUpXQlcCisJCSAgOiAodj4oZmxvYXQpMjQuMikgPyAyMDQ3CQkJXAorCQkgIDogTG9nSzEqbG9nKHYqTG9nSzIpICsgMC41ICkKKworICAgIG1hc2sgPSBDT0RFX01BU0s7CisgICAgaWYgKG4gPj0gc3RyaWRlKSB7CisJaWYgKHN0cmlkZSA9PSAzKSB7CisJICAgIHIyID0gd3BbMF0gPSAodWludDE2KSBDTEFNUChpcFswXSk7CisJICAgIGcyID0gd3BbMV0gPSAodWludDE2KSBDTEFNUChpcFsxXSk7CisJICAgIGIyID0gd3BbMl0gPSAodWludDE2KSBDTEFNUChpcFsyXSk7CisJICAgIG4gLT0gMzsKKwkgICAgd2hpbGUgKG4gPiAwKSB7CisJCW4gLT0gMzsKKwkJd3AgKz0gMzsKKwkJaXAgKz0gMzsKKwkJcjEgPSAoaW50MzIpIENMQU1QKGlwWzBdKTsgd3BbMF0gPSAocjEtcjIpICYgbWFzazsgcjIgPSByMTsKKwkJZzEgPSAoaW50MzIpIENMQU1QKGlwWzFdKTsgd3BbMV0gPSAoZzEtZzIpICYgbWFzazsgZzIgPSBnMTsKKwkJYjEgPSAoaW50MzIpIENMQU1QKGlwWzJdKTsgd3BbMl0gPSAoYjEtYjIpICYgbWFzazsgYjIgPSBiMTsKKwkgICAgfQorCX0gZWxzZSBpZiAoc3RyaWRlID09IDQpIHsKKwkgICAgcjIgPSB3cFswXSA9ICh1aW50MTYpIENMQU1QKGlwWzBdKTsKKwkgICAgZzIgPSB3cFsxXSA9ICh1aW50MTYpIENMQU1QKGlwWzFdKTsKKwkgICAgYjIgPSB3cFsyXSA9ICh1aW50MTYpIENMQU1QKGlwWzJdKTsKKwkgICAgYTIgPSB3cFszXSA9ICh1aW50MTYpIENMQU1QKGlwWzNdKTsKKwkgICAgbiAtPSA0OworCSAgICB3aGlsZSAobiA+IDApIHsKKwkJbiAtPSA0OworCQl3cCArPSA0OworCQlpcCArPSA0OworCQlyMSA9IChpbnQzMikgQ0xBTVAoaXBbMF0pOyB3cFswXSA9IChyMS1yMikgJiBtYXNrOyByMiA9IHIxOworCQlnMSA9IChpbnQzMikgQ0xBTVAoaXBbMV0pOyB3cFsxXSA9IChnMS1nMikgJiBtYXNrOyBnMiA9IGcxOworCQliMSA9IChpbnQzMikgQ0xBTVAoaXBbMl0pOyB3cFsyXSA9IChiMS1iMikgJiBtYXNrOyBiMiA9IGIxOworCQlhMSA9IChpbnQzMikgQ0xBTVAoaXBbM10pOyB3cFszXSA9IChhMS1hMikgJiBtYXNrOyBhMiA9IGExOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgaXAgKz0gbiAtIDE7CS8qIHBvaW50IHRvIGxhc3Qgb25lICovCisJICAgIHdwICs9IG4gLSAxOwkvKiBwb2ludCB0byBsYXN0IG9uZSAqLworCSAgICBuIC09IHN0cmlkZTsKKwkgICAgd2hpbGUgKG4gPiAwKSB7CisJCVJFUEVBVChzdHJpZGUsIHdwWzBdID0gKHVpbnQxNikgQ0xBTVAoaXBbMF0pOworCQkJCXdwW3N0cmlkZV0gLT0gd3BbMF07CisJCQkJd3Bbc3RyaWRlXSAmPSBtYXNrOworCQkJCXdwLS07IGlwLS0pCisJCW4gLT0gc3RyaWRlOworCSAgICB9CisJICAgIFJFUEVBVChzdHJpZGUsIHdwWzBdID0gKHVpbnQxNikgQ0xBTVAoaXBbMF0pOyB3cC0tOyBpcC0tKQorCX0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitob3Jpem9udGFsRGlmZmVyZW5jZTE2KHVuc2lnbmVkIHNob3J0ICppcCwgaW50IG4sIGludCBzdHJpZGUsIAorCXVuc2lnbmVkIHNob3J0ICp3cCwgdWludDE2ICpGcm9tMTQpCit7CisgICAgcmVnaXN0ZXIgaW50ICByMSwgZzEsIGIxLCBhMSwgcjIsIGcyLCBiMiwgYTIsIG1hc2s7CisKKy8qIGFzc3VtcHRpb24gaXMgdW5zaWduZWQgcGl4ZWwgdmFsdWVzICovCisjdW5kZWYgICBDTEFNUAorI2RlZmluZSAgQ0xBTVAodikgRnJvbTE0Wyh2KSA+PiAyXQorCisgICAgbWFzayA9IENPREVfTUFTSzsKKyAgICBpZiAobiA+PSBzdHJpZGUpIHsKKwlpZiAoc3RyaWRlID09IDMpIHsKKwkgICAgcjIgPSB3cFswXSA9IENMQU1QKGlwWzBdKTsgIGcyID0gd3BbMV0gPSBDTEFNUChpcFsxXSk7CisJICAgIGIyID0gd3BbMl0gPSBDTEFNUChpcFsyXSk7CisJICAgIG4gLT0gMzsKKwkgICAgd2hpbGUgKG4gPiAwKSB7CisJCW4gLT0gMzsKKwkJd3AgKz0gMzsKKwkJaXAgKz0gMzsKKwkJcjEgPSBDTEFNUChpcFswXSk7IHdwWzBdID0gKHIxLXIyKSAmIG1hc2s7IHIyID0gcjE7CisJCWcxID0gQ0xBTVAoaXBbMV0pOyB3cFsxXSA9IChnMS1nMikgJiBtYXNrOyBnMiA9IGcxOworCQliMSA9IENMQU1QKGlwWzJdKTsgd3BbMl0gPSAoYjEtYjIpICYgbWFzazsgYjIgPSBiMTsKKwkgICAgfQorCX0gZWxzZSBpZiAoc3RyaWRlID09IDQpIHsKKwkgICAgcjIgPSB3cFswXSA9IENMQU1QKGlwWzBdKTsgIGcyID0gd3BbMV0gPSBDTEFNUChpcFsxXSk7CisJICAgIGIyID0gd3BbMl0gPSBDTEFNUChpcFsyXSk7ICBhMiA9IHdwWzNdID0gQ0xBTVAoaXBbM10pOworCSAgICBuIC09IDQ7CisJICAgIHdoaWxlIChuID4gMCkgeworCQluIC09IDQ7CisJCXdwICs9IDQ7CisJCWlwICs9IDQ7CisJCXIxID0gQ0xBTVAoaXBbMF0pOyB3cFswXSA9IChyMS1yMikgJiBtYXNrOyByMiA9IHIxOworCQlnMSA9IENMQU1QKGlwWzFdKTsgd3BbMV0gPSAoZzEtZzIpICYgbWFzazsgZzIgPSBnMTsKKwkJYjEgPSBDTEFNUChpcFsyXSk7IHdwWzJdID0gKGIxLWIyKSAmIG1hc2s7IGIyID0gYjE7CisJCWExID0gQ0xBTVAoaXBbM10pOyB3cFszXSA9IChhMS1hMikgJiBtYXNrOyBhMiA9IGExOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgaXAgKz0gbiAtIDE7CS8qIHBvaW50IHRvIGxhc3Qgb25lICovCisJICAgIHdwICs9IG4gLSAxOwkvKiBwb2ludCB0byBsYXN0IG9uZSAqLworCSAgICBuIC09IHN0cmlkZTsKKwkgICAgd2hpbGUgKG4gPiAwKSB7CisJCVJFUEVBVChzdHJpZGUsIHdwWzBdID0gQ0xBTVAoaXBbMF0pOworCQkJCXdwW3N0cmlkZV0gLT0gd3BbMF07CisJCQkJd3Bbc3RyaWRlXSAmPSBtYXNrOworCQkJCXdwLS07IGlwLS0pCisJCW4gLT0gc3RyaWRlOworCSAgICB9CisJICAgIFJFUEVBVChzdHJpZGUsIHdwWzBdID0gQ0xBTVAoaXBbMF0pOyB3cC0tOyBpcC0tKQorCX0KKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK2hvcml6b250YWxEaWZmZXJlbmNlOCh1bnNpZ25lZCBjaGFyICppcCwgaW50IG4sIGludCBzdHJpZGUsIAorCXVuc2lnbmVkIHNob3J0ICp3cCwgdWludDE2ICpGcm9tOCkKK3sKKyAgICByZWdpc3RlciBpbnQgIHIxLCBnMSwgYjEsIGExLCByMiwgZzIsIGIyLCBhMiwgbWFzazsKKworI3VuZGVmCSBDTEFNUAorI2RlZmluZSAgQ0xBTVAodikgKEZyb204Wyh2KV0pCisKKyAgICBtYXNrID0gQ09ERV9NQVNLOworICAgIGlmIChuID49IHN0cmlkZSkgeworCWlmIChzdHJpZGUgPT0gMykgeworCSAgICByMiA9IHdwWzBdID0gQ0xBTVAoaXBbMF0pOyAgZzIgPSB3cFsxXSA9IENMQU1QKGlwWzFdKTsKKwkgICAgYjIgPSB3cFsyXSA9IENMQU1QKGlwWzJdKTsKKwkgICAgbiAtPSAzOworCSAgICB3aGlsZSAobiA+IDApIHsKKwkJbiAtPSAzOworCQlyMSA9IENMQU1QKGlwWzNdKTsgd3BbM10gPSAocjEtcjIpICYgbWFzazsgcjIgPSByMTsKKwkJZzEgPSBDTEFNUChpcFs0XSk7IHdwWzRdID0gKGcxLWcyKSAmIG1hc2s7IGcyID0gZzE7CisJCWIxID0gQ0xBTVAoaXBbNV0pOyB3cFs1XSA9IChiMS1iMikgJiBtYXNrOyBiMiA9IGIxOworCQl3cCArPSAzOworCQlpcCArPSAzOworCSAgICB9CisJfSBlbHNlIGlmIChzdHJpZGUgPT0gNCkgeworCSAgICByMiA9IHdwWzBdID0gQ0xBTVAoaXBbMF0pOyAgZzIgPSB3cFsxXSA9IENMQU1QKGlwWzFdKTsKKwkgICAgYjIgPSB3cFsyXSA9IENMQU1QKGlwWzJdKTsgIGEyID0gd3BbM10gPSBDTEFNUChpcFszXSk7CisJICAgIG4gLT0gNDsKKwkgICAgd2hpbGUgKG4gPiAwKSB7CisJCW4gLT0gNDsKKwkJcjEgPSBDTEFNUChpcFs0XSk7IHdwWzRdID0gKHIxLXIyKSAmIG1hc2s7IHIyID0gcjE7CisJCWcxID0gQ0xBTVAoaXBbNV0pOyB3cFs1XSA9IChnMS1nMikgJiBtYXNrOyBnMiA9IGcxOworCQliMSA9IENMQU1QKGlwWzZdKTsgd3BbNl0gPSAoYjEtYjIpICYgbWFzazsgYjIgPSBiMTsKKwkJYTEgPSBDTEFNUChpcFs3XSk7IHdwWzddID0gKGExLWEyKSAmIG1hc2s7IGEyID0gYTE7CisJCXdwICs9IDQ7CisJCWlwICs9IDQ7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICB3cCArPSBuICsgc3RyaWRlIC0gMTsJLyogcG9pbnQgdG8gbGFzdCBvbmUgKi8KKwkgICAgaXAgKz0gbiArIHN0cmlkZSAtIDE7CS8qIHBvaW50IHRvIGxhc3Qgb25lICovCisJICAgIG4gLT0gc3RyaWRlOworCSAgICB3aGlsZSAobiA+IDApIHsKKwkJUkVQRUFUKHN0cmlkZSwgd3BbMF0gPSBDTEFNUChpcFswXSk7CisJCQkJd3Bbc3RyaWRlXSAtPSB3cFswXTsKKwkJCQl3cFtzdHJpZGVdICY9IG1hc2s7CisJCQkJd3AtLTsgaXAtLSkKKwkJbiAtPSBzdHJpZGU7CisJICAgIH0KKwkgICAgUkVQRUFUKHN0cmlkZSwgd3BbMF0gPSBDTEFNUChpcFswXSk7IHdwLS07IGlwLS0pCisJfQorICAgIH0KK30KKworLyoKKyAqIEVuY29kZSBhIGNodW5rIG9mIHBpeGVscy4KKyAqLworc3RhdGljIGludAorUGl4YXJMb2dFbmNvZGUoVElGRiogdGlmLCB1aW50OCogYnAsIHRtc2l6ZV90IGNjLCB1aW50MTYgcykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJQaXhhckxvZ0VuY29kZSI7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCVBpeGFyTG9nU3RhdGUgKnNwID0gRW5jb2RlclN0YXRlKHRpZik7CisJdG1zaXplX3QgaTsKKwl0bXNpemVfdCBuOworCWludCBsbGVuOworCXVuc2lnbmVkIHNob3J0ICogdXA7CisKKwkodm9pZCkgczsKKworCXN3aXRjaCAoc3AtPnVzZXJfZGF0YWZtdCkgeworCWNhc2UgUElYQVJMT0dEQVRBRk1UX0ZMT0FUOgorCQluID0gY2MgLyBzaXplb2YoZmxvYXQpOwkJLyogWFhYIGZsb2F0ID09IDMyIGJpdHMgKi8KKwkJYnJlYWs7CisJY2FzZSBQSVhBUkxPR0RBVEFGTVRfMTZCSVQ6CisJY2FzZSBQSVhBUkxPR0RBVEFGTVRfMTJCSVRQSUNJTzoKKwljYXNlIFBJWEFSTE9HREFUQUZNVF8xMUJJVExPRzoKKwkJbiA9IGNjIC8gc2l6ZW9mKHVpbnQxNik7CS8qIFhYWCB1aW50MTYgPT0gMTYgYml0cyAqLworCQlicmVhazsKKwljYXNlIFBJWEFSTE9HREFUQUZNVF84QklUOgorCWNhc2UgUElYQVJMT0dEQVRBRk1UXzhCSVRBQkdSOgorCQluID0gY2M7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkiJWQgYml0IGlucHV0IG5vdCBzdXBwb3J0ZWQgaW4gUGl4YXJMb2ciLAorCQkJdGQtPnRkX2JpdHNwZXJzYW1wbGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsbGVuID0gc3AtPnN0cmlkZSAqIHRkLT50ZF9pbWFnZXdpZHRoOworCisJZm9yIChpID0gMCwgdXAgPSBzcC0+dGJ1ZjsgaSA8IG47IGkgKz0gbGxlbiwgdXAgKz0gbGxlbikgeworCQlzd2l0Y2ggKHNwLT51c2VyX2RhdGFmbXQpICB7CisJCWNhc2UgUElYQVJMT0dEQVRBRk1UX0ZMT0FUOgorCQkJaG9yaXpvbnRhbERpZmZlcmVuY2VGKChmbG9hdCAqKWJwLCBsbGVuLCAKKwkJCQlzcC0+c3RyaWRlLCB1cCwgc3AtPkZyb21MVDIpOworCQkJYnAgKz0gbGxlbiAqIHNpemVvZihmbG9hdCk7CisJCQlicmVhazsKKwkJY2FzZSBQSVhBUkxPR0RBVEFGTVRfMTZCSVQ6CisJCQlob3Jpem9udGFsRGlmZmVyZW5jZTE2KCh1aW50MTYgKilicCwgbGxlbiwgCisJCQkJc3AtPnN0cmlkZSwgdXAsIHNwLT5Gcm9tMTQpOworCQkJYnAgKz0gbGxlbiAqIHNpemVvZih1aW50MTYpOworCQkJYnJlYWs7CisJCWNhc2UgUElYQVJMT0dEQVRBRk1UXzhCSVQ6CisJCQlob3Jpem9udGFsRGlmZmVyZW5jZTgoKHVuc2lnbmVkIGNoYXIgKilicCwgbGxlbiwgCisJCQkJc3AtPnN0cmlkZSwgdXAsIHNwLT5Gcm9tOCk7CisJCQlicCArPSBsbGVuICogc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCSIlZCBiaXQgaW5wdXQgbm90IHN1cHBvcnRlZCBpbiBQaXhhckxvZyIsCisJCQkJdGQtPnRkX2JpdHNwZXJzYW1wbGUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisgCisJc3AtPnN0cmVhbS5uZXh0X2luID0gKHVuc2lnbmVkIGNoYXIgKikgc3AtPnRidWY7CisJYXNzZXJ0KHNpemVvZihzcC0+c3RyZWFtLmF2YWlsX2luKT09NCk7ICAvKiBpZiB0aGlzIGFzc2VydCBnZXRzIHJhaXNlZCwKKwkgICAgd2UgbmVlZCB0byBzaW1wbGlmeSB0aGlzIGNvZGUgdG8gcmVmbGVjdCBhIFpMaWIgdGhhdCBpcyBsaWtlbHkgdXBkYXRlZAorCSAgICB0byBkZWFsIHdpdGggOGJ5dGUgbWVtb3J5IHNpemVzLCB0aG91Z2ggdGhpcyBjb2RlIHdpbGwgcmVzcG9uZAorCSAgICBhcHJvcHJpYXRlbHkgZXZlbiBiZWZvcmUgd2Ugc2ltcGxpZnkgaXQgKi8KKwlzcC0+c3RyZWFtLmF2YWlsX2luID0gKHVJbnQpIChuICogc2l6ZW9mKHVpbnQxNikpOworCWlmICgoc3AtPnN0cmVhbS5hdmFpbF9pbiAvIHNpemVvZih1aW50MTYpKSAhPSAodUludCkgbikKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgICJaTGliIGNhbm5vdCBkZWFsIHdpdGggYnVmZmVycyB0aGlzIHNpemUiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwlkbyB7CisJCWlmIChkZWZsYXRlKCZzcC0+c3RyZWFtLCBaX05PX0ZMVVNIKSAhPSBaX09LKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiRW5jb2RlciBlcnJvcjogJXMiLAorCQkJICAgIHNwLT5zdHJlYW0ubXNnKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJaWYgKHNwLT5zdHJlYW0uYXZhaWxfb3V0ID09IDApIHsKKwkJCXRpZi0+dGlmX3Jhd2NjID0gdGlmLT50aWZfcmF3ZGF0YXNpemU7CisJCQlUSUZGRmx1c2hEYXRhMSh0aWYpOworCQkJc3AtPnN0cmVhbS5uZXh0X291dCA9IHRpZi0+dGlmX3Jhd2RhdGE7CisJCQlzcC0+c3RyZWFtLmF2YWlsX291dCA9ICh1SW50KSB0aWYtPnRpZl9yYXdkYXRhc2l6ZTsgIC8qIHRoaXMgaXMgYSBzYWZlIHR5cGVjYXN0LCBhcyBjaGVjayBpcyBtYWRlIGFscmVhZHkgaW4gUGl4YXJMb2dQcmVFbmNvZGUgKi8KKwkJfQorCX0gd2hpbGUgKHNwLT5zdHJlYW0uYXZhaWxfaW4gPiAwKTsKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogRmluaXNoIG9mZiBhbiBlbmNvZGVkIHN0cmlwIGJ5IGZsdXNoaW5nIHRoZSBsYXN0CisgKiBzdHJpbmcgYW5kIHRhY2tpbmcgb24gYW4gRW5kIE9mIEluZm9ybWF0aW9uIGNvZGUuCisgKi8KKworc3RhdGljIGludAorUGl4YXJMb2dQb3N0RW5jb2RlKFRJRkYqIHRpZikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJQaXhhckxvZ1Bvc3RFbmNvZGUiOworCVBpeGFyTG9nU3RhdGUgKnNwID0gRW5jb2RlclN0YXRlKHRpZik7CisJaW50IHN0YXRlOworCisJc3AtPnN0cmVhbS5hdmFpbF9pbiA9IDA7CisKKwlkbyB7CisJCXN0YXRlID0gZGVmbGF0ZSgmc3AtPnN0cmVhbSwgWl9GSU5JU0gpOworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgWl9TVFJFQU1fRU5EOgorCQljYXNlIFpfT0s6CisJCSAgICBpZiAoKHRtc2l6ZV90KXNwLT5zdHJlYW0uYXZhaWxfb3V0ICE9IHRpZi0+dGlmX3Jhd2RhdGFzaXplKSB7CisJCQkgICAgdGlmLT50aWZfcmF3Y2MgPQorCQkJCXRpZi0+dGlmX3Jhd2RhdGFzaXplIC0gc3AtPnN0cmVhbS5hdmFpbF9vdXQ7CisJCQkgICAgVElGRkZsdXNoRGF0YTEodGlmKTsKKwkJCSAgICBzcC0+c3RyZWFtLm5leHRfb3V0ID0gdGlmLT50aWZfcmF3ZGF0YTsKKwkJCSAgICBzcC0+c3RyZWFtLmF2YWlsX291dCA9ICh1SW50KSB0aWYtPnRpZl9yYXdkYXRhc2l6ZTsgIC8qIHRoaXMgaXMgYSBzYWZlIHR5cGVjYXN0LCBhcyBjaGVjayBpcyBtYWRlIGFscmVhZHkgaW4gUGl4YXJMb2dQcmVFbmNvZGUgKi8KKwkJICAgIH0KKwkJICAgIGJyZWFrOworCQlkZWZhdWx0OgorCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIlpMaWIgZXJyb3I6ICVzIiwKKwkJCXNwLT5zdHJlYW0ubXNnKTsKKwkJICAgIHJldHVybiAoMCk7CisJCX0KKwl9IHdoaWxlIChzdGF0ZSAhPSBaX1NUUkVBTV9FTkQpOworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyB2b2lkCitQaXhhckxvZ0Nsb3NlKFRJRkYqIHRpZikKK3sKKwlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisKKwkvKiBJbiBhIHJlYWxseSBzbmVha3kgKGFuZCByZWFsbHkgaW5jb3JyZWN0LCBhbmQgdW50cnV0aGZ1bGwsIGFuZAorCSAqIHRyb3VibGVzb21lLCBhbmQgZXJyb3ItcHJvbmUpIG1hbmV1dmVyIHRoYXQgY29tcGxldGVseSBnb2VzIGFnYWluc3QKKwkgKiB0aGUgc3Bpcml0IG9mIFRJRkYsIGFuZCBicmVha3MgVElGRiwgb24gY2xvc2UsIHdlIGNvdmVydGx5CisJICogbW9kaWZ5IGJvdGggYml0c3BlcnNhbXBsZSBhbmQgc2FtcGxlZm9ybWF0IGluIHRoZSBkaXJlY3RvcnkgdG8KKwkgKiBpbmRpY2F0ZSA4LWJpdCBsaW5lYXIuICBUaGlzIHdheSwgdGhlIGRlY29kZSAianVzdCB3b3JrcyIgZXZlbiBmb3IKKwkgKiByZWFkZXJzIHRoYXQgZG9uJ3Qga25vdyBhYm91dCBQaXhhckxvZywgb3IgaG93IHRvIHNldAorCSAqIHRoZSBQSVhBUkxPR0RBVEZNVCBwc2V1ZG8tdGFnLgorCSAqLworCXRkLT50ZF9iaXRzcGVyc2FtcGxlID0gODsKKwl0ZC0+dGRfc2FtcGxlZm9ybWF0ID0gU0FNUExFRk9STUFUX1VJTlQ7Cit9CisKK3N0YXRpYyB2b2lkCitQaXhhckxvZ0NsZWFudXAoVElGRiogdGlmKQoreworCVBpeGFyTG9nU3RhdGUqIHNwID0gKFBpeGFyTG9nU3RhdGUqKSB0aWYtPnRpZl9kYXRhOworCisJYXNzZXJ0KHNwICE9IDApOworCisJKHZvaWQpVElGRlByZWRpY3RvckNsZWFudXAodGlmKTsKKworCXRpZi0+dGlmX3RhZ21ldGhvZHMudmdldGZpZWxkID0gc3AtPnZnZXRwYXJlbnQ7CisJdGlmLT50aWZfdGFnbWV0aG9kcy52c2V0ZmllbGQgPSBzcC0+dnNldHBhcmVudDsKKworCWlmIChzcC0+RnJvbUxUMikgX1RJRkZmcmVlKHNwLT5Gcm9tTFQyKTsKKwlpZiAoc3AtPkZyb20xNCkgX1RJRkZmcmVlKHNwLT5Gcm9tMTQpOworCWlmIChzcC0+RnJvbTgpIF9USUZGZnJlZShzcC0+RnJvbTgpOworCWlmIChzcC0+VG9MaW5lYXJGKSBfVElGRmZyZWUoc3AtPlRvTGluZWFyRik7CisJaWYgKHNwLT5Ub0xpbmVhcjE2KSBfVElGRmZyZWUoc3AtPlRvTGluZWFyMTYpOworCWlmIChzcC0+VG9MaW5lYXI4KSBfVElGRmZyZWUoc3AtPlRvTGluZWFyOCk7CisJaWYgKHNwLT5zdGF0ZSZQTFNUQVRFX0lOSVQpIHsKKwkJaWYgKHRpZi0+dGlmX21vZGUgPT0gT19SRE9OTFkpCisJCQlpbmZsYXRlRW5kKCZzcC0+c3RyZWFtKTsKKwkJZWxzZQorCQkJZGVmbGF0ZUVuZCgmc3AtPnN0cmVhbSk7CisJfQorCWlmIChzcC0+dGJ1ZikKKwkJX1RJRkZmcmVlKHNwLT50YnVmKTsKKwlfVElGRmZyZWUoc3ApOworCXRpZi0+dGlmX2RhdGEgPSBOVUxMOworCisJX1RJRkZTZXREZWZhdWx0Q29tcHJlc3Npb25TdGF0ZSh0aWYpOworfQorCitzdGF0aWMgaW50CitQaXhhckxvZ1ZTZXRGaWVsZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcsIHZhX2xpc3QgYXApCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiUGl4YXJMb2dWU2V0RmllbGQiOworICAgIFBpeGFyTG9nU3RhdGUgKnNwID0gKFBpeGFyTG9nU3RhdGUgKil0aWYtPnRpZl9kYXRhOworICAgIGludCByZXN1bHQ7CisKKyAgICBzd2l0Y2ggKHRhZykgeworICAgICBjYXNlIFRJRkZUQUdfUElYQVJMT0dRVUFMSVRZOgorCQlzcC0+cXVhbGl0eSA9IChpbnQpIHZhX2FyZyhhcCwgaW50KTsKKwkJaWYgKHRpZi0+dGlmX21vZGUgIT0gT19SRE9OTFkgJiYgKHNwLT5zdGF0ZSZQTFNUQVRFX0lOSVQpKSB7CisJCQlpZiAoZGVmbGF0ZVBhcmFtcygmc3AtPnN0cmVhbSwKKwkJCSAgICBzcC0+cXVhbGl0eSwgWl9ERUZBVUxUX1NUUkFURUdZKSAhPSBaX09LKSB7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIlpMaWIgZXJyb3I6ICVzIiwKKwkJCQkJc3AtPnN0cmVhbS5tc2cpOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCX0KKwkJcmV0dXJuICgxKTsKKyAgICAgY2FzZSBUSUZGVEFHX1BJWEFSTE9HREFUQUZNVDoKKwlzcC0+dXNlcl9kYXRhZm10ID0gKGludCkgdmFfYXJnKGFwLCBpbnQpOworCS8qIFR3ZWFrIHRoZSBUSUZGIGhlYWRlciBzbyB0aGF0IHRoZSByZXN0IG9mIGxpYnRpZmYga25vd3Mgd2hhdAorCSAqIHNpemUgb2YgZGF0YSB3aWxsIGJlIHBhc3NlZCBiZXR3ZWVuIGFwcCBhbmQgbGlicmFyeSwgYW5kCisJICogYXNzdW1lIHRoYXQgdGhlIGFwcCBrbm93cyB3aGF0IGl0IGlzIGRvaW5nIGFuZCBpcyBub3QKKwkgKiBjb25mdXNlZCBieSB0aGVzZSBoZWFkZXIgbWFuaXB1bGF0aW9ucy4uLgorCSAqLworCXN3aXRjaCAoc3AtPnVzZXJfZGF0YWZtdCkgeworCSBjYXNlIFBJWEFSTE9HREFUQUZNVF84QklUOgorCSBjYXNlIFBJWEFSTE9HREFUQUZNVF84QklUQUJHUjoKKwkgICAgVElGRlNldEZpZWxkKHRpZiwgVElGRlRBR19CSVRTUEVSU0FNUExFLCA4KTsKKwkgICAgVElGRlNldEZpZWxkKHRpZiwgVElGRlRBR19TQU1QTEVGT1JNQVQsIFNBTVBMRUZPUk1BVF9VSU5UKTsKKwkgICAgYnJlYWs7CisJIGNhc2UgUElYQVJMT0dEQVRBRk1UXzExQklUTE9HOgorCSAgICBUSUZGU2V0RmllbGQodGlmLCBUSUZGVEFHX0JJVFNQRVJTQU1QTEUsIDE2KTsKKwkgICAgVElGRlNldEZpZWxkKHRpZiwgVElGRlRBR19TQU1QTEVGT1JNQVQsIFNBTVBMRUZPUk1BVF9VSU5UKTsKKwkgICAgYnJlYWs7CisJIGNhc2UgUElYQVJMT0dEQVRBRk1UXzEyQklUUElDSU86CisJICAgIFRJRkZTZXRGaWVsZCh0aWYsIFRJRkZUQUdfQklUU1BFUlNBTVBMRSwgMTYpOworCSAgICBUSUZGU2V0RmllbGQodGlmLCBUSUZGVEFHX1NBTVBMRUZPUk1BVCwgU0FNUExFRk9STUFUX0lOVCk7CisJICAgIGJyZWFrOworCSBjYXNlIFBJWEFSTE9HREFUQUZNVF8xNkJJVDoKKwkgICAgVElGRlNldEZpZWxkKHRpZiwgVElGRlRBR19CSVRTUEVSU0FNUExFLCAxNik7CisJICAgIFRJRkZTZXRGaWVsZCh0aWYsIFRJRkZUQUdfU0FNUExFRk9STUFULCBTQU1QTEVGT1JNQVRfVUlOVCk7CisJICAgIGJyZWFrOworCSBjYXNlIFBJWEFSTE9HREFUQUZNVF9GTE9BVDoKKwkgICAgVElGRlNldEZpZWxkKHRpZiwgVElGRlRBR19CSVRTUEVSU0FNUExFLCAzMik7CisJICAgIFRJRkZTZXRGaWVsZCh0aWYsIFRJRkZUQUdfU0FNUExFRk9STUFULCBTQU1QTEVGT1JNQVRfSUVFRUZQKTsKKwkgICAgYnJlYWs7CisJfQorCS8qCisJICogTXVzdCByZWNhbGN1bGF0ZSBzaXplcyBzaG91bGQgYml0cy9zYW1wbGUgY2hhbmdlLgorCSAqLworCXRpZi0+dGlmX3RpbGVzaXplID0gaXNUaWxlZCh0aWYpID8gVElGRlRpbGVTaXplKHRpZikgOiAodG1zaXplX3QpKC0xKTsKKwl0aWYtPnRpZl9zY2FubGluZXNpemUgPSBUSUZGU2NhbmxpbmVTaXplKHRpZik7CisJcmVzdWx0ID0gMTsJCS8qIE5COiBwc2V1ZG8gdGFnICovCisJYnJlYWs7CisgICAgIGRlZmF1bHQ6CisJcmVzdWx0ID0gKCpzcC0+dnNldHBhcmVudCkodGlmLCB0YWcsIGFwKTsKKyAgICB9CisgICAgcmV0dXJuIChyZXN1bHQpOworfQorCitzdGF0aWMgaW50CitQaXhhckxvZ1ZHZXRGaWVsZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcsIHZhX2xpc3QgYXApCit7CisgICAgUGl4YXJMb2dTdGF0ZSAqc3AgPSAoUGl4YXJMb2dTdGF0ZSAqKXRpZi0+dGlmX2RhdGE7CisKKyAgICBzd2l0Y2ggKHRhZykgeworICAgICBjYXNlIFRJRkZUQUdfUElYQVJMT0dRVUFMSVRZOgorCSp2YV9hcmcoYXAsIGludCopID0gc3AtPnF1YWxpdHk7CisJYnJlYWs7CisgICAgIGNhc2UgVElGRlRBR19QSVhBUkxPR0RBVEFGTVQ6CisJKnZhX2FyZyhhcCwgaW50KikgPSBzcC0+dXNlcl9kYXRhZm10OworCWJyZWFrOworICAgICBkZWZhdWx0OgorCXJldHVybiAoKnNwLT52Z2V0cGFyZW50KSh0aWYsIHRhZywgYXApOworICAgIH0KKyAgICByZXR1cm4gKDEpOworfQorCitzdGF0aWMgY29uc3QgVElGRkZpZWxkIHBpeGFybG9nRmllbGRzW10gPSB7CisgICAge1RJRkZUQUdfUElYQVJMT0dEQVRBRk1ULCAwLCAwLCBUSUZGX0FOWSwgMCwgVElGRl9TRVRHRVRfSU5ULCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1BTRVVETywgRkFMU0UsIEZBTFNFLCAiIiwgTlVMTH0sCisgICAge1RJRkZUQUdfUElYQVJMT0dRVUFMSVRZLCAwLCAwLCBUSUZGX0FOWSwgMCwgVElGRl9TRVRHRVRfSU5ULCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1BTRVVETywgRkFMU0UsIEZBTFNFLCAiIiwgTlVMTH0KK307CisKK2ludAorVElGRkluaXRQaXhhckxvZyhUSUZGKiB0aWYsIGludCBzY2hlbWUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRkluaXRQaXhhckxvZyI7CisKKwlQaXhhckxvZ1N0YXRlKiBzcDsKKworCWFzc2VydChzY2hlbWUgPT0gQ09NUFJFU1NJT05fUElYQVJMT0cpOworCisJLyoKKwkgKiBNZXJnZSBjb2RlYy1zcGVjaWZpYyB0YWcgaW5mb3JtYXRpb24uCisJICovCisJaWYgKCFfVElGRk1lcmdlRmllbGRzKHRpZiwgcGl4YXJsb2dGaWVsZHMsCisJCQkgICAgICBUSUZGQXJyYXlDb3VudChwaXhhcmxvZ0ZpZWxkcykpKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgICJNZXJnaW5nIFBpeGFyTG9nIGNvZGVjLXNwZWNpZmljIHRhZ3MgZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogQWxsb2NhdGUgc3RhdGUgYmxvY2sgc28gdGFnIG1ldGhvZHMgaGF2ZSBzdG9yYWdlIHRvIHJlY29yZCB2YWx1ZXMuCisJICovCisJdGlmLT50aWZfZGF0YSA9ICh1aW50OCopIF9USUZGbWFsbG9jKHNpemVvZiAoUGl4YXJMb2dTdGF0ZSkpOworCWlmICh0aWYtPnRpZl9kYXRhID09IE5VTEwpCisJCWdvdG8gYmFkOworCXNwID0gKFBpeGFyTG9nU3RhdGUqKSB0aWYtPnRpZl9kYXRhOworCV9USUZGbWVtc2V0KHNwLCAwLCBzaXplb2YgKCpzcCkpOworCXNwLT5zdHJlYW0uZGF0YV90eXBlID0gWl9CSU5BUlk7CisJc3AtPnVzZXJfZGF0YWZtdCA9IFBJWEFSTE9HREFUQUZNVF9VTktOT1dOOworCisJLyoKKwkgKiBJbnN0YWxsIGNvZGVjIG1ldGhvZHMuCisJICovCisJdGlmLT50aWZfZml4dXB0YWdzID0gUGl4YXJMb2dGaXh1cFRhZ3M7IAorCXRpZi0+dGlmX3NldHVwZGVjb2RlID0gUGl4YXJMb2dTZXR1cERlY29kZTsKKwl0aWYtPnRpZl9wcmVkZWNvZGUgPSBQaXhhckxvZ1ByZURlY29kZTsKKwl0aWYtPnRpZl9kZWNvZGVyb3cgPSBQaXhhckxvZ0RlY29kZTsKKwl0aWYtPnRpZl9kZWNvZGVzdHJpcCA9IFBpeGFyTG9nRGVjb2RlOyAgCisJdGlmLT50aWZfZGVjb2RldGlsZSA9IFBpeGFyTG9nRGVjb2RlOworCXRpZi0+dGlmX3NldHVwZW5jb2RlID0gUGl4YXJMb2dTZXR1cEVuY29kZTsKKwl0aWYtPnRpZl9wcmVlbmNvZGUgPSBQaXhhckxvZ1ByZUVuY29kZTsKKwl0aWYtPnRpZl9wb3N0ZW5jb2RlID0gUGl4YXJMb2dQb3N0RW5jb2RlOworCXRpZi0+dGlmX2VuY29kZXJvdyA9IFBpeGFyTG9nRW5jb2RlOyAgCisJdGlmLT50aWZfZW5jb2Rlc3RyaXAgPSBQaXhhckxvZ0VuY29kZTsKKwl0aWYtPnRpZl9lbmNvZGV0aWxlID0gUGl4YXJMb2dFbmNvZGU7ICAKKwl0aWYtPnRpZl9jbG9zZSA9IFBpeGFyTG9nQ2xvc2U7CisJdGlmLT50aWZfY2xlYW51cCA9IFBpeGFyTG9nQ2xlYW51cDsKKworCS8qIE92ZXJyaWRlIFNldEZpZWxkIHNvIHdlIGNhbiBoYW5kbGUgb3VyIHByaXZhdGUgcHNldWRvLXRhZyAqLworCXNwLT52Z2V0cGFyZW50ID0gdGlmLT50aWZfdGFnbWV0aG9kcy52Z2V0ZmllbGQ7CisJdGlmLT50aWZfdGFnbWV0aG9kcy52Z2V0ZmllbGQgPSBQaXhhckxvZ1ZHZXRGaWVsZDsgICAvKiBob29rIGZvciBjb2RlYyB0YWdzICovCisJc3AtPnZzZXRwYXJlbnQgPSB0aWYtPnRpZl90YWdtZXRob2RzLnZzZXRmaWVsZDsKKwl0aWYtPnRpZl90YWdtZXRob2RzLnZzZXRmaWVsZCA9IFBpeGFyTG9nVlNldEZpZWxkOyAgIC8qIGhvb2sgZm9yIGNvZGVjIHRhZ3MgKi8KKworCS8qIERlZmF1bHQgdmFsdWVzIGZvciBjb2RlYy1zcGVjaWZpYyBmaWVsZHMgKi8KKwlzcC0+cXVhbGl0eSA9IFpfREVGQVVMVF9DT01QUkVTU0lPTjsgLyogZGVmYXVsdCBjb21wLiBsZXZlbCAqLworCXNwLT5zdGF0ZSA9IDA7CisKKwkvKiB3ZSBkb24ndCB3aXNoIHRvIHVzZSB0aGUgcHJlZGljdG9yLCAKKwkgKiB0aGUgZGVmYXVsdCBpcyBub25lLCB3aGljaCBwcmVkaWN0b3IgdmFsdWUgMQorCSAqLworCSh2b2lkKSBUSUZGUHJlZGljdG9ySW5pdCh0aWYpOworCisJLyoKKwkgKiBidWlsZCB0aGUgY29tcGFuZGluZyB0YWJsZXMgCisJICovCisJUGl4YXJMb2dNYWtlVGFibGVzKHNwKTsKKworCXJldHVybiAoMSk7CitiYWQ6CisJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJICAgICAiTm8gc3BhY2UgZm9yIFBpeGFyTG9nIHN0YXRlIGJsb2NrIik7CisJcmV0dXJuICgwKTsKK30KKyNlbmRpZiAvKiBQSVhBUkxPR19TVVBQT1JUICovCisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTggc3c9OCBub2V0OiAqLworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcHJlZGljdC5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcHJlZGljdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzODhkZGUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9wcmVkaWN0LmMKQEAgLTAsMCArMSw3OTQgQEAKKy8qICRJZDogdGlmX3ByZWRpY3QuYyx2IDEuMzUgMjAxNS0wOC0zMSAxNTowNTo1NyBlcm91YXVsdCBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCAKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgorICogU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcy4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSAKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTQU0gTEVGRkxFUiBPUiBTSUxJQ09OIEdSQVBISUNTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgKiBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgKiBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GIAorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSAKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRJRkYgTGlicmFyeS4KKyAqCisgKiBQcmVkaWN0b3IgVGFnIFN1cHBvcnQgKHVzZWQgYnkgbXVsdGlwbGUgY29kZWNzKS4KKyAqLworI2luY2x1ZGUgInRpZmZpb3AuaCIKKyNpbmNsdWRlICJ0aWZfcHJlZGljdC5oIgorCisjZGVmaW5lCVByZWRpY3RvclN0YXRlKHRpZikJKChUSUZGUHJlZGljdG9yU3RhdGUqKSAodGlmKS0+dGlmX2RhdGEpCisKK3N0YXRpYyB2b2lkIGhvckFjYzgoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYyk7CitzdGF0aWMgdm9pZCBob3JBY2MxNihUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKTsKK3N0YXRpYyB2b2lkIGhvckFjYzMyKFRJRkYqIHRpZiwgdWludDgqIGNwMCwgdG1zaXplX3QgY2MpOworc3RhdGljIHZvaWQgc3dhYkhvckFjYzE2KFRJRkYqIHRpZiwgdWludDgqIGNwMCwgdG1zaXplX3QgY2MpOworc3RhdGljIHZvaWQgc3dhYkhvckFjYzMyKFRJRkYqIHRpZiwgdWludDgqIGNwMCwgdG1zaXplX3QgY2MpOworc3RhdGljIHZvaWQgaG9yRGlmZjgoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYyk7CitzdGF0aWMgdm9pZCBob3JEaWZmMTYoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYyk7CitzdGF0aWMgdm9pZCBob3JEaWZmMzIoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYyk7CitzdGF0aWMgdm9pZCBzd2FiSG9yRGlmZjE2KFRJRkYqIHRpZiwgdWludDgqIGNwMCwgdG1zaXplX3QgY2MpOworc3RhdGljIHZvaWQgc3dhYkhvckRpZmYzMihUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKTsKK3N0YXRpYyB2b2lkIGZwQWNjKFRJRkYqIHRpZiwgdWludDgqIGNwMCwgdG1zaXplX3QgY2MpOworc3RhdGljIHZvaWQgZnBEaWZmKFRJRkYqIHRpZiwgdWludDgqIGNwMCwgdG1zaXplX3QgY2MpOworc3RhdGljIGludCBQcmVkaWN0b3JEZWNvZGVSb3coVElGRiogdGlmLCB1aW50OCogb3AwLCB0bXNpemVfdCBvY2MwLCB1aW50MTYgcyk7CitzdGF0aWMgaW50IFByZWRpY3RvckRlY29kZVRpbGUoVElGRiogdGlmLCB1aW50OCogb3AwLCB0bXNpemVfdCBvY2MwLCB1aW50MTYgcyk7CitzdGF0aWMgaW50IFByZWRpY3RvckVuY29kZVJvdyhUSUZGKiB0aWYsIHVpbnQ4KiBicCwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKTsKK3N0YXRpYyBpbnQgUHJlZGljdG9yRW5jb2RlVGlsZShUSUZGKiB0aWYsIHVpbnQ4KiBicDAsIHRtc2l6ZV90IGNjMCwgdWludDE2IHMpOworCitzdGF0aWMgaW50CitQcmVkaWN0b3JTZXR1cChUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiUHJlZGljdG9yU2V0dXAiOworCisJVElGRlByZWRpY3RvclN0YXRlKiBzcCA9IFByZWRpY3RvclN0YXRlKHRpZik7CisJVElGRkRpcmVjdG9yeSogdGQgPSAmdGlmLT50aWZfZGlyOworCisJc3dpdGNoIChzcC0+cHJlZGljdG9yKQkJLyogbm8gZGlmZmVyZW5jaW5nICovCisJeworCQljYXNlIFBSRURJQ1RPUl9OT05FOgorCQkJcmV0dXJuIDE7CisJCWNhc2UgUFJFRElDVE9SX0hPUklaT05UQUw6CisJCQlpZiAodGQtPnRkX2JpdHNwZXJzYW1wbGUgIT0gOAorCQkJICAgICYmIHRkLT50ZF9iaXRzcGVyc2FtcGxlICE9IDE2CisJCQkgICAgJiYgdGQtPnRkX2JpdHNwZXJzYW1wbGUgIT0gMzIpIHsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCSAgICAiSG9yaXpvbnRhbCBkaWZmZXJlbmNpbmcgXCJQcmVkaWN0b3JcIiBub3Qgc3VwcG9ydGVkIHdpdGggJWQtYml0IHNhbXBsZXMiLAorCQkJCSAgICB0ZC0+dGRfYml0c3BlcnNhbXBsZSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBQUkVESUNUT1JfRkxPQVRJTkdQT0lOVDoKKwkJCWlmICh0ZC0+dGRfc2FtcGxlZm9ybWF0ICE9IFNBTVBMRUZPUk1BVF9JRUVFRlApIHsKKwkJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCSAgICAiRmxvYXRpbmcgcG9pbnQgXCJQcmVkaWN0b3JcIiBub3Qgc3VwcG9ydGVkIHdpdGggJWQgZGF0YSBmb3JtYXQiLAorCQkJCSAgICB0ZC0+dGRfc2FtcGxlZm9ybWF0KTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAiXCJQcmVkaWN0b3JcIiB2YWx1ZSAlZCBub3Qgc3VwcG9ydGVkIiwKKwkJCSAgICBzcC0+cHJlZGljdG9yKTsKKwkJCXJldHVybiAwOworCX0KKwlzcC0+c3RyaWRlID0gKHRkLT50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX0NPTlRJRyA/CisJICAgIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwgOiAxKTsKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgc2NhbmxpbmUvdGlsZS13aWR0aCBzaXplIGluIGJ5dGVzLgorCSAqLworCWlmIChpc1RpbGVkKHRpZikpCisJCXNwLT5yb3dzaXplID0gVElGRlRpbGVSb3dTaXplKHRpZik7CisJZWxzZQorCQlzcC0+cm93c2l6ZSA9IFRJRkZTY2FubGluZVNpemUodGlmKTsKKwlpZiAoc3AtPnJvd3NpemUgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorUHJlZGljdG9yU2V0dXBEZWNvZGUoVElGRiogdGlmKQoreworCVRJRkZQcmVkaWN0b3JTdGF0ZSogc3AgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpOworCVRJRkZEaXJlY3RvcnkqIHRkID0gJnRpZi0+dGlmX2RpcjsKKworCWlmICghKCpzcC0+c2V0dXBkZWNvZGUpKHRpZikgfHwgIVByZWRpY3RvclNldHVwKHRpZikpCisJCXJldHVybiAwOworCisJaWYgKHNwLT5wcmVkaWN0b3IgPT0gMikgeworCQlzd2l0Y2ggKHRkLT50ZF9iaXRzcGVyc2FtcGxlKSB7CisJCQljYXNlIDg6ICBzcC0+ZGVjb2RlcGZ1bmMgPSBob3JBY2M4OyBicmVhazsKKwkJCWNhc2UgMTY6IHNwLT5kZWNvZGVwZnVuYyA9IGhvckFjYzE2OyBicmVhazsKKwkJCWNhc2UgMzI6IHNwLT5kZWNvZGVwZnVuYyA9IGhvckFjYzMyOyBicmVhazsKKwkJfQorCQkvKgorCQkgKiBPdmVycmlkZSBkZWZhdWx0IGRlY29kaW5nIG1ldGhvZCB3aXRoIG9uZSB0aGF0IGRvZXMgdGhlCisJCSAqIHByZWRpY3RvciBzdHVmZi4KKwkJICovCisgICAgICAgICAgICAgICAgaWYoIHRpZi0+dGlmX2RlY29kZXJvdyAhPSBQcmVkaWN0b3JEZWNvZGVSb3cgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3AtPmRlY29kZXJvdyA9IHRpZi0+dGlmX2RlY29kZXJvdzsKKyAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfZGVjb2Rlcm93ID0gUHJlZGljdG9yRGVjb2RlUm93OworICAgICAgICAgICAgICAgICAgICBzcC0+ZGVjb2Rlc3RyaXAgPSB0aWYtPnRpZl9kZWNvZGVzdHJpcDsKKyAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfZGVjb2Rlc3RyaXAgPSBQcmVkaWN0b3JEZWNvZGVUaWxlOworICAgICAgICAgICAgICAgICAgICBzcC0+ZGVjb2RldGlsZSA9IHRpZi0+dGlmX2RlY29kZXRpbGU7CisgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX2RlY29kZXRpbGUgPSBQcmVkaWN0b3JEZWNvZGVUaWxlOworICAgICAgICAgICAgICAgIH0KKworCQkvKgorCQkgKiBJZiB0aGUgZGF0YSBpcyBob3Jpem9udGFsbHkgZGlmZmVyZW5jZWQgMTYtYml0IGRhdGEgdGhhdAorCQkgKiByZXF1aXJlcyBieXRlLXN3YXBwaW5nLCB0aGVuIGl0IG11c3QgYmUgYnl0ZSBzd2FwcGVkIGJlZm9yZQorCQkgKiB0aGUgYWNjdW11bGF0aW9uIHN0ZXAuICBXZSBkbyB0aGlzIHdpdGggYSBzcGVjaWFsLXB1cnBvc2UKKwkJICogcm91dGluZSBhbmQgb3ZlcnJpZGUgdGhlIG5vcm1hbCBwb3N0IGRlY29kaW5nIGxvZ2ljIHRoYXQKKwkJICogdGhlIGxpYnJhcnkgc2V0dXAgd2hlbiB0aGUgZGlyZWN0b3J5IHdhcyByZWFkLgorCQkgKi8KKwkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKSB7CisJCQlpZiAoc3AtPmRlY29kZXBmdW5jID09IGhvckFjYzE2KSB7CisJCQkJc3AtPmRlY29kZXBmdW5jID0gc3dhYkhvckFjYzE2OworCQkJCXRpZi0+dGlmX3Bvc3RkZWNvZGUgPSBfVElGRk5vUG9zdERlY29kZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3AtPmRlY29kZXBmdW5jID09IGhvckFjYzMyKSB7CisJCQkJc3AtPmRlY29kZXBmdW5jID0gc3dhYkhvckFjYzMyOworCQkJCXRpZi0+dGlmX3Bvc3RkZWNvZGUgPSBfVElGRk5vUG9zdERlY29kZTsKKyAgICAgICAgICAgIH0KKwkJfQorCX0KKworCWVsc2UgaWYgKHNwLT5wcmVkaWN0b3IgPT0gMykgeworCQlzcC0+ZGVjb2RlcGZ1bmMgPSBmcEFjYzsKKwkJLyoKKwkJICogT3ZlcnJpZGUgZGVmYXVsdCBkZWNvZGluZyBtZXRob2Qgd2l0aCBvbmUgdGhhdCBkb2VzIHRoZQorCQkgKiBwcmVkaWN0b3Igc3R1ZmYuCisJCSAqLworICAgICAgICAgICAgICAgIGlmKCB0aWYtPnRpZl9kZWNvZGVyb3cgIT0gUHJlZGljdG9yRGVjb2RlUm93ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNwLT5kZWNvZGVyb3cgPSB0aWYtPnRpZl9kZWNvZGVyb3c7CisgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX2RlY29kZXJvdyA9IFByZWRpY3RvckRlY29kZVJvdzsKKyAgICAgICAgICAgICAgICAgICAgc3AtPmRlY29kZXN0cmlwID0gdGlmLT50aWZfZGVjb2Rlc3RyaXA7CisgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX2RlY29kZXN0cmlwID0gUHJlZGljdG9yRGVjb2RlVGlsZTsKKyAgICAgICAgICAgICAgICAgICAgc3AtPmRlY29kZXRpbGUgPSB0aWYtPnRpZl9kZWNvZGV0aWxlOworICAgICAgICAgICAgICAgICAgICB0aWYtPnRpZl9kZWNvZGV0aWxlID0gUHJlZGljdG9yRGVjb2RlVGlsZTsKKyAgICAgICAgICAgICAgICB9CisJCS8qCisJCSAqIFRoZSBkYXRhIHNob3VsZCBub3QgYmUgc3dhcHBlZCBvdXRzaWRlIG9mIHRoZSBmbG9hdGluZworCQkgKiBwb2ludCBwcmVkaWN0b3IsIHRoZSBhY2N1bXVsYXRpb24gcm91dGluZSBzaG91bGQgcmV0dXJuCisJCSAqIGJ5cmVzIGluIHRoZSBuYXRpdmUgb3JkZXIuCisJCSAqLworCQlpZiAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1NXQUIpIHsKKwkJCXRpZi0+dGlmX3Bvc3RkZWNvZGUgPSBfVElGRk5vUG9zdERlY29kZTsKKwkJfQorCQkvKgorCQkgKiBBbGxvY2F0ZSBidWZmZXIgdG8ga2VlcCB0aGUgZGVjb2RlZCBieXRlcyBiZWZvcmUKKwkJICogcmVhcnJhbmdpbmcgaW4gdGhlIGlnaHQgb3JkZXIKKwkJICovCisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK1ByZWRpY3RvclNldHVwRW5jb2RlKFRJRkYqIHRpZikKK3sKKwlUSUZGUHJlZGljdG9yU3RhdGUqIHNwID0gUHJlZGljdG9yU3RhdGUodGlmKTsKKwlUSUZGRGlyZWN0b3J5KiB0ZCA9ICZ0aWYtPnRpZl9kaXI7CisKKwlpZiAoISgqc3AtPnNldHVwZW5jb2RlKSh0aWYpIHx8ICFQcmVkaWN0b3JTZXR1cCh0aWYpKQorCQlyZXR1cm4gMDsKKworCWlmIChzcC0+cHJlZGljdG9yID09IDIpIHsKKwkJc3dpdGNoICh0ZC0+dGRfYml0c3BlcnNhbXBsZSkgeworCQkJY2FzZSA4OiAgc3AtPmVuY29kZXBmdW5jID0gaG9yRGlmZjg7IGJyZWFrOworCQkJY2FzZSAxNjogc3AtPmVuY29kZXBmdW5jID0gaG9yRGlmZjE2OyBicmVhazsKKwkJCWNhc2UgMzI6IHNwLT5lbmNvZGVwZnVuYyA9IGhvckRpZmYzMjsgYnJlYWs7CisJCX0KKwkJLyoKKwkJICogT3ZlcnJpZGUgZGVmYXVsdCBlbmNvZGluZyBtZXRob2Qgd2l0aCBvbmUgdGhhdCBkb2VzIHRoZQorCQkgKiBwcmVkaWN0b3Igc3R1ZmYuCisJCSAqLworICAgICAgICAgICAgICAgIGlmKCB0aWYtPnRpZl9lbmNvZGVyb3cgIT0gUHJlZGljdG9yRW5jb2RlUm93ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNwLT5lbmNvZGVyb3cgPSB0aWYtPnRpZl9lbmNvZGVyb3c7CisgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX2VuY29kZXJvdyA9IFByZWRpY3RvckVuY29kZVJvdzsKKyAgICAgICAgICAgICAgICAgICAgc3AtPmVuY29kZXN0cmlwID0gdGlmLT50aWZfZW5jb2Rlc3RyaXA7CisgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX2VuY29kZXN0cmlwID0gUHJlZGljdG9yRW5jb2RlVGlsZTsKKyAgICAgICAgICAgICAgICAgICAgc3AtPmVuY29kZXRpbGUgPSB0aWYtPnRpZl9lbmNvZGV0aWxlOworICAgICAgICAgICAgICAgICAgICB0aWYtPnRpZl9lbmNvZGV0aWxlID0gUHJlZGljdG9yRW5jb2RlVGlsZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIElmIHRoZSBkYXRhIGlzIGhvcml6b250YWxseSBkaWZmZXJlbmNlZCAxNi1iaXQgZGF0YSB0aGF0CisgICAgICAgICAgICAgICAgICogcmVxdWlyZXMgYnl0ZS1zd2FwcGluZywgdGhlbiBpdCBtdXN0IGJlIGJ5dGUgc3dhcHBlZCBhZnRlcgorICAgICAgICAgICAgICAgICAqIHRoZSBkaWZmZXJlbmNpYXRpb24gc3RlcC4gIFdlIGRvIHRoaXMgd2l0aCBhIHNwZWNpYWwtcHVycG9zZQorICAgICAgICAgICAgICAgICAqIHJvdXRpbmUgYW5kIG92ZXJyaWRlIHRoZSBub3JtYWwgcG9zdCBkZWNvZGluZyBsb2dpYyB0aGF0CisgICAgICAgICAgICAgICAgICogdGhlIGxpYnJhcnkgc2V0dXAgd2hlbiB0aGUgZGlyZWN0b3J5IHdhcyByZWFkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfU1dBQikgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3AtPmVuY29kZXBmdW5jID09IGhvckRpZmYxNikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwLT5lbmNvZGVwZnVuYyA9IHN3YWJIb3JEaWZmMTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfcG9zdGRlY29kZSA9IF9USUZGTm9Qb3N0RGVjb2RlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNwLT5lbmNvZGVwZnVuYyA9PSBob3JEaWZmMzIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcC0+ZW5jb2RlcGZ1bmMgPSBzd2FiSG9yRGlmZjMyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX3Bvc3RkZWNvZGUgPSBfVElGRk5vUG9zdERlY29kZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisJZWxzZSBpZiAoc3AtPnByZWRpY3RvciA9PSAzKSB7CisJCXNwLT5lbmNvZGVwZnVuYyA9IGZwRGlmZjsKKwkJLyoKKwkJICogT3ZlcnJpZGUgZGVmYXVsdCBlbmNvZGluZyBtZXRob2Qgd2l0aCBvbmUgdGhhdCBkb2VzIHRoZQorCQkgKiBwcmVkaWN0b3Igc3R1ZmYuCisJCSAqLworICAgICAgICAgICAgICAgIGlmKCB0aWYtPnRpZl9lbmNvZGVyb3cgIT0gUHJlZGljdG9yRW5jb2RlUm93ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNwLT5lbmNvZGVyb3cgPSB0aWYtPnRpZl9lbmNvZGVyb3c7CisgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX2VuY29kZXJvdyA9IFByZWRpY3RvckVuY29kZVJvdzsKKyAgICAgICAgICAgICAgICAgICAgc3AtPmVuY29kZXN0cmlwID0gdGlmLT50aWZfZW5jb2Rlc3RyaXA7CisgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX2VuY29kZXN0cmlwID0gUHJlZGljdG9yRW5jb2RlVGlsZTsKKyAgICAgICAgICAgICAgICAgICAgc3AtPmVuY29kZXRpbGUgPSB0aWYtPnRpZl9lbmNvZGV0aWxlOworICAgICAgICAgICAgICAgICAgICB0aWYtPnRpZl9lbmNvZGV0aWxlID0gUHJlZGljdG9yRW5jb2RlVGlsZTsKKyAgICAgICAgICAgICAgICB9CisJfQorCisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgUkVQRUFUNChuLCBvcCkJCVwKKyAgICBzd2l0Y2ggKG4pIHsJCVwKKyAgICBkZWZhdWx0OiB7IHRtc2l6ZV90IGk7IGZvciAoaSA9IG4tNDsgaSA+IDA7IGktLSkgeyBvcDsgfSB9IFwKKyAgICBjYXNlIDQ6ICBvcDsJCVwKKyAgICBjYXNlIDM6ICBvcDsJCVwKKyAgICBjYXNlIDI6ICBvcDsJCVwKKyAgICBjYXNlIDE6ICBvcDsJCVwKKyAgICBjYXNlIDA6ICA7CQkJXAorICAgIH0KKworLyogUmVtYXJrcyByZWxhdGVkIHRvIEMgc3RhbmRhcmQgY29tcGxpYW5jZSBpbiBhbGwgYmVsb3cgZnVuY3Rpb25zIDogKi8KKy8qIC0gdG8gYXZvaWQgYW55IHVuZGVmaW5lZCBiZWhhdmlvdXIsIHdlIG9ubHkgb3BlcmF0ZSBvbiB1bnNpZ25lZCB0eXBlcyAqLworLyogICBzaW5jZSB0aGUgYmVoYXZpb3VyIG9mICJvdmVyZmxvd3MiIGlzIGRlZmluZWQgKHdyYXAgb3ZlcikgKi8KKy8qIC0gd2hlbiBzdG9yaW5nIGludG8gdGhlIGJ5dGUgc3RyZWFtLCB3ZSBleHBsaWNpdGx5IG1hc2sgd2l0aCAweGZmIHNvICovCisvKiAgIGFzIHRvIG1ha2UgaWNjIC1jaGVjaz1jb252ZXJzaW9ucyBoYXBweSAobm90IG5lY2Vzc2FyeSBieSB0aGUgc3RhbmRhcmQpICovCisKK3N0YXRpYyB2b2lkCitob3JBY2M4KFRJRkYqIHRpZiwgdWludDgqIGNwMCwgdG1zaXplX3QgY2MpCit7CisJdG1zaXplX3Qgc3RyaWRlID0gUHJlZGljdG9yU3RhdGUodGlmKS0+c3RyaWRlOworCisJdW5zaWduZWQgY2hhciogY3AgPSAodW5zaWduZWQgY2hhciopIGNwMDsKKwlhc3NlcnQoKGNjJXN0cmlkZSk9PTApOworCWlmIChjYyA+IHN0cmlkZSkgeworCQkvKgorCQkgKiBQaXBlbGluZSB0aGUgbW9zdCBjb21tb24gY2FzZXMuCisJCSAqLworCQlpZiAoc3RyaWRlID09IDMpICB7CisJCQl1bnNpZ25lZCBpbnQgY3IgPSBjcFswXTsKKwkJCXVuc2lnbmVkIGludCBjZyA9IGNwWzFdOworCQkJdW5zaWduZWQgaW50IGNiID0gY3BbMl07CisJCQljYyAtPSAzOworCQkJY3AgKz0gMzsKKwkJCXdoaWxlIChjYz4wKSB7CisJCQkJY3BbMF0gPSAodW5zaWduZWQgY2hhcikgKChjciArPSBjcFswXSkgJiAweGZmKTsKKwkJCQljcFsxXSA9ICh1bnNpZ25lZCBjaGFyKSAoKGNnICs9IGNwWzFdKSAmIDB4ZmYpOworCQkJCWNwWzJdID0gKHVuc2lnbmVkIGNoYXIpICgoY2IgKz0gY3BbMl0pICYgMHhmZik7CisJCQkJY2MgLT0gMzsKKwkJCQljcCArPSAzOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cmlkZSA9PSA0KSAgeworCQkJdW5zaWduZWQgaW50IGNyID0gY3BbMF07CisJCQl1bnNpZ25lZCBpbnQgY2cgPSBjcFsxXTsKKwkJCXVuc2lnbmVkIGludCBjYiA9IGNwWzJdOworCQkJdW5zaWduZWQgaW50IGNhID0gY3BbM107CisJCQljYyAtPSA0OworCQkJY3AgKz0gNDsKKwkJCXdoaWxlIChjYz4wKSB7CisJCQkJY3BbMF0gPSAodW5zaWduZWQgY2hhcikgKChjciArPSBjcFswXSkgJiAweGZmKTsKKwkJCQljcFsxXSA9ICh1bnNpZ25lZCBjaGFyKSAoKGNnICs9IGNwWzFdKSAmIDB4ZmYpOworCQkJCWNwWzJdID0gKHVuc2lnbmVkIGNoYXIpICgoY2IgKz0gY3BbMl0pICYgMHhmZik7CisJCQkJY3BbM10gPSAodW5zaWduZWQgY2hhcikgKChjYSArPSBjcFszXSkgJiAweGZmKTsKKwkJCQljYyAtPSA0OworCQkJCWNwICs9IDQ7CisJCQl9CisJCX0gZWxzZSAgeworCQkJY2MgLT0gc3RyaWRlOworCQkJZG8geworCQkJCVJFUEVBVDQoc3RyaWRlLCBjcFtzdHJpZGVdID0KKwkJCQkJKHVuc2lnbmVkIGNoYXIpICgoY3Bbc3RyaWRlXSArICpjcCkgJiAweGZmKTsgY3ArKykKKwkJCQljYyAtPSBzdHJpZGU7CisJCQl9IHdoaWxlIChjYz4wKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK3N3YWJIb3JBY2MxNihUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKQoreworCXVpbnQxNiogd3AgPSAodWludDE2KikgY3AwOworCXRtc2l6ZV90IHdjID0gY2MgLyAyOworCisgICAgICAgIFRJRkZTd2FiQXJyYXlPZlNob3J0KHdwLCB3Yyk7CisgICAgICAgIGhvckFjYzE2KHRpZiwgY3AwLCBjYyk7Cit9CisKK3N0YXRpYyB2b2lkCitob3JBY2MxNihUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKQoreworCXRtc2l6ZV90IHN0cmlkZSA9IFByZWRpY3RvclN0YXRlKHRpZiktPnN0cmlkZTsKKwl1aW50MTYqIHdwID0gKHVpbnQxNiopIGNwMDsKKwl0bXNpemVfdCB3YyA9IGNjIC8gMjsKKworCWFzc2VydCgoY2MlKDIqc3RyaWRlKSk9PTApOworCisJaWYgKHdjID4gc3RyaWRlKSB7CisJCXdjIC09IHN0cmlkZTsKKwkJZG8geworCQkJUkVQRUFUNChzdHJpZGUsIHdwW3N0cmlkZV0gPSAodWludDE2KSgoKHVuc2lnbmVkIGludCl3cFtzdHJpZGVdICsgKHVuc2lnbmVkIGludCl3cFswXSkgJiAweGZmZmYpOyB3cCsrKQorCQkJd2MgLT0gc3RyaWRlOworCQl9IHdoaWxlICh3YyA+IDApOworCX0KK30KKworc3RhdGljIHZvaWQKK3N3YWJIb3JBY2MzMihUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKQoreworCXVpbnQzMiogd3AgPSAodWludDMyKikgY3AwOworCXRtc2l6ZV90IHdjID0gY2MgLyA0OworCisgICAgICAgIFRJRkZTd2FiQXJyYXlPZkxvbmcod3AsIHdjKTsKKwlob3JBY2MzMih0aWYsIGNwMCwgY2MpOworfQorCitzdGF0aWMgdm9pZAoraG9yQWNjMzIoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYykKK3sKKwl0bXNpemVfdCBzdHJpZGUgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpLT5zdHJpZGU7CisJdWludDMyKiB3cCA9ICh1aW50MzIqKSBjcDA7CisJdG1zaXplX3Qgd2MgPSBjYyAvIDQ7CisKKwlhc3NlcnQoKGNjJSg0KnN0cmlkZSkpPT0wKTsKKworCWlmICh3YyA+IHN0cmlkZSkgeworCQl3YyAtPSBzdHJpZGU7CisJCWRvIHsKKwkJCVJFUEVBVDQoc3RyaWRlLCB3cFtzdHJpZGVdICs9IHdwWzBdOyB3cCsrKQorCQkJd2MgLT0gc3RyaWRlOworCQl9IHdoaWxlICh3YyA+IDApOworCX0KK30KKworLyoKKyAqIEZsb2F0aW5nIHBvaW50IHByZWRpY3RvciBhY2N1bXVsYXRpb24gcm91dGluZS4KKyAqLworc3RhdGljIHZvaWQKK2ZwQWNjKFRJRkYqIHRpZiwgdWludDgqIGNwMCwgdG1zaXplX3QgY2MpCit7CisJdG1zaXplX3Qgc3RyaWRlID0gUHJlZGljdG9yU3RhdGUodGlmKS0+c3RyaWRlOworCXVpbnQzMiBicHMgPSB0aWYtPnRpZl9kaXIudGRfYml0c3BlcnNhbXBsZSAvIDg7CisJdG1zaXplX3Qgd2MgPSBjYyAvIGJwczsKKwl0bXNpemVfdCBjb3VudCA9IGNjOworCXVpbnQ4ICpjcCA9ICh1aW50OCAqKSBjcDA7CisJdWludDggKnRtcCA9ICh1aW50OCAqKV9USUZGbWFsbG9jKGNjKTsKKworCWFzc2VydCgoY2MlKGJwcypzdHJpZGUpKT09MCk7CisKKwlpZiAoIXRtcCkKKwkJcmV0dXJuOworCisJd2hpbGUgKGNvdW50ID4gc3RyaWRlKSB7CisJCVJFUEVBVDQoc3RyaWRlLCBjcFtzdHJpZGVdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKSAoKGNwW3N0cmlkZV0gKyBjcFswXSkgJiAweGZmKTsgY3ArKykKKwkJY291bnQgLT0gc3RyaWRlOworCX0KKworCV9USUZGbWVtY3B5KHRtcCwgY3AwLCBjYyk7CisJY3AgPSAodWludDggKikgY3AwOworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IHdjOyBjb3VudCsrKSB7CisJCXVpbnQzMiBieXRlOworCQlmb3IgKGJ5dGUgPSAwOyBieXRlIDwgYnBzOyBieXRlKyspIHsKKwkJCSNpZiBXT1JEU19CSUdFTkRJQU4KKwkJCWNwW2JwcyAqIGNvdW50ICsgYnl0ZV0gPSB0bXBbYnl0ZSAqIHdjICsgY291bnRdOworCQkJI2Vsc2UKKwkJCWNwW2JwcyAqIGNvdW50ICsgYnl0ZV0gPQorCQkJCXRtcFsoYnBzIC0gYnl0ZSAtIDEpICogd2MgKyBjb3VudF07CisJCQkjZW5kaWYKKwkJfQorCX0KKwlfVElGRmZyZWUodG1wKTsKK30KKworLyoKKyAqIERlY29kZSBhIHNjYW5saW5lIGFuZCBhcHBseSB0aGUgcHJlZGljdG9yIHJvdXRpbmUuCisgKi8KK3N0YXRpYyBpbnQKK1ByZWRpY3RvckRlY29kZVJvdyhUSUZGKiB0aWYsIHVpbnQ4KiBvcDAsIHRtc2l6ZV90IG9jYzAsIHVpbnQxNiBzKQoreworCVRJRkZQcmVkaWN0b3JTdGF0ZSAqc3AgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpOworCisJYXNzZXJ0KHNwICE9IE5VTEwpOworCWFzc2VydChzcC0+ZGVjb2Rlcm93ICE9IE5VTEwpOworCWFzc2VydChzcC0+ZGVjb2RlcGZ1bmMgIT0gTlVMTCk7ICAKKworCWlmICgoKnNwLT5kZWNvZGVyb3cpKHRpZiwgb3AwLCBvY2MwLCBzKSkgeworCQkoKnNwLT5kZWNvZGVwZnVuYykodGlmLCBvcDAsIG9jYzApOworCQlyZXR1cm4gMTsKKwl9IGVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZWNvZGUgYSB0aWxlL3N0cmlwIGFuZCBhcHBseSB0aGUgcHJlZGljdG9yIHJvdXRpbmUuCisgKiBOb3RlIHRoYXQgaG9yaXpvbnRhbCBkaWZmZXJlbmNpbmcgbXVzdCBiZSBkb25lIG9uIGEKKyAqIHJvdy1ieS1yb3cgYmFzaXMuICBUaGUgd2lkdGggb2YgYSAicm93IiBoYXMgYWxyZWFkeQorICogYmVlbiBjYWxjdWxhdGVkIGF0IHByZS1kZWNvZGUgdGltZSBhY2NvcmRpbmcgdG8gdGhlCisgKiBzdHJpcC90aWxlIGRpbWVuc2lvbnMuCisgKi8KK3N0YXRpYyBpbnQKK1ByZWRpY3RvckRlY29kZVRpbGUoVElGRiogdGlmLCB1aW50OCogb3AwLCB0bXNpemVfdCBvY2MwLCB1aW50MTYgcykKK3sKKwlUSUZGUHJlZGljdG9yU3RhdGUgKnNwID0gUHJlZGljdG9yU3RhdGUodGlmKTsKKworCWFzc2VydChzcCAhPSBOVUxMKTsKKwlhc3NlcnQoc3AtPmRlY29kZXRpbGUgIT0gTlVMTCk7CisKKwlpZiAoKCpzcC0+ZGVjb2RldGlsZSkodGlmLCBvcDAsIG9jYzAsIHMpKSB7CisJCXRtc2l6ZV90IHJvd3NpemUgPSBzcC0+cm93c2l6ZTsKKwkJYXNzZXJ0KHJvd3NpemUgPiAwKTsKKwkJYXNzZXJ0KChvY2MwJXJvd3NpemUpPT0wKTsKKwkJYXNzZXJ0KHNwLT5kZWNvZGVwZnVuYyAhPSBOVUxMKTsKKwkJd2hpbGUgKG9jYzAgPiAwKSB7CisJCQkoKnNwLT5kZWNvZGVwZnVuYykodGlmLCBvcDAsIHJvd3NpemUpOworCQkJb2NjMCAtPSByb3dzaXplOworCQkJb3AwICs9IHJvd3NpemU7CisJCX0KKwkJcmV0dXJuIDE7CisJfSBlbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoraG9yRGlmZjgoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYykKK3sKKwlUSUZGUHJlZGljdG9yU3RhdGUqIHNwID0gUHJlZGljdG9yU3RhdGUodGlmKTsKKwl0bXNpemVfdCBzdHJpZGUgPSBzcC0+c3RyaWRlOworCXVuc2lnbmVkIGNoYXIqIGNwID0gKHVuc2lnbmVkIGNoYXIqKSBjcDA7CisKKwlhc3NlcnQoKGNjJXN0cmlkZSk9PTApOworCisJaWYgKGNjID4gc3RyaWRlKSB7CisJCWNjIC09IHN0cmlkZTsKKwkJLyoKKwkJICogUGlwZWxpbmUgdGhlIG1vc3QgY29tbW9uIGNhc2VzLgorCQkgKi8KKwkJaWYgKHN0cmlkZSA9PSAzKSB7CisJCQl1bnNpZ25lZCBpbnQgcjEsIGcxLCBiMTsKKwkJCXVuc2lnbmVkIGludCByMiA9IGNwWzBdOworCQkJdW5zaWduZWQgaW50IGcyID0gY3BbMV07CisJCQl1bnNpZ25lZCAgaW50IGIyID0gY3BbMl07CisJCQlkbyB7CisJCQkJcjEgPSBjcFszXTsgY3BbM10gPSAodW5zaWduZWQgY2hhcikoKHIxLXIyKSYweGZmKTsgcjIgPSByMTsKKwkJCQlnMSA9IGNwWzRdOyBjcFs0XSA9ICh1bnNpZ25lZCBjaGFyKSgoZzEtZzIpJjB4ZmYpOyBnMiA9IGcxOworCQkJCWIxID0gY3BbNV07IGNwWzVdID0gKHVuc2lnbmVkIGNoYXIpKChiMS1iMikmMHhmZik7IGIyID0gYjE7CisJCQkJY3AgKz0gMzsKKwkJCX0gd2hpbGUgKChjYyAtPSAzKSA+IDApOworCQl9IGVsc2UgaWYgKHN0cmlkZSA9PSA0KSB7CisJCQl1bnNpZ25lZCBpbnQgcjEsIGcxLCBiMSwgYTE7CisJCQl1bnNpZ25lZCBpbnQgcjIgPSBjcFswXTsKKwkJCXVuc2lnbmVkIGludCBnMiA9IGNwWzFdOworCQkJdW5zaWduZWQgaW50IGIyID0gY3BbMl07CisJCQl1bnNpZ25lZCBpbnQgYTIgPSBjcFszXTsKKwkJCWRvIHsKKwkJCQlyMSA9IGNwWzRdOyBjcFs0XSA9ICh1bnNpZ25lZCBjaGFyKSgocjEtcjIpJjB4ZmYpOyByMiA9IHIxOworCQkJCWcxID0gY3BbNV07IGNwWzVdID0gKHVuc2lnbmVkIGNoYXIpKChnMS1nMikmMHhmZik7IGcyID0gZzE7CisJCQkJYjEgPSBjcFs2XTsgY3BbNl0gPSAodW5zaWduZWQgY2hhcikoKGIxLWIyKSYweGZmKTsgYjIgPSBiMTsKKwkJCQlhMSA9IGNwWzddOyBjcFs3XSA9ICh1bnNpZ25lZCBjaGFyKSgoYTEtYTIpJjB4ZmYpOyBhMiA9IGExOworCQkJCWNwICs9IDQ7CisJCQl9IHdoaWxlICgoY2MgLT0gNCkgPiAwKTsKKwkJfSBlbHNlIHsKKwkJCWNwICs9IGNjIC0gMTsKKwkJCWRvIHsKKwkJCQlSRVBFQVQ0KHN0cmlkZSwgY3Bbc3RyaWRlXSA9ICh1bnNpZ25lZCBjaGFyKSgoY3Bbc3RyaWRlXSAtIGNwWzBdKSYweGZmKTsgY3AtLSkKKwkJCX0gd2hpbGUgKChjYyAtPSBzdHJpZGUpID4gMCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitob3JEaWZmMTYoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYykKK3sKKwlUSUZGUHJlZGljdG9yU3RhdGUqIHNwID0gUHJlZGljdG9yU3RhdGUodGlmKTsKKwl0bXNpemVfdCBzdHJpZGUgPSBzcC0+c3RyaWRlOworCXVpbnQxNiAqd3AgPSAodWludDE2KikgY3AwOworCXRtc2l6ZV90IHdjID0gY2MvMjsKKworCWFzc2VydCgoY2MlKDIqc3RyaWRlKSk9PTApOworCisJaWYgKHdjID4gc3RyaWRlKSB7CisJCXdjIC09IHN0cmlkZTsKKwkJd3AgKz0gd2MgLSAxOworCQlkbyB7CisJCQlSRVBFQVQ0KHN0cmlkZSwgd3Bbc3RyaWRlXSA9ICh1aW50MTYpKCgodW5zaWduZWQgaW50KXdwW3N0cmlkZV0gLSAodW5zaWduZWQgaW50KXdwWzBdKSAmIDB4ZmZmZik7IHdwLS0pCisJCQl3YyAtPSBzdHJpZGU7CisJCX0gd2hpbGUgKHdjID4gMCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorc3dhYkhvckRpZmYxNihUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKQoreworICAgIHVpbnQxNiogd3AgPSAodWludDE2KikgY3AwOworICAgIHRtc2l6ZV90IHdjID0gY2MgLyAyOworCisgICAgaG9yRGlmZjE2KHRpZiwgY3AwLCBjYyk7CisKKyAgICBUSUZGU3dhYkFycmF5T2ZTaG9ydCh3cCwgd2MpOworfQorCitzdGF0aWMgdm9pZAoraG9yRGlmZjMyKFRJRkYqIHRpZiwgdWludDgqIGNwMCwgdG1zaXplX3QgY2MpCit7CisJVElGRlByZWRpY3RvclN0YXRlKiBzcCA9IFByZWRpY3RvclN0YXRlKHRpZik7CisJdG1zaXplX3Qgc3RyaWRlID0gc3AtPnN0cmlkZTsKKwl1aW50MzIgKndwID0gKHVpbnQzMiopIGNwMDsKKwl0bXNpemVfdCB3YyA9IGNjLzQ7CisKKwlhc3NlcnQoKGNjJSg0KnN0cmlkZSkpPT0wKTsKKworCWlmICh3YyA+IHN0cmlkZSkgeworCQl3YyAtPSBzdHJpZGU7CisJCXdwICs9IHdjIC0gMTsKKwkJZG8geworCQkJUkVQRUFUNChzdHJpZGUsIHdwW3N0cmlkZV0gLT0gd3BbMF07IHdwLS0pCisJCQl3YyAtPSBzdHJpZGU7CisJCX0gd2hpbGUgKHdjID4gMCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorc3dhYkhvckRpZmYzMihUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKQoreworICAgIHVpbnQzMiogd3AgPSAodWludDMyKikgY3AwOworICAgIHRtc2l6ZV90IHdjID0gY2MgLyA0OworCisgICAgaG9yRGlmZjMyKHRpZiwgY3AwLCBjYyk7CisKKyAgICBUSUZGU3dhYkFycmF5T2ZMb25nKHdwLCB3Yyk7Cit9CisKKy8qCisgKiBGbG9hdGluZyBwb2ludCBwcmVkaWN0b3IgZGlmZmVyZW5jaW5nIHJvdXRpbmUuCisgKi8KK3N0YXRpYyB2b2lkCitmcERpZmYoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYykKK3sKKwl0bXNpemVfdCBzdHJpZGUgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpLT5zdHJpZGU7CisJdWludDMyIGJwcyA9IHRpZi0+dGlmX2Rpci50ZF9iaXRzcGVyc2FtcGxlIC8gODsKKwl0bXNpemVfdCB3YyA9IGNjIC8gYnBzOworCXRtc2l6ZV90IGNvdW50OworCXVpbnQ4ICpjcCA9ICh1aW50OCAqKSBjcDA7CisJdWludDggKnRtcCA9ICh1aW50OCAqKV9USUZGbWFsbG9jKGNjKTsKKworCWFzc2VydCgoY2MlKGJwcypzdHJpZGUpKT09MCk7CisKKwlpZiAoIXRtcCkKKwkJcmV0dXJuOworCisJX1RJRkZtZW1jcHkodG1wLCBjcDAsIGNjKTsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCB3YzsgY291bnQrKykgeworCQl1aW50MzIgYnl0ZTsKKwkJZm9yIChieXRlID0gMDsgYnl0ZSA8IGJwczsgYnl0ZSsrKSB7CisJCQkjaWYgV09SRFNfQklHRU5ESUFOCisJCQljcFtieXRlICogd2MgKyBjb3VudF0gPSB0bXBbYnBzICogY291bnQgKyBieXRlXTsKKwkJCSNlbHNlCisJCQljcFsoYnBzIC0gYnl0ZSAtIDEpICogd2MgKyBjb3VudF0gPQorCQkJCXRtcFticHMgKiBjb3VudCArIGJ5dGVdOworCQkJI2VuZGlmCisJCX0KKwl9CisJX1RJRkZmcmVlKHRtcCk7CisKKwljcCA9ICh1aW50OCAqKSBjcDA7CisJY3AgKz0gY2MgLSBzdHJpZGUgLSAxOworCWZvciAoY291bnQgPSBjYzsgY291bnQgPiBzdHJpZGU7IGNvdW50IC09IHN0cmlkZSkKKwkJUkVQRUFUNChzdHJpZGUsIGNwW3N0cmlkZV0gPSAodW5zaWduZWQgY2hhcikoKGNwW3N0cmlkZV0gLSBjcFswXSkmMHhmZik7IGNwLS0pCit9CisKK3N0YXRpYyBpbnQKK1ByZWRpY3RvckVuY29kZVJvdyhUSUZGKiB0aWYsIHVpbnQ4KiBicCwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKQoreworCVRJRkZQcmVkaWN0b3JTdGF0ZSAqc3AgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpOworCisJYXNzZXJ0KHNwICE9IE5VTEwpOworCWFzc2VydChzcC0+ZW5jb2RlcGZ1bmMgIT0gTlVMTCk7CisJYXNzZXJ0KHNwLT5lbmNvZGVyb3cgIT0gTlVMTCk7CisKKwkvKiBYWFggaG9yaXpvbnRhbCBkaWZmZXJlbmNpbmcgYWx0ZXJzIHVzZXIncyBkYXRhIFhYWCAqLworCSgqc3AtPmVuY29kZXBmdW5jKSh0aWYsIGJwLCBjYyk7CisJcmV0dXJuICgqc3AtPmVuY29kZXJvdykodGlmLCBicCwgY2MsIHMpOworfQorCitzdGF0aWMgaW50CitQcmVkaWN0b3JFbmNvZGVUaWxlKFRJRkYqIHRpZiwgdWludDgqIGJwMCwgdG1zaXplX3QgY2MwLCB1aW50MTYgcykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJQcmVkaWN0b3JFbmNvZGVUaWxlIjsKKwlUSUZGUHJlZGljdG9yU3RhdGUgKnNwID0gUHJlZGljdG9yU3RhdGUodGlmKTsKKyAgICAgICAgdWludDggKndvcmtpbmdfY29weTsKKwl0bXNpemVfdCBjYyA9IGNjMCwgcm93c2l6ZTsKKwl1bnNpZ25lZCBjaGFyKiBicDsKKyAgICAgICAgaW50IHJlc3VsdF9jb2RlOworCisJYXNzZXJ0KHNwICE9IE5VTEwpOworCWFzc2VydChzcC0+ZW5jb2RlcGZ1bmMgIT0gTlVMTCk7CisJYXNzZXJ0KHNwLT5lbmNvZGV0aWxlICE9IE5VTEwpOworCisgICAgICAgIC8qIAorICAgICAgICAgKiBEbyBwcmVkaWN0b3IgbWFuaXB1bGF0aW9uIGluIGEgd29ya2luZyBidWZmZXIgdG8gYXZvaWQgYWx0ZXJpbmcKKyAgICAgICAgICogdGhlIGNhbGxlcnMgYnVmZmVyLiBodHRwOi8vdHJhYy5vc2dlby5vcmcvZ2RhbC90aWNrZXQvMTk2NQorICAgICAgICAgKi8KKyAgICAgICAgd29ya2luZ19jb3B5ID0gKHVpbnQ4KikgX1RJRkZtYWxsb2MoY2MwKTsKKyAgICAgICAgaWYoIHdvcmtpbmdfY29weSA9PSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIk91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyAiIFRJRkZfU1NJWkVfRk9STUFUICIgYnl0ZSB0ZW1wIGJ1ZmZlci4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNjMCApOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KCB3b3JraW5nX2NvcHksIGJwMCwgY2MwICk7CisgICAgICAgIGJwID0gd29ya2luZ19jb3B5OworCisJcm93c2l6ZSA9IHNwLT5yb3dzaXplOworCWFzc2VydChyb3dzaXplID4gMCk7CisJYXNzZXJ0KChjYzAlcm93c2l6ZSk9PTApOworCXdoaWxlIChjYyA+IDApIHsKKwkJKCpzcC0+ZW5jb2RlcGZ1bmMpKHRpZiwgYnAsIHJvd3NpemUpOworCQljYyAtPSByb3dzaXplOworCQlicCArPSByb3dzaXplOworCX0KKwlyZXN1bHRfY29kZSA9ICgqc3AtPmVuY29kZXRpbGUpKHRpZiwgd29ya2luZ19jb3B5LCBjYzAsIHMpOworCisgICAgICAgIF9USUZGZnJlZSggd29ya2luZ19jb3B5ICk7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdF9jb2RlOworfQorCisjZGVmaW5lCUZJRUxEX1BSRURJQ1RPUgkoRklFTERfQ09ERUMrMCkJCS8qIFhYWCAqLworCitzdGF0aWMgY29uc3QgVElGRkZpZWxkIHByZWRpY3RGaWVsZHNbXSA9IHsKKyAgICB7IFRJRkZUQUdfUFJFRElDVE9SLCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VSU5UMTYsIFRJRkZfU0VUR0VUX1VJTlQxNiwgRklFTERfUFJFRElDVE9SLCBGQUxTRSwgRkFMU0UsICJQcmVkaWN0b3IiLCBOVUxMIH0sCit9OworCitzdGF0aWMgaW50CitQcmVkaWN0b3JWU2V0RmllbGQoVElGRiogdGlmLCB1aW50MzIgdGFnLCB2YV9saXN0IGFwKQoreworCVRJRkZQcmVkaWN0b3JTdGF0ZSAqc3AgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpOworCisJYXNzZXJ0KHNwICE9IE5VTEwpOworCWFzc2VydChzcC0+dnNldHBhcmVudCAhPSBOVUxMKTsKKworCXN3aXRjaCAodGFnKSB7CisJY2FzZSBUSUZGVEFHX1BSRURJQ1RPUjoKKwkJc3AtPnByZWRpY3RvciA9ICh1aW50MTYpIHZhX2FyZyhhcCwgdWludDE2X3ZhcCk7CisJCVRJRkZTZXRGaWVsZEJpdCh0aWYsIEZJRUxEX1BSRURJQ1RPUik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAoKnNwLT52c2V0cGFyZW50KSh0aWYsIHRhZywgYXApOworCX0KKwl0aWYtPnRpZl9mbGFncyB8PSBUSUZGX0RJUlRZRElSRUNUOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitQcmVkaWN0b3JWR2V0RmllbGQoVElGRiogdGlmLCB1aW50MzIgdGFnLCB2YV9saXN0IGFwKQoreworCVRJRkZQcmVkaWN0b3JTdGF0ZSAqc3AgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpOworCisJYXNzZXJ0KHNwICE9IE5VTEwpOworCWFzc2VydChzcC0+dmdldHBhcmVudCAhPSBOVUxMKTsKKworCXN3aXRjaCAodGFnKSB7CisJY2FzZSBUSUZGVEFHX1BSRURJQ1RPUjoKKwkJKnZhX2FyZyhhcCwgdWludDE2KikgPSBzcC0+cHJlZGljdG9yOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKCpzcC0+dmdldHBhcmVudCkodGlmLCB0YWcsIGFwKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCitQcmVkaWN0b3JQcmludERpcihUSUZGKiB0aWYsIEZJTEUqIGZkLCBsb25nIGZsYWdzKQoreworCVRJRkZQcmVkaWN0b3JTdGF0ZSogc3AgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpOworCisJKHZvaWQpIGZsYWdzOworCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1BSRURJQ1RPUikpIHsKKwkJZnByaW50ZihmZCwgIiAgUHJlZGljdG9yOiAiKTsKKwkJc3dpdGNoIChzcC0+cHJlZGljdG9yKSB7CisJCQljYXNlIDE6IGZwcmludGYoZmQsICJub25lICIpOyBicmVhazsKKwkJCWNhc2UgMjogZnByaW50ZihmZCwgImhvcml6b250YWwgZGlmZmVyZW5jaW5nICIpOyBicmVhazsKKwkJCWNhc2UgMzogZnByaW50ZihmZCwgImZsb2F0aW5nIHBvaW50IHByZWRpY3RvciAiKTsgYnJlYWs7CisJCX0KKwkJZnByaW50ZihmZCwgIiV1ICgweCV4KVxuIiwgc3AtPnByZWRpY3Rvciwgc3AtPnByZWRpY3Rvcik7CisJfQorCWlmIChzcC0+cHJpbnRkaXIpCisJCSgqc3AtPnByaW50ZGlyKSh0aWYsIGZkLCBmbGFncyk7Cit9CisKK2ludAorVElGRlByZWRpY3RvckluaXQoVElGRiogdGlmKQoreworCVRJRkZQcmVkaWN0b3JTdGF0ZSogc3AgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpOworCisJYXNzZXJ0KHNwICE9IDApOworCisJLyoKKwkgKiBNZXJnZSBjb2RlYy1zcGVjaWZpYyB0YWcgaW5mb3JtYXRpb24uCisJICovCisJaWYgKCFfVElGRk1lcmdlRmllbGRzKHRpZiwgcHJlZGljdEZpZWxkcywKKwkJCSAgICAgIFRJRkZBcnJheUNvdW50KHByZWRpY3RGaWVsZHMpKSkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgIlRJRkZQcmVkaWN0b3JJbml0IiwKKwkJICAgICJNZXJnaW5nIFByZWRpY3RvciBjb2RlYy1zcGVjaWZpYyB0YWdzIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIE92ZXJyaWRlIHBhcmVudCBnZXQvc2V0IGZpZWxkIG1ldGhvZHMuCisJICovCisJc3AtPnZnZXRwYXJlbnQgPSB0aWYtPnRpZl90YWdtZXRob2RzLnZnZXRmaWVsZDsKKwl0aWYtPnRpZl90YWdtZXRob2RzLnZnZXRmaWVsZCA9CisgICAgICAgICAgICBQcmVkaWN0b3JWR2V0RmllbGQ7LyogaG9vayBmb3IgcHJlZGljdG9yIHRhZyAqLworCXNwLT52c2V0cGFyZW50ID0gdGlmLT50aWZfdGFnbWV0aG9kcy52c2V0ZmllbGQ7CisJdGlmLT50aWZfdGFnbWV0aG9kcy52c2V0ZmllbGQgPQorCSAgICBQcmVkaWN0b3JWU2V0RmllbGQ7LyogaG9vayBmb3IgcHJlZGljdG9yIHRhZyAqLworCXNwLT5wcmludGRpciA9IHRpZi0+dGlmX3RhZ21ldGhvZHMucHJpbnRkaXI7CisJdGlmLT50aWZfdGFnbWV0aG9kcy5wcmludGRpciA9CisgICAgICAgICAgICBQcmVkaWN0b3JQcmludERpcjsJLyogaG9vayBmb3IgcHJlZGljdG9yIHRhZyAqLworCisJc3AtPnNldHVwZGVjb2RlID0gdGlmLT50aWZfc2V0dXBkZWNvZGU7CisJdGlmLT50aWZfc2V0dXBkZWNvZGUgPSBQcmVkaWN0b3JTZXR1cERlY29kZTsKKwlzcC0+c2V0dXBlbmNvZGUgPSB0aWYtPnRpZl9zZXR1cGVuY29kZTsKKwl0aWYtPnRpZl9zZXR1cGVuY29kZSA9IFByZWRpY3RvclNldHVwRW5jb2RlOworCisJc3AtPnByZWRpY3RvciA9IDE7CQkJLyogZGVmYXVsdCB2YWx1ZSAqLworCXNwLT5lbmNvZGVwZnVuYyA9IE5VTEw7CQkJLyogbm8gcHJlZGljdG9yIHJvdXRpbmUgKi8KKwlzcC0+ZGVjb2RlcGZ1bmMgPSBOVUxMOwkJCS8qIG5vIHByZWRpY3RvciByb3V0aW5lICovCisJcmV0dXJuIDE7Cit9CisKK2ludAorVElGRlByZWRpY3RvckNsZWFudXAoVElGRiogdGlmKQoreworCVRJRkZQcmVkaWN0b3JTdGF0ZSogc3AgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpOworCisJYXNzZXJ0KHNwICE9IDApOworCisJdGlmLT50aWZfdGFnbWV0aG9kcy52Z2V0ZmllbGQgPSBzcC0+dmdldHBhcmVudDsKKwl0aWYtPnRpZl90YWdtZXRob2RzLnZzZXRmaWVsZCA9IHNwLT52c2V0cGFyZW50OworCXRpZi0+dGlmX3RhZ21ldGhvZHMucHJpbnRkaXIgPSBzcC0+cHJpbnRkaXI7CisJdGlmLT50aWZfc2V0dXBkZWNvZGUgPSBzcC0+c2V0dXBkZWNvZGU7CisJdGlmLT50aWZfc2V0dXBlbmNvZGUgPSBzcC0+c2V0dXBlbmNvZGU7CisKKwlyZXR1cm4gMTsKK30KKworLyogdmltOiBzZXQgdHM9OCBzdHM9OCBzdz04IG5vZXQ6ICovCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9wcmVkaWN0LmggYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9wcmVkaWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM3MTQ0YwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3ByZWRpY3QuaApAQCAtMCwwICsxLDc3IEBACisvKiAkSWQ6IHRpZl9wcmVkaWN0LmgsdiAxLjggMjAxMC0wMy0xMCAxODo1Njo0OSBiZnJpZXNlbiBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWQorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfVElGRlBSRURJQ1RfCisjZGVmaW5lCV9USUZGUFJFRElDVF8KKy8qCisgKiBgYExpYnJhcnktcHJpdmF0ZScnIFN1cHBvcnQgZm9yIHRoZSBQcmVkaWN0b3IgVGFnCisgKi8KKworLyoKKyAqIENvZGVjcyB0aGF0IHdhbnQgdG8gc3VwcG9ydCB0aGUgUHJlZGljdG9yIHRhZyBtdXN0IHBsYWNlCisgKiB0aGlzIHN0cnVjdHVyZSBmaXJzdCBpbiB0aGVpciBwcml2YXRlIHN0YXRlIGJsb2NrIHNvIHRoYXQKKyAqIHRoZSBwcmVkaWN0b3IgY29kZSBjYW4gY2FzdCB0aWZfZGF0YSB0byBmaW5kIGl0cyBzdGF0ZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWludCAgICAgICAgICAgICBwcmVkaWN0b3I7CS8qIHByZWRpY3RvciB0YWcgdmFsdWUgKi8KKwl0bXNpemVfdCAgICAgICAgc3RyaWRlOwkJLyogc2FtcGxlIHN0cmlkZSBvdmVyIGRhdGEgKi8KKwl0bXNpemVfdCAgICAgICAgcm93c2l6ZTsJLyogdGlsZS9zdHJpcCByb3cgc2l6ZSAqLworCisJVElGRkNvZGVNZXRob2QgIGVuY29kZXJvdzsJLyogcGFyZW50IGNvZGVjIGVuY29kZS9kZWNvZGUgcm93ICovCisJVElGRkNvZGVNZXRob2QgIGVuY29kZXN0cmlwOwkvKiBwYXJlbnQgY29kZWMgZW5jb2RlL2RlY29kZSBzdHJpcCAqLworCVRJRkZDb2RlTWV0aG9kICBlbmNvZGV0aWxlOwkvKiBwYXJlbnQgY29kZWMgZW5jb2RlL2RlY29kZSB0aWxlICovIAorCVRJRkZQb3N0TWV0aG9kICBlbmNvZGVwZnVuYzsJLyogaG9yaXpvbnRhbCBkaWZmZXJlbmNlciAqLworCisJVElGRkNvZGVNZXRob2QgIGRlY29kZXJvdzsJLyogcGFyZW50IGNvZGVjIGVuY29kZS9kZWNvZGUgcm93ICovCisJVElGRkNvZGVNZXRob2QgIGRlY29kZXN0cmlwOwkvKiBwYXJlbnQgY29kZWMgZW5jb2RlL2RlY29kZSBzdHJpcCAqLworCVRJRkZDb2RlTWV0aG9kICBkZWNvZGV0aWxlOwkvKiBwYXJlbnQgY29kZWMgZW5jb2RlL2RlY29kZSB0aWxlICovIAorCVRJRkZQb3N0TWV0aG9kICBkZWNvZGVwZnVuYzsJLyogaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLworCisJVElGRlZHZXRNZXRob2QgIHZnZXRwYXJlbnQ7CS8qIHN1cGVyLWNsYXNzIG1ldGhvZCAqLworCVRJRkZWU2V0TWV0aG9kICB2c2V0cGFyZW50OwkvKiBzdXBlci1jbGFzcyBtZXRob2QgKi8KKwlUSUZGUHJpbnRNZXRob2QgcHJpbnRkaXI7CS8qIHN1cGVyLWNsYXNzIG1ldGhvZCAqLworCVRJRkZCb29sTWV0aG9kICBzZXR1cGRlY29kZTsJLyogc3VwZXItY2xhc3MgbWV0aG9kICovCisJVElGRkJvb2xNZXRob2QgIHNldHVwZW5jb2RlOwkvKiBzdXBlci1jbGFzcyBtZXRob2QgKi8KK30gVElGRlByZWRpY3RvclN0YXRlOworCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKK2V4dGVybiAiQyIgeworI2VuZGlmCitleHRlcm4gaW50IFRJRkZQcmVkaWN0b3JJbml0KFRJRkYqKTsKK2V4dGVybiBpbnQgVElGRlByZWRpY3RvckNsZWFudXAoVElGRiopOworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKyNlbmRpZiAvKiBfVElGRlBSRURJQ1RfICovCisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTggc3c9OCBub2V0OiAqLworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcHJpbnQuYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3ByaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IxYTQyMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3ByaW50LmMKQEAgLTAsMCArMSw3MTYgQEAKKy8qICRJZDogdGlmX3ByaW50LmMsdiAxLjYyIDIwMTUtMDgtMTkgMDI6MzE6MDQgYmZyaWVzZW4gRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OC0xOTk3IFNhbSBMZWZmbGVyCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEtMTk5NyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgKiB0aGF0IChpKSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisgKiBhbGwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uLCBhbmQgKGlpKSB0aGUgbmFtZXMgb2YKKyAqIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzIG1heSBub3QgYmUgdXNlZCBpbiBhbnkgYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCB0aGUgc3BlY2lmaWMsIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24gb2YgU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgCisgKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIAorICogSU4gTk8gRVZFTlQgU0hBTEwgU0FNIExFRkZMRVIgT1IgU0lMSUNPTiBHUkFQSElDUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELAorICogT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorICogV0hFVEhFUiBPUiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRiAKKyAqIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgCisgKiBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUSUZGIExpYnJhcnkuCisgKgorICogRGlyZWN0b3J5IFByaW50aW5nIFN1cHBvcnQKKyAqLworI2luY2x1ZGUgInRpZmZpb3AuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworc3RhdGljIHZvaWQKK19USUZGcHJpbnRBc2NpaUJvdW5kZWQoRklMRSogZmQsIGNvbnN0IGNoYXIqIGNwLCBzaXplX3QgbWF4X2NoYXJzKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnBob3RvTmFtZXNbXSA9IHsKKyAgICAibWluLWlzLXdoaXRlIiwJCQkJLyogUEhPVE9NRVRSSUNfTUlOSVNXSElURSAqLworICAgICJtaW4taXMtYmxhY2siLAkJCQkvKiBQSE9UT01FVFJJQ19NSU5JU0JMQUNLICovCisgICAgIlJHQiBjb2xvciIsCQkJCS8qIFBIT1RPTUVUUklDX1JHQiAqLworICAgICJwYWxldHRlIGNvbG9yIChSR0IgZnJvbSBjb2xvcm1hcCkiLAkvKiBQSE9UT01FVFJJQ19QQUxFVFRFICovCisgICAgInRyYW5zcGFyZW5jeSBtYXNrIiwJCQkvKiBQSE9UT01FVFJJQ19NQVNLICovCisgICAgInNlcGFyYXRlZCIsCQkJCS8qIFBIT1RPTUVUUklDX1NFUEFSQVRFRCAqLworICAgICJZQ2JDciIsCQkJCQkvKiBQSE9UT01FVFJJQ19ZQ0JDUiAqLworICAgICI3ICgweDcpIiwKKyAgICAiQ0lFIEwqYSpiKiIsCQkJCS8qIFBIT1RPTUVUUklDX0NJRUxBQiAqLworICAgICJJQ0MgTCphKmIqIiwJCQkJLyogUEhPVE9NRVRSSUNfSUNDTEFCICovCisgICAgIklUVSBMKmEqYioiIAkJCQkvKiBQSE9UT01FVFJJQ19JVFVMQUIgKi8KK307CisjZGVmaW5lCU5QSE9UT05BTUVTCShzaXplb2YgKHBob3RvTmFtZXMpIC8gc2l6ZW9mIChwaG90b05hbWVzWzBdKSkKKworc3RhdGljIGNvbnN0IGNoYXIgKm9yaWVudE5hbWVzW10gPSB7CisgICAgIjAgKDB4MCkiLAorICAgICJyb3cgMCB0b3AsIGNvbCAwIGxocyIsCQkJLyogT1JJRU5UQVRJT05fVE9QTEVGVCAqLworICAgICJyb3cgMCB0b3AsIGNvbCAwIHJocyIsCQkJLyogT1JJRU5UQVRJT05fVE9QUklHSFQgKi8KKyAgICAicm93IDAgYm90dG9tLCBjb2wgMCByaHMiLAkJCS8qIE9SSUVOVEFUSU9OX0JPVFJJR0hUICovCisgICAgInJvdyAwIGJvdHRvbSwgY29sIDAgbGhzIiwJCQkvKiBPUklFTlRBVElPTl9CT1RMRUZUICovCisgICAgInJvdyAwIGxocywgY29sIDAgdG9wIiwJCQkvKiBPUklFTlRBVElPTl9MRUZUVE9QICovCisgICAgInJvdyAwIHJocywgY29sIDAgdG9wIiwJCQkvKiBPUklFTlRBVElPTl9SSUdIVFRPUCAqLworICAgICJyb3cgMCByaHMsIGNvbCAwIGJvdHRvbSIsCQkJLyogT1JJRU5UQVRJT05fUklHSFRCT1QgKi8KKyAgICAicm93IDAgbGhzLCBjb2wgMCBib3R0b20iLAkJCS8qIE9SSUVOVEFUSU9OX0xFRlRCT1QgKi8KK307CisjZGVmaW5lCU5PUklFTlROQU1FUwkoc2l6ZW9mIChvcmllbnROYW1lcykgLyBzaXplb2YgKG9yaWVudE5hbWVzWzBdKSkKKworc3RhdGljIHZvaWQKK19USUZGUHJpbnRGaWVsZChGSUxFKiBmZCwgY29uc3QgVElGRkZpZWxkICpmaXAsCisJCXVpbnQzMiB2YWx1ZV9jb3VudCwgdm9pZCAqcmF3X2RhdGEpCit7CisJdWludDMyIGo7CisJCQorCWZwcmludGYoZmQsICIgICVzOiAiLCBmaXAtPmZpZWxkX25hbWUpOworCisJZm9yKGogPSAwOyBqIDwgdmFsdWVfY291bnQ7IGorKykgeworCQlpZihmaXAtPmZpZWxkX3R5cGUgPT0gVElGRl9CWVRFKQorCQkJZnByaW50ZihmZCwgIiV1IiwgKCh1aW50OCAqKSByYXdfZGF0YSlbal0pOworCQllbHNlIGlmKGZpcC0+ZmllbGRfdHlwZSA9PSBUSUZGX1VOREVGSU5FRCkKKwkJCWZwcmludGYoZmQsICIweCV4IiwKKwkJCSAgICAodW5zaWduZWQgaW50KSAoKHVuc2lnbmVkIGNoYXIgKikgcmF3X2RhdGEpW2pdKTsKKwkJZWxzZSBpZihmaXAtPmZpZWxkX3R5cGUgPT0gVElGRl9TQllURSkKKwkJCWZwcmludGYoZmQsICIlZCIsICgoaW50OCAqKSByYXdfZGF0YSlbal0pOworCQllbHNlIGlmKGZpcC0+ZmllbGRfdHlwZSA9PSBUSUZGX1NIT1JUKQorCQkJZnByaW50ZihmZCwgIiV1IiwgKCh1aW50MTYgKikgcmF3X2RhdGEpW2pdKTsKKwkJZWxzZSBpZihmaXAtPmZpZWxkX3R5cGUgPT0gVElGRl9TU0hPUlQpCisJCQlmcHJpbnRmKGZkLCAiJWQiLCAoKGludDE2ICopIHJhd19kYXRhKVtqXSk7CisJCWVsc2UgaWYoZmlwLT5maWVsZF90eXBlID09IFRJRkZfTE9ORykKKwkJCWZwcmludGYoZmQsICIlbHUiLAorCQkJICAgICh1bnNpZ25lZCBsb25nKSgodWludDMyICopIHJhd19kYXRhKVtqXSk7CisJCWVsc2UgaWYoZmlwLT5maWVsZF90eXBlID09IFRJRkZfU0xPTkcpCisJCQlmcHJpbnRmKGZkLCAiJWxkIiwgKGxvbmcpKChpbnQzMiAqKSByYXdfZGF0YSlbal0pOworCQllbHNlIGlmKGZpcC0+ZmllbGRfdHlwZSA9PSBUSUZGX0lGRCkKKwkJCWZwcmludGYoZmQsICIweCVseCIsCisJCQkJKHVuc2lnbmVkIGxvbmcpKCh1aW50MzIgKikgcmF3X2RhdGEpW2pdKTsKKwkJZWxzZSBpZihmaXAtPmZpZWxkX3R5cGUgPT0gVElGRl9SQVRJT05BTAorCQkJfHwgZmlwLT5maWVsZF90eXBlID09IFRJRkZfU1JBVElPTkFMCisJCQl8fCBmaXAtPmZpZWxkX3R5cGUgPT0gVElGRl9GTE9BVCkKKwkJCWZwcmludGYoZmQsICIlZiIsICgoZmxvYXQgKikgcmF3X2RhdGEpW2pdKTsKKwkJZWxzZSBpZihmaXAtPmZpZWxkX3R5cGUgPT0gVElGRl9MT05HOCkKKyNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgKGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKQorCQkJZnByaW50ZihmZCwgIiVJNjR1IiwKKwkJCSAgICAodW5zaWduZWQgX19pbnQ2NCkoKHVpbnQ2NCAqKSByYXdfZGF0YSlbal0pOworI2Vsc2UKKwkJCWZwcmludGYoZmQsICIlbGx1IiwKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKSgodWludDY0ICopIHJhd19kYXRhKVtqXSk7CisjZW5kaWYKKwkJZWxzZSBpZihmaXAtPmZpZWxkX3R5cGUgPT0gVElGRl9TTE9ORzgpCisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkKKwkJCWZwcmludGYoZmQsICIlSTY0ZCIsIChfX2ludDY0KSgoaW50NjQgKikgcmF3X2RhdGEpW2pdKTsKKyNlbHNlCisJCQlmcHJpbnRmKGZkLCAiJWxsZCIsIChsb25nIGxvbmcpKChpbnQ2NCAqKSByYXdfZGF0YSlbal0pOworI2VuZGlmCisJCWVsc2UgaWYoZmlwLT5maWVsZF90eXBlID09IFRJRkZfSUZEOCkKKyNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgKGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKQorCQkJZnByaW50ZihmZCwgIjB4JUk2NHgiLAorCQkJCSh1bnNpZ25lZCBfX2ludDY0KSgodWludDY0ICopIHJhd19kYXRhKVtqXSk7CisjZWxzZQorCQkJZnByaW50ZihmZCwgIjB4JWxseCIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykoKHVpbnQ2NCAqKSByYXdfZGF0YSlbal0pOworI2VuZGlmCisJCWVsc2UgaWYoZmlwLT5maWVsZF90eXBlID09IFRJRkZfRkxPQVQpCisJCQlmcHJpbnRmKGZkLCAiJWYiLCAoKGZsb2F0ICopcmF3X2RhdGEpW2pdKTsKKwkJZWxzZSBpZihmaXAtPmZpZWxkX3R5cGUgPT0gVElGRl9ET1VCTEUpCisJCQlmcHJpbnRmKGZkLCAiJWYiLCAoKGRvdWJsZSAqKSByYXdfZGF0YSlbal0pOworCQllbHNlIGlmKGZpcC0+ZmllbGRfdHlwZSA9PSBUSUZGX0FTQ0lJKSB7CisJCQlmcHJpbnRmKGZkLCAiJXMiLCAoY2hhciAqKSByYXdfZGF0YSk7CisJCQlicmVhazsKKwkJfQorCQllbHNlIHsKKwkJCWZwcmludGYoZmQsICI8dW5zdXBwb3J0ZWQgZGF0YSB0eXBlIGluIFRJRkZQcmludD4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYoaiA8IHZhbHVlX2NvdW50IC0gMSkKKwkJCWZwcmludGYoZmQsICIsIik7CisJfQorCisJZnByaW50ZihmZCwgIlxuIik7Cit9CisKK3N0YXRpYyBpbnQKK19USUZGUHJldHR5UHJpbnRGaWVsZChUSUZGKiB0aWYsIGNvbnN0IFRJRkZGaWVsZCAqZmlwLCBGSUxFKiBmZCwgdWludDMyIHRhZywKKwkJICAgICAgdWludDMyIHZhbHVlX2NvdW50LCB2b2lkICpyYXdfZGF0YSkKK3sKKyAgICAgICAgKHZvaWQpIHRpZjsKKworCS8qIGRvIG5vdCB0cnkgdG8gcHJldHR5IHByaW50IGF1dG8tZGVmaW5lZCBmaWVsZHMgKi8KKwlpZiAoc3RybmNtcChmaXAtPmZpZWxkX25hbWUsIlRhZyAiLCA0KSA9PSAwKSB7CisJCXJldHVybiAwOworCX0KKyAgICAgICAgCisJc3dpdGNoICh0YWcpCisJeworCQljYXNlIFRJRkZUQUdfSU5LU0VUOgorCQkJaWYgKHZhbHVlX2NvdW50ID09IDIgJiYgZmlwLT5maWVsZF90eXBlID09IFRJRkZfU0hPUlQpIHsKKwkJCQlmcHJpbnRmKGZkLCAiICBJbmsgU2V0OiAiKTsKKwkJCQlzd2l0Y2ggKCooKHVpbnQxNiopcmF3X2RhdGEpKSB7CisJCQkJY2FzZSBJTktTRVRfQ01ZSzoKKwkJCQkJZnByaW50ZihmZCwgIkNNWUtcbiIpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlmcHJpbnRmKGZkLCAiJXUgKDB4JXgpXG4iLAorCQkJCQkJKigodWludDE2KilyYXdfZGF0YSksCisJCQkJCQkqKCh1aW50MTYqKXJhd19kYXRhKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCXJldHVybiAwOworCisJCWNhc2UgVElGRlRBR19ET1RSQU5HRToKKwkJCWlmICh2YWx1ZV9jb3VudCA9PSAyICYmIGZpcC0+ZmllbGRfdHlwZSA9PSBUSUZGX1NIT1JUKSB7CisJCQkJZnByaW50ZihmZCwgIiAgRG90IFJhbmdlOiAldS0ldVxuIiwKKwkJCQkJKCh1aW50MTYqKXJhd19kYXRhKVswXSwgKCh1aW50MTYqKXJhd19kYXRhKVsxXSk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRJRkZUQUdfV0hJVEVQT0lOVDoKKwkJCWlmICh2YWx1ZV9jb3VudCA9PSAyICYmIGZpcC0+ZmllbGRfdHlwZSA9PSBUSUZGX1JBVElPTkFMKSB7CisJCQkJZnByaW50ZihmZCwgIiAgV2hpdGUgUG9pbnQ6ICVnLSVnXG4iLAorCQkJCQkoKGZsb2F0ICopcmF3X2RhdGEpWzBdLCAoKGZsb2F0ICopcmF3X2RhdGEpWzFdKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0gCisJCQlyZXR1cm4gMDsKKworCQljYXNlIFRJRkZUQUdfWE1MUEFDS0VUOgorCQl7CisJCQl1aW50MzIgaTsKKworCQkJZnByaW50ZihmZCwgIiAgWE1MUGFja2V0IChYTVAgTWV0YWRhdGEpOlxuIiApOworCQkJZm9yKGkgPSAwOyBpIDwgdmFsdWVfY291bnQ7IGkrKykKKwkJCQlmcHV0YygoKGNoYXIgKilyYXdfZGF0YSlbaV0sIGZkKTsKKwkJCWZwcmludGYoIGZkLCAiXG4iICk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQljYXNlIFRJRkZUQUdfUklDSFRJRkZJUFRDOgorCQkJLyoKKwkJCSAqIFhYWDogZm9yIHNvbWUgd2VpcmQgcmVhc29uIFJpY2hUSUZGSVBUQyB0YWcKKwkJCSAqIGRlZmluZWQgYXMgYXJyYXkgb2YgTE9ORyB2YWx1ZXMuCisJCQkgKi8KKwkJCWZwcmludGYoZmQsCisJCQkgICAgIiAgUmljaFRJRkZJUFRDIERhdGE6IDxwcmVzZW50PiwgJWx1IGJ5dGVzXG4iLAorCQkJICAgICh1bnNpZ25lZCBsb25nKSB2YWx1ZV9jb3VudCAqIDQpOworCQkJcmV0dXJuIDE7CisKKwkJY2FzZSBUSUZGVEFHX1BIT1RPU0hPUDoKKwkJCWZwcmludGYoZmQsICIgIFBob3Rvc2hvcCBEYXRhOiA8cHJlc2VudD4sICVsdSBieXRlc1xuIiwKKwkJCSAgICAodW5zaWduZWQgbG9uZykgdmFsdWVfY291bnQpOworCQkJcmV0dXJuIDE7CisKKwkJY2FzZSBUSUZGVEFHX0lDQ1BST0ZJTEU6CisJCQlmcHJpbnRmKGZkLCAiICBJQ0MgUHJvZmlsZTogPHByZXNlbnQ+LCAlbHUgYnl0ZXNcbiIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpIHZhbHVlX2NvdW50KTsKKwkJCXJldHVybiAxOworCisJCWNhc2UgVElGRlRBR19TVE9OSVRTOgorCQkJaWYgKHZhbHVlX2NvdW50ID09IDEgJiYgZmlwLT5maWVsZF90eXBlID09IFRJRkZfRE9VQkxFKSB7IAorCQkJCWZwcmludGYoZmQsCisJCQkJCSIgIFNhbXBsZSB0byBOaXRzIGNvbnZlcnNpb24gZmFjdG9yOiAlLjRlXG4iLAorCQkJCQkqKChkb3VibGUqKXJhd19kYXRhKSk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFByaW50IHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBkaXJlY3RvcnkKKyAqIHRvIHRoZSBzcGVjaWZpZWQgc3RkaW8gZmlsZSBzdHJlYW0uCisgKi8KK3ZvaWQKK1RJRkZQcmludERpcmVjdG9yeShUSUZGKiB0aWYsIEZJTEUqIGZkLCBsb25nIGZsYWdzKQoreworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKwljaGFyICpzZXA7CisJdWludDE2IGk7CisJbG9uZyBsLCBuOworCisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkKKwlmcHJpbnRmKGZkLCAiVElGRiBEaXJlY3RvcnkgYXQgb2Zmc2V0IDB4JUk2NHggKCVJNjR1KVxuIiwKKwkJKHVuc2lnbmVkIF9faW50NjQpIHRpZi0+dGlmX2Rpcm9mZiwKKwkJKHVuc2lnbmVkIF9faW50NjQpIHRpZi0+dGlmX2Rpcm9mZik7CisjZWxzZQorCWZwcmludGYoZmQsICJUSUZGIERpcmVjdG9yeSBhdCBvZmZzZXQgMHglbGx4ICglbGx1KVxuIiwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZykgdGlmLT50aWZfZGlyb2ZmLAorCQkodW5zaWduZWQgbG9uZyBsb25nKSB0aWYtPnRpZl9kaXJvZmYpOworI2VuZGlmCisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfU1VCRklMRVRZUEUpKSB7CisJCWZwcmludGYoZmQsICIgIFN1YmZpbGUgVHlwZToiKTsKKwkJc2VwID0gIiAiOworCQlpZiAodGQtPnRkX3N1YmZpbGV0eXBlICYgRklMRVRZUEVfUkVEVUNFRElNQUdFKSB7CisJCQlmcHJpbnRmKGZkLCAiJXNyZWR1Y2VkLXJlc29sdXRpb24gaW1hZ2UiLCBzZXApOworCQkJc2VwID0gIi8iOworCQl9CisJCWlmICh0ZC0+dGRfc3ViZmlsZXR5cGUgJiBGSUxFVFlQRV9QQUdFKSB7CisJCQlmcHJpbnRmKGZkLCAiJXNtdWx0aS1wYWdlIGRvY3VtZW50Iiwgc2VwKTsKKwkJCXNlcCA9ICIvIjsKKwkJfQorCQlpZiAodGQtPnRkX3N1YmZpbGV0eXBlICYgRklMRVRZUEVfTUFTSykKKwkJCWZwcmludGYoZmQsICIlc3RyYW5zcGFyZW5jeSBtYXNrIiwgc2VwKTsKKwkJZnByaW50ZihmZCwgIiAoJWx1ID0gMHglbHgpXG4iLAorCQkgICAgKGxvbmcpIHRkLT50ZF9zdWJmaWxldHlwZSwgKGxvbmcpIHRkLT50ZF9zdWJmaWxldHlwZSk7CisJfQorCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX0lNQUdFRElNRU5TSU9OUykpIHsKKwkJZnByaW50ZihmZCwgIiAgSW1hZ2UgV2lkdGg6ICVsdSBJbWFnZSBMZW5ndGg6ICVsdSIsCisJCSAgICAodW5zaWduZWQgbG9uZykgdGQtPnRkX2ltYWdld2lkdGgsICh1bnNpZ25lZCBsb25nKSB0ZC0+dGRfaW1hZ2VsZW5ndGgpOworCQlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9JTUFHRURFUFRIKSkKKwkJCWZwcmludGYoZmQsICIgSW1hZ2UgRGVwdGg6ICVsdSIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpIHRkLT50ZF9pbWFnZWRlcHRoKTsKKwkJZnByaW50ZihmZCwgIlxuIik7CisJfQorCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1RJTEVESU1FTlNJT05TKSkgeworCQlmcHJpbnRmKGZkLCAiICBUaWxlIFdpZHRoOiAlbHUgVGlsZSBMZW5ndGg6ICVsdSIsCisJCSAgICAodW5zaWduZWQgbG9uZykgdGQtPnRkX3RpbGV3aWR0aCwgKHVuc2lnbmVkIGxvbmcpIHRkLT50ZF90aWxlbGVuZ3RoKTsKKwkJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfVElMRURFUFRIKSkKKwkJCWZwcmludGYoZmQsICIgVGlsZSBEZXB0aDogJWx1IiwKKwkJCSAgICAodW5zaWduZWQgbG9uZykgdGQtPnRkX3RpbGVkZXB0aCk7CisJCWZwcmludGYoZmQsICJcbiIpOworCX0KKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9SRVNPTFVUSU9OKSkgeworCQlmcHJpbnRmKGZkLCAiICBSZXNvbHV0aW9uOiAlZywgJWciLAorCQkgICAgdGQtPnRkX3hyZXNvbHV0aW9uLCB0ZC0+dGRfeXJlc29sdXRpb24pOworCQlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9SRVNPTFVUSU9OVU5JVCkpIHsKKwkJCXN3aXRjaCAodGQtPnRkX3Jlc29sdXRpb251bml0KSB7CisJCQljYXNlIFJFU1VOSVRfTk9ORToKKwkJCQlmcHJpbnRmKGZkLCAiICh1bml0bGVzcykiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVTVU5JVF9JTkNIOgorCQkJCWZwcmludGYoZmQsICIgcGl4ZWxzL2luY2giKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUkVTVU5JVF9DRU5USU1FVEVSOgorCQkJCWZwcmludGYoZmQsICIgcGl4ZWxzL2NtIik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWZwcmludGYoZmQsICIgKHVuaXQgJXUgPSAweCV4KSIsCisJCQkJICAgIHRkLT50ZF9yZXNvbHV0aW9udW5pdCwKKwkJCQkgICAgdGQtPnRkX3Jlc29sdXRpb251bml0KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlmcHJpbnRmKGZkLCAiXG4iKTsKKwl9CisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfUE9TSVRJT04pKQorCQlmcHJpbnRmKGZkLCAiICBQb3NpdGlvbjogJWcsICVnXG4iLAorCQkgICAgdGQtPnRkX3hwb3NpdGlvbiwgdGQtPnRkX3lwb3NpdGlvbik7CisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfQklUU1BFUlNBTVBMRSkpCisJCWZwcmludGYoZmQsICIgIEJpdHMvU2FtcGxlOiAldVxuIiwgdGQtPnRkX2JpdHNwZXJzYW1wbGUpOworCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1NBTVBMRUZPUk1BVCkpIHsKKwkJZnByaW50ZihmZCwgIiAgU2FtcGxlIEZvcm1hdDogIik7CisJCXN3aXRjaCAodGQtPnRkX3NhbXBsZWZvcm1hdCkgeworCQljYXNlIFNBTVBMRUZPUk1BVF9WT0lEOgorCQkJZnByaW50ZihmZCwgInZvaWRcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgU0FNUExFRk9STUFUX0lOVDoKKwkJCWZwcmludGYoZmQsICJzaWduZWQgaW50ZWdlclxuIik7CisJCQlicmVhazsKKwkJY2FzZSBTQU1QTEVGT1JNQVRfVUlOVDoKKwkJCWZwcmludGYoZmQsICJ1bnNpZ25lZCBpbnRlZ2VyXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFNBTVBMRUZPUk1BVF9JRUVFRlA6CisJCQlmcHJpbnRmKGZkLCAiSUVFRSBmbG9hdGluZyBwb2ludFxuIik7CisJCQlicmVhazsKKwkJY2FzZSBTQU1QTEVGT1JNQVRfQ09NUExFWElOVDoKKwkJCWZwcmludGYoZmQsICJjb21wbGV4IHNpZ25lZCBpbnRlZ2VyXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFNBTVBMRUZPUk1BVF9DT01QTEVYSUVFRUZQOgorCQkJZnByaW50ZihmZCwgImNvbXBsZXggSUVFRSBmbG9hdGluZyBwb2ludFxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZwcmludGYoZmQsICIldSAoMHgleClcbiIsCisJCQkgICAgdGQtPnRkX3NhbXBsZWZvcm1hdCwgdGQtPnRkX3NhbXBsZWZvcm1hdCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9DT01QUkVTU0lPTikpIHsKKwkJY29uc3QgVElGRkNvZGVjKiBjID0gVElGRkZpbmRDT0RFQyh0ZC0+dGRfY29tcHJlc3Npb24pOworCQlmcHJpbnRmKGZkLCAiICBDb21wcmVzc2lvbiBTY2hlbWU6ICIpOworCQlpZiAoYykKKwkJCWZwcmludGYoZmQsICIlc1xuIiwgYy0+bmFtZSk7CisJCWVsc2UKKwkJCWZwcmludGYoZmQsICIldSAoMHgleClcbiIsCisJCQkgICAgdGQtPnRkX2NvbXByZXNzaW9uLCB0ZC0+dGRfY29tcHJlc3Npb24pOworCX0KKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9QSE9UT01FVFJJQykpIHsKKwkJZnByaW50ZihmZCwgIiAgUGhvdG9tZXRyaWMgSW50ZXJwcmV0YXRpb246ICIpOworCQlpZiAodGQtPnRkX3Bob3RvbWV0cmljIDwgTlBIT1RPTkFNRVMpCisJCQlmcHJpbnRmKGZkLCAiJXNcbiIsIHBob3RvTmFtZXNbdGQtPnRkX3Bob3RvbWV0cmljXSk7CisJCWVsc2UgeworCQkJc3dpdGNoICh0ZC0+dGRfcGhvdG9tZXRyaWMpIHsKKwkJCWNhc2UgUEhPVE9NRVRSSUNfTE9HTDoKKwkJCQlmcHJpbnRmKGZkLCAiQ0lFIExvZzIoTClcbiIpOworCQkJCWJyZWFrOworCQkJY2FzZSBQSE9UT01FVFJJQ19MT0dMVVY6CisJCQkJZnByaW50ZihmZCwgIkNJRSBMb2cyKEwpICh1Jyx2JylcbiIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlmcHJpbnRmKGZkLCAiJXUgKDB4JXgpXG4iLAorCQkJCSAgICB0ZC0+dGRfcGhvdG9tZXRyaWMsIHRkLT50ZF9waG90b21ldHJpYyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfRVhUUkFTQU1QTEVTKSAmJiB0ZC0+dGRfZXh0cmFzYW1wbGVzKSB7CisJCWZwcmludGYoZmQsICIgIEV4dHJhIFNhbXBsZXM6ICV1PCIsIHRkLT50ZF9leHRyYXNhbXBsZXMpOworCQlzZXAgPSAiIjsKKwkJZm9yIChpID0gMDsgaSA8IHRkLT50ZF9leHRyYXNhbXBsZXM7IGkrKykgeworCQkJc3dpdGNoICh0ZC0+dGRfc2FtcGxlaW5mb1tpXSkgeworCQkJY2FzZSBFWFRSQVNBTVBMRV9VTlNQRUNJRklFRDoKKwkJCQlmcHJpbnRmKGZkLCAiJXN1bnNwZWNpZmllZCIsIHNlcCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEVYVFJBU0FNUExFX0FTU09DQUxQSEE6CisJCQkJZnByaW50ZihmZCwgIiVzYXNzb2MtYWxwaGEiLCBzZXApOworCQkJCWJyZWFrOworCQkJY2FzZSBFWFRSQVNBTVBMRV9VTkFTU0FMUEhBOgorCQkJCWZwcmludGYoZmQsICIlc3VuYXNzb2MtYWxwaGEiLCBzZXApOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlmcHJpbnRmKGZkLCAiJXMldSAoMHgleCkiLCBzZXAsCisJCQkJICAgIHRkLT50ZF9zYW1wbGVpbmZvW2ldLCB0ZC0+dGRfc2FtcGxlaW5mb1tpXSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzZXAgPSAiLCAiOworCQl9CisJCWZwcmludGYoZmQsICI+XG4iKTsKKwl9CisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfSU5LTkFNRVMpKSB7CisJCWNoYXIqIGNwOworCQlmcHJpbnRmKGZkLCAiICBJbmsgTmFtZXM6ICIpOworCQlpID0gdGQtPnRkX3NhbXBsZXNwZXJwaXhlbDsKKwkJc2VwID0gIiI7CisJCWZvciAoY3AgPSB0ZC0+dGRfaW5rbmFtZXM7IAorCQkgICAgIGkgPiAwICYmIGNwIDwgdGQtPnRkX2lua25hbWVzICsgdGQtPnRkX2lua25hbWVzbGVuOyAKKwkJICAgICBjcCA9IHN0cmNocihjcCwnXDAnKSsxLCBpLS0pIHsKKwkJCXNpemVfdCBtYXhfY2hhcnMgPSAKKwkJCQl0ZC0+dGRfaW5rbmFtZXNsZW4gLSAoY3AgLSB0ZC0+dGRfaW5rbmFtZXMpOworCQkJZnB1dHMoc2VwLCBmZCk7CisJCQlfVElGRnByaW50QXNjaWlCb3VuZGVkKGZkLCBjcCwgbWF4X2NoYXJzKTsKKwkJCXNlcCA9ICIsICI7CisJCX0KKyAgICAgICAgICAgICAgICBmcHV0cygiXG4iLCBmZCk7CisJfQorCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1RIUkVTSEhPTERJTkcpKSB7CisJCWZwcmludGYoZmQsICIgIFRocmVzaG9sZGluZzogIik7CisJCXN3aXRjaCAodGQtPnRkX3RocmVzaGhvbGRpbmcpIHsKKwkJY2FzZSBUSFJFU0hIT0xEX0JJTEVWRUw6CisJCQlmcHJpbnRmKGZkLCAiYmlsZXZlbCBhcnQgc2NhblxuIik7CisJCQlicmVhazsKKwkJY2FzZSBUSFJFU0hIT0xEX0hBTEZUT05FOgorCQkJZnByaW50ZihmZCwgImhhbGZ0b25lIG9yIGRpdGhlcmVkIHNjYW5cbiIpOworCQkJYnJlYWs7CisJCWNhc2UgVEhSRVNISE9MRF9FUlJPUkRJRkZVU0U6CisJCQlmcHJpbnRmKGZkLCAiZXJyb3IgZGlmZnVzZWRcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKGZkLCAiJXUgKDB4JXgpXG4iLAorCQkJICAgIHRkLT50ZF90aHJlc2hob2xkaW5nLCB0ZC0+dGRfdGhyZXNoaG9sZGluZyk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9GSUxMT1JERVIpKSB7CisJCWZwcmludGYoZmQsICIgIEZpbGxPcmRlcjogIik7CisJCXN3aXRjaCAodGQtPnRkX2ZpbGxvcmRlcikgeworCQljYXNlIEZJTExPUkRFUl9NU0IyTFNCOgorCQkJZnByaW50ZihmZCwgIm1zYi10by1sc2JcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgRklMTE9SREVSX0xTQjJNU0I6CisJCQlmcHJpbnRmKGZkLCAibHNiLXRvLW1zYlxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZwcmludGYoZmQsICIldSAoMHgleClcbiIsCisJCQkgICAgdGQtPnRkX2ZpbGxvcmRlciwgdGQtPnRkX2ZpbGxvcmRlcik7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9ZQ0JDUlNVQlNBTVBMSU5HKSkKKyAgICAgICAgeworCQlmcHJpbnRmKGZkLCAiICBZQ2JDciBTdWJzYW1wbGluZzogJXUsICV1XG4iLAorCQkJdGQtPnRkX3ljYmNyc3Vic2FtcGxpbmdbMF0sIHRkLT50ZF95Y2JjcnN1YnNhbXBsaW5nWzFdICk7CisJfQorCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1lDQkNSUE9TSVRJT05JTkcpKSB7CisJCWZwcmludGYoZmQsICIgIFlDYkNyIFBvc2l0aW9uaW5nOiAiKTsKKwkJc3dpdGNoICh0ZC0+dGRfeWNiY3Jwb3NpdGlvbmluZykgeworCQljYXNlIFlDQkNSUE9TSVRJT05fQ0VOVEVSRUQ6CisJCQlmcHJpbnRmKGZkLCAiY2VudGVyZWRcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgWUNCQ1JQT1NJVElPTl9DT1NJVEVEOgorCQkJZnByaW50ZihmZCwgImNvc2l0ZWRcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKGZkLCAiJXUgKDB4JXgpXG4iLAorCQkJICAgIHRkLT50ZF95Y2JjcnBvc2l0aW9uaW5nLCB0ZC0+dGRfeWNiY3Jwb3NpdGlvbmluZyk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9IQUxGVE9ORUhJTlRTKSkKKwkJZnByaW50ZihmZCwgIiAgSGFsZnRvbmUgSGludHM6IGxpZ2h0ICV1IGRhcmsgJXVcbiIsCisJCSAgICB0ZC0+dGRfaGFsZnRvbmVoaW50c1swXSwgdGQtPnRkX2hhbGZ0b25laGludHNbMV0pOworCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX09SSUVOVEFUSU9OKSkgeworCQlmcHJpbnRmKGZkLCAiICBPcmllbnRhdGlvbjogIik7CisJCWlmICh0ZC0+dGRfb3JpZW50YXRpb24gPCBOT1JJRU5UTkFNRVMpCisJCQlmcHJpbnRmKGZkLCAiJXNcbiIsIG9yaWVudE5hbWVzW3RkLT50ZF9vcmllbnRhdGlvbl0pOworCQllbHNlCisJCQlmcHJpbnRmKGZkLCAiJXUgKDB4JXgpXG4iLAorCQkJICAgIHRkLT50ZF9vcmllbnRhdGlvbiwgdGQtPnRkX29yaWVudGF0aW9uKTsKKwl9CisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfU0FNUExFU1BFUlBJWEVMKSkKKwkJZnByaW50ZihmZCwgIiAgU2FtcGxlcy9QaXhlbDogJXVcbiIsIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwpOworCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1JPV1NQRVJTVFJJUCkpIHsKKwkJZnByaW50ZihmZCwgIiAgUm93cy9TdHJpcDogIik7CisJCWlmICh0ZC0+dGRfcm93c3BlcnN0cmlwID09ICh1aW50MzIpIC0xKQorCQkJZnByaW50ZihmZCwgIihpbmZpbml0ZSlcbiIpOworCQllbHNlCisJCQlmcHJpbnRmKGZkLCAiJWx1XG4iLCAodW5zaWduZWQgbG9uZykgdGQtPnRkX3Jvd3NwZXJzdHJpcCk7CisJfQorCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX01JTlNBTVBMRVZBTFVFKSkKKwkJZnByaW50ZihmZCwgIiAgTWluIFNhbXBsZSBWYWx1ZTogJXVcbiIsIHRkLT50ZF9taW5zYW1wbGV2YWx1ZSk7CisJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfTUFYU0FNUExFVkFMVUUpKQorCQlmcHJpbnRmKGZkLCAiICBNYXggU2FtcGxlIFZhbHVlOiAldVxuIiwgdGQtPnRkX21heHNhbXBsZXZhbHVlKTsKKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9TTUlOU0FNUExFVkFMVUUpKSB7CisJCWludCBjb3VudCA9ICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfUEVSU0FNUExFKSA/IHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwgOiAxOworCQlmcHJpbnRmKGZkLCAiICBTTWluIFNhbXBsZSBWYWx1ZToiKTsKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCisJCQlmcHJpbnRmKGZkLCAiICVnIiwgdGQtPnRkX3NtaW5zYW1wbGV2YWx1ZVtpXSk7CisJCWZwcmludGYoZmQsICJcbiIpOworCX0KKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9TTUFYU0FNUExFVkFMVUUpKSB7CisJCWludCBjb3VudCA9ICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfUEVSU0FNUExFKSA/IHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwgOiAxOworCQlmcHJpbnRmKGZkLCAiICBTTWF4IFNhbXBsZSBWYWx1ZToiKTsKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCisJCQlmcHJpbnRmKGZkLCAiICVnIiwgdGQtPnRkX3NtYXhzYW1wbGV2YWx1ZVtpXSk7CisJCWZwcmludGYoZmQsICJcbiIpOworCX0KKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9QTEFOQVJDT05GSUcpKSB7CisJCWZwcmludGYoZmQsICIgIFBsYW5hciBDb25maWd1cmF0aW9uOiAiKTsKKwkJc3dpdGNoICh0ZC0+dGRfcGxhbmFyY29uZmlnKSB7CisJCWNhc2UgUExBTkFSQ09ORklHX0NPTlRJRzoKKwkJCWZwcmludGYoZmQsICJzaW5nbGUgaW1hZ2UgcGxhbmVcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgUExBTkFSQ09ORklHX1NFUEFSQVRFOgorCQkJZnByaW50ZihmZCwgInNlcGFyYXRlIGltYWdlIHBsYW5lc1xuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZwcmludGYoZmQsICIldSAoMHgleClcbiIsCisJCQkgICAgdGQtPnRkX3BsYW5hcmNvbmZpZywgdGQtPnRkX3BsYW5hcmNvbmZpZyk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9QQUdFTlVNQkVSKSkKKwkJZnByaW50ZihmZCwgIiAgUGFnZSBOdW1iZXI6ICV1LSV1XG4iLAorCQkgICAgdGQtPnRkX3BhZ2VudW1iZXJbMF0sIHRkLT50ZF9wYWdlbnVtYmVyWzFdKTsKKwlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9DT0xPUk1BUCkpIHsKKwkJZnByaW50ZihmZCwgIiAgQ29sb3IgTWFwOiAiKTsKKwkJaWYgKGZsYWdzICYgVElGRlBSSU5UX0NPTE9STUFQKSB7CisJCQlmcHJpbnRmKGZkLCAiXG4iKTsKKwkJCW4gPSAxTDw8dGQtPnRkX2JpdHNwZXJzYW1wbGU7CisJCQlmb3IgKGwgPSAwOyBsIDwgbjsgbCsrKQorCQkJCWZwcmludGYoZmQsICIgICAlNWx1OiAlNXUgJTV1ICU1dVxuIiwKKwkJCQkgICAgbCwKKwkJCQkgICAgdGQtPnRkX2NvbG9ybWFwWzBdW2xdLAorCQkJCSAgICB0ZC0+dGRfY29sb3JtYXBbMV1bbF0sCisJCQkJICAgIHRkLT50ZF9jb2xvcm1hcFsyXVtsXSk7CisJCX0gZWxzZQorCQkJZnByaW50ZihmZCwgIihwcmVzZW50KVxuIik7CisJfQorCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1JFRkJMQUNLV0hJVEUpKSB7CisJCWZwcmludGYoZmQsICIgIFJlZmVyZW5jZSBCbGFjay9XaGl0ZTpcbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQlmcHJpbnRmKGZkLCAiICAgICUyZDogJTVnICU1Z1xuIiwgaSwKKwkJCXRkLT50ZF9yZWZibGFja3doaXRlWzIqaSswXSwKKwkJCXRkLT50ZF9yZWZibGFja3doaXRlWzIqaSsxXSk7CisJfQorCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX1RSQU5TRkVSRlVOQ1RJT04pKSB7CisJCWZwcmludGYoZmQsICIgIFRyYW5zZmVyIEZ1bmN0aW9uOiAiKTsKKwkJaWYgKGZsYWdzICYgVElGRlBSSU5UX0NVUlZFUykgeworCQkJZnByaW50ZihmZCwgIlxuIik7CisJCQluID0gMUw8PHRkLT50ZF9iaXRzcGVyc2FtcGxlOworCQkJZm9yIChsID0gMDsgbCA8IG47IGwrKykgeworCQkJCWZwcmludGYoZmQsICIgICAgJTJsdTogJTV1IiwKKwkJCQkgICAgbCwgdGQtPnRkX3RyYW5zZmVyZnVuY3Rpb25bMF1bbF0pOworCQkJCWZvciAoaSA9IDE7IGkgPCB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsOyBpKyspCisJCQkJCWZwcmludGYoZmQsICIgJTV1IiwKKwkJCQkJICAgIHRkLT50ZF90cmFuc2ZlcmZ1bmN0aW9uW2ldW2xdKTsKKwkJCQlmcHV0YygnXG4nLCBmZCk7CisJCQl9CisJCX0gZWxzZQorCQkJZnByaW50ZihmZCwgIihwcmVzZW50KVxuIik7CisJfQorCWlmIChUSUZGRmllbGRTZXQodGlmLCBGSUVMRF9TVUJJRkQpICYmICh0ZC0+dGRfc3ViaWZkKSkgeworCQlmcHJpbnRmKGZkLCAiICBTdWJJRkQgT2Zmc2V0czoiKTsKKwkJZm9yIChpID0gMDsgaSA8IHRkLT50ZF9uc3ViaWZkOyBpKyspCisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkKKwkJCWZwcmludGYoZmQsICIgJTVJNjR1IiwKKwkJCQkodW5zaWduZWQgX19pbnQ2NCkgdGQtPnRkX3N1YmlmZFtpXSk7CisjZWxzZQorCQkJZnByaW50ZihmZCwgIiAlNWxsdSIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgdGQtPnRkX3N1YmlmZFtpXSk7CisjZW5kaWYKKwkJZnB1dGMoJ1xuJywgZmQpOworCX0KKworCS8qCisJKiogQ3VzdG9tIHRhZyBzdXBwb3J0LgorCSovCisJeworCQlpbnQgIGk7CisJCXNob3J0IGNvdW50OworCisJCWNvdW50ID0gKHNob3J0KSBUSUZGR2V0VGFnTGlzdENvdW50KHRpZik7CisJCWZvcihpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCXVpbnQzMiB0YWcgPSBUSUZGR2V0VGFnTGlzdEVudHJ5KHRpZiwgaSk7CisJCQljb25zdCBUSUZGRmllbGQgKmZpcDsKKwkJCXVpbnQzMiB2YWx1ZV9jb3VudDsKKwkJCWludCBtZW1fYWxsb2MgPSAwOworCQkJdm9pZCAqcmF3X2RhdGE7CisKKwkJCWZpcCA9IFRJRkZGaWVsZFdpdGhUYWcodGlmLCB0YWcpOworCQkJaWYoZmlwID09IE5VTEwpCisJCQkJY29udGludWU7CisKKwkJCWlmKGZpcC0+ZmllbGRfcGFzc2NvdW50KSB7CisJCQkJaWYgKGZpcC0+ZmllbGRfcmVhZGNvdW50ID09IFRJRkZfVkFSSUFCTEUyICkgeworCQkJCQlpZihUSUZGR2V0RmllbGQodGlmLCB0YWcsICZ2YWx1ZV9jb3VudCwgJnJhd19kYXRhKSAhPSAxKQorCQkJCQkJY29udGludWU7CisJCQkJfSBlbHNlIGlmIChmaXAtPmZpZWxkX3JlYWRjb3VudCA9PSBUSUZGX1ZBUklBQkxFICkgeworCQkJCQl1aW50MTYgc21hbGxfdmFsdWVfY291bnQ7CisJCQkJCWlmKFRJRkZHZXRGaWVsZCh0aWYsIHRhZywgJnNtYWxsX3ZhbHVlX2NvdW50LCAmcmF3X2RhdGEpICE9IDEpCisJCQkJCQljb250aW51ZTsKKwkJCQkJdmFsdWVfY291bnQgPSBzbWFsbF92YWx1ZV9jb3VudDsKKwkJCQl9IGVsc2UgeworCQkJCQlhc3NlcnQgKGZpcC0+ZmllbGRfcmVhZGNvdW50ID09IFRJRkZfVkFSSUFCTEUKKwkJCQkJCXx8IGZpcC0+ZmllbGRfcmVhZGNvdW50ID09IFRJRkZfVkFSSUFCTEUyKTsKKwkJCQkJY29udGludWU7CisJCQkJfSAKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGZpcC0+ZmllbGRfcmVhZGNvdW50ID09IFRJRkZfVkFSSUFCTEUKKwkJCQkgICAgfHwgZmlwLT5maWVsZF9yZWFkY291bnQgPT0gVElGRl9WQVJJQUJMRTIpCisJCQkJCXZhbHVlX2NvdW50ID0gMTsKKwkJCQllbHNlIGlmIChmaXAtPmZpZWxkX3JlYWRjb3VudCA9PSBUSUZGX1NQUCkKKwkJCQkJdmFsdWVfY291bnQgPSB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsOworCQkJCWVsc2UKKwkJCQkJdmFsdWVfY291bnQgPSBmaXAtPmZpZWxkX3JlYWRjb3VudDsKKwkJCQlpZiAoZmlwLT5maWVsZF90YWcgPT0gVElGRlRBR19ET1RSQU5HRQorCQkJCSAgICAmJiBzdHJjbXAoZmlwLT5maWVsZF9uYW1lLCJEb3RSYW5nZSIpID09IDApIHsKKwkJCQkJLyogVE9ETzogVGhpcyBpcyBhbiBldmlsIGV4Y2VwdGlvbiBhbmQgc2hvdWxkIG5vdCBoYXZlIGJlZW4KKwkJCQkJICAgaGFuZGxlZCB0aGlzIHdheSAuLi4gbGlrZWx5IGJlc3QgaWYgd2UgbW92ZSBpdCBpbnRvCisJCQkJCSAgIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIHdpdGggYW4gZXhwbGljaXQgZmllbGQgaW4gCisJCQkJCSAgIGxpYnRpZmYgNC4xIGFuZCBhc3NpZ24gaXQgYSBGSUVMRF8gdmFsdWUgKi8KKwkJCQkJc3RhdGljIHVpbnQxNiBkb3RyYW5nZVsyXTsKKwkJCQkJcmF3X2RhdGEgPSBkb3RyYW5nZTsKKwkJCQkJVElGRkdldEZpZWxkKHRpZiwgdGFnLCBkb3RyYW5nZSswLCBkb3RyYW5nZSsxKTsKKwkJCQl9IGVsc2UgaWYgKGZpcC0+ZmllbGRfdHlwZSA9PSBUSUZGX0FTQ0lJCisJCQkJCSAgIHx8IGZpcC0+ZmllbGRfcmVhZGNvdW50ID09IFRJRkZfVkFSSUFCTEUKKwkJCQkJICAgfHwgZmlwLT5maWVsZF9yZWFkY291bnQgPT0gVElGRl9WQVJJQUJMRTIKKwkJCQkJICAgfHwgZmlwLT5maWVsZF9yZWFkY291bnQgPT0gVElGRl9TUFAKKwkJCQkJICAgfHwgdmFsdWVfY291bnQgPiAxKSB7CisJCQkJCWlmKFRJRkZHZXRGaWVsZCh0aWYsIHRhZywgJnJhd19kYXRhKSAhPSAxKQorCQkJCQkJY29udGludWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmF3X2RhdGEgPSBfVElGRm1hbGxvYygKKwkJCQkJICAgIF9USUZGRGF0YVNpemUoZmlwLT5maWVsZF90eXBlKQorCQkJCQkgICAgKiB2YWx1ZV9jb3VudCk7CisJCQkJCW1lbV9hbGxvYyA9IDE7CisJCQkJCWlmKFRJRkZHZXRGaWVsZCh0aWYsIHRhZywgcmF3X2RhdGEpICE9IDEpIHsKKwkJCQkJCV9USUZGZnJlZShyYXdfZGF0YSk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJLyoKKwkJCSAqIENhdGNoIHRoZSB0YWdzIHdoaWNoIG5lZWRzIHRvIGJlIHNwZWNpYWxseSBoYW5kbGVkCisJCQkgKiBhbmQgcHJldHR5IHByaW50IHRoZW0uIElmIHRhZyBub3QgaGFuZGxlZCBpbgorCQkJICogX1RJRkZQcmV0dHlQcmludEZpZWxkKCkgZmFsbCBkb3duIGFuZCBwcmludCBpdCBhcworCQkJICogYW55IG90aGVyIHRhZy4KKwkJCSAqLworCQkJaWYgKCFfVElGRlByZXR0eVByaW50RmllbGQodGlmLCBmaXAsIGZkLCB0YWcsIHZhbHVlX2NvdW50LCByYXdfZGF0YSkpCisJCQkJX1RJRkZQcmludEZpZWxkKGZkLCBmaXAsIHZhbHVlX2NvdW50LCByYXdfZGF0YSk7CisKKwkJCWlmKG1lbV9hbGxvYykKKwkJCQlfVElGRmZyZWUocmF3X2RhdGEpOworCQl9CisJfQorICAgICAgICAKKwlpZiAodGlmLT50aWZfdGFnbWV0aG9kcy5wcmludGRpcikKKwkJKCp0aWYtPnRpZl90YWdtZXRob2RzLnByaW50ZGlyKSh0aWYsIGZkLCBmbGFncyk7CisKKyAgICAgICAgX1RJRkZGaWxsU3RyaWxlcyggdGlmICk7CisgICAgICAgIAorCWlmICgoZmxhZ3MgJiBUSUZGUFJJTlRfU1RSSVBTKSAmJgorCSAgICBUSUZGRmllbGRTZXQodGlmLEZJRUxEX1NUUklQT0ZGU0VUUykpIHsKKwkJdWludDMyIHM7CisKKwkJZnByaW50ZihmZCwgIiAgJWx1ICVzOlxuIiwKKwkJICAgIChsb25nKSB0ZC0+dGRfbnN0cmlwcywKKwkJICAgIGlzVGlsZWQodGlmKSA/ICJUaWxlcyIgOiAiU3RyaXBzIik7CisJCWZvciAocyA9IDA7IHMgPCB0ZC0+dGRfbnN0cmlwczsgcysrKQorI2lmIGRlZmluZWQoX19XSU4zMl9fKSAmJiAoZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykpCisJCQlmcHJpbnRmKGZkLCAiICAgICUzbHU6IFslOEk2NHUsICU4STY0dV1cbiIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpIHMsCisJCQkgICAgKHVuc2lnbmVkIF9faW50NjQpIHRkLT50ZF9zdHJpcG9mZnNldFtzXSwKKwkJCSAgICAodW5zaWduZWQgX19pbnQ2NCkgdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3NdKTsKKyNlbHNlCisJCQlmcHJpbnRmKGZkLCAiICAgICUzbHU6IFslOGxsdSwgJThsbHVdXG4iLAorCQkJICAgICh1bnNpZ25lZCBsb25nKSBzLAorCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHRkLT50ZF9zdHJpcG9mZnNldFtzXSwKKwkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKSB0ZC0+dGRfc3RyaXBieXRlY291bnRbc10pOworI2VuZGlmCisJfQorfQorCit2b2lkCitfVElGRnByaW50QXNjaWkoRklMRSogZmQsIGNvbnN0IGNoYXIqIGNwKQoreworCV9USUZGcHJpbnRBc2NpaUJvdW5kZWQoIGZkLCBjcCwgc3RybGVuKGNwKSk7Cit9CisKK3N0YXRpYyB2b2lkCitfVElGRnByaW50QXNjaWlCb3VuZGVkKEZJTEUqIGZkLCBjb25zdCBjaGFyKiBjcCwgc2l6ZV90IG1heF9jaGFycykKK3sKKwlmb3IgKDsgbWF4X2NoYXJzID4gMCAmJiAqY3AgIT0gJ1wwJzsgY3ArKywgbWF4X2NoYXJzLS0pIHsKKwkJY29uc3QgY2hhciogdHA7CisKKwkJaWYgKGlzcHJpbnQoKGludCkqY3ApKSB7CisJCQlmcHV0YygqY3AsIGZkKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZvciAodHAgPSAiXHR0XGJiXHJyXG5uXHZ2IjsgKnRwOyB0cCsrKQorCQkJaWYgKCp0cCsrID09ICpjcCkKKwkJCQlicmVhazsKKwkJaWYgKCp0cCkKKwkJCWZwcmludGYoZmQsICJcXCVjIiwgKnRwKTsKKwkJZWxzZQorCQkJZnByaW50ZihmZCwgIlxcJTAzbyIsICpjcCAmIDB4ZmYpOworCX0KK30KKwordm9pZAorX1RJRkZwcmludEFzY2lpVGFnKEZJTEUqIGZkLCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSkKK3sKKwlmcHJpbnRmKGZkLCAiICAlczogXCIiLCBuYW1lKTsKKwlfVElGRnByaW50QXNjaWkoZmQsIHZhbHVlKTsKKwlmcHJpbnRmKGZkLCAiXCJcbiIpOworfQorCisvKiB2aW06IHNldCB0cz04IHN0cz04IHN3PTggbm9ldDogKi8KKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBjCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogZmlsbC1jb2x1bW46IDc4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3JlYWQuYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3JlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2I0MTliCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcmVhZC5jCkBAIC0wLDAgKzEsMTA5NCBAQAorLyogJElkOiB0aWZfcmVhZC5jLHYgMS40NSAyMDE1LTA2LTA3IDIyOjM1OjQwIGJmcmllc2VuIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVElGRiBMaWJyYXJ5LgorICogU2NhbmxpbmUtb3JpZW50ZWQgUmVhZCBTdXBwb3J0CisgKi8KKyNpbmNsdWRlICJ0aWZmaW9wLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IFRJRkZGaWxsU3RyaXAoVElGRiogdGlmLCB1aW50MzIgc3RyaXApOworaW50IFRJRkZGaWxsVGlsZShUSUZGKiB0aWYsIHVpbnQzMiB0aWxlKTsKK3N0YXRpYyBpbnQgVElGRlN0YXJ0U3RyaXAoVElGRiogdGlmLCB1aW50MzIgc3RyaXApOworc3RhdGljIGludCBUSUZGU3RhcnRUaWxlKFRJRkYqIHRpZiwgdWludDMyIHRpbGUpOworc3RhdGljIGludCBUSUZGQ2hlY2tSZWFkKFRJRkYqLCBpbnQpOworc3RhdGljIHRtc2l6ZV90CitUSUZGUmVhZFJhd1N0cmlwMShUSUZGKiB0aWYsIHVpbnQzMiBzdHJpcCwgdm9pZCogYnVmLCB0bXNpemVfdCBzaXplLGNvbnN0IGNoYXIqIG1vZHVsZSk7CisKKyNkZWZpbmUgTk9TVFJJUCAoKHVpbnQzMikoLTEpKSAgICAgICAvKiB1bmRlZmluZWQgc3RhdGUgKi8KKyNkZWZpbmUgTk9USUxFICgodWludDMyKSgtMSkpICAgICAgICAgLyogdW5kZWZpbmVkIHN0YXRlICovCisKK3N0YXRpYyBpbnQKK1RJRkZGaWxsU3RyaXBQYXJ0aWFsKCBUSUZGICp0aWYsIGludCBzdHJpcCwgdG1zaXplX3QgcmVhZF9haGVhZCwgaW50IHJlc3RhcnQgKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZGaWxsU3RyaXBQYXJ0aWFsIjsKKwlyZWdpc3RlciBUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisgICAgICAgIHRtc2l6ZV90IHVudXNlZF9kYXRhOworICAgICAgICB1aW50NjQgcmVhZF9vZmZzZXQ7CisgICAgICAgIHRtc2l6ZV90IGNjLCB0b19yZWFkOworICAgICAgICAvKiB0bXNpemVfdCBieXRlY291bnRtOyAqLworICAgICAgICAKKyAgICAgICAgaWYgKCFfVElGRkZpbGxTdHJpbGVzKCB0aWYgKSB8fCAhdGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIAorICAgICAgICAvKgorICAgICAgICAgKiBFeHBhbmQgcmF3IGRhdGEgYnVmZmVyLCBpZiBuZWVkZWQsIHRvIGhvbGQgZGF0YQorICAgICAgICAgKiBzdHJpcCBjb21pbmcgZnJvbSBmaWxlIChwZXJoYXBzIHNob3VsZCBzZXQgdXBwZXIKKyAgICAgICAgICogYm91bmQgb24gdGhlIHNpemUgb2YgYSBidWZmZXIgd2UnbGwgdXNlPykuCisgICAgICAgICAqLworCisgICAgICAgIC8qIGJ5dGVjb3VudG09KHRtc2l6ZV90KSB0ZC0+dGRfc3RyaXBieXRlY291bnRbc3RyaXBdOyAqLworICAgICAgICBpZiAocmVhZF9haGVhZCoyID4gdGlmLT50aWZfcmF3ZGF0YXNpemUpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIHJlc3RhcnQgKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB0aWYtPnRpZl9jdXJzdHJpcCA9IE5PU1RSSVA7CisgICAgICAgICAgICAgICAgaWYgKCh0aWYtPnRpZl9mbGFncyAmIFRJRkZfTVlCVUZGRVIpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGEgYnVmZmVyIHRvbyBzbWFsbCB0byBob2xkIHBhcnQgb2Ygc3RyaXAgJWx1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgc3RyaXApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFUSUZGUmVhZEJ1ZmZlclNldHVwKHRpZiwgMCwgcmVhZF9haGVhZCoyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIH0KKworICAgICAgICBpZiggcmVzdGFydCApCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aWYtPnRpZl9yYXdkYXRhbG9hZGVkID0gMDsKKyAgICAgICAgICAgICAgICB0aWYtPnRpZl9yYXdkYXRhb2ZmID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICoqIElmIHdlIGFyZSByZWFkaW5nIG1vcmUgZGF0YSwgbW92ZSBhbnkgdW51c2VkIGRhdGEgdG8gdGhlCisgICAgICAgICoqIHN0YXJ0IG9mIHRoZSBidWZmZXIuCisgICAgICAgICovCisgICAgICAgIGlmKCB0aWYtPnRpZl9yYXdkYXRhbG9hZGVkID4gMCApCisgICAgICAgICAgICAgICAgdW51c2VkX2RhdGEgPSB0aWYtPnRpZl9yYXdkYXRhbG9hZGVkIC0gKHRpZi0+dGlmX3Jhd2NwIC0gdGlmLT50aWZfcmF3ZGF0YSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB1bnVzZWRfZGF0YSA9IDA7CisgICAgICAgIAorICAgICAgICBpZiggdW51c2VkX2RhdGEgPiAwICkKKyAgICAgICAgeworCQlhc3NlcnQoKHRpZi0+dGlmX2ZsYWdzJlRJRkZfQlVGRkVSTU1BUCk9PTApOworICAgICAgICAgICAgICAgIG1lbW1vdmUoIHRpZi0+dGlmX3Jhd2RhdGEsIHRpZi0+dGlmX3Jhd2NwLCB1bnVzZWRfZGF0YSApOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgKiogU2VlayB0byB0aGUgcG9pbnQgaW4gdGhlIGZpbGUgd2hlcmUgbW9yZSBkYXRhIHNob3VsZCBiZSByZWFkLgorICAgICAgICAqLworICAgICAgICByZWFkX29mZnNldCA9IHRkLT50ZF9zdHJpcG9mZnNldFtzdHJpcF0KKyAgICAgICAgICAgICAgICArIHRpZi0+dGlmX3Jhd2RhdGFvZmYgKyB0aWYtPnRpZl9yYXdkYXRhbG9hZGVkOworCisgICAgICAgIGlmICghU2Vla09LKHRpZiwgcmVhZF9vZmZzZXQpKSB7CisgICAgICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlZWsgZXJyb3IgYXQgc2NhbmxpbmUgJWx1LCBzdHJpcCAlbHUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgdGlmLT50aWZfcm93LCAodW5zaWduZWQgbG9uZykgc3RyaXApOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgKiogSG93IG11Y2ggZG8gd2Ugd2FudCB0byByZWFkPworICAgICAgICAqLworICAgICAgICB0b19yZWFkID0gdGlmLT50aWZfcmF3ZGF0YXNpemUgLSB1bnVzZWRfZGF0YTsKKyAgICAgICAgaWYoICh1aW50NjQpIHRvX3JlYWQgPiB0ZC0+dGRfc3RyaXBieXRlY291bnRbc3RyaXBdIAorICAgICAgICAgICAgLSB0aWYtPnRpZl9yYXdkYXRhb2ZmIC0gdGlmLT50aWZfcmF3ZGF0YWxvYWRlZCApCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0b19yZWFkID0gKHRtc2l6ZV90KSB0ZC0+dGRfc3RyaXBieXRlY291bnRbc3RyaXBdCisgICAgICAgICAgICAgICAgICAgICAgICAtIHRpZi0+dGlmX3Jhd2RhdGFvZmYgLSB0aWYtPnRpZl9yYXdkYXRhbG9hZGVkOworICAgICAgICB9CisKKwlhc3NlcnQoKHRpZi0+dGlmX2ZsYWdzJlRJRkZfQlVGRkVSTU1BUCk9PTApOworICAgICAgICBjYyA9IFRJRkZSZWFkRmlsZSh0aWYsIHRpZi0+dGlmX3Jhd2RhdGEgKyB1bnVzZWRfZGF0YSwgdG9fcmVhZCk7CisKKyAgICAgICAgaWYgKGNjICE9IHRvX3JlYWQpIHsKKyNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgKGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKQorICAgICAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWFkIGVycm9yIGF0IHNjYW5saW5lICVsdTsgZ290ICVJNjR1IGJ5dGVzLCBleHBlY3RlZCAlSTY0dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBfX2ludDY0KSBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIF9faW50NjQpIHRvX3JlYWQpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVhZCBlcnJvciBhdCBzY2FubGluZSAlbHU7IGdvdCAlbGx1IGJ5dGVzLCBleHBlY3RlZCAlbGx1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHRvX3JlYWQpOworI2VuZGlmCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRpZi0+dGlmX3Jhd2RhdGFvZmYgPSB0aWYtPnRpZl9yYXdkYXRhb2ZmICsgdGlmLT50aWZfcmF3ZGF0YWxvYWRlZCAtIHVudXNlZF9kYXRhIDsKKyAgICAgICAgdGlmLT50aWZfcmF3ZGF0YWxvYWRlZCA9IHVudXNlZF9kYXRhICsgdG9fcmVhZDsKKworICAgICAgICB0aWYtPnRpZl9yYXdjcCA9IHRpZi0+dGlmX3Jhd2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgaWYgKCFpc0ZpbGxPcmRlcih0aWYsIHRkLT50ZF9maWxsb3JkZXIpICYmCisgICAgICAgICAgICAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX05PQklUUkVWKSA9PSAwKSB7CisJCWFzc2VydCgodGlmLT50aWZfZmxhZ3MmVElGRl9CVUZGRVJNTUFQKT09MCk7CisgICAgICAgICAgICAgICAgVElGRlJldmVyc2VCaXRzKHRpZi0+dGlmX3Jhd2RhdGEgKyB1bnVzZWRfZGF0YSwgdG9fcmVhZCApOworCX0KKworICAgICAgICAvKgorICAgICAgICAqKiBXaGVuIHN0YXJ0aW5nIGEgc3RyaXAgZnJvbSB0aGUgYmVnaW5uaW5nIHdlIG5lZWQgdG8KKyAgICAgICAgKiogcmVzdGFydCB0aGUgZGVjb2Rlci4KKyAgICAgICAgKi8KKyAgICAgICAgaWYoIHJlc3RhcnQgKQorICAgICAgICAgICAgICAgIHJldHVybiBUSUZGU3RhcnRTdHJpcCh0aWYsIHN0cmlwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAxOworfQorCisvKgorICogU2VlayB0byBhIHJhbmRvbSByb3crc2FtcGxlIGluIGEgZmlsZS4KKyAqCisgKiBPbmx5IHVzZWQgYnkgVElGRlJlYWRTY2FubGluZSwgYW5kIGlzIG9ubHkgdXNlZCBvbgorICogc3RyaXAgb3JnYW5pemVkIGZpbGVzLiAgV2UgZG8gc29tZSB0cmlja3kgc3R1ZmYgdG8gdHJ5CisgKiBhbmQgYXZvaWQgcmVhZGluZyB0aGUgd2hvbGUgY29tcHJlc3NlZCByYXcgZGF0YSBmb3IgYmlnCisgKiBzdHJpcHMuCisgKi8KK3N0YXRpYyBpbnQKK1RJRkZTZWVrKFRJRkYqIHRpZiwgdWludDMyIHJvdywgdWludDE2IHNhbXBsZSApCit7CisJcmVnaXN0ZXIgVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCXVpbnQzMiBzdHJpcDsKKyAgICAgICAgaW50ICAgIHdob2xlX3N0cmlwOworCXRtc2l6ZV90IHJlYWRfYWhlYWQgPSAwOworCisgICAgICAgIC8qCisgICAgICAgICoqIEVzdGFibGlzaCB3aGF0IHN0cmlwIHdlIGFyZSB3b3JraW5nIGZyb20uCisgICAgICAgICovCisJaWYgKHJvdyA+PSB0ZC0+dGRfaW1hZ2VsZW5ndGgpIHsJLyogb3V0IG9mIHJhbmdlICovCisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCB0aWYtPnRpZl9uYW1lLAorCQkgICAgIiVsdTogUm93IG91dCBvZiByYW5nZSwgbWF4ICVsdSIsCisJCSAgICAodW5zaWduZWQgbG9uZykgcm93LAorCQkgICAgKHVuc2lnbmVkIGxvbmcpIHRkLT50ZF9pbWFnZWxlbmd0aCk7CisJCXJldHVybiAoMCk7CisJfQorCWlmICh0ZC0+dGRfcGxhbmFyY29uZmlnID09IFBMQU5BUkNPTkZJR19TRVBBUkFURSkgeworCQlpZiAoc2FtcGxlID49IHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwpIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCB0aWYtPnRpZl9uYW1lLAorCQkJICAgICIlbHU6IFNhbXBsZSBvdXQgb2YgcmFuZ2UsIG1heCAlbHUiLAorCQkJICAgICh1bnNpZ25lZCBsb25nKSBzYW1wbGUsICh1bnNpZ25lZCBsb25nKSB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJc3RyaXAgPSAodWludDMyKXNhbXBsZSp0ZC0+dGRfc3RyaXBzcGVyaW1hZ2UgKyByb3cvdGQtPnRkX3Jvd3NwZXJzdHJpcDsKKwl9IGVsc2UKKwkJc3RyaXAgPSByb3cgLyB0ZC0+dGRfcm93c3BlcnN0cmlwOworCisgICAgICAgIC8qCisgICAgICAgICAqIERvIHdlIHdhbnQgdG8gdHJlYXQgdGhpcyBzdHJpcCBhcyBvbmUgd2hvbGUgY2h1bmsgb3IKKyAgICAgICAgICogcmVhZCBpdCBhIGZldyBsaW5lcyBhdCBhIHRpbWU/CisgICAgICAgICAqLworI2lmIGRlZmluZWQoQ0hVTktZX1NUUklQX1JFQURfU1VQUE9SVCkKKyAgICAgICAgaWYgKCFfVElGRkZpbGxTdHJpbGVzKCB0aWYgKSB8fCAhdGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHdob2xlX3N0cmlwID0gdGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50W3N0cmlwXSA8IDEwCisgICAgICAgICAgICAgICAgfHwgaXNNYXBwZWQodGlmKTsKKyNlbHNlCisgICAgICAgIHdob2xlX3N0cmlwID0gMTsKKyNlbmRpZgorICAgICAgICAKKyAgICAgICAgaWYoICF3aG9sZV9zdHJpcCApCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZWFkX2FoZWFkID0gdGlmLT50aWZfc2NhbmxpbmVzaXplICogMTYgKyA1MDAwOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgd2UgaGF2ZW4ndCBsb2FkZWQgdGhpcyBzdHJpcCwgZG8gc28gbm93LCBwb3NzaWJseQorICAgICAgICAgKiBvbmx5IHJlYWRpbmcgdGhlIGZpcnN0IHBhcnQuCisgICAgICAgICAqLworCWlmIChzdHJpcCAhPSB0aWYtPnRpZl9jdXJzdHJpcCkgewkvKiBkaWZmZXJlbnQgc3RyaXAsIHJlZmlsbCAqLworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmKCB3aG9sZV9zdHJpcCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFUSUZGRmlsbFN0cmlwKHRpZiwgc3RyaXApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFUSUZGRmlsbFN0cmlwUGFydGlhbCh0aWYsc3RyaXAscmVhZF9haGVhZCwxKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKwl9CisKKyAgICAgICAgLyoKKyAgICAgICAgKiogSWYgd2UgYWxyZWFkeSBoYXZlIHNvbWUgZGF0YSBsb2FkZWQsIGRvIHdlIG5lZWQgdG8gcmVhZCBzb21lIG1vcmU/CisgICAgICAgICovCisgICAgICAgIGVsc2UgaWYoICF3aG9sZV9zdHJpcCApCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggKCh0aWYtPnRpZl9yYXdkYXRhICsgdGlmLT50aWZfcmF3ZGF0YWxvYWRlZCkgLSB0aWYtPnRpZl9yYXdjcCkgPCByZWFkX2FoZWFkIAorICAgICAgICAgICAgICAgICAgICAmJiAodWludDY0KSB0aWYtPnRpZl9yYXdkYXRhb2ZmK3RpZi0+dGlmX3Jhd2RhdGFsb2FkZWQgPCB0ZC0+dGRfc3RyaXBieXRlY291bnRbc3RyaXBdICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggIVRJRkZGaWxsU3RyaXBQYXJ0aWFsKHRpZixzdHJpcCxyZWFkX2FoZWFkLDApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJvdyA8IHRpZi0+dGlmX3JvdykgeworCQkvKgorCQkgKiBNb3ZpbmcgYmFja3dhcmRzIHdpdGhpbiB0aGUgc2FtZSBzdHJpcDogYmFja3VwCisJCSAqIHRvIHRoZSBzdGFydCBhbmQgdGhlbiBkZWNvZGUgZm9yd2FyZCAoYmVsb3cpLgorCQkgKgorCQkgKiBOQjogSWYgeW91J3JlIHBsYW5uaW5nIG9uIGxvdHMgb2YgcmFuZG9tIGFjY2VzcyB3aXRoaW4gYQorCQkgKiBzdHJpcCwgaXQncyBiZXR0ZXIgdG8ganVzdCByZWFkIGFuZCBkZWNvZGUgdGhlIGVudGlyZQorCQkgKiBzdHJpcCwgYW5kIHRoZW4gYWNjZXNzIHRoZSBkZWNvZGVkIGRhdGEgaW4gYSByYW5kb20gZmFzaGlvbi4KKwkJICovCisKKyAgICAgICAgICAgICAgICBpZiggdGlmLT50aWZfcmF3ZGF0YW9mZiAhPSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggIVRJRkZGaWxsU3RyaXBQYXJ0aWFsKHRpZixzdHJpcCxyZWFkX2FoZWFkLDEpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVRJRkZTdGFydFN0cmlwKHRpZiwgc3RyaXApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICAgICAgICAgIH0KKwl9CisgICAgICAgIAorCWlmIChyb3cgIT0gdGlmLT50aWZfcm93KSB7CisJCS8qCisJCSAqIFNlZWsgZm9yd2FyZCB0byB0aGUgZGVzaXJlZCByb3cuCisJCSAqLworCisgICAgICAgICAgICAgICAgLyogVE9ETzogV2lsbCB0aGlzIHJlYWxseSB3b3JrIHdpdGggcGFydGlhbCBidWZmZXJzPyAqLworICAgICAgICAgICAgICAgIAorCQlpZiAoISgqdGlmLT50aWZfc2VlaykodGlmLCByb3cgLSB0aWYtPnRpZl9yb3cpKQorCQkJcmV0dXJuICgwKTsKKwkJdGlmLT50aWZfcm93ID0gcm93OworCX0KKworCXJldHVybiAoMSk7Cit9CisKK2ludAorVElGRlJlYWRTY2FubGluZShUSUZGKiB0aWYsIHZvaWQqIGJ1ZiwgdWludDMyIHJvdywgdWludDE2IHNhbXBsZSkKK3sKKwlpbnQgZTsKKworCWlmICghVElGRkNoZWNrUmVhZCh0aWYsIDApKQorCQlyZXR1cm4gKC0xKTsKKwlpZiggKGUgPSBUSUZGU2Vlayh0aWYsIHJvdywgc2FtcGxlKSkgIT0gMCkgeworCQkvKgorCQkgKiBEZWNvbXByZXNzIGRlc2lyZWQgcm93IGludG8gdXNlciBidWZmZXIuCisJCSAqLworCQllID0gKCp0aWYtPnRpZl9kZWNvZGVyb3cpCisJCSAgICAodGlmLCAodWludDgqKSBidWYsIHRpZi0+dGlmX3NjYW5saW5lc2l6ZSwgc2FtcGxlKTsgIAorCisJCS8qIHdlIGFyZSBub3cgcG9pc2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgcm93ICovCisJCXRpZi0+dGlmX3JvdyA9IHJvdyArIDE7CisKKwkJaWYgKGUpCisJCQkoKnRpZi0+dGlmX3Bvc3RkZWNvZGUpKHRpZiwgKHVpbnQ4KikgYnVmLAorCQkJICAgIHRpZi0+dGlmX3NjYW5saW5lc2l6ZSk7ICAKKwl9CisJcmV0dXJuIChlID4gMCA/IDEgOiAtMSk7Cit9CisKKy8qCisgKiBSZWFkIGEgc3RyaXAgb2YgZGF0YSBhbmQgZGVjb21wcmVzcyB0aGUgc3BlY2lmaWVkCisgKiBhbW91bnQgaW50byB0aGUgdXNlci1zdXBwbGllZCBidWZmZXIuCisgKi8KK3Rtc2l6ZV90CitUSUZGUmVhZEVuY29kZWRTdHJpcChUSUZGKiB0aWYsIHVpbnQzMiBzdHJpcCwgdm9pZCogYnVmLCB0bXNpemVfdCBzaXplKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZSZWFkRW5jb2RlZFN0cmlwIjsKKwlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisJdWludDMyIHJvd3NwZXJzdHJpcDsKKwl1aW50MzIgc3RyaXBzcGVycGxhbmU7CisJdWludDMyIHN0cmlwaW5wbGFuZTsKKwl1aW50MTYgcGxhbmU7CisJdWludDMyIHJvd3M7CisJdG1zaXplX3Qgc3RyaXBzaXplOworCWlmICghVElGRkNoZWNrUmVhZCh0aWYsMCkpCisJCXJldHVybigodG1zaXplX3QpKC0xKSk7CisJaWYgKHN0cmlwPj10ZC0+dGRfbnN0cmlwcykKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwKKwkJICAgICIlbHU6IFN0cmlwIG91dCBvZiByYW5nZSwgbWF4ICVsdSIsKHVuc2lnbmVkIGxvbmcpc3RyaXAsCisJCSAgICAodW5zaWduZWQgbG9uZyl0ZC0+dGRfbnN0cmlwcyk7CisJCXJldHVybigodG1zaXplX3QpKC0xKSk7CisJfQorCS8qCisJICogQ2FsY3VsYXRlIHRoZSBzdHJpcCBzaXplIGFjY29yZGluZyB0byB0aGUgbnVtYmVyIG9mCisJICogcm93cyBpbiB0aGUgc3RyaXAgKGNoZWNrIGZvciB0cnVuY2F0ZWQgbGFzdCBzdHJpcCBvbiBhbnkKKwkgKiBvZiB0aGUgc2VwYXJhdGlvbnMpLgorCSAqLworCXJvd3NwZXJzdHJpcD10ZC0+dGRfcm93c3BlcnN0cmlwOworCWlmIChyb3dzcGVyc3RyaXA+dGQtPnRkX2ltYWdlbGVuZ3RoKQorCQlyb3dzcGVyc3RyaXA9dGQtPnRkX2ltYWdlbGVuZ3RoOworCXN0cmlwc3BlcnBsYW5lPSgodGQtPnRkX2ltYWdlbGVuZ3RoK3Jvd3NwZXJzdHJpcC0xKS9yb3dzcGVyc3RyaXApOworCXN0cmlwaW5wbGFuZT0oc3RyaXAlc3RyaXBzcGVycGxhbmUpOworCXBsYW5lPShzdHJpcC9zdHJpcHNwZXJwbGFuZSk7CisJcm93cz10ZC0+dGRfaW1hZ2VsZW5ndGgtc3RyaXBpbnBsYW5lKnJvd3NwZXJzdHJpcDsKKwlpZiAocm93cz5yb3dzcGVyc3RyaXApCisJCXJvd3M9cm93c3BlcnN0cmlwOworCXN0cmlwc2l6ZT1USUZGVlN0cmlwU2l6ZSh0aWYscm93cyk7CisJaWYgKHN0cmlwc2l6ZT09MCkKKwkJcmV0dXJuKCh0bXNpemVfdCkoLTEpKTsKKwlpZiAoKHNpemUhPSh0bXNpemVfdCkoLTEpKSYmKHNpemU8c3RyaXBzaXplKSkKKwkJc3RyaXBzaXplPXNpemU7CisJaWYgKCFUSUZGRmlsbFN0cmlwKHRpZixzdHJpcCkpCisJCXJldHVybigodG1zaXplX3QpKC0xKSk7CisJaWYgKCgqdGlmLT50aWZfZGVjb2Rlc3RyaXApKHRpZixidWYsc3RyaXBzaXplLHBsYW5lKTw9MCkKKwkJcmV0dXJuKCh0bXNpemVfdCkoLTEpKTsKKwkoKnRpZi0+dGlmX3Bvc3RkZWNvZGUpKHRpZixidWYsc3RyaXBzaXplKTsKKwlyZXR1cm4oc3RyaXBzaXplKTsKK30KKworc3RhdGljIHRtc2l6ZV90CitUSUZGUmVhZFJhd1N0cmlwMShUSUZGKiB0aWYsIHVpbnQzMiBzdHJpcCwgdm9pZCogYnVmLCB0bXNpemVfdCBzaXplLAorICAgIGNvbnN0IGNoYXIqIG1vZHVsZSkKK3sKKwlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisKKyAgICBpZiAoIV9USUZGRmlsbFN0cmlsZXMoIHRpZiApKQorICAgICAgICByZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKKyAgICAgICAgCisJYXNzZXJ0KCh0aWYtPnRpZl9mbGFncyZUSUZGX05PUkVBRFJBVyk9PTApOworCWlmICghaXNNYXBwZWQodGlmKSkgeworCQl0bXNpemVfdCBjYzsKKworCQlpZiAoIVNlZWtPSyh0aWYsIHRkLT50ZF9zdHJpcG9mZnNldFtzdHJpcF0pKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICJTZWVrIGVycm9yIGF0IHNjYW5saW5lICVsdSwgc3RyaXAgJWx1IiwKKwkJCSAgICAodW5zaWduZWQgbG9uZykgdGlmLT50aWZfcm93LCAodW5zaWduZWQgbG9uZykgc3RyaXApOworCQkJcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisJCX0KKwkJY2MgPSBUSUZGUmVhZEZpbGUodGlmLCBidWYsIHNpemUpOworCQlpZiAoY2MgIT0gc2l6ZSkgeworI2lmIGRlZmluZWQoX19XSU4zMl9fKSAmJiAoZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykpCisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkiUmVhZCBlcnJvciBhdCBzY2FubGluZSAlbHU7IGdvdCAlSTY0dSBieXRlcywgZXhwZWN0ZWQgJUk2NHUiLAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX3JvdywKKwkJCQkgICAgICh1bnNpZ25lZCBfX2ludDY0KSBjYywKKwkJCQkgICAgICh1bnNpZ25lZCBfX2ludDY0KSBzaXplKTsKKyNlbHNlCisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkiUmVhZCBlcnJvciBhdCBzY2FubGluZSAlbHU7IGdvdCAlbGx1IGJ5dGVzLCBleHBlY3RlZCAlbGx1IiwKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3csCisJCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBjYywKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHNpemUpOworI2VuZGlmCisJCQlyZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKKwkJfQorCX0gZWxzZSB7CisJCXRtc2l6ZV90IG1hLG1iOworCQl0bXNpemVfdCBuOworCQltYT0odG1zaXplX3QpdGQtPnRkX3N0cmlwb2Zmc2V0W3N0cmlwXTsKKwkJbWI9bWErc2l6ZTsKKwkJaWYgKCgodWludDY0KW1hIT10ZC0+dGRfc3RyaXBvZmZzZXRbc3RyaXBdKXx8KG1hPnRpZi0+dGlmX3NpemUpKQorCQkJbj0wOworCQllbHNlIGlmICgobWI8bWEpfHwobWI8c2l6ZSl8fChtYj50aWYtPnRpZl9zaXplKSkKKwkJCW49dGlmLT50aWZfc2l6ZS1tYTsKKwkJZWxzZQorCQkJbj1zaXplOworCQlpZiAobiE9c2l6ZSkgeworI2lmIGRlZmluZWQoX19XSU4zMl9fKSAmJiAoZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykpCisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCSJSZWFkIGVycm9yIGF0IHNjYW5saW5lICVsdSwgc3RyaXAgJWx1OyBnb3QgJUk2NHUgYnl0ZXMsIGV4cGVjdGVkICVJNjR1IiwKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3csCisJCQkJICAgICAodW5zaWduZWQgbG9uZykgc3RyaXAsCisJCQkJICAgICAodW5zaWduZWQgX19pbnQ2NCkgbiwKKwkJCQkgICAgICh1bnNpZ25lZCBfX2ludDY0KSBzaXplKTsKKyNlbHNlCisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCSJSZWFkIGVycm9yIGF0IHNjYW5saW5lICVsdSwgc3RyaXAgJWx1OyBnb3QgJWxsdSBieXRlcywgZXhwZWN0ZWQgJWxsdSIsCisJCQkJICAgICAodW5zaWduZWQgbG9uZykgdGlmLT50aWZfcm93LAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHN0cmlwLAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbiwKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHNpemUpOworI2VuZGlmCisJCQlyZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKKwkJfQorCQlfVElGRm1lbWNweShidWYsIHRpZi0+dGlmX2Jhc2UgKyBtYSwKKwkJCSAgICBzaXplKTsKKwl9CisJcmV0dXJuIChzaXplKTsKK30KKworLyoKKyAqIFJlYWQgYSBzdHJpcCBvZiBkYXRhIGZyb20gdGhlIGZpbGUuCisgKi8KK3Rtc2l6ZV90CitUSUZGUmVhZFJhd1N0cmlwKFRJRkYqIHRpZiwgdWludDMyIHN0cmlwLCB2b2lkKiBidWYsIHRtc2l6ZV90IHNpemUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRlJlYWRSYXdTdHJpcCI7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCXVpbnQ2NCBieXRlY291bnQ7CisJdG1zaXplX3QgYnl0ZWNvdW50bTsKKworCWlmICghVElGRkNoZWNrUmVhZCh0aWYsIDApKQorCQlyZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKKwlpZiAoc3RyaXAgPj0gdGQtPnRkX25zdHJpcHMpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJICAgICAiJWx1OiBTdHJpcCBvdXQgb2YgcmFuZ2UsIG1heCAlbHUiLAorCQkgICAgICh1bnNpZ25lZCBsb25nKSBzdHJpcCwKKwkJICAgICAodW5zaWduZWQgbG9uZykgdGQtPnRkX25zdHJpcHMpOworCQlyZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKKwl9CisJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfTk9SRUFEUkFXKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJICAgICJDb21wcmVzc2lvbiBzY2hlbWUgZG9lcyBub3Qgc3VwcG9ydCBhY2Nlc3MgdG8gcmF3IHVuY29tcHJlc3NlZCBkYXRhIik7CisJCXJldHVybiAoKHRtc2l6ZV90KSgtMSkpOworCX0KKwlieXRlY291bnQgPSB0ZC0+dGRfc3RyaXBieXRlY291bnRbc3RyaXBdOworCWlmICgoaW50NjQpYnl0ZWNvdW50IDw9IDApIHsKKyNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgKGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKQorCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICAiJUk2NHU6IEludmFsaWQgc3RyaXAgYnl0ZSBjb3VudCwgc3RyaXAgJWx1IiwKKwkJCSAgICAgKHVuc2lnbmVkIF9faW50NjQpIGJ5dGVjb3VudCwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHN0cmlwKTsKKyNlbHNlCisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgICIlbGx1OiBJbnZhbGlkIHN0cmlwIGJ5dGUgY291bnQsIHN0cmlwICVsdSIsCisJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGJ5dGVjb3VudCwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHN0cmlwKTsKKyNlbmRpZgorCQlyZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKKwl9CisJYnl0ZWNvdW50bSA9ICh0bXNpemVfdClieXRlY291bnQ7CisJaWYgKCh1aW50NjQpYnl0ZWNvdW50bSE9Ynl0ZWNvdW50KSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJJbnRlZ2VyIG92ZXJmbG93Iik7CisJCXJldHVybiAoKHRtc2l6ZV90KSgtMSkpOworCX0KKwlpZiAoc2l6ZSAhPSAodG1zaXplX3QpKC0xKSAmJiBzaXplIDwgYnl0ZWNvdW50bSkKKwkJYnl0ZWNvdW50bSA9IHNpemU7CisJcmV0dXJuIChUSUZGUmVhZFJhd1N0cmlwMSh0aWYsIHN0cmlwLCBidWYsIGJ5dGVjb3VudG0sIG1vZHVsZSkpOworfQorCisvKgorICogUmVhZCB0aGUgc3BlY2lmaWVkIHN0cmlwIGFuZCBzZXR1cCBmb3IgZGVjb2RpbmcuIFRoZSBkYXRhIGJ1ZmZlciBpcworICogZXhwYW5kZWQsIGFzIG5lY2Vzc2FyeSwgdG8gaG9sZCB0aGUgc3RyaXAncyBkYXRhLgorICovCitpbnQKK1RJRkZGaWxsU3RyaXAoVElGRiogdGlmLCB1aW50MzIgc3RyaXApCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRkZpbGxTdHJpcCI7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCisgICAgaWYgKCFfVElGRkZpbGxTdHJpbGVzKCB0aWYgKSB8fCAhdGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50KQorICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgCisJaWYgKCh0aWYtPnRpZl9mbGFncyZUSUZGX05PUkVBRFJBVyk9PTApCisJeworCQl1aW50NjQgYnl0ZWNvdW50ID0gdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3N0cmlwXTsKKwkJaWYgKChpbnQ2NClieXRlY291bnQgPD0gMCkgeworI2lmIGRlZmluZWQoX19XSU4zMl9fKSAmJiAoZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykpCisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCSJJbnZhbGlkIHN0cmlwIGJ5dGUgY291bnQgJUk2NHUsIHN0cmlwICVsdSIsCisJCQkJICAgICAodW5zaWduZWQgX19pbnQ2NCkgYnl0ZWNvdW50LAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHN0cmlwKTsKKyNlbHNlCisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJCSJJbnZhbGlkIHN0cmlwIGJ5dGUgY291bnQgJWxsdSwgc3RyaXAgJWx1IiwKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGJ5dGVjb3VudCwKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nKSBzdHJpcCk7CisjZW5kaWYKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJaWYgKGlzTWFwcGVkKHRpZikgJiYKKwkJICAgIChpc0ZpbGxPcmRlcih0aWYsIHRkLT50ZF9maWxsb3JkZXIpCisJCSAgICB8fCAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX05PQklUUkVWKSkpIHsKKwkJCS8qCisJCQkgKiBUaGUgaW1hZ2UgaXMgbWFwcGVkIGludG8gbWVtb3J5IGFuZCB3ZSBlaXRoZXIgZG9uJ3QKKwkJCSAqIG5lZWQgdG8gZmxpcCBiaXRzIG9yIHRoZSBjb21wcmVzc2lvbiByb3V0aW5lIGlzCisJCQkgKiBnb2luZyB0byBoYW5kbGUgdGhpcyBvcGVyYXRpb24gaXRzZWxmLiAgSW4gdGhpcworCQkJICogY2FzZSwgYXZvaWQgY29weWluZyB0aGUgcmF3IGRhdGEgYW5kIGluc3RlYWQganVzdAorCQkJICogcmVmZXJlbmNlIHRoZSBkYXRhIGZyb20gdGhlIG1lbW9yeSBtYXBwZWQgZmlsZQorCQkJICogaW1hZ2UuICBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgZGVjb21wcmVzc2lvbgorCQkJICogcm91dGluZXMgZG8gbm90IG1vZGlmeSB0aGUgY29udGVudHMgb2YgdGhlIHJhdyBkYXRhCisJCQkgKiBidWZmZXIgKGlmIHRoZXkgdHJ5IHRvLCB0aGUgYXBwbGljYXRpb24gd2lsbCBnZXQgYQorCQkJICogZmF1bHQgc2luY2UgdGhlIGZpbGUgaXMgbWFwcGVkIHJlYWQtb25seSkuCisJCQkgKi8KKwkJCWlmICgodGlmLT50aWZfZmxhZ3MgJiBUSUZGX01ZQlVGRkVSKSAmJiB0aWYtPnRpZl9yYXdkYXRhKSB7CisJCQkJX1RJRkZmcmVlKHRpZi0+dGlmX3Jhd2RhdGEpOworCQkJCXRpZi0+dGlmX3Jhd2RhdGEgPSBOVUxMOworCQkJCXRpZi0+dGlmX3Jhd2RhdGFzaXplID0gMDsKKwkJCX0KKwkJCXRpZi0+dGlmX2ZsYWdzICY9IH5USUZGX01ZQlVGRkVSOworCQkJLyoKKwkJCSAqIFdlIG11c3QgY2hlY2sgZm9yIG92ZXJmbG93LCBwb3RlbnRpYWxseSBjYXVzaW5nCisJCQkgKiBhbiBPT0IgcmVhZC4gSW5zdGVhZCBvZiBzaW1wbGUKKwkJCSAqCisJCQkgKiAgdGQtPnRkX3N0cmlwb2Zmc2V0W3N0cmlwXStieXRlY291bnQgPiB0aWYtPnRpZl9zaXplCisJCQkgKgorCQkJICogY29tcGFyaXNvbiAod2hpY2ggY2FuIG92ZXJmbG93KSB3ZSBkbyB0aGUgZm9sbG93aW5nCisJCQkgKiB0d28gY29tcGFyaXNvbnM6CisJCQkgKi8KKwkJCWlmIChieXRlY291bnQgPiAodWludDY0KXRpZi0+dGlmX3NpemUgfHwKKwkJCSAgICB0ZC0+dGRfc3RyaXBvZmZzZXRbc3RyaXBdID4gKHVpbnQ2NCl0aWYtPnRpZl9zaXplIC0gYnl0ZWNvdW50KSB7CisJCQkJLyoKKwkJCQkgKiBUaGlzIGVycm9yIG1lc3NhZ2UgbWlnaHQgc2VlbSBzdHJhbmdlLCBidXQKKwkJCQkgKiBpdCdzIHdoYXQgd291bGQgaGFwcGVuIGlmIGEgcmVhZCB3ZXJlIGRvbmUKKwkJCQkgKiBpbnN0ZWFkLgorCQkJCSAqLworI2lmIGRlZmluZWQoX19XSU4zMl9fKSAmJiAoZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykpCisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKworCQkJCQkiUmVhZCBlcnJvciBvbiBzdHJpcCAlbHU7ICIKKwkJCQkJImdvdCAlSTY0dSBieXRlcywgZXhwZWN0ZWQgJUk2NHUiLAorCQkJCQkodW5zaWduZWQgbG9uZykgc3RyaXAsCisJCQkJCSh1bnNpZ25lZCBfX2ludDY0KSB0aWYtPnRpZl9zaXplIC0gdGQtPnRkX3N0cmlwb2Zmc2V0W3N0cmlwXSwKKwkJCQkJKHVuc2lnbmVkIF9faW50NjQpIGJ5dGVjb3VudCk7CisjZWxzZQorCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisKKwkJCQkJIlJlYWQgZXJyb3Igb24gc3RyaXAgJWx1OyAiCisJCQkJCSJnb3QgJWxsdSBieXRlcywgZXhwZWN0ZWQgJWxsdSIsCisJCQkJCSh1bnNpZ25lZCBsb25nKSBzdHJpcCwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgdGlmLT50aWZfc2l6ZSAtIHRkLT50ZF9zdHJpcG9mZnNldFtzdHJpcF0sCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGJ5dGVjb3VudCk7CisjZW5kaWYKKwkJCQl0aWYtPnRpZl9jdXJzdHJpcCA9IE5PU1RSSVA7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCXRpZi0+dGlmX3Jhd2RhdGFzaXplID0gKHRtc2l6ZV90KWJ5dGVjb3VudDsKKwkJCXRpZi0+dGlmX3Jhd2RhdGEgPSB0aWYtPnRpZl9iYXNlICsgKHRtc2l6ZV90KXRkLT50ZF9zdHJpcG9mZnNldFtzdHJpcF07CisgICAgICAgICAgICAgICAgICAgICAgICB0aWYtPnRpZl9yYXdkYXRhb2ZmID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX3Jhd2RhdGFsb2FkZWQgPSAodG1zaXplX3QpIGJ5dGVjb3VudDsKKworCQkJLyogCisJCQkgKiBXaGVuIHdlIGhhdmUgdGlmX3Jhd2RhdGEgcmVmZXJlbmNlIGRpcmVjdGx5IGludG8gdGhlIG1lbW9yeSBtYXBwZWQgZmlsZQorCQkJICogd2UgbmVlZCB0byBiZSBwcmV0dHkgY2FyZWZ1bCBhYm91dCBob3cgd2UgdXNlIHRoZSByYXdkYXRhLiAgSXQgaXMgbm90CisJCQkgKiBhIGdlbmVyYWwgcHVycG9zZSB3b3JraW5nIGJ1ZmZlciBhcyBpdCBub3JtYWxseSBvdGhlcndpc2UgaXMuICBTbyB3ZQorCQkJICoga2VlcCB0cmFjayBvZiB0aGlzIGZhY3QgdG8gYXZvaWQgdXNpbmcgaXQgaW1wcm9wZXJseS4KKwkJCSAqLworCQkJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9CVUZGRVJNTUFQOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIEV4cGFuZCByYXcgZGF0YSBidWZmZXIsIGlmIG5lZWRlZCwgdG8gaG9sZCBkYXRhCisJCQkgKiBzdHJpcCBjb21pbmcgZnJvbSBmaWxlIChwZXJoYXBzIHNob3VsZCBzZXQgdXBwZXIKKwkJCSAqIGJvdW5kIG9uIHRoZSBzaXplIG9mIGEgYnVmZmVyIHdlJ2xsIHVzZT8pLgorCQkJICovCisJCQl0bXNpemVfdCBieXRlY291bnRtOworCQkJYnl0ZWNvdW50bT0odG1zaXplX3QpYnl0ZWNvdW50OworCQkJaWYgKCh1aW50NjQpYnl0ZWNvdW50bSE9Ynl0ZWNvdW50KQorCQkJeworCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiSW50ZWdlciBvdmVyZmxvdyIpOworCQkJCXJldHVybigwKTsKKwkJCX0KKwkJCWlmIChieXRlY291bnRtID4gdGlmLT50aWZfcmF3ZGF0YXNpemUpIHsKKwkJCQl0aWYtPnRpZl9jdXJzdHJpcCA9IE5PU1RSSVA7CisJCQkJaWYgKCh0aWYtPnRpZl9mbGFncyAmIFRJRkZfTVlCVUZGRVIpID09IDApIHsKKwkJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkJICAgICJEYXRhIGJ1ZmZlciB0b28gc21hbGwgdG8gaG9sZCBzdHJpcCAlbHUiLAorCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpIHN0cmlwKTsKKwkJCQkJcmV0dXJuICgwKTsKKwkJCQl9CisJCQkJaWYgKCFUSUZGUmVhZEJ1ZmZlclNldHVwKHRpZiwgMCwgYnl0ZWNvdW50bSkpCisJCQkJCXJldHVybiAoMCk7CisJCQl9CisJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9CVUZGRVJNTUFQKSB7CisJCQkJdGlmLT50aWZfY3Vyc3RyaXAgPSBOT1NUUklQOworCQkJCWlmICghVElGRlJlYWRCdWZmZXJTZXR1cCh0aWYsIDAsIGJ5dGVjb3VudG0pKQorCQkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJaWYgKFRJRkZSZWFkUmF3U3RyaXAxKHRpZiwgc3RyaXAsIHRpZi0+dGlmX3Jhd2RhdGEsCisJCQkJYnl0ZWNvdW50bSwgbW9kdWxlKSAhPSBieXRlY291bnRtKQorCQkJCXJldHVybiAoMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX3Jhd2RhdGFvZmYgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfcmF3ZGF0YWxvYWRlZCA9IGJ5dGVjb3VudG07CisgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCWlmICghaXNGaWxsT3JkZXIodGlmLCB0ZC0+dGRfZmlsbG9yZGVyKSAmJgorCQkJICAgICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfTk9CSVRSRVYpID09IDApCisJCQkJVElGRlJldmVyc2VCaXRzKHRpZi0+dGlmX3Jhd2RhdGEsIGJ5dGVjb3VudG0pOworICAgICAgICAgICAgICAgIH0KKwl9CisJcmV0dXJuIChUSUZGU3RhcnRTdHJpcCh0aWYsIHN0cmlwKSk7Cit9CisKKy8qCisgKiBUaWxlLW9yaWVudGVkIFJlYWQgU3VwcG9ydAorICogQ29udHJpYnV0ZWQgYnkgTmFuY3kgQ2FtIChTaWxpY29uIEdyYXBoaWNzKS4KKyAqLworCisvKgorICogUmVhZCBhbmQgZGVjb21wcmVzcyBhIHRpbGUgb2YgZGF0YS4gIFRoZQorICogdGlsZSBpcyBzZWxlY3RlZCBieSB0aGUgKHgseSx6LHMpIGNvb3JkaW5hdGVzLgorICovCit0bXNpemVfdAorVElGRlJlYWRUaWxlKFRJRkYqIHRpZiwgdm9pZCogYnVmLCB1aW50MzIgeCwgdWludDMyIHksIHVpbnQzMiB6LCB1aW50MTYgcykKK3sKKwlpZiAoIVRJRkZDaGVja1JlYWQodGlmLCAxKSB8fCAhVElGRkNoZWNrVGlsZSh0aWYsIHgsIHksIHosIHMpKQorCQlyZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKKwlyZXR1cm4gKFRJRkZSZWFkRW5jb2RlZFRpbGUodGlmLAorCSAgICBUSUZGQ29tcHV0ZVRpbGUodGlmLCB4LCB5LCB6LCBzKSwgYnVmLCAodG1zaXplX3QpKC0xKSkpOworfQorCisvKgorICogUmVhZCBhIHRpbGUgb2YgZGF0YSBhbmQgZGVjb21wcmVzcyB0aGUgc3BlY2lmaWVkCisgKiBhbW91bnQgaW50byB0aGUgdXNlci1zdXBwbGllZCBidWZmZXIuCisgKi8KK3Rtc2l6ZV90CitUSUZGUmVhZEVuY29kZWRUaWxlKFRJRkYqIHRpZiwgdWludDMyIHRpbGUsIHZvaWQqIGJ1ZiwgdG1zaXplX3Qgc2l6ZSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGUmVhZEVuY29kZWRUaWxlIjsKKwlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisJdG1zaXplX3QgdGlsZXNpemUgPSB0aWYtPnRpZl90aWxlc2l6ZTsKKworCWlmICghVElGRkNoZWNrUmVhZCh0aWYsIDEpKQorCQlyZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKKwlpZiAodGlsZSA+PSB0ZC0+dGRfbnN0cmlwcykgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkgICAgIiVsdTogVGlsZSBvdXQgb2YgcmFuZ2UsIG1heCAlbHUiLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpIHRpbGUsICh1bnNpZ25lZCBsb25nKSB0ZC0+dGRfbnN0cmlwcyk7CisJCXJldHVybiAoKHRtc2l6ZV90KSgtMSkpOworCX0KKwlpZiAoc2l6ZSA9PSAodG1zaXplX3QpKC0xKSkKKwkJc2l6ZSA9IHRpbGVzaXplOworCWVsc2UgaWYgKHNpemUgPiB0aWxlc2l6ZSkKKwkJc2l6ZSA9IHRpbGVzaXplOworCWlmIChUSUZGRmlsbFRpbGUodGlmLCB0aWxlKSAmJiAoKnRpZi0+dGlmX2RlY29kZXRpbGUpKHRpZiwKKwkgICAgKHVpbnQ4KikgYnVmLCBzaXplLCAodWludDE2KSh0aWxlL3RkLT50ZF9zdHJpcHNwZXJpbWFnZSkpKSB7CisJCSgqdGlmLT50aWZfcG9zdGRlY29kZSkodGlmLCAodWludDgqKSBidWYsIHNpemUpOworCQlyZXR1cm4gKHNpemUpOworCX0gZWxzZQorCQlyZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKK30KKworc3RhdGljIHRtc2l6ZV90CitUSUZGUmVhZFJhd1RpbGUxKFRJRkYqIHRpZiwgdWludDMyIHRpbGUsIHZvaWQqIGJ1ZiwgdG1zaXplX3Qgc2l6ZSwgY29uc3QgY2hhciogbW9kdWxlKQoreworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKworICAgIGlmICghX1RJRkZGaWxsU3RyaWxlcyggdGlmICkpCisgICAgICAgIHJldHVybiAoKHRtc2l6ZV90KSgtMSkpOworCisJYXNzZXJ0KCh0aWYtPnRpZl9mbGFncyZUSUZGX05PUkVBRFJBVyk9PTApOworCWlmICghaXNNYXBwZWQodGlmKSkgeworCQl0bXNpemVfdCBjYzsKKworCQlpZiAoIVNlZWtPSyh0aWYsIHRkLT50ZF9zdHJpcG9mZnNldFt0aWxlXSkpIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgIlNlZWsgZXJyb3IgYXQgcm93ICVsdSwgY29sICVsdSwgdGlsZSAlbHUiLAorCQkJICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3csCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX2NvbCwKKwkJCSAgICAodW5zaWduZWQgbG9uZykgdGlsZSk7CisJCQlyZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKKwkJfQorCQljYyA9IFRJRkZSZWFkRmlsZSh0aWYsIGJ1Ziwgc2l6ZSk7CisJCWlmIChjYyAhPSBzaXplKSB7CisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJIlJlYWQgZXJyb3IgYXQgcm93ICVsdSwgY29sICVsdTsgZ290ICVJNjR1IGJ5dGVzLCBleHBlY3RlZCAlSTY0dSIsCisJCQkJICAgICAodW5zaWduZWQgbG9uZykgdGlmLT50aWZfcm93LAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX2NvbCwKKwkJCQkgICAgICh1bnNpZ25lZCBfX2ludDY0KSBjYywKKwkJCQkgICAgICh1bnNpZ25lZCBfX2ludDY0KSBzaXplKTsKKyNlbHNlCisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCSJSZWFkIGVycm9yIGF0IHJvdyAlbHUsIGNvbCAlbHU7IGdvdCAlbGx1IGJ5dGVzLCBleHBlY3RlZCAlbGx1IiwKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3csCisJCQkJICAgICAodW5zaWduZWQgbG9uZykgdGlmLT50aWZfY29sLAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgY2MsCisJCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzaXplKTsKKyNlbmRpZgorCQkJcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisJCX0KKwl9IGVsc2UgeworCQl0bXNpemVfdCBtYSxtYjsKKwkJdG1zaXplX3QgbjsKKwkJbWE9KHRtc2l6ZV90KXRkLT50ZF9zdHJpcG9mZnNldFt0aWxlXTsKKwkJbWI9bWErc2l6ZTsKKwkJaWYgKCgodWludDY0KW1hIT10ZC0+dGRfc3RyaXBvZmZzZXRbdGlsZV0pfHwobWE+dGlmLT50aWZfc2l6ZSkpCisJCQluPTA7CisJCWVsc2UgaWYgKChtYjxtYSl8fChtYjxzaXplKXx8KG1iPnRpZi0+dGlmX3NpemUpKQorCQkJbj10aWYtPnRpZl9zaXplLW1hOworCQllbHNlCisJCQluPXNpemU7CisJCWlmIChuIT1zaXplKSB7CisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisiUmVhZCBlcnJvciBhdCByb3cgJWx1LCBjb2wgJWx1LCB0aWxlICVsdTsgZ290ICVJNjR1IGJ5dGVzLCBleHBlY3RlZCAlSTY0dSIsCisJCQkJICAgICAodW5zaWduZWQgbG9uZykgdGlmLT50aWZfcm93LAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX2NvbCwKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nKSB0aWxlLAorCQkJCSAgICAgKHVuc2lnbmVkIF9faW50NjQpIG4sCisJCQkJICAgICAodW5zaWduZWQgX19pbnQ2NCkgc2l6ZSk7CisjZWxzZQorCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKyJSZWFkIGVycm9yIGF0IHJvdyAlbHUsIGNvbCAlbHUsIHRpbGUgJWx1OyBnb3QgJWxsdSBieXRlcywgZXhwZWN0ZWQgJWxsdSIsCisJCQkJICAgICAodW5zaWduZWQgbG9uZykgdGlmLT50aWZfcm93LAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX2NvbCwKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nKSB0aWxlLAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbiwKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHNpemUpOworI2VuZGlmCisJCQlyZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKKwkJfQorCQlfVElGRm1lbWNweShidWYsIHRpZi0+dGlmX2Jhc2UgKyBtYSwgc2l6ZSk7CisJfQorCXJldHVybiAoc2l6ZSk7Cit9CisKKy8qCisgKiBSZWFkIGEgdGlsZSBvZiBkYXRhIGZyb20gdGhlIGZpbGUuCisgKi8KK3Rtc2l6ZV90CitUSUZGUmVhZFJhd1RpbGUoVElGRiogdGlmLCB1aW50MzIgdGlsZSwgdm9pZCogYnVmLCB0bXNpemVfdCBzaXplKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZSZWFkUmF3VGlsZSI7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCXVpbnQ2NCBieXRlY291bnQ2NDsKKwl0bXNpemVfdCBieXRlY291bnRtOworCisJaWYgKCFUSUZGQ2hlY2tSZWFkKHRpZiwgMSkpCisJCXJldHVybiAoKHRtc2l6ZV90KSgtMSkpOworCWlmICh0aWxlID49IHRkLT50ZF9uc3RyaXBzKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCSAgICAiJWx1OiBUaWxlIG91dCBvZiByYW5nZSwgbWF4ICVsdSIsCisJCSAgICAodW5zaWduZWQgbG9uZykgdGlsZSwgKHVuc2lnbmVkIGxvbmcpIHRkLT50ZF9uc3RyaXBzKTsKKwkJcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisJfQorCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX05PUkVBRFJBVykKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCSJDb21wcmVzc2lvbiBzY2hlbWUgZG9lcyBub3Qgc3VwcG9ydCBhY2Nlc3MgdG8gcmF3IHVuY29tcHJlc3NlZCBkYXRhIik7CisJCXJldHVybiAoKHRtc2l6ZV90KSgtMSkpOworCX0KKwlieXRlY291bnQ2NCA9IHRkLT50ZF9zdHJpcGJ5dGVjb3VudFt0aWxlXTsKKwlpZiAoc2l6ZSAhPSAodG1zaXplX3QpKC0xKSAmJiAodWludDY0KXNpemUgPCBieXRlY291bnQ2NCkKKwkJYnl0ZWNvdW50NjQgPSAodWludDY0KXNpemU7CisJYnl0ZWNvdW50bSA9ICh0bXNpemVfdClieXRlY291bnQ2NDsKKwlpZiAoKHVpbnQ2NClieXRlY291bnRtIT1ieXRlY291bnQ2NCkKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiSW50ZWdlciBvdmVyZmxvdyIpOworCQlyZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKKwl9CisJcmV0dXJuIChUSUZGUmVhZFJhd1RpbGUxKHRpZiwgdGlsZSwgYnVmLCBieXRlY291bnRtLCBtb2R1bGUpKTsKK30KKworLyoKKyAqIFJlYWQgdGhlIHNwZWNpZmllZCB0aWxlIGFuZCBzZXR1cCBmb3IgZGVjb2RpbmcuIFRoZSBkYXRhIGJ1ZmZlciBpcworICogZXhwYW5kZWQsIGFzIG5lY2Vzc2FyeSwgdG8gaG9sZCB0aGUgdGlsZSdzIGRhdGEuCisgKi8KK2ludAorVElGRkZpbGxUaWxlKFRJRkYqIHRpZiwgdWludDMyIHRpbGUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRkZpbGxUaWxlIjsKKwlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisKKyAgICBpZiAoIV9USUZGRmlsbFN0cmlsZXMoIHRpZiApIHx8ICF0aWYtPnRpZl9kaXIudGRfc3RyaXBieXRlY291bnQpCisgICAgICAgIHJldHVybiAwOworICAgICAgICAKKwlpZiAoKHRpZi0+dGlmX2ZsYWdzJlRJRkZfTk9SRUFEUkFXKT09MCkKKwl7CisJCXVpbnQ2NCBieXRlY291bnQgPSB0ZC0+dGRfc3RyaXBieXRlY291bnRbdGlsZV07CisJCWlmICgoaW50NjQpYnl0ZWNvdW50IDw9IDApIHsKKyNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgKGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKQorCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkiJUk2NHU6IEludmFsaWQgdGlsZSBieXRlIGNvdW50LCB0aWxlICVsdSIsCisJCQkJICAgICAodW5zaWduZWQgX19pbnQ2NCkgYnl0ZWNvdW50LAorCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHRpbGUpOworI2Vsc2UKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJIiVsbHU6IEludmFsaWQgdGlsZSBieXRlIGNvdW50LCB0aWxlICVsdSIsCisJCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBieXRlY291bnQsCisJCQkJICAgICAodW5zaWduZWQgbG9uZykgdGlsZSk7CisjZW5kaWYKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJaWYgKGlzTWFwcGVkKHRpZikgJiYKKwkJICAgIChpc0ZpbGxPcmRlcih0aWYsIHRkLT50ZF9maWxsb3JkZXIpCisJCSAgICAgfHwgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9OT0JJVFJFVikpKSB7CisJCQkvKgorCQkJICogVGhlIGltYWdlIGlzIG1hcHBlZCBpbnRvIG1lbW9yeSBhbmQgd2UgZWl0aGVyIGRvbid0CisJCQkgKiBuZWVkIHRvIGZsaXAgYml0cyBvciB0aGUgY29tcHJlc3Npb24gcm91dGluZSBpcworCQkJICogZ29pbmcgdG8gaGFuZGxlIHRoaXMgb3BlcmF0aW9uIGl0c2VsZi4gIEluIHRoaXMKKwkJCSAqIGNhc2UsIGF2b2lkIGNvcHlpbmcgdGhlIHJhdyBkYXRhIGFuZCBpbnN0ZWFkIGp1c3QKKwkJCSAqIHJlZmVyZW5jZSB0aGUgZGF0YSBmcm9tIHRoZSBtZW1vcnkgbWFwcGVkIGZpbGUKKwkJCSAqIGltYWdlLiAgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGRlY29tcHJlc3Npb24KKwkJCSAqIHJvdXRpbmVzIGRvIG5vdCBtb2RpZnkgdGhlIGNvbnRlbnRzIG9mIHRoZSByYXcgZGF0YQorCQkJICogYnVmZmVyIChpZiB0aGV5IHRyeSB0bywgdGhlIGFwcGxpY2F0aW9uIHdpbGwgZ2V0IGEKKwkJCSAqIGZhdWx0IHNpbmNlIHRoZSBmaWxlIGlzIG1hcHBlZCByZWFkLW9ubHkpLgorCQkJICovCisJCQlpZiAoKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9NWUJVRkZFUikgJiYgdGlmLT50aWZfcmF3ZGF0YSkgeworCQkJCV9USUZGZnJlZSh0aWYtPnRpZl9yYXdkYXRhKTsKKwkJCQl0aWYtPnRpZl9yYXdkYXRhID0gTlVMTDsKKwkJCQl0aWYtPnRpZl9yYXdkYXRhc2l6ZSA9IDA7CisJCQl9CisJCQl0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9NWUJVRkZFUjsKKwkJCS8qCisJCQkgKiBXZSBtdXN0IGNoZWNrIGZvciBvdmVyZmxvdywgcG90ZW50aWFsbHkgY2F1c2luZworCQkJICogYW4gT09CIHJlYWQuIEluc3RlYWQgb2Ygc2ltcGxlCisJCQkgKgorCQkJICogIHRkLT50ZF9zdHJpcG9mZnNldFt0aWxlXStieXRlY291bnQgPiB0aWYtPnRpZl9zaXplCisJCQkgKgorCQkJICogY29tcGFyaXNvbiAod2hpY2ggY2FuIG92ZXJmbG93KSB3ZSBkbyB0aGUgZm9sbG93aW5nCisJCQkgKiB0d28gY29tcGFyaXNvbnM6CisJCQkgKi8KKwkJCWlmIChieXRlY291bnQgPiAodWludDY0KXRpZi0+dGlmX3NpemUgfHwKKwkJCSAgICB0ZC0+dGRfc3RyaXBvZmZzZXRbdGlsZV0gPiAodWludDY0KXRpZi0+dGlmX3NpemUgLSBieXRlY291bnQpIHsKKwkJCQl0aWYtPnRpZl9jdXJ0aWxlID0gTk9USUxFOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCQl0aWYtPnRpZl9yYXdkYXRhc2l6ZSA9ICh0bXNpemVfdClieXRlY291bnQ7CisJCQl0aWYtPnRpZl9yYXdkYXRhID0KKwkJCQl0aWYtPnRpZl9iYXNlICsgKHRtc2l6ZV90KXRkLT50ZF9zdHJpcG9mZnNldFt0aWxlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX3Jhd2RhdGFvZmYgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfcmF3ZGF0YWxvYWRlZCA9ICh0bXNpemVfdCkgYnl0ZWNvdW50OworCQkJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9CVUZGRVJNTUFQOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIEV4cGFuZCByYXcgZGF0YSBidWZmZXIsIGlmIG5lZWRlZCwgdG8gaG9sZCBkYXRhCisJCQkgKiB0aWxlIGNvbWluZyBmcm9tIGZpbGUgKHBlcmhhcHMgc2hvdWxkIHNldCB1cHBlcgorCQkJICogYm91bmQgb24gdGhlIHNpemUgb2YgYSBidWZmZXIgd2UnbGwgdXNlPykuCisJCQkgKi8KKwkJCXRtc2l6ZV90IGJ5dGVjb3VudG07CisJCQlieXRlY291bnRtPSh0bXNpemVfdClieXRlY291bnQ7CisJCQlpZiAoKHVpbnQ2NClieXRlY291bnRtIT1ieXRlY291bnQpCisJCQl7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJJbnRlZ2VyIG92ZXJmbG93Iik7CisJCQkJcmV0dXJuKDApOworCQkJfQorCQkJaWYgKGJ5dGVjb3VudG0gPiB0aWYtPnRpZl9yYXdkYXRhc2l6ZSkgeworCQkJCXRpZi0+dGlmX2N1cnRpbGUgPSBOT1RJTEU7CisJCQkJaWYgKCh0aWYtPnRpZl9mbGFncyAmIFRJRkZfTVlCVUZGRVIpID09IDApIHsKKwkJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkJICAgICJEYXRhIGJ1ZmZlciB0b28gc21hbGwgdG8gaG9sZCB0aWxlICVsdSIsCisJCQkJCSAgICAodW5zaWduZWQgbG9uZykgdGlsZSk7CisJCQkJCXJldHVybiAoMCk7CisJCQkJfQorCQkJCWlmICghVElGRlJlYWRCdWZmZXJTZXR1cCh0aWYsIDAsIGJ5dGVjb3VudG0pKQorCQkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfQlVGRkVSTU1BUCkgeworCQkJCXRpZi0+dGlmX2N1cnRpbGUgPSBOT1RJTEU7CisJCQkJaWYgKCFUSUZGUmVhZEJ1ZmZlclNldHVwKHRpZiwgMCwgYnl0ZWNvdW50bSkpCisJCQkJCXJldHVybiAoMCk7CisJCQl9CisKKwkJCWlmIChUSUZGUmVhZFJhd1RpbGUxKHRpZiwgdGlsZSwgdGlmLT50aWZfcmF3ZGF0YSwKKwkJCSAgICBieXRlY291bnRtLCBtb2R1bGUpICE9IGJ5dGVjb3VudG0pCisJCQkJcmV0dXJuICgwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfcmF3ZGF0YW9mZiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB0aWYtPnRpZl9yYXdkYXRhbG9hZGVkID0gYnl0ZWNvdW50bTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJaWYgKCFpc0ZpbGxPcmRlcih0aWYsIHRkLT50ZF9maWxsb3JkZXIpICYmCisJCQkgICAgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9OT0JJVFJFVikgPT0gMCkKKwkJCQlUSUZGUmV2ZXJzZUJpdHModGlmLT50aWZfcmF3ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX3Jhd2RhdGFsb2FkZWQpOworCQl9CisJfQorCXJldHVybiAoVElGRlN0YXJ0VGlsZSh0aWYsIHRpbGUpKTsKK30KKworLyoKKyAqIFNldHVwIHRoZSByYXcgZGF0YSBidWZmZXIgaW4gcHJlcGFyYXRpb24gZm9yCisgKiByZWFkaW5nIGEgc3RyaXAgb2YgcmF3IGRhdGEuICBJZiB0aGUgYnVmZmVyCisgKiBpcyBzcGVjaWZpZWQgYXMgemVybywgdGhlbiBhIGJ1ZmZlciBvZiBhcHByb3ByaWF0ZQorICogc2l6ZSBpcyBhbGxvY2F0ZWQgYnkgdGhlIGxpYnJhcnkuICBPdGhlcndpc2UsCisgKiB0aGUgY2xpZW50IG11c3QgZ3VhcmFudGVlIHRoYXQgdGhlIGJ1ZmZlciBpcworICogbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYW55IGluZGl2aWR1YWwgc3RyaXAgb2YKKyAqIHJhdyBkYXRhLgorICovCitpbnQKK1RJRkZSZWFkQnVmZmVyU2V0dXAoVElGRiogdGlmLCB2b2lkKiBicCwgdG1zaXplX3Qgc2l6ZSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGUmVhZEJ1ZmZlclNldHVwIjsKKworCWFzc2VydCgodGlmLT50aWZfZmxhZ3MmVElGRl9OT1JFQURSQVcpPT0wKTsKKwl0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9CVUZGRVJNTUFQOworCisJaWYgKHRpZi0+dGlmX3Jhd2RhdGEpIHsKKwkJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9NWUJVRkZFUikKKwkJCV9USUZGZnJlZSh0aWYtPnRpZl9yYXdkYXRhKTsKKwkJdGlmLT50aWZfcmF3ZGF0YSA9IE5VTEw7CisJCXRpZi0+dGlmX3Jhd2RhdGFzaXplID0gMDsKKwl9CisJaWYgKGJwKSB7CisJCXRpZi0+dGlmX3Jhd2RhdGFzaXplID0gc2l6ZTsKKwkJdGlmLT50aWZfcmF3ZGF0YSA9ICh1aW50OCopIGJwOworCQl0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9NWUJVRkZFUjsKKwl9IGVsc2UgeworCQl0aWYtPnRpZl9yYXdkYXRhc2l6ZSA9ICh0bXNpemVfdClUSUZGcm91bmR1cF82NCgodWludDY0KXNpemUsIDEwMjQpOworCQlpZiAodGlmLT50aWZfcmF3ZGF0YXNpemU9PTApIHsKKwkJICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkJICJJbnZhbGlkIGJ1ZmZlciBzaXplIik7CisJCSAgICByZXR1cm4gKDApOworCQl9CisJCXRpZi0+dGlmX3Jhd2RhdGEgPSAodWludDgqKSBfVElGRm1hbGxvYyh0aWYtPnRpZl9yYXdkYXRhc2l6ZSk7CisJCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfTVlCVUZGRVI7CisJfQorCWlmICh0aWYtPnRpZl9yYXdkYXRhID09IE5VTEwpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJICAgICJObyBzcGFjZSBmb3IgZGF0YSBidWZmZXIgYXQgc2NhbmxpbmUgJWx1IiwKKwkJICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3cpOworCQl0aWYtPnRpZl9yYXdkYXRhc2l6ZSA9IDA7CisJCXJldHVybiAoMCk7CisJfQorCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBTZXQgc3RhdGUgdG8gYXBwZWFyIGFzIGlmIGEKKyAqIHN0cmlwIGhhcyBqdXN0IGJlZW4gcmVhZCBpbi4KKyAqLworc3RhdGljIGludAorVElGRlN0YXJ0U3RyaXAoVElGRiogdGlmLCB1aW50MzIgc3RyaXApCit7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCisgICAgaWYgKCFfVElGRkZpbGxTdHJpbGVzKCB0aWYgKSB8fCAhdGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50KQorICAgICAgICByZXR1cm4gMDsKKworCWlmICgodGlmLT50aWZfZmxhZ3MgJiBUSUZGX0NPREVSU0VUVVApID09IDApIHsKKwkJaWYgKCEoKnRpZi0+dGlmX3NldHVwZGVjb2RlKSh0aWYpKQorCQkJcmV0dXJuICgwKTsKKwkJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9DT0RFUlNFVFVQOworCX0KKwl0aWYtPnRpZl9jdXJzdHJpcCA9IHN0cmlwOworCXRpZi0+dGlmX3JvdyA9IChzdHJpcCAlIHRkLT50ZF9zdHJpcHNwZXJpbWFnZSkgKiB0ZC0+dGRfcm93c3BlcnN0cmlwOworICAgICAgICB0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9CVUY0V1JJVEU7CisKKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9OT1JFQURSQVcpCisJeworCQl0aWYtPnRpZl9yYXdjcCA9IE5VTEw7CisJCXRpZi0+dGlmX3Jhd2NjID0gMDsgIAorCX0KKwllbHNlCisJeworCQl0aWYtPnRpZl9yYXdjcCA9IHRpZi0+dGlmX3Jhd2RhdGE7CisJCXRpZi0+dGlmX3Jhd2NjID0gKHRtc2l6ZV90KXRkLT50ZF9zdHJpcGJ5dGVjb3VudFtzdHJpcF07CisJfQorCXJldHVybiAoKCp0aWYtPnRpZl9wcmVkZWNvZGUpKHRpZiwKKwkJCSh1aW50MTYpKHN0cmlwIC8gdGQtPnRkX3N0cmlwc3BlcmltYWdlKSkpOworfQorCisvKgorICogU2V0IHN0YXRlIHRvIGFwcGVhciBhcyBpZiBhCisgKiB0aWxlIGhhcyBqdXN0IGJlZW4gcmVhZCBpbi4KKyAqLworc3RhdGljIGludAorVElGRlN0YXJ0VGlsZShUSUZGKiB0aWYsIHVpbnQzMiB0aWxlKQoreworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGU3RhcnRUaWxlIjsKKwlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisgICAgICAgIHVpbnQzMiBob3dtYW55MzI7CisKKyAgICAgICAgaWYgKCFfVElGRkZpbGxTdHJpbGVzKCB0aWYgKSB8fCAhdGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50KQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisJaWYgKCh0aWYtPnRpZl9mbGFncyAmIFRJRkZfQ09ERVJTRVRVUCkgPT0gMCkgeworCQlpZiAoISgqdGlmLT50aWZfc2V0dXBkZWNvZGUpKHRpZikpCisJCQlyZXR1cm4gKDApOworCQl0aWYtPnRpZl9mbGFncyB8PSBUSUZGX0NPREVSU0VUVVA7CisJfQorCXRpZi0+dGlmX2N1cnRpbGUgPSB0aWxlOworICAgICAgICBob3dtYW55MzI9VElGRmhvd21hbnlfMzIodGQtPnRkX2ltYWdld2lkdGgsIHRkLT50ZF90aWxld2lkdGgpOworICAgICAgICBpZiAoaG93bWFueTMyID09IDApIHsKKyAgICAgICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJaZXJvIHRpbGVzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKwl0aWYtPnRpZl9yb3cgPSAodGlsZSAlIGhvd21hbnkzMikgKiB0ZC0+dGRfdGlsZWxlbmd0aDsKKyAgICAgICAgaG93bWFueTMyPVRJRkZob3dtYW55XzMyKHRkLT50ZF9pbWFnZWxlbmd0aCwgdGQtPnRkX3RpbGVsZW5ndGgpOworICAgICAgICBpZiAoaG93bWFueTMyID09IDApIHsKKyAgICAgICAgICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIlplcm8gdGlsZXMiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCXRpZi0+dGlmX2NvbCA9ICh0aWxlICUgaG93bWFueTMyKSAqIHRkLT50ZF90aWxld2lkdGg7CisgICAgICAgIHRpZi0+dGlmX2ZsYWdzICY9IH5USUZGX0JVRjRXUklURTsKKwlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9OT1JFQURSQVcpCisJeworCQl0aWYtPnRpZl9yYXdjcCA9IE5VTEw7CisJCXRpZi0+dGlmX3Jhd2NjID0gMDsKKwl9CisJZWxzZQorCXsKKwkJdGlmLT50aWZfcmF3Y3AgPSB0aWYtPnRpZl9yYXdkYXRhOworCQl0aWYtPnRpZl9yYXdjYyA9ICh0bXNpemVfdCl0ZC0+dGRfc3RyaXBieXRlY291bnRbdGlsZV07CisJfQorCXJldHVybiAoKCp0aWYtPnRpZl9wcmVkZWNvZGUpKHRpZiwKKwkJCSh1aW50MTYpKHRpbGUvdGQtPnRkX3N0cmlwc3BlcmltYWdlKSkpOworfQorCitzdGF0aWMgaW50CitUSUZGQ2hlY2tSZWFkKFRJRkYqIHRpZiwgaW50IHRpbGVzKQoreworCWlmICh0aWYtPnRpZl9tb2RlID09IE9fV1JPTkxZKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCB0aWYtPnRpZl9uYW1lLCAiRmlsZSBub3Qgb3BlbiBmb3IgcmVhZGluZyIpOworCQlyZXR1cm4gKDApOworCX0KKwlpZiAodGlsZXMgXiBpc1RpbGVkKHRpZikpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIHRpZi0+dGlmX25hbWUsIHRpbGVzID8KKwkJICAgICJDYW4gbm90IHJlYWQgdGlsZXMgZnJvbSBhIHN0cmlwcGVkIGltYWdlIiA6CisJCSAgICAiQ2FuIG5vdCByZWFkIHNjYW5saW5lcyBmcm9tIGEgdGlsZWQgaW1hZ2UiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJcmV0dXJuICgxKTsKK30KKwordm9pZAorX1RJRkZOb1Bvc3REZWNvZGUoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBjYykKK3sKKyAgICAodm9pZCkgdGlmOyAodm9pZCkgYnVmOyAodm9pZCkgY2M7Cit9CisKK3ZvaWQKK19USUZGU3dhYjE2Qml0RGF0YShUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IGNjKQoreworICAgICh2b2lkKSB0aWY7CisgICAgYXNzZXJ0KChjYyAmIDEpID09IDApOworICAgIFRJRkZTd2FiQXJyYXlPZlNob3J0KCh1aW50MTYqKSBidWYsIGNjLzIpOworfQorCit2b2lkCitfVElGRlN3YWIyNEJpdERhdGEoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBjYykKK3sKKyAgICAodm9pZCkgdGlmOworICAgIGFzc2VydCgoY2MgJSAzKSA9PSAwKTsKKyAgICBUSUZGU3dhYkFycmF5T2ZUcmlwbGVzKCh1aW50OCopIGJ1ZiwgY2MvMyk7Cit9CisKK3ZvaWQKK19USUZGU3dhYjMyQml0RGF0YShUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IGNjKQoreworICAgICh2b2lkKSB0aWY7CisgICAgYXNzZXJ0KChjYyAmIDMpID09IDApOworICAgIFRJRkZTd2FiQXJyYXlPZkxvbmcoKHVpbnQzMiopIGJ1ZiwgY2MvNCk7Cit9CisKK3ZvaWQKK19USUZGU3dhYjY0Qml0RGF0YShUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IGNjKQoreworICAgICh2b2lkKSB0aWY7CisgICAgYXNzZXJ0KChjYyAmIDcpID09IDApOworICAgIFRJRkZTd2FiQXJyYXlPZkRvdWJsZSgoZG91YmxlKikgYnVmLCBjYy84KTsKK30KKworLyogdmltOiBzZXQgdHM9OCBzdHM9OCBzdz04IG5vZXQ6ICovCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9zdHJpcC5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfc3RyaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2FjNzFkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfc3RyaXAuYwpAQCAtMCwwICsxLDM4OSBAQAorLyogJElkOiB0aWZfc3RyaXAuYyx2IDEuMzYgMjAxNS0wNi0wNyAyMjozNTo0MCBiZnJpZXNlbiBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCAKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgorICogU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcy4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSAKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTQU0gTEVGRkxFUiBPUiBTSUxJQ09OIEdSQVBISUNTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgKiBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgKiBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GIAorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSAKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRJRkYgTGlicmFyeS4KKyAqCisgKiBTdHJpcC1vcmdhbml6ZWQgSW1hZ2UgU3VwcG9ydCBSb3V0aW5lcy4KKyAqLworI2luY2x1ZGUgInRpZmZpb3AuaCIKKworLyoKKyAqIENvbXB1dGUgd2hpY2ggc3RyaXAgYSAocm93LHNhbXBsZSkgdmFsdWUgaXMgaW4uCisgKi8KK3VpbnQzMgorVElGRkNvbXB1dGVTdHJpcChUSUZGKiB0aWYsIHVpbnQzMiByb3csIHVpbnQxNiBzYW1wbGUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRkNvbXB1dGVTdHJpcCI7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCXVpbnQzMiBzdHJpcDsKKworCXN0cmlwID0gcm93IC8gdGQtPnRkX3Jvd3NwZXJzdHJpcDsKKwlpZiAodGQtPnRkX3BsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfU0VQQVJBVEUpIHsKKwkJaWYgKHNhbXBsZSA+PSB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICIlbHU6IFNhbXBsZSBvdXQgb2YgcmFuZ2UsIG1heCAlbHUiLAorCQkJICAgICh1bnNpZ25lZCBsb25nKSBzYW1wbGUsICh1bnNpZ25lZCBsb25nKSB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJc3RyaXAgKz0gKHVpbnQzMilzYW1wbGUqdGQtPnRkX3N0cmlwc3BlcmltYWdlOworCX0KKwlyZXR1cm4gKHN0cmlwKTsKK30KKworLyoKKyAqIENvbXB1dGUgaG93IG1hbnkgc3RyaXBzIGFyZSBpbiBhbiBpbWFnZS4KKyAqLwordWludDMyCitUSUZGTnVtYmVyT2ZTdHJpcHMoVElGRiogdGlmKQoreworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKwl1aW50MzIgbnN0cmlwczsKKworCW5zdHJpcHMgPSAodGQtPnRkX3Jvd3NwZXJzdHJpcCA9PSAodWludDMyKSAtMSA/IDEgOgorCSAgICAgVElGRmhvd21hbnlfMzIodGQtPnRkX2ltYWdlbGVuZ3RoLCB0ZC0+dGRfcm93c3BlcnN0cmlwKSk7CisJaWYgKHRkLT50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX1NFUEFSQVRFKQorCQluc3RyaXBzID0gX1RJRkZNdWx0aXBseTMyKHRpZiwgbnN0cmlwcywgKHVpbnQzMil0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsLAorCQkgICAgIlRJRkZOdW1iZXJPZlN0cmlwcyIpOworCXJldHVybiAobnN0cmlwcyk7Cit9CisKKy8qCisgKiBDb21wdXRlIHRoZSAjIGJ5dGVzIGluIGEgdmFyaWFibGUgaGVpZ2h0LCByb3ctYWxpZ25lZCBzdHJpcC4KKyAqLwordWludDY0CitUSUZGVlN0cmlwU2l6ZTY0KFRJRkYqIHRpZiwgdWludDMyIG5yb3dzKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZWU3RyaXBTaXplNjQiOworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKwlpZiAobnJvd3M9PSh1aW50MzIpKC0xKSkKKwkJbnJvd3M9dGQtPnRkX2ltYWdlbGVuZ3RoOworCWlmICgodGQtPnRkX3BsYW5hcmNvbmZpZz09UExBTkFSQ09ORklHX0NPTlRJRykmJgorCSAgICAodGQtPnRkX3Bob3RvbWV0cmljID09IFBIT1RPTUVUUklDX1lDQkNSKSYmCisJICAgICghaXNVcFNhbXBsZWQodGlmKSkpCisJeworCQkvKgorCQkgKiBQYWNrZWQgWUNiQ3IgZGF0YSBjb250YWluIG9uZSBDYitDciBmb3IgZXZlcnkKKwkJICogSG9yaXpvbnRhbFNhbXBsaW5nKlZlcnRpY2FsU2FtcGxpbmcgWSB2YWx1ZXMuCisJCSAqIE11c3QgYWxzbyByb3VuZHVwIHdpZHRoIGFuZCBoZWlnaHQgd2hlbiBjYWxjdWxhdGluZworCQkgKiBzaW5jZSBpbWFnZXMgdGhhdCBhcmUgbm90IGEgbXVsdGlwbGUgb2YgdGhlCisJCSAqIGhvcml6b250YWwvdmVydGljYWwgc3Vic2FtcGxpbmcgYXJlYSBpbmNsdWRlCisJCSAqIFlDYkNyIGRhdGEgZm9yIHRoZSBleHRlbmRlZCBpbWFnZS4KKwkJICovCisJCXVpbnQxNiB5Y2JjcnN1YnNhbXBsaW5nWzJdOworCQl1aW50MTYgc2FtcGxpbmdibG9ja19zYW1wbGVzOworCQl1aW50MzIgc2FtcGxpbmdibG9ja3NfaG9yOworCQl1aW50MzIgc2FtcGxpbmdibG9ja3NfdmVyOworCQl1aW50NjQgc2FtcGxpbmdyb3dfc2FtcGxlczsKKwkJdWludDY0IHNhbXBsaW5ncm93X3NpemU7CisJCWlmKHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwhPTMpCisJCXsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwKKwkJCSAgICAiSW52YWxpZCB0ZF9zYW1wbGVzcGVycGl4ZWwgdmFsdWUiKTsKKwkJCXJldHVybiAwOworCQl9CisJCVRJRkZHZXRGaWVsZERlZmF1bHRlZCh0aWYsVElGRlRBR19ZQ0JDUlNVQlNBTVBMSU5HLHljYmNyc3Vic2FtcGxpbmcrMCwKKwkJICAgIHljYmNyc3Vic2FtcGxpbmcrMSk7CisJCWlmICgoeWNiY3JzdWJzYW1wbGluZ1swXSAhPSAxICYmIHljYmNyc3Vic2FtcGxpbmdbMF0gIT0gMiAmJiB5Y2JjcnN1YnNhbXBsaW5nWzBdICE9IDQpCisJCSAgICB8fCh5Y2JjcnN1YnNhbXBsaW5nWzFdICE9IDEgJiYgeWNiY3JzdWJzYW1wbGluZ1sxXSAhPSAyICYmIHljYmNyc3Vic2FtcGxpbmdbMV0gIT0gNCkpCisJCXsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwKKwkJCQkgICAgICJJbnZhbGlkIFlDYkNyIHN1YnNhbXBsaW5nICglZHglZCkiLCAKKwkJCQkgICAgIHljYmNyc3Vic2FtcGxpbmdbMF0sIAorCQkJCSAgICAgeWNiY3JzdWJzYW1wbGluZ1sxXSApOworCQkJcmV0dXJuIDA7CisJCX0KKwkJc2FtcGxpbmdibG9ja19zYW1wbGVzPXljYmNyc3Vic2FtcGxpbmdbMF0qeWNiY3JzdWJzYW1wbGluZ1sxXSsyOworCQlzYW1wbGluZ2Jsb2Nrc19ob3I9VElGRmhvd21hbnlfMzIodGQtPnRkX2ltYWdld2lkdGgseWNiY3JzdWJzYW1wbGluZ1swXSk7CisJCXNhbXBsaW5nYmxvY2tzX3Zlcj1USUZGaG93bWFueV8zMihucm93cyx5Y2JjcnN1YnNhbXBsaW5nWzFdKTsKKwkJc2FtcGxpbmdyb3dfc2FtcGxlcz1fVElGRk11bHRpcGx5NjQodGlmLHNhbXBsaW5nYmxvY2tzX2hvcixzYW1wbGluZ2Jsb2NrX3NhbXBsZXMsbW9kdWxlKTsKKwkJc2FtcGxpbmdyb3dfc2l6ZT1USUZGaG93bWFueThfNjQoX1RJRkZNdWx0aXBseTY0KHRpZixzYW1wbGluZ3Jvd19zYW1wbGVzLHRkLT50ZF9iaXRzcGVyc2FtcGxlLG1vZHVsZSkpOworCQlyZXR1cm4oX1RJRkZNdWx0aXBseTY0KHRpZixzYW1wbGluZ3Jvd19zaXplLHNhbXBsaW5nYmxvY2tzX3Zlcixtb2R1bGUpKTsKKwl9CisJZWxzZQorCQlyZXR1cm4oX1RJRkZNdWx0aXBseTY0KHRpZixucm93cyxUSUZGU2NhbmxpbmVTaXplNjQodGlmKSxtb2R1bGUpKTsKK30KK3Rtc2l6ZV90CitUSUZGVlN0cmlwU2l6ZShUSUZGKiB0aWYsIHVpbnQzMiBucm93cykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGVlN0cmlwU2l6ZSI7CisJdWludDY0IG07CisJdG1zaXplX3QgbjsKKwltPVRJRkZWU3RyaXBTaXplNjQodGlmLG5yb3dzKTsKKwluPSh0bXNpemVfdCltOworCWlmICgodWludDY0KW4hPW0pCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkludGVnZXIgb3ZlcmZsb3ciKTsKKwkJbj0wOworCX0KKwlyZXR1cm4obik7Cit9CisKKy8qCisgKiBDb21wdXRlIHRoZSAjIGJ5dGVzIGluIGEgcmF3IHN0cmlwLgorICovCit1aW50NjQKK1RJRkZSYXdTdHJpcFNpemU2NChUSUZGKiB0aWYsIHVpbnQzMiBzdHJpcCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGUmF3U3RyaXBTaXplNjQiOworCVRJRkZEaXJlY3RvcnkqIHRkID0gJnRpZi0+dGlmX2RpcjsKKwl1aW50NjQgYnl0ZWNvdW50ID0gdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3N0cmlwXTsKKworCWlmIChieXRlY291bnQgPT0gMCkKKwl7CisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAgIiVJNjR1OiBJbnZhbGlkIHN0cmlwIGJ5dGUgY291bnQsIHN0cmlwICVsdSIsCisJCQkgICAgICh1bnNpZ25lZCBfX2ludDY0KSBieXRlY291bnQsCisJCQkgICAgICh1bnNpZ25lZCBsb25nKSBzdHJpcCk7CisjZWxzZQorCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICAiJWxsdTogSW52YWxpZCBzdHJpcCBieXRlIGNvdW50LCBzdHJpcCAlbHUiLAorCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBieXRlY291bnQsCisJCQkgICAgICh1bnNpZ25lZCBsb25nKSBzdHJpcCk7CisjZW5kaWYKKwkJYnl0ZWNvdW50ID0gKHVpbnQ2NCkgLTE7CisJfQorCisJcmV0dXJuIGJ5dGVjb3VudDsKK30KK3Rtc2l6ZV90CitUSUZGUmF3U3RyaXBTaXplKFRJRkYqIHRpZiwgdWludDMyIHN0cmlwKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZSYXdTdHJpcFNpemUiOworCXVpbnQ2NCBtOworCXRtc2l6ZV90IG47CisJbT1USUZGUmF3U3RyaXBTaXplNjQodGlmLHN0cmlwKTsKKwlpZiAobT09KHVpbnQ2NCkoLTEpKQorCQluPSh0bXNpemVfdCkoLTEpOworCWVsc2UKKwl7CisJCW49KHRtc2l6ZV90KW07CisJCWlmICgodWludDY0KW4hPW0pCisJCXsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiSW50ZWdlciBvdmVyZmxvdyIpOworCQkJbj0wOworCQl9CisJfQorCXJldHVybihuKTsKK30KKworLyoKKyAqIENvbXB1dGUgdGhlICMgYnl0ZXMgaW4gYSAocm93LWFsaWduZWQpIHN0cmlwLgorICoKKyAqIE5vdGUgdGhhdCBpZiBSb3dzUGVyU3RyaXAgaXMgbGFyZ2VyIHRoYW4gdGhlCisgKiByZWNvcmRlZCBJbWFnZUxlbmd0aCwgdGhlbiB0aGUgc3RyaXAgc2l6ZSBpcworICogdHJ1bmNhdGVkIHRvIHJlZmxlY3QgdGhlIGFjdHVhbCBzcGFjZSByZXF1aXJlZAorICogdG8gaG9sZCB0aGUgc3RyaXAuCisgKi8KK3VpbnQ2NAorVElGRlN0cmlwU2l6ZTY0KFRJRkYqIHRpZikKK3sKKwlUSUZGRGlyZWN0b3J5KiB0ZCA9ICZ0aWYtPnRpZl9kaXI7CisJdWludDMyIHJwcyA9IHRkLT50ZF9yb3dzcGVyc3RyaXA7CisJaWYgKHJwcyA+IHRkLT50ZF9pbWFnZWxlbmd0aCkKKwkJcnBzID0gdGQtPnRkX2ltYWdlbGVuZ3RoOworCXJldHVybiAoVElGRlZTdHJpcFNpemU2NCh0aWYsIHJwcykpOworfQordG1zaXplX3QKK1RJRkZTdHJpcFNpemUoVElGRiogdGlmKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZTdHJpcFNpemUiOworCXVpbnQ2NCBtOworCXRtc2l6ZV90IG47CisJbT1USUZGU3RyaXBTaXplNjQodGlmKTsKKwluPSh0bXNpemVfdCltOworCWlmICgodWludDY0KW4hPW0pCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkludGVnZXIgb3ZlcmZsb3ciKTsKKwkJbj0wOworCX0KKwlyZXR1cm4obik7Cit9CisKKy8qCisgKiBDb21wdXRlIGEgZGVmYXVsdCBzdHJpcCBzaXplIGJhc2VkIG9uIHRoZSBpbWFnZQorICogY2hhcmFjdGVyaXN0aWNzIGFuZCBhIHJlcXVlc3RlZCB2YWx1ZS4gIElmIHRoZQorICogcmVxdWVzdCBpcyA8MSB0aGVuIHdlIGNob29zZSBhIHN0cmlwIHNpemUgYWNjb3JkaW5nCisgKiB0byBjZXJ0YWluIGhldXJpc3RpY3MuCisgKi8KK3VpbnQzMgorVElGRkRlZmF1bHRTdHJpcFNpemUoVElGRiogdGlmLCB1aW50MzIgcmVxdWVzdCkKK3sKKwlyZXR1cm4gKCp0aWYtPnRpZl9kZWZzdHJpcHNpemUpKHRpZiwgcmVxdWVzdCk7Cit9CisKK3VpbnQzMgorX1RJRkZEZWZhdWx0U3RyaXBTaXplKFRJRkYqIHRpZiwgdWludDMyIHMpCit7CisJaWYgKChpbnQzMikgcyA8IDEpIHsKKwkJLyoKKwkJICogSWYgUm93c1BlclN0cmlwIGlzIHVuc3BlY2lmaWVkLCB0cnkgdG8gYnJlYWsgdGhlCisJCSAqIGltYWdlIHVwIGludG8gc3RyaXBzIHRoYXQgYXJlIGFwcHJveGltYXRlbHkKKwkJICogU1RSSVBfU0laRV9ERUZBVUxUIGJ5dGVzIGxvbmcuCisJCSAqLworCQl1aW50NjQgc2NhbmxpbmVzaXplOworCQl1aW50NjQgcm93czsKKwkJc2NhbmxpbmVzaXplPVRJRkZTY2FubGluZVNpemU2NCh0aWYpOworCQlpZiAoc2NhbmxpbmVzaXplPT0wKQorCQkJc2NhbmxpbmVzaXplPTE7CisJCXJvd3M9KHVpbnQ2NClTVFJJUF9TSVpFX0RFRkFVTFQvc2NhbmxpbmVzaXplOworCQlpZiAocm93cz09MCkKKwkJCXJvd3M9MTsKKwkJZWxzZSBpZiAocm93cz4weEZGRkZGRkZGKQorCQkJcm93cz0weEZGRkZGRkZGOworCQlzPSh1aW50MzIpcm93czsKKwl9CisJcmV0dXJuIChzKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQvd3JpdGUgaW4gYSBjYWxsIHRvCisgKiBvbmUgb2YgdGhlIHNjYW5saW5lLW9yaWVudGVkIGkvbyByb3V0aW5lcy4gIE5vdGUgdGhhdAorICogdGhpcyBudW1iZXIgbWF5IGJlIDEvc2FtcGxlcy1wZXItcGl4ZWwgaWYgZGF0YSBpcworICogc3RvcmVkIGFzIHNlcGFyYXRlIHBsYW5lcy4KKyAqIFRoZSBTY2FubGluZVNpemUgaW4gY2FzZSBvZiBZQ2JDclN1YnNhbXBsaW5nIGlzIGRlZmluZWQgYXMgdGhlCisgKiBzdHJpcCBzaXplIGRpdmlkZWQgYnkgdGhlIHN0cmlwIGhlaWdodCwgaS5lLiB0aGUgc2l6ZSBvZiBhIHBhY2sgb2YgdmVydGljYWwKKyAqIHN1YnNhbXBsaW5nIGxpbmVzIGRpdmlkZWQgYnkgdmVydGljYWwgc3Vic2FtcGxpbmcuIEl0IHNob3VsZCB0aHVzIG1ha2UKKyAqIHNlbnNlIHdoZW4gbXVsdGlwbGllZCBieSBhIG11bHRpcGxlIG9mIHZlcnRpY2FsIHN1YnNhbXBsaW5nLgorICovCit1aW50NjQKK1RJRkZTY2FubGluZVNpemU2NChUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRlNjYW5saW5lU2l6ZTY0IjsKKwlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisJdWludDY0IHNjYW5saW5lX3NpemU7CisJaWYgKHRkLT50ZF9wbGFuYXJjb25maWc9PVBMQU5BUkNPTkZJR19DT05USUcpCisJeworCQlpZiAoKHRkLT50ZF9waG90b21ldHJpYz09UEhPVE9NRVRSSUNfWUNCQ1IpJiYKKwkJICAgICh0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsPT0zKSYmCisJCSAgICAoIWlzVXBTYW1wbGVkKHRpZikpKQorCQl7CisJCQl1aW50MTYgeWNiY3JzdWJzYW1wbGluZ1syXTsKKwkJCXVpbnQxNiBzYW1wbGluZ2Jsb2NrX3NhbXBsZXM7CisJCQl1aW50MzIgc2FtcGxpbmdibG9ja3NfaG9yOworCQkJdWludDY0IHNhbXBsaW5ncm93X3NhbXBsZXM7CisJCQl1aW50NjQgc2FtcGxpbmdyb3dfc2l6ZTsKKwkJCWlmKHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwhPTMpCisJCQl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCB0ZF9zYW1wbGVzcGVycGl4ZWwgdmFsdWUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwkJCX0KKwkJCVRJRkZHZXRGaWVsZERlZmF1bHRlZCh0aWYsVElGRlRBR19ZQ0JDUlNVQlNBTVBMSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHljYmNyc3Vic2FtcGxpbmcrMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5Y2JjcnN1YnNhbXBsaW5nKzEpOworCQkJaWYgKCgoeWNiY3JzdWJzYW1wbGluZ1swXSE9MSkmJih5Y2JjcnN1YnNhbXBsaW5nWzBdIT0yKSYmKHljYmNyc3Vic2FtcGxpbmdbMF0hPTQpKSB8fAorCQkJICAgICgoeWNiY3JzdWJzYW1wbGluZ1sxXSE9MSkmJih5Y2JjcnN1YnNhbXBsaW5nWzFdIT0yKSYmKHljYmNyc3Vic2FtcGxpbmdbMV0hPTQpKSkKKwkJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFlDYkNyIHN1YnNhbXBsaW5nIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJCQl9CisJCQlzYW1wbGluZ2Jsb2NrX3NhbXBsZXMgPSB5Y2JjcnN1YnNhbXBsaW5nWzBdKnljYmNyc3Vic2FtcGxpbmdbMV0rMjsKKwkJCXNhbXBsaW5nYmxvY2tzX2hvciA9IFRJRkZob3dtYW55XzMyKHRkLT50ZF9pbWFnZXdpZHRoLHljYmNyc3Vic2FtcGxpbmdbMF0pOworCQkJc2FtcGxpbmdyb3dfc2FtcGxlcyA9IF9USUZGTXVsdGlwbHk2NCh0aWYsc2FtcGxpbmdibG9ja3NfaG9yLHNhbXBsaW5nYmxvY2tfc2FtcGxlcyxtb2R1bGUpOworCQkJc2FtcGxpbmdyb3dfc2l6ZSA9IFRJRkZob3dtYW55XzY0KF9USUZGTXVsdGlwbHk2NCh0aWYsc2FtcGxpbmdyb3dfc2FtcGxlcyx0ZC0+dGRfYml0c3BlcnNhbXBsZSxtb2R1bGUpLDgpOworCQkJc2NhbmxpbmVfc2l6ZSA9IChzYW1wbGluZ3Jvd19zaXplL3ljYmNyc3Vic2FtcGxpbmdbMV0pOworCQl9CisJCWVsc2UKKwkJeworCQkJdWludDY0IHNjYW5saW5lX3NhbXBsZXM7CisJCQlzY2FubGluZV9zYW1wbGVzPV9USUZGTXVsdGlwbHk2NCh0aWYsdGQtPnRkX2ltYWdld2lkdGgsdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCxtb2R1bGUpOworCQkJc2NhbmxpbmVfc2l6ZT1USUZGaG93bWFueV82NChfVElGRk11bHRpcGx5NjQodGlmLHNjYW5saW5lX3NhbXBsZXMsdGQtPnRkX2JpdHNwZXJzYW1wbGUsbW9kdWxlKSw4KTsKKwkJfQorCX0KKwllbHNlCisgICAgICAgIHsKKwkJc2NhbmxpbmVfc2l6ZT1USUZGaG93bWFueV82NChfVElGRk11bHRpcGx5NjQodGlmLHRkLT50ZF9pbWFnZXdpZHRoLHRkLT50ZF9iaXRzcGVyc2FtcGxlLG1vZHVsZSksOCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNjYW5saW5lX3NpemUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiQ29tcHV0ZWQgc2NhbmxpbmUgc2l6ZSBpcyB6ZXJvIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKwlyZXR1cm4oc2NhbmxpbmVfc2l6ZSk7Cit9Cit0bXNpemVfdAorVElGRlNjYW5saW5lU2l6ZShUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRlNjYW5saW5lU2l6ZSI7CisJdWludDY0IG07CisJdG1zaXplX3QgbjsKKwltPVRJRkZTY2FubGluZVNpemU2NCh0aWYpOworCW49KHRtc2l6ZV90KW07CisJaWYgKCh1aW50NjQpbiE9bSkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkludGVnZXIgYXJpdGhtZXRpYyBvdmVyZmxvdyIpOworCQluPTA7CisJfQorCXJldHVybihuKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIHN0b3JlIGEgY29tcGxldGUKKyAqIGRlY29kZWQgYW5kIHBhY2tlZCByYXN0ZXIgc2NhbmxpbmUgKGFzIG9wcG9zZWQgdG8gdGhlCisgKiBJL08gc2l6ZSByZXR1cm5lZCBieSBUSUZGU2NhbmxpbmVTaXplIHdoaWNoIG1heSBiZSBsZXNzCisgKiBpZiBkYXRhIGlzIHN0b3JlIGFzIHNlcGFyYXRlIHBsYW5lcykuCisgKi8KK3VpbnQ2NAorVElGRlJhc3RlclNjYW5saW5lU2l6ZTY0KFRJRkYqIHRpZikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGUmFzdGVyU2NhbmxpbmVTaXplNjQiOworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKwl1aW50NjQgc2NhbmxpbmU7CisKKwlzY2FubGluZSA9IF9USUZGTXVsdGlwbHk2NCh0aWYsIHRkLT50ZF9iaXRzcGVyc2FtcGxlLCB0ZC0+dGRfaW1hZ2V3aWR0aCwgbW9kdWxlKTsKKwlpZiAodGQtPnRkX3BsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfQ09OVElHKSB7CisJCXNjYW5saW5lID0gX1RJRkZNdWx0aXBseTY0KHRpZiwgc2NhbmxpbmUsIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwsIG1vZHVsZSk7CisJCXJldHVybiAoVElGRmhvd21hbnk4XzY0KHNjYW5saW5lKSk7CisJfSBlbHNlCisJCXJldHVybiAoX1RJRkZNdWx0aXBseTY0KHRpZiwgVElGRmhvd21hbnk4XzY0KHNjYW5saW5lKSwKKwkJICAgIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwsIG1vZHVsZSkpOworfQordG1zaXplX3QKK1RJRkZSYXN0ZXJTY2FubGluZVNpemUoVElGRiogdGlmKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZSYXN0ZXJTY2FubGluZVNpemUiOworCXVpbnQ2NCBtOworCXRtc2l6ZV90IG47CisJbT1USUZGUmFzdGVyU2NhbmxpbmVTaXplNjQodGlmKTsKKwluPSh0bXNpemVfdCltOworCWlmICgodWludDY0KW4hPW0pCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkludGVnZXIgYXJpdGhtZXRpYyBvdmVyZmxvdyIpOworCQluPTA7CisJfQorCXJldHVybihuKTsKK30KKworLyogdmltOiBzZXQgdHM9OCBzdHM9OCBzdz04IG5vZXQ6ICovCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9zd2FiLmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9zd2FiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM3ZTMzZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3N3YWIuYwpAQCAtMCwwICsxLDMxMCBAQAorLyogJElkOiB0aWZfc3dhYi5jLHYgMS4xMyAyMDEwLTAzLTEwIDE4OjU2OjQ5IGJmcmllc2VuIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisvKgorICogVElGRiBMaWJyYXJ5IEJpdCAmIEJ5dGUgU3dhcHBpbmcgU3VwcG9ydC4KKyAqCisgKiBYWFggV2UgYXNzdW1lIHNob3J0ID0gMTYtYml0cyBhbmQgbG9uZyA9IDMyLWJpdHMgWFhYCisgKi8KKyNpbmNsdWRlICJ0aWZmaW9wLmgiCisKKyNpZm5kZWYgVElGRlN3YWJTaG9ydAordm9pZAorVElGRlN3YWJTaG9ydCh1aW50MTYqIHdwKQoreworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIqIGNwID0gKHVuc2lnbmVkIGNoYXIqKSB3cDsKKwl1bnNpZ25lZCBjaGFyIHQ7CisJYXNzZXJ0KHNpemVvZih1aW50MTYpPT0yKTsKKwl0ID0gY3BbMV07IGNwWzFdID0gY3BbMF07IGNwWzBdID0gdDsKK30KKyNlbmRpZgorCisjaWZuZGVmIFRJRkZTd2FiTG9uZwordm9pZAorVElGRlN3YWJMb25nKHVpbnQzMiogbHApCit7CisJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciogY3AgPSAodW5zaWduZWQgY2hhciopIGxwOworCXVuc2lnbmVkIGNoYXIgdDsKKwlhc3NlcnQoc2l6ZW9mKHVpbnQzMik9PTQpOworCXQgPSBjcFszXTsgY3BbM10gPSBjcFswXTsgY3BbMF0gPSB0OworCXQgPSBjcFsyXTsgY3BbMl0gPSBjcFsxXTsgY3BbMV0gPSB0OworfQorI2VuZGlmCisKKyNpZm5kZWYgVElGRlN3YWJMb25nOAordm9pZAorVElGRlN3YWJMb25nOCh1aW50NjQqIGxwKQoreworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIqIGNwID0gKHVuc2lnbmVkIGNoYXIqKSBscDsKKwl1bnNpZ25lZCBjaGFyIHQ7CisJYXNzZXJ0KHNpemVvZih1aW50NjQpPT04KTsKKwl0ID0gY3BbN107IGNwWzddID0gY3BbMF07IGNwWzBdID0gdDsKKwl0ID0gY3BbNl07IGNwWzZdID0gY3BbMV07IGNwWzFdID0gdDsKKwl0ID0gY3BbNV07IGNwWzVdID0gY3BbMl07IGNwWzJdID0gdDsKKwl0ID0gY3BbNF07IGNwWzRdID0gY3BbM107IGNwWzNdID0gdDsKK30KKyNlbmRpZgorCisjaWZuZGVmIFRJRkZTd2FiQXJyYXlPZlNob3J0Cit2b2lkCitUSUZGU3dhYkFycmF5T2ZTaG9ydChyZWdpc3RlciB1aW50MTYqIHdwLCB0bXNpemVfdCBuKQoreworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIqIGNwOworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgdDsKKwlhc3NlcnQoc2l6ZW9mKHVpbnQxNik9PTIpOworCS8qIFhYWCB1bnJvbGwgbG9vcCBzb21lICovCisJd2hpbGUgKG4tLSA+IDApIHsKKwkJY3AgPSAodW5zaWduZWQgY2hhciopIHdwOworCQl0ID0gY3BbMV07IGNwWzFdID0gY3BbMF07IGNwWzBdID0gdDsKKwkJd3ArKzsKKwl9Cit9CisjZW5kaWYKKworI2lmbmRlZiBUSUZGU3dhYkFycmF5T2ZUcmlwbGVzCit2b2lkCitUSUZGU3dhYkFycmF5T2ZUcmlwbGVzKHJlZ2lzdGVyIHVpbnQ4KiB0cCwgdG1zaXplX3QgbikKK3sKKwl1bnNpZ25lZCBjaGFyKiBjcDsKKwl1bnNpZ25lZCBjaGFyIHQ7CisKKwkvKiBYWFggdW5yb2xsIGxvb3Agc29tZSAqLworCXdoaWxlIChuLS0gPiAwKSB7CisJCWNwID0gKHVuc2lnbmVkIGNoYXIqKSB0cDsKKwkJdCA9IGNwWzJdOyBjcFsyXSA9IGNwWzBdOyBjcFswXSA9IHQ7CisJCXRwICs9IDM7CisJfQorfQorI2VuZGlmCisKKyNpZm5kZWYgVElGRlN3YWJBcnJheU9mTG9uZwordm9pZAorVElGRlN3YWJBcnJheU9mTG9uZyhyZWdpc3RlciB1aW50MzIqIGxwLCB0bXNpemVfdCBuKQoreworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKmNwOworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgdDsKKwlhc3NlcnQoc2l6ZW9mKHVpbnQzMik9PTQpOworCS8qIFhYWCB1bnJvbGwgbG9vcCBzb21lICovCisJd2hpbGUgKG4tLSA+IDApIHsKKwkJY3AgPSAodW5zaWduZWQgY2hhciAqKWxwOworCQl0ID0gY3BbM107IGNwWzNdID0gY3BbMF07IGNwWzBdID0gdDsKKwkJdCA9IGNwWzJdOyBjcFsyXSA9IGNwWzFdOyBjcFsxXSA9IHQ7CisJCWxwKys7CisJfQorfQorI2VuZGlmCisKKyNpZm5kZWYgVElGRlN3YWJBcnJheU9mTG9uZzgKK3ZvaWQKK1RJRkZTd2FiQXJyYXlPZkxvbmc4KHJlZ2lzdGVyIHVpbnQ2NCogbHAsIHRtc2l6ZV90IG4pCit7CisJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqY3A7CisJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciB0OworCWFzc2VydChzaXplb2YodWludDY0KT09OCk7CisJLyogWFhYIHVucm9sbCBsb29wIHNvbWUgKi8KKwl3aGlsZSAobi0tID4gMCkgeworCQljcCA9ICh1bnNpZ25lZCBjaGFyICopbHA7CisJCXQgPSBjcFs3XTsgY3BbN10gPSBjcFswXTsgY3BbMF0gPSB0OworCQl0ID0gY3BbNl07IGNwWzZdID0gY3BbMV07IGNwWzFdID0gdDsKKwkJdCA9IGNwWzVdOyBjcFs1XSA9IGNwWzJdOyBjcFsyXSA9IHQ7CisJCXQgPSBjcFs0XTsgY3BbNF0gPSBjcFszXTsgY3BbM10gPSB0OworCQlscCsrOworCX0KK30KKyNlbmRpZgorCisjaWZuZGVmIFRJRkZTd2FiRmxvYXQKK3ZvaWQKK1RJRkZTd2FiRmxvYXQoZmxvYXQqIGZwKQoreworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIqIGNwID0gKHVuc2lnbmVkIGNoYXIqKSBmcDsKKwl1bnNpZ25lZCBjaGFyIHQ7CisJYXNzZXJ0KHNpemVvZihmbG9hdCk9PTQpOworCXQgPSBjcFszXTsgY3BbM10gPSBjcFswXTsgY3BbMF0gPSB0OworCXQgPSBjcFsyXTsgY3BbMl0gPSBjcFsxXTsgY3BbMV0gPSB0OworfQorI2VuZGlmCisKKyNpZm5kZWYgVElGRlN3YWJBcnJheU9mRmxvYXQKK3ZvaWQKK1RJRkZTd2FiQXJyYXlPZkZsb2F0KHJlZ2lzdGVyIGZsb2F0KiBmcCwgdG1zaXplX3QgbikKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBjaGFyICpjcDsKKwlyZWdpc3RlciB1bnNpZ25lZCBjaGFyIHQ7CisJYXNzZXJ0KHNpemVvZihmbG9hdCk9PTQpOworCS8qIFhYWCB1bnJvbGwgbG9vcCBzb21lICovCisJd2hpbGUgKG4tLSA+IDApIHsKKwkJY3AgPSAodW5zaWduZWQgY2hhciAqKWZwOworCQl0ID0gY3BbM107IGNwWzNdID0gY3BbMF07IGNwWzBdID0gdDsKKwkJdCA9IGNwWzJdOyBjcFsyXSA9IGNwWzFdOyBjcFsxXSA9IHQ7CisJCWZwKys7CisJfQorfQorI2VuZGlmCisKKyNpZm5kZWYgVElGRlN3YWJEb3VibGUKK3ZvaWQKK1RJRkZTd2FiRG91YmxlKGRvdWJsZSAqZHApCit7CisJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciogY3AgPSAodW5zaWduZWQgY2hhciopIGRwOworCXVuc2lnbmVkIGNoYXIgdDsKKwlhc3NlcnQoc2l6ZW9mKGRvdWJsZSk9PTgpOworCXQgPSBjcFs3XTsgY3BbN10gPSBjcFswXTsgY3BbMF0gPSB0OworCXQgPSBjcFs2XTsgY3BbNl0gPSBjcFsxXTsgY3BbMV0gPSB0OworCXQgPSBjcFs1XTsgY3BbNV0gPSBjcFsyXTsgY3BbMl0gPSB0OworCXQgPSBjcFs0XTsgY3BbNF0gPSBjcFszXTsgY3BbM10gPSB0OworfQorI2VuZGlmCisKKyNpZm5kZWYgVElGRlN3YWJBcnJheU9mRG91YmxlCit2b2lkCitUSUZGU3dhYkFycmF5T2ZEb3VibGUoZG91YmxlKiBkcCwgdG1zaXplX3QgbikKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBjaGFyICpjcDsKKwlyZWdpc3RlciB1bnNpZ25lZCBjaGFyIHQ7CisJYXNzZXJ0KHNpemVvZihkb3VibGUpPT04KTsKKwkvKiBYWFggdW5yb2xsIGxvb3Agc29tZSAqLworCXdoaWxlIChuLS0gPiAwKSB7CisJCWNwID0gKHVuc2lnbmVkIGNoYXIgKilkcDsKKwkJdCA9IGNwWzddOyBjcFs3XSA9IGNwWzBdOyBjcFswXSA9IHQ7CisJCXQgPSBjcFs2XTsgY3BbNl0gPSBjcFsxXTsgY3BbMV0gPSB0OworCQl0ID0gY3BbNV07IGNwWzVdID0gY3BbMl07IGNwWzJdID0gdDsKKwkJdCA9IGNwWzRdOyBjcFs0XSA9IGNwWzNdOyBjcFszXSA9IHQ7CisJCWRwKys7CisJfQorfQorI2VuZGlmCisKKy8qCisgKiBCaXQgcmV2ZXJzYWwgdGFibGVzLiAgVElGRkJpdFJldlRhYmxlWzxieXRlPl0gZ2l2ZXMKKyAqIHRoZSBiaXQgcmV2ZXJzZWQgdmFsdWUgb2YgPGJ5dGU+LiAgVXNlZCBpbiB2YXJpb3VzCisgKiBwbGFjZXMgaW4gdGhlIGxpYnJhcnkgd2hlbiB0aGUgRmlsbE9yZGVyIHJlcXVpcmVzCisgKiBiaXQgcmV2ZXJzYWwgb2YgYnl0ZSB2YWx1ZXMgKGUuZy4gQ0NJVFQgRmF4IDMKKyAqIGVuY29kaW5nL2RlY29kaW5nKS4gIFRJRkZOb0JpdFJldlRhYmxlIGlzIHByb3ZpZGVkCisgKiBmb3IgYWxnb3JpdGhtcyB0aGF0IHdhbnQgYW4gZXF1aXZhbGVudCB0YWJsZSB0aGF0CisgKiBkbyBub3QgcmV2ZXJzZSBiaXQgdmFsdWVzLgorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBUSUZGQml0UmV2VGFibGVbMjU2XSA9IHsKKyAgICAweDAwLCAweDgwLCAweDQwLCAweGMwLCAweDIwLCAweGEwLCAweDYwLCAweGUwLAorICAgIDB4MTAsIDB4OTAsIDB4NTAsIDB4ZDAsIDB4MzAsIDB4YjAsIDB4NzAsIDB4ZjAsCisgICAgMHgwOCwgMHg4OCwgMHg0OCwgMHhjOCwgMHgyOCwgMHhhOCwgMHg2OCwgMHhlOCwKKyAgICAweDE4LCAweDk4LCAweDU4LCAweGQ4LCAweDM4LCAweGI4LCAweDc4LCAweGY4LAorICAgIDB4MDQsIDB4ODQsIDB4NDQsIDB4YzQsIDB4MjQsIDB4YTQsIDB4NjQsIDB4ZTQsCisgICAgMHgxNCwgMHg5NCwgMHg1NCwgMHhkNCwgMHgzNCwgMHhiNCwgMHg3NCwgMHhmNCwKKyAgICAweDBjLCAweDhjLCAweDRjLCAweGNjLCAweDJjLCAweGFjLCAweDZjLCAweGVjLAorICAgIDB4MWMsIDB4OWMsIDB4NWMsIDB4ZGMsIDB4M2MsIDB4YmMsIDB4N2MsIDB4ZmMsCisgICAgMHgwMiwgMHg4MiwgMHg0MiwgMHhjMiwgMHgyMiwgMHhhMiwgMHg2MiwgMHhlMiwKKyAgICAweDEyLCAweDkyLCAweDUyLCAweGQyLCAweDMyLCAweGIyLCAweDcyLCAweGYyLAorICAgIDB4MGEsIDB4OGEsIDB4NGEsIDB4Y2EsIDB4MmEsIDB4YWEsIDB4NmEsIDB4ZWEsCisgICAgMHgxYSwgMHg5YSwgMHg1YSwgMHhkYSwgMHgzYSwgMHhiYSwgMHg3YSwgMHhmYSwKKyAgICAweDA2LCAweDg2LCAweDQ2LCAweGM2LCAweDI2LCAweGE2LCAweDY2LCAweGU2LAorICAgIDB4MTYsIDB4OTYsIDB4NTYsIDB4ZDYsIDB4MzYsIDB4YjYsIDB4NzYsIDB4ZjYsCisgICAgMHgwZSwgMHg4ZSwgMHg0ZSwgMHhjZSwgMHgyZSwgMHhhZSwgMHg2ZSwgMHhlZSwKKyAgICAweDFlLCAweDllLCAweDVlLCAweGRlLCAweDNlLCAweGJlLCAweDdlLCAweGZlLAorICAgIDB4MDEsIDB4ODEsIDB4NDEsIDB4YzEsIDB4MjEsIDB4YTEsIDB4NjEsIDB4ZTEsCisgICAgMHgxMSwgMHg5MSwgMHg1MSwgMHhkMSwgMHgzMSwgMHhiMSwgMHg3MSwgMHhmMSwKKyAgICAweDA5LCAweDg5LCAweDQ5LCAweGM5LCAweDI5LCAweGE5LCAweDY5LCAweGU5LAorICAgIDB4MTksIDB4OTksIDB4NTksIDB4ZDksIDB4MzksIDB4YjksIDB4NzksIDB4ZjksCisgICAgMHgwNSwgMHg4NSwgMHg0NSwgMHhjNSwgMHgyNSwgMHhhNSwgMHg2NSwgMHhlNSwKKyAgICAweDE1LCAweDk1LCAweDU1LCAweGQ1LCAweDM1LCAweGI1LCAweDc1LCAweGY1LAorICAgIDB4MGQsIDB4OGQsIDB4NGQsIDB4Y2QsIDB4MmQsIDB4YWQsIDB4NmQsIDB4ZWQsCisgICAgMHgxZCwgMHg5ZCwgMHg1ZCwgMHhkZCwgMHgzZCwgMHhiZCwgMHg3ZCwgMHhmZCwKKyAgICAweDAzLCAweDgzLCAweDQzLCAweGMzLCAweDIzLCAweGEzLCAweDYzLCAweGUzLAorICAgIDB4MTMsIDB4OTMsIDB4NTMsIDB4ZDMsIDB4MzMsIDB4YjMsIDB4NzMsIDB4ZjMsCisgICAgMHgwYiwgMHg4YiwgMHg0YiwgMHhjYiwgMHgyYiwgMHhhYiwgMHg2YiwgMHhlYiwKKyAgICAweDFiLCAweDliLCAweDViLCAweGRiLCAweDNiLCAweGJiLCAweDdiLCAweGZiLAorICAgIDB4MDcsIDB4ODcsIDB4NDcsIDB4YzcsIDB4MjcsIDB4YTcsIDB4NjcsIDB4ZTcsCisgICAgMHgxNywgMHg5NywgMHg1NywgMHhkNywgMHgzNywgMHhiNywgMHg3NywgMHhmNywKKyAgICAweDBmLCAweDhmLCAweDRmLCAweGNmLCAweDJmLCAweGFmLCAweDZmLCAweGVmLAorICAgIDB4MWYsIDB4OWYsIDB4NWYsIDB4ZGYsIDB4M2YsIDB4YmYsIDB4N2YsIDB4ZmYKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBUSUZGTm9CaXRSZXZUYWJsZVsyNTZdID0geworICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIAorICAgIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIAorICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIAorICAgIDB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIAorICAgIDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIAorICAgIDB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIAorICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIAorICAgIDB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIAorICAgIDB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIAorICAgIDB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIAorICAgIDB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIAorICAgIDB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIAorICAgIDB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIAorICAgIDB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIAorICAgIDB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIAorICAgIDB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIAorICAgIDB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIAorICAgIDB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIAorICAgIDB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIAorICAgIDB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIAorICAgIDB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIAorICAgIDB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIAorICAgIDB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIAorICAgIDB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIAorICAgIDB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIAorICAgIDB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIAorICAgIDB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIAorICAgIDB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIAorICAgIDB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIAorICAgIDB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIAorICAgIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIAorICAgIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIAorfTsKKworY29uc3QgdW5zaWduZWQgY2hhcioKK1RJRkZHZXRCaXRSZXZUYWJsZShpbnQgcmV2ZXJzZWQpCit7CisJcmV0dXJuIChyZXZlcnNlZCA/IFRJRkZCaXRSZXZUYWJsZSA6IFRJRkZOb0JpdFJldlRhYmxlKTsKK30KKwordm9pZAorVElGRlJldmVyc2VCaXRzKHVpbnQ4KiBjcCwgdG1zaXplX3QgbikgIAoreworCWZvciAoOyBuID4gODsgbiAtPSA4KSB7CisJCWNwWzBdID0gVElGRkJpdFJldlRhYmxlW2NwWzBdXTsKKwkJY3BbMV0gPSBUSUZGQml0UmV2VGFibGVbY3BbMV1dOworCQljcFsyXSA9IFRJRkZCaXRSZXZUYWJsZVtjcFsyXV07CisJCWNwWzNdID0gVElGRkJpdFJldlRhYmxlW2NwWzNdXTsKKwkJY3BbNF0gPSBUSUZGQml0UmV2VGFibGVbY3BbNF1dOworCQljcFs1XSA9IFRJRkZCaXRSZXZUYWJsZVtjcFs1XV07CisJCWNwWzZdID0gVElGRkJpdFJldlRhYmxlW2NwWzZdXTsKKwkJY3BbN10gPSBUSUZGQml0UmV2VGFibGVbY3BbN11dOworCQljcCArPSA4OworCX0KKwl3aGlsZSAobi0tID4gMCkKKwkJKmNwID0gVElGRkJpdFJldlRhYmxlWypjcF0sIGNwKys7Cit9CisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTggc3c9OCBub2V0OiAqLworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfdGh1bmRlci5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfdGh1bmRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MDg5MWMKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl90aHVuZGVyLmMKQEAgLTAsMCArMSwyMDcgQEAKKy8qICRJZDogdGlmX3RodW5kZXIuYyx2IDEuMTIgMjAxMS0wNC0wMiAyMDo1NDowOSBiZnJpZXNlbiBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCAKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgorICogU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcy4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSAKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTQU0gTEVGRkxFUiBPUiBTSUxJQ09OIEdSQVBISUNTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgKiBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgKiBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GIAorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSAKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgInRpZmZpb3AuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpZmRlZiBUSFVOREVSX1NVUFBPUlQKKy8qCisgKiBUSUZGIExpYnJhcnkuCisgKgorICogVGh1bmRlclNjYW4gNC1iaXQgQ29tcHJlc3Npb24gQWxnb3JpdGhtIFN1cHBvcnQKKyAqLworCisvKgorICogVGh1bmRlclNjYW4gdXNlcyBhbiBlbmNvZGluZyBzY2hlbWUgZGVzaWduZWQgZm9yCisgKiA0LWJpdCBwaXhlbCB2YWx1ZXMuICBEYXRhIGlzIGVuY29kZWQgaW4gYnl0ZXMsIHdpdGgKKyAqIGVhY2ggYnl0ZSBzcGxpdCBpbnRvIGEgMi1iaXQgY29kZSB3b3JkIGFuZCBhIDYtYml0CisgKiBkYXRhIHZhbHVlLiAgVGhlIGVuY29kaW5nIGdpdmVzIHJhdyBkYXRhLCBydW5zIG9mCisgKiBwaXhlbHMsIG9yIHBpeGVsIHZhbHVlcyBlbmNvZGVkIGFzIGEgZGVsdGEgZnJvbSB0aGUKKyAqIHByZXZpb3VzIHBpeGVsIHZhbHVlLiAgRm9yIHRoZSBsYXR0ZXIsIGVpdGhlciAyLWJpdAorICogb3IgMy1iaXQgZGVsdGEgdmFsdWVzIGFyZSB1c2VkLCB3aXRoIHRoZSBkZWx0YXMgcGFja2VkCisgKiBpbnRvIGEgc2luZ2xlIGJ5dGUuCisgKi8KKyNkZWZpbmUJVEhVTkRFUl9EQVRBCQkweDNmCS8qIG1hc2sgZm9yIDYtYml0IGRhdGEgKi8KKyNkZWZpbmUJVEhVTkRFUl9DT0RFCQkweGMwCS8qIG1hc2sgZm9yIDItYml0IGNvZGUgd29yZCAqLworLyogY29kZSB2YWx1ZXMgKi8KKyNkZWZpbmUJVEhVTkRFUl9SVU4JCTB4MDAJLyogcnVuIG9mIHBpeGVscyB3LyBlbmNvZGVkIGNvdW50ICovCisjZGVmaW5lCVRIVU5ERVJfMkJJVERFTFRBUwkweDQwCS8qIDMgcGl4ZWxzIHcvIGVuY29kZWQgMi1iaXQgZGVsdGFzICovCisjZGVmaW5lCSAgICBERUxUQTJfU0tJUAkJMgkvKiBza2lwIGNvZGUgZm9yIDItYml0IGRlbHRhcyAqLworI2RlZmluZQlUSFVOREVSXzNCSVRERUxUQVMJMHg4MAkvKiAyIHBpeGVscyB3LyBlbmNvZGVkIDMtYml0IGRlbHRhcyAqLworI2RlZmluZQkgICAgREVMVEEzX1NLSVAJCTQJLyogc2tpcCBjb2RlIGZvciAzLWJpdCBkZWx0YXMgKi8KKyNkZWZpbmUJVEhVTkRFUl9SQVcJCTB4YzAJLyogcmF3IGRhdGEgZW5jb2RlZCAqLworCitzdGF0aWMgY29uc3QgaW50IHR3b2JpdGRlbHRhc1s0XSA9IHsgMCwgMSwgMCwgLTEgfTsKK3N0YXRpYyBjb25zdCBpbnQgdGhyZWViaXRkZWx0YXNbOF0gPSB7IDAsIDEsIDIsIDMsIDAsIC0zLCAtMiwgLTEgfTsKKworI2RlZmluZQlTRVRQSVhFTChvcCwgdikgeyAgICAgICAgICAgICAgICAgICAgIFwKKwlsYXN0cGl4ZWwgPSAodikgJiAweGY7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCBucGl4ZWxzIDwgbWF4cGl4ZWxzICkgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgaWYgKG5waXhlbHMrKyAmIDEpICAgICAgICAgICAgICAgICAgXAorCSAgICAqb3ArKyB8PSBsYXN0cGl4ZWw7ICAgICAgICAgICAgICAgXAorCSAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICBvcFswXSA9ICh1aW50OCkgKGxhc3RwaXhlbCA8PCA0KTsgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworc3RhdGljIGludAorVGh1bmRlclNldHVwRGVjb2RlKFRJRkYqIHRpZikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUaHVuZGVyU2V0dXBEZWNvZGUiOworCisgICAgICAgIGlmKCB0aWYtPnRpZl9kaXIudGRfYml0c3BlcnNhbXBsZSAhPSA0ICkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXcm9uZyBiaXRzcGVyc2FtcGxlIHZhbHVlICglZCksIFRodW5kZXIgZGVjb2RlciBvbmx5IHN1cHBvcnRzIDRiaXRzIHBlciBzYW1wbGUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgdGlmLT50aWZfZGlyLnRkX2JpdHNwZXJzYW1wbGUgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAKKworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbnQKK1RodW5kZXJEZWNvZGUoVElGRiogdGlmLCB1aW50OCogb3AsIHRtc2l6ZV90IG1heHBpeGVscykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUaHVuZGVyRGVjb2RlIjsKKwlyZWdpc3RlciB1bnNpZ25lZCBjaGFyICpicDsKKwlyZWdpc3RlciB0bXNpemVfdCBjYzsKKwl1bnNpZ25lZCBpbnQgbGFzdHBpeGVsOworCXRtc2l6ZV90IG5waXhlbHM7CisKKwlicCA9ICh1bnNpZ25lZCBjaGFyICopdGlmLT50aWZfcmF3Y3A7CisJY2MgPSB0aWYtPnRpZl9yYXdjYzsKKwlsYXN0cGl4ZWwgPSAwOworCW5waXhlbHMgPSAwOworCXdoaWxlIChjYyA+IDAgJiYgbnBpeGVscyA8IG1heHBpeGVscykgeworCQlpbnQgbiwgZGVsdGE7CisKKwkJbiA9ICpicCsrLCBjYy0tOworCQlzd2l0Y2ggKG4gJiBUSFVOREVSX0NPREUpIHsKKwkJY2FzZSBUSFVOREVSX1JVTjoJCS8qIHBpeGVsIHJ1biAqLworCQkJLyoKKwkJCSAqIFJlcGxpY2F0ZSB0aGUgbGFzdCBwaXhlbCBuIHRpbWVzLAorCQkJICogd2hlcmUgbiBpcyB0aGUgbG93ZXItb3JkZXIgNiBiaXRzLgorCQkJICovCisJCQlpZiAobnBpeGVscyAmIDEpIHsKKwkJCQlvcFswXSB8PSBsYXN0cGl4ZWw7CisJCQkJbGFzdHBpeGVsID0gKm9wKys7IG5waXhlbHMrKzsgbi0tOworCQkJfSBlbHNlCisJCQkJbGFzdHBpeGVsIHw9IGxhc3RwaXhlbCA8PCA0OworCQkJbnBpeGVscyArPSBuOworCQkJaWYgKG5waXhlbHMgPCBtYXhwaXhlbHMpIHsKKwkJCQlmb3IgKDsgbiA+IDA7IG4gLT0gMikKKwkJCQkJKm9wKysgPSAodWludDgpIGxhc3RwaXhlbDsKKwkJCX0KKwkJCWlmIChuID09IC0xKQorCQkJCSotLW9wICY9IDB4ZjA7CisJCQlsYXN0cGl4ZWwgJj0gMHhmOworCQkJYnJlYWs7CisJCWNhc2UgVEhVTkRFUl8yQklUREVMVEFTOgkvKiAyLWJpdCBkZWx0YXMgKi8KKwkJCWlmICgoZGVsdGEgPSAoKG4gPj4gNCkgJiAzKSkgIT0gREVMVEEyX1NLSVApCisJCQkJU0VUUElYRUwob3AsIGxhc3RwaXhlbCArIHR3b2JpdGRlbHRhc1tkZWx0YV0pOworCQkJaWYgKChkZWx0YSA9ICgobiA+PiAyKSAmIDMpKSAhPSBERUxUQTJfU0tJUCkKKwkJCQlTRVRQSVhFTChvcCwgbGFzdHBpeGVsICsgdHdvYml0ZGVsdGFzW2RlbHRhXSk7CisJCQlpZiAoKGRlbHRhID0gKG4gJiAzKSkgIT0gREVMVEEyX1NLSVApCisJCQkJU0VUUElYRUwob3AsIGxhc3RwaXhlbCArIHR3b2JpdGRlbHRhc1tkZWx0YV0pOworCQkJYnJlYWs7CisJCWNhc2UgVEhVTkRFUl8zQklUREVMVEFTOgkvKiAzLWJpdCBkZWx0YXMgKi8KKwkJCWlmICgoZGVsdGEgPSAoKG4gPj4gMykgJiA3KSkgIT0gREVMVEEzX1NLSVApCisJCQkJU0VUUElYRUwob3AsIGxhc3RwaXhlbCArIHRocmVlYml0ZGVsdGFzW2RlbHRhXSk7CisJCQlpZiAoKGRlbHRhID0gKG4gJiA3KSkgIT0gREVMVEEzX1NLSVApCisJCQkJU0VUUElYRUwob3AsIGxhc3RwaXhlbCArIHRocmVlYml0ZGVsdGFzW2RlbHRhXSk7CisJCQlicmVhazsKKwkJY2FzZSBUSFVOREVSX1JBVzoJCS8qIHJhdyBkYXRhICovCisJCQlTRVRQSVhFTChvcCwgbik7CisJCQlicmVhazsKKwkJfQorCX0KKwl0aWYtPnRpZl9yYXdjcCA9ICh1aW50OCopIGJwOworCXRpZi0+dGlmX3Jhd2NjID0gY2M7CisJaWYgKG5waXhlbHMgIT0gbWF4cGl4ZWxzKSB7CisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAgIiVzIGRhdGEgYXQgc2NhbmxpbmUgJWx1ICglSTY0dSAhPSAlSTY0dSkiLAorCQkJICAgICBucGl4ZWxzIDwgbWF4cGl4ZWxzID8gIk5vdCBlbm91Z2giIDogIlRvbyBtdWNoIiwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX3JvdywKKwkJCSAgICAgKHVuc2lnbmVkIF9faW50NjQpIG5waXhlbHMsCisJCQkgICAgICh1bnNpZ25lZCBfX2ludDY0KSBtYXhwaXhlbHMpOworI2Vsc2UKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAgIiVzIGRhdGEgYXQgc2NhbmxpbmUgJWx1ICglbGx1ICE9ICVsbHUpIiwKKwkJCSAgICAgbnBpeGVscyA8IG1heHBpeGVscyA/ICJOb3QgZW5vdWdoIiA6ICJUb28gbXVjaCIsCisJCQkgICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3csCisJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIG5waXhlbHMsCisJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIG1heHBpeGVscyk7CisjZW5kaWYKKwkJcmV0dXJuICgwKTsKKwl9CisKKyAgICAgICAgcmV0dXJuICgxKTsKK30KKworc3RhdGljIGludAorVGh1bmRlckRlY29kZVJvdyhUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IG9jYywgdWludDE2IHMpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVGh1bmRlckRlY29kZVJvdyI7CisJdWludDgqIHJvdyA9IGJ1ZjsKKwkKKwkodm9pZCkgczsKKwlpZiAob2NjICUgdGlmLT50aWZfc2NhbmxpbmVzaXplKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIkZyYWN0aW9uYWwgc2NhbmxpbmVzIGNhbm5vdCBiZSByZWFkIik7CisJCXJldHVybiAoMCk7CisJfQorCXdoaWxlIChvY2MgPiAwKSB7CisJCWlmICghVGh1bmRlckRlY29kZSh0aWYsIHJvdywgdGlmLT50aWZfZGlyLnRkX2ltYWdld2lkdGgpKQorCQkJcmV0dXJuICgwKTsKKwkJb2NjIC09IHRpZi0+dGlmX3NjYW5saW5lc2l6ZTsKKwkJcm93ICs9IHRpZi0+dGlmX3NjYW5saW5lc2l6ZTsKKwl9CisJcmV0dXJuICgxKTsKK30KKworaW50CitUSUZGSW5pdFRodW5kZXJTY2FuKFRJRkYqIHRpZiwgaW50IHNjaGVtZSkKK3sKKwkodm9pZCkgc2NoZW1lOworCisgICAgICAgIHRpZi0+dGlmX3NldHVwZGVjb2RlID0gVGh1bmRlclNldHVwRGVjb2RlOworCXRpZi0+dGlmX2RlY29kZXJvdyA9IFRodW5kZXJEZWNvZGVSb3c7CisJdGlmLT50aWZfZGVjb2Rlc3RyaXAgPSBUaHVuZGVyRGVjb2RlUm93OyAKKwlyZXR1cm4gKDEpOworfQorI2VuZGlmIC8qIFRIVU5ERVJfU1VQUE9SVCAqLworCisvKiB2aW06IHNldCB0cz04IHN0cz04IHN3PTggbm9ldDogKi8KKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOiBjCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogZmlsbC1jb2x1bW46IDc4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3RpbGUuYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3RpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODhlMTY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfdGlsZS5jCkBAIC0wLDAgKzEsMzIyIEBACisvKiAkSWQ6IHRpZl90aWxlLmMsdiAxLjI0IDIwMTUtMDYtMDcgMjI6MzU6NDAgYmZyaWVzZW4gRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNhbSBMZWZmbGVyCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEtMTk5NyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgKiB0aGF0IChpKSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisgKiBhbGwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uLCBhbmQgKGlpKSB0aGUgbmFtZXMgb2YKKyAqIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzIG1heSBub3QgYmUgdXNlZCBpbiBhbnkgYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCB0aGUgc3BlY2lmaWMsIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24gb2YgU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgCisgKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIAorICogSU4gTk8gRVZFTlQgU0hBTEwgU0FNIExFRkZMRVIgT1IgU0lMSUNPTiBHUkFQSElDUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELAorICogT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorICogV0hFVEhFUiBPUiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRiAKKyAqIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgCisgKiBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUSUZGIExpYnJhcnkuCisgKgorICogVGlsZWQgSW1hZ2UgU3VwcG9ydCBSb3V0aW5lcy4KKyAqLworI2luY2x1ZGUgInRpZmZpb3AuaCIKKworLyoKKyAqIENvbXB1dGUgd2hpY2ggdGlsZSBhbiAoeCx5LHoscykgdmFsdWUgaXMgaW4uCisgKi8KK3VpbnQzMgorVElGRkNvbXB1dGVUaWxlKFRJRkYqIHRpZiwgdWludDMyIHgsIHVpbnQzMiB5LCB1aW50MzIgeiwgdWludDE2IHMpCit7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCXVpbnQzMiBkeCA9IHRkLT50ZF90aWxld2lkdGg7CisJdWludDMyIGR5ID0gdGQtPnRkX3RpbGVsZW5ndGg7CisJdWludDMyIGR6ID0gdGQtPnRkX3RpbGVkZXB0aDsKKwl1aW50MzIgdGlsZSA9IDE7CisKKwlpZiAodGQtPnRkX2ltYWdlZGVwdGggPT0gMSkKKwkJeiA9IDA7CisJaWYgKGR4ID09ICh1aW50MzIpIC0xKQorCQlkeCA9IHRkLT50ZF9pbWFnZXdpZHRoOworCWlmIChkeSA9PSAodWludDMyKSAtMSkKKwkJZHkgPSB0ZC0+dGRfaW1hZ2VsZW5ndGg7CisJaWYgKGR6ID09ICh1aW50MzIpIC0xKQorCQlkeiA9IHRkLT50ZF9pbWFnZWRlcHRoOworCWlmIChkeCAhPSAwICYmIGR5ICE9IDAgJiYgZHogIT0gMCkgeworCQl1aW50MzIgeHB0ID0gVElGRmhvd21hbnlfMzIodGQtPnRkX2ltYWdld2lkdGgsIGR4KTsKKwkJdWludDMyIHlwdCA9IFRJRkZob3dtYW55XzMyKHRkLT50ZF9pbWFnZWxlbmd0aCwgZHkpOworCQl1aW50MzIgenB0ID0gVElGRmhvd21hbnlfMzIodGQtPnRkX2ltYWdlZGVwdGgsIGR6KTsKKworCQlpZiAodGQtPnRkX3BsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfU0VQQVJBVEUpIAorCQkJdGlsZSA9ICh4cHQqeXB0KnpwdCkqcyArCisJCQkgICAgICh4cHQqeXB0KSooei9keikgKworCQkJICAgICB4cHQqKHkvZHkpICsKKwkJCSAgICAgeC9keDsKKwkJZWxzZQorCQkJdGlsZSA9ICh4cHQqeXB0KSooei9keikgKyB4cHQqKHkvZHkpICsgeC9keDsKKwl9CisJcmV0dXJuICh0aWxlKTsKK30KKworLyoKKyAqIENoZWNrIGFuICh4LHkseixzKSBjb29yZGluYXRlCisgKiBhZ2FpbnN0IHRoZSBpbWFnZSBib3VuZHMuCisgKi8KK2ludAorVElGRkNoZWNrVGlsZShUSUZGKiB0aWYsIHVpbnQzMiB4LCB1aW50MzIgeSwgdWludDMyIHosIHVpbnQxNiBzKQoreworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKworCWlmICh4ID49IHRkLT50ZF9pbWFnZXdpZHRoKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCB0aWYtPnRpZl9uYW1lLAorCQkJICAgICAiJWx1OiBDb2wgb3V0IG9mIHJhbmdlLCBtYXggJWx1IiwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHgsCisJCQkgICAgICh1bnNpZ25lZCBsb25nKSAodGQtPnRkX2ltYWdld2lkdGggLSAxKSk7CisJCXJldHVybiAoMCk7CisJfQorCWlmICh5ID49IHRkLT50ZF9pbWFnZWxlbmd0aCkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgdGlmLT50aWZfbmFtZSwKKwkJCSAgICAgIiVsdTogUm93IG91dCBvZiByYW5nZSwgbWF4ICVsdSIsCisJCQkgICAgICh1bnNpZ25lZCBsb25nKSB5LAorCQkJICAgICAodW5zaWduZWQgbG9uZykgKHRkLT50ZF9pbWFnZWxlbmd0aCAtIDEpKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKHogPj0gdGQtPnRkX2ltYWdlZGVwdGgpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIHRpZi0+dGlmX25hbWUsCisJCQkgICAgICIlbHU6IERlcHRoIG91dCBvZiByYW5nZSwgbWF4ICVsdSIsCisJCQkgICAgICh1bnNpZ25lZCBsb25nKSB6LAorCQkJICAgICAodW5zaWduZWQgbG9uZykgKHRkLT50ZF9pbWFnZWRlcHRoIC0gMSkpOworCQlyZXR1cm4gKDApOworCX0KKwlpZiAodGQtPnRkX3BsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfU0VQQVJBVEUgJiYKKwkgICAgcyA+PSB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCB0aWYtPnRpZl9uYW1lLAorCQkJICAgICAiJWx1OiBTYW1wbGUgb3V0IG9mIHJhbmdlLCBtYXggJWx1IiwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHMsCisJCQkgICAgICh1bnNpZ25lZCBsb25nKSAodGQtPnRkX3NhbXBsZXNwZXJwaXhlbCAtIDEpKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIENvbXB1dGUgaG93IG1hbnkgdGlsZXMgYXJlIGluIGFuIGltYWdlLgorICovCit1aW50MzIKK1RJRkZOdW1iZXJPZlRpbGVzKFRJRkYqIHRpZikKK3sKKwlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisJdWludDMyIGR4ID0gdGQtPnRkX3RpbGV3aWR0aDsKKwl1aW50MzIgZHkgPSB0ZC0+dGRfdGlsZWxlbmd0aDsKKwl1aW50MzIgZHogPSB0ZC0+dGRfdGlsZWRlcHRoOworCXVpbnQzMiBudGlsZXM7CisKKwlpZiAoZHggPT0gKHVpbnQzMikgLTEpCisJCWR4ID0gdGQtPnRkX2ltYWdld2lkdGg7CisJaWYgKGR5ID09ICh1aW50MzIpIC0xKQorCQlkeSA9IHRkLT50ZF9pbWFnZWxlbmd0aDsKKwlpZiAoZHogPT0gKHVpbnQzMikgLTEpCisJCWR6ID0gdGQtPnRkX2ltYWdlZGVwdGg7CisJbnRpbGVzID0gKGR4ID09IDAgfHwgZHkgPT0gMCB8fCBkeiA9PSAwKSA/IDAgOgorCSAgICBfVElGRk11bHRpcGx5MzIodGlmLCBfVElGRk11bHRpcGx5MzIodGlmLCBUSUZGaG93bWFueV8zMih0ZC0+dGRfaW1hZ2V3aWR0aCwgZHgpLAorCSAgICBUSUZGaG93bWFueV8zMih0ZC0+dGRfaW1hZ2VsZW5ndGgsIGR5KSwKKwkgICAgIlRJRkZOdW1iZXJPZlRpbGVzIiksCisJICAgIFRJRkZob3dtYW55XzMyKHRkLT50ZF9pbWFnZWRlcHRoLCBkeiksICJUSUZGTnVtYmVyT2ZUaWxlcyIpOworCWlmICh0ZC0+dGRfcGxhbmFyY29uZmlnID09IFBMQU5BUkNPTkZJR19TRVBBUkFURSkKKwkJbnRpbGVzID0gX1RJRkZNdWx0aXBseTMyKHRpZiwgbnRpbGVzLCB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsLAorCQkgICAgIlRJRkZOdW1iZXJPZlRpbGVzIik7CisJcmV0dXJuIChudGlsZXMpOworfQorCisvKgorICogQ29tcHV0ZSB0aGUgIyBieXRlcyBpbiBlYWNoIHJvdyBvZiBhIHRpbGUuCisgKi8KK3VpbnQ2NAorVElGRlRpbGVSb3dTaXplNjQoVElGRiogdGlmKQoreworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGVGlsZVJvd1NpemU2NCI7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCXVpbnQ2NCByb3dzaXplOworCXVpbnQ2NCB0aWxlcm93c2l6ZTsKKworCWlmICh0ZC0+dGRfdGlsZWxlbmd0aCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJUaWxlIGxlbmd0aCBpcyB6ZXJvIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRkLT50ZF90aWxld2lkdGggPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiVGlsZSB3aWR0aCBpcyB6ZXJvIik7CisJCXJldHVybiAoMCk7CisgICAgICAgIH0KKwlyb3dzaXplID0gX1RJRkZNdWx0aXBseTY0KHRpZiwgdGQtPnRkX2JpdHNwZXJzYW1wbGUsIHRkLT50ZF90aWxld2lkdGgsCisJICAgICJUSUZGVGlsZVJvd1NpemUiKTsKKwlpZiAodGQtPnRkX3BsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfQ09OVElHKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIlNhbXBsZXMgcGVyIHBpeGVsIGlzIHplcm8iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKwkJcm93c2l6ZSA9IF9USUZGTXVsdGlwbHk2NCh0aWYsIHJvd3NpemUsIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwsCisJCSAgICAiVElGRlRpbGVSb3dTaXplIik7CisgICAgICAgIH0KKyAgICAgICAgdGlsZXJvd3NpemU9VElGRmhvd21hbnk4XzY0KHJvd3NpemUpOworICAgICAgICBpZiAodGlsZXJvd3NpemUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiQ29tcHV0ZWQgdGlsZSByb3cgc2l6ZSBpcyB6ZXJvIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKwlyZXR1cm4gKHRpbGVyb3dzaXplKTsKK30KK3Rtc2l6ZV90CitUSUZGVGlsZVJvd1NpemUoVElGRiogdGlmKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZUaWxlUm93U2l6ZSI7CisJdWludDY0IG07CisJdG1zaXplX3QgbjsKKwltPVRJRkZUaWxlUm93U2l6ZTY0KHRpZik7CisJbj0odG1zaXplX3QpbTsKKwlpZiAoKHVpbnQ2NCluIT1tKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJJbnRlZ2VyIG92ZXJmbG93Iik7CisJCW49MDsKKwl9CisJcmV0dXJuKG4pOworfQorCisvKgorICogQ29tcHV0ZSB0aGUgIyBieXRlcyBpbiBhIHZhcmlhYmxlIGxlbmd0aCwgcm93LWFsaWduZWQgdGlsZS4KKyAqLwordWludDY0CitUSUZGVlRpbGVTaXplNjQoVElGRiogdGlmLCB1aW50MzIgbnJvd3MpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRlZUaWxlU2l6ZTY0IjsKKwlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisJaWYgKHRkLT50ZF90aWxlbGVuZ3RoID09IDAgfHwgdGQtPnRkX3RpbGV3aWR0aCA9PSAwIHx8CisJICAgIHRkLT50ZF90aWxlZGVwdGggPT0gMCkKKwkJcmV0dXJuICgwKTsKKwlpZiAoKHRkLT50ZF9wbGFuYXJjb25maWc9PVBMQU5BUkNPTkZJR19DT05USUcpJiYKKwkgICAgKHRkLT50ZF9waG90b21ldHJpYz09UEhPVE9NRVRSSUNfWUNCQ1IpJiYKKwkgICAgKHRkLT50ZF9zYW1wbGVzcGVycGl4ZWw9PTMpJiYKKwkgICAgKCFpc1VwU2FtcGxlZCh0aWYpKSkKKwl7CisJCS8qCisJCSAqIFBhY2tlZCBZQ2JDciBkYXRhIGNvbnRhaW4gb25lIENiK0NyIGZvciBldmVyeQorCQkgKiBIb3Jpem9udGFsU2FtcGxpbmcqVmVydGljYWxTYW1wbGluZyBZIHZhbHVlcy4KKwkJICogTXVzdCBhbHNvIHJvdW5kdXAgd2lkdGggYW5kIGhlaWdodCB3aGVuIGNhbGN1bGF0aW5nCisJCSAqIHNpbmNlIGltYWdlcyB0aGF0IGFyZSBub3QgYSBtdWx0aXBsZSBvZiB0aGUKKwkJICogaG9yaXpvbnRhbC92ZXJ0aWNhbCBzdWJzYW1wbGluZyBhcmVhIGluY2x1ZGUKKwkJICogWUNiQ3IgZGF0YSBmb3IgdGhlIGV4dGVuZGVkIGltYWdlLgorCQkgKi8KKwkJdWludDE2IHljYmNyc3Vic2FtcGxpbmdbMl07CisJCXVpbnQxNiBzYW1wbGluZ2Jsb2NrX3NhbXBsZXM7CisJCXVpbnQzMiBzYW1wbGluZ2Jsb2Nrc19ob3I7CisJCXVpbnQzMiBzYW1wbGluZ2Jsb2Nrc192ZXI7CisJCXVpbnQ2NCBzYW1wbGluZ3Jvd19zYW1wbGVzOworCQl1aW50NjQgc2FtcGxpbmdyb3dfc2l6ZTsKKwkJVElGRkdldEZpZWxkRGVmYXVsdGVkKHRpZixUSUZGVEFHX1lDQkNSU1VCU0FNUExJTkcseWNiY3JzdWJzYW1wbGluZyswLAorCQkgICAgeWNiY3JzdWJzYW1wbGluZysxKTsKKwkJaWYgKCh5Y2JjcnN1YnNhbXBsaW5nWzBdICE9IDEgJiYgeWNiY3JzdWJzYW1wbGluZ1swXSAhPSAyICYmIHljYmNyc3Vic2FtcGxpbmdbMF0gIT0gNCkKKwkJICAgIHx8KHljYmNyc3Vic2FtcGxpbmdbMV0gIT0gMSAmJiB5Y2JjcnN1YnNhbXBsaW5nWzFdICE9IDIgJiYgeWNiY3JzdWJzYW1wbGluZ1sxXSAhPSA0KSkKKwkJeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLAorCQkJCSAgICAgIkludmFsaWQgWUNiQ3Igc3Vic2FtcGxpbmcgKCVkeCVkKSIsIAorCQkJCSAgICAgeWNiY3JzdWJzYW1wbGluZ1swXSwgCisJCQkJICAgICB5Y2JjcnN1YnNhbXBsaW5nWzFdICk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlzYW1wbGluZ2Jsb2NrX3NhbXBsZXM9eWNiY3JzdWJzYW1wbGluZ1swXSp5Y2JjcnN1YnNhbXBsaW5nWzFdKzI7CisJCXNhbXBsaW5nYmxvY2tzX2hvcj1USUZGaG93bWFueV8zMih0ZC0+dGRfdGlsZXdpZHRoLHljYmNyc3Vic2FtcGxpbmdbMF0pOworCQlzYW1wbGluZ2Jsb2Nrc192ZXI9VElGRmhvd21hbnlfMzIobnJvd3MseWNiY3JzdWJzYW1wbGluZ1sxXSk7CisJCXNhbXBsaW5ncm93X3NhbXBsZXM9X1RJRkZNdWx0aXBseTY0KHRpZixzYW1wbGluZ2Jsb2Nrc19ob3Isc2FtcGxpbmdibG9ja19zYW1wbGVzLG1vZHVsZSk7CisJCXNhbXBsaW5ncm93X3NpemU9VElGRmhvd21hbnk4XzY0KF9USUZGTXVsdGlwbHk2NCh0aWYsc2FtcGxpbmdyb3dfc2FtcGxlcyx0ZC0+dGRfYml0c3BlcnNhbXBsZSxtb2R1bGUpKTsKKwkJcmV0dXJuKF9USUZGTXVsdGlwbHk2NCh0aWYsc2FtcGxpbmdyb3dfc2l6ZSxzYW1wbGluZ2Jsb2Nrc192ZXIsbW9kdWxlKSk7CisJfQorCWVsc2UKKwkJcmV0dXJuKF9USUZGTXVsdGlwbHk2NCh0aWYsbnJvd3MsVElGRlRpbGVSb3dTaXplNjQodGlmKSxtb2R1bGUpKTsKK30KK3Rtc2l6ZV90CitUSUZGVlRpbGVTaXplKFRJRkYqIHRpZiwgdWludDMyIG5yb3dzKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZWVGlsZVNpemUiOworCXVpbnQ2NCBtOworCXRtc2l6ZV90IG47CisJbT1USUZGVlRpbGVTaXplNjQodGlmLG5yb3dzKTsKKwluPSh0bXNpemVfdCltOworCWlmICgodWludDY0KW4hPW0pCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkludGVnZXIgb3ZlcmZsb3ciKTsKKwkJbj0wOworCX0KKwlyZXR1cm4obik7Cit9CisKKy8qCisgKiBDb21wdXRlIHRoZSAjIGJ5dGVzIGluIGEgcm93LWFsaWduZWQgdGlsZS4KKyAqLwordWludDY0CitUSUZGVGlsZVNpemU2NChUSUZGKiB0aWYpCit7CisJcmV0dXJuIChUSUZGVlRpbGVTaXplNjQodGlmLCB0aWYtPnRpZl9kaXIudGRfdGlsZWxlbmd0aCkpOworfQordG1zaXplX3QKK1RJRkZUaWxlU2l6ZShUSUZGKiB0aWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRlRpbGVTaXplIjsKKwl1aW50NjQgbTsKKwl0bXNpemVfdCBuOworCW09VElGRlRpbGVTaXplNjQodGlmKTsKKwluPSh0bXNpemVfdCltOworCWlmICgodWludDY0KW4hPW0pCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkludGVnZXIgb3ZlcmZsb3ciKTsKKwkJbj0wOworCX0KKwlyZXR1cm4obik7Cit9CisKKy8qCisgKiBDb21wdXRlIGEgZGVmYXVsdCB0aWxlIHNpemUgYmFzZWQgb24gdGhlIGltYWdlCisgKiBjaGFyYWN0ZXJpc3RpY3MgYW5kIGEgcmVxdWVzdGVkIHZhbHVlLiAgSWYgYQorICogcmVxdWVzdCBpcyA8MSB0aGVuIHdlIGNob29zZSBhIHNpemUgYWNjb3JkaW5nCisgKiB0byBjZXJ0YWluIGhldXJpc3RpY3MuCisgKi8KK3ZvaWQKK1RJRkZEZWZhdWx0VGlsZVNpemUoVElGRiogdGlmLCB1aW50MzIqIHR3LCB1aW50MzIqIHRoKQoreworCSgqdGlmLT50aWZfZGVmdGlsZXNpemUpKHRpZiwgdHcsIHRoKTsKK30KKwordm9pZAorX1RJRkZEZWZhdWx0VGlsZVNpemUoVElGRiogdGlmLCB1aW50MzIqIHR3LCB1aW50MzIqIHRoKQoreworCSh2b2lkKSB0aWY7CisJaWYgKCooaW50MzIqKSB0dyA8IDEpCisJCSp0dyA9IDI1NjsKKwlpZiAoKihpbnQzMiopIHRoIDwgMSkKKwkJKnRoID0gMjU2OworCS8qIHJvdW5kdXAgdG8gYSBtdWx0aXBsZSBvZiAxNiBwZXIgdGhlIHNwZWMgKi8KKwlpZiAoKnR3ICYgMHhmKQorCQkqdHcgPSBUSUZGcm91bmR1cF8zMigqdHcsIDE2KTsKKwlpZiAoKnRoICYgMHhmKQorCQkqdGggPSBUSUZGcm91bmR1cF8zMigqdGgsIDE2KTsKK30KKworLyogdmltOiBzZXQgdHM9OCBzdHM9OCBzdz04IG5vZXQ6ICovCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl92ZXJzaW9uLmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl92ZXJzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkyYzg0MwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3ZlcnNpb24uYwpAQCAtMCwwICsxLDQwIEBACisvKiAkSGVhZGVyOiAvY3ZzL21hcHRvb2xzL2N2c3Jvb3QvbGlidGlmZi9saWJ0aWZmL3RpZl92ZXJzaW9uLmMsdiAxLjMgMjAxMC0wMy0xMCAxODo1Njo0OSBiZnJpZXNlbiBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5Mi0xOTk3IFNhbSBMZWZmbGVyCisgKiBDb3B5cmlnaHQgKGMpIDE5OTItMTk5NyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgKiB0aGF0IChpKSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisgKiBhbGwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uLCBhbmQgKGlpKSB0aGUgbmFtZXMgb2YKKyAqIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzIG1heSBub3QgYmUgdXNlZCBpbiBhbnkgYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCB0aGUgc3BlY2lmaWMsIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24gb2YgU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgCisgKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIAorICogSU4gTk8gRVZFTlQgU0hBTEwgU0FNIExFRkZMRVIgT1IgU0lMSUNPTiBHUkFQSElDUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELAorICogT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorICogV0hFVEhFUiBPUiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRiAKKyAqIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgCisgKiBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAidGlmZmlvcC5oIgorCitzdGF0aWMgY29uc3QgY2hhciBUSUZGVmVyc2lvbltdID0gVElGRkxJQl9WRVJTSU9OX1NUUjsKKworY29uc3QgY2hhcioKK1RJRkZHZXRWZXJzaW9uKHZvaWQpCit7CisJcmV0dXJuIChUSUZGVmVyc2lvbik7Cit9CisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl93YXJuaW5nLmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl93YXJuaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIzYjYzNgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3dhcm5pbmcuYwpAQCAtMCwwICsxLDgxIEBACisvKiAkSGVhZGVyOiAvY3ZzL21hcHRvb2xzL2N2c3Jvb3QvbGlidGlmZi9saWJ0aWZmL3RpZl93YXJuaW5nLmMsdiAxLjMgMjAxMC0wMy0xMCAxODo1Njo0OSBiZnJpZXNlbiBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCAKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgorICogU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcy4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSAKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTQU0gTEVGRkxFUiBPUiBTSUxJQ09OIEdSQVBISUNTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgKiBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgKiBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GIAorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSAKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRJRkYgTGlicmFyeS4KKyAqLworI2luY2x1ZGUgInRpZmZpb3AuaCIKKworVElGRkVycm9ySGFuZGxlckV4dCBfVElGRndhcm5pbmdIYW5kbGVyRXh0ID0gTlVMTDsKKworVElGRkVycm9ySGFuZGxlcgorVElGRlNldFdhcm5pbmdIYW5kbGVyKFRJRkZFcnJvckhhbmRsZXIgaGFuZGxlcikKK3sKKwlUSUZGRXJyb3JIYW5kbGVyIHByZXYgPSBfVElGRndhcm5pbmdIYW5kbGVyOworCV9USUZGd2FybmluZ0hhbmRsZXIgPSBoYW5kbGVyOworCXJldHVybiAocHJldik7Cit9CisKK1RJRkZFcnJvckhhbmRsZXJFeHQKK1RJRkZTZXRXYXJuaW5nSGFuZGxlckV4dChUSUZGRXJyb3JIYW5kbGVyRXh0IGhhbmRsZXIpCit7CisJVElGRkVycm9ySGFuZGxlckV4dCBwcmV2ID0gX1RJRkZ3YXJuaW5nSGFuZGxlckV4dDsKKwlfVElGRndhcm5pbmdIYW5kbGVyRXh0ID0gaGFuZGxlcjsKKwlyZXR1cm4gKHByZXYpOworfQorCit2b2lkCitUSUZGV2FybmluZyhjb25zdCBjaGFyKiBtb2R1bGUsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJdmFfc3RhcnQoYXAsIGZtdCk7CisJaWYgKF9USUZGd2FybmluZ0hhbmRsZXIpCisJCSgqX1RJRkZ3YXJuaW5nSGFuZGxlcikobW9kdWxlLCBmbXQsIGFwKTsKKwlpZiAoX1RJRkZ3YXJuaW5nSGFuZGxlckV4dCkKKwkJKCpfVElGRndhcm5pbmdIYW5kbGVyRXh0KSgwLCBtb2R1bGUsIGZtdCwgYXApOworCXZhX2VuZChhcCk7Cit9CisKK3ZvaWQKK1RJRkZXYXJuaW5nRXh0KHRoYW5kbGVfdCBmZCwgY29uc3QgY2hhciogbW9kdWxlLCBjb25zdCBjaGFyKiBmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCWlmIChfVElGRndhcm5pbmdIYW5kbGVyKQorCQkoKl9USUZGd2FybmluZ0hhbmRsZXIpKG1vZHVsZSwgZm10LCBhcCk7CisJaWYgKF9USUZGd2FybmluZ0hhbmRsZXJFeHQpCisJCSgqX1RJRkZ3YXJuaW5nSGFuZGxlckV4dCkoZmQsIG1vZHVsZSwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKK30KKworCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl93cml0ZS5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfd3JpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTk2YzMxCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfd3JpdGUuYwpAQCAtMCwwICsxLDc5MyBAQAorLyogJElkOiB0aWZfd3JpdGUuYyx2IDEuNDIgMjAxNS0wNi0wNyAyMzowMDoyMyBiZnJpZXNlbiBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWQorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIFRJRkYgTGlicmFyeS4KKyAqCisgKiBTY2FubGluZS1vcmllbnRlZCBXcml0ZSBTdXBwb3J0CisgKi8KKyNpbmNsdWRlICJ0aWZmaW9wLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2RlZmluZSBTVFJJUElOQ1IJMjAJCS8qIGV4cGFuc2lvbiBmYWN0b3Igb24gc3RyaXAgYXJyYXkgKi8KKworI2RlZmluZSBXUklURUNIRUNLU1RSSVBTKHRpZiwgbW9kdWxlKQkJCQlcCisJKCgodGlmKS0+dGlmX2ZsYWdzJlRJRkZfQkVFTldSSVRJTkcpIHx8IFRJRkZXcml0ZUNoZWNrKCh0aWYpLDAsbW9kdWxlKSkKKyNkZWZpbmUgV1JJVEVDSEVDS1RJTEVTKHRpZiwgbW9kdWxlKQkJCQlcCisJKCgodGlmKS0+dGlmX2ZsYWdzJlRJRkZfQkVFTldSSVRJTkcpIHx8IFRJRkZXcml0ZUNoZWNrKCh0aWYpLDEsbW9kdWxlKSkKKyNkZWZpbmUgQlVGRkVSQ0hFQ0sodGlmKQkJCQkJXAorCSgoKCh0aWYpLT50aWZfZmxhZ3MgJiBUSUZGX0JVRkZFUlNFVFVQKSAmJiB0aWYtPnRpZl9yYXdkYXRhKSB8fAlcCisJICAgIFRJRkZXcml0ZUJ1ZmZlclNldHVwKCh0aWYpLCBOVUxMLCAodG1zaXplX3QpIC0xKSkKKworc3RhdGljIGludCBUSUZGR3Jvd1N0cmlwcyhUSUZGKiB0aWYsIHVpbnQzMiBkZWx0YSwgY29uc3QgY2hhciogbW9kdWxlKTsKK3N0YXRpYyBpbnQgVElGRkFwcGVuZFRvU3RyaXAoVElGRiogdGlmLCB1aW50MzIgc3RyaXAsIHVpbnQ4KiBkYXRhLCB0bXNpemVfdCBjYyk7CisKK2ludAorVElGRldyaXRlU2NhbmxpbmUoVElGRiogdGlmLCB2b2lkKiBidWYsIHVpbnQzMiByb3csIHVpbnQxNiBzYW1wbGUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRldyaXRlU2NhbmxpbmUiOworCXJlZ2lzdGVyIFRJRkZEaXJlY3RvcnkgKnRkOworCWludCBzdGF0dXMsIGltYWdlZ3JldyA9IDA7CisJdWludDMyIHN0cmlwOworCisJaWYgKCFXUklURUNIRUNLU1RSSVBTKHRpZiwgbW9kdWxlKSkKKwkJcmV0dXJuICgtMSk7CisJLyoKKwkgKiBIYW5kbGUgZGVsYXllZCBhbGxvY2F0aW9uIG9mIGRhdGEgYnVmZmVyLiAgVGhpcworCSAqIHBlcm1pdHMgaXQgdG8gYmUgc2l6ZWQgbW9yZSBpbnRlbGxpZ2VudGx5ICh1c2luZworCSAqIGRpcmVjdG9yeSBpbmZvcm1hdGlvbikuCisJICovCisJaWYgKCFCVUZGRVJDSEVDSyh0aWYpKQorCQlyZXR1cm4gKC0xKTsKKyAgICAgICAgdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9CVUY0V1JJVEU7IC8qIG5vdCBzdHJpY3RseSBzdXJlIHRoaXMgaXMgcmlnaHQqLworCisJdGQgPSAmdGlmLT50aWZfZGlyOworCS8qCisJICogRXh0ZW5kIGltYWdlIGxlbmd0aCBpZiBuZWVkZWQKKwkgKiAoYnV0IG9ubHkgZm9yIFBsYW5hckNvbmZpZz0xKS4KKwkgKi8KKwlpZiAocm93ID49IHRkLT50ZF9pbWFnZWxlbmd0aCkgewkvKiBleHRlbmQgaW1hZ2UgKi8KKwkJaWYgKHRkLT50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX1NFUEFSQVRFKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICJDYW4gbm90IGNoYW5nZSBcIkltYWdlTGVuZ3RoXCIgd2hlbiB1c2luZyBzZXBhcmF0ZSBwbGFuZXMiKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisJCXRkLT50ZF9pbWFnZWxlbmd0aCA9IHJvdysxOworCQlpbWFnZWdyZXcgPSAxOworCX0KKwkvKgorCSAqIENhbGN1bGF0ZSBzdHJpcCBhbmQgY2hlY2sgZm9yIGNyb3NzaW5ncy4KKwkgKi8KKwlpZiAodGQtPnRkX3BsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfU0VQQVJBVEUpIHsKKwkJaWYgKHNhbXBsZSA+PSB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICIlbHU6IFNhbXBsZSBvdXQgb2YgcmFuZ2UsIG1heCAlbHUiLAorCQkJICAgICh1bnNpZ25lZCBsb25nKSBzYW1wbGUsICh1bnNpZ25lZCBsb25nKSB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisJCXN0cmlwID0gc2FtcGxlKnRkLT50ZF9zdHJpcHNwZXJpbWFnZSArIHJvdy90ZC0+dGRfcm93c3BlcnN0cmlwOworCX0gZWxzZQorCQlzdHJpcCA9IHJvdyAvIHRkLT50ZF9yb3dzcGVyc3RyaXA7CisJLyoKKwkgKiBDaGVjayBzdHJpcCBhcnJheSB0byBtYWtlIHN1cmUgdGhlcmUncyBzcGFjZS4gV2UgZG9uJ3Qgc3VwcG9ydAorCSAqIGR5bmFtaWNhbGx5IGdyb3dpbmcgZmlsZXMgdGhhdCBoYXZlIGRhdGEgb3JnYW5pemVkIGluIHNlcGFyYXRlCisJICogYml0cGxhbmVzIGJlY2F1c2UgaXQncyB0b28gcGFpbmZ1bC4gIEluIHRoYXQgY2FzZSB3ZSByZXF1aXJlIHRoYXQKKwkgKiB0aGUgaW1hZ2VsZW5ndGggYmUgc2V0IHByb3Blcmx5IGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgKHNvIHRoYXQgdGhlCisJICogc3RyaXBzIGFycmF5IHdpbGwgYmUgZnVsbHkgYWxsb2NhdGVkIGFib3ZlKS4KKwkgKi8KKwlpZiAoc3RyaXAgPj0gdGQtPnRkX25zdHJpcHMgJiYgIVRJRkZHcm93U3RyaXBzKHRpZiwgMSwgbW9kdWxlKSkKKwkJcmV0dXJuICgtMSk7CisJaWYgKHN0cmlwICE9IHRpZi0+dGlmX2N1cnN0cmlwKSB7CisJCS8qCisJCSAqIENoYW5naW5nIHN0cmlwcyAtLSBmbHVzaCBhbnkgZGF0YSBwcmVzZW50LgorCQkgKi8KKwkJaWYgKCFUSUZGRmx1c2hEYXRhKHRpZikpCisJCQlyZXR1cm4gKC0xKTsKKwkJdGlmLT50aWZfY3Vyc3RyaXAgPSBzdHJpcDsKKwkJLyoKKwkJICogV2F0Y2ggb3V0IGZvciBhIGdyb3dpbmcgaW1hZ2UuICBUaGUgdmFsdWUgb2Ygc3RyaXBzL2ltYWdlCisJCSAqIHdpbGwgaW5pdGlhbGx5IGJlIDEgKHNpbmNlIGl0IGNhbid0IGJlIGRlZHVjZWQgdW50aWwgdGhlCisJCSAqIGltYWdlbGVuZ3RoIGlzIGtub3duKS4KKwkJICovCisJCWlmIChzdHJpcCA+PSB0ZC0+dGRfc3RyaXBzcGVyaW1hZ2UgJiYgaW1hZ2VncmV3KQorCQkJdGQtPnRkX3N0cmlwc3BlcmltYWdlID0KKwkJCSAgICBUSUZGaG93bWFueV8zMih0ZC0+dGRfaW1hZ2VsZW5ndGgsdGQtPnRkX3Jvd3NwZXJzdHJpcCk7CisgICAgICAgICAgICAgICAgaWYgKHRkLT50ZF9zdHJpcHNwZXJpbWFnZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiWmVybyBzdHJpcHMgcGVyIGltYWdlIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKC0xKTsKKyAgICAgICAgICAgICAgICB9CisJCXRpZi0+dGlmX3JvdyA9CisJCSAgICAoc3RyaXAgJSB0ZC0+dGRfc3RyaXBzcGVyaW1hZ2UpICogdGQtPnRkX3Jvd3NwZXJzdHJpcDsKKwkJaWYgKCh0aWYtPnRpZl9mbGFncyAmIFRJRkZfQ09ERVJTRVRVUCkgPT0gMCkgeworCQkJaWYgKCEoKnRpZi0+dGlmX3NldHVwZW5jb2RlKSh0aWYpKQorCQkJCXJldHVybiAoLTEpOworCQkJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9DT0RFUlNFVFVQOworCQl9CisgICAgICAgIAorCQl0aWYtPnRpZl9yYXdjYyA9IDA7CisJCXRpZi0+dGlmX3Jhd2NwID0gdGlmLT50aWZfcmF3ZGF0YTsKKworCQlpZiggdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3N0cmlwXSA+IDAgKQorCQl7CisJCQkvKiBpZiB3ZSBhcmUgd3JpdGluZyBvdmVyIGV4aXN0aW5nIHRpbGVzLCB6ZXJvIGxlbmd0aCAqLworCQkJdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3N0cmlwXSA9IDA7CisKKwkJCS8qIHRoaXMgZm9yY2VzIFRJRkZBcHBlbmRUb1N0cmlwKCkgdG8gZG8gYSBzZWVrICovCisJCQl0aWYtPnRpZl9jdXJvZmYgPSAwOworCQl9CisKKwkJaWYgKCEoKnRpZi0+dGlmX3ByZWVuY29kZSkodGlmLCBzYW1wbGUpKQorCQkJcmV0dXJuICgtMSk7CisJCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfUE9TVEVOQ09ERTsKKwl9CisJLyoKKwkgKiBFbnN1cmUgdGhlIHdyaXRlIGlzIGVpdGhlciBzZXF1ZW50aWFsIG9yIGF0IHRoZQorCSAqIGJlZ2lubmluZyBvZiBhIHN0cmlwIChvciB0aGF0IHdlIGNhbiByYW5kb21seQorCSAqIGFjY2VzcyB0aGUgZGF0YSAtLSBpLmUuIG5vIGVuY29kaW5nKS4KKwkgKi8KKwlpZiAocm93ICE9IHRpZi0+dGlmX3JvdykgeworCQlpZiAocm93IDwgdGlmLT50aWZfcm93KSB7CisJCQkvKgorCQkJICogTW92aW5nIGJhY2t3YXJkcyB3aXRoaW4gdGhlIHNhbWUgc3RyaXA6CisJCQkgKiBiYWNrdXAgdG8gdGhlIHN0YXJ0IGFuZCB0aGVuIGRlY29kZQorCQkJICogZm9yd2FyZCAoYmVsb3cpLgorCQkJICovCisJCQl0aWYtPnRpZl9yb3cgPSAoc3RyaXAgJSB0ZC0+dGRfc3RyaXBzcGVyaW1hZ2UpICoKKwkJCSAgICB0ZC0+dGRfcm93c3BlcnN0cmlwOworCQkJdGlmLT50aWZfcmF3Y3AgPSB0aWYtPnRpZl9yYXdkYXRhOworCQl9CisJCS8qCisJCSAqIFNlZWsgZm9yd2FyZCB0byB0aGUgZGVzaXJlZCByb3cuCisJCSAqLworCQlpZiAoISgqdGlmLT50aWZfc2VlaykodGlmLCByb3cgLSB0aWYtPnRpZl9yb3cpKQorCQkJcmV0dXJuICgtMSk7CisJCXRpZi0+dGlmX3JvdyA9IHJvdzsKKwl9CisKKwkvKiBzd2FiIGlmIG5lZWRlZCAtIG5vdGUgdGhhdCBzb3VyY2UgYnVmZmVyIHdpbGwgYmUgYWx0ZXJlZCAqLworCXRpZi0+dGlmX3Bvc3RkZWNvZGUoIHRpZiwgKHVpbnQ4KikgYnVmLCB0aWYtPnRpZl9zY2FubGluZXNpemUgKTsKKworCXN0YXR1cyA9ICgqdGlmLT50aWZfZW5jb2Rlcm93KSh0aWYsICh1aW50OCopIGJ1ZiwKKwkgICAgdGlmLT50aWZfc2NhbmxpbmVzaXplLCBzYW1wbGUpOworCisgICAgICAgIC8qIHdlIGFyZSBub3cgcG9pc2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgcm93ICovCisJdGlmLT50aWZfcm93ID0gcm93ICsgMTsKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qCisgKiBFbmNvZGUgdGhlIHN1cHBsaWVkIGRhdGEgYW5kIHdyaXRlIGl0IHRvIHRoZQorICogc3BlY2lmaWVkIHN0cmlwLgorICoKKyAqIE5COiBJbWFnZSBsZW5ndGggbXVzdCBiZSBzZXR1cCBiZWZvcmUgd3JpdGluZy4KKyAqLwordG1zaXplX3QKK1RJRkZXcml0ZUVuY29kZWRTdHJpcChUSUZGKiB0aWYsIHVpbnQzMiBzdHJpcCwgdm9pZCogZGF0YSwgdG1zaXplX3QgY2MpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRldyaXRlRW5jb2RlZFN0cmlwIjsKKwlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisJdWludDE2IHNhbXBsZTsKKworCWlmICghV1JJVEVDSEVDS1NUUklQUyh0aWYsIG1vZHVsZSkpCisJCXJldHVybiAoKHRtc2l6ZV90KSAtMSk7CisJLyoKKwkgKiBDaGVjayBzdHJpcCBhcnJheSB0byBtYWtlIHN1cmUgdGhlcmUncyBzcGFjZS4KKwkgKiBXZSBkb24ndCBzdXBwb3J0IGR5bmFtaWNhbGx5IGdyb3dpbmcgZmlsZXMgdGhhdAorCSAqIGhhdmUgZGF0YSBvcmdhbml6ZWQgaW4gc2VwYXJhdGUgYml0cGxhbmVzIGJlY2F1c2UKKwkgKiBpdCdzIHRvbyBwYWluZnVsLiAgSW4gdGhhdCBjYXNlIHdlIHJlcXVpcmUgdGhhdAorCSAqIHRoZSBpbWFnZWxlbmd0aCBiZSBzZXQgcHJvcGVybHkgYmVmb3JlIHRoZSBmaXJzdAorCSAqIHdyaXRlIChzbyB0aGF0IHRoZSBzdHJpcHMgYXJyYXkgd2lsbCBiZSBmdWxseQorCSAqIGFsbG9jYXRlZCBhYm92ZSkuCisJICovCisJaWYgKHN0cmlwID49IHRkLT50ZF9uc3RyaXBzKSB7CisJCWlmICh0ZC0+dGRfcGxhbmFyY29uZmlnID09IFBMQU5BUkNPTkZJR19TRVBBUkFURSkgeworCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCSAgICAiQ2FuIG5vdCBncm93IGltYWdlIGJ5IHN0cmlwcyB3aGVuIHVzaW5nIHNlcGFyYXRlIHBsYW5lcyIpOworCQkJcmV0dXJuICgodG1zaXplX3QpIC0xKTsKKwkJfQorCQlpZiAoIVRJRkZHcm93U3RyaXBzKHRpZiwgMSwgbW9kdWxlKSkKKwkJCXJldHVybiAoKHRtc2l6ZV90KSAtMSk7CisJCXRkLT50ZF9zdHJpcHNwZXJpbWFnZSA9CisJCSAgICBUSUZGaG93bWFueV8zMih0ZC0+dGRfaW1hZ2VsZW5ndGgsIHRkLT50ZF9yb3dzcGVyc3RyaXApOyAgCisJfQorCS8qCisJICogSGFuZGxlIGRlbGF5ZWQgYWxsb2NhdGlvbiBvZiBkYXRhIGJ1ZmZlci4gIFRoaXMKKwkgKiBwZXJtaXRzIGl0IHRvIGJlIHNpemVkIGFjY29yZGluZyB0byB0aGUgZGlyZWN0b3J5CisJICogaW5mby4KKwkgKi8KKwlpZiAoIUJVRkZFUkNIRUNLKHRpZikpCisJCXJldHVybiAoKHRtc2l6ZV90KSAtMSk7CisKKyAgICAgICAgdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9CVUY0V1JJVEU7CisJdGlmLT50aWZfY3Vyc3RyaXAgPSBzdHJpcDsKKworICAgICAgICBpZiAodGQtPnRkX3N0cmlwc3BlcmltYWdlID09IDApIHsKKyAgICAgICAgICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiWmVybyBzdHJpcHMgcGVyIGltYWdlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuICgodG1zaXplX3QpIC0xKTsKKyAgICAgICAgfQorCisJdGlmLT50aWZfcm93ID0gKHN0cmlwICUgdGQtPnRkX3N0cmlwc3BlcmltYWdlKSAqIHRkLT50ZF9yb3dzcGVyc3RyaXA7CisJaWYgKCh0aWYtPnRpZl9mbGFncyAmIFRJRkZfQ09ERVJTRVRVUCkgPT0gMCkgeworCQlpZiAoISgqdGlmLT50aWZfc2V0dXBlbmNvZGUpKHRpZikpCisJCQlyZXR1cm4gKCh0bXNpemVfdCkgLTEpOworCQl0aWYtPnRpZl9mbGFncyB8PSBUSUZGX0NPREVSU0VUVVA7CisJfQorCisJaWYoIHRkLT50ZF9zdHJpcGJ5dGVjb3VudFtzdHJpcF0gPiAwICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgYXQgdGhlIGZpcnN0IGF0dGVtcHQgb2YgcmV3cml0aW5nIHRoZSB0aWxlLCB3ZSB3aWxsIGhhdmUgKi8KKyAgICAgICAgICAgIC8qIG1vcmUgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSBvdXRwdXQgYnVmZmVyIHRoYW4gdGhlIHByZXZpb3VzIGJ5dGUgY291bnQsICovCisgICAgICAgICAgICAvKiBzbyB0aGF0IFRJRkZBcHBlbmRUb1N0cmlwKCkgd2lsbCBkZXRlY3QgdGhlIG92ZXJmbG93IHdoZW4gaXQgaXMgY2FsbGVkIHRoZSBmaXJzdCAqLworICAgICAgICAgICAgLyogdGltZSBpZiB0aGUgbmV3IGNvbXByZXNzZWQgdGlsZSBpcyBiaWdnZXIgdGhhbiB0aGUgb2xkZXIgb25lLiAoR0RBTCAjNDc3MSkgKi8KKyAgICAgICAgICAgIGlmKCB0aWYtPnRpZl9yYXdkYXRhc2l6ZSA8PSAodG1zaXplX3QpdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3N0cmlwXSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICEoVElGRldyaXRlQnVmZmVyU2V0dXAodGlmLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAodG1zaXplX3QpVElGRnJvdW5kdXBfNjQoKHVpbnQ2NCkodGQtPnRkX3N0cmlwYnl0ZWNvdW50W3N0cmlwXSArIDEpLCAxMDI0KSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisgICAgICAgICAgICB9CisKKwkgICAgLyogRm9yY2UgVElGRkFwcGVuZFRvU3RyaXAoKSB0byBjb25zaWRlciBwbGFjaW5nIGRhdGEgYXQgZW5kCisgICAgICAgICAgICAgICBvZiBmaWxlLiAqLworICAgICAgICAgICAgdGlmLT50aWZfY3Vyb2ZmID0gMDsKKyAgICAgICAgfQorCisgICAgdGlmLT50aWZfcmF3Y2MgPSAwOworICAgIHRpZi0+dGlmX3Jhd2NwID0gdGlmLT50aWZfcmF3ZGF0YTsKKworCXRpZi0+dGlmX2ZsYWdzICY9IH5USUZGX1BPU1RFTkNPREU7CisJc2FtcGxlID0gKHVpbnQxNikoc3RyaXAgLyB0ZC0+dGRfc3RyaXBzcGVyaW1hZ2UpOworCWlmICghKCp0aWYtPnRpZl9wcmVlbmNvZGUpKHRpZiwgc2FtcGxlKSkKKwkJcmV0dXJuICgodG1zaXplX3QpIC0xKTsKKworICAgICAgICAvKiBzd2FiIGlmIG5lZWRlZCAtIG5vdGUgdGhhdCBzb3VyY2UgYnVmZmVyIHdpbGwgYmUgYWx0ZXJlZCAqLworCXRpZi0+dGlmX3Bvc3RkZWNvZGUoIHRpZiwgKHVpbnQ4KikgZGF0YSwgY2MgKTsKKworCWlmICghKCp0aWYtPnRpZl9lbmNvZGVzdHJpcCkodGlmLCAodWludDgqKSBkYXRhLCBjYywgc2FtcGxlKSkKKwkJcmV0dXJuICgwKTsKKwlpZiAoISgqdGlmLT50aWZfcG9zdGVuY29kZSkodGlmKSkKKwkJcmV0dXJuICgodG1zaXplX3QpIC0xKTsKKwlpZiAoIWlzRmlsbE9yZGVyKHRpZiwgdGQtPnRkX2ZpbGxvcmRlcikgJiYKKwkgICAgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9OT0JJVFJFVikgPT0gMCkKKwkJVElGRlJldmVyc2VCaXRzKHRpZi0+dGlmX3Jhd2RhdGEsIHRpZi0+dGlmX3Jhd2NjKTsKKwlpZiAodGlmLT50aWZfcmF3Y2MgPiAwICYmCisJICAgICFUSUZGQXBwZW5kVG9TdHJpcCh0aWYsIHN0cmlwLCB0aWYtPnRpZl9yYXdkYXRhLCB0aWYtPnRpZl9yYXdjYykpCisJCXJldHVybiAoKHRtc2l6ZV90KSAtMSk7CisJdGlmLT50aWZfcmF3Y2MgPSAwOworCXRpZi0+dGlmX3Jhd2NwID0gdGlmLT50aWZfcmF3ZGF0YTsKKwlyZXR1cm4gKGNjKTsKK30KKworLyoKKyAqIFdyaXRlIHRoZSBzdXBwbGllZCBkYXRhIHRvIHRoZSBzcGVjaWZpZWQgc3RyaXAuCisgKgorICogTkI6IEltYWdlIGxlbmd0aCBtdXN0IGJlIHNldHVwIGJlZm9yZSB3cml0aW5nLgorICovCit0bXNpemVfdAorVElGRldyaXRlUmF3U3RyaXAoVElGRiogdGlmLCB1aW50MzIgc3RyaXAsIHZvaWQqIGRhdGEsIHRtc2l6ZV90IGNjKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZXcml0ZVJhd1N0cmlwIjsKKwlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisKKwlpZiAoIVdSSVRFQ0hFQ0tTVFJJUFModGlmLCBtb2R1bGUpKQorCQlyZXR1cm4gKCh0bXNpemVfdCkgLTEpOworCS8qCisJICogQ2hlY2sgc3RyaXAgYXJyYXkgdG8gbWFrZSBzdXJlIHRoZXJlJ3Mgc3BhY2UuCisJICogV2UgZG9uJ3Qgc3VwcG9ydCBkeW5hbWljYWxseSBncm93aW5nIGZpbGVzIHRoYXQKKwkgKiBoYXZlIGRhdGEgb3JnYW5pemVkIGluIHNlcGFyYXRlIGJpdHBsYW5lcyBiZWNhdXNlCisJICogaXQncyB0b28gcGFpbmZ1bC4gIEluIHRoYXQgY2FzZSB3ZSByZXF1aXJlIHRoYXQKKwkgKiB0aGUgaW1hZ2VsZW5ndGggYmUgc2V0IHByb3Blcmx5IGJlZm9yZSB0aGUgZmlyc3QKKwkgKiB3cml0ZSAoc28gdGhhdCB0aGUgc3RyaXBzIGFycmF5IHdpbGwgYmUgZnVsbHkKKwkgKiBhbGxvY2F0ZWQgYWJvdmUpLgorCSAqLworCWlmIChzdHJpcCA+PSB0ZC0+dGRfbnN0cmlwcykgeworCQlpZiAodGQtPnRkX3BsYW5hcmNvbmZpZyA9PSBQTEFOQVJDT05GSUdfU0VQQVJBVEUpIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCQkgICAgIkNhbiBub3QgZ3JvdyBpbWFnZSBieSBzdHJpcHMgd2hlbiB1c2luZyBzZXBhcmF0ZSBwbGFuZXMiKTsKKwkJCXJldHVybiAoKHRtc2l6ZV90KSAtMSk7CisJCX0KKwkJLyoKKwkJICogV2F0Y2ggb3V0IGZvciBhIGdyb3dpbmcgaW1hZ2UuICBUaGUgdmFsdWUgb2YKKwkJICogc3RyaXBzL2ltYWdlIHdpbGwgaW5pdGlhbGx5IGJlIDEgKHNpbmNlIGl0CisJCSAqIGNhbid0IGJlIGRlZHVjZWQgdW50aWwgdGhlIGltYWdlbGVuZ3RoIGlzIGtub3duKS4KKwkJICovCisJCWlmIChzdHJpcCA+PSB0ZC0+dGRfc3RyaXBzcGVyaW1hZ2UpCisJCQl0ZC0+dGRfc3RyaXBzcGVyaW1hZ2UgPQorCQkJICAgIFRJRkZob3dtYW55XzMyKHRkLT50ZF9pbWFnZWxlbmd0aCx0ZC0+dGRfcm93c3BlcnN0cmlwKTsKKwkJaWYgKCFUSUZGR3Jvd1N0cmlwcyh0aWYsIDEsIG1vZHVsZSkpCisJCQlyZXR1cm4gKCh0bXNpemVfdCkgLTEpOworCX0KKwl0aWYtPnRpZl9jdXJzdHJpcCA9IHN0cmlwOworICAgICAgICBpZiAodGQtPnRkX3N0cmlwc3BlcmltYWdlID09IDApIHsKKyAgICAgICAgICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCJaZXJvIHN0cmlwcyBwZXIgaW1hZ2UiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKCh0bXNpemVfdCkgLTEpOworICAgICAgICB9CisJdGlmLT50aWZfcm93ID0gKHN0cmlwICUgdGQtPnRkX3N0cmlwc3BlcmltYWdlKSAqIHRkLT50ZF9yb3dzcGVyc3RyaXA7CisJcmV0dXJuIChUSUZGQXBwZW5kVG9TdHJpcCh0aWYsIHN0cmlwLCAodWludDgqKSBkYXRhLCBjYykgPworCSAgICBjYyA6ICh0bXNpemVfdCkgLTEpOworfQorCisvKgorICogV3JpdGUgYW5kIGNvbXByZXNzIGEgdGlsZSBvZiBkYXRhLiAgVGhlCisgKiB0aWxlIGlzIHNlbGVjdGVkIGJ5IHRoZSAoeCx5LHoscykgY29vcmRpbmF0ZXMuCisgKi8KK3Rtc2l6ZV90CitUSUZGV3JpdGVUaWxlKFRJRkYqIHRpZiwgdm9pZCogYnVmLCB1aW50MzIgeCwgdWludDMyIHksIHVpbnQzMiB6LCB1aW50MTYgcykKK3sKKwlpZiAoIVRJRkZDaGVja1RpbGUodGlmLCB4LCB5LCB6LCBzKSkKKwkJcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisJLyoKKwkgKiBOQjogQSB0aWxlIHNpemUgb2YgLTEgaXMgdXNlZCBpbnN0ZWFkIG9mIHRpZl90aWxlc2l6ZSBrbm93aW5nCisJICogICAgIHRoYXQgVElGRldyaXRlRW5jb2RlZFRpbGUgd2lsbCBjbGFtcCB0aGlzIHRvIHRoZSB0aWxlIHNpemUuCisJICogICAgIFRoaXMgaXMgZG9uZSBiZWNhdXNlIHRoZSB0aWxlIHNpemUgbWF5IG5vdCBiZSBkZWZpbmVkIHVudGlsCisJICogICAgIGFmdGVyIHRoZSBvdXRwdXQgYnVmZmVyIGlzIHNldHVwIGluIFRJRkZXcml0ZUJ1ZmZlclNldHVwLgorCSAqLworCXJldHVybiAoVElGRldyaXRlRW5jb2RlZFRpbGUodGlmLAorCSAgICBUSUZGQ29tcHV0ZVRpbGUodGlmLCB4LCB5LCB6LCBzKSwgYnVmLCAodG1zaXplX3QpKC0xKSkpOworfQorCisvKgorICogRW5jb2RlIHRoZSBzdXBwbGllZCBkYXRhIGFuZCB3cml0ZSBpdCB0byB0aGUKKyAqIHNwZWNpZmllZCB0aWxlLiAgVGhlcmUgbXVzdCBiZSBzcGFjZSBmb3IgdGhlCisgKiBkYXRhLiAgVGhlIGZ1bmN0aW9uIGNsYW1wcyBpbmRpdmlkdWFsIHdyaXRlcworICogdG8gYSB0aWxlIHRvIHRoZSB0aWxlIHNpemUsIGJ1dCBkb2VzIG5vdCAoYW5kCisgKiBjYW4gbm90KSBjaGVjayB0aGF0IG11bHRpcGxlIHdyaXRlcyB0byB0aGUgc2FtZQorICogdGlsZSBkbyBub3Qgd3JpdGUgbW9yZSB0aGFuIHRpbGUgc2l6ZSBkYXRhLgorICoKKyAqIE5COiBJbWFnZSBsZW5ndGggbXVzdCBiZSBzZXR1cCBiZWZvcmUgd3JpdGluZzsgdGhpcworICogICAgIGludGVyZmFjZSBkb2VzIG5vdCBzdXBwb3J0IGF1dG9tYXRpY2FsbHkgZ3Jvd2luZworICogICAgIHRoZSBpbWFnZSBvbiBlYWNoIHdyaXRlIChhcyBUSUZGV3JpdGVTY2FubGluZSBkb2VzKS4KKyAqLwordG1zaXplX3QKK1RJRkZXcml0ZUVuY29kZWRUaWxlKFRJRkYqIHRpZiwgdWludDMyIHRpbGUsIHZvaWQqIGRhdGEsIHRtc2l6ZV90IGNjKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZXcml0ZUVuY29kZWRUaWxlIjsKKwlUSUZGRGlyZWN0b3J5ICp0ZDsKKwl1aW50MTYgc2FtcGxlOworICAgICAgICB1aW50MzIgaG93bWFueTMyOworCisJaWYgKCFXUklURUNIRUNLVElMRVModGlmLCBtb2R1bGUpKQorCQlyZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKKwl0ZCA9ICZ0aWYtPnRpZl9kaXI7CisJaWYgKHRpbGUgPj0gdGQtPnRkX25zdHJpcHMpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIlRpbGUgJWx1IG91dCBvZiByYW5nZSwgbWF4ICVsdSIsCisJCSAgICAodW5zaWduZWQgbG9uZykgdGlsZSwgKHVuc2lnbmVkIGxvbmcpIHRkLT50ZF9uc3RyaXBzKTsKKwkJcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisJfQorCS8qCisJICogSGFuZGxlIGRlbGF5ZWQgYWxsb2NhdGlvbiBvZiBkYXRhIGJ1ZmZlci4gIFRoaXMKKwkgKiBwZXJtaXRzIGl0IHRvIGJlIHNpemVkIG1vcmUgaW50ZWxsaWdlbnRseSAodXNpbmcKKwkgKiBkaXJlY3RvcnkgaW5mb3JtYXRpb24pLgorCSAqLworCWlmICghQlVGRkVSQ0hFQ0sodGlmKSkKKwkJcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisKKyAgICAgICAgdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9CVUY0V1JJVEU7CisJdGlmLT50aWZfY3VydGlsZSA9IHRpbGU7CisKKwlpZiggdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3RpbGVdID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IGF0IHRoZSBmaXJzdCBhdHRlbXB0IG9mIHJld3JpdGluZyB0aGUgdGlsZSwgd2Ugd2lsbCBoYXZlICovCisgICAgICAgICAgICAvKiBtb3JlIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciB0aGFuIHRoZSBwcmV2aW91cyBieXRlIGNvdW50LCAqLworICAgICAgICAgICAgLyogc28gdGhhdCBUSUZGQXBwZW5kVG9TdHJpcCgpIHdpbGwgZGV0ZWN0IHRoZSBvdmVyZmxvdyB3aGVuIGl0IGlzIGNhbGxlZCB0aGUgZmlyc3QgKi8KKyAgICAgICAgICAgIC8qIHRpbWUgaWYgdGhlIG5ldyBjb21wcmVzc2VkIHRpbGUgaXMgYmlnZ2VyIHRoYW4gdGhlIG9sZGVyIG9uZS4gKEdEQUwgIzQ3NzEpICovCisgICAgICAgICAgICBpZiggdGlmLT50aWZfcmF3ZGF0YXNpemUgPD0gKHRtc2l6ZV90KSB0ZC0+dGRfc3RyaXBieXRlY291bnRbdGlsZV0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhKFRJRkZXcml0ZUJ1ZmZlclNldHVwKHRpZiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgKHRtc2l6ZV90KVRJRkZyb3VuZHVwXzY0KCh1aW50NjQpKHRkLT50ZF9zdHJpcGJ5dGVjb3VudFt0aWxlXSArIDEpLCAxMDI0KSkpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisgICAgICAgICAgICB9CisKKwkgICAgLyogRm9yY2UgVElGRkFwcGVuZFRvU3RyaXAoKSB0byBjb25zaWRlciBwbGFjaW5nIGRhdGEgYXQgZW5kCisgICAgICAgICAgICAgICBvZiBmaWxlLiAqLworICAgICAgICAgICAgdGlmLT50aWZfY3Vyb2ZmID0gMDsKKyAgICAgICAgfQorCisJdGlmLT50aWZfcmF3Y2MgPSAwOworCXRpZi0+dGlmX3Jhd2NwID0gdGlmLT50aWZfcmF3ZGF0YTsKKworCS8qIAorCSAqIENvbXB1dGUgdGlsZXMgcGVyIHJvdyAmIHBlciBjb2x1bW4gdG8gY29tcHV0ZQorCSAqIGN1cnJlbnQgcm93IGFuZCBjb2x1bW4KKwkgKi8KKyAgICAgICAgaG93bWFueTMyPVRJRkZob3dtYW55XzMyKHRkLT50ZF9pbWFnZWxlbmd0aCwgdGQtPnRkX3RpbGVsZW5ndGgpOworICAgICAgICBpZiAoaG93bWFueTMyID09IDApIHsKKyAgICAgICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJaZXJvIHRpbGVzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisgICAgICAgIH0KKwl0aWYtPnRpZl9yb3cgPSAodGlsZSAlIGhvd21hbnkzMikgKiB0ZC0+dGRfdGlsZWxlbmd0aDsKKyAgICAgICAgaG93bWFueTMyPVRJRkZob3dtYW55XzMyKHRkLT50ZF9pbWFnZXdpZHRoLCB0ZC0+dGRfdGlsZXdpZHRoKTsKKyAgICAgICAgaWYgKGhvd21hbnkzMiA9PSAwKSB7CisgICAgICAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiWmVybyB0aWxlcyIpOworICAgICAgICAgICAgICAgIHJldHVybiAoKHRtc2l6ZV90KSgtMSkpOworICAgICAgICB9CisJdGlmLT50aWZfY29sID0gKHRpbGUgJSBob3dtYW55MzIpICogdGQtPnRkX3RpbGV3aWR0aDsKKworCWlmICgodGlmLT50aWZfZmxhZ3MgJiBUSUZGX0NPREVSU0VUVVApID09IDApIHsKKwkJaWYgKCEoKnRpZi0+dGlmX3NldHVwZW5jb2RlKSh0aWYpKQorCQkJcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisJCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfQ09ERVJTRVRVUDsKKwl9CisJdGlmLT50aWZfZmxhZ3MgJj0gflRJRkZfUE9TVEVOQ09ERTsKKwlzYW1wbGUgPSAodWludDE2KSh0aWxlL3RkLT50ZF9zdHJpcHNwZXJpbWFnZSk7CisJaWYgKCEoKnRpZi0+dGlmX3ByZWVuY29kZSkodGlmLCBzYW1wbGUpKQorCQlyZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKKwkvKgorCSAqIENsYW1wIHdyaXRlIGFtb3VudCB0byB0aGUgdGlsZSBzaXplLiAgVGhpcyBpcyBtb3N0bHkKKwkgKiBkb25lIHNvIHRoYXQgY2FsbGVycyBjYW4gcGFzcyBpbiBzb21lIGxhcmdlIG51bWJlcgorCSAqIChlLmcuIC0xKSBhbmQgaGF2ZSB0aGUgdGlsZSBzaXplIHVzZWQgaW5zdGVhZC4KKwkgKi8KKwlpZiAoIGNjIDwgMSB8fCBjYyA+IHRpZi0+dGlmX3RpbGVzaXplKQorCQljYyA9IHRpZi0+dGlmX3RpbGVzaXplOworCisgICAgICAgIC8qIHN3YWIgaWYgbmVlZGVkIC0gbm90ZSB0aGF0IHNvdXJjZSBidWZmZXIgd2lsbCBiZSBhbHRlcmVkICovCisJdGlmLT50aWZfcG9zdGRlY29kZSggdGlmLCAodWludDgqKSBkYXRhLCBjYyApOworCisJaWYgKCEoKnRpZi0+dGlmX2VuY29kZXRpbGUpKHRpZiwgKHVpbnQ4KikgZGF0YSwgY2MsIHNhbXBsZSkpCisJCXJldHVybiAoMCk7CisJaWYgKCEoKnRpZi0+dGlmX3Bvc3RlbmNvZGUpKHRpZikpCisJCXJldHVybiAoKHRtc2l6ZV90KSgtMSkpOworCWlmICghaXNGaWxsT3JkZXIodGlmLCB0ZC0+dGRfZmlsbG9yZGVyKSAmJgorCSAgICAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX05PQklUUkVWKSA9PSAwKQorCQlUSUZGUmV2ZXJzZUJpdHMoKHVpbnQ4Kil0aWYtPnRpZl9yYXdkYXRhLCB0aWYtPnRpZl9yYXdjYyk7CisJaWYgKHRpZi0+dGlmX3Jhd2NjID4gMCAmJiAhVElGRkFwcGVuZFRvU3RyaXAodGlmLCB0aWxlLAorCSAgICB0aWYtPnRpZl9yYXdkYXRhLCB0aWYtPnRpZl9yYXdjYykpCisJCXJldHVybiAoKHRtc2l6ZV90KSgtMSkpOworCXRpZi0+dGlmX3Jhd2NjID0gMDsKKwl0aWYtPnRpZl9yYXdjcCA9IHRpZi0+dGlmX3Jhd2RhdGE7CisJcmV0dXJuIChjYyk7Cit9CisKKy8qCisgKiBXcml0ZSB0aGUgc3VwcGxpZWQgZGF0YSB0byB0aGUgc3BlY2lmaWVkIHN0cmlwLgorICogVGhlcmUgbXVzdCBiZSBzcGFjZSBmb3IgdGhlIGRhdGE7IHdlIGRvbid0IGNoZWNrCisgKiBpZiBzdHJpcHMgb3ZlcmxhcCEKKyAqCisgKiBOQjogSW1hZ2UgbGVuZ3RoIG11c3QgYmUgc2V0dXAgYmVmb3JlIHdyaXRpbmc7IHRoaXMKKyAqICAgICBpbnRlcmZhY2UgZG9lcyBub3Qgc3VwcG9ydCBhdXRvbWF0aWNhbGx5IGdyb3dpbmcKKyAqICAgICB0aGUgaW1hZ2Ugb24gZWFjaCB3cml0ZSAoYXMgVElGRldyaXRlU2NhbmxpbmUgZG9lcykuCisgKi8KK3Rtc2l6ZV90CitUSUZGV3JpdGVSYXdUaWxlKFRJRkYqIHRpZiwgdWludDMyIHRpbGUsIHZvaWQqIGRhdGEsIHRtc2l6ZV90IGNjKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZXcml0ZVJhd1RpbGUiOworCisJaWYgKCFXUklURUNIRUNLVElMRVModGlmLCBtb2R1bGUpKQorCQlyZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKKwlpZiAodGlsZSA+PSB0aWYtPnRpZl9kaXIudGRfbnN0cmlwcykgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiVGlsZSAlbHUgb3V0IG9mIHJhbmdlLCBtYXggJWx1IiwKKwkJICAgICh1bnNpZ25lZCBsb25nKSB0aWxlLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzKTsKKwkJcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisJfQorCXJldHVybiAoVElGRkFwcGVuZFRvU3RyaXAodGlmLCB0aWxlLCAodWludDgqKSBkYXRhLCBjYykgPworCSAgICBjYyA6ICh0bXNpemVfdCkoLTEpKTsKK30KKworI2RlZmluZQlpc1Vuc3BlY2lmaWVkKHRpZiwgZikgXAorICAgIChUSUZGRmllbGRTZXQodGlmLGYpICYmICh0aWYpLT50aWZfZGlyLnRkX2ltYWdlbGVuZ3RoID09IDApCisKK2ludAorVElGRlNldHVwU3RyaXBzKFRJRkYqIHRpZikKK3sKKwlUSUZGRGlyZWN0b3J5KiB0ZCA9ICZ0aWYtPnRpZl9kaXI7CisKKwlpZiAoaXNUaWxlZCh0aWYpKQorCQl0ZC0+dGRfc3RyaXBzcGVyaW1hZ2UgPQorCQkgICAgaXNVbnNwZWNpZmllZCh0aWYsIEZJRUxEX1RJTEVESU1FTlNJT05TKSA/CisJCQl0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsIDogVElGRk51bWJlck9mVGlsZXModGlmKTsKKwllbHNlCisJCXRkLT50ZF9zdHJpcHNwZXJpbWFnZSA9CisJCSAgICBpc1Vuc3BlY2lmaWVkKHRpZiwgRklFTERfUk9XU1BFUlNUUklQKSA/CisJCQl0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsIDogVElGRk51bWJlck9mU3RyaXBzKHRpZik7CisJdGQtPnRkX25zdHJpcHMgPSB0ZC0+dGRfc3RyaXBzcGVyaW1hZ2U7CisJaWYgKHRkLT50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX1NFUEFSQVRFKQorCQl0ZC0+dGRfc3RyaXBzcGVyaW1hZ2UgLz0gdGQtPnRkX3NhbXBsZXNwZXJwaXhlbDsKKwl0ZC0+dGRfc3RyaXBvZmZzZXQgPSAodWludDY0ICopCisJICAgIF9USUZGbWFsbG9jKHRkLT50ZF9uc3RyaXBzICogc2l6ZW9mICh1aW50NjQpKTsKKwl0ZC0+dGRfc3RyaXBieXRlY291bnQgPSAodWludDY0ICopCisJICAgIF9USUZGbWFsbG9jKHRkLT50ZF9uc3RyaXBzICogc2l6ZW9mICh1aW50NjQpKTsKKwlpZiAodGQtPnRkX3N0cmlwb2Zmc2V0ID09IE5VTEwgfHwgdGQtPnRkX3N0cmlwYnl0ZWNvdW50ID09IE5VTEwpCisJCXJldHVybiAoMCk7CisJLyoKKwkgKiBQbGFjZSBkYXRhIGF0IHRoZSBlbmQtb2YtZmlsZQorCSAqIChieSBzZXR0aW5nIG9mZnNldHMgdG8gemVybykuCisJICovCisJX1RJRkZtZW1zZXQodGQtPnRkX3N0cmlwb2Zmc2V0LCAwLCB0ZC0+dGRfbnN0cmlwcypzaXplb2YgKHVpbnQ2NCkpOworCV9USUZGbWVtc2V0KHRkLT50ZF9zdHJpcGJ5dGVjb3VudCwgMCwgdGQtPnRkX25zdHJpcHMqc2l6ZW9mICh1aW50NjQpKTsKKwlUSUZGU2V0RmllbGRCaXQodGlmLCBGSUVMRF9TVFJJUE9GRlNFVFMpOworCVRJRkZTZXRGaWVsZEJpdCh0aWYsIEZJRUxEX1NUUklQQllURUNPVU5UUyk7CisJcmV0dXJuICgxKTsKK30KKyN1bmRlZiBpc1Vuc3BlY2lmaWVkCisKKy8qCisgKiBWZXJpZnkgZmlsZSBpcyB3cml0YWJsZSBhbmQgdGhhdCB0aGUgZGlyZWN0b3J5CisgKiBpbmZvcm1hdGlvbiBpcyBzZXR1cCBwcm9wZXJseS4gIEluIGRvaW5nIHRoZSBsYXR0ZXIKKyAqIHdlIGFsc28gImZyZWV6ZSIgdGhlIHN0YXRlIG9mIHRoZSBkaXJlY3Rvcnkgc28KKyAqIHRoYXQgaW1wb3J0YW50IGluZm9ybWF0aW9uIGlzIG5vdCBjaGFuZ2VkLgorICovCitpbnQKK1RJRkZXcml0ZUNoZWNrKFRJRkYqIHRpZiwgaW50IHRpbGVzLCBjb25zdCBjaGFyKiBtb2R1bGUpCit7CisJaWYgKHRpZi0+dGlmX21vZGUgPT0gT19SRE9OTFkpIHsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIkZpbGUgbm90IG9wZW4gZm9yIHdyaXRpbmciKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKHRpbGVzIF4gaXNUaWxlZCh0aWYpKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsIHRpbGVzID8KKwkJICAgICJDYW4gbm90IHdyaXRlIHRpbGVzIHRvIGEgc3RyaXBwZWQgaW1hZ2UiIDoKKwkJICAgICJDYW4gbm90IHdyaXRlIHNjYW5saW5lcyB0byBhIHRpbGVkIGltYWdlIik7CisJCXJldHVybiAoMCk7CisJfQorCisgICAgICAgIF9USUZGRmlsbFN0cmlsZXMoIHRpZiApOworICAgICAgICAKKwkvKgorCSAqIE9uIHRoZSBmaXJzdCB3cml0ZSB2ZXJpZnkgYWxsIHRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbgorCSAqIGhhcyBiZWVuIHNldHVwIGFuZCBpbml0aWFsaXplIGFueSBkYXRhIHN0cnVjdHVyZXMgdGhhdAorCSAqIGhhZCB0byB3YWl0IHVudGlsIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiB3YXMgc2V0LgorCSAqIE5vdGUgdGhhdCBhIGxvdCBvZiBvdXIgd29yayBpcyBhc3N1bWVkIHRvIHJlbWFpbiB2YWxpZAorCSAqIGJlY2F1c2Ugd2UgZGlzYWxsb3cgYW55IG9mIHRoZSBpbXBvcnRhbnQgcGFyYW1ldGVycworCSAqIGZyb20gY2hhbmdpbmcgYWZ0ZXIgd2Ugc3RhcnQgd3JpdGluZyAoaS5lLiBvbmNlCisJICogVElGRl9CRUVOV1JJVElORyBpcyBzZXQsIFRJRkZTZXRGaWVsZCB3aWxsIG9ubHkgYWxsb3cKKwkgKiB0aGUgaW1hZ2UncyBsZW5ndGggdG8gYmUgY2hhbmdlZCkuCisJICovCisJaWYgKCFUSUZGRmllbGRTZXQodGlmLCBGSUVMRF9JTUFHRURJTUVOU0lPTlMpKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCSAgICAiTXVzdCBzZXQgXCJJbWFnZVdpZHRoXCIgYmVmb3JlIHdyaXRpbmcgZGF0YSIpOworCQlyZXR1cm4gKDApOworCX0KKwlpZiAodGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbCA9PSAxKSB7CisJCS8qIAorCQkgKiBQbGFuYXJjb25maWd1cmF0aW9uIGlzIGlycmVsZXZhbnQgaW4gY2FzZSBvZiBzaW5nbGUgYmFuZAorCQkgKiBpbWFnZXMgYW5kIG5lZWQgbm90IGJlIGluY2x1ZGVkLiBXZSB3aWxsIHNldCBpdCBhbnl3YXksCisJCSAqIGJlY2F1c2UgdGhpcyBmaWVsZCBpcyB1c2VkIGluIG90aGVyIHBhcnRzIG9mIGxpYnJhcnkgZXZlbgorCQkgKiBpbiB0aGUgc2luZ2xlIGJhbmQgY2FzZS4KKwkJICovCisJCWlmICghVElGRkZpZWxkU2V0KHRpZiwgRklFTERfUExBTkFSQ09ORklHKSkKKyAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfZGlyLnRkX3BsYW5hcmNvbmZpZyA9IFBMQU5BUkNPTkZJR19DT05USUc7CisJfSBlbHNlIHsKKwkJaWYgKCFUSUZGRmllbGRTZXQodGlmLCBGSUVMRF9QTEFOQVJDT05GSUcpKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICJNdXN0IHNldCBcIlBsYW5hckNvbmZpZ3VyYXRpb25cIiBiZWZvcmUgd3JpdGluZyBkYXRhIik7CisJCQlyZXR1cm4gKDApOworCQl9CisJfQorCWlmICh0aWYtPnRpZl9kaXIudGRfc3RyaXBvZmZzZXQgPT0gTlVMTCAmJiAhVElGRlNldHVwU3RyaXBzKHRpZikpIHsKKwkJdGlmLT50aWZfZGlyLnRkX25zdHJpcHMgPSAwOworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiTm8gc3BhY2UgZm9yICVzIGFycmF5cyIsCisJCSAgICBpc1RpbGVkKHRpZikgPyAidGlsZSIgOiAic3RyaXAiKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKGlzVGlsZWQodGlmKSkKKwl7CisJCXRpZi0+dGlmX3RpbGVzaXplID0gVElGRlRpbGVTaXplKHRpZik7CisJCWlmICh0aWYtPnRpZl90aWxlc2l6ZSA9PSAwKQorCQkJcmV0dXJuICgwKTsKKwl9CisJZWxzZQorCQl0aWYtPnRpZl90aWxlc2l6ZSA9ICh0bXNpemVfdCkoLTEpOworCXRpZi0+dGlmX3NjYW5saW5lc2l6ZSA9IFRJRkZTY2FubGluZVNpemUodGlmKTsKKwlpZiAodGlmLT50aWZfc2NhbmxpbmVzaXplID09IDApCisJCXJldHVybiAoMCk7CisJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9CRUVOV1JJVElORzsKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogU2V0dXAgdGhlIHJhdyBkYXRhIGJ1ZmZlciB1c2VkIGZvciBlbmNvZGluZy4KKyAqLworaW50CitUSUZGV3JpdGVCdWZmZXJTZXR1cChUSUZGKiB0aWYsIHZvaWQqIGJwLCB0bXNpemVfdCBzaXplKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZXcml0ZUJ1ZmZlclNldHVwIjsKKworCWlmICh0aWYtPnRpZl9yYXdkYXRhKSB7CisJCWlmICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfTVlCVUZGRVIpIHsKKwkJCV9USUZGZnJlZSh0aWYtPnRpZl9yYXdkYXRhKTsKKwkJCXRpZi0+dGlmX2ZsYWdzICY9IH5USUZGX01ZQlVGRkVSOworCQl9CisJCXRpZi0+dGlmX3Jhd2RhdGEgPSBOVUxMOworCX0KKwlpZiAoc2l6ZSA9PSAodG1zaXplX3QpKC0xKSkgeworCQlzaXplID0gKGlzVGlsZWQodGlmKSA/CisJCSAgICB0aWYtPnRpZl90aWxlc2l6ZSA6IFRJRkZTdHJpcFNpemUodGlmKSk7CisJCS8qCisJCSAqIE1ha2UgcmF3IGRhdGEgYnVmZmVyIGF0IGxlYXN0IDhLCisJCSAqLworCQlpZiAoc2l6ZSA8IDgqMTAyNCkKKwkJCXNpemUgPSA4KjEwMjQ7CisJCWJwID0gTlVMTDsJCQkvKiBOQjogZm9yY2UgbWFsbG9jICovCisJfQorCWlmIChicCA9PSBOVUxMKSB7CisJCWJwID0gX1RJRkZtYWxsb2Moc2l6ZSk7CisJCWlmIChicCA9PSBOVUxMKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiTm8gc3BhY2UgZm9yIG91dHB1dCBidWZmZXIiKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9NWUJVRkZFUjsKKwl9IGVsc2UKKwkJdGlmLT50aWZfZmxhZ3MgJj0gflRJRkZfTVlCVUZGRVI7CisJdGlmLT50aWZfcmF3ZGF0YSA9ICh1aW50OCopIGJwOworCXRpZi0+dGlmX3Jhd2RhdGFzaXplID0gc2l6ZTsKKwl0aWYtPnRpZl9yYXdjYyA9IDA7CisJdGlmLT50aWZfcmF3Y3AgPSB0aWYtPnRpZl9yYXdkYXRhOworCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfQlVGRkVSU0VUVVA7CisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIEdyb3cgdGhlIHN0cmlwIGRhdGEgc3RydWN0dXJlcyBieSBkZWx0YSBzdHJpcHMuCisgKi8KK3N0YXRpYyBpbnQKK1RJRkZHcm93U3RyaXBzKFRJRkYqIHRpZiwgdWludDMyIGRlbHRhLCBjb25zdCBjaGFyKiBtb2R1bGUpCit7CisJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworCXVpbnQ2NCogbmV3X3N0cmlwb2Zmc2V0OworCXVpbnQ2NCogbmV3X3N0cmlwYnl0ZWNvdW50OworCisJYXNzZXJ0KHRkLT50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX0NPTlRJRyk7CisJbmV3X3N0cmlwb2Zmc2V0ID0gKHVpbnQ2NCopX1RJRkZyZWFsbG9jKHRkLT50ZF9zdHJpcG9mZnNldCwKKwkJKHRkLT50ZF9uc3RyaXBzICsgZGVsdGEpICogc2l6ZW9mICh1aW50NjQpKTsKKwluZXdfc3RyaXBieXRlY291bnQgPSAodWludDY0KilfVElGRnJlYWxsb2ModGQtPnRkX3N0cmlwYnl0ZWNvdW50LAorCQkodGQtPnRkX25zdHJpcHMgKyBkZWx0YSkgKiBzaXplb2YgKHVpbnQ2NCkpOworCWlmIChuZXdfc3RyaXBvZmZzZXQgPT0gTlVMTCB8fCBuZXdfc3RyaXBieXRlY291bnQgPT0gTlVMTCkgeworCQlpZiAobmV3X3N0cmlwb2Zmc2V0KQorCQkJX1RJRkZmcmVlKG5ld19zdHJpcG9mZnNldCk7CisJCWlmIChuZXdfc3RyaXBieXRlY291bnQpCisJCQlfVElGRmZyZWUobmV3X3N0cmlwYnl0ZWNvdW50KTsKKwkJdGQtPnRkX25zdHJpcHMgPSAwOworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiTm8gc3BhY2UgdG8gZXhwYW5kIHN0cmlwIGFycmF5cyIpOworCQlyZXR1cm4gKDApOworCX0KKwl0ZC0+dGRfc3RyaXBvZmZzZXQgPSBuZXdfc3RyaXBvZmZzZXQ7CisJdGQtPnRkX3N0cmlwYnl0ZWNvdW50ID0gbmV3X3N0cmlwYnl0ZWNvdW50OworCV9USUZGbWVtc2V0KHRkLT50ZF9zdHJpcG9mZnNldCArIHRkLT50ZF9uc3RyaXBzLAorCQkgICAgMCwgZGVsdGEqc2l6ZW9mICh1aW50NjQpKTsKKwlfVElGRm1lbXNldCh0ZC0+dGRfc3RyaXBieXRlY291bnQgKyB0ZC0+dGRfbnN0cmlwcywKKwkJICAgIDAsIGRlbHRhKnNpemVvZiAodWludDY0KSk7CisJdGQtPnRkX25zdHJpcHMgKz0gZGVsdGE7CisgICAgICAgIHRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfRElSVFlESVJFQ1Q7CisKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogQXBwZW5kIHRoZSBkYXRhIHRvIHRoZSBzcGVjaWZpZWQgc3RyaXAuCisgKi8KK3N0YXRpYyBpbnQKK1RJRkZBcHBlbmRUb1N0cmlwKFRJRkYqIHRpZiwgdWludDMyIHN0cmlwLCB1aW50OCogZGF0YSwgdG1zaXplX3QgY2MpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRkFwcGVuZFRvU3RyaXAiOworCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKKwl1aW50NjQgbTsKKyAgICAgICAgaW50NjQgb2xkX2J5dGVfY291bnQgPSAtMTsKKworCWlmICh0ZC0+dGRfc3RyaXBvZmZzZXRbc3RyaXBdID09IDAgfHwgdGlmLT50aWZfY3Vyb2ZmID09IDApIHsKKyAgICAgICAgICAgIGFzc2VydCh0ZC0+dGRfbnN0cmlwcyA+IDApOworCisgICAgICAgICAgICBpZiggdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3N0cmlwXSAhPSAwIAorICAgICAgICAgICAgICAgICYmIHRkLT50ZF9zdHJpcG9mZnNldFtzdHJpcF0gIT0gMCAKKyAgICAgICAgICAgICAgICAmJiB0ZC0+dGRfc3RyaXBieXRlY291bnRbc3RyaXBdID49ICh1aW50NjQpIGNjICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAgICAgKiBUaGVyZSBpcyBhbHJlYWR5IHRpbGUgZGF0YSBvbiBkaXNrLCBhbmQgdGhlIG5ldyB0aWxlCisgICAgICAgICAgICAgICAgICogZGF0YSB3ZSBoYXZlIHdpbGwgZml0IGluIHRoZSBzYW1lIHNwYWNlLiAgVGhlIG9ubHkgCisgICAgICAgICAgICAgICAgICogYXNwZWN0IG9mIHRoaXMgdGhhdCBpcyByaXNreSBpcyB0aGF0IHRoZXJlIGNvdWxkIGJlCisgICAgICAgICAgICAgICAgICogbW9yZSBkYXRhIHRvIGFwcGVuZCB0byB0aGlzIHN0cmlwIGJlZm9yZSB3ZSBhcmUgZG9uZQorICAgICAgICAgICAgICAgICAqIGRlcGVuZGluZyBvbiBob3cgd2UgYXJlIGdldHRpbmcgY2FsbGVkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmICghU2Vla09LKHRpZiwgdGQtPnRkX3N0cmlwb2Zmc2V0W3N0cmlwXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZWVrIGVycm9yIGF0IHNjYW5saW5lICVsdSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyl0aWYtPnRpZl9yb3cpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAgICAgKiBTZWVrIHRvIGVuZCBvZiBmaWxlLCBhbmQgc2V0IHRoYXQgYXMgb3VyIGxvY2F0aW9uIHRvIAorICAgICAgICAgICAgICAgICAqIHdyaXRlIHRoaXMgc3RyaXAuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgdGQtPnRkX3N0cmlwb2Zmc2V0W3N0cmlwXSA9IFRJRkZTZWVrRmlsZSh0aWYsIDAsIFNFRUtfRU5EKTsKKyAgICAgICAgICAgICAgICB0aWYtPnRpZl9mbGFncyB8PSBUSUZGX0RJUlRZU1RSSVA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRpZi0+dGlmX2N1cm9mZiA9IHRkLT50ZF9zdHJpcG9mZnNldFtzdHJpcF07CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBXZSBhcmUgc3RhcnRpbmcgYSBmcmVzaCBzdHJpcC90aWxlLCBzbyBzZXQgdGhlIHNpemUgdG8gemVyby4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgb2xkX2J5dGVfY291bnQgPSB0ZC0+dGRfc3RyaXBieXRlY291bnRbc3RyaXBdOworICAgICAgICAgICAgdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3N0cmlwXSA9IDA7CisJfQorCisJbSA9IHRpZi0+dGlmX2N1cm9mZitjYzsKKwlpZiAoISh0aWYtPnRpZl9mbGFncyZUSUZGX0JJR1RJRkYpKQorCQltID0gKHVpbnQzMiltOworCWlmICgobTx0aWYtPnRpZl9jdXJvZmYpfHwobTwodWludDY0KWNjKSkKKwl7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJNYXhpbXVtIFRJRkYgZmlsZSBzaXplIGV4Y2VlZGVkIik7CisJCXJldHVybiAoMCk7CisJfQorCWlmICghV3JpdGVPSyh0aWYsIGRhdGEsIGNjKSkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiV3JpdGUgZXJyb3IgYXQgc2NhbmxpbmUgJWx1IiwKKwkJICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3cpOworCQkgICAgcmV0dXJuICgwKTsKKwl9CisJdGlmLT50aWZfY3Vyb2ZmID0gbTsKKwl0ZC0+dGRfc3RyaXBieXRlY291bnRbc3RyaXBdICs9IGNjOworCisgICAgICAgIGlmKCAoaW50NjQpIHRkLT50ZF9zdHJpcGJ5dGVjb3VudFtzdHJpcF0gIT0gb2xkX2J5dGVfY291bnQgKQorICAgICAgICAgICAgdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9ESVJUWVNUUklQOworICAgICAgICAgICAgCisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIEludGVybmFsIHZlcnNpb24gb2YgVElGRkZsdXNoRGF0YSB0aGF0IGNhbiBiZQorICogY2FsbGVkIGJ5IGBgZW5jb2Rlc3RyaXAgcm91dGluZXMnJyB3L28gY29uY2VybgorICogZm9yIGluZmluaXRlIHJlY3Vyc2lvbi4KKyAqLworaW50CitUSUZGRmx1c2hEYXRhMShUSUZGKiB0aWYpCit7CisJaWYgKHRpZi0+dGlmX3Jhd2NjID4gMCAmJiB0aWYtPnRpZl9mbGFncyAmIFRJRkZfQlVGNFdSSVRFICkgeworCQlpZiAoIWlzRmlsbE9yZGVyKHRpZiwgdGlmLT50aWZfZGlyLnRkX2ZpbGxvcmRlcikgJiYKKwkJICAgICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfTk9CSVRSRVYpID09IDApCisJCQlUSUZGUmV2ZXJzZUJpdHMoKHVpbnQ4Kil0aWYtPnRpZl9yYXdkYXRhLAorCQkJICAgIHRpZi0+dGlmX3Jhd2NjKTsKKwkJaWYgKCFUSUZGQXBwZW5kVG9TdHJpcCh0aWYsCisJCSAgICBpc1RpbGVkKHRpZikgPyB0aWYtPnRpZl9jdXJ0aWxlIDogdGlmLT50aWZfY3Vyc3RyaXAsCisJCSAgICB0aWYtPnRpZl9yYXdkYXRhLCB0aWYtPnRpZl9yYXdjYykpCisJCQlyZXR1cm4gKDApOworCQl0aWYtPnRpZl9yYXdjYyA9IDA7CisJCXRpZi0+dGlmX3Jhd2NwID0gdGlmLT50aWZfcmF3ZGF0YTsKKwl9CisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIFNldCB0aGUgY3VycmVudCB3cml0ZSBvZmZzZXQuICBUaGlzIHNob3VsZCBvbmx5IGJlCisgKiB1c2VkIHRvIHNldCB0aGUgb2Zmc2V0IHRvIGEga25vd24gcHJldmlvdXMgbG9jYXRpb24KKyAqICh2ZXJ5IGNhcmVmdWxseSksIG9yIHRvIDAgc28gdGhhdCB0aGUgbmV4dCB3cml0ZSBnZXRzCisgKiBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLgorICovCit2b2lkCitUSUZGU2V0V3JpdGVPZmZzZXQoVElGRiogdGlmLCB0b2ZmX3Qgb2ZmKQoreworCXRpZi0+dGlmX2N1cm9mZiA9IG9mZjsKK30KKworLyogdmltOiBzZXQgdHM9OCBzdHM9OCBzdz04IG5vZXQ6ICovCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl96aXAuYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3ppcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYWM5YjkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl96aXAuYwpAQCAtMCwwICsxLDQ3MiBAQAorLyogJElkOiB0aWZfemlwLmMsdiAxLjMzIDIwMTQtMTItMjUgMTg6Mjk6MTEgZXJvdWF1bHQgRXhwICQgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk3IFNhbSBMZWZmbGVyCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5NyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkCisgKiB0aGF0IChpKSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisgKiBhbGwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uLCBhbmQgKGlpKSB0aGUgbmFtZXMgb2YKKyAqIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzIG1heSBub3QgYmUgdXNlZCBpbiBhbnkgYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGUgc29mdHdhcmUgd2l0aG91dCB0aGUgc3BlY2lmaWMsIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24gb2YgU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MuCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKKyAqIEVYUFJFU1MsIElNUExJRUQgT1IgT1RIRVJXSVNFLCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgCisgKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIAorICogSU4gTk8gRVZFTlQgU0hBTEwgU0FNIExFRkZMRVIgT1IgU0lMSUNPTiBHUkFQSElDUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgSU5DSURFTlRBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBLSU5ELAorICogT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorICogV0hFVEhFUiBPUiBOT1QgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRiAKKyAqIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgCisgKiBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJ0aWZmaW9wLmgiCisjaWZkZWYgWklQX1NVUFBPUlQKKy8qCisgKiBUSUZGIExpYnJhcnkuCisgKgorICogWklQIChha2EgRGVmbGF0ZSkgQ29tcHJlc3Npb24gU3VwcG9ydAorICoKKyAqIFRoaXMgZmlsZSBpcyBzaW1wbHkgYW4gaW50ZXJmYWNlIHRvIHRoZSB6bGliIGxpYnJhcnkgd3JpdHRlbiBieQorICogSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlci4gIFlvdSBtdXN0IHVzZSB2ZXJzaW9uIDEuMCBvciBsYXRlcgorICogb2YgdGhlIGxpYnJhcnk6IHRoaXMgY29kZSBhc3N1bWVzIHRoZSAxLjAgQVBJIGFuZCBhbHNvIGRlcGVuZHMgb24KKyAqIHRoZSBhYmlsaXR5IHRvIHdyaXRlIHRoZSB6bGliIGhlYWRlciBtdWx0aXBsZSB0aW1lcyAob25lIHBlciBzdHJpcCkKKyAqIHdoaWNoIHdhcyBub3QgcG9zc2libGUgd2l0aCB2ZXJzaW9ucyBwcmlvciB0byAwLjk1LiAgTm90ZSBhbHNvIHRoYXQKKyAqIG9sZGVyIHZlcnNpb25zIG9mIHRoaXMgY29kZWMgYXZvaWRlZCB0aGlzIGJ1ZyBieSBzdXBwcmVzc2luZyB0aGUgaGVhZGVyCisgKiBlbnRpcmVseS4gIFRoaXMgbWVhbnMgdGhhdCBmaWxlcyB3cml0dGVuIHdpdGggdGhlIG9sZCBsaWJyYXJ5IGNhbm5vdAorICogYmUgcmVhZDsgdGhleSBzaG91bGQgYmUgY29udmVydGVkIHRvIGEgZGlmZmVyZW50IGNvbXByZXNzaW9uIHNjaGVtZQorICogYW5kIHRoZW4gcmVjb252ZXJ0ZWQuCisgKgorICogVGhlIGRhdGEgZm9ybWF0IHVzZWQgYnkgdGhlIHpsaWIgbGlicmFyeSBpcyBkZXNjcmliZWQgaW4gdGhlIGZpbGVzCisgKiB6bGliLTMuMS5kb2MsIGRlZmxhdGUtMS4xLmRvYyBhbmQgZ3ppcC00LjEuZG9jLCBhdmFpbGFibGUgaW4gdGhlCisgKiBkaXJlY3RvcnkgZnRwOi8vZnRwLnV1Lm5ldC9wdWIvYXJjaGl2aW5nL3ppcC9kb2MuICBUaGUgbGlicmFyeSB3YXMKKyAqIGxhc3QgZm91bmQgYXQgZnRwOi8vZnRwLnV1Lm5ldC9wdWIvYXJjaGl2aW5nL3ppcC96bGliL3psaWItMC45OS50YXIuZ3ouCisgKi8KKyNpbmNsdWRlICJ0aWZfcHJlZGljdC5oIgorI2luY2x1ZGUgIi4uL3psaWJfdjEyOC96bGliLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKgorICogU2lnaCwgWkxJQl9WRVJTSU9OIGlzIGRlZmluZWQgYXMgYSBzdHJpbmcgc28gdGhlcmUncyBubworICogd2F5IHRvIGRvIGEgcHJvcGVyIGNoZWNrIGhlcmUuICBJbnN0ZWFkIHdlIGd1ZXNzIGJhc2VkCisgKiBvbiB0aGUgcHJlc2VuY2Ugb2YgI2RlZmluZXMgdGhhdCB3ZXJlIGFkZGVkIGJldHdlZW4gdGhlCisgKiAwLjk1IGFuZCAxLjAgZGlzdHJpYnV0aW9ucy4KKyAqLworI2lmICFkZWZpbmVkKFpfTk9fQ09NUFJFU1NJT04pIHx8ICFkZWZpbmVkKFpfREVGTEFURUQpCisjZXJyb3IgIkFudGlxdWF0ZWQgWkxJQiBzb2Z0d2FyZTsgeW91IG11c3QgdXNlIHZlcnNpb24gMS4wIG9yIGxhdGVyIgorI2VuZGlmCisKKyNkZWZpbmUgU0FGRV9NU0coc3ApICAgKChzcCktPnN0cmVhbS5tc2cgPT0gTlVMTCA/ICIiIDogKHNwKS0+c3RyZWFtLm1zZykKKworLyoKKyAqIFN0YXRlIGJsb2NrIGZvciBlYWNoIG9wZW4gVElGRgorICogZmlsZSB1c2luZyBaSVAgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCVRJRkZQcmVkaWN0b3JTdGF0ZSBwcmVkaWN0OworICAgICAgICB6X3N0cmVhbSAgICAgICAgc3RyZWFtOworCWludCAgICAgICAgICAgICB6aXBxdWFsaXR5OyAgICAgICAgICAgIC8qIGNvbXByZXNzaW9uIGxldmVsICovCisJaW50ICAgICAgICAgICAgIHN0YXRlOyAgICAgICAgICAgICAgICAgLyogc3RhdGUgZmxhZ3MgKi8KKyNkZWZpbmUgWlNUQVRFX0lOSVRfREVDT0RFIDB4MDEKKyNkZWZpbmUgWlNUQVRFX0lOSVRfRU5DT0RFIDB4MDIKKworCVRJRkZWR2V0TWV0aG9kICB2Z2V0cGFyZW50OyAgICAgICAgICAgIC8qIHN1cGVyLWNsYXNzIG1ldGhvZCAqLworCVRJRkZWU2V0TWV0aG9kICB2c2V0cGFyZW50OyAgICAgICAgICAgIC8qIHN1cGVyLWNsYXNzIG1ldGhvZCAqLworfSBaSVBTdGF0ZTsKKworI2RlZmluZSBaU3RhdGUodGlmKSAgICAgICAgICAgICAoKFpJUFN0YXRlKikgKHRpZiktPnRpZl9kYXRhKQorI2RlZmluZSBEZWNvZGVyU3RhdGUodGlmKSAgICAgICBaU3RhdGUodGlmKQorI2RlZmluZSBFbmNvZGVyU3RhdGUodGlmKSAgICAgICBaU3RhdGUodGlmKQorCitzdGF0aWMgaW50IFpJUEVuY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBicCwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKTsKK3N0YXRpYyBpbnQgWklQRGVjb2RlKFRJRkYqIHRpZiwgdWludDgqIG9wLCB0bXNpemVfdCBvY2MsIHVpbnQxNiBzKTsKKworc3RhdGljIGludAorWklQRml4dXBUYWdzKFRJRkYqIHRpZikKK3sKKwkodm9pZCkgdGlmOworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbnQKK1pJUFNldHVwRGVjb2RlKFRJRkYqIHRpZikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJaSVBTZXR1cERlY29kZSI7CisJWklQU3RhdGUqIHNwID0gRGVjb2RlclN0YXRlKHRpZik7CisKKwlhc3NlcnQoc3AgIT0gTlVMTCk7CisgICAgICAgIAorICAgICAgICAvKiBpZiB3ZSB3ZXJlIGxhc3QgZW5jb2RpbmcsIHRlcm1pbmF0ZSB0aGlzIG1vZGUgKi8KKwlpZiAoc3AtPnN0YXRlICYgWlNUQVRFX0lOSVRfRU5DT0RFKSB7CisJICAgIGRlZmxhdGVFbmQoJnNwLT5zdHJlYW0pOworCSAgICBzcC0+c3RhdGUgPSAwOworCX0KKworCWlmIChpbmZsYXRlSW5pdCgmc3AtPnN0cmVhbSkgIT0gWl9PSykgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiJXMiLCBTQUZFX01TRyhzcCkpOworCQlyZXR1cm4gKDApOworCX0gZWxzZSB7CisJCXNwLT5zdGF0ZSB8PSBaU1RBVEVfSU5JVF9ERUNPREU7CisJCXJldHVybiAoMSk7CisJfQorfQorCisvKgorICogU2V0dXAgc3RhdGUgZm9yIGRlY29kaW5nIGEgc3RyaXAuCisgKi8KK3N0YXRpYyBpbnQKK1pJUFByZURlY29kZShUSUZGKiB0aWYsIHVpbnQxNiBzKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlpJUFByZURlY29kZSI7CisJWklQU3RhdGUqIHNwID0gRGVjb2RlclN0YXRlKHRpZik7CisKKwkodm9pZCkgczsKKwlhc3NlcnQoc3AgIT0gTlVMTCk7CisKKwlpZiggKHNwLT5zdGF0ZSAmIFpTVEFURV9JTklUX0RFQ09ERSkgPT0gMCApCisgICAgICAgICAgICB0aWYtPnRpZl9zZXR1cGRlY29kZSggdGlmICk7CisKKwlzcC0+c3RyZWFtLm5leHRfaW4gPSB0aWYtPnRpZl9yYXdkYXRhOworCWFzc2VydChzaXplb2Yoc3AtPnN0cmVhbS5hdmFpbF9pbik9PTQpOyAgLyogaWYgdGhpcyBhc3NlcnQgZ2V0cyByYWlzZWQsCisJICAgIHdlIG5lZWQgdG8gc2ltcGxpZnkgdGhpcyBjb2RlIHRvIHJlZmxlY3QgYSBaTGliIHRoYXQgaXMgbGlrZWx5IHVwZGF0ZWQKKwkgICAgdG8gZGVhbCB3aXRoIDhieXRlIG1lbW9yeSBzaXplcywgdGhvdWdoIHRoaXMgY29kZSB3aWxsIHJlc3BvbmQKKwkgICAgYXByb3ByaWF0ZWx5IGV2ZW4gYmVmb3JlIHdlIHNpbXBsaWZ5IGl0ICovCisJc3AtPnN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KSB0aWYtPnRpZl9yYXdjYzsKKwlpZiAoKHRtc2l6ZV90KXNwLT5zdHJlYW0uYXZhaWxfaW4gIT0gdGlmLT50aWZfcmF3Y2MpCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiWkxpYiBjYW5ub3QgZGVhbCB3aXRoIGJ1ZmZlcnMgdGhpcyBzaXplIik7CisJCXJldHVybiAoMCk7CisJfQorCXJldHVybiAoaW5mbGF0ZVJlc2V0KCZzcC0+c3RyZWFtKSA9PSBaX09LKTsKK30KKworc3RhdGljIGludAorWklQRGVjb2RlKFRJRkYqIHRpZiwgdWludDgqIG9wLCB0bXNpemVfdCBvY2MsIHVpbnQxNiBzKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlpJUERlY29kZSI7CisJWklQU3RhdGUqIHNwID0gRGVjb2RlclN0YXRlKHRpZik7CisKKwkodm9pZCkgczsKKwlhc3NlcnQoc3AgIT0gTlVMTCk7CisJYXNzZXJ0KHNwLT5zdGF0ZSA9PSBaU1RBVEVfSU5JVF9ERUNPREUpOworCisgICAgICAgIHNwLT5zdHJlYW0ubmV4dF9pbiA9IHRpZi0+dGlmX3Jhd2NwOworCXNwLT5zdHJlYW0uYXZhaWxfaW4gPSAodUludCkgdGlmLT50aWZfcmF3Y2M7CisgICAgICAgIAorCXNwLT5zdHJlYW0ubmV4dF9vdXQgPSBvcDsKKwlhc3NlcnQoc2l6ZW9mKHNwLT5zdHJlYW0uYXZhaWxfb3V0KT09NCk7ICAvKiBpZiB0aGlzIGFzc2VydCBnZXRzIHJhaXNlZCwKKwkgICAgd2UgbmVlZCB0byBzaW1wbGlmeSB0aGlzIGNvZGUgdG8gcmVmbGVjdCBhIFpMaWIgdGhhdCBpcyBsaWtlbHkgdXBkYXRlZAorCSAgICB0byBkZWFsIHdpdGggOGJ5dGUgbWVtb3J5IHNpemVzLCB0aG91Z2ggdGhpcyBjb2RlIHdpbGwgcmVzcG9uZAorCSAgICBhcHJvcHJpYXRlbHkgZXZlbiBiZWZvcmUgd2Ugc2ltcGxpZnkgaXQgKi8KKwlzcC0+c3RyZWFtLmF2YWlsX291dCA9ICh1SW50KSBvY2M7CisJaWYgKCh0bXNpemVfdClzcC0+c3RyZWFtLmF2YWlsX291dCAhPSBvY2MpCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiWkxpYiBjYW5ub3QgZGVhbCB3aXRoIGJ1ZmZlcnMgdGhpcyBzaXplIik7CisJCXJldHVybiAoMCk7CisJfQorCWRvIHsKKwkJaW50IHN0YXRlID0gaW5mbGF0ZSgmc3AtPnN0cmVhbSwgWl9QQVJUSUFMX0ZMVVNIKTsKKwkJaWYgKHN0YXRlID09IFpfU1RSRUFNX0VORCkKKwkJCWJyZWFrOworCQlpZiAoc3RhdGUgPT0gWl9EQVRBX0VSUk9SKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICJEZWNvZGluZyBlcnJvciBhdCBzY2FubGluZSAlbHUsICVzIiwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX3JvdywgU0FGRV9NU0coc3ApKTsKKwkJCWlmIChpbmZsYXRlU3luYygmc3AtPnN0cmVhbSkgIT0gWl9PSykKKwkJCQlyZXR1cm4gKDApOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHN0YXRlICE9IFpfT0spIHsKKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsIAorCQkJCSAgICAgIlpMaWIgZXJyb3I6ICVzIiwgU0FGRV9NU0coc3ApKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwl9IHdoaWxlIChzcC0+c3RyZWFtLmF2YWlsX291dCA+IDApOworCWlmIChzcC0+c3RyZWFtLmF2YWlsX291dCAhPSAwKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCSAgICAiTm90IGVub3VnaCBkYXRhIGF0IHNjYW5saW5lICVsdSAoc2hvcnQgIiBUSUZGX1VJTlQ2NF9GT1JNQVQgIiBieXRlcykiLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX3JvdywgKFRJRkZfVUlOVDY0X1QpIHNwLT5zdHJlYW0uYXZhaWxfb3V0KTsKKwkJcmV0dXJuICgwKTsKKwl9CisKKyAgICAgICAgdGlmLT50aWZfcmF3Y3AgPSBzcC0+c3RyZWFtLm5leHRfaW47CisgICAgICAgIHRpZi0+dGlmX3Jhd2NjID0gc3AtPnN0cmVhbS5hdmFpbF9pbjsKKworCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbnQKK1pJUFNldHVwRW5jb2RlKFRJRkYqIHRpZikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJaSVBTZXR1cEVuY29kZSI7CisJWklQU3RhdGUqIHNwID0gRW5jb2RlclN0YXRlKHRpZik7CisKKwlhc3NlcnQoc3AgIT0gTlVMTCk7CisJaWYgKHNwLT5zdGF0ZSAmIFpTVEFURV9JTklUX0RFQ09ERSkgeworCQlpbmZsYXRlRW5kKCZzcC0+c3RyZWFtKTsKKwkJc3AtPnN0YXRlID0gMDsKKwl9CisKKwlpZiAoZGVmbGF0ZUluaXQoJnNwLT5zdHJlYW0sIHNwLT56aXBxdWFsaXR5KSAhPSBaX09LKSB7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICIlcyIsIFNBRkVfTVNHKHNwKSk7CisJCXJldHVybiAoMCk7CisJfSBlbHNlIHsKKwkJc3AtPnN0YXRlIHw9IFpTVEFURV9JTklUX0VOQ09ERTsKKwkJcmV0dXJuICgxKTsKKwl9Cit9CisKKy8qCisgKiBSZXNldCBlbmNvZGluZyBzdGF0ZSBhdCB0aGUgc3RhcnQgb2YgYSBzdHJpcC4KKyAqLworc3RhdGljIGludAorWklQUHJlRW5jb2RlKFRJRkYqIHRpZiwgdWludDE2IHMpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiWklQUHJlRW5jb2RlIjsKKwlaSVBTdGF0ZSAqc3AgPSBFbmNvZGVyU3RhdGUodGlmKTsKKworCSh2b2lkKSBzOworCWFzc2VydChzcCAhPSBOVUxMKTsKKwlpZiggc3AtPnN0YXRlICE9IFpTVEFURV9JTklUX0VOQ09ERSApCisgICAgICAgICAgICB0aWYtPnRpZl9zZXR1cGVuY29kZSggdGlmICk7CisKKwlzcC0+c3RyZWFtLm5leHRfb3V0ID0gdGlmLT50aWZfcmF3ZGF0YTsKKwlhc3NlcnQoc2l6ZW9mKHNwLT5zdHJlYW0uYXZhaWxfb3V0KT09NCk7ICAvKiBpZiB0aGlzIGFzc2VydCBnZXRzIHJhaXNlZCwKKwkgICAgd2UgbmVlZCB0byBzaW1wbGlmeSB0aGlzIGNvZGUgdG8gcmVmbGVjdCBhIFpMaWIgdGhhdCBpcyBsaWtlbHkgdXBkYXRlZAorCSAgICB0byBkZWFsIHdpdGggOGJ5dGUgbWVtb3J5IHNpemVzLCB0aG91Z2ggdGhpcyBjb2RlIHdpbGwgcmVzcG9uZAorCSAgICBhcHJvcHJpYXRlbHkgZXZlbiBiZWZvcmUgd2Ugc2ltcGxpZnkgaXQgKi8KKwlzcC0+c3RyZWFtLmF2YWlsX291dCA9IHRpZi0+dGlmX3Jhd2RhdGFzaXplOworCWlmICgodG1zaXplX3Qpc3AtPnN0cmVhbS5hdmFpbF9vdXQgIT0gdGlmLT50aWZfcmF3ZGF0YXNpemUpCisJeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiWkxpYiBjYW5ub3QgZGVhbCB3aXRoIGJ1ZmZlcnMgdGhpcyBzaXplIik7CisJCXJldHVybiAoMCk7CisJfQorCXJldHVybiAoZGVmbGF0ZVJlc2V0KCZzcC0+c3RyZWFtKSA9PSBaX09LKTsKK30KKworLyoKKyAqIEVuY29kZSBhIGNodW5rIG9mIHBpeGVscy4KKyAqLworc3RhdGljIGludAorWklQRW5jb2RlKFRJRkYqIHRpZiwgdWludDgqIGJwLCB0bXNpemVfdCBjYywgdWludDE2IHMpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiWklQRW5jb2RlIjsKKwlaSVBTdGF0ZSAqc3AgPSBFbmNvZGVyU3RhdGUodGlmKTsKKworCWFzc2VydChzcCAhPSBOVUxMKTsKKwlhc3NlcnQoc3AtPnN0YXRlID09IFpTVEFURV9JTklUX0VOQ09ERSk7CisKKwkodm9pZCkgczsKKwlzcC0+c3RyZWFtLm5leHRfaW4gPSBicDsKKwlhc3NlcnQoc2l6ZW9mKHNwLT5zdHJlYW0uYXZhaWxfaW4pPT00KTsgIC8qIGlmIHRoaXMgYXNzZXJ0IGdldHMgcmFpc2VkLAorCSAgICB3ZSBuZWVkIHRvIHNpbXBsaWZ5IHRoaXMgY29kZSB0byByZWZsZWN0IGEgWkxpYiB0aGF0IGlzIGxpa2VseSB1cGRhdGVkCisJICAgIHRvIGRlYWwgd2l0aCA4Ynl0ZSBtZW1vcnkgc2l6ZXMsIHRob3VnaCB0aGlzIGNvZGUgd2lsbCByZXNwb25kCisJICAgIGFwcm9wcmlhdGVseSBldmVuIGJlZm9yZSB3ZSBzaW1wbGlmeSBpdCAqLworCXNwLT5zdHJlYW0uYXZhaWxfaW4gPSAodUludCkgY2M7CisJaWYgKCh0bXNpemVfdClzcC0+c3RyZWFtLmF2YWlsX2luICE9IGNjKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIlpMaWIgY2Fubm90IGRlYWwgd2l0aCBidWZmZXJzIHRoaXMgc2l6ZSIpOworCQlyZXR1cm4gKDApOworCX0KKwlkbyB7CisJCWlmIChkZWZsYXRlKCZzcC0+c3RyZWFtLCBaX05PX0ZMVVNIKSAhPSBaX09LKSB7CisJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAKKwkJCQkgICAgICJFbmNvZGVyIGVycm9yOiAlcyIsCisJCQkJICAgICBTQUZFX01TRyhzcCkpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQlpZiAoc3AtPnN0cmVhbS5hdmFpbF9vdXQgPT0gMCkgeworCQkJdGlmLT50aWZfcmF3Y2MgPSB0aWYtPnRpZl9yYXdkYXRhc2l6ZTsKKwkJCVRJRkZGbHVzaERhdGExKHRpZik7CisJCQlzcC0+c3RyZWFtLm5leHRfb3V0ID0gdGlmLT50aWZfcmF3ZGF0YTsKKwkJCXNwLT5zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpIHRpZi0+dGlmX3Jhd2RhdGFzaXplOyAgLyogdGhpcyBpcyBhIHNhZmUgdHlwZWNhc3QsIGFzIGNoZWNrIGlzIG1hZGUgYWxyZWFkeSBpbiBaSVBQcmVFbmNvZGUgKi8KKwkJfQorCX0gd2hpbGUgKHNwLT5zdHJlYW0uYXZhaWxfaW4gPiAwKTsKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogRmluaXNoIG9mZiBhbiBlbmNvZGVkIHN0cmlwIGJ5IGZsdXNoaW5nIHRoZSBsYXN0CisgKiBzdHJpbmcgYW5kIHRhY2tpbmcgb24gYW4gRW5kIE9mIEluZm9ybWF0aW9uIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQKK1pJUFBvc3RFbmNvZGUoVElGRiogdGlmKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlpJUFBvc3RFbmNvZGUiOworCVpJUFN0YXRlICpzcCA9IEVuY29kZXJTdGF0ZSh0aWYpOworCWludCBzdGF0ZTsKKworCXNwLT5zdHJlYW0uYXZhaWxfaW4gPSAwOworCWRvIHsKKwkJc3RhdGUgPSBkZWZsYXRlKCZzcC0+c3RyZWFtLCBaX0ZJTklTSCk7CisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBaX1NUUkVBTV9FTkQ6CisJCWNhc2UgWl9PSzoKKwkJCWlmICgodG1zaXplX3Qpc3AtPnN0cmVhbS5hdmFpbF9vdXQgIT0gdGlmLT50aWZfcmF3ZGF0YXNpemUpCisJCQl7CisJCQkJdGlmLT50aWZfcmF3Y2MgPSAgdGlmLT50aWZfcmF3ZGF0YXNpemUgLSBzcC0+c3RyZWFtLmF2YWlsX291dDsKKwkJCQlUSUZGRmx1c2hEYXRhMSh0aWYpOworCQkJCXNwLT5zdHJlYW0ubmV4dF9vdXQgPSB0aWYtPnRpZl9yYXdkYXRhOworCQkJCXNwLT5zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpIHRpZi0+dGlmX3Jhd2RhdGFzaXplOyAgLyogdGhpcyBpcyBhIHNhZmUgdHlwZWNhc3QsIGFzIGNoZWNrIGlzIG1hZGUgYWxyZWFkeSBpbiBaSVBQcmVFbmNvZGUgKi8KKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgCisJCQkJICAgICAiWkxpYiBlcnJvcjogJXMiLCBTQUZFX01TRyhzcCkpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCX0gd2hpbGUgKHN0YXRlICE9IFpfU1RSRUFNX0VORCk7CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIHZvaWQKK1pJUENsZWFudXAoVElGRiogdGlmKQoreworCVpJUFN0YXRlKiBzcCA9IFpTdGF0ZSh0aWYpOworCisJYXNzZXJ0KHNwICE9IDApOworCisJKHZvaWQpVElGRlByZWRpY3RvckNsZWFudXAodGlmKTsKKworCXRpZi0+dGlmX3RhZ21ldGhvZHMudmdldGZpZWxkID0gc3AtPnZnZXRwYXJlbnQ7CisJdGlmLT50aWZfdGFnbWV0aG9kcy52c2V0ZmllbGQgPSBzcC0+dnNldHBhcmVudDsKKworCWlmIChzcC0+c3RhdGUgJiBaU1RBVEVfSU5JVF9FTkNPREUpIHsKKwkJZGVmbGF0ZUVuZCgmc3AtPnN0cmVhbSk7CisJCXNwLT5zdGF0ZSA9IDA7CisJfSBlbHNlIGlmKCBzcC0+c3RhdGUgJiBaU1RBVEVfSU5JVF9ERUNPREUpIHsKKwkJaW5mbGF0ZUVuZCgmc3AtPnN0cmVhbSk7CisJCXNwLT5zdGF0ZSA9IDA7CisJfQorCV9USUZGZnJlZShzcCk7CisJdGlmLT50aWZfZGF0YSA9IE5VTEw7CisKKwlfVElGRlNldERlZmF1bHRDb21wcmVzc2lvblN0YXRlKHRpZik7Cit9CisKK3N0YXRpYyBpbnQKK1pJUFZTZXRGaWVsZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcsIHZhX2xpc3QgYXApCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiWklQVlNldEZpZWxkIjsKKwlaSVBTdGF0ZSogc3AgPSBaU3RhdGUodGlmKTsKKworCXN3aXRjaCAodGFnKSB7CisJY2FzZSBUSUZGVEFHX1pJUFFVQUxJVFk6CisJCXNwLT56aXBxdWFsaXR5ID0gKGludCkgdmFfYXJnKGFwLCBpbnQpOworCQlpZiAoIHNwLT5zdGF0ZSZaU1RBVEVfSU5JVF9FTkNPREUgKSB7CisJCQlpZiAoZGVmbGF0ZVBhcmFtcygmc3AtPnN0cmVhbSwKKwkJCSAgICBzcC0+emlwcXVhbGl0eSwgWl9ERUZBVUxUX1NUUkFURUdZKSAhPSBaX09LKSB7CisJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIlpMaWIgZXJyb3I6ICVzIiwKKwkJCQkJICAgICBTQUZFX01TRyhzcCkpOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCX0KKwkJcmV0dXJuICgxKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKCpzcC0+dnNldHBhcmVudCkodGlmLCB0YWcsIGFwKTsKKwl9CisJLypOT1RSRUFDSEVEKi8KK30KKworc3RhdGljIGludAorWklQVkdldEZpZWxkKFRJRkYqIHRpZiwgdWludDMyIHRhZywgdmFfbGlzdCBhcCkKK3sKKwlaSVBTdGF0ZSogc3AgPSBaU3RhdGUodGlmKTsKKworCXN3aXRjaCAodGFnKSB7CisJY2FzZSBUSUZGVEFHX1pJUFFVQUxJVFk6CisJCSp2YV9hcmcoYXAsIGludCopID0gc3AtPnppcHF1YWxpdHk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAoKnNwLT52Z2V0cGFyZW50KSh0aWYsIHRhZywgYXApOworCX0KKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgY29uc3QgVElGRkZpZWxkIHppcEZpZWxkc1tdID0geworICAgIHsgVElGRlRBR19aSVBRVUFMSVRZLCAwLCAwLCBUSUZGX0FOWSwgMCwgVElGRl9TRVRHRVRfSU5ULCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1BTRVVETywgVFJVRSwgRkFMU0UsICIiLCBOVUxMIH0sCit9OworCitpbnQKK1RJRkZJbml0WklQKFRJRkYqIHRpZiwgaW50IHNjaGVtZSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGSW5pdFpJUCI7CisJWklQU3RhdGUqIHNwOworCisJYXNzZXJ0KCAoc2NoZW1lID09IENPTVBSRVNTSU9OX0RFRkxBVEUpCisJCXx8IChzY2hlbWUgPT0gQ09NUFJFU1NJT05fQURPQkVfREVGTEFURSkpOworCisJLyoKKwkgKiBNZXJnZSBjb2RlYy1zcGVjaWZpYyB0YWcgaW5mb3JtYXRpb24uCisJICovCisJaWYgKCFfVElGRk1lcmdlRmllbGRzKHRpZiwgemlwRmllbGRzLCBUSUZGQXJyYXlDb3VudCh6aXBGaWVsZHMpKSkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkJICAgICAiTWVyZ2luZyBEZWZsYXRlIGNvZGVjLXNwZWNpZmljIHRhZ3MgZmFpbGVkIik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogQWxsb2NhdGUgc3RhdGUgYmxvY2sgc28gdGFnIG1ldGhvZHMgaGF2ZSBzdG9yYWdlIHRvIHJlY29yZCB2YWx1ZXMuCisJICovCisJdGlmLT50aWZfZGF0YSA9ICh1aW50OCopIF9USUZGbWFsbG9jKHNpemVvZiAoWklQU3RhdGUpKTsKKwlpZiAodGlmLT50aWZfZGF0YSA9PSBOVUxMKQorCQlnb3RvIGJhZDsKKwlzcCA9IFpTdGF0ZSh0aWYpOworCXNwLT5zdHJlYW0uemFsbG9jID0gTlVMTDsKKwlzcC0+c3RyZWFtLnpmcmVlID0gTlVMTDsKKwlzcC0+c3RyZWFtLm9wYXF1ZSA9IE5VTEw7CisJc3AtPnN0cmVhbS5kYXRhX3R5cGUgPSBaX0JJTkFSWTsKKworCS8qCisJICogT3ZlcnJpZGUgcGFyZW50IGdldC9zZXQgZmllbGQgbWV0aG9kcy4KKwkgKi8KKwlzcC0+dmdldHBhcmVudCA9IHRpZi0+dGlmX3RhZ21ldGhvZHMudmdldGZpZWxkOworCXRpZi0+dGlmX3RhZ21ldGhvZHMudmdldGZpZWxkID0gWklQVkdldEZpZWxkOyAvKiBob29rIGZvciBjb2RlYyB0YWdzICovCisJc3AtPnZzZXRwYXJlbnQgPSB0aWYtPnRpZl90YWdtZXRob2RzLnZzZXRmaWVsZDsKKwl0aWYtPnRpZl90YWdtZXRob2RzLnZzZXRmaWVsZCA9IFpJUFZTZXRGaWVsZDsgLyogaG9vayBmb3IgY29kZWMgdGFncyAqLworCisJLyogRGVmYXVsdCB2YWx1ZXMgZm9yIGNvZGVjLXNwZWNpZmljIGZpZWxkcyAqLworCXNwLT56aXBxdWFsaXR5ID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OOwkvKiBkZWZhdWx0IGNvbXAuIGxldmVsICovCisJc3AtPnN0YXRlID0gMDsKKworCS8qCisJICogSW5zdGFsbCBjb2RlYyBtZXRob2RzLgorCSAqLworCXRpZi0+dGlmX2ZpeHVwdGFncyA9IFpJUEZpeHVwVGFnczsgCisJdGlmLT50aWZfc2V0dXBkZWNvZGUgPSBaSVBTZXR1cERlY29kZTsKKwl0aWYtPnRpZl9wcmVkZWNvZGUgPSBaSVBQcmVEZWNvZGU7CisJdGlmLT50aWZfZGVjb2Rlcm93ID0gWklQRGVjb2RlOworCXRpZi0+dGlmX2RlY29kZXN0cmlwID0gWklQRGVjb2RlOworCXRpZi0+dGlmX2RlY29kZXRpbGUgPSBaSVBEZWNvZGU7ICAKKwl0aWYtPnRpZl9zZXR1cGVuY29kZSA9IFpJUFNldHVwRW5jb2RlOworCXRpZi0+dGlmX3ByZWVuY29kZSA9IFpJUFByZUVuY29kZTsKKwl0aWYtPnRpZl9wb3N0ZW5jb2RlID0gWklQUG9zdEVuY29kZTsKKwl0aWYtPnRpZl9lbmNvZGVyb3cgPSBaSVBFbmNvZGU7CisJdGlmLT50aWZfZW5jb2Rlc3RyaXAgPSBaSVBFbmNvZGU7CisJdGlmLT50aWZfZW5jb2RldGlsZSA9IFpJUEVuY29kZTsKKwl0aWYtPnRpZl9jbGVhbnVwID0gWklQQ2xlYW51cDsKKwkvKgorCSAqIFNldHVwIHByZWRpY3RvciBzZXR1cC4KKwkgKi8KKwkodm9pZCkgVElGRlByZWRpY3RvckluaXQodGlmKTsKKwlyZXR1cm4gKDEpOworYmFkOgorCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisJCSAgICAgIk5vIHNwYWNlIGZvciBaSVAgc3RhdGUgYmxvY2siKTsKKwlyZXR1cm4gKDApOworfQorI2VuZGlmIC8qIFpJUF9TVVBPUlQgKi8KKworLyogdmltOiBzZXQgdHM9OCBzdHM9OCBzdz04IG5vZXQ6ICovCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmYuaCBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNDZhY2QKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmYuaApAQCAtMCwwICsxLDY4MSBAQAorLyogJElkOiB0aWZmLmgsdiAxLjY5IDIwMTQtMDQtMDIgMTc6MjM6MDYgZndhcm1lcmRhbSBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCAKKyAqIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQKKyAqIHRoYXQgKGkpIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCByZWxhdGVkIGRvY3VtZW50YXRpb24sIGFuZCAoaWkpIHRoZSBuYW1lcyBvZgorICogU2FtIExlZmZsZXIgYW5kIFNpbGljb24gR3JhcGhpY3MgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHRoZSBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbiBvZiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcy4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUy1JUyIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSAKKyAqIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBTQU0gTEVGRkxFUiBPUiBTSUxJQ09OIEdSQVBISUNTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsCisgKiBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisgKiBXSEVUSEVSIE9SIE5PVCBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GIAorICogTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSAKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfVElGRl8KKyNkZWZpbmUJX1RJRkZfCisKKyNpbmNsdWRlICJ0aWZmY29uZi5oIgorCisvKgorICogVGFnIEltYWdlIEZpbGUgRm9ybWF0IChUSUZGKQorICoKKyAqIEJhc2VkIG9uIFJldiA2LjAgZnJvbToKKyAqICAgIERldmVsb3BlcidzIERlc2sKKyAqICAgIEFsZHVzIENvcnBvcmF0aW9uCisgKiAgICA0MTEgRmlyc3QgQXZlLiBTb3V0aAorICogICAgU3VpdGUgMjAwCisgKiAgICBTZWF0dGxlLCBXQSAgOTgxMDQKKyAqICAgIDIwNi02MjItNTUwMAorICoKKyAqICAgIChodHRwOi8vcGFydG5lcnMuYWRvYmUuY29tL2Fzbi9kZXZlbG9wZXIvUERGUy9UTi9USUZGNi5wZGYpCisgKgorICogRm9yIEJpZ1RJRkYgZGVzaWduIG5vdGVzIHNlZSB0aGUgZm9sbG93aW5nIGxpbmtzCisgKiAgICBodHRwOi8vd3d3LnJlbW90ZXNlbnNpbmcub3JnL2xpYnRpZmYvYmlndGlmZmRlc2lnbi5odG1sCisgKiAgICBodHRwOi8vd3d3LmF3YXJlc3lzdGVtcy5iZS9pbWFnaW5nL3RpZmYvYmlndGlmZi5odG1sCisgKi8KKworI2RlZmluZSBUSUZGX1ZFUlNJT05fQ0xBU1NJQyA0MgorI2RlZmluZSBUSUZGX1ZFUlNJT05fQklHIDQzCisKKyNkZWZpbmUgVElGRl9CSUdFTkRJQU4gICAgICAweDRkNGQKKyNkZWZpbmUgVElGRl9MSVRUTEVFTkRJQU4gICAweDQ5NDkKKyNkZWZpbmUgTURJX0xJVFRMRUVORElBTiAgICAweDUwNDUKKyNkZWZpbmUgTURJX0JJR0VORElBTiAgICAgICAweDQ1NTAKKworLyoKKyAqIEludHJpbnNpYyBkYXRhIHR5cGVzIHJlcXVpcmVkIGJ5IHRoZSBmaWxlIGZvcm1hdDoKKyAqCisgKiA4LWJpdCBxdWFudGl0aWVzICAgICBpbnQ4L3VpbnQ4CisgKiAxNi1iaXQgcXVhbnRpdGllcyAgICBpbnQxNi91aW50MTYKKyAqIDMyLWJpdCBxdWFudGl0aWVzICAgIGludDMyL3VpbnQzMgorICogNjQtYml0IHF1YW50aXRpZXMgICAgaW50NjQvdWludDY0CisgKiBzdHJpbmdzICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKgorICovCisKK3R5cGVkZWYgVElGRl9JTlQ4X1QgICBpbnQ4OwordHlwZWRlZiBUSUZGX1VJTlQ4X1QgIHVpbnQ4OworCit0eXBlZGVmIFRJRkZfSU5UMTZfVCAgaW50MTY7Cit0eXBlZGVmIFRJRkZfVUlOVDE2X1QgdWludDE2OworCit0eXBlZGVmIFRJRkZfSU5UMzJfVCAgaW50MzI7Cit0eXBlZGVmIFRJRkZfVUlOVDMyX1QgdWludDMyOworCit0eXBlZGVmIFRJRkZfSU5UNjRfVCAgaW50NjQ7Cit0eXBlZGVmIFRJRkZfVUlOVDY0X1QgdWludDY0OworCisvKgorICogU29tZSB0eXBlcyBhcyBwcm9tb3RlZCBpbiBhIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3QKKyAqIFdlIHVzZSB1aW50MTZfdmFwIHJhdGhlciB0aGVuIGRpcmVjdGx5IHVzaW5nIGludCwgYmVjYXVzZSB0aGlzIHdheQorICogd2UgZG9jdW1lbnQgdGhlIHR5cGUgd2UgYWN0dWFsbHkgd2FudCB0byBwYXNzIHRocm91Z2gsIGNvbmNlcHR1YWxseSwKKyAqIHJhdGhlciB0aGVuIGNvbmZ1c2luZyB0aGUgaXNzdWUgYnkgbWVyZWx5IHN0YXRpbmcgdGhlIHR5cGUgaXQgZ2V0cworICogcHJvbW90ZWQgdG8KKyAqLworCit0eXBlZGVmIGludCB1aW50MTZfdmFwOworCisvKgorICogVElGRiBoZWFkZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTYgdGlmZl9tYWdpYzsgICAgICAvKiBtYWdpYyBudW1iZXIgKGRlZmluZXMgYnl0ZSBvcmRlcikgKi8KKwl1aW50MTYgdGlmZl92ZXJzaW9uOyAgICAvKiBUSUZGIHZlcnNpb24gbnVtYmVyICovCit9IFRJRkZIZWFkZXJDb21tb247Cit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2IHRpZmZfbWFnaWM7ICAgICAgLyogbWFnaWMgbnVtYmVyIChkZWZpbmVzIGJ5dGUgb3JkZXIpICovCisJdWludDE2IHRpZmZfdmVyc2lvbjsgICAgLyogVElGRiB2ZXJzaW9uIG51bWJlciAqLworCXVpbnQzMiB0aWZmX2Rpcm9mZjsgICAgIC8qIGJ5dGUgb2Zmc2V0IHRvIGZpcnN0IGRpcmVjdG9yeSAqLworfSBUSUZGSGVhZGVyQ2xhc3NpYzsKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MTYgdGlmZl9tYWdpYzsgICAgICAvKiBtYWdpYyBudW1iZXIgKGRlZmluZXMgYnl0ZSBvcmRlcikgKi8KKwl1aW50MTYgdGlmZl92ZXJzaW9uOyAgICAvKiBUSUZGIHZlcnNpb24gbnVtYmVyICovCisJdWludDE2IHRpZmZfb2Zmc2V0c2l6ZTsgLyogc2l6ZSBvZiBvZmZzZXRzLCBzaG91bGQgYmUgOCAqLworCXVpbnQxNiB0aWZmX3VudXNlZDsgICAgIC8qIHVudXNlZCB3b3JkLCBzaG91bGQgYmUgMCAqLworCXVpbnQ2NCB0aWZmX2Rpcm9mZjsgICAgIC8qIGJ5dGUgb2Zmc2V0IHRvIGZpcnN0IGRpcmVjdG9yeSAqLworfSBUSUZGSGVhZGVyQmlnOworCisKKy8qCisgKiBOQjogSW4gdGhlIGNvbW1lbnRzIGJlbG93LAorICogIC0gaXRlbXMgbWFya2VkIHdpdGggYSArIGFyZSBvYnNvbGV0ZWQgYnkgcmV2aXNpb24gNS4wLAorICogIC0gaXRlbXMgbWFya2VkIHdpdGggYSAhIGFyZSBpbnRyb2R1Y2VkIGluIHJldmlzaW9uIDYuMC4KKyAqICAtIGl0ZW1zIG1hcmtlZCB3aXRoIGEgJSBhcmUgaW50cm9kdWNlZCBwb3N0IHJldmlzaW9uIDYuMC4KKyAqICAtIGl0ZW1zIG1hcmtlZCB3aXRoIGEgJCBhcmUgb2Jzb2xldGVkIGJ5IHJldmlzaW9uIDYuMC4KKyAqICAtIGl0ZW1zIG1hcmtlZCB3aXRoIGEgJiBhcmUgaW50cm9kdWNlZCBieSBBZG9iZSBETkcgc3BlY2lmaWNhdGlvbi4KKyAqLworCisvKgorICogVGFnIGRhdGEgdHlwZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBOb3RlOiBSQVRJT05BTHMgYXJlIHRoZSByYXRpbyBvZiB0d28gMzItYml0IGludGVnZXIgdmFsdWVzLgorICovCit0eXBlZGVmIGVudW0geworCVRJRkZfTk9UWVBFID0gMCwgICAgICAvKiBwbGFjZWhvbGRlciAqLworCVRJRkZfQllURSA9IDEsICAgICAgICAvKiA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyICovCisJVElGRl9BU0NJSSA9IDIsICAgICAgIC8qIDgtYml0IGJ5dGVzIHcvIGxhc3QgYnl0ZSBudWxsICovCisJVElGRl9TSE9SVCA9IDMsICAgICAgIC8qIDE2LWJpdCB1bnNpZ25lZCBpbnRlZ2VyICovCisJVElGRl9MT05HID0gNCwgICAgICAgIC8qIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyICovCisJVElGRl9SQVRJT05BTCA9IDUsICAgIC8qIDY0LWJpdCB1bnNpZ25lZCBmcmFjdGlvbiAqLworCVRJRkZfU0JZVEUgPSA2LCAgICAgICAvKiAhOC1iaXQgc2lnbmVkIGludGVnZXIgKi8KKwlUSUZGX1VOREVGSU5FRCA9IDcsICAgLyogITgtYml0IHVudHlwZWQgZGF0YSAqLworCVRJRkZfU1NIT1JUID0gOCwgICAgICAvKiAhMTYtYml0IHNpZ25lZCBpbnRlZ2VyICovCisJVElGRl9TTE9ORyA9IDksICAgICAgIC8qICEzMi1iaXQgc2lnbmVkIGludGVnZXIgKi8KKwlUSUZGX1NSQVRJT05BTCA9IDEwLCAgLyogITY0LWJpdCBzaWduZWQgZnJhY3Rpb24gKi8KKwlUSUZGX0ZMT0FUID0gMTEsICAgICAgLyogITMyLWJpdCBJRUVFIGZsb2F0aW5nIHBvaW50ICovCisJVElGRl9ET1VCTEUgPSAxMiwgICAgIC8qICE2NC1iaXQgSUVFRSBmbG9hdGluZyBwb2ludCAqLworCVRJRkZfSUZEID0gMTMsICAgICAgICAvKiAlMzItYml0IHVuc2lnbmVkIGludGVnZXIgKG9mZnNldCkgKi8KKwlUSUZGX0xPTkc4ID0gMTYsICAgICAgLyogQmlnVElGRiA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciAqLworCVRJRkZfU0xPTkc4ID0gMTcsICAgICAvKiBCaWdUSUZGIDY0LWJpdCBzaWduZWQgaW50ZWdlciAqLworCVRJRkZfSUZEOCA9IDE4ICAgICAgICAvKiBCaWdUSUZGIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIChvZmZzZXQpICovCit9IFRJRkZEYXRhVHlwZTsKKworLyoKKyAqIFRJRkYgVGFnIERlZmluaXRpb25zLgorICovCisjZGVmaW5lCVRJRkZUQUdfU1VCRklMRVRZUEUJCTI1NAkvKiBzdWJmaWxlIGRhdGEgZGVzY3JpcHRvciAqLworI2RlZmluZQkgICAgRklMRVRZUEVfUkVEVUNFRElNQUdFCTB4MQkvKiByZWR1Y2VkIHJlc29sdXRpb24gdmVyc2lvbiAqLworI2RlZmluZQkgICAgRklMRVRZUEVfUEFHRQkJMHgyCS8qIG9uZSBwYWdlIG9mIG1hbnkgKi8KKyNkZWZpbmUJICAgIEZJTEVUWVBFX01BU0sJCTB4NAkvKiB0cmFuc3BhcmVuY3kgbWFzayAqLworI2RlZmluZQlUSUZGVEFHX09TVUJGSUxFVFlQRQkJMjU1CS8qICtraW5kIG9mIGRhdGEgaW4gc3ViZmlsZSAqLworI2RlZmluZQkgICAgT0ZJTEVUWVBFX0lNQUdFCQkxCS8qIGZ1bGwgcmVzb2x1dGlvbiBpbWFnZSBkYXRhICovCisjZGVmaW5lCSAgICBPRklMRVRZUEVfUkVEVUNFRElNQUdFCTIJLyogcmVkdWNlZCBzaXplIGltYWdlIGRhdGEgKi8KKyNkZWZpbmUJICAgIE9GSUxFVFlQRV9QQUdFCQkzCS8qIG9uZSBwYWdlIG9mIG1hbnkgKi8KKyNkZWZpbmUJVElGRlRBR19JTUFHRVdJRFRICQkyNTYJLyogaW1hZ2Ugd2lkdGggaW4gcGl4ZWxzICovCisjZGVmaW5lCVRJRkZUQUdfSU1BR0VMRU5HVEgJCTI1NwkvKiBpbWFnZSBoZWlnaHQgaW4gcGl4ZWxzICovCisjZGVmaW5lCVRJRkZUQUdfQklUU1BFUlNBTVBMRQkJMjU4CS8qIGJpdHMgcGVyIGNoYW5uZWwgKHNhbXBsZSkgKi8KKyNkZWZpbmUJVElGRlRBR19DT01QUkVTU0lPTgkJMjU5CS8qIGRhdGEgY29tcHJlc3Npb24gdGVjaG5pcXVlICovCisjZGVmaW5lCSAgICBDT01QUkVTU0lPTl9OT05FCQkxCS8qIGR1bXAgbW9kZSAqLworI2RlZmluZQkgICAgQ09NUFJFU1NJT05fQ0NJVFRSTEUJMgkvKiBDQ0lUVCBtb2RpZmllZCBIdWZmbWFuIFJMRSAqLworI2RlZmluZQkgICAgQ09NUFJFU1NJT05fQ0NJVFRGQVgzCTMJLyogQ0NJVFQgR3JvdXAgMyBmYXggZW5jb2RpbmcgKi8KKyNkZWZpbmUgICAgIENPTVBSRVNTSU9OX0NDSVRUX1Q0ICAgICAgICAzICAgICAgIC8qIENDSVRUIFQuNCAoVElGRiA2IG5hbWUpICovCisjZGVmaW5lCSAgICBDT01QUkVTU0lPTl9DQ0lUVEZBWDQJNAkvKiBDQ0lUVCBHcm91cCA0IGZheCBlbmNvZGluZyAqLworI2RlZmluZSAgICAgQ09NUFJFU1NJT05fQ0NJVFRfVDYgICAgICAgIDQgICAgICAgLyogQ0NJVFQgVC42IChUSUZGIDYgbmFtZSkgKi8KKyNkZWZpbmUJICAgIENPTVBSRVNTSU9OX0xaVwkJNSAgICAgICAvKiBMZW1wZWwtWml2ICAmIFdlbGNoICovCisjZGVmaW5lCSAgICBDT01QUkVTU0lPTl9PSlBFRwkJNgkvKiAhNi4wIEpQRUcgKi8KKyNkZWZpbmUJICAgIENPTVBSRVNTSU9OX0pQRUcJCTcJLyogJUpQRUcgRENUIGNvbXByZXNzaW9uICovCisjZGVmaW5lICAgICBDT01QUkVTU0lPTl9UODUJCQk5CS8qICFUSUZGL0ZYIFQuODUgSkJJRyBjb21wcmVzc2lvbiAqLworI2RlZmluZSAgICAgQ09NUFJFU1NJT05fVDQzCQkJMTAJLyogIVRJRkYvRlggVC40MyBjb2xvdXIgYnkgbGF5ZXJlZCBKQklHIGNvbXByZXNzaW9uICovCisjZGVmaW5lCSAgICBDT01QUkVTU0lPTl9ORVhUCQkzMjc2NgkvKiBOZVhUIDItYml0IFJMRSAqLworI2RlZmluZQkgICAgQ09NUFJFU1NJT05fQ0NJVFRSTEVXCTMyNzcxCS8qICMxIHcvIHdvcmQgYWxpZ25tZW50ICovCisjZGVmaW5lCSAgICBDT01QUkVTU0lPTl9QQUNLQklUUwkzMjc3MwkvKiBNYWNpbnRvc2ggUkxFICovCisjZGVmaW5lCSAgICBDT01QUkVTU0lPTl9USFVOREVSU0NBTgkzMjgwOQkvKiBUaHVuZGVyU2NhbiBSTEUgKi8KKy8qIGNvZGVzIDMyODk1LTMyODk4IGFyZSByZXNlcnZlZCBmb3IgQU5TSSBJVDggVElGRi9JVCA8ZGtlbGx5QGFwYWdvLmNvbSkgKi8KKyNkZWZpbmUJICAgIENPTVBSRVNTSU9OX0lUOENUUEFECTMyODk1ICAgLyogSVQ4IENUIHcvcGFkZGluZyAqLworI2RlZmluZQkgICAgQ09NUFJFU1NJT05fSVQ4TFcJCTMyODk2ICAgLyogSVQ4IExpbmV3b3JrIFJMRSAqLworI2RlZmluZQkgICAgQ09NUFJFU1NJT05fSVQ4TVAJCTMyODk3ICAgLyogSVQ4IE1vbm9jaHJvbWUgcGljdHVyZSAqLworI2RlZmluZQkgICAgQ09NUFJFU1NJT05fSVQ4QkwJCTMyODk4ICAgLyogSVQ4IEJpbmFyeSBsaW5lIGFydCAqLworLyogY29tcHJlc3Npb24gY29kZXMgMzI5MDgtMzI5MTEgYXJlIHJlc2VydmVkIGZvciBQaXhhciAqLworI2RlZmluZSAgICAgQ09NUFJFU1NJT05fUElYQVJGSUxNCTMyOTA4ICAgLyogUGl4YXIgY29tcGFuZGVkIDEwYml0IExaVyAqLworI2RlZmluZQkgICAgQ09NUFJFU1NJT05fUElYQVJMT0cJMzI5MDkgICAvKiBQaXhhciBjb21wYW5kZWQgMTFiaXQgWklQICovCisjZGVmaW5lCSAgICBDT01QUkVTU0lPTl9ERUZMQVRFCQkzMjk0NgkvKiBEZWZsYXRlIGNvbXByZXNzaW9uICovCisjZGVmaW5lICAgICBDT01QUkVTU0lPTl9BRE9CRV9ERUZMQVRFICAgOCAgICAgICAvKiBEZWZsYXRlIGNvbXByZXNzaW9uLAorCQkJCQkJICAgYXMgcmVjb2duaXplZCBieSBBZG9iZSAqLworLyogY29tcHJlc3Npb24gY29kZSAzMjk0NyBpcyByZXNlcnZlZCBmb3IgT2NlYW5hIE1hdHJpeCA8ZGV2QG9jZWFuYS5jb20+ICovCisjZGVmaW5lICAgICBDT01QUkVTU0lPTl9EQ1MgICAgICAgICAgICAgMzI5NDcgICAvKiBLb2RhayBEQ1MgZW5jb2RpbmcgKi8KKyNkZWZpbmUJICAgIENPTVBSRVNTSU9OX0pCSUcJCTM0NjYxCS8qIElTTyBKQklHICovCisjZGVmaW5lICAgICBDT01QUkVTU0lPTl9TR0lMT0cJCTM0Njc2CS8qIFNHSSBMb2cgTHVtaW5hbmNlIFJMRSAqLworI2RlZmluZSAgICAgQ09NUFJFU1NJT05fU0dJTE9HMjQJMzQ2NzcJLyogU0dJIExvZyAyNC1iaXQgcGFja2VkICovCisjZGVmaW5lICAgICBDT01QUkVTU0lPTl9KUDIwMDAgICAgICAgICAgMzQ3MTIgICAvKiBMZWFkdG9vbHMgSlBFRzIwMDAgKi8KKyNkZWZpbmUJICAgIENPTVBSRVNTSU9OX0xaTUEJCTM0OTI1CS8qIExaTUEyICovCisjZGVmaW5lCVRJRkZUQUdfUEhPVE9NRVRSSUMJCTI2MgkvKiBwaG90b21ldHJpYyBpbnRlcnByZXRhdGlvbiAqLworI2RlZmluZQkgICAgUEhPVE9NRVRSSUNfTUlOSVNXSElURQkwCS8qIG1pbiB2YWx1ZSBpcyB3aGl0ZSAqLworI2RlZmluZQkgICAgUEhPVE9NRVRSSUNfTUlOSVNCTEFDSwkxCS8qIG1pbiB2YWx1ZSBpcyBibGFjayAqLworI2RlZmluZQkgICAgUEhPVE9NRVRSSUNfUkdCCQkyCS8qIFJHQiBjb2xvciBtb2RlbCAqLworI2RlZmluZQkgICAgUEhPVE9NRVRSSUNfUEFMRVRURQkJMwkvKiBjb2xvciBtYXAgaW5kZXhlZCAqLworI2RlZmluZQkgICAgUEhPVE9NRVRSSUNfTUFTSwkJNAkvKiAkaG9sZG91dCBtYXNrICovCisjZGVmaW5lCSAgICBQSE9UT01FVFJJQ19TRVBBUkFURUQJNQkvKiAhY29sb3Igc2VwYXJhdGlvbnMgKi8KKyNkZWZpbmUJICAgIFBIT1RPTUVUUklDX1lDQkNSCQk2CS8qICFDQ0lSIDYwMSAqLworI2RlZmluZQkgICAgUEhPVE9NRVRSSUNfQ0lFTEFCCQk4CS8qICExOTc2IENJRSBMKmEqYiogKi8KKyNkZWZpbmUJICAgIFBIT1RPTUVUUklDX0lDQ0xBQgkJOQkvKiBJQ0MgTCphKmIqIFtBZG9iZSBUSUZGIFRlY2hub3RlIDRdICovCisjZGVmaW5lCSAgICBQSE9UT01FVFJJQ19JVFVMQUIJCTEwCS8qIElUVSBMKmEqYiogKi8KKyNkZWZpbmUJICAgIFBIT1RPTUVUUklDX0NGQQkJMzI4MDMJLyogY29sb3IgZmlsdGVyIGFycmF5ICovCisjZGVmaW5lICAgICBQSE9UT01FVFJJQ19MT0dMCQkzMjg0NAkvKiBDSUUgTG9nMihMKSAqLworI2RlZmluZSAgICAgUEhPVE9NRVRSSUNfTE9HTFVWCQkzMjg0NQkvKiBDSUUgTG9nMihMKSAodScsdicpICovCisjZGVmaW5lCVRJRkZUQUdfVEhSRVNISE9MRElORwkJMjYzCS8qICt0aHJlc2hvbGRpbmcgdXNlZCBvbiBkYXRhICovCisjZGVmaW5lCSAgICBUSFJFU0hIT0xEX0JJTEVWRUwJCTEJLyogYiZ3IGFydCBzY2FuICovCisjZGVmaW5lCSAgICBUSFJFU0hIT0xEX0hBTEZUT05FCQkyCS8qIG9yIGRpdGhlcmVkIHNjYW4gKi8KKyNkZWZpbmUJICAgIFRIUkVTSEhPTERfRVJST1JESUZGVVNFCTMJLyogdXN1YWxseSBmbG95ZC1zdGVpbmJlcmcgKi8KKyNkZWZpbmUJVElGRlRBR19DRUxMV0lEVEgJCTI2NAkvKiArZGl0aGVyaW5nIG1hdHJpeCB3aWR0aCAqLworI2RlZmluZQlUSUZGVEFHX0NFTExMRU5HVEgJCTI2NQkvKiArZGl0aGVyaW5nIG1hdHJpeCBoZWlnaHQgKi8KKyNkZWZpbmUJVElGRlRBR19GSUxMT1JERVIJCTI2NgkvKiBkYXRhIG9yZGVyIHdpdGhpbiBhIGJ5dGUgKi8KKyNkZWZpbmUJICAgIEZJTExPUkRFUl9NU0IyTFNCCQkxCS8qIG1vc3Qgc2lnbmlmaWNhbnQgLT4gbGVhc3QgKi8KKyNkZWZpbmUJICAgIEZJTExPUkRFUl9MU0IyTVNCCQkyCS8qIGxlYXN0IHNpZ25pZmljYW50IC0+IG1vc3QgKi8KKyNkZWZpbmUJVElGRlRBR19ET0NVTUVOVE5BTUUJCTI2OQkvKiBuYW1lIG9mIGRvYy4gaW1hZ2UgaXMgZnJvbSAqLworI2RlZmluZQlUSUZGVEFHX0lNQUdFREVTQ1JJUFRJT04JMjcwCS8qIGluZm8gYWJvdXQgaW1hZ2UgKi8KKyNkZWZpbmUJVElGRlRBR19NQUtFCQkJMjcxCS8qIHNjYW5uZXIgbWFudWZhY3R1cmVyIG5hbWUgKi8KKyNkZWZpbmUJVElGRlRBR19NT0RFTAkJCTI3MgkvKiBzY2FubmVyIG1vZGVsIG5hbWUvbnVtYmVyICovCisjZGVmaW5lCVRJRkZUQUdfU1RSSVBPRkZTRVRTCQkyNzMJLyogb2Zmc2V0cyB0byBkYXRhIHN0cmlwcyAqLworI2RlZmluZQlUSUZGVEFHX09SSUVOVEFUSU9OCQkyNzQJLyogK2ltYWdlIG9yaWVudGF0aW9uICovCisjZGVmaW5lCSAgICBPUklFTlRBVElPTl9UT1BMRUZUCQkxCS8qIHJvdyAwIHRvcCwgY29sIDAgbGhzICovCisjZGVmaW5lCSAgICBPUklFTlRBVElPTl9UT1BSSUdIVAkyCS8qIHJvdyAwIHRvcCwgY29sIDAgcmhzICovCisjZGVmaW5lCSAgICBPUklFTlRBVElPTl9CT1RSSUdIVAkzCS8qIHJvdyAwIGJvdHRvbSwgY29sIDAgcmhzICovCisjZGVmaW5lCSAgICBPUklFTlRBVElPTl9CT1RMRUZUCQk0CS8qIHJvdyAwIGJvdHRvbSwgY29sIDAgbGhzICovCisjZGVmaW5lCSAgICBPUklFTlRBVElPTl9MRUZUVE9QCQk1CS8qIHJvdyAwIGxocywgY29sIDAgdG9wICovCisjZGVmaW5lCSAgICBPUklFTlRBVElPTl9SSUdIVFRPUAk2CS8qIHJvdyAwIHJocywgY29sIDAgdG9wICovCisjZGVmaW5lCSAgICBPUklFTlRBVElPTl9SSUdIVEJPVAk3CS8qIHJvdyAwIHJocywgY29sIDAgYm90dG9tICovCisjZGVmaW5lCSAgICBPUklFTlRBVElPTl9MRUZUQk9UCQk4CS8qIHJvdyAwIGxocywgY29sIDAgYm90dG9tICovCisjZGVmaW5lCVRJRkZUQUdfU0FNUExFU1BFUlBJWEVMCQkyNzcJLyogc2FtcGxlcyBwZXIgcGl4ZWwgKi8KKyNkZWZpbmUJVElGRlRBR19ST1dTUEVSU1RSSVAJCTI3OAkvKiByb3dzIHBlciBzdHJpcCBvZiBkYXRhICovCisjZGVmaW5lCVRJRkZUQUdfU1RSSVBCWVRFQ09VTlRTCQkyNzkJLyogYnl0ZXMgY291bnRzIGZvciBzdHJpcHMgKi8KKyNkZWZpbmUJVElGRlRBR19NSU5TQU1QTEVWQUxVRQkJMjgwCS8qICttaW5pbXVtIHNhbXBsZSB2YWx1ZSAqLworI2RlZmluZQlUSUZGVEFHX01BWFNBTVBMRVZBTFVFCQkyODEJLyogK21heGltdW0gc2FtcGxlIHZhbHVlICovCisjZGVmaW5lCVRJRkZUQUdfWFJFU09MVVRJT04JCTI4MgkvKiBwaXhlbHMvcmVzb2x1dGlvbiBpbiB4ICovCisjZGVmaW5lCVRJRkZUQUdfWVJFU09MVVRJT04JCTI4MwkvKiBwaXhlbHMvcmVzb2x1dGlvbiBpbiB5ICovCisjZGVmaW5lCVRJRkZUQUdfUExBTkFSQ09ORklHCQkyODQJLyogc3RvcmFnZSBvcmdhbml6YXRpb24gKi8KKyNkZWZpbmUJICAgIFBMQU5BUkNPTkZJR19DT05USUcJCTEJLyogc2luZ2xlIGltYWdlIHBsYW5lICovCisjZGVmaW5lCSAgICBQTEFOQVJDT05GSUdfU0VQQVJBVEUJMgkvKiBzZXBhcmF0ZSBwbGFuZXMgb2YgZGF0YSAqLworI2RlZmluZQlUSUZGVEFHX1BBR0VOQU1FCQkyODUJLyogcGFnZSBuYW1lIGltYWdlIGlzIGZyb20gKi8KKyNkZWZpbmUJVElGRlRBR19YUE9TSVRJT04JCTI4NgkvKiB4IHBhZ2Ugb2Zmc2V0IG9mIGltYWdlIGxocyAqLworI2RlZmluZQlUSUZGVEFHX1lQT1NJVElPTgkJMjg3CS8qIHkgcGFnZSBvZmZzZXQgb2YgaW1hZ2UgbGhzICovCisjZGVmaW5lCVRJRkZUQUdfRlJFRU9GRlNFVFMJCTI4OAkvKiArYnl0ZSBvZmZzZXQgdG8gZnJlZSBibG9jayAqLworI2RlZmluZQlUSUZGVEFHX0ZSRUVCWVRFQ09VTlRTCQkyODkJLyogK3NpemVzIG9mIGZyZWUgYmxvY2tzICovCisjZGVmaW5lCVRJRkZUQUdfR1JBWVJFU1BPTlNFVU5JVAkyOTAJLyogJGdyYXkgc2NhbGUgY3VydmUgYWNjdXJhY3kgKi8KKyNkZWZpbmUJICAgIEdSQVlSRVNQT05TRVVOSVRfMTBTCTEJLyogdGVudGhzIG9mIGEgdW5pdCAqLworI2RlZmluZQkgICAgR1JBWVJFU1BPTlNFVU5JVF8xMDBTCTIJLyogaHVuZHJlZHRocyBvZiBhIHVuaXQgKi8KKyNkZWZpbmUJICAgIEdSQVlSRVNQT05TRVVOSVRfMTAwMFMJMwkvKiB0aG91c2FuZHRocyBvZiBhIHVuaXQgKi8KKyNkZWZpbmUJICAgIEdSQVlSRVNQT05TRVVOSVRfMTAwMDBTCTQJLyogdGVuLXRob3VzYW5kdGhzIG9mIGEgdW5pdCAqLworI2RlZmluZQkgICAgR1JBWVJFU1BPTlNFVU5JVF8xMDAwMDBTCTUJLyogaHVuZHJlZC10aG91c2FuZHRocyAqLworI2RlZmluZQlUSUZGVEFHX0dSQVlSRVNQT05TRUNVUlZFCTI5MQkvKiAkZ3JheSBzY2FsZSByZXNwb25zZSBjdXJ2ZSAqLworI2RlZmluZQlUSUZGVEFHX0dST1VQM09QVElPTlMJCTI5MgkvKiAzMiBmbGFnIGJpdHMgKi8KKyNkZWZpbmUJVElGRlRBR19UNE9QVElPTlMJCTI5MgkvKiBUSUZGIDYuMCBwcm9wZXIgbmFtZSBhbGlhcyAqLworI2RlZmluZQkgICAgR1JPVVAzT1BUXzJERU5DT0RJTkcJMHgxCS8qIDItZGltZW5zaW9uYWwgY29kaW5nICovCisjZGVmaW5lCSAgICBHUk9VUDNPUFRfVU5DT01QUkVTU0VECTB4MgkvKiBkYXRhIG5vdCBjb21wcmVzc2VkICovCisjZGVmaW5lCSAgICBHUk9VUDNPUFRfRklMTEJJVFMJCTB4NAkvKiBmaWxsIHRvIGJ5dGUgYm91bmRhcnkgKi8KKyNkZWZpbmUJVElGRlRBR19HUk9VUDRPUFRJT05TCQkyOTMJLyogMzIgZmxhZyBiaXRzICovCisjZGVmaW5lIFRJRkZUQUdfVDZPUFRJT05TICAgICAgICAgICAgICAgMjkzICAgICAvKiBUSUZGIDYuMCBwcm9wZXIgbmFtZSAqLworI2RlZmluZQkgICAgR1JPVVA0T1BUX1VOQ09NUFJFU1NFRAkweDIJLyogZGF0YSBub3QgY29tcHJlc3NlZCAqLworI2RlZmluZQlUSUZGVEFHX1JFU09MVVRJT05VTklUCQkyOTYJLyogdW5pdHMgb2YgcmVzb2x1dGlvbnMgKi8KKyNkZWZpbmUJICAgIFJFU1VOSVRfTk9ORQkJMQkvKiBubyBtZWFuaW5nZnVsIHVuaXRzICovCisjZGVmaW5lCSAgICBSRVNVTklUX0lOQ0gJCTIJLyogZW5nbGlzaCAqLworI2RlZmluZQkgICAgUkVTVU5JVF9DRU5USU1FVEVSCQkzCS8qIG1ldHJpYyAqLworI2RlZmluZQlUSUZGVEFHX1BBR0VOVU1CRVIJCTI5NwkvKiBwYWdlIG51bWJlcnMgb2YgbXVsdGktcGFnZSAqLworI2RlZmluZQlUSUZGVEFHX0NPTE9SUkVTUE9OU0VVTklUCTMwMAkvKiAkY29sb3IgY3VydmUgYWNjdXJhY3kgKi8KKyNkZWZpbmUJICAgIENPTE9SUkVTUE9OU0VVTklUXzEwUwkxCS8qIHRlbnRocyBvZiBhIHVuaXQgKi8KKyNkZWZpbmUJICAgIENPTE9SUkVTUE9OU0VVTklUXzEwMFMJMgkvKiBodW5kcmVkdGhzIG9mIGEgdW5pdCAqLworI2RlZmluZQkgICAgQ09MT1JSRVNQT05TRVVOSVRfMTAwMFMJMwkvKiB0aG91c2FuZHRocyBvZiBhIHVuaXQgKi8KKyNkZWZpbmUJICAgIENPTE9SUkVTUE9OU0VVTklUXzEwMDAwUwk0CS8qIHRlbi10aG91c2FuZHRocyBvZiBhIHVuaXQgKi8KKyNkZWZpbmUJICAgIENPTE9SUkVTUE9OU0VVTklUXzEwMDAwMFMJNQkvKiBodW5kcmVkLXRob3VzYW5kdGhzICovCisjZGVmaW5lCVRJRkZUQUdfVFJBTlNGRVJGVU5DVElPTgkzMDEJLyogIWNvbG9yaW1ldHJ5IGluZm8gKi8KKyNkZWZpbmUJVElGRlRBR19TT0ZUV0FSRQkJMzA1CS8qIG5hbWUgJiByZWxlYXNlICovCisjZGVmaW5lCVRJRkZUQUdfREFURVRJTUUJCTMwNgkvKiBjcmVhdGlvbiBkYXRlIGFuZCB0aW1lICovCisjZGVmaW5lCVRJRkZUQUdfQVJUSVNUCQkJMzE1CS8qIGNyZWF0b3Igb2YgaW1hZ2UgKi8KKyNkZWZpbmUJVElGRlRBR19IT1NUQ09NUFVURVIJCTMxNgkvKiBtYWNoaW5lIHdoZXJlIGNyZWF0ZWQgKi8KKyNkZWZpbmUJVElGRlRBR19QUkVESUNUT1IJCTMxNwkvKiBwcmVkaWN0aW9uIHNjaGVtZSB3LyBMWlcgKi8KKyNkZWZpbmUgICAgIFBSRURJQ1RPUl9OT05FCQkxCS8qIG5vIHByZWRpY3Rpb24gc2NoZW1lIHVzZWQgKi8KKyNkZWZpbmUgICAgIFBSRURJQ1RPUl9IT1JJWk9OVEFMCTIJLyogaG9yaXpvbnRhbCBkaWZmZXJlbmNpbmcgKi8KKyNkZWZpbmUgICAgIFBSRURJQ1RPUl9GTE9BVElOR1BPSU5UCTMJLyogZmxvYXRpbmcgcG9pbnQgcHJlZGljdG9yICovCisjZGVmaW5lCVRJRkZUQUdfV0hJVEVQT0lOVAkJMzE4CS8qIGltYWdlIHdoaXRlIHBvaW50ICovCisjZGVmaW5lCVRJRkZUQUdfUFJJTUFSWUNIUk9NQVRJQ0lUSUVTCTMxOQkvKiAhcHJpbWFyeSBjaHJvbWF0aWNpdGllcyAqLworI2RlZmluZQlUSUZGVEFHX0NPTE9STUFQCQkzMjAJLyogUkdCIG1hcCBmb3IgcGFsbGV0dGUgaW1hZ2UgKi8KKyNkZWZpbmUJVElGRlRBR19IQUxGVE9ORUhJTlRTCQkzMjEJLyogIWhpZ2hsaWdodCtzaGFkb3cgaW5mbyAqLworI2RlZmluZQlUSUZGVEFHX1RJTEVXSURUSAkJMzIyCS8qICF0aWxlIHdpZHRoIGluIHBpeGVscyAqLworI2RlZmluZQlUSUZGVEFHX1RJTEVMRU5HVEgJCTMyMwkvKiAhdGlsZSBoZWlnaHQgaW4gcGl4ZWxzICovCisjZGVmaW5lIFRJRkZUQUdfVElMRU9GRlNFVFMJCTMyNAkvKiAhb2Zmc2V0cyB0byBkYXRhIHRpbGVzICovCisjZGVmaW5lIFRJRkZUQUdfVElMRUJZVEVDT1VOVFMJCTMyNQkvKiAhYnl0ZSBjb3VudHMgZm9yIHRpbGVzICovCisjZGVmaW5lCVRJRkZUQUdfQkFERkFYTElORVMJCTMyNgkvKiBsaW5lcyB3LyB3cm9uZyBwaXhlbCBjb3VudCAqLworI2RlZmluZQlUSUZGVEFHX0NMRUFORkFYREFUQQkJMzI3CS8qIHJlZ2VuZXJhdGVkIGxpbmUgaW5mbyAqLworI2RlZmluZQkgICAgQ0xFQU5GQVhEQVRBX0NMRUFOCQkwCS8qIG5vIGVycm9ycyBkZXRlY3RlZCAqLworI2RlZmluZQkgICAgQ0xFQU5GQVhEQVRBX1JFR0VORVJBVEVECTEJLyogcmVjZWl2ZXIgcmVnZW5lcmF0ZWQgbGluZXMgKi8KKyNkZWZpbmUJICAgIENMRUFORkFYREFUQV9VTkNMRUFOCTIJLyogdW5jb3JyZWN0ZWQgZXJyb3JzIGV4aXN0ICovCisjZGVmaW5lCVRJRkZUQUdfQ09OU0VDVVRJVkVCQURGQVhMSU5FUwkzMjgJLyogbWF4IGNvbnNlY3V0aXZlIGJhZCBsaW5lcyAqLworI2RlZmluZQlUSUZGVEFHX1NVQklGRAkJCTMzMAkvKiBzdWJpbWFnZSBkZXNjcmlwdG9ycyAqLworI2RlZmluZQlUSUZGVEFHX0lOS1NFVAkJCTMzMgkvKiAhaW5rcyBpbiBzZXBhcmF0ZWQgaW1hZ2UgKi8KKyNkZWZpbmUJICAgIElOS1NFVF9DTVlLCQkJMQkvKiAhY3lhbi1tYWdlbnRhLXllbGxvdy1ibGFjayBjb2xvciAqLworI2RlZmluZQkgICAgSU5LU0VUX01VTFRJSU5LCQkyCS8qICFtdWx0aS1pbmsgb3IgaGktZmkgY29sb3IgKi8KKyNkZWZpbmUJVElGRlRBR19JTktOQU1FUwkJMzMzCS8qICFhc2NpaSBuYW1lcyBvZiBpbmtzICovCisjZGVmaW5lCVRJRkZUQUdfTlVNQkVST0ZJTktTCQkzMzQJLyogIW51bWJlciBvZiBpbmtzICovCisjZGVmaW5lCVRJRkZUQUdfRE9UUkFOR0UJCTMzNgkvKiAhMCUgYW5kIDEwMCUgZG90IGNvZGVzICovCisjZGVmaW5lCVRJRkZUQUdfVEFSR0VUUFJJTlRFUgkJMzM3CS8qICFzZXBhcmF0aW9uIHRhcmdldCAqLworI2RlZmluZQlUSUZGVEFHX0VYVFJBU0FNUExFUwkJMzM4CS8qICFpbmZvIGFib3V0IGV4dHJhIHNhbXBsZXMgKi8KKyNkZWZpbmUJICAgIEVYVFJBU0FNUExFX1VOU1BFQ0lGSUVECTAJLyogIXVuc3BlY2lmaWVkIGRhdGEgKi8KKyNkZWZpbmUJICAgIEVYVFJBU0FNUExFX0FTU09DQUxQSEEJMQkvKiAhYXNzb2NpYXRlZCBhbHBoYSBkYXRhICovCisjZGVmaW5lCSAgICBFWFRSQVNBTVBMRV9VTkFTU0FMUEhBCTIJLyogIXVuYXNzb2NpYXRlZCBhbHBoYSBkYXRhICovCisjZGVmaW5lCVRJRkZUQUdfU0FNUExFRk9STUFUCQkzMzkJLyogIWRhdGEgc2FtcGxlIGZvcm1hdCAqLworI2RlZmluZQkgICAgU0FNUExFRk9STUFUX1VJTlQJCTEJLyogIXVuc2lnbmVkIGludGVnZXIgZGF0YSAqLworI2RlZmluZQkgICAgU0FNUExFRk9STUFUX0lOVAkJMgkvKiAhc2lnbmVkIGludGVnZXIgZGF0YSAqLworI2RlZmluZQkgICAgU0FNUExFRk9STUFUX0lFRUVGUAkJMwkvKiAhSUVFRSBmbG9hdGluZyBwb2ludCBkYXRhICovCisjZGVmaW5lCSAgICBTQU1QTEVGT1JNQVRfVk9JRAkJNAkvKiAhdW50eXBlZCBkYXRhICovCisjZGVmaW5lCSAgICBTQU1QTEVGT1JNQVRfQ09NUExFWElOVAk1CS8qICFjb21wbGV4IHNpZ25lZCBpbnQgKi8KKyNkZWZpbmUJICAgIFNBTVBMRUZPUk1BVF9DT01QTEVYSUVFRUZQCTYJLyogIWNvbXBsZXggaWVlZSBmbG9hdGluZyAqLworI2RlZmluZQlUSUZGVEFHX1NNSU5TQU1QTEVWQUxVRQkJMzQwCS8qICF2YXJpYWJsZSBNaW5TYW1wbGVWYWx1ZSAqLworI2RlZmluZQlUSUZGVEFHX1NNQVhTQU1QTEVWQUxVRQkJMzQxCS8qICF2YXJpYWJsZSBNYXhTYW1wbGVWYWx1ZSAqLworI2RlZmluZQlUSUZGVEFHX0NMSVBQQVRICQkzNDMJLyogJUNsaXBQYXRoCisJCQkJCQkgICBbQWRvYmUgVElGRiB0ZWNobm90ZSAyXSAqLworI2RlZmluZQlUSUZGVEFHX1hDTElQUEFUSFVOSVRTCQkzNDQJLyogJVhDbGlwUGF0aFVuaXRzCisJCQkJCQkgICBbQWRvYmUgVElGRiB0ZWNobm90ZSAyXSAqLworI2RlZmluZQlUSUZGVEFHX1lDTElQUEFUSFVOSVRTCQkzNDUJLyogJVlDbGlwUGF0aFVuaXRzCisJCQkJCQkgICBbQWRvYmUgVElGRiB0ZWNobm90ZSAyXSAqLworI2RlZmluZQlUSUZGVEFHX0lOREVYRUQJCQkzNDYJLyogJUluZGV4ZWQKKwkJCQkJCSAgIFtBZG9iZSBUSUZGIFRlY2hub3RlIDNdICovCisjZGVmaW5lCVRJRkZUQUdfSlBFR1RBQkxFUwkJMzQ3CS8qICVKUEVHIHRhYmxlIHN0cmVhbSAqLworI2RlZmluZQlUSUZGVEFHX09QSVBST1hZCQkzNTEJLyogJU9QSSBQcm94eSBbQWRvYmUgVElGRiB0ZWNobm90ZV0gKi8KKy8qIFRhZ3MgNDAwLTQzNSBhcmUgZnJvbSB0aGUgVElGRi9GWCBzcGVjICovCisjZGVmaW5lIFRJRkZUQUdfR0xPQkFMUEFSQU1FVEVSU0lGRAk0MDAJLyogISAqLworI2RlZmluZSBUSUZGVEFHX1BST0ZJTEVUWVBFCQkJNDAxCS8qICEgKi8KKyNkZWZpbmUgICAgIFBST0ZJTEVUWVBFX1VOU1BFQ0lGSUVECTAJLyogISAqLworI2RlZmluZSAgICAgUFJPRklMRVRZUEVfRzNfRkFYCQkxCS8qICEgKi8KKyNkZWZpbmUgVElGRlRBR19GQVhQUk9GSUxFCQkJNDAyCS8qICEgKi8KKyNkZWZpbmUgICAgIEZBWFBST0ZJTEVfUwkJCTEJLyogIVRJRkYvRlggRkFYIHByb2ZpbGUgUyAqLworI2RlZmluZSAgICAgRkFYUFJPRklMRV9GCQkJMgkvKiAhVElGRi9GWCBGQVggcHJvZmlsZSBGICovCisjZGVmaW5lICAgICBGQVhQUk9GSUxFX0oJCQkzCS8qICFUSUZGL0ZYIEZBWCBwcm9maWxlIEogKi8KKyNkZWZpbmUgICAgIEZBWFBST0ZJTEVfQwkJCTQJLyogIVRJRkYvRlggRkFYIHByb2ZpbGUgQyAqLworI2RlZmluZSAgICAgRkFYUFJPRklMRV9MCQkJNQkvKiAhVElGRi9GWCBGQVggcHJvZmlsZSBMICovCisjZGVmaW5lICAgICBGQVhQUk9GSUxFX00JCQk2CS8qICFUSUZGL0ZYIEZBWCBwcm9maWxlIExNICovCisjZGVmaW5lIFRJRkZUQUdfQ09ESU5HTUVUSE9EUwkJNDAzCS8qICFUSUZGL0ZYIGNvZGluZyBtZXRob2RzICovCisjZGVmaW5lICAgICBDT0RJTkdNRVRIT0RTX1Q0XzFECQkoMSA8PCAxKQkvKiAhVC40IDFEICovCisjZGVmaW5lICAgICBDT0RJTkdNRVRIT0RTX1Q0XzJECQkoMSA8PCAyKQkvKiAhVC40IDJEICovCisjZGVmaW5lICAgICBDT0RJTkdNRVRIT0RTX1Q2CQkoMSA8PCAzKQkvKiAhVC42ICovCisjZGVmaW5lICAgICBDT0RJTkdNRVRIT0RTX1Q4NSAJCSgxIDw8IDQpCS8qICFULjg1IEpCSUcgKi8KKyNkZWZpbmUgICAgIENPRElOR01FVEhPRFNfVDQyIAkJKDEgPDwgNSkJLyogIVQuNDIgSlBFRyAqLworI2RlZmluZSAgICAgQ09ESU5HTUVUSE9EU19UNDMJCSgxIDw8IDYpCS8qICFULjQzIGNvbG91ciBieSBsYXllcmVkIEpCSUcgKi8KKyNkZWZpbmUgVElGRlRBR19WRVJTSU9OWUVBUgkJCTQwNAkvKiAhVElGRi9GWCB2ZXJzaW9uIHllYXIgKi8KKyNkZWZpbmUgVElGRlRBR19NT0RFTlVNQkVSCQkJNDA1CS8qICFUSUZGL0ZYIG1vZGUgbnVtYmVyICovCisjZGVmaW5lIFRJRkZUQUdfREVDT0RFCQkJCTQzMwkvKiAhVElGRi9GWCBkZWNvZGUgKi8KKyNkZWZpbmUgVElGRlRBR19JTUFHRUJBU0VDT0xPUgkJNDM0CS8qICFUSUZGL0ZYIGltYWdlIGJhc2UgY29sb3VyICovCisjZGVmaW5lIFRJRkZUQUdfVDgyT1BUSU9OUwkJCTQzNQkvKiAhVElGRi9GWCBULjgyIG9wdGlvbnMgKi8KKy8qCisgKiBUYWdzIDUxMi01MjEgYXJlIG9ic29sZXRlZCBieSBUZWNobmljYWwgTm90ZSAjMiB3aGljaCBzcGVjaWZpZXMgYQorICogcmV2aXNlZCBKUEVHLWluLVRJRkYgc2NoZW1lLgorICovCisjZGVmaW5lCVRJRkZUQUdfSlBFR1BST0MJCTUxMgkvKiAhSlBFRyBwcm9jZXNzaW5nIGFsZ29yaXRobSAqLworI2RlZmluZQkgICAgSlBFR1BST0NfQkFTRUxJTkUJCTEJLyogIWJhc2VsaW5lIHNlcXVlbnRpYWwgKi8KKyNkZWZpbmUJICAgIEpQRUdQUk9DX0xPU1NMRVNTCQkxNAkvKiAhSHVmZm1hbiBjb2RlZCBsb3NzbGVzcyAqLworI2RlZmluZQlUSUZGVEFHX0pQRUdJRk9GRlNFVAkJNTEzCS8qICFwb2ludGVyIHRvIFNPSSBtYXJrZXIgKi8KKyNkZWZpbmUJVElGRlRBR19KUEVHSUZCWVRFQ09VTlQJCTUxNAkvKiAhSkZJRiBzdHJlYW0gbGVuZ3RoICovCisjZGVmaW5lCVRJRkZUQUdfSlBFR1JFU1RBUlRJTlRFUlZBTAk1MTUJLyogIXJlc3RhcnQgaW50ZXJ2YWwgbGVuZ3RoICovCisjZGVmaW5lCVRJRkZUQUdfSlBFR0xPU1NMRVNTUFJFRElDVE9SUwk1MTcJLyogIWxvc3NsZXNzIHByb2MgcHJlZGljdG9yICovCisjZGVmaW5lCVRJRkZUQUdfSlBFR1BPSU5UVFJBTlNGT1JNCTUxOAkvKiAhbG9zc2xlc3MgcG9pbnQgdHJhbnNmb3JtICovCisjZGVmaW5lCVRJRkZUQUdfSlBFR1FUQUJMRVMJCTUxOQkvKiAhUSBtYXRyaWNlIG9mZnNldHMgKi8KKyNkZWZpbmUJVElGRlRBR19KUEVHRENUQUJMRVMJCTUyMAkvKiAhRENUIHRhYmxlIG9mZnNldHMgKi8KKyNkZWZpbmUJVElGRlRBR19KUEVHQUNUQUJMRVMJCTUyMQkvKiAhQUMgY29lZmZpY2llbnQgb2Zmc2V0cyAqLworI2RlZmluZQlUSUZGVEFHX1lDQkNSQ09FRkZJQ0lFTlRTCTUyOQkvKiAhUkdCIC0+IFlDYkNyIHRyYW5zZm9ybSAqLworI2RlZmluZQlUSUZGVEFHX1lDQkNSU1VCU0FNUExJTkcJNTMwCS8qICFZQ2JDciBzdWJzYW1wbGluZyBmYWN0b3JzICovCisjZGVmaW5lCVRJRkZUQUdfWUNCQ1JQT1NJVElPTklORwk1MzEJLyogIXN1YnNhbXBsZSBwb3NpdGlvbmluZyAqLworI2RlZmluZQkgICAgWUNCQ1JQT1NJVElPTl9DRU5URVJFRAkxCS8qICFhcyBpbiBQb3N0U2NyaXB0IExldmVsIDIgKi8KKyNkZWZpbmUJICAgIFlDQkNSUE9TSVRJT05fQ09TSVRFRAkyCS8qICFhcyBpbiBDQ0lSIDYwMS0xICovCisjZGVmaW5lCVRJRkZUQUdfUkVGRVJFTkNFQkxBQ0tXSElURQk1MzIJLyogIWNvbG9yaW1ldHJ5IGluZm8gKi8KKyNkZWZpbmUgVElGRlRBR19TVFJJUFJPV0NPVU5UUwkJNTU5IC8qICFUSUZGL0ZYIHN0cmlwIHJvdyBjb3VudHMgKi8KKyNkZWZpbmUJVElGRlRBR19YTUxQQUNLRVQJCTcwMAkvKiAlWE1MIHBhY2tldAorCQkJCQkJICAgW0Fkb2JlIFhNUCBTcGVjaWZpY2F0aW9uLAorCQkJCQkJICAgSmFudWFyeSAyMDA0ICovCisjZGVmaW5lIFRJRkZUQUdfT1BJSU1BR0VJRAkJMzI3ODEJLyogJU9QSSBJbWFnZUlECisJCQkJCQkgICBbQWRvYmUgVElGRiB0ZWNobm90ZV0gKi8KKy8qIHRhZ3MgMzI5NTItMzI5NTYgYXJlIHByaXZhdGUgdGFncyByZWdpc3RlcmVkIHRvIElzbGFuZCBHcmFwaGljcyAqLworI2RlZmluZSBUSUZGVEFHX1JFRlBUUwkJCTMyOTUzCS8qIGltYWdlIHJlZmVyZW5jZSBwb2ludHMgKi8KKyNkZWZpbmUgVElGRlRBR19SRUdJT05UQUNLUE9JTlQJCTMyOTU0CS8qIHJlZ2lvbi14Zm9ybSB0YWNrIHBvaW50ICovCisjZGVmaW5lIFRJRkZUQUdfUkVHSU9OV0FSUENPUk5FUlMJMzI5NTUJLyogd2FycCBxdWFkcmlsYXRlcmFsICovCisjZGVmaW5lIFRJRkZUQUdfUkVHSU9OQUZGSU5FCQkzMjk1NgkvKiBhZmZpbmUgdHJhbnNmb3JtYXRpb24gbWF0ICovCisvKiB0YWdzIDMyOTk1LTMyOTk5IGFyZSBwcml2YXRlIHRhZ3MgcmVnaXN0ZXJlZCB0byBTR0kgKi8KKyNkZWZpbmUJVElGRlRBR19NQVRURUlORwkJMzI5OTUJLyogJHVzZSBFeHRyYVNhbXBsZXMgKi8KKyNkZWZpbmUJVElGRlRBR19EQVRBVFlQRQkJMzI5OTYJLyogJHVzZSBTYW1wbGVGb3JtYXQgKi8KKyNkZWZpbmUJVElGRlRBR19JTUFHRURFUFRICQkzMjk5NwkvKiB6IGRlcHRoIG9mIGltYWdlICovCisjZGVmaW5lCVRJRkZUQUdfVElMRURFUFRICQkzMjk5OAkvKiB6IGRlcHRoL2RhdGEgdGlsZSAqLworLyogdGFncyAzMzMwMC0zMzMwOSBhcmUgcHJpdmF0ZSB0YWdzIHJlZ2lzdGVyZWQgdG8gUGl4YXIgKi8KKy8qCisgKiBUSUZGVEFHX1BJWEFSX0lNQUdFRlVMTFdJRFRIIGFuZCBUSUZGVEFHX1BJWEFSX0lNQUdFRlVMTExFTkdUSAorICogYXJlIHNldCB3aGVuIGFuIGltYWdlIGhhcyBiZWVuIGNyb3BwZWQgb3V0IG9mIGEgbGFyZ2VyIGltYWdlLiAgCisgKiBUaGV5IHJlZmxlY3QgdGhlIHNpemUgb2YgdGhlIG9yaWdpbmFsIHVuY3JvcHBlZCBpbWFnZS4KKyAqIFRoZSBUSUZGVEFHX1hQT1NJVElPTiBhbmQgVElGRlRBR19ZUE9TSVRJT04gY2FuIGJlIHVzZWQKKyAqIHRvIGRldGVybWluZSB0aGUgcG9zaXRpb24gb2YgdGhlIHNtYWxsZXIgaW1hZ2UgaW4gdGhlIGxhcmdlciBvbmUuCisgKi8KKyNkZWZpbmUgVElGRlRBR19QSVhBUl9JTUFHRUZVTExXSURUSCAgICAzMzMwMCAgIC8qIGZ1bGwgaW1hZ2Ugc2l6ZSBpbiB4ICovCisjZGVmaW5lIFRJRkZUQUdfUElYQVJfSU1BR0VGVUxMTEVOR1RIICAgMzMzMDEgICAvKiBmdWxsIGltYWdlIHNpemUgaW4geSAqLworIC8qIFRhZ3MgMzMzMDItMzMzMDYgYXJlIHVzZWQgdG8gaWRlbnRpZnkgc3BlY2lhbCBpbWFnZSBtb2RlcyBhbmQgZGF0YQorICAqIHVzZWQgYnkgUGl4YXIncyB0ZXh0dXJlIGZvcm1hdHMuCisgICovCisjZGVmaW5lIFRJRkZUQUdfUElYQVJfVEVYVFVSRUZPUk1BVAkzMzMwMgkvKiB0ZXh0dXJlIG1hcCBmb3JtYXQgKi8KKyNkZWZpbmUgVElGRlRBR19QSVhBUl9XUkFQTU9ERVMJCTMzMzAzCS8qIHMgJiB0IHdyYXAgbW9kZXMgKi8KKyNkZWZpbmUgVElGRlRBR19QSVhBUl9GT1ZDT1QJCTMzMzA0CS8qIGNvdGFuKGZvdikgZm9yIGVudi4gbWFwcyAqLworI2RlZmluZSBUSUZGVEFHX1BJWEFSX01BVFJJWF9XT1JMRFRPU0NSRUVOIDMzMzA1CisjZGVmaW5lIFRJRkZUQUdfUElYQVJfTUFUUklYX1dPUkxEVE9DQU1FUkEgMzMzMDYKKy8qIHRhZyAzMzQwNSBpcyBhIHByaXZhdGUgdGFnIHJlZ2lzdGVyZWQgdG8gRWFzdG1hbiBLb2RhayAqLworI2RlZmluZSBUSUZGVEFHX1dSSVRFUlNFUklBTE5VTUJFUiAgICAgIDMzNDA1ICAgLyogZGV2aWNlIHNlcmlhbCBudW1iZXIgKi8KKyNkZWZpbmUgVElGRlRBR19DRkFSRVBFQVRQQVRURVJORElNCTMzNDIxCS8qIGRpbWVuc2lvbnMgb2YgQ0ZBIHBhdHRlcm4gKi8KKyNkZWZpbmUgVElGRlRBR19DRkFQQVRURVJOCQkzMzQyMgkvKiBjb2xvciBmaWx0ZXIgYXJyYXkgcGF0dGVybiAqLworLyogdGFnIDMzNDMyIGlzIGxpc3RlZCBpbiB0aGUgNi4wIHNwZWMgdy8gdW5rbm93biBvd25lcnNoaXAgKi8KKyNkZWZpbmUJVElGRlRBR19DT1BZUklHSFQJCTMzNDMyCS8qIGNvcHlyaWdodCBzdHJpbmcgKi8KKy8qIElQVEMgVEFHIGZyb20gUmljaFRJRkYgc3BlY2lmaWNhdGlvbnMgKi8KKyNkZWZpbmUgVElGRlRBR19SSUNIVElGRklQVEMJCTMzNzIzCisvKiAzNDAxNi0zNDAyOSBhcmUgcmVzZXJ2ZWQgZm9yIEFOU0kgSVQ4IFRJRkYvSVQgPGRrZWxseUBhcGFnby5jb20pICovCisjZGVmaW5lIFRJRkZUQUdfSVQ4U0lURQkJCTM0MDE2CS8qIHNpdGUgbmFtZSAqLworI2RlZmluZSBUSUZGVEFHX0lUOENPTE9SU0VRVUVOQ0UJMzQwMTcJLyogY29sb3Igc2VxLiBbUkdCLENNWUssZXRjXSAqLworI2RlZmluZSBUSUZGVEFHX0lUOEhFQURFUgkJMzQwMTgJLyogRERFUyBIZWFkZXIgKi8KKyNkZWZpbmUgVElGRlRBR19JVDhSQVNURVJQQURESU5HCTM0MDE5CS8qIHJhc3RlciBzY2FubGluZSBwYWRkaW5nICovCisjZGVmaW5lIFRJRkZUQUdfSVQ4QklUU1BFUlJVTkxFTkdUSAkzNDAyMAkvKiAjIG9mIGJpdHMgaW4gc2hvcnQgcnVuICovCisjZGVmaW5lIFRJRkZUQUdfSVQ4QklUU1BFUkVYVEVOREVEUlVOTEVOR1RIIDM0MDIxLyogIyBvZiBiaXRzIGluIGxvbmcgcnVuICovCisjZGVmaW5lIFRJRkZUQUdfSVQ4Q09MT1JUQUJMRQkJMzQwMjIJLyogTFcgY29sb3J0YWJsZSAqLworI2RlZmluZSBUSUZGVEFHX0lUOElNQUdFQ09MT1JJTkRJQ0FUT1IJMzQwMjMJLyogQlAvQkwgaW1hZ2UgY29sb3Igc3dpdGNoICovCisjZGVmaW5lIFRJRkZUQUdfSVQ4QktHQ09MT1JJTkRJQ0FUT1IJMzQwMjQJLyogQlAvQkwgYmcgY29sb3Igc3dpdGNoICovCisjZGVmaW5lIFRJRkZUQUdfSVQ4SU1BR0VDT0xPUlZBTFVFCTM0MDI1CS8qIEJQL0JMIGltYWdlIGNvbG9yIHZhbHVlICovCisjZGVmaW5lIFRJRkZUQUdfSVQ4QktHQ09MT1JWQUxVRQkzNDAyNgkvKiBCUC9CTCBiZyBjb2xvciB2YWx1ZSAqLworI2RlZmluZSBUSUZGVEFHX0lUOFBJWEVMSU5URU5TSVRZUkFOR0UJMzQwMjcJLyogTVAgcGl4ZWwgaW50ZW5zaXR5IHZhbHVlICovCisjZGVmaW5lIFRJRkZUQUdfSVQ4VFJBTlNQQVJFTkNZSU5ESUNBVE9SIDM0MDI4CS8qIEhDIHRyYW5zcGFyZW5jeSBzd2l0Y2ggKi8KKyNkZWZpbmUgVElGRlRBR19JVDhDT0xPUkNIQVJBQ1RFUklaQVRJT04gMzQwMjkJLyogY29sb3IgY2hhcmFjdGVyLiB0YWJsZSAqLworI2RlZmluZSBUSUZGVEFHX0lUOEhDVVNBR0UJCTM0MDMwCS8qIEhDIHVzYWdlIGluZGljYXRvciAqLworI2RlZmluZSBUSUZGVEFHX0lUOFRSQVBJTkRJQ0FUT1IJMzQwMzEJLyogVHJhcHBpbmcgaW5kaWNhdG9yCisJCQkJCQkgICAodW50cmFwcGVkPTAsIHRyYXBwZWQ9MSkgKi8KKyNkZWZpbmUgVElGRlRBR19JVDhDTVlLRVFVSVZBTEVOVAkzNDAzMgkvKiBDTVlLIGNvbG9yIGVxdWl2YWxlbnRzICovCisvKiB0YWdzIDM0MjMyLTM0MjM2IGFyZSBwcml2YXRlIHRhZ3MgcmVnaXN0ZXJlZCB0byBUZXhhcyBJbnN0cnVtZW50cyAqLworI2RlZmluZSBUSUZGVEFHX0ZSQU1FQ09VTlQgICAgICAgICAgICAgIDM0MjMyICAgLyogU2VxdWVuY2UgRnJhbWUgQ291bnQgKi8KKy8qIHRhZyAzNDM3NyBpcyBwcml2YXRlIHRhZyByZWdpc3RlcmVkIHRvIEFkb2JlIGZvciBQaG90b1Nob3AgKi8KKyNkZWZpbmUgVElGRlRBR19QSE9UT1NIT1AJCTM0Mzc3IAorLyogdGFncyAzNDY2NSwgMzQ4NTMgYW5kIDQwOTY1IGFyZSBkb2N1bWVudGVkIGluIEVYSUYgc3BlY2lmaWNhdGlvbiAqLworI2RlZmluZSBUSUZGVEFHX0VYSUZJRkQJCQkzNDY2NQkvKiBQb2ludGVyIHRvIEVYSUYgcHJpdmF0ZSBkaXJlY3RvcnkgKi8KKy8qIHRhZyAzNDc1MCBpcyBhIHByaXZhdGUgdGFnIHJlZ2lzdGVyZWQgdG8gQWRvYmU/ICovCisjZGVmaW5lIFRJRkZUQUdfSUNDUFJPRklMRQkJMzQ2NzUJLyogSUNDIHByb2ZpbGUgZGF0YSAqLworI2RlZmluZSBUSUZGVEFHX0lNQUdFTEFZRVIJCTM0NzMyCS8qICFUSUZGL0ZYIGltYWdlIGxheWVyIGluZm9ybWF0aW9uICovCisvKiB0YWcgMzQ3NTAgaXMgYSBwcml2YXRlIHRhZyByZWdpc3RlcmVkIHRvIFBpeGVsIE1hZ2ljICovCisjZGVmaW5lCVRJRkZUQUdfSkJJR09QVElPTlMJCTM0NzUwCS8qIEpCSUcgb3B0aW9ucyAqLworI2RlZmluZSBUSUZGVEFHX0dQU0lGRAkJCTM0ODUzCS8qIFBvaW50ZXIgdG8gR1BTIHByaXZhdGUgZGlyZWN0b3J5ICovCisvKiB0YWdzIDM0OTA4LTM0OTE0IGFyZSBwcml2YXRlIHRhZ3MgcmVnaXN0ZXJlZCB0byBTR0kgKi8KKyNkZWZpbmUJVElGRlRBR19GQVhSRUNWUEFSQU1TCQkzNDkwOAkvKiBlbmNvZGVkIENsYXNzIDIgc2VzLiBwYXJtcyAqLworI2RlZmluZQlUSUZGVEFHX0ZBWFNVQkFERFJFU1MJCTM0OTA5CS8qIHJlY2VpdmVkIFN1YkFkZHIgc3RyaW5nICovCisjZGVmaW5lCVRJRkZUQUdfRkFYUkVDVlRJTUUJCTM0OTEwCS8qIHJlY2VpdmUgdGltZSAoc2VjcykgKi8KKyNkZWZpbmUJVElGRlRBR19GQVhEQ1MJCQkzNDkxMQkvKiBlbmNvZGVkIGZheCBzZXMuIHBhcmFtcywgVGFibGUgMi9ULjMwICovCisvKiB0YWdzIDM3NDM5LTM3NDQzIGFyZSByZWdpc3RlcmVkIHRvIFNHSSA8Z3JlZ2xAc2dpLmNvbT4gKi8KKyNkZWZpbmUgVElGRlRBR19TVE9OSVRTCQkJMzc0MzkJLyogU2FtcGxlIHZhbHVlIHRvIE5pdHMgKi8KKy8qIHRhZyAzNDkyOSBpcyBhIHByaXZhdGUgdGFnIHJlZ2lzdGVyZWQgdG8gRmVkRXggKi8KKyNkZWZpbmUJVElGRlRBR19GRURFWF9FRFIJCTM0OTI5CS8qIHVua25vd24gdXNlICovCisjZGVmaW5lIFRJRkZUQUdfSU5URVJPUEVSQUJJTElUWUlGRAk0MDk2NQkvKiBQb2ludGVyIHRvIEludGVyb3BlcmFiaWxpdHkgcHJpdmF0ZSBkaXJlY3RvcnkgKi8KKy8qIEFkb2JlIERpZ2l0YWwgTmVnYXRpdmUgKERORykgZm9ybWF0IHRhZ3MgKi8KKyNkZWZpbmUgVElGRlRBR19ETkdWRVJTSU9OCQk1MDcwNgkvKiAmRE5HIHZlcnNpb24gbnVtYmVyICovCisjZGVmaW5lIFRJRkZUQUdfRE5HQkFDS1dBUkRWRVJTSU9OCTUwNzA3CS8qICZETkcgY29tcGF0aWJpbGl0eSB2ZXJzaW9uICovCisjZGVmaW5lIFRJRkZUQUdfVU5JUVVFQ0FNRVJBTU9ERUwJNTA3MDgJLyogJm5hbWUgZm9yIHRoZSBjYW1lcmEgbW9kZWwgKi8KKyNkZWZpbmUgVElGRlRBR19MT0NBTElaRURDQU1FUkFNT0RFTAk1MDcwOQkvKiAmbG9jYWxpemVkIGNhbWVyYSBtb2RlbAorCQkJCQkJICAgbmFtZSAqLworI2RlZmluZSBUSUZGVEFHX0NGQVBMQU5FQ09MT1IJCTUwNzEwCS8qICZDRkFQYXR0ZXJuLT5MaW5lYXJSYXcgc3BhY2UKKwkJCQkJCSAgIG1hcHBpbmcgKi8KKyNkZWZpbmUgVElGRlRBR19DRkFMQVlPVVQJCTUwNzExCS8qICZzcGF0aWFsIGxheW91dCBvZiB0aGUgQ0ZBICovCisjZGVmaW5lIFRJRkZUQUdfTElORUFSSVpBVElPTlRBQkxFCTUwNzEyCS8qICZsb29rdXAgdGFibGUgZGVzY3JpcHRpb24gKi8KKyNkZWZpbmUgVElGRlRBR19CTEFDS0xFVkVMUkVQRUFURElNCTUwNzEzCS8qICZyZXBlYXQgcGF0dGVybiBzaXplIGZvcgorCQkJCQkJICAgdGhlIEJsYWNrTGV2ZWwgdGFnICovCisjZGVmaW5lIFRJRkZUQUdfQkxBQ0tMRVZFTAkJNTA3MTQJLyogJnplcm8gbGlnaHQgZW5jb2RpbmcgbGV2ZWwgKi8KKyNkZWZpbmUgVElGRlRBR19CTEFDS0xFVkVMREVMVEFICTUwNzE1CS8qICZ6ZXJvIGxpZ2h0IGVuY29kaW5nIGxldmVsCisJCQkJCQkgICBkaWZmZXJlbmNlcyAoY29sdW1ucykgKi8KKyNkZWZpbmUgVElGRlRBR19CTEFDS0xFVkVMREVMVEFWCTUwNzE2CS8qICZ6ZXJvIGxpZ2h0IGVuY29kaW5nIGxldmVsCisJCQkJCQkgICBkaWZmZXJlbmNlcyAocm93cykgKi8KKyNkZWZpbmUgVElGRlRBR19XSElURUxFVkVMCQk1MDcxNwkvKiAmZnVsbHkgc2F0dXJhdGVkIGVuY29kaW5nCisJCQkJCQkgICBsZXZlbCAqLworI2RlZmluZSBUSUZGVEFHX0RFRkFVTFRTQ0FMRQkJNTA3MTgJLyogJmRlZmF1bHQgc2NhbGUgZmFjdG9ycyAqLworI2RlZmluZSBUSUZGVEFHX0RFRkFVTFRDUk9QT1JJR0lOCTUwNzE5CS8qICZvcmlnaW4gb2YgdGhlIGZpbmFsIGltYWdlCisJCQkJCQkgICBhcmVhICovCisjZGVmaW5lIFRJRkZUQUdfREVGQVVMVENST1BTSVpFCQk1MDcyMAkvKiAmc2l6ZSBvZiB0aGUgZmluYWwgaW1hZ2UgCisJCQkJCQkgICBhcmVhICovCisjZGVmaW5lIFRJRkZUQUdfQ09MT1JNQVRSSVgxCQk1MDcyMQkvKiAmWFlaLT5yZWZlcmVuY2UgY29sb3Igc3BhY2UKKwkJCQkJCSAgIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCAxICovCisjZGVmaW5lIFRJRkZUQUdfQ09MT1JNQVRSSVgyCQk1MDcyMgkvKiAmWFlaLT5yZWZlcmVuY2UgY29sb3Igc3BhY2UKKwkJCQkJCSAgIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCAyICovCisjZGVmaW5lIFRJRkZUQUdfQ0FNRVJBQ0FMSUJSQVRJT04xCTUwNzIzCS8qICZjYWxpYnJhdGlvbiBtYXRyaXggMSAqLworI2RlZmluZSBUSUZGVEFHX0NBTUVSQUNBTElCUkFUSU9OMgk1MDcyNAkvKiAmY2FsaWJyYXRpb24gbWF0cml4IDIgKi8KKyNkZWZpbmUgVElGRlRBR19SRURVQ1RJT05NQVRSSVgxCTUwNzI1CS8qICZkaW1lbnNpb25hbGl0eSByZWR1Y3Rpb24KKwkJCQkJCSAgIG1hdHJpeCAxICovCisjZGVmaW5lIFRJRkZUQUdfUkVEVUNUSU9OTUFUUklYMgk1MDcyNgkvKiAmZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uCisJCQkJCQkgICBtYXRyaXggMiAqLworI2RlZmluZSBUSUZGVEFHX0FOQUxPR0JBTEFOQ0UJCTUwNzI3CS8qICZnYWluIGFwcGxpZWQgdGhlIHN0b3JlZCByYXcKKwkJCQkJCSAgIHZhbHVlcyovCisjZGVmaW5lIFRJRkZUQUdfQVNTSE9UTkVVVFJBTAkJNTA3MjgJLyogJnNlbGVjdGVkIHdoaXRlIGJhbGFuY2UgaW4KKwkJCQkJCSAgIGxpbmVhciByZWZlcmVuY2Ugc3BhY2UgKi8KKyNkZWZpbmUgVElGRlRBR19BU1NIT1RXSElURVhZCQk1MDcyOQkvKiAmc2VsZWN0ZWQgd2hpdGUgYmFsYW5jZSBpbgorCQkJCQkJICAgeC15IGNocm9tYXRpY2l0eQorCQkJCQkJICAgY29vcmRpbmF0ZXMgKi8KKyNkZWZpbmUgVElGRlRBR19CQVNFTElORUVYUE9TVVJFCTUwNzMwCS8qICZob3cgbXVjaCB0byBtb3ZlIHRoZSB6ZXJvCisJCQkJCQkgICBwb2ludCAqLworI2RlZmluZSBUSUZGVEFHX0JBU0VMSU5FTk9JU0UJCTUwNzMxCS8qICZyZWxhdGl2ZSBub2lzZSBsZXZlbCAqLworI2RlZmluZSBUSUZGVEFHX0JBU0VMSU5FU0hBUlBORVNTCTUwNzMyCS8qICZyZWxhdGl2ZSBhbW91bnQgb2YKKwkJCQkJCSAgIHNoYXJwZW5pbmcgKi8KKyNkZWZpbmUgVElGRlRBR19CQVlFUkdSRUVOU1BMSVQJCTUwNzMzCS8qICZob3cgY2xvc2VseSB0aGUgdmFsdWVzIG9mCisJCQkJCQkgICB0aGUgZ3JlZW4gcGl4ZWxzIGluIHRoZQorCQkJCQkJICAgYmx1ZS9ncmVlbiByb3dzIHRyYWNrIHRoZQorCQkJCQkJICAgdmFsdWVzIG9mIHRoZSBncmVlbiBwaXhlbHMKKwkJCQkJCSAgIGluIHRoZSByZWQvZ3JlZW4gcm93cyAqLworI2RlZmluZSBUSUZGVEFHX0xJTkVBUlJFU1BPTlNFTElNSVQJNTA3MzQJLyogJm5vbi1saW5lYXIgZW5jb2RpbmcgcmFuZ2UgKi8KKyNkZWZpbmUgVElGRlRBR19DQU1FUkFTRVJJQUxOVU1CRVIJNTA3MzUJLyogJmNhbWVyYSdzIHNlcmlhbCBudW1iZXIgKi8KKyNkZWZpbmUgVElGRlRBR19MRU5TSU5GTwkJNTA3MzYJLyogaW5mbyBhYm91dCB0aGUgbGVucyAqLworI2RlZmluZSBUSUZGVEFHX0NIUk9NQUJMVVJSQURJVVMJNTA3MzcJLyogJmNocm9tYSBibHVyIHJhZGl1cyAqLworI2RlZmluZSBUSUZGVEFHX0FOVElBTElBU1NUUkVOR1RICTUwNzM4CS8qICZyZWxhdGl2ZSBzdHJlbmd0aCBvZiB0aGUKKwkJCQkJCSAgIGNhbWVyYSdzIGFudGktYWxpYXMgZmlsdGVyICovCisjZGVmaW5lIFRJRkZUQUdfU0hBRE9XU0NBTEUJCTUwNzM5CS8qICZ1c2VkIGJ5IEFkb2JlIENhbWVyYSBSYXcgKi8KKyNkZWZpbmUgVElGRlRBR19ETkdQUklWQVRFREFUQQkJNTA3NDAJLyogJm1hbnVmYWN0dXJlcidzIHByaXZhdGUgZGF0YSAqLworI2RlZmluZSBUSUZGVEFHX01BS0VSTk9URVNBRkVUWQkJNTA3NDEJLyogJndoZXRoZXIgdGhlIEVYSUYgTWFrZXJOb3RlCisJCQkJCQkgICB0YWcgaXMgc2FmZSB0byBwcmVzZXJ2ZQorCQkJCQkJICAgYWxvbmcgd2l0aCB0aGUgcmVzdCBvZiB0aGUKKwkJCQkJCSAgIEVYSUYgZGF0YSAqLworI2RlZmluZQlUSUZGVEFHX0NBTElCUkFUSU9OSUxMVU1JTkFOVDEJNTA3NzgJLyogJmlsbHVtaW5hbnQgMSAqLworI2RlZmluZSBUSUZGVEFHX0NBTElCUkFUSU9OSUxMVU1JTkFOVDIJNTA3NzkJLyogJmlsbHVtaW5hbnQgMiAqLworI2RlZmluZSBUSUZGVEFHX0JFU1RRVUFMSVRZU0NBTEUJNTA3ODAJLyogJmJlc3QgcXVhbGl0eSBtdWx0aXBsaWVyICovCisjZGVmaW5lIFRJRkZUQUdfUkFXREFUQVVOSVFVRUlECQk1MDc4MQkvKiAmdW5pcXVlIGlkZW50aWZpZXIgZm9yCisJCQkJCQkgICB0aGUgcmF3IGltYWdlIGRhdGEgKi8KKyNkZWZpbmUgVElGRlRBR19PUklHSU5BTFJBV0ZJTEVOQU1FCTUwODI3CS8qICZmaWxlIG5hbWUgb2YgdGhlIG9yaWdpbmFsCisJCQkJCQkgICByYXcgZmlsZSAqLworI2RlZmluZSBUSUZGVEFHX09SSUdJTkFMUkFXRklMRURBVEEJNTA4MjgJLyogJmNvbnRlbnRzIG9mIHRoZSBvcmlnaW5hbAorCQkJCQkJICAgcmF3IGZpbGUgKi8KKyNkZWZpbmUgVElGRlRBR19BQ1RJVkVBUkVBCQk1MDgyOQkvKiAmYWN0aXZlIChub24tbWFza2VkKSBwaXhlbHMKKwkJCQkJCSAgIG9mIHRoZSBzZW5zb3IgKi8KKyNkZWZpbmUgVElGRlRBR19NQVNLRURBUkVBUwkJNTA4MzAJLyogJmxpc3Qgb2YgY29vcmRpbmF0ZXMKKwkJCQkJCSAgIG9mIGZ1bGx5IG1hc2tlZCBwaXhlbHMgKi8KKyNkZWZpbmUgVElGRlRBR19BU1NIT1RJQ0NQUk9GSUxFCTUwODMxCS8qICZ0aGVzZSB0d28gdGFncyB1c2VkIHRvICovCisjZGVmaW5lIFRJRkZUQUdfQVNTSE9UUFJFUFJPRklMRU1BVFJJWAk1MDgzMgkvKiBtYXAgY2FtZXJhcydzIGNvbG9yIHNwYWNlCisJCQkJCQkgICBpbnRvIElDQyBwcm9maWxlIHNwYWNlICovCisjZGVmaW5lIFRJRkZUQUdfQ1VSUkVOVElDQ1BST0ZJTEUJNTA4MzMJLyogJiAqLworI2RlZmluZSBUSUZGVEFHX0NVUlJFTlRQUkVQUk9GSUxFTUFUUklYCTUwODM0CS8qICYgKi8KKy8qIHRhZyA2NTUzNSBpcyBhbiB1bmRlZmluZWQgdGFnIHVzZWQgYnkgRWFzdG1hbiBLb2RhayAqLworI2RlZmluZSBUSUZGVEFHX0RDU0hVRVNISUZUVkFMVUVTICAgICAgIDY1NTM1ICAgLyogaHVlIHNoaWZ0IGNvcnJlY3Rpb24gZGF0YSAqLworCisvKgorICogVGhlIGZvbGxvd2luZyBhcmUgYGBwc2V1ZG8gdGFncycnIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29udHJvbAorICogY29kZWMtc3BlY2lmaWMgZnVuY3Rpb25hbGl0eS4gIFRoZXNlIHRhZ3MgYXJlIG5vdCB3cml0dGVuIHRvIGZpbGUuCisgKiBOb3RlIHRoYXQgdGhlc2UgdmFsdWVzIHN0YXJ0IGF0IDB4ZmZmZisxIHNvIHRoYXQgdGhleSdsbCBuZXZlcgorICogY29sbGlkZSB3aXRoIEFsZHVzLWFzc2lnbmVkIHRhZ3MuCisgKgorICogSWYgeW91IHdhbnQgeW91ciBwcml2YXRlIHBzZXVkbyB0YWdzIGBgcmVnaXN0ZXJlZCcnIChpLmUuIGFkZGVkIHRvCisgKiB0aGlzIGZpbGUpLCBwbGVhc2UgcG9zdCBhIGJ1ZyByZXBvcnQgdmlhIHRoZSB0cmFja2luZyBzeXN0ZW0gYXQKKyAqIGh0dHA6Ly93d3cucmVtb3Rlc2Vuc2luZy5vcmcvbGlidGlmZi9idWdzLmh0bWwgd2l0aCB0aGUgYXBwcm9wcmlhdGUKKyAqIEMgZGVmaW5pdGlvbnMgdG8gYWRkLgorICovCisjZGVmaW5lCVRJRkZUQUdfRkFYTU9ERQkJCTY1NTM2CS8qIEdyb3VwIDMvNCBmb3JtYXQgY29udHJvbCAqLworI2RlZmluZQkgICAgRkFYTU9ERV9DTEFTU0lDCTB4MDAwMAkJLyogZGVmYXVsdCwgaW5jbHVkZSBSVEMgKi8KKyNkZWZpbmUJICAgIEZBWE1PREVfTk9SVEMJMHgwMDAxCQkvKiBubyBSVEMgYXQgZW5kIG9mIGRhdGEgKi8KKyNkZWZpbmUJICAgIEZBWE1PREVfTk9FT0wJMHgwMDAyCQkvKiBubyBFT0wgY29kZSBhdCBlbmQgb2Ygcm93ICovCisjZGVmaW5lCSAgICBGQVhNT0RFX0JZVEVBTElHTgkweDAwMDQJCS8qIGJ5dGUgYWxpZ24gcm93ICovCisjZGVmaW5lCSAgICBGQVhNT0RFX1dPUkRBTElHTgkweDAwMDgJCS8qIHdvcmQgYWxpZ24gcm93ICovCisjZGVmaW5lCSAgICBGQVhNT0RFX0NMQVNTRglGQVhNT0RFX05PUlRDCS8qIFRJRkYgQ2xhc3MgRiAqLworI2RlZmluZQlUSUZGVEFHX0pQRUdRVUFMSVRZCQk2NTUzNwkvKiBDb21wcmVzc2lvbiBxdWFsaXR5IGxldmVsICovCisvKiBOb3RlOiBxdWFsaXR5IGxldmVsIGlzIG9uIHRoZSBJSkcgMC0xMDAgc2NhbGUuICBEZWZhdWx0IHZhbHVlIGlzIDc1ICovCisjZGVmaW5lCVRJRkZUQUdfSlBFR0NPTE9STU9ERQkJNjU1MzgJLyogQXV0byBSR0I8PT5ZQ2JDciBjb252ZXJ0PyAqLworI2RlZmluZQkgICAgSlBFR0NPTE9STU9ERV9SQVcJMHgwMDAwCQkvKiBubyBjb252ZXJzaW9uIChkZWZhdWx0KSAqLworI2RlZmluZQkgICAgSlBFR0NPTE9STU9ERV9SR0IJMHgwMDAxCQkvKiBkbyBhdXRvIGNvbnZlcnNpb24gKi8KKyNkZWZpbmUJVElGRlRBR19KUEVHVEFCTEVTTU9ERQkJNjU1MzkJLyogV2hhdCB0byBwdXQgaW4gSlBFR1RhYmxlcyAqLworI2RlZmluZQkgICAgSlBFR1RBQkxFU01PREVfUVVBTlQgMHgwMDAxCQkvKiBpbmNsdWRlIHF1YW50aXphdGlvbiB0YmxzICovCisjZGVmaW5lCSAgICBKUEVHVEFCTEVTTU9ERV9IVUZGCTB4MDAwMgkJLyogaW5jbHVkZSBIdWZmbWFuIHRibHMgKi8KKy8qIE5vdGU6IGRlZmF1bHQgaXMgSlBFR1RBQkxFU01PREVfUVVBTlQgfCBKUEVHVEFCTEVTTU9ERV9IVUZGICovCisjZGVmaW5lCVRJRkZUQUdfRkFYRklMTEZVTkMJCTY1NTQwCS8qIEczL0c0IGZpbGwgZnVuY3Rpb24gKi8KKyNkZWZpbmUJVElGRlRBR19QSVhBUkxPR0RBVEFGTVQJCTY1NTQ5CS8qIFBpeGFyTG9nQ29kZWMgSS9PIGRhdGEgc3ogKi8KKyNkZWZpbmUJICAgIFBJWEFSTE9HREFUQUZNVF84QklUCTAJLyogcmVndWxhciB1X2NoYXIgc2FtcGxlcyAqLworI2RlZmluZQkgICAgUElYQVJMT0dEQVRBRk1UXzhCSVRBQkdSCTEJLyogQUJHUi1vcmRlciB1X2NoYXJzICovCisjZGVmaW5lCSAgICBQSVhBUkxPR0RBVEFGTVRfMTFCSVRMT0cJMgkvKiAxMS1iaXQgbG9nLWVuY29kZWQgKHJhdykgKi8KKyNkZWZpbmUJICAgIFBJWEFSTE9HREFUQUZNVF8xMkJJVFBJQ0lPCTMJLyogYXMgcGVyIFBJQ0lPICgxLjA9PTIwNDgpICovCisjZGVmaW5lCSAgICBQSVhBUkxPR0RBVEFGTVRfMTZCSVQJNAkvKiBzaWduZWQgc2hvcnQgc2FtcGxlcyAqLworI2RlZmluZQkgICAgUElYQVJMT0dEQVRBRk1UX0ZMT0FUCTUJLyogSUVFRSBmbG9hdCBzYW1wbGVzICovCisvKiA2NTU1MC02NTU1NiBhcmUgYWxsb2NhdGVkIHRvIE9jZWFuYSBNYXRyaXggPGRldkBvY2VhbmEuY29tPiAqLworI2RlZmluZSBUSUZGVEFHX0RDU0lNQUdFUlRZUEUgICAgICAgICAgIDY1NTUwICAgLyogaW1hZ2VyIG1vZGVsICYgZmlsdGVyICovCisjZGVmaW5lICAgICBEQ1NJTUFHRVJNT0RFTF9NMyAgICAgICAgICAgMCAgICAgICAvKiBNMyBjaGlwICgxMjgwIHggMTAyNCkgKi8KKyNkZWZpbmUgICAgIERDU0lNQUdFUk1PREVMX001ICAgICAgICAgICAxICAgICAgIC8qIE01IGNoaXAgKDE1MzYgeCAxMDI0KSAqLworI2RlZmluZSAgICAgRENTSU1BR0VSTU9ERUxfTTYgICAgICAgICAgIDIgICAgICAgLyogTTYgY2hpcCAoMzA3MiB4IDIwNDgpICovCisjZGVmaW5lICAgICBEQ1NJTUFHRVJGSUxURVJfSVIgICAgICAgICAgMCAgICAgICAvKiBpbmZyYXJlZCBmaWx0ZXIgKi8KKyNkZWZpbmUgICAgIERDU0lNQUdFUkZJTFRFUl9NT05PICAgICAgICAxICAgICAgIC8qIG1vbm9jaHJvbWUgZmlsdGVyICovCisjZGVmaW5lICAgICBEQ1NJTUFHRVJGSUxURVJfQ0ZBICAgICAgICAgMiAgICAgICAvKiBjb2xvciBmaWx0ZXIgYXJyYXkgKi8KKyNkZWZpbmUgICAgIERDU0lNQUdFUkZJTFRFUl9PVEhFUiAgICAgICAzICAgICAgIC8qIG90aGVyIGZpbHRlciAqLworI2RlZmluZSBUSUZGVEFHX0RDU0lOVEVSUE1PREUgICAgICAgICAgIDY1NTUxICAgLyogaW50ZXJwb2xhdGlvbiBtb2RlICovCisjZGVmaW5lICAgICBEQ1NJTlRFUlBNT0RFX05PUk1BTCAgICAgICAgMHgwICAgICAvKiB3aG9sZSBpbWFnZSwgZGVmYXVsdCAqLworI2RlZmluZSAgICAgRENTSU5URVJQTU9ERV9QUkVWSUVXICAgICAgIDB4MSAgICAgLyogcHJldmlldyBvZiBpbWFnZSAoMzg0eDI1NikgKi8KKyNkZWZpbmUgVElGRlRBR19EQ1NCQUxBTkNFQVJSQVkgICAgICAgICA2NTU1MiAgIC8qIGNvbG9yIGJhbGFuY2UgdmFsdWVzICovCisjZGVmaW5lIFRJRkZUQUdfRENTQ09SUkVDVE1BVFJJWCAgICAgICAgNjU1NTMgICAvKiBjb2xvciBjb3JyZWN0aW9uIHZhbHVlcyAqLworI2RlZmluZSBUSUZGVEFHX0RDU0dBTU1BICAgICAgICAgICAgICAgIDY1NTU0ICAgLyogZ2FtbWEgdmFsdWUgKi8KKyNkZWZpbmUgVElGRlRBR19EQ1NUT0VTSE9VTERFUlBUUyAgICAgICA2NTU1NSAgIC8qIHRvZSAmIHNob3VsZGVyIHBvaW50cyAqLworI2RlZmluZSBUSUZGVEFHX0RDU0NBTElCUkFUSU9ORkQgICAgICAgIDY1NTU2ICAgLyogY2FsaWJyYXRpb24gZmlsZSBkZXNjICovCisvKiBOb3RlOiBxdWFsaXR5IGxldmVsIGlzIG9uIHRoZSBaTElCIDEtOSBzY2FsZS4gRGVmYXVsdCB2YWx1ZSBpcyAtMSAqLworI2RlZmluZQlUSUZGVEFHX1pJUFFVQUxJVFkJCTY1NTU3CS8qIGNvbXByZXNzaW9uIHF1YWxpdHkgbGV2ZWwgKi8KKyNkZWZpbmUJVElGRlRBR19QSVhBUkxPR1FVQUxJVFkJCTY1NTU4CS8qIFBpeGFyTG9nIHVzZXMgc2FtZSBzY2FsZSAqLworLyogNjU1NTkgaXMgYWxsb2NhdGVkIHRvIE9jZWFuYSBNYXRyaXggPGRldkBvY2VhbmEuY29tPiAqLworI2RlZmluZSBUSUZGVEFHX0RDU0NMSVBSRUNUQU5HTEUJNjU1NTkJLyogYXJlYSBvZiBpbWFnZSB0byBhY3F1aXJlICovCisjZGVmaW5lIFRJRkZUQUdfU0dJTE9HREFUQUZNVAkJNjU1NjAJLyogU0dJTG9nIHVzZXIgZGF0YSBmb3JtYXQgKi8KKyNkZWZpbmUgICAgIFNHSUxPR0RBVEFGTVRfRkxPQVQJCTAJLyogSUVFRSBmbG9hdCBzYW1wbGVzICovCisjZGVmaW5lICAgICBTR0lMT0dEQVRBRk1UXzE2QklUCQkxCS8qIDE2LWJpdCBzYW1wbGVzICovCisjZGVmaW5lICAgICBTR0lMT0dEQVRBRk1UX1JBVwkJMgkvKiB1bmludGVycHJldGVkIGRhdGEgKi8KKyNkZWZpbmUgICAgIFNHSUxPR0RBVEFGTVRfOEJJVAkJMwkvKiA4LWJpdCBSR0IgbW9uaXRvciB2YWx1ZXMgKi8KKyNkZWZpbmUgVElGRlRBR19TR0lMT0dFTkNPREUJCTY1NTYxIC8qIFNHSUxvZyBkYXRhIGVuY29kaW5nIGNvbnRyb2wqLworI2RlZmluZSAgICAgU0dJTE9HRU5DT0RFX05PRElUSEVSCTAgICAgIC8qIGRvIG5vdCBkaXRoZXIgZW5jb2RlZCB2YWx1ZXMqLworI2RlZmluZSAgICAgU0dJTE9HRU5DT0RFX1JBTkRJVEhFUgkxICAgICAvKiByYW5kb21seSBkaXRoZXIgZW5jZCB2YWx1ZXMgKi8KKyNkZWZpbmUJVElGRlRBR19MWk1BUFJFU0VUCQk2NTU2MgkvKiBMWk1BMiBwcmVzZXQgKGNvbXByZXNzaW9uIGxldmVsKSAqLworI2RlZmluZSBUSUZGVEFHX1BFUlNBTVBMRSAgICAgICA2NTU2MwkvKiBpbnRlcmZhY2UgZm9yIHBlciBzYW1wbGUgdGFncyAqLworI2RlZmluZSAgICAgUEVSU0FNUExFX01FUkdFRCAgICAgICAgMAkvKiBwcmVzZW50IGFzIGEgc2luZ2xlIHZhbHVlICovCisjZGVmaW5lICAgICBQRVJTQU1QTEVfTVVMVEkgICAgICAgICAxCS8qIHByZXNlbnQgYXMgbXVsdGlwbGUgdmFsdWVzICovCisKKy8qCisgKiBFWElGIHRhZ3MKKyAqLworI2RlZmluZSBFWElGVEFHX0VYUE9TVVJFVElNRQkJMzM0MzQJLyogRXhwb3N1cmUgdGltZSAqLworI2RlZmluZSBFWElGVEFHX0ZOVU1CRVIJCQkzMzQzNwkvKiBGIG51bWJlciAqLworI2RlZmluZSBFWElGVEFHX0VYUE9TVVJFUFJPR1JBTQkJMzQ4NTAJLyogRXhwb3N1cmUgcHJvZ3JhbSAqLworI2RlZmluZSBFWElGVEFHX1NQRUNUUkFMU0VOU0lUSVZJVFkJMzQ4NTIJLyogU3BlY3RyYWwgc2Vuc2l0aXZpdHkgKi8KKyNkZWZpbmUgRVhJRlRBR19JU09TUEVFRFJBVElOR1MJCTM0ODU1CS8qIElTTyBzcGVlZCByYXRpbmcgKi8KKyNkZWZpbmUgRVhJRlRBR19PRUNGCQkJMzQ4NTYJLyogT3B0b2VsZWN0cmljIGNvbnZlcnNpb24KKwkJCQkJCSAgIGZhY3RvciAqLworI2RlZmluZSBFWElGVEFHX0VYSUZWRVJTSU9OCQkzNjg2NAkvKiBFeGlmIHZlcnNpb24gKi8KKyNkZWZpbmUgRVhJRlRBR19EQVRFVElNRU9SSUdJTkFMCTM2ODY3CS8qIERhdGUgYW5kIHRpbWUgb2Ygb3JpZ2luYWwKKwkJCQkJCSAgIGRhdGEgZ2VuZXJhdGlvbiAqLworI2RlZmluZSBFWElGVEFHX0RBVEVUSU1FRElHSVRJWkVECTM2ODY4CS8qIERhdGUgYW5kIHRpbWUgb2YgZGlnaXRhbAorCQkJCQkJICAgZGF0YSBnZW5lcmF0aW9uICovCisjZGVmaW5lIEVYSUZUQUdfQ09NUE9ORU5UU0NPTkZJR1VSQVRJT04JMzcxMjEJLyogTWVhbmluZyBvZiBlYWNoIGNvbXBvbmVudCAqLworI2RlZmluZSBFWElGVEFHX0NPTVBSRVNTRURCSVRTUEVSUElYRUwJMzcxMjIJLyogSW1hZ2UgY29tcHJlc3Npb24gbW9kZSAqLworI2RlZmluZSBFWElGVEFHX1NIVVRURVJTUEVFRFZBTFVFCTM3Mzc3CS8qIFNodXR0ZXIgc3BlZWQgKi8KKyNkZWZpbmUgRVhJRlRBR19BUEVSVFVSRVZBTFVFCQkzNzM3OAkvKiBBcGVydHVyZSAqLworI2RlZmluZSBFWElGVEFHX0JSSUdIVE5FU1NWQUxVRQkJMzczNzkJLyogQnJpZ2h0bmVzcyAqLworI2RlZmluZSBFWElGVEFHX0VYUE9TVVJFQklBU1ZBTFVFCTM3MzgwCS8qIEV4cG9zdXJlIGJpYXMgKi8KKyNkZWZpbmUgRVhJRlRBR19NQVhBUEVSVFVSRVZBTFVFCTM3MzgxCS8qIE1heGltdW0gbGVucyBhcGVydHVyZSAqLworI2RlZmluZSBFWElGVEFHX1NVQkpFQ1RESVNUQU5DRQkJMzczODIJLyogU3ViamVjdCBkaXN0YW5jZSAqLworI2RlZmluZSBFWElGVEFHX01FVEVSSU5HTU9ERQkJMzczODMJLyogTWV0ZXJpbmcgbW9kZSAqLworI2RlZmluZSBFWElGVEFHX0xJR0hUU09VUkNFCQkzNzM4NAkvKiBMaWdodCBzb3VyY2UgKi8KKyNkZWZpbmUgRVhJRlRBR19GTEFTSAkJCTM3Mzg1CS8qIEZsYXNoICovCisjZGVmaW5lIEVYSUZUQUdfRk9DQUxMRU5HVEgJCTM3Mzg2CS8qIExlbnMgZm9jYWwgbGVuZ3RoICovCisjZGVmaW5lIEVYSUZUQUdfU1VCSkVDVEFSRUEJCTM3Mzk2CS8qIFN1YmplY3QgYXJlYSAqLworI2RlZmluZSBFWElGVEFHX01BS0VSTk9URQkJMzc1MDAJLyogTWFudWZhY3R1cmVyIG5vdGVzICovCisjZGVmaW5lIEVYSUZUQUdfVVNFUkNPTU1FTlQJCTM3NTEwCS8qIFVzZXIgY29tbWVudHMgKi8KKyNkZWZpbmUgRVhJRlRBR19TVUJTRUNUSU1FCQkzNzUyMAkvKiBEYXRlVGltZSBzdWJzZWNvbmRzICovCisjZGVmaW5lIEVYSUZUQUdfU1VCU0VDVElNRU9SSUdJTkFMCTM3NTIxCS8qIERhdGVUaW1lT3JpZ2luYWwgc3Vic2Vjb25kcyAqLworI2RlZmluZSBFWElGVEFHX1NVQlNFQ1RJTUVESUdJVElaRUQJMzc1MjIJLyogRGF0ZVRpbWVEaWdpdGl6ZWQgc3Vic2Vjb25kcyAqLworI2RlZmluZSBFWElGVEFHX0ZMQVNIUElYVkVSU0lPTgkJNDA5NjAJLyogU3VwcG9ydGVkIEZsYXNocGl4IHZlcnNpb24gKi8KKyNkZWZpbmUgRVhJRlRBR19DT0xPUlNQQUNFCQk0MDk2MQkvKiBDb2xvciBzcGFjZSBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBFWElGVEFHX1BJWEVMWERJTUVOU0lPTgkJNDA5NjIJLyogVmFsaWQgaW1hZ2Ugd2lkdGggKi8KKyNkZWZpbmUgRVhJRlRBR19QSVhFTFlESU1FTlNJT04JCTQwOTYzCS8qIFZhbGlkIGltYWdlIGhlaWdodCAqLworI2RlZmluZSBFWElGVEFHX1JFTEFURURTT1VOREZJTEUJNDA5NjQJLyogUmVsYXRlZCBhdWRpbyBmaWxlICovCisjZGVmaW5lIEVYSUZUQUdfRkxBU0hFTkVSR1kJCTQxNDgzCS8qIEZsYXNoIGVuZXJneSAqLworI2RlZmluZSBFWElGVEFHX1NQQVRJQUxGUkVRVUVOQ1lSRVNQT05TRSA0MTQ4NAkvKiBTcGF0aWFsIGZyZXF1ZW5jeSByZXNwb25zZSAqLworI2RlZmluZSBFWElGVEFHX0ZPQ0FMUExBTkVYUkVTT0xVVElPTgk0MTQ4NgkvKiBGb2NhbCBwbGFuZSBYIHJlc29sdXRpb24gKi8KKyNkZWZpbmUgRVhJRlRBR19GT0NBTFBMQU5FWVJFU09MVVRJT04JNDE0ODcJLyogRm9jYWwgcGxhbmUgWSByZXNvbHV0aW9uICovCisjZGVmaW5lIEVYSUZUQUdfRk9DQUxQTEFORVJFU09MVVRJT05VTklUIDQxNDg4CS8qIEZvY2FsIHBsYW5lIHJlc29sdXRpb24gdW5pdCAqLworI2RlZmluZSBFWElGVEFHX1NVQkpFQ1RMT0NBVElPTgkJNDE0OTIJLyogU3ViamVjdCBsb2NhdGlvbiAqLworI2RlZmluZSBFWElGVEFHX0VYUE9TVVJFSU5ERVgJCTQxNDkzCS8qIEV4cG9zdXJlIGluZGV4ICovCisjZGVmaW5lIEVYSUZUQUdfU0VOU0lOR01FVEhPRAkJNDE0OTUJLyogU2Vuc2luZyBtZXRob2QgKi8KKyNkZWZpbmUgRVhJRlRBR19GSUxFU09VUkNFCQk0MTcyOAkvKiBGaWxlIHNvdXJjZSAqLworI2RlZmluZSBFWElGVEFHX1NDRU5FVFlQRQkJNDE3MjkJLyogU2NlbmUgdHlwZSAqLworI2RlZmluZSBFWElGVEFHX0NGQVBBVFRFUk4JCTQxNzMwCS8qIENGQSBwYXR0ZXJuICovCisjZGVmaW5lIEVYSUZUQUdfQ1VTVE9NUkVOREVSRUQJCTQxOTg1CS8qIEN1c3RvbSBpbWFnZSBwcm9jZXNzaW5nICovCisjZGVmaW5lIEVYSUZUQUdfRVhQT1NVUkVNT0RFCQk0MTk4NgkvKiBFeHBvc3VyZSBtb2RlICovCisjZGVmaW5lIEVYSUZUQUdfV0hJVEVCQUxBTkNFCQk0MTk4NwkvKiBXaGl0ZSBiYWxhbmNlICovCisjZGVmaW5lIEVYSUZUQUdfRElHSVRBTFpPT01SQVRJTwk0MTk4OAkvKiBEaWdpdGFsIHpvb20gcmF0aW8gKi8KKyNkZWZpbmUgRVhJRlRBR19GT0NBTExFTkdUSElOMzVNTUZJTE0JNDE5ODkJLyogRm9jYWwgbGVuZ3RoIGluIDM1IG1tIGZpbG0gKi8KKyNkZWZpbmUgRVhJRlRBR19TQ0VORUNBUFRVUkVUWVBFCTQxOTkwCS8qIFNjZW5lIGNhcHR1cmUgdHlwZSAqLworI2RlZmluZSBFWElGVEFHX0dBSU5DT05UUk9MCQk0MTk5MQkvKiBHYWluIGNvbnRyb2wgKi8KKyNkZWZpbmUgRVhJRlRBR19DT05UUkFTVAkJNDE5OTIJLyogQ29udHJhc3QgKi8KKyNkZWZpbmUgRVhJRlRBR19TQVRVUkFUSU9OCQk0MTk5MwkvKiBTYXR1cmF0aW9uICovCisjZGVmaW5lIEVYSUZUQUdfU0hBUlBORVNTCQk0MTk5NAkvKiBTaGFycG5lc3MgKi8KKyNkZWZpbmUgRVhJRlRBR19ERVZJQ0VTRVRUSU5HREVTQ1JJUFRJT04gNDE5OTUJLyogRGV2aWNlIHNldHRpbmdzIGRlc2NyaXB0aW9uICovCisjZGVmaW5lIEVYSUZUQUdfU1VCSkVDVERJU1RBTkNFUkFOR0UJNDE5OTYJLyogU3ViamVjdCBkaXN0YW5jZSByYW5nZSAqLworI2RlZmluZSBFWElGVEFHX0dBSU5DT05UUk9MCQk0MTk5MQkvKiBHYWluIGNvbnRyb2wgKi8KKyNkZWZpbmUgRVhJRlRBR19HQUlOQ09OVFJPTAkJNDE5OTEJLyogR2FpbiBjb250cm9sICovCisjZGVmaW5lIEVYSUZUQUdfSU1BR0VVTklRVUVJRAkJNDIwMTYJLyogVW5pcXVlIGltYWdlIElEICovCisKKyNlbmRpZiAvKiBfVElGRl8gKi8KKworLyogdmltOiBzZXQgdHM9OCBzdHM9OCBzdz04IG5vZXQ6ICovCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogbW9kZTogYworICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIGZpbGwtY29sdW1uOiA3OAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmZjb25mLmggYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmZjb25mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNjMGJjNQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmZmNvbmYuaApAQCAtMCwwICsxLDI0OCBAQAorLyogbGlidGlmZi90aWZmY29uZi5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4gICovCisvKgorICBDb25maWd1cmF0aW9uIGRlZmluZXMgZm9yIGluc3RhbGxlZCBsaWJ0aWZmLgorICBUaGlzIGZpbGUgbWFpbnRhaW5lZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gRG8gbm90IHVzZSBkZWZpbml0aW9ucworICBmcm9tIHRoaXMgZmlsZSBpbiB5b3VyIHByb2dyYW1zLgorKi8KKyNpZm5kZWYgX1RJRkZDT05GXworI2RlZmluZSBfVElGRkNPTkZfCisKKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmgiCisKKy8vTk9URTogVGhlIHRpZmYgY29kZWMgcmVxdWlyZXMgYW4gQU5TSSBDIGNvbXBpbGVyIGVudmlyb25tZW50IGZvciBidWlsZGluZyBhbmQgCisvLwkJcHJlc3VtZXMgYW4gQU5TSSBDIGVudmlyb25tZW50IGZvciB1c2UuCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICovCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9NT0JJTEVfCisjIGRlZmluZSBPX1JET05MWSAgICAgICAweDAwMDAgIC8qIG9wZW4gZm9yIHJlYWRpbmcgb25seSAqLworIyBkZWZpbmUgT19XUk9OTFkgICAgICAgMHgwMDAxICAvKiBvcGVuIGZvciB3cml0aW5nIG9ubHkgKi8KKyMgZGVmaW5lIE9fUkRXUiAgICAgICAgIDB4MDAwMiAgLyogb3BlbiBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyAqLworIyBkZWZpbmUgT19DUkVBVCAgICAgICAgMHgwMTAwICAvKiBjcmVhdGUgYW5kIG9wZW4gZmlsZSAqLworIyBkZWZpbmUgT19UUlVOQyAgICAgICAgMHgwMjAwICAvKiBvcGVuIGFuZCB0cnVuY2F0ZSAqLworI2Vsc2UKKyMgZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQorIyBkZWZpbmUgSEFWRV9GQ05UTF9IIDEKKyNlbmRpZgorCisvKiBDb21wYXRpYmlsaXR5IHN0dWZmLiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGFzc2VydC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9BU1NFUlRfSCAxCisKKy8qIERlZmluZSBhcyAwIG9yIDEgYWNjb3JkaW5nIHRvIHRoZSBmbG9hdGluZyBwb2ludCBmb3JtYXQgc3Vwb3J0ZWQgYnkgdGhlCisgICBtYWNoaW5lICovCisjZGVmaW5lIEhBVkVfSUVFRUZQIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCisvLyNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCisvL2Z4X3N5c3RlbS5oIGFscmVhZHkgaW5jbHVkZSB0aGUgc3RyaW5nLmggaW4gQU5TSUMKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzZWFyY2guaD4gaGVhZGVyIGZpbGUuICovCisvKiNkZWZpbmUgSEFWRV9TRUFSQ0hfSCAxICovCisKKy8qIFRoZSBzaXplIG9mIGEgYGludCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKy8qIEFjY29yZGluZyB0eXBlZGVmIGludAlpbnQzMl90OyBpbiB0aGUgZnhfc3lzdGVtLmgqLworI2RlZmluZSBTSVpFT0ZfSU5UIDQKKworLyogU3VubGlhbmcuTGl1IDIwMTEwMzI1LiBXZSBzaG91bGQgY29uZmlnIHRoZSBjb3JyZWN0IGxvbmcgc2l6ZSBmb3IgdGlmIAorICAgZmF4NGRlY29kZSBvcHRpbWl6ZSBpbiB0aWZfZmF4My5jICAtLSBMaW51eDY0IGRlY29kZSBpc3N1ZS4gCisgICBURVNURE9DOiBCdWcgIzIzNjYxIC0gejEudGlmLiAqLworI2lmIF9GWF9DUFVfID09IF9GWF9XSU42NF8gfHwgX0ZYX0NQVV8gPT0gX0ZYX1g2NF8gfHwgX0ZYX0NQVV8gPT0gX0ZYX0lBNjRfCisvKiBUaGUgc2l6ZSBvZiBgdW5zaWduZWQgbG9uZycsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyNkZWZpbmUgU0laRU9GX1VOU0lHTkVEX0xPTkcgOAorI2Vsc2UKKyNkZWZpbmUgU0laRU9GX1VOU0lHTkVEX0xPTkcgNAorI2VuZGlmCisKKy8qIFNpZ25lZCA4LWJpdCB0eXBlICovCisjZGVmaW5lIFRJRkZfSU5UOF9UIHNpZ25lZCBjaGFyCisKKy8qIFVuc2lnbmVkIDgtYml0IHR5cGUgKi8KKyNkZWZpbmUgVElGRl9VSU5UOF9UIHVuc2lnbmVkIGNoYXIKKworLyogU2lnbmVkIDE2LWJpdCB0eXBlICovCisjZGVmaW5lIFRJRkZfSU5UMTZfVCBzaWduZWQgc2hvcnQKKworLyogVW5zaWduZWQgMTYtYml0IHR5cGUgKi8KKyNkZWZpbmUgVElGRl9VSU5UMTZfVCB1bnNpZ25lZCBzaG9ydAorCisvKiBTaWduZWQgMzItYml0IHR5cGUgKi8KKyNkZWZpbmUgVElGRl9JTlQzMl9UIHNpZ25lZCBpbnQKKworLyogVW5zaWduZWQgMzItYml0IHR5cGUgKi8KKyNkZWZpbmUgVElGRl9VSU5UMzJfVCB1bnNpZ25lZCBpbnQKKworLyogU2lnbmVkIDMyLWJpdCB0eXBlIGZvcm1hdHRlciAqLworI2RlZmluZSBUSUZGX0lOVDMyX0ZPUk1BVCAiJWQiCisKKy8qIFVuc2lnbmVkIDMyLWJpdCB0eXBlIGZvcm1hdHRlciAqLworI2RlZmluZSBUSUZGX1VJTlQzMl9GT1JNQVQgIiV1IgorCisjaWZkZWYgX01TQ19WRVIJCS8vIHdpbmRvd3MKKworLyogU2lnbmVkIDY0LWJpdCB0eXBlIGZvcm1hdHRlciAqLworI2RlZmluZSBUSUZGX0lOVDY0X0ZPUk1BVCAiJUk2NGQiCisKKy8qIFVuc2lnbmVkIDY0LWJpdCB0eXBlIGZvcm1hdHRlciAqLworI2RlZmluZSBUSUZGX1VJTlQ2NF9GT1JNQVQgIiVJNjR1IgorCisvKiBTaWduZWQgNjQtYml0IHR5cGUgKi8KKyNkZWZpbmUgVElGRl9JTlQ2NF9UIHNpZ25lZCBfX2ludDY0CisKKy8qIFVuc2lnbmVkIDY0LWJpdCB0eXBlICovCisjZGVmaW5lIFRJRkZfVUlOVDY0X1QgdW5zaWduZWQgX19pbnQ2NAorCisjZWxzZQkJCQkJCS8vIGxpbnV4L3VuaXgKKworI2lmIDAgLy9fRlhfQ1BVXyA9PSBfRlhfWDY0XwkvLyBsaW51eC91bml4IDY0CisKKy8qIFNpZ25lZCA2NC1iaXQgdHlwZSBmb3JtYXR0ZXIgKi8KKyNkZWZpbmUgVElGRl9JTlQ2NF9GT1JNQVQgIiVsZCIKKworLyogVW5zaWduZWQgNjQtYml0IHR5cGUgZm9ybWF0dGVyICovCisjZGVmaW5lIFRJRkZfVUlOVDY0X0ZPUk1BVCAiJWx1IgorCisvKiBTaWduZWQgNjQtYml0IHR5cGUgKi8KKyNkZWZpbmUgVElGRl9JTlQ2NF9UIHNpZ25lZCBsb25nCisKKyNlbHNlCQkJCQkJLy8gbGludXgvdW5peCAzMgorCisvKiBTaWduZWQgNjQtYml0IHR5cGUgZm9ybWF0dGVyICovCisjZGVmaW5lIFRJRkZfSU5UNjRfRk9STUFUICIlbGxkIgorCisvKiBVbnNpZ25lZCA2NC1iaXQgdHlwZSBmb3JtYXR0ZXIgKi8KKyNkZWZpbmUgVElGRl9VSU5UNjRfRk9STUFUICIlbGx1IgorCisvKiBTaWduZWQgNjQtYml0IHR5cGUgKi8KKyNkZWZpbmUgVElGRl9JTlQ2NF9UIHNpZ25lZCBsb25nIGxvbmcKKworI2VuZGlmCQkJCQkJLy8gZW5kIF9GWF9DUFVfCisKKy8qIFVuc2lnbmVkIDY0LWJpdCB0eXBlICovCisjZGVmaW5lIFRJRkZfVUlOVDY0X1QgdW5zaWduZWQgbG9uZyBsb25nCisKKyNlbmRpZgorCisKKy8qIFNpZ25lZCBzaXplIHR5cGUgKi8KKyNpZmRlZiBfTVNDX1ZFUgorCisjaWYgZGVmaW5lZChfV0lONjQpCisjZGVmaW5lIFRJRkZfU1NJWkVfVCBzaWduZWQgX19pbnQ2NAorI2Vsc2UKKyNkZWZpbmUgVElGRl9TU0laRV9UIHNpZ25lZCBpbnQKKyNlbmRpZgorCisjZWxzZQorCisjZGVmaW5lIFRJRkZfU1NJWkVfVCBzaWduZWQgbG9uZworCisjZW5kaWYKKworLyogU2lnbmVkIHNpemUgdHlwZSBmb3JtYXR0ZXIgKi8KKyNpZiBkZWZpbmVkKF9XSU42NCkKKyNkZWZpbmUgVElGRl9TU0laRV9GT1JNQVQgIiVJNjRkIgorI2Vsc2UKKyNkZWZpbmUgVElGRl9TU0laRV9GT1JNQVQgIiVsZCIKKyNlbmRpZgorCisvKiBQb2ludGVyIGRpZmZlcmVuY2UgdHlwZSAqLworI2lmZGVmIF9NU0NfVkVSCisjZGVmaW5lIFRJRkZfUFRSRElGRl9UIGxvbmcKKyNlbHNlCisjZGVmaW5lIFRJRkZfUFRSRElGRl9UIHB0cmRpZmZfdAorI2VuZGlmCisKKy8qIFNpZ25lZCA2NC1iaXQgdHlwZSAqLworLyojZGVmaW5lIFRJRkZfSU5UNjRfVCBzaWduZWQgX19pbnQ2NCovCisKKy8qIFVuc2lnbmVkIDY0LWJpdCB0eXBlICovCisvKiNkZWZpbmUgVElGRl9VSU5UNjRfVCB1bnNpZ25lZCBfX2ludDY0Ki8KKworLyogRGVmaW5lIHRvIGBfX2lubGluZV9fJyBvciBgX19pbmxpbmUnIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyCisgICBjYWxscyBpdCwgb3IgdG8gbm90aGluZyBpZiAnaW5saW5lJyBpcyBub3Qgc3VwcG9ydGVkIHVuZGVyIGFueSBuYW1lLiAgKi8KKyNpZm5kZWYgX19jcGx1c3BsdXMKKyMgaWZuZGVmIGlubGluZQorIyAgZGVmaW5lIGlubGluZSBfX2lubGluZQorIyBlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgbGZpbmQgX2xmaW5kCisKKyNkZWZpbmUgQlNEVFlQRVMKKworLyogU2V0IHRoZSBuYXRpdmUgY3B1IGJpdCBvcmRlciAoRklMTE9SREVSX0xTQjJNU0Igb3IgRklMTE9SREVSX01TQjJMU0IpICovCisjZGVmaW5lIEhPU1RfRklMTE9SREVSIEZJTExPUkRFUl9MU0IyTVNCCisKKy8qIE5hdGl2ZSBjcHUgYnl0ZSBvcmRlcjogMSBpZiBiaWctZW5kaWFuIChNb3Rvcm9sYSkgb3IgMCBpZiBsaXR0bGUtZW5kaWFuCisgICAoSW50ZWwpICovCisjaWYgX0ZYX0VORElBTl8gPT0gX0ZYX0JJR19FTkRJQU5fCisjIGRlZmluZSBIT1NUX0JJR0VORElBTiAxCisjZWxzZQorIyBkZWZpbmUgSE9TVF9CSUdFTkRJQU4gMAorI2VuZGlmCisKKy8qIFN1cHBvcnQgQ0NJVFQgR3JvdXAgMyAmIDQgYWxnb3JpdGhtcyAqLworI2RlZmluZSBDQ0lUVF9TVVBQT1JUIDEKKworLyogU3VwcG9ydCBKUEVHIGNvbXByZXNzaW9uIChyZXF1aXJlcyBJSkcgSlBFRyBsaWJyYXJ5KSAqLworI2RlZmluZSBKUEVHX1NVUFBPUlQgMQorCisvKiBTdXBwb3J0IExvZ0x1diBoaWdoIGR5bmFtaWMgcmFuZ2UgZW5jb2RpbmcgKi8KKyNkZWZpbmUgTE9HTFVWX1NVUFBPUlQgMQorCisvKiBTdXBwb3J0IExaVyBhbGdvcml0aG0gKi8KKyNkZWZpbmUgTFpXX1NVUFBPUlQgMQorCisvKiBTdXBwb3J0IE5lWFQgMi1iaXQgUkxFIGFsZ29yaXRobSAqLworI2RlZmluZSBORVhUX1NVUFBPUlQgMQorCisvKiBTdXBwb3J0IE9sZCBKUEVHIGNvbXByZXNzb24gKHJlYWQgY29udHJpYi9vanBlZy9SRUFETUUgZmlyc3QhIENvbXBpbGF0aW9uCisgICBmYWlscyB3aXRoIHVucGF0Y2hlZCBJSkcgSlBFRyBsaWJyYXJ5KSAqLworI2RlZmluZSAgT0pQRUdfU1VQUE9SVAkxCisKKy8qIFN1cHBvcnQgTWFjaW50b3NoIFBhY2tCaXRzIGFsZ29yaXRobSAqLworI2RlZmluZSBQQUNLQklUU19TVVBQT1JUIDEKKworLyogU3VwcG9ydCBQaXhhciBsb2ctZm9ybWF0IGFsZ29yaXRobSAocmVxdWlyZXMgWmxpYikgKi8KKyNkZWZpbmUgUElYQVJMT0dfU1VQUE9SVCAxCisKKy8qIFN1cHBvcnQgVGh1bmRlclNjYW4gNC1iaXQgUkxFIGFsZ29yaXRobSAqLworI2RlZmluZSBUSFVOREVSX1NVUFBPUlQgMQorCisvKiBTdXBwb3J0IERlZmxhdGUgY29tcHJlc3Npb24gKi8KKyNkZWZpbmUgWklQX1NVUFBPUlQgMQorCisvKiBTdXBwb3J0IHN0cmlwIGNob3BwaW5nICh3aGV0aGVyIG9yIG5vdCB0byBjb252ZXJ0IHNpbmdsZS1zdHJpcCB1bmNvbXByZXNzZWQKKyAgIGltYWdlcyB0byBtdXRpcGxlIHN0cmlwcyBvZiB+OEtiIHRvIHJlZHVjZSBtZW1vcnkgdXNhZ2UpICovCisjZGVmaW5lIFNUUklQQ0hPUF9ERUZBVUxUIFRJRkZfU1RSSVBDSE9QCisKKy8qIEVuYWJsZSBTdWJJRkQgdGFnICgzMzApIHN1cHBvcnQgKi8KKyNkZWZpbmUgU1VCSUZEX1NVUFBPUlQgMQorCisvKiBUcmVhdCBleHRyYSBzYW1wbGUgYXMgYWxwaGEgKGRlZmF1bHQgZW5hYmxlZCkuIFRoZSBSR0JBIGludGVyZmFjZSB3aWxsCisgICB0cmVhdCBhIGZvdXJ0aCBzYW1wbGUgd2l0aCBubyBFWFRSQVNBTVBMRV8gdmFsdWUgYXMgYmVpbmcgQVNTT0NBTFBIQS4gTWFueQorICAgcGFja2FnZXMgcHJvZHVjZSBSR0JBIGZpbGVzIGJ1dCBkb24ndCBtYXJrIHRoZSBhbHBoYSBwcm9wZXJseS4gKi8KKyNkZWZpbmUgREVGQVVMVF9FWFRSQVNBTVBMRV9BU19BTFBIQSAxCisKKy8qIFBpY2sgdXAgWUNiQ3Igc3Vic2FtcGxpbmcgaW5mbyBmcm9tIHRoZSBKUEVHIGRhdGEgc3RyZWFtIHRvIHN1cHBvcnQgZmlsZXMKKyAgIGxhY2tpbmcgdGhlIHRhZyAoZGVmYXVsdCBlbmFibGVkKS4gKi8KKyNkZWZpbmUgQ0hFQ0tfSlBFR19ZQ0JDUl9TVUJTQU1QTElORyAxCisKKy8qIFN1cHBvcnQgTVMgTURJIG1hZ2ljIG51bWJlciBmaWxlcyBhcyBUSUZGICovCisjZGVmaW5lIE1ESV9TVVBQT1JUIDEKKworLyoKKyAqIEZlYXR1cmUgc3VwcG9ydCBkZWZpbml0aW9ucy4KKyAqIFhYWDogVGhlc2UgbWFjcm9zIGFyZSBvYnNvbGV0ZWQuIERvbid0IHVzZSB0aGVtIGluIHlvdXIgYXBwcyEKKyAqIE1hY3JvcyBzdGF5cyBoZXJlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFuZCBzaG91bGQgYmUgYWx3YXlzIGRlZmluZWQuCisgKi8KKyNkZWZpbmUgQ09MT1JJTUVUUllfU1VQUE9SVAorI2RlZmluZSBZQ0JDUl9TVVBQT1JUCisjZGVmaW5lIENNWUtfU1VQUE9SVAorI2RlZmluZSBJQ0NfU1VQUE9SVAorI2RlZmluZSBQSE9UT1NIT1BfU1VQUE9SVAorI2RlZmluZSBJUFRDX1NVUFBPUlQKKworI2VuZGlmIC8qIF9USUZGQ09ORl8gKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmZmlvLmggYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmZpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOGI2NzAKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmZpby5oCkBAIC0wLDAgKzEsNTU3IEBACisvKiAkSWQ6IHRpZmZpby5oLHYgMS45MSAyMDEyLTA3LTI5IDE1OjQ1OjI5IHRnbCBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKKyAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMtSVMiIEFORCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWQorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfVElGRklPXworI2RlZmluZQlfVElGRklPXworCisvKgorICogVElGRiBJL08gTGlicmFyeSBEZWZpbml0aW9ucy4KKyAqLworI2luY2x1ZGUgInRpZmYuaCIKKyNpbmNsdWRlICJ0aWZmdmVycy5oIgorCisvKgorICogVElGRiBpcyBkZWZpbmVkIGFzIGFuIGluY29tcGxldGUgdHlwZSB0byBoaWRlIHRoZQorICogbGlicmFyeSdzIGludGVybmFsIGRhdGEgc3RydWN0dXJlcyBmcm9tIGNsaWVudHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHRpZmYgVElGRjsKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgdHlwZWRlZnMgZGVmaW5lIHRoZSBpbnRyaW5zaWMgc2l6ZSBvZgorICogZGF0YSB0eXBlcyB1c2VkIGluIHRoZSAqZXhwb3J0ZWQqIGludGVyZmFjZXMuICBUaGVzZQorICogZGVmaW5pdGlvbnMgZGVwZW5kIG9uIHRoZSBwcm9wZXIgZGVmaW5pdGlvbiBvZiB0eXBlcworICogaW4gdGlmZi5oLiAgTm90ZSBhbHNvIHRoYXQgdGhlIHZhcmFyZ3MgaW50ZXJmYWNlIHVzZWQKKyAqIHRvIHBhc3MgdGFnIHR5cGVzIGFuZCB2YWx1ZXMgdXNlcyB0aGUgdHlwZXMgZGVmaW5lZCBpbgorICogdGlmZi5oIGRpcmVjdGx5LgorICoKKyAqIE5COiB0dGFnX3QgaXMgdW5zaWduZWQgaW50IGFuZCBub3QgdW5zaWduZWQgc2hvcnQgYmVjYXVzZQorICogICAgIEFOU0kgQyByZXF1aXJlcyB0aGF0IHRoZSB0eXBlIGJlZm9yZSB0aGUgZWxsaXBzaXMgYmUgYQorICogICAgIHByb21vdGVkIHR5cGUgKGkuZS4gb25lIG9mIGludCwgdW5zaWduZWQgaW50LCBwb2ludGVyLAorICogICAgIG9yIGRvdWJsZSkgYW5kIGJlY2F1c2Ugd2UgZGVmaW5lZCBwc2V1ZG8tdGFncyB0aGF0IGFyZQorICogICAgIG91dHNpZGUgdGhlIHJhbmdlIG9mIGxlZ2FsIEFsZHVzLWFzc2lnbmVkIHRhZ3MuCisgKiBOQjogdHNpemVfdCBpcyBpbnQzMiBhbmQgbm90IHVpbnQzMiBiZWNhdXNlIHNvbWUgZnVuY3Rpb25zCisgKiAgICAgcmV0dXJuIC0xLgorICogTkI6IHRvZmZfdCBpcyBub3Qgb2ZmX3QgZm9yIG1hbnkgcmVhc29uczsgVElGRnMgbWF4IG91dCBhdAorICogICAgIDMyLWJpdCBmaWxlIG9mZnNldHMsIGFuZCBCaWdUSUZGIG1heGVzIG91dCBhdCA2NC1iaXQKKyAqICAgICBvZmZzZXRzIGJlaW5nIHRoZSBtb3N0IGltcG9ydGFudCwgYW5kIHRvIGVuc3VyZSB1c2Ugb2YKKyAqICAgICBhIGNvbnNpc3RlbnRseSB1bnNpZ25lZCB0eXBlIGFjcm9zcyBhcmNoaXRlY3R1cmVzLgorICogICAgIFByaW9yIHRvIGxpYnRpZmYgNC4wLCB0aGlzIHdhcyBhbiB1bnNpZ25lZCAzMiBiaXQgdHlwZS4KKyAqLworLyoKKyAqIHRoaXMgaXMgdGhlIG1hY2hpbmUgYWRkcmVzc2luZyBzaXplIHR5cGUsIG9ubHkgaXQncyBzaWduZWQsIHNvIG1ha2UgaXQKKyAqIGludDMyIG9uIDMyYml0IG1hY2hpbmVzLCBpbnQ2NCBvbiA2NGJpdCBtYWNoaW5lcworICovCit0eXBlZGVmIFRJRkZfU1NJWkVfVCB0bXNpemVfdDsKK3R5cGVkZWYgdWludDY0IHRvZmZfdDsgICAgICAgICAgLyogZmlsZSBvZmZzZXQgKi8KKy8qIHRoZSBmb2xsb3dpbmcgYXJlIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBiZSByZXBsYWNlZCBieSB0aGVpciBkZWZpbmluZworICAgY291bnRlcnBhcnRzICovCit0eXBlZGVmIHVpbnQzMiB0dGFnX3Q7ICAgICAgICAgIC8qIGRpcmVjdG9yeSB0YWcgKi8KK3R5cGVkZWYgdWludDE2IHRkaXJfdDsgICAgICAgICAgLyogZGlyZWN0b3J5IGluZGV4ICovCit0eXBlZGVmIHVpbnQxNiB0c2FtcGxlX3Q7ICAgICAgIC8qIHNhbXBsZSBudW1iZXIgKi8KK3R5cGVkZWYgdWludDMyIHRzdHJpbGVfdDsgICAgICAgLyogc3RyaXAgb3IgdGlsZSBudW1iZXIgKi8KK3R5cGVkZWYgdHN0cmlsZV90IHRzdHJpcF90OyAgICAgLyogc3RyaXAgbnVtYmVyICovCit0eXBlZGVmIHRzdHJpbGVfdCB0dGlsZV90OyAgICAgIC8qIHRpbGUgbnVtYmVyICovCit0eXBlZGVmIHRtc2l6ZV90IHRzaXplX3Q7ICAgICAgIC8qIGkvbyBzaXplIGluIGJ5dGVzICovCit0eXBlZGVmIHZvaWQqIHRkYXRhX3Q7ICAgICAgICAgIC8qIGltYWdlIGRhdGEgcmVmICovCisKKyNpZiAhZGVmaW5lZChfX1dJTjMyX18pICYmIChkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChXSU4zMikpCisjZGVmaW5lIF9fV0lOMzJfXworI2VuZGlmCisKKy8qCisgKiBPbiB3aW5kb3dzIHlvdSBzaG91bGQgZGVmaW5lIFVTRV9XSU4zMl9GSUxFSU8gaWYgeW91IGFyZSB1c2luZyB0aWZfd2luMzIuYworICogb3IgQVZPSURfV0lOMzJfRklMRUlPIGlmIHlvdSBhcmUgdXNpbmcgc29tZXRoaW5nIGVsc2UgKGxpa2UgdGlmX3VuaXguYykuCisgKgorICogQnkgZGVmYXVsdCB0aWZfdW5peC5jIGlzIGFzc3VtZWQuCisgKi8KKworI2lmIGRlZmluZWQoX1dJTkRPV1MpIHx8IGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9XaW5kb3dzKQorIyAgaWYgIWRlZmluZWQoX19DWUdXSU4pICYmICFkZWZpbmVkKEFWT0lEX1dJTjMyX0ZJTEVJTykgJiYgIWRlZmluZWQoVVNFX1dJTjMyX0ZJTEVJTykKKyMgICAgZGVmaW5lIEFWT0lEX1dJTjMyX0ZJTEVJTworIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChVU0VfV0lOMzJfRklMRUlPKQorIyBkZWZpbmUgVkNfRVhUUkFMRUFOCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgaWZkZWYgX19XSU4zMl9fCitERUNMQVJFX0hBTkRMRSh0aGFuZGxlX3QpOyAgICAgLyogV2luMzIgZmlsZSBoYW5kbGUgKi8KKyMgZWxzZQordHlwZWRlZiBIRklMRSB0aGFuZGxlX3Q7ICAgICAgIC8qIGNsaWVudCBkYXRhIGhhbmRsZSAqLworIyBlbmRpZiAvKiBfX1dJTjMyX18gKi8KKyNlbHNlCit0eXBlZGVmIHZvaWQqIHRoYW5kbGVfdDsgICAgICAgLyogY2xpZW50IGRhdGEgaGFuZGxlICovCisjZW5kaWYgLyogVVNFX1dJTjMyX0ZJTEVJTyAqLworCisvKgorICogRmxhZ3MgdG8gcGFzcyB0byBUSUZGUHJpbnREaXJlY3RvcnkgdG8gY29udHJvbAorICogcHJpbnRpbmcgb2YgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgYXJlIHBvdGVudGlhbGx5CisgKiB2ZXJ5IGxhcmdlLiAgIEJpdC1vciB0aGVzZSBmbGFncyB0byBlbmFibGUgcHJpbnRpbmcKKyAqIG11bHRpcGxlIGl0ZW1zLgorICovCisjZGVmaW5lIFRJRkZQUklOVF9OT05FCSAgICAgICAweDAgICAgLyogbm8gZXh0cmEgaW5mbyAqLworI2RlZmluZSBUSUZGUFJJTlRfU1RSSVBTICAgICAgIDB4MSAgICAvKiBzdHJpcHMvdGlsZXMgaW5mbyAqLworI2RlZmluZSBUSUZGUFJJTlRfQ1VSVkVTICAgICAgIDB4MiAgICAvKiBjb2xvci9ncmF5IHJlc3BvbnNlIGN1cnZlcyAqLworI2RlZmluZSBUSUZGUFJJTlRfQ09MT1JNQVAgICAgIDB4NCAgICAvKiBjb2xvcm1hcCAqLworI2RlZmluZSBUSUZGUFJJTlRfSlBFR1FUQUJMRVMgIDB4MTAwICAvKiBKUEVHIFEgbWF0cmljZXMgKi8KKyNkZWZpbmUgVElGRlBSSU5UX0pQRUdBQ1RBQkxFUyAweDIwMCAgLyogSlBFRyBBQyB0YWJsZXMgKi8KKyNkZWZpbmUgVElGRlBSSU5UX0pQRUdEQ1RBQkxFUyAweDIwMCAgLyogSlBFRyBEQyB0YWJsZXMgKi8KKworLyogCisgKiBDb2xvdXIgY29udmVyc2lvbiBzdHVmZgorICovCisKKy8qIHJlZmVyZW5jZSB3aGl0ZSAqLworI2RlZmluZSBENjVfWDAgKDk1LjA0NzBGKQorI2RlZmluZSBENjVfWTAgKDEwMC4wRikKKyNkZWZpbmUgRDY1X1owICgxMDguODgyN0YpCisKKyNkZWZpbmUgRDUwX1gwICg5Ni40MjUwRikKKyNkZWZpbmUgRDUwX1kwICgxMDAuMEYpCisjZGVmaW5lIEQ1MF9aMCAoODIuNDY4MEYpCisKKy8qIFN0cnVjdHVyZSBmb3IgaG9sZGluZyBpbmZvcm1hdGlvbiBhYm91dCBhIGRpc3BsYXkgZGV2aWNlLiAqLworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVElGRlJHQlZhbHVlOyAgICAgICAgICAgICAgIC8qIDgtYml0IHNhbXBsZXMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCWZsb2F0IGRfbWF0WzNdWzNdOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFhZWiAtPiBsdW1pbmFuY2UgbWF0cml4ICovCisJZmxvYXQgZF9ZQ1I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGlnaHQgby9wIGZvciByZWZlcmVuY2Ugd2hpdGUgKi8KKwlmbG9hdCBkX1lDRzsKKwlmbG9hdCBkX1lDQjsKKwl1aW50MzIgZF9WcndyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQaXhlbCB2YWx1ZXMgZm9yIHJlZi4gd2hpdGUgKi8KKwl1aW50MzIgZF9WcndnOworCXVpbnQzMiBkX1Zyd2I7CisJZmxvYXQgZF9ZMFI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzaWR1YWwgbGlnaHQgZm9yIGJsYWNrIHBpeGVsICovCisJZmxvYXQgZF9ZMEc7CisJZmxvYXQgZF9ZMEI7CisJZmxvYXQgZF9nYW1tYVI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FtbWEgdmFsdWVzIGZvciB0aGUgdGhyZWUgZ3VucyAqLworCWZsb2F0IGRfZ2FtbWFHOworCWZsb2F0IGRfZ2FtbWFCOworfSBUSUZGRGlzcGxheTsKKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBZQ2JDci0+UkdCIHN1cHBvcnQgKi8KKwlUSUZGUkdCVmFsdWUqIGNsYW1wdGFiOyAgICAgICAgICAgICAgICAgICAvKiByYW5nZSBjbGFtcGluZyB0YWJsZSAqLworCWludCogQ3Jfcl90YWI7CisJaW50KiBDYl9iX3RhYjsKKwlpbnQzMiogQ3JfZ190YWI7CisJaW50MzIqIENiX2dfdGFiOworCWludDMyKiBZX3RhYjsKK30gVElGRllDYkNyVG9SR0I7CisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ0lFIExhYiAxOTc2LT5SR0Igc3VwcG9ydCAqLworCWludCByYW5nZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNpemUgb2YgY29udmVyc2lvbiB0YWJsZSAqLworI2RlZmluZSBDSUVMQUJUT1JHQl9UQUJMRV9SQU5HRSAxNTAwCisJZmxvYXQgcnN0ZXAsIGdzdGVwLCBic3RlcDsKKwlmbG9hdCBYMCwgWTAsIFowOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWZlcmVuY2Ugd2hpdGUgcG9pbnQgKi8KKwlUSUZGRGlzcGxheSBkaXNwbGF5OworCWZsb2F0IFlyMnJbQ0lFTEFCVE9SR0JfVEFCTEVfUkFOR0UgKyAxXTsgIC8qIENvbnZlcnNpb24gb2YgWXIgdG8gciAqLworCWZsb2F0IFlnMmdbQ0lFTEFCVE9SR0JfVEFCTEVfUkFOR0UgKyAxXTsgIC8qIENvbnZlcnNpb24gb2YgWWcgdG8gZyAqLworCWZsb2F0IFliMmJbQ0lFTEFCVE9SR0JfVEFCTEVfUkFOR0UgKyAxXTsgIC8qIENvbnZlcnNpb24gb2YgWWIgdG8gYiAqLworfSBUSUZGQ0lFTGFiVG9SR0I7CisKKy8qCisgKiBSR0JBLXN0eWxlIGltYWdlIHN1cHBvcnQuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9USUZGUkdCQUltYWdlIFRJRkZSR0JBSW1hZ2U7CisvKgorICogVGhlIGltYWdlIHJlYWRpbmcgYW5kIGNvbnZlcnNpb24gcm91dGluZXMgaW52b2tlCisgKiBgYHB1dCByb3V0aW5lcycnIHRvIGNvcHkvaW1hZ2Uvd2hhdGV2ZXIgdGlsZXMgb2YKKyAqIHJhdyBpbWFnZSBkYXRhLiAgQSBkZWZhdWx0IHNldCBvZiByb3V0aW5lcyBhcmUgCisgKiBwcm92aWRlZCB0byBjb252ZXJ0L2NvcHkgcmF3IGltYWdlIGRhdGEgdG8gOC1iaXQKKyAqIHBhY2tlZCBBQkdSIGZvcm1hdCByYXN0ZXJzLiAgQXBwbGljYXRpb25zIGNhbiBzdXBwbHkKKyAqIGFsdGVybmF0ZSByb3V0aW5lcyB0aGF0IHVucGFjayB0aGUgZGF0YSBpbnRvIGEKKyAqIGRpZmZlcmVudCBmb3JtYXQgb3IsIGZvciBleGFtcGxlLCB1bnBhY2sgdGhlIGRhdGEKKyAqIGFuZCBkcmF3IHRoZSB1bnBhY2tlZCByYXN0ZXIgb24gdGhlIGRpc3BsYXkuCisgKi8KK3R5cGVkZWYgdm9pZCAoKnRpbGVDb250aWdSb3V0aW5lKQorICAgIChUSUZGUkdCQUltYWdlKiwgdWludDMyKiwgdWludDMyLCB1aW50MzIsIHVpbnQzMiwgdWludDMyLCBpbnQzMiwgaW50MzIsCisJdW5zaWduZWQgY2hhciopOwordHlwZWRlZiB2b2lkICgqdGlsZVNlcGFyYXRlUm91dGluZSkKKyAgICAoVElGRlJHQkFJbWFnZSosIHVpbnQzMiosIHVpbnQzMiwgdWludDMyLCB1aW50MzIsIHVpbnQzMiwgaW50MzIsIGludDMyLAorCXVuc2lnbmVkIGNoYXIqLCB1bnNpZ25lZCBjaGFyKiwgdW5zaWduZWQgY2hhciosIHVuc2lnbmVkIGNoYXIqKTsKKy8qCisgKiBSR0JBLXJlYWRlciBzdGF0ZS4KKyAqLworc3RydWN0IF9USUZGUkdCQUltYWdlIHsKKwlUSUZGKiB0aWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW1hZ2UgaGFuZGxlICovCisJaW50IHN0b3BvbmVycjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3Agb24gcmVhZCBlcnJvciAqLworCWludCBpc0NvbnRpZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkYXRhIGlzIHBhY2tlZC9zZXBhcmF0ZSAqLworCWludCBhbHBoYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0eXBlIG9mIGFscGhhIGRhdGEgcHJlc2VudCAqLworCXVpbnQzMiB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbWFnZSB3aWR0aCAqLworCXVpbnQzMiBoZWlnaHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbWFnZSBoZWlnaHQgKi8KKwl1aW50MTYgYml0c3BlcnNhbXBsZTsgICAgICAgICAgICAgICAgICAgLyogaW1hZ2UgYml0cy9zYW1wbGUgKi8KKwl1aW50MTYgc2FtcGxlc3BlcnBpeGVsOyAgICAgICAgICAgICAgICAgLyogaW1hZ2Ugc2FtcGxlcy9waXhlbCAqLworCXVpbnQxNiBvcmllbnRhdGlvbjsgICAgICAgICAgICAgICAgICAgICAvKiBpbWFnZSBvcmllbnRhdGlvbiAqLworCXVpbnQxNiByZXFfb3JpZW50YXRpb247ICAgICAgICAgICAgICAgICAvKiByZXF1ZXN0ZWQgb3JpZW50YXRpb24gKi8KKwl1aW50MTYgcGhvdG9tZXRyaWM7ICAgICAgICAgICAgICAgICAgICAgLyogaW1hZ2UgcGhvdG9tZXRyaWMgaW50ZXJwICovCisJdWludDE2KiByZWRjbWFwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbG9ybWFwIHBhbGxldGUgKi8KKwl1aW50MTYqIGdyZWVuY21hcDsKKwl1aW50MTYqIGJsdWVjbWFwOworCS8qIGdldCBpbWFnZSBkYXRhIHJvdXRpbmUgKi8KKwlpbnQgKCpnZXQpKFRJRkZSR0JBSW1hZ2UqLCB1aW50MzIqLCB1aW50MzIsIHVpbnQzMik7CisJLyogcHV0IGRlY29kZWQgc3RyaXAvdGlsZSAqLworCXVuaW9uIHsKKwkgICAgdm9pZCAoKmFueSkoVElGRlJHQkFJbWFnZSopOworCSAgICB0aWxlQ29udGlnUm91dGluZSBjb250aWc7CisJICAgIHRpbGVTZXBhcmF0ZVJvdXRpbmUgc2VwYXJhdGU7CisJfSBwdXQ7CisJVElGRlJHQlZhbHVlKiBNYXA7ICAgICAgICAgICAgICAgICAgICAgIC8qIHNhbXBsZSBtYXBwaW5nIGFycmF5ICovCisJdWludDMyKiogQldtYXA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJsYWNrJndoaXRlIG1hcCAqLworCXVpbnQzMioqIFBBTG1hcDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBwYWxldHRlIGltYWdlIG1hcCAqLworCVRJRkZZQ2JDclRvUkdCKiB5Y2JjcjsgICAgICAgICAgICAgICAgICAvKiBZQ2JDciBjb252ZXJzaW9uIHN0YXRlICovCisJVElGRkNJRUxhYlRvUkdCKiBjaWVsYWI7ICAgICAgICAgICAgICAgIC8qIENJRSBMKmEqYiBjb252ZXJzaW9uIHN0YXRlICovCisKKwl1aW50OCogVWFUb0FhOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVW5hc3NvY2lhdGVkIGFscGhhIHRvIGFzc29jaWF0ZWQgYWxwaGEgY29udmVydGlvbiBMVVQgKi8KKwl1aW50OCogQml0ZGVwdGgxNlRvODsgICAgICAgICAgICAgICAgICAgLyogTFVUIGZvciBjb252ZXJzaW9uIGZyb20gMTZiaXQgdG8gOGJpdCB2YWx1ZXMgKi8KKworCWludCByb3dfb2Zmc2V0OworCWludCBjb2xfb2Zmc2V0OworfTsKKworLyoKKyAqIE1hY3JvcyBmb3IgZXh0cmFjdGluZyBjb21wb25lbnRzIGZyb20gdGhlCisgKiBwYWNrZWQgQUJHUiBmb3JtIHJldHVybmVkIGJ5IFRJRkZSZWFkUkdCQUltYWdlLgorICovCisjZGVmaW5lIFRJRkZHZXRSKGFiZ3IpICgoYWJncikgJiAweGZmKQorI2RlZmluZSBUSUZGR2V0RyhhYmdyKSAoKChhYmdyKSA+PiA4KSAmIDB4ZmYpCisjZGVmaW5lIFRJRkZHZXRCKGFiZ3IpICgoKGFiZ3IpID4+IDE2KSAmIDB4ZmYpCisjZGVmaW5lIFRJRkZHZXRBKGFiZ3IpICgoKGFiZ3IpID4+IDI0KSAmIDB4ZmYpCisKKy8qCisgKiBBIENPREVDIGlzIGEgc29mdHdhcmUgcGFja2FnZSB0aGF0IGltcGxlbWVudHMgZGVjb2RpbmcsCisgKiBlbmNvZGluZywgb3IgZGVjb2RpbmcrZW5jb2Rpbmcgb2YgYSBjb21wcmVzc2lvbiBhbGdvcml0aG0uCisgKiBUaGUgbGlicmFyeSBwcm92aWRlcyBhIGNvbGxlY3Rpb24gb2YgYnVpbHRpbiBjb2RlY3MuCisgKiBNb3JlIGNvZGVjcyBtYXkgYmUgcmVnaXN0ZXJlZCB0aHJvdWdoIGNhbGxzIHRvIHRoZSBsaWJyYXJ5CisgKiBhbmQvb3IgdGhlIGJ1aWx0aW4gaW1wbGVtZW50YXRpb25zIG1heSBiZSBvdmVycmlkZGVuLgorICovCit0eXBlZGVmIGludCAoKlRJRkZJbml0TWV0aG9kKShUSUZGKiwgaW50KTsKK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyKiBuYW1lOworCXVpbnQxNiBzY2hlbWU7CisJVElGRkluaXRNZXRob2QgaW5pdDsKK30gVElGRkNvZGVjOworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLyogc2hhcmUgaW50ZXJuYWwgTG9nTHV2IGNvbnZlcnNpb24gcm91dGluZXM/ICovCisjaWZuZGVmIExPR0xVVl9QVUJMSUMKKyNkZWZpbmUgTE9HTFVWX1BVQkxJQyAxCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX2F0dHJpYnV0ZV9fKQorIyAgZGVmaW5lIF9fYXR0cmlidXRlX18oeCkgLypub3RoaW5nKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChjX3BsdXNwbHVzKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKK3R5cGVkZWYgdm9pZCAoKlRJRkZFcnJvckhhbmRsZXIpKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgdmFfbGlzdCk7Cit0eXBlZGVmIHZvaWQgKCpUSUZGRXJyb3JIYW5kbGVyRXh0KSh0aGFuZGxlX3QsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgdmFfbGlzdCk7Cit0eXBlZGVmIHRtc2l6ZV90ICgqVElGRlJlYWRXcml0ZVByb2MpKHRoYW5kbGVfdCwgdm9pZCosIHRtc2l6ZV90KTsKK3R5cGVkZWYgdG9mZl90ICgqVElGRlNlZWtQcm9jKSh0aGFuZGxlX3QsIHRvZmZfdCwgaW50KTsKK3R5cGVkZWYgaW50ICgqVElGRkNsb3NlUHJvYykodGhhbmRsZV90KTsKK3R5cGVkZWYgdG9mZl90ICgqVElGRlNpemVQcm9jKSh0aGFuZGxlX3QpOwordHlwZWRlZiBpbnQgKCpUSUZGTWFwRmlsZVByb2MpKHRoYW5kbGVfdCwgdm9pZCoqIGJhc2UsIHRvZmZfdCogc2l6ZSk7Cit0eXBlZGVmIHZvaWQgKCpUSUZGVW5tYXBGaWxlUHJvYykodGhhbmRsZV90LCB2b2lkKiBiYXNlLCB0b2ZmX3Qgc2l6ZSk7Cit0eXBlZGVmIHZvaWQgKCpUSUZGRXh0ZW5kUHJvYykoVElGRiopOworCitleHRlcm4gY29uc3QgY2hhciogVElGRkdldFZlcnNpb24odm9pZCk7CisKK2V4dGVybiBjb25zdCBUSUZGQ29kZWMqIFRJRkZGaW5kQ09ERUModWludDE2KTsKK2V4dGVybiBUSUZGQ29kZWMqIFRJRkZSZWdpc3RlckNPREVDKHVpbnQxNiwgY29uc3QgY2hhciosIFRJRkZJbml0TWV0aG9kKTsKK2V4dGVybiB2b2lkIFRJRkZVblJlZ2lzdGVyQ09ERUMoVElGRkNvZGVjKik7CitleHRlcm4gaW50IFRJRkZJc0NPREVDQ29uZmlndXJlZCh1aW50MTYpOworZXh0ZXJuIFRJRkZDb2RlYyogVElGRkdldENvbmZpZ3VyZWRDT0RFQ3Modm9pZCk7CisKKy8qCisgKiBBdXhpbGlhcnkgZnVuY3Rpb25zLgorICovCisKK2V4dGVybiB2b2lkKiBfVElGRm1hbGxvYyh0bXNpemVfdCBzKTsKK2V4dGVybiB2b2lkKiBfVElGRnJlYWxsb2Modm9pZCogcCwgdG1zaXplX3Qgcyk7CitleHRlcm4gdm9pZCBfVElGRm1lbXNldCh2b2lkKiBwLCBpbnQgdiwgdG1zaXplX3QgYyk7CitleHRlcm4gdm9pZCBfVElGRm1lbWNweSh2b2lkKiBkLCBjb25zdCB2b2lkKiBzLCB0bXNpemVfdCBjKTsKK2V4dGVybiBpbnQgX1RJRkZtZW1jbXAoY29uc3Qgdm9pZCogcDEsIGNvbnN0IHZvaWQqIHAyLCB0bXNpemVfdCBjKTsKK2V4dGVybiB2b2lkIF9USUZGZnJlZSh2b2lkKiBwKTsKKworLyoKKyoqIFN0dWZmLCByZWxhdGVkIHRvIHRhZyBoYW5kbGluZyBhbmQgY3JlYXRpbmcgY3VzdG9tIHRhZ3MuCisqLworZXh0ZXJuIGludCBUSUZGR2V0VGFnTGlzdENvdW50KCBUSUZGICogKTsKK2V4dGVybiB1aW50MzIgVElGRkdldFRhZ0xpc3RFbnRyeSggVElGRiAqLCBpbnQgdGFnX2luZGV4ICk7CisgICAgCisjZGVmaW5lIFRJRkZfQU5ZICAgICAgIFRJRkZfTk9UWVBFICAgICAvKiBmb3IgZmllbGQgZGVzY3JpcHRvciBzZWFyY2hpbmcgKi8KKyNkZWZpbmUgVElGRl9WQVJJQUJMRSAgLTEgICAgICAgICAgICAgIC8qIG1hcmtlciBmb3IgdmFyaWFibGUgbGVuZ3RoIHRhZ3MgKi8KKyNkZWZpbmUgVElGRl9TUFAgICAgICAgLTIgICAgICAgICAgICAgIC8qIG1hcmtlciBmb3IgU2FtcGxlc1BlclBpeGVsIHRhZ3MgKi8KKyNkZWZpbmUgVElGRl9WQVJJQUJMRTIgLTMgICAgICAgICAgICAgIC8qIG1hcmtlciBmb3IgdWludDMyIHZhci1sZW5ndGggdGFncyAqLworCisjZGVmaW5lIEZJRUxEX0NVU1RPTSAgICA2NQorCit0eXBlZGVmIHN0cnVjdCBfVElGRkZpZWxkIFRJRkZGaWVsZDsKK3R5cGVkZWYgc3RydWN0IF9USUZGRmllbGRBcnJheSBUSUZGRmllbGRBcnJheTsKKworZXh0ZXJuIGNvbnN0IFRJRkZGaWVsZCogVElGRkZpbmRGaWVsZChUSUZGICosIHVpbnQzMiwgVElGRkRhdGFUeXBlKTsKK2V4dGVybiBjb25zdCBUSUZGRmllbGQqIFRJRkZGaWVsZFdpdGhUYWcoVElGRiosIHVpbnQzMik7CitleHRlcm4gY29uc3QgVElGRkZpZWxkKiBUSUZGRmllbGRXaXRoTmFtZShUSUZGKiwgY29uc3QgY2hhciAqKTsKKworZXh0ZXJuIHVpbnQzMiBUSUZGRmllbGRUYWcoY29uc3QgVElGRkZpZWxkKik7CitleHRlcm4gY29uc3QgY2hhciogVElGRkZpZWxkTmFtZShjb25zdCBUSUZGRmllbGQqKTsKK2V4dGVybiBUSUZGRGF0YVR5cGUgVElGRkZpZWxkRGF0YVR5cGUoY29uc3QgVElGRkZpZWxkKik7CitleHRlcm4gaW50IFRJRkZGaWVsZFBhc3NDb3VudChjb25zdCBUSUZGRmllbGQqKTsKK2V4dGVybiBpbnQgVElGRkZpZWxkUmVhZENvdW50KGNvbnN0IFRJRkZGaWVsZCopOworZXh0ZXJuIGludCBUSUZGRmllbGRXcml0ZUNvdW50KGNvbnN0IFRJRkZGaWVsZCopOworCit0eXBlZGVmIGludCAoKlRJRkZWU2V0TWV0aG9kKShUSUZGKiwgdWludDMyLCB2YV9saXN0KTsKK3R5cGVkZWYgaW50ICgqVElGRlZHZXRNZXRob2QpKFRJRkYqLCB1aW50MzIsIHZhX2xpc3QpOwordHlwZWRlZiB2b2lkICgqVElGRlByaW50TWV0aG9kKShUSUZGKiwgRklMRSosIGxvbmcpOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVElGRlZTZXRNZXRob2QgdnNldGZpZWxkOyAvKiB0YWcgc2V0IHJvdXRpbmUgKi8KKyAgICBUSUZGVkdldE1ldGhvZCB2Z2V0ZmllbGQ7IC8qIHRhZyBnZXQgcm91dGluZSAqLworICAgIFRJRkZQcmludE1ldGhvZCBwcmludGRpcjsgLyogZGlyZWN0b3J5IHByaW50IHJvdXRpbmUgKi8KK30gVElGRlRhZ01ldGhvZHM7CisKK2V4dGVybiAgVElGRlRhZ01ldGhvZHMgKlRJRkZBY2Nlc3NUYWdNZXRob2RzKFRJRkYgKik7CitleHRlcm4gIHZvaWQgKlRJRkZHZXRDbGllbnRJbmZvKFRJRkYgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiAgdm9pZCBUSUZGU2V0Q2xpZW50SW5mbyhUSUZGICosIHZvaWQgKiwgY29uc3QgY2hhciAqKTsKKworZXh0ZXJuIHZvaWQgVElGRkNsZWFudXAoVElGRiogdGlmKTsKK2V4dGVybiB2b2lkIFRJRkZDbG9zZShUSUZGKiB0aWYpOworZXh0ZXJuIGludCBUSUZGRmx1c2goVElGRiogdGlmKTsKK2V4dGVybiBpbnQgVElGRkZsdXNoRGF0YShUSUZGKiB0aWYpOworZXh0ZXJuIGludCBUSUZGR2V0RmllbGQoVElGRiogdGlmLCB1aW50MzIgdGFnLCAuLi4pOworZXh0ZXJuIGludCBUSUZGVkdldEZpZWxkKFRJRkYqIHRpZiwgdWludDMyIHRhZywgdmFfbGlzdCBhcCk7CitleHRlcm4gaW50IFRJRkZHZXRGaWVsZERlZmF1bHRlZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcsIC4uLik7CitleHRlcm4gaW50IFRJRkZWR2V0RmllbGREZWZhdWx0ZWQoVElGRiogdGlmLCB1aW50MzIgdGFnLCB2YV9saXN0IGFwKTsKK2V4dGVybiBpbnQgVElGRlJlYWREaXJlY3RvcnkoVElGRiogdGlmKTsKK2V4dGVybiBpbnQgVElGRlJlYWRDdXN0b21EaXJlY3RvcnkoVElGRiogdGlmLCB0b2ZmX3QgZGlyb2ZmLCBjb25zdCBUSUZGRmllbGRBcnJheSogaW5mb2FycmF5KTsKK2V4dGVybiBpbnQgVElGRlJlYWRFWElGRGlyZWN0b3J5KFRJRkYqIHRpZiwgdG9mZl90IGRpcm9mZik7CitleHRlcm4gdWludDY0IFRJRkZTY2FubGluZVNpemU2NChUSUZGKiB0aWYpOworZXh0ZXJuIHRtc2l6ZV90IFRJRkZTY2FubGluZVNpemUoVElGRiogdGlmKTsKK2V4dGVybiB1aW50NjQgVElGRlJhc3RlclNjYW5saW5lU2l6ZTY0KFRJRkYqIHRpZik7CitleHRlcm4gdG1zaXplX3QgVElGRlJhc3RlclNjYW5saW5lU2l6ZShUSUZGKiB0aWYpOworZXh0ZXJuIHVpbnQ2NCBUSUZGU3RyaXBTaXplNjQoVElGRiogdGlmKTsKK2V4dGVybiB0bXNpemVfdCBUSUZGU3RyaXBTaXplKFRJRkYqIHRpZik7CitleHRlcm4gdWludDY0IFRJRkZSYXdTdHJpcFNpemU2NChUSUZGKiB0aWYsIHVpbnQzMiBzdHJpcCk7CitleHRlcm4gdG1zaXplX3QgVElGRlJhd1N0cmlwU2l6ZShUSUZGKiB0aWYsIHVpbnQzMiBzdHJpcCk7CitleHRlcm4gdWludDY0IFRJRkZWU3RyaXBTaXplNjQoVElGRiogdGlmLCB1aW50MzIgbnJvd3MpOworZXh0ZXJuIHRtc2l6ZV90IFRJRkZWU3RyaXBTaXplKFRJRkYqIHRpZiwgdWludDMyIG5yb3dzKTsKK2V4dGVybiB1aW50NjQgVElGRlRpbGVSb3dTaXplNjQoVElGRiogdGlmKTsKK2V4dGVybiB0bXNpemVfdCBUSUZGVGlsZVJvd1NpemUoVElGRiogdGlmKTsKK2V4dGVybiB1aW50NjQgVElGRlRpbGVTaXplNjQoVElGRiogdGlmKTsKK2V4dGVybiB0bXNpemVfdCBUSUZGVGlsZVNpemUoVElGRiogdGlmKTsKK2V4dGVybiB1aW50NjQgVElGRlZUaWxlU2l6ZTY0KFRJRkYqIHRpZiwgdWludDMyIG5yb3dzKTsKK2V4dGVybiB0bXNpemVfdCBUSUZGVlRpbGVTaXplKFRJRkYqIHRpZiwgdWludDMyIG5yb3dzKTsKK2V4dGVybiB1aW50MzIgVElGRkRlZmF1bHRTdHJpcFNpemUoVElGRiogdGlmLCB1aW50MzIgcmVxdWVzdCk7CitleHRlcm4gdm9pZCBUSUZGRGVmYXVsdFRpbGVTaXplKFRJRkYqLCB1aW50MzIqLCB1aW50MzIqKTsKK2V4dGVybiBpbnQgVElGRkZpbGVubyhUSUZGKik7CitleHRlcm4gaW50IFRJRkZTZXRGaWxlbm8oVElGRiosIGludCk7CitleHRlcm4gdGhhbmRsZV90IFRJRkZDbGllbnRkYXRhKFRJRkYqKTsKK2V4dGVybiB0aGFuZGxlX3QgVElGRlNldENsaWVudGRhdGEoVElGRiosIHRoYW5kbGVfdCk7CitleHRlcm4gaW50IFRJRkZHZXRNb2RlKFRJRkYqKTsKK2V4dGVybiBpbnQgVElGRlNldE1vZGUoVElGRiosIGludCk7CitleHRlcm4gaW50IFRJRkZJc1RpbGVkKFRJRkYqKTsKK2V4dGVybiBpbnQgVElGRklzQnl0ZVN3YXBwZWQoVElGRiopOworZXh0ZXJuIGludCBUSUZGSXNVcFNhbXBsZWQoVElGRiopOworZXh0ZXJuIGludCBUSUZGSXNNU0IyTFNCKFRJRkYqKTsKK2V4dGVybiBpbnQgVElGRklzQmlnRW5kaWFuKFRJRkYqKTsKK2V4dGVybiBUSUZGUmVhZFdyaXRlUHJvYyBUSUZGR2V0UmVhZFByb2MoVElGRiopOworZXh0ZXJuIFRJRkZSZWFkV3JpdGVQcm9jIFRJRkZHZXRXcml0ZVByb2MoVElGRiopOworZXh0ZXJuIFRJRkZTZWVrUHJvYyBUSUZGR2V0U2Vla1Byb2MoVElGRiopOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK2V4dGVybiBUSUZGQ2xvc2VQcm9jIFRJRkZHZXRDbG9zZVByb2MoVElGRiopOworZXh0ZXJuIFRJRkZTaXplUHJvYyBUSUZGR2V0U2l6ZVByb2MoVElGRiopOworZXh0ZXJuIFRJRkZNYXBGaWxlUHJvYyBUSUZGR2V0TWFwRmlsZVByb2MoVElGRiopOworZXh0ZXJuIFRJRkZVbm1hcEZpbGVQcm9jIFRJRkZHZXRVbm1hcEZpbGVQcm9jKFRJRkYqKTsKK2V4dGVybiB1aW50MzIgVElGRkN1cnJlbnRSb3coVElGRiopOworZXh0ZXJuIHVpbnQxNiBUSUZGQ3VycmVudERpcmVjdG9yeShUSUZGKik7CitleHRlcm4gdWludDE2IFRJRkZOdW1iZXJPZkRpcmVjdG9yaWVzKFRJRkYqKTsKK2V4dGVybiB1aW50NjQgVElGRkN1cnJlbnREaXJPZmZzZXQoVElGRiopOworZXh0ZXJuIHVpbnQzMiBUSUZGQ3VycmVudFN0cmlwKFRJRkYqKTsKK2V4dGVybiB1aW50MzIgVElGRkN1cnJlbnRUaWxlKFRJRkYqIHRpZik7CitleHRlcm4gaW50IFRJRkZSZWFkQnVmZmVyU2V0dXAoVElGRiogdGlmLCB2b2lkKiBicCwgdG1zaXplX3Qgc2l6ZSk7CitleHRlcm4gaW50IFRJRkZXcml0ZUJ1ZmZlclNldHVwKFRJRkYqIHRpZiwgdm9pZCogYnAsIHRtc2l6ZV90IHNpemUpOyAgCitleHRlcm4gaW50IFRJRkZTZXR1cFN0cmlwcyhUSUZGICopOworZXh0ZXJuIGludCBUSUZGV3JpdGVDaGVjayhUSUZGKiwgaW50LCBjb25zdCBjaGFyICopOworZXh0ZXJuIHZvaWQgVElGRkZyZWVEaXJlY3RvcnkoVElGRiopOworZXh0ZXJuIGludCBUSUZGQ3JlYXRlRGlyZWN0b3J5KFRJRkYqKTsKK2V4dGVybiBpbnQgVElGRkNyZWF0ZUN1c3RvbURpcmVjdG9yeShUSUZGKixjb25zdCBUSUZGRmllbGRBcnJheSopOworZXh0ZXJuIGludCBUSUZGQ3JlYXRlRVhJRkRpcmVjdG9yeShUSUZGKik7CitleHRlcm4gaW50IFRJRkZMYXN0RGlyZWN0b3J5KFRJRkYqKTsKK2V4dGVybiBpbnQgVElGRlNldERpcmVjdG9yeShUSUZGKiwgdWludDE2KTsKK2V4dGVybiBpbnQgVElGRlNldFN1YkRpcmVjdG9yeShUSUZGKiwgdWludDY0KTsKK2V4dGVybiBpbnQgVElGRlVubGlua0RpcmVjdG9yeShUSUZGKiwgdWludDE2KTsKK2V4dGVybiBpbnQgVElGRlNldEZpZWxkKFRJRkYqLCB1aW50MzIsIC4uLik7CitleHRlcm4gaW50IFRJRkZWU2V0RmllbGQoVElGRiosIHVpbnQzMiwgdmFfbGlzdCk7CitleHRlcm4gaW50IFRJRkZVbnNldEZpZWxkKFRJRkYqLCB1aW50MzIpOworZXh0ZXJuIGludCBUSUZGV3JpdGVEaXJlY3RvcnkoVElGRiAqKTsKK2V4dGVybiBpbnQgVElGRldyaXRlQ3VzdG9tRGlyZWN0b3J5KFRJRkYgKiwgdWludDY0ICopOworZXh0ZXJuIGludCBUSUZGQ2hlY2twb2ludERpcmVjdG9yeShUSUZGICopOworZXh0ZXJuIGludCBUSUZGUmV3cml0ZURpcmVjdG9yeShUSUZGICopOworCisjaWYgZGVmaW5lZChjX3BsdXNwbHVzKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuIHZvaWQgVElGRlByaW50RGlyZWN0b3J5KFRJRkYqLCBGSUxFKiwgbG9uZyA9IDApOworZXh0ZXJuIGludCBUSUZGUmVhZFNjYW5saW5lKFRJRkYqIHRpZiwgdm9pZCogYnVmLCB1aW50MzIgcm93LCB1aW50MTYgc2FtcGxlID0gMCk7CitleHRlcm4gaW50IFRJRkZXcml0ZVNjYW5saW5lKFRJRkYqIHRpZiwgdm9pZCogYnVmLCB1aW50MzIgcm93LCB1aW50MTYgc2FtcGxlID0gMCk7CitleHRlcm4gaW50IFRJRkZSZWFkUkdCQUltYWdlKFRJRkYqLCB1aW50MzIsIHVpbnQzMiwgdWludDMyKiwgaW50ID0gMCk7CitleHRlcm4gaW50IFRJRkZSZWFkUkdCQUltYWdlT3JpZW50ZWQoVElGRiosIHVpbnQzMiwgdWludDMyLCB1aW50MzIqLAorICAgIGludCA9IE9SSUVOVEFUSU9OX0JPVExFRlQsIGludCA9IDApOworI2Vsc2UKK2V4dGVybiB2b2lkIFRJRkZQcmludERpcmVjdG9yeShUSUZGKiwgRklMRSosIGxvbmcpOworZXh0ZXJuIGludCBUSUZGUmVhZFNjYW5saW5lKFRJRkYqIHRpZiwgdm9pZCogYnVmLCB1aW50MzIgcm93LCB1aW50MTYgc2FtcGxlKTsKK2V4dGVybiBpbnQgVElGRldyaXRlU2NhbmxpbmUoVElGRiogdGlmLCB2b2lkKiBidWYsIHVpbnQzMiByb3csIHVpbnQxNiBzYW1wbGUpOworZXh0ZXJuIGludCBUSUZGUmVhZFJHQkFJbWFnZShUSUZGKiwgdWludDMyLCB1aW50MzIsIHVpbnQzMiosIGludCk7CitleHRlcm4gaW50IFRJRkZSZWFkUkdCQUltYWdlT3JpZW50ZWQoVElGRiosIHVpbnQzMiwgdWludDMyLCB1aW50MzIqLCBpbnQsIGludCk7CisjZW5kaWYKKworZXh0ZXJuIGludCBUSUZGUmVhZFJHQkFTdHJpcChUSUZGKiwgdWludDMyLCB1aW50MzIgKiApOworZXh0ZXJuIGludCBUSUZGUmVhZFJHQkFUaWxlKFRJRkYqLCB1aW50MzIsIHVpbnQzMiwgdWludDMyICogKTsKK2V4dGVybiBpbnQgVElGRlJHQkFJbWFnZU9LKFRJRkYqLCBjaGFyIFsxMDI0XSk7CitleHRlcm4gaW50IFRJRkZSR0JBSW1hZ2VCZWdpbihUSUZGUkdCQUltYWdlKiwgVElGRiosIGludCwgY2hhciBbMTAyNF0pOworZXh0ZXJuIGludCBUSUZGUkdCQUltYWdlR2V0KFRJRkZSR0JBSW1hZ2UqLCB1aW50MzIqLCB1aW50MzIsIHVpbnQzMik7CitleHRlcm4gdm9pZCBUSUZGUkdCQUltYWdlRW5kKFRJRkZSR0JBSW1hZ2UqKTsKK2V4dGVybiBUSUZGKiBUSUZGT3Blbihjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworIyBpZmRlZiBfX1dJTjMyX18KK2V4dGVybiBUSUZGKiBUSUZGT3BlblcoY29uc3Qgd2NoYXJfdCosIGNvbnN0IGNoYXIqKTsKKyMgZW5kaWYgLyogX19XSU4zMl9fICovCitleHRlcm4gVElGRiogVElGRkZkT3BlbihpbnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitleHRlcm4gVElGRiogVElGRkNsaWVudE9wZW4oY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAorCSAgICB0aGFuZGxlX3QsCisJICAgIFRJRkZSZWFkV3JpdGVQcm9jLCBUSUZGUmVhZFdyaXRlUHJvYywKKwkgICAgVElGRlNlZWtQcm9jLCBUSUZGQ2xvc2VQcm9jLAorCSAgICBUSUZGU2l6ZVByb2MsCisJICAgIFRJRkZNYXBGaWxlUHJvYywgVElGRlVubWFwRmlsZVByb2MpOworZXh0ZXJuIGNvbnN0IGNoYXIqIFRJRkZGaWxlTmFtZShUSUZGKik7CitleHRlcm4gY29uc3QgY2hhciogVElGRlNldEZpbGVOYW1lKFRJRkYqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIHZvaWQgVElGRkVycm9yKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgLi4uKSBfX2F0dHJpYnV0ZV9fKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLDIsMykpKTsKK2V4dGVybiB2b2lkIFRJRkZFcnJvckV4dCh0aGFuZGxlX3QsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgLi4uKSBfX2F0dHJpYnV0ZV9fKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLDMsNCkpKTsKK2V4dGVybiB2b2lkIFRJRkZXYXJuaW5nKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgLi4uKSBfX2F0dHJpYnV0ZV9fKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLDIsMykpKTsKK2V4dGVybiB2b2lkIFRJRkZXYXJuaW5nRXh0KHRoYW5kbGVfdCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCAuLi4pIF9fYXR0cmlidXRlX18oKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sMyw0KSkpOworZXh0ZXJuIFRJRkZFcnJvckhhbmRsZXIgVElGRlNldEVycm9ySGFuZGxlcihUSUZGRXJyb3JIYW5kbGVyKTsKK2V4dGVybiBUSUZGRXJyb3JIYW5kbGVyRXh0IFRJRkZTZXRFcnJvckhhbmRsZXJFeHQoVElGRkVycm9ySGFuZGxlckV4dCk7CitleHRlcm4gVElGRkVycm9ySGFuZGxlciBUSUZGU2V0V2FybmluZ0hhbmRsZXIoVElGRkVycm9ySGFuZGxlcik7CitleHRlcm4gVElGRkVycm9ySGFuZGxlckV4dCBUSUZGU2V0V2FybmluZ0hhbmRsZXJFeHQoVElGRkVycm9ySGFuZGxlckV4dCk7CitleHRlcm4gVElGRkV4dGVuZFByb2MgVElGRlNldFRhZ0V4dGVuZGVyKFRJRkZFeHRlbmRQcm9jKTsKK2V4dGVybiB1aW50MzIgVElGRkNvbXB1dGVUaWxlKFRJRkYqIHRpZiwgdWludDMyIHgsIHVpbnQzMiB5LCB1aW50MzIgeiwgdWludDE2IHMpOworZXh0ZXJuIGludCBUSUZGQ2hlY2tUaWxlKFRJRkYqIHRpZiwgdWludDMyIHgsIHVpbnQzMiB5LCB1aW50MzIgeiwgdWludDE2IHMpOworZXh0ZXJuIHVpbnQzMiBUSUZGTnVtYmVyT2ZUaWxlcyhUSUZGKik7CitleHRlcm4gdG1zaXplX3QgVElGRlJlYWRUaWxlKFRJRkYqIHRpZiwgdm9pZCogYnVmLCB1aW50MzIgeCwgdWludDMyIHksIHVpbnQzMiB6LCB1aW50MTYgcyk7ICAKK2V4dGVybiB0bXNpemVfdCBUSUZGV3JpdGVUaWxlKFRJRkYqIHRpZiwgdm9pZCogYnVmLCB1aW50MzIgeCwgdWludDMyIHksIHVpbnQzMiB6LCB1aW50MTYgcyk7CitleHRlcm4gdWludDMyIFRJRkZDb21wdXRlU3RyaXAoVElGRiosIHVpbnQzMiwgdWludDE2KTsKK2V4dGVybiB1aW50MzIgVElGRk51bWJlck9mU3RyaXBzKFRJRkYqKTsKK2V4dGVybiB0bXNpemVfdCBUSUZGUmVhZEVuY29kZWRTdHJpcChUSUZGKiB0aWYsIHVpbnQzMiBzdHJpcCwgdm9pZCogYnVmLCB0bXNpemVfdCBzaXplKTsKK2V4dGVybiB0bXNpemVfdCBUSUZGUmVhZFJhd1N0cmlwKFRJRkYqIHRpZiwgdWludDMyIHN0cmlwLCB2b2lkKiBidWYsIHRtc2l6ZV90IHNpemUpOyAgCitleHRlcm4gdG1zaXplX3QgVElGRlJlYWRFbmNvZGVkVGlsZShUSUZGKiB0aWYsIHVpbnQzMiB0aWxlLCB2b2lkKiBidWYsIHRtc2l6ZV90IHNpemUpOyAgCitleHRlcm4gdG1zaXplX3QgVElGRlJlYWRSYXdUaWxlKFRJRkYqIHRpZiwgdWludDMyIHRpbGUsIHZvaWQqIGJ1ZiwgdG1zaXplX3Qgc2l6ZSk7ICAKK2V4dGVybiB0bXNpemVfdCBUSUZGV3JpdGVFbmNvZGVkU3RyaXAoVElGRiogdGlmLCB1aW50MzIgc3RyaXAsIHZvaWQqIGRhdGEsIHRtc2l6ZV90IGNjKTsKK2V4dGVybiB0bXNpemVfdCBUSUZGV3JpdGVSYXdTdHJpcChUSUZGKiB0aWYsIHVpbnQzMiBzdHJpcCwgdm9pZCogZGF0YSwgdG1zaXplX3QgY2MpOyAgCitleHRlcm4gdG1zaXplX3QgVElGRldyaXRlRW5jb2RlZFRpbGUoVElGRiogdGlmLCB1aW50MzIgdGlsZSwgdm9pZCogZGF0YSwgdG1zaXplX3QgY2MpOyAgCitleHRlcm4gdG1zaXplX3QgVElGRldyaXRlUmF3VGlsZShUSUZGKiB0aWYsIHVpbnQzMiB0aWxlLCB2b2lkKiBkYXRhLCB0bXNpemVfdCBjYyk7ICAKK2V4dGVybiBpbnQgVElGRkRhdGFXaWR0aChUSUZGRGF0YVR5cGUpOyAgICAvKiB0YWJsZSBvZiB0YWcgZGF0YXR5cGUgd2lkdGhzICovCitleHRlcm4gdm9pZCBUSUZGU2V0V3JpdGVPZmZzZXQoVElGRiogdGlmLCB0b2ZmX3Qgb2ZmKTsKK2V4dGVybiB2b2lkIFRJRkZTd2FiU2hvcnQodWludDE2Kik7CitleHRlcm4gdm9pZCBUSUZGU3dhYkxvbmcodWludDMyKik7CitleHRlcm4gdm9pZCBUSUZGU3dhYkxvbmc4KHVpbnQ2NCopOworZXh0ZXJuIHZvaWQgVElGRlN3YWJGbG9hdChmbG9hdCopOworZXh0ZXJuIHZvaWQgVElGRlN3YWJEb3VibGUoZG91YmxlKik7CitleHRlcm4gdm9pZCBUSUZGU3dhYkFycmF5T2ZTaG9ydCh1aW50MTYqIHdwLCB0bXNpemVfdCBuKTsKK2V4dGVybiB2b2lkIFRJRkZTd2FiQXJyYXlPZlRyaXBsZXModWludDgqIHRwLCB0bXNpemVfdCBuKTsKK2V4dGVybiB2b2lkIFRJRkZTd2FiQXJyYXlPZkxvbmcodWludDMyKiBscCwgdG1zaXplX3Qgbik7CitleHRlcm4gdm9pZCBUSUZGU3dhYkFycmF5T2ZMb25nOCh1aW50NjQqIGxwLCB0bXNpemVfdCBuKTsKK2V4dGVybiB2b2lkIFRJRkZTd2FiQXJyYXlPZkZsb2F0KGZsb2F0KiBmcCwgdG1zaXplX3Qgbik7CitleHRlcm4gdm9pZCBUSUZGU3dhYkFycmF5T2ZEb3VibGUoZG91YmxlKiBkcCwgdG1zaXplX3Qgbik7CitleHRlcm4gdm9pZCBUSUZGUmV2ZXJzZUJpdHModWludDgqIGNwLCB0bXNpemVfdCBuKTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyKiBUSUZGR2V0Qml0UmV2VGFibGUoaW50KTsKKworI2lmZGVmIExPR0xVVl9QVUJMSUMKKyNkZWZpbmUgVV9ORVUJCTAuMjEwNTI2MzE2CisjZGVmaW5lIFZfTkVVCQkwLjQ3MzY4NDIxMQorI2RlZmluZSBVVlNDQUxFCQk0MTAuCitleHRlcm4gZG91YmxlIExvZ0wxNnRvWShpbnQpOworZXh0ZXJuIGRvdWJsZSBMb2dMMTB0b1koaW50KTsKK2V4dGVybiB2b2lkIFhZWnRvUkdCMjQoZmxvYXQqLCB1aW50OCopOworZXh0ZXJuIGludCB1dl9kZWNvZGUoZG91YmxlKiwgZG91YmxlKiwgaW50KTsKK2V4dGVybiB2b2lkIExvZ0x1djI0dG9YWVoodWludDMyLCBmbG9hdCopOworZXh0ZXJuIHZvaWQgTG9nTHV2MzJ0b1hZWih1aW50MzIsIGZsb2F0Kik7CisjaWYgZGVmaW5lZChjX3BsdXNwbHVzKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuIGludCBMb2dMMTZmcm9tWShkb3VibGUsIGludCA9IFNHSUxPR0VOQ09ERV9OT0RJVEhFUik7CitleHRlcm4gaW50IExvZ0wxMGZyb21ZKGRvdWJsZSwgaW50ID0gU0dJTE9HRU5DT0RFX05PRElUSEVSKTsKK2V4dGVybiBpbnQgdXZfZW5jb2RlKGRvdWJsZSwgZG91YmxlLCBpbnQgPSBTR0lMT0dFTkNPREVfTk9ESVRIRVIpOworZXh0ZXJuIHVpbnQzMiBMb2dMdXYyNGZyb21YWVooZmxvYXQqLCBpbnQgPSBTR0lMT0dFTkNPREVfTk9ESVRIRVIpOworZXh0ZXJuIHVpbnQzMiBMb2dMdXYzMmZyb21YWVooZmxvYXQqLCBpbnQgPSBTR0lMT0dFTkNPREVfTk9ESVRIRVIpOworI2Vsc2UKK2V4dGVybiBpbnQgTG9nTDE2ZnJvbVkoZG91YmxlLCBpbnQpOworZXh0ZXJuIGludCBMb2dMMTBmcm9tWShkb3VibGUsIGludCk7CitleHRlcm4gaW50IHV2X2VuY29kZShkb3VibGUsIGRvdWJsZSwgaW50KTsKK2V4dGVybiB1aW50MzIgTG9nTHV2MjRmcm9tWFlaKGZsb2F0KiwgaW50KTsKK2V4dGVybiB1aW50MzIgTG9nTHV2MzJmcm9tWFlaKGZsb2F0KiwgaW50KTsKKyNlbmRpZgorI2VuZGlmIC8qIExPR0xVVl9QVUJMSUMgKi8KKworZXh0ZXJuIGludCBUSUZGQ0lFTGFiVG9SR0JJbml0KFRJRkZDSUVMYWJUb1JHQiosIGNvbnN0IFRJRkZEaXNwbGF5ICosIGZsb2F0Kik7CitleHRlcm4gdm9pZCBUSUZGQ0lFTGFiVG9YWVooVElGRkNJRUxhYlRvUkdCICosIHVpbnQzMiwgaW50MzIsIGludDMyLAorICAgIGZsb2F0ICosIGZsb2F0ICosIGZsb2F0ICopOworZXh0ZXJuIHZvaWQgVElGRlhZWlRvUkdCKFRJRkZDSUVMYWJUb1JHQiAqLCBmbG9hdCwgZmxvYXQsIGZsb2F0LAorICAgIHVpbnQzMiAqLCB1aW50MzIgKiwgdWludDMyICopOworCitleHRlcm4gaW50IFRJRkZZQ2JDclRvUkdCSW5pdChUSUZGWUNiQ3JUb1JHQiosIGZsb2F0KiwgZmxvYXQqKTsKK2V4dGVybiB2b2lkIFRJRkZZQ2JDcnRvUkdCKFRJRkZZQ2JDclRvUkdCICosIHVpbnQzMiwgaW50MzIsIGludDMyLAorICAgIHVpbnQzMiAqLCB1aW50MzIgKiwgdWludDMyICopOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICBPIEIgUyBPIEwgRSBUIEUgRCAgICBJIE4gVCBFIFIgRiBBIEMgRSBTCisgKgorICogRG9uJ3QgdXNlIHRoaXMgc3R1ZmYgaW4geW91ciBhcHBsaWNhdGlvbnMsIGl0IG1heSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUKKyAqIGxpYnRpZmYgdmVyc2lvbnMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYJc3RydWN0IHsKKwl0dGFnX3QJZmllbGRfdGFnOwkJLyogZmllbGQncyB0YWcgKi8KKwlzaG9ydAlmaWVsZF9yZWFkY291bnQ7CS8qIHJlYWQgY291bnQvVElGRl9WQVJJQUJMRS9USUZGX1NQUCAqLworCXNob3J0CWZpZWxkX3dyaXRlY291bnQ7CS8qIHdyaXRlIGNvdW50L1RJRkZfVkFSSUFCTEUgKi8KKwlUSUZGRGF0YVR5cGUgZmllbGRfdHlwZTsJLyogdHlwZSBvZiBhc3NvY2lhdGVkIGRhdGEgKi8KKyAgICAgICAgdW5zaWduZWQgc2hvcnQgZmllbGRfYml0OwkvKiBiaXQgaW4gZmllbGRzc2V0IGJpdCB2ZWN0b3IgKi8KKwl1bnNpZ25lZCBjaGFyIGZpZWxkX29rdG9jaGFuZ2U7CS8qIGlmIHRydWUsIGNhbiBjaGFuZ2Ugd2hpbGUgd3JpdGluZyAqLworCXVuc2lnbmVkIGNoYXIgZmllbGRfcGFzc2NvdW50OwkvKiBpZiB0cnVlLCBwYXNzIGRpciBjb3VudCBvbiBzZXQgKi8KKwljaGFyCSpmaWVsZF9uYW1lOwkJLyogQVNDSUkgbmFtZSAqLworfSBUSUZGRmllbGRJbmZvOworCitleHRlcm4gaW50IFRJRkZNZXJnZUZpZWxkSW5mbyhUSUZGKiwgY29uc3QgVElGRkZpZWxkSW5mb1tdLCB1aW50MzIpOworICAgICAgICAKKyNpZiBkZWZpbmVkKGNfcGx1c3BsdXMpIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9USUZGSU9fICovCisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTggc3c9OCBub2V0OiAqLworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZmaW9wLmggYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmZpb3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGIyZWE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZmaW9wLmgKQEAgLTAsMCArMSw0MTkgQEAKKy8qICRJZDogdGlmZmlvcC5oLHYgMS44NyAyMDE1LTA4LTIzIDE3OjQ5OjAxIGJmcmllc2VuIEV4cCAkICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgorICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCAoaSkgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2VzIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICogYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiwgYW5kIChpaSkgdGhlIG5hbWVzIG9mCisgKiBTYW0gTGVmZmxlciBhbmQgU2lsaWNvbiBHcmFwaGljcyBtYXkgbm90IGJlIHVzZWQgaW4gYW55IGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcmVsYXRpbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgdGhlIHNwZWNpZmljLCBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uIG9mIFNhbSBMZWZmbGVyIGFuZCBTaWxpY29uIEdyYXBoaWNzLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgCisgKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIAorICogV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiAKKyAqIElOIE5PIEVWRU5UIFNIQUxMIFNBTSBMRUZGTEVSIE9SIFNJTElDT04gR1JBUEhJQ1MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgS0lORCwKKyAqIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyAqIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIERBTUFHRSwgQU5EIE9OIEFOWSBUSEVPUlkgT0YgCisgKiBMSUFCSUxJVFksIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIAorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9USUZGSU9QXworI2RlZmluZQlfVElGRklPUF8KKy8qCisgKiBgYExpYnJhcnktcHJpdmF0ZScnIGRlZmluaXRpb25zLgorICovCisKKyNpbmNsdWRlICJ0aWZmY29uZi5oIgorCisjaWZkZWYgSEFWRV9GQ05UTF9ICisjIGluY2x1ZGUgPGZjbnRsLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQVNTRVJUX0gKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZWxzZQorIyBkZWZpbmUgYXNzZXJ0KHgpIAorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NFQVJDSF9ICisjIGluY2x1ZGUgPHNlYXJjaC5oPgorI2Vsc2UKK2V4dGVybiB2b2lkICpsZmluZChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90ICosIHNpemVfdCwKKwkJICAgaW50ICgqKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChIQVZFX1NOUFJJTlRGKSAmJiAhZGVmaW5lZChIQVZFX19TTlBSSU5URikKKyN1bmRlZiBzbnByaW50ZgorI2RlZmluZSBzbnByaW50ZiBGWFNZU19zbnByaW50ZgorI2VuZGlmCisKKyNpbmNsdWRlICJ0aWZmaW8uaCIKKworI2luY2x1ZGUgInRpZl9kaXIuaCIKKworI2lmbmRlZiBTVFJJUF9TSVpFX0RFRkFVTFQKKyMgZGVmaW5lIFNUUklQX1NJWkVfREVGQVVMVCA4MTkyCisjZW5kaWYKKworI2RlZmluZSAgICBzdHJlcShhLGIpICAgICAgKHN0cmNtcChhLGIpID09IDApCisKKyNpZm5kZWYgVFJVRQorI2RlZmluZQlUUlVFCTEKKyNkZWZpbmUJRkFMU0UJMAorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IGNsaWVudF9pbmZvIHsKKyAgICBzdHJ1Y3QgY2xpZW50X2luZm8gKm5leHQ7CisgICAgdm9pZCAqZGF0YTsKKyAgICBjaGFyICpuYW1lOworfSBUSUZGQ2xpZW50SW5mb0xpbms7CisKKy8qCisgKiBUeXBlZGVmcyBmb3IgYGBtZXRob2QgcG9pbnRlcnMnJyB1c2VkIGludGVybmFsbHkuCisgKiB0aGVzZSBhcmUgZGVwcmljaWF0ZWQgYW5kIHByb3ZpZGVkIG9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciB0aWRhdGF2YWxfdDsgICAgLyogaW50ZXJuYWwgaW1hZ2UgZGF0YSB2YWx1ZSB0eXBlICovCit0eXBlZGVmIHRpZGF0YXZhbF90KiB0aWRhdGFfdDsgICAgICAgIC8qIHJlZmVyZW5jZSB0byBpbnRlcm5hbCBpbWFnZSBkYXRhICovCisKK3R5cGVkZWYgdm9pZCAoKlRJRkZWb2lkTWV0aG9kKShUSUZGKik7Cit0eXBlZGVmIGludCAoKlRJRkZCb29sTWV0aG9kKShUSUZGKik7Cit0eXBlZGVmIGludCAoKlRJRkZQcmVNZXRob2QpKFRJRkYqLCB1aW50MTYpOwordHlwZWRlZiBpbnQgKCpUSUZGQ29kZU1ldGhvZCkoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBzaXplLCB1aW50MTYgc2FtcGxlKTsKK3R5cGVkZWYgaW50ICgqVElGRlNlZWtNZXRob2QpKFRJRkYqLCB1aW50MzIpOwordHlwZWRlZiB2b2lkICgqVElGRlBvc3RNZXRob2QpKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3Qgc2l6ZSk7Cit0eXBlZGVmIHVpbnQzMiAoKlRJRkZTdHJpcE1ldGhvZCkoVElGRiosIHVpbnQzMik7Cit0eXBlZGVmIHZvaWQgKCpUSUZGVGlsZU1ldGhvZCkoVElGRiosIHVpbnQzMiosIHVpbnQzMiopOworCitzdHJ1Y3QgdGlmZiB7CisJY2hhciogICAgICAgICAgICAgICAgdGlmX25hbWU7ICAgICAgICAgLyogbmFtZSBvZiBvcGVuIGZpbGUgKi8KKwlpbnQgICAgICAgICAgICAgICAgICB0aWZfZmQ7ICAgICAgICAgICAvKiBvcGVuIGZpbGUgZGVzY3JpcHRvciAqLworCWludCAgICAgICAgICAgICAgICAgIHRpZl9tb2RlOyAgICAgICAgIC8qIG9wZW4gbW9kZSAoT18qKSAqLworCXVpbnQzMiAgICAgICAgICAgICAgIHRpZl9mbGFnczsKKwkjZGVmaW5lIFRJRkZfRklMTE9SREVSICAgMHgwMDAwMyAvKiBuYXR1cmFsIGJpdCBmaWxsIG9yZGVyIGZvciBtYWNoaW5lICovCisJI2RlZmluZSBUSUZGX0RJUlRZSEVBREVSIDB4MDAwMDQgLyogaGVhZGVyIG11c3QgYmUgd3JpdHRlbiBvbiBjbG9zZSAqLworCSNkZWZpbmUgVElGRl9ESVJUWURJUkVDVCAweDAwMDA4IC8qIGN1cnJlbnQgZGlyZWN0b3J5IG11c3QgYmUgd3JpdHRlbiAqLworCSNkZWZpbmUgVElGRl9CVUZGRVJTRVRVUCAweDAwMDEwIC8qIGRhdGEgYnVmZmVycyBzZXR1cCAqLworCSNkZWZpbmUgVElGRl9DT0RFUlNFVFVQICAweDAwMDIwIC8qIGVuY29kZXIvZGVjb2RlciBzZXR1cCBkb25lICovCisJI2RlZmluZSBUSUZGX0JFRU5XUklUSU5HIDB4MDAwNDAgLyogd3JpdHRlbiAxKyBzY2FubGluZXMgdG8gZmlsZSAqLworCSNkZWZpbmUgVElGRl9TV0FCICAgICAgICAweDAwMDgwIC8qIGJ5dGUgc3dhcCBmaWxlIGluZm9ybWF0aW9uICovCisJI2RlZmluZSBUSUZGX05PQklUUkVWICAgIDB4MDAxMDAgLyogaW5oaWJpdCBiaXQgcmV2ZXJzYWwgbG9naWMgKi8KKwkjZGVmaW5lIFRJRkZfTVlCVUZGRVIgICAgMHgwMDIwMCAvKiBteSByYXcgZGF0YSBidWZmZXI7IGZyZWUgb24gY2xvc2UgKi8KKwkjZGVmaW5lIFRJRkZfSVNUSUxFRCAgICAgMHgwMDQwMCAvKiBmaWxlIGlzIHRpbGUsIG5vdCBzdHJpcC0gYmFzZWQgKi8KKwkjZGVmaW5lIFRJRkZfTUFQUEVEICAgICAgMHgwMDgwMCAvKiBmaWxlIGlzIG1hcHBlZCBpbnRvIG1lbW9yeSAqLworCSNkZWZpbmUgVElGRl9QT1NURU5DT0RFICAweDAxMDAwIC8qIG5lZWQgY2FsbCB0byBwb3N0ZW5jb2RlIHJvdXRpbmUgKi8KKwkjZGVmaW5lIFRJRkZfSU5TVUJJRkQgICAgMHgwMjAwMCAvKiBjdXJyZW50bHkgd3JpdGluZyBhIHN1YmlmZCAqLworCSNkZWZpbmUgVElGRl9VUFNBTVBMRUQgICAweDA0MDAwIC8qIGxpYnJhcnkgaXMgZG9pbmcgZGF0YSB1cC1zYW1wbGluZyAqLworCSNkZWZpbmUgVElGRl9TVFJJUENIT1AgICAweDA4MDAwIC8qIGVuYWJsZSBzdHJpcCBjaG9wcGluZyBzdXBwb3J0ICovCisJI2RlZmluZSBUSUZGX0hFQURFUk9OTFkgIDB4MTAwMDAgLyogcmVhZCBoZWFkZXIgb25seSwgZG8gbm90IHByb2Nlc3MgdGhlIGZpcnN0IGRpcmVjdG9yeSAqLworCSNkZWZpbmUgVElGRl9OT1JFQURSQVcgICAweDIwMDAwIC8qIHNraXAgcmVhZGluZyBvZiByYXcgdW5jb21wcmVzc2VkIGltYWdlIGRhdGEgKi8KKwkjZGVmaW5lIFRJRkZfSU5DVVNUT01JRkQgMHg0MDAwMCAvKiBjdXJyZW50bHkgd3JpdGluZyBhIGN1c3RvbSBJRkQgKi8KKwkjZGVmaW5lIFRJRkZfQklHVElGRiAgICAgMHg4MDAwMCAvKiByZWFkL3dyaXRlIGJpZ3RpZmYgKi8KKyAgICAgICAgI2RlZmluZSBUSUZGX0JVRjRXUklURSAgMHgxMDAwMDAgLyogcmF3Y2MgYnl0ZXMgYXJlIGZvciB3cml0aW5nICovCisgICAgICAgICNkZWZpbmUgVElGRl9ESVJUWVNUUklQIDB4MjAwMDAwIC8qIHN0cmlwb2Zmc2V0cy9zdHJpcGJ5dGVjb3VudCBkaXJ0eSovCisgICAgICAgICNkZWZpbmUgVElGRl9QRVJTQU1QTEUgIDB4NDAwMDAwIC8qIGdldC9zZXQgcGVyIHNhbXBsZSB0YWdzIGFzIGFycmF5cyAqLworICAgICAgICAjZGVmaW5lIFRJRkZfQlVGRkVSTU1BUCAweDgwMDAwMCAvKiByZWFkIGJ1ZmZlciAodGlmX3Jhd2RhdGEpIHBvaW50cyBpbnRvIG1tYXAoKSBtZW1vcnkgKi8KKwl1aW50NjQgICAgICAgICAgICAgICB0aWZfZGlyb2ZmOyAgICAgICAvKiBmaWxlIG9mZnNldCBvZiBjdXJyZW50IGRpcmVjdG9yeSAqLworCXVpbnQ2NCAgICAgICAgICAgICAgIHRpZl9uZXh0ZGlyb2ZmOyAgIC8qIGZpbGUgb2Zmc2V0IG9mIGZvbGxvd2luZyBkaXJlY3RvcnkgKi8KKwl1aW50NjQqICAgICAgICAgICAgICB0aWZfZGlybGlzdDsgICAgICAvKiBsaXN0IG9mIG9mZnNldHMgdG8gYWxyZWFkeSBzZWVuIGRpcmVjdG9yaWVzIHRvIHByZXZlbnQgSUZEIGxvb3BpbmcgKi8KKwl1aW50MTYgICAgICAgICAgICAgICB0aWZfZGlybGlzdHNpemU7ICAvKiBudW1iZXIgb2YgZW50aXJlcyBpbiBvZmZzZXQgbGlzdCAqLworCXVpbnQxNiAgICAgICAgICAgICAgIHRpZl9kaXJudW1iZXI7ICAgIC8qIG51bWJlciBvZiBhbHJlYWR5IHNlZW4gZGlyZWN0b3JpZXMgKi8KKwlUSUZGRGlyZWN0b3J5ICAgICAgICB0aWZfZGlyOyAgICAgICAgICAvKiBpbnRlcm5hbCByZXAgb2YgY3VycmVudCBkaXJlY3RvcnkgKi8KKwlUSUZGRGlyZWN0b3J5ICAgICAgICB0aWZfY3VzdG9tZGlyOyAgICAvKiBjdXN0b20gSUZEcyBhcmUgc2VwYXJhdGVkIGZyb20gdGhlIG1haW4gb25lcyAqLworCXVuaW9uIHsKKwkJVElGRkhlYWRlckNvbW1vbiBjb21tb247CisJCVRJRkZIZWFkZXJDbGFzc2ljIGNsYXNzaWM7CisJCVRJRkZIZWFkZXJCaWcgYmlnOworCX0gdGlmX2hlYWRlcjsKKwl1aW50MTYgICAgICAgICAgICAgICB0aWZfaGVhZGVyX3NpemU7ICAvKiBmaWxlJ3MgaGVhZGVyIGJsb2NrIGFuZCBpdHMgbGVuZ3RoICovCisJdWludDMyICAgICAgICAgICAgICAgdGlmX3JvdzsgICAgICAgICAgLyogY3VycmVudCBzY2FubGluZSAqLworCXVpbnQxNiAgICAgICAgICAgICAgIHRpZl9jdXJkaXI7ICAgICAgIC8qIGN1cnJlbnQgZGlyZWN0b3J5IChpbmRleCkgKi8KKwl1aW50MzIgICAgICAgICAgICAgICB0aWZfY3Vyc3RyaXA7ICAgICAvKiBjdXJyZW50IHN0cmlwIGZvciByZWFkL3dyaXRlICovCisJdWludDY0ICAgICAgICAgICAgICAgdGlmX2N1cm9mZjsgICAgICAgLyogY3VycmVudCBvZmZzZXQgZm9yIHJlYWQvd3JpdGUgKi8KKwl1aW50NjQgICAgICAgICAgICAgICB0aWZfZGF0YW9mZjsgICAgICAvKiBjdXJyZW50IG9mZnNldCBmb3Igd3JpdGluZyBkaXIgKi8KKwkvKiBTdWJJRkQgc3VwcG9ydCAqLworCXVpbnQxNiAgICAgICAgICAgICAgIHRpZl9uc3ViaWZkOyAgICAgIC8qIHJlbWFpbmluZyBzdWJpZmRzIHRvIHdyaXRlICovCisJdWludDY0ICAgICAgICAgICAgICAgdGlmX3N1YmlmZG9mZjsgICAgLyogb2Zmc2V0IGZvciBwYXRjaGluZyBTdWJJRkQgbGluayAqLworCS8qIHRpbGluZyBzdXBwb3J0ICovCisJdWludDMyICAgICAgICAgICAgICAgdGlmX2NvbDsgICAgICAgICAgLyogY3VycmVudCBjb2x1bW4gKG9mZnNldCBieSByb3cgdG9vKSAqLworCXVpbnQzMiAgICAgICAgICAgICAgIHRpZl9jdXJ0aWxlOyAgICAgIC8qIGN1cnJlbnQgdGlsZSBmb3IgcmVhZC93cml0ZSAqLworCXRtc2l6ZV90ICAgICAgICAgICAgIHRpZl90aWxlc2l6ZTsgICAgIC8qICMgb2YgYnl0ZXMgaW4gYSB0aWxlICovCisJLyogY29tcHJlc3Npb24gc2NoZW1lIGhvb2tzICovCisJaW50ICAgICAgICAgICAgICAgICAgdGlmX2RlY29kZXN0YXR1czsKKwlUSUZGQm9vbE1ldGhvZCAgICAgICB0aWZfZml4dXB0YWdzOyAgICAvKiBjYWxsZWQgaW4gVElGRlJlYWREaXJlY3RvcnkgKi8KKwlUSUZGQm9vbE1ldGhvZCAgICAgICB0aWZfc2V0dXBkZWNvZGU7ICAvKiBjYWxsZWQgb25jZSBiZWZvcmUgcHJlZGVjb2RlICovCisJVElGRlByZU1ldGhvZCAgICAgICAgdGlmX3ByZWRlY29kZTsgICAgLyogcHJlLSByb3cvc3RyaXAvdGlsZSBkZWNvZGluZyAqLworCVRJRkZCb29sTWV0aG9kICAgICAgIHRpZl9zZXR1cGVuY29kZTsgIC8qIGNhbGxlZCBvbmNlIGJlZm9yZSBwcmVlbmNvZGUgKi8KKwlpbnQgICAgICAgICAgICAgICAgICB0aWZfZW5jb2Rlc3RhdHVzOworCVRJRkZQcmVNZXRob2QgICAgICAgIHRpZl9wcmVlbmNvZGU7ICAgIC8qIHByZS0gcm93L3N0cmlwL3RpbGUgZW5jb2RpbmcgKi8KKwlUSUZGQm9vbE1ldGhvZCAgICAgICB0aWZfcG9zdGVuY29kZTsgICAvKiBwb3N0LSByb3cvc3RyaXAvdGlsZSBlbmNvZGluZyAqLworCVRJRkZDb2RlTWV0aG9kICAgICAgIHRpZl9kZWNvZGVyb3c7ICAgIC8qIHNjYW5saW5lIGRlY29kaW5nIHJvdXRpbmUgKi8KKwlUSUZGQ29kZU1ldGhvZCAgICAgICB0aWZfZW5jb2Rlcm93OyAgICAvKiBzY2FubGluZSBlbmNvZGluZyByb3V0aW5lICovCisJVElGRkNvZGVNZXRob2QgICAgICAgdGlmX2RlY29kZXN0cmlwOyAgLyogc3RyaXAgZGVjb2Rpbmcgcm91dGluZSAqLworCVRJRkZDb2RlTWV0aG9kICAgICAgIHRpZl9lbmNvZGVzdHJpcDsgIC8qIHN0cmlwIGVuY29kaW5nIHJvdXRpbmUgKi8KKwlUSUZGQ29kZU1ldGhvZCAgICAgICB0aWZfZGVjb2RldGlsZTsgICAvKiB0aWxlIGRlY29kaW5nIHJvdXRpbmUgKi8KKwlUSUZGQ29kZU1ldGhvZCAgICAgICB0aWZfZW5jb2RldGlsZTsgICAvKiB0aWxlIGVuY29kaW5nIHJvdXRpbmUgKi8KKwlUSUZGVm9pZE1ldGhvZCAgICAgICB0aWZfY2xvc2U7ICAgICAgICAvKiBjbGVhbnVwLW9uLWNsb3NlIHJvdXRpbmUgKi8KKwlUSUZGU2Vla01ldGhvZCAgICAgICB0aWZfc2VlazsgICAgICAgICAvKiBwb3NpdGlvbiB3aXRoaW4gYSBzdHJpcCByb3V0aW5lICovCisJVElGRlZvaWRNZXRob2QgICAgICAgdGlmX2NsZWFudXA7ICAgICAgLyogY2xlYW51cCBzdGF0ZSByb3V0aW5lICovCisJVElGRlN0cmlwTWV0aG9kICAgICAgdGlmX2RlZnN0cmlwc2l6ZTsgLyogY2FsY3VsYXRlL2NvbnN0cmFpbiBzdHJpcCBzaXplICovCisJVElGRlRpbGVNZXRob2QgICAgICAgdGlmX2RlZnRpbGVzaXplOyAgLyogY2FsY3VsYXRlL2NvbnN0cmFpbiB0aWxlIHNpemUgKi8KKwl1aW50OCogICAgICAgICAgICAgICB0aWZfZGF0YTsgICAgICAgICAvKiBjb21wcmVzc2lvbiBzY2hlbWUgcHJpdmF0ZSBkYXRhICovCisJLyogaW5wdXQvb3V0cHV0IGJ1ZmZlcmluZyAqLworCXRtc2l6ZV90ICAgICAgICAgICAgIHRpZl9zY2FubGluZXNpemU7IC8qICMgb2YgYnl0ZXMgaW4gYSBzY2FubGluZSAqLworCXRtc2l6ZV90ICAgICAgICAgICAgIHRpZl9zY2FubGluZXNrZXc7IC8qIHNjYW5saW5lIHNrZXcgZm9yIHJlYWRpbmcgc3RyaXBzICovCisJdWludDgqICAgICAgICAgICAgICAgdGlmX3Jhd2RhdGE7ICAgICAgLyogcmF3IGRhdGEgYnVmZmVyICovCisJdG1zaXplX3QgICAgICAgICAgICAgdGlmX3Jhd2RhdGFzaXplOyAgLyogIyBvZiBieXRlcyBpbiByYXcgZGF0YSBidWZmZXIgKi8KKyAgICAgICAgdG1zaXplX3QgICAgICAgICAgICAgdGlmX3Jhd2RhdGFvZmY7ICAgLyogcmF3ZGF0YSBvZmZzZXQgd2l0aGluIHN0cmlwICovCisgICAgICAgIHRtc2l6ZV90ICAgICAgICAgICAgIHRpZl9yYXdkYXRhbG9hZGVkOy8qIGFtb3VudCBvZiBkYXRhIGluIHJhd2RhdGEgKi8KKwl1aW50OCogICAgICAgICAgICAgICB0aWZfcmF3Y3A7ICAgICAgICAvKiBjdXJyZW50IHNwb3QgaW4gcmF3IGJ1ZmZlciAqLworCXRtc2l6ZV90ICAgICAgICAgICAgIHRpZl9yYXdjYzsgICAgICAgIC8qIGJ5dGVzIHVucmVhZCBmcm9tIHJhdyBidWZmZXIgKi8KKwkvKiBtZW1vcnktbWFwcGVkIGZpbGUgc3VwcG9ydCAqLworCXVpbnQ4KiAgICAgICAgICAgICAgIHRpZl9iYXNlOyAgICAgICAgIC8qIGJhc2Ugb2YgbWFwcGVkIGZpbGUgKi8KKwl0bXNpemVfdCAgICAgICAgICAgICB0aWZfc2l6ZTsgICAgICAgICAvKiBzaXplIG9mIG1hcHBlZCBmaWxlIHJlZ2lvbiAoYnl0ZXMsIHRodXMgdG1zaXplX3QpICovCisJVElGRk1hcEZpbGVQcm9jICAgICAgdGlmX21hcHByb2M7ICAgICAgLyogbWFwIGZpbGUgbWV0aG9kICovCisJVElGRlVubWFwRmlsZVByb2MgICAgdGlmX3VubWFwcHJvYzsgICAgLyogdW5tYXAgZmlsZSBtZXRob2QgKi8KKwkvKiBpbnB1dC9vdXRwdXQgY2FsbGJhY2sgbWV0aG9kcyAqLworCXRoYW5kbGVfdCAgICAgICAgICAgIHRpZl9jbGllbnRkYXRhOyAgIC8qIGNhbGxiYWNrIHBhcmFtZXRlciAqLworCVRJRkZSZWFkV3JpdGVQcm9jICAgIHRpZl9yZWFkcHJvYzsgICAgIC8qIHJlYWQgbWV0aG9kICovCisJVElGRlJlYWRXcml0ZVByb2MgICAgdGlmX3dyaXRlcHJvYzsgICAgLyogd3JpdGUgbWV0aG9kICovCisJVElGRlNlZWtQcm9jICAgICAgICAgdGlmX3NlZWtwcm9jOyAgICAgLyogbHNlZWsgbWV0aG9kICovCisJVElGRkNsb3NlUHJvYyAgICAgICAgdGlmX2Nsb3NlcHJvYzsgICAgLyogY2xvc2UgbWV0aG9kICovCisJVElGRlNpemVQcm9jICAgICAgICAgdGlmX3NpemVwcm9jOyAgICAgLyogZmlsZXNpemUgbWV0aG9kICovCisJLyogcG9zdC1kZWNvZGluZyBzdXBwb3J0ICovCisJVElGRlBvc3RNZXRob2QgICAgICAgdGlmX3Bvc3RkZWNvZGU7ICAgLyogcG9zdCBkZWNvZGluZyByb3V0aW5lICovCisJLyogdGFnIHN1cHBvcnQgKi8KKwlUSUZGRmllbGQqKiAgICAgICAgICB0aWZfZmllbGRzOyAgICAgICAvKiBzb3J0ZWQgdGFibGUgb2YgcmVnaXN0ZXJlZCB0YWdzICovCisJc2l6ZV90ICAgICAgICAgICAgICAgdGlmX25maWVsZHM7ICAgICAgLyogIyBlbnRyaWVzIGluIHJlZ2lzdGVyZWQgdGFnIHRhYmxlICovCisJY29uc3QgVElGRkZpZWxkKiAgICAgdGlmX2ZvdW5kZmllbGQ7ICAgLyogY2FjaGVkIHBvaW50ZXIgdG8gYWxyZWFkeSBmb3VuZCB0YWcgKi8KKwlUSUZGVGFnTWV0aG9kcyAgICAgICB0aWZfdGFnbWV0aG9kczsgICAvKiB0YWcgZ2V0L3NldC9wcmludCByb3V0aW5lcyAqLworCVRJRkZDbGllbnRJbmZvTGluayogIHRpZl9jbGllbnRpbmZvOyAgIC8qIGV4dHJhIGNsaWVudCBpbmZvcm1hdGlvbi4gKi8KKwkvKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IHN0dWZmLiBXZSBuZWVkIHRoZXNlIHR3byBmaWVsZHMgZm9yCisJICogc2V0dGluZyB1cCBhbiBvbGQgdGFnIGV4dGVuc2lvbiBzY2hlbWUuICovCisJVElGRkZpZWxkQXJyYXkqICAgICAgdGlmX2ZpZWxkc2NvbXBhdDsKKwlzaXplX3QgICAgICAgICAgICAgICB0aWZfbmZpZWxkc2NvbXBhdDsKK307CisKKyNkZWZpbmUgaXNQc2V1ZG9UYWcodCkgKHQgPiAweGZmZmYpICAgICAgICAgICAgLyogaXMgdGFnIHZhbHVlIG5vcm1hbCBvciBwc2V1ZG8gKi8KKworI2RlZmluZSBpc1RpbGVkKHRpZikgKCgodGlmKS0+dGlmX2ZsYWdzICYgVElGRl9JU1RJTEVEKSAhPSAwKQorI2RlZmluZSBpc01hcHBlZCh0aWYpICgoKHRpZiktPnRpZl9mbGFncyAmIFRJRkZfTUFQUEVEKSAhPSAwKQorI2RlZmluZSBpc0ZpbGxPcmRlcih0aWYsIG8pICgoKHRpZiktPnRpZl9mbGFncyAmIChvKSkgIT0gMCkKKyNkZWZpbmUgaXNVcFNhbXBsZWQodGlmKSAoKCh0aWYpLT50aWZfZmxhZ3MgJiBUSUZGX1VQU0FNUExFRCkgIT0gMCkKKyNkZWZpbmUgVElGRlJlYWRGaWxlKHRpZiwgYnVmLCBzaXplKSBcCisJKCgqKHRpZiktPnRpZl9yZWFkcHJvYykoKHRpZiktPnRpZl9jbGllbnRkYXRhLChidWYpLChzaXplKSkpCisjZGVmaW5lIFRJRkZXcml0ZUZpbGUodGlmLCBidWYsIHNpemUpIFwKKwkoKCoodGlmKS0+dGlmX3dyaXRlcHJvYykoKHRpZiktPnRpZl9jbGllbnRkYXRhLChidWYpLChzaXplKSkpCisjZGVmaW5lIFRJRkZTZWVrRmlsZSh0aWYsIG9mZiwgd2hlbmNlKSBcCisJKCgqKHRpZiktPnRpZl9zZWVrcHJvYykoKHRpZiktPnRpZl9jbGllbnRkYXRhLChvZmYpLCh3aGVuY2UpKSkKKyNkZWZpbmUgVElGRkNsb3NlRmlsZSh0aWYpIFwKKwkoKCoodGlmKS0+dGlmX2Nsb3NlcHJvYykoKHRpZiktPnRpZl9jbGllbnRkYXRhKSkKKyNkZWZpbmUgVElGRkdldEZpbGVTaXplKHRpZikgXAorCSgoKih0aWYpLT50aWZfc2l6ZXByb2MpKCh0aWYpLT50aWZfY2xpZW50ZGF0YSkpCisjZGVmaW5lIFRJRkZNYXBGaWxlQ29udGVudHModGlmLCBwYWRkciwgcHNpemUpIFwKKwkoKCoodGlmKS0+dGlmX21hcHByb2MpKCh0aWYpLT50aWZfY2xpZW50ZGF0YSwocGFkZHIpLChwc2l6ZSkpKQorI2RlZmluZSBUSUZGVW5tYXBGaWxlQ29udGVudHModGlmLCBhZGRyLCBzaXplKSBcCisJKCgqKHRpZiktPnRpZl91bm1hcHByb2MpKCh0aWYpLT50aWZfY2xpZW50ZGF0YSwoYWRkciksKHNpemUpKSkKKworLyoKKyAqIERlZmF1bHQgUmVhZC9TZWVrL1dyaXRlIGRlZmluaXRpb25zLgorICovCisjaWZuZGVmIFJlYWRPSworI2RlZmluZSBSZWFkT0sodGlmLCBidWYsIHNpemUpIFwKKwkoVElGRlJlYWRGaWxlKCh0aWYpLChidWYpLChzaXplKSk9PShzaXplKSkKKyNlbmRpZgorI2lmbmRlZiBTZWVrT0sKKyNkZWZpbmUgU2Vla09LKHRpZiwgb2ZmKSBcCisJKFRJRkZTZWVrRmlsZSgodGlmKSwob2ZmKSxTRUVLX1NFVCk9PShvZmYpKQorI2VuZGlmCisjaWZuZGVmIFdyaXRlT0sKKyNkZWZpbmUgV3JpdGVPSyh0aWYsIGJ1Ziwgc2l6ZSkgXAorCShUSUZGV3JpdGVGaWxlKCh0aWYpLChidWYpLChzaXplKSk9PShzaXplKSkKKyNlbmRpZgorCisvKiBOQjogdGhlIHVpbnQzMiBjYXN0cyBhcmUgdG8gc2lsZW5jZSBjZXJ0YWluIEFOU0ktQyBjb21waWxlcnMgKi8KKyNkZWZpbmUgVElGRmhvd21hbnlfMzIoeCwgeSkgKCgodWludDMyKXggPCAoMHhmZmZmZmZmZiAtICh1aW50MzIpKHktMSkpKSA/IFwKKwkJCSAgICgoKCh1aW50MzIpKHgpKSsoKCh1aW50MzIpKHkpKS0xKSkvKCh1aW50MzIpKHkpKSkgOiBcCisJCQkgICAwVSkKKyNkZWZpbmUgVElGRmhvd21hbnk4XzMyKHgpICgoKHgpJjB4MDcpPygodWludDMyKSh4KT4+MykrMToodWludDMyKSh4KT4+MykKKyNkZWZpbmUgVElGRnJvdW5kdXBfMzIoeCwgeSkgKFRJRkZob3dtYW55XzMyKHgseSkqKHkpKQorI2RlZmluZSBUSUZGaG93bWFueV82NCh4LCB5KSAoKCgodWludDY0KSh4KSkrKCgodWludDY0KSh5KSktMSkpLygodWludDY0KSh5KSkpCisjZGVmaW5lIFRJRkZob3dtYW55OF82NCh4KSAoKCh4KSYweDA3KT8oKHVpbnQ2NCkoeCk+PjMpKzE6KHVpbnQ2NCkoeCk+PjMpCisjZGVmaW5lIFRJRkZyb3VuZHVwXzY0KHgsIHkpIChUSUZGaG93bWFueV82NCh4LHkpKih5KSkKKworLyogU2FmZSBtdWx0aXBseSB3aGljaCByZXR1cm5zIHplcm8gaWYgdGhlcmUgaXMgYW4gaW50ZWdlciBvdmVyZmxvdyAqLworI2RlZmluZSBUSUZGU2FmZU11bHRpcGx5KHQsdixtKSAoKCgodCkobSkgIT0gKHQpMCkgJiYgKCgodCkoKCh2KSoobSkpLyhtKSkpID09ICh0KSh2KSkpID8gKHQpKCh2KSoobSkpIDogKHQpMCkKKworI2RlZmluZSBUSUZGbWF4KEEsQikgKChBKT4oQik/KEEpOihCKSkKKyNkZWZpbmUgVElGRm1pbihBLEIpICgoQSk8KEIpPyhBKTooQikpCisKKyNkZWZpbmUgVElGRkFycmF5Q291bnQoYSkgKHNpemVvZiAoYSkgLyBzaXplb2YgKChhKVswXSkpCisKKy8qCisgIFN1cHBvcnQgZm9yIGxhcmdlIGZpbGVzLgorCisgIFdpbmRvd3MgcmVhZC93cml0ZSBBUElzIHN1cHBvcnQgb25seSAndW5zaWduZWQgaW50JyByYXRoZXIgdGhhbiAnc2l6ZV90Jy4KKyAgV2luZG93cyBvZmZfdCBpcyBvbmx5IDMyLWJpdCwgZXZlbiBpbiA2NC1iaXQgYnVpbGRzLgorKi8KKyNpZiBkZWZpbmVkKEhBVkVfRlNFRUtPKQorLyoKKyAgVXNlIGZzZWVrbygpIGFuZCBmdGVsbG8oKSBpZiB0aGV5IGFyZSBhdmFpbGFibGUgc2luY2UgdGhleSB1c2UKKyAgJ29mZl90JyByYXRoZXIgdGhhbiAnbG9uZycuICBJdCBpcyB3cm9uZyB0byB1c2UgZnNlZWtvKCkgYW5kCisgIGZ0ZWxsbygpIG9ubHkgb24gc3lzdGVtcyB3aXRoIHNwZWNpYWwgTEZTIHN1cHBvcnQgc2luY2Ugc29tZSBzeXN0ZW1zCisgIChlLmcuIEZyZWVCU0QpIHN1cHBvcnQgYSA2NC1iaXQgb2ZmX3QgYnkgZGVmYXVsdC4KKworICBGb3IgTWluR1csIF9fTVNWQ1JUX1ZFUlNJT05fXyBtdXN0IGJlIGF0IGxlYXN0IDB4ODAwIHRvIGV4cG9zZSB0aGVzZQorICBpbnRlcmZhY2VzLiBUaGUgTWluR1cgY29tcGlsZXIgbXVzdCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgdmVyc2lvbi4gIE1pbkdXCisgIGRvZXMgbm90IGRpc3RyaWJ1dGUgdGhlIENSVCAoaXQgaXMgc3VwcGxpZWQgYnkgTWljcm9zb2Z0KSBzbyB0aGUgY29ycmVjdCBDUlQKKyAgbXVzdCBiZSBhdmFpbGFibGUgb24gdGhlIHRhcmdldCBjb21wdXRlciBpbiBvcmRlciBmb3IgdGhlIHByb2dyYW0gdG8gcnVuLgorKi8KKyNpZiBkZWZpbmVkKEhBVkVfRlNFRUtPKQorIyAgZGVmaW5lIGZzZWVrKHN0cmVhbSxvZmZzZXQsd2hlbmNlKSAgZnNlZWtvKHN0cmVhbSxvZmZzZXQsd2hlbmNlKQorIyAgZGVmaW5lIGZ0ZWxsKHN0cmVhbSxvZmZzZXQsd2hlbmNlKSAgZnRlbGxvKHN0cmVhbSxvZmZzZXQsd2hlbmNlKQorI2VuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgXAorICAgICAgICAhKGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSIDwgMTQwMCkgJiYgXAorICAgICAgICAhKGRlZmluZWQoX19NU1ZDUlRfVkVSU0lPTl9fKSAmJiBfX01TVkNSVF9WRVJTSU9OX18gPCAweDgwMCkKK3R5cGVkZWYgdW5zaWduZWQgaW50IFRJRkZJT1NpemVfdDsKKyNkZWZpbmUgX1RJRkZfbHNlZWtfZihmaWxkZXMsb2Zmc2V0LHdoZW5jZSkgIF9sc2Vla2k2NChmaWxkZXMsLyogX19pbnQ2NCAqLyBvZmZzZXQsd2hlbmNlKQorLyogI2RlZmluZSBfVElGRl90ZWxsX2YoZmlsZGVzKSAvXCogX19pbnQ2NCAqXC8gX3RlbGxpNjQoZmlsZGVzKSAqLworI2RlZmluZSBfVElGRl9mc2Vla19mKHN0cmVhbSxvZmZzZXQsd2hlbmNlKSBfZnNlZWtpNjQoc3RyZWFtLC8qIF9faW50NjQgKi8gb2Zmc2V0LHdoZW5jZSkKKyNkZWZpbmUgX1RJRkZfZnN0YXRfZihmaWxkZXMsc3RhdF9idWZmKSBfZnN0YXRpNjQoZmlsZGVzLC8qIHN0cnVjdCBfc3RhdGk2NCAqLyBzdGF0X2J1ZmYpCisvKiAjZGVmaW5lIF9USUZGX2Z0ZWxsX2Yoc3RyZWFtKSAvXCogX19pbnQ2NCAqXC8gX2Z0ZWxsaTY0KHN0cmVhbSkgKi8KKy8qICNkZWZpbmUgX1RJRkZfc3RhdF9mKHBhdGgsc3RhdF9idWZmKSBfc3RhdGk2NChwYXRoLC9cKiBzdHJ1Y3QgX3N0YXRpNjQgKlwvIHN0YXRfYnVmZikgKi8KKyNkZWZpbmUgX1RJRkZfc3RhdF9zIHN0cnVjdCBfc3RhdGk2NAorI2RlZmluZSBfVElGRl9vZmZfdCBfX2ludDY0CisjZWxzZQordHlwZWRlZiBzaXplX3QgVElGRklPU2l6ZV90OworI2RlZmluZSBfVElGRl9sc2Vla19mKGZpbGRlcyxvZmZzZXQsd2hlbmNlKSBsc2VlayhmaWxkZXMsb2Zmc2V0LHdoZW5jZSkKKy8qICNkZWZpbmUgX1RJRkZfdGVsbF9mKGZpbGRlcykgKF9USUZGX2xzZWVrX2YoZmlsZGVzLDAsU0VFS19DVVIpKSAqLworI2RlZmluZSBfVElGRl9mc2Vla19mKHN0cmVhbSxvZmZzZXQsd2hlbmNlKSBmc2VlayhzdHJlYW0sb2Zmc2V0LHdoZW5jZSkKKyNkZWZpbmUgX1RJRkZfZnN0YXRfZihmaWxkZXMsc3RhdF9idWZmKSBmc3RhdChmaWxkZXMsc3RhdF9idWZmKQorLyogI2RlZmluZSBfVElGRl9mdGVsbF9mKHN0cmVhbSkgZnRlbGwoc3RyZWFtKSAqLworLyogI2RlZmluZSBfVElGRl9zdGF0X2YocGF0aCxzdGF0X2J1ZmYpIHN0YXQocGF0aCxzdGF0X2J1ZmYpICovCisjZGVmaW5lIF9USUZGX3N0YXRfcyBzdHJ1Y3Qgc3RhdAorI2RlZmluZSBfVElGRl9vZmZfdCBvZmZfdAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKK2V4dGVybiBpbnQgX1RJRkZnZXRNb2RlKGNvbnN0IGNoYXIqIG1vZGUsIGNvbnN0IGNoYXIqIG1vZHVsZSk7CitleHRlcm4gaW50IF9USUZGTm9Sb3dFbmNvZGUoVElGRiogdGlmLCB1aW50OCogcHAsIHRtc2l6ZV90IGNjLCB1aW50MTYgcyk7CitleHRlcm4gaW50IF9USUZGTm9TdHJpcEVuY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBwcCwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKTsKK2V4dGVybiBpbnQgX1RJRkZOb1RpbGVFbmNvZGUoVElGRiosIHVpbnQ4KiBwcCwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKTsKK2V4dGVybiBpbnQgX1RJRkZOb1Jvd0RlY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBwcCwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKTsKK2V4dGVybiBpbnQgX1RJRkZOb1N0cmlwRGVjb2RlKFRJRkYqIHRpZiwgdWludDgqIHBwLCB0bXNpemVfdCBjYywgdWludDE2IHMpOworZXh0ZXJuIGludCBfVElGRk5vVGlsZURlY29kZShUSUZGKiwgdWludDgqIHBwLCB0bXNpemVfdCBjYywgdWludDE2IHMpOworZXh0ZXJuIHZvaWQgX1RJRkZOb1Bvc3REZWNvZGUoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBjYyk7CitleHRlcm4gaW50IF9USUZGTm9QcmVDb2RlKFRJRkYqIHRpZiwgdWludDE2IHMpOworZXh0ZXJuIGludCBfVElGRk5vU2VlayhUSUZGKiB0aWYsIHVpbnQzMiBvZmYpOworZXh0ZXJuIHZvaWQgX1RJRkZTd2FiMTZCaXREYXRhKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3QgY2MpOworZXh0ZXJuIHZvaWQgX1RJRkZTd2FiMjRCaXREYXRhKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3QgY2MpOworZXh0ZXJuIHZvaWQgX1RJRkZTd2FiMzJCaXREYXRhKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3QgY2MpOworZXh0ZXJuIHZvaWQgX1RJRkZTd2FiNjRCaXREYXRhKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3QgY2MpOworZXh0ZXJuIGludCBUSUZGRmx1c2hEYXRhMShUSUZGKiB0aWYpOworZXh0ZXJuIGludCBUSUZGRGVmYXVsdERpcmVjdG9yeShUSUZGKiB0aWYpOworZXh0ZXJuIHZvaWQgX1RJRkZTZXREZWZhdWx0Q29tcHJlc3Npb25TdGF0ZShUSUZGKiB0aWYpOworZXh0ZXJuIGludCBfVElGRlJld3JpdGVGaWVsZChUSUZGICosIHVpbnQxNiwgVElGRkRhdGFUeXBlLCB0bXNpemVfdCwgdm9pZCAqKTsKK2V4dGVybiBpbnQgVElGRlNldENvbXByZXNzaW9uU2NoZW1lKFRJRkYqIHRpZiwgaW50IHNjaGVtZSk7CitleHRlcm4gaW50IFRJRkZTZXREZWZhdWx0Q29tcHJlc3Npb25TdGF0ZShUSUZGKiB0aWYpOworZXh0ZXJuIHVpbnQzMiBfVElGRkRlZmF1bHRTdHJpcFNpemUoVElGRiogdGlmLCB1aW50MzIgcyk7CitleHRlcm4gdm9pZCBfVElGRkRlZmF1bHRUaWxlU2l6ZShUSUZGKiB0aWYsIHVpbnQzMiogdHcsIHVpbnQzMiogdGgpOworZXh0ZXJuIGludCBfVElGRkRhdGFTaXplKFRJRkZEYXRhVHlwZSB0eXBlKTsKKworZXh0ZXJuIHZvaWQgX1RJRkZzZXRCeXRlQXJyYXkodm9pZCoqLCB2b2lkKiwgdWludDMyKTsKK2V4dGVybiB2b2lkIF9USUZGc2V0U3RyaW5nKGNoYXIqKiwgY2hhciopOworZXh0ZXJuIHZvaWQgX1RJRkZzZXRTaG9ydEFycmF5KHVpbnQxNioqLCB1aW50MTYqLCB1aW50MzIpOworZXh0ZXJuIHZvaWQgX1RJRkZzZXRMb25nQXJyYXkodWludDMyKiosIHVpbnQzMiosIHVpbnQzMik7CitleHRlcm4gdm9pZCBfVElGRnNldEZsb2F0QXJyYXkoZmxvYXQqKiwgZmxvYXQqLCB1aW50MzIpOworZXh0ZXJuIHZvaWQgX1RJRkZzZXREb3VibGVBcnJheShkb3VibGUqKiwgZG91YmxlKiwgdWludDMyKTsKKworZXh0ZXJuIHZvaWQgX1RJRkZwcmludEFzY2lpKEZJTEUqLCBjb25zdCBjaGFyKik7CitleHRlcm4gdm9pZCBfVElGRnByaW50QXNjaWlUYWcoRklMRSosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CisKK2V4dGVybiBUSUZGRXJyb3JIYW5kbGVyIF9USUZGd2FybmluZ0hhbmRsZXI7CitleHRlcm4gVElGRkVycm9ySGFuZGxlciBfVElGRmVycm9ySGFuZGxlcjsKK2V4dGVybiBUSUZGRXJyb3JIYW5kbGVyRXh0IF9USUZGd2FybmluZ0hhbmRsZXJFeHQ7CitleHRlcm4gVElGRkVycm9ySGFuZGxlckV4dCBfVElGRmVycm9ySGFuZGxlckV4dDsKKworZXh0ZXJuIHVpbnQzMiBfVElGRk11bHRpcGx5MzIoVElGRiosIHVpbnQzMiwgdWludDMyLCBjb25zdCBjaGFyKik7CitleHRlcm4gdWludDY0IF9USUZGTXVsdGlwbHk2NChUSUZGKiwgdWludDY0LCB1aW50NjQsIGNvbnN0IGNoYXIqKTsKK2V4dGVybiB2b2lkKiBfVElGRkNoZWNrTWFsbG9jKFRJRkYqLCB0bXNpemVfdCwgdG1zaXplX3QsIGNvbnN0IGNoYXIqKTsKK2V4dGVybiB2b2lkKiBfVElGRkNoZWNrUmVhbGxvYyhUSUZGKiwgdm9pZCosIHRtc2l6ZV90LCB0bXNpemVfdCwgY29uc3QgY2hhciopOworCitleHRlcm4gZG91YmxlIF9USUZGVUludDY0VG9Eb3VibGUodWludDY0KTsKK2V4dGVybiBmbG9hdCBfVElGRlVJbnQ2NFRvRmxvYXQodWludDY0KTsKKworZXh0ZXJuIGludCBUSUZGSW5pdER1bXBNb2RlKFRJRkYqLCBpbnQpOworI2lmZGVmIFBBQ0tCSVRTX1NVUFBPUlQKK2V4dGVybiBpbnQgVElGRkluaXRQYWNrQml0cyhUSUZGKiwgaW50KTsKKyNlbmRpZgorI2lmZGVmIENDSVRUX1NVUFBPUlQKK2V4dGVybiBpbnQgVElGRkluaXRDQ0lUVFJMRShUSUZGKiwgaW50KSwgVElGRkluaXRDQ0lUVFJMRVcoVElGRiosIGludCk7CitleHRlcm4gaW50IFRJRkZJbml0Q0NJVFRGYXgzKFRJRkYqLCBpbnQpLCBUSUZGSW5pdENDSVRURmF4NChUSUZGKiwgaW50KTsKKyNlbmRpZgorI2lmZGVmIFRIVU5ERVJfU1VQUE9SVAorZXh0ZXJuIGludCBUSUZGSW5pdFRodW5kZXJTY2FuKFRJRkYqLCBpbnQpOworI2VuZGlmCisjaWZkZWYgTkVYVF9TVVBQT1JUCitleHRlcm4gaW50IFRJRkZJbml0TmVYVChUSUZGKiwgaW50KTsKKyNlbmRpZgorI2lmZGVmIExaV19TVVBQT1JUCitleHRlcm4gaW50IFRJRkZJbml0TFpXKFRJRkYqLCBpbnQpOworI2VuZGlmCisjaWZkZWYgT0pQRUdfU1VQUE9SVAorZXh0ZXJuIGludCBUSUZGSW5pdE9KUEVHKFRJRkYqLCBpbnQpOworI2VuZGlmCisjaWZkZWYgSlBFR19TVVBQT1JUCitleHRlcm4gaW50IFRJRkZJbml0SlBFRyhUSUZGKiwgaW50KTsKKyNlbmRpZgorI2lmZGVmIEpCSUdfU1VQUE9SVAorZXh0ZXJuIGludCBUSUZGSW5pdEpCSUcoVElGRiosIGludCk7CisjZW5kaWYKKyNpZmRlZiBaSVBfU1VQUE9SVAorZXh0ZXJuIGludCBUSUZGSW5pdFpJUChUSUZGKiwgaW50KTsKKyNlbmRpZgorI2lmZGVmIFBJWEFSTE9HX1NVUFBPUlQKK2V4dGVybiBpbnQgVElGRkluaXRQaXhhckxvZyhUSUZGKiwgaW50KTsKKyNlbmRpZgorI2lmZGVmIExPR0xVVl9TVVBQT1JUCitleHRlcm4gaW50IFRJRkZJbml0U0dJTG9nKFRJRkYqLCBpbnQpOworI2VuZGlmCisjaWZkZWYgTFpNQV9TVVBQT1JUCitleHRlcm4gaW50IFRJRkZJbml0TFpNQShUSUZGKiwgaW50KTsKKyNlbmRpZgorI2lmZGVmIFZNUworZXh0ZXJuIGNvbnN0IFRJRkZDb2RlYyBfVElGRkJ1aWx0aW5DT0RFQ1NbXTsKKyNlbHNlCitleHRlcm4gVElGRkNvZGVjIF9USUZGQnVpbHRpbkNPREVDU1tdOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfQorI2VuZGlmCisjZW5kaWYgLyogX1RJRkZJT1BfICovCisKKy8qIHZpbTogc2V0IHRzPTggc3RzPTggc3c9OCBub2V0OiAqLworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZmdmVycy5oIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZmdmVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NjU4MTQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmZ2ZXJzLmgKQEAgLTAsMCArMSw5IEBACisjZGVmaW5lIFRJRkZMSUJfVkVSU0lPTl9TVFIgIkxJQlRJRkYsIFZlcnNpb24gNC4wLjZcbkNvcHlyaWdodCAoYykgMTk4OC0xOTk2IFNhbSBMZWZmbGVyXG5Db3B5cmlnaHQgKGMpIDE5OTEtMTk5NiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIgorLyoKKyAqIFRoaXMgZGVmaW5lIGNhbiBiZSB1c2VkIGluIGNvZGUgdGhhdCByZXF1aXJlcworICogY29tcGlsYXRpb24tcmVsYXRlZCBkZWZpbml0aW9ucyBzcGVjaWZpYyB0byBhCisgKiB2ZXJzaW9uIG9yIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5LiAgUnVudGltZQorICogdmVyc2lvbiBjaGVja2luZyBzaG91bGQgYmUgZG9uZSBiYXNlZCBvbiB0aGUKKyAqIHN0cmluZyByZXR1cm5lZCBieSBUSUZGR2V0VmVyc2lvbi4KKyAqLworI2RlZmluZSBUSUZGTElCX1ZFUlNJT04gMjAxNTA5MTIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdXZjb2RlLmggYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3V2Y29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZjExZDcKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3V2Y29kZS5oCkBAIC0wLDAgKzEsMTgwIEBACisvKiBWZXJzaW9uIDEuMCBnZW5lcmF0ZWQgQXByaWwgNywgMTk5NyBieSBHcmVnIFdhcmQgTGFyc29uLCBTR0kgKi8KKyNkZWZpbmUgVVZfU1FTSVoJKGZsb2F0KTAuMDAzNTAwCisjZGVmaW5lIFVWX05ESVZTCTE2Mjg5CisjZGVmaW5lIFVWX1ZTVEFSVAkoZmxvYXQpMC4wMTY5NDAKKyNkZWZpbmUgVVZfTlZTCQkxNjMKK3N0YXRpYyBzdHJ1Y3QgeworCWZsb2F0CXVzdGFydDsKKwlzaG9ydAludXMsIG5jdW07Cit9CXV2X3Jvd1tVVl9OVlNdID0geworCXsgKGZsb2F0KTAuMjQ3NjYzLAk0LAkwIH0sCisJeyAoZmxvYXQpMC4yNDM3NzksCTYsCTQgfSwKKwl7IChmbG9hdCkwLjI0MTY4NCwJNywJMTAgfSwKKwl7IChmbG9hdCkwLjIzNzg3NCwJOSwJMTcgfSwKKwl7IChmbG9hdCkwLjIzNTkwNiwJMTAsCTI2IH0sCisJeyAoZmxvYXQpMC4yMzIxNTMsCTEyLAkzNiB9LAorCXsgKGZsb2F0KTAuMjI4MzUyLAkxNCwJNDggfSwKKwl7IChmbG9hdCkwLjIyNjI1OSwJMTUsCTYyIH0sCisJeyAoZmxvYXQpMC4yMjIzNzEsCTE3LAk3NyB9LAorCXsgKGZsb2F0KTAuMjIwNDEwLAkxOCwJOTQgfSwKKwl7IChmbG9hdCkwLjIxNDcxMCwJMjEsCTExMiB9LAorCXsgKGZsb2F0KTAuMjEyNzE0LAkyMiwJMTMzIH0sCisJeyAoZmxvYXQpMC4yMTA3MjEsCTIzLAkxNTUgfSwKKwl7IChmbG9hdCkwLjIwNDk3NiwJMjYsCTE3OCB9LAorCXsgKGZsb2F0KTAuMjAyOTg2LAkyNywJMjA0IH0sCisJeyAoZmxvYXQpMC4xOTkyNDUsCTI5LAkyMzEgfSwKKwl7IChmbG9hdCkwLjE5NTUyNSwJMzEsCTI2MCB9LAorCXsgKGZsb2F0KTAuMTkzNTYwLAkzMiwJMjkxIH0sCisJeyAoZmxvYXQpMC4xODk4NzgsCTM0LAkzMjMgfSwKKwl7IChmbG9hdCkwLjE4NjIxNiwJMzYsCTM1NyB9LAorCXsgKGZsb2F0KTAuMTg2MjE2LAkzNiwJMzkzIH0sCisJeyAoZmxvYXQpMC4xODI1OTIsCTM4LAk0MjkgfSwKKwl7IChmbG9hdCkwLjE3OTAwMywJNDAsCTQ2NyB9LAorCXsgKGZsb2F0KTAuMTc1NDY2LAk0MiwJNTA3IH0sCisJeyAoZmxvYXQpMC4xNzIwMDEsCTQ0LAk1NDkgfSwKKwl7IChmbG9hdCkwLjE3MjAwMSwJNDQsCTU5MyB9LAorCXsgKGZsb2F0KTAuMTY4NjEyLAk0NiwJNjM3IH0sCisJeyAoZmxvYXQpMC4xNjg2MTIsCTQ2LAk2ODMgfSwKKwl7IChmbG9hdCkwLjE2MzU3NSwJNDksCTcyOSB9LAorCXsgKGZsb2F0KTAuMTU4NjQyLAk1MiwJNzc4IH0sCisJeyAoZmxvYXQpMC4xNTg2NDIsCTUyLAk4MzAgfSwKKwl7IChmbG9hdCkwLjE1ODY0MiwJNTIsCTg4MiB9LAorCXsgKGZsb2F0KTAuMTUzODE1LAk1NSwJOTM0IH0sCisJeyAoZmxvYXQpMC4xNTM4MTUsCTU1LAk5ODkgfSwKKwl7IChmbG9hdCkwLjE0OTA5NywJNTgsCTEwNDQgfSwKKwl7IChmbG9hdCkwLjE0OTA5NywJNTgsCTExMDIgfSwKKwl7IChmbG9hdCkwLjE0Mjc0NiwJNjIsCTExNjAgfSwKKwl7IChmbG9hdCkwLjE0Mjc0NiwJNjIsCTEyMjIgfSwKKwl7IChmbG9hdCkwLjE0Mjc0NiwJNjIsCTEyODQgfSwKKwl7IChmbG9hdCkwLjEzODI3MCwJNjUsCTEzNDYgfSwKKwl7IChmbG9hdCkwLjEzODI3MCwJNjUsCTE0MTEgfSwKKwl7IChmbG9hdCkwLjEzODI3MCwJNjUsCTE0NzYgfSwKKwl7IChmbG9hdCkwLjEzMjE2NiwJNjksCTE1NDEgfSwKKwl7IChmbG9hdCkwLjEzMjE2NiwJNjksCTE2MTAgfSwKKwl7IChmbG9hdCkwLjEyNjIwNCwJNzMsCTE2NzkgfSwKKwl7IChmbG9hdCkwLjEyNjIwNCwJNzMsCTE3NTIgfSwKKwl7IChmbG9hdCkwLjEyNjIwNCwJNzMsCTE4MjUgfSwKKwl7IChmbG9hdCkwLjEyMDM4MSwJNzcsCTE4OTggfSwKKwl7IChmbG9hdCkwLjEyMDM4MSwJNzcsCTE5NzUgfSwKKwl7IChmbG9hdCkwLjEyMDM4MSwJNzcsCTIwNTIgfSwKKwl7IChmbG9hdCkwLjEyMDM4MSwJNzcsCTIxMjkgfSwKKwl7IChmbG9hdCkwLjExMjk2MiwJODIsCTIyMDYgfSwKKwl7IChmbG9hdCkwLjExMjk2MiwJODIsCTIyODggfSwKKwl7IChmbG9hdCkwLjExMjk2MiwJODIsCTIzNzAgfSwKKwl7IChmbG9hdCkwLjEwNzQ1MCwJODYsCTI0NTIgfSwKKwl7IChmbG9hdCkwLjEwNzQ1MCwJODYsCTI1MzggfSwKKwl7IChmbG9hdCkwLjEwNzQ1MCwJODYsCTI2MjQgfSwKKwl7IChmbG9hdCkwLjEwNzQ1MCwJODYsCTI3MTAgfSwKKwl7IChmbG9hdCkwLjEwMDM0MywJOTEsCTI3OTYgfSwKKwl7IChmbG9hdCkwLjEwMDM0MywJOTEsCTI4ODcgfSwKKwl7IChmbG9hdCkwLjEwMDM0MywJOTEsCTI5NzggfSwKKwl7IChmbG9hdCkwLjA5NTEyNiwJOTUsCTMwNjkgfSwKKwl7IChmbG9hdCkwLjA5NTEyNiwJOTUsCTMxNjQgfSwKKwl7IChmbG9hdCkwLjA5NTEyNiwJOTUsCTMyNTkgfSwKKwl7IChmbG9hdCkwLjA5NTEyNiwJOTUsCTMzNTQgfSwKKwl7IChmbG9hdCkwLjA4ODI3NiwJMTAwLAkzNDQ5IH0sCisJeyAoZmxvYXQpMC4wODgyNzYsCTEwMCwJMzU0OSB9LAorCXsgKGZsb2F0KTAuMDg4Mjc2LAkxMDAsCTM2NDkgfSwKKwl7IChmbG9hdCkwLjA4ODI3NiwJMTAwLAkzNzQ5IH0sCisJeyAoZmxvYXQpMC4wODE1MjMsCTEwNSwJMzg0OSB9LAorCXsgKGZsb2F0KTAuMDgxNTIzLAkxMDUsCTM5NTQgfSwKKwl7IChmbG9hdCkwLjA4MTUyMywJMTA1LAk0MDU5IH0sCisJeyAoZmxvYXQpMC4wODE1MjMsCTEwNSwJNDE2NCB9LAorCXsgKGZsb2F0KTAuMDc0ODYxLAkxMTAsCTQyNjkgfSwKKwl7IChmbG9hdCkwLjA3NDg2MSwJMTEwLAk0Mzc5IH0sCisJeyAoZmxvYXQpMC4wNzQ4NjEsCTExMCwJNDQ4OSB9LAorCXsgKGZsb2F0KTAuMDc0ODYxLAkxMTAsCTQ1OTkgfSwKKwl7IChmbG9hdCkwLjA2ODI5MCwJMTE1LAk0NzA5IH0sCisJeyAoZmxvYXQpMC4wNjgyOTAsCTExNSwJNDgyNCB9LAorCXsgKGZsb2F0KTAuMDY4MjkwLAkxMTUsCTQ5MzkgfSwKKwl7IChmbG9hdCkwLjA2ODI5MCwJMTE1LAk1MDU0IH0sCisJeyAoZmxvYXQpMC4wNjM1NzMsCTExOSwJNTE2OSB9LAorCXsgKGZsb2F0KTAuMDYzNTczLAkxMTksCTUyODggfSwKKwl7IChmbG9hdCkwLjA2MzU3MywJMTE5LAk1NDA3IH0sCisJeyAoZmxvYXQpMC4wNjM1NzMsCTExOSwJNTUyNiB9LAorCXsgKGZsb2F0KTAuMDU3MjE5LAkxMjQsCTU2NDUgfSwKKwl7IChmbG9hdCkwLjA1NzIxOSwJMTI0LAk1NzY5IH0sCisJeyAoZmxvYXQpMC4wNTcyMTksCTEyNCwJNTg5MyB9LAorCXsgKGZsb2F0KTAuMDU3MjE5LAkxMjQsCTYwMTcgfSwKKwl7IChmbG9hdCkwLjA1MDk4NSwJMTI5LAk2MTQxIH0sCisJeyAoZmxvYXQpMC4wNTA5ODUsCTEyOSwJNjI3MCB9LAorCXsgKGZsb2F0KTAuMDUwOTg1LAkxMjksCTYzOTkgfSwKKwl7IChmbG9hdCkwLjA1MDk4NSwJMTI5LAk2NTI4IH0sCisJeyAoZmxvYXQpMC4wNTA5ODUsCTEyOSwJNjY1NyB9LAorCXsgKGZsb2F0KTAuMDQ0ODU5LAkxMzQsCTY3ODYgfSwKKwl7IChmbG9hdCkwLjA0NDg1OSwJMTM0LAk2OTIwIH0sCisJeyAoZmxvYXQpMC4wNDQ4NTksCTEzNCwJNzA1NCB9LAorCXsgKGZsb2F0KTAuMDQ0ODU5LAkxMzQsCTcxODggfSwKKwl7IChmbG9hdCkwLjA0MDU3MSwJMTM4LAk3MzIyIH0sCisJeyAoZmxvYXQpMC4wNDA1NzEsCTEzOCwJNzQ2MCB9LAorCXsgKGZsb2F0KTAuMDQwNTcxLAkxMzgsCTc1OTggfSwKKwl7IChmbG9hdCkwLjA0MDU3MSwJMTM4LAk3NzM2IH0sCisJeyAoZmxvYXQpMC4wMzYzMzksCTE0MiwJNzg3NCB9LAorCXsgKGZsb2F0KTAuMDM2MzM5LAkxNDIsCTgwMTYgfSwKKwl7IChmbG9hdCkwLjAzNjMzOSwJMTQyLAk4MTU4IH0sCisJeyAoZmxvYXQpMC4wMzYzMzksCTE0MiwJODMwMCB9LAorCXsgKGZsb2F0KTAuMDMyMTM5LAkxNDYsCTg0NDIgfSwKKwl7IChmbG9hdCkwLjAzMjEzOSwJMTQ2LAk4NTg4IH0sCisJeyAoZmxvYXQpMC4wMzIxMzksCTE0NiwJODczNCB9LAorCXsgKGZsb2F0KTAuMDMyMTM5LAkxNDYsCTg4ODAgfSwKKwl7IChmbG9hdCkwLjAyNzk0NywJMTUwLAk5MDI2IH0sCisJeyAoZmxvYXQpMC4wMjc5NDcsCTE1MCwJOTE3NiB9LAorCXsgKGZsb2F0KTAuMDI3OTQ3LAkxNTAsCTkzMjYgfSwKKwl7IChmbG9hdCkwLjAyMzczOSwJMTU0LAk5NDc2IH0sCisJeyAoZmxvYXQpMC4wMjM3MzksCTE1NCwJOTYzMCB9LAorCXsgKGZsb2F0KTAuMDIzNzM5LAkxNTQsCTk3ODQgfSwKKwl7IChmbG9hdCkwLjAyMzczOSwJMTU0LAk5OTM4IH0sCisJeyAoZmxvYXQpMC4wMTk1MDQsCTE1OCwJMTAwOTIgfSwKKwl7IChmbG9hdCkwLjAxOTUwNCwJMTU4LAkxMDI1MCB9LAorCXsgKGZsb2F0KTAuMDE5NTA0LAkxNTgsCTEwNDA4IH0sCisJeyAoZmxvYXQpMC4wMTY5NzYsCTE2MSwJMTA1NjYgfSwKKwl7IChmbG9hdCkwLjAxNjk3NiwJMTYxLAkxMDcyNyB9LAorCXsgKGZsb2F0KTAuMDE2OTc2LAkxNjEsCTEwODg4IH0sCisJeyAoZmxvYXQpMC4wMTY5NzYsCTE2MSwJMTEwNDkgfSwKKwl7IChmbG9hdCkwLjAxMjYzOSwJMTY1LAkxMTIxMCB9LAorCXsgKGZsb2F0KTAuMDEyNjM5LAkxNjUsCTExMzc1IH0sCisJeyAoZmxvYXQpMC4wMTI2MzksCTE2NSwJMTE1NDAgfSwKKwl7IChmbG9hdCkwLjAwOTk5MSwJMTY4LAkxMTcwNSB9LAorCXsgKGZsb2F0KTAuMDA5OTkxLAkxNjgsCTExODczIH0sCisJeyAoZmxvYXQpMC4wMDk5OTEsCTE2OCwJMTIwNDEgfSwKKwl7IChmbG9hdCkwLjAwOTAxNiwJMTcwLAkxMjIwOSB9LAorCXsgKGZsb2F0KTAuMDA5MDE2LAkxNzAsCTEyMzc5IH0sCisJeyAoZmxvYXQpMC4wMDkwMTYsCTE3MCwJMTI1NDkgfSwKKwl7IChmbG9hdCkwLjAwNjIxNywJMTczLAkxMjcxOSB9LAorCXsgKGZsb2F0KTAuMDA2MjE3LAkxNzMsCTEyODkyIH0sCisJeyAoZmxvYXQpMC4wMDUwOTcsCTE3NSwJMTMwNjUgfSwKKwl7IChmbG9hdCkwLjAwNTA5NywJMTc1LAkxMzI0MCB9LAorCXsgKGZsb2F0KTAuMDA1MDk3LAkxNzUsCTEzNDE1IH0sCisJeyAoZmxvYXQpMC4wMDM5MDksCTE3NywJMTM1OTAgfSwKKwl7IChmbG9hdCkwLjAwMzkwOSwJMTc3LAkxMzc2NyB9LAorCXsgKGZsb2F0KTAuMDAyMzQwLAkxNzcsCTEzOTQ0IH0sCisJeyAoZmxvYXQpMC4wMDIzODksCTE3MCwJMTQxMjEgfSwKKwl7IChmbG9hdCkwLjAwMTA2OCwJMTY0LAkxNDI5MSB9LAorCXsgKGZsb2F0KTAuMDAxNjUzLAkxNTcsCTE0NDU1IH0sCisJeyAoZmxvYXQpMC4wMDA3MTcsCTE1MCwJMTQ2MTIgfSwKKwl7IChmbG9hdCkwLjAwMTYxNCwJMTQzLAkxNDc2MiB9LAorCXsgKGZsb2F0KTAuMDAwMjcwLAkxMzYsCTE0OTA1IH0sCisJeyAoZmxvYXQpMC4wMDA0ODQsCTEyOSwJMTUwNDEgfSwKKwl7IChmbG9hdCkwLjAwMTEwMywJMTIzLAkxNTE3MCB9LAorCXsgKGZsb2F0KTAuMDAxMjQyLAkxMTUsCTE1MjkzIH0sCisJeyAoZmxvYXQpMC4wMDExODgsCTEwOSwJMTU0MDggfSwKKwl7IChmbG9hdCkwLjAwMTAxMSwJMTAzLAkxNTUxNyB9LAorCXsgKGZsb2F0KTAuMDAwNzA5LAk5NywJMTU2MjAgfSwKKwl7IChmbG9hdCkwLjAwMDMwMSwJODksCTE1NzE3IH0sCisJeyAoZmxvYXQpMC4wMDI0MTYsCTgyLAkxNTgwNiB9LAorCXsgKGZsb2F0KTAuMDAzMjUxLAk3NiwJMTU4ODggfSwKKwl7IChmbG9hdCkwLjAwMzI0NiwJNjksCTE1OTY0IH0sCisJeyAoZmxvYXQpMC4wMDQxNDEsCTYyLAkxNjAzMyB9LAorCXsgKGZsb2F0KTAuMDA1OTYzLAk1NSwJMTYwOTUgfSwKKwl7IChmbG9hdCkwLjAwODgzOSwJNDcsCTE2MTUwIH0sCisJeyAoZmxvYXQpMC4wMTA0OTAsCTQwLAkxNjE5NyB9LAorCXsgKGZsb2F0KTAuMDE2OTk0LAkzMSwJMTYyMzcgfSwKKwl7IChmbG9hdCkwLjAyMzY1OSwJMjEsCTE2MjY4IH0sCit9OworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIG1vZGU6IGMKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBmaWxsLWNvbHVtbjogNzgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9meF9scG5nL2xwbmdfdjE2My9meF9wbmcuYyBiL3RoaXJkX3BhcnR5L2xwbmdfdjE2My9wbmcuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2FtcGxlcy9meF9scG5nL2xwbmdfdjE2My9meF9wbmcuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbHBuZ192MTYzL3BuZy5jCmRpZmYgLS1naXQgYS9zYW1wbGVzL2Z4X2xwbmcvbHBuZ192MTYzL3BuZy5oIGIvdGhpcmRfcGFydHkvbHBuZ192MTYzL3BuZy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzYW1wbGVzL2Z4X2xwbmcvbHBuZ192MTYzL3BuZy5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9scG5nX3YxNjMvcG5nLmgKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZnhfbHBuZy9scG5nX3YxNjMvcG5nY29uZi5oIGIvdGhpcmRfcGFydHkvbHBuZ192MTYzL3BuZ2NvbmYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2FtcGxlcy9meF9scG5nL2xwbmdfdjE2My9wbmdjb25mLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xwbmdfdjE2My9wbmdjb25mLmgKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZnhfbHBuZy9scG5nX3YxNjMvcG5nZGVidWcuaCBiL3RoaXJkX3BhcnR5L2xwbmdfdjE2My9wbmdkZWJ1Zy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzYW1wbGVzL2Z4X2xwbmcvbHBuZ192MTYzL3BuZ2RlYnVnLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xwbmdfdjE2My9wbmdkZWJ1Zy5oCmRpZmYgLS1naXQgYS9zYW1wbGVzL2Z4X2xwbmcvbHBuZ192MTYzL2Z4X3BuZ2Vycm9yLmMgYi90aGlyZF9wYXJ0eS9scG5nX3YxNjMvcG5nZXJyb3IuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2FtcGxlcy9meF9scG5nL2xwbmdfdjE2My9meF9wbmdlcnJvci5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9scG5nX3YxNjMvcG5nZXJyb3IuYwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9meF9scG5nL2xwbmdfdjE2My9meF9wbmdnZXQuYyBiL3RoaXJkX3BhcnR5L2xwbmdfdjE2My9wbmdnZXQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2FtcGxlcy9meF9scG5nL2xwbmdfdjE2My9meF9wbmdnZXQuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbHBuZ192MTYzL3BuZ2dldC5jCmRpZmYgLS1naXQgYS9zYW1wbGVzL2Z4X2xwbmcvbHBuZ192MTYzL3BuZ2luZm8uaCBiL3RoaXJkX3BhcnR5L2xwbmdfdjE2My9wbmdpbmZvLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNhbXBsZXMvZnhfbHBuZy9scG5nX3YxNjMvcG5naW5mby5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9scG5nX3YxNjMvcG5naW5mby5oCmRpZmYgLS1naXQgYS9zYW1wbGVzL2Z4X2xwbmcvbHBuZ192MTYzL3BuZ2xpYmNvbmYuaCBiL3RoaXJkX3BhcnR5L2xwbmdfdjE2My9wbmdsaWJjb25mLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNhbXBsZXMvZnhfbHBuZy9scG5nX3YxNjMvcG5nbGliY29uZi5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9scG5nX3YxNjMvcG5nbGliY29uZi5oCmRpZmYgLS1naXQgYS9zYW1wbGVzL2Z4X2xwbmcvbHBuZ192MTYzL2Z4X3BuZ21lbS5jIGIvdGhpcmRfcGFydHkvbHBuZ192MTYzL3BuZ21lbS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzYW1wbGVzL2Z4X2xwbmcvbHBuZ192MTYzL2Z4X3BuZ21lbS5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9scG5nX3YxNjMvcG5nbWVtLmMKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5ncHJlYWQuYyBiL3RoaXJkX3BhcnR5L2xwbmdfdjE2My9wbmdwcmVhZC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzYW1wbGVzL2Z4X2xwbmcvbHBuZ192MTYzL2Z4X3BuZ3ByZWFkLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xwbmdfdjE2My9wbmdwcmVhZC5jCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9scG5nX3YxNjMvcG5ncHJpdi5oIGIvdGhpcmRfcGFydHkvbHBuZ192MTYzL3BuZ3ByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmEzZDYwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbHBuZ192MTYzL3BuZ3ByaXYuaApAQCAtMCwwICsxLDIwMDYgQEAKKw0KKy8qIHBuZ3ByaXYuaCAtIHByaXZhdGUgZGVjbGFyYXRpb25zIGZvciB1c2UgaW5zaWRlIGxpYnBuZw0KKyAqDQorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHBuZy5oDQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTMgR2xlbm4gUmFuZGVycy1QZWhyc29uDQorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpDQorICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQ0KKyAqDQorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMyBbSnVseSAxOCwgMjAxM10NCisgKg0KKyAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuDQorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgZGlzY2xhaW1lcg0KKyAqIGFuZCBsaWNlbnNlIGluIHBuZy5oDQorICovDQorDQorLyogVGhlIHN5bWJvbHMgZGVjbGFyZWQgaW4gdGhpcyBmaWxlIChpbmNsdWRpbmcgdGhlIGZ1bmN0aW9ucyBkZWNsYXJlZA0KKyAqIGFzIGV4dGVybikgYXJlIFBSSVZBVEUuICBUaGV5IGFyZSBub3QgcGFydCBvZiB0aGUgbGlicG5nIHB1YmxpYw0KKyAqIGludGVyZmFjZSwgYW5kIGFyZSBub3QgcmVjb21tZW5kZWQgZm9yIHVzZSBieSByZWd1bGFyIGFwcGxpY2F0aW9ucy4NCisgKiBTb21lIG9mIHRoZW0gbWF5IGJlY29tZSBwdWJsaWMgaW4gdGhlIGZ1dHVyZTsgb3RoZXJzIG1heSBzdGF5IHByaXZhdGUsDQorICogY2hhbmdlIGluIGFuIGluY29tcGF0aWJsZSB3YXksIG9yIGV2ZW4gZGlzYXBwZWFyLg0KKyAqIEFsdGhvdWdoIHRoZSBsaWJwbmcgdXNlcnMgYXJlIG5vdCBmb3JiaWRkZW4gdG8gaW5jbHVkZSB0aGlzIGhlYWRlciwNCisgKiB0aGV5IHNob3VsZCBiZSB3ZWxsIGF3YXJlIG9mIHRoZSBpc3N1ZXMgdGhhdCBtYXkgYXJpc2UgZnJvbSBkb2luZyBzby4NCisgKi8NCisNCisjaWZuZGVmIFBOR1BSSVZfSA0KKyNkZWZpbmUgUE5HUFJJVl9IDQorDQorLyogRmVhdHVyZSBUZXN0IE1hY3Jvcy4gIFRoZSBmb2xsb3dpbmcgYXJlIGRlZmluZWQgaGVyZSB0byBlbnN1cmUgdGhhdCBjb3JyZWN0bHkNCisgKiBpbXBsZW1lbnRlZCBsaWJyYXJpZXMgcmV2ZWFsIHRoZSBBUElzIGxpYnBuZyBuZWVkcyB0byBidWlsZCBhbmQgaGlkZSB0aG9zZQ0KKyAqIHRoYXQgYXJlIG5vdCBuZWVkZWQgYW5kIHBvdGVudGlhbGx5IGRhbWFnaW5nIHRvIHRoZSBjb21waWxhdGlvbi4NCisgKg0KKyAqIEZlYXR1cmUgVGVzdCBNYWNyb3MgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSBhbnkgc3lzdGVtIGhlYWRlciBpcyBpbmNsdWRlZCAoc2VlDQorICogUE9TSVggMTAwMy4xIDIuOC4yICJQT1NJWCBTeW1ib2xzLiINCisgKg0KKyAqIFRoZXNlIG1hY3JvcyBvbmx5IGhhdmUgYW4gZWZmZWN0IGlmIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHN1cHBvcnRzIGVpdGhlcg0KKyAqIFBPU0lYIDEwMDMuMSBvciBDOTksIG9yIGJvdGguICBPbiBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcyAocGFydGljdWxhcmx5DQorICogV2luZG93cy9WaXN1YWwgU3R1ZGlvKSB0aGVyZSBpcyBubyBlZmZlY3Q7IHRoZSBPUyBzcGVjaWZpYyB0ZXN0cyBiZWxvdyBhcmUNCisgKiBzdGlsbCByZXF1aXJlZCAoYXMgb2YgMjAxMS0wNS0wMi4pDQorICovDQorI2RlZmluZSBfUE9TSVhfU09VUkNFIDEgLyogSnVzdCB0aGUgUE9TSVggMTAwMy4xIGFuZCBDODkgQVBJcyAqLw0KKw0KKyNpZm5kZWYgUE5HX1ZFUlNJT05fSU5GT19PTkxZDQorLyogU3RhbmRhcmQgbGlicmFyeSBoZWFkZXJzIG5vdCByZXF1aXJlZCBieSBwbmcuaDogKi8NCisjICBpbmNsdWRlIDxzdGRsaWIuaD4NCisjICBpbmNsdWRlIDxzdHJpbmcuaD4NCisjZW5kaWYNCisNCisjZGVmaW5lIFBOR0xJQl9CVUlMRCAvKmxpYnBuZyBpcyBiZWluZyBidWlsdCwgbm90IHVzZWQqLw0KKw0KKy8qIElmIEhBVkVfQ09ORklHX0ggaXMgZGVmaW5lZCBkdXJpbmcgdGhlIGJ1aWxkIHRoZW4gdGhlIGJ1aWxkIHN5c3RlbSBtdXN0DQorICogcHJvdmlkZSBhbiBhcHByb3ByaWF0ZSAiY29uZmlnLmgiIGZpbGUgb24gdGhlIGluY2x1ZGUgcGF0aC4gIFRoZSBoZWFkZXIgZmlsZQ0KKyAqIG11c3QgcHJvdmlkZSBkZWZpbml0aW9ucyBhcyByZXF1aXJlZCBiZWxvdyAoc2VhcmNoIGZvciAiSEFWRV9DT05GSUdfSCIpOw0KKyAqIHNlZSBjb25maWd1cmUuYWMgZm9yIG1vcmUgZGV0YWlscyBvZiB0aGUgcmVxdWlyZW1lbnRzLiAgVGhlIG1hY3JvDQorICogIlBOR19OT19DT05GSUdfSCIgaXMgcHJvdmlkZWQgZm9yIG1haW50YWluZXJzIHRvIHRlc3QgZm9yIGRlcGVuZGVuY2llcyBvbg0KKyAqICdjb25maWd1cmUnOyBkZWZpbmUgdGhpcyBtYWNybyB0byBwcmV2ZW50IHRoZSBjb25maWd1cmUgYnVpbGQgaW5jbHVkaW5nIHRoZQ0KKyAqIGNvbmZpZ3VyZSBnZW5lcmF0ZWQgY29uZmlnLmguICBMaWJwbmcgaXMgZXhwZWN0ZWQgdG8gY29tcGlsZSB3aXRob3V0ICphbnkqDQorICogc3BlY2lhbCBidWlsZCBzeXN0ZW0gc3VwcG9ydCBvbiBhIHJlYXNvbmFibHkgQU5TSS1DIGNvbXBsaWFudCBzeXN0ZW0uDQorICovDQorI2lmIGRlZmluZWQoSEFWRV9DT05GSUdfSCkgJiYgIWRlZmluZWQoUE5HX05PX0NPTkZJR19IKQ0KKyMgIGluY2x1ZGUgPGNvbmZpZy5oPg0KKw0KKyAgIC8qIFBpY2sgdXAgdGhlIGRlZmluaXRpb24gb2YgJ3Jlc3RyaWN0JyBmcm9tIGNvbmZpZy5oIGlmIGl0IHdhcyByZWFkOiAqLw0KKyMgIGRlZmluZSBQTkdfUkVTVFJJQ1QgcmVzdHJpY3QNCisjZW5kaWYNCisNCisvKiBUbyBzdXBwb3J0IHN5bWJvbCBwcmVmaXhpbmcgaXQgaXMgbmVjZXNzYXJ5IHRvIGtub3cgKmJlZm9yZSogaW5jbHVkaW5nIHBuZy5oDQorICogd2hldGhlciB0aGUgZml4ZWQgcG9pbnQgKGFuZCBtYXliZSBvdGhlcikgQVBJcyBhcmUgZXhwb3J0ZWQsIGJlY2F1c2UgaWYgdGhleQ0KKyAqIGFyZSBub3QgaW50ZXJuYWwgZGVmaW5pdGlvbnMgbWF5IGJlIHJlcXVpcmVkLiAgVGhpcyBpcyBoYW5kbGVkIGJlbG93IGp1c3QNCisgKiBiZWZvcmUgcG5nLmggaXMgaW5jbHVkZWQsIGJ1dCBsb2FkIHRoZSBjb25maWd1cmF0aW9uIG5vdyBpZiBpdCBpcyBhdmFpbGFibGUuDQorICovDQorI2lmbmRlZiBQTkdMQ09ORl9IDQorIyAgaW5jbHVkZSAicG5nbGliY29uZi5oIg0KKyNlbmRpZg0KKw0KKy8qIExvY2FsIHJlbmFtZXMgbWF5IGNoYW5nZSBub24tZXhwb3J0ZWQgQVBJIGZ1bmN0aW9ucyBmcm9tIHBuZy5oICovDQorI2lmIGRlZmluZWQoUE5HX1BSRUZJWCkgJiYgIWRlZmluZWQoUE5HUFJFRklYX0gpDQorIyAgaW5jbHVkZSAicG5ncHJlZml4LmgiDQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19VU0VSX0NPTkZJRw0KKyMgIGluY2x1ZGUgInBuZ3Vzci5oIg0KKyAgIC8qIFRoZXNlIHNob3VsZCBoYXZlIGJlZW4gZGVmaW5lZCBpbiBwbmd1c3IuaCAqLw0KKyMgIGlmbmRlZiBQTkdfVVNFUl9QUklWQVRFQlVJTEQNCisjICAgIGRlZmluZSBQTkdfVVNFUl9QUklWQVRFQlVJTEQgIkN1c3RvbSBsaWJwbmcgYnVpbGQiDQorIyAgZW5kaWYNCisjICBpZm5kZWYgUE5HX1VTRVJfRExMRk5BTUVfUE9TVEZJWA0KKyMgICAgZGVmaW5lIFBOR19VU0VSX0RMTEZOQU1FX1BPU1RGSVggIkNiIg0KKyMgIGVuZGlmDQorI2VuZGlmDQorDQorLyogQ29tcGlsZSB0aW1lIG9wdGlvbnMuDQorICogPT09PT09PT09PT09PT09PT09PT09DQorICogSW4gYSBtdWx0aS1hcmNoIGJ1aWxkIHRoZSBjb21waWxlciBtYXkgY29tcGlsZSB0aGUgY29kZSBzZXZlcmFsIHRpbWVzIGZvciB0aGUNCisgKiBzYW1lIG9iamVjdCBtb2R1bGUsIHByb2R1Y2luZyBkaWZmZXJlbnQgYmluYXJpZXMgZm9yIGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzLg0KKyAqIFdoZW4gdGhpcyBoYXBwZW5zIGNvbmZpZ3VyZS10aW1lIHNldHRpbmcgb2YgdGhlIHRhcmdldCBob3N0IG9wdGlvbnMgY2Fubm90IGJlDQorICogZG9uZSBhbmQgdGhpcyBpbnRlcmZlcmVzIHdpdGggdGhlIGhhbmRsaW5nIG9mIHRoZSBBUk0gTkVPTiBvcHRpbWl6YXRpb25zLCBhbmQNCisgKiBwb3NzaWJseSBvdGhlciBzaW1pbGFyIG9wdGltaXphdGlvbnMuICBQdXQgYWRkaXRpb25hbCB0ZXN0cyBoZXJlOyBpbiBnZW5lcmFsDQorICogdGhpcyBpcyBuZWVkZWQgd2hlbiB0aGUgc2FtZSBvcHRpb24gY2FuIGJlIGNoYW5nZWQgYXQgYm90aCBjb21waWxlIHRpbWUgYW5kDQorICogcnVuIHRpbWUgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgT1MgKGkuZS4gaU9TIHZzIEFuZHJvaWQuKQ0KKyAqDQorICogTk9URTogc3ltYm9sIHByZWZpeGluZyBkb2VzIG5vdCBwYXNzICQoQ0ZMQUdTKSB0byB0aGUgcHJlcHJvY2Vzc29yLCBiZWNhdXNlDQorICogdGhpcyBpcyBub3QgcG9zc2libGUgd2l0aCBjZXJ0YWluIGNvbXBpbGVycyAoT3JhY2xlIFNVTiBPUyBDQyksIGFzIGEgcmVzdWx0DQorICogaXQgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IGFsbCBleHRlcm4gZnVuY3Rpb25zIHRoYXQgKm1pZ2h0KiBiZSB1c2VkDQorICogcmVnYXJkbGVzcyBvZiAkKENGTEFHUykgZ2V0IGRlY2xhcmVkIGluIHRoaXMgZmlsZS4gIFRoZSB0ZXN0IG9uIF9fQVJNX05FT05fXw0KKyAqIGJlbG93IGlzIG9uZSBleGFtcGxlIG9mIHRoaXMgYmVoYXZpb3IgYmVjYXVzZSBpdCBpcyBjb250cm9sbGVkIGJ5IHRoZQ0KKyAqIHByZXNlbmNlIG9yIG5vdCBvZiAtbWZwdT1uZW9uIG9uIHRoZSBHQ0MgY29tbWFuZCBsaW5lLCBpdCBpcyBwb3NzaWJsZSB0byBkbw0KKyAqIHRoaXMgaW4gJChDQyksIGUuZy4gIkNDPWdjYyAtbWZwdT1uZW9uIiwgYnV0IHBlb3BsZSB3aG8gYnVpbGQgbGlicG5nIHJhcmVseQ0KKyAqIGRvIHRoaXMuDQorICovDQorI2lmbmRlZiBQTkdfQVJNX05FT05fT1BUDQorICAgLyogQVJNIE5FT04gb3B0aW1pemF0aW9ucyBhcmUgYmVpbmcgY29udHJvbGxlZCBieSB0aGUgY29tcGlsZXIgc2V0dGluZ3MsDQorICAgICogdHlwaWNhbGx5IHRoZSB0YXJnZXQgRlBVLiAgSWYgdGhlIEZQVSBoYXMgYmVlbiBzZXQgdG8gTkVPTiAoLW1mcHU9bmVvbg0KKyAgICAqIHdpdGggR0NDKSB0aGVuIHRoZSBjb21waWxlciB3aWxsIGRlZmluZSBfX0FSTV9ORU9OX18gYW5kIHdlIGNhbiByZWx5DQorICAgICogdW5jb25kaXRpb25hbGx5IG9uIE5FT04gaW5zdHJ1Y3Rpb25zIG5vdCBjcmFzaGluZywgb3RoZXJ3aXNlIHdlIG11c3QNCisgICAgKiBkaXNhYmxlIHVzZSBvZiBORU9OIGluc3RydWN0aW9uczoNCisgICAgKi8NCisjICBpZmRlZiBfX0FSTV9ORU9OX18NCisjICAgICBkZWZpbmUgUE5HX0FSTV9ORU9OX09QVCAyDQorIyAgZWxzZQ0KKyMgICAgIGRlZmluZSBQTkdfQVJNX05FT05fT1BUIDANCisjICBlbmRpZg0KKyNlbmRpZg0KKw0KKyNpZiBQTkdfQVJNX05FT05fT1BUID4gMA0KKyAgIC8qIE5FT04gb3B0aW1pemF0aW9ucyBhcmUgdG8gYmUgYXQgbGVhc3QgY29uc2lkZXJlZCBieSBsaWJwbmcsIHNvIGVuYWJsZSB0aGUNCisgICAgKiBjYWxsYmFja3MgdG8gZG8gdGhpcy4NCisgICAgKi8NCisjICBkZWZpbmUgUE5HX0ZJTFRFUl9PUFRJTUlaQVRJT05TIHBuZ19pbml0X2ZpbHRlcl9mdW5jdGlvbnNfbmVvbg0KKyNlbmRpZg0KKw0KKy8qIElzIHRoaXMgYSBidWlsZCBvZiBhIERMTCB3aGVyZSBjb21waWxhdGlvbiBvZiB0aGUgb2JqZWN0IG1vZHVsZXMgcmVxdWlyZXMNCisgKiBkaWZmZXJlbnQgcHJlcHJvY2Vzc29yIHNldHRpbmdzIHRvIHRob3NlIHJlcXVpcmVkIGZvciBhIHNpbXBsZSBsaWJyYXJ5PyAgSWYNCisgKiBzbyBQTkdfQlVJTERfRExMIG11c3QgYmUgc2V0Lg0KKyAqDQorICogSWYgbGlicG5nIGlzIHVzZWQgaW5zaWRlIGEgRExMIGJ1dCB0aGF0IERMTCBkb2VzIG5vdCBleHBvcnQgdGhlIGxpYnBuZyBBUElzDQorICogUE5HX0JVSUxEX0RMTCBtdXN0IG5vdCBiZSBzZXQuICBUbyBhdm9pZCB0aGUgY29kZSBiZWxvdyBraWNraW5nIGluIGJ1aWxkIGENCisgKiBzdGF0aWMgbGlicmFyeSBvZiBsaWJwbmcgdGhlbiBsaW5rIHRoZSBETEwgYWdhaW5zdCB0aGF0Lg0KKyAqLw0KKyNpZm5kZWYgUE5HX0JVSUxEX0RMTA0KKyMgIGlmZGVmIERMTF9FWFBPUlQNCisgICAgICAvKiBUaGlzIGlzIHNldCBieSBsaWJ0b29sIHdoZW4gZmlsZXMgYXJlIGNvbXBpbGVkIGZvciBhIERMTDsgbGlidG9vbA0KKyAgICAgICAqIGFsd2F5cyBjb21waWxlcyB0d2ljZSwgZXZlbiBvbiBzeXN0ZW1zIHdoZXJlIGl0IGlzbid0IG5lY2Vzc2FyeS4gIFNldA0KKyAgICAgICAqIFBOR19CVUlMRF9ETEwgaW4gY2FzZSBpdCBpcyBuZWNlc3Nhcnk6DQorICAgICAgICovDQorIyAgICAgZGVmaW5lIFBOR19CVUlMRF9ETEwNCisjICBlbHNlDQorIyAgICAgaWZkZWYgX1dJTkRMTA0KKyAgICAgICAgIC8qIFRoaXMgaXMgc2V0IGJ5IHRoZSBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBJREUgaW4gcHJvamVjdHMgdGhhdA0KKyAgICAgICAgICAqIGJ1aWxkIGEgRExMLiAgSXQgY2FuJ3QgZWFzaWx5IGJlIHJlbW92ZWQgZnJvbSB0aG9zZSBwcm9qZWN0cyAoaXQNCisgICAgICAgICAgKiBpc24ndCB2aXNpYmxlIGluIHRoZSBWaXN1YWwgU3R1ZGlvIFVJKSBzbyBpdCBpcyBhIGZhaXJseSByZWxpYWJsZQ0KKyAgICAgICAgICAqIGluZGljYXRpb24gdGhhdCBQTkdfSU1QRVhQIG5lZWRzIHRvIGJlIHNldCB0byB0aGUgRExMIGV4cG9ydA0KKyAgICAgICAgICAqIGF0dHJpYnV0ZXMuDQorICAgICAgICAgICovDQorIyAgICAgICAgZGVmaW5lIFBOR19CVUlMRF9ETEwNCisjICAgICBlbHNlDQorIyAgICAgICAgaWZkZWYgX19ETExfXw0KKyAgICAgICAgICAgIC8qIFRoaXMgaXMgc2V0IGJ5IHRoZSBCb3JsYW5kIEMgc3lzdGVtIHdoZW4gY29tcGlsaW5nIGZvciBhIERMTA0KKyAgICAgICAgICAgICAqIChhcyBhYm92ZS4pDQorICAgICAgICAgICAgICovDQorIyAgICAgICAgICAgZGVmaW5lIFBOR19CVUlMRF9ETEwNCisjICAgICAgICBlbHNlDQorICAgICAgICAgICAgLyogQWRkIGFkZGl0aW9uYWwgY29tcGlsZXIgY2FzZXMgaGVyZS4gKi8NCisjICAgICAgICBlbmRpZg0KKyMgICAgIGVuZGlmDQorIyAgZW5kaWYNCisjZW5kaWYgLyogU2V0dGluZyBQTkdfQlVJTERfRExMIGlmIHJlcXVpcmVkICovDQorDQorLyogU2VlIHBuZ2NvbmYuaCBmb3IgbW9yZSBkZXRhaWxzOiB0aGUgYnVpbGRlciBvZiB0aGUgbGlicmFyeSBtYXkgc2V0IHRoaXMgb24NCisgKiB0aGUgY29tbWFuZCBsaW5lIHRvIHRoZSByaWdodCB0aGluZyBmb3IgdGhlIHNwZWNpZmljIGNvbXBpbGF0aW9uIHN5c3RlbSBvciBpdA0KKyAqIG1heSBiZSBhdXRvbWFnaWNhbGx5IHNldCBhYm92ZSAoYXQgcHJlc2VudCB3ZSBrbm93IG9mIG5vIHN5c3RlbSB3aGVyZSBpdCBkb2VzDQorICogbmVlZCB0byBiZSBzZXQgb24gdGhlIGNvbW1hbmQgbGluZS4pDQorICoNCisgKiBQTkdfSU1QRVhQIG11c3QgYmUgc2V0IGhlcmUgd2hlbiBidWlsZGluZyB0aGUgbGlicmFyeSB0byBwcmV2ZW50IHBuZ2NvbmYuaA0KKyAqIHNldHRpbmcgaXQgdG8gdGhlICJpbXBvcnQiIHNldHRpbmcgZm9yIGEgRExMIGJ1aWxkLg0KKyAqLw0KKyNpZm5kZWYgUE5HX0lNUEVYUA0KKyMgIGlmZGVmIFBOR19CVUlMRF9ETEwNCisjICAgICBkZWZpbmUgUE5HX0lNUEVYUCBQTkdfRExMX0VYUE9SVA0KKyMgIGVsc2UNCisgICAgICAvKiBOb3QgYnVpbGRpbmcgYSBETEwsIG9yIHRoZSBETEwgZG9lc24ndCByZXF1aXJlIHNwZWNpZmljIGV4cG9ydA0KKyAgICAgICAqIGRlZmluaXRpb25zLg0KKyAgICAgICAqLw0KKyMgICAgIGRlZmluZSBQTkdfSU1QRVhQDQorIyAgZW5kaWYNCisjZW5kaWYNCisNCisvKiBObyB3YXJuaW5ncyBmb3IgcHJpdmF0ZSBvciBkZXByZWNhdGVkIGZ1bmN0aW9ucyBpbiB0aGUgYnVpbGQ6ICovDQorI2lmbmRlZiBQTkdfREVQUkVDQVRFRA0KKyMgIGRlZmluZSBQTkdfREVQUkVDQVRFRA0KKyNlbmRpZg0KKyNpZm5kZWYgUE5HX1BSSVZBVEUNCisjICBkZWZpbmUgUE5HX1BSSVZBVEUNCisjZW5kaWYNCisNCisvKiBTeW1ib2wgcHJlcHJvY2Vzc2luZyBzdXBwb3J0Lg0KKyAqDQorICogVG8gZW5hYmxlIGxpc3RpbmcgZ2xvYmFsLCBidXQgaW50ZXJuYWwsIHN5bWJvbHMgdGhlIGZvbGxvd2luZyBtYWNyb3Mgc2hvdWxkDQorICogYWx3YXlzIGJlIHVzZWQgdG8gZGVjbGFyZSBhbiBleHRlcm4gZGF0YSBvciBmdW5jdGlvbiBvYmplY3QgaW4gdGhpcyBmaWxlLg0KKyAqLw0KKyNpZm5kZWYgUE5HX0lOVEVSTkFMX0RBVEENCisjICBkZWZpbmUgUE5HX0lOVEVSTkFMX0RBVEEodHlwZSwgbmFtZSwgYXJyYXkpIGV4dGVybiB0eXBlIG5hbWUgYXJyYXkNCisjZW5kaWYNCisNCisjaWZuZGVmIFBOR19JTlRFUk5BTF9GVU5DVElPTg0KKyMgIGRlZmluZSBQTkdfSU5URVJOQUxfRlVOQ1RJT04odHlwZSwgbmFtZSwgYXJncywgYXR0cmlidXRlcylcDQorICAgICAgZXh0ZXJuIFBOR19GVU5DVElPTih0eXBlLCBuYW1lLCBhcmdzLCBQTkdfRU1QVFkgYXR0cmlidXRlcykNCisjZW5kaWYNCisNCisvKiBJZiBmbG9hdGluZyBvciBmaXhlZCBwb2ludCBBUElzIGFyZSBkaXNhYmxlZCB0aGV5IG1heSBzdGlsbCBiZSBjb21waWxlZA0KKyAqIGludGVybmFsbHkuICBUbyBoYW5kbGUgdGhpcyBtYWtlIHN1cmUgdGhleSBhcmUgZGVjbGFyZWQgYXMgdGhlIGFwcHJvcHJpYXRlDQorICogaW50ZXJuYWwgZXh0ZXJuIGZ1bmN0aW9uIChvdGhlcndpc2UgdGhlIHN5bWJvbCBwcmVmaXhpbmcgc3R1ZmYgd29uJ3Qgd29yayBhbmQNCisgKiB0aGUgZnVuY3Rpb25zIHdpbGwgYmUgdXNlZCB3aXRob3V0IGRlZmluaXRpb25zLikNCisgKg0KKyAqIE5PVEU6IGFsdGhvdWdoIGFsbCB0aGUgQVBJIGZ1bmN0aW9ucyBhcmUgZGVjbGFyZWQgaGVyZSB0aGV5IGFyZSBub3QgYWxsDQorICogYWN0dWFsbHkgYnVpbHQhICBCZWNhdXNlIHRoZSBkZWNsYXJhdGlvbnMgYXJlIHN0aWxsIG1hZGUgaXQgaXMgbmVjZXNzYXJ5IHRvDQorICogZmFrZSBvdXQgdHlwZXMgdGhhdCB0aGV5IGRlcGVuZCBvbi4NCisgKi8NCisjaWZuZGVmIFBOR19GUF9FWFBPUlQNCisjICBpZm5kZWYgUE5HX0ZMT0FUSU5HX1BPSU5UX1NVUFBPUlRFRA0KKyMgICAgIGRlZmluZSBQTkdfRlBfRVhQT1JUKG9yZGluYWwsIHR5cGUsIG5hbWUsIGFyZ3MpXA0KKyAgICAgICAgIFBOR19JTlRFUk5BTF9GVU5DVElPTih0eXBlLCBuYW1lLCBhcmdzLCBQTkdfRU1QVFkpOw0KKyMgICAgIGlmbmRlZiBQTkdfVkVSU0lPTl9JTkZPX09OTFkNCisgICAgICAgICB0eXBlZGVmIHN0cnVjdCBwbmdfaW5jb21wbGV0ZSBwbmdfZG91YmxlOw0KKyAgICAgICAgIHR5cGVkZWYgcG5nX2RvdWJsZSogICAgICAgICAgIHBuZ19kb3VibGVwOw0KKyAgICAgICAgIHR5cGVkZWYgY29uc3QgcG5nX2RvdWJsZSogICAgIHBuZ19jb25zdF9kb3VibGVwOw0KKyAgICAgICAgIHR5cGVkZWYgcG5nX2RvdWJsZSoqICAgICAgICAgIHBuZ19kb3VibGVwcDsNCisjICAgICBlbmRpZg0KKyMgIGVuZGlmDQorI2VuZGlmDQorI2lmbmRlZiBQTkdfRklYRURfRVhQT1JUDQorIyAgaWZuZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQNCisjICAgICBkZWZpbmUgUE5HX0ZJWEVEX0VYUE9SVChvcmRpbmFsLCB0eXBlLCBuYW1lLCBhcmdzKVwNCisgICAgICAgICBQTkdfSU5URVJOQUxfRlVOQ1RJT04odHlwZSwgbmFtZSwgYXJncywgUE5HX0VNUFRZKTsNCisjICBlbmRpZg0KKyNlbmRpZg0KKw0KKyNpbmNsdWRlICJwbmcuaCINCisNCisvKiBwbmdjb25mLmggZG9lcyBub3Qgc2V0IFBOR19ETExfRVhQT1JUIHVubGVzcyBpdCBpcyByZXF1aXJlZCwgc286ICovDQorI2lmbmRlZiBQTkdfRExMX0VYUE9SVA0KKyMgIGRlZmluZSBQTkdfRExMX0VYUE9SVA0KKyNlbmRpZg0KKw0KKy8qIFNFQ1VSSVRZIGFuZCBTQUZFVFk6DQorICoNCisgKiBCeSBkZWZhdWx0IGxpYnBuZyBpcyBidWlsdCB3aXRob3V0IGFueSBpbnRlcm5hbCBsaW1pdHMgb24gaW1hZ2Ugc2l6ZSwNCisgKiBpbmRpdmlkdWFsIGhlYXAgKHBuZ19tYWxsb2MpIGFsbG9jYXRpb25zIG9yIHRoZSB0b3RhbCBhbW91bnQgb2YgbWVtb3J5IHVzZWQuDQorICogSWYgUE5HX1NBRkVfTElNSVRTX1NVUFBPUlRFRCBpcyBkZWZpbmVkLCBob3dldmVyLCB0aGUgbGltaXRzIGJlbG93IGFyZSB1c2VkDQorICogKHVubGVzcyBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbikuICBUaGVzZSBsaW1pdHMgYXJlIGJlbGlldmVkIHRvIGJlIGZhaXJseQ0KKyAqIHNhZmUsIGJ1dCBidWlsZGVycyBvZiBzZWN1cmUgc3lzdGVtcyBzaG91bGQgdmVyaWZ5IHRoZSB2YWx1ZXMgYWdhaW5zdCB0aGUNCisgKiByZWFsIHN5c3RlbSBjYXBhYmlsaXRpZXMuDQorICovDQorI2lmZGVmIFBOR19TQUZFX0xJTUlUU19TVVBQT1JURUQNCisgICAvKiAnc2FmZScgbGltaXRzICovDQorIyAgaWZuZGVmIFBOR19VU0VSX1dJRFRIX01BWA0KKyMgICAgIGRlZmluZSBQTkdfVVNFUl9XSURUSF9NQVggMTAwMDAwMA0KKyMgIGVuZGlmDQorIyAgaWZuZGVmIFBOR19VU0VSX0hFSUdIVF9NQVgNCisjICAgICBkZWZpbmUgUE5HX1VTRVJfSEVJR0hUX01BWCAxMDAwMDAwDQorIyAgZW5kaWYNCisjICBpZm5kZWYgUE5HX1VTRVJfQ0hVTktfQ0FDSEVfTUFYDQorIyAgICAgZGVmaW5lIFBOR19VU0VSX0NIVU5LX0NBQ0hFX01BWCAxMjgNCisjICBlbmRpZg0KKyMgIGlmbmRlZiBQTkdfVVNFUl9DSFVOS19NQUxMT0NfTUFYDQorIyAgICAgZGVmaW5lIFBOR19VU0VSX0NIVU5LX01BTExPQ19NQVggODAwMDAwMA0KKyMgIGVuZGlmDQorI2Vsc2UNCisgICAvKiB2YWx1ZXMgZm9yIG5vIGxpbWl0cyAqLw0KKyMgIGlmbmRlZiBQTkdfVVNFUl9XSURUSF9NQVgNCisjICAgICBkZWZpbmUgUE5HX1VTRVJfV0lEVEhfTUFYIDB4N2ZmZmZmZmYNCisjICBlbmRpZg0KKyMgIGlmbmRlZiBQTkdfVVNFUl9IRUlHSFRfTUFYDQorIyAgICAgZGVmaW5lIFBOR19VU0VSX0hFSUdIVF9NQVggMHg3ZmZmZmZmZg0KKyMgIGVuZGlmDQorIyAgaWZuZGVmIFBOR19VU0VSX0NIVU5LX0NBQ0hFX01BWA0KKyMgICAgIGRlZmluZSBQTkdfVVNFUl9DSFVOS19DQUNIRV9NQVggMA0KKyMgIGVuZGlmDQorIyAgaWZuZGVmIFBOR19VU0VSX0NIVU5LX01BTExPQ19NQVgNCisjICAgICBkZWZpbmUgUE5HX1VTRVJfQ0hVTktfTUFMTE9DX01BWCAwDQorIyAgZW5kaWYNCisjZW5kaWYNCisNCisvKiBNb3ZlZCB0byBwbmdwcml2LmggYXQgbGlicG5nLTEuNS4wICovDQorLyogTk9URTogc29tZSBvZiB0aGVzZSBtYXkgaGF2ZSBiZWVuIHVzZWQgaW4gZXh0ZXJuYWwgYXBwbGljYXRpb25zIGFzDQorICogdGhlc2UgZGVmaW5pdGlvbnMgd2VyZSBleHBvc2VkIGluIHBuZ2NvbmYuaCBwcmlvciB0byAxLjUuDQorICovDQorDQorLyogSWYgeW91IGFyZSBydW5uaW5nIG9uIGEgbWFjaGluZSB3aGVyZSB5b3UgY2Fubm90IGFsbG9jYXRlIG1vcmUNCisgKiB0aGFuIDY0SyBvZiBtZW1vcnkgYXQgb25jZSwgdW5jb21tZW50IHRoaXMuICBXaGlsZSBsaWJwbmcgd2lsbCBub3QNCisgKiBub3JtYWxseSBuZWVkIHRoYXQgbXVjaCBtZW1vcnkgaW4gYSBjaHVuayAodW5sZXNzIHlvdSBsb2FkIHVwIGEgdmVyeQ0KKyAqIGxhcmdlIGZpbGUpLCB6bGliIG5lZWRzIHRvIGtub3cgaG93IGJpZyBvZiBhIGNodW5rIGl0IGNhbiB1c2UsIGFuZA0KKyAqIGxpYnBuZyB0aHVzIG1ha2VzIHN1cmUgdG8gY2hlY2sgYW55IG1lbW9yeSBhbGxvY2F0aW9uIHRvIHZlcmlmeSBpdA0KKyAqIHdpbGwgZml0IGludG8gbWVtb3J5Lg0KKyAqDQorICogemxpYiBwcm92aWRlcyAnTUFYU0VHXzY0Sycgd2hpY2gsIGlmIGRlZmluZWQsIGluZGljYXRlcyB0aGUNCisgKiBzYW1lIGxpbWl0IGFuZCBwbmdjb25mLmggKGFscmVhZHkgaW5jbHVkZWQpIHNldHMgdGhlIGxpbWl0DQorICogaWYgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcyBhcmUgZGV0ZWN0ZWQuDQorICovDQorI2lmIGRlZmluZWQoTUFYU0VHXzY0SykgJiYgIWRlZmluZWQoUE5HX01BWF9NQUxMT0NfNjRLKQ0KKyMgIGRlZmluZSBQTkdfTUFYX01BTExPQ182NEsNCisjZW5kaWYNCisNCisjaWZuZGVmIFBOR19VTlVTRUQNCisvKiBVbnVzZWQgZm9ybWFsIHBhcmFtZXRlciB3YXJuaW5ncyBhcmUgc2lsZW5jZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBtYWNybw0KKyAqIHdoaWNoIGlzIGV4cGVjdGVkIHRvIGhhdmUgbm8gYmFkIGVmZmVjdHMgb24gcGVyZm9ybWFuY2UgKG9wdGltaXppbmcNCisgKiBjb21waWxlcnMgd2lsbCBwcm9iYWJseSByZW1vdmUgaXQgZW50aXJlbHkpLiAgTm90ZSB0aGF0IGlmIHlvdSByZXBsYWNlDQorICogaXQgd2l0aCBzb21ldGhpbmcgb3RoZXIgdGhhbiB3aGl0ZXNwYWNlLCB5b3UgbXVzdCBpbmNsdWRlIHRoZSB0ZXJtaW5hdGluZw0KKyAqIHNlbWljb2xvbi4NCisgKi8NCisjICBkZWZpbmUgUE5HX1VOVVNFRChwYXJhbSkgKHZvaWQpcGFyYW07DQorI2VuZGlmDQorDQorLyogSnVzdCBhIGxpdHRsZSBjaGVjayB0aGF0IHNvbWVvbmUgaGFzbid0IHRyaWVkIHRvIGRlZmluZSBzb21ldGhpbmcNCisgKiBjb250cmFkaWN0b3J5Lg0KKyAqLw0KKyNpZiAoUE5HX1pCVUZfU0laRSA+IDY1NTM2TCkgJiYgZGVmaW5lZChQTkdfTUFYX01BTExPQ182NEspDQorIyAgdW5kZWYgUE5HX1pCVUZfU0laRQ0KKyMgIGRlZmluZSBQTkdfWkJVRl9TSVpFIDY1NTM2TA0KKyNlbmRpZg0KKw0KKy8qIElmIHdhcm5pbmdzIG9yIGVycm9ycyBhcmUgdHVybmVkIG9mZiB0aGUgY29kZSBpcyBkaXNhYmxlZCBvciByZWRpcmVjdGVkIGhlcmUuDQorICogRnJvbSAxLjUuNCBmdW5jdGlvbnMgaGF2ZSBiZWVuIGFkZGVkIHRvIGFsbG93IHZlcnkgbGltaXRlZCBmb3JtYXR0aW5nIG9mDQorICogZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMgLSB0aGlzIGNvZGUgd2lsbCBhbHNvIGJlIGRpc2FibGVkIGhlcmUuDQorICovDQorI2lmZGVmIFBOR19XQVJOSU5HU19TVVBQT1JURUQNCisjICBkZWZpbmUgUE5HX1dBUk5JTkdfUEFSQU1FVEVSUyhwKSBwbmdfd2FybmluZ19wYXJhbWV0ZXJzIHA7DQorI2Vsc2UNCisjICBkZWZpbmUgcG5nX3dhcm5pbmcoczEsczIpICgodm9pZCkoczEpKQ0KKyMgIGRlZmluZSBwbmdfY2h1bmtfd2FybmluZyhzMSxzMikgKCh2b2lkKShzMSkpDQorIyAgZGVmaW5lIHBuZ193YXJuaW5nX3BhcmFtZXRlcihwLG51bWJlcixzdHJpbmcpICgodm9pZCkwKQ0KKyMgIGRlZmluZSBwbmdfd2FybmluZ19wYXJhbWV0ZXJfdW5zaWduZWQocCxudW1iZXIsZm9ybWF0LHZhbHVlKSAoKHZvaWQpMCkNCisjICBkZWZpbmUgcG5nX3dhcm5pbmdfcGFyYW1ldGVyX3NpZ25lZChwLG51bWJlcixmb3JtYXQsdmFsdWUpICgodm9pZCkwKQ0KKyMgIGRlZmluZSBwbmdfZm9ybWF0dGVkX3dhcm5pbmcocHAscCxtZXNzYWdlKSAoKHZvaWQpKHBwKSkNCisjICBkZWZpbmUgUE5HX1dBUk5JTkdfUEFSQU1FVEVSUyhwKQ0KKyNlbmRpZg0KKyNpZm5kZWYgUE5HX0VSUk9SX1RFWFRfU1VQUE9SVEVEDQorIyAgZGVmaW5lIHBuZ19lcnJvcihzMSxzMikgcG5nX2VycihzMSkNCisjICBkZWZpbmUgcG5nX2NodW5rX2Vycm9yKHMxLHMyKSBwbmdfZXJyKHMxKQ0KKyMgIGRlZmluZSBwbmdfZml4ZWRfZXJyb3IoczEsczIpIHBuZ19lcnIoczEpDQorI2VuZGlmDQorDQorLyogQyBhbGxvd3MgdXAtY2FzdHMgZnJvbSAodm9pZCopIHRvIGFueSBwb2ludGVyIGFuZCAoY29uc3Qgdm9pZCopIHRvIGFueQ0KKyAqIHBvaW50ZXIgdG8gYSBjb25zdCBvYmplY3QuICBDKysgcmVnYXJkcyB0aGlzIGFzIGEgdHlwZSBlcnJvciBhbmQgcmVxdWlyZXMgYW4NCisgKiBleHBsaWNpdCwgc3RhdGljLCBjYXN0IGFuZCBwcm92aWRlcyB0aGUgc3RhdGljX2Nhc3Q8PiBydW5lIHRvIGVuc3VyZSB0aGF0DQorICogY29uc3QgaXMgbm90IGNhc3QgYXdheS4NCisgKi8NCisjaWZkZWYgX19jcGx1c3BsdXMNCisjICBkZWZpbmUgcG5nX3ZvaWRjYXN0KHR5cGUsIHZhbHVlKSBzdGF0aWNfY2FzdDx0eXBlPih2YWx1ZSkNCisjICBkZWZpbmUgcG5nX2NvbnN0Y2FzdCh0eXBlLCB2YWx1ZSkgY29uc3RfY2FzdDx0eXBlPih2YWx1ZSkNCisjICBkZWZpbmUgcG5nX2FsaWduY2FzdCh0eXBlLCB2YWx1ZSkgXA0KKyAgIHN0YXRpY19jYXN0PHR5cGU+KHN0YXRpY19jYXN0PHZvaWQqPih2YWx1ZSkpDQorIyAgZGVmaW5lIHBuZ19hbGlnbmNhc3Rjb25zdCh0eXBlLCB2YWx1ZSkgXA0KKyAgIHN0YXRpY19jYXN0PHR5cGU+KHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPih2YWx1ZSkpDQorI2Vsc2UNCisjICBkZWZpbmUgcG5nX3ZvaWRjYXN0KHR5cGUsIHZhbHVlKSAodmFsdWUpDQorIyAgZGVmaW5lIHBuZ19jb25zdGNhc3QodHlwZSwgdmFsdWUpICgodHlwZSkodmFsdWUpKQ0KKyMgIGRlZmluZSBwbmdfYWxpZ25jYXN0KHR5cGUsIHZhbHVlKSAoKHZvaWQqKSh2YWx1ZSkpDQorIyAgZGVmaW5lIHBuZ19hbGlnbmNhc3Rjb25zdCh0eXBlLCB2YWx1ZSkgKChjb25zdCB2b2lkKikodmFsdWUpKQ0KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLw0KKw0KKy8qIFNvbWUgZml4ZWQgcG9pbnQgQVBJcyBhcmUgc3RpbGwgcmVxdWlyZWQgZXZlbiBpZiBub3QgZXhwb3J0ZWQgYmVjYXVzZQ0KKyAqIHRoZXkgZ2V0IHVzZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgZmxvYXRpbmcgcG9pbnQgQVBJcy4gIFRoaXMgbWFnaWMNCisgKiBkZWFscyB3aXRoIHRoaXM6DQorICovDQorI2lmZGVmIFBOR19GSVhFRF9QT0lOVF9TVVBQT1JURUQNCisjICBkZWZpbmUgUE5HRkFQSSBQTkdBUEkNCisjZWxzZQ0KKyMgIGRlZmluZSBQTkdGQVBJIC8qIFBSSVZBVEUgKi8NCisjZW5kaWYNCisNCisjaWZuZGVmIFBOR19WRVJTSU9OX0lORk9fT05MWQ0KKy8qIE90aGVyIGRlZmluZXMgc3BlY2lmaWMgdG8gY29tcGlsZXJzIGNhbiBnbyBoZXJlLiAgVHJ5IHRvIGtlZXANCisgKiB0aGVtIGluc2lkZSBhbiBhcHByb3ByaWF0ZSBpZmRlZi9lbmRpZiBwYWlyIGZvciBwb3J0YWJpbGl0eS4NCisgKi8NCisjaWYgZGVmaW5lZChQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKSB8fFwNCisgICAgZGVmaW5lZChQTkdfRkxPQVRJTkdfQVJJVEhNRVRJQ19TVVBQT1JURUQpDQorICAgLyogcG5nLmMgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBBTlNJLUMgY29uc3RhbnRzIGlmIHRoZSBjb252ZXJzaW9uIG9mDQorICAgICogZmxvYXRpbmcgcG9pbnQgdG8gQVNDSUkgaXMgaW1wbGVtZW50ZWQgdGhlcmVpbjoNCisgICAgKg0KKyAgICAqICBEQkxfRElHICBNYXhpbXVtIG51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cyAoY2FuIGJlIHNldCB0byBhbnkgY29uc3RhbnQpDQorICAgICogIERCTF9NSU4gIFNtYWxsZXN0IG5vcm1hbGl6ZWQgZnAgbnVtYmVyIChjYW4gYmUgc2V0IHRvIGFuIGFyYml0cmFyeSB2YWx1ZSkNCisgICAgKiAgREJMX01BWCAgTWF4aW11bSBmbG9hdGluZyBwb2ludCBudW1iZXIgKGNhbiBiZSBzZXQgdG8gYW4gYXJiaXRyYXJ5IHZhbHVlKQ0KKyAgICAqLw0KKyMgIGluY2x1ZGUgPGZsb2F0Lmg+DQorDQorIyAgaWYgKGRlZmluZWQoX19NV0VSS1NfXykgJiYgZGVmaW5lZChtYWNpbnRvc2gpKSB8fCBkZWZpbmVkKGFwcGxlYykgfHwgXA0KKyAgICBkZWZpbmVkKFRISU5LX0MpIHx8IGRlZmluZWQoX19TQ19fKSB8fCBkZWZpbmVkKFRBUkdFVF9PU19NQUMpDQorICAgICAvKiBXZSBuZWVkIHRvIGNoZWNrIHRoYXQgPG1hdGguaD4gaGFzbid0IGFscmVhZHkgYmVlbiBpbmNsdWRlZCBlYXJsaWVyDQorICAgICAgKiBhcyBpdCBzZWVtcyBpdCBkb2Vzbid0IGFncmVlIHdpdGggPGZwLmg+LCB5ZXQgd2Ugc2hvdWxkIHJlYWxseSB1c2UNCisgICAgICAqIDxmcC5oPiBpZiBwb3NzaWJsZS4NCisgICAgICAqLw0KKyMgICAgaWYgIWRlZmluZWQoX19NQVRIX0hfXykgJiYgIWRlZmluZWQoX19NQVRIX0gpICYmICFkZWZpbmVkKF9fY21hdGhfXykNCisjICAgICAgaW5jbHVkZSA8ZnAuaD4NCisjICAgIGVuZGlmDQorIyAgZWxzZQ0KKyMgICAgaW5jbHVkZSA8bWF0aC5oPg0KKyMgIGVuZGlmDQorIyAgaWYgZGVmaW5lZChfQU1JR0EpICYmIGRlZmluZWQoX19TQVNDKSAmJiBkZWZpbmVkKF9NNjg4ODEpDQorICAgICAvKiBBbWlnYSBTQVMvQzogV2UgbXVzdCBpbmNsdWRlIGJ1aWx0aW4gRlBVIGZ1bmN0aW9ucyB3aGVuIGNvbXBpbGluZyB1c2luZw0KKyAgICAgICogTUFUSD02ODg4MQ0KKyAgICAgICovDQorIyAgICBpbmNsdWRlIDxtNjg4ODEuaD4NCisjICBlbmRpZg0KKyNlbmRpZg0KKw0KKy8qIFRoaXMgcHJvdmlkZXMgdGhlIG5vbi1BTlNJIChmYXIpIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzLiAqLw0KKyNpZiBkZWZpbmVkKF9fVFVSQk9DX18pICYmIGRlZmluZWQoX19NU0RPU19fKQ0KKyMgIGluY2x1ZGUgPG1lbS5oPg0KKyMgIGluY2x1ZGUgPGFsbG9jLmg+DQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dpbmRvd3MpIHx8IGRlZmluZWQoX1dJTkRPV1MpIHx8IFwNCisgICAgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKQ0KKyMgIGluY2x1ZGUgPHdpbmRvd3MuaD4gIC8qIGRlZmluZXMgX1dJTkRPV1NfIG1hY3JvICovDQorI2VuZGlmDQorI2VuZGlmIC8qIFBOR19WRVJTSU9OX0lORk9fT05MWSAqLw0KKw0KKy8qIE1vdmVkIGhlcmUgYXJvdW5kIDEuNS4wYmV0YTM2IGZyb20gcG5nY29uZi5oICovDQorLyogVXNlcnMgbWF5IHdhbnQgdG8gdXNlIHRoZXNlIHNvIHRoZXkgYXJlIG5vdCBwcml2YXRlLiAgQW55IGxpYnJhcnkNCisgKiBmdW5jdGlvbnMgdGhhdCBhcmUgcGFzc2VkIGZhciBkYXRhIG11c3QgYmUgbW9kZWwtaW5kZXBlbmRlbnQuDQorICovDQorDQorLyogTWVtb3J5IG1vZGVsL3BsYXRmb3JtIGluZGVwZW5kZW50IGZucyAqLw0KKyNpZm5kZWYgUE5HX0FCT1JUDQorIyAgaWZkZWYgX1dJTkRPV1NfDQorIyAgICBkZWZpbmUgUE5HX0FCT1JUKCkgRXhpdFByb2Nlc3MoMCkNCisjICBlbHNlDQorIyAgICBkZWZpbmUgUE5HX0FCT1JUKCkgYWJvcnQoKQ0KKyMgIGVuZGlmDQorI2VuZGlmDQorDQorLyogVGhlc2UgbWFjcm9zIG1heSBuZWVkIHRvIGJlIGFyY2hpdGVjdHVyZSBkZXBlbmRlbnQuICovDQorI2RlZmluZSBQTkdfQUxJR05fTk9ORSAgIDAgLyogZG8gbm90IHVzZSBkYXRhIGFsaWdubWVudCAqLw0KKyNkZWZpbmUgUE5HX0FMSUdOX0FMV0FZUyAxIC8qIGFzc3VtZSB1bmFsaWduZWQgYWNjZXNzZXMgYXJlIE9LICovDQorI2lmZGVmIG9mZnNldG9mDQorIyAgZGVmaW5lIFBOR19BTElHTl9PRkZTRVQgMiAvKiB1c2Ugb2Zmc2V0b2YgdG8gZGV0ZXJtaW5lIGFsaWdubWVudCAqLw0KKyNlbHNlDQorIyAgZGVmaW5lIFBOR19BTElHTl9PRkZTRVQgLTEgLyogcHJldmVudCB0aGUgdXNlIG9mIHRoaXMgKi8NCisjZW5kaWYNCisjZGVmaW5lIFBOR19BTElHTl9TSVpFICAgMyAvKiB1c2Ugc2l6ZW9mIHRvIGRldGVybWluZSBhbGlnbm1lbnQgKi8NCisNCisjaWZuZGVmIFBOR19BTElHTl9UWVBFDQorICAgLyogRGVmYXVsdCB0byB1c2luZyBhbGlnbmVkIGFjY2VzcyBvcHRpbWl6YXRpb25zIGFuZCByZXF1aXJpbmcgYWxpZ25tZW50IHRvIGENCisgICAgKiBtdWx0aXBsZSBvZiB0aGUgZGF0YSB0eXBlIHNpemUuICBPdmVycmlkZSBpbiBhIGNvbXBpbGVyIHNwZWNpZmljIGZhc2hpb24NCisgICAgKiBpZiBuZWNlc3NhcnkgYnkgaW5zZXJ0aW5nIHRlc3RzIGhlcmU6DQorICAgICovDQorIyAgZGVmaW5lIFBOR19BTElHTl9UWVBFIFBOR19BTElHTl9TSVpFDQorI2VuZGlmDQorDQorI2lmIFBOR19BTElHTl9UWVBFID09IFBOR19BTElHTl9TSVpFDQorICAgLyogVGhpcyBpcyB1c2VkIGJlY2F1c2UgaW4gc29tZSBjb21waWxlciBpbXBsZW1lbnRhdGlvbnMgbm9uLWFsaWduZWQNCisgICAgKiBzdHJ1Y3R1cmUgbWVtYmVycyBhcmUgc3VwcG9ydGVkLCBzbyB0aGUgb2Zmc2V0b2YgYXBwcm9hY2ggYmVsb3cgZmFpbHMuDQorICAgICogU2V0IFBOR19BTElHTl9TSVpFPTAgZm9yIGNvbXBpbGVyIGNvbWJpbmF0aW9ucyB3aGVyZSB1bmFsaWduZWQgYWNjZXNzDQorICAgICogaXMgZ29vZCBmb3IgcGVyZm9ybWFuY2UuICBEbyBub3QgZG8gdGhpcyB1bmxlc3MgeW91IGhhdmUgdGVzdGVkIHRoZSByZXN1bHQNCisgICAgKiBhbmQgdW5kZXJzdGFuZCBpdC4NCisgICAgKi8NCisjICBkZWZpbmUgcG5nX2FsaWdub2YodHlwZSkgKHNpemVvZiAodHlwZSkpDQorI2Vsc2UNCisjICBpZiBQTkdfQUxJR05fVFlQRSA9PSBQTkdfQUxJR05fT0ZGU0VUDQorIyAgICAgZGVmaW5lIHBuZ19hbGlnbm9mKHR5cGUpIG9mZnNldG9mKHN0cnVjdHtjaGFyIGM7IHR5cGUgdDt9LCB0KQ0KKyMgIGVsc2UNCisjICAgICBpZiBQTkdfQUxJR05fVFlQRSA9PSBQTkdfQUxJR05fQUxXQVlTDQorIyAgICAgICAgZGVmaW5lIHBuZ19hbGlnbm9mKHR5cGUpICgxKQ0KKyMgICAgIGVuZGlmDQorICAgICAgLyogRWxzZSBsZWF2ZSBwbmdfYWxpZ25vZiB1bmRlZmluZWQgdG8gcHJldmVudCB1c2UgdGhlcmVvZiAqLw0KKyMgIGVuZGlmDQorI2VuZGlmDQorDQorLyogVGhpcyBpbXBsaWNpdGx5IGFzc3VtZXMgYWxpZ25tZW50IGlzIGFsd2F5cyB0byBhIHBvd2VyIG9mIDIuICovDQorI2lmZGVmIHBuZ19hbGlnbm9mDQorIyAgZGVmaW5lIHBuZ19pc2FsaWduZWQocHRyLCB0eXBlKVwNCisgICAoKCgoY29uc3QgY2hhciopcHRyLShjb25zdCBjaGFyKikwKSAmIChwbmdfYWxpZ25vZih0eXBlKS0xKSkgPT0gMCkNCisjZWxzZQ0KKyMgIGRlZmluZSBwbmdfaXNhbGlnbmVkKHB0ciwgdHlwZSkgMA0KKyNlbmRpZg0KKw0KKy8qIEVuZCBvZiBtZW1vcnkgbW9kZWwvcGxhdGZvcm0gaW5kZXBlbmRlbnQgc3VwcG9ydCAqLw0KKy8qIEVuZCBvZiAxLjUuMGJldGEzNiBtb3ZlIGZyb20gcG5nY29uZi5oICovDQorDQorLyogQ09OU1RBTlRTIGFuZCBVVElMSVRZIE1BQ1JPUw0KKyAqIFRoZXNlIGFyZSB1c2VkIGludGVybmFsbHkgYnkgbGlicG5nIGFuZCBub3QgZXhwb3NlZCBpbiB0aGUgQVBJDQorICovDQorDQorLyogVmFyaW91cyBtb2RlcyBvZiBvcGVyYXRpb24uICBOb3RlIHRoYXQgYWZ0ZXIgYW4gaW5pdCwgbW9kZSBpcyBzZXQgdG8NCisgKiB6ZXJvIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgc3RydWN0dXJlIGlzIGNyZWF0ZWQuICBUaHJlZSBvZiB0aGVzZQ0KKyAqIGFyZSBkZWZpbmVkIGluIHBuZy5oIGJlY2F1c2UgdGhleSBuZWVkIHRvIGJlIHZpc2libGUgdG8gYXBwbGljYXRpb25zDQorICogdGhhdCBjYWxsIHBuZ19zZXRfdW5rbm93bl9jaHVuaygpLg0KKyAqLw0KKy8qICNkZWZpbmUgUE5HX0hBVkVfSUhEUiAgICAgICAgICAgIDB4MDEgKGRlZmluZWQgaW4gcG5nLmgpICovDQorLyogI2RlZmluZSBQTkdfSEFWRV9QTFRFICAgICAgICAgICAgMHgwMiAoZGVmaW5lZCBpbiBwbmcuaCkgKi8NCisjZGVmaW5lIFBOR19IQVZFX0lEQVQgICAgICAgICAgICAgICAweDA0DQorLyogI2RlZmluZSBQTkdfQUZURVJfSURBVCAgICAgICAgICAgMHgwOCAoZGVmaW5lZCBpbiBwbmcuaCkgKi8NCisjZGVmaW5lIFBOR19IQVZFX0lFTkQgICAgICAgICAgICAgICAweDEwDQorICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgMHgyMCAodW51c2VkKSAqLw0KKyAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgIDB4NDAgKHVudXNlZCkgKi8NCisgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAweDgwICh1bnVzZWQpICovDQorI2RlZmluZSBQTkdfSEFWRV9DSFVOS19IRUFERVIgICAgICAweDEwMA0KKyNkZWZpbmUgUE5HX1dST1RFX3RJTUUgICAgICAgICAgICAgMHgyMDANCisjZGVmaW5lIFBOR19XUk9URV9JTkZPX0JFRk9SRV9QTFRFIDB4NDAwDQorI2RlZmluZSBQTkdfQkFDS0dST1VORF9JU19HUkFZICAgICAweDgwMA0KKyNkZWZpbmUgUE5HX0hBVkVfUE5HX1NJR05BVFVSRSAgICAweDEwMDANCisjZGVmaW5lIFBOR19IQVZFX0NIVU5LX0FGVEVSX0lEQVQgMHgyMDAwIC8qIEhhdmUgYW5vdGhlciBjaHVuayBhZnRlciBJREFUICovDQorICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgIDB4NDAwMCAodW51c2VkKSAqLw0KKyNkZWZpbmUgUE5HX0lTX1JFQURfU1RSVUNUICAgICAgICAweDgwMDAgLyogRWxzZSBpcyBhIHdyaXRlIHN0cnVjdCAqLw0KKw0KKy8qIEZsYWdzIGZvciB0aGUgdHJhbnNmb3JtYXRpb25zIHRoZSBQTkcgbGlicmFyeSBkb2VzIG9uIHRoZSBpbWFnZSBkYXRhICovDQorI2RlZmluZSBQTkdfQkdSICAgICAgICAgICAgICAgICAweDAwMDENCisjZGVmaW5lIFBOR19JTlRFUkxBQ0UgICAgICAgICAgIDB4MDAwMg0KKyNkZWZpbmUgUE5HX1BBQ0sgICAgICAgICAgICAgICAgMHgwMDA0DQorI2RlZmluZSBQTkdfU0hJRlQgICAgICAgICAgICAgICAweDAwMDgNCisjZGVmaW5lIFBOR19TV0FQX0JZVEVTICAgICAgICAgIDB4MDAxMA0KKyNkZWZpbmUgUE5HX0lOVkVSVF9NT05PICAgICAgICAgMHgwMDIwDQorI2RlZmluZSBQTkdfUVVBTlRJWkUgICAgICAgICAgICAweDAwNDANCisjZGVmaW5lIFBOR19DT01QT1NFICAgICAgICAgICAgIDB4MDA4MCAgICAgLyogV2FzIFBOR19CQUNLR1JPVU5EICovDQorI2RlZmluZSBQTkdfQkFDS0dST1VORF9FWFBBTkQgICAweDAxMDANCisjZGVmaW5lIFBOR19FWFBBTkRfMTYgICAgICAgICAgIDB4MDIwMCAgICAgLyogQWRkZWQgdG8gbGlicG5nIDEuNS4yICovDQorI2RlZmluZSBQTkdfMTZfVE9fOCAgICAgICAgICAgICAweDA0MDAgICAgIC8qIEJlY29tZXMgJ2Nob3AnIGluIDEuNS40ICovDQorI2RlZmluZSBQTkdfUkdCQSAgICAgICAgICAgICAgICAweDA4MDANCisjZGVmaW5lIFBOR19FWFBBTkQgICAgICAgICAgICAgIDB4MTAwMA0KKyNkZWZpbmUgUE5HX0dBTU1BICAgICAgICAgICAgICAgMHgyMDAwDQorI2RlZmluZSBQTkdfR1JBWV9UT19SR0IgICAgICAgICAweDQwMDANCisjZGVmaW5lIFBOR19GSUxMRVIgICAgICAgICAgICAgIDB4ODAwMA0KKyNkZWZpbmUgUE5HX1BBQ0tTV0FQICAgICAgICAgICAweDEwMDAwDQorI2RlZmluZSBQTkdfU1dBUF9BTFBIQSAgICAgICAgIDB4MjAwMDANCisjZGVmaW5lIFBOR19TVFJJUF9BTFBIQSAgICAgICAgMHg0MDAwMA0KKyNkZWZpbmUgUE5HX0lOVkVSVF9BTFBIQSAgICAgICAweDgwMDAwDQorI2RlZmluZSBQTkdfVVNFUl9UUkFOU0ZPUk0gICAgMHgxMDAwMDANCisjZGVmaW5lIFBOR19SR0JfVE9fR1JBWV9FUlIgICAweDIwMDAwMA0KKyNkZWZpbmUgUE5HX1JHQl9UT19HUkFZX1dBUk4gIDB4NDAwMDAwDQorI2RlZmluZSBQTkdfUkdCX1RPX0dSQVkgICAgICAgMHg2MDAwMDAgLyogdHdvIGJpdHMsIFJHQl9UT19HUkFZX0VSUnxXQVJOICovDQorI2RlZmluZSBQTkdfRU5DT0RFX0FMUEhBICAgICAgMHg4MDAwMDAgLyogQWRkZWQgdG8gbGlicG5nLTEuNS40ICovDQorI2RlZmluZSBQTkdfQUREX0FMUEhBICAgICAgICAgMHgxMDAwMDAwIC8qIEFkZGVkIHRvIGxpYnBuZy0xLjIuNyAqLw0KKyNkZWZpbmUgUE5HX0VYUEFORF90Uk5TICAgICAgIDB4MjAwMDAwMCAvKiBBZGRlZCB0byBsaWJwbmctMS4yLjkgKi8NCisjZGVmaW5lIFBOR19TQ0FMRV8xNl9UT184ICAgICAweDQwMDAwMDAgLyogQWRkZWQgdG8gbGlicG5nLTEuNS40ICovDQorICAgICAgICAgICAgICAgICAgICAgICAvKiAgIDB4ODAwMDAwMCB1bnVzZWQgKi8NCisgICAgICAgICAgICAgICAgICAgICAgIC8qICAweDEwMDAwMDAwIHVudXNlZCAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgLyogIDB4MjAwMDAwMDAgdW51c2VkICovDQorICAgICAgICAgICAgICAgICAgICAgICAvKiAgMHg0MDAwMDAwMCB1bnVzZWQgKi8NCisvKiBGbGFncyBmb3IgcG5nX2NyZWF0ZV9zdHJ1Y3QgKi8NCisjZGVmaW5lIFBOR19TVFJVQ1RfUE5HICAgMHgwMDAxDQorI2RlZmluZSBQTkdfU1RSVUNUX0lORk8gIDB4MDAwMg0KKw0KKy8qIFNjYWxpbmcgZmFjdG9yIGZvciBmaWx0ZXIgaGV1cmlzdGljIHdlaWdodGluZyBjYWxjdWxhdGlvbnMgKi8NCisjZGVmaW5lIFBOR19XRUlHSFRfRkFDVE9SICgxPDwoUE5HX1dFSUdIVF9TSElGVCkpDQorI2RlZmluZSBQTkdfQ09TVF9GQUNUT1IgKDE8PChQTkdfQ09TVF9TSElGVCkpDQorDQorLyogRmxhZ3MgZm9yIHRoZSBwbmdfcHRyLT5mbGFncyByYXRoZXIgdGhhbiBkZWNsYXJpbmcgYSBieXRlIGZvciBlYWNoIG9uZSAqLw0KKyNkZWZpbmUgUE5HX0ZMQUdfWkxJQl9DVVNUT01fU1RSQVRFR1kgICAgIDB4MDAwMQ0KKyNkZWZpbmUgUE5HX0ZMQUdfWlNUUkVBTV9JTklUSUFMSVpFRCAgICAgIDB4MDAwMiAvKiBBZGRlZCB0byBsaWJwbmctMS42LjAgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAweDAwMDQgICAgdW51c2VkICovDQorI2RlZmluZSBQTkdfRkxBR19aU1RSRUFNX0VOREVEICAgICAgICAgICAgMHgwMDA4IC8qIEFkZGVkIHRvIGxpYnBuZy0xLjYuMCAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgIDB4MDAxMCAgICB1bnVzZWQgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAweDAwMjAgICAgdW51c2VkICovDQorI2RlZmluZSBQTkdfRkxBR19ST1dfSU5JVCAgICAgICAgICAgICAgICAgMHgwMDQwDQorI2RlZmluZSBQTkdfRkxBR19GSUxMRVJfQUZURVIgICAgICAgICAgICAgMHgwMDgwDQorI2RlZmluZSBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX1VTRSAgICAgICAgMHgwMTAwDQorI2RlZmluZSBQTkdfRkxBR19DUkNfQU5DSUxMQVJZX05PV0FSTiAgICAgMHgwMjAwDQorI2RlZmluZSBQTkdfRkxBR19DUkNfQ1JJVElDQUxfVVNFICAgICAgICAgMHgwNDAwDQorI2RlZmluZSBQTkdfRkxBR19DUkNfQ1JJVElDQUxfSUdOT1JFICAgICAgMHgwODAwDQorI2RlZmluZSBQTkdfRkxBR19BU1NVTUVfc1JHQiAgICAgICAgICAgICAgMHgxMDAwIC8qIEFkZGVkIHRvIGxpYnBuZy0xLjUuNCAqLw0KKyNkZWZpbmUgUE5HX0ZMQUdfT1BUSU1JWkVfQUxQSEEgICAgICAgICAgIDB4MjAwMCAvKiBBZGRlZCB0byBsaWJwbmctMS41LjQgKi8NCisjZGVmaW5lIFBOR19GTEFHX0RFVEVDVF9VTklOSVRJQUxJWkVEICAgICAweDQwMDAgLyogQWRkZWQgdG8gbGlicG5nLTEuNS40ICovDQorLyogI2RlZmluZSBQTkdfRkxBR19LRUVQX1VOS05PV05fQ0hVTktTICAgICAgMHg4MDAwICovDQorLyogI2RlZmluZSBQTkdfRkxBR19LRUVQX1VOU0FGRV9DSFVOS1MgICAgICAweDEwMDAwICovDQorI2RlZmluZSBQTkdfRkxBR19MSUJSQVJZX01JU01BVENIICAgICAgICAweDIwMDAwDQorI2RlZmluZSBQTkdfRkxBR19TVFJJUF9FUlJPUl9OVU1CRVJTICAgICAweDQwMDAwDQorI2RlZmluZSBQTkdfRkxBR19TVFJJUF9FUlJPUl9URVhUICAgICAgICAweDgwMDAwDQorI2RlZmluZSBQTkdfRkxBR19CRU5JR05fRVJST1JTX1dBUk4gICAgIDB4MTAwMDAwIC8qIEFkZGVkIHRvIGxpYnBuZy0xLjQuMCAqLw0KKyNkZWZpbmUgUE5HX0ZMQUdfQVBQX1dBUk5JTkdTX1dBUk4gICAgICAweDIwMDAwMCAvKiBBZGRlZCB0byBsaWJwbmctMS42LjAgKi8NCisjZGVmaW5lIFBOR19GTEFHX0FQUF9FUlJPUlNfV0FSTiAgICAgICAgMHg0MDAwMDAgLyogQWRkZWQgdG8gbGlicG5nLTEuNi4wICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIDB4ODAwMDAwICAgIHVudXNlZCAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIDB4MTAwMDAwMCAgICB1bnVzZWQgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAweDIwMDAwMDAgICAgdW51c2VkICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgMHg0MDAwMDAwICAgIHVudXNlZCAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIDB4ODAwMDAwMCAgICB1bnVzZWQgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDB4MTAwMDAwMDAgICAgdW51c2VkICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAweDIwMDAwMDAwICAgIHVudXNlZCAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMHg0MDAwMDAwMCAgICB1bnVzZWQgKi8NCisNCisjZGVmaW5lIFBOR19GTEFHX0NSQ19BTkNJTExBUllfTUFTSyAoUE5HX0ZMQUdfQ1JDX0FOQ0lMTEFSWV9VU0UgfCBcDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19GTEFHX0NSQ19BTkNJTExBUllfTk9XQVJOKQ0KKw0KKyNkZWZpbmUgUE5HX0ZMQUdfQ1JDX0NSSVRJQ0FMX01BU0sgIChQTkdfRkxBR19DUkNfQ1JJVElDQUxfVVNFIHwgXA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTkdfRkxBR19DUkNfQ1JJVElDQUxfSUdOT1JFKQ0KKw0KKyNkZWZpbmUgUE5HX0ZMQUdfQ1JDX01BU0sgICAgICAgICAgIChQTkdfRkxBR19DUkNfQU5DSUxMQVJZX01BU0sgfCBcDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBOR19GTEFHX0NSQ19DUklUSUNBTF9NQVNLKQ0KKw0KKy8qIFNhdmUgdHlwaW5nIGFuZCBtYWtlIGNvZGUgZWFzaWVyIHRvIHVuZGVyc3RhbmQgKi8NCisNCisjZGVmaW5lIFBOR19DT0xPUl9ESVNUKGMxLCBjMikgKGFicygoaW50KSgoYzEpLnJlZCkgLSAoaW50KSgoYzIpLnJlZCkpICsgXA0KKyAgIGFicygoaW50KSgoYzEpLmdyZWVuKSAtIChpbnQpKChjMikuZ3JlZW4pKSArIFwNCisgICBhYnMoKGludCkoKGMxKS5ibHVlKSAtIChpbnQpKChjMikuYmx1ZSkpKQ0KKw0KKy8qIEFkZGVkIHRvIGxpYnBuZy0xLjYuMDogc2NhbGUgYSAxNi1iaXQgdmFsdWUgaW4gdGhlIHJhbmdlIDAuLjY1NTM1IHRvIDAuLjI1NQ0KKyAqIGJ5IGRpdmlkaW5nIGJ5IDI1NyAqd2l0aCByb3VuZGluZyouICBUaGlzIG1hY3JvIGlzIGV4YWN0IGZvciB0aGUgZ2l2ZW4gcmFuZ2UuDQorICogU2VlIHRoZSBkaXNjb3Vyc2UgaW4gcG5ncnRyYW4uYyBwbmdfZG9fc2NhbGVfMTZfdG9fOC4gIFRoZSB2YWx1ZXMgaW4gdGhlDQorICogbWFjcm8gd2VyZSBlc3RhYmxpc2hlZCBieSBleHBlcmltZW50IChtb2RpZnlpbmcgdGhlIGFkZGVkIHZhbHVlKS4gIFRoZSBtYWNybw0KKyAqIGhhcyBhIHNlY29uZCB2YXJpYW50IHRoYXQgdGFrZXMgYSB2YWx1ZSBhbHJlYWR5IHNjYWxlZCBieSAyNTUgYW5kIGRpdmlkZXMgYnkNCisgKiA2NTUzNSAtIHRoaXMgaGFzIGEgbWF4aW11bSBlcnJvciBvZiAuNTAyLiAgT3ZlciB0aGUgcmFuZ2UgMC4uNjU1MzUqNjU1MzUgaXQNCisgKiBvbmx5IGdpdmVzIG9mZi1ieS1vbmUgZXJyb3JzIGFuZCBvbmx5IGZvciAwLjUlICgxIGluIDIwMCkgb2YgdGhlIHZhbHVlcy4NCisgKi8NCisjZGVmaW5lIFBOR19ESVY2NTUzNSh2MjQpICgoKHYyNCkgKyAzMjg5NSkgPj4gMTYpDQorI2RlZmluZSBQTkdfRElWMjU3KHYxNikgUE5HX0RJVjY1NTM1KChwbmdfdWludF8zMikodjE2KSAqIDI1NSkNCisNCisvKiBBZGRlZCB0byBsaWJwbmctMS4yLjYgSkIgKi8NCisjZGVmaW5lIFBOR19ST1dCWVRFUyhwaXhlbF9iaXRzLCB3aWR0aCkgXA0KKyAgICAoKHBpeGVsX2JpdHMpID49IDggPyBcDQorICAgICgocG5nX3NpemVfdCkod2lkdGgpICogKCgocG5nX3NpemVfdCkocGl4ZWxfYml0cykpID4+IDMpKSA6IFwNCisgICAgKCggKChwbmdfc2l6ZV90KSh3aWR0aCkgKiAoKHBuZ19zaXplX3QpKHBpeGVsX2JpdHMpKSkgKyA3KSA+PiAzKSApDQorDQorLyogUE5HX09VVF9PRl9SQU5HRSByZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgb3V0c2lkZSB0aGUgcmFuZ2UNCisgKiBpZGVhbC1kZWx0YS4uaWRlYWwrZGVsdGEuICBFYWNoIGFyZ3VtZW50IGlzIGV2YWx1YXRlZCB0d2ljZS4NCisgKiAiaWRlYWwiIGFuZCAiZGVsdGEiIHNob3VsZCBiZSBjb25zdGFudHMsIG5vcm1hbGx5IHNpbXBsZQ0KKyAqIGludGVnZXJzLCAidmFsdWUiIGEgdmFyaWFibGUuIEFkZGVkIHRvIGxpYnBuZy0xLjIuNiBKQg0KKyAqLw0KKyNkZWZpbmUgUE5HX09VVF9PRl9SQU5HRSh2YWx1ZSwgaWRlYWwsIGRlbHRhKSBcDQorICAgKCAodmFsdWUpIDwgKGlkZWFsKS0oZGVsdGEpIHx8ICh2YWx1ZSkgPiAoaWRlYWwpKyhkZWx0YSkgKQ0KKw0KKy8qIENvbnZlcnNpb25zIGJldHdlZW4gZml4ZWQgYW5kIGZsb2F0aW5nIHBvaW50LCBvbmx5IGRlZmluZWQgaWYNCisgKiByZXF1aXJlZCAodG8gbWFrZSBzdXJlIHRoZSBjb2RlIGRvZXNuJ3QgYWNjaWRlbnRhbGx5IHVzZSBmbG9hdA0KKyAqIHdoZW4gaXQgaXMgc3VwcG9zZWRseSBkaXNhYmxlZC4pDQorICovDQorI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQNCisvKiBUaGUgZmxvYXRpbmcgcG9pbnQgY29udmVyc2lvbiBjYW4ndCBvdmVyZmxvdywgdGhvdWdoIGl0IGNhbiBhbmQNCisgKiBkb2VzIGxvc2UgYWNjdXJhY3kgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbmFsIGZpeGVkIHBvaW50IHZhbHVlLg0KKyAqIEluIHByYWN0aWNlIHRoaXMgZG9lc24ndCBtYXR0ZXIgYmVjYXVzZSBwbmdfZml4ZWRfcG9pbnQgb25seQ0KKyAqIHN0b3JlcyBudW1iZXJzIHdpdGggdmVyeSBsb3cgcHJlY2lzaW9uLiAgVGhlIHBuZ19wdHIgYW5kIHMNCisgKiBhcmd1bWVudHMgYXJlIHVudXNlZCBieSBkZWZhdWx0IGJ1dCBhcmUgdGhlcmUgaW4gY2FzZSBlcnJvcg0KKyAqIGNoZWNraW5nIGJlY29tZXMgYSByZXF1aXJlbWVudC4NCisgKi8NCisjZGVmaW5lIHBuZ19mbG9hdChwbmdfcHRyLCBmaXhlZCwgcykgKC4wMDAwMSAqIChmaXhlZCkpDQorDQorLyogVGhlIGZpeGVkIHBvaW50IGNvbnZlcnNpb24gcGVyZm9ybXMgcmFuZ2UgY2hlY2tpbmcgYW5kIGV2YWx1YXRlcw0KKyAqIGl0cyBhcmd1bWVudCBtdWx0aXBsZSB0aW1lcywgc28gbXVzdCBiZSB1c2VkIHdpdGggY2FyZS4gIFRoZQ0KKyAqIHJhbmdlIGNoZWNraW5nIHVzZXMgdGhlIFBORyBzcGVjaWZpY2F0aW9uIHZhbHVlcyBmb3IgYSBzaWduZWQNCisgKiAzMiBiaXQgZml4ZWQgcG9pbnQgdmFsdWUgZXhjZXB0IHRoYXQgdGhlIHZhbHVlcyBhcmUgZGVsaWJlcmF0ZWx5DQorICogcm91bmRlZC10by16ZXJvIHRvIGFuIGludGVncmFsIHZhbHVlIC0gMjE0NzQgKDIxNDc0LjgzIGlzIHJvdWdobHkNCisgKiAoMl4zMS0xKSAqIDEwMDAwMCkuICdzJyBpcyBhIHN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGUgdmFsdWUgYmVpbmcNCisgKiBjb252ZXJ0ZWQuDQorICoNCisgKiBOT1RFOiB0aGlzIG1hY3JvIHdpbGwgcmFpc2UgYSBwbmdfZXJyb3IgaWYgdGhlIHJhbmdlIGNoZWNrIGZhaWxzLA0KKyAqIHRoZXJlZm9yZSBpdCBpcyBub3JtYWxseSBvbmx5IGFwcHJvcHJpYXRlIHRvIHVzZSB0aGlzIG9uIHZhbHVlcw0KKyAqIHRoYXQgY29tZSBmcm9tIEFQSSBjYWxscyBvciBvdGhlciBzb3VyY2VzIHdoZXJlIGFuIG91dCBvZiByYW5nZQ0KKyAqIGVycm9yIGluZGljYXRlcyBhIHByb2dyYW1taW5nIGVycm9yLCBub3QgYSBkYXRhIGVycm9yIQ0KKyAqDQorICogTk9URTogYnkgZGVmYXVsdCB0aGlzIGlzIG9mZiAtIHRoZSBtYWNybyBpcyBub3QgdXNlZCAtIGJlY2F1c2UgdGhlDQorICogZnVuY3Rpb24gY2FsbCBzYXZlcyBhIGxvdCBvZiBjb2RlLg0KKyAqLw0KKyNpZmRlZiBQTkdfRklYRURfUE9JTlRfTUFDUk9fU1VQUE9SVEVEDQorI2RlZmluZSBwbmdfZml4ZWQocG5nX3B0ciwgZnAsIHMpICgoZnApIDw9IDIxNDc0ICYmIChmcCkgPj0gLTIxNDc0ID9cDQorICAgICgocG5nX2ZpeGVkX3BvaW50KSgxMDAwMDAgKiAoZnApKSkgOiAocG5nX2ZpeGVkX2Vycm9yKHBuZ19wdHIsIHMpLDApKQ0KKyNlbmRpZg0KKy8qIGVsc2UgdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24gaXMgZGVmaW5lZCBiZWxvdywgaW5zaWRlIHRoZSBzY29wZSBvZiB0aGUNCisgKiBjcGx1c3BsdXMgdGVzdC4NCisgKi8NCisjZW5kaWYNCisNCisvKiBDb25zdGFudHMgZm9yIGtub3duIGNodW5rIHR5cGVzLiAgSWYgeW91IG5lZWQgdG8gYWRkIGEgY2h1bmssIGRlZmluZSB0aGUgbmFtZQ0KKyAqIGhlcmUuICBGb3IgaGlzdG9yaWNhbCByZWFzb25zIHRoZXNlIGNvbnN0YW50cyBoYXZlIHRoZSBmb3JtIHBuZ188bmFtZT47IGkuZS4NCisgKiB0aGUgcHJlZml4IGlzIGxvd2VyIGNhc2UuICBQbGVhc2UgdXNlIGRlY2ltYWwgdmFsdWVzIGFzIHRoZSBwYXJhbWV0ZXJzIHRvDQorICogbWF0Y2ggdGhlIElTTyBQTkcgc3BlY2lmaWNhdGlvbiBhbmQgdG8gYXZvaWQgcmVseWluZyBvbiB0aGUgQyBsb2NhbGUNCisgKiBpbnRlcnByZXRhdGlvbiBvZiBjaGFyYWN0ZXIgdmFsdWVzLg0KKyAqDQorICogUHJpb3IgdG8gMS41LjYgdGhlc2UgY29uc3RhbnRzIHdlcmUgc3RyaW5ncywgYXMgb2YgMS41LjYgcG5nX3VpbnRfMzIgdmFsdWVzDQorICogYXJlIGNvbXB1dGVkIGFuZCBhIG5ldyBtYWNybyAoUE5HX1NUUklOR19GUk9NX0NIVU5LKSBhZGRlZCB0byBhbGxvdyBhIHN0cmluZw0KKyAqIHRvIGJlIGdlbmVyYXRlZCBpZiByZXF1aXJlZC4NCisgKg0KKyAqIFBOR18zMmIgY29ycmVjdGx5IHByb2R1Y2VzIGEgdmFsdWUgc2hpZnRlZCBieSB1cCB0byAyNCBiaXRzLCBldmVuIG9uDQorICogYXJjaGl0ZWN0dXJlcyB3aGVyZSAoaW50KSBpcyBvbmx5IDE2IGJpdHMuDQorICovDQorI2RlZmluZSBQTkdfMzJiKGIscykgKChwbmdfdWludF8zMikoYikgPDwgKHMpKQ0KKyNkZWZpbmUgUE5HX1UzMihiMSxiMixiMyxiNCkgXA0KKyAgIChQTkdfMzJiKGIxLDI0KSB8IFBOR18zMmIoYjIsMTYpIHwgUE5HXzMyYihiMyw4KSB8IFBOR18zMmIoYjQsMCkpDQorDQorLyogQ29uc3RhbnRzIGZvciBrbm93biBjaHVuayB0eXBlcy4NCisgKg0KKyAqIE1BSU5UQUlORVJTOiBJZiB5b3UgbmVlZCB0byBhZGQgYSBjaHVuaywgZGVmaW5lIHRoZSBuYW1lIGhlcmUuDQorICogRm9yIGhpc3RvcmljYWwgcmVhc29ucyB0aGVzZSBjb25zdGFudHMgaGF2ZSB0aGUgZm9ybSBwbmdfPG5hbWU+OyBpLmUuDQorICogdGhlIHByZWZpeCBpcyBsb3dlciBjYXNlLiAgUGxlYXNlIHVzZSBkZWNpbWFsIHZhbHVlcyBhcyB0aGUgcGFyYW1ldGVycyB0bw0KKyAqIG1hdGNoIHRoZSBJU08gUE5HIHNwZWNpZmljYXRpb24gYW5kIHRvIGF2b2lkIHJlbHlpbmcgb24gdGhlIEMgbG9jYWxlDQorICogaW50ZXJwcmV0YXRpb24gb2YgY2hhcmFjdGVyIHZhbHVlcy4gIFBsZWFzZSBrZWVwIHRoZSBsaXN0IHNvcnRlZC4NCisgKg0KKyAqIE5vdGljZSB0aGF0IFBOR19VMzIgaXMgdXNlZCB0byBkZWZpbmUgYSAzMi1iaXQgdmFsdWUgZm9yIHRoZSA0IGJ5dGUgY2h1bmsNCisgKiB0eXBlLiAgSW4gZmFjdCB0aGUgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBleHByZXNzIGNodW5rIHR5cGVzIHRoaXMgd2F5LA0KKyAqIGhvd2V2ZXIgdXNpbmcgYSAzMi1iaXQgdmFsdWUgbWVhbnMgdGhhdCB0aGUgY2h1bmsgdHlwZSBjYW4gYmUgcmVhZCBmcm9tIHRoZQ0KKyAqIHN0cmVhbSB1c2luZyBleGFjdGx5IHRoZSBzYW1lIGNvZGUgYXMgdXNlZCBmb3IgYSAzMi1iaXQgdW5zaWduZWQgdmFsdWUgYW5kDQorICogY2FuIGJlIGV4YW1pbmVkIGZhciBtb3JlIGVmZmljaWVudGx5ICh1c2luZyBvbmUgYXJpdGhtZXRpYyBjb21wYXJlKS4NCisgKg0KKyAqIFByaW9yIHRvIDEuNS42IHRoZSBjaHVuayB0eXBlIGNvbnN0YW50cyB3ZXJlIGV4cHJlc3NlZCBhcyBDIHN0cmluZ3MuICBUaGUNCisgKiBsaWJwbmcgQVBJIHN0aWxsIHVzZXMgc3RyaW5ncyBmb3IgJ3Vua25vd24nIGNodW5rcyBhbmQgYSBtYWNybywNCisgKiBQTkdfU1RSSU5HX0ZST01fQ0hVTkssIGFsbG93cyBhIHN0cmluZyB0byBiZSBnZW5lcmF0ZWQgaWYgcmVxdWlyZWQuICBOb3RpY2UNCisgKiB0aGF0IGZvciBwb3J0YWJsZSBjb2RlIG51bWVyaWMgdmFsdWVzIG11c3Qgc3RpbGwgYmUgdXNlZDsgdGhlIHN0cmluZyAiSUhEUiINCisgKiBpcyBub3QgcG9ydGFibGUgYW5kIG5laXRoZXIgaXMgUE5HX1UzMignSScsICdIJywgJ0QnLCAnUicpLg0KKyAqDQorICogSW4gMS43LjAgdGhlIGRlZmluaXRpb25zIHdpbGwgYmUgbWFkZSBwdWJsaWMgaW4gcG5nLmggdG8gYXZvaWQgaGF2aW5nIHRvDQorICogZHVwbGljYXRlIHRoZSBzYW1lIGRlZmluaXRpb25zIGluIGFwcGxpY2F0aW9uIGNvZGUuDQorICovDQorI2RlZmluZSBwbmdfSURBVCBQTkdfVTMyKCA3MywgIDY4LCAgNjUsICA4NCkNCisjZGVmaW5lIHBuZ19JRU5EIFBOR19VMzIoIDczLCAgNjksICA3OCwgIDY4KQ0KKyNkZWZpbmUgcG5nX0lIRFIgUE5HX1UzMiggNzMsICA3MiwgIDY4LCAgODIpDQorI2RlZmluZSBwbmdfUExURSBQTkdfVTMyKCA4MCwgIDc2LCAgODQsICA2OSkNCisjZGVmaW5lIHBuZ19iS0dEIFBOR19VMzIoIDk4LCAgNzUsICA3MSwgIDY4KQ0KKyNkZWZpbmUgcG5nX2NIUk0gUE5HX1UzMiggOTksICA3MiwgIDgyLCAgNzcpDQorI2RlZmluZSBwbmdfZlJBYyBQTkdfVTMyKDEwMiwgIDgyLCAgNjUsICA5OSkgLyogcmVnaXN0ZXJlZCwgbm90IGRlZmluZWQgKi8NCisjZGVmaW5lIHBuZ19nQU1BIFBOR19VMzIoMTAzLCAgNjUsICA3NywgIDY1KQ0KKyNkZWZpbmUgcG5nX2dJRmcgUE5HX1UzMigxMDMsICA3MywgIDcwLCAxMDMpDQorI2RlZmluZSBwbmdfZ0lGdCBQTkdfVTMyKDEwMywgIDczLCAgNzAsIDExNikgLyogZGVwcmVjYXRlZCAqLw0KKyNkZWZpbmUgcG5nX2dJRnggUE5HX1UzMigxMDMsICA3MywgIDcwLCAxMjApDQorI2RlZmluZSBwbmdfaElTVCBQTkdfVTMyKDEwNCwgIDczLCAgODMsICA4NCkNCisjZGVmaW5lIHBuZ19pQ0NQIFBOR19VMzIoMTA1LCAgNjcsICA2NywgIDgwKQ0KKyNkZWZpbmUgcG5nX2lUWHQgUE5HX1UzMigxMDUsICA4NCwgIDg4LCAxMTYpDQorI2RlZmluZSBwbmdfb0ZGcyBQTkdfVTMyKDExMSwgIDcwLCAgNzAsIDExNSkNCisjZGVmaW5lIHBuZ19wQ0FMIFBOR19VMzIoMTEyLCAgNjcsICA2NSwgIDc2KQ0KKyNkZWZpbmUgcG5nX3BIWXMgUE5HX1UzMigxMTIsICA3MiwgIDg5LCAxMTUpDQorI2RlZmluZSBwbmdfc0JJVCBQTkdfVTMyKDExNSwgIDY2LCAgNzMsICA4NCkNCisjZGVmaW5lIHBuZ19zQ0FMIFBOR19VMzIoMTE1LCAgNjcsICA2NSwgIDc2KQ0KKyNkZWZpbmUgcG5nX3NQTFQgUE5HX1UzMigxMTUsICA4MCwgIDc2LCAgODQpDQorI2RlZmluZSBwbmdfc1JHQiBQTkdfVTMyKDExNSwgIDgyLCAgNzEsICA2NikNCisjZGVmaW5lIHBuZ19zVEVSIFBOR19VMzIoMTE1LCAgODQsICA2OSwgIDgyKQ0KKyNkZWZpbmUgcG5nX3RFWHQgUE5HX1UzMigxMTYsICA2OSwgIDg4LCAxMTYpDQorI2RlZmluZSBwbmdfdElNRSBQTkdfVTMyKDExNiwgIDczLCAgNzcsICA2OSkNCisjZGVmaW5lIHBuZ190Uk5TIFBOR19VMzIoMTE2LCAgODIsICA3OCwgIDgzKQ0KKyNkZWZpbmUgcG5nX3pUWHQgUE5HX1UzMigxMjIsICA4NCwgIDg4LCAxMTYpDQorDQorLyogVGhlIGZvbGxvd2luZyB3aWxsIHdvcmsgb24gKHNpZ25lZCBjaGFyKikgc3RyaW5ncywgd2hlcmVhcyB0aGUgZ2V0X3VpbnRfMzINCisgKiBtYWNybyB3aWxsIGZhaWwgb24gdG9wLWJpdC1zZXQgdmFsdWVzIGJlY2F1c2Ugb2YgdGhlIHNpZ24gZXh0ZW5zaW9uLg0KKyAqLw0KKyNkZWZpbmUgUE5HX0NIVU5LX0ZST01fU1RSSU5HKHMpXA0KKyAgIFBOR19VMzIoMHhmZiYocylbMF0sIDB4ZmYmKHMpWzFdLCAweGZmJihzKVsyXSwgMHhmZiYocylbM10pDQorDQorLyogVGhpcyB1c2VzIChjaGFyKSwgbm90IChwbmdfYnl0ZSkgdG8gYXZvaWQgd2FybmluZ3Mgb24gc3lzdGVtcyB3aGVyZSAoY2hhcikgaXMNCisgKiBzaWduZWQgYW5kIHRoZSBhcmd1bWVudCBpcyBhIChjaGFyW10pICBUaGlzIG1hY3JvIHdpbGwgZmFpbCBtaXNlcmFibHkgb24NCisgKiBzeXN0ZW1zIHdoZXJlIChjaGFyKSBpcyBtb3JlIHRoYW4gOCBiaXRzLg0KKyAqLw0KKyNkZWZpbmUgUE5HX1NUUklOR19GUk9NX0NIVU5LKHMsYylcDQorICAgKHZvaWQpKCgoY2hhciopKHMpKVswXT0oY2hhcikoKGMpPj4yNCksICgoY2hhciopKHMpKVsxXT0oY2hhcikoKGMpPj4xNiksXA0KKyAgICgoY2hhciopKHMpKVsyXT0oY2hhcikoKGMpPj44KSwgKChjaGFyKikocykpWzNdPShjaGFyKSgoYykpKQ0KKw0KKy8qIERvIHRoZSBzYW1lIGJ1dCB0ZXJtaW5hdGUgd2l0aCBhIG51bGwgY2hhcmFjdGVyLiAqLw0KKyNkZWZpbmUgUE5HX0NTVFJJTkdfRlJPTV9DSFVOSyhzLGMpXA0KKyAgICh2b2lkKShQTkdfU1RSSU5HX0ZST01fQ0hVTksocyxjKSwgKChjaGFyKikocykpWzRdID0gMCkNCisNCisvKiBUZXN0IG9uIGZsYWcgdmFsdWVzIGFzIGRlZmluZWQgaW4gdGhlIHNwZWMgKHNlY3Rpb24gNS40KTogKi8NCisjZGVmaW5lIFBOR19DSFVOS19BTkNJTExBUlkoYykgICAoMSAmICgoYykgPj4gMjkpKQ0KKyNkZWZpbmUgUE5HX0NIVU5LX0NSSVRJQ0FMKGMpICAgICAoIVBOR19DSFVOS19BTkNJTExBUlkoYykpDQorI2RlZmluZSBQTkdfQ0hVTktfUFJJVkFURShjKSAgICAgICgxICYgKChjKSA+PiAyMSkpDQorI2RlZmluZSBQTkdfQ0hVTktfUkVTRVJWRUQoYykgICAgICgxICYgKChjKSA+PiAxMykpDQorI2RlZmluZSBQTkdfQ0hVTktfU0FGRV9UT19DT1BZKGMpICgxICYgKChjKSA+PiAgNSkpDQorDQorLyogR2FtbWEgdmFsdWVzIChuZXcgYXQgbGlicG5nLTEuNS40KTogKi8NCisjZGVmaW5lIFBOR19HQU1NQV9NQUNfT0xEIDE1MTcyNCAgLyogQXNzdW1lICcxLjgnIGlzIHJlYWxseSAyLjIvMS40NSEgKi8NCisjZGVmaW5lIFBOR19HQU1NQV9NQUNfSU5WRVJTRSA2NTkwOQ0KKyNkZWZpbmUgUE5HX0dBTU1BX3NSR0JfSU5WRVJTRSA0NTQ1NQ0KKw0KKy8qIEFsbW9zdCBldmVyeXRoaW5nIGJlbG93IGlzIEMgc3BlY2lmaWM7IHRoZSAjZGVmaW5lcyBhYm92ZSBjYW4gYmUgdXNlZCBpbg0KKyAqIG5vbi1DIGNvZGUgKHNvIGxvbmcgYXMgaXQgaXMgQy1wcmVwcm9jZXNzZWQpIHRoZSByZXN0IG9mIHRoaXMgc3R1ZmYgY2Fubm90Lg0KKyAqLw0KKyNpZm5kZWYgUE5HX1ZFUlNJT05fSU5GT19PTkxZDQorDQorI2luY2x1ZGUgInBuZ3N0cnVjdC5oIg0KKyNpbmNsdWRlICJwbmdpbmZvLmgiDQorDQorLyogVmFsaWRhdGUgdGhlIGluY2x1ZGUgcGF0aHMgLSB0aGUgaW5jbHVkZSBwYXRoIHVzZWQgdG8gZ2VuZXJhdGUgcG5nbGliY29uZi5oDQorICogbXVzdCBtYXRjaCB0aGF0IHVzZWQgaW4gdGhlIGJ1aWxkLCBvciB3ZSBtdXN0IGJlIHVzaW5nIHBuZ2xpYmNvbmYuaC5wcmVidWlsdDoNCisgKi8NCisjaWYgUE5HX1pMSUJfVkVSTlVNICE9IDAgJiYgUE5HX1pMSUJfVkVSTlVNICE9IFpMSUJfVkVSTlVNDQorIyAgZXJyb3IgWkxJQl9WRVJOVU0gIT0gUE5HX1pMSUJfVkVSTlVNIFwNCisgICAgICAiLUkgKGluY2x1ZGUgcGF0aCkgZXJyb3I6IHNlZSB0aGUgbm90ZXMgaW4gcG5ncHJpdi5oIg0KKyAgIC8qIFRoaXMgbWVhbnMgdGhhdCB3aGVuIHBuZ2xpYmNvbmYuaCB3YXMgYnVpbHQgdGhlIGNvcHkgb2YgemxpYi5oIHRoYXQgaXQNCisgICAgKiB1c2VkIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgb25lIGJlaW5nIHVzZWQgaGVyZS4gIEJlY2F1c2UgdGhlIGJ1aWxkIG9mDQorICAgICogbGlicG5nIG1ha2VzIGRlY2lzaW9ucyB0byB1c2UgaW5mbGF0ZUluaXQyIGFuZCBpbmZsYXRlUmVzZXQyIGJhc2VkIG9uIHRoZQ0KKyAgICAqIHpsaWIgdmVyc2lvbiBudW1iZXIgYW5kIGJlY2F1c2UgdGhpcyBhZmZlY3RzIGhhbmRsaW5nIG9mIGNlcnRhaW4gYnJva2VuDQorICAgICogUE5HIGZpbGVzIHRoZSAtSSBkaXJlY3RpdmVzIG11c3QgbWF0Y2guDQorICAgICoNCisgICAgKiBUaGUgbW9zdCBsaWtlbHkgZXhwbGFuYXRpb24gaXMgdGhhdCB5b3UgcGFzc2VkIGEgLUkgaW4gQ0ZMQUdTLCB0aGlzIHdpbGwNCisgICAgKiBub3Qgd29yazsgYWxsIHRoZSBwcmVwcm9jZXNzb3IgZGlyZWN0b3JpZXMgYW5kIGluIHBhcnRpY3VsYXIgYWxsIHRoZSAtSQ0KKyAgICAqIGRpcmVjdGl2ZXMgbXVzdCBiZSBpbiBDUFBGTEFHUy4NCisgICAgKi8NCisjZW5kaWYNCisNCisvKiBUaGlzIGlzIHVzZWQgZm9yIDE2IGJpdCBnYW1tYSB0YWJsZXMgLS0gb25seSB0aGUgdG9wIGxldmVsIHBvaW50ZXJzIGFyZQ0KKyAqIGNvbnN0OyB0aGlzIGNvdWxkIGJlIGNoYW5nZWQ6DQorICovDQordHlwZWRlZiBjb25zdCBwbmdfdWludF8xNnAgKiBwbmdfY29uc3RfdWludF8xNnBwOw0KKw0KKy8qIEFkZGVkIHRvIGxpYnBuZy0xLjUuNzogc1JHQiBjb252ZXJzaW9uIHRhYmxlcyAqLw0KKyNpZiBkZWZpbmVkKFBOR19TSU1QTElGSUVEX1JFQURfU1VQUE9SVEVEKSB8fFwNCisgICBkZWZpbmVkKFBOR19TSU1QTElGSUVEX1dSSVRFX1NVUFBPUlRFRCkNCisjaWZkZWYgUE5HX1NJTVBMSUZJRURfUkVBRF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfREFUQShjb25zdCBwbmdfdWludF8xNiwgcG5nX3NSR0JfdGFibGUsIFsyNTZdKTsNCisgICAvKiBDb252ZXJ0IGZyb20gYW4gc1JHQiBlbmNvZGVkIHZhbHVlIDAuLjI1NSB0byBhIDE2LWJpdCBsaW5lYXIgdmFsdWUsDQorICAgICogMC4uNjU1MzUuICBUaGlzIHRhYmxlIGdpdmVzIHRoZSBjbG9zZXN0IDE2LWJpdCBhbnN3ZXJzIChubyBlcnJvcnMpLg0KKyAgICAqLw0KKyNlbmRpZg0KKw0KK1BOR19JTlRFUk5BTF9EQVRBKGNvbnN0IHBuZ191aW50XzE2LCBwbmdfc1JHQl9iYXNlLCBbNTEyXSk7DQorUE5HX0lOVEVSTkFMX0RBVEEoY29uc3QgcG5nX2J5dGUsIHBuZ19zUkdCX2RlbHRhLCBbNTEyXSk7DQorDQorI2RlZmluZSBQTkdfc1JHQl9GUk9NX0xJTkVBUihsaW5lYXIpICgocG5nX2J5dGUpKChwbmdfc1JHQl9iYXNlWyhsaW5lYXIpPj4xNV0gK1wNCisgICAoKCgobGluZWFyKSYweDdmZmYpKnBuZ19zUkdCX2RlbHRhWyhsaW5lYXIpPj4xNV0pPj4xMikpID4+IDgpKQ0KKyAgIC8qIEdpdmVuIGEgdmFsdWUgJ2xpbmVhcicgaW4gdGhlIHJhbmdlIDAuLjI1NSo2NTUzNSBjYWxjdWxhdGUgdGhlIDgtYml0IHNSR0INCisgICAgKiBlbmNvZGVkIHZhbHVlIHdpdGggbWF4aW11bSBlcnJvciAwLjY0NjM2NS4gIE5vdGUgdGhhdCB0aGUgaW5wdXQgaXMgbm90IGENCisgICAgKiAxNi1iaXQgdmFsdWU7IGl0IGhhcyBiZWVuIG11bHRpcGxpZWQgYnkgMjU1ISAqLw0KKyNlbmRpZiAvKiBQTkdfU0lNUExJRklFRF9SRUFEL1dSSVRFICovDQorDQorDQorLyogSW5oaWJpdCBDKysgbmFtZS1tYW5nbGluZyBmb3IgbGlicG5nIGZ1bmN0aW9ucyBidXQgbm90IGZvciBzeXN0ZW0gY2FsbHMuICovDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovDQorDQorLyogSW50ZXJuYWwgZnVuY3Rpb25zOyB0aGVzZSBhcmUgbm90IGV4cG9ydGVkIGZyb20gYSBETEwgaG93ZXZlciBiZWNhdXNlIHRoZXkNCisgKiBhcmUgdXNlZCB3aXRoaW4gc2V2ZXJhbCBvZiB0aGUgQyBzb3VyY2UgZmlsZXMgdGhleSBoYXZlIHRvIGJlIEMgZXh0ZXJuLg0KKyAqDQorICogQWxsIG9mIHRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIGRlY2xhcmVkIHdpdGggUE5HX0lOVEVSTkFMX0ZVTkNUSU9OLg0KKyAqLw0KKw0KKy8qIFpsaWIgc3VwcG9ydCAqLw0KKyNkZWZpbmUgUE5HX1VORVhQRUNURURfWkxJQl9SRVRVUk4gKC03KQ0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLCBwbmdfenN0cmVhbV9lcnJvciwocG5nX3N0cnVjdHJwIHBuZ19wdHIsIGludCByZXQpLA0KKyAgIFBOR19FTVBUWSk7DQorICAgLyogVXNlZCBieSB0aGUgemxpYiBoYW5kbGluZyBmdW5jdGlvbnMgdG8gZW5zdXJlIHRoYXQgel9zdHJlYW06Om1zZyBpcyBhbHdheXMNCisgICAgKiBzZXQgYmVmb3JlIHRoZXkgcmV0dXJuLg0KKyAgICAqLw0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2ZyZWVfYnVmZmVyX2xpc3QsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ19jb21wcmVzc2lvbl9idWZmZXJwICpsaXN0KSxQTkdfRU1QVFkpOw0KKyAgIC8qIEZyZWUgdGhlIGJ1ZmZlciBsaXN0IHVzZWQgYnkgdGhlIGNvbXByZXNzZWQgd3JpdGUgY29kZS4gKi8NCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKSAmJiBcDQorICAgIWRlZmluZWQoUE5HX0ZJWEVEX1BPSU5UX01BQ1JPX1NVUFBPUlRFRCkgJiYgXA0KKyAgIChkZWZpbmVkKFBOR19nQU1BX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfY0hSTV9TVVBQT1JURUQpIHx8IFwNCisgICBkZWZpbmVkKFBOR19zQ0FMX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkgfHwgXA0KKyAgIGRlZmluZWQoUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEKSkgfHwgXA0KKyAgIChkZWZpbmVkKFBOR19zQ0FMX1NVUFBPUlRFRCkgJiYgXA0KKyAgIGRlZmluZWQoUE5HX0ZMT0FUSU5HX0FSSVRITUVUSUNfU1VQUE9SVEVEKSkNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04ocG5nX2ZpeGVkX3BvaW50LHBuZ19maXhlZCwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQorICAgZG91YmxlIGZwLCBwbmdfY29uc3RfY2hhcnAgdGV4dCksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisvKiBDaGVjayB0aGUgdXNlciB2ZXJzaW9uIHN0cmluZyBmb3IgY29tcGF0aWJpbGl0eSwgcmV0dXJucyBmYWxzZSBpZiB0aGUgdmVyc2lvbg0KKyAqIG51bWJlcnMgYXJlbid0IGNvbXBhdGlibGUuDQorICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfdXNlcl92ZXJzaW9uX2NoZWNrLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfY29uc3RfY2hhcnAgdXNlcl9wbmdfdmVyKSxQTkdfRU1QVFkpOw0KKw0KKy8qIEludGVybmFsIGJhc2UgYWxsb2NhdG9yIC0gbm8gbWVzc2FnZXMsIE5VTEwgb24gZmFpbHVyZSB0byBhbGxvY2F0ZS4gIFRoaXMNCisgKiBkb2VzLCBob3dldmVyLCBjYWxsIHRoZSBhcHBsaWNhdGlvbiBwcm92aWRlZCBhbGxvY2F0b3IgYW5kIHRoYXQgY291bGQgY2FsbA0KKyAqIHBuZ19lcnJvciAoYWx0aG91Z2ggdGhhdCB3b3VsZCBiZSBhIGJ1ZyBpbiB0aGUgYXBwbGljYXRpb24gaW1wbGVtZW50YXRpb24uKQ0KKyAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTihwbmdfdm9pZHAscG5nX21hbGxvY19iYXNlLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfYWxsb2Nfc2l6ZV90IHNpemUpLFBOR19BTExPQ0FURUQpOw0KKw0KKyNpZiBkZWZpbmVkKFBOR19URVhUX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfc1BMVF9TVVBQT1JURUQpIHx8XA0KKyAgIGRlZmluZWQoUE5HX1NUT1JFX1VOS05PV05fQ0hVTktTX1NVUFBPUlRFRCkNCisvKiBJbnRlcm5hbCBhcnJheSBhbGxvY2F0b3IsIG91dHB1dHMgbm8gZXJyb3Igb3Igd2FybmluZyBtZXNzYWdlcyBvbiBmYWlsdXJlLA0KKyAqIGp1c3QgcmV0dXJucyBOVUxMLiAgDQorICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHBuZ192b2lkcCxwbmdfbWFsbG9jX2FycmF5LChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCisgICBpbnQgbmVsZW1lbnRzLCBzaXplX3QgZWxlbWVudF9zaXplKSxQTkdfQUxMT0NBVEVEKTsNCisNCisvKiBUaGUgc2FtZSBidXQgYW4gZXhpc3RpbmcgYXJyYXkgaXMgZXh0ZW5kZWQgYnkgYWRkX2VsZW1lbnRzLiAgVGhpcyBmdW5jdGlvbg0KKyAqIGFsc28gbWVtc2V0cyB0aGUgbmV3IGVsZW1lbnRzIHRvIDAgYW5kIGNvcGllcyB0aGUgb2xkIGVsZW1lbnRzLiAgVGhlIG9sZA0KKyAqIGFycmF5IGlzIG5vdCBmcmVlZCBvciBhbHRlcmVkLg0KKyAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTihwbmdfdm9pZHAscG5nX3JlYWxsb2NfYXJyYXksKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ19jb25zdF92b2lkcCBhcnJheSwgaW50IG9sZF9lbGVtZW50cywgaW50IGFkZF9lbGVtZW50cywNCisgICBzaXplX3QgZWxlbWVudF9zaXplKSxQTkdfQUxMT0NBVEVEKTsNCisjZW5kaWYgLyogdGV4dCwgc1BMVCBvciB1bmtub3duIGNodW5rcyAqLw0KKw0KKy8qIE1hZ2ljIHRvIGNyZWF0ZSBhIHN0cnVjdCB3aGVuIHRoZXJlIGlzIG5vIHN0cnVjdCB0byBjYWxsIHRoZSB1c2VyIHN1cHBsaWVkDQorICogbWVtb3J5IGFsbG9jYXRvcnMuICBCZWNhdXNlIGVycm9yIGhhbmRsaW5nIGhhcyBub3QgYmVlbiBzZXQgdXAgdGhlIG1lbW9yeQ0KKyAqIGhhbmRsZXJzIGNhbid0IHNhZmVseSBjYWxsIHBuZ19lcnJvciwgYnV0IHRoaXMgaXMgYW4gb2JzY3VyZSBhbmQgdW5kb2N1bWVudGVkDQorICogcmVzdHJpY3Rpb24gc28gbGlicG5nIGhhcyB0byBhc3N1bWUgdGhhdCB0aGUgJ2ZyZWUnIGhhbmRsZXIsIGF0IGxlYXN0LCBtaWdodA0KKyAqIGNhbGwgcG5nX2Vycm9yLg0KKyAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTihwbmdfc3RydWN0cCxwbmdfY3JlYXRlX3BuZ19zdHJ1Y3QsDQorICAgKHBuZ19jb25zdF9jaGFycCB1c2VyX3BuZ192ZXIsIHBuZ192b2lkcCBlcnJvcl9wdHIsIHBuZ19lcnJvcl9wdHIgZXJyb3JfZm4sDQorICAgIHBuZ19lcnJvcl9wdHIgd2Fybl9mbiwgcG5nX3ZvaWRwIG1lbV9wdHIsIHBuZ19tYWxsb2NfcHRyIG1hbGxvY19mbiwNCisgICAgcG5nX2ZyZWVfcHRyIGZyZWVfZm4pLFBOR19BTExPQ0FURUQpOw0KKw0KKy8qIEZyZWUgbWVtb3J5IGZyb20gaW50ZXJuYWwgbGlicG5nIHN0cnVjdCAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kZXN0cm95X3BuZ19zdHJ1Y3QsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSwNCisgICBQTkdfRU1QVFkpOw0KKw0KKy8qIEZyZWUgYW4gYWxsb2NhdGVkIGptcF9idWYgKGFsd2F5cyBzdWNjZWVkcykgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZnJlZV9qbXBidWYsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSxQTkdfRU1QVFkpOw0KKw0KKy8qIEZ1bmN0aW9uIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgemxpYi4gIFBOR0FQSSBpcyBkaXNhbGxvd2VkLiAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkcGYscG5nX3phbGxvYywodm9pZHBmIHBuZ19wdHIsIHVJbnQgaXRlbXMsIHVJbnQgc2l6ZSksDQorICAgUE5HX0FMTE9DQVRFRCk7DQorDQorLyogRnVuY3Rpb24gdG8gZnJlZSBtZW1vcnkgZm9yIHpsaWIuICBQTkdBUEkgaXMgZGlzYWxsb3dlZC4gKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfemZyZWUsKHZvaWRwZiBwbmdfcHRyLCB2b2lkcGYgcHRyKSxQTkdfRU1QVFkpOw0KKw0KKy8qIE5leHQgZm91ciBmdW5jdGlvbnMgYXJlIHVzZWQgaW50ZXJuYWxseSBhcyBjYWxsYmFja3MuICBQTkdDQkFQSSBpcyByZXF1aXJlZA0KKyAqIGJ1dCBub3QgUE5HX0VYUE9SVC4gIFBOR0FQSSBhZGRlZCBhdCBsaWJwbmcgdmVyc2lvbiAxLjIuMywgY2hhbmdlZCB0bw0KKyAqIFBOR0NCQVBJIGF0IDEuNS4wDQorICovDQorDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQgUE5HQ0JBUEkscG5nX2RlZmF1bHRfcmVhZF9kYXRhLChwbmdfc3RydWN0cCBwbmdfcHRyLA0KKyAgICBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpLFBOR19FTVBUWSk7DQorDQorI2lmZGVmIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkIFBOR0NCQVBJLHBuZ19wdXNoX2ZpbGxfYnVmZmVyLChwbmdfc3RydWN0cCBwbmdfcHRyLA0KKyAgICBwbmdfYnl0ZXAgYnVmZmVyLCBwbmdfc2l6ZV90IGxlbmd0aCksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCBQTkdDQkFQSSxwbmdfZGVmYXVsdF93cml0ZV9kYXRhLChwbmdfc3RydWN0cCBwbmdfcHRyLA0KKyAgICBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpLFBOR19FTVBUWSk7DQorDQorI2lmZGVmIFBOR19XUklURV9GTFVTSF9TVVBQT1JURUQNCisjICBpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQgUE5HQ0JBUEkscG5nX2RlZmF1bHRfZmx1c2gsKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpLA0KKyAgIFBOR19FTVBUWSk7DQorIyAgZW5kaWYNCisjZW5kaWYNCisNCisvKiBSZXNldCB0aGUgQ1JDIHZhcmlhYmxlICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3Jlc2V0X2NyYywocG5nX3N0cnVjdHJwIHBuZ19wdHIpLFBOR19FTVBUWSk7DQorDQorLyogV3JpdGUgdGhlICJkYXRhIiBidWZmZXIgdG8gd2hhdGV2ZXIgb3V0cHV0IHlvdSBhcmUgdXNpbmcgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfZGF0YSwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19jb25zdF9ieXRlcCBkYXRhLCBwbmdfc2l6ZV90IGxlbmd0aCksUE5HX0VNUFRZKTsNCisNCisvKiBSZWFkIGFuZCBjaGVjayB0aGUgUE5HIGZpbGUgc2lnbmF0dXJlICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3JlYWRfc2lnLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfaW5mb3JwIGluZm9fcHRyKSxQTkdfRU1QVFkpOw0KKw0KKy8qIFJlYWQgdGhlIGNodW5rIGhlYWRlciAobGVuZ3RoICsgdHlwZSBuYW1lKSAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTihwbmdfdWludF8zMixwbmdfcmVhZF9jaHVua19oZWFkZXIsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSwNCisgICBQTkdfRU1QVFkpOw0KKw0KKy8qIFJlYWQgZGF0YSBmcm9tIHdoYXRldmVyIGlucHV0IHlvdSBhcmUgdXNpbmcgaW50byB0aGUgImRhdGEiIGJ1ZmZlciAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19yZWFkX2RhdGEsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwNCisgICAgcG5nX3NpemVfdCBsZW5ndGgpLFBOR19FTVBUWSk7DQorDQorLyogUmVhZCBieXRlcyBpbnRvIGJ1ZiwgYW5kIHVwZGF0ZSBwbmdfcHRyLT5jcmMgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfY3JjX3JlYWQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfYnl0ZXAgYnVmLA0KKyAgICBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7DQorDQorLyogUmVhZCAic2tpcCIgYnl0ZXMsIHJlYWQgdGhlIGZpbGUgY3JjLCBhbmQgKG9wdGlvbmFsbHkpIHZlcmlmeSBwbmdfcHRyLT5jcmMgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19jcmNfZmluaXNoLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfdWludF8zMiBza2lwKSxQTkdfRU1QVFkpOw0KKw0KKy8qIFJlYWQgdGhlIENSQyBmcm9tIHRoZSBmaWxlIGFuZCBjb21wYXJlIGl0IHRvIHRoZSBsaWJwbmcgY2FsY3VsYXRlZCBDUkMgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19jcmNfZXJyb3IsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSxQTkdfRU1QVFkpOw0KKw0KKy8qIENhbGN1bGF0ZSB0aGUgQ1JDIG92ZXIgYSBzZWN0aW9uIG9mIGRhdGEuICBOb3RlIHRoYXQgd2UgYXJlIG9ubHkNCisgKiBwYXNzaW5nIGEgbWF4aW11bSBvZiA2NEsgb24gc3lzdGVtcyB0aGF0IGhhdmUgdGhpcyBhcyBhIG1lbW9yeSBsaW1pdCwNCisgKiBzaW5jZSB0aGlzIGlzIHRoZSBtYXhpbXVtIGJ1ZmZlciBzaXplIHdlIGNhbiBzcGVjaWZ5Lg0KKyAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19jYWxjdWxhdGVfY3JjLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfY29uc3RfYnl0ZXAgcHRyLCBwbmdfc2l6ZV90IGxlbmd0aCksUE5HX0VNUFRZKTsNCisNCisjaWZkZWYgUE5HX1dSSVRFX0ZMVVNIX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19mbHVzaCwocG5nX3N0cnVjdHJwIHBuZ19wdHIpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorLyogV3JpdGUgdmFyaW91cyBjaHVua3MgKi8NCisNCisvKiBXcml0ZSB0aGUgSUhEUiBjaHVuaywgYW5kIHVwZGF0ZSB0aGUgcG5nX3N0cnVjdCB3aXRoIHRoZSBuZWNlc3NhcnkNCisgKiBpbmZvcm1hdGlvbi4NCisgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfSUhEUiwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgcG5nX3VpbnRfMzIgd2lkdGgsIHBuZ191aW50XzMyIGhlaWdodCwgaW50IGJpdF9kZXB0aCwgaW50IGNvbG9yX3R5cGUsDQorICAgaW50IGNvbXByZXNzaW9uX21ldGhvZCwgaW50IGZpbHRlcl9tZXRob2QsIGludCBpbnRlcmxhY2VfbWV0aG9kKSxQTkdfRU1QVFkpOw0KKw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV9QTFRFLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfY29uc3RfY29sb3JwIHBhbGV0dGUsIHBuZ191aW50XzMyIG51bV9wYWwpLFBOR19FTVBUWSk7DQorDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2NvbXByZXNzX0lEQVQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ19jb25zdF9ieXRlcCByb3dfZGF0YSwgcG5nX2FsbG9jX3NpemVfdCByb3dfZGF0YV9sZW5ndGgsIGludCBmbHVzaCksDQorICAgUE5HX0VNUFRZKTsNCisNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfSUVORCwocG5nX3N0cnVjdHJwIHBuZ19wdHIpLFBOR19FTVBUWSk7DQorDQorI2lmZGVmIFBOR19XUklURV9nQU1BX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV9nQU1BX2ZpeGVkLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2ZpeGVkX3BvaW50IGZpbGVfZ2FtbWEpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9zQklUX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV9zQklULChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2NvbnN0X2NvbG9yXzhwIHNiaXQsIGludCBjb2xvcl90eXBlKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfY0hSTV9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfY0hSTV9maXhlZCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIGNvbnN0IHBuZ194eSAqeHkpLCBQTkdfRU1QVFkpOw0KKyAgICAvKiBUaGUgeHkgdmFsdWUgbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSB2YWxpZGF0ZWQgKi8NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX3NSR0JfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX3NSR0IsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBpbnQgaW50ZW50KSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfaUNDUF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfaUNDUCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgcG5nX2NvbnN0X2NoYXJwIG5hbWUsIHBuZ19jb25zdF9ieXRlcCBwcm9maWxlKSwgUE5HX0VNUFRZKTsNCisgICAvKiBUaGUgcHJvZmlsZSBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IHZhbGlkYXRlZCBmb3IgY29ycmVjdG5lc3MsIHRoZQ0KKyAgICAqIGxlbmd0aCBjb21lcyBmcm9tIHRoZSBmaXJzdCBmb3VyIGJ5dGVzLiAgT25seSB0aGUgYmFzZSwgZGVmbGF0ZSwNCisgICAgKiBjb21wcmVzc2lvbiBpcyBzdXBwb3J0ZWQuDQorICAgICovDQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9zUExUX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV9zUExULChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2NvbnN0X3NQTFRfdHAgcGFsZXR0ZSksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX3RSTlNfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX3RSTlMsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfY29uc3RfYnl0ZXAgdHJhbnMsIHBuZ19jb25zdF9jb2xvcl8xNnAgdmFsdWVzLCBpbnQgbnVtYmVyLA0KKyAgICBpbnQgY29sb3JfdHlwZSksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX2JLR0RfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX2JLR0QsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfY29uc3RfY29sb3JfMTZwIHZhbHVlcywgaW50IGNvbG9yX3R5cGUpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9oSVNUX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV9oSVNULChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2NvbnN0X3VpbnRfMTZwIGhpc3QsIGludCBudW1faGlzdCksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisvKiBDaHVua3MgdGhhdCBoYXZlIGtleXdvcmRzICovDQorI2lmZGVmIFBOR19XUklURV90RVh0X1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV90RVh0LChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfY29uc3RfY2hhcnAga2V5LCBwbmdfY29uc3RfY2hhcnAgdGV4dCwgcG5nX3NpemVfdCB0ZXh0X2xlbiksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX3pUWHRfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX3pUWHQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnANCisgICAga2V5LCBwbmdfY29uc3RfY2hhcnAgdGV4dCwgcG5nX3NpemVfdCB0ZXh0X2xlbiwgaW50IGNvbXByZXNzaW9uKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfaVRYdF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfaVRYdCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIGludCBjb21wcmVzc2lvbiwgcG5nX2NvbnN0X2NoYXJwIGtleSwgcG5nX2NvbnN0X2NoYXJwIGxhbmcsDQorICAgIHBuZ19jb25zdF9jaGFycCBsYW5nX2tleSwgcG5nX2NvbnN0X2NoYXJwIHRleHQpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19URVhUX1NVUFBPUlRFRCAgLyogQWRkZWQgYXQgdmVyc2lvbiAxLjAuMTQgYW5kIDEuMi40ICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfc2V0X3RleHRfMiwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ19jb25zdF90ZXh0cCB0ZXh0X3B0ciwgaW50IG51bV90ZXh0KSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfb0ZGc19TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfb0ZGcywocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbnRfMzIgeF9vZmZzZXQsIHBuZ19pbnRfMzIgeV9vZmZzZXQsIGludCB1bml0X3R5cGUpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9wQ0FMX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV9wQ0FMLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2NoYXJwIHB1cnBvc2UsIHBuZ19pbnRfMzIgWDAsIHBuZ19pbnRfMzIgWDEsIGludCB0eXBlLCBpbnQgbnBhcmFtcywNCisgICAgcG5nX2NvbnN0X2NoYXJwIHVuaXRzLCBwbmdfY2hhcnBwIHBhcmFtcyksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX3BIWXNfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX3BIWXMsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfdWludF8zMiB4X3BpeGVsc19wZXJfdW5pdCwgcG5nX3VpbnRfMzIgeV9waXhlbHNfcGVyX3VuaXQsDQorICAgIGludCB1bml0X3R5cGUpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV90SU1FX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193cml0ZV90SU1FLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2NvbnN0X3RpbWVwIG1vZF90aW1lKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfc0NBTF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfc0NBTF9zLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgaW50IHVuaXQsIHBuZ19jb25zdF9jaGFycCB3aWR0aCwgcG5nX2NvbnN0X2NoYXJwIGhlaWdodCksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisvKiBDYWxsZWQgd2hlbiBmaW5pc2hlZCBwcm9jZXNzaW5nIGEgcm93IG9mIGRhdGEgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfZmluaXNoX3JvdywocG5nX3N0cnVjdHJwIHBuZ19wdHIpLA0KKyAgICBQTkdfRU1QVFkpOw0KKw0KKy8qIEludGVybmFsIHVzZSBvbmx5LiAgIENhbGxlZCBiZWZvcmUgZmlyc3Qgcm93IG9mIGRhdGEgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd3JpdGVfc3RhcnRfcm93LChwbmdfc3RydWN0cnAgcG5nX3B0ciksDQorICAgIFBOR19FTVBUWSk7DQorDQorLyogQ29tYmluZSBhIHJvdyBvZiBkYXRhLCBkZWFsaW5nIHdpdGggYWxwaGEsIGV0Yy4gaWYgcmVxdWVzdGVkLiAgJ3JvdycgaXMgYW4NCisgKiBhcnJheSBvZiBwbmdfcHRyLT53aWR0aCBwaXhlbHMuICBJZiB0aGUgaW1hZ2UgaXMgbm90IGludGVybGFjZWQgb3IgdGhpcw0KKyAqIGlzIHRoZSBmaW5hbCBwYXNzIHRoaXMganVzdCBkb2VzIGEgbWVtY3B5LCBvdGhlcndpc2UgdGhlICJkaXNwbGF5IiBmbGFnDQorICogaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0byBjb3B5IHBpeGVscyB0aGF0IGFyZSBub3QgaW4gdGhlIGN1cnJlbnQgcGFzcy4NCisgKg0KKyAqIEJlY2F1c2UgJ3BuZ19kb19yZWFkX2ludGVybGFjZScgKGJlbG93KSByZXBsaWNhdGVzIHBpeGVscyB0aGlzIGFsbG93cyB0aGlzDQorICogZnVuY3Rpb24gdG8gYWNoaWV2ZSB0aGUgZG9jdW1lbnRlZCAnYmxvY2t5JyBhcHBlYXJhbmNlIGR1cmluZyBpbnRlcmxhY2VkIHJlYWQNCisgKiBpZiBkaXNwbGF5IGlzIDEgYW5kIHRoZSAnc3BhcmtsZScgYXBwZWFyYW5jZSwgd2hlcmUgZXhpc3RpbmcgcGl4ZWxzIGluICdyb3cnDQorICogYXJlIG5vdCBjaGFuZ2VkIGlmIHRoZXkgYXJlIG5vdCBpbiB0aGUgY3VycmVudCBwYXNzLCB3aGVuIGRpc3BsYXkgaXMgMC4NCisgKg0KKyAqICdkaXNwbGF5JyBtdXN0IGJlIDAgb3IgMSwgb3RoZXJ3aXNlIHRoZSBtZW1jcHkgd2lsbCBiZSBkb25lIHJlZ2FyZGxlc3MuDQorICoNCisgKiBUaGUgQVBJIGFsd2F5cyByZWFkcyBmcm9tIHRoZSBwbmdfc3RydWN0IHJvdyBidWZmZXIgYW5kIGFsd2F5cyBhc3N1bWVzIHRoYXQNCisgKiBpdCBpcyBmdWxsIHdpZHRoIChwbmdfZG9fcmVhZF9pbnRlcmxhY2UgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQuKQ0KKyAqDQorICogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGV2ZXIgdXNlZCB0byB3cml0ZSB0byByb3cgYnVmZmVycyBwcm92aWRlZCBieSB0aGUNCisgKiBjYWxsZXIgb2YgdGhlIHJlbGV2YW50IGxpYnBuZyBBUEkgYW5kIHRoZSByb3cgbXVzdCBoYXZlIGFscmVhZHkgYmVlbg0KKyAqIHRyYW5zZm9ybWVkIGJ5IHRoZSByZWFkIHRyYW5zZm9ybWF0aW9ucy4NCisgKg0KKyAqIFRoZSBQTkdfVVNFX0NPTVBJTEVfVElNRV9NQVNLUyBvcHRpb24gY2F1c2VzIGdlbmVyYXRpb24gb2YgcHJlLWNvbXB1dGVkDQorICogYml0bWFza3MgZm9yIHVzZSB3aXRoaW4gdGhlIGNvZGUsIG90aGVyd2lzZSBydW50aW1lIGdlbmVyYXRlZCBtYXNrcyBhcmUgdXNlZC4NCisgKiBUaGUgZGVmYXVsdCBpcyBjb21waWxlIHRpbWUgbWFza3MuDQorICovDQorI2lmbmRlZiBQTkdfVVNFX0NPTVBJTEVfVElNRV9NQVNLUw0KKyMgIGRlZmluZSBQTkdfVVNFX0NPTVBJTEVfVElNRV9NQVNLUyAxDQorI2VuZGlmDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2NvbWJpbmVfcm93LChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2J5dGVwIHJvdywgaW50IGRpc3BsYXkpLFBOR19FTVBUWSk7DQorDQorI2lmZGVmIFBOR19SRUFEX0lOVEVSTEFDSU5HX1NVUFBPUlRFRA0KKy8qIEV4cGFuZCBhbiBpbnRlcmxhY2VkIHJvdzogdGhlICdyb3dfaW5mbycgZGVzY3JpYmVzIHRoZSBwYXNzIGRhdGEgdGhhdCBoYXMNCisgKiBiZWVuIHJlYWQgaW4gYW5kIG11c3QgY29ycmVzcG9uZCB0byB0aGUgcGl4ZWxzIGluICdyb3cnLCB0aGUgcGl4ZWxzIGFyZQ0KKyAqIGV4cGFuZGVkIChtb3ZlZCBhcGFydCkgaW4gJ3JvdycgdG8gbWF0Y2ggdGhlIGZpbmFsIGxheW91dCwgd2hlbiBkb2luZyB0aGlzDQorICogdGhlIHBpeGVscyBhcmUgKnJlcGxpY2F0ZWQqIHRvIHRoZSBpbnRlcnZlbmluZyBzcGFjZS4gIFRoaXMgaXMgZXNzZW50aWFsIGZvcg0KKyAqIHRoZSBjb3JyZWN0IG9wZXJhdGlvbiBvZiBwbmdfY29tYmluZV9yb3csIGFib3ZlLg0KKyAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb19yZWFkX2ludGVybGFjZSwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCisgICAgcG5nX2J5dGVwIHJvdywgaW50IHBhc3MsIHBuZ191aW50XzMyIHRyYW5zZm9ybWF0aW9ucyksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisvKiBHUlIgVE8gRE8gKDIuMCBvciB3aGVuZXZlcik6ICBzaW1wbGlmeSBvdGhlciBpbnRlcm5hbCBjYWxsaW5nIGludGVyZmFjZXMgKi8NCisNCisjaWZkZWYgUE5HX1dSSVRFX0lOVEVSTEFDSU5HX1NVUFBPUlRFRA0KKy8qIEdyYWIgcGl4ZWxzIG91dCBvZiBhIHJvdyBmb3IgYW4gaW50ZXJsYWNlZCBwYXNzICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX3dyaXRlX2ludGVybGFjZSwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCisgICAgcG5nX2J5dGVwIHJvdywgaW50IHBhc3MpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorLyogVW5maWx0ZXIgYSByb3c6IGNoZWNrIHRoZSBmaWx0ZXIgdmFsdWUgYmVmb3JlIGNhbGxpbmcgdGhpcywgdGhlcmUgaXMgbm8gcG9pbnQNCisgKiBjYWxsaW5nIGl0IGZvciBQTkdfRklMVEVSX1ZBTFVFX05PTkUuDQorICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3JlYWRfZmlsdGVyX3JvdywocG5nX3N0cnVjdHJwIHBwLCBwbmdfcm93X2luZm9wDQorICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfYnl0ZXAgcHJldl9yb3csIGludCBmaWx0ZXIpLFBOR19FTVBUWSk7DQorDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3JlYWRfZmlsdGVyX3Jvd191cF9uZW9uLChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KKyAgICBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfYnl0ZXAgcHJldl9yb3cpLFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3JlYWRfZmlsdGVyX3Jvd19zdWIzX25lb24sKHBuZ19yb3dfaW5mb3ANCisgICAgcm93X2luZm8sIHBuZ19ieXRlcCByb3csIHBuZ19jb25zdF9ieXRlcCBwcmV2X3JvdyksUE5HX0VNUFRZKTsNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcmVhZF9maWx0ZXJfcm93X3N1YjRfbmVvbiwocG5nX3Jvd19pbmZvcA0KKyAgICByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywgcG5nX2NvbnN0X2J5dGVwIHByZXZfcm93KSxQTkdfRU1QVFkpOw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19yZWFkX2ZpbHRlcl9yb3dfYXZnM19uZW9uLChwbmdfcm93X2luZm9wDQorICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfYnl0ZXAgcHJldl9yb3cpLFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3JlYWRfZmlsdGVyX3Jvd19hdmc0X25lb24sKHBuZ19yb3dfaW5mb3ANCisgICAgcm93X2luZm8sIHBuZ19ieXRlcCByb3csIHBuZ19jb25zdF9ieXRlcCBwcmV2X3JvdyksUE5HX0VNUFRZKTsNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcmVhZF9maWx0ZXJfcm93X3BhZXRoM19uZW9uLChwbmdfcm93X2luZm9wDQorICAgIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfYnl0ZXAgcHJldl9yb3cpLFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3JlYWRfZmlsdGVyX3Jvd19wYWV0aDRfbmVvbiwocG5nX3Jvd19pbmZvcA0KKyAgICByb3dfaW5mbywgcG5nX2J5dGVwIHJvdywgcG5nX2NvbnN0X2J5dGVwIHByZXZfcm93KSxQTkdfRU1QVFkpOw0KKw0KKy8qIENob29zZSB0aGUgYmVzdCBmaWx0ZXIgdG8gdXNlIGFuZCBmaWx0ZXIgdGhlIHJvdyBkYXRhICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3dyaXRlX2ZpbmRfZmlsdGVyLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX3Jvd19pbmZvcCByb3dfaW5mbyksUE5HX0VNUFRZKTsNCisNCisjaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcmVhZF9JREFUX2RhdGEsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ19ieXRlcCBvdXRwdXQsIHBuZ19hbGxvY19zaXplX3QgYXZhaWxfb3V0KSxQTkdfRU1QVFkpOw0KKyAgIC8qIFJlYWQgJ2F2YWlsX291dCcgYnl0ZXMgb2YgZGF0YSBmcm9tIHRoZSBJREFUIHN0cmVhbS4gIElmIHRoZSBvdXRwdXQgYnVmZmVyDQorICAgICogaXMgTlVMTCB0aGUgZnVuY3Rpb24gY2hlY2tzLCBpbnN0ZWFkLCBmb3IgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLiAgSW4gdGhpcw0KKyAgICAqIGNhc2UgYSBiZW5pZ24gZXJyb3Igd2lsbCBiZSBpc3N1ZWQgaWYgdGhlIHN0cmVhbSBlbmQgaXMgbm90IGZvdW5kIG9yIGlmDQorICAgICogZXh0cmEgZGF0YSBoYXMgdG8gYmUgY29uc3VtZWQuDQorICAgICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3JlYWRfZmluaXNoX0lEQVQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSwNCisgICBQTkdfRU1QVFkpOw0KKyAgIC8qIFRoaXMgY2xlYW5zIHVwIHdoZW4gdGhlIElEQVQgTFogc3RyZWFtIGRvZXMgbm90IGVuZCB3aGVuIHRoZSBsYXN0IGltYWdlDQorICAgICogYnl0ZSBpcyByZWFkOyB0aGVyZSBpcyBzdGlsbCBzb21lIHBlbmRpbmcgaW5wdXQuDQorICAgICovDQorDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3JlYWRfZmluaXNoX3JvdywocG5nX3N0cnVjdHJwIHBuZ19wdHIpLA0KKyAgIFBOR19FTVBUWSk7DQorICAgLyogRmluaXNoIGEgcm93IHdoaWxlIHJlYWRpbmcsIGRlYWxpbmcgd2l0aCBpbnRlcmxhY2luZyBwYXNzZXMsIGV0Yy4gKi8NCisjZW5kaWYNCisNCisvKiBJbml0aWFsaXplIHRoZSByb3cgYnVmZmVycywgZXRjLiAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19yZWFkX3N0YXJ0X3JvdywocG5nX3N0cnVjdHJwIHBuZ19wdHIpLFBOR19FTVBUWSk7DQorDQorI2lmZGVmIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVEDQorLyogT3B0aW9uYWwgY2FsbCB0byB1cGRhdGUgdGhlIHVzZXJzIGluZm8gc3RydWN0dXJlICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3JlYWRfdHJhbnNmb3JtX2luZm8sKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKy8qIFRoZXNlIGFyZSB0aGUgZnVuY3Rpb25zIHRoYXQgZG8gdGhlIHRyYW5zZm9ybWF0aW9ucyAqLw0KKyNpZmRlZiBQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX3JlYWRfZmlsbGVyLChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KKyAgICBwbmdfYnl0ZXAgcm93LCBwbmdfdWludF8zMiBmaWxsZXIsIHBuZ191aW50XzMyIGZsYWdzKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9TV0FQX0FMUEhBX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb19yZWFkX3N3YXBfYWxwaGEsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQorICAgIHBuZ19ieXRlcCByb3cpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9TV0FQX0FMUEhBX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb193cml0ZV9zd2FwX2FscGhhLChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KKyAgICBwbmdfYnl0ZXAgcm93KSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9JTlZFUlRfQUxQSEFfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX3JlYWRfaW52ZXJ0X2FscGhhLChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KKyAgICBwbmdfYnl0ZXAgcm93KSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfSU5WRVJUX0FMUEhBX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb193cml0ZV9pbnZlcnRfYWxwaGEsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQorICAgIHBuZ19ieXRlcCByb3cpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoUE5HX1dSSVRFX0ZJTExFUl9TVVBQT1JURUQpIHx8IFwNCisgICAgZGVmaW5lZChQTkdfUkVBRF9TVFJJUF9BTFBIQV9TVVBQT1JURUQpDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX3N0cmlwX2NoYW5uZWwsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQorICAgIHBuZ19ieXRlcCByb3csIGludCBhdF9zdGFydCksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HXzE2QklUX1NVUFBPUlRFRA0KKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NXQVBfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9TV0FQX1NVUFBPUlRFRCkNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fc3dhcCwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCisgICAgcG5nX2J5dGVwIHJvdyksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChQTkdfUkVBRF9QQUNLU1dBUF9TVVBQT1JURUQpIHx8IFwNCisgICAgZGVmaW5lZChQTkdfV1JJVEVfUEFDS1NXQVBfU1VQUE9SVEVEKQ0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb19wYWNrc3dhcCwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCisgICAgcG5nX2J5dGVwIHJvdyksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfZG9fcmdiX3RvX2dyYXksKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfcm93X2luZm9wIHJvd19pbmZvLCBwbmdfYnl0ZXAgcm93KSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9HUkFZX1RPX1JHQl9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fZ3JheV90b19yZ2IsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQorICAgIHBuZ19ieXRlcCByb3cpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX1BBQ0tfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX3VucGFjaywocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCisgICAgcG5nX2J5dGVwIHJvdyksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfU0hJRlRfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX3Vuc2hpZnQsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQorICAgIHBuZ19ieXRlcCByb3csIHBuZ19jb25zdF9jb2xvcl84cCBzaWdfYml0cyksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChQTkdfUkVBRF9JTlZFUlRfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9JTlZFUlRfU1VQUE9SVEVEKQ0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb19pbnZlcnQsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQorICAgIHBuZ19ieXRlcCByb3cpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX1NDQUxFXzE2X1RPXzhfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX3NjYWxlXzE2X3RvXzgsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQorICAgIHBuZ19ieXRlcCByb3cpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX1NUUklQXzE2X1RPXzhfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX2Nob3AsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQorICAgIHBuZ19ieXRlcCByb3cpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX1FVQU5USVpFX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb19xdWFudGl6ZSwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCisgICAgcG5nX2J5dGVwIHJvdywgcG5nX2NvbnN0X2J5dGVwIHBhbGV0dGVfbG9va3VwLA0KKyAgICBwbmdfY29uc3RfYnl0ZXAgcXVhbnRpemVfbG9va3VwKSxQTkdfRU1QVFkpOw0KKw0KKyMgIGlmZGVmIFBOR19DT1JSRUNUX1BBTEVUVEVfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2NvcnJlY3RfcGFsZXR0ZSwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19jb2xvcnAgcGFsZXR0ZSwgaW50IG51bV9wYWxldHRlKSxQTkdfRU1QVFkpOw0KKyMgIGVuZGlmDQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoUE5HX1JFQURfQkdSX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfQkdSX1NVUFBPUlRFRCkNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fYmdyLChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KKyAgICBwbmdfYnl0ZXAgcm93KSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfUEFDS19TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fcGFjaywocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCisgICBwbmdfYnl0ZXAgcm93LCBwbmdfdWludF8zMiBiaXRfZGVwdGgpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9TSElGVF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fc2hpZnQsKHBuZ19yb3dfaW5mb3Agcm93X2luZm8sDQorICAgIHBuZ19ieXRlcCByb3csIHBuZ19jb25zdF9jb2xvcl84cCBiaXRfZGVwdGgpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpIHx8XA0KKyAgICBkZWZpbmVkKFBOR19SRUFEX0FMUEhBX01PREVfU1VQUE9SVEVEKQ0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19kb19jb21wb3NlLChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KKyAgICBwbmdfYnl0ZXAgcm93LCBwbmdfc3RydWN0cnAgcG5nX3B0ciksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX2dhbW1hLChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KKyAgICBwbmdfYnl0ZXAgcm93LCBwbmdfc3RydWN0cnAgcG5nX3B0ciksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfQUxQSEFfTU9ERV9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fZW5jb2RlX2FscGhhLChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KKyAgIHBuZ19ieXRlcCByb3csIHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX2V4cGFuZF9wYWxldHRlLChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KKyAgICBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfY29sb3JwIHBhbGV0dGUsIHBuZ19jb25zdF9ieXRlcCB0cmFucywNCisgICAgaW50IG51bV90cmFucyksUE5HX0VNUFRZKTsNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fZXhwYW5kLChwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KKyAgICBwbmdfYnl0ZXAgcm93LCBwbmdfY29uc3RfY29sb3JfMTZwIHRyYW5zX2NvbG9yKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9FWFBBTkRfMTZfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX2V4cGFuZF8xNiwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCisgICAgcG5nX2J5dGVwIHJvdyksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisvKiBUaGUgZm9sbG93aW5nIGRlY29kZXMgdGhlIGFwcHJvcHJpYXRlIGNodW5rcywgYW5kIGRvZXMgZXJyb3IgY29ycmVjdGlvbiwNCisgKiB0aGVuIGNhbGxzIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFjayBmb3IgdGhlIGNodW5rIGlmIGl0IGlzIHZhbGlkLg0KKyAqLw0KKw0KKy8qIERlY29kZSB0aGUgSUhEUiBjaHVuayAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfSUhEUiwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX1BMVEUsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV9JRU5ELChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9iS0dEX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfYktHRCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfY0hSTV9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX2NIUk0sKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX2dBTUFfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV9nQU1BLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9oSVNUX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfaElTVCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfaUNDUF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX2lDQ1AsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7DQorI2VuZGlmIC8qIFBOR19SRUFEX2lDQ1BfU1VQUE9SVEVEICovDQorDQorI2lmZGVmIFBOR19SRUFEX2lUWHRfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV9pVFh0LChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9vRkZzX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfb0ZGcywocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfcENBTF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX3BDQUwsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX3BIWXNfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV9wSFlzLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9zQklUX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfc0JJVCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfc0NBTF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX3NDQUwsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX3NQTFRfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV9zUExULChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KKyNlbmRpZiAvKiBQTkdfUkVBRF9zUExUX1NVUFBPUlRFRCAqLw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9zUkdCX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfc1JHQiwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfdEVYdF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX3RFWHQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19SRUFEX3RJTUVfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2hhbmRsZV90SU1FLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF90Uk5TX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19oYW5kbGVfdFJOUywocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfelRYdF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX3pUWHQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2NoZWNrX2NodW5rX25hbWUsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfdWludF8zMiBjaHVua19uYW1lKSxQTkdfRU1QVFkpOw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaGFuZGxlX3Vua25vd24sKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyLCBwbmdfdWludF8zMiBsZW5ndGgsIGludCBrZWVwKSxQTkdfRU1QVFkpOw0KKyAgIC8qIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIHVua25vd24gY2h1bmtzLiAgVGhlICdrZWVwJw0KKyAgICAqIGFyZ3VtZW50IGlzIGVpdGhlciBub24temVybyBmb3IgYSBrbm93biBjaHVuayB0aGF0IGhhcyBiZWVuIHNldCB0byBiZQ0KKyAgICAqIGhhbmRsZWQgYXMgdW5rbm93biBvciB6ZXJvIGZvciBhbiB1bmtub3duIGNodW5rLiAgQnkgZGVmYXVsdCB0aGUgZnVuY3Rpb24NCisgICAgKiBqdXN0IHNraXBzIHRoZSBjaHVuayBvciBlcnJvcnMgb3V0IGlmIGl0IGlzIGNyaXRpY2FsLg0KKyAgICAqLw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQNCisjaWZkZWYgUE5HX1NFVF9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19jaHVua191bmtub3duX2hhbmRsaW5nLA0KKyAgICAocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ191aW50XzMyIGNodW5rX25hbWUpLFBOR19FTVBUWSk7DQorICAgLyogRXhhY3RseSBhcyB0aGUgQVBJIHBuZ19oYW5kbGVfYXNfdW5rbm93bigpIGV4Y2VwdCB0aGF0IHRoZSBhcmd1bWVudCBpcyBhDQorICAgICogMzItYml0IGNodW5rIG5hbWUsIG5vdCBhIHN0cmluZy4NCisgICAgKi8NCisjZW5kaWYNCisjZW5kaWYgLyogUE5HX1JFQURfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEICovDQorI2VuZGlmIC8qIFBOR19SRUFEX1NVUFBPUlRFRCAqLw0KKw0KKy8qIEhhbmRsZSB0aGUgdHJhbnNmb3JtYXRpb25zIGZvciByZWFkaW5nIGFuZCB3cml0aW5nICovDQorI2lmZGVmIFBOR19SRUFEX1RSQU5TRk9STVNfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX3JlYWRfdHJhbnNmb3JtYXRpb25zLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfcm93X2luZm9wIHJvd19pbmZvKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKyNpZmRlZiBQTkdfV1JJVEVfVFJBTlNGT1JNU19TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fd3JpdGVfdHJhbnNmb3JtYXRpb25zLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfcm93X2luZm9wIHJvd19pbmZvKSxQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9UUkFOU0ZPUk1TX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19pbml0X3JlYWRfdHJhbnNmb3JtYXRpb25zLChwbmdfc3RydWN0cnAgcG5nX3B0ciksDQorICAgIFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19QUk9HUkVTU0lWRV9SRUFEX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX3JlYWRfY2h1bmssKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyKSxQTkdfRU1QVFkpOw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX3JlYWRfc2lnLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciksUE5HX0VNUFRZKTsNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9jaGVja19jcmMsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSxQTkdfRU1QVFkpOw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX2NyY19za2lwLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX2NyY19maW5pc2gsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSwNCisgICAgUE5HX0VNUFRZKTsNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9zYXZlX2J1ZmZlciwocG5nX3N0cnVjdHJwIHBuZ19wdHIpLA0KKyAgICBQTkdfRU1QVFkpOw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX3Jlc3RvcmVfYnVmZmVyLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2J5dGVwIGJ1ZmZlciwgcG5nX3NpemVfdCBidWZmZXJfbGVuZ3RoKSxQTkdfRU1QVFkpOw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX3JlYWRfSURBVCwocG5nX3N0cnVjdHJwIHBuZ19wdHIpLFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3Byb2Nlc3NfSURBVF9kYXRhLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2J5dGVwIGJ1ZmZlciwgcG5nX3NpemVfdCBidWZmZXJfbGVuZ3RoKSxQTkdfRU1QVFkpOw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX3Byb2Nlc3Nfcm93LChwbmdfc3RydWN0cnAgcG5nX3B0ciksDQorICAgIFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3B1c2hfaGFuZGxlX3Vua25vd24sKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ19pbmZvcnAgaW5mb19wdHIsIHBuZ191aW50XzMyIGxlbmd0aCksUE5HX0VNUFRZKTsNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9oYXZlX2luZm8sKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ19pbmZvcnAgaW5mb19wdHIpLFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3B1c2hfaGF2ZV9lbmQsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ19pbmZvcnAgaW5mb19wdHIpLFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3B1c2hfaGF2ZV9yb3csKHBuZ19zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICAgcG5nX2J5dGVwIHJvdyksUE5HX0VNUFRZKTsNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcHVzaF9yZWFkX2VuZCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIpLFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3Byb2Nlc3Nfc29tZV9kYXRhLChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciksUE5HX0VNUFRZKTsNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfcmVhZF9wdXNoX2ZpbmlzaF9yb3csKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSwNCisgICAgUE5HX0VNUFRZKTsNCisjICBpZmRlZiBQTkdfUkVBRF90RVh0X1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX2hhbmRsZV90RVh0LChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX3JlYWRfdEVYdCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIpLFBOR19FTVBUWSk7DQorIyAgZW5kaWYNCisjICBpZmRlZiBQTkdfUkVBRF96VFh0X1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX2hhbmRsZV96VFh0LChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX3JlYWRfelRYdCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIpLFBOR19FTVBUWSk7DQorIyAgZW5kaWYNCisjICBpZmRlZiBQTkdfUkVBRF9pVFh0X1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX2hhbmRsZV9pVFh0LChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciwgcG5nX3VpbnRfMzIgbGVuZ3RoKSxQTkdfRU1QVFkpOw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19wdXNoX3JlYWRfaVRYdCwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ19pbmZvcnAgaW5mb19wdHIpLFBOR19FTVBUWSk7DQorIyAgZW5kaWYNCisNCisjZW5kaWYgLyogUE5HX1BST0dSRVNTSVZFX1JFQURfU1VQUE9SVEVEICovDQorDQorI2lmZGVmIFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2RvX3JlYWRfaW50cmFwaXhlbCwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCisgICAgcG5nX2J5dGVwIHJvdyksUE5HX0VNUFRZKTsNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fd3JpdGVfaW50cmFwaXhlbCwocG5nX3Jvd19pbmZvcCByb3dfaW5mbywNCisgICAgcG5nX2J5dGVwIHJvdyksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisvKiBBZGRlZCBhdCBsaWJwbmcgdmVyc2lvbiAxLjYuMCAqLw0KKyNpZmRlZiBQTkdfR0FNTUFfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2NvbG9yc3BhY2Vfc2V0X2dhbW1hLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLCBwbmdfZml4ZWRfcG9pbnQgZ0FNQSksIFBOR19FTVBUWSk7DQorICAgLyogU2V0IHRoZSBjb2xvcnNwYWNlIGdhbW1hIHdpdGggYSB2YWx1ZSBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24gb3IgYnkNCisgICAgKiB0aGUgZ0FNQSBjaHVuayBvbiByZWFkLiAgVGhlIHZhbHVlIHdpbGwgb3ZlcnJpZGUgYW55dGhpbmcgc2V0IGJ5IGFuIElDQw0KKyAgICAqIHByb2ZpbGUuDQorICAgICovDQorDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2NvbG9yc3BhY2Vfc3luY19pbmZvLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCisgICAgcG5nX2luZm9ycCBpbmZvX3B0ciksIFBOR19FTVBUWSk7DQorICAgIC8qIFN5bmNocm9uaXplIHRoZSBpbmZvICd2YWxpZCcgZmxhZ3Mgd2l0aCB0aGUgY29sb3JzcGFjZSAqLw0KKw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19jb2xvcnNwYWNlX3N5bmMsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgICBwbmdfaW5mb3JwIGluZm9fcHRyKSwgUE5HX0VNUFRZKTsNCisgICAgLyogQ29weSB0aGUgcG5nX3N0cnVjdCBjb2xvcnNwYWNlIHRvIHRoZSBpbmZvX3N0cnVjdCBhbmQgY2FsbCB0aGUgYWJvdmUgdG8NCisgICAgICogc3luY2hyb25pemUgdGhlIGZsYWdzLiAgQ2hlY2tzIGZvciBOVUxMIGluZm9fcHRyIGFuZCBkb2VzIG5vdGhpbmcuDQorICAgICAqLw0KKyNlbmRpZg0KKw0KKy8qIEFkZGVkIGF0IGxpYnBuZyB2ZXJzaW9uIDEuNC4wICovDQorI2lmZGVmIFBOR19DT0xPUlNQQUNFX1NVUFBPUlRFRA0KKy8qIFRoZXNlIGludGVybmFsIGZ1bmN0aW9ucyBhcmUgZm9yIG1haW50YWluaW5nIHRoZSBjb2xvcnNwYWNlIHN0cnVjdHVyZSB3aXRoaW4NCisgKiBhIHBuZ19pbmZvIG9yIHBuZ19zdHJ1Y3QgKG9yLCBpbmRlZWQsIGJvdGgpLg0KKyAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTihpbnQscG5nX2NvbG9yc3BhY2Vfc2V0X2Nocm9tYXRpY2l0aWVzLA0KKyAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLCBjb25zdCBwbmdfeHkgKnh5LA0KKyAgICBpbnQgcHJlZmVycmVkKSwgUE5HX0VNUFRZKTsNCisNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19jb2xvcnNwYWNlX3NldF9lbmRwb2ludHMsDQorICAgKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29sb3JzcGFjZXJwIGNvbG9yc3BhY2UsIGNvbnN0IHBuZ19YWVogKlhZWiwNCisgICAgaW50IHByZWZlcnJlZCksIFBOR19FTVBUWSk7DQorDQorI2lmZGVmIFBOR19zUkdCX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTihpbnQscG5nX2NvbG9yc3BhY2Vfc2V0X3NSR0IsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwgaW50IGludGVudCksIFBOR19FTVBUWSk7DQorICAgLyogVGhpcyBkb2VzIHNldCB0aGUgY29sb3JzcGFjZSBnQU1BIGFuZCBjSFJNIHZhbHVlcyB0b28sIGJ1dCBkb2Vzbid0IHNldCB0aGUNCisgICAgKiBmbGFncyB0byB3cml0ZSB0aGVtLCBpZiBpdCByZXR1cm5zIGZhbHNlIHRoZXJlIHdhcyBhIHByb2JsZW0gYW5kIGFuIGVycm9yDQorICAgICogbWVzc2FnZSBoYXMgYWxyZWFkeSBiZWVuIG91dHB1dCAoYnV0IHRoZSBjb2xvcnNwYWNlIG1heSBzdGlsbCBuZWVkIHRvIGJlDQorICAgICogc3luY2VkIHRvIHJlY29yZCB0aGUgaW52YWxpZCBmbGFnKS4NCisgICAgKi8NCisjZW5kaWYgLyogc1JHQiAqLw0KKw0KKyNpZmRlZiBQTkdfaUNDUF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19jb2xvcnNwYWNlX3NldF9JQ0MsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwgcG5nX2NvbnN0X2NoYXJwIG5hbWUsDQorICAgcG5nX3VpbnRfMzIgcHJvZmlsZV9sZW5ndGgsIHBuZ19jb25zdF9ieXRlcCBwcm9maWxlLCBpbnQgY29sb3JfdHlwZSksDQorICAgUE5HX0VNUFRZKTsNCisgICAvKiBUaGUgJ25hbWUnIGlzIHVzZWQgZm9yIGluZm9ybWF0aW9uIG9ubHkgKi8NCisNCisvKiBSb3V0aW5lcyBmb3IgY2hlY2tpbmcgcGFydHMgb2YgYW4gSUNDIHByb2ZpbGUuICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfaWNjX2NoZWNrX2xlbmd0aCwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQorICAgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLCBwbmdfY29uc3RfY2hhcnAgbmFtZSwNCisgICBwbmdfdWludF8zMiBwcm9maWxlX2xlbmd0aCksIFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfaWNjX2NoZWNrX2hlYWRlciwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQorICAgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLCBwbmdfY29uc3RfY2hhcnAgbmFtZSwNCisgICBwbmdfdWludF8zMiBwcm9maWxlX2xlbmd0aCwNCisgICBwbmdfY29uc3RfYnl0ZXAgcHJvZmlsZSAvKiBmaXJzdCAxMzIgYnl0ZXMgb25seSAqLywgaW50IGNvbG9yX3R5cGUpLA0KKyAgIFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfaWNjX2NoZWNrX3RhZ190YWJsZSwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQorICAgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLCBwbmdfY29uc3RfY2hhcnAgbmFtZSwNCisgICBwbmdfdWludF8zMiBwcm9maWxlX2xlbmd0aCwNCisgICBwbmdfY29uc3RfYnl0ZXAgcHJvZmlsZSAvKiBoZWFkZXIgcGx1cyB3aG9sZSB0YWcgdGFibGUgKi8pLCBQTkdfRU1QVFkpOw0KKyNpZmRlZiBQTkdfc1JHQl9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfaWNjX3NldF9zUkdCLCgNCisgICBwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLA0KKyAgIHBuZ19jb25zdF9ieXRlcCBwcm9maWxlLCB1TG9uZyBhZGxlciksIFBOR19FTVBUWSk7DQorICAgLyogJ2FkbGVyJyBpcyB0aGUgQWRsZXIzMiBjaGVja3N1bSBvZiB0aGUgdW5jb21wcmVzc2VkIHByb2ZpbGUgZGF0YS4gSXQgbWF5DQorICAgICogYmUgemVybyB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIG5vdCBhdmFpbGFibGUuICBJdCBpcyB1c2VkLCBpZiBwcm92aWRlZCwNCisgICAgKiBhcyBhIGZhc3QgY2hlY2sgb24gdGhlIHByb2ZpbGUgd2hlbiBjaGVja2luZyB0byBzZWUgaWYgaXQgaXMgc1JHQi4NCisgICAgKi8NCisjZW5kaWYNCisjZW5kaWYgLyogaUNDUCAqLw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfY29sb3JzcGFjZV9zZXRfcmdiX2NvZWZmaWNpZW50cywNCisgICAocG5nX3N0cnVjdHJwIHBuZ19wdHIpLCBQTkdfRU1QVFkpOw0KKyAgIC8qIFNldCB0aGUgcmdiX3RvX2dyYXkgY29lZmZpY2llbnRzIGZyb20gdGhlIGNvbG9yc3BhY2UgWSB2YWx1ZXMgKi8NCisjZW5kaWYgLyogUkVBRF9SR0JfVE9fR1JBWSAqLw0KKyNlbmRpZiAvKiBDT0xPUlNQQUNFICovDQorDQorLyogQWRkZWQgYXQgbGlicG5nIHZlcnNpb24gMS40LjAgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfY2hlY2tfSUhEUiwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQorICAgIHBuZ191aW50XzMyIHdpZHRoLCBwbmdfdWludF8zMiBoZWlnaHQsIGludCBiaXRfZGVwdGgsDQorICAgIGludCBjb2xvcl90eXBlLCBpbnQgaW50ZXJsYWNlX3R5cGUsIGludCBjb21wcmVzc2lvbl90eXBlLA0KKyAgICBpbnQgZmlsdGVyX3R5cGUpLFBOR19FTVBUWSk7DQorDQorLyogQWRkZWQgYXQgbGlicG5nIHZlcnNpb24gMS41LjEwICovDQorI2lmIGRlZmluZWQoUE5HX1JFQURfQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVhfU1VQUE9SVEVEKSB8fCBcDQorICAgIGRlZmluZWQoUE5HX1dSSVRFX0NIRUNLX0ZPUl9JTlZBTElEX0lOREVYX1NVUFBPUlRFRCkNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZG9fY2hlY2tfcGFsZXR0ZV9pbmRleGVzLA0KKyAgIChwbmdfc3RydWN0cnAgcG5nX3B0ciwgcG5nX3Jvd19pbmZvcCByb3dfaW5mbyksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChQTkdfRkxPQVRJTkdfUE9JTlRfU1VQUE9SVEVEKSAmJiBkZWZpbmVkKFBOR19FUlJPUl9URVhUX1NVUFBPUlRFRCkNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZml4ZWRfZXJyb3IsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ19jb25zdF9jaGFycCBuYW1lKSxQTkdfTk9SRVRVUk4pOw0KKyNlbmRpZg0KKw0KKy8qIFB1dHMgJ3N0cmluZycgaW50byAnYnVmZmVyJyBhdCBidWZmZXJbcG9zXSwgdGFraW5nIGNhcmUgbmV2ZXIgdG8gb3ZlcndyaXRlDQorICogdGhlIGVuZC4gIEFsd2F5cyBsZWF2ZXMgdGhlIGJ1ZmZlciBudWwgdGVybWluYXRlZC4gIE5ldmVyIGVycm9ycyBvdXQgKGFuZA0KKyAqIHRoZXJlIGlzIG5vIGVycm9yIGNvZGUuKQ0KKyAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTihzaXplX3QscG5nX3NhZmVjYXQsKHBuZ19jaGFycCBidWZmZXIsIHNpemVfdCBidWZzaXplLA0KKyAgIHNpemVfdCBwb3MsIHBuZ19jb25zdF9jaGFycCBzdHJpbmcpLFBOR19FTVBUWSk7DQorDQorLyogVmFyaW91cyBpbnRlcm5hbCBmdW5jdGlvbnMgdG8gaGFuZGxlIGZvcm1hdHRlZCB3YXJuaW5nIG1lc3NhZ2VzLCBjdXJyZW50bHkNCisgKiBvbmx5IGltcGxlbWVudGVkIGZvciB3YXJuaW5ncy4NCisgKi8NCisjaWYgZGVmaW5lZChQTkdfV0FSTklOR1NfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19USU1FX1JGQzExMjNfU1VQUE9SVEVEKQ0KKy8qIFV0aWxpdHkgdG8gZHVtcCBhbiB1bnNpZ25lZCB2YWx1ZSBpbnRvIGEgYnVmZmVyLCBnaXZlbiBhIHN0YXJ0IHBvaW50ZXIgYW5kDQorICogYW5kIGVuZCBwb2ludGVyICh3aGljaCBzaG91bGQgcG9pbnQganVzdCAqYmV5b25kKiB0aGUgZW5kIG9mIHRoZSBidWZmZXIhKQ0KKyAqIFJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmb3JtYXR0ZWQgc3RyaW5nLiAgVGhpcyB1dGlsaXR5IG9ubHkNCisgKiBkb2VzIHVuc2lnbmVkIHZhbHVlcy4NCisgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04ocG5nX2NoYXJwLHBuZ19mb3JtYXRfbnVtYmVyLChwbmdfY29uc3RfY2hhcnAgc3RhcnQsDQorICAgcG5nX2NoYXJwIGVuZCwgaW50IGZvcm1hdCwgcG5nX2FsbG9jX3NpemVfdCBudW1iZXIpLFBOR19FTVBUWSk7DQorDQorLyogQ29udmVuaWVuY2UgbWFjcm8gdGhhdCB0YWtlcyBhbiBhcnJheTogKi8NCisjZGVmaW5lIFBOR19GT1JNQVRfTlVNQkVSKGJ1ZmZlcixmb3JtYXQsbnVtYmVyKSBcDQorICAgcG5nX2Zvcm1hdF9udW1iZXIoYnVmZmVyLCBidWZmZXIgKyAoc2l6ZW9mIGJ1ZmZlciksIGZvcm1hdCwgbnVtYmVyKQ0KKw0KKy8qIFN1Z2dlc3RlZCBzaXplIGZvciBhIG51bWJlciBidWZmZXIgKGVub3VnaCBmb3IgNjQgYml0cyBhbmQgYSBzaWduISkgKi8NCisjZGVmaW5lIFBOR19OVU1CRVJfQlVGRkVSX1NJWkUgMjQNCisNCisvKiBUaGVzZSBhcmUgdGhlIGludGVnZXIgZm9ybWF0cyBjdXJyZW50bHkgc3VwcG9ydGVkLCB0aGUgbmFtZSBpcyBmb3JtZWQgZnJvbQ0KKyAqIHRoZSBzdGFuZGFyZCBwcmludGYoMykgZm9ybWF0IHN0cmluZy4NCisgKi8NCisjZGVmaW5lIFBOR19OVU1CRVJfRk9STUFUX3UgICAgIDEgLyogY2hvc2UgdW5zaWduZWQgQVBJISAqLw0KKyNkZWZpbmUgUE5HX05VTUJFUl9GT1JNQVRfMDJ1ICAgMg0KKyNkZWZpbmUgUE5HX05VTUJFUl9GT1JNQVRfZCAgICAgMSAvKiBjaG9zZSBzaWduZWQgQVBJISAqLw0KKyNkZWZpbmUgUE5HX05VTUJFUl9GT1JNQVRfMDJkICAgMg0KKyNkZWZpbmUgUE5HX05VTUJFUl9GT1JNQVRfeCAgICAgMw0KKyNkZWZpbmUgUE5HX05VTUJFUl9GT1JNQVRfMDJ4ICAgNA0KKyNkZWZpbmUgUE5HX05VTUJFUl9GT1JNQVRfZml4ZWQgNSAvKiBjaG9vc2UgdGhlIHNpZ25lZCBBUEkgKi8NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dBUk5JTkdTX1NVUFBPUlRFRA0KKy8qIE5ldyBkZWZpbmVzIGFuZCBtZW1iZXJzIGFkZGluZyBpbiBsaWJwbmctMS41LjQgKi8NCisjICBkZWZpbmUgUE5HX1dBUk5JTkdfUEFSQU1FVEVSX1NJWkUgMzINCisjICBkZWZpbmUgUE5HX1dBUk5JTkdfUEFSQU1FVEVSX0NPVU5UIDggLyogTWF4aW11bSA5OyBzZWUgcG5nZXJyb3IuYyAqLw0KKw0KKy8qIEFuIGwtdmFsdWUgb2YgdGhpcyB0eXBlIGhhcyB0byBiZSBwYXNzZWQgdG8gdGhlIEFQSXMgYmVsb3cgdG8gY2FjaGUgdGhlDQorICogdmFsdWVzIG9mIHRoZSBwYXJhbWV0ZXJzIHRvIGEgZm9ybWF0dGVkIHdhcm5pbmcgbWVzc2FnZS4NCisgKi8NCit0eXBlZGVmIGNoYXIgcG5nX3dhcm5pbmdfcGFyYW1ldGVyc1tQTkdfV0FSTklOR19QQVJBTUVURVJfQ09VTlRdWw0KKyAgIFBOR19XQVJOSU5HX1BBUkFNRVRFUl9TSVpFXTsNCisNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd2FybmluZ19wYXJhbWV0ZXIsKHBuZ193YXJuaW5nX3BhcmFtZXRlcnMgcCwNCisgICBpbnQgbnVtYmVyLCBwbmdfY29uc3RfY2hhcnAgc3RyaW5nKSxQTkdfRU1QVFkpOw0KKyAgIC8qIFBhcmFtZXRlcnMgYXJlIGxpbWl0ZWQgaW4gc2l6ZSB0byBQTkdfV0FSTklOR19QQVJBTUVURVJfU0laRSBjaGFyYWN0ZXJzLA0KKyAgICAqIGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgJ1wwJy4NCisgICAgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfd2FybmluZ19wYXJhbWV0ZXJfdW5zaWduZWQsDQorICAgKHBuZ193YXJuaW5nX3BhcmFtZXRlcnMgcCwgaW50IG51bWJlciwgaW50IGZvcm1hdCwgcG5nX2FsbG9jX3NpemVfdCB2YWx1ZSksDQorICAgUE5HX0VNUFRZKTsNCisgICAvKiBVc2UgcG5nX2FsbG9jX3NpemVfdCBiZWNhdXNlIGl0IGlzIGFuIHVuc2lnbmVkIHR5cGUgYXMgYmlnIGFzIGFueSB3ZQ0KKyAgICAqIG5lZWQgdG8gb3V0cHV0LiAgVXNlIHRoZSBmb2xsb3dpbmcgZm9yIGEgc2lnbmVkIHZhbHVlLg0KKyAgICAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ193YXJuaW5nX3BhcmFtZXRlcl9zaWduZWQsDQorICAgKHBuZ193YXJuaW5nX3BhcmFtZXRlcnMgcCwgaW50IG51bWJlciwgaW50IGZvcm1hdCwgcG5nX2ludF8zMiB2YWx1ZSksDQorICAgUE5HX0VNUFRZKTsNCisNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfZm9ybWF0dGVkX3dhcm5pbmcsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ193YXJuaW5nX3BhcmFtZXRlcnMgcCwgcG5nX2NvbnN0X2NoYXJwIG1lc3NhZ2UpLFBOR19FTVBUWSk7DQorICAgLyogJ21lc3NhZ2UnIGZvbGxvd3MgdGhlIFgvT3BlbiBhcHByb2FjaCBvZiB1c2luZyBAMSwgQDIgdG8gaW5zZXJ0DQorICAgICogcGFyYW1ldGVycyBwcmV2aW91c2x5IHN1cHBsaWVkIHVzaW5nIHRoZSBhYm92ZSBmdW5jdGlvbnMuICBFcnJvcnMgaW4NCisgICAgKiBzcGVjaWZ5aW5nIHRoZSBwYXJhbWV0ZXJzIHdpbGwgc2ltcGx5IHJlc3VsdCBpbiBnYXJiYWdlIHN1YnN0aXR1dGlvbnMuDQorICAgICovDQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19CRU5JR05fRVJST1JTX1NVUFBPUlRFRA0KKy8qIEFwcGxpY2F0aW9uIGVycm9ycyAobmV3IGluIDEuNik7IHVzZSB0aGVzZSBmdW5jdGlvbnMgKGRlY2xhcmVkIGJlbG93KSBmb3INCisgKiBlcnJvcnMgaW4gdGhlIHBhcmFtZXRlcnMgb3Igb3JkZXIgb2YgQVBJIGZ1bmN0aW9uIGNhbGxzIG9uIHJlYWQuICBUaGUNCisgKiAnd2FybmluZycgc2hvdWxkIGJlIHVzZWQgZm9yIGFuIGVycm9yIHRoYXQgY2FuIGJlIGhhbmRsZWQgY29tcGxldGVseTsgdGhlDQorICogJ2Vycm9yJyBmb3Igb25lIHdoaWNoIGNhbiBiZSBoYW5kbGVkIHNhZmVseSBidXQgd2hpY2ggbWF5IGxvc2UgYXBwbGljYXRpb24NCisgKiBpbmZvcm1hdGlvbiBvciBzZXR0aW5ncy4NCisgKg0KKyAqIEJ5IGRlZmF1bHQgdGhlc2UgYm90aCByZXN1bHQgaW4gYSBwbmdfZXJyb3IgY2FsbCBwcmlvciB0byByZWxlYXNlLCB3aGlsZSBpbiBhDQorICogcmVsZWFzZWQgdmVyc2lvbiB0aGUgJ3dhcm5pbmcnIGlzIGp1c3QgYSB3YXJuaW5nLiAgSG93ZXZlciBpZiB0aGUgYXBwbGljYXRpb24NCisgKiBleHBsaWNpdGx5IGRpc2FibGVzIGJlbmlnbiBlcnJvcnMgKGV4cGxpY2l0bHkgcGVybWl0dGluZyB0aGUgY29kZSB0byBsb3NlDQorICogaW5mb3JtYXRpb24pIHRoZXkgYm90aCB0dXJuIGludG8gd2FybmluZ3MuDQorICoNCisgKiBJZiBiZW5pZ24gZXJyb3JzIGFyZW4ndCBzdXBwb3J0ZWQgdGhleSBlbmQgdXAgYXMgdGhlIGNvcnJlc3BvbmRpbmcgYmFzZSBjYWxsDQorICogKHBuZ193YXJuaW5nIG9yIHBuZ19lcnJvci4pDQorICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2FwcF93YXJuaW5nLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfY29uc3RfY2hhcnAgbWVzc2FnZSksUE5HX0VNUFRZKTsNCisgICAvKiBUaGUgYXBwbGljYXRpb24gcHJvdmlkZWQgaW52YWxpZCBwYXJhbWV0ZXJzIHRvIGFuIEFQSSBmdW5jdGlvbiBvciBjYWxsZWQNCisgICAgKiBhbiBBUEkgZnVuY3Rpb24gYXQgdGhlIHdyb25nIHRpbWUsIGxpYnBuZyBjYW4gY29tcGxldGVseSByZWNvdmVyLg0KKyAgICAqLw0KKw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19hcHBfZXJyb3IsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLA0KKyAgIHBuZ19jb25zdF9jaGFycCBtZXNzYWdlKSxQTkdfRU1QVFkpOw0KKyAgIC8qIEFzIGFib3ZlIGJ1dCBsaWJwbmcgd2lsbCBpZ25vcmUgdGhlIGNhbGwsIG9yIGF0dGVtcHQgc29tZSBvdGhlciBwYXJ0aWFsDQorICAgICogcmVjb3ZlcnkgZnJvbSB0aGUgZXJyb3IuDQorICAgICovDQorI2Vsc2UNCisjICBkZWZpbmUgcG5nX2FwcF93YXJuaW5nKHBwLHMpIHBuZ193YXJuaW5nKHBwLHMpDQorIyAgZGVmaW5lIHBuZ19hcHBfZXJyb3IocHAscykgcG5nX2Vycm9yKHBwLHMpDQorI2VuZGlmDQorDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2NodW5rX3JlcG9ydCwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQorICAgcG5nX2NvbnN0X2NoYXJwIG1lc3NhZ2UsIGludCBlcnJvciksUE5HX0VNUFRZKTsNCisgICAvKiBSZXBvcnQgYSByZWNvdmVyYWJsZSBpc3N1ZSBpbiBjaHVuayBkYXRhLiAgT24gcmVhZCB0aGlzIGlzIHVzZWQgdG8gcmVwb3J0DQorICAgICogYSBwcm9ibGVtIGZvdW5kIHdoaWxlIHJlYWRpbmcgYSBwYXJ0aWN1bGFyIGNodW5rIGFuZCB0aGUNCisgICAgKiBwbmdfY2h1bmtfYmVuaWduX2Vycm9yIG9yIHBuZ19jaHVua193YXJuaW5nIGZ1bmN0aW9uIGlzIHVzZWQgYXMNCisgICAgKiBhcHByb3ByaWF0ZS4gIE9uIHdyaXRlIHRoaXMgaXMgdXNlZCB0byByZXBvcnQgYW4gZXJyb3IgdGhhdCBjb21lcyBmcm9tDQorICAgICogZGF0YSBzZXQgdmlhIGFuIGFwcGxpY2F0aW9uIGNhbGwgdG8gYSBwbmdfc2V0XyBBUEkgYW5kIHBuZ19hcHBfZXJyb3Igb3INCisgICAgKiBwbmdfYXBwX3dhcm5pbmcgaXMgdXNlZCBhcyBhcHByb3ByaWF0ZS4NCisgICAgKg0KKyAgICAqIFRoZSAnZXJyb3InIHBhcmFtZXRlciBtdXN0IGhhdmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKyAgICAqLw0KKyNkZWZpbmUgUE5HX0NIVU5LX1dBUk5JTkcgICAgIDAgLyogbmV2ZXIgYW4gZXJyb3IgKi8NCisjZGVmaW5lIFBOR19DSFVOS19XUklURV9FUlJPUiAxIC8qIGFuIGVycm9yIG9ubHkgb24gd3JpdGUgKi8NCisjZGVmaW5lIFBOR19DSFVOS19FUlJPUiAgICAgICAyIC8qIGFsd2F5cyBhbiBlcnJvciAqLw0KKw0KKy8qIEFTQ0lJIHRvIEZQIGludGVyZmFjZXMsIGN1cnJlbnRseSBvbmx5IGltcGxlbWVudGVkIGlmIHNDQUwNCisgKiBzdXBwb3J0IGlzIHJlcXVpcmVkLg0KKyAqLw0KKyNpZiBkZWZpbmVkKFBOR19zQ0FMX1NVUFBPUlRFRCkNCisvKiBNQVhfRElHSVRTIGlzIGFjdHVhbGx5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGFuIHNDQUwNCisgKiB3aWR0aCBvciBoZWlnaHQsIGRlcml2ZWQgZnJvbSB0aGUgcHJlY2lzaW9uIChudW1iZXIgb2Ygc2lnbmlmaWNhbnQNCisgKiBkaWdpdHMgLSBhIGJ1aWxkIHRpbWUgc2V0dGFibGUgb3B0aW9uKSBhbmQgYXNzdW1wdGlvbnMgYWJvdXQgdGhlDQorICogbWF4aW11bSByaWRpY3Vsb3VzIGV4cG9uZW50Lg0KKyAqLw0KKyNkZWZpbmUgUE5HX3NDQUxfTUFYX0RJR0lUUyAoUE5HX3NDQUxfUFJFQ0lTSU9OKzEvKi4qLysxLypFKi8rMTAvKmV4cG9uZW50Ki8pDQorDQorI2lmZGVmIFBOR19GTE9BVElOR19QT0lOVF9TVVBQT1JURUQNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCxwbmdfYXNjaWlfZnJvbV9mcCwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsDQorICAgcG5nX2NoYXJwIGFzY2lpLCBwbmdfc2l6ZV90IHNpemUsIGRvdWJsZSBmcCwgdW5zaWduZWQgaW50IHByZWNpc2lvbiksDQorICAgUE5HX0VNUFRZKTsNCisjZW5kaWYgLyogRkxPQVRJTkdfUE9JTlQgKi8NCisNCisjaWZkZWYgUE5HX0ZJWEVEX1BPSU5UX1NVUFBPUlRFRA0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19hc2NpaV9mcm9tX2ZpeGVkLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwNCisgICBwbmdfY2hhcnAgYXNjaWksIHBuZ19zaXplX3Qgc2l6ZSwgcG5nX2ZpeGVkX3BvaW50IGZwKSxQTkdfRU1QVFkpOw0KKyNlbmRpZiAvKiBGSVhFRF9QT0lOVCAqLw0KKyNlbmRpZiAvKiBzQ0FMICovDQorDQorI2lmIGRlZmluZWQoUE5HX3NDQUxfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19wQ0FMX1NVUFBPUlRFRCkNCisvKiBBbiBpbnRlcm5hbCBBUEkgdG8gdmFsaWRhdGUgdGhlIGZvcm1hdCBvZiBhIGZsb2F0aW5nIHBvaW50IG51bWJlci4NCisgKiBUaGUgcmVzdWx0IGlzIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBjaGFyYWN0ZXIuICBJZiB0aGUgbnVtYmVyIGlzDQorICogbm90IHZhbGlkIGl0IHdpbGwgYmUgdGhlIGluZGV4IG9mIGEgY2hhcmFjdGVyIGluIHRoZSBzdXBwb3NlZCBudW1iZXIuDQorICoNCisgKiBUaGUgZm9ybWF0IG9mIGEgbnVtYmVyIGlzIGRlZmluZWQgaW4gdGhlIFBORyBleHRlbnNpb25zIHNwZWNpZmljYXRpb24NCisgKiBhbmQgdGhpcyBBUEkgaXMgc3RyaWN0bHkgY29uZm9ybWFudCB0byB0aGF0IHNwZWMsIG5vdCBhbnlvbmUgZWxzZXMhDQorICoNCisgKiBUaGUgZm9ybWF0IGFzIGEgcmVndWxhciBleHByZXNzaW9uIGlzOg0KKyAqDQorICogWystXT9bMC05XSsuPyhbRWVdWystXT9bMC05XSspPw0KKyAqDQorICogb3I6DQorICoNCisgKiBbKy1dPy5bMC05XSsoLlswLTldKyk/KFtFZV1bKy1dP1swLTldKyk/DQorICoNCisgKiBUaGUgY29tcGxleGl0eSBpcyB0aGF0IGVpdGhlciBpbnRlZ2VyIG9yIGZyYWN0aW9uIG11c3QgYmUgcHJlc2VudCBhbmQgdGhlDQorICogZnJhY3Rpb24gaXMgcGVybWl0dGVkIHRvIGhhdmUgbm8gZGlnaXRzIG9ubHkgaWYgdGhlIGludGVnZXIgaXMgcHJlc2VudC4NCisgKg0KKyAqIE5PVEU6IFRoZSBkYW5nbGluZyBFIHByb2JsZW0uDQorICogICBUaGVyZSBpcyBhIFBORyB2YWxpZCBmbG9hdGluZyBwb2ludCBudW1iZXIgaW4gdGhlIGZvbGxvd2luZzoNCisgKg0KKyAqICAgICAgIFBORyBmbG9hdGluZyBwb2ludCBudW1iZXJzIGFyZSBub3QgZ3JlZWR5Lg0KKyAqDQorICogICBXb3JraW5nIHRoaXMgb3V0IHJlcXVpcmVzICpUV08qIGNoYXJhY3RlciBsb29rYWhlYWQgKGJlY2F1c2Ugb2YgdGhlDQorICogICBzaWduKSwgdGhlIHBhcnNlciBkb2VzIG5vdCBkbyB0aGlzIC0gaXQgd2lsbCBmYWlsIGF0IHRoZSAncicgLSB0aGlzDQorICogICBkb2Vzbid0IG1hdHRlciBmb3IgUE5HIHNDQUwgY2h1bmsgdmFsdWVzLCBidXQgaXQgcmVxdWlyZXMgbW9yZSBjYXJlDQorICogICBpZiB0aGUgdmFsdWUgd2VyZSBldmVyIHRvIGJlIGVtYmVkZGVkIGluIHNvbWV0aGluZyBtb3JlIGNvbXBsZXguICBVc2UNCisgKiAgIEFOU0ktQyBzdHJ0b2QgaWYgeW91IG5lZWQgdGhlIGxvb2thaGVhZC4NCisgKi8NCisvKiBTdGF0ZSB0YWJsZSBmb3IgdGhlIHBhcnNlci4gKi8NCisjZGVmaW5lIFBOR19GUF9JTlRFR0VSICAgIDAgIC8qIGJlZm9yZSBvciBpbiBpbnRlZ2VyICovDQorI2RlZmluZSBQTkdfRlBfRlJBQ1RJT04gICAxICAvKiBiZWZvcmUgb3IgaW4gZnJhY3Rpb24gKi8NCisjZGVmaW5lIFBOR19GUF9FWFBPTkVOVCAgIDIgIC8qIGJlZm9yZSBvciBpbiBleHBvbmVudCAqLw0KKyNkZWZpbmUgUE5HX0ZQX1NUQVRFICAgICAgMyAgLyogbWFzayBmb3IgdGhlIGFib3ZlICovDQorI2RlZmluZSBQTkdfRlBfU0FXX1NJR04gICA0ICAvKiBTYXcgKy8tIGluIGN1cnJlbnQgc3RhdGUgKi8NCisjZGVmaW5lIFBOR19GUF9TQVdfRElHSVQgIDggIC8qIFNhdyBhIGRpZ2l0IGluIGN1cnJlbnQgc3RhdGUgKi8NCisjZGVmaW5lIFBOR19GUF9TQVdfRE9UICAgMTYgIC8qIFNhdyBhIGRvdCBpbiBjdXJyZW50IHN0YXRlICovDQorI2RlZmluZSBQTkdfRlBfU0FXX0UgICAgIDMyICAvKiBTYXcgYW4gRSAob3IgZSkgaW4gY3VycmVudCBzdGF0ZSAqLw0KKyNkZWZpbmUgUE5HX0ZQX1NBV19BTlkgICA2MCAgLyogU2F3IGFueSBvZiB0aGUgYWJvdmUgNCAqLw0KKw0KKy8qIFRoZXNlIHRocmVlIHZhbHVlcyBkb24ndCBhZmZlY3QgdGhlIHBhcnNlci4gIFRoZXkgYXJlIHNldCBidXQgbm90IHVzZWQuDQorICovDQorI2RlZmluZSBQTkdfRlBfV0FTX1ZBTElEIDY0ICAvKiBQcmVjZWRpbmcgc3Vic3RyaW5nIGlzIGEgdmFsaWQgZnAgbnVtYmVyICovDQorI2RlZmluZSBQTkdfRlBfTkVHQVRJVkUgMTI4ICAvKiBBIG5lZ2F0aXZlIG51bWJlciwgaW5jbHVkaW5nICItMCIgKi8NCisjZGVmaW5lIFBOR19GUF9OT05aRVJPICAyNTYgIC8qIEEgbm9uLXplcm8gdmFsdWUgKi8NCisjZGVmaW5lIFBOR19GUF9TVElDS1kgICA0NDggIC8qIFRoZSBhYm92ZSB0aHJlZSBmbGFncyAqLw0KKw0KKy8qIFRoaXMgaXMgYXZhaWxhYmxlIGZvciB0aGUgY2FsbGVyIHRvIHN0b3JlIGluICdzdGF0ZScgaWYgcmVxdWlyZWQuICBEbyBub3QNCisgKiBjYWxsIHRoZSBwYXJzZXIgYWZ0ZXIgc2V0dGluZyBpdCAodGhlIHBhcnNlciBzb21ldGltZXMgY2xlYXJzIGl0LikNCisgKi8NCisjZGVmaW5lIFBOR19GUF9JTlZBTElEICA1MTIgIC8qIEF2YWlsYWJsZSBmb3IgY2FsbGVycyBhcyBhIGRpc3RpbmN0IHZhbHVlICovDQorDQorLyogUmVzdWx0IGNvZGVzIGZvciB0aGUgcGFyc2VyIChib29sZWFuIC0gdHJ1ZSBtZWFudHMgb2ssIGZhbHNlIG1lYW5zDQorICogbm90IG9rIHlldC4pDQorICovDQorI2RlZmluZSBQTkdfRlBfTUFZQkUgICAgICAwICAvKiBUaGUgbnVtYmVyIG1heSBiZSB2YWxpZCBpbiB0aGUgZnV0dXJlICovDQorI2RlZmluZSBQTkdfRlBfT0sgICAgICAgICAxICAvKiBUaGUgbnVtYmVyIGlzIHZhbGlkICovDQorDQorLyogVGVzdHMgb24gdGhlIHN0aWNreSBub24temVybyBhbmQgbmVnYXRpdmUgZmxhZ3MuICBUbyBwYXNzIHRoZXNlIGNoZWNrcw0KKyAqIHRoZSBzdGF0ZSBtdXN0IGFsc28gaW5kaWNhdGUgdGhhdCB0aGUgd2hvbGUgbnVtYmVyIGlzIHZhbGlkIC0gdGhpcyBpcw0KKyAqIGFjaGlldmVkIGJ5IHRlc3RpbmcgUE5HX0ZQX1NBV19ESUdJVCAoc2VlIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3Igd2h5IHRoaXMNCisgKiBpcyBlcXVpdmFsZW50IHRvIFBOR19GUF9PSyBhYm92ZS4pDQorICovDQorI2RlZmluZSBQTkdfRlBfTlpfTUFTSyAoUE5HX0ZQX1NBV19ESUdJVCB8IFBOR19GUF9ORUdBVElWRSB8IFBOR19GUF9OT05aRVJPKQ0KKyAgIC8qIE5aX01BU0s6IHRoZSBzdHJpbmcgaXMgdmFsaWQgYW5kIGEgbm9uLXplcm8gbmVnYXRpdmUgdmFsdWUgKi8NCisjZGVmaW5lIFBOR19GUF9aX01BU0sgKFBOR19GUF9TQVdfRElHSVQgfCBQTkdfRlBfTk9OWkVSTykNCisgICAvKiBaIE1BU0s6IHRoZSBzdHJpbmcgaXMgdmFsaWQgYW5kIGEgbm9uLXplcm8gdmFsdWUuICovDQorICAgLyogUE5HX0ZQX1NBV19ESUdJVDogdGhlIHN0cmluZyBpcyB2YWxpZC4gKi8NCisjZGVmaW5lIFBOR19GUF9JU19aRVJPKHN0YXRlKSAoKChzdGF0ZSkgJiBQTkdfRlBfWl9NQVNLKSA9PSBQTkdfRlBfU0FXX0RJR0lUKQ0KKyNkZWZpbmUgUE5HX0ZQX0lTX1BPU0lUSVZFKHN0YXRlKSAoKChzdGF0ZSkgJiBQTkdfRlBfTlpfTUFTSykgPT0gUE5HX0ZQX1pfTUFTSykNCisjZGVmaW5lIFBOR19GUF9JU19ORUdBVElWRShzdGF0ZSkgKCgoc3RhdGUpICYgUE5HX0ZQX05aX01BU0spID09IFBOR19GUF9OWl9NQVNLKQ0KKw0KKy8qIFRoZSBhY3R1YWwgcGFyc2VyLiAgVGhpcyBjYW4gYmUgY2FsbGVkIHJlcGVhdGVkbHkuIEl0IHVwZGF0ZXMNCisgKiB0aGUgaW5kZXggaW50byB0aGUgc3RyaW5nIGFuZCB0aGUgc3RhdGUgdmFyaWFibGUgKHdoaWNoIG11c3QNCisgKiBiZSBpbml0aWFsaXplZCB0byAwKS4gIEl0IHJldHVybnMgYSByZXN1bHQgY29kZSwgYXMgYWJvdmUuICBUaGVyZQ0KKyAqIGlzIG5vIHBvaW50IGNhbGxpbmcgdGhlIHBhcnNlciBhbnkgbW9yZSBpZiBpdCBmYWlscyB0byBhZHZhbmNlIHRvDQorICogdGhlIGVuZCBvZiB0aGUgc3RyaW5nIC0gaXQgaXMgc3R1Y2sgb24gYW4gaW52YWxpZCBjaGFyYWN0ZXIgKG9yDQorICogdGVybWluYXRlZCBieSAnXDAnKS4NCisgKg0KKyAqIE5vdGUgdGhhdCB0aGUgcG9pbnRlciB3aWxsIGNvbnN1bWUgYW4gRSBvciBldmVuIGFuIEUrIGFuZCB0aGVuIGxlYXZlDQorICogYSAnbWF5YmUnIHN0YXRlIGV2ZW4gdGhvdWdoIGEgcHJlY2VkaW5nIGludGVnZXIuZnJhY3Rpb24gaXMgdmFsaWQuDQorICogVGhlIFBOR19GUF9XQVNfVkFMSUQgZmxhZyBpbmRpY2F0ZXMgdGhhdCBhIHByZWNlZGluZyBzdWJzdHJpbmcgd2FzDQorICogYSB2YWxpZCBudW1iZXIuICBJdCdzIHBvc3NpYmxlIHRvIHJlY292ZXIgZnJvbSB0aGlzIGJ5IGNhbGxpbmcNCisgKiB0aGUgcGFyc2VyIGFnYWluIChmcm9tIHRoZSBzdGFydCwgd2l0aCBzdGF0ZSAwKSBidXQgd2l0aCBhIHN0cmluZw0KKyAqIHRoYXQgb21pdHMgdGhlIGxhc3QgY2hhcmFjdGVyIChpLmUuIHNldCB0aGUgc2l6ZSB0byB0aGUgaW5kZXggb2YNCisgKiB0aGUgcHJvYmxlbSBjaGFyYWN0ZXIuKSAgVGhpcyBoYXMgbm90IGJlZW4gdGVzdGVkIHdpdGhpbiBsaWJwbmcuDQorICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfY2hlY2tfZnBfbnVtYmVyLChwbmdfY29uc3RfY2hhcnAgc3RyaW5nLA0KKyAgIHBuZ19zaXplX3Qgc2l6ZSwgaW50ICpzdGF0ZXAsIHBuZ19zaXplX3RwIHdoZXJlYW1pKSxQTkdfRU1QVFkpOw0KKw0KKy8qIFRoaXMgaXMgdGhlIHNhbWUgYnV0IGl0IGNoZWNrcyBhIGNvbXBsZXRlIHN0cmluZyBhbmQgcmV0dXJucyB0cnVlDQorICogb25seSBpZiBpdCBqdXN0IGNvbnRhaW5zIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLiAgQXMgb2YgMS41LjQgdGhpcw0KKyAqIGZ1bmN0aW9uIGFsc28gcmV0dXJucyB0aGUgc3RhdGUgYXQgdGhlIGVuZCBvZiBwYXJzaW5nIHRoZSBudW1iZXIgaWYNCisgKiBpdCB3YXMgdmFsaWQgKG90aGVyd2lzZSBpdCByZXR1cm5zIDAuKSAgVGhpcyBjYW4gYmUgdXNlZCBmb3IgdGVzdGluZw0KKyAqIGZvciBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlcyB1c2luZyB0aGUgc3RpY2t5IGZsYWcuDQorICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfY2hlY2tfZnBfc3RyaW5nLChwbmdfY29uc3RfY2hhcnAgc3RyaW5nLA0KKyAgIHBuZ19zaXplX3Qgc2l6ZSksUE5HX0VNUFRZKTsNCisjZW5kaWYgLyogcENBTCB8fCBzQ0FMICovDQorDQorI2lmIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKSB8fFwNCisgICAgZGVmaW5lZChQTkdfSU5DSF9DT05WRVJTSU9OU19TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfcEhZc19TVVBQT1JURUQpDQorLyogQWRkZWQgYXQgbGlicG5nIHZlcnNpb24gMS41LjAgKi8NCisvKiBUaGlzIGlzIGEgdXRpbGl0eSB0byBwcm92aWRlIGEqdGltZXMvZGl2IChyb3VuZGVkKSBhbmQgaW5kaWNhdGUNCisgKiBpZiB0aGVyZSBpcyBhbiBvdmVyZmxvdy4gIFRoZSByZXN1bHQgaXMgYSBib29sZWFuIC0gZmFsc2UgKDApDQorICogZm9yIG92ZXJmbG93LCB0cnVlICgxKSBpZiBubyBvdmVyZmxvdywgaW4gd2hpY2ggY2FzZSAqcmVzDQorICogaG9sZHMgdGhlIHJlc3VsdC4NCisgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19tdWxkaXYsKHBuZ19maXhlZF9wb2ludF9wIHJlcywgcG5nX2ZpeGVkX3BvaW50IGEsDQorICAgcG5nX2ludF8zMiBtdWx0aXBsaWVkX2J5LCBwbmdfaW50XzMyIGRpdmlkZWRfYnkpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19JTkNIX0NPTlZFUlNJT05TX1NVUFBPUlRFRCkNCisvKiBTYW1lIGRlYWwsIGJ1dCBpc3N1ZSBhIHdhcm5pbmcgb24gb3ZlcmZsb3cgYW5kIHJldHVybiAwLiAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTihwbmdfZml4ZWRfcG9pbnQscG5nX211bGRpdl93YXJuLA0KKyAgIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2ZpeGVkX3BvaW50IGEsIHBuZ19pbnRfMzIgbXVsdGlwbGllZF9ieSwNCisgICBwbmdfaW50XzMyIGRpdmlkZWRfYnkpLFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19HQU1NQV9TVVBQT1JURUQNCisvKiBDYWxjdWxhdGUgYSByZWNpcHJvY2FsIC0gdXNlZCBmb3IgZ2FtbWEgdmFsdWVzLiAgVGhpcyByZXR1cm5zDQorICogMCBpZiB0aGUgYXJndW1lbnQgaXMgMCBpbiBvcmRlciB0byBtYWludGFpbiBhbiB1bmRlZmluZWQgdmFsdWU7DQorICogdGhlcmUgYXJlIG5vIHdhcm5pbmdzLg0KKyAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTihwbmdfZml4ZWRfcG9pbnQscG5nX3JlY2lwcm9jYWwsKHBuZ19maXhlZF9wb2ludCBhKSwNCisgICBQTkdfRU1QVFkpOw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQNCisvKiBUaGUgc2FtZSBidXQgZ2l2ZXMgYSByZWNpcHJvY2FsIG9mIHRoZSBwcm9kdWN0IG9mIHR3byBmaXhlZCBwb2ludA0KKyAqIHZhbHVlcy4gIEFjY3VyYWN5IGlzIHN1aXRhYmxlIGZvciBnYW1tYSBjYWxjdWxhdGlvbnMgYnV0IHRoaXMgaXMNCisgKiBub3QgZXhhY3QgLSB1c2UgcG5nX211bGRpdiBmb3IgdGhhdC4gIE9ubHkgcmVxdWlyZWQgYXQgcHJlc2VudCBvbiByZWFkLg0KKyAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTihwbmdfZml4ZWRfcG9pbnQscG5nX3JlY2lwcm9jYWwyLChwbmdfZml4ZWRfcG9pbnQgYSwNCisgICBwbmdfZml4ZWRfcG9pbnQgYiksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisvKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2FtbWEgdmFsdWUgaXMgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgZnJvbSAxLjAgKi8NCitQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19nYW1tYV9zaWduaWZpY2FudCwocG5nX2ZpeGVkX3BvaW50IGdhbW1hX3ZhbHVlKSwNCisgICBQTkdfRU1QVFkpOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQNCisvKiBJbnRlcm5hbCBmaXhlZCBwb2ludCBnYW1tYSBjb3JyZWN0aW9uLiAgVGhlc2UgQVBJcyBhcmUgY2FsbGVkIGFzDQorICogcmVxdWlyZWQgdG8gY29udmVydCBzaW5nbGUgdmFsdWVzIC0gdGhleSBkb24ndCBuZWVkIHRvIGJlIGZhc3QsDQorICogdGhleSBhcmUgbm90IHVzZWQgd2hlbiBwcm9jZXNzaW5nIGltYWdlIHBpeGVsIHZhbHVlcy4NCisgKg0KKyAqIFdoaWxlIHRoZSBpbnB1dCBpcyBhbiAndW5zaWduZWQnIHZhbHVlIGl0IG11c3QgYWN0dWFsbHkgYmUgdGhlDQorICogY29ycmVjdCBiaXQgdmFsdWUgLSAwLi4yNTUgb3IgMC4uNjU1MzUgYXMgcmVxdWlyZWQuDQorICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHBuZ191aW50XzE2LHBuZ19nYW1tYV9jb3JyZWN0LChwbmdfc3RydWN0cnAgcG5nX3B0ciwNCisgICB1bnNpZ25lZCBpbnQgdmFsdWUsIHBuZ19maXhlZF9wb2ludCBnYW1tYV92YWx1ZSksUE5HX0VNUFRZKTsNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04ocG5nX3VpbnRfMTYscG5nX2dhbW1hXzE2Yml0X2NvcnJlY3QsKHVuc2lnbmVkIGludCB2YWx1ZSwNCisgICBwbmdfZml4ZWRfcG9pbnQgZ2FtbWFfdmFsdWUpLFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHBuZ19ieXRlLHBuZ19nYW1tYV84Yml0X2NvcnJlY3QsKHVuc2lnbmVkIGludCB2YWx1ZSwNCisgICBwbmdfZml4ZWRfcG9pbnQgZ2FtbWFfdmFsdWUpLFBOR19FTVBUWSk7DQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX2Rlc3Ryb3lfZ2FtbWFfdGFibGUsKHBuZ19zdHJ1Y3RycCBwbmdfcHRyKSwNCisgICBQTkdfRU1QVFkpOw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19idWlsZF9nYW1tYV90YWJsZSwocG5nX3N0cnVjdHJwIHBuZ19wdHIsDQorICAgaW50IGJpdF9kZXB0aCksUE5HX0VNUFRZKTsNCisjZW5kaWYNCisNCisvKiBTSU1QTElGSUVEIFJFQUQvV1JJVEUgU1VQUE9SVCAqLw0KKyNpZiBkZWZpbmVkKFBOR19TSU1QTElGSUVEX1JFQURfU1VQUE9SVEVEKSB8fFwNCisgICBkZWZpbmVkKFBOR19TSU1QTElGSUVEX1dSSVRFX1NVUFBPUlRFRCkNCisvKiBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIHRoYXQgcG5nX2ltYWdlOjpvcGFxdWUgcG9pbnRzIHRvLiAqLw0KK3R5cGVkZWYgc3RydWN0IHBuZ19jb250cm9sDQorew0KKyAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHI7DQorICAgcG5nX2luZm9wICAgaW5mb19wdHI7DQorICAgcG5nX3ZvaWRwICAgZXJyb3JfYnVmOyAgICAgICAgICAgLyogQWx3YXlzIGEgam1wX2J1ZiBhdCBwcmVzZW50LiAqLw0KKw0KKyAgIHBuZ19jb25zdF9ieXRlcCBtZW1vcnk7ICAgICAgICAgIC8qIE1lbW9yeSBidWZmZXIuICovDQorICAgcG5nX3NpemVfdCAgICAgIHNpemU7ICAgICAgICAgICAgLyogU2l6ZSBvZiB0aGUgbWVtb3J5IGJ1ZmZlci4gKi8NCisNCisgICB1bnNpZ25lZCBpbnQgZm9yX3dyaXRlICAgICAgIDoxOyAvKiBPdGhlcndpc2UgaXQgaXMgYSByZWFkIHN0cnVjdHVyZSAqLw0KKyAgIHVuc2lnbmVkIGludCBvd25lZF9maWxlICAgICAgOjE7IC8qIFdlIG93biB0aGUgZmlsZSBpbiBpb19wdHIgKi8NCit9IHBuZ19jb250cm9sOw0KKw0KKy8qIFJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgam1wX2J1ZiBmcm9tIGEgcG5nX2NvbnRyb2w6IG5lY2Vzc2FyeSBiZWNhdXNlIEMNCisgKiBkb2VzIG5vdCByZXZlYWwgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnRzIG9mIGptcF9idWYuDQorICovDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorIyAgZGVmaW5lIHBuZ19jb250cm9sX2ptcF9idWYocGMpICgoKGptcF9idWYqKSgocGMpLT5lcnJvcl9idWYpKVswXSkNCisjZWxzZQ0KKyMgIGRlZmluZSBwbmdfY29udHJvbF9qbXBfYnVmKHBjKSAoKHBjKS0+ZXJyb3JfYnVmKQ0KKyNlbmRpZg0KKw0KKy8qIFV0aWxpdHkgdG8gc2FmZWx5IGV4ZWN1dGUgYSBwaWVjZSBvZiBsaWJwbmcgY29kZSBjYXRjaGluZyBhbmQgbG9nZ2luZyBhbnkNCisgKiBlcnJvcnMgdGhhdCBtaWdodCBvY2N1ci4gIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlIChlaXRoZXINCisgKiBvZiB0aGUgZnVuY3Rpb24gb3IgYXMgYSByZXN1bHQgb2YgYSBwbmdfZXJyb3IuKQ0KKyAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLHBuZ19zYWZlX2Vycm9yLChwbmdfc3RydWN0cCBwbmdfcHRyLA0KKyAgIHBuZ19jb25zdF9jaGFycCBlcnJvcl9tZXNzYWdlKSxQTkdfTk9SRVRVUk4pOw0KKw0KKyNpZmRlZiBQTkdfV0FSTklOR1NfU1VQUE9SVEVEDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQscG5nX3NhZmVfd2FybmluZywocG5nX3N0cnVjdHAgcG5nX3B0ciwNCisgICBwbmdfY29uc3RfY2hhcnAgd2FybmluZ19tZXNzYWdlKSxQTkdfRU1QVFkpOw0KKyNlbHNlDQorIyAgZGVmaW5lIHBuZ19zYWZlX3dhcm5pbmcgMC8qZHVtbXkgYXJndW1lbnQqLw0KKyNlbmRpZg0KKw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTihpbnQscG5nX3NhZmVfZXhlY3V0ZSwocG5nX2ltYWdlcCBpbWFnZSwNCisgICBpbnQgKCpmdW5jdGlvbikocG5nX3ZvaWRwKSwgcG5nX3ZvaWRwIGFyZyksUE5HX0VNUFRZKTsNCisNCisvKiBVdGlsaXR5IHRvIGxvZyBhbiBlcnJvcjsgdGhpcyBhbHNvIGNsZWFucyB1cCB0aGUgcG5nX2ltYWdlOyB0aGUgZnVuY3Rpb24NCisgKiBhbHdheXMgcmV0dXJucyAwIChmYWxzZSkuDQorICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfaW1hZ2VfZXJyb3IsKHBuZ19pbWFnZXAgaW1hZ2UsDQorICAgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21lc3NhZ2UpLFBOR19FTVBUWSk7DQorDQorI2lmbmRlZiBQTkdfU0lNUExJRklFRF9SRUFEX1NVUFBPUlRFRA0KKy8qIHBuZ19pbWFnZV9mcmVlIGlzIHVzZWQgYnkgdGhlIHdyaXRlIGNvZGUgYnV0IG5vdCBleHBvcnRlZCAqLw0KK1BOR19JTlRFUk5BTF9GVU5DVElPTih2b2lkLCBwbmdfaW1hZ2VfZnJlZSwgKHBuZ19pbWFnZXAgaW1hZ2UpLCBQTkdfRU1QVFkpOw0KKyNlbmRpZiAvKiAhU0lNUExJRklFRF9SRUFEICovDQorDQorI2VuZGlmIC8qIFNJTVBMSUZJRUQgUkVBRC9XUklURSAqLw0KKw0KKy8qIFRoZXNlIGFyZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgZm9yIGhhcmR3YXJlIHNwZWNpZmljIFBORyBmaWx0ZXINCisgKiBvcHRpbWl6YXRpb25zOyBsaXN0IHRoZXNlIGhlcmUgdGhlbiBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIG9uZSBhdCBjb21waWxlDQorICogdGltZSB1c2luZyB0aGUgbWFjcm8gUE5HX0ZJTFRFUl9PUFRJTUlaQVRJT05TLiAgSWYgdGhlIG1hY3JvIGlzIG5vdCBkZWZpbmVkDQorICogdGhlIGdlbmVyaWMgY29kZSBpcyB1c2VkLg0KKyAqLw0KKyNpZmRlZiBQTkdfRklMVEVSX09QVElNSVpBVElPTlMNCitQTkdfSU5URVJOQUxfRlVOQ1RJT04odm9pZCwgUE5HX0ZJTFRFUl9PUFRJTUlaQVRJT05TLCAocG5nX3N0cnVjdHAgcG5nX3B0ciwNCisgICB1bnNpZ25lZCBpbnQgYnBwKSwgUE5HX0VNUFRZKTsNCisgICAvKiBKdXN0IGRlY2xhcmUgdGhlIG9wdGltaXphdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCAqLw0KKyNlbHNlDQorICAgLyogTGlzdCAqYWxsKiB0aGUgcG9zc2libGUgb3B0aW1pemF0aW9ucyBoZXJlIC0gdGhpcyBicmFuY2ggaXMgcmVxdWlyZWQgaWYNCisgICAgKiB0aGUgYnVpbGRlciBvZiBsaWJwbmcgcGFzc2VzIHRoZSBkZWZpbml0aW9uIG9mIFBOR19GSUxURVJfT1BUSU1JWkFUSU9OUyBpbg0KKyAgICAqIENGTEFHUyBpbiBwbGFjZSBvZiBDUFBGTEFHUyAqYW5kKiB1c2VzIHN5bWJvbCBwcmVmaXhpbmcuDQorICAgICovDQorUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKHZvaWQsIHBuZ19pbml0X2ZpbHRlcl9mdW5jdGlvbnNfbmVvbiwNCisgICAocG5nX3N0cnVjdHAgcG5nX3B0ciwgdW5zaWduZWQgaW50IGJwcCksIFBOR19FTVBUWSk7DQorI2VuZGlmDQorDQorLyogTWFpbnRhaW5lcjogUHV0IG5ldyBwcml2YXRlIHByb3RvdHlwZXMgaGVyZSBeICovDQorDQorI2luY2x1ZGUgInBuZ2RlYnVnLmgiDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfQ0KKyNlbmRpZg0KKw0KKyNlbmRpZiAvKiBQTkdfVkVSU0lPTl9JTkZPX09OTFkgKi8NCisjZW5kaWYgLyogUE5HUFJJVl9IICovDQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9meF9scG5nL2xwbmdfdjE2My9meF9wbmdyZWFkLmMgYi90aGlyZF9wYXJ0eS9scG5nX3YxNjMvcG5ncmVhZC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzYW1wbGVzL2Z4X2xwbmcvbHBuZ192MTYzL2Z4X3BuZ3JlYWQuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbHBuZ192MTYzL3BuZ3JlYWQuYwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9meF9scG5nL2xwbmdfdjE2My9meF9wbmdyaW8uYyBiL3RoaXJkX3BhcnR5L2xwbmdfdjE2My9wbmdyaW8uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2FtcGxlcy9meF9scG5nL2xwbmdfdjE2My9meF9wbmdyaW8uYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbHBuZ192MTYzL3BuZ3Jpby5jCmRpZmYgLS1naXQgYS9zYW1wbGVzL2Z4X2xwbmcvbHBuZ192MTYzL2Z4X3BuZ3J0cmFuLmMgYi90aGlyZF9wYXJ0eS9scG5nX3YxNjMvcG5ncnRyYW4uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2FtcGxlcy9meF9scG5nL2xwbmdfdjE2My9meF9wbmdydHJhbi5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9scG5nX3YxNjMvcG5ncnRyYW4uYwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9meF9scG5nL2xwbmdfdjE2My9meF9wbmdydXRpbC5jIGIvdGhpcmRfcGFydHkvbHBuZ192MTYzL3BuZ3J1dGlsLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNhbXBsZXMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5ncnV0aWwuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbHBuZ192MTYzL3BuZ3J1dGlsLmMKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5nc2V0LmMgYi90aGlyZF9wYXJ0eS9scG5nX3YxNjMvcG5nc2V0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNhbXBsZXMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5nc2V0LmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xwbmdfdjE2My9wbmdzZXQuYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbHBuZ192MTYzL3BuZ3N0cnVjdC5oIGIvdGhpcmRfcGFydHkvbHBuZ192MTYzL3BuZ3N0cnVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YWRhYTEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9scG5nX3YxNjMvcG5nc3RydWN0LmgKQEAgLTAsMCArMSw0ODkgQEAKKw0KKy8qIHBuZ3N0cnVjdC5oIC0gaGVhZGVyIGZpbGUgZm9yIFBORyByZWZlcmVuY2UgbGlicmFyeQ0KKyAqDQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTMgR2xlbm4gUmFuZGVycy1QZWhyc29uDQorICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpDQorICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQ0KKyAqDQorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMSBbTWFyY2ggMjgsIDIwMTNdDQorICoNCisgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLg0KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGRpc2NsYWltZXINCisgKiBhbmQgbGljZW5zZSBpbiBwbmcuaA0KKyAqLw0KKw0KKy8qIFRoZSBzdHJ1Y3R1cmUgdGhhdCBob2xkcyB0aGUgaW5mb3JtYXRpb24gdG8gcmVhZCBhbmQgd3JpdGUgUE5HIGZpbGVzLg0KKyAqIFRoZSBvbmx5IHBlb3BsZSB3aG8gbmVlZCB0byBjYXJlIGFib3V0IHdoYXQgaXMgaW5zaWRlIG9mIHRoaXMgYXJlIHRoZQ0KKyAqIHBlb3BsZSB3aG8gd2lsbCBiZSBtb2RpZnlpbmcgdGhlIGxpYnJhcnkgZm9yIHRoZWlyIG93biBzcGVjaWFsIG5lZWRzLg0KKyAqIEl0IHNob3VsZCBOT1QgYmUgYWNjZXNzZWQgZGlyZWN0bHkgYnkgYW4gYXBwbGljYXRpb24uDQorICovDQorDQorI2lmbmRlZiBQTkdTVFJVQ1RfSA0KKyNkZWZpbmUgUE5HU1RSVUNUX0gNCisvKiB6bGliLmggZGVmaW5lcyB0aGUgc3RydWN0dXJlIHpfc3RyZWFtLCBhbiBpbnN0YW5jZSBvZiB3aGljaCBpcyBpbmNsdWRlZA0KKyAqIGluIHRoaXMgc3RydWN0dXJlIGFuZCBpcyByZXF1aXJlZCBmb3IgZGVjb21wcmVzc2luZyB0aGUgTFogY29tcHJlc3NlZA0KKyAqIGRhdGEgaW4gUE5HIGZpbGVzLg0KKyAqLw0KKyNpZm5kZWYgWkxJQl9DT05TVA0KKyAgIC8qIFdlIG11c3QgZW5zdXJlIHRoYXQgemxpYiB1c2VzICdjb25zdCcgaW4gZGVjbGFyYXRpb25zLiAqLw0KKyMgIGRlZmluZSBaTElCX0NPTlNUDQorI2VuZGlmDQorI2luY2x1ZGUgInRoaXJkX3BhcnR5L3psaWJfdjEyOC96bGliLmgiDQorI2lmZGVmIGNvbnN0DQorICAgLyogemxpYi5oIHNvbWV0aW1lcyAjZGVmaW5lcyBjb25zdCB0byBub3RoaW5nLCB1bmRvIHRoaXMuICovDQorIyAgdW5kZWYgY29uc3QNCisjZW5kaWYNCisNCisvKiB6bGliLmggaGFzIG1lZGlvY3JlIHpfY29uc3QgdXNlIGJlZm9yZSAxLjIuNiwgdGhpcyBzdHVmZiBpcyBmb3IgY29tcGF0aWJpbGl0eQ0KKyAqIHdpdGggb2xkZXIgYnVpbGRzLg0KKyAqLw0KKyNpZiBaTElCX1ZFUk5VTSA8IDB4MTI2MA0KKyMgIGRlZmluZSBQTkdaX01TR19DQVNUKHMpIHBuZ19jb25zdGNhc3QoY2hhcioscykNCisjICBkZWZpbmUgUE5HWl9JTlBVVF9DQVNUKGIpIHBuZ19jb25zdGNhc3QocG5nX2J5dGVwLGIpDQorI2Vsc2UNCisjICBkZWZpbmUgUE5HWl9NU0dfQ0FTVChzKSAocykNCisjICBkZWZpbmUgUE5HWl9JTlBVVF9DQVNUKGIpIChiKQ0KKyNlbmRpZg0KKw0KKy8qIHpsaWIuaCBkZWNsYXJlcyBhIG1hZ2ljIHR5cGUgJ3VJbnQnIHRoYXQgbGltaXRzIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IHpsaWINCisgKiBjYW4gaGFuZGxlIGF0IG9uY2UuICBUaGlzIHR5cGUgbmVlZCBiZSBubyBsYXJnZXIgdGhhbiAxNiBiaXRzIChzbyBtYXhpbXVtIG9mDQorICogNjU1MzUpLCB0aGlzIGRlZmluZSBhbGxvd3MgdXMgdG8gZGlzY292ZXIgaG93IGJpZyBpdCBpcywgYnV0IGxpbWl0ZWQgYnkgdGhlDQorICogbWF4aW11dW0gZm9yIHBuZ19zaXplX3QuICBUaGUgdmFsdWUgY2FuIGJlIG92ZXJyaWRlbiBpbiBhIGxpYnJhcnkgYnVpbGQNCisgKiAocG5ndXNyLmgsIG9yIHNldCBpdCBpbiBDUFBGTEFHUykgYW5kIGl0IHdvcmtzIHRvIHNldCBpdCB0byBhIGNvbnNpZGVyYWJseQ0KKyAqIGxvd2VyIHZhbHVlIChlLmcuIDI1NSB3b3JrcykuICBBIGxvd2VyIHZhbHVlIG1heSBoZWxwIG1lbW9yeSB1c2FnZSAoc2xpZ2h0bHkpDQorICogYW5kIG1heSBldmVuIGltcHJvdmUgcGVyZm9ybWFuY2Ugb24gc29tZSBzeXN0ZW1zIChhbmQgZGVncmFkZSBpdCBvbiBvdGhlcnMuKQ0KKyAqLw0KKyNpZm5kZWYgWkxJQl9JT19NQVgNCisjICBkZWZpbmUgWkxJQl9JT19NQVggKCh1SW50KS0xKQ0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVEDQorLyogVGhlIHR5cGUgb2YgYSBjb21wcmVzc2lvbiBidWZmZXIgbGlzdCB1c2VkIGJ5IHRoZSB3cml0ZSBjb2RlLiAqLw0KK3R5cGVkZWYgc3RydWN0IHBuZ19jb21wcmVzc2lvbl9idWZmZXINCit7DQorICAgc3RydWN0IHBuZ19jb21wcmVzc2lvbl9idWZmZXIgKm5leHQ7DQorICAgcG5nX2J5dGUgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFsxXTsgLyogYWN0dWFsbHkgemJ1Zl9zaXplICovDQorfSBwbmdfY29tcHJlc3Npb25fYnVmZmVyLCAqcG5nX2NvbXByZXNzaW9uX2J1ZmZlcnA7DQorDQorI2RlZmluZSBQTkdfQ09NUFJFU1NJT05fQlVGRkVSX1NJWkUocHApXA0KKyAgIChvZmZzZXRvZihwbmdfY29tcHJlc3Npb25fYnVmZmVyLCBvdXRwdXQpICsgKHBwKS0+emJ1ZmZlcl9zaXplKQ0KKyNlbmRpZg0KKw0KKy8qIENvbG9yc3BhY2Ugc3VwcG9ydDsgc3RydWN0dXJlcyB1c2VkIGluIHBuZ19zdHJ1Y3QsIHBuZ19pbmZvIGFuZCBpbiBpbnRlcm5hbA0KKyAqIGZ1bmN0aW9ucyB0byBob2xkIGFuZCBjb21tdW5pY2F0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29sb3Igc3BhY2UuDQorICoNCisgKiBQTkdfQ09MT1JTUEFDRV9TVVBQT1JURUQgaXMgb25seSByZXF1aXJlZCBpZiB0aGUgYXBwbGljYXRpb24gd2lsbCBwZXJmb3JtDQorICogY29sb3JzcGFjZSBjb3JyZWN0aW9ucywgb3RoZXJ3aXNlIGFsbCB0aGUgY29sb3JzcGFjZSBpbmZvcm1hdGlvbiBjYW4gYmUNCisgKiBza2lwcGVkIGFuZCB0aGUgc2l6ZSBvZiBsaWJwbmcgY2FuIGJlIHJlZHVjZWQgKHNpZ25pZmljYW50bHkpIGJ5IGNvbXBpbGluZw0KKyAqIG91dCB0aGUgY29sb3JzcGFjZSBzdXBwb3J0Lg0KKyAqLw0KKyNpZmRlZiBQTkdfQ09MT1JTUEFDRV9TVVBQT1JURUQNCisvKiBUaGUgY2hyb21hdGljaXRpZXMgb2YgdGhlIHJlZCwgZ3JlZW4gYW5kIGJsdWUgY29sb3JhbnRzIGFuZCB0aGUgY2hyb21hdGljaXR5DQorICogb2YgdGhlIGNvcnJlc3BvbmRpbmcgd2hpdGUgcG9pbnQgKGkuZS4gb2YgcmdiKDEuMCwxLjAsMS4wKSkuDQorICovDQordHlwZWRlZiBzdHJ1Y3QgcG5nX3h5DQorew0KKyAgIHBuZ19maXhlZF9wb2ludCByZWR4LCByZWR5Ow0KKyAgIHBuZ19maXhlZF9wb2ludCBncmVlbngsIGdyZWVueTsNCisgICBwbmdfZml4ZWRfcG9pbnQgYmx1ZXgsIGJsdWV5Ow0KKyAgIHBuZ19maXhlZF9wb2ludCB3aGl0ZXgsIHdoaXRleTsNCit9IHBuZ194eTsNCisNCisvKiBUaGUgc2FtZSBkYXRhIGFzIGFib3ZlIGJ1dCBlbmNvZGVkIGFzIENJRSBYWVogdmFsdWVzLiAgV2hlbiB0aGlzIGRhdGEgY29tZXMNCisgKiBmcm9tIGNocm9tYXRpY2l0aWVzIHRoZSBzdW0gb2YgdGhlIFkgdmFsdWVzIGlzIGFzc3VtZWQgdG8gYmUgMS4wDQorICovDQordHlwZWRlZiBzdHJ1Y3QgcG5nX1hZWg0KK3sNCisgICBwbmdfZml4ZWRfcG9pbnQgcmVkX1gsIHJlZF9ZLCByZWRfWjsNCisgICBwbmdfZml4ZWRfcG9pbnQgZ3JlZW5fWCwgZ3JlZW5fWSwgZ3JlZW5fWjsNCisgICBwbmdfZml4ZWRfcG9pbnQgYmx1ZV9YLCBibHVlX1ksIGJsdWVfWjsNCit9IHBuZ19YWVo7DQorI2VuZGlmIC8qIENPTE9SU1BBQ0UgKi8NCisNCisjaWYgZGVmaW5lZChQTkdfQ09MT1JTUEFDRV9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX0dBTU1BX1NVUFBPUlRFRCkNCisvKiBBIGNvbG9yc3BhY2UgaXMgYWxsIHRoZSBhYm92ZSBwbHVzLCBwb3RlbnRpYWxseSwgcHJvZmlsZSBpbmZvcm1hdGlvbiwNCisgKiBob3dldmVyIGF0IHByZXNlbnQgbGlicG5nIGRvZXMgbm90IHVzZSB0aGUgcHJvZmlsZSBpbnRlcm5hbGx5IHNvIGl0IGlzIG9ubHkNCisgKiBzdG9yZWQgaW4gdGhlIHBuZ19pbmZvIHN0cnVjdCAoaWYgaUNDUCBpcyBzdXBwb3J0ZWQuKSAgVGhlIHJlbmRlcmluZyBpbnRlbnQNCisgKiBpcyByZXRhaW5lZCBoZXJlIGFuZCBpcyBjaGVja2VkLg0KKyAqDQorICogVGhlIGZpbGUgZ2FtbWEgZW5jb2RpbmcgaW5mb3JtYXRpb24gaXMgYWxzbyBzdG9yZWQgaGVyZSBhbmQgZ2FtbWEgY29ycmVjdGlvbg0KKyAqIGlzIGRvbmUgYnkgbGlicG5nLCB3aGVyZWFzIGNvbG9yIGNvcnJlY3Rpb24gbXVzdCBjdXJyZW50bHkgYmUgZG9uZSBieSB0aGUNCisgKiBhcHBsaWNhdGlvbi4NCisgKi8NCit0eXBlZGVmIHN0cnVjdCBwbmdfY29sb3JzcGFjZQ0KK3sNCisjaWZkZWYgUE5HX0dBTU1BX1NVUFBPUlRFRA0KKyAgIHBuZ19maXhlZF9wb2ludCBnYW1tYTsgICAgICAgIC8qIEZpbGUgZ2FtbWEgKi8NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX0NPTE9SU1BBQ0VfU1VQUE9SVEVEDQorICAgcG5nX3h5ICAgICAgZW5kX3BvaW50c194eTsgICAgLyogRW5kIHBvaW50cyBhcyBjaHJvbWF0aWNpdGllcyAqLw0KKyAgIHBuZ19YWVogICAgIGVuZF9wb2ludHNfWFlaOyAgIC8qIEVuZCBwb2ludHMgYXMgQ0lFIFhZWiBjb2xvcmFudCB2YWx1ZXMgKi8NCisgICBwbmdfdWludF8xNiByZW5kZXJpbmdfaW50ZW50OyAvKiBSZW5kZXJpbmcgaW50ZW50IG9mIGEgcHJvZmlsZSAqLw0KKyNlbmRpZg0KKw0KKyAgIC8qIEZsYWdzIGFyZSBhbHdheXMgZGVmaW5lZCB0byBzaW1wbGlmeSB0aGUgY29kZS4gKi8NCisgICBwbmdfdWludF8xNiBmbGFnczsgICAgICAgICAgICAvKiBBcyBkZWZpbmVkIGJlbG93ICovDQorfSBwbmdfY29sb3JzcGFjZSwgKiBQTkdfUkVTVFJJQ1QgcG5nX2NvbG9yc3BhY2VycDsNCisNCit0eXBlZGVmIGNvbnN0IHBuZ19jb2xvcnNwYWNlICogUE5HX1JFU1RSSUNUIHBuZ19jb25zdF9jb2xvcnNwYWNlcnA7DQorDQorLyogR2VuZXJhbCBmbGFncyBmb3IgdGhlICdmbGFncycgZmllbGQgKi8NCisjZGVmaW5lIFBOR19DT0xPUlNQQUNFX0hBVkVfR0FNTUEgICAgICAgICAgIDB4MDAwMQ0KKyNkZWZpbmUgUE5HX0NPTE9SU1BBQ0VfSEFWRV9FTkRQT0lOVFMgICAgICAgMHgwMDAyDQorI2RlZmluZSBQTkdfQ09MT1JTUEFDRV9IQVZFX0lOVEVOVCAgICAgICAgICAweDAwMDQNCisjZGVmaW5lIFBOR19DT0xPUlNQQUNFX0ZST01fZ0FNQSAgICAgICAgICAgIDB4MDAwOA0KKyNkZWZpbmUgUE5HX0NPTE9SU1BBQ0VfRlJPTV9jSFJNICAgICAgICAgICAgMHgwMDEwDQorI2RlZmluZSBQTkdfQ09MT1JTUEFDRV9GUk9NX3NSR0IgICAgICAgICAgICAweDAwMjANCisjZGVmaW5lIFBOR19DT0xPUlNQQUNFX0VORFBPSU5UU19NQVRDSF9zUkdCIDB4MDA0MA0KKyNkZWZpbmUgUE5HX0NPTE9SU1BBQ0VfTUFUQ0hFU19zUkdCICAgICAgICAgMHgwMDgwIC8qIGV4YWN0IG1hdGNoIG9uIHByb2ZpbGUgKi8NCisjZGVmaW5lIFBOR19DT0xPUlNQQUNFX0lOVkFMSUQgICAgICAgICAgICAgIDB4ODAwMA0KKyNkZWZpbmUgUE5HX0NPTE9SU1BBQ0VfQ0FOQ0VMKGZsYWdzKSAgICAgICAgKDB4ZmZmZiBeIChmbGFncykpDQorI2VuZGlmIC8qIENPTE9SU1BBQ0UgfHwgR0FNTUEgKi8NCisNCitzdHJ1Y3QgcG5nX3N0cnVjdF9kZWYNCit7DQorI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVEDQorICAgam1wX2J1ZiBqbXBfYnVmX2xvY2FsOyAgICAgLyogTmV3IG5hbWUgaW4gMS42LjAgZm9yIGptcF9idWYgaW4gcG5nX3N0cnVjdCAqLw0KKyAgIHBuZ19sb25nam1wX3B0ciBsb25nam1wX2ZuOy8qIHNldGptcCBub24tbG9jYWwgZ290byBmdW5jdGlvbi4gKi8NCisgICBqbXBfYnVmICpqbXBfYnVmX3B0cjsgICAgICAvKiBwYXNzZWQgdG8gbG9uZ2ptcF9mbiAqLw0KKyAgIHNpemVfdCBqbXBfYnVmX3NpemU7ICAgICAgIC8qIHNpemUgb2YgdGhlIGFib3ZlLCBpZiBhbGxvY2F0ZWQgKi8NCisjZW5kaWYNCisgICBwbmdfZXJyb3JfcHRyIGVycm9yX2ZuOyAgICAvKiBmdW5jdGlvbiBmb3IgcHJpbnRpbmcgZXJyb3JzIGFuZCBhYm9ydGluZyAqLw0KKyNpZmRlZiBQTkdfV0FSTklOR1NfU1VQUE9SVEVEDQorICAgcG5nX2Vycm9yX3B0ciB3YXJuaW5nX2ZuOyAgLyogZnVuY3Rpb24gZm9yIHByaW50aW5nIHdhcm5pbmdzICovDQorI2VuZGlmDQorICAgcG5nX3ZvaWRwIGVycm9yX3B0cjsgICAgICAgLyogdXNlciBzdXBwbGllZCBzdHJ1Y3QgZm9yIGVycm9yIGZ1bmN0aW9ucyAqLw0KKyAgIHBuZ19yd19wdHIgd3JpdGVfZGF0YV9mbjsgIC8qIGZ1bmN0aW9uIGZvciB3cml0aW5nIG91dHB1dCBkYXRhICovDQorICAgcG5nX3J3X3B0ciByZWFkX2RhdGFfZm47ICAgLyogZnVuY3Rpb24gZm9yIHJlYWRpbmcgaW5wdXQgZGF0YSAqLw0KKyAgIHBuZ192b2lkcCBpb19wdHI7ICAgICAgICAgIC8qIHB0ciB0byBhcHBsaWNhdGlvbiBzdHJ1Y3QgZm9yIEkvTyBmdW5jdGlvbnMgKi8NCisNCisjaWZkZWYgUE5HX1JFQURfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEDQorICAgcG5nX3VzZXJfdHJhbnNmb3JtX3B0ciByZWFkX3VzZXJfdHJhbnNmb3JtX2ZuOyAvKiB1c2VyIHJlYWQgdHJhbnNmb3JtICovDQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19XUklURV9VU0VSX1RSQU5TRk9STV9TVVBQT1JURUQNCisgICBwbmdfdXNlcl90cmFuc2Zvcm1fcHRyIHdyaXRlX3VzZXJfdHJhbnNmb3JtX2ZuOyAvKiB1c2VyIHdyaXRlIHRyYW5zZm9ybSAqLw0KKyNlbmRpZg0KKw0KKy8qIFRoZXNlIHdlcmUgYWRkZWQgaW4gbGlicG5nLTEuMC4yICovDQorI2lmZGVmIFBOR19VU0VSX1RSQU5TRk9STV9QVFJfU1VQUE9SVEVEDQorI2lmIGRlZmluZWQoUE5HX1JFQURfVVNFUl9UUkFOU0ZPUk1fU1VQUE9SVEVEKSB8fCBcDQorICAgIGRlZmluZWQoUE5HX1dSSVRFX1VTRVJfVFJBTlNGT1JNX1NVUFBPUlRFRCkNCisgICBwbmdfdm9pZHAgdXNlcl90cmFuc2Zvcm1fcHRyOyAvKiB1c2VyIHN1cHBsaWVkIHN0cnVjdCBmb3IgdXNlciB0cmFuc2Zvcm0gKi8NCisgICBwbmdfYnl0ZSB1c2VyX3RyYW5zZm9ybV9kZXB0aDsgICAgLyogYml0IGRlcHRoIG9mIHVzZXIgdHJhbnNmb3JtZWQgcGl4ZWxzICovDQorICAgcG5nX2J5dGUgdXNlcl90cmFuc2Zvcm1fY2hhbm5lbHM7IC8qIGNoYW5uZWxzIGluIHVzZXIgdHJhbnNmb3JtZWQgcGl4ZWxzICovDQorI2VuZGlmDQorI2VuZGlmDQorDQorICAgcG5nX3VpbnRfMzIgbW9kZTsgICAgICAgICAgLyogdGVsbHMgdXMgd2hlcmUgd2UgYXJlIGluIHRoZSBQTkcgZmlsZSAqLw0KKyAgIHBuZ191aW50XzMyIGZsYWdzOyAgICAgICAgIC8qIGZsYWdzIGluZGljYXRpbmcgdmFyaW91cyB0aGluZ3MgdG8gbGlicG5nICovDQorICAgcG5nX3VpbnRfMzIgdHJhbnNmb3JtYXRpb25zOyAvKiB3aGljaCB0cmFuc2Zvcm1hdGlvbnMgdG8gcGVyZm9ybSAqLw0KKw0KKyAgIHBuZ191aW50XzMyIHpvd25lcjsgICAgICAgIC8qIElEIChjaHVuayB0eXBlKSBvZiB6c3RyZWFtIG93bmVyLCAwIGlmIG5vbmUgKi8NCisgICB6X3N0cmVhbSAgICB6c3RyZWFtOyAgICAgICAvKiBkZWNvbXByZXNzaW9uIHN0cnVjdHVyZSAqLw0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVEDQorICAgcG5nX2NvbXByZXNzaW9uX2J1ZmZlcnAgemJ1ZmZlcl9saXN0OyAvKiBDcmVhdGVkIG9uIGRlbWFuZCBkdXJpbmcgd3JpdGUgKi8NCisgICB1SW50ICAgICAgICAgICAgICAgICAgICB6YnVmZmVyX3NpemU7IC8qIHNpemUgb2YgdGhlIGFjdHVhbCBidWZmZXIgKi8NCisNCisgICBpbnQgemxpYl9sZXZlbDsgICAgICAgICAgICAvKiBob2xkcyB6bGliIGNvbXByZXNzaW9uIGxldmVsICovDQorICAgaW50IHpsaWJfbWV0aG9kOyAgICAgICAgICAgLyogaG9sZHMgemxpYiBjb21wcmVzc2lvbiBtZXRob2QgKi8NCisgICBpbnQgemxpYl93aW5kb3dfYml0czsgICAgICAvKiBob2xkcyB6bGliIGNvbXByZXNzaW9uIHdpbmRvdyBiaXRzICovDQorICAgaW50IHpsaWJfbWVtX2xldmVsOyAgICAgICAgLyogaG9sZHMgemxpYiBjb21wcmVzc2lvbiBtZW1vcnkgbGV2ZWwgKi8NCisgICBpbnQgemxpYl9zdHJhdGVneTsgICAgICAgICAvKiBob2xkcyB6bGliIGNvbXByZXNzaW9uIHN0cmF0ZWd5ICovDQorI2VuZGlmDQorLyogQWRkZWQgYXQgbGlicG5nIDEuNS40ICovDQorI2lmZGVmIFBOR19XUklURV9DVVNUT01JWkVfWlRYVF9DT01QUkVTU0lPTl9TVVBQT1JURUQNCisgICBpbnQgemxpYl90ZXh0X2xldmVsOyAgICAgICAgICAgIC8qIGhvbGRzIHpsaWIgY29tcHJlc3Npb24gbGV2ZWwgKi8NCisgICBpbnQgemxpYl90ZXh0X21ldGhvZDsgICAgICAgICAgIC8qIGhvbGRzIHpsaWIgY29tcHJlc3Npb24gbWV0aG9kICovDQorICAgaW50IHpsaWJfdGV4dF93aW5kb3dfYml0czsgICAgICAvKiBob2xkcyB6bGliIGNvbXByZXNzaW9uIHdpbmRvdyBiaXRzICovDQorICAgaW50IHpsaWJfdGV4dF9tZW1fbGV2ZWw7ICAgICAgICAvKiBob2xkcyB6bGliIGNvbXByZXNzaW9uIG1lbW9yeSBsZXZlbCAqLw0KKyAgIGludCB6bGliX3RleHRfc3RyYXRlZ3k7ICAgICAgICAgLyogaG9sZHMgemxpYiBjb21wcmVzc2lvbiBzdHJhdGVneSAqLw0KKyNlbmRpZg0KKy8qIEVuZCBvZiBtYXRlcmlhbCBhZGRlZCBhdCBsaWJwbmcgMS41LjQgKi8NCisvKiBBZGRlZCBhdCBsaWJwbmcgMS42LjAgKi8NCisjaWZkZWYgUE5HX1dSSVRFX1NVUFBPUlRFRA0KKyAgIGludCB6bGliX3NldF9sZXZlbDsgICAgICAgIC8qIEFjdHVhbCB2YWx1ZXMgc2V0IGludG8gdGhlIHpzdHJlYW0gb24gd3JpdGUgKi8NCisgICBpbnQgemxpYl9zZXRfbWV0aG9kOw0KKyAgIGludCB6bGliX3NldF93aW5kb3dfYml0czsNCisgICBpbnQgemxpYl9zZXRfbWVtX2xldmVsOw0KKyAgIGludCB6bGliX3NldF9zdHJhdGVneTsNCisjZW5kaWYNCisNCisgICBwbmdfdWludF8zMiB3aWR0aDsgICAgICAgICAvKiB3aWR0aCBvZiBpbWFnZSBpbiBwaXhlbHMgKi8NCisgICBwbmdfdWludF8zMiBoZWlnaHQ7ICAgICAgICAvKiBoZWlnaHQgb2YgaW1hZ2UgaW4gcGl4ZWxzICovDQorICAgcG5nX3VpbnRfMzIgbnVtX3Jvd3M7ICAgICAgLyogbnVtYmVyIG9mIHJvd3MgaW4gY3VycmVudCBwYXNzICovDQorICAgcG5nX3VpbnRfMzIgdXNyX3dpZHRoOyAgICAgLyogd2lkdGggb2Ygcm93IGF0IHN0YXJ0IG9mIHdyaXRlICovDQorICAgcG5nX3NpemVfdCByb3dieXRlczsgICAgICAgLyogc2l6ZSBvZiByb3cgaW4gYnl0ZXMgKi8NCisgICBwbmdfdWludF8zMiBpd2lkdGg7ICAgICAgICAvKiB3aWR0aCBvZiBjdXJyZW50IGludGVybGFjZWQgcm93IGluIHBpeGVscyAqLw0KKyAgIHBuZ191aW50XzMyIHJvd19udW1iZXI7ICAgIC8qIGN1cnJlbnQgcm93IGluIGludGVybGFjZSBwYXNzICovDQorICAgcG5nX3VpbnRfMzIgY2h1bmtfbmFtZTsgICAgLyogUE5HX0NIVU5LKCkgaWQgb2YgY3VycmVudCBjaHVuayAqLw0KKyAgIHBuZ19ieXRlcCBwcmV2X3JvdzsgICAgICAgIC8qIGJ1ZmZlciB0byBzYXZlIHByZXZpb3VzICh1bmZpbHRlcmVkKSByb3cuDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVGhpcyBpcyBhIHBvaW50ZXIgaW50byBiaWdfcHJldl9yb3cNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisgICBwbmdfYnl0ZXAgcm93X2J1ZjsgICAgICAgICAvKiBidWZmZXIgdG8gc2F2ZSBjdXJyZW50ICh1bmZpbHRlcmVkKSByb3cuDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVGhpcyBpcyBhIHBvaW50ZXIgaW50byBiaWdfcm93X2J1Zg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVEDQorICAgcG5nX2J5dGVwIHN1Yl9yb3c7ICAgICAgICAgLyogYnVmZmVyIHRvIHNhdmUgInN1YiIgcm93IHdoZW4gZmlsdGVyaW5nICovDQorICAgcG5nX2J5dGVwIHVwX3JvdzsgICAgICAgICAgLyogYnVmZmVyIHRvIHNhdmUgInVwIiByb3cgd2hlbiBmaWx0ZXJpbmcgKi8NCisgICBwbmdfYnl0ZXAgYXZnX3JvdzsgICAgICAgICAvKiBidWZmZXIgdG8gc2F2ZSAiYXZnIiByb3cgd2hlbiBmaWx0ZXJpbmcgKi8NCisgICBwbmdfYnl0ZXAgcGFldGhfcm93OyAgICAgICAvKiBidWZmZXIgdG8gc2F2ZSAiUGFldGgiIHJvdyB3aGVuIGZpbHRlcmluZyAqLw0KKyNlbmRpZg0KKyAgIHBuZ19zaXplX3QgaW5mb19yb3dieXRlczsgIC8qIEFkZGVkIGluIDEuNS40OiBjYWNoZSBvZiB1cGRhdGVkIHJvdyBieXRlcyAqLw0KKw0KKyAgIHBuZ191aW50XzMyIGlkYXRfc2l6ZTsgICAgIC8qIGN1cnJlbnQgSURBVCBzaXplIGZvciByZWFkICovDQorICAgcG5nX3VpbnRfMzIgY3JjOyAgICAgICAgICAgLyogY3VycmVudCBjaHVuayBDUkMgdmFsdWUgKi8NCisgICBwbmdfY29sb3JwIHBhbGV0dGU7ICAgICAgICAvKiBwYWxldHRlIGZyb20gdGhlIGlucHV0IGZpbGUgKi8NCisgICBwbmdfdWludF8xNiBudW1fcGFsZXR0ZTsgICAvKiBudW1iZXIgb2YgY29sb3IgZW50cmllcyBpbiBwYWxldHRlICovDQorDQorLyogQWRkZWQgYXQgbGlicG5nLTEuNS4xMCAqLw0KKyNpZmRlZiBQTkdfQ0hFQ0tfRk9SX0lOVkFMSURfSU5ERVhfU1VQUE9SVEVEDQorICAgaW50IG51bV9wYWxldHRlX21heDsgICAgICAgLyogbWF4aW11bSBwYWxldHRlIGluZGV4IGZvdW5kIGluIElEQVQgKi8NCisjZW5kaWYNCisNCisgICBwbmdfdWludF8xNiBudW1fdHJhbnM7ICAgICAvKiBudW1iZXIgb2YgdHJhbnNwYXJlbmN5IHZhbHVlcyAqLw0KKyAgIHBuZ19ieXRlIGNvbXByZXNzaW9uOyAgICAgIC8qIGZpbGUgY29tcHJlc3Npb24gdHlwZSAoYWx3YXlzIDApICovDQorICAgcG5nX2J5dGUgZmlsdGVyOyAgICAgICAgICAgLyogZmlsZSBmaWx0ZXIgdHlwZSAoYWx3YXlzIDApICovDQorICAgcG5nX2J5dGUgaW50ZXJsYWNlZDsgICAgICAgLyogUE5HX0lOVEVSTEFDRV9OT05FLCBQTkdfSU5URVJMQUNFX0FEQU03ICovDQorICAgcG5nX2J5dGUgcGFzczsgICAgICAgICAgICAgLyogY3VycmVudCBpbnRlcmxhY2UgcGFzcyAoMCAtIDYpICovDQorICAgcG5nX2J5dGUgZG9fZmlsdGVyOyAgICAgICAgLyogcm93IGZpbHRlciBmbGFncyAoc2VlIFBOR19GSUxURVJfIGJlbG93ICkgKi8NCisgICBwbmdfYnl0ZSBjb2xvcl90eXBlOyAgICAgICAvKiBjb2xvciB0eXBlIG9mIGZpbGUgKi8NCisgICBwbmdfYnl0ZSBiaXRfZGVwdGg7ICAgICAgICAvKiBiaXQgZGVwdGggb2YgZmlsZSAqLw0KKyAgIHBuZ19ieXRlIHVzcl9iaXRfZGVwdGg7ICAgIC8qIGJpdCBkZXB0aCBvZiB1c2VycyByb3c6IHdyaXRlIG9ubHkgKi8NCisgICBwbmdfYnl0ZSBwaXhlbF9kZXB0aDsgICAgICAvKiBudW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwgKi8NCisgICBwbmdfYnl0ZSBjaGFubmVsczsgICAgICAgICAvKiBudW1iZXIgb2YgY2hhbm5lbHMgaW4gZmlsZSAqLw0KKyNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVEDQorICAgcG5nX2J5dGUgdXNyX2NoYW5uZWxzOyAgICAgLyogY2hhbm5lbHMgYXQgc3RhcnQgb2Ygd3JpdGU6IHdyaXRlIG9ubHkgKi8NCisjZW5kaWYNCisgICBwbmdfYnl0ZSBzaWdfYnl0ZXM7ICAgICAgICAvKiBtYWdpYyBieXRlcyByZWFkL3dyaXR0ZW4gZnJvbSBzdGFydCBvZiBmaWxlICovDQorICAgcG5nX2J5dGUgbWF4aW11bV9waXhlbF9kZXB0aDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwaXhlbCBkZXB0aCB1c2VkIGZvciB0aGUgcm93IGJ1ZmZlcnMgKi8NCisgICBwbmdfYnl0ZSB0cmFuc2Zvcm1lZF9waXhlbF9kZXB0aDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwaXhlbCBkZXB0aCBhZnRlciByZWFkL3dyaXRlIHRyYW5zZm9ybXMgKi8NCisjaWYgZGVmaW5lZChQTkdfUkVBRF9GSUxMRVJfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19XUklURV9GSUxMRVJfU1VQUE9SVEVEKQ0KKyAgIHBuZ191aW50XzE2IGZpbGxlcjsgICAgICAgICAgIC8qIGZpbGxlciBieXRlcyBmb3IgcGl4ZWwgZXhwYW5zaW9uICovDQorI2VuZGlmDQorDQorI2lmIGRlZmluZWQoUE5HX2JLR0RfU1VQUE9SVEVEKSB8fCBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKSB8fFwNCisgICBkZWZpbmVkKFBOR19SRUFEX0FMUEhBX01PREVfU1VQUE9SVEVEKQ0KKyAgIHBuZ19ieXRlIGJhY2tncm91bmRfZ2FtbWFfdHlwZTsNCisgICBwbmdfZml4ZWRfcG9pbnQgYmFja2dyb3VuZF9nYW1tYTsNCisgICBwbmdfY29sb3JfMTYgYmFja2dyb3VuZDsgICAvKiBiYWNrZ3JvdW5kIGNvbG9yIGluIHNjcmVlbiBnYW1tYSBzcGFjZSAqLw0KKyNpZmRlZiBQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQNCisgICBwbmdfY29sb3JfMTYgYmFja2dyb3VuZF8xOyAvKiBiYWNrZ3JvdW5kIG5vcm1hbGl6ZWQgdG8gZ2FtbWEgMS4wICovDQorI2VuZGlmDQorI2VuZGlmIC8qIFBOR19iS0dEX1NVUFBPUlRFRCAqLw0KKw0KKyNpZmRlZiBQTkdfV1JJVEVfRkxVU0hfU1VQUE9SVEVEDQorICAgcG5nX2ZsdXNoX3B0ciBvdXRwdXRfZmx1c2hfZm47IC8qIEZ1bmN0aW9uIGZvciBmbHVzaGluZyBvdXRwdXQgKi8NCisgICBwbmdfdWludF8zMiBmbHVzaF9kaXN0OyAgICAvKiBob3cgbWFueSByb3dzIGFwYXJ0IHRvIGZsdXNoLCAwIC0gbm8gZmx1c2ggKi8NCisgICBwbmdfdWludF8zMiBmbHVzaF9yb3dzOyAgICAvKiBudW1iZXIgb2Ygcm93cyB3cml0dGVuIHNpbmNlIGxhc3QgZmx1c2ggKi8NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1JFQURfR0FNTUFfU1VQUE9SVEVEDQorICAgaW50IGdhbW1hX3NoaWZ0OyAgICAgIC8qIG51bWJlciBvZiAiaW5zaWduaWZpY2FudCIgYml0cyBpbiAxNi1iaXQgZ2FtbWEgKi8NCisgICBwbmdfZml4ZWRfcG9pbnQgc2NyZWVuX2dhbW1hOyAvKiBzY3JlZW4gZ2FtbWEgdmFsdWUgKGRpc3BsYXlfZXhwb25lbnQpICovDQorDQorICAgcG5nX2J5dGVwIGdhbW1hX3RhYmxlOyAgICAgLyogZ2FtbWEgdGFibGUgZm9yIDgtYml0IGRlcHRoIGZpbGVzICovDQorICAgcG5nX3VpbnRfMTZwcCBnYW1tYV8xNl90YWJsZTsgLyogZ2FtbWEgdGFibGUgZm9yIDE2LWJpdCBkZXB0aCBmaWxlcyAqLw0KKyNpZiBkZWZpbmVkKFBOR19SRUFEX0JBQ0tHUk9VTkRfU1VQUE9SVEVEKSB8fCBcDQorICAgZGVmaW5lZChQTkdfUkVBRF9BTFBIQV9NT0RFX1NVUFBPUlRFRCkgfHwgXA0KKyAgIGRlZmluZWQoUE5HX1JFQURfUkdCX1RPX0dSQVlfU1VQUE9SVEVEKQ0KKyAgIHBuZ19ieXRlcCBnYW1tYV9mcm9tXzE7ICAgIC8qIGNvbnZlcnRzIGZyb20gMS4wIHRvIHNjcmVlbiAqLw0KKyAgIHBuZ19ieXRlcCBnYW1tYV90b18xOyAgICAgIC8qIGNvbnZlcnRzIGZyb20gZmlsZSB0byAxLjAgKi8NCisgICBwbmdfdWludF8xNnBwIGdhbW1hXzE2X2Zyb21fMTsgLyogY29udmVydHMgZnJvbSAxLjAgdG8gc2NyZWVuICovDQorICAgcG5nX3VpbnRfMTZwcCBnYW1tYV8xNl90b18xOyAvKiBjb252ZXJ0cyBmcm9tIGZpbGUgdG8gMS4wICovDQorI2VuZGlmIC8qIFJFQURfQkFDS0dST1VORCB8fCBSRUFEX0FMUEhBX01PREUgfHwgUkdCX1RPX0dSQVkgKi8NCisjZW5kaWYNCisNCisjaWYgZGVmaW5lZChQTkdfUkVBRF9HQU1NQV9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX3NCSVRfU1VQUE9SVEVEKQ0KKyAgIHBuZ19jb2xvcl84IHNpZ19iaXQ7ICAgICAgIC8qIHNpZ25pZmljYW50IGJpdHMgaW4gZWFjaCBhdmFpbGFibGUgY2hhbm5lbCAqLw0KKyNlbmRpZg0KKw0KKyNpZiBkZWZpbmVkKFBOR19SRUFEX1NISUZUX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfV1JJVEVfU0hJRlRfU1VQUE9SVEVEKQ0KKyAgIHBuZ19jb2xvcl84IHNoaWZ0OyAgICAgICAgIC8qIHNoaWZ0IGZvciBzaWduaWZpY2FudCBiaXQgdHJhbmZvcm1hdGlvbiAqLw0KKyNlbmRpZg0KKw0KKyNpZiBkZWZpbmVkKFBOR190Uk5TX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfUkVBRF9CQUNLR1JPVU5EX1NVUFBPUlRFRCkgXA0KKyB8fCBkZWZpbmVkKFBOR19SRUFEX0VYUEFORF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1JFQURfQkFDS0dST1VORF9TVVBQT1JURUQpDQorICAgcG5nX2J5dGVwIHRyYW5zX2FscGhhOyAgICAgICAgICAgLyogYWxwaGEgdmFsdWVzIGZvciBwYWxldHRlZCBmaWxlcyAqLw0KKyAgIHBuZ19jb2xvcl8xNiB0cmFuc19jb2xvcjsgIC8qIHRyYW5zcGFyZW50IGNvbG9yIGZvciBub24tcGFsZXR0ZWQgZmlsZXMgKi8NCisjZW5kaWYNCisNCisgICBwbmdfcmVhZF9zdGF0dXNfcHRyIHJlYWRfcm93X2ZuOyAgIC8qIGNhbGxlZCBhZnRlciBlYWNoIHJvdyBpcyBkZWNvZGVkICovDQorICAgcG5nX3dyaXRlX3N0YXR1c19wdHIgd3JpdGVfcm93X2ZuOyAvKiBjYWxsZWQgYWZ0ZXIgZWFjaCByb3cgaXMgZW5jb2RlZCAqLw0KKyNpZmRlZiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQNCisgICBwbmdfcHJvZ3Jlc3NpdmVfaW5mb19wdHIgaW5mb19mbjsgLyogY2FsbGVkIGFmdGVyIGhlYWRlciBkYXRhIGZ1bGx5IHJlYWQgKi8NCisgICBwbmdfcHJvZ3Jlc3NpdmVfcm93X3B0ciByb3dfZm47ICAgLyogY2FsbGVkIGFmdGVyIGEgcHJvZy4gcm93IGlzIGRlY29kZWQgKi8NCisgICBwbmdfcHJvZ3Jlc3NpdmVfZW5kX3B0ciBlbmRfZm47ICAgLyogY2FsbGVkIGFmdGVyIGltYWdlIGlzIGNvbXBsZXRlICovDQorICAgcG5nX2J5dGVwIHNhdmVfYnVmZmVyX3B0cjsgICAgICAgIC8qIGN1cnJlbnQgbG9jYXRpb24gaW4gc2F2ZV9idWZmZXIgKi8NCisgICBwbmdfYnl0ZXAgc2F2ZV9idWZmZXI7ICAgICAgICAgICAgLyogYnVmZmVyIGZvciBwcmV2aW91c2x5IHJlYWQgZGF0YSAqLw0KKyAgIHBuZ19ieXRlcCBjdXJyZW50X2J1ZmZlcl9wdHI7ICAgICAvKiBjdXJyZW50IGxvY2F0aW9uIGluIGN1cnJlbnRfYnVmZmVyICovDQorICAgcG5nX2J5dGVwIGN1cnJlbnRfYnVmZmVyOyAgICAgICAgIC8qIGJ1ZmZlciBmb3IgcmVjZW50bHkgdXNlZCBkYXRhICovDQorICAgcG5nX3VpbnRfMzIgcHVzaF9sZW5ndGg7ICAgICAgICAgIC8qIHNpemUgb2YgY3VycmVudCBpbnB1dCBjaHVuayAqLw0KKyAgIHBuZ191aW50XzMyIHNraXBfbGVuZ3RoOyAgICAgICAgICAvKiBieXRlcyB0byBza2lwIGluIGlucHV0IGRhdGEgKi8NCisgICBwbmdfc2l6ZV90IHNhdmVfYnVmZmVyX3NpemU7ICAgICAgLyogYW1vdW50IG9mIGRhdGEgbm93IGluIHNhdmVfYnVmZmVyICovDQorICAgcG5nX3NpemVfdCBzYXZlX2J1ZmZlcl9tYXg7ICAgICAgIC8qIHRvdGFsIHNpemUgb2Ygc2F2ZV9idWZmZXIgKi8NCisgICBwbmdfc2l6ZV90IGJ1ZmZlcl9zaXplOyAgICAgICAgICAgLyogdG90YWwgYW1vdW50IG9mIGF2YWlsYWJsZSBpbnB1dCBkYXRhICovDQorICAgcG5nX3NpemVfdCBjdXJyZW50X2J1ZmZlcl9zaXplOyAgIC8qIGFtb3VudCBvZiBkYXRhIG5vdyBpbiBjdXJyZW50X2J1ZmZlciAqLw0KKyAgIGludCBwcm9jZXNzX21vZGU7ICAgICAgICAgICAgICAgICAvKiB3aGF0IHB1c2ggbGlicmFyeSBpcyBjdXJyZW50bHkgZG9pbmcgKi8NCisgICBpbnQgY3VyX3BhbGV0dGU7ICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBwdXNoIGxpYnJhcnkgcGFsZXR0ZSBpbmRleCAqLw0KKw0KKyNlbmRpZiAvKiBQTkdfUFJPR1JFU1NJVkVfUkVBRF9TVVBQT1JURUQgKi8NCisNCisjaWYgZGVmaW5lZChfX1RVUkJPQ19fKSAmJiAhZGVmaW5lZChfV2luZG93cykgJiYgIWRlZmluZWQoX19GTEFUX18pDQorLyogRm9yIHRoZSBCb3JsYW5kIHNwZWNpYWwgNjRLIHNlZ21lbnQgaGFuZGxlciAqLw0KKyAgIHBuZ19ieXRlcHAgb2Zmc2V0X3RhYmxlX3B0cjsNCisgICBwbmdfYnl0ZXAgb2Zmc2V0X3RhYmxlOw0KKyAgIHBuZ191aW50XzE2IG9mZnNldF90YWJsZV9udW1iZXI7DQorICAgcG5nX3VpbnRfMTYgb2Zmc2V0X3RhYmxlX2NvdW50Ow0KKyAgIHBuZ191aW50XzE2IG9mZnNldF90YWJsZV9jb3VudF9mcmVlOw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfUkVBRF9RVUFOVElaRV9TVVBQT1JURUQNCisgICBwbmdfYnl0ZXAgcGFsZXR0ZV9sb29rdXA7IC8qIGxvb2t1cCB0YWJsZSBmb3IgcXVhbnRpemluZyAqLw0KKyAgIHBuZ19ieXRlcCBxdWFudGl6ZV9pbmRleDsgLyogaW5kZXggdHJhbnNsYXRpb24gZm9yIHBhbGV0dGUgZmlsZXMgKi8NCisjZW5kaWYNCisNCisjaWZkZWYgUE5HX1dSSVRFX1dFSUdIVEVEX0ZJTFRFUl9TVVBQT1JURUQNCisgICBwbmdfYnl0ZSBoZXVyaXN0aWNfbWV0aG9kOyAgICAgICAgLyogaGV1cmlzdGljIGZvciByb3cgZmlsdGVyIHNlbGVjdGlvbiAqLw0KKyAgIHBuZ19ieXRlIG51bV9wcmV2X2ZpbHRlcnM7ICAgICAgICAvKiBudW1iZXIgb2Ygd2VpZ2h0cyBmb3IgcHJldmlvdXMgcm93cyAqLw0KKyAgIHBuZ19ieXRlcCBwcmV2X2ZpbHRlcnM7ICAgICAgICAgICAvKiBmaWx0ZXIgdHlwZShzKSBvZiBwcmV2aW91cyByb3cocykgKi8NCisgICBwbmdfdWludF8xNnAgZmlsdGVyX3dlaWdodHM7ICAgICAgLyogd2VpZ2h0KHMpIGZvciBwcmV2aW91cyBsaW5lKHMpICovDQorICAgcG5nX3VpbnRfMTZwIGludl9maWx0ZXJfd2VpZ2h0czsgIC8qIDEvd2VpZ2h0KHMpIGZvciBwcmV2aW91cyBsaW5lKHMpICovDQorICAgcG5nX3VpbnRfMTZwIGZpbHRlcl9jb3N0czsgICAgICAgIC8qIHJlbGF0aXZlIGZpbHRlciBjYWxjdWxhdGlvbiBjb3N0ICovDQorICAgcG5nX3VpbnRfMTZwIGludl9maWx0ZXJfY29zdHM7ICAgIC8qIDEvcmVsYXRpdmUgZmlsdGVyIGNhbGN1bGF0aW9uIGNvc3QgKi8NCisjZW5kaWYNCisNCisgICAvKiBPcHRpb25zICovDQorI2lmZGVmIFBOR19TRVRfT1BUSU9OX1NVUFBPUlRFRA0KKyAgIHBuZ19ieXRlIG9wdGlvbnM7ICAgICAgICAgICAvKiBPbi9vZmYgc3RhdGUgKHVwIHRvIDQgb3B0aW9ucykgKi8NCisjZW5kaWYNCisNCisjaWYgUE5HX0xJQlBOR19WRVIgPCAxMDcwMA0KKy8qIFRvIGRvOiByZW1vdmUgdGhpcyBmcm9tIGxpYnBuZy0xLjcgKi8NCisjaWZkZWYgUE5HX1RJTUVfUkZDMTEyM19TVVBQT1JURUQNCisgICBjaGFyIHRpbWVfYnVmZmVyWzI5XTsgLyogU3RyaW5nIHRvIGhvbGQgUkZDIDExMjMgdGltZSB0ZXh0ICovDQorI2VuZGlmDQorI2VuZGlmDQorDQorLyogTmV3IG1lbWJlcnMgYWRkZWQgaW4gbGlicG5nLTEuMC42ICovDQorDQorICAgcG5nX3VpbnRfMzIgZnJlZV9tZTsgICAgLyogZmxhZ3MgaXRlbXMgbGlicG5nIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nICovDQorDQorI2lmZGVmIFBOR19VU0VSX0NIVU5LU19TVVBQT1JURUQNCisgICBwbmdfdm9pZHAgdXNlcl9jaHVua19wdHI7DQorI2lmZGVmIFBOR19SRUFEX1VTRVJfQ0hVTktTX1NVUFBPUlRFRA0KKyAgIHBuZ191c2VyX2NodW5rX3B0ciByZWFkX3VzZXJfY2h1bmtfZm47IC8qIHVzZXIgcmVhZCBjaHVuayBoYW5kbGVyICovDQorI2VuZGlmDQorI2VuZGlmDQorDQorI2lmZGVmIFBOR19TRVRfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEDQorICAgaW50ICAgICAgICAgIHVua25vd25fZGVmYXVsdDsgLyogQXMgUE5HX0hBTkRMRV8qICovDQorICAgdW5zaWduZWQgaW50IG51bV9jaHVua19saXN0OyAgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGxpc3QgKi8NCisgICBwbmdfYnl0ZXAgICAgY2h1bmtfbGlzdDsgICAgICAvKiBMaXN0IG9mIHBuZ19ieXRlWzVdOyB0aGUgdGV4dHVhbCBjaHVuayBuYW1lDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZm9sbG93ZWQgYnkgYSBQTkdfSEFORExFXyogYnl0ZSAqLw0KKyNlbmRpZg0KKw0KKy8qIE5ldyBtZW1iZXJzIGFkZGVkIGluIGxpYnBuZy0xLjAuMyAqLw0KKyNpZmRlZiBQTkdfUkVBRF9SR0JfVE9fR1JBWV9TVVBQT1JURUQNCisgICBwbmdfYnl0ZSByZ2JfdG9fZ3JheV9zdGF0dXM7DQorICAgLyogQWRkZWQgaW4gbGlicG5nIDEuNS41IHRvIHJlY29yZCBzZXR0aW5nIG9mIGNvZWZmaWNpZW50czogKi8NCisgICBwbmdfYnl0ZSByZ2JfdG9fZ3JheV9jb2VmZmljaWVudHNfc2V0Ow0KKyAgIC8qIFRoZXNlIHdlcmUgY2hhbmdlZCBmcm9tIHBuZ19ieXRlIGluIGxpYnBuZy0xLjAuNiAqLw0KKyAgIHBuZ191aW50XzE2IHJnYl90b19ncmF5X3JlZF9jb2VmZjsNCisgICBwbmdfdWludF8xNiByZ2JfdG9fZ3JheV9ncmVlbl9jb2VmZjsNCisgICAvKiBkZWxldGVkIGluIDEuNS41OiByZ2JfdG9fZ3JheV9ibHVlX2NvZWZmOyAqLw0KKyNlbmRpZg0KKw0KKy8qIE5ldyBtZW1iZXIgYWRkZWQgaW4gbGlicG5nLTEuMC40IChyZW5hbWVkIGluIDEuMC45KSAqLw0KKyNpZiBkZWZpbmVkKFBOR19NTkdfRkVBVFVSRVNfU1VQUE9SVEVEKQ0KKy8qIENoYW5nZWQgZnJvbSBwbmdfYnl0ZSB0byBwbmdfdWludF8zMiBhdCB2ZXJzaW9uIDEuMi4wICovDQorICAgcG5nX3VpbnRfMzIgbW5nX2ZlYXR1cmVzX3Blcm1pdHRlZDsNCisjZW5kaWYNCisNCisvKiBOZXcgbWVtYmVyIGFkZGVkIGluIGxpYnBuZy0xLjAuOSwgaWZkZWYnZWQgb3V0IGluIDEuMC4xMiwgZW5hYmxlZCBpbiAxLjIuMCAqLw0KKyNpZmRlZiBQTkdfTU5HX0ZFQVRVUkVTX1NVUFBPUlRFRA0KKyAgIHBuZ19ieXRlIGZpbHRlcl90eXBlOw0KKyNlbmRpZg0KKw0KKy8qIE5ldyBtZW1iZXJzIGFkZGVkIGluIGxpYnBuZy0xLjIuMCAqLw0KKw0KKy8qIE5ldyBtZW1iZXJzIGFkZGVkIGluIGxpYnBuZy0xLjAuMiBidXQgZmlyc3QgZW5hYmxlZCBieSBkZWZhdWx0IGluIDEuMi4wICovDQorI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQNCisgICBwbmdfdm9pZHAgbWVtX3B0cjsgICAgICAgICAgICAgLyogdXNlciBzdXBwbGllZCBzdHJ1Y3QgZm9yIG1lbSBmdW5jdGlvbnMgKi8NCisgICBwbmdfbWFsbG9jX3B0ciBtYWxsb2NfZm47ICAgICAgLyogZnVuY3Rpb24gZm9yIGFsbG9jYXRpbmcgbWVtb3J5ICovDQorICAgcG5nX2ZyZWVfcHRyIGZyZWVfZm47ICAgICAgICAgIC8qIGZ1bmN0aW9uIGZvciBmcmVlaW5nIG1lbW9yeSAqLw0KKyNlbmRpZg0KKw0KKy8qIE5ldyBtZW1iZXIgYWRkZWQgaW4gbGlicG5nLTEuMC4xMyBhbmQgMS4yLjAgKi8NCisgICBwbmdfYnl0ZXAgYmlnX3Jvd19idWY7ICAgICAgICAgLyogYnVmZmVyIHRvIHNhdmUgY3VycmVudCAodW5maWx0ZXJlZCkgcm93ICovDQorDQorI2lmZGVmIFBOR19SRUFEX1FVQU5USVpFX1NVUFBPUlRFRA0KKy8qIFRoZSBmb2xsb3dpbmcgdGhyZWUgbWVtYmVycyB3ZXJlIGFkZGVkIGF0IHZlcnNpb24gMS4wLjE0IGFuZCAxLjIuNCAqLw0KKyAgIHBuZ19ieXRlcCBxdWFudGl6ZV9zb3J0OyAgICAgICAgICAvKiB3b3JraW5nIHNvcnQgYXJyYXkgKi8NCisgICBwbmdfYnl0ZXAgaW5kZXhfdG9fcGFsZXR0ZTsgICAgICAgLyogd2hlcmUgdGhlIG9yaWdpbmFsIGluZGV4IGN1cnJlbnRseSBpcw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcGFsZXR0ZSAqLw0KKyAgIHBuZ19ieXRlcCBwYWxldHRlX3RvX2luZGV4OyAgICAgICAvKiB3aGljaCBvcmlnaW5hbCBpbmRleCBwb2ludHMgdG8gdGhpcw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSBjb2xvciAqLw0KKyNlbmRpZg0KKw0KKy8qIE5ldyBtZW1iZXJzIGFkZGVkIGluIGxpYnBuZy0xLjAuMTYgYW5kIDEuMi42ICovDQorICAgcG5nX2J5dGUgY29tcHJlc3Npb25fdHlwZTsNCisNCisjaWZkZWYgUE5HX1VTRVJfTElNSVRTX1NVUFBPUlRFRA0KKyAgIHBuZ191aW50XzMyIHVzZXJfd2lkdGhfbWF4Ow0KKyAgIHBuZ191aW50XzMyIHVzZXJfaGVpZ2h0X21heDsNCisNCisgICAvKiBBZGRlZCBpbiBsaWJwbmctMS40LjA6IFRvdGFsIG51bWJlciBvZiBzUExULCB0ZXh0LCBhbmQgdW5rbm93bg0KKyAgICAqIGNodW5rcyB0aGF0IGNhbiBiZSBzdG9yZWQgKDAgbWVhbnMgdW5saW1pdGVkKS4NCisgICAgKi8NCisgICBwbmdfdWludF8zMiB1c2VyX2NodW5rX2NhY2hlX21heDsNCisNCisgICAvKiBUb3RhbCBtZW1vcnkgdGhhdCBhIHpUWHQsIHNQTFQsIGlUWHQsIGlDQ1AsIG9yIHVua25vd24gY2h1bmsNCisgICAgKiBjYW4gb2NjdXB5IHdoZW4gZGVjb21wcmVzc2VkLiAgMCBtZWFucyB1bmxpbWl0ZWQuDQorICAgICovDQorICAgcG5nX2FsbG9jX3NpemVfdCB1c2VyX2NodW5rX21hbGxvY19tYXg7DQorI2VuZGlmDQorDQorLyogTmV3IG1lbWJlciBhZGRlZCBpbiBsaWJwbmctMS4wLjI1IGFuZCAxLjIuMTcgKi8NCisjaWZkZWYgUE5HX1JFQURfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVEDQorICAgLyogVGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIHVua25vd24gY2h1bmsgdGhhdCB0aGUgbGlicmFyeSBkb2Vzbid0IHJlY29nbml6ZSwNCisgICAgKiB1c2VkIHdoaWxlIHJlYWRpbmcgdGhlIGNodW5rLg0KKyAgICAqLw0KKyAgIHBuZ191bmtub3duX2NodW5rIHVua25vd25fY2h1bms7DQorI2VuZGlmDQorDQorLyogTmV3IG1lbWJlciBhZGRlZCBpbiBsaWJwbmctMS4yLjI2ICovDQorICBwbmdfc2l6ZV90IG9sZF9iaWdfcm93X2J1Zl9zaXplOw0KKw0KKyNpZmRlZiBQTkdfUkVBRF9TVVBQT1JURUQNCisvKiBOZXcgbWVtYmVyIGFkZGVkIGluIGxpYnBuZy0xLjIuMzAgKi8NCisgIHBuZ19ieXRlcCAgICAgICAgcmVhZF9idWZmZXI7ICAgICAgLyogYnVmZmVyIGZvciByZWFkaW5nIGNodW5rIGRhdGEgKi8NCisgIHBuZ19hbGxvY19zaXplX3QgcmVhZF9idWZmZXJfc2l6ZTsgLyogY3VycmVudCBzaXplIG9mIHRoZSBidWZmZXIgKi8NCisjZW5kaWYNCisjaWZkZWYgUE5HX1NFUVVFTlRJQUxfUkVBRF9TVVBQT1JURUQNCisgIHVJbnQgICAgICAgICAgICAgSURBVF9yZWFkX3NpemU7ICAgLyogbGltaXQgb24gcmVhZCBidWZmZXIgc2l6ZSBmb3IgSURBVCAqLw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBQTkdfSU9fU1RBVEVfU1VQUE9SVEVEDQorLyogTmV3IG1lbWJlciBhZGRlZCBpbiBsaWJwbmctMS40LjAgKi8NCisgICBwbmdfdWludF8zMiBpb19zdGF0ZTsNCisjZW5kaWYNCisNCisvKiBOZXcgbWVtYmVyIGFkZGVkIGluIGxpYnBuZy0xLjUuNiAqLw0KKyAgIHBuZ19ieXRlcCBiaWdfcHJldl9yb3c7DQorDQorLyogTmV3IG1lbWJlciBhZGRlZCBpbiBsaWJwbmctMS41LjcgKi8NCisgICB2b2lkICgqcmVhZF9maWx0ZXJbUE5HX0ZJTFRFUl9WQUxVRV9MQVNULTFdKShwbmdfcm93X2luZm9wIHJvd19pbmZvLA0KKyAgICAgIHBuZ19ieXRlcCByb3csIHBuZ19jb25zdF9ieXRlcCBwcmV2X3Jvdyk7DQorDQorI2lmZGVmIFBOR19SRUFEX1NVUFBPUlRFRA0KKyNpZiBkZWZpbmVkKFBOR19DT0xPUlNQQUNFX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfR0FNTUFfU1VQUE9SVEVEKQ0KKyAgIHBuZ19jb2xvcnNwYWNlICAgY29sb3JzcGFjZTsNCisjZW5kaWYNCisjZW5kaWYNCit9Ow0KKyNlbmRpZiAvKiBQTkdTVFJVQ1RfSCAqLw0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5ndHJhbnMuYyBiL3RoaXJkX3BhcnR5L2xwbmdfdjE2My9wbmd0cmFucy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzYW1wbGVzL2Z4X2xwbmcvbHBuZ192MTYzL2Z4X3BuZ3RyYW5zLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xwbmdfdjE2My9wbmd0cmFucy5jCmRpZmYgLS1naXQgYS9zYW1wbGVzL2Z4X2xwbmcvbHBuZ192MTYzL2Z4X3BuZ3dpby5jIGIvdGhpcmRfcGFydHkvbHBuZ192MTYzL3BuZ3dpby5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzYW1wbGVzL2Z4X2xwbmcvbHBuZ192MTYzL2Z4X3BuZ3dpby5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9scG5nX3YxNjMvcG5nd2lvLmMKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5nd3JpdGUuYyBiL3RoaXJkX3BhcnR5L2xwbmdfdjE2My9wbmd3cml0ZS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzYW1wbGVzL2Z4X2xwbmcvbHBuZ192MTYzL2Z4X3BuZ3dyaXRlLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L2xwbmdfdjE2My9wbmd3cml0ZS5jCmRpZmYgLS1naXQgYS9zYW1wbGVzL2Z4X2xwbmcvbHBuZ192MTYzL2Z4X3BuZ3d0cmFuLmMgYi90aGlyZF9wYXJ0eS9scG5nX3YxNjMvcG5nd3RyYW4uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2FtcGxlcy9meF9scG5nL2xwbmdfdjE2My9meF9wbmd3dHJhbi5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9scG5nX3YxNjMvcG5nd3RyYW4uYwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9meF9scG5nL2xwbmdfdjE2My9meF9wbmd3dXRpbC5jIGIvdGhpcmRfcGFydHkvbHBuZ192MTYzL3BuZ3d1dGlsLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNhbXBsZXMvZnhfbHBuZy9scG5nX3YxNjMvZnhfcG5nd3V0aWwuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvbHBuZ192MTYzL3BuZ3d1dGlsLmMKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3BkZml1bWFnZzIzLm1rIGIvdGhpcmRfcGFydHkvcGRmaXVtYWdnMjMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E1ODQ3NwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3BkZml1bWFnZzIzLm1rCkBAIC0wLDAgKzEsMjcgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IGxpYnBkZml1bWFnZzIzCisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorTE9DQUxfTkRLX1NUTF9WQVJJQU5UIDo9IGdudXN0bF9zdGF0aWMKKworTE9DQUxfQ0ZMQUdTICs9IC1PMyAtZnN0cmljdC1hbGlhc2luZyAtZnByZWZldGNoLWxvb3AtYXJyYXlzIC1mZXhjZXB0aW9ucworTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbm9uLXZpcnR1YWwtZHRvciAtV2FsbAorCisjIE1hc2sgc29tZSB3YXJuaW5ncy4gVGhlc2UgYXJlIGJlbmlnbiwgYnV0IHdlIHByb2JhYmx5IHdhbnQgdG8gZml4IHRoZW0KKyMgdXBzdHJlYW0gYXQgc29tZSBwb2ludC4KK0xPQ0FMX0NGTEFHUyArPSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVduby11bnVzZWQtZnVuY3Rpb24KKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBhZ2cyMy9hZ2dfY3VydmVzLmNwcCBcCisgICAgYWdnMjMvYWdnX3BhdGhfc3RvcmFnZS5jcHAgXAorICAgIGFnZzIzL2FnZ19yYXN0ZXJpemVyX3NjYW5saW5lX2FhLmNwcCBcCisgICAgYWdnMjMvYWdnX3ZjZ2VuX2Rhc2guY3BwIFwKKyAgICBhZ2cyMy9hZ2dfdmNnZW5fc3Ryb2tlLmNwcCBcCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgIGV4dGVybmFsL3BkZml1bQorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9wZGZpdW1iaWdpbnQubWsgYi90aGlyZF9wYXJ0eS9wZGZpdW1iaWdpbnQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFhMDQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3BkZml1bWJpZ2ludC5tawpAQCAtMCwwICsxLDIyIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJwZGZpdW1iaWdpbnQKKworTE9DQUxfQVJNX01PREUgOj0gYXJtCitMT0NBTF9OREtfU1RMX1ZBUklBTlQgOj0gZ251c3RsX3N0YXRpYworCitMT0NBTF9DRkxBR1MgKz0gLU8zIC1mc3RyaWN0LWFsaWFzaW5nIC1mcHJlZmV0Y2gtbG9vcC1hcnJheXMgLWZleGNlcHRpb25zCitMT0NBTF9DRkxBR1MgKz0gLVduby1ub24tdmlydHVhbC1kdG9yIC1XYWxsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgYmlnaW50L0JpZ0ludGVnZXIuY2MgXAorICAgIGJpZ2ludC9CaWdJbnRlZ2VyVXRpbHMuY2MgXAorICAgIGJpZ2ludC9CaWdVbnNpZ25lZC5jYyBcCisgICAgYmlnaW50L0JpZ1Vuc2lnbmVkSW5BQmFzZS5jYworCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICBleHRlcm5hbC9wZGZpdW0KKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvcGRmaXVtanBlZy5tayBiL3RoaXJkX3BhcnR5L3BkZml1bWpwZWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhlZTVhMQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3BkZml1bWpwZWcubWsKQEAgLTAsMCArMSw2MiBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gbGlicGRmaXVtanBlZworCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KK0xPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBnbnVzdGxfc3RhdGljCisKK0xPQ0FMX0NGTEFHUyArPSAtTzMgLWZzdHJpY3QtYWxpYXNpbmcgLWZwcmVmZXRjaC1sb29wLWFycmF5cyAtZmV4Y2VwdGlvbnMKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW5vbi12aXJ0dWFsLWR0b3IgLVdhbGwKKworIyBNYXNrIHNvbWUgd2FybmluZ3MuIFRoZXNlIGFyZSBiZW5pZ24sIGJ1dCB3ZSBwcm9iYWJseSB3YW50IHRvIGZpeCB0aGVtCisjIHVwc3RyZWFtIGF0IHNvbWUgcG9pbnQuCitMT0NBTF9DRkxBR1MgKz0gLVduby1zaGlmdC1uZWdhdGl2ZS12YWx1ZSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBsaWJqcGVnL2ZwZGZhcGlfamNhcGltaW4uYyBcCisgICAgbGlianBlZy9mcGRmYXBpX2pjYXBpc3RkLmMgXAorICAgIGxpYmpwZWcvZnBkZmFwaV9qY2NvZWZjdC5jIFwKKyAgICBsaWJqcGVnL2ZwZGZhcGlfamNjb2xvci5jIFwKKyAgICBsaWJqcGVnL2ZwZGZhcGlfamNkY3RtZ3IuYyBcCisgICAgbGlianBlZy9mcGRmYXBpX2pjaHVmZi5jIFwKKyAgICBsaWJqcGVnL2ZwZGZhcGlfamNpbml0LmMgXAorICAgIGxpYmpwZWcvZnBkZmFwaV9qY21haW5jdC5jIFwKKyAgICBsaWJqcGVnL2ZwZGZhcGlfamNtYXJrZXIuYyBcCisgICAgbGlianBlZy9mcGRmYXBpX2pjbWFzdGVyLmMgXAorICAgIGxpYmpwZWcvZnBkZmFwaV9qY29tYXBpLmMgXAorICAgIGxpYmpwZWcvZnBkZmFwaV9qY3BhcmFtLmMgXAorICAgIGxpYmpwZWcvZnBkZmFwaV9qY3BodWZmLmMgXAorICAgIGxpYmpwZWcvZnBkZmFwaV9qY3ByZXBjdC5jIFwKKyAgICBsaWJqcGVnL2ZwZGZhcGlfamNzYW1wbGUuYyBcCisgICAgbGlianBlZy9mcGRmYXBpX2pjdHJhbnMuYyBcCisgICAgbGlianBlZy9mcGRmYXBpX2pkYXBpbWluLmMgXAorICAgIGxpYmpwZWcvZnBkZmFwaV9qZGFwaXN0ZC5jIFwKKyAgICBsaWJqcGVnL2ZwZGZhcGlfamRjb2VmY3QuYyBcCisgICAgbGlianBlZy9mcGRmYXBpX2pkY29sb3IuYyBcCisgICAgbGlianBlZy9mcGRmYXBpX2pkZGN0bWdyLmMgXAorICAgIGxpYmpwZWcvZnBkZmFwaV9qZGh1ZmYuYyBcCisgICAgbGlianBlZy9mcGRmYXBpX2pkaW5wdXQuYyBcCisgICAgbGlianBlZy9mcGRmYXBpX2pkbWFpbmN0LmMgXAorICAgIGxpYmpwZWcvZnBkZmFwaV9qZG1hcmtlci5jIFwKKyAgICBsaWJqcGVnL2ZwZGZhcGlfamRtYXN0ZXIuYyBcCisgICAgbGlianBlZy9mcGRmYXBpX2pkbWVyZ2UuYyBcCisgICAgbGlianBlZy9mcGRmYXBpX2pkcGh1ZmYuYyBcCisgICAgbGlianBlZy9mcGRmYXBpX2pkcG9zdGN0LmMgXAorICAgIGxpYmpwZWcvZnBkZmFwaV9qZHNhbXBsZS5jIFwKKyAgICBsaWJqcGVnL2ZwZGZhcGlfamR0cmFucy5jIFwKKyAgICBsaWJqcGVnL2ZwZGZhcGlfamVycm9yLmMgXAorICAgIGxpYmpwZWcvZnBkZmFwaV9qZmRjdGZzdC5jIFwKKyAgICBsaWJqcGVnL2ZwZGZhcGlfamZkY3RpbnQuYyBcCisgICAgbGlianBlZy9mcGRmYXBpX2ppZGN0ZnN0LmMgXAorICAgIGxpYmpwZWcvZnBkZmFwaV9qaWRjdGludC5jIFwKKyAgICBsaWJqcGVnL2ZwZGZhcGlfamlkY3RyZWQuYyBcCisgICAgbGlianBlZy9mcGRmYXBpX2ptZW1tZ3IuYyBcCisgICAgbGlianBlZy9mcGRmYXBpX2ptZW1ub2JzLmMgXAorICAgIGxpYmpwZWcvZnBkZmFwaV9qdXRpbHMuYworCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICBleHRlcm5hbC9wZGZpdW0KKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvcGRmaXVtbGNtcy5tayBiL3RoaXJkX3BhcnR5L3BkZml1bWxjbXMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE2ODU3MQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3BkZml1bWxjbXMubWsKQEAgLTAsMCArMSw0NyBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gbGlicGRmaXVtbGNtcworCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KK0xPQ0FMX05ES19TVExfVkFSSUFOVCA6PSBnbnVzdGxfc3RhdGljCisKK0xPQ0FMX0NGTEFHUyArPSAtTzMgLWZzdHJpY3QtYWxpYXNpbmcgLWZwcmVmZXRjaC1sb29wLWFycmF5cyAtZmV4Y2VwdGlvbnMKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW5vbi12aXJ0dWFsLWR0b3IgLVdhbGwKKworIyBNYXNrIHNvbWUgd2FybmluZ3MuIFRoZXNlIGFyZSBiZW5pZ24sIGJ1dCB3ZSBwcm9iYWJseSB3YW50IHRvIGZpeCB0aGVtCisjIHVwc3RyZWFtIGF0IHNvbWUgcG9pbnQuCitMT0NBTF9DRkxBR1MgKz0gLVduby11bnVzZWQtcGFyYW1ldGVyIC1Xbm8tbWlzc2luZy1icmFjZXMgLVduby11bnVzZWQtZnVuY3Rpb24KKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBsY21zMi0yLjYvc3JjL2Ntc2NhbTAyLmMgXAorICAgIGxjbXMyLTIuNi9zcmMvY21zY2dhdHMuYyBcCisgICAgbGNtczItMi42L3NyYy9jbXNjbnZydC5jIFwKKyAgICBsY21zMi0yLjYvc3JjL2Ntc2Vyci5jIFwKKyAgICBsY21zMi0yLjYvc3JjL2Ntc2dhbW1hLmMgXAorICAgIGxjbXMyLTIuNi9zcmMvY21zZ210LmMgXAorICAgIGxjbXMyLTIuNi9zcmMvY21zaGFsZi5jIFwKKyAgICBsY21zMi0yLjYvc3JjL2Ntc2ludHJwLmMgXAorICAgIGxjbXMyLTIuNi9zcmMvY21zaW8wLmMgXAorICAgIGxjbXMyLTIuNi9zcmMvY21zaW8xLmMgXAorICAgIGxjbXMyLTIuNi9zcmMvY21zbHV0LmMgXAorICAgIGxjbXMyLTIuNi9zcmMvY21zbWQ1LmMgXAorICAgIGxjbXMyLTIuNi9zcmMvY21zbXRyeC5jIFwKKyAgICBsY21zMi0yLjYvc3JjL2Ntc25hbWVkLmMgXAorICAgIGxjbXMyLTIuNi9zcmMvY21zb3B0LmMgXAorICAgIGxjbXMyLTIuNi9zcmMvY21zcGFjay5jIFwKKyAgICBsY21zMi0yLjYvc3JjL2Ntc3Bjcy5jIFwKKyAgICBsY21zMi0yLjYvc3JjL2Ntc3BsdWdpbi5jIFwKKyAgICBsY21zMi0yLjYvc3JjL2Ntc3BzMi5jIFwKKyAgICBsY21zMi0yLjYvc3JjL2Ntc3NhbXAuYyBcCisgICAgbGNtczItMi42L3NyYy9jbXNzbS5jIFwKKyAgICBsY21zMi0yLjYvc3JjL2Ntc3R5cGVzLmMgXAorICAgIGxjbXMyLTIuNi9zcmMvY21zdmlydC5jIFwKKyAgICBsY21zMi0yLjYvc3JjL2Ntc3d0cG50LmMgXAorICAgIGxjbXMyLTIuNi9zcmMvY21zeGZvcm0uYworCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICBleHRlcm5hbC9wZGZpdW0KKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvcGRmaXVtb3BlbmpwZWcubWsgYi90aGlyZF9wYXJ0eS9wZGZpdW1vcGVuanBlZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWVkODZjCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvcGRmaXVtb3BlbmpwZWcubWsKQEAgLTAsMCArMSw0MSBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gbGlicGRmaXVtb3BlbmpwZWcKKworTE9DQUxfQVJNX01PREUgOj0gYXJtCitMT0NBTF9OREtfU1RMX1ZBUklBTlQgOj0gZ251c3RsX3N0YXRpYworCitMT0NBTF9DRkxBR1MgKz0gLU8zIC1mc3RyaWN0LWFsaWFzaW5nIC1mcHJlZmV0Y2gtbG9vcC1hcnJheXMgLWZleGNlcHRpb25zCitMT0NBTF9DRkxBR1MgKz0gLVduby1ub24tdmlydHVhbC1kdG9yIC1XYWxsCisKKyMgTWFzayBzb21lIHdhcm5pbmdzLiBUaGVzZSBhcmUgYmVuaWduLCBidXQgd2UgcHJvYmFibHkgd2FudCB0byBmaXggdGhlbQorIyB1cHN0cmVhbSBhdCBzb21lIHBvaW50LgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tc2lnbi1jb21wYXJlIC1Xbm8tdW51c2VkLXBhcmFtZXRlcgorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIGxpYm9wZW5qcGVnMjAvYmlvLmMgXAorICAgIGxpYm9wZW5qcGVnMjAvY2lvLmMgXAorICAgIGxpYm9wZW5qcGVnMjAvZHd0LmMgXAorICAgIGxpYm9wZW5qcGVnMjAvZXZlbnQuYyBcCisgICAgbGlib3BlbmpwZWcyMC9mdW5jdGlvbl9saXN0LmMgXAorICAgIGxpYm9wZW5qcGVnMjAvaW1hZ2UuYyBcCisgICAgbGlib3BlbmpwZWcyMC9pbnZlcnQuYyBcCisgICAgbGlib3BlbmpwZWcyMC9qMmsuYyBcCisgICAgbGlib3BlbmpwZWcyMC9qcDIuYyBcCisgICAgbGlib3BlbmpwZWcyMC9tY3QuYyBcCisgICAgbGlib3BlbmpwZWcyMC9tcWMuYyBcCisgICAgbGlib3BlbmpwZWcyMC9vcGVuanBlZy5jIFwKKyAgICBsaWJvcGVuanBlZzIwL29wal9jbG9jay5jIFwKKyAgICBsaWJvcGVuanBlZzIwL3BpLmMgXAorICAgIGxpYm9wZW5qcGVnMjAvcmF3LmMgXAorICAgIGxpYm9wZW5qcGVnMjAvdDEuYyBcCisgICAgbGlib3BlbmpwZWcyMC90Mi5jIFwKKyAgICBsaWJvcGVuanBlZzIwL3RjZC5jIFwKKyAgICBsaWJvcGVuanBlZzIwL3RndC5jCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgIGV4dGVybmFsL3BkZml1bQorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9wZGZpdW16bGliLm1rIGIvdGhpcmRfcGFydHkvcGRmaXVtemxpYi5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTAwN2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvcGRmaXVtemxpYi5tawpAQCAtMCwwICsxLDM3IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJwZGZpdW16bGliCisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorTE9DQUxfTkRLX1NUTF9WQVJJQU5UIDo9IGdudXN0bF9zdGF0aWMKKworTE9DQUxfQ0ZMQUdTICs9IC1PMyAtZnN0cmljdC1hbGlhc2luZyAtZnByZWZldGNoLWxvb3AtYXJyYXlzIC1mZXhjZXB0aW9ucworTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbm9uLXZpcnR1YWwtZHRvciAtV2FsbAorCisjIE1hc2sgc29tZSB3YXJuaW5ncy4gVGhlc2UgYXJlIGJlbmlnbiwgYnV0IHdlIHByb2JhYmx5IHdhbnQgdG8gZml4IHRoZW0KKyMgdXBzdHJlYW0gYXQgc29tZSBwb2ludC4KK0xPQ0FMX0NGTEFHUyArPSAtV25vLXNoaWZ0LW5lZ2F0aXZlLXZhbHVlIC1Xbm8tdW51c2VkLXBhcmFtZXRlcgorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIHpsaWJfdjEyOC9hZGxlcjMyLmMgXAorICAgIHpsaWJfdjEyOC9jb21wcmVzcy5jIFwKKyAgICB6bGliX3YxMjgvY3JjMzIuYyBcCisgICAgemxpYl92MTI4L2RlZmxhdGUuYyBcCisgICAgemxpYl92MTI4L2d6Y2xvc2UuYyBcCisgICAgemxpYl92MTI4L2d6bGliLmMgXAorICAgIHpsaWJfdjEyOC9nenJlYWQuYyBcCisgICAgemxpYl92MTI4L2d6d3JpdGUuYyBcCisgICAgemxpYl92MTI4L2luZmJhY2suYyBcCisgICAgemxpYl92MTI4L2luZmZhc3QuYyBcCisgICAgemxpYl92MTI4L2luZmxhdGUuYyBcCisgICAgemxpYl92MTI4L2luZnRyZWVzLmMgXAorICAgIHpsaWJfdjEyOC90cmVlcy5jIFwKKyAgICB6bGliX3YxMjgvdW5jb21wci5jIFwKKyAgICB6bGliX3YxMjgvenV0aWwuYworCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICBleHRlcm5hbC9wZGZpdW0KKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvdGhpcmRfcGFydHkuZ3lwIGIvdGhpcmRfcGFydHkvdGhpcmRfcGFydHkuZ3lwCmluZGV4IGI2OTc4NjUuLjU0YjZhYTMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L3RoaXJkX3BhcnR5Lmd5cAorKysgYi90aGlyZF9wYXJ0eS90aGlyZF9wYXJ0eS5neXAKQEAgLTMsNiArMywyNiBAQAogIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCiB7CisgICd2YXJpYWJsZXMnOiB7CisgICAgJ3BkZl9lbmFibGVfeGZhJSc6IDAsICAjIFNldCB0byAxIGJ5IHN0YW5kYWxvbmUuZ3lwaSBpbiBzdGFuZGFsb25lIGJ1aWxkcy4KKyAgfSwKKyAgJ3RhcmdldF9kZWZhdWx0cyc6IHsKKyAgICAnZGVmaW5lcyc6IFsKKyAgICAgICdPUEpfU1RBVElDJywKKyAgICAgICdQTkdfUFJFRklYJywKKyAgICAgICdQTkdQUkVGSVhfSCcsCisgICAgICAnUE5HX1VTRV9SRUFEX01BQ1JPUycsCisgICAgICAnX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MnLAorICAgIF0sCisgICAgJ2luY2x1ZGVfZGlycyc6IFsKKyAgICAgICMgVGhpcyBpcyBpbXBsaWNpdCBpbiBHTi4KKyAgICAgICc8KERFUFRIKScsCisgICAgICAnLi4nLAorICAgIF0sCisgICAgJ21zdnNfZGlzYWJsZWRfd2FybmluZ3MnOiBbCisgICAgICA0MDA1LCA0MDE4LCA0MTQ2LCA0MzMzLCA0MzQ1LCA0MjY3CisgICAgXSwKKyAgfSwKICAgJ3RhcmdldHMnOiBbCiAgICAgewogICAgICAgJ3RhcmdldF9uYW1lJzogJ2JpZ2ludCcsCkBAIC0yMSwzNCArNDEsMzcgQEAKICAgICAgIF0sCiAgICAgfSwKICAgICB7Ci0gICAgICAndGFyZ2V0X25hbWUnOiAnZnJlZXR5cGUnLAorICAgICAgJ3RhcmdldF9uYW1lJzogJ2Z4X2ZyZWV0eXBlJywKICAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKICAgICAgICdkZWZpbmVzJzogWwogICAgICAgICAnRlQyX0JVSUxEX0xJQlJBUlknLAogICAgICAgXSwKICAgICAgICdpbmNsdWRlX2RpcnMnOiBbCiAgICAgICAgICAnZnJlZXR5cGUvaW5jbHVkZScsCisgICAgICAgICAnZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZScsCiAgICAgICBdLAogICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICdmcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlLmgnLAorICAgICAgICAnZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oJywKKyAgICAgICAgJ2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRtbS5oJywKKyAgICAgICAgJ2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRvdHZhbC5oJywKKyAgICAgICAgJ2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRvdXRsbi5oJywKKyAgICAgICAgJ2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmgnLAorICAgICAgICAnZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oJywKKyAgICAgICAgJ2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oJywKKyAgICAgICAgJ2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvdHR0YWJsZXMuaCcsCiAgICAgICAgICdmcmVldHlwZS9pbmNsdWRlL2Z0MmJ1aWxkLmgnLAotICAgICAgICAnZnJlZXR5cGUvaW5jbHVkZS9mdG1tLmgnLAotICAgICAgICAnZnJlZXR5cGUvaW5jbHVkZS9mdG90dmFsLmgnLAotICAgICAgICAnZnJlZXR5cGUvaW5jbHVkZS9mdG91dGxuLmgnLAotICAgICAgICAnZnJlZXR5cGUvaW5jbHVkZS90dHRhYmxlcy5oJywKLSAgICAgICAgJ2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvZnRvYmpzLmgnLAotICAgICAgICAnZnJlZXR5cGUvaW5jbHVkZS9pbnRlcm5hbC9mdHN0cmVhbS5oJywKLSAgICAgICAgJ2ZyZWV0eXBlL2luY2x1ZGUvaW50ZXJuYWwvdHR0eXBlcy5oJywKLSAgICAgICAgJ2ZyZWV0eXBlL3NyYy9jZmYvY2Zmb2Jqcy5oJywKLSAgICAgICAgJ2ZyZWV0eXBlL3NyYy9jZmYvY2ZmdHlwZXMuaCcsCi0gICAgICAgICdmcmVldHlwZS9zcmMvY2ZmL2NmZi5jJywKICAgICAgICAgJ2ZyZWV0eXBlL3NyYy9iYXNlL2Z0YmFzZS5jJywKKyAgICAgICAgJ2ZyZWV0eXBlL3NyYy9iYXNlL2Z0YmFzZS5oJywKICAgICAgICAgJ2ZyZWV0eXBlL3NyYy9iYXNlL2Z0Yml0bWFwLmMnLAogICAgICAgICAnZnJlZXR5cGUvc3JjL2Jhc2UvZnRnbHlwaC5jJywKICAgICAgICAgJ2ZyZWV0eXBlL3NyYy9iYXNlL2Z0aW5pdC5jJywKICAgICAgICAgJ2ZyZWV0eXBlL3NyYy9iYXNlL2Z0bGNkZmlsLmMnLAogICAgICAgICAnZnJlZXR5cGUvc3JjL2Jhc2UvZnRtbS5jJywKICAgICAgICAgJ2ZyZWV0eXBlL3NyYy9iYXNlL2Z0c3lzdGVtLmMnLAorICAgICAgICAnZnJlZXR5cGUvc3JjL2NmZi9jZmYuYycsCisgICAgICAgICdmcmVldHlwZS9zcmMvY2ZmL2NmZm9ianMuaCcsCisgICAgICAgICdmcmVldHlwZS9zcmMvY2ZmL2NmZnR5cGVzLmgnLAorICAgICAgICAnZnJlZXR5cGUvc3JjL2NpZC90eXBlMWNpZC5jJywKICAgICAgICAgJ2ZyZWV0eXBlL3NyYy9wc2F1eC9wc2F1eC5jJywKICAgICAgICAgJ2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hpbnRlci5jJywKICAgICAgICAgJ2ZyZWV0eXBlL3NyYy9wc25hbWVzL3BzbW9kdWxlLmMnLApAQCAtNTcsNyArODAsMjMyIEBACiAgICAgICAgICdmcmVldHlwZS9zcmMvc21vb3RoL3Ntb290aC5jJywKICAgICAgICAgJ2ZyZWV0eXBlL3NyYy90cnVldHlwZS90cnVldHlwZS5jJywKICAgICAgICAgJ2ZyZWV0eXBlL3NyYy90eXBlMS90eXBlMS5jJywKLSAgICAgICAgJ2ZyZWV0eXBlL3NyYy9jaWQvdHlwZTFjaWQuYycsCisgICAgICBdLAorICAgICAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgICAgJ2NsYW5nX3dhcm5pbmdfZmxhZ3MnOiBbCisgICAgICAgICAgIyBvcGVuX2ZhY2VfUFNfZnJvbV9zZm50X3N0cmVhbSgpIGFuZCBvcGVuX2ZhY2VfZnJvbV9idWZmZXIoKSBpbgorICAgICAgICAgICMgZnRiYXNlLmggYXJlIHVudXNlZC4KKyAgICAgICAgICAnLVduby11bnVzZWQtZnVuY3Rpb24nLAorICAgICAgICBdLAorICAgICAgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdmeF9hZ2cnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdhZ2cyMy9hZ2dfYmFzaWNzLmgnLAorICAgICAgICAnYWdnMjMvYWdnX2NsaXBfbGlhbmdfYmFyc2t5LmgnLAorICAgICAgICAnYWdnMjMvYWdnX2NvbnZfZGFzaC5oJywKKyAgICAgICAgJ2FnZzIzL2FnZ19jb252X3N0cm9rZS5oJywKKyAgICAgICAgJ2FnZzIzL2FnZ19jdXJ2ZXMuY3BwJywKKyAgICAgICAgJ2FnZzIzL2FnZ19jdXJ2ZXMuaCcsCisgICAgICAgICdhZ2cyMy9hZ2dfcGF0aF9zdG9yYWdlLmNwcCcsCisgICAgICAgICdhZ2cyMy9hZ2dfcGF0aF9zdG9yYWdlLmgnLAorICAgICAgICAnYWdnMjMvYWdnX3Jhc3Rlcml6ZXJfc2NhbmxpbmVfYWEuY3BwJywKKyAgICAgICAgJ2FnZzIzL2FnZ19yYXN0ZXJpemVyX3NjYW5saW5lX2FhLmgnLAorICAgICAgICAnYWdnMjMvYWdnX3JlbmRlcmVyX3NjYW5saW5lLmgnLAorICAgICAgICAnYWdnMjMvYWdnX3JlbmRlcmluZ19idWZmZXIuaCcsCisgICAgICAgICdhZ2cyMy9hZ2dfc2NhbmxpbmVfdS5oJywKKyAgICAgICAgJ2FnZzIzL2FnZ192Y2dlbl9kYXNoLmNwcCcsCisgICAgICAgICdhZ2cyMy9hZ2dfdmNnZW5fc3Ryb2tlLmNwcCcsCisgICAgICBdLAorICAgICAgJ2NvbmRpdGlvbnMnOiBbCisgICAgICAgIFsnb3NfcG9zaXg9PTEnLCB7CisgICAgICAgICAgIyBsaWJyYXJ5IGNvbnRhaW5zIHNldmVyYWwgZW51bSB2cyBub24tZW51bSBjb25kaXRpb25hbHMuCisgICAgICAgICAgJ2NmbGFncyc6IFsgJy1Xbm8tZXh0cmEnLCBdLAorICAgICAgICB9XSwKKyAgICAgIF0sCisgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAnY2xhbmdfd2FybmluZ19mbGFncyc6IFsKKyAgICAgICAgICAjIGNhbGNfYnV0dF9jYXAoKSBpbiBhZ2dfdmNnZW5fc3Ryb2tlLmNwcCBpcyB1bnVzZWQuCisgICAgICAgICAgJy1Xbm8tdW51c2VkLWZ1bmN0aW9uJywKKyAgICAgICAgXSwKKyAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnZnhfbGNtczInLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdsY21zMi0yLjYvaW5jbHVkZS9sY21zMi5oJywKKyAgICAgICAgJ2xjbXMyLTIuNi9pbmNsdWRlL2xjbXMyX3BsdWdpbi5oJywKKyAgICAgICAgJ2xjbXMyLTIuNi9zcmMvY21zY2FtMDIuYycsCisgICAgICAgICdsY21zMi0yLjYvc3JjL2Ntc2NnYXRzLmMnLAorICAgICAgICAnbGNtczItMi42L3NyYy9jbXNjbnZydC5jJywKKyAgICAgICAgJ2xjbXMyLTIuNi9zcmMvY21zZXJyLmMnLAorICAgICAgICAnbGNtczItMi42L3NyYy9jbXNnYW1tYS5jJywKKyAgICAgICAgJ2xjbXMyLTIuNi9zcmMvY21zZ210LmMnLAorICAgICAgICAnbGNtczItMi42L3NyYy9jbXNoYWxmLmMnLAorICAgICAgICAnbGNtczItMi42L3NyYy9jbXNpbnRycC5jJywKKyAgICAgICAgJ2xjbXMyLTIuNi9zcmMvY21zaW8wLmMnLAorICAgICAgICAnbGNtczItMi42L3NyYy9jbXNpbzEuYycsCisgICAgICAgICdsY21zMi0yLjYvc3JjL2Ntc2x1dC5jJywKKyAgICAgICAgJ2xjbXMyLTIuNi9zcmMvY21zbWQ1LmMnLAorICAgICAgICAnbGNtczItMi42L3NyYy9jbXNtdHJ4LmMnLAorICAgICAgICAnbGNtczItMi42L3NyYy9jbXNuYW1lZC5jJywKKyAgICAgICAgJ2xjbXMyLTIuNi9zcmMvY21zb3B0LmMnLAorICAgICAgICAnbGNtczItMi42L3NyYy9jbXNwYWNrLmMnLAorICAgICAgICAnbGNtczItMi42L3NyYy9jbXNwY3MuYycsCisgICAgICAgICdsY21zMi0yLjYvc3JjL2Ntc3BsdWdpbi5jJywKKyAgICAgICAgJ2xjbXMyLTIuNi9zcmMvY21zcHMyLmMnLAorICAgICAgICAnbGNtczItMi42L3NyYy9jbXNzYW1wLmMnLAorICAgICAgICAnbGNtczItMi42L3NyYy9jbXNzbS5jJywKKyAgICAgICAgJ2xjbXMyLTIuNi9zcmMvY21zdHlwZXMuYycsCisgICAgICAgICdsY21zMi0yLjYvc3JjL2Ntc3ZpcnQuYycsCisgICAgICAgICdsY21zMi0yLjYvc3JjL2Ntc3d0cG50LmMnLAorICAgICAgICAnbGNtczItMi42L3NyYy9jbXN4Zm9ybS5jJywKKyAgICAgIF0sCisgICAgICAnY29uZGl0aW9ucyc6IFsKKyAgICAgICAgWydvc19wb3NpeD09MScsIHsKKyAgICAgICAgICAnY2ZsYWdzJzogWworICAgICAgICAgICAgJy1Xbm8tbWFpbicsCisgICAgICAgICAgICAnLVduby1taXNzaW5nLWJyYWNlcycsCisgICAgICAgICAgICAnLVduby11bnVzZWQnLAorICAgICAgICAgIF0sCisgICAgICAgIH1dLAorICAgICAgXSwKKyAgICAgICd2YXJpYWJsZXMnOiB7CisgICAgICAgICdjbGFuZ193YXJuaW5nX2ZsYWdzJzogWworICAgICAgICAgICctV25vLW1pc3NpbmctYnJhY2VzJywKKyAgICAgICAgICAjIEZpbmRQcmV2KCkgaW4gY21zcGx1Z2luLmMgaXMgdW51c2VkLgorICAgICAgICAgICctV25vLXVudXNlZC1mdW5jdGlvbicsCisgICAgICAgIF0sCisgICAgICB9LAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2xpYmpwZWcnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdsaWJqcGVnL2NkZXJyb3IuaCcsCisgICAgICAgICdsaWJqcGVnL2NkanBlZy5oJywKKyAgICAgICAgJ2xpYmpwZWcvZnBkZmFwaV9qY2FwaW1pbi5jJywKKyAgICAgICAgJ2xpYmpwZWcvZnBkZmFwaV9qY2FwaXN0ZC5jJywKKyAgICAgICAgJ2xpYmpwZWcvZnBkZmFwaV9qY2NvZWZjdC5jJywKKyAgICAgICAgJ2xpYmpwZWcvZnBkZmFwaV9qY2NvbG9yLmMnLAorICAgICAgICAnbGlianBlZy9mcGRmYXBpX2pjZGN0bWdyLmMnLAorICAgICAgICAnbGlianBlZy9mcGRmYXBpX2pjaHVmZi5jJywKKyAgICAgICAgJ2xpYmpwZWcvZnBkZmFwaV9qY2luaXQuYycsCisgICAgICAgICdsaWJqcGVnL2ZwZGZhcGlfamNtYWluY3QuYycsCisgICAgICAgICdsaWJqcGVnL2ZwZGZhcGlfamNtYXJrZXIuYycsCisgICAgICAgICdsaWJqcGVnL2ZwZGZhcGlfamNtYXN0ZXIuYycsCisgICAgICAgICdsaWJqcGVnL2ZwZGZhcGlfamNvbWFwaS5jJywKKyAgICAgICAgJ2xpYmpwZWcvZnBkZmFwaV9qY3BhcmFtLmMnLAorICAgICAgICAnbGlianBlZy9mcGRmYXBpX2pjcGh1ZmYuYycsCisgICAgICAgICdsaWJqcGVnL2ZwZGZhcGlfamNwcmVwY3QuYycsCisgICAgICAgICdsaWJqcGVnL2ZwZGZhcGlfamNzYW1wbGUuYycsCisgICAgICAgICdsaWJqcGVnL2ZwZGZhcGlfamN0cmFucy5jJywKKyAgICAgICAgJ2xpYmpwZWcvZnBkZmFwaV9qZGFwaW1pbi5jJywKKyAgICAgICAgJ2xpYmpwZWcvZnBkZmFwaV9qZGFwaXN0ZC5jJywKKyAgICAgICAgJ2xpYmpwZWcvZnBkZmFwaV9qZGNvZWZjdC5jJywKKyAgICAgICAgJ2xpYmpwZWcvZnBkZmFwaV9qZGNvbG9yLmMnLAorICAgICAgICAnbGlianBlZy9mcGRmYXBpX2pkZGN0bWdyLmMnLAorICAgICAgICAnbGlianBlZy9mcGRmYXBpX2pkaHVmZi5jJywKKyAgICAgICAgJ2xpYmpwZWcvZnBkZmFwaV9qZGlucHV0LmMnLAorICAgICAgICAnbGlianBlZy9mcGRmYXBpX2pkbWFpbmN0LmMnLAorICAgICAgICAnbGlianBlZy9mcGRmYXBpX2pkbWFya2VyLmMnLAorICAgICAgICAnbGlianBlZy9mcGRmYXBpX2pkbWFzdGVyLmMnLAorICAgICAgICAnbGlianBlZy9mcGRmYXBpX2pkbWVyZ2UuYycsCisgICAgICAgICdsaWJqcGVnL2ZwZGZhcGlfamRwaHVmZi5jJywKKyAgICAgICAgJ2xpYmpwZWcvZnBkZmFwaV9qZHBvc3RjdC5jJywKKyAgICAgICAgJ2xpYmpwZWcvZnBkZmFwaV9qZHNhbXBsZS5jJywKKyAgICAgICAgJ2xpYmpwZWcvZnBkZmFwaV9qZHRyYW5zLmMnLAorICAgICAgICAnbGlianBlZy9mcGRmYXBpX2plcnJvci5jJywKKyAgICAgICAgJ2xpYmpwZWcvZnBkZmFwaV9qZmRjdGZzdC5jJywKKyAgICAgICAgJ2xpYmpwZWcvZnBkZmFwaV9qZmRjdGludC5jJywKKyAgICAgICAgJ2xpYmpwZWcvZnBkZmFwaV9qaWRjdGZzdC5jJywKKyAgICAgICAgJ2xpYmpwZWcvZnBkZmFwaV9qaWRjdGludC5jJywKKyAgICAgICAgJ2xpYmpwZWcvZnBkZmFwaV9qaWRjdHJlZC5jJywKKyAgICAgICAgJ2xpYmpwZWcvZnBkZmFwaV9qbWVtbWdyLmMnLAorICAgICAgICAnbGlianBlZy9mcGRmYXBpX2ptZW1ub2JzLmMnLAorICAgICAgICAnbGlianBlZy9mcGRmYXBpX2p1dGlscy5jJywKKyAgICAgICAgJ2xpYmpwZWcvamNodWZmLmgnLAorICAgICAgICAnbGlianBlZy9qY29uZmlnLmgnLAorICAgICAgICAnbGlianBlZy9qZGN0LmgnLAorICAgICAgICAnbGlianBlZy9qZGh1ZmYuaCcsCisgICAgICAgICdsaWJqcGVnL2plcnJvci5oJywKKyAgICAgICAgJ2xpYmpwZWcvamluY2x1ZGUuaCcsCisgICAgICAgICdsaWJqcGVnL2ptZW1zeXMuaCcsCisgICAgICAgICdsaWJqcGVnL2ptb3JlY2ZnLmgnLAorICAgICAgICAnbGlianBlZy9qcGVnaW50LmgnLAorICAgICAgICAnbGlianBlZy9qcGVnbGliLmgnLAorICAgICAgICAnbGlianBlZy9qdmVyc2lvbi5oJywKKyAgICAgICAgJ2xpYmpwZWcvdHJhbnN1cHAuaCcsCisgICAgICBdLAorICAgICAgJ2NvbmRpdGlvbnMnOiBbCisgICAgICAgIFsnb3NfcG9zaXg9PTEnLCB7CisgICAgICAgICAgJ2NmbGFncyc6IFsKKyAgICAgICAgICAgICctV25vLW1haW4nLAorICAgICAgICAgICAgJy1Xbm8tbWlzc2luZy1icmFjZXMnLAorICAgICAgICAgICAgJy1Xbm8tdW51c2VkJywKKyAgICAgICAgICBdLAorICAgICAgICB9XSwKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnZnhfbGlib3BlbmpwZWcnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdsaWJvcGVuanBlZzIwL2Jpby5jJywKKyAgICAgICAgJ2xpYm9wZW5qcGVnMjAvY2lvLmMnLAorICAgICAgICAnbGlib3BlbmpwZWcyMC9kd3QuYycsCisgICAgICAgICdsaWJvcGVuanBlZzIwL2V2ZW50LmMnLAorICAgICAgICAnbGlib3BlbmpwZWcyMC9mdW5jdGlvbl9saXN0LmMnLAorICAgICAgICAnbGlib3BlbmpwZWcyMC9pbWFnZS5jJywKKyAgICAgICAgJ2xpYm9wZW5qcGVnMjAvaW52ZXJ0LmMnLAorICAgICAgICAnbGlib3BlbmpwZWcyMC9qMmsuYycsCisgICAgICAgICdsaWJvcGVuanBlZzIwL2pwMi5jJywKKyAgICAgICAgJ2xpYm9wZW5qcGVnMjAvbWN0LmMnLAorICAgICAgICAnbGlib3BlbmpwZWcyMC9tcWMuYycsCisgICAgICAgICdsaWJvcGVuanBlZzIwL29wZW5qcGVnLmMnLAorICAgICAgICAnbGlib3BlbmpwZWcyMC9vcGpfY2xvY2suYycsCisgICAgICAgICdsaWJvcGVuanBlZzIwL3BpLmMnLAorICAgICAgICAnbGlib3BlbmpwZWcyMC9yYXcuYycsCisgICAgICAgICdsaWJvcGVuanBlZzIwL3QxLmMnLAorICAgICAgICAnbGlib3BlbmpwZWcyMC90Mi5jJywKKyAgICAgICAgJ2xpYm9wZW5qcGVnMjAvdGNkLmMnLAorICAgICAgICAnbGlib3BlbmpwZWcyMC90Z3QuYycsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2Z4X2xwbmcnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdscG5nX3YxNjMvcG5nLmgnLAorICAgICAgICAnbHBuZ192MTYzL3BuZy5jJywKKyAgICAgICAgJ2xwbmdfdjE2My9wbmdlcnJvci5jJywKKyAgICAgICAgJ2xwbmdfdjE2My9wbmdnZXQuYycsCisgICAgICAgICdscG5nX3YxNjMvcG5nbWVtLmMnLAorICAgICAgICAnbHBuZ192MTYzL3BuZ3ByZWFkLmMnLAorICAgICAgICAnbHBuZ192MTYzL3BuZ3JlYWQuYycsCisgICAgICAgICdscG5nX3YxNjMvcG5ncmlvLmMnLAorICAgICAgICAnbHBuZ192MTYzL3BuZ3J0cmFuLmMnLAorICAgICAgICAnbHBuZ192MTYzL3BuZ3J1dGlsLmMnLAorICAgICAgICAnbHBuZ192MTYzL3BuZ3NldC5jJywKKyAgICAgICAgJ2xwbmdfdjE2My9wbmd0cmFucy5jJywKKyAgICAgICAgJ2xwbmdfdjE2My9wbmd3aW8uYycsCisgICAgICAgICdscG5nX3YxNjMvcG5nd3JpdGUuYycsCisgICAgICAgICdscG5nX3YxNjMvcG5nd3RyYW4uYycsCisgICAgICAgICdscG5nX3YxNjMvcG5nd3V0aWwuYycsCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2Z4X3psaWInLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICd6bGliX3YxMjgvYWRsZXIzMi5jJywKKyAgICAgICAgJ3psaWJfdjEyOC9jb21wcmVzcy5jJywKKyAgICAgICAgJ3psaWJfdjEyOC9jcmMzMi5jJywKKyAgICAgICAgJ3psaWJfdjEyOC9kZWZsYXRlLmMnLAorICAgICAgICAnemxpYl92MTI4L2d6Y2xvc2UuYycsCisgICAgICAgICd6bGliX3YxMjgvZ3psaWIuYycsCisgICAgICAgICd6bGliX3YxMjgvZ3pyZWFkLmMnLAorICAgICAgICAnemxpYl92MTI4L2d6d3JpdGUuYycsCisgICAgICAgICd6bGliX3YxMjgvaW5mYmFjay5jJywKKyAgICAgICAgJ3psaWJfdjEyOC9pbmZmYXN0LmMnLAorICAgICAgICAnemxpYl92MTI4L2luZmxhdGUuYycsCisgICAgICAgICd6bGliX3YxMjgvaW5mdHJlZXMuYycsCisgICAgICAgICd6bGliX3YxMjgvdHJlZXMuYycsCisgICAgICAgICd6bGliX3YxMjgvdW5jb21wci5jJywKKyAgICAgICAgJ3psaWJfdjEyOC96dXRpbC5jJywKICAgICAgIF0sCiAgICAgfSwKICAgICB7CkBAIC02NiwxMyArMzE0LDYxIEBACiAgICAgICAnc291cmNlcyc6IFsKICAgICAgICAgJ2Jhc2UvbG9nZ2luZy5oJywKICAgICAgICAgJ2Jhc2UvbWFjcm9zLmgnLAotICAgICAgICAnYmFzZS9ub25zdGRfdW5pcXVlX3B0ci5oJywKLSAgICAgICAgJ2Jhc2UvdGVtcGxhdGVfdXRpbC5oJywKICAgICAgICAgJ2Jhc2UvbnVtZXJpY3Mvc2FmZV9jb252ZXJzaW9ucy5oJywKICAgICAgICAgJ2Jhc2UvbnVtZXJpY3Mvc2FmZV9jb252ZXJzaW9uc19pbXBsLmgnLAogICAgICAgICAnYmFzZS9udW1lcmljcy9zYWZlX21hdGguaCcsCiAgICAgICAgICdiYXNlL251bWVyaWNzL3NhZmVfbWF0aF9pbXBsLmgnLAorICAgICAgICAnYmFzZS9zdGxfdXRpbC5oJywKICAgICAgIF0sCiAgICAgfSwKICAgXSwKKyAgJ2NvbmRpdGlvbnMnOiBbCisgICAgWydwZGZfZW5hYmxlX3hmYT09MScsIHsKKyAgICAgICd0YXJnZXRzJzogWworICAgICAgICB7CisgICAgICAgICAgJ3RhcmdldF9uYW1lJzogJ2Z4X3RpZmYnLAorICAgICAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgICAgICdsaWJ0aWZmL3RpZmZpb3AuaCcsCisgICAgICAgICAgICAnbGlidGlmZi90aWZmdmVycy5oJywKKyAgICAgICAgICAgICdsaWJ0aWZmL3RpZl9hdXguYycsCisgICAgICAgICAgICAnbGlidGlmZi90aWZfY2xvc2UuYycsCisgICAgICAgICAgICAnbGlidGlmZi90aWZfY29kZWMuYycsCisgICAgICAgICAgICAnbGlidGlmZi90aWZfY29sb3IuYycsCisgICAgICAgICAgICAnbGlidGlmZi90aWZfY29tcHJlc3MuYycsCisgICAgICAgICAgICAnbGlidGlmZi90aWZfZGlyLmMnLAorICAgICAgICAgICAgJ2xpYnRpZmYvdGlmX2RpcmluZm8uYycsCisgICAgICAgICAgICAnbGlidGlmZi90aWZfZGlycmVhZC5jJywKKyAgICAgICAgICAgICdsaWJ0aWZmL3RpZl9kaXJ3cml0ZS5jJywKKyAgICAgICAgICAgICdsaWJ0aWZmL3RpZl9kdW1wbW9kZS5jJywKKyAgICAgICAgICAgICdsaWJ0aWZmL3RpZl9lcnJvci5jJywKKyAgICAgICAgICAgICdsaWJ0aWZmL3RpZl9leHRlbnNpb24uYycsCisgICAgICAgICAgICAnbGlidGlmZi90aWZfZmF4My5jJywKKyAgICAgICAgICAgICdsaWJ0aWZmL3RpZl9mYXgzc20uYycsCisgICAgICAgICAgICAnbGlidGlmZi90aWZfZmx1c2guYycsCisgICAgICAgICAgICAnbGlidGlmZi90aWZfZ2V0aW1hZ2UuYycsCisgICAgICAgICAgICAnbGlidGlmZi90aWZfanBlZy5jJywKKyAgICAgICAgICAgICdsaWJ0aWZmL3RpZl9sdXYuYycsCisgICAgICAgICAgICAnbGlidGlmZi90aWZfbHp3LmMnLAorICAgICAgICAgICAgJ2xpYnRpZmYvdGlmX25leHQuYycsCisgICAgICAgICAgICAnbGlidGlmZi90aWZfb2pwZWcuYycsCisgICAgICAgICAgICAnbGlidGlmZi90aWZfb3Blbi5jJywKKyAgICAgICAgICAgICdsaWJ0aWZmL3RpZl9wYWNrYml0cy5jJywKKyAgICAgICAgICAgICdsaWJ0aWZmL3RpZl9waXhhcmxvZy5jJywKKyAgICAgICAgICAgICdsaWJ0aWZmL3RpZl9wcmVkaWN0LmMnLAorICAgICAgICAgICAgJ2xpYnRpZmYvdGlmX3ByaW50LmMnLAorICAgICAgICAgICAgJ2xpYnRpZmYvdGlmX3JlYWQuYycsCisgICAgICAgICAgICAnbGlidGlmZi90aWZfc3RyaXAuYycsCisgICAgICAgICAgICAnbGlidGlmZi90aWZfc3dhYi5jJywKKyAgICAgICAgICAgICdsaWJ0aWZmL3RpZl90aHVuZGVyLmMnLAorICAgICAgICAgICAgJ2xpYnRpZmYvdGlmX3RpbGUuYycsCisgICAgICAgICAgICAnbGlidGlmZi90aWZfdmVyc2lvbi5jJywKKyAgICAgICAgICAgICdsaWJ0aWZmL3RpZl93YXJuaW5nLmMnLAorICAgICAgICAgICAgJ2xpYnRpZmYvdGlmX3dyaXRlLmMnLAorICAgICAgICAgICAgJ2xpYnRpZmYvdGlmX3ppcC5jJywKKyAgICAgICAgICBdLAorICAgICAgICB9LAorICAgICAgXSwKKyAgICB9XSwKKyAgXSwKIH0KZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi96bGliX3YxMjgvZnhfemxpYl9hZGxlcjMyLmMgYi90aGlyZF9wYXJ0eS96bGliX3YxMjgvYWRsZXIzMi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvemxpYl92MTI4L2Z4X3psaWJfYWRsZXIzMi5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS96bGliX3YxMjgvYWRsZXIzMi5jCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvemxpYl92MTI4L2Z4X3psaWJfY29tcHJlc3MuYyBiL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9jb21wcmVzcy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvemxpYl92MTI4L2Z4X3psaWJfY29tcHJlc3MuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvemxpYl92MTI4L2NvbXByZXNzLmMKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi96bGliX3YxMjgvZnhfemxpYl9jcmMzMi5jIGIvdGhpcmRfcGFydHkvemxpYl92MTI4L2NyYzMyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi96bGliX3YxMjgvZnhfemxpYl9jcmMzMi5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS96bGliX3YxMjgvY3JjMzIuYwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3psaWJfdjEyOC9jcmMzMi5oIGIvdGhpcmRfcGFydHkvemxpYl92MTI4L2NyYzMyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi96bGliX3YxMjgvY3JjMzIuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvemxpYl92MTI4L2NyYzMyLmgKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi96bGliX3YxMjgvZnhfemxpYl9kZWZsYXRlLmMgYi90aGlyZF9wYXJ0eS96bGliX3YxMjgvZGVmbGF0ZS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvemxpYl92MTI4L2Z4X3psaWJfZGVmbGF0ZS5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS96bGliX3YxMjgvZGVmbGF0ZS5jCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvemxpYl92MTI4L2RlZmxhdGUuaCBiL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9kZWZsYXRlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi96bGliX3YxMjgvZGVmbGF0ZS5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS96bGliX3YxMjgvZGVmbGF0ZS5oCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvemxpYl92MTI4L2d6Y2xvc2UuYyBiL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9nemNsb3NlLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi96bGliX3YxMjgvZ3pjbG9zZS5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS96bGliX3YxMjgvZ3pjbG9zZS5jCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvemxpYl92MTI4L2d6Z3V0cy5oIGIvdGhpcmRfcGFydHkvemxpYl92MTI4L2d6Z3V0cy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvemxpYl92MTI4L2d6Z3V0cy5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS96bGliX3YxMjgvZ3pndXRzLmgKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi96bGliX3YxMjgvZ3psaWIuYyBiL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9nemxpYi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvemxpYl92MTI4L2d6bGliLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L3psaWJfdjEyOC9nemxpYi5jCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvemxpYl92MTI4L2d6cmVhZC5jIGIvdGhpcmRfcGFydHkvemxpYl92MTI4L2d6cmVhZC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvemxpYl92MTI4L2d6cmVhZC5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS96bGliX3YxMjgvZ3pyZWFkLmMKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi96bGliX3YxMjgvZ3p3cml0ZS5jIGIvdGhpcmRfcGFydHkvemxpYl92MTI4L2d6d3JpdGUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3psaWJfdjEyOC9nendyaXRlLmMKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L3psaWJfdjEyOC9nendyaXRlLmMKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi96bGliX3YxMjgvZnhfemxpYl9pbmZiYWNrLmMgYi90aGlyZF9wYXJ0eS96bGliX3YxMjgvaW5mYmFjay5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvemxpYl92MTI4L2Z4X3psaWJfaW5mYmFjay5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS96bGliX3YxMjgvaW5mYmFjay5jCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvemxpYl92MTI4L2Z4X3psaWJfaW5mZmFzdC5jIGIvdGhpcmRfcGFydHkvemxpYl92MTI4L2luZmZhc3QuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3psaWJfdjEyOC9meF96bGliX2luZmZhc3QuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvemxpYl92MTI4L2luZmZhc3QuYwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3psaWJfdjEyOC9pbmZmYXN0LmggYi90aGlyZF9wYXJ0eS96bGliX3YxMjgvaW5mZmFzdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvemxpYl92MTI4L2luZmZhc3QuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvemxpYl92MTI4L2luZmZhc3QuaApkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3psaWJfdjEyOC9pbmZmaXhlZC5oIGIvdGhpcmRfcGFydHkvemxpYl92MTI4L2luZmZpeGVkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi96bGliX3YxMjgvaW5mZml4ZWQuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvemxpYl92MTI4L2luZmZpeGVkLmgKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi96bGliX3YxMjgvZnhfemxpYl9pbmZsYXRlLmMgYi90aGlyZF9wYXJ0eS96bGliX3YxMjgvaW5mbGF0ZS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvemxpYl92MTI4L2Z4X3psaWJfaW5mbGF0ZS5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS96bGliX3YxMjgvaW5mbGF0ZS5jCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvemxpYl92MTI4L2luZmxhdGUuaCBiL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9pbmZsYXRlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi96bGliX3YxMjgvaW5mbGF0ZS5oCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS96bGliX3YxMjgvaW5mbGF0ZS5oCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvemxpYl92MTI4L2Z4X3psaWJfaW5mdHJlZXMuYyBiL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9pbmZ0cmVlcy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvemxpYl92MTI4L2Z4X3psaWJfaW5mdHJlZXMuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvemxpYl92MTI4L2luZnRyZWVzLmMKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi96bGliX3YxMjgvaW5mdHJlZXMuaCBiL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9pbmZ0cmVlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvemxpYl92MTI4L2luZnRyZWVzLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L3psaWJfdjEyOC9pbmZ0cmVlcy5oCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvemxpYl92MTI4L2Z4X3psaWJfdHJlZXMuYyBiL3RoaXJkX3BhcnR5L3psaWJfdjEyOC90cmVlcy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvemxpYl92MTI4L2Z4X3psaWJfdHJlZXMuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvemxpYl92MTI4L3RyZWVzLmMKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi96bGliX3YxMjgvdHJlZXMuaCBiL3RoaXJkX3BhcnR5L3psaWJfdjEyOC90cmVlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvemxpYl92MTI4L3RyZWVzLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L3psaWJfdjEyOC90cmVlcy5oCmRpZmYgLS1naXQgYS9jb3JlL3NyYy9meGNvZGVjL2Z4X3psaWIvemxpYl92MTI4L2Z4X3psaWJfdW5jb21wci5jIGIvdGhpcmRfcGFydHkvemxpYl92MTI4L3VuY29tcHIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3psaWJfdjEyOC9meF96bGliX3VuY29tcHIuYwpyZW5hbWUgdG8gdGhpcmRfcGFydHkvemxpYl92MTI4L3VuY29tcHIuYwpkaWZmIC0tZ2l0IGEvY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3psaWJfdjEyOC96Y29uZi5oIGIvdGhpcmRfcGFydHkvemxpYl92MTI4L3pjb25mLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi96bGliX3YxMjgvemNvbmYuaApyZW5hbWUgdG8gdGhpcmRfcGFydHkvemxpYl92MTI4L3pjb25mLmgKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi96bGliX3YxMjgvemxpYi5oIGIvdGhpcmRfcGFydHkvemxpYl92MTI4L3psaWIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9zcmMvZnhjb2RlYy9meF96bGliL3psaWJfdjEyOC96bGliLmgKcmVuYW1lIHRvIHRoaXJkX3BhcnR5L3psaWJfdjEyOC96bGliLmgKZGlmZiAtLWdpdCBhL2NvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi96bGliX3YxMjgvZnhfemxpYl96dXRpbC5jIGIvdGhpcmRfcGFydHkvemxpYl92MTI4L3p1dGlsLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvc3JjL2Z4Y29kZWMvZnhfemxpYi96bGliX3YxMjgvZnhfemxpYl96dXRpbC5jCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS96bGliX3YxMjgvenV0aWwuYwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvemxpYl92MTI4L3p1dGlsLmggYi90aGlyZF9wYXJ0eS96bGliX3YxMjgvenV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTNkZDYwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvemxpYl92MTI4L3p1dGlsLmgKQEAgLTAsMCArMSwyNTUgQEAKKy8qIHp1dGlsLmggLS0gaW50ZXJuYWwgaW50ZXJmYWNlIGFuZCBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5CisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5LgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKy8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCisgICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKKyAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KKyAqLworCisvKiBAKCMpICRJZCQgKi8KKworI2lmbmRlZiBaVVRJTF9ICisjZGVmaW5lIFpVVElMX0gKKworI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaCIKKworI2lmZGVmIEhBVkVfSElEREVOCisjICBkZWZpbmUgWkxJQl9JTlRFUk5BTCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5ICgiaGlkZGVuIikpKQorI2Vsc2UKKyMgIGRlZmluZSBaTElCX0lOVEVSTkFMCisjZW5kaWYKKworI2luY2x1ZGUgInpsaWIuaCIKKworI2lmIGRlZmluZWQoU1REQykgJiYgIWRlZmluZWQoWl9TT0xPKQorIyAgaWYgIShkZWZpbmVkKF9XSU4zMl9XQ0UpICYmIGRlZmluZWQoX01TQ19WRVIpKQorIyAgICBpbmNsdWRlIDxzdGRkZWYuaD4KKyMgIGVuZGlmCisjICBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpZmRlZiBaX1NPTE8KKyAgIHR5cGVkZWYgbG9uZyBwdHJkaWZmX3Q7ICAvKiBndWVzcyAtLSB3aWxsIGJlIGNhdWdodCBpZiBndWVzcyBpcyB3cm9uZyAqLworI2VuZGlmCisKKyNpZm5kZWYgbG9jYWwKKyMgIGRlZmluZSBsb2NhbCBzdGF0aWMKKyNlbmRpZgorLyogY29tcGlsZSB3aXRoIC1EbG9jYWwgaWYgeW91ciBkZWJ1Z2dlciBjYW4ndCBmaW5kIHN0YXRpYyBzeW1ib2xzICovCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgdWNoOwordHlwZWRlZiB1Y2ggRkFSIHVjaGY7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVzaDsKK3R5cGVkZWYgdXNoIEZBUiB1c2hmOwordHlwZWRlZiB1bnNpZ25lZCBsb25nICB1bGc7CisKK2V4dGVybiB6X2NvbnN0IGNoYXIgKiBjb25zdCB6X2Vycm1zZ1sxMF07IC8qIGluZGV4ZWQgYnkgMi16bGliX2Vycm9yICovCisvKiAoc2l6ZSBnaXZlbiB0byBhdm9pZCBzaWxseSB3YXJuaW5ncyB3aXRoIFZpc3VhbCBDKyspICovCisKKyNkZWZpbmUgRVJSX01TRyhlcnIpIHpfZXJybXNnW1pfTkVFRF9ESUNULShlcnIpXQorCisjZGVmaW5lIEVSUl9SRVRVUk4oc3RybSxlcnIpIFwKKyAgcmV0dXJuIChzdHJtLT5tc2cgPSBFUlJfTVNHKGVyciksIChlcnIpKQorLyogVG8gYmUgdXNlZCBvbmx5IHdoZW4gdGhlIHN0YXRlIGlzIGtub3duIHRvIGJlIHZhbGlkICovCisKKyAgICAgICAgLyogY29tbW9uIGNvbnN0YW50cyAqLworCisjaWZuZGVmIERFRl9XQklUUworIyAgZGVmaW5lIERFRl9XQklUUyBNQVhfV0JJVFMKKyNlbmRpZgorLyogZGVmYXVsdCB3aW5kb3dCaXRzIGZvciBkZWNvbXByZXNzaW9uLiBNQVhfV0JJVFMgaXMgZm9yIGNvbXByZXNzaW9uIG9ubHkgKi8KKworI2lmIE1BWF9NRU1fTEVWRUwgPj0gOAorIyAgZGVmaW5lIERFRl9NRU1fTEVWRUwgOAorI2Vsc2UKKyMgIGRlZmluZSBERUZfTUVNX0xFVkVMICBNQVhfTUVNX0xFVkVMCisjZW5kaWYKKy8qIGRlZmF1bHQgbWVtTGV2ZWwgKi8KKworI2RlZmluZSBTVE9SRURfQkxPQ0sgMAorI2RlZmluZSBTVEFUSUNfVFJFRVMgMQorI2RlZmluZSBEWU5fVFJFRVMgICAgMgorLyogVGhlIHRocmVlIGtpbmRzIG9mIGJsb2NrIHR5cGUgKi8KKworI2RlZmluZSBNSU5fTUFUQ0ggIDMKKyNkZWZpbmUgTUFYX01BVENIICAyNTgKKy8qIFRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIG1hdGNoIGxlbmd0aHMgKi8KKworI2RlZmluZSBQUkVTRVRfRElDVCAweDIwIC8qIHByZXNldCBkaWN0aW9uYXJ5IGZsYWcgaW4gemxpYiBoZWFkZXIgKi8KKworICAgICAgICAvKiB0YXJnZXQgZGVwZW5kZW5jaWVzICovCisKKyNpZiBkZWZpbmVkKE1TRE9TKSB8fCAoZGVmaW5lZChXSU5ET1dTKSAmJiAhZGVmaW5lZChXSU4zMikpCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwMAorIyAgaWZuZGVmIFpfU09MTworIyAgICBpZiBkZWZpbmVkKF9fVFVSQk9DX18pIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorIyAgICAgIGlmIChfX1NURENfXyA9PSAxKSAmJiAoZGVmaW5lZChfX0xBUkdFX18pIHx8IGRlZmluZWQoX19DT01QQUNUX18pKQorICAgICAgICAgLyogQWxsb3cgY29tcGlsYXRpb24gd2l0aCBBTlNJIGtleXdvcmRzIG9ubHkgZW5hYmxlZCAqLworICAgICAgICAgdm9pZCBfQ2RlY2wgZmFyZnJlZSggdm9pZCAqYmxvY2sgKTsKKyAgICAgICAgIHZvaWQgKl9DZGVjbCBmYXJtYWxsb2MoIHVuc2lnbmVkIGxvbmcgbmJ5dGVzICk7CisjICAgICAgZWxzZQorIyAgICAgICAgaW5jbHVkZSA8YWxsb2MuaD4KKyMgICAgICBlbmRpZgorIyAgICBlbHNlIC8qIE1TQyBvciBESkdQUCAqLworIyAgICAgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgQU1JR0EKKyMgIGRlZmluZSBPU19DT0RFICAweDAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoVkFYQykgfHwgZGVmaW5lZChWTVMpCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwMgorIyAgZGVmaW5lIEZfT1BFTihuYW1lLCBtb2RlKSBcCisgICAgIEZYU1lTX2ZvcGVuKChuYW1lKSwgKG1vZGUpLCAibWJjPTYwIiwgImN0eD1zdG0iLCAicmZtPWZpeCIsICJtcnM9NTEyIikKKyNlbmRpZgorCisjaWYgZGVmaW5lZChBVEFSSSkgfHwgZGVmaW5lZChhdGFyaXN0KQorIyAgZGVmaW5lIE9TX0NPREUgIDB4MDUKKyNlbmRpZgorCisjaWZkZWYgT1MyCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwNgorIyAgaWYgZGVmaW5lZChNX0k4NikgJiYgIWRlZmluZWQoWl9TT0xPKQorIyAgICBpbmNsdWRlIDxtYWxsb2MuaD4KKyMgIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoTUFDT1MpIHx8IGRlZmluZWQoVEFSR0VUX09TX01BQykKKyMgIGRlZmluZSBPU19DT0RFICAweDA3CisjICBpZm5kZWYgWl9TT0xPCisjICAgIGlmIGRlZmluZWQoX19NV0VSS1NfXykgJiYgX19kZXN0X29zICE9IF9fYmVfb3MgJiYgX19kZXN0X29zICE9IF9fd2luMzJfb3MKKyMgICAgICBpbmNsdWRlIDx1bml4Lmg+IC8qIGZvciBmZG9wZW4gKi8KKyMgICAgZWxzZQorIyAgICAgIGlmbmRlZiBmZG9wZW4KKyMgICAgICAgIGRlZmluZSBmZG9wZW4oZmQsbW9kZSkgTlVMTCAvKiBObyBmZG9wZW4oKSAqLworIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBUT1BTMjAKKyMgIGRlZmluZSBPU19DT0RFICAweDBhCisjZW5kaWYKKworI2lmZGVmIFdJTjMyCisjICBpZm5kZWYgX19DWUdXSU5fXyAgLyogQ3lnd2luIGlzIFVuaXgsIG5vdCBXaW4zMiAqLworIyAgICBkZWZpbmUgT1NfQ09ERSAgMHgwYgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX181MFNFUklFUyAvKiBQcmltZS9QUklNT1MgKi8KKyMgIGRlZmluZSBPU19DT0RFICAweDBmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX0JFT1NfKSB8fCBkZWZpbmVkKFJJU0NPUykKKyMgIGRlZmluZSBmZG9wZW4oZmQsbW9kZSkgTlVMTCAvKiBObyBmZG9wZW4oKSAqLworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gNjAwKSkgJiYgIWRlZmluZWQgX19JTlRFUklYCisjICBpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpCisjICAgIGRlZmluZSBmZG9wZW4oZmQsbW9kZSkgTlVMTCAvKiBObyBmZG9wZW4oKSAqLworIyAgICBpZm5kZWYgX1BUUkRJRkZfVF9ERUZJTkVECisgICAgICAgdHlwZWRlZiBpbnQgcHRyZGlmZl90OworIyAgICAgIGRlZmluZSBfUFRSRElGRl9UX0RFRklORUQKKyMgICAgZW5kaWYKKyMgIGVsc2UKKyMgICAgZGVmaW5lIGZkb3BlbihmZCx0eXBlKSAgX2Zkb3BlbihmZCx0eXBlKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmICFkZWZpbmVkKE1TRE9TKQorICAjcHJhZ21hIHdhcm4gLTgwMDQKKyAgI3ByYWdtYSB3YXJuIC04MDA4CisgICNwcmFnbWEgd2FybiAtODA2NgorI2VuZGlmCisKKy8qIHByb3ZpZGUgcHJvdG90eXBlcyBmb3IgdGhlc2Ugd2hlbiBidWlsZGluZyB6bGliIHdpdGhvdXQgTEZTICovCisjaWYgIWRlZmluZWQoX1dJTjMyKSAmJiBcCisgICAgKCFkZWZpbmVkKF9MQVJHRUZJTEU2NF9TT1VSQ0UpIHx8IF9MRlM2NF9MQVJHRUZJTEUtMCA9PSAwKQorICAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmU2NCBPRigodUxvbmcsIHVMb25nLCB6X29mZl90KSk7CisgICAgWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNyYzMyX2NvbWJpbmU2NCBPRigodUxvbmcsIHVMb25nLCB6X29mZl90KSk7CisjZW5kaWYKKworICAgICAgICAvKiBjb21tb24gZGVmYXVsdHMgKi8KKworI2lmbmRlZiBPU19DT0RFCisjICBkZWZpbmUgT1NfQ09ERSAgMHgwMyAgLyogYXNzdW1lIFVuaXggKi8KKyNlbmRpZgorCisjaWZuZGVmIEZfT1BFTgorIyAgZGVmaW5lIEZfT1BFTihuYW1lLCBtb2RlKSBGWFNZU19mb3BlbigobmFtZSksIChtb2RlKSkKKyNlbmRpZgorCisgICAgICAgICAvKiBmdW5jdGlvbnMgKi8KKworI2lmIGRlZmluZWQocHlyKSB8fCBkZWZpbmVkKFpfU09MTykKKyMgIGRlZmluZSBOT19NRU1DUFkKKyNlbmRpZgorI2lmIGRlZmluZWQoU01BTExfTUVESVVNKSAmJiAhZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX19TQ19fKQorIC8qIFVzZSBvdXIgb3duIGZ1bmN0aW9ucyBmb3Igc21hbGwgYW5kIG1lZGl1bSBtb2RlbCB3aXRoIE1TQyA8PSA1LjAuCisgICogWW91IG1heSBoYXZlIHRvIHVzZSB0aGUgc2FtZSBzdHJhdGVneSBmb3IgQm9ybGFuZCBDICh1bnRlc3RlZCkuCisgICogVGhlIF9fU0NfXyBjaGVjayBpcyBmb3IgU3ltYW50ZWMuCisgICovCisjICBkZWZpbmUgTk9fTUVNQ1BZCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNUREMpICYmICFkZWZpbmVkKEhBVkVfTUVNQ1BZKSAmJiAhZGVmaW5lZChOT19NRU1DUFkpCisjICBkZWZpbmUgSEFWRV9NRU1DUFkKKyNlbmRpZgorI2lmZGVmIEhBVkVfTUVNQ1BZCisjICBpZmRlZiBTTUFMTF9NRURJVU0gLyogTVNET1Mgc21hbGwgb3IgbWVkaXVtIG1vZGVsICovCisjICAgIGRlZmluZSB6bWVtY3B5IF9mbWVtY3B5CisjICAgIGRlZmluZSB6bWVtY21wIF9mbWVtY21wCisjICAgIGRlZmluZSB6bWVtemVybyhkZXN0LCBsZW4pIF9mbWVtc2V0KGRlc3QsIDAsIGxlbikKKyMgIGVsc2UKKyMgICAgZGVmaW5lIHptZW1jcHkgRlhTWVNfbWVtY3B5CisjICAgIGRlZmluZSB6bWVtY21wIEZYU1lTX21lbWNtcAorIyAgICBkZWZpbmUgem1lbXplcm8oZGVzdCwgbGVuKSBGWFNZU19tZW1zZXQoZGVzdCwgMCwgbGVuKQorIyAgZW5kaWYKKyNlbHNlCisgICB2b2lkIFpMSUJfSU5URVJOQUwgem1lbWNweSBPRigoQnl0ZWYqIGRlc3QsIGNvbnN0IEJ5dGVmKiBzb3VyY2UsIHVJbnQgbGVuKSk7CisgICBpbnQgWkxJQl9JTlRFUk5BTCB6bWVtY21wIE9GKChjb25zdCBCeXRlZiogczEsIGNvbnN0IEJ5dGVmKiBzMiwgdUludCBsZW4pKTsKKyAgIHZvaWQgWkxJQl9JTlRFUk5BTCB6bWVtemVybyBPRigoQnl0ZWYqIGRlc3QsIHVJbnQgbGVuKSk7CisjZW5kaWYKKworLyogRGlhZ25vc3RpYyBmdW5jdGlvbnMgKi8KKyNpZmRlZiBERUJVRworIyAgaW5jbHVkZSA8c3RkaW8uaD4KKyAgIGV4dGVybiBpbnQgWkxJQl9JTlRFUk5BTCB6X3ZlcmJvc2U7CisgICBleHRlcm4gdm9pZCBaTElCX0lOVEVSTkFMIHpfZXJyb3IgT0YoKGNoYXIgKm0pKTsKKyMgIGRlZmluZSBBc3NlcnQoY29uZCxtc2cpIHtpZighKGNvbmQpKSB6X2Vycm9yKG1zZyk7fQorIyAgZGVmaW5lIFRyYWNlKHgpIHtpZiAoel92ZXJib3NlPj0wKSBGWFNZU19mcHJpbnRmIHggO30KKyMgIGRlZmluZSBUcmFjZXYoeCkge2lmICh6X3ZlcmJvc2U+MCkgRlhTWVNfZnByaW50ZiB4IDt9CisjICBkZWZpbmUgVHJhY2V2dih4KSB7aWYgKHpfdmVyYm9zZT4xKSBGWFNZU19mcHJpbnRmIHggO30KKyMgIGRlZmluZSBUcmFjZWMoYyx4KSB7aWYgKHpfdmVyYm9zZT4wICYmIChjKSkgRlhTWVNfZnByaW50ZiB4IDt9CisjICBkZWZpbmUgVHJhY2VjdihjLHgpIHtpZiAoel92ZXJib3NlPjEgJiYgKGMpKSBGWFNZU19mcHJpbnRmIHggO30KKyNlbHNlCisjICBkZWZpbmUgQXNzZXJ0KGNvbmQsbXNnKQorIyAgZGVmaW5lIFRyYWNlKHgpCisjICBkZWZpbmUgVHJhY2V2KHgpCisjICBkZWZpbmUgVHJhY2V2dih4KQorIyAgZGVmaW5lIFRyYWNlYyhjLHgpCisjICBkZWZpbmUgVHJhY2VjdihjLHgpCisjZW5kaWYKKworI2lmbmRlZiBaX1NPTE8KKyAgIHZvaWRwZiBaTElCX0lOVEVSTkFMIHpjYWxsb2MgT0YoKHZvaWRwZiBvcGFxdWUsIHVuc2lnbmVkIGl0ZW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2l6ZSkpOworICAgdm9pZCBaTElCX0lOVEVSTkFMIHpjZnJlZSAgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBwdHIpKTsKKyNlbmRpZgorCisjZGVmaW5lIFpBTExPQyhzdHJtLCBpdGVtcywgc2l6ZSkgXAorICAgICAgICAgICAoKigoc3RybSktPnphbGxvYykpKChzdHJtKS0+b3BhcXVlLCAoaXRlbXMpLCAoc2l6ZSkpCisjZGVmaW5lIFpGUkVFKHN0cm0sIGFkZHIpICAoKigoc3RybSktPnpmcmVlKSkoKHN0cm0pLT5vcGFxdWUsICh2b2lkcGYpKGFkZHIpKQorI2RlZmluZSBUUllfRlJFRShzLCBwKSB7aWYgKHApIFpGUkVFKHMsIHApO30KKworLyogUmV2ZXJzZSB0aGUgYnl0ZXMgaW4gYSAzMi1iaXQgdmFsdWUgKi8KKyNkZWZpbmUgWlNXQVAzMihxKSAoKCgocSkgPj4gMjQpICYgMHhmZikgKyAoKChxKSA+PiA4KSAmIDB4ZmYwMCkgKyBcCisgICAgICAgICAgICAgICAgICAgICgoKHEpICYgMHhmZjAwKSA8PCA4KSArICgoKHEpICYgMHhmZikgPDwgMjQpKQorCisjZW5kaWYgLyogWlVUSUxfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJtZW1vcnkvRHJNZW1vcnktV2luZG93cy1zZnguZXhlIGIvdG9vbHMvZHJtZW1vcnkvRHJNZW1vcnktV2luZG93cy1zZnguZXhlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZTNlNjYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9kcm1lbW9yeS9Eck1lbW9yeS1XaW5kb3dzLXNmeC5leGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJtZW1vcnkvUkVBRE1FIGIvdG9vbHMvZHJtZW1vcnkvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYjU0MTAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9kcm1lbW9yeS9SRUFETUUKQEAgLTAsMCArMSw4NiBAQAorCisjIERyLiBNZW1vcnkKKworRHIuIE1lbW9yeSAod3d3LmRybWVtb3J5Lm9yZykgaXMgYW4gb3Blbi1zb3VyY2UgZHluYW1pYyBtZW1vcnkKK21vbml0b3JpbmcgdG9vbCBmb3IgV2luZG93cywgTGludXgsIGFuZCBNYWMuCisKKyMjIEFib3V0IERyLiBNZW1vcnkKKworRHIuIE1lbW9yeSBvcGVyYXRlcyBvbiB1bm1vZGlmaWVkIGFwcGxpY2F0aW9uIGJpbmFyaWVzIHJ1bm5pbmcgb24KK1dpbmRvd3MsIExpbnV4LCBvciBNYWMgb24gY29tbW9kaXR5IHg4NiBhbmQgQVJNMzIgKGZvcnRoY29taW5nKSBoYXJkd2FyZS4KK0l0IGlzIGNhcGFibGUgb2YgaWRlbnRpZnlpbmcgbWVtb3J5LXJlbGF0ZWQgcHJvZ3JhbW1pbmcgZXJyb3JzIGluY2x1ZGluZzoKKyAgKiBhY2Nlc3NlcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeQorICAqIGFjY2Vzc2VzIHRvIHVuYWRkcmVzc2FibGUgbWVtb3J5IChoZWFwIHVuZGVyZmxvdyBhbmQgb3ZlcmZsb3cpCisgICogYWNjZXNzZXMgdG8gZnJlZWQgbWVtb3J5CisgICogZG91YmxlIGZyZWVzCisgICogbWVtb3J5IGxlYWtzCisgICogaGFuZGxlIGxlYWtzIChvbiBXaW5kb3dzKQorICAqIEdESSBBUEkgdXNhZ2UgZXJyb3JzIChvbiBXaW5kb3dzKQorICAqIGFjY2Vzc2VzIHRvIHVuLXJlc2VydmVkIHRocmVhZCBsb2NhbCBzdG9yYWdlIHNsb3RzIChvbiBXaW5kb3dzKQorCisjIyBVc2luZyBEci4gTWVtb3J5IChXaW5kb3dzIG9ubHkpCisKK0J1aWxkIHlvdXIgYXBwbGljYXRpb24gd2l0aCBkZWJ1ZyBpbmZvcm1hdGlvbiBhbmQgdGhlbiBydW4gaXQgdW5kZXIKK0RyLiBNZW1vcnkuICBFcnJvcnMgZm91bmQgYXJlIHByaW50ZWQgdG8gdGhlIHNjcmVlbiwgYW5kIGEgc3VtbWFyeSBpcworc2hvd24gYXQgdGhlIGVuZCBvZiB0aGUgcnVuLgorCisjIyMgT2J0YWluIERyLiBNZW1vcnkKKworVGhlIERyLiBNZW1vcnkgcGFja2FnZSBpcyBwcm92aWRlZCBhcyBhIHNlbGYtZXh0cmFjdGluZyBhcmNoaXZlCisoRHJNZW1vcnktV2luZG93cy1zZnguZXhlKSBpbiB0b29scy9kcm1lbW9yeSBkaXJlY3RvcnksIHdoaWNoIGNhbiBiZQorZXh0cmFjdGVkIGJ5IHJ1bm5pbmcgY29tbWFuZCAnRHJNZW1vcnktV2luZG93cy1zZnguZXhlIC1vdW5wYWNrZWQgLXknLgorCitUaGUgRHIuIE1lbW9yeSByZWxlYXNlIHBhY2thZ2UgY2FuIGJlIGRvd25sb2FkZWQgZnJvbQoraHR0cHM6Ly9naXRodWIuY29tL0R5bmFtb1JJTy9kcm1lbW9yeS93aWtpL0Rvd25sb2Fkcy4KKworTmlnaHRseSBidWlsZHMgY2FuIGJlIGRvd25sb2FkZWQgZnJvbQoraHR0cHM6Ly9idWlsZC5jaHJvbWl1bS5vcmcvcC9jbGllbnQuZHJtZW1vcnkvYnVpbGRzLy4KKworVGhlIERyLiBNZW1vcnkgc291cmNlIGNvZGUgY2FuIGJlIGZvdW5kIGF0CitodHRwczovL2dpdGh1Yi5jb20vRHluYW1vUklPL2RybWVtb3J5LgorCisjIyMgUnVuIHlvdXIgYXBwbGljYXRpb24gd2l0aCBEci4gTWVtb3J5CisKK1RvIHJ1biB5b3VyIGFwcGxpY2F0aW9uIHdpdGggRHIuIE1lbW9yeSwgc2ltcGx5IHB1dCAnZHJtZW1vcnkuZXhlIC0tJworYmVmb3JlIHRoZSBjb21tYW5kIHRoYXQgaW52b2tlcyB0aGUgYXBwbGljYXRpb24uCisKKyAgKiBSdW5uaW5nIHBkZml1bV91bml0dGVzdHMgd2l0aCBEci4gTWVtb3J5OgorICAgIHRvb2xzXGRybWVtb3J5XHVucGFjZWRcYmluXGRybWVtb3J5LmV4ZSAtLSBvdXRcRGVidWdccGRmaXVtX3VuaXR0ZXN0cy5leGUKKworICAqIFJ1bm5pbmcgcGRmaXVtX3Rlc3RzIHdpdGggRHIuIE1lbW9yeToKKyAgICB0b29sc1xkcm1lbW9yeVx1bnBhY2VkXGJpblxkcm1lbW9yeS5leGUgLS0gb3V0XERlYnVnXHBkZml1bV90ZXN0cy5leGUgLS1wbmcgWW91cklucHV0UERGLnBkZgorCisjIyMgUnVuIHRlc3Qgc3VpdGUgd2l0aCBEci4gTWVtb3J5CisKK0Egc2V0IG9mIHNjcmlwdHMgYXJlIHByb3ZpZGVkIHRvIHJ1biBQREZpdW0gdGVzdCBzdWl0ZSB3aXRoIERyLiBNZW1vcnkKK29uIGJ1aWxkYm90cywgd2hpY2ggY2FuIGFsc28gYmUgdXNlZCBmb3IgcnVubmluZyB0ZXN0IHN1aXRlIGxvY2FsbHkuCisKKyAgKiBSdW5uaW5nIHBkZml1bV91bml0dGVzdHMgd2l0aCBEci4gTWVtb3J5OgorICAgIHRvb2xzXGRybWVtb3J5XHNjcmlwdHNccGRmaXVtX3Rlc3RzLmJhdCAtdCBwZGZpdW1fdW5pdHRlc3RzCisKKyAgKiBSdW5uaW5nIHBpeGVsIHRlc3Qgc3VpdGUgd2l0aCBEci4gTWVtb3J5OgorICAgIHRvb2xzXGRybWVtb3J5XHNjcmlwdHNccGRmaXVtX3Rlc3RzLmJhdCAtdCBwZGZpdW1fcGl4ZWwKKworIyMgRG9jdW1lbnRhdGlvbgorCitDb21tYW5kICdkcm1lbW9yeS5leGUgLWhlbHAnIHByaW50cyBhIGxpc3Qgb2YgRHIuIE1lbW9yeSBydW50aW1lCitvcHRpb25zIHdpdGggc2hvcnQgZGVzY3JpcHRpb24uCisKK1RvIHZpZXcgdGhlIGZ1bGwgZG9jdW1lbnRpb24sIHBvaW50IHlvdXIgd2ViIGJyb3dzZXIgYXQKK2h0dHA6Ly9kcm1lbW9yeS5vcmcvZG9jcy8uCisKKworIyMgQ29udGFjdAorCitUaGlzIHByb2plY3QgaXMgcHJvdmlkZWQgYXMtaXMsIHdpdGggbm8gb2ZmaWNpYWwgc3VwcG9ydC4KK1VzZSB0aGUgRHIuIE1lbW9yeSBVc2VycyBncm91cCBhdAoraHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2RybWVtb3J5LXVzZXJzLyB0byBhc2sgcXVlc3Rpb25zIGFuZAorc2VlayBoZWxwIG9uIHVzaW5nIERyLiBNZW1vcnkuCisKK0RyLiBNZW1vcnkncyBzb3VyY2UgY29kZSBhbmQgaXNzdWUgdHJhY2tlciBsaXZlIGF0CitodHRwczovL2dpdGh1Yi5jb20vRHluYW1vUklPL2RybWVtb3J5CisKK0lmIHlvdSB3b3VsZCBsaWtlIHRvIHN1Ym1pdCBhIHBhdGNoLCB5b3Ugd2lsbCBuZWVkIHRvIGZpcnN0IHNpZ24gYQorQ29udHJpYnV0b3IgTGljZW5zZSBBZ3JlZW1lbnQuCitTZWUgaHR0cHM6Ly9naXRodWIuY29tL0R5bmFtb1JJTy9kcm1lbW9yeS93aWtpL0NvbnRyaWJ1dGluZyBmb3IgbW9yZQoraW5mb3JtYXRpb24uCmRpZmYgLS1naXQgYS90b29scy9kcm1lbW9yeS9zY3JpcHRzL2NvbW1vbi5weSBiL3Rvb2xzL2RybWVtb3J5L3NjcmlwdHMvY29tbW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMTYzZTMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9kcm1lbW9yeS9zY3JpcHRzL2NvbW1vbi5weQpAQCAtMCwwICsxLDI1MiBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKyMgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBwbGF0Zm9ybQoraW1wb3J0IG9zCitpbXBvcnQgc2lnbmFsCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKKworCitjbGFzcyBOb3RJbXBsZW1lbnRlZEVycm9yKEV4Y2VwdGlvbik6CisgIHBhc3MKKworCitjbGFzcyBUaW1lb3V0RXJyb3IoRXhjZXB0aW9uKToKKyAgcGFzcworCisKK2RlZiBSdW5TdWJwcm9jZXNzSW5CYWNrZ3JvdW5kKHByb2MpOgorICAiIiJSdW5zIGEgc3VicHJvY2VzcyBpbiB0aGUgYmFja2dyb3VuZC4gUmV0dXJucyBhIGhhbmRsZSB0byB0aGUgcHJvY2Vzcy4iIiIKKyAgbG9nZ2luZy5pbmZvKCJydW5uaW5nICVzIGluIHRoZSBiYWNrZ3JvdW5kIiAlICIgIi5qb2luKHByb2MpKQorICByZXR1cm4gc3VicHJvY2Vzcy5Qb3Blbihwcm9jKQorCisKK2RlZiBSdW5TdWJwcm9jZXNzKHByb2MsIHRpbWVvdXQ9MCk6CisgICIiIiBSdW5zIGEgc3VicHJvY2VzcywgdW50aWwgaXQgZmluaXNoZXMgb3IgfHRpbWVvdXR8IGlzIGV4Y2VlZGVkIGFuZCB0aGUKKyAgcHJvY2VzcyBpcyBraWxsZWQgd2l0aCB0YXNra2lsbC4gIEEgfHRpbWVvdXR8IDw9IDAgIG1lYW5zIG5vIHRpbWVvdXQuCisKKyAgQXJnczoKKyAgICBwcm9jOiBsaXN0IG9mIHByb2Nlc3MgY29tcG9uZW50cyAoZXhlICsgYXJncykKKyAgICB0aW1lb3V0OiBob3cgbG9uZyB0byB3YWl0IGJlZm9yZSBraWxsaW5nLCA8PSAwIG1lYW5zIHdhaXQgZm9yZXZlcgorICAiIiIKKworICBsb2dnaW5nLmluZm8oInJ1bm5pbmcgJXMsIHRpbWVvdXQgJWQgc2VjIiAlICgiICIuam9pbihwcm9jKSwgdGltZW91dCkpCisgIHN5cy5zdGRvdXQuZmx1c2goKQorICBzeXMuc3RkZXJyLmZsdXNoKCkKKworICAjIE1hbnVhbGx5IHJlYWQgYW5kIHByaW50IG91dCBzdGRvdXQgYW5kIHN0ZGVyci4KKyAgIyBCeSBkZWZhdWx0LCB0aGUgc3VicHJvY2VzcyBpcyBzdXBwb3NlZCB0byBpbmhlcml0IHRoZXNlIGZyb20gaXRzIHBhcmVudCwKKyAgIyBob3dldmVyIHdoZW4gcnVuIHVuZGVyIGJ1aWxkYm90LCBpdCBzZWVtcyB1bmFibGUgdG8gcmVhZCBkYXRhIGZyb20gYQorICAjIGdyYW5kY2hpbGQgcHJvY2Vzcywgc28gd2UgaGF2ZSB0byByZWFkIHRoZSBjaGlsZCBhbmQgcHJpbnQgdGhlIGRhdGEgYXMgaWYKKyAgIyBpdCBjYW1lIGZyb20gdXMgZm9yIGJ1aWxkYm90IHRvIHJlYWQgaXQuICBXZSdyZSBub3Qgc3VyZSB3aHkgdGhpcyBpcworICAjIG5lY2Vzc2FyeS4KKyAgIyBUT0RPKGVyaWtrYXkpOiBzaG91bGQgd2UgYnVmZmVyIHN0ZGVyciBhbmQgc3Rkb3V0IHNlcGFyYXRlbHk/CisgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKHByb2MsIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplPTAsICAjIHVuYnVmZmVyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQorCisgIGxvZ2dpbmcuaW5mbygic3RhcnRlZCBzdWJwcm9jZXNzIikKKworICBkaWRfdGltZW91dCA9IEZhbHNlCisgIGlmIHRpbWVvdXQgPiAwOgorICAgIHdhaXRfdW50aWwgPSB0aW1lLnRpbWUoKSArIHRpbWVvdXQKKyAgd2hpbGUgcC5wb2xsKCkgaXMgTm9uZSBhbmQgbm90IGRpZF90aW1lb3V0OgorICAgICMgSGF2ZSB0byB1c2UgcmVhZGxpbmUgcmF0aGVyIHRoYW4gcmVhZGxpbmVzKCkgb3IgImZvciBsaW5lIGluIHAuc3Rkb3V0OiIsCisgICAgIyBvdGhlcndpc2Ugd2UgZ2V0IGJ1ZmZlcmVkIGV2ZW4gd2l0aCBidWZzaXplPTAuCisgICAgbGluZSA9IHAuc3Rkb3V0LnJlYWRsaW5lKCkKKyAgICB3aGlsZSBsaW5lIGFuZCBub3QgZGlkX3RpbWVvdXQ6CisgICAgICBzeXMuc3Rkb3V0LndyaXRlKGxpbmUpCisgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICAgIGxpbmUgPSBwLnN0ZG91dC5yZWFkbGluZSgpCisgICAgICBpZiB0aW1lb3V0ID4gMDoKKyAgICAgICAgZGlkX3RpbWVvdXQgPSB0aW1lLnRpbWUoKSA+IHdhaXRfdW50aWwKKworICBpZiBkaWRfdGltZW91dDoKKyAgICBsb2dnaW5nLmluZm8oInByb2Nlc3MgdGltZWQgb3V0IikKKyAgZWxzZToKKyAgICBsb2dnaW5nLmluZm8oInByb2Nlc3MgZW5kZWQsIGRpZCBub3QgdGltZSBvdXQiKQorCisgIGlmIGRpZF90aW1lb3V0OgorICAgIGlmIElzV2luZG93cygpOgorICAgICAgc3VicHJvY2Vzcy5jYWxsKFsidGFza2tpbGwiLCAiL1QiLCAiL0YiLCAiL1BJRCIsIHN0cihwLnBpZCldKQorICAgIGVsc2U6CisgICAgICAjIERvZXMgdGhpcyBraWxsIGFsbCBjaGlsZHJlbiwgdG9vPworICAgICAgb3Mua2lsbChwLnBpZCwgc2lnbmFsLlNJR0lOVCkKKyAgICBsb2dnaW5nLmVycm9yKCJLSUxMRUQgJWQiICUgcC5waWQpCisgICAgIyBHaXZlIHRoZSBwcm9jZXNzIGEgY2hhbmNlIHRvIGFjdHVhbGx5IGRpZSBiZWZvcmUgY29udGludWluZworICAgICMgc28gdGhhdCBjbGVhbnVwIGNhbiBoYXBwZW4gc2FmZWx5LgorICAgIHRpbWUuc2xlZXAoMS4wKQorICAgIGxvZ2dpbmcuZXJyb3IoIlRJTUVPVVQgd2FpdGluZyBmb3IgJXMiICUgcHJvY1swXSkKKyAgICByYWlzZSBUaW1lb3V0RXJyb3IocHJvY1swXSkKKyAgZWxzZToKKyAgICBmb3IgbGluZSBpbiBwLnN0ZG91dDoKKyAgICAgIHN5cy5zdGRvdXQud3JpdGUobGluZSkKKyAgICBpZiBub3QgSXNNYWMoKTogICAjIHN0ZG91dCBmbHVzaCBmYWlscyBvbiBNYWMKKyAgICAgIGxvZ2dpbmcuaW5mbygiZmx1c2hpbmcgc3Rkb3V0IikKKyAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorCisgIGxvZ2dpbmcuaW5mbygiY29sbGVjdGluZyByZXN1bHQgY29kZSIpCisgIHJlc3VsdCA9IHAucG9sbCgpCisgIGlmIHJlc3VsdDoKKyAgICBsb2dnaW5nLmVycm9yKCIlcyBleGl0ZWQgd2l0aCBub24temVybyByZXN1bHQgY29kZSAlZCIgJSAocHJvY1swXSwgcmVzdWx0KSkKKyAgcmV0dXJuIHJlc3VsdAorCisKK2RlZiBJc0xpbnV4KCk6CisgIHJldHVybiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnbGludXgnKQorCisKK2RlZiBJc01hYygpOgorICByZXR1cm4gc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2RhcndpbicpCisKKworZGVmIElzV2luZG93cygpOgorICByZXR1cm4gc3lzLnBsYXRmb3JtID09ICdjeWd3aW4nIG9yIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCd3aW4nKQorCisKK2RlZiBXaW5kb3dzVmVyc2lvbk5hbWUoKToKKyAgIiIiUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgV2luZG93cyB2ZXJzaW9uIGlmIGl0IGlzIGtub3duLCBvciBOb25lLgorCisgIFBvc3NpYmxlIHJldHVybiB2YWx1ZXMgYXJlOiB4cCwgdmlzdGEsIDcsIDgsIG9yIE5vbmUKKyAgIiIiCisgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnY3lnd2luJzoKKyAgICAjIFdpbmRvd3MgdmVyc2lvbiBudW1iZXIgaXMgaGlkaW5nIGluIHN5c3RlbSBuYW1lLiAgTG9va3MgbGlrZToKKyAgICAjIENZR1dJTl9OVC02LjEtV09XNjQKKyAgICB0cnk6CisgICAgICB2ZXJzaW9uX3N0ciA9IHBsYXRmb3JtLnVuYW1lKClbMF0uc3BsaXQoJy0nKVsxXQorICAgIGV4Y2VwdDoKKyAgICAgIHJldHVybiBOb25lCisgIGVsaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ3dpbicpOgorICAgICMgTm9ybWFsIFdpbmRvd3MgdmVyc2lvbiBzdHJpbmcuICBNaW5lOiA2LjEuNzYwMQorICAgIHZlcnNpb25fc3RyID0gcGxhdGZvcm0udmVyc2lvbigpCisgIGVsc2U6CisgICAgcmV0dXJuIE5vbmUKKworICBwYXJ0cyA9IHZlcnNpb25fc3RyLnNwbGl0KCcuJykKKyAgdHJ5OgorICAgIG1ham9yID0gaW50KHBhcnRzWzBdKQorICAgIG1pbm9yID0gaW50KHBhcnRzWzFdKQorICBleGNlcHQ6CisgICAgcmV0dXJuIE5vbmUgICMgQ2FuJ3QgcGFyc2UsIHVua25vd24gdmVyc2lvbi4KKworICBpZiBtYWpvciA9PSA1OgorICAgIHJldHVybiAneHAnCisgIGVsaWYgbWFqb3IgPT0gNiBhbmQgbWlub3IgPT0gMDoKKyAgICByZXR1cm4gJ3Zpc3RhJworICBlbGlmIG1ham9yID09IDYgYW5kIG1pbm9yID09IDE6CisgICAgcmV0dXJuICc3JworICBlbGlmIG1ham9yID09IDYgYW5kIG1pbm9yID09IDI6CisgICAgcmV0dXJuICc4JyAgIyBGdXR1cmUgcHJvb2YuICA7KQorICByZXR1cm4gTm9uZQorCisKK2RlZiBQbGF0Zm9ybU5hbWVzKCk6CisgICIiIlJldHVybiBhbiBhcnJheSBvZiBzdHJpbmcgdG8gYmUgdXNlZCBpbiBwYXRocyBmb3IgdGhlIHBsYXRmb3JtCisgIChlLmcuIHN1cHByZXNzaW9ucywgZ3Rlc3QgZmlsdGVycywgaWdub3JlIGZpbGVzIGV0Yy4pCisgIFRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBhcnJheSBkZXNjcmliZXMgdGhlICdtYWluJyBwbGF0Zm9ybQorICAiIiIKKyAgaWYgSXNMaW51eCgpOgorICAgIHJldHVybiBbJ2xpbnV4J10KKyAgaWYgSXNNYWMoKToKKyAgICByZXR1cm4gWydtYWMnXQorICBpZiBJc1dpbmRvd3MoKToKKyAgICBuYW1lcyA9IFsnd2luMzInXQorICAgIHZlcnNpb25fbmFtZSA9IFdpbmRvd3NWZXJzaW9uTmFtZSgpCisgICAgaWYgdmVyc2lvbl9uYW1lIGlzIG5vdCBOb25lOgorICAgICAgbmFtZXMuYXBwZW5kKCd3aW4tJXMnICUgdmVyc2lvbl9uYW1lKQorICAgIHJldHVybiBuYW1lcworICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdVbmtub3duIHBsYXRmb3JtICIlcyIuJyAlIHN5cy5wbGF0Zm9ybSkKKworCitkZWYgUHV0RW52QW5kTG9nKGVudl9uYW1lLCBlbnZfdmFsdWUpOgorICBvcy5wdXRlbnYoZW52X25hbWUsIGVudl92YWx1ZSkKKyAgbG9nZ2luZy5pbmZvKCdleHBvcnQgJXM9JXMnLCBlbnZfbmFtZSwgZW52X3ZhbHVlKQorCitkZWYgQm9yaW5nQ2FsbGVycyhtYW5nbGVkLCB1c2VfcmVfd2lsZGNhcmRzKToKKyAgIiIiUmV0dXJuIGEgbGlzdCBvZiAnYm9yaW5nJyBmdW5jdGlvbiBuYW1lcyAob3B0aW5hbGx5IG1hbmdsZWQpCisgIHdpdGggKi8/IHdpbGRjYXJkcyAob3B0aW9uYWxseSAuKi8uKS4KKyAgQm9yaW5nID0gd2UgZHJvcCBvZmYgdGhlIGJvdHRvbSBvZiBzdGFjayB0cmFjZXMgYmVsb3cgc3VjaCBmdW5jdGlvbnMuCisgICIiIgorCisgIG5lZWRfbWFuZ2xpbmcgPSBbCisgICAgIyBEb24ndCBzaG93IG91ciB0ZXN0aW5nIGZyYW1ld29yazoKKyAgICAoInRlc3Rpbmc6OlRlc3Q6OlJ1biIsICAgICAiX1pON3Rlc3Rpbmc0VGVzdDNSdW5FdiIpLAorICAgICgidGVzdGluZzo6VGVzdEluZm86OlJ1biIsICJfWk43dGVzdGluZzhUZXN0SW5mbzNSdW5FdiIpLAorICAgICgidGVzdGluZzo6aW50ZXJuYWw6OkhhbmRsZSpFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCoiLAorICAgICAiX1pON3Rlc3Rpbmc4aW50ZXJuYWwzP0hhbmRsZSpFeGNlcHRpb25zSW5NZXRob2RJZlN1cHBvcnRlZCoiKSwKKworICAgICMgRGVwZW5kIG9uIHNjaGVkdWxpbmc6CisgICAgKCJNZXNzYWdlTG9vcDo6UnVuIiwgICAgICJfWk4xMU1lc3NhZ2VMb29wM1J1bkV2IiksCisgICAgKCJNZXNzYWdlTG9vcDo6UnVuVGFzayIsICJfWk4xMU1lc3NhZ2VMb29wN1J1blRhc2sqIiksCisgICAgKCJSdW5uYWJsZU1ldGhvZCoiLCAgICAgICJfWk4xNFJ1bm5hYmxlTWV0aG9kKiIpLAorICAgICgiRGlzcGF0Y2hUb01ldGhvZCoiLCAgICAiX1oqMTZEaXNwYXRjaFRvTWV0aG9kKiIpLAorICAgICgiYmFzZTo6aW50ZXJuYWw6Okludm9rZXIqOjpEb0ludm9rZSoiLAorICAgICAiX1pONGJhc2U4aW50ZXJuYWw4SW52b2tlcipEb0ludm9rZSoiKSwgICMgSW52b2tlcnsxLDIsM30KKyAgICAoImJhc2U6OmludGVybmFsOjpSdW5uYWJsZUFkYXB0ZXIqOjpSdW4qIiwKKyAgICAgIl9aTjRiYXNlOGludGVybmFsMTVSdW5uYWJsZUFkYXB0ZXIqUnVuKiIpLAorICBdCisKKyAgcmV0ID0gW10KKyAgZm9yIHBhaXIgaW4gbmVlZF9tYW5nbGluZzoKKyAgICByZXQuYXBwZW5kKHBhaXJbMSBpZiBtYW5nbGVkIGVsc2UgMF0pCisKKyAgcmV0ICs9IFsKKyAgICAjIEFsc28gZG9uJ3Qgc2hvdyB0aGUgaW50ZXJuYWxzIG9mIGxpYmMvcHRocmVhZC4KKyAgICAic3RhcnRfdGhyZWFkIiwKKyAgICAibWFpbiIsCisgICAgIkJhc2VUaHJlYWRJbml0VGh1bmsiLAorICBdCisKKyAgaWYgdXNlX3JlX3dpbGRjYXJkczoKKyAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4ocmV0KSk6CisgICAgICByZXRbaV0gPSByZXRbaV0ucmVwbGFjZSgnKicsICcuKicpLnJlcGxhY2UoJz8nLCAnLicpCisKKyAgcmV0dXJuIHJldAorCitkZWYgTm9ybWFsaXplV2luZG93c1BhdGgocGF0aCk6CisgICIiIklmIHdlJ3JlIHVzaW5nIEN5Z3dpbiBQeXRob24sIHR1cm4gdGhlIHBhdGggaW50byBhIFdpbmRvd3MgcGF0aC4KKworICBEb24ndCB0dXJuIGZvcndhcmQgc2xhc2hlcyBpbnRvIGJhY2tzbGFzaGVzIGZvciBlYXNpZXIgY29weS1wYXN0aW5nIGFuZAorICBlc2NhcGluZy4KKworICBUT0RPKHJuayk6IElmIHdlIGV2ZXIgd2FudCB0byBjdXQgb3V0IHRoZSBzdWJwcm9jZXNzIGludm9jYXRpb24sIHdlIGNhbiB1c2UKKyAgX3dpbnJlZyB0byBnZXQgdGhlIHJvb3QgQ3lnd2luIGRpcmVjdG9yeSBmcm9tIHRoZSByZWdpc3RyeSBrZXk6CisgIEhLRVlfTE9DQUxfTUFDSElORVxTT0ZUV0FSRVxDeWd3aW5cc2V0dXBccm9vdGRpci4KKyAgIiIiCisgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJjeWd3aW4iKToKKyAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihbImN5Z3BhdGgiLCAiLW0iLCBwYXRoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgKG91dCwgZXJyKSA9IHAuY29tbXVuaWNhdGUoKQorICAgIGlmIGVycjoKKyAgICAgIGxvZ2dpbmcud2FybmluZygiV0FSTklORzogY3lncGF0aCBlcnJvcjogJXMiLCBlcnIpCisgICAgcmV0dXJuIG91dC5zdHJpcCgpCisgIGVsc2U6CisgICAgcmV0dXJuIHBhdGgKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb21tb24gb3V0cHV0IGZvcm1hdCBjb2RlCisKK2RlZiBQcmludFVzZWRTdXBwcmVzc2lvbnNMaXN0KHN1cHBjb3VudHMpOgorICAiIiIgUHJpbnRzIG91dCB0aGUgbGlzdCBvZiB1c2VkIHN1cHByZXNzaW9ucyBpbiBhIGZvcm1hdCBjb21tb24gdG8gYWxsIHRoZQorICAgICAgbWVtb3J5IHRvb2xzLiBJZiB0aGUgbGlzdCBpcyBlbXB0eSwgcHJpbnRzIG5vdGhpbmcgYW5kIHJldHVybnMgRmFsc2UsCisgICAgICBvdGhlcndpc2UgVHJ1ZS4KKworICAgICAgc3VwcGNvdW50czogYSBkaWN0aW9uYXJ5IG9mIHVzZWQgc3VwcHJlc3Npb24gY291bnRzLAorICAgICAgICAgICAgICAgICAgS2V5IC0+IG5hbWUsIFZhbHVlIC0+IGNvdW50LgorICAiIiIKKyAgaWYgbm90IHN1cHBjb3VudHM6CisgICAgcmV0dXJuIEZhbHNlCisKKyAgcHJpbnQgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICBwcmludCAiU3VwcHJlc3Npb25zIHVzZWQ6IgorICBwcmludCAiICBjb3VudCBuYW1lIgorICBmb3IgKG5hbWUsIGNvdW50KSBpbiBzb3J0ZWQoc3VwcGNvdW50cy5pdGVtcygpLCBrZXk9bGFtYmRhIChrLHYpOiAodixrKSk6CisgICAgcHJpbnQgIiU3ZCAlcyIgJSAoY291bnQsIG5hbWUpCisgIHByaW50ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyAgc3lzLnN0ZG91dC5mbHVzaCgpCisgIHJldHVybiBUcnVlCmRpZmYgLS1naXQgYS90b29scy9kcm1lbW9yeS9zY3JpcHRzL2RybWVtb3J5X2FuYWx5emUucHkgYi90b29scy9kcm1lbW9yeS9zY3JpcHRzL2RybWVtb3J5X2FuYWx5emUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlmYzBlZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2RybWVtb3J5L3NjcmlwdHMvZHJtZW1vcnlfYW5hbHl6ZS5weQpAQCAtMCwwICsxLDIwMiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjIGRybWVtb3J5X2FuYWx5emUucHkKKworJycnIEdpdmVuIGEgRHIuIE1lbW9yeSBvdXRwdXQgZmlsZSwgcGFyc2VzIGVycm9ycyBhbmQgdW5pcXVlcyB0aGVtLicnJworCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZWZhdWx0ZGljdAoraW1wb3J0IGNvbW1vbgoraW1wb3J0IGhhc2hsaWIKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3B0cGFyc2UKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKKworY2xhc3MgRHJNZW1vcnlFcnJvcjoKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHJlcG9ydCwgc3VwcHJlc3Npb24sIHRlc3RjYXNlKToKKyAgICBzZWxmLl9yZXBvcnQgPSByZXBvcnQKKyAgICBzZWxmLl90ZXN0Y2FzZSA9IHRlc3RjYXNlCisKKyAgICAjIENocm9taXVtLXNwZWNpZmljIHRyYW5zZm9ybWF0aW9ucyBvZiB0aGUgc3VwcHJlc3Npb25zOgorICAgICMgUmVwbGFjZSAnYW55X3Rlc3QuZXhlJyBhbmQgJ2Nocm9tZS5kbGwnIHdpdGggJyonLCB0aGVuIHJlbW92ZSB0aGUKKyAgICAjIERyLk1lbW9yeS1nZW5lcmF0ZWQgZXJyb3IgaWRzIGZyb20gdGhlIG5hbWU9IGxpbmVzIGFzIHRoZXkgZG9uJ3QKKyAgICAjIG1ha2Ugc2Vuc2UgaW4gYSBtdWx0aXByb2Nlc3MgcmVwb3J0LgorICAgIHN1cHBfbGluZXMgPSBzdXBwcmVzc2lvbi5zcGxpdCgiXG4iKQorICAgIGZvciBsIGluIHhyYW5nZShsZW4oc3VwcF9saW5lcykpOgorICAgICAgaWYgc3VwcF9saW5lc1tsXS5zdGFydHN3aXRoKCJuYW1lPSIpOgorICAgICAgICBzdXBwX2xpbmVzW2xdID0gIm5hbWU9PGluc2VydF9hX3N1cHByZXNzaW9uX25hbWVfaGVyZT4iCisgICAgICBpZiBzdXBwX2xpbmVzW2xdLnN0YXJ0c3dpdGgoImNocm9tZS5kbGwhIik6CisgICAgICAgIHN1cHBfbGluZXNbbF0gPSBzdXBwX2xpbmVzW2xdLnJlcGxhY2UoImNocm9tZS5kbGwhIiwgIiohIikKKyAgICAgIGJhbmdfaW5kZXggPSBzdXBwX2xpbmVzW2xdLmZpbmQoIiEiKQorICAgICAgZF9leGVfaW5kZXggPSBzdXBwX2xpbmVzW2xdLmZpbmQoIi5leGUhIikKKyAgICAgIGlmIGJhbmdfaW5kZXggPj0gNCBhbmQgZF9leGVfaW5kZXggKyA0ID09IGJhbmdfaW5kZXg6CisgICAgICAgIHN1cHBfbGluZXNbbF0gPSAiKiIgKyBzdXBwX2xpbmVzW2xdW2JhbmdfaW5kZXg6XQorICAgIHNlbGYuX3N1cHByZXNzaW9uID0gIlxuIi5qb2luKHN1cHBfbGluZXMpCisKKyAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgb3V0cHV0ID0gIiIKKyAgICBvdXRwdXQgKz0gIiMjIyBCRUdJTiBNRU1PUlkgVE9PTCBSRVBPUlQgKGVycm9yIGhhc2g9IyUwMTZYIylcbiIgJSBcCisgICAgICAgIHNlbGYuRXJyb3JIYXNoKCkKKyAgICBvdXRwdXQgKz0gc2VsZi5fcmVwb3J0ICsgIlxuIgorICAgIGlmIHNlbGYuX3Rlc3RjYXNlOgorICAgICAgb3V0cHV0ICs9ICJUaGUgcmVwb3J0IGNhbWUgZnJvbSB0aGUgYCVzYCB0ZXN0LlxuIiAlIHNlbGYuX3Rlc3RjYXNlCisgICAgb3V0cHV0ICs9ICJTdXBwcmVzc2lvbiAoZXJyb3IgaGFzaD0jJTAxNlgjKTpcbiIgJSBzZWxmLkVycm9ySGFzaCgpCisgICAgb3V0cHV0ICs9ICgiICBGb3IgbW9yZSBpbmZvIG9uIHVzaW5nIHN1cHByZXNzaW9ucyBzZWUgIgorICAgICAgICAiaHR0cDovL2Rldi5jaHJvbWl1bS5vcmcvZGV2ZWxvcGVycy9ob3ctdG9zL3VzaW5nLWRybWVtb3J5I1RPQy1TdXBwcmVzc2luZy1lcnJvci1yZXBvcnRzLWZyb20tdGhlLVxuIikKKyAgICBvdXRwdXQgKz0gIntcbiVzXG59XG4iICUgc2VsZi5fc3VwcHJlc3Npb24KKyAgICBvdXRwdXQgKz0gIiMjIyBFTkQgTUVNT1JZIFRPT0wgUkVQT1JUIChlcnJvciBoYXNoPSMlMDE2WCMpXG4iICUgXAorICAgICAgICBzZWxmLkVycm9ySGFzaCgpCisgICAgcmV0dXJuIG91dHB1dAorCisgICMgVGhpcyBpcyBhIGRldmljZS1pbmRlcGVuZGVudCBoYXNoIGlkZW50aWZ5aW5nIHRoZSBzdXBwcmVzc2lvbi4KKyAgIyBCeSBwcmludGluZyBvdXQgdGhpcyBoYXNoIHdlIGNhbiBmaW5kIGR1cGxpY2F0ZSByZXBvcnRzIGJldHdlZW4gdGVzdHMgYW5kCisgICMgZGlmZmVyZW50IHNoYXJkcyBydW5uaW5nIG9uIG11bHRpcGxlIGJ1aWxkYm90cworICBkZWYgRXJyb3JIYXNoKHNlbGYpOgorICAgIHJldHVybiBpbnQoaGFzaGxpYi5tZDUoc2VsZi5fc3VwcHJlc3Npb24pLmhleGRpZ2VzdCgpWzoxNl0sIDE2KQorCisgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICByZXR1cm4gaGFzaChzZWxmLl9zdXBwcmVzc2lvbikKKworICBkZWYgX19lcV9fKHNlbGYsIHJocyk6CisgICAgcmV0dXJuIHNlbGYuX3N1cHByZXNzaW9uID09IHJocworCisKK2NsYXNzIERyTWVtb3J5QW5hbHl6ZXI6CisgICcnJyBHaXZlbiBhIHNldCBvZiBEci5NZW1vcnkgb3V0cHV0IGZpbGVzLCBwYXJzZSBhbGwgdGhlIGVycm9ycyBvdXQgb2YKKyAgdGhlbSwgdW5pcXVlIHRoZW0gYW5kIG91dHB1dCB0aGUgcmVzdWx0cy4nJycKKworICBkZWYgX19pbml0X18oc2VsZik6CisgICAgc2VsZi5rbm93bl9lcnJvcnMgPSBzZXQoKQorICAgIHNlbGYuZXJyb3JfY291bnQgPSAwOworCisgIGRlZiBSZWFkTGluZShzZWxmKToKKyAgICBzZWxmLmxpbmVfID0gc2VsZi5jdXJfZmRfLnJlYWRsaW5lKCkKKworICBkZWYgUmVhZFNlY3Rpb24oc2VsZik6CisgICAgcmVzdWx0ID0gW3NlbGYubGluZV9dCisgICAgc2VsZi5SZWFkTGluZSgpCisgICAgd2hpbGUgbGVuKHNlbGYubGluZV8uc3RyaXAoKSkgPiAwOgorICAgICAgcmVzdWx0LmFwcGVuZChzZWxmLmxpbmVfKQorICAgICAgc2VsZi5SZWFkTGluZSgpCisgICAgcmV0dXJuIHJlc3VsdAorCisgIGRlZiBQYXJzZVJlcG9ydEZpbGUoc2VsZiwgZmlsZW5hbWUsIHRlc3RjYXNlKToKKyAgICByZXQgPSBbXQorCisgICAgIyBGaXJzdCwgcmVhZCB0aGUgZ2VuZXJhdGVkIHN1cHByZXNzaW9ucyBmaWxlIHNvIHdlIGNhbiBlYXNpbHkgbG9va3VwIGEKKyAgICAjIHN1cHByZXNzaW9uIGZvciBhIGdpdmVuIGVycm9yLgorICAgIHN1cHBfZmQgPSBvcGVuKGZpbGVuYW1lLnJlcGxhY2UoInJlc3VsdHMiLCAic3VwcHJlc3MiKSwgJ3InKQorICAgIGdlbmVyYXRlZF9zdXBwcmVzc2lvbnMgPSB7fSAgIyBLZXkgLT4gRXJyb3IgIywgVmFsdWUgLT4gU3VwcHJlc3Npb24gdGV4dC4KKyAgICBmb3IgbGluZSBpbiBzdXBwX2ZkOgorICAgICAgIyBOT1RFOiB0aGlzIHJlZ2V4cCBsb29rcyBmcmFnaWxlLiBNaWdodCBicmVhayBpZiB0aGUgZ2VuZXJhdGVkCisgICAgICAjIHN1cHByZXNzaW9uIGZvcm1hdCBzbGlnaHRseSBjaGFuZ2VzLgorICAgICAgbSA9IHJlLnNlYXJjaCgiIyBTdXBwcmVzc2lvbiBmb3IgRXJyb3IgIyhbMC05XSspIiwgbGluZS5zdHJpcCgpKQorICAgICAgaWYgbm90IG06CisgICAgICAgIGNvbnRpbnVlCisgICAgICBlcnJvcl9pZCA9IGludChtLmdyb3VwcygpWzBdKQorICAgICAgYXNzZXJ0IGVycm9yX2lkIG5vdCBpbiBnZW5lcmF0ZWRfc3VwcHJlc3Npb25zCisgICAgICAjIE9LLCBub3cgcmVhZCB0aGUgbmV4dCBzdXBwcmVzc2lvbjoKKyAgICAgIGN1cl9zdXBwID0gIiIKKyAgICAgIGZvciBzdXBwX2xpbmUgaW4gc3VwcF9mZDoKKyAgICAgICAgaWYgc3VwcF9saW5lLnN0YXJ0c3dpdGgoIiMiKSBvciBzdXBwX2xpbmUuc3RyaXAoKSA9PSAiIjoKKyAgICAgICAgICBicmVhaworICAgICAgICBjdXJfc3VwcCArPSBzdXBwX2xpbmUKKyAgICAgIGdlbmVyYXRlZF9zdXBwcmVzc2lvbnNbZXJyb3JfaWRdID0gY3VyX3N1cHAuc3RyaXAoKQorICAgIHN1cHBfZmQuY2xvc2UoKQorCisgICAgc2VsZi5jdXJfZmRfID0gb3BlbihmaWxlbmFtZSwgJ3InKQorICAgIHdoaWxlIFRydWU6CisgICAgICBzZWxmLlJlYWRMaW5lKCkKKyAgICAgIGlmIChzZWxmLmxpbmVfID09ICcnKTogYnJlYWsKKworICAgICAgbWF0Y2ggPSByZS5zZWFyY2goIl5FcnJvciAjKFswLTldKyk6ICguKikiLCBzZWxmLmxpbmVfKQorICAgICAgaWYgbWF0Y2g6CisgICAgICAgIGVycm9yX2lkID0gaW50KG1hdGNoLmdyb3VwcygpWzBdKQorICAgICAgICBzZWxmLmxpbmVfID0gbWF0Y2guZ3JvdXBzKClbMV0uc3RyaXAoKSArICJcbiIKKyAgICAgICAgcmVwb3J0ID0gIiIuam9pbihzZWxmLlJlYWRTZWN0aW9uKCkpLnN0cmlwKCkKKyAgICAgICAgc3VwcHJlc3Npb24gPSBnZW5lcmF0ZWRfc3VwcHJlc3Npb25zW2Vycm9yX2lkXQorICAgICAgICByZXQuYXBwZW5kKERyTWVtb3J5RXJyb3IocmVwb3J0LCBzdXBwcmVzc2lvbiwgdGVzdGNhc2UpKQorCisgICAgICBpZiByZS5zZWFyY2goIlNVUFBSRVNTSU9OUyBVU0VEOiIsIHNlbGYubGluZV8pOgorICAgICAgICBzZWxmLlJlYWRMaW5lKCkKKyAgICAgICAgd2hpbGUgc2VsZi5saW5lXy5zdHJpcCgpICE9ICIiOgorICAgICAgICAgIGxpbmUgPSBzZWxmLmxpbmVfLnN0cmlwKCkKKyAgICAgICAgICAoY291bnQsIG5hbWUpID0gcmUubWF0Y2goIiAqKFswLTlcP10rKXgoPzogXCguKj9cKSk/OiAoLiopIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSkuZ3JvdXBzKCkKKyAgICAgICAgICBpZiAoY291bnQgPT0gIj8iKToKKyAgICAgICAgICAgICMgV2hvbGUtbW9kdWxlIGhhdmUgbm8gY291bnQgYXZhaWxhYmxlOiBhc3N1bWUgMQorICAgICAgICAgICAgY291bnQgPSAxCisgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvdW50ID0gaW50KGNvdW50KQorICAgICAgICAgIHNlbGYudXNlZF9zdXBwcmVzc2lvbnNbbmFtZV0gKz0gY291bnQKKyAgICAgICAgICBzZWxmLlJlYWRMaW5lKCkKKworICAgICAgaWYgc2VsZi5saW5lXy5zdGFydHN3aXRoKCJBU1NFUlQgRkFJTFVSRSIpOgorICAgICAgICByZXQuYXBwZW5kKHNlbGYubGluZV8uc3RyaXAoKSkKKworICAgIHNlbGYuY3VyX2ZkXy5jbG9zZSgpCisgICAgcmV0dXJuIHJldAorCisgIGRlZiBSZXBvcnQoc2VsZiwgZmlsZW5hbWVzLCB0ZXN0Y2FzZSwgY2hlY2tfc2FuaXR5KToKKyAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICAjIFRPRE8odGltdXJycnIpOiBzdXBwb3J0IHBvc2l0aXZlIHRlc3RzIC8gY2hlY2tfc2FuaXR5PT1UcnVlCisgICAgc2VsZi51c2VkX3N1cHByZXNzaW9ucyA9IGRlZmF1bHRkaWN0KGludCkKKworICAgIHRvX3JlcG9ydCA9IFtdCisgICAgcmVwb3J0c19mb3JfdGhpc190ZXN0ID0gc2V0KCkKKyAgICBmb3IgZiBpbiBmaWxlbmFtZXM6CisgICAgICBjdXJfcmVwb3J0cyA9IHNlbGYuUGFyc2VSZXBvcnRGaWxlKGYsIHRlc3RjYXNlKQorCisgICAgICAjIEZpbHRlciBvdXQgdGhlIHJlcG9ydHMgdGhhdCB3ZXJlIHRoZXJlIGluIHByZXZpb3VzIHRlc3RzLgorICAgICAgZm9yIHIgaW4gY3VyX3JlcG9ydHM6CisgICAgICAgIGlmIHIgaW4gcmVwb3J0c19mb3JfdGhpc190ZXN0OgorICAgICAgICAgICMgQSBzaW1pbGFyIHJlcG9ydCBpcyBhYm91dCB0byBiZSBwcmludGVkIGZvciB0aGlzIHRlc3QuCisgICAgICAgICAgcGFzcworICAgICAgICBlbGlmIHIgaW4gc2VsZi5rbm93bl9lcnJvcnM6CisgICAgICAgICAgIyBBIHNpbWlsYXIgcmVwb3J0IGhhcyBhbHJlYWR5IGJlZW4gcHJpbnRlZCBpbiBvbmUgb2YgdGhlIHByZXYgdGVzdHMuCisgICAgICAgICAgdG9fcmVwb3J0LmFwcGVuZCgiVGhpcyBlcnJvciB3YXMgYWxyZWFkeSBwcmludGVkIGluIHNvbWUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm90aGVyIHRlc3QsIHNlZSAnaGFzaD0jJTAxNlgjJyIgJSByLkVycm9ySGFzaCgpKQorICAgICAgICAgIHJlcG9ydHNfZm9yX3RoaXNfdGVzdC5hZGQocikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBzZWxmLmtub3duX2Vycm9ycy5hZGQocikKKyAgICAgICAgICByZXBvcnRzX2Zvcl90aGlzX3Rlc3QuYWRkKHIpCisgICAgICAgICAgdG9fcmVwb3J0LmFwcGVuZChyKQorCisgICAgY29tbW9uLlByaW50VXNlZFN1cHByZXNzaW9uc0xpc3Qoc2VsZi51c2VkX3N1cHByZXNzaW9ucykKKworICAgIGlmIG5vdCB0b19yZXBvcnQ6CisgICAgICBsb2dnaW5nLmluZm8oIlBBU1M6IE5vIGVycm9yIHJlcG9ydHMgZm91bmQiKQorICAgICAgcmV0dXJuIDAKKworICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgIHN5cy5zdGRlcnIuZmx1c2goKQorICAgIGxvZ2dpbmcuaW5mbygiRm91bmQgJWkgZXJyb3IgcmVwb3J0cyIgJSBsZW4odG9fcmVwb3J0KSkKKyAgICBmb3IgcmVwb3J0IGluIHRvX3JlcG9ydDoKKyAgICAgIHNlbGYuZXJyb3JfY291bnQgKz0gMQorICAgICAgbG9nZ2luZy5pbmZvKCJSZXBvcnQgIyVkXG4lcyIgJSAoc2VsZi5lcnJvcl9jb3VudCwgcmVwb3J0KSkKKyAgICBsb2dnaW5nLmluZm8oIlRvdGFsOiAlaSBlcnJvciByZXBvcnRzIiAlIGxlbih0b19yZXBvcnQpKQorICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgIHJldHVybiAtMQorCisKK2RlZiBtYWluKCk6CisgICcnJ0ZvciB0ZXN0aW5nIG9ubHkuIFRoZSBEck1lbW9yeUFuYWx5emUgY2xhc3Mgc2hvdWxkIGJlIGltcG9ydGVkIGluc3RlYWQuJycnCisgIHBhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcigidXNhZ2U6ICVwcm9nIDxmaWxlcyB0byBhbmFseXplPiIpCisKKyAgKG9wdGlvbnMsIGFyZ3MpID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorICBpZiBsZW4oYXJncykgPT0gMDoKKyAgICBwYXJzZXIuZXJyb3IoIm5vIGZpbGVuYW1lIHNwZWNpZmllZCIpCisgIGZpbGVuYW1lcyA9IGFyZ3MKKworICBsb2dnaW5nLmdldExvZ2dlcigpLnNldExldmVsKGxvZ2dpbmcuSU5GTykKKyAgcmV0dXJuIERyTWVtb3J5QW5hbHl6ZXIoKS5SZXBvcnQoZmlsZW5hbWVzLCBOb25lLCBGYWxzZSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBzeXMuZXhpdChtYWluKCkpCmRpZmYgLS1naXQgYS90b29scy9kcm1lbW9yeS9zY3JpcHRzL2xvZ2dpbmdfdXRpbHMucHkgYi90b29scy9kcm1lbW9yeS9zY3JpcHRzL2xvZ2dpbmdfdXRpbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYyZDY3NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2RybWVtb3J5L3NjcmlwdHMvbG9nZ2luZ191dGlscy5weQpAQCAtMCwwICsxLDgyIEBACisjIENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisnJycgVXRpbGl0eSBmdW5jdGlvbnMgYW5kIG9iamVjdHMgZm9yIGxvZ2dpbmcuCisnJycKKworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBzeXMKKworY2xhc3MgU3Rkb3V0U3RkZXJySGFuZGxlcihsb2dnaW5nLkhhbmRsZXIpOgorICAnJycgU3ViY2xhc3Mgb2YgbG9nZ2luZy5IYW5kbGVyIHdoaWNoIG91dHB1dHMgdG8gZWl0aGVyIHN0ZG91dCBvciBzdGRlcnIKKyAgYmFzZWQgb24gYSB0aHJlc2hvbGQgbGV2ZWwuCisgICcnJworCisgIGRlZiBfX2luaXRfXyhzZWxmLCB0aHJlc2hvbGQ9bG9nZ2luZy5XQVJOSU5HLCBlcnI9c3lzLnN0ZGVyciwgb3V0PXN5cy5zdGRvdXQpOgorICAgICcnJyBBcmdzOgorICAgICAgICAgIHRocmVzaG9sZDogYmVsb3cgdGhpcyBsb2dnaW5nIGxldmVsIG1lc3NhZ2VzIGFyZSBzZW50IHRvIHN0ZG91dCwKKyAgICAgICAgICAgIG90aGVyd2lzZSB0aGV5IGFyZSBzZW50IHRvIHN0ZGVycgorICAgICAgICAgIGVycjogYSBzdHJlYW0gb2JqZWN0IHRoYXQgZXJyb3IgbWVzc2FnZXMgYXJlIHNlbnQgdG8sIGRlZmF1bHRzIHRvCisgICAgICAgICAgICBzeXMuc3RkZXJyCisgICAgICAgICAgb3V0OiBhIHN0cmVhbSBvYmplY3QgdGhhdCBub24tZXJyb3IgbWVzc2FnZXMgYXJlIHNlbnQgdG8sIGRlZmF1bHRzIHRvCisgICAgICAgICAgICBzeXMuc3Rkb3V0CisgICAgJycnCisgICAgbG9nZ2luZy5IYW5kbGVyLl9faW5pdF9fKHNlbGYpCisgICAgc2VsZi5fZXJyID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyKGVycikKKyAgICBzZWxmLl9vdXQgPSBsb2dnaW5nLlN0cmVhbUhhbmRsZXIob3V0KQorICAgIHNlbGYuX3RocmVzaG9sZCA9IHRocmVzaG9sZAorICAgIHNlbGYuX2xhc3Rfd2FzX2VyciA9IEZhbHNlCisKKyAgZGVmIHNldExldmVsKHNlbGYsIGx2bCk6CisgICAgbG9nZ2luZy5IYW5kbGVyLnNldExldmVsKHNlbGYsIGx2bCkKKyAgICBzZWxmLl9lcnIuc2V0TGV2ZWwobHZsKQorICAgIHNlbGYuX291dC5zZXRMZXZlbChsdmwpCisKKyAgZGVmIHNldEZvcm1hdHRlcihzZWxmLCBmb3JtYXR0ZXIpOgorICAgIGxvZ2dpbmcuSGFuZGxlci5zZXRGb3JtYXR0ZXIoc2VsZiwgZm9ybWF0dGVyKQorICAgIHNlbGYuX2Vyci5zZXRGb3JtYXR0ZXIoZm9ybWF0dGVyKQorICAgIHNlbGYuX291dC5zZXRGb3JtYXR0ZXIoZm9ybWF0dGVyKQorCisgIGRlZiBlbWl0KHNlbGYsIHJlY29yZCk6CisgICAgaWYgcmVjb3JkLmxldmVsbm8gPCBzZWxmLl90aHJlc2hvbGQ6CisgICAgICBzZWxmLl9vdXQuZW1pdChyZWNvcmQpCisgICAgICBzZWxmLl9sYXN0X3dhc19lcnIgPSBGYWxzZQorICAgIGVsc2U6CisgICAgICBzZWxmLl9lcnIuZW1pdChyZWNvcmQpCisgICAgICBzZWxmLl9sYXN0X3dhc19lcnIgPSBGYWxzZQorCisgIGRlZiBmbHVzaChzZWxmKToKKyAgICAjIHByZXNlcnZlIG9yZGVyIG9uIHRoZSBmbHVzaGluZywgdGhlIHN0YWxlc3Qgc3RyZWFtIGdldHMgZmx1c2hlZCBmaXJzdAorICAgIGlmIHNlbGYuX2xhc3Rfd2FzX2VycjoKKyAgICAgIHNlbGYuX291dC5mbHVzaCgpCisgICAgICBzZWxmLl9lcnIuZmx1c2goKQorICAgIGVsc2U6CisgICAgICBzZWxmLl9lcnIuZmx1c2goKQorICAgICAgc2VsZi5fb3V0LmZsdXNoKCkKKworCitGT1JNQVQgPSAiJShhc2N0aW1lKXMgJShmaWxlbmFtZSlzIFslKGxldmVsbmFtZSlzXSAlKG1lc3NhZ2UpcyIKK0RBVEVGTVQgPSAiJUg6JU06JVMiCisKK2RlZiBjb25maWdfcm9vdChsZXZlbD1sb2dnaW5nLklORk8sIHRocmVzaG9sZD1sb2dnaW5nLldBUk5JTkcsIGZvcm1hdD1GT1JNQVQsCisgICAgICAgICBkYXRlZm10PURBVEVGTVQpOgorICAnJycgQ29uZmlndXJlIHRoZSByb290IGxvZ2dlciB0byB1c2UgYSBTdGRvdXRTdGRlcnJIYW5kbGVyIGFuZCBzb21lIGRlZmF1bHQKKyAgZm9ybWF0dGluZy4KKyAgICBBcmdzOgorICAgICAgbGV2ZWw6IG1lc3NhZ2VzIGJlbG93IHRoaXMgbGV2ZWwgYXJlIGlnbm9yZWQKKyAgICAgIHRocmVzaG9sZDogYmVsb3cgdGhpcyBsb2dnaW5nIGxldmVsIG1lc3NhZ2VzIGFyZSBzZW50IHRvIHN0ZG91dCwKKyAgICAgICAgb3RoZXJ3aXNlIHRoZXkgYXJlIHNlbnQgdG8gc3RkZXJyCisgICAgICBmb3JtYXQ6IGZvcm1hdCBmb3IgbG9nIG1lc3NhZ2VzLCBzZWUgbG9nZ2VyLkZvcm1hdAorICAgICAgZGF0ZWZtdDogZm9ybWF0IGZvciBkYXRlIGluIGxvZyBtZXNzYWdlcworCisgICcnJworICAjIHRvIHNldCB0aGUgaGFuZGxlciBvZiB0aGUgcm9vdCBsb2dnaW5nIG9iamVjdCwgd2UgbmVlZCB0byBkbyBzZXR1cAorICAjIG1hbnVhbGx5IHJhdGhlciB0aGFuIHVzaW5nIGJhc2ljQ29uZmlnCisgIHJvb3QgPSBsb2dnaW5nLmdldExvZ2dlcigpCisgIHJvb3Quc2V0TGV2ZWwobGV2ZWwpCisgIGZvcm1hdHRlciA9IGxvZ2dpbmcuRm9ybWF0dGVyKGZvcm1hdCwgZGF0ZWZtdCkKKyAgaGFuZGxlciA9IFN0ZG91dFN0ZGVyckhhbmRsZXIodGhyZXNob2xkPXRocmVzaG9sZCkKKyAgaGFuZGxlci5zZXRMZXZlbChsZXZlbCkKKyAgaGFuZGxlci5zZXRGb3JtYXR0ZXIoZm9ybWF0dGVyKQorICByb290LmFkZEhhbmRsZXIoaGFuZGxlcikKZGlmZiAtLWdpdCBhL3Rvb2xzL2RybWVtb3J5L3NjcmlwdHMvcGF0aF91dGlscy5weSBiL3Rvb2xzL2RybWVtb3J5L3NjcmlwdHMvcGF0aF91dGlscy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWI0MzEyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZHJtZW1vcnkvc2NyaXB0cy9wYXRoX3V0aWxzLnB5CkBAIC0wLDAgKzEsODQgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDExIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisjIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyIiIlNvbWUgdXRpbGl0eSBtZXRob2RzIGZvciBnZXR0aW5nIGFuZCBtYW5pcHVsYXRpbmcgcGF0aHMuIiIiCisKKyMgVE9ETyhwYW1nKTogSGF2ZSB0aGUgYnVpbGRib3QgdXNlIHRoZXNlLCB0b28uCisKKworaW1wb3J0IGVycm5vCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworY2xhc3MgUGF0aE5vdEZvdW5kKEV4Y2VwdGlvbik6IHBhc3MKKworZGVmIFNjcmlwdERpcigpOgorICAiIiJHZXQgdGhlIGZ1bGwgcGF0aCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgc2NyaXB0LiIiIgorICBzY3JpcHRfZmlsZW5hbWUgPSBvcy5wYXRoLmFic3BhdGgoc3lzLmFyZ3ZbMF0pCisgIHJldHVybiBvcy5wYXRoLmRpcm5hbWUoc2NyaXB0X2ZpbGVuYW1lKQorCitkZWYgRmluZEFuY2VzdG9yKHN0YXJ0X2RpciwgYW5jZXN0b3IpOgorICAiIiJGaW5kcyBhbiBhbmNlc3RvciBkaXIgaW4gYSBwYXRoLgorCisgIEZvciBleGFtcGxlLCBGaW5kQW5jZXN0b3IoJ2M6XGZvb1xiYXJcYmF6JywgJ2JhcicpIHdvdWxkIHJldHVybgorICAnYzpcZm9vXGJhcicuICBVbmxpa2UgRmluZFVwd2FyZCosIHRoaXMgb25seSBsb29rcyBhdCBkaXJlY3QgcGF0aCBhbmNlc3RvcnMuCisgICIiIgorICBzdGFydF9kaXIgPSBvcy5wYXRoLmFic3BhdGgoc3RhcnRfZGlyKQorICBwYXRoID0gc3RhcnRfZGlyCisgIHdoaWxlIFRydWU6CisgICAgKHBhcmVudCwgdGFpbCkgPSBvcy5wYXRoLnNwbGl0KHBhdGgpCisgICAgaWYgdGFpbCA9PSBhbmNlc3RvcjoKKyAgICAgIHJldHVybiBwYXRoCisgICAgaWYgbm90IHRhaWw6CisgICAgICBicmVhaworICAgIHBhdGggPSBwYXJlbnQKKyAgcmFpc2UgUGF0aE5vdEZvdW5kKCJVbmFibGUgdG8gZmluZCBhbmNlc3RvciAlcyBpbiAlcyIgJSAoYW5jZXN0b3IsIHN0YXJ0X2RpcikpCisKK2RlZiBGaW5kVXB3YXJkUGFyZW50KHN0YXJ0X2RpciwgKmRlc2lyZWRfbGlzdCk6CisgICIiIkZpbmRzIHRoZSBkZXNpcmVkIG9iamVjdCdzIHBhcmVudCwgc2VhcmNoaW5nIHVwd2FyZCBmcm9tIHRoZSBzdGFydF9kaXIuCisKKyAgU2VhcmNoZXMgc3RhcnRfZGlyIGFuZCBhbGwgaXRzIHBhcmVudHMgbG9va2luZyBmb3IgdGhlIGRlc2lyZWQgZGlyZWN0b3J5CisgIG9yIGZpbGUsIHdoaWNoIG1heSBiZSBnaXZlbiBpbiBvbmUgb3IgbW9yZSBwYXRoIGNvbXBvbmVudHMuIFJldHVybnMgdGhlCisgIGZpcnN0IGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgdG9wIGRlc2lyZWQgcGF0aCBjb21wb25lbnQgd2FzIGZvdW5kLCBvciByYWlzZXMKKyAgUGF0aE5vdEZvdW5kIGlmIGl0IHdhc24ndC4KKyAgIiIiCisgIGRlc2lyZWRfcGF0aCA9IG9zLnBhdGguam9pbigqZGVzaXJlZF9saXN0KQorICBsYXN0X2RpciA9ICcnCisgIGN1cl9kaXIgPSBzdGFydF9kaXIKKyAgZm91bmRfcGF0aCA9IG9zLnBhdGguam9pbihjdXJfZGlyLCBkZXNpcmVkX3BhdGgpCisgIHdoaWxlIG5vdCBvcy5wYXRoLmV4aXN0cyhmb3VuZF9wYXRoKToKKyAgICBsYXN0X2RpciA9IGN1cl9kaXIKKyAgICBjdXJfZGlyID0gb3MucGF0aC5kaXJuYW1lKGN1cl9kaXIpCisgICAgaWYgbGFzdF9kaXIgPT0gY3VyX2RpcjoKKyAgICAgIHJhaXNlIFBhdGhOb3RGb3VuZCgnVW5hYmxlIHRvIGZpbmQgJXMgYWJvdmUgJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzaXJlZF9wYXRoLCBzdGFydF9kaXIpKQorICAgIGZvdW5kX3BhdGggPSBvcy5wYXRoLmpvaW4oY3VyX2RpciwgZGVzaXJlZF9wYXRoKQorICAjIFN0cmlwIHRoZSBlbnRpcmUgb3JpZ2luYWwgZGVzaXJlZCBwYXRoIGZyb20gdGhlIGVuZCBvZiB0aGUgb25lIGZvdW5kCisgICMgYW5kIHJlbW92ZSBhIHRyYWlsaW5nIHBhdGggc2VwYXJhdG9yLCBpZiBwcmVzZW50LgorICBmb3VuZF9wYXRoID0gZm91bmRfcGF0aFs6bGVuKGZvdW5kX3BhdGgpIC0gbGVuKGRlc2lyZWRfcGF0aCldCisgIGlmIGZvdW5kX3BhdGguZW5kc3dpdGgob3Muc2VwKToKKyAgICBmb3VuZF9wYXRoID0gZm91bmRfcGF0aFs6bGVuKGZvdW5kX3BhdGgpIC0gMV0KKyAgcmV0dXJuIGZvdW5kX3BhdGgKKworCitkZWYgRmluZFVwd2FyZChzdGFydF9kaXIsICpkZXNpcmVkX2xpc3QpOgorICAiIiJSZXR1cm5zIGEgcGF0aCB0byB0aGUgZGVzaXJlZCBkaXJlY3Rvcnkgb3IgZmlsZSwgc2VhcmNoaW5nIHVwd2FyZC4KKworICBTZWFyY2hlcyBzdGFydF9kaXIgYW5kIGFsbCBpdHMgcGFyZW50cyBsb29raW5nIGZvciB0aGUgZGVzaXJlZCBkaXJlY3RvcnkKKyAgb3IgZmlsZSwgd2hpY2ggbWF5IGJlIGdpdmVuIGluIG9uZSBvciBtb3JlIHBhdGggY29tcG9uZW50cy4gUmV0dXJucyB0aGUgZnVsbAorICBwYXRoIHRvIHRoZSBkZXNpcmVkIG9iamVjdCwgb3IgcmFpc2VzIFBhdGhOb3RGb3VuZCBpZiBpdCB3YXNuJ3QgZm91bmQuCisgICIiIgorICBwYXJlbnQgPSBGaW5kVXB3YXJkUGFyZW50KHN0YXJ0X2RpciwgKmRlc2lyZWRfbGlzdCkKKyAgcmV0dXJuIG9zLnBhdGguam9pbihwYXJlbnQsICpkZXNpcmVkX2xpc3QpCisKKworZGVmIE1heWJlTWFrZURpcmVjdG9yeSgqcGF0aCk6CisgICIiIkNyZWF0ZXMgYW4gZW50aXJlIHBhdGgsIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4iIiIKKyAgZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKCpwYXRoKQorICB0cnk6CisgICAgb3MubWFrZWRpcnMoZmlsZV9wYXRoKQorICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAjIGVycm5vLkVFWElTVCBpcyAiRmlsZSBleGlzdHMiLiAgSWYgd2Ugc2VlIGFub3RoZXIgZXJyb3IsIHJlLXJhaXNlLgorICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUVYSVNUOgorICAgICAgcmFpc2UKZGlmZiAtLWdpdCBhL3Rvb2xzL2RybWVtb3J5L3NjcmlwdHMvcGRmaXVtX3Rlc3RzLmJhdCBiL3Rvb2xzL2RybWVtb3J5L3NjcmlwdHMvcGRmaXVtX3Rlc3RzLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjE4YTBlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZHJtZW1vcnkvc2NyaXB0cy9wZGZpdW1fdGVzdHMuYmF0CkBAIC0wLDAgKzEsMjQgQEAKK0BlY2hvIG9mZg0KKzo6IENvcHlyaWdodCAoYykgMjAxMSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCis6OiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorOjogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCitzZXQgVEhJU0RJUj0lfmRwMA0KK3NldCBUT09MX05BTUU9ImRybWVtb3J5X2Z1bGwiDQorDQorOjogU2V0IHVwIERSTUVNT1JZX0NPTU1BTkQgdG8gaW52b2tlIERyLiBNZW1vcnkge3t7MQ0KK3NldCBEUk1FTU9SWV9QQVRIPSVUSElTRElSJS4uDQorc2V0IERSTUVNT1JZX1NGWD0lRFJNRU1PUllfUEFUSCVcZHJtZW1vcnktd2luZG93cy1zZnguZXhlDQoraWYgRVhJU1QgJURSTUVNT1JZX1NGWCUgR09UTyBEUk1FTU9SWV9CSU5BUllfT0sNCitlY2hvICJDYW4ndCBmaW5kIERyLiBNZW1vcnkgZXhlY3V0YWJsZXMuIg0KK2VjaG8gIlNlZSBodHRwOi8vd3d3LmNocm9taXVtLm9yZy9kZXZlbG9wZXJzL2hvdy10b3MvdXNpbmctdmFsZ3JpbmQvZHItbWVtb3J5Ig0KK2VjaG8gImZvciB0aGUgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBnZXQgdGhlbS4iDQorZXhpdCAvQiAxDQorDQorOkRSTUVNT1JZX0JJTkFSWV9PSw0KKyVEUk1FTU9SWV9TRlglIC1vJURSTUVNT1JZX1BBVEglXHVucGFja2VkIC15DQorc2V0IERSTUVNT1JZX0NPTU1BTkQ9JURSTUVNT1JZX1BBVEglXHVucGFja2VkXGJpblxkcm1lbW9yeS5leGUNCis6OiB9fX0NCisNCis6UlVOX1RFU1RTDQorcHl0aG9uICVUSElTRElSJS9wZGZpdW1fdGVzdHMucHkgJSoNCmRpZmYgLS1naXQgYS90b29scy9kcm1lbW9yeS9zY3JpcHRzL3BkZml1bV90ZXN0cy5weSBiL3Rvb2xzL2RybWVtb3J5L3NjcmlwdHMvcGRmaXVtX3Rlc3RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMGNlOWMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9kcm1lbW9yeS9zY3JpcHRzL3BkZml1bV90ZXN0cy5weQpAQCAtMCwwICsxLDQwNCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisnJycgUnVucyB2YXJpb3VzIGNocm9tZSB0ZXN0cyB0aHJvdWdoIHZhbGdyaW5kX3Rlc3QucHkuJycnCisKK2ltcG9ydCBnbG9iCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9wdHBhcnNlCitpbXBvcnQgb3MKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCisKK2ltcG9ydCBsb2dnaW5nX3V0aWxzCitpbXBvcnQgcGF0aF91dGlscworCitpbXBvcnQgY29tbW9uCitpbXBvcnQgdmFsZ3JpbmRfdGVzdAorCitjbGFzcyBUZXN0Tm90Rm91bmQoRXhjZXB0aW9uKTogcGFzcworCitjbGFzcyBNdWx0aXBsZUdUZXN0RmlsdGVyc1NwZWNpZmllZChFeGNlcHRpb24pOiBwYXNzCisKK2NsYXNzIEJ1aWxkRGlyTm90Rm91bmQoRXhjZXB0aW9uKTogcGFzcworCitjbGFzcyBCdWlsZERpckFtYmlndW91cyhFeGNlcHRpb24pOiBwYXNzCisKK2NsYXNzIEV4ZWN1dGFibGVOb3RGb3VuZChFeGNlcHRpb24pOiBwYXNzCisKK2NsYXNzIEJhZEJpbmFyeShFeGNlcHRpb24pOiBwYXNzCisKK2NsYXNzIENocm9tZVRlc3RzOgorICBTTE9XX1RPT0xTID0gWyJkcm1lbW9yeSJdCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG9wdGlvbnMsIGFyZ3MsIHRlc3QpOgorICAgIGlmICc6JyBpbiB0ZXN0OgorICAgICAgKHNlbGYuX3Rlc3QsIHNlbGYuX2d0ZXN0X2ZpbHRlcikgPSB0ZXN0LnNwbGl0KCc6JywgMSkKKyAgICBlbHNlOgorICAgICAgc2VsZi5fdGVzdCA9IHRlc3QKKyAgICAgIHNlbGYuX2d0ZXN0X2ZpbHRlciA9IG9wdGlvbnMuZ3Rlc3RfZmlsdGVyCisKKyAgICBpZiBzZWxmLl90ZXN0IG5vdCBpbiBzZWxmLl90ZXN0X2xpc3Q6CisgICAgICByYWlzZSBUZXN0Tm90Rm91bmQoIlVua25vd24gdGVzdDogJXMiICUgdGVzdCkKKworICAgIGlmIG9wdGlvbnMuZ3Rlc3RfZmlsdGVyIGFuZCBvcHRpb25zLmd0ZXN0X2ZpbHRlciAhPSBzZWxmLl9ndGVzdF9maWx0ZXI6CisgICAgICByYWlzZSBNdWx0aXBsZUdUZXN0RmlsdGVyc1NwZWNpZmllZCgiQ2FuIG5vdCBzcGVjaWZ5IGJvdGggLS1ndGVzdF9maWx0ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCAtLXRlc3QgJXMiICUgdGVzdCkKKworICAgIHNlbGYuX29wdGlvbnMgPSBvcHRpb25zCisgICAgc2VsZi5fYXJncyA9IGFyZ3MKKworICAgICMgQ29tcHV0ZSB0aGUgdG9wIG9mIHRoZSB0cmVlICh0aGUgInNvdXJjZSBkaXIiKSBmcm9tIHRoZSBzY3JpcHQgZGlyCisgICAgIyAod2hlcmUgdGhpcyBzY3JpcHQgbGl2ZXMpLiAgV2UgYXNzdW1lIHRoYXQgdGhlIHNjcmlwdCBkaXIgaXMgaW4KKyAgICAjIHRvb2xzL2RybWVtb3J5L3NjcmlwdHMgcmVsYXRpdmUgdG8gdGhlIHRvcCBvZiB0aGUgdHJlZS4KKyAgICBzY3JpcHRfZGlyID0gb3MucGF0aC5kaXJuYW1lKHBhdGhfdXRpbHMuU2NyaXB0RGlyKCkpCisgICAgc2VsZi5fc291cmNlX2RpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoc2NyaXB0X2RpcikpCisgICAgIyBTZXR1cCBEci4gTWVtb3J5IGlmIGl0J3Mgbm90IHNldCB1cCB5ZXQuCisgICAgZHJtZW1fY21kID0gb3MuZ2V0ZW52KCJEUk1FTU9SWV9DT01NQU5EIikKKyAgICBpZiBub3QgZHJtZW1fY21kOgorICAgICAgZHJtZW1fc2Z4ID0gb3MucGF0aC5qb2luKHNjcmlwdF9kaXIsICJkcm1lbW9yeS13aW5kb3dzLXNmeC5leGUiKQorICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKGRybWVtX3NmeCk6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIkNhbm5vdCBmaW5kIGRybWVtb3J5LXdpbmRvd3Mtc2Z4LmV4ZSIKKyAgICAgIGRybWVtX2RpciA9IG9zLnBhdGguam9pbihzY3JpcHRfZGlyLCAidW5wYWNrZWQiKQorICAgICAgc3VicHJvY2Vzcy5jYWxsKFtkcm1lbV9zZngsICItbyIgKyBkcm1lbV9kaXIsICIteSJdLCAwKQorICAgICAgZHJtZW1fY21kID0gb3MucGF0aC5qb2luKGRybWVtX2RpciwgImJpbiIsICJkcm1lbW9yeS5leGUiKQorICAgICAgb3MuZW52aXJvblsiRFJNRU1PUllfQ09NTUFORCJdID0gZHJtZW1fY21kCisgICAgIyBzaW5jZSB0aGlzIHBhdGggaXMgdXNlZCBmb3Igc3RyaW5nIG1hdGNoaW5nLCBtYWtlIHN1cmUgaXQncyBhbHdheXMKKyAgICAjIGFuIGFic29sdXRlIFVuaXgtc3R5bGUgcGF0aAorICAgIHNlbGYuX3NvdXJjZV9kaXIgPSBvcy5wYXRoLmFic3BhdGgoc2VsZi5fc291cmNlX2RpcikucmVwbGFjZSgnXFwnLCAnLycpCisgICAgc2VsZi5fY29tbWFuZF9wcmVhbWJsZSA9IFsiLS1zb3VyY2UtZGlyPSVzIiAlIChzZWxmLl9zb3VyY2VfZGlyKV0KKworICAgIGlmIG5vdCBzZWxmLl9vcHRpb25zLmJ1aWxkX2RpcjoKKyAgICAgIGRpcnMgPSBbCisgICAgICAgIG9zLnBhdGguam9pbihzZWxmLl9zb3VyY2VfZGlyLCAieGNvZGVidWlsZCIsICJEZWJ1ZyIpLAorICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5fc291cmNlX2RpciwgIm91dCIsICJEZWJ1ZyIpLAorICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5fc291cmNlX2RpciwgImJ1aWxkIiwgIkRlYnVnIiksCisgICAgICBdCisgICAgICBidWlsZF9kaXIgPSBbZCBmb3IgZCBpbiBkaXJzIGlmIG9zLnBhdGguaXNkaXIoZCldCisgICAgICBpZiBsZW4oYnVpbGRfZGlyKSA+IDE6CisgICAgICAgIHJhaXNlIEJ1aWxkRGlyQW1iaWd1b3VzKCJGb3VuZCBtb3JlIHRoYW4gb25lIHN1aXRhYmxlIGJ1aWxkIGRpcjpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzXG5QbGVhc2Ugc3BlY2lmeSBqdXN0IG9uZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyAtLWJ1aWxkLWRpciIgJSAiLCAiLmpvaW4oYnVpbGRfZGlyKSkKKyAgICAgIGVsaWYgYnVpbGRfZGlyOgorICAgICAgICBzZWxmLl9vcHRpb25zLmJ1aWxkX2RpciA9IGJ1aWxkX2RpclswXQorICAgICAgZWxzZToKKyAgICAgICAgc2VsZi5fb3B0aW9ucy5idWlsZF9kaXIgPSBOb25lCisKKyAgICBpZiBzZWxmLl9vcHRpb25zLmJ1aWxkX2RpcjoKKyAgICAgIGJ1aWxkX2RpciA9IG9zLnBhdGguYWJzcGF0aChzZWxmLl9vcHRpb25zLmJ1aWxkX2RpcikKKyAgICAgIHNlbGYuX2NvbW1hbmRfcHJlYW1ibGUgKz0gWyItLWJ1aWxkLWRpcj0lcyIgJSAoc2VsZi5fb3B0aW9ucy5idWlsZF9kaXIpXQorCisgIGRlZiBfRW5zdXJlQnVpbGREaXJGb3VuZChzZWxmKToKKyAgICBpZiBub3Qgc2VsZi5fb3B0aW9ucy5idWlsZF9kaXI6CisgICAgICByYWlzZSBCdWlsZERpck5vdEZvdW5kKCJPb3BzLCBjb3VsZG4ndCBmaW5kIGEgYnVpbGQgZGlyLCBwbGVhc2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BlY2lmeSBpdCBtYW51YWxseSB1c2luZyAtLWJ1aWxkLWRpciIpCisKKyAgZGVmIF9EZWZhdWx0Q29tbWFuZChzZWxmLCB0b29sLCBleGU9Tm9uZSwgdmFsZ3JpbmRfdGVzdF9hcmdzPU5vbmUpOgorICAgICcnJ0dlbmVyYXRlcyB0aGUgZGVmYXVsdCBjb21tYW5kIGFycmF5IHRoYXQgbW9zdCB0ZXN0cyB3aWxsIHVzZS4nJycKKyAgICBpZiBleGUgYW5kIGNvbW1vbi5Jc1dpbmRvd3MoKToKKyAgICAgIGV4ZSArPSAnLmV4ZScKKworICAgIGNtZCA9IGxpc3Qoc2VsZi5fY29tbWFuZF9wcmVhbWJsZSkKKworICAgICMgRmluZCBhbGwgc3VwcHJlc3Npb25zIG1hdGNoaW5nIHRoZSBmb2xsb3dpbmcgcGF0dGVybjoKKyAgICAjIHRvb2xzL3ZhbGdyaW5kL1RPT0wvc3VwcHJlc3Npb25zW19QTEFURk9STV0udHh0CisgICAgIyBhbmQgbGlzdCB0aGVtIHdpdGggLS1zdXBwcmVzc2lvbnM9IHByZWZpeC4KKyAgICBzY3JpcHRfZGlyID0gcGF0aF91dGlscy5TY3JpcHREaXIoKQorICAgIHN1cHByZXNzaW9uX2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2NyaXB0X2RpciwgIi4uIiwgInN1cHByZXNzaW9ucy50eHQiKQorICAgIGlmIG9zLnBhdGguZXhpc3RzKHN1cHByZXNzaW9uX2ZpbGUpOgorICAgICAgY21kLmFwcGVuZCgiLS1zdXBwcmVzc2lvbnM9JXMiICUgc3VwcHJlc3Npb25fZmlsZSkKKyAgICAjIFBsYXRmb3JtLXNwZWNpZmljIHN1cHByZXNzaW9uCisgICAgZm9yIHBsYXRmb3JtIGluIGNvbW1vbi5QbGF0Zm9ybU5hbWVzKCk6CisgICAgICBwbGF0Zm9ybV9zdXBwcmVzc2lvbl9maWxlID0gXAorICAgICAgICAgIG9zLnBhdGguam9pbihzY3JpcHRfZGlyLCAiLi4iLCAnc3VwcHJlc3Npb25zXyVzLnR4dCcgJSBwbGF0Zm9ybSkKKyAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBsYXRmb3JtX3N1cHByZXNzaW9uX2ZpbGUpOgorICAgICAgICBjbWQuYXBwZW5kKCItLXN1cHByZXNzaW9ucz0lcyIgJSBwbGF0Zm9ybV9zdXBwcmVzc2lvbl9maWxlKQorCisgICAgaWYgc2VsZi5fb3B0aW9ucy52YWxncmluZF90b29sX2ZsYWdzOgorICAgICAgY21kICs9IHNlbGYuX29wdGlvbnMudmFsZ3JpbmRfdG9vbF9mbGFncy5zcGxpdCgiICIpCisgICAgaWYgc2VsZi5fb3B0aW9ucy5rZWVwX2xvZ3M6CisgICAgICBjbWQgKz0gWyItLWtlZXBfbG9ncyJdCisgICAgaWYgdmFsZ3JpbmRfdGVzdF9hcmdzICE9IE5vbmU6CisgICAgICBmb3IgYXJnIGluIHZhbGdyaW5kX3Rlc3RfYXJnczoKKyAgICAgICAgY21kLmFwcGVuZChhcmcpCisgICAgaWYgZXhlOgorICAgICAgc2VsZi5fRW5zdXJlQnVpbGREaXJGb3VuZCgpCisgICAgICBleGVfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLl9vcHRpb25zLmJ1aWxkX2RpciwgZXhlKQorICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGV4ZV9wYXRoKToKKyAgICAgICAgcmFpc2UgRXhlY3V0YWJsZU5vdEZvdW5kKCJDb3VsZG4ndCBmaW5kICclcyciICUgZXhlX3BhdGgpCisKKyAgICAgIGNtZC5hcHBlbmQoZXhlX3BhdGgpCisgICAgICAjIFZhbGdyaW5kIHJ1bnMgdGVzdHMgc2xvd2x5LCBzbyBzbG93IHRlc3RzIGh1cnQgbW9yZTsgc2hvdyBlbGFwYXNlZCB0aW1lCisgICAgICAjIHNvIHdlIGNhbiBmaW5kIHRoZSBzbG93cG9rZXMuCisgICAgICBjbWQuYXBwZW5kKCItLWd0ZXN0X3ByaW50X3RpbWUiKQorICAgICAgIyBCdWlsdC1pbiB0ZXN0IGxhdW5jaGVyIGZvciBndGVzdC1iYXNlZCBleGVjdXRhYmxlcyBydW5zIHRlc3RzIHVzaW5nCisgICAgICAjIG11bHRpcGxlIHByb2Nlc3MgYnkgZGVmYXVsdC4gRm9yY2UgdGhlIHNpbmdsZS1wcm9jZXNzIG1vZGUgYmFjay4KKyAgICAgIGNtZC5hcHBlbmQoIi0tc2luZ2xlLXByb2Nlc3MtdGVzdHMiKQorICAgIGlmIHNlbGYuX29wdGlvbnMuZ3Rlc3RfcmVwZWF0OgorICAgICAgY21kLmFwcGVuZCgiLS1ndGVzdF9yZXBlYXQ9JXMiICUgc2VsZi5fb3B0aW9ucy5ndGVzdF9yZXBlYXQpCisgICAgaWYgc2VsZi5fb3B0aW9ucy5ndGVzdF9zaHVmZmxlOgorICAgICAgY21kLmFwcGVuZCgiLS1ndGVzdF9zaHVmZmxlIikKKyAgICBpZiBzZWxmLl9vcHRpb25zLmd0ZXN0X2JyZWFrX29uX2ZhaWx1cmU6CisgICAgICBjbWQuYXBwZW5kKCItLWd0ZXN0X2JyZWFrX29uX2ZhaWx1cmUiKQorICAgIGlmIHNlbGYuX29wdGlvbnMudGVzdF9sYXVuY2hlcl9ib3RfbW9kZToKKyAgICAgIGNtZC5hcHBlbmQoIi0tdGVzdC1sYXVuY2hlci1ib3QtbW9kZSIpCisgICAgaWYgc2VsZi5fb3B0aW9ucy50ZXN0X2xhdW5jaGVyX3RvdGFsX3NoYXJkcyBpcyBub3QgTm9uZToKKyAgICAgIGNtZC5hcHBlbmQoIi0tdGVzdC1sYXVuY2hlci10b3RhbC1zaGFyZHM9JWQiICUgc2VsZi5fb3B0aW9ucy50ZXN0X2xhdW5jaGVyX3RvdGFsX3NoYXJkcykKKyAgICBpZiBzZWxmLl9vcHRpb25zLnRlc3RfbGF1bmNoZXJfc2hhcmRfaW5kZXggaXMgbm90IE5vbmU6CisgICAgICBjbWQuYXBwZW5kKCItLXRlc3QtbGF1bmNoZXItc2hhcmQtaW5kZXg9JWQiICUgc2VsZi5fb3B0aW9ucy50ZXN0X2xhdW5jaGVyX3NoYXJkX2luZGV4KQorICAgIHJldHVybiBjbWQKKworICBkZWYgUnVuKHNlbGYpOgorICAgICcnJyBSdW5zIHRoZSB0ZXN0IHNwZWNpZmllZCBieSBjb21tYW5kLWxpbmUgYXJndW1lbnQgLS10ZXN0ICcnJworICAgIGxvZ2dpbmcuaW5mbygicnVubmluZyB0ZXN0ICVzIiAlIChzZWxmLl90ZXN0KSkKKyAgICByZXR1cm4gc2VsZi5fdGVzdF9saXN0W3NlbGYuX3Rlc3RdKHNlbGYpCisKKyAgZGVmIF9BcHBlbmRHdGVzdEZpbHRlcihzZWxmLCB0b29sLCBuYW1lLCBjbWQpOgorICAgICcnJ0FwcGVuZCBhbiBhcHByb3ByaWF0ZSAtLWd0ZXN0X2ZpbHRlciBmbGFnIHRvIHRoZSBnb29nbGV0ZXN0IGJpbmFyeQorICAgICAgIGludm9jYXRpb24uCisgICAgICAgSWYgdGhlIHVzZXIgcGFzc2VkIGhpcyBvd24gZmlsdGVyIG1lbnRpb25pbmcgb25seSBvbmUgdGVzdCwganVzdCB1c2UgaXQuCisgICAgICAgT3RoZXdpc2UsIGZpbHRlciBvdXQgdGVzdHMgbGlzdGVkIGluIHRoZSBhcHByb3ByaWF0ZSBndGVzdF9leGNsdWRlIGZpbGVzLgorICAgICcnJworICAgIGlmIChzZWxmLl9ndGVzdF9maWx0ZXIgYW5kCisgICAgICAgICI6IiBub3QgaW4gc2VsZi5fZ3Rlc3RfZmlsdGVyIGFuZAorICAgICAgICAiPyIgbm90IGluIHNlbGYuX2d0ZXN0X2ZpbHRlciBhbmQKKyAgICAgICAgIioiIG5vdCBpbiBzZWxmLl9ndGVzdF9maWx0ZXIpOgorICAgICAgY21kLmFwcGVuZCgiLS1ndGVzdF9maWx0ZXI9JXMiICUgc2VsZi5fZ3Rlc3RfZmlsdGVyKQorICAgICAgcmV0dXJuCisKKyAgICBmaWx0ZXJzID0gW10KKyAgICBndGVzdF9maWxlc19kaXIgPSBvcy5wYXRoLmpvaW4ocGF0aF91dGlscy5TY3JpcHREaXIoKSwgImd0ZXN0X2V4Y2x1ZGUiKQorCisgICAgZ3Rlc3RfZmlsdGVyX2ZpbGVzID0gWworICAgICAgICBvcy5wYXRoLmpvaW4oZ3Rlc3RfZmlsZXNfZGlyLCBuYW1lICsgIi5ndGVzdC0lcy50eHQiICUgdG9vbC5Ub29sTmFtZSgpKV0KKyAgICAjIFVzZSAiLmd0ZXN0LnR4dCIgZmlsZXMgb25seSBmb3Igc2xvdyB0b29scywgYXMgdGhleSBub3cgY29udGFpbgorICAgICMgVmFsZ3JpbmQtIGFuZCBEci5NZW1vcnktc3BlY2lmaWMgZmlsdGVycy4KKyAgICAjIFRPRE8oZ2xpZGVyKTogcmVuYW1lIHRoZSBmaWxlcyB0byAiLmd0ZXN0X3Nsb3cudHh0IgorICAgIGlmIHRvb2wuVG9vbE5hbWUoKSBpbiBDaHJvbWVUZXN0cy5TTE9XX1RPT0xTOgorICAgICAgZ3Rlc3RfZmlsdGVyX2ZpbGVzICs9IFtvcy5wYXRoLmpvaW4oZ3Rlc3RfZmlsZXNfZGlyLCBuYW1lICsgIi5ndGVzdC50eHQiKV0KKyAgICBmb3IgcGxhdGZvcm1fc3VmZml4IGluIGNvbW1vbi5QbGF0Zm9ybU5hbWVzKCk6CisgICAgICBndGVzdF9maWx0ZXJfZmlsZXMgKz0gWworICAgICAgICBvcy5wYXRoLmpvaW4oZ3Rlc3RfZmlsZXNfZGlyLCBuYW1lICsgIi5ndGVzdF8lcy50eHQiICUgcGxhdGZvcm1fc3VmZml4KSwKKyAgICAgICAgb3MucGF0aC5qb2luKGd0ZXN0X2ZpbGVzX2RpciwgbmFtZSArICIuZ3Rlc3QtJXNfJXMudHh0IiAlIFwKKyAgICAgICAgICAgICh0b29sLlRvb2xOYW1lKCksIHBsYXRmb3JtX3N1ZmZpeCkpXQorICAgIGxvZ2dpbmcuaW5mbygiUmVhZGluZyBndGVzdCBleGNsdWRlIGZpbHRlciBmaWxlczoiKQorICAgIGZvciBmaWxlbmFtZSBpbiBndGVzdF9maWx0ZXJfZmlsZXM6CisgICAgICAjIHN0cmlwIHRoZSBsZWFkaW5nIGFic29sdXRlIHBhdGggKG1heSBiZSB2ZXJ5IGxvbmcgb24gdGhlIGJvdCkKKyAgICAgICMgYW5kIHRoZSBmb2xsb3dpbmcgLyBvciBcLgorICAgICAgcmVhZGFibGVfZmlsZW5hbWUgPSBmaWxlbmFtZS5yZXBsYWNlKCJcXCIsICIvIikgICMgJ1wnIG9uIFdpbmRvd3MKKyAgICAgIHJlYWRhYmxlX2ZpbGVuYW1lID0gcmVhZGFibGVfZmlsZW5hbWUucmVwbGFjZShzZWxmLl9zb3VyY2VfZGlyLCAiIilbMTpdCisgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgorICAgICAgICBsb2dnaW5nLmluZm8oIiAgXCIlc1wiIC0gbm90IGZvdW5kIiAlIHJlYWRhYmxlX2ZpbGVuYW1lKQorICAgICAgICBjb250aW51ZQorICAgICAgbG9nZ2luZy5pbmZvKCIgIFwiJXNcIiAtIE9LIiAlIHJlYWRhYmxlX2ZpbGVuYW1lKQorICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICdyJykKKyAgICAgIGZvciBsaW5lIGluIGYucmVhZGxpbmVzKCk6CisgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgiIyIpIG9yIGxpbmUuc3RhcnRzd2l0aCgiLy8iKSBvciBsaW5lLmlzc3BhY2UoKToKKyAgICAgICAgICBjb250aW51ZQorICAgICAgICBsaW5lID0gbGluZS5yc3RyaXAoKQorICAgICAgICB0ZXN0X3ByZWZpeGVzID0gWyJGTEFLWSIsICJGQUlMUyJdCisgICAgICAgIGZvciBwIGluIHRlc3RfcHJlZml4ZXM6CisgICAgICAgICAgIyBTdHJpcCBwcmVmaXhlcyBmcm9tIHRoZSB0ZXN0IG5hbWVzLgorICAgICAgICAgIGxpbmUgPSBsaW5lLnJlcGxhY2UoIi4lc18iICUgcCwgIi4iKQorICAgICAgICAjIEV4Y2x1ZGUgdGhlIG9yaWdpbmFsIHRlc3QgbmFtZS4KKyAgICAgICAgZmlsdGVycy5hcHBlbmQobGluZSkKKyAgICAgICAgaWYgbGluZVstMjpdICE9ICIuKiI6CisgICAgICAgICAgIyBMaXN0IGFsbCBwb3NzaWJsZSBwcmVmaXhlcyBpZiBsaW5lIGRvZXNuJ3QgZW5kIHdpdGggIi4qIi4KKyAgICAgICAgICBmb3IgcCBpbiB0ZXN0X3ByZWZpeGVzOgorICAgICAgICAgICAgZmlsdGVycy5hcHBlbmQobGluZS5yZXBsYWNlKCIuIiwgIi4lc18iICUgcCkpCisgICAgIyBHZXQgcmlkIG9mIGR1cGxpY2F0ZXMuCisgICAgZmlsdGVycyA9IHNldChmaWx0ZXJzKQorICAgIGd0ZXN0X2ZpbHRlciA9IHNlbGYuX2d0ZXN0X2ZpbHRlcgorICAgIGlmIGxlbihmaWx0ZXJzKToKKyAgICAgIGlmIGd0ZXN0X2ZpbHRlcjoKKyAgICAgICAgZ3Rlc3RfZmlsdGVyICs9ICI6IgorICAgICAgICBpZiBndGVzdF9maWx0ZXIuZmluZCgiLSIpIDwgMDoKKyAgICAgICAgICBndGVzdF9maWx0ZXIgKz0gIi0iCisgICAgICBlbHNlOgorICAgICAgICBndGVzdF9maWx0ZXIgPSAiLSIKKyAgICAgIGd0ZXN0X2ZpbHRlciArPSAiOiIuam9pbihmaWx0ZXJzKQorICAgIGlmIGd0ZXN0X2ZpbHRlcjoKKyAgICAgIGNtZC5hcHBlbmQoIi0tZ3Rlc3RfZmlsdGVyPSVzIiAlIGd0ZXN0X2ZpbHRlcikKKworICBAc3RhdGljbWV0aG9kCisgIGRlZiBTaG93VGVzdHMoKToKKyAgICB0ZXN0X3RvX25hbWVzID0ge30KKyAgICBmb3IgbmFtZSwgdGVzdF9mdW5jdGlvbiBpbiBDaHJvbWVUZXN0cy5fdGVzdF9saXN0Lml0ZXJpdGVtcygpOgorICAgICAgdGVzdF90b19uYW1lcy5zZXRkZWZhdWx0KHRlc3RfZnVuY3Rpb24sIFtdKS5hcHBlbmQobmFtZSkKKworICAgIG5hbWVfdG9fYWxpYXNlcyA9IHt9CisgICAgZm9yIG5hbWVzIGluIHRlc3RfdG9fbmFtZXMuaXRlcnZhbHVlcygpOgorICAgICAgbmFtZXMuc29ydChrZXk9bGFtYmRhIG5hbWU6IGxlbihuYW1lKSkKKyAgICAgIG5hbWVfdG9fYWxpYXNlc1tuYW1lc1swXV0gPSBuYW1lc1sxOl0KKworICAgIHByaW50CisgICAgcHJpbnQgIkF2YWlsYWJsZSB0ZXN0czoiCisgICAgcHJpbnQgIi0tLS0tLS0tLS0tLS0tLS0iCisgICAgZm9yIG5hbWUsIGFsaWFzZXMgaW4gc29ydGVkKG5hbWVfdG9fYWxpYXNlcy5pdGVyaXRlbXMoKSk6CisgICAgICBpZiBhbGlhc2VzOgorICAgICAgICBwcmludCAiICAge30gKGFrYSB7fSkiLmZvcm1hdChuYW1lLCAnLCAnLmpvaW4oYWxpYXNlcykpCisgICAgICBlbHNlOgorICAgICAgICBwcmludCAiICAge30iLmZvcm1hdChuYW1lKQorCisgIGRlZiBTZXR1cExkUGF0aChzZWxmLCByZXF1aXJlc19idWlsZF9kaXIpOgorICAgIGlmIHJlcXVpcmVzX2J1aWxkX2RpcjoKKyAgICAgIHNlbGYuX0Vuc3VyZUJ1aWxkRGlyRm91bmQoKQorICAgIGVsaWYgbm90IHNlbGYuX29wdGlvbnMuYnVpbGRfZGlyOgorICAgICAgcmV0dXJuCisKKyAgICAjIEFwcGVuZCBidWlsZF9kaXIgdG8gTERfTElCUkFSWV9QQVRIIHNvIGV4dGVybmFsIGxpYnJhcmllcyBjYW4gYmUgbG9hZGVkLgorICAgIGlmIChvcy5nZXRlbnYoIkxEX0xJQlJBUllfUEFUSCIpKToKKyAgICAgIG9zLnB1dGVudigiTERfTElCUkFSWV9QQVRIIiwgIiVzOiVzIiAlIChvcy5nZXRlbnYoIkxEX0xJQlJBUllfUEFUSCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX29wdGlvbnMuYnVpbGRfZGlyKSkKKyAgICBlbHNlOgorICAgICAgb3MucHV0ZW52KCJMRF9MSUJSQVJZX1BBVEgiLCBzZWxmLl9vcHRpb25zLmJ1aWxkX2RpcikKKworICBkZWYgU2ltcGxlVGVzdChzZWxmLCBtb2R1bGUsIG5hbWUsIHZhbGdyaW5kX3Rlc3RfYXJncz1Ob25lLCBjbWRfYXJncz1Ob25lKToKKyAgICB0b29sID0gdmFsZ3JpbmRfdGVzdC5DcmVhdGVUb29sKHNlbGYuX29wdGlvbnMudmFsZ3JpbmRfdG9vbCkKKyAgICBjbWQgPSBzZWxmLl9EZWZhdWx0Q29tbWFuZCh0b29sLCBuYW1lLCB2YWxncmluZF90ZXN0X2FyZ3MpCisgICAgc2VsZi5fQXBwZW5kR3Rlc3RGaWx0ZXIodG9vbCwgbmFtZSwgY21kKQorICAgIGNtZC5leHRlbmQoWyctLXRlc3QtdGlueS10aW1lb3V0PTEwMDAnXSkKKyAgICBpZiBjbWRfYXJnczoKKyAgICAgIGNtZC5leHRlbmQoY21kX2FyZ3MpCisKKyAgICBzZWxmLlNldHVwTGRQYXRoKFRydWUpCisgICAgcmV0dXJuIHRvb2wuUnVuKGNtZCwgbW9kdWxlKQorCisgIGRlZiBSdW5DbWRMaW5lKHNlbGYpOgorICAgIHRvb2wgPSB2YWxncmluZF90ZXN0LkNyZWF0ZVRvb2woc2VsZi5fb3B0aW9ucy52YWxncmluZF90b29sKQorICAgIGNtZCA9IHNlbGYuX0RlZmF1bHRDb21tYW5kKHRvb2wsIE5vbmUsIHNlbGYuX2FyZ3MpCisgICAgc2VsZi5TZXR1cExkUGF0aChGYWxzZSkKKyAgICByZXR1cm4gdG9vbC5SdW4oY21kLCBOb25lKQorCisgIGRlZiBUZXN0UERGaXVtVW5pdFRlc3RzKHNlbGYpOgorICAgIHJldHVybiBzZWxmLlNpbXBsZVRlc3QoInBkZml1bV91bml0dGVzdHMiLCAicGRmaXVtX3VuaXR0ZXN0cyIpCisKKyAgZGVmIFRlc3RQREZpdW1FbWJlZGRlclRlc3RzKHNlbGYpOgorICAgIHJldHVybiBzZWxmLlNpbXBsZVRlc3QoInBkZml1bV9lbWJlZGRlcnRlc3RzIiwgInBkZml1bV9lbWJlZGRlcnRlc3RzIikKKworICBkZWYgVGVzdFBERml1bVRlc3Qoc2VsZiwgc2NyaXB0X25hbWUpOgorICAgICMgQnVpbGQgdGhlIGNvbW1hbmQgbGluZSBpbiAnY21kJy4KKyAgICAjIEl0J3MgZ29pbmcgdG8gYmUgcm91Z2hseQorICAgICMgIHB5dGhvbiB2YWxncmluZF90ZXN0LnB5IC4uLgorICAgICMgYnV0IHdlJ2xsIHVzZSB0aGUgLS1pbmRpcmVjdF9wZGZpdW1fdGVzdCBmbGFnIHRvIHZhbGdyaW5kX3Rlc3QucHkKKyAgICAjIHRvIGF2b2lkIHZhbGdyaW5kaW5nIHB5dGhvbi4KKworICAgICMgU3RhcnQgYnkgYnVpbGRpbmcgdGhlIHZhbGdyaW5kX3Rlc3QucHkgY29tbWFuZGxpbmUuCisgICAgdG9vbCA9IHZhbGdyaW5kX3Rlc3QuQ3JlYXRlVG9vbChzZWxmLl9vcHRpb25zLnZhbGdyaW5kX3Rvb2wpCisgICAgY21kID0gc2VsZi5fRGVmYXVsdENvbW1hbmQodG9vbCkKKyAgICBjbWQuYXBwZW5kKCItLXRyYWNlX2NoaWxkcmVuIikKKyAgICBjbWQuYXBwZW5kKCItLWluZGlyZWN0X3BkZml1bV90ZXN0IikKKyAgICBjbWQuYXBwZW5kKCItLWlnbm9yZV9leGl0X2NvZGUiKQorICAgICMgTm93IGJ1aWxkIHNjcmlwdF9jbWQsIHRoZSBydW5fY29ycHVzX3Rlc3RzIGNvbW1hbmRsaW5lLgorICAgIHNjcmlwdCA9IG9zLnBhdGguam9pbihzZWxmLl9zb3VyY2VfZGlyLCAidGVzdGluZyIsICJ0b29scyIsIHNjcmlwdF9uYW1lKQorICAgIHNjcmlwdF9jbWQgPSBbInB5dGhvbiIsIHNjcmlwdF0KKyAgICBpZiBzZWxmLl9vcHRpb25zLmJ1aWxkX2RpcjoKKyAgICAgIHNjcmlwdF9jbWQuZXh0ZW5kKFsiLS1idWlsZC1kaXIiLCBzZWxmLl9vcHRpb25zLmJ1aWxkX2Rpcl0pCisgICAgIyBUT0RPKHpoYW9xaW4pOiBpdCBvbmx5IHJ1bnMgaW4gc2luZ2xlIHByb2Nlc3MgbW9kZSBub3csCisgICAgIyBuZWVkIGZpZ3VyZSBvdXQgd2h5IGl0IGRvZXMgbm90IHdvcmsgd2l0aCB0ZXN0X29uZV9maWxlX3BhcmFsbGVsCisgICAgIyBpbiBydW5fY29ycHVzX3Rlc3RzLnB5LgorICAgIGlmIHNjcmlwdF9uYW1lID09ICJydW5fY29ycHVzX3Rlc3RzLnB5IjoKKyAgICAgICAgc2NyaXB0X2NtZC5leHRlbmQoWyItaiIsICIxIl0pCisgICAgIyBOb3cgcnVuIHNjcmlwdF9jbWQgd2l0aCB0aGUgd3JhcHBlciBpbiBjbWQKKyAgICBjbWQuYXBwZW5kKCItLSIpCisgICAgY21kLmV4dGVuZChzY3JpcHRfY21kKQorCisgICAgcmV0ID0gdG9vbC5SdW4oY21kLCAibGF5b3V0IiwgbWluX3J1bnRpbWVfaW5fc2Vjb25kcz0wKQorICAgIHJldHVybiByZXQKKworICBkZWYgVGVzdFBERml1bUphdmFzY3JpcHQoc2VsZik6CisgICAgcmV0dXJuIHNlbGYuVGVzdFBERml1bVRlc3QoInJ1bl9qYXZhc2NyaXB0X3Rlc3RzLnB5IikKKworICBkZWYgVGVzdFBERml1bVBpeGVsKHNlbGYpOgorICAgIHJldHVybiBzZWxmLlRlc3RQREZpdW1UZXN0KCJydW5fcGl4ZWxfdGVzdHMucHkiKQorCisgIGRlZiBUZXN0UERGaXVtQ29ycHVzKHNlbGYpOgorICAgIHJldHVybiBzZWxmLlRlc3RQREZpdW1UZXN0KCJydW5fY29ycHVzX3Rlc3RzLnB5IikKKworICAjIFRoZSBrbm93biBsaXN0IG9mIHRlc3RzLgorICBfdGVzdF9saXN0ID0geworICAgICJjbWRsaW5lIiA6ICAgICAgICAgICAgIFJ1bkNtZExpbmUsCisgICAgInBkZml1bV9jb3JwdXMiOiAgICAgICAgVGVzdFBERml1bUNvcnB1cywKKyAgICAicGRmaXVtX2VtYmVkZGVydGVzdHMiOiBUZXN0UERGaXVtRW1iZWRkZXJUZXN0cywKKyAgICAicGRmaXVtX2phdmFzY3JpcHQiOiAgICBUZXN0UERGaXVtSmF2YXNjcmlwdCwKKyAgICAicGRmaXVtX3BpeGVsIjogICAgICAgICBUZXN0UERGaXVtUGl4ZWwsCisgICAgInBkZml1bV91bml0dGVzdHMiOiAgICAgVGVzdFBERml1bVVuaXRUZXN0cywKKyAgfQorCisKK2RlZiBfbWFpbigpOgorICBwYXJzZXIgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIoInVzYWdlOiAlcHJvZyAtYiA8ZGlyPiAtdCA8dGVzdD4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlstdCA8dGVzdD4gLi4uXSIpCisKKyAgcGFyc2VyLmFkZF9vcHRpb24oIi0taGVscC10ZXN0cyIsIGRlc3Q9ImhlbHBfdGVzdHMiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PUZhbHNlLCBoZWxwPSJMaXN0IGFsbCBhdmFpbGFibGUgdGVzdHMiKQorICBwYXJzZXIuYWRkX29wdGlvbigiLWIiLCAiLS1idWlsZC1kaXIiLAorICAgICAgICAgICAgICAgICAgICBoZWxwPSJ0aGUgbG9jYXRpb24gb2YgdGhlIGNvbXBpbGVyIG91dHB1dCIpCisgIHBhcnNlci5hZGRfb3B0aW9uKCItLXRhcmdldCIsIGhlbHA9IkRlYnVnIG9yIFJlbGVhc2UiKQorICBwYXJzZXIuYWRkX29wdGlvbigiLXQiLCAiLS10ZXN0IiwgYWN0aW9uPSJhcHBlbmQiLCBkZWZhdWx0PVtdLAorICAgICAgICAgICAgICAgICAgICBoZWxwPSJ3aGljaCB0ZXN0IHRvIHJ1biwgc3VwcG9ydHMgdGVzdDpndGVzdF9maWx0ZXIgZm9ybWF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYXMgd2VsbC4iKQorICBwYXJzZXIuYWRkX29wdGlvbigiLS1ndGVzdF9maWx0ZXIiLAorICAgICAgICAgICAgICAgICAgICBoZWxwPSJhZGRpdGlvbmFsIGFyZ3VtZW50cyB0byAtLWd0ZXN0X2ZpbHRlciIpCisgIHBhcnNlci5hZGRfb3B0aW9uKCItLWd0ZXN0X3JlcGVhdCIsIGhlbHA9ImFyZ3VtZW50IGZvciAtLWd0ZXN0X3JlcGVhdCIpCisgIHBhcnNlci5hZGRfb3B0aW9uKCItLWd0ZXN0X3NodWZmbGUiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZWZhdWx0PUZhbHNlLAorICAgICAgICAgICAgICAgICAgICBoZWxwPSJSYW5kb21pemUgdGVzdHMnIG9yZGVycyBvbiBldmVyeSBpdGVyYXRpb24uIikKKyAgcGFyc2VyLmFkZF9vcHRpb24oIi0tZ3Rlc3RfYnJlYWtfb25fZmFpbHVyZSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgIGhlbHA9IkRyb3AgaW4gdG8gZGVidWdnZXIgb24gYXNzZXJ0aW9uIGZhaWx1cmUuIEFsc28gIgorICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2VmdWwgZm9yIGZvcmNpbmcgdGVzdHMgdG8gZXhpdCB3aXRoIGEgc3RhY2sgZHVtcCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIm9uIHRoZSBmaXJzdCBhc3NlcnRpb24gZmFpbHVyZSB3aGVuIHJ1bm5pbmcgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIi0tZ3Rlc3RfcmVwZWF0PS0xIikKKyAgcGFyc2VyLmFkZF9vcHRpb24oIi12IiwgIi0tdmVyYm9zZSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlZmF1bHQ9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgIGhlbHA9InZlcmJvc2Ugb3V0cHV0IC0gZW5hYmxlIGRlYnVnIGxvZyBtZXNzYWdlcyIpCisgIHBhcnNlci5hZGRfb3B0aW9uKCItLXRvb2wiLCBkZXN0PSJ2YWxncmluZF90b29sIiwgZGVmYXVsdD0iZHJtZW1vcnlfZnVsbCIsCisgICAgICAgICAgICAgICAgICAgIGhlbHA9InNwZWNpZnkgYSB2YWxncmluZCB0b29sIHRvIHJ1biB0aGUgdGVzdHMgdW5kZXIiKQorICBwYXJzZXIuYWRkX29wdGlvbigiLS10b29sX2ZsYWdzIiwgZGVzdD0idmFsZ3JpbmRfdG9vbF9mbGFncyIsIGRlZmF1bHQ9IiIsCisgICAgICAgICAgICAgICAgICAgIGhlbHA9InNwZWNpZnkgY3VzdG9tIGZsYWdzIGZvciB0aGUgc2VsZWN0ZWQgdmFsZ3JpbmQgdG9vbCIpCisgIHBhcnNlci5hZGRfb3B0aW9uKCItLWtlZXBfbG9ncyIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlZmF1bHQ9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgIGhlbHA9InN0b3JlIG1lbW9yeSB0b29sIGxvZ3MgaW4gdGhlIDx0b29sPi5sb2dzIGRpcmVjdG9yeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImluc3RlYWQgb2YgL3RtcC5cblRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgdG9vbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImRldmVsb3BlcnMvbWFpbnRhaW5lcnMuXG5QbGVhc2Ugbm90ZSB0aGF0IHRoZSA8dG9vbD4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIi5sb2dzIGRpcmVjdG9yeSB3aWxsIGJlIGNsb2JiZXJlZCBvbiB0b29sIHN0YXJ0dXAuIikKKyAgcGFyc2VyLmFkZF9vcHRpb24oIi0tdGVzdC1sYXVuY2hlci1ib3QtbW9kZSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgIGhlbHA9InJ1biB0aGUgdGVzdHMgd2l0aCAtLXRlc3QtbGF1bmNoZXItYm90LW1vZGUiKQorICBwYXJzZXIuYWRkX29wdGlvbigiLS10ZXN0LWxhdW5jaGVyLXRvdGFsLXNoYXJkcyIsIHR5cGU9aW50LAorICAgICAgICAgICAgICAgICAgICBoZWxwPSJydW4gdGhlIHRlc3RzIHdpdGggLS10ZXN0LWxhdW5jaGVyLXRvdGFsLXNoYXJkcyIpCisgIHBhcnNlci5hZGRfb3B0aW9uKCItLXRlc3QtbGF1bmNoZXItc2hhcmQtaW5kZXgiLCB0eXBlPWludCwKKyAgICAgICAgICAgICAgICAgICAgaGVscD0icnVuIHRoZSB0ZXN0cyB3aXRoIC0tdGVzdC1sYXVuY2hlci1zaGFyZC1pbmRleCIpCisKKyAgb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworICAjIEJha2UgdGFyZ2V0IGludG8gYnVpbGRfZGlyLgorICBpZiBvcHRpb25zLnRhcmdldCBhbmQgb3B0aW9ucy5idWlsZF9kaXI6CisgICAgYXNzZXJ0IChvcHRpb25zLnRhcmdldCAhPQorICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShvcy5wYXRoLmRpcm5hbWUob3B0aW9ucy5idWlsZF9kaXIpKSkKKyAgICBvcHRpb25zLmJ1aWxkX2RpciA9IG9zLnBhdGguam9pbihvcy5wYXRoLmFic3BhdGgob3B0aW9ucy5idWlsZF9kaXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudGFyZ2V0KQorCisgIGlmIG9wdGlvbnMudmVyYm9zZToKKyAgICBsb2dnaW5nX3V0aWxzLmNvbmZpZ19yb290KGxvZ2dpbmcuREVCVUcpCisgIGVsc2U6CisgICAgbG9nZ2luZ191dGlscy5jb25maWdfcm9vdCgpCisKKyAgaWYgb3B0aW9ucy5oZWxwX3Rlc3RzOgorICAgIENocm9tZVRlc3RzLlNob3dUZXN0cygpCisgICAgcmV0dXJuIDAKKworICBpZiBub3Qgb3B0aW9ucy50ZXN0OgorICAgIHBhcnNlci5lcnJvcigiLS10ZXN0IG5vdCBzcGVjaWZpZWQiKQorCisgIGlmIGxlbihvcHRpb25zLnRlc3QpICE9IDEgYW5kIG9wdGlvbnMuZ3Rlc3RfZmlsdGVyOgorICAgIHBhcnNlci5lcnJvcigiLS1ndGVzdF9maWx0ZXIgYW5kIG11bHRpcGxlIHRlc3RzIGRvbid0IG1ha2Ugc2Vuc2UgdG9nZXRoZXIiKQorCisgIGZvciB0IGluIG9wdGlvbnMudGVzdDoKKyAgICB0ZXN0cyA9IENocm9tZVRlc3RzKG9wdGlvbnMsIGFyZ3MsIHQpCisgICAgcmV0ID0gdGVzdHMuUnVuKCkKKyAgICBpZiByZXQ6IHJldHVybiByZXQKKyAgcmV0dXJuIDAKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICBzeXMuZXhpdChfbWFpbigpKQpkaWZmIC0tZ2l0IGEvdG9vbHMvZHJtZW1vcnkvc2NyaXB0cy92YWxncmluZF90ZXN0LnB5IGIvdG9vbHMvZHJtZW1vcnkvc2NyaXB0cy92YWxncmluZF90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyOTYwYzcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9kcm1lbW9yeS9zY3JpcHRzL3ZhbGdyaW5kX3Rlc3QucHkKQEAgLTAsMCArMSw0ODcgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisjIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyIiIlJ1bnMgYW4gZXhlIHRocm91Z2ggVmFsZ3JpbmQgYW5kIHB1dHMgdGhlIGludGVybWVkaWF0ZSBmaWxlcyBpbiBhCitkaXJlY3RvcnkuCisiIiIKKworaW1wb3J0IGRhdGV0aW1lCitpbXBvcnQgZ2xvYgoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcHRwYXJzZQoraW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBzdGF0CitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCisKK2ltcG9ydCBjb21tb24KKworaW1wb3J0IGRybWVtb3J5X2FuYWx5emUKKworY2xhc3MgQmFzZVRvb2wob2JqZWN0KToKKyAgIiIiQWJzdHJhY3QgY2xhc3MgZm9yIHJ1bm5pbmcgZHluYW1pYyBlcnJvciBkZXRlY3Rpb24gdG9vbHMuCisKKyAgQWx3YXlzIHN1YmNsYXNzIHRoaXMgYW5kIGltcGxlbWVudCBUb29sQ29tbWFuZCB3aXRoIGZyYW1ld29yay0gYW5kCisgIHRvb2wtc3BlY2lmaWMgc3R1ZmYuCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICB0ZW1wX3BhcmVudF9kaXIgPSBOb25lCisgICAgc2VsZi5sb2dfcGFyZW50X2RpciA9ICIiCisgICAgaWYgY29tbW9uLklzV2luZG93cygpOgorICAgICAgIyBncHUgcHJvY2VzcyBvbiBXaW5kb3dzIFZpc3RhKyBydW5zIGF0IExvdyBJbnRlZ3JpdHkgYW5kIGNhbiBvbmx5CisgICAgICAjIHdyaXRlIHRvIGNlcnRhaW4gZGlyZWN0b3JpZXMgKGh0dHA6Ly9jcmJ1Zy5jb20vMTE5MTMxKQorICAgICAgIworICAgICAgIyBUT0RPKGJydWVuaW5nKTogaWYgc2NyaXB0cyBkaWUgaW4gbWlkZGxlIGFuZCBkb24ndCBjbGVhbiB1cCB0ZW1wCisgICAgICAjIGRpciwgd2UnbGwgYWNjdW11bGF0ZSBmaWxlcyBpbiBwcm9maWxlIGRpci4gIHNob3VsZCByZW1vdmUKKyAgICAgICMgcmVhbGx5IG9sZCBmaWxlcyBhdXRvbWF0aWNhbGx5LgorICAgICAgcHJvZmlsZSA9IG9zLmdldGVudigiVVNFUlBST0ZJTEUiKQorICAgICAgaWYgcHJvZmlsZToKKyAgICAgICAgc2VsZi5sb2dfcGFyZW50X2RpciA9IHByb2ZpbGUgKyAiXFxBcHBEYXRhXFxMb2NhbExvd1xcIgorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmxvZ19wYXJlbnRfZGlyKToKKyAgICAgICAgICBzZWxmLmxvZ19wYXJlbnRfZGlyID0gY29tbW9uLk5vcm1hbGl6ZVdpbmRvd3NQYXRoKHNlbGYubG9nX3BhcmVudF9kaXIpCisgICAgICAgICAgdGVtcF9wYXJlbnRfZGlyID0gc2VsZi5sb2dfcGFyZW50X2RpcgorICAgICMgR2VuZXJhdGVkIGV2ZXJ5IHRpbWUgKGV2ZW4gd2hlbiBvdmVycmlkZGVuKQorICAgIHNlbGYudGVtcF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKHByZWZpeD0idmdfbG9nc18iLCBkaXI9dGVtcF9wYXJlbnRfZGlyKQorICAgIHNlbGYubG9nX2RpciA9IHNlbGYudGVtcF9kaXIgIyBvdmVycmlkYWJsZSBieSAtLWtlZXBfbG9ncworICAgIHNlbGYub3B0aW9uX3BhcnNlcl9ob29rcyA9IFtdCisgICAgIyBUT0RPKGdsaWRlcik6IHdlIG1heSBub3QgbmVlZCBzb21lIG9mIHRoZSBlbnYgdmFycyBvbiBzb21lIG9mIHRoZQorICAgICMgcGxhdGZvcm1zLgorICAgIHNlbGYuX2VudiA9IHsKKyAgICAgICJHX1NMSUNFIiA6ICJhbHdheXMtbWFsbG9jIiwKKyAgICAgICJOU1NfRElTQUJMRV9VTkxPQUQiIDogIjEiLAorICAgICAgIk5TU19ESVNBQkxFX0FSRU5BX0ZSRUVfTElTVCIgOiAiMSIsCisgICAgICAiR1RFU1RfREVBVEhfVEVTVF9VU0VfRk9SSyI6ICIxIiwKKyAgICB9CisKKyAgZGVmIFRvb2xOYW1lKHNlbGYpOgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IsICJUaGlzIG1ldGhvZCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIHRoZSB0b29sLXNwZWNpZmljIHN1YmNsYXNzIgorCisgIGRlZiBBbmFseXplKHNlbGYsIGNoZWNrX3Nhbml0eT1GYWxzZSk6CisgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwgIlRoaXMgbWV0aG9kIHNob3VsZCBiZSBpbXBsZW1lbnRlZCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gdGhlIHRvb2wtc3BlY2lmaWMgc3ViY2xhc3MiCisKKyAgZGVmIFJlZ2lzdGVyT3B0aW9uUGFyc2VySG9vayhzZWxmLCBob29rKToKKyAgICAjIEZyYW1ld29ya3MgYW5kIHRvb2xzIGNhbiBhZGQgdGhlaXIgb3duIGZsYWdzIHRvIHRoZSBwYXJzZXIuCisgICAgc2VsZi5vcHRpb25fcGFyc2VyX2hvb2tzLmFwcGVuZChob29rKQorCisgIGRlZiBDcmVhdGVPcHRpb25QYXJzZXIoc2VsZik6CisgICAgIyBEZWZpbmVzIENocm9taXVtLXNwZWNpZmljIGZsYWdzLgorICAgIHNlbGYuX3BhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcigidXNhZ2U6ICVwcm9nIFtvcHRpb25zXSA8cHJvZ3JhbSB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0PiIpCisgICAgc2VsZi5fcGFyc2VyLmRpc2FibGVfaW50ZXJzcGVyc2VkX2FyZ3MoKQorICAgIHNlbGYuX3BhcnNlci5hZGRfb3B0aW9uKCItdCIsICItLXRpbWVvdXQiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InRpbWVvdXQiLCBtZXRhdmFyPSJUSU1FT1VUIiwgZGVmYXVsdD0xMDAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idGltZW91dCBpbiBzZWNvbmRzIGZvciB0aGUgcnVuIChkZWZhdWx0IDEwMDAwMCkiKQorICAgIHNlbGYuX3BhcnNlci5hZGRfb3B0aW9uKCIiLCAiLS1idWlsZC1kaXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InRoZSBsb2NhdGlvbiBvZiB0aGUgY29tcGlsZXIgb3V0cHV0IikKKyAgICBzZWxmLl9wYXJzZXIuYWRkX29wdGlvbigiIiwgIi0tc291cmNlLWRpciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0icGF0aCB0byB0b3Agb2Ygc291cmNlIHRyZWUgZm9yIHRoaXMgYnVpbGQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHVzZWQgdG8gbm9ybWFsaXplIHNvdXJjZSBwYXRocyBpbiBiYXNlbGluZSkiKQorICAgIHNlbGYuX3BhcnNlci5hZGRfb3B0aW9uKCIiLCAiLS1ndGVzdF9maWx0ZXIiLCBkZWZhdWx0PSIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IndoaWNoIHRlc3QgY2FzZSB0byBydW4iKQorICAgIHNlbGYuX3BhcnNlci5hZGRfb3B0aW9uKCIiLCAiLS1ndGVzdF9yZXBlYXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImhvdyBtYW55IHRpbWVzIHRvIHJ1biBlYWNoIHRlc3QiKQorICAgIHNlbGYuX3BhcnNlci5hZGRfb3B0aW9uKCIiLCAiLS1ndGVzdF9wcmludF90aW1lIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InNob3cgaG93IGxvbmcgZWFjaCB0ZXN0IHRha2VzIikKKyAgICBzZWxmLl9wYXJzZXIuYWRkX29wdGlvbigiIiwgIi0taWdub3JlX2V4aXRfY29kZSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJpZ25vcmUgZXhpdCBjb2RlIG9mIHRoZSB0ZXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZS5nLiB0ZXN0IGZhaWx1cmVzKSIpCisgICAgc2VsZi5fcGFyc2VyLmFkZF9vcHRpb24oIiIsICItLWtlZXBfbG9ncyIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJzdG9yZSBtZW1vcnkgdG9vbCBsb2dzIGluIHRoZSA8dG9vbD4ubG9ncyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlyZWN0b3J5IGluc3RlYWQgb2YgL3RtcC5cblRoaXMgY2FuIGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2VmdWwgZm9yIHRvb2wgZGV2ZWxvcGVycy9tYWludGFpbmVycy5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQbGVhc2Ugbm90ZSB0aGF0IHRoZSA8dG9vbD4ubG9ncyBkaXJlY3RvcnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpbGwgYmUgY2xvYmJlcmVkIG9uIHRvb2wgc3RhcnR1cC4iKQorCisgICAgIyBUbyBhZGQgZnJhbWV3b3JrLSBvciB0b29sLXNwZWNpZmljIGZsYWdzLCBwbGVhc2UgYWRkIGEgaG9vayB1c2luZworICAgICMgUmVnaXN0ZXJPcHRpb25QYXJzZXJIb29rIGluIHRoZSBjb3JyZXNwb25kaW5nIHN1YmNsYXNzLgorICAgICMgU2VlIFZhbGdyaW5kVG9vbCBmb3IgYW4gZXhhbXBsZS4KKyAgICBmb3IgaG9vayBpbiBzZWxmLm9wdGlvbl9wYXJzZXJfaG9va3M6CisgICAgICBob29rKHNlbGYsIHNlbGYuX3BhcnNlcikKKworICBkZWYgUGFyc2VBcmd2KHNlbGYsIGFyZ3MpOgorICAgIHNlbGYuQ3JlYXRlT3B0aW9uUGFyc2VyKCkKKworICAgICMgc2VsZi5fdG9vbF9mbGFncyB3aWxsIHN0b3JlIHRob3NlIHRvb2wgZmxhZ3Mgd2hpY2ggd2UgZG9uJ3QgcGFyc2UKKyAgICAjIG1hbnVhbGx5IGluIHRoaXMgc2NyaXB0LgorICAgIHNlbGYuX3Rvb2xfZmxhZ3MgPSBbXQorICAgIGtub3duX2FyZ3MgPSBbXQorCisgICAgIiIiIFdlIGFzc3VtZSB0aGF0IHRoZSBmaXJzdCBhcmd1bWVudCBub3Qgc3RhcnRpbmcgd2l0aCAiLSIgaXMgYSBwcm9ncmFtCisgICAgbmFtZSBhbmQgYWxsIHRoZSBmb2xsb3dpbmcgZmxhZ3Mgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgcHJvZ3JhbS4KKyAgICBUT0RPKHRpbXVycnJyKTogY3VzdG9taXplIG9wdHBhcnNlIGluc3RlYWQKKyAgICAiIiIKKyAgICB3aGlsZSBsZW4oYXJncykgPiAwIGFuZCBhcmdzWzBdWzoxXSA9PSAiLSI6CisgICAgICBhcmcgPSBhcmdzWzBdCisgICAgICBpZiAoYXJnID09ICItLSIpOgorICAgICAgICBicmVhaworICAgICAgaWYgc2VsZi5fcGFyc2VyLmhhc19vcHRpb24oYXJnLnNwbGl0KCI9IilbMF0pOgorICAgICAgICBrbm93bl9hcmdzICs9IFthcmddCisgICAgICBlbHNlOgorICAgICAgICBzZWxmLl90b29sX2ZsYWdzICs9IFthcmddCisgICAgICBhcmdzID0gYXJnc1sxOl0KKworICAgIGlmIGxlbihhcmdzKSA+IDA6CisgICAgICBrbm93bl9hcmdzICs9IGFyZ3MKKworICAgIHNlbGYuX29wdGlvbnMsIHNlbGYuX2FyZ3MgPSBzZWxmLl9wYXJzZXIucGFyc2VfYXJncyhrbm93bl9hcmdzKQorCisgICAgc2VsZi5fdGltZW91dCA9IGludChzZWxmLl9vcHRpb25zLnRpbWVvdXQpCisgICAgc2VsZi5fc291cmNlX2RpciA9IHNlbGYuX29wdGlvbnMuc291cmNlX2RpcgorICAgIGlmIHNlbGYuX29wdGlvbnMua2VlcF9sb2dzOgorICAgICAgIyBsb2dfcGFyZW50X2RpciBoYXMgdHJhaWxpbmcgc2xhc2ggaWYgbm9uLWVtcHR5CisgICAgICBzZWxmLmxvZ19kaXIgPSBzZWxmLmxvZ19wYXJlbnRfZGlyICsgIiVzLmxvZ3MiICUgc2VsZi5Ub29sTmFtZSgpCisgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmxvZ19kaXIpOgorICAgICAgICBzaHV0aWwucm10cmVlKHNlbGYubG9nX2RpcikKKyAgICAgIG9zLm1rZGlyKHNlbGYubG9nX2RpcikKKyAgICAgIGxvZ2dpbmcuaW5mbygiTG9ncyBhcmUgaW4gIiArIHNlbGYubG9nX2RpcikKKworICAgIHNlbGYuX2lnbm9yZV9leGl0X2NvZGUgPSBzZWxmLl9vcHRpb25zLmlnbm9yZV9leGl0X2NvZGUKKyAgICBpZiBzZWxmLl9vcHRpb25zLmd0ZXN0X2ZpbHRlciAhPSAiIjoKKyAgICAgIHNlbGYuX2FyZ3MuYXBwZW5kKCItLWd0ZXN0X2ZpbHRlcj0lcyIgJSBzZWxmLl9vcHRpb25zLmd0ZXN0X2ZpbHRlcikKKyAgICBpZiBzZWxmLl9vcHRpb25zLmd0ZXN0X3JlcGVhdDoKKyAgICAgIHNlbGYuX2FyZ3MuYXBwZW5kKCItLWd0ZXN0X3JlcGVhdD0lcyIgJSBzZWxmLl9vcHRpb25zLmd0ZXN0X3JlcGVhdCkKKyAgICBpZiBzZWxmLl9vcHRpb25zLmd0ZXN0X3ByaW50X3RpbWU6CisgICAgICBzZWxmLl9hcmdzLmFwcGVuZCgiLS1ndGVzdF9wcmludF90aW1lIikKKworICAgIHJldHVybiBUcnVlCisKKyAgZGVmIFNldHVwKHNlbGYsIGFyZ3MpOgorICAgIHJldHVybiBzZWxmLlBhcnNlQXJndihhcmdzKQorCisgIGRlZiBUb29sQ29tbWFuZChzZWxmKToKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yLCAiVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGltcGxlbWVudGVkICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiB0aGUgdG9vbC1zcGVjaWZpYyBzdWJjbGFzcyIKKworICBkZWYgQ2xlYW51cChzZWxmKToKKyAgICAjIFlvdSBtYXkgb3ZlcnJpZGUgaXQgaW4gdGhlIHRvb2wtc3BlY2lmaWMgc3ViY2xhc3MKKyAgICBwYXNzCisKKyAgZGVmIEV4ZWN1dGUoc2VsZik6CisgICAgIiIiIEV4ZWN1dGUgdGhlIGFwcCB0byBiZSB0ZXN0ZWQgYWZ0ZXIgc3VjY2Vzc2Z1bCBpbnN0cnVtZW50YXRpb24uCisgICAgRnVsbCBleGVjdXRpb24gY29tbWFuZC1saW5lIHByb3ZpZGVkIGJ5IHN1YmNsYXNzZXJzIHZpYSBwcm9jLiIiIgorICAgIGxvZ2dpbmcuaW5mbygic3RhcnRpbmcgZXhlY3V0aW9uLi4uIikKKyAgICBwcm9jID0gc2VsZi5Ub29sQ29tbWFuZCgpCisgICAgZm9yIHZhciBpbiBzZWxmLl9lbnY6CisgICAgICBjb21tb24uUHV0RW52QW5kTG9nKHZhciwgc2VsZi5fZW52W3Zhcl0pCisgICAgcmV0dXJuIGNvbW1vbi5SdW5TdWJwcm9jZXNzKHByb2MsIHNlbGYuX3RpbWVvdXQpCisKKyAgZGVmIFJ1blRlc3RzQW5kQW5hbHl6ZShzZWxmLCBjaGVja19zYW5pdHkpOgorICAgIGV4ZWNfcmV0Y29kZSA9IHNlbGYuRXhlY3V0ZSgpCisgICAgYW5hbHl6ZV9yZXRjb2RlID0gc2VsZi5BbmFseXplKGNoZWNrX3Nhbml0eSkKKworICAgIGlmIGFuYWx5emVfcmV0Y29kZToKKyAgICAgIGxvZ2dpbmcuZXJyb3IoIkFuYWx5emUgZmFpbGVkLiIpCisgICAgICBsb2dnaW5nLmluZm8oIlNlYXJjaCB0aGUgbG9nIGZvciAnW0VSUk9SXScgdG8gc2VlIHRoZSBlcnJvciByZXBvcnRzLiIpCisgICAgICByZXR1cm4gYW5hbHl6ZV9yZXRjb2RlCisKKyAgICBpZiBleGVjX3JldGNvZGU6CisgICAgICBpZiBzZWxmLl9pZ25vcmVfZXhpdF9jb2RlOgorICAgICAgICBsb2dnaW5nLmluZm8oIlRlc3QgZXhlY3V0aW9uIGZhaWxlZCwgYnV0IHRoZSBleGl0IGNvZGUgaXMgaWdub3JlZC4iKQorICAgICAgZWxzZToKKyAgICAgICAgbG9nZ2luZy5lcnJvcigiVGVzdCBleGVjdXRpb24gZmFpbGVkLiIpCisgICAgICAgIHJldHVybiBleGVjX3JldGNvZGUKKyAgICBlbHNlOgorICAgICAgbG9nZ2luZy5pbmZvKCJUZXN0IGV4ZWN1dGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiIpCisKKyAgICBpZiBub3QgYW5hbHl6ZV9yZXRjb2RlOgorICAgICAgbG9nZ2luZy5pbmZvKCJBbmFseXNpcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiIpCisKKyAgICByZXR1cm4gMAorCisgIGRlZiBNYWluKHNlbGYsIGFyZ3MsIGNoZWNrX3Nhbml0eSwgbWluX3J1bnRpbWVfaW5fc2Vjb25kcyk6CisgICAgIiIiQ2FsbCB0aGlzIHRvIHJ1biB0aHJvdWdoIHRoZSB3aG9sZSBwcm9jZXNzOiBTZXR1cCwgRXhlY3V0ZSwgQW5hbHl6ZSIiIgorICAgIHN0YXJ0X3RpbWUgPSBkYXRldGltZS5kYXRldGltZS5ub3coKQorICAgIHJldGNvZGUgPSAtMQorICAgIGlmIHNlbGYuU2V0dXAoYXJncyk6CisgICAgICByZXRjb2RlID0gc2VsZi5SdW5UZXN0c0FuZEFuYWx5emUoY2hlY2tfc2FuaXR5KQorICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLnRlbXBfZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpCisgICAgICBzZWxmLkNsZWFudXAoKQorICAgIGVsc2U6CisgICAgICBsb2dnaW5nLmVycm9yKCJTZXR1cCBmYWlsZWQiKQorICAgIGVuZF90aW1lID0gZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkKKyAgICBydW50aW1lX2luX3NlY29uZHMgPSAoZW5kX3RpbWUgLSBzdGFydF90aW1lKS5zZWNvbmRzCisgICAgaG91cnMgPSBydW50aW1lX2luX3NlY29uZHMgLyAzNjAwCisgICAgc2Vjb25kcyA9IHJ1bnRpbWVfaW5fc2Vjb25kcyAlIDM2MDAKKyAgICBtaW51dGVzID0gc2Vjb25kcyAvIDYwCisgICAgc2Vjb25kcyA9IHNlY29uZHMgJSA2MAorICAgIGxvZ2dpbmcuaW5mbygiZWxhcHNlZCB0aW1lOiAlMDJkOiUwMmQ6JTAyZCIgJSAoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMpKQorICAgIGlmIChtaW5fcnVudGltZV9pbl9zZWNvbmRzID4gMCBhbmQKKyAgICAgICAgcnVudGltZV9pbl9zZWNvbmRzIDwgbWluX3J1bnRpbWVfaW5fc2Vjb25kcyk6CisgICAgICBsb2dnaW5nLmVycm9yKCJMYXlvdXQgdGVzdHMgZmluaXNoZWQgdG9vIHF1aWNrbHkuICIKKyAgICAgICAgICAgICAgICAgICAgIkl0IHNob3VsZCBoYXZlIHRha2VuIGF0IGxlYXN0ICVkIHNlY29uZHMuICIKKyAgICAgICAgICAgICAgICAgICAgIlNvbWV0aGluZyB3ZW50IHdyb25nPyIgJSBtaW5fcnVudGltZV9pbl9zZWNvbmRzKQorICAgICAgcmV0Y29kZSA9IC0xCisgICAgcmV0dXJuIHJldGNvZGUKKworICBkZWYgUnVuKHNlbGYsIGFyZ3MsIG1vZHVsZSwgbWluX3J1bnRpbWVfaW5fc2Vjb25kcz0wKToKKyAgICBNT0RVTEVTX1RPX1NBTklUWV9DSEVDSyA9IFsiYmFzZSJdCisKKyAgICBjaGVja19zYW5pdHkgPSBtb2R1bGUgaW4gTU9EVUxFU19UT19TQU5JVFlfQ0hFQ0sKKyAgICByZXR1cm4gc2VsZi5NYWluKGFyZ3MsIGNoZWNrX3Nhbml0eSwgbWluX3J1bnRpbWVfaW5fc2Vjb25kcykKKworCitjbGFzcyBEck1lbW9yeShCYXNlVG9vbCk6CisgICIiIkRyLk1lbW9yeQorICBEeW5hbWljIG1lbW9yeSBlcnJvciBkZXRlY3RvciBmb3IgV2luZG93cy4KKworICBodHRwOi8vZGV2LmNocm9taXVtLm9yZy9kZXZlbG9wZXJzL2hvdy10b3MvdXNpbmctZHJtZW1vcnkKKyAgSXQgaXMgbm90IHZlcnkgbWF0dXJlIGF0IHRoZSBtb21lbnQsIHNvbWUgdGhpbmdzIG1pZ2h0IG5vdCB3b3JrIHByb3Blcmx5LgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgZnVsbF9tb2RlLCBwYXR0ZXJuX21vZGUpOgorICAgIHN1cGVyKERyTWVtb3J5LCBzZWxmKS5fX2luaXRfXygpCisgICAgc2VsZi5mdWxsX21vZGUgPSBmdWxsX21vZGUKKyAgICBzZWxmLnBhdHRlcm5fbW9kZSA9IHBhdHRlcm5fbW9kZQorICAgIHNlbGYuUmVnaXN0ZXJPcHRpb25QYXJzZXJIb29rKERyTWVtb3J5LkV4dGVuZE9wdGlvblBhcnNlcikKKworICBkZWYgVG9vbE5hbWUoc2VsZik6CisgICAgcmV0dXJuICJkcm1lbW9yeSIKKworICBkZWYgRXh0ZW5kT3B0aW9uUGFyc2VyKHNlbGYsIHBhcnNlcik6CisgICAgcGFyc2VyLmFkZF9vcHRpb24oIiIsICItLXN1cHByZXNzaW9ucyIsIGRlZmF1bHQ9W10sCisgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSJhcHBlbmQiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InBhdGggdG8gYSBkcm1lbW9yeSBzdXBwcmVzc2lvbiBmaWxlIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiIiwgIi0tZm9sbG93X3B5dGhvbiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwgZGVzdD0iZm9sbG93X3B5dGhvbiIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iTW9uaXRvciBweXRob24gY2hpbGQgcHJvY2Vzc2VzLiAgSWYgb2ZmLCBuZWl0aGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAicHl0aG9uIGNoaWxkcmVuIG5vciBhbnkgY2hpbGRyZW4gb2YgcHl0aG9uIGNoaWxkcmVuICIKKyAgICAgICAgICAgICAgICAgICAgICAid2lsbCBiZSBtb25pdG9yZWQuIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiIiwgIi0taW5kaXJlY3RfcGRmaXVtX3Rlc3QiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0ic2V0IC0td3JhcHBlciByYXRoZXIgdGhhbiBydW5uaW5nIERyLiBNZW1vcnkgIgorICAgICAgICAgICAgICAgICAgICAgICJkaXJlY3RseS4iKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCIiLCAiLS11c2VfZGVidWciLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsIGRlc3Q9InVzZV9kZWJ1ZyIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iUnVuIERyLiBNZW1vcnkgZGVidWcgYnVpbGQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCIiLCAiLS10cmFjZV9jaGlsZHJlbiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlRPRE86IGRlZmF1bHQgdmFsdWUgZGlmZmVycyBmcm9tIFZhbGdyaW5kIikKKworICBkZWYgVG9vbENvbW1hbmQoc2VsZik6CisgICAgIiIiR2V0IHRoZSB0b29sIGNvbW1hbmQgdG8gcnVuLiIiIgorICAgICMgV0lOSEVBUCBpcyB3aGF0IERyLiBNZW1vcnkgc3VwcG9ydHMgYXMgdGhlcmUgYXJlIGlzc3VlcyB3LyBib3RoCisgICAgIyBqZW1hbGxvYyAoaHR0cHM6Ly9naXRodWIuY29tL0R5bmFtb1JJTy9kcm1lbW9yeS9pc3N1ZXMvMzIwKSBhbmQKKyAgICAjIHRjbWFsbG9jIChodHRwczovL2dpdGh1Yi5jb20vRHluYW1vUklPL2RybWVtb3J5L2lzc3Vlcy8zMTQpCisgICAgYWRkX2VudiA9IHsKKyAgICAgICJDSFJPTUVfQUxMT0NBVE9SIiA6ICJXSU5IRUFQIiwKKyAgICAgICJKU0lNRF9GT1JDRU1NWCIgICA6ICIxIiwgICMgaHR0cHM6Ly9naXRodWIuY29tL0R5bmFtb1JJTy9kcm1lbW9yeS9pc3N1ZXMvNTQwCisgICAgfQorICAgIGZvciBrLHYgaW4gYWRkX2Vudi5pdGVyaXRlbXMoKToKKyAgICAgIGxvZ2dpbmcuaW5mbygiZXhwb3J0ICVzPSVzIiwgaywgdikKKyAgICAgIG9zLnB1dGVudihrLCB2KQorCisgICAgZHJtZW1fY21kID0gb3MuZ2V0ZW52KCJEUk1FTU9SWV9DT01NQU5EIikKKyAgICBpZiBub3QgZHJtZW1fY21kOgorICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiUGxlYXNlIHNldCBEUk1FTU9SWV9DT01NQU5EIGVudmlyb25tZW50IHZhcmlhYmxlICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCB0aGUgcGF0aCB0byBkcm1lbW9yeS5leGUiCisgICAgcHJvYyA9IGRybWVtX2NtZC5zcGxpdCgiICIpCisKKyAgICAjIEJ5IGRlZmF1bHQsIGRvbid0IHJ1biBweXRob24gKHRoaXMgd2lsbCBleGNsdWRlIHB5dGhvbidzIGNoaWxkcmVuIGFzIHdlbGwpCisgICAgIyB0byByZWR1Y2UgcnVudGltZS4gIFdlJ3JlIG5vdCByZWFsbHkgaW50ZXJlc3RlZCBpbiBzcGVuZGluZyB0aW1lIGZpbmRpbmcKKyAgICAjIGJ1Z3MgaW4gdGhlIHB5dGhvbiBpbXBsZW1lbnRhdGlvbi4KKyAgICAjIFdpdGggZmlsZS1iYXNlZCBjb25maWcgd2UgbXVzdCB1cGRhdGUgdGhlIGZpbGUgZXZlcnkgdGltZSwgYW5kCisgICAgIyBpdCB3aWxsIGFmZmVjdCBzaW11bHRhbmVvdXMgZHJtZW0gdXNlcyBieSB0aGlzIHVzZXIuICBXaGlsZSBmaWxlLWJhc2VkCisgICAgIyBjb25maWcgaGFzIG1hbnkgYWR2YW50YWdlcywgaGVyZSB3ZSBtYXkgd2FudCB0aGlzLWluc3RhbmNlLW9ubHkKKyAgICAjIChodHRwczovL2dpdGh1Yi5jb20vRHluYW1vUklPL2RybWVtb3J5L2lzc3Vlcy8zMzQpLgorICAgIGRyY29uZmlnX2NtZCA9IFsgcHJvY1swXS5yZXBsYWNlKCJkcm1lbW9yeS5leGUiLCAiZHJjb25maWcuZXhlIikgXQorICAgIGRyY29uZmlnX2NtZCArPSBbIi1xdWlldCJdICMgc3VwcHJlc3MgZXJyb3JzIGFib3V0IG5vIDY0LWJpdCBsaWJzCisgICAgcnVuX2RyY29uZmlnID0gVHJ1ZQorICAgIGlmIHNlbGYuX29wdGlvbnMuZm9sbG93X3B5dGhvbjoKKyAgICAgIGxvZ2dpbmcuaW5mbygiRm9sbG93aW5nIHB5dGhvbiBjaGlsZHJlbiIpCisgICAgICAjIC11bnJlZyBmYWlscyBpZiBub3QgYWxyZWFkeSByZWdpc3RlcmVkIHNvIHF1ZXJ5IGZvciB0aGF0IGZpcnN0CisgICAgICBxdWVyeV9jbWQgPSBkcmNvbmZpZ19jbWQgKyBbIi1pc3JlZyIsICJweXRob24uZXhlIl0KKyAgICAgIHF1ZXJ5X3Byb2MgPSBzdWJwcm9jZXNzLlBvcGVuKHF1ZXJ5X2NtZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWxsPVRydWUpCisgICAgICAocXVlcnlfb3V0LCBxdWVyeV9lcnIpID0gcXVlcnlfcHJvYy5jb21tdW5pY2F0ZSgpCisgICAgICBpZiByZS5zZWFyY2goImV4ZSBub3QgcmVnaXN0ZXJlZCIsIHF1ZXJ5X291dCk6CisgICAgICAgIHJ1bl9kcmNvbmZpZyA9IEZhbHNlICMgYWxsIHNldAorICAgICAgZWxzZToKKyAgICAgICAgZHJjb25maWdfY21kICs9IFsiLXVucmVnIiwgInB5dGhvbi5leGUiXQorICAgIGVsc2U6CisgICAgICBsb2dnaW5nLmluZm8oIkV4Y2x1ZGluZyBweXRob24gY2hpbGRyZW4iKQorICAgICAgZHJjb25maWdfY21kICs9IFsiLXJlZyIsICJweXRob24uZXhlIiwgIi1ub3J1biJdCisgICAgaWYgcnVuX2RyY29uZmlnOgorICAgICAgZHJjb25maWdfcmV0Y29kZSA9IGNvbW1vbi5SdW5TdWJwcm9jZXNzKGRyY29uZmlnX2NtZCwgc2VsZi5fdGltZW91dCkKKyAgICAgIGlmIGRyY29uZmlnX3JldGNvZGU6CisgICAgICAgIGxvZ2dpbmcuZXJyb3IoIkNvbmZpZ3VyaW5nIHdoZXRoZXIgdG8gZm9sbG93IHB5dGhvbiBjaGlsZHJlbiBmYWlsZWQgIiBcCisgICAgICAgICAgICAgICAgICAgICAgIndpdGggJWQuIiwgZHJjb25maWdfcmV0Y29kZSkKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiQ29uZmlndXJpbmcgcHl0aG9uIGNoaWxkcmVuIGZhaWxlZCAiCisKKyAgICBzdXBwcmVzc2lvbl9jb3VudCA9IDAKKyAgICBzdXBwX2ZpbGVzID0gc2VsZi5fb3B0aW9ucy5zdXBwcmVzc2lvbnMKKyAgICBpZiBzZWxmLmZ1bGxfbW9kZToKKyAgICAgIHN1cHBfZmlsZXMgKz0gW3MucmVwbGFjZSgiLnR4dCIsICJfZnVsbC50eHQiKSBmb3IgcyBpbiBzdXBwX2ZpbGVzXQorICAgIGZvciBzdXBwcmVzc2lvbl9maWxlIGluIHN1cHBfZmlsZXM6CisgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzdXBwcmVzc2lvbl9maWxlKToKKyAgICAgICAgc3VwcHJlc3Npb25fY291bnQgKz0gMQorICAgICAgICBwcm9jICs9IFsiLXN1cHByZXNzIiwgY29tbW9uLk5vcm1hbGl6ZVdpbmRvd3NQYXRoKHN1cHByZXNzaW9uX2ZpbGUpXQorCisgICAgaWYgbm90IHN1cHByZXNzaW9uX2NvdW50OgorICAgICAgbG9nZ2luZy53YXJuaW5nKCJXQVJOSU5HOiBOT1QgVVNJTkcgU1VQUFJFU1NJT05TISIpCisKKyAgICAjIFVuLWNvbW1lbnQgdG8gZHVtcCBEci5NZW1vcnkgZXZlbnRzIG9uIGVycm9yCisgICAgI3Byb2MgKz0gWyItZHJfb3BzIiwgIi1kdW1wY29yZV9tYXNrIiwgIi1kcl9vcHMiLCAiMHg4YmZmIl0KKworICAgICMgVW4tY29tbWVudCBhbmQgY29tbWVudCBuZXh0IGxpbmUgdG8gZGVidWcgRHIuTWVtb3J5CisgICAgI3Byb2MgKz0gWyItZHJfb3BzIiwgIi1ub19oaWRlIl0KKyAgICAjcHJvYyArPSBbIi1kcl9vcHMiLCAiLW1zZ2JveF9tYXNrIiwgIi1kcl9vcHMiLCAiMTUiXQorICAgICNQcm9jICs9IFsiLWRyX29wcyIsICItc3RkZXJyX21hc2siLCAiLWRyX29wcyIsICIxNSJdCisgICAgIyBFbnN1cmUgd2Ugc2VlIG1lc3NhZ2VzIGFib3V0IERyLiBNZW1vcnkgY3Jhc2hpbmchCisgICAgcHJvYyArPSBbIi1kcl9vcHMiLCAiLXN0ZGVycl9tYXNrIiwgIi1kcl9vcHMiLCAiMTIiXQorCisgICAgaWYgc2VsZi5fb3B0aW9ucy51c2VfZGVidWc6CisgICAgICBwcm9jICs9IFsiLWRlYnVnIl0KKworICAgIHByb2MgKz0gWyItbG9nZGlyIiwgY29tbW9uLk5vcm1hbGl6ZVdpbmRvd3NQYXRoKHNlbGYubG9nX2RpcildCisKKyAgICBpZiBzZWxmLmxvZ19wYXJlbnRfZGlyOgorICAgICAgIyBncHUgcHJvY2VzcyBvbiBXaW5kb3dzIFZpc3RhKyBydW5zIGF0IExvdyBJbnRlZ3JpdHkgYW5kIGNhbiBvbmx5CisgICAgICAjIHdyaXRlIHRvIGNlcnRhaW4gZGlyZWN0b3JpZXMgKGh0dHA6Ly9jcmJ1Zy5jb20vMTE5MTMxKQorICAgICAgc3ltY2FjaGVfZGlyID0gb3MucGF0aC5qb2luKHNlbGYubG9nX3BhcmVudF9kaXIsICJkcm1lbW9yeS5zeW1jYWNoZSIpCisgICAgZWxpZiBzZWxmLl9vcHRpb25zLmJ1aWxkX2RpcjoKKyAgICAgICMgVGhlIG90aGVyIGNhc2UgaXMgb25seSBwb3NzaWJsZSB3aXRoIC10IGNtZGxpbmUuCisgICAgICAjIEFueXdheXMsIGlmIHdlIG9taXQgLXN5bWNhY2hlX2RpciB0aGUgLWxvZ2RpcidzIHZhbHVlIGlzIHVzZWQgd2hpY2gKKyAgICAgICMgc2hvdWxkIGJlIGZpbmUuCisgICAgICBzeW1jYWNoZV9kaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi5fb3B0aW9ucy5idWlsZF9kaXIsICJkcm1lbW9yeS5zeW1jYWNoZSIpCisgICAgaWYgc3ltY2FjaGVfZGlyOgorICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHN5bWNhY2hlX2Rpcik6CisgICAgICAgIHRyeToKKyAgICAgICAgICBvcy5ta2RpcihzeW1jYWNoZV9kaXIpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgIGxvZ2dpbmcud2FybmluZygiQ2FuJ3QgY3JlYXRlIHN5bWNhY2hlIGRpcj8iKQorICAgICAgaWYgb3MucGF0aC5leGlzdHMoc3ltY2FjaGVfZGlyKToKKyAgICAgICAgcHJvYyArPSBbIi1zeW1jYWNoZV9kaXIiLCBjb21tb24uTm9ybWFsaXplV2luZG93c1BhdGgoc3ltY2FjaGVfZGlyKV0KKworICAgICMgVXNlIC1ub19zdW1tYXJ5IHRvIHN1cHByZXNzIERyTWVtb3J5J3Mgc3VtbWFyeSBhbmQgaW5pdC10aW1lCisgICAgIyBub3RpZmljYXRpb25zLiAgV2UgZ2VuZXJhdGUgb3VyIG93biB3aXRoIGRybWVtb3J5X2FuYWx5emUucHkuCisgICAgcHJvYyArPSBbIi1iYXRjaCIsICItbm9fc3VtbWFyeSJdCisKKyAgICAjIFVuLWNvbW1lbnQgdG8gZGlzYWJsZSBpbnRlcmxlYXZlZCBvdXRwdXQuICBXaWxsIGFsc28gc3VwcHJlc3MgZXJyb3IKKyAgICAjIG1lc3NhZ2VzIG5vcm1hbGx5IHByaW50ZWQgdG8gc3RkZXJyLgorICAgICNwcm9jICs9IFsiLXF1aWV0IiwgIi1ub19yZXN1bHRzX3RvX3N0ZGVyciJdCisKKyAgICBwcm9jICs9IFsiLWNhbGxzdGFja19tYXhfZnJhbWVzIiwgIjQwIl0KKworICAgICMgZGlzYWJsZSBsZWFrIHNjYW4gZm9yIG5vdworICAgIHByb2MgKz0gWyItbm9fY291bnRfbGVha3MiLCAiLW5vX2xlYWtfc2NhbiJdCisKKyAgICAjIGRpc2FibGUgd2FybmluZ3MgYWJvdXQgdW5hZGRyZXNzYWJsZSBwcmVmZXRjaGVzCisgICAgcHJvYyArPSBbIi1ub19jaGVja19wcmVmZXRjaCJdCisKKyAgICAjIGNyYnVnLmNvbS80MTMyMTUsIG5vIGhlYXAgbWlzbWF0Y2ggY2hlY2sgZm9yIFdpbmRvd3MgcmVsZWFzZSBidWlsZCBiaW5hcnkKKyAgICBpZiBjb21tb24uSXNXaW5kb3dzKCkgYW5kICJSZWxlYXNlIiBpbiBzZWxmLl9vcHRpb25zLmJ1aWxkX2RpcjoKKyAgICAgICAgcHJvYyArPSBbIi1ub19jaGVja19kZWxldGVfbWlzbWF0Y2giXQorCisgICAgIyBtYWtlIGNhbGxzdGFja3MgZWFzaWVyIHRvIHJlYWQKKyAgICBwcm9jICs9IFsiLWNhbGxzdGFja19zcmNmaWxlX3ByZWZpeCIsCisgICAgICAgICAgICAgImJ1aWxkXFxzcmMsY2hyb21pdW1cXHNyYyxjcnRfYnVpbGRcXHNlbGZfeDg2Il0KKyAgICBwcm9jICs9IFsiLWNhbGxzdGFja19tb2RuYW1lX2hpZGUiLAorICAgICAgICAgICAgICIqZHJtZW1vcnkqLGNocm9tZS5kbGwiXQorCisgICAgYm9yaW5nX2NhbGxlcnMgPSBjb21tb24uQm9yaW5nQ2FsbGVycyhtYW5nbGVkPUZhbHNlLCB1c2VfcmVfd2lsZGNhcmRzPUZhbHNlKQorICAgICMgVE9ETyh0aW11cnJycik6IEluIGZhY3QsIHdlIHdhbnQgInN0YXJ0aW5nIGZyb20gLi4iIGluc3RlYWQgb2YgImJlbG93IC4uIgorICAgIHByb2MgKz0gWyItY2FsbHN0YWNrX3RydW5jYXRlX2JlbG93IiwgIiwiLmpvaW4oYm9yaW5nX2NhbGxlcnMpXQorCisgICAgaWYgc2VsZi5wYXR0ZXJuX21vZGU6CisgICAgICBwcm9jICs9IFsiLXBhdHRlcm4iLCAiMHhmMWZkIiwgIi1ub19jb3VudF9sZWFrcyIsICItcmVkem9uZV9zaXplIiwgIjB4MjAiXQorICAgIGVsaWYgbm90IHNlbGYuZnVsbF9tb2RlOgorICAgICAgcHJvYyArPSBbIi1saWdodCJdCisKKyAgICBwcm9jICs9IHNlbGYuX3Rvb2xfZmxhZ3MKKworICAgICMgRHIuTWVtb3J5IHJlcXVpcmVzIC0tIHRvIHNlcGFyYXRlIHRvb2wgZmxhZ3MgZnJvbSB0aGUgZXhlY3V0YWJsZSBuYW1lLgorICAgIHByb2MgKz0gWyItLSJdCisKKyAgICBpZiBzZWxmLl9vcHRpb25zLmluZGlyZWN0X3BkZml1bV90ZXN0OgorICAgICAgd3JhcHBlciA9ICIgIi5qb2luKHByb2MpCisgICAgICBsb2dnaW5nLmluZm8oInBkZml1bSB3cmFwcGVyID0gIiArIHdyYXBwZXIpCisgICAgICBwcm9jID0gc2VsZi5fYXJncworICAgICAgcHJvYyArPSBbIi0td3JhcHBlciIsIHdyYXBwZXJdCisgICAgICByZXR1cm4gcHJvYworCisgICAgIyBOb3RlIHRoYXQgc2VsZi5fYXJncyBiZWdpbnMgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZXhlIHRvIGJlIHJ1bi4KKyAgICBzZWxmLl9hcmdzWzBdID0gY29tbW9uLk5vcm1hbGl6ZVdpbmRvd3NQYXRoKHNlbGYuX2FyZ3NbMF0pCisgICAgcHJvYyArPSBzZWxmLl9hcmdzCisgICAgcmV0dXJuIHByb2MKKworICBkZWYgQ3JlYXRlQnJvd3NlcldyYXBwZXIoc2VsZiwgY29tbWFuZCk6CisgICAgb3MucHV0ZW52KCJCUk9XU0VSX1dSQVBQRVIiLCBjb21tYW5kKQorCisgIGRlZiBBbmFseXplKHNlbGYsIGNoZWNrX3Nhbml0eT1GYWxzZSk6CisgICAgIyBVc2Ugb25lIGFuYWx5emVyIGZvciBhbGwgdGhlIGxvZyBmaWxlcyB0byBhdm9pZCBwcmludGluZyBkdXBsaWNhdGUgcmVwb3J0cworICAgICMKKyAgICAjIFRPRE8odGltdXJycnIpOiB1bmlmeSB0aGlzIHdpdGggVmFsZ3JpbmQgYW5kIG90aGVyIHRvb2xzIHdoZW4gd2UgaGF2ZQorICAgICMgaHR0cHM6Ly9naXRodWIuY29tL0R5bmFtb1JJTy9kcm1lbW9yeS9pc3N1ZXMvNjg0CisgICAgYW5hbHl6ZXIgPSBkcm1lbW9yeV9hbmFseXplLkRyTWVtb3J5QW5hbHl6ZXIoKQorCisgICAgcmV0ID0gMAorICAgIGlmIG5vdCBzZWxmLl9vcHRpb25zLmluZGlyZWN0X3BkZml1bV90ZXN0OgorICAgICAgZmlsZW5hbWVzID0gZ2xvYi5nbG9iKHNlbGYubG9nX2RpciArICIvKi9yZXN1bHRzLnR4dCIpCisKKyAgICAgIHJldCA9IGFuYWx5emVyLlJlcG9ydChmaWxlbmFtZXMsIE5vbmUsIGNoZWNrX3Nhbml0eSkKKyAgICBlbHNlOgorICAgICAgdGVzdGNhc2VzID0gZ2xvYi5nbG9iKHNlbGYubG9nX2RpciArICIvdGVzdGNhc2UuKi5sb2dzIikKKyAgICAgICMgSWYgd2UgaGF2ZSBicm93c2VyIHdyYXBwZXIsIHRoZSBwZXItdGVzdCBsb2dkaXJzIGFyZSBuYW1lZCBhcworICAgICAgIyAidGVzdGNhc2Uud3JhcHBlcl9QSUQubmFtZSIuCisgICAgICAjIExldCdzIGV4dHJhY3QgdGhlIGxpc3Qgb2Ygd3JhcHBlcl9QSURzIGFuZCBuYW1lIGl0IHBwaWRzLgorICAgICAgIyBOT1RFOiBwcGlkcyBtYXkgY29udGFpbiAnXycsIGkuZS4gdGhleSBhcmUgbm90IGludHMhCisgICAgICBwcGlkcyA9IHNldChbZi5zcGxpdCgiLiIpWy0yXSBmb3IgZiBpbiB0ZXN0Y2FzZXNdKQorCisgICAgICBmb3IgcHBpZCBpbiBwcGlkczoKKyAgICAgICAgdGVzdGNhc2VfbmFtZSA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgIGYgPSBvcGVuKCIlcy90ZXN0Y2FzZS4lcy5uYW1lIiAlIChzZWxmLmxvZ19kaXIsIHBwaWQpKQorICAgICAgICAgIHRlc3RjYXNlX25hbWUgPSBmLnJlYWQoKS5zdHJpcCgpCisgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgIHBhc3MKKyAgICAgICAgcHJpbnQgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorICAgICAgICBwcmludCAiIEJlbG93IGlzIHRoZSByZXBvcnQgZm9yIGRybWVtb3J5IHdyYXBwZXIgUElEPSVzLiIgJSBwcGlkCisgICAgICAgIGlmIHRlc3RjYXNlX25hbWU6CisgICAgICAgICAgcHJpbnQgIiBJdCB3YXMgdXNlZCB3aGlsZSBydW5uaW5nIHRoZSBgJXNgIHRlc3QuIiAlIHRlc3RjYXNlX25hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAjIFRPRE8odGltdXJycnIpOiBobSwgdGhlIFBJRCBsaW5lIGlzIHN1cHByZXNzZWQgb24gV2luZG93cy4uLgorICAgICAgICAgIHByaW50ICIgWW91IGNhbiBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIHRlc3QiCisgICAgICAgICAgcHJpbnQgIiBieSBzZWFyY2hpbmcgdGhlIGFib3ZlIGxvZyBmb3IgJ1BJRD0lcyciICUgcHBpZAorICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICAgICAgcHBpZF9maWxlbmFtZXMgPSBnbG9iLmdsb2IoIiVzL3Rlc3RjYXNlLiVzLmxvZ3MvKi9yZXN1bHRzLnR4dCIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5sb2dfZGlyLCBwcGlkKSkKKyAgICAgICAgcmV0IHw9IGFuYWx5emVyLlJlcG9ydChwcGlkX2ZpbGVuYW1lcywgdGVzdGNhc2VfbmFtZSwgRmFsc2UpCisgICAgICAgIHByaW50ICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKKyAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisKKyAgICBsb2dnaW5nLmluZm8oIlBsZWFzZSBzZWUgaHR0cDovL2Rldi5jaHJvbWl1bS5vcmcvZGV2ZWxvcGVycy9ob3ctdG9zLyIKKyAgICAgICAgICAgICAgICAgInVzaW5nLWRybWVtb3J5IGZvciB0aGUgaW5mbyBvbiBEci4gTWVtb3J5IikKKyAgICByZXR1cm4gcmV0CisKKworY2xhc3MgVG9vbEZhY3Rvcnk6CisgIGRlZiBDcmVhdGUoc2VsZiwgdG9vbF9uYW1lKToKKyAgICBpZiB0b29sX25hbWUgPT0gImRybWVtb3J5IiBvciB0b29sX25hbWUgPT0gImRybWVtb3J5X2xpZ2h0IjoKKyAgICAgICMgVE9ETyh0aW11cnJycik6IHJlbW92ZSBzdXBwb3J0IGZvciAiZHJtZW1vcnkiIHdoZW4gYnVpbGRib3RzIGFyZQorICAgICAgIyBzd2l0Y2hlZCB0byBkcm1lbW9yeV9saWdodCBPUiBtYWtlIGRybWVtb3J5PT1kcm1lbW9yeV9mdWxsIHRoZSBkZWZhdWx0CisgICAgICAjIG1vZGUgd2hlbiB0aGUgdG9vbCBpcyBtYXR1cmUgZW5vdWdoLgorICAgICAgcmV0dXJuIERyTWVtb3J5KEZhbHNlLCBGYWxzZSkKKyAgICBpZiB0b29sX25hbWUgPT0gImRybWVtb3J5X2Z1bGwiOgorICAgICAgcmV0dXJuIERyTWVtb3J5KFRydWUsIEZhbHNlKQorICAgIGlmIHRvb2xfbmFtZSA9PSAiZHJtZW1vcnlfcGF0dGVybiI6CisgICAgICByZXR1cm4gRHJNZW1vcnkoRmFsc2UsIFRydWUpCisgICAgdHJ5OgorICAgICAgcGxhdGZvcm1fbmFtZSA9IGNvbW1vbi5QbGF0Zm9ybU5hbWVzKClbMF0KKyAgICBleGNlcHQgY29tbW9uLk5vdEltcGxlbWVudGVkRXJyb3I6CisgICAgICBwbGF0Zm9ybV9uYW1lID0gc3lzLnBsYXRmb3JtICsgIihVbmtub3duKSIKKyAgICByYWlzZSBSdW50aW1lRXJyb3IsICJVbmtub3duIHRvb2wgKHRvb2w9JXMsIHBsYXRmb3JtPSVzKSIgJSAodG9vbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybV9uYW1lKQorCitkZWYgQ3JlYXRlVG9vbCh0b29sKToKKyAgcmV0dXJuIFRvb2xGYWN0b3J5KCkuQ3JlYXRlKHRvb2wpCmRpZmYgLS1naXQgYS90b29scy9kcm1lbW9yeS9zdXBwcmVzc2lvbnMudHh0IGIvdG9vbHMvZHJtZW1vcnkvc3VwcHJlc3Npb25zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWQ4MjM2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZHJtZW1vcnkvc3VwcHJlc3Npb25zLnR4dApAQCAtMCwwICsxLDI4IEBACisjIFRoaXMgZmlsZSBjb250YWlucyBzdXBwcmVzc2lvbnMgZm9yIHRoZSBEci5NZW1vcnkgdG9vbCwgc2VlCisjIGh0dHA6Ly9kZXYuY2hyb21pdW0ub3JnL2RldmVsb3BlcnMvaG93LXRvcy91c2luZy1kcm1lbW9yeQorCisKKyMgSW50ZW5kZWQgYWxsb2MgZmFpbHVyZQorV0FSTklORworbmFtZT11bml0dGVzdHM6ZnhjcnQuRlhfQWxsb2NPdmVyZmxvdworZHJtZW1vcnlsaWIuZGxsIXJlcGxhY2VfY2FsbG9jCisuLi4KKyohZnhjcnRfRlhfKkFsbG9jT3ZlcmZsb3cqX1Rlc3Q6OlRlc3RCb2R5CisKKyMgRHJNZW0taSM0NzE6IHNpbXBsZSBmbG9hdGluZyByZWdpc3RlciBjb3B5IHdpdGhvdXQgbWVhbmluZ2Z1bCB1c2FnZQorVU5JTklUSUFMSVpFRCBSRUFECituYW1lPWVtYmVkZGVydGVzdHM6RHJNLWkjNDcxCisqIXY4OjppbnRlcm5hbDo6UmVnaXN0ZXJWYWx1ZXM6OkdldERvdWJsZVJlZ2lzdGVyCisqIXY4OjppbnRlcm5hbDo6RnJhbWVEZXNjcmlwdGlvbjo6R2V0RG91YmxlUmVnaXN0ZXIKKyohdjg6OmludGVybmFsOjpEZW9wdGltaXplcjo6Q29weURvdWJsZVJlZ2lzdGVycworKiF2ODo6aW50ZXJuYWw6OkRlb3B0aW1pemVyOjpEb0NvbXB1dGVDb21waWxlZFN0dWJGcmFtZQorKiF2ODo6aW50ZXJuYWw6OkRlb3B0aW1pemVyOjpEb0NvbXB1dGVPdXRwdXRGcmFtZXMKKyohdjg6OmludGVybmFsOjpEZW9wdGltaXplcjo6Q29tcHV0ZU91dHB1dEZyYW1lcworKiF2ODo6aW50ZXJuYWw6OmBhbm9ueW1vdXMgbmFtZXNwYWNlJzo6SW52b2tlCisqIXY4OjppbnRlcm5hbDo6RXhlY3V0aW9uOjpDYWxsCisKKyMgUERGaXVtLWkjMjg3OiBuZXcvZGVsZXRlW10gbWlzbWF0Y2gKK0lOVkFMSUQgSEVBUCBBUkdVTUVOVAorbmFtZT1pIzI4NzpuZXctZGVsZXRlLWFycmF5LW1pc21hdGNoCitkcm1lbW9yeWxpYi5kbGwhcmVwbGFjZV9vcGVyYXRvcl9kZWxldGVfYXJyYXkKKyohTnVtYmVybGlrZUFycmF5PD46On5OdW1iZXJsaWtlQXJyYXk8PgpkaWZmIC0tZ2l0IGEvdG9vbHMvbHNhbi9sc2FuX3N1cHByZXNzaW9ucy50eHQgYi90b29scy9sc2FuL2xzYW5fc3VwcHJlc3Npb25zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTMyYTljCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbHNhbi9sc2FuX3N1cHByZXNzaW9ucy50eHQKQEAgLTAsMCArMSwxOSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTGVha1Nhbml0aXplciBTdXBwcmVzc2lvbnMgZmlsZS4KKyMgSWYgYSBDTCBpbnRyb2R1Y2VzIGEgbmV3IGxlYWsgdGhhdCBpc24ndCB0aGUgZmF1bHQgb2YgdGhlIENMIGl0c2VsZiAoZS5nLiBhCisjIG5ldyB0ZXN0Y2FzZSksIHBsZWFzZSBhZGQgYSBzdXBwcmVzc2lvbiB0byB0aGlzIGZpbGUgc28gdGhhdCBpdCBjYW4gYmUKKyMgYWRkcmVzc2VkIGluIGEgZnV0dXJlIENMLgorIworIyBGb3IgdGhpcyBmaWxlIHRvIHRha2UgZWZmZWN0LAorIyBMU0FOX09QVElPTlM9J3N1cHByZXNzaW9ucz0vcGF0aC90by9sc2FuX3N1cHByZXNzaW9ucy50eHQnIG11c3QgYmUgaW4gdGhlCisjIGVudmlyb25tZW50LgorIyBTZWUgaHR0cHM6Ly93d3cuY2hyb21pdW0ub3JnL2RldmVsb3BlcnMvdGVzdGluZy9sZWFrc2FuaXRpemVyIGZvciBzeW50YXguCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENKU19PYmplY3QvQ0pTX0VtYmVkT2JqIHdyYXBwZWQgYnkgdjg6Ok9iamVjdCBjdXJyZW50bHkgbGVhay4gU2VlIGJ1ZyAyNjAuCisjIE9idmlvdXMgbGVha3M6CitsZWFrOipGWEpTX05ld0Z4RHluYW1pY09iaioKKworIyBDSlNfRmllbGQgQ0ZYX1dpZGVTdHJpbmc6OlN0cmluZ0RhdGEgbGVha3MKK2xlYWs6KkNKU19Eb2N1bWVudCpnZXRGaWVsZF9zdGF0aWMqCitsZWFrOipDSlNfRXZlbnRIYW5kbGVyKk9uRmllbGQqCmRpZmYgLS1naXQgYS91cGRhdGVfcGRmaXVtLnB5IGIvdXBkYXRlX3BkZml1bS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYTFkNGNiCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlX3BkZml1bS5weQpAQCAtMCwwICsxLDEzNCBAQAorIyEvdXNyL2Jpbi9weXRob24KKworaW1wb3J0IHVybGxpYjIKK2ltcG9ydCBvcworaW1wb3J0IHN5cworZnJvbSBzdWJwcm9jZXNzIGltcG9ydCBjYWxsCisKK0NIUk9NSVVNX1ZFUlNJT05fVFJBQ0tJTkdfVVJMID0gImh0dHBzOi8vb21haGFwcm94eS5hcHBzcG90LmNvbS9hbGwiCitDSFJPTUlVTV9CVUlMRF9UWVBFID0gInN0YWJsZSIKK0NIUk9NSVVNX09TID0gImFuZHJvaWQiCisKK0NIUk9NSVVNX1NPVVJDRV9VUkwgPSAiaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYy8rL3JlZnMvdGFncyIKK0NIUk9NSVVNX0RFUFNfRklMRSA9ICJERVBTIgorCitQREZJVU1fR0lUX1JFUE8gPSAiaHR0cHM6Ly9wZGZpdW0uZ29vZ2xlc291cmNlLmNvbS9wZGZpdW0uZ2l0IgorCitNQUtFX0ZJTEVTID0gWyJ0aGlyZF9wYXJ0eS9wZGZpdW1vcGVuanBlZy5tayIsCisgICAgICAgICAgICAgICJ0aGlyZF9wYXJ0eS9wZGZpdW1sY21zLm1rIiwKKyAgICAgICAgICAgICAgInRoaXJkX3BhcnR5L3BkZml1bWpwZWcubWsiLAorICAgICAgICAgICAgICAidGhpcmRfcGFydHkvcGRmaXVtYWdnMjMubWsiLAorICAgICAgICAgICAgICAidGhpcmRfcGFydHkvcGRmaXVtemxpYi5tayIsCisgICAgICAgICAgICAgICJ0aGlyZF9wYXJ0eS9wZGZpdW1iaWdpbnQubWsiLAorICAgICAgICAgICAgICAidGhpcmRfcGFydHkvQW5kcm9pZC5tayIsCisgICAgICAgICAgICAgICJjb3JlL3BkZml1bWZwZGZ0ZXh0Lm1rIiwKKyAgICAgICAgICAgICAgImNvcmUvcGRmaXVtZnBkZmRvYy5tayIsCisgICAgICAgICAgICAgICJjb3JlL3BkZml1bWZkcm0ubWsiLAorICAgICAgICAgICAgICAiY29yZS9wZGZpdW1meGNvZGVjLm1rIiwKKyAgICAgICAgICAgICAgImNvcmUvcGRmaXVtZnBkZmFwaS5tayIsCisgICAgICAgICAgICAgICJjb3JlL3BkZml1bWZ4Y3J0Lm1rIiwKKyAgICAgICAgICAgICAgImNvcmUvcGRmaXVtZnhnZS5tayIsCisgICAgICAgICAgICAgICJjb3JlL0FuZHJvaWQubWsiLAorICAgICAgICAgICAgICAiZnBkZnNkay9wZGZpdW1qYXZhc2NyaXB0Lm1rIiwKKyAgICAgICAgICAgICAgImZwZGZzZGsvcGRmaXVtZm9ybWZpbGxlci5tayIsCisgICAgICAgICAgICAgICJmcGRmc2RrL3BkZml1bWZ4ZWRpdC5tayIsCisgICAgICAgICAgICAgICJmcGRmc2RrL3BkZml1bXBkZndpbmRvdy5tayIsCisgICAgICAgICAgICAgICJmcGRmc2RrL3BkZml1bS5tayIsCisgICAgICAgICAgICAgICJmcGRmc2RrL0FuZHJvaWQubWsiXQorCitDT1BZX0ZJTEVTID0gW29zLnBhdGguYmFzZW5hbWUoX19maWxlX18pLCAiLmdpdCIsICJNT0RVTEVfTElDRU5TRV9CU0QiLCAiTk9USUNFIl0gKyBNQUtFX0ZJTEVTCitSRU1PVkVfRklMRVMgPSBbb3MucGF0aC5iYXNlbmFtZShfX2ZpbGVfXyksICIuZ2l0IiwgIi5naXRpZ25vcmUiXQorCitkZWYgZ2V0U3RhYmxlQ2hyb21pdW1WZXJzaW9uKCk6CisgICAiIiIgOnJldHVybiB0aGUgbGF0ZXN0IGNocm9taXVtIHZlcnNpb24gIiIiCisKKyAgIGNocm9taXVtVmVyc2lvbnMgPSB1cmxsaWIyLnVybG9wZW4oQ0hST01JVU1fVkVSU0lPTl9UUkFDS0lOR19VUkwpCisKKyAgIGZvciBjaHJvbWl1bVZlcnNpb25TdHIgaW4gY2hyb21pdW1WZXJzaW9ucy5yZWFkKCkuc3BsaXQoIlxuIik6CisgICAgICAgY2hyb21pdW1WZXJzaW9uID0gY2hyb21pdW1WZXJzaW9uU3RyLnNwbGl0KCIsIikKKworICAgICAgIGlmIGNocm9taXVtVmVyc2lvblswXSA9PSBDSFJPTUlVTV9PUyBhbmQgY2hyb21pdW1WZXJzaW9uWzFdID09IENIUk9NSVVNX0JVSUxEX1RZUEU6CisgICAgICAgICAgIHJldHVybiBjaHJvbWl1bVZlcnNpb25bMl0KKworICAgcmFpc2UgRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBsYXRlc3QgJXMgY2hyb21pdW0gdmVyc2lvbiBmb3IgJXMgYXQgJXMiCisgICAgICAgICAgICAgICAgICAgJSAoQ0hST01JVU1fQlVJTERfVFlQRSwgQ0hST01JVU1fT1MsIENIUk9NSVVNX1ZFUlNJT05fVFJBQ0tJTkdfVVJMKSkKKworCitkZWYgZ2V0UGRmaXVtUmV2aXNpb24oKToKKyAgICAiIiIgOnJldHVybiB0aGUgcGRmaXVtIHZlcnNpb24gdXNlZCBieSB0aGUgbGF0ZXN0IGNocm9taXVtIHZlcnNpb24gIiIiCisKKyAgICB0cnk6CisgICAgICAgIGRlcHMgPSB1cmxsaWIyLnVybG9wZW4oIiVzLyVzLyVzIiAlIChDSFJPTUlVTV9TT1VSQ0VfVVJMLCBnZXRTdGFibGVDaHJvbWl1bVZlcnNpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIUk9NSVVNX0RFUFNfRklMRSkpCisKKyAgICAgICAgIyBJIHNlZW0gdG8gbm90IGJlIGFibGUgdG8gZ2V0IHRoZSByYXcgZmlsZSwgaGVuY2UgZ3JlcCB0aGUgaHRtbCBmaWxlCisgICAgICAgIHJldHVybiBkZXBzLnJlYWQoKS5zcGxpdCgicGRmaXVtX3JldmlzaW9uJiIpWzFdLnNwbGl0KCImIzM5OyIpWzFdCisgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICByYWlzZSBFeGNlcHRpb24oIkNvdWxkIG5vdCBleHRyYWN0IHBkZml1bSByZXZpc2lvbiBmcm9tICVzLyVzLyVzOiAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgJSAoQ0hST01JVU1fU09VUkNFX1VSTCwgZ2V0U3RhYmxlQ2hyb21pdW1WZXJzaW9uKCksIENIUk9NSVVNX0RFUFNfRklMRSwgZSkpCisKKworZGVmIGRvd25sb2FkUGRmaXVtKG5ld0RpciwgcmV2KToKKyAgICAiIiIgRG93bmxvYWQgdGhlIG5ld2VzdCB2ZXJzaW9uIG9mIHBkZml1bSB0byB0aGUgbmV3IGRpcmVjdG9yeQorCisgICAgOnBhcmFtIG5ld0RpcjogVGhlIG5ldyBmaWxlcworICAgIDpwYXJhbSByZXY6IFRoZSByZXZpc2lvbiB0byBjaGFuZ2UgdG8KKyAgICAiIiIKKworICAgIGNhbGwoWyJnaXQiLCAiY2xvbmUiLCBQREZJVU1fR0lUX1JFUE8sIG5ld0Rpcl0pCisgICAgb3MuY2hkaXIobmV3RGlyKQorICAgIGNhbGwoWyJnaXQiLCAicmVzZXQiLCAiLS1oYXJkIiwgcmV2XSkKKworCitkZWYgcmVtb3ZlRmlsZXMobmV3RGlyKToKKyAgICAiIiIgUmVtb3ZlIGZpbGVzIHRoYXQgc2hvdWxkIG5vdCBiZSBjaGVja2VkIGluIGZyb20gdGhlIG9yaWdpbmFsIGRvd25sb2FkCisKKyAgICA6cGFyYW0gbmV3RGlyOiBUaGUgbmV3IGZpbGVzCisgICAgIiIiCisKKyAgICBmb3IgZmlsZU5hbWUgaW4gUkVNT1ZFX0ZJTEVTOgorICAgICAgICBjYWxsKFsicm0iLCAiLXJmIiwgb3MucGF0aC5qb2luKG5ld0RpciwgZmlsZU5hbWUpXSkKKworCitkZWYgY29weUZpbGVzKGN1cnJlbnREaXIsIG5ld0Rpcik6CisgICAgIiIiIENvcHkgZmlsZXMgbmVlZGVkIHRvIG1ha2UgcGRmaXVtIHdvcmsgd2l0aCBhbmRyb2lkCisKKyAgICA6cGFyYW0gY3VycmVudERpcjogVGhlIGN1cnJlbnQgZmlsZXMKKyAgICA6cGFyYW0gbmV3RGlyOiBUaGUgbmV3IGZpbGVzCisgICAgIiIiCisKKyAgICBmb3IgZmlsZU5hbWUgaW4gQ09QWV9GSUxFUzoKKyAgICAgICAgY2FsbChbImNwIiwgIi1yIiwgb3MucGF0aC5qb2luKGN1cnJlbnREaXIsIGZpbGVOYW1lKSwgb3MucGF0aC5qb2luKG5ld0RpciwgZmlsZU5hbWUpXSkKKworCitkZWYgZXhjaGFuZ2UoY3VycmVudERpciwgbmV3RGlyLCBvbGREaXIpOgorICAgICIiIiBVcGRhdGUgY3VycmVudCB0byBuZXcgYW5kIHNhdmUgY3VycmVudCBpbiBvbGQuCisKKyAgICA6cGFyYW0gY3VycmVudERpcjogVGhlIGN1cnJlbnQgZmlsZXMKKyAgICA6cGFyYW0gbmV3RGlyOiBUaGUgbmV3IGZpbGVzCisgICAgOnBhcmFtIG9sZERpcjogVGhlIG9sZCBmaWxlcworICAgICIiIgorCisgICAgY2FsbChbIm12IiwgY3VycmVudERpciwgb2xkRGlyXSkKKyAgICBjYWxsKFsibXYiLCBuZXdEaXIsIGN1cnJlbnREaXJdKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICByZXYgPSBnZXRQZGZpdW1SZXZpc2lvbigpCisgICB0YXJnZXREaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5yZWFscGF0aChfX2ZpbGVfXykpCisgICBuZXdEaXIgPSB0YXJnZXREaXIgKyAiLm5ldyIKKyAgIG9sZERpciA9IHRhcmdldERpciArICIub2xkIgorCisgICB0cnk6CisgICAgICAgZG93bmxvYWRQZGZpdW0obmV3RGlyLCByZXYpCisgICAgICAgcmVtb3ZlRmlsZXMobmV3RGlyKQorICAgICAgIGNvcHlGaWxlcyh0YXJnZXREaXIsIG5ld0RpcikKKyAgICAgICBleGNoYW5nZSh0YXJnZXREaXIsIG5ld0Rpciwgb2xkRGlyKQorICAgICAgIHByaW50KCJVcGRhdGVkIHBkZml1bSB0byAiICsgcmV2ICsgIi4gT2xkIGZpbGVzIGFyZSBpbiAiICsgb2xkRGlyICsgIi4gUGxlYXNlIHZlcmlmeSBpZiAiCisgICAgICAgICAgICAgImJ1aWxkIGZpbGVzIG5lZWQgdG8gYmUgdXBkYXRlZC4iKQorCisgICAgICAgc3lzLmV4aXQoMCkKKyAgIGV4Y2VwdDoKKyAgICAgICBjYWxsKFsicm0iLCAiLXJmIiwgbmV3RGlyXSkKKyAgICAgICBzeXMuZXhpdCgxKQorCmRpZmYgLS1naXQgYS94ZmEuZ3lwIGIveGZhLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTA0NjRlCi0tLSAvZGV2L251bGwKKysrIGIveGZhLmd5cApAQCAtMCwwICsxLDcxMiBAQAoreworICAidmFyaWFibGVzIjogeworICAgICJwZGZfZW5hYmxlX3Y4JSI6IDEsCisgIH0sCisgICJ0YXJnZXRfZGVmYXVsdHMiOiB7CisgICAgImRlZmluZXMiOiBbCisgICAgICAiUERGX0VOQUJMRV9YRkEiLAorICAgIF0sCisgIH0sCisgICJ0YXJnZXRzIjpbCisgICAgeworICAgICAgInRhcmdldF9uYW1lIjoieGZhIiwKKyAgICAgICJ0eXBlIjoic3RhdGljX2xpYnJhcnkiLAorICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKKyAgICAgICAgIyBUaGlzIGlzIGltcGxpY2l0IGluIEdOLgorICAgICAgICAnPChERVBUSCknLAorICAgICAgICAnLicsCisgICAgICAgICd0aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlJywKKyAgICAgICAgJ3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUnLAorICAgICAgXSwKKyAgICAgICdkZWZpbmVzJyA6IFsKKyAgICAgICAgJ0ZUMl9CVUlMRF9MSUJSQVJZJywKKyAgICAgIF0sCisgICAgICAic291cmNlcyI6WworICAgICAgICAieGZhL2luY2x1ZGUvZm94aXR4ZmEuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcmNsaXBib2FyZG1nci5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVyY3Vyc29ybWdyLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJtb25pdG9ybWdyLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJuYXRpdmUuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcnRocmVhZG1nci5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVydGltZXJtZ3IuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcndpZGdldG1nci5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9zZGFkYXB0ZXJpbXAuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfYmFyY29kZS5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9jYXJldC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9jaGVja2JveC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9jb21ib2JveC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9kYXRldGltZXBpY2tlci5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9lZGl0LmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2xpc3Rib3guaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfbWVudS5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9tb250aGNhbGVuZGFyLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX3BpY3R1cmVib3guaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfcHVzaGJ1dHRvbi5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9zY3JvbGxiYXIuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfc3BpbmJ1dHRvbi5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF90b29sdGlwY3RybC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z4bWF0aF9iYXJjb2RlLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2FwcC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF9jb250ZW50LmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2Vycm9yLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2Zvcm0uaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfZ3JpZC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF9ub3RlLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3BhbmVsLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3RhcmdldC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF90aGVtZS5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF90aHJlYWQuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfdGltZXIuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfd2lkZ2V0LmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3dpZGdldGRlZi5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF93aWRnZXRtZ3IuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvZndsLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2FwcC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9iYXJjb2RlLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2NhcmV0LmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2NoZWNrYm94LmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2NvbWJvYm94LmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2RhdGV0aW1lcGlja2VyLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2VkaXQuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvbGlzdGJveC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9waWN0dXJlYm94LmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3B1c2hidXR0b24uaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvc2Nyb2xsYmFyLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3RoZW1lLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3Rvb2x0aXBjdHJsLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3dpZGdldC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC90aGVtZS9iYXJjb2RldHAuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvdGhlbWUvY2FyZXR0cC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC90aGVtZS9jaGVja2JveHRwLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL3RoZW1lL2NvbWJvYm94dHAuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvdGhlbWUvZGF0ZXRpbWVwaWNrZXJ0cC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC90aGVtZS9lZGl0dHAuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvdGhlbWUvZm9ybXRwLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL3RoZW1lL2xpc3Rib3h0cC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC90aGVtZS9tb250aGNhbGVuZGFydHAuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9md2wvdGhlbWUvcGljdHVyZWJveHRwLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZndsL3RoZW1lL3B1c2hidXR0b250cC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC90aGVtZS9zY3JvbGxiYXJ0cC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC90aGVtZS91dGlscy5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z3bC90aGVtZS93aWRnZXR0cC5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z4YmFyY29kZS9CQ19CYXJDb2RlLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZnhmYS9meGZhLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZnhmYS9meGZhX2Jhc2ljLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZnhmYS9meGZhX29iamVjdGFjYy5oIiwKKyAgICAgICAgInhmYS9pbmNsdWRlL2Z4ZmEvZnhmYV93aWRnZXQuaCIsCisgICAgICAgICJ4ZmEvaW5jbHVkZS9meGdyYXBoaWNzL2Z4X2dyYXBoaWNzLmgiLAorICAgICAgICAieGZhL2luY2x1ZGUvZnhqc2UvZnhqc2UuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZS5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX2Jycy5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX2Nzcy5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX2ltZy5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX21lbS5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Blbi5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Bzci5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3B0aC5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Jkci5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Jkdi5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3R0by5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3htbC5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2NhY2hlLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NjYWNoZS5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2RhdGF0YWJsZS5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3NzZGF0YXRhYmxlLmgiLAorICAgICAgICAieGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3NzZGVjbGFyYXRpb24uY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2RlY2xhcmF0aW9uLmgiLAorICAgICAgICAieGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3Nzc3R5bGVzZWxlY3Rvci5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3Nzc3R5bGVzZWxlY3Rvci5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N0eWxlc2hlZXQuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N0eWxlc2hlZXQuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzeW50YXguY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N5bnRheC5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2RldmJhc2ljLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9kZXZiYXNpYy5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2dlZGV2aWNlLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZWRldmljZS5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2dlb2JqZWN0LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZW9iamVjdC5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2l0ZXJhdG9yLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9pdGVyYXRvci5oIiwKKyAgICAgICAgInhmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX29iamVjdC5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfb2JqZWN0LmgiLAorICAgICAgICAieGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfcmVuZGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9yZW5kZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvdHRvL2ZkZV90ZXh0b3V0LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMvdHRvL2ZkZV90ZXh0b3V0LmgiLAorICAgICAgICAieGZhL3NyYy9mZHAvc3JjL3htbC9mZGVfeG1sLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZkcC9zcmMveG1sL2ZkZV94bWwuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZlZS9pbmNsdWRlL2Z4X3dvcmRicmVhay5oIiwKKyAgICAgICAgInhmYS9zcmMvZmVlL2luY2x1ZGUvaWZkZV90eHRlZHRidWYuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZlZS9pbmNsdWRlL2lmZGVfdHh0ZWR0ZW5naW5lLmgiLAorICAgICAgICAieGZhL3NyYy9mZWUvaW5jbHVkZS9pZmRlX3R4dGVkdHBhZ2UuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRibG9jay5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0YmxvY2suaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRidWYuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGJ1Zi5oIiwKKyAgICAgICAgInhmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGVuZ2luZS5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0ZW5naW5lLmgiLAorICAgICAgICAieGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0cGFnZS5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0cGFnZS5oIiwKKyAgICAgICAgInhmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdHBhcmFnLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRwYXJhZy5oIiwKKyAgICAgICAgInhmYS9zcmMvZmVlL3NyYy9meF93b3JkYnJlYWsvZnhfd29yZGJyZWFrZGF0YS5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZWUvc3JjL2Z4X3dvcmRicmVhay9meF93b3JkYnJlYWtfaW1wbC5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZWUvc3JjL2Z4X3dvcmRicmVhay9meF93b3JkYnJlYWtfaW1wbC5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2ZnYXMuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9hbGcuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9jcGcuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9kYXRldGltZS5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2ZudC5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2xiay5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2xnZy5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2xvY2FsZS5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X21lbS5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3Jiay5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3NheC5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3N0bS5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3N5cy5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3Riay5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3VjZC5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3V0bC5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X2FsZ29yaXRobS5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfY29kZXBhZ2UuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X2VuY29kZS5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfbWVtb3J5LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9tZW1vcnkuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9zdHJlYW0uY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3N0cmVhbS5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3N5c3RlbS5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfdXRpbHMuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3V0aWxzLmgiLAorICAgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9mZ2FzX2Jhc2UuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfZm9udHV0aWxzLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfZm9udHV0aWxzLmgiLAorICAgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2dlZm9udC5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2dlZm9udC5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9zdGRmb250bWdyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfc3RkZm9udG1nci5oIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X2xpbmVicmVhay5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfcnRmYnJlYWsuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3J0ZmJyZWFrLmgiLAorICAgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfdGV4dGJyZWFrLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF90ZXh0YnJlYWsuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF91bmljb2RlLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF91bmljb2RlLmgiLAorICAgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9sb2NhbGl6YXRpb24vZnhfZGF0ZXRpbWUuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZmdhcy9zcmMvbG9jYWxpemF0aW9uL2Z4X2xvY2FsZS5jcHAiLAorICAgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9sb2NhbGl6YXRpb24vZnhfbG9jYWxlaW1wLmgiLAorICAgICAgICAieGZhL3NyYy9mZ2FzL3NyYy9sb2NhbGl6YXRpb24vZnhfbG9jYWxlbWdyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL2xvY2FsaXphdGlvbi9meF9sb2NhbGVtZ3IuaCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL3htbC9meF9zYXhfaW1wLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2ZnYXMvc3JjL3htbC9meF9zYXhfaW1wLmgiLAorICAgICAgICAieGZhL3NyYy9mb3hpdGxpYi5oIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9iYXJjb2RlaW1wLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfY2FyZXRpbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9jaGVja2JveGltcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2NvbWJvYm94aW1wLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfZGF0ZXRpbWVwaWNrZXJpbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9lZGl0aW1wLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfZm9ybXByb3h5aW1wLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfbGlzdGJveGltcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX21vbnRoY2FsZW5kYXJpbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9waWN0dXJlYm94aW1wLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfcHVzaGJ1dHRvbmltcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3Njcm9sbGJhcmltcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3NwaW5idXR0b25pbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF90b29sdGlwY3RybGltcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZnhtYXRoX2JhcmNvZGVpbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2JhcmNvZGVpbXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9jYXJldGltcC5oIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2NoZWNrYm94aW1wLmgiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfY29tYm9ib3hpbXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9kYXRldGltZXBpY2tlcmltcC5oIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2VkaXRpbXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9mb3JtcHJveHlpbXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9saXN0Ym94aW1wLmgiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfbW9udGhjYWxlbmRhcmltcC5oIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3BpY3R1cmVib3hpbXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9wdXNoYnV0dG9uaW1wLmgiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfc2Nyb2xsYmFyaW1wLmgiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfc3BpbmJ1dHRvbmltcC5oIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3Rvb2x0aXBjdHJsaW1wLmgiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9meG1hdGhfYmFyY29kZWltcC5oIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9hcHBpbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9jb250ZW50aW1wLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfZm9ybWltcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX2dyaWRpbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9ub3RlaW1wLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfcGFuZWxpbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9zZGFkYXB0ZXJpbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF90YXJnZXRpbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF90aHJlYWRpbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF90aW1lcmltcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3dpZGdldGltcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3dpZGdldG1ncmltcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfYXBwaW1wLmgiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfY29udGVudGltcC5oIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX2Zvcm1pbXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9ncmlkaW1wLmgiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3BhbmVsaW1wLmgiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmgiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGhyZWFkaW1wLmgiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0aW1wLmgiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0bWdyaW1wLmgiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2FwcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2JhcmNvZGUuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9jYXJldC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2NoZWNrYm94LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvY29tYm9ib3guY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9kYXRldGltZXBpY2tlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2VkaXQuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9saXN0Ym94LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvcGljdHVyZWJveC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3B1c2hidXR0b24uY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9zY3JvbGxiYXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC90aGVtZS5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3Rvb2x0aXBjdHJsLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvd2lkZ2V0LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvYmFyY29kZXRwLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvY2FyZXR0cC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL3RoZW1lL2NoZWNrYm94dHAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZndsL3NyYy90aGVtZS9jb21ib2JveHRwLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvZGF0ZXRpbWVwaWNrZXJ0cC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL3RoZW1lL2VkaXR0cC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL3RoZW1lL2Zvcm10cC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL3RoZW1lL2xpc3Rib3h0cC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL3RoZW1lL21vbnRoY2FsZW5kYXJ0cC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL3RoZW1lL3BpY3R1cmVib3h0cC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL3RoZW1lL3B1c2hidXR0b250cC5jcHAiLAorICAgICAgICAieGZhL3NyYy9md2wvc3JjL3RoZW1lL3Njcm9sbGJhcnRwLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvd2lkZ2V0dHAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRBcnJheS5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdFNvdXJjZS5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVBcnJheS5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVNYXRyaXguY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0kuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25EZWNvZGVyUmVzdWx0LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uRUNJLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0uY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRBcnJheS5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0U291cmNlLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVBcnJheS5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CeXRlTWF0cml4LmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSS5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25EZWNvZGVyUmVzdWx0LmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkVDSS5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybS5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3Rvci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb24uY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkRlY29kZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbi5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkRlY29kZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1Ni5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2UG9seS5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4RGF0YUJsb2NrLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhEZWNvZGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhEZXRlY3Rvci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4UmVhZGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhWZXJzaW9uLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhXcml0ZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERhdGFCbG9jay5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhEZWNvZGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4RGV0ZWN0b3IuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhSZWFkZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0LmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4VmVyc2lvbi5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFdyaXRlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQVNDSUlFbmNvZGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Jhc2UyNTZFbmNvZGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0M0MEVuY29kZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRWRpZmFjdEVuY29kZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2RlckNvbnRleHQuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRXJyb3JDb3JyZWN0aW9uLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbEluZm8uY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sU2hhcGVIaW50LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1RleHRFbmNvZGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1gxMkVuY29kZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGVmYXVsdFBsYWNlbWVudC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0hpZ2hMZXZlbEVuY29kZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQVNDSUlFbmNvZGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19CYXNlMjU2RW5jb2Rlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQzQwRW5jb2Rlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRWRpZmFjdEVuY29kZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXJDb250ZXh0LmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FcnJvckNvcnJlY3Rpb24uaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbEluZm8uaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbFNoYXBlSGludC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfVGV4dEVuY29kZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1gxMkVuY29kZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RlZmF1bHRQbGFjZW1lbnQuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0hpZ2hMZXZlbEVuY29kZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyUmVhZGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyV3JpdGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMTI4UmVhZGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMTI4V3JpdGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlSZWFkZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUzOVdyaXRlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNSZWFkZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjEzV3JpdGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU44UmVhZGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU44V3JpdGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVJlYWRlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVEaW1Xcml0ZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lRFJlYWRlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkVVBDQVJlYWRlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkVVBDQVdyaXRlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kYUJhclJlYWRlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGFCYXJXcml0ZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMTI4UmVhZGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTEyOFdyaXRlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUzOVJlYWRlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUzOVdyaXRlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjEzUmVhZGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNXcml0ZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU44UmVhZGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFdyaXRlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lRGltUmVhZGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVEaW1Xcml0ZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZURSZWFkZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRVUENBUmVhZGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkVVBDQVdyaXRlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTcuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlTWF0cml4LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZU1ldGFkYXRhLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZVJvdy5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVWYWx1ZS5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JvdW5kaW5nQm94LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29kZXdvcmQuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb2Rld29yZERlY29kZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb21tb24uY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb21wYWN0aW9uLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGVjb2RlZEJpdFN0cmVhbVBhcnNlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdGlvblJlc3VsdC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdGlvblJlc3VsdENvbHVtbi5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbi5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdG9yLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEaW1lbnNpb25zLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb24uY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ01vZHVsdXNHRi5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0VDTW9kdWx1c1BvbHkuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFcnJvckNvcnJlY3Rpb24uY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3UmVhZGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3UmVzdWx0TWV0YWRhdGEuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdTY2FubmluZ0RlY29kZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdXcml0ZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTcuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZU1hdHJpeC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlTWV0YWRhdGEuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZVJvdy5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlVmFsdWUuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Qm91bmRpbmdCb3guaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29kZXdvcmQuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29kZXdvcmREZWNvZGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbW1vbi5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb21wYWN0aW9uLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0LmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdGlvblJlc3VsdENvbHVtbi5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4uaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0b3IuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGltZW5zaW9ucy5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbi5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ01vZHVsdXNHRi5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ01vZHVsdXNQb2x5LmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbi5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1JlYWRlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdSZXN1bHRNZXRhZGF0YS5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdTY2FubmluZ0RlY29kZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3V3JpdGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQWxpZ25tZW50UGF0dGVybi5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQml0TWF0cml4UGFyc2VyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCaXRWZWN0b3IuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyQmxvY2tQYWlyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckRlY29kZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVSZWFkZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRUNCLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQmxvY2tzLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVuY29kZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24uY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWFza1V0aWwuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWF0cml4VXRpbC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNb2RlLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlclZlcnNpb24uY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVXcml0ZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRhdGFCbG9jay5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGF0YU1hc2suY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRldGVjdG9yLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEZXRlY3RvclJlc3VsdC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRmluZGVyUGF0dGVybi5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRmluZGVyUGF0dGVybkZpbmRlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSR3JpZFNhbXBsZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkFsaWdubWVudFBhdHRlcm4uaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQml0TWF0cml4UGFyc2VyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckJpdFZlY3Rvci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyQmxvY2tQYWlyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJEZWNvZGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZVJlYWRlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRUNCLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0Jsb2Nrcy5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRW5jb2Rlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNYXNrVXRpbC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWF0cml4VXRpbC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTW9kZS5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyVmVyc2lvbi5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVXcml0ZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEYXRhQmxvY2suaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEYXRhTWFzay5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEZXRlY3Rvci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRldGVjdG9yUmVzdWx0LmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRmluZGVyUGF0dGVybi5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkZpbmRlclBhdHRlcm5GaW5kZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJHcmlkU2FtcGxlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19GaW5kZXJQYXR0ZXJuSW5mby5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX0ZpbmRlclBhdHRlcm5JbmZvLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvQkNfQmFyQ29kZS5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvQkNfQmluYXJpemVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19CaW5hcnlCaXRtYXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2UuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL0JDX0RpbWVuc2lvbi5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvQkNfTGlicmFyeS5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvQkNfTHVtaW5hbmNlU291cmNlLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19SZWFkZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1Jlc3VsdFBvaW50LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19Ud29EaW1Xcml0ZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1V0aWxDb2RpbmdDb252ZXJ0LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19VdGlsUlNTLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19VdGlscy5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvQkNfV3JpdGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19CaW5hcml6ZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19CaW5hcnlCaXRtYXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvQkNfRGVjb2RlclJlc3VsdC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL0JDX0RpbWVuc2lvbi5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL0JDX0x1bWluYW5jZVNvdXJjZS5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1JlYWRlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1Jlc3VsdFBvaW50LmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvQkNfVHdvRGltV3JpdGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvQkNfVXRpbENvZGluZ0NvbnZlcnQuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19VdGlsUlNTLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvQkNfV3JpdGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhiYXJjb2RlL3V0aWxzLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2NoZWNrc3VtLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfY2hlY2tzdW0uaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZhcHAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmFwcC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmJhcmNvZGUuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmJhcmNvZGUuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZjaGVja2J1dHRvbi5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmY2hlY2tidXR0b24uaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZjaG9pY2VsaXN0LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZjaG9pY2VsaXN0LmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmQ29uZmlnQWNjLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZDb25maWdBY2MuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2MuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvYy5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvY2hhbmRsZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvY2hhbmRsZXIuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2N2aWV3LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2N2aWV3LmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZHJhdy5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZHJhdy5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmV4Y2xncm91cC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZXhjbGdyb3VwLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZmllbGQuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmZpZWxkLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmaW1hZ2UuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmltYWdlLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmaW1hZ2VlZGl0LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZpbWFnZWVkaXQuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZub3RpZnkuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZm5vdGlmeS5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnBhZ2V2aWV3LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwYWdldmlldy5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnBhdGguY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnBhdGguaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwdXNoYnV0dG9uLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwdXNoYnV0dG9uLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmc2lnbmF0dXJlLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZzaWduYXR1cmUuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZzdWJmb3JtLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZzdWJmb3JtLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmdGV4dC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmdGV4dC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnRleHRlZGl0LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ0ZXh0ZWRpdC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZndpZGdldC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0LmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0YWNjLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXRhY2MuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXRoYW5kbGVyLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXRoYW5kbGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZvbnRtZ3IuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mb250bWdyLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Z3bGFkYXB0ZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9md2xhZGFwdGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Z3bHRoZW1lLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZndsdGhlbWUuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfcmVuZGVyY29udGV4dC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX3JlbmRlcmNvbnRleHQuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfdGV4dGxheW91dC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX3RleHRsYXlvdXQuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi9meGZhX2xvY2FsZXZhbHVlLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2NvbW1vbi5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NkYXRhLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY2xheW91dC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2N1bWVudC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9mbTJqc2FwaS5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9sb2NhbGVtZ3IuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfb2JqZWN0LmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3BhcnNlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9zY3JpcHQuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfdXRpbHMuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9lcnJvci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZXJyb3IuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9leHByZXNzaW9uLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9leHByZXNzaW9uLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm0yanMuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbTJqc2FwaS5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm0yanNjb250ZXh0LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbTJqc2NvbnRleHQuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbXBhcnNlLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbXBhcnNlLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfbGV4ZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2xleGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfcHJvZ3JhbS5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfcHJvZ3JhbS5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX3NpbXBsZWV4cHJlc3Npb24uY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX3NpbXBsZWV4cHJlc3Npb24uaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfYmFzaWNfZGF0YS5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2Jhc2ljX2ltcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2Jhc2ljX2ltcC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9kYXRhZGVzY3JpcHRpb25faW1wLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfZGF0YWRlc2NyaXB0aW9uX2ltcC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9kYXRhbWVyZ2VyX2ltcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2RhdGFtZXJnZXJfaW1wLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2ltcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2xheW91dF9pbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9sYXlvdXRfaW1wLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X3NlcmlhbGl6ZS5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X3NlcmlhbGl6ZS5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sYXlvdXRfYXBwYWRhcHRlci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9hcHBhZGFwdGVyLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9pdGVtbGF5b3V0LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X2l0ZW1sYXlvdXQuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X3BhZ2VtZ3JfbmV3LmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X3BhZ2VtZ3JfbmV3LmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xvY2FsZS5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xvY2FsZS5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sb2NhbGVtZ3IuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sb2NhbGV2YWx1ZS5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX29iamVjdGFjY19pbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9vYmplY3RfaW1wLmNwcCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfcGFyc2VyX2ltcC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3BhcnNlcl9pbXAuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2RhdGF3aW5kb3cuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfZGF0YXdpbmRvdy5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfZXZlbnRwc2V1ZG9tb2RlbC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ldmVudHBzZXVkb21vZGVsLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ob3N0cHNldWRvbW9kZWwuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfaG9zdHBzZXVkb21vZGVsLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9pbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfaW1wLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9sYXlvdXRwc2V1ZG9tb2RlbC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9sYXlvdXRwc2V1ZG9tb2RlbC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfbG9ncHNldWRvbW9kZWwuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfbG9ncHNldWRvbW9kZWwuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X25vZGVoZWxwZXIuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfbm9kZWhlbHBlci5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfcmVzb2x2ZXByb2Nlc3Nvci5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9yZXNvbHZlcHJvY2Vzc29yLmgiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9zaWduYXR1cmVwc2V1ZG9tb2RlbC5jcHAiLAorICAgICAgICAieGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9zaWduYXR1cmVwc2V1ZG9tb2RlbC5oIiwKKyAgICAgICAgInhmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV91dGlsc19pbXAuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhncmFwaGljcy9zcmMvZnhfZ3JhcGhpY3MuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhncmFwaGljcy9zcmMvZnhfcGF0aF9nZW5lcmF0b3IuY3BwIiwKKyAgICAgICAgInhmYS9zcmMvZnhncmFwaGljcy9zcmMvZnhfcGF0aF9nZW5lcmF0b3IuaCIsCisgICAgICAgICJ4ZmEvc3JjL2Z4Z3JhcGhpY3Mvc3JjL3ByZS5oIiwKKyAgICAgIF0sCisgICAgICAiY29uZGl0aW9ucyI6IFsKKyAgICAgICAgWyJwZGZfZW5hYmxlX3Y4PT0xIiwgeworICAgICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICAgICAnPChERVBUSCkvdjgvdG9vbHMvZ3lwL3Y4Lmd5cDp2OCcsCisgICAgICAgICAgXSwKKyAgICAgICAgICAnZXhwb3J0X2RlcGVuZGVudF9zZXR0aW5ncyc6IFsKKyAgICAgICAgICAgICc8KERFUFRIKS92OC90b29scy9neXAvdjguZ3lwOnY4JywKKyAgICAgICAgICBdLAorICAgICAgICAgICdpbmNsdWRlX2RpcnMnOiBbCisgICAgICAgICAgICAnPChERVBUSCkvdjgnLAorICAgICAgICAgICAgJzwoREVQVEgpL3Y4L2luY2x1ZGUnLAorICAgICAgICAgIF0sCisgICAgICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICAgICAieGZhL3NyYy9meGpzZS9zcmMvY2xhc3MuY3BwIiwKKyAgICAgICAgICAgICJ4ZmEvc3JjL2Z4anNlL3NyYy9jbGFzcy5oIiwKKyAgICAgICAgICAgICJ4ZmEvc3JjL2Z4anNlL3NyYy9jb250ZXh0LmNwcCIsCisgICAgICAgICAgICAieGZhL3NyYy9meGpzZS9zcmMvY29udGV4dC5oIiwKKyAgICAgICAgICAgICJ4ZmEvc3JjL2Z4anNlL3NyYy9keW5wcm9wLmNwcCIsCisgICAgICAgICAgICAieGZhL3NyYy9meGpzZS9zcmMvcnVudGltZS5jcHAiLAorICAgICAgICAgICAgInhmYS9zcmMvZnhqc2Uvc3JjL3J1bnRpbWUuaCIsCisgICAgICAgICAgICAieGZhL3NyYy9meGpzZS9zcmMvc2NvcGVfaW5saW5lLmgiLAorICAgICAgICAgICAgInhmYS9zcmMvZnhqc2Uvc3JjL3V0aWxfaW5saW5lLmgiLAorICAgICAgICAgICAgInhmYS9zcmMvZnhqc2Uvc3JjL3ZhbHVlLmNwcCIsCisgICAgICAgICAgICAieGZhL3NyYy9meGpzZS9zcmMvdmFsdWUuaCIKKyAgICAgICAgICBdLAorICAgICAgICB9XSwKKyAgICAgICAgWyJPUyA9PSAnd2luJyIsIHsKKyAgICAgICAgICAiY29uZmlndXJhdGlvbnMiOiB7CisgICAgICAgICAgICAiRGVidWciOiB7CisgICAgICAgICAgICAgICJtc3ZzX2NvbmZpZ3VyYXRpb25fYXR0cmlidXRlcyI6IHt9LAorICAgICAgICAgICAgICAibXN2c19zZXR0aW5ncyI6IHsKKyAgICAgICAgICAgICAgICAiVkNDTENvbXBpbGVyVG9vbCI6IHt9LAorICAgICAgICAgICAgICAgICJWQ0xpYnJhcmlhblRvb2wiOiB7fSwKKyAgICAgICAgICAgICAgICAiVkNMaW5rZXJUb29sIjoge30sCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiUmVsZWFzZSI6IHsKKyAgICAgICAgICAgICAgIm1zdnNfY29uZmlndXJhdGlvbl9hdHRyaWJ1dGVzIjoge30sCisgICAgICAgICAgICAgICJtc3ZzX3NldHRpbmdzIjogeworICAgICAgICAgICAgICAgICJWQ0NMQ29tcGlsZXJUb29sIjoge30sCisgICAgICAgICAgICAgICAgIlZDTGlicmFyaWFuVG9vbCI6IHt9LAorICAgICAgICAgICAgICAgICJWQ0xpbmtlclRvb2wiOiB7fSwKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAic291cmNlcyI6IFtdLAorICAgICAgICB9XSwKKyAgICAgICAgWyJPUyA9PSAnbWFjJyIsIHsKKyAgICAgICAgICAiY29uZmlndXJhdGlvbnMiOiB7fSwKKyAgICAgICAgICAic291cmNlcyI6IFtdLAorICAgICAgICB9XSwKKyAgICAgIF0KKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL3hmYS9ERVBTIGIveGZhL0RFUFMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY4MTRhYwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9ERVBTCkBAIC0wLDAgKzEsNCBAQAoraW5jbHVkZV9ydWxlcyA9IFsKKyAgJytjb3JlL2luY2x1ZGUnLAorICAnK3RoaXJkX3BhcnR5L2JpZ2ludCcKK10KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2ZveGl0eGZhLmggYi94ZmEvaW5jbHVkZS9mb3hpdHhmYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NzMwYjcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9mb3hpdHhmYS5oCkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorLy8gVE9ETyh0aGVzdGlnKTogUmVtb3ZlIHRoaXMgZmlsZSBhbmQgZG8gSVdZVS4NCisNCisjaWZuZGVmIF9GT1hJVF9YRkFfSF8NCisjZGVmaW5lIF9GT1hJVF9YRkFfSF8NCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2V4dC5oIg0KKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9nZS5oIg0KKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjb2RlYy9meF9jb2RlYy5oIg0KKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZmRybS9meF9jcnlwdC5oIg0KKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnBkZmRvYy9mcGRmX2RvYy5oIg0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9meGJhcmNvZGUvQkNfQmFyQ29kZS5oIg0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9meGdyYXBoaWNzL2Z4X2dyYXBoaWNzLmgiDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z3bC9md2wuaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZnhqc2UvZnhqc2UuaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZnhmYS9meGZhLmgiDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJjbGlwYm9hcmRtZ3IuaCBiL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVyY2xpcGJvYXJkbWdyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZiNjI5MgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVyY2xpcGJvYXJkbWdyLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfQURBUFRFUl9DTElQQk9BUkRNR1JfSA0KKyNkZWZpbmUgX0ZXTF9BREFQVEVSX0NMSVBCT0FSRE1HUl9IDQorDQorZW51bSBGV0xfQ0xJUEJPQVJERk9STUFUIHsNCisgIEZXTF9DTElQQk9BUkRGT1JNQVRfRGliLA0KKyAgRldMX0NMSVBCT0FSREZPUk1BVF9UZXh0LA0KKyAgRldMX0NMSVBCT0FSREZPUk1BVF9VbmNvZGVUZXh0LA0KK307DQordHlwZWRlZiBzdHJ1Y3QgX0ZXTF9IQ0xJUEJPQVJEREFUQSB7IHZvaWQqIHBEYXRhOyB9ICogRldMX0hDTElQQk9BUkREQVRBOw0KKw0KK2NsYXNzIElGV0xfQWRhcHRlckNsaXBib2FyZE1nciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGV0xfQWRhcHRlckNsaXBib2FyZE1ncigpIHt9DQorICB2aXJ0dWFsIEZXTF9FUlIgRW1wdHkoKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNEYXRhQXZhaWxhYmxlKEZYX0RXT1JEIGR3Rm9ybWF0KSA9IDA7DQorICB2aXJ0dWFsIEZXTF9IQ0xJUEJPQVJEREFUQSBHZXREYXRhKEZYX0RXT1JEIGR3Rm9ybWF0KSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0RGF0YShGWF9EV09SRCBkd0Zvcm1hdCwgdWludDhfdCogcEJ1ZiwgaW50MzJfdCBpU2l6ZSkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldERhdGFTaXplKEZXTF9IQ0xJUEJPQVJEREFUQSBoRGF0YSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkKiBMb2NrRGF0YUJ1ZmZlcihGV0xfSENMSVBCT0FSRERBVEEgaERhdGEpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBVbkxvY2tEYXRhQnVmZmVyKEZXTF9IQ0xJUEJPQVJEREFUQSBoRGF0YSkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFN0cmluZ0RhdGEoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3cykgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFN0cmluZ0RhdGEoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBicykgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFN0cmluZ0RhdGEoQ0ZYX1dpZGVTdHJpbmcmIHdzKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0U3RyaW5nRGF0YShDRlhfQnl0ZVN0cmluZyYgYnMpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBFbnVtRm9ybWF0cyhDRlhfRFdvcmRBcnJheSYgZm9ybWF0cykgPSAwOw0KKyAgdmlydHVhbCBGWF9EV09SRCBSZWdpc3RlckZvcm1hdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9ybWF0KSA9IDA7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcmN1cnNvcm1nci5oIGIveGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJjdXJzb3JtZ3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTNhNTMzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJjdXJzb3JtZ3IuaApAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9BREFQVEVSX0NVUlNPUk1HUl9IDQorI2RlZmluZSBfRldMX0FEQVBURVJfQ1VSU09STUdSX0gNCitjbGFzcyBDRlhfRElCaXRtYXA7DQorY2xhc3MgSUZXTF9BZGFwdGVyQ3Vyc29yTWdyOw0KK2VudW0gRldMX0NVUlNPUlRZUEUgew0KKyAgRldMX0NVUlNPUlRZUEVfQXJyb3cgPSAwLA0KKyAgRldMX0NVUlNPUlRZUEVfQ3Jvc3MsDQorICBGV0xfQ1VSU09SVFlQRV9IYW5kLA0KKyAgRldMX0NVUlNPUlRZUEVfSW5wdXRCZWFtLA0KKyAgRldMX0NVUlNPUlRZUEVfV2FpdCwNCisgIEZXTF9DVVJTT1JUWVBFX1NpemVBbGwsDQorICBGV0xfQ1VSU09SVFlQRV9TaXplTldTRSwNCisgIEZXTF9DVVJTT1JUWVBFX1NpemVORVNXLA0KKyAgRldMX0NVUlNPUlRZUEVfU2l6ZVdFLA0KKyAgRldMX0NVUlNPUlRZUEVfU2l6ZU5TLA0KKyAgRldMX0NVUlNPUlRZUEVfUHJvaGliaXRpb24sDQorICBGV0xfQ1VSU09SVFlQRV9IZWxwDQorfTsNCit0eXBlZGVmIHN0cnVjdCBfRldMX0hDVVJTT1IgeyB2b2lkKiBwRGF0YTsgfSAqIEZXTF9IQ1VSU09SOw0KKw0KK2NsYXNzIElGV0xfQWRhcHRlckN1cnNvck1nciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGV0xfQWRhcHRlckN1cnNvck1ncigpIHt9DQorICB2aXJ0dWFsIEZXTF9IQ1VSU09SIEdldFN5c3RlbUN1cnNvcihGV0xfQ1VSU09SVFlQRSBlQ3Vyc29yVHlwZSkgPSAwOw0KKyAgdmlydHVhbCBGV0xfSENVUlNPUiBHZXRDdXN0b21DdXJzb3IoY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeEhvdHNwb3QgPSAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeUhvdHNwb3QgPSAwKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0Q3Vyc29yKEZXTF9IQ1VSU09SIGhDdXJzb3IpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBTaG93Q3Vyc29yKEZYX0JPT0wgYlNob3cpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRDdXJzb3JQb3MoQ0ZYX1BvaW50RiYgcHQpID0gMDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVybW9uaXRvcm1nci5oIGIveGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJtb25pdG9ybWdyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjOWQ5MgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVybW9uaXRvcm1nci5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX0FEQVBURVJfTU9OSVRPUk1HUl9IDQorI2RlZmluZSBfRldMX0FEQVBURVJfTU9OSVRPUk1HUl9IDQorDQordHlwZWRlZiBzdHJ1Y3QgX0ZXTF9ITU9OSVRPUiB7IHZvaWQqIHBEYXRhOyB9ICogRldMX0hNT05JVE9SOw0KKw0KK2NsYXNzIElGV0xfQWRhcHRlck1vbml0b3JNZ3Igew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRldMX0FkYXB0ZXJNb25pdG9yTWdyKCkge30NCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudE1vbml0b3JzKCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfSE1PTklUT1IgR2V0TW9uaXRvcihpbnQzMl90IG5JbmRleCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfSE1PTklUT1IgR2V0Q3VycmVudE1vbml0b3IoKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9ITU9OSVRPUiBHZXRNb25pdG9yQnlSZWN0KGNvbnN0IENGWF9SZWN0RiYgcmVjdCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfSE1PTklUT1IgR2V0TW9uaXRvckJ5UG9pbnQoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0TW9uaXRvclNpemUoRldMX0hNT05JVE9SIGhNb25pdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZnkpID0gMDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVybmF0aXZlLmggYi94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcm5hdGl2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOTczZTQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcm5hdGl2ZS5oCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX0FEQVBURVJfTkFUSVZFX0gNCisjZGVmaW5lIF9GV0xfQURBUFRFUl9OQVRJVkVfSA0KK2NsYXNzIElGV0xfV2lkZ2V0TWdyRGVsZWdhdGU7DQorY2xhc3MgSUZXTF9BZGFwdGVyV2lkZ2V0TWdyOw0KK2NsYXNzIElGV0xfQWRhcHRlclRocmVhZE1ncjsNCitjbGFzcyBJRldMX0FkYXB0ZXJUaW1lck1ncjsNCitjbGFzcyBJRldMX0FkYXB0ZXJDdXJzb3JNZ3I7DQorY2xhc3MgSUZXTF9BZGFwdGVyTW9uaXRvck1ncjsNCitjbGFzcyBJRldMX0FkYXB0ZXJDbGlwYm9hcmRNZ3I7DQorDQorY2xhc3MgSUZXTF9BZGFwdGVyTmF0aXZlIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZXTF9BZGFwdGVyTmF0aXZlKCkge30NCisgIHZpcnR1YWwgSUZXTF9BZGFwdGVyV2lkZ2V0TWdyKiBHZXRXaWRnZXRNZ3IoDQorICAgICAgSUZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZSogcERlbGVnYXRlKSA9IDA7DQorICB2aXJ0dWFsIElGV0xfQWRhcHRlclRocmVhZE1nciogR2V0VGhyZWFkTWdyKCkgPSAwOw0KKyAgdmlydHVhbCBJRldMX0FkYXB0ZXJUaW1lck1nciogR2V0VGltZXJNZ3IoKSA9IDA7DQorICB2aXJ0dWFsIElGV0xfQWRhcHRlckN1cnNvck1nciogR2V0Q3Vyc29yTWdyKCkgPSAwOw0KKyAgdmlydHVhbCBJRldMX0FkYXB0ZXJNb25pdG9yTWdyKiBHZXRNb25pdG9yTWdyKCkgPSAwOw0KKyAgdmlydHVhbCBJRldMX0FkYXB0ZXJDbGlwYm9hcmRNZ3IqIEdldENsaXBib2FyZE1ncigpID0gMDsNCit9Ow0KK0lGV0xfQWRhcHRlck5hdGl2ZSogRldMX0NyZWF0ZUZ1ZWxBZGFwdGVyTmF0aXZlKCk7DQordm9pZCBGV0xfUmVsZWFzZUZ1ZWxBZGFwdGVyTmF0aXZlKElGV0xfQWRhcHRlck5hdGl2ZSogcEFkYXB0ZXJOYXRpdmUpOw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVydGhyZWFkbWdyLmggYi94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcnRocmVhZG1nci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MGU1MzMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcnRocmVhZG1nci5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBGV0xfQURBUFRFUlRIUkVBRE1HUl9IXw0KKyNkZWZpbmUgRldMX0FEQVBURVJUSFJFQURNR1JfSF8NCisNCitjbGFzcyBJRldMX1RocmVhZDsNCisNCitjbGFzcyBJRldMX0FkYXB0ZXJUaHJlYWRNZ3Igew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRldMX0FkYXB0ZXJUaHJlYWRNZ3IoKSB7fQ0KKyAgdmlydHVhbCBGV0xfRVJSIFN0YXJ0KElGV0xfVGhyZWFkKiBwVGhyZWFkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9IVEhSRUFEJiBoVGhyZWFkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN1c3BlbmRlZCA9IEZBTFNFKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgUmVzdW1lKEZXTF9IVEhSRUFEIGhUaHJlYWQpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBTdXNwZW5kKEZXTF9IVEhSRUFEIGhUaHJlYWQpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBLaWxsKEZXTF9IVEhSRUFEIGhUaHJlYWQsIGludDMyX3QgaUV4aXRDb2RlKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgU3RvcChGV0xfSFRIUkVBRCBoVGhyZWFkLCBpbnQzMl90IGlFeGl0Q29kZSkgPSAwOw0KKyAgdmlydHVhbCBJRldMX1RocmVhZCogR2V0Q3VycmVudFRocmVhZCgpID0gMDsNCit9Ow0KKyNlbmRpZiAgLy8gRldMX0FEQVBURVJUSFJFQURNR1JfSF8NCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcnRpbWVybWdyLmggYi94ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcnRpbWVybWdyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVkOTI0MQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVydGltZXJtZ3IuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9BREFQVEVSX1RJTUVSTUdSX0gNCisjZGVmaW5lIF9GV0xfQURBUFRFUl9USU1FUk1HUl9IDQorDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF9lcnJvci5oIg0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfdGltZXIuaCINCisNCitjbGFzcyBJRldMX1RpbWVyOw0KKw0KK2NsYXNzIElGV0xfQWRhcHRlclRpbWVyTWdyIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZXTF9BZGFwdGVyVGltZXJNZ3IoKSB7fQ0KKyAgdmlydHVhbCBGV0xfRVJSIFN0YXJ0KElGV0xfVGltZXIqIHBUaW1lciwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0VsYXBzZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSFRJTUVSJiBoVGltZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW1tZWRpYXRlbHkgPSBUUlVFKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgU3RvcChGV0xfSFRJTUVSIGhUaW1lcikgPSAwOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJ3aWRnZXRtZ3IuaCBiL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVyd2lkZ2V0bWdyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNiZGQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9hZGFwdGVyd2lkZ2V0bWdyLmgKQEAgLTAsMCArMSw3NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfQURBUFRFUl9XSURHRVRNR1JfSA0KKyNkZWZpbmUgX0ZXTF9BREFQVEVSX1dJREdFVE1HUl9IDQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgSUZXTF9NZW51Ow0KK2NsYXNzIElGV0xfTWVudURQOw0KK2NsYXNzIENGWF9QYXRoOw0KK2NsYXNzIENGWF9ESUJpdG1hcDsNCitjbGFzcyBJRldMX0FkYXB0ZXJNZXNzYWdlSG9vazsNCitjbGFzcyBJRldMX0FwcERlbGVnYXRlOw0KKw0KK2NsYXNzIElGV0xfQWRhcHRlcldpZGdldE1nciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGV0xfQWRhcHRlcldpZGdldE1ncigpIHt9DQorICB2aXJ0dWFsIEZXTF9FUlIgQ3JlYXRlV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcFBhcmVudCA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBEZXN0cm95V2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0V2lkZ2V0UmVjdChJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX1JlY3RGJiByZWN0KSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0V2lkZ2V0UmVjdChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFdpZGdldFBvc2l0aW9uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0UGFyZW50V2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcFBhcmVudCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFdpZGdldEljb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBJY29uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQmlnKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0V2lkZ2V0Q2FwdGlvbihJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDYXB0aW9uKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0Qm9yZGVyUmVnaW9uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBDRlhfUGF0aCogcFBhdGgpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRUcmFuc3BhcmVudChJRldMX1dpZGdldCogcFdpZGdldCwgRlhfRFdPUkQgZHdBbHBoYSkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNob3dXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBIaWRlV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0Tm9ybWFsKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0TWF4aW1pemUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRNaW5pbWl6ZShJRldMX1dpZGdldCogcFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldEZ1bGxTY3JlZW4oSUZXTF9XaWRnZXQqIHBXaWRnZXQsIEZYX0JPT0wgYkZ1bGxTY3JlZW4pID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBDaGVja01lc3NhZ2UoKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNJZGxlTWVzc2FnZSgpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBEaXNwYXRjaE1lc3NhZ2UoKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgUmVwYWludFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBFeGl0KGludDMyX3QgaUV4aXRDb2RlKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgQ3JlYXRlV2lkZ2V0V2l0aE5hdGl2ZUlkKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBVc2VyRGF0YSkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFdpZGdldERDKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCB2b2lkKiYgcERDKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgUmVsZWFzZVdpZGdldERDKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwREMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiogcENsaXAgPSAwKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQqIEdldFdpbmRvdyhJRldMX1dpZGdldCogcFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRLZXlTdGF0ZShGWF9EV09SRCBkd1ZpcnRLZXkpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBSdW5Mb29wKElGV0xfV2lkZ2V0KiB3aWRnZXQpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBFbmRMb29wKCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIEluaXRNZW51KElGV0xfTWVudSogcE1lbnUsIElGV0xfTWVudURQKiBwTWVudURhdGEpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBVcGRhdGVNZW51KElGV0xfTWVudSogcE1lbnUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVR5cGUpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBUcmFja1BvcHVwTWVudShJRldMX01lbnUqIHBNZW51LCBJRldMX01lbnVEUCogcE1lbnVEYXRhKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0TWVzc2FnZUhvb2soSUZXTF9BZGFwdGVyTWVzc2FnZUhvb2sqIGhvb2spID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRTeXN0ZW1Cb3JkZXIoRlhfRkxPQVQmIGwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiB0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGIpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRQb3B1cFBvcyhJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWluSGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNYXhIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJ0UG9wdXApID0gMDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9zZGFkYXB0ZXJpbXAuaCBiL3hmYS9pbmNsdWRlL2Z3bC9hZGFwdGVyL2Z3bF9zZGFkYXB0ZXJpbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmExNzI4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX3NkYWRhcHRlcmltcC5oCkBAIC0wLDAgKzEsOTEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX1NEQVBBVEVSX0lNUF9IDQorI2RlZmluZSBfRldMX1NEQVBBVEVSX0lNUF9IDQorY2xhc3MgSUZXTF9BZGFwdGVyTmF0aXZlOw0KK2NsYXNzIElGV0xfQWRhcHRlcldpZGdldE1ncjsNCitjbGFzcyBJRldMX0FkYXB0ZXJUaHJlYWRNZ3I7DQorY2xhc3MgSUZXTF9BZGFwdGVyVGltZXJNZ3I7DQorY2xhc3MgSUZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZTsNCitjbGFzcyBDRldMX1NEQWRhdHBlck5hdGl2ZTsNCitjbGFzcyBDRldMX1NEQWRhcHRlcldpZGdldE1ncjsNCitjbGFzcyBDRldMX1NEQWRhcHRlclRpbWVyTWdyOw0KK2NsYXNzIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyIDogcHVibGljIElGV0xfQWRhcHRlcldpZGdldE1nciB7DQorIHB1YmxpYzoNCisgIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyKCk7DQorICB+Q0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3IoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBDcmVhdGVXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwUGFyZW50ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRGVzdHJveVdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0V2lkZ2V0UmVjdChJRldMX1dpZGdldCogcFdpZGdldCwgY29uc3QgQ0ZYX1JlY3RGJiByZWN0KTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRXaWRnZXRQb3NpdGlvbihJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0UGFyZW50V2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBJRldMX1dpZGdldCogcFBhcmVudCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2hvd1dpZGdldChJRldMX1dpZGdldCogcFdpZGdldCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgSGlkZVdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0Tm9ybWFsKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRNYXhpbWl6ZShJRldMX1dpZGdldCogcFdpZGdldCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0TWluaW1pemUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFJ1bldpZGdldChJRldMX1dpZGdldCogcFdpZGdldCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgUmVwYWludFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCwgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRXhpdChpbnQzMl90IGlFeGl0Q29kZSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgQ3JlYXRlV2lkZ2V0V2l0aE5hdGl2ZUlkKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCB2b2lkKiB2cCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0UG9wdXBQb3MoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1pbkhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWF4SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRBbmNob3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydFBvcHVwKTsNCisNCisgcHVibGljOg0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFdpZGdldFJlY3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9SZWN0RiYgcmVjdCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0V2lkZ2V0SWNvbihJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcEljb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJCaWcpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFdpZGdldENhcHRpb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2FwdGlvbik7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0Qm9yZGVyUmVnaW9uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBDRlhfUGF0aCogcFBhdGgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFRyYW5zcGFyZW50KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9EV09SRCBkd0FscGhhKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRGdWxsU2NyZWVuKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9CT09MIGJGdWxsU2NyZWVuKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDaGVja01lc3NhZ2UoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0lkbGVNZXNzYWdlKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRGlzcGF0Y2hNZXNzYWdlKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0V2lkZ2V0REMoSUZXTF9XaWRnZXQqIHBXaWRnZXQsIHZvaWQqJiBwREMpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFJlbGVhc2VXaWRnZXREQyhJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcERDLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYqIHBDbGlwID0gMCk7DQorICB2aXJ0dWFsIHZvaWQqIEdldFdpbmRvdyhJRldMX1dpZGdldCogcFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldEtleVN0YXRlKEZYX0RXT1JEIGR3VmlydEtleSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgUnVuTG9vcChJRldMX1dpZGdldCogd2lkZ2V0KTsNCisgIHZpcnR1YWwgRldMX0VSUiBFbmRMb29wKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdE1lbnUoSUZXTF9NZW51KiBwTWVudSwgSUZXTF9NZW51RFAqIHBNZW51RGF0YSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgVXBkYXRlTWVudShJRldMX01lbnUqIHBNZW51LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlUeXBlKTsNCisgIHZpcnR1YWwgaW50MzJfdCBUcmFja1BvcHVwTWVudShJRldMX01lbnUqIHBNZW51LCBJRldMX01lbnVEUCogcE1lbnVEYXRhKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRNZXNzYWdlSG9vayhJRldMX0FkYXB0ZXJNZXNzYWdlSG9vayogaG9vayk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0U3lzdGVtQm9yZGVyKEZYX0ZMT0FUJiBsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBiKTsNCit9Ow0KK2NsYXNzIENGV0xfU0RBZGFwdGVyVGhyZWFkTWdyIDogcHVibGljIElGV0xfQWRhcHRlclRocmVhZE1nciB7DQorIHB1YmxpYzoNCisgIENGV0xfU0RBZGFwdGVyVGhyZWFkTWdyKCk7DQorICB+Q0ZXTF9TREFkYXB0ZXJUaHJlYWRNZ3IoKTsNCisNCisgcHVibGljOg0KKyAgdmlydHVhbCBGV0xfRVJSIFN0YXJ0KElGV0xfVGhyZWFkKiBwVGhyZWFkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9IVEhSRUFEJiBoVGhyZWFkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN1c3BlbmRlZCA9IEZBTFNFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBSZXN1bWUoRldMX0hUSFJFQUQgaFRocmVhZCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU3VzcGVuZChGV0xfSFRIUkVBRCBoVGhyZWFkKTsNCisgIHZpcnR1YWwgRldMX0VSUiBLaWxsKEZXTF9IVEhSRUFEIGhUaHJlYWQsIGludDMyX3QgaUV4aXRDb2RlKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTdG9wKEZXTF9IVEhSRUFEIGhUaHJlYWQsIGludDMyX3QgaUV4aXRDb2RlKTsNCisgIHZpcnR1YWwgSUZXTF9UaHJlYWQqIEdldEN1cnJlbnRUaHJlYWQoKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9iYXJjb2RlLmggYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfYmFyY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NTYzMGYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfYmFyY29kZS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX0JBUkNPREVfSA0KKyNkZWZpbmUgX0ZXTF9CQVJDT0RFX0gNCisjaW5jbHVkZSAiZndsX2VkaXQuaCINCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgSUZXTF9CYXJjb2RlRFA7DQorY2xhc3MgSUZXTF9CYXJjb2RlOw0KKyNkZWZpbmUgRldMX0NMQVNTX0JhcmNvZGUgTCJGV0xfQkFSQ09ERSINCisjZGVmaW5lIEZXTF9DTEFTU0hBU0hfQmFyY29kZSAzNjY4ODY5NjgNCisjZGVmaW5lIEZXTF9CQ0RBVFRSSUJVVEVfQ0hBUkVOQ09ESU5HICgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX0JDREFUVFJJQlVURV9NT0RVTEVIRUlHSFQgKDFMIDw8IDEpDQorI2RlZmluZSBGV0xfQkNEQVRUUklCVVRFX01PRFVMRVdJRFRIICgxTCA8PCAyKQ0KKyNkZWZpbmUgRldMX0JDREFUVFJJQlVURV9EQVRBTEVOR1RIICgxTCA8PCAzKQ0KKyNkZWZpbmUgRldMX0JDREFUVFJJQlVURV9DQUxDSEVDS1NVTSAoMUwgPDwgNCkNCisjZGVmaW5lIEZXTF9CQ0RBVFRSSUJVVEVfUFJJTlRDSEVDS1NVTSAoMUwgPDwgNSkNCisjZGVmaW5lIEZXTF9CQ0RBVFRSSUJVVEVfVEVYVExPQ0FUSU9OICgxTCA8PCA2KQ0KKyNkZWZpbmUgRldMX0JDREFUVFJJQlVURV9XSURFTkFSUk9XUkFUSU8gKDFMIDw8IDcpDQorI2RlZmluZSBGV0xfQkNEQVRUUklCVVRFX1NUQVJUQ0hBUiAoMUwgPDwgOCkNCisjZGVmaW5lIEZXTF9CQ0RBVFRSSUJVVEVfRU5EQ0hBUiAoMUwgPDwgOSkNCisjZGVmaW5lIEZXTF9CQ0RBVFRSSUJVVEVfVkVSU0lPTiAoMUwgPDwgMTApDQorI2RlZmluZSBGV0xfQkNEQVRUUklCVVRFX0VDTEVWRUwgKDFMIDw8IDExKQ0KKyNkZWZpbmUgRldMX0JDREFUVFJJQlVURV9UUlVOQ0FURUQgKDFMIDw8IDEyKQ0KKyNkZWZpbmUgRldMX1BBUlRfQkNEX0JvcmRlciAxDQorI2RlZmluZSBGV0xfUEFSVF9CQ0RfRWRnZSAyDQorI2RlZmluZSBGV0xfUEFSVF9CQ0RfQmFja2dyb3VuZCAzDQorI2RlZmluZSBGV0xfQkNVUERBVEVDTURfRGF0YSBGV0xfV0dUVVBEQVRFQ01EX1VzZXINCitjbGFzcyBJRldMX0JhcmNvZGVEUCA6IHB1YmxpYyBJRldMX0VkaXREUCB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgQkNfQ0hBUl9FTkNPRElORyBHZXRDaGFyRW5jb2RpbmcoKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0TW9kdWxlSGVpZ2h0KCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldE1vZHVsZVdpZHRoKCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldERhdGFMZW5ndGgoKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q2FsQ2hlY2tzdW0oKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0UHJpbnRDaGVja3N1bSgpID0gMDsNCisgIHZpcnR1YWwgQkNfVEVYVF9MT0MgR2V0VGV4dExvY2F0aW9uKCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFdpZGVOYXJyb3dSYXRpbygpID0gMDsNCisgIHZpcnR1YWwgRlhfQ0hBUiBHZXRTdGFydENoYXIoKSA9IDA7DQorICB2aXJ0dWFsIEZYX0NIQVIgR2V0RW5kQ2hhcigpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRWZXJzaW9uKCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEVycm9yQ29ycmVjdGlvbkxldmVsKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldFRydW5jYXRlZCgpID0gMDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0QmFyY29kZUF0dHJpYnV0ZU1hc2soKSA9IDA7DQorfTsNCisNCitjbGFzcyBJRldMX0JhcmNvZGUgOiBwdWJsaWMgSUZXTF9FZGl0IHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGV0xfQmFyY29kZSogQ3JlYXRlKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcyk7DQorICB2b2lkIFNldFR5cGUoQkNfVFlQRSB0eXBlKTsNCisgIEZYX0JPT0wgSXNQcm90ZWN0ZWRUeXBlKCk7DQorDQorIHByb3RlY3RlZDoNCisgIElGV0xfQmFyY29kZSgpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2NhcmV0LmggYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfY2FyZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTVhMGMyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2NhcmV0LmgKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfQ0FSRVRfSA0KKyNkZWZpbmUgX0ZXTF9DQVJFVF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzOw0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIElGV0xfQ2FyZXQ7DQorI2RlZmluZSBGV0xfQ0xBU1NfQ2FyZXQgTCJGV0xfQ0FSRVQiDQorI2RlZmluZSBGV0xfQ0xBU1NIQVNIX0NhcmV0IDY3MTE4MTg3OQ0KKyNkZWZpbmUgRldMX1NUQVRFX0NBVF9IaWdodExpZ2h0IDENCisjZGVmaW5lIEZXTF9QQVJUX0NBVF9CYWNrZ3JvdW5kIDENCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfQ0FUX0hpZ2h0TGlnaHQgMQ0KKw0KK2NsYXNzIElGV0xfQ2FyZXQgOiBwdWJsaWMgSUZXTF9XaWRnZXQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZXTF9DYXJldCogQ3JlYXRlKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcik7DQorDQorICBGV0xfRVJSIFNob3dDYXJldChGWF9CT09MIGJGbGFnID0gVFJVRSk7DQorICBGV0xfRVJSIEdldEZyZXF1ZW5jeShGWF9EV09SRCYgZWxhcHNlKTsNCisgIEZXTF9FUlIgU2V0RnJlcXVlbmN5KEZYX0RXT1JEIGVsYXBzZSk7DQorICBGV0xfRVJSIFNldENvbG9yKENGWF9Db2xvciBjckZpbGwpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRldMX0NhcmV0KCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfY2hlY2tib3guaCBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9jaGVja2JveC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MTAyZDYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfY2hlY2tib3guaApAQCAtMCwwICsxLDgxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9DSEVDS0JPWF9IDQorI2RlZmluZSBfRldMX0NIRUNLQk9YX0gNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgSUZXTF9DaGVja0JveERQOw0KK2NsYXNzIElGV0xfQ2hlY2tCb3g7DQorI2RlZmluZSBGV0xfQ0xBU1NfQ2hlY2tCb3ggTCJGV0xfQ0hFQ0tCT1giDQorI2RlZmluZSBGV0xfQ0xBU1NIQVNIX0NoZWNrQm94IDQxMDcxODM4MjMNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfTGVmdCAoMEwgPDwgMCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfQ2VudGVyICgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9SaWdodCAoMkwgPDwgMCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfVG9wICgwTCA8PCAyKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9WQ2VudGVyICgxTCA8PCAyKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9Cb3R0b20gKDJMIDw8IDIpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX0xlZnRUZXh0ICgxTCA8PCA0KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9NdWx0aUxpbmUgKDFMIDw8IDUpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCXzNTdGF0ZSAoMUwgPDwgNikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfUmFkaW9CdXR0b24gKDFMIDw8IDcpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1NoYXBlU29saWRTcXVhcmUgKDBMIDw8IDgpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1NoYXBlU3Vua2VuU3F1YXJlICgxTCA8PCA4KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9TaGFwZVNvbGlkQ2lyY2xlICgyTCA8PCA4KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9TaGFwZVN1bmtlbkNpcmNsZSAoM0wgPDwgOCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ2hlY2sgKDBMIDw8IDEwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVDaXJjbGUgKDFMIDw8IDEwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVDcm9zcyAoMkwgPDwgMTApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZURpYW1vbmQgKDNMIDw8IDEwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVTcXVhcmUgKDRMIDw8IDEwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVTdGFyICg1TCA8PCAxMCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DS0JfSExheW91dE1hc2sgKDNMIDw8IDApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1ZMYXlvdXRNYXNrICgzTCA8PCAyKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NLQl9TaGFwZU1hc2sgKDNMIDw8IDgpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZU1hc2sgKDdMIDw8IDEwKQ0KKyNkZWZpbmUgRldMX1NUQVRFX0NLQl9Ib3ZlcmVkICgxIDw8IEZXTF9XR1RTVEFURV9NQVgpDQorI2RlZmluZSBGV0xfU1RBVEVfQ0tCX1ByZXNzZWQgKDEgPDwgKEZXTF9XR1RTVEFURV9NQVggKyAxKSkNCisjZGVmaW5lIEZXTF9TVEFURV9DS0JfVW5jaGVja2VkICgwIDw8IChGV0xfV0dUU1RBVEVfTUFYICsgMikpDQorI2RlZmluZSBGV0xfU1RBVEVfQ0tCX0NoZWNrZWQgKDEgPDwgKEZXTF9XR1RTVEFURV9NQVggKyAyKSkNCisjZGVmaW5lIEZXTF9TVEFURV9DS0JfTmV1dHJhbCAoMiA8PCAoRldMX1dHVFNUQVRFX01BWCArIDIpKQ0KKyNkZWZpbmUgRldMX1NUQVRFX0NLQl9DaGVja01hc2sgKDNMIDw8IChGV0xfV0dUU1RBVEVfTUFYICsgMikpDQorI2RlZmluZSBGV0xfUEFSVF9DS0JfQm9yZGVyIDENCisjZGVmaW5lIEZXTF9QQVJUX0NLQl9FZGdlIDINCisjZGVmaW5lIEZXTF9QQVJUX0NLQl9CYWNrZ3JvdW5kIDMNCisjZGVmaW5lIEZXTF9QQVJUX0NLQl9DaGVja0JveCA0DQorI2RlZmluZSBGV0xfUEFSVF9DS0JfQ2FwdGlvbiA1DQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NLQl9Ob3JtYWwgKDBMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NLQl9QcmVzc2VkICgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9DS0JfSG92ZXJlZCAoMkwgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfQ0tCX0Rpc2FibGVkICgzTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9DS0JfVW5DaGVja2VkICgwTCA8PCAyKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9DS0JfQ2hlY2tlZCAoMUwgPDwgMikNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfQ0tCX05ldXRyYWwgKDJMIDw8IDIpDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NLQl9Gb2N1c2VkICgxTCA8PCA0KQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9DS0JfTWFzazEgKDNMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMiAoM0wgPDwgMikNCisjZGVmaW5lIEZXTF9FVlRfQ0tCX0NoZWNrU3RhdGVDaGFuZ2VkIEwiRldMX0VWRU5UX0NLQl9DaGVja1N0YXRlQ2hhbmdlZCINCisjZGVmaW5lIEZXTF9FVlRIQVNIX0NLQl9DaGVja1N0YXRlQ2hhbmdlZCAyNTAzMjUyOTYzDQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dENrYkNoZWNrU3RhdGVDaGFuZ2VkLA0KKyAgICAgICAgICAgICAgICAgICAgRldMX0VWVEhBU0hfQ0tCX0NoZWNrU3RhdGVDaGFuZ2VkKQ0KK0VORF9GV0xfRVZFTlRfREVGDQorY2xhc3MgSUZXTF9DaGVja0JveERQIDogcHVibGljIElGV0xfRGF0YVByb3ZpZGVyIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRCb3hTaXplKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSA9IDA7DQorfTsNCisNCitjbGFzcyBJRldMX0NoZWNrQm94IDogcHVibGljIElGV0xfV2lkZ2V0IHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGV0xfQ2hlY2tCb3gqIENyZWF0ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpOw0KKyAgaW50MzJfdCBHZXRDaGVja1N0YXRlKCk7DQorICBGV0xfRVJSIFNldENoZWNrU3RhdGUoaW50MzJfdCBpQ2hlY2spOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRldMX0NoZWNrQm94KCk7DQorfTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfY29tYm9ib3guaCBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9jb21ib2JveC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYTliZGQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfY29tYm9ib3guaApAQCAtMCwwICsxLDEzOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfQ09NQk9CT1hfSA0KKyNkZWZpbmUgX0ZXTF9DT01CT0JPWF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzOw0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIElGV0xfTGlzdEJveDsNCitjbGFzcyBJRldMX0NvbWJvQm94RFA7DQorY2xhc3MgSUZXTF9Db21ib0JveDsNCisjZGVmaW5lIEZXTF9DTEFTU19Db21ib0JveCBMIkZXTF9DT01CT0JPWCINCisjZGVmaW5lIEZXTF9DTEFTU0hBU0hfQ29tYm9Cb3ggNjAyMzUzNjk3DQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX0Ryb3BMaXN0ICgwTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9Ecm9wRG93biAoMUwgPDwgMCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfU29ydCAoMUwgPDwgMSkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfTGlzdERyYWcgKDFMIDw8IDIpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX093bmVyRHJhdyAoMUwgPDwgMykNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfRWRpdEhOZWFyICgwTCA8PCA0KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9FZGl0SENlbnRlciAoMUwgPDwgNCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfRWRpdEhGYXIgKDJMIDw8IDQpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRWTmVhciAoMEwgPDwgNikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfRWRpdFZDZW50ZXIgKDFMIDw8IDYpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRWRmFyICgyTCA8PCA2KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9FZGl0SnVzdGlmaWVkICgxTCA8PCA4KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9FZGl0RGlzdHJpYnV0ZWQgKDJMIDw8IDgpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRIQWxpZ25NYXNrICgzTCA8PCA0KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9FZGl0VkFsaWduTWFzayAoM0wgPDwgNikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfRWRpdEhBbGlnbk1vZGVNYXNrICgzTCA8PCA4KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9MaXN0SXRlbUxlZnRBbGlnbiAoMEwgPDwgMTApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfQ01CX0xpc3RJdGVtQ2VudGVyQWxpZ24gKDFMIDw8IDEwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9MaXN0SXRlbVJpZ2h0QWxpZ24gKDJMIDw8IDEwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9MaXN0SXRlbVRleHQgKDBMIDw8IDEyKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9MaXN0SXRlbUljb25UZXh0ICgxTCA8PCAxMikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9DTUJfTGlzdEl0ZW1BbGlnbk1hc2sgKDNMIDw8IDEyKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0NNQl9SZWFkT25seSAoMUwgPDwgMTMpDQorI2RlZmluZSBGV0xfUEFSVF9DTUJfQm9yZGVyIDENCisjZGVmaW5lIEZXTF9QQVJUX0NNQl9FZGdlIDINCisjZGVmaW5lIEZXTF9QQVJUX0NNQl9CYWNrZ3JvdW5kIDMNCisjZGVmaW5lIEZXTF9QQVJUX0NNQl9Ecm9wRG93bkJ1dHRvbiA0DQorI2RlZmluZSBGV0xfUEFSVF9DTUJfQ2FwdGlvbiA1DQorI2RlZmluZSBGV0xfUEFSVF9DTUJfU3RyZXRjZ0hhbmRsZXIgNg0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9DTUJfTm9ybWFsICgwTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9DTUJfSG92ZXJlZCAoMUwgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfQ01CX1ByZXNzZWQgKDJMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0NNQl9EaXNhYmxlZCAoM0wgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfQ01CX1NlbGVjdGVkICgxTCA8PCAyKQ0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX0NNQl9Db21ib0Zvcm1IYW5kbGVyIChGV0xfV0dUQ0FQQUNJVFlfTUFYICsgNykNCitlbnVtIEZXTF9DTUJfVEVYVENIQU5HRUQgew0KKyAgRldMX0NNQl9URVhUQ0hBTkdFRF9JbnNlcnQgPSAwLA0KKyAgRldMX0NNQl9URVhUQ0hBTkdFRF9EZWxldGUsDQorICBGV0xfQ01CX1RFWFRDSEFOR0VEX1JlcGxhY2UsDQorfTsNCisjZGVmaW5lIEZXTF9FVlRfQ01CX0Ryb3BEb3duIEwiRldMX0VWRU5UX0NNQl9QcmVEcm9wRG93biINCisjZGVmaW5lIEZXTF9FVlRfQ01CX1Bvc3REcm9wRG93biBMIkZXTF9FVkVOVF9DTUJfUG9zdERyb3BEb3duIg0KKyNkZWZpbmUgRldMX0VWVF9DTUJfQ2xvc2VVcCBMIkZXTF9FVkVOVF9DTUJfQ2xvc2VVcCINCisjZGVmaW5lIEZXTF9FVlRfQ01CX0VkaXRDaGFuZ2VkIEwiRldMX0VWRU5UX0NNQl9FZGl0Q2hhbmdlZCINCisjZGVmaW5lIEZXTF9FVlRfQ01CX1NlbENoYW5nZWQgTCJGV0xfRVZFTlRfQ01CX1NlbENoYW5nZWQiDQorI2RlZmluZSBGV0xfRVZUX0NNQl9Ib3ZlckNoYW5nZWQgTCJGV0xfRVZFTlRfQ01CX0hvdmVyQ2hhbmdlZCINCisjZGVmaW5lIEZXTF9FVlRfQ01CX0RyYXdJdGVtIEwiRldMX0VWRU5UX0NNQl9EcmF3SXRlbSINCisjZGVmaW5lIEZXTF9FVlRIQVNIX0NNQl9QcmVEcm9wRG93biAxMzU3NjQ2Nzk4DQorI2RlZmluZSBGV0xfRVZUSEFTSF9DTUJfUG9zdERyb3BEb3duIDM2NzcwMTAyODUNCisjZGVmaW5lIEZXTF9FVlRIQVNIX0NNQl9DbG9zZVVwIDI4NzEyNzExOTANCisjZGVmaW5lIEZXTF9FVlRIQVNIX0NNQl9FZGl0Q2hhbmdlZCAxNTI3MDM0NzYyDQorI2RlZmluZSBGV0xfRVZUSEFTSF9DTUJfU2VsQ2hhbmdlZCAyOTIzMjI3Nzg0DQorI2RlZmluZSBGV0xfRVZUSEFTSF9DTUJfSG92ZXJDaGFuZ2VkIDk0NDMyNTQ0OA0KKyNkZWZpbmUgRldMX0VWVEhBU0hfQ01CX0RyYXdJdGVtIDkxNzM1NDU1MQ0KK0JFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdnRDbWJQcmVEcm9wRG93biwgRldMX0VWVEhBU0hfQ01CX1ByZURyb3BEb3duKQ0KK0VORF9GV0xfRVZFTlRfREVGDQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dENtYlBvc3REcm9wRG93biwgRldMX0VWVEhBU0hfQ01CX1Bvc3REcm9wRG93bikNCitFTkRfRldMX0VWRU5UX0RFRg0KK0JFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdnRDbWJDbG9zZVVwLCBGV0xfRVZUSEFTSF9DTUJfQ2xvc2VVcCkNCitFTkRfRldMX0VWRU5UX0RFRg0KK0JFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdnRDbWJFZGl0Q2hhbmdlZCwgRldMX0VWVEhBU0hfQ01CX0VkaXRDaGFuZ2VkKQ0KK2ludDMyX3QgbkNoYW5nZVR5cGU7DQorQ0ZYX1dpZGVTdHJpbmcgd3NJbnNlcnQ7DQorQ0ZYX1dpZGVTdHJpbmcgd3NEZWxldGU7DQorRU5EX0ZXTF9FVkVOVF9ERUYNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0Q21iU2VsQ2hhbmdlZCwgRldMX0VWVEhBU0hfQ01CX1NlbENoYW5nZWQpDQorQ0ZYX0ludDMyQXJyYXkgaUFycmF5U2VsczsNCitGWF9CT09MIGJMQnV0dG9uVXA7DQorRU5EX0ZXTF9FVkVOVF9ERUYNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0Q21iSG92ZXJDaGFuZ2VkLCBGV0xfRVZUSEFTSF9DTUJfSG92ZXJDaGFuZ2VkKQ0KK2ludDMyX3QgbV9pQ3VySG92ZXI7DQorRU5EX0ZXTF9FVkVOVF9ERUYNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0Q21iRHJhd0l0ZW0sIEZXTF9FVlRIQVNIX0NNQl9EcmF3SXRlbSkNCitDRlhfR3JhcGhpY3MqIG1fcEdyYXBoaWNzOw0KK0NGWF9NYXRyaXggbV9tYXRyaXg7DQoraW50MzJfdCBtX2luZGV4Ow0KK0NGWF9SZWN0RiBtX3J0SXRlbTsNCitFTkRfRldMX0VWRU5UX0RFRg0KK2NsYXNzIElGV0xfQ29tYm9Cb3hEUCA6IHB1YmxpYyBJRldMX0xpc3RCb3hEUCB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0TGlzdEhlaWdodChJRldMX1dpZGdldCogcFdpZGdldCkgPSAwOw0KK307DQorY2xhc3MgSUZXTF9Db21ib0JveCA6IHB1YmxpYyBJRldMX1dpZGdldCB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRldMX0NvbWJvQm94KiBDcmVhdGUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzKTsNCisNCisgIGludDMyX3QgR2V0Q3VyU2VsKCk7DQorICBGV0xfRVJSIFNldEN1clNlbChpbnQzMl90IGlTZWwpOw0KKyAgRldMX0VSUiBTZXRFZGl0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsNCisgIGludDMyX3QgR2V0RWRpdFRleHRMZW5ndGgoKSBjb25zdDsNCisgIEZXTF9FUlIgR2V0RWRpdFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnQgPSAwLA0KKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCA9IC0xKSBjb25zdDsNCisgIEZXTF9FUlIgU2V0RWRpdFNlbFJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCA9IC0xKTsNCisgIGludDMyX3QgR2V0RWRpdFNlbFJhbmdlKGludDMyX3QgbkluZGV4LCBpbnQzMl90JiBuU3RhcnQpOw0KKyAgaW50MzJfdCBHZXRFZGl0TGltaXQoKTsNCisgIEZXTF9FUlIgU2V0RWRpdExpbWl0KGludDMyX3QgbkxpbWl0KTsNCisgIEZXTF9FUlIgRWRpdERvQ2xpcGJvYXJkKGludDMyX3QgaUNtZCk7DQorICBGWF9CT09MIEVkaXRSZWRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZWNvcmQpOw0KKyAgRlhfQk9PTCBFZGl0VW5kbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKTsNCisgIElGV0xfTGlzdEJveCogR2V0TGlzdEJveHQoKTsNCisgIEZYX0JPT0wgQWZ0ZXJGb2N1c1Nob3dEcm9wTGlzdCgpOw0KKyAgRlhfRVJSIE9wZW5Ecm9wRG93bkxpc3QoRlhfQk9PTCBiQWN0aXZhdGUpOw0KKyAgRlhfQk9PTCBFZGl0Q2FuVW5kbygpOw0KKyAgRlhfQk9PTCBFZGl0Q2FuUmVkbygpOw0KKyAgRlhfQk9PTCBFZGl0VW5kbygpOw0KKyAgRlhfQk9PTCBFZGl0UmVkbygpOw0KKyAgRlhfQk9PTCBFZGl0Q2FuQ29weSgpOw0KKyAgRlhfQk9PTCBFZGl0Q2FuQ3V0KCk7DQorICBGWF9CT09MIEVkaXRDYW5TZWxlY3RBbGwoKTsNCisgIEZYX0JPT0wgRWRpdENvcHkoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29weSk7DQorICBGWF9CT09MIEVkaXRDdXQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ3V0KTsNCisgIEZYX0JPT0wgRWRpdFBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1Bhc3RlKTsNCisgIEZYX0JPT0wgRWRpdFNlbGVjdEFsbCgpOw0KKyAgRlhfQk9PTCBFZGl0RGVsZXRlKCk7DQorICBGWF9CT09MIEVkaXREZVNlbGVjdCgpOw0KKyAgRldMX0VSUiBHZXRCQm94KENGWF9SZWN0RiYgcmVjdCk7DQorICBGV0xfRVJSIEVkaXRNb2RpZnlTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQorDQorIHByb3RlY3RlZDoNCisgIElGV0xfQ29tYm9Cb3goKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9kYXRldGltZXBpY2tlci5oIGIveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2RhdGV0aW1lcGlja2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTViYTBlYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9kYXRldGltZXBpY2tlci5oCkBAIC0wLDAgKzEsMTA1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9EQVRFVElNRVBJQ0tFUl9IDQorI2RlZmluZSBfRldMX0RBVEVUSU1FUElDS0VSX0gNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgSUZXTF9EYXRlVGltZVBpY2tlckRQOw0KK2NsYXNzIElGV0xfRGF0ZVRpbWVQaWNrZXI7DQorI2RlZmluZSBGV0xfQ0xBU1NfRGF0ZVRpbWVQaWNrZXIgTCJGV0xfREFURVRJTUVQSUNLRVIiDQorI2RlZmluZSBGV0xfQ0xBU1NIQVNIX0RhdGVUaW1lUGlja2VyIDM4NTExNzYyNTcNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9EVFBfQWxsb3dFZGl0ICgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0RUUF9Mb25nRGF0ZUZvcm1hdCAoMEwgPDwgMSkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9EVFBfU2hvcnREYXRlRm9ybWF0ICgxTCA8PCAxKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0RUUF9UaW1lRm9ybWF0ICgyTCA8PCAxKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0RUUF9TcGluICgxTCA8PCAzKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0RUUF9FZGl0SE5lYXIgKDBMIDw8IDQpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRIQ2VudGVyICgxTCA8PCA0KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0RUUF9FZGl0SEZhciAoMkwgPDwgNCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9EVFBfRWRpdFZOZWFyICgwTCA8PCA2KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0RUUF9FZGl0VkNlbnRlciAoMUwgPDwgNikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9EVFBfRWRpdFZGYXIgKDJMIDw8IDYpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRKdXN0aWZpZWQgKDFMIDw8IDgpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRFRQX0VkaXREaXN0cmlidXRlZCAoMkwgPDwgOCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9EVFBfRWRpdEhBbGlnbk1hc2sgKDNMIDw8IDQpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRWQWxpZ25NYXNrICgzTCA8PCA2KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0RUUF9FZGl0SEFsaWduTW9kZU1hc2sgKDNMIDw8IDgpDQorI2RlZmluZSBGV0xfUEFSVF9EVFBfQm9yZGVyIDENCisjZGVmaW5lIEZXTF9QQVJUX0RUUF9FZGdlIDINCisjZGVmaW5lIEZXTF9QQVJUX0RUUF9CYWNrZ3JvdW5kIDMNCisjZGVmaW5lIEZXTF9QQVJUX0RUUF9Ecm9wRG93bkJ1dHRvbiA0DQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0RUUF9Ob3JtYWwgKDBMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0RUUF9Ib3ZlcmVkICgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9EVFBfUHJlc3NlZCAoMkwgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfRFRQX0Rpc2FibGVkICgzTCA8PCAwKQ0KKyNkZWZpbmUgRldMX0VWVF9EVFBfRHJvcERvd24gTCJGV0xfRVZFTlRfRFRQX0Ryb3BEb3duIg0KKyNkZWZpbmUgRldMX0VWVEhBU0hfRFRQX0Ryb3BEb3duIDI2NDcyODczMw0KKyNkZWZpbmUgRldMX0VWVF9EVFBfQ2xvc2VVcCBMIkZXTF9FVkVOVF9EVFBfQ2xvc2VVcCINCisjZGVmaW5lIEZXTF9FVlRIQVNIX0RUUF9DbG9zZVVwIDQyODA5NzM4MDMNCisjZGVmaW5lIEZXTF9FVlRfRFRQX0VkaXRDaGFuZ2VkIEwiRldMX0VWRU5UX0RUUF9FZGl0Q2hhbmdlZCINCisjZGVmaW5lIEZXTF9FVlRIQVNIX0RUUF9FZGl0Q2hhbmdlZCA0MDA5NjEwOTQ0DQorI2RlZmluZSBGV0xfRVZUX0RUUF9Ib3ZlckNoYW5nZWQgTCJGV0xfRVZFTlRfRFRQX0hvdmVyQ2hhbmdlZCINCisjZGVmaW5lIEZXTF9FVlRIQVNIX0RUUF9Ib3ZlckNoYW5nZWQgNjg2Njc0NzUwDQorI2RlZmluZSBGV0xfRVZUX0RUUF9TZWxlY3RDaGFuZ2VkIEwiRldMX0VWRU5UX0RUUF9TZWxlY3RDaGFuZ2VkIg0KKyNkZWZpbmUgRldMX0VWVEhBU0hfRFRQX1NlbGVjdENoYW5nZWQgMTU4OTYxNjg1OA0KK0JFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdmVudF9EdHBEcm9wRG93biwgRldMX0VWVEhBU0hfRFRQX0Ryb3BEb3duKQ0KK0VORF9GV0xfRVZFTlRfREVGDQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2ZW50X0R0cENsb3NlVXAsIEZXTF9FVlRIQVNIX0RUUF9DbG9zZVVwKQ0KK0VORF9GV0xfRVZFTlRfREVGDQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2ZW50X0R0cEVkaXRDaGFuZ2VkLCBGV0xfRVZUSEFTSF9EVFBfRWRpdENoYW5nZWQpDQorQ0ZYX1dpZGVTdHJpbmcgbV93c1RleHQ7DQorRU5EX0ZXTF9FVkVOVF9ERUYNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZlbnRfRHRwSG92ZXJDaGFuZ2VkLCBGV0xfRVZUSEFTSF9EVFBfSG92ZXJDaGFuZ2VkKQ0KK2ludDMyX3QgaG92ZXJkYXk7DQorRU5EX0ZXTF9FVkVOVF9ERUYNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZlbnRfRHRwU2VsZWN0Q2hhbmdlZCwgRldMX0VWVEhBU0hfRFRQX1NlbGVjdENoYW5nZWQpDQoraW50MzJfdCBpWWVhcjsNCitpbnQzMl90IGlNb250aDsNCitpbnQzMl90IGlEYXk7DQorRU5EX0ZXTF9FVkVOVF9ERUYNCitjbGFzcyBJRldMX0RhdGVUaW1lUGlja2VyRFAgOiBwdWJsaWMgSUZXTF9EYXRhUHJvdmlkZXIgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0VG9kYXkoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVllYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlEYXkpID0gMDsNCit9Ow0KK2NsYXNzIElGV0xfRGF0ZVRpbWVQaWNrZXIgOiBwdWJsaWMgSUZXTF9XaWRnZXQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZXTF9EYXRlVGltZVBpY2tlciogQ3JlYXRlKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcik7DQorDQorICBGV0xfRVJSIEdldEN1clNlbChpbnQzMl90JiBpWWVhciwgaW50MzJfdCYgaU1vbnRoLCBpbnQzMl90JiBpRGF5KTsNCisgIEZXTF9FUlIgU2V0Q3VyU2VsKGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoLCBpbnQzMl90IGlEYXkpOw0KKyAgRldMX0VSUiBTZXRFZGl0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsNCisgIEZXTF9FUlIgR2V0RWRpdFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnQgPSAwLA0KKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCA9IC0xKSBjb25zdDsNCisgIGludDMyX3QgQ291bnRTZWxSYW5nZXMoKTsNCisgIGludDMyX3QgR2V0U2VsUmFuZ2UoaW50MzJfdCBuSW5kZXgsIGludDMyX3QmIG5TdGFydCk7DQorICBGWF9CT09MIENhblVuZG8oKTsNCisgIEZYX0JPT0wgQ2FuUmVkbygpOw0KKyAgRlhfQk9PTCBVbmRvKCk7DQorICBGWF9CT09MIFJlZG8oKTsNCisgIEZYX0JPT0wgQ2FuQ29weSgpOw0KKyAgRlhfQk9PTCBDYW5DdXQoKTsNCisgIEZYX0JPT0wgQ2FuU2VsZWN0QWxsKCk7DQorICBGWF9CT09MIENvcHkoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29weSk7DQorICBGWF9CT09MIEN1dChDRlhfV2lkZVN0cmluZyYgd3NDdXQpOw0KKyAgRlhfQk9PTCBQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXN0ZSk7DQorICBGWF9CT09MIFNlbGVjdEFsbCgpOw0KKyAgRlhfQk9PTCBEZWxldGUoKTsNCisgIEZYX0JPT0wgRGVTZWxlY3QoKTsNCisgIEZXTF9FUlIgR2V0QkJveChDRlhfUmVjdEYmIHJlY3QpOw0KKyAgRldMX0VSUiBTZXRFZGl0TGltaXQoaW50MzJfdCBuTGltaXQpOw0KKyAgRldMX0VSUiBNb2RpZnlFZGl0U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRldMX0RhdGVUaW1lUGlja2VyKCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfZWRpdC5oIGIveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2VkaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTczOThhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2VkaXQuaApAQCAtMCwwICsxLDE2NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfRURJVF9IDQorI2RlZmluZSBfRldMX0VESVRfSA0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllczsNCitjbGFzcyBJRldMX1dpZGdldDsNCitjbGFzcyBJRldMX0VkaXREUDsNCitjbGFzcyBJRldMX0VkaXQ7DQorI2RlZmluZSBGV0xfQ0xBU1NfRWRpdCBMIkZXTF9FRElUIg0KKyNkZWZpbmUgRldMX0NMQVNTSEFTSF9FZGl0IDI4OTM5ODc4MjINCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHkgKDFMIDw8IDApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX011bHRpTGluZSAoMUwgPDwgMSkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfV2FudFJldHVybiAoMUwgPDwgMikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfTm9IaWRlU2VsICgxTCA8PCAzKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9BdXRvSFNjcm9sbCAoMUwgPDwgNCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfQXV0b1ZTY3JvbGwgKDFMIDw8IDUpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX05vUmVkb1VuZG8gKDFMIDw8IDYpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX1ZhbGlkYXRlICgxTCA8PCA3KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9QYXNzd29yZCAoMUwgPDwgOCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfTnVtYmVyICgxTCA8PCA5KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9IU2VsZkFkYXB0aW9uICgxTCA8PCAxMCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfVlNlbGZBZGFwdGlvbiAoMUwgPDwgMTEpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX1ZlcnRpY2FsTGF5b3V0ICgxTCA8PCAxMikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfVmVydGljYWxDaGFycyAoMUwgPDwgMTMpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX1JldmVyc2VMaW5lICgxTCA8PCAxNCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfQXJhYmljU2hhcGVzICgxTCA8PCAxNSkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfRXhwYW5kVGFiICgxTCA8PCAxNikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfQ29tYlRleHQgKDFMIDw8IDE3KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9ITmVhciAoMEwgPDwgMTgpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX0hDZW50ZXIgKDFMIDw8IDE4KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9IRmFyICgyTCA8PCAxOCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfVk5lYXIgKDBMIDw8IDIwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9WQ2VudGVyICgxTCA8PCAyMCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfVkZhciAoMkwgPDwgMjApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX0p1c3RpZmllZCAoMUwgPDwgMjIpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX0Rpc3RyaWJ1dGVkICgyTCA8PCAyMikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfSEFsaWduTWFzayAoM0wgPDwgMTgpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX1ZBbGlnbk1hc2sgKDNMIDw8IDIwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9IQWxpZ25Nb2RlTWFzayAoM0wgPDwgMjIpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX0lubmVyQ2FyZXQgKDFMIDw8IDI0KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9TaG93U2Nyb2xsYmFyRm9jdXMgKDFMIDw8IDI1KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9PdXRlclNjcm9sbGJhciAoMUwgPDwgMjYpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRURUX0xhc3RMaW5lSGVpZ2h0ICgxTCA8PCAyNykNCisjZGVmaW5lIEZXTF9TVEFURV9FRFRfRWRpdGluZyAoMSA8PCBGV0xfV0dUU1RBVEVfTUFYKQ0KKyNkZWZpbmUgRldMX1BBUlRfRURUX0JvcmRlciAxDQorI2RlZmluZSBGV0xfUEFSVF9FRFRfRWRnZSAyDQorI2RlZmluZSBGV0xfUEFSVF9FRFRfQmFja2dyb3VuZCAzDQorI2RlZmluZSBGV0xfUEFSVF9FRFRfQ29tYlRleHRMaW5lIDQNCisjZGVmaW5lIEZXTF9QQVJUREFUQV9FRFRfQmFja2dyb3VuZCAwDQorI2RlZmluZSBGV0xfUEFSVERBVEFfRURUX1N0YXRpY0JhY2tncm91bmQgMQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9FRFRfTm9ybWFsICgwTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9FRFRfUmVhZE9ubHkgKDFMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0VEVF9EaXNhYmxlICgyTCA8PCAwKQ0KK2VudW0gRldMX0VEVF9URVhUQ0hBTkdFRCB7DQorICBGV0xfRURUX1RFWFRDSEFOR0VEX0luc2VydCA9IDAsDQorICBGV0xfRURUX1RFWFRDSEFOR0VEX0RlbGV0ZSwNCisgIEZXTF9FRFRfVEVYVENIQU5HRURfUmVwbGFjZSwNCit9Ow0KKyNkZWZpbmUgRldMX0VWVF9FRFRfQWRkRG9SZWNvcmQgTCJGV0xfRVZFTlRfRURUX0FkZERvUmVjb3JkIg0KKyNkZWZpbmUgRldMX0VWVEhBU0hfRURUX0FkZERvUmVjb3JkIDM3MDE2NzIyMjQNCisjZGVmaW5lIEZXTF9FVlRfRURUX1RleHRDaGFuZ2VkIEwiRldMX0VWRU5UX0VEVF9UZXh0Q2hhbmdlZCINCisjZGVmaW5lIEZXTF9FVlRIQVNIX0VEVF9UZXh0Q2hhbmdlZCAxMDY0MDIyMTMyDQorI2RlZmluZSBGV0xfRVZUX0VEVF9QcmVTZWxmQWRhcHRpb24gTCJGV0xfRVZFTlRfUHJlU2VsZkFkYXB0aW9uIg0KKyNkZWZpbmUgRldMX0VWVEhBU0hfRURUX1ByZVNlbGZBZGFwdGlvbiAxMDAxOTc5MTc4DQorI2RlZmluZSBGV0xfRVZUX0VEVF9WYWxpZGF0ZSBMIkZXTF9FVlRIQVNIX0VEVF9WYWxpZGF0ZSINCisjZGVmaW5lIEZXTF9FVlRIQVNIX0VEVF9WYWxpZGF0ZSAzMzczMzA4NjA4DQorI2RlZmluZSBGV0xfRVZUX0VEVF9DaGVja1dvcmQgTCJGV0xfRVZUSEFTSF9FRFRfQ2hlY2tXb3JkIg0KKyNkZWZpbmUgRldMX0VWVEhBU0hfRURUX0NoZWNrV29yZCAyODk3MTgxNTIwDQorI2RlZmluZSBGV0xfRVZUX0VEVF9HZXRTdWdnZXN0V29yZHMgTCJGV0xfRVZUSEFTSF9FRFRfR2V0U3VnZ2VzdFdvcmRzIg0KKyNkZWZpbmUgRldMX0VWVEhBU0hfRURUX0dldFN1Z2dlc3RXb3JkcyAzMTU3ODI3OTENCisjZGVmaW5lIEZXTF9FVlRfRURUX1RleHRGdWxsIEwiRldMX0VWVEhBU0hfRURUX1RleHRGdWxsIg0KKyNkZWZpbmUgRldMX0VWVEhBU0hfRURUX1RleHRGdWxsIDIxNTg1ODAxNzQNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0RWR0QWRkRG9SZWNvcmQsIEZXTF9FVlRIQVNIX0VEVF9BZGREb1JlY29yZCkNCitDRlhfQnl0ZVN0cmluZyBtX3dzRG9SZWNvcmQ7DQorRU5EX0ZXTF9FVkVOVF9ERUYNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0RWR0VGV4dENoYW5nZWQsIEZXTF9FVlRIQVNIX0VEVF9UZXh0Q2hhbmdlZCkNCitpbnQzMl90IG5DaGFuZ2VUeXBlOw0KK0NGWF9XaWRlU3RyaW5nIHdzSW5zZXJ0Ow0KK0NGWF9XaWRlU3RyaW5nIHdzRGVsZXRlOw0KK0NGWF9XaWRlU3RyaW5nIHdzUHJldlRleHQ7DQorRU5EX0ZXTF9FVkVOVF9ERUYNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0RWR0VGV4dEZ1bGwsIEZXTF9FVlRIQVNIX0VEVF9UZXh0RnVsbCkNCitFTkRfRldMX0VWRU5UX0RFRg0KK0JFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdnRFZHRQcmVTZWxmQWRhcHRpb24sIEZXTF9FVlRIQVNIX0VEVF9QcmVTZWxmQWRhcHRpb24pDQorRlhfQk9PTCBiSFNlbGZBZGFwdGlvbjsNCitGWF9CT09MIGJWU2VsZkFkYXB0aW9uOw0KK0NGWF9SZWN0RiBydEFmdGVyQ2hhbmdlOw0KK0VORF9GV0xfRVZFTlRfREVGDQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dEVkdFZhbGlkYXRlLCBGV0xfRVZUSEFTSF9FRFRfVmFsaWRhdGUpDQorSUZXTF9XaWRnZXQqIHBEc3RXaWRnZXQ7DQorQ0ZYX1dpZGVTdHJpbmcgd3NJbnNlcnQ7DQorRlhfQk9PTCBiVmFsaWRhdGU7DQorRU5EX0ZXTF9FVkVOVF9ERUYNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0RWR0Q2hlY2tXb3JkLCBGV0xfRVZUSEFTSF9FRFRfQ2hlY2tXb3JkKQ0KK0NGWF9CeXRlU3RyaW5nIGJzV29yZDsNCitGWF9CT09MIGJDaGVja1dvcmQ7DQorRU5EX0ZXTF9FVkVOVF9ERUYNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0RWR0R2V0U3VnZ2VzdFdvcmRzLCBGV0xfRVZUSEFTSF9FRFRfR2V0U3VnZ2VzdFdvcmRzKQ0KK0ZYX0JPT0wgYlN1Z2dlc3RXb3JkczsNCitDRlhfQnl0ZVN0cmluZyBic1dvcmQ7DQorQ0ZYX0J5dGVTdHJpbmdBcnJheSBic0FycmF5U3VnZ2VzdFdvcmRzOw0KK0VORF9GV0xfRVZFTlRfREVGDQorY2xhc3MgSUZXTF9FZGl0RFAgOiBwdWJsaWMgSUZXTF9EYXRhUHJvdmlkZXIge307DQorI2RlZmluZSBGV0xfRURUX0ZJTkRfRkxBR1NfUHJldiAoMEwgPDwgMCkNCisjZGVmaW5lIEZXTF9FRFRfRklORF9GTEFHU19OZXh0ICgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX0VEVF9GSU5EX0ZMQUdTX1dob2xlV29yZCAoMUwgPDwgMSkNCisjZGVmaW5lIEZXTF9FRFRfRklORF9GTEFHU19Ob0Nhc2UgKDFMIDw8IDIpDQordHlwZWRlZiBzdHJ1Y3QgX0ZXTF9IRURURklORCB7IHZvaWQqIHBEYXRhOyB9ICogRldMX0hFRFRGSU5EOw0KK2NsYXNzIElGV0xfRWRpdCA6IHB1YmxpYyBJRldMX1dpZGdldCB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRldMX0VkaXQqIENyZWF0ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcik7DQorICBzdGF0aWMgSUZXTF9FZGl0KiBDcmVhdGVDb21ib0VkaXQoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpOw0KKw0KKyAgRldMX0VSUiBTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgaW50MzJfdCBHZXRUZXh0TGVuZ3RoKCkgY29uc3Q7DQorICBGV0xfRVJSIEdldFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TdGFydCA9IDAsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQgPSAtMSkgY29uc3Q7DQorICBGV0xfRVJSIENsZWFyVGV4dCgpOw0KKyAgaW50MzJfdCBHZXRDYXJldFBvcygpIGNvbnN0Ow0KKyAgaW50MzJfdCBTZXRDYXJldFBvcyhpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiQmVmb3JlID0gVFJVRSk7DQorICBGV0xfRVJSIEFkZFNlbFJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCA9IC0xKTsNCisgIGludDMyX3QgQ291bnRTZWxSYW5nZXMoKTsNCisgIGludDMyX3QgR2V0U2VsUmFuZ2UoaW50MzJfdCBuSW5kZXgsIGludDMyX3QmIG5TdGFydCk7DQorICBGV0xfRVJSIENsZWFyU2VsZWN0aW9ucygpOw0KKyAgaW50MzJfdCBHZXRMaW1pdCgpOw0KKyAgRldMX0VSUiBTZXRMaW1pdChpbnQzMl90IG5MaW1pdCk7DQorICBGV0xfRVJSIFNldEFsaWFzQ2hhcihGWF9XQ0hBUiB3QWxpYXMpOw0KKyAgRldMX0VSUiBTZXRGb3JtYXRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0KTsNCisgIEZXTF9FUlIgSW5zZXJ0KGludDMyX3QgblN0YXJ0LCBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LCBpbnQzMl90IG5MZW4pOw0KKyAgRldMX0VSUiBEZWxldGVTZWxlY3Rpb25zKCk7DQorICBGV0xfRVJSIERlbGV0ZVJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCA9IC0xKTsNCisgIEZXTF9FUlIgUmVwbGFjZVNlbGVjdGlvbnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1JlcGxhY2UpOw0KKyAgRldMX0VSUiBSZXBsYWNlKGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QgbkxlbiwNCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzUmVwbGFjZSk7DQorICBGV0xfRVJSIERvQ2xpcGJvYXJkKGludDMyX3QgaUNtZCk7DQorICBGWF9CT09MIENvcHkoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29weSk7DQorICBGWF9CT09MIEN1dChDRlhfV2lkZVN0cmluZyYgd3NDdXQpOw0KKyAgRlhfQk9PTCBQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXN0ZSk7DQorICBGWF9CT09MIERlbGV0ZSgpOw0KKyAgRlhfQk9PTCBSZWRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZWNvcmQpOw0KKyAgRlhfQk9PTCBVbmRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZWNvcmQpOw0KKyAgRlhfQk9PTCBVbmRvKCk7DQorICBGWF9CT09MIFJlZG8oKTsNCisgIEZYX0JPT0wgQ2FuVW5kbygpOw0KKyAgRlhfQk9PTCBDYW5SZWRvKCk7DQorICBGV0xfRVJSIFNldFRhYldpZHRoKEZYX0ZMT0FUIGZUYWJXaWR0aCwgRlhfQk9PTCBiRXF1aWRpc3RhbnQpOw0KKyAgRldMX0VSUiBTZXRPdXRlcihJRldMX1dpZGdldCogcE91dGVyKTsNCisgIEZXTF9FUlIgU2V0TnVtYmVyUmFuZ2UoaW50MzJfdCBpTWluLCBpbnQzMl90IGlNYXgpOw0KKyAgRldMX0VSUiBTZXRCYWNrQ29sb3IoRlhfRFdPUkQgZHdDb2xvcik7DQorICBGV0xfRVJSIFNldEZvbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9udCwgRlhfRkxPQVQgZlNpemUpOw0KKyAgdm9pZCBTZXRTY3JvbGxPZmZzZXQoRlhfRkxPQVQgZlNjcm9sbE9mZnNldCk7DQorICBGWF9CT09MIEdldFN1Z2dlc3RXb3JkcyhDRlhfUG9pbnRGIHBvaW50ZiwgQ0ZYX0J5dGVTdHJpbmdBcnJheSYgc1N1Z2dlc3QpOw0KKyAgRlhfQk9PTCBSZXBsYWNlU3BlbGxDaGVja1dvcmQoQ0ZYX1BvaW50RiBwb2ludGYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVwbGFjZSk7DQorDQorIHByb3RlY3RlZDoNCisgIElGV0xfRWRpdCgpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2xpc3Rib3guaCBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9saXN0Ym94LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ1ODU4OAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9saXN0Ym94LmgKQEAgLTAsMCArMSwxMjkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX0xJU1RCT1hfSA0KKyNkZWZpbmUgX0ZXTF9MSVNUQk9YX0gNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgSUZXTF9MaXN0Qm94RFA7DQorY2xhc3MgSUZXTF9MaXN0Qm94Ow0KKyNkZWZpbmUgRldMX0NMQVNTX0xpc3RCb3ggTCJGV0xfTElTVEJPWCINCisjZGVmaW5lIEZXTF9DTEFTU0hBU0hfTGlzdEJveCAxNzc3MzU4MzE3DQorI2RlZmluZSBGV0xfU1RZTEVFWFRfTFRCX011bHRpU2VsZWN0aW9uICgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0xUQl9Tb3J0ICgxTCA8PCAxKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0xUQl9TaG93U2Nyb2xsQmFyQWxhd2F5cyAoMUwgPDwgMikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9MVEJfTXVsdGlDb2x1bW4gKDFMIDw8IDMpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfTFRCX0xlZnRBbGlnbiAoMEwgPDwgNCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9MVEJfQ2VudGVyQWxpZ24gKDFMIDw8IDQpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfTFRCX1JpZ2h0QWxpZ24gKDJMIDw8IDQpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfTFRCX011bHRpTGluZSAoMUwgPDwgNikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9MVEJfT3duZXJEcmF3ICgxTCA8PCA3KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0xUQl9JY29uICgxTCA8PCA4KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0xUQl9DaGVjayAoMUwgPDwgOSkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9MVEJfQWxpZ25NYXNrICgzTCA8PCA0KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0xUQl9TaG93U2Nyb2xsQmFyRm9jdXMgKDFMIDw8IDEwKQ0KKyNkZWZpbmUgRldMX0lURU1TVEFURV9MVEJfU2VsZWN0ZWQgKDFMIDw8IDApDQorI2RlZmluZSBGV0xfSVRFTVNUQVRFX0xUQl9Gb2N1c2VkICgxTCA8PCAxKQ0KKyNkZWZpbmUgRldMX0lURU1TVEFURV9MVEJfQ2hlY2tlZCAoMUwgPDwgMikNCisjZGVmaW5lIEZXTF9QQVJUX0xUQl9Cb3JkZXIgMQ0KKyNkZWZpbmUgRldMX1BBUlRfTFRCX0VkZ2UgMg0KKyNkZWZpbmUgRldMX1BBUlRfTFRCX0JhY2tncm91bmQgMw0KKyNkZWZpbmUgRldMX1BBUlRfTFRCX0xpc3RJdGVtIDQNCisjZGVmaW5lIEZXTF9QQVJUX0xUQl9DaGVjayA1DQorI2RlZmluZSBGV0xfUEFSVF9MVEJfSWNvbiA2DQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0xUQl9Ob3JtYWwgKDBMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0xUQl9TZWxlY3RlZCAoMUwgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfTFRCX0Rpc2FibGVkICgyTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9MVEJfRm9jdXNlZCAoMUwgPDwgMikNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfTFRCX1VuQ2hlY2tlZCAoMEwgPDwgMykNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfTFRCX0NoZWNrZWQgKDFMIDw8IDMpDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0xUQl9NYXNrICgzTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfTFRCX0l0ZW0gRldMX1dHVEhJVFRFU1RfTUFYICsgMQ0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfTFRCX0hTY3JvbGxCYXIgRldMX1dHVEhJVFRFU1RfTUFYICsgMg0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfTFRCX1ZTY3JvbGxCYXIgRldMX1dHVEhJVFRFU1RfTUFYICsgMw0KKyNkZWZpbmUgRldMX0VWVF9MVEJfU2VsQ2hhbmdlZCBMIkZXTF9FVkVOVF9MVEJfU2VsQ2hhbmdlZCINCisjZGVmaW5lIEZXTF9FVlRfTFRCX0RyYXdJdGVtIEwiRldMX0VWRU5UX0xUQl9EcmF3SXRlbSINCisjZGVmaW5lIEZXTF9FVlRIQVNIX0xUQl9TZWxDaGFuZ2VkIDE3MDE3ODE2ODgNCisjZGVmaW5lIEZXTF9FVlRIQVNIX0xUQl9EcmF3SXRlbSAxMDUwODUzOTkxDQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dEx0YlNlbENoYW5nZWQsIEZXTF9FVlRIQVNIX0xUQl9TZWxDaGFuZ2VkKQ0KK0NGWF9JbnQzMkFycmF5IGlhcnJheVNlbHM7DQorRU5EX0ZXTF9FVkVOVF9ERUYNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0THRiRHJhd0l0ZW0sIEZXTF9FVlRIQVNIX0xUQl9EcmF3SXRlbSkNCitDRlhfR3JhcGhpY3MqIG1fcEdyYXBoaWNzOw0KK0NGWF9NYXRyaXggbV9tYXRyaXg7DQoraW50MzJfdCBtX2luZGV4Ow0KK0NGWF9SZWN0RiBtX3JlY3Q7DQorRU5EX0ZXTF9FVkVOVF9ERUYNCit0eXBlZGVmIHN0cnVjdCBfRldMX0hMSVNUSVRFTSB7IHZvaWQqIHBEYXRhOyB9ICogRldMX0hMSVNUSVRFTTsNCit0eXBlZGVmIHN0cnVjdCBfRldMX0xpc3RCb3hJdGVtRGF0YSB7DQorICBJRldMX0xpc3RCb3hEUCogcERhdGFQcm92aWRlcjsNCisgIGludDMyX3QgaUluZGV4Ow0KK30gRldMX0xpc3RCb3hJdGVtRGF0YTsNCitjbGFzcyBJRldMX0xpc3RCb3hEUCA6IHB1YmxpYyBJRldMX0RhdGFQcm92aWRlciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudEl0ZW1zKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIEZXTF9ITElTVElURU0gR2V0SXRlbShJRldMX1dpZGdldCogcFdpZGdldCwgaW50MzJfdCBuSW5kZXgpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRJdGVtSW5kZXgoSUZXTF9XaWRnZXQqIHBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRJdGVtSW5kZXgoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4KSA9IDA7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldEl0ZW1TdHlsZXMoSUZXTF9XaWRnZXQqIHBXaWRnZXQsIEZXTF9ITElTVElURU0gaEl0ZW0pID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRJdGVtVGV4dChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRJdGVtUmVjdChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRJdGVtKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQqIEdldEl0ZW1EYXRhKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0SXRlbVN0eWxlcyhJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0SXRlbVRleHQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VGV4dCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldEl0ZW1SZWN0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEl0ZW0pID0gMDsNCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0SXRlbUhlaWdodChJRldMX1dpZGdldCogcFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBDRlhfRElCaXRtYXAqIEdldEl0ZW1JY29uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0pID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRJdGVtQ2hlY2tSZWN0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRDaGVjaykgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldEl0ZW1DaGVja1JlY3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydENoZWNrKSA9IDA7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldEl0ZW1DaGVja1N0YXRlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0SXRlbUNoZWNrU3RhdGUoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0NoZWNrU3RhdGUpID0gMDsNCit9Ow0KK2NsYXNzIElGV0xfTGlzdEJveENvbXBhcmUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRldMX0xpc3RCb3hDb21wYXJlKCkge30NCisgIHZpcnR1YWwgaW50MzJfdCBDb21wYXJlKEZXTF9ITElTVElURU0gaExlZnQsIEZXTF9ITElTVElURU0gaFJpZ2h0KSA9IDA7DQorfTsNCitjbGFzcyBJRldMX0xpc3RCb3ggOiBwdWJsaWMgSUZXTF9XaWRnZXQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZXTF9MaXN0Qm94KiBDcmVhdGUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpOw0KKyAgc3RhdGljIElGV0xfTGlzdEJveCogQ3JlYXRlQ29tYm9MaXN0KA0KKyAgICAgIGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICBJRldMX1dpZGdldCogcE91dGVyKTsNCisNCisgIGludDMyX3QgQ291bnRTZWxJdGVtcygpOw0KKyAgRldMX0hMSVNUSVRFTSBHZXRTZWxJdGVtKGludDMyX3QgbkluZGV4U2VsKTsNCisgIGludDMyX3QgR2V0U2VsSW5kZXgoaW50MzJfdCBuSW5kZXgpOw0KKyAgRldMX0VSUiBTZXRTZWxJdGVtKEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0JPT0wgYlNlbGVjdCA9IFRSVUUpOw0KKyAgRldMX0VSUiBHZXRJdGVtVGV4dChGV0xfSExJU1RJVEVNIGhJdGVtLCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsNCisgIEZXTF9FUlIgR2V0U2Nyb2xsUG9zKEZYX0ZMT0FUJiBmUG9zLCBGWF9CT09MIGJWZXJ0ID0gVFJVRSk7DQorICBGV0xfRVJSKiBTb3J0KElGV0xfTGlzdEJveENvbXBhcmUqIHBDb20pOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRldMX0xpc3RCb3goKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9tZW51LmggYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfbWVudS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxY2U3MTIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfbWVudS5oCkBAIC0wLDAgKzEsMTUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX01FTlVfSA0KKyNkZWZpbmUgX0ZXTF9NRU5VX0gNCisjZGVmaW5lIEZXTF9DTEFTU19NZW51IEwiRldMX01FTlUiDQorI2RlZmluZSBGV0xfQ0xBU1NIQVNIX01lbnUgMzk1Nzk0OTY1NQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX01OVV9Ib3J6ICgwTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX01OVV9WZXJ0ICgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX01OVV9Eb2NrICgxTCA8PCAxKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX01OVV9Pd25lckRyYXcgKDFMIDw8IDIpDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX21vbnRoY2FsZW5kYXIuaCBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9tb250aGNhbGVuZGFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFjMzAwMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9tb250aGNhbGVuZGFyLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX01PTlRIQ0FMRU5EQVJfSA0KKyNkZWZpbmUgX0ZXTF9NT05USENBTEVOREFSX0gNCitjbGFzcyBJRldMX01vbnRoQ2FsZW5kYXJEUDsNCitjbGFzcyBJRldMX01vbnRoQ2FsZW5kYXI7DQorI2RlZmluZSBGV0xfQ0xBU1NfTW9udGhDYWxlbmRhciBMIkZXTF9NT05USENBTEVOREFSIg0KKyNkZWZpbmUgRldMX0NMQVNTSEFTSF9Nb250aENhbGVuZGFyIDI3MzM5MzEzNzQNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9NQ0RfTXVsdGlTZWxlY3QgKDFMIDw8IDApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfTUNEX05vVG9kYXkgKDFMIDw8IDEpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfTUNEX05vVG9kYXlDaXJjbGUgKDFMIDw8IDIpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfTUNEX1dlZWtOdW1iZXJzICgxTCA8PCAzKQ0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9XSURUSCAxMg0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9IZWlnaHQgMTMNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfQlROX1dJRFRIIDE0DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9IRUlHSFQgMTUNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfQlROX0hNQVJHSU4gMTYNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfQlROX1ZNQVJHSU4gMTcNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVFdJREhUIDE4DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRIRUlHSFQgMTkNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVF9ITUFSR0lOIDIwDQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRfVk1BUkdJTiAyMQ0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX0hTRVBfV0lEVEggMjINCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19IU0VQX0hFSUdIVCAyMw0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX1ZTRVBfV0lEVEggMjQNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19WU0VQX0hFSUdIVCAyNQ0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX1dFRUtOVU1fV0lEVEggMjYNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19TRVBfRE9GRlNFVCA0MA0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX1NFUF9YIDI3DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfU0VQX1kgMjgNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19XRUVLTlVNX0hFSUdIVCAyOQ0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX1dFRUtfV0lEVEggMzANCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19XRUVLX0hFSUdIVCAzMQ0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX0RBVEVTX0NFTExfV0lEVEggMzINCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9NQ19EQVRFU19DRUxMX0hFSUdIVCAzMw0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX1RPREFZX1dJREhUIDM0DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfVE9EQVlfSEVJR0hUIDM1DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfVE9EQVlfRkxBR19XSURIVCAzNg0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX01DX1dJRFRIIDM3DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVJR0hUIDM4DQorI2RlZmluZSBGV0xfSVRFTVNUQVRFX01DRF9Ob21hbCAoMEwgPDwgMCkNCisjZGVmaW5lIEZXTF9JVEVNU1RBVEVfTUNEX0ZsYWcgKDFMIDw8IDApDQorI2RlZmluZSBGV0xfSVRFTVNUQVRFX01DRF9TZWxlY3RlZCAoMUwgPDwgMSkNCisjZGVmaW5lIEZXTF9JVEVNU1RBVEVfTUNEX0ZvY3VzZWQgKDFMIDw8IDIpDQorI2RlZmluZSBGV0xfUEFSVF9NQ0RfQm9yZGVyIDENCisjZGVmaW5lIEZXTF9QQVJUX01DRF9FZGdlIDINCisjZGVmaW5lIEZXTF9QQVJUX01DRF9CYWNrZ3JvdW5kIDMNCisjZGVmaW5lIEZXTF9QQVJUX01DRF9MQnRuIDQNCisjZGVmaW5lIEZXTF9QQVJUX01DRF9SQnRuIDUNCisjZGVmaW5lIEZXTF9QQVJUX01DRF9IU2VwYXJhdG9yIDYNCisjZGVmaW5lIEZXTF9QQVJUX01DRF9WU2VwYXJhdG9yIDcNCisjZGVmaW5lIEZXTF9QQVJUX01DRF9Ub2RheUNpcmNsZSA4DQorI2RlZmluZSBGV0xfUEFSVF9NQ0RfRGF0ZUluQ2lyY2xlIDkNCisjZGVmaW5lIEZXTF9QQVJUX01DRF9EYXRlSW5CSyAxMA0KKyNkZWZpbmUgRldMX1BBUlRfTUNEX0NhcHRpb24gOQ0KKyNkZWZpbmUgRldMX1BBUlRfTUNEX0RhdGVzSW4gMTANCisjZGVmaW5lIEZXTF9QQVJUX01DRF9EYXRlc091dCAxMQ0KKyNkZWZpbmUgRldMX1BBUlRfTUNEX1dlZWsgMTINCisjZGVmaW5lIEZXTF9QQVJUX01DRF9Ub2RheSAxMw0KKyNkZWZpbmUgRldMX1BBUlRfTUNEX0hlYWRlciAxNA0KKyNkZWZpbmUgRldMX1BBUlRfTUNEX1dlZWtOdW0gMTUNCisjZGVmaW5lIEZXTF9QQVJUX01DRF9XZWVrTnVtU2VwIDE2DQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX01DRF9Ob3JtYWwgKDBMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX01DRF9QcmVzc2VkICgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9NQ0RfSG92ZXJlZCAoMkwgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfTUNEX1NlbGVjdGVkICgzTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9NQ0RfTFNlbGVjdGVkICgxTCA8PCAyKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9NQ0RfUlNlbGVjdGVkICgyTCA8PCAyKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9NQ0RfRmxhZ2dlZCAoMUwgPDwgMykNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfTUNEX0ZvY3VzZWQgKDFMIDw8IDQpDQorI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9TdW4gRldMX1dHVENBUEFDSVRZX01BWCArIDUNCisjZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX01vbiBGV0xfV0dUQ0FQQUNJVFlfTUFYICsgNg0KKyNkZWZpbmUgRldMX01DQ0FQQUNJVFlfVHVlIEZXTF9XR1RDQVBBQ0lUWV9NQVggKyA3DQorI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9XZWQgRldMX1dHVENBUEFDSVRZX01BWCArIDgNCisjZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX1RodSBGV0xfV0dUQ0FQQUNJVFlfTUFYICsgOQ0KKyNkZWZpbmUgRldMX01DQ0FQQUNJVFlfRnJpIEZXTF9XR1RDQVBBQ0lUWV9NQVggKyAxMA0KKyNkZWZpbmUgRldMX01DQ0FQQUNJVFlfU2F0IEZXTF9XR1RDQVBBQ0lUWV9NQVggKyAxMQ0KKyNkZWZpbmUgRldMX01DQ0FQQUNJVFlfSmFudWFyeSBGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMTINCisjZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX0ZlYnJ1YXJ5IEZXTF9XR1RDQVBBQ0lUWV9NQVggKyAxMw0KKyNkZWZpbmUgRldMX01DQ0FQQUNJVFlfTWFyY2ggRldMX1dHVENBUEFDSVRZX01BWCArIDE0DQorI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9BcHJpbCBGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMTUNCisjZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX01heSBGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMTYNCisjZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX0p1bmUgRldMX1dHVENBUEFDSVRZX01BWCArIDE3DQorI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9KdWx5IEZXTF9XR1RDQVBBQ0lUWV9NQVggKyAxOA0KKyNkZWZpbmUgRldMX01DQ0FQQUNJVFlfQXVndXN0IEZXTF9XR1RDQVBBQ0lUWV9NQVggKyAxOQ0KKyNkZWZpbmUgRldMX01DQ0FQQUNJVFlfU2VwdGVtYmVyIEZXTF9XR1RDQVBBQ0lUWV9NQVggKyAyMA0KKyNkZWZpbmUgRldMX01DQ0FQQUNJVFlfT2N0b2JlciBGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMjENCisjZGVmaW5lIEZXTF9NQ0NBUEFDSVRZX05vdmVtYmVyIEZXTF9XR1RDQVBBQ0lUWV9NQVggKyAyMg0KKyNkZWZpbmUgRldMX01DQ0FQQUNJVFlfRGVjZW1iZXIgRldMX1dHVENBUEFDSVRZX01BWCArIDIzDQorI2RlZmluZSBGV0xfTUNDQVBBQ0lUWV9Ub2RheSBGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMjQNCisjZGVmaW5lIEZXTF9FVkVOVF9NQ0RfREFURVNFTEVDVEVEIEwiRldMX0VWRU5UX01DRF9EYXRlU2VsZWN0ZWQiDQorI2RlZmluZSBGV0xfRVZUX01DRF9EYXRlQ2hhbmdlZCBMIkZXTF9FVkVOVF9NQ0RfRGF0ZUNoYW5nZWQiDQorI2RlZmluZSBGV0xfTk9URUhBU0hfTUNEX0RBVEFTRUxFQ1RFRCAxMDg1NTk2OTMyDQorI2RlZmluZSBGV0xfRVZUSEFTSF9NQ0RfRGF0ZUNoYW5nZWQgNTQyMTIyMjcNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZlbnRfTWNkRGF0ZVNlbGVjdGVkLCBGV0xfTk9URUhBU0hfTUNEX0RBVEFTRUxFQ1RFRCkNCitpbnQzMl90IG1faVN0YXJ0RGF5Ow0KK2ludDMyX3QgbV9pRW5kRGF5Ow0KK0VORF9GV0xfRVZFTlRfREVGDQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2ZW50TWNkRGF0ZUNoYW5nZWQsIEZXTF9FVlRIQVNIX01DRF9EYXRlQ2hhbmdlZCkNCitpbnQzMl90IG1faU9sZFllYXI7DQoraW50MzJfdCBtX2lPbGRNb250aDsNCitpbnQzMl90IG1faVN0YXJ0RGF5Ow0KK2ludDMyX3QgbV9pRW5kRGF5Ow0KK0VORF9GV0xfRVZFTlRfREVGDQorY2xhc3MgSUZXTF9Nb250aENhbGVuZGFyRFAgOiBwdWJsaWMgSUZXTF9EYXRhUHJvdmlkZXIgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q3VyRGF5KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q3VyTW9udGgoSUZXTF9XaWRnZXQqIHBXaWRnZXQpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDdXJZZWFyKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSA9IDA7DQorfTsNCitjbGFzcyBJRldMX01vbnRoQ2FsZW5kYXIgOiBwdWJsaWMgSUZXTF9XaWRnZXQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZXTF9Nb250aENhbGVuZGFyKiBDcmVhdGUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpOw0KKw0KKyAgaW50MzJfdCBDb3VudFNlbGVjdCgpOw0KKyAgRlhfQk9PTCBHZXRTZWxlY3QoaW50MzJfdCYgaVllYXIsDQorICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpRGF5LA0KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXggPSAwKTsNCisgIEZYX0JPT0wgU2V0U2VsZWN0KGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoLCBpbnQzMl90IGlEYXkpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRldMX01vbnRoQ2FsZW5kYXIoKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9waWN0dXJlYm94LmggYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfcGljdHVyZWJveC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZWVmZGUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfcGljdHVyZWJveC5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX1BJQ1RVUkVCT1hfSA0KKyNkZWZpbmUgX0ZXTF9QSUNUVVJFQk9YX0gNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgSUZXTF9QaWN0dXJlQm94RFA7DQorY2xhc3MgSUZXTF9QaWN0dXJlQm94Ow0KKyNkZWZpbmUgRldMX0NMQVNTX1BpY3R1cmVCb3ggTCJGV0xfUElDVFVSRUJPWCINCisjZGVmaW5lIEZXTF9DTEFTU0hBU0hfUGljdHVyZUJveCAyOTc0NzIxNzQxDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfUFRCX0xlZnQgMEwgPDwgMA0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9DZW50ZXIgMUwgPDwgMA0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9SaWdodCAyTCA8PCAwDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfUFRCX1RvcCAwTCA8PCAyDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfUFRCX1ZjZW50ZXIgMUwgPDwgMg0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9Cb3R0b20gMkwgPDwgMg0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9Ob3JtYWwgMEwgPDwgNA0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9BdXRvU2l6ZSAxTCA8PCA0DQorI2RlZmluZSBGV0xfU1RZTEVFWFRfUFRCX1N0cmV0Y2hJbWFnZSAyTCA8PCA0DQorI2RlZmluZSBGV0xfU1RZTEVFWFRfUFRCX1N0cmV0Y2hISW1hZ2UgM0wgPDwgNA0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9TdHJldGNoVkltYWdlIDRMIDw8IDQNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9QVEJfSEFsaWduTWFzayAzTCA8PCAwDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfUFRCX1ZBbGlnbk1hc2sgM0wgPDwgMg0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BUQl9TdHJldGNoQWxpZ25NYXNrIDdMIDw8IDQNCisjZGVmaW5lIEZXTF9QQVJUX1BUQl9Cb3JkZXIgMQ0KKyNkZWZpbmUgRldMX1BBUlRfUFRCX0VkZ2UgMg0KKyNkZWZpbmUgRldMX1BBUlRfUFRCX0ltYWdlIDMNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfUFRCX05vcm1hbCAoMEwgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfUFRCX0Rpc2FibGVkICgxTCA8PCAwKQ0KK2NsYXNzIElGV0xfUGljdHVyZUJveERQIDogcHVibGljIElGV0xfRGF0YVByb3ZpZGVyIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCBDRlhfRElCaXRtYXAqIEdldFBpY3R1cmUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpID0gMDsNCisgIHZpcnR1YWwgQ0ZYX0RJQml0bWFwKiBHZXRFcnJvclBpY3R1cmUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpID0gMDsNCisgIHZpcnR1YWwgQ0ZYX0RJQml0bWFwKiBHZXRJbml0aWFsUGljdHVyZShJRldMX1dpZGdldCogcFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldE9wYWNpdHkoSUZXTF9XaWRnZXQqIHBXaWRnZXQpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRGbGlwTW9kZShJRldMX1dpZGdldCogcFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldE1hdHJpeChJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX01hdHJpeCYgbWF0cml4KSA9IDA7DQorfTsNCisNCitjbGFzcyBJRldMX1BpY3R1cmVCb3ggOiBwdWJsaWMgSUZXTF9XaWRnZXQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZXTF9QaWN0dXJlQm94KiBDcmVhdGUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRldMX1BpY3R1cmVCb3goKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9wdXNoYnV0dG9uLmggYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfcHVzaGJ1dHRvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1M2ZiMDEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfcHVzaGJ1dHRvbi5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX1BVU0hCVVRUT05fSA0KKyNkZWZpbmUgX0ZXTF9QVVNIQlVUVE9OX0gNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgSUZXTF9QdXNoQnV0dG9uRFA7DQorY2xhc3MgSUZXTF9QdXNoQnV0dG9uOw0KKyNkZWZpbmUgRldMX0NMQVNTX1B1c2hCdXR0b24gTCJGV0xfUFVTSEJVVFRPTiINCisjZGVmaW5lIEZXTF9DTEFTU0hBU0hfUHVzaEJ1dHRvbiAzNTIxNjE0MjQ0DQorI2RlZmluZSBGV0xfU1RZTEVFWFRfUFNCX0xlZnQgKDBMIDw8IDApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfUFNCX0NlbnRlciAoMUwgPDwgMCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9QU0JfUmlnaHQgKDJMIDw8IDApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfUFNCX1RvcCAoMEwgPDwgMikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9QU0JfVkNlbnRlciAoMUwgPDwgMikNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9QU0JfQm90dG9tICgyTCA8PCAyKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BTQl9UZXh0T25seSAoMEwgPDwgNCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9QU0JfSWNvbk9ubHkgKDFMIDw8IDQpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfUFNCX1RleHRJY29uICgyTCA8PCA0KQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1BTQl9ITGF5b3V0TWFzayAoM0wgPDwgMCkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9QU0JfVkxheW91dE1hc2sgKDNMIDw8IDIpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfUFNCX01vZGVNYXNrICgzTCA8PCA0KQ0KKyNkZWZpbmUgRldMX1NUQVRFX1BTQl9Ib3ZlcmVkICgxIDw8IEZXTF9XR1RTVEFURV9NQVgpDQorI2RlZmluZSBGV0xfU1RBVEVfUFNCX1ByZXNzZWQgKDEgPDwgKEZXTF9XR1RTVEFURV9NQVggKyAxKSkNCisjZGVmaW5lIEZXTF9TVEFURV9QU0JfRGVmYXVsdCAoMSA8PCAoRldMX1dHVFNUQVRFX01BWCArIDIpKQ0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX1BTQl9NYXJnaW4gKEZXTF9XR1RDQVBBQ0lUWV9NQVggKyAxKQ0KKyNkZWZpbmUgRldMX1BBUlRfUFNCX0JvcmRlciAxDQorI2RlZmluZSBGV0xfUEFSVF9QU0JfRWRnZSAyDQorI2RlZmluZSBGV0xfUEFSVF9QU0JfQmFja2dyb3VuZCAzDQorI2RlZmluZSBGV0xfUEFSVF9QU0JfQ2FwdGlvbiA0DQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX1BTQl9Ob3JtYWwgKDBMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX1BTQl9QcmVzc2VkICgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9QU0JfSG92ZXJlZCAoMkwgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfUFNCX0RlZmF1bHQgKDNMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX1BTQl9EaXNhYmxlZCAoNEwgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfUFNCX0ZvY3VzZWQgKDFMIDw8IDMpDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX1BTQl9NYXNrICg3TCA8PCAwKQ0KK2NsYXNzIElGV0xfUHVzaEJ1dHRvbkRQIDogcHVibGljIElGV0xfRGF0YVByb3ZpZGVyIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCBDRlhfRElCaXRtYXAqIEdldFBpY3R1cmUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpID0gMDsNCit9Ow0KK2NsYXNzIElGV0xfUHVzaEJ1dHRvbiA6IHB1YmxpYyBJRldMX1dpZGdldCB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRldMX1B1c2hCdXR0b24qIENyZWF0ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcik7DQorDQorIHByb3RlY3RlZDoNCisgIElGV0xfUHVzaEJ1dHRvbigpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX3Njcm9sbGJhci5oIGIveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX3Njcm9sbGJhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MjYzYTgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfc2Nyb2xsYmFyLmgKQEAgLTAsMCArMSw2OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfU0NST0xMQkFSX0gNCisjZGVmaW5lIF9GV0xfU0NST0xMQkFSX0gNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgSUZXTF9TY3JvbGxCYXJEUDsNCitjbGFzcyBJRldMX1Njcm9sbEJhcjsNCisjZGVmaW5lIEZXTF9DTEFTU19TY3JvbGxCYXIgTCJGV0xfU0NST0xMQkFSIg0KKyNkZWZpbmUgRldMX0NMQVNTSEFTSF9TY3JvbGxCYXIgMjgyNjU4NDg0NA0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1NDQl9Ib3J6ICgwTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX1NDQl9WZXJ0ICgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRfU0NCX0JvcmRlciAxDQorI2RlZmluZSBGV0xfUEFSVF9TQ0JfRWRnZSAyDQorI2RlZmluZSBGV0xfUEFSVF9TQ0JfQmFja2dyb3VuZCAzDQorI2RlZmluZSBGV0xfUEFSVF9TQ0JfRm9yZUFycm93IDQNCisjZGVmaW5lIEZXTF9QQVJUX1NDQl9CYWNrQXJyb3cgNQ0KKyNkZWZpbmUgRldMX1BBUlRfU0NCX1RodW1iIDYNCisjZGVmaW5lIEZXTF9QQVJUX1NDQl9Mb3dlclRyYWNrIDcNCisjZGVmaW5lIEZXTF9QQVJUX1NDQl9VcHBlclRyYWNrIDgNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfU0NCX05vcm1hbCAoMEwgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfU0NCX0hvdmVyZWQgKDFMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX1NDQl9QcmVzc2VkICgyTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9TQ0JfRGlzYWJsZWQgKDNMIDw8IDApDQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9TQ0JfRm9yZUFycm93IEZXTF9XR1RISVRURVNUX01BWCArIDENCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX1NDQl9CYWNrQXJyb3cgRldMX1dHVEhJVFRFU1RfTUFYICsgMg0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfU0NCX0xvd2VyVHJhY2sgRldMX1dHVEhJVFRFU1RfTUFYICsgMw0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfU0NCX1VwcGVyVHJhY2sgRldMX1dHVEhJVFRFU1RfTUFYICsgNA0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfU0NCX1RodW1iIEZXTF9XR1RISVRURVNUX01BWCArIDUNCisjZGVmaW5lIEZXTF9DQVBBQ0lUWV9TQ0JfU2l6ZSBGV0xfV0dUQ0FQQUNJVFlfTUFYDQorZW51bSBGV0xfU0NCQ09ERSB7DQorICBGV0xfU0NCQ09ERV9Ob25lID0gMSwNCisgIEZXTF9TQ0JDT0RFX01pbiwNCisgIEZXTF9TQ0JDT0RFX01heCwNCisgIEZXTF9TQ0JDT0RFX1BhZ2VCYWNrd2FyZCwNCisgIEZXTF9TQ0JDT0RFX1BhZ2VGb3J3YXJkLA0KKyAgRldMX1NDQkNPREVfU3RlcEJhY2t3YXJkLA0KKyAgRldMX1NDQkNPREVfU3RlcEZvcndhcmQsDQorICBGV0xfU0NCQ09ERV9Qb3MsDQorICBGV0xfU0NCQ09ERV9UcmFja1BvcywNCisgIEZXTF9TQ0JDT0RFX0VuZFNjcm9sbCwNCit9Ow0KK2NsYXNzIElGV0xfU2Nyb2xsQmFyRFAgOiBwdWJsaWMgSUZXTF9EYXRhUHJvdmlkZXIge307DQorY2xhc3MgSUZXTF9TY3JvbGxCYXIgOiBwdWJsaWMgSUZXTF9XaWRnZXQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZXTF9TY3JvbGxCYXIqIENyZWF0ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKTsNCisNCisgIEZYX0JPT0wgSXNWZXJ0aWNhbCgpOw0KKyAgRldMX0VSUiBHZXRSYW5nZShGWF9GTE9BVCYgZk1pbiwgRlhfRkxPQVQmIGZNYXgpOw0KKyAgRldMX0VSUiBTZXRSYW5nZShGWF9GTE9BVCBmTWluLCBGWF9GTE9BVCBmTWF4KTsNCisgIEZYX0ZMT0FUIEdldFBhZ2VTaXplKCk7DQorICBGV0xfRVJSIFNldFBhZ2VTaXplKEZYX0ZMT0FUIGZQYWdlU2l6ZSk7DQorICBGWF9GTE9BVCBHZXRTdGVwU2l6ZSgpOw0KKyAgRldMX0VSUiBTZXRTdGVwU2l6ZShGWF9GTE9BVCBmU3RlcFNpemUpOw0KKyAgRlhfRkxPQVQgR2V0UG9zKCk7DQorICBGV0xfRVJSIFNldFBvcyhGWF9GTE9BVCBmUG9zKTsNCisgIEZYX0ZMT0FUIEdldFRyYWNrUG9zKCk7DQorICBGV0xfRVJSIFNldFRyYWNrUG9zKEZYX0ZMT0FUIGZUcmFja1Bvcyk7DQorICBGWF9CT09MIERvU2Nyb2xsKEZYX0RXT1JEIGR3Q29kZSwgRlhfRkxPQVQgZlBvcyA9IDAuMGYpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRldMX1Njcm9sbEJhcigpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX3NwaW5idXR0b24uaCBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9zcGluYnV0dG9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZjZmEyMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9zcGluYnV0dG9uLmgKQEAgLTAsMCArMSw0MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfU1BJTkJVVFRPTl9IDQorI2RlZmluZSBfRldMX1NQSU5CVVRUT05fSA0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllczsNCitjbGFzcyBJRldMX1dpZGdldDsNCitjbGFzcyBJRldMX1NwaW5CdXR0b247DQorI2RlZmluZSBGV0xfQ0xBU1NfU3BpbkJ1dHRvbiBMIkZXTF9TUElOQlVUVE9OIg0KKyNkZWZpbmUgRldMX0NMQVNTSEFTSF9TcGluQnV0dG9uIDM3OTMwNDM2NDYNCisjZGVmaW5lIEZXTF9TVFlMRUVYRV9TUEJfVmVydCAoMUwgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUX1NQQl9Cb3JkZXIgMQ0KKyNkZWZpbmUgRldMX1BBUlRfU1BCX0VkZ2UgMg0KKyNkZWZpbmUgRldMX1BBUlRfU1BCX1VwQnV0dG9uIDMNCisjZGVmaW5lIEZXTF9QQVJUX1NQQl9Eb3duQnV0dG9uIDQNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbCAoMEwgPDwgMCkNCisjZGVmaW5lIEZXTF9QQVJUU1RBVEVfU1BCX0hvdmVyZWQgKDFMIDw8IDApDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX1NQQl9QcmVzc2VkICgyTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9TUEJfRGlzYWJsZWQgKDNMIDw8IDApDQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9TUEJfVXBCdXR0b24gKEZXTF9XR1RISVRURVNUX01BWCArIDEpDQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9TUEJfRG93bkJ1dHRvbiAoRldMX1dHVEhJVFRFU1RfTUFYICsgMikNCisjZGVmaW5lIEZXTF9FVlRfU1BCX0NsaWNrIEwiRldMX0VWRU5UX1NQQl9DbGljayINCisjZGVmaW5lIEZXTF9FVlRIQVNIX1NQQl9DbGljayAyOTI3NjUxMTg3DQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dFNwYkNsaWNrLCBGV0xfRVZUSEFTSF9TUEJfQ2xpY2spDQorRlhfQk9PTCBtX2JVcDsNCitFTkRfRldMX0VWRU5UX0RFRg0KKw0KK2NsYXNzIElGV0xfU3BpbkJ1dHRvbiA6IHB1YmxpYyBJRldMX1dpZGdldCB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRldMX1NwaW5CdXR0b24qIENyZWF0ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcik7DQorDQorICBGV0xfRVJSIEVuYWJsZUJ1dHRvbihGWF9CT09MIGJFbmFibGUsIEZYX0JPT0wgYlVwID0gVFJVRSk7DQorICBGWF9CT09MIElzQnV0dG9uRW5hYmxlKEZYX0JPT0wgYlVwID0gVFJVRSk7DQorDQorIHByb3RlY3RlZDoNCisgIElGV0xfU3BpbkJ1dHRvbigpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX3Rvb2x0aXBjdHJsLmggYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfdG9vbHRpcGN0cmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjA1YzM3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX3Rvb2x0aXBjdHJsLmgKQEAgLTAsMCArMSw0NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfVE9PTFRJUF9IDQorI2RlZmluZSBfRldMX1RPT0xUSVBfSA0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllczsNCitjbGFzcyBJRldMX0Zvcm07DQorY2xhc3MgSUZXTF9Ub29sVGlwRFA7DQorY2xhc3MgSUZXTF9Ub29sVGlwOw0KKyNkZWZpbmUgRldMX0NMQVNTX1Rvb2xUaXAgTCJGV0xfVE9PTFRJUCINCisjZGVmaW5lIEZXTF9DTEFTU0hBU0hfVG9vbFRpcCAxMTExOTg0NzU1DQorI2RlZmluZSBGV0xfU1RZTEVFWFRfVFRQX1JlY3RhbmdsZSAoMEwgPDwgMykNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9UVFBfUm91bmRDb3JuZXIgKDFMIDw8IDMpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfVFRQX0JhbGxvb24gKDFMIDw8IDQpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfVFRQX011bHRpbGluZSAoMUwgPDwgNSkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9UVFBfTm9BbmNob3IgKDFMIDw8IDYpDQorI2RlZmluZSBGV0xfUEFSVF9UVFBfQm9yZGVyIDENCisjZGVmaW5lIEZXTF9QQVJUX1RUUF9CYWNrZ3JvdW5kIDINCisjZGVmaW5lIEZXTF9QQVJUX1RUUF9DYXB0aW9uIDMNCitjbGFzcyBJRldMX1Rvb2xUaXBEUCA6IHB1YmxpYyBJRldMX0RhdGFQcm92aWRlciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRDYXB0aW9uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQ2FwdGlvbikgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEluaXRpYWxEZWxheShJRldMX1dpZGdldCogcFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEF1dG9Qb3BEZWxheShJRldMX1dpZGdldCogcFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBDRlhfRElCaXRtYXAqIEdldFRvb2xUaXBJY29uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIENGWF9TaXplRiBHZXRUb29sVGlwSWNvblNpemUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpID0gMDsNCit9Ow0KK2NsYXNzIElGV0xfVG9vbFRpcCA6IHB1YmxpYyBJRldMX0Zvcm0gew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZXTF9Ub29sVGlwKiBDcmVhdGUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpOw0KKw0KKyAgRldMX0VSUiBTZXRBbmNob3IoY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvcik7DQorICBGV0xfRVJSIFNob3coKTsNCisgIEZXTF9FUlIgSGlkZSgpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRldMX1Rvb2xUaXAoKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z4bWF0aF9iYXJjb2RlLmggYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9meG1hdGhfYmFyY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMzY1MGUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9meG1hdGhfYmFyY29kZS5oCkBAIC0wLDAgKzEsNDggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhNQVRIX0JBUkNPREVfSF8NCisjZGVmaW5lIF9GWE1BVEhfQkFSQ09ERV9IXw0KK2NsYXNzIElGWF9CYXJjb2RlIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZYX0JhcmNvZGUoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorICB2aXJ0dWFsIEJDX1RZUEUgR2V0VHlwZSgpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0RldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAqJiBwT3V0Qml0bWFwLCBpbnQzMl90JiBlKSA9IDA7DQorICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIERlY29kZSh1aW50OF90KiBidWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlcnJvckNvZGUpID0gMDsNCisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgRGVjb2RlKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50MzJfdCYgZXJyb3JDb2RlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Q2hhckVuY29kaW5nKEJDX0NIQVJfRU5DT0RJTkcgZW5jb2RpbmcpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRNb2R1bGVIZWlnaHQoaW50MzJfdCBtb2R1bGVIZWlnaHQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRNb2R1bGVXaWR0aChpbnQzMl90IG1vZHVsZVdpZHRoKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0SGVpZ2h0KGludDMyX3QgaGVpZ2h0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0V2lkdGgoaW50MzJfdCB3aWR0aCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIENoZWNrQ29udGVudFZhbGlkaXR5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRQcmludENoZWNrc3VtKEZYX0JPT0wgY2hlY2tzdW0pID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXREYXRhTGVuZ3RoKGludDMyX3QgbGVuZ3RoKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Q2FsQ2hlY2tzdW0oaW50MzJfdCBzdGF0ZSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldEZvbnQoQ0ZYX0ZvbnQqIHBGb250KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Rm9udFNpemUoRlhfRkxPQVQgc2l6ZSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldEZvbnRTdHlsZShpbnQzMl90IHN0eWxlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Rm9udENvbG9yKEZYX0FSR0IgY29sb3IpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRXaWRlTmFycm93UmF0aW8oaW50MzJfdCByYXRpbykgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldFN0YXJ0Q2hhcihGWF9DSEFSIHN0YXJ0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0RW5kQ2hhcihGWF9DSEFSIGVuZCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldFZlcnNpb24oaW50MzJfdCB2ZXJzaW9uKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoaW50MzJfdCBsZXZlbCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldFRydW5jYXRlZChGWF9CT09MIHRydW5jYXRlZCkgPSAwOw0KK307DQorSUZYX0JhcmNvZGUqIEZYX0JhcmNvZGVfQ3JlYXRlKEJDX1RZUEUgdHlwZSk7DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2FwcC5oIGIveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2FwcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MTdiNzIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfYXBwLmgKQEAgLTAsMCArMSw0MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfQVBQX0gNCisjZGVmaW5lIF9GV0xfQVBQX0gNCitjbGFzcyBJRldMX05vdGVUaHJlYWQ7DQorY2xhc3MgSUZXTF9BZGFwdGVyTmF0aXZlOw0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIElGV0xfV2lkZ2V0TWdyOw0KK2NsYXNzIElGV0xfVGhlbWVQcm92aWRlcjsNCitjbGFzcyBJRldMX0FkYXB0ZXJXaWRnZXRNZ3I7DQorDQorY2xhc3MgSUZXTF9BcHAgOiBwdWJsaWMgSUZXTF9Ob3RlVGhyZWFkIHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGV0xfQXBwKiBDcmVhdGUoSUZXTF9BZGFwdGVyTmF0aXZlKiBwQWRhcHRlcik7DQorDQorICBGV0xfRVJSIEluaXRpYWxpemUoKTsNCisgIEZXTF9FUlIgRmluYWxpemUoKTsNCisgIElGV0xfQWRhcHRlck5hdGl2ZSogR2V0QWRhcHRlck5hdGl2ZSgpOw0KKyAgSUZXTF9XaWRnZXRNZ3IqIEdldFdpZGdldE1ncigpOw0KKyAgSUZXTF9UaGVtZVByb3ZpZGVyKiBHZXRUaGVtZVByb3ZpZGVyKCk7DQorICBGV0xfRVJSIFNldFRoZW1lUHJvdmlkZXIoSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWVQcm92aWRlcik7DQorICBGV0xfRVJSIEV4aXQoaW50MzJfdCBpRXhpdENvZGUpOw0KKw0KKyBwcml2YXRlOg0KKyAgSUZXTF9BcHAoKSB7fQ0KK307DQorSUZXTF9BcHAqIEZXTF9HZXRBcHAoKTsNCit2b2lkIEZXTF9TZXRBcHAoSUZXTF9BcHAqIHBBcHApOw0KK0lGV0xfQWRhcHRlck5hdGl2ZSogRldMX0dldEFkYXB0ZXJOYXRpdmUoKTsNCitJRldMX0FkYXB0ZXJXaWRnZXRNZ3IqIEZXTF9HZXRBZGFwdGVyV2lkZ2V0TWdyKCk7DQorSUZXTF9UaGVtZVByb3ZpZGVyKiBGV0xfR2V0VGhlbWVQcm92aWRlcigpOw0KK2V4dGVybiBGV0xfRVJSIEZXTF9FeGVjdXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NFeGVjdXRhYmxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NQYXJhbWV0ZXJzKTsNCitGV0xfRVJSIEZXTF9TZXRGdWxsU2NyZWVuKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9CT09MIGJGdWxsU2NyZWVuKTsNCitGWF9CT09MIEZXTF9BcHBJc0FjdGl2ZWQoKTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfY29udGVudC5oIGIveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2NvbnRlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGM0ODg3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2NvbnRlbnQuaApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9DT05URU5UX0gNCisjZGVmaW5lIF9GV0xfQ09OVEVOVF9IDQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgSUZXTF9Db250ZW50Ow0KK2NsYXNzIElGV0xfQ29udGVudCA6IHB1YmxpYyBJRldMX1dpZGdldCB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRldMX0NvbnRlbnQqIENyZWF0ZSgpOw0KKyAgRldMX0VSUiBJbnNlcnRXaWRnZXQoSUZXTF9XaWRnZXQqIHBDaGlsZCwgaW50MzJfdCBuSW5kZXggPSAtMSk7DQorICBGV0xfRVJSIFJlbW92ZVdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCk7DQorICBGV0xfRVJSIFJlbW92ZUFsbFdpZGdldHMoKTsNCisgIEZXTF9FUlIgR2V0TWluU2l6ZShGWF9GTE9BVCYgZldpZHRoLCBGWF9GTE9BVCYgZkhlaWdodCk7DQorICBGV0xfRVJSIFNldE1pblNpemUoRlhfRkxPQVQgZldpZHRoLCBGWF9GTE9BVCBmSGVpZ2h0KTsNCisgIEZXTF9FUlIgR2V0TWF4U2l6ZShGWF9GTE9BVCYgZldpZHRoLCBGWF9GTE9BVCYgZkhlaWdodCk7DQorICBGV0xfRVJSIFNldE1heFNpemUoRlhfRkxPQVQgZldpZHRoLCBGWF9GTE9BVCBmSGVpZ2h0KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgSUZXTF9Db250ZW50KCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfZXJyb3IuaCBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF9lcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOTI5NDUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfZXJyb3IuaApAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgWEZBX0lOQ0xVREVfRldMX0NPUkVfRldMX0VSUk9SX0hfDQorI2RlZmluZSBYRkFfSU5DTFVERV9GV0xfQ09SRV9GV0xfRVJST1JfSF8NCisNCisjaW5jbHVkZSA8c3RkaW50Lmg+DQorDQordHlwZWRlZiBpbnQzMl90IEZXTF9FUlI7DQorDQorI2RlZmluZSBGV0xfRVJSX1N1Y2NlZWRlZCAwDQorI2RlZmluZSBGV0xfRVJSX0luZGVmaW5pdGUgLTENCisjZGVmaW5lIEZXTF9FUlJfUGFyYW1ldGVyX0ludmFsaWQgLTEwMA0KKyNkZWZpbmUgRldMX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkIC0yMDANCisjZGVmaW5lIEZXTF9FUlJfSW50ZXJtZWRpYXRlX1ZhbHVlX19JbnZhbGlkIC0zMDANCisjZGVmaW5lIEZXTF9FUlJfTWV0aG9kX05vdF9TdXBwb3J0ZWQgLTQwMA0KKyNkZWZpbmUgRldMX0VSUl9PdXRfT2ZfTWVtb3J5IC01MDANCisNCisjZW5kaWYgIC8vIFhGQV9JTkNMVURFX0ZXTF9DT1JFX0ZXTF9FUlJPUl9IXw0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF9mb3JtLmggYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfZm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYTJmNWMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfZm9ybS5oCkBAIC0wLDAgKzEsODMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX0ZPUk1fSA0KKyNkZWZpbmUgX0ZXTF9GT1JNX0gNCitjbGFzcyBJRldMX1dpZGdldDsNCitjbGFzcyBJRldMX1BhbmVsOw0KK2NsYXNzIElGV0xfRm9ybTsNCisjZGVmaW5lIEZXTF9DTEFTU19Gb3JtIEwiRldMX0ZPUk0iDQorI2RlZmluZSBGV0xfQ0xBU1NIQVNIX0Zvcm0gODgxNTY3MjkyDQorI2RlZmluZSBGV0xfQ0xBU1NfRm9ybVByb3h5IEwiRldMX0ZPUk1QUk9YWSINCisjZGVmaW5lIEZXTF9DTEFTU0hBU0hfRm9ybVByb3h5IDg4MTU2NzI5MQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0ZSTV9SZXNpemUgKDFMIDw8IDApDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRlJNX05hdGl2ZUJvcmRlciAoMUwgPDwgMSkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9GUk1fUm91bmRDb3JuZXIgKDJMIDw8IDEpDQorI2RlZmluZSBGV0xfU1RZTEVFWFRfRlJNX1JvdW5kQ29ybmVyNCAoM0wgPDwgMSkNCisjZGVmaW5lIEZXTF9TVFlMRUVYVF9GUk1fTm9EcmF3Q2xpZW50ICgxTCA8PCAzKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0ZSTV9Cb3JkZXJDb3JuZXJNYXNrICgzTCA8PCAxKQ0KKyNkZWZpbmUgRldMX1NUWUxFRVhUX0ZSTV9NYXggKDMpDQorI2lmIChfRlhfT1NfID09IF9GWF9NQUNPU1hfKQ0KKyNkZWZpbmUgRldMX1VzZU1hY1N5c3RlbUJvcmRlcg0KKyNlbmRpZg0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX0ZSTV9DWUNhcHRpb24gKEZXTF9XR1RDQVBBQ0lUWV9NQVggKyAxKQ0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX0ZSTV9DWU5hcnJvd0NhcHRpb24gKEZXTF9XR1RDQVBBQ0lUWV9NQVggKyAyKQ0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX0ZSTV9CaWdJY29uIChGV0xfV0dUQ0FQQUNJVFlfTUFYICsgMykNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9GUk1fU21hbGxJY29uIChGV0xfV0dUQ0FQQUNJVFlfTUFYICsgNCkNCisjZGVmaW5lIEZXTF9QQVJUX0ZSTV9Cb3JkZXIgMQ0KKyNkZWZpbmUgRldMX1BBUlRfRlJNX0VkZ2UgMg0KKyNkZWZpbmUgRldMX1BBUlRfRlJNX0JhY2tncm91bmQgMw0KKyNkZWZpbmUgRldMX1BBUlRfRlJNX0NhcHRpb24gNA0KKyNkZWZpbmUgRldMX1BBUlRfRlJNX05hcnJvd0NhcHRpb24gNQ0KKyNkZWZpbmUgRldMX1BBUlRfRlJNX0Nsb3NlQm94IDYNCisjZGVmaW5lIEZXTF9QQVJUX0ZSTV9NaW5pbWl6ZUJveCA3DQorI2RlZmluZSBGV0xfUEFSVF9GUk1fTWF4aW1pemVCb3ggOA0KKyNkZWZpbmUgRldMX1BBUlRfRlJNX0hlYWRUZXh0IDkNCisjZGVmaW5lIEZXTF9QQVJUX0ZSTV9JY29uIDEwDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0ZSTV9Ob3JtYWwgMQ0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9GUk1fSG92ZXIgMg0KKyNkZWZpbmUgRldMX1BBUlRTVEFURV9GUk1fUHJlc3NlZCAzDQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0ZSTV9JbmFjdGl2ZSA0DQorI2RlZmluZSBGV0xfUEFSVFNUQVRFX0ZSTV9EaXNhYmxlZCA1DQorDQorY2xhc3MgSUZXTF9Gb3JtRFAgOiBwdWJsaWMgSUZXTF9EYXRhUHJvdmlkZXIgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIENGWF9ESUJpdG1hcCogR2V0SWNvbihJRldMX1dpZGdldCogcFdpZGdldCwgRlhfQk9PTCBiQmlnKSA9IDA7DQorfTsNCitlbnVtIEZXTF9GT1JNU0laRSB7DQorICBGV0xfRk9STVNJWkVfTWFudWFsID0gMCwNCisgIEZXTF9GT1JNU0laRV9XaWR0aCwNCisgIEZXTF9GT1JNU0laRV9IZWlnaHQsDQorICBGV0xfRk9STVNJWkVfQWxsLA0KK307DQorZW51bSBGV0xfQ09NTUFORElEIHsNCisgIEZXTF9DT01NQU5ESURfQ2xvc2UgPSAwLA0KKyAgRldMX0NPTU1BTkRJRF9PaywNCisgIEZXTF9DT01NQU5ESURfQ2FuY2VsLA0KKyAgRldMX0NPTU1BTkRJRF9BYm9ydCwNCisgIEZXTF9DT01NQU5ESURfUmV0cnksDQorICBGV0xfQ09NTUFORElEX0lnbm9yZSwNCisgIEZXTF9DT01NQU5ESURfWWVzLA0KKyAgRldMX0NPTU1BTkRJRF9ObywNCit9Ow0KKw0KK2NsYXNzIElGV0xfRm9ybSA6IHB1YmxpYyBJRldMX1BhbmVsIHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGV0xfRm9ybSogQ3JlYXRlRm9ybVByb3h5KENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyogY2xhc3NuYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpOw0KKw0KKyAgRldMX0ZPUk1TSVpFIEdldEZvcm1TaXplKCk7DQorICBGV0xfRVJSIFNldEZvcm1TaXplKEZXTF9GT1JNU0laRSBlRm9ybVNpemUpOw0KKyAgSUZXTF9XaWRnZXQqIERvTW9kYWwoKTsNCisgIElGV0xfV2lkZ2V0KiBEb01vZGFsKEZYX0RXT1JEJiBkd0NvbW1hbmRJRCk7DQorICBGV0xfRVJSIEVuZERvTW9kYWwoKTsNCisgIEZXTF9FUlIgU2V0Qm9yZGVyUmVnaW9uKENGWF9QYXRoKiBwUGF0aCk7DQorDQorIHByb3RlY3RlZDoNCisgIElGV0xfRm9ybSgpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2dyaWQuaCBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF9ncmlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY4ZGU5MQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF9ncmlkLmgKQEAgLTAsMCArMSw4MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfR1JJRF9IDQorI2RlZmluZSBfRldMX0dSSURfSA0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIElGV0xfQ29udGVudDsNCisjZGVmaW5lIEZXTF9DTEFTU19HcmlkIEwiRldMX0dSSUQiDQorI2RlZmluZSBGV0xfQ0xBU1NIQVNIX0dyaWQgMzE1MDI5ODY3MA0KKyNkZWZpbmUgRldMX0dSSURTVFlMRUVYVF9TaG93R3JpZExpbmVzICgxTCA8PCAwKQ0KK3N0cnVjdCBGV0xfTEFZT1VUREFUQSB7DQorICBGWF9GTE9BVCBmV2lkdGg7DQorICBGWF9GTE9BVCBmSGVpZ2h0Ow0KK307DQorZW51bSBGV0xfR1JJRFVOSVQgew0KKyAgRldMX0dSSURVTklUX0F1dG8gPSAwLA0KKyAgRldMX0dSSURVTklUX0ZpeGVkLA0KKyAgRldMX0dSSURVTklUX1NjYWxlZCwNCisgIEZXTF9HUklEVU5JVF9JbmZpbml0eSwNCit9Ow0KK2VudW0gRldMX0dSSURNQVJHSU4gew0KKyAgRldMX0dSSURNQVJHSU5fTGVmdCA9IDAsDQorICBGV0xfR1JJRE1BUkdJTl9Ub3AsDQorICBGV0xfR1JJRE1BUkdJTl9SaWdodCwNCisgIEZXTF9HUklETUFSR0lOX0JvdHRvbSwNCit9Ow0KK2VudW0gRldMX0dSSURTSVpFIHsNCisgIEZXTF9HUklEU0laRV9XaWR0aCA9IDAsDQorICBGV0xfR1JJRFNJWkVfSGVpZ2h0LA0KKyAgRldMX0dSSURTSVpFX01pbldpZHRoLA0KKyAgRldMX0dSSURTSVpFX01pbkhlaWdodCwNCisgIEZXTF9HUklEU0laRV9NYXhXaWR0aCwNCisgIEZXTF9HUklEU0laRV9NYXhIZWlnaHQsDQorfTsNCit0eXBlZGVmIHN0cnVjdCBfRldMX0hHUklEQ09MUk9XIHsgdm9pZCogcERhdGE7IH0gKiBGV0xfSEdSSURDT0xST1c7DQorY2xhc3MgSUZXTF9HcmlkIDogcHVibGljIElGV0xfQ29udGVudCB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRldMX0dyaWQqIENyZWF0ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMpOw0KKw0KKyAgRldMX0hHUklEQ09MUk9XIEluc2VydENvbFJvdyhGWF9CT09MIGJDb2x1bW4sIGludDMyX3QgbkluZGV4ID0gLTEpOw0KKyAgaW50MzJfdCBDb3VudENvbFJvd3MoRlhfQk9PTCBiQ29sdW1uKTsNCisgIEZXTF9IR1JJRENPTFJPVyBHZXRDb2xSb3coRlhfQk9PTCBiQ29sdW1uLCBpbnQzMl90IG5JbmRleCk7DQorICBpbnQzMl90IEdldEluZGV4KEZXTF9IR1JJRENPTFJPVyBoQ29sUm93KTsNCisgIEZYX0ZMT0FUIEdldFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZXTF9HUklEVU5JVCYgZVVuaXQpOw0KKyAgRldMX0VSUiBTZXRTaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LCBGWF9GTE9BVCBmU2l6ZSwgRldMX0dSSURVTklUIGVVbml0KTsNCisgIEZYX0ZMT0FUIEdldE1pblNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZXTF9HUklEVU5JVCYgZVVuaXQpOw0KKyAgRldMX0VSUiBTZXRNaW5TaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklEVU5JVCBlVW5pdCk7DQorICBGWF9GTE9BVCBHZXRNYXhTaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LCBGV0xfR1JJRFVOSVQmIGVVbml0KTsNCisgIEZXTF9FUlIgU2V0TWF4U2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywNCisgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRFVOSVQgZVVuaXQpOw0KKyAgRlhfQk9PTCBEZWxldGVDb2xSb3coRldMX0hHUklEQ09MUk9XIGhDb2xSb3cpOw0KKyAgRlhfQk9PTCBJc0NvbHVtbihGV0xfSEdSSURDT0xST1cgaENvbFJvdyk7DQorICBpbnQzMl90IEdldFdpZGdldFBvcyhJRldMX1dpZGdldCogcFdpZGdldCwgRlhfQk9PTCBiQ29sdW1uKTsNCisgIEZXTF9FUlIgU2V0V2lkZ2V0UG9zKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBpbnQzMl90IGlQb3MsIEZYX0JPT0wgYkNvbHVtbik7DQorICBpbnQzMl90IEdldFdpZGdldFNwYW4oSUZXTF9XaWRnZXQqIHBXaWRnZXQsIEZYX0JPT0wgYkNvbHVtbik7DQorICBGV0xfRVJSIFNldFdpZGdldFNwYW4oSUZXTF9XaWRnZXQqIHBXaWRnZXQsIGludDMyX3QgaVNwYW4sIEZYX0JPT0wgYkNvbHVtbik7DQorICBGWF9GTE9BVCBHZXRXaWRnZXRTaXplKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRFNJWkUgZVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklEVU5JVCYgZVVuaXQpOw0KKyAgRldMX0VSUiBTZXRXaWRnZXRTaXplKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklEU0laRSBlU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRFVOSVQgZVVpdCk7DQorICBGWF9CT09MIEdldFdpZGdldE1hcmdpbihJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklETUFSR0lOIGVNYXJnaW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZk1hcmdpbik7DQorICBGV0xfRVJSIFNldFdpZGdldE1hcmdpbihJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklETUFSR0lOIGVNYXJnaW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWFyZ2luKTsNCisgIEZXTF9FUlIgUmVtb3ZlV2lkZ2V0TWFyZ2luKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGV0xfR1JJRE1BUkdJTiBlTWFyZ2luKTsNCisgIEZYX0ZMT0FUIEdldEdyaWRTaXplKEZXTF9HUklEU0laRSBlU2l6ZSwgRldMX0dSSURVTklUJiBlVW5pdCk7DQorICBGV0xfRVJSIFNldEdyaWRTaXplKEZXTF9HUklEU0laRSBlU2l6ZSwgRlhfRkxPQVQgZlNpemUsIEZXTF9HUklEVU5JVCBlVWl0KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgSUZXTF9HcmlkKCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfbm90ZS5oIGIveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX25vdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDIzMGQyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX25vdGUuaApAQCAtMCwwICsxLDM3NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfTk9URV9IDQorI2RlZmluZSBfRldMX05PVEVfSA0KK2NsYXNzIElGV0xfVGFyZ2V0Ow0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIElGV0xfTm90ZVRocmVhZDsNCitjbGFzcyBJRldMX1RoZW1lUHJvdmlkZXI7DQorY2xhc3MgQ0ZXTF9Ob3RlOw0KK2NsYXNzIENGV0xfTWVzc2FnZTsNCitjbGFzcyBDRldMX01zZ0FjdGl2YXRlOw0KK2NsYXNzIENGV0xfTXNnRGVhY3RpdmF0ZTsNCitjbGFzcyBDRldMX01zZ01vdXNlOw0KK2NsYXNzIENGV0xfTXNnTW91c2VXaGVlbDsNCitjbGFzcyBDRldMX01zZ0tleTsNCitjbGFzcyBDRldMX01zZ1NldEZvY3VzOw0KK2NsYXNzIENGV0xfTXNnS2lsbEZvY3VzOw0KK2NsYXNzIENGV0xfTXNnQ3Vyc29yOw0KK2NsYXNzIENGV0xfTXNnU2l6ZTsNCitjbGFzcyBDRldMX01zZ1dpbmRvd01vdmU7DQorY2xhc3MgQ0ZXTF9Nc2dEcm9wRmlsZXM7DQorY2xhc3MgQ0ZXTF9Nc2dUYXNrQ2xpY2tlZDsNCitjbGFzcyBDRldMX01zZ0Nsb3NlOw0KK2NsYXNzIENGV0xfTXNnV2luZG93V2lsbE1vdmU7DQorY2xhc3MgQ0ZXTF9FdmVudDsNCitjbGFzcyBDRldMX0V2dE1vdXNlOw0KK2NsYXNzIENGV0xfRXZ0TW91c2VXaGVlbDsNCitjbGFzcyBDRldMX0V2dEtleTsNCitjbGFzcyBDRldMX0V2dFNldEZvY3VzOw0KK2NsYXNzIENGV0xfRXZ0S2lsbEZvY3VzOw0KK2NsYXNzIENGV0xfRXZ0RHJhdzsNCitjbGFzcyBDRldMX0V2dENsaWNrOw0KK2NsYXNzIENGV0xfRXZ0U2Nyb2xsOw0KK2NsYXNzIENGV0xfRXZ0Q2xvc2U7DQorY2xhc3MgQ0ZXTF9FdnRDb250ZXh0TWVudTsNCitjbGFzcyBDRldMX0V2dE1lbnVDb21tYW5kOw0KK2NsYXNzIENGV0xfRXZ0U2l6ZUNoYW5nZWQ7DQorY2xhc3MgQ0ZXTF9FdnRJZGxlOw0KK2NsYXNzIElGV0xfTm90ZURyaXZlcjsNCitjbGFzcyBJRldMX05vdGVMb29wOw0KKyNkZWZpbmUgRldMX01TR19BY3RpdmF0ZSBMIkZXTF9NRVNTQUdFX0FjdGl2YXRlIg0KKyNkZWZpbmUgRldMX01TR19EZWFjdGl2YXRlIEwiRldMX01FU1NBR0VfRGVhY3RpdmF0ZSINCisjZGVmaW5lIEZXTF9NU0dfU2V0Rm9jdXMgTCJGV0xfTUVTU0FHRV9TZXRGb2N1cyINCisjZGVmaW5lIEZXTF9NU0dfS2lsbEZvY3VzIEwiRldMX01FU1NBR0VfS2lsbEZvY3VzIg0KKyNkZWZpbmUgRldMX01TR19Nb3VzZSBMIkZXTF9NRVNTQUdFX01vdXNlIg0KKyNkZWZpbmUgRldMX01TR19Nb3VzZVdoZWVsIEwiRldMX01FU1NBR0VfTW91c2VXaGVlbCINCisjZGVmaW5lIEZXTF9NU0dfS2V5IEwiRldMX01FU1NBR0VfS2V5Ig0KKyNkZWZpbmUgRldMX01TR19DdXJzb3IgTCJGV0xfTUVTU0FHRV9DdXJzb3IiDQorI2RlZmluZSBGV0xfTVNHX1NpemUgTCJGV0xfTUVTU0FHRV9TaXplIg0KKyNkZWZpbmUgRldMX01TR19XaW5kb3dNb3ZlIEwiRldMX01FU1NBR0VfV2luZG93TW92ZSINCisjZGVmaW5lIEZXTF9NU0dfRHJvcEZpbGVzIEwiRldMX01FU1NBR0VfRHJvcEZpbGVzIg0KKyNkZWZpbmUgRldMX01TR19UYXNrQ2xpY2tlZCBMIkZXTF9NRVNTQUdFX1Rhc2tDbGlja2VkIg0KKyNkZWZpbmUgRldMX01TR19DbG9zZSBMIkZXTF9NRVNTQUdFX0Nsb3NlIg0KKyNkZWZpbmUgRldMX01TR19Qb3N0IEwiRldMX01FU1NBR0VfUG9zdCINCisjZGVmaW5lIEZXTF9NU0dfV2luZG93V2lsbE1vdmUgTCJGV0xfTUVTU0FHRV9XaW5kb3dXaWxsTW92ZSINCisjZGVmaW5lIEZXTF9NU0dIQVNIX0FjdGl2YXRlIDI0MTAzNjk0NjkNCisjZGVmaW5lIEZXTF9NU0dIQVNIX0RlYWN0aXZhdGUgMTE4NDIxNDc5MA0KKyNkZWZpbmUgRldMX01TR0hBU0hfU2V0Rm9jdXMgNDE3NDUxMjUwNA0KKyNkZWZpbmUgRldMX01TR0hBU0hfS2lsbEZvY3VzIDE1NTc5MDM4MzINCisjZGVmaW5lIEZXTF9NU0dIQVNIX01vdXNlIDcwNjEyODMwOQ0KKyNkZWZpbmUgRldMX01TR0hBU0hfTW91c2VXaGVlbCA4OTM3MDM0NjYNCisjZGVmaW5lIEZXTF9NU0dIQVNIX0tleSAzNzUxMzcyNDA1DQorI2RlZmluZSBGV0xfTVNHSEFTSF9DdXJzb3IgMzE4MjYyNjIxOA0KKyNkZWZpbmUgRldMX01TR0hBU0hfU2l6ZSAxNjAwNzc3MzUNCisjZGVmaW5lIEZXTF9NU0dIQVNIX1dpbmRvd01vdmUgMTAzMjI2OTM3Nw0KKyNkZWZpbmUgRldMX01TR0hBU0hfRHJvcEZpbGVzIDIwMDQxNjUyMzYNCisjZGVmaW5lIEZXTF9NU0dIQVNIX1Rhc2tDbGlja2VkIDMxMjgyMzEwODYNCisjZGVmaW5lIEZXTF9NU0dIQVNIX0Nsb3NlIDI5Nzc1NjM5MDYNCisjZGVmaW5lIEZXTF9NU0dIQVNIX1Bvc3QgMTk2OTYzMzA3NA0KKyNkZWZpbmUgRldMX01TR0hBU0hfV2luZG93V2lsbE1vdmUgMjIyOTE3NTc2Mw0KKyNkZWZpbmUgRldMX0VWVF9Nb3VzZSBMIkZXTF9FVkVOVF9Nb3VzZSINCisjZGVmaW5lIEZXTF9FVlRfTW91c2VXaGVlbCBMIkZXTF9FVkVOVF9Nb3VzZVdoZWVsIg0KKyNkZWZpbmUgRldMX0VWVF9LZXkgTCJGV0xfRVZFTlRfS2V5Ig0KKyNkZWZpbmUgRldMX0VWVF9TZXRGb2N1cyBMIkZXTF9FVkVOVF9TZXRGb2N1cyINCisjZGVmaW5lIEZXTF9FVlRfS2lsbEZvY3VzIEwiRldMX0VWRU5UX0tpbGxGb2N1cyINCisjZGVmaW5lIEZXTF9FVlRfQ2xpY2sgTCJGV0xfRVZFTlRfQ2xpY2siDQorI2RlZmluZSBGV0xfRVZUX0RyYXcgTCJGV0xfRVZFTlRfRHJhdyINCisjZGVmaW5lIEZXTF9FVlRfU2Nyb2xsIEwiRldMX0VWRU5UX1Njcm9sbCINCisjZGVmaW5lIEZXTF9FVlRfQ2xvc2UgTCJGV0xfRVZFTlRfQ2xvc2UiDQorI2RlZmluZSBGV0xfRVZUX0NvbnRleHRNZW51IEwiRldMX0VWRU5UX0NvbnRleHRNZW51Ig0KKyNkZWZpbmUgRldMX0VWVF9NZW51Q29tbWFuZCBMIkZXTF9FVkVOVF9NZW51Q29tbWFuZCINCisjZGVmaW5lIEZXTF9FVlRfU2l6ZUNoYW5nZWQgTCJGV0xfRVZFTlRfU2l6ZUNoYW5nZWQiDQorI2RlZmluZSBGV0xfRVZUSEFTSF9Nb3VzZSAxNzY1MjU4MDAyDQorI2RlZmluZSBGV0xfRVZUSEFTSF9Nb3VzZVdoZWVsIDM5MDcxMTQ0MDcNCisjZGVmaW5lIEZXTF9FVlRIQVNIX0tleSAyNDA4MzU0NDUwDQorI2RlZmluZSBGV0xfRVZUSEFTSF9TZXRGb2N1cyAzOTA5NzIxMjY5DQorI2RlZmluZSBGV0xfRVZUSEFTSF9LaWxsRm9jdXMgMTc3OTM2MzI1Mw0KKyNkZWZpbmUgRldMX0VWVEhBU0hfRHJhdyAyNDMwNzEzMzAzDQorI2RlZmluZSBGV0xfRVZUSEFTSF9DbGljayA0MDI2MzI4NzgzDQorI2RlZmluZSBGV0xfRVZUSEFTSF9TY3JvbGwgMjk2NTE1ODk2OA0KKyNkZWZpbmUgRldMX0VWVEhBU0hfQ2xvc2UgNDAzNjY5MzU5OQ0KKyNkZWZpbmUgRldMX0VWVEhBU0hfQ29udGV4dE1lbnUgMjcxNzMwNzcxNQ0KKyNkZWZpbmUgRldMX0VWVEhBU0hfTWVudUNvbW1hbmQgNDk3NzYzNzQxDQorI2RlZmluZSBGV0xfRVZUSEFTSF9TaXplQ2hhbmdlZCAzMDgzOTU4NTEwDQorI2RlZmluZSBGV0xfRVZUSEFTSF9JZGxlIDgzOTU0Njc1OQ0KKyNkZWZpbmUgRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duIDENCisjZGVmaW5lIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXAgMg0KKyNkZWZpbmUgRldMX01TR01PVVNFQ01EX0xCdXR0b25EYmxDbGsgMw0KKyNkZWZpbmUgRldMX01TR01PVVNFQ01EX1JCdXR0b25Eb3duIDQNCisjZGVmaW5lIEZXTF9NU0dNT1VTRUNNRF9SQnV0dG9uVXAgNQ0KKyNkZWZpbmUgRldMX01TR01PVVNFQ01EX1JCdXR0b25EYmxDbGsgNg0KKyNkZWZpbmUgRldMX01TR01PVVNFQ01EX01CdXR0b25Eb3duIDcNCisjZGVmaW5lIEZXTF9NU0dNT1VTRUNNRF9NQnV0dG9uVXAgOA0KKyNkZWZpbmUgRldMX01TR01PVVNFQ01EX01CdXR0b25EYmxDbGsgOQ0KKyNkZWZpbmUgRldMX01TR01PVVNFQ01EX01vdXNlTW92ZSAxMA0KKyNkZWZpbmUgRldMX01TR01PVVNFQ01EX01vdXNlRW50ZXIgMTENCisjZGVmaW5lIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlIDEyDQorI2RlZmluZSBGV0xfTVNHTU9VU0VDTURfTW91c2VIb3ZlciAxMw0KKyNkZWZpbmUgRldMX01TR0tFWUNNRF9LZXlEb3duIDENCisjZGVmaW5lIEZXTF9NU0dLRVlDTURfS2V5VXAgMg0KKyNkZWZpbmUgRldMX01TR0tFWUNNRF9DaGFyIDMNCisjZGVmaW5lIEZXTF9LRVlGTEFHX0N0cmwgKDEgPDwgMCkNCisjZGVmaW5lIEZXTF9LRVlGTEFHX0FsdCAoMSA8PCAxKQ0KKyNkZWZpbmUgRldMX0tFWUZMQUdfU2hpZnQgKDEgPDwgMikNCisjZGVmaW5lIEZXTF9LRVlGTEFHX0NvbW1hbmQgKDEgPDwgMykNCisjZGVmaW5lIEZXTF9LRVlGTEFHX0xCdXR0b24gKDEgPDwgNCkNCisjZGVmaW5lIEZXTF9LRVlGTEFHX1JCdXR0b24gKDEgPDwgNSkNCisjZGVmaW5lIEZXTF9LRVlGTEFHX01CdXR0b24gKDEgPDwgNikNCisNCisvLyBTZXBhcmF0ZSBoaWVyYXJjaHkgbm90IHJlbGF0ZWQgdG8gSUZXTF8qIGhpZXJhcmNoeS4gVGhlc2Ugc2hvdWxkIG5vdA0KKy8vIGdldCBjYXN0IHRvIElGV0xfKiB0eXBlcy4NCitjbGFzcyBDRldMX05vdGUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIEZYX0RXT1JEIFJlbGVhc2UoKSB7DQorICAgIG1fZHdSZWZDb3VudC0tOw0KKyAgICBGWF9EV09SRCBkd1JlZkNvdW50ID0gbV9kd1JlZkNvdW50Ow0KKyAgICBpZiAoIW1fZHdSZWZDb3VudCkgew0KKyAgICAgIGRlbGV0ZSB0aGlzOw0KKyAgICB9DQorICAgIHJldHVybiBkd1JlZkNvdW50Ow0KKyAgfQ0KKyAgdmlydHVhbCBDRldMX05vdGUqIFJldGFpbigpIHsNCisgICAgbV9kd1JlZkNvdW50Kys7DQorICAgIHJldHVybiB0aGlzOw0KKyAgfQ0KKyAgdmlydHVhbCBGV0xfRVJSIEdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Qgew0KKyAgICB3c0NsYXNzID0gTCJDRldMX05vdGUiOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldENsYXNzSUQoKSBjb25zdCB7IHJldHVybiAwOyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNJbnN0YW5jZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2xhc3MpIGNvbnN0IHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICB2aXJ0dWFsIENGV0xfTm90ZSogQ2xvbmUoKSB7IHJldHVybiBOVUxMOyB9DQorICBGWF9CT09MIElzRXZlbnQoKSBjb25zdCB7IHJldHVybiBtX2JJc0V2ZW50OyB9DQorICBJRldMX1dpZGdldCogbV9wU3JjVGFyZ2V0Ow0KKyAgSUZXTF9XaWRnZXQqIG1fcERzdFRhcmdldDsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZXTF9Ob3RlKEZYX0JPT0wgYklzRXZlbnQpDQorICAgICAgOiBtX3BTcmNUYXJnZXQoTlVMTCksDQorICAgICAgICBtX3BEc3RUYXJnZXQoTlVMTCksDQorICAgICAgICBtX2R3UmVmQ291bnQoMSksDQorICAgICAgICBtX2JJc0V2ZW50KGJJc0V2ZW50KSwNCisgICAgICAgIG1fZHdFeHRlbmQoMCkge30NCisgIHZpcnR1YWwgfkNGV0xfTm90ZSgpIHt9DQorICB2aXJ0dWFsIEZYX0JPT0wgSW5pdGlhbGl6ZSgpIHsgcmV0dXJuIFRSVUU7IH0NCisgIHZpcnR1YWwgaW50MzJfdCBGaW5hbGl6ZSgpIHsgcmV0dXJuIDA7IH0NCisgIEZYX0RXT1JEIG1fZHdSZWZDb3VudDsNCisgIEZYX0JPT0wgbV9iSXNFdmVudDsNCisNCisgcHVibGljOg0KKyAgRlhfRFdPUkQgbV9kd0V4dGVuZDsNCit9Ow0KK2NsYXNzIENGV0xfTWVzc2FnZSA6IHB1YmxpYyBDRldMX05vdGUgew0KKyBwdWJsaWM6DQorICBDRldMX01lc3NhZ2UoKSA6IENGV0xfTm90ZShGQUxTRSkge30NCisgIHZpcnR1YWwgfkNGV0xfTWVzc2FnZSgpIHt9DQorfTsNCisjZGVmaW5lIEJFR0lOX0ZXTF9NRVNTQUdFX0RFRihjbGFzc25hbWUsIG1zZ2hhc2hjb2RlKSAgICAgICAgICAgICBcDQorICBjbGFzcyBjbGFzc25hbWUgOiBwdWJsaWMgQ0ZXTF9NZXNzYWdlIHsgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgIHB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgY2xhc3NuYW1lKCkgOiBDRldMX01lc3NhZ2UoKSB7fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgIHZpcnR1YWwgQ0ZXTF9Ob3RlKiBDbG9uZSgpIHsgcmV0dXJuIG5ldyBjbGFzc25hbWUoKnRoaXMpOyB9ICAgXA0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdCB7IFwNCisgICAgICB3c0NsYXNzID0gTCMjICNjbGFzc25hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgdmlydHVhbCBGWF9EV09SRCBHZXRDbGFzc0lEKCkgY29uc3QgeyByZXR1cm4gbXNnaGFzaGNvZGU7IH0NCisjZGVmaW5lIEVORF9GV0xfTUVTU0FHRV9ERUYgXA0KKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICA7DQorQkVHSU5fRldMX01FU1NBR0VfREVGKENGV0xfTXNnQWN0aXZhdGUsIEZXTF9NU0dIQVNIX0FjdGl2YXRlKQ0KK0VORF9GV0xfTUVTU0FHRV9ERUYNCitCRUdJTl9GV0xfTUVTU0FHRV9ERUYoQ0ZXTF9Nc2dEZWFjdGl2YXRlLCBGV0xfTVNHSEFTSF9EZWFjdGl2YXRlKQ0KK0VORF9GV0xfTUVTU0FHRV9ERUYNCitCRUdJTl9GV0xfTUVTU0FHRV9ERUYoQ0ZXTF9Nc2dNb3VzZSwgRldMX01TR0hBU0hfTW91c2UpDQorRlhfRkxPQVQgbV9meDsNCitGWF9GTE9BVCBtX2Z5Ow0KK0ZYX0RXT1JEIG1fZHdGbGFnczsNCitGWF9EV09SRCBtX2R3Q21kOw0KK0VORF9GV0xfTUVTU0FHRV9ERUYNCitCRUdJTl9GV0xfTUVTU0FHRV9ERUYoQ0ZXTF9Nc2dNb3VzZVdoZWVsLCBGV0xfTVNHSEFTSF9Nb3VzZVdoZWVsKQ0KK0ZYX0ZMT0FUIG1fZng7DQorRlhfRkxPQVQgbV9meTsNCitGWF9GTE9BVCBtX2ZEZWx0YVg7DQorRlhfRkxPQVQgbV9mRGVsdGFZOw0KK0ZYX0RXT1JEIG1fZHdGbGFnczsNCitFTkRfRldMX01FU1NBR0VfREVGDQorQkVHSU5fRldMX01FU1NBR0VfREVGKENGV0xfTXNnU2V0Rm9jdXMsIEZXTF9NU0dIQVNIX1NldEZvY3VzKQ0KK0lGV0xfV2lkZ2V0KiBtX3BLaWxsRm9jdXM7DQorRU5EX0ZXTF9NRVNTQUdFX0RFRg0KK0JFR0lOX0ZXTF9NRVNTQUdFX0RFRihDRldMX01zZ0tpbGxGb2N1cywgRldMX01TR0hBU0hfS2lsbEZvY3VzKQ0KK0lGV0xfV2lkZ2V0KiBtX3BTZXRGb2N1czsNCitFTkRfRldMX01FU1NBR0VfREVGDQorQkVHSU5fRldMX01FU1NBR0VfREVGKENGV0xfTXNnS2V5LCBGV0xfTVNHSEFTSF9LZXkpDQorRlhfRFdPUkQgbV9kd0tleUNvZGU7DQorRlhfRFdPUkQgbV9kd0ZsYWdzOw0KK0ZYX0RXT1JEIG1fZHdDbWQ7DQorRU5EX0ZXTF9NRVNTQUdFX0RFRg0KK0JFR0lOX0ZXTF9NRVNTQUdFX0RFRihDRldMX01zZ0N1cnNvciwgRldMX01TR0hBU0hfQ3Vyc29yKQ0KK0VORF9GV0xfTUVTU0FHRV9ERUYNCitCRUdJTl9GV0xfTUVTU0FHRV9ERUYoQ0ZXTF9Nc2dTaXplLCBGV0xfTVNHSEFTSF9TaXplKQ0KK2ludDMyX3QgbV9pV2lkdGg7DQoraW50MzJfdCBtX2lIZWlnaHQ7DQorRU5EX0ZXTF9NRVNTQUdFX0RFRg0KK0JFR0lOX0ZXTF9NRVNTQUdFX0RFRihDRldMX01zZ1dpbmRvd01vdmUsIEZXTF9NU0dIQVNIX1dpbmRvd01vdmUpDQorRlhfRkxPQVQgbV9meDsNCitGWF9GTE9BVCBtX2Z5Ow0KK0VORF9GV0xfTUVTU0FHRV9ERUYNCitCRUdJTl9GV0xfTUVTU0FHRV9ERUYoQ0ZXTF9Nc2dEcm9wRmlsZXMsIEZXTF9NU0dIQVNIX0Ryb3BGaWxlcykNCitDRldMX01zZ0Ryb3BGaWxlcyhjb25zdCBDRldMX01zZ0Ryb3BGaWxlcyYgY29weSkgew0KKyAgbV9wRHN0VGFyZ2V0ID0gY29weS5tX3BEc3RUYXJnZXQ7DQorICBtX3BTcmNUYXJnZXQgPSBjb3B5Lm1fcFNyY1RhcmdldDsNCisgIG1fZnggPSBjb3B5Lm1fZng7DQorICBtX2Z5ID0gY29weS5tX2Z5Ow0KKyAgbV9maWxlcy5BcHBlbmQoY29weS5tX2ZpbGVzKTsNCit9DQorRlhfRkxPQVQgbV9meDsNCitGWF9GTE9BVCBtX2Z5Ow0KK0NGWF9XaWRlU3RyaW5nQXJyYXkgbV9maWxlczsNCitFTkRfRldMX01FU1NBR0VfREVGDQorQkVHSU5fRldMX01FU1NBR0VfREVGKENGV0xfTXNnVGFza0NsaWNrZWQsIEZXTF9NU0dIQVNIX1Rhc2tDbGlja2VkKQ0KK0ZYX0ZMT0FUIG1fZng7DQorRlhfRkxPQVQgbV9meTsNCitFTkRfRldMX01FU1NBR0VfREVGDQorQkVHSU5fRldMX01FU1NBR0VfREVGKENGV0xfTXNnQ2xvc2UsIEZXTF9NU0dIQVNIX0Nsb3NlKQ0KK0VORF9GV0xfTUVTU0FHRV9ERUYNCitCRUdJTl9GV0xfTUVTU0FHRV9ERUYoQ0ZXTF9Nc2dXaW5kb3dXaWxsTW92ZSwgRldMX01TR0hBU0hfV2luZG93V2lsbE1vdmUpDQorRU5EX0ZXTF9NRVNTQUdFX0RFRg0KK2NsYXNzIENGV0xfRXZlbnQgOiBwdWJsaWMgQ0ZXTF9Ob3RlIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9FdmVudCgpIDogQ0ZXTF9Ob3RlKFRSVUUpIHt9DQorICB2aXJ0dWFsIH5DRldMX0V2ZW50KCkge30NCit9Ow0KKyNkZWZpbmUgQkVHSU5fRldMX0VWRU5UX0RFRihjbGFzc25hbWUsIGV2ZW50aGFzaGNvZGUpICAgICAgICAgICAgIFwNCisgIGNsYXNzIGNsYXNzbmFtZSA6IHB1YmxpYyBDRldMX0V2ZW50IHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICBjbGFzc25hbWUoKSA6IENGV0xfRXZlbnQoKSB7fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgdmlydHVhbCBGV0xfRVJSIEdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3QgeyBcDQorICAgICAgd3NDbGFzcyA9IEwjIyAjY2xhc3NuYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Q2xhc3NJRCgpIGNvbnN0IHsgcmV0dXJuIGV2ZW50aGFzaGNvZGU7IH0NCisjZGVmaW5lIEVORF9GV0xfRVZFTlRfREVGIFwNCisgIH0gICAgICAgICAgICAgICAgICAgICAgIFwNCisgIDsNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0TW91c2UsIEZXTF9FVlRIQVNIX01vdXNlKQ0KK0ZYX0ZMT0FUIG1fZng7DQorRlhfRkxPQVQgbV9meTsNCitGWF9EV09SRCBtX2R3RmxhZ3M7DQorRlhfRFdPUkQgbV9kd0NtZDsNCitFTkRfRldMX0VWRU5UX0RFRg0KK0JFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdnRNb3VzZVdoZWVsLCBGV0xfRVZUSEFTSF9Nb3VzZVdoZWVsKQ0KK0ZYX0ZMT0FUIG1fZng7DQorRlhfRkxPQVQgbV9meTsNCitGWF9GTE9BVCBtX2ZEZWx0YVg7DQorRlhfRkxPQVQgbV9mRGVsdGFZOw0KK0ZYX0RXT1JEIG1fZHdGbGFnczsNCitFTkRfRldMX0VWRU5UX0RFRg0KK0JFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdnRLZXksIEZXTF9FVlRIQVNIX0tleSkNCitGWF9EV09SRCBtX2R3S2V5Q29kZTsNCitGWF9EV09SRCBtX2R3RmxhZ3M7DQorRlhfRFdPUkQgbV9kd0NtZDsNCitFTkRfRldMX0VWRU5UX0RFRg0KK0JFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdnRTZXRGb2N1cywgRldMX0VWVEhBU0hfU2V0Rm9jdXMpDQorSUZXTF9XaWRnZXQqIG1fcFNldEZvY3VzOw0KK0VORF9GV0xfRVZFTlRfREVGDQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dEtpbGxGb2N1cywgRldMX0VWVEhBU0hfS2lsbEZvY3VzKQ0KK0lGV0xfV2lkZ2V0KiBtX3BLaWxsRm9jdXM7DQorRU5EX0ZXTF9FVkVOVF9ERUYNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0RHJhdywgRldMX0VWVEhBU0hfRHJhdykNCitDRlhfR3JhcGhpY3MqIG1fcEdyYXBoaWNzOw0KK0lGV0xfV2lkZ2V0KiBtX3BXaWRnZXQ7DQorRU5EX0ZXTF9FVkVOVF9ERUYNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0Q2xpY2ssIEZXTF9FVlRIQVNIX0NsaWNrKQ0KK0VORF9GV0xfRVZFTlRfREVGDQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dFNjcm9sbCwgRldMX0VWVEhBU0hfU2Nyb2xsKQ0KK0ZYX0RXT1JEIG1faVNjcm9sbENvZGU7DQorRlhfRkxPQVQgbV9mUG9zOw0KK0ZYX0JPT0wqIG1fcFJldDsNCitFTkRfRldMX0VWRU5UX0RFRg0KK0JFR0lOX0ZXTF9FVkVOVF9ERUYoQ0ZXTF9FdnRDbG9zZSwgRldMX0VWVEhBU0hfQ2xvc2UpDQorRU5EX0ZXTF9FVkVOVF9ERUYNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0Q29udGV4dE1lbnUsIEZXTF9FVlRIQVNIX0NvbnRleHRNZW51KQ0KK0ZYX0ZMT0FUIG1fZlBvc1g7DQorRlhfRkxPQVQgbV9mUG9zWTsNCitJRldMX1dpZGdldCogbV9wT3duZXI7DQorRU5EX0ZXTF9FVkVOVF9ERUYNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0TWVudUNvbW1hbmQsIEZXTF9FVlRIQVNIX01lbnVDb21tYW5kKQ0KK2ludDMyX3QgbV9pQ29tbWFuZDsNCit2b2lkKiBtX3BEYXRhOw0KK0VORF9GV0xfRVZFTlRfREVGDQorQkVHSU5fRldMX0VWRU5UX0RFRihDRldMX0V2dFNpemVDaGFuZ2VkLCBGV0xfRVZUSEFTSF9TaXplQ2hhbmdlZCkNCitJRldMX1dpZGdldCogbV9wV2lkZ2V0Ow0KK0NGWF9SZWN0RiBtX3J0T2xkOw0KK0NGWF9SZWN0RiBtX3J0TmV3Ow0KK0VORF9GV0xfTUVTU0FHRV9ERUYNCitCRUdJTl9GV0xfRVZFTlRfREVGKENGV0xfRXZ0SWRsZSwgRldMX0VWVEhBU0hfSWRsZSkNCitFTkRfRldMX0VWRU5UX0RFRg0KK3R5cGVkZWYgZW51bSB7DQorICBGV0xfRVZFTlRfTU9VU0VfTUFTSyA9IDEgPDwgMCwNCisgIEZXTF9FVkVOVF9NT1VTRVdIRUVMX01BU0sgPSAxIDw8IDEsDQorICBGV0xfRVZFTlRfS0VZX01BU0sgPSAxIDw8IDIsDQorICBGV0xfRVZFTlRfRk9DVVNDSEFOR0VEX01BU0sgPSAxIDw8IDMsDQorICBGV0xfRVZFTlRfRFJBV19NQVNLID0gMSA8PCA0LA0KKyAgRldMX0VWRU5UX0NMT1NFX01BU0sgPSAxIDw8IDUsDQorICBGV0xfRVZFTlRfU0laRUNIQU5HRURfTUFTSyA9IDEgPDwgNiwNCisgIEZXTF9FVkVOVF9JRExFX01BU0sgPSAxIDw8IDcsDQorICBGV0xfRVZFTlRfQ09OVFJPTF9NQVNLID0gMSA8PCA4LA0KKyAgRldMX0VWRU5UX0FMTF9NQVNLID0gMHhGRg0KK30gRldMRXZlbnRNYXNrOw0KK2NsYXNzIElGV0xfTm90ZURyaXZlciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGV0xfTm90ZURyaXZlcigpIHt9DQorICB2aXJ0dWFsIEZYX0JPT0wgU2VuZE5vdGUoQ0ZXTF9Ob3RlKiBwTm90ZSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFBvc3RNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBSZWdpc3RlckV2ZW50VGFyZ2V0KA0KKyAgICAgIElGV0xfV2lkZ2V0KiBwTGlzdGVuZXIsDQorICAgICAgSUZXTF9XaWRnZXQqIHBFdmVudFNvdXJjZSA9IE5VTEwsDQorICAgICAgRlhfRFdPUkQgZHdGaWx0ZXIgPSBGV0xfRVZFTlRfQUxMX01BU0spID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBVbnJlZ2lzdGVyRXZlbnRUYXJnZXQoSUZXTF9XaWRnZXQqIHBMaXN0ZW5lcikgPSAwOw0KKyAgdmlydHVhbCB2b2lkIENsZWFyRXZlbnRUYXJnZXRzKEZYX0JPT0wgYlJlbW92ZUFsbCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFF1ZXVlTWF4U2l6ZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRRdWV1ZU1heFNpemUoY29uc3QgaW50MzJfdCBzaXplKSA9IDA7DQorICB2aXJ0dWFsIElGV0xfTm90ZVRocmVhZCogR2V0T3duZXJUaHJlYWQoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgUHVzaE5vdGVMb29wKElGV0xfTm90ZUxvb3AqIHBOb3RlTG9vcCkgPSAwOw0KKyAgdmlydHVhbCBJRldMX05vdGVMb29wKiBQb3BOb3RlTG9vcCgpID0gMDsNCisgIHZpcnR1YWwgSUZXTF9XaWRnZXQqIEdldEZvY3VzKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldEZvY3VzKElGV0xfV2lkZ2V0KiBwRm9jdXMsIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0R3JhYihJRldMX1dpZGdldCogcEdyYWIsIEZYX0JPT0wgYlNldCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIFJ1bigpID0gMDsNCit9Ow0KK0lGV0xfV2lkZ2V0KiBGV0xfR2V0Q3VycmVudFRocmVhZE1vZGFsV2lkZ2V0KElGV0xfTm90ZVRocmVhZCogcE5vdGVUaHJlYWQpOw0KK2NsYXNzIElGV0xfTm90ZUxvb3Agew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRldMX05vdGVMb29wKCkge30NCisgIHZpcnR1YWwgRlhfQk9PTCBQcmVQcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgSWRsZShpbnQzMl90IGNvdW50KSA9IDA7DQorfTsNCitjbGFzcyBJRldMX1Rvb2xUaXBUYXJnZXQgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRldMX1Rvb2xUaXBUYXJnZXQoKSB7fQ0KKyAgdmlydHVhbCBJRldMX1dpZGdldCogR2V0V2lkZ2V0KCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIElzU2hvd2VkKCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIERyYXdUb29sVGlwKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBUb29sVGlwKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgVXNlRGVmYXVsdFRoZW1lKCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldENhcHRpb24oQ0ZYX1dpZGVTdHJpbmcmIHdzQ2FwdGlvbikgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFRvb2xUaXBTaXplKENGWF9TaXplRiYgc3opID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRUb29sVGlwUG9zKENGWF9Qb2ludEYmIHB0KSB7IHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7IH0NCit9Ow0KK0ZXTF9FUlIgRldMX0FkZFRvb2xUaXBUYXJnZXQoSUZXTF9Ub29sVGlwVGFyZ2V0KiBwVGFyZ2V0KTsNCitGV0xfRVJSIEZXTF9SZW1vdmVUb29sVGlwVGFyZ2V0KElGV0xfVG9vbFRpcFRhcmdldCogcFRhcmdldCk7DQorRldMX0VSUiBGV0xfU2V0VG9vbFRpcEluaXRpYWxEZWxheShpbnQzMl90IGlEZWxheVRpbWUpOw0KK0ZXTF9FUlIgRldMX1NldFRvb2xUaXBBdXRvUG9wRGVsYXkoaW50MzJfdCBpRGVsYXlUaW1lKTsNCit0eXBlZGVmIEZYX0JPT0wgKCpGV0xNZXNzYWdlSG9va0NhbGxiYWNrKShDRldMX01lc3NhZ2UqIG1zZywgdm9pZCogaW5mbyk7DQorRldMX0VSUiBGV0xfU2V0SG9vayhJRldMX05vdGVEcml2ZXIqIGRyaXZlciwNCisgICAgICAgICAgICAgICAgICAgIEZXTE1lc3NhZ2VIb29rQ2FsbGJhY2sgY2FsbGJhY2ssDQorICAgICAgICAgICAgICAgICAgICB2b2lkKiBpbmZvKTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfcGFuZWwuaCBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF9wYW5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MTA1NWQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfcGFuZWwuaApAQCAtMCwwICsxLDQwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9QQU5FTF9IDQorI2RlZmluZSBfRldMX1BBTkVMX0gNCitjbGFzcyBJRldMX1dpZGdldDsNCitjbGFzcyBJRldMX0NvbnRlbnQ7DQorY2xhc3MgSUZXTF9QYW5lbDsNCitjbGFzcyBJRldMX0N1c3RvbVBhbmVsOw0KKyNkZWZpbmUgRldMX0NMQVNTX1BhbmVsIEwiRldMX1BhbmVsIg0KKyNkZWZpbmUgRldMX0NMQVNTSEFTSF9QYW5lbCA4ODE1NjcyOTINCisNCitjbGFzcyBJRldMX1BhbmVsIDogcHVibGljIElGV0xfV2lkZ2V0IHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGV0xfUGFuZWwqIENyZWF0ZShDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpOw0KKw0KKyAgSUZXTF9Db250ZW50KiBHZXRDb250ZW50KCk7DQorICBGV0xfRVJSIFNldENvbnRlbnQoSUZXTF9Db250ZW50KiBwQ29udGVudCk7DQorDQorIHByb3RlY3RlZDoNCisgIElGV0xfUGFuZWwoKTsNCit9Ow0KKw0KK2NsYXNzIElGV0xfQ3VzdG9tUGFuZWwgOiBwdWJsaWMgSUZXTF9XaWRnZXQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZXTF9DdXN0b21QYW5lbCogQ3JlYXRlKENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcik7DQorDQorICBJRldMX0NvbnRlbnQqIEdldENvbnRlbnQoKTsNCisgIEZXTF9FUlIgU2V0Q29udGVudChJRldMX0NvbnRlbnQqIHBDb250ZW50KTsNCisgIEZXTF9FUlIgU2V0UHJveHkoSUZXTF9Qcm94eSogcFByb3h5KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgSUZXTF9DdXN0b21QYW5lbCgpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3RhcmdldC5oIGIveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3RhcmdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YmU3NTEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfdGFyZ2V0LmgKQEAgLTAsMCArMSw1MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIEZXTF9UQVJHRVRfSF8NCisjZGVmaW5lIEZXTF9UQVJHRVRfSF8NCisNCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiDQorDQorLy8gRldMIGNvbnRhaW5zIHRocmVlIHBhcmFsbGVsIGluaGVyaXRhbmNlIGhpZXJhcmNoaWVzLCB3aGljaCByZWZlcmVuY2UgZWFjaA0KKy8vIG90aGVyIHZpYSBwb2ludGVycyBhcyBmb2xsb3dzOg0KKy8vDQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wSW1wbA0KKy8vICAgICAgKG5vbmVzdWNoKSAgICAgICAgICAgICAgSUZXTF9UYXJnZXQgLS0tLS0tLS0tLT4gQ0ZXTF9UYXJnZXRJbXANCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfA0KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBICAgICAgICAgICAgICAgICAgICAgICBBDQorLy8gICAgICAgICAgICAgICAgICAgbV9wSWZhY2UgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwNCisvLyAgICAgIENGV0xfV2lkZ2V0IC0tLS0tLS0tLS0+IElGV0xfV2lkZ2V0ICAgICAgICAgICAgIENGV0xfV2lkZ2V0SW1wDQorLy8gICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwNCisvLyAgICAgICAgICAgQSAgICAgICAgICAgICAgICAgICAgICAgQSAgICAgICAgICAgICAgICAgICAgICAgQQ0KKy8vICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8DQorLy8gICAgICBDRldMXy4uLiAgICAgICAgICAgICAgICBJRldMXy4uLiAgICAgICAgICAgICAgICBDRldMXy4uLkltcA0KKy8vDQorDQorY2xhc3MgQ0ZXTF9UYXJnZXRJbXA7DQorDQorY2xhc3MgSUZXTF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBJRldMX1RhcmdldCgpIDogbV9wSW1wbChudWxscHRyKSB7fQ0KKyAgdmlydHVhbCB+SUZXTF9UYXJnZXQoKTsNCisNCisgIC8vIFRoZXNlIGNhbGwgaW50byBlcXVpdmFsZW50IHBvbHltb3JwaGljIG1ldGhvZHMgb2YgbV9wSW1wbC4gVGhlcmUNCisgIC8vIHNob3VsZCBiZSBubyBuZWVkIHRvIG92ZXJyaWRlIHRoZXNlIGluIHN1YmNsYXNzZXMuDQorICBGV0xfRVJSIEdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Q7DQorICBGWF9EV09SRCBHZXRDbGFzc0lEKCkgY29uc3Q7DQorICBGWF9CT09MIElzSW5zdGFuY2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NsYXNzKSBjb25zdDsNCisgIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgRldMX0VSUiBGaW5hbGl6ZSgpOw0KKw0KKyAgQ0ZXTF9UYXJnZXRJbXAqIEdldEltcGwoKSBjb25zdCB7IHJldHVybiBtX3BJbXBsOyB9DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgU2V0SW1wbChDRldMX1RhcmdldEltcCogcEltcGwpIHsgbV9wSW1wbCA9IHBJbXBsOyB9DQorDQorIHByaXZhdGU6DQorICBDRldMX1RhcmdldEltcCogbV9wSW1wbDsNCit9Ow0KKw0KKyNlbmRpZiAgLy8gRldMX1RBUkdFVF9IXw0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF90aGVtZS5oIGIveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3RoZW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM3MDRjOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF90aGVtZS5oCkBAIC0wLDAgKzEsODIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX1RIRU1FX0gNCisjZGVmaW5lIF9GV0xfVEhFTUVfSA0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIENGV0xfVGhlbWVQYXJ0Ow0KK2NsYXNzIENGV0xfVGhlbWVCYWNrZ3JvdW5kOw0KK2NsYXNzIENGV0xfVGhlbWVUZXh0Ow0KK2NsYXNzIENGV0xfVGhlbWVFbGVtZW50Ow0KK2NsYXNzIElGV0xfVGhlbWVQcm92aWRlcjsNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9DWEJvcmRlciAxDQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfQ1lCb3JkZXIgMg0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX1Njcm9sbEJhcldpZHRoIDMNCisjZGVmaW5lIEZXTF9XR1RDQVBBQ0lUWV9FZGdlRmxhdCA0DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfRWRnZVJhaXNlZCA1DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfRWRnZVN1bmtlbiA2DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfRm9udCA3DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfRm9udFNpemUgOA0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX1RleHRDb2xvciA5DQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfVGV4dFNlbENvbG9yIDEwDQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTGluZUhlaWdodCAxMQ0KKyNkZWZpbmUgRldMX1dHVENBUEFDSVRZX1VJTWFyZ2luIDEyDQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfU3BhY2VBYm92ZUJlbG93IDEzDQorI2RlZmluZSBGV0xfV0dUQ0FQQUNJVFlfTUFYIDY1NTM1DQorY2xhc3MgQ0ZXTF9UaGVtZVBhcnQgew0KKyBwdWJsaWM6DQorICBDRldMX1RoZW1lUGFydCgpDQorICAgICAgOiBtX3BXaWRnZXQoTlVMTCksIG1faVBhcnQoMCksIG1fZHdTdGF0ZXMoMCksIG1fZHdEYXRhKDApLCBtX3BEYXRhKE5VTEwpIHsNCisgICAgbV9ydFBhcnQuUmVzZXQoKTsNCisgICAgbV9tYXRyaXguU2V0SWRlbnRpdHkoKTsNCisgIH0NCisgIENGWF9NYXRyaXggbV9tYXRyaXg7DQorICBDRlhfUmVjdEYgbV9ydFBhcnQ7DQorICBJRldMX1dpZGdldCogbV9wV2lkZ2V0Ow0KKyAgaW50MzJfdCBtX2lQYXJ0Ow0KKyAgRlhfRFdPUkQgbV9kd1N0YXRlczsNCisgIEZYX0RXT1JEIG1fZHdEYXRhOw0KKyAgdm9pZCogbV9wRGF0YTsNCit9Ow0KK2NsYXNzIENGV0xfVGhlbWVCYWNrZ3JvdW5kIDogcHVibGljIENGV0xfVGhlbWVQYXJ0IHsNCisgcHVibGljOg0KKyAgQ0ZXTF9UaGVtZUJhY2tncm91bmQoKSA6IG1fcEdyYXBoaWNzKE5VTEwpLCBtX3BJbWFnZShOVUxMKSwgbV9wUGF0aChOVUxMKSB7fQ0KKyAgQ0ZYX0dyYXBoaWNzKiBtX3BHcmFwaGljczsNCisgIENGWF9ESUJpdG1hcCogbV9wSW1hZ2U7DQorICBDRlhfUGF0aCogbV9wUGF0aDsNCit9Ow0KK2NsYXNzIENGV0xfVGhlbWVUZXh0IDogcHVibGljIENGV0xfVGhlbWVQYXJ0IHsNCisgcHVibGljOg0KKyAgQ0ZXTF9UaGVtZVRleHQoKSA6IG1fcEdyYXBoaWNzKE5VTEwpIHt9DQorICBDRlhfV2lkZVN0cmluZyBtX3dzVGV4dDsNCisgIEZYX0RXT1JEIG1fZHdUVE9TdHlsZXM7DQorICBpbnQzMl90IG1faVRUT0FsaWduOw0KKyAgQ0ZYX0dyYXBoaWNzKiBtX3BHcmFwaGljczsNCit9Ow0KK2NsYXNzIElGV0xfVGhlbWVQcm92aWRlciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGV0xfVGhlbWVQcm92aWRlcigpIHt9DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNWYWxpZFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRUaGVtZUlEKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0RXT1JEIFNldFRoZW1lSUQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdUaGVtZUlELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoaWxkcmVuID0gVFJVRSkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFRoZW1lTWF0cml4KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBDRlhfTWF0cml4JiBtYXRyaXgpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRUaGVtZU1hdHJpeChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcykgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdUZXh0KENGV0xfVGhlbWVUZXh0KiBwUGFyYW1zKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQqIEdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0NhcGFjaXR5KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNDdXN0b21pemVkTGF5b3V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0UGFydFJlY3QoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydFBhcnQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0luUGFydChDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIENhbGNUZXh0UmVjdChDRldMX1RoZW1lVGV4dCogcFBhcmFtcywgQ0ZYX1JlY3RGJiByZWN0KSA9IDA7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfdGhyZWFkLmggYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfdGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQxZmQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF90aHJlYWQuaApAQCAtMCwwICsxLDUxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgRldMX1RIUkVBRF9IXw0KKyNkZWZpbmUgRldMX1RIUkVBRF9IXw0KKw0KKy8vIFRoZSBGV0wgdGhyZWFkL2FwcCBjb2RlIGNvbnRhaW5zIHRocmVlIHBhcmFsbGVsIGluaGVyaXRhbmNlIGhpZXJhcmNoaWVzLA0KKy8vIHdoaWNoIHJlZmVyZW5jZSBlYWNoIG90aGVyIHZpYSBwb2ludGVycyBhcyBmb2xsb3dzOg0KKy8vDQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wSW1wbA0KKy8vICAgICAgKG5vbmVzdWNoKSAgICAgICAgICAgICAgSUZXTF9UaHJlYWQgLS0tLS0tLS0tLT4gQ0ZXTF9UaHJlYWRJbXANCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIDwtLS0tLS0tLS0tICAgICAgfA0KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBICAgICAgIG1fcElmYWNlICAgICAgICBBDQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwNCisvLyAgICAgIChub25lc3VjaCkgICAgICAgICAgICAgIElGV0xfTm90ZVRocmVhZCAgICAgICAgIENGV0xfTm90ZVRocmVhZEltcA0KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8DQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgICAgICAgICAgICAgICAgICAgICAgIEENCisvLyAgICAgICAgICAgICAgICBtX3BJZmFjZSAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfA0KKy8vICAgICAgQ0ZXTF9BcHAgLS0tLS0tLS0tLS0tLS0+IElGV0xfQXBwICAgICAgICAgICAgICAgIENGV0xfQXBwSW1wDQorLy8NCisNCitjbGFzcyBDRldMX1RocmVhZEltcDsNCitjbGFzcyBJRldMX05vdGVEcml2ZXI7DQorDQordHlwZWRlZiBzdHJ1Y3QgX0ZXTF9IVEhSRUFEIHsgdm9pZCogcERhdGE7IH0gKiBGV0xfSFRIUkVBRDsNCisNCitjbGFzcyBJRldMX1RocmVhZCB7DQorIHB1YmxpYzoNCisgIC8vIFRoZXNlIGNhbGwgaW50byBwb2x5bW9ycGhpYyBtZXRob2RzIGluIHRoZSBpbXBsOyBubyBuZWVkIHRvIG92ZXJyaWRlLg0KKyAgdm9pZCBSZWxlYXNlKCk7DQorICBGV0xfRVJSIFJ1bihGV0xfSFRIUkVBRCBoVGhyZWFkKTsNCisNCisgIENGV0xfVGhyZWFkSW1wKiBHZXRJbXBsKCkgY29uc3QgeyByZXR1cm4gbV9wSW1wbDsgfQ0KKyAgdm9pZCBTZXRJbXBsKENGV0xfVGhyZWFkSW1wKiBwSW1wbCkgeyBtX3BJbXBsID0gcEltcGw7IH0NCisNCisgcHJvdGVjdGVkOg0KKyAgdmlydHVhbCB+SUZXTF9UaHJlYWQoKSB7fQ0KKw0KKyBwcml2YXRlOg0KKyAgQ0ZXTF9UaHJlYWRJbXAqIG1fcEltcGw7DQorfTsNCisNCitjbGFzcyBJRldMX05vdGVUaHJlYWQgOiBwdWJsaWMgSUZXTF9UaHJlYWQgew0KKyBwdWJsaWM6DQorICBJRldMX05vdGVEcml2ZXIqIEdldE5vdGVEcml2ZXIoKTsNCit9Ow0KKw0KKyNlbmRpZiAgLy8gRldMX1RIUkVBRF9IXw0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF90aW1lci5oIGIveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3RpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkNGRhNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF90aW1lci5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBYRkFfSU5DTFVERV9GV0xfQ09SRV9GV0xfVElNRVJfSF8NCisjZGVmaW5lIFhGQV9JTkNMVURFX0ZXTF9DT1JFX0ZXTF9USU1FUl9IXw0KKw0KKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmgiDQorDQordHlwZWRlZiBzdHJ1Y3QgX0ZXTF9IVElNRVIgeyB2b2lkKiBwRGF0YTsgfSAqIEZXTF9IVElNRVI7DQorDQorY2xhc3MgSUZXTF9UaW1lciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGV0xfVGltZXIoKSB7fQ0KKyAgdmlydHVhbCBpbnQzMl90IFJ1bihGV0xfSFRJTUVSIGhUaW1lcikgPSAwOw0KK307DQorRldMX0hUSU1FUiBGV0xfU3RhcnRUaW1lcihJRldMX1RpbWVyKiBwVGltZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0VsYXBzZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkltbWVkaWF0ZWx5ID0gVFJVRSk7DQoraW50MzJfdCBGV0xfU3RvcFRpbWVyKEZXTF9IVElNRVIgaFRpbWVyKTsNCisNCisjZW5kaWYgIC8vIFhGQV9JTkNMVURFX0ZXTF9DT1JFX0ZXTF9USU1FUl9IXw0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF93aWRnZXQuaCBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF93aWRnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzM4YmU5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3dpZGdldC5oCkBAIC0wLDAgKzEsMTIzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9XSURHRVRfSA0KKyNkZWZpbmUgX0ZXTF9XSURHRVRfSA0KK2NsYXNzIElGV0xfVGFyZ2V0Ow0KK2NsYXNzIElGV0xfVGhlbWVQcm92aWRlcjsNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgSUZXTF9EYXRhUHJvdmlkZXI7DQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgSUZXTF9XaWRnZXREZWxlZ2F0ZTsNCitjbGFzcyBJRldMX0N1c3RvbTsNCitjbGFzcyBJRldMX1Byb3h5Ow0KK2NsYXNzIElGV0xfRm9ybTsNCisNCitjbGFzcyBJRldMX0RhdGFQcm92aWRlciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGV0xfRGF0YVByb3ZpZGVyKCkge30NCisgIHZpcnR1YWwgRldMX0VSUiBHZXRDYXB0aW9uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQ2FwdGlvbikgPSAwOw0KK307DQorY2xhc3MgSUZXTF9XaWRnZXQgOiBwdWJsaWMgSUZXTF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBGV0xfRVJSIEdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCisgIEZXTF9FUlIgR2V0R2xvYmFsUmVjdChDRlhfUmVjdEYmIHJlY3QpOw0KKyAgRldMX0VSUiBTZXRXaWRnZXRSZWN0KGNvbnN0IENGWF9SZWN0RiYgcmVjdCk7DQorICBGV0xfRVJSIEdldENsaWVudFJlY3QoQ0ZYX1JlY3RGJiByZWN0KTsNCisgIElGV0xfV2lkZ2V0KiBHZXRQYXJlbnQoKTsNCisgIEZXTF9FUlIgU2V0UGFyZW50KElGV0xfV2lkZ2V0KiBwUGFyZW50KTsNCisgIElGV0xfV2lkZ2V0KiBHZXRPd25lcigpOw0KKyAgRldMX0VSUiBTZXRPd25lcihJRldMX1dpZGdldCogcE93bmVyKTsNCisgIElGV0xfV2lkZ2V0KiBHZXRPdXRlcigpOw0KKyAgRlhfRFdPUkQgR2V0U3R5bGVzKCk7DQorICBGV0xfRVJSIE1vZGlmeVN0eWxlcyhGWF9EV09SRCBkd1N0eWxlc0FkZGVkLCBGWF9EV09SRCBkd1N0eWxlc1JlbW92ZWQpOw0KKyAgRlhfRFdPUkQgR2V0U3R5bGVzRXgoKTsNCisgIEZXTF9FUlIgTW9kaWZ5U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLCBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQorICBGWF9EV09SRCBHZXRTdGF0ZXMoKTsNCisgIEZXTF9FUlIgU2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgIEZXTF9FUlIgU2V0UHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2spOw0KKyAgdm9pZCogR2V0UHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkKTsNCisgIEZXTF9FUlIgVXBkYXRlKCk7DQorICBGV0xfRVJSIExvY2tVcGRhdGUoKTsNCisgIEZXTF9FUlIgVW5sb2NrVXBkYXRlKCk7DQorICBGWF9EV09SRCBIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICBGV0xfRVJSIFRyYW5zZm9ybVRvKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9GTE9BVCYgZngsIEZYX0ZMT0FUJiBmeSk7DQorICBGV0xfRVJSIFRyYW5zZm9ybVRvKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBDRlhfUmVjdEYmIHJ0KTsNCisgIEZXTF9FUlIgR2V0TWF0cml4KENGWF9NYXRyaXgmIG1hdHJpeCwgRlhfQk9PTCBiR2xvYmFsID0gRkFMU0UpOw0KKyAgRldMX0VSUiBTZXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KTsNCisgIEZXTF9FUlIgRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgSUZXTF9UaGVtZVByb3ZpZGVyKiBHZXRUaGVtZVByb3ZpZGVyKCk7DQorICBGV0xfRVJSIFNldFRoZW1lUHJvdmlkZXIoSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWVQcm92aWRlcik7DQorICBGV0xfRVJSIFNldERhdGFQcm92aWRlcihJRldMX0RhdGFQcm92aWRlciogcERhdGFQcm92aWRlcik7DQorICBJRldMX1dpZGdldERlbGVnYXRlKiBTZXREZWxlZ2F0ZShJRldMX1dpZGdldERlbGVnYXRlKiBwRGVsZWdhdGUpOw0KKyAgSUZXTF9Ob3RlVGhyZWFkKiBHZXRPd25lclRocmVhZCgpIGNvbnN0Ow0KKyAgQ0ZYX1NpemVGIEdldE9mZnNldEZyb21QYXJlbnQoSUZXTF9XaWRnZXQqIHBQYXJlbnQpOw0KK307DQorY2xhc3MgSUZXTF9XaWRnZXREZWxlZ2F0ZSB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGV0xfV2lkZ2V0RGVsZWdhdGUoKSB7fQ0KKyAgdmlydHVhbCBpbnQzMl90IE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIE9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkgPSAwOw0KKyAgdmlydHVhbCBGV0xfRVJSIE9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpID0gMDsNCit9Ow0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyB7DQorIHB1YmxpYzoNCisgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcygpIHsNCisgICAgbV9jdG1PblBhcmVudC5TZXRJZGVudGl0eSgpOw0KKyAgICBtX3J0V2lkZ2V0LlNldCgwLCAwLCAwLCAwKTsNCisgICAgbV9kd1N0eWxlcyA9IEZXTF9XR1RTVFlMRV9DaGlsZDsNCisgICAgbV9kd1N0eWxlRXhlcyA9IDA7DQorICAgIG1fZHdTdGF0ZXMgPSAwOw0KKyAgICBtX3BUaGVtZVByb3ZpZGVyID0gTlVMTDsNCisgICAgbV9wRGF0YVByb3ZpZGVyID0gTlVMTDsNCisgICAgbV9wUGFyZW50ID0gTlVMTDsNCisgICAgbV9wT3duZXIgPSBOVUxMOw0KKyAgfQ0KKyAgQ0ZYX01hdHJpeCBtX2N0bU9uUGFyZW50Ow0KKyAgQ0ZYX1JlY3RGIG1fcnRXaWRnZXQ7DQorICBGWF9EV09SRCBtX2R3U3R5bGVzOw0KKyAgRlhfRFdPUkQgbV9kd1N0eWxlRXhlczsNCisgIEZYX0RXT1JEIG1fZHdTdGF0ZXM7DQorICBJRldMX1RoZW1lUHJvdmlkZXIqIG1fcFRoZW1lUHJvdmlkZXI7DQorICBJRldMX0RhdGFQcm92aWRlciogbV9wRGF0YVByb3ZpZGVyOw0KKyAgSUZXTF9XaWRnZXQqIG1fcFBhcmVudDsNCisgIElGV0xfV2lkZ2V0KiBtX3BPd25lcjsNCit9Ow0KK2NsYXNzIElGV0xfQ3VzdG9tIDogcHVibGljIElGV0xfV2lkZ2V0IHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGV0xfQ3VzdG9tKiBDcmVhdGUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcik7DQorDQorICBGV0xfRVJSIFNldFByb3h5KElGV0xfUHJveHkqIHBQcm94eSk7DQorDQorIHByb3RlY3RlZDoNCisgIElGV0xfQ3VzdG9tKCk7DQorfTsNCitjbGFzcyBJRldMX1Byb3h5IHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZXTF9Qcm94eSgpIHt9DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBVcGRhdGUoKSA9IDA7DQorfTsNCisjZGVmaW5lIEZXTF9BQ0NFTF9Db250cm9sICgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX0FDQ0VMX0FsdCAoMUwgPDwgMSkNCisjZGVmaW5lIEZXTF9BQ0NFTF9TaGlmdCAoMUwgPDwgMikNCisjZGVmaW5lIEZXTF9BQ0NFTF9WaXJ0S2V5ICgxTCA8PCAzKQ0KK3R5cGVkZWYgc3RydWN0IF9GV0xfQUNDRUwgew0KKyAgRlhfRFdPUkQgZHdLZXk7DQorICBGWF9EV09SRCBkd0NtZDsNCit9IEZXTF9BQ0NFTDsNCit0eXBlZGVmIENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9EV09SRCwgRlhfRFdPUkQ+IENGWF9NYXBBY2NlbGVyYXRvcnM7DQorRldMX0VSUiBGV0xfQWNjZWxlcmF0b3JfU2V0QXBwKENGWF9NYXBBY2NlbGVyYXRvcnMqIHBNYXBBY2NlbCk7DQorRldMX0VSUiBGV0xfQWNjZWxlcmF0b3JfU2V0VGhyZWFkKENGWF9NYXBBY2NlbGVyYXRvcnMqIHBNYXBBY2NlbCk7DQorRldMX0VSUiBGV0xfQWNjZWxlcmF0b3JfU2V0Rm9ybShJRldMX0Zvcm0qIHBGcm9tLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hcEFjY2VsZXJhdG9ycyogcE1hcEFjY2VsKTsNCitGV0xfRVJSIEZXTF9FbmFiZWxXaWRnZXQoSUZXTF9XaWRnZXQqIHdpZGdldCwgRlhfQk9PTCBiRW5hYmxlKTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfd2lkZ2V0ZGVmLmggYi94ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfd2lkZ2V0ZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJiNjNiNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF93aWRnZXRkZWYuaApAQCAtMCwwICsxLDI0NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfV0lER0VUREVGX0gNCisjZGVmaW5lIF9GV0xfV0lER0VUREVGX0gNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9PdmVyTGFwcGVyICgwTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX1BvcHVwICgxTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX0NoaWxkICgyTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX0JvcmRlciAoMUwgPDwgMikNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9DYXB0aW9uICgxTCA8PCAzKQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX05hcnJvd0NhcHRpb24gKDFMIDw8IDQpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfSWNvbiAoMUwgPDwgNSkNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9NaW5pbWl6ZUJveCAoMUwgPDwgNikNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9NYXhpbWl6ZUJveCAoMUwgPDwgNykNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9DbG9zZUJveCAoMUwgPDwgOCkNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9IU2Nyb2xsICgxTCA8PCA5KQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX1ZTY3JvbGwgKDFMIDw8IDExKQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX0xlZnRTY3JvbGxiYXIgKDFMIDw8IDEyKQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX0xlZnRBbGlnbm1lbnQgKDBMIDw8IDEzKQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX0NlbnRlckFsaWdubWVudCAoMUwgPDwgMTMpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfUmlnaHRBbGlnbm1lbnQgKDJMIDw8IDEzKQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX1RvcEFsaWdubWVudCAoMEwgPDwgMTUpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfVkNlbnRlckFsaWdubWVudCAoMUwgPDwgMTUpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfQm90dG9tQWxpZ25tZW50ICgyTCA8PCAxNSkNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9SVExSZWFkaW5nICgxTCA8PCAxNykNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9SVExMYXlvdXQgKDFMIDw8IDE4KQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX0VkZ2VOb25lICgwTCA8PCAxOSkNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9FZGdlRmxhdCAoMUwgPDwgMTkpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfRWRnZVJhaXNlZCAoMkwgPDwgMTkpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfRWRnZVN1bmtlbiAoM0wgPDwgMTkpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfRWRnZU1hc2sgKDNMIDw8IDE5KQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX1NoYWRvdyAoM0wgPDwgMjEpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfR3JvdXAgKDFMIDw8IDIyKQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX1RhYlN0b3AgKDFMIDw8IDIzKQ0KKyNkZWZpbmUgRldMX1dHVFNUWUxFX09mZnNjcmVlbiAoMUwgPDwgMjQpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfRHJhZ0FjY2VwdEZpbGVzICgxTCA8PCAyNSkNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9Ub3BNb3N0ICgxTCA8PCAyNikNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9UcmFuc1BhcmVudCAoMUwgPDwgMjcpDQorI2RlZmluZSBGV0xfV0dUU1RZTEVfTm9CYWNrZ3JvdW5kICgxTCA8PCAyOCkNCisjZGVmaW5lIEZXTF9XR1RTVFlMRV9XaW5kb3dUeXBlTWFzayAoM0wgPDwgMCkNCisjZGVmaW5lIEZXTF9XR1RTVEFURV9SZXN0b3JlZCAoMEwgPDwgMCkNCisjZGVmaW5lIEZXTF9XR1RTVEFURV9NaW5pbWl6ZWQgKDFMIDw8IDApDQorI2RlZmluZSBGV0xfV0dUU1RBVEVfTWF4aW1pemVkICgyTCA8PCAwKQ0KKyNkZWZpbmUgRldMX1dHVFNUQVRFX0Rpc2FibGVkICgxTCA8PCAyKQ0KKyNkZWZpbmUgRldMX1dHVFNUQVRFX0RlYWN0aXZhdGVkICgxTCA8PCAzKQ0KKyNkZWZpbmUgRldMX1dHVFNUQVRFX0ZvY3VzZWQgKDFMIDw8IDQpDQorI2RlZmluZSBGV0xfV0dUU1RBVEVfSW52aXNpYmxlICgxTCA8PCA1KQ0KKyNkZWZpbmUgRldMX1dHVFNUQVRFX01BWCAoNikNCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX1Vua25vd24gMA0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfQ2xpZW50IDENCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX0xlZnQgMg0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfVG9wIDMNCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX1JpZ2h0IDQNCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX0JvdHRvbSA1DQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9MZWZ0VG9wIDYNCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX1JpZ2h0VG9wIDcNCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX0xlZnRCb3R0b20gOA0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfUmlnaHRCb3R0b20gOQ0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfSWNvbiAxMA0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfVGl0bGViYXIgMTENCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX01pbkJveCAxMg0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfTWF4Qm94IDEzDQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9DbG9zZUJveCAxNA0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfSFNjcm9sbEJhciAxNQ0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfVlNjcm9sbEJhciAxNg0KKyNkZWZpbmUgRldMX1dHVEhJVFRFU1RfQm9yZGVyIDE3DQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9FZGdlIDE4DQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9FZGl0IDE5DQorI2RlZmluZSBGV0xfV0dUSElUVEVTVF9IeXBlckxpbmsgMjANCisjZGVmaW5lIEZXTF9XR1RISVRURVNUX01BWCAyMQ0KKyNkZWZpbmUgRldMX1ZLRVlfTEJ1dHRvbiAweDAxDQorI2RlZmluZSBGV0xfVktFWV9SQnV0dG9uIDB4MDINCisjZGVmaW5lIEZXTF9WS0VZX01CdXR0b24gMHgwNA0KKyNkZWZpbmUgRldMX1ZLRVlfQmFjayAweDA4DQorI2RlZmluZSBGV0xfVktFWV9UYWIgMHgwOQ0KKyNkZWZpbmUgRldMX1ZLRVlfQ2xlYXIgMHgwQw0KKyNkZWZpbmUgRldMX1ZLRVlfUmV0dXJuIDB4MEQNCisjZGVmaW5lIEZXTF9WS0VZX1NoaWZ0IDB4MTANCisjZGVmaW5lIEZXTF9WS0VZX0NvbnRyb2wgMHgxMQ0KKyNkZWZpbmUgRldMX1ZLRVlfTWVudSAweDEyDQorI2RlZmluZSBGV0xfVktFWV9QYXVzZSAweDEzDQorI2RlZmluZSBGV0xfVktFWV9DYXBpdGFsIDB4MTQNCisjZGVmaW5lIEZXTF9WS0VZX0thbmEgMHgxNQ0KKyNkZWZpbmUgRldMX1ZLRVlfSGFuZ3VsIDB4MTUNCisjZGVmaW5lIEZXTF9WS0VZX0p1bmphIDB4MTcNCisjZGVmaW5lIEZXTF9WS0VZX0ZpbmFsIDB4MTgNCisjZGVmaW5lIEZXTF9WS0VZX0hhbmphIDB4MTkNCisjZGVmaW5lIEZXTF9WS0VZX0thbmppIDB4MTkNCisjZGVmaW5lIEZXTF9WS0VZX0VzY2FwZSAweDFCDQorI2RlZmluZSBGV0xfVktFWV9Db252ZXJ0IDB4MUMNCisjZGVmaW5lIEZXTF9WS0VZX05vbkNvbnZlcnQgMHgxRA0KKyNkZWZpbmUgRldMX1ZLRVlfQWNjZXB0IDB4MUUNCisjZGVmaW5lIEZXTF9WS0VZX01vZGVDaGFuZ2UgMHgxRg0KKyNkZWZpbmUgRldMX1ZLRVlfU3BhY2UgMHgyMA0KKyNkZWZpbmUgRldMX1ZLRVlfUHJpb3IgMHgyMQ0KKyNkZWZpbmUgRldMX1ZLRVlfTmV4dCAweDIyDQorI2RlZmluZSBGV0xfVktFWV9FbmQgMHgyMw0KKyNkZWZpbmUgRldMX1ZLRVlfSG9tZSAweDI0DQorI2RlZmluZSBGV0xfVktFWV9MZWZ0IDB4MjUNCisjZGVmaW5lIEZXTF9WS0VZX1VwIDB4MjYNCisjZGVmaW5lIEZXTF9WS0VZX1JpZ2h0IDB4MjcNCisjZGVmaW5lIEZXTF9WS0VZX0Rvd24gMHgyOA0KKyNkZWZpbmUgRldMX1ZLRVlfU2VsZWN0IDB4MjkNCisjZGVmaW5lIEZXTF9WS0VZX1ByaW50IDB4MkENCisjZGVmaW5lIEZXTF9WS0VZX0V4ZWN1dGUgMHgyQg0KKyNkZWZpbmUgRldMX1ZLRVlfU25hcHNob3QgMHgyQw0KKyNkZWZpbmUgRldMX1ZLRVlfSW5zZXJ0IDB4MkQNCisjZGVmaW5lIEZXTF9WS0VZX0RlbGV0ZSAweDJFDQorI2RlZmluZSBGV0xfVktFWV9IZWxwIDB4MkYNCisjZGVmaW5lIEZXTF9WS0VZXzAgMHgzMA0KKyNkZWZpbmUgRldMX1ZLRVlfMSAweDMxDQorI2RlZmluZSBGV0xfVktFWV8yIDB4MzINCisjZGVmaW5lIEZXTF9WS0VZXzMgMHgzMw0KKyNkZWZpbmUgRldMX1ZLRVlfNCAweDM0DQorI2RlZmluZSBGV0xfVktFWV81IDB4MzUNCisjZGVmaW5lIEZXTF9WS0VZXzYgMHgzNg0KKyNkZWZpbmUgRldMX1ZLRVlfNyAweDM3DQorI2RlZmluZSBGV0xfVktFWV84IDB4MzgNCisjZGVmaW5lIEZXTF9WS0VZXzkgMHgzOQ0KKyNkZWZpbmUgRldMX1ZLRVlfQSAweDQxDQorI2RlZmluZSBGV0xfVktFWV9CIDB4NDINCisjZGVmaW5lIEZXTF9WS0VZX0MgMHg0Mw0KKyNkZWZpbmUgRldMX1ZLRVlfRCAweDQ0DQorI2RlZmluZSBGV0xfVktFWV9FIDB4NDUNCisjZGVmaW5lIEZXTF9WS0VZX0YgMHg0Ng0KKyNkZWZpbmUgRldMX1ZLRVlfRyAweDQ3DQorI2RlZmluZSBGV0xfVktFWV9IIDB4NDgNCisjZGVmaW5lIEZXTF9WS0VZX0kgMHg0OQ0KKyNkZWZpbmUgRldMX1ZLRVlfSiAweDRBDQorI2RlZmluZSBGV0xfVktFWV9LIDB4NEINCisjZGVmaW5lIEZXTF9WS0VZX0wgMHg0Qw0KKyNkZWZpbmUgRldMX1ZLRVlfTSAweDREDQorI2RlZmluZSBGV0xfVktFWV9OIDB4NEUNCisjZGVmaW5lIEZXTF9WS0VZX08gMHg0Rg0KKyNkZWZpbmUgRldMX1ZLRVlfUCAweDUwDQorI2RlZmluZSBGV0xfVktFWV9RIDB4NTENCisjZGVmaW5lIEZXTF9WS0VZX1IgMHg1Mg0KKyNkZWZpbmUgRldMX1ZLRVlfUyAweDUzDQorI2RlZmluZSBGV0xfVktFWV9UIDB4NTQNCisjZGVmaW5lIEZXTF9WS0VZX1UgMHg1NQ0KKyNkZWZpbmUgRldMX1ZLRVlfViAweDU2DQorI2RlZmluZSBGV0xfVktFWV9XIDB4NTcNCisjZGVmaW5lIEZXTF9WS0VZX1ggMHg1OA0KKyNkZWZpbmUgRldMX1ZLRVlfWSAweDU5DQorI2RlZmluZSBGV0xfVktFWV9aIDB4NUENCisjZGVmaW5lIEZXTF9WS0VZX0xXaW4gMHg1Qg0KKyNkZWZpbmUgRldMX1ZLRVlfQ29tbWFuZCAweDVCDQorI2RlZmluZSBGV0xfVktFWV9SV2luIDB4NUMNCisjZGVmaW5lIEZXTF9WS0VZX0FwcHMgMHg1RA0KKyNkZWZpbmUgRldMX1ZLRVlfU2xlZXAgMHg1Rg0KKyNkZWZpbmUgRldMX1ZLRVlfTnVtUGFkMCAweDYwDQorI2RlZmluZSBGV0xfVktFWV9OdW1QYWQxIDB4NjENCisjZGVmaW5lIEZXTF9WS0VZX051bVBhZDIgMHg2Mg0KKyNkZWZpbmUgRldMX1ZLRVlfTnVtUGFkMyAweDYzDQorI2RlZmluZSBGV0xfVktFWV9OdW1QYWQ0IDB4NjQNCisjZGVmaW5lIEZXTF9WS0VZX051bVBhZDUgMHg2NQ0KKyNkZWZpbmUgRldMX1ZLRVlfTnVtUGFkNiAweDY2DQorI2RlZmluZSBGV0xfVktFWV9OdW1QYWQ3IDB4NjcNCisjZGVmaW5lIEZXTF9WS0VZX051bVBhZDggMHg2OA0KKyNkZWZpbmUgRldMX1ZLRVlfTnVtUGFkOSAweDY5DQorI2RlZmluZSBGV0xfVktFWV9NdWx0aXBseSAweDZBDQorI2RlZmluZSBGV0xfVktFWV9BZGQgMHg2Qg0KKyNkZWZpbmUgRldMX1ZLRVlfU2VwYXJhdG9yIDB4NkMNCisjZGVmaW5lIEZXTF9WS0VZX1N1YnRyYWN0IDB4NkQNCisjZGVmaW5lIEZXTF9WS0VZX0RlY2ltYWwgMHg2RQ0KKyNkZWZpbmUgRldMX1ZLRVlfRGl2aWRlIDB4NkYNCisjZGVmaW5lIEZXTF9WS0VZX0YxIDB4NzANCisjZGVmaW5lIEZXTF9WS0VZX0YyIDB4NzENCisjZGVmaW5lIEZXTF9WS0VZX0YzIDB4NzINCisjZGVmaW5lIEZXTF9WS0VZX0Y0IDB4NzMNCisjZGVmaW5lIEZXTF9WS0VZX0Y1IDB4NzQNCisjZGVmaW5lIEZXTF9WS0VZX0Y2IDB4NzUNCisjZGVmaW5lIEZXTF9WS0VZX0Y3IDB4NzYNCisjZGVmaW5lIEZXTF9WS0VZX0Y4IDB4NzcNCisjZGVmaW5lIEZXTF9WS0VZX0Y5IDB4NzgNCisjZGVmaW5lIEZXTF9WS0VZX0YxMCAweDc5DQorI2RlZmluZSBGV0xfVktFWV9GMTEgMHg3QQ0KKyNkZWZpbmUgRldMX1ZLRVlfRjEyIDB4N0INCisjZGVmaW5lIEZXTF9WS0VZX0YxMyAweDdDDQorI2RlZmluZSBGV0xfVktFWV9GMTQgMHg3RA0KKyNkZWZpbmUgRldMX1ZLRVlfRjE1IDB4N0UNCisjZGVmaW5lIEZXTF9WS0VZX0YxNiAweDdGDQorI2RlZmluZSBGV0xfVktFWV9GMTcgMHg4MA0KKyNkZWZpbmUgRldMX1ZLRVlfRjE4IDB4ODENCisjZGVmaW5lIEZXTF9WS0VZX0YxOSAweDgyDQorI2RlZmluZSBGV0xfVktFWV9GMjAgMHg4Mw0KKyNkZWZpbmUgRldMX1ZLRVlfRjIxIDB4ODQNCisjZGVmaW5lIEZXTF9WS0VZX0YyMiAweDg1DQorI2RlZmluZSBGV0xfVktFWV9GMjMgMHg4Ng0KKyNkZWZpbmUgRldMX1ZLRVlfRjI0IDB4ODcNCisjZGVmaW5lIEZXTF9WS0VZX051bkxvY2sgMHg5MA0KKyNkZWZpbmUgRldMX1ZLRVlfU2Nyb2xsIDB4OTENCisjZGVmaW5lIEZXTF9WS0VZX0xTaGlmdCAweEEwDQorI2RlZmluZSBGV0xfVktFWV9SU2hpZnQgMHhBMQ0KKyNkZWZpbmUgRldMX1ZLRVlfTENvbnRyb2wgMHhBMg0KKyNkZWZpbmUgRldMX1ZLRVlfUkNvbnRyb2wgMHhBMw0KKyNkZWZpbmUgRldMX1ZLRVlfTE1lbnUgMHhBNA0KKyNkZWZpbmUgRldMX1ZLRVlfUk1lbnUgMHhBNQ0KKyNkZWZpbmUgRldMX1ZLRVlfQlJPV1NFUl9CYWNrIDB4QTYNCisjZGVmaW5lIEZXTF9WS0VZX0JST1dTRVJfRm9yd2FyZCAweEE3DQorI2RlZmluZSBGV0xfVktFWV9CUk9XU0VSX1JlZnJlc2ggMHhBOA0KKyNkZWZpbmUgRldMX1ZLRVlfQlJPV1NFUl9TdG9wIDB4QTkNCisjZGVmaW5lIEZXTF9WS0VZX0JST1dTRVJfU2VhcmNoIDB4QUENCisjZGVmaW5lIEZXTF9WS0VZX0JST1dTRVJfRmF2b3JpdGVzIDB4QUINCisjZGVmaW5lIEZXTF9WS0VZX0JST1dTRVJfSG9tZSAweEFDDQorI2RlZmluZSBGV0xfVktFWV9WT0xVTUVfTXV0ZSAweEFEDQorI2RlZmluZSBGV0xfVktFWV9WT0xVTUVfRG93biAweEFFDQorI2RlZmluZSBGV0xfVktFWV9WT0xVTUVfVXAgMHhBRg0KKyNkZWZpbmUgRldMX1ZLRVlfTUVESUFfTkVYVF9UcmFjayAweEIwDQorI2RlZmluZSBGV0xfVktFWV9NRURJQV9QUkVWX1RyYWNrIDB4QjENCisjZGVmaW5lIEZXTF9WS0VZX01FRElBX1N0b3AgMHhCMg0KKyNkZWZpbmUgRldMX1ZLRVlfTUVESUFfUExBWV9QYXVzZSAweEIzDQorI2RlZmluZSBGV0xfVktFWV9NRURJQV9MQVVOQ0hfTWFpbCAweEI0DQorI2RlZmluZSBGV0xfVktFWV9NRURJQV9MQVVOQ0hfTUVESUFfU2VsZWN0IDB4QjUNCisjZGVmaW5lIEZXTF9WS0VZX01FRElBX0xBVU5DSF9BUFAxIDB4QjYNCisjZGVmaW5lIEZXTF9WS0VZX01FRElBX0xBVU5DSF9BUFAyIDB4QjcNCisjZGVmaW5lIEZXTF9WS0VZX09FTV8xIDB4QkENCisjZGVmaW5lIEZXTF9WS0VZX09FTV9QbHVzIDB4QkINCisjZGVmaW5lIEZXTF9WS0VZX09FTV9Db21tYSAweEJDDQorI2RlZmluZSBGV0xfVktFWV9PRU1fTWludXMgMHhCRA0KKyNkZWZpbmUgRldMX1ZLRVlfT0VNX1BlcmlvZCAweEJFDQorI2RlZmluZSBGV0xfVktFWV9PRU1fMiAweEJGDQorI2RlZmluZSBGV0xfVktFWV9PRU1fMyAweEMwDQorI2RlZmluZSBGV0xfVktFWV9PRU1fNCAweERCDQorI2RlZmluZSBGV0xfVktFWV9PRU1fNSAweERDDQorI2RlZmluZSBGV0xfVktFWV9PRU1fNiAweEREDQorI2RlZmluZSBGV0xfVktFWV9PRU1fNyAweERFDQorI2RlZmluZSBGV0xfVktFWV9PRU1fOCAweERGDQorI2RlZmluZSBGV0xfVktFWV9PRU1fMTAyIDB4RTINCisjZGVmaW5lIEZXTF9WS0VZX1Byb2Nlc3NLZXkgMHhFNQ0KKyNkZWZpbmUgRldMX1ZLRVlfUGFja2V0IDB4RTcNCisjZGVmaW5lIEZXTF9WS0VZX0F0dG4gMHhGNg0KKyNkZWZpbmUgRldMX1ZLRVlfQ3JzZWwgMHhGNw0KKyNkZWZpbmUgRldMX1ZLRVlfRXhzZWwgMHhGOA0KKyNkZWZpbmUgRldMX1ZLRVlfRXJlb2YgMHhGOQ0KKyNkZWZpbmUgRldMX1ZLRVlfUGxheSAweEZBDQorI2RlZmluZSBGV0xfVktFWV9ab29tIDB4RkINCisjZGVmaW5lIEZXTF9WS0VZX05vTmFtZSAweEZDDQorI2RlZmluZSBGV0xfVktFWV9QQTEgMHhGRA0KKyNkZWZpbmUgRldMX1ZLRVlfT0VNX0NsZWFyIDB4RkUNCisjZGVmaW5lIEZXTF9WS0VZX1Vua25vd24gMA0KKyNkZWZpbmUgRldMX1ZLRVlTVEFURV9Ub2dnbGVkIDB4MDAwMQ0KKyNkZWZpbmUgRldMX1ZLRVlTVEFURV9Eb3duIDB4MDEwMA0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF93aWRnZXRtZ3IuaCBiL3hmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF93aWRnZXRtZ3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGQwM2UwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3dpZGdldG1nci5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX1dJREdFVE1HUl9IDQorI2RlZmluZSBfRldMX1dJREdFVE1HUl9IDQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgSUZXTF9XaWRnZXRNZ3I7DQorY2xhc3MgSUZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZTsNCitlbnVtIEZXTF9XR1RSRUxBVElPTiB7DQorICBGV0xfV0dUUkVMQVRJT05fUGFyZW50ID0gMCwNCisgIEZXTF9XR1RSRUxBVElPTl9Pd25lciwNCisgIEZXTF9XR1RSRUxBVElPTl9GaXJzdFNpYmxpbmcsDQorICBGV0xfV0dUUkVMQVRJT05fUHJpb3JTaWJsaW5nLA0KKyAgRldMX1dHVFJFTEFUSU9OX05leHRTaWJsaW5nLA0KKyAgRldMX1dHVFJFTEFUSU9OX0xhc3RTaWJsaW5nLA0KKyAgRldMX1dHVFJFTEFUSU9OX0ZpcnN0Q2hpbGQsDQorICBGV0xfV0dUUkVMQVRJT05fTGFzdENoaWxkLA0KKyAgRldMX1dHVFJFTEFUSU9OX1N5c3RlbUZvcm0NCit9Ow0KK2NsYXNzIElGV0xfV2lkZ2V0TWdyIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZXTF9XaWRnZXRNZ3IoKSB7fQ0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50V2lkZ2V0cyhJRldMX1dpZGdldCogcFBhcmVudCA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgSUZXTF9XaWRnZXQqIEdldFdpZGdldChpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcFBhcmVudCA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgSUZXTF9XaWRnZXQqIEdldFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfV0dUUkVMQVRJT04gZVJlbGF0aW9uKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0V2lkZ2V0SW5kZXgoSUZXTF9XaWRnZXQqIHBXaWRnZXQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRXaWRnZXRJbmRleChJRldMX1dpZGdldCogcFdpZGdldCwgaW50MzJfdCBuSW5kZXgpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBSZXBhaW50V2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Q2FwYWJpbGl0eSgpID0gMDsNCit9Ow0KK0lGV0xfV2lkZ2V0TWdyKiBGV0xfR2V0V2lkZ2V0TWdyKCk7DQorRlhfQk9PTCBGV0xfV2lkZ2V0SXNDaGlsZChJRldMX1dpZGdldCogcGFyZW50LCBJRldMX1dpZGdldCogZmluZCk7DQorI2RlZmluZSBGV0xfV0dUTUdSX0Rpc2FibGVUaHJlYWQgMHgwMDAwMDAwMQ0KKyNkZWZpbmUgRldMX1dHVE1HUl9EaXNhYmxlRm9ybSAweDAwMDAwMDAyDQorY2xhc3MgSUZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZSB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGV0xfV2lkZ2V0TWdyRGVsZWdhdGUoKSB7fQ0KKyAgdmlydHVhbCBGV0xfRVJSIE9uU2V0Q2FwYWJpbGl0eSgNCisgICAgICBGWF9EV09SRCBkd0NhcGFiaWxpdHkgPSBGV0xfV0dUTUdSX0Rpc2FibGVUaHJlYWQpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBPblByb2Nlc3NNZXNzYWdlVG9Gb3JtKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpID0gMDsNCisgIHZpcnR1YWwgRldMX0VSUiBPbkRyYXdXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCkgPSAwOw0KK307DQorRldMX0VSUiBGV0xfV2lkZ2V0TWdyU25hcHNob3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcqIHNhdmVGaWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvZndsLmggYi94ZmEvaW5jbHVkZS9md2wvZndsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5OWNjMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9md2wuaApAQCAtMCwwICsxLDc4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKy8vIFRPRE8odGhlc3RpZyk6IFJlbW92ZSB0aGlzIGZpbGUgYW5kIGRvIElXWVUuDQorDQorI2lmbmRlZiBfRldMX0gNCisjZGVmaW5lIF9GV0xfSA0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfZXJyb3IuaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3RhcmdldC5oIg0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfdGhyZWFkLmgiDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF9ub3RlLmgiDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF93aWRnZXRkZWYuaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3RoZW1lLmgiDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF93aWRnZXQuaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2NvbnRlbnQuaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3BhbmVsLmgiDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF9mb3JtLmgiDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF93aWRnZXRtZ3IuaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3RpbWVyLmgiDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF9hcHAuaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX2dyaWQuaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX3B1c2hidXR0b24uaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2NoZWNrYm94LmgiDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9zY3JvbGxiYXIuaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2xpc3Rib3guaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2VkaXQuaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX3BpY3R1cmVib3guaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2NvbWJvYm94LmgiDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9tZW51LmgiDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9tb250aGNhbGVuZGFyLmgiDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z3bC9iYXNld2lkZ2V0L2Z3bF9kYXRldGltZXBpY2tlci5oIg0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfc3BpbmJ1dHRvbi5oIg0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfYmFyY29kZS5oIg0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9meG1hdGhfYmFyY29kZS5oIg0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvYmFzZXdpZGdldC9md2xfdG9vbHRpcGN0cmwuaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL2Jhc2V3aWRnZXQvZndsX2NhcmV0LmgiDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9hcHAuaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3dpZGdldC5oIg0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvcHVzaGJ1dHRvbi5oIg0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvY2hlY2tib3guaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3Njcm9sbGJhci5oIg0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvbGlzdGJveC5oIg0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvcGljdHVyZWJveC5oIg0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvZWRpdC5oIg0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvY29tYm9ib3guaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2RhdGV0aW1lcGlja2VyLmgiDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC90aGVtZS5oIg0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvdG9vbHRpcGN0cmwuaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2NhcmV0LmgiDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z3bC90aGVtZS91dGlscy5oIg0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvdGhlbWUvd2lkZ2V0dHAuaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL3RoZW1lL2JhcmNvZGV0cC5oIg0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvdGhlbWUvY2hlY2tib3h0cC5oIg0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvdGhlbWUvY29tYm9ib3h0cC5oIg0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvdGhlbWUvZGF0ZXRpbWVwaWNrZXJ0cC5oIg0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvdGhlbWUvZWRpdHRwLmgiDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z3bC90aGVtZS9mb3JtdHAuaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL3RoZW1lL2xpc3Rib3h0cC5oIg0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvdGhlbWUvbW9udGhjYWxlbmRhcnRwLmgiDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z3bC90aGVtZS9waWN0dXJlYm94dHAuaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL3RoZW1lL3B1c2hidXR0b250cC5oIg0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvdGhlbWUvc2Nyb2xsYmFydHAuaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL3RoZW1lL3dpZGdldHRwLmgiDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z3bC90aGVtZS9iYXJjb2RldHAuaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL3RoZW1lL2NhcmV0dHAuaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJuYXRpdmUuaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJ0aHJlYWRtZ3IuaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJ0aW1lcm1nci5oIg0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcndpZGdldG1nci5oIg0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcmN1cnNvcm1nci5oIg0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvYWRhcHRlci9md2xfYWRhcHRlcm1vbml0b3JtZ3IuaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX2FkYXB0ZXJjbGlwYm9hcmRtZ3IuaCINCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL2FkYXB0ZXIvZndsX3NkYWRhcHRlcmltcC5oIg0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9hcHAuaCBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9hcHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTNiYzYxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2FwcC5oCkBAIC0wLDAgKzEsMjggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBGV0xfTElHSFRXSURHRVRfQVBQX0hfDQorI2RlZmluZSBGV0xfTElHSFRXSURHRVRfQVBQX0hfDQorDQorY2xhc3MgQ0ZXTF9UaGVtZTsNCitjbGFzcyBJRldMX0FwcDsNCisNCitjbGFzcyBDRldMX0FwcCB7DQorIHB1YmxpYzoNCisgIENGV0xfQXBwKCk7DQorICB2aXJ0dWFsIH5DRldMX0FwcCgpOw0KKw0KKyAgRldMX0VSUiBJbml0aWFsaXplKCk7DQorICBGV0xfRVJSIEV4aXQoaW50MzJfdCBpRXhpdENvZGUpOw0KKw0KKyAgQ0ZXTF9UaGVtZSogR2V0VGhlbWUoKSBjb25zdCB7IHJldHVybiBtX3BUaGVtZTsgfQ0KKyAgSUZXTF9BcHAqIEdldEludGVyZmFjZSgpIGNvbnN0IHsgcmV0dXJuIG1fcElmYWNlOyB9DQorDQorIHByaXZhdGU6DQorICBJRldMX0FwcCogbV9wSWZhY2U7DQorICBDRldMX1RoZW1lKiBtX3BUaGVtZTsNCit9Ow0KKyNlbmRpZiAgLy8gRldMX0xJR0hUV0lER0VUX0FQUF9IXw0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9iYXJjb2RlLmggYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvYmFyY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYzc2N2QKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvYmFyY29kZS5oCkBAIC0wLDAgKzEsMTE3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9CQVJDT0RFX0xJR0hUX0gNCisjZGVmaW5lIF9GV0xfQkFSQ09ERV9MSUdIVF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXQ7DQorY2xhc3MgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzOw0KK2NsYXNzIElGV0xfQmFyY29kZURQOw0KK2NsYXNzIENGV0xfRWRpdDsNCitjbGFzcyBDRldMX0JhcmNvZGU7DQorY2xhc3MgQ0ZXTF9CYXJjb2RlRFA7DQorY2xhc3MgQ0ZXTF9CYXJjb2RlIDogcHVibGljIENGV0xfRWRpdCB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBDRldMX0JhcmNvZGUqIENyZWF0ZSgpOw0KKyAgRldMX0VSUiBJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyogcFByb3BlcnRpZXMgPSBOVUxMKTsNCisgIHZvaWQgU2V0VHlwZShCQ19UWVBFIHR5cGUpOw0KKyAgRlhfQk9PTCBJc1Byb3RlY3RlZFR5cGUoKTsNCisNCisgcHVibGljOg0KKyAgdm9pZCBTZXRDaGFyRW5jb2RpbmcoQkNfQ0hBUl9FTkNPRElORyBlbmNvZGluZykgew0KKyAgICBtX2JhcmNvZGVEYXRhLm1fZHdBdHRyaWJ1dGVNYXNrIHw9IEZXTF9CQ0RBVFRSSUJVVEVfQ0hBUkVOQ09ESU5HOw0KKyAgICBtX2JhcmNvZGVEYXRhLm1fZUNoYXJFbmNvZGluZyA9IGVuY29kaW5nOw0KKyAgfQ0KKyAgdm9pZCBTZXRNb2R1bGVIZWlnaHQoaW50MzJfdCBoZWlnaHQpIHsNCisgICAgbV9iYXJjb2RlRGF0YS5tX2R3QXR0cmlidXRlTWFzayB8PSBGV0xfQkNEQVRUUklCVVRFX01PRFVMRUhFSUdIVDsNCisgICAgbV9iYXJjb2RlRGF0YS5tX25Nb2R1bGVIZWlnaHQgPSBoZWlnaHQ7DQorICB9DQorICB2b2lkIFNldE1vZHVsZVdpZHRoKGludDMyX3Qgd2lkdGgpIHsNCisgICAgbV9iYXJjb2RlRGF0YS5tX2R3QXR0cmlidXRlTWFzayB8PSBGV0xfQkNEQVRUUklCVVRFX01PRFVMRVdJRFRIOw0KKyAgICBtX2JhcmNvZGVEYXRhLm1fbk1vZHVsZVdpZHRoID0gd2lkdGg7DQorICB9DQorICB2b2lkIFNldERhdGFMZW5ndGgoaW50MzJfdCBkYXRhTGVuZ3RoKSB7DQorICAgIG1fYmFyY29kZURhdGEubV9kd0F0dHJpYnV0ZU1hc2sgfD0gRldMX0JDREFUVFJJQlVURV9EQVRBTEVOR1RIOw0KKyAgICBtX2JhcmNvZGVEYXRhLm1fbkRhdGFMZW5ndGggPSBkYXRhTGVuZ3RoOw0KKyAgICBzdGF0aWNfY2FzdDxJRldMX0JhcmNvZGUqPihtX3BJZmFjZSktPlNldExpbWl0KGRhdGFMZW5ndGgpOw0KKyAgfQ0KKyAgdm9pZCBTZXRDYWxDaGVja3N1bShpbnQzMl90IGNhbENoZWNrc3VtKSB7DQorICAgIG1fYmFyY29kZURhdGEubV9kd0F0dHJpYnV0ZU1hc2sgfD0gRldMX0JDREFUVFJJQlVURV9DQUxDSEVDS1NVTTsNCisgICAgbV9iYXJjb2RlRGF0YS5tX25DYWxDaGVja3N1bSA9IGNhbENoZWNrc3VtOw0KKyAgfQ0KKyAgdm9pZCBTZXRQcmludENoZWNrc3VtKEZYX0JPT0wgcHJpbnRDaGVja3N1bSkgew0KKyAgICBtX2JhcmNvZGVEYXRhLm1fZHdBdHRyaWJ1dGVNYXNrIHw9IEZXTF9CQ0RBVFRSSUJVVEVfUFJJTlRDSEVDS1NVTTsNCisgICAgbV9iYXJjb2RlRGF0YS5tX2JQcmludENoZWNrc3VtID0gcHJpbnRDaGVja3N1bTsNCisgIH0NCisgIHZvaWQgU2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKSB7DQorICAgIG1fYmFyY29kZURhdGEubV9kd0F0dHJpYnV0ZU1hc2sgfD0gRldMX0JDREFUVFJJQlVURV9URVhUTE9DQVRJT047DQorICAgIG1fYmFyY29kZURhdGEubV9lVGV4dExvY2F0aW9uID0gbG9jYXRpb247DQorICB9DQorICB2b2lkIFNldFdpZGVOYXJyb3dSYXRpbyhpbnQzMl90IHJhdGlvKSB7DQorICAgIG1fYmFyY29kZURhdGEubV9kd0F0dHJpYnV0ZU1hc2sgfD0gRldMX0JDREFUVFJJQlVURV9XSURFTkFSUk9XUkFUSU87DQorICAgIG1fYmFyY29kZURhdGEubV9uV2lkZU5hcnJvd1JhdGlvID0gcmF0aW87DQorICB9DQorICB2b2lkIFNldFN0YXJ0Q2hhcihGWF9DSEFSIHN0YXJ0Q2hhcikgew0KKyAgICBtX2JhcmNvZGVEYXRhLm1fZHdBdHRyaWJ1dGVNYXNrIHw9IEZXTF9CQ0RBVFRSSUJVVEVfU1RBUlRDSEFSOw0KKyAgICBtX2JhcmNvZGVEYXRhLm1fY1N0YXJ0Q2hhciA9IHN0YXJ0Q2hhcjsNCisgIH0NCisgIHZvaWQgU2V0RW5kQ2hhcihGWF9DSEFSIGVuZENoYXIpIHsNCisgICAgbV9iYXJjb2RlRGF0YS5tX2R3QXR0cmlidXRlTWFzayB8PSBGV0xfQkNEQVRUUklCVVRFX0VORENIQVI7DQorICAgIG1fYmFyY29kZURhdGEubV9jRW5kQ2hhciA9IGVuZENoYXI7DQorICB9DQorICB2b2lkIFNldFZlcnNpb24oaW50MzJfdCB2ZXJzaW9uKSB7DQorICAgIG1fYmFyY29kZURhdGEubV9kd0F0dHJpYnV0ZU1hc2sgfD0gRldMX0JDREFUVFJJQlVURV9WRVJTSU9OOw0KKyAgICBtX2JhcmNvZGVEYXRhLm1fblZlcnNpb24gPSB2ZXJzaW9uOw0KKyAgfQ0KKyAgdm9pZCBTZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IGVjTGV2ZWwpIHsNCisgICAgbV9iYXJjb2RlRGF0YS5tX2R3QXR0cmlidXRlTWFzayB8PSBGV0xfQkNEQVRUUklCVVRFX0VDTEVWRUw7DQorICAgIG1fYmFyY29kZURhdGEubV9uRUNMZXZlbCA9IGVjTGV2ZWw7DQorICB9DQorICB2b2lkIFNldFRydW5jYXRlZChGWF9CT09MIHRydW5jYXRlZCkgew0KKyAgICBtX2JhcmNvZGVEYXRhLm1fZHdBdHRyaWJ1dGVNYXNrIHw9IEZXTF9CQ0RBVFRSSUJVVEVfVFJVTkNBVEVEOw0KKyAgICBtX2JhcmNvZGVEYXRhLm1fYlRydW5jYXRlZCA9IHRydW5jYXRlZDsNCisgIH0NCisgIHZvaWQgUmVzZXRCYXJjb2RlQXR0cmlidXRlcygpIHsgbV9iYXJjb2RlRGF0YS5tX2R3QXR0cmlidXRlTWFzayA9IDA7IH0NCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZXTF9CYXJjb2RlKCk7DQorICB2aXJ0dWFsIH5DRldMX0JhcmNvZGUoKTsNCisgIGNsYXNzIENGV0xfQmFyY29kZURQIDogcHVibGljIElGV0xfQmFyY29kZURQIHsNCisgICBwdWJsaWM6DQorICAgIHZpcnR1YWwgRldMX0VSUiBHZXRDYXB0aW9uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyYgd3NDYXB0aW9uKTsNCisgICAgQkNfQ0hBUl9FTkNPRElORyBtX2VDaGFyRW5jb2Rpbmc7DQorICAgIHZpcnR1YWwgQkNfQ0hBUl9FTkNPRElORyBHZXRDaGFyRW5jb2RpbmcoKSB7IHJldHVybiBtX2VDaGFyRW5jb2Rpbmc7IH0NCisgICAgaW50MzJfdCBtX25Nb2R1bGVIZWlnaHQsIG1fbk1vZHVsZVdpZHRoOw0KKyAgICB2aXJ0dWFsIGludDMyX3QgR2V0TW9kdWxlSGVpZ2h0KCkgeyByZXR1cm4gbV9uTW9kdWxlSGVpZ2h0OyB9DQorICAgIHZpcnR1YWwgaW50MzJfdCBHZXRNb2R1bGVXaWR0aCgpIHsgcmV0dXJuIG1fbk1vZHVsZVdpZHRoOyB9DQorICAgIGludDMyX3QgbV9uRGF0YUxlbmd0aDsNCisgICAgdmlydHVhbCBpbnQzMl90IEdldERhdGFMZW5ndGgoKSB7IHJldHVybiBtX25EYXRhTGVuZ3RoOyB9DQorICAgIGludDMyX3QgbV9uQ2FsQ2hlY2tzdW07DQorICAgIHZpcnR1YWwgaW50MzJfdCBHZXRDYWxDaGVja3N1bSgpIHsgcmV0dXJuIG1fbkNhbENoZWNrc3VtOyB9DQorICAgIEZYX0JPT0wgbV9iUHJpbnRDaGVja3N1bTsNCisgICAgdmlydHVhbCBGWF9CT09MIEdldFByaW50Q2hlY2tzdW0oKSB7IHJldHVybiBtX2JQcmludENoZWNrc3VtOyB9DQorDQorICAgIEJDX1RFWFRfTE9DIG1fZVRleHRMb2NhdGlvbjsNCisgICAgdmlydHVhbCBCQ19URVhUX0xPQyBHZXRUZXh0TG9jYXRpb24oKSB7IHJldHVybiBtX2VUZXh0TG9jYXRpb247IH0NCisgICAgaW50MzJfdCBtX25XaWRlTmFycm93UmF0aW87DQorICAgIHZpcnR1YWwgaW50MzJfdCBHZXRXaWRlTmFycm93UmF0aW8oKSB7IHJldHVybiBtX25XaWRlTmFycm93UmF0aW87IH0NCisgICAgRlhfQ0hBUiBtX2NTdGFydENoYXIsIG1fY0VuZENoYXI7DQorICAgIHZpcnR1YWwgRlhfQ0hBUiBHZXRTdGFydENoYXIoKSB7IHJldHVybiBtX2NTdGFydENoYXI7IH0NCisgICAgdmlydHVhbCBGWF9DSEFSIEdldEVuZENoYXIoKSB7IHJldHVybiBtX2NFbmRDaGFyOyB9DQorICAgIGludDMyX3QgbV9uVmVyc2lvbjsNCisgICAgdmlydHVhbCBpbnQzMl90IEdldFZlcnNpb24oKSB7IHJldHVybiBtX25WZXJzaW9uOyB9DQorICAgIGludDMyX3QgbV9uRUNMZXZlbDsNCisgICAgdmlydHVhbCBpbnQzMl90IEdldEVycm9yQ29ycmVjdGlvbkxldmVsKCkgeyByZXR1cm4gbV9uRUNMZXZlbDsgfQ0KKyAgICBGWF9CT09MIG1fYlRydW5jYXRlZDsNCisgICAgdmlydHVhbCBGWF9CT09MIEdldFRydW5jYXRlZCgpIHsgcmV0dXJuIG1fYlRydW5jYXRlZDsgfQ0KKyAgICBGWF9EV09SRCBtX2R3QXR0cmlidXRlTWFzazsNCisgICAgdmlydHVhbCBGWF9EV09SRCBHZXRCYXJjb2RlQXR0cmlidXRlTWFzaygpIHsgcmV0dXJuIG1fZHdBdHRyaWJ1dGVNYXNrOyB9DQorDQorICAgcHVibGljOg0KKyAgICBDRldMX0JhcmNvZGVEUCgpIDogbV9kd0F0dHJpYnV0ZU1hc2soMCkge30NCisgIH07DQorICBDRldMX0JhcmNvZGVEUCBtX2JhcmNvZGVEYXRhOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2NhcmV0LmggYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvY2FyZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzRkY2E1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2NhcmV0LmgKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfQ0FSRVRfTElHSFRfSA0KKyNkZWZpbmUgX0ZXTF9DQVJFVF9MSUdIVF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXQ7DQorY2xhc3MgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzOw0KK2NsYXNzIENGV0xfQ2FyZXQ7DQorY2xhc3MgQ0ZXTF9DYXJldCA6IHB1YmxpYyBDRldMX1dpZGdldCB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBDRldMX0NhcmV0KiBDcmVhdGUoKTsNCisgIEZXTF9FUlIgSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzID0gTlVMTCk7DQorICBGV0xfRVJSIFNob3dDYXJldChGWF9CT09MIGJGbGFnID0gVFJVRSk7DQorICBGV0xfRVJSIEdldEZyZXF1ZW5jeShGWF9EV09SRCYgZWxhcHNlKTsNCisgIEZXTF9FUlIgU2V0RnJlcXVlbmN5KEZYX0RXT1JEIGVsYXBzZSk7DQorICBGV0xfRVJSIFNldENvbG9yKENGWF9Db2xvciBjckZpbGwpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRldMX0NhcmV0KCk7DQorICB2aXJ0dWFsIH5DRldMX0NhcmV0KCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvY2hlY2tib3guaCBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9jaGVja2JveC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNjUxODgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvY2hlY2tib3guaApAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9DSEVDS0JPWF9MSUdIVF9IDQorI2RlZmluZSBfRldMX0NIRUNLQk9YX0xJR0hUX0gNCitjbGFzcyBDRldMX1dpZGdldDsNCitjbGFzcyBDRldMX1dpZGdldFByb3BlcnRpZXM7DQorY2xhc3MgSUZXTF9DaGVja0JveERQOw0KK2NsYXNzIENGV0xfQ2hlY2tCb3g7DQorY2xhc3MgQ0ZXTF9DaGVja0JveERQOw0KK2NsYXNzIENGV0xfQ2hlY2tCb3ggOiBwdWJsaWMgQ0ZXTF9XaWRnZXQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgQ0ZXTF9DaGVja0JveCogQ3JlYXRlKCk7DQorDQorICBGV0xfRVJSIEluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzKiBwUHJvcGVydGllcyA9IE5VTEwpOw0KKyAgRldMX0VSUiBHZXRDYXB0aW9uKENGWF9XaWRlU3RyaW5nJiB3c0NhcHRpb24pOw0KKyAgRldMX0VSUiBTZXRDYXB0aW9uKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDYXB0aW9uKTsNCisgIEZXTF9FUlIgU2V0Qm94U2l6ZShGWF9GTE9BVCBmSGVpZ2h0KTsNCisgIGludDMyX3QgR2V0Q2hlY2tTdGF0ZSgpOw0KKyAgRldMX0VSUiBTZXRDaGVja1N0YXRlKGludDMyX3QgaUNoZWNrKTsNCisgIENGV0xfQ2hlY2tCb3goKTsNCisgIHZpcnR1YWwgfkNGV0xfQ2hlY2tCb3goKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgY2xhc3MgQ0ZXTF9DaGVja0JveERQIDogcHVibGljIElGV0xfQ2hlY2tCb3hEUCB7DQorICAgcHVibGljOg0KKyAgICBDRldMX0NoZWNrQm94RFAoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSIEdldENhcHRpb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9XaWRlU3RyaW5nJiB3c0NhcHRpb24pOw0KKyAgICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEJveFNpemUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgICBGWF9GTE9BVCBtX2ZCb3hIZWlnaHQ7DQorICAgIENGWF9XaWRlU3RyaW5nIG1fd3NDYXB0aW9uOw0KKyAgfTsNCisgIENGV0xfQ2hlY2tCb3hEUCBtX2NoZWNrYm94RGF0YTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9jb21ib2JveC5oIGIveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2NvbWJvYm94LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I4ZWY3MAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9jb21ib2JveC5oCkBAIC0wLDAgKzEsMTM2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9DT01CT0JPWF9MSUdIVF9IDQorI2RlZmluZSBfRldMX0NPTUJPQk9YX0xJR0hUX0gNCitjbGFzcyBDRldMX1dpZGdldDsNCitjbGFzcyBDRldMX1dpZGdldFByb3BlcnRpZXM7DQorY2xhc3MgSUZXTF9Db21ib0JveERQOw0KK2NsYXNzIENGV0xfQ29tYm9Cb3g7DQorY2xhc3MgQ0ZXTF9Db21ib0JveERQOw0KK2NsYXNzIENGV0xfQ29tYm9Cb3hJdGVtOw0KK2NsYXNzIENGV0xfQ29tYm9Cb3ggOiBwdWJsaWMgQ0ZXTF9XaWRnZXQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgQ0ZXTF9Db21ib0JveCogQ3JlYXRlKCk7DQorICBGV0xfRVJSIEluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzKiBwUHJvcGVydGllcyA9IE5VTEwpOw0KKyAgaW50MzJfdCBBZGRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RleHQpOw0KKyAgaW50MzJfdCBBZGRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RleHQsIENGWF9ESUJpdG1hcCogcEljb24pOw0KKyAgaW50MzJfdCBSZW1vdmVBdChpbnQzMl90IGlJbmRleCk7DQorICBpbnQzMl90IFJlbW92ZUFsbCgpOw0KKyAgaW50MzJfdCBDb3VudEl0ZW1zKCk7DQorICBGV0xfRVJSIEdldFRleHRCeUluZGV4KGludDMyX3QgaUluZGV4LCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsNCisgIGludDMyX3QgR2V0Q3VyU2VsKCk7DQorICBGV0xfRVJSIFNldEN1clNlbChpbnQzMl90IGlTZWwpOw0KKyAgRldMX0VSUiBTZXRFZGl0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVGV4dCk7DQorICBpbnQzMl90IEdldEVkaXRUZXh0TGVuZ3RoKCkgY29uc3Q7DQorICBGV0xfRVJSIEdldEVkaXRUZXh0KENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0ID0gMCwNCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQgPSAtMSkgY29uc3Q7DQorICBGV0xfRVJSIFNldEVkaXRTZWxSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQgPSAtMSk7DQorICBpbnQzMl90IEdldEVkaXRTZWxSYW5nZShpbnQzMl90IG5JbmRleCwgaW50MzJfdCYgblN0YXJ0KTsNCisgIGludDMyX3QgR2V0RWRpdExpbWl0KCk7DQorICBGV0xfRVJSIFNldEVkaXRMaW1pdChpbnQzMl90IG5MaW1pdCk7DQorICBGV0xfRVJSIEVkaXREb0NsaXBib2FyZChpbnQzMl90IGlDbWQpOw0KKyAgRlhfQk9PTCBFZGl0UmVkbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKTsNCisgIEZYX0JPT0wgRWRpdFVuZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCk7DQorICBGV0xfRVJSIFNldE1heExpc3RIZWlnaHQoRlhfRkxPQVQgZk1heEhlaWdodCk7DQorICBGV0xfRVJSIFNldEl0ZW1EYXRhKGludDMyX3QgaUluZGV4LCB2b2lkKiBwRGF0YSk7DQorICB2b2lkKiBHZXRJdGVtRGF0YShpbnQzMl90IGlJbmRleCk7DQorICBGV0xfRVJSIFNldExpc3RUaGVtZShJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSk7DQorICBGWF9CT09MIEFmdGVyRm9jdXNTaG93RHJvcExpc3QoKTsNCisgIEZXTF9FUlIgT3BlbkRyb3BEb3duTGlzdChGWF9CT09MIGJBY3RpdmF0ZSk7DQorDQorIHB1YmxpYzoNCisgIEZYX0JPT0wgRWRpdENhblVuZG8oKTsNCisgIEZYX0JPT0wgRWRpdENhblJlZG8oKTsNCisgIEZYX0JPT0wgRWRpdFVuZG8oKTsNCisgIEZYX0JPT0wgRWRpdFJlZG8oKTsNCisgIEZYX0JPT0wgRWRpdENhbkNvcHkoKTsNCisgIEZYX0JPT0wgRWRpdENhbkN1dCgpOw0KKyAgRlhfQk9PTCBFZGl0Q2FuU2VsZWN0QWxsKCk7DQorICBGWF9CT09MIEVkaXRDb3B5KENGWF9XaWRlU3RyaW5nJiB3c0NvcHkpOw0KKyAgRlhfQk9PTCBFZGl0Q3V0KENGWF9XaWRlU3RyaW5nJiB3c0N1dCk7DQorICBGWF9CT09MIEVkaXRQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXN0ZSk7DQorICBGWF9CT09MIEVkaXRTZWxlY3RBbGwoKTsNCisgIEZYX0JPT0wgRWRpdERlbGV0ZSgpOw0KKyAgRlhfQk9PTCBFZGl0RGVTZWxlY3QoKTsNCisgIEZXTF9FUlIgR2V0QkJveChDRlhfUmVjdEYmIHJlY3QpOw0KKyAgRldMX0VSUiBFZGl0TW9kaWZ5U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpOw0KKyAgQ0ZXTF9Db21ib0JveCgpOw0KKyAgdmlydHVhbCB+Q0ZXTF9Db21ib0JveCgpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBjbGFzcyBDRldMX0NvbWJvQm94RFAgOiBwdWJsaWMgSUZXTF9Db21ib0JveERQIHsNCisgICBwdWJsaWM6DQorICAgIENGV0xfQ29tYm9Cb3hEUCgpOw0KKyAgICB+Q0ZXTF9Db21ib0JveERQKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUiBHZXRDYXB0aW9uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NDYXB0aW9uKSB7DQorICAgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorDQorICAgIHZpcnR1YWwgaW50MzJfdCBDb3VudEl0ZW1zKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgICAgdmlydHVhbCBGV0xfSExJU1RJVEVNIEdldEl0ZW0oSUZXTF9XaWRnZXQqIHBXaWRnZXQsIGludDMyX3QgbkluZGV4KTsNCisgICAgdmlydHVhbCBpbnQzMl90IEdldEl0ZW1JbmRleChJRldMX1dpZGdldCogcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSk7DQorICAgIHZpcnR1YWwgRlhfQk9PTCBTZXRJdGVtSW5kZXgoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCk7DQorDQorICAgIHZpcnR1YWwgRlhfRFdPUkQgR2V0SXRlbVN0eWxlcyhJRldMX1dpZGdldCogcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSk7DQorICAgIHZpcnR1YWwgRldMX0VSUiBHZXRJdGVtVGV4dChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsNCisgICAgdmlydHVhbCBGV0xfRVJSIEdldEl0ZW1SZWN0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRJdGVtKTsNCisgICAgdmlydHVhbCB2b2lkKiBHZXRJdGVtRGF0YShJRldMX1dpZGdldCogcFdpZGdldCwgRldMX0hMSVNUSVRFTSBoSXRlbSk7DQorICAgIHZpcnR1YWwgRldMX0VSUiBTZXRJdGVtU3R5bGVzKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlKTsNCisgICAgdmlydHVhbCBGV0xfRVJSIFNldEl0ZW1UZXh0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pUZXh0KTsNCisgICAgdmlydHVhbCBGV0xfRVJSIFNldEl0ZW1SZWN0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRJdGVtKTsNCisgICAgdmlydHVhbCBGWF9GTE9BVCBHZXRJdGVtSGVpZ2h0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgICAgdmlydHVhbCBDRlhfRElCaXRtYXAqIEdldEl0ZW1JY29uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSk7DQorICAgIHZpcnR1YWwgRldMX0VSUiBHZXRJdGVtQ2hlY2tSZWN0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJ0Q2hlY2spOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0SXRlbUNoZWNrUmVjdChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydENoZWNrKTsNCisgICAgdmlydHVhbCBGWF9EV09SRCBHZXRJdGVtQ2hlY2tTdGF0ZShJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtKTsNCisgICAgdmlydHVhbCBGV0xfRVJSIFNldEl0ZW1DaGVja1N0YXRlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Q2hlY2tTdGF0ZSk7DQorICAgIHZpcnR1YWwgRlhfRkxPQVQgR2V0TGlzdEhlaWdodChJRldMX1dpZGdldCogcFdpZGdldCk7DQorDQorICAgIENGWF9QdHJBcnJheSBtX2Fyckl0ZW07DQorICAgIEZYX0ZMT0FUIG1fZk1heExpc3RIZWlnaHQ7DQorICAgIEZYX0ZMT0FUIG1fZkl0ZW1IZWlnaHQ7DQorICB9Ow0KKyAgQ0ZXTF9Db21ib0JveERQIG1fY29tYm9Cb3hEYXRhOw0KK307DQorY2xhc3MgQ0ZXTF9Db21ib0JveEl0ZW0gew0KKyBwdWJsaWM6DQorICBDRldMX0NvbWJvQm94SXRlbSgpIHsNCisgICAgbV9wRElCID0gTlVMTDsNCisgICAgbV9wRGF0YSA9IE5VTEw7DQorICB9DQorICBDRlhfUmVjdEYgbV9ydEl0ZW07DQorICBGWF9EV09SRCBtX2R3U3R5bGVzOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c1RleHQ7DQorICBDRlhfRElCaXRtYXAqIG1fcERJQjsNCisgIEZYX0RXT1JEIG1fZHdDaGVja1N0YXRlOw0KKyAgQ0ZYX1JlY3RGIG1fcnRDaGVja0JveDsNCisgIHZvaWQqIG1fcERhdGE7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvZGF0ZXRpbWVwaWNrZXIuaCBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9kYXRldGltZXBpY2tlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYmRkNjEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvZGF0ZXRpbWVwaWNrZXIuaApAQCAtMCwwICsxLDYxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9EQVRFVElNRVBJQ0tFUl9MSUdIVF9IDQorI2RlZmluZSBfRldMX0RBVEVUSU1FUElDS0VSX0xJR0hUX0gNCitjbGFzcyBDRldMX1dpZGdldDsNCitjbGFzcyBDRldMX1dpZGdldFByb3BlcnRpZXM7DQorY2xhc3MgSUZXTF9EYXRlVGltZVBpY2tlckRQOw0KK2NsYXNzIENGV0xfRGF0ZVRpbWVQaWNrZXI7DQorY2xhc3MgQ0ZXTF9EYXRlVGltZVBpY2tlckRQOw0KK2NsYXNzIENGV0xfRGF0ZVRpbWVQaWNrZXIgOiBwdWJsaWMgQ0ZXTF9XaWRnZXQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgQ0ZXTF9EYXRlVGltZVBpY2tlciogQ3JlYXRlKCk7DQorICBGV0xfRVJSIEluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzKiBwUHJvcGVydGllcyA9IE5VTEwpOw0KKyAgRldMX0VSUiBTZXRUb2RheShpbnQzMl90IGlZZWFyLCBpbnQzMl90IGlNb250aCwgaW50MzJfdCBpRGF5KTsNCisgIEZXTF9FUlIgR2V0RWRpdFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorICBGV0xfRVJSIFNldEVkaXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUZXh0KTsNCisgIGludDMyX3QgQ291bnRTZWxSYW5nZXMoKTsNCisgIGludDMyX3QgR2V0U2VsUmFuZ2UoaW50MzJfdCBuSW5kZXgsIGludDMyX3QmIG5TdGFydCk7DQorICBGV0xfRVJSIEdldEN1clNlbChpbnQzMl90JiBpWWVhciwgaW50MzJfdCYgaU1vbnRoLCBpbnQzMl90JiBpRGF5KTsNCisgIEZXTF9FUlIgU2V0Q3VyU2VsKGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoLCBpbnQzMl90IGlEYXkpOw0KKyAgRlhfQk9PTCBDYW5VbmRvKCk7DQorICBGWF9CT09MIENhblJlZG8oKTsNCisgIEZYX0JPT0wgVW5kbygpOw0KKyAgRlhfQk9PTCBSZWRvKCk7DQorICBGWF9CT09MIENhbkNvcHkoKTsNCisgIEZYX0JPT0wgQ2FuQ3V0KCk7DQorICBGWF9CT09MIENhblNlbGVjdEFsbCgpOw0KKyAgRlhfQk9PTCBDb3B5KENGWF9XaWRlU3RyaW5nJiB3c0NvcHkpOw0KKyAgRlhfQk9PTCBDdXQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ3V0KTsNCisgIEZYX0JPT0wgUGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGFzdGUpOw0KKyAgRlhfQk9PTCBTZWxlY3RBbGwoKTsNCisgIEZYX0JPT0wgRGVsZXRlKCk7DQorICBGWF9CT09MIERlU2VsZWN0KCk7DQorICBGV0xfRVJSIEdldEJCb3goQ0ZYX1JlY3RGJiByZWN0KTsNCisgIEZXTF9FUlIgU2V0RWRpdExpbWl0KGludDMyX3QgbkxpbWl0KTsNCisgIEZXTF9FUlIgTW9kaWZ5RWRpdFN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZXTF9EYXRlVGltZVBpY2tlcigpOw0KKyAgdmlydHVhbCB+Q0ZXTF9EYXRlVGltZVBpY2tlcigpOw0KKyAgY2xhc3MgQ0ZXTF9EYXRlVGltZVBpY2tlckRQIDogcHVibGljIElGV0xfRGF0ZVRpbWVQaWNrZXJEUCB7DQorICAgcHVibGljOg0KKyAgICBDRldMX0RhdGVUaW1lUGlja2VyRFAoKTsNCisgICAgdmlydHVhbCBGV0xfRVJSIEdldENhcHRpb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9XaWRlU3RyaW5nJiB3c0NhcHRpb24pOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgR2V0VG9kYXkoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpWWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlEYXkpOw0KKyAgICBpbnQzMl90IG1faVllYXI7DQorICAgIGludDMyX3QgbV9pTW9udGg7DQorICAgIGludDMyX3QgbV9pRGF5Ow0KKyAgICBDRlhfV2lkZVN0cmluZyBtX3dzRGF0YTsNCisgIH07DQorICBDRldMX0RhdGVUaW1lUGlja2VyRFAgbV9EYXRlVGltZVBpY2tlckRQOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2VkaXQuaCBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9lZGl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU0MDZlYwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9lZGl0LmgKQEAgLTAsMCArMSw2MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfRURJVF9MSUdIVF9IDQorI2RlZmluZSBfRldMX0VESVRfTElHSFRfSA0KK2NsYXNzIENGV0xfV2lkZ2V0Ow0KK2NsYXNzIENGV0xfV2lkZ2V0UHJvcGVydGllczsNCitjbGFzcyBDRldMX0VkaXQ7DQorY2xhc3MgQ0ZXTF9FZGl0IDogcHVibGljIENGV0xfV2lkZ2V0IHsNCisgcHVibGljOg0KKyAgc3RhdGljIENGV0xfRWRpdCogQ3JlYXRlKCk7DQorICBGV0xfRVJSIEluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzKiBwUHJvcGVydGllcyA9IE5VTEwpOw0KKyAgRldMX0VSUiBTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgaW50MzJfdCBHZXRUZXh0TGVuZ3RoKCkgY29uc3Q7DQorICBGV0xfRVJSIEdldFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TdGFydCA9IDAsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQgPSAtMSkgY29uc3Q7DQorICBGV0xfRVJSIENsZWFyVGV4dCgpOw0KKyAgaW50MzJfdCBHZXRDYXJldFBvcygpIGNvbnN0Ow0KKyAgaW50MzJfdCBTZXRDYXJldFBvcyhpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiQmVmb3JlID0gVFJVRSk7DQorICBGV0xfRVJSIEFkZFNlbFJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCA9IC0xKTsNCisgIGludDMyX3QgQ291bnRTZWxSYW5nZXMoKTsNCisgIGludDMyX3QgR2V0U2VsUmFuZ2UoaW50MzJfdCBuSW5kZXgsIGludDMyX3QmIG5TdGFydCk7DQorICBGV0xfRVJSIENsZWFyU2VsZWN0aW9ucygpOw0KKyAgaW50MzJfdCBHZXRMaW1pdCgpOw0KKyAgRldMX0VSUiBTZXRMaW1pdChpbnQzMl90IG5MaW1pdCk7DQorICBGV0xfRVJSIFNldEFsaWFzQ2hhcihGWF9XQ0hBUiB3QWxpYXMpOw0KKyAgRldMX0VSUiBTZXRGb3JtYXRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0KTsNCisgIEZXTF9FUlIgSW5zZXJ0KGludDMyX3QgblN0YXJ0LCBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LCBpbnQzMl90IG5MZW4pOw0KKyAgRldMX0VSUiBEZWxldGVTZWxlY3Rpb25zKCk7DQorICBGV0xfRVJSIERlbGV0ZVJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCA9IC0xKTsNCisgIEZXTF9FUlIgUmVwbGFjZVNlbGVjdGlvbnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1JlcGxhY2UpOw0KKyAgRldMX0VSUiBSZXBsYWNlKGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QgbkxlbiwNCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzUmVwbGFjZSk7DQorICBGV0xfRVJSIERvQ2xpcGJvYXJkKGludDMyX3QgaUNtZCk7DQorICBGWF9CT09MIFJlZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCk7DQorICBGWF9CT09MIFVuZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCk7DQorICBGV0xfRVJSIFNldFRhYldpZHRoKEZYX0ZMT0FUIGZUYWJXaWR0aCwgRlhfQk9PTCBiRXF1aWRpc3RhbnQpOw0KKyAgRldMX0VSUiBTZXROdW1iZXJSYW5nZShpbnQzMl90IGlNaW4sIGludDMyX3QgaU1heCk7DQorICBGV0xfRVJSIFNldEJhY2tDb2xvcihGWF9EV09SRCBkd0NvbG9yKTsNCisgIEZXTF9FUlIgU2V0Rm9udChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb250LCBGWF9GTE9BVCBmU2l6ZSk7DQorICBGWF9CT09MIENhblVuZG8oKTsNCisgIEZYX0JPT0wgQ2FuUmVkbygpOw0KKyAgRlhfQk9PTCBVbmRvKCk7DQorICBGWF9CT09MIFJlZG8oKTsNCisgIEZYX0JPT0wgQ29weShDRlhfV2lkZVN0cmluZyYgd3NDb3B5KTsNCisgIEZYX0JPT0wgQ3V0KENGWF9XaWRlU3RyaW5nJiB3c0N1dCk7DQorICBGWF9CT09MIFBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1Bhc3RlKTsNCisgIEZYX0JPT0wgRGVsZXRlKCk7DQorICB2b2lkIFNldFNjcm9sbE9mZnNldChGWF9GTE9BVCBmU2Nyb2xsT2Zmc2V0KTsNCisgIEZYX0JPT0wgR2V0U3VnZ2VzdFdvcmRzKENGWF9Qb2ludEYgcG9pbnRmLCBDRlhfQnl0ZVN0cmluZ0FycmF5JiBzU3VnZ2VzdCk7DQorICBGWF9CT09MIFJlcGxhY2VTcGVsbENoZWNrV29yZChDRlhfUG9pbnRGIHBvaW50ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZXBsYWNlKTsNCisgIENGV0xfRWRpdCgpOw0KKyAgdmlydHVhbCB+Q0ZXTF9FZGl0KCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvbGlzdGJveC5oIGIveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2xpc3Rib3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWYzMWJkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L2xpc3Rib3guaApAQCAtMCwwICsxLDExNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfTElTVEJPWF9MSUdIVF9IDQorI2RlZmluZSBfRldMX0xJU1RCT1hfTElHSFRfSA0KK2NsYXNzIENGV0xfV2lkZ2V0Ow0KK2NsYXNzIENGV0xfV2lkZ2V0UHJvcGVydGllczsNCitjbGFzcyBJRldMX0xpc3RCb3hEUDsNCitjbGFzcyBDRldMX0xpc3RCb3g7DQorY2xhc3MgQ0ZXTF9MaXN0SXRlbTsNCitjbGFzcyBDRldMX0xpc3RCb3ggOiBwdWJsaWMgQ0ZXTF9XaWRnZXQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgQ0ZXTF9MaXN0Qm94KiBDcmVhdGUoKTsNCisgIEZXTF9FUlIgSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzID0gTlVMTCk7DQorICBGV0xfRVJSIEFkZERJQml0bWFwKENGWF9ESUJpdG1hcCogcERJQiwgRldMX0hMSVNUSVRFTSBoSXRlbSk7DQorICBGV0xfSExJU1RJVEVNIEFkZFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQWRkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2VsZWN0ID0gRkFMU0UpOw0KKyAgRlhfQk9PTCBEZWxldGVTdHJpbmcoRldMX0hMSVNUSVRFTSBoSXRlbSk7DQorICBGWF9CT09MIERlbGV0ZUFsbCgpOw0KKyAgaW50MzJfdCBDb3VudFNlbEl0ZW1zKCk7DQorICBGV0xfSExJU1RJVEVNIEdldFNlbEl0ZW0oaW50MzJfdCBuSW5kZXhTZWwpOw0KKyAgaW50MzJfdCBHZXRTZWxJbmRleChpbnQzMl90IG5JbmRleCk7DQorICBGV0xfRVJSIFNldFNlbEl0ZW0oRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfQk9PTCBiU2VsZWN0ID0gVFJVRSk7DQorICBGV0xfRVJSIEdldEl0ZW1UZXh0KEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgRldMX0VSUiBHZXRTY3JvbGxQb3MoRlhfRkxPQVQmIGZQb3MsIEZYX0JPT0wgYlZlcnQgPSBUUlVFKTsNCisgIEZXTF9FUlIgU2V0SXRlbUhlaWdodChGWF9GTE9BVCBmSXRlbUhlaWdodCk7DQorICBGV0xfSExJU1RJVEVNIEdldEZvY3VzSXRlbSgpOw0KKyAgRldMX0VSUiBTZXRGb2N1c0l0ZW0oRldMX0hMSVNUSVRFTSBoSXRlbSk7DQorICBGV0xfRVJSKiBTb3J0KElGV0xfTGlzdEJveENvbXBhcmUqIHBDb20pOw0KKyAgaW50MzJfdCBDb3VudEl0ZW1zKCk7DQorICBGV0xfSExJU1RJVEVNIEdldEl0ZW0oaW50MzJfdCBuSW5kZXgpOw0KKyAgRldMX0VSUiBTZXRJdGVtU3RyaW5nKEZXTF9ITElTVElURU0gaEl0ZW0sIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUZXh0KTsNCisgIEZXTF9FUlIgR2V0SXRlbVN0cmluZyhGV0xfSExJU1RJVEVNIGhJdGVtLCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsNCisgIEZXTF9FUlIgU2V0SXRlbURhdGEoRldMX0hMSVNUSVRFTSBoSXRlbSwgdm9pZCogcERhdGEpOw0KKyAgdm9pZCogR2V0SXRlbURhdGEoRldMX0hMSVNUSVRFTSBoSXRlbSk7DQorICBGV0xfSExJU1RJVEVNIEdldEl0ZW1BdFBvaW50KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICBGWF9EV09SRCBHZXRJdGVtU3RhdGVzKEZXTF9ITElTVElURU0gaEl0ZW0pOw0KKyAgQ0ZXTF9MaXN0Qm94KCk7DQorICB2aXJ0dWFsIH5DRldMX0xpc3RCb3goKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgY2xhc3MgQ0ZXTF9MaXN0Qm94RFAgOiBwdWJsaWMgSUZXTF9MaXN0Qm94RFAgew0KKyAgIHB1YmxpYzoNCisgICAgQ0ZXTF9MaXN0Qm94RFAoKTsNCisgICAgfkNGV0xfTGlzdEJveERQKCk7DQorICAgIHZpcnR1YWwgRldMX0VSUiBHZXRDYXB0aW9uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyYgd3NDYXB0aW9uKTsNCisNCisgICAgdmlydHVhbCBpbnQzMl90IENvdW50SXRlbXMoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIEZXTF9ITElTVElURU0gR2V0SXRlbShJRldMX1dpZGdldCogcFdpZGdldCwgaW50MzJfdCBuSW5kZXgpOw0KKyAgICB2aXJ0dWFsIGludDMyX3QgR2V0SXRlbUluZGV4KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtKTsNCisgICAgdmlydHVhbCBGWF9CT09MIFNldEl0ZW1JbmRleChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4KTsNCisNCisgICAgdmlydHVhbCBGWF9EV09SRCBHZXRJdGVtU3R5bGVzKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtKTsNCisgICAgdmlydHVhbCBGV0xfRVJSIEdldEl0ZW1UZXh0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgR2V0SXRlbVJlY3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydEl0ZW0pOw0KKyAgICB2aXJ0dWFsIHZvaWQqIEdldEl0ZW1EYXRhKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGV0xfSExJU1RJVEVNIGhJdGVtKTsNCisNCisgICAgdmlydHVhbCBGV0xfRVJSIFNldEl0ZW1TdHlsZXMoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGUpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0SXRlbVRleHQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzelRleHQpOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0SXRlbVJlY3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEl0ZW0pOw0KKyAgICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEl0ZW1IZWlnaHQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgICB2aXJ0dWFsIENGWF9ESUJpdG1hcCogR2V0SXRlbUljb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtKTsNCisgICAgdmlydHVhbCBGV0xfRVJSIEdldEl0ZW1DaGVja1JlY3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRDaGVjayk7DQorICAgIHZpcnR1YWwgRldMX0VSUiBTZXRJdGVtQ2hlY2tSZWN0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0Q2hlY2spOw0KKyAgICB2aXJ0dWFsIEZYX0RXT1JEIEdldEl0ZW1DaGVja1N0YXRlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0pOw0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgU2V0SXRlbUNoZWNrU3RhdGUoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDaGVja1N0YXRlKTsNCisNCisgICAgQ0ZYX1B0ckFycmF5IG1fYXJySXRlbTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgbV93c0RhdGE7DQorICAgIEZYX0ZMT0FUIG1fZkl0ZW1IZWlnaHQ7DQorICB9Ow0KKyAgQ0ZXTF9MaXN0Qm94RFAgbV9MaXN0Qm94RFA7DQorfTsNCitjbGFzcyBDRldMX0xpc3RJdGVtIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9MaXN0SXRlbSgpIHsNCisgICAgbV9ydEl0ZW0uUmVzZXQoKTsNCisgICAgbV9kd1N0YXRlcyA9IDA7DQorICAgIG1fd3NUZXh0ID0gTCIiOw0KKyAgICBtX3BESUIgPSBOVUxMOw0KKyAgICBtX3BEYXRhID0gTlVMTDsNCisgICAgbV9kd0NoZWNrU3RhdGUgPSAwOw0KKyAgICBtX3J0Q2hlY2tCb3guUmVzZXQoKTsNCisgIH0NCisgIENGWF9SZWN0RiBtX3J0SXRlbTsNCisgIEZYX0RXT1JEIG1fZHdTdGF0ZXM7DQorICBDRlhfV2lkZVN0cmluZyBtX3dzVGV4dDsNCisgIENGWF9ESUJpdG1hcCogbV9wRElCOw0KKyAgdm9pZCogbV9wRGF0YTsNCisgIEZYX0RXT1JEIG1fZHdDaGVja1N0YXRlOw0KKyAgQ0ZYX1JlY3RGIG1fcnRDaGVja0JveDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9waWN0dXJlYm94LmggYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvcGljdHVyZWJveC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZDY4MWUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvcGljdHVyZWJveC5oCkBAIC0wLDAgKzEsNjMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX1BJQ1RVUkVCT1hfTElHSFRfSA0KKyNkZWZpbmUgX0ZXTF9QSUNUVVJFQk9YX0xJR0hUX0gNCitjbGFzcyBDRldMX1dpZGdldDsNCitjbGFzcyBDRldMX1dpZGdldFByb3BlcnRpZXM7DQorY2xhc3MgSUZXTF9QaWN0dXJlQm94RFA7DQorY2xhc3MgQ0ZXTF9QaWN0dXJlQm94Ow0KK2NsYXNzIENGV0xfUGljdHVyZUJveERQOw0KK2NsYXNzIENGV0xfUGljdHVyZUJveCA6IHB1YmxpYyBDRldMX1dpZGdldCB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBDRldMX1BpY3R1cmVCb3gqIENyZWF0ZSgpOw0KKyAgRldMX0VSUiBJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyogcFByb3BlcnRpZXMgPSBOVUxMKTsNCisgIENGWF9ESUJpdG1hcCogR2V0UGljdHVyZSgpOw0KKyAgRldMX0VSUiBTZXRQaWN0dXJlKENGWF9ESUJpdG1hcCogcEJpdG1hcCk7DQorICBGWF9GTE9BVCBHZXRSb3RhdGlvbigpOw0KKyAgRldMX0VSUiBTZXRSb3RhdGlvbihGWF9GTE9BVCBmUm90YXRpb24pOw0KKyAgaW50MzJfdCBHZXRGbGlwTW9kZSgpOw0KKyAgRldMX0VSUiBTZXRGbGlwTW9kZShpbnQzMl90IGlGbGlwTW9kZSk7DQorICBpbnQzMl90IEdldE9wYWNpdHkoKTsNCisgIEZXTF9FUlIgU2V0T3BhY2l0eShpbnQzMl90IGlPcGFjaXR5KTsNCisgIEZXTF9FUlIgR2V0U2NhbGUoRlhfRkxPQVQmIGZTY2FsZVgsIEZYX0ZMT0FUJiBmU2NhbGVZKTsNCisgIEZXTF9FUlIgU2V0U2NhbGUoRlhfRkxPQVQgZlNjYWxlWCwgRlhfRkxPQVQgZlNjYWxlWSk7DQorICBGV0xfRVJSIEdldE9mZnNldChGWF9GTE9BVCYgZngsIEZYX0ZMT0FUJiBmeSk7DQorICBGV0xfRVJSIFNldE9mZnNldChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgQ0ZXTF9QaWN0dXJlQm94KCk7DQorICB2aXJ0dWFsIH5DRldMX1BpY3R1cmVCb3goKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgY2xhc3MgQ0ZXTF9QaWN0dXJlQm94RFAgOiBwdWJsaWMgSUZXTF9QaWN0dXJlQm94RFAgew0KKyAgIHB1YmxpYzoNCisgICAgQ0ZXTF9QaWN0dXJlQm94RFAoKSB7DQorICAgICAgbV9mUm90YXRpb24gPSAwLjBmOw0KKyAgICAgIG1fZlNjYWxlWCA9IDEuMGY7DQorICAgICAgbV9mU2NhbGVZID0gMS4wZjsNCisgICAgICBtX2ZPZmZTZXRYID0gMC4wZjsNCisgICAgICBtX2ZPZmZTZXRZID0gMC4wZjsNCisgICAgICBtX3BCaXRtYXAgPSBOVUxMOw0KKyAgICB9Ow0KKyAgICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q2FwdGlvbihJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcmIHdzQ2FwdGlvbik7DQorICAgIHZpcnR1YWwgQ0ZYX0RJQml0bWFwKiBHZXRQaWN0dXJlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgICAgdmlydHVhbCBDRlhfRElCaXRtYXAqIEdldEVycm9yUGljdHVyZShJRldMX1dpZGdldCogcFdpZGdldCk7DQorICAgIHZpcnR1YWwgQ0ZYX0RJQml0bWFwKiBHZXRJbml0aWFsUGljdHVyZShJRldMX1dpZGdldCogcFdpZGdldCk7DQorICAgIHZpcnR1YWwgaW50MzJfdCBHZXRPcGFjaXR5KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgICAgdmlydHVhbCBpbnQzMl90IEdldEZsaXBNb2RlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgICAgdmlydHVhbCBGV0xfRVJSIEdldE1hdHJpeChJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX01hdHJpeCYgbWF0cml4KTsNCisgICAgQ0ZYX0RJQml0bWFwKiBtX3BCaXRtYXA7DQorICAgIGludDMyX3QgbV9pT3BhY2l0eTsNCisgICAgaW50MzJfdCBtX2lGbGlwTW9kZTsNCisgICAgRlhfRkxPQVQgbV9mUm90YXRpb247DQorICAgIEZYX0ZMT0FUIG1fZlNjYWxlWDsNCisgICAgRlhfRkxPQVQgbV9mU2NhbGVZOw0KKyAgICBGWF9GTE9BVCBtX2ZPZmZTZXRYOw0KKyAgICBGWF9GTE9BVCBtX2ZPZmZTZXRZOw0KKyAgICBDRlhfV2lkZVN0cmluZyBtX3dzRGF0YTsNCisgIH07DQorICBDRldMX1BpY3R1cmVCb3hEUCBtX1BpY3R1cmVCb3hEUDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9wdXNoYnV0dG9uLmggYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvcHVzaGJ1dHRvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MDIzYzcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvcHVzaGJ1dHRvbi5oCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX1BVU0hCVVRUT05fTElHSFRfSA0KKyNkZWZpbmUgX0ZXTF9QVVNIQlVUVE9OX0xJR0hUX0gNCitjbGFzcyBDRldMX1dpZGdldDsNCitjbGFzcyBDRldMX1dpZGdldFByb3BlcnRpZXM7DQorY2xhc3MgSUZXTF9QdXNoQnV0dG9uRFA7DQorY2xhc3MgQ0ZXTF9QdXNoQnV0dG9uOw0KK2NsYXNzIENGV0xfUHVzaEJ1dHRvbkRQOw0KK2NsYXNzIENGV0xfUHVzaEJ1dHRvbiA6IHB1YmxpYyBDRldMX1dpZGdldCB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBDRldMX1B1c2hCdXR0b24qIENyZWF0ZSgpOw0KKyAgRldMX0VSUiBJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyogcFByb3BlcnRpZXMgPSBOVUxMKTsNCisgIEZXTF9FUlIgR2V0Q2FwdGlvbihDRlhfV2lkZVN0cmluZyYgd3NDYXB0aW9uKTsNCisgIEZXTF9FUlIgU2V0Q2FwdGlvbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2FwdGlvbik7DQorICBDRlhfRElCaXRtYXAqIEdldFBpY3R1cmUoKTsNCisgIEZXTF9FUlIgU2V0UGljdHVyZShDRlhfRElCaXRtYXAqIHBCaXRtYXApOw0KKyAgQ0ZXTF9QdXNoQnV0dG9uKCk7DQorICB2aXJ0dWFsIH5DRldMX1B1c2hCdXR0b24oKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgY2xhc3MgQ0ZXTF9QdXNoQnV0dG9uRFAgOiBwdWJsaWMgSUZXTF9QdXNoQnV0dG9uRFAgew0KKyAgIHB1YmxpYzoNCisgICAgQ0ZXTF9QdXNoQnV0dG9uRFAoKSA6IG1fcEJpdG1hcChOVUxMKSB7fQ0KKyAgICBGV0xfRVJSIEdldENhcHRpb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9XaWRlU3RyaW5nJiB3c0NhcHRpb24pOw0KKyAgICB2aXJ0dWFsIENGWF9ESUJpdG1hcCogR2V0UGljdHVyZShJRldMX1dpZGdldCogcFdpZGdldCk7DQorICAgIENGWF9XaWRlU3RyaW5nIG1fd3NDYXB0aW9uOw0KKyAgICBDRlhfRElCaXRtYXAqIG1fcEJpdG1hcDsNCisgIH07DQorICBDRldMX1B1c2hCdXR0b25EUCBtX2J1dHRvbkRhdGE7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvc2Nyb2xsYmFyLmggYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvc2Nyb2xsYmFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEyOTlhNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC9zY3JvbGxiYXIuaApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9TQ1JPTExCQVJfTElHSFRfSA0KKyNkZWZpbmUgX0ZXTF9TQ1JPTExCQVJfTElHSFRfSA0KK2NsYXNzIENGV0xfV2lkZ2V0Ow0KK2NsYXNzIENGV0xfV2lkZ2V0UHJvcGVydGllczsNCitjbGFzcyBDRldMX1Njcm9sbEJhcjsNCitjbGFzcyBDRldMX1Njcm9sbEJhciA6IHB1YmxpYyBDRldMX1dpZGdldCB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBDRldMX1Njcm9sbEJhciogQ3JlYXRlKCk7DQorICBGV0xfRVJSIEluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzKiBwUHJvcGVydGllcyA9IE5VTEwpOw0KKyAgRlhfQk9PTCBJc1ZlcnRpY2FsKCk7DQorICBGV0xfRVJSIEdldFJhbmdlKEZYX0ZMT0FUJiBmTWluLCBGWF9GTE9BVCYgZk1heCk7DQorICBGV0xfRVJSIFNldFJhbmdlKEZYX0ZMT0FUIGZNaW4sIEZYX0ZMT0FUIGZNYXgpOw0KKyAgRlhfRkxPQVQgR2V0UGFnZVNpemUoKTsNCisgIEZXTF9FUlIgU2V0UGFnZVNpemUoRlhfRkxPQVQgZlBhZ2VTaXplKTsNCisgIEZYX0ZMT0FUIEdldFN0ZXBTaXplKCk7DQorICBGV0xfRVJSIFNldFN0ZXBTaXplKEZYX0ZMT0FUIGZTdGVwU2l6ZSk7DQorICBGWF9GTE9BVCBHZXRQb3MoKTsNCisgIEZXTF9FUlIgU2V0UG9zKEZYX0ZMT0FUIGZQb3MpOw0KKyAgRlhfRkxPQVQgR2V0VHJhY2tQb3MoKTsNCisgIEZXTF9FUlIgU2V0VHJhY2tQb3MoRlhfRkxPQVQgZlRyYWNrUG9zKTsNCisgIEZYX0JPT0wgRG9TY3JvbGwoRlhfRFdPUkQgZHdDb2RlLCBGWF9GTE9BVCBmUG9zID0gMC4wZik7DQorICBDRldMX1Njcm9sbEJhcigpOw0KKyAgdmlydHVhbCB+Q0ZXTF9TY3JvbGxCYXIoKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC90aGVtZS5oIGIveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3RoZW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU4ZjA0MwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC90aGVtZS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX1RIRU1FX0xJR0hUX0gNCisjZGVmaW5lIF9GV0xfVEhFTUVfTElHSFRfSA0KKw0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfdGhlbWUuaCINCisNCitjbGFzcyBDRldMX1dpZGdldFRQOw0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KKw0KK2NsYXNzIENGV0xfVGhlbWUgOiBwdWJsaWMgSUZXTF9UaGVtZVByb3ZpZGVyIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9UaGVtZSgpOw0KKyAgfkNGV0xfVGhlbWUoKSBvdmVycmlkZTsNCisNCisgIC8vIElGV0xfVGhlbWVQcm92aWRlcjoNCisgIEZYX0JPT0wgSXNWYWxpZFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCkgb3ZlcnJpZGU7DQorICBGWF9EV09SRCBHZXRUaGVtZUlEKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSBvdmVycmlkZTsNCisgIEZYX0RXT1JEIFNldFRoZW1lSUQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3VGhlbWVJRCwNCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hpbGRyZW4gPSBUUlVFKSBvdmVycmlkZTsNCisgIEZXTF9FUlIgR2V0VGhlbWVNYXRyaXgoSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9NYXRyaXgmIG1hdHJpeCkgb3ZlcnJpZGU7DQorICBGV0xfRVJSIFNldFRoZW1lTWF0cml4KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIG92ZXJyaWRlOw0KKyAgRlhfQk9PTCBEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcykgb3ZlcnJpZGU7DQorICBGWF9CT09MIERyYXdUZXh0KENGV0xfVGhlbWVUZXh0KiBwUGFyYW1zKSBvdmVycmlkZTsNCisgIHZvaWQqIEdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LCBGWF9EV09SRCBkd0NhcGFjaXR5KSBvdmVycmlkZTsNCisgIEZYX0JPT0wgSXNDdXN0b21pemVkTGF5b3V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSBvdmVycmlkZTsNCisgIEZXTF9FUlIgR2V0UGFydFJlY3QoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQsIENGWF9SZWN0RiYgcnRQYXJ0KSBvdmVycmlkZTsNCisgIEZYX0JPT0wgSXNJblBhcnQoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQsDQorICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgb3ZlcnJpZGU7DQorICBGWF9CT09MIENhbGNUZXh0UmVjdChDRldMX1RoZW1lVGV4dCogcFBhcmFtcywgQ0ZYX1JlY3RGJiByZWN0KSBvdmVycmlkZTsNCisNCisgIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgRldMX0VSUiBGaW5hbGl6ZSgpOw0KKyAgRldMX0VSUiBTZXRGb250KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBzdHJGb250LA0KKyAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSwNCisgICAgICAgICAgICAgICAgICBGWF9BUkdCIHJnYkZvbnQpOw0KKyAgQ0ZXTF9XaWRnZXRUUCogR2V0VGhlbWUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRlhfUHRyQXJyYXkgbV9hcnJUaGVtZXM7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvdG9vbHRpcGN0cmwuaCBiL3hmYS9pbmNsdWRlL2Z3bC9saWdodHdpZGdldC90b29sdGlwY3RybC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMmVkN2IKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvdG9vbHRpcGN0cmwuaApAQCAtMCwwICsxLDUzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9Ub29sVGlwX0xJR0hUX0gNCisjZGVmaW5lIF9GV0xfVG9vbFRpcF9MSUdIVF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXQ7DQorY2xhc3MgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzOw0KK2NsYXNzIElGV0xfVG9vbFRpcERQOw0KK2NsYXNzIENGV0xfVG9vbFRpcDsNCitjbGFzcyBDRldMX1Rvb2xUaXBEUDsNCitjbGFzcyBDRldMX1Rvb2xUaXAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgQ0ZXTF9Ub29sVGlwKiBDcmVhdGUoKTsNCisgIEZXTF9FUlIgSW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzID0gTlVMTCk7DQorICBGV0xfRVJSIEdldENhcHRpb24oQ0ZYX1dpZGVTdHJpbmcmIHdzQ2FwdGlvbik7DQorICBGV0xfRVJSIFNldENhcHRpb24oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NhcHRpb24pOw0KKyAgaW50MzJfdCBHZXRJbml0aWFsRGVsYXkoKTsNCisgIGludDMyX3QgU2V0SW5pdGlhbERlbGF5KGludDMyX3QgbkRlbGF5VGltZSk7DQorICBpbnQzMl90IEdldEF1dG9Qb3BEZWxheSgpOw0KKyAgaW50MzJfdCBTZXRBdXRvUG9wRGVsYXkoaW50MzJfdCBuRGVsYXlUaW1lKTsNCisgIENGWF9ESUJpdG1hcCogR2V0VG9vbFRpcEljb24oKTsNCisgIEZXTF9FUlIgU2V0VG9vbFRpcEljb24oQ0ZYX0RJQml0bWFwKiBwQml0bWFwKTsNCisgIENGWF9TaXplRiBHZXRUb29sVGlwSWNvblNpemUoKTsNCisgIEZXTF9FUlIgU2V0VG9vbFRpcEljb25TaXplKENGWF9TaXplRiBmU2l6ZSk7DQorICBGV0xfRVJSIFNldEFuY2hvcihjb25zdCBDRlhfUmVjdEYmIHJ0QW5jaG9yKTsNCisgIEZXTF9FUlIgU2hvdygpOw0KKyAgRldMX0VSUiBIaWRlKCk7DQorICBDRldMX1Rvb2xUaXAoKTsNCisgIHZpcnR1YWwgfkNGV0xfVG9vbFRpcCgpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBjbGFzcyBDRldMX1Rvb2xUaXBEUCA6IHB1YmxpYyBJRldMX1Rvb2xUaXBEUCB7DQorICAgcHVibGljOg0KKyAgICBDRldMX1Rvb2xUaXBEUCgpOw0KKyAgICBGV0xfRVJSIEdldENhcHRpb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9XaWRlU3RyaW5nJiB3c0NhcHRpb24pOw0KKyAgICBpbnQzMl90IEdldEluaXRpYWxEZWxheShJRldMX1dpZGdldCogcFdpZGdldCk7DQorICAgIGludDMyX3QgR2V0QXV0b1BvcERlbGF5KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgICAgQ0ZYX0RJQml0bWFwKiBHZXRUb29sVGlwSWNvbihJRldMX1dpZGdldCogcFdpZGdldCk7DQorICAgIENGWF9TaXplRiBHZXRUb29sVGlwSWNvblNpemUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgICBDRlhfUmVjdEYgR2V0QW5jaG9yKCk7DQorICAgIENGWF9XaWRlU3RyaW5nIG1fd3NDYXB0aW9uOw0KKyAgICBpbnQzMl90IG1fbkluaXREZWxheVRpbWU7DQorICAgIGludDMyX3QgbV9uQXV0b1BvcERlbGF5VGltZTsNCisgICAgQ0ZYX0RJQml0bWFwKiBtX3BCaXRtYXA7DQorICAgIENGWF9TaXplRiBtX2ZJY29uU2l6ZTsNCisgICAgQ0ZYX1JlY3RGIG1fZkFuY2hvcjsNCisgIH07DQorICBDRldMX1Rvb2xUaXBEUCBtX3Rvb2x0aXBEYXRhOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3dpZGdldC5oIGIveGZhL2luY2x1ZGUvZndsL2xpZ2h0d2lkZ2V0L3dpZGdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ODRkYjMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvbGlnaHR3aWRnZXQvd2lkZ2V0LmgKQEAgLTAsMCArMSwxMDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX1dJREdFVF9MSUdIVF9IDQorI2RlZmluZSBfRldMX1dJREdFVF9MSUdIVF9IDQorDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF93aWRnZXQuaCINCisNCitjbGFzcyBDRldMX0V2ZW50Ow0KK2NsYXNzIENGV0xfTWVzc2FnZTsNCitjbGFzcyBDRldMX1dpZGdldDsNCitjbGFzcyBDRldMX1dpZGdldERlbGVnYXRlOw0KK2NsYXNzIENGV0xfV2lkZ2V0TWdyOw0KKw0KK2NsYXNzIENGV0xfV2lkZ2V0UHJvcGVydGllcyB7DQorIHB1YmxpYzoNCisgIENGV0xfV2lkZ2V0UHJvcGVydGllcygpIHsNCisgICAgbV9jdG1PblBhcmVudC5TZXRJZGVudGl0eSgpOw0KKyAgICBtX3J0V2lkZ2V0LlNldCgwLCAwLCAwLCAwKTsNCisgICAgbV9kd1N0eWxlcyA9IEZXTF9XR1RTVFlMRV9DaGlsZDsNCisgICAgbV9kd1N0eWxlRXhlcyA9IDA7DQorICAgIG1fZHdTdGF0ZXMgPSAwOw0KKyAgICBtX3BQYXJlbnQgPSBOVUxMOw0KKyAgICBtX3BPd25lciA9IE5VTEw7DQorICB9DQorICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgTWFrZVdpZGdldEltcFByb3BlcnRpZXMoDQorICAgICAgSUZXTF9EYXRhUHJvdmlkZXIqIHBEYXRhUHJvdmlkZXIpIGNvbnN0Ow0KKw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c1dpbmRvd2NsYXNzOw0KKyAgQ0ZYX01hdHJpeCBtX2N0bU9uUGFyZW50Ow0KKyAgQ0ZYX1JlY3RGIG1fcnRXaWRnZXQ7DQorICBGWF9EV09SRCBtX2R3U3R5bGVzOw0KKyAgRlhfRFdPUkQgbV9kd1N0eWxlRXhlczsNCisgIEZYX0RXT1JEIG1fZHdTdGF0ZXM7DQorICBDRldMX1dpZGdldCogbV9wUGFyZW50Ow0KKyAgQ0ZXTF9XaWRnZXQqIG1fcE93bmVyOw0KK307DQorDQorY2xhc3MgQ0ZXTF9XaWRnZXQgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5DRldMX1dpZGdldCgpOw0KKyAgSUZXTF9XaWRnZXQqIEdldFdpZGdldCgpOw0KKyAgRldMX0VSUiBHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2xhc3MpIGNvbnN0Ow0KKyAgRlhfRFdPUkQgR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9CT09MIElzSW5zdGFuY2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NsYXNzKSBjb25zdDsNCisNCisgcHJvdGVjdGVkOg0KKyAgRldMX0VSUiBJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyogcFByb3BlcnRpZXMgPSBOVUxMKTsNCisNCisgcHVibGljOg0KKyAgRldMX0VSUiBHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQorICBGV0xfRVJSIEdldEdsb2JhbFJlY3QoQ0ZYX1JlY3RGJiByZWN0KTsNCisgIEZXTF9FUlIgU2V0V2lkZ2V0UmVjdChjb25zdCBDRlhfUmVjdEYmIHJlY3QpOw0KKyAgRldMX0VSUiBHZXRDbGllbnRSZWN0KENGWF9SZWN0RiYgcnRDbGllbnQpOw0KKyAgQ0ZXTF9XaWRnZXQqIEdldFBhcmVudCgpOw0KKyAgRldMX0VSUiBTZXRQYXJlbnQoQ0ZXTF9XaWRnZXQqIHBQYXJlbnQpOw0KKyAgQ0ZXTF9XaWRnZXQqIEdldE93bmVyKCk7DQorICBGV0xfRVJSIFNldE93bmVyKENGV0xfV2lkZ2V0KiBwT3duZXIpOw0KKyAgRlhfRFdPUkQgR2V0U3R5bGVzKCk7DQorICBGV0xfRVJSIE1vZGlmeVN0eWxlcyhGWF9EV09SRCBkd1N0eWxlc0FkZGVkLCBGWF9EV09SRCBkd1N0eWxlc1JlbW92ZWQpOw0KKyAgRlhfRFdPUkQgR2V0U3R5bGVzRXgoKTsNCisgIEZXTF9FUlIgTW9kaWZ5U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLCBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQorICBGWF9EV09SRCBHZXRTdGF0ZXMoKTsNCisgIEZXTF9FUlIgU2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgIEZXTF9FUlIgU2V0UHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2spOw0KKyAgdm9pZCogR2V0UHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkKTsNCisgIEZXTF9FUlIgVXBkYXRlKCk7DQorICBGV0xfRVJSIExvY2tVcGRhdGUoKTsNCisgIEZXTF9FUlIgVW5sb2NrVXBkYXRlKCk7DQorICBGWF9EV09SRCBIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICBGV0xfRVJSIFRyYW5zZm9ybVRvKENGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9GTE9BVCYgZngsIEZYX0ZMT0FUJiBmeSk7DQorICBGV0xfRVJSIFRyYW5zZm9ybVRvKENGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBDRlhfUmVjdEYmIHJ0KTsNCisgIEZXTF9FUlIgR2V0TWF0cml4KENGWF9NYXRyaXgmIG1hdHJpeCwgRlhfQk9PTCBiR2xvYmFsID0gRkFMU0UpOw0KKyAgRldMX0VSUiBTZXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KTsNCisgIEZXTF9FUlIgRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogU2V0RGVsZWdhdGUoSUZXTF9XaWRnZXREZWxlZ2F0ZSogcERlbGVnYXRlKTsNCisgIEZXTF9FUlIgUmVwYWludChjb25zdCBDRlhfUmVjdEYqIHBSZWN0ID0gTlVMTCk7DQorICBGV0xfRVJSIFNldEZvY3VzKEZYX0JPT0wgYkZvY3VzKTsNCisgIEZXTF9FUlIgU2V0R3JhYihGWF9CT09MIGJTZXQpOw0KKyAgQ0ZXTF9XaWRnZXQoKTsNCisNCisgIHZvaWQgUmVnaXN0ZXJFdmVudFRhcmdldChDRldMX1dpZGdldCogcEV2ZW50U291cmNlID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZpbHRlciA9IEZXTF9FVkVOVF9BTExfTUFTSyk7DQorICB2b2lkIERpc3BhdGNoRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KTsNCisgIENGWF9TaXplRiBDYWxjVGV4dFNpemUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTXVsdGlMaW5lID0gRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxpbmVXaWR0aCA9IC0xKTsNCisgIElGV0xfV2lkZ2V0KiBtX3BJZmFjZTsNCisgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIG1fcERlbGVnYXRlOw0KKyAgQ0ZXTF9XaWRnZXRNZ3IqIG1fcFdpZGdldE1ncjsNCisgIENGV0xfV2lkZ2V0UHJvcGVydGllcyogbV9wUHJvcGVydGllczsNCit9Ow0KK2NsYXNzIENGV0xfV2lkZ2V0RGVsZWdhdGUgew0KKyBwdWJsaWM6DQorICBDRldMX1dpZGdldERlbGVnYXRlKCk7DQorICB2aXJ0dWFsIH5DRldMX1dpZGdldERlbGVnYXRlKCk7DQorICB2aXJ0dWFsIGludDMyX3QgT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKTsNCisgIHZpcnR1YWwgRldMX0VSUiBPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIE9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL3RoZW1lL2JhcmNvZGV0cC5oIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL2JhcmNvZGV0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MjM5MDkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvdGhlbWUvYmFyY29kZXRwLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfQkFSQ09ERVRQX0gNCisjZGVmaW5lIF9GV0xfQkFSQ09ERVRQX0gNCitjbGFzcyBDRldMX1dpZGdldFRQOw0KK2NsYXNzIENGV0xfQmFyY29kZVRQOw0KK2NsYXNzIENGV0xfQmFyY29kZVRQIDogcHVibGljIENGV0xfV2lkZ2V0VFAgew0KKyBwdWJsaWM6DQorICBDRldMX0JhcmNvZGVUUCgpOw0KKyAgdmlydHVhbCB+Q0ZXTF9CYXJjb2RlVFAoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcyk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvdGhlbWUvY2FyZXR0cC5oIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL2NhcmV0dHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjkxZjhjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL2NhcmV0dHAuaApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9DQVJFVFRQX0gNCisjZGVmaW5lIF9GV0xfQ0FSRVRUUF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXRUUDsNCitjbGFzcyBDRldMX0NhcmV0VFA7DQorY2xhc3MgQ0ZXTF9DYXJldFRQIDogcHVibGljIENGV0xfV2lkZ2V0VFAgew0KKyBwdWJsaWM6DQorICBDRldMX0NhcmV0VFAoKTsNCisgIHZpcnR1YWwgfkNGV0xfQ2FyZXRUUCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBEcmF3Q2FyZXRCSyhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0ZXMsDQorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgIENGWF9Db2xvciogY3JGaWxsLA0KKyAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvdGhlbWUvY2hlY2tib3h0cC5oIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL2NoZWNrYm94dHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDAzY2YxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL2NoZWNrYm94dHAuaApAQCAtMCwwICsxLDgxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9DSEVDS0JPWFRQX0gNCisjZGVmaW5lIF9GV0xfQ0hFQ0tCT1hUUF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXRUUDsNCitjbGFzcyBDRldMX0NoZWNrQm94VFA7DQorY2xhc3MgQ0ZXTF9DaGVja0JveFRQIDogcHVibGljIENGV0xfV2lkZ2V0VFAgew0KKyBwdWJsaWM6DQorICBDRldMX0NoZWNrQm94VFAoKTsNCisgIHZpcnR1YWwgfkNGV0xfQ2hlY2tCb3hUUCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBTZXRUaGVtZUlEKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3VGhlbWVJRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGlsZHJlbiA9IFRSVUUpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdUZXh0KENGV0xfVGhlbWVUZXh0KiBwUGFyYW1zKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcyk7DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgRHJhd0JveEJrKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0ZXMsDQorICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIERyYXdTaWduKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUnRCb3gsDQorICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdGVzLA0KKyAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIERyYXdTaWduTmV1dHJhbChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJ0U2lnbiwNCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgRHJhd1NpZ25DaGVjayhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdFNpZ24sDQorICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiRmlsbCwNCisgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIERyYXdTaWduQ2lyY2xlKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdFNpZ24sDQorICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYkZpbGwsDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgRHJhd1NpZ25Dcm9zcyhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdFNpZ24sDQorICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiRmlsbCwNCisgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIERyYXdTaWduRGlhbW9uZChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJ0U2lnbiwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYkZpbGwsDQorICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIERyYXdTaWduU3F1YXJlKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdFNpZ24sDQorICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYkZpbGwsDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgRHJhd1NpZ25TdGFyKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUnRTaWduLA0KKyAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiRmlsbCwNCisgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgRHJhd1NpZ25Cb3JkZXIoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdEJveCwNCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRGlzYWJsZSA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIFNldFRoZW1lRGF0YShGWF9EV09SRCBkd0lEKTsNCisgIHZvaWQgaW5pdENoZWNrUGF0aChGWF9GTE9BVCBmQ2hlY2tMZW4pOw0KKyAgc3RydWN0IENLQlRoZW1lRGF0YSB7DQorICAgIEZYX0FSR0IgY2xyQm94QmtbMTNdWzJdOw0KKyAgICBGWF9BUkdCIGNsclNpZ25Cb3JkZXJOb3JtYWw7DQorICAgIEZYX0FSR0IgY2xyU2lnbkJvcmRlckRpc2FibGU7DQorICAgIEZYX0FSR0IgY2xyU2lnbkNoZWNrOw0KKyAgICBGWF9BUkdCIGNsclNpZ25OZXV0cmFsOw0KKyAgICBGWF9BUkdCIGNsclNpZ25OZXV0cmFsTm9ybWFsOw0KKyAgICBGWF9BUkdCIGNsclNpZ25OZXV0cmFsSG92ZXI7DQorICAgIEZYX0FSR0IgY2xyU2lnbk5ldXRyYWxQcmVzc2VkOw0KKyAgfSAqIG1fcFRoZW1lRGF0YTsNCisgIENGWF9QYXRoKiBtX3BDaGVja1BhdGg7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvdGhlbWUvY29tYm9ib3h0cC5oIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL2NvbWJvYm94dHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGE1ZDY2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL2NvbWJvYm94dHAuaApAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9DT01CT0JPWFRQX0gNCisjZGVmaW5lIF9GV0xfQ09NQk9CT1hUUF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXRUUDsNCitjbGFzcyBDRldMX0NvbWJvQm94VFA7DQorY2xhc3MgQ0ZXTF9Db21ib0JveFRQIDogcHVibGljIENGV0xfV2lkZ2V0VFAgew0KKyBwdWJsaWM6DQorICBDRldMX0NvbWJvQm94VFAoKTsNCisgIHZpcnR1YWwgfkNGV0xfQ29tYm9Cb3hUUCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKTsNCisgIHZpcnR1YWwgdm9pZCogR2V0Q2FwYWNpdHkoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQsIEZYX0RXT1JEIGR3Q2FwYWNpdHkpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIERyYXdEcm9wRG93bkJ1dHRvbihDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICB2b2lkIERyYXdTdHJldGhIYW5kbGVyKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvdGhlbWUvZGF0ZXRpbWVwaWNrZXJ0cC5oIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL2RhdGV0aW1lcGlja2VydHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTVjZDA1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL2RhdGV0aW1lcGlja2VydHAuaApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9EQVRFVElNRVBJQ0tFUlRQX0gNCisjZGVmaW5lIF9GV0xfREFURVRJTUVQSUNLRVJUUF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXRUUDsNCitjbGFzcyBDRldMX0RhdGVUaW1lUGlja2VyVFA7DQorY2xhc3MgQ0ZXTF9EYXRlVGltZVBpY2tlclRQIDogcHVibGljIENGV0xfV2lkZ2V0VFAgew0KKyBwdWJsaWM6DQorICBDRldMX0RhdGVUaW1lUGlja2VyVFAoKTsNCisgIHZpcnR1YWwgfkNGV0xfRGF0ZVRpbWVQaWNrZXJUUCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBEcmF3RHJvcERvd25CdXR0b24oQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMsIENGWF9NYXRyaXgqIHBNYXRyaXgpOw0KKyAgdm9pZCBpbml0VGhlbWVEYXRhKCk7DQorICBzdHJ1Y3QgRFRQVGhlbWVEYXRhIHsNCisgICAgRlhfQVJHQiBCb3hCa0NvbG9yWzEzXVsyXTsNCisgIH0gKiBtX3BUaGVtZURhdGE7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvdGhlbWUvZWRpdHRwLmggYi94ZmEvaW5jbHVkZS9md2wvdGhlbWUvZWRpdHRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZlMWRhOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9lZGl0dHAuaApAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9FRElUVFBfSA0KKyNkZWZpbmUgX0ZXTF9FRElUVFBfSA0KK2NsYXNzIENGV0xfV2lkZ2V0VFA7DQorY2xhc3MgQ0ZXTF9FZGl0VFA7DQorY2xhc3MgQ0ZXTF9FZGl0VFAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRUUCB7DQorIHB1YmxpYzoNCisgIENGV0xfRWRpdFRQKCk7DQorICB2aXJ0dWFsIH5DRldMX0VkaXRUUCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKTsNCisgIHZpcnR1YWwgRldMX0VSUiBJbml0aWFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRmluYWxpemUoKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9mb3JtdHAuaCBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9mb3JtdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjdjYjg3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL2Zvcm10cC5oCkBAIC0wLDAgKzEsMTA4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9GT1JNX1RIRU1FUFJPVklERVJfSA0KKyNkZWZpbmUgX0ZXTF9GT1JNX1RIRU1FUFJPVklERVJfSA0KK2NsYXNzIENGV0xfV2lkZ2V0VFA7DQorY2xhc3MgQ0ZXTF9Gb3JtVFA7DQorY2xhc3MgQ0ZXTF9Gb3JtVFAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRUUCB7DQorIHB1YmxpYzoNCisgIENGV0xfRm9ybVRQKCk7DQorICB2aXJ0dWFsIH5DRldMX0Zvcm1UUCgpOw0KKw0KKyAgdmlydHVhbCBGV0xfRVJSIEluaXRpYWxpemUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBGaW5hbGl6ZSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBTZXRUaGVtZUlEKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3VGhlbWVJRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGlsZHJlbiA9IFRSVUUpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3VGV4dChDRldMX1RoZW1lVGV4dCogcFBhcmFtcyk7DQorICB2aXJ0dWFsIHZvaWQqIEdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LCBGWF9EV09SRCBkd0NhcGFjaXR5KTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRQYXJ0UmVjdChDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCwgQ0ZYX1JlY3RGJiBydFBhcnQpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIENhbENsb3NlQm94KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBDRlhfUmVjdEYmIHJlY3QpOw0KKyAgdm9pZCBDYWxNYXhCb3goSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9SZWN0RiYgcmVjdCk7DQorICB2b2lkIENhbE1pbkJveChJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX1JlY3RGJiByZWN0KTsNCisgIHZvaWQgQ2FsQ2FwdGlvbihJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX1JlY3RGJiByZWN0KTsNCisgIHZvaWQgQ2FsSWNvbihJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX1JlY3RGJiByZWN0KTsNCisNCisgIHZvaWQgRHJhd0Zvcm1Cb3JkZXIoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQWN0aXZlID0gMCk7DQorICB2b2lkIERyYXdDYXB0aW9uKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsDQorICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUFjdGl2ZSA9IDApOw0KKyAgdm9pZCBEcmF3TmFycm93Q2FwdGlvbihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlBY3RpdmUgPSAwKTsNCisgIHZvaWQgRHJhd0Nsb3NlQm94KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlBY3RpdmUgPSAwKTsNCisgIHZvaWQgRHJhd01pbk1heEJveENvbW1vbihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUFjdGl2ZSA9IDApOw0KKyAgdm9pZCBEcmF3TWluaW1pemVCb3goQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUFjdGl2ZSA9IDApOw0KKyAgdm9pZCBEcmF3TWF4aW1pemVCb3goQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTWF4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUFjdGl2ZSA9IDApOw0KKyAgdm9pZCBEcmF3SWNvbkltYWdlKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcERJQml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQWN0aXZlID0gMCk7DQorICB2b2lkIFNldFRoZW1lRGF0YShGWF9EV09SRCBkd0lEKTsNCisgIHZvaWQgVHJhbnNNb2RlQ29sb3IoRlhfQVJHQiBjbHJGb3JlLCBGWF9BUkdCJiBjbHJCYWNrKTsNCisgIHZvaWQgRGVhY3RpdmVGb3JtKCk7DQorICB2b2lkIEluaXRDYXB0aW9uKEZYX0JPT0wgYkFjdGl2ZSk7DQorICBDRlhfRElCaXRtYXAqIG1fcEFjdGl2ZUJpdG1hcDsNCisgIENGWF9ESUJpdG1hcCogbV9wRGVhY3RpdmViaXRtYXA7DQorICBDRlhfUmVjdEYgbV9ydERpc0NhcHRpb247DQorICBDRlhfUmVjdEYgbV9ydERpc0xCb3JkZXI7DQorICBDRlhfUmVjdEYgbV9ydERpc1JCb3JkZXI7DQorICBDRlhfUmVjdEYgbV9ydERpc0JCb3JkZXI7DQorICBzdHJ1Y3QgU0JUaGVtZURhdGEgew0KKyAgICBGWF9BUkdCIGNsckhlYWRCS1syXVs0XTsNCisgICAgRlhfQVJHQiBjbHJIZWFkRWRnZUxlZnRbMl1bM107DQorICAgIEZYX0FSR0IgY2xySGVhZEVkZ2VSaWdodFsyXVszXTsNCisgICAgRlhfQVJHQiBjbHJIZWFkRWRnZVRvcFsyXVszXTsNCisgICAgRlhfQVJHQiBjbHJIZWFkRWRnZUJvdHRvbVsyXVszXTsNCisgICAgRlhfQVJHQiBjbHJDbG9zZUJ0QktTdGFydFsyXVszXTsNCisgICAgRlhfQVJHQiBjbHJDbG9zZUJ0QktFbmRbMl1bM107DQorICAgIEZYX0FSR0IgY2xyQ2xvc2VCdEVkZ2VMaWdodFsyXVszXTsNCisgICAgRlhfQVJHQiBjbHJDbG9zZUJ0RWRnZURhcmtbMl1bM107DQorICAgIEZYX0FSR0IgY2xyTm9ybWFsQnRCS1N0YXJ0WzJdWzNdOw0KKyAgICBGWF9BUkdCIGNsck5vcm1hbEJ0QktFbmRbMl1bM107DQorICAgIEZYX0FSR0IgY2xyTm9ybWFsQnRFZGdlTGlnaHRbMl1bM107DQorICAgIEZYX0FSR0IgY2xyTm9ybWFsQnRFZGdlRGFya1syXVszXTsNCisgICAgRlhfQVJHQiBjbHJCdG5FZGdlT3V0WzJdOw0KKyAgICBGWF9BUkdCIGNsckJ0bkNvcm5lckxpZ2h0WzJdWzNdOw0KKyAgICBGWF9BUkdCIGNsckhlYWRUZXh0WzJdOw0KKyAgICBGWF9BUkdCIGNsckZvcm1Cb3JkZXJbMl1bNV07DQorICAgIEZYX0FSR0IgY2xyRm9ybUJvcmRlckxpZ2h0WzJdOw0KKyAgICBGWF9BUkdCIGNsclRyYW5zV2hpdGU7DQorICB9ICogbV9wVGhlbWVEYXRhOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL3RoZW1lL2xpc3Rib3h0cC5oIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL2xpc3Rib3h0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNGE2ZGMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvdGhlbWUvbGlzdGJveHRwLmgKQEAgLTAsMCArMSwyOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfTElTVEJPWFRQX0gNCisjZGVmaW5lIF9GV0xfTElTVEJPWFRQX0gNCitjbGFzcyBDRldMX1dpZGdldFRQOw0KK2NsYXNzIENGV0xfU2Nyb2xsQmFyVFA7DQorY2xhc3MgQ0ZXTF9MaXN0Qm94VFA7DQorY2xhc3MgQ0ZXTF9MaXN0Qm94VFAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRUUCB7DQorIHB1YmxpYzoNCisgIENGV0xfTGlzdEJveFRQKCk7DQorICB2aXJ0dWFsIH5DRldMX0xpc3RCb3hUUCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKTsNCisgIHZpcnR1YWwgRldMX0VSUiBJbml0aWFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRmluYWxpemUoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBEcmF3TGlzdEJveEl0ZW0oQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcHJ0SXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBEYXRhID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9tb250aGNhbGVuZGFydHAuaCBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9tb250aGNhbGVuZGFydHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDNlM2EwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL21vbnRoY2FsZW5kYXJ0cC5oCkBAIC0wLDAgKzEsNDkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX01PTlRIQ0FMRU5EQVJUUF9IDQorI2RlZmluZSBfRldMX01PTlRIQ0FMRU5EQVJUUF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXRUUDsNCitjbGFzcyBDRldMX01vbnRoQ2FsZW5kYXJUUDsNCitjbGFzcyBDRldMX01vbnRoQ2FsZW5kYXJUUCA6IHB1YmxpYyBDRldMX1dpZGdldFRQIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9Nb250aENhbGVuZGFyVFAoKTsNCisgIHZpcnR1YWwgfkNGV0xfTW9udGhDYWxlbmRhclRQKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNWYWxpZFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0RXT1JEIFNldFRoZW1lSUQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdUaGVtZUlELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoaWxkcmVuID0gVFJVRSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdUZXh0KENGV0xfVGhlbWVUZXh0KiBwUGFyYW1zKTsNCisgIHZpcnR1YWwgdm9pZCogR2V0Q2FwYWNpdHkoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQsIEZYX0RXT1JEIGR3Q2FwYWNpdHkpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEluaXRpYWxpemUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBGaW5hbGl6ZSgpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBGWF9CT09MIERyYXdUb3RhbEJLKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zLCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIEZYX0JPT0wgRHJhd0hlYWRCayhDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcywgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICBGWF9CT09MIERyYXdMQnV0dG9uKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zLCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIEZYX0JPT0wgRHJhd1JCdXR0b24oQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMsIENGWF9NYXRyaXgqIHBNYXRyaXgpOw0KKyAgRlhfQk9PTCBEcmF3RGF0ZXNJbkJLKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zLCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIEZYX0JPT0wgRHJhd0RhdGVzSW5DaXJjbGUoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMsIENGWF9NYXRyaXgqIHBNYXRyaXgpOw0KKyAgRlhfQk9PTCBEcmF3VG9kYXlDaXJjbGUoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMsIENGWF9NYXRyaXgqIHBNYXRyaXgpOw0KKyAgRlhfQk9PTCBEcmF3SFNlcGVyYXRvcihDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcywgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICBGWF9CT09MIERyYXdXZWVrTnVtU2VwKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zLCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIEZXTFRIRU1FX1NUQVRFIEdldFN0YXRlKEZYX0RXT1JEIGR3RldMU3RhdGVzKTsNCisgIHZvaWQgU2V0VGhlbWVEYXRhKEZYX0RXT1JEIGR3VGhlbWVJRCk7DQorICBjbGFzcyBNQ1RoZW1lRGF0YSB7DQorICAgcHVibGljOg0KKyAgICBGWF9BUkdCIGNsckNhcHRpb247DQorICAgIEZYX0FSR0IgY2xyU2VwZXJhdG9yOw0KKyAgICBGWF9BUkdCIGNsckRhdGVzSG92ZXJCSzsNCisgICAgRlhfQVJHQiBjbHJEYXRlc1NlbGVjdGVkQks7DQorICAgIEZYX0FSR0IgY2xyRGF0ZXNDaXJjbGU7DQorICAgIEZYX0FSR0IgY2xyVG9kYXk7DQorICAgIEZYX0FSR0IgY2xyQks7DQorICB9ICogbV9wVGhlbWVEYXRhOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXNvdXJjZTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9waWN0dXJlYm94dHAuaCBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9waWN0dXJlYm94dHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmZmZDVlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL3BpY3R1cmVib3h0cC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX1BJQ1RVUkVCT1hUUF9IDQorI2RlZmluZSBfRldMX1BJQ1RVUkVCT1hUUF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXRUUDsNCitjbGFzcyBDRldMX1BpY3R1cmVCb3hUUDsNCitjbGFzcyBDRldMX1BpY3R1cmVCb3hUUCA6IHB1YmxpYyBDRldMX1dpZGdldFRQIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9QaWN0dXJlQm94VFAoKTsNCisgIHZpcnR1YWwgfkNGV0xfUGljdHVyZUJveFRQKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNWYWxpZFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL3RoZW1lL3B1c2hidXR0b250cC5oIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL3B1c2hidXR0b250cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YjlkMmQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvdGhlbWUvcHVzaGJ1dHRvbnRwLmgKQEAgLTAsMCArMSw0MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfUFVTSEJVVFRPTlRQX0gNCisjZGVmaW5lIF9GV0xfUFVTSEJVVFRPTlRQX0gNCitjbGFzcyBDRldMX1dpZGdldFRQOw0KK2NsYXNzIENGV0xfUHVzaEJ1dHRvblRQOw0KK2NsYXNzIENGV0xfUHVzaEJ1dHRvblRQIDogcHVibGljIENGV0xfV2lkZ2V0VFAgew0KKyBwdWJsaWM6DQorICBDRldMX1B1c2hCdXR0b25UUCgpOw0KKyAgdmlydHVhbCB+Q0ZXTF9QdXNoQnV0dG9uVFAoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgU2V0VGhlbWVJRChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1RoZW1lSUQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hpbGRyZW4gPSBUUlVFKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcyk7DQorICB2aXJ0dWFsIHZvaWQqIEdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LCBGWF9EV09SRCBkd0NhcGFjaXR5KTsNCisgIHZpcnR1YWwgRldMX0VSUiBJbml0aWFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRmluYWxpemUoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBTZXRUaGVtZURhdGEoRlhfRFdPUkQgZHdJRCk7DQorICB2b2lkIFNldFRvcExpbmVDb2xvcihGWF9EV09SRCogcERhdGEpOw0KKyAgdm9pZCBTZXRMZWZ0TGluZUNvbG9yKEZYX0RXT1JEKiBwRGF0YSk7DQorICB2b2lkIFNldFJpZ2h0TGluZUNvbG9yKEZYX0RXT1JEKiBwRGF0YSk7DQorICB2b2lkIFNldEJvdHRvbUxpbmVDb2xvcihGWF9EV09SRCogcERhdGEpOw0KKyAgdm9pZCBTZXRCYWNrZ3JvdWRDb2xvcihGWF9EV09SRCogcERhdGEpOw0KKyAgdm9pZCBTZXRDYXB0aW9uQ29sb3IoRlhfRFdPUkQqIHBEYXRhKTsNCisgIHZvaWQgU2V0Q29ybmVyQ29sb3IoRlhfRFdPUkQqIHBEYXRhKTsNCisgIGludDMyX3QgR2V0Q29sb3JJRChGWF9EV09SRCBkd1N0YXRlcyk7DQorDQorICBzdHJ1Y3QgUEJUaGVtZURhdGEgew0KKyAgICBGWF9BUkdCIGNsckJvcmRlcls1XTsNCisgICAgRlhfQVJHQiBjbHJTdGFydFs1XTsNCisgICAgRlhfQVJHQiBjbHJFbmRbNV07DQorICAgIEZYX0FSR0IgY2xyRmlsbFs1XTsNCisgIH0gKiBtX3BUaGVtZURhdGE7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9md2wvdGhlbWUvc2Nyb2xsYmFydHAuaCBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS9zY3JvbGxiYXJ0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YmU0NzQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9md2wvdGhlbWUvc2Nyb2xsYmFydHAuaApAQCAtMCwwICsxLDU1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9TQ1JPTExCQVJUUF9IDQorI2RlZmluZSBfRldMX1NDUk9MTEJBUlRQX0gNCitjbGFzcyBDRldMX1dpZGdldFRQOw0KK2NsYXNzIENGV0xfU2Nyb2xsQmFyVFA7DQorY2xhc3MgQ0ZXTF9TY3JvbGxCYXJUUCA6IHB1YmxpYyBDRldMX1dpZGdldFRQIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9TY3JvbGxCYXJUUCgpOw0KKyAgdmlydHVhbCB+Q0ZXTF9TY3JvbGxCYXJUUCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBTZXRUaGVtZUlEKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3VGhlbWVJRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGlsZHJlbiA9IFRSVUUpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKTsNCisgIHZpcnR1YWwgdm9pZCogR2V0Q2FwYWNpdHkoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQsIEZYX0RXT1JEIGR3Q2FwYWNpdHkpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIERyYXdUaHVtYkJ0bihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJWZXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGF3QnV0dG9uID0gVFJVRSwNCisgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgRHJhd1RyYWNrKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZlcnQsDQorICAgICAgICAgICAgICAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsDQorICAgICAgICAgICAgICAgICBGWF9CT09MIGJMb3dlclRyYWNrLA0KKyAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdm9pZCBEcmF3TWF4TWluQnRuKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfRElSRUNUSU9OIGVEaWN0LA0KKyAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIERyYXdQYXcoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICBGWF9CT09MIGJWZXJ0LA0KKyAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwNCisgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIFNldFRoZW1lRGF0YShGWF9EV09SRCBkd0lEKTsNCisgIHN0cnVjdCBTQlRoZW1lRGF0YSB7DQorICAgIEZYX0FSR0IgY2xyUGF3Q29sb3JMaWdodFs0XTsNCisgICAgRlhfQVJHQiBjbHJQYXdDb2xvckRhcmtbNF07DQorICAgIEZYX0FSR0IgY2xyQnRuQktbNF1bMl07DQorICAgIEZYX0FSR0IgY2xyQnRuQm9yZGVyWzRdOw0KKyAgICBGWF9BUkdCIGNsclRyYWNrQktTdGFydDsNCisgICAgRlhfQVJHQiBjbHJUcmFja0JLRW5kOw0KKyAgfSAqIG1fcFRoZW1lRGF0YTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS91dGlscy5oIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgzZGViZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z3bC90aGVtZS91dGlscy5oCkBAIC0wLDAgKzEsNzIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX1RIRU1FX1VUSUxTX0gNCisjZGVmaW5lIF9GV0xfVEhFTUVfVVRJTFNfSA0KKyNkZWZpbmUgVEhFTUVfWFBTaW1pbGFyDQorZW51bSBGV0xUSEVNRV9FREdFIHsNCisgIEZXTFRIRU1FX0VER0VfRmxhdCA9IDAsDQorICBGV0xUSEVNRV9FREdFX1JhaXNlZCwNCisgIEZXTFRIRU1FX0VER0VfU3Vua2VuDQorfTsNCitlbnVtIEZXTFRIRU1FX1NUQVRFIHsNCisgIEZXTFRIRU1FX1NUQVRFX05vcm1hbCA9IDEsDQorICBGV0xUSEVNRV9TVEFURV9Ib3ZlciwNCisgIEZXTFRIRU1FX1NUQVRFX1ByZXNzZWQsDQorICBGV0xUSEVNRV9TVEFURV9EaXNhYmFsZQ0KK307DQorZW51bSBGV0xUSEVNRV9ESVJFQ1RJT04gew0KKyAgRldMVEhFTUVfRElSRUNUSU9OX1VwID0gMCwNCisgIEZXTFRIRU1FX0RJUkVDVElPTl9Eb3duLA0KKyAgRldMVEhFTUVfRElSRUNUSU9OX0xlZnQsDQorICBGV0xUSEVNRV9ESVJFQ1RJT05fUmlnaHQNCit9Ow0KK3R5cGVkZWYgc3RydWN0IF9GV0xDT0xPUiB7DQorICB1bmlvbiB7DQorICAgIEZYX0RXT1JEIGNvbG9yOw0KKyAgICBzdHJ1Y3Qgew0KKyAgICAgIHVpbnQ4X3QgYjsNCisgICAgICB1aW50OF90IGc7DQorICAgICAgdWludDhfdCByOw0KKyAgICAgIHVpbnQ4X3QgYTsNCisgICAgfTsNCisgIH07DQorDQorICBfRldMQ09MT1IoKSB7IGNvbG9yID0gMDsgfQ0KKyAgX0ZXTENPTE9SKEZYX0RXT1JEIGMpIHsgY29sb3IgPSBjOyB9DQorICBfRldMQ09MT1IoY29uc3QgX0ZXTENPTE9SJiBjKSB7IGNvbG9yID0gYy5jb2xvcjsgfQ0KKw0KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF9GV0xDT0xPUiYgZnJDb2xvcikgeyByZXR1cm4gY29sb3IgPT0gZnJDb2xvci5jb2xvcjsgfQ0KKw0KKyAgb3BlcmF0b3IgRlhfRFdPUkQoKSB7IHJldHVybiBjb2xvcjsgfQ0KK30gRldMQ09MT1I7DQorI2RlZmluZSBGV0xUSEVNRV9CRVpJRVIgMC41NTIyODQ3NDk4MzA4Zg0KKyNkZWZpbmUgRldMVEhFTUVfUEkgMy4xNDE1OTJmDQorI2RlZmluZSBGV0xUSEVNRV9QSV8yXzEgMS41NzA3OTZmDQorI2RlZmluZSBGV0xUSEVNRV9QSV8yXzMgNC43MTIzODhmDQorI2RlZmluZSBGV0xUSEVNRV9DT0xPUl9FREdFTFQxIChBcmdiRW5jb2RlKDI1NSwgMTcyLCAxNjgsIDE1MykpDQorI2RlZmluZSBGV0xUSEVNRV9DT0xPUl9FREdFTFQyIChBcmdiRW5jb2RlKDI1NSwgMTEzLCAxMTEsIDEwMCkpDQorI2RlZmluZSBGV0xUSEVNRV9DT0xPUl9FREdFUkIxIChBcmdiRW5jb2RlKDI1NSwgMjQxLCAyMzksIDIyNikpDQorI2RlZmluZSBGV0xUSEVNRV9DT0xPUl9FREdFUkIyIChBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSkpDQorI2RlZmluZSBGV0xUSEVNRV9DT0xPUl9CYWNrZ3JvdW5kIChBcmdiRW5jb2RlKDI1NSwgMjM2LCAyMzMsIDIxNikpDQorI2RlZmluZSBGV0xUSEVNRV9DT0xPUl9CS1NlbGVjdGVkIChBcmdiRW5jb2RlKDI1NSwgMTUzLCAxOTMsIDIxOCkpDQorI2RlZmluZSBGV0xUSEVNRV9DT0xPUl9HcmVlbl9CS1NlbGVjdGVkIChBcmdiRW5jb2RlKDI1NSwgMTQ3LCAxNjAsIDExMikpDQorI2lmZGVmIFRIRU1FX1hQU2ltaWxhcg0KKyNkZWZpbmUgRldMVEhFTUVfQ0FQQUNJVFlfRWRnZUZsYXQgMi4wZg0KKyNlbHNlDQorI2RlZmluZSBGV0xUSEVNRV9DQVBBQ0lUWV9FZGdlRmxhdCAwLjBmDQorI2VuZGlmDQorI2RlZmluZSBGV0xUSEVNRV9DQVBBQ0lUWV9FZGdlUmFpc2VkIDIuMGYNCisjZGVmaW5lIEZXTFRIRU1FX0NBUEFDSVRZX0VkZ2VTdW5rZW4gMi4wZg0KKyNkZWZpbmUgRldMVEhFTUVfQ0FQQUNJVFlfRm9udFNpemUgMTIuMGYNCisjZGVmaW5lIEZXTFRIRU1FX0NBUEFDSVRZX0xpbmVIZWlnaHQgMTIuMGYNCisjZGVmaW5lIEZXTFRIRU1FX0NBUEFDSVRZX1RleHRDb2xvciAoQXJnYkVuY29kZSgyNTUsIDAsIDAsIDApKQ0KKyNkZWZpbmUgRldMVEhFTUVfQ0FQQUNJVFlfVGV4dFNlbENvbG9yIChBcmdiRW5jb2RlKDI1NSwgMTUzLCAxOTMsIDIxOCkpDQorI2RlZmluZSBGV0xUSEVNRV9DQVBBQ0lUWV9UZXh0RGlzQ29sb3IgKEFyZ2JFbmNvZGUoMjU1LCAxNzIsIDE2OCwgMTUzKSkNCisjZGVmaW5lIEZXTFRIRU1FX0NBUEFDSVRZX1Njcm9sbEJhcldpZHRoIDE3LjBmDQorI2RlZmluZSBGV0xUSEVNRV9DQVBBQ0lUWV9DWEJvcmRlciAxLjBmDQorI2RlZmluZSBGV0xUSEVNRV9DQVBBQ0lUWV9DWUJvcmRlciAxLjBmDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZndsL3RoZW1lL3dpZGdldHRwLmggYi94ZmEvaW5jbHVkZS9md2wvdGhlbWUvd2lkZ2V0dHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDdjYzBkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZndsL3RoZW1lL3dpZGdldHRwLmgKQEAgLTAsMCArMSwxOTkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX1dJREdFVFRQX0gNCisjZGVmaW5lIF9GV0xfV0lER0VUVFBfSA0KK2NsYXNzIElGV0xfVGhlbWVQcm92aWRlcjsNCitjbGFzcyBJRldMX1dpZGdldDsNCitjbGFzcyBJRkRFX1RleHRPdXQ7DQorY2xhc3MgSUZYX0ZvbnQ7DQorY2xhc3MgSUZYX0ZvbnRNZ3I7DQorI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCitjbGFzcyBJRlhfRm9udFNvdXJjZUVudW07DQorI2VuZGlmDQorY2xhc3MgQ0ZXTF9XaWRnZXRUUDsNCitjbGFzcyBDRldMX0Fycm93RGF0YTsNCitjbGFzcyBDRldMX1dpZGdldFRQIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCBGWF9CT09MIElzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRUaGVtZUlEKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgU2V0VGhlbWVJRChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1RoZW1lSUQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hpbGRyZW4gPSBUUlVFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRUaGVtZU1hdHJpeChJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX01hdHJpeCYgbWF0cml4KTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRUaGVtZU1hdHJpeChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3VGV4dChDRldMX1RoZW1lVGV4dCogcFBhcmFtcyk7DQorICB2aXJ0dWFsIHZvaWQqIEdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LCBGWF9EV09SRCBkd0NhcGFjaXR5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0N1c3RvbWl6ZWRMYXlvdXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFBhcnRSZWN0KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LCBDRlhfUmVjdEYmIHJ0UGFydCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNJblBhcnQoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIENhbGNUZXh0UmVjdChDRldMX1RoZW1lVGV4dCogcFBhcmFtcywgQ0ZYX1JlY3RGJiByZWN0KTsNCisgIHZpcnR1YWwgRldMX0VSUiBJbml0aWFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRmluYWxpemUoKTsNCisgIHZpcnR1YWwgfkNGV0xfV2lkZ2V0VFAoKTsNCisgIEZXTF9FUlIgU2V0Rm9udChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogc3RyRm9udCwNCisgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUsDQorICAgICAgICAgICAgICAgICAgRlhfQVJHQiByZ2JGb250KTsNCisgIEZXTF9FUlIgU2V0Rm9udChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICBJRlhfRm9udCogcEZvbnQsDQorICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplLA0KKyAgICAgICAgICAgICAgICAgIEZYX0FSR0IgcmdiRm9udCk7DQorICBJRlhfRm9udCogR2V0Rm9udChJRldMX1dpZGdldCogcFdpZGdldCk7DQorDQorIHByb3RlY3RlZDoNCisgIENGV0xfV2lkZ2V0VFAoKTsNCisgIEZYX0VSUiBJbml0VFRPKCk7DQorICBGWF9FUlIgRmluYWxpemVUVE8oKTsNCisgIHZvaWQgRHJhd0VkZ2UoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGVzLA0KKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIERyYXczRFJlY3QoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgRldMVEhFTUVfRURHRSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGgsDQorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICBGWF9BUkdCIGNyMSwNCisgICAgICAgICAgICAgICAgICBGWF9BUkdCIGNyMiwNCisgICAgICAgICAgICAgICAgICBGWF9BUkdCIGNyMywNCisgICAgICAgICAgICAgICAgICBGWF9BUkdCIGNyNCwNCisgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIERyYXczRENpcmNsZShDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX0VER0UgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBjcjEsDQorICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGNyMiwNCisgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgY3IzLA0KKyAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBjcjQsDQorICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIERyYXdCb3JkZXIoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIEZpbGxCYWNrZ3JvdW5kKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIEZpbGxTb2lsZFJlY3QoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBmaWxsQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIERyYXdBeGlhbFNoYWRpbmcoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5MSwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYmVnaW5Db2xvciwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGVuZENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoKiBwYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmlsbE1vZGUgPSBGWEZJTExfV0lORElORywNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIERyYXdBbm51bHVzUmVjdChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZmlsbENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZSaW5nV2lkdGggPSAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdm9pZCBEcmF3QW5udWx1c0NpcmNsZShDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBmaWxsQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZXaWR0aCA9IDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgRHJhd0ZvY3VzKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgRHJhd0Fycm93KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgIEZXTFRIRU1FX0RJUkVDVElPTiBlRGljdCwNCisgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYkZpbGwsDQorICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcmVzc2VkLA0KKyAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdm9pZCBEcmF3QXJyb3coQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgRldMVEhFTUVfRElSRUNUSU9OIGVEaWN0LA0KKyAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdTaWduLA0KKyAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdm9pZCBEcmF3QnRuKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLA0KKyAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgRHJhd0Fycm93QnRuKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX0RJUkVDVElPTiBlRGljdCwNCisgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIEZXTENPTE9SIEJsZW5kQ29sb3IoRldMQ09MT1Igc3JjQ29sb3IsIEZXTENPTE9SIHJlbmRlckNvbG9yLCB1aW50OF90IHNjYWxlKTsNCisgIEZYX0RXT1JEIG1fZHdSZWZDb3VudDsNCisgIElGREVfVGV4dE91dCogbV9wVGV4dE91dDsNCisgIElGWF9Gb250KiBtX3BGREVGb250Ow0KKyAgRlhfRkxPQVQgbV9mVmFsdWU7DQorICBGWF9EV09SRCBtX2R3VmFsdWU7DQorICBDRlhfUmVjdEYgbV9ydE1hcmdpbjsNCisgIEZYX0RXT1JEIG1fZHdUaGVtZUlEOw0KKyAgQ0ZYX01hdHJpeCBfY3RtOw0KK307DQorRlhfQk9PTCBGV0xUSEVNRV9Jbml0KCk7DQordm9pZCBGV0xUSEVNRV9SZWxlYXNlKCk7DQorRlhfRFdPUkQgRldMX0dldFRoZW1lTGF5b3V0KEZYX0RXT1JEIGR3VGhlbWVJRCk7DQorRlhfRFdPUkQgRldMX0dldFRoZW1lQ29sb3IoRlhfRFdPUkQgZHdUaGVtZUlEKTsNCitGWF9EV09SRCBGV0xfTWFrZVRoZW1lSUQoRlhfRFdPUkQgZHdMYXlvdXQsIEZYX0RXT1JEIGR3Q29sb3IpOw0KK2NsYXNzIENGV0xfQXJyb3dEYXRhIHsNCisgcHVibGljOg0KKyAgc3RhdGljIENGV0xfQXJyb3dEYXRhKiBHZXRJbnN0YW5jZSgpOw0KKyAgc3RhdGljIEZYX0JPT0wgSXNJbnN0YW5jZSgpOw0KKyAgc3RhdGljIHZvaWQgRGVzdHJveUluc3RhbmNlKCk7DQorICB2aXJ0dWFsIH5DRldMX0Fycm93RGF0YSgpOw0KKyAgdm9pZCBTZXRDb2xvckRhdGEoRlhfRFdPUkQgZHdJRCk7DQorDQorICBjbGFzcyBDQ29sb3JEYXRhIHsNCisgICBwdWJsaWM6DQorICAgIEZYX0FSR0IgY2xyQm9yZGVyWzRdOw0KKyAgICBGWF9BUkdCIGNsclN0YXJ0WzRdOw0KKyAgICBGWF9BUkdCIGNsckVuZFs0XTsNCisgICAgRlhfQVJHQiBjbHJTaWduWzRdOw0KKyAgfSAqIG1fcENvbG9yRGF0YTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZXTF9BcnJvd0RhdGEoKTsNCisgIHN0YXRpYyBDRldMX0Fycm93RGF0YSogbV9wSW5zdGFuY2U7DQorfTsNCitjbGFzcyBDRldMX0ZvbnREYXRhIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9Gb250RGF0YSgpOw0KKyAgdmlydHVhbCB+Q0ZXTF9Gb250RGF0YSgpOw0KKyAgRlhfQk9PTCBFcXVhbChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9udEZhbWlseSwNCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSk7DQorICBGWF9CT09MIExvYWRGb250KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb250RmFtaWx5LA0KKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlKTsNCisgIElGWF9Gb250KiBHZXRGb250KCkgY29uc3QgeyByZXR1cm4gbV9wRm9udDsgfQ0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRlhfV2lkZVN0cmluZyBtX3dzRmFtaWx5Ow0KKyAgRlhfRFdPUkQgbV9kd1N0eWxlczsNCisgIEZYX0RXT1JEIG1fZHdDb2RlUGFnZTsNCisgIElGWF9Gb250KiBtX3BGb250Ow0KKyAgSUZYX0ZvbnRNZ3IqIG1fcEZvbnRNZ3I7DQorI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCisgIElGWF9Gb250U291cmNlRW51bSogbV9wRm9udFNvdXJjZTsNCisjZW5kaWYNCit9Ow0KK2NsYXNzIENGV0xfRm9udE1hbmFnZXIgew0KKyBwdWJsaWM6DQorICBDRldMX0ZvbnRNYW5hZ2VyKCk7DQorICB2aXJ0dWFsIH5DRldMX0ZvbnRNYW5hZ2VyKCk7DQorICBJRlhfRm9udCogRmluZEZvbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZvbnRGYW1pbHksDQorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgZHdDb2RlUGFnZSk7DQorDQorIHByb3RlY3RlZDoNCisgIENGWF9QdHJBcnJheSBtX2FyckZvbnRzOw0KK307DQorQ0ZXTF9Gb250TWFuYWdlciogRldMX0dldEZvbnRNYW5hZ2VyKCk7DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZnhiYXJjb2RlL0JDX0JhckNvZGUuaCBiL3hmYS9pbmNsdWRlL2Z4YmFyY29kZS9CQ19CYXJDb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE2NjQ1OAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z4YmFyY29kZS9CQ19CYXJDb2RlLmgKQEAgLTAsMCArMSwyNTcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBYRkFfSU5DTFVERV9GWEJBUkNPREVfQkNfQkFSQ09ERV9IXw0KKyNkZWZpbmUgWEZBX0lOQ0xVREVfRlhCQVJDT0RFX0JDX0JBUkNPREVfSF8NCisNCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmluZy5oIg0KKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmgiDQorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2RpYi5oIg0KKw0KK2NsYXNzIENCQ19SZWFkZXI7DQorY2xhc3MgQ0JDX1dyaXRlcjsNCitjbGFzcyBDRlhfRm9udDsNCitjbGFzcyBDRlhfUmVuZGVyRGV2aWNlOw0KKw0KK2VudW0gQkNfVEVYVF9MT0Mgew0KKyAgQkNfVEVYVF9MT0NfTk9ORSA9IDAsDQorICBCQ19URVhUX0xPQ19BQk9WRSwNCisgIEJDX1RFWFRfTE9DX0JFTE9XLA0KKyAgQkNfVEVYVF9MT0NfQUJPVkVFTUJFRCwNCisgIEJDX1RFWFRfTE9DX0JFTE9XRU1CRUQNCit9Ow0KKw0KK2VudW0gQkNfQ0hBUl9FTkNPRElORyB7IENIQVJfRU5DT0RJTkdfVVRGOCA9IDAsIENIQVJfRU5DT0RJTkdfVU5JQ09ERSB9Ow0KKw0KK2VudW0gQkNfVFlQRSB7DQorICBCQ19VTktOT1dOID0gLTEsDQorICBCQ19DT0RFMzkgPSAwLA0KKyAgQkNfQ09EQUJBUiwNCisgIEJDX0NPREUxMjgsDQorICBCQ19DT0RFMTI4X0IsDQorICBCQ19DT0RFMTI4X0MsDQorICBCQ19FQU44LA0KKyAgQkNfVVBDQSwNCisgIEJDX0VBTjEzLA0KKyAgQkNfUVJfQ09ERSwNCisgIEJDX1BERjQxNywNCisgIEJDX0RBVEFNQVRSSVgNCit9Ow0KKw0KK3ZvaWQgQkNfTGlicmFyeV9Jbml0KCk7DQordm9pZCBCQ19MaWJyYXJ5X0Rlc3RvcnkoKTsNCisNCitjbGFzcyBDQkNfQ29kZUJhc2Ugew0KKyBwdWJsaWM6DQorICBDQkNfQ29kZUJhc2UoKTsNCisgIHZpcnR1YWwgfkNCQ19Db2RlQmFzZSgpOw0KKyAgdmlydHVhbCBCQ19UWVBFIEdldFR5cGUoKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSkgPSAwOw0KKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBEZWNvZGUodWludDhfdCogYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSA9IDA7DQorICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIERlY29kZShDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludDMyX3QmIGUpID0gMDsNCisNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRDaGFyRW5jb2RpbmcoaW50MzJfdCBlbmNvZGluZyk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0TW9kdWxlSGVpZ2h0KGludDMyX3QgbW9kdWxlSGVpZ2h0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRNb2R1bGVXaWR0aChpbnQzMl90IG1vZHVsZVdpZHRoKTsNCisNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRIZWlnaHQoaW50MzJfdCBoZWlnaHQpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldFdpZHRoKGludDMyX3Qgd2lkdGgpOw0KKyAgdmlydHVhbCB2b2lkIFNldEJhY2tncm91bmRDb2xvcihGWF9BUkdCIGJhY2tncm91bmRDb2xvcik7DQorICB2aXJ0dWFsIHZvaWQgU2V0QmFyY29kZUNvbG9yKEZYX0FSR0IgZm9yZWdyb3VuZENvbG9yKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0JDX1dyaXRlciogbV9wQkNXcml0ZXI7DQorICBDQkNfUmVhZGVyKiBtX3BCQ1JlYWRlcjsNCit9Ow0KK2NsYXNzIENCQ19PbmVDb2RlIDogcHVibGljIENCQ19Db2RlQmFzZSB7DQorIHB1YmxpYzoNCisgIENCQ19PbmVDb2RlKCk7DQorICB2aXJ0dWFsIH5DQkNfT25lQ29kZSgpOw0KKyAgdmlydHVhbCBCQ19UWVBFIEdldFR5cGUoKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSkgPSAwOw0KKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBEZWNvZGUodWludDhfdCogYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSA9IDA7DQorICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIERlY29kZShDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludDMyX3QmIGUpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBDaGVja0NvbnRlbnRWYWxpZGl0eShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsNCisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgRmlsdGVyQ29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7DQorICB2aXJ0dWFsIHZvaWQgU2V0UHJpbnRDaGVja3N1bShGWF9CT09MIGNoZWNrc3VtKTsNCisgIHZpcnR1YWwgdm9pZCBTZXREYXRhTGVuZ3RoKGludDMyX3QgbGVuZ3RoKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRDYWxDaGVja3N1bShGWF9CT09MIGNhbGMpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldEZvbnQoQ0ZYX0ZvbnQqIGNGb250KTsNCisgIHZpcnR1YWwgdm9pZCBTZXRGb250U2l6ZShGWF9GTE9BVCBzaXplKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRGb250U3R5bGUoaW50MzJfdCBzdHlsZSk7DQorICB2aXJ0dWFsIHZvaWQgU2V0Rm9udENvbG9yKEZYX0FSR0IgY29sb3IpOw0KK307DQorY2xhc3MgQ0JDX0NvZGUzOSA6IHB1YmxpYyBDQkNfT25lQ29kZSB7DQorIHB1YmxpYzoNCisgIENCQ19Db2RlMzkoKTsNCisgIENCQ19Db2RlMzkoRlhfQk9PTCB1c2luZ0NoZWNrRGlnaXQpOw0KKyAgQ0JDX0NvZGUzOShGWF9CT09MIHVzaW5nQ2hlY2tEaWdpdCwgRlhfQk9PTCBleHRlbmRlZE1vZGUpOw0KKyAgdmlydHVhbCB+Q0JDX0NvZGUzOSgpOw0KKyAgRlhfQk9PTCBFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywgRlhfQk9PTCBpc0RldmljZSwgaW50MzJfdCYgZSk7DQorICBGWF9CT09MIFJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsDQorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIEZYX0JPT0wgUmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcComIHBPdXRCaXRtYXAsIGludDMyX3QmIGUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgRGVjb2RlKHVpbnQ4X3QqIGJ1ZiwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoaWdodCwgaW50MzJfdCYgZSk7DQorICBDRlhfV2lkZVN0cmluZyBEZWNvZGUoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQzMl90JiBlKTsNCisgIEJDX1RZUEUgR2V0VHlwZSgpIHsgcmV0dXJuIEJDX0NPREUzOTsgfQ0KKyAgRlhfQk9PTCBTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pOw0KKyAgRlhfQk9PTCBTZXRXaWRlTmFycm93UmF0aW8oaW50MzJfdCByYXRpbyk7DQorDQorIHByaXZhdGU6DQorICBDRlhfV2lkZVN0cmluZyBtX3JlbmRlckNvbnRlbnRzOw0KK307DQorY2xhc3MgQ0JDX0NvZGFiYXIgOiBwdWJsaWMgQ0JDX09uZUNvZGUgew0KKyBwdWJsaWM6DQorICBDQkNfQ29kYWJhcigpOw0KKyAgdmlydHVhbCB+Q0JDX0NvZGFiYXIoKTsNCisgIEZYX0JPT0wgRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIEZYX0JPT0wgaXNEZXZpY2UsIGludDMyX3QmIGUpOw0KKyAgRlhfQk9PTCBSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBGWF9CT09MIFJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAqJiBwT3V0Qml0bWFwLCBpbnQzMl90JiBlKTsNCisgIENGWF9XaWRlU3RyaW5nIERlY29kZSh1aW50OF90KiBidWYsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGlnaHQsIGludDMyX3QmIGUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgRGVjb2RlKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50MzJfdCYgZSk7DQorICBCQ19UWVBFIEdldFR5cGUoKSB7IHJldHVybiBCQ19DT0RBQkFSOyB9DQorICBGWF9CT09MIFNldFN0YXJ0Q2hhcihGWF9DSEFSIHN0YXJ0KTsNCisgIEZYX0JPT0wgU2V0RW5kQ2hhcihGWF9DSEFSIGVuZCk7DQorICBGWF9CT09MIFNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbik7DQorICBGWF9CT09MIFNldFdpZGVOYXJyb3dSYXRpbyhpbnQzMl90IHJhdGlvKTsNCisNCisgcHJpdmF0ZToNCisgIENGWF9XaWRlU3RyaW5nIG1fcmVuZGVyQ29udGVudHM7DQorfTsNCitjbGFzcyBDQkNfQ29kZTEyOCA6IHB1YmxpYyBDQkNfT25lQ29kZSB7DQorIHB1YmxpYzoNCisgIENCQ19Db2RlMTI4KEJDX1RZUEUgdHlwZSk7DQorICB2aXJ0dWFsIH5DQkNfQ29kZTEyOCgpOw0KKyAgRlhfQk9PTCBFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywgRlhfQk9PTCBpc0RldmljZSwgaW50MzJfdCYgZSk7DQorICBGWF9CT09MIFJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsDQorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIEZYX0JPT0wgUmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcComIHBPdXRCaXRtYXAsIGludDMyX3QmIGUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgRGVjb2RlKHVpbnQ4X3QqIGJ1ZiwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoaWdodCwgaW50MzJfdCYgZSk7DQorICBDRlhfV2lkZVN0cmluZyBEZWNvZGUoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQzMl90JiBlKTsNCisgIEJDX1RZUEUgR2V0VHlwZSgpIHsgcmV0dXJuIEJDX0NPREUxMjg7IH0NCisgIEZYX0JPT0wgU2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY3Rpb24pOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV9yZW5kZXJDb250ZW50czsNCit9Ow0KK2NsYXNzIENCQ19FQU44IDogcHVibGljIENCQ19PbmVDb2RlIHsNCisgcHVibGljOg0KKyAgQ0JDX0VBTjgoKTsNCisgIHZpcnR1YWwgfkNCQ19FQU44KCk7DQorICBGWF9CT09MIEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBpbnQzMl90JiBlKTsNCisgIEZYX0JPT0wgUmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgRlhfQk9PTCBSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSk7DQorICBDRlhfV2lkZVN0cmluZyBEZWNvZGUodWludDhfdCogYnVmLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhpZ2h0LCBpbnQzMl90JiBlKTsNCisgIENGWF9XaWRlU3RyaW5nIERlY29kZShDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludDMyX3QmIGUpOw0KKyAgQkNfVFlQRSBHZXRUeXBlKCkgeyByZXR1cm4gQkNfRUFOODsgfQ0KKw0KKyBwcml2YXRlOg0KKyAgQ0ZYX1dpZGVTdHJpbmcgUHJlcHJvY2Vzcyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsNCisgIENGWF9XaWRlU3RyaW5nIG1fcmVuZGVyQ29udGVudHM7DQorfTsNCitjbGFzcyBDQkNfRUFOMTMgOiBwdWJsaWMgQ0JDX09uZUNvZGUgew0KKyBwdWJsaWM6DQorICBDQkNfRUFOMTMoKTsNCisgIHZpcnR1YWwgfkNCQ19FQU4xMygpOw0KKyAgRlhfQk9PTCBFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywgRlhfQk9PTCBpc0RldmljZSwgaW50MzJfdCYgZSk7DQorICBGWF9CT09MIFJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsDQorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIEZYX0JPT0wgUmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcComIHBPdXRCaXRtYXAsIGludDMyX3QmIGUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgRGVjb2RlKHVpbnQ4X3QqIGJ1ZiwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoaWdodCwgaW50MzJfdCYgZSk7DQorICBDRlhfV2lkZVN0cmluZyBEZWNvZGUoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQzMl90JiBlKTsNCisgIEJDX1RZUEUgR2V0VHlwZSgpIHsgcmV0dXJuIEJDX0VBTjEzOyB9DQorDQorIHByaXZhdGU6DQorICBDRlhfV2lkZVN0cmluZyBQcmVwcm9jZXNzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV9yZW5kZXJDb250ZW50czsNCit9Ow0KK2NsYXNzIENCQ19VUENBIDogcHVibGljIENCQ19PbmVDb2RlIHsNCisgcHVibGljOg0KKyAgQ0JDX1VQQ0EoKTsNCisgIHZpcnR1YWwgfkNCQ19VUENBKCk7DQorICBGWF9CT09MIEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLCBGWF9CT09MIGlzRGV2aWNlLCBpbnQzMl90JiBlKTsNCisgIEZYX0JPT0wgUmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgRlhfQk9PTCBSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSk7DQorICBDRlhfV2lkZVN0cmluZyBEZWNvZGUodWludDhfdCogYnVmLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhpZ2h0LCBpbnQzMl90JiBlKTsNCisgIENGWF9XaWRlU3RyaW5nIERlY29kZShDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludDMyX3QmIGUpOw0KKyAgQkNfVFlQRSBHZXRUeXBlKCkgeyByZXR1cm4gQkNfVVBDQTsgfQ0KKw0KKyBwcml2YXRlOg0KKyAgQ0ZYX1dpZGVTdHJpbmcgUHJlcHJvY2Vzcyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsNCisgIENGWF9XaWRlU3RyaW5nIG1fcmVuZGVyQ29udGVudHM7DQorfTsNCitjbGFzcyBDQkNfUVJDb2RlIDogcHVibGljIENCQ19Db2RlQmFzZSB7DQorIHB1YmxpYzoNCisgIENCQ19RUkNvZGUoKTsNCisgIHZpcnR1YWwgfkNCQ19RUkNvZGUoKTsNCisgIEZYX0JPT0wgRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIEZYX0JPT0wgaXNEZXZpY2UsIGludDMyX3QmIGUpOw0KKyAgRlhfQk9PTCBSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBGWF9CT09MIFJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAqJiBwT3V0Qml0bWFwLCBpbnQzMl90JiBlKTsNCisgIENGWF9XaWRlU3RyaW5nIERlY29kZSh1aW50OF90KiBidWYsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGlnaHQsIGludDMyX3QmIGUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgRGVjb2RlKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50MzJfdCYgZSk7DQorICBCQ19UWVBFIEdldFR5cGUoKSB7IHJldHVybiBCQ19RUl9DT0RFOyB9DQorICBGWF9CT09MIFNldFZlcnNpb24oaW50MzJfdCB2ZXJzaW9uKTsNCisgIEZYX0JPT0wgU2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoaW50MzJfdCBsZXZlbCk7DQorfTsNCitjbGFzcyBDQkNfUERGNDE3SSA6IHB1YmxpYyBDQkNfQ29kZUJhc2Ugew0KKyBwdWJsaWM6DQorICBDQkNfUERGNDE3SSgpOw0KKyAgdmlydHVhbCB+Q0JDX1BERjQxN0koKTsNCisgIEZYX0JPT0wgRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIEZYX0JPT0wgaXNEZXZpY2UsIGludDMyX3QmIGUpOw0KKyAgRlhfQk9PTCBSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBGWF9CT09MIFJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAqJiBwT3V0Qml0bWFwLCBpbnQzMl90JiBlKTsNCisgIENGWF9XaWRlU3RyaW5nIERlY29kZSh1aW50OF90KiBidWYsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGlnaHQsIGludDMyX3QmIGUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgRGVjb2RlKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50MzJfdCYgZSk7DQorICBCQ19UWVBFIEdldFR5cGUoKSB7IHJldHVybiBCQ19QREY0MTc7IH0NCisgIEZYX0JPT0wgU2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoaW50MzJfdCBsZXZlbCk7DQorICB2b2lkIFNldFRydW5jYXRlZChGWF9CT09MIHRydW5jYXRlZCk7DQorfTsNCitjbGFzcyBDQkNfRGF0YU1hdHJpeCA6IHB1YmxpYyBDQkNfQ29kZUJhc2Ugew0KKyBwdWJsaWM6DQorICBDQkNfRGF0YU1hdHJpeCgpOw0KKyAgdmlydHVhbCB+Q0JDX0RhdGFNYXRyaXgoKTsNCisgIEZYX0JPT0wgRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsIEZYX0JPT0wgaXNEZXZpY2UsIGludDMyX3QmIGUpOw0KKyAgRlhfQk9PTCBSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBGWF9CT09MIFJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAqJiBwT3V0Qml0bWFwLCBpbnQzMl90JiBlKTsNCisgIENGWF9XaWRlU3RyaW5nIERlY29kZSh1aW50OF90KiBidWYsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGlnaHQsIGludDMyX3QmIGUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgRGVjb2RlKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50MzJfdCYgZSk7DQorICBCQ19UWVBFIEdldFR5cGUoKSB7IHJldHVybiBCQ19EQVRBTUFUUklYOyB9DQorfTsNCisNCisjZW5kaWYgIC8vIFhGQV9JTkNMVURFX0ZYQkFSQ09ERV9CQ19CQVJDT0RFX0hfDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZnhmYS9meGZhLmggYi94ZmEvaW5jbHVkZS9meGZhL2Z4ZmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDM5MDlhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZnhmYS9meGZhLmgKQEAgLTAsMCArMSw4NDUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBGWEZBX0hfDQorI2RlZmluZSBGWEZBX0hfDQorDQorY2xhc3MgQ0ZYX0dyYXBoaWNzOw0KK2NsYXNzIENQREZfRG9jdW1lbnQ7DQorY2xhc3MgQ1hGQV9Ob2RlOw0KK2NsYXNzIENYRkFfTm9kZUxpc3Q7DQorY2xhc3MgQ1hGQV9XaWRnZXRBY2M7DQorY2xhc3MgSUZERV9YTUxFbGVtZW50Ow0KK2NsYXNzIElGV0xfQWRhcHRlclRpbWVyTWdyOw0KK2NsYXNzIElGWF9Gb250Ow0KK2NsYXNzIElYRkFfQXBwOw0KK2NsYXNzIElYRkFfQXBwUHJvdmlkZXI7DQorY2xhc3MgSVhGQV9DaGVja3N1bUNvbnRleHQ7DQorY2xhc3MgSVhGQV9Eb2NIYW5kbGVyOw0KK2NsYXNzIElYRkFfRG9jUHJvdmlkZXI7DQorY2xhc3MgSVhGQV9Eb2NWaWV3Ow0KK2NsYXNzIElYRkFfRm9udE1ncjsNCitjbGFzcyBJWEZBX01lbnVIYW5kbGVyOw0KK2NsYXNzIElYRkFfUGFnZVZpZXc7DQorY2xhc3MgSVhGQV9QYWdlVmlld1JlbmRlcjsNCitjbGFzcyBJWEZBX1dpZGdldEFjY0l0ZXJhdG9yOw0KK2NsYXNzIElYRkFfV2lkZ2V0SGFuZGxlcjsNCitjbGFzcyBJWEZBX1dpZGdldEl0ZXJhdG9yOw0KKw0KK2NsYXNzIElYRkFfRG9jIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SVhGQV9Eb2MoKSB7fQ0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJWEZBX0RvYygpIHt9DQorfTsNCisNCitjbGFzcyBJWEZBX1dpZGdldCB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklYRkFfV2lkZ2V0KCkge30NCisNCisgcHJvdGVjdGVkOg0KKyAgSVhGQV9XaWRnZXQoKSB7fQ0KK307DQorDQorI2luY2x1ZGUgImZ4ZmFfYmFzaWMuaCINCisjaW5jbHVkZSAiZnhmYV93aWRnZXQuaCINCisjZGVmaW5lIFhGQV9NQklDT05fRXJyb3IgMA0KKyNkZWZpbmUgWEZBX01CSUNPTl9XYXJuaW5nIDENCisjZGVmaW5lIFhGQV9NQklDT05fUXVlc3Rpb24gMg0KKyNkZWZpbmUgWEZBX01CSUNPTl9TdGF0dXMgMw0KKyNkZWZpbmUgWEZBX01CX09LIDANCisjZGVmaW5lIFhGQV9NQl9PS0NhbmNlbCAxDQorI2RlZmluZSBYRkFfTUJfWWVzTm8gMg0KKyNkZWZpbmUgWEZBX01CX1llc05vQ2FuY2VsIDMNCisjZGVmaW5lIFhGQV9JRE9LIDENCisjZGVmaW5lIFhGQV9JRENhbmNlbCAyDQorI2RlZmluZSBYRkFfSURObyAzDQorI2RlZmluZSBYRkFfSURZZXMgNA0KKyNkZWZpbmUgWEZBX0lEU19WYWxpZGF0ZUZhaWxlZCAxDQorI2RlZmluZSBYRkFfSURTX0NhbGNPdmVycmlkZSAyDQorI2RlZmluZSBYRkFfSURTX01vZGlmeUZpZWxkIDMNCisjZGVmaW5lIFhGQV9JRFNfTm90TW9kaWZ5RmllbGQgNA0KKyNkZWZpbmUgWEZBX0lEU19BcHBOYW1lIDUNCisjZGVmaW5lIFhGQV9JRFNfSW1hZ2VGaWx0ZXIgNg0KKyNkZWZpbmUgWEZBX0lEU19VTktOT1dfQ0FUQ0hFRCA3DQorI2RlZmluZSBYRkFfSURTX1VuYWJsZV9UT19TRVQgOA0KKyNkZWZpbmUgWEZBX0lEU19WQUxVRV9FWENBTE1BVE9SWSA5DQorI2RlZmluZSBYRkFfSURTX0lOVkFMSURfRU5VTV9WQUxVRSAxMA0KKyNkZWZpbmUgWEZBX0lEU19VTlNVUFBPUlRfTUVUSE9EIDExDQorI2RlZmluZSBYRkFfSURTX1VOU1VQUE9SVF9QUk9QIDEyDQorI2RlZmluZSBYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQgMTMNCisjZGVmaW5lIFhGQV9JRFNfTk9UX0RFRkFVTF9WQUxVRSAxNA0KKyNkZWZpbmUgWEZBX0lEU19VTkFCTEVfU0VUX0xBTkdVQUdFIDE1DQorI2RlZmluZSBYRkFfSURTX1VOQUJMRV9TRVRfTlVNUEFHRVMgMTYNCisjZGVmaW5lIFhGQV9JRFNfVU5BQkxFX1NFVF9QTEFURk9STSAxNw0KKyNkZWZpbmUgWEZBX0lEU19VTkFCTEVfU0VUX1ZBTElEQVRJT05FTkFCTEUgMTgNCisjZGVmaW5lIFhGQV9JRFNfVU5BQkxFX1NFVF9WQVJJQVRJT04gMTkNCisjZGVmaW5lIFhGQV9JRFNfVU5BQkxFX1NFVF9WRVJTSU9OIDIwDQorI2RlZmluZSBYRkFfSURTX1VOQUJMRV9TRVRfUkVBRFkgMjENCisjZGVmaW5lIFhGQV9JRFNfTlVNQkVSX09GX09DQ1VSIDIyDQorI2RlZmluZSBYRkFfSURTX1VOQUJMRV9TRVRfQ0xBU1NfTkFNRSAyMw0KKyNkZWZpbmUgWEZBX0lEU19VTkFCTEVfU0VUX0xFTkdUSF9WQUxVRSAyNA0KKyNkZWZpbmUgWEZBX0lEU19VTlNVUFBPUlRfQ0hBUiAyNQ0KKyNkZWZpbmUgWEZBX0lEU19CQURfU1VGRklYIDI2DQorI2RlZmluZSBYRkFfSURTX0VYUEVDVEVEX0lERU5UIDI3DQorI2RlZmluZSBYRkFfSURTX0VYUEVDVEVEX1NUUklORyAyOA0KKyNkZWZpbmUgWEZBX0lEU19JTlZBTElEQVRFX0NIQVIgMjkNCisjZGVmaW5lIFhGQV9JRFNfUkVERUZJTklUSU9OIDMwDQorI2RlZmluZSBYRkFfSURTX0lOVkFMSURBVEVfVE9LRU4gMzENCisjZGVmaW5lIFhGQV9JRFNfSU5WQUxJREFURV9FWFBSRVNTSU9OIDMyDQorI2RlZmluZSBYRkFfSURTX1VOREVGSU5FX0lERU5USUZJRVIgMzMNCisjZGVmaW5lIFhGQV9JRFNfSU5WQUxJREFURV9MRUZUVkFMVUUgMzQNCisjZGVmaW5lIFhGQV9JRFNfQ09NUElMRVJfRVJST1IgMzUNCisjZGVmaW5lIFhGQV9JRFNfQ0FOTk9UX01PRElGWV9WQUxVRSAzNg0KKyNkZWZpbmUgWEZBX0lEU19FUlJPUl9QQVJBTUVURVJTIDM3DQorI2RlZmluZSBYRkFfSURTX0VYUEVDVF9FTkRJRiAzOA0KKyNkZWZpbmUgWEZBX0lEU19VTkVYUEVDVEVEX0VYUFJFU1NJT04gMzkNCisjZGVmaW5lIFhGQV9JRFNfQ09ORElUSU9OX0lTX05VTEwgNDANCisjZGVmaW5lIFhGQV9JRFNfSUxMRUdBTEJSRUFLIDQxDQorI2RlZmluZSBYRkFfSURTX0lMTEVHQUxDT05USU5VRSA0Mg0KKyNkZWZpbmUgWEZBX0lEU19FWFBFQ1RFRF9PUEVSQVRPUiA0Mw0KKyNkZWZpbmUgWEZBX0lEU19ESVZJREVfWkVSTyA0NA0KKyNkZWZpbmUgWEZBX0lEU19DQU5OT1RfQ09WRVJUX09CSkVDVCA0NQ0KKyNkZWZpbmUgWEZBX0lEU19OT1RfRk9VTkRfQ09OVEFJTkVSIDQ2DQorI2RlZmluZSBYRkFfSURTX05PVF9GT1VORF9QUk9QRVJUWSA0Nw0KKyNkZWZpbmUgWEZBX0lEU19OT1RfRk9VTkRfTUVUSE9EIDQ4DQorI2RlZmluZSBYRkFfSURTX05PVF9GT1VORF9DT05TVCA0OQ0KKyNkZWZpbmUgWEZBX0lEU19OT1RfQVNTSUdOX09CSkVDVCA1MA0KKyNkZWZpbmUgWEZBX0lEU19JVkFMSURBVEVfSU5TVFJVQ1RJT04gNTENCisjZGVmaW5lIFhGQV9JRFNfRVhQRUNUX05VTUJFUiA1Mg0KKyNkZWZpbmUgWEZBX0lEU19WQUxJREFURV9PVVRfQVJSQVkgNTMNCisjZGVmaW5lIFhGQV9JRFNfQ0FOTk9UX0FTU0lHTl9JREVOVCA1NA0KKyNkZWZpbmUgWEZBX0lEU19OT1RfRk9VTlRfRlVOQ1RJT04gNTUNCisjZGVmaW5lIFhGQV9JRFNfTk9UX0FSUkFZIDU2DQorI2RlZmluZSBYRkFfSURTX09VVF9BUlJBWSA1Nw0KKyNkZWZpbmUgWEZBX0lEU19OT1RfU1VQUE9SVF9DQUxDIDU4DQorI2RlZmluZSBYRkFfSURTX0FSR1VNRU5UX05PVF9BUlJBWSA1OQ0KKyNkZWZpbmUgWEZBX0lEU19BUkdVTUVOVF9FWFBFQ1RfQ09OVEFJTkVSIDYwDQorI2RlZmluZSBYRkFfSURTX0FDQ0VTU19QUk9QRVJUWV9JTl9OT1RfT0JKRUNUIDYxDQorI2RlZmluZSBYRkFfSURTX0ZVTkNUSU9OX0lTX0JVSUxESU4gNjINCisjZGVmaW5lIFhGQV9JRFNfRVJST1JfTVNHIDYzDQorI2RlZmluZSBYRkFfSURTX0lOREVYX09VVF9PRl9CT1VORFMgNjQNCisjZGVmaW5lIFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QgNjUNCisjZGVmaW5lIFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0ggNjYNCisjZGVmaW5lIFhGQV9JRFNfSU5WQUxJRF9FTlVNRVJBVEUgNjcNCisjZGVmaW5lIFhGQV9JRFNfSU5WQUxJRF9BUFBFTkQgNjgNCisjZGVmaW5lIFhGQV9JRFNfU09NX0VYUEVDVEVEX0xJU1QgNjkNCisjZGVmaW5lIFhGQV9JRFNfTk9UX0hBVkVfUFJPUEVSVFkgNzANCisjZGVmaW5lIFhGQV9JRFNfSU5WQUxJRF9OT0RFX1RZUEUgNzENCisjZGVmaW5lIFhGQV9JRFNfVklPTEFURV9CT1VOREFSWSA3Mg0KKyNkZWZpbmUgWEZBX0lEU19TRVJWRVJfREVOWSA3Mw0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X1N1biA3NA0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X01vbiA3NQ0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X1R1ZSA3Ng0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X1dlZCA3Nw0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X1RodSA3OA0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X0ZyaSA3OQ0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdXZWVrRGF5X1NhdCA4MA0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdNb250aF9KYW4gODENCisjZGVmaW5lIFhGQV9JRFNfU3RyaW5nTW9udGhfRmViIDgyDQorI2RlZmluZSBYRkFfSURTX1N0cmluZ01vbnRoX01hcmNoIDgzDQorI2RlZmluZSBYRkFfSURTX1N0cmluZ01vbnRoX0FwcmlsIDg0DQorI2RlZmluZSBYRkFfSURTX1N0cmluZ01vbnRoX01heSA4NQ0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdNb250aF9KdW5lIDg2DQorI2RlZmluZSBYRkFfSURTX1N0cmluZ01vbnRoX0p1bHkgODcNCisjZGVmaW5lIFhGQV9JRFNfU3RyaW5nTW9udGhfQXVnIDg4DQorI2RlZmluZSBYRkFfSURTX1N0cmluZ01vbnRoX1NlcHQgODkNCisjZGVmaW5lIFhGQV9JRFNfU3RyaW5nTW9udGhfT2N0IDkwDQorI2RlZmluZSBYRkFfSURTX1N0cmluZ01vbnRoX05vdiA5MQ0KKyNkZWZpbmUgWEZBX0lEU19TdHJpbmdNb250aF9EZWMgOTINCisjZGVmaW5lIFhGQV9JRFNfU3RyaW5nX1RvZGF5IDkzDQorI2RlZmluZSBYRkFfSURTX1ZhbGlkYXRlTGltaXQgOTQNCisjZGVmaW5lIFhGQV9JRFNfVmFsaWRhdGVOdWxsV2FybmluZyA5NQ0KKyNkZWZpbmUgWEZBX0lEU19WYWxpZGF0ZU51bGxFcnJvciA5Ng0KKyNkZWZpbmUgWEZBX0lEU19WYWxpZGF0ZVdhcm5pbmcgOTcNCisjZGVmaW5lIFhGQV9JRFNfVmFsaWRhdGVFcnJvciA5OA0KKyNkZWZpbmUgWEZBX0lEU19WYWxpZGF0ZU51bWJlckVycm9yIDk5DQorDQorLy8gUHJvYmFibHkgc2hvdWxkIGJlIGNhbGxlZCBJWEZBX0FwcERlbGVnYXRlLg0KK2NsYXNzIElYRkFfQXBwUHJvdmlkZXIgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JWEZBX0FwcFByb3ZpZGVyKCkge30NCisNCisgIC8qKg0KKyAgICogU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBjbGllbnQgYXBwbGljYXRpb24gaW4gd2hpY2ggYSBmb3JtIGN1cnJlbnRseQ0KKyAgICogZXhpc3RzLiBTdWNoIGFzIEV4Y2hhbmdlLVByby4NCisgICAqLw0KKyAgdmlydHVhbCB2b2lkIFNldEFwcFR5cGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0FwcFR5cGUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXRBcHBUeXBlKENGWF9XaWRlU3RyaW5nJiB3c0FwcFR5cGUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRGb3hpdEFwcFR5cGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZveGl0QXBwVHlwZSkge30NCisgIHZpcnR1YWwgdm9pZCBHZXRGb3hpdEFwcFR5cGUoQ0ZYX1dpZGVTdHJpbmcmIHdzRm94aXRBcHBUeXBlKSB7DQorICAgIHdzRm94aXRBcHBUeXBlLkVtcHR5KCk7DQorICB9DQorDQorICAvKioNCisgICAqIFJldHVybnMgdGhlIGxhbmd1YWdlIG9mIHRoZSBydW5uaW5nIGhvc3QgYXBwbGljYXRpb24uIFN1Y2ggYXMgemhfQ04NCisgICAqLw0KKyAgdmlydHVhbCB2b2lkIEdldExhbmd1YWdlKENGWF9XaWRlU3RyaW5nJiB3c0xhbmd1YWdlKSA9IDA7DQorDQorICAvKioNCisgICAqIFJldHVybnMgdGhlIHBsYXRmb3JtIG9mIHRoZSBtYWNoaW5lIHJ1bm5pbmcgdGhlIHNjcmlwdC4gU3VjaCBhcyBXSU4NCisgICAqLw0KKyAgdmlydHVhbCB2b2lkIEdldFBsYXRmb3JtKENGWF9XaWRlU3RyaW5nJiB3c1BsYXRmb3JtKSA9IDA7DQorDQorICAvKioNCisgICAqIEluZGljYXRlcyB0aGUgcGFja2FnaW5nIG9mIHRoZSBhcHBsaWNhdGlvbiB0aGF0IGlzIHJ1bm5pbmcgdGhlIHNjcmlwdC4gU3VjaA0KKyAgICogYXMgRnVsbA0KKyAgICovDQorICB2aXJ0dWFsIHZvaWQgR2V0VmFyaWF0aW9uKENGWF9XaWRlU3RyaW5nJiB3c1ZhcmlhdGlvbikgPSAwOw0KKw0KKyAgLyoqDQorICAgKiBJbmRpY2F0ZXMgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uLiBTdWNoIGFzIDkNCisgICAqLw0KKyAgdmlydHVhbCB2b2lkIEdldFZlcnNpb24oQ0ZYX1dpZGVTdHJpbmcmIHdzVmVyc2lvbikgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldEZveGl0VmVyc2lvbihDRlhfV2lkZVN0cmluZyYgd3NGb3hpdFZlcnNpb24pIHsNCisgICAgd3NGb3hpdFZlcnNpb24uRW1wdHkoKTsNCisgIH0NCisNCisgIC8qKg0KKyAgICogR2V0IGFwcGxpY2F0aW9uIG5hbWUsIHN1Y2ggYXMgUGhhbnRvbS4NCisgICAqLw0KKyAgdmlydHVhbCB2b2lkIEdldEFwcE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldEZveGl0QXBwTmFtZShDRlhfV2lkZVN0cmluZyYgd3NGb3hpdE5hbWUpIHsNCisgICAgd3NGb3hpdE5hbWUuRW1wdHkoKTsNCisgIH0NCisNCisgIC8qKg0KKyAgICogQ2F1c2VzIHRoZSBzeXN0ZW0gdG8gcGxheSBhIHNvdW5kLg0KKyAgICogQHBhcmFtW2luXSBkd1R5cGUgVGhlIHN5c3RlbSBjb2RlIGZvciB0aGUgYXBwcm9wcmlhdGUgc291bmQuMCAoRXJyb3IpMQ0KKyAgICogKFdhcm5pbmcpMiAoUXVlc3Rpb24pMyAoU3RhdHVzKTQgKERlZmF1bHQpDQorICAgKi8NCisgIHZpcnR1YWwgdm9pZCBCZWVwKEZYX0RXT1JEIGR3VHlwZSkgPSAwOw0KKw0KKyAgLyoqDQorICAgKiBEaXNwbGF5cyBhIG1lc3NhZ2UgYm94Lg0KKyAgICogQHBhcmFtW2luXSBkd0ljb25UeXBlICAgIEljb24gdHlwZSwgcmVmZXIgdG8gWEZBX01CSUNPTi4NCisgICAqIEBwYXJhbVtpbl0gZHdCdXR0b25UeXBlICBCdXR0b24gdHlwZSwgcmVmZXIgdG8gWEZBX01FU1NBR0VCVVRUT04uDQorICAgKiBAcmV0dXJuIEEgdmFsaWQgaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSBidXR0b24gcHJlc3NlZCBieSB0aGUNCisgICAqIHVzZXIsIHJlZmVyIHRvIFhGQV9JRC4NCisgICAqLw0KKyAgdmlydHVhbCBpbnQzMl90IE1zZ0JveChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTWVzc2FnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RpdGxlID0gRlhfV1NUUkMoTCIiKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdJY29uVHlwZSA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3QnV0dG9uVHlwZSA9IDApID0gMDsNCisNCisgIC8qKg0KKyAgICogR2V0IGEgcmVzcG9uc2UgZnJvbSB0aGUgdXNlci4NCisgICAqIEBwYXJhbVtpbl0gYk1hcmsgLSBNYXNrIHRoZSB1c2VyIGlucHV0IHdpdGggKiAoYXN0ZXJpc2tzKSB3aGVuIHRydWUsDQorICAgKi8NCisgIHZpcnR1YWwgdm9pZCBSZXNwb25zZShDRlhfV2lkZVN0cmluZyYgd3NBbnN3ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1F1ZXN0aW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUaXRsZSA9IEZYX1dTVFJDKEwiIiksDQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0RlZmF1bHRBbnN3ZXIgPSBGWF9XU1RSQyhMIiIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1hcmsgPSBUUlVFKSA9IDA7DQorDQorICB2aXJ0dWFsIGludDMyX3QgR2V0RG9jdW1lbnRDb3VudEluQmF0Y2goKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q3VyRG9jdW1lbnRJbkJhdGNoKCkgPSAwOw0KKw0KKyAgLyoqDQorICAgKiBEb3dubG9hZCBzb21ldGhpbmcgZnJvbSBzb21ld2hlcmUuDQorICAgKiBAcGFyYW1baW5dIHdzVVJMIC0gaHR0cCwgZnRwLCBzdWNoIGFzDQorICAgKiAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbC1uYW1lcy8iLg0KKyAgICovDQorICB2aXJ0dWFsIElGWF9GaWxlUmVhZCogRG93bmxvYWRVUkwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1VSTCkgPSAwOw0KKw0KKyAgLyoqDQorICAgKiBQT1NUIGRhdGEgdG8gdGhlIGdpdmVuIHVybC4NCisgICAqIEBwYXJhbVtpbl0gd3NVUkwgICAgICAgICB0aGUgVVJMIGJlaW5nIHVwbG9hZGVkLg0KKyAgICogQHBhcmFtW2luXSB3c0RhdGEgICAgICAgIHRoZSBkYXRhIGJlaW5nIHVwbG9hZGVkLg0KKyAgICogQHBhcmFtW2luXSB3c0NvbnRlbnRUeXBlIHRoZSBjb250ZW50IHR5cGUgb2YgZGF0YSBpbmNsdWRpbmcgdGV4dC9odG1sLA0KKyAgICogdGV4dC94bWwsIHRleHQvcGxhaW4sIG11bHRpcGFydC9mb3JtLWRhdGEsDQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkLA0KKyAgICogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtLCBhbnkgdmFsaWQgTUlNRSB0eXBlLg0KKyAgICogQHBhcmFtW2luXSB3c0VuY29kZSAgICAgIHRoZSBlbmNvZGUgb2YgZGF0YSBpbmNsdWRpbmcgVVRGLTgsIFVURi0xNiwNCisgICAqIElTTzg4NTktMSwgYW55IHJlY29nbml6ZWQgW0lBTkFdY2hhcmFjdGVyIGVuY29kaW5nDQorICAgKiBAcGFyYW1baW5dIHdzSGVhZGVyICAgICAgYW55IGFkZGl0aW9uYWwgSFRUUCBoZWFkZXJzIHRvIGJlIGluY2x1ZGVkIGluIHRoZQ0KKyAgICogcG9zdC4NCisgICAqIEBwYXJhbVtvdXRdIHdzUmVzcG9uc2UgICBkZWNvZGVkIHJlc3BvbnNlIGZyb20gc2VydmVyLg0KKyAgICogQHJldHVybiBUUlVFIFNlcnZlciBwZXJtaXR0ZWQgdGhlIHBvc3QgcmVxdWVzdCwgRkFMU0Ugb3RoZXJ3aXNlLg0KKyAgICovDQorICB2aXJ0dWFsIEZYX0JPT0wgUG9zdFJlcXVlc3RVUkwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1VSTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ29udGVudFR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0VuY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzSGVhZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1Jlc3BvbnNlKSA9IDA7DQorDQorICAvKioNCisgICAqIFBVVCBkYXRhIHRvIHRoZSBnaXZlbiB1cmwuDQorICAgKiBAcGFyYW1baW5dIHdzVVJMICAgICAgICAgdGhlIFVSTCBiZWluZyB1cGxvYWRlZC4NCisgICAqIEBwYXJhbVtpbl0gd3NEYXRhICAgICAgICAgICAgdGhlIGRhdGEgYmVpbmcgdXBsb2FkZWQuDQorICAgKiBAcGFyYW1baW5dIHdzRW5jb2RlICAgICAgdGhlIGVuY29kZSBvZiBkYXRhIGluY2x1ZGluZyBVVEYtOCwgVVRGLTE2LA0KKyAgICogSVNPODg1OS0xLCBhbnkgcmVjb2duaXplZCBbSUFOQV1jaGFyYWN0ZXIgZW5jb2RpbmcNCisgICAqIEByZXR1cm4gVFJVRSBTZXJ2ZXIgcGVybWl0dGVkIHRoZSBwb3N0IHJlcXVlc3QsIEZBTFNFIG90aGVyd2lzZS4NCisgICAqLw0KKyAgdmlydHVhbCBGWF9CT09MIFB1dFJlcXVlc3RVUkwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1VSTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0VuY29kZSkgPSAwOw0KKw0KKyAgdmlydHVhbCB2b2lkIExvYWRTdHJpbmcoaW50MzJfdCBpU3RyaW5nSUQsIENGWF9XaWRlU3RyaW5nJiB3c1N0cmluZykgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFNob3dGaWxlRGlhbG9nKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUaXRsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRmlsdGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQXJyYXkmIHdzUGF0aEFyciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJPcGVuID0gVFJVRSkgPSAwOw0KKyAgdmlydHVhbCBJRldMX0FkYXB0ZXJUaW1lck1nciogR2V0VGltZXJNZ3IoKSA9IDA7DQorfTsNCitjbGFzcyBJWEZBX0ZvbnRNZ3Igew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSVhGQV9Gb250TWdyKiBDcmVhdGVEZWZhdWx0KCk7DQorICB2aXJ0dWFsIH5JWEZBX0ZvbnRNZ3IoKTsNCisNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIEdldEZvbnQoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb250RmFtaWx5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlID0gMHhGRkZGKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Gb250KiBHZXREZWZhdWx0Rm9udChJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb250RmFtaWx5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UgPSAweEZGRkYpID0gMDsNCit9Ow0KK2NsYXNzIElYRkFfQXBwIHsNCisgcHVibGljOg0KKyAgc3RhdGljIElYRkFfQXBwKiBDcmVhdGUoSVhGQV9BcHBQcm92aWRlciogcFByb3ZpZGVyKTsNCisgIHZpcnR1YWwgfklYRkFfQXBwKCk7DQorDQorICB2aXJ0dWFsIElYRkFfRG9jSGFuZGxlciogR2V0RG9jSGFuZGxlcigpID0gMDsNCisgIHZpcnR1YWwgSVhGQV9Eb2MqIENyZWF0ZURvYyhJWEZBX0RvY1Byb3ZpZGVyKiBwUHJvdmlkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZpbGVSZWFkKiBwU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRha2VPdmVyRmlsZSA9IFRSVUUpID0gMDsNCisgIHZpcnR1YWwgSVhGQV9Eb2MqIENyZWF0ZURvYyhJWEZBX0RvY1Byb3ZpZGVyKiBwUHJvdmlkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcFBERkRvYykgPSAwOw0KKyAgdmlydHVhbCBJWEZBX0FwcFByb3ZpZGVyKiBHZXRBcHBQcm92aWRlcigpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXREZWZhdWx0Rm9udE1ncihJWEZBX0ZvbnRNZ3IqIHBGb250TWdyKSA9IDA7DQorICB2aXJ0dWFsIElYRkFfTWVudUhhbmRsZXIqIEdldE1lbnVIYW5kbGVyKCkgPSAwOw0KK307DQorY2xhc3MgSVhGQV9NZW51SGFuZGxlciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklYRkFfTWVudUhhbmRsZXIoKSB7fQ0KKw0KKyAgdmlydHVhbCBGWF9CT09MIENhbkNvcHkoSVhGQV9XaWRnZXQqIGhXaWRnZXQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5DdXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5QYXN0ZShJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIENhblNlbGVjdEFsbChJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIENhbkRlbGV0ZShJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIENhbkRlU2VsZWN0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ29weShJWEZBX1dpZGdldCogaFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEN1dChJWEZBX1dpZGdldCogaFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFBhc3RlKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2VsZWN0QWxsKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgRGVsZXRlKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgRGVTZWxlY3QoSVhGQV9XaWRnZXQqIGhXaWRnZXQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5VbmRvKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuUmVkbyhJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFVuZG8oSVhGQV9XaWRnZXQqIGhXaWRnZXQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBSZWRvKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0U3VnZ2VzdFdvcmRzKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGIHBvaW50ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdBcnJheSYgc1N1Z2dlc3QpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBSZXBsYWNlU3BlbGxDaGVja1dvcmQoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Qb2ludEYgcG9pbnRmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVwbGFjZSkgPSAwOw0KK307DQorI2RlZmluZSBYRkFfSU5WQUxJREFURV9BbGxQYWdlcyAweDAwMDAwMDAwDQorI2RlZmluZSBYRkFfSU5WQUxJREFURV9DdXJyZW50UGFnZSAweDAwMDAwMDAxDQorI2RlZmluZSBYRkFfUFJJTlRPUFRfU2hvd0RpYWxvZyAweDAwMDAwMDAxDQorI2RlZmluZSBYRkFfUFJJTlRPUFRfQ2FuQ2FuY2VsIDB4MDAwMDAwMDINCisjZGVmaW5lIFhGQV9QUklOVE9QVF9TaHJpbmtQYWdlIDB4MDAwMDAwMDQNCisjZGVmaW5lIFhGQV9QUklOVE9QVF9Bc0ltYWdlIDB4MDAwMDAwMDgNCisjZGVmaW5lIFhGQV9QUklOVE9QVF9SZXZlcnNlT3JkZXIgMHgwMDAwMDAxMA0KKyNkZWZpbmUgWEZBX1BSSU5UT1BUX1ByaW50QW5ub3QgMHgwMDAwMDAyMA0KKyNkZWZpbmUgWEZBX1BBR0VWSUVXRVZFTlRfUG9zdEFkZGVkIDENCisjZGVmaW5lIFhGQV9QQUdFVklFV0VWRU5UX1Bvc3RSZW1vdmVkIDMNCisjZGVmaW5lIFhGQV9XSURHRVRFVkVOVF9Qb3N0QWRkZWQgMg0KKyNkZWZpbmUgWEZBX1dJREdFVEVWRU5UX1ByZVJlbW92ZWQgMw0KKyNkZWZpbmUgWEZBX1dJREdFVEVWRU5UX1Bvc3RDb250ZW50Q2hhbmdlZCA2DQorI2RlZmluZSBYRkFfV0lER0VURVZFTlRfTGlzdEl0ZW1SZW1vdmVkIDcNCisjZGVmaW5lIFhGQV9XSURHRVRFVkVOVF9MaXN0SXRlbUFkZGVkIDgNCisjZGVmaW5lIFhGQV9XSURHRVRFVkVOVF9BY2Nlc3NDaGFuZ2VkIDkNCitjbGFzcyBJWEZBX0RvY1Byb3ZpZGVyIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SVhGQV9Eb2NQcm92aWRlcigpIHt9DQorDQorICB2aXJ0dWFsIHZvaWQgU2V0Q2hhbmdlTWFyayhJWEZBX0RvYyogaERvYykgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEludmFsaWRhdGVSZWN0KElYRkFfUGFnZVZpZXcqIHBQYWdlVmlldywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSAwKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgRGlzcGxheUNhcmV0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJWaXNpYmxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdEFuY2hvcikgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldFBvcHVwUG9zKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNaW5Qb3B1cCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWF4UG9wdXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJ0UG9wdXApID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBQb3B1cE1lbnUoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Qb2ludEYgcHRQb3B1cCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdEV4Y2x1ZGUgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgUGFnZVZpZXdFdmVudChJWEZBX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIEZYX0RXT1JEIGR3RmxhZ3MpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBXaWRnZXRFdmVudChJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcFdpZGdldERhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdFdmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0gPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBBZGRpdGlvbmFsID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFJlbmRlckN1c3RvbVdpZGdldChJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRVSSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRQYWdlcyhJWEZBX0RvYyogaERvYykgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEN1cnJlbnRQYWdlKElYRkFfRG9jKiBoRG9jKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q3VycmVudFBhZ2UoSVhGQV9Eb2MqIGhEb2MsIGludDMyX3QgaUN1clBhZ2UpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0NhbGN1bGF0aW9uc0VuYWJsZWQoSVhGQV9Eb2MqIGhEb2MpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRDYWxjdWxhdGlvbnNFbmFibGVkKElYRkFfRG9jKiBoRG9jLCBGWF9CT09MIGJFbmFibGVkKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0VGl0bGUoSVhGQV9Eb2MqIGhEb2MsIENGWF9XaWRlU3RyaW5nJiB3c1RpdGxlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0VGl0bGUoSVhGQV9Eb2MqIGhEb2MsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUaXRsZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEV4cG9ydERhdGEoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRmlsZVBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJYRFAgPSBUUlVFKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgSW1wb3J0RGF0YShJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGaWxlUGF0aCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdvdG9VUkwoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGJzVVJMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQXBwZW5kID0gVFJVRSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIElzVmFsaWRhdGlvbnNFbmFibGVkKElYRkFfRG9jKiBoRG9jKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0VmFsaWRhdGlvbnNFbmFibGVkKElYRkFfRG9jKiBoRG9jLCBGWF9CT09MIGJFbmFibGVkKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Rm9jdXNXaWRnZXQoSVhGQV9Eb2MqIGhEb2MsIElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgUHJpbnQoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnRQYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkVuZFBhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdPcHRpb25zKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgQWJzUGFnZUNvdW50SW5CYXRjaChJWEZBX0RvYyogaERvYykgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEFic1BhZ2VJbkJhdGNoKElYRkFfRG9jKiBoRG9jLCBJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IFNoZWV0Q291bnRJbkJhdGNoKElYRkFfRG9jKiBoRG9jKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgU2hlZXRJbkJhdGNoKElYRkFfRG9jKiBoRG9jLCBJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IFZlcmlmeShJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwU2lnTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXNlZCA9IFRSVUUpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICB2aXJ0dWFsIEZYX0JPT0wgU2lnbihJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZUxpc3QqIHBOb2RlTGlzdCwNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NFeHByZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1hNTElkZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1ZhbHVlID0gRlhfV1NUUkMoTCJvcGVuIiksDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVc2VkID0gVFJVRSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHZpcnR1YWwgQ1hGQV9Ob2RlTGlzdCogRW51bWVyYXRlKElYRkFfRG9jKiBoRG9jKSB7IHJldHVybiAwOyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2xlYXIoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwU2lnTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDbGVhcmVkID0gVFJVRSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBHZXRVUkwoSVhGQV9Eb2MqIGhEb2MsIENGWF9XaWRlU3RyaW5nJiB3c0RvY1VSTCkgPSAwOw0KKyAgdmlydHVhbCBGWF9BUkdCIEdldEhpZ2hsaWdodENvbG9yKElYRkFfRG9jKiBoRG9jKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgQWRkRG9SZWNvcmQoSVhGQV9XaWRnZXQqIGhXaWRnZXQpID0gMDsNCisNCisgIHZpcnR1YWwgRlhfQk9PTCBTdWJtaXREYXRhKElYRkFfRG9jKiBoRG9jLCBDWEZBX1N1Ym1pdCBzdWJtaXQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBDaGVja1dvcmQoSVhGQV9Eb2MqIGhEb2MsIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc1dvcmQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRTdWdnZXN0V29yZHMoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc1dvcmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQXJyYXkmIHNTdWdnZXN0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0UERGU2NyaXB0T2JqZWN0KElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHV0ZjhOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFZhbHVlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0R2xvYmFsUHJvcGVydHkoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRHbG9iYWxQcm9wZXJ0eShJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSkgPSAwOw0KKyAgdmlydHVhbCBDUERGX0RvY3VtZW50KiBPcGVuUERGKElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9GaWxlUmVhZCogcEZpbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVGFrZU92ZXJGaWxlKSA9IDA7DQorICB2aXJ0dWFsIElGWF9GaWxlUmVhZCogT3BlbkxpbmtlZEZpbGUoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTGluaykgPSAwOw0KK307DQorI2RlZmluZSBYRkFfRE9DVklFV19WaWV3IDB4MDAwMDAwMDANCisjZGVmaW5lIFhGQV9ET0NWSUVXX01hc3RlclBhZ2UgMHgwMDAwMDAwMQ0KKyNkZWZpbmUgWEZBX0RPQ1ZJRVdfRGVzaWduIDB4MDAwMDAwMDINCisjZGVmaW5lIFhGQV9ET0NUWVBFX0R5bmFtaWMgMA0KKyNkZWZpbmUgWEZBX0RPQ1RZUEVfU3RhdGljIDENCisjZGVmaW5lIFhGQV9ET0NUWVBFX1hEUCAyDQorI2RlZmluZSBYRkFfUEFSU0VTVEFUVVNfU3RhdHVzRXJyIC0zDQorI2RlZmluZSBYRkFfUEFSU0VTVEFUVVNfU3RyZWFtRXJyIC0yDQorI2RlZmluZSBYRkFfUEFSU0VTVEFUVVNfU3ludGF4RXJyIC0xDQorI2RlZmluZSBYRkFfUEFSU0VTVEFUVVNfUmVhZHkgMA0KKyNkZWZpbmUgWEZBX1BBUlNFU1RBVFVTX0RvbmUgMTAwDQorY2xhc3MgSVhGQV9Eb2NIYW5kbGVyIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SVhGQV9Eb2NIYW5kbGVyKCkge30NCisNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlRG9jKElYRkFfRG9jKiBoRG9jKSA9IDA7DQorICB2aXJ0dWFsIElYRkFfRG9jUHJvdmlkZXIqIEdldERvY1Byb3ZpZGVyKElYRkFfRG9jKiBoRG9jKSA9IDA7DQorDQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldERvY1R5cGUoSVhGQV9Eb2MqIGhEb2MpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBTdGFydExvYWQoSVhGQV9Eb2MqIGhEb2MpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBEb0xvYWQoSVhGQV9Eb2MqIGhEb2MsIElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFN0b3BMb2FkKElYRkFfRG9jKiBoRG9jKSA9IDA7DQorDQorICB2aXJ0dWFsIElYRkFfRG9jVmlldyogQ3JlYXRlRG9jVmlldyhJWEZBX0RvYyogaERvYywgRlhfRFdPUkQgZHdWaWV3ID0gMCkgPSAwOw0KKw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50UGFja2FnZXMoSVhGQV9Eb2MqIGhEb2MpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXRQYWNrYWdlTmFtZShJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQYWNrYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyYgd3NQYWNrYWdlKSA9IDA7DQorDQorICB2aXJ0dWFsIEZYX0JPT0wgU2F2ZVBhY2thZ2UoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1BhY2thZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZpbGVXcml0ZSogcEZpbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhGQV9DaGVja3N1bUNvbnRleHQqIHBDU0NvbnRleHQgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2xvc2VEb2MoSVhGQV9Eb2MqIGhEb2MpID0gMDsNCisNCisgIHZpcnR1YWwgRlhfQk9PTCBJbXBvcnREYXRhKElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZpbGVSZWFkKiBwU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiWERQID0gVFJVRSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEpTRVJ1bnRpbWUoSVhGQV9Eb2MqIGhEb2MsIEZYSlNFX0hSVU5USU1FIGhSdW50aW1lKSA9IDA7DQorICB2aXJ0dWFsIEZYSlNFX0hWQUxVRSBHZXRYRkFTY3JpcHRPYmplY3QoSVhGQV9Eb2MqIGhEb2MpID0gMDsNCisgIHZpcnR1YWwgWEZBX0FUVFJJQlVURUVOVU0gR2V0UmVzdG9yZVN0YXRlKElYRkFfRG9jKiBoRG9jKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgUnVuRG9jU2NyaXB0KElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfU0NSSVBUVFlQRSBlU2NyaXB0VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1NjcmlwdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhSZXRWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhUaGlzT2JqZWN0KSA9IDA7DQorfTsNCitlbnVtIFhGQV9FVkVOVFRZUEUgew0KKyAgWEZBX0VWRU5UX0NsaWNrLA0KKyAgWEZBX0VWRU5UX0NoYW5nZSwNCisgIFhGQV9FVkVOVF9Eb2NDbG9zZSwNCisgIFhGQV9FVkVOVF9Eb2NSZWFkeSwNCisgIFhGQV9FVkVOVF9FbnRlciwNCisgIFhGQV9FVkVOVF9FeGl0LA0KKyAgWEZBX0VWRU5UX0Z1bGwsDQorICBYRkFfRVZFTlRfSW5kZXhDaGFuZ2UsDQorICBYRkFfRVZFTlRfSW5pdGlhbGl6ZSwNCisgIFhGQV9FVkVOVF9Nb3VzZURvd24sDQorICBYRkFfRVZFTlRfTW91c2VFbnRlciwNCisgIFhGQV9FVkVOVF9Nb3VzZUV4aXQsDQorICBYRkFfRVZFTlRfTW91c2VVcCwNCisgIFhGQV9FVkVOVF9Qb3N0RXhlY3V0ZSwNCisgIFhGQV9FVkVOVF9Qb3N0T3BlbiwNCisgIFhGQV9FVkVOVF9Qb3N0UHJpbnQsDQorICBYRkFfRVZFTlRfUG9zdFNhdmUsDQorICBYRkFfRVZFTlRfUG9zdFNpZ24sDQorICBYRkFfRVZFTlRfUG9zdFN1Ym1pdCwNCisgIFhGQV9FVkVOVF9QcmVFeGVjdXRlLA0KKyAgWEZBX0VWRU5UX1ByZU9wZW4sDQorICBYRkFfRVZFTlRfUHJlUHJpbnQsDQorICBYRkFfRVZFTlRfUHJlU2F2ZSwNCisgIFhGQV9FVkVOVF9QcmVTaWduLA0KKyAgWEZBX0VWRU5UX1ByZVN1Ym1pdCwNCisgIFhGQV9FVkVOVF9SZWFkeSwNCisgIFhGQV9FVkVOVF9Jbml0Q2FsY3VsYXRlLA0KKyAgWEZBX0VWRU5UX0luaXRWYXJpYWJsZXMsDQorICBYRkFfRVZFTlRfQ2FsY3VsYXRlLA0KKyAgWEZBX0VWRU5UX1ZhbGlkYXRlLA0KKyAgWEZBX0VWRU5UX1Vua25vd24sDQorfTsNCisjZGVmaW5lIFhGQV9WQUxJREFURV9wcmVTdWJtaXQgMQ0KKyNkZWZpbmUgWEZBX1ZBTElEQVRFX3ByZVByaW50IDINCisjZGVmaW5lIFhGQV9WQUxJREFURV9wcmVFeGVjdXRlIDMNCisjZGVmaW5lIFhGQV9WQUxJREFURV9wcmVTYXZlIDQNCitjbGFzcyBDWEZBX0V2ZW50UGFyYW0gew0KKyBwdWJsaWM6DQorICBDWEZBX0V2ZW50UGFyYW0oKSB7DQorICAgIG1fcFRhcmdldCA9IE5VTEw7DQorICAgIG1fZVR5cGUgPSBYRkFfRVZFTlRfVW5rbm93bjsNCisgICAgbV93c1Jlc3VsdC5FbXB0eSgpOw0KKyAgICBSZXNldCgpOw0KKyAgfQ0KKyAgdm9pZCBSZXNldCgpIHsNCisgICAgbV93c0NoYW5nZS5FbXB0eSgpOw0KKyAgICBtX2lDb21taXRLZXkgPSAwOw0KKyAgICBtX3dzRnVsbFRleHQuRW1wdHkoKTsNCisgICAgbV9iS2V5RG93biA9IEZBTFNFOw0KKyAgICBtX2JNb2RpZmllciA9IEZBTFNFOw0KKyAgICBtX3dzTmV3Q29udGVudFR5cGUuRW1wdHkoKTsNCisgICAgbV93c05ld1RleHQuRW1wdHkoKTsNCisgICAgbV93c1ByZXZDb250ZW50VHlwZS5FbXB0eSgpOw0KKyAgICBtX3dzUHJldlRleHQuRW1wdHkoKTsNCisgICAgbV9iUmVlbnRlciA9IEZBTFNFOw0KKyAgICBtX2lTZWxFbmQgPSAwOw0KKyAgICBtX2lTZWxTdGFydCA9IDA7DQorICAgIG1fYlNoaWZ0ID0gRkFMU0U7DQorICAgIG1fd3NTb2FwRmF1bHRDb2RlLkVtcHR5KCk7DQorICAgIG1fd3NTb2FwRmF1bHRTdHJpbmcuRW1wdHkoKTsNCisgICAgbV9iSXNGb3JtUmVhZHkgPSBGQUxTRTsNCisgICAgbV9pVmFsaWRhdGVBY3Rpdml0aWVzID0gWEZBX1ZBTElEQVRFX3ByZVN1Ym1pdDsNCisgIH0NCisgIENYRkFfV2lkZ2V0QWNjKiBtX3BUYXJnZXQ7DQorICBYRkFfRVZFTlRUWVBFIG1fZVR5cGU7DQorICBDRlhfV2lkZVN0cmluZyBtX3dzUmVzdWx0Ow0KKyAgRlhfQk9PTCBtX2JDYW5jZWxBY3Rpb247DQorICBpbnQzMl90IG1faUNvbW1pdEtleTsNCisgIEZYX0JPT0wgbV9iS2V5RG93bjsNCisgIEZYX0JPT0wgbV9iTW9kaWZpZXI7DQorICBGWF9CT09MIG1fYlJlZW50ZXI7DQorICBpbnQzMl90IG1faVNlbEVuZDsNCisgIGludDMyX3QgbV9pU2VsU3RhcnQ7DQorICBGWF9CT09MIG1fYlNoaWZ0Ow0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c0NoYW5nZTsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NGdWxsVGV4dDsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NOZXdDb250ZW50VHlwZTsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NOZXdUZXh0Ow0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c1ByZXZDb250ZW50VHlwZTsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NQcmV2VGV4dDsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NTb2FwRmF1bHRDb2RlOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c1NvYXBGYXVsdFN0cmluZzsNCisgIEZYX0JPT0wgbV9iSXNGb3JtUmVhZHk7DQorICBpbnQzMl90IG1faVZhbGlkYXRlQWN0aXZpdGllczsNCit9Ow0KKyNkZWZpbmUgWEZBX0VWRU5URVJST1JfU3VjZXNzIDENCisjZGVmaW5lIFhGQV9FVkVOVEVSUk9SX0Vycm9yIC0xDQorI2RlZmluZSBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdCAwDQorI2RlZmluZSBYRkFfRVZFTlRFUlJPUl9EaXNhYmxlZCAyDQorZW51bSBYRkFfV0lER0VUT1JERVIgew0KKyAgWEZBX1dJREdFVE9SREVSX1ByZU9yZGVyLA0KK307DQorY2xhc3MgSVhGQV9Eb2NWaWV3IHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SVhGQV9Eb2NWaWV3KCkge30NCisNCisgIHZpcnR1YWwgSVhGQV9Eb2MqIEdldERvYygpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBTdGFydExheW91dChpbnQzMl90IGlTdGFydFBhZ2UgPSAwKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgRG9MYXlvdXQoSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU3RvcExheW91dCgpID0gMDsNCisNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRMYXlvdXRTdGF0dXMoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgVXBkYXRlRG9jVmlldygpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudFBhZ2VWaWV3cygpID0gMDsNCisgIHZpcnR1YWwgSVhGQV9QYWdlVmlldyogR2V0UGFnZVZpZXcoaW50MzJfdCBuSW5kZXgpID0gMDsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIEdldFdpZGdldEJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSkgPSAwOw0KKyAgdmlydHVhbCBDWEZBX1dpZGdldEFjYyogR2V0V2lkZ2V0QWNjQnlOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgUmVzZXRXaWRnZXREYXRhKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IFByb2Nlc3NXaWRnZXRFdmVudChDWEZBX0V2ZW50UGFyYW0qIHBQYXJhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIElYRkFfV2lkZ2V0SGFuZGxlciogR2V0V2lkZ2V0SGFuZGxlcigpID0gMDsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXRJdGVyYXRvciogQ3JlYXRlV2lkZ2V0SXRlcmF0b3IoKSA9IDA7DQorICB2aXJ0dWFsIElYRkFfV2lkZ2V0QWNjSXRlcmF0b3IqIENyZWF0ZVdpZGdldEFjY0l0ZXJhdG9yKA0KKyAgICAgIFhGQV9XSURHRVRPUkRFUiBlT3JkZXIgPSBYRkFfV0lER0VUT1JERVJfUHJlT3JkZXIpID0gMDsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIEdldEZvY3VzV2lkZ2V0KCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEtpbGxGb2N1cygpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRGb2N1cyhJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KK307DQorI2RlZmluZSBYRkFfVFJBVkVSU0VXQVlfVHJhbnZhbHNlIDB4MDAwMQ0KKyNkZWZpbmUgWEZBX1RSQVZFUlNFV0FZX0Zvcm0gMHgwMDAyDQorI2RlZmluZSBYRkFfV0lER0VURklMVEVSX1Zpc2libGUgMHgwMDAxDQorI2RlZmluZSBYRkFfV0lER0VURklMVEVSX1ZpZXdhYmxlIDB4MDAxMA0KKyNkZWZpbmUgWEZBX1dJREdFVEZJTFRFUl9QcmludGFibGUgMHgwMDIwDQorI2RlZmluZSBYRkFfV0lER0VURklMVEVSX0ZpZWxkIDB4MDEwMA0KKyNkZWZpbmUgWEZBX1dJREdFVEZJTFRFUl9BbGxUeXBlIDB4MEYwMA0KK2NsYXNzIElYRkFfUGFnZVZpZXcgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JWEZBX1BhZ2VWaWV3KCkge30NCisNCisgIHZpcnR1YWwgSVhGQV9Eb2NWaWV3KiBHZXREb2NWaWV3KCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFBhZ2VWaWV3SW5kZXgoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0UGFnZVZpZXdSZWN0KENGWF9SZWN0RiYgcnRQYWdlKSA9IDA7DQorDQorICB2aXJ0dWFsIHZvaWQgR2V0RGlzcGxheU1hdHJpeChDRlhfTWF0cml4JiBtdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0JiBydERpc3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSb3RhdGUpID0gMDsNCisNCisgIHZpcnR1YWwgaW50MzJfdCBMb2FkUGFnZVZpZXcoSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgVW5sb2FkUGFnZVZpZXcoKSA9IDA7DQorICB2aXJ0dWFsIElYRkFfV2lkZ2V0KiBHZXRXaWRnZXRCeVBvcyhGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpID0gMDsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXRJdGVyYXRvciogQ3JlYXRlV2lkZ2V0SXRlcmF0b3IoDQorICAgICAgRlhfRFdPUkQgZHdUcmF2ZXJzZVdheSA9IFhGQV9UUkFWRVJTRVdBWV9Gb3JtLA0KKyAgICAgIEZYX0RXT1JEIGR3V2lkZ2V0RmlsdGVyID0gWEZBX1dJREdFVEZJTFRFUl9WaXNpYmxlIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9XSURHRVRGSUxURVJfVmlld2FibGUgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1dJREdFVEZJTFRFUl9BbGxUeXBlKSA9IDA7DQorfTsNCitjbGFzcyBDWEZBX1JlbmRlck9wdGlvbnMgew0KKyBwdWJsaWM6DQorICBDWEZBX1JlbmRlck9wdGlvbnMoKSA6IG1fYlByaW50KEZBTFNFKSwgbV9iSGlnaGxpZ2h0KFRSVUUpIHt9DQorICBGWF9CT09MIG1fYlByaW50Ow0KKyAgRlhfQk9PTCBtX2JIaWdobGlnaHQ7DQorfTsNCisjZGVmaW5lIFhGQV9SRU5ERVJTVEFUVVNfUmVhZHkgMQ0KKyNkZWZpbmUgWEZBX1JFTkRFUlNUQVRVU19Ub0JlQ29udGludWVkIDINCisjZGVmaW5lIFhGQV9SRU5ERVJTVEFUVVNfRG9uZSAzDQorI2RlZmluZSBYRkFfUkVOREVSU1RBVFVTX0ZhaWxlZCAtMQ0KK2NsYXNzIElYRkFfUmVuZGVyQ29udGV4dCB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IFN0YXJ0UmVuZGVyKElYRkFfUGFnZVZpZXcqIHBQYWdlVmlldywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYRkFfUmVuZGVyT3B0aW9ucyYgb3B0aW9ucykgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IERvUmVuZGVyKElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFN0b3BSZW5kZXIoKSA9IDA7DQorDQorIHByb3RlY3RlZDoNCisgIH5JWEZBX1JlbmRlckNvbnRleHQoKSB7fQ0KK307DQorSVhGQV9SZW5kZXJDb250ZXh0KiBYRkFfUmVuZGVyQ29udGV4dF9DcmVhdGUoKTsNCitlbnVtIFhGQV9XSURHRVRUWVBFIHsNCisgIFhGQV9XSURHRVRUWVBFX0JhcmNvZGUsDQorICBYRkFfV0lER0VUVFlQRV9QdXNoQnV0dG9uLA0KKyAgWEZBX1dJREdFVFRZUEVfQ2hlY2tCdXR0b24sDQorICBYRkFfV0lER0VUVFlQRV9SYWRpb0J1dHRvbiwNCisgIFhGQV9XSURHRVRUWVBFX0RhdGV0aW1lRWRpdCwNCisgIFhGQV9XSURHRVRUWVBFX0RlY2ltYWxGaWVsZCwNCisgIFhGQV9XSURHRVRUWVBFX051bWVyaWNGaWVsZCwNCisgIFhGQV9XSURHRVRUWVBFX1NpZ25hdHVyZSwNCisgIFhGQV9XSURHRVRUWVBFX1RleHRFZGl0LA0KKyAgWEZBX1dJREdFVFRZUEVfRHJvcGRvd25MaXN0LA0KKyAgWEZBX1dJREdFVFRZUEVfTGlzdEJveCwNCisgIFhGQV9XSURHRVRUWVBFX0ltYWdlRmllbGQsDQorICBYRkFfV0lER0VUVFlQRV9QYXNzd29yZEVkaXQsDQorICBYRkFfV0lER0VUVFlQRV9BcmMsDQorICBYRkFfV0lER0VUVFlQRV9SZWN0YW5nbGUsDQorICBYRkFfV0lER0VUVFlQRV9JbWFnZSwNCisgIFhGQV9XSURHRVRUWVBFX0xpbmUsDQorICBYRkFfV0lER0VUVFlQRV9UZXh0LA0KKyAgWEZBX1dJREdFVFRZUEVfRXhjbHVkZUdyb3VwLA0KKyAgWEZBX1dJREdFVFRZUEVfU3ViZm9ybSwNCisgIFhGQV9XSURHRVRUWVBFX1Vua25vd24sDQorfTsNCisjZGVmaW5lIFhGQV9XSURHRVRTVEFUVVNfVmlzaWJsZSAweDAwMDAwMDAxDQorI2RlZmluZSBYRkFfV0lER0VUU1RBVFVTX0ludmlzaWJsZSAweDAwMDAwMDAyDQorI2RlZmluZSBYRkFfV0lER0VUU1RBVFVTX0hpZGRlbiAweDAwMDAwMDA0DQorI2RlZmluZSBYRkFfV0lER0VUU1RBVFVTX1ZpZXdhYmxlIDB4MDAwMDAwMTANCisjZGVmaW5lIFhGQV9XSURHRVRTVEFUVVNfUHJpbnRhYmxlIDB4MDAwMDAwMjANCisjZGVmaW5lIFhGQV9XSURHRVRTVEFUVVNfRm9jdXNlZCAweDAwMDAwMTAwDQorY2xhc3MgSVhGQV9XaWRnZXRIYW5kbGVyIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SVhGQV9XaWRnZXRIYW5kbGVyKCkge30NCisNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIENyZWF0ZVdpZGdldChJWEZBX1dpZGdldCogaFBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfV0lER0VUVFlQRSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEZBX1dpZGdldCogaEJlZm9yZSA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgSVhGQV9QYWdlVmlldyogR2V0UGFnZVZpZXcoSVhGQV9XaWRnZXQqIGhXaWRnZXQpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXRSZWN0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBDRlhfUmVjdEYmIHJ0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldFN0YXR1cyhJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldEJCb3goSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJ0Qm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEcmF3Rm9jdXMgPSBGQUxTRSkgPSAwOw0KKyAgdmlydHVhbCBDWEZBX1dpZGdldEFjYyogR2V0RGF0YUFjYyhJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KKw0KKyAgdmlydHVhbCB2b2lkIEdldE5hbWUoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTmFtZVR5cGUgPSAwKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0VG9vbFRpcChJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1Rvb2xUaXApID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRQcml2YXRlRGF0YShJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBtb2R1bGVfaWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcERhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2spID0gMDsNCisgIHZpcnR1YWwgdm9pZCogR2V0UHJpdmF0ZURhdGEoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIHZvaWQqIG1vZHVsZV9pZCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VFbnRlcihJWEZBX1dpZGdldCogaFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VFeGl0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uRG93bihJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uVXAoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRibENsayhJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25Nb3VzZU1vdmUoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VXaGVlbChJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCB6RGVsdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvbkRvd24oSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvblVwKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBPblJCdXR0b25EYmxDbGsoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgPSAwOw0KKw0KKyAgdmlydHVhbCBGWF9CT09MIE9uS2V5RG93bihJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdLZXlDb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25LZXlVcChJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3S2V5Q29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbkNoYXIoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Q2hhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncykgPSAwOw0KKyAgdmlydHVhbCBGWF9EV09SRCBPbkhpdFRlc3QoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25TZXRDdXJzb3IoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpID0gMDsNCisNCisgIHZpcnR1YWwgdm9pZCBSZW5kZXJXaWRnZXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSGlnaGxpZ2h0ID0gRkFMU0UpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBIYXNFdmVudChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRVZFTlRUWVBFIGVFdmVudFR5cGUpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBQcm9jZXNzRXZlbnQoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRXZlbnRQYXJhbSogcFBhcmFtKSA9IDA7DQorfTsNCitjbGFzcyBJWEZBX1dpZGdldEl0ZXJhdG9yIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgUmVzZXQoKSA9IDA7DQorICB2aXJ0dWFsIElYRkFfV2lkZ2V0KiBNb3ZlVG9GaXJzdCgpID0gMDsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIE1vdmVUb0xhc3QoKSA9IDA7DQorICB2aXJ0dWFsIElYRkFfV2lkZ2V0KiBNb3ZlVG9OZXh0KCkgPSAwOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldCogTW92ZVRvUHJldmlvdXMoKSA9IDA7DQorICB2aXJ0dWFsIElYRkFfV2lkZ2V0KiBHZXRDdXJyZW50V2lkZ2V0KCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldEN1cnJlbnRXaWRnZXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQpID0gMDsNCisNCisgcHJvdGVjdGVkOg0KKyAgfklYRkFfV2lkZ2V0SXRlcmF0b3IoKSB7fQ0KK307DQorY2xhc3MgSVhGQV9XaWRnZXRBY2NJdGVyYXRvciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFJlc2V0KCkgPSAwOw0KKyAgdmlydHVhbCBDWEZBX1dpZGdldEFjYyogTW92ZVRvRmlyc3QoKSA9IDA7DQorICB2aXJ0dWFsIENYRkFfV2lkZ2V0QWNjKiBNb3ZlVG9MYXN0KCkgPSAwOw0KKyAgdmlydHVhbCBDWEZBX1dpZGdldEFjYyogTW92ZVRvTmV4dCgpID0gMDsNCisgIHZpcnR1YWwgQ1hGQV9XaWRnZXRBY2MqIE1vdmVUb1ByZXZpb3VzKCkgPSAwOw0KKyAgdmlydHVhbCBDWEZBX1dpZGdldEFjYyogR2V0Q3VycmVudFdpZGdldEFjYygpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRDdXJyZW50V2lkZ2V0QWNjKENYRkFfV2lkZ2V0QWNjKiBoV2lkZ2V0KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2tpcFRyZWUoKSA9IDA7DQorDQorIHByb3RlY3RlZDoNCisgIH5JWEZBX1dpZGdldEFjY0l0ZXJhdG9yKCkge30NCit9Ow0KK0lYRkFfV2lkZ2V0QWNjSXRlcmF0b3IqIFhGQV9XaWRnZXRBY2NJdGVyYXRvcl9DcmVhdGUoDQorICAgIENYRkFfV2lkZ2V0QWNjKiBwVHJhdmVsUm9vdCwNCisgICAgWEZBX1dJREdFVE9SREVSIGVPcmRlciA9IFhGQV9XSURHRVRPUkRFUl9QcmVPcmRlcik7DQorY2xhc3MgSVhGQV9DaGVja3N1bUNvbnRleHQgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisNCisgIHZpcnR1YWwgRlhfQk9PTCBTdGFydENoZWNrc3VtKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFVwZGF0ZUNoZWNrc3VtKElGWF9GaWxlUmVhZCogcFNyY0ZpbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0gMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IDApID0gMDsNCisgIHZpcnR1YWwgdm9pZCBGaW5pc2hDaGVja3N1bSgpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXRDaGVja3N1bShDRlhfQnl0ZVN0cmluZyYgYnNDaGVja3N1bSkgPSAwOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB+SVhGQV9DaGVja3N1bUNvbnRleHQoKSB7fQ0KK307DQorSVhGQV9DaGVja3N1bUNvbnRleHQqIFhGQV9DaGVja3N1bV9DcmVhdGUoKTsNCisNCisjZW5kaWYgIC8vIEZYRkFfSF8NCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9meGZhL2Z4ZmFfYmFzaWMuaCBiL3hmYS9pbmNsdWRlL2Z4ZmEvZnhmYV9iYXNpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MWU0MTcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9meGZhL2Z4ZmFfYmFzaWMuaApAQCAtMCwwICsxLDEwODQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhGQV9CQVNJQ19IDQorI2RlZmluZSBfRlhGQV9CQVNJQ19IDQorDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z4anNlL2Z4anNlLmgiDQorDQorY2xhc3MgQ1hGQV9NZWFzdXJlbWVudDsNCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9YZmEgMHhjNTZiOWZmDQorI2RlZmluZSBYRkFfSEFTSENPREVfQ29uZmlnIDB4NGUxZTM5YjYNCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9UZW1wbGF0ZSAweDgwMzU1MGZjDQorI2RlZmluZSBYRkFfSEFTSENPREVfRGF0YXNldHMgMHg5OWI5NTA3OQ0KKyNkZWZpbmUgWEZBX0hBU0hDT0RFX0RhdGEgMHhiZGU5YWJkYQ0KKyNkZWZpbmUgWEZBX0hBU0hDT0RFX0Zvcm0gMHhjZDMwOWZmNA0KKyNkZWZpbmUgWEZBX0hBU0hDT0RFX0xvY2FsZVNldCAweDU0NzNiNmRjDQorI2RlZmluZSBYRkFfSEFTSENPREVfQ29ubmVjdGlvblNldCAweGUxNGM4MDFjDQorI2RlZmluZSBYRkFfSEFTSENPREVfU291cmNlU2V0IDB4ODExOTI5ZA0KKyNkZWZpbmUgWEZBX0hBU0hDT0RFX1hkYyAweGM1NmFmYmYNCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9QZGYgMHhiODQzZGJhDQorI2RlZmluZSBYRkFfSEFTSENPREVfWGZkZiAweDQ4ZDAwNGE4DQorI2RlZmluZSBYRkFfSEFTSENPREVfWG1wbWV0YSAweDEzMmE4ZmJjDQorI2RlZmluZSBYRkFfSEFTSENPREVfU2lnbmF0dXJlIDB4OGIwMzZmMzINCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9TdHlsZXNoZWV0IDB4NjAzODU4MGENCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9YRFAgMHhjNTZhZmNjDQorI2RlZmluZSBYRkFfSEFTSENPREVfUmVjb3JkIDB4NTc3OWQ2NWYNCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9EYXRhV2luZG93IDB4ODNhNTUwZDINCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9Ib3N0IDB4ZGIwNzViZGUNCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9Mb2cgMHgwYjFiM2QyMg0KKyNkZWZpbmUgWEZBX0hBU0hDT0RFX0V2ZW50IDB4MTg1ZTQxZTINCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9MYXlvdXQgMHg3ZTdlODQ1ZQ0KKyNkZWZpbmUgWEZBX0hBU0hDT0RFX09jY3VyIDB4ZjdlZWJlMWMNCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9UaGlzIDB4MmQ1NzRkNTgNCisjZGVmaW5lIFhGQV9IQVNIQ09ERV9EYXRhRGVzY3JpcHRpb24gMHgyYjVkZjUxZQ0KKyNkZWZpbmUgWEZBX0hBU0hDT0RFX05hbWUgMHgzMWIxOWMxDQorZW51bSBYRkFfUEFDS0VUIHsNCisgIFhGQV9QQUNLRVRfVVNFUiwNCisgIFhGQV9QQUNLRVRfU291cmNlU2V0LA0KKyAgWEZBX1BBQ0tFVF9QZGYsDQorICBYRkFfUEFDS0VUX1hkYywNCisgIFhGQV9QQUNLRVRfWERQLA0KKyAgWEZBX1BBQ0tFVF9YbXBtZXRhLA0KKyAgWEZBX1BBQ0tFVF9YZmRmLA0KKyAgWEZBX1BBQ0tFVF9Db25maWcsDQorICBYRkFfUEFDS0VUX0xvY2FsZVNldCwNCisgIFhGQV9QQUNLRVRfU3R5bGVzaGVldCwNCisgIFhGQV9QQUNLRVRfVGVtcGxhdGUsDQorICBYRkFfUEFDS0VUX1NpZ25hdHVyZSwNCisgIFhGQV9QQUNLRVRfRGF0YXNldHMsDQorICBYRkFfUEFDS0VUX0Zvcm0sDQorICBYRkFfUEFDS0VUX0Nvbm5lY3Rpb25TZXQsDQorfTsNCitlbnVtIFhGQV9YRFBQQUNLRVQgew0KKyAgWEZBX1hEUFBBQ0tFVF9VTktOT1dOID0gMCwNCisgIFhGQV9YRFBQQUNLRVRfQ29uZmlnID0gMSA8PCBYRkFfUEFDS0VUX0NvbmZpZywNCisgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgPSAxIDw8IFhGQV9QQUNLRVRfVGVtcGxhdGUsDQorICBYRkFfWERQUEFDS0VUX0RhdGFzZXRzID0gMSA8PCBYRkFfUEFDS0VUX0RhdGFzZXRzLA0KKyAgWEZBX1hEUFBBQ0tFVF9Gb3JtID0gMSA8PCBYRkFfUEFDS0VUX0Zvcm0sDQorICBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCA9IDEgPDwgWEZBX1BBQ0tFVF9Mb2NhbGVTZXQsDQorICBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQgPSAxIDw8IFhGQV9QQUNLRVRfQ29ubmVjdGlvblNldCwNCisgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0ID0gMSA8PCBYRkFfUEFDS0VUX1NvdXJjZVNldCwNCisgIFhGQV9YRFBQQUNLRVRfWGRjID0gMSA8PCBYRkFfUEFDS0VUX1hkYywNCisgIFhGQV9YRFBQQUNLRVRfUGRmID0gMSA8PCBYRkFfUEFDS0VUX1BkZiwNCisgIFhGQV9YRFBQQUNLRVRfWGZkZiA9IDEgPDwgWEZBX1BBQ0tFVF9YZmRmLA0KKyAgWEZBX1hEUFBBQ0tFVF9YbXBtZXRhID0gMSA8PCBYRkFfUEFDS0VUX1htcG1ldGEsDQorICBYRkFfWERQUEFDS0VUX1NpZ25hdHVyZSA9IDEgPDwgWEZBX1BBQ0tFVF9TaWduYXR1cmUsDQorICBYRkFfWERQUEFDS0VUX1N0eWxlc2hlZXQgPSAxIDw8IFhGQV9QQUNLRVRfU3R5bGVzaGVldCwNCisgIFhGQV9YRFBQQUNLRVRfVVNFUiA9IDEgPDwgWEZBX1BBQ0tFVF9VU0VSLA0KKyAgWEZBX1hEUFBBQ0tFVF9YRFAgPSAxIDw8IFhGQV9QQUNLRVRfWERQLA0KK307DQorZW51bSBYRkFfWERQUEFDS0VUX0ZMQUdTIHsNCisgIFhGQV9YRFBQQUNLRVRfRkxBR1NfQ09NUExFVEVNQVRDSCA9IDEsDQorICBYRkFfWERQUEFDS0VUX0ZMQUdTX1BSRUZJWE1BVENIID0gMiwNCisgIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCA9IDQsDQorICBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRPTkUgPSA4LA0KKyAgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUTUFOWSA9IDE2LA0KK307DQordHlwZWRlZiBzdHJ1Y3QgX1hGQV9QQUNLRVRJTkZPIHsNCisgIHVpbnQzMl90IHVIYXNoOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBOYW1lOw0KKyAgWEZBX1hEUFBBQ0tFVCBlTmFtZTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwVVJJOw0KKyAgRlhfRFdPUkQgZUZsYWdzOw0KK30gWEZBX1BBQ0tFVElORk8sICpYRkFfTFBQQUNLRVRJTkZPOw0KK3R5cGVkZWYgWEZBX1BBQ0tFVElORk8gY29uc3QqIFhGQV9MUENQQUNLRVRJTkZPOw0KK1hGQV9MUENQQUNLRVRJTkZPIFhGQV9HZXRQYWNrZXRCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpOw0KK1hGQV9MUENQQUNLRVRJTkZPIFhGQV9HZXRQYWNrZXRCeUlEKEZYX0RXT1JEIGR3UGFja2V0KTsNCitleHRlcm4gY29uc3QgWEZBX1BBQ0tFVElORk8gZ19YRkFQYWNrZXREYXRhW107DQoraW5saW5lIFhGQV9MUENQQUNLRVRJTkZPIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVQgZVBhY2tldCkgew0KKyAgcmV0dXJuIGdfWEZBUGFja2V0RGF0YSArIGVQYWNrZXQ7DQorfQ0KK2VudW0gWEZBX0FUVFJJQlVURUVOVU0gew0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQXN0ZXJpc2ssDQorICBYRkFfQVRUUklCVVRFRU5VTV9TbGFzaCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0JhY2tzbGFzaCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX09uLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fVGIsDQorICBYRkFfQVRUUklCVVRFRU5VTV9VcCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX01ldGFEYXRhLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRGVsZWdhdGUsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0U3VibWl0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fTmFtZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0Nyb3NzLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fTmV4dCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX05vbmUsDQorICBYRkFfQVRUUklCVVRFRU5VTV9TaG9ydEVkZ2UsDQorICBYRkFfQVRUUklCVVRFRU5VTV8xbW9kMTBfMW1vZDExLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fSGVpZ2h0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQ3Jvc3NEaWFnb25hbCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0FsbCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0FueSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1RvUmlnaHQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9NYXRjaFRlbXBsYXRlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRHBsLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fSW52aXNpYmxlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRml0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fV2lkdGgsDQorICBYRkFfQVRUUklCVVRFRU5VTV9QcmVTdWJtaXQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9JcGwsDQorICBYRkFfQVRUUklCVVRFRU5VTV9GbGF0ZUNvbXByZXNzLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fTWVkLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fT2RkLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fT2ZmLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fUGRmLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fUm93LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fVG9wLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fWGRwLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fWGZkLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fWG1sLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fWmlwLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fWnBsLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0V4Y2x1ZGUsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZUVudGVyLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fUGFpciwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0ZpbHRlciwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX01vdmVMYXN0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRXhwb3J0QW5kSW1wb3J0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fUHVzaCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1BvcnRyYWl0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRGVmYXVsdCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1N0b3JlZFByb2MsDQorICBYRkFfQVRUUklCVVRFRU5VTV9TdGF5Qk9GLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fU3RheUVPRiwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RQcmludCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1VzQ2FycmllciwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fUHJlT3BlbiwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0FjdHVhbCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1Jlc3QsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Ub3BDZW50ZXIsDQorICBYRkFfQVRUUklCVVRFRU5VTV9TdGFuZGFyZFN5bWJvbCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0luaXRpYWxpemUsDQorICBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5QWxsLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fTm9ybWFsLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fTGFuZHNjYXBlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fTm9uSW50ZXJhY3RpdmUsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZUV4aXQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9NaW51cywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0RpYWdvbmFsTGVmdCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1NpbXBsZXhQYWdpbmF0ZWQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Eb2N1bWVudCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1dhcm5pbmcsDQorICBYRkFfQVRUUklCVVRFRU5VTV9BdXRvLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQmVsb3csDQorICBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b21MZWZ0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tQ2VudGVyLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fVGNwbCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1RleHQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Hcm91cGluZywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1NlY3VyZVN5bWJvbCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1ByZUV4ZWN1dGUsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Eb2NDbG9zZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0tleXNldCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1ZlcnRpY2FsLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fUHJlU2F2ZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1ByZVNpZ24sDQorICBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b20sDQorICBYRkFfQVRUUklCVVRFRU5VTV9Ub1RvcCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1ZlcmlmeSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0ZpcnN0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWEsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Tb2xpZCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1Blc3NpbWlzdGljLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRHVwbGV4UGFnaW5hdGVkLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fUm91bmQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9SZW1lcmdlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fT3JkZXJlZCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1BlcmNlbnQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9FdmVuLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRXhpdCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1Rvb2xUaXAsDQorICBYRkFfQVRUUklCVVRFRU5VTV9PcmRlcmVkT2NjdXJyZW5jZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1JlYWRPbmx5LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQ3VycmVuY3ksDQorICBYRkFfQVRUUklCVVRFRU5VTV9Db25jYXQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9UaGFpLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRW1ib3NzZWQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Gb3JtZGF0YSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0dyZWVrLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRGVjaW1hbCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1NlbGVjdCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0xvbmdFZGdlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fUHJvdGVjdGVkLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tUmlnaHQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9aZXJvLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRm9yd2FyZE9ubHksDQorICBYRkFfQVRUUklCVVRFRU5VTV9Eb2NSZWFkeSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0hpZGRlbiwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0luY2x1ZGUsDQorICBYRkFfQVRUUklCVVRFRU5VTV9EYXNoZWQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9NdWx0aVNlbGVjdCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0luYWN0aXZlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRW1iZWQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9TdGF0aWMsDQorICBYRkFfQVRUUklCVVRFRU5VTV9PbkVudHJ5LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQ3lyaWxsaWMsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Ob25CbGFuaywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1RvcFJpZ2h0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fSGVicmV3LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fVG9wTGVmdCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0NlbnRlciwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX01vdmVGaXJzdCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0RpYW1vbmQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9QYWdlT2RkLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fMW1vZDEwLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fS29yZWFuLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQWJvdmVFbWJlZGRlZCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1ppcENvbXByZXNzLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fTnVtZXJpYywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0NpcmNsZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1RvQm90dG9tLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fSW52ZXJ0ZWQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9VcGRhdGUsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Jc29uYW1lLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fU2VydmVyLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fUG9zaXRpb24sDQorICBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGVDZW50ZXIsDQorICBYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1VzZVByaW50ZXJTZXR0aW5nLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fT3V0bGluZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0luZGV4Q2hhbmdlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQ2hhbmdlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fUGFnZUFyZWEsDQorICBYRkFfQVRUUklCVVRFRU5VTV9PbmNlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fT25seSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX09wZW4sDQorICBYRkFfQVRUUklCVVRFRU5VTV9DYXB0aW9uLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fUmFpc2VkLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fSnVzdGlmeSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1JlZkFuZERlc2NlbmRhbnRzLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fU2hvcnQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9QYWdlRnJvbnQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Nb25vc3BhY2UsDQorICBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGUsDQorICBYRkFfQVRUUklCVVRFRU5VTV9QcmVQcmludCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0Fsd2F5cywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd24sDQorICBYRkFfQVRUUklCVVRFRU5VTV9Ub0xlZnQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9BYm92ZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0Rhc2hEb3QsDQorICBYRkFfQVRUUklCVVRFRU5VTV9HcmVnb3JpYW4sDQorICBYRkFfQVRUUklCVVRFRU5VTV9Sb21hbiwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX01vdXNlRG93biwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1N5bWJvbCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VFdmVuLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fU2lnbiwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0FkZE5ldywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1N0YXIsDQorICBYRkFfQVRUUklCVVRFRU5VTV9PcHRpbWlzdGljLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fUmxfdGIsDQorICBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGVSaWdodCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX01haW50YWluLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fUGFja2FnZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1NpbXBsaWZpZWRDaGluZXNlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fVG9DZW50ZXIsDQorICBYRkFfQVRUUklCVVRFRU5VTV9CYWNrLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fVW5zcGVjaWZpZWQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9CYXRjaE9wdGltaXN0aWMsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Cb2xkLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQm90aCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0J1dHQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9DbGllbnQsDQorICBYRkFfQVRUUklCVVRFRU5VTV8ybW9kMTAsDQorICBYRkFfQVRUUklCVVRFRU5VTV9JbWFnZU9ubHksDQorICBYRkFfQVRUUklCVVRFRU5VTV9Ib3Jpem9udGFsLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRG90dGVkLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fVXNlckNvbnRyb2wsDQorICBYRkFfQVRUUklCVVRFRU5VTV9EaWFnb25hbFJpZ2h0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQ29uc3VtZURhdGEsDQorICBYRkFfQVRUUklCVVRFRU5VTV9DaGVjaywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0RhdGEsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Eb3duLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fU2Fuc1NlcmlmLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fSW5saW5lLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fVHJhZGl0aW9uYWxDaGluZXNlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fV2FybiwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1JlZk9ubHksDQorICBYRkFfQVRUUklCVVRFRU5VTV9JbnRlcmFjdGl2ZUZvcm1zLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fV29yZCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1Vub3JkZXJlZCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1JlcXVpcmVkLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fSW1wb3J0T25seSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0JlbG93RW1iZWRkZWQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9KYXBhbmVzZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0Z1bGwsDQorICBYRkFfQVRUUklCVVRFRU5VTV9SbF9yb3csDQorICBYRkFfQVRUUklCVVRFRU5VTV9WaWV0bmFtZXNlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRWFzdEV1cm9wZWFuUm9tYW4sDQorICBYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZVVwLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRXhwb3J0T25seSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0NsZWFyLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQ2xpY2ssDQorICBYRkFfQVRUUklCVVRFRU5VTV9CYXNlNjQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9DbG9zZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0hvc3QsDQorICBYRkFfQVRUUklCVVRFRU5VTV9HbG9iYWwsDQorICBYRkFfQVRUUklCVVRFRU5VTV9CbGFuaywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1RhYmxlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fSW1wb3J0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQ3VzdG9tLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlTGVmdCwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RFeGVjdXRlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fUmFkaXgsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0T3BlbiwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0VudGVyLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fSWdub3JlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fTHJfdGIsDQorICBYRkFfQVRUUklCVVRFRU5VTV9GYW50YXN5LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fSXRhbGljLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQXV0aG9yLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fVG9FZGdlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQ2hvaWNlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRGlzYWJsZWQsDQorICBYRkFfQVRUUklCVVRFRU5VTV9Dcm9zc0hhdGNoLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRGF0YVJlZiwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0Rhc2hEb3REb3QsDQorICBYRkFfQVRUUklCVVRFRU5VTV9TcXVhcmUsDQorICBYRkFfQVRUUklCVVRFRU5VTV9EeW5hbWljLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fTWFudWFsLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRXRjaGVkLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fVmFsaWRhdGlvblN0YXRlLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQ3Vyc2l2ZSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0xhc3QsDQorICBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0LA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fTGluaywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX0xvbmcsDQorICBYRkFfQVRUUklCVVRFRU5VTV9JbnRlcm5hdGlvbmFsQ2FycmllciwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1BERjFfMywNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1BERjFfNiwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1NlcmlmLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fUG9zdFNhdmUsDQorICBYRkFfQVRUUklCVVRFRU5VTV9SZWFkeSwNCisgIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RTaWduLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fQXJhYmljLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fRXJyb3IsDQorICBYRkFfQVRUUklCVVRFRU5VTV9VcmxlbmNvZGVkLA0KKyAgWEZBX0FUVFJJQlVURUVOVU1fTG93ZXJlZCwNCit9Ow0KK2VudW0gWEZBX0FUVFJJQlVURSB7DQorICBYRkFfQVRUUklCVVRFX0gsDQorICBYRkFfQVRUUklCVVRFX1csDQorICBYRkFfQVRUUklCVVRFX1gsDQorICBYRkFfQVRUUklCVVRFX1ksDQorICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgWEZBX0FUVFJJQlVURV9UbywNCisgIFhGQV9BVFRSSUJVVEVfTGluZVRocm91Z2gsDQorICBYRkFfQVRUUklCVVRFX0hBbGlnbiwNCisgIFhGQV9BVFRSSUJVVEVfVHlwZWZhY2UsDQorICBYRkFfQVRUUklCVVRFX0JlZm9yZVRhcmdldCwNCisgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgIFhGQV9BVFRSSUJVVEVfTmV4dCwNCisgIFhGQV9BVFRSSUJVVEVfRGF0YVJvd0NvdW50LA0KKyAgWEZBX0FUVFJJQlVURV9CcmVhaywNCisgIFhGQV9BVFRSSUJVVEVfVlNjcm9sbFBvbGljeSwNCisgIFhGQV9BVFRSSUJVVEVfRm9udEhvcml6b250YWxTY2FsZSwNCisgIFhGQV9BVFRSSUJVVEVfVGV4dEluZGVudCwNCisgIFhGQV9BVFRSSUJVVEVfQ29udGV4dCwNCisgIFhGQV9BVFRSSUJVVEVfVHJheU91dCwNCisgIFhGQV9BVFRSSUJVVEVfQ2FwLA0KKyAgWEZBX0FUVFJJQlVURV9NYXgsDQorICBYRkFfQVRUUklCVVRFX01pbiwNCisgIFhGQV9BVFRSSUJVVEVfUmVmLA0KKyAgWEZBX0FUVFJJQlVURV9SaWQsDQorICBYRkFfQVRUUklCVVRFX1VybCwNCisgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQsDQorICBYRkFfQVRUUklCVVRFX1dpZG93cywNCisgIFhGQV9BVFRSSUJVVEVfTGV2ZWwsDQorICBYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0LA0KKyAgWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RhcmdldCwNCisgIFhGQV9BVFRSSUJVVEVfQWxsb3dNYWNybywNCisgIFhGQV9BVFRSSUJVVEVfUGFnZVBvc2l0aW9uLA0KKyAgWEZBX0FUVFJJQlVURV9Db2x1bW5XaWR0aHMsDQorICBYRkFfQVRUUklCVVRFX092ZXJmbG93TGVhZGVyLA0KKyAgWEZBX0FUVFJJQlVURV9BY3Rpb24sDQorICBYRkFfQVRUUklCVVRFX05vblJlcHVkaWF0aW9uLA0KKyAgWEZBX0FUVFJJQlVURV9SYXRlLA0KKyAgWEZBX0FUVFJJQlVURV9BbGxvd1JpY2hUZXh0LA0KKyAgWEZBX0FUVFJJQlVURV9Sb2xlLA0KKyAgWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RyYWlsZXIsDQorICBYRkFfQVRUUklCVVRFX09wZXJhdGlvbiwNCisgIFhGQV9BVFRSSUJVVEVfVGltZW91dCwNCisgIFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQsDQorICBYRkFfQVRUUklCVVRFX0FjY2VzcywNCisgIFhGQV9BVFRSSUJVVEVfQ29tbWFuZFR5cGUsDQorICBYRkFfQVRUUklCVVRFX0Zvcm1hdCwNCisgIFhGQV9BVFRSSUJVVEVfRGF0YVByZXAsDQorICBYRkFfQVRUUklCVVRFX1dpZGdldERhdGEsDQorICBYRkFfQVRUUklCVVRFX0FiYnIsDQorICBYRkFfQVRUUklCVVRFX01hcmdpblJpZ2h0LA0KKyAgWEZBX0FUVFJJQlVURV9EYXRhRGVzY3JpcHRpb24sDQorICBYRkFfQVRUUklCVVRFX0VuY2lwaGVyT25seSwNCisgIFhGQV9BVFRSSUJVVEVfS2VybmluZ01vZGUsDQorICBYRkFfQVRUUklCVVRFX1JvdGF0ZSwNCisgIFhGQV9BVFRSSUJVVEVfV29yZENoYXJhY3RlckNvdW50LA0KKyAgWEZBX0FUVFJJQlVURV9UeXBlLA0KKyAgWEZBX0FUVFJJQlVURV9SZXNlcnZlLA0KKyAgWEZBX0FUVFJJQlVURV9UZXh0TG9jYXRpb24sDQorICBYRkFfQVRUUklCVVRFX1ByaW9yaXR5LA0KKyAgWEZBX0FUVFJJQlVURV9VbmRlcmxpbmUsDQorICBYRkFfQVRUUklCVVRFX01vZHVsZVdpZHRoLA0KKyAgWEZBX0FUVFJJQlVURV9IeXBoZW5hdGUsDQorICBYRkFfQVRUUklCVVRFX0xpc3RlbiwNCisgIFhGQV9BVFRSSUJVVEVfRGVsaW1pdGVyLA0KKyAgWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwNCisgIFhGQV9BVFRSSUJVVEVfU3RhcnROZXcsDQorICBYRkFfQVRUUklCVVRFX0VvZkFjdGlvbiwNCisgIFhGQV9BVFRSSUJVVEVfQWxsb3dOZXV0cmFsLA0KKyAgWEZBX0FUVFJJQlVURV9Db25uZWN0aW9uLA0KKyAgWEZBX0FUVFJJQlVURV9CYXNlbGluZVNoaWZ0LA0KKyAgWEZBX0FUVFJJQlVURV9PdmVybGluZVBlcmlvZCwNCisgIFhGQV9BVFRSSUJVVEVfRnJhY0RpZ2l0cywNCisgIFhGQV9BVFRSSUJVVEVfT3JpZW50YXRpb24sDQorICBYRkFfQVRUUklCVVRFX1RpbWVTdGFtcCwNCisgIFhGQV9BVFRSSUJVVEVfUHJpbnRDaGVja0RpZ2l0LA0KKyAgWEZBX0FUVFJJQlVURV9NYXJnaW5MZWZ0LA0KKyAgWEZBX0FUVFJJQlVURV9TdHJva2UsDQorICBYRkFfQVRUUklCVVRFX01vZHVsZUhlaWdodCwNCisgIFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywNCisgIFhGQV9BVFRSSUJVVEVfVXNhZ2UsDQorICBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLA0KKyAgWEZBX0FUVFJJQlVURV9SYWRpeE9mZnNldCwNCisgIFhGQV9BVFRSSUJVVEVfUHJlc2VydmUsDQorICBYRkFfQVRUUklCVVRFX0FsaWFzTm9kZSwNCisgIFhGQV9BVFRSSUJVVEVfTXVsdGlMaW5lLA0KKyAgWEZBX0FUVFJJQlVURV9WZXJzaW9uLA0KKyAgWEZBX0FUVFJJQlVURV9TdGFydENoYXIsDQorICBYRkFfQVRUUklCVVRFX1NjcmlwdFRlc3QsDQorICBYRkFfQVRUUklCVVRFX1N0YXJ0QW5nbGUsDQorICBYRkFfQVRUUklCVVRFX0N1cnNvclR5cGUsDQorICBYRkFfQVRUUklCVVRFX0RpZ2l0YWxTaWduYXR1cmUsDQorICBYRkFfQVRUUklCVVRFX0NvZGVUeXBlLA0KKyAgWEZBX0FUVFJJQlVURV9PdXRwdXQsDQorICBYRkFfQVRUUklCVVRFX0Jvb2tlbmRUcmFpbGVyLA0KKyAgWEZBX0FUVFJJQlVURV9JbWFnaW5nQkJveCwNCisgIFhGQV9BVFRSSUJVVEVfRXhjbHVkZUluaXRpYWxDYXAsDQorICBYRkFfQVRUUklCVVRFX0ZvcmNlLA0KKyAgWEZBX0FUVFJJQlVURV9DcmxTaWduLA0KKyAgWEZBX0FUVFJJQlVURV9QcmV2aW91cywNCisgIFhGQV9BVFRSSUJVVEVfUHVzaENoYXJhY3RlckNvdW50LA0KKyAgWEZBX0FUVFJJQlVURV9OdWxsVGVzdCwNCisgIFhGQV9BVFRSSUJVVEVfUnVuQXQsDQorICBYRkFfQVRUUklCVVRFX1NwYWNlQmVsb3csDQorICBYRkFfQVRUUklCVVRFX1N3ZWVwQW5nbGUsDQorICBYRkFfQVRUUklCVVRFX051bWJlck9mQ2VsbHMsDQorICBYRkFfQVRUUklCVVRFX0xldHRlclNwYWNpbmcsDQorICBYRkFfQVRUUklCVVRFX0xvY2tUeXBlLA0KKyAgWEZBX0FUVFJJQlVURV9QYXNzd29yZENoYXIsDQorICBYRkFfQVRUUklCVVRFX1ZBbGlnbiwNCisgIFhGQV9BVFRSSUJVVEVfU291cmNlQmVsb3csDQorICBYRkFfQVRUUklCVVRFX0ludmVydGVkLA0KKyAgWEZBX0FUVFJJQlVURV9NYXJrLA0KKyAgWEZBX0FUVFJJQlVURV9NYXhILA0KKyAgWEZBX0FUVFJJQlVURV9NYXhXLA0KKyAgWEZBX0FUVFJJQlVURV9UcnVuY2F0ZSwNCisgIFhGQV9BVFRSSUJVVEVfTWluSCwNCisgIFhGQV9BVFRSSUJVVEVfTWluVywNCisgIFhGQV9BVFRSSUJVVEVfSW5pdGlhbCwNCisgIFhGQV9BVFRSSUJVVEVfTW9kZSwNCisgIFhGQV9BVFRSSUJVVEVfTGF5b3V0LA0KKyAgWEZBX0FUVFJJQlVURV9TZXJ2ZXIsDQorICBYRkFfQVRUUklCVVRFX0VtYmVkUERGLA0KKyAgWEZBX0FUVFJJQlVURV9PZGRPckV2ZW4sDQorICBYRkFfQVRUUklCVVRFX1RhYkRlZmF1bHQsDQorICBYRkFfQVRUUklCVVRFX0NvbnRhaW5zLA0KKyAgWEZBX0FUVFJJQlVURV9SaWdodEluc2V0LA0KKyAgWEZBX0FUVFJJQlVURV9NYXhDaGFycywNCisgIFhGQV9BVFRSSUJVVEVfT3BlbiwNCisgIFhGQV9BVFRSSUJVVEVfUmVsYXRpb24sDQorICBYRkFfQVRUUklCVVRFX1dpZGVOYXJyb3dSYXRpbywNCisgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsDQorICBYRkFfQVRUUklCVVRFX1NpZ25hdHVyZVR5cGUsDQorICBYRkFfQVRUUklCVVRFX0xpbmVUaHJvdWdoUGVyaW9kLA0KKyAgWEZBX0FUVFJJQlVURV9TaGFwZSwNCisgIFhGQV9BVFRSSUJVVEVfVGFiU3RvcHMsDQorICBYRkFfQVRUUklCVVRFX091dHB1dEJlbG93LA0KKyAgWEZBX0FUVFJJQlVURV9TaG9ydCwNCisgIFhGQV9BVFRSSUJVVEVfRm9udFZlcnRpY2FsU2NhbGUsDQorICBYRkFfQVRUUklCVVRFX1RoaWNrbmVzcywNCisgIFhGQV9BVFRSSUJVVEVfQ29tbWl0T24sDQorICBYRkFfQVRUUklCVVRFX1JlbWFpbkNoYXJhY3RlckNvdW50LA0KKyAgWEZBX0FUVFJJQlVURV9LZXlBZ3JlZW1lbnQsDQorICBYRkFfQVRUUklCVVRFX0Vycm9yQ29ycmVjdGlvbkxldmVsLA0KKyAgWEZBX0FUVFJJQlVURV9VcHNNb2RlLA0KKyAgWEZBX0FUVFJJQlVURV9NZXJnZU1vZGUsDQorICBYRkFfQVRUUklCVVRFX0NpcmN1bGFyLA0KKyAgWEZBX0FUVFJJQlVURV9Qc05hbWUsDQorICBYRkFfQVRUUklCVVRFX1RyYWlsZXIsDQorICBYRkFfQVRUUklCVVRFX1VuaWNvZGVSYW5nZSwNCisgIFhGQV9BVFRSSUJVVEVfRXhlY3V0ZVR5cGUsDQorICBYRkFfQVRUUklCVVRFX0R1cGxleEltcG9zaXRpb24sDQorICBYRkFfQVRUUklCVVRFX1RyYXlJbiwNCisgIFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsDQorICBYRkFfQVRUUklCVVRFX0JvZkFjdGlvbiwNCisgIFhGQV9BVFRSSUJVVEVfU2F2ZSwNCisgIFhGQV9BVFRSSUJVVEVfVGFyZ2V0VHlwZSwNCisgIFhGQV9BVFRSSUJVVEVfS2V5RW5jaXBoZXJtZW50LA0KKyAgWEZBX0FUVFJJQlVURV9DcmVkZW50aWFsU2VydmVyUG9saWN5LA0KKyAgWEZBX0FUVFJJQlVURV9TaXplLA0KKyAgWEZBX0FUVFJJQlVURV9Jbml0aWFsTnVtYmVyLA0KKyAgWEZBX0FUVFJJQlVURV9TbG9wZSwNCisgIFhGQV9BVFRSSUJVVEVfQ1NwYWNlLA0KKyAgWEZBX0FUVFJJQlVURV9Db2xTcGFuLA0KKyAgWEZBX0FUVFJJQlVURV9CaW5kaW5nLA0KKyAgWEZBX0FUVFJJQlVURV9DaGVja3N1bSwNCisgIFhGQV9BVFRSSUJVVEVfQ2hhckVuY29kaW5nLA0KKyAgWEZBX0FUVFJJQlVURV9CaW5kLA0KKyAgWEZBX0FUVFJJQlVURV9UZXh0RW50cnksDQorICBYRkFfQVRUUklCVVRFX0FyY2hpdmUsDQorICBYRkFfQVRUUklCVVRFX1V1aWQsDQorICBYRkFfQVRUUklCVVRFX1Bvc3R1cmUsDQorICBYRkFfQVRUUklCVVRFX0FmdGVyLA0KKyAgWEZBX0FUVFJJQlVURV9PcnBoYW5zLA0KKyAgWEZBX0FUVFJJQlVURV9RdWFsaWZpZWROYW1lLA0KKyAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgWEZBX0FUVFJJQlVURV9Mb2NhbGUsDQorICBYRkFfQVRUUklCVVRFX1dlaWdodCwNCisgIFhGQV9BVFRSSUJVVEVfVW5kZXJsaW5lUGVyaW9kLA0KKyAgWEZBX0FUVFJJQlVURV9EYXRhLA0KKyAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgWEZBX0FUVFJJQlVURV9OdW1iZXJlZCwNCisgIFhGQV9BVFRSSUJVVEVfRGF0YUNvbHVtbkNvdW50LA0KKyAgWEZBX0FUVFJJQlVURV9PdmVybGluZSwNCisgIFhGQV9BVFRSSUJVVEVfVXJsUG9saWN5LA0KKyAgWEZBX0FUVFJJQlVURV9BbmNob3JUeXBlLA0KKyAgWEZBX0FUVFJJQlVURV9MYWJlbFJlZiwNCisgIFhGQV9BVFRSSUJVVEVfQm9va2VuZExlYWRlciwNCisgIFhGQV9BVFRSSUJVVEVfTWF4TGVuZ3RoLA0KKyAgWEZBX0FUVFJJQlVURV9BY2Nlc3NLZXksDQorICBYRkFfQVRUUklCVVRFX0N1cnNvckxvY2F0aW9uLA0KKyAgWEZBX0FUVFJJQlVURV9EZWxheWVkT3BlbiwNCisgIFhGQV9BVFRSSUJVVEVfVGFyZ2V0LA0KKyAgWEZBX0FUVFJJQlVURV9EYXRhRW5jaXBoZXJtZW50LA0KKyAgWEZBX0FUVFJJQlVURV9BZnRlclRhcmdldCwNCisgIFhGQV9BVFRSSUJVVEVfTGVhZGVyLA0KKyAgWEZBX0FUVFJJQlVURV9QaWNrZXIsDQorICBYRkFfQVRUUklCVVRFX0Zyb20sDQorICBYRkFfQVRUUklCVVRFX0Jhc2VQcm9maWxlLA0KKyAgWEZBX0FUVFJJQlVURV9Bc3BlY3QsDQorICBYRkFfQVRUUklCVVRFX1Jvd0NvbHVtblJhdGlvLA0KKyAgWEZBX0FUVFJJQlVURV9MaW5lSGVpZ2h0LA0KKyAgWEZBX0FUVFJJQlVURV9IaWdobGlnaHQsDQorICBYRkFfQVRUUklCVVRFX1ZhbHVlUmVmLA0KKyAgWEZBX0FUVFJJQlVURV9NYXhFbnRyaWVzLA0KKyAgWEZBX0FUVFJJQlVURV9EYXRhTGVuZ3RoLA0KKyAgWEZBX0FUVFJJQlVURV9BY3Rpdml0eSwNCisgIFhGQV9BVFRSSUJVVEVfSW5wdXQsDQorICBYRkFfQVRUUklCVVRFX1ZhbHVlLA0KKyAgWEZBX0FUVFJJQlVURV9CbGFua09yTm90QmxhbmssDQorICBYRkFfQVRUUklCVVRFX0FkZFJldm9jYXRpb25JbmZvLA0KKyAgWEZBX0FUVFJJQlVURV9HZW5lcmljRmFtaWx5LA0KKyAgWEZBX0FUVFJJQlVURV9IYW5kLA0KKyAgWEZBX0FUVFJJQlVURV9IcmVmLA0KKyAgWEZBX0FUVFJJQlVURV9UZXh0RW5jb2RpbmcsDQorICBYRkFfQVRUUklCVVRFX0xlYWREaWdpdHMsDQorICBYRkFfQVRUUklCVVRFX1Blcm1pc3Npb25zLA0KKyAgWEZBX0FUVFJJQlVURV9TcGFjZUFib3ZlLA0KKyAgWEZBX0FUVFJJQlVURV9Db2RlQmFzZSwNCisgIFhGQV9BVFRSSUJVVEVfU3RvY2ssDQorICBYRkFfQVRUUklCVVRFX0lzTnVsbCwNCisgIFhGQV9BVFRSSUJVVEVfUmVzdG9yZVN0YXRlLA0KKyAgWEZBX0FUVFJJQlVURV9FeGNsdWRlQWxsQ2FwcywNCisgIFhGQV9BVFRSSUJVVEVfRm9ybWF0VGVzdCwNCisgIFhGQV9BVFRSSUJVVEVfSFNjcm9sbFBvbGljeSwNCisgIFhGQV9BVFRSSUJVVEVfSm9pbiwNCisgIFhGQV9BVFRSSUJVVEVfS2V5Q2VydFNpZ24sDQorICBYRkFfQVRUUklCVVRFX1JhZGl1cywNCisgIFhGQV9BVFRSSUJVVEVfU291cmNlQWJvdmUsDQorICBYRkFfQVRUUklCVVRFX092ZXJyaWRlLA0KKyAgWEZBX0FUVFJJQlVURV9DbGFzc0lkLA0KKyAgWEZBX0FUVFJJQlVURV9EaXNhYmxlLA0KKyAgWEZBX0FUVFJJQlVURV9TY29wZSwNCisgIFhGQV9BVFRSSUJVVEVfTWF0Y2gsDQorICBYRkFfQVRUUklCVVRFX1BsYWNlbWVudCwNCisgIFhGQV9BVFRSSUJVVEVfQmVmb3JlLA0KKyAgWEZBX0FUVFJJQlVURV9Xcml0aW5nU2NyaXB0LA0KKyAgWEZBX0FUVFJJQlVURV9FbmRDaGFyLA0KKyAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgWEZBX0FUVFJJQlVURV9Mb25nLA0KKyAgWEZBX0FUVFJJQlVURV9JbnRhY3QsDQorICBYRkFfQVRUUklCVVRFX1hkcENvbnRlbnQsDQorICBYRkFfQVRUUklCVVRFX0RlY2lwaGVyT25seSwNCit9Ow0KK2VudW0gWEZBX0VMRU1FTlQgew0KKyAgWEZBX0VMRU1FTlRfUHMsDQorICBYRkFfRUxFTUVOVF9UbywNCisgIFhGQV9FTEVNRU5UX1VpLA0KKyAgWEZBX0VMRU1FTlRfUmVjb3JkU2V0LA0KKyAgWEZBX0VMRU1FTlRfU3Vic2V0QmVsb3csDQorICBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0LA0KKyAgWEZBX0VMRU1FTlRfQWRvYmVFeHRlbnNpb25MZXZlbCwNCisgIFhGQV9FTEVNRU5UX1R5cGVmYWNlLA0KKyAgWEZBX0VMRU1FTlRfQnJlYWssDQorICBYRkFfRUxFTUVOVF9Gb250SW5mbywNCisgIFhGQV9FTEVNRU5UX051bWJlclBhdHRlcm4sDQorICBYRkFfRUxFTUVOVF9EeW5hbWljUmVuZGVyLA0KKyAgWEZBX0VMRU1FTlRfUHJpbnRTY2FsaW5nLA0KKyAgWEZBX0VMRU1FTlRfQ2hlY2tCdXR0b24sDQorICBYRkFfRUxFTUVOVF9EYXRlUGF0dGVybnMsDQorICBYRkFfRUxFTUVOVF9Tb3VyY2VTZXQsDQorICBYRkFfRUxFTUVOVF9BbWQsDQorICBYRkFfRUxFTUVOVF9BcmMsDQorICBYRkFfRUxFTUVOVF9EYXksDQorICBYRkFfRUxFTUVOVF9FcmEsDQorICBYRkFfRUxFTUVOVF9Kb2csDQorICBYRkFfRUxFTUVOVF9Mb2csDQorICBYRkFfRUxFTUVOVF9NYXAsDQorICBYRkFfRUxFTUVOVF9NZHAsDQorICBYRkFfRUxFTUVOVF9CcmVha0JlZm9yZSwNCisgIFhGQV9FTEVNRU5UX09pZCwNCisgIFhGQV9FTEVNRU5UX1BjbCwNCisgIFhGQV9FTEVNRU5UX1BkZiwNCisgIFhGQV9FTEVNRU5UX1JlZiwNCisgIFhGQV9FTEVNRU5UX1VyaSwNCisgIFhGQV9FTEVNRU5UX1hkYywNCisgIFhGQV9FTEVNRU5UX1hkcCwNCisgIFhGQV9FTEVNRU5UX1hmYSwNCisgIFhGQV9FTEVNRU5UX1hzbCwNCisgIFhGQV9FTEVNRU5UX1pwbCwNCisgIFhGQV9FTEVNRU5UX0NhY2hlLA0KKyAgWEZBX0VMRU1FTlRfTWFyZ2luLA0KKyAgWEZBX0VMRU1FTlRfS2V5VXNhZ2UsDQorICBYRkFfRUxFTUVOVF9FeGNsdWRlLA0KKyAgWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdCwNCisgIFhGQV9FTEVNRU5UX0xldmVsLA0KKyAgWEZBX0VMRU1FTlRfTGFiZWxQcmludGVyLA0KKyAgWEZBX0VMRU1FTlRfQ2FsZW5kYXJTeW1ib2xzLA0KKyAgWEZBX0VMRU1FTlRfUGFyYSwNCisgIFhGQV9FTEVNRU5UX1BhcnQsDQorICBYRkFfRUxFTUVOVF9QZGZhLA0KKyAgWEZBX0VMRU1FTlRfRmlsdGVyLA0KKyAgWEZBX0VMRU1FTlRfUHJlc2VudCwNCisgIFhGQV9FTEVNRU5UX1BhZ2luYXRpb24sDQorICBYRkFfRUxFTUVOVF9FbmNvZGluZywNCisgIFhGQV9FTEVNRU5UX0V2ZW50LA0KKyAgWEZBX0VMRU1FTlRfV2hpdGVzcGFjZSwNCisgIFhGQV9FTEVNRU5UX0RlZmF1bHRVaSwNCisgIFhGQV9FTEVNRU5UX0RhdGFNb2RlbCwNCisgIFhGQV9FTEVNRU5UX0JhcmNvZGUsDQorICBYRkFfRUxFTUVOVF9UaW1lUGF0dGVybiwNCisgIFhGQV9FTEVNRU5UX0JhdGNoT3V0cHV0LA0KKyAgWEZBX0VMRU1FTlRfRW5mb3JjZSwNCisgIFhGQV9FTEVNRU5UX0N1cnJlbmN5U3ltYm9scywNCisgIFhGQV9FTEVNRU5UX0FkZFNpbGVudFByaW50LA0KKyAgWEZBX0VMRU1FTlRfUmVuYW1lLA0KKyAgWEZBX0VMRU1FTlRfT3BlcmF0aW9uLA0KKyAgWEZBX0VMRU1FTlRfVHlwZWZhY2VzLA0KKyAgWEZBX0VMRU1FTlRfU3ViamVjdEROcywNCisgIFhGQV9FTEVNRU5UX0lzc3VlcnMsDQorICBYRkFfRUxFTUVOVF9TaWduYXR1cmVQc2V1ZG9Nb2RlbCwNCisgIFhGQV9FTEVNRU5UX1dzZGxDb25uZWN0aW9uLA0KKyAgWEZBX0VMRU1FTlRfRGVidWcsDQorICBYRkFfRUxFTUVOVF9EZWx0YSwNCisgIFhGQV9FTEVNRU5UX0VyYU5hbWVzLA0KKyAgWEZBX0VMRU1FTlRfTW9kaWZ5QW5ub3RzLA0KKyAgWEZBX0VMRU1FTlRfU3RhcnROb2RlLA0KKyAgWEZBX0VMRU1FTlRfQnV0dG9uLA0KKyAgWEZBX0VMRU1FTlRfRm9ybWF0LA0KKyAgWEZBX0VMRU1FTlRfQm9yZGVyLA0KKyAgWEZBX0VMRU1FTlRfQXJlYSwNCisgIFhGQV9FTEVNRU5UX0h5cGhlbmF0aW9uLA0KKyAgWEZBX0VMRU1FTlRfVGV4dCwNCisgIFhGQV9FTEVNRU5UX1RpbWUsDQorICBYRkFfRUxFTUVOVF9UeXBlLA0KKyAgWEZBX0VMRU1FTlRfT3ZlcnByaW50LA0KKyAgWEZBX0VMRU1FTlRfQ2VydGlmaWNhdGVzLA0KKyAgWEZBX0VMRU1FTlRfRW5jcnlwdGlvbk1ldGhvZHMsDQorICBYRkFfRUxFTUVOVF9TZXRQcm9wZXJ0eSwNCisgIFhGQV9FTEVNRU5UX1ByaW50ZXJOYW1lLA0KKyAgWEZBX0VMRU1FTlRfU3RhcnRQYWdlLA0KKyAgWEZBX0VMRU1FTlRfUGFnZU9mZnNldCwNCisgIFhGQV9FTEVNRU5UX0RhdGVUaW1lLA0KKyAgWEZBX0VMRU1FTlRfQ29tYiwNCisgIFhGQV9FTEVNRU5UX1BhdHRlcm4sDQorICBYRkFfRUxFTUVOVF9JZkVtcHR5LA0KKyAgWEZBX0VMRU1FTlRfU3VwcHJlc3NCYW5uZXIsDQorICBYRkFfRUxFTUVOVF9PdXRwdXRCaW4sDQorICBYRkFfRUxFTUVOVF9GaWVsZCwNCisgIFhGQV9FTEVNRU5UX0FnZW50LA0KKyAgWEZBX0VMRU1FTlRfT3V0cHV0WFNMLA0KKyAgWEZBX0VMRU1FTlRfQWRqdXN0RGF0YSwNCisgIFhGQV9FTEVNRU5UX0F1dG9TYXZlLA0KKyAgWEZBX0VMRU1FTlRfQ29udGVudEFyZWEsDQorICBYRkFfRUxFTUVOVF9FdmVudFBzZXVkb01vZGVsLA0KKyAgWEZBX0VMRU1FTlRfV3NkbEFkZHJlc3MsDQorICBYRkFfRUxFTUVOVF9Tb2xpZCwNCisgIFhGQV9FTEVNRU5UX0RhdGVUaW1lU3ltYm9scywNCisgIFhGQV9FTEVNRU5UX0VuY3J5cHRpb25MZXZlbCwNCisgIFhGQV9FTEVNRU5UX0VkZ2UsDQorICBYRkFfRUxFTUVOVF9TdGlwcGxlLA0KKyAgWEZBX0VMRU1FTlRfQXR0cmlidXRlcywNCisgIFhGQV9FTEVNRU5UX1ZlcnNpb25Db250cm9sLA0KKyAgWEZBX0VMRU1FTlRfTWVyaWRpZW0sDQorICBYRkFfRUxFTUVOVF9FeGNsR3JvdXAsDQorICBYRkFfRUxFTUVOVF9Ub29sVGlwLA0KKyAgWEZBX0VMRU1FTlRfQ29tcHJlc3MsDQorICBYRkFfRUxFTUVOVF9SZWFzb24sDQorICBYRkFfRUxFTUVOVF9FeGVjdXRlLA0KKyAgWEZBX0VMRU1FTlRfQ29udGVudENvcHksDQorICBYRkFfRUxFTUVOVF9EYXRlVGltZUVkaXQsDQorICBYRkFfRUxFTUVOVF9Db25maWcsDQorICBYRkFfRUxFTUVOVF9JbWFnZSwNCisgIFhGQV9FTEVNRU5UX1NoYXJweEhUTUwsDQorICBYRkFfRUxFTUVOVF9OdW1iZXJPZkNvcGllcywNCisgIFhGQV9FTEVNRU5UX0JlaGF2aW9yT3ZlcnJpZGUsDQorICBYRkFfRUxFTUVOVF9UaW1lU3RhbXAsDQorICBYRkFfRUxFTUVOVF9Nb250aCwNCisgIFhGQV9FTEVNRU5UX1ZpZXdlclByZWZlcmVuY2VzLA0KKyAgWEZBX0VMRU1FTlRfU2NyaXB0TW9kZWwsDQorICBYRkFfRUxFTUVOVF9EZWNpbWFsLA0KKyAgWEZBX0VMRU1FTlRfU3ViZm9ybSwNCisgIFhGQV9FTEVNRU5UX1NlbGVjdCwNCisgIFhGQV9FTEVNRU5UX1dpbmRvdywNCisgIFhGQV9FTEVNRU5UX0xvY2FsZVNldCwNCisgIFhGQV9FTEVNRU5UX0hhbmRsZXIsDQorICBYRkFfRUxFTUVOVF9Ib3N0UHNldWRvTW9kZWwsDQorICBYRkFfRUxFTUVOVF9QcmVzZW5jZSwNCisgIFhGQV9FTEVNRU5UX1JlY29yZCwNCisgIFhGQV9FTEVNRU5UX0VtYmVkLA0KKyAgWEZBX0VMRU1FTlRfVmVyc2lvbiwNCisgIFhGQV9FTEVNRU5UX0NvbW1hbmQsDQorICBYRkFfRUxFTUVOVF9Db3BpZXMsDQorICBYRkFfRUxFTUVOVF9TdGFwbGUsDQorICBYRkFfRUxFTUVOVF9TdWJtaXRGb3JtYXQsDQorICBYRkFfRUxFTUVOVF9Cb29sZWFuLA0KKyAgWEZBX0VMRU1FTlRfTWVzc2FnZSwNCisgIFhGQV9FTEVNRU5UX091dHB1dCwNCisgIFhGQV9FTEVNRU5UX1BzTWFwLA0KKyAgWEZBX0VMRU1FTlRfRXhjbHVkZU5TLA0KKyAgWEZBX0VMRU1FTlRfQXNzaXN0LA0KKyAgWEZBX0VMRU1FTlRfUGljdHVyZSwNCisgIFhGQV9FTEVNRU5UX1RyYXZlcnNhbCwNCisgIFhGQV9FTEVNRU5UX1NpbGVudFByaW50LA0KKyAgWEZBX0VMRU1FTlRfV2ViQ2xpZW50LA0KKyAgWEZBX0VMRU1FTlRfTGF5b3V0UHNldWRvTW9kZWwsDQorICBYRkFfRUxFTUVOVF9Qcm9kdWNlciwNCisgIFhGQV9FTEVNRU5UX0Nvcm5lciwNCisgIFhGQV9FTEVNRU5UX01zZ0lkLA0KKyAgWEZBX0VMRU1FTlRfQ29sb3IsDQorICBYRkFfRUxFTUVOVF9LZWVwLA0KKyAgWEZBX0VMRU1FTlRfUXVlcnksDQorICBYRkFfRUxFTUVOVF9JbnNlcnQsDQorICBYRkFfRUxFTUVOVF9JbWFnZUVkaXQsDQorICBYRkFfRUxFTUVOVF9WYWxpZGF0ZSwNCisgIFhGQV9FTEVNRU5UX0RpZ2VzdE1ldGhvZHMsDQorICBYRkFfRUxFTUVOVF9OdW1iZXJQYXR0ZXJucywNCisgIFhGQV9FTEVNRU5UX1BhZ2VTZXQsDQorICBYRkFfRUxFTUVOVF9JbnRlZ2VyLA0KKyAgWEZBX0VMRU1FTlRfU29hcEFkZHJlc3MsDQorICBYRkFfRUxFTUVOVF9FcXVhdGUsDQorICBYRkFfRUxFTUVOVF9Gb3JtRmllbGRGaWxsaW5nLA0KKyAgWEZBX0VMRU1FTlRfUGFnZVJhbmdlLA0KKyAgWEZBX0VMRU1FTlRfVXBkYXRlLA0KKyAgWEZBX0VMRU1FTlRfQ29ubmVjdFN0cmluZywNCisgIFhGQV9FTEVNRU5UX01vZGUsDQorICBYRkFfRUxFTUVOVF9MYXlvdXQsDQorICBYRkFfRUxFTUVOVF9TaGFycHhtbCwNCisgIFhGQV9FTEVNRU5UX1hzZENvbm5lY3Rpb24sDQorICBYRkFfRUxFTUVOVF9UcmF2ZXJzZSwNCisgIFhGQV9FTEVNRU5UX0VuY29kaW5ncywNCisgIFhGQV9FTEVNRU5UX1RlbXBsYXRlLA0KKyAgWEZBX0VMRU1FTlRfQWNyb2JhdCwNCisgIFhGQV9FTEVNRU5UX1ZhbGlkYXRpb25NZXNzYWdpbmcsDQorICBYRkFfRUxFTUVOVF9TaWduaW5nLA0KKyAgWEZBX0VMRU1FTlRfRGF0YVdpbmRvdywNCisgIFhGQV9FTEVNRU5UX1NjcmlwdCwNCisgIFhGQV9FTEVNRU5UX0FkZFZpZXdlclByZWZlcmVuY2VzLA0KKyAgWEZBX0VMRU1FTlRfQWx3YXlzRW1iZWQsDQorICBYRkFfRUxFTUVOVF9QYXNzd29yZEVkaXQsDQorICBYRkFfRUxFTUVOVF9OdW1lcmljRWRpdCwNCisgIFhGQV9FTEVNRU5UX0VuY3J5cHRpb25NZXRob2QsDQorICBYRkFfRUxFTUVOVF9DaGFuZ2UsDQorICBYRkFfRUxFTUVOVF9QYWdlQXJlYSwNCisgIFhGQV9FTEVNRU5UX1N1Ym1pdFVybCwNCisgIFhGQV9FTEVNRU5UX09pZHMsDQorICBYRkFfRUxFTUVOVF9TaWduYXR1cmUsDQorICBYRkFfRUxFTUVOVF9BREJFX0pTQ29uc29sZSwNCisgIFhGQV9FTEVNRU5UX0NhcHRpb24sDQorICBYRkFfRUxFTUVOVF9SZWxldmFudCwNCisgIFhGQV9FTEVNRU5UX0ZsaXBMYWJlbCwNCisgIFhGQV9FTEVNRU5UX0V4RGF0YSwNCisgIFhGQV9FTEVNRU5UX0RheU5hbWVzLA0KKyAgWEZBX0VMRU1FTlRfU29hcEFjdGlvbiwNCisgIFhGQV9FTEVNRU5UX0RlZmF1bHRUeXBlZmFjZSwNCisgIFhGQV9FTEVNRU5UX01hbmlmZXN0LA0KKyAgWEZBX0VMRU1FTlRfT3ZlcmZsb3csDQorICBYRkFfRUxFTUVOVF9MaW5lYXIsDQorICBYRkFfRUxFTUVOVF9DdXJyZW5jeVN5bWJvbCwNCisgIFhGQV9FTEVNRU5UX0RlbGV0ZSwNCisgIFhGQV9FTEVNRU5UX0RlbHRhcywNCisgIFhGQV9FTEVNRU5UX0RpZ2VzdE1ldGhvZCwNCisgIFhGQV9FTEVNRU5UX0luc3RhbmNlTWFuYWdlciwNCisgIFhGQV9FTEVNRU5UX0VxdWF0ZVJhbmdlLA0KKyAgWEZBX0VMRU1FTlRfTWVkaXVtLA0KKyAgWEZBX0VMRU1FTlRfVGV4dEVkaXQsDQorICBYRkFfRUxFTUVOVF9UZW1wbGF0ZUNhY2hlLA0KKyAgWEZBX0VMRU1FTlRfQ29tcHJlc3NPYmplY3RTdHJlYW0sDQorICBYRkFfRUxFTUVOVF9EYXRhVmFsdWUsDQorICBYRkFfRUxFTUVOVF9BY2Nlc3NpYmxlQ29udGVudCwNCisgIFhGQV9FTEVNRU5UX05vZGVMaXN0LA0KKyAgWEZBX0VMRU1FTlRfSW5jbHVkZVhEUENvbnRlbnQsDQorICBYRkFfRUxFTUVOVF9YbWxDb25uZWN0aW9uLA0KKyAgWEZBX0VMRU1FTlRfVmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMsDQorICBYRkFfRUxFTUVOVF9TaWduRGF0YSwNCisgIFhGQV9FTEVNRU5UX1BhY2tldHMsDQorICBYRkFfRUxFTUVOVF9EYXRlUGF0dGVybiwNCisgIFhGQV9FTEVNRU5UX0R1cGxleE9wdGlvbiwNCisgIFhGQV9FTEVNRU5UX0Jhc2UsDQorICBYRkFfRUxFTUVOVF9CaW5kLA0KKyAgWEZBX0VMRU1FTlRfQ29tcHJlc3Npb24sDQorICBYRkFfRUxFTUVOVF9Vc2VyLA0KKyAgWEZBX0VMRU1FTlRfUmVjdGFuZ2xlLA0KKyAgWEZBX0VMRU1FTlRfRWZmZWN0aXZlT3V0cHV0UG9saWN5LA0KKyAgWEZBX0VMRU1FTlRfQURCRV9KU0RlYnVnZ2VyLA0KKyAgWEZBX0VMRU1FTlRfQWNyb2JhdDcsDQorICBYRkFfRUxFTUVOVF9JbnRlcmFjdGl2ZSwNCisgIFhGQV9FTEVNRU5UX0xvY2FsZSwNCisgIFhGQV9FTEVNRU5UX0N1cnJlbnRQYWdlLA0KKyAgWEZBX0VMRU1FTlRfRGF0YSwNCisgIFhGQV9FTEVNRU5UX0RhdGUsDQorICBYRkFfRUxFTUVOVF9EZXNjLA0KKyAgWEZBX0VMRU1FTlRfRW5jcnlwdCwNCisgIFhGQV9FTEVNRU5UX0RyYXcsDQorICBYRkFfRUxFTUVOVF9FbmNyeXB0aW9uLA0KKyAgWEZBX0VMRU1FTlRfTWVyaWRpZW1OYW1lcywNCisgIFhGQV9FTEVNRU5UX01lc3NhZ2luZywNCisgIFhGQV9FTEVNRU5UX1NwZWFrLA0KKyAgWEZBX0VMRU1FTlRfRGF0YUdyb3VwLA0KKyAgWEZBX0VMRU1FTlRfQ29tbW9uLA0KKyAgWEZBX0VMRU1FTlRfU2hhcnB0ZXh0LA0KKyAgWEZBX0VMRU1FTlRfUGFnaW5hdGlvbk92ZXJyaWRlLA0KKyAgWEZBX0VMRU1FTlRfUmVhc29ucywNCisgIFhGQV9FTEVNRU5UX1NpZ25hdHVyZVByb3BlcnRpZXMsDQorICBYRkFfRUxFTUVOVF9UaHJlc2hvbGQsDQorICBYRkFfRUxFTUVOVF9BcHBlYXJhbmNlRmlsdGVyLA0KKyAgWEZBX0VMRU1FTlRfRmlsbCwNCisgIFhGQV9FTEVNRU5UX0ZvbnQsDQorICBYRkFfRUxFTUVOVF9Gb3JtLA0KKyAgWEZBX0VMRU1FTlRfTWVkaXVtSW5mbywNCisgIFhGQV9FTEVNRU5UX0NlcnRpZmljYXRlLA0KKyAgWEZBX0VMRU1FTlRfUGFzc3dvcmQsDQorICBYRkFfRUxFTUVOVF9SdW5TY3JpcHRzLA0KKyAgWEZBX0VMRU1FTlRfVHJhY2UsDQorICBYRkFfRUxFTUVOVF9GbG9hdCwNCisgIFhGQV9FTEVNRU5UX1JlbmRlclBvbGljeSwNCisgIFhGQV9FTEVNRU5UX0xvZ1BzZXVkb01vZGVsLA0KKyAgWEZBX0VMRU1FTlRfRGVzdGluYXRpb24sDQorICBYRkFfRUxFTUVOVF9WYWx1ZSwNCisgIFhGQV9FTEVNRU5UX0Jvb2tlbmQsDQorICBYRkFfRUxFTUVOVF9FeE9iamVjdCwNCisgIFhGQV9FTEVNRU5UX09wZW5BY3Rpb24sDQorICBYRkFfRUxFTUVOVF9OZXZlckVtYmVkLA0KKyAgWEZBX0VMRU1FTlRfQmluZEl0ZW1zLA0KKyAgWEZBX0VMRU1FTlRfQ2FsY3VsYXRlLA0KKyAgWEZBX0VMRU1FTlRfUHJpbnQsDQorICBYRkFfRUxFTUVOVF9FeHRyYXMsDQorICBYRkFfRUxFTUVOVF9Qcm90bywNCisgIFhGQV9FTEVNRU5UX0RTaWdEYXRhLA0KKyAgWEZBX0VMRU1FTlRfQ3JlYXRvciwNCisgIFhGQV9FTEVNRU5UX0Nvbm5lY3QsDQorICBYRkFfRUxFTUVOVF9QZXJtaXNzaW9ucywNCisgIFhGQV9FTEVNRU5UX0Nvbm5lY3Rpb25TZXQsDQorICBYRkFfRUxFTUVOVF9TdWJtaXQsDQorICBYRkFfRUxFTUVOVF9SYW5nZSwNCisgIFhGQV9FTEVNRU5UX0xpbmVhcml6ZWQsDQorICBYRkFfRUxFTUVOVF9QYWNrZXQsDQorICBYRkFfRUxFTUVOVF9Sb290RWxlbWVudCwNCisgIFhGQV9FTEVNRU5UX1BsYWludGV4dE1ldGFkYXRhLA0KKyAgWEZBX0VMRU1FTlRfTnVtYmVyU3ltYm9scywNCisgIFhGQV9FTEVNRU5UX1ByaW50SGlnaFF1YWxpdHksDQorICBYRkFfRUxFTUVOVF9Ecml2ZXIsDQorICBYRkFfRUxFTUVOVF9JbmNyZW1lbnRhbExvYWQsDQorICBYRkFfRUxFTUVOVF9TdWJqZWN0RE4sDQorICBYRkFfRUxFTUVOVF9Db21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUsDQorICBYRkFfRUxFTUVOVF9JbmNyZW1lbnRhbE1lcmdlLA0KKyAgWEZBX0VMRU1FTlRfUmFkaWFsLA0KKyAgWEZBX0VMRU1FTlRfVmFyaWFibGVzLA0KKyAgWEZBX0VMRU1FTlRfVGltZVBhdHRlcm5zLA0KKyAgWEZBX0VMRU1FTlRfRWZmZWN0aXZlSW5wdXRQb2xpY3ksDQorICBYRkFfRUxFTUVOVF9OYW1lQXR0ciwNCisgIFhGQV9FTEVNRU5UX0NvbmZvcm1hbmNlLA0KKyAgWEZBX0VMRU1FTlRfVHJhbnNmb3JtLA0KKyAgWEZBX0VMRU1FTlRfTG9ja0RvY3VtZW50LA0KKyAgWEZBX0VMRU1FTlRfQnJlYWtBZnRlciwNCisgIFhGQV9FTEVNRU5UX0xpbmUsDQorICBYRkFfRUxFTUVOVF9MaXN0LA0KKyAgWEZBX0VMRU1FTlRfU291cmNlLA0KKyAgWEZBX0VMRU1FTlRfT2NjdXIsDQorICBYRkFfRUxFTUVOVF9QaWNrVHJheUJ5UERGU2l6ZSwNCisgIFhGQV9FTEVNRU5UX01vbnRoTmFtZXMsDQorICBYRkFfRUxFTUVOVF9TZXZlcml0eSwNCisgIFhGQV9FTEVNRU5UX0dyb3VwUGFyZW50LA0KKyAgWEZBX0VMRU1FTlRfRG9jdW1lbnRBc3NlbWJseSwNCisgIFhGQV9FTEVNRU5UX051bWJlclN5bWJvbCwNCisgIFhGQV9FTEVNRU5UX1RhZ2dlZCwNCisgIFhGQV9FTEVNRU5UX0l0ZW1zLA0KK307DQorI2RlZmluZSBYRkFfRUxFTUVOVF9VTktOT1dOICgoWEZBX0VMRU1FTlQpLTEpDQordHlwZWRlZiBzdHJ1Y3QgX1hGQV9FTEVNRU5USU5GTyB7DQorICB1aW50MzJfdCB1SGFzaDsNCisgIGNvbnN0IEZYX1dDSEFSKiBwTmFtZTsNCisgIFhGQV9FTEVNRU5UIGVOYW1lOw0KKyAgRlhfRFdPUkQgZHdQYWNrZXRzOw0KKyAgRlhfRFdPUkQgZU9iamVjdFR5cGU7DQorfSBYRkFfRUxFTUVOVElORk8sICpYRkFfTFBFTEVNRU5USU5GTzsNCit0eXBlZGVmIFhGQV9FTEVNRU5USU5GTyBjb25zdCogWEZBX0xQQ0VMRU1FTlRJTkZPOw0KK2ludDMyX3QgWEZBX0dldEVsZW1lbnRDb3VudCgpOw0KK1hGQV9MUENFTEVNRU5USU5GTyBYRkFfR2V0RWxlbWVudEJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSk7DQorWEZBX0xQQ0VMRU1FTlRJTkZPIFhGQV9HZXRFbGVtZW50QnlJRChYRkFfRUxFTUVOVCBlTmFtZSk7DQorZW51bSBYRkFfQVRUUklCVVRFVFlQRSB7DQorICBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFLA0KKyAgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwNCisgIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsDQorICBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLA0KK307DQordHlwZWRlZiBzdHJ1Y3QgX1hGQV9BVFRSSUJVVEVJTkZPIHsNCisgIHVpbnQzMl90IHVIYXNoOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBOYW1lOw0KKyAgWEZBX0FUVFJJQlVURSBlTmFtZTsNCisgIFhGQV9BVFRSSUJVVEVUWVBFIGVUeXBlOw0KKyAgRlhfRFdPUkQgZHdQYWNrZXRzOw0KKyAgdm9pZCogcERlZlZhbHVlOw0KK30gWEZBX0FUVFJJQlVURUlORk8sICpYRkFfTFBBVFRSSUJVVEVJTkZPOw0KK3R5cGVkZWYgWEZBX0FUVFJJQlVURUlORk8gY29uc3QqIFhGQV9MUENBVFRSSUJVVEVJTkZPOw0KK2ludDMyX3QgWEZBX0dldEF0dHJpYnV0ZUNvdW50KCk7DQorWEZBX0xQQ0FUVFJJQlVURUlORk8gWEZBX0dldEF0dHJpYnV0ZUJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSk7DQorWEZBX0xQQ0FUVFJJQlVURUlORk8gWEZBX0dldEF0dHJpYnV0ZUJ5SUQoWEZBX0FUVFJJQlVURSBlTmFtZSk7DQorRlhfQk9PTCBYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlKHZvaWQqJiBwVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVUWVBFIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1BhY2tldCk7DQorWEZBX0FUVFJJQlVURUVOVU0gWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9FbnVtKFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3UGFja2V0KTsNCitDRlhfV2lkZVN0cmluZ0MgWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9DZGF0YShYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQYWNrZXQpOw0KK0ZYX0JPT0wgWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9Cb29sZWFuKFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1BhY2tldCk7DQoraW50MzJfdCBYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX0ludGVnZXIoWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3UGFja2V0KTsNCitDWEZBX01lYXN1cmVtZW50IFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfTWVhc3VyZShYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQYWNrZXQpOw0KK3R5cGVkZWYgc3RydWN0IF9YRkFfRUxFTUVOVEhJRVJBUkNIWSB7DQorICBGWF9XT1JEIHdTdGFydDsNCisgIEZYX1dPUkQgd0NvdW50Ow0KKyAgRlhfV09SRCB3UGFyZW50SW5kZXg7DQorfSBYRkFfRUxFTUVOVEhJRVJBUkNIWSwgKlhGQV9MUEVMRU1FTlRISUVSQVJDSFk7DQordHlwZWRlZiBYRkFfRUxFTUVOVEhJRVJBUkNIWSBjb25zdCogWEZBX0xQQ0VMRU1FTlRISUVSQVJDSFk7DQordHlwZWRlZiBzdHJ1Y3QgX1hGQV9TQ1JJUFRISUVSQVJDSFkgew0KKyAgRlhfV09SRCB3TWV0aG9kU3RhcnQ7DQorICBGWF9XT1JEIHdNZXRob2RDb3VudDsNCisgIEZYX1dPUkQgd0F0dHJpYnV0ZVN0YXJ0Ow0KKyAgRlhfV09SRCB3QXR0cmlidXRlQ291bnQ7DQorICBpbnQxNl90IHdQYXJlbnRJbmRleDsNCit9IFhGQV9TQ1JJUFRISUVSQVJDSFksICpYRkFfTFBTQ1JJUFRISUVSQVJDSFk7DQordHlwZWRlZiBYRkFfU0NSSVBUSElFUkFSQ0hZIGNvbnN0KiBYRkFfTFBDU0NSSVBUSElFUkFSQ0hZOw0KK2NvbnN0IEZYX1dPUkQqIFhGQV9HZXRFbGVtZW50Q2hpbGRyZW4oWEZBX0VMRU1FTlQgZUVsZW1lbnQsIGludDMyX3QmIGlDb3VudCk7DQorY29uc3QgdWludDhfdCogWEZBX0dldEVsZW1lbnRBdHRyaWJ1dGVzKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBpbnQzMl90JiBpQ291bnQpOw0KK1hGQV9MUENFTEVNRU5USU5GTyBYRkFfR2V0Q2hpbGRPZkVsZW1lbnQoWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVCBlQ2hpbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1BhY2tldCk7DQorWEZBX0xQQ0FUVFJJQlVURUlORk8gWEZBX0dldEF0dHJpYnV0ZU9mRWxlbWVudChYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3UGFja2V0KTsNCisjZGVmaW5lIFhGQV9QUk9QRVJUWUZMQUdfT25lT2YgMHgwMQ0KKyNkZWZpbmUgWEZBX1BST1BFUlRZRkxBR19EZWZhdWx0T25lT2YgMHgwMg0KK3R5cGVkZWYgc3RydWN0IF9YRkFfUFJPUEVSVFkgew0KKyAgRlhfV09SRCBlTmFtZTsNCisgIHVpbnQ4X3QgdU9jY3VyOw0KKyAgdWludDhfdCB1RmxhZ3M7DQorfSBYRkFfUFJPUEVSVFksICpYRkFfTFBQUk9QRVJUWTsNCit0eXBlZGVmIFhGQV9QUk9QRVJUWSBjb25zdCogWEZBX0xQQ1BST1BFUlRZOw0KK1hGQV9MUENQUk9QRVJUWSBYRkFfR2V0RWxlbWVudFByb3BlcnRpZXMoWEZBX0VMRU1FTlQgZUVsZW1lbnQsIGludDMyX3QmIGlDb3VudCk7DQorWEZBX0xQQ1BST1BFUlRZIFhGQV9HZXRQcm9wZXJ0eU9mRWxlbWVudChYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVQcm9wZXJ0eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3UGFja2V0KTsNCit0eXBlZGVmIHN0cnVjdCBfWEZBX0FUVFJJQlVURUVOVU1JTkZPIHsNCisgIHVpbnQzMl90IHVIYXNoOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBOYW1lOw0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZU5hbWU7DQorfSBYRkFfQVRUUklCVVRFRU5VTUlORk8sICpYRkFfTFBBVFRSSUJVVEVFTlVNSU5GTzsNCit0eXBlZGVmIFhGQV9BVFRSSUJVVEVFTlVNSU5GTyBjb25zdCogWEZBX0xQQ0FUVFJJQlVURUVOVU1JTkZPOw0KK1hGQV9MUENBVFRSSUJVVEVFTlVNSU5GTyBYRkFfR2V0QXR0cmlidXRlRW51bUJ5TmFtZSgNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpOw0KK1hGQV9MUENBVFRSSUJVVEVFTlVNSU5GTyBYRkFfR2V0QXR0cmlidXRlRW51bUJ5SUQoWEZBX0FUVFJJQlVURUVOVU0gZU5hbWUpOw0KK2VudW0gWEZBX1VOSVQgew0KKyAgWEZBX1VOSVRfVW5rbm93biwNCisgIFhGQV9VTklUX1BlcmNlbnQsDQorICBYRkFfVU5JVF9BbmdsZSwNCisgIFhGQV9VTklUX0VtLA0KKyAgWEZBX1VOSVRfUHQsDQorICBYRkFfVU5JVF9JbiwNCisgIFhGQV9VTklUX1BjLA0KKyAgWEZBX1VOSVRfQ20sDQorICBYRkFfVU5JVF9NbSwNCisgIFhGQV9VTklUX01wLA0KK307DQorY2xhc3MgQ1hGQV9NZWFzdXJlbWVudCB7DQorIHB1YmxpYzoNCisgIHZvaWQgU2V0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NNZWFzdXJlKTsNCisgIHZvaWQgU2V0KEZYX0ZMT0FUIGZWYWx1ZSwgWEZBX1VOSVQgZVVuaXQpIHsNCisgICAgbV9mVmFsdWUgPSBmVmFsdWU7DQorICAgIG1fZVVuaXQgPSBlVW5pdDsNCisgIH0NCisNCisgIFhGQV9VTklUIEdldFVuaXQoKSBjb25zdCB7IHJldHVybiBtX2VVbml0OyB9DQorICBGWF9GTE9BVCBHZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZlZhbHVlOyB9DQorICBGWF9CT09MIFRvU3RyaW5nKENGWF9XaWRlU3RyaW5nJiB3c01lYXN1cmUpIGNvbnN0Ow0KKyAgRlhfQk9PTCBUb1VuaXQoWEZBX1VOSVQgZVVuaXQsIEZYX0ZMT0FUJiBmVmFsdWUpIGNvbnN0Ow0KKyAgRlhfRkxPQVQgVG9Vbml0KFhGQV9VTklUIGVVbml0KSBjb25zdCB7DQorICAgIEZYX0ZMT0FUIGY7DQorICAgIHJldHVybiBUb1VuaXQoZVVuaXQsIGYpID8gZiA6IDA7DQorICB9DQorICBDWEZBX01lYXN1cmVtZW50KCkgeyBTZXQoLTEsIFhGQV9VTklUX1Vua25vd24pOyB9DQorICBDWEZBX01lYXN1cmVtZW50KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NNZWFzdXJlKSB7IFNldCh3c01lYXN1cmUpOyB9DQorICBDWEZBX01lYXN1cmVtZW50KEZYX0ZMT0FUIGZWYWx1ZSwgWEZBX1VOSVQgZVVuaXQpIHsgU2V0KGZWYWx1ZSwgZVVuaXQpOyB9DQorICBzdGF0aWMgWEZBX1VOSVQgR2V0VW5pdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVW5pdCk7DQorDQorIHByb3RlY3RlZDoNCisgIEZYX0ZMT0FUIG1fZlZhbHVlOw0KKyAgWEZBX1VOSVQgbV9lVW5pdDsNCit9Ow0KK2NsYXNzIENGWEpTRV9Bcmd1bWVudHM7DQorY2xhc3MgQ1hGQV9PYmplY3Q7DQordHlwZWRlZiB2b2lkIChDWEZBX09iamVjdDo6KlhGQV9NRVRIT0RfQ0FMTEJBQ0spKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KK3R5cGVkZWYgc3RydWN0IF9YRkFfTUVUSE9ESU5GTyB7DQorICB1aW50MzJfdCB1SGFzaDsNCisgIGNvbnN0IEZYX1dDSEFSKiBwTmFtZTsNCisgIFhGQV9NRVRIT0RfQ0FMTEJBQ0sgbHBmbkNhbGxiYWNrOw0KK30gWEZBX01FVEhPRElORk8sICpYRkFfTFBNRVRIT0RJTkZPOw0KK3R5cGVkZWYgWEZBX01FVEhPRElORk8gY29uc3QqIFhGQV9MUENNRVRIT0RJTkZPOw0KK2ludDMyX3QgWEZBX0dldE1ldGhvZENvdW50KCk7DQorWEZBX0xQQ01FVEhPRElORk8gWEZBX0dldE1ldGhvZEJ5TmFtZShYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NNZXRob2ROYW1lKTsNCit0eXBlZGVmIHZvaWQgKENYRkFfT2JqZWN0OjoqWEZBX0FUVFJJQlVURV9DQUxMQkFDSykoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCitlbnVtIFhGQV9TQ1JJUFRfVFlQRSB7DQorICBYRkFfU0NSSVBUX0Jhc2ljLA0KKyAgWEZBX1NDUklQVF9PYmplY3QsDQorfTsNCit0eXBlZGVmIHN0cnVjdCBfWEZBX1NDUklQVEFUVFJJQlVURUlORk8gew0KKyAgdWludDMyX3QgdUhhc2g7DQorICBjb25zdCBGWF9XQ0hBUiogcE5hbWU7DQorICBYRkFfQVRUUklCVVRFX0NBTExCQUNLIGxwZm5DYWxsYmFjazsNCisgIGludDMyX3QgZUF0dHJpYnV0ZTsNCisgIEZYX1dPUkQgZVZhbHVlVHlwZTsNCit9IFhGQV9TQ1JJUFRBVFRSSUJVVEVJTkZPLCAqWEZBX0xQU0NSSVBUQVRUUklCVVRFSU5GTzsNCit0eXBlZGVmIFhGQV9TQ1JJUFRBVFRSSUJVVEVJTkZPIGNvbnN0KiBYRkFfTFBDU0NSSVBUQVRUUklCVVRFSU5GTzsNCitYRkFfTFBDU0NSSVBUQVRUUklCVVRFSU5GTyBYRkFfR2V0U2NyaXB0QXR0cmlidXRlQnlOYW1lKA0KKyAgICBYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0F0dHJpYnV0ZU5hbWUpOw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z4ZmEvZnhmYV9vYmplY3RhY2MuaCBiL3hmYS9pbmNsdWRlL2Z4ZmEvZnhmYV9vYmplY3RhY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTdjYjA4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2luY2x1ZGUvZnhmYS9meGZhX29iamVjdGFjYy5oCkBAIC0wLDAgKzEsODQ4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgRlhGQV9PQkpFQ1RBQ0NfSF8NCisjZGVmaW5lIEZYRkFfT0JKRUNUQUNDX0hfDQorDQorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2RpYi5oIiAgLy8gRm9yIEZYX0FSR0IuDQorDQorY2xhc3MgQ1hGQV9Ob2RlOw0KK2NsYXNzIElGWF9Mb2NhbGU7DQorY2xhc3MgQ1hGQV9EYXRhOw0KK2NsYXNzIENYRkFfRm9udDsNCitjbGFzcyBDWEZBX0ZpbGw7DQorY2xhc3MgQ1hGQV9NYXJnaW47DQorY2xhc3MgQ1hGQV9DYXB0aW9uOw0KK2NsYXNzIENYRkFfUGFyYTsNCitjbGFzcyBDWEZBX0V2ZW50Ow0KK2NsYXNzIENYRkFfU2NyaXB0Ow0KK2NsYXNzIENYRkFfVmFsdWU7DQorY2xhc3MgQ1hGQV9DYWxjdWxhdGU7DQorY2xhc3MgQ1hGQV9MaW5lOw0KK2NsYXNzIENYRkFfVGV4dDsNCitjbGFzcyBDWEZBX0V4RGF0YTsNCitjbGFzcyBDWEZBX0ltYWdlOw0KK2NsYXNzIENYRkFfVmFsaWRhdGU7DQorY2xhc3MgQ1hGQV9WYXJpYWJsZXM7DQorY2xhc3MgQ1hGQV9CaW5kOw0KK2NsYXNzIENYRkFfQXNzaXN0Ow0KK2NsYXNzIENYRkFfVG9vbFRpcDsNCitjbGFzcyBDWEZBX0tlZXA7DQorY2xhc3MgQ1hGQV9TdWJtaXQ7DQorY2xhc3MgQ1hGQV9CaW5kSXRlbXM7DQorY2xhc3MgQ1hGQV9TdHJva2U7DQorY2xhc3MgQ1hGQV9Db3JuZXI7DQorY2xhc3MgQ1hGQV9FZGdlOw0KK2NsYXNzIENYRkFfQm94Ow0KK2NsYXNzIENYRkFfQXJjOw0KK2NsYXNzIENYRkFfQm9yZGVyOw0KK2NsYXNzIENYRkFfUmVjdGFuZ2xlOw0KK2NsYXNzIENYRkFfV2lkZ2V0RGF0YTsNCitjbGFzcyBDWEZBX09jY3VyOw0KK2NsYXNzIENYRkFfRmlsdGVyOw0KK2NsYXNzIENYRkFfQ2VydGlmaWNhdGU7DQorY2xhc3MgQ1hGQV9XcmFwQ2VydGlmaWNhdGU7DQorY2xhc3MgQ1hGQV9PaWRzOw0KK2NsYXNzIENYRkFfU3ViamVjdEROczsNCitjbGFzcyBDWEZBX0RpZ2VzdE1ldGhvZHM7DQorY2xhc3MgQ1hGQV9FbmNvZGluZ3M7DQorY2xhc3MgQ1hGQV9FbmNyeXB0aW9uTWV0aG9kczsNCitjbGFzcyBDWEZBX1JlYXNvbnM7DQorY2xhc3MgQ1hGQV9NYW5pZmVzdDsNCitpbmxpbmUgRlhfQk9PTCBYRkFfSXNTcGFjZShGWF9XQ0hBUiBjKSB7DQorICByZXR1cm4gKGMgPT0gMHgyMCkgfHwgKGMgPT0gMHgwZCkgfHwgKGMgPT0gMHgwYSkgfHwgKGMgPT0gMHgwOSk7DQorfQ0KK2lubGluZSBGWF9CT09MIFhGQV9Jc0RpZ2l0KEZYX1dDSEFSIGMpIHsNCisgIHJldHVybiBjID49ICcwJyAmJiBjIDw9ICc5JzsNCit9DQordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX05vZGUqPiBDWEZBX05vZGVBcnJheTsNCit0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPENYRkFfT2JqZWN0Kj4gQ1hGQV9PYmpBcnJheTsNCitjbGFzcyBDWEZBX0RhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX0RhdGEoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBtX3BOb2RlKHBOb2RlKSB7fQ0KKyAgb3BlcmF0b3IgQ1hGQV9Ob2RlKigpIGNvbnN0IHsgcmV0dXJuIG1fcE5vZGU7IH0NCisgIENYRkFfTm9kZSogR2V0Tm9kZSgpIHsgcmV0dXJuIG1fcE5vZGU7IH0NCisNCisgIEZYX0JPT0wgSXNFeGlzdEluWE1MKCkgY29uc3QgeyByZXR1cm4gbV9wTm9kZSAhPSBOVUxMOyB9DQorDQorICBYRkFfRUxFTUVOVCBHZXRDbGFzc0lEKCkgY29uc3Q7DQorDQorIHByb3RlY3RlZDoNCisgIEZYX0JPT0wgVHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFIGVBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXNlRGVmYXVsdCA9IEZBTFNFKSBjb25zdDsNCisgIEZYX0JPT0wgU2V0TWVhc3VyZShYRkFfQVRUUklCVVRFIGVBdHRyLCBGWF9GTE9BVCBmVmFsdWUpOw0KKyAgQ1hGQV9Ob2RlKiBtX3BOb2RlOw0KK307DQorY2xhc3MgQ1hGQV9GaWxsIDogcHVibGljIENYRkFfRGF0YSB7DQorIHB1YmxpYzoNCisgIENYRkFfRmlsbChDWEZBX05vZGUqIHBOb2RlKTsNCisgIH5DWEZBX0ZpbGwoKTsNCisNCisgIGludDMyX3QgR2V0UHJlc2VuY2UoKTsNCisNCisgIEZYX0FSR0IgR2V0Q29sb3IoRlhfQk9PTCBiVGV4dCA9IEZBTFNFKTsNCisNCisgIHZvaWQgU2V0Q29sb3IoRlhfQVJHQiBjb2xvcik7DQorDQorICBpbnQzMl90IEdldEZpbGxUeXBlKCk7DQorDQorICBpbnQzMl90IEdldFBhdHRlcm4oRlhfQVJHQiYgZm9yZUNvbG9yKTsNCisNCisgIGludDMyX3QgR2V0U3RpcHBsZShGWF9BUkdCJiBzdGlwcGxlQ29sb3IpOw0KKw0KKyAgaW50MzJfdCBHZXRMaW5lYXIoRlhfQVJHQiYgZW5kQ29sb3IpOw0KKw0KKyAgaW50MzJfdCBHZXRSYWRpYWwoRlhfQVJHQiYgZW5kQ29sb3IpOw0KKyAgRlhfQk9PTCBTZXRQcmVzZW5jZShpbnQzMl90IGlQcmVzZW5jZSk7DQorICBGWF9CT09MIFNldEZpbGxUeXBlKGludDMyX3QgaVR5cGUpOw0KKyAgRlhfQk9PTCBTZXRQYXR0ZXJuKGludDMyX3QgaVBhdHRlcm4sIEZYX0FSR0IgZm9yZUNvbG9yKTsNCisgIEZYX0JPT0wgU2V0U3RpcHBsZShpbnQzMl90IGlTdGlwcGxlLCBGWF9BUkdCIHN0aXBwbGVDb2xvcik7DQorICBGWF9CT09MIFNldExpbmVhcihpbnQzMl90IGlMaW5lYXIsIEZYX0FSR0IgZW5kQ29sb3IpOw0KKyAgRlhfQk9PTCBTZXRSYWRpYWwoaW50MzJfdCBpUmFkaWFsLCBGWF9BUkdCIGVuZENvbG9yKTsNCit9Ow0KK2NsYXNzIENYRkFfTWFyZ2luIDogcHVibGljIENYRkFfRGF0YSB7DQorIHB1YmxpYzoNCisgIENYRkFfTWFyZ2luKENYRkFfTm9kZSogcE5vZGUpOw0KKyAgRlhfQk9PTCBHZXRMZWZ0SW5zZXQoRlhfRkxPQVQmIGZJbnNldCwgRlhfRkxPQVQgZkRlZkluc2V0ID0gMCkgY29uc3Q7DQorICBGWF9CT09MIEdldFRvcEluc2V0KEZYX0ZMT0FUJiBmSW5zZXQsIEZYX0ZMT0FUIGZEZWZJbnNldCA9IDApIGNvbnN0Ow0KKyAgRlhfQk9PTCBHZXRSaWdodEluc2V0KEZYX0ZMT0FUJiBmSW5zZXQsIEZYX0ZMT0FUIGZEZWZJbnNldCA9IDApIGNvbnN0Ow0KKyAgRlhfQk9PTCBHZXRCb3R0b21JbnNldChGWF9GTE9BVCYgZkluc2V0LCBGWF9GTE9BVCBmRGVmSW5zZXQgPSAwKSBjb25zdDsNCisgIEZYX0JPT0wgU2V0TGVmdEluc2V0KEZYX0ZMT0FUIGZJbnNldCk7DQorICBGWF9CT09MIFNldFRvcEluc2V0KEZYX0ZMT0FUIGZJbnNldCk7DQorICBGWF9CT09MIFNldFJpZ2h0SW5zZXQoRlhfRkxPQVQgZkluc2V0KTsNCisgIEZYX0JPT0wgU2V0Qm90dG9tSW5zZXQoRlhfRkxPQVQgZkluc2V0KTsNCit9Ow0KK2NsYXNzIENYRkFfRm9udCA6IHB1YmxpYyBDWEZBX0RhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX0ZvbnQoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorDQorICBGWF9GTE9BVCBHZXRCYXNlbGluZVNoaWZ0KCk7DQorDQorICBGWF9GTE9BVCBHZXRIb3Jpem9udGFsU2NhbGUoKTsNCisNCisgIEZYX0ZMT0FUIEdldFZlcnRpY2FsU2NhbGUoKTsNCisNCisgIEZYX0ZMT0FUIEdldExldHRlclNwYWNpbmcoKTsNCisNCisgIGludDMyX3QgR2V0TGluZVRocm91Z2goKTsNCisNCisgIGludDMyX3QgR2V0TGluZVRocm91Z2hQZXJpb2QoKTsNCisNCisgIGludDMyX3QgR2V0T3ZlcmxpbmUoKTsNCisNCisgIGludDMyX3QgR2V0T3ZlcmxpbmVQZXJpb2QoKTsNCisNCisgIGludDMyX3QgR2V0VW5kZXJsaW5lKCk7DQorDQorICBpbnQzMl90IEdldFVuZGVybGluZVBlcmlvZCgpOw0KKw0KKyAgRlhfRkxPQVQgR2V0Rm9udFNpemUoKTsNCisNCisgIHZvaWQgR2V0VHlwZWZhY2UoQ0ZYX1dpZGVTdHJpbmdDJiB3c1R5cGVGYWNlKTsNCisNCisgIEZYX0JPT0wgSXNCb2xkKCk7DQorDQorICBGWF9CT09MIElzSXRhbGljKCk7DQorDQorICBGWF9CT09MIElzVXNlS2VybmluZygpOw0KKw0KKyAgRlhfQVJHQiBHZXRDb2xvcigpOw0KKw0KKyAgdm9pZCBTZXRDb2xvcihGWF9BUkdCIGNvbG9yKTsNCisgIEZYX0JPT0wgU2V0QmFzZWxpbmVTaGlmdChGWF9GTE9BVCBmQmFzZWxpbmVTaGlmdCk7DQorICBGWF9CT09MIFNldEhvcml6b250YWxTY2FsZShGWF9GTE9BVCBmSG9yaXpvbnRhbFNjYWxlKTsNCisgIEZYX0JPT0wgU2V0VmVydGljYWxTY2FsZShGWF9GTE9BVCBmVmVydGljYWxTY2FsZSk7DQorICBGWF9CT09MIFNldExldHRlclNwYWNpbmcoRlhfRkxPQVQgZkxldHRlclNwYWNpbmcsIFhGQV9VTklUIGVVbml0KTsNCisgIEZYX0JPT0wgU2V0TGluZVRocm91Z2goaW50MzJfdCBpTGluZVRocm91Z2gpOw0KKyAgRlhfQk9PTCBTZXRMaW5lVGhyb3VnaFBlcmlvZChpbnQzMl90IGlMaW5lVGhyb3VnaFBlcmlvZCk7DQorICBGWF9CT09MIFNldE92ZXJsaW5lKGludDMyX3QgaU92ZXJsaW5lKTsNCisgIEZYX0JPT0wgU2V0T3ZlcmxpbmVQZXJpb2QoaW50MzJfdCBpT3ZlcmxpbmVQZXJpb2QpOw0KKyAgRlhfQk9PTCBTZXRVbmRlcmxpbmUoaW50MzJfdCBpVW5kZXJsaW5lKTsNCisgIEZYX0JPT0wgU2V0VW5kZXJsaW5lUGVyaW9kKGludDMyX3QgaVVuZGVybGluZVBlcmlvZCk7DQorfTsNCitjbGFzcyBDWEZBX0NhcHRpb24gOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9DYXB0aW9uKENYRkFfTm9kZSogcE5vZGUpOw0KKw0KKyAgaW50MzJfdCBHZXRQcmVzZW5jZSgpOw0KKw0KKyAgaW50MzJfdCBHZXRQbGFjZW1lbnRUeXBlKCk7DQorDQorICBGWF9GTE9BVCBHZXRSZXNlcnZlKCk7DQorDQorICBDWEZBX01hcmdpbiBHZXRNYXJnaW4oKTsNCisNCisgIENYRkFfRm9udCBHZXRGb250KCk7DQorDQorICBDWEZBX1ZhbHVlIEdldFZhbHVlKCk7DQorDQorICBDWEZBX1BhcmEgR2V0UGFyYSgpOw0KKyAgRlhfQk9PTCBTZXRQcmVzZW5jZShpbnQzMl90IGlQcmVzZW5jZSk7DQorICBGWF9CT09MIFNldFBsYWNlbWVudFR5cGUoaW50MzJfdCBpVHlwZSk7DQorICBGWF9CT09MIFNldFJlc2VydmUoRlhfRkxPQVQgZlJlc2VydmUpOw0KK307DQorY2xhc3MgQ1hGQV9QYXJhIDogcHVibGljIENYRkFfRGF0YSB7DQorIHB1YmxpYzoNCisgIENYRkFfUGFyYShDWEZBX05vZGUqIHBOb2RlKTsNCisNCisgIGludDMyX3QgR2V0SG9yaXpvbnRhbEFsaWduKCk7DQorDQorICBpbnQzMl90IEdldFZlcnRpY2FsQWxpZ24oKTsNCisNCisgIEZYX0ZMT0FUIEdldExpbmVIZWlnaHQoKTsNCisgIEZYX0ZMT0FUIEdldE1hcmdpbkxlZnQoKTsNCisgIEZYX0ZMT0FUIEdldE1hcmdpblJpZ2h0KCk7DQorICBpbnQzMl90IEdldE9ycGhhbnMoKTsNCisgIEZYX0ZMT0FUIEdldFJhZGl4T2Zmc2V0KCk7DQorICBGWF9GTE9BVCBHZXRTcGFjZUFib3ZlKCk7DQorICBGWF9GTE9BVCBHZXRTcGFjZUJlbG93KCk7DQorICBGWF9GTE9BVCBHZXRUZXh0SW5kZW50KCk7DQorICBpbnQzMl90IEdldFdpZG93cygpOw0KKyAgRlhfQk9PTCBTZXRIb3Jpem9udGFsQWxpZ24oaW50MzJfdCBpSG9yaXpvbnRhbEFsaWduKTsNCisgIEZYX0JPT0wgU2V0VmVydGljYWxBbGlnbihpbnQzMl90IGlWZXJ0aWNhbEFsaWduKTsNCisgIEZYX0JPT0wgU2V0TGluZUhlaWdodChGWF9GTE9BVCBmTGluZUhlaWdodCk7DQorICBGWF9CT09MIFNldE1hcmdpbkxlZnQoRlhfRkxPQVQgZk1hcmdpbkxlZnQpOw0KKyAgRlhfQk9PTCBTZXRNYXJnaW5SaWdodChGWF9GTE9BVCBmTWFyZ2luUmlnaHQpOw0KKyAgRlhfQk9PTCBTZXRPcnBoYW5zKGludDMyX3QgaU9ycGhhbnMpOw0KKyAgRlhfQk9PTCBTZXRSYWRpeE9mZnNldChGWF9GTE9BVCBmUmFkaXhPZmZzZXQpOw0KKyAgRlhfQk9PTCBTZXRTcGFjZUFib3ZlKEZYX0ZMT0FUIGZTcGFjZUFib3ZlKTsNCisgIEZYX0JPT0wgU2V0U3BhY2VCZWxvdyhGWF9GTE9BVCBmU3BhY2VCZWxvdyk7DQorICBGWF9CT09MIFNldFRleHRJbmRlbnQoRlhfRkxPQVQgZlRleHRJbmRlbnQpOw0KKyAgRlhfQk9PTCBTZXRXaWRvd3MoaW50MzJfdCBpV2lkb3dzKTsNCit9Ow0KK2NsYXNzIENYRkFfS2VlcCA6IHB1YmxpYyBDWEZBX0RhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX0tlZXAoQ1hGQV9Ob2RlKiBwTm9kZSwgQ1hGQV9Ob2RlKiBwUGFyZW50KTsNCisNCisgIGludDMyX3QgR2V0SW50YWN0KCk7DQorICBpbnQzMl90IEdldE5leHQoKTsNCisgIGludDMyX3QgR2V0UHJldmlvdXMoKTsNCisgIEZYX0JPT0wgU2V0SW50YWN0KGludDMyX3QgaUludGFjdCk7DQorICBGWF9CT09MIFNldE5leHQoaW50MzJfdCBpTmV4dCk7DQorICBGWF9CT09MIFNldFByZXZpb3VzKGludDMyX3QgaVByZXZpb3VzKTsNCisNCisgcHJpdmF0ZToNCisgIENYRkFfTm9kZSogbV9wUGFyZW50Ow0KK307DQorZW51bSBYRkFfVEVYVEVOQ09ESU5HIHsNCisgIFhGQV9URVhURU5DT0RJTkdfTm9uZSwNCisgIFhGQV9URVhURU5DT0RJTkdfQmlnNSwNCisgIFhGQV9URVhURU5DT0RJTkdfRm9udFNwZWNpZmljLA0KKyAgWEZBX1RFWFRFTkNPRElOR19HQkssDQorICBYRkFfVEVYVEVOQ09ESU5HX0dCMTgwMzAsDQorICBYRkFfVEVYVEVOQ09ESU5HX0dCMjMxMiwNCisgIFhGQV9URVhURU5DT0RJTkdfSVNPODg1OU5OLA0KKyAgWEZBX1RFWFRFTkNPRElOR19LU0M1NjAxLA0KKyAgWEZBX1RFWFRFTkNPRElOR19TaGlmdEpJUywNCisgIFhGQV9URVhURU5DT0RJTkdfVUNTMiwNCisgIFhGQV9URVhURU5DT0RJTkdfVVRGMTYsDQorICBYRkFfVEVYVEVOQ09ESU5HX1VURjgNCit9Ow0KK2NsYXNzIENYRkFfRXZlbnQgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9FdmVudChDWEZBX05vZGUqIHBOb2RlKTsNCisNCisgIGludDMyX3QgR2V0QWN0aXZpdHkoKTsNCisNCisgIGludDMyX3QgR2V0RXZlbnRUeXBlKCk7DQorICB2b2lkIEdldFJlZihDRlhfV2lkZVN0cmluZ0MmIHdzUmVmKTsNCisNCisgIGludDMyX3QgR2V0RXhlY3V0ZVJ1bkF0KCk7DQorICBpbnQzMl90IEdldEV4ZWN1dGVUeXBlKCk7DQorICB2b2lkIEdldEV4ZWN1dGVDb25uZWN0aW9uKENGWF9XaWRlU3RyaW5nJiB3c0Nvbm5lY3Rpb24pOw0KKw0KKyAgQ1hGQV9TY3JpcHQgR2V0U2NyaXB0KCk7DQorDQorICBDWEZBX1N1Ym1pdCBHZXRTdWJtaXQoKTsNCisNCisgIGludDMyX3QgR2V0U2lnbkRhdGFPcGVyYXRpb24oKTsNCisgIHZvaWQgR2V0U2lnbkRhdGFUYXJnZXQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGFyZ2V0KTsNCisgIEZYX0JPT0wgU2V0QWN0aXZpdHkoaW50MzJfdCBpQWN0aXZpdHkpOw0KKyAgRlhfQk9PTCBTZXRFdmVudFR5cGUoaW50MzJfdCBpRXZlbnRUeXBlKTsNCisgIEZYX0JPT0wgU2V0RXhlY3V0ZVJ1bkF0KGludDMyX3QgaUV4ZWN1dGVSdW5BdCk7DQorICBGWF9CT09MIFNldEV4ZWN1dGVUeXBlKGludDMyX3QgaUV4ZWN1dGVUeXBlKTsNCisgIEZYX0JPT0wgU2V0RXhlY3V0ZUNvbm5lY3Rpb24oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29ubmVjdGlvbik7DQorICBGWF9CT09MIFNldFNpZ25EYXRhT3BlcmF0aW9uKGludDMyX3QgaU9wZXJhdGlvbik7DQorICBGWF9CT09MIFNldFNpZ25EYXRhVGFyZ2V0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RhcmdldCk7DQorfTsNCitlbnVtIFhGQV9TQ1JJUFRUWVBFIHsNCisgIFhGQV9TQ1JJUFRUWVBFX0Zvcm1jYWxjID0gMCwNCisgIFhGQV9TQ1JJUFRUWVBFX0phdmFzY3JpcHQsDQorICBYRkFfU0NSSVBUVFlQRV9Vbmtvd24sDQorfTsNCitjbGFzcyBDWEZBX1NjcmlwdCA6IHB1YmxpYyBDWEZBX0RhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX1NjcmlwdChDWEZBX05vZGUqIHBOb2RlKTsNCisgIHZvaWQgR2V0QmluZGluZyhDRlhfV2lkZVN0cmluZyYgd3NCaW5kaW5nKTsNCisNCisgIFhGQV9TQ1JJUFRUWVBFIEdldENvbnRlbnRUeXBlKCk7DQorICBpbnQzMl90IEdldFJ1bkF0KCk7DQorICB2b2lkIEdldEV4cHJlc3Npb24oQ0ZYX1dpZGVTdHJpbmcmIHdzRXhwcmVzc2lvbik7DQorICBGWF9CT09MIFNldEJpbmRpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQmluZGluZyk7DQorICBGWF9CT09MIFNldENvbnRlbnRUeXBlKFhGQV9TQ1JJUFRUWVBFIGVUeXBlKTsNCisgIEZYX0JPT0wgU2V0UnVuQXQoaW50MzJfdCBpUnVuQXQpOw0KKyAgRlhfQk9PTCBTZXRFeHByZXNzaW9uKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0V4cHJlc3Npb24pOw0KK307DQorY2xhc3MgQ1hGQV9TdWJtaXQgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9TdWJtaXQoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICBGWF9CT09MIElzU3VibWl0RW1iZWRQREYoKTsNCisgIGludDMyX3QgR2V0U3VibWl0Rm9ybWF0KCk7DQorICB2b2lkIEdldFN1Ym1pdFRhcmdldChDRlhfV2lkZVN0cmluZ0MmIHdzVGFyZ2V0KTsNCisgIFhGQV9URVhURU5DT0RJTkcgR2V0U3VibWl0VGV4dEVuY29kaW5nKCk7DQorICB2b2lkIEdldFN1Ym1pdFhEUENvbnRlbnQoQ0ZYX1dpZGVTdHJpbmdDJiB3c0NvbnRlbnQpOw0KKyAgRlhfQk9PTCBTZXRTdWJtaXRGb3JtYXQoaW50MzJfdCBpU3VibWl0Rm9ybWF0KTsNCisgIEZYX0JPT0wgU2V0U3VibWl0VGFyZ2V0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RhcmdldCk7DQorICBGWF9CT09MIFNldFN1Ym1pdFRleHRFbmNvZGluZyhYRkFfVEVYVEVOQ09ESU5HIGVUZXh0RW5jb2RpbmcpOw0KKyAgRlhfQk9PTCBTZXRTdWJtaXRYRFBDb250ZW50KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0NvbnRlbnQpOw0KK307DQorY2xhc3MgQ1hGQV9WYWx1ZSA6IHB1YmxpYyBDWEZBX0RhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX1ZhbHVlKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KKw0KKyAgWEZBX0VMRU1FTlQgR2V0Q2hpbGRWYWx1ZUNsYXNzSUQoKTsNCisNCisgIEZYX0JPT0wgR2V0Q2hpbGRWYWx1ZUNvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudCk7DQorICBDWEZBX0FyYyBHZXRBcmMoKTsNCisgIENYRkFfTGluZSBHZXRMaW5lKCk7DQorICBDWEZBX1JlY3RhbmdsZSBHZXRSZWN0YW5nbGUoKTsNCisgIENYRkFfVGV4dCBHZXRUZXh0KCk7DQorICBDWEZBX0V4RGF0YSBHZXRFeERhdGEoKTsNCisgIENYRkFfSW1hZ2UgR2V0SW1hZ2UoKTsNCisgIEZYX0JPT0wgU2V0Q2hpbGRWYWx1ZUNvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGlUeXBlID0gWEZBX0VMRU1FTlRfVU5LTk9XTik7DQorfTsNCitjbGFzcyBDWEZBX0xpbmUgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9MaW5lKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KKyAgaW50MzJfdCBHZXRIYW5kKCk7DQorICBGWF9CT09MIEdldFNsb3AoKTsNCisgIENYRkFfRWRnZSBHZXRFZGdlKCk7DQorICBGWF9CT09MIFNldEhhbmQoaW50MzJfdCBpSGFuZCk7DQorICBGWF9CT09MIFNldFNsb3AoaW50MzJfdCBpU2xvcCk7DQorfTsNCitjbGFzcyBDWEZBX1RleHQgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9UZXh0KENYRkFfTm9kZSogcE5vZGUpOw0KKyAgdm9pZCBHZXROYW1lKENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKTsNCisgIGludDMyX3QgR2V0TWF4Q2hhcnMoKTsNCisgIHZvaWQgR2V0UmlkKENGWF9XaWRlU3RyaW5nQyYgd3NSaWQpOw0KKyAgdm9pZCBHZXRDb250ZW50KENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgdm9pZCBTZXRDb250ZW50KENGWF9XaWRlU3RyaW5nIHdzVGV4dCwgRlhfQk9PTCBiTm90aWZ5ID0gVFJVRSk7DQorICBGWF9CT09MIFNldE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSk7DQorICBGWF9CT09MIFNldE1heENoYXJzKGludDMyX3QgaU1heENoYXJzKTsNCisgIEZYX0JPT0wgU2V0UmlkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1JpZCk7DQorfTsNCitjbGFzcyBDWEZBX0V4RGF0YSA6IHB1YmxpYyBDWEZBX0RhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX0V4RGF0YShDWEZBX05vZGUqIHBOb2RlKTsNCisgIHZvaWQgR2V0Q29udGVudFR5cGUoQ0ZYX1dpZGVTdHJpbmdDJiB3c0NvbnRlbnRUeXBlKTsNCisgIHZvaWQgR2V0SHJlZihDRlhfV2lkZVN0cmluZ0MmIHdzSHJlZik7DQorICBpbnQzMl90IEdldE1heExlbmd0aCgpOw0KKyAgdm9pZCBHZXRSaWQoQ0ZYX1dpZGVTdHJpbmdDJiB3c1JpZCk7DQorICBpbnQzMl90IEdldFRyYW5zZmVyRW5jb2RpbmcoKTsNCisgIHZvaWQgR2V0Q29udGVudChDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsNCisgIEZYX0JPT0wgU2V0Q29udGVudFR5cGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudFR5cGUpOw0KKyAgRlhfQk9PTCBTZXRIcmVmKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0hyZWYpOw0KKyAgRlhfQk9PTCBTZXRNYXhMZW5ndGgoaW50MzJfdCBpTWF4TGVuZ3RoKTsNCisgIEZYX0JPT0wgU2V0UmlkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1JpZCk7DQorICBGWF9CT09MIFNldFRyYW5zZmVyRW5jb2RpbmcoaW50MzJfdCBpVHJhbnNmZXJFbmNvZGluZyk7DQorICBGWF9CT09MIFNldENvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTY3JpcHRNb2RpZnkgPSBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTeW5jRGF0YSA9IFRSVUUpOw0KK307DQorY2xhc3MgQ1hGQV9JbWFnZSA6IHB1YmxpYyBDWEZBX0RhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX0ltYWdlKENYRkFfTm9kZSogcE5vZGUsIEZYX0JPT0wgYkRlZlZhbHVlKTsNCisgIGludDMyX3QgR2V0QXNwZWN0KCk7DQorICBGWF9CT09MIEdldENvbnRlbnRUeXBlKENGWF9XaWRlU3RyaW5nJiB3c0NvbnRlbnRUeXBlKTsNCisgIEZYX0JPT0wgR2V0SHJlZihDRlhfV2lkZVN0cmluZyYgd3NIcmVmKTsNCisgIGludDMyX3QgR2V0VHJhbnNmZXJFbmNvZGluZygpOw0KKyAgRlhfQk9PTCBHZXRDb250ZW50KENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgRlhfQk9PTCBTZXRBc3BlY3QoaW50MzJfdCBpQXNwZWN0KTsNCisgIEZYX0JPT0wgU2V0Q29udGVudFR5cGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudFR5cGUpOw0KKyAgRlhfQk9PTCBTZXRIcmVmKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0hyZWYpOw0KKyAgRlhfQk9PTCBTZXRUcmFuc2ZlckVuY29kaW5nKGludDMyX3QgaVRyYW5zZmVyRW5jb2RpbmcpOw0KKyAgRlhfQk9PTCBTZXRDb250ZW50KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBGWF9CT09MIG1fYkRlZlZhbHVlOw0KK307DQorY2xhc3MgQ1hGQV9DYWxjdWxhdGUgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9DYWxjdWxhdGUoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorDQorICBpbnQzMl90IEdldE92ZXJyaWRlKCk7DQorICBDWEZBX1NjcmlwdCBHZXRTY3JpcHQoKTsNCisgIHZvaWQgR2V0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzTWVzc2FnZSk7DQorICBGWF9CT09MIFNldE92ZXJyaWRlKGludDMyX3QgaU92ZXJyaWRlKTsNCisgIEZYX0JPT0wgU2V0TWVzc2FnZVRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTWVzc2FnZSk7DQorfTsNCitjbGFzcyBDWEZBX1ZhbGlkYXRlIDogcHVibGljIENYRkFfRGF0YSB7DQorIHB1YmxpYzoNCisgIENYRkFfVmFsaWRhdGUoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICBpbnQzMl90IEdldEZvcm1hdFRlc3QoKTsNCisgIEZYX0JPT0wgU2V0Rm9ybWF0VGVzdChDRlhfV2lkZVN0cmluZyB3c1ZhbHVlKTsNCisgIGludDMyX3QgR2V0TnVsbFRlc3QoKTsNCisgIEZYX0JPT0wgU2V0TnVsbFRlc3QoQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSk7DQorICBpbnQzMl90IEdldFNjcmlwdFRlc3QoKTsNCisgIHZvaWQgR2V0Rm9ybWF0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzTWVzc2FnZSk7DQorICB2b2lkIFNldEZvcm1hdE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZSk7DQorICB2b2lkIEdldE51bGxNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyYgd3NNZXNzYWdlKTsNCisgIHZvaWQgU2V0TnVsbE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZSk7DQorICB2b2lkIEdldFNjcmlwdE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nJiB3c01lc3NhZ2UpOw0KKyAgdm9pZCBTZXRTY3JpcHRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2UpOw0KKyAgdm9pZCBHZXRQaWN0dXJlKENGWF9XaWRlU3RyaW5nJiB3c1BpY3R1cmUpOw0KKyAgQ1hGQV9TY3JpcHQgR2V0U2NyaXB0KCk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgR2V0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzTWVzc2FnZSwNCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c01lc3NhZ2VUeXBlKTsNCisgIHZvaWQgU2V0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzTWVzc2FnZSwNCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c01lc3NhZ2VUeXBlKTsNCisgIEZYX0JPT0wgU2V0VGVzdFZhbHVlKGludDMyX3QgaVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVOYW1lKTsNCit9Ow0KK2NsYXNzIENYRkFfVmFyaWFibGVzIDogcHVibGljIENYRkFfRGF0YSB7DQorIHB1YmxpYzoNCisgIENYRkFfVmFyaWFibGVzKENYRkFfTm9kZSogcE5vZGUpOw0KKw0KKyAgaW50MzJfdCBDb3VudFNjcmlwdHMoKTsNCisgIENYRkFfU2NyaXB0IEdldFNjcmlwdChpbnQzMl90IG5JbmRleCk7DQorfTsNCitjbGFzcyBDWEZBX0JpbmQgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9CaW5kKENYRkFfTm9kZSogcE5vZGUpOw0KKyAgaW50MzJfdCBHZXRNYXRjaCgpOw0KKyAgdm9pZCBHZXRSZWYoQ0ZYX1dpZGVTdHJpbmdDJiB3c1JlZik7DQorICB2b2lkIEdldFBpY3R1cmUoQ0ZYX1dpZGVTdHJpbmcmIHdzUGljdHVyZSk7DQorICBGWF9CT09MIFNldE1hdGNoKGludDMyX3QgaU1hdGNoKTsNCisgIEZYX0JPT0wgU2V0UmVmKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1JlZik7DQorICBGWF9CT09MIFNldFBpY3R1cmUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGljdHVyZSk7DQorfTsNCitjbGFzcyBDWEZBX0Fzc2lzdCA6IHB1YmxpYyBDWEZBX0RhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX0Fzc2lzdChDWEZBX05vZGUqIHBOb2RlKTsNCisNCisgIENYRkFfVG9vbFRpcCBHZXRUb29sVGlwKCk7DQorfTsNCitjbGFzcyBDWEZBX1Rvb2xUaXAgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9Ub29sVGlwKENYRkFfTm9kZSogcE5vZGUpOw0KKyAgRlhfQk9PTCBHZXRUaXAoQ0ZYX1dpZGVTdHJpbmcmIHdzVGlwKTsNCisgIEZYX0JPT0wgU2V0VGlwKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RpcCk7DQorfTsNCitjbGFzcyBDWEZBX0JpbmRJdGVtcyA6IHB1YmxpYyBDWEZBX0RhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX0JpbmRJdGVtcyhDWEZBX05vZGUqIHBOb2RlKTsNCisgIHZvaWQgR2V0Q29ubmVjdGlvbihDRlhfV2lkZVN0cmluZ0MmIHdzQ29ubmVjdGlvbik7DQorICB2b2lkIEdldExhYmVsUmVmKENGWF9XaWRlU3RyaW5nQyYgd3NMYWJlbFJlZik7DQorICB2b2lkIEdldFZhbHVlUmVmKENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZVJlZik7DQorICB2b2lkIEdldFJlZihDRlhfV2lkZVN0cmluZ0MmIHdzUmVmKTsNCisgIEZYX0JPT0wgU2V0Q29ubmVjdGlvbihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb25uZWN0aW9uKTsNCisgIEZYX0JPT0wgU2V0TGFiZWxSZWYoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTGFiZWxSZWYpOw0KKyAgRlhfQk9PTCBTZXRWYWx1ZVJlZihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZVJlZik7DQorICBGWF9CT09MIFNldFJlZihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NSZWYpOw0KK307DQorI2RlZmluZSBYRkFfU1RST0tFX1NBTUVTVFlMRV9Ob1ByZXNlbmNlIDENCisjZGVmaW5lIFhGQV9TVFJPS0VfU0FNRVNUWUxFX0Nvcm5lciAyDQorY2xhc3MgQ1hGQV9TdHJva2UgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9TdHJva2UoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQorDQorICBGWF9CT09MIElzQ29ybmVyKCkgY29uc3QgeyByZXR1cm4gR2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0Nvcm5lcjsgfQ0KKw0KKyAgRlhfQk9PTCBJc0VkZ2UoKSBjb25zdCB7IHJldHVybiBHZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRWRnZTsgfQ0KKw0KKyAgaW50MzJfdCBHZXRQcmVzZW5jZSgpIGNvbnN0Ow0KKyAgRlhfQk9PTCBJc1Zpc2libGUoKSBjb25zdCB7DQorICAgIHJldHVybiBHZXRQcmVzZW5jZSgpID09IFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGU7DQorICB9DQorDQorICBpbnQzMl90IEdldENhcFR5cGUoKSBjb25zdDsNCisNCisgIGludDMyX3QgR2V0U3Ryb2tlVHlwZSgpIGNvbnN0Ow0KKw0KKyAgRlhfRkxPQVQgR2V0VGhpY2tuZXNzKCkgY29uc3Q7DQorICBDWEZBX01lYXN1cmVtZW50IEdldE1TVGhpY2tuZXNzKCkgY29uc3Q7DQorDQorICB2b2lkIFNldFRoaWNrbmVzcyhGWF9GTE9BVCBmVGhpY2tuZXNzKTsNCisgIHZvaWQgU2V0TVNUaGlja25lc3MoQ1hGQV9NZWFzdXJlbWVudCBtc1RoaW5rbmVzcyk7DQorDQorICBGWF9BUkdCIEdldENvbG9yKCkgY29uc3Q7DQorDQorICB2b2lkIFNldENvbG9yKEZYX0FSR0IgYXJnYik7DQorDQorICBpbnQzMl90IEdldEpvaW5UeXBlKCkgY29uc3Q7DQorDQorICBGWF9CT09MIElzSW52ZXJ0ZWQoKSBjb25zdDsNCisNCisgIEZYX0ZMT0FUIEdldFJhZGl1cygpIGNvbnN0Ow0KKw0KKyAgRlhfQk9PTCBTYW1lU3R5bGVzKENYRkFfU3Ryb2tlIHN0cm9rZSwgRlhfRFdPUkQgZHdGbGFncyA9IDApIGNvbnN0Ow0KK307DQorY2xhc3MgQ1hGQV9Db3JuZXIgOiBwdWJsaWMgQ1hGQV9TdHJva2Ugew0KKyBwdWJsaWM6DQorICBDWEZBX0Nvcm5lcihDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfU3Ryb2tlKHBOb2RlKSB7fQ0KK307DQorY2xhc3MgQ1hGQV9FZGdlIDogcHVibGljIENYRkFfU3Ryb2tlIHsNCisgcHVibGljOg0KKyAgQ1hGQV9FZGdlKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9TdHJva2UocE5vZGUpIHt9DQorfTsNCit0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPENYRkFfU3Ryb2tlPiBDWEZBX1N0cm9rZUFycmF5Ow0KK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9FZGdlPiBDWEZBX0VkZ2VBcnJheTsNCit0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPENYRkFfQ29ybmVyPiBDWEZBX0Nvcm5lckFycmF5Ow0KK2NsYXNzIENYRkFfQm94IDogcHVibGljIENYRkFfRGF0YSB7DQorIHB1YmxpYzoNCisgIENYRkFfQm94KENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KKw0KKyAgRlhfQk9PTCBJc0FyYygpIGNvbnN0IHsgcmV0dXJuIEdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9BcmM7IH0NCisNCisgIEZYX0JPT0wgSXNCb3JkZXIoKSBjb25zdCB7IHJldHVybiBHZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfQm9yZGVyOyB9DQorDQorICBGWF9CT09MIElzUmVjdGFuZ2xlKCkgY29uc3QgeyByZXR1cm4gR2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1JlY3RhbmdsZTsgfQ0KKw0KKyAgaW50MzJfdCBHZXRCcmVhaygpIGNvbnN0Ow0KKw0KKyAgaW50MzJfdCBHZXRIYW5kKCkgY29uc3Q7DQorDQorICBpbnQzMl90IEdldFByZXNlbmNlKCkgY29uc3Q7DQorDQorICBpbnQzMl90IENvdW50Q29ybmVycygpIGNvbnN0Ow0KKw0KKyAgQ1hGQV9Db3JuZXIgR2V0Q29ybmVyKGludDMyX3QgbkluZGV4KSBjb25zdDsNCisNCisgIGludDMyX3QgQ291bnRFZGdlcygpIGNvbnN0Ow0KKw0KKyAgQ1hGQV9FZGdlIEdldEVkZ2UoaW50MzJfdCBuSW5kZXggPSAwKSBjb25zdDsNCisNCisgIHZvaWQgR2V0U3Ryb2tlcyhDWEZBX1N0cm9rZUFycmF5JiBzdHJva2VzKSBjb25zdDsNCisNCisgIEZYX0JPT0wgSXNDaXJjdWxhcigpIGNvbnN0Ow0KKw0KKyAgRlhfQk9PTCBHZXRTdGFydEFuZ2xlKEZYX0ZMT0FUJiBmU3RhcnRBbmdsZSkgY29uc3Q7DQorICBGWF9GTE9BVCBHZXRTdGFydEFuZ2xlKCkgY29uc3Qgew0KKyAgICBGWF9GTE9BVCBmU3RhcnRBbmdsZTsNCisgICAgR2V0U3RhcnRBbmdsZShmU3RhcnRBbmdsZSk7DQorICAgIHJldHVybiBmU3RhcnRBbmdsZTsNCisgIH0NCisNCisgIEZYX0JPT0wgR2V0U3dlZXBBbmdsZShGWF9GTE9BVCYgZlN3ZWVwQW5nbGUpIGNvbnN0Ow0KKyAgRlhfRkxPQVQgR2V0U3dlZXBBbmdsZSgpIGNvbnN0IHsNCisgICAgRlhfRkxPQVQgZlN3ZWVwQW5nbGU7DQorICAgIEdldFN3ZWVwQW5nbGUoZlN3ZWVwQW5nbGUpOw0KKyAgICByZXR1cm4gZlN3ZWVwQW5nbGU7DQorICB9DQorDQorICBDWEZBX0ZpbGwgR2V0RmlsbChGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKSBjb25zdDsNCisNCisgIENYRkFfTWFyZ2luIEdldE1hcmdpbigpIGNvbnN0Ow0KKw0KKyAgRlhfQk9PTCBTYW1lU3R5bGVzKCkgY29uc3Q7DQorDQorICBpbnQzMl90IEdldDNEU3R5bGUoRlhfQk9PTCYgYlZpc2libGUsIEZYX0ZMT0FUJiBmVGhpY2tuZXNzKSBjb25zdDsNCit9Ow0KK2NsYXNzIENYRkFfQXJjIDogcHVibGljIENYRkFfQm94IHsNCisgcHVibGljOg0KKyAgQ1hGQV9BcmMoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0JveChwTm9kZSkge30NCit9Ow0KK2NsYXNzIENYRkFfQm9yZGVyIDogcHVibGljIENYRkFfQm94IHsNCisgcHVibGljOg0KKyAgQ1hGQV9Cb3JkZXIoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0JveChwTm9kZSkge30NCit9Ow0KK2NsYXNzIENYRkFfUmVjdGFuZ2xlIDogcHVibGljIENYRkFfQm94IHsNCisgcHVibGljOg0KKyAgQ1hGQV9SZWN0YW5nbGUoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0JveChwTm9kZSkge30NCit9Ow0KK2VudW0gWEZBX0NIRUNLU1RBVEUgew0KKyAgWEZBX0NIRUNLU1RBVEVfT24gPSAwLA0KKyAgWEZBX0NIRUNLU1RBVEVfT2ZmID0gMSwNCisgIFhGQV9DSEVDS1NUQVRFX05ldXRyYWwgPSAyLA0KK307DQorZW51bSBYRkFfVkFMVUVQSUNUVVJFIHsNCisgIFhGQV9WQUxVRVBJQ1RVUkVfUmF3ID0gMCwNCisgIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSwNCisgIFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCwNCisgIFhGQV9WQUxVRVBJQ1RVUkVfRGF0YUJpbmQsDQorfTsNCitjbGFzcyBDWEZBX1dpZGdldERhdGEgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9XaWRnZXREYXRhKENYRkFfTm9kZSogcE5vZGUpOw0KKyAgQ1hGQV9Ob2RlKiBHZXRVSUNoaWxkKCk7DQorDQorICBYRkFfRUxFTUVOVCBHZXRVSVR5cGUoKTsNCisgIENGWF9XaWRlU3RyaW5nIEdldFJhd1ZhbHVlKCk7DQorICBpbnQzMl90IEdldEFjY2VzcyhGWF9CT09MIGJUZW1wbGF0ZSA9IEZBTFNFKTsNCisgIEZYX0JPT0wgR2V0QWNjZXNzS2V5KENGWF9XaWRlU3RyaW5nQyYgd3NBY2Nlc3NLZXkpOw0KKyAgaW50MzJfdCBHZXRBbmNob3JUeXBlKCk7DQorICBpbnQzMl90IEdldENvbFNwYW4oKTsNCisgIGludDMyX3QgR2V0UHJlc2VuY2UoKTsNCisgIGludDMyX3QgR2V0Um90YXRlKCk7DQorICBDWEZBX0JvcmRlciBHZXRCb3JkZXIoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQorICBDWEZBX0NhcHRpb24gR2V0Q2FwdGlvbihGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCisgIENYRkFfRm9udCBHZXRGb250KEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKyAgQ1hGQV9NYXJnaW4gR2V0TWFyZ2luKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKyAgQ1hGQV9QYXJhIEdldFBhcmEoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQorICBDWEZBX0tlZXAgR2V0S2VlcChGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCisgIHZvaWQgR2V0RXZlbnRMaXN0KENYRkFfTm9kZUFycmF5JiBldmVudHMpOw0KKyAgaW50MzJfdCBHZXRFdmVudEJ5QWN0aXZpdHkoaW50MzJfdCBpQWN0aXZpdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGVBcnJheSYgZXZlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNGb3JtUmVhZHkgPSBGQUxTRSk7DQorICBDWEZBX1ZhbHVlIEdldERlZmF1bHRWYWx1ZShGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCisgIENYRkFfVmFsdWUgR2V0Rm9ybVZhbHVlKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKyAgQ1hGQV9DYWxjdWxhdGUgR2V0Q2FsY3VsYXRlKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKyAgQ1hGQV9WYWxpZGF0ZSBHZXRWYWxpZGF0ZShGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCisgIENYRkFfVmFyaWFibGVzIEdldFZhcmlhYmxlcyhGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCisgIENYRkFfQmluZCBHZXRCaW5kKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKyAgQ1hGQV9Bc3Npc3QgR2V0QXNzaXN0KEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKyAgdm9pZCBHZXRSZWxldmFudChDRlhfV2lkZVN0cmluZ0MmIHdzUmVsZXZhbnQpOw0KKyAgRlhfRFdPUkQgR2V0UmVsZXZhbnRTdGF0dXMoKTsNCisgIEZYX0JPT0wgR2V0V2lkdGgoRlhfRkxPQVQmIGZXaWR0aCk7DQorICBGWF9CT09MIEdldEhlaWdodChGWF9GTE9BVCYgZkhlaWdodCk7DQorICBGWF9CT09MIEdldE1pbldpZHRoKEZYX0ZMT0FUJiBmTWluV2lkdGgpOw0KKyAgRlhfQk9PTCBHZXRNaW5IZWlnaHQoRlhfRkxPQVQmIGZNaW5IZWlnaHQpOw0KKyAgRlhfQk9PTCBHZXRNYXhXaWR0aChGWF9GTE9BVCYgZk1heFdpZHRoKTsNCisgIEZYX0JPT0wgR2V0TWF4SGVpZ2h0KEZYX0ZMT0FUJiBmTWF4SGVpZ2h0KTsNCisgIENYRkFfQmluZEl0ZW1zIEdldEJpbmRJdGVtcygpOw0KKyAgRlhfQk9PTCBTZXRBY2Nlc3MoaW50MzJfdCBpQWNjZXNzLCBGWF9CT09MIGJOb3RpZnkgPSBUUlVFKTsNCisgIEZYX0JPT0wgU2V0QWNjZXNzS2V5KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0FjY2Vzc0tleSk7DQorICBGWF9CT09MIFNldEFuY2hvclR5cGUoaW50MzJfdCBpVHlwZSk7DQorICBGWF9CT09MIFNldENvbFNwYW4oaW50MzJfdCBpQ29sU3Bhbik7DQorICBGWF9CT09MIFNldFByZXNlbmNlKGludDMyX3QgaVByZXNlbmNlKTsNCisgIEZYX0JPT0wgU2V0Um90YXRlKGludDMyX3QgaVJvdGF0ZSk7DQorICBGWF9CT09MIFNldFJlbGV2YW50KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1JlbGV2YW50KTsNCisgIEZYX0JPT0wgU2V0U3RhdHVzKEZYX0RXT1JEIGR3U3RhdHVzKTsNCisgIEZYX0JPT0wgU2V0V2lkdGgoRlhfRkxPQVQgZldpZHRoKTsNCisgIEZYX0JPT0wgU2V0SGVpZ2h0KEZYX0ZMT0FUIGZIZWlnaHQpOw0KKyAgRlhfQk9PTCBTZXRNaW5XaWR0aChGWF9GTE9BVCBmTWluV2lkdGgpOw0KKyAgRlhfQk9PTCBTZXRNaW5IZWlnaHQoRlhfRkxPQVQgZk1pbkhlaWdodCk7DQorICBGWF9CT09MIFNldE1heFdpZHRoKEZYX0ZMT0FUIGZNYXhXaWR0aCk7DQorICBGWF9CT09MIFNldE1heEhlaWdodChGWF9GTE9BVCBmTWF4SGVpZ2h0KTsNCisgIEZYX0JPT0wgU2V0UG9zKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpOw0KKyAgRlhfQk9PTCBTZXROYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c05hbWUpOw0KKyAgRlhfQk9PTCBTZXRCdXR0b25IaWdobGlnaHQoaW50MzJfdCBpQnV0dG9uSGlnaGxpZ2h0KTsNCisgIEZYX0JPT0wgU2V0QnV0dG9uUm9sbG92ZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUm9sbG92ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJpY2hUZXh0KTsNCisgIEZYX0JPT0wgU2V0QnV0dG9uRG93bihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEb3duLCBGWF9CT09MIGJSaWNoVGV4dCk7DQorICBGWF9CT09MIFNldENoZWNrQnV0dG9uU2hhcGUoaW50MzJfdCBpQ2hlY2tCdXR0b25TaGFwZSk7DQorICBGWF9CT09MIFNldENoZWNrQnV0dG9uTWFyayhpbnQzMl90IGlDaGVja0J1dHRvbk1hcmspOw0KKyAgRlhfQk9PTCBTZXRDaGVja0J1dHRvblNpemUoRlhfRkxPQVQgZkNoZWNrQnV0dG9uTWFyayk7DQorICBDWEZBX0JvcmRlciBHZXRVSUJvcmRlcihGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCisgIENYRkFfTWFyZ2luIEdldFVJTWFyZ2luKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKyAgdm9pZCBHZXRVSU1hcmdpbihDRlhfUmVjdEYmIHJ0VUlNYXJnaW4pOw0KKyAgaW50MzJfdCBHZXRCdXR0b25IaWdobGlnaHQoKTsNCisgIEZYX0JPT0wgR2V0QnV0dG9uUm9sbG92ZXIoQ0ZYX1dpZGVTdHJpbmcmIHdzUm9sbG92ZXIsIEZYX0JPT0wmIGJSaWNoVGV4dCk7DQorICBGWF9CT09MIEdldEJ1dHRvbkRvd24oQ0ZYX1dpZGVTdHJpbmcmIHdzRG93biwgRlhfQk9PTCYgYlJpY2hUZXh0KTsNCisgIGludDMyX3QgR2V0Q2hlY2tCdXR0b25TaGFwZSgpOw0KKyAgaW50MzJfdCBHZXRDaGVja0J1dHRvbk1hcmsoKTsNCisgIEZYX0ZMT0FUIEdldENoZWNrQnV0dG9uU2l6ZSgpOw0KKyAgRlhfQk9PTCBJc0FsbG93TmV1dHJhbCgpOw0KKyAgRlhfQk9PTCBJc1JhZGlvQnV0dG9uKCk7DQorICBYRkFfQ0hFQ0tTVEFURSBHZXRDaGVja1N0YXRlKCk7DQorICB2b2lkIFNldENoZWNrU3RhdGUoWEZBX0NIRUNLU1RBVEUgZUNoZWNrU3RhdGUsIEZYX0JPT0wgYk5vdGlmeSA9IFRSVUUpOw0KKyAgQ1hGQV9Ob2RlKiBHZXRFeGNsR3JvdXBOb2RlKCk7DQorICBDWEZBX05vZGUqIEdldFNlbGVjdGVkTWVtYmVyKCk7DQorICBDWEZBX05vZGUqIFNldFNlbGVjdGVkTWVtYmVyKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBUUlVFKTsNCisgIHZvaWQgU2V0U2VsZWN0ZWRNZW1iZXJCeVZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSA9IFRSVUUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTY3JpcHRNb2RpZnkgPSBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN5bmNEYXRhID0gVFJVRSk7DQorICBDWEZBX05vZGUqIEdldEV4Y2xHcm91cEZpcnN0TWVtYmVyKCk7DQorICBDWEZBX05vZGUqIEdldEV4Y2xHcm91cE5leHRNZW1iZXIoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICBpbnQzMl90IEdldENob2ljZUxpc3RDb21taXRPbigpOw0KKyAgRlhfQk9PTCBJc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpOw0KKyAgaW50MzJfdCBHZXRDaG9pY2VMaXN0T3BlbigpOw0KKyAgRlhfQk9PTCBJc0xpc3RCb3goKTsNCisgIGludDMyX3QgQ291bnRDaG9pY2VMaXN0SXRlbXMoRlhfQk9PTCBiU2F2ZVZhbHVlID0gRkFMU0UpOw0KKyAgRlhfQk9PTCBHZXRDaG9pY2VMaXN0SXRlbShDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVZhbHVlID0gRkFMU0UpOw0KKyAgdm9pZCBHZXRDaG9pY2VMaXN0SXRlbXMoQ0ZYX1dpZGVTdHJpbmdBcnJheSYgd3NUZXh0QXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlVmFsdWUgPSBGQUxTRSk7DQorICBpbnQzMl90IENvdW50U2VsZWN0ZWRJdGVtcygpOw0KKyAgaW50MzJfdCBHZXRTZWxlY3RlZEl0ZW0oaW50MzJfdCBuSW5kZXggPSAwKTsNCisgIHZvaWQgR2V0U2VsZWN0ZWRJdGVtcyhDRlhfSW50MzJBcnJheSYgaVNlbEFycmF5KTsNCisgIHZvaWQgR2V0U2VsZWN0ZWRJdGVtc1ZhbHVlKENGWF9XaWRlU3RyaW5nQXJyYXkmIHdzU2VsVGV4dEFycmF5KTsNCisgIEZYX0JPT0wgR2V0SXRlbVN0YXRlKGludDMyX3QgbkluZGV4KTsNCisgIHZvaWQgU2V0SXRlbVN0YXRlKGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2VsZWN0ZWQsDQorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3luY0RhdGEgPSBUUlVFKTsNCisgIHZvaWQgU2V0U2VsZWN0ZEl0ZW1zKENGWF9JbnQzMkFycmF5JiBpU2VsQXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3luY0RhdGEgPSBUUlVFKTsNCisgIHZvaWQgQ2xlYXJBbGxTZWxlY3Rpb25zKCk7DQorICB2b2lkIEluc2VydEl0ZW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTGFiZWwsDQorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXggPSAtMSwNCisgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7DQorICB2b2lkIEdldEl0ZW1MYWJlbChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUsIENGWF9XaWRlU3RyaW5nJiB3c0xhYmVsKTsNCisgIHZvaWQgR2V0SXRlbVZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMYWJlbCwgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpOw0KKyAgRlhfQk9PTCBEZWxldGVJdGVtKGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN5bmNEYXRhID0gVFJVRSk7DQorICBpbnQzMl90IEdldEhvcml6b250YWxTY3JvbGxQb2xpY3koKTsNCisgIGludDMyX3QgR2V0TnVtYmVyT2ZDZWxscygpOw0KKyAgRlhfQk9PTCBJc0RhdGVUaW1lRWRpdFVzZVBpY2tlcigpOw0KKyAgRlhfQk9PTCBTZXRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRSBlVmFsdWVUeXBlKTsNCisgIEZYX0JPT0wgR2V0UGljdHVyZUNvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcmIHdzUGljdHVyZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1ZBTFVFUElDVFVSRSBlUGljdHVyZSk7DQorICBJRlhfTG9jYWxlKiBHZXRMb2NhbCgpOw0KKyAgRlhfQk9PTCBHZXRWYWx1ZShDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRSBlVmFsdWVUeXBlKTsNCisgIEZYX0JPT0wgR2V0Tm9ybWFsaXplRGF0YVZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c05vcm1hbGl6ZVZhbHVlKTsNCisgIEZYX0JPT0wgR2V0Rm9ybWF0RGF0YVZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdGVkVmFsdWUpOw0KKyAgdm9pZCBOb3JtYWxpemVOdW1TdHIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCk7DQorICBDRlhfV2lkZVN0cmluZyBHZXRCYXJjb2RlVHlwZSgpOw0KKyAgRlhfQk9PTCBHZXRCYXJjb2RlQXR0cmlidXRlX0NoYXJFbmNvZGluZyhpbnQzMl90JiB2YWwpOw0KKyAgRlhfQk9PTCBHZXRCYXJjb2RlQXR0cmlidXRlX0NoZWNrc3VtKGludDMyX3QmIHZhbCk7DQorICBGWF9CT09MIEdldEJhcmNvZGVBdHRyaWJ1dGVfRGF0YUxlbmd0aChpbnQzMl90JiB2YWwpOw0KKyAgRlhfQk9PTCBHZXRCYXJjb2RlQXR0cmlidXRlX1N0YXJ0Q2hhcihGWF9DSEFSJiB2YWwpOw0KKyAgRlhfQk9PTCBHZXRCYXJjb2RlQXR0cmlidXRlX0VuZENoYXIoRlhfQ0hBUiYgdmFsKTsNCisgIEZYX0JPT0wgR2V0QmFyY29kZUF0dHJpYnV0ZV9FQ0xldmVsKGludDMyX3QmIHZhbCk7DQorICBGWF9CT09MIEdldEJhcmNvZGVBdHRyaWJ1dGVfTW9kdWxlV2lkdGgoaW50MzJfdCYgdmFsKTsNCisgIEZYX0JPT0wgR2V0QmFyY29kZUF0dHJpYnV0ZV9Nb2R1bGVIZWlnaHQoaW50MzJfdCYgdmFsKTsNCisgIEZYX0JPT0wgR2V0QmFyY29kZUF0dHJpYnV0ZV9QcmludENoZWNrc3VtKEZYX0JPT0wmIHZhbCk7DQorICBGWF9CT09MIEdldEJhcmNvZGVBdHRyaWJ1dGVfVGV4dExvY2F0aW9uKGludDMyX3QmIHZhbCk7DQorICBGWF9CT09MIEdldEJhcmNvZGVBdHRyaWJ1dGVfVHJ1bmNhdGUoRlhfQk9PTCYgdmFsKTsNCisgIEZYX0JPT0wgR2V0QmFyY29kZUF0dHJpYnV0ZV9XaWRlTmFycm93UmF0aW8oRlhfRkxPQVQmIHZhbCk7DQorICB2b2lkIEdldFBhc3N3b3JkQ2hhcihDRlhfV2lkZVN0cmluZyYgd3NQYXNzV29yZCk7DQorICBGWF9CT09MIElzQWxsb3dSaWNoVGV4dCgpOw0KKyAgRlhfQk9PTCBJc011bHRpTGluZSgpOw0KKyAgaW50MzJfdCBHZXRWZXJ0aWNhbFNjcm9sbFBvbGljeSgpOw0KKyAgaW50MzJfdCBHZXRNYXhDaGFycyhYRkFfRUxFTUVOVCYgZVR5cGUpOw0KKyAgRlhfQk9PTCBHZXRGcmFjRGlnaXRzKGludDMyX3QmIGlGcmFjRGlnaXRzKTsNCisgIEZYX0JPT0wgR2V0TGVhZERpZ2l0cyhpbnQzMl90JiBpTGVhZERpZ2l0cyk7DQorICBDWEZBX0ZpbHRlciBHZXRGaWx0ZXIoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQorICBDWEZBX01hbmlmZXN0IEdldE1hbmlmZXN0KEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKw0KKyAgRlhfQk9PTCBtX2JJc051bGw7DQorICBGWF9CT09MIG1fYlByZU51bGw7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgU3luY1ZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLCBGWF9CT09MIGJOb3RpZnkpOw0KKyAgdm9pZCBJbnNlcnRMaXN0VGV4dEl0ZW0oQ1hGQV9Ob2RlKiBwSXRlbXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4ID0gLTEpOw0KKyAgdm9pZCBGb3JtYXROdW1TdHIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KTsNCisNCisgIENYRkFfTm9kZSogbV9wVWlDaGlsZE5vZGU7DQorICBYRkFfRUxFTUVOVCBtX2VVSVR5cGU7DQorfTsNCitjbGFzcyBDWEZBX09jY3VyIDogcHVibGljIENYRkFfRGF0YSB7DQorIHB1YmxpYzoNCisgIENYRkFfT2NjdXIoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICBpbnQzMl90IEdldE1heCgpOw0KKyAgaW50MzJfdCBHZXRNaW4oKTsNCisgIGludDMyX3QgR2V0SW5pdGlhbCgpOw0KKyAgRlhfQk9PTCBHZXRPY2N1ckluZm8oaW50MzJfdCYgaU1pbiwgaW50MzJfdCYgaU1heCwgaW50MzJfdCYgaUluaXQpOw0KKyAgdm9pZCBTZXRNYXgoaW50MzJfdCBpTWF4KTsNCisgIHZvaWQgU2V0TWluKGludDMyX3QgaU1pbik7DQorfTsNCitjbGFzcyBDWEZBX0ZpbHRlciA6IHB1YmxpYyBDWEZBX0RhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX0ZpbHRlcihDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCisgIENGWF9XaWRlU3RyaW5nIEdldEZpbHRlclN0cmluZyhYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgWEZBX0FUVFJJQlVURUVOVU0gR2V0QXBwZWFyYW5jZUZpbHRlclR5cGUoKTsNCisgIENGWF9XaWRlU3RyaW5nIEdldEFwcGVhcmFuY2VGaWx0ZXJDb250ZW50KCk7DQorICBYRkFfQVRUUklCVVRFRU5VTSBHZXRDZXJ0aWZpY2F0ZXNDcmVkZW50aWFsU2VydmVyUG9saWN5KCk7DQorICBDRlhfV2lkZVN0cmluZyBHZXRDZXJ0aWZpY2F0ZXNVUkwoKTsNCisgIENGWF9XaWRlU3RyaW5nIEdldENlcnRpZmljYXRlc1VSTFBvbGljeSgpOw0KKyAgQ1hGQV9XcmFwQ2VydGlmaWNhdGUgR2V0Q2VydGlmaWNhdGVzRW5jcnlwdGlvbihGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCisgIENYRkFfV3JhcENlcnRpZmljYXRlIEdldENlcnRpZmljYXRlc0lzc3VlcnMoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQorICBDRlhfV2lkZVN0cmluZyBHZXRDZXJ0aWZpY2F0ZXNLZXlVc2FnZVN0cmluZyhYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgQ1hGQV9PaWRzIEdldENlcnRpZmljYXRlc09pZHMoKTsNCisgIENYRkFfV3JhcENlcnRpZmljYXRlIEdldENlcnRpZmljYXRlc1NpZ25pbmcoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQorICBDWEZBX0RpZ2VzdE1ldGhvZHMgR2V0RGlnZXN0TWV0aG9kcyhGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCisgIENYRkFfRW5jb2RpbmdzIEdldEVuY29kaW5ncyhGWF9CT09MIGJNb2RpZmllZCA9IEZBTFNFKTsNCisgIENYRkFfRW5jcnlwdGlvbk1ldGhvZHMgR2V0RW5jcnlwdGlvbk1ldGhvZHMoRlhfQk9PTCBiTW9kaWZpZWQgPSBGQUxTRSk7DQorICBYRkFfQVRUUklCVVRFRU5VTSBHZXRIYW5kbGVyVHlwZSgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0SGFuZGxlckNvbnRlbnQoKTsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIEdldGxvY2tEb2N1bWVudFR5cGUoKTsNCisgIENGWF9XaWRlU3RyaW5nIEdldGxvY2tEb2N1bWVudENvbnRlbnQoKTsNCisgIGludDMyX3QgR2V0TURQUGVybWlzc2lvbnMoKTsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIEdldE1EUFNpZ25hdHVyZVR5cGUoKTsNCisNCisgIENYRkFfUmVhc29ucyBHZXRSZWFzb25zKEZYX0JPT0wgYk1vZGlmaWVkID0gRkFMU0UpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0VGltZVN0YW1wU2VydmVyKCk7DQorICBYRkFfQVRUUklCVVRFRU5VTSBHZXRUaW1lU3RhbXBUeXBlKCk7DQorfTsNCitjbGFzcyBDWEZBX0NlcnRpZmljYXRlIDogcHVibGljIENYRkFfRGF0YSB7DQorIHB1YmxpYzoNCisgIENYRkFfQ2VydGlmaWNhdGUoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQorICBDRlhfV2lkZVN0cmluZyBHZXRDZXJ0aWZpY2F0ZU5hbWUoKTsNCisgIENGWF9XaWRlU3RyaW5nIEdldENlcnRpZmljYXRlQ29udGVudCgpOw0KK307DQorY2xhc3MgQ1hGQV9XcmFwQ2VydGlmaWNhdGUgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9XcmFwQ2VydGlmaWNhdGUoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQorICBYRkFfQVRUUklCVVRFRU5VTSBHZXRUeXBlKCk7DQorICBpbnQzMl90IENvdW50Q2VydGlmaWNhdGVzKCk7DQorICBDWEZBX0NlcnRpZmljYXRlIEdldENlcnRpZmljYXRlKGludDMyX3QgbkluZGV4KTsNCit9Ow0KK2NsYXNzIENYRkFfT2lkcyA6IHB1YmxpYyBDWEZBX0RhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX09pZHMoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQorICBYRkFfQVRUUklCVVRFRU5VTSBHZXRPaWRzVHlwZSgpOw0KKyAgaW50MzJfdCBDb3VudE9pZHMoKTsNCisgIENGWF9XaWRlU3RyaW5nIEdldE9pZENvbnRlbnQoaW50MzJfdCBuSW5kZXgpOw0KK307DQorY2xhc3MgQ1hGQV9TdWJqZWN0RE5zIDogcHVibGljIENYRkFfRGF0YSB7DQorIHB1YmxpYzoNCisgIENYRkFfU3ViamVjdEROcyhDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCisgIFhGQV9BVFRSSUJVVEVFTlVNIEdldFN1YmplY3RETnNUeXBlKCk7DQorICBpbnQzMl90IENvdW50U3ViamVjdEROcygpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0U3ViamVjdEROU3RyaW5nKGludDMyX3QgbkluZGV4LCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0U3ViamVjdEROQ29udGVudChpbnQzMl90IG5JbmRleCk7DQorfTsNCitjbGFzcyBDWEZBX0RpZ2VzdE1ldGhvZHMgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9EaWdlc3RNZXRob2RzKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KKyAgWEZBX0FUVFJJQlVURUVOVU0gR2V0RGlnZXN0TWV0aG9kc1R5cGUoKTsNCisgIGludDMyX3QgQ291bnREaWdlc3RNZXRob2RzKCk7DQorICBDRlhfV2lkZVN0cmluZyBHZXREaWdlc3RNZXRob2RDb250ZW50KGludDMyX3QgbkluZGV4KTsNCit9Ow0KK2NsYXNzIENYRkFfRW5jb2RpbmdzIDogcHVibGljIENYRkFfRGF0YSB7DQorIHB1YmxpYzoNCisgIENYRkFfRW5jb2RpbmdzKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KKyAgWEZBX0FUVFJJQlVURUVOVU0gR2V0RW5jb2RpbmdzVHlwZSgpOw0KKyAgaW50MzJfdCBDb3VudEVuY29kaW5ncygpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0RW5jb2RpbmdDb250ZW50KGludDMyX3QgbkluZGV4KTsNCit9Ow0KK2NsYXNzIENYRkFfRW5jcnlwdGlvbk1ldGhvZHMgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9FbmNyeXB0aW9uTWV0aG9kcyhDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCisgIFhGQV9BVFRSSUJVVEVFTlVNIEdldEVuY3J5cHRpb25NZXRob2RzVHlwZSgpOw0KKyAgaW50MzJfdCBDb3VudEVuY3J5cHRpb25NZXRob2RzKCk7DQorICBDRlhfV2lkZVN0cmluZyBHZXRFbmNyeXB0aW9uTWV0aG9kQ29udGVudChpbnQzMl90IG5JbmRleCk7DQorfTsNCitjbGFzcyBDWEZBX1JlYXNvbnMgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9SZWFzb25zKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KKyAgWEZBX0FUVFJJQlVURUVOVU0gR2V0UmVhc29uc1R5cGUoKTsNCisgIGludDMyX3QgQ291bnRSZWFzb25zKCk7DQorICBDRlhfV2lkZVN0cmluZyBHZXRSZWFzb25Db250ZW50KGludDMyX3QgbkluZGV4KTsNCit9Ow0KK2NsYXNzIENYRkFfTWFuaWZlc3QgOiBwdWJsaWMgQ1hGQV9EYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9NYW5pZmVzdChDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCisgIFhGQV9BVFRSSUJVVEVFTlVNIEdldEFjdGlvbigpOw0KKyAgaW50MzJfdCBDb3VudFJlaXZlcygpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0UmVmQ29udGVudChpbnQzMl90IG5JbmRleCk7DQorfTsNCisNCisjZW5kaWYgIC8vIEZYRkFfT0JKRUNUQUNDX0hfDQpkaWZmIC0tZ2l0IGEveGZhL2luY2x1ZGUvZnhmYS9meGZhX3dpZGdldC5oIGIveGZhL2luY2x1ZGUvZnhmYS9meGZhX3dpZGdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNDBkYWYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9meGZhL2Z4ZmFfd2lkZ2V0LmgKQEAgLTAsMCArMSwxMTggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhGQV9XSURHRVRfSA0KKyNkZWZpbmUgX0ZYRkFfV0lER0VUX0gNCitjbGFzcyBDWEZBX05vZGU7DQorY2xhc3MgQ1hGQV9GRkRvY1ZpZXc7DQorY2xhc3MgQ1hGQV9GRkRvYzsNCitjbGFzcyBDWEZBX0ZGQXBwOw0KK2NsYXNzIENYRkFfTm9kZTsNCitjbGFzcyBDWEZBX0V2ZW50UGFyYW07DQorY2xhc3MgQ1hGQV9GRldpZGdldDsNCitjbGFzcyBDWEZBX1RleHRMYXlvdXQ7DQorY2xhc3MgQ1hGQV9UZXh0UHJvdmlkZXI7DQorY2xhc3MgQ1hGQV9XaWRnZXRMYXlvdXREYXRhOw0KK2NsYXNzIElGWF9Gb250Ow0KK2NsYXNzIENYRkFfV2lkZ2V0QWNjOw0KKyNpbmNsdWRlICJmeGZhX29iamVjdGFjYy5oIg0KK2NsYXNzIENYRkFfV2lkZ2V0QWNjIDogcHVibGljIENYRkFfV2lkZ2V0RGF0YSB7DQorIHB1YmxpYzoNCisgIENYRkFfV2lkZ2V0QWNjKENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldywgQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICB+Q1hGQV9XaWRnZXRBY2MoKTsNCisNCisgIEZYX0JPT0wgR2V0TmFtZShDRlhfV2lkZVN0cmluZyYgd3NOYW1lLCBpbnQzMl90IGlOYW1lVHlwZSA9IDApOw0KKyAgRlhfQk9PTCBQcm9jZXNzVmFsdWVDaGFuZ2VkKCk7DQorDQorIHB1YmxpYzoNCisgIHZvaWQgUmVzZXREYXRhKCk7DQorDQorICB2b2lkIFNldEltYWdlRWRpdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ29udGVudFR5cGUsDQorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzSHJlZiwNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NEYXRhKTsNCisNCisgIENYRkFfV2lkZ2V0QWNjKiBHZXRFeGNsR3JvdXAoKTsNCisgIENYRkFfRkZEb2NWaWV3KiBHZXREb2NWaWV3KCk7DQorICBDWEZBX0ZGRG9jKiBHZXREb2MoKTsNCisgIENYRkFfRkZBcHAqIEdldEFwcCgpOw0KKyAgSVhGQV9BcHBQcm92aWRlciogR2V0QXBwUHJvdmlkZXIoKTsNCisNCisgIGludDMyX3QgUHJvY2Vzc0V2ZW50KGludDMyX3QgaUFjdGl2aXR5LCBDWEZBX0V2ZW50UGFyYW0qIHBFdmVudFBhcmFtKTsNCisgIGludDMyX3QgUHJvY2Vzc0V2ZW50KENYRkFfRXZlbnQmIGV2ZW50LCBDWEZBX0V2ZW50UGFyYW0qIHBFdmVudFBhcmFtKTsNCisgIGludDMyX3QgUHJvY2Vzc0NhbGN1bGF0ZSgpOw0KKyAgaW50MzJfdCBQcm9jZXNzVmFsaWRhdGUoaW50MzJfdCBpRmxhZ3MgPSAwKTsNCisgIGludDMyX3QgRXhlY3V0ZVNjcmlwdChDWEZBX1NjcmlwdCBzY3JpcHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUqIHBSZXRWYWx1ZSA9IE5VTEwpOw0KKw0KKyAgQ1hGQV9GRldpZGdldCogR2V0TmV4dFdpZGdldChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIHZvaWQgU3RhcnRXaWRnZXRMYXlvdXQoRlhfRkxPQVQmIGZDYWxjV2lkdGgsIEZYX0ZMT0FUJiBmQ2FsY0hlaWdodCk7DQorICBGWF9CT09MIEZpbmRTcGxpdFBvcyhpbnQzMl90IGlCbG9ja0luZGV4LCBGWF9GTE9BVCYgZkNhbGNIZWlnaHQpOw0KKyAgRlhfQk9PTCBMb2FkQ2FwdGlvbigpOw0KKyAgdm9pZCBMb2FkVGV4dCgpOw0KKyAgRlhfQk9PTCBMb2FkSW1hZ2VJbWFnZSgpOw0KKyAgRlhfQk9PTCBMb2FkSW1hZ2VFZGl0SW1hZ2UoKTsNCisgIHZvaWQgR2V0SW1hZ2VEcGkoaW50MzJfdCYgaUltYWdlWERwaSwgaW50MzJfdCYgaUltYWdlWURwaSk7DQorICB2b2lkIEdldEltYWdlRWRpdERwaShpbnQzMl90JiBpSW1hZ2VYRHBpLCBpbnQzMl90JiBpSW1hZ2VZRHBpKTsNCisgIENYRkFfVGV4dExheW91dCogR2V0Q2FwdGlvblRleHRMYXlvdXQoKTsNCisgIENYRkFfVGV4dExheW91dCogR2V0VGV4dExheW91dCgpOw0KKyAgQ0ZYX0RJQml0bWFwKiBHZXRJbWFnZUltYWdlKCk7DQorICBDRlhfRElCaXRtYXAqIEdldEltYWdlRWRpdEltYWdlKCk7DQorICB2b2lkIFNldEltYWdlSW1hZ2UoQ0ZYX0RJQml0bWFwKiBuZXdJbWFnZSk7DQorICB2b2lkIFNldEltYWdlRWRpdEltYWdlKENGWF9ESUJpdG1hcCogbmV3SW1hZ2UpOw0KKyAgdm9pZCBVcGRhdGVVSURpc3BsYXkoQ1hGQV9GRldpZGdldCogcEV4Y2VwdCA9IE5VTEwpOw0KKyAgdm9pZCBOb3RpZnlFdmVudChGWF9EV09SRCBkd0V2ZW50LA0KKyAgICAgICAgICAgICAgICAgICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgdm9pZCogcEFkZGl0aW9uYWwgPSBOVUxMKTsNCisNCisgIENYRkFfTm9kZSogR2V0RGF0YXNldHMoKTsNCisgIElGWF9Gb250KiBHZXRGREVGb250KCk7DQorICBGWF9GTE9BVCBHZXRGb250U2l6ZSgpOw0KKyAgRlhfQVJHQiBHZXRUZXh0Q29sb3IoKTsNCisgIEZYX0ZMT0FUIEdldExpbmVIZWlnaHQoKTsNCisgIENYRkFfV2lkZ2V0TGF5b3V0RGF0YSogR2V0V2lkZ2V0TGF5b3V0RGF0YSgpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIFByb2Nlc3NTY3JpcHRUZXN0VmFsaWRhdGUoQ1hGQV9WYWxpZGF0ZSB2YWxpZGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIHBSZXRWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJWZXJzaW9uRmxhZyk7DQorICBpbnQzMl90IFByb2Nlc3NGb3JtYXRUZXN0VmFsaWRhdGUoQ1hGQV9WYWxpZGF0ZSB2YWxpZGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJWZXJzaW9uRmxhZyk7DQorICBpbnQzMl90IFByb2Nlc3NOdWxsVGVzdFZhbGlkYXRlKENYRkFfVmFsaWRhdGUgdmFsaWRhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJWZXJzaW9uRmxhZyk7DQorICB2b2lkIEdldFZhbGlkYXRlQ2FwdGlvbk5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2FwdGlvbk5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVyc2lvbkZsYWcpOw0KKyAgdm9pZCBHZXRWYWxpZGF0ZU1lc3NhZ2UoSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTWVzc2FnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkVycm9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVyc2lvbkZsYWcpOw0KKyAgdm9pZCBDYWxjQ2FwdGlvblNpemUoQ0ZYX1NpemVGJiBzekNhcCk7DQorICBGWF9CT09MIENhbGN1bGF0ZUZpZWxkQXV0b1NpemUoQ0ZYX1NpemVGJiBzaXplKTsNCisgIEZYX0JPT0wgQ2FsY3VsYXRlV2lkZ2V0QXV0b1NpemUoQ0ZYX1NpemVGJiBzaXplKTsNCisgIEZYX0JPT0wgQ2FsY3VsYXRlVGV4dEVkaXRBdXRvU2l6ZShDRlhfU2l6ZUYmIHNpemUpOw0KKyAgRlhfQk9PTCBDYWxjdWxhdGVDaGVja0J1dHRvbkF1dG9TaXplKENGWF9TaXplRiYgc2l6ZSk7DQorICBGWF9CT09MIENhbGN1bGF0ZVB1c2hCdXR0b25BdXRvU2l6ZShDRlhfU2l6ZUYmIHNpemUpOw0KKyAgRlhfQk9PTCBDYWxjdWxhdGVJbWFnZUVkaXRBdXRvU2l6ZShDRlhfU2l6ZUYmIHNpemUpOw0KKyAgRlhfQk9PTCBDYWxjdWxhdGVJbWFnZUF1dG9TaXplKENGWF9TaXplRiYgc2l6ZSk7DQorICBGWF9CT09MIENhbGN1bGF0ZVRleHRBdXRvU2l6ZShDRlhfU2l6ZUYmIHNpemUpOw0KKyAgRlhfRkxPQVQgQ2FsY3VsYXRlV2lkZ2V0QXV0b0hlaWdodChGWF9GTE9BVCBmSGVpZ2h0Q2FsYyk7DQorICBGWF9GTE9BVCBDYWxjdWxhdGVXaWRnZXRBdXRvV2lkdGgoRlhfRkxPQVQgZldpZHRoQ2FsYyk7DQorICBGWF9GTE9BVCBHZXRXaWR0aFdpdGhvdXRNYXJnaW4oRlhfRkxPQVQgZldpZHRoQ2FsYyk7DQorICBGWF9GTE9BVCBHZXRIZWlnaHRXaXRob3V0TWFyZ2luKEZYX0ZMT0FUIGZIZWlnaHRDYWxjKTsNCisgIHZvaWQgQ2FsY3VsYXRlVGV4dENvbnRlbnRTaXplKENGWF9TaXplRiYgc2l6ZSk7DQorICB2b2lkIENhbGN1bGF0ZUFjY1dpZHRoQW5kSGVpZ2h0KFhGQV9FTEVNRU5UIGVVSVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmQ2FsY0hlaWdodCk7DQorICB2b2lkIEluaXRMYXlvdXREYXRhKCk7DQorICB2b2lkIFN0YXJ0VGV4dExheW91dChGWF9GTE9BVCYgZkNhbGNXaWR0aCwgRlhfRkxPQVQmIGZDYWxjSGVpZ2h0KTsNCisgIENYRkFfRkZEb2NWaWV3KiBtX3BEb2NWaWV3Ow0KKyAgQ1hGQV9XaWRnZXRMYXlvdXREYXRhKiBtX3BMYXlvdXREYXRhOw0KKyAgdWludDMyX3QgbV9uUmVjdXJzaW9uRGVwdGg7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvaW5jbHVkZS9meGdyYXBoaWNzL2Z4X2dyYXBoaWNzLmggYi94ZmEvaW5jbHVkZS9meGdyYXBoaWNzL2Z4X2dyYXBoaWNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEzMWY0NQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9pbmNsdWRlL2Z4Z3JhcGhpY3MvZnhfZ3JhcGhpY3MuaApAQCAtMCwwICsxLDUwMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIFhGQV9JTkNMVURFX0ZYR1JBUEhJQ1NfRlhfR1JBUEhJQ1NfSF8NCisjZGVmaW5lIFhGQV9JTkNMVURFX0ZYR1JBUEhJQ1NfRlhfR1JBUEhJQ1NfSF8NCisNCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2ZwZGZhcGkvZnBkZl9wYWdlb2JqLmgiDQorDQordHlwZWRlZiBpbnQgRlhfRVJSOw0KKyNkZWZpbmUgRlhfRVJSX1N1Y2NlZWRlZCAwDQorI2RlZmluZSBGWF9FUlJfSW5kZWZpbml0ZSAtMQ0KKyNkZWZpbmUgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkIC0xMDANCisjZGVmaW5lIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkIC0yMDANCisjZGVmaW5lIEZYX0VSUl9JbnRlcm1lZGlhdGVfVmFsdWVfSW52YWxpZCAtMzAwDQorI2RlZmluZSBGWF9FUlJfTWV0aG9kX05vdF9TdXBwb3J0ZWQgLTQwMA0KKyNkZWZpbmUgRlhfRVJSX091dF9PZl9NZW1vcnkgLTUwMA0KKyNkZWZpbmUgX0ZYX1JFVFVSTl9JRl9GQUlMKGFyZykgXA0KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICBpZiAoIShhcmcpKSAgICAgICAgICAgICAgICAgXA0KKyAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgXA0KKyAgfQ0KKyNkZWZpbmUgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGFyZywgdmFsKSBcDQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgaWYgKCEoYXJnKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICAgIHJldHVybiB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICB9DQorI2RlZmluZSBfRlhfR09UT19QT1NJVElPTl9JRl9GQUlMKGFyZywgcG9zKSBcDQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgIGlmICghKGFyZykpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgICAgZ290byBwb3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICB9DQorI2RlZmluZSBfRlhfRVJSX0NIRUNLX1JFVFVSTl9JRl9GQUlMKGFyZykgXA0KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgaWYgKChhcmcpICE9IEZYX0VSUl9TdWNjZWVkZWQpICAgICAgICBcDQorICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgfQ0KKyNkZWZpbmUgX0ZYX0VSUl9DSEVDS19SRVRVUk5fVkFMVUVfSUZfRkFJTChhcmcsIHZhbCkgXA0KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICBpZiAoKGFyZykgIT0gRlhfRVJSX1N1Y2NlZWRlZCkgICAgICAgICAgICAgICAgICAgXA0KKyAgICAgIHJldHVybiB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgfQ0KKyNkZWZpbmUgX0ZYX0VSUl9DSEVDS19HT1RPX1BPU0lUSU9OX0lGX0ZBSUwoYXJnLCBwb3MpIFwNCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgIGlmICgoYXJnKSAhPSBGWF9FUlJfU3VjY2VlZGVkKSAgICAgICAgICAgICAgICAgICAgXA0KKyAgICAgIGdvdG8gcG9zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgIH0NCisNCisjZGVmaW5lIEZYX1NIQURJTkdfU3RlcHMgMjU2DQordHlwZWRlZiBpbnQzMl90IEZYX0Rhc2hTdHlsZTsNCitlbnVtIHsNCisgIEZYX0RBU0hTVFlMRV9Tb2xpZCA9IDAsDQorICBGWF9EQVNIU1RZTEVfRGFzaCA9IDEsDQorICBGWF9EQVNIU1RZTEVfRG90ID0gMiwNCisgIEZYX0RBU0hTVFlMRV9EYXNoRG90ID0gMywNCisgIEZYX0RBU0hTVFlMRV9EYXNoRG90RG90ID0gNA0KK307DQordHlwZWRlZiBpbnQzMl90IEZYX1N0cm9rZUFsaWdubWVudDsNCitlbnVtIHsNCisgIEZYX1NUUk9LRUFMSUdOTUVOVF9DZW50ZXIgPSAwLA0KKyAgRlhfU1RST0tFQUxJR05NRU5UX0luc2V0ID0gMSwNCisgIEZYX1NUUk9LRUFMSUdOTUVOVF9PdXRzZXQgPSAyLA0KKyAgRlhfU1RST0tFQUxJR05NRU5UX0xlZnQgPSAzLA0KKyAgRlhfU1RST0tFQUxJR05NRU5UX1JpZ2h0ID0gNA0KK307DQordHlwZWRlZiBpbnQzMl90IEZYX0hhdGNoU3R5bGU7DQorZW51bSB7DQorICBGWF9IQVRDSFNUWUxFX0hvcml6b250YWwgPSAwLA0KKyAgRlhfSEFUQ0hTVFlMRV9WZXJ0aWNhbCA9IDEsDQorICBGWF9IQVRDSFNUWUxFX0ZvcndhcmREaWFnb25hbCA9IDIsDQorICBGWF9IQVRDSFNUWUxFX0JhY2t3YXJkRGlhZ29uYWwgPSAzLA0KKyAgRlhfSEFUQ0hTVFlMRV9Dcm9zcyA9IDQsDQorICBGWF9IQVRDSFNUWUxFX0RpYWdvbmFsQ3Jvc3MgPSA1LA0KKyAgRlhfSEFUQ0hTVFlMRV8wNVBlcmNlbnQgPSA2LA0KKyAgRlhfSEFUQ0hTVFlMRV8xMFBlcmNlbnQgPSA3LA0KKyAgRlhfSEFUQ0hTVFlMRV8yMFBlcmNlbnQgPSA4LA0KKyAgRlhfSEFUQ0hTVFlMRV8yNVBlcmNlbnQgPSA5LA0KKyAgRlhfSEFUQ0hTVFlMRV8zMFBlcmNlbnQgPSAxMCwNCisgIEZYX0hBVENIU1RZTEVfNDBQZXJjZW50ID0gMTEsDQorICBGWF9IQVRDSFNUWUxFXzUwUGVyY2VudCA9IDEyLA0KKyAgRlhfSEFUQ0hTVFlMRV82MFBlcmNlbnQgPSAxMywNCisgIEZYX0hBVENIU1RZTEVfNzBQZXJjZW50ID0gMTQsDQorICBGWF9IQVRDSFNUWUxFXzc1UGVyY2VudCA9IDE1LA0KKyAgRlhfSEFUQ0hTVFlMRV84MFBlcmNlbnQgPSAxNiwNCisgIEZYX0hBVENIU1RZTEVfOTBQZXJjZW50ID0gMTcsDQorICBGWF9IQVRDSFNUWUxFX0xpZ2h0RG93bndhcmREaWFnb25hbCA9IDE4LA0KKyAgRlhfSEFUQ0hTVFlMRV9MaWdodFVwd2FyZERpYWdvbmFsID0gMTksDQorICBGWF9IQVRDSFNUWUxFX0RhcmtEb3dud2FyZERpYWdvbmFsID0gMjAsDQorICBGWF9IQVRDSFNUWUxFX0RhcmtVcHdhcmREaWFnb25hbCA9IDIxLA0KKyAgRlhfSEFUQ0hTVFlMRV9XaWRlRG93bndhcmREaWFnb25hbCA9IDIyLA0KKyAgRlhfSEFUQ0hTVFlMRV9XaWRlVXB3YXJkRGlhZ29uYWwgPSAyMywNCisgIEZYX0hBVENIU1RZTEVfTGlnaHRWZXJ0aWNhbCA9IDI0LA0KKyAgRlhfSEFUQ0hTVFlMRV9MaWdodEhvcml6b250YWwgPSAyNSwNCisgIEZYX0hBVENIU1RZTEVfTmFycm93VmVydGljYWwgPSAyNiwNCisgIEZYX0hBVENIU1RZTEVfTmFycm93SG9yaXpvbnRhbCA9IDI3LA0KKyAgRlhfSEFUQ0hTVFlMRV9EYXJrVmVydGljYWwgPSAyOCwNCisgIEZYX0hBVENIU1RZTEVfRGFya0hvcml6b250YWwgPSAyOSwNCisgIEZYX0hBVENIU1RZTEVfRGFzaGVkRG93bndhcmREaWFnb25hbCA9IDMwLA0KKyAgRlhfSEFUQ0hTVFlMRV9EYXNoZWRVcHdhcmREaWFnb25hbCA9IDMxLA0KKyAgRlhfSEFUQ0hTVFlMRV9EYXNoZWRIb3Jpem9udGFsID0gMzIsDQorICBGWF9IQVRDSFNUWUxFX0Rhc2hlZFZlcnRpY2FsID0gMzMsDQorICBGWF9IQVRDSFNUWUxFX1NtYWxsQ29uZmV0dGkgPSAzNCwNCisgIEZYX0hBVENIU1RZTEVfTGFyZ2VDb25mZXR0aSA9IDM1LA0KKyAgRlhfSEFUQ0hTVFlMRV9aaWdaYWcgPSAzNiwNCisgIEZYX0hBVENIU1RZTEVfV2F2ZSA9IDM3LA0KKyAgRlhfSEFUQ0hTVFlMRV9EaWFnb25hbEJyaWNrID0gMzgsDQorICBGWF9IQVRDSFNUWUxFX0hvcml6b250YWxCcmljayA9IDM5LA0KKyAgRlhfSEFUQ0hTVFlMRV9XZWF2ZSA9IDQwLA0KKyAgRlhfSEFUQ0hTVFlMRV9QbGFpZCA9IDQxLA0KKyAgRlhfSEFUQ0hTVFlMRV9EaXZvdCA9IDQyLA0KKyAgRlhfSEFUQ0hTVFlMRV9Eb3R0ZWRHcmlkID0gNDMsDQorICBGWF9IQVRDSFNUWUxFX0RvdHRlZERpYW1vbmQgPSA0NCwNCisgIEZYX0hBVENIU1RZTEVfU2hpbmdsZSA9IDQ1LA0KKyAgRlhfSEFUQ0hTVFlMRV9UcmVsbGlzID0gNDYsDQorICBGWF9IQVRDSFNUWUxFX1NwaGVyZSA9IDQ3LA0KKyAgRlhfSEFUQ0hTVFlMRV9TbWFsbEdyaWQgPSA0OCwNCisgIEZYX0hBVENIU1RZTEVfU21hbGxDaGVja2VyQm9hcmQgPSA0OSwNCisgIEZYX0hBVENIU1RZTEVfTGFyZ2VDaGVja2VyQm9hcmQgPSA1MCwNCisgIEZYX0hBVENIU1RZTEVfT3V0bGluZWREaWFtb25kID0gNTEsDQorICBGWF9IQVRDSFNUWUxFX1NvbGlkRGlhbW9uZCA9IDUyDQorfTsNCit0eXBlZGVmIGludDMyX3QgRlhfRGV2aWNlQ2FwOw0KK3R5cGVkZWYgaW50MzJfdCBGWF9GaWxsTW9kZTsNCitjbGFzcyBDRlhfUmVuZGVyRGV2aWNlOw0KK2NsYXNzIENGWF9HcmFwaFN0YXRlRGF0YTsNCitjbGFzcyBDRlhfTWF0cml4Ow0KK2NsYXNzIENGWF9ESUJTb3VyY2U7DQorY2xhc3MgQ0ZYX0RJQml0bWFwOw0KK2NsYXNzIENGWF9Gb250Ow0KK2NsYXNzIENGWF9XaWRlU3RyaW5nOw0KK2NsYXNzIElGWF9GaWxlUmVhZDsNCitjbGFzcyBDRlhfUGF0aEdlbmVyYXRvcjsNCitjbGFzcyBDQUdHX0dyYXBoaWNzOw0KK2NsYXNzIENGWF9HcmFwaGljczsNCitjbGFzcyBDRlhfQ29sb3I7DQorY2xhc3MgQ0ZYX1BhdGg7DQorY2xhc3MgQ0ZYX1BhdHRlcm47DQorY2xhc3MgQ0ZYX1NoYWRpbmc7DQorY2xhc3MgQ0ZYX0dyYXBoaWNzIHsNCisgcHVibGljOg0KKyAgQ0ZYX0dyYXBoaWNzKCk7DQorDQorICBGWF9FUlIgQ3JlYXRlKENGWF9SZW5kZXJEZXZpY2UqIHJlbmRlckRldmljZSwgRlhfQk9PTCBpc0FudGlhbGlhc2luZyA9IFRSVUUpOw0KKw0KKyAgRlhfRVJSIENyZWF0ZShpbnQzMl90IHdpZHRoLA0KKyAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwNCisgICAgICAgICAgICAgICAgRlhESUJfRm9ybWF0IGZvcm1hdCwNCisgICAgICAgICAgICAgICAgRlhfQk9PTCBpc05hdGl2ZSA9IFRSVUUsDQorICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNBbnRpYWxpYXNpbmcgPSBUUlVFKTsNCisNCisgIHZpcnR1YWwgfkNGWF9HcmFwaGljcygpOw0KKw0KKyAgRlhfRVJSIEdldERldmljZUNhcChjb25zdCBpbnQzMl90IGNhcElELCBGWF9EZXZpY2VDYXAmIGNhcFZhbCk7DQorICBGWF9FUlIgSXNQcmludGVyRGV2aWNlKEZYX0JPT0wmIGlzUHJpbnRlcik7DQorICBGWF9FUlIgRW5hYmxlQW50aWFsaWFzaW5nKEZYX0JPT0wgaXNBbnRpYWxpYXNpbmcpOw0KKw0KKyAgRlhfRVJSIFNhdmVHcmFwaFN0YXRlKCk7DQorDQorICBGWF9FUlIgUmVzdG9yZUdyYXBoU3RhdGUoKTsNCisNCisgIEZYX0VSUiBHZXRMaW5lQ2FwKENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcCYgbGluZUNhcCk7DQorDQorICBGWF9FUlIgU2V0TGluZUNhcChDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXAgbGluZUNhcCk7DQorDQorICBGWF9FUlIgR2V0RGFzaENvdW50KGludDMyX3QmIGRhc2hDb3VudCk7DQorDQorICBGWF9FUlIgR2V0TGluZURhc2goRlhfRkxPQVQmIGRhc2hQaGFzZSwgRlhfRkxPQVQqIGRhc2hBcnJheSk7DQorDQorICBGWF9FUlIgU2V0TGluZURhc2goRlhfRkxPQVQgZGFzaFBoYXNlLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBkYXNoQXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXNoQ291bnQpOw0KKw0KKyAgRlhfRVJSIFNldExpbmVEYXNoKEZYX0Rhc2hTdHlsZSBkYXNoU3R5bGUpOw0KKw0KKyAgRlhfRVJSIEdldExpbmVKb2luKENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUpvaW4mIGxpbmVKb2luKTsNCisNCisgIEZYX0VSUiBTZXRMaW5lSm9pbihDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luIGxpbmVKb2luKTsNCisNCisgIEZYX0VSUiBHZXRNaXRlckxpbWl0KEZYX0ZMT0FUJiBtaXRlckxpbWl0KTsNCisNCisgIEZYX0VSUiBTZXRNaXRlckxpbWl0KEZYX0ZMT0FUIG1pdGVyTGltaXQpOw0KKw0KKyAgRlhfRVJSIEdldExpbmVXaWR0aChGWF9GTE9BVCYgbGluZVdpZHRoKTsNCisNCisgIEZYX0VSUiBTZXRMaW5lV2lkdGgoRlhfRkxPQVQgbGluZVdpZHRoLCBGWF9CT09MIGlzQWN0T25EYXNoID0gRkFMU0UpOw0KKw0KKyAgRlhfRVJSIEdldFN0cm9rZUFsaWdubWVudChGWF9TdHJva2VBbGlnbm1lbnQmIHN0cm9rZUFsaWdubWVudCk7DQorDQorICBGWF9FUlIgU2V0U3Ryb2tlQWxpZ25tZW50KEZYX1N0cm9rZUFsaWdubWVudCBzdHJva2VBbGlnbm1lbnQpOw0KKw0KKyAgRlhfRVJSIFNldFN0cm9rZUNvbG9yKENGWF9Db2xvciogY29sb3IpOw0KKw0KKyAgRlhfRVJSIFNldEZpbGxDb2xvcihDRlhfQ29sb3IqIGNvbG9yKTsNCisNCisgIEZYX0VSUiBTdHJva2VQYXRoKENGWF9QYXRoKiBwYXRoLCBDRlhfTWF0cml4KiBtYXRyaXggPSBOVUxMKTsNCisNCisgIEZYX0VSUiBGaWxsUGF0aChDRlhfUGF0aCogcGF0aCwNCisgICAgICAgICAgICAgICAgICBGWF9GaWxsTW9kZSBmaWxsTW9kZSA9IEZYRklMTF9XSU5ESU5HLA0KKyAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCA9IE5VTEwpOw0KKw0KKyAgRlhfRVJSIENsaXBQYXRoKENGWF9QYXRoKiBwYXRoLA0KKyAgICAgICAgICAgICAgICAgIEZYX0ZpbGxNb2RlIGZpbGxNb2RlID0gRlhGSUxMX1dJTkRJTkcsDQorICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4ID0gTlVMTCk7DQorDQorICBGWF9FUlIgRHJhd0ltYWdlKENGWF9ESUJTb3VyY2UqIHNvdXJjZSwNCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsDQorICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCA9IE5VTEwpOw0KKw0KKyAgRlhfRVJSIFN0cmV0Y2hJbWFnZShDRlhfRElCU291cmNlKiBzb3VyY2UsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4ID0gTlVMTCk7DQorDQorICBGWF9FUlIgQ29uY2F0TWF0cml4KGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCk7DQorDQorICBDRlhfTWF0cml4KiBHZXRNYXRyaXgoKTsNCisNCisgIEZYX0VSUiBHZXRDbGlwUmVjdChDRlhfUmVjdEYmIHJlY3QpOw0KKw0KKyAgRlhfRVJSIFNldENsaXBSZWN0KGNvbnN0IENGWF9SZWN0RiYgcmVjdCk7DQorDQorICBGWF9FUlIgQ2xlYXJDbGlwKCk7DQorDQorICBGWF9FUlIgU2V0Rm9udChDRlhfRm9udCogZm9udCk7DQorDQorICBGWF9FUlIgU2V0Rm9udFNpemUoY29uc3QgRlhfRkxPQVQgc2l6ZSk7DQorDQorICBGWF9FUlIgU2V0Rm9udEhTY2FsZShjb25zdCBGWF9GTE9BVCBzY2FsZSk7DQorDQorICBGWF9FUlIgU2V0Q2hhclNwYWNpbmcoY29uc3QgRlhfRkxPQVQgc3BhY2luZyk7DQorDQorICBGWF9FUlIgU2V0VGV4dERyYXdpbmdNb2RlKGNvbnN0IGludDMyX3QgbW9kZSk7DQorDQorICBGWF9FUlIgU2hvd1RleHQoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsDQorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHRleHQsDQorICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4ID0gTlVMTCk7DQorDQorICBGWF9FUlIgQ2FsY1RleHRSZWN0KENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHRleHQsDQorICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNNdWx0aWxpbmUgPSBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4ID0gTlVMTCk7DQorDQorICBGWF9FUlIgVHJhbnNmZXIoQ0ZYX0dyYXBoaWNzKiBncmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4KTsNCisgIEZYX0VSUiBUcmFuc2ZlcihDRlhfR3JhcGhpY3MqIGdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHNyY0xlZnQsDQorICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3JjVG9wLA0KKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgZHN0UmVjdCwNCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgpOw0KKw0KKyAgQ0ZYX1JlbmRlckRldmljZSogR2V0UmVuZGVyRGV2aWNlKCk7DQorDQorICBGWF9FUlIgSW52ZXJzZVJlY3QoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KTsNCisgIEZYX0VSUiBYb3JESUJpdG1hcChjb25zdCBDRlhfRElCaXRtYXAqIHNyY0JpdG1hcCwgY29uc3QgQ0ZYX1JlY3RGJiByZWN0KTsNCisgIEZYX0VSUiBFcXZESUJpdG1hcChjb25zdCBDRlhfRElCaXRtYXAqIHNyY0JpdG1hcCwgY29uc3QgQ0ZYX1JlY3RGJiByZWN0KTsNCisNCisgcHJpdmF0ZToNCisgIEZYX0VSUiBSZW5kZXJEZXZpY2VTZXRMaW5lRGFzaChGWF9EYXNoU3R5bGUgZGFzaFN0eWxlKTsNCisNCisgIEZYX0VSUiBSZW5kZXJEZXZpY2VTdHJva2VQYXRoKENGWF9QYXRoKiBwYXRoLCBDRlhfTWF0cml4KiBtYXRyaXgpOw0KKw0KKyAgRlhfRVJSIFJlbmRlckRldmljZUZpbGxQYXRoKENGWF9QYXRoKiBwYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZpbGxNb2RlIGZpbGxNb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCk7DQorDQorICBGWF9FUlIgUmVuZGVyRGV2aWNlRHJhd0ltYWdlKENGWF9ESUJTb3VyY2UqIHNvdXJjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCk7DQorDQorICBGWF9FUlIgUmVuZGVyRGV2aWNlU3RyZXRjaEltYWdlKENGWF9ESUJTb3VyY2UqIHNvdXJjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBtYXRyaXgpOw0KKw0KKyAgRlhfRVJSIFJlbmRlckRldmljZVNob3dUZXh0KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB0ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCk7DQorDQorICBGWF9FUlIgU3Ryb2tlUGF0aFdpdGhQYXR0ZXJuKENGWF9QYXRoKiBwYXRoLCBDRlhfTWF0cml4KiBtYXRyaXgpOw0KKw0KKyAgRlhfRVJSIFN0cm9rZVBhdGhXaXRoU2hhZGluZyhDRlhfUGF0aCogcGF0aCwgQ0ZYX01hdHJpeCogbWF0cml4KTsNCisNCisgIEZYX0VSUiBGaWxsUGF0aFdpdGhQYXR0ZXJuKENGWF9QYXRoKiBwYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRmlsbE1vZGUgZmlsbE1vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBtYXRyaXgpOw0KKw0KKyAgRlhfRVJSIEZpbGxQYXRoV2l0aFNoYWRpbmcoQ0ZYX1BhdGgqIHBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GaWxsTW9kZSBmaWxsTW9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCk7DQorICBGWF9FUlIgU2V0RElCaXRzV2l0aE1hdHJpeChDRlhfRElCU291cmNlKiBzb3VyY2UsIENGWF9NYXRyaXgqIG1hdHJpeCk7DQorICBGWF9FUlIgQ2FsY1RleHRJbmZvKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB0ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogY2hhckNvZGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyogY2hhclBvcywNCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiByZWN0KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgaW50MzJfdCBfdHlwZTsNCisNCisgcHJpdmF0ZToNCisgIHN0cnVjdCBUSW5mbyB7DQorICAgIENGWF9HcmFwaFN0YXRlRGF0YSBfZ3JhcGhTdGF0ZTsNCisgICAgRlhfQk9PTCBfaXNBbnRpYWxpYXNpbmc7DQorICAgIEZYX1N0cm9rZUFsaWdubWVudCBfc3Ryb2tlQWxpZ25tZW50Ow0KKyAgICBDRlhfTWF0cml4IF9DVE07DQorICAgIEZYX0JPT0wgX2lzQWN0T25EYXNoOw0KKyAgICBDRlhfQ29sb3IqIF9zdHJva2VDb2xvcjsNCisgICAgQ0ZYX0NvbG9yKiBfZmlsbENvbG9yOw0KKyAgICBDRlhfRm9udCogX2ZvbnQ7DQorICAgIEZYX0ZMT0FUIF9mb250U2l6ZTsNCisgICAgRlhfRkxPQVQgX2ZvbnRIU2NhbGU7DQorICAgIEZYX0ZMT0FUIF9mb250U3BhY2luZzsNCisgIH0gX2luZm87DQorICBDRlhfUmVuZGVyRGV2aWNlKiBfcmVuZGVyRGV2aWNlOw0KKyAgQ0ZYX1B0ckFycmF5IF9pbmZvU3RhY2s7DQorICBDQUdHX0dyYXBoaWNzKiBfYWdnR3JhcGhpY3M7DQorICBmcmllbmQgY2xhc3MgQ0FHR19HcmFwaGljczsNCit9Ow0KK2NsYXNzIENGWF9QYXRoIHsNCisgcHVibGljOg0KKyAgQ0ZYX1BhdGgoKTsNCisNCisgIEZYX0VSUiBDcmVhdGUoKTsNCisNCisgIHZpcnR1YWwgfkNGWF9QYXRoKCk7DQorDQorICBGWF9FUlIgTW92ZVRvKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpOw0KKw0KKyAgRlhfRVJSIExpbmVUbyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KTsNCisNCisgIEZYX0VSUiBCZXppZXJUbyhGWF9GTE9BVCBjdHJsWDEsDQorICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybFkxLA0KKyAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGN0cmxYMiwNCisgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjdHJsWTIsDQorICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9YLA0KKyAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRvWSk7DQorDQorICBGWF9FUlIgQXJjVG8oRlhfRkxPQVQgbGVmdCwNCisgICAgICAgICAgICAgICBGWF9GTE9BVCB0b3AsDQorICAgICAgICAgICAgICAgRlhfRkxPQVQgd2lkdGgsDQorICAgICAgICAgICAgICAgRlhfRkxPQVQgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsDQorICAgICAgICAgICAgICAgRlhfRkxPQVQgc3dlZXBBbmdsZSk7DQorDQorICBGWF9FUlIgQ2xvc2UoKTsNCisNCisgIEZYX0VSUiBBZGRMaW5lKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyKTsNCisNCisgIEZYX0VSUiBBZGRCZXppZXIoRlhfRkxPQVQgc3RhcnRYLA0KKyAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzdGFydFksDQorICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGN0cmxYMSwNCisgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybFkxLA0KKyAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjdHJsWDIsDQorICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGN0cmxZMiwNCisgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZW5kWCwNCisgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZW5kWSk7DQorDQorICBGWF9FUlIgQWRkUmVjdGFuZ2xlKEZYX0ZMT0FUIGxlZnQsDQorICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRvcCwNCisgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGhlaWdodCk7DQorDQorICBGWF9FUlIgQWRkRWxsaXBzZShGWF9GTE9BVCBsZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9wLA0KKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoZWlnaHQpOw0KKw0KKyAgRlhfRVJSIEFkZEVsbGlwc2UoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KTsNCisNCisgIEZYX0VSUiBBZGRBcmMoRlhfRkxPQVQgbGVmdCwNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9wLA0KKyAgICAgICAgICAgICAgICBGWF9GTE9BVCB3aWR0aCwNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICBGWF9GTE9BVCBzdGFydEFuZ2xlLA0KKyAgICAgICAgICAgICAgICBGWF9GTE9BVCBzd2VlcEFuZ2xlKTsNCisNCisgIEZYX0VSUiBBZGRQaWUoRlhfRkxPQVQgbGVmdCwNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9wLA0KKyAgICAgICAgICAgICAgICBGWF9GTE9BVCB3aWR0aCwNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICBGWF9GTE9BVCBzdGFydEFuZ2xlLA0KKyAgICAgICAgICAgICAgICBGWF9GTE9BVCBzd2VlcEFuZ2xlKTsNCisNCisgIEZYX0VSUiBBZGRTdWJwYXRoKENGWF9QYXRoKiBwYXRoKTsNCisNCisgIEZYX0VSUiBDbGVhcigpOw0KKw0KKyAgRlhfQk9PTCBJc0VtcHR5KCk7DQorDQorICBDRlhfUGF0aERhdGEqIEdldFBhdGhEYXRhKCk7DQorDQorIHByaXZhdGU6DQorICBDRlhfUGF0aEdlbmVyYXRvciogX2dlbmVyYXRvcjsNCit9Ow0KK2NsYXNzIENGWF9Db2xvciB7DQorIHB1YmxpYzoNCisgIENGWF9Db2xvcigpOw0KKw0KKyAgQ0ZYX0NvbG9yKGNvbnN0IEZYX0FSR0IgYXJnYik7DQorDQorICBDRlhfQ29sb3IoQ0ZYX1BhdHRlcm4qIHBhdHRlcm4sIGNvbnN0IEZYX0FSR0IgYXJnYiA9IDB4MCk7DQorDQorICBDRlhfQ29sb3IoQ0ZYX1NoYWRpbmcqIHNoYWRpbmcpOw0KKw0KKyAgdmlydHVhbCB+Q0ZYX0NvbG9yKCk7DQorDQorICBGWF9FUlIgU2V0KGNvbnN0IEZYX0FSR0IgYXJnYik7DQorDQorICBGWF9FUlIgU2V0KENGWF9QYXR0ZXJuKiBwYXR0ZXJuLCBjb25zdCBGWF9BUkdCIGFyZ2IgPSAweDApOw0KKw0KKyAgRlhfRVJSIFNldChDRlhfU2hhZGluZyogc2hhZGluZyk7DQorDQorIHByaXZhdGU6DQorICBpbnQzMl90IF90eXBlOw0KKyAgdW5pb24gew0KKyAgICBzdHJ1Y3Qgew0KKyAgICAgIEZYX0FSR0IgX2FyZ2I7DQorICAgICAgQ0ZYX1BhdHRlcm4qIF9wYXR0ZXJuOw0KKyAgICB9Ow0KKyAgICBDRlhfU2hhZGluZyogX3NoYWRpbmc7DQorICB9Ow0KKw0KKyAgZnJpZW5kIGNsYXNzIENGWF9HcmFwaGljczsNCit9Ow0KK2NsYXNzIENGWF9QYXR0ZXJuIHsNCisgcHVibGljOg0KKyAgQ0ZYX1BhdHRlcm4oKTsNCisNCisgIEZYX0VSUiBDcmVhdGUoQ0ZYX0RJQml0bWFwKiBiaXRtYXAsDQorICAgICAgICAgICAgICAgIGNvbnN0IEZYX0ZMT0FUIHhTdGVwLA0KKyAgICAgICAgICAgICAgICBjb25zdCBGWF9GTE9BVCB5U3RlcCwNCisgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4ID0gTlVMTCk7DQorDQorICBGWF9FUlIgQ3JlYXRlKEZYX0hhdGNoU3R5bGUgaGF0Y2hTdHlsZSwNCisgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQiBmb3JlQXJnYiwNCisgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQiBiYWNrQXJnYiwNCisgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4ID0gTlVMTCk7DQorDQorICB2aXJ0dWFsIH5DRlhfUGF0dGVybigpOw0KKw0KKyBwcml2YXRlOg0KKyAgaW50MzJfdCBfdHlwZTsNCisgIENGWF9NYXRyaXggX21hdHJpeDsNCisgIHVuaW9uIHsNCisgICAgc3RydWN0IHsNCisgICAgICBDRlhfUmVjdEYgX3JlY3Q7DQorICAgICAgRlhfRkxPQVQgX3hTdGVwOw0KKyAgICAgIEZYX0ZMT0FUIF95U3RlcDsNCisgICAgICBGWF9CT09MIF9pc0NvbG9yZWQ7DQorICAgIH07DQorICAgIHN0cnVjdCB7DQorICAgICAgQ0ZYX0RJQml0bWFwKiBfYml0bWFwOw0KKyAgICAgIEZYX0ZMT0FUIF94MVN0ZXA7DQorICAgICAgRlhfRkxPQVQgX3kxU3RlcDsNCisgICAgfTsNCisgICAgc3RydWN0IHsNCisgICAgICBGWF9IYXRjaFN0eWxlIF9oYXRjaFN0eWxlOw0KKyAgICAgIEZYX0FSR0IgX2ZvcmVBcmdiOw0KKyAgICAgIEZYX0FSR0IgX2JhY2tBcmdiOw0KKyAgICB9Ow0KKyAgfTsNCisgIGZyaWVuZCBjbGFzcyBDRlhfR3JhcGhpY3M7DQorfTsNCitjbGFzcyBDRlhfU2hhZGluZyB7DQorIHB1YmxpYzoNCisgIENGWF9TaGFkaW5nKCk7DQorDQorICBGWF9FUlIgQ3JlYXRlQXhpYWwoY29uc3QgQ0ZYX1BvaW50RiYgYmVnaW5Qb2ludCwNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBlbmRQb2ludCwNCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzRXh0ZW5kZWRCZWdpbiwNCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzRXh0ZW5kZWRFbmQsDQorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQiBiZWdpbkFyZ2IsDQorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQiBlbmRBcmdiKTsNCisNCisgIEZYX0VSUiBDcmVhdGVSYWRpYWwoY29uc3QgQ0ZYX1BvaW50RiYgYmVnaW5Qb2ludCwNCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgZW5kUG9pbnQsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0ZMT0FUIGJlZ2luUmFkaXVzLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9GTE9BVCBlbmRSYWRpdXMsDQorICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNFeHRlbmRlZEJlZ2luLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzRXh0ZW5kZWRFbmQsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0IgYmVnaW5BcmdiLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9BUkdCIGVuZEFyZ2IpOw0KKw0KKyAgdmlydHVhbCB+Q0ZYX1NoYWRpbmcoKTsNCisNCisgcHJpdmF0ZToNCisgIEZYX0VSUiBJbml0QXJnYkFycmF5KCk7DQorDQorIHByaXZhdGU6DQorICBpbnQzMl90IF90eXBlOw0KKyAgQ0ZYX1BvaW50RiBfYmVnaW5Qb2ludDsNCisgIENGWF9Qb2ludEYgX2VuZFBvaW50Ow0KKyAgRlhfRkxPQVQgX2JlZ2luUmFkaXVzOw0KKyAgRlhfRkxPQVQgX2VuZFJhZGl1czsNCisgIEZYX0JPT0wgX2lzRXh0ZW5kZWRCZWdpbjsNCisgIEZYX0JPT0wgX2lzRXh0ZW5kZWRFbmQ7DQorICBGWF9BUkdCIF9iZWdpbkFyZ2I7DQorICBGWF9BUkdCIF9lbmRBcmdiOw0KKyAgRlhfQVJHQiBfYXJnYkFycmF5W0ZYX1NIQURJTkdfU3RlcHNdOw0KKyAgZnJpZW5kIGNsYXNzIENGWF9HcmFwaGljczsNCit9Ow0KKw0KKyNlbmRpZiAgLy8gWEZBX0lOQ0xVREVfRlhHUkFQSElDU19GWF9HUkFQSElDU19IXw0KZGlmZiAtLWdpdCBhL3hmYS9pbmNsdWRlL2Z4anNlL2Z4anNlLmggYi94ZmEvaW5jbHVkZS9meGpzZS9meGpzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYTU2M2EKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvaW5jbHVkZS9meGpzZS9meGpzZS5oCkBAIC0wLDAgKzEsMTc2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgWEZBX0lOQ0xVREVfRlhKU0VfRlhKU0VfSF8NCisjZGVmaW5lIFhGQV9JTkNMVURFX0ZYSlNFX0ZYSlNFX0hfDQorDQorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9mcGRmYXBpL2ZwZGZfcGFyc2VyLmgiDQorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zdHJpbmcuaCINCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N5c3RlbS5oIg0KKw0KK2NsYXNzIENQREZEb2NfRW52aXJvbm1lbnQ7DQorY2xhc3MgQ1BERl9QYWdlOw0KKw0KK3R5cGVkZWYgc3RydWN0IEZYSlNFX0hSVU5USU1FXyB7IHZvaWQqIHBEYXRhOyB9ICogRlhKU0VfSFJVTlRJTUU7DQordHlwZWRlZiBzdHJ1Y3QgRlhKU0VfSENPTlRFWFRfIHsgdm9pZCogcERhdGE7IH0gKiBGWEpTRV9IQ09OVEVYVDsNCit0eXBlZGVmIHN0cnVjdCBGWEpTRV9IQ0xBU1NfIHsgdm9pZCogcERhdGE7IH0gKiBGWEpTRV9IQ0xBU1M7DQordHlwZWRlZiBzdHJ1Y3QgRlhKU0VfSFZBTFVFXyB7IHZvaWQqIHBEYXRhOyB9ICogRlhKU0VfSFZBTFVFOw0KK3R5cGVkZWYgc3RydWN0IEZYSlNFX0hPQkpFQ1RfIDogcHVibGljIEZYSlNFX0hWQUxVRV97fSAqIEZYSlNFX0hPQkpFQ1Q7DQorDQordHlwZWRlZiBkb3VibGUgRlhKU0VfRE9VQkxFOw0KK3ZvaWQgRlhKU0VfSW5pdGlhbGl6ZSgpOw0KK3ZvaWQgRlhKU0VfRmluYWxpemUoKTsNCitGWEpTRV9IUlVOVElNRSBGWEpTRV9SdW50aW1lX0NyZWF0ZSgpOw0KK3ZvaWQgRlhKU0VfUnVudGltZV9SZWxlYXNlKEZYSlNFX0hSVU5USU1FIGhSdW50aW1lKTsNCit0eXBlZGVmIHN0cnVjdCBfRlhKU0VfQ0xBU1MgRlhKU0VfQ0xBU1M7DQorRlhKU0VfSENPTlRFWFQgRlhKU0VfQ29udGV4dF9DcmVhdGUoRlhKU0VfSFJVTlRJTUUgaFJ1bnRpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhKU0VfQ0xBU1MqIGxwR2xvYmFsQ2xhc3MgPSBudWxscHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGxwR2xvYmFsT2JqZWN0ID0gbnVsbHB0cik7DQordm9pZCBGWEpTRV9Db250ZXh0X1JlbGVhc2UoRlhKU0VfSENPTlRFWFQgaENvbnRleHQpOw0KK0ZYSlNFX0hWQUxVRSBGWEpTRV9Db250ZXh0X0dldEdsb2JhbE9iamVjdChGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCk7DQorRlhKU0VfSFJVTlRJTUUgRlhKU0VfQ29udGV4dF9HZXRSdW50aW1lKEZYSlNFX0hDT05URVhUIGhDb250ZXh0KTsNCitlbnVtIEZYSlNFX0NvbXBhdGlibGVNb2RlRmxhZ3Mgew0KKyAgRlhKU0VfQ09NUEFUSUJMRU1PREVGTEFHX0NPTlNUUlVDVE9SRVhUUkFNRVRIT0RTID0gKDEgPDwgMCksDQorICBGWEpTRV9DT01QQVRJQkxFTU9ERUZMQUdDT1VOVCA9IDEsDQorfTsNCit2b2lkIEZYSlNFX0NvbnRleHRfRW5hYmxlQ29tcGF0aWJsZU1vZGUoRlhKU0VfSENPTlRFWFQgaENvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Q29tcGF0aWJsZUZsYWdzKTsNCitjbGFzcyBDRlhKU0VfQXJndW1lbnRzIHsNCisgcHVibGljOg0KKyAgRlhKU0VfSFJVTlRJTUUgR2V0UnVudGltZSgpIGNvbnN0Ow0KKyAgaW50MzJfdCBHZXRMZW5ndGgoKSBjb25zdDsNCisgIEZYSlNFX0hWQUxVRSBHZXRWYWx1ZShpbnQzMl90IGluZGV4KSBjb25zdDsNCisgIEZYX0JPT0wgR2V0Qm9vbGVhbihpbnQzMl90IGluZGV4KSBjb25zdDsNCisgIGludDMyX3QgR2V0SW50MzIoaW50MzJfdCBpbmRleCkgY29uc3Q7DQorICBGWF9GTE9BVCBHZXRGbG9hdChpbnQzMl90IGluZGV4KSBjb25zdDsNCisgIENGWF9CeXRlU3RyaW5nIEdldFVURjhTdHJpbmcoaW50MzJfdCBpbmRleCkgY29uc3Q7DQorICB2b2lkKiBHZXRPYmplY3QoaW50MzJfdCBpbmRleCwgRlhKU0VfSENMQVNTIGhDbGFzcyA9IG51bGxwdHIpIGNvbnN0Ow0KKyAgRlhKU0VfSFZBTFVFIEdldFJldHVyblZhbHVlKCk7DQorfTsNCit0eXBlZGVmIHZvaWQgKCpGWEpTRV9GdW5jQ2FsbGJhY2spKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCit0eXBlZGVmIHZvaWQgKCpGWEpTRV9Qcm9wQWNjZXNzb3IpKEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KK3R5cGVkZWYgaW50MzJfdCAoKkZYSlNFX1Byb3BUeXBlR2V0dGVyKShGWEpTRV9IT0JKRUNUIGhPYmplY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUXVlcnlJbik7DQordHlwZWRlZiBGWF9CT09MICgqRlhKU0VfUHJvcERlbGV0ZXIpKEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lKTsNCit0eXBlZGVmIHN0cnVjdCBfRlhKU0VfRlVOQ1RJT04gew0KKyAgY29uc3QgRlhfQ0hBUiogbmFtZTsNCisgIEZYSlNFX0Z1bmNDYWxsYmFjayBjYWxsYmFja1Byb2M7DQorfSBGWEpTRV9GVU5DVElPTjsNCisjZGVmaW5lIEZYSlNFX0RFRl9GVU5DVElPTihmdW5jdGlvbk5hbWUsIGZ1bmN0aW9uQ2FsbGJhY2spIFwNCisgIHsgZnVuY3Rpb25OYW1lLCBmdW5jdGlvbkNhbGxiYWNrIH0NCit2b2lkIEZYSlNFX0RlZmluZUZ1bmN0aW9ucyhGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWEpTRV9GVU5DVElPTiogbHBGdW5jdGlvbnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5OdW0pOw0KK3R5cGVkZWYgc3RydWN0IF9GWEpTRV9QUk9QRVJUWSB7DQorICBjb25zdCBGWF9DSEFSKiBuYW1lOw0KKyAgRlhKU0VfUHJvcEFjY2Vzc29yIGdldFByb2M7DQorICBGWEpTRV9Qcm9wQWNjZXNzb3Igc2V0UHJvYzsNCit9IEZYSlNFX1BST1BFUlRZOw0KK2VudW0gRlhKU0VfQ2xhc3NQcm9wVHlwZXMgew0KKyAgRlhKU0VfQ2xhc3NQcm9wVHlwZV9Ob25lLA0KKyAgRlhKU0VfQ2xhc3NQcm9wVHlwZV9Qcm9wZXJ0eSwNCisgIEZYSlNFX0NsYXNzUHJvcFR5cGVfTWV0aG9kDQorfTsNCit0eXBlZGVmIHN0cnVjdCBfRlhKU0VfQ0xBU1Mgew0KKyAgY29uc3QgRlhfQ0hBUiogbmFtZTsNCisgIEZYSlNFX0Z1bmNDYWxsYmFjayBjb25zdHJ1Y3RvcjsNCisgIEZYSlNFX1BST1BFUlRZKiBwcm9wZXJ0aWVzOw0KKyAgRlhKU0VfRlVOQ1RJT04qIG1ldGhvZHM7DQorICBpbnQzMl90IHByb3BOdW07DQorICBpbnQzMl90IG1ldGhOdW07DQorICBGWEpTRV9Qcm9wVHlwZUdldHRlciBkeW5Qcm9wVHlwZUdldHRlcjsNCisgIEZYSlNFX1Byb3BBY2Nlc3NvciBkeW5Qcm9wR2V0dGVyOw0KKyAgRlhKU0VfUHJvcEFjY2Vzc29yIGR5blByb3BTZXR0ZXI7DQorICBGWEpTRV9Qcm9wRGVsZXRlciBkeW5Qcm9wRGVsZXRlcjsNCisgIEZYSlNFX0Z1bmNDYWxsYmFjayBkeW5NZXRob2RDYWxsOw0KK30gRlhKU0VfQ0xBU1M7DQorRlhKU0VfSENMQVNTIEZYSlNFX0RlZmluZUNsYXNzKEZYSlNFX0hDT05URVhUIGhDb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzcyk7DQorRlhKU0VfSENMQVNTIEZYSlNFX0dldENsYXNzKEZYSlNFX0hDT05URVhUIGhDb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TmFtZSk7DQorRlhKU0VfSFZBTFVFIEZYSlNFX1ZhbHVlX0NyZWF0ZShGWEpTRV9IUlVOVElNRSBoUnVudGltZSk7DQordm9pZCBGWEpTRV9WYWx1ZV9SZWxlYXNlKEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KK0ZYSlNFX0hSVU5USU1FIEZYSlNFX1ZhbHVlX0dldFJ1bnRpbWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9Jc1VuZGVmaW5lZChGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCitGWF9CT09MIEZYSlNFX1ZhbHVlX0lzTnVsbChGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCitGWF9CT09MIEZYSlNFX1ZhbHVlX0lzQm9vbGVhbihGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCitGWF9CT09MIEZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCitGWF9CT09MIEZYSlNFX1ZhbHVlX0lzTnVtYmVyKEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfSXNJbnRlZ2VyKEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfSXNPYmplY3QoRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9Jc0FycmF5KEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfSXNGdW5jdGlvbihGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCitGWF9CT09MIEZYSlNFX1ZhbHVlX0lzRGF0ZShGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCitGWF9CT09MIEZYSlNFX1ZhbHVlX1RvQm9vbGVhbihGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCitGWF9GTE9BVCBGWEpTRV9WYWx1ZV9Ub0Zsb2F0KEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KK0ZYSlNFX0RPVUJMRSBGWEpTRV9WYWx1ZV9Ub0RvdWJsZShGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCitpbnQzMl90IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCit2b2lkIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhGWEpTRV9IVkFMVUUgaFZhbHVlLCBDRlhfQnl0ZVN0cmluZyYgc3pTdHJPdXRwdXQpOw0KK3ZvaWQqIEZYSlNFX1ZhbHVlX1RvT2JqZWN0KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYSlNFX0hDTEFTUyBoQ2xhc3MpOw0KK3ZvaWQgRlhKU0VfVmFsdWVfU2V0VW5kZWZpbmVkKEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KK3ZvaWQgRlhKU0VfVmFsdWVfU2V0TnVsbChGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCit2b2lkIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhfQk9PTCBiQm9vbGVhbik7DQordm9pZCBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pTdHJpbmcpOw0KK3ZvaWQgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihGWEpTRV9IVkFMVUUgaFZhbHVlLCBpbnQzMl90IG5JbnRlZ2VyKTsNCit2b2lkIEZYSlNFX1ZhbHVlX1NldEZsb2F0KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYX0ZMT0FUIGZGbG9hdCk7DQordm9pZCBGWEpTRV9WYWx1ZV9TZXREb3VibGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhKU0VfRE9VQkxFIGREb3VibGUpOw0KK3ZvaWQgRlhKU0VfVmFsdWVfU2V0T2JqZWN0KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogbHBPYmplY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSENMQVNTIGhDbGFzcyk7DQordm9pZCBGWEpTRV9WYWx1ZV9TZXRBcnJheShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdVZhbHVlQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUqIHJnVmFsdWVzKTsNCit2b2lkIEZYSlNFX1ZhbHVlX1NldERhdGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhKU0VfRE9VQkxFIGREb3VibGUpOw0KK3ZvaWQgRlhKU0VfVmFsdWVfU2V0KEZYSlNFX0hWQUxVRSBoVmFsdWUsIEZYSlNFX0hWQUxVRSBoT3JpZ2luYWxWYWx1ZSk7DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhQcm9wVmFsdWUpOw0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfU2V0T2JqZWN0UHJvcChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoUHJvcFZhbHVlKTsNCitGWF9CT09MIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHVQcm9wSWR4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoUHJvcFZhbHVlKTsNCitGWF9CT09MIEZYSlNFX1ZhbHVlX1NldE9iamVjdFByb3BCeUlkeChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHVQcm9wSWR4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoUHJvcFZhbHVlKTsNCitGWF9CT09MIEZYSlNFX1ZhbHVlX0RlbGV0ZU9iamVjdFByb3AoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lKTsNCitGWF9CT09MIEZYSlNFX1ZhbHVlX09iamVjdEhhc093blByb3AoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVc2VUeXBlR2V0dGVyKTsNCitGWF9CT09MIEZYSlNFX1ZhbHVlX1NldE9iamVjdE93blByb3AoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFByb3BWYWx1ZSk7DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9DYWxsRnVuY3Rpb24oRlhKU0VfSFZBTFVFIGhGdW5jdGlvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhSZXRWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuQXJnQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFKiBscEFyZ3MpOw0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfU2V0RnVuY3Rpb25CaW5kKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhPbGRGdW5jdGlvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaE5ld1RoaXMpOw0KK0ZYX0JPT0wgRlhKU0VfRXhlY3V0ZVNjcmlwdChGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogc3pTY3JpcHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoUmV0VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoTmV3VGhpc09iamVjdCA9IG51bGxwdHIpOw0KK3ZvaWQgRlhKU0VfVGhyb3dNZXNzYWdlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdXRmOE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB1dGY4TWVzc2FnZSk7DQorRlhfQk9PTCBGWEpTRV9SZXR1cm5WYWx1ZV9HZXRNZXNzYWdlKEZYSlNFX0hWQUxVRSBoUmV0VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiB1dGY4TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHV0ZjhNZXNzYWdlKTsNCitGWF9CT09MIEZYSlNFX1JldHVyblZhbHVlX0dldExpbmVJbmZvKEZYSlNFX0hWQUxVRSBoUmV0VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuTGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5Db2wpOw0KKw0KKyNlbmRpZiAgLy8gWEZBX0lOQ0xVREVfRlhKU0VfRlhKU0VfSF8NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZS5oIGIveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjNlYWUyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGUuaApAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKy8vIFRPRE8odGhlc3RpZyk6IFJlbW92ZSB0aGlzIGZpbGUgYW5kIGRvIElXWVUuDQorDQorI2lmbmRlZiBfRkRFDQorI2RlZmluZSBfRkRFDQorI2luY2x1ZGUgImZkZV9tZW0uaCINCisjaW5jbHVkZSAiZmRlX3htbC5oIg0KKyNpbmNsdWRlICJmZGVfaW1nLmgiDQorI2luY2x1ZGUgImZkZV9icnMuaCINCisjaW5jbHVkZSAiZmRlX3Blbi5oIg0KKyNpbmNsdWRlICJmZGVfcHRoLmgiDQorI2luY2x1ZGUgImZkZV90dG8uaCINCisjaW5jbHVkZSAiZmRlX3Bzci5oIg0KKyNpbmNsdWRlICJmZGVfY3NzLmgiDQorI2luY2x1ZGUgImZkZV9yZHYuaCINCisjaW5jbHVkZSAiZmRlX3Jkci5oIg0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX2Jycy5oIGIveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfYnJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjYzNkZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX2Jycy5oCkBAIC0wLDAgKzEsMTQzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZERV9CUlVTSA0KKyNkZWZpbmUgX0ZERV9CUlVTSA0KK2NsYXNzIElGREVfSW1hZ2U7DQorY2xhc3MgSUZERV9QYXRoOw0KK2NsYXNzIElGREVfQnJ1c2g7DQorY2xhc3MgSUZERV9Tb2xpZEJydXNoOw0KK2NsYXNzIElGREVfSGF0Y2hCcnVzaDsNCitjbGFzcyBJRkRFX1RleHR1cmVCcnVzaDsNCitjbGFzcyBJRkRFX0xpbmVhckdyYWRpZW50QnJ1c2g7DQorI2RlZmluZSBGREVfQlJVU0hUWVBFX1Vua25vd24gLTENCisjZGVmaW5lIEZERV9CUlVTSFRZUEVfU29saWQgMA0KKyNkZWZpbmUgRkRFX0JSVVNIVFlQRV9IYXRjaCAxDQorI2RlZmluZSBGREVfQlJVU0hUWVBFX1RleHR1cmUgMg0KKyNkZWZpbmUgRkRFX0JSVVNIVFlQRV9MaW5lYXJHcmFkaWVudCAzDQorI2RlZmluZSBGREVfQlJVU0hUWVBFX01BWCAzDQorI2RlZmluZSBGREVfV1JBUE1PREVfVGlsZSAwDQorI2RlZmluZSBGREVfV1JBUE1PREVfVGlsZUZsaXBYIDENCisjZGVmaW5lIEZERV9XUkFQTU9ERV9UaWxlRmxpcFkgMg0KKyNkZWZpbmUgRkRFX1dSQVBNT0RFX1RpbGVGbGlwWFkgMw0KKyNkZWZpbmUgRkRFX1dSQVBNT0RFX0NsYW1wIDQNCit0eXBlZGVmIHN0cnVjdCBfRkRFX0dSQURJRU5UQ09MT1Igew0KKyAgRlhfRkxPQVQgcG9zOw0KKyAgRlhfQVJHQiBjb2xvcjsNCit9IEZERV9HUkFESUVOVENPTE9SLCAqRkRFX0xQR1JBRElFTlRDT0xPUjsNCit0eXBlZGVmIEZERV9HUkFESUVOVENPTE9SIGNvbnN0KiBGREVfTFBDR1JBRElFTlRDT0xPUjsNCit0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPEZERV9HUkFESUVOVENPTE9SPiBDRkRFX0dyYWRpZW50Q29sb3JzOw0KK2NsYXNzIElGREVfQnJ1c2ggew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZERV9CcnVzaCogQ3JlYXRlKGludDMyX3QgaVR5cGUpOw0KKyAgdmlydHVhbCB+SUZERV9CcnVzaCgpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRUeXBlKCkgY29uc3QgPSAwOw0KK307DQorY2xhc3MgSUZERV9Tb2xpZEJydXNoIDogcHVibGljIElGREVfQnJ1c2ggew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIEZYX0FSR0IgR2V0Q29sb3IoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q29sb3IoRlhfQVJHQiBjb2xvcikgPSAwOw0KKyAgdmlydHVhbCBjb25zdCBDRlhfTWF0cml4JiBHZXRNYXRyaXgoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgUmVzZXRNYXRyaXgoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgVHJhbnNsYXRlTWF0cml4KEZYX0ZMT0FUIGR4LCBGWF9GTE9BVCBkeSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFJvdGF0ZU1hdHJpeChGWF9GTE9BVCBmUmFkaWFuKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2NhbGVNYXRyaXgoRlhfRkxPQVQgc3gsIEZYX0ZMT0FUIHN5KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgQ29uY2F0TWF0cml4KGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldE1hdHJpeChjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpID0gMDsNCit9Ow0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfSG9yaXpvbnRhbCAwDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9WZXJ0aWNhbCAxDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9Gb3J3YXJkRGlhZ29uYWwgMg0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfQmFja3dhcmREaWFnb25hbCAzDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9Dcm9zcyA0DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9EaWFnb25hbENyb3NzIDUNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFXzA1UGVyY2VudCA2DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV8xMFBlcmNlbnQgNw0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfMjBQZXJjZW50IDgNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFXzI1UGVyY2VudCA5DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV8zMFBlcmNlbnQgMTANCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFXzQwUGVyY2VudCAxMQ0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfNTBQZXJjZW50IDEyDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV82MFBlcmNlbnQgMTMNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFXzcwUGVyY2VudCAxNA0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfNzVQZXJjZW50IDE1DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV84MFBlcmNlbnQgMTYNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFXzkwUGVyY2VudCAxNw0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfTGlnaHREb3dud2FyZERpYWdvbmFsIDE4DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9MaWdodFVwd2FyZERpYWdvbmFsIDE5DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9EYXJrRG93bndhcmREaWFnb25hbCAyMA0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfRGFya1Vwd2FyZERpYWdvbmFsIDIxDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9XaWRlRG93bndhcmREaWFnb25hbCAyMg0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfV2lkZVVwd2FyZERpYWdvbmFsIDIzDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9MaWdodFZlcnRpY2FsIDI0DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9MaWdodEhvcml6b250YWwgMjUNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX05hcnJvd1ZlcnRpY2FsIDI2DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9OYXJyb3dIb3Jpem9udGFsIDI3DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9EYXJrVmVydGljYWwgMjgNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX0RhcmtIb3Jpem9udGFsIDI5DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9EYXNoZWREb3dud2FyZERpYWdvbmFsIDMwDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9EYXNoZWRVcHdhcmREaWFnb25hbCAzMQ0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfRGFzaGVkSG9yaXpvbnRhbCAzMg0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfRGFzaGVkVmVydGljYWwgMzMNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX1NtYWxsQ29uZmV0dGkgMzQNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX0xhcmdlQ29uZmV0dGkgMzUNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX1ppZ1phZyAzNg0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfV2F2ZSAzNw0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfRGlhZ29uYWxCcmljayAzOA0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfSG9yaXpvbnRhbEJyaWNrIDM5DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9XZWF2ZSA0MA0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfUGxhaWQgNDENCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX0Rpdm90IDQyDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9Eb3R0ZWRHcmlkIDQzDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9Eb3R0ZWREaWFtb25kIDQ0DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9TaGluZ2xlIDQ1DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9UcmVsbGlzIDQ2DQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9TcGhlcmUgNDcNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX1NtYWxsR3JpZCA0OA0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfU21hbGxDaGVja2VyQm9hcmQgNDkNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX0xhcmdlQ2hlY2tlckJvYXJkIDUwDQorI2RlZmluZSBGREVfSEFUQ0hTVFlMRV9PdXRsaW5lZERpYW1vbmQgNTENCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX1NvbGlkRGlhbW9uZCA1Mg0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfVG90YWwgNTMNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX0xhcmdlR3JpZCBGREVfSEFUQ0hTVFlMRV9Dcm9zcw0KKyNkZWZpbmUgRkRFX0hBVENIU1RZTEVfTWluIEZERV9IQVRDSFNUWUxFX0hvcml6b250YWwNCisjZGVmaW5lIEZERV9IQVRDSFNUWUxFX01heCAoRkRFX0hBVENIU1RZTEVfVG90YWwgLSAxKQ0KK2NsYXNzIElGREVfSGF0Y2hCcnVzaCA6IHB1YmxpYyBJRkRFX0JydXNoIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCBGWF9BUkdCIEdldENvbG9yKEZYX0JPT0wgYkZvcmVncm91bmRDb2xvcikgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldENvbG9yKEZYX0FSR0IgY29sb3IsIEZYX0JPT0wgYkZvcmVncm91bmRDb2xvcikgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEhhdGNoU3R5bGUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0SGF0Y2hTdHlsZShpbnQzMl90IGlIYXRjaFN0eWxlKSA9IDA7DQorfTsNCitjbGFzcyBJRkRFX1RleHR1cmVCcnVzaCA6IHB1YmxpYyBJRkRFX0JydXNoIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCBJRkRFX0ltYWdlKiBHZXRJbWFnZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRJbWFnZShJRkRFX0ltYWdlKiBwSW1hZ2UsIEZYX0JPT0wgYkF1dG9SZWxlYXNlKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0V3JhcE1vZGUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0V3JhcE1vZGUoaW50MzJfdCBpV3JhcE1vZGUpID0gMDsNCit9Ow0KKyNkZWZpbmUgRkRFX0xJTkVBUkdSQURJRU5UTU9ERV9Ib3Jpem9udGFsIDANCisjZGVmaW5lIEZERV9MSU5FQVJHUkFESUVOVE1PREVfVmVydGljYWwgMQ0KKyNkZWZpbmUgRkRFX0xJTkVBUkdSQURJRU5UTU9ERV9Gb3J3YXJkRGlhZ29uYWwgMg0KKyNkZWZpbmUgRkRFX0xJTkVBUkdSQURJRU5UTU9ERV9CYWNrd2FyZERpYWdvbmFsIDMNCitjbGFzcyBJRkRFX0xpbmVhckdyYWRpZW50QnJ1c2ggOiBwdWJsaWMgSUZERV9CcnVzaCB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgdm9pZCBHZXRMaW5lYXJQb2ludHMoQ0ZYX1BvaW50RiYgc3RhcnRpbmdQb2ludCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RiYgZW5kaW5nUG9pbnQpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRMaW5lYXJQb2ludHMoY29uc3QgQ0ZYX1BvaW50RiYgc3RhcnRpbmdQb2ludCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgZW5kaW5nUG9pbnQpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXRMaW5lYXJDb2xvcnMoRlhfQVJHQiYgc3RhcnRpbmdDb2xvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiYgZW5kaW5nQ29sb3IpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRMaW5lYXJDb2xvcnMoY29uc3QgRlhfQVJHQiYgc3RhcnRpbmdDb2xvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQiYgZW5kaW5nQ29sb3IpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudEdyYWRpZW50Q29sb3JzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldEdyYWRpZW50Q29sb3JzKENGREVfR3JhZGllbnRDb2xvcnMmIGNvbG9ycykgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldEdyYWRpZW50Q29sb3JzKGNvbnN0IENGREVfR3JhZGllbnRDb2xvcnMmIGNvbG9ycykgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFdyYXBNb2RlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldFdyYXBNb2RlKGludDMyX3QgaVdyYXBNb2RlKSA9IDA7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9jc3MuaCBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX2Nzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNjk2OWIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9jc3MuaApAQCAtMCwwICsxLDEwODUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRkRFX0NTUw0KKyNkZWZpbmUgX0ZERV9DU1MNCitjbGFzcyBJRkRFX0hUTU5vdGlmeTsNCitjbGFzcyBJRkRFX0NTU1ZhbHVlOw0KK2NsYXNzIElGREVfQ1NTUHJpbWl0aXZlVmFsdWU7DQorY2xhc3MgSUZERV9DU1NWYWx1ZUxpc3Q7DQorY2xhc3MgSUZERV9DU1NEZWNsYXJhdGlvbjsNCitjbGFzcyBJRkRFX0NTU1NlbGVjdG9yOw0KK2NsYXNzIElGREVfQ1NTUnVsZTsNCitjbGFzcyBJRkRFX0NTU1N0eWxlUnVsZTsNCitjbGFzcyBJRkRFX0NTU01lZGlhUnVsZTsNCitjbGFzcyBJRkRFX0NTU0ZvbnRGYWNlUnVsZTsNCitjbGFzcyBJRkRFX0NTU1N0eWxlU2hlZXQ7DQorY2xhc3MgSUZERV9DU1NTdHlsZVNoZWV0Q2FjaGU7DQorY2xhc3MgSUZERV9DU1NTeW50YXhQYXJzZXI7DQorY2xhc3MgSUZERV9DU1NSdWJ5U3R5bGU7DQorY2xhc3MgSUZERV9DU1NNdWx0aUNvbHVtblN0eWxlOw0KK2NsYXNzIElGREVfQ1NTR2VuZXJhdGVkQ29udGVudFN0eWxlOw0KK2NsYXNzIElGREVfQ1NTRm9udFN0eWxlOw0KK2NsYXNzIElGREVfQ1NTQm91bmRhcnlTdHlsZTsNCitjbGFzcyBJRkRFX0NTU1Bvc2l0aW9uU3R5bGU7DQorY2xhc3MgSUZERV9DU1NQYXJhZ3JhcGhTdHlsZTsNCitjbGFzcyBJRkRFX0NTU0JhY2tncm91bmRTdHlsZTsNCitjbGFzcyBJRkRFX0NTU0xpc3RTdHlsZTsNCitjbGFzcyBJRkRFX0NTU1RhYmxlU3R5bGU7DQorY2xhc3MgSUZERV9DU1NWaXN1YWxTdHlsZTsNCitjbGFzcyBJRkRFX0NTU0NvbXB1dGVkU3R5bGU7DQorY2xhc3MgSUZERV9DU1NUYWdQcm92aWRlcjsNCitjbGFzcyBJRkRFX0NTU0FjY2VsZXJhdG9yOw0KK2NsYXNzIElGREVfQ1NTU3R5bGVTZWxlY3RvcjsNCitjbGFzcyBJRkRFX0NTU0NvdW50ZXJDb250ZXh0Ow0KK2NsYXNzIElGREVfQ1NTQ291bnRlck1hbmFnZXI7DQorY2xhc3MgSUZERV9DU1NRdW90ZUNvbnRleHQ7DQorY2xhc3MgSUZERV9DU1NDb250ZW50Q29udGV4dDsNCitjbGFzcyBJRkRFX0NTU011bHRpQ29sdW1uQ29udGV4dDsNCitjbGFzcyBJRkRFX0NTU0Zsb2F0Q29udGV4dDsNCitlbnVtIEZERV9DU1NWQUxVRVRZUEUgew0KKyAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgPSAxLA0KKyAgRkRFX0NTU1ZBTFVFVFlQRV9MaXN0ID0gMiwNCisgIEZERV9DU1NWQUxVRVRZUEVfU2hvcnRoYW5kLA0KK307DQorZW51bSBGREVfQ1NTUFJJTUlUSVZFVFlQRSB7DQorICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9Vbmtub3duID0gMCwNCisgIEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlciA9IDEsDQorICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9QZXJjZW50ID0gMiwNCisgIEZERV9DU1NQUklNSVRJVkVUWVBFX0VNUyA9IDMsDQorICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FWFMgPSA0LA0KKyAgRkRFX0NTU1BSSU1JVElWRVRZUEVfUFggPSA1LA0KKyAgRkRFX0NTU1BSSU1JVElWRVRZUEVfQ00gPSA2LA0KKyAgRkRFX0NTU1BSSU1JVElWRVRZUEVfTU0gPSA3LA0KKyAgRkRFX0NTU1BSSU1JVElWRVRZUEVfSU4gPSA4LA0KKyAgRkRFX0NTU1BSSU1JVElWRVRZUEVfUFQgPSA5LA0KKyAgRkRFX0NTU1BSSU1JVElWRVRZUEVfUEMgPSAxMCwNCisgIEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZyA9IDE5LA0KKyAgRkRFX0NTU1BSSU1JVElWRVRZUEVfVVJJID0gMjAsDQorICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9SR0IgPSAyNSwNCisgIEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0sDQorICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9GdW5jdGlvbiwNCit9Ow0KK2VudW0gRkRFX0NTU1BST1BFUlRZVkFMVUUgew0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQm9sZGVyLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJMYXRpbiwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyY2FzZSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyR3JlZWssDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TZXNhbWUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTndSZXNpemUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9XUmVzaXplLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfRG90LA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfRW5kLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTHRyLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfUHJlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfUnRsLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3ViLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVG9wLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVmlzaWJsZSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0ZpbGxlZCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1N3UmVzaXplLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9SZXBlYXQsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EZWZhdWx0LA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVHJhbnNwYXJlbnQsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SaWRnZSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JpZ2h0LA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfSG9yaXpvbnRhbFRiLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfRGlzdHJpYnV0ZUxldHRlciwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0RvdWJsZUNpcmNsZSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1J1YnksDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Db2xsYXBzZSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vcm1hbCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0F2b2lkLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVXBwZXJSb21hbiwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0F1dG8sDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UZXh0LA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfWFNtYWxsLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGhpbiwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JlcGVhdCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1NtYWxsLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTmVSZXNpemUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob0NvbnRlbnQsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9PdXRzaWRlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfRVJlc2l6ZSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlUm93LA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQm90dG9tLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVW5kZXJsaW5lLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ2prSWRlb2dyYXBoaWMsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TZVJlc2l6ZSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0ZpeGVkLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfRG91YmxlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfU29saWQsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdWJ5QmFzZUdyb3VwLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfT3BlblF1b3RlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGlnaHRlciwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyUm9tYW4sDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TdHJpY3QsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZUNhcHRpb24sDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9PYmxpcXVlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfRGVjaW1hbCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xvb3NlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfSGVicmV3LA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfSGlkZGVuLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfRGFzaGVkLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfRW1iZWQsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZVJvd0dyb3VwLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVDb2x1bW4sDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TdGF0aWMsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9PdXRzZXQsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EZWNpbWFsTGVhZGluZ1plcm8sDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9LZWVwV29yZHMsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9LYXRha2FuYUlyb2hhLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3VwZXIsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9DZW50ZXIsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZUhlYWRlckdyb3VwLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfSW5zaWRlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfWHhMYXJnZSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RyaWFuZ2xlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfUnVieVRleHRHcm91cCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0NpcmNsZSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0hpcmFnYW5hLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmVwZWF0WCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JlcGVhdFksDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Nb3ZlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfSGlyYWdhbmFJcm9oYSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1J1YnlCYXNlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfU2Nyb2xsLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfU21hbGxlciwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlRm9vdGVyR3JvdXAsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9CYXNlbGluZSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1NlcGFyYXRlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQXJtZW5pYW4sDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9PcGVuLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmVsYXRpdmUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UaGljaywNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0p1c3RpZnksDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9NaWRkbGUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9BbHdheXMsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EaXN0cmlidXRlU3BhY2UsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MaW5lRWRnZSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1ByZVdyYXAsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9NZWRpdW0sDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9OUmVzaXplLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGlzdEl0ZW0sDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TaG93LA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ3VycmVudGNvbG9yLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9DbG9zZVF1b3RlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVmVydGljYWxMciwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1ZlcnRpY2FsUmwsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Qb2ludGVyLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfWHhTbWFsbCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0JvbGQsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb3RoLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfU21hbGxDYXBzLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfS2F0YWthbmEsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9BZnRlciwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0hvcml6b250YWwsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Eb3R0ZWQsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EaXNjLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfR2VvcmdpYW4sDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9JbmxpbmUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9PdmVybGluZSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1dhaXQsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9CcmVha0FsbCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1VwcGVyQWxwaGEsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9DYXBpdGFsaXplLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm93cmFwLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGV4dEJvdHRvbSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vT3BlblF1b3RlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfR3Jvb3ZlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfUHJvZ3Jlc3MsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MYXJnZXIsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9DbG9zZVF1b3RlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVDZWxsLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfUHJlTGluZSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Fic29sdXRlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfSW5saW5lVGFibGUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9CaWRpT3ZlcnJpZGUsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9JbmxpbmVCbG9jaywNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0luc2V0LA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ3Jvc3NoYWlyLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVXBwZXJMYXRpbiwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0hlbHAsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9IaWRlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVXBwZXJjYXNlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfU1Jlc2l6ZSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQmxpbmssDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9CbG9jaywNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1N0YXJ0LA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVDb2x1bW5Hcm91cCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0l0YWxpYywNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xpbmVUaHJvdWdoLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfS2VlcEFsbCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyQWxwaGEsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdW5JbiwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1NxdWFyZSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1hMYXJnZSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xhcmdlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfQmVmb3JlLA0KKyAgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGVmdCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RleHRUb3AsDQorICBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdWJ5VGV4dCwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vRGlzcGxheSwNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFX01BWA0KK307DQorY2xhc3MgSUZERV9DU1NWYWx1ZSB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGREVfQ1NTVmFsdWUoKSB7fQ0KKyAgdmlydHVhbCBGREVfQ1NTVkFMVUVUWVBFIEdldFR5cGUoKSBjb25zdCA9IDA7DQorfTsNCitjbGFzcyBJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlIDogcHVibGljIElGREVfQ1NTVmFsdWUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIEZERV9DU1NWQUxVRVRZUEUgR2V0VHlwZSgpIGNvbnN0IHsNCisgICAgcmV0dXJuIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlOw0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTUFJJTUlUSVZFVFlQRSBHZXRQcmltaXRpdmVUeXBlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9BUkdCIEdldFJHQkNvbG9yKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRGbG9hdCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgY29uc3QgRlhfV0NIQVIqIEdldFN0cmluZyhpbnQzMl90JiBpTGVuZ3RoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NQUk9QRVJUWVZBTFVFIEdldEVudW0oKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKiBHZXRGdW5jTmFtZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudEFyZ3MoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIElGREVfQ1NTVmFsdWUqIEdldEFyZ3MoaW50MzJfdCBpbmRleCkgY29uc3QgPSAwOw0KK307DQorY2xhc3MgSUZERV9DU1NWYWx1ZUxpc3QgOiBwdWJsaWMgSUZERV9DU1NWYWx1ZSB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgRkRFX0NTU1ZBTFVFVFlQRSBHZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gRkRFX0NTU1ZBTFVFVFlQRV9MaXN0OyB9DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRWYWx1ZXMoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIElGREVfQ1NTVmFsdWUqIEdldFZhbHVlKGludDMyX3QgaW5kZXgpIGNvbnN0ID0gMDsNCit9Ow0KK2VudW0gRkRFX0NTU1BST1BFUlRZIHsNCisgIEZERV9DU1NQUk9QRVJUWV9Xcml0aW5nTW9kZSwNCisgIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5SdWxlV2lkdGgsDQorICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyTGVmdCwNCisgIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5SdWxlLA0KKyAgRkRFX0NTU1BST1BFUlRZX0hlaWdodCwNCisgIEZERV9DU1NQUk9QRVJUWV9Db3VudGVyUmVzZXQsDQorICBGREVfQ1NTUFJPUEVSVFlfQ29udGVudCwNCisgIEZERV9DU1NQUk9QRVJUWV9SdWJ5UG9zaXRpb24sDQorICBGREVfQ1NTUFJPUEVSVFlfQmFja2dyb3VuZENvbG9yLA0KKyAgRkRFX0NTU1BST1BFUlRZX1dpZHRoLA0KKyAgRkRFX0NTU1BST1BFUlRZX1NyYywNCisgIEZERV9DU1NQUk9QRVJUWV9Ub3AsDQorICBGREVfQ1NTUFJPUEVSVFlfTWFyZ2luLA0KKyAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckNvbG9yLA0KKyAgRkRFX0NTU1BST1BFUlRZX1dpZG93cywNCisgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21Db2xvciwNCisgIEZERV9DU1NQUk9QRVJUWV9UZXh0SW5kZW50LA0KKyAgRkRFX0NTU1BST1BFUlRZX1JpZ2h0LA0KKyAgRkRFX0NTU1BST1BFUlRZX1RleHRFbXBoYXNpc1N0eWxlLA0KKyAgRkRFX0NTU1BST1BFUlRZX1BhZGRpbmdMZWZ0LA0KKyAgRkRFX0NTU1BST1BFUlRZX0NvbHVtbldpZHRoLA0KKyAgRkRFX0NTU1BST1BFUlRZX01hcmdpbkxlZnQsDQorICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyLA0KKyAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcCwNCisgIEZERV9DU1NQUk9QRVJUWV9SdWJ5T3ZlcmhhbmcsDQorICBGREVfQ1NTUFJPUEVSVFlfUGFnZUJyZWFrQmVmb3JlLA0KKyAgRkRFX0NTU1BST1BFUlRZX01heEhlaWdodCwNCisgIEZERV9DU1NQUk9QRVJUWV9NaW5XaWR0aCwNCisgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJMZWZ0Q29sb3IsDQorICBGREVfQ1NTUFJPUEVSVFlfQm90dG9tLA0KKyAgRkRFX0NTU1BST1BFUlRZX1F1b3RlcywNCisgIEZERV9DU1NQUk9QRVJUWV9NYXhXaWR0aCwNCisgIEZERV9DU1NQUk9QRVJUWV9QYWRkaW5nUmlnaHQsDQorICBGREVfQ1NTUFJPUEVSVFlfTGlzdFN0eWxlSW1hZ2UsDQorICBGREVfQ1NTUFJPUEVSVFlfV2hpdGVTcGFjZSwNCisgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b20sDQorICBGREVfQ1NTUFJPUEVSVFlfTGlzdFN0eWxlVHlwZSwNCisgIEZERV9DU1NQUk9QRVJUWV9Xb3JkQnJlYWssDQorICBGREVfQ1NTUFJPUEVSVFlfT3ZlcmZsb3dYLA0KKyAgRkRFX0NTU1BST1BFUlRZX092ZXJmbG93WSwNCisgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BDb2xvciwNCisgIEZERV9DU1NQUk9QRVJUWV9Gb250RmFtaWx5LA0KKyAgRkRFX0NTU1BST1BFUlRZX0N1cnNvciwNCisgIEZERV9DU1NQUk9QRVJUWV9SdWJ5QWxpZ24sDQorICBGREVfQ1NTUFJPUEVSVFlfQ29sdW1uUnVsZUNvbG9yLA0KKyAgRkRFX0NTU1BST1BFUlRZX0ZvbnRXZWlnaHQsDQorICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyUmlnaHRTdHlsZSwNCisgIEZERV9DU1NQUk9QRVJUWV9NaW5IZWlnaHQsDQorICBGREVfQ1NTUFJPUEVSVFlfQ29sb3IsDQorICBGREVfQ1NTUFJPUEVSVFlfTGV0dGVyU3BhY2luZywNCisgIEZERV9DU1NQUk9QRVJUWV9FbXB0eUNlbGxzLA0KKyAgRkRFX0NTU1BST1BFUlRZX1RleHRBbGlnbiwNCisgIEZERV9DU1NQUk9QRVJUWV9SdWJ5U3BhbiwNCisgIEZERV9DU1NQUk9QRVJUWV9Qb3NpdGlvbiwNCisgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJTdHlsZSwNCisgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21TdHlsZSwNCisgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJDb2xsYXBzZSwNCisgIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5Db3VudCwNCisgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodFdpZHRoLA0KKyAgRkRFX0NTU1BST1BFUlRZX1VuaWNvZGVCaWRpLA0KKyAgRkRFX0NTU1BST1BFUlRZX1ZlcnRpY2FsQWxpZ24sDQorICBGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ1RvcCwNCisgIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5zLA0KKyAgRkRFX0NTU1BST1BFUlRZX092ZXJmbG93LA0KKyAgRkRFX0NTU1BST1BFUlRZX1RhYmxlTGF5b3V0LA0KKyAgRkRFX0NTU1BST1BFUlRZX0ZvbnRWYXJpYW50LA0KKyAgRkRFX0NTU1BST1BFUlRZX0xpc3RTdHlsZSwNCisgIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kUG9zaXRpb24sDQorICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyV2lkdGgsDQorICBGREVfQ1NTUFJPUEVSVFlfVGV4dEVtcGhhc2lzQ29sb3IsDQorICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyTGVmdFN0eWxlLA0KKyAgRkRFX0NTU1BST1BFUlRZX1BhZ2VCcmVha0luc2lkZSwNCisgIEZERV9DU1NQUk9QRVJUWV9UZXh0RW1waGFzaXMsDQorICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQm90dG9tV2lkdGgsDQorICBGREVfQ1NTUFJPUEVSVFlfQ29sdW1uR2FwLA0KKyAgRkRFX0NTU1BST1BFUlRZX09ycGhhbnMsDQorICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyUmlnaHQsDQorICBGREVfQ1NTUFJPUEVSVFlfRm9udFNpemUsDQorICBGREVfQ1NTUFJPUEVSVFlfUGFnZUJyZWFrQWZ0ZXIsDQorICBGREVfQ1NTUFJPUEVSVFlfQ2FwdGlvblNpZGUsDQorICBGREVfQ1NTUFJPUEVSVFlfQmFja2dyb3VuZFJlcGVhdCwNCisgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BTdHlsZSwNCisgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJTcGFjaW5nLA0KKyAgRkRFX0NTU1BST1BFUlRZX1RleHRUcmFuc2Zvcm0sDQorICBGREVfQ1NTUFJPUEVSVFlfRm9udFN0eWxlLA0KKyAgRkRFX0NTU1BST1BFUlRZX0ZvbnQsDQorICBGREVfQ1NTUFJPUEVSVFlfTGluZUhlaWdodCwNCisgIEZERV9DU1NQUk9QRVJUWV9NYXJnaW5SaWdodCwNCisgIEZERV9DU1NQUk9QRVJUWV9GbG9hdCwNCisgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJMZWZ0V2lkdGgsDQorICBGREVfQ1NTUFJPUEVSVFlfRGlzcGxheSwNCisgIEZERV9DU1NQUk9QRVJUWV9DbGVhciwNCisgIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5SdWxlU3R5bGUsDQorICBGREVfQ1NTUFJPUEVSVFlfVGV4dENvbWJpbmUsDQorICBGREVfQ1NTUFJPUEVSVFlfTGlzdFN0eWxlUG9zaXRpb24sDQorICBGREVfQ1NTUFJPUEVSVFlfVmlzaWJpbGl0eSwNCisgIEZERV9DU1NQUk9QRVJUWV9QYWRkaW5nQm90dG9tLA0KKyAgRkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRBdHRhY2htZW50LA0KKyAgRkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRJbWFnZSwNCisgIEZERV9DU1NQUk9QRVJUWV9MaW5lQnJlYWssDQorICBGREVfQ1NTUFJPUEVSVFlfQmFja2dyb3VuZCwNCisgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BXaWR0aCwNCisgIEZERV9DU1NQUk9QRVJUWV9Xb3JkU3BhY2luZywNCisgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodENvbG9yLA0KKyAgRkRFX0NTU1BST1BFUlRZX0NvdW50ZXJJbmNyZW1lbnQsDQorICBGREVfQ1NTUFJPUEVSVFlfTGVmdCwNCisgIEZERV9DU1NQUk9QRVJUWV9UZXh0RGVjb3JhdGlvbiwNCisgIEZERV9DU1NQUk9QRVJUWV9QYWRkaW5nLA0KKyAgRkRFX0NTU1BST1BFUlRZX01hcmdpbkJvdHRvbSwNCisgIEZERV9DU1NQUk9QRVJUWV9NYXJnaW5Ub3AsDQorICBGREVfQ1NTUFJPUEVSVFlfRGlyZWN0aW9uLA0KKyAgRkRFX0NTU1BST1BFUlRZX01BWA0KK307DQorY2xhc3MgSUZERV9DU1NEZWNsYXJhdGlvbiB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGREVfQ1NTRGVjbGFyYXRpb24oKSB7fQ0KKyAgdmlydHVhbCBJRkRFX0NTU1ZhbHVlKiBHZXRQcm9wZXJ0eShGREVfQ1NTUFJPUEVSVFkgZVByb3BlcnR5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiSW1wb3J0YW50KSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX1BPU0lUSU9OIEdldFN0YXJ0UG9zaXRpb24oKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0TmV4dFByb3BlcnR5KEZYX1BPU0lUSU9OJiBwb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWSYgZVByb3BlcnR5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU1ZhbHVlKiYgcFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiSW1wb3J0YW50KSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX1BPU0lUSU9OIEdldFN0YXJ0Q3VzdG9tKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldE5leHRDdXN0b20oRlhfUE9TSVRJT04mIHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSkgY29uc3QgPSAwOw0KK307DQordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxJRkRFX0NTU0RlY2xhcmF0aW9uKj4gQ0ZERV9DU1NEZWNsYXJhdGlvbkFycmF5Ow0KK2VudW0gRkRFX0NTU1BFUlNVRE8gew0KKyAgRkRFX0NTU1BFUlNVRE9fQWZ0ZXIsDQorICBGREVfQ1NTUEVSU1VET19CZWZvcmUsDQorICBGREVfQ1NTUEVSU1VET19OT05FDQorfTsNCitlbnVtIEZERV9DU1NTRUxFQ1RPUlRZUEUgew0KKyAgRkRFX0NTU1NFTEVDVE9SVFlQRV9FbGVtZW50LA0KKyAgRkRFX0NTU1NFTEVDVE9SVFlQRV9EZXNjZW5kYW50LA0KKyAgRkRFX0NTU1NFTEVDVE9SVFlQRV9DbGFzcywNCisgIEZERV9DU1NTRUxFQ1RPUlRZUEVfUGVyc3VkbywNCisgIEZERV9DU1NTRUxFQ1RPUlRZUEVfSUQsDQorfTsNCitjbGFzcyBJRkRFX0NTU1NlbGVjdG9yIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZERV9DU1NTZWxlY3RvcigpIHt9DQorICB2aXJ0dWFsIEZERV9DU1NTRUxFQ1RPUlRZUEUgR2V0VHlwZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0TmFtZUhhc2goKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIElGREVfQ1NTU2VsZWN0b3IqIEdldE5leHRTZWxlY3RvcigpIGNvbnN0ID0gMDsNCit9Ow0KKyNkZWZpbmUgRkRFX0NTU01FRElBVFlQRV9CcmFpbGxlIDB4MDENCisjZGVmaW5lIEZERV9DU1NNRURJQVRZUEVfRW1ib3NzIDB4MDINCisjZGVmaW5lIEZERV9DU1NNRURJQVRZUEVfSGFuZGhlbGQgMHgwNA0KKyNkZWZpbmUgRkRFX0NTU01FRElBVFlQRV9QcmludCAweDA4DQorI2RlZmluZSBGREVfQ1NTTUVESUFUWVBFX1Byb2plY3Rpb24gMHgxMA0KKyNkZWZpbmUgRkRFX0NTU01FRElBVFlQRV9TY3JlZW4gMHgyMA0KKyNkZWZpbmUgRkRFX0NTU01FRElBVFlQRV9UVFkgMHg0MA0KKyNkZWZpbmUgRkRFX0NTU01FRElBVFlQRV9UViAweDgwDQorI2RlZmluZSBGREVfQ1NTTUVESUFUWVBFX0FMTCAweEZGDQorZW51bSBGREVfQ1NTUlVMRVRZUEUgew0KKyAgRkRFX0NTU1JVTEVUWVBFX1Vua25vd24gPSAwLA0KKyAgRkRFX0NTU1JVTEVUWVBFX1N0eWxlID0gMSwNCisgIEZERV9DU1NSVUxFVFlQRV9NZWRpYSA9IDQsDQorICBGREVfQ1NTUlVMRVRZUEVfRm9udEZhY2UgPSA1LA0KK307DQorY2xhc3MgSUZERV9DU1NSdWxlIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZERV9DU1NSdWxlKCkge30NCisgIHZpcnR1YWwgRkRFX0NTU1JVTEVUWVBFIEdldFR5cGUoKSBjb25zdCA9IDA7DQorfTsNCit0eXBlZGVmIENGWF9NYXNzQXJyYXlUZW1wbGF0ZTxJRkRFX0NTU1J1bGUqPiBDRkRFX0NTU1J1bGVBcnJheTsNCitjbGFzcyBJRkRFX0NTU1N0eWxlUnVsZSA6IHB1YmxpYyBJRkRFX0NTU1J1bGUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIEZERV9DU1NSVUxFVFlQRSBHZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gRkRFX0NTU1JVTEVUWVBFX1N0eWxlOyB9DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRTZWxlY3Rvckxpc3RzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBJRkRFX0NTU1NlbGVjdG9yKiBHZXRTZWxlY3Rvckxpc3QoaW50MzJfdCBpbmRleCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBJRkRFX0NTU0RlY2xhcmF0aW9uKiBHZXREZWNsYXJhdGlvbigpIGNvbnN0ID0gMDsNCit9Ow0KK2NsYXNzIElGREVfQ1NTTWVkaWFSdWxlIDogcHVibGljIElGREVfQ1NTUnVsZSB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgRkRFX0NTU1JVTEVUWVBFIEdldFR5cGUoKSBjb25zdCB7IHJldHVybiBGREVfQ1NTUlVMRVRZUEVfTWVkaWE7IH0NCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0TWVkaWFMaXN0KCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50UnVsZXMoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIElGREVfQ1NTUnVsZSogR2V0UnVsZShpbnQzMl90IGluZGV4KSA9IDA7DQorfTsNCitjbGFzcyBJRkRFX0NTU0ZvbnRGYWNlUnVsZSA6IHB1YmxpYyBJRkRFX0NTU1J1bGUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIEZERV9DU1NSVUxFVFlQRSBHZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gRkRFX0NTU1JVTEVUWVBFX0ZvbnRGYWNlOyB9DQorICB2aXJ0dWFsIElGREVfQ1NTRGVjbGFyYXRpb24qIEdldERlY2xhcmF0aW9uKCkgY29uc3QgPSAwOw0KK307DQorY2xhc3MgSUZERV9DU1NTdHlsZVNoZWV0IDogcHVibGljIElGWF9Vbmtub3duIHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGREVfQ1NTU3R5bGVTaGVldCogTG9hZEhUTUxTdGFuZGFyZFN0eWxlU2hlZXQoKTsNCisgIHN0YXRpYyBJRkRFX0NTU1N0eWxlU2hlZXQqIExvYWRGcm9tU3RyZWFtKA0KKyAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzelVybCwNCisgICAgICBJRlhfU3RyZWFtKiBwU3RyZWFtLA0KKyAgICAgIEZYX1dPUkQgd0NvZGVQYWdlLA0KKyAgICAgIEZYX0RXT1JEIGR3TWVkaWFMaXN0ID0gRkRFX0NTU01FRElBVFlQRV9BTEwpOw0KKyAgc3RhdGljIElGREVfQ1NTU3R5bGVTaGVldCogTG9hZEZyb21CdWZmZXIoDQorICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN6VXJsLA0KKyAgICAgIGNvbnN0IEZYX1dDSEFSKiBwQnVmZmVyLA0KKyAgICAgIGludDMyX3QgaUJ1ZlNpemUsDQorICAgICAgRlhfV09SRCB3Q29kZVBhZ2UsDQorICAgICAgRlhfRFdPUkQgZHdNZWRpYUxpc3QgPSBGREVfQ1NTTUVESUFUWVBFX0FMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0VXJsKENGWF9XaWRlU3RyaW5nJiBzelVybCkgPSAwOw0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRNZWRpYUxpc3QoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX1dPUkQgR2V0Q29kZVBhZ2UoKSBjb25zdCA9IDA7DQorDQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRSdWxlcygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgSUZERV9DU1NSdWxlKiBHZXRSdWxlKGludDMyX3QgaW5kZXgpID0gMDsNCit9Ow0KK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8SUZERV9DU1NTdHlsZVNoZWV0Kj4gQ0ZERV9DU1NTdHlsZVNoZWV0QXJyYXk7DQorI2RlZmluZSBGREVfQ1NTVVNFUlNUWUxFU0hFRVQgKEZYX0JTVFJDKCIjVVNFUlNIRUVUIikpDQorI2RlZmluZSBGREVfQ1NTVUFHRU5UU1RZTEVTSEVFVCAoRlhfQlNUUkMoIiNBR0VOVFNIRUVUIikpDQorY2xhc3MgSUZERV9DU1NTdHlsZVNoZWV0Q2FjaGUgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZERV9DU1NTdHlsZVNoZWV0Q2FjaGUqIENyZWF0ZSgpOw0KKyAgdmlydHVhbCB+SUZERV9DU1NTdHlsZVNoZWV0Q2FjaGUoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0TWF4SXRlbXMoaW50MzJfdCBpTWF4Q291bnQgPSA1KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgQWRkU3R5bGVTaGVldChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6S2V5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NTdHlsZVNoZWV0KiBwU3R5bGVTaGVldCkgPSAwOw0KKyAgdmlydHVhbCBJRkRFX0NTU1N0eWxlU2hlZXQqIEdldFN0eWxlU2hlZXQoDQorICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzektleSkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFJlbW92ZVN0eWxlU2hlZXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzektleSkgPSAwOw0KK307DQorZW51bSBGREVfQ1NTU1lOVEFYU1RBVFVTIHsNCisgIEZERV9DU1NTWU5UQVhTVEFUVVNfRXJyb3IsDQorICBGREVfQ1NTU1lOVEFYU1RBVFVTX0VPUywNCisgIEZERV9DU1NTWU5UQVhTVEFUVVNfTm9uZSwNCisgIEZERV9DU1NTWU5UQVhTVEFUVVNfQ2hhcnNldCwNCisgIEZERV9DU1NTWU5UQVhTVEFUVVNfSW1wb3J0UnVsZSwNCisgIEZERV9DU1NTWU5UQVhTVEFUVVNfSW1wb3J0Q2xvc2UsDQorICBGREVfQ1NTU1lOVEFYU1RBVFVTX1BhZ2VSdWxlLA0KKyAgRkRFX0NTU1NZTlRBWFNUQVRVU19TdHlsZVJ1bGUsDQorICBGREVfQ1NTU1lOVEFYU1RBVFVTX0ZvbnRGYWNlUnVsZSwNCisgIEZERV9DU1NTWU5UQVhTVEFUVVNfTWVkaWFSdWxlLA0KKyAgRkRFX0NTU1NZTlRBWFNUQVRVU19NZWRpYVR5cGUsDQorICBGREVfQ1NTU1lOVEFYU1RBVFVTX1VSSSwNCisgIEZERV9DU1NTWU5UQVhTVEFUVVNfU2VsZWN0b3IsDQorICBGREVfQ1NTU1lOVEFYU1RBVFVTX0RlY2xPcGVuLA0KKyAgRkRFX0NTU1NZTlRBWFNUQVRVU19EZWNsQ2xvc2UsDQorICBGREVfQ1NTU1lOVEFYU1RBVFVTX1Byb3BlcnR5TmFtZSwNCisgIEZERV9DU1NTWU5UQVhTVEFUVVNfUHJvcGVydHlWYWx1ZSwNCit9Ow0KK2NsYXNzIElGREVfQ1NTU3ludGF4UGFyc2VyIHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGREVfQ1NTU3ludGF4UGFyc2VyKiBDcmVhdGUoKTsNCisgIHZpcnR1YWwgfklGREVfQ1NTU3ludGF4UGFyc2VyKCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEluaXQoSUZYX1N0cmVhbSogcFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNTU1BsYW5lU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVRleHREYXRhU2l6ZSA9IDMyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiT25seURlY2xhcmF0aW9uID0gRkFMU0UpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBJbml0KGNvbnN0IEZYX1dDSEFSKiBwQnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQnVmZmVyU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVRleHREYXRTaXplID0gMzIsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJPbmx5RGVjbGFyYXRpb24gPSBGQUxTRSkgPSAwOw0KKw0KKyAgdmlydHVhbCBGREVfQ1NTU1lOVEFYU1RBVFVTIERvU3ludGF4UGFyc2UoKSA9IDA7DQorICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKiBHZXRDdXJyZW50U3RyaW5nKGludDMyX3QmIGlMZW5ndGgpIGNvbnN0ID0gMDsNCit9Ow0KK2VudW0gRkRFX0NTU0xFTkdUSFVOSVQgew0KKyAgRkRFX0NTU0xFTkdUSFVOSVRfQXV0bywNCisgIEZERV9DU1NMRU5HVEhVTklUX05vbmUsDQorICBGREVfQ1NTTEVOR1RIVU5JVF9Ob3JtYWwsDQorICBGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwNCisgIEZERV9DU1NMRU5HVEhVTklUX1BlcmNlbnQsDQorfTsNCisjZGVmaW5lIEZERV9DU1NVTklUQklUUyAoMykNCisjZGVmaW5lIEZERV9DU1NVTklUTUFTSyAoKDEgPDwgRkRFX0NTU1VOSVRCSVRTKSAtIDEpDQorc3RydWN0IEZERV9DU1NMRU5HVEggew0KKyAgRkRFX0NTU0xFTkdUSCYgU2V0KEZERV9DU1NMRU5HVEhVTklUIGVVbml0KSB7DQorICAgIG1faURhdGEgPSBlVW5pdDsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKyAgRkRFX0NTU0xFTkdUSCYgU2V0KEZERV9DU1NMRU5HVEhVTklUIGVVbml0LCBGWF9GTE9BVCBmVmFsdWUpIHsNCisgICAgbV9pRGF0YSA9ICgoaW50cHRyX3QpKGZWYWx1ZSAqIDEwMjQuMGYpIDw8IEZERV9DU1NVTklUQklUUykgfCBlVW5pdDsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKyAgRkRFX0NTU0xFTkdUSFVOSVQgR2V0VW5pdCgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChGREVfQ1NTTEVOR1RIVU5JVCkobV9pRGF0YSAmIEZERV9DU1NVTklUTUFTSyk7DQorICB9DQorICBGWF9GTE9BVCBHZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIChtX2lEYXRhID4+IEZERV9DU1NVTklUQklUUykgLyAxMDI0LjBmOyB9DQorICBGWF9CT09MIE5vblplcm8oKSBjb25zdCB7IHJldHVybiAobV9pRGF0YSA+PiBGREVfQ1NTVU5JVEJJVFMpICE9IDA7IH0NCisNCisgcHJpdmF0ZToNCisgIGludHB0cl90IG1faURhdGE7DQorfTsNCitzdHJ1Y3QgRkRFX0NTU1BPSU5UIHsNCisgIEZERV9DU1NQT0lOVCYgU2V0KEZERV9DU1NMRU5HVEhVTklUIGVVbml0KSB7DQorICAgIHguU2V0KGVVbml0KTsNCisgICAgeS5TZXQoZVVuaXQpOw0KKyAgICByZXR1cm4gKnRoaXM7DQorICB9DQorICBGREVfQ1NTUE9JTlQmIFNldChGREVfQ1NTTEVOR1RIVU5JVCBlVW5pdCwgRlhfRkxPQVQgZlZhbHVlKSB7DQorICAgIHguU2V0KGVVbml0LCBmVmFsdWUpOw0KKyAgICB5LlNldChlVW5pdCwgZlZhbHVlKTsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKyAgRkRFX0NTU0xFTkdUSCB4LCB5Ow0KK307DQorc3RydWN0IEZERV9DU1NTSVpFIHsNCisgIEZERV9DU1NTSVpFJiBTZXQoRkRFX0NTU0xFTkdUSFVOSVQgZVVuaXQpIHsNCisgICAgY3guU2V0KGVVbml0KTsNCisgICAgY3kuU2V0KGVVbml0KTsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKyAgRkRFX0NTU1NJWkUmIFNldChGREVfQ1NTTEVOR1RIVU5JVCBlVW5pdCwgRlhfRkxPQVQgZlZhbHVlKSB7DQorICAgIGN4LlNldChlVW5pdCwgZlZhbHVlKTsNCisgICAgY3kuU2V0KGVVbml0LCBmVmFsdWUpOw0KKyAgICByZXR1cm4gKnRoaXM7DQorICB9DQorICBGREVfQ1NTTEVOR1RIIGN4LCBjeTsNCit9Ow0KK3N0cnVjdCBGREVfQ1NTUkVDVCB7DQorICBGREVfQ1NTUkVDVCYgU2V0KEZERV9DU1NMRU5HVEhVTklUIGVVbml0KSB7DQorICAgIGxlZnQuU2V0KGVVbml0KTsNCisgICAgdG9wLlNldChlVW5pdCk7DQorICAgIHJpZ2h0LlNldChlVW5pdCk7DQorICAgIGJvdHRvbS5TZXQoZVVuaXQpOw0KKyAgICByZXR1cm4gKnRoaXM7DQorICB9DQorICBGREVfQ1NTUkVDVCYgU2V0KEZERV9DU1NMRU5HVEhVTklUIGVVbml0LCBGWF9GTE9BVCBmVmFsdWUpIHsNCisgICAgbGVmdC5TZXQoZVVuaXQsIGZWYWx1ZSk7DQorICAgIHRvcC5TZXQoZVVuaXQsIGZWYWx1ZSk7DQorICAgIHJpZ2h0LlNldChlVW5pdCwgZlZhbHVlKTsNCisgICAgYm90dG9tLlNldChlVW5pdCwgZlZhbHVlKTsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKw0KKyAgRkRFX0NTU0xFTkdUSCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207DQorfTsNCitlbnVtIEZERV9DU1NCS0dBVFRBQ0hNRU5UIHsNCisgIEZERV9DU1NCS0dBVFRBQ0hNRU5UX1Njcm9sbCwNCisgIEZERV9DU1NCS0dBVFRBQ0hNRU5UX0ZpeGVkLA0KK307DQorZW51bSBGREVfQ1NTQktHUkVQRUFUIHsNCisgIEZERV9DU1NCS0dSRVBFQVRfUmVwZWF0LA0KKyAgRkRFX0NTU0JLR1JFUEVBVF9SZXBlYXRYLA0KKyAgRkRFX0NTU0JLR1JFUEVBVF9SZXBlYXRZLA0KKyAgRkRFX0NTU0JLR1JFUEVBVF9Ob1JlcGVhdCwNCit9Ow0KK2VudW0gRkRFX0NTU0JPUkRFUlNUWUxFIHsNCisgIEZERV9DU1NCT1JERVJTVFlMRV9Ob25lLA0KKyAgRkRFX0NTU0JPUkRFUlNUWUxFX0hpZGRlbiwNCisgIEZERV9DU1NCT1JERVJTVFlMRV9Eb3R0ZWQsDQorICBGREVfQ1NTQk9SREVSU1RZTEVfRGFzaGVkLA0KKyAgRkRFX0NTU0JPUkRFUlNUWUxFX1NvbGlkLA0KKyAgRkRFX0NTU0JPUkRFUlNUWUxFX0RvdWJsZSwNCisgIEZERV9DU1NCT1JERVJTVFlMRV9Hcm9vdmUsDQorICBGREVfQ1NTQk9SREVSU1RZTEVfUmlkZ2UsDQorICBGREVfQ1NTQk9SREVSU1RZTEVfSW5zZXQsDQorICBGREVfQ1NTQk9SREVSU1RZTEVfb3V0c2V0LA0KK307DQorZW51bSBGREVfQ1NTQ0xFQVIgew0KKyAgRkRFX0NTU0NMRUFSX05vbmUsDQorICBGREVfQ1NTQ0xFQVJfTGVmdCwNCisgIEZERV9DU1NDTEVBUl9SaWdodCwNCisgIEZERV9DU1NDTEVBUl9Cb3RoLA0KK307DQorZW51bSBGREVfQ1NTRElTUExBWSB7DQorICBGREVfQ1NTRElTUExBWV9Ob25lLA0KKyAgRkRFX0NTU0RJU1BMQVlfTGlzdEl0ZW0sDQorICBGREVfQ1NTRElTUExBWV9SdW5JbiwNCisgIEZERV9DU1NESVNQTEFZX0Jsb2NrLA0KKyAgRkRFX0NTU0RJU1BMQVlfSW5saW5lLA0KKyAgRkRFX0NTU0RJU1BMQVlfSW5saW5lQmxvY2ssDQorICBGREVfQ1NTRElTUExBWV9JbmxpbmVUYWJsZSwNCisgIEZERV9DU1NESVNQTEFZX1RhYmxlLA0KKyAgRkRFX0NTU0RJU1BMQVlfVGFibGVSb3csDQorICBGREVfQ1NTRElTUExBWV9UYWJsZUNlbGwsDQorICBGREVfQ1NTRElTUExBWV9UYWJsZUNhcHRpb24sDQorICBGREVfQ1NTRElTUExBWV9UYWJsZUNvbHVtbiwNCisgIEZERV9DU1NESVNQTEFZX1RhYmxlUm93R3JvdXAsDQorICBGREVfQ1NTRElTUExBWV9UYWJsZUNvbHVtbkdyb3VwLA0KKyAgRkRFX0NTU0RJU1BMQVlfVGFibGVIZWFkZXJHcm91cCwNCisgIEZERV9DU1NESVNQTEFZX1RhYmxlRm9vdGVyR3JvdXAsDQorICBGREVfQ1NTRElTUExBWV9SdWJ5LA0KKyAgRkRFX0NTU0RJU1BMQVlfUnVieUJhc2UsDQorICBGREVfQ1NTRElTUExBWV9SdWJ5VGV4dCwNCisgIEZERV9DU1NESVNQTFNZX1J1YnlCYXNlR3JvdXAsDQorICBGREVfQ1NTRElTUExBWV9SdWJ5VGV4dEdyb3VwLA0KK307DQorZW51bSBGREVfQ1NTVklTSUJJTElUWSB7DQorICBGREVfQ1NTVklTSUJJTElUWV9WaXNpYmxlLA0KKyAgRkRFX0NTU1ZJU0lCSUxJVFlfSGlkZGVuLA0KKyAgRkRFX0NTU1ZJU0lCSUxJVFlfQ29sbGFwc2UsDQorfTsNCitlbnVtIEZERV9DU1NGT05UU1RZTEUgew0KKyAgRkRFX0NTU0ZPTlRTVFlMRV9Ob3JtYWwsDQorICBGREVfQ1NTRk9OVFNUWUxFX0l0YWxpYywNCit9Ow0KK2VudW0gRkRFX0NTU0ZMT0FUIHsNCisgIEZERV9DU1NGTE9BVF9Ob25lLA0KKyAgRkRFX0NTU0ZMT0FUX0xlZnQsDQorICBGREVfQ1NTRkxPQVRfUmlnaHQsDQorfTsNCitlbnVtIEZERV9DU1NXUklUSU5HTU9ERSB7DQorICBGREVfQ1NTV1JJVElOR01PREVfSG9yaXpvbnRhbFRiLA0KKyAgRkRFX0NTU1dSSVRJTkdNT0RFX1ZlcnRpY2FsUmwsDQorICBGREVfQ1NTV1JJVElOR01PREVfVmVydGljYWxMciwNCit9Ow0KK2VudW0gRkRFX0NTU1dPUkRCUkVBSyB7DQorICBGREVfQ1NTV09SREJSRUFLX05vcm1hbCwNCisgIEZERV9DU1NXT1JEQlJFQUtfS2VlcEFsbCwNCisgIEZERV9DU1NXT1JEQlJFQUtfQnJlYWtBbGwsDQorICBGREVfQ1NTV09SREJSRUFLX0tlZXBXb3JkcywNCit9Ow0KK2VudW0gRkRFX0NTU1BBR0VCUkVBSyB7DQorICBGREVfQ1NTUEFHRUJSRUFLX0F1dG8sDQorICBGREVfQ1NTUEFHRUJSRUFLX0Fsd2F5cywNCisgIEZERV9DU1NQQUdFQlJFQUtfQXZvaWQsDQorICBGREVfQ1NTUEFHRUJSRUFLX0xlZnQsDQorICBGREVfQ1NTUEFHRUJSRUFLX1JpZ2h0LA0KK307DQorZW51bSBGREVfQ1NTT1ZFUkZMT1cgew0KKyAgRkRFX0NTU09WRVJGTE9XX1Zpc2libGUsDQorICBGREVfQ1NTT1ZFUkZMT1dfSGlkZGVuLA0KKyAgRkRFX0NTU09WRVJGTE9XX1Njcm9sbCwNCisgIEZERV9DU1NPVkVSRkxPV19BdXRvLA0KKyAgRkRFX0NTU09WRVJGTE9XX05vRGlzcGxheSwNCisgIEZERV9DU1NPVkVSRkxPV19Ob0NvbnRlbnQsDQorfTsNCitlbnVtIEZERV9DU1NMSU5FQlJFQUsgew0KKyAgRkRFX0NTU0xJTkVCUkVBS19BdXRvLA0KKyAgRkRFX0NTU0xJTkVCUkVBS19Mb29zZSwNCisgIEZERV9DU1NMSU5FQlJFQUtfTm9ybWFsLA0KKyAgRkRFX0NTU0xJTkVCUkVBS19TdHJpY3QsDQorfTsNCitlbnVtIEZERV9DU1NURVhURU1QSEFTSVNGSUxMIHsNCisgIEZERV9DU1NURVhURU1QSEFTSVNGSUxMX0ZpbGxlZCwNCisgIEZERV9DU1NURVhURU1QSEFTSVNGSUxMX09wZW4sDQorfTsNCitlbnVtIEZERV9DU1NURVhURU1QSEFTSVNNQVJLIHsNCisgIEZERV9DU1NURVhURU1QSEFTSVNNQVJLX05vbmUsDQorICBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19BdXRvLA0KKyAgRkRFX0NTU1RFWFRFTVBIQVNJU01BUktfRG90LA0KKyAgRkRFX0NTU1RFWFRFTVBIQVNJU01BUktfQ2lyY2xlLA0KKyAgRkRFX0NTU1RFWFRFTVBIQVNJU01BUktfRG91YmxlQ2lyY2xlLA0KKyAgRkRFX0NTU1RFWFRFTVBIQVNJU01BUktfVHJpYW5nbGUsDQorICBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19TZXNhbWUsDQorICBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19DdXN0b20sDQorfTsNCitlbnVtIEZERV9DU1NURVhUQ09NQklORSB7DQorICBGREVfQ1NTVEVYVENPTUJJTkVfSG9yaXpvbnRhbCwNCisgIEZERV9DU1NURVhUQ09NQklORV9Ob25lLA0KK307DQorZW51bSBGREVfQ1NTQ1VSU09SIHsNCisgIEZERV9DU1NDVVJTT1JfQXV0bywNCisgIEZERV9DU1NDVVJTT1JfQ3Jvc3NoYWlyLA0KKyAgRkRFX0NTU0NVUlNPUl9EZWZhdWx0LA0KKyAgRkRFX0NTU0NVUlNPUl9Qb2ludGVyLA0KKyAgRkRFX0NTU0NVUlNPUl9Nb3ZlLA0KKyAgRkRFX0NTU0NVUlNPUl9FUmVzaXplLA0KKyAgRkRFX0NTU0NVUlNPUl9OZVJlc2l6ZSwNCisgIEZERV9DU1NDVVJTT1JfTndSZXNpemUsDQorICBGREVfQ1NTQ1VSU09SX05SZXNpemUsDQorICBGREVfQ1NTQ1VSU09SX1NlUmVzaXplLA0KKyAgRkRFX0NTU0NVUlNPUl9Td1Jlc2l6ZSwNCisgIEZERV9DU1NDVVJTT1JfU1Jlc2l6ZSwNCisgIEZERV9DU1NDVVJTT1JfV1Jlc2l6ZSwNCisgIEZERV9DU1NDVVJTT1JfVGV4dCwNCisgIEZERV9DU1NDVVJTT1JfV2FpdCwNCisgIEZERV9DU1NDVVJTT1JfSGVscCwNCisgIEZERV9DU1NDVVJTT1JfUHJvZ3Jlc3MsDQorfTsNCitlbnVtIEZERV9DU1NQT1NJVElPTiB7DQorICBGREVfQ1NTUE9TSVRJT05fU3RhdGljLA0KKyAgRkRFX0NTU1BPU0lUSU9OX1JlbGF0aXZlLA0KKyAgRkRFX0NTU1BPU0lUSU9OX0Fic29sdXRlLA0KKyAgRkRFX0NTU1BPU0lUSU9OX0ZpeGVkLA0KK307DQorZW51bSBGREVfQ1NTQ0FQVElPTlNJREUgew0KKyAgRkRFX0NTU0NBUFRJT05TSURFX1RvcCwNCisgIEZERV9DU1NDQVBUSU9OU0lERV9Cb3R0b20sDQorICBGREVfQ1NTQ0FQVElPTlNJREVfTGVmdCwNCisgIEZERV9DU1NDQVBUSU9OU0lERV9SaWdodCwNCisgIEZERV9DU1NDQVBUSU9OU0lERV9CZWZvcmUsDQorICBGREVfQ1NTQ0FQVElPTlNJREVfQWZ0ZXIsDQorfTsNCitlbnVtIEZERV9DU1NSVUJZQUxJR04gew0KKyAgRkRFX0NTU1JVQllBTElHTl9BdXRvLA0KKyAgRkRFX0NTU1JVQllBTElHTl9TdGFydCwNCisgIEZERV9DU1NSVUJZQUxJR05fTGVmdCwNCisgIEZERV9DU1NSVUJZQUxJR05fQ2VudGVyLA0KKyAgRkRFX0NTU1JVQllBTElHTl9FbmQsDQorICBGREVfQ1NTUlVCWUFMSUdOX1JpZ2h0LA0KKyAgRkRFX0NTU1JVQllBTElHTl9EaXN0cmlidXRlTGV0dGVyLA0KKyAgRkRFX0NTU1JVQllBTElHTl9EaXN0cmlidXRlU3BhY2UsDQorICBGREVfQ1NTUlVCWUFMSUdOX0xpbmVFZGdlLA0KK307DQorZW51bSBGREVfQ1NTUlVCWU9WRVJIQU5HIHsNCisgIEZERV9DU1NSVUJZT1ZFUkhBTkdfQXV0bywNCisgIEZERV9DU1NSVUJZT1ZFUkhBTkdfU3RhcnQsDQorICBGREVfQ1NTUlVCWU9WRVJIQU5HX0VuZCwNCisgIEZERV9DU1NSVUJZT1ZFUkhBTkdfTm9uZSwNCit9Ow0KK2VudW0gRkRFX0NTU1JVQllQT1NJVElPTiB7DQorICBGREVfQ1NTUlVCWVBPU0lUSU9OX0JlZm9yZSwNCisgIEZERV9DU1NSVUJZUE9TSVRJT05fQWZ0ZXIsDQorICBGREVfQ1NTUlVCWVBPU0lUSU9OX1JpZ2h0LA0KKyAgRkRFX0NTU1JVQllQT1NJVElPTl9JbmxpbmUsDQorfTsNCitlbnVtIEZERV9DU1NSVUJZU1BBTiB7DQorICBGREVfQ1NTUlVCWVNQQU5fTm9uZSwNCisgIEZERV9DU1NSVUJZU1BBTl9BdHRyLA0KK307DQorZW51bSBGREVfQ1NTVEVYVEFMSUdOIHsNCisgIEZERV9DU1NURVhUQUxJR05fTGVmdCwNCisgIEZERV9DU1NURVhUQUxJR05fUmlnaHQsDQorICBGREVfQ1NTVEVYVEFMSUdOX0NlbnRlciwNCisgIEZERV9DU1NURVhUQUxJR05fSnVzdGlmeSwNCisgIEZERV9DU1NURVhUQUxJR05fSnVzdGlmeUFsbCwNCit9Ow0KK2VudW0gRkRFX0NTU1ZFUlRJQ0FMQUxJR04gew0KKyAgRkRFX0NTU1ZFUlRJQ0FMQUxJR05fQmFzZWxpbmUsDQorICBGREVfQ1NTVkVSVElDQUxBTElHTl9TdWIsDQorICBGREVfQ1NTVkVSVElDQUxBTElHTl9TdXBlciwNCisgIEZERV9DU1NWRVJUSUNBTEFMSUdOX1RvcCwNCisgIEZERV9DU1NWRVJUSUNBTEFMSUdOX1RleHRUb3AsDQorICBGREVfQ1NTVkVSVElDQUxBTElHTl9NaWRkbGUsDQorICBGREVfQ1NTVkVSVElDQUxBTElHTl9Cb3R0b20sDQorICBGREVfQ1NTVkVSVElDQUxBTElHTl9UZXh0Qm90dG9tLA0KKyAgRkRFX0NTU1ZFUlRJQ0FMQUxJR05fTnVtYmVyLA0KK307DQorZW51bSBGREVfQ1NTTElTVFNUWUxFVFlQRSB7DQorICBGREVfQ1NTTElTVFNUWUxFVFlQRV9EaXNjLA0KKyAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfQ2lyY2xlLA0KKyAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfU3F1YXJlLA0KKyAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfRGVjaW1hbCwNCisgIEZERV9DU1NMSVNUU1RZTEVUWVBFX0RlY2ltYWxMZWFkaW5nWmVybywNCisgIEZERV9DU1NMSVNUU1RZTEVUWVBFX0xvd2VyUm9tYW4sDQorICBGREVfQ1NTTElTVFNUWUxFVFlQRV9VcHBlclJvbWFuLA0KKyAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfTG93ZXJHcmVlaywNCisgIEZERV9DU1NMSVNUU1RZTEVUWVBFX0xvd2VyTGF0aW4sDQorICBGREVfQ1NTTElTVFNUWUxFVFlQRV9VcHBlckxhdGluLA0KKyAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfQXJtZW5pYW4sDQorICBGREVfQ1NTTElTVFNUWUxFVFlQRV9HZW9yZ2lhbiwNCisgIEZERV9DU1NMSVNUU1RZTEVUWVBFX0xvd2VyQWxwaGEsDQorICBGREVfQ1NTTElTVFNUWUxFVFlQRV9VcHBlckFscGhhLA0KKyAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfTm9uZSwNCisgIEZERV9DU1NMSVNUU1RZTEVUWVBFX0Nqa0lkZW9ncmFwaGljLA0KKyAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfSGVicmV3LA0KKyAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfSGlyYWdhbmEsDQorICBGREVfQ1NTTElTVFNUWUxFVFlQRV9IaXJhZ2FuYUlyb2hhLA0KKyAgRkRFX0NTU0xJU1RTVFlMRVRZUEVfS2F0YWthbmEsDQorICBGREVfQ1NTTElTVFNUWUxFVFlQRV9LYXRha2FuYUlyb2hhLA0KK307DQorZW51bSBGREVfQ1NTTElTVFNUWUxFUE9TSVRJT04gew0KKyAgRkRFX0NTU0xJU1RTVFlMRVBPU0lUSU9OX091dHNpZGUsDQorICBGREVfQ1NTTElTVFNUWUxFUE9TSVRJT05fSW5zaWRlLA0KK307DQorZW51bSBGREVfQ1NTV0hJVEVTUEFDRSB7DQorICBGREVfQ1NTV0hJVEVTUEFDRV9Ob3JtYWwsDQorICBGREVfQ1NTV0hJVEVTUEFDRV9QcmUsDQorICBGREVfQ1NTV0hJVEVTUEFDRV9Ob3dyYXAsDQorICBGREVfQ1NTV0hJVEVTUEFDRV9QcmVXcmFwLA0KKyAgRkRFX0NTU1dISVRFU1BBQ0VfUHJlTGluZSwNCit9Ow0KK2VudW0gRkRFX0NTU0ZPTlRWQVJJQU5UIHsNCisgIEZERV9DU1NGT05UVkFSSUFOVF9Ob3JtYWwsDQorICBGREVfQ1NTRk9OVFZBUklBTlRfU21hbGxDYXBzLA0KK307DQorZW51bSBGREVfQ1NTVEVYVFRSQU5TRk9STSB7DQorICBGREVfQ1NTVEVYVFRSQU5TRk9STV9Ob25lLA0KKyAgRkRFX0NTU1RFWFRUUkFOU0ZPUk1fQ2FwaXRhbGl6ZSwNCisgIEZERV9DU1NURVhUVFJBTlNGT1JNX1VwcGVyQ2FzZSwNCisgIEZERV9DU1NURVhUVFJBTlNGT1JNX0xvd2VyQ2FzZSwNCit9Ow0KK2VudW0gRkRFX0NTU1RFWFRERUNPUkFUSU9OIHsNCisgIEZERV9DU1NURVhUREVDT1JBVElPTl9Ob25lID0gMCwNCisgIEZERV9DU1NURVhUREVDT1JBVElPTl9VbmRlcmxpbmUgPSAxLA0KKyAgRkRFX0NTU1RFWFRERUNPUkFUSU9OX092ZXJsaW5lID0gMiwNCisgIEZERV9DU1NURVhUREVDT1JBVElPTl9MaW5lVGhyb3VnaCA9IDQsDQorICBGREVfQ1NTVEVYVERFQ09SQVRJT05fQmxpbmsgPSA4LA0KKyAgRkRFX0NTU1RFWFRERUNPUkFUSU9OX0RvdWJsZSA9IDE2LA0KK307DQorY2xhc3MgSUZERV9DU1NSdWJ5U3R5bGUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRkRFX0NTU1J1YnlTdHlsZSgpIHt9DQorICB2aXJ0dWFsIEZERV9DU1NSVUJZQUxJR04gR2V0UnVieUFsaWduKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfQ1NTUlVCWU9WRVJIQU5HIEdldFJ1YnlPdmVyaGFuZygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRkRFX0NTU1JVQllQT1NJVElPTiBHZXRSdWJ5UG9zaXRpb24oKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NSVUJZU1BBTiBHZXRSdWJ5U3BhblR5cGUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIElGREVfQ1NTVmFsdWUqIEdldFJ1YnlTcGFuQXR0cigpIGNvbnN0ID0gMDsNCit9Ow0KK2NsYXNzIElGREVfQ1NTTXVsdGlDb2x1bW5TdHlsZSB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGREVfQ1NTTXVsdGlDb2x1bW5TdHlsZSgpIHt9DQorICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NMRU5HVEgmIEdldENvbHVtbkNvdW50KCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBjb25zdCBGREVfQ1NTTEVOR1RIJiBHZXRDb2x1bW5HYXAoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX0FSR0IgR2V0Q29sdW1uUnVsZUNvbG9yKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfQ1NTQk9SREVSU1RZTEUgR2V0Q29sdW1uUnVsZVN0eWxlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBjb25zdCBGREVfQ1NTTEVOR1RIJiBHZXRDb2x1bW5SdWxlV2lkdGgoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NMRU5HVEgmIEdldENvbHVtbldpZHRoKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldENvbHVtbkNvdW50KGNvbnN0IEZERV9DU1NMRU5HVEgmIGNvbHVtbkNvdW50KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q29sdW1uR2FwKGNvbnN0IEZERV9DU1NMRU5HVEgmIGNvbHVtbkdhcCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldENvbHVtblJ1bGVDb2xvcihGWF9BUkdCIGR3Q29sdW1uUnVsZUNvbG9yKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q29sdW1uUnVsZVN0eWxlKEZERV9DU1NCT1JERVJTVFlMRSBlQ29sdW1uUnVsZVN0eWxlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q29sdW1uUnVsZVdpZHRoKGNvbnN0IEZERV9DU1NMRU5HVEgmIGNvbHVtblJ1bGVXaWR0aCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldENvbHVtbldpZHRoKGNvbnN0IEZERV9DU1NMRU5HVEgmIGNvbHVtbldpZHRoKSA9IDA7DQorfTsNCitjbGFzcyBJRkRFX0NTU0dlbmVyYXRlZENvbnRlbnRTdHlsZSB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGREVfQ1NTR2VuZXJhdGVkQ29udGVudFN0eWxlKCkge30NCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudENvdW50ZXJzKCkgPSAwOw0KKyAgdmlydHVhbCBjb25zdCBGWF9XQ0hBUiogR2V0Q291bnRlcklkZW50aWZpZXIoaW50MzJfdCBpbmRleCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldENvdW50ZXJSZXNldChpbnQzMl90IGluZGV4LCBpbnQzMl90JiBpVmFsdWUpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRDb3VudGVySW5jcmVtZW50KGludDMyX3QgaW5kZXgsIGludDMyX3QmIGlWYWx1ZSkgPSAwOw0KKyAgdmlydHVhbCBJRkRFX0NTU1ZhbHVlTGlzdCogR2V0Q29udGVudCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudFF1b3RlcygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgY29uc3QgRlhfV0NIQVIqIEdldFF1b3RlcyhpbnQzMl90IGluZGV4KSBjb25zdCA9IDA7DQorfTsNCitjbGFzcyBJRkRFX0NTU0ZvbnRTdHlsZSB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGREVfQ1NTRm9udFN0eWxlKCkge30NCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudEZvbnRGYW1pbGllcygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgY29uc3QgRlhfV0NIQVIqIEdldEZvbnRGYW1pbHkoaW50MzJfdCBpbmRleCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9XT1JEIEdldEZvbnRXZWlnaHQoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NGT05UVkFSSUFOVCBHZXRGb250VmFyaWFudCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRkRFX0NTU0ZPTlRTVFlMRSBHZXRGb250U3R5bGUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEZvbnRTaXplKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9BUkdCIEdldENvbG9yKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEZvbnRXZWlnaHQoRlhfV09SRCB3Rm9udFdlaWdodCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEZvbnRWYXJpYW50KEZERV9DU1NGT05UVkFSSUFOVCBlRm9udFZhcmlhbnQpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRGb250U3R5bGUoRkRFX0NTU0ZPTlRTVFlMRSBlRm9udFN0eWxlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q29sb3IoRlhfQVJHQiBkd0ZvbnRDb2xvcikgPSAwOw0KK307DQorY2xhc3MgSUZERV9DU1NCb3VuZGFyeVN0eWxlIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZERV9DU1NCb3VuZGFyeVN0eWxlKCkge30NCisgIHZpcnR1YWwgRlhfQVJHQiBHZXRCb3JkZXJMZWZ0Q29sb3IoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX0FSR0IgR2V0Qm9yZGVyVG9wQ29sb3IoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX0FSR0IgR2V0Qm9yZGVyUmlnaHRDb2xvcigpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfQVJHQiBHZXRCb3JkZXJCb3R0b21Db2xvcigpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRkRFX0NTU0JPUkRFUlNUWUxFIEdldEJvcmRlckxlZnRTdHlsZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRkRFX0NTU0JPUkRFUlNUWUxFIEdldEJvcmRlclRvcFN0eWxlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfQ1NTQk9SREVSU1RZTEUgR2V0Qm9yZGVyUmlnaHRTdHlsZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRkRFX0NTU0JPUkRFUlNUWUxFIEdldEJvcmRlckJvdHRvbVN0eWxlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBjb25zdCBGREVfQ1NTUkVDVCogR2V0Qm9yZGVyV2lkdGgoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NSRUNUKiBHZXRNYXJnaW5XaWR0aCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgY29uc3QgRkRFX0NTU1JFQ1QqIEdldFBhZGRpbmdXaWR0aCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRCb3JkZXJMZWZ0Q29sb3IoRlhfQVJHQiBkd0JvcmRlckNvbG9yKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Qm9yZGVyVG9wQ29sb3IoRlhfQVJHQiBkd0JvcmRlckNvbG9yKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Qm9yZGVyUmlnaHRDb2xvcihGWF9BUkdCIGR3Qm9yZGVyQ29sb3IpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRCb3JkZXJCb3R0b21Db2xvcihGWF9BUkdCIGR3Qm9yZGVyQ29sb3IpID0gMDsNCisNCisgIHZpcnR1YWwgdm9pZCBTZXRCb3JkZXJMZWZ0U3R5bGUoRkRFX0NTU0JPUkRFUlNUWUxFIGVCb3JkZXJTdHlsZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEJvcmRlclRvcFN0eWxlKEZERV9DU1NCT1JERVJTVFlMRSBlQm9yZGVyU3R5bGUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRCb3JkZXJSaWdodFN0eWxlKEZERV9DU1NCT1JERVJTVFlMRSBlQm9yZGVyU3R5bGUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRCb3JkZXJCb3R0b21TdHlsZShGREVfQ1NTQk9SREVSU1RZTEUgZUJvcmRlclN0eWxlKSA9IDA7DQorDQorICB2aXJ0dWFsIHZvaWQgU2V0Qm9yZGVyV2lkdGgoY29uc3QgRkRFX0NTU1JFQ1QmIHJlY3QpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRNYXJnaW5XaWR0aChjb25zdCBGREVfQ1NTUkVDVCYgcmVjdCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldFBhZGRpbmdXaWR0aChjb25zdCBGREVfQ1NTUkVDVCYgcmVjdCkgPSAwOw0KK307DQorY2xhc3MgSUZERV9DU1NQb3NpdGlvblN0eWxlIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZERV9DU1NQb3NpdGlvblN0eWxlKCkge30NCisgIHZpcnR1YWwgRkRFX0NTU0RJU1BMQVkgR2V0RGlzcGxheSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgY29uc3QgRkRFX0NTU1NJWkUmIEdldEJveFNpemUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NTSVpFJiBHZXRNaW5Cb3hTaXplKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBjb25zdCBGREVfQ1NTU0laRSYgR2V0TWF4Qm94U2l6ZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRkRFX0NTU0ZMT0FUIEdldEZsb2F0KCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfQ1NTQ0xFQVIgR2V0Q2xlYXIoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NQT1NJVElPTiBHZXRQb3NpdGlvbigpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRkRFX0NTU0xFTkdUSCBHZXRUb3AoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NMRU5HVEggR2V0Qm90dG9tKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfQ1NTTEVOR1RIIEdldExlZnQoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NMRU5HVEggR2V0UmlnaHQoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0RGlzcGxheShGREVfQ1NTRElTUExBWSBlRGlzcGxheSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEJveFNpemUoY29uc3QgRkRFX0NTU1NJWkUmIGJveFNpemUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRNaW5Cb3hTaXplKGNvbnN0IEZERV9DU1NTSVpFJiBtaW5Cb3hTaXplKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0TWF4Qm94U2l6ZShjb25zdCBGREVfQ1NTU0laRSYgbWF4Qm94U2l6ZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEZsb2F0KEZERV9DU1NGTE9BVCBlRmxvYXQpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRDbGVhcihGREVfQ1NTQ0xFQVIgZUNsZWFyKSA9IDA7DQorfTsNCitjbGFzcyBJRkRFX0NTU1BhcmFncmFwaFN0eWxlIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZERV9DU1NQYXJhZ3JhcGhTdHlsZSgpIHt9DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldExpbmVIZWlnaHQoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NXSElURVNQQUNFIEdldFdoaXRlU3BhY2UoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NMRU5HVEgmIEdldFRleHRJbmRlbnQoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NURVhUQUxJR04gR2V0VGV4dEFsaWduKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfQ1NTVkVSVElDQUxBTElHTiBHZXRWZXJ0aWNhbEFsaWduKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXROdW1iZXJWZXJ0aWNhbEFsaWduKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfQ1NTVEVYVFRSQU5TRk9STSBHZXRUZXh0VHJhbnNmb3JtKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRUZXh0RGVjb3JhdGlvbigpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgY29uc3QgRkRFX0NTU0xFTkdUSCYgR2V0TGV0dGVyU3BhY2luZygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgY29uc3QgRkRFX0NTU0xFTkdUSCYgR2V0V29yZFNwYWNpbmcoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NXUklUSU5HTU9ERSBHZXRXcml0aW5nTW9kZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRkRFX0NTU1dPUkRCUkVBSyBHZXRXb3JkQnJlYWsoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0V2lkb3dzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9BUkdCIEdldFRleHRFbXBoYXNpc0NvbG9yKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfQ1NTUEFHRUJSRUFLIEdldFBhZ2VCcmVha0JlZm9yZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRkRFX0NTU1BBR0VCUkVBSyBHZXRQYWdlQnJlYWtBZnRlcigpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRkRFX0NTU1BBR0VCUkVBSyBHZXRQYWdlQnJlYWtJbnNpZGUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0T3JwaGFucygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRkRFX0NTU0xJTkVCUkVBSyBHZXRMaW5lQnJlYWsoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NURVhURU1QSEFTSVNNQVJLIEdldFRleHRFbXBoYXNpc01hcmsoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NURVhURU1QSEFTSVNGSUxMIEdldFRleHRFbXBoYXNpc0ZpbGwoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKiBHZXRUZXh0RW1waGFzaXNDdXN0b20oKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NURVhUQ09NQklORSBHZXRUZXh0Q29tYmluZVR5cGUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgSGFzVGV4dENvbWJpbmVOdW1iZXIoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldFRleHRDb21iaW5lTnVtYmVyKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldExpbmVIZWlnaHQoRlhfRkxPQVQgZkxpbmVIZWlnaHQpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRXaGl0ZVNwYWNlKEZERV9DU1NXSElURVNQQUNFIGVXaGl0ZVNwYWNlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0VGV4dEluZGVudChjb25zdCBGREVfQ1NTTEVOR1RIJiB0ZXh0SW5kZW50KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0VGV4dEFsaWduKEZERV9DU1NURVhUQUxJR04gZVRleHRBbGlnbikgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldFZlcnRpY2FsQWxpZ24oRkRFX0NTU1ZFUlRJQ0FMQUxJR04gZVZlcnRpY2FsQWxpZ24pID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXROdW1iZXJWZXJ0aWNhbEFsaWduKEZYX0ZMT0FUIGZBbGlnbikgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldFRleHRUcmFuc2Zvcm0oRkRFX0NTU1RFWFRUUkFOU0ZPUk0gZVRleHRUcmFuc2Zvcm0pID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRUZXh0RGVjb3JhdGlvbihGWF9EV09SRCBkd1RleHREZWNvcmF0aW9uKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0TGV0dGVyU3BhY2luZyhjb25zdCBGREVfQ1NTTEVOR1RIJiBsZXR0ZXJTcGFjaW5nKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0V29yZFNwYWNpbmcoY29uc3QgRkRFX0NTU0xFTkdUSCYgd29yZFNwYWNpbmcpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRXcml0aW5nTW9kZShGREVfQ1NTV1JJVElOR01PREUgZVdyaXRpbmdNb2RlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0V29yZEJyZWFrKEZERV9DU1NXT1JEQlJFQUsgZVdvcmRCcmVhaykgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldFdpZG93cyhpbnQzMl90IGlXaWRvd3MpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRUZXh0RW1waGFzaXNDb2xvcihGWF9BUkdCIGR3VGV4dEVtcGhhc2lzQ29sb3IpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRQYWdlQnJlYWtCZWZvcmUoRkRFX0NTU1BBR0VCUkVBSyBlUGFnZUJyZWFrQmVmb3JlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0UGFnZUJyZWFrQWZ0ZXIoRkRFX0NTU1BBR0VCUkVBSyBlUGFnZUJyZWFrQWZ0ZXIpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRQYWdlQnJlYWtJbnNpZGUoRkRFX0NTU1BBR0VCUkVBSyBlUGFnZUJyZWFrSW5zaWRlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0T3JwaGFucyhpbnQzMl90IGlPcnBoYW5zKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0TGluZUJyZWFrKEZERV9DU1NMSU5FQlJFQUsgZUxpbmVCcmVhaykgPSAwOw0KK307DQorY2xhc3MgSUZERV9DU1NCYWNrZ3JvdW5kU3R5bGUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRkRFX0NTU0JhY2tncm91bmRTdHlsZSgpIHt9DQorICB2aXJ0dWFsIEZYX0FSR0IgR2V0QktHQ29sb3IoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKiBHZXRCS0dJbWFnZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRkRFX0NTU0JLR1JFUEVBVCBHZXRCS0dSZXBlYXQoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NCS0dBVFRBQ0hNRU5UIEdldEJLR0F0dGFjaG1lbnQoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NQT0lOVCYgR2V0QktHUG9zaXRpb24oKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0QktHQ29sb3IoRlhfQVJHQiBkd0JLR0NvbG9yKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0QktHUG9zaXRpb24oY29uc3QgRkRFX0NTU1BPSU5UJiBia2dQb3NpdGlvbikgPSAwOw0KK307DQorY2xhc3MgSUZERV9DU1NMaXN0U3R5bGUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRkRFX0NTU0xpc3RTdHlsZSgpIHt9DQorICB2aXJ0dWFsIEZERV9DU1NMSVNUU1RZTEVUWVBFIEdldExpc3RTdHlsZVR5cGUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NMSVNUU1RZTEVQT1NJVElPTiBHZXRMaXN0U3R5bGVQb3NpdGlvbigpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgY29uc3QgRlhfV0NIQVIqIEdldExpc3RTdHlsZUltYWdlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldExpc3RTdHlsZVR5cGUoRkRFX0NTU0xJU1RTVFlMRVRZUEUgZUxpc3RTdHlsZVR5cGUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRMaXN0U3R5bGVQb3NpdGlvbigNCisgICAgICBGREVfQ1NTTElTVFNUWUxFUE9TSVRJT04gZUxpc3RTdHlsZVBvc2l0aW9uKSA9IDA7DQorfTsNCitjbGFzcyBJRkRFX0NTU1RhYmxlU3R5bGUgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRkRFX0NTU1RhYmxlU3R5bGUoKSB7fQ0KKyAgdmlydHVhbCBGREVfQ1NTQ0FQVElPTlNJREUgR2V0Q2FwdGlvblNpZGUoKSBjb25zdCA9IDA7DQorfTsNCitjbGFzcyBJRkRFX0NTU1Zpc3VhbFN0eWxlIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZERV9DU1NWaXN1YWxTdHlsZSgpIHt9DQorICB2aXJ0dWFsIEZERV9DU1NWSVNJQklMSVRZIEdldFZpc2liaWxpdHkoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NPVkVSRkxPVyBHZXRPdmVyZmxvd1goKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZERV9DU1NPVkVSRkxPVyBHZXRPdmVyZmxvd1koKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0VmlzaWJpbGl0eShGREVfQ1NTVklTSUJJTElUWSBlVmlzaWJpbGl0eSkgPSAwOw0KK307DQorY2xhc3MgSUZERV9DU1NDb21wdXRlZFN0eWxlIDogcHVibGljIElGWF9Vbmtub3duIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB2b2lkIFJlc2V0KCkgPSAwOw0KKyAgdmlydHVhbCBJRkRFX0NTU0ZvbnRTdHlsZSogR2V0Rm9udFN0eWxlcygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgSUZERV9DU1NCb3VuZGFyeVN0eWxlKiBHZXRCb3VuZGFyeVN0eWxlcygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgSUZERV9DU1NQb3NpdGlvblN0eWxlKiBHZXRQb3NpdGlvblN0eWxlcygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgSUZERV9DU1NQYXJhZ3JhcGhTdHlsZSogR2V0UGFyYWdyYXBoU3R5bGVzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBJRkRFX0NTU0JhY2tncm91bmRTdHlsZSogR2V0QmFja2dyb3VuZFN0eWxlcygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgSUZERV9DU1NWaXN1YWxTdHlsZSogR2V0VmlzdWFsU3R5bGVzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBJRkRFX0NTU0xpc3RTdHlsZSogR2V0TGlzdFN0eWxlcygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgSUZERV9DU1NNdWx0aUNvbHVtblN0eWxlKiBHZXRNdWx0aUNvbHVtblN0eWxlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBJRkRFX0NTU1RhYmxlU3R5bGUqIEdldFRhYmxlU3R5bGUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIElGREVfQ1NTR2VuZXJhdGVkQ29udGVudFN0eWxlKiBHZXRHZW5lcmF0ZWRDb250ZW50U3R5bGUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIElGREVfQ1NTUnVieVN0eWxlKiBHZXRSdWJ5U3R5bGUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0Q3VzdG9tU3R5bGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpIGNvbnN0ID0gMDsNCit9Ow0KK2VudW0gRkRFX0NTU1NUWUxFU0hFRVRHUk9VUCB7DQorICBGREVfQ1NTU1RZTEVTSEVFVEdST1VQX1VzZXJBZ2VudCwNCisgIEZERV9DU1NTVFlMRVNIRUVUR1JPVVBfVXNlciwNCisgIEZERV9DU1NTVFlMRVNIRUVUR1JPVVBfQXV0aG9yLA0KKyAgRkRFX0NTU1NUWUxFU0hFRVRHUk9VUF9NQVgsDQorfTsNCitlbnVtIEZERV9DU1NTVFlMRVNIRUVUUFJJT1JJVFkgew0KKyAgRkRFX0NTU1NUWUxFU0hFRVRQUklPUklUWV9IaWdoLA0KKyAgRkRFX0NTU1NUWUxFU0hFRVRQUklPUklUWV9NaWQsDQorICBGREVfQ1NTU1RZTEVTSEVFVFBSSU9SSVRZX0xvdywNCisgIEZERV9DU1NTVFlMRVNIRUVUUFJJT1JJVFlfTUFYLA0KK307DQorY2xhc3MgSUZERV9DU1NUYWdQcm92aWRlciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGREVfQ1NTVGFnUHJvdmlkZXIoKSB7fQ0KKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZ0MgR2V0VGFnTmFtZSgpID0gMDsNCisgIHZpcnR1YWwgRlhfUE9TSVRJT04gR2V0Rmlyc3RBdHRyaWJ1dGUoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0TmV4dEF0dHJpYnV0ZShGWF9QT1NJVElPTiYgcG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDJiB3c0F0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUpID0gMDsNCit9Ow0KK2NsYXNzIElGREVfQ1NTQWNjZWxlcmF0b3Igew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRkRFX0NTU0FjY2VsZXJhdG9yKCkge30NCisgIHZpcnR1YWwgdm9pZCBPbkVudGVyVGFnKElGREVfQ1NTVGFnUHJvdmlkZXIqIHBUYWcpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBPbkxlYXZlVGFnKElGREVfQ1NTVGFnUHJvdmlkZXIqIHBUYWcpID0gMDsNCit9Ow0KK2NsYXNzIElGREVfQ1NTU3R5bGVTZWxlY3RvciB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRkRFX0NTU1N0eWxlU2VsZWN0b3IqIENyZWF0ZSgpOw0KKyAgdmlydHVhbCB+SUZERV9DU1NTdHlsZVNlbGVjdG9yKCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEZvbnRNZ3IoSUZYX0ZvbnRNZ3IqIHBGb250TWdyKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0RGVmRm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0U3R5bGVTaGVldChGREVfQ1NTU1RZTEVTSEVFVEdST1VQIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NTdHlsZVNoZWV0KiBwU2hlZXQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRTdHlsZVNoZWV0cyhGREVfQ1NTU1RZTEVTSEVFVEdST1VQIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGREVfQ1NTU3R5bGVTaGVldEFycmF5KiBwQXJyYXkpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRTdHlsZVByaW9yaXR5KEZERV9DU1NTVFlMRVNIRUVUR1JPVVAgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTU1RZTEVTSEVFVFBSSU9SSVRZIGVQcmlvcml0eSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFVwZGF0ZVN0eWxlSW5kZXgoRlhfRFdPUkQgZHdNZWRpYUxpc3QpID0gMDsNCisgIHZpcnR1YWwgSUZERV9DU1NBY2NlbGVyYXRvciogSW5pdEFjY2VsZXJhdG9yKCkgPSAwOw0KKyAgdmlydHVhbCBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIENyZWF0ZUNvbXB1dGVkU3R5bGUoDQorICAgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwUGFyZW50U3R5bGUpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBNYXRjaERlY2xhcmF0aW9ucygNCisgICAgICBJRkRFX0NTU1RhZ1Byb3ZpZGVyKiBwVGFnLA0KKyAgICAgIENGREVfQ1NTRGVjbGFyYXRpb25BcnJheSYgbWF0Y2hlZERlY2xzLA0KKyAgICAgIEZERV9DU1NQRVJTVURPIGVQZXJzdWRvVHlwZSA9IEZERV9DU1NQRVJTVURPX05PTkUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBDb21wdXRlU3R5bGUoSUZERV9DU1NUYWdQcm92aWRlciogcFRhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSUZERV9DU1NEZWNsYXJhdGlvbioqIHBwRGVjbEFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEZWNsQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcERlc3RTdHlsZSkgPSAwOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfaW1nLmggYi94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9pbWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTc2OGZjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfaW1nLmgKQEAgLTAsMCArMSw4NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GREVfSU1BR0UNCisjZGVmaW5lIF9GREVfSU1BR0UNCitjbGFzcyBJRkRFX0ltYWdlOw0KKyNkZWZpbmUgRkRFX0lNQUdFRk9STUFUX1Vua25vd24gLTENCisjZGVmaW5lIEZERV9JTUFHRUZPUk1BVF9CTVAgMA0KKyNkZWZpbmUgRkRFX0lNQUdFRk9STUFUX0dJRiAxDQorI2RlZmluZSBGREVfSU1BR0VGT1JNQVRfSlBFRyAyDQorI2RlZmluZSBGREVfSU1BR0VGT1JNQVRfUE5HIDMNCisjZGVmaW5lIEZERV9JTUFHRUZPUk1BVF9USUZGIDQNCisjZGVmaW5lIEZERV9JTUFHRUZPUk1BVF9KUEVHMjAwMCA1DQorI2RlZmluZSBGREVfSU1BR0VGT1JNQVRfSkJpZzIgNg0KK2NsYXNzIElGREVfSW1hZ2Ugew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZERV9JbWFnZSogQ3JlYXRlKElGWF9TdHJlYW0qIHBTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZvcm1hdCA9IEZERV9JTUFHRUZPUk1BVF9Vbmtub3duKTsNCisgIHZpcnR1YWwgfklGREVfSW1hZ2UoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgTG9hZEltYWdlKCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEZyZWVJbWFnZSgpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudEZyYW1lcygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBMb2FkRnJhbWUoaW50MzJfdCBpbmRleCkgPSAwOw0KKyAgdmlydHVhbCBDRlhfRElCaXRtYXAqIEdldEZyYW1lSW1hZ2UoKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0SW1hZ2VGb3JtYXQoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0SW1hZ2VXaWR0aCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRJbWFnZUhlaWdodCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXREZWxheVRpbWUoaW50MzJfdCBpRnJhbWVJbmRleCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldExvb3BDb3VudCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTdGFydExvYWRJbWFnZShDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRpYlgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkaWJZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGliQ1gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkaWJDWSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGltZ1gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbWdZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW1nQ1gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbWdDWSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlGcmFtZUluZGV4ID0gMCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IERvTG9hZEltYWdlKElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFN0b3BMb2FkSW1hZ2UoKSA9IDA7DQorfTsNCisjZGVmaW5lIEZERV9JTUFHRUZJTFRFUl9Vbmtub3duIC0xDQorI2RlZmluZSBGREVfSU1BR0VGSUxURVJfT3BhY2l0eSAwDQorI2RlZmluZSBGREVfSU1BR0VGSUxURVJfR3JheVNjYWxlIDENCisjZGVmaW5lIEZERV9JTUFHRUZJTFRFUl9CbGFja1doaXRlIDINCisjZGVmaW5lIEZERV9JTUFHRUZJTFRFUl9JbnZlcnRDb2xvciAzDQorI2RlZmluZSBGREVfSU1BR0VGSUxURVJfVHJhbnNwYXJlbnRDb2xvciA0DQorI2RlZmluZSBGREVfSU1BR0VGSUxURVJfTWFza0NvbG9yIDUNCisjZGVmaW5lIEZERV9JTUFHRUZJTFRFUl9CcmlnaHRuZXNzIDYNCisjZGVmaW5lIEZERV9JTUFHRUZJTFRFUl9Db250cmFzdCA3DQordHlwZWRlZiBzdHJ1Y3QgX0ZERV9JTUFHRUZJTFRFUlBBUkFNUyA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgIGludDMyX3QgaUZpbHRlclR5cGU7DQorfSBGREVfSU1BR0VGSUxURVJQQVJBTVMsICpGREVfTFBJTUFHRUZJTFRFUlBBUkFNUzsNCit0eXBlZGVmIEZERV9JTUFHRUZJTFRFUlBBUkFNUyBjb25zdCogRkRFX0xQQ0lNQUdFRklMVEVSUEFSQU1TOw0KK3R5cGVkZWYgc3RydWN0IF9GREVfT1BBQ0lUWVBBUkFNUyA6IHB1YmxpYyBGREVfSU1BR0VGSUxURVJQQVJBTVMgew0KKyAgaW50MzJfdCBpT3BhY2l0eTsNCit9IEZERV9PUEFDSVRZUEFSQU1TLCAqRkRFX0xQT1BBQ0lUWVBBUkFNUzsNCit0eXBlZGVmIEZERV9PUEFDSVRZUEFSQU1TIGNvbnN0KiBGREVfTFBDT1BBQ0lUWVBBUkFNUzsNCit0eXBlZGVmIHN0cnVjdCBfRkRFX0JMQUNLV0hJVEVQQVJBTVMgOiBwdWJsaWMgRkRFX0lNQUdFRklMVEVSUEFSQU1TIHsNCisgIEZYX0FSR0IgZHdCbGFja0NvbG9yOw0KKyAgRlhfQVJHQiBkd1doaXRlQ29sb3I7DQorfSBGREVfQkxBQ0tXSElURVBBUkFNUywgKkZERV9MUEJMQUNLV0hJVEVQQVJBTVM7DQordHlwZWRlZiBGREVfQkxBQ0tXSElURVBBUkFNUyBjb25zdCogRkRFX0xQQ0JMQUNLV0hJVEVQQVJBTVM7DQordHlwZWRlZiBzdHJ1Y3QgX0ZERV9UUkFOU1BBUkVOVFBBUkFNUyA6IHB1YmxpYyBGREVfSU1BR0VGSUxURVJQQVJBTVMgew0KKyAgRlhfQVJHQiBjb2xvcjsNCit9IEZERV9UUkFOU1BBUkVOVFBBUkFNUywgKkZERV9MUFRSQU5TUEFSRU5UUEFSQU1TOw0KK3R5cGVkZWYgRkRFX1RSQU5TUEFSRU5UUEFSQU1TIGNvbnN0KiBGREVfTFBDVFJBTlNQQVJFTlRQQVJBTVM7DQordHlwZWRlZiBzdHJ1Y3QgX0ZERV9NQVNLQ09MT1JQQVJBTVMgOiBwdWJsaWMgRkRFX0lNQUdFRklMVEVSUEFSQU1TIHsNCisgIEZYX0FSR0IgY29sb3I7DQorfSBGREVfTUFTS0NPTE9SUEFSQU1TLCAqRkRFX0xQTUFTS0NPTE9SUEFSQU1TOw0KK3R5cGVkZWYgRkRFX01BU0tDT0xPUlBBUkFNUyBjb25zdCogRkRFX0xQQ01BU0tDT0xPUlBBUkFNUzsNCit0eXBlZGVmIHN0cnVjdCBfRkRFX0JSSUdIVE5FU1NQQVJBTVMgOiBwdWJsaWMgRkRFX0lNQUdFRklMVEVSUEFSQU1TIHsNCisgIGludDMyX3QgaUJyaWdodG5lc3M7DQorfSBGREVfQlJJR0hUTkVTU1BBUkFNUywgKkZERV9MUEJSSUdIVE5FU1NQQVJBTVM7DQordHlwZWRlZiBGREVfQlJJR0hUTkVTU1BBUkFNUyBjb25zdCogRkRFX0xQQ0JSSUdIVE5FU1NQQVJBTVM7DQordHlwZWRlZiBzdHJ1Y3QgX0ZERV9DT05UUkFTVFBBUkFNUyA6IHB1YmxpYyBGREVfSU1BR0VGSUxURVJQQVJBTVMgew0KKyAgaW50MzJfdCBpQ29udHJhc3Q7DQorfSBGREVfQ09OVFJBU1RQQVJBTVMsICpGREVfTFBDT05UUkFTVFBBUkFNUzsNCit0eXBlZGVmIEZERV9DT05UUkFTVFBBUkFNUyBjb25zdCogRkRFX0xQQ0NPTlRSQVNUUEFSQU1TOw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX21lbS5oIGIveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfbWVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVjZjAzNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX21lbS5oCkBAIC0wLDAgKzEsMTcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorLy8gVE9ETyh0aGVzdGlnKTogUmVtb3ZlIHRoaXMgZmlsZSBhbmQgZG8gSVdZVS4NCisNCisjaWZuZGVmIEZERV9NRU1fSF8NCisjZGVmaW5lIEZERV9NRU1fSF8NCisNCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X21lbW9yeS5oIg0KKw0KKyNkZWZpbmUgRkRFX05ld1dpdGggRlhUQVJHRVRfTmV3V2l0aA0KKyNkZWZpbmUgRkRFX0RlbGV0ZVdpdGggRlhUQVJHRVRfRGVsZXRlV2l0aA0KKw0KKyNlbmRpZiAgLy8gRkRFX01FTV9IXw0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Blbi5oIGIveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfcGVuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjZWIzMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Blbi5oCkBAIC0wLDAgKzEsNjQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRkRFX1BFTg0KKyNkZWZpbmUgX0ZERV9QRU4NCitjbGFzcyBJRkRFX1BlbjsNCisjZGVmaW5lIEZERV9QRU5UWVBFX1Vua25vd24gRkRFX0JSVVNIVFlQRV9Vbmtub3duDQorI2RlZmluZSBGREVfUEVOVFlQRV9Tb2xpZENvbG9yIEZERV9CUlVTSFRZUEVfU29saWQNCisjZGVmaW5lIEZERV9QRU5UWVBFX0hhdGNoQnJ1c2ggRkRFX0JSVVNIVFlQRV9IYXRjaA0KKyNkZWZpbmUgRkRFX1BFTlRZUEVfVGV4dHVyZUJydXNoIEZERV9CUlVTSFRZUEVfVGV4dHVyZQ0KKyNkZWZpbmUgRkRFX1BFTlRZUEVfTGluZWFyR3JhZGllbnQgRkRFX0JSVVNIVFlQRV9MaW5lYXJHcmFkaWVudA0KKyNkZWZpbmUgRkRFX1BFTlRZUEVfTUFYIEZERV9CUlVTSFRZUEVfTUFYDQorI2RlZmluZSBGREVfREFTSFNUWUxFX1NvbGlkIDANCisjZGVmaW5lIEZERV9EQVNIU1RZTEVfRGFzaCAxDQorI2RlZmluZSBGREVfREFTSFNUWUxFX0RvdCAyDQorI2RlZmluZSBGREVfREFTSFNUWUxFX0Rhc2hEb3QgMw0KKyNkZWZpbmUgRkRFX0RBU0hTVFlMRV9EYXNoRG90RG90IDQNCisjZGVmaW5lIEZERV9EQVNIU1RZTEVfQ3VzdG9taXplZCA1DQorI2RlZmluZSBGREVfTElORUpPSU5fTWl0ZXIgMA0KKyNkZWZpbmUgRkRFX0xJTkVKT0lOX1JvdW5kIDENCisjZGVmaW5lIEZERV9MSU5FSk9JTl9CZXZlbCAyDQorI2RlZmluZSBGREVfTElORUNBUF9GbGF0IDANCisjZGVmaW5lIEZERV9MSU5FQ0FQX1JvdW5kIDENCisjZGVmaW5lIEZERV9MSU5FQ0FQX1NxdWFyZSAyDQordHlwZWRlZiBzdHJ1Y3QgX0ZERV9DT01QT1VORFBBVFRFUk4gew0KKyAgRlhfRkxPQVQgcG9zOw0KKyAgRlhfRkxPQVQgd2lkdGg7DQorfSBGREVfQ09NUE9VTkRQQVRURVJOLCAqRkRFX0xQQ09NUE9VTkRQQVRURVJOOw0KK3R5cGVkZWYgRkRFX0NPTVBPVU5EUEFUVEVSTiBjb25zdCogRkRFX0xQQ0NPTVBPVU5EUEFUVEVSTjsNCit0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPEZERV9DT01QT1VORFBBVFRFUk4+IENGREVfQ29tcG91bmRQYXR0ZXJuczsNCisNCitjbGFzcyBJRkRFX1BlbiB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRkRFX1BlbiogQ3JlYXRlKCk7DQorICB2aXJ0dWFsIH5JRkRFX1BlbigpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRUeXBlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9BUkdCIEdldENvbG9yKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldENvbG9yKEZYX0FSR0IgY29sb3IpID0gMDsNCisgIHZpcnR1YWwgSUZERV9CcnVzaCogR2V0QnJ1c2goKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0QnJ1c2goSUZERV9CcnVzaCogcEJydXNoLCBGWF9CT09MIGJBdXRvUmVsZWFzZSkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldExpbmVDYXAoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0TGluZUNhcChpbnQzMl90IGlMaW5lQ2FwKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0RGFzaFN0eWxlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldERhc2hTdHlsZShpbnQzMl90IGlEYXNoU3R5bGUpID0gMDsNCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0RGFzaFBoYXNlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldERhc2hQaGFzZShGWF9GTE9BVCBmUGhhc2UpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudERhc2hBcnJheSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXREYXNoQXJyYXkoQ0ZYX0Zsb2F0QXJyYXkmIGRhc2hBcnJheSkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldERhc2hBcnJheShjb25zdCBDRlhfRmxvYXRBcnJheSYgZGFzaEFycmF5KSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0TGluZUpvaW4oKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0TGluZUpvaW4oaW50MzJfdCBpTGluZUpvaW4pID0gMDsNCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0TWl0ZXJMaW1pdCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRNaXRlckxpbWl0KEZYX0ZMT0FUIGZNaXRlckxpbWl0KSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRDb21wb3VuZFBhdHRlcm5zKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldENvbXBvdW5kUGF0dGVybnMoDQorICAgICAgQ0ZERV9Db21wb3VuZFBhdHRlcm5zJiBjb21wb3VuZFBhdHRlcm5zKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Q29tcG91bmRQYXR0ZXJucygNCisgICAgICBjb25zdCBDRkRFX0NvbXBvdW5kUGF0dGVybnMmIGNvbXBvdW5kUGF0dGVybnMpID0gMDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Bzci5oIGIveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfcHNyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxY2E0YwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Bzci5oCkBAIC0wLDAgKzEsMTA1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZERV9QQVJTRVINCisjZGVmaW5lIF9GREVfUEFSU0VSDQorZW51bSBGREVfVklTVUFMT0JKVFlQRSB7DQorICBGREVfVklTVUFMT0JKX0NhbnZhcyA9IDB4MDAsDQorICBGREVfVklTVUFMT0JKX1RleHQgPSAweDAxLA0KKyAgRkRFX1ZJU1VBTE9CSl9JbWFnZSA9IDB4MDIsDQorICBGREVfVklTVUFMT0JKX1BhdGggPSAweDA0LA0KKyAgRkRFX1ZJU1VBTE9CSl9XaWRnZXQgPSAweDA4LA0KK307DQordHlwZWRlZiBzdHJ1Y3QgX0ZERV9IVklTVUFMT0JKIHsgdm9pZCogcERhdGE7IH0gY29uc3QqIEZERV9IVklTVUFMT0JKOw0KK2NsYXNzIElGREVfVmlzdWFsU2V0IHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZERV9WaXN1YWxTZXQoKSB7fQ0KKyAgdmlydHVhbCBGREVfVklTVUFMT0JKVFlQRSBHZXRUeXBlKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldEJCb3goRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX1JlY3RGJiBiYm94KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0TWF0cml4KEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmosIENGWF9NYXRyaXgmIG1hdHJpeCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldFJlY3QoRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX1JlY3RGJiBydCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldENsaXAoRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX1JlY3RGJiBydCkgPSAwOw0KK307DQorY2xhc3MgSUZERV9DYW52YXNTZXQgOiBwdWJsaWMgSUZERV9WaXN1YWxTZXQgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIEZYX1BPU0lUSU9OIEdldEZpcnN0UG9zaXRpb24oRkRFX0hWSVNVQUxPQkogaENhbnZhcykgPSAwOw0KKyAgdmlydHVhbCBGREVfSFZJU1VBTE9CSiBHZXROZXh0KEZERV9IVklTVUFMT0JKIGhDYW52YXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfUE9TSVRJT04mIHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1Zpc3VhbFNldComIHBWaXN1YWxTZXQpID0gMDsNCisgIHZpcnR1YWwgRkRFX0hWSVNVQUxPQkogR2V0UGFyZW50Q2FudmFzKEZERV9IVklTVUFMT0JKIGhDYW52YXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1Zpc3VhbFNldComIHBWaXN1YWxTZXQpID0gMDsNCit9Ow0KK2NsYXNzIElGREVfVGV4dFNldCA6IHB1YmxpYyBJRkRFX1Zpc3VhbFNldCB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRTdHJpbmcoRkRFX0hWSVNVQUxPQkogaFRleHQsIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpID0gMDsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIEdldEZvbnQoRkRFX0hWSVNVQUxPQkogaFRleHQpID0gMDsNCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0Rm9udFNpemUoRkRFX0hWSVNVQUxPQkogaFRleHQpID0gMDsNCisgIHZpcnR1YWwgRlhfQVJHQiBHZXRGb250Q29sb3IoRkRFX0hWSVNVQUxPQkogaFRleHQpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXREaXNwbGF5UG9zKEZERV9IVklTVUFMT0JKIGhUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nKiBwV1NGb3JtcyA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDaGFyUmVjdHMoRkRFX0hWSVNVQUxPQkogaFRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RkFycmF5JiBydEFycmF5KSA9IDA7DQorfTsNCitjbGFzcyBJRkRFX0ltYWdlU2V0IDogcHVibGljIElGREVfVmlzdWFsU2V0IHsNCisgcHVibGljOg0KKyAgdmlydHVhbCBJRkRFX0ltYWdlKiBHZXRJbWFnZShGREVfSFZJU1VBTE9CSiBoSW1hZ2UpID0gMDsNCisgIHZpcnR1YWwgRlhfUE9TSVRJT04gR2V0Rmlyc3RGaWx0ZXJQb3NpdGlvbihGREVfSFZJU1VBTE9CSiBoSW1hZ2UpID0gMDsNCisgIHZpcnR1YWwgRkRFX0xQQ0lNQUdFRklMVEVSUEFSQU1TIEdldE5leHRGaWx0ZXIoRkRFX0hWSVNVQUxPQkogaEltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9QT1NJVElPTiYgcG9zKSA9IDA7DQorfTsNCisjZGVmaW5lIEZERV9GSUxMTU9ERV9BbHRlcm5hdGUgMQ0KKyNkZWZpbmUgRkRFX0ZJTExNT0RFX1dpbmRpbmcgMg0KKyNkZWZpbmUgRkRFX1BBVEhSRU5ERVJfU3Ryb2tlIDENCisjZGVmaW5lIEZERV9QQVRIUkVOREVSX0ZpbGwgMg0KKyNkZWZpbmUgRkRFX1BBVEhSRU5ERVJfRmlsbFN0cm9rZSAzDQorY2xhc3MgSUZERV9QYXRoU2V0IDogcHVibGljIElGREVfVmlzdWFsU2V0IHsNCisgcHVibGljOg0KKyAgdmlydHVhbCBJRkRFX1BhdGgqIEdldFBhdGgoRkRFX0hWSVNVQUxPQkogaFBhdGgpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRGaWxsTW9kZShGREVfSFZJU1VBTE9CSiBoUGF0aCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFJlbmRlck1vZGUoRkRFX0hWSVNVQUxPQkogaFBhdGgpID0gMDsNCisgIHZpcnR1YWwgSUZERV9QZW4qIEdldFBlbihGREVfSFZJU1VBTE9CSiBoUGF0aCkgPSAwOw0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRQZW5XaWR0aChGREVfSFZJU1VBTE9CSiBoUGF0aCkgPSAwOw0KKyAgdmlydHVhbCBJRkRFX0JydXNoKiBHZXRCcnVzaChGREVfSFZJU1VBTE9CSiBoUGF0aCkgPSAwOw0KK307DQorZW51bSBGREVfV0lER0VUT0JKIHsNCisgIEZERV9XSURHRVRPQkpfVW5rbm93biA9IDB4MDAwMCwNCisgIEZERV9XSURHRVRPQkpfQW5jaG9yID0gMHgwMTAwLA0KKyAgRkRFX1dJREdFVE9CSl9OYW1lZERlc3QgPSAweDAyMDAsDQorICBGREVfV0lER0VUT0JKX0h5cGVyTGluayA9IDB4MDQwMCwNCit9Ow0KKyNkZWZpbmUgRkRFX1dJREdFVFBBUkFNX1VyaSAxDQorI2RlZmluZSBGREVfV0lER0VUUEFSQU1fUmVjdHMgMg0KK2NsYXNzIElGREVfV2lkZ2V0U2V0IDogcHVibGljIElGREVfVmlzdWFsU2V0IHsNCisgcHVibGljOg0KKyAgdmlydHVhbCBGREVfV0lER0VUT0JKIEdldFdpZGdldFR5cGUoRkRFX0hWSVNVQUxPQkogaFdpZGdldCkgPSAwOw0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRGbG9hdChGREVfSFZJU1VBTE9CSiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQYXJhbWV0ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZEZWZWYWwgPSAwLjBmKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0SW50ZWdlcihGREVfSFZJU1VBTE9CSiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUGFyYW1ldGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGVmVmFsID0gMCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldFN0cmluZyhGREVfSFZJU1VBTE9CSiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQYXJhbWV0ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0UmVjdHMoRkRFX0hWSVNVQUxPQkogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQYXJhbWV0ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGQXJyYXkmIHJlY3RzKSA9IDA7DQorfTsNCitjbGFzcyBJRkRFX1Zpc3VhbFNldEl0ZXJhdG9yIHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGREVfVmlzdWFsU2V0SXRlcmF0b3IqIENyZWF0ZSgpOw0KKyAgdmlydHVhbCB+SUZERV9WaXN1YWxTZXRJdGVyYXRvcigpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBBdHRhY2hDYW52YXMoSUZERV9DYW52YXNTZXQqIHBDYW52YXMpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBGaWx0ZXJPYmplY3RzKEZYX0RXT1JEIGR3T2JqZWN0cyA9IDB4RkZGRkZGRkYpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBSZXNldCgpID0gMDsNCisgIHZpcnR1YWwgRkRFX0hWSVNVQUxPQkogR2V0TmV4dChJRkRFX1Zpc3VhbFNldComIHBWaXN1YWxTZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0hWSVNVQUxPQkoqIHBoQ2FudmFzT2JqID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NhbnZhc1NldCoqIHBwQ2FudmFzU2V0ID0gTlVMTCkgPSAwOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfcHRoLmggYi94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9wdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTI1ZjVjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfcHRoLmgKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GREVfUEFUSA0KKyNkZWZpbmUgX0ZERV9QQVRIDQorY2xhc3MgSUZERV9QYXRoOw0KK2NsYXNzIElGREVfUGF0aCB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRkRFX1BhdGgqIENyZWF0ZSgpOw0KKyAgdmlydHVhbCB+SUZERV9QYXRoKCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFN0YXJ0RmlndXJlKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIENsb3NlRmlndXJlKCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEFkZEJlemllcihjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgQWRkQmV6aWVycyhjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgQWRkQ3VydmUoY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDbG9zZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRlbnNpb24gPSAwLjVmKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgQWRkRWxsaXBzZShjb25zdCBDRlhfUmVjdEYmIHJlY3QpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBBZGRMaW5lcyhjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgQWRkTGluZShjb25zdCBDRlhfUG9pbnRGJiBwdDEsIGNvbnN0IENGWF9Qb2ludEYmIHB0MikgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEFkZFBhdGgoY29uc3QgSUZERV9QYXRoKiBwU3JjLCBGWF9CT09MIGJDb25uZWN0KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgQWRkUG9seWdvbihjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgQWRkUmVjdGFuZ2xlKGNvbnN0IENGWF9SZWN0RiYgcmVjdCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldEJCb3goQ0ZYX1JlY3RGJiBiYm94KSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0QkJveChDRlhfUmVjdEYmIGJib3gsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTGluZVdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1pdGVyTGltaXQpIGNvbnN0ID0gMDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Jkci5oIGIveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfcmRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIwY2NmNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Jkci5oCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRkRFX1JFTkRFUkNPTlRFWFQNCisjZGVmaW5lIF9GREVfUkVOREVSQ09OVEVYVA0KK2NsYXNzIElGREVfUGFnZTsNCitjbGFzcyBJRkRFX1JlbmRlckRldmljZTsNCisNCit2b2lkIEZERV9HZXRQYWdlTWF0cml4KENGWF9NYXRyaXgmIHBhZ2VNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIGRvY1BhZ2VSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3QmIGRldmljZVBhZ2VSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDb29yZGluYXRlc1R5cGUgPSAwKTsNCitlbnVtIEZERV9SRU5ERVJTVEFUVVMgew0KKyAgRkRFX1JFTkRFUlNUQVRVU19SZXNldCA9IDAsDQorICBGREVfUkVOREVSU1RBVFVTX1BhdXNlZCwNCisgIEZERV9SRU5ERVJTVEFUVVNfRG9uZSwNCisgIEZERV9SRU5ERVJTVEFUVVNfRmFpbGVkLA0KK307DQorDQorY2xhc3MgSUZERV9SZW5kZXJDb250ZXh0IHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGREVfUmVuZGVyQ29udGV4dCogQ3JlYXRlKCk7DQorICB2aXJ0dWFsIH5JRkRFX1JlbmRlckNvbnRleHQoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU3RhcnRSZW5kZXIoSUZERV9SZW5kZXJEZXZpY2UqIHBSZW5kZXJEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DYW52YXNTZXQqIHBDYW52YXNTZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgdG1Eb2MyRGV2aWNlKSA9IDA7DQorICB2aXJ0dWFsIEZERV9SRU5ERVJTVEFUVVMgR2V0U3RhdHVzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfUkVOREVSU1RBVFVTIERvUmVuZGVyKElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFN0b3BSZW5kZXIoKSA9IDA7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9yZHYuaCBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3Jkdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZDA0NmQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9pbmNsdWRlL2ZkZV9yZHYuaApAQCAtMCwwICsxLDEwMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GREVfUkVOREVSREVWSUNFDQorI2RlZmluZSBfRkRFX1JFTkRFUkRFVklDRQ0KK2NsYXNzIElGREVfUGVuOw0KK2NsYXNzIElGREVfQnJ1c2g7DQorY2xhc3MgSUZERV9JbWFnZTsNCitjbGFzcyBDRlhfRElCaXRtYXA7DQorY2xhc3MgQ0ZYX0RJQlNvdXJjZTsNCisNCit0eXBlZGVmIHN0cnVjdCBfRkRFX0hERVZJQ0VTVEFURSB7IHZvaWQqIHBEYXRhOyB9ICogRkRFX0hERVZJQ0VTVEFURTsNCisNCitjbGFzcyBJRkRFX1JlbmRlckRldmljZSB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRkRFX1JlbmRlckRldmljZSogQ3JlYXRlKENGWF9ESUJpdG1hcCogcEJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJnYkJ5dGVPcmRlciA9IEZBTFNFKTsNCisgIHN0YXRpYyBJRkRFX1JlbmRlckRldmljZSogQ3JlYXRlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UpOw0KKyAgdmlydHVhbCB+SUZERV9SZW5kZXJEZXZpY2UoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorDQorICB2aXJ0dWFsIGludDMyX3QgR2V0V2lkdGgoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0SGVpZ2h0KCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGREVfSERFVklDRVNUQVRFIFNhdmVTdGF0ZSgpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBSZXN0b3JlU3RhdGUoRkRFX0hERVZJQ0VTVEFURSBoU3RhdGUpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRDbGlwUGF0aChjb25zdCBJRkRFX1BhdGgqIHBDbGlwKSA9IDA7DQorICB2aXJ0dWFsIElGREVfUGF0aCogR2V0Q2xpcFBhdGgoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Q2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3RGJiBydENsaXApID0gMDsNCisgIHZpcnR1YWwgY29uc3QgQ0ZYX1JlY3RGJiBHZXRDbGlwUmVjdCgpID0gMDsNCisNCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0RHBpWCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0RHBpWSgpIGNvbnN0ID0gMDsNCisNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3SW1hZ2UoQ0ZYX0RJQlNvdXJjZSogcERpYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwU3JjUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBkc3RSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwSW1nTWF0cml4ID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcERldk1hdHJpeCA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3U3RyaW5nKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Gb250KiBwRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3QmV6aWVyKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3Q3VydmUoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2xvc2VkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVGVuc2lvbiA9IDAuNWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd0VsbGlwc2UoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdMaW5lcyhJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdMaW5lKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd1BhdGgoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElGREVfUGF0aCogcFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3UG9seWdvbihJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdSZWN0YW5nbGUoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEZpbGxDbG9zZWRDdXJ2ZShJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludHNGJiBwb2ludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUZW5zaW9uID0gMC41ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBGaWxsRWxsaXBzZShJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgRmlsbFBhdGgoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElGREVfUGF0aCogcFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBGaWxsUG9seWdvbihJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEZpbGxSZWN0YW5nbGUoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpID0gMDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3R0by5oIGIveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfdHRvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3YTEzYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3R0by5oCkBAIC0wLDAgKzEsOTcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRkRFX1RFWFRPVVQNCisjZGVmaW5lIF9GREVfVEVYVE9VVA0KK2NsYXNzIElGREVfVGV4dE91dDsNCisjZGVmaW5lIEZERV9UVE9TVFlMRV9VbmRlcmxpbmUgMHgwMDAxDQorI2RlZmluZSBGREVfVFRPU1RZTEVfU3RyaWtlb3V0IDB4MDAwMg0KKyNkZWZpbmUgRkRFX1RUT1NUWUxFX1ZlcnRpY2FsTGF5b3V0IDB4MDAwNA0KKyNkZWZpbmUgRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmUgMHgwMDEwDQorI2RlZmluZSBGREVfVFRPU1RZTEVfRXhwYW5kVGFiIDB4MDAyMA0KKyNkZWZpbmUgRkRFX1RUT1NUWUxFX0hvdEtleSAweDAwNDANCisjZGVmaW5lIEZERV9UVE9TVFlMRV9FbGxpcHNpcyAweDAwODANCisjZGVmaW5lIEZERV9UVE9TVFlMRV9MaW5lV3JhcCAweDAxMDANCisjZGVmaW5lIEZERV9UVE9TVFlMRV9BcmFiaWNTaGFwZXMgMHgwMjAwDQorI2RlZmluZSBGREVfVFRPU1RZTEVfUlRMIDB4MDQwMA0KKyNkZWZpbmUgRkRFX1RUT1NUWUxFX0FyYWJpY0NvbnRleHQgMHgwODAwDQorI2RlZmluZSBGREVfVFRPU1RZTEVfTGFzdExpbmVIZWlnaHQgMHgxMDAwDQorI2RlZmluZSBGREVfVFRPQUxJR05NRU5UX1RvcExlZnQgMA0KKyNkZWZpbmUgRkRFX1RUT0FMSUdOTUVOVF9Ub3BDZW50ZXIgMQ0KKyNkZWZpbmUgRkRFX1RUT0FMSUdOTUVOVF9Ub3BSaWdodCAyDQorI2RlZmluZSBGREVfVFRPQUxJR05NRU5UX1RvcEF1dG8gMw0KKyNkZWZpbmUgRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJMZWZ0IDQNCisjZGVmaW5lIEZERV9UVE9BTElHTk1FTlRfQ2VudGVyIDUNCisjZGVmaW5lIEZERV9UVE9BTElHTk1FTlRfQ2VudGVyUmlnaHQgNg0KKyNkZWZpbmUgRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJBdXRvIDcNCisjZGVmaW5lIEZERV9UVE9BTElHTk1FTlRfQm90dG9tTGVmdCA4DQorI2RlZmluZSBGREVfVFRPQUxJR05NRU5UX0JvdHRvbUNlbnRlciA5DQorI2RlZmluZSBGREVfVFRPQUxJR05NRU5UX0JvdHRvbVJpZ2h0IDEwDQorI2RlZmluZSBGREVfVFRPQUxJR05NRU5UX0JvdHRvbUF1dG8gMTENCisNCitjbGFzcyBJRkRFX1RleHRPdXQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZERV9UZXh0T3V0KiBDcmVhdGUoKTsNCisgIHZpcnR1YWwgfklGREVfVGV4dE91dCgpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRGb250KElGWF9Gb250KiBwRm9udCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldFRleHRDb2xvcihGWF9BUkdCIGNvbG9yKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0U3R5bGVzKEZYX0RXT1JEIGR3U3R5bGVzKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0VGFiV2lkdGgoRlhfRkxPQVQgZlRhYldpZHRoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0RWxsaXBzaXNTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRWxsaXBzaXMpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRQYXJhZ3JhcGhCcmVha0NoYXIoRlhfV0NIQVIgd2NoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0QWxpZ25tZW50KGludDMyX3QgaUFsaWdubWVudCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldExpbmVTcGFjZShGWF9GTE9BVCBmTGluZVNwYWNlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0RElCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwRElCKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0UmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRDbGlwUmVjdChjb25zdCBDRlhfUmVjdCYgcnRDbGlwKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3RGJiBydENsaXApID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0TGluZUJyZWFrVG9sZXJhbmNlKEZYX0ZMT0FUIGZUb2xlcmFuY2UpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBDYWxjU2l6ZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfU2l6ZSYgc2l6ZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIENhbGNTaXplKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9TaXplRiYgc2l6ZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIENhbGNTaXplKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0JiByZWN0KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgQ2FsY1NpemUoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiByZWN0KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgRHJhd1RleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIERyYXdUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIERyYXdUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0JiByZWN0KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgRHJhd1RleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0TG9naWNDbGlwUmVjdChjb25zdCBDRlhfUmVjdEYmIHJ0Q2xpcCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIENhbGNMb2dpY1NpemUoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9TaXplRiYgc2l6ZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIENhbGNMb2dpY1NpemUoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcmVjdCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIERyYXdMb2dpY1RleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgRHJhd0xvZ2ljVGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0VG90YWxMaW5lcygpID0gMDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3htbC5oIGIveGZhL3NyYy9mZHAvaW5jbHVkZS9mZGVfeG1sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZjODBiNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmRwL2luY2x1ZGUvZmRlX3htbC5oCkBAIC0wLDAgKzEsMjMxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZERV9YTUwNCisjZGVmaW5lIF9GREVfWE1MDQorY2xhc3MgSUZERV9YTUxOb2RlOw0KK2NsYXNzIElGREVfWE1MSW5zdHJ1Y3Rpb247DQorY2xhc3MgSUZERV9YTUxEZWNsYXJhdGlvbjsNCitjbGFzcyBJRkRFX1hNTERlY2xDb21tZW50Ow0KK2NsYXNzIElGREVfWE1MRGVjbENoYXJEYXRhOw0KK2NsYXNzIElGREVfWE1MRGVjbERvY1R5cGU7DQorY2xhc3MgSUZERV9YTUxEZWNsRWxlbWVudDsNCitjbGFzcyBJRkRFX1hNTERlY2xBdHRyaUxpc3Q7DQorY2xhc3MgSUZERV9YTUxEZWNsTm90aXRpb247DQorY2xhc3MgSUZERV9YTUxEZWNsRW50aXR5Ow0KK2NsYXNzIElGREVfWE1MRWxlbWVudDsNCitjbGFzcyBJRkRFX1hNTFRleHQ7DQorY2xhc3MgSUZERV9YTUxEb2M7DQorY2xhc3MgSUZERV9YTUxQYXJzZXI7DQorY2xhc3MgSUZERV9YTUxTeW50YXhQYXJzZXI7DQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmDQorZW51bSBGREVfWE1MTk9ERVRZUEUgew0KKyAgRkRFX1hNTE5PREVfVW5rbm93biA9IDAsDQorICBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbiwNCisgIEZERV9YTUxOT0RFX0VsZW1lbnQsDQorICBGREVfWE1MTk9ERV9UZXh0LA0KKyAgRkRFX1hNTE5PREVfQ2hhckRhdGEsDQorfTsNCit0eXBlZGVmIHN0cnVjdCBfRkRFX1hNTE5PREUgew0KKyAgaW50MzJfdCBpTm9kZU51bTsNCisgIEZERV9YTUxOT0RFVFlQRSBlTm9kZVR5cGU7DQorfSBGREVfWE1MTk9ERSwgKkZERV9MUFhNTE5PREU7DQordHlwZWRlZiBGREVfWE1MTk9ERSBjb25zdCogRkRFX0xQQ1hNTE5PREU7DQordHlwZWRlZiBDRlhfU3RhY2tUZW1wbGF0ZTxGREVfWE1MTk9ERT4gQ0ZERV9YTUxOb2RlU3RhY2s7DQorRlhfQk9PTCBGREVfSXNYTUxWYWxpZENoYXIoRlhfV0NIQVIgY2gpOw0KK0ZYX0JPT0wgRkRFX0lzWE1MV2hpdGVTcGFjZShGWF9XQ0hBUiBjaCk7DQorRlhfQk9PTCBGREVfSXNYTUxOYW1lQ2hhcihGWF9XQ0hBUiBjaCwgRlhfQk9PTCBiRmlyc3RDaGFyKTsNCisjaWZkZWYgX19jcGx1c3BsdXMNCit9DQorI2VuZGlmDQorDQorY2xhc3MgSUZERV9YTUxOb2RlIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZERV9YTUxOb2RlKCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCBGREVfWE1MTk9ERVRZUEUgR2V0VHlwZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudENoaWxkTm9kZXMoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIElGREVfWE1MTm9kZSogR2V0Q2hpbGROb2RlKGludDMyX3QgaW5kZXgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDaGlsZE5vZGVJbmRleChJRkRFX1hNTE5vZGUqIHBOb2RlKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIElGREVfWE1MTm9kZSogR2V0UGF0aChjb25zdCBGWF9XQ0hBUiogcFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGggPSAtMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlF1YWxpZmllZE5hbWUgPSBUUlVFKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgSW5zZXJ0Q2hpbGROb2RlKElGREVfWE1MTm9kZSogcE5vZGUsIGludDMyX3QgaW5kZXggPSAtMSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFJlbW92ZUNoaWxkTm9kZShJRkRFX1hNTE5vZGUqIHBOb2RlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgRGVsZXRlQ2hpbGRyZW4oKSA9IDA7DQorICBlbnVtIE5vZGVJdGVtIHsNCisgICAgUm9vdCA9IDAsDQorICAgIFBhcmVudCwNCisgICAgRmlyc3RTaWJsaW5nLA0KKyAgICBQcmlvclNpYmxpbmcsDQorICAgIE5leHRTaWJsaW5nLA0KKyAgICBMYXN0U2libGluZywNCisgICAgRmlyc3ROZWlnaGJvciwNCisgICAgUHJpb3JOZWlnaGJvciwNCisgICAgTmV4dE5laWdoYm9yLA0KKyAgICBMYXN0TmVpZ2hib3IsDQorICAgIEZpcnN0Q2hpbGQsDQorICAgIExhc3RDaGlsZA0KKyAgfTsNCisgIHZpcnR1YWwgSUZERV9YTUxOb2RlKiBHZXROb2RlSXRlbShOb2RlSXRlbSBlSXRlbSkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldE5vZGVMZXZlbCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBJbnNlcnROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5vZGVJdGVtIGVJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfWE1MTm9kZSogcE5vZGUpID0gMDsNCisgIHZpcnR1YWwgSUZERV9YTUxOb2RlKiBSZW1vdmVOb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5vZGVJdGVtIGVJdGVtKSA9IDA7DQorICB2aXJ0dWFsIElGREVfWE1MTm9kZSogQ2xvbmUoRlhfQk9PTCBiUmVjdXJzaXZlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2F2ZVhNTE5vZGUoSUZYX1N0cmVhbSogcFhNTFN0cmVhbSkgPSAwOw0KK307DQorY2xhc3MgSUZERV9YTUxJbnN0cnVjdGlvbiA6IHB1YmxpYyBJRkRFX1hNTE5vZGUgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZERV9YTUxJbnN0cnVjdGlvbiogQ3JlYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RhcmdldCk7DQorICB2aXJ0dWFsIHZvaWQgR2V0VGFyZ2V0TmFtZShDRlhfV2lkZVN0cmluZyYgd3NUYXJnZXQpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudEF0dHJpYnV0ZXMoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0QXR0cmlidXRlKGludDMyX3QgaW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlWYWx1ZSkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEhhc0F0dHJpYnV0ZShjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0U3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwd3NEZWZWYWx1ZSA9IE5VTEwpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaVZhbHVlKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0SW50ZWdlcihjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGVmVmFsdWUgPSAwKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0SW50ZWdlcihjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQXR0cmlWYWx1ZSkgPSAwOw0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRGbG9hdChjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRGVmVmFsdWUgPSAwKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0RmxvYXQoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwgRlhfRkxPQVQgZkF0dHJpVmFsdWUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBSZW1vdmVBdHRyaWJ1dGUoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50RGF0YSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXREYXRhKGludDMyX3QgaW5kZXgsIENGWF9XaWRlU3RyaW5nJiB3c0RhdGEpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBBcHBlbmREYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGEpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBSZW1vdmVEYXRhKGludDMyX3QgaW5kZXgpID0gMDsNCit9Ow0KK2NsYXNzIElGREVfWE1MRWxlbWVudCA6IHB1YmxpYyBJRkRFX1hNTE5vZGUgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZERV9YTUxFbGVtZW50KiBDcmVhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGFnKTsNCisgIHZpcnR1YWwgdm9pZCBHZXRUYWdOYW1lKENGWF9XaWRlU3RyaW5nJiB3c1RhZykgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldExvY2FsVGFnTmFtZShDRlhfV2lkZVN0cmluZyYgd3NUYWcpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXROYW1lc3BhY2VQcmVmaXgoQ0ZYX1dpZGVTdHJpbmcmIHdzUHJlZml4KSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0TmFtZXNwYWNlVVJJKENGWF9XaWRlU3RyaW5nJiB3c05hbWVzcGFjZSkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50QXR0cmlidXRlcygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRBdHRyaWJ1dGUoaW50MzJfdCBpbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaVZhbHVlKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgSGFzQXR0cmlidXRlKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXRTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHB3c0RlZlZhbHVlID0gTlVMTCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpVmFsdWUpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRJbnRlZ2VyKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEZWZWYWx1ZSA9IDApIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRJbnRlZ2VyKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlBdHRyaVZhbHVlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEZsb2F0KGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZEZWZWYWx1ZSA9IDApIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRGbG9hdChjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLCBGWF9GTE9BVCBmQXR0cmlWYWx1ZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFJlbW92ZUF0dHJpYnV0ZShjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0VGV4dERhdGEoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldFRleHREYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpID0gMDsNCit9Ow0KK2NsYXNzIElGREVfWE1MVGV4dCA6IHB1YmxpYyBJRkRFX1hNTE5vZGUgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZERV9YTUxUZXh0KiBDcmVhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorICB2aXJ0dWFsIHZvaWQgR2V0VGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSA9IDA7DQorfTsNCitjbGFzcyBJRkRFX1hNTERlY2xhcmF0aW9uIDogcHVibGljIElGREVfWE1MTm9kZSB7DQorIHB1YmxpYzoNCit9Ow0KK2NsYXNzIElGREVfWE1MQ2hhckRhdGEgOiBwdWJsaWMgSUZERV9YTUxEZWNsYXJhdGlvbiB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRkRFX1hNTENoYXJEYXRhKiBDcmVhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ0RhdGEpOw0KKyAgdmlydHVhbCB+SUZERV9YTUxDaGFyRGF0YSgpIHt9DQorDQorICB2aXJ0dWFsIHZvaWQgR2V0Q2hhckRhdGEoQ0ZYX1dpZGVTdHJpbmcmIHdzQ0RhdGEpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRDaGFyRGF0YShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDRGF0YSkgPSAwOw0KK307DQordHlwZWRlZiBzdHJ1Y3QgX0ZERV9YTUxSRUFERVJIQU5ETEVSIHsNCisgIHZvaWQqIHBEYXRhOw0KKw0KKyAgdm9pZCAoKk9uVGFnRW50ZXIpKF9GREVfWE1MUkVBREVSSEFORExFUiogcFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgRkRFX1hNTE5PREVUWVBFIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RhZ05hbWUpOw0KKyAgdm9pZCAoKk9uVGFnQnJlYWspKF9GREVfWE1MUkVBREVSSEFORExFUiogcFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGFnTmFtZSk7DQorICB2b2lkICgqT25UYWdDbG9zZSkoX0ZERV9YTUxSRUFERVJIQU5ETEVSKiBwVGhpcywNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUYWdOYW1lKTsNCisgIHZvaWQgKCpPbkF0dHJpYnV0ZSkoX0ZERV9YTUxSRUFERVJIQU5ETEVSKiBwVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpOw0KKyAgdm9pZCAoKk9uRGF0YSkoX0ZERV9YTUxSRUFERVJIQU5ETEVSKiBwVGhpcywNCisgICAgICAgICAgICAgICAgIEZERV9YTUxOT0RFVFlQRSBlVHlwZSwNCisgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKTsNCit9IEZERV9YTUxSRUFERVJIQU5ETEVSLCAqRkRFX0xQWE1MUkVBREVSSEFORExFUjsNCitjbGFzcyBJRkRFX1hNTERvYyB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRkRFX1hNTERvYyogQ3JlYXRlKCk7DQorICB2aXJ0dWFsIH5JRkRFX1hNTERvYygpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBMb2FkWE1MKElGWF9TdHJlYW0qIHBYTUxTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlYTUxQbGFuZVNpemUgPSA4MTkyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVGV4dERhdGFTaXplID0gMjU2LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0xQWE1MUkVBREVSSEFORExFUiBwSGFuZGxlciA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBMb2FkWE1MKElGREVfWE1MUGFyc2VyKiBwWE1MUGFyc2VyKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgRG9Mb2FkKElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIENsb3NlWE1MKCkgPSAwOw0KKyAgdmlydHVhbCBJRkRFX1hNTE5vZGUqIEdldFJvb3QoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2F2ZVhNTChJRlhfU3RyZWFtKiBwWE1MU3RyZWFtID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNhdmVCT00gPSBUUlVFKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2F2ZVhNTE5vZGUoSUZYX1N0cmVhbSogcFhNTFN0cmVhbSwgSUZERV9YTUxOb2RlKiBwTm9kZSkgPSAwOw0KK307DQorY2xhc3MgSUZERV9YTUxQYXJzZXIgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRkRFX1hNTFBhcnNlcigpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBEb1BhcnNlcihJRlhfUGF1c2UqIHBQYXVzZSkgPSAwOw0KK307DQorI2RlZmluZSBGREVfWE1MU1lOVEFYU1RBVFVTX05vbmUgMHgwMA0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWFNUQVRVU19JbnN0cnVjdGlvbk9wZW4gMHgwMQ0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWFNUQVRVU19JbnN0cnVjdGlvbkNsb3NlIDB4MDINCisjZGVmaW5lIEZERV9YTUxTWU5UQVhTVEFUVVNfRWxlbWVudE9wZW4gMHgwMw0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWFNUQVRVU19FbGVtZW50QnJlYWsgMHgwNA0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWFNUQVRVU19FbGVtZW50Q2xvc2UgMHgwNQ0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWFNUQVRVU19UYXJnZXROYW1lIDB4MDYNCisjZGVmaW5lIEZERV9YTUxTWU5UQVhTVEFUVVNfVGFnTmFtZSAweDA3DQorI2RlZmluZSBGREVfWE1MU1lOVEFYU1RBVFVTX0F0dHJpTmFtZSAweDA4DQorI2RlZmluZSBGREVfWE1MU1lOVEFYU1RBVFVTX0F0dHJpVmFsdWUgMHgwOQ0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWFNUQVRVU19UZXh0IDB4MEENCisjZGVmaW5lIEZERV9YTUxTWU5UQVhTVEFUVVNfQ0RhdGEgMHgwQg0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWFNUQVRVU19UYXJnZXREYXRhIDB4MEMNCisjZGVmaW5lIEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3IgMHhGRQ0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWFNUQVRVU19FT1MgMHhGRg0KK2NsYXNzIElGREVfWE1MU3ludGF4UGFyc2VyIHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGREVfWE1MU3ludGF4UGFyc2VyKiBDcmVhdGUoKTsNCisgIHZpcnR1YWwgfklGREVfWE1MU3ludGF4UGFyc2VyKCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEluaXQoSUZYX1N0cmVhbSogcFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVhNTFBsYW5lU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVRleHREYXRhU2l6ZSA9IDI1NikgPSAwOw0KKyAgdmlydHVhbCBGWF9EV09SRCBEb1N5bnRheFBhcnNlKCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFN0YXR1cygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDdXJyZW50UG9zKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9GSUxFU0laRSBHZXRDdXJyZW50QmluYXJ5UG9zKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEN1cnJlbnROb2RlTnVtYmVyKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldExhc3ROb2RlTnVtYmVyKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldFRhcmdldE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzVGFyZ2V0KSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0VGFnTmFtZShDRlhfV2lkZVN0cmluZyYgd3NUYWcpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXRBdHRyaWJ1dGVOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpTmFtZSkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldEF0dHJpYnV0ZVZhbHVlKENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpVmFsdWUpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXRUZXh0RGF0YShDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0VGFyZ2V0RGF0YShDRlhfV2lkZVN0cmluZyYgd3NEYXRhKSBjb25zdCA9IDA7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NjYWNoZS5jcHAgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NjYWNoZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzYjA0MAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2NhY2hlLmNwcApAQCAtMCwwICsxLDE0NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSA8YWxnb3JpdGhtPg0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgImZkZV9jc3NjYWNoZS5oIg0KK19GREVfQ1NTQ0FDSEVJVEVNOjpfRkRFX0NTU0NBQ0hFSVRFTShJRkRFX0NTU1N0eWxlU2hlZXQqIHApDQorICAgIDogcFN0eWxlc2hlZXQocCksIGR3QWN0aXZpdHkoMCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBTdHlsZXNoZWV0KTsNCisgIHBTdHlsZXNoZWV0LT5BZGRSZWYoKTsNCit9DQorX0ZERV9DU1NDQUNIRUlURU06On5fRkRFX0NTU0NBQ0hFSVRFTSgpIHsNCisgIHBTdHlsZXNoZWV0LT5SZWxlYXNlKCk7DQorfQ0KK0lGREVfQ1NTU3R5bGVTaGVldENhY2hlKiBJRkRFX0NTU1N0eWxlU2hlZXRDYWNoZTo6Q3JlYXRlKCkgew0KKyAgcmV0dXJuIG5ldyBDRkRFX0NTU1N0eWxlU2hlZXRDYWNoZTsNCit9DQorDQorQ0ZERV9DU1NTdHlsZVNoZWV0Q2FjaGU6OkNGREVfQ1NTU3R5bGVTaGVldENhY2hlKCkNCisgICAgOiBtX3BGaXhlZFN0b3JlKE5VTEwpLCBtX2lNYXhJdGVtcyg1KSB7fQ0KKw0KK0NGREVfQ1NTU3R5bGVTaGVldENhY2hlOjp+Q0ZERV9DU1NTdHlsZVNoZWV0Q2FjaGUoKSB7DQorICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBtX1N0eWxlc2hlZXRzKSB7DQorICAgIEZERV9EZWxldGVXaXRoKEZERV9DU1NDQUNIRUlURU0sIG1fcEZpeGVkU3RvcmUsIHBhaXIuc2Vjb25kKTsNCisgIH0NCisgIG1fU3R5bGVzaGVldHMuY2xlYXIoKTsNCisgIGlmIChtX3BGaXhlZFN0b3JlKSB7DQorICAgIG1fcEZpeGVkU3RvcmUtPlJlbGVhc2UoKTsNCisgIH0NCit9DQordm9pZCBDRkRFX0NTU1N0eWxlU2hlZXRDYWNoZTo6QWRkU3R5bGVTaGVldChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6S2V5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NTdHlsZVNoZWV0KiBwU3R5bGVTaGVldCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBTdHlsZVNoZWV0ICE9IE5VTEwpOw0KKyAgaWYgKG1fcEZpeGVkU3RvcmUgPT0gTlVMTCkgew0KKyAgICBtX3BGaXhlZFN0b3JlID0NCisgICAgICAgIEZYX0NyZWF0ZUFsbG9jYXRvcihGWF9BTExPQ1RZUEVfRml4ZWQsIHN0ZDo6bWF4KDEwLCBtX2lNYXhJdGVtcyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZERV9DU1NDQUNIRUlURU0pKTsNCisgICAgRlhTWVNfYXNzZXJ0KG1fcEZpeGVkU3RvcmUgIT0gTlVMTCk7DQorICB9DQorICBhdXRvIGl0ID0gbV9TdHlsZXNoZWV0cy5maW5kKHN6S2V5KTsNCisgIGlmIChpdCAhPSBtX1N0eWxlc2hlZXRzLmVuZCgpKSB7DQorICAgIEZERV9MUENTU0NBQ0hFSVRFTSBwSXRlbSA9IGl0LT5zZWNvbmQ7DQorICAgIGlmIChwSXRlbS0+cFN0eWxlc2hlZXQgIT0gcFN0eWxlU2hlZXQpIHsNCisgICAgICBwSXRlbS0+cFN0eWxlc2hlZXQtPlJlbGVhc2UoKTsNCisgICAgICBwSXRlbS0+cFN0eWxlc2hlZXQgPSBwU3R5bGVTaGVldDsNCisgICAgICBwSXRlbS0+cFN0eWxlc2hlZXQtPkFkZFJlZigpOw0KKyAgICAgIHBJdGVtLT5kd0FjdGl2aXR5ID0gMDsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgd2hpbGUgKHN0YXRpY19jYXN0PGludDMyX3Q+KG1fU3R5bGVzaGVldHMuc2l6ZSgpKSA+PSBtX2lNYXhJdGVtcykgew0KKyAgICAgIFJlbW92ZUxvd2VzdEFjdGl2aXR5SXRlbSgpOw0KKyAgICB9DQorICAgIG1fU3R5bGVzaGVldHNbc3pLZXldID0NCisgICAgICAgIEZERV9OZXdXaXRoKG1fcEZpeGVkU3RvcmUpIEZERV9DU1NDQUNIRUlURU0ocFN0eWxlU2hlZXQpOw0KKyAgfQ0KK30NCitJRkRFX0NTU1N0eWxlU2hlZXQqIENGREVfQ1NTU3R5bGVTaGVldENhY2hlOjpHZXRTdHlsZVNoZWV0KA0KKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6S2V5KSBjb25zdCB7DQorICBhdXRvIGl0ID0gbV9TdHlsZXNoZWV0cy5maW5kKHN6S2V5KTsNCisgIGlmIChpdCA9PSBtX1N0eWxlc2hlZXRzLmVuZCgpKSB7DQorICAgIHJldHVybiBudWxscHRyOw0KKyAgfQ0KKyAgRkRFX0xQQ1NTQ0FDSEVJVEVNIHBJdGVtID0gaXQtPnNlY29uZDsNCisgIHBJdGVtLT5kd0FjdGl2aXR5Kys7DQorICBwSXRlbS0+cFN0eWxlc2hlZXQtPkFkZFJlZigpOw0KKyAgcmV0dXJuIHBJdGVtLT5wU3R5bGVzaGVldDsNCit9DQordm9pZCBDRkRFX0NTU1N0eWxlU2hlZXRDYWNoZTo6UmVtb3ZlU3R5bGVTaGVldChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6S2V5KSB7DQorICBhdXRvIGl0ID0gbV9TdHlsZXNoZWV0cy5maW5kKHN6S2V5KTsNCisgIGlmIChpdCA9PSBtX1N0eWxlc2hlZXRzLmVuZCgpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZERV9EZWxldGVXaXRoKEZERV9DU1NDQUNIRUlURU0sIG1fcEZpeGVkU3RvcmUsIGl0LT5zZWNvbmQpOw0KKyAgbV9TdHlsZXNoZWV0cy5lcmFzZShpdCk7DQorfQ0KK3ZvaWQgQ0ZERV9DU1NTdHlsZVNoZWV0Q2FjaGU6OlJlbW92ZUxvd2VzdEFjdGl2aXR5SXRlbSgpIHsNCisgIGF1dG8gZm91bmQgPSBtX1N0eWxlc2hlZXRzLmVuZCgpOw0KKyAgZm9yIChhdXRvIGl0ID0gbV9TdHlsZXNoZWV0cy5iZWdpbigpOyBpdCAhPSBtX1N0eWxlc2hlZXRzLmVuZCgpOyArK2l0KSB7DQorICAgIHN3aXRjaCAoaXQtPmZpcnN0LkdldElEKCkpIHsNCisgICAgICBjYXNlIEZYQlNUUl9JRCgnIycsICdVJywgJ1MnLCAnRScpOg0KKyAgICAgIGNhc2UgRlhCU1RSX0lEKCcjJywgJ0EnLCAnRycsICdFJyk6DQorICAgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAoZm91bmQgPT0gbV9TdHlsZXNoZWV0cy5lbmQoKSB8fA0KKyAgICAgICAgaXQtPnNlY29uZC0+ZHdBY3Rpdml0eSA+IGZvdW5kLT5zZWNvbmQtPmR3QWN0aXZpdHkpIHsNCisgICAgICBmb3VuZCA9IGl0Ow0KKyAgICB9DQorICB9DQorICBpZiAoZm91bmQgIT0gbV9TdHlsZXNoZWV0cy5lbmQoKSkgew0KKyAgICBGREVfRGVsZXRlV2l0aChGREVfQ1NTQ0FDSEVJVEVNLCBtX3BGaXhlZFN0b3JlLCBmb3VuZC0+c2Vjb25kKTsNCisgICAgbV9TdHlsZXNoZWV0cy5lcmFzZShmb3VuZCk7DQorICB9DQorfQ0KK19GREVfQ1NTVEFHQ0FDSEU6Ol9GREVfQ1NTVEFHQ0FDSEUoX0ZERV9DU1NUQUdDQUNIRSogcGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NUYWdQcm92aWRlciogdGFnKQ0KKyAgICA6IHBUYWcodGFnKSwNCisgICAgICBwUGFyZW50KHBhcmVudCksDQorICAgICAgZHdJREhhc2goMCksDQorICAgICAgZHdUYWdIYXNoKDApLA0KKyAgICAgIGlDbGFzc0luZGV4KDApLA0KKyAgICAgIGR3Q2xhc3NIYXNocygxKSB7DQorICBGWFNZU19hc3NlcnQocFRhZyAhPSBOVUxMKTsNCisgIENGWF9XaWRlU3RyaW5nQyB3c1ZhbHVlLCB3c05hbWUgPSBwVGFnLT5HZXRUYWdOYW1lKCk7DQorICBkd1RhZ0hhc2ggPQ0KKyAgICAgIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTmFtZS5HZXRQdHIoKSwgd3NOYW1lLkdldExlbmd0aCgpLCBUUlVFKTsNCisgIEZYX1BPU0lUSU9OIHBvcyA9IHBUYWctPkdldEZpcnN0QXR0cmlidXRlKCk7DQorICB3aGlsZSAocG9zICE9IE5VTEwpIHsNCisgICAgcFRhZy0+R2V0TmV4dEF0dHJpYnV0ZShwb3MsIHdzTmFtZSwgd3NWYWx1ZSk7DQorICAgIEZYX0RXT1JEIGR3TmFtZUhhc2ggPQ0KKyAgICAgICAgRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NOYW1lLkdldFB0cigpLCB3c05hbWUuR2V0TGVuZ3RoKCksIFRSVUUpOw0KKyAgICBzdGF0aWMgY29uc3QgRlhfRFdPUkQgc19kd0lESGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKEwiaWQiLCAyLCBUUlVFKTsNCisgICAgc3RhdGljIGNvbnN0IEZYX0RXT1JEIHNfZHdDbGFzc0hhc2ggPQ0KKyAgICAgICAgRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoTCJjbGFzcyIsIDUsIFRSVUUpOw0KKyAgICBpZiAoZHdOYW1lSGFzaCA9PSBzX2R3Q2xhc3NIYXNoKSB7DQorICAgICAgRlhfRFdPUkQgZHdIYXNoID0NCisgICAgICAgICAgRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NWYWx1ZS5HZXRQdHIoKSwgd3NWYWx1ZS5HZXRMZW5ndGgoKSk7DQorICAgICAgZHdDbGFzc0hhc2hzLkFkZChkd0hhc2gpOw0KKyAgICB9IGVsc2UgaWYgKGR3TmFtZUhhc2ggPT0gc19kd0lESGFzaCkgew0KKyAgICAgIGR3SURIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NWYWx1ZS5HZXRQdHIoKSwgd3NWYWx1ZS5HZXRMZW5ndGgoKSk7DQorICAgIH0NCisgIH0NCit9DQorX0ZERV9DU1NUQUdDQUNIRTo6X0ZERV9DU1NUQUdDQUNIRShjb25zdCBfRkRFX0NTU1RBR0NBQ0hFJiBpdCkNCisgICAgOiBwVGFnKGl0LnBUYWcpLA0KKyAgICAgIHBQYXJlbnQoaXQucFBhcmVudCksDQorICAgICAgZHdJREhhc2goaXQuZHdJREhhc2gpLA0KKyAgICAgIGR3VGFnSGFzaChpdC5kd1RhZ0hhc2gpLA0KKyAgICAgIGlDbGFzc0luZGV4KDApLA0KKyAgICAgIGR3Q2xhc3NIYXNocygxKSB7DQorICBpZiAoaXQuZHdDbGFzc0hhc2hzLkdldFNpemUoKSA+IDApIHsNCisgICAgZHdDbGFzc0hhc2hzLkNvcHkoaXQuZHdDbGFzc0hhc2hzKTsNCisgIH0NCit9DQordm9pZCBDRkRFX0NTU0FjY2VsZXJhdG9yOjpPbkVudGVyVGFnKElGREVfQ1NTVGFnUHJvdmlkZXIqIHBUYWcpIHsNCisgIEZERV9DU1NUQUdDQUNIRSogcFRvcCA9IEdldFRvcEVsZW1lbnQoKTsNCisgIEZERV9DU1NUQUdDQUNIRSBpdGVtKHBUb3AsIHBUYWcpOw0KKyAgbV9TdGFjay5QdXNoKGl0ZW0pOw0KK30NCit2b2lkIENGREVfQ1NTQWNjZWxlcmF0b3I6Ok9uTGVhdmVUYWcoSUZERV9DU1NUYWdQcm92aWRlciogcFRhZykgew0KKyAgRkRFX0NTU1RBR0NBQ0hFKiBwSXRlbSA9IG1fU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KKyAgRlhTWVNfYXNzZXJ0KHBJdGVtICYmIHBJdGVtLT5HZXRUYWcoKSA9PSBwVGFnKTsNCisgIG1fU3RhY2suUG9wKCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2NhY2hlLmggYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NjYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMTEzYTIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NjYWNoZS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRkRFX0NTU0NBQ0hFDQorI2RlZmluZSBfRkRFX0NTU0NBQ0hFDQordHlwZWRlZiBzdHJ1Y3QgX0ZERV9DU1NDQUNIRUlURU0gOiBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorICBfRkRFX0NTU0NBQ0hFSVRFTShJRkRFX0NTU1N0eWxlU2hlZXQqIHApOw0KKyAgfl9GREVfQ1NTQ0FDSEVJVEVNKCk7DQorICBJRkRFX0NTU1N0eWxlU2hlZXQqIHBTdHlsZXNoZWV0Ow0KKyAgRlhfRFdPUkQgZHdBY3Rpdml0eTsNCit9IEZERV9DU1NDQUNIRUlURU0sICpGREVfTFBDU1NDQUNIRUlURU07DQorY2xhc3MgQ0ZERV9DU1NTdHlsZVNoZWV0Q2FjaGUgOiBwdWJsaWMgSUZERV9DU1NTdHlsZVNoZWV0Q2FjaGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQ0ZYX1RocmVhZExvY2ssDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGREVfQ1NTU3R5bGVTaGVldENhY2hlKCk7DQorICB+Q0ZERV9DU1NTdHlsZVNoZWV0Q2FjaGUoKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKw0KKyAgdmlydHVhbCB2b2lkIFNldE1heEl0ZW1zKGludDMyX3QgaU1heENvdW50ID0gNSkgew0KKyAgICBGWFNZU19hc3NlcnQoaU1heENvdW50ID49IDMpOw0KKyAgICBtX2lNYXhJdGVtcyA9IGlNYXhDb3VudDsNCisgIH0NCisNCisgIHZpcnR1YWwgdm9pZCBBZGRTdHlsZVNoZWV0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pLZXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU1N0eWxlU2hlZXQqIHBTdHlsZVNoZWV0KTsNCisgIHZpcnR1YWwgSUZERV9DU1NTdHlsZVNoZWV0KiBHZXRTdHlsZVNoZWV0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pLZXkpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIFJlbW92ZVN0eWxlU2hlZXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzektleSk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgUmVtb3ZlTG93ZXN0QWN0aXZpdHlJdGVtKCk7DQorICBzdGQ6Om1hcDxDRlhfQnl0ZVN0cmluZywgRkRFX0xQQ1NTQ0FDSEVJVEVNPiBtX1N0eWxlc2hlZXRzOw0KKyAgSUZYX01FTUFsbG9jYXRvciogbV9wRml4ZWRTdG9yZTsNCisgIGludDMyX3QgbV9pTWF4SXRlbXM7DQorfTsNCit0eXBlZGVmIHN0cnVjdCBfRkRFX0NTU1RBR0NBQ0hFIDogcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBfRkRFX0NTU1RBR0NBQ0hFKF9GREVfQ1NTVEFHQ0FDSEUqIHBhcmVudCwgSUZERV9DU1NUYWdQcm92aWRlciogdGFnKTsNCisgIF9GREVfQ1NTVEFHQ0FDSEUoY29uc3QgX0ZERV9DU1NUQUdDQUNIRSYgaXQpOw0KKyAgX0ZERV9DU1NUQUdDQUNIRSogR2V0UGFyZW50KCkgY29uc3QgeyByZXR1cm4gcFBhcmVudDsgfQ0KKyAgSUZERV9DU1NUYWdQcm92aWRlciogR2V0VGFnKCkgY29uc3QgeyByZXR1cm4gcFRhZzsgfQ0KKyAgRlhfRFdPUkQgSGFzaElEKCkgY29uc3QgeyByZXR1cm4gZHdJREhhc2g7IH0NCisgIEZYX0RXT1JEIEhhc2hUYWcoKSBjb25zdCB7IHJldHVybiBkd1RhZ0hhc2g7IH0NCisgIGludDMyX3QgQ291bnRIYXNoQ2xhc3MoKSBjb25zdCB7IHJldHVybiBkd0NsYXNzSGFzaHMuR2V0U2l6ZSgpOyB9DQorICB2b2lkIFNldENsYXNzSW5kZXgoaW50MzJfdCBpbmRleCkgeyBpQ2xhc3NJbmRleCA9IGluZGV4OyB9DQorICBGWF9EV09SRCBIYXNoQ2xhc3MoKSBjb25zdCB7DQorICAgIHJldHVybiBpQ2xhc3NJbmRleCA8IGR3Q2xhc3NIYXNocy5HZXRTaXplKCkNCisgICAgICAgICAgICAgICA/IGR3Q2xhc3NIYXNocy5HZXRBdChpQ2xhc3NJbmRleCkNCisgICAgICAgICAgICAgICA6IDA7DQorICB9DQorDQorIHByb3RlY3RlZDoNCisgIElGREVfQ1NTVGFnUHJvdmlkZXIqIHBUYWc7DQorICBfRkRFX0NTU1RBR0NBQ0hFKiBwUGFyZW50Ow0KKyAgRlhfRFdPUkQgZHdJREhhc2g7DQorICBGWF9EV09SRCBkd1RhZ0hhc2g7DQorICBpbnQzMl90IGlDbGFzc0luZGV4Ow0KKyAgQ0ZERV9EV29yZEFycmF5IGR3Q2xhc3NIYXNoczsNCit9IEZERV9DU1NUQUdDQUNIRSwgKkZERV9MUENTU1RBR0NBQ0hFOw0KK3R5cGVkZWYgQ0ZYX09iamVjdFN0YWNrVGVtcGxhdGU8RkRFX0NTU1RBR0NBQ0hFPiBDRkRFX0NTU1RhZ1N0YWNrOw0KK2NsYXNzIENGREVfQ1NTQWNjZWxlcmF0b3IgOiBwdWJsaWMgSUZERV9DU1NBY2NlbGVyYXRvciwgcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIHZvaWQgT25FbnRlclRhZyhJRkRFX0NTU1RhZ1Byb3ZpZGVyKiBwVGFnKTsNCisgIHZpcnR1YWwgdm9pZCBPbkxlYXZlVGFnKElGREVfQ1NTVGFnUHJvdmlkZXIqIHBUYWcpOw0KKyAgdm9pZCBDbGVhcigpIHsgbV9TdGFjay5SZW1vdmVBbGwoKTsgfQ0KKyAgRkRFX0xQQ1NTVEFHQ0FDSEUgR2V0VG9wRWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fU3RhY2suR2V0VG9wRWxlbWVudCgpOyB9DQorDQorIHByb3RlY3RlZDoNCisgIENGREVfQ1NTVGFnU3RhY2sgbV9TdGFjazsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2RhdGF0YWJsZS5jcHAgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NkYXRhdGFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNjQxMjIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NkYXRhdGFibGUuY3BwCkBAIC0wLDAgKzEsODgxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgImZkZV9jc3NkYXRhdGFibGUuaCINCisNCitGWF9CT09MIEZERV9DU1NMZW5ndGhUb0Zsb2F0KGNvbnN0IEZERV9DU1NMRU5HVEgmIGxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZXJjZW50QmFzZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmUmVzdWx0KSB7DQorICBzd2l0Y2ggKGxlbi5HZXRVbml0KCkpIHsNCisgICAgY2FzZSBGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludDoNCisgICAgICBmUmVzdWx0ID0gbGVuLkdldFZhbHVlKCk7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIGNhc2UgRkRFX0NTU0xFTkdUSFVOSVRfUGVyY2VudDoNCisgICAgICBmUmVzdWx0ID0gbGVuLkdldFZhbHVlKCkgKiBmUGVyY2VudEJhc2U7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KK30NCitDRlhfRmxvYXRSZWN0IEZERV9DU1NCb3VuZGFyeVRvUmVjdChJRkRFX0NTU0JvdW5kYXJ5U3R5bGUqIHBCb3VuZFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb250YWluZXJXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQYWRkaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkJvcmRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJNYXJnaW4pIHsNCisgIEZYU1lTX2Fzc2VydChwQm91bmRTdHlsZSAhPSBOVUxMKTsNCisgIEZYX0ZMT0FUIGZSZXN1bHQ7DQorICBjb25zdCBGREVfQ1NTUkVDVCogcFJlY3Q7DQorICBDRlhfRmxvYXRSZWN0IHJlY3QoMCwgMCwgMCwgMCk7DQorICBpZiAoYlBhZGRpbmcpIHsNCisgICAgcFJlY3QgPSBwQm91bmRTdHlsZS0+R2V0UGFkZGluZ1dpZHRoKCk7DQorICAgIGlmIChwUmVjdCAhPSBOVUxMKSB7DQorICAgICAgaWYgKEZERV9DU1NMZW5ndGhUb0Zsb2F0KHBSZWN0LT5sZWZ0LCBmQ29udGFpbmVyV2lkdGgsIGZSZXN1bHQpKSB7DQorICAgICAgICByZWN0LmxlZnQgKz0gZlJlc3VsdDsNCisgICAgICB9DQorICAgICAgaWYgKEZERV9DU1NMZW5ndGhUb0Zsb2F0KHBSZWN0LT50b3AsIGZDb250YWluZXJXaWR0aCwgZlJlc3VsdCkpIHsNCisgICAgICAgIHJlY3QudG9wICs9IGZSZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIGlmIChGREVfQ1NTTGVuZ3RoVG9GbG9hdChwUmVjdC0+cmlnaHQsIGZDb250YWluZXJXaWR0aCwgZlJlc3VsdCkpIHsNCisgICAgICAgIHJlY3QucmlnaHQgKz0gZlJlc3VsdDsNCisgICAgICB9DQorICAgICAgaWYgKEZERV9DU1NMZW5ndGhUb0Zsb2F0KHBSZWN0LT5ib3R0b20sIGZDb250YWluZXJXaWR0aCwgZlJlc3VsdCkpIHsNCisgICAgICAgIHJlY3QuYm90dG9tICs9IGZSZXN1bHQ7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAoYkJvcmRlcikgew0KKyAgICBwUmVjdCA9IHBCb3VuZFN0eWxlLT5HZXRCb3JkZXJXaWR0aCgpOw0KKyAgICBpZiAocFJlY3QgIT0gTlVMTCkgew0KKyAgICAgIGlmIChGREVfQ1NTTGVuZ3RoVG9GbG9hdChwUmVjdC0+bGVmdCwgZkNvbnRhaW5lcldpZHRoLCBmUmVzdWx0KSkgew0KKyAgICAgICAgcmVjdC5sZWZ0ICs9IGZSZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIGlmIChGREVfQ1NTTGVuZ3RoVG9GbG9hdChwUmVjdC0+dG9wLCBmQ29udGFpbmVyV2lkdGgsIGZSZXN1bHQpKSB7DQorICAgICAgICByZWN0LnRvcCArPSBmUmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICBpZiAoRkRFX0NTU0xlbmd0aFRvRmxvYXQocFJlY3QtPnJpZ2h0LCBmQ29udGFpbmVyV2lkdGgsIGZSZXN1bHQpKSB7DQorICAgICAgICByZWN0LnJpZ2h0ICs9IGZSZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIGlmIChGREVfQ1NTTGVuZ3RoVG9GbG9hdChwUmVjdC0+Ym90dG9tLCBmQ29udGFpbmVyV2lkdGgsIGZSZXN1bHQpKSB7DQorICAgICAgICByZWN0LmJvdHRvbSArPSBmUmVzdWx0Ow0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGJNYXJnaW4pIHsNCisgICAgcFJlY3QgPSBwQm91bmRTdHlsZS0+R2V0TWFyZ2luV2lkdGgoKTsNCisgICAgaWYgKHBSZWN0ICE9IE5VTEwpIHsNCisgICAgICBpZiAoRkRFX0NTU0xlbmd0aFRvRmxvYXQocFJlY3QtPmxlZnQsIGZDb250YWluZXJXaWR0aCwgZlJlc3VsdCkpIHsNCisgICAgICAgIHJlY3QubGVmdCArPSBmUmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICBpZiAoRkRFX0NTU0xlbmd0aFRvRmxvYXQocFJlY3QtPnRvcCwgZkNvbnRhaW5lcldpZHRoLCBmUmVzdWx0KSkgew0KKyAgICAgICAgcmVjdC50b3AgKz0gZlJlc3VsdDsNCisgICAgICB9DQorICAgICAgaWYgKEZERV9DU1NMZW5ndGhUb0Zsb2F0KHBSZWN0LT5yaWdodCwgZkNvbnRhaW5lcldpZHRoLCBmUmVzdWx0KSkgew0KKyAgICAgICAgcmVjdC5yaWdodCArPSBmUmVzdWx0Ow0KKyAgICAgIH0NCisgICAgICBpZiAoRkRFX0NTU0xlbmd0aFRvRmxvYXQocFJlY3QtPmJvdHRvbSwgZkNvbnRhaW5lcldpZHRoLCBmUmVzdWx0KSkgew0KKyAgICAgICAgcmVjdC5ib3R0b20gKz0gZlJlc3VsdDsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiByZWN0Ow0KK30NCitGWF9EV09SRCBGREVfQ1NTRm9udFN0eWxlVG9GREUoSUZERV9DU1NGb250U3R5bGUqIHBGb250U3R5bGUpIHsNCisgIEZYU1lTX2Fzc2VydChwRm9udFN0eWxlICE9IE5VTEwpOw0KKyAgRlhfRFdPUkQgZHdGb250U3R5bGUgPSBGWF9GT05UU1RZTEVfTm9ybWFsOw0KKyAgaWYgKHBGb250U3R5bGUtPkdldEZvbnRTdHlsZSgpID09IEZERV9DU1NGT05UU1RZTEVfSXRhbGljKSB7DQorICAgIGR3Rm9udFN0eWxlIHw9IEZYX0ZPTlRTVFlMRV9JdGFsaWM7DQorICB9DQorICBpZiAocEZvbnRTdHlsZS0+R2V0Rm9udFdlaWdodCgpID49IDcwMCkgew0KKyAgICBkd0ZvbnRTdHlsZSB8PSBGWF9GT05UU1RZTEVfQm9sZDsNCisgIH0NCisgIHJldHVybiBkd0ZvbnRTdHlsZTsNCit9DQorc3RhdGljIGNvbnN0IEZERV9DU1NQUk9QRVJUWVRBQkxFIGdfRkRFX0NTU1Byb3BlcnRpZXNbXSA9IHsNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Xcml0aW5nTW9kZSwgTCJ3cml0aW5nLW1vZGUiLCAweDAxODc4MDc2LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQ29sdW1uUnVsZVdpZHRoLCBMImNvbHVtbi1ydWxlLXdpZHRoIiwgMHgwMjAwRkIwMCwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnQsIEwiYm9yZGVyLWxlZnQiLCAweDA0MDgwMDM2LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9TaG9ydGhhbmR9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0NvbHVtblJ1bGUsIEwiY29sdW1uLXJ1bGUiLCAweDA0QzgzREYzLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9TaG9ydGhhbmR9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0hlaWdodCwgTCJoZWlnaHQiLCAweDA1QTVDNTE5LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQ291bnRlclJlc2V0LCBMImNvdW50ZXItcmVzZXQiLCAweDA4OTRGOUIwLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9MaXN0IHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXIgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlU3RyaW5nfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Db250ZW50LCBMImNvbnRlbnQiLCAweDA5N0JFOTFCLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9MaXN0IHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVVUkkgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlU3RyaW5nfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9SdWJ5UG9zaXRpb24sIEwicnVieS1wb3NpdGlvbiIsIDB4MDlBQ0QwMjQsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kQ29sb3IsIEwiYmFja2dyb3VuZC1jb2xvciIsIDB4MDlFOEU4QUMsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlQ29sb3J9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1dpZHRoLCBMIndpZHRoIiwgMHgwQThBOEY4MCwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1NyYywgTCJzcmMiLCAweDBCRDM3MDQ4LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlVVJJfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Ub3AsIEwidG9wIiwgMHgwQkVEQUYzMywgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfTWFyZ2luLCBMIm1hcmdpbiIsIDB4MENCMDE2QkUsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX0xpc3QgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQ29sb3IsIEwiYm9yZGVyLWNvbG9yIiwgMHgwQ0JCNTI4QSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfTGlzdCB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlQ29sb3J9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1dpZG93cywgTCJ3aWRvd3MiLCAweDEwMjZDNTlELA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21Db2xvciwgTCJib3JkZXItYm90dG9tLWNvbG9yIiwgMHgxMjFFMjJFQywNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVDb2xvcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfVGV4dEluZGVudCwgTCJ0ZXh0LWluZGVudCIsIDB4MTY5QURCNzQsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1JpZ2h0LCBMInJpZ2h0IiwgMHgxOTNBREUzRSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1RleHRFbXBoYXNpc1N0eWxlLCBMInRleHQtZW1waGFzaXMtc3R5bGUiLCAweDIwREJBRjRBLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9MaXN0IHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVTdHJpbmd9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1BhZGRpbmdMZWZ0LCBMInBhZGRpbmctbGVmdCIsIDB4MjI4Q0YwMkYsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0NvbHVtbldpZHRoLCBMImNvbHVtbi13aWR0aCIsIDB4MjRDOUFDOUIsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9NYXJnaW5MZWZ0LCBMIm1hcmdpbi1sZWZ0IiwgMHgyOTdDNTY1NiwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlciB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlciwgTCJib3JkZXIiLCAweDJBMjMzNDlFLCBGREVfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyVG9wLCBMImJvcmRlci10b3AiLCAweDJCODY2QURFLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9TaG9ydGhhbmR9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1J1YnlPdmVyaGFuZywgTCJydWJ5LW92ZXJoYW5nIiwgMHgyQ0NBMEQ4OSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1BhZ2VCcmVha0JlZm9yZSwgTCJwYWdlLWJyZWFrLWJlZm9yZSIsIDB4MzExOUIzNkYsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9NYXhIZWlnaHQsIEwibWF4LWhlaWdodCIsIDB4MzQzNTk3RUMsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX01pbldpZHRoLCBMIm1pbi13aWR0aCIsIDB4MzU4MzI4NzEsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRDb2xvciwgTCJib3JkZXItbGVmdC1jb2xvciIsIDB4MzVDNjQwMjIsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlQ29sb3J9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0JvdHRvbSwgTCJib3R0b20iLCAweDM5OUYwMkI1LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfUXVvdGVzLCBMInF1b3RlcyIsIDB4M0Q4QzZBMDEsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX0xpc3QgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlU3RyaW5nfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9NYXhXaWR0aCwgTCJtYXgtd2lkdGgiLCAweDNFQTI3NEYzLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9QYWRkaW5nUmlnaHQsIEwicGFkZGluZy1yaWdodCIsIDB4M0Y2MTZBQzIsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0xpc3RTdHlsZUltYWdlLCBMImxpc3Qtc3R5bGUtaW1hZ2UiLCAweDQyQThBODZBLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZVVSSX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfV2hpdGVTcGFjZSwgTCJ3aGl0ZS1zcGFjZSIsIDB4NDJGMDQyOUEsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b20sIEwiYm9yZGVyLWJvdHRvbSIsIDB4NDUyQ0U3ODAsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfTGlzdFN0eWxlVHlwZSwgTCJsaXN0LXN0eWxlLXR5cGUiLCAweDQ4MDk0Nzg5LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfV29yZEJyZWFrLCBMIndvcmQtYnJlYWsiLCAweDRENzRBM0NFLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfT3ZlcmZsb3dYLCBMIm92ZXJmbG93LXgiLCAweDRFQ0VCRjk5LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfT3ZlcmZsb3dZLCBMIm92ZXJmbG93LXkiLCAweDRFQ0VCRjlBLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyVG9wQ29sb3IsIEwiYm9yZGVyLXRvcC1jb2xvciIsIDB4NTEwOUI4Q0EsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlQ29sb3J9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0ZvbnRGYW1pbHksIEwiZm9udC1mYW1pbHkiLCAweDU3NDY4NkU2LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9MaXN0IHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZVN0cmluZ30sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQ3Vyc29yLCBMImN1cnNvciIsIDB4NTlERkNBNUUsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX0xpc3QgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZVN0cmluZ30sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfUnVieUFsaWduLCBMInJ1YnktYWxpZ24iLCAweDYwNzdCREZBLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQ29sdW1uUnVsZUNvbG9yLCBMImNvbHVtbi1ydWxlLWNvbG9yIiwgMHg2NURERkQ5RiwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVDb2xvcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfRm9udFdlaWdodCwgTCJmb250LXdlaWdodCIsIDB4NjY5MkY2MEMsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodFN0eWxlLCBMImJvcmRlci1yaWdodC1zdHlsZSIsIDB4NjkyMEREQTcsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9NaW5IZWlnaHQsIEwibWluLWhlaWdodCIsIDB4NkFBRTMxMkEsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0NvbG9yLCBMImNvbG9yIiwgMHg2RTY3OTIxRiwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVDb2xvcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfTGV0dGVyU3BhY2luZywgTCJsZXR0ZXItc3BhY2luZyIsIDB4NzA1MzYxMDIsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9FbXB0eUNlbGxzLCBMImVtcHR5LWNlbGxzIiwgMHg3NTMxNTI4RiwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1RleHRBbGlnbiwgTCJ0ZXh0LWFsaWduIiwgMHg3NTUzRjFCRCwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1J1YnlTcGFuLCBMInJ1Ynktc3BhbiIsIDB4NzZGQ0ZDRTEsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlRnVuY3Rpb259LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1Bvc2l0aW9uLCBMInBvc2l0aW9uIiwgMHg4MTRGODJCNSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlclN0eWxlLCBMImJvcmRlci1zdHlsZSIsIDB4ODJBNENENUMsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX0xpc3QgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQm90dG9tU3R5bGUsIEwiYm9yZGVyLWJvdHRvbS1zdHlsZSIsIDB4ODgwNzlEQkUsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJDb2xsYXBzZSwgTCJib3JkZXItY29sbGFwc2UiLCAweDg4ODNDN0ZFLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQ29sdW1uQ291bnQsIEwiY29sdW1uLWNvdW50IiwgMHg4OTkzNkE2NCwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0V2lkdGgsIEwiYm9yZGVyLXJpZ2h0LXdpZHRoIiwgMHg4RjVBNjAzNiwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1VuaWNvZGVCaWRpLCBMInVuaWNvZGUtYmlkaSIsIDB4OTE2NzBGNkMsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9WZXJ0aWNhbEFsaWduLCBMInZlcnRpY2FsLWFsaWduIiwgMHg5MzRBODdEMiwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1BhZGRpbmdUb3AsIEwicGFkZGluZy10b3AiLCAweDk1OUQyMkI3LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Db2x1bW5zLCBMImNvbHVtbnMiLCAweDk2RkE1RDgxLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9TaG9ydGhhbmR9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX092ZXJmbG93LCBMIm92ZXJmbG93IiwgMHg5N0I3NkI1NCwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfU2hvcnRoYW5kfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9UYWJsZUxheW91dCwgTCJ0YWJsZS1sYXlvdXQiLCAweDlCMUNCNEIzLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfRm9udFZhcmlhbnQsIEwiZm9udC12YXJpYW50IiwgMHg5Qzc4NTc3OSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0xpc3RTdHlsZSwgTCJsaXN0LXN0eWxlIiwgMHg5RTZDNDcxQSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfU2hvcnRoYW5kfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kUG9zaXRpb24sIEwiYmFja2dyb3VuZC1wb3NpdGlvbiIsIDB4QTg4NDZEMjIsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX0xpc3QgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyV2lkdGgsIEwiYm9yZGVyLXdpZHRoIiwgMHhBOERFNEZFQiwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfTGlzdCB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9UZXh0RW1waGFzaXNDb2xvciwgTCJ0ZXh0LWVtcGhhc2lzLWNvbG9yIiwgMHhBQUYyMzQ3OCwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVDb2xvcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyTGVmdFN0eWxlLCBMImJvcmRlci1sZWZ0LXN0eWxlIiwgMHhBQkFGQkFGNCwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1BhZ2VCcmVha0luc2lkZSwgTCJwYWdlLWJyZWFrLWluc2lkZSIsIDB4QUNCNjk1RjgsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9UZXh0RW1waGFzaXMsIEwidGV4dC1lbXBoYXNpcyIsIDB4QUQwRTU4MEMsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQm90dG9tV2lkdGgsIEwiYm9yZGVyLWJvdHRvbS13aWR0aCIsIDB4QUU0MTIwNEQsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Db2x1bW5HYXAsIEwiY29sdW1uLWdhcCIsIDB4QjVDMUJBNzMsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9PcnBoYW5zLCBMIm9ycGhhbnMiLCAweEI3MTY0NjdCLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodCwgTCJib3JkZXItcmlnaHQiLCAweEI3OEU5RUE5LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9TaG9ydGhhbmR9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0ZvbnRTaXplLCBMImZvbnQtc2l6ZSIsIDB4QjkzOTU2REYsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9QYWdlQnJlYWtBZnRlciwgTCJwYWdlLWJyZWFrLWFmdGVyIiwgMHhCQzM1OEFFRSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0NhcHRpb25TaWRlLCBMImNhcHRpb24tc2lkZSIsIDB4QzAzRjM1NjAsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kUmVwZWF0LCBMImJhY2tncm91bmQtcmVwZWF0IiwgMHhDMkMyRkRDRSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcFN0eWxlLCBMImJvcmRlci10b3Atc3R5bGUiLCAweEM2RjMzMzlDLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQm9yZGVyU3BhY2luZywgTCJib3JkZXItc3BhY2luZyIsIDB4QzcyMDMwRjAsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX0xpc3QgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9UZXh0VHJhbnNmb3JtLCBMInRleHQtdHJhbnNmb3JtIiwgMHhDODhFRUE2RSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0ZvbnRTdHlsZSwgTCJmb250LXN0eWxlIiwgMHhDQjE5NTBGNSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0ZvbnQsIEwiZm9udCIsIDB4Q0QzMDhCNzcsIEZERV9DU1NWQUxVRVRZUEVfU2hvcnRoYW5kfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9MaW5lSGVpZ2h0LCBMImxpbmUtaGVpZ2h0IiwgMHhDRkNBQ0UyRSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX01hcmdpblJpZ2h0LCBMIm1hcmdpbi1yaWdodCIsIDB4RDEzQzU4QzksDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXIgfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9GbG9hdCwgTCJmbG9hdCIsIDB4RDE1MzI4NzYsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJMZWZ0V2lkdGgsIEwiYm9yZGVyLWxlZnQtd2lkdGgiLCAweEQxRTkzRDgzLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfRGlzcGxheSwgTCJkaXNwbGF5IiwgMHhENDIyNEMzNiwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0NsZWFyLCBMImNsZWFyIiwgMHhEOEVEMTQ2NywNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0NvbHVtblJ1bGVTdHlsZSwgTCJjb2x1bW4tcnVsZS1zdHlsZSIsIDB4REJDNzc4NzEsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9UZXh0Q29tYmluZSwgTCJ0ZXh0LWNvbWJpbmUiLCAweERDNTIwN0NGLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9MaXN0IHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0xpc3RTdHlsZVBvc2l0aW9uLCBMImxpc3Qtc3R5bGUtcG9zaXRpb24iLCAweEUxQTFERTNDLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfVmlzaWJpbGl0eSwgTCJ2aXNpYmlsaXR5IiwgMHhFMjlGNTE2OCwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1BhZGRpbmdCb3R0b20sIEwicGFkZGluZy1ib3R0b20iLCAweEU1NTVCM0I5LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kQXR0YWNobWVudCwgTCJiYWNrZ3JvdW5kLWF0dGFjaG1lbnQiLCAweEU3Nzk4MUY2LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQmFja2dyb3VuZEltYWdlLCBMImJhY2tncm91bmQtaW1hZ2UiLCAweEU5QUVCNzEwLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZVVSSX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfTGluZUJyZWFrLCBMImxpbmUtYnJlYWsiLCAweEVBMkQxRDlBLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfQmFja2dyb3VuZCwgTCJiYWNrZ3JvdW5kIiwgMHhFQjQ5REQ0MCwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfU2hvcnRoYW5kfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BXaWR0aCwgTCJib3JkZXItdG9wLXdpZHRoIiwgMHhFRDJDQjYyQiwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX1dvcmRTcGFjaW5nLCBMIndvcmQtc3BhY2luZyIsIDB4RURBNjNCQUUsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodENvbG9yLCBMImJvcmRlci1yaWdodC1jb2xvciIsIDB4RjMzNzYyRDUsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlQ29sb3J9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZX0NvdW50ZXJJbmNyZW1lbnQsIEwiY291bnRlci1pbmNyZW1lbnQiLCAweEY0Q0ZCMUIyLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9MaXN0IHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfA0KKyAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXIgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlU3RyaW5nfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9MZWZ0LCBMImxlZnQiLCAweEY1QUQ3ODJCLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8DQorICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfVGV4dERlY29yYXRpb24sIEwidGV4dC1kZWNvcmF0aW9uIiwgMHhGN0M2MzRCQSwNCisgICAgIEZERV9DU1NWQUxVRVRZUEVfTGlzdCB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWV9QYWRkaW5nLCBMInBhZGRpbmciLCAweEY4QzM3M0Y3LA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9MaXN0IHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfTWFyZ2luQm90dG9tLCBMIm1hcmdpbi1ib3R0b20iLCAweEY5MzQ4NUEwLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfTWFyZ2luVG9wLCBMIm1hcmdpbi10b3AiLCAweEZFNTFEQ0ZFLA0KKyAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyIHwNCisgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlfRGlyZWN0aW9uLCBMImRpcmVjdGlvbiIsIDB4RkU3NDZFNjEsDQorICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwNCit9Ow0KK3N0YXRpYyBjb25zdCBGREVfQ1NTUFJPUEVSVFlWQUxVRVRBQkxFIGdfRkRFX0NTU1Byb3BlcnR5VmFsdWVzW10gPSB7DQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb2xkZXIsIEwiYm9sZGVyIiwgMHgwMDlGMTA1OH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Mb3dlckxhdGluLCBMImxvd2VyLWxhdGluIiwgMHgwMTYwMTRDRX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Mb3dlcmNhc2UsIEwibG93ZXJjYXNlIiwgMHgwMkFDQjgwNX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Mb3dlckdyZWVrLCBMImxvd2VyLWdyZWVrIiwgMHgwM0Q4MUQ2NH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9TZXNhbWUsIEwic2VzYW1lIiwgMHgwNDMyRUNERX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lLCBMIm5vbmUiLCAweDA0OEI2NjcwfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX053UmVzaXplLCBMIm53LXJlc2l6ZSIsIDB4MDU0QjRCRTR9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfV1Jlc2l6ZSwgTCJ3LXJlc2l6ZSIsIDB4MEEyRjhENzZ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRG90LCBMImRvdCIsIDB4MEE0OENCMjd9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRW5kLCBMImVuZCIsIDB4MEE2MzE0Mzd9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTHRyLCBMImx0ciIsIDB4MEIxQjU2RDJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfUHJlLCBMInByZSIsIDB4MEI4NDg1ODd9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfUnRsLCBMInJ0bCIsIDB4MEJCOTJDNTJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfU3ViLCBMInN1YiIsIDB4MEJEMzdGQUF9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVG9wLCBMInRvcCIsIDB4MEJFREFGMzN9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVmlzaWJsZSwgTCJ2aXNpYmxlIiwgMHgwRjU1RDdFRX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9GaWxsZWQsIEwiZmlsbGVkIiwgMHgxMDgyN0REMH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Td1Jlc2l6ZSwgTCJzdy1yZXNpemUiLCAweDEwQjU0OEU5fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX05vUmVwZWF0LCBMIm5vLXJlcGVhdCIsIDB4MTIzNUMxOEJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRGVmYXVsdCwgTCJkZWZhdWx0IiwgMHgxNERBMjEyNX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9UcmFuc3BhcmVudCwgTCJ0cmFuc3BhcmVudCIsIDB4MTdCNjREQjJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfUmlkZ2UsIEwicmlkZ2UiLCAweDE4RUJFRTRCfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1JpZ2h0LCBMInJpZ2h0IiwgMHgxOTNBREUzRX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ib3Jpem9udGFsVGIsIEwiaG9yaXpvbnRhbC10YiIsIDB4MUE2NkE4NkR9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRGlzdHJpYnV0ZUxldHRlciwgTCJkaXN0cmlidXRlLWxldHRlciIsIDB4MUVEQkQ3NUN9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRG91YmxlQ2lyY2xlLCBMImRvdWJsZS1jaXJjbGUiLCAweDFGRjA4MkJBfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1J1YnksIEwicnVieSIsIDB4MjBENjZDMDJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQ29sbGFwc2UsIEwiY29sbGFwc2UiLCAweDIxMjhENjczfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX05vcm1hbCwgTCJub3JtYWwiLCAweDI0N0NGM0U5fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0F2b2lkLCBMImF2b2lkIiwgMHgyNEU2ODRCM30sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlclJvbWFuLCBMInVwcGVyLXJvbWFuIiwgMHgyOEJBQzJCNn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9BdXRvLCBMImF1dG8iLCAweDJCMzVCNkQ5fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1RleHQsIEwidGV4dCIsIDB4MkQwOEFGODV9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfWFNtYWxsLCBMIngtc21hbGwiLCAweDJEMkZDQUZFfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1RoaW4sIEwidGhpbiIsIDB4MkQ1NzRENTN9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfUmVwZWF0LCBMInJlcGVhdCIsIDB4MzA2NjE0QTF9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfU21hbGwsIEwic21hbGwiLCAweDMxNkEzNzM5fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX05lUmVzaXplLCBMIm5lLXJlc2l6ZSIsIDB4MzFGRDVFMTJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTm9Db250ZW50LCBMIm5vLWNvbnRlbnQiLCAweDMzQTFDNTQ1fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX091dHNpZGUsIEwib3V0c2lkZSIsIDB4MzZERjY5M0R9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRVJlc2l6ZSwgTCJlLXJlc2l6ZSIsIDB4MzZFMTlGQTR9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVSb3csIEwidGFibGUtcm93IiwgMHgzOTEyQTAyRH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb3R0b20sIEwiYm90dG9tIiwgMHgzOTlGMDJCNX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9VbmRlcmxpbmUsIEwidW5kZXJsaW5lIiwgMHgzQTAyNzNBNn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9DamtJZGVvZ3JhcGhpYywgTCJjamstaWRlb2dyYXBoaWMiLCAweDNBNjQxQ0M0fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1NlUmVzaXplLCBMInNlLXJlc2l6ZSIsIDB4M0Q2NzVCMTd9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRml4ZWQsIEwiZml4ZWQiLCAweDNEN0RFQjEwfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0RvdWJsZSwgTCJkb3VibGUiLCAweDNEOTg1MTVCfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1NvbGlkLCBMInNvbGlkIiwgMHg0MDYyM0I1Qn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdWJ5QmFzZUdyb3VwLCBMInJ1YnktYmFzZS1ncm91cCIsIDB4NDEwMTRFODR9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfT3BlblF1b3RlLCBMIm9wZW4tcXVvdGUiLCAweDQ0QTQxRThEfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0xpZ2h0ZXIsIEwibGlnaHRlciIsIDB4NDVCRUI3QUZ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJSb21hbiwgTCJsb3dlci1yb21hbiIsIDB4NTA0NEQyNTN9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfU3RyaWN0LCBMInN0cmljdCIsIDB4NTJGNEVCRDl9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVDYXB0aW9uLCBMInRhYmxlLWNhcHRpb24iLCAweDUzMjVDRDYzfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX09ibGlxdWUsIEwib2JsaXF1ZSIsIDB4NTNFQkREQjF9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRGVjaW1hbCwgTCJkZWNpbWFsIiwgMHg1NDAzNEMyRn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Mb29zZSwgTCJsb29zZSIsIDB4NTREM0ExRTJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfSGVicmV3LCBMImhlYnJldyIsIDB4NTY1NzkyRER9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfSGlkZGVuLCBMImhpZGRlbiIsIDB4NTczQ0I0MEN9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRGFzaGVkLCBMImRhc2hlZCIsIDB4NThBM0REMjl9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfRW1iZWQsIEwiZW1iZWQiLCAweDU5QzhGMjdEfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlUm93R3JvdXAsIEwidGFibGUtcm93LWdyb3VwIiwgMHg1QTQzQkQwN30sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZUNvbHVtbiwgTCJ0YWJsZS1jb2x1bW4iLCAweDVFNzA1REEzfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1N0YXRpYywgTCJzdGF0aWMiLCAweDVFNzU1NUU4fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX091dHNldCwgTCJvdXRzZXQiLCAweDYxMjM2MTY0fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0RlY2ltYWxMZWFkaW5nWmVybywgTCJkZWNpbWFsLWxlYWRpbmctemVybyIsDQorICAgICAweDYxREZDNTVEfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0tlZXBXb3JkcywgTCJrZWVwLXdvcmRzIiwgMHg2Mzk2NDgwMX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9LYXRha2FuYUlyb2hhLCBMImthdGFrYW5hLWlyb2hhIiwgMHg2NUQ3QzkxQ30sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9TdXBlciwgTCJzdXBlciIsIDB4NkE0Rjg0MkZ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQ2VudGVyLCBMImNlbnRlciIsIDB4NkM1MUFGQzF9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVIZWFkZXJHcm91cCwgTCJ0YWJsZS1oZWFkZXItZ3JvdXAiLCAweDcwNjEwM0Q4fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0luc2lkZSwgTCJpbnNpZGUiLCAweDcwOUNCMEZDfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1h4TGFyZ2UsIEwieHgtbGFyZ2UiLCAweDcwQkIxNTA4fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1RyaWFuZ2xlLCBMInRyaWFuZ2xlIiwgMHg3NTI0RURGNn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdWJ5VGV4dEdyb3VwLCBMInJ1YnktdGV4dC1ncm91cCIsIDB4NzhDMkI5OEV9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQ2lyY2xlLCBMImNpcmNsZSIsIDB4N0FCRUMwRDJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfSGlyYWdhbmEsIEwiaGlyYWdhbmEiLCAweDdCRjVFMjVCfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1JlcGVhdFgsIEwicmVwZWF0LXgiLCAweDdDOEYzMjI2fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1JlcGVhdFksIEwicmVwZWF0LXkiLCAweDdDOEYzMjI3fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX01vdmUsIEwibW92ZSIsIDB4N0RBMDM0MTd9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfSGlyYWdhbmFJcm9oYSwgTCJoaXJhZ2FuYS1pcm9oYSIsIDB4N0VFODYzRkJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfUnVieUJhc2UsIEwicnVieS1iYXNlIiwgMHg3RkQxQjFFQX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9TY3JvbGwsIEwic2Nyb2xsIiwgMHg4NDc4N0FFRn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9TbWFsbGVyLCBMInNtYWxsZXIiLCAweDg0OTc2OUYwfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlRm9vdGVyR3JvdXAsIEwidGFibGUtZm9vdGVyLWdyb3VwIiwgMHg4NUJERDk3RX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9CYXNlbGluZSwgTCJiYXNlbGluZSIsIDB4ODc0MzZCQTN9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfU2VwYXJhdGUsIEwic2VwYXJhdGUiLCAweDg3N0M2NkI1fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0FybWVuaWFuLCBMImFybWVuaWFuIiwgMHg4ODlCRTRFQn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9PcGVuLCBMIm9wZW4iLCAweDhCOTBFMUYyfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1JlbGF0aXZlLCBMInJlbGF0aXZlIiwgMHg4Qzk5NUI1Q30sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9UaGljaywgTCJ0aGljayIsIDB4OENDMzVFQjN9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfSnVzdGlmeSwgTCJqdXN0aWZ5IiwgMHg4RDI2OUNBRX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9NaWRkbGUsIEwibWlkZGxlIiwgMHg5NDdGQTAwRn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9BbHdheXMsIEwiYWx3YXlzIiwgMHg5NTlBQjIzMX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9EaXN0cmlidXRlU3BhY2UsIEwiZGlzdHJpYnV0ZS1zcGFjZSIsIDB4OTdBMjBFNTh9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTGluZUVkZ2UsIEwibGluZS1lZGdlIiwgMHg5QTg0NUQyQX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9QcmVXcmFwLCBMInByZS13cmFwIiwgMHg5RDU5NTg4RX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9NZWRpdW0sIEwibWVkaXVtIiwgMHhBMDg0QTM4MX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9OUmVzaXplLCBMIm4tcmVzaXplIiwgMHhBMDg4OTY4RH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9MaXN0SXRlbSwgTCJsaXN0LWl0ZW0iLCAweEEzMjM4MkI4fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1Nob3csIEwic2hvdyIsIDB4QTY2QzEwQzF9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQ3VycmVudGNvbG9yLCBMImN1cnJlbnRDb2xvciIsIDB4QTc4ODM5MjJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTm9DbG9zZVF1b3RlLCBMIm5vLWNsb3NlLXF1b3RlIiwgMHhBNzlDQkZGQn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9WZXJ0aWNhbExyLCBMInZlcnRpY2FsLWxyIiwgMHhBODY3M0Y2NX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9WZXJ0aWNhbFJsLCBMInZlcnRpY2FsLXJsIiwgMHhBODY3NUUyNX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Qb2ludGVyLCBMInBvaW50ZXIiLCAweEE5MDkyOUMxfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1h4U21hbGwsIEwieHgtc21hbGwiLCAweEFERTFGQzc2fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0JvbGQsIEwiYm9sZCIsIDB4QjE4MzEzQTF9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQm90aCwgTCJib3RoIiwgMHhCMTgzM0NBRH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9TbWFsbENhcHMsIEwic21hbGwtY2FwcyIsIDB4QjI5OTQyOER9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfS2F0YWthbmEsIEwia2F0YWthbmEiLCAweEI0MjFBNEJDfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0FmdGVyLCBMImFmdGVyIiwgMHhCNkI0NDE3Mn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ib3Jpem9udGFsLCBMImhvcml6b250YWwiLCAweEI3NzMyREVBfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0RvdHRlZCwgTCJkb3R0ZWQiLCAweEI4ODY1MkE0fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0Rpc2MsIEwiZGlzYyIsIDB4QkVCQzE4QzN9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfR2VvcmdpYW4sIEwiZ2VvcmdpYW4iLCAweEJFRjk5RThDfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0lubGluZSwgTCJpbmxpbmUiLCAweEMwMkQ2NDlGfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX092ZXJsaW5lLCBMIm92ZXJsaW5lIiwgMHhDMEVDOUZBNH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9XYWl0LCBMIndhaXQiLCAweEMxNjEzQkI1fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0JyZWFrQWxsLCBMImJyZWFrLWFsbCIsIDB4QzMxNDVCQUJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVXBwZXJBbHBoYSwgTCJ1cHBlci1hbHBoYSIsIDB4QzUyRDRBOUZ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQ2FwaXRhbGl6ZSwgTCJjYXBpdGFsaXplIiwgMHhDNTMyMUQ0Nn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob3dyYXAsIEwibm93cmFwIiwgMHhDNzk5NDQxN30sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9UZXh0Qm90dG9tLCBMInRleHQtYm90dG9tIiwgMHhDN0QwOEQ4N30sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob09wZW5RdW90ZSwgTCJuby1vcGVuLXF1b3RlIiwgMHhDOENENzg3N30sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Hcm9vdmUsIEwiZ3Jvb3ZlIiwgMHhDQjI0QTQxMn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Qcm9ncmVzcywgTCJwcm9ncmVzcyIsIDB4Q0QxRDk4MzV9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTGFyZ2VyLCBMImxhcmdlciIsIDB4Q0QzQzQwOUR9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfQ2xvc2VRdW90ZSwgTCJjbG9zZS1xdW90ZSIsIDB4Q0Y4Njk2RDF9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVDZWxsLCBMInRhYmxlLWNlbGwiLCAweENGQjVFNTk1fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1ByZUxpbmUsIEwicHJlLWxpbmUiLCAweEQwNEZFREJDfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0Fic29sdXRlLCBMImFic29sdXRlIiwgMHhEMEIyRDU1Rn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9JbmxpbmVUYWJsZSwgTCJpbmxpbmUtdGFibGUiLCAweEQxMzFGNDk0fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0JpZGlPdmVycmlkZSwgTCJiaWRpLW92ZXJyaWRlIiwgMHhEMTYxRkRFNX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9JbmxpbmVCbG9jaywgTCJpbmxpbmUtYmxvY2siLCAweEQyNkE4QkQ3fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0luc2V0LCBMImluc2V0IiwgMHhENkYyMzI0M30sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9Dcm9zc2hhaXIsIEwiY3Jvc3NoYWlyIiwgMHhENkY4MDE4RX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlckxhdGluLCBMInVwcGVyLWxhdGluIiwgMHhEOUQ2MDUzMX0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9IZWxwLCBMImhlbHAiLCAweERBMDAyOTY5fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0hpZGUsIEwiaGlkZSIsIDB4REE2OTM5NUF9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVXBwZXJjYXNlLCBMInVwcGVyY2FzZSIsIDB4REFENTk1QTh9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfU1Jlc2l6ZSwgTCJzLXJlc2l6ZSIsIDB4REIzQUFERjJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGUsIEwidGFibGUiLCAweERCOUJFOTY4fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0JsaW5rLCBMImJsaW5rIiwgMHhEQzM2RTM5MH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9CbG9jaywgTCJibG9jayIsIDB4RENENDgwQUJ9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfU3RhcnQsIEwic3RhcnQiLCAweEUxRDlENUFFfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlQ29sdW1uR3JvdXAsIEwidGFibGUtY29sdW1uLWdyb3VwIiwgMHhFMjI1OEVGRH0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9JdGFsaWMsIEwiaXRhbGljIiwgMHhFMzFENTM5Nn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9MaW5lVGhyb3VnaCwgTCJsaW5lLXRocm91Z2giLCAweEU0QzVBMjc2fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0tlZXBBbGwsIEwia2VlcC1hbGwiLCAweEU3MDRBNzJCfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyQWxwaGEsIEwibG93ZXItYWxwaGEiLCAweEVDQjc1QTNDfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1J1bkluLCBMInJ1bi1pbiIsIDB4RUVDOTMwQjl9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfU3F1YXJlLCBMInNxdWFyZSIsIDB4RUY4NUQzNTF9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfWExhcmdlLCBMIngtbGFyZ2UiLCAweEYwMDhFMzkwfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX0xhcmdlLCBMImxhcmdlIiwgMHhGNDQzNEZDQn0sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9CZWZvcmUsIEwiYmVmb3JlIiwgMHhGNEZGQ0U3M30sDQorICAgIHtGREVfQ1NTUFJPUEVSVFlWQUxVRV9MZWZ0LCBMImxlZnQiLCAweEY1QUQ3ODJCfSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1RleHRUb3AsIEwidGV4dC10b3AiLCAweEZDQjU4RDQ1fSwNCisgICAge0ZERV9DU1NQUk9QRVJUWVZBTFVFX1J1YnlUZXh0LCBMInJ1YnktdGV4dCIsIDB4RkNDNzcxNzR9LA0KKyAgICB7RkRFX0NTU1BST1BFUlRZVkFMVUVfTm9EaXNwbGF5LCBMIm5vLWRpc3BsYXkiLCAweEZFNDgyODYwfSwNCit9Ow0KK3N0YXRpYyBjb25zdCBGREVfQ1NTTUVESUFUWVBFVEFCTEUgZ19GREVfQ1NTTWVkaWFUeXBlc1tdID0gew0KKyAgICB7MHhGMDksIDB4MDJ9LCAgezB4NDg4MCwgMHgyMH0sIHsweDUzNkEsIDB4ODB9LA0KKyAgICB7MHg3NDFELCAweDEwfSwgezB4NzZFRCwgMHgwOH0sIHsweDdDRkIsIDB4MDF9LA0KKyAgICB7MHg5NTc4LCAweDA0fSwgezB4QzhFMSwgMHg0MH0sIHsweEQwRjksIDB4RkZ9LA0KK307DQorc3RhdGljIGNvbnN0IEZERV9DU1NMRU5HVEhVTklUVEFCTEUgZ19GREVfQ1NTTGVuZ3RoVW5pdHNbXSA9IHsNCisgICAgezB4MDY3MiwgM30sICB7MHgwNjdELCA0fSwgezB4MUFGNywgOH0sIHsweDJGN0EsIDd9LA0KKyAgICB7MHgzRUQzLCAxMH0sIHsweDNFRTQsIDl9LCB7MHgzRUU4LCA1fSwgezB4RkMzMCwgNn0sDQorfTsNCitzdGF0aWMgY29uc3QgRkRFX0NTU0NPTE9SVEFCTEUgZ19GREVfQ1NTQ29sb3JzW10gPSB7DQorICAgIHsweDAzMUI0N0ZFLCAweGZmMDAwMDgwfSwgezB4MEJCOERGNUIsIDB4ZmZmZjAwMDB9LA0KKyAgICB7MHgwRDgyQTc4QywgMHhmZjgwMDAwMH0sIHsweDJBQ0M4MkU4LCAweGZmMDBmZmZmfSwNCisgICAgezB4MkQwODM5ODYsIDB4ZmYwMDgwODB9LCB7MHg0QTZBNjE5NSwgMHhmZmMwYzBjMH0sDQorICAgIHsweDU0NkE4RUYzLCAweGZmODA4MDgwfSwgezB4NjVDOTE2OUMsIDB4ZmZmZmE1MDB9LA0KKyAgICB7MHg4NDIyQkI2MSwgMHhmZmZmZmZmZn0sIHsweDkyNzFBNTU4LCAweGZmODAwMDgwfSwNCisgICAgezB4QTY1QTNFRTMsIDB4ZmZmZjAwZmZ9LCB7MHhCMTM0NTcwOCwgMHhmZjAwMDBmZn0sDQorICAgIHsweEI2RDJDRjFGLCAweGZmODA4MDAwfSwgezB4RDE5QjVFMUMsIDB4ZmZmZmZmMDB9LA0KKyAgICB7MHhEQjY0MzkxRCwgMHhmZjAwMDAwMH0sIHsweEY2MTZENTA3LCAweGZmMDBmZjAwfSwNCisgICAgezB4RjZFRkZGMzEsIDB4ZmYwMDgwMDB9LA0KK307DQorc3RhdGljIGNvbnN0IEZERV9DU1NQRVJTVURPVEFCTEUgZ19GREVfQ1NTUGVyc3Vkb1R5cGVbXSA9IHsNCisgICAge0ZERV9DU1NQRVJTVURPX0FmdGVyLCBMIjphZnRlciIsIDB4MTZFRTFGRUN9LA0KKyAgICB7RkRFX0NTU1BFUlNVRE9fQmVmb3JlLCBMIjpiZWZvcmUiLCAweDdEQ0RERTJEfSwNCit9Ow0KK0ZERV9MUENDU1NQRVJTVURPVEFCTEUgRkRFX0dldENTU1BlcnN1ZG9CeUVudW0oRkRFX0NTU1BFUlNVRE8gZVBlcnN1ZG8pIHsNCisgIHJldHVybiAoZVBlcnN1ZG8gPCBGREVfQ1NTUEVSU1VET19OT05FKSA/IChnX0ZERV9DU1NQZXJzdWRvVHlwZSArIGVQZXJzdWRvKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTDsNCit9DQorRkRFX0xQQ0NTU1BST1BFUlRZVEFCTEUgRkRFX0dldENTU1Byb3BlcnR5QnlOYW1lKGNvbnN0IEZYX1dDSEFSKiBwc3pOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgpIHsNCisgIEZYU1lTX2Fzc2VydChwc3pOYW1lICE9IE5VTEwgJiYgaUxlbmd0aCA+IDApOw0KKyAgRlhfRFdPUkQgZHdIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcocHN6TmFtZSwgaUxlbmd0aCwgVFJVRSk7DQorICBpbnQzMl90IGlFbmQgPSBGREVfQ1NTUFJPUEVSVFlfTUFYIC0gMTsNCisgIGludDMyX3QgaU1pZCwgaVN0YXJ0ID0gMDsNCisgIEZYX0RXT1JEIGR3TWlkOw0KKyAgZG8gew0KKyAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgZHdNaWQgPSBnX0ZERV9DU1NQcm9wZXJ0aWVzW2lNaWRdLmR3SGFzaDsNCisgICAgaWYgKGR3SGFzaCA9PSBkd01pZCkgew0KKyAgICAgIHJldHVybiBnX0ZERV9DU1NQcm9wZXJ0aWVzICsgaU1pZDsNCisgICAgfSBlbHNlIGlmIChkd0hhc2ggPiBkd01pZCkgew0KKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgfQ0KKyAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZERV9MUENDU1NQUk9QRVJUWVRBQkxFIEZERV9HZXRDU1NQcm9wZXJ0eUJ5RW51bShGREVfQ1NTUFJPUEVSVFkgZU5hbWUpIHsNCisgIHJldHVybiAoZU5hbWUgPCBGREVfQ1NTUFJPUEVSVFlfTUFYKSA/IChnX0ZERV9DU1NQcm9wZXJ0aWVzICsgZU5hbWUpIDogTlVMTDsNCit9DQorRkRFX0xQQ0NTU1BST1BFUlRZVkFMVUVUQUJMRSBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZSgNCisgICAgY29uc3QgRlhfV0NIQVIqIHBzek5hbWUsDQorICAgIGludDMyX3QgaUxlbmd0aCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBzek5hbWUgIT0gTlVMTCAmJiBpTGVuZ3RoID4gMCk7DQorICBGWF9EV09SRCBkd0hhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyhwc3pOYW1lLCBpTGVuZ3RoLCBUUlVFKTsNCisgIGludDMyX3QgaUVuZCA9IEZERV9DU1NQUk9QRVJUWVZBTFVFX01BWCAtIDE7DQorICBpbnQzMl90IGlNaWQsIGlTdGFydCA9IDA7DQorICBGWF9EV09SRCBkd01pZDsNCisgIGRvIHsNCisgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgIGR3TWlkID0gZ19GREVfQ1NTUHJvcGVydHlWYWx1ZXNbaU1pZF0uZHdIYXNoOw0KKyAgICBpZiAoZHdIYXNoID09IGR3TWlkKSB7DQorICAgICAgcmV0dXJuIGdfRkRFX0NTU1Byb3BlcnR5VmFsdWVzICsgaU1pZDsNCisgICAgfSBlbHNlIGlmIChkd0hhc2ggPiBkd01pZCkgew0KKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgfQ0KKyAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZERV9MUENDU1NQUk9QRVJUWVZBTFVFVEFCTEUgRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeUVudW0oDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFIGVOYW1lKSB7DQorICByZXR1cm4gKGVOYW1lIDwgRkRFX0NTU1BST1BFUlRZVkFMVUVfTUFYKSA/IChnX0ZERV9DU1NQcm9wZXJ0eVZhbHVlcyArIGVOYW1lKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOw0KK30NCitGREVfTFBDQ1NTTUVESUFUWVBFVEFCTEUgRkRFX0dldENTU01lZGlhVHlwZUJ5TmFtZShjb25zdCBGWF9XQ0hBUiogcHN6TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgpIHsNCisgIEZYU1lTX2Fzc2VydChwc3pOYW1lICE9IE5VTEwgJiYgaUxlbmd0aCA+IDApOw0KKyAgRlhfV09SRCB3SGFzaCA9IChGWF9XT1JEKUZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHBzek5hbWUsIGlMZW5ndGgsIFRSVUUpOw0KKyAgaW50MzJfdCBpRW5kID0NCisgICAgICBzaXplb2YoZ19GREVfQ1NTTWVkaWFUeXBlcykgLyBzaXplb2YoRkRFX0NTU01FRElBVFlQRVRBQkxFKSAtIDE7DQorICBpbnQzMl90IGlNaWQsIGlTdGFydCA9IDA7DQorICBGWF9XT1JEIHVNaWQ7DQorICBkbyB7DQorICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICB1TWlkID0gZ19GREVfQ1NTTWVkaWFUeXBlc1tpTWlkXS53SGFzaDsNCisgICAgaWYgKHdIYXNoID09IHVNaWQpIHsNCisgICAgICByZXR1cm4gZ19GREVfQ1NTTWVkaWFUeXBlcyArIGlNaWQ7DQorICAgIH0gZWxzZSBpZiAod0hhc2ggPiB1TWlkKSB7DQorICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgIH0gZWxzZSB7DQorICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICB9DQorICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICByZXR1cm4gTlVMTDsNCit9DQorRkRFX0xQQ0NTU0xFTkdUSFVOSVRUQUJMRSBGREVfR2V0Q1NTTGVuZ3RoVW5pdEJ5TmFtZShjb25zdCBGWF9XQ0hBUiogcHN6TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBzek5hbWUgIT0gTlVMTCAmJiBpTGVuZ3RoID4gMCk7DQorICBGWF9XT1JEIHdIYXNoID0gKEZYX1dPUkQpRlhfSGFzaENvZGVfU3RyaW5nX0dldFcocHN6TmFtZSwgaUxlbmd0aCwgVFJVRSk7DQorICBpbnQzMl90IGlFbmQgPQ0KKyAgICAgIHNpemVvZihnX0ZERV9DU1NMZW5ndGhVbml0cykgLyBzaXplb2YoRkRFX0NTU0xFTkdUSFVOSVRUQUJMRSkgLSAxOw0KKyAgaW50MzJfdCBpTWlkLCBpU3RhcnQgPSAwOw0KKyAgRlhfV09SRCB3TWlkOw0KKyAgZG8gew0KKyAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgd01pZCA9IGdfRkRFX0NTU0xlbmd0aFVuaXRzW2lNaWRdLndIYXNoOw0KKyAgICBpZiAod0hhc2ggPT0gd01pZCkgew0KKyAgICAgIHJldHVybiBnX0ZERV9DU1NMZW5ndGhVbml0cyArIGlNaWQ7DQorICAgIH0gZWxzZSBpZiAod0hhc2ggPiB3TWlkKSB7DQorICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgIH0gZWxzZSB7DQorICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICB9DQorICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICByZXR1cm4gTlVMTDsNCit9DQorRkRFX0xQQ0NTU0NPTE9SVEFCTEUgRkRFX0dldENTU0NvbG9yQnlOYW1lKGNvbnN0IEZYX1dDSEFSKiBwc3pOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgpIHsNCisgIEZYU1lTX2Fzc2VydChwc3pOYW1lICE9IE5VTEwgJiYgaUxlbmd0aCA+IDApOw0KKyAgRlhfRFdPUkQgZHdIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcocHN6TmFtZSwgaUxlbmd0aCwgVFJVRSk7DQorICBpbnQzMl90IGlFbmQgPSBzaXplb2YoZ19GREVfQ1NTQ29sb3JzKSAvIHNpemVvZihGREVfQ1NTQ09MT1JUQUJMRSkgLSAxOw0KKyAgaW50MzJfdCBpTWlkLCBpU3RhcnQgPSAwOw0KKyAgRlhfRFdPUkQgZHdNaWQ7DQorICBkbyB7DQorICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICBkd01pZCA9IGdfRkRFX0NTU0NvbG9yc1tpTWlkXS5kd0hhc2g7DQorICAgIGlmIChkd0hhc2ggPT0gZHdNaWQpIHsNCisgICAgICByZXR1cm4gZ19GREVfQ1NTQ29sb3JzICsgaU1pZDsNCisgICAgfSBlbHNlIGlmIChkd0hhc2ggPiBkd01pZCkgew0KKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgfQ0KKyAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX0JPT0wgRkRFX1BhcnNlQ1NTTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZlZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUklNSVRJVkVUWVBFJiBlVW5pdCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBzelZhbHVlICE9IE5VTEwgJiYgaVZhbHVlTGVuID4gMCk7DQorICBpbnQzMl90IGlVc2VkTGVuID0gMDsNCisgIGZWYWx1ZSA9IEZYX3djc3RvZihwc3pWYWx1ZSwgaVZhbHVlTGVuLCAmaVVzZWRMZW4pOw0KKyAgaWYgKGlVc2VkTGVuIDw9IDApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaVZhbHVlTGVuIC09IGlVc2VkTGVuOw0KKyAgcHN6VmFsdWUgKz0gaVVzZWRMZW47DQorICBlVW5pdCA9IEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcjsNCisgIGlmIChpVmFsdWVMZW4gPj0gMSAmJiAqcHN6VmFsdWUgPT0gJyUnKSB7DQorICAgIGVVbml0ID0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUGVyY2VudDsNCisgIH0gZWxzZSBpZiAoaVZhbHVlTGVuID09IDIpIHsNCisgICAgRkRFX0xQQ0NTU0xFTkdUSFVOSVRUQUJMRSBwVW5pdCA9IEZERV9HZXRDU1NMZW5ndGhVbml0QnlOYW1lKHBzelZhbHVlLCAyKTsNCisgICAgaWYgKHBVbml0ICE9IE5VTEwpIHsNCisgICAgICBlVW5pdCA9IChGREVfQ1NTUFJJTUlUSVZFVFlQRSlwVW5pdC0+d1ZhbHVlOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorDQorRlhfQk9PTCBGREVfUGFyc2VDU1NTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlPZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUxlbmd0aCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBzelZhbHVlICE9IE5VTEwgJiYgaVZhbHVlTGVuID4gMCk7DQorICBpT2Zmc2V0ID0gMDsNCisgIGlMZW5ndGggPSBpVmFsdWVMZW47DQorICBpZiAoaVZhbHVlTGVuID49IDIpIHsNCisgICAgRlhfV0NIQVIgZmlyc3QgPSBwc3pWYWx1ZVswXSwgbGFzdCA9IHBzelZhbHVlW2lWYWx1ZUxlbiAtIDFdOw0KKyAgICBpZiAoKGZpcnN0ID09ICdcIicgJiYgbGFzdCA9PSAnXCInKSB8fCAoZmlyc3QgPT0gJ1wnJyAmJiBsYXN0ID09ICdcJycpKSB7DQorICAgICAgaU9mZnNldCA9IDEsIGlMZW5ndGggLT0gMjsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGlWYWx1ZUxlbiA+IDA7DQorfQ0KKw0KK0ZYX0JPT0wgRkRFX1BhcnNlQ1NTVVJJKGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpT2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlMZW5ndGgpIHsNCisgIEZYU1lTX2Fzc2VydChwc3pWYWx1ZSAhPSBOVUxMICYmIGlWYWx1ZUxlbiA+IDApOw0KKyAgaWYgKGlWYWx1ZUxlbiA8IDYgfHwgcHN6VmFsdWVbaVZhbHVlTGVuIC0gMV0gIT0gJyknIHx8DQorICAgICAgRlhfd2NzbmljbXAoTCJ1cmwoIiwgcHN6VmFsdWUsIDQpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChGREVfUGFyc2VDU1NTdHJpbmcocHN6VmFsdWUgKyA0LCBpVmFsdWVMZW4gLSA1LCBpT2Zmc2V0LCBpTGVuZ3RoKSkgew0KKyAgICBpT2Zmc2V0ICs9IDQ7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCisNCitGWF9CT09MIEZERV9QYXJzZUNTU0NvbG9yKGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiYgZHdDb2xvcikgew0KKyAgRlhTWVNfYXNzZXJ0KHBzelZhbHVlICE9IE5VTEwgJiYgaVZhbHVlTGVuID4gMCk7DQorICBpZiAoKnBzelZhbHVlID09ICcjJykgew0KKyAgICBzd2l0Y2ggKGlWYWx1ZUxlbikgew0KKyAgICAgIGNhc2UgNDogew0KKyAgICAgICAgdWludDhfdCByZWQgPSBGWF9IZXgyRGVjKCh1aW50OF90KXBzelZhbHVlWzFdLCAodWludDhfdClwc3pWYWx1ZVsxXSk7DQorICAgICAgICB1aW50OF90IGdyZWVuID0gRlhfSGV4MkRlYygodWludDhfdClwc3pWYWx1ZVsyXSwgKHVpbnQ4X3QpcHN6VmFsdWVbMl0pOw0KKyAgICAgICAgdWludDhfdCBibHVlID0gRlhfSGV4MkRlYygodWludDhfdClwc3pWYWx1ZVszXSwgKHVpbnQ4X3QpcHN6VmFsdWVbM10pOw0KKyAgICAgICAgZHdDb2xvciA9IEFyZ2JFbmNvZGUoMjU1LCByZWQsIGdyZWVuLCBibHVlKTsNCisgICAgICB9DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICBjYXNlIDc6IHsNCisgICAgICAgIHVpbnQ4X3QgcmVkID0gRlhfSGV4MkRlYygodWludDhfdClwc3pWYWx1ZVsxXSwgKHVpbnQ4X3QpcHN6VmFsdWVbMl0pOw0KKyAgICAgICAgdWludDhfdCBncmVlbiA9IEZYX0hleDJEZWMoKHVpbnQ4X3QpcHN6VmFsdWVbM10sICh1aW50OF90KXBzelZhbHVlWzRdKTsNCisgICAgICAgIHVpbnQ4X3QgYmx1ZSA9IEZYX0hleDJEZWMoKHVpbnQ4X3QpcHN6VmFsdWVbNV0sICh1aW50OF90KXBzelZhbHVlWzZdKTsNCisgICAgICAgIGR3Q29sb3IgPSBBcmdiRW5jb2RlKDI1NSwgcmVkLCBncmVlbiwgYmx1ZSk7DQorICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgIH0gZWxzZSBpZiAoaVZhbHVlTGVuID49IDEwKSB7DQorICAgIGlmIChwc3pWYWx1ZVtpVmFsdWVMZW4gLSAxXSAhPSAnKScgfHwgRlhfd2NzbmljbXAoTCJyZ2IoIiwgcHN6VmFsdWUsIDQpKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHVpbnQ4X3QgcmdiWzNdID0gezB9Ow0KKyAgICBGWF9GTE9BVCBmVmFsdWU7DQorICAgIEZERV9DU1NQUklNSVRJVkVUWVBFIGVUeXBlOw0KKyAgICBDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlciBsaXN0KHBzelZhbHVlICsgNCwgaVZhbHVlTGVuIC0gNSwgJywnKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMzsgKytpKSB7DQorICAgICAgaWYgKCFsaXN0Lk5leHRWYWx1ZShlVHlwZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbikpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgaWYgKGVUeXBlICE9IEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcikgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBpZiAoIUZERV9QYXJzZUNTU051bWJlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBmVmFsdWUsIGVUeXBlKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICByZ2JbaV0gPSBlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9QZXJjZW50DQorICAgICAgICAgICAgICAgICAgID8gRlhTWVNfcm91bmQoZlZhbHVlICogMi41NWYpDQorICAgICAgICAgICAgICAgICAgIDogRlhTWVNfcm91bmQoZlZhbHVlKTsNCisgICAgfQ0KKyAgICBkd0NvbG9yID0gQXJnYkVuY29kZSgyNTUsIHJnYlswXSwgcmdiWzFdLCByZ2JbMl0pOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0gZWxzZSB7DQorICAgIEZERV9MUENDU1NDT0xPUlRBQkxFIHBDb2xvciA9IEZERV9HZXRDU1NDb2xvckJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgaWYgKHBDb2xvciAhPSBOVUxMKSB7DQorICAgICAgZHdDb2xvciA9IHBDb2xvci0+ZHdWYWx1ZTsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCisNCitDRkRFX0NTU1ZhbHVlTGlzdDo6Q0ZERV9DU1NWYWx1ZUxpc3QoSUZYX01FTUFsbG9jYXRvciogcFN0YXRpY1N0b3JlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRkRFX0NTU1ZhbHVlQXJyYXkmIGxpc3QpIHsNCisgIG1faUNvdW50ID0gbGlzdC5HZXRTaXplKCk7DQorICBpbnQzMl90IGlCeXRlQ291bnQgPSBtX2lDb3VudCAqIHNpemVvZihJRkRFX0NTU1ZhbHVlKik7DQorICBtX3BwTGlzdCA9IChJRkRFX0NTU1ZhbHVlKiopcFN0YXRpY1N0b3JlLT5BbGxvYyhpQnl0ZUNvdW50KTsNCisgIEZYU1lTX21lbWNweShtX3BwTGlzdCwgbGlzdC5HZXREYXRhKCksIGlCeXRlQ291bnQpOw0KK30NCitGWF9CT09MIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyOjpOZXh0VmFsdWUoRkRFX0NTU1BSSU1JVElWRVRZUEUmIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiomIHBTdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUxlbmd0aCkgew0KKyAgd2hpbGUgKG1fcEN1ciA8IG1fcEVuZCAmJiAoKm1fcEN1ciA8PSAnICcgfHwgKm1fcEN1ciA9PSBtX1NlcGFyYXRvcikpIHsNCisgICAgKyttX3BDdXI7DQorICB9DQorICBpZiAobV9wQ3VyID49IG1fcEVuZCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBlVHlwZSA9IEZERV9DU1NQUklNSVRJVkVUWVBFX1Vua25vd247DQorICBwU3RhcnQgPSBtX3BDdXI7DQorICBpTGVuZ3RoID0gMDsNCisgIEZYX1dDSEFSIHdjaCA9ICptX3BDdXI7DQorICBpZiAod2NoID09ICcjJykgew0KKyAgICBpTGVuZ3RoID0gU2tpcFRvKCcgJyk7DQorICAgIGlmIChpTGVuZ3RoID09IDQgfHwgaUxlbmd0aCA9PSA3KSB7DQorICAgICAgZVR5cGUgPSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9SR0I7DQorICAgIH0NCisgIH0gZWxzZSBpZiAoKHdjaCA+PSAnMCcgJiYgd2NoIDw9ICc5JykgfHwgd2NoID09ICcuJyB8fCB3Y2ggPT0gJy0nIHx8DQorICAgICAgICAgICAgIHdjaCA9PSAnKycpIHsNCisgICAgd2hpbGUgKG1fcEN1ciA8IG1fcEVuZCAmJiAoKm1fcEN1ciA+ICcgJyAmJiAqbV9wQ3VyICE9IG1fU2VwYXJhdG9yKSkgew0KKyAgICAgICsrbV9wQ3VyOw0KKyAgICB9DQorICAgIGlMZW5ndGggPSBtX3BDdXIgLSBwU3RhcnQ7DQorICAgIGlmIChpTGVuZ3RoID4gMCkgew0KKyAgICAgIGVUeXBlID0gRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyOw0KKyAgICB9DQorICB9IGVsc2UgaWYgKHdjaCA9PSAnXCInIHx8IHdjaCA9PSAnXCcnKSB7DQorICAgIHBTdGFydCsrOw0KKyAgICBpTGVuZ3RoID0gU2tpcFRvKHdjaCkgLSAxOw0KKyAgICBtX3BDdXIrKzsNCisgICAgZVR5cGUgPSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmc7DQorICB9IGVsc2UgaWYgKG1fcEVuZCAtIG1fcEN1ciA+IDUgJiYgbV9wQ3VyWzNdID09ICcoJykgew0KKyAgICBpZiAoRlhfd2NzbmljbXAoTCJ1cmwiLCBtX3BDdXIsIDMpID09IDApIHsNCisgICAgICB3Y2ggPSBtX3BDdXJbNF07DQorICAgICAgaWYgKHdjaCA9PSAnXCInIHx8IHdjaCA9PSAnXCcnKSB7DQorICAgICAgICBwU3RhcnQgKz0gNTsNCisgICAgICAgIGlMZW5ndGggPSBTa2lwVG8od2NoKSAtIDY7DQorICAgICAgICBtX3BDdXIgKz0gMjsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcFN0YXJ0ICs9IDQ7DQorICAgICAgICBpTGVuZ3RoID0gU2tpcFRvKCcpJykgLSA0Ow0KKyAgICAgICAgbV9wQ3VyKys7DQorICAgICAgfQ0KKyAgICAgIGVUeXBlID0gRkRFX0NTU1BSSU1JVElWRVRZUEVfVVJJOw0KKyAgICB9IGVsc2UgaWYgKEZYX3djc25pY21wKEwicmdiIiwgbV9wQ3VyLCAzKSA9PSAwKSB7DQorICAgICAgaUxlbmd0aCA9IFNraXBUbygnKScpICsgMTsNCisgICAgICBtX3BDdXIrKzsNCisgICAgICBlVHlwZSA9IEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQjsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgaUxlbmd0aCA9IFNraXBUbyhtX1NlcGFyYXRvciwgVFJVRSwgVFJVRSk7DQorICAgIGVUeXBlID0gRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcEN1ciA8PSBtX3BFbmQgJiYgaUxlbmd0aCA+IDA7DQorfQ0KK2ludDMyX3QgQ0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXI6OlNraXBUbyhGWF9XQ0hBUiB3Y2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYldTU2VwYXJhdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJCckNvbnRpbnVlKSB7DQorICBjb25zdCBGWF9XQ0hBUiogcFN0YXJ0ID0gbV9wQ3VyOw0KKyAgaWYgKCFiQnJDb250aW51ZSkgew0KKyAgICBpZiAoYldTU2VwYXJhdG9yKQ0KKyAgICAgIHdoaWxlICgrK21fcEN1cjxtX3BFbmQmJiAqIG1fcEN1ciAhPSB3Y2gmJiAqIG1fcEN1cj4gJyAnKQ0KKyAgICAgICAgOw0KKyAgICBlbHNlDQorICAgICAgd2hpbGUgKCsrbV9wQ3VyIDwgbV9wRW5kICYmICptX3BDdXIgIT0gd2NoKQ0KKyAgICAgICAgOw0KKyAgfSBlbHNlIHsNCisgICAgaW50MzJfdCBpQnJhY2tldENvdW50ID0gMDsNCisgICAgaWYgKGJXU1NlcGFyYXRvcikgew0KKyAgICAgIHdoaWxlIChtX3BDdXI8bV9wRW5kJiYgKiBtX3BDdXIgIT0gd2NoJiYgKiBtX3BDdXI+ICcgJykgew0KKyAgICAgICAgaWYgKCptX3BDdXIgPT0gJygnKSB7DQorICAgICAgICAgIGlCcmFja2V0Q291bnQrKzsNCisgICAgICAgIH0gZWxzZSBpZiAoKm1fcEN1ciA9PSAnKScpIHsNCisgICAgICAgICAgaUJyYWNrZXRDb3VudC0tOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wQ3VyKys7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHdoaWxlIChtX3BDdXIgPCBtX3BFbmQgJiYgKm1fcEN1ciAhPSB3Y2gpIHsNCisgICAgICAgIGlmICgqbV9wQ3VyID09ICcoJykgew0KKyAgICAgICAgICBpQnJhY2tldENvdW50Kys7DQorICAgICAgICB9IGVsc2UgaWYgKCptX3BDdXIgPT0gJyknKSB7DQorICAgICAgICAgIGlCcmFja2V0Q291bnQtLTsNCisgICAgICAgIH0NCisgICAgICAgIG1fcEN1cisrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICB3aGlsZSAoaUJyYWNrZXRDb3VudCA+IDAgJiYgbV9wQ3VyIDwgbV9wRW5kKSB7DQorICAgICAgaWYgKCptX3BDdXIgPT0gJyknKSB7DQorICAgICAgICBpQnJhY2tldENvdW50LS07DQorICAgICAgfQ0KKyAgICAgIG1fcEN1cisrOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gbV9wQ3VyIC0gcFN0YXJ0Ow0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NkYXRhdGFibGUuaCBiL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2RhdGF0YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNzVkNTUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NkYXRhdGFibGUuaApAQCAtMCwwICsxLDE5NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GREVfQ1NTREFUQVRBQkxFDQorI2RlZmluZSBfRkRFX0NTU0RBVEFUQUJMRQ0KK2NsYXNzIENGREVfQ1NTRnVuY3Rpb24gOiBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGREVfQ1NTRnVuY3Rpb24oY29uc3QgRlhfV0NIQVIqIHBzekZ1bmNOYW1lLCBJRkRFX0NTU1ZhbHVlTGlzdCogcEFyZ0xpc3QpDQorICAgICAgOiBtX3BBcmdMaXN0KHBBcmdMaXN0KSwgbV9wc3pGdW5jTmFtZShwc3pGdW5jTmFtZSkgew0KKyAgICBGWFNZU19hc3NlcnQocEFyZ0xpc3QgIT0gTlVMTCk7DQorICB9DQorICBpbnQzMl90IENvdW50QXJncygpIGNvbnN0IHsgcmV0dXJuIG1fcEFyZ0xpc3QtPkNvdW50VmFsdWVzKCk7IH0NCisgIElGREVfQ1NTVmFsdWUqIEdldEFyZ3MoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9wQXJnTGlzdC0+R2V0VmFsdWUoaW5kZXgpOw0KKyAgfQ0KKyAgY29uc3QgRlhfV0NIQVIqIEdldEZ1bmNOYW1lKCkgY29uc3QgeyByZXR1cm4gbV9wc3pGdW5jTmFtZTsgfTsNCisNCisgcHJvdGVjdGVkOg0KKyAgSUZERV9DU1NWYWx1ZUxpc3QqIG1fcEFyZ0xpc3Q7DQorICBjb25zdCBGWF9XQ0hBUiogbV9wc3pGdW5jTmFtZTsNCit9Ow0KK2NsYXNzIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUgOiBwdWJsaWMgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKGNvbnN0IENGREVfQ1NTUHJpbWl0aXZlVmFsdWUmIHNyYykgeyAqdGhpcyA9IHNyYzsgfQ0KKyAgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShGWF9BUkdCIGNvbG9yKQ0KKyAgICAgIDogbV9lVHlwZShGREVfQ1NTUFJJTUlUSVZFVFlQRV9SR0IpLCBtX2R3Q29sb3IoY29sb3IpIHt9DQorICBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkNCisgICAgICA6IG1fZVR5cGUoRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSksIG1fZUVudW0oZVZhbHVlKSB7fQ0KKyAgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVHlwZSwgRlhfRkxPQVQgZlZhbHVlKQ0KKyAgICAgIDogbV9lVHlwZShlVHlwZSksIG1fZk51bWJlcihmVmFsdWUpIHt9DQorICBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKEZERV9DU1NQUklNSVRJVkVUWVBFIGVUeXBlLCBjb25zdCBGWF9XQ0hBUiogcFZhbHVlKQ0KKyAgICAgIDogbV9lVHlwZShlVHlwZSksIG1fcFN0cmluZyhwVmFsdWUpIHsNCisgICAgRlhTWVNfYXNzZXJ0KG1fcFN0cmluZyAhPSBOVUxMKTsNCisgIH0NCisgIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoQ0ZERV9DU1NGdW5jdGlvbiogcEZ1bmN0aW9uKQ0KKyAgICAgIDogbV9lVHlwZShGREVfQ1NTUFJJTUlUSVZFVFlQRV9GdW5jdGlvbiksIG1fcEZ1bmN0aW9uKHBGdW5jdGlvbikge30NCisNCisgIHZpcnR1YWwgRkRFX0NTU1BSSU1JVElWRVRZUEUgR2V0UHJpbWl0aXZlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fZVR5cGU7IH0NCisNCisgIHZpcnR1YWwgRlhfQVJHQiBHZXRSR0JDb2xvcigpIGNvbnN0IHsNCisgICAgRlhTWVNfYXNzZXJ0KG1fZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUkdCKTsNCisgICAgcmV0dXJuIG1fZHdDb2xvcjsNCisgIH0NCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0RmxvYXQoKSBjb25zdCB7DQorICAgIEZYU1lTX2Fzc2VydChtX2VUeXBlID49IEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlciAmJg0KKyAgICAgICAgICAgICAgICAgbV9lVHlwZSA8PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9QQyk7DQorICAgIHJldHVybiBtX2ZOdW1iZXI7DQorICB9DQorICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKiBHZXRTdHJpbmcoaW50MzJfdCYgaUxlbmd0aCkgY29uc3Qgew0KKyAgICBGWFNZU19hc3NlcnQobV9lVHlwZSA+PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmcgJiYNCisgICAgICAgICAgICAgICAgIG1fZVR5cGUgPD0gRkRFX0NTU1BSSU1JVElWRVRZUEVfVVJJKTsNCisgICAgaUxlbmd0aCA9IEZYU1lTX3djc2xlbihtX3BTdHJpbmcpOw0KKyAgICByZXR1cm4gbV9wU3RyaW5nOw0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTUFJPUEVSVFlWQUxVRSBHZXRFbnVtKCkgY29uc3Qgew0KKyAgICBGWFNZU19hc3NlcnQobV9lVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKTsNCisgICAgcmV0dXJuIG1fZUVudW07DQorICB9DQorICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKiBHZXRGdW5jTmFtZSgpIGNvbnN0IHsNCisgICAgRlhTWVNfYXNzZXJ0KG1fZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRnVuY3Rpb24pOw0KKyAgICByZXR1cm4gbV9wRnVuY3Rpb24tPkdldEZ1bmNOYW1lKCk7DQorICB9DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRBcmdzKCkgY29uc3Qgew0KKyAgICBGWFNZU19hc3NlcnQobV9lVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9GdW5jdGlvbik7DQorICAgIHJldHVybiBtX3BGdW5jdGlvbi0+Q291bnRBcmdzKCk7DQorICB9DQorICB2aXJ0dWFsIElGREVfQ1NTVmFsdWUqIEdldEFyZ3MoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgICBGWFNZU19hc3NlcnQobV9lVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9GdW5jdGlvbik7DQorICAgIHJldHVybiBtX3BGdW5jdGlvbi0+R2V0QXJncyhpbmRleCk7DQorICB9DQorDQorICBGREVfQ1NTUFJJTUlUSVZFVFlQRSBtX2VUeXBlOw0KKyAgdW5pb24gew0KKyAgICBGWF9BUkdCIG1fZHdDb2xvcjsNCisgICAgRlhfRkxPQVQgbV9mTnVtYmVyOw0KKyAgICBjb25zdCBGWF9XQ0hBUiogbV9wU3RyaW5nOw0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRSBtX2VFbnVtOw0KKyAgICBDRkRFX0NTU0Z1bmN0aW9uKiBtX3BGdW5jdGlvbjsNCisgIH07DQorfTsNCit0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqPiBDRkRFX0NTU1ByaW1pdGl2ZUFycmF5Ow0KK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8SUZERV9DU1NWYWx1ZSo+IENGREVfQ1NTVmFsdWVBcnJheTsNCitjbGFzcyBDRkRFX0NTU1ZhbHVlTGlzdCA6IHB1YmxpYyBJRkRFX0NTU1ZhbHVlTGlzdCwgcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRkRFX0NTU1ZhbHVlTGlzdChJRlhfTUVNQWxsb2NhdG9yKiBwU3RhdGljU3RvcmUsDQorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRkRFX0NTU1ZhbHVlQXJyYXkmIGxpc3QpOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50VmFsdWVzKCkgY29uc3QgeyByZXR1cm4gbV9pQ291bnQ7IH0NCisgIHZpcnR1YWwgSUZERV9DU1NWYWx1ZSogR2V0VmFsdWUoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9wcExpc3RbaW5kZXhdOw0KKyAgfQ0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRkRFX0NTU1ZhbHVlKiogbV9wcExpc3Q7DQorICBpbnQzMl90IG1faUNvdW50Ow0KK307DQorY2xhc3MgQ0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXIgOiBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyKGNvbnN0IEZYX1dDSEFSKiBwc3osIGludDMyX3QgaUxlbiwgRlhfV0NIQVIgc2VwYXJhdG9yKQ0KKyAgICAgIDogbV9TZXBhcmF0b3Ioc2VwYXJhdG9yKSwgbV9wQ3VyKHBzeiksIG1fcEVuZChwc3ogKyBpTGVuKSB7DQorICAgIEZYU1lTX2Fzc2VydChwc3ogIT0gTlVMTCAmJiBpTGVuID4gMCk7DQorICB9DQorICBGWF9CT09MIE5leHRWYWx1ZShGREVfQ1NTUFJJTUlUSVZFVFlQRSYgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiomIHBTdGFydCwNCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlMZW5ndGgpOw0KKyAgRlhfV0NIQVIgbV9TZXBhcmF0b3I7DQorDQorIHByb3RlY3RlZDoNCisgIGludDMyX3QgU2tpcFRvKEZYX1dDSEFSIHdjaCwNCisgICAgICAgICAgICAgICAgIEZYX0JPT0wgYldTU2VwYXJhdG9yID0gRkFMU0UsDQorICAgICAgICAgICAgICAgICBGWF9CT09MIGJCckNvbnRpbnVlID0gRkFMU0UpOw0KKyAgY29uc3QgRlhfV0NIQVIqIG1fcEN1cjsNCisgIGNvbnN0IEZYX1dDSEFSKiBtX3BFbmQ7DQorfTsNCisNCisjZGVmaW5lIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXIgMHgwMTAwDQorI2RlZmluZSBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSAweDAyMDANCisjZGVmaW5lIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVVUkkgMHgwNDAwDQorI2RlZmluZSBGREVfQ1NTVkFMVUVUWVBFX01heWJlU3RyaW5nIDB4MDgwMA0KKyNkZWZpbmUgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yIDB4MTAwMA0KKyNkZWZpbmUgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUZ1bmN0aW9uIDB4MjAwMA0KKyNkZWZpbmUgRkRFX0lzT25seVZhbHVlKHR5cGUsIGVudW0pIFwNCisgICgoKHR5cGUpICYgfihlbnVtKSkgPT0gRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUpDQorc3RydWN0IEZERV9DU1NQUk9QRVJUWVRBQkxFIHsNCisgIEZERV9DU1NQUk9QRVJUWSBlTmFtZTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwc3pOYW1lOw0KKyAgRlhfRFdPUkQgZHdIYXNoOw0KKyAgRlhfRFdPUkQgZHdUeXBlOw0KK307DQordHlwZWRlZiBGREVfQ1NTUFJPUEVSVFlUQUJMRSBjb25zdCogRkRFX0xQQ0NTU1BST1BFUlRZVEFCTEU7DQorDQorRkRFX0xQQ0NTU1BST1BFUlRZVEFCTEUgRkRFX0dldENTU1Byb3BlcnR5QnlOYW1lKGNvbnN0IEZYX1dDSEFSKiBwc3pOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgpOw0KK0ZERV9MUENDU1NQUk9QRVJUWVRBQkxFIEZERV9HZXRDU1NQcm9wZXJ0eUJ5RW51bShGREVfQ1NTUFJPUEVSVFkgZU5hbWUpOw0KK3N0cnVjdCBGREVfQ1NTUFJPUEVSVFlWQUxVRVRBQkxFIHsNCisgIEZERV9DU1NQUk9QRVJUWVZBTFVFIGVOYW1lOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBzek5hbWU7DQorICBGWF9EV09SRCBkd0hhc2g7DQorfTsNCit0eXBlZGVmIEZERV9DU1NQUk9QRVJUWVZBTFVFVEFCTEUgY29uc3QqIEZERV9MUENDU1NQUk9QRVJUWVZBTFVFVEFCTEU7DQorDQorRkRFX0xQQ0NTU1BST1BFUlRZVkFMVUVUQUJMRSBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZSgNCisgICAgY29uc3QgRlhfV0NIQVIqIHBzek5hbWUsDQorICAgIGludDMyX3QgaUxlbmd0aCk7DQorRkRFX0xQQ0NTU1BST1BFUlRZVkFMVUVUQUJMRSBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5RW51bSgNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUUgZU5hbWUpOw0KK3N0cnVjdCBGREVfQ1NTTUVESUFUWVBFVEFCTEUgew0KKyAgRlhfV09SRCB3SGFzaDsNCisgIEZYX1dPUkQgd1ZhbHVlOw0KK307DQordHlwZWRlZiBGREVfQ1NTTUVESUFUWVBFVEFCTEUgY29uc3QqIEZERV9MUENDU1NNRURJQVRZUEVUQUJMRTsNCitGREVfTFBDQ1NTTUVESUFUWVBFVEFCTEUgRkRFX0dldENTU01lZGlhVHlwZUJ5TmFtZShjb25zdCBGWF9XQ0hBUiogcHN6TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgpOw0KK3N0cnVjdCBGREVfQ1NTTEVOR1RIVU5JVFRBQkxFIHsNCisgIEZYX1dPUkQgd0hhc2g7DQorICBGWF9XT1JEIHdWYWx1ZTsNCit9Ow0KK3R5cGVkZWYgRkRFX0NTU0xFTkdUSFVOSVRUQUJMRSBjb25zdCogRkRFX0xQQ0NTU0xFTkdUSFVOSVRUQUJMRTsNCitGREVfTFBDQ1NTTEVOR1RIVU5JVFRBQkxFIEZERV9HZXRDU1NMZW5ndGhVbml0QnlOYW1lKGNvbnN0IEZYX1dDSEFSKiBwc3pOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoKTsNCitzdHJ1Y3QgRkRFX0NTU0NPTE9SVEFCTEUgew0KKyAgRlhfRFdPUkQgZHdIYXNoOw0KKyAgRlhfQVJHQiBkd1ZhbHVlOw0KK307DQordHlwZWRlZiBGREVfQ1NTQ09MT1JUQUJMRSBjb25zdCogRkRFX0xQQ0NTU0NPTE9SVEFCTEU7DQorRkRFX0xQQ0NTU0NPTE9SVEFCTEUgRkRFX0dldENTU0NvbG9yQnlOYW1lKGNvbnN0IEZYX1dDSEFSKiBwc3pOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgpOw0KK3N0cnVjdCBGREVfQ1NTUEVSU1VET1RBQkxFIHsNCisgIEZERV9DU1NQRVJTVURPIGVOYW1lOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBzek5hbWU7DQorICBGWF9EV09SRCBkd0hhc2g7DQorfTsNCit0eXBlZGVmIEZERV9DU1NQRVJTVURPVEFCTEUgY29uc3QqIEZERV9MUENDU1NQRVJTVURPVEFCTEU7DQorDQorRkRFX0xQQ0NTU1BFUlNVRE9UQUJMRSBGREVfR2V0Q1NTUGVyc3Vkb0J5RW51bShGREVfQ1NTUEVSU1VETyBlUGVyc3Vkbyk7DQorRlhfQk9PTCBGREVfUGFyc2VDU1NOdW1iZXIoY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BSSU1JVElWRVRZUEUmIGVVbml0KTsNCitGWF9CT09MIEZERV9QYXJzZUNTU1N0cmluZyhjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU9mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTGVuZ3RoKTsNCitGWF9CT09MIEZERV9QYXJzZUNTU0NvbG9yKGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiYgZHdDb2xvcik7DQorRlhfQk9PTCBGREVfUGFyc2VDU1NVUkkoY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlPZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUxlbmd0aCk7DQorDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3NzZGVjbGFyYXRpb24uY3BwIGIveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3NzZGVjbGFyYXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3OGQ5NGUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NkZWNsYXJhdGlvbi5jcHAKQEAgLTAsMCArMSwxMzU3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgImZkZV9jc3NkZWNsYXJhdGlvbi5oIg0KK0lGREVfQ1NTVmFsdWUqIENGREVfQ1NTRGVjbGFyYXRpb246OkdldFByb3BlcnR5KEZERV9DU1NQUk9QRVJUWSBlUHJvcGVydHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkltcG9ydGFudCkgY29uc3Qgew0KKyAgZm9yIChGREVfTFBDU1NQUk9QRVJUWUhPTERFUiBwSG9sZGVyID0gbV9wRmlyc3RQcm9wZXJ0eTsgcEhvbGRlcjsNCisgICAgICAgcEhvbGRlciA9IHBIb2xkZXItPnBOZXh0KSB7DQorICAgIGlmIChwSG9sZGVyLT5lUHJvcGVydHkgPT0gZVByb3BlcnR5KSB7DQorICAgICAgYkltcG9ydGFudCA9IHBIb2xkZXItPmJJbXBvcnRhbnQ7DQorICAgICAgcmV0dXJuIHBIb2xkZXItPnBWYWx1ZTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX1BPU0lUSU9OIENGREVfQ1NTRGVjbGFyYXRpb246OkdldFN0YXJ0UG9zaXRpb24oKSBjb25zdCB7DQorICByZXR1cm4gKEZYX1BPU0lUSU9OKW1fcEZpcnN0UHJvcGVydHk7DQorfQ0KK3ZvaWQgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6R2V0TmV4dFByb3BlcnR5KEZYX1BPU0lUSU9OJiBwb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZJiBlUHJvcGVydHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NWYWx1ZSomIHBWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiSW1wb3J0YW50KSBjb25zdCB7DQorICBGREVfTFBDU1NQUk9QRVJUWUhPTERFUiBwSG9sZGVyID0gKEZERV9MUENTU1BST1BFUlRZSE9MREVSKXBvczsNCisgIEZYU1lTX2Fzc2VydChwSG9sZGVyICE9IE5VTEwpOw0KKyAgYkltcG9ydGFudCA9IHBIb2xkZXItPmJJbXBvcnRhbnQ7DQorICBlUHJvcGVydHkgPSAoRkRFX0NTU1BST1BFUlRZKXBIb2xkZXItPmVQcm9wZXJ0eTsNCisgIHBWYWx1ZSA9IHBIb2xkZXItPnBWYWx1ZTsNCisgIHBvcyA9IChGWF9QT1NJVElPTilwSG9sZGVyLT5wTmV4dDsNCit9DQorRlhfUE9TSVRJT04gQ0ZERV9DU1NEZWNsYXJhdGlvbjo6R2V0U3RhcnRDdXN0b20oKSBjb25zdCB7DQorICByZXR1cm4gKEZYX1BPU0lUSU9OKW1fcEZpcnN0Q3VzdG9tOw0KK30NCit2b2lkIENGREVfQ1NTRGVjbGFyYXRpb246OkdldE5leHRDdXN0b20oRlhfUE9TSVRJT04mIHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpIGNvbnN0IHsNCisgIEZERV9MUENTU0NVU1RPTVBST1BFUlRZIHBQcm9wZXJ0eSA9IChGREVfTFBDU1NDVVNUT01QUk9QRVJUWSlwb3M7DQorICBpZiAocFByb3BlcnR5ID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgd3NOYW1lID0gcFByb3BlcnR5LT5wd3NOYW1lOw0KKyAgd3NWYWx1ZSA9IHBQcm9wZXJ0eS0+cHdzVmFsdWU7DQorICBwb3MgPSAoRlhfUE9TSVRJT04pcFByb3BlcnR5LT5wTmV4dDsNCit9DQorY29uc3QgRlhfV0NIQVIqIENGREVfQ1NTRGVjbGFyYXRpb246OkNvcHlUb0xvY2FsKEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4pIHsNCisgIEZYU1lTX2Fzc2VydChpVmFsdWVMZW4gPiAwKTsNCisgIENGWF9NYXBQdHJUb1B0ciogcENhY2hlID0gcEFyZ3MtPnBTdHJpbmdDYWNoZTsNCisgIHZvaWQqIHBLZXkgPSBOVUxMOw0KKyAgaWYgKHBDYWNoZSkgew0KKyAgICB2b2lkKiBwc3pDYWNoZWQgPSBOVUxMOw0KKyAgICBwS2V5ID0NCisgICAgICAgICh2b2lkKikodWludHB0cl90KUZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHBzelZhbHVlLCBpVmFsdWVMZW4sIEZBTFNFKTsNCisgICAgaWYgKHBDYWNoZS0+TG9va3VwKHBLZXksIHBzekNhY2hlZCkpIHsNCisgICAgICByZXR1cm4gKGNvbnN0IEZYX1dDSEFSKilwc3pDYWNoZWQ7DQorICAgIH0NCisgIH0NCisgIEZYX1dDSEFSKiBwc3ogPQ0KKyAgICAgIChGWF9XQ0hBUiopcEFyZ3MtPnBTdGF0aWNTdG9yZS0+QWxsb2MoKGlWYWx1ZUxlbiArIDEpICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICBpZiAocHN6ID09IE5VTEwpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBGWFNZU193Y3NuY3B5KHBzeiwgcHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICBwc3pbaVZhbHVlTGVuXSA9ICdcMCc7DQorICBpZiAocENhY2hlKSB7DQorICAgIHBDYWNoZS0+U2V0QXQocEtleSwgcHN6KTsNCisgIH0NCisgIHJldHVybiBwc3o7DQorfQ0KK0lGREVfQ1NTUHJpbWl0aXZlVmFsdWUqIENGREVfQ1NTRGVjbGFyYXRpb246Ok5ld051bWJlclZhbHVlKA0KKyAgICBJRlhfTUVNQWxsb2NhdG9yKiBwU3RhdGljU3RvcmUsDQorICAgIEZERV9DU1NQUklNSVRJVkVUWVBFIGVVbml0LA0KKyAgICBGWF9GTE9BVCBmVmFsdWUpIGNvbnN0IHsNCisgIHN0YXRpYyBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlIHNfWmVyb1ZhbHVlKEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlciwgMC4wZik7DQorICBpZiAoZVVuaXQgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyICYmIEZYU1lTX2ZhYnMoZlZhbHVlKSA8IDAuMDAxZikgew0KKyAgICByZXR1cm4gJnNfWmVyb1ZhbHVlOw0KKyAgfQ0KKyAgcmV0dXJuIEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShlVW5pdCwgZlZhbHVlKTsNCit9DQoraW5saW5lIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqIENGREVfQ1NTRGVjbGFyYXRpb246Ok5ld0VudW1WYWx1ZSgNCisgICAgSUZYX01FTUFsbG9jYXRvciogcFN0YXRpY1N0b3JlLA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpIGNvbnN0IHsNCisgIHJldHVybiBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoZVZhbHVlKTsNCit9DQordm9pZCBDRkRFX0NTU0RlY2xhcmF0aW9uOjpBZGRQcm9wZXJ0eUhvbGRlcihJRlhfTUVNQWxsb2NhdG9yKiBwU3RhdGljU3RvcmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFkgZVByb3BlcnR5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NWYWx1ZSogcFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW1wb3J0YW50KSB7DQorICBGREVfTFBDU1NQUk9QRVJUWUhPTERFUiBwSG9sZGVyID0NCisgICAgICBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIEZERV9DU1NQUk9QRVJUWUhPTERFUjsNCisgIHBIb2xkZXItPmJJbXBvcnRhbnQgPSBiSW1wb3J0YW50Ow0KKyAgcEhvbGRlci0+ZVByb3BlcnR5ID0gZVByb3BlcnR5Ow0KKyAgcEhvbGRlci0+cFZhbHVlID0gcFZhbHVlOw0KKyAgcEhvbGRlci0+cE5leHQgPSBOVUxMOw0KKyAgaWYgKG1fcExhc3RQcm9wZXJ0eSA9PSBOVUxMKSB7DQorICAgIG1fcExhc3RQcm9wZXJ0eSA9IG1fcEZpcnN0UHJvcGVydHkgPSBwSG9sZGVyOw0KKyAgfSBlbHNlIHsNCisgICAgbV9wTGFzdFByb3BlcnR5LT5wTmV4dCA9IHBIb2xkZXI7DQorICAgIG1fcExhc3RQcm9wZXJ0eSA9IHBIb2xkZXI7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6QWRkUHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuKSB7DQorICBGWFNZU19hc3NlcnQoaVZhbHVlTGVuID4gMCk7DQorICBGWF9CT09MIGJJbXBvcnRhbnQgPSBGQUxTRTsNCisgIGlmIChpVmFsdWVMZW4gPj0gMTAgJiYgcHN6VmFsdWVbaVZhbHVlTGVuIC0gMTBdID09ICchJyAmJg0KKyAgICAgIEZYX3djc25pY21wKEwiaW1wb3J0YW50IiwgcHN6VmFsdWUgKyBpVmFsdWVMZW4gLSA5LCA5KSA9PSAwKSB7DQorICAgIGlmICgoaVZhbHVlTGVuIC09IDEwKSA9PSAwKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGJJbXBvcnRhbnQgPSBUUlVFOw0KKyAgfQ0KKyAgY29uc3QgRlhfRFdPUkQgZHdUeXBlID0gcEFyZ3MtPnBQcm9wZXJ0eS0+ZHdUeXBlOw0KKyAgc3dpdGNoIChkd1R5cGUgJiAweDBGKSB7DQorICAgIGNhc2UgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmU6IHsNCisgICAgICBzdGF0aWMgY29uc3QgRlhfRFdPUkQgZ19WYWx1ZUd1ZXNzT3JkZXJbXSA9IHsNCisgICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlciwgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSwNCisgICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yLCAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlVVJJLA0KKyAgICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlRnVuY3Rpb24sIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVTdHJpbmcsDQorICAgICAgfTsNCisgICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBnX1ZhbHVlR3Vlc3NDb3VudCA9DQorICAgICAgICAgIHNpemVvZihnX1ZhbHVlR3Vlc3NPcmRlcikgLyBzaXplb2YoRlhfRFdPUkQpOw0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGdfVmFsdWVHdWVzc0NvdW50OyArK2kpIHsNCisgICAgICAgIGNvbnN0IEZYX0RXT1JEIGR3TWF0Y2ggPSBkd1R5cGUgJiBnX1ZhbHVlR3Vlc3NPcmRlcltpXTsNCisgICAgICAgIGlmIChkd01hdGNoID09IDApIHsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBJRkRFX0NTU1ZhbHVlKiBwQ1NTVmFsdWUgPSBOVUxMOw0KKyAgICAgICAgc3dpdGNoIChkd01hdGNoKSB7DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUZ1bmN0aW9uOg0KKyAgICAgICAgICAgIHBDU1NWYWx1ZSA9IFBhcnNlRnVuY3Rpb24ocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBjYXNlIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXI6DQorICAgICAgICAgICAgcENTU1ZhbHVlID0gUGFyc2VOdW1iZXIocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBjYXNlIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtOg0KKyAgICAgICAgICAgIHBDU1NWYWx1ZSA9IFBhcnNlRW51bShwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yOg0KKyAgICAgICAgICAgIHBDU1NWYWx1ZSA9IFBhcnNlQ29sb3IocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBjYXNlIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVVUkk6DQorICAgICAgICAgICAgcENTU1ZhbHVlID0gUGFyc2VVUkkocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBjYXNlIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVTdHJpbmc6DQorICAgICAgICAgICAgcENTU1ZhbHVlID0gUGFyc2VTdHJpbmcocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBDU1NWYWx1ZSAhPSBOVUxMKSB7DQorICAgICAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBBcmdzLT5wU3RhdGljU3RvcmUsIHBBcmdzLT5wUHJvcGVydHktPmVOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ1NTVmFsdWUsIGJJbXBvcnRhbnQpOw0KKyAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChGREVfSXNPbmx5VmFsdWUoZHdUeXBlLCBnX1ZhbHVlR3Vlc3NPcmRlcltpXSkpIHsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGREVfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZDogew0KKyAgICAgIElGWF9NRU1BbGxvY2F0b3IqIHBTdGF0aWNTdG9yZSA9IHBBcmdzLT5wU3RhdGljU3RvcmU7DQorICAgICAgSUZERV9DU1NWYWx1ZSAqcENvbG9yLCAqcFN0eWxlLCAqcFdpZHRoOw0KKyAgICAgIHN3aXRjaCAocEFyZ3MtPnBQcm9wZXJ0eS0+ZU5hbWUpIHsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0ZvbnQ6DQorICAgICAgICAgIHJldHVybiBQYXJzZUZvbnRQcm9wZXJ0eShwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbiwgYkltcG9ydGFudCk7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kOg0KKyAgICAgICAgICByZXR1cm4gUGFyc2VCYWNrZ3JvdW5kUHJvcGVydHkocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW1wb3J0YW50KTsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0xpc3RTdHlsZToNCisgICAgICAgICAgcmV0dXJuIFBhcnNlTGlzdFN0eWxlUHJvcGVydHkocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4sIGJJbXBvcnRhbnQpOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyOg0KKyAgICAgICAgICBpZiAoUGFyc2VCb3JkZXJQcm9wb2VydHkocFN0YXRpY1N0b3JlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuLCBwQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3R5bGUsIHBXaWR0aCkpIHsNCisgICAgICAgICAgICBBZGRCb3JkZXJQcm9wZXJ0eShwU3RhdGljU3RvcmUsIHBDb2xvciwgcFN0eWxlLCBwV2lkdGgsIGJJbXBvcnRhbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRDb2xvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyTGVmdFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJMZWZ0V2lkdGgpOw0KKyAgICAgICAgICAgIEFkZEJvcmRlclByb3BlcnR5KHBTdGF0aWNTdG9yZSwgcENvbG9yLCBwU3R5bGUsIHBXaWR0aCwgYkltcG9ydGFudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyVG9wQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BXaWR0aCk7DQorICAgICAgICAgICAgQWRkQm9yZGVyUHJvcGVydHkocFN0YXRpY1N0b3JlLCBwQ29sb3IsIHBTdHlsZSwgcFdpZHRoLCBiSW1wb3J0YW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodFdpZHRoKTsNCisgICAgICAgICAgICBBZGRCb3JkZXJQcm9wZXJ0eShwU3RhdGljU3RvcmUsIHBDb2xvciwgcFN0eWxlLCBwV2lkdGgsIGJJbXBvcnRhbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbUNvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21TdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQm90dG9tV2lkdGgpOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyTGVmdDoNCisgICAgICAgICAgaWYgKFBhcnNlQm9yZGVyUHJvcG9lcnR5KHBTdGF0aWNTdG9yZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbiwgcENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0eWxlLCBwV2lkdGgpKSB7DQorICAgICAgICAgICAgQWRkQm9yZGVyUHJvcGVydHkocFN0YXRpY1N0b3JlLCBwQ29sb3IsIHBTdHlsZSwgcFdpZHRoLCBiSW1wb3J0YW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJMZWZ0Q29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyTGVmdFdpZHRoKTsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcDoNCisgICAgICAgICAgaWYgKFBhcnNlQm9yZGVyUHJvcG9lcnR5KHBTdGF0aWNTdG9yZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbiwgcENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0eWxlLCBwV2lkdGgpKSB7DQorICAgICAgICAgICAgQWRkQm9yZGVyUHJvcGVydHkocFN0YXRpY1N0b3JlLCBwQ29sb3IsIHBTdHlsZSwgcFdpZHRoLCBiSW1wb3J0YW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BDb2xvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyVG9wU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcFdpZHRoKTsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0Og0KKyAgICAgICAgICBpZiAoUGFyc2VCb3JkZXJQcm9wb2VydHkocFN0YXRpY1N0b3JlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuLCBwQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3R5bGUsIHBXaWR0aCkpIHsNCisgICAgICAgICAgICBBZGRCb3JkZXJQcm9wZXJ0eShwU3RhdGljU3RvcmUsIHBDb2xvciwgcFN0eWxlLCBwV2lkdGgsIGJJbXBvcnRhbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0Q29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0U3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0V2lkdGgpOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQm90dG9tOg0KKyAgICAgICAgICBpZiAoUGFyc2VCb3JkZXJQcm9wb2VydHkocFN0YXRpY1N0b3JlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuLCBwQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3R5bGUsIHBXaWR0aCkpIHsNCisgICAgICAgICAgICBBZGRCb3JkZXJQcm9wZXJ0eShwU3RhdGljU3RvcmUsIHBDb2xvciwgcFN0eWxlLCBwV2lkdGgsIGJJbXBvcnRhbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbUNvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21TdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQm90dG9tV2lkdGgpOw0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfT3ZlcmZsb3c6DQorICAgICAgICAgIHJldHVybiBQYXJzZU92ZXJmbG93UHJvcGVydHkocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4sIGJJbXBvcnRhbnQpOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQ29sdW1uUnVsZToNCisgICAgICAgICAgcmV0dXJuIFBhcnNlQ29sdW1uUnVsZVByb3BlcnR5KHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkltcG9ydGFudCk7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRkRFX0NTU1ZBTFVFVFlQRV9MaXN0Og0KKyAgICAgIHN3aXRjaCAocEFyZ3MtPnBQcm9wZXJ0eS0+ZU5hbWUpIHsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0NvdW50ZXJJbmNyZW1lbnQ6DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Db3VudGVyUmVzZXQ6DQorICAgICAgICAgIHJldHVybiBQYXJzZUNvdW50ZXJQcm9wZXJ0eShwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbiwgYkltcG9ydGFudCk7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Db250ZW50Og0KKyAgICAgICAgICByZXR1cm4gUGFyc2VDb250ZW50UHJvcGVydHkocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4sIGJJbXBvcnRhbnQpOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgcmV0dXJuIFBhcnNlVmFsdWVMaXN0UHJvcGVydHkocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4sIGJJbXBvcnRhbnQpOw0KKyAgICAgIH0NCisgICAgZGVmYXVsdDoNCisgICAgICBGWFNZU19hc3NlcnQoRkFMU0UpOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENGREVfQ1NTRGVjbGFyYXRpb246OkFkZFByb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU5hbWVMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbikgew0KKyAgRkRFX0xQQ1NTQ1VTVE9NUFJPUEVSVFkgcFByb3BlcnR5ID0NCisgICAgICBGREVfTmV3V2l0aChwQXJncy0+cFN0YXRpY1N0b3JlKSBGREVfQ1NTQ1VTVE9NUFJPUEVSVFk7DQorICBwUHJvcGVydHktPnB3c05hbWUgPSBDb3B5VG9Mb2NhbChwQXJncywgcHN6TmFtZSwgaU5hbWVMZW4pOw0KKyAgcFByb3BlcnR5LT5wd3NWYWx1ZSA9IENvcHlUb0xvY2FsKHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgIHBQcm9wZXJ0eS0+cE5leHQgPSBOVUxMOw0KKyAgaWYgKG1fcExhc3RDdXN0b20gPT0gTlVMTCkgew0KKyAgICBtX3BMYXN0Q3VzdG9tID0gbV9wRmlyc3RDdXN0b20gPSBwUHJvcGVydHk7DQorICB9IGVsc2Ugew0KKyAgICBtX3BMYXN0Q3VzdG9tLT5wTmV4dCA9IHBQcm9wZXJ0eTsNCisgICAgbV9wTGFzdEN1c3RvbSA9IHBQcm9wZXJ0eTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitJRkRFX0NTU1ZhbHVlKiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZU51bWJlcihGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbikgew0KKyAgRlhfRkxPQVQgZlZhbHVlOw0KKyAgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVVuaXQ7DQorICBpZiAoIUZERV9QYXJzZUNTU051bWJlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBmVmFsdWUsIGVVbml0KSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBOZXdOdW1iZXJWYWx1ZShwQXJncy0+cFN0YXRpY1N0b3JlLCBlVW5pdCwgZlZhbHVlKTsNCit9DQorSUZERV9DU1NWYWx1ZSogQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VFbnVtKEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4pIHsNCisgIEZERV9MUENDU1NQUk9QRVJUWVZBTFVFVEFCTEUgcFZhbHVlID0NCisgICAgICBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgIHJldHVybiBwVmFsdWUgPyBOZXdFbnVtVmFsdWUocEFyZ3MtPnBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSkgOiBOVUxMOw0KK30NCitJRkRFX0NTU1ZhbHVlKiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUNvbG9yKEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbikgew0KKyAgRlhfQVJHQiBkd0NvbG9yOw0KKyAgaWYgKCFGREVfUGFyc2VDU1NDb2xvcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBkd0NvbG9yKSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBGREVfTmV3V2l0aChwQXJncy0+cFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKGR3Q29sb3IpOw0KK30NCitJRkRFX0NTU1ZhbHVlKiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZVVSSShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbikgew0KKyAgaW50MzJfdCBpT2Zmc2V0Ow0KKyAgaWYgKCFGREVfUGFyc2VDU1NVUkkocHN6VmFsdWUsIGlWYWx1ZUxlbiwgaU9mZnNldCwgaVZhbHVlTGVuKSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGlmIChpVmFsdWVMZW4gPD0gMCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHBzelZhbHVlID0gQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlICsgaU9mZnNldCwgaVZhbHVlTGVuKTsNCisgIHJldHVybiBwc3pWYWx1ZQ0KKyAgICAgICAgICAgICA/IEZERV9OZXdXaXRoKHBBcmdzLT5wU3RhdGljU3RvcmUpDQorICAgICAgICAgICAgICAgICAgIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoRkRFX0NTU1BSSU1JVElWRVRZUEVfVVJJLCBwc3pWYWx1ZSkNCisgICAgICAgICAgICAgOiBOVUxMOw0KK30NCitJRkRFX0NTU1ZhbHVlKiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZVN0cmluZyhGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbikgew0KKyAgaW50MzJfdCBpT2Zmc2V0Ow0KKyAgaWYgKCFGREVfUGFyc2VDU1NTdHJpbmcocHN6VmFsdWUsIGlWYWx1ZUxlbiwgaU9mZnNldCwgaVZhbHVlTGVuKSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGlmIChpVmFsdWVMZW4gPD0gMCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHBzelZhbHVlID0gQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlICsgaU9mZnNldCwgaVZhbHVlTGVuKTsNCisgIHJldHVybiBwc3pWYWx1ZQ0KKyAgICAgICAgICAgICA/IEZERV9OZXdXaXRoKHBBcmdzLT5wU3RhdGljU3RvcmUpDQorICAgICAgICAgICAgICAgICAgIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nLCBwc3pWYWx1ZSkNCisgICAgICAgICAgICAgOiBOVUxMOw0KK30NCitJRkRFX0NTU1ZhbHVlKiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUZ1bmN0aW9uKEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbikgew0KKyAgaWYgKHBzelZhbHVlW2lWYWx1ZUxlbiAtIDFdICE9ICcpJykgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGludDMyX3QgaVN0YXJ0QnJhY2tldCA9IDA7DQorICB3aGlsZSAocHN6VmFsdWVbaVN0YXJ0QnJhY2tldF0gIT0gJygnKSB7DQorICAgIGlmIChpU3RhcnRCcmFja2V0IDwgaVZhbHVlTGVuKSB7DQorICAgICAgaVN0YXJ0QnJhY2tldCsrOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICB9DQorICBpZiAoaVN0YXJ0QnJhY2tldCA9PSAwKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgY29uc3QgRlhfV0NIQVIqIHBzekZ1bmNOYW1lID0gQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlLCBpU3RhcnRCcmFja2V0KTsNCisgIHBzelZhbHVlICs9IChpU3RhcnRCcmFja2V0ICsgMSk7DQorICBpVmFsdWVMZW4gLT0gKGlTdGFydEJyYWNrZXQgKyAyKTsNCisgIENGREVfQ1NTVmFsdWVBcnJheSBhcmd1bWVudEFycjsNCisgIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyIHBhcnNlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCAnLCcpOw0KKyAgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVByaW1pdGl2ZVR5cGU7DQorICB3aGlsZSAocGFyc2VyLk5leHRWYWx1ZShlUHJpbWl0aXZlVHlwZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbikpIHsNCisgICAgc3dpdGNoIChlUHJpbWl0aXZlVHlwZSkgew0KKyAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nOiB7DQorICAgICAgICBGREVfTFBDQ1NTUFJPUEVSVFlWQUxVRVRBQkxFIHBQcm9wZXJ0eVZhbHVlID0NCisgICAgICAgICAgICBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgIGlmIChwUHJvcGVydHlWYWx1ZSAhPSBOVUxMKSB7DQorICAgICAgICAgIGFyZ3VtZW50QXJyLkFkZCgNCisgICAgICAgICAgICAgIE5ld0VudW1WYWx1ZShwQXJncy0+cFN0YXRpY1N0b3JlLCBwUHJvcGVydHlWYWx1ZS0+ZU5hbWUpKTsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBJRkRFX0NTU1ZhbHVlKiBwRnVuY3Rpb25WYWx1ZSA9DQorICAgICAgICAgICAgUGFyc2VGdW5jdGlvbihwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICBpZiAocEZ1bmN0aW9uVmFsdWUgIT0gTlVMTCkgew0KKyAgICAgICAgICBhcmd1bWVudEFyci5BZGQocEZ1bmN0aW9uVmFsdWUpOw0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGFyZ3VtZW50QXJyLkFkZChGREVfTmV3V2l0aChwQXJncy0+cFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKA0KKyAgICAgICAgICAgIEZERV9DU1NQUklNSVRJVkVUWVBFX1N0cmluZywNCisgICAgICAgICAgICBDb3B5VG9Mb2NhbChwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbikpKTsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyOiB7DQorICAgICAgICBGWF9GTE9BVCBmVmFsdWU7DQorICAgICAgICBpZiAoRkRFX1BhcnNlQ1NTTnVtYmVyKHBzelZhbHVlLCBpVmFsdWVMZW4sIGZWYWx1ZSwgZVByaW1pdGl2ZVR5cGUpKSB7DQorICAgICAgICAgIGFyZ3VtZW50QXJyLkFkZCgNCisgICAgICAgICAgICAgIE5ld051bWJlclZhbHVlKHBBcmdzLT5wU3RhdGljU3RvcmUsIGVQcmltaXRpdmVUeXBlLCBmVmFsdWUpKTsNCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBhcmd1bWVudEFyci5BZGQoRkRFX05ld1dpdGgocEFyZ3MtPnBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZSgNCisgICAgICAgICAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmcsDQorICAgICAgICAgICAgQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pKSk7DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgSUZERV9DU1NWYWx1ZUxpc3QqIHBBcmd1bWVudExpc3QgPSBGREVfTmV3V2l0aChwQXJncy0+cFN0YXRpY1N0b3JlKQ0KKyAgICAgIENGREVfQ1NTVmFsdWVMaXN0KHBBcmdzLT5wU3RhdGljU3RvcmUsIGFyZ3VtZW50QXJyKTsNCisgIENGREVfQ1NTRnVuY3Rpb24qIHBGdW5jdGlvbiA9IEZERV9OZXdXaXRoKHBBcmdzLT5wU3RhdGljU3RvcmUpDQorICAgICAgQ0ZERV9DU1NGdW5jdGlvbihwc3pGdW5jTmFtZSwgcEFyZ3VtZW50TGlzdCk7DQorICByZXR1cm4gRkRFX05ld1dpdGgocEFyZ3MtPnBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShwRnVuY3Rpb24pOw0KK30NCitGWF9CT09MIENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlQ29udGVudFByb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkltcG9ydGFudCkgew0KKyAgSUZYX01FTUFsbG9jYXRvciogcFN0YXRpY1N0b3JlID0gKElGWF9NRU1BbGxvY2F0b3IqKXBBcmdzLT5wU3RhdGljU3RvcmU7DQorICBDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlciBwYXJzZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgJyAnKTsNCisgIEZERV9DU1NQUklNSVRJVkVUWVBFIGVUeXBlOw0KKyAgQ0ZERV9DU1NWYWx1ZUFycmF5IGxpc3Q7DQorICB3aGlsZSAocGFyc2VyLk5leHRWYWx1ZShlVHlwZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbikpIHsNCisgICAgc3dpdGNoIChlVHlwZSkgew0KKyAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfVVJJOg0KKyAgICAgICAgbGlzdC5BZGQoRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKA0KKyAgICAgICAgICAgIGVUeXBlLCBDb3B5VG9Mb2NhbChwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbikpKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyOg0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nOiB7DQorICAgICAgICBGREVfTFBDQ1NTUFJPUEVSVFlWQUxVRVRBQkxFIHBWYWx1ZSA9DQorICAgICAgICAgICAgRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeU5hbWUocHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICBpZiAocFZhbHVlICE9IE5VTEwpIHsNCisgICAgICAgICAgc3dpdGNoIChwVmFsdWUtPmVOYW1lKSB7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob3JtYWw6DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lOiB7DQorICAgICAgICAgICAgICBpZiAobGlzdC5HZXRTaXplKCkgPT0gMCkgew0KKyAgICAgICAgICAgICAgICBsaXN0LkFkZChOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKSk7DQorICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX09wZW5RdW90ZToNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Nsb3NlUXVvdGU6DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob09wZW5RdW90ZToNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vQ2xvc2VRdW90ZToNCisgICAgICAgICAgICAgIGxpc3QuQWRkKE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBJRkRFX0NTU1ZhbHVlKiBwRnVuY3Rpb24gPSBQYXJzZUZ1bmN0aW9uKHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgIGlmIChwRnVuY3Rpb24gIT0gTlVMTCkgew0KKyAgICAgICAgICBsaXN0LkFkZChwRnVuY3Rpb24pOw0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGxpc3QuQWRkKEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZSgNCisgICAgICAgICAgICBlVHlwZSwgQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pKSk7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQjoNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGlmIChsaXN0LkdldFNpemUoKSA9PSAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgcEFyZ3MtPnBQcm9wZXJ0eS0+ZU5hbWUsDQorICAgICAgICAgICAgICAgICAgICBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpDQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9DU1NWYWx1ZUxpc3QocFN0YXRpY1N0b3JlLCBsaXN0KSwNCisgICAgICAgICAgICAgICAgICAgIGJJbXBvcnRhbnQpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VDb3VudGVyUHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW1wb3J0YW50KSB7DQorICBJRlhfTUVNQWxsb2NhdG9yKiBwU3RhdGljU3RvcmUgPSBwQXJncy0+cFN0YXRpY1N0b3JlOw0KKyAgQ0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXIgcGFyc2VyKHBzelZhbHVlLCBpVmFsdWVMZW4sICcgJyk7DQorICBDRkRFX0NTU1ZhbHVlQXJyYXkgbGlzdDsNCisgIENGREVfQ1NTVmFsdWVBcnJheSBsaXN0RnVsbDsNCisgIEZERV9DU1NQUklNSVRJVkVUWVBFIGVUeXBlOw0KKyAgd2hpbGUgKHBhcnNlci5OZXh0VmFsdWUoZVR5cGUsIHBzelZhbHVlLCBpVmFsdWVMZW4pKSB7DQorICAgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcjogew0KKyAgICAgICAgRlhfRkxPQVQgZlZhbHVlOw0KKyAgICAgICAgaWYgKEZERV9QYXJzZUNTU051bWJlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBmVmFsdWUsIGVUeXBlKSkgew0KKyAgICAgICAgICBpZiAobGlzdC5HZXRTaXplKCkgPT0gMSkgew0KKyAgICAgICAgICAgIGxpc3QuQWRkKE5ld051bWJlclZhbHVlKHBTdGF0aWNTdG9yZSwgZVR5cGUsIGZWYWx1ZSkpOw0KKyAgICAgICAgICAgIGxpc3RGdWxsLkFkZChGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX0NTU1ZhbHVlTGlzdChwU3RhdGljU3RvcmUsIGxpc3QpKTsNCisgICAgICAgICAgICBsaXN0LlJlbW92ZUFsbCgpOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmc6IHsNCisgICAgICAgIGlmIChsaXN0LkdldFNpemUoKSA9PSAwKSB7DQorICAgICAgICAgIHBzelZhbHVlID0gQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgICBsaXN0LkFkZChGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoDQorICAgICAgICAgICAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmcsIHBzelZhbHVlKSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBsaXN0RnVsbC5BZGQoRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfQ1NTVmFsdWVMaXN0KHBTdGF0aWNTdG9yZSwgbGlzdCkpOw0KKyAgICAgICAgICBsaXN0LlJlbW92ZUFsbCgpOw0KKyAgICAgICAgICBwc3pWYWx1ZSA9IENvcHlUb0xvY2FsKHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgICAgbGlzdC5BZGQoRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKA0KKyAgICAgICAgICAgICAgRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nLCBwc3pWYWx1ZSkpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpZiAobGlzdC5HZXRTaXplKCkgPT0gMSkgew0KKyAgICBsaXN0RnVsbC5BZGQoRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKQ0KKyAgICAgICAgICAgICAgICAgICAgIENGREVfQ1NTVmFsdWVMaXN0KHBTdGF0aWNTdG9yZSwgbGlzdCkpOw0KKyAgfQ0KKyAgaWYgKGxpc3RGdWxsLkdldFNpemUoKSA9PSAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgcEFyZ3MtPnBQcm9wZXJ0eS0+ZU5hbWUsDQorICAgICAgICAgICAgICAgICAgICBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpDQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9DU1NWYWx1ZUxpc3QocFN0YXRpY1N0b3JlLCBsaXN0RnVsbCksDQorICAgICAgICAgICAgICAgICAgICBiSW1wb3J0YW50KTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlVmFsdWVMaXN0UHJvcGVydHkoDQorICAgIEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgaW50MzJfdCBpVmFsdWVMZW4sDQorICAgIEZYX0JPT0wgYkltcG9ydGFudCkgew0KKyAgSUZYX01FTUFsbG9jYXRvciogcFN0YXRpY1N0b3JlID0gcEFyZ3MtPnBTdGF0aWNTdG9yZTsNCisgIEZYX1dDSEFSIHNlcGFyYXRvciA9DQorICAgICAgKHBBcmdzLT5wUHJvcGVydHktPmVOYW1lID09IEZERV9DU1NQUk9QRVJUWV9Gb250RmFtaWx5KSA/ICcsJyA6ICcgJzsNCisgIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyIHBhcnNlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBzZXBhcmF0b3IpOw0KKyAgY29uc3QgRlhfRFdPUkQgZHdUeXBlID0gcEFyZ3MtPnBQcm9wZXJ0eS0+ZHdUeXBlOw0KKyAgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGU7DQorICBDRkRFX0NTU1ZhbHVlQXJyYXkgbGlzdDsNCisgIHdoaWxlIChwYXJzZXIuTmV4dFZhbHVlKGVUeXBlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKSkgew0KKyAgICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXI6DQorICAgICAgICBpZiAoZHdUeXBlICYgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcikgew0KKyAgICAgICAgICBGWF9GTE9BVCBmVmFsdWU7DQorICAgICAgICAgIGlmIChGREVfUGFyc2VDU1NOdW1iZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgZlZhbHVlLCBlVHlwZSkpIHsNCisgICAgICAgICAgICBsaXN0LkFkZChOZXdOdW1iZXJWYWx1ZShwU3RhdGljU3RvcmUsIGVUeXBlLCBmVmFsdWUpKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmc6DQorICAgICAgICBpZiAoZHdUeXBlICYgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yKSB7DQorICAgICAgICAgIEZYX0FSR0IgZHdDb2xvcjsNCisgICAgICAgICAgaWYgKEZERV9QYXJzZUNTU0NvbG9yKHBzelZhbHVlLCBpVmFsdWVMZW4sIGR3Q29sb3IpKSB7DQorICAgICAgICAgICAgbGlzdC5BZGQoRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKGR3Q29sb3IpKTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGR3VHlwZSAmIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtKSB7DQorICAgICAgICAgIEZERV9MUENDU1NQUk9QRVJUWVZBTFVFVEFCTEUgcFZhbHVlID0NCisgICAgICAgICAgICAgIEZERV9HZXRDU1NQcm9wZXJ0eVZhbHVlQnlOYW1lKHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgICBpZiAocFZhbHVlICE9IE5VTEwpIHsNCisgICAgICAgICAgICBsaXN0LkFkZChOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKSk7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChkd1R5cGUgJiBGREVfQ1NTVkFMVUVUWVBFX01heWJlU3RyaW5nKSB7DQorICAgICAgICAgIHBzelZhbHVlID0gQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgICBsaXN0LkFkZChGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoDQorICAgICAgICAgICAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmcsIHBzelZhbHVlKSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQjoNCisgICAgICAgIGlmIChkd1R5cGUgJiBGREVfQ1NTVkFMVUVUWVBFX01heWJlQ29sb3IpIHsNCisgICAgICAgICAgRlhfQVJHQiBkd0NvbG9yOw0KKyAgICAgICAgICBpZiAoRkRFX1BhcnNlQ1NTQ29sb3IocHN6VmFsdWUsIGlWYWx1ZUxlbiwgZHdDb2xvcikpIHsNCisgICAgICAgICAgICBsaXN0LkFkZChGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoZHdDb2xvcikpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGlmIChsaXN0LkdldFNpemUoKSA9PSAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHN3aXRjaCAocEFyZ3MtPnBQcm9wZXJ0eS0+ZU5hbWUpIHsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQ29sb3I6DQorICAgICAgcmV0dXJuIEFkZDRWYWx1ZXNQcm9wZXJ0eSgNCisgICAgICAgICAgcFN0YXRpY1N0b3JlLCBsaXN0LCBiSW1wb3J0YW50LCBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyTGVmdENvbG9yLA0KKyAgICAgICAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyVG9wQ29sb3IsIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJSaWdodENvbG9yLA0KKyAgICAgICAgICBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyQm90dG9tQ29sb3IpOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJTdHlsZToNCisgICAgICByZXR1cm4gQWRkNFZhbHVlc1Byb3BlcnR5KA0KKyAgICAgICAgICBwU3RhdGljU3RvcmUsIGxpc3QsIGJJbXBvcnRhbnQsIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJMZWZ0U3R5bGUsDQorICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJUb3BTdHlsZSwgRkRFX0NTU1BST1BFUlRZX0JvcmRlclJpZ2h0U3R5bGUsDQorICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9Cb3JkZXJCb3R0b21TdHlsZSk7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlcldpZHRoOg0KKyAgICAgIHJldHVybiBBZGQ0VmFsdWVzUHJvcGVydHkoDQorICAgICAgICAgIHBTdGF0aWNTdG9yZSwgbGlzdCwgYkltcG9ydGFudCwgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRXaWR0aCwNCisgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlclRvcFdpZHRoLCBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyUmlnaHRXaWR0aCwNCisgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbVdpZHRoKTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfTWFyZ2luOg0KKyAgICAgIHJldHVybiBBZGQ0VmFsdWVzUHJvcGVydHkoDQorICAgICAgICAgIHBTdGF0aWNTdG9yZSwgbGlzdCwgYkltcG9ydGFudCwgRkRFX0NTU1BST1BFUlRZX01hcmdpbkxlZnQsDQorICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9NYXJnaW5Ub3AsIEZERV9DU1NQUk9QRVJUWV9NYXJnaW5SaWdodCwNCisgICAgICAgICAgRkRFX0NTU1BST1BFUlRZX01hcmdpbkJvdHRvbSk7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1BhZGRpbmc6DQorICAgICAgcmV0dXJuIEFkZDRWYWx1ZXNQcm9wZXJ0eSgNCisgICAgICAgICAgcFN0YXRpY1N0b3JlLCBsaXN0LCBiSW1wb3J0YW50LCBGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ0xlZnQsDQorICAgICAgICAgIEZERV9DU1NQUk9QRVJUWV9QYWRkaW5nVG9wLCBGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ1JpZ2h0LA0KKyAgICAgICAgICBGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ0JvdHRvbSk7DQorICAgIGRlZmF1bHQ6IHsNCisgICAgICBDRkRFX0NTU1ZhbHVlTGlzdCogcExpc3QgPQ0KKyAgICAgICAgICBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTVmFsdWVMaXN0KHBTdGF0aWNTdG9yZSwgbGlzdCk7DQorICAgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBwQXJncy0+cFByb3BlcnR5LT5lTmFtZSwgcExpc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgYkltcG9ydGFudCk7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0gYnJlYWs7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6QWRkNFZhbHVlc1Byb3BlcnR5KElGWF9NRU1BbGxvY2F0b3IqIHBTdGF0aWNTdG9yZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRkRFX0NTU1ZhbHVlQXJyYXkmIGxpc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW1wb3J0YW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWSBlTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFkgZVRvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFkgZVJpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWSBlQm90dG9tKSB7DQorICBzd2l0Y2ggKGxpc3QuR2V0U2l6ZSgpKSB7DQorICAgIGNhc2UgMToNCisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVMZWZ0LCBsaXN0WzBdLCBiSW1wb3J0YW50KTsNCisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVUb3AsIGxpc3RbMF0sIGJJbXBvcnRhbnQpOw0KKyAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZVJpZ2h0LCBsaXN0WzBdLCBiSW1wb3J0YW50KTsNCisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVCb3R0b20sIGxpc3RbMF0sIGJJbXBvcnRhbnQpOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICBjYXNlIDI6DQorICAgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBlTGVmdCwgbGlzdFsxXSwgYkltcG9ydGFudCk7DQorICAgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBlVG9wLCBsaXN0WzBdLCBiSW1wb3J0YW50KTsNCisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVSaWdodCwgbGlzdFsxXSwgYkltcG9ydGFudCk7DQorICAgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBlQm90dG9tLCBsaXN0WzBdLCBiSW1wb3J0YW50KTsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgY2FzZSAzOg0KKyAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZUxlZnQsIGxpc3RbMV0sIGJJbXBvcnRhbnQpOw0KKyAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZVRvcCwgbGlzdFswXSwgYkltcG9ydGFudCk7DQorICAgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBlUmlnaHQsIGxpc3RbMV0sIGJJbXBvcnRhbnQpOw0KKyAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZUJvdHRvbSwgbGlzdFsyXSwgYkltcG9ydGFudCk7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIGNhc2UgNDoNCisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVMZWZ0LCBsaXN0WzNdLCBiSW1wb3J0YW50KTsNCisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVUb3AsIGxpc3RbMF0sIGJJbXBvcnRhbnQpOw0KKyAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZVJpZ2h0LCBsaXN0WzFdLCBiSW1wb3J0YW50KTsNCisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVCb3R0b20sIGxpc3RbMl0sIGJJbXBvcnRhbnQpOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlQm9yZGVyUHJvcG9lcnR5KA0KKyAgICBJRlhfTUVNQWxsb2NhdG9yKiBwU3RhdGljU3RvcmUsDQorICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgaW50MzJfdCBpVmFsdWVMZW4sDQorICAgIElGREVfQ1NTVmFsdWUqJiBwQ29sb3IsDQorICAgIElGREVfQ1NTVmFsdWUqJiBwU3R5bGUsDQorICAgIElGREVfQ1NTVmFsdWUqJiBwV2lkdGgpIGNvbnN0IHsNCisgIHBDb2xvciA9IHBTdHlsZSA9IHBXaWR0aCA9IE5VTEw7DQorICBDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlciBwYXJzZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgJyAnKTsNCisgIEZERV9DU1NQUklNSVRJVkVUWVBFIGVUeXBlOw0KKyAgd2hpbGUgKHBhcnNlci5OZXh0VmFsdWUoZVR5cGUsIHBzelZhbHVlLCBpVmFsdWVMZW4pKSB7DQorICAgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcjoNCisgICAgICAgIGlmIChwV2lkdGggPT0gTlVMTCkgew0KKyAgICAgICAgICBGWF9GTE9BVCBmVmFsdWU7DQorICAgICAgICAgIGlmIChGREVfUGFyc2VDU1NOdW1iZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgZlZhbHVlLCBlVHlwZSkpIHsNCisgICAgICAgICAgICBwV2lkdGggPSBOZXdOdW1iZXJWYWx1ZShwU3RhdGljU3RvcmUsIGVUeXBlLCBmVmFsdWUpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQjoNCisgICAgICAgIGlmIChwQ29sb3IgPT0gTlVMTCkgew0KKyAgICAgICAgICBGWF9BUkdCIGR3Q29sb3I7DQorICAgICAgICAgIGlmIChGREVfUGFyc2VDU1NDb2xvcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBkd0NvbG9yKSkgew0KKyAgICAgICAgICAgIHBDb2xvciA9IEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShkd0NvbG9yKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmc6IHsNCisgICAgICAgIEZERV9MUENDU1NDT0xPUlRBQkxFIHBDb2xvckl0ZW0gPQ0KKyAgICAgICAgICAgIEZERV9HZXRDU1NDb2xvckJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgIGlmIChwQ29sb3JJdGVtICE9IE5VTEwpIHsNCisgICAgICAgICAgaWYgKHBDb2xvciA9PSBOVUxMKSB7DQorICAgICAgICAgICAgcENvbG9yID0gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKQ0KKyAgICAgICAgICAgICAgICBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKHBDb2xvckl0ZW0tPmR3VmFsdWUpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRkRFX0xQQ0NTU1BST1BFUlRZVkFMVUVUQUJMRSBwVmFsdWUgPQ0KKyAgICAgICAgICAgIEZERV9HZXRDU1NQcm9wZXJ0eVZhbHVlQnlOYW1lKHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgaWYgKHBWYWx1ZSA9PSBOVUxMKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc3dpdGNoIChwVmFsdWUtPmVOYW1lKSB7DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVHJhbnNwYXJlbnQ6DQorICAgICAgICAgICAgaWYgKHBDb2xvciA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICBwQ29sb3IgPQ0KKyAgICAgICAgICAgICAgICAgIEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZSgoRlhfQVJHQikwKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGhpbjoNCisgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UaGljazoNCisgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9NZWRpdW06DQorICAgICAgICAgICAgaWYgKHBXaWR0aCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICBwV2lkdGggPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZToNCisgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9IaWRkZW46DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRG90dGVkOg0KKyAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Rhc2hlZDoNCisgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Tb2xpZDoNCisgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Eb3VibGU6DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfR3Jvb3ZlOg0KKyAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JpZGdlOg0KKyAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0luc2V0Og0KKyAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX091dHNldDoNCisgICAgICAgICAgICBpZiAocFN0eWxlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgIHBTdHlsZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICB9OyBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGlmIChwQ29sb3IgPT0gTlVMTCkgew0KKyAgICBwQ29sb3IgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoKEZYX0FSR0IpMCk7DQorICB9DQorICBpZiAocFN0eWxlID09IE5VTEwpIHsNCisgICAgcFN0eWxlID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZSk7DQorICB9DQorICBpZiAocFdpZHRoID09IE5VTEwpIHsNCisgICAgcFdpZHRoID0gTmV3TnVtYmVyVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIsIDAuMGYpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6QWRkQm9yZGVyUHJvcGVydHkoSUZYX01FTUFsbG9jYXRvciogcFN0YXRpY1N0b3JlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NWYWx1ZSogcENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NWYWx1ZSogcFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NWYWx1ZSogcFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW1wb3J0YW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZIGVDb2xvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWSBlU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFkgZVdpZHRoKSB7DQorICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIGVTdHlsZSwgcFN0eWxlLCBiSW1wb3J0YW50KTsNCisgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgZVdpZHRoLCBwV2lkdGgsIGJJbXBvcnRhbnQpOw0KKyAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBlQ29sb3IsIHBDb2xvciwgYkltcG9ydGFudCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VMaXN0U3R5bGVQcm9wZXJ0eSgNCisgICAgRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywNCisgICAgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLA0KKyAgICBpbnQzMl90IGlWYWx1ZUxlbiwNCisgICAgRlhfQk9PTCBiSW1wb3J0YW50KSB7DQorICBJRlhfTUVNQWxsb2NhdG9yKiBwU3RhdGljU3RvcmUgPSBwQXJncy0+cFN0YXRpY1N0b3JlOw0KKyAgQ0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXIgcGFyc2VyKHBzelZhbHVlLCBpVmFsdWVMZW4sICcgJyk7DQorICBJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlICpwVHlwZSA9IE5VTEwsICpwSW1hZ2UgPSBOVUxMLCAqcFBvc2l0aW9uID0gTlVMTDsNCisgIEZERV9DU1NQUklNSVRJVkVUWVBFIGVUeXBlOw0KKyAgd2hpbGUgKHBhcnNlci5OZXh0VmFsdWUoZVR5cGUsIHBzelZhbHVlLCBpVmFsdWVMZW4pKSB7DQorICAgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1VSSToNCisgICAgICAgIGlmIChwSW1hZ2UgPT0gTlVMTCkgew0KKyAgICAgICAgICBwSW1hZ2UgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTUHJpbWl0aXZlVmFsdWUoDQorICAgICAgICAgICAgICBlVHlwZSwgQ29weVRvTG9jYWwocEFyZ3MsIHBzelZhbHVlLCBpVmFsdWVMZW4pKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nOiB7DQorICAgICAgICBGREVfTFBDQ1NTUFJPUEVSVFlWQUxVRVRBQkxFIHBWYWx1ZSA9DQorICAgICAgICAgICAgRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeU5hbWUocHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICBpZiAocFZhbHVlID09IE5VTEwpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBzd2l0Y2ggKHBWYWx1ZS0+ZU5hbWUpIHsNCisgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lOg0KKyAgICAgICAgICAgIGlmIChwSW1hZ2UgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgcEltYWdlID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChwVHlwZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICBwSW1hZ2UgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSW5zaWRlOg0KKyAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX091dHNpZGU6DQorICAgICAgICAgICAgaWYgKHBQb3NpdGlvbiA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICBwUG9zaXRpb24gPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRGlzYzoNCisgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9DaXJjbGU6DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3F1YXJlOg0KKyAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0RlY2ltYWw6DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRGVjaW1hbExlYWRpbmdaZXJvOg0KKyAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyUm9tYW46DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVXBwZXJSb21hbjoNCisgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Mb3dlckdyZWVrOg0KKyAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xvd2VyTGF0aW46DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVXBwZXJMYXRpbjoNCisgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Bcm1lbmlhbjoNCisgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9HZW9yZ2lhbjoNCisgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Mb3dlckFscGhhOg0KKyAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1VwcGVyQWxwaGE6DQorICAgICAgICAgICAgaWYgKHBUeXBlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgIHBUeXBlID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH07IGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHBQb3NpdGlvbiA9PSBOVUxMKSB7DQorICAgIHBQb3NpdGlvbiA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWVZBTFVFX091dHNpZGUpOw0KKyAgfQ0KKyAgaWYgKHBJbWFnZSA9PSBOVUxMKSB7DQorICAgIHBJbWFnZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmUpOw0KKyAgfQ0KKyAgaWYgKHBUeXBlID09IE5VTEwpIHsNCisgICAgcFR5cGUgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lKTsNCisgIH0NCisgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX0xpc3RTdHlsZVBvc2l0aW9uLCBwUG9zaXRpb24sDQorICAgICAgICAgICAgICAgICAgICBiSW1wb3J0YW50KTsNCisgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX0xpc3RTdHlsZUltYWdlLCBwSW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICBiSW1wb3J0YW50KTsNCisgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX0xpc3RTdHlsZVR5cGUsIHBUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgYkltcG9ydGFudCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUJhY2tncm91bmRQcm9wZXJ0eSgNCisgICAgRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywNCisgICAgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLA0KKyAgICBpbnQzMl90IGlWYWx1ZUxlbiwNCisgICAgRlhfQk9PTCBiSW1wb3J0YW50KSB7DQorICBJRlhfTUVNQWxsb2NhdG9yKiBwU3RhdGljU3RvcmUgPSBwQXJncy0+cFN0YXRpY1N0b3JlOw0KKyAgQ0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXIgcGFyc2VyKHBzelZhbHVlLCBpVmFsdWVMZW4sICcgJyk7DQorICBJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlICpwQ29sb3IgPSBOVUxMLCAqcEltYWdlID0gTlVMTCwgKnBSZXBlYXQgPSBOVUxMOw0KKyAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSAqcFBvc1ggPSBOVUxMLCAqcFBvc1kgPSBOVUxMLCAqcEF0dGFjaG1lbnQgPSBOVUxMOw0KKyAgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGU7DQorICB3aGlsZSAocGFyc2VyLk5leHRWYWx1ZShlVHlwZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbikpIHsNCisgICAgc3dpdGNoIChlVHlwZSkgew0KKyAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfVVJJOg0KKyAgICAgICAgaWYgKHBJbWFnZSA9PSBOVUxMKSB7DQorICAgICAgICAgIHBJbWFnZSA9IEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZSgNCisgICAgICAgICAgICAgIGVUeXBlLCBDb3B5VG9Mb2NhbChwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbikpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXI6IHsNCisgICAgICAgIEZYX0ZMT0FUIGZWYWx1ZTsNCisgICAgICAgIGlmICghRkRFX1BhcnNlQ1NTTnVtYmVyKHBzelZhbHVlLCBpVmFsdWVMZW4sIGZWYWx1ZSwgZVR5cGUpKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBQb3NYID09IE5VTEwpIHsNCisgICAgICAgICAgcFBvc1ggPSBOZXdOdW1iZXJWYWx1ZShwU3RhdGljU3RvcmUsIGVUeXBlLCBmVmFsdWUpOw0KKyAgICAgICAgfSBlbHNlIGlmIChwUG9zWSA9PSBOVUxMKSB7DQorICAgICAgICAgIHBQb3NZID0gTmV3TnVtYmVyVmFsdWUocFN0YXRpY1N0b3JlLCBlVHlwZSwgZlZhbHVlKTsNCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nOiB7DQorICAgICAgICBGREVfTFBDQ1NTUFJPUEVSVFlWQUxVRVRBQkxFIHBWYWx1ZSA9DQorICAgICAgICAgICAgRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeU5hbWUocHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICBpZiAocFZhbHVlICE9IE5VTEwpIHsNCisgICAgICAgICAgc3dpdGNoIChwVmFsdWUtPmVOYW1lKSB7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lOg0KKyAgICAgICAgICAgICAgaWYgKHBJbWFnZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIHBJbWFnZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UcmFuc3BhcmVudDoNCisgICAgICAgICAgICAgIGlmIChwQ29sb3IgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBwQ29sb3IgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpDQorICAgICAgICAgICAgICAgICAgICBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKChGWF9BUkdCKTApOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9GaXhlZDoNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1Njcm9sbDoNCisgICAgICAgICAgICAgIGlmIChwQXR0YWNobWVudCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIHBBdHRhY2htZW50ID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JlcGVhdDoNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JlcGVhdFg6DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SZXBlYXRZOg0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9SZXBlYXQ6DQorICAgICAgICAgICAgICBpZiAocFJlcGVhdCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIHBSZXBlYXQgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGVmdDoNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JpZ2h0Og0KKyAgICAgICAgICAgICAgaWYgKHBQb3NYID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcFBvc1ggPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVG9wOg0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQm90dG9tOg0KKyAgICAgICAgICAgICAgaWYgKHBQb3NZID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcFBvc1ggPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ2VudGVyOg0KKyAgICAgICAgICAgICAgaWYgKHBQb3NYID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcFBvc1ggPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZiAocFBvc1kgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBwUG9zWCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRkRFX0xQQ0NTU0NPTE9SVEFCTEUgcENvbG9ySXRlbSA9DQorICAgICAgICAgICAgRkRFX0dldENTU0NvbG9yQnlOYW1lKHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgaWYgKHBDb2xvckl0ZW0gIT0gTlVMTCkNCisgICAgICAgICAgaWYgKHBDb2xvciA9PSBOVUxMKSB7DQorICAgICAgICAgICAgcENvbG9yID0gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKQ0KKyAgICAgICAgICAgICAgICBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKHBDb2xvckl0ZW0tPmR3VmFsdWUpOw0KKyAgICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQjoNCisgICAgICAgIGlmIChwQ29sb3IgPT0gTlVMTCkgew0KKyAgICAgICAgICBGWF9BUkdCIGR3Q29sb3I7DQorICAgICAgICAgIGlmIChGREVfUGFyc2VDU1NDb2xvcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBkd0NvbG9yKSkgew0KKyAgICAgICAgICAgIHBDb2xvciA9IEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShkd0NvbG9yKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpZiAocENvbG9yID09IE5VTEwpIHsNCisgICAgcENvbG9yID0gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKSBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKChGWF9BUkdCKTApOw0KKyAgfQ0KKyAgaWYgKHBJbWFnZSA9PSBOVUxMKSB7DQorICAgIHBJbWFnZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmUpOw0KKyAgfQ0KKyAgaWYgKHBSZXBlYXQgPT0gTlVMTCkgew0KKyAgICBwUmVwZWF0ID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmVwZWF0KTsNCisgIH0NCisgIGlmIChwQXR0YWNobWVudCA9PSBOVUxMKSB7DQorICAgIHBBdHRhY2htZW50ID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZVkFMVUVfU2Nyb2xsKTsNCisgIH0NCisgIGlmIChwUG9zWCA9PSBOVUxMKSB7DQorICAgIHBQb3NYID0gTmV3TnVtYmVyVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIsIDAuMGYpOw0KKyAgICBwUG9zWSA9IE5ld051bWJlclZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyLCAwLjBmKTsNCisgIH0gZWxzZSBpZiAocFBvc1kgPT0gTlVMTCkgew0KKyAgICBwUG9zWSA9IE5ld051bWJlclZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyLCAwLjBmKTsNCisgIH0NCisgIENGREVfQ1NTVmFsdWVBcnJheSBwb3NpdGlvbjsNCisgIHBvc2l0aW9uLkFkZChwUG9zWCk7DQorICBwb3NpdGlvbi5BZGQocFBvc1kpOw0KKyAgQ0ZERV9DU1NWYWx1ZUxpc3QqIHBQb3NMaXN0ID0NCisgICAgICBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpIENGREVfQ1NTVmFsdWVMaXN0KHBTdGF0aWNTdG9yZSwgcG9zaXRpb24pOw0KKyAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfQmFja2dyb3VuZENvbG9yLCBwQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICBiSW1wb3J0YW50KTsNCisgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRJbWFnZSwgcEltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgYkltcG9ydGFudCk7DQorICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kUmVwZWF0LCBwUmVwZWF0LA0KKyAgICAgICAgICAgICAgICAgICAgYkltcG9ydGFudCk7DQorICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kUG9zaXRpb24sIHBQb3NMaXN0LA0KKyAgICAgICAgICAgICAgICAgICAgYkltcG9ydGFudCk7DQorICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kQXR0YWNobWVudCwNCisgICAgICAgICAgICAgICAgICAgIHBBdHRhY2htZW50LCBiSW1wb3J0YW50KTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlRm9udFByb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkltcG9ydGFudCkgew0KKyAgSUZYX01FTUFsbG9jYXRvciogcFN0YXRpY1N0b3JlID0gcEFyZ3MtPnBTdGF0aWNTdG9yZTsNCisgIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyIHBhcnNlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCAnLycpOw0KKyAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSAqcFN0eWxlID0gTlVMTCwgKnBWYXJpYW50ID0gTlVMTCwgKnBXZWlnaHQgPSBOVUxMOw0KKyAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSAqcEZvbnRTaXplID0gTlVMTCwgKnBMaW5lSGVpZ2h0ID0gTlVMTDsNCisgIENGREVfQ1NTVmFsdWVBcnJheSBmYW1pbHlMaXN0Ow0KKyAgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGU7DQorICB3aGlsZSAocGFyc2VyLk5leHRWYWx1ZShlVHlwZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbikpIHsNCisgICAgc3dpdGNoIChlVHlwZSkgew0KKyAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nOiB7DQorICAgICAgICBGREVfTFBDQ1NTUFJPUEVSVFlWQUxVRVRBQkxFIHBWYWx1ZSA9DQorICAgICAgICAgICAgRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeU5hbWUocHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICBpZiAocFZhbHVlICE9IE5VTEwpIHsNCisgICAgICAgICAgc3dpdGNoIChwVmFsdWUtPmVOYW1lKSB7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9YeFNtYWxsOg0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfWFNtYWxsOg0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU21hbGw6DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9NZWRpdW06DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MYXJnZToNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1hMYXJnZToNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1h4TGFyZ2U6DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TbWFsbGVyOg0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGFyZ2VyOg0KKyAgICAgICAgICAgICAgaWYgKHBGb250U2l6ZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIHBGb250U2l6ZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb2xkOg0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQm9sZGVyOg0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGlnaHRlcjoNCisgICAgICAgICAgICAgIGlmIChwV2VpZ2h0ID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcFdlaWdodCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9JdGFsaWM6DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9PYmxpcXVlOg0KKyAgICAgICAgICAgICAgaWYgKHBTdHlsZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIHBTdHlsZSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TbWFsbENhcHM6DQorICAgICAgICAgICAgICBpZiAocFZhcmlhbnQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBwVmFyaWFudCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob3JtYWw6DQorICAgICAgICAgICAgICBpZiAocFN0eWxlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcFN0eWxlID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBWYXJpYW50ID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcFZhcmlhbnQgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZiAocFdlaWdodCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIHBXZWlnaHQgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZiAocEZvbnRTaXplID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcEZvbnRTaXplID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBMaW5lSGVpZ2h0ID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcExpbmVIZWlnaHQgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBGb250U2l6ZSAhPSBOVUxMKSB7DQorICAgICAgICAgIGZhbWlseUxpc3QuQWRkKEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZSgNCisgICAgICAgICAgICAgIGVUeXBlLCBDb3B5VG9Mb2NhbChwQXJncywgcHN6VmFsdWUsIGlWYWx1ZUxlbikpKTsNCisgICAgICAgIH0NCisgICAgICAgIHBhcnNlci5tX1NlcGFyYXRvciA9ICcsJzsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyOiB7DQorICAgICAgICBGWF9GTE9BVCBmVmFsdWU7DQorICAgICAgICBpZiAoIUZERV9QYXJzZUNTU051bWJlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBmVmFsdWUsIGVUeXBlKSkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIpIHsNCisgICAgICAgICAgc3dpdGNoICgoaW50MzJfdClmVmFsdWUpIHsNCisgICAgICAgICAgICBjYXNlIDEwMDoNCisgICAgICAgICAgICBjYXNlIDIwMDoNCisgICAgICAgICAgICBjYXNlIDMwMDoNCisgICAgICAgICAgICBjYXNlIDQwMDoNCisgICAgICAgICAgICBjYXNlIDUwMDoNCisgICAgICAgICAgICBjYXNlIDYwMDoNCisgICAgICAgICAgICBjYXNlIDcwMDoNCisgICAgICAgICAgICBjYXNlIDgwMDoNCisgICAgICAgICAgICBjYXNlIDkwMDoNCisgICAgICAgICAgICAgIGlmIChwV2VpZ2h0ID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcFdlaWdodCA9IE5ld051bWJlclZhbHVlKHBTdGF0aWNTdG9yZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlciwgZlZhbHVlKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAocEZvbnRTaXplID09IE5VTEwpIHsNCisgICAgICAgICAgcEZvbnRTaXplID0gTmV3TnVtYmVyVmFsdWUocFN0YXRpY1N0b3JlLCBlVHlwZSwgZlZhbHVlKTsNCisgICAgICAgIH0gZWxzZSBpZiAocExpbmVIZWlnaHQgPT0gTlVMTCkgew0KKyAgICAgICAgICBwTGluZUhlaWdodCA9IE5ld051bWJlclZhbHVlKHBTdGF0aWNTdG9yZSwgZVR5cGUsIGZWYWx1ZSk7DQorICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGlmIChwU3R5bGUgPT0gTlVMTCkgew0KKyAgICBwU3R5bGUgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob3JtYWwpOw0KKyAgfQ0KKyAgaWYgKHBWYXJpYW50ID09IE5VTEwpIHsNCisgICAgcFZhcmlhbnQgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob3JtYWwpOw0KKyAgfQ0KKyAgaWYgKHBXZWlnaHQgPT0gTlVMTCkgew0KKyAgICBwV2VpZ2h0ID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9ybWFsKTsNCisgIH0NCisgIGlmIChwRm9udFNpemUgPT0gTlVMTCkgew0KKyAgICBwRm9udFNpemUgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9NZWRpdW0pOw0KKyAgfQ0KKyAgaWYgKHBMaW5lSGVpZ2h0ID09IE5VTEwpIHsNCisgICAgcExpbmVIZWlnaHQgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob3JtYWwpOw0KKyAgfQ0KKyAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfRm9udFN0eWxlLCBwU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICBiSW1wb3J0YW50KTsNCisgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX0ZvbnRWYXJpYW50LCBwVmFyaWFudCwNCisgICAgICAgICAgICAgICAgICAgIGJJbXBvcnRhbnQpOw0KKyAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfRm9udFdlaWdodCwgcFdlaWdodCwNCisgICAgICAgICAgICAgICAgICAgIGJJbXBvcnRhbnQpOw0KKyAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfRm9udFNpemUsIHBGb250U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgIGJJbXBvcnRhbnQpOw0KKyAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfTGluZUhlaWdodCwgcExpbmVIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICBiSW1wb3J0YW50KTsNCisgIGlmIChmYW1pbHlMaXN0LkdldFNpemUoKSA+IDApIHsNCisgICAgQ0ZERV9DU1NWYWx1ZUxpc3QqIHBMaXN0ID0NCisgICAgICAgIEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NWYWx1ZUxpc3QocFN0YXRpY1N0b3JlLCBmYW1pbHlMaXN0KTsNCisgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfRm9udEZhbWlseSwgcExpc3QsDQorICAgICAgICAgICAgICAgICAgICAgIGJJbXBvcnRhbnQpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VDb2x1bW5SdWxlUHJvcGVydHkoDQorICAgIEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgaW50MzJfdCBpVmFsdWVMZW4sDQorICAgIEZYX0JPT0wgYkltcG9ydGFudCkgew0KKyAgSUZYX01FTUFsbG9jYXRvciogcFN0YXRpY1N0b3JlID0gcEFyZ3MtPnBTdGF0aWNTdG9yZTsNCisgIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyIHBhcnNlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCAnICcpOw0KKyAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSogcENvbHVtblJ1bGVXaWR0aCA9IE5VTEw7DQorICBJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKiBwQ29sdW1uUnVsZVN0eWxlID0gTlVMTDsNCisgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqIHBDb2x1bW5SdWxlQ29sb3IgPSBOVUxMOw0KKyAgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGU7DQorICB3aGlsZSAocGFyc2VyLk5leHRWYWx1ZShlVHlwZSwgcHN6VmFsdWUsIGlWYWx1ZUxlbikpIHsNCisgICAgc3dpdGNoIChlVHlwZSkgew0KKyAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nOiB7DQorICAgICAgICBGREVfTFBDQ1NTUFJPUEVSVFlWQUxVRVRBQkxFIHBWYWx1ZSA9DQorICAgICAgICAgICAgRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeU5hbWUocHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICBpZiAocFZhbHVlICE9IE5VTEwpIHsNCisgICAgICAgICAgc3dpdGNoIChwVmFsdWUtPmVOYW1lKSB7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lOg0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSGlkZGVuOg0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRG90dGVkOg0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRGFzaGVkOg0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU29saWQ6DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Eb3VibGU6DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Hcm9vdmU6DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SaWRnZToNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0luc2V0Og0KKyAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfT3V0c2V0Og0KKyAgICAgICAgICAgICAgaWYgKHBDb2x1bW5SdWxlU3R5bGUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBwQ29sdW1uUnVsZVN0eWxlID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RyYW5zcGFyZW50Og0KKyAgICAgICAgICAgICAgaWYgKHBDb2x1bW5SdWxlQ29sb3IgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBwQ29sdW1uUnVsZUNvbG9yID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RoaW46DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9NZWRpdW06DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UaGljazoNCisgICAgICAgICAgICAgIGlmIChwQ29sdW1uUnVsZVdpZHRoID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcENvbHVtblJ1bGVXaWR0aCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfQVJHQiBkd0NvbG9yOw0KKyAgICAgICAgaWYgKEZERV9QYXJzZUNTU0NvbG9yKHBzelZhbHVlLCBpVmFsdWVMZW4sIGR3Q29sb3IpICYmDQorICAgICAgICAgICAgcENvbHVtblJ1bGVDb2xvciA9PSBOVUxMKSB7DQorICAgICAgICAgIHBDb2x1bW5SdWxlQ29sb3IgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpDQorICAgICAgICAgICAgICBDRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKChGWF9BUkdCKWR3Q29sb3IpOw0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyOiB7DQorICAgICAgICBGWF9GTE9BVCBmVmFsdWU7DQorICAgICAgICBpZiAoRkRFX1BhcnNlQ1NTTnVtYmVyKHBzelZhbHVlLCBpVmFsdWVMZW4sIGZWYWx1ZSwgZVR5cGUpICYmDQorICAgICAgICAgICAgcENvbHVtblJ1bGVXaWR0aCA9PSBOVUxMKSB7DQorICAgICAgICAgIHBDb2x1bW5SdWxlV2lkdGggPSBOZXdOdW1iZXJWYWx1ZShwU3RhdGljU3RvcmUsIGVUeXBlLCBmVmFsdWUpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9SR0I6IHsNCisgICAgICAgIEZYX0FSR0IgZHdDb2xvcjsNCisgICAgICAgIGlmIChwQ29sdW1uUnVsZUNvbG9yID09IE5VTEwgJiYNCisgICAgICAgICAgICBGREVfUGFyc2VDU1NDb2xvcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBkd0NvbG9yKSkgew0KKyAgICAgICAgICBwQ29sdW1uUnVsZUNvbG9yID0gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKQ0KKyAgICAgICAgICAgICAgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZSgoRlhfQVJHQilkd0NvbG9yKTsNCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHBDb2x1bW5SdWxlQ29sb3IgPT0gTlVMTCAmJiBwQ29sdW1uUnVsZVN0eWxlID09IE5VTEwgJiYNCisgICAgICBwQ29sdW1uUnVsZVdpZHRoID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHBDb2x1bW5SdWxlU3R5bGUgPT0gTlVMTCkgew0KKyAgICBwQ29sdW1uUnVsZVN0eWxlID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZSk7DQorICB9DQorICBpZiAocENvbHVtblJ1bGVXaWR0aCA9PSBOVUxMKSB7DQorICAgIHBDb2x1bW5SdWxlV2lkdGggPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9NZWRpdW0pOw0KKyAgfQ0KKyAgaWYgKHBDb2x1bW5SdWxlQ29sb3IgPT0gTlVMTCkgew0KKyAgICBwQ29sdW1uUnVsZUNvbG9yID0NCisgICAgICAgIEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZSgoRlhfQVJHQikwKTsNCisgIH0NCisgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX0NvbHVtblJ1bGVTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgIHBDb2x1bW5SdWxlU3R5bGUsIGJJbXBvcnRhbnQpOw0KKyAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfQ29sdW1uUnVsZVdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgcENvbHVtblJ1bGVXaWR0aCwgYkltcG9ydGFudCk7DQorICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5SdWxlQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICBwQ29sdW1uUnVsZUNvbG9yLCBiSW1wb3J0YW50KTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlVGV4dEVtcGhhc2lzUHJvcGVydHkoDQorICAgIEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgaW50MzJfdCBpVmFsdWVMZW4sDQorICAgIEZYX0JPT0wgYkltcG9ydGFudCkgew0KKyAgSUZYX01FTUFsbG9jYXRvciogcFN0YXRpY1N0b3JlID0gcEFyZ3MtPnBTdGF0aWNTdG9yZTsNCisgIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyIHBhcnNlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCAnICcpOw0KKyAgQ0ZERV9DU1NWYWx1ZUFycmF5IGFyckVtcGhhc2lzU3R5bGU7DQorICBGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVHlwZTsNCisgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqIHBFbXBoYXNpc0NvbG9yID0gTlVMTDsNCisgIHdoaWxlIChwYXJzZXIuTmV4dFZhbHVlKGVUeXBlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKSkgew0KKyAgICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmc6IHsNCisgICAgICAgIEZERV9MUENDU1NQUk9QRVJUWVZBTFVFVEFCTEUgcFZhbHVlID0NCisgICAgICAgICAgICBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgIGlmIChwVmFsdWUgIT0gTlVMTCkgew0KKyAgICAgICAgICBhcnJFbXBoYXNpc1N0eWxlLkFkZChOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBwVmFsdWUtPmVOYW1lKSk7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfQVJHQiBkd0NvbG9yOw0KKyAgICAgICAgaWYgKEZERV9QYXJzZUNTU0NvbG9yKHBzelZhbHVlLCBpVmFsdWVMZW4sIGR3Q29sb3IpKSB7DQorICAgICAgICAgIHBFbXBoYXNpc0NvbG9yID0NCisgICAgICAgICAgICAgIEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShkd0NvbG9yKTsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBwc3pWYWx1ZSA9IENvcHlUb0xvY2FsKHBBcmdzLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgIGFyckVtcGhhc2lzU3R5bGUuQWRkKEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZSgNCisgICAgICAgICAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmcsIHBzelZhbHVlKSk7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQjogew0KKyAgICAgICAgRlhfQVJHQiBkd0NvbG9yOw0KKyAgICAgICAgaWYgKEZERV9QYXJzZUNTU0NvbG9yKHBzelZhbHVlLCBpVmFsdWVMZW4sIGR3Q29sb3IpKSB7DQorICAgICAgICAgIHBFbXBoYXNpc0NvbG9yID0NCisgICAgICAgICAgICAgIEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkgQ0ZERV9DU1NQcmltaXRpdmVWYWx1ZShkd0NvbG9yKTsNCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGFyckVtcGhhc2lzU3R5bGUuR2V0U2l6ZSgpICE9IDApIHsNCisgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfVGV4dEVtcGhhc2lzU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgIEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfQ1NTVmFsdWVMaXN0KHBTdGF0aWNTdG9yZSwgYXJyRW1waGFzaXNTdHlsZSksDQorICAgICAgICAgICAgICAgICAgICAgIGJJbXBvcnRhbnQpOw0KKyAgfQ0KKyAgaWYgKHBFbXBoYXNpc0NvbG9yICE9IE5VTEwpIHsNCisgICAgQWRkUHJvcGVydHlIb2xkZXIocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlfVGV4dEVtcGhhc2lzQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgIHBFbXBoYXNpc0NvbG9yLCBiSW1wb3J0YW50KTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlQ29sdW1uc1Byb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkltcG9ydGFudCkgew0KKyAgSUZYX01FTUFsbG9jYXRvciogcFN0YXRpY1N0b3JlID0gcEFyZ3MtPnBTdGF0aWNTdG9yZTsNCisgIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyIHBhcnNlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCAnICcpOw0KKyAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSogcENvbHVtbldpZHRoID0gTlVMTDsNCisgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqIHBDb2x1bW5Db3VudCA9IE5VTEw7DQorICBGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVHlwZTsNCisgIHdoaWxlIChwYXJzZXIuTmV4dFZhbHVlKGVUeXBlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKSkgew0KKyAgICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmc6IHsNCisgICAgICAgIEZERV9MUENDU1NQUk9QRVJUWVZBTFVFVEFCTEUgcFZhbHVlID0NCisgICAgICAgICAgICBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICAgIGlmIChwVmFsdWUgPT0gTlVMTCAmJiBwVmFsdWUtPmVOYW1lID09IEZERV9DU1NQUk9QRVJUWVZBTFVFX0F1dG8pIHsNCisgICAgICAgICAgcENvbHVtbldpZHRoID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQorICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcjogew0KKyAgICAgICAgRlhfRkxPQVQgZlZhbHVlOw0KKyAgICAgICAgaWYgKEZERV9QYXJzZUNTU051bWJlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBmVmFsdWUsIGVUeXBlKSkgew0KKyAgICAgICAgICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXI6DQorICAgICAgICAgICAgICBpZiAocENvbHVtbkNvdW50ID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcENvbHVtbkNvdW50ID0gTmV3TnVtYmVyVmFsdWUocFN0YXRpY1N0b3JlLCBlVHlwZSwgZlZhbHVlKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICBpZiAocENvbHVtbldpZHRoID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgcENvbHVtbldpZHRoID0gTmV3TnVtYmVyVmFsdWUocFN0YXRpY1N0b3JlLCBlVHlwZSwgZlZhbHVlKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGlmIChwQ29sdW1uV2lkdGggPT0gTlVMTCAmJiBwQ29sdW1uQ291bnQgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9IGVsc2UgaWYgKHBDb2x1bW5XaWR0aCA9PSBOVUxMKSB7DQorICAgIHBDb2x1bW5XaWR0aCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWVZBTFVFX0F1dG8pOw0KKyAgfSBlbHNlIGlmIChwQ29sdW1uQ291bnQgPT0gTlVMTCkgew0KKyAgICBwQ29sdW1uQ291bnQgPSBOZXdFbnVtVmFsdWUocFN0YXRpY1N0b3JlLCBGREVfQ1NTUFJPUEVSVFlWQUxVRV9BdXRvKTsNCisgIH0NCisgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX0NvbHVtbldpZHRoLCBwQ29sdW1uV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICBiSW1wb3J0YW50KTsNCisgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX0NvbHVtbkNvdW50LCBwQ29sdW1uQ291bnQsDQorICAgICAgICAgICAgICAgICAgICBiSW1wb3J0YW50KTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlT3ZlcmZsb3dQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbXBvcnRhbnQpIHsNCisgIElGWF9NRU1BbGxvY2F0b3IqIHBTdGF0aWNTdG9yZSA9IHBBcmdzLT5wU3RhdGljU3RvcmU7DQorICBDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlciBwYXJzZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgJyAnKTsNCisgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqIHBPdmVyZmxvd1ggPSBOVUxMOw0KKyAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSogcE92ZXJmbG93WSA9IE5VTEw7DQorICBGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVHlwZTsNCisgIHdoaWxlIChwYXJzZXIuTmV4dFZhbHVlKGVUeXBlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKSkgew0KKyAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfU3RyaW5nKSB7DQorICAgICAgRkRFX0xQQ0NTU1BST1BFUlRZVkFMVUVUQUJMRSBwVmFsdWUgPQ0KKyAgICAgICAgICBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsNCisgICAgICBpZiAocFZhbHVlICE9IE5VTEwpIHsNCisgICAgICAgIHN3aXRjaCAocFZhbHVlLT5lTmFtZSkgew0KKyAgICAgICAgICBjYXNlIEZERV9DU1NPVkVSRkxPV19WaXNpYmxlOg0KKyAgICAgICAgICBjYXNlIEZERV9DU1NPVkVSRkxPV19IaWRkZW46DQorICAgICAgICAgIGNhc2UgRkRFX0NTU09WRVJGTE9XX1Njcm9sbDoNCisgICAgICAgICAgY2FzZSBGREVfQ1NTT1ZFUkZMT1dfQXV0bzoNCisgICAgICAgICAgY2FzZSBGREVfQ1NTT1ZFUkZMT1dfTm9EaXNwbGF5Og0KKyAgICAgICAgICBjYXNlIEZERV9DU1NPVkVSRkxPV19Ob0NvbnRlbnQ6DQorICAgICAgICAgICAgaWYgKHBPdmVyZmxvd1ggIT0gTlVMTCAmJiBwT3ZlcmZsb3dZICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKHBPdmVyZmxvd1ggPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgcE92ZXJmbG93WCA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBWYWx1ZS0+ZU5hbWUpOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocE92ZXJmbG93WSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICBwT3ZlcmZsb3dZID0gTmV3RW51bVZhbHVlKHBTdGF0aWNTdG9yZSwgcFZhbHVlLT5lTmFtZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHBPdmVyZmxvd1ggPT0gTlVMTCAmJiBwT3ZlcmZsb3dZID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfSBlbHNlIGlmIChwT3ZlcmZsb3dZID09IE5VTEwpIHsNCisgICAgcE92ZXJmbG93WSA9IE5ld0VudW1WYWx1ZShwU3RhdGljU3RvcmUsIHBPdmVyZmxvd1gtPkdldEVudW0oKSk7DQorICB9DQorICBBZGRQcm9wZXJ0eUhvbGRlcihwU3RhdGljU3RvcmUsIEZERV9DU1NQUk9QRVJUWV9PdmVyZmxvd1gsIHBPdmVyZmxvd1gsDQorICAgICAgICAgICAgICAgICAgICBiSW1wb3J0YW50KTsNCisgIEFkZFByb3BlcnR5SG9sZGVyKHBTdGF0aWNTdG9yZSwgRkRFX0NTU1BST1BFUlRZX092ZXJmbG93WSwgcE92ZXJmbG93WSwNCisgICAgICAgICAgICAgICAgICAgIGJJbXBvcnRhbnQpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc2RlY2xhcmF0aW9uLmggYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NkZWNsYXJhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZmU3N2YKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NkZWNsYXJhdGlvbi5oCkBAIC0wLDAgKzEsMTUxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZERV9DU1NERUNMQVJBVElPTg0KKyNkZWZpbmUgX0ZERV9DU1NERUNMQVJBVElPTg0KKyNpbmNsdWRlICJmZGVfY3NzZGF0YXRhYmxlLmgiDQordHlwZWRlZiBzdHJ1Y3QgX0ZERV9DU1NQUk9QRVJUWUhPTERFUiA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgIGludDE2X3QgZVByb3BlcnR5Ow0KKyAgaW50MTZfdCBiSW1wb3J0YW50Ow0KKyAgSUZERV9DU1NWYWx1ZSogcFZhbHVlOw0KKyAgX0ZERV9DU1NQUk9QRVJUWUhPTERFUiogcE5leHQ7DQorfSBGREVfQ1NTUFJPUEVSVFlIT0xERVIsICpGREVfTFBDU1NQUk9QRVJUWUhPTERFUjsNCit0eXBlZGVmIHN0cnVjdCBfRkRFX0NTU0NVU1RPTVBST1BFUlRZIDogcHVibGljIENGWF9UYXJnZXQgew0KKyAgY29uc3QgRlhfV0NIQVIqIHB3c05hbWU7DQorICBjb25zdCBGWF9XQ0hBUiogcHdzVmFsdWU7DQorICBfRkRFX0NTU0NVU1RPTVBST1BFUlRZKiBwTmV4dDsNCit9IEZERV9DU1NDVVNUT01QUk9QRVJUWSwgKkZERV9MUENTU0NVU1RPTVBST1BFUlRZOw0KK3R5cGVkZWYgc3RydWN0IF9GREVfQ1NTUFJPUEVSVFlBUkdTIDogcHVibGljIENGWF9UYXJnZXQgew0KKyAgSUZYX01FTUFsbG9jYXRvciogcFN0YXRpY1N0b3JlOw0KKyAgQ0ZYX01hcFB0clRvUHRyKiBwU3RyaW5nQ2FjaGU7DQorICBGREVfTFBDQ1NTUFJPUEVSVFlUQUJMRSBwUHJvcGVydHk7DQorfSBGREVfQ1NTUFJPUEVSVFlBUkdTOw0KK3R5cGVkZWYgRkRFX0NTU1BST1BFUlRZQVJHUyBjb25zdCogRkRFX0xQQ0NTU1BST1BFUlRZQVJHUzsNCitjbGFzcyBDRkRFX0NTU0RlY2xhcmF0aW9uIDogcHVibGljIElGREVfQ1NTRGVjbGFyYXRpb24sIHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZERV9DU1NEZWNsYXJhdGlvbigpDQorICAgICAgOiBtX3BGaXJzdFByb3BlcnR5KE5VTEwpLA0KKyAgICAgICAgbV9wTGFzdFByb3BlcnR5KE5VTEwpLA0KKyAgICAgICAgbV9wRmlyc3RDdXN0b20oTlVMTCksDQorICAgICAgICBtX3BMYXN0Q3VzdG9tKE5VTEwpIHt9DQorICB2aXJ0dWFsIElGREVfQ1NTVmFsdWUqIEdldFByb3BlcnR5KEZERV9DU1NQUk9QRVJUWSBlUHJvcGVydHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJJbXBvcnRhbnQpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9QT1NJVElPTiBHZXRTdGFydFBvc2l0aW9uKCkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0TmV4dFByb3BlcnR5KEZYX1BPU0lUSU9OJiBwb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWSYgZVByb3BlcnR5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU1ZhbHVlKiYgcFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiSW1wb3J0YW50KSBjb25zdDsNCisgIHZpcnR1YWwgRlhfUE9TSVRJT04gR2V0U3RhcnRDdXN0b20oKSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBHZXROZXh0Q3VzdG9tKEZYX1BPU0lUSU9OJiBwb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpIGNvbnN0Ow0KKyAgRlhfQk9PTCBBZGRQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuKTsNCisgIEZYX0JPT0wgQWRkUHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywNCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzek5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU5hbWVMZW4sDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4pOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBGWF9CT09MIFBhcnNlVGV4dEVtcGhhc2lzUHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW1wb3J0YW50KTsNCisgIEZYX0JPT0wgUGFyc2VDb2x1bW5zUHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW1wb3J0YW50KTsNCisgIEZYX0JPT0wgUGFyc2VDb2x1bW5SdWxlUHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW1wb3J0YW50KTsNCisgIEZYX0JPT0wgUGFyc2VPdmVyZmxvd1Byb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkltcG9ydGFudCk7DQorICBGWF9CT09MIFBhcnNlRm9udFByb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkltcG9ydGFudCk7DQorICBGWF9CT09MIFBhcnNlQmFja2dyb3VuZFByb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkltcG9ydGFudCk7DQorICBGWF9CT09MIFBhcnNlTGlzdFN0eWxlUHJvcGVydHkoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW1wb3J0YW50KTsNCisgIEZYX0JPT0wgUGFyc2VCb3JkZXJQcm9wb2VydHkoSUZYX01FTUFsbG9jYXRvciogcFN0YXRpY1N0b3JlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU1ZhbHVlKiYgcENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU1ZhbHVlKiYgcFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU1ZhbHVlKiYgcFdpZHRoKSBjb25zdDsNCisgIHZvaWQgQWRkQm9yZGVyUHJvcGVydHkoSUZYX01FTUFsbG9jYXRvciogcFN0YXRpY1N0b3JlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU1ZhbHVlKiBwQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTVmFsdWUqIHBTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NWYWx1ZSogcFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbXBvcnRhbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWSBlQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWSBlU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWSBlV2lkdGgpOw0KKyAgRlhfQk9PTCBQYXJzZUNvbnRlbnRQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbXBvcnRhbnQpOw0KKyAgRlhfQk9PTCBQYXJzZUNvdW50ZXJQcm9wZXJ0eShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbXBvcnRhbnQpOw0KKyAgRlhfQk9PTCBQYXJzZVZhbHVlTGlzdFByb3BlcnR5KEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkltcG9ydGFudCk7DQorICBGWF9CT09MIEFkZDRWYWx1ZXNQcm9wZXJ0eShJRlhfTUVNQWxsb2NhdG9yKiBwU3RhdGljU3RvcmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRkRFX0NTU1ZhbHVlQXJyYXkmIGxpc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbXBvcnRhbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFkgZUxlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFkgZVRvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWSBlUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJPUEVSVFkgZUJvdHRvbSk7DQorICBJRkRFX0NTU1ZhbHVlKiBQYXJzZU51bWJlcihGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4pOw0KKyAgSUZERV9DU1NWYWx1ZSogUGFyc2VFbnVtKEZERV9MUENDU1NQUk9QRVJUWUFSR1MgcEFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuKTsNCisgIElGREVfQ1NTVmFsdWUqIFBhcnNlQ29sb3IoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbik7DQorICBJRkRFX0NTU1ZhbHVlKiBQYXJzZVVSSShGREVfTFBDQ1NTUFJPUEVSVFlBUkdTIHBBcmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4pOw0KKyAgSUZERV9DU1NWYWx1ZSogUGFyc2VTdHJpbmcoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuKTsNCisgIElGREVfQ1NTVmFsdWUqIFBhcnNlRnVuY3Rpb24oRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbik7DQorICBjb25zdCBGWF9XQ0hBUiogQ29weVRvTG9jYWwoRkRFX0xQQ0NTU1BST1BFUlRZQVJHUyBwQXJncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4pOw0KKyAgdm9pZCBBZGRQcm9wZXJ0eUhvbGRlcihJRlhfTUVNQWxsb2NhdG9yKiBwU3RhdGljU3RvcmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUk9QRVJUWSBlUHJvcGVydHksDQorICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTVmFsdWUqIHBWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW1wb3J0YW50KTsNCisgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqIE5ld051bWJlclZhbHVlKElGWF9NRU1BbGxvY2F0b3IqIHBTdGF0aWNTdG9yZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQUklNSVRJVkVUWVBFIGVVbml0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlZhbHVlKSBjb25zdDsNCisgIElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqIE5ld0VudW1WYWx1ZShJRlhfTUVNQWxsb2NhdG9yKiBwU3RhdGljU3RvcmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSBjb25zdDsNCisgIEZERV9MUENTU1BST1BFUlRZSE9MREVSIG1fcEZpcnN0UHJvcGVydHk7DQorICBGREVfTFBDU1NQUk9QRVJUWUhPTERFUiBtX3BMYXN0UHJvcGVydHk7DQorICBGREVfTFBDU1NDVVNUT01QUk9QRVJUWSBtX3BGaXJzdEN1c3RvbTsNCisgIEZERV9MUENTU0NVU1RPTVBST1BFUlRZIG1fcExhc3RDdXN0b207DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzdHlsZXNlbGVjdG9yLmNwcCBiL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N0eWxlc2VsZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZmE1YzYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzdHlsZXNlbGVjdG9yLmNwcApAQCAtMCwwICsxLDE3OTggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAiZmRlX2Nzc2NhY2hlLmgiDQorI2luY2x1ZGUgImZkZV9jc3NkZWNsYXJhdGlvbi5oIg0KKyNpbmNsdWRlICJmZGVfY3Nzc3R5bGVzZWxlY3Rvci5oIg0KK2ludDMyX3QgQ0ZERV9DU1NDb3VudGVyU3R5bGU6OkZpbmRJbmRleChjb25zdCBGWF9XQ0hBUiogcHN6SWRlbnRpZmllcikgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX2FyckNvdW50ZXJEYXRhLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIGlmIChGWFNZU193Y3NjbXAocHN6SWRlbnRpZmllciwgbV9hcnJDb3VudGVyRGF0YS5FbGVtZW50QXQoaSkubV9wc3pJZGVudCkgPT0NCisgICAgICAgIDApIHsNCisgICAgICByZXR1cm4gaTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIC0xOw0KK30NCit2b2lkIENGREVfQ1NTQ291bnRlclN0eWxlOjpEb1VwZGF0ZUluZGV4KElGREVfQ1NTVmFsdWVMaXN0KiBwTGlzdCkgew0KKyAgaWYgKHBMaXN0ID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpQ291bnQgPSBwTGlzdC0+Q291bnRWYWx1ZXMoKTsNCisgIEZYX0ZMT0FUIGZEZWZWYWx1ZSA9IDEuMDsNCisgIEZYX0JPT0wgYkRlZkluY3JlbWVudCA9IFRSVUU7DQorICBpZiAocExpc3QgPT0gbV9wQ291bnRlclJlc2V0KSB7DQorICAgIGZEZWZWYWx1ZSA9IDAuMDsNCisgICAgYkRlZkluY3JlbWVudCA9IEZBTFNFOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgSUZERV9DU1NWYWx1ZUxpc3QqIHBDb3VudGVyID0gKElGREVfQ1NTVmFsdWVMaXN0KilwTGlzdC0+R2V0VmFsdWUoaSk7DQorICAgIGludDMyX3QgaUxlbjsNCisgICAgY29uc3QgRlhfV0NIQVIqIHBzeklkZW50aWZpZXIgPQ0KKyAgICAgICAgKChJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKikocENvdW50ZXItPkdldFZhbHVlKDApKSktPkdldFN0cmluZyhpTGVuKTsNCisgICAgRlhfRkxPQVQgZlZhbHVlID0gZkRlZlZhbHVlOw0KKyAgICBpZiAocENvdW50ZXItPkNvdW50VmFsdWVzKCkgPiAxKSB7DQorICAgICAgZlZhbHVlID0gKChJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKikocENvdW50ZXItPkdldFZhbHVlKDEpKSktPkdldEZsb2F0KCk7DQorICAgIH0NCisgICAgaW50MzJfdCBpSW5kZXggPSBGaW5kSW5kZXgocHN6SWRlbnRpZmllcik7DQorICAgIGlmIChpSW5kZXggPT0gLTEpIHsNCisgICAgICBGREVfQ1NTQ09VTlRFUkRBVEEgZGF0YTsNCisgICAgICBkYXRhLm1fcHN6SWRlbnQgPSBwc3pJZGVudGlmaWVyOw0KKyAgICAgIGlmIChiRGVmSW5jcmVtZW50KSB7DQorICAgICAgICBkYXRhLm1fYkluY3JlbWVudCA9IFRSVUU7DQorICAgICAgICBkYXRhLm1faUluY1ZhbCA9IChpbnQzMl90KWZWYWx1ZTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgZGF0YS5tX2lSZXNldFZhbCA9IChpbnQzMl90KWZWYWx1ZTsNCisgICAgICAgIGRhdGEubV9iUmVzZXQgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgICBtX2FyckNvdW50ZXJEYXRhLkFkZChkYXRhKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGREVfQ1NTQ09VTlRFUkRBVEEmIGRhdGEgPSBtX2FyckNvdW50ZXJEYXRhLkVsZW1lbnRBdChpSW5kZXgpOw0KKyAgICAgIGlmIChiRGVmSW5jcmVtZW50KSB7DQorICAgICAgICBkYXRhLm1fYkluY3JlbWVudCA9IFRSVUU7DQorICAgICAgICBkYXRhLm1faUluY1ZhbCArPSAoaW50MzJfdClmVmFsdWU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGRhdGEubV9iUmVzZXQgPSBUUlVFOw0KKyAgICAgICAgZGF0YS5tX2lSZXNldFZhbCA9IChpbnQzMl90KWZWYWx1ZTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDRkRFX0NTU0NvdW50ZXJTdHlsZTo6VXBkYXRlSW5kZXgoKSB7DQorICBpZiAoIW1fYkluZGV4RGlydHkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV9hcnJDb3VudGVyRGF0YS5SZW1vdmVBbGwoKTsNCisgIERvVXBkYXRlSW5kZXgobV9wQ291bnRlckluYyk7DQorICBEb1VwZGF0ZUluZGV4KG1fcENvdW50ZXJSZXNldCk7DQorICBtX2JJbmRleERpcnR5ID0gRkFMU0U7DQorfQ0KK0ZERV9DU1NURVhURU1QSEFTSVNNQVJLIENGREVfQ1NTQ29tcHV0ZWRTdHlsZTo6R2V0VGV4dEVtcGhhc2lzTWFyaygpIGNvbnN0IHsNCisgIGlmIChtX0luaGVyaXRlZERhdGEubV9lVGV4dEVtcGhhc2lzTWFyayAhPSBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19BdXRvKSB7DQorICAgIHJldHVybiAoRkRFX0NTU1RFWFRFTVBIQVNJU01BUkspbV9Jbmhlcml0ZWREYXRhLm1fZVRleHRFbXBoYXNpc01hcms7DQorICB9DQorICBpZiAobV9Jbmhlcml0ZWREYXRhLm1fZVdyaXRpbmdNb2RlID09IEZERV9DU1NXUklUSU5HTU9ERV9Ib3Jpem9udGFsVGIpIHsNCisgICAgcmV0dXJuIEZERV9DU1NURVhURU1QSEFTSVNNQVJLX0RvdDsNCisgIH0NCisgIHJldHVybiBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19TZXNhbWU7DQorfQ0KK19GREVfQ1NTUlVMRURBVEE6Ol9GREVfQ1NTUlVMRURBVEEoSUZERV9DU1NTZWxlY3RvciogcFNlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTRGVjbGFyYXRpb24qIHBEZWNsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQb3MpDQorICAgIDogcFNlbGVjdG9yKHBTZWwpLCBwRGVjbGFyYXRpb24ocERlY2wpLCBkd1ByaW9yaXR5KGR3UG9zKSwgcE5leHQoTlVMTCkgew0KKyAgc3RhdGljIGNvbnN0IEZYX0RXT1JEIHNfU3BlY2lmaWNbNV0gPSB7MHgwMDAxMDAwMCwgMHgwMDAxMDAwMCwgMHgwMDEwMDAwMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAsIDB4MDEwMDAwMDB9Ow0KKyAgZm9yICg7IHBTZWwgIT0gTlVMTDsgcFNlbCA9IHBTZWwtPkdldE5leHRTZWxlY3RvcigpKSB7DQorICAgIEZERV9DU1NTRUxFQ1RPUlRZUEUgZVR5cGUgPSBwU2VsLT5HZXRUeXBlKCk7DQorICAgIGlmIChlVHlwZSA+IEZERV9DU1NTRUxFQ1RPUlRZUEVfRGVzY2VuZGFudCB8fA0KKyAgICAgICAgcFNlbC0+R2V0TmFtZUhhc2goKSAhPSBGREVfQ1NTVU5JVkVSU0FMSEFTSCkgew0KKyAgICAgIGR3UHJpb3JpdHkgKz0gc19TcGVjaWZpY1tlVHlwZV07DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDRkRFX0NTU1J1bGVDb2xsZWN0aW9uOjpDbGVhcigpIHsNCisgIG1fSURSdWxlcy5SZW1vdmVBbGwoKTsNCisgIG1fVGFnUnVsZXMuUmVtb3ZlQWxsKCk7DQorICBtX0NsYXNzUnVsZXMuUmVtb3ZlQWxsKCk7DQorICBtX3BVbml2ZXJzYWxSdWxlcyA9IE5VTEw7DQorICBtX3BTdGF0aWNTdG9yZSA9IE5VTEw7DQorICBtX2lTZWxlY3RvcnMgPSAwOw0KK30NCit2b2lkIENGREVfQ1NTUnVsZUNvbGxlY3Rpb246OkFkZFJ1bGVzRnJvbShjb25zdCBDRkRFX0NTU1N0eWxlU2hlZXRBcnJheSYgc2hlZXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TWVkaWFMaXN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Gb250TWdyKiBwRm9udE1ncikgew0KKyAgaW50MzJfdCBpU2hlZXRzID0gc2hlZXRzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTaGVldHM7ICsraSkgew0KKyAgICBJRkRFX0NTU1N0eWxlU2hlZXQqIHBTaGVldCA9IHNoZWV0cy5HZXRBdChpKTsNCisgICAgaWYgKEZYX0RXT1JEIGR3TWF0Y2hNZWRpYSA9IHBTaGVldC0+R2V0TWVkaWFMaXN0KCkgJiBkd01lZGlhTGlzdCkgew0KKyAgICAgIGludDMyX3QgaVJ1bGVzID0gcFNoZWV0LT5Db3VudFJ1bGVzKCk7DQorICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaVJ1bGVzOyBqKyspIHsNCisgICAgICAgIEFkZFJ1bGVzRnJvbShwU2hlZXQsIHBTaGVldC0+R2V0UnVsZShqKSwgZHdNYXRjaE1lZGlhLCBwRm9udE1ncik7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9DU1NSdWxlQ29sbGVjdGlvbjo6QWRkUnVsZXNGcm9tKElGREVfQ1NTU3R5bGVTaGVldCogcFN0eWxlU2hlZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NSdWxlKiBwUnVsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd01lZGlhTGlzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRm9udE1nciogcEZvbnRNZ3IpIHsNCisgIHN3aXRjaCAocFJ1bGUtPkdldFR5cGUoKSkgew0KKyAgICBjYXNlIEZERV9DU1NSVUxFVFlQRV9TdHlsZTogew0KKyAgICAgIElGREVfQ1NTU3R5bGVSdWxlKiBwU3R5bGVSdWxlID0gKElGREVfQ1NTU3R5bGVSdWxlKilwUnVsZTsNCisgICAgICBJRkRFX0NTU0RlY2xhcmF0aW9uKiBwRGVjbGFyYXRpb24gPSBwU3R5bGVSdWxlLT5HZXREZWNsYXJhdGlvbigpOw0KKyAgICAgIGludDMyX3QgaVNlbGVjdG9ycyA9IHBTdHlsZVJ1bGUtPkNvdW50U2VsZWN0b3JMaXN0cygpOw0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTZWxlY3RvcnM7ICsraSkgew0KKyAgICAgICAgSUZERV9DU1NTZWxlY3RvciogcFNlbGVjdG9yID0gcFN0eWxlUnVsZS0+R2V0U2VsZWN0b3JMaXN0KGkpOw0KKyAgICAgICAgaWYgKHBTZWxlY3Rvci0+R2V0VHlwZSgpID09IEZERV9DU1NTRUxFQ1RPUlRZUEVfUGVyc3Vkbykgew0KKyAgICAgICAgICBGREVfTFBDU1NSVUxFREFUQSBwRGF0YSA9IE5ld1J1bGVEYXRhKHBTZWxlY3RvciwgcERlY2xhcmF0aW9uKTsNCisgICAgICAgICAgQWRkUnVsZVRvKG1fcFBlcnN1ZG9SdWxlcywgcERhdGEpOw0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwU2VsZWN0b3ItPkdldE5hbWVIYXNoKCkgIT0gRkRFX0NTU1VOSVZFUlNBTEhBU0gpIHsNCisgICAgICAgICAgQWRkUnVsZVRvKG1fVGFnUnVsZXMsIHBTZWxlY3Rvci0+R2V0TmFtZUhhc2goKSwgcFNlbGVjdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgcERlY2xhcmF0aW9uKTsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBJRkRFX0NTU1NlbGVjdG9yKiBwTmV4dCA9IHBTZWxlY3Rvci0+R2V0TmV4dFNlbGVjdG9yKCk7DQorICAgICAgICBpZiAocE5leHQgPT0gTlVMTCkgew0KKyAgICAgICAgICBGREVfTFBDU1NSVUxFREFUQSBwRGF0YSA9IE5ld1J1bGVEYXRhKHBTZWxlY3RvciwgcERlY2xhcmF0aW9uKTsNCisgICAgICAgICAgQWRkUnVsZVRvKG1fcFVuaXZlcnNhbFJ1bGVzLCBwRGF0YSk7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc3dpdGNoIChwTmV4dC0+R2V0VHlwZSgpKSB7DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1NFTEVDVE9SVFlQRV9JRDoNCisgICAgICAgICAgICBBZGRSdWxlVG8obV9JRFJ1bGVzLCBwTmV4dC0+R2V0TmFtZUhhc2goKSwgcFNlbGVjdG9yLCBwRGVjbGFyYXRpb24pOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBjYXNlIEZERV9DU1NTRUxFQ1RPUlRZUEVfQ2xhc3M6DQorICAgICAgICAgICAgQWRkUnVsZVRvKG1fQ2xhc3NSdWxlcywgcE5leHQtPkdldE5hbWVIYXNoKCksIHBTZWxlY3RvciwNCisgICAgICAgICAgICAgICAgICAgICAgcERlY2xhcmF0aW9uKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgY2FzZSBGREVfQ1NTU0VMRUNUT1JUWVBFX0Rlc2NlbmRhbnQ6DQorICAgICAgICAgIGNhc2UgRkRFX0NTU1NFTEVDVE9SVFlQRV9FbGVtZW50Og0KKyAgICAgICAgICAgIEFkZFJ1bGVUbyhtX3BVbml2ZXJzYWxSdWxlcywgTmV3UnVsZURhdGEocFNlbGVjdG9yLCBwRGVjbGFyYXRpb24pKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBGWFNZU19hc3NlcnQoRkFMU0UpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGREVfQ1NTUlVMRVRZUEVfTWVkaWE6IHsNCisgICAgICBJRkRFX0NTU01lZGlhUnVsZSogcE1lZGlhUnVsZSA9IChJRkRFX0NTU01lZGlhUnVsZSopcFJ1bGU7DQorICAgICAgaWYgKHBNZWRpYVJ1bGUtPkdldE1lZGlhTGlzdCgpICYgZHdNZWRpYUxpc3QpIHsNCisgICAgICAgIGludDMyX3QgaVJ1bGVzID0gcE1lZGlhUnVsZS0+Q291bnRSdWxlcygpOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVJ1bGVzOyArK2kpIHsNCisgICAgICAgICAgQWRkUnVsZXNGcm9tKHBTdHlsZVNoZWV0LCBwTWVkaWFSdWxlLT5HZXRSdWxlKGkpLCBkd01lZGlhTGlzdCwNCisgICAgICAgICAgICAgICAgICAgICAgIHBGb250TWdyKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9DU1NSdWxlQ29sbGVjdGlvbjo6QWRkUnVsZVRvKENGWF9NYXBQdHJUb1B0ciYgbWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3S2V5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTU2VsZWN0b3IqIHBTZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NEZWNsYXJhdGlvbiogcERlY2wpIHsNCisgIHZvaWQqIHBLZXkgPSAodm9pZCopKHVpbnRwdHJfdClkd0tleTsNCisgIEZERV9MUENTU1JVTEVEQVRBIHBEYXRhID0gTmV3UnVsZURhdGEocFNlbCwgcERlY2wpOw0KKyAgRkRFX0xQQ1NTUlVMRURBVEEgcExpc3QgPSBOVUxMOw0KKyAgaWYgKCFtYXAuTG9va3VwKHBLZXksICh2b2lkKiYpcExpc3QpKSB7DQorICAgIG1hcC5TZXRBdChwS2V5LCBwRGF0YSk7DQorICB9IGVsc2UgaWYgKEFkZFJ1bGVUbyhwTGlzdCwgcERhdGEpKSB7DQorICAgIG1hcC5TZXRBdChwS2V5LCBwTGlzdCk7DQorICB9DQorfQ0KK2lubGluZSBGWF9CT09MIENGREVfQ1NTUnVsZUNvbGxlY3Rpb246OkFkZFJ1bGVUbyhGREVfTFBDU1NSVUxFREFUQSYgcExpc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9MUENTU1JVTEVEQVRBIHBEYXRhKSB7DQorICBpZiAocExpc3QgPT0gTlVMTCkgew0KKyAgICBwTGlzdCA9IHBEYXRhOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0gZWxzZSB7DQorICAgIHBEYXRhLT5wTmV4dCA9IHBMaXN0LT5wTmV4dDsNCisgICAgcExpc3QtPnBOZXh0ID0gcERhdGE7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCit9DQoraW5saW5lIEZERV9MUENTU1JVTEVEQVRBIENGREVfQ1NTUnVsZUNvbGxlY3Rpb246Ok5ld1J1bGVEYXRhKA0KKyAgICBJRkRFX0NTU1NlbGVjdG9yKiBwU2VsLA0KKyAgICBJRkRFX0NTU0RlY2xhcmF0aW9uKiBwRGVjbCkgew0KKyAgcmV0dXJuIEZERV9OZXdXaXRoKG1fcFN0YXRpY1N0b3JlKQ0KKyAgICAgIEZERV9DU1NSVUxFREFUQShwU2VsLCBwRGVjbCwgKyttX2lTZWxlY3RvcnMpOw0KK30NCitJRkRFX0NTU1N0eWxlU2VsZWN0b3IqIElGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6Q3JlYXRlKCkgew0KKyAgcmV0dXJuIG5ldyBDRkRFX0NTU1N0eWxlU2VsZWN0b3I7DQorfQ0KK0NGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6Q0ZERV9DU1NTdHlsZVNlbGVjdG9yKCkNCisgICAgOiBtX3BGb250TWdyKE5VTEwpLA0KKyAgICAgIG1fZkRlZkZvbnRTaXplKDEyLjBmKSwNCisgICAgICBtX3BSdWxlRGF0YVN0b3JlKE5VTEwpLA0KKyAgICAgIG1fcElubGluZVN0eWxlU3RvcmUoTlVMTCksDQorICAgICAgbV9wRml4ZWRTdHlsZVN0b3JlKE5VTEwpLA0KKyAgICAgIG1fcEFjY2VsZXJhdG9yKE5VTEwpIHsNCisgIG1fZVByaW9yaXRpZXNbRkRFX0NTU1NUWUxFU0hFRVRQUklPUklUWV9IaWdoXSA9IEZERV9DU1NTVFlMRVNIRUVUR1JPVVBfQXV0aG9yOw0KKyAgbV9lUHJpb3JpdGllc1tGREVfQ1NTU1RZTEVTSEVFVFBSSU9SSVRZX01pZF0gPSBGREVfQ1NTU1RZTEVTSEVFVEdST1VQX1VzZXI7DQorICBtX2VQcmlvcml0aWVzW0ZERV9DU1NTVFlMRVNIRUVUUFJJT1JJVFlfTG93XSA9DQorICAgICAgRkRFX0NTU1NUWUxFU0hFRVRHUk9VUF9Vc2VyQWdlbnQ7DQorfQ0KK0NGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6fkNGREVfQ1NTU3R5bGVTZWxlY3RvcigpIHsNCisgIFJlc2V0KCk7DQorICBpZiAobV9wSW5saW5lU3R5bGVTdG9yZSAhPSBOVUxMKSB7DQorICAgIG1fcElubGluZVN0eWxlU3RvcmUtPlJlbGVhc2UoKTsNCisgIH0NCisgIGlmIChtX3BGaXhlZFN0eWxlU3RvcmUgIT0gTlVMTCkgew0KKyAgICBtX3BGaXhlZFN0eWxlU3RvcmUtPlJlbGVhc2UoKTsNCisgIH0NCisgIGlmIChtX3BBY2NlbGVyYXRvciAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBtX3BBY2NlbGVyYXRvcjsNCisgIH0NCit9DQordm9pZCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlNldEZvbnRNZ3IoSUZYX0ZvbnRNZ3IqIHBGb250TWdyKSB7DQorICBtX3BGb250TWdyID0gcEZvbnRNZ3I7DQorfQ0KK3ZvaWQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpTZXREZWZGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpIHsNCisgIEZYU1lTX2Fzc2VydChmRm9udFNpemUgPiAwKTsNCisgIG1fZkRlZkZvbnRTaXplID0gZkZvbnRTaXplOw0KK30NCitJRkRFX0NTU0FjY2VsZXJhdG9yKiBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OkluaXRBY2NlbGVyYXRvcigpIHsNCisgIGlmIChtX3BBY2NlbGVyYXRvciA9PSBOVUxMKSB7DQorICAgIG1fcEFjY2VsZXJhdG9yID0gbmV3IENGREVfQ1NTQWNjZWxlcmF0b3I7DQorICAgIEZYU1lTX2Fzc2VydChtX3BBY2NlbGVyYXRvciAhPSBOVUxMKTsNCisgIH0NCisgIG1fcEFjY2VsZXJhdG9yLT5DbGVhcigpOw0KKyAgcmV0dXJuIG1fcEFjY2VsZXJhdG9yOw0KK30NCitJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6Q3JlYXRlQ29tcHV0ZWRTdHlsZSgNCisgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwUGFyZW50U3R5bGUpIHsNCisgIGlmIChtX3BGaXhlZFN0eWxlU3RvcmUgPT0gTlVMTCkgew0KKyAgICBtX3BGaXhlZFN0eWxlU3RvcmUgPSBGWF9DcmVhdGVBbGxvY2F0b3IoRlhfQUxMT0NUWVBFX0ZpeGVkLCAxNiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihDRkRFX0NTU0NvbXB1dGVkU3R5bGUpKTsNCisgICAgRlhTWVNfYXNzZXJ0KG1fcEZpeGVkU3R5bGVTdG9yZSAhPSBOVUxMKTsNCisgIH0NCisgIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlID0NCisgICAgICBGREVfTmV3V2l0aChtX3BGaXhlZFN0eWxlU3RvcmUpIENGREVfQ1NTQ29tcHV0ZWRTdHlsZShtX3BGaXhlZFN0eWxlU3RvcmUpOw0KKyAgaWYgKHBQYXJlbnRTdHlsZSkgew0KKyAgICBwU3R5bGUtPm1fSW5oZXJpdGVkRGF0YSA9DQorICAgICAgICAoKENGREVfQ1NTQ29tcHV0ZWRTdHlsZSopcFBhcmVudFN0eWxlKS0+bV9Jbmhlcml0ZWREYXRhOw0KKyAgfSBlbHNlIHsNCisgICAgcFN0eWxlLT5tX0luaGVyaXRlZERhdGEuUmVzZXQoKTsNCisgIH0NCisgIHBTdHlsZS0+bV9Ob25Jbmhlcml0ZWREYXRhLlJlc2V0KCk7DQorICByZXR1cm4gcFN0eWxlOw0KK30NCitGWF9CT09MIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6U2V0U3R5bGVTaGVldChGREVfQ1NTU1RZTEVTSEVFVEdST1VQIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTU3R5bGVTaGVldCogcFNoZWV0KSB7DQorICBGWFNZU19hc3NlcnQoZVR5cGUgPCBGREVfQ1NTU1RZTEVTSEVFVEdST1VQX01BWCk7DQorICBDRkRFX0NTU1N0eWxlU2hlZXRBcnJheSYgZGVzdCA9IG1fU2hlZXRHcm91cHNbZVR5cGVdOw0KKyAgZGVzdC5SZW1vdmVBdCgwLCBkZXN0LkdldFNpemUoKSk7DQorICBpZiAocFNoZWV0ICE9IE5VTEwpIHsNCisgICAgZGVzdC5BZGQocFNoZWV0KTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6U2V0U3R5bGVTaGVldHMoDQorICAgIEZERV9DU1NTVFlMRVNIRUVUR1JPVVAgZVR5cGUsDQorICAgIGNvbnN0IENGREVfQ1NTU3R5bGVTaGVldEFycmF5KiBwQXJyYXkpIHsNCisgIEZYU1lTX2Fzc2VydChlVHlwZSA8IEZERV9DU1NTVFlMRVNIRUVUR1JPVVBfTUFYKTsNCisgIENGREVfQ1NTU3R5bGVTaGVldEFycmF5JiBkZXN0ID0gbV9TaGVldEdyb3Vwc1tlVHlwZV07DQorICBpZiAocEFycmF5ID09IE5VTEwpIHsNCisgICAgZGVzdC5SZW1vdmVBdCgwLCBkZXN0LkdldFNpemUoKSk7DQorICB9IGVsc2Ugew0KKyAgICBkZXN0LkNvcHkoKnBBcnJheSk7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlNldFN0eWxlUHJpb3JpdHkoDQorICAgIEZERV9DU1NTVFlMRVNIRUVUR1JPVVAgZVR5cGUsDQorICAgIEZERV9DU1NTVFlMRVNIRUVUUFJJT1JJVFkgZVByaW9yaXR5KSB7DQorICBtX2VQcmlvcml0aWVzW2VQcmlvcml0eV0gPSBlVHlwZTsNCit9DQordm9pZCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlVwZGF0ZVN0eWxlSW5kZXgoRlhfRFdPUkQgZHdNZWRpYUxpc3QpIHsNCisgIFJlc2V0KCk7DQorICBtX3BSdWxlRGF0YVN0b3JlID0gRlhfQ3JlYXRlQWxsb2NhdG9yKEZYX0FMTE9DVFlQRV9TdGF0aWMsIDEwMjQsIDApOw0KKyAgRlhTWVNfYXNzZXJ0KG1fcFJ1bGVEYXRhU3RvcmUgIT0gTlVMTCk7DQorICBmb3IgKGludDMyX3QgaUdyb3VwID0gMDsgaUdyb3VwIDwgRkRFX0NTU1NUWUxFU0hFRVRHUk9VUF9NQVg7ICsraUdyb3VwKSB7DQorICAgIENGREVfQ1NTUnVsZUNvbGxlY3Rpb24mIHJ1bGVzID0gbV9SdWxlQ29sbGVjdGlvbltpR3JvdXBdOw0KKyAgICBydWxlcy5tX3BTdGF0aWNTdG9yZSA9IG1fcFJ1bGVEYXRhU3RvcmU7DQorICAgIHJ1bGVzLkFkZFJ1bGVzRnJvbShtX1NoZWV0R3JvdXBzW2lHcm91cF0sIGR3TWVkaWFMaXN0LCBtX3BGb250TWdyKTsNCisgIH0NCit9DQordm9pZCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlJlc2V0KCkgew0KKyAgZm9yIChpbnQzMl90IGlHcm91cCA9IDA7IGlHcm91cCA8IEZERV9DU1NTVFlMRVNIRUVUR1JPVVBfTUFYOyArK2lHcm91cCkgew0KKyAgICBtX1J1bGVDb2xsZWN0aW9uW2lHcm91cF0uQ2xlYXIoKTsNCisgIH0NCisgIGlmIChtX3BSdWxlRGF0YVN0b3JlICE9IE5VTEwpIHsNCisgICAgbV9wUnVsZURhdGFTdG9yZS0+UmVsZWFzZSgpOw0KKyAgICBtX3BSdWxlRGF0YVN0b3JlID0gTlVMTDsNCisgIH0NCit9DQoraW50MzJfdCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6Ok1hdGNoRGVjbGFyYXRpb25zKA0KKyAgICBJRkRFX0NTU1RhZ1Byb3ZpZGVyKiBwVGFnLA0KKyAgICBDRkRFX0NTU0RlY2xhcmF0aW9uQXJyYXkmIG1hdGNoZWREZWNscywNCisgICAgRkRFX0NTU1BFUlNVRE8gZVBlcnN1ZG9UeXBlKSB7DQorICBGWFNZU19hc3NlcnQobV9wQWNjZWxlcmF0b3IgIT0gTlVMTCAmJiBwVGFnICE9IE5VTEwpOw0KKyAgRkRFX0xQQ1NTVEFHQ0FDSEUgcENhY2hlID0gbV9wQWNjZWxlcmF0b3ItPkdldFRvcEVsZW1lbnQoKTsNCisgIEZYU1lTX2Fzc2VydChwQ2FjaGUgIT0gTlVMTCAmJiBwQ2FjaGUtPkdldFRhZygpID09IHBUYWcpOw0KKyAgbWF0Y2hlZERlY2xzLlJlbW92ZUF0KDAsIG1hdGNoZWREZWNscy5HZXRTaXplKCkpOw0KKyAgZm9yIChpbnQzMl90IGVQcmlvcml0eSA9IEZERV9DU1NTVFlMRVNIRUVUUFJJT1JJVFlfTUFYIC0gMTsgZVByaW9yaXR5ID49IDA7DQorICAgICAgIC0tZVByaW9yaXR5KSB7DQorICAgIEZERV9DU1NTVFlMRVNIRUVUR1JPVVAgZUdyb3VwID0gbV9lUHJpb3JpdGllc1tlUHJpb3JpdHldOw0KKyAgICBDRkRFX0NTU1J1bGVDb2xsZWN0aW9uJiBydWxlcyA9IG1fUnVsZUNvbGxlY3Rpb25bZUdyb3VwXTsNCisgICAgaWYgKHJ1bGVzLkNvdW50U2VsZWN0b3JzKCkgPT0gMCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChlUGVyc3Vkb1R5cGUgPT0gRkRFX0NTU1BFUlNVRE9fTk9ORSkgew0KKyAgICAgIE1hdGNoUnVsZXMocENhY2hlLCBydWxlcy5HZXRVbml2ZXJzYWxSdWxlRGF0YSgpLCBlUGVyc3Vkb1R5cGUpOw0KKyAgICAgIGlmIChwQ2FjaGUtPkhhc2hUYWcoKSkgew0KKyAgICAgICAgTWF0Y2hSdWxlcyhwQ2FjaGUsIHJ1bGVzLkdldFRhZ1J1bGVEYXRhKHBDYWNoZS0+SGFzaFRhZygpKSwNCisgICAgICAgICAgICAgICAgICAgZVBlcnN1ZG9UeXBlKTsNCisgICAgICB9DQorICAgICAgaW50MzJfdCBpQ291bnQgPSBwQ2FjaGUtPkNvdW50SGFzaENsYXNzKCk7DQorICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICAgIHBDYWNoZS0+U2V0Q2xhc3NJbmRleChpKTsNCisgICAgICAgIE1hdGNoUnVsZXMocENhY2hlLCBydWxlcy5HZXRDbGFzc1J1bGVEYXRhKHBDYWNoZS0+SGFzaENsYXNzKCkpLA0KKyAgICAgICAgICAgICAgICAgICBlUGVyc3Vkb1R5cGUpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBNYXRjaFJ1bGVzKHBDYWNoZSwgcnVsZXMuR2V0UGVyc3Vkb1J1bGVEYXRhKCksIGVQZXJzdWRvVHlwZSk7DQorICAgIH0NCisgICAgaWYgKG1fTWF0Y2hlZFJ1bGVzLkdldFNpemUoKSA+IDApIHsNCisgICAgICBTb3J0UnVsZXNUbyhtYXRjaGVkRGVjbHMpOw0KKyAgICAgIG1fTWF0Y2hlZFJ1bGVzLlJlbW92ZUF0KDAsIG1fTWF0Y2hlZFJ1bGVzLkdldFNpemUoKSk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBtYXRjaGVkRGVjbHMuR2V0U2l6ZSgpOw0KK30NCitpbmxpbmUgdm9pZCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6Ok1hdGNoUnVsZXMoRkRFX0xQQ1NTVEFHQ0FDSEUgcENhY2hlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfTFBDU1NSVUxFREFUQSBwTGlzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1BFUlNVRE8gZVBlcnN1ZG9UeXBlKSB7DQorICB3aGlsZSAocExpc3QgIT0gTlVMTCkgew0KKyAgICBpZiAoTWF0Y2hTZWxlY3RvcihwQ2FjaGUsIHBMaXN0LT5wU2VsZWN0b3IsIGVQZXJzdWRvVHlwZSkpIHsNCisgICAgICBtX01hdGNoZWRSdWxlcy5BZGQocExpc3QpOw0KKyAgICB9DQorICAgIHBMaXN0ID0gcExpc3QtPnBOZXh0Ow0KKyAgfQ0KK30NCitGWF9CT09MIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6TWF0Y2hTZWxlY3RvcihGREVfTFBDU1NUQUdDQUNIRSBwQ2FjaGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NTZWxlY3RvciogcFNlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUEVSU1VETyBlUGVyc3Vkb1R5cGUpIHsNCisgIEZYX0RXT1JEIGR3SGFzaDsNCisgIHdoaWxlIChwU2VsICE9IE5VTEwgJiYgcENhY2hlICE9IE5VTEwpIHsNCisgICAgc3dpdGNoIChwU2VsLT5HZXRUeXBlKCkpIHsNCisgICAgICBjYXNlIEZERV9DU1NTRUxFQ1RPUlRZUEVfRGVzY2VuZGFudDoNCisgICAgICAgIGR3SGFzaCA9IHBTZWwtPkdldE5hbWVIYXNoKCk7DQorICAgICAgICB3aGlsZSAoKHBDYWNoZSA9IHBDYWNoZS0+R2V0UGFyZW50KCkpICE9IE5VTEwpIHsNCisgICAgICAgICAgaWYgKGR3SGFzaCAhPSBGREVfQ1NTVU5JVkVSU0FMSEFTSCAmJiBkd0hhc2ggIT0gcENhY2hlLT5IYXNoVGFnKCkpIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoTWF0Y2hTZWxlY3RvcihwQ2FjaGUsIHBTZWwtPkdldE5leHRTZWxlY3RvcigpLCBlUGVyc3Vkb1R5cGUpKSB7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICBjYXNlIEZERV9DU1NTRUxFQ1RPUlRZUEVfSUQ6DQorICAgICAgICBkd0hhc2ggPSBwQ2FjaGUtPkhhc2hJRCgpOw0KKyAgICAgICAgaWYgKGR3SGFzaCAhPSBwU2VsLT5HZXROYW1lSGFzaCgpKSB7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1NFTEVDVE9SVFlQRV9DbGFzczoNCisgICAgICAgIGR3SGFzaCA9IHBDYWNoZS0+SGFzaENsYXNzKCk7DQorICAgICAgICBpZiAoZHdIYXNoICE9IHBTZWwtPkdldE5hbWVIYXNoKCkpIHsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTU0VMRUNUT1JUWVBFX0VsZW1lbnQ6DQorICAgICAgICBkd0hhc2ggPSBwU2VsLT5HZXROYW1lSGFzaCgpOw0KKyAgICAgICAgaWYgKGR3SGFzaCAhPSBGREVfQ1NTVU5JVkVSU0FMSEFTSCAmJiBkd0hhc2ggIT0gcENhY2hlLT5IYXNoVGFnKCkpIHsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTU0VMRUNUT1JUWVBFX1BlcnN1ZG86DQorICAgICAgICBkd0hhc2ggPSBGREVfR2V0Q1NTUGVyc3Vkb0J5RW51bShlUGVyc3Vkb1R5cGUpLT5kd0hhc2g7DQorICAgICAgICBpZiAoZHdIYXNoICE9IHBTZWwtPkdldE5hbWVIYXNoKCkpIHsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBwU2VsID0gcFNlbC0+R2V0TmV4dFNlbGVjdG9yKCk7DQorICB9DQorICByZXR1cm4gcFNlbCA9PSBOVUxMICYmIHBDYWNoZSAhPSBOVUxMOw0KK30NCit2b2lkIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6U29ydFJ1bGVzVG8oQ0ZERV9DU1NEZWNsYXJhdGlvbkFycmF5JiBtYXRjaERlY2xzKSB7DQorICBmb3IgKGludDMyX3QgaiA9IG1fTWF0Y2hlZFJ1bGVzLkdldFVwcGVyQm91bmQoKTsgaiA+PSAwOyAtLWopIHsNCisgICAgRkRFX0xQQ1NTUlVMRURBVEEmIHBNaW4gPSBtX01hdGNoZWRSdWxlcy5FbGVtZW50QXQoaik7DQorICAgIEZYX0RXT1JEIGR3TWluID0gcE1pbi0+ZHdQcmlvcml0eTsNCisgICAgZm9yIChpbnQzMl90IGkgPSBqIC0gMTsgaSA+PSAwOyAtLWkpIHsNCisgICAgICBGREVfTFBDU1NSVUxFREFUQSYgcEN1ciA9IG1fTWF0Y2hlZFJ1bGVzLkVsZW1lbnRBdChpKTsNCisgICAgICBpZiAoZHdNaW4gPiBwQ3VyLT5kd1ByaW9yaXR5KSB7DQorICAgICAgICBkd01pbiA9IHBDdXItPmR3UHJpb3JpdHk7DQorICAgICAgICBGREVfTFBDU1NSVUxFREFUQSBwID0gcE1pbjsNCisgICAgICAgIHBNaW4gPSBwQ3VyOw0KKyAgICAgICAgcEN1ciA9IHA7DQorICAgICAgfQ0KKyAgICB9DQorICAgIG1hdGNoRGVjbHMuQWRkKHBNaW4tPnBEZWNsYXJhdGlvbik7DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpDb21wdXRlU3R5bGUoDQorICAgIElGREVfQ1NTVGFnUHJvdmlkZXIqIHBUYWcsDQorICAgIGNvbnN0IElGREVfQ1NTRGVjbGFyYXRpb24qKiBwcERlY2xBcnJheSwNCisgICAgaW50MzJfdCBpRGVjbENvdW50LA0KKyAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBEZXN0U3R5bGUpIHsNCisgIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcENvbXB1dGVkU3R5bGUgPSAoQ0ZERV9DU1NDb21wdXRlZFN0eWxlKilwRGVzdFN0eWxlOw0KKyAgRlhTWVNfYXNzZXJ0KHBUYWcgJiYgaURlY2xDb3VudCA+PSAwICYmIHBDb21wdXRlZFN0eWxlICE9IE5VTEwpOw0KKyAgRlhfUE9TSVRJT04gcG9zID0gcFRhZy0+R2V0Rmlyc3RBdHRyaWJ1dGUoKTsNCisgIGlmIChwb3MgIT0gTlVMTCkgew0KKyAgICBpZiAobV9wSW5saW5lU3R5bGVTdG9yZSA9PSBOVUxMKSB7DQorICAgICAgbV9wSW5saW5lU3R5bGVTdG9yZSA9IEZYX0NyZWF0ZUFsbG9jYXRvcihGWF9BTExPQ1RZUEVfU3RhdGljLCAyMDQ4LCAwKTsNCisgICAgfQ0KKyAgICBDRkRFX0NTU0RlY2xhcmF0aW9uKiBwRGVjbCA9IE5VTEw7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c0F0dHJpLCB3c1ZhbHVlOw0KKyAgICBGWF9EV09SRCBkd0F0dHJpSGFzaDsNCisgICAgZG8gew0KKyAgICAgIHBUYWctPkdldE5leHRBdHRyaWJ1dGUocG9zLCB3c0F0dHJpLCB3c1ZhbHVlKTsNCisgICAgICBkd0F0dHJpSGFzaCA9DQorICAgICAgICAgIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzQXR0cmkuR2V0UHRyKCksIHdzQXR0cmkuR2V0TGVuZ3RoKCksIFRSVUUpOw0KKyAgICAgIHN0YXRpYyBjb25zdCBGWF9EV09SRCBzX2R3U3R5bGVIYXNoID0NCisgICAgICAgICAgRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoTCJzdHlsZSIsIDUsIFRSVUUpOw0KKyAgICAgIHN0YXRpYyBjb25zdCBGWF9EV09SRCBzX2R3QWxpZ25IYXNoID0NCisgICAgICAgICAgRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoTCJhbGlnbiIsIDUsIFRSVUUpOw0KKyAgICAgIGlmIChkd0F0dHJpSGFzaCA9PSBzX2R3U3R5bGVIYXNoKSB7DQorICAgICAgICBpZiAocERlY2wgPT0gTlVMTCkgew0KKyAgICAgICAgICBwRGVjbCA9IEZERV9OZXdXaXRoKG1fcElubGluZVN0eWxlU3RvcmUpIENGREVfQ1NTRGVjbGFyYXRpb247DQorICAgICAgICB9DQorICAgICAgICBBcHBlbmRJbmxpbmVTdHlsZShwRGVjbCwgd3NWYWx1ZS5HZXRQdHIoKSwgd3NWYWx1ZS5HZXRMZW5ndGgoKSk7DQorICAgICAgfSBlbHNlIGlmIChkd0F0dHJpSGFzaCA9PSBzX2R3QWxpZ25IYXNoKSB7DQorICAgICAgICBpZiAocERlY2wgPT0gTlVMTCkgew0KKyAgICAgICAgICBwRGVjbCA9IEZERV9OZXdXaXRoKG1fcElubGluZVN0eWxlU3RvcmUpIENGREVfQ1NTRGVjbGFyYXRpb247DQorICAgICAgICB9DQorICAgICAgICBGREVfQ1NTUFJPUEVSVFlBUkdTIGFyZ3M7DQorICAgICAgICBhcmdzLnBTdHJpbmdDYWNoZSA9IE5VTEw7DQorICAgICAgICBhcmdzLnBTdGF0aWNTdG9yZSA9IG1fcElubGluZVN0eWxlU3RvcmU7DQorICAgICAgICBhcmdzLnBQcm9wZXJ0eSA9IEZERV9HZXRDU1NQcm9wZXJ0eUJ5RW51bShGREVfQ1NTUFJPUEVSVFlfVGV4dEFsaWduKTsNCisgICAgICAgIHBEZWNsLT5BZGRQcm9wZXJ0eSgmYXJncywgd3NWYWx1ZS5HZXRQdHIoKSwgd3NWYWx1ZS5HZXRMZW5ndGgoKSk7DQorICAgICAgfQ0KKyAgICB9IHdoaWxlIChwb3MgIT0gTlVMTCk7DQorICAgIGlmIChwRGVjbCAhPSBOVUxMKSB7DQorICAgICAgQ0ZERV9DU1NEZWNsYXJhdGlvbkFycmF5IGRlY2xzOw0KKyAgICAgIGRlY2xzLlNldFNpemUoaURlY2xDb3VudCArIDEpOw0KKyAgICAgIElGREVfQ1NTRGVjbGFyYXRpb24qKiBwcElubGluZSA9IGRlY2xzLkdldERhdGEoKTsNCisgICAgICBGWFNZU19tZW1jcHkocHBJbmxpbmUsIHBwRGVjbEFycmF5LA0KKyAgICAgICAgICAgICAgICAgICBpRGVjbENvdW50ICogc2l6ZW9mKElGREVfQ1NTRGVjbGFyYXRpb24qKSk7DQorICAgICAgcHBJbmxpbmVbaURlY2xDb3VudCsrXSA9IHBEZWNsOw0KKyAgICAgIEFwcGx5RGVjbGFyYXRpb25zKFRSVUUsIChjb25zdCBJRkRFX0NTU0RlY2xhcmF0aW9uKiopcHBJbmxpbmUsIGlEZWNsQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgcERlc3RTdHlsZSk7DQorICAgICAgQXBwbHlEZWNsYXJhdGlvbnMoRkFMU0UsIChjb25zdCBJRkRFX0NTU0RlY2xhcmF0aW9uKiopcHBJbmxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgaURlY2xDb3VudCwgcERlc3RTdHlsZSk7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICB9DQorICBpZiAoaURlY2xDb3VudCA+IDApIHsNCisgICAgRlhTWVNfYXNzZXJ0KHBwRGVjbEFycmF5ICE9IE5VTEwpOw0KKyAgICBBcHBseURlY2xhcmF0aW9ucyhUUlVFLCBwcERlY2xBcnJheSwgaURlY2xDb3VudCwgcERlc3RTdHlsZSk7DQorICAgIEFwcGx5RGVjbGFyYXRpb25zKEZBTFNFLCBwcERlY2xBcnJheSwgaURlY2xDb3VudCwgcERlc3RTdHlsZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpBcHBseURlY2xhcmF0aW9ucygNCisgICAgRlhfQk9PTCBiUHJpb3JpdHksDQorICAgIGNvbnN0IElGREVfQ1NTRGVjbGFyYXRpb24qKiBwcERlY2xBcnJheSwNCisgICAgaW50MzJfdCBpRGVjbENvdW50LA0KKyAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBEZXN0U3R5bGUpIHsNCisgIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcENvbXB1dGVkU3R5bGUgPSAoQ0ZERV9DU1NDb21wdXRlZFN0eWxlKilwRGVzdFN0eWxlOw0KKyAgSUZERV9DU1NWYWx1ZSogcFZhbDsNCisgIEZYX0JPT0wgYkltcG9ydGFudDsNCisgIGludDMyX3QgaTsNCisgIGlmIChiUHJpb3JpdHkpIHsNCisgICAgSUZERV9DU1NWYWx1ZSAqcExhc3Rlc3QgPSBOVUxMLCAqcEltcG9ydGFudCA9IE5VTEw7DQorICAgIGZvciAoaSA9IDA7IGkgPCBpRGVjbENvdW50OyArK2kpIHsNCisgICAgICBwVmFsID0gcHBEZWNsQXJyYXlbaV0tPkdldFByb3BlcnR5KEZERV9DU1NQUk9QRVJUWV9Gb250U2l6ZSwgYkltcG9ydGFudCk7DQorICAgICAgaWYgKHBWYWwgPT0gTlVMTCkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfSBlbHNlIGlmIChiSW1wb3J0YW50KSB7DQorICAgICAgICBwSW1wb3J0YW50ID0gcFZhbDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcExhc3Rlc3QgPSBwVmFsOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAocEltcG9ydGFudCkgew0KKyAgICAgIEFwcGx5UHJvcGVydHkoRkRFX0NTU1BST1BFUlRZX0ZvbnRTaXplLCBwSW1wb3J0YW50LCBwQ29tcHV0ZWRTdHlsZSk7DQorICAgIH0gZWxzZSBpZiAocExhc3Rlc3QpIHsNCisgICAgICBBcHBseVByb3BlcnR5KEZERV9DU1NQUk9QRVJUWV9Gb250U2l6ZSwgcExhc3Rlc3QsIHBDb21wdXRlZFN0eWxlKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ0ZERV9DU1NEZWNsYXJhdGlvbkFycmF5IGltcG9ydGFudHM7DQorICAgIGNvbnN0IElGREVfQ1NTRGVjbGFyYXRpb24qIHBEZWNsID0gTlVMTDsNCisgICAgRkRFX0NTU1BST1BFUlRZIGVQcm9wOw0KKyAgICBGWF9QT1NJVElPTiBwb3M7DQorICAgIGZvciAoaSA9IDA7IGkgPCBpRGVjbENvdW50OyArK2kpIHsNCisgICAgICBwRGVjbCA9IHBwRGVjbEFycmF5W2ldOw0KKyAgICAgIHBvcyA9IHBEZWNsLT5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgICAgd2hpbGUgKHBvcyAhPSBOVUxMKSB7DQorICAgICAgICBwRGVjbC0+R2V0TmV4dFByb3BlcnR5KHBvcywgZVByb3AsIHBWYWwsIGJJbXBvcnRhbnQpOw0KKyAgICAgICAgaWYgKGVQcm9wID09IEZERV9DU1NQUk9QRVJUWV9Gb250U2l6ZSkgew0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0gZWxzZSBpZiAoIWJJbXBvcnRhbnQpIHsNCisgICAgICAgICAgQXBwbHlQcm9wZXJ0eShlUHJvcCwgcFZhbCwgcENvbXB1dGVkU3R5bGUpOw0KKyAgICAgICAgfSBlbHNlIGlmIChpbXBvcnRhbnRzLkdldFNpemUoKSA9PSAwIHx8DQorICAgICAgICAgICAgICAgICAgIGltcG9ydGFudHNbaW1wb3J0YW50cy5HZXRVcHBlckJvdW5kKCldICE9IHBEZWNsKSB7DQorICAgICAgICAgIGltcG9ydGFudHMuQWRkKChJRkRFX0NTU0RlY2xhcmF0aW9uKilwRGVjbCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlEZWNsQ291bnQgPSBpbXBvcnRhbnRzLkdldFNpemUoKTsNCisgICAgZm9yIChpID0gMDsgaSA8IGlEZWNsQ291bnQ7ICsraSkgew0KKyAgICAgIHBEZWNsID0gaW1wb3J0YW50c1tpXTsNCisgICAgICBwb3MgPSBwRGVjbC0+R2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgICAgIHdoaWxlIChwb3MgIT0gTlVMTCkgew0KKyAgICAgICAgcERlY2wtPkdldE5leHRQcm9wZXJ0eShwb3MsIGVQcm9wLCBwVmFsLCBiSW1wb3J0YW50KTsNCisgICAgICAgIGlmIChiSW1wb3J0YW50ICYmIGVQcm9wICE9IEZERV9DU1NQUk9QRVJUWV9Gb250U2l6ZSkgew0KKyAgICAgICAgICBBcHBseVByb3BlcnR5KGVQcm9wLCBwVmFsLCBwQ29tcHV0ZWRTdHlsZSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZSwgd3NWYWx1ZTsNCisgICAgcG9zID0gcERlY2wtPkdldFN0YXJ0Q3VzdG9tKCk7DQorICAgIHdoaWxlIChwb3MpIHsNCisgICAgICBwRGVjbC0+R2V0TmV4dEN1c3RvbShwb3MsIHdzTmFtZSwgd3NWYWx1ZSk7DQorICAgICAgcENvbXB1dGVkU3R5bGUtPkFkZEN1c3RvbVN0eWxlKHdzTmFtZSwgd3NWYWx1ZSk7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OkFwcGVuZElubGluZVN0eWxlKENGREVfQ1NTRGVjbGFyYXRpb24qIHBEZWNsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW4pIHsNCisgIEZYU1lTX2Fzc2VydChwRGVjbCAhPSBOVUxMICYmIHBzeiAhPSBOVUxMICYmIGlMZW4gPiAwKTsNCisgIElGREVfQ1NTU3ludGF4UGFyc2VyKiBwU3ludGF4ID0gSUZERV9DU1NTeW50YXhQYXJzZXI6OkNyZWF0ZSgpOw0KKyAgaWYgKHBTeW50YXggPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAocFN5bnRheC0+SW5pdChwc3osIGlMZW4sIDMyLCBUUlVFKSkgew0KKyAgICBpbnQzMl90IGlMZW47DQorICAgIGNvbnN0IEZYX1dDSEFSKiBwc3o7DQorICAgIEZERV9DU1NQUk9QRVJUWUFSR1MgYXJnczsNCisgICAgYXJncy5wU3RyaW5nQ2FjaGUgPSBOVUxMOw0KKyAgICBhcmdzLnBTdGF0aWNTdG9yZSA9IG1fcElubGluZVN0eWxlU3RvcmU7DQorICAgIGFyZ3MucFByb3BlcnR5ID0gTlVMTDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOw0KKyAgICBmb3IgKDs7KSB7DQorICAgICAgRkRFX0NTU1NZTlRBWFNUQVRVUyBlU3RhdHVzID0gcFN5bnRheC0+RG9TeW50YXhQYXJzZSgpOw0KKyAgICAgIGlmIChlU3RhdHVzID09IEZERV9DU1NTWU5UQVhTVEFUVVNfUHJvcGVydHlOYW1lKSB7DQorICAgICAgICBwc3ogPSBwU3ludGF4LT5HZXRDdXJyZW50U3RyaW5nKGlMZW4pOw0KKyAgICAgICAgYXJncy5wUHJvcGVydHkgPSBGREVfR2V0Q1NTUHJvcGVydHlCeU5hbWUocHN6LCBpTGVuKTsNCisgICAgICAgIGlmIChhcmdzLnBQcm9wZXJ0eSA9PSBOVUxMKSB7DQorICAgICAgICAgIHdzTmFtZSA9IENGWF9XaWRlU3RyaW5nQyhwc3osIGlMZW4pOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSBpZiAoZVN0YXR1cyA9PSBGREVfQ1NTU1lOVEFYU1RBVFVTX1Byb3BlcnR5VmFsdWUpIHsNCisgICAgICAgIGlmIChhcmdzLnBQcm9wZXJ0eSAhPSBOVUxMKSB7DQorICAgICAgICAgIHBzeiA9IHBTeW50YXgtPkdldEN1cnJlbnRTdHJpbmcoaUxlbik7DQorICAgICAgICAgIGlmIChpTGVuID4gMCkgew0KKyAgICAgICAgICAgIHBEZWNsLT5BZGRQcm9wZXJ0eSgmYXJncywgcHN6LCBpTGVuKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChpTGVuID4gMCkgew0KKyAgICAgICAgICBwc3ogPSBwU3ludGF4LT5HZXRDdXJyZW50U3RyaW5nKGlMZW4pOw0KKyAgICAgICAgICBpZiAoaUxlbiA+IDApIHsNCisgICAgICAgICAgICBwRGVjbC0+QWRkUHJvcGVydHkoJmFyZ3MsIHdzTmFtZSwgd3NOYW1lLkdldExlbmd0aCgpLCBwc3osIGlMZW4pOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcFN5bnRheC0+UmVsZWFzZSgpOw0KK30NCisjZGVmaW5lIEZERV9DU1NOT05JTkhFUklUUyAocENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YSkNCisjZGVmaW5lIEZERV9DU1NJTkhFUklUUyAocENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YSkNCisjZGVmaW5lIEZERV9DU1NGT05UU0laRSAoRkRFX0NTU0lOSEVSSVRTLm1fZkZvbnRTaXplKQ0KK3ZvaWQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpBcHBseVByb3BlcnR5KA0KKyAgICBGREVfQ1NTUFJPUEVSVFkgZVByb3BlcnR5LA0KKyAgICBJRkRFX0NTU1ZhbHVlKiBwVmFsdWUsDQorICAgIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcENvbXB1dGVkU3R5bGUpIHsNCisgIGlmIChwVmFsdWUtPkdldFR5cGUoKSA9PSBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSkgew0KKyAgICBJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKiBwUHJpbWl0aXZlID0gKElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqKXBWYWx1ZTsNCisgICAgRkRFX0NTU1BSSU1JVElWRVRZUEUgZVR5cGUgPSBwUHJpbWl0aXZlLT5HZXRQcmltaXRpdmVUeXBlKCk7DQorICAgIHN3aXRjaCAoZVByb3BlcnR5KSB7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfRGlzcGxheToNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VEaXNwbGF5ID0gVG9EaXNwbGF5KHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Gb250U2l6ZTogew0KKyAgICAgICAgRlhfRkxPQVQmIGZGb250U2l6ZSA9IEZERV9DU1NGT05UU0laRTsNCisgICAgICAgIGlmIChlVHlwZSA+PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXIgJiYNCisgICAgICAgICAgICBlVHlwZSA8PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9QQykgew0KKyAgICAgICAgICBmRm9udFNpemUgPSBBcHBseU51bWJlcihlVHlwZSwgcFByaW1pdGl2ZS0+R2V0RmxvYXQoKSwgZkZvbnRTaXplKTsNCisgICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBmRm9udFNpemUgPSBUb0ZvbnRTaXplKHBQcmltaXRpdmUtPkdldEVudW0oKSwgZkZvbnRTaXplKTsNCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0xpbmVIZWlnaHQ6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyKSB7DQorICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2ZMaW5lSGVpZ2h0ID0NCisgICAgICAgICAgICAgIHBQcmltaXRpdmUtPkdldEZsb2F0KCkgKiBGREVfQ1NTRk9OVFNJWkU7DQorICAgICAgICB9IGVsc2UgaWYgKGVUeXBlID4gRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyICYmDQorICAgICAgICAgICAgICAgICAgIGVUeXBlIDw9IEZERV9DU1NQUklNSVRJVkVUWVBFX1BDKSB7DQorICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2ZMaW5lSGVpZ2h0ID0NCisgICAgICAgICAgICAgIEFwcGx5TnVtYmVyKGVUeXBlLCBwUHJpbWl0aXZlLT5HZXRGbG9hdCgpLCBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfVGV4dEFsaWduOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZVRleHRBbGlnaCA9IFRvVGV4dEFsaWduKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9UZXh0SW5kZW50Og0KKyAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU0lOSEVSSVRTLm1fVGV4dEluZGVudCwgZVR5cGUsIHBQcmltaXRpdmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfRm9udFdlaWdodDoNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX3dGb250V2VpZ2h0ID0gVG9Gb250V2VpZ2h0KHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICB9IGVsc2UgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcikgew0KKyAgICAgICAgICBpbnQzMl90IGlWYWx1ZSA9IChpbnQzMl90KXBQcmltaXRpdmUtPkdldEZsb2F0KCkgLyAxMDA7DQorICAgICAgICAgIGlmIChpVmFsdWUgPj0gMSAmJiBpVmFsdWUgPD0gOSkgew0KKyAgICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX3dGb250V2VpZ2h0ID0gaVZhbHVlICogMTAwOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Gb250U3R5bGU6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9lRm9udFN0eWxlID0gVG9Gb250U3R5bGUocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0NvbG9yOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQikgew0KKyAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9kd0ZvbnRDb2xvciA9IHBQcmltaXRpdmUtPkdldFJHQkNvbG9yKCk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9NYXJnaW5MZWZ0Og0KKyAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fYkhhc01hcmdpbiB8PQ0KKyAgICAgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX01hcmdpbldpZHRoLmxlZnQsIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9NYXJnaW5Ub3A6DQorICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9iSGFzTWFyZ2luIHw9DQorICAgICAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fTWFyZ2luV2lkdGgudG9wLCBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfTWFyZ2luUmlnaHQ6DQorICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9iSGFzTWFyZ2luIHw9DQorICAgICAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fTWFyZ2luV2lkdGgucmlnaHQsIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9NYXJnaW5Cb3R0b206DQorICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9iSGFzTWFyZ2luIHw9DQorICAgICAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fTWFyZ2luV2lkdGguYm90dG9tLCBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ0xlZnQ6DQorICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9iSGFzUGFkZGluZyB8PQ0KKyAgICAgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX1BhZGRpbmdXaWR0aC5sZWZ0LCBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ1RvcDoNCisgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2JIYXNQYWRkaW5nIHw9DQorICAgICAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fUGFkZGluZ1dpZHRoLnRvcCwgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1BhZGRpbmdSaWdodDoNCisgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2JIYXNQYWRkaW5nIHw9DQorICAgICAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fUGFkZGluZ1dpZHRoLnJpZ2h0LCBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUGFkZGluZ0JvdHRvbToNCisgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2JIYXNQYWRkaW5nIHw9DQorICAgICAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fUGFkZGluZ1dpZHRoLmJvdHRvbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVHlwZSwgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRXaWR0aDoNCisgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2JIYXNCb3JkZXIgfD0NCisgICAgICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9Cb3JkZXJXaWR0aC5sZWZ0LCBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyVG9wV2lkdGg6DQorICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9iSGFzQm9yZGVyIHw9DQorICAgICAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fQm9yZGVyV2lkdGgudG9wLCBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyUmlnaHRXaWR0aDoNCisgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2JIYXNCb3JkZXIgfD0NCisgICAgICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9Cb3JkZXJXaWR0aC5yaWdodCwgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbVdpZHRoOg0KKyAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fYkhhc0JvcmRlciB8PQ0KKyAgICAgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX0JvcmRlcldpZHRoLmJvdHRvbSwgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRTdHlsZToNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VCRFJMZWZ0U3R5bGUgPQ0KKyAgICAgICAgICAgICAgVG9Cb3JkZXJTdHlsZShwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyVG9wU3R5bGU6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lQkRSVG9wU3R5bGUgPQ0KKyAgICAgICAgICAgICAgVG9Cb3JkZXJTdHlsZShwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyUmlnaHRTdHlsZToNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VCRFJSaWdodFN0eWxlID0NCisgICAgICAgICAgICAgIFRvQm9yZGVyU3R5bGUocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbVN0eWxlOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZUJEUkJvdHRvbVN0eWxlID0NCisgICAgICAgICAgICAgIFRvQm9yZGVyU3R5bGUocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlckxlZnRDb2xvcjoNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9SR0IpIHsNCisgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZHdCRFJMZWZ0Q29sb3IgPSBwUHJpbWl0aXZlLT5HZXRSR0JDb2xvcigpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyVG9wQ29sb3I6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUkdCKSB7DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2R3QkRSVG9wQ29sb3IgPSBwUHJpbWl0aXZlLT5HZXRSR0JDb2xvcigpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQm9yZGVyUmlnaHRDb2xvcjoNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9SR0IpIHsNCisgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZHdCRFJSaWdodENvbG9yID0gcFByaW1pdGl2ZS0+R2V0UkdCQ29sb3IoKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvcmRlckJvdHRvbUNvbG9yOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQikgew0KKyAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9kd0JEUkJvdHRvbUNvbG9yID0gcFByaW1pdGl2ZS0+R2V0UkdCQ29sb3IoKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0xpc3RTdHlsZVR5cGU6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lTGlzdFN0eWxlVHlwZSA9DQorICAgICAgICAgICAgICBUb0xpc3RTdHlsZVR5cGUocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0xpc3RTdHlsZVBvc2l0aW9uOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZUxpc3RTdHlsZVBvc2l0aW9uID0NCisgICAgICAgICAgICAgIFRvTGlzdFN0eWxlUG9zaXRpb24ocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JhY2tncm91bmRDb2xvcjoNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9SR0IpIHsNCisgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZHdCS0dDb2xvciA9IHBQcmltaXRpdmUtPkdldFJHQkNvbG9yKCk7DQorICAgICAgICB9IGVsc2UgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZHdCS0dDb2xvciA9IDA7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9WaXNpYmlsaXR5Og0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZVZpc2liaWxpdHkgPSBUb1Zpc2liaWxpdHkocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1dpZHRoOg0KKyAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fQm94U2l6ZS5jeCwgZVR5cGUsIHBQcmltaXRpdmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfSGVpZ2h0Og0KKyAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fQm94U2l6ZS5jeSwgZVR5cGUsIHBQcmltaXRpdmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfTWluV2lkdGg6DQorICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9NaW5Cb3hTaXplLmN4LCBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9NaW5IZWlnaHQ6DQorICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9NaW5Cb3hTaXplLmN5LCBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9NYXhXaWR0aDoNCisgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX01heEJveFNpemUuY3gsIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX01heEhlaWdodDoNCisgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX01heEJveFNpemUuY3ksIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaW1pdGl2ZSwgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1ZlcnRpY2FsQWxpZ246DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lVmVydGljYWxBbGlnbiA9DQorICAgICAgICAgICAgICBUb1ZlcnRpY2FsQWxpZ24ocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPj0gRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyICYmDQorICAgICAgICAgICAgICAgICAgIGVUeXBlIDw9IEZERV9DU1NQUklNSVRJVkVUWVBFX1BDKSB7DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VWZXJ0aWNhbEFsaWduID0gRkRFX0NTU1ZFUlRJQ0FMQUxJR05fTnVtYmVyOw0KKyAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9mVmVydGljYWxBbGlnbiA9DQorICAgICAgICAgICAgICBBcHBseU51bWJlcihlVHlwZSwgcFByaW1pdGl2ZS0+R2V0RmxvYXQoKSwgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1doaXRlU3BhY2U6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9lV2hpdGVTcGFjZSA9IFRvV2hpdGVTcGFjZShwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfVGV4dFRyYW5zZm9ybToNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2VUZXh0VHJhbnNmb3JtID0NCisgICAgICAgICAgICAgIFRvVGV4dFRyYW5zZm9ybShwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfRm9udFZhcmlhbnQ6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9lRm9udFZhcmlhbnQgPSBUb0ZvbnRWYXJpYW50KHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9MZXR0ZXJTcGFjaW5nOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX1BlcmNlbnQpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9IGVsc2UgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fTGV0dGVyU3BhY2luZy5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfTm9ybWFsKTsNCisgICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPj0gRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyICYmDQorICAgICAgICAgICAgICAgICAgIGVUeXBlIDw9IEZERV9DU1NQUklNSVRJVkVUWVBFX1BDKSB7DQorICAgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NJTkhFUklUUy5tX0xldHRlclNwYWNpbmcsIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpbWl0aXZlLCBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfV29yZFNwYWNpbmc6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUGVyY2VudCkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9Xb3JkU3BhY2luZy5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfTm9ybWFsKTsNCisgICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPj0gRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyICYmDQorICAgICAgICAgICAgICAgICAgIGVUeXBlIDw9IEZERV9DU1NQUklNSVRJVkVUWVBFX1BDKSB7DQorICAgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NJTkhFUklUUy5tX1dvcmRTcGFjaW5nLCBlVHlwZSwgcFByaW1pdGl2ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0Zsb2F0Og0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZUZsb2F0ID0gVG9GbG9hdChwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQ2xlYXI6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lQ2xlYXIgPSBUb0NsZWFyKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Xcml0aW5nTW9kZToNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2VXcml0aW5nTW9kZSA9IFRvV3JpdGluZ01vZGUocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1dvcmRCcmVhazoNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2VXb3JkQnJlYWsgPSBUb1dvcmRCcmVhayhwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfV2lkb3dzOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcikgew0KKyAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9pV2lkb3dzID0gKGludDMyX3QpcFByaW1pdGl2ZS0+R2V0RmxvYXQoKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX09ycGhhbnM6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyKSB7DQorICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2lPcnBoYW5zID0gKGludDMyX3QpcFByaW1pdGl2ZS0+R2V0RmxvYXQoKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1RleHRFbXBoYXNpc0NvbG9yOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgc3dpdGNoIChwUHJpbWl0aXZlLT5HZXRFbnVtKCkpIHsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RyYW5zcGFyZW50Og0KKyAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZHdUZXh0RW1waGFzaXNDb2xvciA9IDA7DQorICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9iVGV4dEVtcGhhc2lzQ29sb3JDdXJyZW50ID0gRkFMU0U7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0N1cnJlbnRjb2xvcjoNCisgICAgICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2JUZXh0RW1waGFzaXNDb2xvckN1cnJlbnQgPSBUUlVFOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX1JHQikgew0KKyAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9kd1RleHRFbXBoYXNpc0NvbG9yID0gcFByaW1pdGl2ZS0+R2V0UkdCQ29sb3IoKTsNCisgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fYlRleHRFbXBoYXNpc0NvbG9yQ3VycmVudCA9IEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUGFnZUJyZWFrQmVmb3JlOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZVBhZ2VCcmVha0JlZm9yZSA9DQorICAgICAgICAgICAgICBUb1BhZ2VCcmVhayhwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUGFnZUJyZWFrQWZ0ZXI6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lUGFnZUJyZWFrQWZ0ZXIgPQ0KKyAgICAgICAgICAgICAgVG9QYWdlQnJlYWsocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1BhZ2VCcmVha0luc2lkZToNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VQYWdlQnJlYWtJbnNpZGUgPQ0KKyAgICAgICAgICAgICAgVG9QYWdlQnJlYWsocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX092ZXJmbG93WDoNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VPdmVyZmxvd1ggPSBUb092ZXJmbG93KHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9PdmVyZmxvd1k6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lT3ZlcmZsb3dZID0gVG9PdmVyZmxvdyhwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfTGluZUJyZWFrOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZUxpbmVCcmVhayA9IFRvTGluZUJyZWFrKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5Db3VudDoNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX0NvbHVtbkNvdW50LlNldChGREVfQ1NTTEVOR1RIVU5JVF9BdXRvKTsNCisgICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfTnVtYmVyKSB7DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX0NvbHVtbkNvdW50LlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmltaXRpdmUtPkdldEZsb2F0KCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQ29sdW1uR2FwOg0KKyAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fQ29sdW1uR2FwLCBlVHlwZSwgcFByaW1pdGl2ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5SdWxlQ29sb3I6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUkdCKSB7DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2R3Q29sdW1uUnVsZUNvbG9yID0gcFByaW1pdGl2ZS0+R2V0UkdCQ29sb3IoKTsNCisgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fYkNvbHVtblJ1bGVDb2xvclNhbWUgPSBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0NvbHVtblJ1bGVTdHlsZToNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VDb2x1bW5SdWxlU3R5bGUgPQ0KKyAgICAgICAgICAgICAgVG9Cb3JkZXJTdHlsZShwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQ29sdW1uUnVsZVdpZHRoOg0KKyAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fQ29sdW1uUnVsZVdpZHRoLCBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Db2x1bW5XaWR0aDoNCisgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX0NvbHVtbldpZHRoLCBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcmltaXRpdmUsIEZERV9DU1NGT05UU0laRSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9CYWNrZ3JvdW5kSW1hZ2U6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9wc3pCS0dJbWFnZSA9IE5VTEw7DQorICAgICAgICB9IGVsc2UgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX1VSSSkgew0KKyAgICAgICAgICBpbnQzMl90IGlMZW5ndGg7DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX3BzekJLR0ltYWdlID0gcFByaW1pdGl2ZS0+R2V0U3RyaW5nKGlMZW5ndGgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUG9zaXRpb246DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lUG9zaXRpb24gPSBUb1Bvc2l0aW9uKHBQcmltaXRpdmUtPkdldEVudW0oKSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Ub3A6DQorICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChGREVfQ1NTTk9OSU5IRVJJVFMubV9Ub3AsIGVUeXBlLCBwUHJpbWl0aXZlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0JvdHRvbToNCisgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX0JvdHRvbSwgZVR5cGUsIHBQcmltaXRpdmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTRk9OVFNJWkUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfTGVmdDoNCisgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NOT05JTkhFUklUUy5tX0xlZnQsIGVUeXBlLCBwUHJpbWl0aXZlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1JpZ2h0Og0KKyAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU05PTklOSEVSSVRTLm1fUmlnaHQsIGVUeXBlLCBwUHJpbWl0aXZlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0ZPTlRTSVpFKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0xpc3RTdHlsZUltYWdlOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fcHN6TGlzdFN0eWxlSW1hZ2UgPSBOVUxMOw0KKyAgICAgICAgfSBlbHNlIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9VUkkpIHsNCisgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoOw0KKyAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9wc3pMaXN0U3R5bGVJbWFnZSA9IHBQcmltaXRpdmUtPkdldFN0cmluZyhpTGVuZ3RoKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0NhcHRpb25TaWRlOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZUNhcHRpb25TaWRlID0gVG9DYXB0aW9uU2lkZShwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQmFja2dyb3VuZFJlcGVhdDoNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2VCS0dSZXBlYXQgPSBUb0JLR1JlcGVhdChwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfQmFja2dyb3VuZEF0dGFjaG1lbnQ6DQorICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bSkgew0KKyAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9lQktHQXR0YWNobWVudCA9DQorICAgICAgICAgICAgICBUb0JLR0F0dGFjaG1lbnQocFByaW1pdGl2ZS0+R2V0RW51bSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX1J1YnlBbGlnbjoNCisgICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX2VSdWJ5QWxpZ24gPSBUb1J1YnlBbGlnbihwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUnVieU92ZXJoYW5nOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZVJ1YnlPdmVyaGFuZyA9DQorICAgICAgICAgICAgICBUb1J1YnlPdmVyaGFuZyhwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUnVieVBvc2l0aW9uOg0KKyAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQUklNSVRJVkVUWVBFX0VudW0pIHsNCisgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZVJ1YnlQb3NpdGlvbiA9DQorICAgICAgICAgICAgICBUb1J1YnlQb3NpdGlvbihwUHJpbWl0aXZlLT5HZXRFbnVtKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfUnVieVNwYW46DQorICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9wUnVieVNwYW4gPSBwUHJpbWl0aXZlOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9IGVsc2UgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpID09IEZERV9DU1NWQUxVRVRZUEVfTGlzdCkgew0KKyAgICBJRkRFX0NTU1ZhbHVlTGlzdCogcExpc3QgPSAoSUZERV9DU1NWYWx1ZUxpc3QqKXBWYWx1ZTsNCisgICAgaW50MzJfdCBpQ291bnQgPSBwTGlzdC0+Q291bnRWYWx1ZXMoKTsNCisgICAgaWYgKGlDb3VudCA+IDApIHsNCisgICAgICBzd2l0Y2ggKGVQcm9wZXJ0eSkgew0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfRm9udEZhbWlseToNCisgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fcEZvbnRGYW1pbHkgPSBwTGlzdDsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9UZXh0RGVjb3JhdGlvbjoNCisgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZHdUZXh0RGVjb3JhdGlvbiA9IFRvVGV4dERlY29yYXRpb24ocExpc3QpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0NvdW50ZXJJbmNyZW1lbnQ6IHsNCisgICAgICAgICAgaWYgKEZERV9DU1NOT05JTkhFUklUUy5tX3BDb3VudGVyU3R5bGUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX3BDb3VudGVyU3R5bGUgPSBuZXcgQ0ZERV9DU1NDb3VudGVyU3R5bGU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fcENvdW50ZXJTdHlsZS0+U2V0Q291bnRlckluY3JlbWVudExpc3QocExpc3QpOw0KKyAgICAgICAgfSBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZX0NvdW50ZXJSZXNldDogew0KKyAgICAgICAgICBpZiAoRkRFX0NTU05PTklOSEVSSVRTLm1fcENvdW50ZXJTdHlsZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fcENvdW50ZXJTdHlsZSA9IG5ldyBDRkRFX0NTU0NvdW50ZXJTdHlsZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9wQ291bnRlclN0eWxlLT5TZXRDb3VudGVyUmVzZXRMaXN0KHBMaXN0KTsNCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9Db250ZW50Og0KKyAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9wQ29udGVudExpc3QgPSBwTGlzdDsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9RdW90ZXM6DQorICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX3BRdW90ZXMgPSBwTGlzdDsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWV9UZXh0Q29tYmluZTogew0KKyAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwTGlzdC0+Q291bnRWYWx1ZXMoKTsgaSsrKSB7DQorICAgICAgICAgICAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSogcFZhbCA9DQorICAgICAgICAgICAgICAgIChJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKilwTGlzdC0+R2V0VmFsdWUoaSk7DQorICAgICAgICAgICAgc3dpdGNoIChwVmFsLT5HZXRQcmltaXRpdmVUeXBlKCkpIHsNCisgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bTogew0KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHBWYWwtPkdldEVudW0oKSkgew0KKyAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZTogew0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZVRleHRDb21iaW5lID0gRkRFX0NTU1RFWFRDT01CSU5FX05vbmU7DQorICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTk9OSU5IRVJJVFMubV9iSGFzVGV4dENvbWJpbmVOdW1iZXIgPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSG9yaXpvbnRhbDogew0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0NTU05PTklOSEVSSVRTLm1fZVRleHRDb21iaW5lID0NCisgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTVEVYVENPTUJJTkVfSG9yaXpvbnRhbDsNCisgICAgICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2JIYXNUZXh0Q29tYmluZU51bWJlciA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICAgIH0gYnJlYWs7DQorICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9OdW1iZXI6DQorICAgICAgICAgICAgICAgIEZERV9DU1NOT05JTkhFUklUUy5tX2ZUZXh0Q29tYmluZU51bWJlciA9IHBWYWwtPkdldEZsb2F0KCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlfVGV4dEVtcGhhc2lzU3R5bGU6IHsNCisgICAgICAgICAgRkRFX0NTU1RFWFRFTVBIQVNJU0ZJTEwgZUZpbGw7DQorICAgICAgICAgIEZERV9DU1NURVhURU1QSEFTSVNNQVJLIGVNYXJrOw0KKyAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwTGlzdC0+Q291bnRWYWx1ZXMoKTsgaSsrKSB7DQorICAgICAgICAgICAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSogcFZhbCA9DQorICAgICAgICAgICAgICAgIChJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKilwTGlzdC0+R2V0VmFsdWUoaSk7DQorICAgICAgICAgICAgc3dpdGNoIChwVmFsLT5HZXRQcmltaXRpdmVUeXBlKCkpIHsNCisgICAgICAgICAgICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfRW51bTogew0KKyAgICAgICAgICAgICAgICBpZiAoVG9UZXh0RW1waGFzaXNGaWxsKHBWYWwtPkdldEVudW0oKSwgZUZpbGwpKSB7DQorICAgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZVRleHRFbXBoYXNpc0ZpbGwgPSBlRmlsbDsNCisgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChUb1RleHRFbXBoYXNpc01hcmsocFZhbC0+R2V0RW51bSgpLCBlTWFyaykpIHsNCisgICAgICAgICAgICAgICAgICBGREVfQ1NTSU5IRVJJVFMubV9lVGV4dEVtcGhhc2lzTWFyayA9IGVNYXJrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgICAgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9TdHJpbmc6IHsNCisgICAgICAgICAgICAgICAgRkRFX0NTU0lOSEVSSVRTLm1fZVRleHRFbXBoYXNpc01hcmsgPQ0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1RFWFRFTVBIQVNJU01BUktfQ3VzdG9tOw0KKyAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW47DQorICAgICAgICAgICAgICAgIEZERV9DU1NJTkhFUklUUy5tX3BzelRleHRFbXBoYXNpc0N1c3RvbU1hcmsgPQ0KKyAgICAgICAgICAgICAgICAgICAgcFZhbC0+R2V0U3RyaW5nKGlMZW4pOw0KKyAgICAgICAgICAgICAgfSBicmVhazsNCisgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCisgIH0NCit9DQorRlhfRkxPQVQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpBcHBseU51bWJlcihGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVW5pdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZXJjZW50QmFzZSkgew0KKyAgc3dpdGNoIChlVW5pdCkgew0KKyAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX1BYOg0KKyAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlcjoNCisgICAgICByZXR1cm4gZlZhbHVlICogNzIgLyA5NjsNCisgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9QVDoNCisgICAgICByZXR1cm4gZlZhbHVlOw0KKyAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX0VNUzoNCisgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FWFM6DQorICAgICAgcmV0dXJuIGZWYWx1ZSAqIGZQZXJjZW50QmFzZTsNCisgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9QZXJjZW50Og0KKyAgICAgIHJldHVybiBmVmFsdWUgKiBmUGVyY2VudEJhc2UgLyAxMDAuMGY7DQorICAgIGNhc2UgRkRFX0NTU1BSSU1JVElWRVRZUEVfQ006DQorICAgICAgcmV0dXJuIGZWYWx1ZSAqIDI4LjM0NjRmOw0KKyAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX01NOg0KKyAgICAgIHJldHVybiBmVmFsdWUgKiAyLjgzNDZmOw0KKyAgICBjYXNlIEZERV9DU1NQUklNSVRJVkVUWVBFX0lOOg0KKyAgICAgIHJldHVybiBmVmFsdWUgKiA3Mi4wZjsNCisgICAgY2FzZSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9QQzoNCisgICAgICByZXR1cm4gZlZhbHVlIC8gMTIuMGY7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIGZWYWx1ZTsNCisgIH0NCit9DQorRkRFX0NTU1JVQllTUEFOIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9SdWJ5U3BhbihGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpIHsNCisgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZToNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkRFX0NTU1JVQllTUEFOX05vbmU7DQorICB9DQorfQ0KK0ZERV9DU1NSVUJZUE9TSVRJT04gQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb1J1YnlQb3NpdGlvbigNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0JlZm9yZToNCisgICAgICByZXR1cm4gRkRFX0NTU1JVQllQT1NJVElPTl9CZWZvcmU7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQWZ0ZXI6DQorICAgICAgcmV0dXJuIEZERV9DU1NSVUJZUE9TSVRJT05fQWZ0ZXI7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmlnaHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NSVUJZUE9TSVRJT05fUmlnaHQ7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSW5saW5lOg0KKyAgICAgIHJldHVybiBGREVfQ1NTUlVCWVBPU0lUSU9OX0lubGluZTsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkRFX0NTU1JVQllQT1NJVElPTl9CZWZvcmU7DQorICB9DQorfQ0KK0ZERV9DU1NSVUJZT1ZFUkhBTkcgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb1J1YnlPdmVyaGFuZygNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0F1dG86DQorICAgICAgcmV0dXJuIEZERV9DU1NSVUJZT1ZFUkhBTkdfQXV0bzsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TdGFydDoNCisgICAgICByZXR1cm4gRkRFX0NTU1JVQllPVkVSSEFOR19TdGFydDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9FbmQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NSVUJZT1ZFUkhBTkdfRW5kOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmU6DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NSVUJZT1ZFUkhBTkdfTm9uZTsNCisgIH0NCit9DQorRkRFX0NTU1JVQllBTElHTiBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvUnVieUFsaWduKA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpIHsNCisgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQXV0bzoNCisgICAgICByZXR1cm4gRkRFX0NTU1JVQllBTElHTl9BdXRvOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1N0YXJ0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTUlVCWUFMSUdOX1N0YXJ0Ow0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xlZnQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NSVUJZQUxJR05fRW5kOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0NlbnRlcjoNCisgICAgICByZXR1cm4gRkRFX0NTU1JVQllBTElHTl9DZW50ZXI7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRW5kOg0KKyAgICAgIHJldHVybiBGREVfQ1NTUlVCWUFMSUdOX0VuZDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SaWdodDoNCisgICAgICByZXR1cm4gRkRFX0NTU1JVQllBTElHTl9SaWdodDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EaXN0cmlidXRlTGV0dGVyOg0KKyAgICAgIHJldHVybiBGREVfQ1NTUlVCWUFMSUdOX0Rpc3RyaWJ1dGVMZXR0ZXI7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRGlzdHJpYnV0ZVNwYWNlOg0KKyAgICAgIHJldHVybiBGREVfQ1NTUlVCWUFMSUdOX0Rpc3RyaWJ1dGVTcGFjZTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MaW5lRWRnZToNCisgICAgICByZXR1cm4gRkRFX0NTU1JVQllBTElHTl9MaW5lRWRnZTsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkRFX0NTU1JVQllBTElHTl9BdXRvOw0KKyAgfQ0KK30NCitGWF9CT09MIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9UZXh0RW1waGFzaXNNYXJrKA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUsDQorICAgIEZERV9DU1NURVhURU1QSEFTSVNNQVJLJiBlTWFyaykgew0KKyAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lOg0KKyAgICAgIGVNYXJrID0gRkRFX0NTU1RFWFRFTVBIQVNJU01BUktfTm9uZTsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Eb3Q6DQorICAgICAgZU1hcmsgPSBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSS19Eb3Q7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ2lyY2xlOg0KKyAgICAgIGVNYXJrID0gRkRFX0NTU1RFWFRFTVBIQVNJU01BUktfQ2lyY2xlOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0RvdWJsZUNpcmNsZToNCisgICAgICBlTWFyayA9IEZERV9DU1NURVhURU1QSEFTSVNNQVJLX0RvdWJsZUNpcmNsZTsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UcmlhbmdsZToNCisgICAgICBlTWFyayA9IEZERV9DU1NURVhURU1QSEFTSVNNQVJLX1RyaWFuZ2xlOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1Nlc2FtZToNCisgICAgICBlTWFyayA9IEZERV9DU1NURVhURU1QSEFTSVNNQVJLX1Nlc2FtZTsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkFMU0U7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb1RleHRFbXBoYXNpc0ZpbGwoDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSwNCisgICAgRkRFX0NTU1RFWFRFTVBIQVNJU0ZJTEwmIGVGaWxsKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0ZpbGxlZDoNCisgICAgICBlRmlsbCA9IEZERV9DU1NURVhURU1QSEFTSVNGSUxMX0ZpbGxlZDsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9PcGVuOg0KKyAgICAgIGVGaWxsID0gRkRFX0NTU1RFWFRFTVBIQVNJU0ZJTExfT3BlbjsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkFMU0U7DQorICB9DQorfQ0KK0ZERV9DU1NCS0dBVFRBQ0hNRU5UIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9CS0dBdHRhY2htZW50KA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpIHsNCisgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRml4ZWQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NCS0dBVFRBQ0hNRU5UX0ZpeGVkOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1Njcm9sbDoNCisgICAgICByZXR1cm4gRkRFX0NTU0JLR0FUVEFDSE1FTlRfU2Nyb2xsOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTQktHQVRUQUNITUVOVF9GaXhlZDsNCisgIH0NCit9DQorRkRFX0NTU0NBUFRJT05TSURFIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9DYXB0aW9uU2lkZSgNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RvcDoNCisgICAgICByZXR1cm4gRkRFX0NTU0NBUFRJT05TSURFX1RvcDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb3R0b206DQorICAgICAgcmV0dXJuIEZERV9DU1NDQVBUSU9OU0lERV9Cb3R0b207DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGVmdDoNCisgICAgICByZXR1cm4gRkRFX0NTU0NBUFRJT05TSURFX0xlZnQ7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmlnaHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NDQVBUSU9OU0lERV9SaWdodDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9CZWZvcmU6DQorICAgICAgcmV0dXJuIEZERV9DU1NDQVBUSU9OU0lERV9CZWZvcmU7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQWZ0ZXI6DQorICAgICAgcmV0dXJuIEZERV9DU1NDQVBUSU9OU0lERV9BZnRlcjsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkRFX0NTU0NBUFRJT05TSURFX1RvcDsNCisgIH0NCit9DQorRkRFX0NTU1BPU0lUSU9OIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9Qb3NpdGlvbihGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpIHsNCisgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3RhdGljOg0KKyAgICAgIHJldHVybiBGREVfQ1NTUE9TSVRJT05fU3RhdGljOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JlbGF0aXZlOg0KKyAgICAgIHJldHVybiBGREVfQ1NTUE9TSVRJT05fUmVsYXRpdmU7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRml4ZWQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NQT1NJVElPTl9GaXhlZDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9BYnNvbHV0ZToNCisgICAgICByZXR1cm4gRkRFX0NTU1BPU0lUSU9OX0Fic29sdXRlOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTUE9TSVRJT05fU3RhdGljOw0KKyAgfQ0KK30NCitGREVfQ1NTQ1VSU09SIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9DdXJzb3IoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0F1dG86DQorICAgICAgcmV0dXJuIEZERV9DU1NDVVJTT1JfQXV0bzsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Dcm9zc2hhaXI6DQorICAgICAgcmV0dXJuIEZERV9DU1NDVVJTT1JfQ3Jvc3NoYWlyOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0RlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NDVVJTT1JfRGVmYXVsdDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Qb2ludGVyOg0KKyAgICAgIHJldHVybiBGREVfQ1NTQ1VSU09SX1BvaW50ZXI7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTW92ZToNCisgICAgICByZXR1cm4gRkRFX0NTU0NVUlNPUl9Nb3ZlOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0VSZXNpemU6DQorICAgICAgcmV0dXJuIEZERV9DU1NDVVJTT1JfRVJlc2l6ZTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9OZVJlc2l6ZToNCisgICAgICByZXR1cm4gRkRFX0NTU0NVUlNPUl9OZVJlc2l6ZTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Od1Jlc2l6ZToNCisgICAgICByZXR1cm4gRkRFX0NTU0NVUlNPUl9Od1Jlc2l6ZTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9OUmVzaXplOg0KKyAgICAgIHJldHVybiBGREVfQ1NTQ1VSU09SX05SZXNpemU7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU2VSZXNpemU6DQorICAgICAgcmV0dXJuIEZERV9DU1NDVVJTT1JfU2VSZXNpemU7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3dSZXNpemU6DQorICAgICAgcmV0dXJuIEZERV9DU1NDVVJTT1JfU3dSZXNpemU7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NDVVJTT1JfQXV0bzsNCisgIH0NCit9DQorRkRFX0NTU0JLR1JFUEVBVCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvQktHUmVwZWF0KA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpIHsNCisgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmVwZWF0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTQktHUkVQRUFUX1JlcGVhdDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SZXBlYXRYOg0KKyAgICAgIHJldHVybiBGREVfQ1NTQktHUkVQRUFUX1JlcGVhdFg7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmVwZWF0WToNCisgICAgICByZXR1cm4gRkRFX0NTU0JLR1JFUEVBVF9SZXBlYXRZOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vUmVwZWF0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTQktHUkVQRUFUX05vUmVwZWF0Ow0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTQktHUkVQRUFUX1JlcGVhdDsNCisgIH0NCit9DQorRkRFX0NTU1RFWFRDT01CSU5FIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9UZXh0Q29tYmluZSgNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0hvcml6b250YWw6DQorICAgICAgcmV0dXJuIEZERV9DU1NURVhUQ09NQklORV9Ib3Jpem9udGFsOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmU6DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NURVhUQ09NQklORV9Ob25lOw0KKyAgfQ0KK30NCitGREVfQ1NTTElORUJSRUFLIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9MaW5lQnJlYWsoDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkgew0KKyAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9BdXRvOg0KKyAgICAgIHJldHVybiBGREVfQ1NTTElORUJSRUFLX0F1dG87DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG9vc2U6DQorICAgICAgcmV0dXJuIEZERV9DU1NMSU5FQlJFQUtfTG9vc2U7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9ybWFsOg0KKyAgICAgIHJldHVybiBGREVfQ1NTTElORUJSRUFLX05vcm1hbDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TdHJpY3Q6DQorICAgICAgcmV0dXJuIEZERV9DU1NMSU5FQlJFQUtfU3RyaWN0Ow0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTTElORUJSRUFLX0F1dG87DQorICB9DQorfQ0KK0ZERV9DU1NPVkVSRkxPVyBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvT3ZlcmZsb3coRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1Zpc2libGU6DQorICAgICAgcmV0dXJuIEZERV9DU1NPVkVSRkxPV19WaXNpYmxlOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0hpZGRlbjoNCisgICAgICByZXR1cm4gRkRFX0NTU09WRVJGTE9XX0hpZGRlbjsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TY3JvbGw6DQorICAgICAgcmV0dXJuIEZERV9DU1NPVkVSRkxPV19TY3JvbGw7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQXV0bzoNCisgICAgICByZXR1cm4gRkRFX0NTU09WRVJGTE9XX0F1dG87DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9EaXNwbGF5Og0KKyAgICAgIHJldHVybiBGREVfQ1NTT1ZFUkZMT1dfTm9EaXNwbGF5Ow0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vQ29udGVudDoNCisgICAgICByZXR1cm4gRkRFX0NTU09WRVJGTE9XX05vQ29udGVudDsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkRFX0NTU09WRVJGTE9XX1Zpc2libGU7DQorICB9DQorfQ0KK0ZERV9DU1NXUklUSU5HTU9ERSBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvV3JpdGluZ01vZGUoDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkgew0KKyAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ib3Jpem9udGFsVGI6DQorICAgICAgcmV0dXJuIEZERV9DU1NXUklUSU5HTU9ERV9Ib3Jpem9udGFsVGI7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVmVydGljYWxSbDoNCisgICAgICByZXR1cm4gRkRFX0NTU1dSSVRJTkdNT0RFX1ZlcnRpY2FsUmw7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVmVydGljYWxMcjoNCisgICAgICByZXR1cm4gRkRFX0NTU1dSSVRJTkdNT0RFX1ZlcnRpY2FsTHI7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NXUklUSU5HTU9ERV9Ib3Jpem9udGFsVGI7DQorICB9DQorfQ0KK0ZERV9DU1NXT1JEQlJFQUsgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb1dvcmRCcmVhaygNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vcm1hbDoNCisgICAgICByZXR1cm4gRkRFX0NTU1dPUkRCUkVBS19Ob3JtYWw7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfS2VlcEFsbDoNCisgICAgICByZXR1cm4gRkRFX0NTU1dPUkRCUkVBS19LZWVwQWxsOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0JyZWFrQWxsOg0KKyAgICAgIHJldHVybiBGREVfQ1NTV09SREJSRUFLX0JyZWFrQWxsOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0tlZXBXb3JkczoNCisgICAgICByZXR1cm4gRkRFX0NTU1dPUkRCUkVBS19LZWVwV29yZHM7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NXT1JEQlJFQUtfTm9ybWFsOw0KKyAgfQ0KK30NCitGREVfQ1NTRkxPQVQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb0Zsb2F0KEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkgew0KKyAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MZWZ0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTRkxPQVRfTGVmdDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SaWdodDoNCisgICAgICByZXR1cm4gRkRFX0NTU0ZMT0FUX1JpZ2h0Ow0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmU6DQorICAgICAgcmV0dXJuIEZERV9DU1NGTE9BVF9Ob25lOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTRkxPQVRfTm9uZTsNCisgIH0NCit9DQorRkRFX0NTU0NMRUFSIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9DbGVhcihGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpIHsNCisgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZToNCisgICAgICByZXR1cm4gRkRFX0NTU0NMRUFSX05vbmU7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGVmdDoNCisgICAgICByZXR1cm4gRkRFX0NTU0NMRUFSX0xlZnQ7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUmlnaHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NDTEVBUl9SaWdodDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb3RoOg0KKyAgICAgIHJldHVybiBGREVfQ1NTQ0xFQVJfQm90aDsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkRFX0NTU0NMRUFSX05vbmU7DQorICB9DQorfQ0KK0ZERV9DU1NQQUdFQlJFQUsgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb1BhZ2VCcmVhaygNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0F2b2lkOg0KKyAgICAgIHJldHVybiBGREVfQ1NTUEFHRUJSRUFLX0F2b2lkOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0F1dG86DQorICAgICAgcmV0dXJuIEZERV9DU1NQQUdFQlJFQUtfQXV0bzsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9BbHdheXM6DQorICAgICAgcmV0dXJuIEZERV9DU1NQQUdFQlJFQUtfQWx3YXlzOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xlZnQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NQQUdFQlJFQUtfTGVmdDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SaWdodDoNCisgICAgICByZXR1cm4gRkRFX0NTU1BBR0VCUkVBS19SaWdodDsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkRFX0NTU1BBR0VCUkVBS19BdXRvOw0KKyAgfQ0KK30NCitGREVfQ1NTRElTUExBWSBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvRGlzcGxheShGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpIHsNCisgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSW5saW5lOg0KKyAgICAgIHJldHVybiBGREVfQ1NTRElTUExBWV9JbmxpbmU7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQmxvY2s6DQorICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX0Jsb2NrOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmU6DQorICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX05vbmU7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTGlzdEl0ZW06DQorICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX0xpc3RJdGVtOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlQ2VsbDoNCisgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfVGFibGVDZWxsOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlUm93Og0KKyAgICAgIHJldHVybiBGREVfQ1NTRElTUExBWV9UYWJsZVJvdzsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZToNCisgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfVGFibGU7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVDYXB0aW9uOg0KKyAgICAgIHJldHVybiBGREVfQ1NTRElTUExBWV9UYWJsZUNhcHRpb247DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVSb3dHcm91cDoNCisgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfVGFibGVSb3dHcm91cDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZUhlYWRlckdyb3VwOg0KKyAgICAgIHJldHVybiBGREVfQ1NTRElTUExBWV9UYWJsZUhlYWRlckdyb3VwOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1RhYmxlRm9vdGVyR3JvdXA6DQorICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX1RhYmxlRm9vdGVyR3JvdXA7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGFibGVDb2x1bW5Hcm91cDoNCisgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfVGFibGVDb2x1bW5Hcm91cDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UYWJsZUNvbHVtbjoNCisgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfVGFibGVDb2x1bW47DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSW5saW5lVGFibGU6DQorICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX0lubGluZVRhYmxlOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0lubGluZUJsb2NrOg0KKyAgICAgIHJldHVybiBGREVfQ1NTRElTUExBWV9JbmxpbmVCbG9jazsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdW5JbjoNCisgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfUnVuSW47DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUnVieToNCisgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfUnVieTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SdWJ5QmFzZToNCisgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfUnVieUJhc2U7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUnVieVRleHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NESVNQTEFZX1J1YnlUZXh0Ow0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1J1YnlCYXNlR3JvdXA6DQorICAgICAgcmV0dXJuIEZERV9DU1NESVNQTFNZX1J1YnlCYXNlR3JvdXA7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUnVieVRleHRHcm91cDoNCisgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfUnVieVRleHRHcm91cDsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkRFX0NTU0RJU1BMQVlfSW5saW5lOw0KKyAgfQ0KK30NCitGREVfQ1NTVEVYVEFMSUdOIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9UZXh0QWxpZ24oDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkgew0KKyAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MZWZ0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTVEVYVEFMSUdOX0xlZnQ7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ2VudGVyOg0KKyAgICAgIHJldHVybiBGREVfQ1NTVEVYVEFMSUdOX0NlbnRlcjsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9SaWdodDoNCisgICAgICByZXR1cm4gRkRFX0NTU1RFWFRBTElHTl9SaWdodDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9KdXN0aWZ5Og0KKyAgICAgIHJldHVybiBGREVfQ1NTVEVYVEFMSUdOX0p1c3RpZnk7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NURVhUQUxJR05fTGVmdDsNCisgIH0NCit9DQorRlhfV09SRCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvRm9udFdlaWdodChGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpIHsNCisgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9ybWFsOg0KKyAgICAgIHJldHVybiA0MDA7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQm9sZDoNCisgICAgICByZXR1cm4gNzAwOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0JvbGRlcjoNCisgICAgICByZXR1cm4gOTAwOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xpZ2h0ZXI6DQorICAgICAgcmV0dXJuIDIwMDsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gNDAwOw0KKyAgfQ0KK30NCitGREVfQ1NTRk9OVFNUWUxFIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9Gb250U3R5bGUoDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkgew0KKyAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9JdGFsaWM6DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfT2JsaXF1ZToNCisgICAgICByZXR1cm4gRkRFX0NTU0ZPTlRTVFlMRV9JdGFsaWM7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NGT05UU1RZTEVfTm9ybWFsOw0KKyAgfQ0KK30NCitGREVfQ1NTQk9SREVSU1RZTEUgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb0JvcmRlclN0eWxlKA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpIHsNCisgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTm9uZToNCisgICAgICByZXR1cm4gRkRFX0NTU0JPUkRFUlNUWUxFX05vbmU7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU29saWQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NCT1JERVJTVFlMRV9Tb2xpZDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9IaWRkZW46DQorICAgICAgcmV0dXJuIEZERV9DU1NCT1JERVJTVFlMRV9IaWRkZW47DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRG90dGVkOg0KKyAgICAgIHJldHVybiBGREVfQ1NTQk9SREVSU1RZTEVfRG90dGVkOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Rhc2hlZDoNCisgICAgICByZXR1cm4gRkRFX0NTU0JPUkRFUlNUWUxFX0Rhc2hlZDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Eb3VibGU6DQorICAgICAgcmV0dXJuIEZERV9DU1NCT1JERVJTVFlMRV9Eb3VibGU7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfR3Jvb3ZlOg0KKyAgICAgIHJldHVybiBGREVfQ1NTQk9SREVSU1RZTEVfR3Jvb3ZlOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1JpZGdlOg0KKyAgICAgIHJldHVybiBGREVfQ1NTQk9SREVSU1RZTEVfUmlkZ2U7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSW5zZXQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NCT1JERVJTVFlMRV9JbnNldDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9PdXRzZXQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NCT1JERVJTVFlMRV9vdXRzZXQ7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZERV9DU1NCT1JERVJTVFlMRV9Ob25lOw0KKyAgfQ0KK30NCitGWF9CT09MIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6U2V0TGVuZ3RoV2l0aFBlcmNlbnQoDQorICAgIEZERV9DU1NMRU5HVEgmIHdpZHRoLA0KKyAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVHlwZSwNCisgICAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSogcFByaW1pdGl2ZSwNCisgICAgRlhfRkxPQVQgZkZvbnRTaXplKSB7DQorICBpZiAoZVR5cGUgPT0gRkRFX0NTU1BSSU1JVElWRVRZUEVfUGVyY2VudCkgew0KKyAgICB3aWR0aC5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfUGVyY2VudCwgcFByaW1pdGl2ZS0+R2V0RmxvYXQoKSAvIDEwMC4wZik7DQorICAgIHJldHVybiB3aWR0aC5Ob25aZXJvKCk7DQorICB9IGVsc2UgaWYgKGVUeXBlID49IEZERV9DU1NQUklNSVRJVkVUWVBFX051bWJlciAmJg0KKyAgICAgICAgICAgICBlVHlwZSA8PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9QQykgew0KKyAgICBGWF9GTE9BVCBmVmFsdWUgPSBBcHBseU51bWJlcihlVHlwZSwgcFByaW1pdGl2ZS0+R2V0RmxvYXQoKSwgZkZvbnRTaXplKTsNCisgICAgd2lkdGguU2V0KEZERV9DU1NMRU5HVEhVTklUX1BvaW50LCBmVmFsdWUpOw0KKyAgICByZXR1cm4gd2lkdGguTm9uWmVybygpOw0KKyAgfSBlbHNlIGlmIChlVHlwZSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgIHN3aXRjaCAocFByaW1pdGl2ZS0+R2V0RW51bSgpKSB7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9BdXRvOg0KKyAgICAgICAgd2lkdGguU2V0KEZERV9DU1NMRU5HVEhVTklUX0F1dG8pOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lOg0KKyAgICAgICAgd2lkdGguU2V0KEZERV9DU1NMRU5HVEhVTklUX05vbmUpOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UaGluOg0KKyAgICAgICAgd2lkdGguU2V0KEZERV9DU1NMRU5HVEhVTklUX1BvaW50LCAyKTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTWVkaXVtOg0KKyAgICAgICAgd2lkdGguU2V0KEZERV9DU1NMRU5HVEhVTklUX1BvaW50LCAzKTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGhpY2s6DQorICAgICAgICB3aWR0aC5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfUG9pbnQsIDQpOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9GTE9BVCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvRm9udFNpemUoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ3VyRm9udFNpemUpIHsNCisgIHN3aXRjaCAoZVZhbHVlKSB7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfWHhTbWFsbDoNCisgICAgICByZXR1cm4gbV9mRGVmRm9udFNpemUgLyAxLjJmIC8gMS4yZiAvIDEuMmY7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfWFNtYWxsOg0KKyAgICAgIHJldHVybiBtX2ZEZWZGb250U2l6ZSAvIDEuMmYgLyAxLjJmOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1NtYWxsOg0KKyAgICAgIHJldHVybiBtX2ZEZWZGb250U2l6ZSAvIDEuMmY7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTWVkaXVtOg0KKyAgICAgIHJldHVybiBtX2ZEZWZGb250U2l6ZTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MYXJnZToNCisgICAgICByZXR1cm4gbV9mRGVmRm9udFNpemUgKiAxLjJmOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1hMYXJnZToNCisgICAgICByZXR1cm4gbV9mRGVmRm9udFNpemUgKiAxLjJmICogMS4yZjsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9YeExhcmdlOg0KKyAgICAgIHJldHVybiBtX2ZEZWZGb250U2l6ZSAqIDEuMmYgKiAxLjJmICogMS4yZjsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9MYXJnZXI6DQorICAgICAgcmV0dXJuIGZDdXJGb250U2l6ZSAqIDEuMmY7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU21hbGxlcjoNCisgICAgICByZXR1cm4gZkN1ckZvbnRTaXplIC8gMS4yZjsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gZkN1ckZvbnRTaXplOw0KKyAgfQ0KK30NCitGREVfQ1NTVkVSVElDQUxBTElHTiBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvVmVydGljYWxBbGlnbigNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Jhc2VsaW5lOg0KKyAgICAgIHJldHVybiBGREVfQ1NTVkVSVElDQUxBTElHTl9CYXNlbGluZTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9NaWRkbGU6DQorICAgICAgcmV0dXJuIEZERV9DU1NWRVJUSUNBTEFMSUdOX01pZGRsZTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Cb3R0b206DQorICAgICAgcmV0dXJuIEZERV9DU1NWRVJUSUNBTEFMSUdOX0JvdHRvbTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9TdXBlcjoNCisgICAgICByZXR1cm4gRkRFX0NTU1ZFUlRJQ0FMQUxJR05fU3VwZXI7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3ViOg0KKyAgICAgIHJldHVybiBGREVfQ1NTVkVSVElDQUxBTElHTl9TdWI7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVG9wOg0KKyAgICAgIHJldHVybiBGREVfQ1NTVkVSVElDQUxBTElHTl9Ub3A7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVGV4dFRvcDoNCisgICAgICByZXR1cm4gRkRFX0NTU1ZFUlRJQ0FMQUxJR05fVGV4dFRvcDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9UZXh0Qm90dG9tOg0KKyAgICAgIHJldHVybiBGREVfQ1NTVkVSVElDQUxBTElHTl9UZXh0Qm90dG9tOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTVkVSVElDQUxBTElHTl9CYXNlbGluZTsNCisgIH0NCit9DQorRkRFX0NTU0xJU1RTVFlMRVRZUEUgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb0xpc3RTdHlsZVR5cGUoDQorICAgIEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSkgew0KKyAgc3dpdGNoIChlVmFsdWUpIHsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Ob25lOg0KKyAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9Ob25lOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0Rpc2M6DQorICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX0Rpc2M7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ2lyY2xlOg0KKyAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9DaXJjbGU7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfU3F1YXJlOg0KKyAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9TcXVhcmU7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfRGVjaW1hbDoNCisgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfRGVjaW1hbDsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9EZWNpbWFsTGVhZGluZ1plcm86DQorICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX0RlY2ltYWxMZWFkaW5nWmVybzsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Mb3dlclJvbWFuOg0KKyAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9Mb3dlclJvbWFuOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1VwcGVyUm9tYW46DQorICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX1VwcGVyUm9tYW47DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfTG93ZXJHcmVlazoNCisgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfTG93ZXJHcmVlazsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Mb3dlckxhdGluOg0KKyAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9Mb3dlckxhdGluOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1VwcGVyTGF0aW46DQorICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX1VwcGVyTGF0aW47DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQXJtZW5pYW46DQorICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX0FybWVuaWFuOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0dlb3JnaWFuOg0KKyAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9HZW9yZ2lhbjsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Mb3dlckFscGhhOg0KKyAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9Mb3dlckFscGhhOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1VwcGVyQWxwaGE6DQorICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX1VwcGVyQWxwaGE7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ2prSWRlb2dyYXBoaWM6DQorICAgICAgcmV0dXJuIEZERV9DU1NMSVNUU1RZTEVUWVBFX0Nqa0lkZW9ncmFwaGljOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0hlYnJldzoNCisgICAgICByZXR1cm4gRkRFX0NTU0xJU1RTVFlMRVRZUEVfSGVicmV3Ow0KKyAgICBjYXNlIEZERV9DU1NMSVNUU1RZTEVUWVBFX0hpcmFnYW5hOg0KKyAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9IaXJhZ2FuYTsNCisgICAgY2FzZSBGREVfQ1NTTElTVFNUWUxFVFlQRV9IaXJhZ2FuYUlyb2hhOg0KKyAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9IaXJhZ2FuYUlyb2hhOw0KKyAgICBjYXNlIEZERV9DU1NMSVNUU1RZTEVUWVBFX0thdGFrYW5hOg0KKyAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9LYXRha2FuYTsNCisgICAgY2FzZSBGREVfQ1NTTElTVFNUWUxFVFlQRV9LYXRha2FuYUlyb2hhOg0KKyAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9LYXRha2FuYUlyb2hhOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTTElTVFNUWUxFVFlQRV9EaXNjOw0KKyAgfQ0KK30NCitGREVfQ1NTTElTVFNUWUxFUE9TSVRJT04gQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb0xpc3RTdHlsZVBvc2l0aW9uKA0KKyAgICBGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpIHsNCisgIHJldHVybiBlVmFsdWUgPT0gRkRFX0NTU1BST1BFUlRZVkFMVUVfSW5zaWRlDQorICAgICAgICAgICAgID8gRkRFX0NTU0xJU1RTVFlMRVBPU0lUSU9OX0luc2lkZQ0KKyAgICAgICAgICAgICA6IEZERV9DU1NMSVNUU1RZTEVQT1NJVElPTl9PdXRzaWRlOw0KK30NCitGREVfQ1NTVklTSUJJTElUWSBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvVmlzaWJpbGl0eSgNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1Zpc2libGU6DQorICAgICAgcmV0dXJuIEZERV9DU1NWSVNJQklMSVRZX1Zpc2libGU7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfSGlkZGVuOg0KKyAgICAgIHJldHVybiBGREVfQ1NTVklTSUJJTElUWV9IaWRkZW47DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ29sbGFwc2U6DQorICAgICAgcmV0dXJuIEZERV9DU1NWSVNJQklMSVRZX0NvbGxhcHNlOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGREVfQ1NTVklTSUJJTElUWV9WaXNpYmxlOw0KKyAgfQ0KK30NCitGREVfQ1NTV0hJVEVTUEFDRSBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvV2hpdGVTcGFjZSgNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vcm1hbDoNCisgICAgICByZXR1cm4gRkRFX0NTU1dISVRFU1BBQ0VfTm9ybWFsOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1ByZToNCisgICAgICByZXR1cm4gRkRFX0NTU1dISVRFU1BBQ0VfUHJlOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vd3JhcDoNCisgICAgICByZXR1cm4gRkRFX0NTU1dISVRFU1BBQ0VfTm93cmFwOw0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX1ByZVdyYXA6DQorICAgICAgcmV0dXJuIEZERV9DU1NXSElURVNQQUNFX1ByZVdyYXA7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfUHJlTGluZToNCisgICAgICByZXR1cm4gRkRFX0NTU1dISVRFU1BBQ0VfUHJlTGluZTsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkRFX0NTU1dISVRFU1BBQ0VfTm9ybWFsOw0KKyAgfQ0KK30NCitGWF9EV09SRCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvVGV4dERlY29yYXRpb24oSUZERV9DU1NWYWx1ZUxpc3QqIHBWYWx1ZSkgew0KKyAgRlhfRFdPUkQgZHdEZWNvcmF0aW9uID0gMDsNCisgIGZvciAoaW50MzJfdCBpID0gcFZhbHVlLT5Db3VudFZhbHVlcygpIC0gMTsgaSA+PSAwOyAtLWkpIHsNCisgICAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSogcFByaW1pdGl2ZSA9DQorICAgICAgICAoSUZERV9DU1NQcmltaXRpdmVWYWx1ZSopcFZhbHVlLT5HZXRWYWx1ZShpKTsNCisgICAgaWYgKHBQcmltaXRpdmUtPkdldFByaW1pdGl2ZVR5cGUoKSA9PSBGREVfQ1NTUFJJTUlUSVZFVFlQRV9FbnVtKSB7DQorICAgICAgc3dpdGNoIChwUHJpbWl0aXZlLT5HZXRFbnVtKCkpIHsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfVW5kZXJsaW5lOg0KKyAgICAgICAgICBkd0RlY29yYXRpb24gfD0gRkRFX0NTU1RFWFRERUNPUkFUSU9OX1VuZGVybGluZTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0xpbmVUaHJvdWdoOg0KKyAgICAgICAgICBkd0RlY29yYXRpb24gfD0gRkRFX0NTU1RFWFRERUNPUkFUSU9OX0xpbmVUaHJvdWdoOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfT3ZlcmxpbmU6DQorICAgICAgICAgIGR3RGVjb3JhdGlvbiB8PSBGREVfQ1NTVEVYVERFQ09SQVRJT05fT3ZlcmxpbmU7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9CbGluazoNCisgICAgICAgICAgZHdEZWNvcmF0aW9uIHw9IEZERV9DU1NURVhUREVDT1JBVElPTl9CbGluazsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX0RvdWJsZToNCisgICAgICAgICAgZHdEZWNvcmF0aW9uIHw9IEZERV9DU1NURVhUREVDT1JBVElPTl9Eb3VibGU7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gZHdEZWNvcmF0aW9uOw0KK30NCitGREVfQ1NTVEVYVFRSQU5TRk9STSBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvVGV4dFRyYW5zZm9ybSgNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSB7DQorICBzd2l0Y2ggKGVWYWx1ZSkgew0KKyAgICBjYXNlIEZERV9DU1NQUk9QRVJUWVZBTFVFX05vbmU6DQorICAgICAgcmV0dXJuIEZERV9DU1NURVhUVFJBTlNGT1JNX05vbmU7DQorICAgIGNhc2UgRkRFX0NTU1BST1BFUlRZVkFMVUVfQ2FwaXRhbGl6ZToNCisgICAgICByZXR1cm4gRkRFX0NTU1RFWFRUUkFOU0ZPUk1fQ2FwaXRhbGl6ZTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9VcHBlcmNhc2U6DQorICAgICAgcmV0dXJuIEZERV9DU1NURVhUVFJBTlNGT1JNX1VwcGVyQ2FzZTsNCisgICAgY2FzZSBGREVfQ1NTUFJPUEVSVFlWQUxVRV9Mb3dlcmNhc2U6DQorICAgICAgcmV0dXJuIEZERV9DU1NURVhUVFJBTlNGT1JNX0xvd2VyQ2FzZTsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkRFX0NTU1RFWFRUUkFOU0ZPUk1fTm9uZTsNCisgIH0NCit9DQorRkRFX0NTU0ZPTlRWQVJJQU5UIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9Gb250VmFyaWFudCgNCisgICAgRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKSB7DQorICByZXR1cm4gZVZhbHVlID09IEZERV9DU1NQUk9QRVJUWVZBTFVFX1NtYWxsQ2FwcyA/IEZERV9DU1NGT05UVkFSSUFOVF9TbWFsbENhcHMNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRkRFX0NTU0ZPTlRWQVJJQU5UX05vcm1hbDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3Nzc3R5bGVzZWxlY3Rvci5oIGIveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3Nzc3R5bGVzZWxlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMTU5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzdHlsZXNlbGVjdG9yLmgKQEAgLTAsMCArMSw4ODYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRkRFX0NTU1NUWUxFU0VMRUNUT1INCisjZGVmaW5lIF9GREVfQ1NTU1RZTEVTRUxFQ1RPUg0KKyNkZWZpbmUgRkRFX0NTU1VOSVZFUlNBTEhBU0ggKCcqJykNCit0eXBlZGVmIHN0cnVjdCBfRkRFX0NTU1JVTEVEQVRBIDogcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBfRkRFX0NTU1JVTEVEQVRBKElGREVfQ1NTU2VsZWN0b3IqIHBTZWwsDQorICAgICAgICAgICAgICAgICAgIElGREVfQ1NTRGVjbGFyYXRpb24qIHBEZWNsLA0KKyAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1Bvcyk7DQorICBJRkRFX0NTU1NlbGVjdG9yKiBwU2VsZWN0b3I7DQorICBJRkRFX0NTU0RlY2xhcmF0aW9uKiBwRGVjbGFyYXRpb247DQorICBGWF9EV09SRCBkd1ByaW9yaXR5Ow0KKyAgX0ZERV9DU1NSVUxFREFUQSogcE5leHQ7DQorfSBGREVfQ1NTUlVMRURBVEEsICpGREVfTFBDU1NSVUxFREFUQTsNCit0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPEZERV9MUENTU1JVTEVEQVRBPiBDRkRFX0NTU1J1bGVEYXRhQXJyYXk7DQorY2xhc3MgQ0ZERV9DU1NSdWxlQ29sbGVjdGlvbiA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZERV9DU1NSdWxlQ29sbGVjdGlvbigpDQorICAgICAgOiBtX3BTdGF0aWNTdG9yZShudWxscHRyKSwNCisgICAgICAgIG1fcFVuaXZlcnNhbFJ1bGVzKG51bGxwdHIpLA0KKyAgICAgICAgbV9wUGVyc3Vkb1J1bGVzKG51bGxwdHIpLA0KKyAgICAgICAgbV9pU2VsZWN0b3JzKDApIHt9DQorICB+Q0ZERV9DU1NSdWxlQ29sbGVjdGlvbigpIHsgQ2xlYXIoKTsgfQ0KKyAgdm9pZCBBZGRSdWxlc0Zyb20oY29uc3QgQ0ZERV9DU1NTdHlsZVNoZWV0QXJyYXkmIHNoZWV0cywNCisgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TWVkaWFMaXN0LA0KKyAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnRNZ3IqIHBGb250TWdyKTsNCisgIHZvaWQgQ2xlYXIoKTsNCisNCisgIGludDMyX3QgQ291bnRTZWxlY3RvcnMoKSBjb25zdCB7IHJldHVybiBtX2lTZWxlY3RvcnM7IH0NCisgIEZERV9MUENTU1JVTEVEQVRBIEdldElEUnVsZURhdGEoRlhfRFdPUkQgZHdJREhhc2gpIHsNCisgICAgdm9pZCogcERhdGE7DQorICAgIHJldHVybiBtX0lEUnVsZXMuTG9va3VwKCh2b2lkKikodWludHB0cl90KWR3SURIYXNoLCBwRGF0YSkNCisgICAgICAgICAgICAgICA/IChGREVfTFBDU1NSVUxFREFUQSlwRGF0YQ0KKyAgICAgICAgICAgICAgIDogTlVMTDsNCisgIH0NCisgIEZERV9MUENTU1JVTEVEQVRBIEdldFRhZ1J1bGVEYXRhKEZYX0RXT1JEIGR3VGFnSGFzbikgew0KKyAgICB2b2lkKiBwRGF0YTsNCisgICAgcmV0dXJuIG1fVGFnUnVsZXMuTG9va3VwKCh2b2lkKikodWludHB0cl90KWR3VGFnSGFzbiwgcERhdGEpDQorICAgICAgICAgICAgICAgPyAoRkRFX0xQQ1NTUlVMRURBVEEpcERhdGENCisgICAgICAgICAgICAgICA6IE5VTEw7DQorICB9DQorICBGREVfTFBDU1NSVUxFREFUQSBHZXRDbGFzc1J1bGVEYXRhKEZYX0RXT1JEIGR3SURIYXNoKSB7DQorICAgIHZvaWQqIHBEYXRhOw0KKyAgICByZXR1cm4gbV9DbGFzc1J1bGVzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClkd0lESGFzaCwgcERhdGEpDQorICAgICAgICAgICAgICAgPyAoRkRFX0xQQ1NTUlVMRURBVEEpcERhdGENCisgICAgICAgICAgICAgICA6IE5VTEw7DQorICB9DQorICBGREVfTFBDU1NSVUxFREFUQSBHZXRVbml2ZXJzYWxSdWxlRGF0YSgpIHsgcmV0dXJuIG1fcFVuaXZlcnNhbFJ1bGVzOyB9DQorICBGREVfTFBDU1NSVUxFREFUQSBHZXRQZXJzdWRvUnVsZURhdGEoKSB7IHJldHVybiBtX3BQZXJzdWRvUnVsZXM7IH0NCisgIElGWF9NRU1BbGxvY2F0b3IqIG1fcFN0YXRpY1N0b3JlOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIEFkZFJ1bGVzRnJvbShJRkRFX0NTU1N0eWxlU2hlZXQqIHBTdHlsZVNoZWV0LA0KKyAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NSdWxlKiBwUnVsZSwNCisgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TWVkaWFMaXN0LA0KKyAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnRNZ3IqIHBGb250TWdyKTsNCisgIHZvaWQgQWRkUnVsZVRvKENGWF9NYXBQdHJUb1B0ciYgbWFwLA0KKyAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdLZXksDQorICAgICAgICAgICAgICAgICBJRkRFX0NTU1NlbGVjdG9yKiBwU2VsLA0KKyAgICAgICAgICAgICAgICAgSUZERV9DU1NEZWNsYXJhdGlvbiogcERlY2wpOw0KKyAgRlhfQk9PTCBBZGRSdWxlVG8oRkRFX0xQQ1NTUlVMRURBVEEmIHBMaXN0LCBGREVfTFBDU1NSVUxFREFUQSBwRGF0YSk7DQorICBGREVfTFBDU1NSVUxFREFUQSBOZXdSdWxlRGF0YShJRkRFX0NTU1NlbGVjdG9yKiBwU2VsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NEZWNsYXJhdGlvbiogcERlY2wpOw0KKyAgQ0ZYX01hcFB0clRvUHRyIG1fSURSdWxlczsNCisgIENGWF9NYXBQdHJUb1B0ciBtX1RhZ1J1bGVzOw0KKyAgQ0ZYX01hcFB0clRvUHRyIG1fQ2xhc3NSdWxlczsNCisgIEZERV9MUENTU1JVTEVEQVRBIG1fcFVuaXZlcnNhbFJ1bGVzOw0KKyAgRkRFX0xQQ1NTUlVMRURBVEEgbV9wUGVyc3Vkb1J1bGVzOw0KKyAgaW50MzJfdCBtX2lTZWxlY3RvcnM7DQorfTsNCitjbGFzcyBDRkRFX0NTU0FjY2VsZXJhdG9yOw0KK2NsYXNzIENGREVfQ1NTQ29tcHV0ZWRTdHlsZTsNCitjbGFzcyBDRkRFX0NTU1N0eWxlU2VsZWN0b3IgOiBwdWJsaWMgSUZERV9DU1NTdHlsZVNlbGVjdG9yLCBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGREVfQ1NTU3R5bGVTZWxlY3RvcigpOw0KKyAgfkNGREVfQ1NTU3R5bGVTZWxlY3RvcigpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorDQorICB2aXJ0dWFsIHZvaWQgU2V0Rm9udE1ncihJRlhfRm9udE1nciogcEZvbnRNZ3IpOw0KKyAgdmlydHVhbCB2b2lkIFNldERlZkZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSk7DQorDQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0U3R5bGVTaGVldChGREVfQ1NTU1RZTEVTSEVFVEdST1VQIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NTdHlsZVNoZWV0KiBwU2hlZXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldFN0eWxlU2hlZXRzKEZERV9DU1NTVFlMRVNIRUVUR1JPVVAgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZERV9DU1NTdHlsZVNoZWV0QXJyYXkqIHBBcnJheSk7DQorICB2aXJ0dWFsIHZvaWQgU2V0U3R5bGVQcmlvcml0eShGREVfQ1NTU1RZTEVTSEVFVEdST1VQIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1NUWUxFU0hFRVRQUklPUklUWSBlUHJpb3JpdHkpOw0KKyAgdmlydHVhbCB2b2lkIFVwZGF0ZVN0eWxlSW5kZXgoRlhfRFdPUkQgZHdNZWRpYUxpc3QpOw0KKyAgdmlydHVhbCBJRkRFX0NTU0FjY2VsZXJhdG9yKiBJbml0QWNjZWxlcmF0b3IoKTsNCisgIHZpcnR1YWwgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBDcmVhdGVDb21wdXRlZFN0eWxlKA0KKyAgICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFBhcmVudFN0eWxlKTsNCisgIHZpcnR1YWwgaW50MzJfdCBNYXRjaERlY2xhcmF0aW9ucygNCisgICAgICBJRkRFX0NTU1RhZ1Byb3ZpZGVyKiBwVGFnLA0KKyAgICAgIENGREVfQ1NTRGVjbGFyYXRpb25BcnJheSYgbWF0Y2hlZERlY2xzLA0KKyAgICAgIEZERV9DU1NQRVJTVURPIGVQZXJzdWRvVHlwZSA9IEZERV9DU1NQRVJTVURPX05PTkUpOw0KKyAgdmlydHVhbCB2b2lkIENvbXB1dGVTdHlsZShJRkRFX0NTU1RhZ1Byb3ZpZGVyKiBwVGFnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJRkRFX0NTU0RlY2xhcmF0aW9uKiogcHBEZWNsQXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaURlY2xDb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwRGVzdFN0eWxlKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBSZXNldCgpOw0KKyAgdm9pZCBNYXRjaFJ1bGVzKEZERV9MUENTU1RBR0NBQ0hFIHBDYWNoZSwNCisgICAgICAgICAgICAgICAgICBGREVfTFBDU1NSVUxFREFUQSBwTGlzdCwNCisgICAgICAgICAgICAgICAgICBGREVfQ1NTUEVSU1VETyBlUGVyc3Vkb1R5cGUpOw0KKyAgdm9pZCBTb3J0UnVsZXNUbyhDRkRFX0NTU0RlY2xhcmF0aW9uQXJyYXkmIG1hdGNoRGVjbHMpOw0KKyAgRlhfQk9PTCBNYXRjaFNlbGVjdG9yKEZERV9MUENTU1RBR0NBQ0hFIHBDYWNoZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU1NlbGVjdG9yKiBwU2VsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQRVJTVURPIGVQZXJzdWRvVHlwZSk7DQorICB2b2lkIEFwcGVuZElubGluZVN0eWxlKENGREVfQ1NTRGVjbGFyYXRpb24qIHBEZWNsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW4pOw0KKyAgdm9pZCBBcHBseURlY2xhcmF0aW9ucyhGWF9CT09MIGJQcmlvcml0eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSUZERV9DU1NEZWNsYXJhdGlvbioqIHBwRGVjbEFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEZWNsQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcERlc3RTdHlsZSk7DQorICB2b2lkIEFwcGx5UHJvcGVydHkoRkRFX0NTU1BST1BFUlRZIGVQcm9wZXJ0eSwNCisgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU1ZhbHVlKiBwVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgQ0ZERV9DU1NDb21wdXRlZFN0eWxlKiBwQ29tcHV0ZWRTdHlsZSk7DQorDQorICBGWF9GTE9BVCBBcHBseU51bWJlcihGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVW5pdCwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZXJjZW50QmFzZSk7DQorICBGWF9CT09MIFNldExlbmd0aFdpdGhQZXJjZW50KEZERV9DU1NMRU5HVEgmIHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUFJJTUlUSVZFVFlQRSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NQcmltaXRpdmVWYWx1ZSogcFByaW1pdGl2ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplKTsNCisgIEZYX0ZMT0FUIFRvRm9udFNpemUoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlLCBGWF9GTE9BVCBmQ3VyRm9udFNpemUpOw0KKyAgRkRFX0NTU0RJU1BMQVkgVG9EaXNwbGF5KEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQorICBGREVfQ1NTVEVYVEFMSUdOIFRvVGV4dEFsaWduKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQorICBGWF9XT1JEIFRvRm9udFdlaWdodChGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgRkRFX0NTU0ZPTlRTVFlMRSBUb0ZvbnRTdHlsZShGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgRkRFX0NTU0JPUkRFUlNUWUxFIFRvQm9yZGVyU3R5bGUoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgIEZERV9DU1NWRVJUSUNBTEFMSUdOIFRvVmVydGljYWxBbGlnbihGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgRkRFX0NTU0xJU1RTVFlMRVRZUEUgVG9MaXN0U3R5bGVUeXBlKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQorICBGREVfQ1NTTElTVFNUWUxFUE9TSVRJT04gVG9MaXN0U3R5bGVQb3NpdGlvbihGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgRkRFX0NTU1ZJU0lCSUxJVFkgVG9WaXNpYmlsaXR5KEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQorICBGREVfQ1NTV0hJVEVTUEFDRSBUb1doaXRlU3BhY2UoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgIEZYX0RXT1JEIFRvVGV4dERlY29yYXRpb24oSUZERV9DU1NWYWx1ZUxpc3QqIHBMaXN0KTsNCisgIEZERV9DU1NURVhUVFJBTlNGT1JNIFRvVGV4dFRyYW5zZm9ybShGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgRkRFX0NTU0ZPTlRWQVJJQU5UIFRvRm9udFZhcmlhbnQoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgIEZERV9DU1NGTE9BVCBUb0Zsb2F0KEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQorICBGREVfQ1NTQ0xFQVIgVG9DbGVhcihGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgRkRFX0NTU1dSSVRJTkdNT0RFIFRvV3JpdGluZ01vZGUoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgIEZERV9DU1NXT1JEQlJFQUsgVG9Xb3JkQnJlYWsoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgIEZERV9DU1NQQUdFQlJFQUsgVG9QYWdlQnJlYWsoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgIEZERV9DU1NPVkVSRkxPVyBUb092ZXJmbG93KEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQorICBGREVfQ1NTTElORUJSRUFLIFRvTGluZUJyZWFrKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQorICBGREVfQ1NTVEVYVENPTUJJTkUgVG9UZXh0Q29tYmluZShGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgRlhfQk9PTCBUb1RleHRFbXBoYXNpc01hcmsoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1RFWFRFTVBIQVNJU01BUksmIGVNYXJrKTsNCisgIEZYX0JPT0wgVG9UZXh0RW1waGFzaXNGaWxsKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NURVhURU1QSEFTSVNGSUxMJiBlRmlsbCk7DQorICBGREVfQ1NTQ1VSU09SIFRvQ3Vyc29yKEZERV9DU1NQUk9QRVJUWVZBTFVFIGVWYWx1ZSk7DQorICBGREVfQ1NTUE9TSVRJT04gVG9Qb3NpdGlvbihGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgRkRFX0NTU0NBUFRJT05TSURFIFRvQ2FwdGlvblNpZGUoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgIEZERV9DU1NCS0dSRVBFQVQgVG9CS0dSZXBlYXQoRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgIEZERV9DU1NCS0dBVFRBQ0hNRU5UIFRvQktHQXR0YWNobWVudChGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgRkRFX0NTU1JVQllBTElHTiBUb1J1YnlBbGlnbihGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgRkRFX0NTU1JVQllPVkVSSEFORyBUb1J1YnlPdmVyaGFuZyhGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgRkRFX0NTU1JVQllQT1NJVElPTiBUb1J1YnlQb3NpdGlvbihGREVfQ1NTUFJPUEVSVFlWQUxVRSBlVmFsdWUpOw0KKyAgRkRFX0NTU1JVQllTUEFOIFRvUnVieVNwYW4oRkRFX0NTU1BST1BFUlRZVkFMVUUgZVZhbHVlKTsNCisgIElGWF9Gb250TWdyKiBtX3BGb250TWdyOw0KKyAgRlhfRkxPQVQgbV9mRGVmRm9udFNpemU7DQorICBJRlhfTUVNQWxsb2NhdG9yKiBtX3BSdWxlRGF0YVN0b3JlOw0KKyAgQ0ZERV9DU1NTdHlsZVNoZWV0QXJyYXkgbV9TaGVldEdyb3Vwc1tGREVfQ1NTU1RZTEVTSEVFVEdST1VQX01BWF07DQorICBDRkRFX0NTU1J1bGVDb2xsZWN0aW9uIG1fUnVsZUNvbGxlY3Rpb25bRkRFX0NTU1NUWUxFU0hFRVRHUk9VUF9NQVhdOw0KKyAgRkRFX0NTU1NUWUxFU0hFRVRHUk9VUCBtX2VQcmlvcml0aWVzW0ZERV9DU1NTVFlMRVNIRUVUUFJJT1JJVFlfTUFYXTsNCisgIElGWF9NRU1BbGxvY2F0b3IqIG1fcElubGluZVN0eWxlU3RvcmU7DQorICBJRlhfTUVNQWxsb2NhdG9yKiBtX3BGaXhlZFN0eWxlU3RvcmU7DQorICBDRkRFX0NTU0FjY2VsZXJhdG9yKiBtX3BBY2NlbGVyYXRvcjsNCisgIENGREVfQ1NTUnVsZURhdGFBcnJheSBtX01hdGNoZWRSdWxlczsNCit9Ow0KK3R5cGVkZWYgc3RydWN0IF9GREVfQ1NTQ09VTlRFUkRBVEEgew0KKyBwdWJsaWM6DQorICBfRkRFX0NTU0NPVU5URVJEQVRBKCkgeyBGWF9tZW1zZXQodGhpcywgMCwgc2l6ZW9mKF9GREVfQ1NTQ09VTlRFUkRBVEEpKTsgfQ0KKyAgRlhfQk9PTCBHZXRDb3VudGVySW5jcmVtZW50KGludDMyX3QmIGlWYWx1ZSkgew0KKyAgICBpVmFsdWUgPSBtX2lJbmNWYWw7DQorICAgIHJldHVybiBtX2JJbmNyZW1lbnQ7DQorICB9DQorICBGWF9CT09MIEdldENvdW50ZXJSZXNldChpbnQzMl90JiBpVmFsdWUpIHsNCisgICAgaVZhbHVlID0gbV9pUmVzZXRWYWw7DQorICAgIHJldHVybiBtX2JSZXNldDsNCisgIH0NCisgIGNvbnN0IEZYX1dDSEFSKiBtX3BzeklkZW50Ow0KKyAgRlhfQk9PTCBtX2JJbmNyZW1lbnQ7DQorICBGWF9CT09MIG1fYlJlc2V0Ow0KKyAgaW50MzJfdCBtX2lJbmNWYWw7DQorICBpbnQzMl90IG1faVJlc2V0VmFsOw0KK30gRkRFX0NTU0NPVU5URVJEQVRBLCAqRkRFX0xQQ1NTQ09VTlRFUkRBVEE7DQorY2xhc3MgQ0ZERV9DU1NDb3VudGVyU3R5bGUgew0KKyBwdWJsaWM6DQorICBDRkRFX0NTU0NvdW50ZXJTdHlsZSgpIDogbV9wQ291bnRlckluYyhOVUxMKSwgbV9wQ291bnRlclJlc2V0KE5VTEwpIHt9DQorICB2b2lkIFNldENvdW50ZXJJbmNyZW1lbnRMaXN0KElGREVfQ1NTVmFsdWVMaXN0KiBwTGlzdCkgew0KKyAgICBtX3BDb3VudGVySW5jID0gcExpc3Q7DQorICAgIG1fYkluZGV4RGlydHkgPSBUUlVFOw0KKyAgfQ0KKyAgdm9pZCBTZXRDb3VudGVyUmVzZXRMaXN0KElGREVfQ1NTVmFsdWVMaXN0KiBwTGlzdCkgew0KKyAgICBtX3BDb3VudGVyUmVzZXQgPSBwTGlzdDsNCisgICAgbV9iSW5kZXhEaXJ0eSA9IFRSVUU7DQorICB9DQorICBpbnQzMl90IENvdW50Q291bnRlcnMoKSB7DQorICAgIFVwZGF0ZUluZGV4KCk7DQorICAgIHJldHVybiBtX2FyckNvdW50ZXJEYXRhLkdldFNpemUoKTsNCisgIH0NCisgIEZYX0JPT0wgR2V0Q291bnRlckluY3JlbWVudChpbnQzMl90IGluZGV4LCBpbnQzMl90JiBpVmFsdWUpIHsNCisgICAgVXBkYXRlSW5kZXgoKTsNCisgICAgcmV0dXJuIG1fYXJyQ291bnRlckRhdGEuRWxlbWVudEF0KGluZGV4KS5HZXRDb3VudGVySW5jcmVtZW50KGlWYWx1ZSk7DQorICB9DQorICBGWF9CT09MIEdldENvdW50ZXJSZXNldChpbnQzMl90IGluZGV4LCBpbnQzMl90JiBpVmFsdWUpIHsNCisgICAgVXBkYXRlSW5kZXgoKTsNCisgICAgcmV0dXJuIG1fYXJyQ291bnRlckRhdGEuRWxlbWVudEF0KGluZGV4KS5HZXRDb3VudGVyUmVzZXQoaVZhbHVlKTsNCisgIH0NCisgIGNvbnN0IEZYX1dDSEFSKiBHZXRDb3VudGVySWRlbnRpZmllcihpbnQzMl90IGluZGV4KSB7DQorICAgIFVwZGF0ZUluZGV4KCk7DQorICAgIHJldHVybiBtX2FyckNvdW50ZXJEYXRhLkVsZW1lbnRBdChpbmRleCkubV9wc3pJZGVudDsNCisgIH0NCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBVcGRhdGVJbmRleCgpOw0KKyAgdm9pZCBEb1VwZGF0ZUluZGV4KElGREVfQ1NTVmFsdWVMaXN0KiBwTGlzdCk7DQorICBpbnQzMl90IEZpbmRJbmRleChjb25zdCBGWF9XQ0hBUiogcHN6SWRlbnRpZmllcik7DQorICBJRkRFX0NTU1ZhbHVlTGlzdCogbV9wQ291bnRlckluYzsNCisgIElGREVfQ1NTVmFsdWVMaXN0KiBtX3BDb3VudGVyUmVzZXQ7DQorICBDRlhfQXJyYXlUZW1wbGF0ZTxGREVfQ1NTQ09VTlRFUkRBVEE+IG1fYXJyQ291bnRlckRhdGE7DQorICBGWF9CT09MIG1fYkluZGV4RGlydHk7DQorfTsNCitjbGFzcyBDRkRFX0NTU0luaGVyaXRlZERhdGEgew0KKyBwdWJsaWM6DQorICB2b2lkIFJlc2V0KCkgew0KKyAgICBGWF9tZW1zZXQodGhpcywgMCwgc2l6ZW9mKENGREVfQ1NTSW5oZXJpdGVkRGF0YSkpOw0KKyAgICBtX0xldHRlclNwYWNpbmcuU2V0KEZERV9DU1NMRU5HVEhVTklUX05vcm1hbCk7DQorICAgIG1fV29yZFNwYWNpbmcuU2V0KEZERV9DU1NMRU5HVEhVTklUX05vcm1hbCk7DQorICAgIG1fVGV4dEluZGVudC5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfUG9pbnQsIDApOw0KKyAgICBtX2ZGb250U2l6ZSA9IDEyLjBmOw0KKyAgICBtX2ZMaW5lSGVpZ2h0ID0gMTQuMGY7DQorICAgIG1fd0ZvbnRXZWlnaHQgPSA0MDA7DQorICAgIG1fZHdGb250Q29sb3IgPSAweEZGMDAwMDAwOw0KKyAgICBtX2lXaWRvd3MgPSAyOw0KKyAgICBtX2JUZXh0RW1waGFzaXNDb2xvckN1cnJlbnQgPSBUUlVFOw0KKyAgICBtX2lPcnBoYW5zID0gMjsNCisgIH0NCisgIGNvbnN0IEZYX1dDSEFSKiBtX3Bzekxpc3RTdHlsZUltYWdlOw0KKyAgRkRFX0NTU0xFTkdUSCBtX0xldHRlclNwYWNpbmc7DQorICBGREVfQ1NTTEVOR1RIIG1fV29yZFNwYWNpbmc7DQorICBGREVfQ1NTTEVOR1RIIG1fVGV4dEluZGVudDsNCisgIElGREVfQ1NTVmFsdWVMaXN0KiBtX3BGb250RmFtaWx5Ow0KKyAgSUZERV9DU1NWYWx1ZUxpc3QqIG1fcFF1b3RlczsNCisgIElGREVfQ1NTVmFsdWVMaXN0KiBtX3BDdXJzb3JVcmlzOw0KKyAgRkRFX0NTU0NVUlNPUiBtX2VDdXJzb3I7DQorICBGWF9GTE9BVCBtX2ZGb250U2l6ZTsNCisgIEZYX0ZMT0FUIG1fZkxpbmVIZWlnaHQ7DQorICBGWF9BUkdCIG1fZHdGb250Q29sb3I7DQorICBGWF9BUkdCIG1fZHdUZXh0RW1waGFzaXNDb2xvcjsNCisgIEZYX1dPUkQgbV93Rm9udFdlaWdodDsNCisgIGludDMyX3QgbV9pV2lkb3dzOw0KKyAgaW50MzJfdCBtX2lPcnBoYW5zOw0KKyAgY29uc3QgRlhfV0NIQVIqIG1fcHN6VGV4dEVtcGhhc2lzQ3VzdG9tTWFyazsNCisgIEZYX1dPUkQgbV9lRm9udFZhcmlhbnQgOiAxOw0KKyAgRlhfV09SRCBtX2VGb250U3R5bGUgOiAxOw0KKyAgRlhfV09SRCBtX2JUZXh0RW1waGFzaXNDb2xvckN1cnJlbnQgOiAxOw0KKyAgRlhfV09SRCBtX2VUZXh0QWxpZ2ggOiAyOw0KKyAgRlhfV09SRCBtX2VWaXNpYmlsaXR5IDogMjsNCisgIEZYX1dPUkQgbV9lV2hpdGVTcGFjZSA6IDM7DQorICBGWF9XT1JEIG1fZVRleHRUcmFuc2Zvcm0gOiAyOw0KKyAgRlhfV09SRCBtX2VXcml0aW5nTW9kZSA6IDI7DQorICBGWF9XT1JEIG1fZVdvcmRCcmVhayA6IDI7DQorICBGWF9XT1JEIG1fZUxpbmVCcmVhayA6IDI7DQorICBGWF9XT1JEIG1fZVRleHRFbXBoYXNpc0ZpbGwgOiAxOw0KKyAgRlhfV09SRCBtX2VUZXh0RW1waGFzaXNNYXJrIDogMzsNCisgIEZYX1dPUkQgbV9lQ2FwdGlvblNpZGUgOiAzOw0KKw0KKyAgRlhfV09SRCBtX2VSdWJ5QWxpZ24gOiA0Ow0KKyAgRlhfV09SRCBtX2VSdWJ5T3ZlcmhhbmcgOiAyOw0KKyAgRlhfV09SRCBtX2VSdWJ5UG9zaXRpb24gOiAyOw0KK307DQorY2xhc3MgQ0ZERV9DU1NOb25Jbmhlcml0ZWREYXRhIHsNCisgcHVibGljOg0KKyAgdm9pZCBSZXNldCgpIHsNCisgICAgRlhfbWVtc2V0KHRoaXMsIDAsIHNpemVvZihDRkRFX0NTU05vbkluaGVyaXRlZERhdGEpKTsNCisgICAgbV9NYXJnaW5XaWR0aCA9IG1fQm9yZGVyV2lkdGggPQ0KKyAgICAgICAgbV9QYWRkaW5nV2lkdGguU2V0KEZERV9DU1NMRU5HVEhVTklUX1BvaW50LCAwKTsNCisgICAgbV9NaW5Cb3hTaXplLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgMCk7DQorICAgIG1fTWF4Qm94U2l6ZS5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfTm9uZSk7DQorICAgIG1fZURpc3BsYXkgPSBGREVfQ1NTRElTUExBWV9JbmxpbmU7DQorICAgIG1fZlZlcnRpY2FsQWxpZ24gPSAwLjBmOw0KKyAgICBtX0NvbHVtbkNvdW50LlNldChGREVfQ1NTTEVOR1RIVU5JVF9BdXRvKTsNCisgICAgbV9Db2x1bW5HYXAuU2V0KEZERV9DU1NMRU5HVEhVTklUX05vcm1hbCk7DQorICAgIG1fYkNvbHVtblJ1bGVDb2xvclNhbWUgPSBUUlVFOw0KKyAgICBtX0NvbHVtbldpZHRoLlNldChGREVfQ1NTTEVOR1RIVU5JVF9BdXRvKTsNCisgICAgbV9Db2x1bW5SdWxlV2lkdGguU2V0KEZERV9DU1NMRU5HVEhVTklUX0F1dG8pOw0KKyAgICBtX2VUZXh0Q29tYmluZSA9IEZERV9DU1NURVhUQ09NQklORV9Ob25lOw0KKyAgfQ0KKw0KKyAgSUZERV9DU1NWYWx1ZUxpc3QqIG1fcENvbnRlbnRMaXN0Ow0KKyAgQ0ZERV9DU1NDb3VudGVyU3R5bGUqIG1fcENvdW50ZXJTdHlsZTsNCisgIEZERV9DU1NSRUNUIG1fTWFyZ2luV2lkdGg7DQorICBGREVfQ1NTUkVDVCBtX0JvcmRlcldpZHRoOw0KKyAgRkRFX0NTU1JFQ1QgbV9QYWRkaW5nV2lkdGg7DQorICBGREVfQ1NTU0laRSBtX0JveFNpemU7DQorICBGREVfQ1NTU0laRSBtX01pbkJveFNpemU7DQorICBGREVfQ1NTU0laRSBtX01heEJveFNpemU7DQorICBGREVfQ1NTUE9JTlQgbV9CS0dQb3NpdGlvbjsNCisgIGNvbnN0IEZYX1dDSEFSKiBtX3BzekJLR0ltYWdlOw0KKyAgRlhfQVJHQiBtX2R3QktHQ29sb3I7DQorICBGWF9BUkdCIG1fZHdCRFJMZWZ0Q29sb3I7DQorICBGWF9BUkdCIG1fZHdCRFJUb3BDb2xvcjsNCisgIEZYX0FSR0IgbV9kd0JEUlJpZ2h0Q29sb3I7DQorICBGWF9BUkdCIG1fZHdCRFJCb3R0b21Db2xvcjsNCisgIElGREVfQ1NTVmFsdWUqIG1fcFJ1YnlTcGFuOw0KKyAgRkRFX0NTU0xFTkdUSCBtX0NvbHVtbkNvdW50Ow0KKyAgRkRFX0NTU0xFTkdUSCBtX0NvbHVtbkdhcDsNCisgIEZERV9DU1NMRU5HVEggbV9Db2x1bW5SdWxlV2lkdGg7DQorICBGREVfQ1NTTEVOR1RIIG1fQ29sdW1uV2lkdGg7DQorICBGWF9BUkdCIG1fZHdDb2x1bW5SdWxlQ29sb3I7DQorICBGREVfQ1NTTEVOR1RIIG1fVG9wOw0KKyAgRkRFX0NTU0xFTkdUSCBtX0JvdHRvbTsNCisgIEZERV9DU1NMRU5HVEggbV9MZWZ0Ow0KKyAgRkRFX0NTU0xFTkdUSCBtX1JpZ2h0Ow0KKw0KKyAgRlhfRkxPQVQgbV9mVmVydGljYWxBbGlnbjsNCisgIEZYX0ZMT0FUIG1fZlRleHRDb21iaW5lTnVtYmVyOw0KKyAgRlhfRFdPUkQgbV9lQkRSTGVmdFN0eWxlIDogNDsNCisgIEZYX0RXT1JEIG1fZUJEUlRvcFN0eWxlIDogNDsNCisgIEZYX0RXT1JEIG1fZUJEUlJpZ2h0U3R5bGUgOiA0Ow0KKyAgRlhfRFdPUkQgbV9lQkRSQm90dG9tU3R5bGUgOiA0Ow0KKyAgRlhfRFdPUkQgbV9lRGlzcGxheSA6IDU7DQorICBGWF9EV09SRCBtX2VWZXJ0aWNhbEFsaWduIDogNDsNCisgIEZYX0RXT1JEIG1fZUxpc3RTdHlsZVR5cGUgOiA1Ow0KKyAgRlhfRFdPUkQgbV9lQ29sdW1uUnVsZVN0eWxlIDogNDsNCisgIEZYX0RXT1JEIG1fZVBhZ2VCcmVha0luc2lkZSA6IDM7DQorICBGWF9EV09SRCBtX2VQYWdlQnJlYWtBZnRlciA6IDM7DQorICBGWF9EV09SRCBtX2VQYWdlQnJlYWtCZWZvcmUgOiAzOw0KKyAgRlhfRFdPUkQgbV9lUG9zaXRpb24gOiAyOw0KKyAgRlhfRFdPUkQgbV9lQktHUmVwZWF0IDogMjsNCisgIEZYX0RXT1JEIG1fZUZsb2F0IDogMjsNCisgIEZYX0RXT1JEIG1fZUNsZWFyIDogMjsNCisgIEZYX0RXT1JEIG1fZU92ZXJmbG93WCA6IDM7DQorICBGWF9EV09SRCBtX2VPdmVyZmxvd1kgOiAzOw0KKyAgRlhfRFdPUkQgbV9lTGlzdFN0eWxlUG9zaXRpb24gOiAxOw0KKyAgRlhfRFdPUkQgbV9lQktHQXR0YWNobWVudCA6IDE7DQorICBGWF9EV09SRCBtX2JIYXNNYXJnaW4gOiAxOw0KKyAgRlhfRFdPUkQgbV9iSGFzQm9yZGVyIDogMTsNCisgIEZYX0RXT1JEIG1fYkhhc1BhZGRpbmcgOiAxOw0KKyAgRlhfRFdPUkQgbV9kd1RleHREZWNvcmF0aW9uIDogNTsNCisgIEZYX0RXT1JEIG1fZVRleHRDb21iaW5lIDogMTsNCisgIEZYX0RXT1JEIG1fYkNvbHVtblJ1bGVDb2xvclNhbWUgOiAxOw0KKyAgRlhfRFdPUkQgbV9iSGFzVGV4dENvbWJpbmVOdW1iZXIgOiAxOw0KK307DQorY2xhc3MgQ0ZERV9DU1NDb21wdXRlZFN0eWxlIDogcHVibGljIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSUZERV9DU1NGb250U3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIElGREVfQ1NTQm91bmRhcnlTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSUZERV9DU1NQb3NpdGlvblN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJRkRFX0NTU1BhcmFncmFwaFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJRkRFX0NTU0JhY2tncm91bmRTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSUZERV9DU1NWaXN1YWxTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSUZERV9DU1NMaXN0U3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIElGREVfQ1NTTXVsdGlDb2x1bW5TdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSUZERV9DU1NHZW5lcmF0ZWRDb250ZW50U3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIElGREVfQ1NTVGFibGVTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSUZERV9DU1NSdWJ5U3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRkRFX0NTU0NvbXB1dGVkU3R5bGUoSUZYX01FTUFsbG9jYXRvciogcEFsbG9jKQ0KKyAgICAgIDogbV9kd1JlZkNvdW50KDEpLCBtX3BBbGxvY2F0b3IocEFsbG9jKSB7fQ0KKyAgfkNGREVfQ1NTQ29tcHV0ZWRTdHlsZSgpIHt9DQorICB2aXJ0dWFsIEZYX0RXT1JEIEFkZFJlZigpIHsgcmV0dXJuICsrbV9kd1JlZkNvdW50OyB9DQorICB2aXJ0dWFsIEZYX0RXT1JEIFJlbGVhc2UoKSB7DQorICAgIEZYX0RXT1JEIGR3UmVmQ291bnQgPSAtLW1fZHdSZWZDb3VudDsNCisgICAgaWYgKGR3UmVmQ291bnQgPT0gMCkgew0KKyAgICAgIGlmIChtX05vbkluaGVyaXRlZERhdGEubV9wQ291bnRlclN0eWxlICE9IE5VTEwpIHsNCisgICAgICAgIGRlbGV0ZSBtX05vbkluaGVyaXRlZERhdGEubV9wQ291bnRlclN0eWxlOw0KKyAgICAgIH0NCisgICAgICBGREVfRGVsZXRlV2l0aChDRkRFX0NTU0NvbXB1dGVkU3R5bGUsIG1fcEFsbG9jYXRvciwgdGhpcyk7DQorICAgIH0NCisgICAgcmV0dXJuIGR3UmVmQ291bnQ7DQorICB9DQorDQorICB2aXJ0dWFsIHZvaWQgUmVzZXQoKSB7DQorICAgIG1fSW5oZXJpdGVkRGF0YS5SZXNldCgpOw0KKyAgICBtX05vbkluaGVyaXRlZERhdGEuUmVzZXQoKTsNCisgIH0NCisgIHZpcnR1YWwgSUZERV9DU1NGb250U3R5bGUqIEdldEZvbnRTdHlsZXMoKSBjb25zdCB7DQorICAgIHJldHVybiAoSUZERV9DU1NGb250U3R5bGUgKiBjb25zdCkgdGhpczsNCisgIH0NCisgIHZpcnR1YWwgSUZERV9DU1NCb3VuZGFyeVN0eWxlKiBHZXRCb3VuZGFyeVN0eWxlcygpIGNvbnN0IHsNCisgICAgcmV0dXJuIChJRkRFX0NTU0JvdW5kYXJ5U3R5bGUgKiBjb25zdCkgdGhpczsNCisgIH0NCisgIHZpcnR1YWwgSUZERV9DU1NQb3NpdGlvblN0eWxlKiBHZXRQb3NpdGlvblN0eWxlcygpIGNvbnN0IHsNCisgICAgcmV0dXJuIChJRkRFX0NTU1Bvc2l0aW9uU3R5bGUgKiBjb25zdCkgdGhpczsNCisgIH0NCisgIHZpcnR1YWwgSUZERV9DU1NQYXJhZ3JhcGhTdHlsZSogR2V0UGFyYWdyYXBoU3R5bGVzKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKElGREVfQ1NTUGFyYWdyYXBoU3R5bGUgKiBjb25zdCkgdGhpczsNCisgIH0NCisgIHZpcnR1YWwgSUZERV9DU1NCYWNrZ3JvdW5kU3R5bGUqIEdldEJhY2tncm91bmRTdHlsZXMoKSBjb25zdCB7DQorICAgIHJldHVybiAoSUZERV9DU1NCYWNrZ3JvdW5kU3R5bGUgKiBjb25zdCkgdGhpczsNCisgIH0NCisgIHZpcnR1YWwgSUZERV9DU1NWaXN1YWxTdHlsZSogR2V0VmlzdWFsU3R5bGVzKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKElGREVfQ1NTVmlzdWFsU3R5bGUgKiBjb25zdCkgdGhpczsNCisgIH0NCisgIHZpcnR1YWwgSUZERV9DU1NMaXN0U3R5bGUqIEdldExpc3RTdHlsZXMoKSBjb25zdCB7DQorICAgIHJldHVybiAoSUZERV9DU1NMaXN0U3R5bGUgKiBjb25zdCkgdGhpczsNCisgIH0NCisgIHZpcnR1YWwgSUZERV9DU1NUYWJsZVN0eWxlKiBHZXRUYWJsZVN0eWxlKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKElGREVfQ1NTVGFibGVTdHlsZSAqIGNvbnN0KSB0aGlzOw0KKyAgfQ0KKyAgdmlydHVhbCBJRkRFX0NTU011bHRpQ29sdW1uU3R5bGUqIEdldE11bHRpQ29sdW1uU3R5bGUoKSBjb25zdCB7DQorICAgIHJldHVybiAoSUZERV9DU1NNdWx0aUNvbHVtblN0eWxlICogY29uc3QpIHRoaXM7DQorICB9DQorICB2aXJ0dWFsIElGREVfQ1NTR2VuZXJhdGVkQ29udGVudFN0eWxlKiBHZXRHZW5lcmF0ZWRDb250ZW50U3R5bGUoKSBjb25zdCB7DQorICAgIHJldHVybiAoSUZERV9DU1NHZW5lcmF0ZWRDb250ZW50U3R5bGUgKiBjb25zdCkgdGhpczsNCisgIH0NCisgIHZpcnR1YWwgSUZERV9DU1NSdWJ5U3R5bGUqIEdldFJ1YnlTdHlsZSgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChJRkRFX0NTU1J1YnlTdHlsZSAqIGNvbnN0KSB0aGlzOw0KKyAgfQ0KKyAgdmlydHVhbCBGWF9CT09MIEdldEN1c3RvbVN0eWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKSBjb25zdCB7DQorICAgIGZvciAoaW50MzJfdCBpID0gbV9DdXN0b21Qcm9wZXJ0aWVzLkdldFNpemUoKSAtIDI7IGkgPiAtMTsgaSAtPSAyKSB7DQorICAgICAgaWYgKHdzTmFtZSA9PSBtX0N1c3RvbVByb3BlcnRpZXNbaV0pIHsNCisgICAgICAgIHdzVmFsdWUgPSBtX0N1c3RvbVByb3BlcnRpZXNbaSArIDFdOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHZpcnR1YWwgRkRFX0NTU1JVQllBTElHTiBHZXRSdWJ5QWxpZ24oKSBjb25zdCB7DQorICAgIHJldHVybiAoRkRFX0NTU1JVQllBTElHTiltX0luaGVyaXRlZERhdGEubV9lUnVieUFsaWduOw0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTUlVCWVBPU0lUSU9OIEdldFJ1YnlQb3NpdGlvbigpIGNvbnN0IHsNCisgICAgcmV0dXJuIChGREVfQ1NTUlVCWVBPU0lUSU9OKW1fSW5oZXJpdGVkRGF0YS5tX2VSdWJ5UG9zaXRpb247DQorICB9DQorICB2aXJ0dWFsIEZERV9DU1NSVUJZT1ZFUkhBTkcgR2V0UnVieU92ZXJoYW5nKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKEZERV9DU1NSVUJZT1ZFUkhBTkcpbV9Jbmhlcml0ZWREYXRhLm1fZVJ1YnlPdmVyaGFuZzsNCisgIH0NCisgIHZpcnR1YWwgRkRFX0NTU1JVQllTUEFOIEdldFJ1YnlTcGFuVHlwZSgpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX3BSdWJ5U3BhbiA9PSBOVUxMID8gRkRFX0NTU1JVQllTUEFOX05vbmUNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRkRFX0NTU1JVQllTUEFOX0F0dHI7DQorICB9DQorICB2aXJ0dWFsIElGREVfQ1NTVmFsdWUqIEdldFJ1YnlTcGFuQXR0cigpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX3BSdWJ5U3BhbjsNCisgIH0NCisgIHZpcnR1YWwgRkRFX0NTU0NBUFRJT05TSURFIEdldENhcHRpb25TaWRlKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKEZERV9DU1NDQVBUSU9OU0lERSltX0luaGVyaXRlZERhdGEubV9lQ2FwdGlvblNpZGU7DQorICB9DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRDb3VudGVycygpIHsNCisgICAgcmV0dXJuIChtX05vbkluaGVyaXRlZERhdGEubV9wQ291bnRlclN0eWxlID09IE5VTEwpDQorICAgICAgICAgICAgICAgPyAwDQorICAgICAgICAgICAgICAgOiBtX05vbkluaGVyaXRlZERhdGEubV9wQ291bnRlclN0eWxlLT5Db3VudENvdW50ZXJzKCk7DQorICB9DQorICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKiBHZXRDb3VudGVySWRlbnRpZmllcihpbnQzMl90IGluZGV4KSB7DQorICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9wQ291bnRlclN0eWxlLT5HZXRDb3VudGVySWRlbnRpZmllcihpbmRleCk7DQorICB9DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0Q291bnRlclJlc2V0KGludDMyX3QgaW5kZXgsIGludDMyX3QmIGlWYWx1ZSkgew0KKyAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fcENvdW50ZXJTdHlsZS0+R2V0Q291bnRlclJlc2V0KGluZGV4LCBpVmFsdWUpOw0KKyAgfQ0KKyAgdmlydHVhbCBGWF9CT09MIEdldENvdW50ZXJJbmNyZW1lbnQoaW50MzJfdCBpbmRleCwgaW50MzJfdCYgaVZhbHVlKSB7DQorICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9wQ291bnRlclN0eWxlLT5HZXRDb3VudGVySW5jcmVtZW50KGluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpVmFsdWUpOw0KKyAgfQ0KKyAgdmlydHVhbCBJRkRFX0NTU1ZhbHVlTGlzdCogR2V0Q29udGVudCgpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX3BDb250ZW50TGlzdDsNCisgIH0NCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudFF1b3RlcygpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX3BRdW90ZXMgPT0gTlVMTA0KKyAgICAgICAgICAgICAgID8gMA0KKyAgICAgICAgICAgICAgIDogbV9Jbmhlcml0ZWREYXRhLm1fcFF1b3Rlcy0+Q291bnRWYWx1ZXMoKTsNCisgIH0NCisgIHZpcnR1YWwgY29uc3QgRlhfV0NIQVIqIEdldFF1b3RlcyhpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICAgIEZYU1lTX2Fzc2VydChtX0luaGVyaXRlZERhdGEubV9wUXVvdGVzICE9IE5VTEwgJiYNCisgICAgICAgICAgICAgICAgIG1fSW5oZXJpdGVkRGF0YS5tX3BRdW90ZXMtPkNvdW50VmFsdWVzKCkgPiBpbmRleCk7DQorICAgIHJldHVybiAoKElGREVfQ1NTUHJpbWl0aXZlVmFsdWUqKShtX0luaGVyaXRlZERhdGEubV9wUXVvdGVzLT5HZXRWYWx1ZSgNCisgICAgICAgICAgICAgICAgaW5kZXgpKSkNCisgICAgICAgIC0+R2V0U3RyaW5nKGluZGV4KTsNCisgIH0NCisgIHZpcnR1YWwgY29uc3QgRkRFX0NTU0xFTkdUSCYgR2V0Q29sdW1uQ291bnQoKSBjb25zdCB7DQorICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9Db2x1bW5Db3VudDsNCisgIH0NCisgIHZpcnR1YWwgY29uc3QgRkRFX0NTU0xFTkdUSCYgR2V0Q29sdW1uR2FwKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fQ29sdW1uR2FwOw0KKyAgfQ0KKyAgdmlydHVhbCBGWF9BUkdCIEdldENvbHVtblJ1bGVDb2xvcigpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2JDb2x1bW5SdWxlQ29sb3JTYW1lDQorICAgICAgICAgICAgICAgPyBtX0luaGVyaXRlZERhdGEubV9kd0ZvbnRDb2xvcg0KKyAgICAgICAgICAgICAgIDogbV9Ob25Jbmhlcml0ZWREYXRhLm1fZHdDb2x1bW5SdWxlQ29sb3I7DQorICB9DQorICB2aXJ0dWFsIEZERV9DU1NCT1JERVJTVFlMRSBHZXRDb2x1bW5SdWxlU3R5bGUoKSBjb25zdCB7DQorICAgIHJldHVybiAoRkRFX0NTU0JPUkRFUlNUWUxFKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VDb2x1bW5SdWxlU3R5bGU7DQorICB9DQorICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NMRU5HVEgmIEdldENvbHVtblJ1bGVXaWR0aCgpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX0NvbHVtblJ1bGVXaWR0aDsNCisgIH0NCisgIHZpcnR1YWwgY29uc3QgRkRFX0NTU0xFTkdUSCYgR2V0Q29sdW1uV2lkdGgoKSBjb25zdCB7DQorICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9Db2x1bW5XaWR0aDsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRDb2x1bW5Db3VudChjb25zdCBGREVfQ1NTTEVOR1RIJiBjb2x1bW5Db3VudCkgew0KKyAgICBtX05vbkluaGVyaXRlZERhdGEubV9Db2x1bW5Db3VudCA9IGNvbHVtbkNvdW50Ow0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldENvbHVtbkdhcChjb25zdCBGREVfQ1NTTEVOR1RIJiBjb2x1bW5HYXApIHsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fQ29sdW1uR2FwID0gY29sdW1uR2FwOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldENvbHVtblJ1bGVDb2xvcihGWF9BUkdCIGR3Q29sdW1uUnVsZUNvbG9yKSB7DQorICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2R3Q29sdW1uUnVsZUNvbG9yID0gZHdDb2x1bW5SdWxlQ29sb3IsDQorICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2JDb2x1bW5SdWxlQ29sb3JTYW1lID0gRkFMU0U7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0Q29sdW1uUnVsZVN0eWxlKEZERV9DU1NCT1JERVJTVFlMRSBlQ29sdW1uUnVsZVN0eWxlKSB7DQorICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VDb2x1bW5SdWxlU3R5bGUgPSBlQ29sdW1uUnVsZVN0eWxlOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldENvbHVtblJ1bGVXaWR0aChjb25zdCBGREVfQ1NTTEVOR1RIJiBjb2x1bW5SdWxlV2lkdGgpIHsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fQ29sdW1uUnVsZVdpZHRoID0gY29sdW1uUnVsZVdpZHRoOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldENvbHVtbldpZHRoKGNvbnN0IEZERV9DU1NMRU5HVEgmIGNvbHVtbldpZHRoKSB7DQorICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX0NvbHVtbldpZHRoID0gY29sdW1uV2lkdGg7DQorICB9DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRGb250RmFtaWxpZXMoKSBjb25zdCB7DQorICAgIHJldHVybiBtX0luaGVyaXRlZERhdGEubV9wRm9udEZhbWlseQ0KKyAgICAgICAgICAgICAgID8gbV9Jbmhlcml0ZWREYXRhLm1fcEZvbnRGYW1pbHktPkNvdW50VmFsdWVzKCkNCisgICAgICAgICAgICAgICA6IDA7DQorICB9DQorICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKiBHZXRGb250RmFtaWx5KGludDMyX3QgaW5kZXgpIGNvbnN0IHsNCisgICAgcmV0dXJuICgoSUZERV9DU1NQcmltaXRpdmVWYWx1ZSopKG1fSW5oZXJpdGVkRGF0YS5tX3BGb250RmFtaWx5LT5HZXRWYWx1ZSgNCisgICAgICAgICAgICAgICAgaW5kZXgpKSkNCisgICAgICAgIC0+R2V0U3RyaW5nKGluZGV4KTsNCisgIH0NCisgIHZpcnR1YWwgRlhfV09SRCBHZXRGb250V2VpZ2h0KCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1fd0ZvbnRXZWlnaHQ7DQorICB9DQorICB2aXJ0dWFsIEZERV9DU1NGT05UVkFSSUFOVCBHZXRGb250VmFyaWFudCgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChGREVfQ1NTRk9OVFZBUklBTlQpbV9Jbmhlcml0ZWREYXRhLm1fZUZvbnRWYXJpYW50Ow0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTRk9OVFNUWUxFIEdldEZvbnRTdHlsZSgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChGREVfQ1NTRk9OVFNUWUxFKW1fSW5oZXJpdGVkRGF0YS5tX2VGb250U3R5bGU7DQorICB9DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEZvbnRTaXplKCkgY29uc3QgeyByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplOyB9DQorICB2aXJ0dWFsIEZYX0FSR0IgR2V0Q29sb3IoKSBjb25zdCB7IHJldHVybiBtX0luaGVyaXRlZERhdGEubV9kd0ZvbnRDb2xvcjsgfQ0KKyAgdmlydHVhbCB2b2lkIFNldEZvbnRXZWlnaHQoRlhfV09SRCB3Rm9udFdlaWdodCkgew0KKyAgICBtX0luaGVyaXRlZERhdGEubV93Rm9udFdlaWdodCA9IHdGb250V2VpZ2h0Ow0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldEZvbnRWYXJpYW50KEZERV9DU1NGT05UVkFSSUFOVCBlRm9udFZhcmlhbnQpIHsNCisgICAgbV9Jbmhlcml0ZWREYXRhLm1fZUZvbnRWYXJpYW50ID0gZUZvbnRWYXJpYW50Ow0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldEZvbnRTdHlsZShGREVfQ1NTRk9OVFNUWUxFIGVGb250U3R5bGUpIHsNCisgICAgbV9Jbmhlcml0ZWREYXRhLm1fZUZvbnRTdHlsZSA9IGVGb250U3R5bGU7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSB7DQorICAgIG1fSW5oZXJpdGVkRGF0YS5tX2ZGb250U2l6ZSA9IGZGb250U2l6ZTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRDb2xvcihGWF9BUkdCIGR3Rm9udENvbG9yKSB7DQorICAgIG1fSW5oZXJpdGVkRGF0YS5tX2R3Rm9udENvbG9yID0gZHdGb250Q29sb3I7DQorICB9DQorICB2aXJ0dWFsIEZYX0FSR0IgR2V0Qm9yZGVyTGVmdENvbG9yKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fZHdCRFJMZWZ0Q29sb3I7DQorICB9DQorICB2aXJ0dWFsIEZYX0FSR0IgR2V0Qm9yZGVyVG9wQ29sb3IoKSBjb25zdCB7DQorICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9kd0JEUlRvcENvbG9yOw0KKyAgfQ0KKyAgdmlydHVhbCBGWF9BUkdCIEdldEJvcmRlclJpZ2h0Q29sb3IoKSBjb25zdCB7DQorICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9kd0JEUlJpZ2h0Q29sb3I7DQorICB9DQorICB2aXJ0dWFsIEZYX0FSR0IgR2V0Qm9yZGVyQm90dG9tQ29sb3IoKSBjb25zdCB7DQorICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9kd0JEUkJvdHRvbUNvbG9yOw0KKyAgfQ0KKw0KKyAgdmlydHVhbCBGREVfQ1NTQk9SREVSU1RZTEUgR2V0Qm9yZGVyTGVmdFN0eWxlKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKEZERV9DU1NCT1JERVJTVFlMRSltX05vbkluaGVyaXRlZERhdGEubV9lQkRSTGVmdFN0eWxlOw0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTQk9SREVSU1RZTEUgR2V0Qm9yZGVyVG9wU3R5bGUoKSBjb25zdCB7DQorICAgIHJldHVybiAoRkRFX0NTU0JPUkRFUlNUWUxFKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VCRFJUb3BTdHlsZTsNCisgIH0NCisgIHZpcnR1YWwgRkRFX0NTU0JPUkRFUlNUWUxFIEdldEJvcmRlclJpZ2h0U3R5bGUoKSBjb25zdCB7DQorICAgIHJldHVybiAoRkRFX0NTU0JPUkRFUlNUWUxFKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VCRFJSaWdodFN0eWxlOw0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTQk9SREVSU1RZTEUgR2V0Qm9yZGVyQm90dG9tU3R5bGUoKSBjb25zdCB7DQorICAgIHJldHVybiAoRkRFX0NTU0JPUkRFUlNUWUxFKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VCRFJCb3R0b21TdHlsZTsNCisgIH0NCisNCisgIHZpcnR1YWwgY29uc3QgRkRFX0NTU1JFQ1QqIEdldEJvcmRlcldpZHRoKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fYkhhc0JvcmRlciA/ICYobV9Ob25Jbmhlcml0ZWREYXRhLm1fQm9yZGVyV2lkdGgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTDsNCisgIH0NCisgIHZpcnR1YWwgY29uc3QgRkRFX0NTU1JFQ1QqIEdldE1hcmdpbldpZHRoKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fYkhhc01hcmdpbiA/ICYobV9Ob25Jbmhlcml0ZWREYXRhLm1fTWFyZ2luV2lkdGgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTDsNCisgIH0NCisgIHZpcnR1YWwgY29uc3QgRkRFX0NTU1JFQ1QqIEdldFBhZGRpbmdXaWR0aCgpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2JIYXNQYWRkaW5nDQorICAgICAgICAgICAgICAgPyAmKG1fTm9uSW5oZXJpdGVkRGF0YS5tX1BhZGRpbmdXaWR0aCkNCisgICAgICAgICAgICAgICA6IE5VTEw7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0Qm9yZGVyTGVmdENvbG9yKEZYX0FSR0IgZHdCb3JkZXJDb2xvcikgew0KKyAgICBtX05vbkluaGVyaXRlZERhdGEubV9kd0JEUkxlZnRDb2xvciA9IGR3Qm9yZGVyQ29sb3I7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0Qm9yZGVyVG9wQ29sb3IoRlhfQVJHQiBkd0JvcmRlckNvbG9yKSB7DQorICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2R3QkRSVG9wQ29sb3IgPSBkd0JvcmRlckNvbG9yOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldEJvcmRlclJpZ2h0Q29sb3IoRlhfQVJHQiBkd0JvcmRlckNvbG9yKSB7DQorICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2R3QkRSUmlnaHRDb2xvciA9IGR3Qm9yZGVyQ29sb3I7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0Qm9yZGVyQm90dG9tQ29sb3IoRlhfQVJHQiBkd0JvcmRlckNvbG9yKSB7DQorICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2R3QkRSQm90dG9tQ29sb3IgPSBkd0JvcmRlckNvbG9yOw0KKyAgfQ0KKw0KKyAgdmlydHVhbCB2b2lkIFNldEJvcmRlckxlZnRTdHlsZShGREVfQ1NTQk9SREVSU1RZTEUgZUJvcmRlclN0eWxlKSB7DQorICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VCRFJMZWZ0U3R5bGUgPSBlQm9yZGVyU3R5bGU7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0Qm9yZGVyVG9wU3R5bGUoRkRFX0NTU0JPUkRFUlNUWUxFIGVCb3JkZXJTdHlsZSkgew0KKyAgICBtX05vbkluaGVyaXRlZERhdGEubV9lQkRSVG9wU3R5bGUgPSBlQm9yZGVyU3R5bGU7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0Qm9yZGVyUmlnaHRTdHlsZShGREVfQ1NTQk9SREVSU1RZTEUgZUJvcmRlclN0eWxlKSB7DQorICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VCRFJSaWdodFN0eWxlID0gZUJvcmRlclN0eWxlOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldEJvcmRlckJvdHRvbVN0eWxlKEZERV9DU1NCT1JERVJTVFlMRSBlQm9yZGVyU3R5bGUpIHsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZUJEUkJvdHRvbVN0eWxlID0gZUJvcmRlclN0eWxlOw0KKyAgfQ0KKw0KKyAgdmlydHVhbCB2b2lkIFNldEJvcmRlcldpZHRoKGNvbnN0IEZERV9DU1NSRUNUJiByZWN0KSB7DQorICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX0JvcmRlcldpZHRoID0gcmVjdDsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fYkhhc0JvcmRlciA9IFRSVUU7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0TWFyZ2luV2lkdGgoY29uc3QgRkRFX0NTU1JFQ1QmIHJlY3QpIHsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fTWFyZ2luV2lkdGggPSByZWN0Ow0KKyAgICBtX05vbkluaGVyaXRlZERhdGEubV9iSGFzTWFyZ2luID0gVFJVRTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRQYWRkaW5nV2lkdGgoY29uc3QgRkRFX0NTU1JFQ1QmIHJlY3QpIHsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fUGFkZGluZ1dpZHRoID0gcmVjdDsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fYkhhc1BhZGRpbmcgPSBUUlVFOw0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTRElTUExBWSBHZXREaXNwbGF5KCkgY29uc3Qgew0KKyAgICByZXR1cm4gKEZERV9DU1NESVNQTEFZKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VEaXNwbGF5Ow0KKyAgfQ0KKyAgdmlydHVhbCBjb25zdCBGREVfQ1NTU0laRSYgR2V0Qm94U2l6ZSgpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX0JveFNpemU7DQorICB9DQorICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NTSVpFJiBHZXRNaW5Cb3hTaXplKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fTWluQm94U2l6ZTsNCisgIH0NCisgIHZpcnR1YWwgY29uc3QgRkRFX0NTU1NJWkUmIEdldE1heEJveFNpemUoKSBjb25zdCB7DQorICAgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9NYXhCb3hTaXplOw0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTRkxPQVQgR2V0RmxvYXQoKSBjb25zdCB7DQorICAgIHJldHVybiAoRkRFX0NTU0ZMT0FUKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VGbG9hdDsNCisgIH0NCisgIHZpcnR1YWwgRkRFX0NTU0NMRUFSIEdldENsZWFyKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKEZERV9DU1NDTEVBUiltX05vbkluaGVyaXRlZERhdGEubV9lQ2xlYXI7DQorICB9DQorICB2aXJ0dWFsIEZERV9DU1NQT1NJVElPTiBHZXRQb3NpdGlvbigpIGNvbnN0IHsNCisgICAgcmV0dXJuIChGREVfQ1NTUE9TSVRJT04pbV9Ob25Jbmhlcml0ZWREYXRhLm1fZVBvc2l0aW9uOw0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTTEVOR1RIIEdldFRvcCgpIGNvbnN0IHsgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX1RvcDsgfQ0KKyAgdmlydHVhbCBGREVfQ1NTTEVOR1RIIEdldEJvdHRvbSgpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX0JvdHRvbTsNCisgIH0NCisgIHZpcnR1YWwgRkRFX0NTU0xFTkdUSCBHZXRMZWZ0KCkgY29uc3QgeyByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fTGVmdDsgfQ0KKyAgdmlydHVhbCBGREVfQ1NTTEVOR1RIIEdldFJpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fUmlnaHQ7IH0NCisNCisgIHZpcnR1YWwgdm9pZCBTZXREaXNwbGF5KEZERV9DU1NESVNQTEFZIGVEaXNwbGF5KSB7DQorICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VEaXNwbGF5ID0gZURpc3BsYXk7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0Qm94U2l6ZShjb25zdCBGREVfQ1NTU0laRSYgc2l6ZSkgew0KKyAgICBtX05vbkluaGVyaXRlZERhdGEubV9Cb3hTaXplID0gc2l6ZTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRNaW5Cb3hTaXplKGNvbnN0IEZERV9DU1NTSVpFJiBzaXplKSB7DQorICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX01pbkJveFNpemUgPSBzaXplOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldE1heEJveFNpemUoY29uc3QgRkRFX0NTU1NJWkUmIHNpemUpIHsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fTWF4Qm94U2l6ZSA9IHNpemU7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0RmxvYXQoRkRFX0NTU0ZMT0FUIGVGbG9hdCkgew0KKyAgICBtX05vbkluaGVyaXRlZERhdGEubV9lRmxvYXQgPSBlRmxvYXQ7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0Q2xlYXIoRkRFX0NTU0NMRUFSIGVDbGVhcikgew0KKyAgICBtX05vbkluaGVyaXRlZERhdGEubV9lQ2xlYXIgPSBlQ2xlYXI7DQorICB9DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldExpbmVIZWlnaHQoKSBjb25zdCB7DQorICAgIHJldHVybiBtX0luaGVyaXRlZERhdGEubV9mTGluZUhlaWdodDsNCisgIH0NCisgIHZpcnR1YWwgRkRFX0NTU1dISVRFU1BBQ0UgR2V0V2hpdGVTcGFjZSgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChGREVfQ1NTV0hJVEVTUEFDRSltX0luaGVyaXRlZERhdGEubV9lV2hpdGVTcGFjZTsNCisgIH0NCisgIHZpcnR1YWwgY29uc3QgRkRFX0NTU0xFTkdUSCYgR2V0VGV4dEluZGVudCgpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX1RleHRJbmRlbnQ7DQorICB9DQorICB2aXJ0dWFsIEZERV9DU1NURVhUQUxJR04gR2V0VGV4dEFsaWduKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKEZERV9DU1NURVhUQUxJR04pbV9Jbmhlcml0ZWREYXRhLm1fZVRleHRBbGlnaDsNCisgIH0NCisgIHZpcnR1YWwgRkRFX0NTU1ZFUlRJQ0FMQUxJR04gR2V0VmVydGljYWxBbGlnbigpIGNvbnN0IHsNCisgICAgcmV0dXJuIChGREVfQ1NTVkVSVElDQUxBTElHTiltX05vbkluaGVyaXRlZERhdGEubV9lVmVydGljYWxBbGlnbjsNCisgIH0NCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0TnVtYmVyVmVydGljYWxBbGlnbigpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2ZWZXJ0aWNhbEFsaWduOw0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTVEVYVFRSQU5TRk9STSBHZXRUZXh0VHJhbnNmb3JtKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKEZERV9DU1NURVhUVFJBTlNGT1JNKW1fSW5oZXJpdGVkRGF0YS5tX2VUZXh0VHJhbnNmb3JtOw0KKyAgfQ0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRUZXh0RGVjb3JhdGlvbigpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2R3VGV4dERlY29yYXRpb247DQorICB9DQorICB2aXJ0dWFsIGNvbnN0IEZERV9DU1NMRU5HVEgmIEdldExldHRlclNwYWNpbmcoKSBjb25zdCB7DQorICAgIHJldHVybiBtX0luaGVyaXRlZERhdGEubV9MZXR0ZXJTcGFjaW5nOw0KKyAgfQ0KKyAgdmlydHVhbCBjb25zdCBGREVfQ1NTTEVOR1RIJiBHZXRXb3JkU3BhY2luZygpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX1dvcmRTcGFjaW5nOw0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTV1JJVElOR01PREUgR2V0V3JpdGluZ01vZGUoKSBjb25zdCB7DQorICAgIHJldHVybiAoRkRFX0NTU1dSSVRJTkdNT0RFKW1fSW5oZXJpdGVkRGF0YS5tX2VXcml0aW5nTW9kZTsNCisgIH0NCisgIHZpcnR1YWwgRkRFX0NTU1dPUkRCUkVBSyBHZXRXb3JkQnJlYWsoKSBjb25zdCB7DQorICAgIHJldHVybiAoRkRFX0NTU1dPUkRCUkVBSyltX0luaGVyaXRlZERhdGEubV9lV29yZEJyZWFrOw0KKyAgfQ0KKyAgdmlydHVhbCBpbnQzMl90IEdldFdpZG93cygpIGNvbnN0IHsgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX2lXaWRvd3M7IH0NCisgIHZpcnR1YWwgRlhfQVJHQiBHZXRUZXh0RW1waGFzaXNDb2xvcigpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX2JUZXh0RW1waGFzaXNDb2xvckN1cnJlbnQNCisgICAgICAgICAgICAgICA/IG1fSW5oZXJpdGVkRGF0YS5tX2R3Rm9udENvbG9yDQorICAgICAgICAgICAgICAgOiBtX0luaGVyaXRlZERhdGEubV9kd1RleHRFbXBoYXNpc0NvbG9yOw0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTUEFHRUJSRUFLIEdldFBhZ2VCcmVha0JlZm9yZSgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChGREVfQ1NTUEFHRUJSRUFLKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VQYWdlQnJlYWtCZWZvcmU7DQorICB9DQorICB2aXJ0dWFsIEZERV9DU1NQQUdFQlJFQUsgR2V0UGFnZUJyZWFrQWZ0ZXIoKSBjb25zdCB7DQorICAgIHJldHVybiAoRkRFX0NTU1BBR0VCUkVBSyltX05vbkluaGVyaXRlZERhdGEubV9lUGFnZUJyZWFrQWZ0ZXI7DQorICB9DQorICB2aXJ0dWFsIEZERV9DU1NQQUdFQlJFQUsgR2V0UGFnZUJyZWFrSW5zaWRlKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKEZERV9DU1NQQUdFQlJFQUspbV9Ob25Jbmhlcml0ZWREYXRhLm1fZVBhZ2VCcmVha0luc2lkZTsNCisgIH0NCisgIHZpcnR1YWwgaW50MzJfdCBHZXRPcnBoYW5zKCkgY29uc3QgeyByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1faU9ycGhhbnM7IH0NCisgIHZpcnR1YWwgRkRFX0NTU0xJTkVCUkVBSyBHZXRMaW5lQnJlYWsoKSBjb25zdCB7DQorICAgIHJldHVybiAoRkRFX0NTU0xJTkVCUkVBSyltX0luaGVyaXRlZERhdGEubV9lTGluZUJyZWFrOw0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTVEVYVEVNUEhBU0lTTUFSSyBHZXRUZXh0RW1waGFzaXNNYXJrKCkgY29uc3Q7DQorICB2aXJ0dWFsIEZERV9DU1NURVhURU1QSEFTSVNGSUxMIEdldFRleHRFbXBoYXNpc0ZpbGwoKSBjb25zdCB7DQorICAgIHJldHVybiAoRkRFX0NTU1RFWFRFTVBIQVNJU0ZJTEwpbV9Jbmhlcml0ZWREYXRhLm1fZVRleHRFbXBoYXNpc0ZpbGw7DQorICB9DQorICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKiBHZXRUZXh0RW1waGFzaXNDdXN0b20oKSBjb25zdCB7DQorICAgIEZYU1lTX2Fzc2VydChtX0luaGVyaXRlZERhdGEubV9lVGV4dEVtcGhhc2lzTWFyayA9PQ0KKyAgICAgICAgICAgICAgICAgRkRFX0NTU1RFWFRFTVBIQVNJU01BUktfQ3VzdG9tKTsNCisgICAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX3BzelRleHRFbXBoYXNpc0N1c3RvbU1hcms7DQorICB9DQorICB2aXJ0dWFsIEZERV9DU1NURVhUQ09NQklORSBHZXRUZXh0Q29tYmluZVR5cGUoKSBjb25zdCB7DQorICAgIHJldHVybiAoRkRFX0NTU1RFWFRDT01CSU5FKW1fTm9uSW5oZXJpdGVkRGF0YS5tX2VUZXh0Q29tYmluZTsNCisgIH0NCisgIHZpcnR1YWwgRlhfQk9PTCBIYXNUZXh0Q29tYmluZU51bWJlcigpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2JIYXNUZXh0Q29tYmluZU51bWJlcjsNCisgIH0NCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0VGV4dENvbWJpbmVOdW1iZXIoKSBjb25zdCB7DQorICAgIEZYU1lTX2Fzc2VydChtX05vbkluaGVyaXRlZERhdGEubV9lVGV4dENvbWJpbmUgPT0NCisgICAgICAgICAgICAgICAgIEZERV9DU1NURVhUQ09NQklORV9Ib3Jpem9udGFsKTsNCisgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2ZUZXh0Q29tYmluZU51bWJlcjsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRMaW5lSGVpZ2h0KEZYX0ZMT0FUIGZMaW5lSGVpZ2h0KSB7DQorICAgIG1fSW5oZXJpdGVkRGF0YS5tX2ZMaW5lSGVpZ2h0ID0gZkxpbmVIZWlnaHQ7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0V2hpdGVTcGFjZShGREVfQ1NTV0hJVEVTUEFDRSBlV2hpdGVTcGFjZSkgew0KKyAgICBtX0luaGVyaXRlZERhdGEubV9lV2hpdGVTcGFjZSA9IGVXaGl0ZVNwYWNlOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldFRleHRJbmRlbnQoY29uc3QgRkRFX0NTU0xFTkdUSCYgdGV4dEluZGVudCkgew0KKyAgICBtX0luaGVyaXRlZERhdGEubV9UZXh0SW5kZW50ID0gdGV4dEluZGVudDsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRUZXh0QWxpZ24oRkRFX0NTU1RFWFRBTElHTiBlVGV4dEFsaWduKSB7DQorICAgIG1fSW5oZXJpdGVkRGF0YS5tX2VUZXh0QWxpZ2ggPSBlVGV4dEFsaWduOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldFZlcnRpY2FsQWxpZ24oRkRFX0NTU1ZFUlRJQ0FMQUxJR04gZVZlcnRpY2FsQWxpZ24pIHsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZVZlcnRpY2FsQWxpZ24gPSBlVmVydGljYWxBbGlnbjsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXROdW1iZXJWZXJ0aWNhbEFsaWduKEZYX0ZMT0FUIGZBbGlnbikgew0KKyAgICBtX05vbkluaGVyaXRlZERhdGEubV9lVmVydGljYWxBbGlnbiA9IEZERV9DU1NWRVJUSUNBTEFMSUdOX051bWJlciwNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZlZlcnRpY2FsQWxpZ24gPSBmQWxpZ247DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0VGV4dFRyYW5zZm9ybShGREVfQ1NTVEVYVFRSQU5TRk9STSBlVGV4dFRyYW5zZm9ybSkgew0KKyAgICBtX0luaGVyaXRlZERhdGEubV9lVGV4dFRyYW5zZm9ybSA9IGVUZXh0VHJhbnNmb3JtOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldFRleHREZWNvcmF0aW9uKEZYX0RXT1JEIGR3VGV4dERlY29yYXRpb24pIHsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZHdUZXh0RGVjb3JhdGlvbiA9IGR3VGV4dERlY29yYXRpb247DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0TGV0dGVyU3BhY2luZyhjb25zdCBGREVfQ1NTTEVOR1RIJiBsZXR0ZXJTcGFjaW5nKSB7DQorICAgIG1fSW5oZXJpdGVkRGF0YS5tX0xldHRlclNwYWNpbmcgPSBsZXR0ZXJTcGFjaW5nOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldFdvcmRTcGFjaW5nKGNvbnN0IEZERV9DU1NMRU5HVEgmIHdvcmRTcGFjaW5nKSB7DQorICAgIG1fSW5oZXJpdGVkRGF0YS5tX1dvcmRTcGFjaW5nID0gd29yZFNwYWNpbmc7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0V3JpdGluZ01vZGUoRkRFX0NTU1dSSVRJTkdNT0RFIGVXcml0aW5nTW9kZSkgew0KKyAgICBtX0luaGVyaXRlZERhdGEubV9lV3JpdGluZ01vZGUgPSBlV3JpdGluZ01vZGU7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0V29yZEJyZWFrKEZERV9DU1NXT1JEQlJFQUsgZVdvcmRCcmVhaykgew0KKyAgICBtX0luaGVyaXRlZERhdGEubV9lV29yZEJyZWFrID0gZVdvcmRCcmVhazsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRXaWRvd3MoaW50MzJfdCBpV2lkb3dzKSB7DQorICAgIG1fSW5oZXJpdGVkRGF0YS5tX2lXaWRvd3MgPSBpV2lkb3dzOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldFRleHRFbXBoYXNpc0NvbG9yKEZYX0FSR0IgZHdUZXh0RW1waGFzaXNDb2xvcikgew0KKyAgICBtX0luaGVyaXRlZERhdGEubV9kd1RleHRFbXBoYXNpc0NvbG9yID0gZHdUZXh0RW1waGFzaXNDb2xvciwNCisgICAgbV9Jbmhlcml0ZWREYXRhLm1fYlRleHRFbXBoYXNpc0NvbG9yQ3VycmVudCA9IEZBTFNFOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldFBhZ2VCcmVha0JlZm9yZShGREVfQ1NTUEFHRUJSRUFLIGVQYWdlQnJlYWtCZWZvcmUpIHsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZVBhZ2VCcmVha0JlZm9yZSA9IGVQYWdlQnJlYWtCZWZvcmU7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0UGFnZUJyZWFrQWZ0ZXIoRkRFX0NTU1BBR0VCUkVBSyBlUGFnZUJyZWFrQWZ0ZXIpIHsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZVBhZ2VCcmVha0FmdGVyID0gZVBhZ2VCcmVha0FmdGVyOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldFBhZ2VCcmVha0luc2lkZShGREVfQ1NTUEFHRUJSRUFLIGVQYWdlQnJlYWtJbnNpZGUpIHsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZVBhZ2VCcmVha0luc2lkZSA9IGVQYWdlQnJlYWtJbnNpZGU7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0T3JwaGFucyhpbnQzMl90IGlPcnBoYW5zKSB7DQorICAgIG1fSW5oZXJpdGVkRGF0YS5tX2lPcnBoYW5zID0gaU9ycGhhbnM7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0TGluZUJyZWFrKEZERV9DU1NMSU5FQlJFQUsgZUxpbmVCcmVhaykgew0KKyAgICBtX0luaGVyaXRlZERhdGEubV9lTGluZUJyZWFrID0gZUxpbmVCcmVhazsNCisgIH0NCisgIHZpcnR1YWwgRlhfQVJHQiBHZXRCS0dDb2xvcigpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2R3QktHQ29sb3I7DQorICB9DQorICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKiBHZXRCS0dJbWFnZSgpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX3BzekJLR0ltYWdlOw0KKyAgfQ0KKyAgdmlydHVhbCBjb25zdCBGREVfQ1NTUE9JTlQmIEdldEJLR1Bvc2l0aW9uKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fQktHUG9zaXRpb247DQorICB9DQorICB2aXJ0dWFsIEZERV9DU1NCS0dSRVBFQVQgR2V0QktHUmVwZWF0KCkgY29uc3Qgew0KKyAgICByZXR1cm4gKEZERV9DU1NCS0dSRVBFQVQpbV9Ob25Jbmhlcml0ZWREYXRhLm1fZUJLR1JlcGVhdDsNCisgIH0NCisgIHZpcnR1YWwgRkRFX0NTU0JLR0FUVEFDSE1FTlQgR2V0QktHQXR0YWNobWVudCgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChGREVfQ1NTQktHQVRUQUNITUVOVCltX05vbkluaGVyaXRlZERhdGEubV9lQktHQXR0YWNobWVudDsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRCS0dDb2xvcihGWF9BUkdCIGR3QktHQ29sb3IpIHsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZHdCS0dDb2xvciA9IGR3QktHQ29sb3I7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0QktHUG9zaXRpb24oY29uc3QgRkRFX0NTU1BPSU5UJiBia2dQb3NpdGlvbikgew0KKyAgICBtX05vbkluaGVyaXRlZERhdGEubV9CS0dQb3NpdGlvbiA9IGJrZ1Bvc2l0aW9uOw0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTVklTSUJJTElUWSBHZXRWaXNpYmlsaXR5KCkgY29uc3Qgew0KKyAgICByZXR1cm4gKEZERV9DU1NWSVNJQklMSVRZKW1fSW5oZXJpdGVkRGF0YS5tX2VWaXNpYmlsaXR5Ow0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTT1ZFUkZMT1cgR2V0T3ZlcmZsb3dYKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKEZERV9DU1NPVkVSRkxPVyltX05vbkluaGVyaXRlZERhdGEubV9lT3ZlcmZsb3dYOw0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTT1ZFUkZMT1cgR2V0T3ZlcmZsb3dZKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKEZERV9DU1NPVkVSRkxPVyltX05vbkluaGVyaXRlZERhdGEubV9lT3ZlcmZsb3dZOw0KKyAgfQ0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50Q3Vyc29yVXJscygpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX3BDdXJzb3JVcmlzID09IE5VTEwNCisgICAgICAgICAgICAgICA/IDANCisgICAgICAgICAgICAgICA6IG1fSW5oZXJpdGVkRGF0YS5tX3BDdXJzb3JVcmlzLT5Db3VudFZhbHVlcygpOw0KKyAgfQ0KKyAgdmlydHVhbCBjb25zdCBGWF9XQ0hBUiogR2V0Q3Vyc29yVXJsKGludDMyX3QgaW5kZXgpIGNvbnN0IHsNCisgICAgRlhTWVNfYXNzZXJ0KG1fSW5oZXJpdGVkRGF0YS5tX3BDdXJzb3JVcmlzICE9IE5VTEwpOw0KKyAgICByZXR1cm4gKChJRkRFX0NTU1ByaW1pdGl2ZVZhbHVlKikobV9Jbmhlcml0ZWREYXRhLm1fcEN1cnNvclVyaXMtPkdldFZhbHVlKA0KKyAgICAgICAgICAgICAgICBpbmRleCkpKQ0KKyAgICAgICAgLT5HZXRTdHJpbmcoaW5kZXgpOw0KKyAgfQ0KKyAgdmlydHVhbCBGREVfQ1NTQ1VSU09SIEdldEN1cnNvclR5cGUoKSBjb25zdCB7DQorICAgIHJldHVybiBtX0luaGVyaXRlZERhdGEubV9lQ3Vyc29yOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldFZpc2liaWxpdHkoRkRFX0NTU1ZJU0lCSUxJVFkgZVZpc2liaWxpdHkpIHsNCisgICAgbV9Jbmhlcml0ZWREYXRhLm1fZVZpc2liaWxpdHkgPSBlVmlzaWJpbGl0eTsNCisgIH0NCisgIHZpcnR1YWwgRkRFX0NTU0xJU1RTVFlMRVRZUEUgR2V0TGlzdFN0eWxlVHlwZSgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChGREVfQ1NTTElTVFNUWUxFVFlQRSltX05vbkluaGVyaXRlZERhdGEubV9lTGlzdFN0eWxlVHlwZTsNCisgIH0NCisgIHZpcnR1YWwgRkRFX0NTU0xJU1RTVFlMRVBPU0lUSU9OIEdldExpc3RTdHlsZVBvc2l0aW9uKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKEZERV9DU1NMSVNUU1RZTEVQT1NJVElPTiltX05vbkluaGVyaXRlZERhdGEubV9lTGlzdFN0eWxlUG9zaXRpb247DQorICB9DQorICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKiBHZXRMaXN0U3R5bGVJbWFnZSgpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX3Bzekxpc3RTdHlsZUltYWdlOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldExpc3RTdHlsZVR5cGUoRkRFX0NTU0xJU1RTVFlMRVRZUEUgZUxpc3RTdHlsZVR5cGUpIHsNCisgICAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZUxpc3RTdHlsZVR5cGUgPSBlTGlzdFN0eWxlVHlwZTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRMaXN0U3R5bGVQb3NpdGlvbigNCisgICAgICBGREVfQ1NTTElTVFNUWUxFUE9TSVRJT04gZUxpc3RTdHlsZVBvc2l0aW9uKSB7DQorICAgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VMaXN0U3R5bGVQb3NpdGlvbiA9IGVMaXN0U3R5bGVQb3NpdGlvbjsNCisgIH0NCisgIHZvaWQgQWRkQ3VzdG9tU3R5bGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpIHsNCisgICAgbV9DdXN0b21Qcm9wZXJ0aWVzLkFkZCh3c05hbWUpOw0KKyAgICBtX0N1c3RvbVByb3BlcnRpZXMuQWRkKHdzVmFsdWUpOw0KKyAgfQ0KKyAgRlhfRFdPUkQgbV9kd1JlZkNvdW50Ow0KKyAgSUZYX01FTUFsbG9jYXRvciogbV9wQWxsb2NhdG9yOw0KKyAgQ0ZERV9DU1NJbmhlcml0ZWREYXRhIG1fSW5oZXJpdGVkRGF0YTsNCisgIENGREVfQ1NTTm9uSW5oZXJpdGVkRGF0YSBtX05vbkluaGVyaXRlZERhdGE7DQorICBDRlhfV2lkZVN0cmluZ0FycmF5IG1fQ3VzdG9tUHJvcGVydGllczsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N0eWxlc2hlZXQuY3BwIGIveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3Nzc3R5bGVzaGVldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU5NTY3ZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N0eWxlc2hlZXQuY3BwCkBAIC0wLDAgKzEsNTA1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgImZkZV9jc3NzeW50YXguaCINCisjaW5jbHVkZSAiZmRlX2Nzc2RhdGF0YWJsZS5oIg0KKyNpbmNsdWRlICJmZGVfY3Nzc3R5bGVzaGVldC5oIg0KK0lGREVfQ1NTU3R5bGVTaGVldCogSUZERV9DU1NTdHlsZVNoZWV0OjpMb2FkSFRNTFN0YW5kYXJkU3R5bGVTaGVldCgpIHsNCisgIHN0YXRpYyBjb25zdCBGWF9XQ0hBUiogc19wU3R5bGUgPQ0KKyAgICAgIEwiaHRtbCxhZGRyZXNzLGJsb2NrcXVvdGUsYm9keSxkZCxkaXYsZGwsZHQsZmllbGRzZXQsZm9ybSxmcmFtZSxmcmFtZXNldCwiDQorICAgICAgTCJoMSxoMixoMyxoNCxoNSxoNixub2ZyYW1lcyxvbCxwLHVsLGNlbnRlcixkaXIsaHIsbWVudSxwcmV7ZGlzcGxheToiDQorICAgICAgTCJibG9ja30iDQorICAgICAgTCJsaXtkaXNwbGF5Omxpc3QtaXRlbX1oZWFke2Rpc3BsYXk6bm9uZX10YWJsZXtkaXNwbGF5OnRhYmxlfXRye2Rpc3BsYXk6Ig0KKyAgICAgIEwidGFibGUtcm93fXRoZWFke2Rpc3BsYXk6dGFibGUtaGVhZGVyLWdyb3VwfXRib2R5e2Rpc3BsYXk6dGFibGUtcm93LSINCisgICAgICBMImdyb3VwfXRmb290e2Rpc3BsYXk6dGFibGUtZm9vdGVyLWdyb3VwfSINCisgICAgICBMImNvbHtkaXNwbGF5OnRhYmxlLWNvbHVtbn1jb2xncm91cHtkaXNwbGF5OnRhYmxlLWNvbHVtbi1ncm91cH10ZCx0aHsiDQorICAgICAgTCJkaXNwbGF5OnRhYmxlLWNlbGx9Y2FwdGlvbntkaXNwbGF5OnRhYmxlLWNhcHRpb259dGh7Zm9udC13ZWlnaHQ6Ym9sZGVyOyINCisgICAgICBMInRleHQtYWxpZ246Y2VudGVyfWNhcHRpb257dGV4dC1hbGlnbjpjZW50ZXJ9Ig0KKyAgICAgIEwiYm9keXttYXJnaW46MH1oMXtmb250LXNpemU6MmVtO21hcmdpbjouNjdlbSAiDQorICAgICAgTCIwfWgye2ZvbnQtc2l6ZToxLjVlbTttYXJnaW46Ljc1ZW0gMH1oM3tmb250LXNpemU6MS4xN2VtO21hcmdpbjouODNlbSAiDQorICAgICAgTCIwfWg0LHAsYmxvY2txdW90ZSx1bCxmaWVsZHNldCxmb3JtLG9sLGRsLGRpcixtZW51e21hcmdpbjoxLjEyZW0gMH0iDQorICAgICAgTCJoNXtmb250LXNpemU6LjgzZW07bWFyZ2luOjEuNWVtIDB9aDZ7Zm9udC1zaXplOi43NWVtO21hcmdpbjoxLjY3ZW0gIg0KKyAgICAgIEwiMH1oMSxoMixoMyxoNCxoNSxoNixiLHN0cm9uZ3tmb250LXdlaWdodDpib2xkZXJ9YmxvY2txdW90ZXttYXJnaW4tbGVmdDoiDQorICAgICAgTCI0MHB4O21hcmdpbi1yaWdodDo0MHB4fWksY2l0ZSxlbSx2YXIsYWRkcmVzc3tmb250LXN0eWxlOml0YWxpY30iDQorICAgICAgTCJwcmUsdHQsY29kZSxrYmQsc2FtcHtmb250LWZhbWlseTptb25vc3BhY2V9cHJle3doaXRlLXNwYWNlOnByZX1idXR0b24sIg0KKyAgICAgIEwidGV4dGFyZWEsaW5wdXQsc2VsZWN0e2Rpc3BsYXk6aW5saW5lLWJsb2NrfWJpZ3tmb250LXNpemU6MS4xN2VtfXNtYWxsLCINCisgICAgICBMInN1YixzdXB7Zm9udC1zaXplOi44M2VtfXN1Ynt2ZXJ0aWNhbC1hbGlnbjpzdWJ9Ig0KKyAgICAgIEwic3Vwe3ZlcnRpY2FsLWFsaWduOnN1cGVyfXRhYmxle2JvcmRlci1zcGFjaW5nOjJweH10aGVhZCx0Ym9keSx0Zm9vdHsiDQorICAgICAgTCJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9dGQsdGgsdHJ7dmVydGljYWwtYWxpZ246aW5oZXJpdH1zLHN0cmlrZSxkZWx7Ig0KKyAgICAgIEwidGV4dC1kZWNvcmF0aW9uOmxpbmUtdGhyb3VnaH1ocntib3JkZXI6MXB4IGluc2V0IHNpbHZlcn0iDQorICAgICAgTCJvbCx1bCxkaXIsbWVudSxkZHttYXJnaW4tbGVmdDo0MHB4fW9se2xpc3Qtc3R5bGUtdHlwZTpkZWNpbWFsfW9sIHVsLHVsICINCisgICAgICBMIm9sLHVsIHVsLG9sICINCisgICAgICBMIm9se21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjB9dSxpbnN7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX1jZW50ZXJ7Ig0KKyAgICAgIEwidGV4dC1hbGlnbjpjZW50ZXJ9Ig0KKyAgICAgIEwicnVieXtkaXNwbGF5OnJ1Ynl9cnR7ZGlzcGxheTpydWJ5LXRleHQ7Zm9udC1zaXplOi41ZW19cmJ7ZGlzcGxheTpydWJ5LSINCisgICAgICBMImJhc2V9cmJje2Rpc3BsYXk6cnVieS1iYXNlLWdyb3VwfXJ0Y3tkaXNwbGF5OnJ1YnktdGV4dC1ncm91cH0iDQorICAgICAgTCJxOmJlZm9yZXtjb250ZW50Om9wZW4tcXVvdGV9cTphZnRlcntjb250ZW50OmNsb3NlLXF1b3RlfSINCisgICAgICBMInJwe2Rpc3BsYXk6bm9uZX0iOw0KKyAgcmV0dXJuIElGREVfQ1NTU3R5bGVTaGVldDo6TG9hZEZyb21CdWZmZXIoDQorICAgICAgQ0ZYX1dpZGVTdHJpbmcoKSwgc19wU3R5bGUsIEZYU1lTX3djc2xlbihzX3BTdHlsZSksIEZYX0NPREVQQUdFX1VURjgpOw0KK30NCitJRkRFX0NTU1N0eWxlU2hlZXQqIElGREVfQ1NTU3R5bGVTaGVldDo6TG9hZEZyb21TdHJlYW0oDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzelVybCwNCisgICAgSUZYX1N0cmVhbSogcFN0cmVhbSwNCisgICAgRlhfV09SRCB3Q29kZVBhZ2UsDQorICAgIEZYX0RXT1JEIGR3TWVkaWFMaXN0KSB7DQorICBDRkRFX0NTU1N0eWxlU2hlZXQqIHBTdHlsZVNoZWV0ID0gbmV3IENGREVfQ1NTU3R5bGVTaGVldChkd01lZGlhTGlzdCk7DQorICBpZiAoIXBTdHlsZVNoZWV0LT5Mb2FkRnJvbVN0cmVhbShzelVybCwgcFN0cmVhbSwgd0NvZGVQYWdlKSkgew0KKyAgICBwU3R5bGVTaGVldC0+UmVsZWFzZSgpOw0KKyAgICBwU3R5bGVTaGVldCA9IE5VTEw7DQorICB9DQorICByZXR1cm4gcFN0eWxlU2hlZXQ7DQorfQ0KK0lGREVfQ1NTU3R5bGVTaGVldCogSUZERV9DU1NTdHlsZVNoZWV0OjpMb2FkRnJvbUJ1ZmZlcigNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN6VXJsLA0KKyAgICBjb25zdCBGWF9XQ0hBUiogcEJ1ZmZlciwNCisgICAgaW50MzJfdCBpQnVmU2l6ZSwNCisgICAgRlhfV09SRCB3Q29kZVBhZ2UsDQorICAgIEZYX0RXT1JEIGR3TWVkaWFMaXN0KSB7DQorICBDRkRFX0NTU1N0eWxlU2hlZXQqIHBTdHlsZVNoZWV0ID0gbmV3IENGREVfQ1NTU3R5bGVTaGVldChkd01lZGlhTGlzdCk7DQorICBpZiAoIXBTdHlsZVNoZWV0LT5Mb2FkRnJvbUJ1ZmZlcihzelVybCwgcEJ1ZmZlciwgaUJ1ZlNpemUsIHdDb2RlUGFnZSkpIHsNCisgICAgcFN0eWxlU2hlZXQtPlJlbGVhc2UoKTsNCisgICAgcFN0eWxlU2hlZXQgPSBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIHBTdHlsZVNoZWV0Ow0KK30NCitDRkRFX0NTU1N0eWxlU2hlZXQ6OkNGREVfQ1NTU3R5bGVTaGVldChGWF9EV09SRCBkd01lZGlhTGlzdCkNCisgICAgOiBtX3dDb2RlUGFnZShGWF9DT0RFUEFHRV9VVEY4KSwNCisgICAgICBtX3dSZWZDb3VudCgxKSwNCisgICAgICBtX2R3TWVkaWFMaXN0KGR3TWVkaWFMaXN0KSwNCisgICAgICBtX3BBbGxvY2F0b3IoTlVMTCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fZHdNZWRpYUxpc3QgPiAwKTsNCit9DQorQ0ZERV9DU1NTdHlsZVNoZWV0Ojp+Q0ZERV9DU1NTdHlsZVNoZWV0KCkgew0KKyAgUmVzZXQoKTsNCit9DQordm9pZCBDRkRFX0NTU1N0eWxlU2hlZXQ6OlJlc2V0KCkgew0KKyAgZm9yIChpbnQzMl90IGkgPSBtX1J1bGVBcnJheS5HZXRTaXplKCkgLSAxOyBpID49IDA7IC0taSkgew0KKyAgICBJRkRFX0NTU1J1bGUqIHBSdWxlID0gbV9SdWxlQXJyYXkuR2V0QXQoaSk7DQorICAgIHN3aXRjaCAocFJ1bGUtPkdldFR5cGUoKSkgew0KKyAgICAgIGNhc2UgRkRFX0NTU1JVTEVUWVBFX1N0eWxlOg0KKyAgICAgICAgKChDRkRFX0NTU1N0eWxlUnVsZSopcFJ1bGUpLT5+Q0ZERV9DU1NTdHlsZVJ1bGUoKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1JVTEVUWVBFX01lZGlhOg0KKyAgICAgICAgKChDRkRFX0NTU01lZGlhUnVsZSopcFJ1bGUpLT5+Q0ZERV9DU1NNZWRpYVJ1bGUoKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1JVTEVUWVBFX0ZvbnRGYWNlOg0KKyAgICAgICAgKChDRkRFX0NTU0ZvbnRGYWNlUnVsZSopcFJ1bGUpLT5+Q0ZERV9DU1NGb250RmFjZVJ1bGUoKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBGWFNZU19hc3NlcnQoRkFMU0UpOw0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIG1fUnVsZUFycmF5LlJlbW92ZUFsbCgpOw0KKyAgbV9TZWxlY3RvcnMuUmVtb3ZlQWxsKCk7DQorICBtX1N0cmluZ0NhY2hlLlJlbW92ZUFsbCgpOw0KKyAgaWYgKG1fcEFsbG9jYXRvcikgew0KKyAgICBtX3BBbGxvY2F0b3ItPlJlbGVhc2UoKTsNCisgICAgbV9wQWxsb2NhdG9yID0gTlVMTDsNCisgIH0NCit9DQorRlhfRFdPUkQgQ0ZERV9DU1NTdHlsZVNoZWV0OjpBZGRSZWYoKSB7DQorICByZXR1cm4gKyttX3dSZWZDb3VudDsNCit9DQorRlhfRFdPUkQgQ0ZERV9DU1NTdHlsZVNoZWV0OjpSZWxlYXNlKCkgew0KKyAgRlhfRFdPUkQgZHdSZWZDb3VudCA9IC0tbV93UmVmQ291bnQ7DQorICBpZiAoZHdSZWZDb3VudCA9PSAwKSB7DQorICAgIGRlbGV0ZSB0aGlzOw0KKyAgfQ0KKyAgcmV0dXJuIGR3UmVmQ291bnQ7DQorfQ0KK2ludDMyX3QgQ0ZERV9DU1NTdHlsZVNoZWV0OjpDb3VudFJ1bGVzKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fUnVsZUFycmF5LkdldFNpemUoKTsNCit9DQorSUZERV9DU1NSdWxlKiBDRkRFX0NTU1N0eWxlU2hlZXQ6OkdldFJ1bGUoaW50MzJfdCBpbmRleCkgew0KKyAgcmV0dXJuIG1fUnVsZUFycmF5LkdldEF0KGluZGV4KTsNCit9DQorRlhfQk9PTCBDRkRFX0NTU1N0eWxlU2hlZXQ6OkxvYWRGcm9tU3RyZWFtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzelVybCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1N0cmVhbSogcFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UpIHsNCisgIEZYU1lTX2Fzc2VydChwU3RyZWFtICE9IE5VTEwpOw0KKyAgSUZERV9DU1NTeW50YXhQYXJzZXIqIHBTeW50YXggPSBJRkRFX0NTU1N5bnRheFBhcnNlcjo6Q3JlYXRlKCk7DQorICBpZiAocFN5bnRheCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChwU3RyZWFtLT5HZXRDb2RlUGFnZSgpICE9IHdDb2RlUGFnZSkgew0KKyAgICBwU3RyZWFtLT5TZXRDb2RlUGFnZSh3Q29kZVBhZ2UpOw0KKyAgfQ0KKyAgRlhfQk9PTCBiUmV0ID0gcFN5bnRheC0+SW5pdChwU3RyZWFtLCA0MDk2KSAmJiBMb2FkRnJvbVN5bnRheChwU3ludGF4KTsNCisgIHBTeW50YXgtPlJlbGVhc2UoKTsNCisgIG1fd0NvZGVQYWdlID0gd0NvZGVQYWdlOw0KKyAgbV9zelVybCA9IHN6VXJsOw0KKyAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9DU1NTdHlsZVNoZWV0OjpMb2FkRnJvbUJ1ZmZlcihjb25zdCBDRlhfV2lkZVN0cmluZyYgc3pVcmwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwQnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCdWZTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSkgew0KKyAgRlhTWVNfYXNzZXJ0KHBCdWZmZXIgIT0gTlVMTCAmJiBpQnVmU2l6ZSA+IDApOw0KKyAgSUZERV9DU1NTeW50YXhQYXJzZXIqIHBTeW50YXggPSBJRkRFX0NTU1N5bnRheFBhcnNlcjo6Q3JlYXRlKCk7DQorICBpZiAocFN5bnRheCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZYX0JPT0wgYlJldCA9IHBTeW50YXgtPkluaXQocEJ1ZmZlciwgaUJ1ZlNpemUpICYmIExvYWRGcm9tU3ludGF4KHBTeW50YXgpOw0KKyAgcFN5bnRheC0+UmVsZWFzZSgpOw0KKyAgbV93Q29kZVBhZ2UgPSB3Q29kZVBhZ2U7DQorICBtX3N6VXJsID0gc3pVcmw7DQorICByZXR1cm4gYlJldDsNCit9DQorRlhfQk9PTCBDRkRFX0NTU1N0eWxlU2hlZXQ6OkxvYWRGcm9tU3ludGF4KElGREVfQ1NTU3ludGF4UGFyc2VyKiBwU3ludGF4KSB7DQorICBSZXNldCgpOw0KKyAgbV9wQWxsb2NhdG9yID0gRlhfQ3JlYXRlQWxsb2NhdG9yKEZYX0FMTE9DVFlQRV9TdGF0aWMsIDEwMjQsIDApOw0KKyAgaWYgKG1fcEFsbG9jYXRvciA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZERV9DU1NTWU5UQVhTVEFUVVMgZVN0YXR1czsNCisgIGRvIHsNCisgICAgc3dpdGNoIChlU3RhdHVzID0gcFN5bnRheC0+RG9TeW50YXhQYXJzZSgpKSB7DQorICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX1N0eWxlUnVsZToNCisgICAgICAgIGVTdGF0dXMgPSBMb2FkU3R5bGVSdWxlKHBTeW50YXgsIG1fUnVsZUFycmF5KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19NZWRpYVJ1bGU6DQorICAgICAgICBlU3RhdHVzID0gTG9hZE1lZGlhUnVsZShwU3ludGF4KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19Gb250RmFjZVJ1bGU6DQorICAgICAgICBlU3RhdHVzID0gTG9hZEZvbnRGYWNlUnVsZShwU3ludGF4LCBtX1J1bGVBcnJheSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfSW1wb3J0UnVsZToNCisgICAgICAgIGVTdGF0dXMgPSBMb2FkSW1wb3J0UnVsZShwU3ludGF4KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19QYWdlUnVsZToNCisgICAgICAgIGVTdGF0dXMgPSBMb2FkUGFnZVJ1bGUocFN5bnRheCk7DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0gd2hpbGUgKGVTdGF0dXMgPj0gRkRFX0NTU1NZTlRBWFNUQVRVU19Ob25lKTsNCisgIG1fU2VsZWN0b3JzLlJlbW92ZUFsbCgpOw0KKyAgbV9TdHJpbmdDYWNoZS5SZW1vdmVBbGwoKTsNCisgIHJldHVybiBlU3RhdHVzICE9IEZERV9DU1NTWU5UQVhTVEFUVVNfRXJyb3I7DQorfQ0KK0ZERV9DU1NTWU5UQVhTVEFUVVMgQ0ZERV9DU1NTdHlsZVNoZWV0OjpMb2FkTWVkaWFSdWxlKA0KKyAgICBJRkRFX0NTU1N5bnRheFBhcnNlciogcFN5bnRheCkgew0KKyAgRlhfRFdPUkQgZHdNZWRpYUxpc3QgPSAwOw0KKyAgQ0ZERV9DU1NNZWRpYVJ1bGUqIHBNZWRpYVJ1bGUgPSBOVUxMOw0KKyAgZm9yICg7Oykgew0KKyAgICBzd2l0Y2ggKHBTeW50YXgtPkRvU3ludGF4UGFyc2UoKSkgew0KKyAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19NZWRpYVR5cGU6IHsNCisgICAgICAgIGludDMyX3QgaUxlbjsNCisgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3ogPSBwU3ludGF4LT5HZXRDdXJyZW50U3RyaW5nKGlMZW4pOw0KKyAgICAgICAgRkRFX0xQQ0NTU01FRElBVFlQRVRBQkxFIHBNZWRpYVR5cGUgPQ0KKyAgICAgICAgICAgIEZERV9HZXRDU1NNZWRpYVR5cGVCeU5hbWUocHN6LCBpTGVuKTsNCisgICAgICAgIGlmIChwTWVkaWFUeXBlICE9IE5VTEwpIHsNCisgICAgICAgICAgZHdNZWRpYUxpc3QgfD0gcE1lZGlhVHlwZS0+d1ZhbHVlOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX1N0eWxlUnVsZToNCisgICAgICAgIGlmIChwTWVkaWFSdWxlID09IE5VTEwpIHsNCisgICAgICAgICAgU2tpcFJ1bGVTZXQocFN5bnRheCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBGREVfQ1NTU1lOVEFYU1RBVFVTIGVTdGF0dXMgPQ0KKyAgICAgICAgICAgICAgTG9hZFN0eWxlUnVsZShwU3ludGF4LCBwTWVkaWFSdWxlLT5HZXRBcnJheSgpKTsNCisgICAgICAgICAgaWYgKGVTdGF0dXMgPCBGREVfQ1NTU1lOVEFYU1RBVFVTX05vbmUpIHsNCisgICAgICAgICAgICByZXR1cm4gZVN0YXR1czsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX0RlY2xPcGVuOg0KKyAgICAgICAgaWYgKChkd01lZGlhTGlzdCAmIG1fZHdNZWRpYUxpc3QpID4gMCAmJiBwTWVkaWFSdWxlID09IE5VTEwpIHsNCisgICAgICAgICAgcE1lZGlhUnVsZSA9IEZERV9OZXdXaXRoKG1fcEFsbG9jYXRvcikgQ0ZERV9DU1NNZWRpYVJ1bGUoZHdNZWRpYUxpc3QpOw0KKyAgICAgICAgICBtX1J1bGVBcnJheS5BZGQocE1lZGlhUnVsZSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfRGVjbENsb3NlOg0KKyAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfTm9uZTsNCisgICAgICAgIEZERV9DU1NTV0lUQ0hERUZBVUxUUygpOw0KKyAgICB9DQorICB9DQorfQ0KK0ZERV9DU1NTWU5UQVhTVEFUVVMgQ0ZERV9DU1NTdHlsZVNoZWV0OjpMb2FkU3R5bGVSdWxlKA0KKyAgICBJRkRFX0NTU1N5bnRheFBhcnNlciogcFN5bnRheCwNCisgICAgQ0ZERV9DU1NSdWxlQXJyYXkmIHJ1bGVBcnJheSkgew0KKyAgbV9TZWxlY3RvcnMuUmVtb3ZlQXQoMCwgbV9TZWxlY3RvcnMuR2V0U2l6ZSgpKTsNCisgIENGREVfQ1NTU3R5bGVSdWxlKiBwU3R5bGVSdWxlID0gTlVMTDsNCisgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSA9IE5VTEw7DQorICBpbnQzMl90IGlWYWx1ZUxlbiA9IDA7DQorICBGREVfQ1NTUFJPUEVSVFlBUkdTIHByb3BlcnR5QXJnczsNCisgIHByb3BlcnR5QXJncy5wU3RhdGljU3RvcmUgPSBtX3BBbGxvY2F0b3I7DQorICBwcm9wZXJ0eUFyZ3MucFN0cmluZ0NhY2hlID0gJm1fU3RyaW5nQ2FjaGU7DQorICBwcm9wZXJ0eUFyZ3MucFByb3BlcnR5ID0gTlVMTDsNCisgIENGWF9XaWRlU3RyaW5nIHdzTmFtZTsNCisgIGZvciAoOzspIHsNCisgICAgc3dpdGNoIChwU3ludGF4LT5Eb1N5bnRheFBhcnNlKCkpIHsNCisgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfU2VsZWN0b3I6IHsNCisgICAgICAgIHBzelZhbHVlID0gcFN5bnRheC0+R2V0Q3VycmVudFN0cmluZyhpVmFsdWVMZW4pOw0KKyAgICAgICAgSUZERV9DU1NTZWxlY3RvciogcFNlbGVjdG9yID0NCisgICAgICAgICAgICBDRkRFX0NTU1NlbGVjdG9yOjpGcm9tU3RyaW5nKG1fcEFsbG9jYXRvciwgcHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICBpZiAocFNlbGVjdG9yICE9IE5VTEwpIHsNCisgICAgICAgICAgbV9TZWxlY3RvcnMuQWRkKHBTZWxlY3Rvcik7DQorICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfUHJvcGVydHlOYW1lOg0KKyAgICAgICAgcHN6VmFsdWUgPSBwU3ludGF4LT5HZXRDdXJyZW50U3RyaW5nKGlWYWx1ZUxlbik7DQorICAgICAgICBwcm9wZXJ0eUFyZ3MucFByb3BlcnR5ID0gRkRFX0dldENTU1Byb3BlcnR5QnlOYW1lKHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgaWYgKHByb3BlcnR5QXJncy5wUHJvcGVydHkgPT0gTlVMTCkgew0KKyAgICAgICAgICB3c05hbWUgPSBDRlhfV2lkZVN0cmluZ0MocHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfUHJvcGVydHlWYWx1ZToNCisgICAgICAgIGlmIChwcm9wZXJ0eUFyZ3MucFByb3BlcnR5ICE9IE5VTEwpIHsNCisgICAgICAgICAgcHN6VmFsdWUgPSBwU3ludGF4LT5HZXRDdXJyZW50U3RyaW5nKGlWYWx1ZUxlbik7DQorICAgICAgICAgIGlmIChpVmFsdWVMZW4gPiAwKSB7DQorICAgICAgICAgICAgcFN0eWxlUnVsZS0+R2V0RGVjbEltcCgpLkFkZFByb3BlcnR5KCZwcm9wZXJ0eUFyZ3MsIHBzelZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpVmFsdWVMZW4pOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKGlWYWx1ZUxlbiA+IDApIHsNCisgICAgICAgICAgcHN6VmFsdWUgPSBwU3ludGF4LT5HZXRDdXJyZW50U3RyaW5nKGlWYWx1ZUxlbik7DQorICAgICAgICAgIGlmIChpVmFsdWVMZW4gPiAwKSB7DQorICAgICAgICAgICAgcFN0eWxlUnVsZS0+R2V0RGVjbEltcCgpLkFkZFByb3BlcnR5KA0KKyAgICAgICAgICAgICAgICAmcHJvcGVydHlBcmdzLCB3c05hbWUsIHdzTmFtZS5HZXRMZW5ndGgoKSwgcHN6VmFsdWUsIGlWYWx1ZUxlbik7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19EZWNsT3BlbjoNCisgICAgICAgIGlmIChwU3R5bGVSdWxlID09IE5VTEwgJiYgbV9TZWxlY3RvcnMuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgICBwU3R5bGVSdWxlID0gRkRFX05ld1dpdGgobV9wQWxsb2NhdG9yKSBDRkRFX0NTU1N0eWxlUnVsZTsNCisgICAgICAgICAgcFN0eWxlUnVsZS0+U2V0U2VsZWN0b3IobV9wQWxsb2NhdG9yLCBtX1NlbGVjdG9ycyk7DQorICAgICAgICAgIHJ1bGVBcnJheS5BZGQocFN0eWxlUnVsZSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBTa2lwUnVsZVNldChwU3ludGF4KTsNCisgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfTm9uZTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19EZWNsQ2xvc2U6DQorICAgICAgICBpZiAocFN0eWxlUnVsZSAhPSBOVUxMICYmDQorICAgICAgICAgICAgcFN0eWxlUnVsZS0+R2V0RGVjbEltcCgpLkdldFN0YXJ0UG9zaXRpb24oKSA9PSBOVUxMKSB7DQorICAgICAgICAgIHBTdHlsZVJ1bGUtPn5DRkRFX0NTU1N0eWxlUnVsZSgpOw0KKyAgICAgICAgICBydWxlQXJyYXkuUmVtb3ZlTGFzdCgxKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX05vbmU7DQorICAgICAgICBGREVfQ1NTU1dJVENIREVGQVVMVFMoKTsNCisgICAgfQ0KKyAgfQ0KK30NCitGREVfQ1NTU1lOVEFYU1RBVFVTIENGREVfQ1NTU3R5bGVTaGVldDo6TG9hZEZvbnRGYWNlUnVsZSgNCisgICAgSUZERV9DU1NTeW50YXhQYXJzZXIqIHBTeW50YXgsDQorICAgIENGREVfQ1NTUnVsZUFycmF5JiBydWxlQXJyYXkpIHsNCisgIENGREVfQ1NTRm9udEZhY2VSdWxlKiBwRm9udEZhY2VSdWxlID0gTlVMTDsNCisgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSA9IE5VTEw7DQorICBpbnQzMl90IGlWYWx1ZUxlbiA9IDA7DQorICBGREVfQ1NTUFJPUEVSVFlBUkdTIHByb3BlcnR5QXJnczsNCisgIHByb3BlcnR5QXJncy5wU3RhdGljU3RvcmUgPSBtX3BBbGxvY2F0b3I7DQorICBwcm9wZXJ0eUFyZ3MucFN0cmluZ0NhY2hlID0gJm1fU3RyaW5nQ2FjaGU7DQorICBwcm9wZXJ0eUFyZ3MucFByb3BlcnR5ID0gTlVMTDsNCisgIGZvciAoOzspIHsNCisgICAgc3dpdGNoIChwU3ludGF4LT5Eb1N5bnRheFBhcnNlKCkpIHsNCisgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfUHJvcGVydHlOYW1lOg0KKyAgICAgICAgcHN6VmFsdWUgPSBwU3ludGF4LT5HZXRDdXJyZW50U3RyaW5nKGlWYWx1ZUxlbik7DQorICAgICAgICBwcm9wZXJ0eUFyZ3MucFByb3BlcnR5ID0gRkRFX0dldENTU1Byb3BlcnR5QnlOYW1lKHBzelZhbHVlLCBpVmFsdWVMZW4pOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX1Byb3BlcnR5VmFsdWU6DQorICAgICAgICBpZiAocHJvcGVydHlBcmdzLnBQcm9wZXJ0eSAhPSBOVUxMKSB7DQorICAgICAgICAgIHBzelZhbHVlID0gcFN5bnRheC0+R2V0Q3VycmVudFN0cmluZyhpVmFsdWVMZW4pOw0KKyAgICAgICAgICBpZiAoaVZhbHVlTGVuID4gMCkgew0KKyAgICAgICAgICAgIHBGb250RmFjZVJ1bGUtPkdldERlY2xJbXAoKS5BZGRQcm9wZXJ0eSgmcHJvcGVydHlBcmdzLCBwc3pWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVZhbHVlTGVuKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX0RlY2xPcGVuOg0KKyAgICAgICAgaWYgKHBGb250RmFjZVJ1bGUgPT0gTlVMTCkgew0KKyAgICAgICAgICBwRm9udEZhY2VSdWxlID0gRkRFX05ld1dpdGgobV9wQWxsb2NhdG9yKSBDRkRFX0NTU0ZvbnRGYWNlUnVsZTsNCisgICAgICAgICAgcnVsZUFycmF5LkFkZChwRm9udEZhY2VSdWxlKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19EZWNsQ2xvc2U6DQorICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19Ob25lOw0KKyAgICAgICAgRkRFX0NTU1NXSVRDSERFRkFVTFRTKCk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX05vbmU7DQorfQ0KK0ZERV9DU1NTWU5UQVhTVEFUVVMgQ0ZERV9DU1NTdHlsZVNoZWV0OjpMb2FkSW1wb3J0UnVsZSgNCisgICAgSUZERV9DU1NTeW50YXhQYXJzZXIqIHBTeW50YXgpIHsNCisgIGZvciAoOzspIHsNCisgICAgc3dpdGNoIChwU3ludGF4LT5Eb1N5bnRheFBhcnNlKCkpIHsNCisgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfSW1wb3J0Q2xvc2U6DQorICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19Ob25lOw0KKyAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19VUkk6DQorICAgICAgICBicmVhazsNCisgICAgICAgIEZERV9DU1NTV0lUQ0hERUZBVUxUUygpOw0KKyAgICB9DQorICB9DQorfQ0KK0ZERV9DU1NTWU5UQVhTVEFUVVMgQ0ZERV9DU1NTdHlsZVNoZWV0OjpMb2FkUGFnZVJ1bGUoDQorICAgIElGREVfQ1NTU3ludGF4UGFyc2VyKiBwU3ludGF4KSB7DQorICByZXR1cm4gU2tpcFJ1bGVTZXQocFN5bnRheCk7DQorfQ0KK0ZERV9DU1NTWU5UQVhTVEFUVVMgQ0ZERV9DU1NTdHlsZVNoZWV0OjpTa2lwUnVsZVNldCgNCisgICAgSUZERV9DU1NTeW50YXhQYXJzZXIqIHBTeW50YXgpIHsNCisgIGZvciAoOzspIHsNCisgICAgc3dpdGNoIChwU3ludGF4LT5Eb1N5bnRheFBhcnNlKCkpIHsNCisgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfU2VsZWN0b3I6DQorICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX0RlY2xPcGVuOg0KKyAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19Qcm9wZXJ0eU5hbWU6DQorICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYU1RBVFVTX1Byb3BlcnR5VmFsdWU6DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfRGVjbENsb3NlOg0KKyAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfTm9uZTsNCisgICAgICAgIEZERV9DU1NTV0lUQ0hERUZBVUxUUygpOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19Ob25lOw0KK30NCit2b2lkIENGREVfQ1NTU3R5bGVSdWxlOjpTZXRTZWxlY3RvcihJRlhfTUVNQWxsb2NhdG9yKiBwU3RhdGljU3RvcmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZERV9DU1NTZWxlY3RvckFycmF5JiBsaXN0KSB7DQorICBGWFNZU19hc3NlcnQobV9wcFNlbGVjdG9yID09IE5VTEwpOw0KKyAgbV9pU2VsZWN0b3JzID0gbGlzdC5HZXRTaXplKCk7DQorICBtX3BwU2VsZWN0b3IgPSAoSUZERV9DU1NTZWxlY3RvcioqKXBTdGF0aWNTdG9yZS0+QWxsb2MoDQorICAgICAgbV9pU2VsZWN0b3JzICogc2l6ZW9mKElGREVfQ1NTU2VsZWN0b3IqKSk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX2lTZWxlY3RvcnM7ICsraSkgew0KKyAgICBtX3BwU2VsZWN0b3JbaV0gPSBsaXN0LkdldEF0KGkpOw0KKyAgfQ0KK30NCitDRkRFX0NTU01lZGlhUnVsZTo6fkNGREVfQ1NTTWVkaWFSdWxlKCkgew0KKyAgZm9yIChpbnQzMl90IGkgPSBtX1J1bGVBcnJheS5HZXRTaXplKCkgLSAxOyBpID49IDA7IC0taSkgew0KKyAgICBJRkRFX0NTU1J1bGUqIHBSdWxlID0gbV9SdWxlQXJyYXkuR2V0QXQoaSk7DQorICAgIHN3aXRjaCAocFJ1bGUtPkdldFR5cGUoKSkgew0KKyAgICAgIGNhc2UgRkRFX0NTU1JVTEVUWVBFX1N0eWxlOg0KKyAgICAgICAgKChDRkRFX0NTU1N0eWxlUnVsZSopcFJ1bGUpLT5+Q0ZERV9DU1NTdHlsZVJ1bGUoKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBGWFNZU19hc3NlcnQoRkFMU0UpOw0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCit9DQoraW5saW5lIEZYX0JPT0wgRkRFX0lzQ1NTQ2hhcihGWF9XQ0hBUiB3Y2gpIHsNCisgIHJldHVybiAod2NoID49ICdhJyAmJiB3Y2ggPD0gJ3onKSB8fCAod2NoID49ICdBJyAmJiB3Y2ggPD0gJ1onKTsNCit9DQoraW50MzJfdCBGREVfR2V0Q1NTUGVyc3Vkb0xlbihjb25zdCBGWF9XQ0hBUiogcHN6LCBjb25zdCBGWF9XQ0hBUiogcEVuZCkgew0KKyAgRlhTWVNfYXNzZXJ0KCpwc3ogPT0gJzonKTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwU3RhcnQgPSBwc3o7DQorICB3aGlsZSAocHN6IDwgcEVuZCkgew0KKyAgICBGWF9XQ0hBUiB3Y2ggPSAqcHN6Ow0KKyAgICBpZiAoRkRFX0lzQ1NTQ2hhcih3Y2gpIHx8IHdjaCA9PSAnOicpIHsNCisgICAgICArK3BzejsNCisgICAgfSBlbHNlIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHBzeiAtIHBTdGFydDsNCit9DQoraW50MzJfdCBGREVfR2V0Q1NTTmFtZUxlbihjb25zdCBGWF9XQ0hBUiogcHN6LCBjb25zdCBGWF9XQ0hBUiogcEVuZCkgew0KKyAgY29uc3QgRlhfV0NIQVIqIHBTdGFydCA9IHBzejsNCisgIHdoaWxlIChwc3ogPCBwRW5kKSB7DQorICAgIEZYX1dDSEFSIHdjaCA9ICpwc3o7DQorICAgIGlmIChGREVfSXNDU1NDaGFyKHdjaCkgfHwgKHdjaCA+PSAnMCcgJiYgd2NoIDw9ICc5JykgfHwgd2NoID09ICdfJyB8fA0KKyAgICAgICAgd2NoID09ICctJykgew0KKyAgICAgICsrcHN6Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gcHN6IC0gcFN0YXJ0Ow0KK30NCitJRkRFX0NTU1NlbGVjdG9yKiBDRkRFX0NTU1NlbGVjdG9yOjpGcm9tU3RyaW5nKElGWF9NRU1BbGxvY2F0b3IqIHBTdGF0aWNTdG9yZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3osDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW4pIHsNCisgIEZYU1lTX2Fzc2VydChwU3RhdGljU3RvcmUgIT0gTlVMTCAmJiBwc3ogIT0gTlVMTCAmJiBpTGVuID4gMCk7DQorICBjb25zdCBGWF9XQ0hBUiogcFN0YXJ0ID0gcHN6Ow0KKyAgY29uc3QgRlhfV0NIQVIqIHBFbmQgPSBwc3ogKyBpTGVuOw0KKyAgZm9yICg7IHBzeiA8IHBFbmQ7ICsrcHN6KSB7DQorICAgIHN3aXRjaCAoKnBzeikgew0KKyAgICAgIGNhc2UgJz4nOg0KKyAgICAgIGNhc2UgJ1snOg0KKyAgICAgIGNhc2UgJysnOg0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgIH0NCisgIENGREVfQ1NTU2VsZWN0b3IgKnBGaXJzdCA9IE5VTEwsICpwTGFzdCA9IE5VTEw7DQorICBDRkRFX0NTU1NlbGVjdG9yICpwUGVyc3Vkb0ZpcnN0ID0gTlVMTCwgKnBQZXJzdWRvTGFzdCA9IE5VTEw7DQorICBmb3IgKHBzeiA9IHBTdGFydDsgcHN6IDwgcEVuZDspIHsNCisgICAgRlhfV0NIQVIgd2NoID0gKnBzejsNCisgICAgaWYgKHdjaCA9PSAnLicgfHwgd2NoID09ICcjJykgew0KKyAgICAgIGlmIChwc3ogPT0gcFN0YXJ0IHx8IHBzelstMV0gPT0gJyAnKSB7DQorICAgICAgICBDRkRFX0NTU1NlbGVjdG9yKiBwID0gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKQ0KKyAgICAgICAgICAgIENGREVfQ1NTU2VsZWN0b3IoRkRFX0NTU1NFTEVDVE9SVFlQRV9FbGVtZW50LCBMIioiLCAxLCBUUlVFKTsNCisgICAgICAgIGlmIChwID09IE5VTEwpIHsNCisgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICB9DQorICAgICAgICBpZiAocEZpcnN0ICE9IE5VTEwpIHsNCisgICAgICAgICAgcEZpcnN0LT5TZXRUeXBlKEZERV9DU1NTRUxFQ1RPUlRZUEVfRGVzY2VuZGFudCk7DQorICAgICAgICAgIHAtPlNldE5leHQocEZpcnN0KTsNCisgICAgICAgIH0NCisgICAgICAgIHBGaXJzdCA9IHBMYXN0ID0gcDsNCisgICAgICB9DQorICAgICAgRlhTWVNfYXNzZXJ0KHBMYXN0ICE9IE5VTEwpOw0KKyAgICAgIGludDMyX3QgaU5hbWVMZW4gPSBGREVfR2V0Q1NTTmFtZUxlbigrK3BzeiwgcEVuZCk7DQorICAgICAgaWYgKGlOYW1lTGVuID09IDApIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0NCisgICAgICBGREVfQ1NTU0VMRUNUT1JUWVBFIGVUeXBlID0NCisgICAgICAgICAgd2NoID09ICcuJyA/IEZERV9DU1NTRUxFQ1RPUlRZUEVfQ2xhc3MgOiBGREVfQ1NTU0VMRUNUT1JUWVBFX0lEOw0KKyAgICAgIENGREVfQ1NTU2VsZWN0b3IqIHAgPSBGREVfTmV3V2l0aChwU3RhdGljU3RvcmUpDQorICAgICAgICAgIENGREVfQ1NTU2VsZWN0b3IoZVR5cGUsIHBzeiwgaU5hbWVMZW4sIEZBTFNFKTsNCisgICAgICBpZiAocCA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICB9DQorICAgICAgcC0+U2V0TmV4dChwTGFzdC0+R2V0TmV4dFNlbGVjdG9yKCkpOw0KKyAgICAgIHBMYXN0LT5TZXROZXh0KHApOw0KKyAgICAgIHBMYXN0ID0gcDsNCisgICAgICBwc3ogKz0gaU5hbWVMZW47DQorICAgIH0gZWxzZSBpZiAoRkRFX0lzQ1NTQ2hhcih3Y2gpIHx8IHdjaCA9PSAnKicpIHsNCisgICAgICBpbnQzMl90IGlOYW1lTGVuID0gd2NoID09ICcqJyA/IDEgOiBGREVfR2V0Q1NTTmFtZUxlbihwc3osIHBFbmQpOw0KKyAgICAgIGlmIChpTmFtZUxlbiA9PSAwKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICB9DQorICAgICAgQ0ZERV9DU1NTZWxlY3RvciogcCA9IEZERV9OZXdXaXRoKHBTdGF0aWNTdG9yZSkNCisgICAgICAgICAgQ0ZERV9DU1NTZWxlY3RvcihGREVfQ1NTU0VMRUNUT1JUWVBFX0VsZW1lbnQsIHBzeiwgaU5hbWVMZW4sIFRSVUUpOw0KKyAgICAgIGlmIChwID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0NCisgICAgICBpZiAocEZpcnN0ID09IE5VTEwpIHsNCisgICAgICAgIHBGaXJzdCA9IHBMYXN0ID0gcDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcEZpcnN0LT5TZXRUeXBlKEZERV9DU1NTRUxFQ1RPUlRZUEVfRGVzY2VuZGFudCk7DQorICAgICAgICBwLT5TZXROZXh0KHBGaXJzdCk7DQorICAgICAgICBwRmlyc3QgPSBwTGFzdCA9IHA7DQorICAgICAgfQ0KKyAgICAgIHBzeiArPSBpTmFtZUxlbjsNCisgICAgfSBlbHNlIGlmICh3Y2ggPT0gJzonKSB7DQorICAgICAgaW50MzJfdCBpTmFtZUxlbiA9IEZERV9HZXRDU1NQZXJzdWRvTGVuKHBzeiwgcEVuZCk7DQorICAgICAgaWYgKGlOYW1lTGVuID09IDApIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0NCisgICAgICBDRkRFX0NTU1NlbGVjdG9yKiBwID0gRkRFX05ld1dpdGgocFN0YXRpY1N0b3JlKQ0KKyAgICAgICAgICBDRkRFX0NTU1NlbGVjdG9yKEZERV9DU1NTRUxFQ1RPUlRZUEVfUGVyc3VkbywgcHN6LCBpTmFtZUxlbiwgVFJVRSk7DQorICAgICAgaWYgKHAgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgfQ0KKyAgICAgIGlmIChwUGVyc3Vkb0ZpcnN0ID09IE5VTEwpIHsNCisgICAgICAgIHBQZXJzdWRvRmlyc3QgPSBwUGVyc3Vkb0xhc3QgPSBwOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBwUGVyc3Vkb0xhc3QtPlNldE5leHQocCk7DQorICAgICAgICBwUGVyc3Vkb0xhc3QgPSBwOw0KKyAgICAgIH0NCisgICAgICBwc3ogKz0gaU5hbWVMZW47DQorICAgIH0gZWxzZSBpZiAod2NoID09ICcgJykgew0KKyAgICAgIHBzeisrOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICB9DQorICBpZiAocFBlcnN1ZG9GaXJzdCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBwRmlyc3Q7DQorICB9IGVsc2Ugew0KKyAgICBwUGVyc3Vkb0xhc3QtPlNldE5leHQocEZpcnN0KTsNCisgICAgcmV0dXJuIHBQZXJzdWRvRmlyc3Q7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N0eWxlc2hlZXQuaCBiL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N0eWxlc2hlZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjVlMjA4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3Nzc3R5bGVzaGVldC5oCkBAIC0wLDAgKzEsMTM3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZERV9DU1NTVFlMRVNIRUVUDQorI2RlZmluZSBfRkRFX0NTU1NUWUxFU0hFRVQNCisjaW5jbHVkZSAiZmRlX2Nzc2RlY2xhcmF0aW9uLmgiDQorY2xhc3MgQ0ZERV9DU1NTZWxlY3RvciA6IHB1YmxpYyBJRkRFX0NTU1NlbGVjdG9yLCBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGREVfQ1NTU2VsZWN0b3IoRkRFX0NTU1NFTEVDVE9SVFlQRSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzeiwNCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuLA0KKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJZ25vcmVDYXNlKQ0KKyAgICAgIDogbV9lVHlwZShlVHlwZSksDQorICAgICAgICBtX2R3SGFzaChGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyhwc3osIGlMZW4sIGJJZ25vcmVDYXNlKSksDQorICAgICAgICBtX3BOZXh0KE5VTEwpIHt9DQorICB2aXJ0dWFsIEZERV9DU1NTRUxFQ1RPUlRZUEUgR2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fZVR5cGU7IH0NCisNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0TmFtZUhhc2goKSBjb25zdCB7IHJldHVybiBtX2R3SGFzaDsgfQ0KKw0KKyAgdmlydHVhbCBJRkRFX0NTU1NlbGVjdG9yKiBHZXROZXh0U2VsZWN0b3IoKSBjb25zdCB7IHJldHVybiBtX3BOZXh0OyB9DQorICBzdGF0aWMgSUZERV9DU1NTZWxlY3RvciogRnJvbVN0cmluZyhJRlhfTUVNQWxsb2NhdG9yKiBwU3RhdGljU3RvcmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuKTsNCisgIHZvaWQgU2V0TmV4dChJRkRFX0NTU1NlbGVjdG9yKiBwTmV4dCkgeyBtX3BOZXh0ID0gcE5leHQ7IH0NCisNCisgcHJvdGVjdGVkOg0KKyAgc3RhdGljIENGREVfQ1NTU2VsZWN0b3IqIFBhcnNlU2VsZWN0b3IoSUZYX01FTUFsbG9jYXRvciogcFN0YXRpY1N0b3JlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzeiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlPZmYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTU0VMRUNUT1JUWVBFIGVUeXBlKTsNCisgIHZvaWQgU2V0VHlwZShGREVfQ1NTU0VMRUNUT1JUWVBFIGVUeXBlKSB7IG1fZVR5cGUgPSBlVHlwZTsgfQ0KKyAgRkRFX0NTU1NFTEVDVE9SVFlQRSBtX2VUeXBlOw0KKyAgRlhfRFdPUkQgbV9kd0hhc2g7DQorICBJRkRFX0NTU1NlbGVjdG9yKiBtX3BOZXh0Ow0KK307DQordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxJRkRFX0NTU1NlbGVjdG9yKj4gQ0ZERV9DU1NTZWxlY3RvckFycmF5Ow0KK2NsYXNzIENGREVfQ1NTU3R5bGVSdWxlIDogcHVibGljIElGREVfQ1NTU3R5bGVSdWxlLCBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGREVfQ1NTU3R5bGVSdWxlKCkgOiBtX3BwU2VsZWN0b3IoTlVMTCksIG1faVNlbGVjdG9ycygwKSB7fQ0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50U2VsZWN0b3JMaXN0cygpIGNvbnN0IHsgcmV0dXJuIG1faVNlbGVjdG9yczsgfQ0KKyAgdmlydHVhbCBJRkRFX0NTU1NlbGVjdG9yKiBHZXRTZWxlY3Rvckxpc3QoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9wcFNlbGVjdG9yW2luZGV4XTsNCisgIH0NCisNCisgIHZpcnR1YWwgSUZERV9DU1NEZWNsYXJhdGlvbiogR2V0RGVjbGFyYXRpb24oKSBjb25zdCB7DQorICAgIHJldHVybiAoSUZERV9DU1NEZWNsYXJhdGlvbiopJm1fRGVjbGFyYXRpb247DQorICB9DQorICBDRkRFX0NTU0RlY2xhcmF0aW9uJiBHZXREZWNsSW1wKCkgeyByZXR1cm4gbV9EZWNsYXJhdGlvbjsgfQ0KKyAgdm9pZCBTZXRTZWxlY3RvcihJRlhfTUVNQWxsb2NhdG9yKiBwU3RhdGljU3RvcmUsDQorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGREVfQ1NTU2VsZWN0b3JBcnJheSYgbGlzdCk7DQorDQorIHByb3RlY3RlZDoNCisgIENGREVfQ1NTRGVjbGFyYXRpb24gbV9EZWNsYXJhdGlvbjsNCisgIElGREVfQ1NTU2VsZWN0b3IqKiBtX3BwU2VsZWN0b3I7DQorICBpbnQzMl90IG1faVNlbGVjdG9yczsNCit9Ow0KK2NsYXNzIENGREVfQ1NTTWVkaWFSdWxlIDogcHVibGljIElGREVfQ1NTTWVkaWFSdWxlLCBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGREVfQ1NTTWVkaWFSdWxlKEZYX0RXT1JEIGR3TWVkaWFMaXN0KSA6IG1fZHdNZWRpYUxpc3QoZHdNZWRpYUxpc3QpIHt9DQorICB+Q0ZERV9DU1NNZWRpYVJ1bGUoKTsNCisNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0TWVkaWFMaXN0KCkgY29uc3QgeyByZXR1cm4gbV9kd01lZGlhTGlzdDsgfQ0KKw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50UnVsZXMoKSBjb25zdCB7IHJldHVybiBtX1J1bGVBcnJheS5HZXRTaXplKCk7IH0NCisgIHZpcnR1YWwgSUZERV9DU1NSdWxlKiBHZXRSdWxlKGludDMyX3QgaW5kZXgpIHsNCisgICAgcmV0dXJuIG1fUnVsZUFycmF5LkdldEF0KGluZGV4KTsNCisgIH0NCisgIENGREVfQ1NTUnVsZUFycmF5JiBHZXRBcnJheSgpIHsgcmV0dXJuIG1fUnVsZUFycmF5OyB9DQorDQorIHByb3RlY3RlZDoNCisgIEZYX0RXT1JEIG1fZHdNZWRpYUxpc3Q7DQorICBDRkRFX0NTU1J1bGVBcnJheSBtX1J1bGVBcnJheTsNCit9Ow0KK2NsYXNzIENGREVfQ1NTRm9udEZhY2VSdWxlIDogcHVibGljIElGREVfQ1NTRm9udEZhY2VSdWxlLCBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgSUZERV9DU1NEZWNsYXJhdGlvbiogR2V0RGVjbGFyYXRpb24oKSBjb25zdCB7DQorICAgIHJldHVybiAoSUZERV9DU1NEZWNsYXJhdGlvbiopJm1fRGVjbGFyYXRpb247DQorICB9DQorICBDRkRFX0NTU0RlY2xhcmF0aW9uJiBHZXREZWNsSW1wKCkgeyByZXR1cm4gbV9EZWNsYXJhdGlvbjsgfQ0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRkRFX0NTU0RlY2xhcmF0aW9uIG1fRGVjbGFyYXRpb247DQorfTsNCisjZGVmaW5lIEZERV9DU1NTV0lUQ0hERUZBVUxUUygpICAgICBcDQorICBjYXNlIEZERV9DU1NTWU5UQVhTVEFUVVNfRU9TOiAgICAgXA0KKyAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19FT1M7IFwNCisgIGNhc2UgRkRFX0NTU1NZTlRBWFNUQVRVU19FcnJvcjogICBcDQorICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19FcnJvcjsNCitjbGFzcyBDRkRFX0NTU1N0eWxlU2hlZXQgOiBwdWJsaWMgSUZERV9DU1NTdHlsZVNoZWV0LCBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGREVfQ1NTU3R5bGVTaGVldChGWF9EV09SRCBkd01lZGlhTGlzdCk7DQorICB+Q0ZERV9DU1NTdHlsZVNoZWV0KCk7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEFkZFJlZigpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBSZWxlYXNlKCk7DQorDQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0VXJsKENGWF9XaWRlU3RyaW5nJiBzelVybCkgew0KKyAgICBzelVybCA9IG1fc3pVcmw7DQorICAgIHJldHVybiBzelVybC5HZXRMZW5ndGgoKSA+IDA7DQorICB9DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldE1lZGlhTGlzdCgpIGNvbnN0IHsgcmV0dXJuIG1fZHdNZWRpYUxpc3Q7IH0NCisgIHZpcnR1YWwgRlhfV09SRCBHZXRDb2RlUGFnZSgpIGNvbnN0IHsgcmV0dXJuIG1fd0NvZGVQYWdlOyB9DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRSdWxlcygpIGNvbnN0Ow0KKyAgdmlydHVhbCBJRkRFX0NTU1J1bGUqIEdldFJ1bGUoaW50MzJfdCBpbmRleCk7DQorICBGWF9CT09MIExvYWRGcm9tU3RyZWFtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzelVybCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1N0cmVhbSogcFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UpOw0KKyAgRlhfQk9PTCBMb2FkRnJvbUJ1ZmZlcihjb25zdCBDRlhfV2lkZVN0cmluZyYgc3pVcmwsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwQnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCdWZTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgUmVzZXQoKTsNCisgIEZYX0JPT0wgTG9hZEZyb21TeW50YXgoSUZERV9DU1NTeW50YXhQYXJzZXIqIHBTeW50YXgpOw0KKyAgRkRFX0NTU1NZTlRBWFNUQVRVUyBMb2FkU3R5bGVSdWxlKElGREVfQ1NTU3ludGF4UGFyc2VyKiBwU3ludGF4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfQ1NTUnVsZUFycmF5JiBydWxlQXJyYXkpOw0KKyAgRkRFX0NTU1NZTlRBWFNUQVRVUyBMb2FkSW1wb3J0UnVsZShJRkRFX0NTU1N5bnRheFBhcnNlciogcFN5bnRheCk7DQorICBGREVfQ1NTU1lOVEFYU1RBVFVTIExvYWRQYWdlUnVsZShJRkRFX0NTU1N5bnRheFBhcnNlciogcFN5bnRheCk7DQorICBGREVfQ1NTU1lOVEFYU1RBVFVTIExvYWRNZWRpYVJ1bGUoSUZERV9DU1NTeW50YXhQYXJzZXIqIHBTeW50YXgpOw0KKyAgRkRFX0NTU1NZTlRBWFNUQVRVUyBMb2FkRm9udEZhY2VSdWxlKElGREVfQ1NTU3ludGF4UGFyc2VyKiBwU3ludGF4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfQ1NTUnVsZUFycmF5JiBydWxlQXJyYXkpOw0KKyAgRkRFX0NTU1NZTlRBWFNUQVRVUyBTa2lwUnVsZVNldChJRkRFX0NTU1N5bnRheFBhcnNlciogcFN5bnRheCk7DQorICBGWF9XT1JEIG1fd0NvZGVQYWdlOw0KKyAgRlhfV09SRCBtX3dSZWZDb3VudDsNCisgIEZYX0RXT1JEIG1fZHdNZWRpYUxpc3Q7DQorICBJRlhfTUVNQWxsb2NhdG9yKiBtX3BBbGxvY2F0b3I7DQorICBDRkRFX0NTU1J1bGVBcnJheSBtX1J1bGVBcnJheTsNCisgIENGWF9XaWRlU3RyaW5nIG1fc3pVcmw7DQorICBDRkRFX0NTU1NlbGVjdG9yQXJyYXkgbV9TZWxlY3RvcnM7DQorICBDRlhfTWFwUHRyVG9QdHIgbV9TdHJpbmdDYWNoZTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N5bnRheC5jcHAgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzeW50YXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZDNkMTIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvY3NzL2ZkZV9jc3NzeW50YXguY3BwCkBAIC0wLDAgKzEsNDg0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgImZkZV9jc3NzeW50YXguaCINCisjaW5jbHVkZSAiZmRlX2Nzc2RhdGF0YWJsZS5oIg0KKyNpZmRlZiBfY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmDQoraW5saW5lIEZYX0JPT0wgRkRFX0lzU2VsZWN0b3JTdGFydChGWF9XQ0hBUiB3Y2gpIHsNCisgIHJldHVybiB3Y2ggPT0gJy4nIHx8IHdjaCA9PSAnIycgfHwgd2NoID09ICcqJyB8fCAod2NoID49ICdhJyAmJiB3Y2ggPD0gJ3onKSB8fA0KKyAgICAgICAgICh3Y2ggPj0gJ0EnICYmIHdjaCA8PSAnWicpOw0KK30NCisjaWZkZWYgX2NwbHVzcGx1cw0KK307DQorI2VuZGlmDQorSUZERV9DU1NTeW50YXhQYXJzZXIqIElGREVfQ1NTU3ludGF4UGFyc2VyOjpDcmVhdGUoKSB7DQorICByZXR1cm4gbmV3IENGREVfQ1NTU3ludGF4UGFyc2VyOw0KK30NCitDRkRFX0NTU1N5bnRheFBhcnNlcjo6Q0ZERV9DU1NTeW50YXhQYXJzZXIoKQ0KKyAgICA6IG1fcFN0cmVhbShOVUxMKSwNCisgICAgICBtX2lTdHJlYW1Qb3MoMCksDQorICAgICAgbV9pUGxhbmVTaXplKDApLA0KKyAgICAgIG1faVRleHREYXRMZW4oMCksDQorICAgICAgbV9kd0NoZWNrKChGWF9EV09SRCktMSksDQorICAgICAgbV9lTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9SdWxlU2V0KSwNCisgICAgICBtX2VTdGF0dXMoRkRFX0NTU1NZTlRBWFNUQVRVU19Ob25lKSB7fQ0KK0NGREVfQ1NTU3ludGF4UGFyc2VyOjp+Q0ZERV9DU1NTeW50YXhQYXJzZXIoKSB7DQorICBtX1RleHREYXRhLlJlc2V0KCk7DQorICBtX1RleHRQbGFuZS5SZXNldCgpOw0KK30NCitGWF9CT09MIENGREVfQ1NTU3ludGF4UGFyc2VyOjpJbml0KElGWF9TdHJlYW0qIHBTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDU1NQbGFuZVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlUZXh0RGF0YVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJPbmx5RGVjbGFyYXRpb24pIHsNCisgIEZYU1lTX2Fzc2VydChwU3RyZWFtICE9IE5VTEwgJiYgaUNTU1BsYW5lU2l6ZSA+IDAgJiYgaVRleHREYXRhU2l6ZSA+IDApOw0KKyAgUmVzZXQoYk9ubHlEZWNsYXJhdGlvbik7DQorICBpZiAoIW1fVGV4dERhdGEuRXN0aW1hdGVTaXplKGlUZXh0RGF0YVNpemUpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHVpbnQ4X3QgYm9tWzRdOw0KKyAgbV9wU3RyZWFtID0gcFN0cmVhbTsNCisgIG1faVN0cmVhbVBvcyA9IG1fcFN0cmVhbS0+R2V0Qk9NKGJvbSk7DQorICBtX2lQbGFuZVNpemUgPSBpQ1NTUGxhbmVTaXplOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9DU1NTeW50YXhQYXJzZXI6OkluaXQoY29uc3QgRlhfV0NIQVIqIHBCdWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCdWZmZXJTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVGV4dERhdFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJPbmx5RGVjbGFyYXRpb24pIHsNCisgIEZYU1lTX2Fzc2VydChwQnVmZmVyICE9IE5VTEwgJiYgaUJ1ZmZlclNpemUgPiAwICYmIGlUZXh0RGF0U2l6ZSA+IDApOw0KKyAgUmVzZXQoYk9ubHlEZWNsYXJhdGlvbik7DQorICBpZiAoIW1fVGV4dERhdGEuRXN0aW1hdGVTaXplKGlUZXh0RGF0U2l6ZSkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIG1fVGV4dFBsYW5lLkF0dGFjaEJ1ZmZlcihwQnVmZmVyLCBpQnVmZmVyU2l6ZSk7DQorfQ0KK3ZvaWQgQ0ZERV9DU1NTeW50YXhQYXJzZXI6OlJlc2V0KEZYX0JPT0wgYk9ubHlEZWNsYXJhdGlvbikgew0KKyAgbV9UZXh0UGxhbmUuUmVzZXQoKTsNCisgIG1fVGV4dERhdGEuUmVzZXQoKTsNCisgIG1fcFN0cmVhbSA9IE5VTEw7DQorICBtX2lTdHJlYW1Qb3MgPSAwOw0KKyAgbV9pVGV4dERhdExlbiA9IDA7DQorICBtX2R3Q2hlY2sgPSAoRlhfRFdPUkQpLTE7DQorICBtX2VTdGF0dXMgPSBGREVfQ1NTU1lOVEFYU1RBVFVTX05vbmU7DQorICBtX2VNb2RlID0gYk9ubHlEZWNsYXJhdGlvbiA/IEZERV9DU1NTWU5UQVhNT0RFX1Byb3BlcnR5TmFtZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGREVfQ1NTU1lOVEFYTU9ERV9SdWxlU2V0Ow0KK30NCitGREVfQ1NTU1lOVEFYU1RBVFVTIENGREVfQ1NTU3ludGF4UGFyc2VyOjpEb1N5bnRheFBhcnNlKCkgew0KKyAgd2hpbGUgKG1fZVN0YXR1cyA+PSBGREVfQ1NTU1lOVEFYU1RBVFVTX05vbmUpIHsNCisgICAgaWYgKG1fVGV4dFBsYW5lLklzRU9GKCkpIHsNCisgICAgICBpZiAobV9wU3RyZWFtID09IE5VTEwpIHsNCisgICAgICAgIGlmIChtX2VNb2RlID09IEZERV9DU1NTWU5UQVhNT0RFX1Byb3BlcnR5VmFsdWUgJiYNCisgICAgICAgICAgICBtX1RleHREYXRhLkdldExlbmd0aCgpID4gMCkgew0KKyAgICAgICAgICBTYXZlVGV4dERhdGEoKTsNCisgICAgICAgICAgcmV0dXJuIG1fZVN0YXR1cyA9IEZERV9DU1NTWU5UQVhTVEFUVVNfUHJvcGVydHlWYWx1ZTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBtX2VTdGF0dXMgPSBGREVfQ1NTU1lOVEFYU1RBVFVTX0VPUzsNCisgICAgICB9DQorICAgICAgRlhfQk9PTCBiRU9TOw0KKyAgICAgIGludDMyX3QgaUxlbiA9IG1fVGV4dFBsYW5lLkxvYWRGcm9tU3RyZWFtKG1fcFN0cmVhbSwgbV9pU3RyZWFtUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faVBsYW5lU2l6ZSwgYkVPUyk7DQorICAgICAgbV9pU3RyZWFtUG9zID0gbV9wU3RyZWFtLT5HZXRQb3NpdGlvbigpOw0KKyAgICAgIGlmIChpTGVuIDwgMSkgew0KKyAgICAgICAgaWYgKG1fZU1vZGUgPT0gRkRFX0NTU1NZTlRBWE1PREVfUHJvcGVydHlWYWx1ZSAmJg0KKyAgICAgICAgICAgIG1fVGV4dERhdGEuR2V0TGVuZ3RoKCkgPiAwKSB7DQorICAgICAgICAgIFNhdmVUZXh0RGF0YSgpOw0KKyAgICAgICAgICByZXR1cm4gbV9lU3RhdHVzID0gRkRFX0NTU1NZTlRBWFNUQVRVU19Qcm9wZXJ0eVZhbHVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIG1fZVN0YXR1cyA9IEZERV9DU1NTWU5UQVhTVEFUVVNfRU9TOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9XQ0hBUiB3Y2g7DQorICAgIHdoaWxlICghbV9UZXh0UGxhbmUuSXNFT0YoKSkgew0KKyAgICAgIHdjaCA9IG1fVGV4dFBsYW5lLkdldENoYXIoKTsNCisgICAgICBzd2l0Y2ggKG1fZU1vZGUpIHsNCisgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWE1PREVfUnVsZVNldDoNCisgICAgICAgICAgc3dpdGNoICh3Y2gpIHsNCisgICAgICAgICAgICBjYXNlICdAJzoNCisgICAgICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7DQorICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX0F0UnVsZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlICd9JzoNCisgICAgICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7DQorICAgICAgICAgICAgICBpZiAoUmVzdG9yZU1vZGUoKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19EZWNsQ2xvc2U7DQorICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICByZXR1cm4gbV9lU3RhdHVzID0gRkRFX0NTU1NZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJy8nOg0KKyAgICAgICAgICAgICAgaWYgKG1fVGV4dFBsYW5lLkdldE5leHRDaGFyKCkgPT0gJyonKSB7DQorICAgICAgICAgICAgICAgIG1fTW9kZVN0YWNrLlB1c2gobV9lTW9kZSk7DQorICAgICAgICAgICAgICAgIFN3aXRjaE1vZGUoRkRFX0NTU1NZTlRBWE1PREVfQ29tbWVudCk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICBpZiAod2NoIDw9ICcgJykgew0KKyAgICAgICAgICAgICAgICBtX1RleHRQbGFuZS5Nb3ZlTmV4dCgpOw0KKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChGREVfSXNTZWxlY3RvclN0YXJ0KHdjaCkpIHsNCisgICAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9TZWxlY3Rvcik7DQorICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX1N0eWxlUnVsZTsNCisgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBtX2VTdGF0dXMgPSBGREVfQ1NTU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhNT0RFX1NlbGVjdG9yOg0KKyAgICAgICAgICBzd2l0Y2ggKHdjaCkgew0KKyAgICAgICAgICAgIGNhc2UgJywnOg0KKyAgICAgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsNCisgICAgICAgICAgICAgIFN3aXRjaE1vZGUoRkRFX0NTU1NZTlRBWE1PREVfU2VsZWN0b3IpOw0KKyAgICAgICAgICAgICAgaWYgKG1faVRleHREYXRMZW4gPiAwKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX1NlbGVjdG9yOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAneyc6DQorICAgICAgICAgICAgICBpZiAobV9UZXh0RGF0YS5HZXRMZW5ndGgoKSA+IDApIHsNCisgICAgICAgICAgICAgICAgU2F2ZVRleHREYXRhKCk7DQorICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX1NlbGVjdG9yOw0KKyAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsNCisgICAgICAgICAgICAgICAgbV9Nb2RlU3RhY2suUHVzaChGREVfQ1NTU1lOVEFYTU9ERV9SdWxlU2V0KTsNCisgICAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9Qcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19EZWNsT3BlbjsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJy8nOg0KKyAgICAgICAgICAgICAgaWYgKG1fVGV4dFBsYW5lLkdldE5leHRDaGFyKCkgPT0gJyonKSB7DQorICAgICAgICAgICAgICAgIGlmIChTd2l0Y2hUb0NvbW1lbnQoKSA+IDApIHsNCisgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19TZWxlY3RvcjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgQXBwZW5kQ2hhcih3Y2gpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhNT0RFX1Byb3BlcnR5TmFtZToNCisgICAgICAgICAgc3dpdGNoICh3Y2gpIHsNCisgICAgICAgICAgICBjYXNlICc6JzoNCisgICAgICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7DQorICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfUHJvcGVydHlOYW1lOw0KKyAgICAgICAgICAgIGNhc2UgJ30nOg0KKyAgICAgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsNCisgICAgICAgICAgICAgIGlmIChSZXN0b3JlTW9kZSgpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX0RlY2xDbG9zZTsNCisgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBtX2VTdGF0dXMgPSBGREVfQ1NTU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnLyc6DQorICAgICAgICAgICAgICBpZiAobV9UZXh0UGxhbmUuR2V0TmV4dENoYXIoKSA9PSAnKicpIHsNCisgICAgICAgICAgICAgICAgaWYgKFN3aXRjaFRvQ29tbWVudCgpID4gMCkgew0KKyAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX1Byb3BlcnR5TmFtZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgQXBwZW5kQ2hhcih3Y2gpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhNT0RFX1Byb3BlcnR5VmFsdWU6DQorICAgICAgICAgIHN3aXRjaCAod2NoKSB7DQorICAgICAgICAgICAgY2FzZSAnOyc6DQorICAgICAgICAgICAgICBtX1RleHRQbGFuZS5Nb3ZlTmV4dCgpOw0KKyAgICAgICAgICAgIGNhc2UgJ30nOg0KKyAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9Qcm9wZXJ0eU5hbWUpOw0KKyAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfUHJvcGVydHlWYWx1ZTsNCisgICAgICAgICAgICBjYXNlICcvJzoNCisgICAgICAgICAgICAgIGlmIChtX1RleHRQbGFuZS5HZXROZXh0Q2hhcigpID09ICcqJykgew0KKyAgICAgICAgICAgICAgICBpZiAoU3dpdGNoVG9Db21tZW50KCkgPiAwKSB7DQorICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfUHJvcGVydHlWYWx1ZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgQXBwZW5kQ2hhcih3Y2gpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhNT0RFX0NvbW1lbnQ6DQorICAgICAgICAgIGlmICh3Y2ggPT0gJy8nICYmIG1fVGV4dERhdGEuR2V0TGVuZ3RoKCkgPiAwICYmDQorICAgICAgICAgICAgICBtX1RleHREYXRhLkdldEF0KG1fVGV4dERhdGEuR2V0TGVuZ3RoKCkgLSAxKSA9PSAnKicpIHsNCisgICAgICAgICAgICBSZXN0b3JlTW9kZSgpOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1fVGV4dERhdGEuQXBwZW5kQ2hhcih3Y2gpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYTU9ERV9NZWRpYVR5cGU6DQorICAgICAgICAgIHN3aXRjaCAod2NoKSB7DQorICAgICAgICAgICAgY2FzZSAnLCc6DQorICAgICAgICAgICAgICBtX1RleHRQbGFuZS5Nb3ZlTmV4dCgpOw0KKyAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9NZWRpYVR5cGUpOw0KKyAgICAgICAgICAgICAgaWYgKG1faVRleHREYXRMZW4gPiAwKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX01lZGlhVHlwZTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJ3snOiB7DQorICAgICAgICAgICAgICBGREVfQ1NTU1lOVEFYTU9ERSogcE1vZGUgPSBtX01vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICAgICAgICAgICAgICBpZiAocE1vZGUgPT0gTlVMTCB8fCAqcE1vZGUgIT0gRkRFX0NTU1NZTlRBWE1PREVfTWVkaWFSdWxlKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBtX2VTdGF0dXMgPSBGREVfQ1NTU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKG1fVGV4dERhdGEuR2V0TGVuZ3RoKCkgPiAwKSB7DQorICAgICAgICAgICAgICAgIFNhdmVUZXh0RGF0YSgpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19NZWRpYVR5cGU7DQorICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBtX1RleHRQbGFuZS5Nb3ZlTmV4dCgpOw0KKyAgICAgICAgICAgICAgICAqcE1vZGUgPSBGREVfQ1NTU1lOVEFYTU9ERV9SdWxlU2V0Ow0KKyAgICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX1J1bGVTZXQpOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19EZWNsT3BlbjsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgJzsnOiB7DQorICAgICAgICAgICAgICBGREVfQ1NTU1lOVEFYTU9ERSogcE1vZGUgPSBtX01vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICAgICAgICAgICAgICBpZiAocE1vZGUgPT0gTlVMTCB8fCAqcE1vZGUgIT0gRkRFX0NTU1NZTlRBWE1PREVfSW1wb3J0KSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBtX2VTdGF0dXMgPSBGREVfQ1NTU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKG1fVGV4dERhdGEuR2V0TGVuZ3RoKCkgPiAwKSB7DQorICAgICAgICAgICAgICAgIFNhdmVUZXh0RGF0YSgpOw0KKyAgICAgICAgICAgICAgICBpZiAoSXNJbXBvcnRFbmFibGVkKCkpIHsNCisgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19NZWRpYVR5cGU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIEZYX0JPT0wgYkVuYWJsZWQgPSBJc0ltcG9ydEVuYWJsZWQoKTsNCisgICAgICAgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsNCisgICAgICAgICAgICAgICAgbV9Nb2RlU3RhY2suUG9wKCk7DQorICAgICAgICAgICAgICAgIFN3aXRjaE1vZGUoRkRFX0NTU1NZTlRBWE1PREVfUnVsZVNldCk7DQorICAgICAgICAgICAgICAgIGlmIChiRW5hYmxlZCkgew0KKyAgICAgICAgICAgICAgICAgIERpc2FibGVJbXBvcnQoKTsNCisgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19JbXBvcnRDbG9zZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAnLyc6DQorICAgICAgICAgICAgICBpZiAobV9UZXh0UGxhbmUuR2V0TmV4dENoYXIoKSA9PSAnKicpIHsNCisgICAgICAgICAgICAgICAgaWYgKFN3aXRjaFRvQ29tbWVudCgpID4gMCkgew0KKyAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX01lZGlhVHlwZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgQXBwZW5kQ2hhcih3Y2gpOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9DU1NTWU5UQVhNT0RFX1VSSTogew0KKyAgICAgICAgICBGREVfQ1NTU1lOVEFYTU9ERSogcE1vZGUgPSBtX01vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICAgICAgICAgIGlmIChwTW9kZSA9PSBOVUxMIHx8ICpwTW9kZSAhPSBGREVfQ1NTU1lOVEFYTU9ERV9JbXBvcnQpIHsNCisgICAgICAgICAgICByZXR1cm4gbV9lU3RhdHVzID0gRkRFX0NTU1NZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAod2NoIDw9ICcgJyB8fCB3Y2ggPT0gJzsnKSB7DQorICAgICAgICAgICAgaW50MzJfdCBpVVJJU3RhcnQsIGlVUklMZW5ndGggPSBtX1RleHREYXRhLkdldExlbmd0aCgpOw0KKyAgICAgICAgICAgIGlmIChpVVJJTGVuZ3RoID4gMCAmJg0KKyAgICAgICAgICAgICAgICBGREVfUGFyc2VDU1NVUkkobV9UZXh0RGF0YS5HZXRCdWZmZXIoKSwgaVVSSUxlbmd0aCwgaVVSSVN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVVSSUxlbmd0aCkpIHsNCisgICAgICAgICAgICAgIG1fVGV4dERhdGEuU3VidHJhY3QoaVVSSVN0YXJ0LCBpVVJJTGVuZ3RoKTsNCisgICAgICAgICAgICAgIFN3aXRjaE1vZGUoRkRFX0NTU1NZTlRBWE1PREVfTWVkaWFUeXBlKTsNCisgICAgICAgICAgICAgIGlmIChJc0ltcG9ydEVuYWJsZWQoKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19VUkk7DQorICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgQXBwZW5kQ2hhcih3Y2gpOw0KKyAgICAgICAgfSBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWE1PREVfQXRSdWxlOg0KKyAgICAgICAgICBpZiAod2NoID4gJyAnKSB7DQorICAgICAgICAgICAgQXBwZW5kQ2hhcih3Y2gpOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGludDMyX3QgaUxlbiA9IG1fVGV4dERhdGEuR2V0TGVuZ3RoKCk7DQorICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzeiA9IG1fVGV4dERhdGEuR2V0QnVmZmVyKCk7DQorICAgICAgICAgICAgaWYgKEZYU1lTX3djc25jbXAoTCJjaGFyc2V0IiwgcHN6LCBpTGVuKSA9PSAwKSB7DQorICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFX0NoYXJzZXQpOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoRlhTWVNfd2NzbmNtcChMImltcG9ydCIsIHBzeiwgaUxlbikgPT0gMCkgew0KKyAgICAgICAgICAgICAgbV9Nb2RlU3RhY2suUHVzaChGREVfQ1NTU1lOVEFYTU9ERV9JbXBvcnQpOw0KKyAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9VUkkpOw0KKyAgICAgICAgICAgICAgaWYgKElzSW1wb3J0RW5hYmxlZCgpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX0ltcG9ydFJ1bGU7DQorICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2UgaWYgKEZYU1lTX3djc25jbXAoTCJtZWRpYSIsIHBzeiwgaUxlbikgPT0gMCkgew0KKyAgICAgICAgICAgICAgbV9Nb2RlU3RhY2suUHVzaChGREVfQ1NTU1lOVEFYTU9ERV9NZWRpYVJ1bGUpOw0KKyAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9NZWRpYVR5cGUpOw0KKyAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTWU5UQVhTVEFUVVNfTWVkaWFSdWxlOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoRlhTWVNfd2NzbmNtcChMImZvbnQtZmFjZSIsIHBzeiwgaUxlbikgPT0gMCkgew0KKyAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9TZWxlY3Rvcik7DQorICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19Gb250RmFjZVJ1bGU7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChGWFNZU193Y3NuY21wKEwicGFnZSIsIHBzeiwgaUxlbikgPT0gMCkgew0KKyAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9TZWxlY3Rvcik7DQorICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1NZTlRBWFNUQVRVU19QYWdlUnVsZTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9Vbmtub3duUnVsZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfQ1NTU1lOVEFYTU9ERV9DaGFyc2V0Og0KKyAgICAgICAgICBpZiAod2NoID09ICc7Jykgew0KKyAgICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7DQorICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9SdWxlU2V0KTsNCisgICAgICAgICAgICBpZiAoSXNDaGFyc2V0RW5hYmxlZCgpKSB7DQorICAgICAgICAgICAgICBEaXNhYmxlQ2hhcnNldCgpOw0KKyAgICAgICAgICAgICAgaWYgKG1faVRleHREYXRMZW4gPiAwKSB7DQorICAgICAgICAgICAgICAgIGlmIChtX3BTdHJlYW0gIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlID0gRlhfR2V0Q29kZVBhZ2VGb3JtU3RyaW5nVygNCisgICAgICAgICAgICAgICAgICAgICAgbV9UZXh0RGF0YS5HZXRCdWZmZXIoKSwgbV9pVGV4dERhdExlbik7DQorICAgICAgICAgICAgICAgICAgaWYgKHdDb2RlUGFnZSA8IDB4RkZGRiAmJg0KKyAgICAgICAgICAgICAgICAgICAgICBtX3BTdHJlYW0tPkdldENvZGVQYWdlKCkgIT0gd0NvZGVQYWdlKSB7DQorICAgICAgICAgICAgICAgICAgICBtX3BTdHJlYW0tPlNldENvZGVQYWdlKHdDb2RlUGFnZSk7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU1lOVEFYU1RBVFVTX0NoYXJzZXQ7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIEFwcGVuZENoYXIod2NoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0NTU1NZTlRBWE1PREVfVW5rbm93blJ1bGU6DQorICAgICAgICAgIGlmICh3Y2ggPT0gJzsnKSB7DQorICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9SdWxlU2V0KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBtX1RleHRQbGFuZS5Nb3ZlTmV4dCgpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIG1fZVN0YXR1czsNCit9DQorRlhfQk9PTCBDRkRFX0NTU1N5bnRheFBhcnNlcjo6SXNJbXBvcnRFbmFibGVkKCkgY29uc3Qgew0KKyAgaWYgKChtX2R3Q2hlY2sgJiBGREVfQ1NTU1lOVEFYQ0hFQ0tfQWxsb3dJbXBvcnQpID09IDApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKG1fTW9kZVN0YWNrLkdldFNpemUoKSA+IDEpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK2lubGluZSBGWF9CT09MIENGREVfQ1NTU3ludGF4UGFyc2VyOjpBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCkgew0KKyAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsNCisgIGlmIChtX1RleHREYXRhLkdldExlbmd0aCgpID4gMCB8fCB3Y2ggPiAnICcpIHsNCisgICAgbV9UZXh0RGF0YS5BcHBlbmRDaGFyKHdjaCk7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitpbmxpbmUgaW50MzJfdCBDRkRFX0NTU1N5bnRheFBhcnNlcjo6U2F2ZVRleHREYXRhKCkgew0KKyAgbV9pVGV4dERhdExlbiA9IG1fVGV4dERhdGEuVHJpbUVuZCgpOw0KKyAgbV9UZXh0RGF0YS5DbGVhcigpOw0KKyAgcmV0dXJuIG1faVRleHREYXRMZW47DQorfQ0KK2lubGluZSB2b2lkIENGREVfQ1NTU3ludGF4UGFyc2VyOjpTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFIGVNb2RlKSB7DQorICBtX2VNb2RlID0gZU1vZGU7DQorICBTYXZlVGV4dERhdGEoKTsNCit9DQoraW5saW5lIGludDMyX3QgQ0ZERV9DU1NTeW50YXhQYXJzZXI6OlN3aXRjaFRvQ29tbWVudCgpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IG1fVGV4dERhdGEuR2V0TGVuZ3RoKCk7DQorICBtX01vZGVTdGFjay5QdXNoKG1fZU1vZGUpOw0KKyAgU3dpdGNoTW9kZShGREVfQ1NTU1lOVEFYTU9ERV9Db21tZW50KTsNCisgIHJldHVybiBpTGVuZ3RoOw0KK30NCitpbmxpbmUgRlhfQk9PTCBDRkRFX0NTU1N5bnRheFBhcnNlcjo6UmVzdG9yZU1vZGUoKSB7DQorICBGREVfQ1NTU1lOVEFYTU9ERSogcE1vZGUgPSBtX01vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICBpZiAocE1vZGUgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBTd2l0Y2hNb2RlKCpwTW9kZSk7DQorICBtX01vZGVTdGFjay5Qb3AoKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitjb25zdCBGWF9XQ0hBUiogQ0ZERV9DU1NTeW50YXhQYXJzZXI6OkdldEN1cnJlbnRTdHJpbmcoaW50MzJfdCYgaUxlbmd0aCkgY29uc3Qgew0KKyAgaUxlbmd0aCA9IG1faVRleHREYXRMZW47DQorICByZXR1cm4gbV9UZXh0RGF0YS5HZXRCdWZmZXIoKTsNCit9DQorQ0ZERV9DU1NUZXh0QnVmOjpDRkRFX0NTU1RleHRCdWYoKQ0KKyAgICA6IG1fYkV4dEJ1ZihGQUxTRSksDQorICAgICAgbV9wQnVmZmVyKE5VTEwpLA0KKyAgICAgIG1faUJ1ZkxlbigwKSwNCisgICAgICBtX2lEYXRMZW4oMCksDQorICAgICAgbV9pRGF0UG9zKDApIHt9DQorQ0ZERV9DU1NUZXh0QnVmOjp+Q0ZERV9DU1NUZXh0QnVmKCkgew0KKyAgUmVzZXQoKTsNCit9DQordm9pZCBDRkRFX0NTU1RleHRCdWY6OlJlc2V0KCkgew0KKyAgaWYgKCFtX2JFeHRCdWYpIHsNCisgICAgRlhfRnJlZShtX3BCdWZmZXIpOw0KKyAgICBtX3BCdWZmZXIgPSBOVUxMOw0KKyAgfQ0KKyAgbV9pRGF0UG9zID0gbV9pRGF0TGVuID0gbV9pQnVmTGVuOw0KK30NCitGWF9CT09MIENGREVfQ1NTVGV4dEJ1Zjo6QXR0YWNoQnVmZmVyKGNvbnN0IEZYX1dDSEFSKiBwQnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQnVmTGVuKSB7DQorICBSZXNldCgpOw0KKyAgbV9wQnVmZmVyID0gKEZYX1dDSEFSKilwQnVmZmVyOw0KKyAgbV9pRGF0TGVuID0gbV9pQnVmTGVuID0gaUJ1ZkxlbjsNCisgIHJldHVybiBtX2JFeHRCdWYgPSBUUlVFOw0KK30NCitGWF9CT09MIENGREVfQ1NTVGV4dEJ1Zjo6RXN0aW1hdGVTaXplKGludDMyX3QgaUFsbG9jU2l6ZSkgew0KKyAgRlhTWVNfYXNzZXJ0KGlBbGxvY1NpemUgPiAwKTsNCisgIENsZWFyKCk7DQorICBtX2JFeHRCdWYgPSBGQUxTRTsNCisgIHJldHVybiBFeHBhbmRCdWYoaUFsbG9jU2l6ZSk7DQorfQ0KK2ludDMyX3QgQ0ZERV9DU1NUZXh0QnVmOjpMb2FkRnJvbVN0cmVhbShJRlhfU3RyZWFtKiBwVHh0U3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdHJlYW1PZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1heENoYXJzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRU9TKSB7DQorICBGWFNZU19hc3NlcnQoaVN0cmVhbU9mZnNldCA+PSAwICYmIGlNYXhDaGFycyA+IDApOw0KKyAgQ2xlYXIoKTsNCisgIG1fYkV4dEJ1ZiA9IEZBTFNFOw0KKyAgaWYgKCFFeHBhbmRCdWYoaU1heENoYXJzKSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHBUeHRTdHJlYW0tPkxvY2soKTsNCisgIGlmIChwVHh0U3RyZWFtLT5HZXRQb3NpdGlvbigpICE9IGlTdHJlYW1PZmZzZXQpIHsNCisgICAgcFR4dFN0cmVhbS0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCBpU3RyZWFtT2Zmc2V0KTsNCisgIH0NCisgIG1faURhdExlbiA9IHBUeHRTdHJlYW0tPlJlYWRTdHJpbmcobV9wQnVmZmVyLCBpTWF4Q2hhcnMsIGJFT1MpOw0KKyAgcFR4dFN0cmVhbS0+VW5sb2NrKCk7DQorICByZXR1cm4gbV9pRGF0TGVuOw0KK30NCitGWF9CT09MIENGREVfQ1NTVGV4dEJ1Zjo6RXhwYW5kQnVmKGludDMyX3QgaURlc2lyZWRTaXplKSB7DQorICBpZiAobV9iRXh0QnVmKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICghbV9wQnVmZmVyKSB7DQorICAgIG1fcEJ1ZmZlciA9IEZYX0FsbG9jKEZYX1dDSEFSLCBpRGVzaXJlZFNpemUpOw0KKyAgfSBlbHNlIGlmIChtX2lCdWZMZW4gIT0gaURlc2lyZWRTaXplKSB7DQorICAgIG1fcEJ1ZmZlciA9IEZYX1JlYWxsb2MoRlhfV0NIQVIsIG1fcEJ1ZmZlciwgaURlc2lyZWRTaXplKTsNCisgIH0gZWxzZSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaWYgKCFtX3BCdWZmZXIpIHsNCisgICAgbV9pQnVmTGVuID0gMDsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9pQnVmTGVuID0gaURlc2lyZWRTaXplOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZERV9DU1NUZXh0QnVmOjpTdWJ0cmFjdChpbnQzMl90IGlTdGFydCwgaW50MzJfdCBpTGVuZ3RoKSB7DQorICBGWFNZU19hc3NlcnQoaVN0YXJ0ID49IDAgJiYgaUxlbmd0aCA+IDApOw0KKyAgaWYgKGlMZW5ndGggPiBtX2lEYXRMZW4gLSBpU3RhcnQpIHsNCisgICAgaUxlbmd0aCA9IG1faURhdExlbiAtIGlTdGFydDsNCisgIH0NCisgIGlmIChpTGVuZ3RoIDwgMCkgew0KKyAgICBpTGVuZ3RoID0gMDsNCisgIH0gZWxzZSB7DQorICAgIEZYU1lTX21lbW1vdmUobV9wQnVmZmVyLCBtX3BCdWZmZXIgKyBpU3RhcnQsIGlMZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgIH0NCisgIG1faURhdExlbiA9IGlMZW5ndGg7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N5bnRheC5oIGIveGZhL3NyYy9mZHAvc3JjL2Nzcy9mZGVfY3Nzc3ludGF4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY2OTM1OAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmRwL3NyYy9jc3MvZmRlX2Nzc3N5bnRheC5oCkBAIC0wLDAgKzEsMTEwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZERV9DU1NTWU5UQVgNCisjZGVmaW5lIF9GREVfQ1NTU1lOVEFYDQorY2xhc3MgQ0ZERV9DU1NUZXh0QnVmIDogcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRkRFX0NTU1RleHRCdWYoKTsNCisgIH5DRkRFX0NTU1RleHRCdWYoKTsNCisgIEZYX0JPT0wgQXR0YWNoQnVmZmVyKGNvbnN0IEZYX1dDSEFSKiBwQnVmZmVyLCBpbnQzMl90IGlCdWZMZW4pOw0KKyAgRlhfQk9PTCBFc3RpbWF0ZVNpemUoaW50MzJfdCBpQWxsb2NTaXplKTsNCisgIGludDMyX3QgTG9hZEZyb21TdHJlYW0oSUZYX1N0cmVhbSogcFR4dFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RyZWFtT2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNYXhDaGFycywNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkVPUyk7DQorICBGWF9CT09MIEFwcGVuZENoYXIoRlhfV0NIQVIgd2NoKSB7DQorICAgIGlmIChtX2lEYXRMZW4gPj0gbV9pQnVmTGVuICYmICFFeHBhbmRCdWYobV9pQnVmTGVuICogMikpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcmV0dXJuIChtX3BCdWZmZXJbbV9pRGF0TGVuKytdID0gd2NoKSwgVFJVRTsNCisgIH0NCisgIHZvaWQgQ2xlYXIoKSB7IG1faURhdFBvcyA9IG1faURhdExlbiA9IDA7IH0NCisgIHZvaWQgUmVzZXQoKTsNCisgIGludDMyX3QgVHJpbUVuZCgpIHsNCisgICAgd2hpbGUgKG1faURhdExlbiA+IDAgJiYgbV9wQnVmZmVyW21faURhdExlbiAtIDFdIDw9ICcgJykgew0KKyAgICAgIC0tbV9pRGF0TGVuOw0KKyAgICB9DQorICAgIEFwcGVuZENoYXIoMCk7DQorICAgIHJldHVybiAtLW1faURhdExlbjsNCisgIH0NCisgIHZvaWQgU3VidHJhY3QoaW50MzJfdCBpU3RhcnQsIGludDMyX3QgaUxlbmd0aCk7DQorICBGWF9CT09MIElzRU9GKCkgY29uc3QgeyByZXR1cm4gbV9pRGF0UG9zID49IG1faURhdExlbjsgfQ0KKyAgRlhfV0NIQVIgR2V0QXQoaW50MzJfdCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9wQnVmZmVyW2luZGV4XTsgfQ0KKyAgRlhfV0NIQVIgR2V0Q2hhcigpIGNvbnN0IHsgcmV0dXJuIG1fcEJ1ZmZlclttX2lEYXRQb3NdOyB9DQorICBGWF9XQ0hBUiBHZXROZXh0Q2hhcigpIGNvbnN0IHsNCisgICAgcmV0dXJuIChtX2lEYXRQb3MgKyAxID49IG1faURhdExlbikgPyAwIDogbV9wQnVmZmVyW21faURhdFBvcyArIDFdOw0KKyAgfQ0KKyAgdm9pZCBNb3ZlTmV4dCgpIHsgbV9pRGF0UG9zKys7IH0NCisgIGludDMyX3QgR2V0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9pRGF0TGVuOyB9DQorICBjb25zdCBGWF9XQ0hBUiogR2V0QnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbV9wQnVmZmVyOyB9DQorDQorIHByb3RlY3RlZDoNCisgIEZYX0JPT0wgRXhwYW5kQnVmKGludDMyX3QgaURlc2lyZWRTaXplKTsNCisgIEZYX0JPT0wgbV9iRXh0QnVmOw0KKyAgRlhfV0NIQVIqIG1fcEJ1ZmZlcjsNCisgIGludDMyX3QgbV9pQnVmTGVuOw0KKyAgaW50MzJfdCBtX2lEYXRMZW47DQorICBpbnQzMl90IG1faURhdFBvczsNCit9Ow0KKyNkZWZpbmUgRkRFX0NTU1NZTlRBWENIRUNLX0FsbG93Q2hhcnNldCAxDQorI2RlZmluZSBGREVfQ1NTU1lOVEFYQ0hFQ0tfQWxsb3dJbXBvcnQgMg0KK2VudW0gRkRFX0NTU1NZTlRBWE1PREUgew0KKyAgRkRFX0NTU1NZTlRBWE1PREVfUnVsZVNldCwNCisgIEZERV9DU1NTWU5UQVhNT0RFX0NvbW1lbnQsDQorICBGREVfQ1NTU1lOVEFYTU9ERV9BdFJ1bGUsDQorICBGREVfQ1NTU1lOVEFYTU9ERV9Vbmtub3duUnVsZSwNCisgIEZERV9DU1NTWU5UQVhNT0RFX0NoYXJzZXQsDQorICBGREVfQ1NTU1lOVEFYTU9ERV9JbXBvcnQsDQorICBGREVfQ1NTU1lOVEFYTU9ERV9NZWRpYVJ1bGUsDQorICBGREVfQ1NTU1lOVEFYTU9ERV9VUkksDQorICBGREVfQ1NTU1lOVEFYTU9ERV9NZWRpYVR5cGUsDQorICBGREVfQ1NTU1lOVEFYTU9ERV9TZWxlY3RvciwNCisgIEZERV9DU1NTWU5UQVhNT0RFX1Byb3BlcnR5TmFtZSwNCisgIEZERV9DU1NTWU5UQVhNT0RFX1Byb3BlcnR5VmFsdWUsDQorfTsNCitjbGFzcyBDRkRFX0NTU1N5bnRheFBhcnNlciA6IHB1YmxpYyBJRkRFX0NTU1N5bnRheFBhcnNlciwgcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRkRFX0NTU1N5bnRheFBhcnNlcigpOw0KKyAgfkNGREVfQ1NTU3ludGF4UGFyc2VyKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgRlhfQk9PTCBJbml0KElGWF9TdHJlYW0qIHBTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDU1NQbGFuZVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlUZXh0RGF0YVNpemUgPSAzMiwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk9ubHlEZWNsYXJhdGlvbiA9IEZBTFNFKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJbml0KGNvbnN0IEZYX1dDSEFSKiBwQnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQnVmZmVyU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVRleHREYXRTaXplID0gMzIsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJPbmx5RGVjbGFyYXRpb24gPSBGQUxTRSk7DQorICB2aXJ0dWFsIEZERV9DU1NTWU5UQVhTVEFUVVMgRG9TeW50YXhQYXJzZSgpOw0KKyAgdmlydHVhbCBjb25zdCBGWF9XQ0hBUiogR2V0Q3VycmVudFN0cmluZyhpbnQzMl90JiBpTGVuZ3RoKSBjb25zdDsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBSZXNldChGWF9CT09MIGJPbmx5RGVjbGFyYXRpb24pOw0KKyAgdm9pZCBTd2l0Y2hNb2RlKEZERV9DU1NTWU5UQVhNT0RFIGVNb2RlKTsNCisgIGludDMyX3QgU3dpdGNoVG9Db21tZW50KCk7DQorDQorICBGWF9CT09MIFJlc3RvcmVNb2RlKCk7DQorICBGWF9CT09MIEFwcGVuZENoYXIoRlhfV0NIQVIgd2NoKTsNCisgIGludDMyX3QgU2F2ZVRleHREYXRhKCk7DQorICBGWF9CT09MIElzQ2hhcnNldEVuYWJsZWQoKSBjb25zdCB7DQorICAgIHJldHVybiAobV9kd0NoZWNrICYgRkRFX0NTU1NZTlRBWENIRUNLX0FsbG93Q2hhcnNldCkgIT0gMDsNCisgIH0NCisgIHZvaWQgRGlzYWJsZUNoYXJzZXQoKSB7IG1fZHdDaGVjayA9IEZERV9DU1NTWU5UQVhDSEVDS19BbGxvd0ltcG9ydDsgfQ0KKyAgRlhfQk9PTCBJc0ltcG9ydEVuYWJsZWQoKSBjb25zdDsNCisgIHZvaWQgRGlzYWJsZUltcG9ydCgpIHsgbV9kd0NoZWNrID0gMDsgfQ0KKyAgSUZYX1N0cmVhbSogbV9wU3RyZWFtOw0KKyAgaW50MzJfdCBtX2lTdHJlYW1Qb3M7DQorICBpbnQzMl90IG1faVBsYW5lU2l6ZTsNCisgIENGREVfQ1NTVGV4dEJ1ZiBtX1RleHREYXRhOw0KKyAgQ0ZERV9DU1NUZXh0QnVmIG1fVGV4dFBsYW5lOw0KKyAgaW50MzJfdCBtX2lUZXh0RGF0TGVuOw0KKyAgRlhfRFdPUkQgbV9kd0NoZWNrOw0KKyAgRkRFX0NTU1NZTlRBWE1PREUgbV9lTW9kZTsNCisgIEZERV9DU1NTWU5UQVhTVEFUVVMgbV9lU3RhdHVzOw0KKyAgQ0ZYX1N0YWNrVGVtcGxhdGU8RkRFX0NTU1NZTlRBWE1PREU+IG1fTW9kZVN0YWNrOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZGV2YmFzaWMuY3BwIGIveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZGV2YmFzaWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMDMwZjgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9kZXZiYXNpYy5jcHAKQEAgLTAsMCArMSw1NDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAiZmRlX2RldmJhc2ljLmgiDQorc3RhdGljIGNvbnN0IEZERV9IQVRDSERBVEEgZ3NfSGF0Y2hCaXRtYXBEYXRhW0ZERV9IQVRDSFNUWUxFX1RvdGFsXSA9IHsNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg0MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgyMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg0MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDIwLCAweDIwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDIwLCAweDIwLCAweDAwLCAweDAwLCAweDQwLCAweDQwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NDIsIDB4NDIsIDB4MDAsIDB4MDAsIDB4ODEsIDB4ODEsIDB4MDAsIDB4MDAsIDB4ODEsIDB4ODEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODEsIDB4ODEsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDExLCAweDExLCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDUxLCAweDUxLCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MTUsIDB4MTUsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1MSwgMHg1MSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MTUsIDB4MTUsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHhlZSwgMHhlZSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhiYiwgMHhiYiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGVlLCAweGVlLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4YmIsIDB4YmIsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4ZWUsIDB4ZWUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhiYiwgMHhiYiwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGVlLCAweGVlLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGJiLCAweGJiLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZGQsIDB4ZGQsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZGQsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHhlZiwgMHhlZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZSwgMHhmZSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGVmLCAweGVmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZWYsIDB4ZWYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZSwgMHhmZSwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGVmLCAweGVmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZlLCAweGZlLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGY3LCAweGY3LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4N2YsIDB4N2YsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmNywgMHhmNywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4N2YsIDB4N2YsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDExLCAweDExLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDExLCAweDExLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDExLCAweDExLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHgzMywgMHgzMywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MzMsIDB4MzMsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHgzMywgMHgzMywgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDMzLCAweDMzLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHgzMywgMHgzMywgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweDMzLCAweDMzLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4MzMsIDB4MzMsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDMzLCAweDMzLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHhjMSwgMHhjMSwgMHgwMCwgMHgwMCwgMHhlMCwgMHhlMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHg3MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDM4LCAweDM4LCAweDAwLCAweDAwLCAweDFjLCAweDFjLCAweDAwLCAweDAwLCAweDBlLCAweDBlLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDcsIDB4MDcsIDB4MDAsIDB4MDAsIDB4ODMsIDB4ODMsIDB4MDAsIDB4MDAsIDB4YzEsIDB4YzEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhlMCwgMHhlMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHg3MCwgMHgwMCwgMHgwMCwgMHgzOCwgMHgzOCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDFjLCAweDFjLCAweDAwLCAweDAwLCAweDBlLCAweDBlLCAweDAwLCAweDAwLCAweDA3LCAweDA3LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODMsIDB4ODMsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHg4MywgMHg4MywgMHgwMCwgMHgwMCwgMHgwNywgMHgwNywgMHgwMCwgMHgwMCwgMHgwZSwgMHgwZSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDFjLCAweDFjLCAweDAwLCAweDAwLCAweDM4LCAweDM4LCAweDAwLCAweDAwLCAweDcwLCAweDcwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZTAsIDB4ZTAsIDB4MDAsIDB4MDAsIDB4YzEsIDB4YzEsIDB4MDAsIDB4MDAsIDB4ODMsIDB4ODMsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwNywgMHgwNywgMHgwMCwgMHgwMCwgMHgwZSwgMHgwZSwgMHgwMCwgMHgwMCwgMHgxYywgMHgxYywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDM4LCAweDM4LCAweDAwLCAweDAwLCAweDcwLCAweDcwLCAweDAwLCAweDAwLCAweGUwLCAweGUwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4YzEsIDB4YzEsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDExLCAweDExLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDExLCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHhmMCwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHg0MCwgMHg0MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHg0MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDIwLCAweDIwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHhiMSwgMHhiMSwgMHgwMCwgMHgwMCwgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDFiLCAweDFiLCAweDAwLCAweDAwLCAweGQ4LCAweGQ4LCAweDAwLCAweDAwLCAweGMwLCAweGMwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MGMsIDB4MGMsIDB4MDAsIDB4MDAsIDB4OGQsIDB4OGQsIDB4MDAsIDB4MDAsIDB4YjEsIDB4YjEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMywgMHgwMCwgMHgwMCwgMHgxYiwgMHgxYiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGQ4LCAweGQ4LCAweDAwLCAweDAwLCAweGMwLCAweGMwLCAweDAwLCAweDAwLCAweDBjLCAweDBjLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4OGQsIDB4OGQsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4ODEsIDB4ODEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgxLCAweDgxLCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgyNSwgMHgyNSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGMwLCAweGMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MjUsIDB4MjUsIDB4MDAsIDB4MDAsIDB4YzAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgyNSwgMHgyNSwgMHgwMCwgMHgwMCwgMHhjMCwgMHhjMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDI1LCAweDI1LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4YzAsIDB4YzAsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NDIsIDB4NDIsIDB4MDAsIDB4MDAsIDB4ODEsIDB4ODEsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODEsIDB4ODEsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg1NCwgMHg1NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDQ1LCAweDQ1LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDE0LCAweDE0LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NTEsIDB4NTEsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg1NCwgMHg1NCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg0NSwgMHg0NSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDE0LCAweDE0LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NTEsIDB4NTEsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHgwMywgMHgwMywgMHgwMCwgMHgwMCwgMHg4NCwgMHg4NCwgMHgwMCwgMHgwMCwgMHg0OCwgMHg0OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDBjLCAweDBjLCAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDMsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4NCwgMHg4NCwgMHgwMCwgMHgwMCwgMHg0OCwgMHg0OCwgMHgwMCwgMHgwMCwgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDBjLCAweDBjLCAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHg4OSwgMHg4OSwgMHgwMCwgMHgwMCwgMHg4ZiwgMHg4ZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDhmLCAweDhmLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDk4LCAweDk4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZjgsIDB4ZjgsIDB4MDAsIDB4MDAsIDB4ZjgsIDB4ZjgsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4OSwgMHg4OSwgMHgwMCwgMHgwMCwgMHg4ZiwgMHg4ZiwgMHgwMCwgMHgwMCwgMHg4ZiwgMHg4ZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDk4LCAweDk4LCAweDAwLCAweDAwLCAweGY4LCAweGY4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZjgsIDB4ZjgsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHhmMCwgMHhmMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHhmMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHhmMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MGYsIDB4MGYsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmMCwgMHhmMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHhmMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHhmMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MGYsIDB4MGYsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHg4MiwgMHg4MiwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyOCwgMHgyOCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDI4LCAweDI4LCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODIsIDB4ODIsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4ODIsIDB4ODIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgyOCwgMHgyOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDI4LCAweDI4LCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDgyLCAweDgyLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCisgICAgezE2LA0KKyAgICAgMTYsDQorICAgICB7DQorICAgICAgICAgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgzOCwgMHgzOCwgMHgwMCwgMHgwMCwgMHg3YywgMHg3YywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZlLCAweGZlLCAweDAwLCAweDAwLCAweDdjLCAweDdjLCAweDAwLCAweDAwLCAweDM4LCAweDM4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgzOCwgMHgzOCwgMHgwMCwgMHgwMCwgMHg3YywgMHg3YywgMHgwMCwgMHgwMCwgMHhmZSwgMHhmZSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDdjLCAweDdjLCAweDAwLCAweDAwLCAweDM4LCAweDM4LCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICB9fSwNCit9Ow0KK0ZERV9MUENIQVRDSERBVEEgRkRFX0RFVkdldEhhdGNoRGF0YShpbnQzMl90IGlIYXRjaFN0eWxlKSB7DQorICBpZiAoaUhhdGNoU3R5bGUgPCBGREVfSEFUQ0hTVFlMRV9NaW4gfHwgaUhhdGNoU3R5bGUgPiBGREVfSEFUQ0hTVFlMRV9NYXgpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gJmdzX0hhdGNoQml0bWFwRGF0YVtpSGF0Y2hTdHlsZV07DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2RldmJhc2ljLmggYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9kZXZiYXNpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhN2YxZTQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9kZXZiYXNpYy5oCkBAIC0wLDAgKzEsMTYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRkRFX0RFVklDRV9CQVNJQ19JTVANCisjZGVmaW5lIF9GREVfREVWSUNFX0JBU0lDX0lNUA0KK3N0cnVjdCBGREVfSEFUQ0hEQVRBIHsNCisgIGludDMyX3QgaVdpZHRoOw0KKyAgaW50MzJfdCBpSGVpZ2h0Ow0KKyAgdWludDhfdCBNYXNrQml0c1s2NF07DQorfTsNCit0eXBlZGVmIEZERV9IQVRDSERBVEEgY29uc3QqIEZERV9MUENIQVRDSERBVEE7DQorRkRFX0xQQ0hBVENIREFUQSBGREVfREVWR2V0SGF0Y2hEYXRhKGludDMyX3QgaUhhdGNoU3R5bGUpOw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2dkaWRldmljZS5jcHAgYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZGlkZXZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMzVmNmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZGlkZXZpY2UuY3BwCkBAIC0wLDAgKzEsNjI5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJzdGRhZnguaCINCisjaW5jbHVkZSAiZmRlX2dkaWRldmljZS5oIg0KKyNpbmNsdWRlICJmZGVfZ2Rpb2JqZWN0LmgiDQorI2lmZGVmIF9GREVQTFVTDQorI2lmIF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjMyX01PQklMRV8gfHwgXA0KKyAgICBfRlhfT1NfID09IF9GWF9XSU42NF8NCitJRkRFX1JlbmRlckRldmljZSogSUZERV9SZW5kZXJEZXZpY2U6OkNyZWF0ZShDRlhfRElCaXRtYXAqIHBCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyKSB7DQorICByZXR1cm4gbmV3IENGREVfR2RpRGV2aWNlKHBCaXRtYXApOw0KK30NCitJRkRFX1JlbmRlckRldmljZSogSUZERV9SZW5kZXJEZXZpY2U6OkNyZWF0ZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlKSB7DQorICByZXR1cm4gTlVMTDsNCit9DQorQ0ZERV9HZGlEZXZpY2U6OkNGREVfR2RpRGV2aWNlKENGWF9ESUJpdG1hcCogcEJpdG1hcCkNCisgICAgOiBtX2R3R2x5cGhMZW4oMCksDQorICAgICAgbV9wR2x5cGhCdWYoTlVMTCksDQorICAgICAgbV9wR3JhcGhpY3MoTlVMTCksDQorICAgICAgbV9wQml0bWFwKE5VTEwpLA0KKyAgICAgIG1fcENsaXBQYXRoKE5VTEwpIHsNCisgIEZYU1lTX2Fzc2VydChwQml0bWFwICE9IE5VTEwpOw0KKyAgQklUTUFQSU5GTyBibWk7DQorICBGWFNZU19tZW1zZXQoJmJtaSwgMCwgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKTsNCisgIGJtaS5ibWlIZWFkZXIuYmlTaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOw0KKyAgYm1pLmJtaUhlYWRlci5iaVdpZHRoID0gcEJpdG1hcC0+R2V0V2lkdGgoKTsNCisgIGJtaS5ibWlIZWFkZXIuYmlIZWlnaHQgPSAtcEJpdG1hcC0+R2V0SGVpZ2h0KCk7DQorICBibWkuYm1pSGVhZGVyLmJpUGxhbmVzID0gMTsNCisgIGJtaS5ibWlIZWFkZXIuYmlCaXRDb3VudCA9IHBCaXRtYXAtPkdldEJQUCgpOw0KKyAgbV9wQml0bWFwID0gR2RpcGx1czo6Qml0bWFwOjpGcm9tQklUTUFQSU5GTygmYm1pLCBwQml0bWFwLT5HZXRCdWZmZXIoKSk7DQorICBGWFNZU19hc3NlcnQobV9wQml0bWFwICE9IE5VTEwpOw0KKyAgbV9wR3JhcGhpY3MgPSBHZGlwbHVzOjpHcmFwaGljczo6RnJvbUltYWdlKG1fcEJpdG1hcCk7DQorICBGWFNZU19hc3NlcnQobV9wR3JhcGhpY3MgIT0gTlVMTCk7DQorICBtX3J0Q2xpcFJlY3QuU2V0KDAsIDAsIChGWF9GTE9BVClwQml0bWFwLT5HZXRXaWR0aCgpLA0KKyAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpcEJpdG1hcC0+R2V0SGVpZ2h0KCkpOw0KKyAgbV9wR3JhcGhpY3MtPlNldENsaXAoKGNvbnN0IEdkaXBsdXM6OlJlY3RGJiltX3J0Q2xpcFJlY3QpOw0KK30NCitDRkRFX0dkaURldmljZTo6fkNGREVfR2RpRGV2aWNlKCkgew0KKyAgZGVsZXRlIG1fcEdyYXBoaWNzOw0KKyAgZGVsZXRlIG1fcEJpdG1hcDsNCisgIEZYX0ZyZWUobV9wR2x5cGhCdWYpOw0KK30NCitpbnQzMl90IENGREVfR2RpRGV2aWNlOjpHZXRXaWR0aCgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BCaXRtYXAtPkdldFdpZHRoKCk7DQorfQ0KK2ludDMyX3QgQ0ZERV9HZGlEZXZpY2U6OkdldEhlaWdodCgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BCaXRtYXAtPkdldEhlaWdodCgpOw0KK30NCitGREVfSERFVklDRVNUQVRFIENGREVfR2RpRGV2aWNlOjpTYXZlU3RhdGUoKSB7DQorICByZXR1cm4gKEZERV9IREVWSUNFU1RBVEUpbV9wR3JhcGhpY3MtPlNhdmUoKTsNCit9DQordm9pZCBDRkRFX0dkaURldmljZTo6UmVzdG9yZVN0YXRlKEZERV9IREVWSUNFU1RBVEUgaFN0YXRlKSB7DQorICBHZGlwbHVzOjpTdGF0dXMgZVJldCA9IG1fcEdyYXBoaWNzLT5SZXN0b3JlKChHZGlwbHVzOjpHcmFwaGljc1N0YXRlKWhTdGF0ZSk7DQorICBpZiAoZVJldCA9PSBHZGlwbHVzOjpPaykgew0KKyAgICBHZGlwbHVzOjpSZWN0IHJ0Ow0KKyAgICBlUmV0ID0gbV9wR3JhcGhpY3MtPkdldENsaXBCb3VuZHMoJnJ0KTsNCisgICAgaWYgKGVSZXQgPT0gR2RpcGx1czo6T2spIHsNCisgICAgICBtX3J0Q2xpcFJlY3QuU2V0KChGWF9GTE9BVClydC5YLCAoRlhfRkxPQVQpcnQuWSwgKEZYX0ZMT0FUKXJ0LldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKXJ0LkhlaWdodCk7DQorICAgIH0NCisgIH0NCit9DQorRlhfQk9PTCBDRkRFX0dkaURldmljZTo6U2V0Q2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3RGJiBydENsaXApIHsNCisgIG1fcnRDbGlwUmVjdCA9IHJ0Q2xpcDsNCisgIHJldHVybiBtX3BHcmFwaGljcy0+U2V0Q2xpcCgoY29uc3QgR2RpcGx1czo6UmVjdEYmKXJ0Q2xpcCkgPT0gR2RpcGx1czo6T2s7DQorfQ0KK2NvbnN0IENGWF9SZWN0RiYgQ0ZERV9HZGlEZXZpY2U6OkdldENsaXBSZWN0KCkgew0KKyAgcmV0dXJuIG1fcnRDbGlwUmVjdDsNCit9DQorRlhfQk9PTCBDRkRFX0dkaURldmljZTo6U2V0Q2xpcFBhdGgoY29uc3QgSUZERV9QYXRoKiBwQ2xpcCkgew0KKyAgbV9wQ2xpcFBhdGggPSAoQ0ZERV9HZGlQYXRoKilwQ2xpcDsNCisgIEdkaXBsdXM6OkdyYXBoaWNzUGF0aCogcFBhdGggPSBtX3BDbGlwUGF0aCA/ICZtX3BDbGlwUGF0aC0+bV9QYXRoIDogTlVMTDsNCisgIHJldHVybiBtX3BHcmFwaGljcy0+U2V0Q2xpcChwUGF0aCkgPT0gR2RpcGx1czo6T2s7DQorfQ0KK0lGREVfUGF0aCogQ0ZERV9HZGlEZXZpY2U6OkdldENsaXBQYXRoKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fcENsaXBQYXRoOw0KK30NCitGWF9GTE9BVCBDRkRFX0dkaURldmljZTo6R2V0RHBpWCgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BHcmFwaGljcy0+R2V0RHBpWCgpOw0KK30NCitGWF9GTE9BVCBDRkRFX0dkaURldmljZTo6R2V0RHBpWSgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BHcmFwaGljcy0+R2V0RHBpWSgpOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpEcmF3SW1hZ2UoSUZERV9JbWFnZSogcEltZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwU3JjUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBkc3RSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwSW1nTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwRGV2TWF0cml4KSB7DQorICBDRkRFX0dkaUltYWdlKiBwR2RpSW1nID0gKENGREVfR2RpSW1hZ2UqKXBJbWc7DQorICBGWFNZU19hc3NlcnQocEdkaUltZyAhPSBOVUxMICYmIHBHZGlJbWctPm1fcEltYWdlICE9IE5VTEwpOw0KKyAgQ0ZYX1JlY3RGIHNyY1JlY3Q7DQorICBpZiAocFNyY1JlY3QpIHsNCisgICAgc3JjUmVjdCA9ICpwU3JjUmVjdDsNCisgIH0gZWxzZSB7DQorICAgIHNyY1JlY3QubGVmdCA9IHNyY1JlY3QudG9wID0gMDsNCisgICAgc3JjUmVjdC53aWR0aCA9IChGWF9GTE9BVClwSW1nLT5HZXRJbWFnZVdpZHRoKCk7DQorICAgIHNyY1JlY3QuaGVpZ2h0ID0gKEZYX0ZMT0FUKXBJbWctPkdldEltYWdlSGVpZ2h0KCk7DQorICB9DQorICBDRlhfTWF0cml4IG1hdHJpeDsNCisgIGlmIChwSW1nTWF0cml4KSB7DQorICAgIG1hdHJpeCA9ICpwSW1nTWF0cml4Ow0KKyAgfSBlbHNlIHsNCisgICAgbWF0cml4LlJlc2V0KCk7DQorICB9DQorICBtYXRyaXguVHJhbnNsYXRlKGRzdFJlY3QubGVmdCwgZHN0UmVjdC50b3ApOw0KKyAgbWF0cml4LlNjYWxlKChkc3RSZWN0LndpZHRoIC8gc3JjUmVjdC53aWR0aCksDQorICAgICAgICAgICAgICAgKGRzdFJlY3QuaGVpZ2h0IC8gc3JjUmVjdC5oZWlnaHQpLCBUUlVFKTsNCisgIGlmIChwRGV2TWF0cml4KSB7DQorICAgIG1hdHJpeC5Db25jYXQoKnBEZXZNYXRyaXgpOw0KKyAgfQ0KKyAgQ0ZYX1BvaW50RiBkc3RQb2ludHNbM107DQorICBkc3RQb2ludHNbMF0uU2V0KDAsIDApOw0KKyAgZHN0UG9pbnRzWzFdLlNldChzcmNSZWN0LndpZHRoLCAwKTsNCisgIGRzdFBvaW50c1syXS5TZXQoMCwgc3JjUmVjdC5oZWlnaHQpOw0KKyAgbWF0cml4LlRyYW5zZm9ybVBvaW50cyhkc3RQb2ludHMsIDMpOw0KKyAgbV9wR3JhcGhpY3MtPkRyYXdJbWFnZShwR2RpSW1nLT5tX3BJbWFnZSwgKEdkaXBsdXM6OlBvaW50RiopZHN0UG9pbnRzLCAzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWN0LmxlZnQsIHNyY1JlY3QudG9wLCBzcmNSZWN0LndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWN0LmhlaWdodCwgR2RpcGx1czo6VW5pdFBpeGVsLCBOVUxMLCBOVUxMLCBOVUxMKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpEcmF3SW1hZ2UoQ0ZYX0RJQlNvdXJjZSogcERpYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwU3JjUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBkc3RSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwSW1nTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwRGV2TWF0cml4KSB7DQorICBGWFNZU19hc3NlcnQocERpYiAhPSBOVUxMKTsNCisgIEJJVE1BUElORk8gYm1pOw0KKyAgRlhTWVNfbWVtc2V0KCZibWksIDAsIHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSk7DQorICBibWkuYm1pSGVhZGVyLmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsNCisgIGJtaS5ibWlIZWFkZXIuYmlXaWR0aCA9IHBEaWItPkdldFdpZHRoKCk7DQorICBibWkuYm1pSGVhZGVyLmJpSGVpZ2h0ID0gcERpYi0+R2V0SGVpZ2h0KCk7DQorICBibWkuYm1pSGVhZGVyLmJpUGxhbmVzID0gMTsNCisgIGJtaS5ibWlIZWFkZXIuYmlCaXRDb3VudCA9IHBEaWItPkdldEJQUCgpOw0KKyAgR2RpcGx1czo6Qml0bWFwIGJtcCgmYm1pLCBwRGliLT5HZXRCdWZmZXIoKSk7DQorICBDRkRFX0dkaUltYWdlIGltZygmYm1wKTsNCisgIHJldHVybiBEcmF3SW1hZ2UoJmltZywgcFNyY1JlY3QsIGRzdFJlY3QsIHBJbWdNYXRyaXgsIHBEZXZNYXRyaXgpOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpEcmF3U3RyaW5nKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Gb250KiBwRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBCcnVzaCAhPSBOVUxMICYmIHBGb250ICE9IE5VTEwgJiYgcENoYXJQb3MgIT0gTlVMTCk7DQorICBGWF9BUkdCIGFyZ2IgPSAweEZGMDAwMDAwOw0KKyAgaWYgKHBCcnVzaC0+R2V0VHlwZSgpID09IEZERV9CUlVTSFRZUEVfU29saWQpIHsNCisgICAgYXJnYiA9ICgoSUZERV9Tb2xpZEJydXNoKilwQnJ1c2gpLT5HZXRDb2xvcigpOw0KKyAgfQ0KKyAgQ0ZERV9HZGlGb250KiBwR2RpRm9udCA9IChDRkRFX0dkaUZvbnQqKXBGb250Ow0KKyAgR0xZUEhNRVRSSUNTIGdtOw0KKyAgTUFUMiBtYXQyOw0KKyAgRlhfRkxPQVQgZlNjYWxlID0gZkZvbnRTaXplIC8gMTAwMC4wZjsNCisgIEZYX0ZMT0FUIG1hLCBtYiwgbWMsIG1kOw0KKyAgRlhfRkxPQVQgZngsIGZ5Ow0KKyAgd2hpbGUgKC0taUNvdW50ID49IDApIHsNCisgICAgbWIgPSBtYyA9IDA7DQorICAgIG1hID0gbWQgPSBmU2NhbGU7DQorICAgIGlmIChwQ2hhclBvcy0+bV9iR2x5cGhBZGp1c3QpIHsNCisgICAgICBGWF9GTE9BVCBhYSA9DQorICAgICAgICAgIG1hICogLXBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSArIG1iICogcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdOw0KKyAgICAgIEZYX0ZMT0FUIGJiID0NCisgICAgICAgICAgLW1hICogcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdICsgbWIgKiBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM107DQorICAgICAgRlhfRkxPQVQgY2MgPQ0KKyAgICAgICAgICBtYyAqIC1wQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gKyBtZCAqIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXTsNCisgICAgICBGWF9GTE9BVCBkZCA9DQorICAgICAgICAgIC1tYyAqIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSArIG1kICogcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdOw0KKyAgICAgIG1hID0gYWE7DQorICAgICAgbWIgPSBiYjsNCisgICAgICBtYyA9IGNjOw0KKyAgICAgIG1kID0gZGQ7DQorICAgIH0NCisgICAgaWYgKHBNYXRyaXgpIHsNCisgICAgICBGWF9GTE9BVCBhYSA9IG1hICogcE1hdHJpeC0+YSArIG1iICogcE1hdHJpeC0+YzsNCisgICAgICBGWF9GTE9BVCBiYiA9IG1hICogcE1hdHJpeC0+YiArIG1iICogcE1hdHJpeC0+ZDsNCisgICAgICBGWF9GTE9BVCBjYyA9IG1jICogcE1hdHJpeC0+YSArIG1kICogcE1hdHJpeC0+YzsNCisgICAgICBGWF9GTE9BVCBkZCA9IG1jICogcE1hdHJpeC0+YiArIG1kICogcE1hdHJpeC0+ZDsNCisgICAgICBtYSA9IGFhOw0KKyAgICAgIG1iID0gYmI7DQorICAgICAgbWMgPSBjYzsNCisgICAgICBtZCA9IGRkOw0KKyAgICB9DQorICAgICoobG9uZyopKCZtYXQyLmVNMTEpID0gKGxvbmcpKG1hICogNjU1MzYpOw0KKyAgICAqKGxvbmcqKSgmbWF0Mi5lTTIxKSA9IChsb25nKShtYiAqIDY1NTM2KTsNCisgICAgKihsb25nKikoJm1hdDIuZU0xMikgPSAobG9uZykobWMgKiA2NTUzNik7DQorICAgICoobG9uZyopKCZtYXQyLmVNMjIpID0gKGxvbmcpKG1kICogNjU1MzYpOw0KKyAgICBGWF9EV09SRCBkd1NpemUgPSBwR2RpRm9udC0+R2V0R2x5cGhESUJpdHMocENoYXJQb3MtPm1fR2x5cGhJbmRleCwgYXJnYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXQyLCBnbSwgTlVMTCwgMCk7DQorICAgIGlmIChkd1NpemUgPiAwKSB7DQorICAgICAgaWYgKG1fcEdseXBoQnVmID09IE5VTEwpIHsNCisgICAgICAgIG1fcEdseXBoQnVmID0gRlhfQWxsb2ModWludDhfdCwgZHdTaXplKTsNCisgICAgICAgIG1fZHdHbHlwaExlbiA9IGR3U2l6ZTsNCisgICAgICB9IGVsc2UgaWYgKG1fZHdHbHlwaExlbiA8IGR3U2l6ZSkgew0KKyAgICAgICAgbV9wR2x5cGhCdWYgPSBGWF9SZWFsbG9jKHVpbnQ4X3QsIG1fcEdseXBoQnVmLCBkd1NpemUpOw0KKyAgICAgICAgbV9kd0dseXBoTGVuID0gZHdTaXplOw0KKyAgICAgIH0NCisgICAgICBwR2RpRm9udC0+R2V0R2x5cGhESUJpdHMocENoYXJQb3MtPm1fR2x5cGhJbmRleCwgYXJnYiwgJm1hdDIsIGdtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BHbHlwaEJ1ZiwgbV9kd0dseXBoTGVuKTsNCisgICAgICBHZGlwbHVzOjpCaXRtYXAgYm1wKGdtLmdtQmxhY2tCb3hYLCBnbS5nbUJsYWNrQm94WSwgZ20uZ21CbGFja0JveFggKiA0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQzMmJwcEFSR0IsIG1fcEdseXBoQnVmKTsNCisgICAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgICAgZnggPSBwTWF0cml4LT5hICogcENoYXJQb3MtPm1fT3JpZ2luWCArDQorICAgICAgICAgICAgIHBNYXRyaXgtPmMgKiBwQ2hhclBvcy0+bV9PcmlnaW5ZICsgcE1hdHJpeC0+ZTsNCisgICAgICAgIGZ5ID0gcE1hdHJpeC0+YiAqIHBDaGFyUG9zLT5tX09yaWdpblggKw0KKyAgICAgICAgICAgICBwTWF0cml4LT5kICogcENoYXJQb3MtPm1fT3JpZ2luWSArIHBNYXRyaXgtPmY7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGZ4ID0gcENoYXJQb3MtPm1fT3JpZ2luWDsNCisgICAgICAgIGZ5ID0gcENoYXJQb3MtPm1fT3JpZ2luWTsNCisgICAgICB9DQorICAgICAgbV9wR3JhcGhpY3MtPkRyYXdJbWFnZSgmYm1wLCAoRlhTWVNfcm91bmQoZngpICsgZ20uZ21wdEdseXBoT3JpZ2luLngpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYU1lTX3JvdW5kKGZ5KSAtIGdtLmdtcHRHbHlwaE9yaWdpbi55KSk7DQorICAgIH0NCisgICAgcENoYXJQb3MrKzsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpEcmF3QXJjKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRBbmdsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN3ZWVwQW5nbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBzdGFydEFuZ2xlID0gRlhfUkFEMkRFRyhzdGFydEFuZ2xlKTsNCisgIHN3ZWVwQW5nbGUgPSBGWF9SQUQyREVHKHN3ZWVwQW5nbGUpOw0KKyAgR2RpcGx1czo6UGVuKiBwR2RpUGVuID0gQ3JlYXRlR2RpUGVuKHBQZW4sIGZQZW5XaWR0aCk7DQorICBpZiAocEdkaVBlbiA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEFwcGx5TWF0cml4KHBNYXRyaXgpOw0KKyAgR2RpcGx1czo6U3RhdHVzIHJldCA9DQorICAgICAgbV9wR3JhcGhpY3MtPkRyYXdBcmMocEdkaVBlbiwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC53aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmhlaWdodCwgc3RhcnRBbmdsZSwgc3dlZXBBbmdsZSk7DQorICBSZXN0b3JlTWF0cml4KHBNYXRyaXgpOw0KKyAgUmVsZWFzZUdkaVBlbihwR2RpUGVuKTsNCisgIHJldHVybiByZXQgPT0gR2RpcGx1czo6T2s7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkRyYXdCZXppZXIoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdDMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdDQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBHZGlwbHVzOjpQZW4qIHBHZGlQZW4gPSBDcmVhdGVHZGlQZW4ocFBlbiwgZlBlbldpZHRoKTsNCisgIGlmIChwR2RpUGVuID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQXBwbHlNYXRyaXgocE1hdHJpeCk7DQorICBHZGlwbHVzOjpTdGF0dXMgcmV0ID0gbV9wR3JhcGhpY3MtPkRyYXdCZXppZXIoDQorICAgICAgcEdkaVBlbiwgcHQxLngsIHB0MS55LCBwdDIueCwgcHQyLnksIHB0My54LCBwdDMueSwgcHQ0LngsIHB0NC55KTsNCisgIFJlc3RvcmVNYXRyaXgocE1hdHJpeCk7DQorICBSZWxlYXNlR2RpUGVuKHBHZGlQZW4pOw0KKyAgcmV0dXJuIHJldCA9PSBHZGlwbHVzOjpPazsNCit9DQorRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RHJhd0N1cnZlKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludHNGJiBwb2ludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNsb3NlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRlbnNpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIEdkaXBsdXM6OlBlbiogcEdkaVBlbiA9IENyZWF0ZUdkaVBlbihwUGVuLCBmUGVuV2lkdGgpOw0KKyAgaWYgKHBHZGlQZW4gPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBBcHBseU1hdHJpeChwTWF0cml4KTsNCisgIEdkaXBsdXM6OlN0YXR1cyByZXQgPQ0KKyAgICAgIGJDbG9zZWQNCisgICAgICAgICAgPyBtX3BHcmFwaGljcy0+RHJhd0Nsb3NlZEN1cnZlKA0KKyAgICAgICAgICAgICAgICBwR2RpUGVuLCAoY29uc3QgR2RpcGx1czo6UG9pbnRGKilwb2ludHMuR2V0RGF0YSgpLA0KKyAgICAgICAgICAgICAgICBwb2ludHMuR2V0U2l6ZSgpLCBmVGVuc2lvbikNCisgICAgICAgICAgOiBtX3BHcmFwaGljcy0+RHJhd0N1cnZlKHBHZGlQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgR2RpcGx1czo6UG9pbnRGKilwb2ludHMuR2V0RGF0YSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLkdldFNpemUoKSwgZlRlbnNpb24pOw0KKyAgUmVzdG9yZU1hdHJpeChwTWF0cml4KTsNCisgIFJlbGVhc2VHZGlQZW4ocEdkaVBlbik7DQorICByZXR1cm4gcmV0ID09IEdkaXBsdXM6Ok9rOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpEcmF3RWxsaXBzZShJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIEdkaXBsdXM6OlBlbiogcEdkaVBlbiA9IENyZWF0ZUdkaVBlbihwUGVuLCBmUGVuV2lkdGgpOw0KKyAgaWYgKHBHZGlQZW4gPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBBcHBseU1hdHJpeChwTWF0cml4KTsNCisgIEdkaXBsdXM6OlN0YXR1cyByZXQgPSBtX3BHcmFwaGljcy0+RHJhd0VsbGlwc2UocEdkaVBlbiwgcmVjdC5sZWZ0LCByZWN0LnRvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOw0KKyAgUmVzdG9yZU1hdHJpeChwTWF0cml4KTsNCisgIFJlbGVhc2VHZGlQZW4ocEdkaVBlbik7DQorICByZXR1cm4gcmV0ID09IEdkaXBsdXM6Ok9rOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpEcmF3TGluZXMoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgR2RpcGx1czo6UGVuKiBwR2RpUGVuID0gQ3JlYXRlR2RpUGVuKHBQZW4sIGZQZW5XaWR0aCk7DQorICBpZiAocEdkaVBlbiA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEFwcGx5TWF0cml4KHBNYXRyaXgpOw0KKyAgR2RpcGx1czo6U3RhdHVzIHJldCA9IG1fcEdyYXBoaWNzLT5EcmF3TGluZXMoDQorICAgICAgcEdkaVBlbiwgKGNvbnN0IEdkaXBsdXM6OlBvaW50RiopcG9pbnRzLkdldERhdGEoKSwgcG9pbnRzLkdldFNpemUoKSk7DQorICBBcHBseU1hdHJpeChwTWF0cml4KTsNCisgIFJlbGVhc2VHZGlQZW4ocEdkaVBlbik7DQorICByZXR1cm4gcmV0ID09IEdkaXBsdXM6Ok9rOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpEcmF3TGluZShJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBHZGlwbHVzOjpQZW4qIHBHZGlQZW4gPSBDcmVhdGVHZGlQZW4ocFBlbiwgZlBlbldpZHRoKTsNCisgIGlmIChwR2RpUGVuID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQXBwbHlNYXRyaXgocE1hdHJpeCk7DQorICBHZGlwbHVzOjpTdGF0dXMgcmV0ID0NCisgICAgICBtX3BHcmFwaGljcy0+RHJhd0xpbmUocEdkaVBlbiwgcHQxLngsIHB0MS55LCBwdDIueCwgcHQyLnkpOw0KKyAgUmVzdG9yZU1hdHJpeChwTWF0cml4KTsNCisgIFJlbGVhc2VHZGlQZW4ocEdkaVBlbik7DQorICByZXR1cm4gcmV0ID09IEdkaXBsdXM6Ok9rOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpEcmF3UGF0aChJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSUZERV9QYXRoKiBwUGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRkRFX0dkaVBhdGgqIHBHZGlQYXRoID0gKENGREVfR2RpUGF0aCopcFBhdGg7DQorICBpZiAocEdkaVBhdGggPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBHZGlwbHVzOjpQZW4qIHBHZGlQZW4gPSBDcmVhdGVHZGlQZW4ocFBlbiwgZlBlbldpZHRoKTsNCisgIGlmIChwR2RpUGVuID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQXBwbHlNYXRyaXgocE1hdHJpeCk7DQorICBHZGlwbHVzOjpTdGF0dXMgcmV0ID0gbV9wR3JhcGhpY3MtPkRyYXdQYXRoKHBHZGlQZW4sICZwR2RpUGF0aC0+bV9QYXRoKTsNCisgIFJlc3RvcmVNYXRyaXgocE1hdHJpeCk7DQorICBSZWxlYXNlR2RpUGVuKHBHZGlQZW4pOw0KKyAgcmV0dXJuIHJldCA9PSBHZGlwbHVzOjpPazsNCit9DQorRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RHJhd1BpZShJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzd2VlcEFuZ2xlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgc3RhcnRBbmdsZSA9IEZYX1JBRDJERUcoc3RhcnRBbmdsZSk7DQorICBzd2VlcEFuZ2xlID0gRlhfUkFEMkRFRyhzd2VlcEFuZ2xlKTsNCisgIEdkaXBsdXM6OlBlbiogcEdkaVBlbiA9IENyZWF0ZUdkaVBlbihwUGVuLCBmUGVuV2lkdGgpOw0KKyAgaWYgKHBHZGlQZW4gPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBBcHBseU1hdHJpeChwTWF0cml4KTsNCisgIEdkaXBsdXM6OlN0YXR1cyByZXQgPQ0KKyAgICAgIG1fcEdyYXBoaWNzLT5EcmF3UGllKHBHZGlQZW4sIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3Qud2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5oZWlnaHQsIHN0YXJ0QW5nbGUsIHN3ZWVwQW5nbGUpOw0KKyAgUmVzdG9yZU1hdHJpeChwTWF0cml4KTsNCisgIFJlbGVhc2VHZGlQZW4ocEdkaVBlbik7DQorICByZXR1cm4gcmV0ID09IEdkaXBsdXM6Ok9rOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpEcmF3Q2hvcmQoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzdGFydEFuZ2xlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzd2VlcEFuZ2xlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfQXJjRiBjaG9yZDsNCisgIGNob3JkLlNldChyZWN0LCBzdGFydEFuZ2xlLCBzd2VlcEFuZ2xlKTsNCisgIENGREVfR2RpUGF0aCBwYXRoOw0KKyAgcGF0aC5BZGRDaG9yZChjaG9yZCk7DQorICByZXR1cm4gRHJhd1BhdGgocFBlbiwgZlBlbldpZHRoLCAmcGF0aCwgcE1hdHJpeCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkRyYXdQb2x5Z29uKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIEdkaXBsdXM6OlBlbiogcEdkaVBlbiA9IENyZWF0ZUdkaVBlbihwUGVuLCBmUGVuV2lkdGgpOw0KKyAgaWYgKHBHZGlQZW4gPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBBcHBseU1hdHJpeChwTWF0cml4KTsNCisgIEdkaXBsdXM6OlN0YXR1cyByZXQgPSBtX3BHcmFwaGljcy0+RHJhd1BvbHlnb24oDQorICAgICAgcEdkaVBlbiwgKGNvbnN0IEdkaXBsdXM6OlBvaW50RiopcG9pbnRzLkdldERhdGEoKSwgcG9pbnRzLkdldFNpemUoKSk7DQorICBSZXN0b3JlTWF0cml4KHBNYXRyaXgpOw0KKyAgUmVsZWFzZUdkaVBlbihwR2RpUGVuKTsNCisgIHJldHVybiByZXQgPT0gR2RpcGx1czo6T2s7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkRyYXdSZWN0YW5nbGUoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBHZGlwbHVzOjpQZW4qIHBHZGlQZW4gPSBDcmVhdGVHZGlQZW4ocFBlbiwgZlBlbldpZHRoKTsNCisgIGlmIChwR2RpUGVuID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQXBwbHlNYXRyaXgocE1hdHJpeCk7DQorICBHZGlwbHVzOjpTdGF0dXMgcmV0ID0gbV9wR3JhcGhpY3MtPkRyYXdSZWN0YW5nbGUocEdkaVBlbiwgcmVjdC5sZWZ0LCByZWN0LnRvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7DQorICBSZXN0b3JlTWF0cml4KHBNYXRyaXgpOw0KKyAgUmVsZWFzZUdkaVBlbihwR2RpUGVuKTsNCisgIHJldHVybiByZXQgPT0gR2RpcGx1czo6T2s7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkRyYXdSb3VuZFJlY3RhbmdsZShJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9TaXplRiYgcm91bmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGREVfR2RpUGF0aCBwYXRoOw0KKyAgcGF0aC5BZGRSb3VuZFJlY3RhbmdsZShyZWN0LCByb3VuZCk7DQorICByZXR1cm4gRHJhd1BhdGgocFBlbiwgZlBlbldpZHRoLCAmcGF0aCwgcE1hdHJpeCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkZpbGxDbG9zZWRDdXJ2ZShJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludHNGJiBwb2ludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUZW5zaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBHZGlwbHVzOjpCcnVzaCogcEdkaUJydXNoID0gQ3JlYXRlR2RpQnJ1c2gocEJydXNoKTsNCisgIGlmIChwR2RpQnJ1c2ggPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBBcHBseU1hdHJpeChwTWF0cml4KTsNCisgIEdkaXBsdXM6OlN0YXR1cyByZXQgPSBtX3BHcmFwaGljcy0+RmlsbENsb3NlZEN1cnZlKA0KKyAgICAgIHBHZGlCcnVzaCwgKGNvbnN0IEdkaXBsdXM6OlBvaW50RiopcG9pbnRzLkdldERhdGEoKSwgcG9pbnRzLkdldFNpemUoKSwNCisgICAgICBHZGlwbHVzOjpGaWxsTW9kZUFsdGVybmF0ZSwgZlRlbnNpb24pOw0KKyAgUmVzdG9yZU1hdHJpeChwTWF0cml4KTsNCisgIFJlbGVhc2VHZGlCcnVzaChwR2RpQnJ1c2gpOw0KKyAgcmV0dXJuIHJldCA9PSBHZGlwbHVzOjpPazsNCit9DQorRlhfQk9PTCBDRkRFX0dkaURldmljZTo6RmlsbEVsbGlwc2UoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBHZGlwbHVzOjpCcnVzaCogcEdkaUJydXNoID0gQ3JlYXRlR2RpQnJ1c2gocEJydXNoKTsNCisgIGlmIChwR2RpQnJ1c2ggPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBBcHBseU1hdHJpeChwTWF0cml4KTsNCisgIEdkaXBsdXM6OlN0YXR1cyByZXQgPSBtX3BHcmFwaGljcy0+RmlsbEVsbGlwc2UocEdkaUJydXNoLCByZWN0LmxlZnQsIHJlY3QudG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7DQorICBSZXN0b3JlTWF0cml4KHBNYXRyaXgpOw0KKyAgUmVsZWFzZUdkaUJydXNoKHBHZGlCcnVzaCk7DQorICByZXR1cm4gcmV0ID09IEdkaXBsdXM6Ok9rOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpGaWxsUGF0aChJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSUZERV9QYXRoKiBwUGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRkRFX0dkaVBhdGgqIHBHZGlQYXRoID0gKENGREVfR2RpUGF0aCopcFBhdGg7DQorICBpZiAocEdkaVBhdGggPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBHZGlwbHVzOjpCcnVzaCogcEdkaUJydXNoID0gQ3JlYXRlR2RpQnJ1c2gocEJydXNoKTsNCisgIGlmIChwR2RpQnJ1c2ggPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBBcHBseU1hdHJpeChwTWF0cml4KTsNCisgIEdkaXBsdXM6OlN0YXR1cyByZXQgPSBtX3BHcmFwaGljcy0+RmlsbFBhdGgocEdkaUJydXNoLCAmcEdkaVBhdGgtPm1fUGF0aCk7DQorICBSZXN0b3JlTWF0cml4KHBNYXRyaXgpOw0KKyAgUmVsZWFzZUdkaUJydXNoKHBHZGlCcnVzaCk7DQorICByZXR1cm4gcmV0ID09IEdkaXBsdXM6Ok9rOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpGaWxsUGllKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzd2VlcEFuZ2xlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgc3RhcnRBbmdsZSA9IEZYX1JBRDJERUcoc3RhcnRBbmdsZSk7DQorICBzd2VlcEFuZ2xlID0gRlhfUkFEMkRFRyhzd2VlcEFuZ2xlKTsNCisgIEdkaXBsdXM6OkJydXNoKiBwR2RpQnJ1c2ggPSBDcmVhdGVHZGlCcnVzaChwQnJ1c2gpOw0KKyAgaWYgKHBHZGlCcnVzaCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEFwcGx5TWF0cml4KHBNYXRyaXgpOw0KKyAgR2RpcGx1czo6U3RhdHVzIHJldCA9DQorICAgICAgbV9wR3JhcGhpY3MtPkZpbGxQaWUocEdkaUJydXNoLCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QuaGVpZ2h0LCBzdGFydEFuZ2xlLCBzd2VlcEFuZ2xlKTsNCisgIFJlc3RvcmVNYXRyaXgocE1hdHJpeCk7DQorICBSZWxlYXNlR2RpQnJ1c2gocEdkaUJydXNoKTsNCisgIHJldHVybiByZXQgPT0gR2RpcGx1czo6T2s7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkZpbGxDaG9yZChJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRBbmdsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3dlZXBBbmdsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZYX0FyY0YgY2hvcmQ7DQorICBjaG9yZC5TZXQocmVjdCwgc3RhcnRBbmdsZSwgc3dlZXBBbmdsZSk7DQorICBDRkRFX0dkaVBhdGggcGF0aDsNCisgIHBhdGguQWRkQ2hvcmQoY2hvcmQpOw0KKyAgcmV0dXJuIEZpbGxQYXRoKHBCcnVzaCwgJnBhdGgsIHBNYXRyaXgpOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpGaWxsUG9seWdvbihJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBHZGlwbHVzOjpCcnVzaCogcEdkaUJydXNoID0gQ3JlYXRlR2RpQnJ1c2gocEJydXNoKTsNCisgIGlmIChwR2RpQnJ1c2ggPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBBcHBseU1hdHJpeChwTWF0cml4KTsNCisgIEdkaXBsdXM6OlN0YXR1cyByZXQgPSBtX3BHcmFwaGljcy0+RmlsbFBvbHlnb24oDQorICAgICAgcEdkaUJydXNoLCAoY29uc3QgR2RpcGx1czo6UG9pbnRGKilwb2ludHMuR2V0RGF0YSgpLCBwb2ludHMuR2V0U2l6ZSgpKTsNCisgIFJlc3RvcmVNYXRyaXgocE1hdHJpeCk7DQorICBSZWxlYXNlR2RpQnJ1c2gocEdkaUJydXNoKTsNCisgIHJldHVybiByZXQgPT0gR2RpcGx1czo6T2s7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9HZGlEZXZpY2U6OkZpbGxSZWN0YW5nbGUoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgR2RpcGx1czo6QnJ1c2gqIHBHZGlCcnVzaCA9IENyZWF0ZUdkaUJydXNoKHBCcnVzaCk7DQorICBpZiAocEdkaUJydXNoID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQXBwbHlNYXRyaXgocE1hdHJpeCk7DQorICBHZGlwbHVzOjpTdGF0dXMgcmV0ID0gbV9wR3JhcGhpY3MtPkZpbGxSZWN0YW5nbGUoDQorICAgICAgcEdkaUJydXNoLCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7DQorICBSZXN0b3JlTWF0cml4KHBNYXRyaXgpOw0KKyAgUmVsZWFzZUdkaUJydXNoKHBHZGlCcnVzaCk7DQorICByZXR1cm4gcmV0ID09IEdkaXBsdXM6Ok9rOw0KK30NCitGWF9CT09MIENGREVfR2RpRGV2aWNlOjpGaWxsUm91bmRSZWN0YW5nbGUoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9TaXplRiYgcm91bmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGREVfR2RpUGF0aCBwYXRoOw0KKyAgcGF0aC5BZGRSb3VuZFJlY3RhbmdsZShyZWN0LCByb3VuZCk7DQorICByZXR1cm4gRmlsbFBhdGgocEJydXNoLCAmcGF0aCwgcE1hdHJpeCk7DQorfQ0KK0dkaXBsdXM6OlBlbiogQ0ZERV9HZGlEZXZpY2U6OkNyZWF0ZUdkaVBlbihJRkRFX1BlbiogcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoKSB7DQorICBpZiAocFBlbiA9PSBOVUxMIHx8IGZQZW5XaWR0aCA8IDAuMDFmKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgR2RpcGx1czo6UGVuKiBwR2RpUGVuID0gTlVMTDsNCisgIHN3aXRjaCAocFBlbi0+R2V0VHlwZSgpKSB7DQorICAgIGNhc2UgRkRFX1BFTlRZUEVfU29saWRDb2xvcjogew0KKyAgICAgIEdkaXBsdXM6OkNvbG9yIGdkaUNvbG9yKChHZGlwbHVzOjpBUkdCKXBQZW4tPkdldENvbG9yKCkpOw0KKyAgICAgIHBHZGlQZW4gPSBuZXcgR2RpcGx1czo6UGVuKGdkaUNvbG9yLCBmUGVuV2lkdGgpOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZERV9QRU5UWVBFX0hhdGNoQnJ1c2g6DQorICAgIGNhc2UgRkRFX1BFTlRZUEVfVGV4dHVyZUJydXNoOg0KKyAgICBjYXNlIEZERV9QRU5UWVBFX0xpbmVhckdyYWRpZW50OiB7DQorICAgICAgR2RpcGx1czo6QnJ1c2gqIHBHZGlCcnVzaCA9IENyZWF0ZUdkaUJydXNoKHBQZW4tPkdldEJydXNoKCkpOw0KKyAgICAgIGlmIChwR2RpQnJ1c2gpIHsNCisgICAgICAgIHBHZGlQZW4gPSBuZXcgR2RpcGx1czo6UGVuKHBHZGlCcnVzaCwgZlBlbldpZHRoKTsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICB9DQorICBpZiAocEdkaVBlbikgew0KKyAgICBDRlhfRmxvYXRBcnJheSBkYXNoQXJyYXk7DQorICAgIHBQZW4tPkdldERhc2hBcnJheShkYXNoQXJyYXkpOw0KKyAgICBwR2RpUGVuLT5TZXREYXNoUGF0dGVybihkYXNoQXJyYXkuR2V0RGF0YSgpLCBkYXNoQXJyYXkuR2V0U2l6ZSgpKTsNCisgICAgcEdkaVBlbi0+U2V0RGFzaE9mZnNldChwUGVuLT5HZXREYXNoUGhhc2UoKSk7DQorICAgIHBHZGlQZW4tPlNldERhc2hTdHlsZSgoR2RpcGx1czo6RGFzaFN0eWxlKXBQZW4tPkdldERhc2hTdHlsZSgpKTsNCisgICAgcEdkaVBlbi0+U2V0U3RhcnRDYXAoKEdkaXBsdXM6OkxpbmVDYXApcFBlbi0+R2V0TGluZUNhcCgpKTsNCisgICAgcEdkaVBlbi0+U2V0RW5kQ2FwKChHZGlwbHVzOjpMaW5lQ2FwKXBQZW4tPkdldExpbmVDYXAoKSk7DQorICAgIHBHZGlQZW4tPlNldExpbmVKb2luKChHZGlwbHVzOjpMaW5lSm9pbilwUGVuLT5HZXRMaW5lSm9pbigpKTsNCisgICAgcEdkaVBlbi0+U2V0TWl0ZXJMaW1pdChwUGVuLT5HZXRNaXRlckxpbWl0KCkpOw0KKyAgfQ0KKyAgcmV0dXJuIHBHZGlQZW47DQorfQ0KK3ZvaWQgQ0ZERV9HZGlEZXZpY2U6OlJlbGVhc2VHZGlQZW4oR2RpcGx1czo6UGVuKiBwR2RpUGVuKSB7DQorICBpZiAocEdkaVBlbikgew0KKyAgICBSZWxlYXNlR2RpQnJ1c2gocEdkaVBlbi0+R2V0QnJ1c2goKSk7DQorICAgIGRlbGV0ZSBwR2RpUGVuOw0KKyAgfQ0KK30NCitHZGlwbHVzOjpCcnVzaCogQ0ZERV9HZGlEZXZpY2U6OkNyZWF0ZUdkaUJydXNoKElGREVfQnJ1c2gqIHBCcnVzaCkgew0KKyAgaWYgKHBCcnVzaCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgR2RpcGx1czo6QnJ1c2gqIHBHZGlCcnVzaCA9IE5VTEw7DQorICBzd2l0Y2ggKHBCcnVzaC0+R2V0VHlwZSgpKSB7DQorICAgIGNhc2UgRkRFX0JSVVNIVFlQRV9Tb2xpZDogew0KKyAgICAgIElGREVfU29saWRCcnVzaCogcFNvbGlkQnJ1c2ggPSAoSUZERV9Tb2xpZEJydXNoKilwQnJ1c2g7DQorICAgICAgR2RpcGx1czo6Q29sb3IgZ2RpQ29sb3IoKEdkaXBsdXM6OkFSR0IpcFNvbGlkQnJ1c2gtPkdldENvbG9yKCkpOw0KKyAgICAgIHBHZGlCcnVzaCA9IG5ldyBHZGlwbHVzOjpTb2xpZEJydXNoKGdkaUNvbG9yKTsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGREVfQlJVU0hUWVBFX0hhdGNoOiB7DQorICAgICAgSUZERV9IYXRjaEJydXNoKiBwSGF0Y2hCcnVzaCA9IChJRkRFX0hhdGNoQnJ1c2gqKXBCcnVzaDsNCisgICAgICBHZGlwbHVzOjpDb2xvciBmb3JlQ29sb3IoKEdkaXBsdXM6OkFSR0IpcEhhdGNoQnJ1c2gtPkdldENvbG9yKFRSVUUpKTsNCisgICAgICBHZGlwbHVzOjpDb2xvciBiYWNrQ29sb3IoKEdkaXBsdXM6OkFSR0IpcEhhdGNoQnJ1c2gtPkdldENvbG9yKEZBTFNFKSk7DQorICAgICAgR2RpcGx1czo6SGF0Y2hTdHlsZSBoYXRjaFN0eWxlID0NCisgICAgICAgICAgKEdkaXBsdXM6OkhhdGNoU3R5bGUpcEhhdGNoQnJ1c2gtPkdldEhhdGNoU3R5bGUoKTsNCisgICAgICBwR2RpQnJ1c2ggPSBuZXcgR2RpcGx1czo6SGF0Y2hCcnVzaChoYXRjaFN0eWxlLCBmb3JlQ29sb3IsIGJhY2tDb2xvcik7DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRkRFX0JSVVNIVFlQRV9UZXh0dXJlOiB7DQorICAgICAgSUZERV9UZXh0dXJlQnJ1c2gqIHBUZXh0dXJlQnJ1c2ggPSAoSUZERV9UZXh0dXJlQnJ1c2gqKXBCcnVzaDsNCisgICAgICBDRkRFX0dkaUltYWdlKiBwSW1nSG9sZGVyID0gKENGREVfR2RpSW1hZ2UqKXBUZXh0dXJlQnJ1c2gtPkdldEltYWdlKCk7DQorICAgICAgR2RpcGx1czo6SW1hZ2UqIHBHZGlJbWFnZSA9IHBJbWdIb2xkZXIgPyBwSW1nSG9sZGVyLT5tX3BJbWFnZSA6IE5VTEw7DQorICAgICAgR2RpcGx1czo6V3JhcE1vZGUgd3JhcE1vZGUgPQ0KKyAgICAgICAgICAoR2RpcGx1czo6V3JhcE1vZGUpcFRleHR1cmVCcnVzaC0+R2V0V3JhcE1vZGUoKTsNCisgICAgICBwR2RpQnJ1c2ggPSBuZXcgR2RpcGx1czo6VGV4dHVyZUJydXNoKHBHZGlJbWFnZSwgd3JhcE1vZGUpOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZERV9CUlVTSFRZUEVfTGluZWFyR3JhZGllbnQ6IHsNCisgICAgICBJRkRFX0xpbmVhckdyYWRpZW50QnJ1c2gqIHBMaW5lYXJCcnVzaCA9DQorICAgICAgICAgIChJRkRFX0xpbmVhckdyYWRpZW50QnJ1c2gqKXBCcnVzaDsNCisgICAgICBHZGlwbHVzOjpXcmFwTW9kZSB3cmFwTW9kZSA9DQorICAgICAgICAgIChHZGlwbHVzOjpXcmFwTW9kZSlwTGluZWFyQnJ1c2gtPkdldFdyYXBNb2RlKCk7DQorICAgICAgQ0ZYX1BvaW50RiBwdFN0YXJ0LCBwdEVuZDsNCisgICAgICBwTGluZWFyQnJ1c2gtPkdldExpbmVhclBvaW50cyhwdFN0YXJ0LCBwdEVuZCk7DQorICAgICAgRlhfQVJHQiBjclN0YXJ0LCBjckVuZDsNCisgICAgICBwTGluZWFyQnJ1c2gtPkdldExpbmVhckNvbG9ycyhjclN0YXJ0LCBjckVuZCk7DQorICAgICAgcEdkaUJydXNoID0gbmV3IEdkaXBsdXM6OkxpbmVhckdyYWRpZW50QnJ1c2goDQorICAgICAgICAgIChjb25zdCBHZGlwbHVzOjpQb2ludEYmKXB0U3RhcnQsIChjb25zdCBHZGlwbHVzOjpQb2ludEYmKXB0RW5kLA0KKyAgICAgICAgICAoY29uc3QgR2RpcGx1czo6Q29sb3ImKWNyU3RhcnQsIChjb25zdCBHZGlwbHVzOjpDb2xvciYpY3JFbmQpOw0KKyAgICB9IGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIHBHZGlCcnVzaDsNCit9DQordm9pZCBDRkRFX0dkaURldmljZTo6UmVsZWFzZUdkaUJydXNoKEdkaXBsdXM6OkJydXNoKiBwR2RpQnJ1c2gpIHsNCisgIGlmIChwR2RpQnJ1c2gpIHsNCisgICAgZGVsZXRlIHBHZGlCcnVzaDsNCisgIH0NCit9DQordm9pZCBDRkRFX0dkaURldmljZTo6QXBwbHlNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgbV9HcmFwaGljc1N0YXRlID0gbV9wR3JhcGhpY3MtPlNhdmUoKTsNCisgICAgR2RpcGx1czo6TWF0cml4IGdkaU1hdHJpeChwTWF0cml4LT5hLCBwTWF0cml4LT5iLCBwTWF0cml4LT5jLCBwTWF0cml4LT5kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYXRyaXgtPmUsIHBNYXRyaXgtPmYpOw0KKyAgICBtX3BHcmFwaGljcy0+U2V0VHJhbnNmb3JtKCZnZGlNYXRyaXgpOw0KKyAgfQ0KK30NCit2b2lkIENGREVfR2RpRGV2aWNlOjpSZXN0b3JlTWF0cml4KGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIG1fcEdyYXBoaWNzLT5SZXN0b3JlKG1fR3JhcGhpY3NTdGF0ZSk7DQorICB9DQorfQ0KKyNlbmRpZg0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2dkaWRldmljZS5oIGIveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZ2RpZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkYzlhNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2dkaWRldmljZS5oCkBAIC0wLDAgKzEsMTU3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZERV9HRElQTFVTREVWSUNFX0lNUA0KKyNkZWZpbmUgX0ZERV9HRElQTFVTREVWSUNFX0lNUA0KKyNpZmRlZiBfRkRFUExVUw0KKyNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU4zMl9NT0JJTEVfIHx8IFwNCisgICAgX0ZYX09TXyA9PSBfRlhfV0lONjRfDQorY2xhc3MgQ0ZERV9HZGlQYXRoOw0KK2NsYXNzIENGREVfR2RpRGV2aWNlIDogcHVibGljIElGREVfUmVuZGVyRGV2aWNlLCBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGREVfR2RpRGV2aWNlKENGWF9ESUJpdG1hcCogcERpYik7DQorICB+Q0ZERV9HZGlEZXZpY2UoKTsNCisNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFdpZHRoKCkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0SGVpZ2h0KCkgY29uc3Q7DQorICB2aXJ0dWFsIEZERV9IREVWSUNFU1RBVEUgU2F2ZVN0YXRlKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVzdG9yZVN0YXRlKEZERV9IREVWSUNFU1RBVEUgaFN0YXRlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRDbGlwUGF0aChjb25zdCBJRkRFX1BhdGgqIHBDbGlwKTsNCisgIHZpcnR1YWwgSUZERV9QYXRoKiBHZXRDbGlwUGF0aCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9CT09MIFNldENsaXBSZWN0KGNvbnN0IENGWF9SZWN0RiYgcnRDbGlwKTsNCisgIHZpcnR1YWwgY29uc3QgQ0ZYX1JlY3RGJiBHZXRDbGlwUmVjdCgpOw0KKw0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXREcGlYKCkgY29uc3Q7DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldERwaVkoKSBjb25zdDsNCisNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3SW1hZ2UoQ0ZYX0RJQlNvdXJjZSogcERpYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwU3JjUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBkc3RSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwSW1nTWF0cml4ID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcERldk1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdJbWFnZShJRkRFX0ltYWdlKiBwSW1nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBTcmNSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIGRzdFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBJbWdNYXRyaXggPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwRGV2TWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd1N0cmluZyhJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRm9udCogcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3QXJjKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRBbmdsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN3ZWVwQW5nbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd0JlemllcihJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0MywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0NCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3Q3VydmUoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2xvc2VkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVGVuc2lvbiA9IDAuNWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3RWxsaXBzZShJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3TGluZXMoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdMaW5lKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3UGF0aChJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSUZERV9QYXRoKiBwUGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd1BpZShJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzd2VlcEFuZ2xlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdDaG9yZChJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN3ZWVwQW5nbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3UG9seWdvbihJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd1JlY3RhbmdsZShJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3Um91bmRSZWN0YW5nbGUoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfU2l6ZUYmIHJvdW5kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRmlsbENsb3NlZEN1cnZlKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRlbnNpb24gPSAwLjVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRmlsbEVsbGlwc2UoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRmlsbFBhdGgoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElGREVfUGF0aCogcFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIEZpbGxQaWUoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRBbmdsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN3ZWVwQW5nbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRmlsbENob3JkKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzdGFydEFuZ2xlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzd2VlcEFuZ2xlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRmlsbFBvbHlnb24oSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludHNGJiBwb2ludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIEZpbGxSZWN0YW5nbGUoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIEZpbGxSb3VuZFJlY3RhbmdsZShJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1NpemVGJiByb3VuZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBHZGlwbHVzOjpQZW4qIENyZWF0ZUdkaVBlbihJRkRFX1BlbiogcFBlbiwgRlhfRkxPQVQgZlBlbldpZHRoKTsNCisgIHZvaWQgUmVsZWFzZUdkaVBlbihHZGlwbHVzOjpQZW4qIHBHZGlQZW4pOw0KKyAgR2RpcGx1czo6QnJ1c2gqIENyZWF0ZUdkaUJydXNoKElGREVfQnJ1c2gqIHBCcnVzaCk7DQorICB2b2lkIFJlbGVhc2VHZGlCcnVzaChHZGlwbHVzOjpCcnVzaCogcEdkaUJydXNoKTsNCisgIHZvaWQgQXBwbHlNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICB2b2lkIFJlc3RvcmVNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICBHZGlwbHVzOjpHcmFwaGljc1N0YXRlIG1fR3JhcGhpY3NTdGF0ZTsNCisgIEdkaXBsdXM6OkdyYXBoaWNzKiBtX3BHcmFwaGljczsNCisgIEdkaXBsdXM6OkJpdG1hcCogbV9wQml0bWFwOw0KKyAgdWludDhfdCogbV9wR2x5cGhCdWY7DQorICBGWF9EV09SRCBtX2R3R2x5cGhMZW47DQorICBDRlhfUmVjdEYgbV9ydENsaXBSZWN0Ow0KKyAgQ0ZERV9HZGlQYXRoKiBtX3BDbGlwUGF0aDsNCit9Ow0KKyNlbmRpZg0KKyNlbmRpZg0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2dlZGV2aWNlLmNwcCBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2dlZGV2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGU0NmQwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZ2VkZXZpY2UuY3BwCkBAIC0wLDAgKzEsNTc5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlIDxhbGdvcml0aG0+DQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAiZmRlX2dlZGV2aWNlLmgiDQorI2luY2x1ZGUgImZkZV9nZW9iamVjdC5oIg0KKyNpbmNsdWRlICJmZGVfZGV2YmFzaWMuaCINCisjaWZuZGVmIF9GREVQTFVTDQorI2lmZGVmIF9jcGx1c3BsdXMNCitleHRlbiAiQyIgew0KKyNlbmRpZg0KKyAgRlhfQk9PTCBGREVfR2V0U3RvY2tIYXRjaE1hc2soaW50MzJfdCBpSGF0Y2hTdHlsZSwgQ0ZYX0RJQml0bWFwICYgaGF0Y2hNYXNrKSB7DQorICAgIEZERV9MUENIQVRDSERBVEEgcERhdGEgPSBGREVfREVWR2V0SGF0Y2hEYXRhKGlIYXRjaFN0eWxlKTsNCisgICAgaWYgKCFwRGF0YSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBoYXRjaE1hc2suQ3JlYXRlKHBEYXRhLT5pV2lkdGgsIHBEYXRhLT5pSGVpZ2h0LCBGWERJQl8xYnBwTWFzayk7DQorICAgIEZYU1lTX21lbWNweShoYXRjaE1hc2suR2V0QnVmZmVyKCksIHBEYXRhLT5NYXNrQml0cywNCisgICAgICAgICAgICAgICAgIGhhdGNoTWFzay5HZXRQaXRjaCgpICogcERhdGEtPmlIZWlnaHQpOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisjaWZkZWYgX2NwbHVzcGx1cw0KK30NCisjZW5kaWYNCitJRkRFX1JlbmRlckRldmljZSogSUZERV9SZW5kZXJEZXZpY2U6OkNyZWF0ZShDRlhfRElCaXRtYXAqIHBCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmdiQnl0ZU9yZGVyKSB7DQorICBpZiAocEJpdG1hcCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0ZYX0Z4Z2VEZXZpY2UqIHBEZXZpY2UgPSBuZXcgQ0ZYX0Z4Z2VEZXZpY2U7DQorICBwRGV2aWNlLT5BdHRhY2gocEJpdG1hcCwgMCwgYlJnYkJ5dGVPcmRlcik7DQorICByZXR1cm4gbmV3IENGREVfRnhnZURldmljZShwRGV2aWNlLCBUUlVFKTsNCit9DQorSUZERV9SZW5kZXJEZXZpY2UqIElGREVfUmVuZGVyRGV2aWNlOjpDcmVhdGUoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSkgew0KKyAgcmV0dXJuIHBEZXZpY2UgPyBuZXcgQ0ZERV9GeGdlRGV2aWNlKHBEZXZpY2UsIEZBTFNFKSA6IG51bGxwdHI7DQorfQ0KK0NGREVfRnhnZURldmljZTo6Q0ZERV9GeGdlRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiT3duZXJEZXZpY2UpDQorICAgIDogbV9wRGV2aWNlKHBEZXZpY2UpLA0KKyAgICAgIG1fYk93bmVyRGV2aWNlKGJPd25lckRldmljZSksDQorICAgICAgbV9wQ2hhclBvcyhOVUxMKSwNCisgICAgICBtX2lDaGFyQ291bnQoMCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBEZXZpY2UgIT0gTlVMTCk7DQorICBGWF9SRUNUIHJ0ID0gbV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7DQorICBtX3J0Q2xpcC5TZXQoKEZYX0ZMT0FUKXJ0LmxlZnQsIChGWF9GTE9BVClydC50b3AsIChGWF9GTE9BVClydC5XaWR0aCgpLA0KKyAgICAgICAgICAgICAgIChGWF9GTE9BVClydC5IZWlnaHQoKSk7DQorfQ0KK0NGREVfRnhnZURldmljZTo6fkNGREVfRnhnZURldmljZSgpIHsNCisgIEZYX0ZyZWUobV9wQ2hhclBvcyk7DQorICBpZiAobV9iT3duZXJEZXZpY2UpDQorICAgIGRlbGV0ZSBtX3BEZXZpY2U7DQorfQ0KK2ludDMyX3QgQ0ZERV9GeGdlRGV2aWNlOjpHZXRXaWR0aCgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BEZXZpY2UtPkdldFdpZHRoKCk7DQorfQ0KK2ludDMyX3QgQ0ZERV9GeGdlRGV2aWNlOjpHZXRIZWlnaHQoKSBjb25zdCB7DQorICByZXR1cm4gbV9wRGV2aWNlLT5HZXRIZWlnaHQoKTsNCit9DQorRkRFX0hERVZJQ0VTVEFURSBDRkRFX0Z4Z2VEZXZpY2U6OlNhdmVTdGF0ZSgpIHsNCisgIG1fcERldmljZS0+U2F2ZVN0YXRlKCk7DQorICByZXR1cm4gTlVMTDsNCit9DQordm9pZCBDRkRFX0Z4Z2VEZXZpY2U6OlJlc3RvcmVTdGF0ZShGREVfSERFVklDRVNUQVRFIGhTdGF0ZSkgew0KKyAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsNCisgIGNvbnN0IEZYX1JFQ1QmIHJ0ID0gbV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7DQorICBtX3J0Q2xpcC5TZXQoKEZYX0ZMT0FUKXJ0LmxlZnQsIChGWF9GTE9BVClydC50b3AsIChGWF9GTE9BVClydC5XaWR0aCgpLA0KKyAgICAgICAgICAgICAgIChGWF9GTE9BVClydC5IZWlnaHQoKSk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpTZXRDbGlwUmVjdChjb25zdCBDRlhfUmVjdEYmIHJ0Q2xpcCkgew0KKyAgbV9ydENsaXAgPSBydENsaXA7DQorICBGWF9SRUNUIHJ0KChpbnQzMl90KUZYU1lTX2Zsb29yKHJ0Q2xpcC5sZWZ0KSwNCisgICAgICAgICAgICAgKGludDMyX3QpRlhTWVNfZmxvb3IocnRDbGlwLnRvcCksDQorICAgICAgICAgICAgIChpbnQzMl90KUZYU1lTX2NlaWwocnRDbGlwLnJpZ2h0KCkpLA0KKyAgICAgICAgICAgICAoaW50MzJfdClGWFNZU19jZWlsKHJ0Q2xpcC5ib3R0b20oKSkpOw0KKyAgcmV0dXJuIG1fcERldmljZS0+U2V0Q2xpcF9SZWN0KCZydCk7DQorfQ0KK2NvbnN0IENGWF9SZWN0RiYgQ0ZERV9GeGdlRGV2aWNlOjpHZXRDbGlwUmVjdCgpIHsNCisgIHJldHVybiBtX3J0Q2xpcDsNCit9DQorRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OlNldENsaXBQYXRoKGNvbnN0IElGREVfUGF0aCogcENsaXApIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQorSUZERV9QYXRoKiBDRkRFX0Z4Z2VEZXZpY2U6OkdldENsaXBQYXRoKCkgY29uc3Qgew0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX0ZMT0FUIENGREVfRnhnZURldmljZTo6R2V0RHBpWCgpIGNvbnN0IHsNCisgIHJldHVybiA5NjsNCit9DQorRlhfRkxPQVQgQ0ZERV9GeGdlRGV2aWNlOjpHZXREcGlZKCkgY29uc3Qgew0KKyAgcmV0dXJuIDk2Ow0KK30NCitGWF9CT09MIENGREVfRnhnZURldmljZTo6RHJhd0ltYWdlKENGWF9ESUJTb3VyY2UqIHBEaWIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBTcmNSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBkc3RSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcEltZ01hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBEZXZNYXRyaXgpIHsNCisgIEZYU1lTX2Fzc2VydChwRGliICE9IE5VTEwpOw0KKyAgQ0ZYX1JlY3RGIHNyY1JlY3Q7DQorICBpZiAocFNyY1JlY3QpIHsNCisgICAgc3JjUmVjdCA9ICpwU3JjUmVjdDsNCisgIH0gZWxzZSB7DQorICAgIHNyY1JlY3QuU2V0KDAsIDAsIChGWF9GTE9BVClwRGliLT5HZXRXaWR0aCgpLCAoRlhfRkxPQVQpcERpYi0+R2V0SGVpZ2h0KCkpOw0KKyAgfQ0KKyAgaWYgKHNyY1JlY3QuSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGWF9NYXRyaXggZGliMmZ4ZGV2Ow0KKyAgaWYgKHBJbWdNYXRyaXgpIHsNCisgICAgZGliMmZ4ZGV2ID0gKnBJbWdNYXRyaXg7DQorICB9IGVsc2Ugew0KKyAgICBkaWIyZnhkZXYuU2V0SWRlbnRpdHkoKTsNCisgIH0NCisgIGRpYjJmeGRldi5hID0gZHN0UmVjdC53aWR0aDsNCisgIGRpYjJmeGRldi5kID0gLWRzdFJlY3QuaGVpZ2h0Ow0KKyAgZGliMmZ4ZGV2LmUgPSBkc3RSZWN0LmxlZnQ7DQorICBkaWIyZnhkZXYuZiA9IGRzdFJlY3QuYm90dG9tKCk7DQorICBpZiAocERldk1hdHJpeCkgew0KKyAgICBkaWIyZnhkZXYuQ29uY2F0KCpwRGV2TWF0cml4KTsNCisgIH0NCisgIHZvaWQqIGhhbmRsZSA9IE5VTEw7DQorICBtX3BEZXZpY2UtPlN0YXJ0RElCaXRzKHBEaWIsIDI1NSwgMCwgKGNvbnN0IENGWF9NYXRyaXgqKSZkaWIyZnhkZXYsIDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSk7DQorICB3aGlsZSAobV9wRGV2aWNlLT5Db250aW51ZURJQml0cyhoYW5kbGUsIE5VTEwpKSB7DQorICB9DQorICBtX3BEZXZpY2UtPkNhbmNlbERJQml0cyhoYW5kbGUpOw0KKyAgcmV0dXJuIGhhbmRsZSAhPSBOVUxMOw0KK30NCitGWF9CT09MIENGREVfRnhnZURldmljZTo6RHJhd1N0cmluZyhJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnQqIHBGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBCcnVzaCAhPSBOVUxMICYmIHBGb250ICE9IE5VTEwgJiYgcENoYXJQb3MgIT0gTlVMTCAmJg0KKyAgICAgICAgICAgICAgIGlDb3VudCA+IDApOw0KKyAgQ0ZYX0ZvbnRDYWNoZSogcENhY2hlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCk7DQorICBDRlhfRm9udCogcEZ4Rm9udCA9IChDRlhfRm9udCopcEZvbnQtPkdldERldkZvbnQoKTsNCisgIHN3aXRjaCAocEJydXNoLT5HZXRUeXBlKCkpIHsNCisgICAgY2FzZSBGREVfQlJVU0hUWVBFX1NvbGlkOiB7DQorICAgICAgRlhfQVJHQiBhcmdiID0gKChJRkRFX1NvbGlkQnJ1c2gqKXBCcnVzaCktPkdldENvbG9yKCk7DQorICAgICAgaWYgKChwRm9udC0+R2V0Rm9udFN0eWxlcygpICYgRlhfRk9OVFNUWUxFX0l0YWxpYykgIT0gMCAmJg0KKyAgICAgICAgICAhcEZ4Rm9udC0+SXNJdGFsaWMoKSkgew0KKyAgICAgICAgRlhURVhUX0NIQVJQT1MqIHBDUCA9IChGWFRFWFRfQ0hBUlBPUyopcENoYXJQb3M7DQorICAgICAgICBGWF9GTE9BVCogcEFNOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyArK2kpIHsNCisgICAgICAgICAgc3RhdGljIGNvbnN0IEZYX0ZMT0FUIG1jID0gMC4yNjc5NDlmOw0KKyAgICAgICAgICBwQU0gPSBwQ1AtPm1fQWRqdXN0TWF0cml4Ow0KKyAgICAgICAgICBwQU1bMl0gPSBtYyAqIHBBTVswXSArIHBBTVsyXTsNCisgICAgICAgICAgcEFNWzNdID0gbWMgKiBwQU1bMV0gKyBwQU1bM107DQorICAgICAgICAgIHBDUCsrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBGWFRFWFRfQ0hBUlBPUyogcENQID0gKEZYVEVYVF9DSEFSUE9TKilwQ2hhclBvczsNCisgICAgICBJRlhfRm9udCogcEN1ckZvbnQgPSBOVUxMOw0KKyAgICAgIElGWF9Gb250KiBwU1RGb250ID0gTlVMTDsNCisgICAgICBGWFRFWFRfQ0hBUlBPUyogcEN1ckNQID0gTlVMTDsNCisgICAgICBpbnQzMl90IGlDdXJDb3VudCA9IDA7DQorI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCisgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZSA9IHBGb250LT5HZXRGb250U3R5bGVzKCk7DQorICAgICAgQ0ZYX0ZvbnQgRnhGb250Ow0KKyAgICAgIENGWF9TdWJzdEZvbnQgU3Vic3RGeEZvbnQ7DQorICAgICAgRnhGb250LlNldFN1YnN0Rm9udCgmU3Vic3RGeEZvbnQpOw0KKyAgICAgIFN1YnN0RnhGb250Lm1fV2VpZ2h0ID0gZHdGb250U3R5bGUgJiBGWF9GT05UU1RZTEVfQm9sZCA/IDcwMCA6IDQwMDsNCisgICAgICBTdWJzdEZ4Rm9udC5tX1dlaWdodENKSyA9IFN1YnN0RnhGb250Lm1fV2VpZ2h0Ow0KKyAgICAgIFN1YnN0RnhGb250Lm1fSXRhbGljQW5nbGUgPSBkd0ZvbnRTdHlsZSAmIEZYX0ZPTlRTVFlMRV9JdGFsaWMgPyAtMTIgOiAwOw0KKyAgICAgIFN1YnN0RnhGb250Lm1fYkl0bGljQ0pLID0gISEoZHdGb250U3R5bGUgJiBGWF9GT05UU1RZTEVfSXRhbGljKTsNCisjZW5kaWYNCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7ICsraSkgew0KKyAgICAgICAgcFNURm9udCA9IHBGb250LT5HZXRTdWJzdEZvbnQoKGludDMyX3QpcENQLT5tX0dseXBoSW5kZXgpOw0KKyAgICAgICAgcENQLT5tX0dseXBoSW5kZXggJj0gMHgwMEZGRkZGRjsNCisgICAgICAgIHBDUC0+bV9iRm9udFN0eWxlID0gRkFMU0U7DQorICAgICAgICBpZiAocEN1ckZvbnQgIT0gcFNURm9udCkgew0KKyAgICAgICAgICBpZiAocEN1ckZvbnQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIHBGeEZvbnQgPSAoQ0ZYX0ZvbnQqKXBDdXJGb250LT5HZXREZXZGb250KCk7DQorI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCisgICAgICAgICAgICBGeEZvbnQuU2V0RmFjZShwRnhGb250LT5HZXRGYWNlKCkpOw0KKyAgICAgICAgICAgIG1fcERldmljZS0+RHJhd05vcm1hbFRleHQoaUN1ckNvdW50LCBwQ3VyQ1AsICZGeEZvbnQsIHBDYWNoZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1mRm9udFNpemUsIChjb25zdCBDRlhfTWF0cml4KilwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnYiwgRlhURVhUX0NMRUFSVFlQRSk7DQorI2Vsc2UNCisgICAgICAgICAgICBtX3BEZXZpY2UtPkRyYXdOb3JtYWxUZXh0KGlDdXJDb3VudCwgcEN1ckNQLCBwRnhGb250LCBwQ2FjaGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtZkZvbnRTaXplLCAoY29uc3QgQ0ZYX01hdHJpeCopcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyNlbmRpZg0KKyAgICAgICAgICB9DQorICAgICAgICAgIHBDdXJGb250ID0gcFNURm9udDsNCisgICAgICAgICAgcEN1ckNQID0gcENQOw0KKyAgICAgICAgICBpQ3VyQ291bnQgPSAxOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgaUN1ckNvdW50Kys7DQorICAgICAgICB9DQorICAgICAgICBwQ1ArKzsNCisgICAgICB9DQorICAgICAgaWYgKHBDdXJGb250ICE9IE5VTEwgJiYgaUN1ckNvdW50KSB7DQorICAgICAgICBwRnhGb250ID0gKENGWF9Gb250KilwQ3VyRm9udC0+R2V0RGV2Rm9udCgpOw0KKyNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQorICAgICAgICBGeEZvbnQuU2V0RmFjZShwRnhGb250LT5HZXRGYWNlKCkpOw0KKyAgICAgICAgRlhfQk9PTCBiUmV0ID0gbV9wRGV2aWNlLT5EcmF3Tm9ybWFsVGV4dCgNCisgICAgICAgICAgICBpQ3VyQ291bnQsIHBDdXJDUCwgJkZ4Rm9udCwgcENhY2hlLCAtZkZvbnRTaXplLA0KKyAgICAgICAgICAgIChjb25zdCBDRlhfTWF0cml4KilwTWF0cml4LCBhcmdiLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCisgICAgICAgIEZ4Rm9udC5TZXRTdWJzdEZvbnQobnVsbHB0cik7DQorICAgICAgICBGeEZvbnQuU2V0RmFjZShudWxscHRyKTsNCisgICAgICAgIHJldHVybiBiUmV0Ow0KKyNlbHNlDQorICAgICAgICByZXR1cm4gbV9wRGV2aWNlLT5EcmF3Tm9ybWFsVGV4dChpQ3VyQ291bnQsIHBDdXJDUCwgcEZ4Rm9udCwgcENhY2hlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWZGb250U2l6ZSwgKGNvbnN0IENGWF9NYXRyaXgqKXBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdiLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCisjZW5kaWYNCisgICAgICB9DQorI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCisgICAgICBGeEZvbnQuU2V0U3Vic3RGb250KG51bGxwdHIpOw0KKyAgICAgIEZ4Rm9udC5TZXRGYWNlKG51bGxwdHIpOw0KKyNlbmRpZg0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9IGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgIH0NCit9DQorRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OkRyYXdCZXppZXIoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0NCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfUG9pbnRzRiBwb2ludHM7DQorICBwb2ludHMuQWRkKHB0MSk7DQorICBwb2ludHMuQWRkKHB0Mik7DQorICBwb2ludHMuQWRkKHB0Myk7DQorICBwb2ludHMuQWRkKHB0NCk7DQorICBDRkRFX1BhdGggcGF0aDsNCisgIHBhdGguQWRkQmV6aWVyKHBvaW50cyk7DQorICByZXR1cm4gRHJhd1BhdGgocFBlbiwgZlBlbldpZHRoLCAmcGF0aCwgcE1hdHJpeCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpEcmF3Q3VydmUoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2xvc2VkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRlbnNpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRkRFX1BhdGggcGF0aDsNCisgIHBhdGguQWRkQ3VydmUocG9pbnRzLCBiQ2xvc2VkLCBmVGVuc2lvbik7DQorICByZXR1cm4gRHJhd1BhdGgocFBlbiwgZlBlbldpZHRoLCAmcGF0aCwgcE1hdHJpeCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpEcmF3RWxsaXBzZShJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGREVfUGF0aCBwYXRoOw0KKyAgcGF0aC5BZGRFbGxpcHNlKHJlY3QpOw0KKyAgcmV0dXJuIERyYXdQYXRoKHBQZW4sIGZQZW5XaWR0aCwgJnBhdGgsIHBNYXRyaXgpOw0KK30NCitGWF9CT09MIENGREVfRnhnZURldmljZTo6RHJhd0xpbmVzKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGREVfUGF0aCBwYXRoOw0KKyAgcGF0aC5BZGRMaW5lcyhwb2ludHMpOw0KKyAgcmV0dXJuIERyYXdQYXRoKHBQZW4sIGZQZW5XaWR0aCwgJnBhdGgsIHBNYXRyaXgpOw0KK30NCitGWF9CT09MIENGREVfRnhnZURldmljZTo6RHJhd0xpbmUoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGREVfUGF0aCBwYXRoOw0KKyAgcGF0aC5BZGRMaW5lKHB0MSwgcHQyKTsNCisgIHJldHVybiBEcmF3UGF0aChwUGVuLCBmUGVuV2lkdGgsICZwYXRoLCBwTWF0cml4KTsNCit9DQorRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OkRyYXdQYXRoKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElGREVfUGF0aCogcFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGREVfUGF0aCogcEdlUGF0aCA9IChDRkRFX1BhdGgqKXBQYXRoOw0KKyAgaWYgKHBHZVBhdGggPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3JhcGhTdGF0ZTsNCisgIGlmICghQ3JlYXRlUGVuKHBQZW4sIGZQZW5XaWR0aCwgZ3JhcGhTdGF0ZSkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcERldmljZS0+RHJhd1BhdGgoJnBHZVBhdGgtPm1fUGF0aCwgKGNvbnN0IENGWF9NYXRyaXgqKXBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3JhcGhTdGF0ZSwgMCwgcFBlbi0+R2V0Q29sb3IoKSwgMCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpEcmF3UG9seWdvbihJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRkRFX1BhdGggcGF0aDsNCisgIHBhdGguQWRkUG9seWdvbihwb2ludHMpOw0KKyAgcmV0dXJuIERyYXdQYXRoKHBQZW4sIGZQZW5XaWR0aCwgJnBhdGgsIHBNYXRyaXgpOw0KK30NCitGWF9CT09MIENGREVfRnhnZURldmljZTo6RHJhd1JlY3RhbmdsZShJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGREVfUGF0aCBwYXRoOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocmVjdCk7DQorICByZXR1cm4gRHJhd1BhdGgocFBlbiwgZlBlbldpZHRoLCAmcGF0aCwgcE1hdHJpeCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpGaWxsQ2xvc2VkQ3VydmUoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUZW5zaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZERV9QYXRoIHBhdGg7DQorICBwYXRoLkFkZEN1cnZlKHBvaW50cywgVFJVRSwgZlRlbnNpb24pOw0KKyAgcmV0dXJuIEZpbGxQYXRoKHBCcnVzaCwgJnBhdGgsIHBNYXRyaXgpOw0KK30NCitGWF9CT09MIENGREVfRnhnZURldmljZTo6RmlsbEVsbGlwc2UoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGREVfUGF0aCBwYXRoOw0KKyAgcGF0aC5BZGRFbGxpcHNlKHJlY3QpOw0KKyAgcmV0dXJuIEZpbGxQYXRoKHBCcnVzaCwgJnBhdGgsIHBNYXRyaXgpOw0KK30NCitGWF9CT09MIENGREVfRnhnZURldmljZTo6RmlsbFBvbHlnb24oSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRkRFX1BhdGggcGF0aDsNCisgIHBhdGguQWRkUG9seWdvbihwb2ludHMpOw0KKyAgcmV0dXJuIEZpbGxQYXRoKHBCcnVzaCwgJnBhdGgsIHBNYXRyaXgpOw0KK30NCitGWF9CT09MIENGREVfRnhnZURldmljZTo6RmlsbFJlY3RhbmdsZShJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGREVfUGF0aCBwYXRoOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocmVjdCk7DQorICByZXR1cm4gRmlsbFBhdGgocEJydXNoLCAmcGF0aCwgcE1hdHJpeCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpDcmVhdGVQZW4oSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhTdGF0ZURhdGEmIGdyYXBoU3RhdGUpIHsNCisgIGlmIChwUGVuID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgZ3JhcGhTdGF0ZS5tX0xpbmVDYXAgPSAoQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwKXBQZW4tPkdldExpbmVDYXAoKTsNCisgIGdyYXBoU3RhdGUubV9MaW5lSm9pbiA9IChDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luKXBQZW4tPkdldExpbmVKb2luKCk7DQorICBncmFwaFN0YXRlLm1fTGluZVdpZHRoID0gZlBlbldpZHRoOw0KKyAgZ3JhcGhTdGF0ZS5tX01pdGVyTGltaXQgPSBwUGVuLT5HZXRNaXRlckxpbWl0KCk7DQorICBncmFwaFN0YXRlLm1fRGFzaFBoYXNlID0gcFBlbi0+R2V0RGFzaFBoYXNlKCk7DQorICBDRlhfRmxvYXRBcnJheSBkYXNoQXJyYXk7DQorICBzd2l0Y2ggKHBQZW4tPkdldERhc2hTdHlsZSgpKSB7DQorICAgIGNhc2UgRkRFX0RBU0hTVFlMRV9EYXNoOg0KKyAgICAgIGRhc2hBcnJheS5BZGQoMyk7DQorICAgICAgZGFzaEFycmF5LkFkZCgxKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGREVfREFTSFNUWUxFX0RvdDoNCisgICAgICBkYXNoQXJyYXkuQWRkKDEpOw0KKyAgICAgIGRhc2hBcnJheS5BZGQoMSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRkRFX0RBU0hTVFlMRV9EYXNoRG90Og0KKyAgICAgIGRhc2hBcnJheS5BZGQoMyk7DQorICAgICAgZGFzaEFycmF5LkFkZCgxKTsNCisgICAgICBkYXNoQXJyYXkuQWRkKDEpOw0KKyAgICAgIGRhc2hBcnJheS5BZGQoMSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRkRFX0RBU0hTVFlMRV9EYXNoRG90RG90Og0KKyAgICAgIGRhc2hBcnJheS5BZGQoMyk7DQorICAgICAgZGFzaEFycmF5LkFkZCgxKTsNCisgICAgICBkYXNoQXJyYXkuQWRkKDEpOw0KKyAgICAgIGRhc2hBcnJheS5BZGQoMSk7DQorICAgICAgZGFzaEFycmF5LkFkZCgxKTsNCisgICAgICBkYXNoQXJyYXkuQWRkKDEpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZERV9EQVNIU1RZTEVfQ3VzdG9taXplZDoNCisgICAgICBwUGVuLT5HZXREYXNoQXJyYXkoZGFzaEFycmF5KTsNCisgICAgICBicmVhazsNCisgIH0NCisgIGludDMyX3QgaURhc2hDb3VudCA9IGRhc2hBcnJheS5HZXRTaXplKCk7DQorICBpZiAoaURhc2hDb3VudCA+IDApIHsNCisgICAgZ3JhcGhTdGF0ZS5TZXREYXNoQ291bnQoaURhc2hDb3VudCk7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlEYXNoQ291bnQ7ICsraSkgew0KKyAgICAgIGdyYXBoU3RhdGUubV9EYXNoQXJyYXlbaV0gPSBkYXNoQXJyYXlbaV0gKiBmUGVuV2lkdGg7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCit0eXBlZGVmIEZYX0JPT0wgKENGREVfRnhnZURldmljZTo6KnBmRmlsbFBhdGgpKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCitzdGF0aWMgY29uc3QgcGZGaWxsUGF0aCBnc19GaWxsUGF0aFtdID0gew0KKyAgICAmQ0ZERV9GeGdlRGV2aWNlOjpGaWxsU29saWRQYXRoLCAmQ0ZERV9GeGdlRGV2aWNlOjpGaWxsSGF0Y2hQYXRoLA0KKyAgICAmQ0ZERV9GeGdlRGV2aWNlOjpGaWxsVGV4dHVyZVBhdGgsICZDRkRFX0Z4Z2VEZXZpY2U6OkZpbGxMaW5lYXJHcmFkaWVudFBhdGgsDQorfTsNCitGWF9CT09MIENGREVfRnhnZURldmljZTo6RmlsbFBhdGgoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJRkRFX1BhdGgqIHBQYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRkRFX1BhdGgqIHBHZVBhdGggPSAoQ0ZERV9QYXRoKilwUGF0aDsNCisgIGlmIChwR2VQYXRoID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHBCcnVzaCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGludDMyX3QgaVR5cGUgPSBwQnJ1c2gtPkdldFR5cGUoKTsNCisgIGlmIChpVHlwZSA8IDAgfHwgaVR5cGUgPiBGREVfQlJVU0hUWVBFX01BWCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gKHRoaXMtPipnc19GaWxsUGF0aFtpVHlwZV0pKHBCcnVzaCwgJnBHZVBhdGgtPm1fUGF0aCwgcE1hdHJpeCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpGaWxsU29saWRQYXRoKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIEZYU1lTX2Fzc2VydChwUGF0aCAmJiBwQnJ1c2ggJiYgcEJydXNoLT5HZXRUeXBlKCkgPT0gRkRFX0JSVVNIVFlQRV9Tb2xpZCk7DQorICBJRkRFX1NvbGlkQnJ1c2gqIHBTb2xpZEJydXNoID0gKElGREVfU29saWRCcnVzaCopcEJydXNoOw0KKyAgcmV0dXJuIG1fcERldmljZS0+RHJhd1BhdGgocFBhdGgsIChjb25zdCBDRlhfTWF0cml4KilwTWF0cml4LCBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNvbGlkQnJ1c2gtPkdldENvbG9yKCksIDAsIEZYRklMTF9XSU5ESU5HKTsNCit9DQorRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OkZpbGxIYXRjaFBhdGgoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBQYXRoICYmIHBCcnVzaCAmJiBwQnJ1c2gtPkdldFR5cGUoKSA9PSBGREVfQlJVU0hUWVBFX0hhdGNoKTsNCisgIElGREVfSGF0Y2hCcnVzaCogcEhhdGNoQnJ1c2ggPSAoSUZERV9IYXRjaEJydXNoKilwQnJ1c2g7DQorICBpbnQzMl90IGlTdHlsZSA9IHBIYXRjaEJydXNoLT5HZXRIYXRjaFN0eWxlKCk7DQorICBpZiAoaVN0eWxlIDwgRkRFX0hBVENIU1RZTEVfTWluIHx8IGlTdHlsZSA+IEZERV9IQVRDSFNUWUxFX01heCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfRElCaXRtYXAgbWFzazsNCisgIGlmICghRkRFX0dldFN0b2NrSGF0Y2hNYXNrKGlTdHlsZSwgbWFzaykpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRlhfQVJHQiBkd0ZvcmVDb2xvciA9IHBIYXRjaEJydXNoLT5HZXRDb2xvcihUUlVFKTsNCisgIEZYX0FSR0IgZHdCYWNrQ29sb3IgPSBwSGF0Y2hCcnVzaC0+R2V0Q29sb3IoRkFMU0UpOw0KKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0ZiA9IHBQYXRoLT5HZXRCb3VuZGluZ0JveCgpOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcmVjdGYuVHJhbnNmb3JtKChjb25zdCBDRlhfTWF0cml4KilwTWF0cml4KTsNCisgIH0NCisgIEZYX1JFQ1QgcmVjdChGWFNZU19yb3VuZChyZWN0Zi5sZWZ0KSwgRlhTWVNfcm91bmQocmVjdGYudG9wKSwNCisgICAgICAgICAgICAgICBGWFNZU19yb3VuZChyZWN0Zi5yaWdodCksIEZYU1lTX3JvdW5kKHJlY3RmLmJvdHRvbSkpOw0KKyAgbV9wRGV2aWNlLT5TYXZlU3RhdGUoKTsNCisgIG1fcERldmljZS0+U3RhcnRSZW5kZXJpbmcoKTsNCisgIG1fcERldmljZS0+U2V0Q2xpcF9QYXRoRmlsbChwUGF0aCwgKGNvbnN0IENGWF9NYXRyaXgqKXBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhGSUxMX1dJTkRJTkcpOw0KKyAgbV9wRGV2aWNlLT5GaWxsUmVjdCgmcmVjdCwgZHdCYWNrQ29sb3IpOw0KKyAgZm9yIChpbnQzMl90IGogPSByZWN0LmJvdHRvbTsgaiA8IHJlY3QudG9wOyBqICs9IG1hc2suR2V0SGVpZ2h0KCkpDQorICAgIGZvciAoaW50MzJfdCBpID0gcmVjdC5sZWZ0OyBpIDwgcmVjdC5yaWdodDsgaSArPSBtYXNrLkdldFdpZHRoKCkpIHsNCisgICAgICBtX3BEZXZpY2UtPlNldEJpdE1hc2soJm1hc2ssIGksIGosIGR3Rm9yZUNvbG9yKTsNCisgICAgfQ0KKyAgbV9wRGV2aWNlLT5FbmRSZW5kZXJpbmcoKTsNCisgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRkRFX0Z4Z2VEZXZpY2U6OkZpbGxUZXh0dXJlUGF0aChJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBQYXRoICYmIHBCcnVzaCAmJiBwQnJ1c2gtPkdldFR5cGUoKSA9PSBGREVfQlJVU0hUWVBFX1RleHR1cmUpOw0KKyAgSUZERV9UZXh0dXJlQnJ1c2gqIHBUZXh0dXJlQnJ1c2ggPSAoSUZERV9UZXh0dXJlQnJ1c2gqKXBCcnVzaDsNCisgIElGREVfSW1hZ2UqIHBJbWFnZSA9IChJRkRFX0ltYWdlKilwVGV4dHVyZUJydXNoLT5HZXRJbWFnZSgpOw0KKyAgaWYgKHBJbWFnZSA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGWF9TaXplIHNpemU7DQorICBzaXplLlNldChwSW1hZ2UtPkdldEltYWdlV2lkdGgoKSwgcEltYWdlLT5HZXRJbWFnZUhlaWdodCgpKTsNCisgIENGWF9ESUJpdG1hcCBibXA7DQorICBibXAuQ3JlYXRlKHNpemUueCwgc2l6ZS55LCBGWERJQl9BcmdiKTsNCisgIGlmICghcEltYWdlLT5TdGFydExvYWRJbWFnZSgmYm1wLCAwLCAwLCBzaXplLngsIHNpemUueSwgMCwgMCwgc2l6ZS54LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUueSkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHBJbWFnZS0+RG9Mb2FkSW1hZ2UoKSA8IDEwMCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBwSW1hZ2UtPlN0b3BMb2FkSW1hZ2UoKTsNCisgIHJldHVybiBXcmFwVGV4dHVyZShwVGV4dHVyZUJydXNoLT5HZXRXcmFwTW9kZSgpLCAmYm1wLCBwUGF0aCwgcE1hdHJpeCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpXcmFwVGV4dHVyZShpbnQzMl90IGlXcmFwTW9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfRmxvYXRSZWN0IHJlY3RmID0gcFBhdGgtPkdldEJvdW5kaW5nQm94KCk7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICByZWN0Zi5UcmFuc2Zvcm0oKGNvbnN0IENGWF9NYXRyaXgqKXBNYXRyaXgpOw0KKyAgfQ0KKyAgRlhfUkVDVCByZWN0KEZYU1lTX3JvdW5kKHJlY3RmLmxlZnQpLCBGWFNZU19yb3VuZChyZWN0Zi50b3ApLA0KKyAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKHJlY3RmLnJpZ2h0KSwgRlhTWVNfcm91bmQocmVjdGYuYm90dG9tKSk7DQorICByZWN0Lk5vcm1hbGl6ZSgpOw0KKyAgaWYgKHJlY3QuSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIG1fcERldmljZS0+U2F2ZVN0YXRlKCk7DQorICBtX3BEZXZpY2UtPlN0YXJ0UmVuZGVyaW5nKCk7DQorICBtX3BEZXZpY2UtPlNldENsaXBfUGF0aEZpbGwocFBhdGgsIChjb25zdCBDRlhfTWF0cml4KilwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRklMTF9XSU5ESU5HKTsNCisgIHN3aXRjaCAoaVdyYXBNb2RlKSB7DQorICAgIGNhc2UgRkRFX1dSQVBNT0RFX1RpbGU6DQorICAgIGNhc2UgRkRFX1dSQVBNT0RFX1RpbGVGbGlwWDoNCisgICAgY2FzZSBGREVfV1JBUE1PREVfVGlsZUZsaXBZOg0KKyAgICBjYXNlIEZERV9XUkFQTU9ERV9UaWxlRmxpcFhZOiB7DQorICAgICAgRlhfQk9PTCBiRmxpcFggPSBpV3JhcE1vZGUgPT0gRkRFX1dSQVBNT0RFX1RpbGVGbGlwWFkgfHwNCisgICAgICAgICAgICAgICAgICAgICAgIGlXcmFwTW9kZSA9PSBGREVfV1JBUE1PREVfVGlsZUZsaXBYOw0KKyAgICAgIEZYX0JPT0wgYkZsaXBZID0gaVdyYXBNb2RlID09IEZERV9XUkFQTU9ERV9UaWxlRmxpcFhZIHx8DQorICAgICAgICAgICAgICAgICAgICAgICBpV3JhcE1vZGUgPT0gRkRFX1dSQVBNT0RFX1RpbGVGbGlwWTsNCisgICAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBGbGlwWzJdWzJdOw0KKyAgICAgIHBGbGlwWzBdWzBdID0gcEJpdG1hcDsNCisgICAgICBwRmxpcFswXVsxXSA9IGJGbGlwWCA/IHBCaXRtYXAtPkZsaXBJbWFnZShUUlVFLCBGQUxTRSkgOiBwQml0bWFwOw0KKyAgICAgIHBGbGlwWzFdWzBdID0gYkZsaXBZID8gcEJpdG1hcC0+RmxpcEltYWdlKEZBTFNFLCBUUlVFKSA6IHBCaXRtYXA7DQorICAgICAgcEZsaXBbMV1bMV0gPQ0KKyAgICAgICAgICAoYkZsaXBYIHx8IGJGbGlwWSkgPyBwQml0bWFwLT5GbGlwSW1hZ2UoYkZsaXBYLCBiRmxpcFkpIDogcEJpdG1hcDsNCisgICAgICBpbnQzMl90IGlDb3VudGVyWSA9IDA7DQorICAgICAgZm9yIChpbnQzMl90IGogPSByZWN0LnRvcDsgaiA8IHJlY3QuYm90dG9tOyBqICs9IHBCaXRtYXAtPkdldEhlaWdodCgpKSB7DQorICAgICAgICBpbnQzMl90IGluZGV4WSA9IGlDb3VudGVyWSsrICUgMjsNCisgICAgICAgIGludDMyX3QgaUNvdW50ZXJYID0gMDsNCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gcmVjdC5sZWZ0OyBpIDwgcmVjdC5yaWdodDsgaSArPSBwQml0bWFwLT5HZXRXaWR0aCgpKSB7DQorICAgICAgICAgIGludDMyX3QgaW5kZXhYID0gaUNvdW50ZXJYKysgJSAyOw0KKyAgICAgICAgICBtX3BEZXZpY2UtPlNldERJQml0cyhwRmxpcFtpbmRleFldW2luZGV4WF0sIGksIGopOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAocEZsaXBbMF1bMV0gIT0gcEZsaXBbMF1bMF0pIHsNCisgICAgICAgIGRlbGV0ZSBwRmxpcFswXVsxXTsNCisgICAgICB9DQorICAgICAgaWYgKHBGbGlwWzFdWzBdICE9IHBGbGlwWzBdWzBdKSB7DQorICAgICAgICBkZWxldGUgcEZsaXBbMV1bMF07DQorICAgICAgfQ0KKyAgICAgIGlmIChwRmxpcFsxXVsxXSAhPSBwRmxpcFswXVswXSkgew0KKyAgICAgICAgZGVsZXRlIHBGbGlwWzFdWzFdOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGREVfV1JBUE1PREVfQ2xhbXA6IHsNCisgICAgICBtX3BEZXZpY2UtPlNldERJQml0cyhwQml0bWFwLCByZWN0LmxlZnQsIHJlY3QuYm90dG9tKTsNCisgICAgfSBicmVhazsNCisgIH0NCisgIG1fcERldmljZS0+RW5kUmVuZGVyaW5nKCk7DQorICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9GeGdlRGV2aWNlOjpGaWxsTGluZWFyR3JhZGllbnRQYXRoKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIEZYU1lTX2Fzc2VydChwUGF0aCAmJiBwQnJ1c2ggJiYNCisgICAgICAgICAgICAgICBwQnJ1c2gtPkdldFR5cGUoKSA9PSBGREVfQlJVU0hUWVBFX0xpbmVhckdyYWRpZW50KTsNCisgIElGREVfTGluZWFyR3JhZGllbnRCcnVzaCogcExpbmVhckJydXNoID0gKElGREVfTGluZWFyR3JhZGllbnRCcnVzaCopcEJydXNoOw0KKyAgQ0ZYX1BvaW50RiBwdDAsIHB0MTsNCisgIHBMaW5lYXJCcnVzaC0+R2V0TGluZWFyUG9pbnRzKHB0MCwgcHQxKTsNCisgIENGWF9WZWN0b3JGIGZEaWFnb25hbDsNCisgIGZEaWFnb25hbC5TZXQocHQwLCBwdDEpOw0KKyAgRlhfRkxPQVQgZlRoZXRhID0gRlhTWVNfYXRhbjIoZkRpYWdvbmFsLnksIGZEaWFnb25hbC54KTsNCisgIEZYX0ZMT0FUIGZMZW5ndGggPSBmRGlhZ29uYWwuTGVuZ3RoKCk7DQorICBGWF9GTE9BVCBmVG90YWxYID0gZkxlbmd0aCAvIEZYU1lTX2NvcyhmVGhldGEpOw0KKyAgRlhfRkxPQVQgZlRvdGFsWSA9IGZMZW5ndGggLyBGWFNZU19jb3MoRlhfUEkgLyAyIC0gZlRoZXRhKTsNCisgIEZYX0ZMT0FUIGZTdGVwcyA9IHN0ZDo6bWF4KGZUb3RhbFgsIGZUb3RhbFkpOw0KKyAgRlhfRkxPQVQgZHggPSBmVG90YWxYIC8gZlN0ZXBzOw0KKyAgRlhfRkxPQVQgZHkgPSBmVG90YWxZIC8gZlN0ZXBzOw0KKyAgRlhfQVJHQiBjcjAsIGNyMTsNCisgIHBMaW5lYXJCcnVzaC0+R2V0TGluZWFyQ29sb3JzKGNyMCwgY3IxKTsNCisgIEZYX0ZMT0FUIGEwID0gRlhBUkdCX0EoY3IwKTsNCisgIEZYX0ZMT0FUIHIwID0gRlhBUkdCX1IoY3IwKTsNCisgIEZYX0ZMT0FUIGcwID0gRlhBUkdCX0coY3IwKTsNCisgIEZYX0ZMT0FUIGIwID0gRlhBUkdCX0IoY3IwKTsNCisgIEZYX0ZMT0FUIGRhID0gKEZYQVJHQl9BKGNyMSkgLSBhMCkgLyBmU3RlcHM7DQorICBGWF9GTE9BVCBkciA9IChGWEFSR0JfUihjcjEpIC0gcjApIC8gZlN0ZXBzOw0KKyAgRlhfRkxPQVQgZGcgPSAoRlhBUkdCX0coY3IxKSAtIGcwKSAvIGZTdGVwczsNCisgIEZYX0ZMT0FUIGRiID0gKEZYQVJHQl9CKGNyMSkgLSBiMCkgLyBmU3RlcHM7DQorICBDRlhfRElCaXRtYXAgYm1wOw0KKyAgYm1wLkNyZWF0ZShGWFNZU19yb3VuZChGWFNZU19mYWJzKGZEaWFnb25hbC54KSksDQorICAgICAgICAgICAgIEZYU1lTX3JvdW5kKEZYU1lTX2ZhYnMoZkRpYWdvbmFsLnkpKSwgRlhESUJfQXJnYik7DQorICBDRlhfRnhnZURldmljZSBkZXY7DQorICBkZXYuQXR0YWNoKCZibXApOw0KKyAgcHQxID0gcHQwOw0KKyAgaW50MzJfdCBpU3RlcHMgPSBGWFNZU19yb3VuZChGWFNZU19jZWlsKGZTdGVwcykpOw0KKyAgd2hpbGUgKC0taVN0ZXBzID49IDApIHsNCisgICAgY3IwID0gQXJnYkVuY29kZShGWFNZU19yb3VuZChhMCksIEZYU1lTX3JvdW5kKHIwKSwgRlhTWVNfcm91bmQoZzApLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKGIwKSk7DQorICAgIGRldi5EcmF3Q29zbWV0aWNMaW5lKHB0MC54LCBwdDAueSwgcHQxLngsIHB0MS55LCBjcjApOw0KKyAgICBwdDEueCArPSBkeDsNCisgICAgcHQwLnkgKz0gZHk7DQorICAgIGEwICs9IGRhOw0KKyAgICByMCArPSBkcjsNCisgICAgZzAgKz0gZGc7DQorICAgIGIwICs9IGRiOw0KKyAgfQ0KKyAgcmV0dXJuIFdyYXBUZXh0dXJlKHBMaW5lYXJCcnVzaC0+R2V0V3JhcE1vZGUoKSwgJmJtcCwgcFBhdGgsIHBNYXRyaXgpOw0KK30NCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZWRldmljZS5oIGIveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZ2VkZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmYwNDVmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZ2VkZXZpY2UuaApAQCAtMCwwICsxLDEzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GREVfRlhHRURFVklDRV9JTVANCisjZGVmaW5lIF9GREVfRlhHRURFVklDRV9JTVANCisjaWZuZGVmIF9GREVQTFVTDQorY2xhc3MgQ0ZERV9GeGdlRGV2aWNlIDogcHVibGljIElGREVfUmVuZGVyRGV2aWNlLCBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGREVfRnhnZURldmljZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBGWF9CT09MIGJPd25lckRldmljZSk7DQorICB+Q0ZERV9GeGdlRGV2aWNlKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRXaWR0aCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IEdldEhlaWdodCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGREVfSERFVklDRVNUQVRFIFNhdmVTdGF0ZSgpOw0KKyAgdmlydHVhbCB2b2lkIFJlc3RvcmVTdGF0ZShGREVfSERFVklDRVNUQVRFIGhTdGF0ZSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Q2xpcFBhdGgoY29uc3QgSUZERV9QYXRoKiBwQ2xpcCk7DQorICB2aXJ0dWFsIElGREVfUGF0aCogR2V0Q2xpcFBhdGgoKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRDbGlwUmVjdChjb25zdCBDRlhfUmVjdEYmIHJ0Q2xpcCk7DQorICB2aXJ0dWFsIGNvbnN0IENGWF9SZWN0RiYgR2V0Q2xpcFJlY3QoKTsNCisNCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0RHBpWCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXREcGlZKCkgY29uc3Q7DQorDQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd0ltYWdlKENGWF9ESUJTb3VyY2UqIHBEaWIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFNyY1JlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgZHN0UmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcEltZ01hdHJpeCA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBEZXZNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3U3RyaW5nKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Gb250KiBwRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdCZXppZXIoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdDMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdDQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd0N1cnZlKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludHNGJiBwb2ludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNsb3NlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRlbnNpb24gPSAwLjVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd0VsbGlwc2UoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd0xpbmVzKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludHNGJiBwb2ludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3TGluZShJRkRFX1BlbiogcFBlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRHJhd1BhdGgoSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElGREVfUGF0aCogcFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdQb2x5Z29uKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3UmVjdGFuZ2xlKElGREVfUGVuKiBwUGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIEZpbGxDbG9zZWRDdXJ2ZShJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludHNGJiBwb2ludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUZW5zaW9uID0gMC41ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIEZpbGxFbGxpcHNlKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIEZpbGxQYXRoKElGREVfQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJRkRFX1BhdGgqIHBQYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBGaWxsUG9seWdvbihJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50c0YmIHBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRmlsbFJlY3RhbmdsZShJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICBGWF9CT09MIEZpbGxTb2xpZFBhdGgoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICBGWF9CT09MIEZpbGxIYXRjaFBhdGgoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICBGWF9CT09MIEZpbGxUZXh0dXJlUGF0aChJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICBGWF9CT09MIEZpbGxMaW5lYXJHcmFkaWVudFBhdGgoSUZERV9CcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICBGWF9CT09MIERyYXdTb2xpZFN0cmluZyhJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRm9udCogcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOw0KKyAgRlhfQk9PTCBEcmF3U3RyaW5nUGF0aChJRkRFX0JydXNoKiBwQnJ1c2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Gb250KiBwRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgRlhfQk9PTCBDcmVhdGVQZW4oSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhTdGF0ZURhdGEmIGdyYXBoU3RhdGUpOw0KKyAgRlhfQk9PTCBXcmFwVGV4dHVyZShpbnQzMl90IGlXcmFwTW9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIENGWF9SZW5kZXJEZXZpY2UqIG1fcERldmljZTsNCisgIENGWF9SZWN0RiBtX3J0Q2xpcDsNCisgIEZYX0JPT0wgbV9iT3duZXJEZXZpY2U7DQorICBGWFRFWFRfQ0hBUlBPUyogbV9wQ2hhclBvczsNCisgIGludDMyX3QgbV9pQ2hhckNvdW50Ow0KK307DQorI2VuZGlmDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZ2VvYmplY3QuY3BwIGIveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfZ2VvYmplY3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNzcwODEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZW9iamVjdC5jcHAKQEAgLTAsMCArMSwyNjcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAiZmRlX29iamVjdC5oIg0KKyNpbmNsdWRlICJmZGVfZ2VvYmplY3QuaCINCisjaWZuZGVmIF9GREVQTFVTDQorSUZERV9QYXRoKiBJRkRFX1BhdGg6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBuZXcgQ0ZERV9QYXRoOw0KK30NCitGWF9CT09MIENGREVfUGF0aDo6U3RhcnRGaWd1cmUoKSB7DQorICByZXR1cm4gQ2xvc2VGaWd1cmUoKTsNCit9DQorRlhfQk9PTCBDRkRFX1BhdGg6OkNsb3NlRmlndXJlKCkgew0KKyAgRlhfUEFUSFBPSU5UKiBwUG9pbnQgPSBHZXRMYXN0UG9pbnQoKTsNCisgIGlmIChwUG9pbnQpIHsNCisgICAgcFBvaW50LT5tX0ZsYWcgfD0gRlhQVF9DTE9TRUZJR1VSRTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9QQVRIUE9JTlQqIENGREVfUGF0aDo6R2V0TGFzdFBvaW50KGludDMyX3QgaUNvdW50KSBjb25zdCB7DQorICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGludDMyX3QgaVBvaW50cyA9IG1fUGF0aC5HZXRQb2ludENvdW50KCk7DQorICBpZiAoaUNvdW50ID4gaVBvaW50cykgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBtX1BhdGguR2V0UG9pbnRzKCkgKyBpUG9pbnRzIC0gaUNvdW50Ow0KK30NCitGWF9CT09MIENGREVfUGF0aDo6RmlndXJlQ2xvc2VkKCkgY29uc3Qgew0KKyAgRlhfUEFUSFBPSU5UKiBwUG9pbnQgPSBHZXRMYXN0UG9pbnQoKTsNCisgIHJldHVybiBwUG9pbnQgPyAocFBvaW50LT5tX0ZsYWcgJiBGWFBUX0NMT1NFRklHVVJFKSA6IFRSVUU7DQorfQ0KK0ZYX1BBVEhQT0lOVCogQ0ZERV9QYXRoOjpBZGRQb2ludHMoaW50MzJfdCBpQ291bnQpIHsNCisgIGlmIChpQ291bnQgPCAxKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaW50MzJfdCBpUG9pbnRzID0gbV9QYXRoLkdldFBvaW50Q291bnQoKTsNCisgIG1fUGF0aC5BZGRQb2ludENvdW50KGlDb3VudCk7DQorICByZXR1cm4gbV9QYXRoLkdldFBvaW50cygpICsgaVBvaW50czsNCit9DQordm9pZCBDRkRFX1BhdGg6Ok1vdmVUbyhGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIEZYX1BBVEhQT0lOVCogcFBvaW50ID0gQWRkUG9pbnRzKDEpOw0KKyAgcFBvaW50LT5tX1BvaW50WCA9IGZ4Ow0KKyAgcFBvaW50LT5tX1BvaW50WSA9IGZ5Ow0KKyAgcFBvaW50LT5tX0ZsYWcgPSBGWFBUX01PVkVUTzsNCit9DQordm9pZCBDRkRFX1BhdGg6OkxpbmVUbyhGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIEZYX1BBVEhQT0lOVCogcFBvaW50ID0gQWRkUG9pbnRzKDEpOw0KKyAgcFBvaW50LT5tX1BvaW50WCA9IGZ4Ow0KKyAgcFBvaW50LT5tX1BvaW50WSA9IGZ5Ow0KKyAgcFBvaW50LT5tX0ZsYWcgPSBGWFBUX0xJTkVUTzsNCit9DQordm9pZCBDRkRFX1BhdGg6OkJlemllclRvKGNvbnN0IENGWF9Qb2ludEYmIHAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcDMpIHsNCisgIEZYX1BBVEhQT0lOVCogcCA9IEFkZFBvaW50cygzKTsNCisgIHBbMF0ubV9Qb2ludFggPSBwMS54Ow0KKyAgcFswXS5tX1BvaW50WSA9IHAxLnk7DQorICBwWzBdLm1fRmxhZyA9IEZYUFRfQkVaSUVSVE87DQorICBwWzFdLm1fUG9pbnRYID0gcDIueDsNCisgIHBbMV0ubV9Qb2ludFkgPSBwMi55Ow0KKyAgcFsxXS5tX0ZsYWcgPSBGWFBUX0JFWklFUlRPOw0KKyAgcFsyXS5tX1BvaW50WCA9IHAzLng7DQorICBwWzJdLm1fUG9pbnRZID0gcDMueTsNCisgIHBbMl0ubV9GbGFnID0gRlhQVF9CRVpJRVJUTzsNCit9DQordm9pZCBDRkRFX1BhdGg6OkFyY1RvKEZYX0JPT0wgYlN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsDQorICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGVuZEFuZ2xlKSB7DQorICBGWF9GTE9BVCByeCA9IHJlY3Qud2lkdGggLyAyOw0KKyAgRlhfRkxPQVQgcnkgPSByZWN0LmhlaWdodCAvIDI7DQorICBGWF9GTE9BVCBjeCA9IHJlY3QubGVmdCArIHJ4Ow0KKyAgRlhfRkxPQVQgY3kgPSByZWN0LnRvcCArIHJ5Ow0KKyAgRlhfRkxPQVQgYWxwaGEgPQ0KKyAgICAgIEZYU1lTX2F0YW4yKHJ4ICogRlhTWVNfc2luKHN0YXJ0QW5nbGUpLCByeSAqIEZYU1lTX2NvcyhzdGFydEFuZ2xlKSk7DQorICBGWF9GTE9BVCBiZXRhID0NCisgICAgICBGWFNZU19hdGFuMihyeCAqIEZYU1lTX3NpbihlbmRBbmdsZSksIHJ5ICogRlhTWVNfY29zKGVuZEFuZ2xlKSk7DQorICBpZiAoRlhTWVNfZmFicyhiZXRhIC0gYWxwaGEpID4gRlhfUEkpIHsNCisgICAgaWYgKGJldGEgPiBhbHBoYSkgew0KKyAgICAgIGJldGEgLT0gMiAqIEZYX1BJOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGFscGhhIC09IDIgKiBGWF9QSTsNCisgICAgfQ0KKyAgfQ0KKyAgRlhfRkxPQVQgaGFsZl9kZWx0YSA9IChiZXRhIC0gYWxwaGEpIC8gMjsNCisgIEZYX0ZMT0FUIGJjcCA9IDQuMGYgLyAzICogKDEgLSBGWFNZU19jb3MoaGFsZl9kZWx0YSkpIC8gRlhTWVNfc2luKGhhbGZfZGVsdGEpOw0KKyAgRlhfRkxPQVQgc2luX2FscGhhID0gRlhTWVNfc2luKGFscGhhKTsNCisgIEZYX0ZMT0FUIHNpbl9iZXRhID0gRlhTWVNfc2luKGJldGEpOw0KKyAgRlhfRkxPQVQgY29zX2FscGhhID0gRlhTWVNfY29zKGFscGhhKTsNCisgIEZYX0ZMT0FUIGNvc19iZXRhID0gRlhTWVNfY29zKGJldGEpOw0KKyAgaWYgKGJTdGFydCkgew0KKyAgICBDRlhfUG9pbnRGIHAwOw0KKyAgICBwMC5TZXQoY3ggKyByeCAqIGNvc19hbHBoYSwgY3kgKyByeSAqIHNpbl9hbHBoYSk7DQorICAgIE1vdmVUbyhwMCk7DQorICB9DQorICBDRlhfUG9pbnRGIHAxOw0KKyAgcDEuU2V0KGN4ICsgcnggKiAoY29zX2FscGhhIC0gYmNwICogc2luX2FscGhhKSwNCisgICAgICAgICBjeSArIHJ5ICogKHNpbl9hbHBoYSArIGJjcCAqIGNvc19hbHBoYSkpOw0KKyAgQ0ZYX1BvaW50RiBwMjsNCisgIHAyLlNldChjeCArIHJ4ICogKGNvc19iZXRhICsgYmNwICogc2luX2JldGEpLA0KKyAgICAgICAgIGN5ICsgcnkgKiAoc2luX2JldGEgLSBiY3AgKiBjb3NfYmV0YSkpOw0KKyAgQ0ZYX1BvaW50RiBwMzsNCisgIHAzLlNldChjeCArIHJ4ICogY29zX2JldGEsIGN5ICsgcnkgKiBzaW5fYmV0YSk7DQorICBCZXppZXJUbyhwMSwgcDIsIHAzKTsNCit9DQordm9pZCBDRkRFX1BhdGg6OkFkZEJlemllcihjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzKSB7DQorICBpZiAocG9pbnRzLkdldFNpemUoKSAhPSA0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0xQQ1BPSU5URiBwID0gcG9pbnRzLkdldERhdGEoKTsNCisgIE1vdmVUbyhwWzBdKTsNCisgIEJlemllclRvKHBbMV0sIHBbMl0sIHBbM10pOw0KK30NCit2b2lkIENGREVfUGF0aDo6QWRkQmV6aWVycyhjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzKSB7DQorICBpbnQzMl90IGlDb3VudCA9IHBvaW50cy5HZXRTaXplKCk7DQorICBpZiAoaUNvdW50IDwgNCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9MUENQT0lOVEYgcCA9IHBvaW50cy5HZXREYXRhKCk7DQorICBGWF9MUENQT0lOVEYgcEVuZCA9IHAgKyBpQ291bnQ7DQorICBNb3ZlVG8ocFswXSk7DQorICBmb3IgKCsrcDsgcCA8PSBwRW5kIC0gMzsgcCArPSAzKSB7DQorICAgIEJlemllclRvKHBbMF0sIHBbMV0sIHBbMl0pOw0KKyAgfQ0KK30NCit2b2lkIENGREVfUGF0aDo6R2V0Q3VydmVUYW5nZW50cyhjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Qb2ludHNGJiB0YW5nZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDbG9zZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRlbnNpb24pIGNvbnN0IHsNCisgIGludDMyX3QgaUNvdW50ID0gcG9pbnRzLkdldFNpemUoKTsNCisgIHRhbmdlbnRzLlNldFNpemUoaUNvdW50KTsNCisgIGlmIChpQ291bnQgPCAzKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0ZMT0FUIGZDb2VmZmljaWVudCA9IGZUZW5zaW9uIC8gMy4wZjsNCisgIEZYX0xQQ1BPSU5URiBwUG9pbnRzID0gcG9pbnRzLkdldERhdGEoKTsNCisgIEZYX0xQUE9JTlRGIHBUYW5nZW50cyA9IHRhbmdlbnRzLkdldERhdGEoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgKytpKSB7DQorICAgIGludDMyX3QgciA9IGkgKyAxOw0KKyAgICBpbnQzMl90IHMgPSBpIC0gMTsNCisgICAgaWYgKHIgPj0gaUNvdW50KSB7DQorICAgICAgciA9IGJDbG9zZWQgPyAociAtIGlDb3VudCkgOiAoaUNvdW50IC0gMSk7DQorICAgIH0NCisgICAgaWYgKHMgPCAwKSB7DQorICAgICAgcyA9IGJDbG9zZWQgPyAocyArIGlDb3VudCkgOiAwOw0KKyAgICB9DQorICAgIHBUYW5nZW50c1tpXS54ICs9IChmQ29lZmZpY2llbnQgKiAocFBvaW50c1tyXS54IC0gcFBvaW50c1tzXS54KSk7DQorICAgIHBUYW5nZW50c1tpXS55ICs9IChmQ29lZmZpY2llbnQgKiAocFBvaW50c1tyXS55IC0gcFBvaW50c1tzXS55KSk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9QYXRoOjpBZGRDdXJ2ZShjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDbG9zZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUZW5zaW9uKSB7DQorICBpbnQzMl90IGlMYXN0ID0gcG9pbnRzLkdldFVwcGVyQm91bmQoKTsNCisgIGlmIChpTGFzdCA8IDEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1BvaW50c0YgdGFuZ2VudHM7DQorICBHZXRDdXJ2ZVRhbmdlbnRzKHBvaW50cywgdGFuZ2VudHMsIGJDbG9zZWQsIGZUZW5zaW9uKTsNCisgIEZYX0xQQ1BPSU5URiBwUG9pbnRzID0gcG9pbnRzLkdldERhdGEoKTsNCisgIEZYX0xQUE9JTlRGIHBUYW5nZW50cyA9IHRhbmdlbnRzLkdldERhdGEoKTsNCisgIE1vdmVUbyhwUG9pbnRzWzBdKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMYXN0OyArK2kpIHsNCisgICAgaW50MzJfdCBqID0gaSArIDE7DQorICAgIENGWF9Qb2ludEYgcDE7DQorICAgIHAxLlNldChwUG9pbnRzW2ldLnggKyBwVGFuZ2VudHNbaV0ueCwgcFBvaW50c1tpXS55ICsgcFRhbmdlbnRzW2ldLnkpOw0KKyAgICBDRlhfUG9pbnRGIHAyOw0KKyAgICBwMi5TZXQocFBvaW50c1tqXS54IC0gcFRhbmdlbnRzW2pdLngsIHBQb2ludHNbal0ueSAtIHBUYW5nZW50c1tqXS55KTsNCisgICAgQ0ZYX1BvaW50RiBwMzsNCisgICAgcDMuU2V0KHBQb2ludHNbal0ueCwgcFBvaW50c1tqXS55KTsNCisgICAgQmV6aWVyVG8ocDEsIHAyLCBwMyk7DQorICB9DQorICBpZiAoYkNsb3NlZCkgew0KKyAgICBDRlhfUG9pbnRGIHAxOw0KKyAgICBwMS5TZXQocFBvaW50c1tpTGFzdF0ueCArIHBUYW5nZW50c1tpTGFzdF0ueCwNCisgICAgICAgICAgIHBQb2ludHNbaUxhc3RdLnkgKyBwVGFuZ2VudHNbaUxhc3RdLnkpOw0KKyAgICBDRlhfUG9pbnRGIHAyOw0KKyAgICBwMi5TZXQocFBvaW50c1swXS54IC0gcFRhbmdlbnRzWzBdLngsIHBQb2ludHNbMF0ueSAtIHBUYW5nZW50c1swXS55KTsNCisgICAgQ0ZYX1BvaW50RiBwMzsNCisgICAgcDMuU2V0KHBQb2ludHNbMF0ueCwgcFBvaW50c1swXS55KTsNCisgICAgQmV6aWVyVG8ocDEsIHAyLCBwMyk7DQorICAgIENsb3NlRmlndXJlKCk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9QYXRoOjpBZGRFbGxpcHNlKGNvbnN0IENGWF9SZWN0RiYgcmVjdCkgew0KKyAgRlhfRkxPQVQgZlN0YXJ0QW5nbGUgPSAwOw0KKyAgRlhfRkxPQVQgZkVuZEFuZ2xlID0gRlhfUEkgLyAyOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgNDsgKytpKSB7DQorICAgIEFyY1RvKGkgPT0gMCwgcmVjdCwgZlN0YXJ0QW5nbGUsIGZFbmRBbmdsZSk7DQorICAgIGZTdGFydEFuZ2xlICs9IEZYX1BJIC8gMjsNCisgICAgZkVuZEFuZ2xlICs9IEZYX1BJIC8gMjsNCisgIH0NCisgIENsb3NlRmlndXJlKCk7DQorfQ0KK3ZvaWQgQ0ZERV9QYXRoOjpBZGRMaW5lKGNvbnN0IENGWF9Qb2ludEYmIHB0MSwgY29uc3QgQ0ZYX1BvaW50RiYgcHQyKSB7DQorICBGWF9QQVRIUE9JTlQqIHBMYXN0ID0gR2V0TGFzdFBvaW50KCk7DQorICBpZiAocExhc3QgPT0gTlVMTCB8fCBGWFNZU19mYWJzKHBMYXN0LT5tX1BvaW50WCAtIHB0MS54KSA+IDAuMDAxIHx8DQorICAgICAgRlhTWVNfZmFicyhwTGFzdC0+bV9Qb2ludFkgLSBwdDEueSkgPiAwLjAwMSkgew0KKyAgICBNb3ZlVG8ocHQxKTsNCisgIH0NCisgIExpbmVUbyhwdDIpOw0KK30NCit2b2lkIENGREVfUGF0aDo6QWRkUGF0aChjb25zdCBJRkRFX1BhdGgqIHBTcmMsIEZYX0JPT0wgYkNvbm5lY3QpIHsNCisgIENGREVfUGF0aCogcFBhdGggPSAoQ0ZERV9QYXRoKilwU3JjOw0KKyAgaWYgKHBQYXRoID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpQ291bnQgPSBwUGF0aC0+bV9QYXRoLkdldFBvaW50Q291bnQoKTsNCisgIGlmIChpQ291bnQgPCAxKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChiQ29ubmVjdCkgew0KKyAgICBMaW5lVG8ocFBhdGgtPm1fUGF0aC5HZXRQb2ludFgoMCksIHBQYXRoLT5tX1BhdGguR2V0UG9pbnRZKDApKTsNCisgIH0NCisgIG1fUGF0aC5BcHBlbmQoJnBQYXRoLT5tX1BhdGgsIE5VTEwpOw0KK30NCit2b2lkIENGREVfUGF0aDo6QWRkUG9seWdvbihjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzKSB7DQorICBpbnQzMl90IGlDb3VudCA9IHBvaW50cy5HZXRTaXplKCk7DQorICBpZiAoaUNvdW50IDwgMikgew0KKyAgICByZXR1cm47DQorICB9DQorICBBZGRMaW5lcyhwb2ludHMpOw0KKyAgRlhfTFBDUE9JTlRGIHAgPSBwb2ludHMuR2V0RGF0YSgpOw0KKyAgaWYgKEZYU1lTX2ZhYnMocFswXS54IC0gcFtpQ291bnQgLSAxXS54KSA8IDAuMDFmIHx8DQorICAgICAgRlhTWVNfZmFicyhwWzBdLnkgLSBwW2lDb3VudCAtIDFdLnkpIDwgMC4wMWYpIHsNCisgICAgTGluZVRvKHBbMF0pOw0KKyAgfQ0KKyAgQ2xvc2VGaWd1cmUoKTsNCit9DQordm9pZCBDRkRFX1BhdGg6OkFkZExpbmVzKGNvbnN0IENGWF9Qb2ludHNGJiBwb2ludHMpIHsNCisgIGludDMyX3QgaUNvdW50ID0gcG9pbnRzLkdldFNpemUoKTsNCisgIGlmIChpQ291bnQgPCAyKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0xQQ1BPSU5URiBwID0gcG9pbnRzLkdldERhdGEoKTsNCisgIEZYX0xQQ1BPSU5URiBwRW5kID0gcCArIGlDb3VudDsNCisgIE1vdmVUbyhwWzBdKTsNCisgIGZvciAoKytwOyBwIDwgcEVuZDsgKytwKSB7DQorICAgIExpbmVUbygqcCk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9QYXRoOjpBZGRSZWN0YW5nbGUoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBNb3ZlVG8ocmVjdC5Ub3BMZWZ0KCkpOw0KKyAgTGluZVRvKHJlY3QuVG9wUmlnaHQoKSk7DQorICBMaW5lVG8ocmVjdC5Cb3R0b21SaWdodCgpKTsNCisgIExpbmVUbyhyZWN0LkJvdHRvbUxlZnQoKSk7DQorICBDbG9zZUZpZ3VyZSgpOw0KK30NCit2b2lkIENGREVfUGF0aDo6R2V0QkJveChDRlhfUmVjdEYmIGJib3gpIGNvbnN0IHsNCisgIENGWF9GbG9hdFJlY3QgcmVjdCA9IG1fUGF0aC5HZXRCb3VuZGluZ0JveCgpOw0KKyAgYmJveC5TZXQocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5XaWR0aCgpLCByZWN0LkhlaWdodCgpKTsNCisgIGJib3guTm9ybWFsaXplKCk7DQorfQ0KK3ZvaWQgQ0ZERV9QYXRoOjpHZXRCQm94KENGWF9SZWN0RiYgYmJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTGluZVdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNaXRlckxpbWl0KSBjb25zdCB7DQorICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBtX1BhdGguR2V0Qm91bmRpbmdCb3goZkxpbmVXaWR0aCwgZk1pdGVyTGltaXQpOw0KKyAgYmJveC5TZXQocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5XaWR0aCgpLCByZWN0LkhlaWdodCgpKTsNCisgIGJib3guTm9ybWFsaXplKCk7DQorfQ0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2dlb2JqZWN0LmggYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZW9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOTgzMWIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9nZW9iamVjdC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRkRFX0dSQVBIT0JKU19JTVANCisjZGVmaW5lIF9GREVfR1JBUEhPQkpTX0lNUA0KKyNpZm5kZWYgX0ZERVBMVVMNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KK2NsYXNzIENGREVfR0VGb250TWdyOw0KK2NsYXNzIENGREVfUGF0aCA6IHB1YmxpYyBJRkRFX1BhdGgsIHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorDQorICB2aXJ0dWFsIEZYX0JPT0wgU3RhcnRGaWd1cmUoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDbG9zZUZpZ3VyZSgpOw0KKw0KKyAgdmlydHVhbCB2b2lkIEFkZEJlemllcihjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzKTsNCisgIHZpcnR1YWwgdm9pZCBBZGRCZXppZXJzKGNvbnN0IENGWF9Qb2ludHNGJiBwb2ludHMpOw0KKyAgdmlydHVhbCB2b2lkIEFkZEN1cnZlKGNvbnN0IENGWF9Qb2ludHNGJiBwb2ludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2xvc2VkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUZW5zaW9uID0gMC41Zik7DQorICB2aXJ0dWFsIHZvaWQgQWRkRWxsaXBzZShjb25zdCBDRlhfUmVjdEYmIHJlY3QpOw0KKyAgdmlydHVhbCB2b2lkIEFkZExpbmVzKGNvbnN0IENGWF9Qb2ludHNGJiBwb2ludHMpOw0KKyAgdmlydHVhbCB2b2lkIEFkZExpbmUoY29uc3QgQ0ZYX1BvaW50RiYgcHQxLCBjb25zdCBDRlhfUG9pbnRGJiBwdDIpOw0KKyAgdmlydHVhbCB2b2lkIEFkZFBhdGgoY29uc3QgSUZERV9QYXRoKiBwU3JjLCBGWF9CT09MIGJDb25uZWN0KTsNCisgIHZpcnR1YWwgdm9pZCBBZGRQb2x5Z29uKGNvbnN0IENGWF9Qb2ludHNGJiBwb2ludHMpOw0KKyAgdmlydHVhbCB2b2lkIEFkZFJlY3RhbmdsZShjb25zdCBDRlhfUmVjdEYmIHJlY3QpOw0KKyAgdmlydHVhbCB2b2lkIEdldEJCb3goQ0ZYX1JlY3RGJiBiYm94KSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBHZXRCQm94KENGWF9SZWN0RiYgYmJveCwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZMaW5lV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWl0ZXJMaW1pdCkgY29uc3Q7DQorICBGWF9QQVRIUE9JTlQqIEFkZFBvaW50cyhpbnQzMl90IGlDb3VudCk7DQorICBGWF9QQVRIUE9JTlQqIEdldExhc3RQb2ludChpbnQzMl90IGlDb3VudCA9IDEpIGNvbnN0Ow0KKyAgRlhfQk9PTCBGaWd1cmVDbG9zZWQoKSBjb25zdDsNCisgIHZvaWQgTW92ZVRvKEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2b2lkIExpbmVUbyhGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdm9pZCBCZXppZXJUbyhjb25zdCBDRlhfUG9pbnRGJiBwMSwNCisgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcDIsDQorICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHAzKTsNCisgIHZvaWQgQXJjVG8oRlhfQk9PTCBiU3RhcnQsDQorICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRBbmdsZSwNCisgICAgICAgICAgICAgRlhfRkxPQVQgZW5kQW5nbGUpOw0KKyAgdm9pZCBNb3ZlVG8oY29uc3QgQ0ZYX1BvaW50RiYgcDApIHsgTW92ZVRvKHAwLngsIHAwLnkpOyB9DQorICB2b2lkIExpbmVUbyhjb25zdCBDRlhfUG9pbnRGJiBwMSkgeyBMaW5lVG8ocDEueCwgcDEueSk7IH0NCisgIHZvaWQgR2V0Q3VydmVUYW5nZW50cyhjb25zdCBDRlhfUG9pbnRzRiYgcG9pbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Qb2ludHNGJiB0YW5nZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDbG9zZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRlbnNpb24pIGNvbnN0Ow0KKyAgQ0ZYX1BhdGhEYXRhIG1fUGF0aDsNCit9Ow0KKyNlbmRpZg0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2l0ZXJhdG9yLmNwcCBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2l0ZXJhdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWJjYTllCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfaXRlcmF0b3IuY3BwCkBAIC0wLDAgKzEsOTYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAiZmRlX2l0ZXJhdG9yLmgiDQorSUZERV9WaXN1YWxTZXRJdGVyYXRvciogSUZERV9WaXN1YWxTZXRJdGVyYXRvcjo6Q3JlYXRlKCkgew0KKyAgcmV0dXJuIG5ldyBDRkRFX1Zpc3VhbFNldEl0ZXJhdG9yOw0KK30NCitDRkRFX1Zpc3VhbFNldEl0ZXJhdG9yOjpDRkRFX1Zpc3VhbFNldEl0ZXJhdG9yKCkgOiBtX2R3RmlsdGVyKDApIHt9DQorQ0ZERV9WaXN1YWxTZXRJdGVyYXRvcjo6fkNGREVfVmlzdWFsU2V0SXRlcmF0b3IoKSB7DQorICBtX0NhbnZhc1N0YWNrLlJlbW92ZUFsbCgpOw0KK30NCitGWF9CT09MIENGREVfVmlzdWFsU2V0SXRlcmF0b3I6OkF0dGFjaENhbnZhcyhJRkRFX0NhbnZhc1NldCogcENhbnZhcykgew0KKyAgRlhTWVNfYXNzZXJ0KHBDYW52YXMgIT0gTlVMTCk7DQorICBtX0NhbnZhc1N0YWNrLlJlbW92ZUFsbCgpOw0KKyAgRkRFX0NBTlZBU0lURU0gY2FudmFzOw0KKyAgY2FudmFzLmhDYW52YXMgPSBOVUxMOw0KKyAgY2FudmFzLnBDYW52YXMgPSBwQ2FudmFzOw0KKyAgY2FudmFzLmhQb3MgPSBwQ2FudmFzLT5HZXRGaXJzdFBvc2l0aW9uKE5VTEwpOw0KKyAgaWYgKGNhbnZhcy5oUG9zID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIG1fQ2FudmFzU3RhY2suUHVzaChjYW52YXMpID09IDA7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9WaXN1YWxTZXRJdGVyYXRvcjo6RmlsdGVyT2JqZWN0cyhGWF9EV09SRCBkd09iamVjdHMpIHsNCisgIGlmIChtX0NhbnZhc1N0YWNrLkdldFNpemUoKSA9PSAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHdoaWxlIChtX0NhbnZhc1N0YWNrLkdldFNpemUoKSA+IDEpIHsNCisgICAgbV9DYW52YXNTdGFjay5Qb3AoKTsNCisgIH0NCisgIG1fZHdGaWx0ZXIgPSBkd09iamVjdHMgJiB+KEZYX0RXT1JEKUZERV9WSVNVQUxPQkpfV2lkZ2V0Ow0KKyAgaWYgKGR3T2JqZWN0cyAmIEZERV9WSVNVQUxPQkpfV2lkZ2V0KSB7DQorICAgIG1fZHdGaWx0ZXIgfD0gMHhGRjAwOw0KKyAgfQ0KKyAgRkRFX0xQQ0FOVkFTSVRFTSBwQ2FudmFzID0gbV9DYW52YXNTdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICBGWFNZU19hc3NlcnQocENhbnZhcyAhPSBOVUxMICYmIHBDYW52YXMtPnBDYW52YXMgIT0gTlVMTCk7DQorICBwQ2FudmFzLT5oUG9zID0gcENhbnZhcy0+cENhbnZhcy0+R2V0Rmlyc3RQb3NpdGlvbihOVUxMKTsNCisgIHJldHVybiBwQ2FudmFzLT5oUG9zICE9IE5VTEw7DQorfQ0KK3ZvaWQgQ0ZERV9WaXN1YWxTZXRJdGVyYXRvcjo6UmVzZXQoKSB7DQorICBGaWx0ZXJPYmplY3RzKG1fZHdGaWx0ZXIpOw0KK30NCitGREVfSFZJU1VBTE9CSiBDRkRFX1Zpc3VhbFNldEl0ZXJhdG9yOjpHZXROZXh0KElGREVfVmlzdWFsU2V0KiYgcFZpc3VhbFNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9IVklTVUFMT0JKKiBwaENhbnZhc09iaiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ2FudmFzU2V0KiogcHBDYW52YXNTZXQpIHsNCisgIHdoaWxlIChtX0NhbnZhc1N0YWNrLkdldFNpemUoKSA+IDApIHsNCisgICAgRkRFX0xQQ0FOVkFTSVRFTSBwQ2FudmFzID0gbV9DYW52YXNTdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICAgIEZYU1lTX2Fzc2VydChwQ2FudmFzICE9IE5VTEwgJiYgcENhbnZhcy0+cENhbnZhcyAhPSBOVUxMKTsNCisgICAgaWYgKHBDYW52YXMtPmhQb3MgPT0gTlVMTCkgew0KKyAgICAgIGlmIChtX0NhbnZhc1N0YWNrLkdldFNpemUoKSA9PSAxKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgbV9DYW52YXNTdGFjay5Qb3AoKTsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBkbyB7DQorICAgICAgRkRFX0hWSVNVQUxPQkogaE9iaiA9IHBDYW52YXMtPnBDYW52YXMtPkdldE5leHQoDQorICAgICAgICAgIHBDYW52YXMtPmhDYW52YXMsIHBDYW52YXMtPmhQb3MsIHBWaXN1YWxTZXQpOw0KKyAgICAgIEZYU1lTX2Fzc2VydChoT2JqICE9IE5VTEwpOw0KKyAgICAgIEZERV9WSVNVQUxPQkpUWVBFIGVUeXBlID0gcFZpc3VhbFNldC0+R2V0VHlwZSgpOw0KKyAgICAgIGlmIChlVHlwZSA9PSBGREVfVklTVUFMT0JKX0NhbnZhcykgew0KKyAgICAgICAgRkRFX0NBTlZBU0lURU0gY2FudmFzOw0KKyAgICAgICAgY2FudmFzLmhDYW52YXMgPSBoT2JqOw0KKyAgICAgICAgY2FudmFzLnBDYW52YXMgPSAoSUZERV9DYW52YXNTZXQqKXBWaXN1YWxTZXQ7DQorICAgICAgICBjYW52YXMuaFBvcyA9IGNhbnZhcy5wQ2FudmFzLT5HZXRGaXJzdFBvc2l0aW9uKGhPYmopOw0KKyAgICAgICAgbV9DYW52YXNTdGFjay5QdXNoKGNhbnZhcyk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgRlhfRFdPUkQgZHdPYmogPQ0KKyAgICAgICAgICAoZVR5cGUgPT0gRkRFX1ZJU1VBTE9CSl9XaWRnZXQpDQorICAgICAgICAgICAgICA/IChGWF9EV09SRCkoKElGREVfV2lkZ2V0U2V0KilwVmlzdWFsU2V0KS0+R2V0V2lkZ2V0VHlwZShoT2JqKQ0KKyAgICAgICAgICAgICAgOiAoRlhfRFdPUkQpZVR5cGU7DQorICAgICAgaWYgKChtX2R3RmlsdGVyICYgZHdPYmopICE9IDApIHsNCisgICAgICAgIGlmIChwcENhbnZhc1NldCkgew0KKyAgICAgICAgICAqcHBDYW52YXNTZXQgPSBwQ2FudmFzLT5wQ2FudmFzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBoQ2FudmFzT2JqKSB7DQorICAgICAgICAgICpwaENhbnZhc09iaiA9IHBDYW52YXMtPmhDYW52YXM7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gaE9iajsNCisgICAgICB9DQorICAgIH0gd2hpbGUgKHBDYW52YXMtPmhQb3MgIT0gTlVMTCk7DQorICB9DQorICBpZiAocHBDYW52YXNTZXQpIHsNCisgICAgKnBwQ2FudmFzU2V0ID0gTlVMTDsNCisgIH0NCisgIGlmIChwaENhbnZhc09iaikgew0KKyAgICAqcGhDYW52YXNPYmogPSBOVUxMOw0KKyAgfQ0KKyAgcFZpc3VhbFNldCA9IE5VTEw7DQorICByZXR1cm4gTlVMTDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfaXRlcmF0b3IuaCBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2l0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA1YzY5NAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX2l0ZXJhdG9yLmgKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GREVfSVRFUkFUT1JfSU1QDQorI2RlZmluZSBfRkRFX0lURVJBVE9SX0lNUA0KK3R5cGVkZWYgc3RydWN0IF9GREVfQ0FOVkFTSVRFTSA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgIElGREVfQ2FudmFzU2V0KiBwQ2FudmFzOw0KKyAgRkRFX0hWSVNVQUxPQkogaENhbnZhczsNCisgIEZYX1BPU0lUSU9OIGhQb3M7DQorfSBGREVfQ0FOVkFTSVRFTSwgKkZERV9MUENBTlZBU0lURU07DQorY2xhc3MgQ0ZERV9WaXN1YWxTZXRJdGVyYXRvciA6IHB1YmxpYyBJRkRFX1Zpc3VhbFNldEl0ZXJhdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGREVfVmlzdWFsU2V0SXRlcmF0b3IoKTsNCisgIH5DRkRFX1Zpc3VhbFNldEl0ZXJhdG9yKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisNCisgIHZpcnR1YWwgRlhfQk9PTCBBdHRhY2hDYW52YXMoSUZERV9DYW52YXNTZXQqIHBDYW52YXMpOw0KKyAgdmlydHVhbCBGWF9CT09MIEZpbHRlck9iamVjdHMoRlhfRFdPUkQgZHdPYmplY3RzID0gMHhGRkZGRkZGRik7DQorDQorICB2aXJ0dWFsIHZvaWQgUmVzZXQoKTsNCisgIHZpcnR1YWwgRkRFX0hWSVNVQUxPQkogR2V0TmV4dChJRkRFX1Zpc3VhbFNldComIHBWaXN1YWxTZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0hWSVNVQUxPQkoqIHBoQ2FudmFzT2JqID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NhbnZhc1NldCoqIHBwQ2FudmFzU2V0ID0gTlVMTCk7DQorDQorIHByb3RlY3RlZDoNCisgIEZYX0RXT1JEIG1fZHdGaWx0ZXI7DQorICBDRlhfU3RhY2tUZW1wbGF0ZTxGREVfQ0FOVkFTSVRFTT4gbV9DYW52YXNTdGFjazsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX29iamVjdC5jcHAgYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9vYmplY3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZWI5NDEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9vYmplY3QuY3BwCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAiZmRlX29iamVjdC5oIg0KK0lGREVfUGVuKiBJRkRFX1Blbjo6Q3JlYXRlKCkgew0KKyAgcmV0dXJuIG5ldyBDRkRFX1BlbigpOw0KK30NCitJRkRFX0JydXNoKiBJRkRFX0JydXNoOjpDcmVhdGUoaW50MzJfdCBpVHlwZSkgew0KKyAgc3dpdGNoIChpVHlwZSkgew0KKyAgICBjYXNlIEZERV9CUlVTSFRZUEVfU29saWQ6DQorICAgICAgcmV0dXJuIG5ldyBDRkRFX1NvbGlkQnJ1c2g7DQorICAgIGNhc2UgRkRFX0JSVVNIVFlQRV9IYXRjaDoNCisgICAgICByZXR1cm4gbmV3IENGREVfSGF0Y2hCcnVzaDsNCisgICAgY2FzZSBGREVfQlJVU0hUWVBFX1RleHR1cmU6DQorICAgICAgcmV0dXJuIG5ldyBDRkRFX1RleHR1cmVCcnVzaDsNCisgICAgY2FzZSBGREVfQlJVU0hUWVBFX0xpbmVhckdyYWRpZW50Og0KKyAgICAgIHJldHVybiBuZXcgQ0ZERV9MaW5lYXJCcnVzaDsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gTlVMTDsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfb2JqZWN0LmggYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9vYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDU2YjAxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfb2JqZWN0LmgKQEAgLTAsMCArMSwyMzcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRkRFX0JBU0VPQkpFQ1RfSU1QDQorI2RlZmluZSBfRkRFX0JBU0VPQkpFQ1RfSU1QDQorY2xhc3MgQ0ZERV9QZW4gOiBwdWJsaWMgSUZERV9QZW4sIHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZERV9QZW4oKQ0KKyAgICAgIDogbV9Db2xvcigwKSwNCisgICAgICAgIG1faUxpbmVDYXAoMCksDQorICAgICAgICBtX2lMaW5lSm9pbigwKSwNCisgICAgICAgIG1faURhc2hTdHlsZSgwKSwNCisgICAgICAgIG1fZkRhc2hQaGFzZSgwKSwNCisgICAgICAgIG1fZk1pdGVyTGltaXQoMTApLA0KKyAgICAgICAgbV9iQXV0b1JlbGVhc2UoRkFMU0UpLA0KKyAgICAgICAgbV9wQnJ1c2goTlVMTCkge30NCisNCisgIH5DRkRFX1BlbigpIHsNCisgICAgaWYgKG1fcEJydXNoICYmIG1fYkF1dG9SZWxlYXNlKSB7DQorICAgICAgbV9wQnJ1c2gtPlJlbGVhc2UoKTsNCisgICAgfQ0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorDQorICB2aXJ0dWFsIGludDMyX3QgR2V0VHlwZSgpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fcEJydXNoID8gbV9wQnJ1c2gtPkdldFR5cGUoKSA6IEZERV9QRU5UWVBFX1NvbGlkQ29sb3I7DQorICB9DQorDQorICB2aXJ0dWFsIEZYX0FSR0IgR2V0Q29sb3IoKSBjb25zdCB7IHJldHVybiBtX0NvbG9yOyB9DQorICB2aXJ0dWFsIHZvaWQgU2V0Q29sb3IoRlhfQVJHQiBjb2xvcikgeyBtX0NvbG9yID0gY29sb3I7IH0NCisgIHZpcnR1YWwgSUZERV9CcnVzaCogR2V0QnJ1c2goKSBjb25zdCB7IHJldHVybiBtX3BCcnVzaDsgfQ0KKyAgdmlydHVhbCB2b2lkIFNldEJydXNoKElGREVfQnJ1c2gqIHBCcnVzaCwgRlhfQk9PTCBiQXV0b1JlbGVhc2UpIHsNCisgICAgbV9iQXV0b1JlbGVhc2UgPSBiQXV0b1JlbGVhc2U7DQorICAgIG1fcEJydXNoID0gcEJydXNoOw0KKyAgICBpZiAobV9wQnJ1c2ggJiYgbV9wQnJ1c2gtPkdldFR5cGUoKSA9PSBGREVfQlJVU0hUWVBFX1NvbGlkKSB7DQorICAgICAgbV9Db2xvciA9ICgoSUZERV9Tb2xpZEJydXNoKiltX3BCcnVzaCktPkdldENvbG9yKCk7DQorICAgIH0NCisgIH0NCisgIHZpcnR1YWwgaW50MzJfdCBHZXRMaW5lQ2FwKCkgY29uc3QgeyByZXR1cm4gbV9pTGluZUNhcDsgfQ0KKyAgdmlydHVhbCB2b2lkIFNldExpbmVDYXAoaW50MzJfdCBpTGluZUNhcCkgeyBtX2lMaW5lQ2FwID0gaUxpbmVDYXA7IH0NCisgIHZpcnR1YWwgaW50MzJfdCBHZXREYXNoU3R5bGUoKSBjb25zdCB7IHJldHVybiBtX2lEYXNoU3R5bGU7IH0NCisgIHZpcnR1YWwgdm9pZCBTZXREYXNoU3R5bGUoaW50MzJfdCBpRGFzaFN0eWxlKSB7IG1faURhc2hTdHlsZSA9IGlEYXNoU3R5bGU7IH0NCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0RGFzaFBoYXNlKCkgY29uc3QgeyByZXR1cm4gbV9mRGFzaFBoYXNlOyB9DQorICB2aXJ0dWFsIHZvaWQgU2V0RGFzaFBoYXNlKEZYX0ZMT0FUIGZQaGFzZSkgeyBtX2ZEYXNoUGhhc2UgPSBmUGhhc2U7IH0NCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudERhc2hBcnJheSgpIGNvbnN0IHsgcmV0dXJuIG1fRGFzaEFycmF5LkdldFNpemUoKTsgfQ0KKyAgdmlydHVhbCBpbnQzMl90IEdldERhc2hBcnJheShDRlhfRmxvYXRBcnJheSYgZGFzaEFycmF5KSBjb25zdCB7DQorICAgIGRhc2hBcnJheS5Db3B5KG1fRGFzaEFycmF5KTsNCisgICAgcmV0dXJuIGRhc2hBcnJheS5HZXRTaXplKCk7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0RGFzaEFycmF5KGNvbnN0IENGWF9GbG9hdEFycmF5JiBkYXNoQXJyYXkpIHsNCisgICAgbV9EYXNoQXJyYXkuQ29weShkYXNoQXJyYXkpOw0KKyAgfQ0KKyAgdmlydHVhbCBpbnQzMl90IEdldExpbmVKb2luKCkgY29uc3QgeyByZXR1cm4gbV9pTGluZUpvaW47IH0NCisgIHZpcnR1YWwgdm9pZCBTZXRMaW5lSm9pbihpbnQzMl90IGlMaW5lSm9pbikgeyBtX2lMaW5lSm9pbiA9IGlMaW5lSm9pbjsgfQ0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRNaXRlckxpbWl0KCkgY29uc3QgeyByZXR1cm4gbV9mTWl0ZXJMaW1pdDsgfQ0KKyAgdmlydHVhbCB2b2lkIFNldE1pdGVyTGltaXQoRlhfRkxPQVQgZk1pdGVyTGltaXQpIHsNCisgICAgbV9mTWl0ZXJMaW1pdCA9IGZNaXRlckxpbWl0Ow0KKyAgfQ0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50Q29tcG91bmRQYXR0ZXJucygpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fQ29tcG91bmRQYXR0ZXJucy5HZXRTaXplKCk7DQorICB9DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0Q29tcG91bmRQYXR0ZXJucygNCisgICAgICBDRkRFX0NvbXBvdW5kUGF0dGVybnMmIGNvbXBvdW5kUGF0dGVybnMpIGNvbnN0IHsNCisgICAgcmV0dXJuIGNvbXBvdW5kUGF0dGVybnMuQ29weShtX0NvbXBvdW5kUGF0dGVybnMpLCBUUlVFOw0KKyAgfQ0KKyAgdmlydHVhbCBGWF9CT09MIFNldENvbXBvdW5kUGF0dGVybnMoDQorICAgICAgY29uc3QgQ0ZERV9Db21wb3VuZFBhdHRlcm5zJiBjb21wb3VuZFBhdHRlcm5zKSB7DQorICAgIHJldHVybiBtX0NvbXBvdW5kUGF0dGVybnMuQ29weShjb21wb3VuZFBhdHRlcm5zKSwgVFJVRTsNCisgIH0NCisNCisgIEZYX0FSR0IgbV9Db2xvcjsNCisgIGludDMyX3QgbV9pTGluZUNhcDsNCisgIGludDMyX3QgbV9pTGluZUpvaW47DQorICBpbnQzMl90IG1faURhc2hTdHlsZTsNCisgIEZYX0ZMT0FUIG1fZkRhc2hQaGFzZTsNCisgIEZYX0ZMT0FUIG1fZk1pdGVyTGltaXQ7DQorICBGWF9CT09MIG1fYkF1dG9SZWxlYXNlOw0KKyAgSUZERV9CcnVzaCogbV9wQnJ1c2g7DQorICBDRlhfRmxvYXRBcnJheSBtX0Rhc2hBcnJheTsNCisgIENGREVfQ29tcG91bmRQYXR0ZXJucyBtX0NvbXBvdW5kUGF0dGVybnM7DQorfTsNCitjbGFzcyBDRkRFX1NvbGlkQnJ1c2ggOiBwdWJsaWMgSUZERV9Tb2xpZEJydXNoLCBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGREVfU29saWRCcnVzaCgpIDogbV9Db2xvcigweEZGMDAwMDAwKSB7IG1fTWF0cml4LlNldElkZW50aXR5KCk7IH0NCisNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKyAgdmlydHVhbCBpbnQzMl90IEdldFR5cGUoKSBjb25zdCB7IHJldHVybiBGREVfQlJVU0hUWVBFX1NvbGlkOyB9DQorICB2aXJ0dWFsIGNvbnN0IENGWF9NYXRyaXgmIEdldE1hdHJpeCgpIGNvbnN0IHsgcmV0dXJuIG1fTWF0cml4OyB9DQorICB2aXJ0dWFsIHZvaWQgUmVzZXRNYXRyaXgoKSB7IG1fTWF0cml4LlNldElkZW50aXR5KCk7IH0NCisgIHZpcnR1YWwgdm9pZCBUcmFuc2xhdGVNYXRyaXgoRlhfRkxPQVQgZHgsIEZYX0ZMT0FUIGR5KSB7DQorICAgIG1fTWF0cml4LlRyYW5zbGF0ZShkeCwgZHkpOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFJvdGF0ZU1hdHJpeChGWF9GTE9BVCBmUmFkaWFuKSB7IG1fTWF0cml4LlJvdGF0ZShmUmFkaWFuKTsgfQ0KKyAgdmlydHVhbCB2b2lkIFNjYWxlTWF0cml4KEZYX0ZMT0FUIHN4LCBGWF9GTE9BVCBzeSkgeyBtX01hdHJpeC5TY2FsZShzeCwgc3kpOyB9DQorICB2aXJ0dWFsIHZvaWQgQ29uY2F0TWF0cml4KGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgew0KKyAgICBtX01hdHJpeC5Db25jYXQobWF0cml4KTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7IG1fTWF0cml4ID0gbWF0cml4OyB9DQorICB2aXJ0dWFsIEZYX0FSR0IgR2V0Q29sb3IoKSBjb25zdCB7IHJldHVybiBtX0NvbG9yOyB9DQorICB2aXJ0dWFsIHZvaWQgU2V0Q29sb3IoRlhfQVJHQiBjb2xvcikgeyBtX0NvbG9yID0gY29sb3I7IH0NCisNCisgIEZYX0FSR0IgbV9Db2xvcjsNCisgIENGWF9NYXRyaXggbV9NYXRyaXg7DQorfTsNCitjbGFzcyBDRkRFX0hhdGNoQnJ1c2ggOiBwdWJsaWMgSUZERV9IYXRjaEJydXNoLCBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGREVfSGF0Y2hCcnVzaCgpIDogbV9pU3R5bGUoLTEpLCBtX0JhY2tDb2xvcigwKSwgbV9Gb3JlQ29sb3IoMCkgew0KKyAgICBtX01hdHJpeC5TZXRJZGVudGl0eSgpOw0KKyAgfQ0KKw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICB2aXJ0dWFsIGludDMyX3QgR2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIEZERV9CUlVTSFRZUEVfSGF0Y2g7IH0NCisgIHZpcnR1YWwgY29uc3QgQ0ZYX01hdHJpeCYgR2V0TWF0cml4KCkgY29uc3QgeyByZXR1cm4gbV9NYXRyaXg7IH0NCisgIHZpcnR1YWwgdm9pZCBSZXNldE1hdHJpeCgpIHsgbV9NYXRyaXguU2V0SWRlbnRpdHkoKTsgfQ0KKyAgdmlydHVhbCB2b2lkIFRyYW5zbGF0ZU1hdHJpeChGWF9GTE9BVCBkeCwgRlhfRkxPQVQgZHkpIHsNCisgICAgbV9NYXRyaXguVHJhbnNsYXRlKGR4LCBkeSk7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgUm90YXRlTWF0cml4KEZYX0ZMT0FUIGZSYWRpYW4pIHsgbV9NYXRyaXguUm90YXRlKGZSYWRpYW4pOyB9DQorICB2aXJ0dWFsIHZvaWQgU2NhbGVNYXRyaXgoRlhfRkxPQVQgc3gsIEZYX0ZMT0FUIHN5KSB7IG1fTWF0cml4LlNjYWxlKHN4LCBzeSk7IH0NCisgIHZpcnR1YWwgdm9pZCBDb25jYXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7DQorICAgIG1fTWF0cml4LkNvbmNhdChtYXRyaXgpOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldE1hdHJpeChjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsgbV9NYXRyaXggPSBtYXRyaXg7IH0NCisgIHZpcnR1YWwgRlhfQVJHQiBHZXRDb2xvcihGWF9CT09MIGJGb3JlZ3JvdW5kQ29sb3IpIGNvbnN0IHsNCisgICAgcmV0dXJuIGJGb3JlZ3JvdW5kQ29sb3IgPyBtX0ZvcmVDb2xvciA6IG1fQmFja0NvbG9yOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFNldENvbG9yKEZYX0FSR0IgY29sb3IsIEZYX0JPT0wgYkZvcmVncm91bmRDb2xvcikgew0KKyAgICBpZiAoYkZvcmVncm91bmRDb2xvcikgew0KKyAgICAgIG1fRm9yZUNvbG9yID0gY29sb3I7DQorICAgIH0gZWxzZSB7DQorICAgICAgbV9CYWNrQ29sb3IgPSBjb2xvcjsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEhhdGNoU3R5bGUoKSBjb25zdCB7IHJldHVybiBtX2lTdHlsZTsgfTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRIYXRjaFN0eWxlKGludDMyX3QgaUhhdGNoU3R5bGUpIHsNCisgICAgbV9pU3R5bGUgPSBpSGF0Y2hTdHlsZTsNCisgICAgcmV0dXJuIG1faVN0eWxlID49IEZERV9IQVRDSFNUWUxFX01pbiAmJiBtX2lTdHlsZSA8PSBGREVfSEFUQ0hTVFlMRV9NYXg7DQorICB9DQorICBpbnQzMl90IG1faVN0eWxlOw0KKyAgRlhfQVJHQiBtX0JhY2tDb2xvcjsNCisgIEZYX0FSR0IgbV9Gb3JlQ29sb3I7DQorICBDRlhfTWF0cml4IG1fTWF0cml4Ow0KK307DQorY2xhc3MgQ0ZERV9UZXh0dXJlQnJ1c2ggOiBwdWJsaWMgSUZERV9UZXh0dXJlQnJ1c2gsIHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZERV9UZXh0dXJlQnJ1c2goKSA6IG1faVdyYXAoMCksIG1fcEltYWdlKE5VTEwpLCBtX2JBdXRvUmVsZWFzZShGQUxTRSkgew0KKyAgICBtX01hdHJpeC5TZXRJZGVudGl0eSgpOw0KKyAgfQ0KKw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICB2aXJ0dWFsIGludDMyX3QgR2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIEZERV9CUlVTSFRZUEVfVGV4dHVyZTsgfQ0KKyAgdmlydHVhbCBjb25zdCBDRlhfTWF0cml4JiBHZXRNYXRyaXgoKSBjb25zdCB7IHJldHVybiBtX01hdHJpeDsgfQ0KKyAgdmlydHVhbCB2b2lkIFJlc2V0TWF0cml4KCkgeyBtX01hdHJpeC5TZXRJZGVudGl0eSgpOyB9DQorICB2aXJ0dWFsIHZvaWQgVHJhbnNsYXRlTWF0cml4KEZYX0ZMT0FUIGR4LCBGWF9GTE9BVCBkeSkgew0KKyAgICBtX01hdHJpeC5UcmFuc2xhdGUoZHgsIGR5KTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBSb3RhdGVNYXRyaXgoRlhfRkxPQVQgZlJhZGlhbikgeyBtX01hdHJpeC5Sb3RhdGUoZlJhZGlhbik7IH0NCisgIHZpcnR1YWwgdm9pZCBTY2FsZU1hdHJpeChGWF9GTE9BVCBzeCwgRlhfRkxPQVQgc3kpIHsgbV9NYXRyaXguU2NhbGUoc3gsIHN5KTsgfQ0KKyAgdmlydHVhbCB2b2lkIENvbmNhdE1hdHJpeChjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsNCisgICAgbV9NYXRyaXguQ29uY2F0KG1hdHJpeCk7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0TWF0cml4KGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgeyBtX01hdHJpeCA9IG1hdHJpeDsgfQ0KKyAgdmlydHVhbCBJRkRFX0ltYWdlKiBHZXRJbWFnZSgpIGNvbnN0IHsgcmV0dXJuIG1fcEltYWdlOyB9DQorICB2aXJ0dWFsIHZvaWQgU2V0SW1hZ2UoSUZERV9JbWFnZSogcEltYWdlLCBGWF9CT09MIGJBdXRvUmVsZWFzZSkgew0KKyAgICBtX3BJbWFnZSA9IHBJbWFnZTsNCisgICAgbV9iQXV0b1JlbGVhc2UgPSBiQXV0b1JlbGVhc2U7DQorICB9DQorICB2aXJ0dWFsIGludDMyX3QgR2V0V3JhcE1vZGUoKSBjb25zdCB7IHJldHVybiBtX2lXcmFwOyB9DQorICB2aXJ0dWFsIHZvaWQgU2V0V3JhcE1vZGUoaW50MzJfdCBpV3JhcE1vZGUpIHsgbV9pV3JhcCA9IGlXcmFwTW9kZTsgfQ0KKyAgaW50MzJfdCBtX2lXcmFwOw0KKyAgSUZERV9JbWFnZSogbV9wSW1hZ2U7DQorICBGWF9CT09MIG1fYkF1dG9SZWxlYXNlOw0KKyAgQ0ZYX01hdHJpeCBtX01hdHJpeDsNCit9Ow0KK2NsYXNzIENGREVfTGluZWFyQnJ1c2ggOiBwdWJsaWMgSUZERV9MaW5lYXJHcmFkaWVudEJydXNoLCBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGREVfTGluZWFyQnJ1c2goKSA6IG1fRW5kQ29sb3IoMCksIG1fU3RhcnRDb2xvcigwKSwgbV9pV3JhcE1vZGUoMCkgew0KKyAgICBtX1N0YXJ0UG9pbnQueCA9IG1fU3RhcnRQb2ludC55ID0gbV9FbmRQb2ludC54ID0gbV9FbmRQb2ludC55ID0gMDsNCisgICAgbV9NYXRyaXguU2V0SWRlbnRpdHkoKTsNCisgIH0NCisNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKyAgdmlydHVhbCBpbnQzMl90IEdldFR5cGUoKSBjb25zdCB7IHJldHVybiBGREVfQlJVU0hUWVBFX0xpbmVhckdyYWRpZW50OyB9DQorICB2aXJ0dWFsIGNvbnN0IENGWF9NYXRyaXgmIEdldE1hdHJpeCgpIGNvbnN0IHsgcmV0dXJuIG1fTWF0cml4OyB9DQorICB2aXJ0dWFsIHZvaWQgUmVzZXRNYXRyaXgoKSB7IG1fTWF0cml4LlNldElkZW50aXR5KCk7IH0NCisgIHZpcnR1YWwgdm9pZCBUcmFuc2xhdGVNYXRyaXgoRlhfRkxPQVQgZHgsIEZYX0ZMT0FUIGR5KSB7DQorICAgIG1fTWF0cml4LlRyYW5zbGF0ZShkeCwgZHkpOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIFJvdGF0ZU1hdHJpeChGWF9GTE9BVCBmUmFkaWFuKSB7IG1fTWF0cml4LlJvdGF0ZShmUmFkaWFuKTsgfQ0KKyAgdmlydHVhbCB2b2lkIFNjYWxlTWF0cml4KEZYX0ZMT0FUIHN4LCBGWF9GTE9BVCBzeSkgeyBtX01hdHJpeC5TY2FsZShzeCwgc3kpOyB9DQorICB2aXJ0dWFsIHZvaWQgQ29uY2F0TWF0cml4KGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgew0KKyAgICBtX01hdHJpeC5Db25jYXQobWF0cml4KTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7IG1fTWF0cml4ID0gbWF0cml4OyB9DQorICB2aXJ0dWFsIHZvaWQgR2V0TGluZWFyUG9pbnRzKENGWF9Qb2ludEYmIHN0YXJ0aW5nUG9pbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Qb2ludEYmIGVuZGluZ1BvaW50KSBjb25zdCB7DQorICAgIHN0YXJ0aW5nUG9pbnQgPSBtX1N0YXJ0UG9pbnQ7DQorICAgIGVuZGluZ1BvaW50ID0gbV9FbmRQb2ludDsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRMaW5lYXJQb2ludHMoY29uc3QgQ0ZYX1BvaW50RiYgc3RhcnRpbmdQb2ludCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgZW5kaW5nUG9pbnQpIHsNCisgICAgbV9TdGFydFBvaW50ID0gc3RhcnRpbmdQb2ludDsNCisgICAgbV9FbmRQb2ludCA9IGVuZGluZ1BvaW50Ow0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIEdldExpbmVhckNvbG9ycyhGWF9BUkdCJiBzdGFydGluZ0NvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCJiBlbmRpbmdDb2xvcikgY29uc3Qgew0KKyAgICBzdGFydGluZ0NvbG9yID0gbV9TdGFydENvbG9yOw0KKyAgICBlbmRpbmdDb2xvciA9IG1fRW5kQ29sb3I7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0TGluZWFyQ29sb3JzKGNvbnN0IEZYX0FSR0ImIHN0YXJ0aW5nQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0ImIGVuZGluZ0NvbG9yKSB7DQorICAgIG1fU3RhcnRDb2xvciA9IHN0YXJ0aW5nQ29sb3I7DQorICAgIG1fRW5kQ29sb3IgPSBlbmRpbmdDb2xvcjsNCisgIH0NCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudEdyYWRpZW50Q29sb3JzKCkgY29uc3QgeyByZXR1cm4gbV9HcmFkQ29sb3JzLkdldFNpemUoKTsgfQ0KKyAgdmlydHVhbCBGWF9CT09MIEdldEdyYWRpZW50Q29sb3JzKENGREVfR3JhZGllbnRDb2xvcnMmIGNvbG9ycykgY29uc3Qgew0KKyAgICByZXR1cm4gY29sb3JzLkNvcHkobV9HcmFkQ29sb3JzKSwgVFJVRTsNCisgIH0NCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRHcmFkaWVudENvbG9ycyhjb25zdCBDRkRFX0dyYWRpZW50Q29sb3JzJiBjb2xvcnMpIHsNCisgICAgcmV0dXJuIG1fR3JhZENvbG9ycy5Db3B5KGNvbG9ycyksIFRSVUU7DQorICB9DQorDQorICB2aXJ0dWFsIGludDMyX3QgR2V0V3JhcE1vZGUoKSBjb25zdCB7IHJldHVybiBtX2lXcmFwTW9kZTsgfQ0KKyAgdmlydHVhbCB2b2lkIFNldFdyYXBNb2RlKGludDMyX3QgaVdyYXBNb2RlKSB7IG1faVdyYXBNb2RlID0gaVdyYXBNb2RlOyB9DQorICBDRlhfUG9pbnRGIG1fRW5kUG9pbnQ7DQorICBDRlhfUG9pbnRGIG1fU3RhcnRQb2ludDsNCisgIEZYX0FSR0IgbV9FbmRDb2xvcjsNCisgIEZYX0FSR0IgbV9TdGFydENvbG9yOw0KKyAgQ0ZERV9HcmFkaWVudENvbG9ycyBtX0dyYWRDb2xvcnM7DQorICBpbnQzMl90IG1faVdyYXBNb2RlOw0KKyAgQ0ZYX01hdHJpeCBtX01hdHJpeDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy9mZGUvZmRlX3JlbmRlci5jcHAgYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9yZW5kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNjM1MWIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9yZW5kZXIuY3BwCkBAIC0wLDAgKzEsMjYwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgImZkZV9yZW5kZXIuaCINCit2b2lkIEZERV9HZXRQYWdlTWF0cml4KENGWF9NYXRyaXgmIHBhZ2VNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIGRvY1BhZ2VSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3QmIGRldmljZVBhZ2VSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDb29yZGluYXRlc1R5cGUpIHsNCisgIEZYU1lTX2Fzc2VydChpUm90YXRlID49IDAgJiYgaVJvdGF0ZSA8PSAzKTsNCisgIEZYX0JPT0wgYkZsaXBYID0gKGR3Q29vcmRpbmF0ZXNUeXBlICYgMHgwMSkgIT0gMDsNCisgIEZYX0JPT0wgYkZsaXBZID0gKGR3Q29vcmRpbmF0ZXNUeXBlICYgMHgwMikgIT0gMDsNCisgIENGWF9NYXRyaXggbTsNCisgIG0uU2V0KChiRmxpcFggPyAtMS4wZiA6IDEuMGYpLCAwLCAwLCAoYkZsaXBZID8gLTEuMGYgOiAxLjBmKSwgMCwgMCk7DQorICBpZiAoaVJvdGF0ZSA9PSAwIHx8IGlSb3RhdGUgPT0gMikgew0KKyAgICBtLmEgKj0gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LndpZHRoIC8gZG9jUGFnZVJlY3Qud2lkdGg7DQorICAgIG0uZCAqPSAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3QuaGVpZ2h0IC8gZG9jUGFnZVJlY3QuaGVpZ2h0Ow0KKyAgfSBlbHNlIHsNCisgICAgbS5hICo9IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC5oZWlnaHQgLyBkb2NQYWdlUmVjdC53aWR0aDsNCisgICAgbS5kICo9IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC53aWR0aCAvIGRvY1BhZ2VSZWN0LmhlaWdodDsNCisgIH0NCisgIG0uUm90YXRlKGlSb3RhdGUgKiAxLjU3MDc5NjMyNjc1Zik7DQorICBzd2l0Y2ggKGlSb3RhdGUpIHsNCisgICAgY2FzZSAwOg0KKyAgICAgIG0uZSA9IGJGbGlwWCA/IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC5yaWdodCgpDQorICAgICAgICAgICAgICAgICAgIDogKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LmxlZnQ7DQorICAgICAgbS5mID0gYkZsaXBZID8gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LmJvdHRvbSgpDQorICAgICAgICAgICAgICAgICAgIDogKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LnRvcDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAxOg0KKyAgICAgIG0uZSA9IGJGbGlwWSA/IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC5sZWZ0DQorICAgICAgICAgICAgICAgICAgIDogKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LnJpZ2h0KCk7DQorICAgICAgbS5mID0gYkZsaXBYID8gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LmJvdHRvbSgpDQorICAgICAgICAgICAgICAgICAgIDogKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LnRvcDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAyOg0KKyAgICAgIG0uZSA9IGJGbGlwWCA/IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC5sZWZ0DQorICAgICAgICAgICAgICAgICAgIDogKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LnJpZ2h0KCk7DQorICAgICAgbS5mID0gYkZsaXBZID8gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LnRvcA0KKyAgICAgICAgICAgICAgICAgICA6IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC5ib3R0b20oKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAzOg0KKyAgICAgIG0uZSA9IGJGbGlwWSA/IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC5yaWdodCgpDQorICAgICAgICAgICAgICAgICAgIDogKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LmxlZnQ7DQorICAgICAgbS5mID0gYkZsaXBYID8gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LnRvcA0KKyAgICAgICAgICAgICAgICAgICA6IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC5ib3R0b20oKTsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIHBhZ2VNYXRyaXggPSBtOw0KK30NCitJRkRFX1JlbmRlckNvbnRleHQqIElGREVfUmVuZGVyQ29udGV4dDo6Q3JlYXRlKCkgew0KKyAgcmV0dXJuIG5ldyBDRkRFX1JlbmRlckNvbnRleHQ7DQorfQ0KK0NGREVfUmVuZGVyQ29udGV4dDo6Q0ZERV9SZW5kZXJDb250ZXh0KCkNCisgICAgOiBDRlhfVGhyZWFkTG9jaygpLA0KKyAgICAgIG1fZVN0YXR1cyhGREVfUkVOREVSU1RBVFVTX1Jlc2V0KSwNCisgICAgICBtX3BSZW5kZXJEZXZpY2UoTlVMTCksDQorICAgICAgbV9wU29saWRCcnVzaChOVUxMKSwNCisgICAgICBtX1RyYW5zZm9ybSgpLA0KKyAgICAgIG1fcENoYXJQb3MoTlVMTCksDQorICAgICAgbV9pQ2hhclBvc0NvdW50KDApLA0KKyAgICAgIG1fcEl0ZXJhdG9yKE5VTEwpIHsNCisgIG1fVHJhbnNmb3JtLlNldElkZW50aXR5KCk7DQorfQ0KK0NGREVfUmVuZGVyQ29udGV4dDo6fkNGREVfUmVuZGVyQ29udGV4dCgpIHsNCisgIFN0b3BSZW5kZXIoKTsNCit9DQorRlhfQk9PTCBDRkRFX1JlbmRlckNvbnRleHQ6OlN0YXJ0UmVuZGVyKElGREVfUmVuZGVyRGV2aWNlKiBwUmVuZGVyRGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NhbnZhc1NldCogcENhbnZhc1NldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgdG1Eb2MyRGV2aWNlKSB7DQorICBpZiAobV9wUmVuZGVyRGV2aWNlICE9IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHBSZW5kZXJEZXZpY2UgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAocENhbnZhc1NldCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIExvY2soKTsNCisgIG1fZVN0YXR1cyA9IEZERV9SRU5ERVJTVEFUVVNfUGF1c2VkOw0KKyAgbV9wUmVuZGVyRGV2aWNlID0gcFJlbmRlckRldmljZTsNCisgIG1fVHJhbnNmb3JtID0gdG1Eb2MyRGV2aWNlOw0KKyAgaWYgKG1fcEl0ZXJhdG9yID09IE5VTEwpIHsNCisgICAgbV9wSXRlcmF0b3IgPSBJRkRFX1Zpc3VhbFNldEl0ZXJhdG9yOjpDcmVhdGUoKTsNCisgICAgRlhTWVNfYXNzZXJ0KG1fcEl0ZXJhdG9yICE9IE5VTEwpOw0KKyAgfQ0KKyAgRlhfQk9PTCBiQXR0YWNoID0NCisgICAgICBtX3BJdGVyYXRvci0+QXR0YWNoQ2FudmFzKHBDYW52YXNTZXQpICYmIG1fcEl0ZXJhdG9yLT5GaWx0ZXJPYmplY3RzKCk7DQorICBVbmxvY2soKTsNCisgIHJldHVybiBiQXR0YWNoOw0KK30NCitGREVfUkVOREVSU1RBVFVTIENGREVfUmVuZGVyQ29udGV4dDo6RG9SZW5kZXIoSUZYX1BhdXNlKiBwUGF1c2UpIHsNCisgIGlmIChtX3BSZW5kZXJEZXZpY2UgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkRFX1JFTkRFUlNUQVRVU19GYWlsZWQ7DQorICB9DQorICBpZiAobV9wSXRlcmF0b3IgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkRFX1JFTkRFUlNUQVRVU19GYWlsZWQ7DQorICB9DQorICBMb2NrKCk7DQorICBGREVfUkVOREVSU1RBVFVTIGVTdGF0dXMgPSBGREVfUkVOREVSU1RBVFVTX1BhdXNlZDsNCisgIENGWF9NYXRyaXggcm07DQorICBybS5TZXRSZXZlcnNlKG1fVHJhbnNmb3JtKTsNCisgIENGWF9SZWN0RiBydERvY0NsaXAgPSBtX3BSZW5kZXJEZXZpY2UtPkdldENsaXBSZWN0KCk7DQorICBpZiAocnREb2NDbGlwLklzRW1wdHkoKSkgew0KKyAgICBydERvY0NsaXAubGVmdCA9IHJ0RG9jQ2xpcC50b3AgPSAwOw0KKyAgICBydERvY0NsaXAud2lkdGggPSAoRlhfRkxPQVQpbV9wUmVuZGVyRGV2aWNlLT5HZXRXaWR0aCgpOw0KKyAgICBydERvY0NsaXAuaGVpZ2h0ID0gKEZYX0ZMT0FUKW1fcFJlbmRlckRldmljZS0+R2V0SGVpZ2h0KCk7DQorICB9DQorICBybS5UcmFuc2Zvcm1SZWN0KHJ0RG9jQ2xpcCk7DQorICBJRkRFX1Zpc3VhbFNldCogcFZpc3VhbFNldDsNCisgIEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmo7DQorICBDRlhfUmVjdEYgcnRPYmo7DQorICBpbnQzMl90IGlDb3VudCA9IDA7DQorICB3aGlsZSAoVFJVRSkgew0KKyAgICBoVmlzdWFsT2JqID0gbV9wSXRlcmF0b3ItPkdldE5leHQocFZpc3VhbFNldCk7DQorICAgIGlmIChoVmlzdWFsT2JqID09IE5VTEwgfHwgcFZpc3VhbFNldCA9PSBOVUxMKSB7DQorICAgICAgZVN0YXR1cyA9IEZERV9SRU5ERVJTVEFUVVNfRG9uZTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBydE9iai5FbXB0eSgpOw0KKyAgICBwVmlzdWFsU2V0LT5HZXRSZWN0KGhWaXN1YWxPYmosIHJ0T2JqKTsNCisgICAgaWYgKCFydERvY0NsaXAuSW50ZXJzZWN0V2l0aChydE9iaikpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBzd2l0Y2ggKHBWaXN1YWxTZXQtPkdldFR5cGUoKSkgew0KKyAgICAgIGNhc2UgRkRFX1ZJU1VBTE9CSl9UZXh0Og0KKyAgICAgICAgUmVuZGVyVGV4dCgoSUZERV9UZXh0U2V0KilwVmlzdWFsU2V0LCBoVmlzdWFsT2JqKTsNCisgICAgICAgIGlDb3VudCArPSA1Ow0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfVklTVUFMT0JKX1BhdGg6DQorICAgICAgICBSZW5kZXJQYXRoKChJRkRFX1BhdGhTZXQqKXBWaXN1YWxTZXQsIGhWaXN1YWxPYmopOw0KKyAgICAgICAgaUNvdW50ICs9IDIwOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfVklTVUFMT0JKX1dpZGdldDoNCisgICAgICAgIGlDb3VudCArPSAxMDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX1ZJU1VBTE9CSl9DYW52YXM6DQorICAgICAgICBGWFNZU19hc3NlcnQoRkFMU0UpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChpQ291bnQgPj0gMTAwICYmIHBQYXVzZSAhPSBOVUxMICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgew0KKyAgICAgIGVTdGF0dXMgPSBGREVfUkVOREVSU1RBVFVTX1BhdXNlZDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgVW5sb2NrKCk7DQorICByZXR1cm4gbV9lU3RhdHVzID0gZVN0YXR1czsNCit9DQordm9pZCBDRkRFX1JlbmRlckNvbnRleHQ6OlN0b3BSZW5kZXIoKSB7DQorICBMb2NrKCk7DQorICBtX2VTdGF0dXMgPSBGREVfUkVOREVSU1RBVFVTX1Jlc2V0Ow0KKyAgbV9wUmVuZGVyRGV2aWNlID0gbnVsbHB0cjsNCisgIG1fVHJhbnNmb3JtLlNldElkZW50aXR5KCk7DQorICBpZiAobV9wSXRlcmF0b3IpIHsNCisgICAgbV9wSXRlcmF0b3ItPlJlbGVhc2UoKTsNCisgICAgbV9wSXRlcmF0b3IgPSBudWxscHRyOw0KKyAgfQ0KKyAgaWYgKG1fcFNvbGlkQnJ1c2gpIHsNCisgICAgbV9wU29saWRCcnVzaC0+UmVsZWFzZSgpOw0KKyAgICBtX3BTb2xpZEJydXNoID0gbnVsbHB0cjsNCisgIH0NCisgIEZYX0ZyZWUobV9wQ2hhclBvcyk7DQorICBtX3BDaGFyUG9zID0gbnVsbHB0cjsNCisgIG1faUNoYXJQb3NDb3VudCA9IDA7DQorICBVbmxvY2soKTsNCit9DQordm9pZCBDRkRFX1JlbmRlckNvbnRleHQ6OlJlbmRlclRleHQoSUZERV9UZXh0U2V0KiBwVGV4dFNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfSFZJU1VBTE9CSiBoVGV4dCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcFJlbmRlckRldmljZSAhPSBOVUxMKTsNCisgIEZYU1lTX2Fzc2VydChwVGV4dFNldCAhPSBOVUxMICYmIGhUZXh0ICE9IE5VTEwpOw0KKyAgSUZYX0ZvbnQqIHBGb250ID0gcFRleHRTZXQtPkdldEZvbnQoaFRleHQpOw0KKyAgaWYgKHBGb250ID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpQ291bnQgPSBwVGV4dFNldC0+R2V0RGlzcGxheVBvcyhoVGV4dCwgTlVMTCwgRkFMU0UpOw0KKyAgaWYgKGlDb3VudCA8IDEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1fcFNvbGlkQnJ1c2ggPT0gTlVMTCkgew0KKyAgICBtX3BTb2xpZEJydXNoID0gKElGREVfU29saWRCcnVzaCopSUZERV9CcnVzaDo6Q3JlYXRlKEZERV9CUlVTSFRZUEVfU29saWQpOw0KKyAgICBpZiAobV9wU29saWRCcnVzaCA9PSBOVUxMKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICB9DQorICBpZiAobV9wQ2hhclBvcyA9PSBOVUxMKSB7DQorICAgIG1fcENoYXJQb3MgPSBGWF9BbGxvYyhGWFRFWFRfQ0hBUlBPUywgaUNvdW50KTsNCisgIH0gZWxzZSBpZiAobV9pQ2hhclBvc0NvdW50IDwgaUNvdW50KSB7DQorICAgIG1fcENoYXJQb3MgPSBGWF9SZWFsbG9jKEZYVEVYVF9DSEFSUE9TLCBtX3BDaGFyUG9zLCBpQ291bnQpOw0KKyAgfQ0KKyAgaWYgKG1faUNoYXJQb3NDb3VudCA8IGlDb3VudCkgew0KKyAgICBtX2lDaGFyUG9zQ291bnQgPSBpQ291bnQ7DQorICB9DQorICBpQ291bnQgPSBwVGV4dFNldC0+R2V0RGlzcGxheVBvcyhoVGV4dCwgbV9wQ2hhclBvcywgRkFMU0UpOw0KKyAgRlhfRkxPQVQgZkZvbnRTaXplID0gcFRleHRTZXQtPkdldEZvbnRTaXplKGhUZXh0KTsNCisgIEZYX0FSR0IgZHdDb2xvciA9IHBUZXh0U2V0LT5HZXRGb250Q29sb3IoaFRleHQpOw0KKyAgbV9wU29saWRCcnVzaC0+U2V0Q29sb3IoZHdDb2xvcik7DQorICBGREVfSERFVklDRVNUQVRFIGhTdGF0ZTsNCisgIEZYX0JPT0wgYkNsaXAgPSBBcHBseUNsaXAocFRleHRTZXQsIGhUZXh0LCBoU3RhdGUpOw0KKyAgbV9wUmVuZGVyRGV2aWNlLT5EcmF3U3RyaW5nKG1fcFNvbGlkQnJ1c2gsIHBGb250LCBtX3BDaGFyUG9zLCBpQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkZvbnRTaXplLCAmbV9UcmFuc2Zvcm0pOw0KKyAgaWYgKGJDbGlwKSB7DQorICAgIFJlc3RvcmVDbGlwKGhTdGF0ZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9SZW5kZXJDb250ZXh0OjpSZW5kZXJQYXRoKElGREVfUGF0aFNldCogcFBhdGhTZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0hWSVNVQUxPQkogaFBhdGgpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BSZW5kZXJEZXZpY2UgIT0gTlVMTCk7DQorICBGWFNZU19hc3NlcnQocFBhdGhTZXQgIT0gTlVMTCAmJiBoUGF0aCAhPSBOVUxMKTsNCisgIElGREVfUGF0aCogcFBhdGggPSBwUGF0aFNldC0+R2V0UGF0aChoUGF0aCk7DQorICBpZiAocFBhdGggPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGREVfSERFVklDRVNUQVRFIGhTdGF0ZTsNCisgIEZYX0JPT0wgYkNsaXAgPSBBcHBseUNsaXAocFBhdGhTZXQsIGhQYXRoLCBoU3RhdGUpOw0KKyAgaW50MzJfdCBpUmVuZGVyTW9kZSA9IHBQYXRoU2V0LT5HZXRSZW5kZXJNb2RlKGhQYXRoKTsNCisgIGlmIChpUmVuZGVyTW9kZSAmIEZERV9QQVRIUkVOREVSX1N0cm9rZSkgew0KKyAgICBJRkRFX1BlbiogcFBlbiA9IHBQYXRoU2V0LT5HZXRQZW4oaFBhdGgpOw0KKyAgICBGWF9GTE9BVCBmV2lkdGggPSBwUGF0aFNldC0+R2V0UGVuV2lkdGgoaFBhdGgpOw0KKyAgICBpZiAocFBlbiAhPSBOVUxMICYmIGZXaWR0aCA+IDApIHsNCisgICAgICBtX3BSZW5kZXJEZXZpY2UtPkRyYXdQYXRoKHBQZW4sIGZXaWR0aCwgcFBhdGgsICZtX1RyYW5zZm9ybSk7DQorICAgIH0NCisgIH0NCisgIGlmIChpUmVuZGVyTW9kZSAmIEZERV9QQVRIUkVOREVSX0ZpbGwpIHsNCisgICAgSUZERV9CcnVzaCogcEJydXNoID0gcFBhdGhTZXQtPkdldEJydXNoKGhQYXRoKTsNCisgICAgaWYgKHBCcnVzaCAhPSBOVUxMKSB7DQorICAgICAgbV9wUmVuZGVyRGV2aWNlLT5GaWxsUGF0aChwQnJ1c2gsIHBQYXRoLCAmbV9UcmFuc2Zvcm0pOw0KKyAgICB9DQorICB9DQorICBpZiAoYkNsaXApIHsNCisgICAgUmVzdG9yZUNsaXAoaFN0YXRlKTsNCisgIH0NCit9DQorRlhfQk9PTCBDRkRFX1JlbmRlckNvbnRleHQ6OkFwcGx5Q2xpcChJRkRFX1Zpc3VhbFNldCogcFZpc3VhbFNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9IVklTVUFMT0JKIGhPYmosDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfSERFVklDRVNUQVRFJiBoU3RhdGUpIHsNCisgIENGWF9SZWN0RiBydENsaXA7DQorICBpZiAoIXBWaXN1YWxTZXQtPkdldENsaXAoaE9iaiwgcnRDbGlwKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfUmVjdEYgcnRPYmo7DQorICBwVmlzdWFsU2V0LT5HZXRSZWN0KGhPYmosIHJ0T2JqKTsNCisgIHJ0Q2xpcC5PZmZzZXQocnRPYmoubGVmdCwgcnRPYmoudG9wKTsNCisgIG1fVHJhbnNmb3JtLlRyYW5zZm9ybVJlY3QocnRDbGlwKTsNCisgIGNvbnN0IENGWF9SZWN0RiYgcnREZXZDbGlwID0gbV9wUmVuZGVyRGV2aWNlLT5HZXRDbGlwUmVjdCgpOw0KKyAgcnRDbGlwLkludGVyc2VjdChydERldkNsaXApOw0KKyAgaFN0YXRlID0gbV9wUmVuZGVyRGV2aWNlLT5TYXZlU3RhdGUoKTsNCisgIHJldHVybiBtX3BSZW5kZXJEZXZpY2UtPlNldENsaXBSZWN0KHJ0Q2xpcCk7DQorfQ0KK3ZvaWQgQ0ZERV9SZW5kZXJDb250ZXh0OjpSZXN0b3JlQ2xpcChGREVfSERFVklDRVNUQVRFIGhTdGF0ZSkgew0KKyAgbV9wUmVuZGVyRGV2aWNlLT5SZXN0b3JlU3RhdGUoaFN0YXRlKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfcmVuZGVyLmggYi94ZmEvc3JjL2ZkcC9zcmMvZmRlL2ZkZV9yZW5kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmUzZjM3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZHAvc3JjL2ZkZS9mZGVfcmVuZGVyLmgKQEAgLTAsMCArMSwzOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GREVfUkVOREVSX0lNUA0KKyNkZWZpbmUgX0ZERV9SRU5ERVJfSU1QDQorY2xhc3MgQ0ZERV9SZW5kZXJDb250ZXh0Ow0KK2NsYXNzIENGREVfUmVuZGVyQ29udGV4dCA6IHB1YmxpYyBJRkRFX1JlbmRlckNvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIENGWF9UaHJlYWRMb2NrLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZERV9SZW5kZXJDb250ZXh0KCk7DQorICB2aXJ0dWFsIH5DRkRFX1JlbmRlckNvbnRleHQoKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKyAgdmlydHVhbCBGWF9CT09MIFN0YXJ0UmVuZGVyKElGREVfUmVuZGVyRGV2aWNlKiBwUmVuZGVyRGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ2FudmFzU2V0KiBwQ2FudmFzU2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIHRtRG9jMkRldmljZSk7DQorICB2aXJ0dWFsIEZERV9SRU5ERVJTVEFUVVMgR2V0U3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbV9lU3RhdHVzOyB9DQorICB2aXJ0dWFsIEZERV9SRU5ERVJTVEFUVVMgRG9SZW5kZXIoSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKTsNCisgIHZpcnR1YWwgdm9pZCBTdG9wUmVuZGVyKCk7DQorICB2b2lkIFJlbmRlclBhdGgoSUZERV9QYXRoU2V0KiBwUGF0aFNldCwgRkRFX0hWSVNVQUxPQkogaFBhdGgpOw0KKyAgdm9pZCBSZW5kZXJUZXh0KElGREVfVGV4dFNldCogcFRleHRTZXQsIEZERV9IVklTVUFMT0JKIGhUZXh0KTsNCisgIEZYX0JPT0wgQXBwbHlDbGlwKElGREVfVmlzdWFsU2V0KiBwVmlzdWFsU2V0LA0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0hWSVNVQUxPQkogaE9iaiwNCisgICAgICAgICAgICAgICAgICAgIEZERV9IREVWSUNFU1RBVEUmIGhTdGF0ZSk7DQorICB2b2lkIFJlc3RvcmVDbGlwKEZERV9IREVWSUNFU1RBVEUgaFN0YXRlKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgRkRFX1JFTkRFUlNUQVRVUyBtX2VTdGF0dXM7DQorICBJRkRFX1JlbmRlckRldmljZSogbV9wUmVuZGVyRGV2aWNlOw0KKyAgSUZERV9Tb2xpZEJydXNoKiBtX3BTb2xpZEJydXNoOw0KKyAgQ0ZYX01hdHJpeCBtX1RyYW5zZm9ybTsNCisgIEZYVEVYVF9DSEFSUE9TKiBtX3BDaGFyUG9zOw0KKyAgaW50MzJfdCBtX2lDaGFyUG9zQ291bnQ7DQorICBJRkRFX1Zpc3VhbFNldEl0ZXJhdG9yKiBtX3BJdGVyYXRvcjsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy90dG8vZmRlX3RleHRvdXQuY3BwIGIveGZhL3NyYy9mZHAvc3JjL3R0by9mZGVfdGV4dG91dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBmMjFmMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmRwL3NyYy90dG8vZmRlX3RleHRvdXQuY3BwCkBAIC0wLDAgKzEsOTQ3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlIDxhbGdvcml0aG0+DQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAiZmRlX3RleHRvdXQuaCINCitJRkRFX1RleHRPdXQqIElGREVfVGV4dE91dDo6Q3JlYXRlKCkgew0KKyAgcmV0dXJuIG5ldyBDRkRFX1RleHRPdXQ7DQorfQ0KK0NGREVfVGV4dE91dDo6Q0ZERV9UZXh0T3V0KCkNCisgICAgOiBtX3BGb250KE5VTEwpLA0KKyAgICAgIG1fZkZvbnRTaXplKDEyLjBmKSwNCisgICAgICBtX2ZMaW5lU3BhY2UobV9mRm9udFNpemUpLA0KKyAgICAgIG1fZkxpbmVQb3MoMC4wZiksDQorICAgICAgbV9mVG9sZXJhbmNlKDAuMGYpLA0KKyAgICAgIG1faUFsaWdubWVudCgwKSwNCisgICAgICBtX2lUeHRCa0FsaWdubWVudCgwKSwNCisgICAgICBtX3BDaGFyV2lkdGhzKE5VTEwpLA0KKyAgICAgIG1faUNoYXJzKDApLA0KKyAgICAgIG1fcEVsbENoYXJXaWR0aHMoTlVMTCksDQorICAgICAgbV9pRWxsQ2hhcnMoMCksDQorICAgICAgbV93UGFyYWdyYXBoQmtDaGFyKEwnXG4nKSwNCisgICAgICBtX1R4dENvbG9yKDB4RkYwMDAwMDApLA0KKyAgICAgIG1fZHdTdHlsZXMoMCksDQorICAgICAgbV9kd1R4dEJrU3R5bGVzKDApLA0KKyAgICAgIG1fYkVsbGlDaGFuZ2VkKEZBTFNFKSwNCisgICAgICBtX2lFbGxpcHNpc1dpZHRoKDApLA0KKyAgICAgIG1fdHRvTGluZXMoNSksDQorICAgICAgbV9pQ3VyTGluZSgwKSwNCisgICAgICBtX2lDdXJQaWVjZSgwKSwNCisgICAgICBtX2lUb3RhbExpbmVzKDApLA0KKyAgICAgIG1fcENoYXJQb3MoTlVMTCksDQorICAgICAgbV9pQ2hhclBvc1NpemUoMCksDQorICAgICAgbV9wUmVuZGVyRGV2aWNlKE5VTEwpIHsNCisgIG1fcFR4dEJyZWFrID0gSUZYX1R4dEJyZWFrOjpDcmVhdGUoRlhfVFhUQlJFQUtQT0xJQ1lfTm9uZSk7DQorICBGWFNZU19hc3NlcnQobV9wVHh0QnJlYWsgIT0gTlVMTCk7DQorICBtX01hdHJpeC5TZXRJZGVudGl0eSgpOw0KKyAgbV9ydENsaXAuUmVzZXQoKTsNCisgIG1fcnRMb2dpY0NsaXAuUmVzZXQoKTsNCit9DQorQ0ZERV9UZXh0T3V0Ojp+Q0ZERV9UZXh0T3V0KCkgew0KKyAgaWYgKG1fcFR4dEJyZWFrKSB7DQorICAgIG1fcFR4dEJyZWFrLT5SZWxlYXNlKCk7DQorICB9DQorICBGWF9GcmVlKG1fcENoYXJXaWR0aHMpOw0KKyAgRlhfRnJlZShtX3BFbGxDaGFyV2lkdGhzKTsNCisgIGlmIChtX3BSZW5kZXJEZXZpY2UpIHsNCisgICAgbV9wUmVuZGVyRGV2aWNlLT5SZWxlYXNlKCk7DQorICB9DQorICBGWF9GcmVlKG1fcENoYXJQb3MpOw0KKyAgbV90dG9MaW5lcy5SZW1vdmVBbGwoKTsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OlNldEZvbnQoSUZYX0ZvbnQqIHBGb250KSB7DQorICBGWFNZU19hc3NlcnQocEZvbnQpOw0KKyAgbV9wRm9udCA9IHBGb250Ow0KKyAgbV9wVHh0QnJlYWstPlNldEZvbnQocEZvbnQpOw0KK30NCit2b2lkIENGREVfVGV4dE91dDo6U2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSB7DQorICBGWFNZU19hc3NlcnQoZkZvbnRTaXplID4gMCk7DQorICBtX2ZGb250U2l6ZSA9IGZGb250U2l6ZTsNCisgIG1fcFR4dEJyZWFrLT5TZXRGb250U2l6ZShmRm9udFNpemUpOw0KK30NCit2b2lkIENGREVfVGV4dE91dDo6U2V0VGV4dENvbG9yKEZYX0FSR0IgY29sb3IpIHsNCisgIG1fVHh0Q29sb3IgPSBjb2xvcjsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OlNldFN0eWxlcyhGWF9EV09SRCBkd1N0eWxlcykgew0KKyAgbV9kd1N0eWxlcyA9IGR3U3R5bGVzOw0KKyAgbV9kd1R4dEJrU3R5bGVzID0gMDsNCisgIGlmIChkd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lKSB7DQorICAgIG1fZHdUeHRCa1N0eWxlcyB8PSBGWF9UWFRMQVlPVVRTVFlMRV9TaW5nbGVMaW5lOw0KKyAgfQ0KKyAgaWYgKGR3U3R5bGVzICYgRkRFX1RUT1NUWUxFX0V4cGFuZFRhYikgew0KKyAgICBtX2R3VHh0QmtTdHlsZXMgfD0gRlhfVFhUTEFZT1VUU1RZTEVfRXhwYW5kVGFiOw0KKyAgfQ0KKyAgaWYgKGR3U3R5bGVzICYgRkRFX1RUT1NUWUxFX0FyYWJpY1NoYXBlcykgew0KKyAgICBtX2R3VHh0QmtTdHlsZXMgfD0gRlhfVFhUTEFZT1VUU1RZTEVfQXJhYmljU2hhcGVzOw0KKyAgfQ0KKyAgaWYgKGR3U3R5bGVzICYgRkRFX1RUT1NUWUxFX1JUTCkgew0KKyAgICBtX2R3VHh0QmtTdHlsZXMgfD0gRlhfVFhUTEFZT1VUU1RZTEVfUlRMUmVhZGluZ09yZGVyOw0KKyAgfQ0KKyAgaWYgKGR3U3R5bGVzICYgRkRFX1RUT1NUWUxFX0FyYWJpY0NvbnRleHQpIHsNCisgICAgbV9kd1R4dEJrU3R5bGVzIHw9IEZYX1RYVExBWU9VVFNUWUxFX0FyYWJpY0NvbnRleHQ7DQorICB9DQorICBpZiAoZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfVmVydGljYWxMYXlvdXQpIHsNCisgICAgbV9kd1R4dEJrU3R5bGVzIHw9DQorICAgICAgICAoRlhfVFhUTEFZT1VUU1RZTEVfVmVydGljYWxDaGFycyB8IEZYX1RYVExBWU9VVFNUWUxFX1ZlcnRpY2FsTGF5b3V0KTsNCisgIH0NCisgIG1fcFR4dEJyZWFrLT5TZXRMYXlvdXRTdHlsZXMobV9kd1R4dEJrU3R5bGVzKTsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OlNldFRhYldpZHRoKEZYX0ZMT0FUIGZUYWJXaWR0aCkgew0KKyAgRlhTWVNfYXNzZXJ0KGZUYWJXaWR0aCA+IDEuMGYpOw0KKyAgbV9wVHh0QnJlYWstPlNldFRhYldpZHRoKGZUYWJXaWR0aCwgRkFMU0UpOw0KK30NCit2b2lkIENGREVfVGV4dE91dDo6U2V0RWxsaXBzaXNTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRWxsaXBzaXMpIHsNCisgIG1fYkVsbGlDaGFuZ2VkID0gVFJVRTsNCisgIG1fd3NFbGxpcHNpcyA9IHdzRWxsaXBzaXM7DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRQYXJhZ3JhcGhCcmVha0NoYXIoRlhfV0NIQVIgd2NoKSB7DQorICBtX3dQYXJhZ3JhcGhCa0NoYXIgPSB3Y2g7DQorICBtX3BUeHRCcmVhay0+U2V0UGFyYWdyYXBoQnJlYWtDaGFyKHdjaCk7DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRBbGlnbm1lbnQoaW50MzJfdCBpQWxpZ25tZW50KSB7DQorICBtX2lBbGlnbm1lbnQgPSBpQWxpZ25tZW50Ow0KKyAgc3dpdGNoIChtX2lBbGlnbm1lbnQpIHsNCisgICAgY2FzZSBGREVfVFRPQUxJR05NRU5UX1RvcENlbnRlcjoNCisgICAgY2FzZSBGREVfVFRPQUxJR05NRU5UX0NlbnRlcjoNCisgICAgY2FzZSBGREVfVFRPQUxJR05NRU5UX0JvdHRvbUNlbnRlcjoNCisgICAgICBtX2lUeHRCa0FsaWdubWVudCA9IEZYX1RYVExJTkVBTElHTk1FTlRfQ2VudGVyOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZERV9UVE9BTElHTk1FTlRfVG9wUmlnaHQ6DQorICAgIGNhc2UgRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJSaWdodDoNCisgICAgY2FzZSBGREVfVFRPQUxJR05NRU5UX0JvdHRvbVJpZ2h0Og0KKyAgICAgIG1faVR4dEJrQWxpZ25tZW50ID0gRlhfVFhUTElORUFMSUdOTUVOVF9SaWdodDsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBtX2lUeHRCa0FsaWdubWVudCA9IEZYX1RYVExJTkVBTElHTk1FTlRfTGVmdDsNCisgICAgICBicmVhazsNCisgIH0NCisgIG1fcFR4dEJyZWFrLT5TZXRBbGlnbm1lbnQobV9pVHh0QmtBbGlnbm1lbnQpOw0KK30NCit2b2lkIENGREVfVGV4dE91dDo6U2V0TGluZVNwYWNlKEZYX0ZMT0FUIGZMaW5lU3BhY2UpIHsNCisgIEZYU1lTX2Fzc2VydChmTGluZVNwYWNlID4gMS4wZik7DQorICBtX2ZMaW5lU3BhY2UgPSBmTGluZVNwYWNlOw0KK30NCit2b2lkIENGREVfVGV4dE91dDo6U2V0RElCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwRElCKSB7DQorICBGWFNZU19hc3NlcnQocERJQiAhPSBOVUxMKTsNCisgIGlmIChtX3BSZW5kZXJEZXZpY2UgIT0gTlVMTCkgew0KKyAgICBtX3BSZW5kZXJEZXZpY2UtPlJlbGVhc2UoKTsNCisgIH0NCisgIG1fcFJlbmRlckRldmljZSA9IElGREVfUmVuZGVyRGV2aWNlOjpDcmVhdGUocERJQik7DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSkgew0KKyAgRlhTWVNfYXNzZXJ0KHBEZXZpY2UgIT0gTlVMTCk7DQorICBpZiAobV9wUmVuZGVyRGV2aWNlICE9IE5VTEwpIHsNCisgICAgbV9wUmVuZGVyRGV2aWNlLT5SZWxlYXNlKCk7DQorICB9DQorICBtX3BSZW5kZXJEZXZpY2UgPSBJRkRFX1JlbmRlckRldmljZTo6Q3JlYXRlKHBEZXZpY2UpOw0KK30NCit2b2lkIENGREVfVGV4dE91dDo6U2V0Q2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3QmIHJ0Q2xpcCkgew0KKyAgbV9ydENsaXAuU2V0KChGWF9GTE9BVClydENsaXAubGVmdCwgKEZYX0ZMT0FUKXJ0Q2xpcC50b3AsDQorICAgICAgICAgICAgICAgKEZYX0ZMT0FUKXJ0Q2xpcC5XaWR0aCgpLCAoRlhfRkxPQVQpcnRDbGlwLkhlaWdodCgpKTsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OlNldENsaXBSZWN0KGNvbnN0IENGWF9SZWN0RiYgcnRDbGlwKSB7DQorICBtX3J0Q2xpcCA9IHJ0Q2xpcDsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OlNldExvZ2ljQ2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3RGJiBydENsaXApIHsNCisgIG1fcnRMb2dpY0NsaXAgPSBydENsaXA7DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7DQorICBtX01hdHJpeCA9IG1hdHJpeDsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OlNldExpbmVCcmVha1RvbGVyYW5jZShGWF9GTE9BVCBmVG9sZXJhbmNlKSB7DQorICBtX2ZUb2xlcmFuY2UgPSBmVG9sZXJhbmNlOw0KKyAgbV9wVHh0QnJlYWstPlNldExpbmVCcmVha1RvbGVyYW5jZShtX2ZUb2xlcmFuY2UpOw0KK30NCitpbnQzMl90IENGREVfVGV4dE91dDo6R2V0VG90YWxMaW5lcygpIHsNCisgIHJldHVybiBtX2lUb3RhbExpbmVzOw0KK30NCit2b2lkIENGREVfVGV4dE91dDo6Q2FsY1NpemUoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfU2l6ZSYgc2l6ZSkgew0KKyAgQ0ZYX1JlY3RGIHJ0VGV4dDsNCisgIHJ0VGV4dC5TZXQoMC4wZiwgMC4wZiwgKEZYX0ZMT0FUKXNpemUueCwgKEZYX0ZMT0FUKXNpemUueSk7DQorICBDYWxjU2l6ZShwd3NTdHIsIGlMZW5ndGgsIHJ0VGV4dCk7DQorICBzaXplLnggPSAoaW50MzJfdClydFRleHQuV2lkdGgoKTsNCisgIHNpemUueSA9IChpbnQzMl90KXJ0VGV4dC5IZWlnaHQoKTsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OkNhbGNTaXplKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1NpemVGJiBzaXplKSB7DQorICBDRlhfUmVjdEYgcnRUZXh0Ow0KKyAgcnRUZXh0LlNldCgwLjBmLCAwLjBmLCBzaXplLngsIHNpemUueSk7DQorICBDYWxjU2l6ZShwd3NTdHIsIGlMZW5ndGgsIHJ0VGV4dCk7DQorICBzaXplLnggPSBydFRleHQuV2lkdGgoKTsNCisgIHNpemUueSA9IHJ0VGV4dC5IZWlnaHQoKTsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OkNhbGNTaXplKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3QmIHJlY3QpIHsNCisgIENGWF9SZWN0RiBydFRleHQ7DQorICBydFRleHQuU2V0KChGWF9GTE9BVClyZWN0LmxlZnQsIChGWF9GTE9BVClyZWN0LnRvcCwgKEZYX0ZMT0FUKXJlY3QuV2lkdGgoKSwNCisgICAgICAgICAgICAgKEZYX0ZMT0FUKXJlY3QuSGVpZ2h0KCkpOw0KKyAgQ2FsY1NpemUocHdzU3RyLCBpTGVuZ3RoLCBydFRleHQpOw0KKyAgcmVjdC5TZXQoKGludDMyX3QpcnRUZXh0LmxlZnQsIChpbnQzMl90KXJ0VGV4dC50b3AsIChpbnQzMl90KXJ0VGV4dC5XaWR0aCgpLA0KKyAgICAgICAgICAgKGludDMyX3QpcnRUZXh0LkhlaWdodCgpKTsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OkNhbGNTaXplKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBpZiAocHdzU3RyID09IE5VTEwgfHwgaUxlbmd0aCA8IDEpIHsNCisgICAgcmVjdC53aWR0aCA9IDAuMGY7DQorICAgIHJlY3QuaGVpZ2h0ID0gMC4wZjsNCisgIH0gZWxzZSB7DQorICAgIENGWF9NYXRyaXggcm07DQorICAgIHJtLlNldFJldmVyc2UobV9NYXRyaXgpOw0KKyAgICBybS5UcmFuc2Zvcm1SZWN0KHJlY3QpOw0KKyAgICBDYWxjVGV4dFNpemUocHdzU3RyLCBpTGVuZ3RoLCByZWN0KTsNCisgICAgbV9NYXRyaXguVHJhbnNmb3JtUmVjdChyZWN0KTsNCisgIH0NCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OkNhbGNMb2dpY1NpemUoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1NpemVGJiBzaXplKSB7DQorICBDRlhfUmVjdEYgcnRUZXh0Ow0KKyAgcnRUZXh0LlNldCgwLjBmLCAwLjBmLCBzaXplLngsIHNpemUueSk7DQorICBDYWxjTG9naWNTaXplKHB3c1N0ciwgaUxlbmd0aCwgcnRUZXh0KTsNCisgIHNpemUueCA9IHJ0VGV4dC5XaWR0aCgpOw0KKyAgc2l6ZS55ID0gcnRUZXh0LkhlaWdodCgpOw0KK30NCit2b2lkIENGREVfVGV4dE91dDo6Q2FsY0xvZ2ljU2l6ZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJlY3QpIHsNCisgIGlmIChwd3NTdHIgPT0gTlVMTCB8fCBpTGVuZ3RoIDwgMSkgew0KKyAgICByZWN0LndpZHRoID0gMC4wZjsNCisgICAgcmVjdC5oZWlnaHQgPSAwLjBmOw0KKyAgfSBlbHNlIHsNCisgICAgQ2FsY1RleHRTaXplKHB3c1N0ciwgaUxlbmd0aCwgcmVjdCk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpDYWxjVGV4dFNpemUoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcmVjdCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcEZvbnQgIT0gTlVMTCAmJiBtX2ZGb250U2l6ZSA+PSAxLjBmKTsNCisgIFNldExpbmVXaWR0aChyZWN0KTsNCisgIG1faVRvdGFsTGluZXMgPSAwOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBTdHIgPSBwd3NTdHI7DQorICBGWF9CT09MIGJIb3RLZXkgPSAhIShtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX0hvdEtleSk7DQorICBGWF9CT09MIGJWZXJ0aWNhbCA9ICEhKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfVmVydGljYWxMYXlvdXQpOw0KKyAgRlhfRkxPQVQgZldpZHRoID0gMC4wZjsNCisgIEZYX0ZMT0FUIGZIZWlnaHQgPSAwLjBmOw0KKyAgRlhfRkxPQVQgZlN0YXJ0UG9zID0gYlZlcnRpY2FsID8gcmVjdC5ib3R0b20oKSA6IHJlY3QucmlnaHQoKTsNCisgIEZYX0RXT1JEIGR3QnJlYWtTdGF0dXMgPSAwOw0KKyAgRlhfV0NIQVIgd1ByZUNoYXIgPSAwOw0KKyAgRlhfV0NIQVIgd2NoOw0KKyAgRlhfV0NIQVIgd0JyZWFrID0gMDsNCisgIHdoaWxlIChpTGVuZ3RoLS0gPiAwKSB7DQorICAgIHdjaCA9ICpwU3RyKys7DQorICAgIGlmICh3QnJlYWsgPT0gMCAmJiAod2NoID09IEwnXG4nIHx8IHdjaCA9PSBMJ1xyJykpIHsNCisgICAgICB3QnJlYWsgPSB3Y2g7DQorICAgICAgbV9wVHh0QnJlYWstPlNldFBhcmFncmFwaEJyZWFrQ2hhcih3Y2gpOw0KKyAgICB9DQorICAgIGlmIChiSG90S2V5ICYmIHdjaCA9PSBMJyYnICYmIHdQcmVDaGFyICE9IEwnJicpIHsNCisgICAgICB3UHJlQ2hhciA9IHdjaDsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBkd0JyZWFrU3RhdHVzID0gbV9wVHh0QnJlYWstPkFwcGVuZENoYXIod2NoKTsNCisgICAgaWYgKGR3QnJlYWtTdGF0dXMgPiBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSB7DQorICAgICAgUmV0cmlldmVMaW5lV2lkdGgoZHdCcmVha1N0YXR1cywgZlN0YXJ0UG9zLCBmV2lkdGgsIGZIZWlnaHQpOw0KKyAgICB9DQorICAgIHdQcmVDaGFyID0gMDsNCisgIH0NCisgIGR3QnJlYWtTdGF0dXMgPSBtX3BUeHRCcmVhay0+RW5kQnJlYWsoRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspOw0KKyAgaWYgKGR3QnJlYWtTdGF0dXMgPiBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSB7DQorICAgIFJldHJpZXZlTGluZVdpZHRoKGR3QnJlYWtTdGF0dXMsIGZTdGFydFBvcywgZldpZHRoLCBmSGVpZ2h0KTsNCisgIH0NCisgIG1fcFR4dEJyZWFrLT5SZXNldCgpOw0KKyAgRlhfRkxPQVQgZkluYyA9IHJlY3QuSGVpZ2h0KCkgLSBmSGVpZ2h0Ow0KKyAgaWYgKGJWZXJ0aWNhbCkgew0KKyAgICBmSW5jID0gcmVjdC5XaWR0aCgpIC0gZkhlaWdodDsNCisgIH0NCisgIGlmIChtX2lBbGlnbm1lbnQgPj0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJMZWZ0ICYmDQorICAgICAgbV9pQWxpZ25tZW50IDwgRkRFX1RUT0FMSUdOTUVOVF9Cb3R0b21MZWZ0KSB7DQorICAgIGZJbmMgLz0gMi4wZjsNCisgIH0gZWxzZSBpZiAobV9pQWxpZ25tZW50IDwgRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJMZWZ0KSB7DQorICAgIGZJbmMgPSAwLjBmOw0KKyAgfQ0KKyAgaWYgKGJWZXJ0aWNhbCkgew0KKyAgICByZWN0LnRvcCArPSBmU3RhcnRQb3M7DQorICAgIHJlY3QubGVmdCArPSBmSW5jOw0KKyAgICByZWN0LndpZHRoID0gZkhlaWdodDsNCisgICAgcmVjdC5oZWlnaHQgPSBzdGQ6Om1pbihmV2lkdGgsIHJlY3QuSGVpZ2h0KCkpOw0KKyAgfSBlbHNlIHsNCisgICAgcmVjdC5sZWZ0ICs9IGZTdGFydFBvczsNCisgICAgcmVjdC50b3AgKz0gZkluYzsNCisgICAgcmVjdC53aWR0aCA9IHN0ZDo6bWluKGZXaWR0aCwgcmVjdC5XaWR0aCgpKTsNCisgICAgcmVjdC5oZWlnaHQgPSBmSGVpZ2h0Ow0KKyAgICBpZiAobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9MYXN0TGluZUhlaWdodCkgew0KKyAgICAgIHJlY3QuaGVpZ2h0IC09IG1fZkxpbmVTcGFjZSAtIG1fZkZvbnRTaXplOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRMaW5lV2lkdGgoQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBpZiAoKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfU2luZ2xlTGluZSkgPT0gMCkgew0KKyAgICBGWF9GTE9BVCBmTGluZVdpZHRoID0gMC4wZjsNCisgICAgaWYgKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfVmVydGljYWxMYXlvdXQpIHsNCisgICAgICBpZiAocmVjdC5IZWlnaHQoKSA8IDEuMGYpIHsNCisgICAgICAgIHJlY3QuaGVpZ2h0ID0gbV9mRm9udFNpemUgKiAxMDAwLjBmOw0KKyAgICAgIH0NCisgICAgICBmTGluZVdpZHRoID0gcmVjdC5IZWlnaHQoKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAocmVjdC5XaWR0aCgpIDwgMS4wZikgew0KKyAgICAgICAgcmVjdC53aWR0aCA9IG1fZkZvbnRTaXplICogMTAwMC4wZjsNCisgICAgICB9DQorICAgICAgZkxpbmVXaWR0aCA9IHJlY3QuV2lkdGgoKTsNCisgICAgfQ0KKyAgICBtX3BUeHRCcmVhay0+U2V0TGluZVdpZHRoKGZMaW5lV2lkdGgpOw0KKyAgfQ0KK30NCitGWF9CT09MIENGREVfVGV4dE91dDo6UmV0cmlldmVMaW5lV2lkdGgoRlhfRFdPUkQgZHdCcmVha1N0YXR1cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZTdGFydFBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZIZWlnaHQpIHsNCisgIGlmIChkd0JyZWFrU3RhdHVzIDw9IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZkxpbmVTdGVwID0NCisgICAgICAobV9mTGluZVNwYWNlID4gbV9mRm9udFNpemUpID8gbV9mTGluZVNwYWNlIDogbV9mRm9udFNpemU7DQorICBGWF9CT09MIGJMaW5lV3JhcCA9ICEhKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfTGluZVdyYXApOw0KKyAgRlhfRkxPQVQgZkxpbmVXaWR0aCA9IDAuMGY7DQorICBpbnQzMl90IGlDb3VudCA9IG1fcFR4dEJyZWFrLT5Db3VudEJyZWFrUGllY2VzKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBjb25zdCBDRlhfVHh0UGllY2UqIHBQaWVjZSA9IG1fcFR4dEJyZWFrLT5HZXRCcmVha1BpZWNlKGkpOw0KKyAgICBmTGluZVdpZHRoICs9IChGWF9GTE9BVClwUGllY2UtPm1faVdpZHRoIC8gMjAwMDAuMGY7DQorICAgIGZTdGFydFBvcyA9IHN0ZDo6bWluKGZTdGFydFBvcywgKEZYX0ZMT0FUKXBQaWVjZS0+bV9pU3RhcnRQb3MgLyAyMDAwMC4wZik7DQorICB9DQorICBtX3BUeHRCcmVhay0+Q2xlYXJCcmVha1BpZWNlcygpOw0KKyAgaWYgKGR3QnJlYWtTdGF0dXMgPT0gRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspIHsNCisgICAgbV9wVHh0QnJlYWstPlJlc2V0KCk7DQorICB9DQorICBpZiAoIWJMaW5lV3JhcCAmJiBkd0JyZWFrU3RhdHVzID09IEZYX1RYVEJSRUFLX0xpbmVCcmVhaykgew0KKyAgICBmV2lkdGggKz0gZkxpbmVXaWR0aDsNCisgIH0gZWxzZSB7DQorICAgIGZXaWR0aCA9IHN0ZDo6bWF4KGZXaWR0aCwgZkxpbmVXaWR0aCk7DQorICAgIGZIZWlnaHQgKz0gZkxpbmVTdGVwOw0KKyAgfQ0KKyAgbV9pVG90YWxMaW5lcysrOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpEcmF3VGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5KSB7DQorICBDRlhfUmVjdEYgcnRUZXh0Ow0KKyAgcnRUZXh0LlNldCgoRlhfRkxPQVQpeCwgKEZYX0ZMT0FUKXksIG1fZkZvbnRTaXplICogMTAwMC4wZiwNCisgICAgICAgICAgICAgbV9mRm9udFNpemUgKiAxMDAwLjBmKTsNCisgIERyYXdUZXh0KHB3c1N0ciwgaUxlbmd0aCwgcnRUZXh0KTsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OkRyYXdUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSkgew0KKyAgQ0ZYX1JlY3RGIHJ0VGV4dDsNCisgIHJ0VGV4dC5TZXQoeCwgeSwgbV9mRm9udFNpemUgKiAxMDAwLjBmLCBtX2ZGb250U2l6ZSAqIDEwMDAuMGYpOw0KKyAgRHJhd1RleHQocHdzU3RyLCBpTGVuZ3RoLCBydFRleHQpOw0KK30NCit2b2lkIENGREVfVGV4dE91dDo6RHJhd1RleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdCYgcmVjdCkgew0KKyAgQ0ZYX1JlY3RGIHJ0VGV4dDsNCisgIHJ0VGV4dC5TZXQoKEZYX0ZMT0FUKXJlY3QubGVmdCwgKEZYX0ZMT0FUKXJlY3QudG9wLCAoRlhfRkxPQVQpcmVjdC53aWR0aCwNCisgICAgICAgICAgICAgKEZYX0ZMT0FUKXJlY3QuaGVpZ2h0KTsNCisgIERyYXdUZXh0KHB3c1N0ciwgaUxlbmd0aCwgcnRUZXh0KTsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OkRyYXdUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBDRlhfUmVjdEYgcnRUZXh0Ow0KKyAgcnRUZXh0LlNldChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7DQorICBDRlhfTWF0cml4IHJtOw0KKyAgcm0uU2V0UmV2ZXJzZShtX01hdHJpeCk7DQorICBybS5UcmFuc2Zvcm1SZWN0KHJ0VGV4dCk7DQorICBEcmF3VGV4dChwd3NTdHIsIGlMZW5ndGgsIHJ0VGV4dCwgbV9ydENsaXApOw0KK30NCit2b2lkIENGREVfVGV4dE91dDo6RHJhd0xvZ2ljVGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkpIHsNCisgIENGWF9SZWN0RiBydFRleHQ7DQorICBydFRleHQuU2V0KHgsIHksIG1fZkZvbnRTaXplICogMTAwMC4wZiwgbV9mRm9udFNpemUgKiAxMDAwLjBmKTsNCisgIERyYXdMb2dpY1RleHQocHdzU3RyLCBpTGVuZ3RoLCBydFRleHQpOw0KK30NCit2b2lkIENGREVfVGV4dE91dDo6RHJhd0xvZ2ljVGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QpIHsNCisgIENGWF9SZWN0RiBydENsaXA7DQorICBydENsaXAuU2V0KG1fcnRMb2dpY0NsaXAubGVmdCwgbV9ydExvZ2ljQ2xpcC50b3AsIG1fcnRMb2dpY0NsaXAud2lkdGgsDQorICAgICAgICAgICAgIG1fcnRMb2dpY0NsaXAuaGVpZ2h0KTsNCisgIG1fTWF0cml4LlRyYW5zZm9ybVJlY3QocnRDbGlwKTsNCisgIERyYXdUZXh0KHB3c1N0ciwgaUxlbmd0aCwgcmVjdCwgcnRDbGlwKTsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OkRyYXdUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0Q2xpcCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcEZvbnQgIT0gTlVMTCAmJiBtX2ZGb250U2l6ZSA+PSAxLjBmKTsNCisgIGlmIChwd3NTdHIgPT0gTlVMTCB8fCBpTGVuZ3RoIDwgMSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAocmVjdC53aWR0aCA8IG1fZkZvbnRTaXplIHx8IHJlY3QuaGVpZ2h0IDwgbV9mRm9udFNpemUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZkxpbmVXaWR0aCA9IHJlY3Qud2lkdGg7DQorICBpZiAobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9WZXJ0aWNhbExheW91dCkgew0KKyAgICBmTGluZVdpZHRoID0gcmVjdC5oZWlnaHQ7DQorICB9DQorICBtX3BUeHRCcmVhay0+U2V0TGluZVdpZHRoKGZMaW5lV2lkdGgpOw0KKyAgbV90dG9MaW5lcy5SZW1vdmVBbGwoVFJVRSk7DQorICBtX3dzVGV4dC5FbXB0eSgpOw0KKyAgTG9hZFRleHQocHdzU3RyLCBpTGVuZ3RoLCByZWN0KTsNCisgIGlmIChtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX0VsbGlwc2lzKSB7DQorICAgIFJlcGxhY2VXaWR0aEVsbGlwc2lzKCk7DQorICB9DQorICBSZWxvYWQocmVjdCk7DQorICBEb0FsaWdubWVudChyZWN0KTsNCisgIE9uRHJhdyhydENsaXApOw0KK30NCit2b2lkIENGREVfVGV4dE91dDo6RXhwYW5kQnVmZmVyKGludDMyX3QgaVNpemUsIGludDMyX3QgaVR5cGUpIHsNCisgIHN3aXRjaCAoaVR5cGUpIHsNCisgICAgY2FzZSAwOg0KKyAgICAgIGlmICghbV9wQ2hhcldpZHRocykgew0KKyAgICAgICAgbV9wQ2hhcldpZHRocyA9IEZYX0FsbG9jKGludDMyX3QsIGlTaXplKTsNCisgICAgICAgIG1faUNoYXJzID0gaVNpemU7DQorICAgICAgfSBlbHNlIGlmIChtX2lDaGFycyA8IGlTaXplKSB7DQorICAgICAgICBtX3BDaGFyV2lkdGhzID0gRlhfUmVhbGxvYyhpbnQzMl90LCBtX3BDaGFyV2lkdGhzLCBpU2l6ZSk7DQorICAgICAgICBtX2lDaGFycyA9IGlTaXplOw0KKyAgICAgIH0NCisgICAgICBGWFNZU19tZW1zZXQobV9wQ2hhcldpZHRocywgMCwgaVNpemUgKiBzaXplb2YoaW50MzJfdCkpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDE6DQorICAgICAgaWYgKCFtX3BFbGxDaGFyV2lkdGhzKSB7DQorICAgICAgICBtX3BFbGxDaGFyV2lkdGhzID0gRlhfQWxsb2MoaW50MzJfdCwgaVNpemUpOw0KKyAgICAgICAgbV9pRWxsQ2hhcnMgPSBpU2l6ZTsNCisgICAgICB9IGVsc2UgaWYgKG1faUVsbENoYXJzIDwgaVNpemUpIHsNCisgICAgICAgIG1fcEVsbENoYXJXaWR0aHMgPSBGWF9SZWFsbG9jKGludDMyX3QsIG1fcEVsbENoYXJXaWR0aHMsIGlTaXplKTsNCisgICAgICAgIG1faUVsbENoYXJzID0gaVNpemU7DQorICAgICAgfQ0KKyAgICAgIEZYU1lTX21lbXNldChtX3BFbGxDaGFyV2lkdGhzLCAwLCBpU2l6ZSAqIHNpemVvZihpbnQzMl90KSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMjoNCisgICAgICBpZiAobV9wQ2hhclBvcyA9PSBOVUxMKSB7DQorICAgICAgICBtX3BDaGFyUG9zID0gRlhfQWxsb2MoRlhURVhUX0NIQVJQT1MsIGlTaXplKTsNCisgICAgICAgIG1faUNoYXJQb3NTaXplID0gaVNpemU7DQorICAgICAgfSBlbHNlIGlmIChtX2lDaGFyUG9zU2l6ZSA8IGlTaXplKSB7DQorICAgICAgICBtX3BDaGFyUG9zID0gRlhfUmVhbGxvYyhGWFRFWFRfQ0hBUlBPUywgbV9wQ2hhclBvcywgaVNpemUpOw0KKyAgICAgICAgbV9pQ2hhclBvc1NpemUgPSBpU2l6ZTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpMb2FkRWxsaXBzaXMoKSB7DQorICBpZiAoIW1fYkVsbGlDaGFuZ2VkKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIG1fYkVsbGlDaGFuZ2VkID0gRkFMU0U7DQorICBtX2lFbGxpcHNpc1dpZHRoID0gMDsNCisgIGludDMyX3QgaUxlbmd0aCA9IG1fd3NFbGxpcHNpcy5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoIDwgMSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBFeHBhbmRCdWZmZXIoaUxlbmd0aCwgMSk7DQorICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9IChjb25zdCBGWF9XQ0hBUiopbV93c0VsbGlwc2lzOw0KKyAgaW50MzJfdCogcENoYXJXaWR0aHMgPSBtX3BFbGxDaGFyV2lkdGhzOw0KKyAgRlhfRFdPUkQgZHdCcmVha1N0YXR1czsNCisgIEZYX1dDSEFSIHdjaDsNCisgIHdoaWxlIChpTGVuZ3RoLS0gPiAwKSB7DQorICAgIHdjaCA9ICpwU3RyKys7DQorICAgIGR3QnJlYWtTdGF0dXMgPSBtX3BUeHRCcmVhay0+QXBwZW5kQ2hhcih3Y2gpOw0KKyAgICBpZiAoZHdCcmVha1N0YXR1cyA+IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspIHsNCisgICAgICBSZXRyaWV2ZUVsbFBpZWNlcyhwQ2hhcldpZHRocyk7DQorICAgIH0NCisgIH0NCisgIGR3QnJlYWtTdGF0dXMgPSBtX3BUeHRCcmVhay0+RW5kQnJlYWsoRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspOw0KKyAgaWYgKGR3QnJlYWtTdGF0dXMgPiBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSB7DQorICAgIFJldHJpZXZlRWxsUGllY2VzKHBDaGFyV2lkdGhzKTsNCisgIH0NCisgIG1fcFR4dEJyZWFrLT5SZXNldCgpOw0KK30NCit2b2lkIENGREVfVGV4dE91dDo6UmV0cmlldmVFbGxQaWVjZXMoaW50MzJfdComIHBDaGFyV2lkdGhzKSB7DQorICBpbnQzMl90IGlDb3VudCA9IG1fcFR4dEJyZWFrLT5Db3VudEJyZWFrUGllY2VzKCk7DQorICBDRlhfQ2hhciogcFRDOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgY29uc3QgQ0ZYX1R4dFBpZWNlKiBwUGllY2UgPSBtX3BUeHRCcmVhay0+R2V0QnJlYWtQaWVjZShpKTsNCisgICAgaW50MzJfdCBpUGllY2VDaGFycyA9IHBQaWVjZS0+R2V0TGVuZ3RoKCk7DQorICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlQaWVjZUNoYXJzOyBqKyspIHsNCisgICAgICBwVEMgPSBwUGllY2UtPkdldENoYXJQdHIoaik7DQorICAgICAgaWYgKHBUQy0+bV9pQ2hhcldpZHRoIDw9IDApIHsNCisgICAgICAgICpwQ2hhcldpZHRocyA9IDA7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgICpwQ2hhcldpZHRocyA9IHBUQy0+bV9pQ2hhcldpZHRoOw0KKyAgICAgIH0NCisgICAgICBtX2lFbGxpcHNpc1dpZHRoICs9ICpwQ2hhcldpZHRoczsNCisgICAgICBwQ2hhcldpZHRocysrOw0KKyAgICB9DQorICB9DQorICBtX3BUeHRCcmVhay0+Q2xlYXJCcmVha1BpZWNlcygpOw0KK30NCit2b2lkIENGREVfVGV4dE91dDo6TG9hZFRleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QpIHsNCisgIEZYX1dDSEFSKiBwU3RyID0gbV93c1RleHQuR2V0QnVmZmVyKGlMZW5ndGgpOw0KKyAgaW50MzJfdCBpVHh0TGVuZ3RoID0gaUxlbmd0aDsNCisgIEV4cGFuZEJ1ZmZlcihpVHh0TGVuZ3RoLCAwKTsNCisgIEZYX0JPT0wgYkhvdEtleSA9ICEhKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfSG90S2V5KTsNCisgIEZYX0JPT0wgYlZlcnRpY2FsID0gISEobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9WZXJ0aWNhbExheW91dCk7DQorICBGWF9CT09MIGJMaW5lV3JhcCA9ICEhKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfTGluZVdyYXApOw0KKyAgRlhfRkxPQVQgZkxpbmVTdGVwID0NCisgICAgICAobV9mTGluZVNwYWNlID4gbV9mRm9udFNpemUpID8gbV9mTGluZVNwYWNlIDogbV9mRm9udFNpemU7DQorICBGWF9GTE9BVCBmTGluZVN0b3AgPSBiVmVydGljYWwgPyByZWN0LmxlZnQgOiByZWN0LmJvdHRvbSgpOw0KKyAgbV9mTGluZVBvcyA9IGJWZXJ0aWNhbCA/IHJlY3QucmlnaHQoKSA6IHJlY3QudG9wOw0KKyAgaWYgKGJWZXJ0aWNhbCkgew0KKyAgICBmTGluZVN0ZXAgPSAtZkxpbmVTdGVwOw0KKyAgfQ0KKyAgbV9ob3RLZXlzLlJlbW92ZUFsbCgpOw0KKyAgaW50MzJfdCBpU3RhcnRDaGFyID0gMDsNCisgIGludDMyX3QgaUNoYXJzID0gMDsNCisgIGludDMyX3QgaVBpZWNlV2lkdGhzID0gMDsNCisgIEZYX0RXT1JEIGR3QnJlYWtTdGF0dXM7DQorICBGWF9XQ0hBUiB3Y2g7DQorICBGWF9CT09MIGJSZXQgPSBGQUxTRTsNCisgIHdoaWxlIChpVHh0TGVuZ3RoLS0gPiAwKSB7DQorICAgIHdjaCA9ICpwd3NTdHIrKzsNCisgICAgaWYgKHdjaCA9PSBMJyYnICYmIGJIb3RLZXkgJiYgKHBTdHIgLSAxKSAhPSBOVUxMICYmICoocFN0ciAtIDEpICE9IEwnJicpIHsNCisgICAgICBpZiAoaVR4dExlbmd0aCA+IDApIHsNCisgICAgICAgIG1faG90S2V5cy5BZGQoaUNoYXJzKTsNCisgICAgICB9DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgKnBTdHIrKyA9IHdjaDsNCisgICAgaUNoYXJzKys7DQorICAgIGR3QnJlYWtTdGF0dXMgPSBtX3BUeHRCcmVhay0+QXBwZW5kQ2hhcih3Y2gpOw0KKyAgICBpZiAoZHdCcmVha1N0YXR1cyA+IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspIHsNCisgICAgICBGWF9CT09MIGJFbmRvZkxpbmUgPQ0KKyAgICAgICAgICBSZXRyaWVjZVBpZWNlcyhkd0JyZWFrU3RhdHVzLCBpU3RhcnRDaGFyLCBpUGllY2VXaWR0aHMsIEZBTFNFLCByZWN0KTsNCisgICAgICBpZiAoYkVuZG9mTGluZSAmJiAoYkxpbmVXcmFwIHx8IChkd0JyZWFrU3RhdHVzID4gRlhfVFhUQlJFQUtfTGluZUJyZWFrICYmDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWJMaW5lV3JhcCkpKSB7DQorICAgICAgICBpUGllY2VXaWR0aHMgPSAwOw0KKyAgICAgICAgbV9pQ3VyTGluZSsrOw0KKyAgICAgICAgbV9mTGluZVBvcyArPSBmTGluZVN0ZXA7DQorICAgICAgfQ0KKyAgICAgIGlmICgoYlZlcnRpY2FsICYmIG1fZkxpbmVQb3MgKyBmTGluZVN0ZXAgPCBmTGluZVN0b3ApIHx8DQorICAgICAgICAgICghYlZlcnRpY2FsICYmIG1fZkxpbmVQb3MgKyBmTGluZVN0ZXAgPiBmTGluZVN0b3ApKSB7DQorICAgICAgICBpbnQzMl90IGlDdXJMaW5lID0gbV9pQ3VyTGluZTsNCisgICAgICAgIGlmIChiRW5kb2ZMaW5lKSB7DQorICAgICAgICAgIGlDdXJMaW5lLS07DQorICAgICAgICB9DQorICAgICAgICBDRkRFX1RUT0xpbmUqIHBMaW5lID0gbV90dG9MaW5lcy5HZXRQdHJBdChpQ3VyTGluZSk7DQorICAgICAgICBwTGluZS0+bV9iTmV3UmVsb2FkID0gVFJVRTsNCisgICAgICAgIGJSZXQgPSBUUlVFOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBkd0JyZWFrU3RhdHVzID0gbV9wVHh0QnJlYWstPkVuZEJyZWFrKEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKTsNCisgIGlmIChkd0JyZWFrU3RhdHVzID4gRlhfVFhUQlJFQUtfUGllY2VCcmVhayAmJiAhYlJldCkgew0KKyAgICBSZXRyaWVjZVBpZWNlcyhkd0JyZWFrU3RhdHVzLCBpU3RhcnRDaGFyLCBpUGllY2VXaWR0aHMsIEZBTFNFLCByZWN0KTsNCisgIH0NCisgIG1fcFR4dEJyZWFrLT5DbGVhckJyZWFrUGllY2VzKCk7DQorICBtX3BUeHRCcmVhay0+UmVzZXQoKTsNCisgIG1fd3NUZXh0LlJlbGVhc2VCdWZmZXIoaUxlbmd0aCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UZXh0T3V0OjpSZXRyaWVjZVBpZWNlcyhGWF9EV09SRCBkd0JyZWFrU3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpU3RhcnRDaGFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpUGllY2VXaWR0aHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlbG9hZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBGWF9CT09MIGJTaW5nbGVMaW5lID0gISEobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lKTsNCisgIEZYX0JPT0wgYkxpbmVXcmFwID0gISEobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9MaW5lV3JhcCk7DQorICBGWF9CT09MIGJWZXJ0aWNhbCA9ICEhKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfVmVydGljYWxMYXlvdXQpOw0KKyAgRlhfRkxPQVQgZkxpbmVTdGVwID0NCisgICAgICAobV9mTGluZVNwYWNlID4gbV9mRm9udFNpemUpID8gbV9mTGluZVNwYWNlIDogbV9mRm9udFNpemU7DQorICBpZiAoYlZlcnRpY2FsKSB7DQorICAgIGZMaW5lU3RlcCA9IC1mTGluZVN0ZXA7DQorICB9DQorICBDRlhfQ2hhciogcFRDID0gTlVMTDsNCisgIEZYX0JPT0wgYk5lZWRSZWxvYWQgPSBGQUxTRTsNCisgIEZYX0ZMT0FUIGZMaW5lV2lkdGggPSBiVmVydGljYWwgPyByZWN0LkhlaWdodCgpIDogcmVjdC5XaWR0aCgpOw0KKyAgaW50MzJfdCBpTGluZVdpZHRoID0gRlhTWVNfcm91bmQoZkxpbmVXaWR0aCAqIDIwMDAwLjBmKTsNCisgIGludDMyX3QgaUNvdW50ID0gbV9wVHh0QnJlYWstPkNvdW50QnJlYWtQaWVjZXMoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIGNvbnN0IENGWF9UeHRQaWVjZSogcFBpZWNlID0gbV9wVHh0QnJlYWstPkdldEJyZWFrUGllY2UoaSk7DQorICAgIGludDMyX3QgaVBpZWNlQ2hhcnMgPSBwUGllY2UtPkdldExlbmd0aCgpOw0KKyAgICBpbnQzMl90IGlDaGFyID0gaVN0YXJ0Q2hhcjsNCisgICAgaW50MzJfdCBpV2lkdGggPSAwOw0KKyAgICBpbnQzMl90IGogPSAwOw0KKyAgICBmb3IgKDsgaiA8IGlQaWVjZUNoYXJzOyBqKyspIHsNCisgICAgICBwVEMgPSBwUGllY2UtPkdldENoYXJQdHIoaik7DQorICAgICAgaW50MzJfdCBpQ3VyQ2hhcldpZHRoID0gcFRDLT5tX2lDaGFyV2lkdGggPiAwID8gcFRDLT5tX2lDaGFyV2lkdGggOiAwOw0KKyAgICAgIGlmIChiU2luZ2xlTGluZSB8fCAhYkxpbmVXcmFwKSB7DQorICAgICAgICBpZiAoaUxpbmVXaWR0aCAtIGlQaWVjZVdpZHRocyAtIGlXaWR0aCA8IGlDdXJDaGFyV2lkdGgpIHsNCisgICAgICAgICAgYk5lZWRSZWxvYWQgPSBUUlVFOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgaVdpZHRoICs9IGlDdXJDaGFyV2lkdGg7DQorICAgICAgbV9wQ2hhcldpZHRoc1tpQ2hhcisrXSA9IGlDdXJDaGFyV2lkdGg7DQorICAgIH0NCisgICAgaWYgKGogPT0gMCAmJiAhYlJlbG9hZCkgew0KKyAgICAgIENGREVfVFRPTGluZSogcExpbmUgPSBtX3R0b0xpbmVzLkdldFB0ckF0KG1faUN1ckxpbmUpOw0KKyAgICAgIHBMaW5lLT5tX2JOZXdSZWxvYWQgPSBUUlVFOw0KKyAgICB9IGVsc2UgaWYgKGogPiAwKSB7DQorICAgICAgQ0ZYX1JlY3RGIHJ0UGllY2U7DQorICAgICAgaWYgKGJWZXJ0aWNhbCkgew0KKyAgICAgICAgcnRQaWVjZS5sZWZ0ID0gbV9mTGluZVBvczsNCisgICAgICAgIHJ0UGllY2UudG9wID0gcmVjdC50b3AgKyAoRlhfRkxPQVQpcFBpZWNlLT5tX2lTdGFydFBvcyAvIDIwMDAwLjBmOw0KKyAgICAgICAgcnRQaWVjZS53aWR0aCA9IGZMaW5lU3RlcDsNCisgICAgICAgIHJ0UGllY2UuaGVpZ2h0ID0gaVdpZHRoIC8gMjAwMDAuMGY7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJ0UGllY2UubGVmdCA9IHJlY3QubGVmdCArIChGWF9GTE9BVClwUGllY2UtPm1faVN0YXJ0UG9zIC8gMjAwMDAuMGY7DQorICAgICAgICBydFBpZWNlLnRvcCA9IG1fZkxpbmVQb3M7DQorICAgICAgICBydFBpZWNlLndpZHRoID0gaVdpZHRoIC8gMjAwMDAuMGY7DQorICAgICAgICBydFBpZWNlLmhlaWdodCA9IGZMaW5lU3RlcDsNCisgICAgICB9DQorICAgICAgRkRFX1RUT1BJRUNFIHR0b1BpZWNlOw0KKyAgICAgIHR0b1BpZWNlLmlTdGFydENoYXIgPSBpU3RhcnRDaGFyOw0KKyAgICAgIHR0b1BpZWNlLmlDaGFycyA9IGo7DQorICAgICAgdHRvUGllY2UucnRQaWVjZSA9IHJ0UGllY2U7DQorICAgICAgdHRvUGllY2UuZHdDaGFyU3R5bGVzID0gcFBpZWNlLT5tX2R3Q2hhclN0eWxlczsNCisgICAgICBpZiAoRlhfSXNPZGQocFBpZWNlLT5tX2lCaWRpTGV2ZWwpKSB7DQorICAgICAgICB0dG9QaWVjZS5kd0NoYXJTdHlsZXMgfD0gRlhfVFhUQ0hBUlNUWUxFX09kZEJpZGlMZXZlbDsNCisgICAgICB9DQorICAgICAgQXBwZW5kUGllY2UodHRvUGllY2UsIGJOZWVkUmVsb2FkLCAoYlJlbG9hZCAmJiBpID09IGlDb3VudCAtIDEpKTsNCisgICAgfQ0KKyAgICBpU3RhcnRDaGFyICs9IGlQaWVjZUNoYXJzOw0KKyAgICBpUGllY2VXaWR0aHMgKz0gaVdpZHRoOw0KKyAgfQ0KKyAgbV9wVHh0QnJlYWstPkNsZWFyQnJlYWtQaWVjZXMoKTsNCisgIEZYX0JPT0wgYlJldCA9IGJTaW5nbGVMaW5lIHx8IGJMaW5lV3JhcCB8fCAoIWJMaW5lV3JhcCAmJiBiTmVlZFJlbG9hZCkgfHwNCisgICAgICAgICAgICAgICAgIGR3QnJlYWtTdGF0dXMgPT0gRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWs7DQorICByZXR1cm4gYlJldDsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OkFwcGVuZFBpZWNlKGNvbnN0IEZERV9UVE9QSUVDRSYgdHRvUGllY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5lZWRSZWxvYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkVuZCkgew0KKyAgaWYgKG1faUN1ckxpbmUgPj0gbV90dG9MaW5lcy5HZXRTaXplKCkpIHsNCisgICAgQ0ZERV9UVE9MaW5lIHR0b0xpbmU7DQorICAgIHR0b0xpbmUubV9iTmV3UmVsb2FkID0gYk5lZWRSZWxvYWQ7DQorICAgIG1faUN1clBpZWNlID0gdHRvTGluZS5BZGRQaWVjZShtX2lDdXJQaWVjZSwgdHRvUGllY2UpOw0KKyAgICBtX2lDdXJMaW5lID0gbV90dG9MaW5lcy5BZGQodHRvTGluZSk7DQorICB9IGVsc2Ugew0KKyAgICBDRkRFX1RUT0xpbmUqIHBMaW5lID0gbV90dG9MaW5lcy5HZXRQdHJBdChtX2lDdXJMaW5lKTsNCisgICAgcExpbmUtPm1fYk5ld1JlbG9hZCA9IGJOZWVkUmVsb2FkOw0KKyAgICBtX2lDdXJQaWVjZSA9IHBMaW5lLT5BZGRQaWVjZShtX2lDdXJQaWVjZSwgdHRvUGllY2UpOw0KKyAgICBpZiAoYkVuZCkgew0KKyAgICAgIGludDMyX3QgaVBpZWNlcyA9IHBMaW5lLT5HZXRTaXplKCk7DQorICAgICAgaWYgKG1faUN1clBpZWNlIDwgaVBpZWNlcykgew0KKyAgICAgICAgcExpbmUtPlJlbW92ZUxhc3QoaVBpZWNlcyAtIG1faUN1clBpZWNlIC0gMSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAoIWJFbmQgJiYgYk5lZWRSZWxvYWQpIHsNCisgICAgbV9pQ3VyUGllY2UgPSAwOw0KKyAgfQ0KK30NCit2b2lkIENGREVfVGV4dE91dDo6UmVwbGFjZVdpZHRoRWxsaXBzaXMoKSB7DQorICBMb2FkRWxsaXBzaXMoKTsNCisgIGludDMyX3QgaUxlbmd0aCA9IG1fd3NFbGxpcHNpcy5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoIDwgMSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlMaW5lcyA9IG1fdHRvTGluZXMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUxpbmVzOyBpKyspIHsNCisgICAgQ0ZERV9UVE9MaW5lKiBwTGluZSA9IG1fdHRvTGluZXMuR2V0UHRyQXQoaSk7DQorICAgIGlmICghcExpbmUtPm1fYk5ld1JlbG9hZCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGludDMyX3QgaUVsbGlwc2lzQ2hhckluZGV4ID0gaUxlbmd0aCAtIDE7DQorICAgIGludDMyX3QgaUNoYXJXaWR0aCA9IDA7DQorICAgIGludDMyX3QgaUNoYXJDb3VudCA9IDA7DQorICAgIGludDMyX3QgaVBpZWNlID0gcExpbmUtPkdldFNpemUoKTsNCisgICAgd2hpbGUgKGlQaWVjZS0tID4gMCkgew0KKyAgICAgIEZERV9MUFRUT1BJRUNFIHBQaWVjZSA9IHBMaW5lLT5HZXRQdHJBdChpUGllY2UpOw0KKyAgICAgIGlmIChwUGllY2UgPT0gTlVMTCkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGZvciAoaW50MzJfdCBqID0gcFBpZWNlLT5pQ2hhcnMgLSAxOyBqID49IDA7IGotLSkgew0KKyAgICAgICAgaWYgKGlFbGxpcHNpc0NoYXJJbmRleCA8IDApIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBpbnQzMl90IGluZGV4ID0gcFBpZWNlLT5pU3RhcnRDaGFyICsgajsNCisgICAgICAgIGlDaGFyV2lkdGggKz0gbV9wQ2hhcldpZHRoc1tpbmRleF07DQorICAgICAgICBpQ2hhckNvdW50Kys7DQorICAgICAgICBpZiAoaUNoYXJDb3VudCA8PSBpTGVuZ3RoKSB7DQorICAgICAgICAgIG1fd3NUZXh0LlNldEF0KGluZGV4LCBtX3dzRWxsaXBzaXMuR2V0QXQoaUVsbGlwc2lzQ2hhckluZGV4KSk7DQorICAgICAgICAgIG1fcENoYXJXaWR0aHNbaW5kZXhdID0gbV9wRWxsQ2hhcldpZHRoc1tpRWxsaXBzaXNDaGFySW5kZXhdOw0KKyAgICAgICAgfSBlbHNlIGlmIChpQ2hhcldpZHRoIDw9IG1faUVsbGlwc2lzV2lkdGgpIHsNCisgICAgICAgICAgbV93c1RleHQuU2V0QXQoaW5kZXgsIDApOw0KKyAgICAgICAgICBtX3BDaGFyV2lkdGhzW2luZGV4XSA9IDA7DQorICAgICAgICB9DQorICAgICAgICBpRWxsaXBzaXNDaGFySW5kZXgtLTsNCisgICAgICB9DQorICAgICAgaWYgKGlFbGxpcHNpc0NoYXJJbmRleCA8IDApIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENGREVfVGV4dE91dDo6UmVsb2FkKGNvbnN0IENGWF9SZWN0RiYgcmVjdCkgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX3R0b0xpbmVzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIENGREVfVFRPTGluZSogcExpbmUgPSBtX3R0b0xpbmVzLkdldFB0ckF0KGkpOw0KKyAgICBpZiAocExpbmUgPT0gTlVMTCB8fCAhcExpbmUtPm1fYk5ld1JlbG9hZCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIG1faUN1ckxpbmUgPSBpOw0KKyAgICBtX2lDdXJQaWVjZSA9IDA7DQorICAgIFJlbG9hZExpbmVQaWVjZShwTGluZSwgcmVjdCk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpSZWxvYWRMaW5lUGllY2UoQ0ZERV9UVE9MaW5lKiBwTGluZSwgY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBjb25zdCBGWF9XQ0hBUiogcHdzU3RyID0gKGNvbnN0IEZYX1dDSEFSKiltX3dzVGV4dDsNCisgIEZYX0JPT0wgYlZlcnRpY2FsID0gISEobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9WZXJ0aWNhbExheW91dCk7DQorICBpbnQzMl90IGlQaWVjZVdpZHRocyA9IDA7DQorICBGREVfTFBUVE9QSUVDRSBwUGllY2UgPSBwTGluZS0+R2V0UHRyQXQoMCk7DQorICBpbnQzMl90IGlTdGFydENoYXIgPSBwUGllY2UtPmlTdGFydENoYXI7DQorICBtX2ZMaW5lUG9zID0gYlZlcnRpY2FsID8gcFBpZWNlLT5ydFBpZWNlLmxlZnQgOiBwUGllY2UtPnJ0UGllY2UudG9wOw0KKyAgaW50MzJfdCBpUGllY2VDb3VudCA9IHBMaW5lLT5HZXRTaXplKCk7DQorICBpbnQzMl90IGlQaWVjZUluZGV4ID0gMDsNCisgIEZYX0RXT1JEIGR3QnJlYWtTdGF0dXMgPSAwOw0KKyAgRlhfV0NIQVIgd2NoOw0KKyAgd2hpbGUgKGlQaWVjZUluZGV4IDwgaVBpZWNlQ291bnQpIHsNCisgICAgaW50MzJfdCBpU3RhciA9IGlTdGFydENoYXI7DQorICAgIGludDMyX3QgaUVuZCA9IHBQaWVjZS0+aUNoYXJzICsgaVN0YXI7DQorICAgIHdoaWxlIChpU3RhciA8IGlFbmQpIHsNCisgICAgICB3Y2ggPSAqKHB3c1N0ciArIGlTdGFyKTsNCisgICAgICBkd0JyZWFrU3RhdHVzID0gbV9wVHh0QnJlYWstPkFwcGVuZENoYXIod2NoKTsNCisgICAgICBpZiAoZHdCcmVha1N0YXR1cyA+IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspIHsNCisgICAgICAgIFJldHJpZWNlUGllY2VzKGR3QnJlYWtTdGF0dXMsIGlTdGFydENoYXIsIGlQaWVjZVdpZHRocywgVFJVRSwgcmVjdCk7DQorICAgICAgfQ0KKyAgICAgIGlTdGFyKys7DQorICAgIH0NCisgICAgaVBpZWNlSW5kZXgrKzsNCisgICAgcFBpZWNlID0gcExpbmUtPkdldFB0ckF0KGlQaWVjZUluZGV4KTsNCisgIH0NCisgIGR3QnJlYWtTdGF0dXMgPSBtX3BUeHRCcmVhay0+RW5kQnJlYWsoRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspOw0KKyAgaWYgKGR3QnJlYWtTdGF0dXMgPiBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSB7DQorICAgIFJldHJpZWNlUGllY2VzKGR3QnJlYWtTdGF0dXMsIGlTdGFydENoYXIsIGlQaWVjZVdpZHRocywgVFJVRSwgcmVjdCk7DQorICB9DQorICBtX3BUeHRCcmVhay0+UmVzZXQoKTsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OkRvQWxpZ25tZW50KGNvbnN0IENGWF9SZWN0RiYgcmVjdCkgew0KKyAgRlhfQk9PTCBiVmVydGljYWwgPSAhIShtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX1ZlcnRpY2FsTGF5b3V0KTsNCisgIEZYX0ZMT0FUIGZMaW5lU3RvcFMgPSBiVmVydGljYWwgPyByZWN0LnJpZ2h0KCkgOiByZWN0LmJvdHRvbSgpOw0KKyAgaW50MzJfdCBpTGluZXMgPSBtX3R0b0xpbmVzLkdldFNpemUoKTsNCisgIGlmIChpTGluZXMgPCAxKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGREVfVFRPTGluZSogcExpbmUgPSBtX3R0b0xpbmVzLkdldFB0ckF0KGlMaW5lcyAtIDEpOw0KKyAgRkRFX0xQVFRPUElFQ0UgcFBpZWNlID0gcExpbmUtPkdldFB0ckF0KDApOw0KKyAgaWYgKHBQaWVjZSA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0ZMT0FUIGZMaW5lU3RvcEQgPQ0KKyAgICAgIGJWZXJ0aWNhbCA/IHBQaWVjZS0+cnRQaWVjZS5yaWdodCgpIDogcFBpZWNlLT5ydFBpZWNlLmJvdHRvbSgpOw0KKyAgRlhfRkxPQVQgZkluYyA9IGZMaW5lU3RvcFMgLSBmTGluZVN0b3BEOw0KKyAgaWYgKG1faUFsaWdubWVudCA+PSBGREVfVFRPQUxJR05NRU5UX0NlbnRlckxlZnQgJiYNCisgICAgICBtX2lBbGlnbm1lbnQgPCBGREVfVFRPQUxJR05NRU5UX0JvdHRvbUxlZnQpIHsNCisgICAgZkluYyAvPSAyLjBmOw0KKyAgfSBlbHNlIGlmIChtX2lBbGlnbm1lbnQgPCBGREVfVFRPQUxJR05NRU5UX0NlbnRlckxlZnQpIHsNCisgICAgZkluYyA9IDAuMGY7DQorICB9DQorICBpZiAoZkluYyA8IDEuMGYpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUxpbmVzOyBpKyspIHsNCisgICAgQ0ZERV9UVE9MaW5lKiBwTGluZSA9IG1fdHRvTGluZXMuR2V0UHRyQXQoaSk7DQorICAgIGludDMyX3QgaVBpZWNlcyA9IHBMaW5lLT5HZXRTaXplKCk7DQorICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlQaWVjZXM7IGorKykgew0KKyAgICAgIEZERV9MUFRUT1BJRUNFIHBQaWVjZSA9IHBMaW5lLT5HZXRQdHJBdChqKTsNCisgICAgICBpZiAoYlZlcnRpY2FsKSB7DQorICAgICAgICBwUGllY2UtPnJ0UGllY2UubGVmdCArPSBmSW5jOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBwUGllY2UtPnJ0UGllY2UudG9wICs9IGZJbmM7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9UZXh0T3V0OjpPbkRyYXcoY29uc3QgQ0ZYX1JlY3RGJiBydENsaXApIHsNCisgIGlmIChtX3BSZW5kZXJEZXZpY2UgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlMaW5lcyA9IG1fdHRvTGluZXMuR2V0U2l6ZSgpOw0KKyAgaWYgKGlMaW5lcyA8IDEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSUZERV9Tb2xpZEJydXNoKiBwQnJ1c2ggPQ0KKyAgICAgIChJRkRFX1NvbGlkQnJ1c2gqKUlGREVfQnJ1c2g6OkNyZWF0ZShGREVfQlJVU0hUWVBFX1NvbGlkKTsNCisgIHBCcnVzaC0+U2V0Q29sb3IobV9UeHRDb2xvcik7DQorICBJRkRFX1BlbiogcFBlbiA9IE5VTEw7DQorICBGREVfSERFVklDRVNUQVRFIGhEZXYgPSBtX3BSZW5kZXJEZXZpY2UtPlNhdmVTdGF0ZSgpOw0KKyAgaWYgKHJ0Q2xpcC5XaWR0aCgpID4gMC4wZiAmJiBydENsaXAuSGVpZ2h0KCkgPiAwLjBmKSB7DQorICAgIG1fcFJlbmRlckRldmljZS0+U2V0Q2xpcFJlY3QocnRDbGlwKTsNCisgIH0NCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMaW5lczsgaSsrKSB7DQorICAgIENGREVfVFRPTGluZSogcExpbmUgPSBtX3R0b0xpbmVzLkdldFB0ckF0KGkpOw0KKyAgICBpbnQzMl90IGlQaWVjZXMgPSBwTGluZS0+R2V0U2l6ZSgpOw0KKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpUGllY2VzOyBqKyspIHsNCisgICAgICBGREVfTFBUVE9QSUVDRSBwUGllY2UgPSBwTGluZS0+R2V0UHRyQXQoaik7DQorICAgICAgaWYgKHBQaWVjZSA9PSBOVUxMKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgaW50MzJfdCBpQ291bnQgPSBHZXREaXNwbGF5UG9zKHBQaWVjZSk7DQorICAgICAgaWYgKGlDb3VudCA+IDApIHsNCisgICAgICAgIG1fcFJlbmRlckRldmljZS0+RHJhd1N0cmluZyhwQnJ1c2gsIG1fcEZvbnQsIG1fcENoYXJQb3MsIGlDb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZGb250U2l6ZSwgJm1fTWF0cml4KTsNCisgICAgICB9DQorICAgICAgRHJhd0xpbmUocFBpZWNlLCBwUGVuKTsNCisgICAgfQ0KKyAgfQ0KKyAgbV9wUmVuZGVyRGV2aWNlLT5SZXN0b3JlU3RhdGUoaERldik7DQorICBpZiAocEJydXNoKSB7DQorICAgIHBCcnVzaC0+UmVsZWFzZSgpOw0KKyAgfQ0KKyAgaWYgKHBQZW4pIHsNCisgICAgcFBlbi0+UmVsZWFzZSgpOw0KKyAgfQ0KK30NCitpbnQzMl90IENGREVfVGV4dE91dDo6R2V0RGlzcGxheVBvcyhGREVfTFBUVE9QSUVDRSBwUGllY2UpIHsNCisgIEZYX1RYVFJVTiB0cjsNCisgIFRvVGV4dFJ1bihwUGllY2UsIHRyKTsNCisgIEV4cGFuZEJ1ZmZlcih0ci5pTGVuZ3RoLCAyKTsNCisgIHJldHVybiBtX3BUeHRCcmVhay0+R2V0RGlzcGxheVBvcygmdHIsIG1fcENoYXJQb3MpOw0KK30NCitpbnQzMl90IENGREVfVGV4dE91dDo6R2V0Q2hhclJlY3RzKEZERV9MUFRUT1BJRUNFIHBQaWVjZSkgew0KKyAgRlhfVFhUUlVOIHRyOw0KKyAgVG9UZXh0UnVuKHBQaWVjZSwgdHIpOw0KKyAgbV9yZWN0QXJyYXkuUmVtb3ZlQWxsKCk7DQorICByZXR1cm4gbV9wVHh0QnJlYWstPkdldENoYXJSZWN0cygmdHIsIG1fcmVjdEFycmF5KTsNCit9DQordm9pZCBDRkRFX1RleHRPdXQ6OlRvVGV4dFJ1bihjb25zdCBGREVfTFBUVE9QSUVDRSBwUGllY2UsIEZYX1RYVFJVTiYgdHIpIHsNCisgIHRyLnBBY2Nlc3MgPSBOVUxMOw0KKyAgdHIucElkZW50aXR5ID0gTlVMTDsNCisgIHRyLnBTdHIgPSAoY29uc3QgRlhfV0NIQVIqKW1fd3NUZXh0ICsgcFBpZWNlLT5pU3RhcnRDaGFyOw0KKyAgdHIucFdpZHRocyA9IG1fcENoYXJXaWR0aHMgKyBwUGllY2UtPmlTdGFydENoYXI7DQorICB0ci5pTGVuZ3RoID0gcFBpZWNlLT5pQ2hhcnM7DQorICB0ci5wRm9udCA9IG1fcEZvbnQ7DQorICB0ci5mRm9udFNpemUgPSBtX2ZGb250U2l6ZTsNCisgIHRyLmR3U3R5bGVzID0gbV9kd1R4dEJrU3R5bGVzOw0KKyAgdHIuaUNoYXJSb3RhdGlvbiA9IDA7DQorICB0ci5kd0NoYXJTdHlsZXMgPSBwUGllY2UtPmR3Q2hhclN0eWxlczsNCisgIHRyLndMaW5lQnJlYWtDaGFyID0gbV93UGFyYWdyYXBoQmtDaGFyOw0KKyAgdHIucFJlY3QgPSAmcFBpZWNlLT5ydFBpZWNlOw0KK30NCit2b2lkIENGREVfVGV4dE91dDo6RHJhd0xpbmUoY29uc3QgRkRFX0xQVFRPUElFQ0UgcFBpZWNlLCBJRkRFX1BlbiomIHBQZW4pIHsNCisgIEZYX0JPT0wgYlVuZGVyTGluZSA9ICEhKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfVW5kZXJsaW5lKTsNCisgIEZYX0JPT0wgYlN0cmlrZU91dCA9ICEhKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfU3RyaWtlb3V0KTsNCisgIEZYX0JPT0wgYkhvdEtleSA9ICEhKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfSG90S2V5KTsNCisgIEZYX0JPT0wgYlZlcnRpY2FsID0gISEobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9WZXJ0aWNhbExheW91dCk7DQorICBpZiAoIWJVbmRlckxpbmUgJiYgIWJTdHJpa2VPdXQgJiYgIWJIb3RLZXkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKHBQZW4gPT0gTlVMTCkgew0KKyAgICBwUGVuID0gSUZERV9QZW46OkNyZWF0ZSgpOw0KKyAgICBwUGVuLT5TZXRDb2xvcihtX1R4dENvbG9yKTsNCisgIH0NCisgIElGREVfUGF0aCogcFBhdGggPSBJRkRFX1BhdGg6OkNyZWF0ZSgpOw0KKyAgaW50MzJfdCBpTGluZUNvdW50ID0gMDsNCisgIENGWF9SZWN0RiBydFRleHQgPSBwUGllY2UtPnJ0UGllY2U7DQorICBDRlhfUG9pbnRGIHB0MSwgcHQyOw0KKyAgaWYgKGJVbmRlckxpbmUpIHsNCisgICAgaWYgKGJWZXJ0aWNhbCkgew0KKyAgICAgIHB0MS54ID0gcnRUZXh0LmxlZnQ7DQorICAgICAgcHQxLnkgPSBydFRleHQudG9wOw0KKyAgICAgIHB0Mi54ID0gcnRUZXh0LmxlZnQ7DQorICAgICAgcHQyLnkgPSBydFRleHQuYm90dG9tKCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgcHQxLnggPSBydFRleHQubGVmdDsNCisgICAgICBwdDEueSA9IHJ0VGV4dC5ib3R0b20oKTsNCisgICAgICBwdDIueCA9IHJ0VGV4dC5yaWdodCgpOw0KKyAgICAgIHB0Mi55ID0gcnRUZXh0LmJvdHRvbSgpOw0KKyAgICB9DQorICAgIHBQYXRoLT5BZGRMaW5lKHB0MSwgcHQyKTsNCisgICAgaUxpbmVDb3VudCsrOw0KKyAgfQ0KKyAgaWYgKGJTdHJpa2VPdXQpIHsNCisgICAgaWYgKGJWZXJ0aWNhbCkgew0KKyAgICAgIHB0MS54ID0gcnRUZXh0LmxlZnQgKyBydFRleHQud2lkdGggKiAyLjBmIC8gNS4wZjsNCisgICAgICBwdDEueSA9IHJ0VGV4dC50b3A7DQorICAgICAgOw0KKyAgICAgIHB0Mi54ID0gcHQxLng7DQorICAgICAgcHQyLnkgPSBydFRleHQuYm90dG9tKCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgcHQxLnggPSBydFRleHQubGVmdDsNCisgICAgICBwdDEueSA9IHJ0VGV4dC5ib3R0b20oKSAtIHJ0VGV4dC5oZWlnaHQgKiAyLjBmIC8gNS4wZjsNCisgICAgICBwdDIueCA9IHJ0VGV4dC5yaWdodCgpOw0KKyAgICAgIHB0Mi55ID0gcHQxLnk7DQorICAgIH0NCisgICAgcFBhdGgtPkFkZExpbmUocHQxLCBwdDIpOw0KKyAgICBpTGluZUNvdW50Kys7DQorICB9DQorICBpZiAoYkhvdEtleSkgew0KKyAgICBpbnQzMl90IGlIb3RLZXlzID0gbV9ob3RLZXlzLkdldFNpemUoKTsNCisgICAgaW50MzJfdCBpQ291bnQgPSBHZXRDaGFyUmVjdHMocFBpZWNlKTsNCisgICAgaWYgKGlDb3VudCA+IDApIHsNCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpSG90S2V5czsgaSsrKSB7DQorICAgICAgICBpbnQzMl90IGlDaGFySW5kZXggPSBtX2hvdEtleXMuR2V0QXQoaSk7DQorICAgICAgICBpZiAoaUNoYXJJbmRleCA+PSBwUGllY2UtPmlTdGFydENoYXIgJiYNCisgICAgICAgICAgICBpQ2hhckluZGV4IDwgcFBpZWNlLT5pU3RhcnRDaGFyICsgcFBpZWNlLT5pQ2hhcnMpIHsNCisgICAgICAgICAgQ0ZYX1JlY3RGIHJlY3QgPSBtX3JlY3RBcnJheS5HZXRBdChpQ2hhckluZGV4IC0gcFBpZWNlLT5pU3RhcnRDaGFyKTsNCisgICAgICAgICAgaWYgKGJWZXJ0aWNhbCkgew0KKyAgICAgICAgICAgIHB0MS54ID0gcmVjdC5sZWZ0Ow0KKyAgICAgICAgICAgIHB0MS55ID0gcmVjdC50b3A7DQorICAgICAgICAgICAgcHQyLnggPSByZWN0LmxlZnQ7DQorICAgICAgICAgICAgcHQyLnkgPSByZWN0LmJvdHRvbSgpOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHB0MS54ID0gcmVjdC5sZWZ0Ow0KKyAgICAgICAgICAgIHB0MS55ID0gcmVjdC5ib3R0b20oKTsNCisgICAgICAgICAgICBwdDIueCA9IHJlY3QucmlnaHQoKTsNCisgICAgICAgICAgICBwdDIueSA9IHJlY3QuYm90dG9tKCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcFBhdGgtPkFkZExpbmUocHQxLCBwdDIpOw0KKyAgICAgICAgICBpTGluZUNvdW50Kys7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAoaUxpbmVDb3VudCA+IDApIHsNCisgICAgbV9wUmVuZGVyRGV2aWNlLT5EcmF3UGF0aChwUGVuLCAxLCBwUGF0aCwgJm1fTWF0cml4KTsNCisgIH0NCisgIHBQYXRoLT5SZWxlYXNlKCk7DQorfQ0KK0NGREVfVFRPTGluZTo6Q0ZERV9UVE9MaW5lKCkNCisgICAgOiBtX2JOZXdSZWxvYWQoRkFMU0UpLCBtX3BpZWNlcyg1KSwgbV9pUGllY2VDb3VudCgwKSB7fQ0KK0NGREVfVFRPTGluZTo6Q0ZERV9UVE9MaW5lKGNvbnN0IENGREVfVFRPTGluZSYgdHRvTGluZSkgOiBtX3BpZWNlcyg1KSB7DQorICBtX2JOZXdSZWxvYWQgPSB0dG9MaW5lLm1fYk5ld1JlbG9hZDsNCisgIG1faVBpZWNlQ291bnQgPSB0dG9MaW5lLm1faVBpZWNlQ291bnQ7DQorICBtX3BpZWNlcy5Db3B5KHR0b0xpbmUubV9waWVjZXMpOw0KK30NCitDRkRFX1RUT0xpbmU6On5DRkRFX1RUT0xpbmUoKSB7fQ0KK2ludDMyX3QgQ0ZERV9UVE9MaW5lOjpBZGRQaWVjZShpbnQzMl90IGluZGV4LCBjb25zdCBGREVfVFRPUElFQ0UmIHR0b1BpZWNlKSB7DQorICBpZiAoaW5kZXggPj0gbV9pUGllY2VDb3VudCkgew0KKyAgICBpbmRleCA9IG1fcGllY2VzLkFkZCh0dG9QaWVjZSkgKyAxOw0KKyAgICBtX2lQaWVjZUNvdW50Kys7DQorICB9IGVsc2Ugew0KKyAgICBGREVfVFRPUElFQ0UmIHBpZWNlID0gbV9waWVjZXMuR2V0QXQoaW5kZXgpOw0KKyAgICBwaWVjZSA9IHR0b1BpZWNlOw0KKyAgfQ0KKyAgcmV0dXJuIGluZGV4Ow0KK30NCitpbnQzMl90IENGREVfVFRPTGluZTo6R2V0U2l6ZSgpIGNvbnN0IHsNCisgIHJldHVybiBtX2lQaWVjZUNvdW50Ow0KK30NCitGREVfTFBUVE9QSUVDRSBDRkRFX1RUT0xpbmU6OkdldFB0ckF0KGludDMyX3QgaW5kZXgpIHsNCisgIGlmIChpbmRleCA+PSBtX2lQaWVjZUNvdW50KSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcGllY2VzLkdldFB0ckF0KGluZGV4KTsNCit9DQordm9pZCBDRkRFX1RUT0xpbmU6OlJlbW92ZUxhc3QoaW50MzJfdCBpQ291bnQpIHsNCisgIG1fcGllY2VzLlJlbW92ZUxhc3QoaUNvdW50KTsNCit9DQordm9pZCBDRkRFX1RUT0xpbmU6OlJlbW92ZUFsbChGWF9CT09MIGJMZWF2ZU1lbW9yeSkgew0KKyAgbV9waWVjZXMuUmVtb3ZlQWxsKGJMZWF2ZU1lbW9yeSk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy90dG8vZmRlX3RleHRvdXQuaCBiL3hmYS9zcmMvZmRwL3NyYy90dG8vZmRlX3RleHRvdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWRkMDViCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZHAvc3JjL3R0by9mZGVfdGV4dG91dC5oCkBAIC0wLDAgKzEsMTY3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZERV9URVhUT1VUX0lNUA0KKyNkZWZpbmUgX0ZERV9URVhUT1VUX0lNUA0KK3N0cnVjdCBGREVfVFRPUElFQ0Ugew0KKyBwdWJsaWM6DQorICBpbnQzMl90IGlTdGFydENoYXI7DQorICBpbnQzMl90IGlDaGFyczsNCisgIEZYX0RXT1JEIGR3Q2hhclN0eWxlczsNCisgIENGWF9SZWN0RiBydFBpZWNlOw0KK307DQordHlwZWRlZiBGREVfVFRPUElFQ0UqIEZERV9MUFRUT1BJRUNFOw0KK3R5cGVkZWYgQ0ZYX01hc3NBcnJheVRlbXBsYXRlPEZERV9UVE9QSUVDRT4gQ0ZERV9UVE9QaWVjZUFycmF5Ow0KK2NsYXNzIENGREVfVFRPTGluZSA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZERV9UVE9MaW5lKCk7DQorICBDRkRFX1RUT0xpbmUoY29uc3QgQ0ZERV9UVE9MaW5lJiB0dG9MaW5lKTsNCisgIH5DRkRFX1RUT0xpbmUoKTsNCisgIGludDMyX3QgQWRkUGllY2UoaW50MzJfdCBpbmRleCwgY29uc3QgRkRFX1RUT1BJRUNFJiB0dG9QaWVjZSk7DQorICBpbnQzMl90IEdldFNpemUoKSBjb25zdDsNCisgIEZERV9MUFRUT1BJRUNFIEdldFB0ckF0KGludDMyX3QgaW5kZXgpOw0KKyAgdm9pZCBSZW1vdmVMYXN0KGludDMyX3QgaUNvdW50KTsNCisgIHZvaWQgUmVtb3ZlQWxsKEZYX0JPT0wgYkxlYXZlTWVtb3J5KTsNCisgIEZYX0JPT0wgbV9iTmV3UmVsb2FkOw0KKyAgQ0ZERV9UVE9QaWVjZUFycmF5IG1fcGllY2VzOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBpbnQzMl90IG1faVBpZWNlQ291bnQ7DQorfTsNCit0eXBlZGVmIENGWF9PYmplY3RNYXNzQXJyYXlUZW1wbGF0ZTxDRkRFX1RUT0xpbmU+IENGREVfVFRPTGluZUFycmF5Ow0KK2NsYXNzIENGREVfVGV4dE91dCA6IHB1YmxpYyBJRkRFX1RleHRPdXQsIHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZERV9UZXh0T3V0KCk7DQorICB+Q0ZERV9UZXh0T3V0KCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgdm9pZCBTZXRGb250KElGWF9Gb250KiBwRm9udCk7DQorICB2aXJ0dWFsIHZvaWQgU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRUZXh0Q29sb3IoRlhfQVJHQiBjb2xvcik7DQorICB2aXJ0dWFsIHZvaWQgU2V0U3R5bGVzKEZYX0RXT1JEIGR3U3R5bGVzKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRUYWJXaWR0aChGWF9GTE9BVCBmVGFiV2lkdGgpOw0KKyAgdmlydHVhbCB2b2lkIFNldEVsbGlwc2lzU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0VsbGlwc2lzKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRQYXJhZ3JhcGhCcmVha0NoYXIoRlhfV0NIQVIgd2NoKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRBbGlnbm1lbnQoaW50MzJfdCBpQWxpZ25tZW50KTsNCisgIHZpcnR1YWwgdm9pZCBTZXRMaW5lU3BhY2UoRlhfRkxPQVQgZkxpbmVTcGFjZSk7DQorICB2aXJ0dWFsIHZvaWQgU2V0RElCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwRElCKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSk7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3QmIHJ0Q2xpcCk7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3RGJiBydENsaXApOw0KKyAgdmlydHVhbCB2b2lkIFNldE1hdHJpeChjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpOw0KKyAgdmlydHVhbCB2b2lkIFNldExpbmVCcmVha1RvbGVyYW5jZShGWF9GTE9BVCBmVG9sZXJhbmNlKTsNCisgIHZpcnR1YWwgdm9pZCBDYWxjU2l6ZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfU2l6ZSYgc2l6ZSk7DQorICB2aXJ0dWFsIHZvaWQgQ2FsY1NpemUoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1NpemVGJiBzaXplKTsNCisgIHZpcnR1YWwgdm9pZCBDYWxjU2l6ZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdCYgcmVjdCk7DQorICB2aXJ0dWFsIHZvaWQgQ2FsY1NpemUoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiByZWN0KTsNCisNCisgIHZpcnR1YWwgdm9pZCBEcmF3VGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHgsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5KTsNCisgIHZpcnR1YWwgdm9pZCBEcmF3VGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkpOw0KKyAgdmlydHVhbCB2b2lkIERyYXdUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0JiByZWN0KTsNCisgIHZpcnR1YWwgdm9pZCBEcmF3VGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QpOw0KKw0KKyAgdmlydHVhbCB2b2lkIFNldExvZ2ljQ2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3RGJiBydENsaXApOw0KKyAgdmlydHVhbCB2b2lkIENhbGNMb2dpY1NpemUoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9TaXplRiYgc2l6ZSk7DQorICB2aXJ0dWFsIHZvaWQgQ2FsY0xvZ2ljU2l6ZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiByZWN0KTsNCisgIHZpcnR1YWwgdm9pZCBEcmF3TG9naWNUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSk7DQorICB2aXJ0dWFsIHZvaWQgRHJhd0xvZ2ljVGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0KTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRUb3RhbExpbmVzKCk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgQ2FsY1RleHRTaXplKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsIGludDMyX3QgaUxlbmd0aCwgQ0ZYX1JlY3RGJiByZWN0KTsNCisgIEZYX0JPT0wgUmV0cmlldmVMaW5lV2lkdGgoRlhfRFdPUkQgZHdCcmVha1N0YXR1cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZTdGFydFBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZIZWlnaHQpOw0KKyAgdm9pZCBTZXRMaW5lV2lkdGgoQ0ZYX1JlY3RGJiByZWN0KTsNCisgIHZvaWQgRHJhd1RleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwNCisgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRDbGlwKTsNCisgIHZvaWQgTG9hZFRleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwgaW50MzJfdCBpTGVuZ3RoLCBjb25zdCBDRlhfUmVjdEYmIHJlY3QpOw0KKyAgdm9pZCBMb2FkRWxsaXBzaXMoKTsNCisgIHZvaWQgRXhwYW5kQnVmZmVyKGludDMyX3QgaVNpemUsIGludDMyX3QgaVR5cGUpOw0KKyAgdm9pZCBSZXRyaWV2ZUVsbFBpZWNlcyhpbnQzMl90KiYgcENoYXJXaWR0aHMpOw0KKw0KKyAgdm9pZCBSZWxvYWQoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KTsNCisgIHZvaWQgUmVsb2FkTGluZVBpZWNlKENGREVfVFRPTGluZSogcExpbmUsIGNvbnN0IENGWF9SZWN0RiYgcmVjdCk7DQorICBGWF9CT09MIFJldHJpZWNlUGllY2VzKEZYX0RXT1JEIGR3QnJlYWtTdGF0dXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlTdGFydENoYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlQaWVjZVdpZHRocywNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVsb2FkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QpOw0KKyAgdm9pZCBBcHBlbmRQaWVjZShjb25zdCBGREVfVFRPUElFQ0UmIHR0b1BpZWNlLA0KKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOZWVkUmVsb2FkLA0KKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJFbmQpOw0KKyAgdm9pZCBSZXBsYWNlV2lkdGhFbGxpcHNpcygpOw0KKyAgdm9pZCBEb0FsaWdubWVudChjb25zdCBDRlhfUmVjdEYmIHJlY3QpOw0KKyAgdm9pZCBPbkRyYXcoY29uc3QgQ0ZYX1JlY3RGJiBydENsaXApOw0KKyAgaW50MzJfdCBHZXREaXNwbGF5UG9zKEZERV9MUFRUT1BJRUNFIHBQaWVjZSk7DQorICBpbnQzMl90IEdldENoYXJSZWN0cyhGREVfTFBUVE9QSUVDRSBwUGllY2UpOw0KKw0KKyAgdm9pZCBUb1RleHRSdW4oY29uc3QgRkRFX0xQVFRPUElFQ0UgcFBpZWNlLCBGWF9UWFRSVU4mIHRyKTsNCisgIHZvaWQgRHJhd0xpbmUoY29uc3QgRkRFX0xQVFRPUElFQ0UgcFBpZWNlLCBJRkRFX1BlbiomIHBQZW4pOw0KKw0KKyAgSUZYX1R4dEJyZWFrKiBtX3BUeHRCcmVhazsNCisgIElGWF9Gb250KiBtX3BGb250Ow0KKyAgRlhfRkxPQVQgbV9mRm9udFNpemU7DQorICBGWF9GTE9BVCBtX2ZMaW5lU3BhY2U7DQorICBGWF9GTE9BVCBtX2ZMaW5lUG9zOw0KKyAgRlhfRkxPQVQgbV9mVG9sZXJhbmNlOw0KKyAgaW50MzJfdCBtX2lBbGlnbm1lbnQ7DQorICBpbnQzMl90IG1faVR4dEJrQWxpZ25tZW50Ow0KKyAgaW50MzJfdCogbV9wQ2hhcldpZHRoczsNCisgIGludDMyX3QgbV9pQ2hhcnM7DQorICBpbnQzMl90KiBtX3BFbGxDaGFyV2lkdGhzOw0KKyAgaW50MzJfdCBtX2lFbGxDaGFyczsNCisgIEZYX1dDSEFSIG1fd1BhcmFncmFwaEJrQ2hhcjsNCisgIEZYX0FSR0IgbV9UeHRDb2xvcjsNCisgIEZYX0RXT1JEIG1fZHdTdHlsZXM7DQorICBGWF9EV09SRCBtX2R3VHh0QmtTdHlsZXM7DQorICBDRlhfV2lkZVN0cmluZyBtX3dzRWxsaXBzaXM7DQorICBGWF9CT09MIG1fYkVsbGlDaGFuZ2VkOw0KKyAgaW50MzJfdCBtX2lFbGxpcHNpc1dpZHRoOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c1RleHQ7DQorICBDRlhfUmVjdEYgbV9ydENsaXA7DQorICBDRlhfUmVjdEYgbV9ydExvZ2ljQ2xpcDsNCisgIENGWF9NYXRyaXggbV9NYXRyaXg7DQorICBDRkRFX1RUT0xpbmVBcnJheSBtX3R0b0xpbmVzOw0KKyAgaW50MzJfdCBtX2lDdXJMaW5lOw0KKyAgaW50MzJfdCBtX2lDdXJQaWVjZTsNCisgIGludDMyX3QgbV9pVG90YWxMaW5lczsNCisgIEZYVEVYVF9DSEFSUE9TKiBtX3BDaGFyUG9zOw0KKyAgaW50MzJfdCBtX2lDaGFyUG9zU2l6ZTsNCisgIElGREVfUmVuZGVyRGV2aWNlKiBtX3BSZW5kZXJEZXZpY2U7DQorICBDRlhfSW50MzJBcnJheSBtX2hvdEtleXM7DQorICBDRlhfUmVjdEZBcnJheSBtX3JlY3RBcnJheTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy94bWwvZmRlX3htbC5jcHAgYi94ZmEvc3JjL2ZkcC9zcmMveG1sL2ZkZV94bWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MjVjYjcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZkcC9zcmMveG1sL2ZkZV94bWwuY3BwCkBAIC0wLDAgKzEsMjYzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSA8YWxnb3JpdGhtPg0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgImZkZV94bWwuaCINCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYNCisjZGVmaW5lIEZERV9YTUxWQUxJRENIQVJSQU5HRU5VTSA1DQorc3RhdGljIEZYX1dDSEFSIGdfWE1MVmFsaWRDaGFyUmFuZ2VbRkRFX1hNTFZBTElEQ0hBUlJBTkdFTlVNXVsyXSA9IHsNCisgICAgezB4MDksIDB4MDl9LA0KKyAgICB7MHgwQSwgMHgwQX0sDQorICAgIHsweDBELCAweDBEfSwNCisgICAgezB4MjAsIDB4RDdGRn0sDQorICAgIHsweEUwMDAsIDB4RkZGRH19Ow0KK0ZYX0JPT0wgRkRFX0lzWE1MVmFsaWRDaGFyKEZYX1dDSEFSIGNoKSB7DQorICBpbnQzMl90IGlTdGFydCA9IDAsIGlFbmQgPSBGREVfWE1MVkFMSURDSEFSUkFOR0VOVU0gLSAxLCBpTWlkOw0KKyAgd2hpbGUgKGlTdGFydCA8PSBpRW5kKSB7DQorICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICBpZiAoY2ggPCBnX1hNTFZhbGlkQ2hhclJhbmdlW2lNaWRdWzBdKSB7DQorICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICB9IGVsc2UgaWYgKGNoID4gZ19YTUxWYWxpZENoYXJSYW5nZVtpTWlkXVsxXSkgew0KKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgRkRFX0lzWE1MV2hpdGVTcGFjZShGWF9XQ0hBUiBjaCkgew0KKyAgcmV0dXJuIGNoID09IEwnICcgfHwgY2ggPT0gMHgwQSB8fCBjaCA9PSAweDBEIHx8IGNoID09IDB4MDk7DQorfQ0KK3R5cGVkZWYgc3RydWN0IF9GREVfWE1MTkFNRUNIQVIgew0KKyAgRlhfV0NIQVIgd1N0YXJ0Ow0KKyAgRlhfV0NIQVIgd0VuZDsNCisgIEZYX0JPT0wgYlN0YXJ0Q2hhcjsNCit9IEZERV9YTUxOQU1FQ0hBUjsNCisjZGVmaW5lIEZERV9YTUxOQU1FQ0hBUlNOVU0gMjANCitzdGF0aWMgRkRFX1hNTE5BTUVDSEFSIGdfWE1MTmFtZUNoYXJzW0ZERV9YTUxOQU1FQ0hBUlNOVU1dID0gew0KKyAgICB7TCctJywgTCcuJywgRkFMU0V9LCAgICB7TCcwJywgTCc5JywgRkFMU0V9LCAgICAge0wnOicsIEwnOicsIEZBTFNFfSwNCisgICAge0wnQScsIEwnWicsIFRSVUV9LCAgICAge0wnXycsIEwnXycsIFRSVUV9LCAgICAgIHtMJ2EnLCBMJ3onLCBUUlVFfSwNCisgICAgezB4QjcsIDB4QjcsIEZBTFNFfSwgICAgezB4QzAsIDB4RDYsIFRSVUV9LCAgICAgIHsweEQ4LCAweEY2LCBUUlVFfSwNCisgICAgezB4RjgsIDB4MDJGRiwgVFJVRX0sICAgezB4MDMwMCwgMHgwMzZGLCBGQUxTRX0sIHsweDAzNzAsIDB4MDM3RCwgVFJVRX0sDQorICAgIHsweDAzN0YsIDB4MUZGRiwgVFJVRX0sIHsweDIwMEMsIDB4MjAwRCwgVFJVRX0sICB7MHgyMDNGLCAweDIwNDAsIEZBTFNFfSwNCisgICAgezB4MjA3MCwgMHgyMThGLCBUUlVFfSwgezB4MkMwMCwgMHgyRkVGLCBUUlVFfSwgIHsweDMwMDEsIDB4RDdGRiwgVFJVRX0sDQorICAgIHsweEY5MDAsIDB4RkRDRiwgVFJVRX0sIHsweEZERjAsIDB4RkZGRCwgVFJVRX0sDQorfTsNCitGWF9CT09MIEZERV9Jc1hNTE5hbWVDaGFyKEZYX1dDSEFSIGNoLCBGWF9CT09MIGJGaXJzdENoYXIpIHsNCisgIGludDMyX3QgaVN0YXJ0ID0gMCwgaUVuZCA9IEZERV9YTUxOQU1FQ0hBUlNOVU0gLSAxLCBpTWlkOw0KKyAgd2hpbGUgKGlTdGFydCA8PSBpRW5kKSB7DQorICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICBpZiAoY2ggPCBnX1hNTE5hbWVDaGFyc1tpTWlkXS53U3RhcnQpIHsNCisgICAgICBpRW5kID0gaU1pZCAtIDE7DQorICAgIH0gZWxzZSBpZiAoY2ggPiBnX1hNTE5hbWVDaGFyc1tpTWlkXS53RW5kKSB7DQorICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKGJGaXJzdENoYXIpIHsNCisgICAgICAgIHJldHVybiBnX1hNTE5hbWVDaGFyc1tpTWlkXS5iU3RhcnRDaGFyOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCisjaWZkZWYgX19jcGx1c3BsdXMNCit9DQorI2VuZGlmDQorQ0ZERV9YTUxOb2RlOjpDRkRFX1hNTE5vZGUoKQ0KKyAgICA6IG1fcFBhcmVudChOVUxMKSwgbV9wQ2hpbGQoTlVMTCksIG1fcFByaW9yKE5VTEwpLCBtX3BOZXh0KE5VTEwpIHt9DQorQ0ZERV9YTUxOb2RlOjp+Q0ZERV9YTUxOb2RlKCkgew0KKyAgRGVsZXRlQ2hpbGRyZW4oKTsNCit9DQordm9pZCBDRkRFX1hNTE5vZGU6OkRlbGV0ZUNoaWxkcmVuKCkgew0KKyAgQ0ZERV9YTUxOb2RlICpwQ2hpbGQgPSBtX3BDaGlsZCwgKnBUZW1wOw0KKyAgd2hpbGUgKHBDaGlsZCAhPSBOVUxMKSB7DQorICAgIHBUZW1wID0gcENoaWxkLT5tX3BOZXh0Ow0KKyAgICBwQ2hpbGQtPlJlbGVhc2UoKTsNCisgICAgcENoaWxkID0gcFRlbXA7DQorICB9DQorICBtX3BDaGlsZCA9IE5VTEw7DQorfQ0KK2ludDMyX3QgQ0ZERV9YTUxOb2RlOjpDb3VudENoaWxkTm9kZXMoKSBjb25zdCB7DQorICBpbnQzMl90IGlDb3VudCA9IDA7DQorICBDRkRFX1hNTE5vZGUqIHBDaGlsZCA9IG1fcENoaWxkOw0KKyAgd2hpbGUgKHBDaGlsZCAhPSBOVUxMKSB7DQorICAgIGlDb3VudCsrOw0KKyAgICBwQ2hpbGQgPSBwQ2hpbGQtPm1fcE5leHQ7DQorICB9DQorICByZXR1cm4gaUNvdW50Ow0KK30NCitDRkRFX1hNTE5vZGUqIENGREVfWE1MTm9kZTo6R2V0Q2hpbGROb2RlKGludDMyX3QgaW5kZXgpIGNvbnN0IHsNCisgIENGREVfWE1MTm9kZSogcENoaWxkID0gbV9wQ2hpbGQ7DQorICB3aGlsZSAocENoaWxkICE9IE5VTEwpIHsNCisgICAgaWYgKGluZGV4ID09IDApIHsNCisgICAgICByZXR1cm4gcENoaWxkOw0KKyAgICB9DQorICAgIGluZGV4LS07DQorICAgIHBDaGlsZCA9IHBDaGlsZC0+bV9wTmV4dDsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitpbnQzMl90IENGREVfWE1MTm9kZTo6R2V0Q2hpbGROb2RlSW5kZXgoQ0ZERV9YTUxOb2RlKiBwTm9kZSkgY29uc3Qgew0KKyAgaW50MzJfdCBpbmRleCA9IDA7DQorICBDRkRFX1hNTE5vZGUqIHBDaGlsZCA9IG1fcENoaWxkOw0KKyAgd2hpbGUgKHBDaGlsZCAhPSBOVUxMKSB7DQorICAgIGlmIChwQ2hpbGQgPT0gcE5vZGUpIHsNCisgICAgICByZXR1cm4gaW5kZXg7DQorICAgIH0NCisgICAgaW5kZXgrKzsNCisgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0Ow0KKyAgfQ0KKyAgcmV0dXJuIC0xOw0KK30NCitDRkRFX1hNTE5vZGUqIENGREVfWE1MTm9kZTo6R2V0UGF0aChjb25zdCBGWF9XQ0hBUiogcFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlF1YWxpZmllZE5hbWUpIGNvbnN0IHsNCisgIEZYU1lTX2Fzc2VydChwUGF0aCAhPSBOVUxMKTsNCisgIGlmIChpTGVuZ3RoIDwgMCkgew0KKyAgICBpTGVuZ3RoID0gRlhTWVNfd2NzbGVuKHBQYXRoKTsNCisgIH0NCisgIGlmIChpTGVuZ3RoID09IDApIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyBjc1BhdGg7DQorICBjb25zdCBGWF9XQ0hBUiogcFN0YXJ0ID0gcFBhdGg7DQorICBjb25zdCBGWF9XQ0hBUiogcEVuZCA9IHBQYXRoICsgaUxlbmd0aDsNCisgIEZYX1dDSEFSIGNoOw0KKyAgd2hpbGUgKHBTdGFydCA8IHBFbmQpIHsNCisgICAgY2ggPSAqcFN0YXJ0Kys7DQorICAgIGlmIChjaCA9PSBMJy8nKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0gZWxzZSB7DQorICAgICAgY3NQYXRoICs9IGNoOw0KKyAgICB9DQorICB9DQorICBpTGVuZ3RoIC09IHBTdGFydCAtIHBQYXRoOw0KKyAgQ0ZERV9YTUxOb2RlKiBwRmluZCA9IE5VTEw7DQorICBpZiAoY3NQYXRoLkdldExlbmd0aCgpIDwgMSkgew0KKyAgICBwRmluZCA9IEdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Um9vdCk7DQorICB9IGVsc2UgaWYgKGNzUGF0aC5Db21wYXJlKEwiLi4iKSA9PSAwKSB7DQorICAgIHBGaW5kID0gbV9wUGFyZW50Ow0KKyAgfSBlbHNlIGlmIChjc1BhdGguQ29tcGFyZShMIi4iKSA9PSAwKSB7DQorICAgIHBGaW5kID0gKENGREVfWE1MTm9kZSopdGhpczsNCisgIH0gZWxzZSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGFnOw0KKyAgICBDRkRFX1hNTE5vZGUqIHBOb2RlID0gbV9wQ2hpbGQ7DQorICAgIHdoaWxlIChwTm9kZSAhPSBOVUxMKSB7DQorICAgICAgaWYgKHBOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgaWYgKGJRdWFsaWZpZWROYW1lKSB7DQorICAgICAgICAgICgoQ0ZERV9YTUxFbGVtZW50KilwTm9kZSktPkdldFRhZ05hbWUod3NUYWcpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgKChDRkRFX1hNTEVsZW1lbnQqKXBOb2RlKS0+R2V0TG9jYWxUYWdOYW1lKHdzVGFnKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICh3c1RhZy5Db21wYXJlKGNzUGF0aCkgPT0gMCkgew0KKyAgICAgICAgICBpZiAoaUxlbmd0aCA8IDEpIHsNCisgICAgICAgICAgICBwRmluZCA9IHBOb2RlOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHBGaW5kID0gcE5vZGUtPkdldFBhdGgocFN0YXJ0LCBpTGVuZ3RoLCBiUXVhbGlmaWVkTmFtZSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKHBGaW5kICE9IE5VTEwpIHsNCisgICAgICAgICAgICByZXR1cm4gcEZpbmQ7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcE5vZGUgPSBwTm9kZS0+bV9wTmV4dDsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHBGaW5kID09IE5VTEwgfHwgaUxlbmd0aCA8IDEpIHsNCisgICAgcmV0dXJuIHBGaW5kOw0KKyAgfQ0KKyAgcmV0dXJuIHBGaW5kLT5HZXRQYXRoKHBTdGFydCwgaUxlbmd0aCwgYlF1YWxpZmllZE5hbWUpOw0KK30NCitpbnQzMl90IENGREVfWE1MTm9kZTo6SW5zZXJ0Q2hpbGROb2RlKENGREVfWE1MTm9kZSogcE5vZGUsIGludDMyX3QgaW5kZXgpIHsNCisgIEZYU1lTX2Fzc2VydChwTm9kZSAhPSBOVUxMKTsNCisgIHBOb2RlLT5tX3BQYXJlbnQgPSB0aGlzOw0KKyAgaWYgKG1fcENoaWxkID09IE5VTEwpIHsNCisgICAgbV9wQ2hpbGQgPSBwTm9kZTsNCisgICAgcE5vZGUtPm1fcFByaW9yID0gTlVMTDsNCisgICAgcE5vZGUtPm1fcE5leHQgPSBOVUxMOw0KKyAgICByZXR1cm4gMDsNCisgIH0gZWxzZSBpZiAoaW5kZXggPT0gMCkgew0KKyAgICBwTm9kZS0+bV9wTmV4dCA9IG1fcENoaWxkOw0KKyAgICBwTm9kZS0+bV9wUHJpb3IgPSBOVUxMOw0KKyAgICBtX3BDaGlsZC0+bV9wUHJpb3IgPSBwTm9kZTsNCisgICAgbV9wQ2hpbGQgPSBwTm9kZTsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpbnQzMl90IGlDb3VudCA9IDA7DQorICBDRkRFX1hNTE5vZGUqIHBGaW5kID0gbV9wQ2hpbGQ7DQorICB3aGlsZSAoKytpQ291bnQgIT0gaW5kZXggJiYgcEZpbmQtPm1fcE5leHQgIT0gTlVMTCkgew0KKyAgICBwRmluZCA9IHBGaW5kLT5tX3BOZXh0Ow0KKyAgfQ0KKyAgcE5vZGUtPm1fcFByaW9yID0gcEZpbmQ7DQorICBwTm9kZS0+bV9wTmV4dCA9IHBGaW5kLT5tX3BOZXh0Ow0KKyAgaWYgKHBGaW5kLT5tX3BOZXh0ICE9IE5VTEwpIHsNCisgICAgcEZpbmQtPm1fcE5leHQtPm1fcFByaW9yID0gcE5vZGU7DQorICB9DQorICBwRmluZC0+bV9wTmV4dCA9IHBOb2RlOw0KKyAgcmV0dXJuIGlDb3VudDsNCit9DQordm9pZCBDRkRFX1hNTE5vZGU6OlJlbW92ZUNoaWxkTm9kZShDRkRFX1hNTE5vZGUqIHBOb2RlKSB7DQorICBGWFNZU19hc3NlcnQobV9wQ2hpbGQgIT0gTlVMTCAmJiBwTm9kZSAhPSBOVUxMKTsNCisgIGlmIChtX3BDaGlsZCA9PSBwTm9kZSkgew0KKyAgICBtX3BDaGlsZCA9IHBOb2RlLT5tX3BOZXh0Ow0KKyAgfSBlbHNlIHsNCisgICAgcE5vZGUtPm1fcFByaW9yLT5tX3BOZXh0ID0gcE5vZGUtPm1fcE5leHQ7DQorICB9DQorICBpZiAocE5vZGUtPm1fcE5leHQgIT0gTlVMTCkgew0KKyAgICBwTm9kZS0+bV9wTmV4dC0+bV9wUHJpb3IgPSBwTm9kZS0+bV9wUHJpb3I7DQorICB9DQorICBwTm9kZS0+bV9wUGFyZW50ID0gTlVMTDsNCisgIHBOb2RlLT5tX3BOZXh0ID0gTlVMTDsNCisgIHBOb2RlLT5tX3BQcmlvciA9IE5VTEw7DQorfQ0KK0NGREVfWE1MTm9kZSogQ0ZERV9YTUxOb2RlOjpHZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5vZGVJdGVtIGVJdGVtKSBjb25zdCB7DQorICBzd2l0Y2ggKGVJdGVtKSB7DQorICAgIGNhc2UgSUZERV9YTUxOb2RlOjpSb290OiB7DQorICAgICAgQ0ZERV9YTUxOb2RlKiBwUGFyZW50ID0gKENGREVfWE1MTm9kZSopdGhpczsNCisgICAgICB3aGlsZSAocFBhcmVudC0+bV9wUGFyZW50ICE9IE5VTEwpIHsNCisgICAgICAgIHBQYXJlbnQgPSBwUGFyZW50LT5tX3BQYXJlbnQ7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBwUGFyZW50Ow0KKyAgICB9DQorICAgIGNhc2UgSUZERV9YTUxOb2RlOjpQYXJlbnQ6DQorICAgICAgcmV0dXJuIG1fcFBhcmVudDsNCisgICAgY2FzZSBJRkRFX1hNTE5vZGU6OkZpcnN0U2libGluZzogew0KKyAgICAgIENGREVfWE1MTm9kZSogcEl0ZW0gPSAoQ0ZERV9YTUxOb2RlKil0aGlzOw0KKyAgICAgIHdoaWxlIChwSXRlbS0+bV9wUHJpb3IgIT0gTlVMTCkgew0KKyAgICAgICAgcEl0ZW0gPSBwSXRlbS0+bV9wUHJpb3I7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBwSXRlbSA9PSAoQ0ZERV9YTUxOb2RlKil0aGlzID8gTlVMTCA6IHBJdGVtOw0KKyAgICB9DQorICAgIGNhc2UgSUZERV9YTUxOb2RlOjpQcmlvclNpYmxpbmc6DQorICAgICAgcmV0dXJuIG1fcFByaW9yOw0KKyAgICBjYXNlIElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmc6DQorICAgICAgcmV0dXJuIG1fcE5leHQ7DQorICAgIGNhc2UgSUZERV9YTUxOb2RlOjpMYXN0U2libGluZzogew0KKyAgICAgIENGREVfWE1MTm9kZSogcEl0ZW0gPSAoQ0ZERV9YTUxOb2RlKil0aGlzOw0KKyAgICAgIHdoaWxlIChwSXRlbS0+bV9wTmV4dCAhPSBOVUxMKSB7DQorICAgICAgICBwSXRlbSA9IHBJdGVtLT5tX3BOZXh0Ow0KKyAgICAgIH0NCisgICAgICByZXR1cm4gcEl0ZW0gPT0gKENGREVfWE1MTm9kZSopdGhpcyA/IE5VTEwgOiBwSXRlbTsNCisgICAgfQ0KKyAgICBjYXNlIElGREVfWE1MTm9kZTo6Rmlyc3ROZWlnaGJvcjogew0KKyAgICAgIENGREVfWE1MTm9kZSogcFBhcmVudCA9IChDRkRFX1hNTE5vZGUqKXRoaXM7DQorICAgICAgd2hpbGUgKHBQYXJlbnQtPm1fcFBhcmVudCAhPSBOVUxMKSB7DQorICAgICAgICBwUGFyZW50ID0gcFBhcmVudC0+bV9wUGFyZW50Ow0KKyAgICAgIH0NCisgICAgICByZXR1cm4gcFBhcmVudCA9PSAoQ0ZERV9YTUxOb2RlKil0aGlzID8gTlVMTCA6IHBQYXJlbnQ7DQorICAgIH0NCisgICAgY2FzZSBJRkRFX1hNTE5vZGU6OlByaW9yTmVpZ2hib3I6IHsNCisgICAgICBpZiAobV9wUHJpb3IgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIG1fcFBhcmVudDsNCisgICAgICB9DQorICAgICAgQ0ZERV9YTUxOb2RlKiBwSXRlbSA9IG1fcFByaW9yOw0KKyAgICAgIHdoaWxlIChDRkRFX1hNTE5vZGUqIHBUZW1wID0gcEl0ZW0tPm1fcENoaWxkKSB7DQorICAgICAgICBwSXRlbSA9IHBUZW1wOw0KKyAgICAgICAgd2hpbGUgKChwVGVtcCA9IHBJdGVtLT5tX3BOZXh0KSAhPSBOVUxMKSB7DQorICAgICAgICAgIHBJdGVtID0gcFRlbXA7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBwSXRlbTsNCisgICAgfQ0KKyAgICBjYXNlIElGREVfWE1MTm9kZTo6TmV4dE5laWdoYm9yOiB7DQorICAgICAgaWYgKG1fcENoaWxkICE9IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBtX3BDaGlsZDsNCisgICAgICB9DQorICAgICAgaWYgKG1fcE5leHQgIT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIG1fcE5leHQ7DQorICAgICAgfQ0KKyAgICAgIENGREVfWE1MTm9kZSogcEl0ZW0gPSBtX3BQYXJlbnQ7DQorICAgICAgd2hpbGUgKHBJdGVtICE9IE5VTEwpIHsNCisgICAgICAgIGlmIChwSXRlbS0+bV9wTmV4dCAhPSBOVUxMKSB7DQorICAgICAgICAgIHJldHVybiBwSXRlbS0+bV9wTmV4dDsNCisgICAgICAgIH0NCisgICAgICAgIHBJdGVtID0gcEl0ZW0tPm1fcFBhcmVudDsNCisgICAgICB9DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgY2FzZSBJRkRFX1hNTE5vZGU6Okxhc3ROZWlnaGJvcjogew0KKyAgICAgIENGREVfWE1MTm9kZSogcEl0ZW0gPSAoQ0ZERV9YTUxOb2RlKil0aGlzOw0KKyAgICAgIHdoaWxlIChwSXRlbS0+bV9wUGFyZW50ICE9IE5VTEwpIHsNCisgICAgICAgIHBJdGVtID0gcEl0ZW0tPm1fcFBhcmVudDsNCisgICAgICB9DQorICAgICAgd2hpbGUgKFRSVUUpIHsNCisgICAgICAgIHdoaWxlIChwSXRlbS0+bV9wTmV4dCAhPSBOVUxMKSB7DQorICAgICAgICAgIHBJdGVtID0gcEl0ZW0tPm1fcE5leHQ7DQorICAgICAgICB9DQorICAgICAgICBpZiAocEl0ZW0tPm1fcENoaWxkID09IE5VTEwpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBwSXRlbSA9IHBJdGVtLT5tX3BDaGlsZDsNCisgICAgICB9DQorICAgICAgcmV0dXJuIHBJdGVtID09IChDRkRFX1hNTE5vZGUqKXRoaXMgPyBOVUxMIDogcEl0ZW07DQorICAgIH0NCisgICAgY2FzZSBJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQ6DQorICAgICAgcmV0dXJuIG1fcENoaWxkOw0KKyAgICBjYXNlIElGREVfWE1MTm9kZTo6TGFzdENoaWxkOiB7DQorICAgICAgaWYgKG1fcENoaWxkID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0NCisgICAgICBDRkRFX1hNTE5vZGUqIHBDaGlsZCA9IG1fcENoaWxkOw0KKyAgICAgIHdoaWxlIChwQ2hpbGQtPm1fcE5leHQgIT0gTlVMTCkgew0KKyAgICAgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0Ow0KKyAgICAgIH0NCisgICAgICByZXR1cm4gcENoaWxkOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQoraW50MzJfdCBDRkRFX1hNTE5vZGU6OkdldE5vZGVMZXZlbCgpIGNvbnN0IHsNCisgIGludDMyX3QgaUxldmVsID0gMDsNCisgIENGREVfWE1MTm9kZSogcEl0ZW0gPSAoQ0ZERV9YTUxOb2RlKil0aGlzOw0KKyAgd2hpbGUgKChwSXRlbSA9IHBJdGVtLT5tX3BQYXJlbnQpICE9IE5VTEwpIHsNCisgICAgaUxldmVsKys7DQorICB9DQorICByZXR1cm4gaUxldmVsOw0KK30NCitGWF9CT09MIENGREVfWE1MTm9kZTo6SW5zZXJ0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOb2RlSXRlbSBlSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9YTUxOb2RlKiBwTm9kZSkgew0KKyAgRlhTWVNfYXNzZXJ0KHBOb2RlICE9IE5VTEwpOw0KKyAgc3dpdGNoIChlSXRlbSkgew0KKyAgICBjYXNlIElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmc6IHsNCisgICAgICBwTm9kZS0+bV9wUGFyZW50ID0gbV9wUGFyZW50Ow0KKyAgICAgIHBOb2RlLT5tX3BOZXh0ID0gbV9wTmV4dDsNCisgICAgICBwTm9kZS0+bV9wUHJpb3IgPSB0aGlzOw0KKyAgICAgIGlmIChtX3BOZXh0KSB7DQorICAgICAgICBtX3BOZXh0LT5tX3BQcmlvciA9IHBOb2RlOw0KKyAgICAgIH0NCisgICAgICBtX3BOZXh0ID0gcE5vZGU7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgY2FzZSBJRkRFX1hNTE5vZGU6OlByaW9yU2libGluZzogew0KKyAgICAgIHBOb2RlLT5tX3BQYXJlbnQgPSBtX3BQYXJlbnQ7DQorICAgICAgcE5vZGUtPm1fcE5leHQgPSB0aGlzOw0KKyAgICAgIHBOb2RlLT5tX3BQcmlvciA9IG1fcFByaW9yOw0KKyAgICAgIGlmIChtX3BQcmlvcikgew0KKyAgICAgICAgbV9wUHJpb3ItPm1fcE5leHQgPSBwTm9kZTsNCisgICAgICB9IGVsc2UgaWYgKG1fcFBhcmVudCkgew0KKyAgICAgICAgbV9wUGFyZW50LT5tX3BDaGlsZCA9IHBOb2RlOw0KKyAgICAgIH0NCisgICAgICBtX3BQcmlvciA9IHBOb2RlOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitDRkRFX1hNTE5vZGUqIENGREVfWE1MTm9kZTo6UmVtb3ZlTm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOb2RlSXRlbSBlSXRlbSkgew0KKyAgQ0ZERV9YTUxOb2RlKiBwTm9kZSA9IE5VTEw7DQorICBzd2l0Y2ggKGVJdGVtKSB7DQorICAgIGNhc2UgSUZERV9YTUxOb2RlOjpOZXh0U2libGluZzoNCisgICAgICBpZiAobV9wTmV4dCkgew0KKyAgICAgICAgcE5vZGUgPSBtX3BOZXh0Ow0KKyAgICAgICAgbV9wTmV4dCA9IHBOb2RlLT5tX3BOZXh0Ow0KKyAgICAgICAgaWYgKG1fcE5leHQpIHsNCisgICAgICAgICAgbV9wTmV4dC0+bV9wUHJpb3IgPSB0aGlzOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcE5vZGUtPm1fcFBhcmVudCA9IE5VTEw7DQorICAgICAgICBwTm9kZS0+bV9wTmV4dCA9IE5VTEw7DQorICAgICAgICBwTm9kZS0+bV9wUHJpb3IgPSBOVUxMOw0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBwTm9kZTsNCit9DQorQ0ZERV9YTUxOb2RlKiBDRkRFX1hNTE5vZGU6OkNsb25lKEZYX0JPT0wgYlJlY3Vyc2l2ZSkgew0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK3ZvaWQgQ0ZERV9YTUxOb2RlOjpTYXZlWE1MTm9kZShJRlhfU3RyZWFtKiBwWE1MU3RyZWFtKSB7DQorICBDRkRFX1hNTE5vZGUqIHBOb2RlID0gKENGREVfWE1MTm9kZSopdGhpczsNCisgIEZYU1lTX2Fzc2VydChwWE1MU3RyZWFtICE9IE5VTEwgJiYgcE5vZGUgIT0gTlVMTCk7DQorICBzd2l0Y2ggKHBOb2RlLT5HZXRUeXBlKCkpIHsNCisgICAgY2FzZSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbjogew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzOw0KKyAgICAgIENGREVfWE1MSW5zdHJ1Y3Rpb24qIHBJbnN0cnVjdGlvbiA9IChDRkRFX1hNTEluc3RydWN0aW9uKilwTm9kZTsNCisgICAgICBpZiAocEluc3RydWN0aW9uLT5tX3dzVGFyZ2V0LkNvbXBhcmVOb0Nhc2UoTCJ4bWwiKSA9PSAwKSB7DQorICAgICAgICB3cyA9IEwiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiIjsNCisgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlID0gcFhNTFN0cmVhbS0+R2V0Q29kZVBhZ2UoKTsNCisgICAgICAgIGlmICh3Q29kZVBhZ2UgPT0gRlhfQ09ERVBBR0VfVVRGMTZMRSkgew0KKyAgICAgICAgICB3cyArPSBMIlVURi0xNiI7DQorICAgICAgICB9IGVsc2UgaWYgKHdDb2RlUGFnZSA9PSBGWF9DT0RFUEFHRV9VVEYxNkJFKSB7DQorICAgICAgICAgIHdzICs9IEwiVVRGLTE2YmUiOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgd3MgKz0gTCJVVEYtOCI7DQorICAgICAgICB9DQorICAgICAgICB3cyArPSBMIlwiPz4iOw0KKyAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgd3MuRm9ybWF0KEwiPD8lcyIsIChjb25zdCBGWF9XQ0hBUiopcEluc3RydWN0aW9uLT5tX3dzVGFyZ2V0KTsNCisgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0FycmF5JiBhdHRyaWJ1dGVzID0gcEluc3RydWN0aW9uLT5tX0F0dHJpYnV0ZXM7DQorICAgICAgICBpbnQzMl90IGksIGlDb3VudCA9IGF0dHJpYnV0ZXMuR2V0U2l6ZSgpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgew0KKyAgICAgICAgICB3cyA9IEwiICI7DQorICAgICAgICAgIHdzICs9IGF0dHJpYnV0ZXNbaV07DQorICAgICAgICAgIHdzICs9IEwiPVwiIjsNCisgICAgICAgICAgd3NWYWx1ZSA9IGF0dHJpYnV0ZXNbaSArIDFdOw0KKyAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCImIiwgTCImYW1wOyIpOw0KKyAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCI8IiwgTCImbHQ7Iik7DQorICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIj4iLCBMIiZndDsiKTsNCisgICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiXCciLCBMIiZhcG9zOyIpOw0KKyAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCJcIiIsIEwiJnF1b3Q7Iik7DQorICAgICAgICAgIHdzICs9IHdzVmFsdWU7DQorICAgICAgICAgIHdzICs9IEwiXCIiOw0KKyAgICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSYgdGFyZ2V0ZGF0YSA9IHBJbnN0cnVjdGlvbi0+bV9UYXJnZXREYXRhOw0KKyAgICAgICAgaUNvdW50ID0gdGFyZ2V0ZGF0YS5HZXRTaXplKCk7DQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICAgICAgd3MgPSBMIiBcIiI7DQorICAgICAgICAgIHdzICs9IHRhcmdldGRhdGFbaV07DQorICAgICAgICAgIHdzICs9IEwiXCIiOw0KKyAgICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd3MgPSBMIj8+IjsNCisgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZERV9YTUxOT0RFX0VsZW1lbnQ6IHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3czsNCisgICAgICB3cyA9IEwiPCI7DQorICAgICAgd3MgKz0gKChDRkRFX1hNTEVsZW1lbnQqKXBOb2RlKS0+bV93c1RhZzsNCisgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nQXJyYXkmIGF0dHJpYnV0ZXMgPSAoKENGREVfWE1MRWxlbWVudCopcE5vZGUpLT5tX0F0dHJpYnV0ZXM7DQorICAgICAgaW50MzJfdCBpQ291bnQgPSBhdHRyaWJ1dGVzLkdldFNpemUoKTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQorICAgICAgICB3cyA9IEwiICI7DQorICAgICAgICB3cyArPSBhdHRyaWJ1dGVzW2ldOw0KKyAgICAgICAgd3MgKz0gTCI9XCIiOw0KKyAgICAgICAgd3NWYWx1ZSA9IGF0dHJpYnV0ZXNbaSArIDFdOw0KKyAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiJiIsIEwiJmFtcDsiKTsNCisgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIjwiLCBMIiZsdDsiKTsNCisgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIj4iLCBMIiZndDsiKTsNCisgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIlwnIiwgTCImYXBvczsiKTsNCisgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIlwiIiwgTCImcXVvdDsiKTsNCisgICAgICAgIHdzICs9IHdzVmFsdWU7DQorICAgICAgICB3cyArPSBMIlwiIjsNCisgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwTm9kZS0+bV9wQ2hpbGQgPT0gTlVMTCkgew0KKyAgICAgICAgd3MgPSBMIlxuLz4iOw0KKyAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgd3MgPSBMIlxuPiI7DQorICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgQ0ZERV9YTUxOb2RlKiBwQ2hpbGQgPSBwTm9kZS0+bV9wQ2hpbGQ7DQorICAgICAgICB3aGlsZSAocENoaWxkICE9IE5VTEwpIHsNCisgICAgICAgICAgcENoaWxkLT5TYXZlWE1MTm9kZShwWE1MU3RyZWFtKTsNCisgICAgICAgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgd3MgPSBMIjwvIjsNCisgICAgICAgIHdzICs9ICgoQ0ZERV9YTUxFbGVtZW50KilwTm9kZSktPm1fd3NUYWc7DQorICAgICAgICB3cyArPSBMIlxuPiI7DQorICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGREVfWE1MTk9ERV9UZXh0OiB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3MgPSAoKENGREVfWE1MVGV4dCopcE5vZGUpLT5tX3dzVGV4dDsNCisgICAgICB3cy5SZXBsYWNlKEwiJiIsIEwiJmFtcDsiKTsNCisgICAgICB3cy5SZXBsYWNlKEwiPCIsIEwiJmx0OyIpOw0KKyAgICAgIHdzLlJlcGxhY2UoTCI+IiwgTCImZ3Q7Iik7DQorICAgICAgd3MuUmVwbGFjZShMIlwnIiwgTCImYXBvczsiKTsNCisgICAgICB3cy5SZXBsYWNlKEwiXCIiLCBMIiZxdW90OyIpOw0KKyAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRkRFX1hNTE5PREVfQ2hhckRhdGE6IHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3cyA9IEwiPCFbQ0RBVEFbIjsNCisgICAgICB3cyArPSAoKENGREVfWE1MQ2hhckRhdGEqKXBOb2RlKS0+bV93c0NoYXJEYXRhOw0KKyAgICAgIHdzICs9IEwiXV0+IjsNCisgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZERV9YTUxOT0RFX1Vua25vd246DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9YTUxOb2RlOjpDbG9uZUNoaWxkcmVuKENGREVfWE1MTm9kZSogcENsb25lKSB7DQorICBpZiAoIW1fcENoaWxkKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGREVfWE1MTm9kZSogcE5leHQgPSBtX3BDaGlsZDsNCisgIENGREVfWE1MTm9kZSogcENsb25lTmV4dCA9IHBOZXh0LT5DbG9uZShUUlVFKTsNCisgIHBDbG9uZS0+SW5zZXJ0Q2hpbGROb2RlKHBDbG9uZU5leHQpOw0KKyAgcE5leHQgPSBwTmV4dC0+bV9wTmV4dDsNCisgIHdoaWxlIChwTmV4dCkgew0KKyAgICBDRkRFX1hNTE5vZGUqIHBDaGlsZCA9IHBOZXh0LT5DbG9uZShUUlVFKTsNCisgICAgcENsb25lTmV4dC0+SW5zZXJ0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZywgcENoaWxkKTsNCisgICAgcENsb25lTmV4dCA9IHBDaGlsZDsNCisgICAgcE5leHQgPSBwTmV4dC0+bV9wTmV4dDsNCisgIH0NCit9DQorSUZERV9YTUxJbnN0cnVjdGlvbiogSUZERV9YTUxJbnN0cnVjdGlvbjo6Q3JlYXRlKA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUYXJnZXQpIHsNCisgIHJldHVybiAoSUZERV9YTUxJbnN0cnVjdGlvbiopbmV3IENGREVfWE1MSW5zdHJ1Y3Rpb24od3NUYXJnZXQpOw0KK30NCitDRkRFX1hNTEluc3RydWN0aW9uOjpDRkRFX1hNTEluc3RydWN0aW9uKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RhcmdldCkNCisgICAgOiBtX3dzVGFyZ2V0KHdzVGFyZ2V0KSB7DQorICBGWFNZU19hc3NlcnQobV93c1RhcmdldC5HZXRMZW5ndGgoKSA+IDApOw0KK30NCitDRkRFX1hNTE5vZGUqIENGREVfWE1MSW5zdHJ1Y3Rpb246OkNsb25lKEZYX0JPT0wgYlJlY3Vyc2l2ZSkgew0KKyAgQ0ZERV9YTUxJbnN0cnVjdGlvbiogcENsb25lID0gbmV3IENGREVfWE1MSW5zdHJ1Y3Rpb24obV93c1RhcmdldCk7DQorICBpZiAoIXBDbG9uZSkgew0KKyAgICByZXR1cm4gcENsb25lOw0KKyAgfQ0KKyAgcENsb25lLT5tX0F0dHJpYnV0ZXMuQ29weShtX0F0dHJpYnV0ZXMpOw0KKyAgcENsb25lLT5tX1RhcmdldERhdGEuQ29weShtX1RhcmdldERhdGEpOw0KKyAgaWYgKGJSZWN1cnNpdmUpIHsNCisgICAgQ2xvbmVDaGlsZHJlbihwQ2xvbmUpOw0KKyAgfQ0KKyAgcmV0dXJuIHBDbG9uZTsNCit9DQoraW50MzJfdCBDRkRFX1hNTEluc3RydWN0aW9uOjpDb3VudEF0dHJpYnV0ZXMoKSBjb25zdCB7DQorICByZXR1cm4gbV9BdHRyaWJ1dGVzLkdldFNpemUoKSAvIDI7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6R2V0QXR0cmlidXRlKGludDMyX3QgaW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpVmFsdWUpIGNvbnN0IHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9BdHRyaWJ1dGVzLkdldFNpemUoKTsNCisgIEZYU1lTX2Fzc2VydChpbmRleCA+IC0xICYmIGluZGV4IDwgaUNvdW50IC8gMik7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgew0KKyAgICBpZiAoaW5kZXggPT0gMCkgew0KKyAgICAgIHdzQXR0cmlOYW1lID0gbV9BdHRyaWJ1dGVzW2ldOw0KKyAgICAgIHdzQXR0cmlWYWx1ZSA9IG1fQXR0cmlidXRlc1tpICsgMV07DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgaW5kZXgtLTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDRkRFX1hNTEluc3RydWN0aW9uOjpIYXNBdHRyaWJ1dGUoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSkgY29uc3Qgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX0F0dHJpYnV0ZXMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsNCisgICAgaWYgKG1fQXR0cmlidXRlc1tpXS5Db21wYXJlKHB3c0F0dHJpTmFtZSkgPT0gMCkgew0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6R2V0U3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHdzRGVmVmFsdWUpIGNvbnN0IHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9BdHRyaWJ1dGVzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQorICAgIGlmIChtX0F0dHJpYnV0ZXNbaV0uQ29tcGFyZShwd3NBdHRyaU5hbWUpID09IDApIHsNCisgICAgICB3c0F0dHJpVmFsdWUgPSBtX0F0dHJpYnV0ZXNbaSArIDFdOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgfQ0KKyAgd3NBdHRyaVZhbHVlID0gcHdzRGVmVmFsdWU7DQorfQ0KK3ZvaWQgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6U2V0U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaVZhbHVlKSB7DQorICBGWFNZU19hc3NlcnQod3NBdHRyaU5hbWUuR2V0TGVuZ3RoKCkgPiAwKTsNCisgIGludDMyX3QgaUNvdW50ID0gbV9BdHRyaWJ1dGVzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQorICAgIGlmIChtX0F0dHJpYnV0ZXNbaV0uQ29tcGFyZSh3c0F0dHJpTmFtZSkgPT0gMCkgew0KKyAgICAgIG1fQXR0cmlidXRlc1tpXSA9IHdzQXR0cmlOYW1lOw0KKyAgICAgIG1fQXR0cmlidXRlc1tpICsgMV0gPSB3c0F0dHJpVmFsdWU7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICB9DQorICBtX0F0dHJpYnV0ZXMuQWRkKHdzQXR0cmlOYW1lKTsNCisgIG1fQXR0cmlidXRlcy5BZGQod3NBdHRyaVZhbHVlKTsNCit9DQoraW50MzJfdCBDRkRFX1hNTEluc3RydWN0aW9uOjpHZXRJbnRlZ2VyKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaURlZlZhbHVlKSBjb25zdCB7DQorICBpbnQzMl90IGlDb3VudCA9IG1fQXR0cmlidXRlcy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgew0KKyAgICBpZiAobV9BdHRyaWJ1dGVzW2ldLkNvbXBhcmUocHdzQXR0cmlOYW1lKSA9PSAwKSB7DQorICAgICAgcmV0dXJuIEZYU1lTX3d0b2koKGNvbnN0IEZYX1dDSEFSKiltX0F0dHJpYnV0ZXNbaSArIDFdKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGlEZWZWYWx1ZTsNCit9DQordm9pZCBDRkRFX1hNTEluc3RydWN0aW9uOjpTZXRJbnRlZ2VyKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUF0dHJpVmFsdWUpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICB3c1ZhbHVlLkZvcm1hdChMIiVkIiwgaUF0dHJpVmFsdWUpOw0KKyAgU2V0U3RyaW5nKHB3c0F0dHJpTmFtZSwgd3NWYWx1ZSk7DQorfQ0KK0ZYX0ZMT0FUIENGREVfWE1MSW5zdHJ1Y3Rpb246OkdldEZsb2F0KGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkRlZlZhbHVlKSBjb25zdCB7DQorICBpbnQzMl90IGlDb3VudCA9IG1fQXR0cmlidXRlcy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgew0KKyAgICBpZiAobV9BdHRyaWJ1dGVzW2ldLkNvbXBhcmUocHdzQXR0cmlOYW1lKSA9PSAwKSB7DQorICAgICAgcmV0dXJuIEZYX3djc3RvZigoY29uc3QgRlhfV0NIQVIqKW1fQXR0cmlidXRlc1tpICsgMV0pOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gZkRlZlZhbHVlOw0KK30NCit2b2lkIENGREVfWE1MSW5zdHJ1Y3Rpb246OlNldEZsb2F0KGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQXR0cmlWYWx1ZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgIHdzVmFsdWUuRm9ybWF0KEwiJWYiLCBmQXR0cmlWYWx1ZSk7DQorICBTZXRTdHJpbmcocHdzQXR0cmlOYW1lLCB3c1ZhbHVlKTsNCit9DQordm9pZCBDRkRFX1hNTEluc3RydWN0aW9uOjpSZW1vdmVBdHRyaWJ1dGUoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSkgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX0F0dHJpYnV0ZXMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsNCisgICAgaWYgKG1fQXR0cmlidXRlc1tpXS5Db21wYXJlKHB3c0F0dHJpTmFtZSkgPT0gMCkgew0KKyAgICAgIG1fQXR0cmlidXRlcy5SZW1vdmVBdChpICsgMSk7DQorICAgICAgbV9BdHRyaWJ1dGVzLlJlbW92ZUF0KGkpOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgfQ0KK30NCitpbnQzMl90IENGREVfWE1MSW5zdHJ1Y3Rpb246OkNvdW50RGF0YSgpIGNvbnN0IHsNCisgIHJldHVybiBtX1RhcmdldERhdGEuR2V0U2l6ZSgpOw0KK30NCitGWF9CT09MIENGREVfWE1MSW5zdHJ1Y3Rpb246OkdldERhdGEoaW50MzJfdCBpbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0YSkgY29uc3Qgew0KKyAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBtX1RhcmdldERhdGEuR2V0U2l6ZSgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHdzRGF0YSA9IG1fVGFyZ2V0RGF0YVtpbmRleF07DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDRkRFX1hNTEluc3RydWN0aW9uOjpBcHBlbmREYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGEpIHsNCisgIG1fVGFyZ2V0RGF0YS5BZGQod3NEYXRhKTsNCit9DQordm9pZCBDRkRFX1hNTEluc3RydWN0aW9uOjpSZW1vdmVEYXRhKGludDMyX3QgaW5kZXgpIHsNCisgIG1fVGFyZ2V0RGF0YS5SZW1vdmVBdChpbmRleCk7DQorfQ0KK0lGREVfWE1MRWxlbWVudCogSUZERV9YTUxFbGVtZW50OjpDcmVhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGFnKSB7DQorICByZXR1cm4gKElGREVfWE1MRWxlbWVudCopbmV3IENGREVfWE1MRWxlbWVudCh3c1RhZyk7DQorfQ0KK0NGREVfWE1MRWxlbWVudDo6Q0ZERV9YTUxFbGVtZW50KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RhZykNCisgICAgOiBDRkRFX1hNTE5vZGUoKSwgbV93c1RhZyh3c1RhZyksIG1fQXR0cmlidXRlcygpIHsNCisgIEZYU1lTX2Fzc2VydChtX3dzVGFnLkdldExlbmd0aCgpID4gMCk7DQorfQ0KK0NGREVfWE1MRWxlbWVudDo6fkNGREVfWE1MRWxlbWVudCgpIHsNCisgIG1fQXR0cmlidXRlcy5SZW1vdmVBbGwoKTsNCit9DQorQ0ZERV9YTUxOb2RlKiBDRkRFX1hNTEVsZW1lbnQ6OkNsb25lKEZYX0JPT0wgYlJlY3Vyc2l2ZSkgew0KKyAgQ0ZERV9YTUxFbGVtZW50KiBwQ2xvbmUgPSBuZXcgQ0ZERV9YTUxFbGVtZW50KG1fd3NUYWcpOw0KKyAgaWYgKCFwQ2xvbmUpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBwQ2xvbmUtPm1fQXR0cmlidXRlcy5Db3B5KG1fQXR0cmlidXRlcyk7DQorICBpZiAoYlJlY3Vyc2l2ZSkgew0KKyAgICBDbG9uZUNoaWxkcmVuKHBDbG9uZSk7DQorICB9IGVsc2Ugew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICAgIENGREVfWE1MTm9kZSogcENoaWxkID0gbV9wQ2hpbGQ7DQorICAgIHdoaWxlIChwQ2hpbGQgIT0gTlVMTCkgew0KKyAgICAgIHN3aXRjaCAocENoaWxkLT5HZXRUeXBlKCkpIHsNCisgICAgICAgIGNhc2UgRkRFX1hNTE5PREVfVGV4dDoNCisgICAgICAgICAgd3NUZXh0ICs9ICgoQ0ZERV9YTUxUZXh0KilwQ2hpbGQpLT5tX3dzVGV4dDsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0Ow0KKyAgICB9DQorICAgIHBDbG9uZS0+U2V0VGV4dERhdGEod3NUZXh0KTsNCisgIH0NCisgIHJldHVybiBwQ2xvbmU7DQorfQ0KK3ZvaWQgQ0ZERV9YTUxFbGVtZW50OjpHZXRUYWdOYW1lKENGWF9XaWRlU3RyaW5nJiB3c1RhZykgY29uc3Qgew0KKyAgd3NUYWcgPSBtX3dzVGFnOw0KK30NCit2b2lkIENGREVfWE1MRWxlbWVudDo6R2V0TG9jYWxUYWdOYW1lKENGWF9XaWRlU3RyaW5nJiB3c1RhZykgY29uc3Qgew0KKyAgRlhfU1RSU0laRSBpRmluZCA9IG1fd3NUYWcuRmluZChMJzonLCAwKTsNCisgIGlmIChpRmluZCA8IDApIHsNCisgICAgd3NUYWcgPSBtX3dzVGFnOw0KKyAgfSBlbHNlIHsNCisgICAgd3NUYWcgPSBtX3dzVGFnLlJpZ2h0KG1fd3NUYWcuR2V0TGVuZ3RoKCkgLSBpRmluZCAtIDEpOw0KKyAgfQ0KK30NCit2b2lkIENGREVfWE1MRWxlbWVudDo6R2V0TmFtZXNwYWNlUHJlZml4KENGWF9XaWRlU3RyaW5nJiB3c1ByZWZpeCkgY29uc3Qgew0KKyAgRlhfU1RSU0laRSBpRmluZCA9IG1fd3NUYWcuRmluZChMJzonLCAwKTsNCisgIGlmIChpRmluZCA8IDApIHsNCisgICAgd3NQcmVmaXguRW1wdHkoKTsNCisgIH0gZWxzZSB7DQorICAgIHdzUHJlZml4ID0gbV93c1RhZy5MZWZ0KGlGaW5kKTsNCisgIH0NCit9DQordm9pZCBDRkRFX1hNTEVsZW1lbnQ6OkdldE5hbWVzcGFjZVVSSShDRlhfV2lkZVN0cmluZyYgd3NOYW1lc3BhY2UpIGNvbnN0IHsNCisgIENGWF9XaWRlU3RyaW5nIHdzQXR0cmkoTCJ4bWxucyIpLCB3c1ByZWZpeDsNCisgIEdldE5hbWVzcGFjZVByZWZpeCh3c1ByZWZpeCk7DQorICBpZiAod3NQcmVmaXguR2V0TGVuZ3RoKCkgPiAwKSB7DQorICAgIHdzQXR0cmkgKz0gTCI6IjsNCisgICAgd3NBdHRyaSArPSB3c1ByZWZpeDsNCisgIH0NCisgIHdzTmFtZXNwYWNlLkVtcHR5KCk7DQorICBDRkRFX1hNTE5vZGUqIHBOb2RlID0gKENGREVfWE1MTm9kZSopdGhpczsNCisgIHdoaWxlIChwTm9kZSAhPSBOVUxMKSB7DQorICAgIGlmIChwTm9kZS0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBDRkRFX1hNTEVsZW1lbnQqIHBFbGVtZW50ID0gKENGREVfWE1MRWxlbWVudCopcE5vZGU7DQorICAgIGlmICghcEVsZW1lbnQtPkhhc0F0dHJpYnV0ZSh3c0F0dHJpKSkgew0KKyAgICAgIHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6UGFyZW50KTsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBwRWxlbWVudC0+R2V0U3RyaW5nKHdzQXR0cmksIHdzTmFtZXNwYWNlKTsNCisgICAgYnJlYWs7DQorICB9DQorfQ0KK2ludDMyX3QgQ0ZERV9YTUxFbGVtZW50OjpDb3VudEF0dHJpYnV0ZXMoKSBjb25zdCB7DQorICByZXR1cm4gbV9BdHRyaWJ1dGVzLkdldFNpemUoKSAvIDI7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9YTUxFbGVtZW50OjpHZXRBdHRyaWJ1dGUoaW50MzJfdCBpbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpVmFsdWUpIGNvbnN0IHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9BdHRyaWJ1dGVzLkdldFNpemUoKTsNCisgIEZYU1lTX2Fzc2VydChpbmRleCA+IC0xICYmIGluZGV4IDwgaUNvdW50IC8gMik7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgew0KKyAgICBpZiAoaW5kZXggPT0gMCkgew0KKyAgICAgIHdzQXR0cmlOYW1lID0gbV9BdHRyaWJ1dGVzW2ldOw0KKyAgICAgIHdzQXR0cmlWYWx1ZSA9IG1fQXR0cmlidXRlc1tpICsgMV07DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgaW5kZXgtLTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDRkRFX1hNTEVsZW1lbnQ6Okhhc0F0dHJpYnV0ZShjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lKSBjb25zdCB7DQorICBpbnQzMl90IGlDb3VudCA9IG1fQXR0cmlidXRlcy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgew0KKyAgICBpZiAobV9BdHRyaWJ1dGVzW2ldLkNvbXBhcmUocHdzQXR0cmlOYW1lKSA9PSAwKSB7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDRkRFX1hNTEVsZW1lbnQ6OkdldFN0cmluZyhjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwd3NEZWZWYWx1ZSkgY29uc3Qgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX0F0dHJpYnV0ZXMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsNCisgICAgaWYgKG1fQXR0cmlidXRlc1tpXS5Db21wYXJlKHB3c0F0dHJpTmFtZSkgPT0gMCkgew0KKyAgICAgIHdzQXR0cmlWYWx1ZSA9IG1fQXR0cmlidXRlc1tpICsgMV07DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICB9DQorICB3c0F0dHJpVmFsdWUgPSBwd3NEZWZWYWx1ZTsNCit9DQordm9pZCBDRkRFX1hNTEVsZW1lbnQ6OlNldFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaVZhbHVlKSB7DQorICBGWFNZU19hc3NlcnQod3NBdHRyaU5hbWUuR2V0TGVuZ3RoKCkgPiAwKTsNCisgIGludDMyX3QgaUNvdW50ID0gbV9BdHRyaWJ1dGVzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7DQorICAgIGlmIChtX0F0dHJpYnV0ZXNbaV0uQ29tcGFyZSh3c0F0dHJpTmFtZSkgPT0gMCkgew0KKyAgICAgIG1fQXR0cmlidXRlc1tpXSA9IHdzQXR0cmlOYW1lOw0KKyAgICAgIG1fQXR0cmlidXRlc1tpICsgMV0gPSB3c0F0dHJpVmFsdWU7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICB9DQorICBtX0F0dHJpYnV0ZXMuQWRkKHdzQXR0cmlOYW1lKTsNCisgIG1fQXR0cmlidXRlcy5BZGQod3NBdHRyaVZhbHVlKTsNCit9DQoraW50MzJfdCBDRkRFX1hNTEVsZW1lbnQ6OkdldEludGVnZXIoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEZWZWYWx1ZSkgY29uc3Qgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX0F0dHJpYnV0ZXMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsNCisgICAgaWYgKG1fQXR0cmlidXRlc1tpXS5Db21wYXJlKHB3c0F0dHJpTmFtZSkgPT0gMCkgew0KKyAgICAgIHJldHVybiBGWFNZU193dG9pKChjb25zdCBGWF9XQ0hBUiopbV9BdHRyaWJ1dGVzW2kgKyAxXSk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBpRGVmVmFsdWU7DQorfQ0KK3ZvaWQgQ0ZERV9YTUxFbGVtZW50OjpTZXRJbnRlZ2VyKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQXR0cmlWYWx1ZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgIHdzVmFsdWUuRm9ybWF0KEwiJWQiLCBpQXR0cmlWYWx1ZSk7DQorICBTZXRTdHJpbmcocHdzQXR0cmlOYW1lLCB3c1ZhbHVlKTsNCit9DQorRlhfRkxPQVQgQ0ZERV9YTUxFbGVtZW50OjpHZXRGbG9hdChjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkRlZlZhbHVlKSBjb25zdCB7DQorICBpbnQzMl90IGlDb3VudCA9IG1fQXR0cmlidXRlcy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgew0KKyAgICBpZiAobV9BdHRyaWJ1dGVzW2ldLkNvbXBhcmUocHdzQXR0cmlOYW1lKSA9PSAwKSB7DQorICAgICAgcmV0dXJuIEZYX3djc3RvZigoY29uc3QgRlhfV0NIQVIqKW1fQXR0cmlidXRlc1tpICsgMV0pOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gZkRlZlZhbHVlOw0KK30NCit2b2lkIENGREVfWE1MRWxlbWVudDo6U2V0RmxvYXQoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkF0dHJpVmFsdWUpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICB3c1ZhbHVlLkZvcm1hdChMIiVmIiwgZkF0dHJpVmFsdWUpOw0KKyAgU2V0U3RyaW5nKHB3c0F0dHJpTmFtZSwgd3NWYWx1ZSk7DQorfQ0KK3ZvaWQgQ0ZERV9YTUxFbGVtZW50OjpSZW1vdmVBdHRyaWJ1dGUoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSkgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX0F0dHJpYnV0ZXMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsNCisgICAgaWYgKG1fQXR0cmlidXRlc1tpXS5Db21wYXJlKHB3c0F0dHJpTmFtZSkgPT0gMCkgew0KKyAgICAgIG1fQXR0cmlidXRlcy5SZW1vdmVBdChpICsgMSk7DQorICAgICAgbV9BdHRyaWJ1dGVzLlJlbW92ZUF0KGkpOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENGREVfWE1MRWxlbWVudDo6R2V0VGV4dERhdGEoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgY29uc3Qgew0KKyAgQ0ZYX1dpZGVUZXh0QnVmIGJ1ZmZlcjsNCisgIENGREVfWE1MTm9kZSogcENoaWxkID0gbV9wQ2hpbGQ7DQorICB3aGlsZSAocENoaWxkICE9IE5VTEwpIHsNCisgICAgc3dpdGNoIChwQ2hpbGQtPkdldFR5cGUoKSkgew0KKyAgICAgIGNhc2UgRkRFX1hNTE5PREVfVGV4dDoNCisgICAgICAgIGJ1ZmZlciA8PCAoKENGREVfWE1MVGV4dCopcENoaWxkKS0+bV93c1RleHQ7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9YTUxOT0RFX0NoYXJEYXRhOg0KKyAgICAgICAgYnVmZmVyIDw8ICgoQ0ZERV9YTUxDaGFyRGF0YSopcENoaWxkKS0+bV93c0NoYXJEYXRhOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHBDaGlsZCA9IHBDaGlsZC0+bV9wTmV4dDsNCisgIH0NCisgIHdzVGV4dCA9IGJ1ZmZlci5HZXRXaWRlU3RyaW5nKCk7DQorfQ0KK3ZvaWQgQ0ZERV9YTUxFbGVtZW50OjpTZXRUZXh0RGF0YShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7DQorICBpZiAod3NUZXh0LkdldExlbmd0aCgpIDwgMSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBJbnNlcnRDaGlsZE5vZGUobmV3IENGREVfWE1MVGV4dCh3c1RleHQpKTsNCit9DQorSUZERV9YTUxUZXh0KiBJRkRFX1hNTFRleHQ6OkNyZWF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7DQorICByZXR1cm4gKElGREVfWE1MVGV4dCopbmV3IENGREVfWE1MVGV4dCh3c1RleHQpOw0KK30NCitDRkRFX1hNTFRleHQ6OkNGREVfWE1MVGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KQ0KKyAgICA6IENGREVfWE1MTm9kZSgpLCBtX3dzVGV4dCh3c1RleHQpIHt9DQorQ0ZERV9YTUxOb2RlKiBDRkRFX1hNTFRleHQ6OkNsb25lKEZYX0JPT0wgYlJlY3Vyc2l2ZSkgew0KKyAgQ0ZERV9YTUxUZXh0KiBwQ2xvbmUgPSBuZXcgQ0ZERV9YTUxUZXh0KG1fd3NUZXh0KTsNCisgIHJldHVybiBwQ2xvbmU7DQorfQ0KK0lGREVfWE1MQ2hhckRhdGEqIElGREVfWE1MQ2hhckRhdGE6OkNyZWF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDRGF0YSkgew0KKyAgcmV0dXJuIChJRkRFX1hNTENoYXJEYXRhKiluZXcgQ0ZERV9YTUxDaGFyRGF0YSh3c0NEYXRhKTsNCit9DQorQ0ZERV9YTUxDaGFyRGF0YTo6Q0ZERV9YTUxDaGFyRGF0YShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDRGF0YSkNCisgICAgOiBDRkRFX1hNTERlY2xhcmF0aW9uKCksIG1fd3NDaGFyRGF0YSh3c0NEYXRhKSB7fQ0KK0NGREVfWE1MTm9kZSogQ0ZERV9YTUxDaGFyRGF0YTo6Q2xvbmUoRlhfQk9PTCBiUmVjdXJzaXZlKSB7DQorICBDRkRFX1hNTENoYXJEYXRhKiBwQ2xvbmUgPSBuZXcgQ0ZERV9YTUxDaGFyRGF0YShtX3dzQ2hhckRhdGEpOw0KKyAgcmV0dXJuIHBDbG9uZTsNCit9DQorSUZERV9YTUxEb2MqIElGREVfWE1MRG9jOjpDcmVhdGUoKSB7DQorICByZXR1cm4gKElGREVfWE1MRG9jKiluZXcgQ0ZERV9YTUxEb2M7DQorfQ0KK0NGREVfWE1MRG9jOjpDRkRFX1hNTERvYygpDQorICAgIDogbV9wUm9vdChOVUxMKSwgbV9wU3ludGF4UGFyc2VyKE5VTEwpLCBtX3BYTUxQYXJzZXIoTlVMTCkgew0KKyAgUmVzZXQoVFJVRSk7DQorICBDRkRFX1hNTEluc3RydWN0aW9uKiBwWE1MID0gbmV3IENGREVfWE1MSW5zdHJ1Y3Rpb24oTCJ4bWwiKTsNCisgIG1fcFJvb3QtPkluc2VydENoaWxkTm9kZShwWE1MKTsNCit9DQorQ0ZERV9YTUxEb2M6On5DRkRFX1hNTERvYygpIHsNCisgIFJlc2V0KEZBTFNFKTsNCit9DQordm9pZCBDRkRFX1hNTERvYzo6UmVzZXQoRlhfQk9PTCBiSW5pdFJvb3QpIHsNCisgIG1faVN0YXR1cyA9IDA7DQorICBtX3BTdHJlYW0gPSBOVUxMOw0KKyAgaWYgKGJJbml0Um9vdCkgew0KKyAgICBpZiAobV9wUm9vdCA9PSBOVUxMKSB7DQorICAgICAgbV9wUm9vdCA9IG5ldyBDRkRFX1hNTE5vZGU7DQorICAgIH0gZWxzZSB7DQorICAgICAgbV9wUm9vdC0+RGVsZXRlQ2hpbGRyZW4oKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgaWYgKG1fcFJvb3QgIT0gTlVMTCkgew0KKyAgICAgIG1fcFJvb3QtPlJlbGVhc2UoKTsNCisgICAgICBtX3BSb290ID0gTlVMTDsNCisgICAgfQ0KKyAgfQ0KKyAgUmVsZWFzZVBhcnNlcigpOw0KK30NCit2b2lkIENGREVfWE1MRG9jOjpSZWxlYXNlUGFyc2VyKCkgew0KKyAgaWYgKG1fcFhNTFBhcnNlciAhPSBOVUxMKSB7DQorICAgIG1fcFhNTFBhcnNlci0+UmVsZWFzZSgpOw0KKyAgICBtX3BYTUxQYXJzZXIgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcFN5bnRheFBhcnNlciAhPSBOVUxMKSB7DQorICAgIG1fcFN5bnRheFBhcnNlci0+UmVsZWFzZSgpOw0KKyAgICBtX3BTeW50YXhQYXJzZXIgPSBOVUxMOw0KKyAgfQ0KK30NCitGWF9CT09MIENGREVfWE1MRG9jOjpMb2FkWE1MKElGWF9TdHJlYW0qIHBYTUxTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlYTUxQbGFuZVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlUZXh0RGF0YVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfTFBYTUxSRUFERVJIQU5ETEVSIHBIYW5kbGVyKSB7DQorICBpZiAocFhNTFN0cmVhbSA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIFJlc2V0KFRSVUUpOw0KKyAgaVhNTFBsYW5lU2l6ZSA9IGlYTUxQbGFuZVNpemUgLyAxMDI0Ow0KKyAgaWYgKGlYTUxQbGFuZVNpemUgPCAxKSB7DQorICAgIGlYTUxQbGFuZVNpemUgPSAxOw0KKyAgfQ0KKyAgaVhNTFBsYW5lU2l6ZSAqPSAxMDI0Ow0KKyAgaWYgKGlYTUxQbGFuZVNpemUgPCA0MDk2KSB7DQorICAgIGlYTUxQbGFuZVNpemUgPSA0MDk2Ow0KKyAgfQ0KKyAgaVRleHREYXRhU2l6ZSA9IGlUZXh0RGF0YVNpemUgLyAxMjg7DQorICBpZiAoaVRleHREYXRhU2l6ZSA8IDEpIHsNCisgICAgaVRleHREYXRhU2l6ZSA9IDE7DQorICB9DQorICBpVGV4dERhdGFTaXplICo9IDEyODsNCisgIGlmIChpVGV4dERhdGFTaXplIDwgMTI4KSB7DQorICAgIGlUZXh0RGF0YVNpemUgPSAxMjg7DQorICB9DQorICBtX3BTdHJlYW0gPSBwWE1MU3RyZWFtOw0KKyAgRlhfV09SRCB3Q29kZVBhZ2UgPSBtX3BTdHJlYW0tPkdldENvZGVQYWdlKCk7DQorICBpZiAod0NvZGVQYWdlICE9IEZYX0NPREVQQUdFX1VURjE2TEUgJiYgd0NvZGVQYWdlICE9IEZYX0NPREVQQUdFX1VURjE2QkUgJiYNCisgICAgICB3Q29kZVBhZ2UgIT0gRlhfQ09ERVBBR0VfVVRGOCkgew0KKyAgICBtX3BTdHJlYW0tPlNldENvZGVQYWdlKEZYX0NPREVQQUdFX1VURjgpOw0KKyAgfQ0KKyAgbV9wU3ludGF4UGFyc2VyID0gSUZERV9YTUxTeW50YXhQYXJzZXI6OkNyZWF0ZSgpOw0KKyAgaWYgKG1fcFN5bnRheFBhcnNlciA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIG1fcFN5bnRheFBhcnNlci0+SW5pdChtX3BTdHJlYW0sIGlYTUxQbGFuZVNpemUsIGlUZXh0RGF0YVNpemUpOw0KKyAgaWYgKHBIYW5kbGVyID09IE5VTEwpIHsNCisgICAgbV9wWE1MUGFyc2VyID0gbmV3IENGREVfWE1MRE9NUGFyc2VyKG1fcFJvb3QsIG1fcFN5bnRheFBhcnNlcik7DQorICB9IGVsc2Ugew0KKyAgICBtX3BYTUxQYXJzZXIgPSBuZXcgQ0ZERV9YTUxTQVhQYXJzZXIocEhhbmRsZXIsIG1fcFN5bnRheFBhcnNlcik7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRkRFX1hNTERvYzo6TG9hZFhNTChJRkRFX1hNTFBhcnNlciogcFhNTFBhcnNlcikgew0KKyAgaWYgKHBYTUxQYXJzZXIgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBSZXNldChUUlVFKTsNCisgIG1fcFhNTFBhcnNlciA9IHBYTUxQYXJzZXI7DQorICByZXR1cm4gbV9wWE1MUGFyc2VyICE9IE5VTEw7DQorfQ0KK2ludDMyX3QgQ0ZERV9YTUxEb2M6OkRvTG9hZChJRlhfUGF1c2UqIHBQYXVzZSkgew0KKyAgaWYgKG1faVN0YXR1cyA+PSAxMDApIHsNCisgICAgcmV0dXJuIG1faVN0YXR1czsNCisgIH0NCisgIEZYU1lTX2Fzc2VydChtX3BYTUxQYXJzZXIgIT0gTlVMTCk7DQorICByZXR1cm4gbV9pU3RhdHVzID0gbV9wWE1MUGFyc2VyLT5Eb1BhcnNlcihwUGF1c2UpOw0KK30NCit2b2lkIENGREVfWE1MRG9jOjpDbG9zZVhNTCgpIHsNCisgIFJlbGVhc2VQYXJzZXIoKTsNCit9DQordm9pZCBDRkRFX1hNTERvYzo6U2F2ZVhNTE5vZGUoSUZYX1N0cmVhbSogcFhNTFN0cmVhbSwgSUZERV9YTUxOb2RlKiBwSU5vZGUpIHsNCisgIENGREVfWE1MTm9kZSogcE5vZGUgPSAoQ0ZERV9YTUxOb2RlKilwSU5vZGU7DQorICBGWFNZU19hc3NlcnQocFhNTFN0cmVhbSAhPSBOVUxMICYmIHBOb2RlICE9IE5VTEwpOw0KKyAgc3dpdGNoIChwTm9kZS0+R2V0VHlwZSgpKSB7DQorICAgIGNhc2UgRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb246IHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3czsNCisgICAgICBDRkRFX1hNTEluc3RydWN0aW9uKiBwSW5zdHJ1Y3Rpb24gPSAoQ0ZERV9YTUxJbnN0cnVjdGlvbiopcE5vZGU7DQorICAgICAgaWYgKHBJbnN0cnVjdGlvbi0+bV93c1RhcmdldC5Db21wYXJlTm9DYXNlKEwieG1sIikgPT0gMCkgew0KKyAgICAgICAgd3MgPSBMIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIiI7DQorICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSA9IHBYTUxTdHJlYW0tPkdldENvZGVQYWdlKCk7DQorICAgICAgICBpZiAod0NvZGVQYWdlID09IEZYX0NPREVQQUdFX1VURjE2TEUpIHsNCisgICAgICAgICAgd3MgKz0gTCJVVEYtMTYiOw0KKyAgICAgICAgfSBlbHNlIGlmICh3Q29kZVBhZ2UgPT0gRlhfQ09ERVBBR0VfVVRGMTZCRSkgew0KKyAgICAgICAgICB3cyArPSBMIlVURi0xNmJlIjsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHdzICs9IEwiVVRGLTgiOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd3MgKz0gTCJcIj8+IjsNCisgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHdzLkZvcm1hdChMIjw/JXMiLCAoY29uc3QgRlhfV0NIQVIqKXBJbnN0cnVjdGlvbi0+bV93c1RhcmdldCk7DQorICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSYgYXR0cmlidXRlcyA9IHBJbnN0cnVjdGlvbi0+bV9BdHRyaWJ1dGVzOw0KKyAgICAgICAgaW50MzJfdCBpLCBpQ291bnQgPSBhdHRyaWJ1dGVzLkdldFNpemUoKTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsNCisgICAgICAgICAgd3MgPSBMIiAiOw0KKyAgICAgICAgICB3cyArPSBhdHRyaWJ1dGVzW2ldOw0KKyAgICAgICAgICB3cyArPSBMIj1cIiI7DQorICAgICAgICAgIHdzVmFsdWUgPSBhdHRyaWJ1dGVzW2kgKyAxXTsNCisgICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiJiIsIEwiJmFtcDsiKTsNCisgICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiPCIsIEwiJmx0OyIpOw0KKyAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCI+IiwgTCImZ3Q7Iik7DQorICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIlwnIiwgTCImYXBvczsiKTsNCisgICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiXCIiLCBMIiZxdW90OyIpOw0KKyAgICAgICAgICB3cyArPSB3c1ZhbHVlOw0KKyAgICAgICAgICB3cyArPSBMIlwiIjsNCisgICAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nQXJyYXkmIHRhcmdldGRhdGEgPSBwSW5zdHJ1Y3Rpb24tPm1fVGFyZ2V0RGF0YTsNCisgICAgICAgIGlDb3VudCA9IHRhcmdldGRhdGEuR2V0U2l6ZSgpOw0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgICAgIHdzID0gTCIgXCIiOw0KKyAgICAgICAgICB3cyArPSB0YXJnZXRkYXRhW2ldOw0KKyAgICAgICAgICB3cyArPSBMIlwiIjsNCisgICAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCisgICAgICAgIH0NCisgICAgICAgIHdzID0gTCI/PiI7DQorICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGREVfWE1MTk9ERV9FbGVtZW50OiB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3M7DQorICAgICAgd3MgPSBMIjwiOw0KKyAgICAgIHdzICs9ICgoQ0ZERV9YTUxFbGVtZW50KilwTm9kZSktPm1fd3NUYWc7DQorICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCisgICAgICBDRlhfV2lkZVN0cmluZ0FycmF5JiBhdHRyaWJ1dGVzID0gKChDRkRFX1hNTEVsZW1lbnQqKXBOb2RlKS0+bV9BdHRyaWJ1dGVzOw0KKyAgICAgIGludDMyX3QgaUNvdW50ID0gYXR0cmlidXRlcy5HZXRTaXplKCk7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgew0KKyAgICAgICAgd3MgPSBMIiAiOw0KKyAgICAgICAgd3MgKz0gYXR0cmlidXRlc1tpXTsNCisgICAgICAgIHdzICs9IEwiPVwiIjsNCisgICAgICAgIHdzVmFsdWUgPSBhdHRyaWJ1dGVzW2kgKyAxXTsNCisgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIiYiLCBMIiZhbXA7Iik7DQorICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCI8IiwgTCImbHQ7Iik7DQorICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCI+IiwgTCImZ3Q7Iik7DQorICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCJcJyIsIEwiJmFwb3M7Iik7DQorICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCJcIiIsIEwiJnF1b3Q7Iik7DQorICAgICAgICB3cyArPSB3c1ZhbHVlOw0KKyAgICAgICAgd3MgKz0gTCJcIiI7DQorICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICAgIH0NCisgICAgICBpZiAocE5vZGUtPm1fcENoaWxkID09IE5VTEwpIHsNCisgICAgICAgIHdzID0gTCJcbi8+IjsNCisgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLCB3cy5HZXRMZW5ndGgoKSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHdzID0gTCJcbj4iOw0KKyAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCisgICAgICAgIENGREVfWE1MTm9kZSogcENoaWxkID0gcE5vZGUtPm1fcENoaWxkOw0KKyAgICAgICAgd2hpbGUgKHBDaGlsZCAhPSBOVUxMKSB7DQorICAgICAgICAgIFNhdmVYTUxOb2RlKHBYTUxTdHJlYW0sIChJRkRFX1hNTE5vZGUqKXBDaGlsZCk7DQorICAgICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+bV9wTmV4dDsNCisgICAgICAgIH0NCisgICAgICAgIHdzID0gTCI8LyI7DQorICAgICAgICB3cyArPSAoKENGREVfWE1MRWxlbWVudCopcE5vZGUpLT5tX3dzVGFnOw0KKyAgICAgICAgd3MgKz0gTCJcbj4iOw0KKyAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRkRFX1hNTE5PREVfVGV4dDogew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzID0gKChDRkRFX1hNTFRleHQqKXBOb2RlKS0+bV93c1RleHQ7DQorICAgICAgd3MuUmVwbGFjZShMIiYiLCBMIiZhbXA7Iik7DQorICAgICAgd3MuUmVwbGFjZShMIjwiLCBMIiZsdDsiKTsNCisgICAgICB3cy5SZXBsYWNlKEwiPiIsIEwiJmd0OyIpOw0KKyAgICAgIHdzLlJlcGxhY2UoTCJcJyIsIEwiJmFwb3M7Iik7DQorICAgICAgd3MuUmVwbGFjZShMIlwiIiwgTCImcXVvdDsiKTsNCisgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cywgd3MuR2V0TGVuZ3RoKCkpOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZERV9YTUxOT0RFX0NoYXJEYXRhOiB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3MgPSBMIjwhW0NEQVRBWyI7DQorICAgICAgd3MgKz0gKChDRkRFX1hNTENoYXJEYXRhKilwTm9kZSktPm1fd3NDaGFyRGF0YTsNCisgICAgICB3cyArPSBMIl1dPiI7DQorICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MsIHdzLkdldExlbmd0aCgpKTsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGREVfWE1MTk9ERV9Vbmtub3duOg0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KK30NCit2b2lkIENGREVfWE1MRG9jOjpTYXZlWE1MKElGWF9TdHJlYW0qIHBYTUxTdHJlYW0sIEZYX0JPT0wgYlNhdmVCT00pIHsNCisgIGlmIChwWE1MU3RyZWFtID09IE5VTEwgfHwgcFhNTFN0cmVhbSA9PSBtX3BTdHJlYW0pIHsNCisgICAgbV9wU3RyZWFtLT5TZWVrKEZYX1NUUkVBTVNFRUtfQmVnaW4sIDApOw0KKyAgICBwWE1MU3RyZWFtID0gbV9wU3RyZWFtOw0KKyAgfQ0KKyAgRlhTWVNfYXNzZXJ0KChwWE1MU3RyZWFtLT5HZXRBY2Nlc3NNb2RlcygpICYgRlhfU1RSRUFNQUNDRVNTX1RleHQpICE9IDApOw0KKyAgRlhTWVNfYXNzZXJ0KChwWE1MU3RyZWFtLT5HZXRBY2Nlc3NNb2RlcygpICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSAhPSAwKTsNCisgIEZYX1dPUkQgd0NvZGVQYWdlID0gcFhNTFN0cmVhbS0+R2V0Q29kZVBhZ2UoKTsNCisgIGlmICh3Q29kZVBhZ2UgIT0gRlhfQ09ERVBBR0VfVVRGMTZMRSAmJiB3Q29kZVBhZ2UgIT0gRlhfQ09ERVBBR0VfVVRGMTZCRSAmJg0KKyAgICAgIHdDb2RlUGFnZSAhPSBGWF9DT0RFUEFHRV9VVEY4KSB7DQorICAgIHdDb2RlUGFnZSA9IEZYX0NPREVQQUdFX1VURjg7DQorICAgIHBYTUxTdHJlYW0tPlNldENvZGVQYWdlKHdDb2RlUGFnZSk7DQorICB9DQorICBpZiAoYlNhdmVCT00pIHsNCisgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcoTCJceEZFRkYiLCAxKTsNCisgIH0NCisgIENGREVfWE1MTm9kZSogcE5vZGUgPSBtX3BSb290LT5tX3BDaGlsZDsNCisgIHdoaWxlIChwTm9kZSAhPSBOVUxMKSB7DQorICAgIFNhdmVYTUxOb2RlKHBYTUxTdHJlYW0sIChJRkRFX1hNTE5vZGUqKXBOb2RlKTsNCisgICAgcE5vZGUgPSBwTm9kZS0+bV9wTmV4dDsNCisgIH0NCisgIGlmIChwWE1MU3RyZWFtID09IG1fcFN0cmVhbSkgew0KKyAgICBpbnQzMl90IGlQb3MgPSBwWE1MU3RyZWFtLT5HZXRQb3NpdGlvbigpOw0KKyAgICBwWE1MU3RyZWFtLT5TZXRMZW5ndGgoaVBvcyk7DQorICB9DQorfQ0KK0NGREVfWE1MRE9NUGFyc2VyOjpDRkRFX1hNTERPTVBhcnNlcihDRkRFX1hNTE5vZGUqIHBSb290LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTFN5bnRheFBhcnNlciogcFBhcnNlcikNCisgICAgOiBtX3BQYXJzZXIocFBhcnNlciksDQorICAgICAgbV9wUGFyZW50KHBSb290KSwNCisgICAgICBtX3BDaGlsZChOVUxMKSwNCisgICAgICBtX05vZGVTdGFjaygxNiksDQorICAgICAgbV93czEoKSwNCisgICAgICBtX3dzMigpIHsNCisgIG1fTm9kZVN0YWNrLlB1c2gobV9wUGFyZW50KTsNCit9DQorQ0ZERV9YTUxET01QYXJzZXI6On5DRkRFX1hNTERPTVBhcnNlcigpIHsNCisgIG1fTm9kZVN0YWNrLlJlbW92ZUFsbCgpOw0KKyAgbV93czEuRW1wdHkoKTsNCisgIG1fd3MyLkVtcHR5KCk7DQorfQ0KK2ludDMyX3QgQ0ZERV9YTUxET01QYXJzZXI6OkRvUGFyc2VyKElGWF9QYXVzZSogcFBhdXNlKSB7DQorICBGWF9EV09SRCBkd1JldDsNCisgIGludDMyX3QgaUNvdW50ID0gMDsNCisgIHdoaWxlIChUUlVFKSB7DQorICAgIGR3UmV0ID0gbV9wUGFyc2VyLT5Eb1N5bnRheFBhcnNlKCk7DQorICAgIHN3aXRjaCAoZHdSZXQpIHsNCisgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfSW5zdHJ1Y3Rpb25PcGVuOg0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0luc3RydWN0aW9uQ2xvc2U6DQorICAgICAgICBpZiAobV9wQ2hpbGQtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICAgICAgICBkd1JldCA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wQ2hpbGQgPSBtX3BQYXJlbnQ7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfRWxlbWVudE9wZW46DQorICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0VsZW1lbnRCcmVhazoNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19FbGVtZW50Q2xvc2U6DQorICAgICAgICBpZiAobV9wQ2hpbGQtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICAgIGR3UmV0ID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBtX3BQYXJzZXItPkdldFRhZ05hbWUobV93czEpOw0KKyAgICAgICAgKChDRkRFX1hNTEVsZW1lbnQqKW1fcENoaWxkKS0+R2V0VGFnTmFtZShtX3dzMik7DQorICAgICAgICBpZiAobV93czEuR2V0TGVuZ3RoKCkgPiAwICYmIG1fd3MxLkNvbXBhcmUobV93czIpICE9IDApIHsNCisgICAgICAgICAgZHdSZXQgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIG1fTm9kZVN0YWNrLlBvcCgpOw0KKyAgICAgICAgaWYgKG1fTm9kZVN0YWNrLkdldFNpemUoKSA8IDEpIHsNCisgICAgICAgICAgZHdSZXQgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIG1fcFBhcmVudCA9IChDRkRFX1hNTE5vZGUqKSptX05vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICAgICAgICBtX3BDaGlsZCA9IG1fcFBhcmVudDsNCisgICAgICAgIGlDb3VudCsrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhcmdldE5hbWU6DQorICAgICAgICBtX3BQYXJzZXItPkdldFRhcmdldE5hbWUobV93czEpOw0KKyAgICAgICAgbV9wQ2hpbGQgPSBuZXcgQ0ZERV9YTUxJbnN0cnVjdGlvbihtX3dzMSk7DQorICAgICAgICBtX3BQYXJlbnQtPkluc2VydENoaWxkTm9kZShtX3BDaGlsZCk7DQorICAgICAgICBtX3dzMS5FbXB0eSgpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhZ05hbWU6DQorICAgICAgICBtX3BQYXJzZXItPkdldFRhZ05hbWUobV93czEpOw0KKyAgICAgICAgbV9wQ2hpbGQgPSBuZXcgQ0ZERV9YTUxFbGVtZW50KG1fd3MxKTsNCisgICAgICAgIG1fcFBhcmVudC0+SW5zZXJ0Q2hpbGROb2RlKG1fcENoaWxkKTsNCisgICAgICAgIG1fTm9kZVN0YWNrLlB1c2gobV9wQ2hpbGQpOw0KKyAgICAgICAgbV9wUGFyZW50ID0gbV9wQ2hpbGQ7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfQXR0cmlOYW1lOg0KKyAgICAgICAgbV9wUGFyc2VyLT5HZXRBdHRyaWJ1dGVOYW1lKG1fd3MxKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19BdHRyaVZhbHVlOg0KKyAgICAgICAgaWYgKG1fcENoaWxkID09IE5VTEwpIHsNCisgICAgICAgICAgZHdSZXQgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIG1fcFBhcnNlci0+R2V0QXR0cmlidXRlTmFtZShtX3dzMik7DQorICAgICAgICBpZiAobV9wQ2hpbGQtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICAgICgoQ0ZERV9YTUxFbGVtZW50KiltX3BDaGlsZCktPlNldFN0cmluZyhtX3dzMSwgbV93czIpOw0KKyAgICAgICAgfSBlbHNlIGlmIChtX3BDaGlsZC0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0luc3RydWN0aW9uKSB7DQorICAgICAgICAgICgoQ0ZERV9YTUxJbnN0cnVjdGlvbiopbV9wQ2hpbGQpLT5TZXRTdHJpbmcobV93czEsIG1fd3MyKTsNCisgICAgICAgIH0NCisgICAgICAgIG1fd3MxLkVtcHR5KCk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfVGV4dDoNCisgICAgICAgIG1fcFBhcnNlci0+R2V0VGV4dERhdGEobV93czEpOw0KKyAgICAgICAgbV9wQ2hpbGQgPSBuZXcgQ0ZERV9YTUxUZXh0KG1fd3MxKTsNCisgICAgICAgIG1fcFBhcmVudC0+SW5zZXJ0Q2hpbGROb2RlKG1fcENoaWxkKTsNCisgICAgICAgIG1fcENoaWxkID0gbV9wUGFyZW50Ow0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0NEYXRhOg0KKyAgICAgICAgbV9wUGFyc2VyLT5HZXRUZXh0RGF0YShtX3dzMSk7DQorICAgICAgICBtX3BDaGlsZCA9IG5ldyBDRkRFX1hNTENoYXJEYXRhKG1fd3MxKTsNCisgICAgICAgIG1fcFBhcmVudC0+SW5zZXJ0Q2hpbGROb2RlKG1fcENoaWxkKTsNCisgICAgICAgIG1fcENoaWxkID0gbV9wUGFyZW50Ow0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhcmdldERhdGE6DQorICAgICAgICBpZiAobV9wQ2hpbGQgPT0gTlVMTCB8fA0KKyAgICAgICAgICAgIG1fcENoaWxkLT5HZXRUeXBlKCkgIT0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb24pIHsNCisgICAgICAgICAgZHdSZXQgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlmICghbV93czEuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICgoQ0ZERV9YTUxJbnN0cnVjdGlvbiopbV9wQ2hpbGQpLT5BcHBlbmREYXRhKG1fd3MxKTsNCisgICAgICAgIH0NCisgICAgICAgIG1fcFBhcnNlci0+R2V0VGFyZ2V0RGF0YShtX3dzMSk7DQorICAgICAgICAoKENGREVfWE1MSW5zdHJ1Y3Rpb24qKW1fcENoaWxkKS0+QXBwZW5kRGF0YShtX3dzMSk7DQorICAgICAgICBtX3dzMS5FbXB0eSgpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChkd1JldCA9PSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yIHx8DQorICAgICAgICBkd1JldCA9PSBGREVfWE1MU1lOVEFYU1RBVFVTX0VPUykgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChwUGF1c2UgIT0gTlVMTCAmJiBpQ291bnQgPiA1MDAgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBtX3BQYXJzZXItPkdldFN0YXR1cygpOw0KK30NCitDRkRFX1hNTFNBWFBhcnNlcjo6Q0ZERV9YTUxTQVhQYXJzZXIoRkRFX0xQWE1MUkVBREVSSEFORExFUiBwSGFuZGxlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxTeW50YXhQYXJzZXIqIHBQYXJzZXIpDQorICAgIDogbV9wSGFuZGxlcihwSGFuZGxlciksDQorICAgICAgbV9wUGFyc2VyKHBQYXJzZXIpLA0KKyAgICAgIG1fVGFnU3RhY2soMTYpLA0KKyAgICAgIG1fcFRhZ1RvcChOVUxMKSwNCisgICAgICBtX3dzMSgpLA0KKyAgICAgIG1fd3MyKCkge30NCitDRkRFX1hNTFNBWFBhcnNlcjo6fkNGREVfWE1MU0FYUGFyc2VyKCkgew0KKyAgbV9UYWdTdGFjay5SZW1vdmVBbGwoKTsNCisgIG1fd3MxLkVtcHR5KCk7DQorICBtX3dzMi5FbXB0eSgpOw0KK30NCitpbnQzMl90IENGREVfWE1MU0FYUGFyc2VyOjpEb1BhcnNlcihJRlhfUGF1c2UqIHBQYXVzZSkgew0KKyAgRlhfRFdPUkQgZHdSZXQgPSAwOw0KKyAgaW50MzJfdCBpQ291bnQgPSAwOw0KKyAgd2hpbGUgKFRSVUUpIHsNCisgICAgZHdSZXQgPSBtX3BQYXJzZXItPkRvU3ludGF4UGFyc2UoKTsNCisgICAgc3dpdGNoIChkd1JldCkgew0KKyAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19FbGVtZW50QnJlYWs6DQorICAgICAgICBpZiAobV9wVGFnVG9wID09IE5VTEwpIHsNCisgICAgICAgICAgZHdSZXQgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChtX3BUYWdUb3AtPmVUeXBlID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgICAgbV9wSGFuZGxlci0+T25UYWdCcmVhayhtX3BIYW5kbGVyLCBtX3BUYWdUb3AtPndzVGFnTmFtZSk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfRWxlbWVudENsb3NlOg0KKyAgICAgICAgaWYgKG1fcFRhZ1RvcCA9PSBOVUxMIHx8IG1fcFRhZ1RvcC0+ZVR5cGUgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICBkd1JldCA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wUGFyc2VyLT5HZXRUYWdOYW1lKG1fd3MxKTsNCisgICAgICAgIGlmIChtX3dzMS5HZXRMZW5ndGgoKSA+IDAgJiYgbV93czEuQ29tcGFyZShtX3BUYWdUb3AtPndzVGFnTmFtZSkgIT0gMCkgew0KKyAgICAgICAgICBkd1JldCA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfSBlbHNlIGlmIChtX3dzMS5HZXRMZW5ndGgoKSA9PSAwKSB7DQorICAgICAgICAgIG1fcEhhbmRsZXItPk9uVGFnQnJlYWsobV9wSGFuZGxlciwgbV9wVGFnVG9wLT53c1RhZ05hbWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wSGFuZGxlci0+T25UYWdDbG9zZShtX3BIYW5kbGVyLCBtX3BUYWdUb3AtPndzVGFnTmFtZSk7DQorICAgICAgICBQb3AoKTsNCisgICAgICAgIGlDb3VudCsrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhcmdldE5hbWU6IHsNCisgICAgICAgIG1fcFBhcnNlci0+R2V0VGFyZ2V0TmFtZShtX3dzMSk7DQorICAgICAgICBDRkRFX1hNTFRBRyB4bWxUYWc7DQorICAgICAgICB4bWxUYWcud3NUYWdOYW1lID0gbV93czE7DQorICAgICAgICB4bWxUYWcuZVR5cGUgPSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbjsNCisgICAgICAgIFB1c2goeG1sVGFnKTsNCisgICAgICAgIG1fcEhhbmRsZXItPk9uVGFnRW50ZXIobV9wSGFuZGxlciwgRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFRhZ1RvcC0+d3NUYWdOYW1lKTsNCisgICAgICAgIG1fd3MxLkVtcHR5KCk7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfVGFnTmFtZTogew0KKyAgICAgICAgbV9wUGFyc2VyLT5HZXRUYXJnZXROYW1lKG1fd3MxKTsNCisgICAgICAgIENGREVfWE1MVEFHIHhtbFRhZzsNCisgICAgICAgIHhtbFRhZy53c1RhZ05hbWUgPSBtX3dzMTsNCisgICAgICAgIHhtbFRhZy5lVHlwZSA9IEZERV9YTUxOT0RFX0VsZW1lbnQ7DQorICAgICAgICBQdXNoKHhtbFRhZyk7DQorICAgICAgICBtX3BIYW5kbGVyLT5PblRhZ0VudGVyKG1fcEhhbmRsZXIsIEZERV9YTUxOT0RFX0VsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFRhZ1RvcC0+d3NUYWdOYW1lKTsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19BdHRyaU5hbWU6DQorICAgICAgICBtX3BQYXJzZXItPkdldFRhcmdldE5hbWUobV93czEpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0F0dHJpVmFsdWU6DQorICAgICAgICBtX3BQYXJzZXItPkdldEF0dHJpYnV0ZU5hbWUobV93czIpOw0KKyAgICAgICAgaWYgKG1fcFRhZ1RvcCA9PSBOVUxMKSB7DQorICAgICAgICAgIGR3UmV0ID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBpZiAobV9wVGFnVG9wLT5lVHlwZSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICAgIG1fcEhhbmRsZXItPk9uQXR0cmlidXRlKG1fcEhhbmRsZXIsIG1fd3MxLCBtX3dzMik7DQorICAgICAgICB9DQorICAgICAgICBtX3dzMS5FbXB0eSgpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0NEYXRhOg0KKyAgICAgICAgbV9wUGFyc2VyLT5HZXRUZXh0RGF0YShtX3dzMSk7DQorICAgICAgICBtX3BIYW5kbGVyLT5PbkRhdGEobV9wSGFuZGxlciwgRkRFX1hNTE5PREVfQ2hhckRhdGEsIG1fd3MxKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19UZXh0Og0KKyAgICAgICAgbV9wUGFyc2VyLT5HZXRUZXh0RGF0YShtX3dzMSk7DQorICAgICAgICBtX3BIYW5kbGVyLT5PbkRhdGEobV9wSGFuZGxlciwgRkRFX1hNTE5PREVfVGV4dCwgbV93czEpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhcmdldERhdGE6DQorICAgICAgICBtX3BQYXJzZXItPkdldFRhcmdldERhdGEobV93czEpOw0KKyAgICAgICAgbV9wSGFuZGxlci0+T25EYXRhKG1fcEhhbmRsZXIsIEZERV9YTUxOT0RFX0luc3RydWN0aW9uLCBtX3dzMSk7DQorICAgICAgICBtX3dzMS5FbXB0eSgpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChkd1JldCA9PSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yIHx8DQorICAgICAgICBkd1JldCA9PSBGREVfWE1MU1lOVEFYU1RBVFVTX0VPUykgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChwUGF1c2UgIT0gTlVMTCAmJiBpQ291bnQgPiA1MDAgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBtX3BQYXJzZXItPkdldFN0YXR1cygpOw0KK30NCitpbmxpbmUgdm9pZCBDRkRFX1hNTFNBWFBhcnNlcjo6UHVzaChjb25zdCBDRkRFX1hNTFRBRyYgeG1sVGFnKSB7DQorICBtX1RhZ1N0YWNrLlB1c2goeG1sVGFnKTsNCisgIG1fcFRhZ1RvcCA9IG1fVGFnU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KK30NCitpbmxpbmUgdm9pZCBDRkRFX1hNTFNBWFBhcnNlcjo6UG9wKCkgew0KKyAgbV9UYWdTdGFjay5Qb3AoKTsNCisgIG1fcFRhZ1RvcCA9IG1fVGFnU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KK30NCisjaWZkZWYgX0ZERV9CTE9DS19CVUZGRVINCitDRkRFX0Jsb2NrQnVmZmVyOjpDRkRFX0Jsb2NrQnVmZmVyKGludDMyX3QgaUFsbG9jU3RlcCkNCisgICAgOiBtX2lEYXRhTGVuZ3RoKDApLA0KKyAgICAgIG1faUJ1ZmZlclNpemUoMCksDQorICAgICAgbV9pQWxsb2NTdGVwKGlBbGxvY1N0ZXApLA0KKyAgICAgIG1faVN0YXJ0UG9zaXRpb24oMCkgew0KK30NCitDRkRFX0Jsb2NrQnVmZmVyOjp+Q0ZERV9CbG9ja0J1ZmZlcigpIHsNCisgIENsZWFyQnVmZmVyKCk7DQorfQ0KK0ZYX1dDSEFSKiBDRkRFX0Jsb2NrQnVmZmVyOjpHZXRBdmFpbGFibGVCbG9jayhpbnQzMl90JiBpSW5kZXhJbkJsb2NrKSB7DQorICBpSW5kZXhJbkJsb2NrID0gMDsNCisgIGlmICghbV9CbG9ja0FycmF5LkdldFNpemUoKSkgew0KKyAgICByZXR1cm4gbnVsbHB0cjsNCisgIH0NCisgIGludDMyX3QgaVJlYWxJbmRleCA9IG1faVN0YXJ0UG9zaXRpb24gKyBtX2lEYXRhTGVuZ3RoOw0KKyAgaWYgKGlSZWFsSW5kZXggPT0gbV9pQnVmZmVyU2l6ZSkgew0KKyAgICBGWF9XQ0hBUiogcEJsb2NrID0gRlhfQWxsb2MoRlhfV0NIQVIsIG1faUFsbG9jU3RlcCk7DQorICAgIG1fQmxvY2tBcnJheS5BZGQocEJsb2NrKTsNCisgICAgbV9pQnVmZmVyU2l6ZSArPSBtX2lBbGxvY1N0ZXA7DQorICAgIHJldHVybiBwQmxvY2s7DQorICB9DQorICBpSW5kZXhJbkJsb2NrID0gaVJlYWxJbmRleCAlIG1faUFsbG9jU3RlcDsNCisgIHJldHVybiAoRlhfV0NIQVIqKW1fQmxvY2tBcnJheVtpUmVhbEluZGV4IC8gbV9pQWxsb2NTdGVwXTsNCit9DQorRlhfQk9PTCBDRkRFX0Jsb2NrQnVmZmVyOjpJbml0QnVmZmVyKGludDMyX3QgaUJ1ZmZlclNpemUpIHsNCisgIENsZWFyQnVmZmVyKCk7DQorICBpbnQzMl90IGlOdW1PZkJsb2NrID0gKGlCdWZmZXJTaXplIC0gMSkgLyBtX2lBbGxvY1N0ZXAgKyAxOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaU51bU9mQmxvY2s7IGkrKykgew0KKyAgICBtX0Jsb2NrQXJyYXkuQWRkKEZYX0FsbG9jKEZYX1dDSEFSLCBtX2lBbGxvY1N0ZXApKTsNCisgIH0NCisgIG1faUJ1ZmZlclNpemUgPSBpTnVtT2ZCbG9jayAqIG1faUFsbG9jU3RlcDsNCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENGREVfQmxvY2tCdWZmZXI6OlNldFRleHRDaGFyKGludDMyX3QgaUluZGV4LCBGWF9XQ0hBUiBjaCkgew0KKyAgaWYgKGlJbmRleCA8IDApIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpUmVhbEluZGV4ID0gbV9pU3RhcnRQb3NpdGlvbiArIGlJbmRleDsNCisgIGludDMyX3QgaUJsb2NrSW5kZXggPSBpUmVhbEluZGV4IC8gbV9pQWxsb2NTdGVwOw0KKyAgaW50MzJfdCBpSW5uZXJJbmRleCA9IGlSZWFsSW5kZXggJSBtX2lBbGxvY1N0ZXA7DQorICBpbnQzMl90IGlCbG9ja1NpemUgPSBtX0Jsb2NrQXJyYXkuR2V0U2l6ZSgpOw0KKyAgaWYgKGlCbG9ja0luZGV4ID49IGlCbG9ja1NpemUpIHsNCisgICAgaW50MzJfdCBpTmV3QmxvY2tzID0gaUJsb2NrSW5kZXggLSBpQmxvY2tTaXplICsgMTsNCisgICAgZG8gew0KKyAgICAgIEZYX1dDSEFSKiBwQmxvY2sgPSBGWF9BbGxvYyhGWF9XQ0hBUiwgbV9pQWxsb2NTdGVwKTsNCisgICAgICBtX0Jsb2NrQXJyYXkuQWRkKHBCbG9jayk7DQorICAgICAgbV9pQnVmZmVyU2l6ZSArPSBtX2lBbGxvY1N0ZXA7DQorICAgIH0gd2hpbGUgKC0taU5ld0Jsb2Nrcyk7DQorICB9DQorICBGWF9XQ0hBUiogcFRleHREYXRhID0gKEZYX1dDSEFSKiltX0Jsb2NrQXJyYXlbaUJsb2NrSW5kZXhdOw0KKyAgKihwVGV4dERhdGEgKyBpSW5uZXJJbmRleCkgPSBjaDsNCisgIGlmIChtX2lEYXRhTGVuZ3RoIDw9IGlJbmRleCkgew0KKyAgICBtX2lEYXRhTGVuZ3RoID0gaUluZGV4ICsgMTsNCisgIH0NCit9DQoraW50MzJfdCBDRkRFX0Jsb2NrQnVmZmVyOjpEZWxldGVUZXh0Q2hhcnMoaW50MzJfdCBpQ291bnQsIEZYX0JPT0wgYkRpcmVjdGlvbikgew0KKyAgaWYgKGlDb3VudCA8PSAwKSB7DQorICAgIHJldHVybiBtX2lEYXRhTGVuZ3RoOw0KKyAgfQ0KKyAgaWYgKGlDb3VudCA+PSBtX2lEYXRhTGVuZ3RoKSB7DQorICAgIFJlc2V0KEZBTFNFKTsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpZiAoYkRpcmVjdGlvbikgew0KKyAgICBtX2lTdGFydFBvc2l0aW9uICs9IGlDb3VudDsNCisgICAgbV9pRGF0YUxlbmd0aCAtPSBpQ291bnQ7DQorICB9IGVsc2Ugew0KKyAgICBtX2lEYXRhTGVuZ3RoIC09IGlDb3VudDsNCisgIH0NCisgIHJldHVybiBtX2lEYXRhTGVuZ3RoOw0KK30NCit2b2lkIENGREVfQmxvY2tCdWZmZXI6OkdldFRleHREYXRhKENGWF9XaWRlU3RyaW5nJiB3c1RleHREYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgpIGNvbnN0IHsNCisgIHdzVGV4dERhdGEuRW1wdHkoKTsNCisgIGludDMyX3QgaU1heWJlRGF0YUxlbmd0aCA9IG1faUJ1ZmZlclNpemUgLSAxIC0gbV9pU3RhcnRQb3NpdGlvbjsNCisgIGlmIChpU3RhcnQgPCAwIHx8IGlTdGFydCA+IGlNYXliZURhdGFMZW5ndGgpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKGlMZW5ndGggPT0gLTEgfHwgaUxlbmd0aCA+IGlNYXliZURhdGFMZW5ndGgpIHsNCisgICAgaUxlbmd0aCA9IGlNYXliZURhdGFMZW5ndGg7DQorICB9DQorICBpZiAoaUxlbmd0aCA8PSAwKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX1dDSEFSKiBwQnVmID0gd3NUZXh0RGF0YS5HZXRCdWZmZXIoaUxlbmd0aCk7DQorICBpZiAoIXBCdWYpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpU3RhcnRCbG9ja0luZGV4ID0gMDsNCisgIGludDMyX3QgaVN0YXJ0SW5uZXJJbmRleCA9IDA7DQorICBUZXh0RGF0YUluZGV4MkJ1ZkluZGV4KGlTdGFydCwgaVN0YXJ0QmxvY2tJbmRleCwgaVN0YXJ0SW5uZXJJbmRleCk7DQorICBpbnQzMl90IGlFbmRCbG9ja0luZGV4ID0gMDsNCisgIGludDMyX3QgaUVuZElubmVySW5kZXggPSAwOw0KKyAgVGV4dERhdGFJbmRleDJCdWZJbmRleChpU3RhcnQgKyBpTGVuZ3RoLCBpRW5kQmxvY2tJbmRleCwgaUVuZElubmVySW5kZXgpOw0KKyAgaW50MzJfdCBpUG9pbnRlciA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IGlTdGFydEJsb2NrSW5kZXg7IGkgPD0gaUVuZEJsb2NrSW5kZXg7IGkrKykgew0KKyAgICBpbnQzMl90IGlCdWZmZXJQb2ludGVyID0gMDsNCisgICAgaW50MzJfdCBpQ29weUxlbmd0aCA9IG1faUFsbG9jU3RlcDsNCisgICAgaWYgKGkgPT0gaVN0YXJ0QmxvY2tJbmRleCkgew0KKyAgICAgIGlDb3B5TGVuZ3RoIC09IGlTdGFydElubmVySW5kZXg7DQorICAgICAgaUJ1ZmZlclBvaW50ZXIgPSBpU3RhcnRJbm5lckluZGV4Ow0KKyAgICB9DQorICAgIGlmIChpID09IGlFbmRCbG9ja0luZGV4KSB7DQorICAgICAgaUNvcHlMZW5ndGggLT0gKChtX2lBbGxvY1N0ZXAgLSAxKSAtIGlFbmRJbm5lckluZGV4KTsNCisgICAgfQ0KKyAgICBGWF9XQ0hBUiogcEJsb2NrQnVmID0gKEZYX1dDSEFSKiltX0Jsb2NrQXJyYXlbaV07DQorICAgIEZYU1lTX21lbWNweShwQnVmICsgaVBvaW50ZXIsIHBCbG9ja0J1ZiArIGlCdWZmZXJQb2ludGVyLA0KKyAgICAgICAgICAgICAgICAgaUNvcHlMZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgaVBvaW50ZXIgKz0gaUNvcHlMZW5ndGg7DQorICB9DQorICB3c1RleHREYXRhLlJlbGVhc2VCdWZmZXIoaUxlbmd0aCk7DQorfQ0KK3ZvaWQgQ0ZERV9CbG9ja0J1ZmZlcjo6VGV4dERhdGFJbmRleDJCdWZJbmRleChjb25zdCBpbnQzMl90IGlJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUJsb2NrSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlJbm5lckluZGV4KSBjb25zdCB7DQorICBGWFNZU19hc3NlcnQoaUluZGV4ID49IDApOw0KKyAgaW50MzJfdCBpUmVhbEluZGV4ID0gbV9pU3RhcnRQb3NpdGlvbiArIGlJbmRleDsNCisgIGlCbG9ja0luZGV4ID0gaVJlYWxJbmRleCAvIG1faUFsbG9jU3RlcDsNCisgIGlJbm5lckluZGV4ID0gaVJlYWxJbmRleCAlIG1faUFsbG9jU3RlcDsNCit9DQordm9pZCBDRkRFX0Jsb2NrQnVmZmVyOjpDbGVhckJ1ZmZlcigpIHsNCisgIG1faUJ1ZmZlclNpemUgPSAwOw0KKyAgaW50MzJfdCBpU2l6ZSA9IG1fQmxvY2tBcnJheS5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgaSsrKSB7DQorICAgIEZYX0ZyZWUobV9CbG9ja0FycmF5W2ldKTsNCisgICAgbV9CbG9ja0FycmF5W2ldID0gTlVMTDsNCisgIH0NCisgIG1fQmxvY2tBcnJheS5SZW1vdmVBbGwoKTsNCit9DQorI2VuZGlmDQorSUZERV9YTUxTeW50YXhQYXJzZXIqIElGREVfWE1MU3ludGF4UGFyc2VyOjpDcmVhdGUoKSB7DQorICByZXR1cm4gbmV3IENGREVfWE1MU3ludGF4UGFyc2VyOw0KK30NCisjaWZkZWYgX0ZERV9CTE9DS19CVUZGRVINCitDRkRFX1hNTFN5bnRheFBhcnNlcjo6Q0ZERV9YTUxTeW50YXhQYXJzZXIoKQ0KKyAgICA6IG1fcFN0cmVhbShudWxscHRyKSwNCisgICAgICBtX2lYTUxQbGFuZVNpemUoLTEpLA0KKyAgICAgIG1faUN1cnJlbnRQb3MoMCksDQorICAgICAgbV9pQ3VycmVudE5vZGVOdW0oLTEpLA0KKyAgICAgIG1faUxhc3ROb2RlTnVtKC0xKSwNCisgICAgICBtX2lQYXJzZWRDaGFycygwKSwNCisgICAgICBtX2lQYXJzZWRCeXRlcygwKSwNCisgICAgICBtX3BCdWZmZXIobnVsbHB0ciksDQorICAgICAgbV9pQnVmZmVyQ2hhcnMoMCksDQorICAgICAgbV9iRU9TKEZBTFNFKSwNCisgICAgICBtX3BTdGFydChudWxscHRyKSwNCisgICAgICBtX3BFbmQobnVsbHB0ciksDQorICAgICAgbV9YTUxOb2RlU3RhY2soMTYpLA0KKyAgICAgIG1faUFsbG9jU3RlcChtX0Jsb2NrQnVmZmVyLkdldEFsbG9jU3RlcCgpKSwNCisgICAgICBtX2lEYXRhTGVuZ3RoKG1fQmxvY2tCdWZmZXIuR2V0RGF0YUxlbmd0aFJlZigpKSwNCisgICAgICBtX3BDdXJyZW50QmxvY2sobnVsbHB0ciksDQorICAgICAgbV9pSW5kZXhJbkJsb2NrKDApLA0KKyAgICAgIG1faVRleHREYXRhTGVuZ3RoKDApLA0KKyAgICAgIG1fZHdTdGF0dXMoRkRFX1hNTFNZTlRBWFNUQVRVU19Ob25lKSwNCisgICAgICBtX2R3TW9kZShGREVfWE1MU1lOVEFYTU9ERV9UZXh0KSwNCisgICAgICBtX3dRdW90YXRpb25NYXJrKDApLA0KKyAgICAgIG1faUVudGl0eVN0YXJ0KC0xKSwNCisgICAgICBtX1NraXBTdGFjaygxNikgew0KKyAgbV9DdXJOb2RlLmlOb2RlTnVtID0gLTE7DQorICBtX0N1ck5vZGUuZU5vZGVUeXBlID0gRkRFX1hNTE5PREVfVW5rbm93bjsNCit9DQordm9pZCBDRkRFX1hNTFN5bnRheFBhcnNlcjo6SW5pdChJRlhfU3RyZWFtKiBwU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpWE1MUGxhbmVTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVGV4dERhdGFTaXplKSB7DQorICBGWFNZU19hc3NlcnQobV9wU3RyZWFtID09IE5VTEwgJiYgbV9wQnVmZmVyID09IE5VTEwpOw0KKyAgRlhTWVNfYXNzZXJ0KHBTdHJlYW0gIT0gTlVMTCAmJiBpWE1MUGxhbmVTaXplID4gMCk7DQorICBpbnQzMl90IGlTdHJlYW1MZW5ndGggPSBwU3RyZWFtLT5HZXRMZW5ndGgoKTsNCisgIEZYU1lTX2Fzc2VydChpU3RyZWFtTGVuZ3RoID4gMCk7DQorICBtX3BTdHJlYW0gPSBwU3RyZWFtOw0KKyAgbV9pWE1MUGxhbmVTaXplID0gc3RkOjptaW4oaVhNTFBsYW5lU2l6ZSwgaVN0cmVhbUxlbmd0aCk7DQorICB1aW50OF90IGJvbVs0XTsNCisgIG1faUN1cnJlbnRQb3MgPSBtX3BTdHJlYW0tPkdldEJPTShib20pOw0KKyAgRlhTWVNfYXNzZXJ0KG1fcEJ1ZmZlciA9PSBOVUxMKTsNCisgIG1fcEJ1ZmZlciA9IEZYX0FsbG9jKEZYX1dDSEFSLCBtX2lYTUxQbGFuZVNpemUpOw0KKyAgbV9wU3RhcnQgPSBtX3BFbmQgPSBtX3BCdWZmZXI7DQorICBGWFNZU19hc3NlcnQoIW1fQmxvY2tCdWZmZXIuSXNJbml0aWFsaXplZCgpKTsNCisgIG1fQmxvY2tCdWZmZXIuSW5pdEJ1ZmZlcigpOw0KKyAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgbV9pUGFyc2VkQnl0ZXMgPSBtX2lQYXJzZWRDaGFycyA9IDA7DQorICBtX2lCdWZmZXJDaGFycyA9IDA7DQorfQ0KK0ZYX0RXT1JEIENGREVfWE1MU3ludGF4UGFyc2VyOjpEb1N5bnRheFBhcnNlKCkgew0KKyAgaWYgKG1fZHdTdGF0dXMgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvciB8fA0KKyAgICAgIG1fZHdTdGF0dXMgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FT1MpIHsNCisgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorICB9DQorICBGWFNZU19hc3NlcnQobV9wU3RyZWFtICYmIG1fcEJ1ZmZlciAmJiBtX0Jsb2NrQnVmZmVyLklzSW5pdGlhbGl6ZWQoKSk7DQorICBpbnQzMl90IGlTdHJlYW1MZW5ndGggPSBtX3BTdHJlYW0tPkdldExlbmd0aCgpOw0KKyAgaW50MzJfdCBpUG9zOw0KKyAgRlhfV0NIQVIgY2g7DQorICBGWF9EV09SRCBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfTm9uZTsNCisgIHdoaWxlIChUUlVFKSB7DQorICAgIGlmIChtX3BTdGFydCA+PSBtX3BFbmQpIHsNCisgICAgICBpZiAobV9iRU9TIHx8IG1faUN1cnJlbnRQb3MgPj0gaVN0cmVhbUxlbmd0aCkgew0KKyAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRU9TOw0KKyAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorICAgICAgfQ0KKyAgICAgIG1faVBhcnNlZENoYXJzICs9IChtX3BFbmQgLSBtX3BCdWZmZXIpOw0KKyAgICAgIG1faVBhcnNlZEJ5dGVzID0gbV9pQ3VycmVudFBvczsNCisgICAgICBtX3BTdHJlYW0tPkxvY2soKTsNCisgICAgICBpZiAobV9wU3RyZWFtLT5HZXRQb3NpdGlvbigpICE9IG1faUN1cnJlbnRQb3MpIHsNCisgICAgICAgIG1fcFN0cmVhbS0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCBtX2lDdXJyZW50UG9zKTsNCisgICAgICB9DQorICAgICAgbV9pQnVmZmVyQ2hhcnMgPQ0KKyAgICAgICAgICBtX3BTdHJlYW0tPlJlYWRTdHJpbmcobV9wQnVmZmVyLCBtX2lYTUxQbGFuZVNpemUsIG1fYkVPUyk7DQorICAgICAgaVBvcyA9IG1fcFN0cmVhbS0+R2V0UG9zaXRpb24oKTsNCisgICAgICBtX3BTdHJlYW0tPlVubG9jaygpOw0KKyAgICAgIGlmIChtX2lCdWZmZXJDaGFycyA8IDEpIHsNCisgICAgICAgIG1faUN1cnJlbnRQb3MgPSBpU3RyZWFtTGVuZ3RoOw0KKyAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRU9TOw0KKyAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorICAgICAgfQ0KKyAgICAgIG1faUN1cnJlbnRQb3MgPSBpUG9zOw0KKyAgICAgIG1fcFN0YXJ0ID0gbV9wQnVmZmVyOw0KKyAgICAgIG1fcEVuZCA9IG1fcEJ1ZmZlciArIG1faUJ1ZmZlckNoYXJzOw0KKyAgICB9DQorICAgIHdoaWxlIChtX3BTdGFydCA8IG1fcEVuZCkgew0KKyAgICAgIGNoID0gKm1fcFN0YXJ0Ow0KKyAgICAgIHN3aXRjaCAobV9kd01vZGUpIHsNCisgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfVGV4dDoNCisgICAgICAgICAgaWYgKGNoID09IEwnPCcpIHsNCisgICAgICAgICAgICBpZiAobV9pRGF0YUxlbmd0aCA+IDApIHsNCisgICAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoID0gbV9pRGF0YUxlbmd0aDsNCisgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuUmVzZXQoKTsNCisgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9DQorICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgICAgbV9pRW50aXR5U3RhcnQgPSAtMTsNCisgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19UZXh0Ow0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9Ob2RlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBQYXJzZVRleHRDaGFyKGNoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfTm9kZToNCisgICAgICAgICAgaWYgKGNoID09IEwnIScpIHsNCisgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfU2tpcENvbW1lbnRPckRlY2w7DQorICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gTCcvJykgew0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9DbG9zZUVsZW1lbnQ7DQorICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gTCc/Jykgew0KKyAgICAgICAgICAgIG1faUxhc3ROb2RlTnVtKys7DQorICAgICAgICAgICAgbV9pQ3VycmVudE5vZGVOdW0gPSBtX2lMYXN0Tm9kZU51bTsNCisgICAgICAgICAgICBtX0N1ck5vZGUuaU5vZGVOdW0gPSBtX2lMYXN0Tm9kZU51bTsNCisgICAgICAgICAgICBtX0N1ck5vZGUuZU5vZGVUeXBlID0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb247DQorICAgICAgICAgICAgbV9YTUxOb2RlU3RhY2suUHVzaChtX0N1ck5vZGUpOw0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXQ7DQorICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0luc3RydWN0aW9uT3BlbjsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtX2lMYXN0Tm9kZU51bSsrOw0KKyAgICAgICAgICAgIG1faUN1cnJlbnROb2RlTnVtID0gbV9pTGFzdE5vZGVOdW07DQorICAgICAgICAgICAgbV9DdXJOb2RlLmlOb2RlTnVtID0gbV9pTGFzdE5vZGVOdW07DQorICAgICAgICAgICAgbV9DdXJOb2RlLmVOb2RlVHlwZSA9IEZERV9YTUxOT0RFX0VsZW1lbnQ7DQorICAgICAgICAgICAgbV9YTUxOb2RlU3RhY2suUHVzaChtX0N1ck5vZGUpOw0KKyAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGFnOw0KKyAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FbGVtZW50T3BlbjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfVGFyZ2V0Og0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9UYWc6DQorICAgICAgICAgIGlmICghRkRFX0lzWE1MTmFtZUNoYXIoY2gsIG1faURhdGFMZW5ndGggPCAxKSkgew0KKyAgICAgICAgICAgIGlmIChtX2lEYXRhTGVuZ3RoIDwgMSkgew0KKyAgICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhTGVuZ3RoOw0KKyAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5SZXNldCgpOw0KKyAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0NCisgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQorICAgICAgICAgICAgICBpZiAobV9kd01vZGUgIT0gRkRFX1hNTFNZTlRBWE1PREVfVGFyZ2V0KSB7DQorICAgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19UYWdOYW1lOw0KKyAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhcmdldE5hbWU7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpTmFtZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKG1faUluZGV4SW5CbG9jayA9PSBtX2lBbGxvY1N0ZXApIHsNCisgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9DQorICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgICAgaWYgKCFtX3BDdXJyZW50QmxvY2spIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9ja1ttX2lJbmRleEluQmxvY2srK10gPSBjaDsNCisgICAgICAgICAgICBtX2lEYXRhTGVuZ3RoKys7DQorICAgICAgICAgICAgbV9wU3RhcnQrKzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlOYW1lOg0KKyAgICAgICAgICBpZiAobV9pRGF0YUxlbmd0aCA8IDEgJiYgRkRFX0lzWE1MV2hpdGVTcGFjZShjaCkpIHsNCisgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmICghRkRFX0lzWE1MTmFtZUNoYXIoY2gsIG1faURhdGFMZW5ndGggPCAxKSkgew0KKyAgICAgICAgICAgIGlmIChtX2lEYXRhTGVuZ3RoIDwgMSkgew0KKyAgICAgICAgICAgICAgaWYgKG1fQ3VyTm9kZS5lTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gTCc+JyB8fCBjaCA9PSBMJy8nKSB7DQorICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9CcmVha0VsZW1lbnQ7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0gZWxzZSBpZiAobV9DdXJOb2RlLmVOb2RlVHlwZSA9PSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gTCc/Jykgew0KKyAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfQ2xvc2VJbnN0cnVjdGlvbjsNCisgICAgICAgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGFyZ2V0RGF0YTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIGlmIChtX0N1ck5vZGUuZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX0luc3RydWN0aW9uKSB7DQorICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnPScgJiYgIUZERV9Jc1hNTFdoaXRlU3BhY2UoY2gpKSB7DQorICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXREYXRhOw0KKyAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBtX2lUZXh0RGF0YUxlbmd0aCA9IG1faURhdGFMZW5ndGg7DQorICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KCk7DQorICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2sgPQ0KKyAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsNCisgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlFcXVhbFNpZ247DQorICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfQXR0cmlOYW1lOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAobV9pSW5kZXhJbkJsb2NrID09IG1faUFsbG9jU3RlcCkgew0KKyAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0NCisgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQorICAgICAgICAgICAgICBpZiAoIW1fcEN1cnJlbnRCbG9jaykgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrW21faUluZGV4SW5CbG9jaysrXSA9IGNoOw0KKyAgICAgICAgICAgIG1faURhdGFMZW5ndGgrKzsNCisgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaUVxdWFsU2lnbjoNCisgICAgICAgICAgaWYgKEZERV9Jc1hNTFdoaXRlU3BhY2UoY2gpKSB7DQorICAgICAgICAgICAgbV9wU3RhcnQrKzsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoY2ggIT0gTCc9Jykgew0KKyAgICAgICAgICAgIGlmIChtX0N1ck5vZGUuZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX0luc3RydWN0aW9uKSB7DQorICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RhcmdldERhdGE7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaVF1b3RhdGlvbjsNCisgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaVF1b3RhdGlvbjoNCisgICAgICAgICAgaWYgKEZERV9Jc1hNTFdoaXRlU3BhY2UoY2gpKSB7DQorICAgICAgICAgICAgbV9wU3RhcnQrKzsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoY2ggIT0gTCdcIicgJiYgY2ggIT0gTCdcJycpIHsNCisgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtX3dRdW90YXRpb25NYXJrID0gY2g7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaVZhbHVlOw0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpVmFsdWU6DQorICAgICAgICAgIGlmIChjaCA9PSBtX3dRdW90YXRpb25NYXJrKSB7DQorICAgICAgICAgICAgaWYgKG1faUVudGl0eVN0YXJ0ID4gLTEpIHsNCisgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoID0gbV9pRGF0YUxlbmd0aDsNCisgICAgICAgICAgICBtX3dRdW90YXRpb25NYXJrID0gMDsNCisgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KCk7DQorICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaU5hbWU7DQorICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0F0dHJpVmFsdWU7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgUGFyc2VUZXh0Q2hhcihjaCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX0Nsb3NlSW5zdHJ1Y3Rpb246DQorICAgICAgICAgIGlmIChjaCAhPSBMJz4nKSB7DQorICAgICAgICAgICAgaWYgKG1faUluZGV4SW5CbG9jayA9PSBtX2lBbGxvY1N0ZXApIHsNCisgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9DQorICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgICAgaWYgKCFtX3BDdXJyZW50QmxvY2spIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9ja1ttX2lJbmRleEluQmxvY2srK10gPSBjaDsNCisgICAgICAgICAgICBtX2lEYXRhTGVuZ3RoKys7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXREYXRhOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKG1faURhdGFMZW5ndGggPiAwKSB7DQorICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhTGVuZ3RoOw0KKyAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuUmVzZXQoKTsNCisgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2sgPSBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQorICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhcmdldERhdGE7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbV9wU3RhcnQrKzsNCisgICAgICAgICAgICBGREVfTFBYTUxOT0RFIHBYTUxOb2RlID0gbV9YTUxOb2RlU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KKyAgICAgICAgICAgIGlmIChwWE1MTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX1hNTE5vZGVTdGFjay5Qb3AoKTsNCisgICAgICAgICAgICBwWE1MTm9kZSA9IG1fWE1MTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgICAgICAgICBpZiAocFhNTE5vZGUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgbV9DdXJOb2RlLmlOb2RlTnVtID0gLTE7DQorICAgICAgICAgICAgICBtX0N1ck5vZGUuZU5vZGVUeXBlID0gRkRFX1hNTE5PREVfVW5rbm93bjsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgbV9DdXJOb2RlID0gKnBYTUxOb2RlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX2lDdXJyZW50Tm9kZU51bSA9IG1fQ3VyTm9kZS5pTm9kZU51bTsNCisgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KCk7DQorICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGV4dDsNCisgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfSW5zdHJ1Y3Rpb25DbG9zZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfQnJlYWtFbGVtZW50Og0KKyAgICAgICAgICBpZiAoY2ggPT0gTCc+Jykgew0KKyAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGV4dDsNCisgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRWxlbWVudEJyZWFrOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKGNoID09IEwnLycpIHsNCisgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0Nsb3NlRWxlbWVudDsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfQ2xvc2VFbGVtZW50Og0KKyAgICAgICAgICBpZiAoIUZERV9Jc1hNTE5hbWVDaGFyKGNoLCBtX2lEYXRhTGVuZ3RoIDwgMSkpIHsNCisgICAgICAgICAgICBpZiAoY2ggPT0gTCc+Jykgew0KKyAgICAgICAgICAgICAgRkRFX0xQWE1MTk9ERSBwWE1MTm9kZSA9IG1fWE1MTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgICAgICAgICAgIGlmIChwWE1MTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIG1fWE1MTm9kZVN0YWNrLlBvcCgpOw0KKyAgICAgICAgICAgICAgcFhNTE5vZGUgPSBtX1hNTE5vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICAgICAgICAgICAgICBpZiAocFhNTE5vZGUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICBtX0N1ck5vZGUuaU5vZGVOdW0gPSAtMTsNCisgICAgICAgICAgICAgICAgbV9DdXJOb2RlLmVOb2RlVHlwZSA9IEZERV9YTUxOT0RFX1Vua25vd247DQorICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBtX0N1ck5vZGUgPSAqcFhNTE5vZGU7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBtX2lDdXJyZW50Tm9kZU51bSA9IG1fQ3VyTm9kZS5pTm9kZU51bTsNCisgICAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoID0gbV9pRGF0YUxlbmd0aDsNCisgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuUmVzZXQoKTsNCisgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9DQorICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0Ow0KKyAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0VsZW1lbnRDbG9zZTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKCFGREVfSXNYTUxXaGl0ZVNwYWNlKGNoKSkgew0KKyAgICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKG1faUluZGV4SW5CbG9jayA9PSBtX2lBbGxvY1N0ZXApIHsNCisgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9DQorICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgICAgaWYgKCFtX3BDdXJyZW50QmxvY2spIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9ja1ttX2lJbmRleEluQmxvY2srK10gPSBjaDsNCisgICAgICAgICAgICBtX2lEYXRhTGVuZ3RoKys7DQorICAgICAgICAgIH0NCisgICAgICAgICAgbV9wU3RhcnQrKzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX1NraXBDb21tZW50T3JEZWNsOg0KKyAgICAgICAgICBpZiAoY2ggPT0gJy0nKSB7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9Ta2lwQ29tbWVudDsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1NraXBEZWNsTm9kZTsNCisgICAgICAgICAgICBtX1NraXBDaGFyID0gTCc+JzsNCisgICAgICAgICAgICBtX1NraXBTdGFjay5QdXNoKEwnPicpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9Ta2lwRGVjbE5vZGU6DQorICAgICAgICAgIGlmIChtX1NraXBDaGFyID09IEwnXCcnIHx8IG1fU2tpcENoYXIgPT0gTCdcIicpIHsNCisgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICAgIGlmIChjaCAhPSBtX1NraXBDaGFyKSB7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9Ta2lwU3RhY2suUG9wKCk7DQorICAgICAgICAgICAgRlhfRFdPUkQqIHBEV29yZCA9IG1fU2tpcFN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgICAgICAgICBpZiAocERXb3JkID09IE5VTEwpIHsNCisgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGV4dDsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IChGWF9XQ0hBUikqcERXb3JkOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7DQorICAgICAgICAgICAgICBjYXNlIEwnPCc6DQorICAgICAgICAgICAgICAgIG1fU2tpcENoYXIgPSBMJz4nOw0KKyAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5QdXNoKEwnPicpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgIGNhc2UgTCdbJzoNCisgICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IEwnXSc7DQorICAgICAgICAgICAgICAgIG1fU2tpcFN0YWNrLlB1c2goTCddJyk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgY2FzZSBMJygnOg0KKyAgICAgICAgICAgICAgICBtX1NraXBDaGFyID0gTCcpJzsNCisgICAgICAgICAgICAgICAgbV9Ta2lwU3RhY2suUHVzaChMJyknKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICBjYXNlIEwnXCcnOg0KKyAgICAgICAgICAgICAgICBtX1NraXBDaGFyID0gTCdcJyc7DQorICAgICAgICAgICAgICAgIG1fU2tpcFN0YWNrLlB1c2goTCdcJycpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgIGNhc2UgTCdcIic6DQorICAgICAgICAgICAgICAgIG1fU2tpcENoYXIgPSBMJ1wiJzsNCisgICAgICAgICAgICAgICAgbV9Ta2lwU3RhY2suUHVzaChMJ1wiJyk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgaWYgKGNoID09IG1fU2tpcENoYXIpIHsNCisgICAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5Qb3AoKTsNCisgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcERXb3JkID0gbV9Ta2lwU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KKyAgICAgICAgICAgICAgICAgIGlmIChwRFdvcmQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1faURhdGFMZW5ndGggPj0gOSkgew0KKyAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0hlYWRlcjsNCisgICAgICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRUZXh0RGF0YSh3c0hlYWRlciwgMCwgNyk7DQorICAgICAgICAgICAgICAgICAgICAgIGlmICh3c0hlYWRlci5FcXVhbChGWF9XU1RSQyhMIltDREFUQVsiKSkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RhaWxlcjsNCisgICAgICAgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldFRleHREYXRhKHdzVGFpbGVyLCBtX2lEYXRhTGVuZ3RoIC0gMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3c1RhaWxlci5FcXVhbChGWF9XU1RSQyhMIl1dIikpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkRlbGV0ZVRleHRDaGFycyg3LCBUUlVFKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuRGVsZXRlVGV4dENoYXJzKDIsIEZBTFNFKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19DRGF0YTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoID0gbV9pRGF0YUxlbmd0aDsNCisgICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuUmVzZXQoKTsNCisgICAgICAgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9DQorICAgICAgICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0Ow0KKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICBtX1NraXBDaGFyID0gKEZYX1dDSEFSKSpwRFdvcmQ7DQorICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAobV9Ta2lwU3RhY2suR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgICAgICAgaWYgKG1faUluZGV4SW5CbG9jayA9PSBtX2lBbGxvY1N0ZXApIHsNCisgICAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0NCisgICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsNCisgICAgICAgICAgICAgICAgaWYgKCFtX3BDdXJyZW50QmxvY2spIHsNCisgICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrW21faUluZGV4SW5CbG9jaysrXSA9IGNoOw0KKyAgICAgICAgICAgICAgbV9pRGF0YUxlbmd0aCsrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9Ta2lwQ29tbWVudDoNCisgICAgICAgICAgaWYgKGNoID09IEwnLScpIHsNCisgICAgICAgICAgICBpZiAobV9pSW5kZXhJbkJsb2NrID09IG1faUFsbG9jU3RlcCkgew0KKyAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0NCisgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQorICAgICAgICAgICAgICBpZiAoIW1fcEN1cnJlbnRCbG9jaykgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrW21faUluZGV4SW5CbG9jaysrXSA9IEwnLSc7DQorICAgICAgICAgICAgbV9pRGF0YUxlbmd0aCsrOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKGNoID09IEwnPicpIHsNCisgICAgICAgICAgICBpZiAobV9pRGF0YUxlbmd0aCA+IDEpIHsNCisgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuUmVzZXQoKTsNCisgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9DQorICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KCk7DQorICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXREYXRhOg0KKyAgICAgICAgICBpZiAoRkRFX0lzWE1MV2hpdGVTcGFjZShjaCkpIHsNCisgICAgICAgICAgICBpZiAobV9pRGF0YUxlbmd0aCA8IDEpIHsNCisgICAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKG1fd1F1b3RhdGlvbk1hcmsgPT0gMCkgew0KKyAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhTGVuZ3RoOw0KKyAgICAgICAgICAgICAgbV93UXVvdGF0aW9uTWFyayA9IDA7DQorICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KCk7DQorICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2sgPQ0KKyAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsNCisgICAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfVGFyZ2V0RGF0YTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoY2ggPT0gJz8nKSB7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9DbG9zZUluc3RydWN0aW9uOw0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1wiJykgew0KKyAgICAgICAgICAgIGlmIChtX3dRdW90YXRpb25NYXJrID09IDApIHsNCisgICAgICAgICAgICAgIG1fd1F1b3RhdGlvbk1hcmsgPSBjaDsNCisgICAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBtX3dRdW90YXRpb25NYXJrKSB7DQorICAgICAgICAgICAgICBtX2lUZXh0RGF0YUxlbmd0aCA9IG1faURhdGFMZW5ndGg7DQorICAgICAgICAgICAgICBtX3dRdW90YXRpb25NYXJrID0gMDsNCisgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuUmVzZXQoKTsNCisgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9DQorICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICAgICAgICAgICAgbV9wU3RhcnQrKzsNCisgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19UYXJnZXREYXRhOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAobV9pSW5kZXhJbkJsb2NrID09IG1faUFsbG9jU3RlcCkgew0KKyAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0NCisgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7DQorICAgICAgICAgICAgICBpZiAoIW1fcEN1cnJlbnRCbG9jaykgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrW21faUluZGV4SW5CbG9jaysrXSA9IGNoOw0KKyAgICAgICAgICAgIG1faURhdGFMZW5ndGgrKzsNCisgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlmIChkd1N0YXR1cyAhPSBGREVfWE1MU1lOVEFYU1RBVFVTX05vbmUpIHsNCisgICAgICAgIHJldHVybiBkd1N0YXR1czsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiAwOw0KK30NCisjZWxzZQ0KK0NGREVfWE1MU3ludGF4UGFyc2VyOjpDRkRFX1hNTFN5bnRheFBhcnNlcigpDQorICAgIDogbV9wU3RyZWFtKE5VTEwpLA0KKyAgICAgIG1faVhNTFBsYW5lU2l6ZSgtMSksDQorICAgICAgbV9pVGV4dERhdGFTaXplKDI1NiksDQorICAgICAgbV9pQ3VycmVudFBvcygwKSwNCisgICAgICBtX2lDdXJyZW50Tm9kZU51bSgtMSksDQorICAgICAgbV9pTGFzdE5vZGVOdW0oLTEpLA0KKyAgICAgIG1faVBhcnNlZENoYXJzKDApLA0KKyAgICAgIG1faVBhcnNlZEJ5dGVzKDApLA0KKyAgICAgIG1fcEJ1ZmZlcihOVUxMKSwNCisgICAgICBtX2lCdWZmZXJDaGFycygwKSwNCisgICAgICBtX2JFT1MoRkFMU0UpLA0KKyAgICAgIG1fcFN0YXJ0KE5VTEwpLA0KKyAgICAgIG1fcEVuZChOVUxMKSwNCisgICAgICBtX1hNTE5vZGVTdGFjaygxNiksDQorICAgICAgbV9wd3NUZXh0RGF0YShOVUxMKSwNCisgICAgICBtX2lEYXRhUG9zKDApLA0KKyAgICAgIG1fZHdTdGF0dXMoRkRFX1hNTFNZTlRBWFNUQVRVU19Ob25lKSwNCisgICAgICBtX2R3TW9kZShGREVfWE1MU1lOVEFYTU9ERV9UZXh0KSwNCisgICAgICBtX3dRdW90YXRpb25NYXJrKDApLA0KKyAgICAgIG1faVRleHREYXRhTGVuZ3RoKDApLA0KKyAgICAgIG1faUVudGl0eVN0YXJ0KC0xKSwNCisgICAgICBtX1NraXBTdGFjaygxNikgew0KKyAgbV9DdXJOb2RlLmlOb2RlTnVtID0gLTE7DQorICBtX0N1ck5vZGUuZU5vZGVUeXBlID0gRkRFX1hNTE5PREVfVW5rbm93bjsNCit9DQordm9pZCBDRkRFX1hNTFN5bnRheFBhcnNlcjo6SW5pdChJRlhfU3RyZWFtKiBwU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpWE1MUGxhbmVTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVGV4dERhdGFTaXplKSB7DQorICBGWFNZU19hc3NlcnQobV9wU3RyZWFtID09IE5VTEwgJiYgbV9wQnVmZmVyID09IE5VTEwpOw0KKyAgRlhTWVNfYXNzZXJ0KHBTdHJlYW0gIT0gTlVMTCAmJiBpWE1MUGxhbmVTaXplID4gMCAmJiBpVGV4dERhdGFTaXplID4gMCk7DQorICBpbnQzMl90IGlTdHJlYW1MZW5ndGggPSBwU3RyZWFtLT5HZXRMZW5ndGgoKTsNCisgIEZYU1lTX2Fzc2VydChpU3RyZWFtTGVuZ3RoID4gMCk7DQorICBtX3BTdHJlYW0gPSBwU3RyZWFtOw0KKyAgbV9pWE1MUGxhbmVTaXplID0gc3RkOjptaW4oaVhNTFBsYW5lU2l6ZSwgaVN0cmVhbUxlbmd0aCk7DQorICBtX2lUZXh0RGF0YVNpemUgPSBpVGV4dERhdGFTaXplOw0KKyAgdWludDhfdCBib21bNF07DQorICBtX2lDdXJyZW50UG9zID0gbV9wU3RyZWFtLT5HZXRCT00oYm9tKTsNCisgIEZYU1lTX2Fzc2VydChtX3BCdWZmZXIgPT0gTlVMTCk7DQorICBtX3BCdWZmZXIgPSBGWF9BbGxvYyhGWF9XQ0hBUiwgbV9pWE1MUGxhbmVTaXplKTsNCisgIG1fcFN0YXJ0ID0gbV9wRW5kID0gbV9wQnVmZmVyOw0KKyAgRlhTWVNfYXNzZXJ0KG1fcHdzVGV4dERhdGEgPT0gTlVMTCk7DQorICBtX3B3c1RleHREYXRhID0gRlhfQWxsb2MoRlhfV0NIQVIsIG1faVRleHREYXRhU2l6ZSk7DQorICBtX2lQYXJzZWRCeXRlcyA9IDA7DQorICBtX2lQYXJzZWRDaGFycyA9IDA7DQorICBtX2lCdWZmZXJDaGFycyA9IDA7DQorfQ0KK0ZYX0RXT1JEIENGREVfWE1MU3ludGF4UGFyc2VyOjpEb1N5bnRheFBhcnNlKCkgew0KKyAgaWYgKG1fZHdTdGF0dXMgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvciB8fA0KKyAgICAgIG1fZHdTdGF0dXMgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FT1MpIHsNCisgICAgcmV0dXJuIG1fZHdTdGF0dXM7DQorICB9DQorICBGWFNZU19hc3NlcnQobV9wU3RyZWFtICE9IE5VTEwgJiYgbV9wQnVmZmVyICE9IE5VTEwgJiYgbV9wd3NUZXh0RGF0YSAhPSBOVUxMKTsNCisgIGludDMyX3QgaVN0cmVhbUxlbmd0aCA9IG1fcFN0cmVhbS0+R2V0TGVuZ3RoKCk7DQorICBpbnQzMl90IGlQb3M7DQorICBGWF9XQ0hBUiBjaDsNCisgIEZYX0RXT1JEIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19Ob25lOw0KKyAgd2hpbGUgKFRSVUUpIHsNCisgICAgaWYgKG1fcFN0YXJ0ID49IG1fcEVuZCkgew0KKyAgICAgIGlmIChtX2JFT1MgfHwgbV9pQ3VycmVudFBvcyA+PSBpU3RyZWFtTGVuZ3RoKSB7DQorICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FT1M7DQorICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICB9DQorICAgICAgbV9pUGFyc2VkQ2hhcnMgKz0gKG1fcEVuZCAtIG1fcEJ1ZmZlcik7DQorICAgICAgbV9pUGFyc2VkQnl0ZXMgPSBtX2lDdXJyZW50UG9zOw0KKyAgICAgIG1fcFN0cmVhbS0+TG9jaygpOw0KKyAgICAgIGlmIChtX3BTdHJlYW0tPkdldFBvc2l0aW9uKCkgIT0gbV9pQ3VycmVudFBvcykgew0KKyAgICAgICAgbV9wU3RyZWFtLT5TZWVrKEZYX1NUUkVBTVNFRUtfQmVnaW4sIG1faUN1cnJlbnRQb3MpOw0KKyAgICAgIH0NCisgICAgICBtX2lCdWZmZXJDaGFycyA9DQorICAgICAgICAgIG1fcFN0cmVhbS0+UmVhZFN0cmluZyhtX3BCdWZmZXIsIG1faVhNTFBsYW5lU2l6ZSwgbV9iRU9TKTsNCisgICAgICBpUG9zID0gbV9wU3RyZWFtLT5HZXRQb3NpdGlvbigpOw0KKyAgICAgIG1fcFN0cmVhbS0+VW5sb2NrKCk7DQorICAgICAgaWYgKG1faUJ1ZmZlckNoYXJzIDwgMSkgew0KKyAgICAgICAgbV9pQ3VycmVudFBvcyA9IGlTdHJlYW1MZW5ndGg7DQorICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FT1M7DQorICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICB9DQorICAgICAgbV9pQ3VycmVudFBvcyA9IGlQb3M7DQorICAgICAgbV9wU3RhcnQgPSBtX3BCdWZmZXI7DQorICAgICAgbV9wRW5kID0gbV9wQnVmZmVyICsgbV9pQnVmZmVyQ2hhcnM7DQorICAgIH0NCisgICAgd2hpbGUgKG1fcFN0YXJ0IDwgbV9wRW5kKSB7DQorICAgICAgY2ggPSAqbV9wU3RhcnQ7DQorICAgICAgc3dpdGNoIChtX2R3TW9kZSkgew0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0Og0KKyAgICAgICAgICBpZiAoY2ggPT0gTCc8Jykgew0KKyAgICAgICAgICAgIGlmIChtX2lEYXRhUG9zID4gMCkgew0KKyAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KKyAgICAgICAgICAgICAgbV9pRGF0YVBvcyA9IDA7DQorICAgICAgICAgICAgICBtX2lFbnRpdHlTdGFydCA9IC0xOw0KKyAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX1RleHQ7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX05vZGU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIFBhcnNlVGV4dENoYXIoY2gpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9Ob2RlOg0KKyAgICAgICAgICBpZiAoY2ggPT0gTCchJykgew0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9Ta2lwQ29tbWVudE9yRGVjbDsNCisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBMJy8nKSB7DQorICAgICAgICAgICAgbV9wU3RhcnQrKzsNCisgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0Nsb3NlRWxlbWVudDsNCisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBMJz8nKSB7DQorICAgICAgICAgICAgbV9pTGFzdE5vZGVOdW0rKzsNCisgICAgICAgICAgICBtX2lDdXJyZW50Tm9kZU51bSA9IG1faUxhc3ROb2RlTnVtOw0KKyAgICAgICAgICAgIG1fQ3VyTm9kZS5pTm9kZU51bSA9IG1faUxhc3ROb2RlTnVtOw0KKyAgICAgICAgICAgIG1fQ3VyTm9kZS5lTm9kZVR5cGUgPSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbjsNCisgICAgICAgICAgICBtX1hNTE5vZGVTdGFjay5QdXNoKG1fQ3VyTm9kZSk7DQorICAgICAgICAgICAgbV9wU3RhcnQrKzsNCisgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RhcmdldDsNCisgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfSW5zdHJ1Y3Rpb25PcGVuOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1faUxhc3ROb2RlTnVtKys7DQorICAgICAgICAgICAgbV9pQ3VycmVudE5vZGVOdW0gPSBtX2lMYXN0Tm9kZU51bTsNCisgICAgICAgICAgICBtX0N1ck5vZGUuaU5vZGVOdW0gPSBtX2lMYXN0Tm9kZU51bTsNCisgICAgICAgICAgICBtX0N1ck5vZGUuZU5vZGVUeXBlID0gRkRFX1hNTE5PREVfRWxlbWVudDsNCisgICAgICAgICAgICBtX1hNTE5vZGVTdGFjay5QdXNoKG1fQ3VyTm9kZSk7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UYWc7DQorICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0VsZW1lbnRPcGVuOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXQ6DQorICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX1RhZzoNCisgICAgICAgICAgaWYgKCFGREVfSXNYTUxOYW1lQ2hhcihjaCwgbV9pRGF0YVBvcyA8IDEpKSB7DQorICAgICAgICAgICAgaWYgKG1faURhdGFQb3MgPCAxKSB7DQorICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBtX2lUZXh0RGF0YUxlbmd0aCA9IG1faURhdGFQb3M7DQorICAgICAgICAgICAgICBtX2lEYXRhUG9zID0gMDsNCisgICAgICAgICAgICAgIGlmIChtX2R3TW9kZSAhPSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXQpIHsNCisgICAgICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhZ05hbWU7DQorICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfVGFyZ2V0TmFtZTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlOYW1lOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAobV9pRGF0YVBvcyA+PSBtX2lUZXh0RGF0YVNpemUpIHsNCisgICAgICAgICAgICAgIFJlYWxsb2NUZXh0RGF0YUJ1ZmZlcigpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX3B3c1RleHREYXRhW21faURhdGFQb3MrK10gPSBjaDsNCisgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaU5hbWU6DQorICAgICAgICAgIGlmIChtX2lEYXRhUG9zIDwgMSAmJiBGREVfSXNYTUxXaGl0ZVNwYWNlKGNoKSkgew0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKCFGREVfSXNYTUxOYW1lQ2hhcihjaCwgbV9pRGF0YVBvcyA8IDEpKSB7DQorICAgICAgICAgICAgaWYgKG1faURhdGFQb3MgPCAxKSB7DQorICAgICAgICAgICAgICBpZiAobV9DdXJOb2RlLmVOb2RlVHlwZSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICAgICAgICAgIGlmIChjaCA9PSBMJz4nIHx8IGNoID09IEwnLycpIHsNCisgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0JyZWFrRWxlbWVudDsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChtX0N1ck5vZGUuZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX0luc3RydWN0aW9uKSB7DQorICAgICAgICAgICAgICAgIGlmIChjaCA9PSBMJz8nKSB7DQorICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9DbG9zZUluc3RydWN0aW9uOw0KKyAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXREYXRhOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgaWYgKG1fQ3VyTm9kZS5lTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb24pIHsNCisgICAgICAgICAgICAgICAgaWYgKGNoICE9ICc9JyAmJiAhRkRFX0lzWE1MV2hpdGVTcGFjZShjaCkpIHsNCisgICAgICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RhcmdldERhdGE7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoID0gbV9pRGF0YVBvczsNCisgICAgICAgICAgICAgIG1faURhdGFQb3MgPSAwOw0KKyAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaUVxdWFsU2lnbjsNCisgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19BdHRyaU5hbWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChtX2lEYXRhUG9zID49IG1faVRleHREYXRhU2l6ZSkgew0KKyAgICAgICAgICAgICAgUmVhbGxvY1RleHREYXRhQnVmZmVyKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1fcHdzVGV4dERhdGFbbV9pRGF0YVBvcysrXSA9IGNoOw0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpRXF1YWxTaWduOg0KKyAgICAgICAgICBpZiAoRkRFX0lzWE1MV2hpdGVTcGFjZShjaCkpIHsNCisgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChjaCAhPSBMJz0nKSB7DQorICAgICAgICAgICAgaWYgKG1fQ3VyTm9kZS5lTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb24pIHsNCisgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGFyZ2V0RGF0YTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpUXVvdGF0aW9uOw0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpUXVvdGF0aW9uOg0KKyAgICAgICAgICBpZiAoRkRFX0lzWE1MV2hpdGVTcGFjZShjaCkpIHsNCisgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChjaCAhPSBMJ1wiJyAmJiBjaCAhPSBMJ1wnJykgew0KKyAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1fd1F1b3RhdGlvbk1hcmsgPSBjaDsNCisgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpVmFsdWU7DQorICAgICAgICAgICAgbV9wU3RhcnQrKzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlWYWx1ZToNCisgICAgICAgICAgaWYgKGNoID09IG1fd1F1b3RhdGlvbk1hcmspIHsNCisgICAgICAgICAgICBpZiAobV9pRW50aXR5U3RhcnQgPiAtMSkgew0KKyAgICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KKyAgICAgICAgICAgIG1fd1F1b3RhdGlvbk1hcmsgPSAwOw0KKyAgICAgICAgICAgIG1faURhdGFQb3MgPSAwOw0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9BdHRyaU5hbWU7DQorICAgICAgICAgICAgZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0F0dHJpVmFsdWU7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgUGFyc2VUZXh0Q2hhcihjaCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX0Nsb3NlSW5zdHJ1Y3Rpb246DQorICAgICAgICAgIGlmIChjaCAhPSBMJz4nKSB7DQorICAgICAgICAgICAgaWYgKG1faURhdGFQb3MgPj0gbV9pVGV4dERhdGFTaXplKSB7DQorICAgICAgICAgICAgICBSZWFsbG9jVGV4dERhdGFCdWZmZXIoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9wd3NUZXh0RGF0YVttX2lEYXRhUG9zKytdID0gY2g7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXREYXRhOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKG1faURhdGFQb3MgPiAwKSB7DQorICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KKyAgICAgICAgICAgIG1faURhdGFQb3MgPSAwOw0KKyAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19UYXJnZXREYXRhOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgRkRFX0xQWE1MTk9ERSBwWE1MTm9kZSA9IG1fWE1MTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgICAgICAgICBpZiAocFhNTE5vZGUgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICByZXR1cm4gbV9kd1N0YXR1czsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9YTUxOb2RlU3RhY2suUG9wKCk7DQorICAgICAgICAgICAgcFhNTE5vZGUgPSBtX1hNTE5vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICAgICAgICAgICAgaWYgKHBYTUxOb2RlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgIG1fQ3VyTm9kZS5pTm9kZU51bSA9IC0xOw0KKyAgICAgICAgICAgICAgbV9DdXJOb2RlLmVOb2RlVHlwZSA9IEZERV9YTUxOT0RFX1Vua25vd247DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIG1fQ3VyTm9kZSA9ICpwWE1MTm9kZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbV9pQ3VycmVudE5vZGVOdW0gPSBtX0N1ck5vZGUuaU5vZGVOdW07DQorICAgICAgICAgICAgbV9pRGF0YVBvcyA9IDA7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0Ow0KKyAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19JbnN0cnVjdGlvbkNsb3NlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9CcmVha0VsZW1lbnQ6DQorICAgICAgICAgIGlmIChjaCA9PSBMJz4nKSB7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0Ow0KKyAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FbGVtZW50QnJlYWs7DQorICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gTCcvJykgew0KKyAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfQ2xvc2VFbGVtZW50Ow0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9DbG9zZUVsZW1lbnQ6DQorICAgICAgICAgIGlmICghRkRFX0lzWE1MTmFtZUNoYXIoY2gsIG1faURhdGFQb3MgPCAxKSkgew0KKyAgICAgICAgICAgIGlmIChjaCA9PSBMJz4nKSB7DQorICAgICAgICAgICAgICBGREVfTFBYTUxOT0RFIHBYTUxOb2RlID0gbV9YTUxOb2RlU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KKyAgICAgICAgICAgICAgaWYgKHBYTUxOb2RlID09IE5VTEwpIHsNCisgICAgICAgICAgICAgICAgbV9kd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRXJyb3I7DQorICAgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgbV9YTUxOb2RlU3RhY2suUG9wKCk7DQorICAgICAgICAgICAgICBwWE1MTm9kZSA9IG1fWE1MTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsNCisgICAgICAgICAgICAgIGlmIChwWE1MTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIG1fQ3VyTm9kZS5pTm9kZU51bSA9IC0xOw0KKyAgICAgICAgICAgICAgICBtX0N1ck5vZGUuZU5vZGVUeXBlID0gRkRFX1hNTE5PREVfVW5rbm93bjsNCisgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIG1fQ3VyTm9kZSA9ICpwWE1MTm9kZTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIG1faUN1cnJlbnROb2RlTnVtID0gbV9DdXJOb2RlLmlOb2RlTnVtOw0KKyAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KKyAgICAgICAgICAgICAgbV9pRGF0YVBvcyA9IDA7DQorICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RleHQ7DQorICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfRWxlbWVudENsb3NlOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIUZERV9Jc1hNTFdoaXRlU3BhY2UoY2gpKSB7DQorICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAobV9pRGF0YVBvcyA+PSBtX2lUZXh0RGF0YVNpemUpIHsNCisgICAgICAgICAgICAgIFJlYWxsb2NUZXh0RGF0YUJ1ZmZlcigpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX3B3c1RleHREYXRhW21faURhdGFQb3MrK10gPSBjaDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWE1PREVfU2tpcENvbW1lbnRPckRlY2w6DQorICAgICAgICAgIGlmIChjaCA9PSAnLScpIHsNCisgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1NraXBDb21tZW50Ow0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfU2tpcERlY2xOb2RlOw0KKyAgICAgICAgICAgIG1fU2tpcENoYXIgPSBMJz4nOw0KKyAgICAgICAgICAgIG1fU2tpcFN0YWNrLlB1c2goTCc+Jyk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9YTUxTWU5UQVhNT0RFX1NraXBEZWNsTm9kZToNCisgICAgICAgICAgaWYgKG1fU2tpcENoYXIgPT0gTCdcJycgfHwgbV9Ta2lwQ2hhciA9PSBMJ1wiJykgew0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgaWYgKGNoICE9IG1fU2tpcENoYXIpIHsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX1NraXBTdGFjay5Qb3AoKTsNCisgICAgICAgICAgICBGWF9EV09SRCogcERXb3JkID0gbV9Ta2lwU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KKyAgICAgICAgICAgIGlmIChwRFdvcmQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9UZXh0Ow0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBtX1NraXBDaGFyID0gKEZYX1dDSEFSKSpwRFdvcmQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsNCisgICAgICAgICAgICAgIGNhc2UgTCc8JzoNCisgICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IEwnPic7DQorICAgICAgICAgICAgICAgIG1fU2tpcFN0YWNrLlB1c2goTCc+Jyk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgY2FzZSBMJ1snOg0KKyAgICAgICAgICAgICAgICBtX1NraXBDaGFyID0gTCddJzsNCisgICAgICAgICAgICAgICAgbV9Ta2lwU3RhY2suUHVzaChMJ10nKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICBjYXNlIEwnKCc6DQorICAgICAgICAgICAgICAgIG1fU2tpcENoYXIgPSBMJyknOw0KKyAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5QdXNoKEwnKScpOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgIGNhc2UgTCdcJyc6DQorICAgICAgICAgICAgICAgIG1fU2tpcENoYXIgPSBMJ1wnJzsNCisgICAgICAgICAgICAgICAgbV9Ta2lwU3RhY2suUHVzaChMJ1wnJyk7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgY2FzZSBMJ1wiJzoNCisgICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IEwnXCInOw0KKyAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5QdXNoKEwnXCInKTsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gbV9Ta2lwQ2hhcikgew0KKyAgICAgICAgICAgICAgICAgIG1fU2tpcFN0YWNrLlBvcCgpOw0KKyAgICAgICAgICAgICAgICAgIEZYX0RXT1JEKiBwRFdvcmQgPSBtX1NraXBTdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICAgICAgICAgICAgICAgICAgaWYgKHBEV29yZCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgICAgICBtX2lUZXh0RGF0YUxlbmd0aCA9IG1faURhdGFQb3M7DQorICAgICAgICAgICAgICAgICAgICBtX2lEYXRhUG9zID0gMDsNCisgICAgICAgICAgICAgICAgICAgIGlmIChtX2lUZXh0RGF0YUxlbmd0aCA+PSA5ICYmDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY21wKG1fcHdzVGV4dERhdGEsIEwiW0NEQVRBWyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcgKiBzaXplb2YoRlhfV0NIQVIpKSA9PSAwICYmDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbWVtY21wKG1fcHdzVGV4dERhdGEgKyBtX2lUZXh0RGF0YUxlbmd0aCAtIDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiXV0iLCAyICogc2l6ZW9mKEZYX1dDSEFSKSkgPT0gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgICBtX2lUZXh0RGF0YUxlbmd0aCAtPSA5Ow0KKyAgICAgICAgICAgICAgICAgICAgICBGWFNZU19tZW1tb3ZlKG1fcHdzVGV4dERhdGEsIG1fcHdzVGV4dERhdGEgKyA3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgICAgICAgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19DRGF0YTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIG1fZHdNb2RlID0gRkRFX1hNTFNZTlRBWE1PREVfVGV4dDsNCisgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IChGWF9XQ0hBUikqcERXb3JkOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKG1fU2tpcFN0YWNrLkdldFNpemUoKSA+IDApIHsNCisgICAgICAgICAgICAgIGlmIChtX2lEYXRhUG9zID49IG1faVRleHREYXRhU2l6ZSkgew0KKyAgICAgICAgICAgICAgICBSZWFsbG9jVGV4dERhdGFCdWZmZXIoKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIG1fcHdzVGV4dERhdGFbbV9pRGF0YVBvcysrXSA9IGNoOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9Ta2lwQ29tbWVudDoNCisgICAgICAgICAgaWYgKGNoID09IEwnLScpIHsNCisgICAgICAgICAgICBtX2lEYXRhUG9zKys7DQorICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gTCc+Jykgew0KKyAgICAgICAgICAgIGlmIChtX2lEYXRhUG9zID4gMSkgew0KKyAgICAgICAgICAgICAgbV9pRGF0YVBvcyA9IDA7DQorICAgICAgICAgICAgICBtX2R3TW9kZSA9IEZERV9YTUxTWU5UQVhNT0RFX1RleHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1faURhdGFQb3MgPSAwOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfWE1MU1lOVEFYTU9ERV9UYXJnZXREYXRhOg0KKyAgICAgICAgICBpZiAoRkRFX0lzWE1MV2hpdGVTcGFjZShjaCkpIHsNCisgICAgICAgICAgICBpZiAobV9pRGF0YVBvcyA8IDEpIHsNCisgICAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKG1fd1F1b3RhdGlvbk1hcmsgPT0gMCkgew0KKyAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KKyAgICAgICAgICAgICAgbV93UXVvdGF0aW9uTWFyayA9IDA7DQorICAgICAgICAgICAgICBtX2lEYXRhUG9zID0gMDsNCisgICAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgICBkd1N0YXR1cyA9IEZERV9YTUxTWU5UQVhTVEFUVVNfVGFyZ2V0RGF0YTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoY2ggPT0gJz8nKSB7DQorICAgICAgICAgICAgbV9kd01vZGUgPSBGREVfWE1MU1lOVEFYTU9ERV9DbG9zZUluc3RydWN0aW9uOw0KKyAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1wiJykgew0KKyAgICAgICAgICAgIGlmIChtX3dRdW90YXRpb25NYXJrID09IDApIHsNCisgICAgICAgICAgICAgIG1fd1F1b3RhdGlvbk1hcmsgPSBjaDsNCisgICAgICAgICAgICAgIG1fcFN0YXJ0Kys7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBtX3dRdW90YXRpb25NYXJrKSB7DQorICAgICAgICAgICAgICBtX2lUZXh0RGF0YUxlbmd0aCA9IG1faURhdGFQb3M7DQorICAgICAgICAgICAgICBtX3dRdW90YXRpb25NYXJrID0gMDsNCisgICAgICAgICAgICAgIG1faURhdGFQb3MgPSAwOw0KKyAgICAgICAgICAgICAgbV9wU3RhcnQrKzsNCisgICAgICAgICAgICAgIGR3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19UYXJnZXREYXRhOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgICAgIHJldHVybiBtX2R3U3RhdHVzOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAobV9pRGF0YVBvcyA+PSBtX2lUZXh0RGF0YVNpemUpIHsNCisgICAgICAgICAgICAgIFJlYWxsb2NUZXh0RGF0YUJ1ZmZlcigpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBtX3B3c1RleHREYXRhW21faURhdGFQb3MrK10gPSBjaDsNCisgICAgICAgICAgICBtX3BTdGFydCsrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlmIChkd1N0YXR1cyAhPSBGREVfWE1MU1lOVEFYU1RBVFVTX05vbmUpIHsNCisgICAgICAgIHJldHVybiBkd1N0YXR1czsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiAwOw0KK30NCisjZW5kaWYNCitDRkRFX1hNTFN5bnRheFBhcnNlcjo6fkNGREVfWE1MU3ludGF4UGFyc2VyKCkgew0KKyNpZmRlZiBfRkRFX0JMT0NLX0JVRkZFUg0KKyAgaWYgKG1fcEN1cnJlbnRCbG9jaykgew0KKyAgICBtX3BDdXJyZW50QmxvY2sgPSBOVUxMOw0KKyAgfQ0KKyNlbHNlDQorICBGWF9GcmVlKG1fcHdzVGV4dERhdGEpOw0KKyNlbmRpZg0KKyAgRlhfRnJlZShtX3BCdWZmZXIpOw0KK30NCitpbnQzMl90IENGREVfWE1MU3ludGF4UGFyc2VyOjpHZXRTdGF0dXMoKSBjb25zdCB7DQorICBpZiAobV9wU3RyZWFtID09IE5VTEwpIHsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgaW50MzJfdCBpU3RyZWFtTGVuZ3RoID0gbV9wU3RyZWFtLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpU3RyZWFtTGVuZ3RoIDwgMSkgew0KKyAgICByZXR1cm4gMTAwOw0KKyAgfQ0KKyAgaWYgKG1fZHdTdGF0dXMgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcikgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBpZiAobV9kd1N0YXR1cyA9PSBGREVfWE1MU1lOVEFYU1RBVFVTX0VPUykgew0KKyAgICByZXR1cm4gMTAwOw0KKyAgfQ0KKyAgcmV0dXJuIG1faVBhcnNlZEJ5dGVzICogMTAwIC8gaVN0cmVhbUxlbmd0aDsNCit9DQorc3RhdGljIGludDMyX3QgRlhfR2V0VVRGOEVuY29kZUxlbmd0aChjb25zdCBGWF9XQ0hBUiogcFNyYywgaW50MzJfdCBpU3JjTGVuKSB7DQorICBGWF9EV09SRCB1bmljb2RlID0gMDsNCisgIGludDMyX3QgaURzdE51bSA9IDA7DQorICB3aGlsZSAoaVNyY0xlbi0tID4gMCkgew0KKyAgICB1bmljb2RlID0gKnBTcmMrKzsNCisgICAgaW50IG5ieXRlcyA9IDA7DQorICAgIGlmICgoRlhfRFdPUkQpdW5pY29kZSA8IDB4ODApIHsNCisgICAgICBuYnl0ZXMgPSAxOw0KKyAgICB9IGVsc2UgaWYgKChGWF9EV09SRCl1bmljb2RlIDwgMHg4MDApIHsNCisgICAgICBuYnl0ZXMgPSAyOw0KKyAgICB9IGVsc2UgaWYgKChGWF9EV09SRCl1bmljb2RlIDwgMHgxMDAwMCkgew0KKyAgICAgIG5ieXRlcyA9IDM7DQorICAgIH0gZWxzZSBpZiAoKEZYX0RXT1JEKXVuaWNvZGUgPCAweDIwMDAwMCkgew0KKyAgICAgIG5ieXRlcyA9IDQ7DQorICAgIH0gZWxzZSBpZiAoKEZYX0RXT1JEKXVuaWNvZGUgPCAweDQwMDAwMDApIHsNCisgICAgICBuYnl0ZXMgPSA1Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG5ieXRlcyA9IDY7DQorICAgIH0NCisgICAgaURzdE51bSArPSBuYnl0ZXM7DQorICB9DQorICByZXR1cm4gaURzdE51bTsNCit9DQorRlhfRklMRVNJWkUgQ0ZERV9YTUxTeW50YXhQYXJzZXI6OkdldEN1cnJlbnRCaW5hcnlQb3MoKSBjb25zdCB7DQorICBpZiAobV9wU3RyZWFtID09IE5VTEwpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpbnQzMl90IG5TcmNMZW4gPSBtX3BTdGFydCAtIG1fcEJ1ZmZlcjsNCisgIGludDMyX3QgbkRzdExlbiA9IEZYX0dldFVURjhFbmNvZGVMZW5ndGgobV9wQnVmZmVyLCBuU3JjTGVuKTsNCisgIHJldHVybiBtX2lQYXJzZWRCeXRlcyArIG5Ec3RMZW47DQorfQ0KKyNpZmRlZiBfRkRFX0JMT0NLX0JVRkZFUg0KK3ZvaWQgQ0ZERV9YTUxTeW50YXhQYXJzZXI6OlBhcnNlVGV4dENoYXIoRlhfV0NIQVIgY2gpIHsNCisgIGlmIChtX2lJbmRleEluQmxvY2sgPT0gbV9pQWxsb2NTdGVwKSB7DQorICAgIG1fcEN1cnJlbnRCbG9jayA9IG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsNCisgICAgaWYgKCFtX3BDdXJyZW50QmxvY2spIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgIH0NCisgIG1fcEN1cnJlbnRCbG9ja1ttX2lJbmRleEluQmxvY2srK10gPSBjaDsNCisgIG1faURhdGFMZW5ndGgrKzsNCisgIGlmIChtX2lFbnRpdHlTdGFydCA+IC0xICYmIGNoID09IEwnOycpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgY3NFbnRpdHk7DQorICAgIG1fQmxvY2tCdWZmZXIuR2V0VGV4dERhdGEoY3NFbnRpdHksIG1faUVudGl0eVN0YXJ0ICsgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV9pRGF0YUxlbmd0aCAtIDEpIC0gbV9pRW50aXR5U3RhcnQgLSAxKTsNCisgICAgaW50MzJfdCBpTGVuID0gY3NFbnRpdHkuR2V0TGVuZ3RoKCk7DQorICAgIGlmIChpTGVuID4gMCkgew0KKyAgICAgIGlmIChjc0VudGl0eVswXSA9PSBMJyMnKSB7DQorICAgICAgICBjaCA9IDA7DQorICAgICAgICBGWF9XQ0hBUiB3Ow0KKyAgICAgICAgaWYgKGlMZW4gPiAxICYmIGNzRW50aXR5WzFdID09IEwneCcpIHsNCisgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAyOyBpIDwgaUxlbjsgaSsrKSB7DQorICAgICAgICAgICAgdyA9IGNzRW50aXR5W2ldOw0KKyAgICAgICAgICAgIGlmICh3ID49IEwnMCcgJiYgdyA8PSBMJzknKSB7DQorICAgICAgICAgICAgICBjaCA9IChjaCA8PCA0KSArIHcgLSBMJzAnOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAodyA+PSBMJ0EnICYmIHcgPD0gTCdGJykgew0KKyAgICAgICAgICAgICAgY2ggPSAoY2ggPDwgNCkgKyB3IC0gNTU7DQorICAgICAgICAgICAgfSBlbHNlIGlmICh3ID49IEwnYScgJiYgdyA8PSBMJ2YnKSB7DQorICAgICAgICAgICAgICBjaCA9IChjaCA8PCA0KSArIHcgLSA4NzsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBpTGVuOyBpKyspIHsNCisgICAgICAgICAgICB3ID0gY3NFbnRpdHlbaV07DQorICAgICAgICAgICAgaWYgKHcgPCBMJzAnIHx8IHcgPiBMJzknKSB7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2ggPSBjaCAqIDEwICsgdyAtIEwnMCc7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChjaCAhPSAwKSB7DQorICAgICAgICAgIG1fQmxvY2tCdWZmZXIuU2V0VGV4dENoYXIobV9pRW50aXR5U3RhcnQsIGNoKTsNCisgICAgICAgICAgbV9pRW50aXR5U3RhcnQrKzsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKGNzRW50aXR5LkNvbXBhcmUoTCJhbXAiKSA9PSAwKSB7DQorICAgICAgICAgIG1fQmxvY2tCdWZmZXIuU2V0VGV4dENoYXIobV9pRW50aXR5U3RhcnQsIEwnJicpOw0KKyAgICAgICAgICBtX2lFbnRpdHlTdGFydCsrOw0KKyAgICAgICAgfSBlbHNlIGlmIChjc0VudGl0eS5Db21wYXJlKEwibHQiKSA9PSAwKSB7DQorICAgICAgICAgIG1fQmxvY2tCdWZmZXIuU2V0VGV4dENoYXIobV9pRW50aXR5U3RhcnQsIEwnPCcpOw0KKyAgICAgICAgICBtX2lFbnRpdHlTdGFydCsrOw0KKyAgICAgICAgfSBlbHNlIGlmIChjc0VudGl0eS5Db21wYXJlKEwiZ3QiKSA9PSAwKSB7DQorICAgICAgICAgIG1fQmxvY2tCdWZmZXIuU2V0VGV4dENoYXIobV9pRW50aXR5U3RhcnQsIEwnPicpOw0KKyAgICAgICAgICBtX2lFbnRpdHlTdGFydCsrOw0KKyAgICAgICAgfSBlbHNlIGlmIChjc0VudGl0eS5Db21wYXJlKEwiYXBvcyIpID09IDApIHsNCisgICAgICAgICAgbV9CbG9ja0J1ZmZlci5TZXRUZXh0Q2hhcihtX2lFbnRpdHlTdGFydCwgTCdcJycpOw0KKyAgICAgICAgICBtX2lFbnRpdHlTdGFydCsrOw0KKyAgICAgICAgfSBlbHNlIGlmIChjc0VudGl0eS5Db21wYXJlKEwicXVvdCIpID09IDApIHsNCisgICAgICAgICAgbV9CbG9ja0J1ZmZlci5TZXRUZXh0Q2hhcihtX2lFbnRpdHlTdGFydCwgTCdcIicpOw0KKyAgICAgICAgICBtX2lFbnRpdHlTdGFydCsrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBtX0Jsb2NrQnVmZmVyLkRlbGV0ZVRleHRDaGFycyhtX2lEYXRhTGVuZ3RoIC0gbV9pRW50aXR5U3RhcnQsIEZBTFNFKTsNCisgICAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOw0KKyAgICBtX2lFbnRpdHlTdGFydCA9IC0xOw0KKyAgfSBlbHNlIHsNCisgICAgaWYgKG1faUVudGl0eVN0YXJ0IDwgMCAmJiBjaCA9PSBMJyYnKSB7DQorICAgICAgbV9pRW50aXR5U3RhcnQgPSBtX2lEYXRhTGVuZ3RoIC0gMTsNCisgICAgfQ0KKyAgfQ0KKyAgbV9wU3RhcnQrKzsNCit9DQorI2Vsc2UNCit2b2lkIENGREVfWE1MU3ludGF4UGFyc2VyOjpQYXJzZVRleHRDaGFyKEZYX1dDSEFSIGNoKSB7DQorICBpZiAobV9pRGF0YVBvcyA+PSBtX2lUZXh0RGF0YVNpemUpIHsNCisgICAgUmVhbGxvY1RleHREYXRhQnVmZmVyKCk7DQorICB9DQorICBtX3B3c1RleHREYXRhW21faURhdGFQb3NdID0gY2g7DQorICBpZiAobV9pRW50aXR5U3RhcnQgPiAtMSAmJiBjaCA9PSBMJzsnKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIGNzRW50aXR5KG1fcHdzVGV4dERhdGEgKyBtX2lFbnRpdHlTdGFydCArIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faURhdGFQb3MgLSBtX2lFbnRpdHlTdGFydCAtIDEpOw0KKyAgICBpbnQzMl90IGlMZW4gPSBjc0VudGl0eS5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW4gPiAwKSB7DQorICAgICAgaWYgKGNzRW50aXR5WzBdID09IEwnIycpIHsNCisgICAgICAgIGNoID0gMDsNCisgICAgICAgIEZYX1dDSEFSIHc7DQorICAgICAgICBpZiAoaUxlbiA+IDEgJiYgY3NFbnRpdHlbMV0gPT0gTCd4Jykgew0KKyAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDI7IGkgPCBpTGVuOyBpKyspIHsNCisgICAgICAgICAgICB3ID0gY3NFbnRpdHlbaV07DQorICAgICAgICAgICAgaWYgKHcgPj0gTCcwJyAmJiB3IDw9IEwnOScpIHsNCisgICAgICAgICAgICAgIGNoID0gKGNoIDw8IDQpICsgdyAtIEwnMCc7DQorICAgICAgICAgICAgfSBlbHNlIGlmICh3ID49IEwnQScgJiYgdyA8PSBMJ0YnKSB7DQorICAgICAgICAgICAgICBjaCA9IChjaCA8PCA0KSArIHcgLSA1NTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKHcgPj0gTCdhJyAmJiB3IDw9IEwnZicpIHsNCisgICAgICAgICAgICAgIGNoID0gKGNoIDw8IDQpICsgdyAtIDg3Ow0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IGlMZW47IGkrKykgew0KKyAgICAgICAgICAgIHcgPSBjc0VudGl0eVtpXTsNCisgICAgICAgICAgICBpZiAodyA8IEwnMCcgfHwgdyA+IEwnOScpIHsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjaCA9IGNoICogMTAgKyB3IC0gTCcwJzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGNoICE9IDApIHsNCisgICAgICAgICAgbV9wd3NUZXh0RGF0YVttX2lFbnRpdHlTdGFydCsrXSA9IGNoOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAoY3NFbnRpdHkuQ29tcGFyZShMImFtcCIpID09IDApIHsNCisgICAgICAgICAgbV9wd3NUZXh0RGF0YVttX2lFbnRpdHlTdGFydCsrXSA9IEwnJic7DQorICAgICAgICB9IGVsc2UgaWYgKGNzRW50aXR5LkNvbXBhcmUoTCJsdCIpID09IDApIHsNCisgICAgICAgICAgbV9wd3NUZXh0RGF0YVttX2lFbnRpdHlTdGFydCsrXSA9IEwnPCc7DQorICAgICAgICB9IGVsc2UgaWYgKGNzRW50aXR5LkNvbXBhcmUoTCJndCIpID09IDApIHsNCisgICAgICAgICAgbV9wd3NUZXh0RGF0YVttX2lFbnRpdHlTdGFydCsrXSA9IEwnPic7DQorICAgICAgICB9IGVsc2UgaWYgKGNzRW50aXR5LkNvbXBhcmUoTCJhcG9zIikgPT0gMCkgew0KKyAgICAgICAgICBtX3B3c1RleHREYXRhW21faUVudGl0eVN0YXJ0KytdID0gTCdcJyc7DQorICAgICAgICB9IGVsc2UgaWYgKGNzRW50aXR5LkNvbXBhcmUoTCJxdW90IikgPT0gMCkgew0KKyAgICAgICAgICBtX3B3c1RleHREYXRhW21faUVudGl0eVN0YXJ0KytdID0gTCdcIic7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIG1faURhdGFQb3MgPSBtX2lFbnRpdHlTdGFydDsNCisgICAgbV9pRW50aXR5U3RhcnQgPSAtMTsNCisgIH0gZWxzZSB7DQorICAgIGlmIChtX2lFbnRpdHlTdGFydCA8IDAgJiYgY2ggPT0gTCcmJykgew0KKyAgICAgIG1faUVudGl0eVN0YXJ0ID0gbV9pRGF0YVBvczsNCisgICAgfQ0KKyAgICBtX2lEYXRhUG9zKys7DQorICB9DQorICBtX3BTdGFydCsrOw0KK30NCit2b2lkIENGREVfWE1MU3ludGF4UGFyc2VyOjpSZWFsbG9jVGV4dERhdGFCdWZmZXIoKSB7DQorICBGWFNZU19hc3NlcnQobV9wd3NUZXh0RGF0YSAhPSBOVUxMKTsNCisgIGlmIChtX2lUZXh0RGF0YVNpemUgPD0gMTAyNCAqIDEwMjQpIHsNCisgICAgbV9pVGV4dERhdGFTaXplICo9IDI7DQorICB9IGVsc2Ugew0KKyAgICBtX2lUZXh0RGF0YVNpemUgKz0gMTAyNCAqIDEwMjQ7DQorICB9DQorICBtX3B3c1RleHREYXRhID0gRlhfUmVhbGxvYyhGWF9XQ0hBUiwgbV9wd3NUZXh0RGF0YSwgbV9pVGV4dERhdGFTaXplKTsNCit9DQordm9pZCBDRkRFX1hNTFN5bnRheFBhcnNlcjo6R2V0RGF0YShDRlhfV2lkZVN0cmluZyYgd3NEYXRhKSBjb25zdCB7DQorICBGWF9XQ0hBUiogcEJ1ZiA9IHdzRGF0YS5HZXRCdWZmZXIobV9pVGV4dERhdGFMZW5ndGgpOw0KKyAgRlhTWVNfbWVtY3B5KHBCdWYsIG1fcHdzVGV4dERhdGEsIG1faVRleHREYXRhTGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICB3c0RhdGEuUmVsZWFzZUJ1ZmZlcihtX2lUZXh0RGF0YUxlbmd0aCk7DQorfQ0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmRwL3NyYy94bWwvZmRlX3htbC5oIGIveGZhL3NyYy9mZHAvc3JjL3htbC9mZGVfeG1sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI1ZWE2ZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmRwL3NyYy94bWwvZmRlX3htbC5oCkBAIC0wLDAgKzEsMzczIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZERV9YTUxfSU1QDQorI2RlZmluZSBfRkRFX1hNTF9JTVANCisjZGVmaW5lIF9GREVfQkxPQ0tfQlVGRkVSDQorI2lmZGVmIF9GREVfQkxPQ0tfQlVGRkVSDQorY2xhc3MgQ0ZERV9CbG9ja0J1ZmZlcjsNCisjZW5kaWYNCitjbGFzcyBDRkRFX1hNTE5vZGU7DQorY2xhc3MgQ0ZERV9YTUxJbnN0cnVjdGlvbjsNCitjbGFzcyBDRkRFX1hNTEVsZW1lbnQ7DQorY2xhc3MgQ0ZERV9YTUxUZXh0Ow0KK2NsYXNzIENGREVfWE1MRG9jOw0KK2NsYXNzIElGREVfWE1MUGFyc2VyOw0KK2NsYXNzIENGREVfWE1MRE9NUGFyc2VyOw0KK2NsYXNzIENGREVfWE1MU0FYUGFyc2VyOw0KK2NsYXNzIENGREVfWE1MU3ludGF4UGFyc2VyOw0KK2NsYXNzIENGREVfWE1MTm9kZSA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZERV9YTUxOb2RlKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgRkRFX1hNTE5PREVUWVBFIEdldFR5cGUoKSBjb25zdCB7IHJldHVybiBGREVfWE1MTk9ERV9Vbmtub3duOyB9DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRDaGlsZE5vZGVzKCkgY29uc3Q7DQorICB2aXJ0dWFsIENGREVfWE1MTm9kZSogR2V0Q2hpbGROb2RlKGludDMyX3QgaW5kZXgpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IEdldENoaWxkTm9kZUluZGV4KENGREVfWE1MTm9kZSogcE5vZGUpIGNvbnN0Ow0KKyAgdmlydHVhbCBDRkRFX1hNTE5vZGUqIEdldFBhdGgoY29uc3QgRlhfV0NIQVIqIHBQYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoID0gLTEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJRdWFsaWZpZWROYW1lID0gVFJVRSkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgSW5zZXJ0Q2hpbGROb2RlKENGREVfWE1MTm9kZSogcE5vZGUsIGludDMyX3QgaW5kZXggPSAtMSk7DQorICB2aXJ0dWFsIHZvaWQgUmVtb3ZlQ2hpbGROb2RlKENGREVfWE1MTm9kZSogcE5vZGUpOw0KKyAgdmlydHVhbCB2b2lkIERlbGV0ZUNoaWxkcmVuKCk7DQorICB2aXJ0dWFsIENGREVfWE1MTm9kZSogR2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOb2RlSXRlbSBlSXRlbSkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0Tm9kZUxldmVsKCkgY29uc3Q7DQorICB2aXJ0dWFsIEZYX0JPT0wgSW5zZXJ0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOb2RlSXRlbSBlSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1hNTE5vZGUqIHBOb2RlKTsNCisgIHZpcnR1YWwgQ0ZERV9YTUxOb2RlKiBSZW1vdmVOb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5vZGVJdGVtIGVJdGVtKTsNCisgIHZpcnR1YWwgQ0ZERV9YTUxOb2RlKiBDbG9uZShGWF9CT09MIGJSZWN1cnNpdmUpOw0KKyAgdmlydHVhbCB2b2lkIFNhdmVYTUxOb2RlKElGWF9TdHJlYW0qIHBYTUxTdHJlYW0pOw0KKw0KKyBwdWJsaWM6DQorICB+Q0ZERV9YTUxOb2RlKCk7DQorICB2b2lkIENsb25lQ2hpbGRyZW4oQ0ZERV9YTUxOb2RlKiBwQ2xvbmUpOw0KKyAgQ0ZERV9YTUxOb2RlKiBtX3BQYXJlbnQ7DQorICBDRkRFX1hNTE5vZGUqIG1fcENoaWxkOw0KKyAgQ0ZERV9YTUxOb2RlKiBtX3BQcmlvcjsNCisgIENGREVfWE1MTm9kZSogbV9wTmV4dDsNCit9Ow0KK2NsYXNzIENGREVfWE1MSW5zdHJ1Y3Rpb24gOiBwdWJsaWMgQ0ZERV9YTUxOb2RlIHsNCisgcHVibGljOg0KKyAgQ0ZERV9YTUxJbnN0cnVjdGlvbihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUYXJnZXQpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICB2aXJ0dWFsIEZERV9YTUxOT0RFVFlQRSBHZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb247IH0NCisgIHZpcnR1YWwgQ0ZERV9YTUxOb2RlKiBDbG9uZShGWF9CT09MIGJSZWN1cnNpdmUpOw0KKyAgdmlydHVhbCB2b2lkIEdldFRhcmdldE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzVGFyZ2V0KSBjb25zdCB7DQorICAgIHdzVGFyZ2V0ID0gbV93c1RhcmdldDsNCisgIH0NCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudEF0dHJpYnV0ZXMoKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRBdHRyaWJ1dGUoaW50MzJfdCBpbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaVZhbHVlKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfQk9PTCBIYXNBdHRyaWJ1dGUoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0U3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwd3NEZWZWYWx1ZSA9IE5VTEwpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIFNldFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpVmFsdWUpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEludGVnZXIoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaURlZlZhbHVlID0gMCkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgU2V0SW50ZWdlcihjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLCBpbnQzMl90IGlBdHRyaVZhbHVlKTsNCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0RmxvYXQoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkRlZlZhbHVlID0gMCkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgU2V0RmxvYXQoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwgRlhfRkxPQVQgZkF0dHJpVmFsdWUpOw0KKyAgdmlydHVhbCB2b2lkIFJlbW92ZUF0dHJpYnV0ZShjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lKTsNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudERhdGEoKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXREYXRhKGludDMyX3QgaW5kZXgsIENGWF9XaWRlU3RyaW5nJiB3c0RhdGEpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEFwcGVuZERhdGEoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0YSk7DQorICB2aXJ0dWFsIHZvaWQgUmVtb3ZlRGF0YShpbnQzMl90IGluZGV4KTsNCisNCisgcHVibGljOg0KKyAgfkNGREVfWE1MSW5zdHJ1Y3Rpb24oKSB7fQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c1RhcmdldDsNCisgIENGWF9XaWRlU3RyaW5nQXJyYXkgbV9BdHRyaWJ1dGVzOw0KKyAgQ0ZYX1dpZGVTdHJpbmdBcnJheSBtX1RhcmdldERhdGE7DQorfTsNCitjbGFzcyBDRkRFX1hNTEVsZW1lbnQgOiBwdWJsaWMgQ0ZERV9YTUxOb2RlIHsNCisgcHVibGljOg0KKyAgQ0ZERV9YTUxFbGVtZW50KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RhZyk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgRkRFX1hNTE5PREVUWVBFIEdldFR5cGUoKSBjb25zdCB7IHJldHVybiBGREVfWE1MTk9ERV9FbGVtZW50OyB9DQorICB2aXJ0dWFsIENGREVfWE1MTm9kZSogQ2xvbmUoRlhfQk9PTCBiUmVjdXJzaXZlKTsNCisgIHZpcnR1YWwgdm9pZCBHZXRUYWdOYW1lKENGWF9XaWRlU3RyaW5nJiB3c1RhZykgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0TG9jYWxUYWdOYW1lKENGWF9XaWRlU3RyaW5nJiB3c1RhZykgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0TmFtZXNwYWNlUHJlZml4KENGWF9XaWRlU3RyaW5nJiB3c1ByZWZpeCkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0TmFtZXNwYWNlVVJJKENGWF9XaWRlU3RyaW5nJiB3c05hbWVzcGFjZSkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRBdHRyaWJ1dGVzKCkgY29uc3Q7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0QXR0cmlidXRlKGludDMyX3QgaW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlWYWx1ZSkgY29uc3Q7DQorICB2aXJ0dWFsIEZYX0JPT0wgSGFzQXR0cmlidXRlKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEdldFN0cmluZyhjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaVZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHdzRGVmVmFsdWUgPSBOVUxMKSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBTZXRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaVZhbHVlKTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRJbnRlZ2VyKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEZWZWYWx1ZSA9IDApIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIFNldEludGVnZXIoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwgaW50MzJfdCBpQXR0cmlWYWx1ZSk7DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEZsb2F0KGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZEZWZWYWx1ZSA9IDApIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIFNldEZsb2F0KGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsIEZYX0ZMT0FUIGZBdHRyaVZhbHVlKTsNCisgIHZpcnR1YWwgdm9pZCBSZW1vdmVBdHRyaWJ1dGUoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSk7DQorICB2aXJ0dWFsIHZvaWQgR2V0VGV4dERhdGEoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgU2V0VGV4dERhdGEoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorDQorIHB1YmxpYzoNCisgIH5DRkRFX1hNTEVsZW1lbnQoKTsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NUYWc7DQorICBDRlhfV2lkZVN0cmluZ0FycmF5IG1fQXR0cmlidXRlczsNCit9Ow0KK2NsYXNzIENGREVfWE1MVGV4dCA6IHB1YmxpYyBDRkRFX1hNTE5vZGUgew0KKyBwdWJsaWM6DQorICBDRkRFX1hNTFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgRkRFX1hNTE5PREVUWVBFIEdldFR5cGUoKSBjb25zdCB7IHJldHVybiBGREVfWE1MTk9ERV9UZXh0OyB9DQorICB2aXJ0dWFsIENGREVfWE1MTm9kZSogQ2xvbmUoRlhfQk9PTCBiUmVjdXJzaXZlKTsNCisgIHZpcnR1YWwgdm9pZCBHZXRUZXh0KENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIGNvbnN0IHsgd3NUZXh0ID0gbV93c1RleHQ7IH0NCisgIHZpcnR1YWwgdm9pZCBTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsgbV93c1RleHQgPSB3c1RleHQ7IH0NCisNCisgcHVibGljOg0KKyAgfkNGREVfWE1MVGV4dCgpIHt9DQorICBDRlhfV2lkZVN0cmluZyBtX3dzVGV4dDsNCit9Ow0KK2NsYXNzIENGREVfWE1MRGVjbGFyYXRpb24gOiBwdWJsaWMgQ0ZERV9YTUxOb2RlIHsNCisgcHVibGljOg0KKyAgQ0ZERV9YTUxEZWNsYXJhdGlvbigpIDogQ0ZERV9YTUxOb2RlKCkge30NCit9Ow0KK2NsYXNzIENGREVfWE1MQ2hhckRhdGEgOiBwdWJsaWMgQ0ZERV9YTUxEZWNsYXJhdGlvbiB7DQorIHB1YmxpYzoNCisgIENGREVfWE1MQ2hhckRhdGEoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ0RhdGEpOw0KKw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICB2aXJ0dWFsIEZERV9YTUxOT0RFVFlQRSBHZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gRkRFX1hNTE5PREVfQ2hhckRhdGE7IH0NCisgIHZpcnR1YWwgQ0ZERV9YTUxOb2RlKiBDbG9uZShGWF9CT09MIGJSZWN1cnNpdmUpOw0KKyAgdmlydHVhbCB2b2lkIEdldENoYXJEYXRhKENGWF9XaWRlU3RyaW5nJiB3c0NoYXJEYXRhKSBjb25zdCB7DQorICAgIHdzQ2hhckRhdGEgPSBtX3dzQ2hhckRhdGE7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgU2V0Q2hhckRhdGEoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ0RhdGEpIHsNCisgICAgbV93c0NoYXJEYXRhID0gd3NDRGF0YTsNCisgIH0NCisNCisgcHVibGljOg0KKyAgfkNGREVfWE1MQ2hhckRhdGEoKSB7fQ0KKw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c0NoYXJEYXRhOw0KK307DQorY2xhc3MgQ0ZERV9YTUxEb2MgOiBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGREVfWE1MRG9jKCk7DQorICB+Q0ZERV9YTUxEb2MoKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKyAgdmlydHVhbCBGWF9CT09MIExvYWRYTUwoSUZYX1N0cmVhbSogcFhNTFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVhNTFBsYW5lU2l6ZSA9IDgxOTIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlUZXh0RGF0YVNpemUgPSAyNTYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfTFBYTUxSRUFERVJIQU5ETEVSIHBIYW5kbGVyID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgTG9hZFhNTChJRkRFX1hNTFBhcnNlciogcFhNTFBhcnNlcik7DQorICB2aXJ0dWFsIGludDMyX3QgRG9Mb2FkKElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCk7DQorICB2aXJ0dWFsIHZvaWQgQ2xvc2VYTUwoKTsNCisgIHZpcnR1YWwgQ0ZERV9YTUxOb2RlKiBHZXRSb290KCkgY29uc3QgeyByZXR1cm4gbV9wUm9vdDsgfQ0KKyAgdmlydHVhbCB2b2lkIFNhdmVYTUwoSUZYX1N0cmVhbSogcFhNTFN0cmVhbSA9IE5VTEwsIEZYX0JPT0wgYlNhdmVCT00gPSBUUlVFKTsNCisgIHZpcnR1YWwgdm9pZCBTYXZlWE1MTm9kZShJRlhfU3RyZWFtKiBwWE1MU3RyZWFtLCBJRkRFX1hNTE5vZGUqIHBOb2RlKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgSUZYX1N0cmVhbSogbV9wU3RyZWFtOw0KKyAgaW50MzJfdCBtX2lTdGF0dXM7DQorICBDRkRFX1hNTE5vZGUqIG1fcFJvb3Q7DQorICBJRkRFX1hNTFN5bnRheFBhcnNlciogbV9wU3ludGF4UGFyc2VyOw0KKyAgSUZERV9YTUxQYXJzZXIqIG1fcFhNTFBhcnNlcjsNCisgIHZvaWQgUmVzZXQoRlhfQk9PTCBiSW5pdFJvb3QpOw0KKyAgdm9pZCBSZWxlYXNlUGFyc2VyKCk7DQorfTsNCit0eXBlZGVmIENGWF9TdGFja1RlbXBsYXRlPENGREVfWE1MTm9kZSo+IENGREVfWE1MRE9NTm9kZVN0YWNrOw0KK2NsYXNzIENGREVfWE1MRE9NUGFyc2VyIDogcHVibGljIElGREVfWE1MUGFyc2VyLCBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGREVfWE1MRE9NUGFyc2VyKENGREVfWE1MTm9kZSogcFJvb3QsIElGREVfWE1MU3ludGF4UGFyc2VyKiBwUGFyc2VyKTsNCisgIH5DRkRFX1hNTERPTVBhcnNlcigpOw0KKw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICB2aXJ0dWFsIGludDMyX3QgRG9QYXJzZXIoSUZYX1BhdXNlKiBwUGF1c2UpOw0KKw0KKyBwcml2YXRlOg0KKyAgSUZERV9YTUxTeW50YXhQYXJzZXIqIG1fcFBhcnNlcjsNCisgIENGREVfWE1MTm9kZSogbV9wUGFyZW50Ow0KKyAgQ0ZERV9YTUxOb2RlKiBtX3BDaGlsZDsNCisgIENGREVfWE1MRE9NTm9kZVN0YWNrIG1fTm9kZVN0YWNrOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93czE7DQorICBDRlhfV2lkZVN0cmluZyBtX3dzMjsNCit9Ow0KK2NsYXNzIENGREVfWE1MVEFHIDogcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRkRFX1hNTFRBRygpIDogZVR5cGUoRkRFX1hNTE5PREVfVW5rbm93bikge30NCisgIENGREVfWE1MVEFHKGNvbnN0IENGREVfWE1MVEFHJiBzcmMpDQorICAgICAgOiB3c1RhZ05hbWUoc3JjLndzVGFnTmFtZSksIGVUeXBlKHNyYy5lVHlwZSkge30NCisgIENGWF9XaWRlU3RyaW5nIHdzVGFnTmFtZTsNCisgIEZERV9YTUxOT0RFVFlQRSBlVHlwZTsNCit9Ow0KK3R5cGVkZWYgQ0ZYX09iamVjdFN0YWNrVGVtcGxhdGU8Q0ZERV9YTUxUQUc+IENGREVfWE1MVGFnU3RhY2s7DQorY2xhc3MgQ0ZERV9YTUxTQVhQYXJzZXIgOiBwdWJsaWMgSUZERV9YTUxQYXJzZXIsIHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZERV9YTUxTQVhQYXJzZXIoRkRFX0xQWE1MUkVBREVSSEFORExFUiBwSGFuZGxlciwNCisgICAgICAgICAgICAgICAgICAgIElGREVfWE1MU3ludGF4UGFyc2VyKiBwUGFyc2VyKTsNCisgIH5DRkRFX1hNTFNBWFBhcnNlcigpOw0KKw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICB2aXJ0dWFsIGludDMyX3QgRG9QYXJzZXIoSUZYX1BhdXNlKiBwUGF1c2UpOw0KKw0KKyBwcml2YXRlOg0KKyAgdm9pZCBQdXNoKGNvbnN0IENGREVfWE1MVEFHJiB4bWxUYWcpOw0KKyAgdm9pZCBQb3AoKTsNCisgIEZERV9MUFhNTFJFQURFUkhBTkRMRVIgbV9wSGFuZGxlcjsNCisgIElGREVfWE1MU3ludGF4UGFyc2VyKiBtX3BQYXJzZXI7DQorICBDRkRFX1hNTFRhZ1N0YWNrIG1fVGFnU3RhY2s7DQorICBDRkRFX1hNTFRBRyogbV9wVGFnVG9wOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93czE7DQorICBDRlhfV2lkZVN0cmluZyBtX3dzMjsNCit9Ow0KKyNpZmRlZiBfRkRFX0JMT0NLX0JVRkZFUg0KK2NsYXNzIENGREVfQmxvY2tCdWZmZXIgOiBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGREVfQmxvY2tCdWZmZXIoaW50MzJfdCBpQWxsb2NTdGVwID0gMTAyNCAqIDEwMjQpOw0KKyAgfkNGREVfQmxvY2tCdWZmZXIoKTsNCisNCisgIEZYX0JPT0wgSW5pdEJ1ZmZlcihpbnQzMl90IGlCdWZmZXJTaXplID0gMTAyNCAqIDEwMjQpOw0KKyAgRlhfQk9PTCBJc0luaXRpYWxpemVkKCkgeyByZXR1cm4gbV9pQnVmZmVyU2l6ZSAvIG1faUFsbG9jU3RlcCA+PSAxOyB9DQorICB2b2lkIFJlbGVhc2VCdWZmZXIoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICBGWF9XQ0hBUiogR2V0QXZhaWxhYmxlQmxvY2soaW50MzJfdCYgaUluZGV4SW5CbG9jayk7DQorICBpbmxpbmUgaW50MzJfdCBHZXRBbGxvY1N0ZXAoKSBjb25zdCB7IHJldHVybiBtX2lBbGxvY1N0ZXA7IH0NCisgIGlubGluZSBpbnQzMl90JiBHZXREYXRhTGVuZ3RoUmVmKCkgeyByZXR1cm4gbV9pRGF0YUxlbmd0aDsgfQ0KKyAgaW5saW5lIHZvaWQgUmVzZXQoRlhfQk9PTCBiUmVzZXJ2ZURhdGEgPSBUUlVFKSB7DQorICAgIGlmICghYlJlc2VydmVEYXRhKSB7DQorICAgICAgbV9pU3RhcnRQb3NpdGlvbiA9IDA7DQorICAgIH0NCisgICAgbV9pRGF0YUxlbmd0aCA9IDA7DQorICB9DQorICB2b2lkIFNldFRleHRDaGFyKGludDMyX3QgaUluZGV4LCBGWF9XQ0hBUiBjaCk7DQorICBpbnQzMl90IERlbGV0ZVRleHRDaGFycyhpbnQzMl90IGlDb3VudCwgRlhfQk9PTCBiRGlyZWN0aW9uID0gVFJVRSk7DQorICB2b2lkIEdldFRleHREYXRhKENGWF9XaWRlU3RyaW5nJiB3c1RleHREYXRhLA0KKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCA9IDAsDQorICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCA9IC0xKSBjb25zdDsNCisNCisgcHJvdGVjdGVkOg0KKyAgaW5saW5lIHZvaWQgVGV4dERhdGFJbmRleDJCdWZJbmRleChjb25zdCBpbnQzMl90IGlJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUJsb2NrSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlJbm5lckluZGV4KSBjb25zdDsNCisgIHZvaWQgQ2xlYXJCdWZmZXIoKTsNCisgIENGWF9QdHJBcnJheSBtX0Jsb2NrQXJyYXk7DQorICBpbnQzMl90IG1faURhdGFMZW5ndGg7DQorICBpbnQzMl90IG1faUJ1ZmZlclNpemU7DQorICBpbnQzMl90IG1faUFsbG9jU3RlcDsNCisgIGludDMyX3QgbV9pU3RhcnRQb3NpdGlvbjsNCit9Ow0KKyNlbmRpZg0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfVGV4dCAwDQorI2RlZmluZSBGREVfWE1MU1lOVEFYTU9ERV9Ob2RlIDENCisjZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX1RhcmdldCAyDQorI2RlZmluZSBGREVfWE1MU1lOVEFYTU9ERV9UYWcgMw0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfQXR0cmlOYW1lIDQNCisjZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpRXF1YWxTaWduIDUNCisjZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpUXVvdGF0aW9uIDYNCisjZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX0F0dHJpVmFsdWUgNw0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfRW50aXR5IDgNCisjZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX0VudGl0eURlY2ltYWwgOQ0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfRW50aXR5SGV4IDEwDQorI2RlZmluZSBGREVfWE1MU1lOVEFYTU9ERV9DbG9zZUluc3RydWN0aW9uIDExDQorI2RlZmluZSBGREVfWE1MU1lOVEFYTU9ERV9CcmVha0VsZW1lbnQgMTINCisjZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX0Nsb3NlRWxlbWVudCAxMw0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfU2tpcERlY2xOb2RlIDE0DQorI2RlZmluZSBGREVfWE1MU1lOVEFYTU9ERV9EZWNsQ2hhckRhdGEgMTUNCisjZGVmaW5lIEZERV9YTUxTWU5UQVhNT0RFX1NraXBDb21tZW50IDE2DQorI2RlZmluZSBGREVfWE1MU1lOVEFYTU9ERV9Ta2lwQ29tbWVudE9yRGVjbCAxNw0KKyNkZWZpbmUgRkRFX1hNTFNZTlRBWE1PREVfVGFyZ2V0RGF0YSAxOA0KK2NsYXNzIENGREVfWE1MU3ludGF4UGFyc2VyIDogcHVibGljIElGREVfWE1MU3ludGF4UGFyc2VyLCBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENGREVfWE1MU3ludGF4UGFyc2VyKCk7DQorICB+Q0ZERV9YTUxTeW50YXhQYXJzZXIoKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKyAgdmlydHVhbCB2b2lkIEluaXQoSUZYX1N0cmVhbSogcFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVhNTFBsYW5lU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVRleHREYXRhU2l6ZSA9IDI1Nik7DQorICB2aXJ0dWFsIEZYX0RXT1JEIERvU3ludGF4UGFyc2UoKTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRTdGF0dXMoKSBjb25zdDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDdXJyZW50UG9zKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9pUGFyc2VkQ2hhcnMgKyAobV9wU3RhcnQgLSBtX3BCdWZmZXIpOw0KKyAgfQ0KKyAgdmlydHVhbCBGWF9GSUxFU0laRSBHZXRDdXJyZW50QmluYXJ5UG9zKCkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q3VycmVudE5vZGVOdW1iZXIoKSBjb25zdCB7IHJldHVybiBtX2lDdXJyZW50Tm9kZU51bTsgfQ0KKyAgdmlydHVhbCBpbnQzMl90IEdldExhc3ROb2RlTnVtYmVyKCkgY29uc3QgeyByZXR1cm4gbV9pTGFzdE5vZGVOdW07IH0NCisjaWZkZWYgX0ZERV9CTE9DS19CVUZGRVINCisgIHZpcnR1YWwgdm9pZCBHZXRUYXJnZXROYW1lKENGWF9XaWRlU3RyaW5nJiB3c1RhcmdldCkgY29uc3Qgew0KKyAgICBtX0Jsb2NrQnVmZmVyLkdldFRleHREYXRhKHdzVGFyZ2V0LCAwLCBtX2lUZXh0RGF0YUxlbmd0aCk7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgR2V0VGFnTmFtZShDRlhfV2lkZVN0cmluZyYgd3NUYWcpIGNvbnN0IHsNCisgICAgbV9CbG9ja0J1ZmZlci5HZXRUZXh0RGF0YSh3c1RhZywgMCwgbV9pVGV4dERhdGFMZW5ndGgpOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIEdldEF0dHJpYnV0ZU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlOYW1lKSBjb25zdCB7DQorICAgIG1fQmxvY2tCdWZmZXIuR2V0VGV4dERhdGEod3NBdHRyaU5hbWUsIDAsIG1faVRleHREYXRhTGVuZ3RoKTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBHZXRBdHRyaWJ1dGVWYWx1ZShDRlhfV2lkZVN0cmluZyYgd3NBdHRyaVZhbHVlKSBjb25zdCB7DQorICAgIG1fQmxvY2tCdWZmZXIuR2V0VGV4dERhdGEod3NBdHRyaVZhbHVlLCAwLCBtX2lUZXh0RGF0YUxlbmd0aCk7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgR2V0VGV4dERhdGEoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgY29uc3Qgew0KKyAgICBtX0Jsb2NrQnVmZmVyLkdldFRleHREYXRhKHdzVGV4dCwgMCwgbV9pVGV4dERhdGFMZW5ndGgpOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIEdldFRhcmdldERhdGEoQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0YSkgY29uc3Qgew0KKyAgICBtX0Jsb2NrQnVmZmVyLkdldFRleHREYXRhKHdzRGF0YSwgMCwgbV9pVGV4dERhdGFMZW5ndGgpOw0KKyAgfQ0KKyNlbHNlDQorICB2aXJ0dWFsIHZvaWQgR2V0VGFyZ2V0TmFtZShDRlhfV2lkZVN0cmluZyYgd3NUYXJnZXQpIGNvbnN0IHsNCisgICAgR2V0RGF0YSh3c1RhcmdldCk7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgR2V0VGFnTmFtZShDRlhfV2lkZVN0cmluZyYgd3NUYWcpIGNvbnN0IHsgR2V0RGF0YSh3c1RhZyk7IH0NCisgIHZpcnR1YWwgdm9pZCBHZXRBdHRyaWJ1dGVOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpTmFtZSkgY29uc3Qgew0KKyAgICBHZXREYXRhKHdzQXR0cmlOYW1lKTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBHZXRBdHRyaWJ1dGVWYWx1ZShDRlhfV2lkZVN0cmluZyYgd3NBdHRyaVZhbHVlKSBjb25zdCB7DQorICAgIEdldERhdGEod3NBdHRyaVZhbHVlKTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBHZXRUZXh0RGF0YShDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSBjb25zdCB7IEdldERhdGEod3NUZXh0KTsgfQ0KKyAgdmlydHVhbCB2b2lkIEdldFRhcmdldERhdGEoQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0YSkgY29uc3QgeyBHZXREYXRhKHdzRGF0YSk7IH0NCisjZW5kaWYNCisgcHJvdGVjdGVkOg0KKyAgSUZYX1N0cmVhbSogbV9wU3RyZWFtOw0KKyAgaW50MzJfdCBtX2lYTUxQbGFuZVNpemU7DQorICBpbnQzMl90IG1faUN1cnJlbnRQb3M7DQorICBpbnQzMl90IG1faUN1cnJlbnROb2RlTnVtOw0KKyAgaW50MzJfdCBtX2lMYXN0Tm9kZU51bTsNCisgIGludDMyX3QgbV9pUGFyc2VkQ2hhcnM7DQorICBpbnQzMl90IG1faVBhcnNlZEJ5dGVzOw0KKyAgRlhfV0NIQVIqIG1fcEJ1ZmZlcjsNCisgIGludDMyX3QgbV9pQnVmZmVyQ2hhcnM7DQorICBGWF9CT09MIG1fYkVPUzsNCisgIEZYX1dDSEFSKiBtX3BTdGFydDsNCisgIEZYX1dDSEFSKiBtX3BFbmQ7DQorICBGREVfWE1MTk9ERSBtX0N1ck5vZGU7DQorICBDRkRFX1hNTE5vZGVTdGFjayBtX1hNTE5vZGVTdGFjazsNCisjaWZkZWYgX0ZERV9CTE9DS19CVUZGRVINCisgIENGREVfQmxvY2tCdWZmZXIgbV9CbG9ja0J1ZmZlcjsNCisgIGludDMyX3QgbV9pQWxsb2NTdGVwOw0KKyAgaW50MzJfdCYgbV9pRGF0YUxlbmd0aDsNCisgIEZYX1dDSEFSKiBtX3BDdXJyZW50QmxvY2s7DQorICBpbnQzMl90IG1faUluZGV4SW5CbG9jazsNCisjZWxzZQ0KKyAgaW50MzJfdCBtX2lUZXh0RGF0YVNpemU7DQorICBGWF9XQ0hBUiogbV9wd3NUZXh0RGF0YTsNCisgIGludDMyX3QgbV9pRGF0YVBvczsNCisjZW5kaWYNCisgIGludDMyX3QgbV9pVGV4dERhdGFMZW5ndGg7DQorICBGWF9EV09SRCBtX2R3U3RhdHVzOw0KKyAgRlhfRFdPUkQgbV9kd01vZGU7DQorICBGWF9XQ0hBUiBtX3dRdW90YXRpb25NYXJrOw0KKyAgaW50MzJfdCBtX2lFbnRpdHlTdGFydDsNCisgIENGWF9EV29yZFN0YWNrIG1fU2tpcFN0YWNrOw0KKyAgRlhfV0NIQVIgbV9Ta2lwQ2hhcjsNCisgIGlubGluZSB2b2lkIFBhcnNlVGV4dENoYXIoRlhfV0NIQVIgY2gpOw0KKyNpZm5kZWYgX0ZERV9CTE9DS19CVUZGRVINCisgIHZvaWQgUmVhbGxvY1RleHREYXRhQnVmZmVyKCk7DQorICB2b2lkIEdldERhdGEoQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0YSkgY29uc3Q7DQorI2VuZGlmDQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZlZS9pbmNsdWRlL2Z4X3dvcmRicmVhay5oIGIveGZhL3NyYy9mZWUvaW5jbHVkZS9meF93b3JkYnJlYWsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjhmNTNlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZWUvaW5jbHVkZS9meF93b3JkYnJlYWsuaApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYX1dPUkRCUkVBS19IDQorI2RlZmluZSBfRlhfV09SREJSRUFLX0gNCitjbGFzcyBJRlhfQ2hhckl0ZXI7DQorDQorY2xhc3MgSUZYX1dvcmRCcmVhayB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGWF9Xb3JkQnJlYWsoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgQXR0YWNoKElGWF9DaGFySXRlciogcEl0ZXIpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBBdHRhY2goY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIE5leHQoRlhfQk9PTCBiUHJldikgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEF0KGludDMyX3QgbkluZGV4KSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0V29yZFBvcygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRXb3JkTGVuZ3RoKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldFdvcmQoQ0ZYX1dpZGVTdHJpbmcmIHdzV29yZCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIElzRU9GKEZYX0JPT0wgYlRhaWwgPSBUUlVFKSBjb25zdCA9IDA7DQorfTsNCitJRlhfV29yZEJyZWFrKiBGWF9Xb3JkQnJlYWtfQ3JlYXRlKCk7DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZWUvaW5jbHVkZS9pZmRlX3R4dGVkdGJ1Zi5oIGIveGZhL3NyYy9mZWUvaW5jbHVkZS9pZmRlX3R4dGVkdGJ1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNjc0NDYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZlZS9pbmNsdWRlL2lmZGVfdHh0ZWR0YnVmLmgKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9JRkRFX1RYVEVEVEJVRl9IDQorI2RlZmluZSBfSUZERV9UWFRFRFRCVUZfSA0KKyNkZWZpbmUgRkRFX0RFRkNIVU5LTEVOR1RIICgxMDI0KQ0KKw0KK2NsYXNzIElGREVfVHh0RWR0QnVmIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZERV9UeHRFZHRCdWYoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorDQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Q2h1bmtTaXplKGludDMyX3QgbkNodW5rU2l6ZSkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldENodW5rU2l6ZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRUZXh0TGVuZ3RoKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9XQ0hBUiBHZXRDaGFyQnlJbmRleChpbnQzMl90IG5JbmRleCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldFJhbmdlKENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQmVnaW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQgPSAtMSkgY29uc3QgPSAwOw0KKw0KKyAgdmlydHVhbCB2b2lkIEluc2VydChpbnQzMl90IG5Qb3MsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBscFRleHQsDQorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbkxlbmd0aCA9IDEpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBEZWxldGUoaW50MzJfdCBuSW5kZXgsIGludDMyX3Qgbkxlbmd0aCA9IDEpID0gMDsNCisNCisgIHZpcnR1YWwgdm9pZCBDbGVhcihGWF9CT09MIGJSZWxlYXNlID0gVFJVRSkgPSAwOw0KKw0KKyAgdmlydHVhbCBGWF9CT09MIE9wdGltaXplKElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCkgPSAwOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZWUvaW5jbHVkZS9pZmRlX3R4dGVkdGVuZ2luZS5oIGIveGZhL3NyYy9mZWUvaW5jbHVkZS9pZmRlX3R4dGVkdGVuZ2luZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNTMxZDQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZlZS9pbmNsdWRlL2lmZGVfdHh0ZWR0ZW5naW5lLmgKQEAgLTAsMCArMSwyNTkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfSUZERV9UWFRFRFRFTkdJTkVfSA0KKyNkZWZpbmUgX0lGREVfVFhURURURU5HSU5FX0gNCitjbGFzcyBJRkRFX1R4dEVkdEJ1ZjsNCitjbGFzcyBJRkRFX1R4dEVkdFBhZ2U7DQorY2xhc3MgSUZERV9UeHRFZHRFbmdpbmU7DQorY2xhc3MgSUZERV9UeHRFZHRFdmVudFNpbms7DQorY2xhc3MgSUZERV9UeHRFZHRQYXJhZzsNCisjZGVmaW5lIEZERV9UWFRFRFRfRklORF9GTEFHU19QcmV2ICgwTCA8PCAwKQ0KKyNkZWZpbmUgRkRFX1RYVEVEVF9GSU5EX0ZMQUdTX05leHQgKDFMIDw8IDApDQorI2RlZmluZSBGREVfVFhURURUX0ZJTkRfRkxBR1NfV2hvbGVXb3JkICgxTCA8PCAxKQ0KKyNkZWZpbmUgRkRFX1RYVEVEVF9GSU5EX0ZMQUdTX05vQ2FzZSAoMUwgPDwgMikNCit0eXBlZGVmIHN0cnVjdCBfRkRFX0hUWFRFRFRGSU5EIHsgdm9pZCogcERhdGE7IH0gKiBGREVfSFRYVEVEVEZJTkQ7DQorI2RlZmluZSBGREVfVEVYVEVESVRNT0RFX011bHRpTGluZXMgKDFMIDw8IDApDQorI2RlZmluZSBGREVfVEVYVEVESVRNT0RFX0F1dG9MaW5lV3JhcCAoMUwgPDwgMSkNCisjZGVmaW5lIEZERV9URVhURURJVE1PREVfUmVhZE9ubHkgKDFMIDw8IDIpDQorI2RlZmluZSBGREVfVEVYVEVESVRNT0RFX0xpbWl0QXJlYV9WZXJ0ICgxTCA8PCAzKQ0KKyNkZWZpbmUgRkRFX1RFWFRFRElUTU9ERV9MaW1pdEFyZWFfSG9yeiAoMUwgPDwgNCkNCisjZGVmaW5lIEZERV9URVhURURJVE1PREVfTm9SZWRvVW5kbyAoMUwgPDwgNSkNCisjZGVmaW5lIEZERV9URVhURURJVE1PREVfRklFTERfVEFCICgxTCA8PCA2KQ0KKyNkZWZpbmUgRkRFX1RFWFRFRElUTU9ERV9GSUVMRF9BVVRPICgxTCA8PCA3KQ0KKyNkZWZpbmUgRkRFX1RFWFRFRElUTU9ERV9WYWxpZGF0ZSAoMUwgPDwgOCkNCisjZGVmaW5lIEZERV9URVhURURJVE1PREVfUGFzc3dvcmQgKDFMIDw8IDkpDQorI2RlZmluZSBGREVfVEVYVEVESVRBTElHTl9MZWZ0ICgwTCA8PCAwKQ0KKyNkZWZpbmUgRkRFX1RFWFRFRElUQUxJR05fQ2VudGVyICgxTCA8PCAwKQ0KKyNkZWZpbmUgRkRFX1RFWFRFRElUQUxJR05fUmlnaHQgKDJMIDw8IDApDQorI2RlZmluZSBGREVfVEVYVEVESVRBTElHTl9Ob3JtYWwgKDFMIDw8IDMpDQorI2RlZmluZSBGREVfVEVYVEVESVRBTElHTl9KdXN0aWZpZWQgKDFMIDw8IDQpDQorI2RlZmluZSBGREVfVEVYVEVESVRBTElHTl9EaXN0cmlidXRlZCAoMUwgPDwgNSkNCisjZGVmaW5lIEZERV9URVhURURJVExBWU9VVF9Eb2NWZXJ0aWNhbCAoMUwgPDwgMCkNCisjZGVmaW5lIEZERV9URVhURURJVExBWU9VVF9DaGFyVmVydGlhbCAoMUwgPDwgMSkNCisjZGVmaW5lIEZERV9URVhURURJVExBWU9VVF9MaW5lUmVzZXJ2ZSAoMUwgPDwgMikNCisjZGVmaW5lIEZERV9URVhURURJVExBWU9VVF9SVEwgKDFMIDw8IDMpDQorI2RlZmluZSBGREVfVEVYVEVESVRMQVlPVVRfQ29tYlRleHQgKDFMIDw8IDQpDQorI2RlZmluZSBGREVfVEVYVEVESVRMQVlPVVRfRXhwYW5kVGFiICgxTCA8PCA1KQ0KKyNkZWZpbmUgRkRFX1RFWFRFRElUTEFZT1VUX0FyYWJpY0NvbnRleHQgKDFMIDw8IDYpDQorI2RlZmluZSBGREVfVEVYVEVESVRMQVlPVVRfQXJhYmljU2hhcGVzICgxTCA8PCA3KQ0KKyNkZWZpbmUgRkRFX1RFWFRFRElUTEFZT1VUX0xhc3RMaW5lSGVpZ2h0ICgxTCA8PCA4KQ0KK2VudW0gRkRFX1RYVEVEVE1PVkVDQVJFVCB7DQorICBNQ19Nb3ZlTm9uZSA9IDAsDQorICBNQ19MZWZ0LA0KKyAgTUNfUmlnaHQsDQorICBNQ19VcCwNCisgIE1DX0Rvd24sDQorICBNQ19Xb3JkQmFja3dhcmQsDQorICBNQ19Xb3JkRm9yd2FyZCwNCisgIE1DX0xpbmVTdGFydCwNCisgIE1DX0xpbmVFbmQsDQorICBNQ19QYXJhZ1N0YXJ0LA0KKyAgTUNfUGFyYWdFbmQsDQorICBNQ19QYWdlVXAsDQorICBNQ19QYWdlRG93biwNCisgIE1DX0hvbWUsDQorICBNQ19FbmQsDQorfTsNCitlbnVtIEZERV9UWFRFRFRfTU9ESUZZX1JFVCB7DQorICBGREVfVFhURURUX01PRElGWV9SRVRfRl9UYWIgPSAtNiwNCisgIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0xvY2tlZCA9IC01LA0KKyAgRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfSW52YWxpZGF0ZSA9IC00LA0KKyAgRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfQm91bmRhcnkgPSAtMywNCisgIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0Z1bGwgPSAtMiwNCisgIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX05vcm1hbCA9IC0xLA0KKyAgRkRFX1RYVEVEVF9NT0RJRllfUkVUX1NfTm9ybWFsID0gMCwNCisgIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9TX0Z1bGwgPSAxLA0KKyAgRkRFX1RYVEVEVF9NT0RJRllfUkVUX1NfUGFydCA9IDIsDQorICBGREVfVFhURURUX01PRElGWV9SRVRfU19FbXB0eSA9IDMsDQorICBGREVfVFhURURUX01PRElGWV9SRVRfVF9UYWIgPSA0LA0KK307DQorZW51bSBGREVfVFhURURJVF9MSU5FRU5EIHsNCisgIEZERV9UWFRFRElUX0xJTkVFTkRfQXV0bywNCisgIEZERV9UWFRFRElUX0xJTkVFTkRfQ1JMRiwNCisgIEZERV9UWFRFRElUX0xJTkVFTkRfQ1IsDQorICBGREVfVFhURURJVF9MSU5FRU5EX0xGLA0KK307DQorc3RydWN0IF9GREVfVFhURURUUEFSQU1TIHsNCisgIF9GREVfVFhURURUUEFSQU1TKCkNCisgICAgICA6IGZQbGF0ZVdpZHRoKDApLA0KKyAgICAgICAgZlBsYXRlSGVpZ2h0KDApLA0KKyAgICAgICAgbkxpbmVDb3VudCgwKSwNCisgICAgICAgIGR3TGF5b3V0U3R5bGVzKDApLA0KKyAgICAgICAgZHdBbGlnbm1lbnQoMCksDQorICAgICAgICBkd01vZGUoMCksDQorICAgICAgICBwRm9udChOVUxMKSwNCisgICAgICAgIGZGb250U2l6ZSgxMC4wZiksDQorICAgICAgICBkd0ZvbnRDb2xvcigweGZmMDAwMDAwKSwNCisgICAgICAgIGZMaW5lU3BhY2UoMTAuMGYpLA0KKyAgICAgICAgZlRhYldpZHRoKDM2KSwNCisgICAgICAgIGJUYWJFcXVpZGlzdGFudChGQUxTRSksDQorICAgICAgICB3RGVmQ2hhcigweEZFRkYpLA0KKyAgICAgICAgd0xpbmVCcmVha0NoYXIoJ1xuJyksDQorICAgICAgICBuQ2hhclJvdGF0aW9uKDApLA0KKyAgICAgICAgbkxpbmVFbmQoMCksDQorICAgICAgICBuSG9yelNjYWxlKDEwMCksDQorICAgICAgICBmQ2hhclNwYWNlKDApLA0KKyAgICAgICAgcEV2ZW50U2luayhOVUxMKSB7fQ0KKyAgRlhfRkxPQVQgZlBsYXRlV2lkdGg7DQorICBGWF9GTE9BVCBmUGxhdGVIZWlnaHQ7DQorICBpbnQzMl90IG5MaW5lQ291bnQ7DQorICBGWF9EV09SRCBkd0xheW91dFN0eWxlczsNCisgIEZYX0RXT1JEIGR3QWxpZ25tZW50Ow0KKyAgRlhfRFdPUkQgZHdNb2RlOw0KKyAgSUZYX0ZvbnQqIHBGb250Ow0KKyAgRlhfRkxPQVQgZkZvbnRTaXplOw0KKyAgRlhfQVJHQiBkd0ZvbnRDb2xvcjsNCisgIEZYX0ZMT0FUIGZMaW5lU3BhY2U7DQorICBGWF9GTE9BVCBmVGFiV2lkdGg7DQorICBGWF9CT09MIGJUYWJFcXVpZGlzdGFudDsNCisgIEZYX1dDSEFSIHdEZWZDaGFyOw0KKyAgRlhfV0NIQVIgd0xpbmVCcmVha0NoYXI7DQorICBpbnQzMl90IG5DaGFyUm90YXRpb247DQorICBpbnQzMl90IG5MaW5lRW5kOw0KKyAgaW50MzJfdCBuSG9yelNjYWxlOw0KKyAgRlhfRkxPQVQgZkNoYXJTcGFjZTsNCisgIElGREVfVHh0RWR0RXZlbnRTaW5rKiBwRXZlbnRTaW5rOw0KK307DQordHlwZWRlZiBfRkRFX1RYVEVEVFBBUkFNUyBGREVfVFhURURUUEFSQU1TOw0KK3R5cGVkZWYgX0ZERV9UWFRFRFRQQVJBTVMqIEZERV9MUFRYVEVEVFBBUkFNUzsNCitlbnVtIEZERV9UWFRFRFRfVEVYVENIQU5HRV9UWVBFIHsNCisgIEZERV9UWFRFRFRfVEVYVENIQU5HRV9UWVBFX0luc2VydCA9IDAsDQorICBGREVfVFhURURUX1RFWFRDSEFOR0VfVFlQRV9EZWxldGUsDQorICBGREVfVFhURURUX1RFWFRDSEFOR0VfVFlQRV9SZXBsYWNlLA0KK307DQorc3RydWN0IF9GREVfVFhURURUX1RFWFRDSEFOR0VfSU5GTyB7DQorICBpbnQzMl90IG5DaGFuZ2VUeXBlOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NJbnNlcnQ7DQorICBDRlhfV2lkZVN0cmluZyB3c0RlbGV0ZTsNCisgIENGWF9XaWRlU3RyaW5nIHdzUHJldlRleHQ7DQorfTsNCit0eXBlZGVmIF9GREVfVFhURURUX1RFWFRDSEFOR0VfSU5GTyBGREVfVFhURURUX1RFWFRDSEFOR0VfSU5GTzsNCit0eXBlZGVmIF9GREVfVFhURURUX1RFWFRDSEFOR0VfSU5GTyogRkRFX0xQVFhURURUX1RFWFRDSEFOR0VfSU5GTzsNCitjbGFzcyBJRkRFX1R4dEVkdEV2ZW50U2luayB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGREVfVHh0RWR0RXZlbnRTaW5rKCkge30NCisgIHZpcnR1YWwgdm9pZCBPbl9DYXJldENoYW5nZWQoSUZERV9UeHRFZHRFbmdpbmUqIHBFZGl0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5QYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJWaXNpYmxlID0gVFJVRSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIE9uX1RleHRDaGFuZ2VkKElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfVFhURURUX1RFWFRDSEFOR0VfSU5GTyYgQ2hhbmdlSW5mbykgPSAwOw0KKyAgdmlydHVhbCB2b2lkIE9uX1BhZ2VDb3VudENoYW5nZWQoSUZERV9UeHRFZHRFbmdpbmUqIHBFZGl0KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgT25fU2VsQ2hhbmdlZChJRkRFX1R4dEVkdEVuZ2luZSogcEVkaXQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbl9QYWdlTG9hZChJRkRFX1R4dEVkdEVuZ2luZSogcEVkaXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuUGFnZUluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblB1cnBvc2UpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbl9QYWdlVW5sb2FkKElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblBhZ2VJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblB1cnBvc2UpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbl9QYWdlQ2hhbmdlKElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblBhZ2VJbmRleCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIE9uX0FkZERvUmVjb3JkKElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbl9WYWxpZGF0ZUZpZWxkKElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkJsb2NrSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5GaWVsZEluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRmllbGRUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhckluZGV4KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25fVmFsaWRhdGVCbG9jayhJRkRFX1R4dEVkdEVuZ2luZSogcEVkaXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5CbG9ja0luZGV4KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25fR2V0QmxvY2tGb3JtYXRUZXh0KElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQmxvY2tJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQmxvY2tUZXh0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25fVmFsaWRhdGUoSUZERV9UeHRFZHRFbmdpbmUqIHBFZGl0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpID0gMDsNCit9Ow0KK2NsYXNzIElGWF9DaGFySXRlciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGWF9DaGFySXRlcigpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBOZXh0KEZYX0JPT0wgYlByZXYgPSBGQUxTRSkgPSAwOw0KKyAgdmlydHVhbCBGWF9XQ0hBUiBHZXRDaGFyKCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEF0KGludDMyX3QgbkluZGV4KSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0QXQoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNFT0YoRlhfQk9PTCBiVGFpbCA9IFRSVUUpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgSUZYX0NoYXJJdGVyKiBDbG9uZSgpID0gMDsNCit9Ow0KK2NsYXNzIElGREVfVHh0RWR0RW5naW5lIHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGREVfVHh0RWR0RW5naW5lKiBDcmVhdGUoKTsNCisNCisgIHZpcnR1YWwgfklGREVfVHh0RWR0RW5naW5lKCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEVkaXRQYXJhbXMoY29uc3QgRkRFX1RYVEVEVFBBUkFNUyYgcGFyYW1zKSA9IDA7DQorICB2aXJ0dWFsIGNvbnN0IEZERV9UWFRFRFRQQVJBTVMqIEdldEVkaXRQYXJhbXMoKSBjb25zdCA9IDA7DQorDQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRQYWdlcygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgSUZERV9UeHRFZHRQYWdlKiBHZXRQYWdlKGludDMyX3QgbkluZGV4KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0QnVmQ2h1bmtTaXplKGludDMyX3QgbkNodW5rU2l6ZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldFRleHRCeVN0cmVhbShJRlhfU3RyZWFtKiBwU3RyZWFtKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0VGV4dExlbmd0aCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXRUZXh0KENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50ID0gLTEpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBDbGVhclRleHQoKSA9IDA7DQorDQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q2FyZXRSZWN0KENGWF9SZWN0RiYgcnRDYXJldCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldENhcmV0UG9zKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IFNldENhcmV0UG9zKGludDMyX3QgbkluZGV4LCBGWF9CT09MIGJCZWZvcmUgPSBUUlVFKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgTW92ZUNhcmV0UG9zKEZERV9UWFRFRFRNT1ZFQ0FSRVQgZU1vdmVDYXJldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2hpZnQgPSBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ3RybCA9IEZBTFNFKSA9IDA7DQorDQorICB2aXJ0dWFsIHZvaWQgTG9jaygpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBVbmxvY2soKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNMb2NrZWQoKSBjb25zdCA9IDA7DQorDQorICB2aXJ0dWFsIGludDMyX3QgSW5zZXJ0KGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MZW5ndGgpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBEZWxldGUoaW50MzJfdCBuU3RhcnQsIEZYX0JPT0wgYkJhY2tzcGFjZSA9IEZBTFNFKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgRGVsZXRlUmFuZ2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50ID0gLTEpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBSZXBsYWNlKGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUmVwbGFjZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldExpbWl0KGludDMyX3QgbkxpbWl0KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0QWxpYXNDaGFyKEZYX1dDSEFSIHdBbGlhcykgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEZvcm1hdEJsb2NrKGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Jsb2NrRm9ybWF0KSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRFZGl0QmxvY2tzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldEVkaXRCbG9ja1RleHQoaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NCbG9ja1RleHQpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudEVkaXRGaWVsZHMoaW50MzJfdCBuQmxvY2tJbmRleCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldEVkaXRGaWVsZFRleHQoaW50MzJfdCBuQmxvY2tJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZpZWxkSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NGaWVsZFRleHQpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTdGFydEVkaXQoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgRW5kRWRpdCgpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBBZGRTZWxSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQgPSAtMSkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50U2VsUmFuZ2VzKCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFNlbFJhbmdlKGludDMyX3QgbkluZGV4LCBpbnQzMl90JiBuU3RhcnQpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBDbGVhclNlbGVjdGlvbigpID0gMDsNCisNCisgIHZpcnR1YWwgRlhfQk9PTCBSZWRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZWRvKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgVW5kbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzVW5kbykgPSAwOw0KKw0KKyAgdmlydHVhbCBpbnQzMl90IFN0YXJ0TGF5b3V0KCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IERvTGF5b3V0KElGWF9QYXVzZSogcFBhdXNlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgRW5kTGF5b3V0KCkgPSAwOw0KKw0KKyAgdmlydHVhbCBGWF9CT09MIE9wdGltaXplKElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50UGFyYWdzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBJRkRFX1R4dEVkdFBhcmFnKiBHZXRQYXJhZyhpbnQzMl90IG5QYXJhZ0luZGV4KSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIElGWF9DaGFySXRlciogQ3JlYXRlQ2hhckl0ZXIoKSA9IDA7DQorfTsNCitjbGFzcyBJRkRFX1R4dEVkdFBhcmFnIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SUZERV9UeHRFZHRQYXJhZygpIHt9DQorICB2aXJ0dWFsIGludDMyX3QgR2V0VGV4dExlbmd0aCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRTdGFydEluZGV4KCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50TGluZXMoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0TGluZVJhbmdlKGludDMyX3QgbkxpbmVJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuQ291bnQpIGNvbnN0ID0gMDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmVlL2luY2x1ZGUvaWZkZV90eHRlZHRwYWdlLmggYi94ZmEvc3JjL2ZlZS9pbmNsdWRlL2lmZGVfdHh0ZWR0cGFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZGJiNDMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZlZS9pbmNsdWRlL2lmZGVfdHh0ZWR0cGFnZS5oCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfSUZERV9UWFRFRFRQQUdFX0gNCisjZGVmaW5lIF9JRkRFX1RYVEVEVFBBR0VfSA0KK2NsYXNzIElGREVfVHh0RWR0RW5naW5lOw0KK2NsYXNzIElGREVfVHh0RWR0UGFnZTsNCitjbGFzcyBJRkRFX1R4dEVkdFBhZ2UgOiBwdWJsaWMgSUZERV9DYW52YXNTZXQsIHB1YmxpYyBJRlhfVHh0QWNjZXNzIHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGREVfVHh0RWR0UGFnZSogQ3JlYXRlKElGREVfVHh0RWR0RW5naW5lKiBwRW5naW5lLCBpbnQzMl90IG5JbmRleCk7DQorDQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisNCisgIHZpcnR1YWwgSUZERV9UeHRFZHRFbmdpbmUqIEdldEVuZ2luZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDaGFyUmVjdChpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQkJveCA9IEZBTFNFKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q2hhckluZGV4KGNvbnN0IENGWF9Qb2ludEYmIGZQb2ludCwgRlhfQk9PTCYgYkJlZm9yZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIENhbGNSYW5nZVJlY3RBcnJheShpbnQzMl90IG5TdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RkFycmF5JiBSZWN0RkFycikgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IFNlbGVjdFdvcmQoY29uc3QgQ0ZYX1BvaW50RiYgZlBvaW50LCBpbnQzMl90JiBuQ291bnQpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDaGFyU3RhcnQoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q2hhckNvdW50KCkgY29uc3QgPSAwOw0KKw0KKyAgdmlydHVhbCBpbnQzMl90IEdldERpc3BsYXlQb3MoY29uc3QgQ0ZYX1JlY3RGJiBydENsaXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyomIHBDaGFyUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBSRUNURiBwQkJveCA9IE5VTEwpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0xvYWRlZChGWF9MUENSRUNURiBwQ2xpcEJveCA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBMb2FkUGFnZShGWF9MUENSRUNURiBwQ2xpcEJveCA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgVW5sb2FkUGFnZShGWF9MUENSRUNURiBwQ2xpcEJveCA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgY29uc3QgQ0ZYX1JlY3RGJiBHZXRDb250ZW50c0JveCgpID0gMDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGJsb2NrLmNwcCBiL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGJsb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWVmNjYyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0YmxvY2suY3BwCkBAIC0wLDAgKzEsNjc0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgImZkZV90eHRlZHRibG9jay5oIg0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCisjZGVmaW5lIEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfQkdOIDB4RkZGOQ0KKyNkZWZpbmUgRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19FTkQgMHhGRkZCDQorI2RlZmluZSBGREVfVFhURURUX1pFUk9XSURUSFNQQUNFIDB4MjAwQg0KKyNkZWZpbmUgRkRFX1RYVEVEVF9JU0lOVEVHRVIoYSkgKChhKSA+PSBMJzAnICYmIChhKSA8PSBMJzknKQ0KKyNkZWZpbmUgRkRFX1RYVEVEVF9JU1NJR04oYSkgKCgoYSkgPT0gTCctJykgfHwgKChhKSA9PSBMJysnKSkNCitDRkRFX1R4dEVkdEJsb2NrOjpDRkRFX1R4dEVkdEJsb2NrKENGREVfVHh0RWR0RW5naW5lKiBwRW5naW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQmxvY2ssDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Qb3NpdGlvbikNCisgICAgOiBtX3BFbmdpbmUocEVuZ2luZSksDQorICAgICAgbV9uRGlzcGxheUxlbmd0aCgwKSwNCisgICAgICBtX25JbmRleCgwKSwNCisgICAgICBtX25Qb3NpdGlvbihuUG9zaXRpb24pIHsNCisgIGNvbnN0IEZYX1dDSEFSKiBscEJ1ZiA9IGNvbnN0IEZYX1dDSEFSICogKHdzQmxvY2spOw0KKyAgaW50MzJfdCBuQ291bnQgPSB3c0Jsb2NrLkdldExlbmd0aCgpOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIENGWF9XaWRlU3RyaW5nIHdzRml4Ow0KKyAgaW50MzJfdCBqID0gMDsNCisgIHdoaWxlIChpIDwgbkNvdW50KSB7DQorICAgIGlmIChscEJ1ZltpXSAhPSBMJyUnKSB7DQorICAgICAgd3NGaXggKz0gbHBCdWZbaV07DQorICAgIH0gZWxzZSB7DQorICAgICAgaSsrOw0KKyAgICAgIGlmIChpIDwgbkNvdW50KSB7DQorICAgICAgICBpZiAobHBCdWZbaV0gPT0gTCclJykgew0KKyAgICAgICAgICB3c0ZpeCArPSBscEJ1ZltpXTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGlmICghd3NGaXguSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgQ0ZERV9UeHRFZHRGaWVsZCogcEZpZWxkID0gQ0ZERV9UeHRFZHRGaWVsZDo6Q3JlYXRlKHdzRml4LCBqLCB0aGlzKTsNCisgICAgICAgICAgICBqKys7DQorICAgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBGaWVsZCk7DQorICAgICAgICAgICAgbV9GaWVsZEFyci5BZGQocEZpZWxkKTsNCisgICAgICAgICAgICBtX25EaXNwbGF5TGVuZ3RoICs9IHBGaWVsZC0+R2V0RGlzcGxheUxlbmd0aCgpOw0KKyAgICAgICAgICAgIHdzRml4LkVtcHR5KCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaW50MzJfdCBuUG9zID0gaSAtIDE7DQorICAgICAgICAgIHdoaWxlIChscEJ1ZltpKytdICE9IEwnKScpDQorICAgICAgICAgICAgOw0KKyAgICAgICAgICBpKys7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0ZpZWxkKGxwQnVmICsgblBvcywgaSAtIG5Qb3MpOw0KKyAgICAgICAgICBDRkRFX1R4dEVkdEZpZWxkKiBwRmllbGQgPSBDRkRFX1R4dEVkdEZpZWxkOjpDcmVhdGUod3NGaWVsZCwgaiwgdGhpcyk7DQorICAgICAgICAgIGorKzsNCisgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBGaWVsZCk7DQorICAgICAgICAgIG1fRmllbGRBcnIuQWRkKHBGaWVsZCk7DQorICAgICAgICAgIG1fRWRpdEZpZWxkQXJyLkFkZChwRmllbGQpOw0KKyAgICAgICAgICBtX25EaXNwbGF5TGVuZ3RoICs9IHBGaWVsZC0+R2V0RGlzcGxheUxlbmd0aCgpOw0KKyAgICAgICAgICBpLS07DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGkrKzsNCisgIH0NCisgIGlmICghd3NGaXguSXNFbXB0eSgpKSB7DQorICAgIENGREVfVHh0RWR0RmllbGQqIHBGaWVsZCA9IENGREVfVHh0RWR0RmllbGQ6OkNyZWF0ZSh3c0ZpeCwgaiwgdGhpcyk7DQorICAgIEZYU1lTX2Fzc2VydChwRmllbGQpOw0KKyAgICBtX0ZpZWxkQXJyLkFkZChwRmllbGQpOw0KKyAgICBtX25EaXNwbGF5TGVuZ3RoICs9IHBGaWVsZC0+R2V0RGlzcGxheUxlbmd0aCgpOw0KKyAgfQ0KK30NCitDRkRFX1R4dEVkdEJsb2NrOjp+Q0ZERV9UeHRFZHRCbG9jaygpIHsNCisgIGludDMyX3QgbkNvdW50ID0gbV9GaWVsZEFyci5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICBDRkRFX1R4dEVkdEZpZWxkKiBwRmllbGQgPSBtX0ZpZWxkQXJyW2ldOw0KKyAgICBwRmllbGQtPlJlbGVhc2UoKTsNCisgIH0NCisgIG1fRmllbGRBcnIuUmVtb3ZlQWxsKCk7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRCbG9jazo6R2V0RGlzcGxheVRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzRGlzcGxheSkgew0KKyAgaW50MzJfdCBuQ291bnQgPSBtX0ZpZWxkQXJyLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgIENGREVfVHh0RWR0RmllbGQqIHBGaWVsZCA9IG1fRmllbGRBcnJbaV07DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCisgICAgcEZpZWxkLT5HZXREaXNwbGF5VGV4dCh3c1RlbXApOw0KKyAgICB3c0Rpc3BsYXkgKz0gd3NUZW1wOw0KKyAgfQ0KK30NCitpbnQzMl90IENGREVfVHh0RWR0QmxvY2s6OkdldExlbmd0aCgpIGNvbnN0IHsNCisgIGludDMyX3QgbkRpc3BsYXlMZW5ndGggPSAwOw0KKyAgaW50MzJfdCBuQ291bnQgPSBtX0ZpZWxkQXJyLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgIENGREVfVHh0RWR0RmllbGQqIHBGaWVsZCA9IG1fRmllbGRBcnJbaV07DQorICAgIG5EaXNwbGF5TGVuZ3RoICs9IHBGaWVsZC0+R2V0RGlzcGxheUxlbmd0aCgpOw0KKyAgfQ0KKyAgcmV0dXJuIG5EaXNwbGF5TGVuZ3RoOw0KK30NCit2b2lkIENGREVfVHh0RWR0QmxvY2s6OkdldEJsb2NrVGV4dChDRlhfV2lkZVN0cmluZyYgd3NCbG9jaykgew0KKyAgaW50MzJfdCBuQ291bnQgPSBtX0ZpZWxkQXJyLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgIENGREVfVHh0RWR0RmllbGQqIHBGaWVsZCA9IG1fRmllbGRBcnJbaV07DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCisgICAgcEZpZWxkLT5HZXRGaWVsZFRleHQod3NUZW1wKTsNCisgICAgd3NCbG9jayArPSB3c1RlbXA7DQorICB9DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRCbG9jazo6Q291bnRGaWVsZCgpIGNvbnN0IHsNCisgIHJldHVybiBtX0VkaXRGaWVsZEFyci5HZXRTaXplKCk7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRCbG9jazo6R2V0RmllbGRUZXh0KGludDMyX3QgbkluZGV4LCBDRlhfV2lkZVN0cmluZyYgd3NGaWVsZCkgew0KKyAgQ0ZERV9UeHRFZHRGaWVsZCogcEZpZWxkID0gbV9FZGl0RmllbGRBcnJbbkluZGV4XTsNCisgIHBGaWVsZC0+R2V0RmllbGRUZXh0KHdzRmllbGQpOw0KK30NCitpbnQzMl90IENGREVfVHh0RWR0QmxvY2s6OkdldEZpZWxkVGV4dExlbmd0aCgpIGNvbnN0IHsNCisgIGludDMyX3QgblRvdGFsTGVuZ3RoID0gMDsNCisgIGludDMyX3QgbkNvdW50ID0gbV9FZGl0RmllbGRBcnIuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsNCisgICAgQ0ZERV9UeHRFZHRGaWVsZCogcEZpZWxkID0gbV9FZGl0RmllbGRBcnJbaV07DQorICAgIG5Ub3RhbExlbmd0aCA9IHBGaWVsZC0+R2V0RmllbGRUZXh0TGVuZ3RoKCk7DQorICB9DQorICByZXR1cm4gblRvdGFsTGVuZ3RoOw0KK30NCitpbnQzMl90IENGREVfVHh0RWR0QmxvY2s6OkdldFBvcygpIGNvbnN0IHsNCisgIHJldHVybiBtX25Qb3NpdGlvbjsNCit9DQordm9pZCBDRkRFX1R4dEVkdEJsb2NrOjpHZXRSZWFsVGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSBjb25zdCB7DQorICBpbnQzMl90IG5Db3VudCA9IG1fRmllbGRBcnIuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsNCisgICAgQ0ZERV9UeHRFZHRGaWVsZCogcEZpZWxkID0gbV9GaWVsZEFycltpXTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KKyAgICBwRmllbGQtPkdldEZpZWxkVGV4dCh3c1RlbXApOw0KKyAgICB3c1RleHQgKz0gd3NUZW1wOw0KKyAgfQ0KK30NCit2b2lkIENGREVfVHh0RWR0QmxvY2s6OkJhY2t1cCgpIHsNCisgIGludDMyX3QgbkNvdW50ID0gbV9FZGl0RmllbGRBcnIuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsNCisgICAgbV9FZGl0RmllbGRBcnJbaV0tPkJhY2t1cCgpOw0KKyAgfQ0KK30NCit2b2lkIENGREVfVHh0RWR0QmxvY2s6OlJlc3RvcmUoKSB7DQorICBpbnQzMl90IG5Db3VudCA9IG1fRWRpdEZpZWxkQXJyLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgIG1fRWRpdEZpZWxkQXJyW2ldLT5SZXN0b3JlKCk7DQorICB9DQorfQ0KK0NGREVfVHh0RWR0RmllbGRGb3JtYXRQYXJzZXI6OkNGREVfVHh0RWR0RmllbGRGb3JtYXRQYXJzZXIoKSB7fQ0KK0NGREVfVHh0RWR0RmllbGRGb3JtYXRQYXJzZXI6On5DRkRFX1R4dEVkdEZpZWxkRm9ybWF0UGFyc2VyKCkgew0KKyAgRkRFX0xQVFhURURURk9STUFUSVRFTSBscEl0ZW0gPSBOVUxMOw0KKyAgaW50MzJfdCBuQ291bnQgPSBtX0l0ZW1BcnIuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsNCisgICAgbHBJdGVtID0gbV9JdGVtQXJyW2ldOw0KKyAgICBkZWxldGUgbHBJdGVtOw0KKyAgfQ0KKyAgbV9JdGVtQXJyLlJlbW92ZUFsbCgpOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0RmllbGRGb3JtYXRQYXJzZXI6OlBhcnNlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCkgew0KKyAgbV93c0Zvcm1hdCA9IHdzRm9ybWF0Ow0KKyAgY29uc3QgRlhfV0NIQVIqIHBCdWYgPSBjb25zdCBGWF9XQ0hBUiAqIChtX3dzRm9ybWF0KTsNCisgIGludDMyX3QgbkNvdW50ID0gbV93c0Zvcm1hdC5HZXRMZW5ndGgoKTsNCisgIG5Db3VudCAtPSAyOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIGZvciAoOyBpIDwgbkNvdW50OyBpKyspIHsNCisgICAgRlhfV0NIQVIgd0NoYXIgPSBwQnVmW2ldOw0KKyAgICBpZiAod0NoYXIgPT0gTCcoJykgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpKys7DQorICBGREVfVFhURURURk9STUFUSVRFTSBGb3JtYXRJdGVtOw0KKyAgZm9yICg7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICB3aGlsZSAocEJ1ZltpXSA9PSBMJyAnKSB7DQorICAgICAgaSsrOw0KKyAgICB9DQorICAgIEZvcm1hdEl0ZW0ubktleVN0YXJ0ID0gaTsNCisgICAgd2hpbGUgKHBCdWZbaV0gIT0gTCc6Jykgew0KKyAgICAgIGkrKzsNCisgICAgfQ0KKyAgICBGb3JtYXRJdGVtLm5LZXlDb3VudCA9IGkgLSBGb3JtYXRJdGVtLm5LZXlTdGFydDsNCisgICAgaSsrOw0KKyAgICBGb3JtYXRJdGVtLm5WYWxTdGFydCA9IGk7DQorICAgIHdoaWxlIChwQnVmW2ldICE9IEwnOycgJiYgaSA8IG5Db3VudCkgew0KKyAgICAgIGkrKzsNCisgICAgfQ0KKyAgICBGb3JtYXRJdGVtLm5WYWxDb3VudCA9IGkgLSBGb3JtYXRJdGVtLm5WYWxTdGFydDsNCisgICAgRkRFX0xQVFhURURURk9STUFUSVRFTSBwRm9ybWF0SXRlbSA9IG5ldyBGREVfVFhURURURk9STUFUSVRFTTsNCisgICAgRlhTWVNfbWVtY3B5KHBGb3JtYXRJdGVtLCAmRm9ybWF0SXRlbSwgc2l6ZW9mKEZERV9UWFRFRFRGT1JNQVRJVEVNKSk7DQorICAgIG1fSXRlbUFyci5BZGQocEZvcm1hdEl0ZW0pOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRGaWVsZEZvcm1hdFBhcnNlcjo6Q291bnRJdGVtcygpIGNvbnN0IHsNCisgIHJldHVybiBtX0l0ZW1BcnIuR2V0U2l6ZSgpOw0KK30NCit2b2lkIENGREVfVHh0RWR0RmllbGRGb3JtYXRQYXJzZXI6OkdldEl0ZW0oaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0tleSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpIGNvbnN0IHsNCisgIEZERV9MUFRYVEVEVEZPUk1BVElURU0gbHBJdGVtID0gbV9JdGVtQXJyW25JbmRleF07DQorICBjb25zdCBGWF9XQ0hBUiogbHBTcmNCdWYgPSBjb25zdCBGWF9XQ0hBUiAqIChtX3dzRm9ybWF0KTsNCisgIEZYX1dDSEFSKiBscERzdEJ1ZiA9IHdzS2V5LkdldEJ1ZmZlcihscEl0ZW0tPm5LZXlDb3VudCk7DQorICBGWFNZU19tZW1jcHkobHBEc3RCdWYsIGxwU3JjQnVmICsgbHBJdGVtLT5uS2V5U3RhcnQsDQorICAgICAgICAgICAgICAgbHBJdGVtLT5uS2V5Q291bnQgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgIHdzS2V5LlJlbGVhc2VCdWZmZXIobHBJdGVtLT5uS2V5Q291bnQpOw0KKyAgbHBEc3RCdWYgPSB3c1ZhbHVlLkdldEJ1ZmZlcihscEl0ZW0tPm5WYWxDb3VudCk7DQorICBGWFNZU19tZW1jcHkobHBEc3RCdWYsIGxwU3JjQnVmICsgbHBJdGVtLT5uVmFsU3RhcnQsDQorICAgICAgICAgICAgICAgbHBJdGVtLT5uVmFsQ291bnQgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgIHdzVmFsdWUuUmVsZWFzZUJ1ZmZlcihscEl0ZW0tPm5WYWxDb3VudCk7DQorfQ0KK0NGREVfVHh0RWR0RmllbGQqIENGREVfVHh0RWR0RmllbGQ6OkNyZWF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGaWVsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfVHh0RWR0QmxvY2sqIHBCbG9jaykgew0KKyAgaWYgKHdzRmllbGRbMF0gIT0gTCclJyB8fCAod3NGaWVsZFswXSA9PSBMJyUnICYmIHdzRmllbGRbMV0gPT0gTCclJykpIHsNCisgICAgcmV0dXJuIG5ldyBDRkRFX1R4dEVkdEZpZWxkX0ZpeGVkKHdzRmllbGQsIG5JbmRleCwgcEJsb2NrKTsNCisgIH0NCisgIEZYX1dDSEFSIHdjVHlwZSA9IHdzRmllbGRbd3NGaWVsZC5HZXRMZW5ndGgoKSAtIDFdOw0KKyAgc3dpdGNoICh3Y1R5cGUpIHsNCisgICAgY2FzZSBMJ2QnOg0KKyAgICAgIHJldHVybiBuZXcgQ0ZERV9UeHRFZHRGaWVsZF9JbnRlZ2VyKHdzRmllbGQsIG5JbmRleCwgcEJsb2NrKTsNCisgICAgY2FzZSBMJ2YnOg0KKyAgICAgIHJldHVybiBuZXcgQ0ZERV9UeHRFZHRGaWVsZF9GbG9hdCh3c0ZpZWxkLCBuSW5kZXgsIHBCbG9jayk7DQorICAgIGNhc2UgTCdzJzoNCisgICAgICByZXR1cm4gbmV3IENGREVfVHh0RWR0RmllbGRfU3RyaW5nKHdzRmllbGQsIG5JbmRleCwgcEJsb2NrKTsNCisgICAgY2FzZSBMJ3AnOg0KKyAgICAgIHJldHVybiBuZXcgQ0ZERV9UeHRFZHRGaWVsZF9QYXNzd29yZCh3c0ZpZWxkLCBuSW5kZXgsIHBCbG9jayk7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQordm9pZCBDRkRFX1R4dEVkdEZpZWxkOjpSZWxlYXNlKCkgew0KKyAgZGVsZXRlIHRoaXM7DQorfQ0KK0NGREVfVHh0RWR0RmllbGQ6OkNGREVfVHh0RWR0RmllbGQoaW50MzJfdCBuSW5kZXgsIENGREVfVHh0RWR0QmxvY2sqIHBCbG9jaykNCisgICAgOiBtX25MZW5ndGgoLTEpLA0KKyAgICAgIG1fd2NGaWxsKEwnICcpLA0KKyAgICAgIG1fYlJlc2VydmVTcGFjZShGQUxTRSksDQorICAgICAgbV9iTGVmdEFsaWdubWVudChUUlVFKSwNCisgICAgICBtX25JbmRleChuSW5kZXgpLA0KKyAgICAgIG1fcEJsb2NrKHBCbG9jaykgew0KKyAgRlhTWVNfYXNzZXJ0KHBCbG9jayk7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRGaWVsZDo6SW5zZXJ0KGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0lucywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuQ2FyZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkJlZm9yZSkgew0KKyAgaW50MzJfdCBuRmllbGRMZW5ndGggPSBtX3dzRmllbGQuR2V0TGVuZ3RoKCk7DQorICBpbnQzMl90IG5Jbm5lckluZGV4ID0gbkluZGV4IC0gRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRTsNCisgIGlmIChtX2JSZXNlcnZlU3BhY2UgJiYgIW1fYkxlZnRBbGlnbm1lbnQpIHsNCisgICAgbklubmVySW5kZXggLT0gKG1fbkxlbmd0aCAtIG5GaWVsZExlbmd0aCk7DQorICB9DQorICBGWFNZU19hc3NlcnQobklubmVySW5kZXggPj0gMCAmJiBuSW5uZXJJbmRleCA8PSBuRmllbGRMZW5ndGgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wID0gbV93c0ZpZWxkOw0KKyAgaW50MzJfdCBuSW5zTGVuZ3RoID0gd3NJbnMuR2V0TGVuZ3RoKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuSW5zTGVuZ3RoOyBpKyssIG5Jbm5lckluZGV4KyspIHsNCisgICAgd3NUZW1wLkluc2VydChuSW5uZXJJbmRleCwgd3NJbnNbaV0pOw0KKyAgfQ0KKyAgaW50MzJfdCBuUmV0ID0gVmFsaWRhdGUod3NUZW1wKTsNCisgIHN3aXRjaCAoblJldCkgew0KKyAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9GVUxMOg0KKyAgICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfRl9GVUxMOw0KKyAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9JTlZBTElEQVRFOg0KKyAgICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfRl9JTlZBTElEQVRFOw0KKyAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfUzoNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIG1fd3NGaWVsZCA9IHdzVGVtcDsNCisgIG5DYXJldCA9IG5JbmRleCArDQorICAgICAgICAgICAoKG1fYlJlc2VydmVTcGFjZSAmJiAhbV9iTGVmdEFsaWdubWVudCkgPyAtbkluc0xlbmd0aCA6IG5JbnNMZW5ndGgpOw0KKyAgYkJlZm9yZSA9IFRSVUU7DQorICByZXR1cm4gKG5GaWVsZExlbmd0aCArIG5JbnNMZW5ndGggPCBtX25MZW5ndGgpDQorICAgICAgICAgICAgID8gRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX1NfTk9STUFMDQorICAgICAgICAgICAgIDogRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX1NfRlVMTDsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdEZpZWxkOjpEZWxldGUoaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRGVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5DYXJldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiQmVmb3JlKSB7DQorICBpbnQzMl90IG5GaWVsZExlbmd0aCA9IG1fd3NGaWVsZC5HZXRMZW5ndGgoKTsNCisgIGludDMyX3QgbklubmVySW5kZXggPSBuSW5kZXggLSBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFOw0KKyAgaWYgKG1fYlJlc2VydmVTcGFjZSAmJiAhbV9iTGVmdEFsaWdubWVudCkgew0KKyAgICBuSW5uZXJJbmRleCAtPSAobV9uTGVuZ3RoIC0gbkZpZWxkTGVuZ3RoKTsNCisgIH0NCisgIGlmIChuSW5uZXJJbmRleCA8IDAgfHwgKG5Jbm5lckluZGV4ICsgbkNvdW50KSA+IG5GaWVsZExlbmd0aCkgew0KKyAgICByZXR1cm4gRkRFX0ZPUk1BVF9GSUVMRF9ERUxFVEVfUkVUX0ZfQk9VTkRBUlk7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1RlbXAgPSBtX3dzRmllbGQ7DQorICB3c1RlbXAuRGVsZXRlKG5Jbm5lckluZGV4LCBuQ291bnQpOw0KKyAgaW50MzJfdCBuUmV0ID0gVmFsaWRhdGUod3NUZW1wKTsNCisgIHN3aXRjaCAoblJldCkgew0KKyAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9GVUxMOg0KKyAgICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfRl9CT1VOREFSWTsNCisgICAgY2FzZSBGREVfRk9STUFUX0ZJRUxEX1ZBTElEQVRFX0ZfSU5WQUxJREFURToNCisgICAgICByZXR1cm4gRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX0ZfSU5WQUxJREFURTsNCisgICAgY2FzZSBGREVfRk9STUFUX0ZJRUxEX1ZBTElEQVRFX1M6DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICBGWF9XQ0hBUiogbHBCdWYgPSB3c0RlbC5HZXRCdWZmZXIobkNvdW50KTsNCisgIEZYU1lTX21lbWNweShscEJ1ZiwgY29uc3QgRlhfV0NIQVIqKG1fd3NGaWVsZCkgKyBuSW5uZXJJbmRleCwNCisgICAgICAgICAgICAgICBuQ291bnQgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgIHdzRGVsLlJlbGVhc2VCdWZmZXIobkNvdW50KTsNCisgIG1fd3NGaWVsZCA9IHdzVGVtcDsNCisgIG5DYXJldCA9IG5JbmRleCArIChtX2JSZXNlcnZlU3BhY2UgJiYgIW1fYkxlZnRBbGlnbm1lbnQpID8gbkNvdW50IDogMDsNCisgIGJCZWZvcmUgPSBUUlVFOw0KKyAgcmV0dXJuIEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9TOw0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RmllbGQ6OlJlcGxhY2UoaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NJbnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0RlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbkNhcmV0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiQmVmb3JlKSB7DQorICBpbnQzMl90IG5Jbm5lckluZGV4ID0gbkluZGV4IC0gRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRTsNCisgIGludDMyX3Qgbkluc0xlbmd0aCA9IHdzSW5zLkdldExlbmd0aCgpOw0KKyAgaW50MzJfdCBuRmllbGRMZW5ndGggPSBtX3dzRmllbGQuR2V0TGVuZ3RoKCk7DQorICBDRlhfV2lkZVN0cmluZyB3c1RlbXAgPSBtX3dzRmllbGQ7DQorICBpZiAobV9iUmVzZXJ2ZVNwYWNlICYmICFtX2JMZWZ0QWxpZ25tZW50KSB7DQorICAgIG5Jbm5lckluZGV4IC09IChtX25MZW5ndGggLSBuRmllbGRMZW5ndGgpOw0KKyAgfQ0KKyAgRlhTWVNfYXNzZXJ0KG5Jbm5lckluZGV4ID49IDAgJiYgbklubmVySW5kZXggPD0gbkZpZWxkTGVuZ3RoKTsNCisgIGlmIChuSW5uZXJJbmRleCArIG5Db3VudCA+IG5GaWVsZExlbmd0aCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB3c1RlbXAuRGVsZXRlKG5Jbm5lckluZGV4LCBuQ291bnQpOw0KKyAgaW50MzJfdCBuSW5uZXJJbmRleEJLID0gbklubmVySW5kZXg7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuSW5zTGVuZ3RoOyBpKyssIG5Jbm5lckluZGV4KyspIHsNCisgICAgd3NUZW1wLkluc2VydChuSW5uZXJJbmRleCwgd3NJbnNbaV0pOw0KKyAgfQ0KKyAgaW50MzJfdCBuUmV0ID0gVmFsaWRhdGUod3NUZW1wKTsNCisgIHN3aXRjaCAoblJldCkgew0KKyAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9GVUxMOg0KKyAgICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfRl9GVUxMOw0KKyAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9JTlZBTElEQVRFOg0KKyAgICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfRl9JTlZBTElEQVRFOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgRlhfV0NIQVIqIGxwQnVmZmVyID0gd3NEZWwuR2V0QnVmZmVyKG5Db3VudCk7DQorICBjb25zdCBGWF9XQ0hBUiogbHBTcmNCdWYgPSBjb25zdCBGWF9XQ0hBUiAqIChtX3dzRmllbGQpOw0KKyAgRlhTWVNfbWVtY3B5KGxwQnVmZmVyLCBscFNyY0J1ZiArIG5Jbm5lckluZGV4QkssIG5Db3VudCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgd3NEZWwuUmVsZWFzZUJ1ZmZlcihuQ291bnQpOw0KKyAgbV93c0ZpZWxkID0gd3NUZW1wOw0KKyAgbkNhcmV0ID0NCisgICAgICBuSW5kZXggKyAoKG1fYlJlc2VydmVTcGFjZSAmJiAhbV9iTGVmdEFsaWdubWVudCkgPyAobkNvdW50IC0gbkluc0xlbmd0aCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAobkluc0xlbmd0aCkpOw0KKyAgcmV0dXJuIEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9TX05PUk1BTDsNCit9DQordm9pZCBDRkRFX1R4dEVkdEZpZWxkOjpHZXREaXNwbGF5VGV4dChDRlhfV2lkZVN0cmluZyYgd3NEaXNwbGF5KSB7DQorICBDRlhfV2lkZVN0cmluZyB3c0ZpZWxkOw0KKyAgR2V0Tm9ybWFsaXplZEZpZWxkVGV4dCh3c0ZpZWxkKTsNCisgIGludDMyX3Qgbkxlbmd0aCA9IHdzRmllbGQuR2V0TGVuZ3RoKCkgKyBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFICsNCisgICAgICAgICAgICAgICAgICAgIEZERV9GT1JNQVRfRURJVF9GSUVMRF9UQUlMU0laRTsNCisgIEZYX1dDSEFSKiBscEJ1ZmZlciA9IHdzRGlzcGxheS5HZXRCdWZmZXIobkxlbmd0aCk7DQorICBscEJ1ZmZlclswXSA9IEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfQkdOOw0KKyAgbHBCdWZmZXJbbkxlbmd0aCAtIDFdID0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19FTkQ7DQorICBGWF9EV09SRCBuQWRkcmVzcyA9IChGWF9EV09SRCkgdGhpczsNCisgIEZYU1lTX21lbWNweShscEJ1ZmZlciArIDEsICZuQWRkcmVzcywgc2l6ZW9mKEZYX0RXT1JEKSk7DQorICBGWFNZU19tZW1jcHkobHBCdWZmZXIgKyAzLCBjb25zdCBGWF9XQ0hBUiood3NGaWVsZCksDQorICAgICAgICAgICAgICAgKG5MZW5ndGggLSA0KSAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgd3NEaXNwbGF5LlJlbGVhc2VCdWZmZXIobkxlbmd0aCk7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRGaWVsZDo6R2V0RGlzcGxheUxlbmd0aCgpIHsNCisgIHJldHVybiAobV9iUmVzZXJ2ZVNwYWNlID8gbV9uTGVuZ3RoIDogbV93c0ZpZWxkLkdldExlbmd0aCgpKSArDQorICAgICAgICAgRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRSArIEZERV9GT1JNQVRfRURJVF9GSUVMRF9UQUlMU0laRTsNCit9DQordm9pZCBDRkRFX1R4dEVkdEZpZWxkOjpHZXRGaWVsZFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzRmllbGQpIHsNCisgIHdzRmllbGQgPSBtX3dzRmllbGQ7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRGaWVsZDo6R2V0RmllbGRUZXh0TGVuZ3RoKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fd3NGaWVsZC5HZXRMZW5ndGgoKTsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdEZpZWxkOjpHZXRSZWFsSW5kZXgoaW50MzJfdCBuSW5kZXgpIGNvbnN0IHsNCisgIGludDMyX3QgbklubmVySW5kZXggPSBuSW5kZXggLSBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFOw0KKyAgaWYgKG5Jbm5lckluZGV4IDwgMCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGludDMyX3QgbkZpZWxkTGVuZ3RoID0gbV93c0ZpZWxkLkdldExlbmd0aCgpOw0KKyAgaWYgKG1fYlJlc2VydmVTcGFjZSAmJiAhbV9iTGVmdEFsaWdubWVudCkgew0KKyAgICBuSW5uZXJJbmRleCAtPSAobV9uTGVuZ3RoIC0gbkZpZWxkTGVuZ3RoKTsNCisgIH0NCisgIGlmIChuSW5uZXJJbmRleCA8IDApIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpZiAobklubmVySW5kZXggPj0gbkZpZWxkTGVuZ3RoKSB7DQorICAgIHJldHVybiBuRmllbGRMZW5ndGg7DQorICB9DQorICByZXR1cm4gbklubmVySW5kZXggKyAxOw0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RmllbGQ6Ok5vcm1hbGl6ZUNhcmV0UG9zKA0KKyAgICBpbnQzMl90IG5JbmRleCwNCisgICAgRkRFX0ZPUk1BVF9DQVJFVF9ESVJFQ1RJT04gZURpcmVjdGlvbikgY29uc3Qgew0KKyAgbkluZGV4IC09IEZERV9GT1JNQVRfRURJVF9GSUVMRF9IQURFUlNJWkU7DQorICBpbnQzMl90IG5MZW5ndGggPSBtX3dzRmllbGQuR2V0TGVuZ3RoKCk7DQorICBpZiAobV9iUmVzZXJ2ZVNwYWNlKSB7DQorICAgIGludDMyX3QgbkZpZWxkTGVuZ3RoID0gbV93c0ZpZWxkLkdldExlbmd0aCgpOw0KKyAgICBpZiAobV9iTGVmdEFsaWdubWVudCkgew0KKyAgICAgIGlmIChuSW5kZXggPiBuRmllbGRMZW5ndGgpIHsNCisgICAgICAgIGlmIChlRGlyZWN0aW9uID09IEZERV9GT1JNQVRfQ0FSRVRfRk9SV0FSRCkgew0KKyAgICAgICAgICByZXR1cm4gLTE7DQorICAgICAgICB9DQorICAgICAgICBuSW5kZXggPSBuRmllbGRMZW5ndGg7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGludDMyX3QgblJlc2VydmVMZW5ndGggPSBtX25MZW5ndGggLSBuRmllbGRMZW5ndGg7DQorICAgICAgaWYgKG5JbmRleCA8IG5SZXNlcnZlTGVuZ3RoKSB7DQorICAgICAgICBpZiAoZURpcmVjdGlvbiA9PSBGREVfRk9STUFUX0NBUkVUX0JBQ0tXQVJEKSB7DQorICAgICAgICAgIHJldHVybiAtMjsNCisgICAgICAgIH0NCisgICAgICAgIG5JbmRleCA9IG5SZXNlcnZlTGVuZ3RoOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIG5JbmRleCArIEZERV9GT1JNQVRfRURJVF9GSUVMRF9IQURFUlNJWkU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRGaWVsZDo6R2V0RWRpdGFibGVSYW5nZShpbnQzMl90JiBuQmduLCBpbnQzMl90JiBuRW5kKSBjb25zdCB7DQorICBpZiAobV9iUmVzZXJ2ZVNwYWNlICYmICFtX2JMZWZ0QWxpZ25tZW50KSB7DQorICAgIG5FbmQgPSBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFICsgbV9uTGVuZ3RoOw0KKyAgICBuQmduID0gbkVuZCAtIG1fd3NGaWVsZC5HZXRMZW5ndGgoKTsNCisgIH0gZWxzZSB7DQorICAgIG5CZ24gPSBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFOw0KKyAgICBuRW5kID0gbkJnbiArIG1fd3NGaWVsZC5HZXRMZW5ndGgoKTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENGREVfVHh0RWR0RmllbGQ6OkJhY2t1cCgpIHsNCisgIG1fd3NCYWNrdXAgPSBtX3dzRmllbGQ7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRGaWVsZDo6UmVzdG9yZSgpIHsNCisgIG1fd3NGaWVsZCA9IG1fd3NCYWNrdXA7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRGaWVsZDo6VmFsaWRhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgY29uc3Qgew0KKyAgaWYgKG1fbkxlbmd0aCA8IDApIHsNCisgICAgcmV0dXJuIEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9TOw0KKyAgfQ0KKyAgcmV0dXJuIHdzVGV4dC5HZXRMZW5ndGgoKSA8PSBtX25MZW5ndGggPyBGREVfRk9STUFUX0ZJRUxEX1ZBTElEQVRFX1MNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9GX0ZVTEw7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRGaWVsZDo6R2V0Tm9ybWFsaXplZEZpZWxkVGV4dChDRlhfV2lkZVN0cmluZyYgd3NGaWVsZCkgY29uc3Qgew0KKyAgd3NGaWVsZCA9IG1fd3NGaWVsZDsNCisgIGlmIChtX25MZW5ndGggPT0gLTEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1fYlJlc2VydmVTcGFjZSkgew0KKyAgICBpbnQzMl90IG5GaWVsZCA9IHdzRmllbGQuR2V0TGVuZ3RoKCk7DQorICAgIGludDMyX3QgbkZpbGwgPSBtX25MZW5ndGggLSBuRmllbGQ7DQorICAgIGlmIChtX2JMZWZ0QWxpZ25tZW50KSB7DQorICAgICAgd2hpbGUgKG5GaWxsLS0pIHsNCisgICAgICAgIHdzRmllbGQuSW5zZXJ0KG5GaWVsZCsrLCBtX3djRmlsbCk7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHdoaWxlIChuRmlsbC0tKSB7DQorICAgICAgICB3c0ZpZWxkLkluc2VydCgwLCBtX3djRmlsbCk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KK0NGREVfVHh0RWR0RmllbGRfSW50ZWdlcjo6Q0ZERV9UeHRFZHRGaWVsZF9JbnRlZ2VyKA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGaWVsZCwNCisgICAgaW50MzJfdCBuSW5kZXgsDQorICAgIENGREVfVHh0RWR0QmxvY2sqIHBCbG9jaykNCisgICAgOiBtX2JTaWduKEZBTFNFKSwgQ0ZERV9UeHRFZHRGaWVsZChuSW5kZXgsIHBCbG9jaykgew0KKyAgQ0ZERV9UeHRFZHRGaWVsZEZvcm1hdFBhcnNlciBGb3JtYXRQYXJzZXI7DQorICBGb3JtYXRQYXJzZXIuUGFyc2Uod3NGaWVsZCk7DQorICBpbnQzMl90IG5Db3VudCA9IEZvcm1hdFBhcnNlci5Db3VudEl0ZW1zKCk7DQorICBDRlhfV2lkZVN0cmluZyB3c2tleTsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsNCisgICAgRm9ybWF0UGFyc2VyLkdldEl0ZW0oaSwgd3NrZXksIHdzVmFsKTsNCisgICAgaWYgKHdza2V5LkVxdWFsKEwiTGVuZ3RoIikpIHsNCisgICAgICBtX25MZW5ndGggPSB3c1ZhbC5HZXRJbnRlZ2VyKCk7DQorICAgIH0gZWxzZSBpZiAod3NrZXkuRXF1YWwoTCJTaWduIikpIHsNCisgICAgICBtX2JTaWduID0gd3NWYWwuR2V0SW50ZWdlcigpICE9IDA7DQorICAgIH0gZWxzZSBpZiAod3NrZXkuRXF1YWwoTCJGaWxsQ2hhciIpKSB7DQorICAgICAgbV93Y0ZpbGwgPSB3c1ZhbFswXTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWFNZU19hc3NlcnQoMCk7DQorICAgIH0NCisgICAgd3NrZXkuRW1wdHkoKTsNCisgICAgd3NWYWwuRW1wdHkoKTsNCisgIH0NCisgIGlmIChtX25MZW5ndGggPT0gLTEpIHsNCisgICAgbV9iUmVzZXJ2ZVNwYWNlID0gRkFMU0U7DQorICB9DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRGaWVsZF9JbnRlZ2VyOjpWYWxpZGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSBjb25zdCB7DQorICBpbnQzMl90IGkgPSAwOw0KKyAgaWYgKG1fYlNpZ24pIHsNCisgICAgRlhfV0NIQVIgd2NUZW1wID0gd3NUZXh0WzBdOw0KKyAgICBpZiAoRkRFX1RYVEVEVF9JU1NJR04od2NUZW1wKSkgew0KKyAgICAgIGkrKzsNCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBuTGVuZ3RoID0gd3NUZXh0LkdldExlbmd0aCgpOw0KKyAgaWYgKG1fbkxlbmd0aCA+IDApIHsNCisgICAgaWYgKG5MZW5ndGggLSBpID4gKG1fbkxlbmd0aCAtIChtX2JTaWduID8gMSA6IDApKSkgew0KKyAgICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX1ZBTElEQVRFX0ZfRlVMTDsNCisgICAgfQ0KKyAgfQ0KKyAgZm9yICg7IGkgPCBuTGVuZ3RoOyBpKyspIHsNCisgICAgRlhfV0NIQVIgd2NUZW1wID0gd3NUZXh0W2ldOw0KKyAgICBpZiAoIUZERV9UWFRFRFRfSVNJTlRFR0VSKHdjVGVtcCkpIHsNCisgICAgICByZXR1cm4gRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9GX0lOVkFMSURBVEU7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX1ZBTElEQVRFX1M7DQorfQ0KK0NGREVfVHh0RWR0RmllbGRfRmxvYXQ6OkNGREVfVHh0RWR0RmllbGRfRmxvYXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRmllbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfVHh0RWR0QmxvY2sqIHBCbG9jaykNCisgICAgOiBDRkRFX1R4dEVkdEZpZWxkKG5JbmRleCwgcEJsb2NrKSwNCisgICAgICBtX2JTaWduZWQoRkFMU0UpLA0KKyAgICAgIG1fbkludFBhcnRsZW5ndGgoLTEpLA0KKyAgICAgIG1fbkRlY1BhcnRMZW5ndGgoLTEpIHsNCisgIENGREVfVHh0RWR0RmllbGRGb3JtYXRQYXJzZXIgRm9ybWF0UGFyc2VyOw0KKyAgRm9ybWF0UGFyc2VyLlBhcnNlKHdzRmllbGQpOw0KKyAgaW50MzJfdCBuQ291bnQgPSBGb3JtYXRQYXJzZXIuQ291bnRJdGVtcygpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NrZXk7DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgIEZvcm1hdFBhcnNlci5HZXRJdGVtKGksIHdza2V5LCB3c1ZhbCk7DQorICAgIGlmICh3c2tleS5FcXVhbChMIkRlY0xlbmd0aCIpKSB7DQorICAgICAgbV9uRGVjUGFydExlbmd0aCA9IHdzVmFsLkdldEludGVnZXIoKTsNCisgICAgfSBlbHNlIGlmICh3c2tleS5FcXVhbChMIkludExlbmd0aCIpKSB7DQorICAgICAgbV9uSW50UGFydGxlbmd0aCA9IHdzVmFsLkdldEludGVnZXIoKTsNCisgICAgfSBlbHNlIGlmICh3c2tleS5FcXVhbChMIlNpZ24iKSkgew0KKyAgICAgIG1fYlNpZ25lZCA9IHdzVmFsLkdldEludGVnZXIoKSAhPSAwOw0KKyAgICB9IGVsc2UgaWYgKHdza2V5LkVxdWFsKEwiRmlsbENoYXIiKSkgew0KKyAgICAgIG1fd2NGaWxsID0gd3NWYWxbMF07DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhTWVNfYXNzZXJ0KDApOw0KKyAgICB9DQorICAgIGlmIChtX25JbnRQYXJ0bGVuZ3RoID09IC0xIHx8IG1fbkRlY1BhcnRMZW5ndGggPT0gLTEpIHsNCisgICAgICBtX25MZW5ndGggPSAtMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBtX25MZW5ndGggPSBtX25JbnRQYXJ0bGVuZ3RoICsgbV9uRGVjUGFydExlbmd0aCArIDEgKyAobV9iU2lnbmVkID8gMSA6IDApOw0KKyAgICB9DQorICAgIG1fYlJlc2VydmVTcGFjZSA9IFRSVUU7DQorICAgIHdza2V5LkVtcHR5KCk7DQorICAgIHdzVmFsLkVtcHR5KCk7DQorICB9DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRGaWVsZF9GbG9hdDo6VmFsaWRhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgY29uc3Qgew0KKyAgaW50MzJfdCBuTGVuZ3RoID0gd3NUZXh0LkdldExlbmd0aCgpOw0KKyAgaWYgKG1fbkxlbmd0aCAhPSAtMSAmJiAobkxlbmd0aCA+IG1fbkxlbmd0aCkpIHsNCisgICAgcmV0dXJuIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9GVUxMOw0KKyAgfQ0KKyAgY29uc3QgRlhfV0NIQVIqIGxwQnVmID0gY29uc3QgRlhfV0NIQVIgKiAod3NUZXh0KTsNCisgIGludDMyX3QgaSA9IDA7DQorICBpZiAobV9iU2lnbmVkKSB7DQorICAgIEZYX1dDSEFSIHdjVGVtcCA9IGxwQnVmWzBdOw0KKyAgICBpZiAoRkRFX1RYVEVEVF9JU1NJR04od2NUZW1wKSkgew0KKyAgICAgIGkrKzsNCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBuSW50UGFydCA9IDA7DQorICBpbnQzMl90IG5Qb2ludCA9IDA7DQorICBmb3IgKDsgaSA8IG5MZW5ndGg7IGkrKykgew0KKyAgICBGWF9XQ0hBUiB3Y1RlbXAgPSBscEJ1ZltpXTsNCisgICAgaWYgKCFGREVfVFhURURUX0lTSU5URUdFUih3Y1RlbXApKSB7DQorICAgICAgaWYgKHdjVGVtcCAhPSBMJy4nKSB7DQorICAgICAgICByZXR1cm4gRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9GX0lOVkFMSURBVEU7DQorICAgICAgfQ0KKyAgICAgIG5Qb2ludCA9IDE7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgbkludFBhcnQrKzsNCisgIH0NCisgIGlmIChtX25JbnRQYXJ0bGVuZ3RoICE9IC0xICYmIChuSW50UGFydCA+IG1fbkludFBhcnRsZW5ndGgpKSB7DQorICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX1ZBTElEQVRFX0ZfRlVMTDsNCisgIH0NCisgIGlmIChtX25EZWNQYXJ0TGVuZ3RoICE9IC0xICYmDQorICAgICAgKG5MZW5ndGggLSBuSW50UGFydCAtIG5Qb2ludCA+IG1fbkRlY1BhcnRMZW5ndGgpKSB7DQorICAgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX1ZBTElEQVRFX0ZfRlVMTDsNCisgIH0NCisgIGkrKzsNCisgIGZvciAoOyBpIDwgbkxlbmd0aDsgaSsrKSB7DQorICAgIEZYX1dDSEFSIHdjVGVtcCA9IGxwQnVmW2ldOw0KKyAgICBpZiAoIUZERV9UWFRFRFRfSVNJTlRFR0VSKHdjVGVtcCkpIHsNCisgICAgICByZXR1cm4gRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9GX0ZVTEw7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGREVfRk9STUFUX0ZJRUxEX1ZBTElEQVRFX1M7DQorfQ0KK0NGREVfVHh0RWR0RmllbGRfUGFzc3dvcmQ6OkNGREVfVHh0RWR0RmllbGRfUGFzc3dvcmQoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0ZpZWxkLA0KKyAgICBpbnQzMl90IG5JbmRleCwNCisgICAgQ0ZERV9UeHRFZHRCbG9jayogcEJsb2NrKQ0KKyAgICA6IENGREVfVHh0RWR0RmllbGQobkluZGV4LCBwQmxvY2spLCBtX3djQWxpYXMoTCcqJykgew0KKyAgQ0ZERV9UeHRFZHRGaWVsZEZvcm1hdFBhcnNlciBGb3JtYXRQYXJzZXI7DQorICBGb3JtYXRQYXJzZXIuUGFyc2Uod3NGaWVsZCk7DQorICBpbnQzMl90IG5Db3VudCA9IEZvcm1hdFBhcnNlci5Db3VudEl0ZW1zKCk7DQorICBDRlhfV2lkZVN0cmluZyB3c2tleTsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsNCisgICAgRm9ybWF0UGFyc2VyLkdldEl0ZW0oaSwgd3NrZXksIHdzVmFsKTsNCisgICAgaWYgKHdza2V5LkVxdWFsKEwiTGVuZ3RoIikpIHsNCisgICAgICBtX25MZW5ndGggPSB3c1ZhbC5HZXRJbnRlZ2VyKCk7DQorICAgIH0gZWxzZSBpZiAod3NrZXkuRXF1YWwoTCJBbGlhc0NoYXIiKSkgew0KKyAgICAgIG1fd2NBbGlhcyA9IHdzVmFsWzBdOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYU1lTX2Fzc2VydCgwKTsNCisgICAgfQ0KKyAgICB3c2tleS5FbXB0eSgpOw0KKyAgICB3c1ZhbC5FbXB0eSgpOw0KKyAgfQ0KKyAgaWYgKG1fbkxlbmd0aCA9PSAtMSkgew0KKyAgICBtX2JSZXNlcnZlU3BhY2UgPSBGQUxTRTsNCisgIH0NCit9DQordm9pZCBDRkRFX1R4dEVkdEZpZWxkX1Bhc3N3b3JkOjpHZXROb3JtYWxpemVkRmllbGRUZXh0KA0KKyAgICBDRlhfV2lkZVN0cmluZyYgd3NGaWVsZCkgY29uc3Qgew0KKyAgaW50MzJfdCBuRmlsZWRMZW5ndGggPSBtX3dzRmllbGQuR2V0TGVuZ3RoKCk7DQorICBpbnQzMl90IG5MZW5ndGggPSBtX2JSZXNlcnZlU3BhY2UgPyBtX25MZW5ndGggOiBuRmlsZWRMZW5ndGg7DQorICBGWF9XQ0hBUiogbHBCdWYgPSB3c0ZpZWxkLkdldEJ1ZmZlcihuTGVuZ3RoKTsNCisgIGludDMyX3QgblNwYWNlTGVuZ3RoID0gbkxlbmd0aCAtIG5GaWxlZExlbmd0aDsNCisgIGludDMyX3QgbkZpcnN0UGFydCA9IG1fYkxlZnRBbGlnbm1lbnQgPyBuRmlsZWRMZW5ndGggOiBuU3BhY2VMZW5ndGg7DQorICBGWF9XQ0hBUiB3Rmlyc3RDaGFyID0gbV9iTGVmdEFsaWdubWVudCA/IG1fd2NBbGlhcyA6IEwnICc7DQorICBGWF9XQ0hBUiB3U2Vjb25kQ2hhciA9IG1fYkxlZnRBbGlnbm1lbnQgPyBMJyAnIDogbV93Y0FsaWFzOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIGZvciAoOyBpIDwgbkZpcnN0UGFydDsgaSsrKSB7DQorICAgIGxwQnVmW2ldID0gd0ZpcnN0Q2hhcjsNCisgIH0NCisgIGZvciAoOyBpIDwgbkxlbmd0aDsgaSsrKSB7DQorICAgIGxwQnVmW2ldID0gd1NlY29uZENoYXI7DQorICB9DQorICB3c0ZpZWxkLlJlbGVhc2VCdWZmZXIobkxlbmd0aCk7DQorfQ0KK0NGREVfVHh0RWR0RmllbGRfU3RyaW5nOjpDRkRFX1R4dEVkdEZpZWxkX1N0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGaWVsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfVHh0RWR0QmxvY2sqIHBCbG9jaykNCisgICAgOiBDRkRFX1R4dEVkdEZpZWxkKG5JbmRleCwgcEJsb2NrKSB7DQorICBDRkRFX1R4dEVkdEZpZWxkRm9ybWF0UGFyc2VyIEZvcm1hdFBhcnNlcjsNCisgIEZvcm1hdFBhcnNlci5QYXJzZSh3c0ZpZWxkKTsNCisgIGludDMyX3QgbkNvdW50ID0gRm9ybWF0UGFyc2VyLkNvdW50SXRlbXMoKTsNCisgIENGWF9XaWRlU3RyaW5nIHdza2V5Ow0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWw7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICBGb3JtYXRQYXJzZXIuR2V0SXRlbShpLCB3c2tleSwgd3NWYWwpOw0KKyAgICBpZiAod3NrZXkuRXF1YWwoTCJMZW5ndGgiKSkgew0KKyAgICAgIG1fbkxlbmd0aCA9IHdzVmFsLkdldEludGVnZXIoKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWFNZU19hc3NlcnQoMCk7DQorICAgIH0NCisgICAgd3NrZXkuRW1wdHkoKTsNCisgICAgd3NWYWwuRW1wdHkoKTsNCisgIH0NCit9DQorQ0ZERV9UeHRFZHRGaWVsZF9GaXhlZDo6Q0ZERV9UeHRFZHRGaWVsZF9GaXhlZChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGaWVsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9UeHRFZHRCbG9jayogcEJsb2NrKQ0KKyAgICA6IENGREVfVHh0RWR0RmllbGQobkluZGV4LCBwQmxvY2spIHsNCisgIG1fd3NGaWVsZCA9IHdzRmllbGQ7DQorICBtX25MZW5ndGggPSB3c0ZpZWxkLkdldExlbmd0aCgpOw0KK30NCit2b2lkIENGREVfVHh0RWR0RmllbGRfRml4ZWQ6OkdldERpc3BsYXlUZXh0KENGWF9XaWRlU3RyaW5nJiB3c0Rpc3BsYXkpIHsNCisgIGludDMyX3Qgbkxlbmd0aCA9IG1fd3NGaWVsZC5HZXRMZW5ndGgoKSArIEZERV9GT1JNQVRfRURJVF9GSUVMRF9IQURFUlNJWkUgKw0KKyAgICAgICAgICAgICAgICAgICAgRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX1RBSUxTSVpFOw0KKyAgRlhfV0NIQVIqIGxwQnVmZmVyID0gd3NEaXNwbGF5LkdldEJ1ZmZlcihuTGVuZ3RoKTsNCisgIGxwQnVmZmVyWzBdID0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19CR047DQorICBscEJ1ZmZlcltuTGVuZ3RoIC0gMV0gPSBGREVfVFhURURUX0ZPUk1BVEJMT0NLX0VORDsNCisgIEZYX0RXT1JEIG5BZGRyZXNzID0gKEZYX0RXT1JEKSB0aGlzOw0KKyAgRlhTWVNfbWVtY3B5KGxwQnVmZmVyICsgMSwgJm5BZGRyZXNzLCBzaXplb2YoRlhfRFdPUkQpKTsNCisgIEZYU1lTX21lbWNweShscEJ1ZmZlciArIDMsIGNvbnN0IEZYX1dDSEFSKihtX3dzRmllbGQpLA0KKyAgICAgICAgICAgICAgIChuTGVuZ3RoIC0gNCkgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgIHdzRGlzcGxheS5SZWxlYXNlQnVmZmVyKG5MZW5ndGgpOw0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RmllbGRfRml4ZWQ6Ok5vcm1hbGl6ZUNhcmV0UG9zKA0KKyAgICBpbnQzMl90IG5JbmRleCwNCisgICAgRkRFX0ZPUk1BVF9DQVJFVF9ESVJFQ1RJT04gZURpcmVjdGlvbikgY29uc3Qgew0KKyAgRlhTWVNfYXNzZXJ0KG5JbmRleCA+PSAwICYmIG5JbmRleCA8PSBtX25MZW5ndGgpOw0KKyAgaWYgKGVEaXJlY3Rpb24gPT0gRkRFX0ZPUk1BVF9DQVJFVF9NSURETEUpIHsNCisgICAgcmV0dXJuIChuSW5kZXggPiBtX3dzRmllbGQuR2V0TGVuZ3RoKCkgLyAyKSA/IC0xIDogLTI7DQorICB9DQorICByZXR1cm4gZURpcmVjdGlvbiA9PSBGREVfRk9STUFUX0NBUkVUX0JBQ0tXQVJEID8gLTIgOiAtMTsNCit9DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0YmxvY2suaCBiL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGJsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ1YThhZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGJsb2NrLmgKQEAgLTAsMCArMSwyMzcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRkRFX1RYVEVEVEJMT0NLX0gNCisjZGVmaW5lIF9GREVfVFhURURUQkxPQ0tfSA0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCitjbGFzcyBDRkRFX1R4dEVkdEVuZ2luZTsNCitjbGFzcyBDRkRFX1R4dEVkdEJsb2NrOw0KK2NsYXNzIENGREVfVHh0RWR0RmllbGRGb3JtYXRQYXJzZXI7DQorY2xhc3MgQ0ZERV9UeHRFZHRGaWVsZDsNCitjbGFzcyBDRkRFX1R4dEVkdEZpZWxkX0ludGVnZXI7DQorY2xhc3MgQ0ZERV9UeHRFZHRGaWVsZF9GbG9hdDsNCitjbGFzcyBDRkRFX1R4dEVkdEZpZWxkX1Bhc3N3b3JkOw0KK2NsYXNzIENGREVfVHh0RWR0RmllbGRfU3RyaW5nOw0KK2NsYXNzIENGREVfVHh0RWR0RmllbGRfRml4ZWQ7DQorI2RlZmluZSBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFIDMNCisjZGVmaW5lIEZERV9GT1JNQVRfRURJVF9GSUVMRF9UQUlMU0laRSAxDQorZW51bSBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVQgew0KKyAgRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX1NfTk9STUFMID0gMCwNCisgIEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9TX0ZVTEwsDQorICBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfRl9GVUxMLA0KKyAgRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX0ZfSU5WQUxJREFURSwNCit9Ow0KK2VudW0gRkRFX0ZPUk1BVF9GSUVMRF9ERUxFVEVfUkVUIHsNCisgIEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9TID0gMCwNCisgIEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9GX0lOVkFMSURBVEUsDQorICBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfRl9CT1VOREFSWSwNCit9Ow0KK2VudW0gRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9SRVQgew0KKyAgRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9TID0gMCwNCisgIEZERV9GT1JNQVRfRklFTERfVkFMSURBVEVfRl9GVUxMLA0KKyAgRkRFX0ZPUk1BVF9GSUVMRF9WQUxJREFURV9GX0lOVkFMSURBVEUsDQorfTsNCitlbnVtIEZERV9GT1JNQVRfQ0FSRVRfRElSRUNUSU9OIHsNCisgIEZERV9GT1JNQVRfQ0FSRVRfRk9SV0FSRCwNCisgIEZERV9GT1JNQVRfQ0FSRVRfTUlERExFLA0KKyAgRkRFX0ZPUk1BVF9DQVJFVF9CQUNLV0FSRA0KK307DQorY2xhc3MgQ0ZERV9UeHRFZHRCbG9jayB7DQorIHB1YmxpYzoNCisgIENGREVfVHh0RWR0QmxvY2soQ0ZERV9UeHRFZHRFbmdpbmUqIHBFbmdpbmUsDQorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Jsb2NrLA0KKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Qb3NpdGlvbik7DQorICB+Q0ZERV9UeHRFZHRCbG9jaygpOw0KKyAgdm9pZCBHZXREaXNwbGF5VGV4dChDRlhfV2lkZVN0cmluZyYgd3NEaXNwbGF5KTsNCisgIGludDMyX3QgR2V0TGVuZ3RoKCkgY29uc3Q7DQorICB2b2lkIEdldEJsb2NrVGV4dChDRlhfV2lkZVN0cmluZyYgd3NCbG9jayk7DQorICBpbnQzMl90IENvdW50RmllbGQoKSBjb25zdDsNCisgIHZvaWQgR2V0RmllbGRUZXh0KGludDMyX3QgbkluZGV4LCBDRlhfV2lkZVN0cmluZyYgd3NGaWVsZCk7DQorICBpbnQzMl90IEdldEZpZWxkVGV4dExlbmd0aCgpIGNvbnN0Ow0KKw0KKyAgaW50MzJfdCBHZXRQb3MoKSBjb25zdDsNCisgIHZvaWQgR2V0UmVhbFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgY29uc3Q7DQorICB2b2lkIEJhY2t1cCgpOw0KKyAgdm9pZCBSZXN0b3JlKCk7DQorICB2b2lkIFNldEluZGV4KGludDMyX3QgbkluZGV4KSB7IG1fbkluZGV4ID0gbkluZGV4OyB9DQorICBpbnQzMl90IEdldEluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9uSW5kZXg7IH0NCisNCisgcHJpdmF0ZToNCisgIENGREVfVHh0RWR0RW5naW5lKiBtX3BFbmdpbmU7DQorICBpbnQzMl90IG1fbkRpc3BsYXlMZW5ndGg7DQorICBpbnQzMl90IG1fbkluZGV4Ow0KKw0KKyAgaW50MzJfdCBtX25Qb3NpdGlvbjsNCisgIENGWF9BcnJheVRlbXBsYXRlPENGREVfVHh0RWR0RmllbGQqPiBtX0ZpZWxkQXJyOw0KKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q0ZERV9UeHRFZHRGaWVsZCo+IG1fRWRpdEZpZWxkQXJyOw0KK307DQorY2xhc3MgQ0ZERV9UeHRFZHRGaWVsZEZvcm1hdFBhcnNlciB7DQorIHB1YmxpYzoNCisgIENGREVfVHh0RWR0RmllbGRGb3JtYXRQYXJzZXIoKTsNCisgIH5DRkRFX1R4dEVkdEZpZWxkRm9ybWF0UGFyc2VyKCk7DQorICBGWF9CT09MIFBhcnNlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCk7DQorICBpbnQzMl90IENvdW50SXRlbXMoKSBjb25zdDsNCisgIHZvaWQgR2V0SXRlbShpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NLZXksDQorICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpIGNvbnN0Ow0KKw0KKyBwcml2YXRlOg0KKyAgdHlwZWRlZiBzdHJ1Y3Qgew0KKyAgICBpbnQzMl90IG5LZXlTdGFydDsNCisgICAgaW50MzJfdCBuS2V5Q291bnQ7DQorICAgIGludDMyX3QgblZhbFN0YXJ0Ow0KKyAgICBpbnQzMl90IG5WYWxDb3VudDsNCisgIH0gRkRFX1RYVEVEVEZPUk1BVElURU0sICpGREVfTFBUWFRFRFRGT1JNQVRJVEVNOw0KKw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c0Zvcm1hdDsNCisgIENGWF9BcnJheVRlbXBsYXRlPEZERV9MUFRYVEVEVEZPUk1BVElURU0+IG1fSXRlbUFycjsNCit9Ow0KK2NsYXNzIENGREVfVHh0RWR0RmllbGQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgQ0ZERV9UeHRFZHRGaWVsZCogQ3JlYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0ZpZWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9UeHRFZHRCbG9jayogcEJsb2NrKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCk7DQorICB2aXJ0dWFsIGludDMyX3QgSW5zZXJ0KGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NJbnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5DYXJldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkJlZm9yZSk7DQorICB2aXJ0dWFsIGludDMyX3QgRGVsZXRlKGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRGVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuQ2FyZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJCZWZvcmUpOw0KKyAgdmlydHVhbCBpbnQzMl90IFJlcGxhY2UoaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0lucywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0RlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5DYXJldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJCZWZvcmUpOw0KKyAgdmlydHVhbCB2b2lkIEdldERpc3BsYXlUZXh0KENGWF9XaWRlU3RyaW5nJiB3c0Rpc3BsYXkpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldERpc3BsYXlMZW5ndGgoKTsNCisgIHZpcnR1YWwgdm9pZCBHZXRGaWVsZFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzRmllbGQpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEZpZWxkVGV4dExlbmd0aCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IEdldFJlYWxJbmRleChpbnQzMl90IG5JbmRleCkgY29uc3Q7DQorDQorICB2aXJ0dWFsIGludDMyX3QgTm9ybWFsaXplQ2FyZXRQb3MoDQorICAgICAgaW50MzJfdCBuSW5kZXgsDQorICAgICAgRkRFX0ZPUk1BVF9DQVJFVF9ESVJFQ1RJT04gZURpcmVjdGlvbiA9IEZERV9GT1JNQVRfQ0FSRVRfTUlERExFKSBjb25zdDsNCisNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRFZGl0YWJsZVJhbmdlKGludDMyX3QmIG5CZ24sIGludDMyX3QmIG5FbmQpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEJhY2t1cCgpOw0KKyAgdmlydHVhbCB2b2lkIFJlc3RvcmUoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0ZpeCgpIGNvbnN0IHsgcmV0dXJuIEZBTFNFOyB9DQorICB2b2lkIFNldEluZGV4KGludDMyX3QgbkluZGV4KSB7IG1fbkluZGV4ID0gbkluZGV4OyB9DQorICBpbnQzMl90IEdldEluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9uSW5kZXg7IH0NCisgIGludDMyX3QgR2V0QmxvY2tJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fcEJsb2NrLT5HZXRJbmRleCgpOyB9DQorDQorIHByb3RlY3RlZDoNCisgIENGREVfVHh0RWR0RmllbGQoaW50MzJfdCBuSW5kZXgsIENGREVfVHh0RWR0QmxvY2sqIHBCbG9jayk7DQorICB2aXJ0dWFsIH5DRkRFX1R4dEVkdEZpZWxkKCkge30NCisgIHZpcnR1YWwgaW50MzJfdCBWYWxpZGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBHZXROb3JtYWxpemVkRmllbGRUZXh0KENGWF9XaWRlU3RyaW5nJiB3c0ZpZWxkKSBjb25zdDsNCisgIGludDMyX3QgbV9uTGVuZ3RoOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c0ZpZWxkOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c0JhY2t1cDsNCisgIEZYX1dDSEFSIG1fd2NGaWxsOw0KKyAgRlhfQk9PTCBtX2JSZXNlcnZlU3BhY2U7DQorICBGWF9CT09MIG1fYkxlZnRBbGlnbm1lbnQ7DQorICBpbnQzMl90IG1fbkluZGV4Ow0KKyAgQ0ZERV9UeHRFZHRCbG9jayogbV9wQmxvY2s7DQorfTsNCitjbGFzcyBDRkRFX1R4dEVkdEZpZWxkX0ludGVnZXIgOiBwdWJsaWMgQ0ZERV9UeHRFZHRGaWVsZCB7DQorIHB1YmxpYzoNCisgIENGREVfVHh0RWR0RmllbGRfSW50ZWdlcihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGaWVsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1R4dEVkdEJsb2NrKiBwQmxvY2spOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2aXJ0dWFsIH5DRkRFX1R4dEVkdEZpZWxkX0ludGVnZXIoKSB7fQ0KKyAgdmlydHVhbCBpbnQzMl90IFZhbGlkYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIGNvbnN0Ow0KKw0KKyBwcml2YXRlOg0KKyAgRlhfQk9PTCBtX2JTaWduOw0KK307DQorY2xhc3MgQ0ZERV9UeHRFZHRGaWVsZF9GbG9hdCA6IHB1YmxpYyBDRkRFX1R4dEVkdEZpZWxkIHsNCisgcHVibGljOg0KKyAgQ0ZERV9UeHRFZHRGaWVsZF9GbG9hdChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGaWVsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfVHh0RWR0QmxvY2sqIHBCbG9jayk7DQorDQorIHByb3RlY3RlZDoNCisgIHZpcnR1YWwgfkNGREVfVHh0RWR0RmllbGRfRmxvYXQoKSB7fQ0KKyAgdmlydHVhbCBpbnQzMl90IFZhbGlkYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIGNvbnN0Ow0KKw0KKyBwcml2YXRlOg0KKyAgRlhfQk9PTCBtX2JTaWduZWQ7DQorICBpbnQzMl90IG1fbkludFBhcnRsZW5ndGg7DQorICBpbnQzMl90IG1fbkRlY1BhcnRMZW5ndGg7DQorfTsNCitjbGFzcyBDRkRFX1R4dEVkdEZpZWxkX1Bhc3N3b3JkIDogcHVibGljIENGREVfVHh0RWR0RmllbGQgew0KKyBwdWJsaWM6DQorICBDRkRFX1R4dEVkdEZpZWxkX1Bhc3N3b3JkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0ZpZWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9UeHRFZHRCbG9jayogcEJsb2NrKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdmlydHVhbCB+Q0ZERV9UeHRFZHRGaWVsZF9QYXNzd29yZCgpIHt9DQorICB2aXJ0dWFsIHZvaWQgR2V0Tm9ybWFsaXplZEZpZWxkVGV4dChDRlhfV2lkZVN0cmluZyYgd3NGaWVsZCkgY29uc3Q7DQorDQorIHByaXZhdGU6DQorICBGWF9XQ0hBUiBtX3djQWxpYXM7DQorfTsNCitjbGFzcyBDRkRFX1R4dEVkdEZpZWxkX1N0cmluZyA6IHB1YmxpYyBDRkRFX1R4dEVkdEZpZWxkIHsNCisgcHVibGljOg0KKyAgQ0ZERV9UeHRFZHRGaWVsZF9TdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRmllbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfVHh0RWR0QmxvY2sqIHBCbG9jayk7DQorDQorIHByb3RlY3RlZDoNCisgIHZpcnR1YWwgfkNGREVfVHh0RWR0RmllbGRfU3RyaW5nKCkge30NCit9Ow0KK2NsYXNzIENGREVfVHh0RWR0RmllbGRfRml4ZWQgOiBwdWJsaWMgQ0ZERV9UeHRFZHRGaWVsZCB7DQorIHB1YmxpYzoNCisgIENGREVfVHh0RWR0RmllbGRfRml4ZWQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRmllbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1R4dEVkdEJsb2NrKiBwQmxvY2spOw0KKyAgdmlydHVhbCBpbnQzMl90IEluc2VydChpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzSW5zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuQ2FyZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJCZWZvcmUpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgdmlydHVhbCBpbnQzMl90IERlbGV0ZShpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0RlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbkNhcmV0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiQmVmb3JlKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHZpcnR1YWwgaW50MzJfdCBSZXBsYWNlKGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NJbnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NEZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuQ2FyZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiQmVmb3JlKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBHZXREaXNwbGF5VGV4dChDRlhfV2lkZVN0cmluZyYgd3NEaXNwbGF5KTsNCisgIHZpcnR1YWwgaW50MzJfdCBOb3JtYWxpemVDYXJldFBvcygNCisgICAgICBpbnQzMl90IG5JbmRleCwNCisgICAgICBGREVfRk9STUFUX0NBUkVUX0RJUkVDVElPTiBlRGlyZWN0aW9uKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRFZGl0YWJsZVJhbmdlKGludDMyX3QmIG5CZ24sIGludDMyX3QmIG5FbmQpIGNvbnN0IHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIEJhY2t1cCgpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVzdG9yZSgpIHt9DQorDQorICB2aXJ0dWFsIEZYX0JPT0wgSXNGaXgoKSBjb25zdCB7IHJldHVybiBUUlVFOyB9DQorDQorIHByb3RlY3RlZDoNCisgIHZpcnR1YWwgfkNGREVfVHh0RWR0RmllbGRfRml4ZWQoKSB7fQ0KK307DQorI2VuZGlmDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0YnVmLmNwcCBiL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGJ1Zi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRlZjhkMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGJ1Zi5jcHAKQEAgLTAsMCArMSw0MzggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgPGFsZ29yaXRobT4NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZlZS9pbmNsdWRlL2lmZGVfdHh0ZWR0YnVmLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZmVlL2luY2x1ZGUvaWZkZV90eHRlZHRlbmdpbmUuaCINCisjaW5jbHVkZSAiZmRlX3R4dGVkdGJ1Zi5oIg0KKyNkZWZpbmUgRkRFX0RFRkNIVU5LQ09VTlQgMg0KKyNkZWZpbmUgRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19CR04gMHhGRkY5DQorI2RlZmluZSBGREVfVFhURURUX0ZPUk1BVEJMT0NLX0VORCAweEZGRkINCisjZGVmaW5lIEZERV9UWFRFRFRfWkVST1dJRFRIU1BBQ0UgMHgyMDBCDQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KK0NGREVfVHh0RWR0QnVmSXRlcjo6Q0ZERV9UeHRFZHRCdWZJdGVyKENGREVfVHh0RWR0QnVmKiBwQnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZvckRpc3BsYXkpDQorI2Vsc2UNCitDRkRFX1R4dEVkdEJ1Zkl0ZXI6OkNGREVfVHh0RWR0QnVmSXRlcihDRkRFX1R4dEVkdEJ1ZiogcEJ1ZiwgRlhfV0NIQVIgd2NBbGlhcykNCisjZW5kaWYNCisgICAgOiBtX3BCdWYocEJ1ZiksDQorICAgICAgbV9uQ3VyQ2h1bmsoMCksDQorICAgICAgbV9uQ3VySW5kZXgoMCksDQorICAgICAgbV9uSW5kZXgoMCksDQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgICAgIG1fYkZvckRpc3BsYXkoYkZvckRpc3BsYXkpLA0KKyAgICAgIG1fbkFsaWFzQ291bnQoMCksDQorI2VuZGlmDQorICAgICAgbV9BbGlhcyh3Y0FsaWFzKSB7DQorICBGWFNZU19hc3NlcnQobV9wQnVmKTsNCit9DQorQ0ZERV9UeHRFZHRCdWZJdGVyOjp+Q0ZERV9UeHRFZHRCdWZJdGVyKCkge30NCit2b2lkIENGREVfVHh0RWR0QnVmSXRlcjo6UmVsZWFzZSgpIHsNCisgIGRlbGV0ZSB0aGlzOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0QnVmSXRlcjo6TmV4dChGWF9CT09MIGJQcmV2KSB7DQorICBpZiAoYlByZXYpIHsNCisgICAgaWYgKG1fbkluZGV4ID09IDApIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgRlhTWVNfYXNzZXJ0KG1fbkN1ckNodW5rIDwgbV9wQnVmLT5tX0NodW5rcy5HZXRTaXplKCkpOw0KKyAgICBDRkRFX1R4dEVkdEJ1Zjo6RkRFX0xQQ0hVTktIRUFERVIgbHBDaHVuayA9IE5VTEw7DQorICAgIGlmIChtX25DdXJJbmRleCA+IDApIHsNCisgICAgICBtX25DdXJJbmRleC0tOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHdoaWxlIChtX25DdXJDaHVuayA+IDApIHsNCisgICAgICAgIC0tbV9uQ3VyQ2h1bms7DQorICAgICAgICBscENodW5rID0NCisgICAgICAgICAgICAoQ0ZERV9UeHRFZHRCdWY6OkZERV9MUENIVU5LSEVBREVSKW1fcEJ1Zi0+bV9DaHVua3NbbV9uQ3VyQ2h1bmtdOw0KKyAgICAgICAgaWYgKGxwQ2h1bmstPm5Vc2VkID4gMCkgew0KKyAgICAgICAgICBtX25DdXJJbmRleCA9IGxwQ2h1bmstPm5Vc2VkIC0gMTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIEZYU1lTX2Fzc2VydChtX25DdXJDaHVuayA+PSAwKTsNCisgICAgbV9uSW5kZXgtLTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9IGVsc2Ugew0KKyAgICBpZiAobV9uSW5kZXggPj0gKG1fcEJ1Zi0+bV9uVG90YWwgLSAxKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWFNZU19hc3NlcnQobV9uQ3VyQ2h1bmsgPCBtX3BCdWYtPm1fQ2h1bmtzLkdldFNpemUoKSk7DQorICAgIENGREVfVHh0RWR0QnVmOjpGREVfTFBDSFVOS0hFQURFUiBscENodW5rID0NCisgICAgICAgIChDRkRFX1R4dEVkdEJ1Zjo6RkRFX0xQQ0hVTktIRUFERVIpbV9wQnVmLT5tX0NodW5rc1ttX25DdXJDaHVua107DQorICAgIGlmIChscENodW5rLT5uVXNlZCAhPSAobV9uQ3VySW5kZXggKyAxKSkgew0KKyAgICAgIG1fbkN1ckluZGV4Kys7DQorICAgIH0gZWxzZSB7DQorICAgICAgaW50MzJfdCBuRW5kID0gbV9wQnVmLT5tX0NodW5rcy5HZXRTaXplKCkgLSAxOw0KKyAgICAgIHdoaWxlIChtX25DdXJDaHVuayA8IG5FbmQpIHsNCisgICAgICAgIG1fbkN1ckNodW5rKys7DQorICAgICAgICBDRkRFX1R4dEVkdEJ1Zjo6RkRFX0xQQ0hVTktIRUFERVIgbHBDaHVua1RlbXAgPQ0KKyAgICAgICAgICAgIChDRkRFX1R4dEVkdEJ1Zjo6RkRFX0xQQ0hVTktIRUFERVIpbV9wQnVmLT5tX0NodW5rc1ttX25DdXJDaHVua107DQorICAgICAgICBpZiAobHBDaHVua1RlbXAtPm5Vc2VkID4gMCkgew0KKyAgICAgICAgICBtX25DdXJJbmRleCA9IDA7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBtX25JbmRleCsrOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCit9DQordm9pZCBDRkRFX1R4dEVkdEJ1Zkl0ZXI6OlNldEF0KGludDMyX3QgbkluZGV4KSB7DQorICBGWFNZU19hc3NlcnQobkluZGV4ID49IDAgJiYgbkluZGV4IDwgbV9wQnVmLT5tX25Ub3RhbCk7DQorICBDRkRFX1R4dEVkdEJ1Zjo6RkRFX0NIVU5LUExBQ0UgY3A7DQorICBtX3BCdWYtPkluZGV4MkNQKG5JbmRleCwgY3ApOw0KKyAgbV9uSW5kZXggPSBuSW5kZXg7DQorICBtX25DdXJDaHVuayA9IGNwLm5DaHVua0luZGV4Ow0KKyAgbV9uQ3VySW5kZXggPSBjcC5uQ2hhckluZGV4Ow0KK30NCitpbnQzMl90IENGREVfVHh0RWR0QnVmSXRlcjo6R2V0QXQoKSBjb25zdCB7DQorICByZXR1cm4gbV9uSW5kZXg7DQorfQ0KK0ZYX1dDSEFSIENGREVfVHh0RWR0QnVmSXRlcjo6R2V0Q2hhcigpIHsNCisgIEZYU1lTX2Fzc2VydChtX25JbmRleCA+PSAwICYmIG1fbkluZGV4IDwgbV9wQnVmLT5tX25Ub3RhbCk7DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgaWYgKG1fYkZvckRpc3BsYXkpIHsNCisgICAgaWYgKG1fYkluRmllbGQpIHsNCisgICAgICBGWFNZU19hc3NlcnQobV9uQWxpYXNDb3VudCA+PSAwICYmIG1fbkFsaWFzQ291bnQgPD0gMik7DQorICAgICAgaWYgKG1fbkFsaWFzQ291bnQgPiAwKSB7DQorICAgICAgICBtX25BbGlhc0NvdW50LS07DQorICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9aRVJPV0lEVEhTUEFDRTsNCisgICAgICB9DQorICAgICAgRlhfV0NIQVIgd2MgPQ0KKyAgICAgICAgICAoKENGREVfVHh0RWR0QnVmOjpGREVfTFBDSFVOS0hFQURFUiltX3BCdWYtPm1fQ2h1bmtzW21fbkN1ckNodW5rXSkNCisgICAgICAgICAgICAgIC0+d0NoYXJzW21fbkN1ckluZGV4XTsNCisgICAgICBpZiAod2MgPT0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19FTkQpIHsNCisgICAgICAgIG1fbkFsaWFzQ291bnQgPSAwOw0KKyAgICAgICAgbV9iSW5GaWVsZCA9IEZBTFNFOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gd2M7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhfV0NIQVIgd2MgPQ0KKyAgICAgICAgICAoKENGREVfVHh0RWR0QnVmOjpGREVfTFBDSFVOS0hFQURFUiltX3BCdWYtPm1fQ2h1bmtzW21fbkN1ckNodW5rXSkNCisgICAgICAgICAgICAgIC0+d0NoYXJzW21fbkN1ckluZGV4XTsNCisgICAgICBpZiAod2MgPT0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19CR04pIHsNCisgICAgICAgIG1fbkFsaWFzQ291bnQgPSAyOw0KKyAgICAgICAgbV9iSW5GaWVsZCA9IFRSVUU7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiB3YzsNCisgICAgfQ0KKyAgfQ0KKyNlbmRpZg0KKyAgaWYgKG1fQWxpYXMgPT0gMCB8fCBtX25JbmRleCA9PSAobV9wQnVmLT5tX25Ub3RhbCAtIDEpKSB7DQorICAgIHJldHVybiAoKENGREVfVHh0RWR0QnVmOjpGREVfTFBDSFVOS0hFQURFUiltX3BCdWYtPm1fQ2h1bmtzW21fbkN1ckNodW5rXSkNCisgICAgICAgIC0+d0NoYXJzW21fbkN1ckluZGV4XTsNCisgIH0NCisgIHJldHVybiBtX0FsaWFzOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0QnVmSXRlcjo6SXNFT0YoRlhfQk9PTCBiVGFpbCkgY29uc3Qgew0KKyAgcmV0dXJuIGJUYWlsID8gbV9uSW5kZXggPT0gKG1fcEJ1Zi0+R2V0VGV4dExlbmd0aCgpIC0gMikgOiBtX25JbmRleCA9PSAwOw0KK30NCitJRlhfQ2hhckl0ZXIqIENGREVfVHh0RWR0QnVmSXRlcjo6Q2xvbmUoKSB7DQorICBDRkRFX1R4dEVkdEJ1Zkl0ZXIqIHBJdGVyID0gbmV3IENGREVfVHh0RWR0QnVmSXRlcihtX3BCdWYpOw0KKyAgcEl0ZXItPm1fbkN1ckNodW5rID0gbV9uQ3VyQ2h1bms7DQorICBwSXRlci0+bV9uQ3VySW5kZXggPSBtX25DdXJJbmRleDsNCisgIHBJdGVyLT5tX25JbmRleCA9IG1fbkluZGV4Ow0KKyAgcEl0ZXItPm1fQWxpYXMgPSBtX0FsaWFzOw0KKyAgcmV0dXJuIHBJdGVyOw0KK30NCitDRkRFX1R4dEVkdEJ1Zjo6Q0ZERV9UeHRFZHRCdWYoaW50MzJfdCBuRGVmQ2h1bmtTaXplKQ0KKyAgICA6IG1fbkNodW5rU2l6ZShuRGVmQ2h1bmtTaXplKSwNCisgICAgICBtX25Ub3RhbCgwKSwNCisgICAgICBtX2JDaGFuZ2VkKEZBTFNFKSwNCisgICAgICBtX3BBbGxvY2F0b3IoTlVMTCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fbkNodW5rU2l6ZSk7DQorICBSZXNldENodW5rQnVmZmVyKEZERV9ERUZDSFVOS0NPVU5ULCBtX25DaHVua1NpemUpOw0KK30NCit2b2lkIENGREVfVHh0RWR0QnVmOjpSZWxlYXNlKCkgew0KKyAgZGVsZXRlIHRoaXM7DQorfQ0KK0NGREVfVHh0RWR0QnVmOjp+Q0ZERV9UeHRFZHRCdWYoKSB7DQorICBDbGVhcihUUlVFKTsNCisgIG1fcEFsbG9jYXRvci0+UmVsZWFzZSgpOw0KKyAgbV9DaHVua3MuUmVtb3ZlQWxsKCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRCdWY6OlNldENodW5rU2l6ZShpbnQzMl90IG5DaHVua1NpemUpIHsNCisgIEZYU1lTX2Fzc2VydChuQ2h1bmtTaXplKTsNCisgIFJlc2V0Q2h1bmtCdWZmZXIoRkRFX0RFRkNIVU5LQ09VTlQsIG5DaHVua1NpemUpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRCdWY6OkdldENodW5rU2l6ZSgpIGNvbnN0IHsNCisgIHJldHVybiBtX25DaHVua1NpemU7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRCdWY6OkdldFRleHRMZW5ndGgoKSBjb25zdCB7DQorICByZXR1cm4gbV9uVG90YWw7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRCdWY6OlNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgRlhTWVNfYXNzZXJ0KCF3c1RleHQuSXNFbXB0eSgpKTsNCisgIENsZWFyKEZBTFNFKTsNCisgIGludDMyX3QgblRleHRMZW5ndGggPSB3c1RleHQuR2V0TGVuZ3RoKCk7DQorICBpbnQzMl90IG5OZWVkQ291bnQgPQ0KKyAgICAgICgoblRleHRMZW5ndGggLSAxKSAvIG1fbkNodW5rU2l6ZSArIDEpIC0gbV9DaHVua3MuR2V0U2l6ZSgpOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIGZvciAoaSA9IDA7IGkgPCBuTmVlZENvdW50OyBpKyspIHsNCisgICAgRkRFX0xQQ0hVTktIRUFERVIgbHBDaHVuayA9IChGREVfTFBDSFVOS0hFQURFUiltX3BBbGxvY2F0b3ItPkFsbG9jKA0KKyAgICAgICAgc2l6ZW9mKEZERV9DSFVOS0hFQURFUikgKyAobV9uQ2h1bmtTaXplIC0gMSkgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgbHBDaHVuay0+blVzZWQgPSAwOw0KKyAgICBtX0NodW5rcy5BZGQobHBDaHVuayk7DQorICB9DQorICBpbnQzMl90IG5Ub3RhbENvdW50ID0gbV9DaHVua3MuR2V0U2l6ZSgpOw0KKyAgY29uc3QgRlhfV0NIQVIqIGxwU3JjQnVmID0gd3NUZXh0LmNfc3RyKCk7DQorICBpbnQzMl90IG5MZWF2ZSA9IG5UZXh0TGVuZ3RoOw0KKyAgaW50MzJfdCBuQ29weWVkTGVuZ3RoID0gbV9uQ2h1bmtTaXplOw0KKyAgZm9yIChpID0gMDsgaSA8IG5Ub3RhbENvdW50ICYmIG5MZWF2ZSA+IDA7IGkrKykgew0KKyAgICBpZiAobkxlYXZlIDwgbkNvcHllZExlbmd0aCkgew0KKyAgICAgIG5Db3B5ZWRMZW5ndGggPSBuTGVhdmU7DQorICAgIH0NCisgICAgRkRFX0xQQ0hVTktIRUFERVIgbHBDaHVuayA9IChGREVfTFBDSFVOS0hFQURFUiltX0NodW5rc1tpXTsNCisgICAgRlhTWVNfbWVtY3B5KGxwQ2h1bmstPndDaGFycywgbHBTcmNCdWYsIG5Db3B5ZWRMZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgbkxlYXZlIC09IG5Db3B5ZWRMZW5ndGg7DQorICAgIGxwU3JjQnVmICs9IG5Db3B5ZWRMZW5ndGg7DQorICAgIGxwQ2h1bmstPm5Vc2VkID0gbkNvcHllZExlbmd0aDsNCisgIH0NCisgIG1fblRvdGFsID0gblRleHRMZW5ndGg7DQorICBtX2JDaGFuZ2VkID0gVFJVRTsNCit9DQordm9pZCBDRkRFX1R4dEVkdEJ1Zjo6R2V0VGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSBjb25zdCB7DQorICBHZXRSYW5nZSh3c1RleHQsIDAsIG1fblRvdGFsKTsNCit9DQorRlhfV0NIQVIgQ0ZERV9UeHRFZHRCdWY6OkdldENoYXJCeUluZGV4KGludDMyX3QgbkluZGV4KSBjb25zdCB7DQorICBGWFNZU19hc3NlcnQobkluZGV4ID49IDAgJiYgbkluZGV4IDwgR2V0VGV4dExlbmd0aCgpKTsNCisgIEZERV9MUENIVU5LSEVBREVSIHBDaHVua0hlYWRlciA9IE5VTEw7DQorICBpbnQzMl90IG5Ub3RhbCA9IDA7DQorICBpbnQzMl90IG5Db3VudCA9IG1fQ2h1bmtzLkdldFNpemUoKTsNCisgIGludDMyX3QgaSA9IDA7DQorICBmb3IgKGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsNCisgICAgcENodW5rSGVhZGVyID0gKEZERV9MUENIVU5LSEVBREVSKW1fQ2h1bmtzW2ldOw0KKyAgICBuVG90YWwgKz0gcENodW5rSGVhZGVyLT5uVXNlZDsNCisgICAgaWYgKG5Ub3RhbCA+IG5JbmRleCkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBGWFNZU19hc3NlcnQocENodW5rSGVhZGVyKTsNCisgIHJldHVybiBwQ2h1bmtIZWFkZXItPndDaGFyc1twQ2h1bmtIZWFkZXItPm5Vc2VkIC0gKG5Ub3RhbCAtIG5JbmRleCldOw0KK30NCit2b2lkIENGREVfVHh0RWR0QnVmOjpHZXRSYW5nZShDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkJlZ2luLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbkxlbmd0aCkgY29uc3Qgew0KKyAgRkRFX0NIVU5LUExBQ0UgY3A7DQorICBJbmRleDJDUChuQmVnaW4sIGNwKTsNCisgIGludDMyX3QgbkxlYXZlID0gbkxlbmd0aDsNCisgIGludDMyX3QgbkNvdW50ID0gbV9DaHVua3MuR2V0U2l6ZSgpOw0KKyAgRlhfV0NIQVIqIGxwRHN0QnVmID0gd3NUZXh0LkdldEJ1ZmZlcihuTGVuZ3RoKTsNCisgIGludDMyX3QgbkNodW5rSW5kZXggPSBjcC5uQ2h1bmtJbmRleDsNCisgIEZERV9MUENIVU5LSEVBREVSIGxwQ2h1bmtIZWFkZXIgPSAoRkRFX0xQQ0hVTktIRUFERVIpbV9DaHVua3NbbkNodW5rSW5kZXhdOw0KKyAgaW50MzJfdCBuQ29weUxlbmd0aCA9IGxwQ2h1bmtIZWFkZXItPm5Vc2VkIC0gY3AubkNoYXJJbmRleDsNCisgIEZYX1dDSEFSKiBscFNyY0J1ZiA9IGxwQ2h1bmtIZWFkZXItPndDaGFycyArIGNwLm5DaGFySW5kZXg7DQorICB3aGlsZSAobkxlYXZlID4gMCkgew0KKyAgICBpZiAobkxlYXZlIDw9IG5Db3B5TGVuZ3RoKSB7DQorICAgICAgbkNvcHlMZW5ndGggPSBuTGVhdmU7DQorICAgIH0NCisgICAgRlhTWVNfbWVtY3B5KGxwRHN0QnVmLCBscFNyY0J1ZiwgbkNvcHlMZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgbkNodW5rSW5kZXgrKzsNCisgICAgaWYgKG5DaHVua0luZGV4ID49IG5Db3VudCkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGxwQ2h1bmtIZWFkZXIgPSAoRkRFX0xQQ0hVTktIRUFERVIpbV9DaHVua3NbbkNodW5rSW5kZXhdOw0KKyAgICBscFNyY0J1ZiA9IGxwQ2h1bmtIZWFkZXItPndDaGFyczsNCisgICAgbkxlYXZlIC09IG5Db3B5TGVuZ3RoOw0KKyAgICBscERzdEJ1ZiArPSBuQ29weUxlbmd0aDsNCisgICAgbkNvcHlMZW5ndGggPSBscENodW5rSGVhZGVyLT5uVXNlZDsNCisgIH0NCisgIHdzVGV4dC5SZWxlYXNlQnVmZmVyKCk7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRCdWY6Okluc2VydChpbnQzMl90IG5Qb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBscFRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbkxlbmd0aCkgew0KKyAgRlhTWVNfYXNzZXJ0KG5Qb3MgPj0gMCAmJiBuUG9zIDw9IG1fblRvdGFsKTsNCisgIEZERV9DSFVOS1BMQUNFIGNwOw0KKyAgSW5kZXgyQ1AoblBvcywgY3ApOw0KKyAgaW50MzJfdCBuTGVuZ3RoVGVtcCA9IG5MZW5ndGg7DQorICBpZiAoY3AubkNoYXJJbmRleCAhPSAwKSB7DQorICAgIEZERV9MUENIVU5LSEVBREVSIGxwTmV3Q2h1bmsgPSAoRkRFX0xQQ0hVTktIRUFERVIpbV9wQWxsb2NhdG9yLT5BbGxvYygNCisgICAgICAgIHNpemVvZihGREVfQ0hVTktIRUFERVIpICsgKG1fbkNodW5rU2l6ZSAtIDEpICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgIEZERV9MUENIVU5LSEVBREVSIGxwQ2h1bmsgPSAoRkRFX0xQQ0hVTktIRUFERVIpbV9DaHVua3NbY3AubkNodW5rSW5kZXhdOw0KKyAgICBpbnQzMl90IG5Db3B5ID0gbHBDaHVuay0+blVzZWQgLSBjcC5uQ2hhckluZGV4Ow0KKyAgICBGWFNZU19tZW1jcHkobHBOZXdDaHVuay0+d0NoYXJzLCBscENodW5rLT53Q2hhcnMgKyBjcC5uQ2hhckluZGV4LA0KKyAgICAgICAgICAgICAgICAgbkNvcHkgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgbHBDaHVuay0+blVzZWQgLT0gbkNvcHk7DQorICAgIGNwLm5DaHVua0luZGV4Kys7DQorICAgIG1fQ2h1bmtzLkluc2VydEF0KGNwLm5DaHVua0luZGV4LCBscE5ld0NodW5rKTsNCisgICAgbHBOZXdDaHVuay0+blVzZWQgPSBuQ29weTsNCisgICAgY3AubkNoYXJJbmRleCA9IDA7DQorICB9DQorICBpZiAoY3AubkNodW5rSW5kZXggIT0gMCkgew0KKyAgICBGREVfTFBDSFVOS0hFQURFUiBscENodW5rID0gKEZERV9MUENIVU5LSEVBREVSKW1fQ2h1bmtzW2NwLm5DaHVua0luZGV4IC0gMV07DQorICAgIGlmIChscENodW5rLT5uVXNlZCAhPSBtX25DaHVua1NpemUpIHsNCisgICAgICBjcC5uQ2h1bmtJbmRleC0tOw0KKyAgICAgIGludDMyX3QgbkZyZWUgPSBtX25DaHVua1NpemUgLSBscENodW5rLT5uVXNlZDsNCisgICAgICBpbnQzMl90IG5Db3B5ID0gc3RkOjptaW4obkxlbmd0aFRlbXAsIG5GcmVlKTsNCisgICAgICBGWFNZU19tZW1jcHkobHBDaHVuay0+d0NoYXJzICsgbHBDaHVuay0+blVzZWQsIGxwVGV4dCwNCisgICAgICAgICAgICAgICAgICAgbkNvcHkgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgICBscFRleHQgKz0gbkNvcHk7DQorICAgICAgbkxlbmd0aFRlbXAgLT0gbkNvcHk7DQorICAgICAgbHBDaHVuay0+blVzZWQgKz0gbkNvcHk7DQorICAgICAgY3AubkNodW5rSW5kZXgrKzsNCisgICAgfQ0KKyAgfQ0KKyAgd2hpbGUgKG5MZW5ndGhUZW1wID4gMCkgew0KKyAgICBGREVfTFBDSFVOS0hFQURFUiBscENodW5rID0gKEZERV9MUENIVU5LSEVBREVSKW1fcEFsbG9jYXRvci0+QWxsb2MoDQorICAgICAgICBzaXplb2YoRkRFX0NIVU5LSEVBREVSKSArIChtX25DaHVua1NpemUgLSAxKSAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICBGWFNZU19hc3NlcnQobHBDaHVuayk7DQorICAgIGludDMyX3QgbkNvcHkgPSBzdGQ6Om1pbihuTGVuZ3RoVGVtcCwgbV9uQ2h1bmtTaXplKTsNCisgICAgRlhTWVNfbWVtY3B5KGxwQ2h1bmstPndDaGFycywgbHBUZXh0LCBuQ29weSAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICBscFRleHQgKz0gbkNvcHk7DQorICAgIG5MZW5ndGhUZW1wIC09IG5Db3B5Ow0KKyAgICBscENodW5rLT5uVXNlZCA9IG5Db3B5Ow0KKyAgICBtX0NodW5rcy5JbnNlcnRBdChjcC5uQ2h1bmtJbmRleCwgbHBDaHVuayk7DQorICAgIGNwLm5DaHVua0luZGV4Kys7DQorICB9DQorICBtX25Ub3RhbCArPSBuTGVuZ3RoOw0KKyAgbV9iQ2hhbmdlZCA9IFRSVUU7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRCdWY6OkRlbGV0ZShpbnQzMl90IG5JbmRleCwgaW50MzJfdCBuTGVuZ3RoKSB7DQorICBGWFNZU19hc3NlcnQobkxlbmd0aCA+IDAgJiYgbkluZGV4ID49IDAgJiYgbkluZGV4ICsgbkxlbmd0aCA8PSBtX25Ub3RhbCk7DQorICBGREVfQ0hVTktQTEFDRSBjcEVuZDsNCisgIEluZGV4MkNQKG5JbmRleCArIG5MZW5ndGggLSAxLCBjcEVuZCk7DQorICBtX25Ub3RhbCAtPSBuTGVuZ3RoOw0KKyAgRkRFX0xQQ0hVTktIRUFERVIgbHBDaHVuayA9IChGREVfTFBDSFVOS0hFQURFUiltX0NodW5rc1tjcEVuZC5uQ2h1bmtJbmRleF07DQorICBpbnQzMl90IG5GaXJzdFBhcnQgPSBjcEVuZC5uQ2hhckluZGV4ICsgMTsNCisgIGludDMyX3Qgbk1vdmVQYXJ0ID0gbHBDaHVuay0+blVzZWQgLSBuRmlyc3RQYXJ0Ow0KKyAgaWYgKG5Nb3ZlUGFydCAhPSAwKSB7DQorICAgIGludDMyX3QgbkRlbGV0ZSA9IHN0ZDo6bWluKG5GaXJzdFBhcnQsIG5MZW5ndGgpOw0KKyAgICBGWFNZU19tZW1tb3ZlKGxwQ2h1bmstPndDaGFycyArIG5GaXJzdFBhcnQgLSBuRGVsZXRlLA0KKyAgICAgICAgICAgICAgICAgIGxwQ2h1bmstPndDaGFycyArIG5GaXJzdFBhcnQsIG5Nb3ZlUGFydCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICBscENodW5rLT5uVXNlZCAtPSBuRGVsZXRlOw0KKyAgICBuTGVuZ3RoIC09IG5EZWxldGU7DQorICAgIGNwRW5kLm5DaHVua0luZGV4LS07DQorICB9DQorICB3aGlsZSAobkxlbmd0aCA+IDApIHsNCisgICAgbHBDaHVuayA9IChGREVfTFBDSFVOS0hFQURFUiltX0NodW5rc1tjcEVuZC5uQ2h1bmtJbmRleF07DQorICAgIGludDMyX3QgbkRlbGV0ZWQgPSBzdGQ6Om1pbihscENodW5rLT5uVXNlZCwgbkxlbmd0aCk7DQorICAgIGxwQ2h1bmstPm5Vc2VkIC09IG5EZWxldGVkOw0KKyAgICBpZiAobHBDaHVuay0+blVzZWQgPT0gMCkgew0KKyAgICAgIG1fcEFsbG9jYXRvci0+RnJlZShscENodW5rKTsNCisgICAgICBtX0NodW5rcy5SZW1vdmVBdChjcEVuZC5uQ2h1bmtJbmRleCk7DQorICAgICAgbHBDaHVuayA9IE5VTEw7DQorICAgIH0NCisgICAgbkxlbmd0aCAtPSBuRGVsZXRlZDsNCisgICAgY3BFbmQubkNodW5rSW5kZXgtLTsNCisgIH0NCisgIG1fYkNoYW5nZWQgPSBUUlVFOw0KK30NCit2b2lkIENGREVfVHh0RWR0QnVmOjpDbGVhcihGWF9CT09MIGJSZWxlYXNlKSB7DQorICBpbnQzMl90IGkgPSAwOw0KKyAgaW50MzJfdCBuQ291bnQgPSBtX0NodW5rcy5HZXRTaXplKCk7DQorICBpZiAoYlJlbGVhc2UpIHsNCisgICAgd2hpbGUgKGkgPCBuQ291bnQpIHsNCisgICAgICBtX3BBbGxvY2F0b3ItPkZyZWUobV9DaHVua3NbaSsrXSk7DQorICAgIH0NCisgICAgbV9DaHVua3MuUmVtb3ZlQWxsKCk7DQorICB9IGVsc2Ugew0KKyAgICB3aGlsZSAoaSA8IG5Db3VudCkgew0KKyAgICAgICgoRkRFX0xQQ0hVTktIRUFERVIpbV9DaHVua3NbaSsrXSktPm5Vc2VkID0gMDsNCisgICAgfQ0KKyAgfQ0KKyAgbV9uVG90YWwgPSAwOw0KKyAgbV9iQ2hhbmdlZCA9IFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRCdWY6Ok9wdGltaXplKElGWF9QYXVzZSogcFBhdXNlKSB7DQorICBpZiAobV9iQ2hhbmdlZCA9PSBGQUxTRSkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIGlmIChtX25Ub3RhbCA9PSAwKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaW50MzJfdCBuQ291bnQgPSBtX0NodW5rcy5HZXRTaXplKCk7DQorICBpZiAobkNvdW50ID09IDApIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBpbnQzMl90IGkgPSAwOw0KKyAgZm9yICg7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICBGREVfTFBDSFVOS0hFQURFUiBscENodW5rID0gKEZERV9MUENIVU5LSEVBREVSKW1fQ2h1bmtzW2ldOw0KKyAgICBpZiAobHBDaHVuay0+blVzZWQgPT0gMCkgew0KKyAgICAgIG1fcEFsbG9jYXRvci0+RnJlZShscENodW5rKTsNCisgICAgICBtX0NodW5rcy5SZW1vdmVBdChpKTsNCisgICAgICAtLWk7DQorICAgICAgLS1uQ291bnQ7DQorICAgIH0NCisgIH0NCisgIGlmIChwUGF1c2UgIT0gTlVMTCAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRkRFX0xQQ0hVTktIRUFERVIgbHBQcmVDaHVuayA9IChGREVfTFBDSFVOS0hFQURFUiltX0NodW5rc1swXTsNCisgIEZERV9MUENIVU5LSEVBREVSIGxwQ3VyQ2h1bmsgPSBOVUxMOw0KKyAgZm9yIChpID0gMTsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgIGxwQ3VyQ2h1bmsgPSAoRkRFX0xQQ0hVTktIRUFERVIpbV9DaHVua3NbaV07DQorICAgIGlmIChscFByZUNodW5rLT5uVXNlZCArIGxwQ3VyQ2h1bmstPm5Vc2VkIDw9IG1fbkNodW5rU2l6ZSkgew0KKyAgICAgIEZYU1lTX21lbWNweShscFByZUNodW5rLT53Q2hhcnMgKyBscFByZUNodW5rLT5uVXNlZCwgbHBDdXJDaHVuay0+d0NoYXJzLA0KKyAgICAgICAgICAgICAgICAgICBscEN1ckNodW5rLT5uVXNlZCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICAgIGxwUHJlQ2h1bmstPm5Vc2VkICs9IGxwQ3VyQ2h1bmstPm5Vc2VkOw0KKyAgICAgIG1fcEFsbG9jYXRvci0+RnJlZShscEN1ckNodW5rKTsNCisgICAgICBtX0NodW5rcy5SZW1vdmVBdChpKTsNCisgICAgICAtLWk7DQorICAgICAgLS1uQ291bnQ7DQorICAgIH0gZWxzZSB7DQorICAgICAgbHBQcmVDaHVuayA9IGxwQ3VyQ2h1bms7DQorICAgIH0NCisgICAgaWYgKHBQYXVzZSAhPSBOVUxMICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgfQ0KKyAgbV9iQ2hhbmdlZCA9IEZBTFNFOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRCdWY6OlJlc2V0Q2h1bmtCdWZmZXIoaW50MzJfdCBuRGVmQ2h1bmtDb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNodW5rU2l6ZSkgew0KKyAgRlhTWVNfYXNzZXJ0KG5DaHVua1NpemUpOw0KKyAgRlhTWVNfYXNzZXJ0KG5EZWZDaHVua0NvdW50KTsNCisgIGlmIChtX3BBbGxvY2F0b3IpIHsNCisgICAgbV9wQWxsb2NhdG9yLT5SZWxlYXNlKCk7DQorICAgIG1fcEFsbG9jYXRvciA9IE5VTEw7DQorICB9DQorICBtX0NodW5rcy5SZW1vdmVBbGwoKTsNCisgIG1fbkNodW5rU2l6ZSA9IG5DaHVua1NpemU7DQorICBpbnQzMl90IG5DaHVua0xlbmd0aCA9DQorICAgICAgc2l6ZW9mKEZERV9DSFVOS0hFQURFUikgKyAobV9uQ2h1bmtTaXplIC0gMSkgKiBzaXplb2YoRlhfV0NIQVIpOw0KKyAgbV9wQWxsb2NhdG9yID0NCisgICAgICBGWF9DcmVhdGVBbGxvY2F0b3IoRlhfQUxMT0NUWVBFX0ZpeGVkLCBuRGVmQ2h1bmtDb3VudCwgbkNodW5rTGVuZ3RoKTsNCisgIEZYU1lTX2Fzc2VydChtX3BBbGxvY2F0b3IpOw0KKyAgRkRFX0xQQ0hVTktIRUFERVIgbHBDaHVua0hlYWRlciA9DQorICAgICAgKEZERV9MUENIVU5LSEVBREVSKW1fcEFsbG9jYXRvci0+QWxsb2MobkNodW5rTGVuZ3RoKTsNCisgIEZYU1lTX2Fzc2VydChscENodW5rSGVhZGVyKTsNCisgIGxwQ2h1bmtIZWFkZXItPm5Vc2VkID0gMDsNCisgIG1fQ2h1bmtzLkFkZChscENodW5rSGVhZGVyKTsNCisgIG1fblRvdGFsID0gMDsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdEJ1Zjo6Q1AySW5kZXgoY29uc3QgRkRFX0NIVU5LUExBQ0UmIGNwKSBjb25zdCB7DQorICBpbnQzMl90IG5Ub3RhbCA9IGNwLm5DaGFySW5kZXg7DQorICBpbnQzMl90IGkgPSAwOw0KKyAgZm9yIChpID0gMDsgaSA8IGNwLm5DaHVua0luZGV4OyBpKyspIHsNCisgICAgblRvdGFsICs9ICgoRkRFX0xQQ0hVTktIRUFERVIpbV9DaHVua3NbaV0pLT5uVXNlZDsNCisgIH0NCisgIHJldHVybiBuVG90YWw7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRCdWY6OkluZGV4MkNQKGludDMyX3QgbkluZGV4LCBGREVfQ0hVTktQTEFDRSYgY3ApIGNvbnN0IHsNCisgIEZYU1lTX2Fzc2VydChuSW5kZXggPD0gR2V0VGV4dExlbmd0aCgpKTsNCisgIGlmIChuSW5kZXggPT0gbV9uVG90YWwpIHsNCisgICAgY3AubkNodW5rSW5kZXggPSBtX0NodW5rcy5HZXRTaXplKCkgLSAxOw0KKyAgICBjcC5uQ2hhckluZGV4ID0gKChGREVfTFBDSFVOS0hFQURFUiltX0NodW5rc1tjcC5uQ2h1bmtJbmRleF0pLT5uVXNlZDsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpID0gMDsNCisgIGludDMyX3QgblRvdGFsID0gMDsNCisgIGludDMyX3QgbkNvdW50ID0gbV9DaHVua3MuR2V0U2l6ZSgpOw0KKyAgZm9yICg7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICBuVG90YWwgKz0gKChGREVfTFBDSFVOS0hFQURFUiltX0NodW5rc1tpXSktPm5Vc2VkOw0KKyAgICBpZiAoblRvdGFsID4gbkluZGV4KSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGNwLm5DaHVua0luZGV4ID0gaTsNCisgIGNwLm5DaGFySW5kZXggPSAoKEZERV9MUENIVU5LSEVBREVSKW1fQ2h1bmtzW2ldKS0+blVzZWQgLSAoblRvdGFsIC0gbkluZGV4KTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0YnVmLmggYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRidWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2FhMWM2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0YnVmLmgKQEAgLTAsMCArMSw5NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GREVfVFhURURUQlVGX0gNCisjZGVmaW5lIF9GREVfVFhURURUQlVGX0gNCitjbGFzcyBJRlhfQ2hhckl0ZXI7DQorY2xhc3MgQ0ZERV9UeHRFZHRCdWZJdGVyOw0KK2NsYXNzIENGREVfVHh0RWR0QnVmOw0KK2NsYXNzIENGREVfVHh0RWR0QnVmSXRlciA6IHB1YmxpYyBJRlhfQ2hhckl0ZXIgew0KKyBwdWJsaWM6DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgQ0ZERV9UeHRFZHRCdWZJdGVyKENGREVfVHh0RWR0QnVmKiBwQnVmLCBGWF9CT09MIGJGb3JEaXNwbGF5ID0gVFJVRSk7DQorI2Vsc2UNCisgIENGREVfVHh0RWR0QnVmSXRlcihDRkRFX1R4dEVkdEJ1ZiogcEJ1ZiwgRlhfV0NIQVIgd2NBbGlhcyA9IDApOw0KKyNlbmRpZg0KKw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBOZXh0KEZYX0JPT0wgYlByZXYgPSBGQUxTRSk7DQorICB2aXJ0dWFsIEZYX1dDSEFSIEdldENoYXIoKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRBdChpbnQzMl90IG5JbmRleCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0QXQoKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0VPRihGWF9CT09MIGJUYWlsID0gVFJVRSkgY29uc3Q7DQorICB2aXJ0dWFsIElGWF9DaGFySXRlciogQ2xvbmUoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgfkNGREVfVHh0RWR0QnVmSXRlcigpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0ZERV9UeHRFZHRCdWYqIG1fcEJ1ZjsNCisgIGludDMyX3QgbV9uQ3VyQ2h1bms7DQorICBpbnQzMl90IG1fbkN1ckluZGV4Ow0KKyAgaW50MzJfdCBtX25JbmRleDsNCisjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQorICBGWF9CT09MIG1fYkZvckRpc3BsYXk7DQorICBpbnQzMl90IG1fbkFsaWFzQ291bnQ7DQorI2VuZGlmDQorICBGWF9XQ0hBUiBtX0FsaWFzOw0KK307DQorY2xhc3MgQ0ZERV9UeHRFZHRCdWYgOiBwdWJsaWMgSUZERV9UeHRFZHRCdWYgew0KKyAgZnJpZW5kIGNsYXNzIENGREVfVHh0RWR0QnVmSXRlcjsNCisgIHN0cnVjdCBfRkRFX0NIVU5LSEVBREVSIHsNCisgICAgaW50MzJfdCBuVXNlZDsNCisgICAgRlhfV0NIQVIgd0NoYXJzWzFdOw0KKyAgfTsNCisgIHR5cGVkZWYgX0ZERV9DSFVOS0hFQURFUiBGREVfQ0hVTktIRUFERVI7DQorICB0eXBlZGVmIF9GREVfQ0hVTktIRUFERVIqIEZERV9MUENIVU5LSEVBREVSOw0KKyAgc3RydWN0IF9GREVfQ0hVTktQTEFDRSB7DQorICAgIGludDMyX3QgbkNodW5rSW5kZXg7DQorICAgIGludDMyX3QgbkNoYXJJbmRleDsNCisgIH07DQorICB0eXBlZGVmIF9GREVfQ0hVTktQTEFDRSBGREVfQ0hVTktQTEFDRTsNCisgIHR5cGVkZWYgX0ZERV9DSFVOS1BMQUNFKiBGREVfTFBDSFVOS1BMQUNFOw0KKw0KKyBwdWJsaWM6DQorICBDRkRFX1R4dEVkdEJ1ZihpbnQzMl90IG5EZWZDaHVua1NpemUgPSBGREVfREVGQ0hVTktMRU5HVEgpOw0KKw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRDaHVua1NpemUoaW50MzJfdCBuQ2h1bmtTaXplKTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDaHVua1NpemUoKSBjb25zdDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRUZXh0TGVuZ3RoKCkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgU2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsNCisgIHZpcnR1YWwgdm9pZCBHZXRUZXh0KENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9XQ0hBUiBHZXRDaGFyQnlJbmRleChpbnQzMl90IG5JbmRleCkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0UmFuZ2UoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5CZWdpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQgPSAtMSkgY29uc3Q7DQorDQorICB2aXJ0dWFsIHZvaWQgSW5zZXJ0KGludDMyX3QgblBvcywNCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuZ3RoID0gMSk7DQorICB2aXJ0dWFsIHZvaWQgRGVsZXRlKGludDMyX3QgbkluZGV4LCBpbnQzMl90IG5MZW5ndGggPSAxKTsNCisgIHZpcnR1YWwgdm9pZCBDbGVhcihGWF9CT09MIGJSZWxlYXNlID0gVFJVRSk7DQorDQorICB2aXJ0dWFsIEZYX0JPT0wgT3B0aW1pemUoSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdmlydHVhbCB+Q0ZERV9UeHRFZHRCdWYoKTsNCisNCisgcHJpdmF0ZToNCisgIHZvaWQgUmVzZXRDaHVua0J1ZmZlcihpbnQzMl90IG5EZWZDaHVua0NvdW50LCBpbnQzMl90IG5DaHVua1NpemUpOw0KKyAgaW50MzJfdCBDUDJJbmRleChjb25zdCBGREVfQ0hVTktQTEFDRSYgY3ApIGNvbnN0Ow0KKyAgdm9pZCBJbmRleDJDUChpbnQzMl90IG5JbmRleCwgRkRFX0NIVU5LUExBQ0UmIGNwKSBjb25zdDsNCisNCisgIGludDMyX3QgbV9uQ2h1bmtTaXplOw0KKw0KKyAgaW50MzJfdCBtX25Ub3RhbDsNCisgIEZYX0JPT0wgbV9iQ2hhbmdlZDsNCisgIENGWF9QdHJBcnJheSBtX0NodW5rczsNCisgIElGWF9NRU1BbGxvY2F0b3IqIG1fcEFsbG9jYXRvcjsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGVuZ2luZS5jcHAgYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRlbmdpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkODdmMmMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRlbmdpbmUuY3BwCkBAIC0wLDAgKzEsMjg2NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSA8YWxnb3JpdGhtPg0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZmVlL2luY2x1ZGUvaWZkZV90eHRlZHRlbmdpbmUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9mZWUvaW5jbHVkZS9pZmRlX3R4dGVkdGJ1Zi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZlZS9pbmNsdWRlL2lmZGVfdHh0ZWR0cGFnZS5oIg0KKyNpbmNsdWRlICJmZGVfdHh0ZWR0ZW5naW5lLmgiDQorI2luY2x1ZGUgImZkZV90eHRlZHRwYXJhZy5oIg0KKyNpbmNsdWRlICJmZGVfdHh0ZWR0YnVmLmgiDQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyNpbmNsdWRlICJmZGVfdHh0ZWR0YmxvY2suaCINCisjZW5kaWYNCisjZGVmaW5lIEZERV9QQUdFV0lEVEhfTUFYIDB4RkZGRg0KKyNkZWZpbmUgRkRFX1RYVFBMQVRFU0laRSAoMTAyNCAqIDEyKQ0KKyNkZWZpbmUgRkRFX1VOSUNPREVfUEFSQUdSQVBIX1NQRVJBVE9SICgweDIwMjkpDQorI2RlZmluZSBGREVfVFhURURUX0RPUkVDT1JEX0lOUyAwDQorI2RlZmluZSBGREVfVFhURURUX0RPUkVDT1JEX0RFTCAxDQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyNkZWZpbmUgRkRFX1RYVEVEVF9ET1JFQ09SRF9GT1JNQVRJTlMgMw0KKyNkZWZpbmUgRkRFX1RYVEVEVF9ET1JFQ09SRF9GT1JNQVRERUwgNA0KKyNkZWZpbmUgRkRFX1RYVEVEVF9ET1JFQ09SRF9GT1JNQVRSRVAgNQ0KKyNkZWZpbmUgRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19CR04gMHhGRkY5DQorI2RlZmluZSBGREVfVFhURURUX0ZPUk1BVEJMT0NLX0VORCAweEZGRkINCisjZW5kaWYNCitJRkRFX1R4dEVkdEVuZ2luZSogSUZERV9UeHRFZHRFbmdpbmU6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBuZXcgQ0ZERV9UeHRFZHRFbmdpbmUoKTsNCit9DQorQ0ZERV9UeHRFZHRFbmdpbmU6OkNGREVfVHh0RWR0RW5naW5lKCkNCisgICAgOiBtX3BUZXh0QnJlYWsobnVsbHB0ciksDQorICAgICAgbV9uUGFnZUxpbmVDb3VudCgyMCksDQorICAgICAgbV9uTGluZUNvdW50KDApLA0KKyAgICAgIG1fbkFuY2hvclBvcygtMSksDQorICAgICAgbV9uTGF5b3V0UG9zKDApLA0KKyAgICAgIG1fZkNhcmV0UG9zUmVzZXJ2ZSgwLjApLA0KKyAgICAgIG1fbkNhcmV0KDApLA0KKyAgICAgIG1fYkJlZm9yZShUUlVFKSwNCisgICAgICBtX25DYXJldFBhZ2UoMCksDQorICAgICAgbV9kd0ZpbmRGbGFncygwKSwNCisgICAgICBtX2JMb2NrKEZBTFNFKSwNCisgICAgICBtX25MaW1pdCgwKSwNCisgICAgICBtX3djQWxpYXNDaGFyKEwnKicpLA0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCisgICAgICBtX25GaXhMZW5ndGgoLTEpLCAgLy8gRklYTUU6IG5vIHN1Y2ggbWVtYmVyID0+IFVTRUZPUk1BVEJMT0NLIGNhbid0IHdvcmsuDQorI2VuZGlmDQorICAgICAgbV9uRmlyc3RMaW5lRW5kKEZERV9UWFRFRElUX0xJTkVFTkRfQXV0byksDQorICAgICAgbV9iQXV0b0xpbmVFbmQoVFJVRSksDQorICAgICAgbV93TGluZUVuZChGREVfVU5JQ09ERV9QQVJBR1JBUEhfU1BFUkFUT1IpIHsNCisgIEZYU1lTX21lbXNldCgmbV9ydENhcmV0LCAwLCBzaXplb2YoQ0ZYX1JlY3RGKSk7DQorICBtX3BUeHRCdWYgPSBuZXcgQ0ZERV9UeHRFZHRCdWYoKTsNCisgIG1fYkF1dG9MaW5lRW5kID0gKG1fUGFyYW0ubkxpbmVFbmQgPT0gRkRFX1RYVEVESVRfTElORUVORF9BdXRvKTsNCit9DQorQ0ZERV9UeHRFZHRFbmdpbmU6On5DRkRFX1R4dEVkdEVuZ2luZSgpIHsNCisgIGlmIChtX3BUeHRCdWYpIHsNCisgICAgbV9wVHh0QnVmLT5SZWxlYXNlKCk7DQorICAgIG1fcFR4dEJ1ZiA9IE5VTEw7DQorICB9DQorICBpZiAobV9wVGV4dEJyZWFrKSB7DQorICAgIG1fcFRleHRCcmVhay0+UmVsZWFzZSgpOw0KKyAgICBtX3BUZXh0QnJlYWsgPSBOVUxMOw0KKyAgfQ0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCisgIGludDMyX3QgbkJsb2NrQ291bnQgPSBtX0Jsb2NrQXJyYXkuR2V0U2l6ZSgpOw0KKyAgaWYgKG5CbG9ja0NvdW50ID4gMCkgew0KKyAgICBpbnQzMl90IGkgPSAwOw0KKyAgICBmb3IgKDsgaSA8IG5CbG9ja0NvdW50OyBpKyspIHsNCisgICAgICBDRkRFX1R4dEVkdEJsb2NrKiBwQmxvY2sgPSBtX0Jsb2NrQXJyYXlbaV07DQorICAgICAgZGVsZXRlIHBCbG9jazsNCisgICAgfQ0KKyAgICBtX0Jsb2NrQXJyYXkuUmVtb3ZlQWxsKCk7DQorICB9DQorI2VuZGlmDQorICBSZW1vdmVBbGxQYXJhZ3MoKTsNCisgIFJlbW92ZUFsbFBhZ2VzKCk7DQorICBtX1BhcmFtLnBFdmVudFNpbmsgPSBOVUxMOw0KKyAgQ2xlYXJTZWxlY3Rpb24oKTsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6UmVsZWFzZSgpIHsNCisgIGRlbGV0ZSB0aGlzOw0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpTZXRFZGl0UGFyYW1zKGNvbnN0IEZERV9UWFRFRFRQQVJBTVMmIHBhcmFtcykgew0KKyAgaWYgKG1fcFRleHRCcmVhayA9PSBOVUxMKSB7DQorICAgIG1fcFRleHRCcmVhayA9IElGWF9UeHRCcmVhazo6Q3JlYXRlKEZYX1RYVEJSRUFLUE9MSUNZX05vbmUpOw0KKyAgfQ0KKyAgRlhTWVNfbWVtY3B5KCZtX1BhcmFtLCAmcGFyYW1zLCBzaXplb2YoRkRFX1RYVEVEVFBBUkFNUykpOw0KKyAgbV93TGluZUVuZCA9IHBhcmFtcy53TGluZUJyZWFrQ2hhcjsNCisgIG1fYkF1dG9MaW5lRW5kID0gKG1fUGFyYW0ubkxpbmVFbmQgPT0gRkRFX1RYVEVESVRfTElORUVORF9BdXRvKTsNCisgIFVwZGF0ZVR4dEJyZWFrKCk7DQorfQ0KK2NvbnN0IEZERV9UWFRFRFRQQVJBTVMqIENGREVfVHh0RWR0RW5naW5lOjpHZXRFZGl0UGFyYW1zKCkgY29uc3Qgew0KKyAgcmV0dXJuICZtX1BhcmFtOw0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpDb3VudFBhZ2VzKCkgY29uc3Qgew0KKyAgaWYgKG1fbkxpbmVDb3VudCA9PSAwKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgcmV0dXJuICgobV9uTGluZUNvdW50IC0gMSkgLyBtX25QYWdlTGluZUNvdW50KSArIDE7DQorfQ0KK0lGREVfVHh0RWR0UGFnZSogQ0ZERV9UeHRFZHRFbmdpbmU6OkdldFBhZ2UoaW50MzJfdCBuSW5kZXgpIHsNCisgIGlmIChtX1BhZ2VQdHJBcnJheS5HZXRTaXplKCkgPD0gbkluZGV4KSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIChJRkRFX1R4dEVkdFBhZ2UqKW1fUGFnZVB0ckFycmF5W25JbmRleF07DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6OlNldEJ1ZkNodW5rU2l6ZShpbnQzMl90IG5DaHVua1NpemUpIHsNCisgIHJldHVybiBtX3BUeHRCdWYtPlNldENodW5rU2l6ZShuQ2h1bmtTaXplKTsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6U2V0VGV4dEJ5U3RyZWFtKElGWF9TdHJlYW0qIHBTdHJlYW0pIHsNCisgIFJlc2V0RW5naW5lKCk7DQorICBpbnQzMl90IG5JbmRleCA9IDA7DQorICBpZiAocFN0cmVhbSAhPSBOVUxMICYmIHBTdHJlYW0tPkdldExlbmd0aCgpKSB7DQorICAgIGludDMyX3QgblN0cmVhbUxlbmd0aCA9IHBTdHJlYW0tPkdldExlbmd0aCgpOw0KKyAgICBGWF9CT09MIGJWYWxpZCA9IFRSVUU7DQorICAgIGlmIChtX25MaW1pdCA+IDAgJiYgblN0cmVhbUxlbmd0aCA+IG1fbkxpbWl0KSB7DQorICAgICAgYlZhbGlkID0gRkFMU0U7DQorICAgIH0NCisgICAgRlhfQk9PTCBiUHJlSXNDUiA9IEZBTFNFOw0KKyAgICBpZiAoYlZhbGlkKSB7DQorICAgICAgdWludDhfdCBib21bNF07DQorICAgICAgaW50MzJfdCBuUG9zID0gcFN0cmVhbS0+R2V0Qk9NKGJvbSk7DQorICAgICAgcFN0cmVhbS0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCBuUG9zKTsNCisgICAgICBpbnQzMl90IG5QbGF0ZVNpemUgPSBzdGQ6Om1pbihuU3RyZWFtTGVuZ3RoLCBtX3BUeHRCdWYtPkdldENodW5rU2l6ZSgpKTsNCisgICAgICBGWF9XQ0hBUiogbHB3c3RyID0gRlhfQWxsb2MoRlhfV0NIQVIsIG5QbGF0ZVNpemUpOw0KKyAgICAgIEZYX0JPT0wgYkVvcyA9IGZhbHNlOw0KKyAgICAgIHdoaWxlICghYkVvcykgew0KKyAgICAgICAgaW50MzJfdCBuUmVhZCA9IHBTdHJlYW0tPlJlYWRTdHJpbmcobHB3c3RyLCBuUGxhdGVTaXplLCBiRW9zKTsNCisgICAgICAgIGJQcmVJc0NSID0gUmVwbGFjZVBhcmFnRW5kKGxwd3N0ciwgblJlYWQsIGJQcmVJc0NSKTsNCisgICAgICAgIG1fcFR4dEJ1Zi0+SW5zZXJ0KG5JbmRleCwgbHB3c3RyLCBuUmVhZCk7DQorICAgICAgICBuSW5kZXggKz0gblJlYWQ7DQorICAgICAgfQ0KKyAgICAgIEZYX0ZyZWUobHB3c3RyKTsNCisgICAgfQ0KKyAgfQ0KKyAgbV9wVHh0QnVmLT5JbnNlcnQobkluZGV4LCAmbV93TGluZUVuZCwgMSk7DQorICBSZWJ1aWxkUGFyYWdyYXBocygpOw0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIFJlc2V0RW5naW5lKCk7DQorICBpbnQzMl90IG5MZW5ndGggPSB3c1RleHQuR2V0TGVuZ3RoKCk7DQorICBpZiAobkxlbmd0aCA+IDApIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KKyAgICBGWF9XQ0hBUiogbHBCdWZmZXIgPSB3c1RlbXAuR2V0QnVmZmVyKG5MZW5ndGgpOw0KKyAgICBGWFNZU19tZW1jcHkobHBCdWZmZXIsIHdzVGV4dC5jX3N0cigpLCBuTGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgIFJlcGxhY2VQYXJhZ0VuZChscEJ1ZmZlciwgbkxlbmd0aCwgRkFMU0UpOw0KKyAgICB3c1RlbXAuUmVsZWFzZUJ1ZmZlcihuTGVuZ3RoKTsNCisgICAgaWYgKG1fbkxpbWl0ID4gMCAmJiBuTGVuZ3RoID4gbV9uTGltaXQpIHsNCisgICAgICB3c1RlbXAuRGVsZXRlKG1fbkxpbWl0LCBuTGVuZ3RoIC0gbV9uTGltaXQpOw0KKyAgICAgIG5MZW5ndGggPSBtX25MaW1pdDsNCisgICAgfQ0KKyAgICBtX3BUeHRCdWYtPlNldFRleHQod3NUZW1wKTsNCisgIH0NCisgIG1fcFR4dEJ1Zi0+SW5zZXJ0KG5MZW5ndGgsICZtX3dMaW5lRW5kLCAxKTsNCisgIFJlYnVpbGRQYXJhZ3JhcGhzKCk7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldFRleHRMZW5ndGgoKSBjb25zdCB7DQorICByZXR1cm4gR2V0VGV4dEJ1Zkxlbmd0aCgpOw0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpHZXRUZXh0KENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50KSB7DQorICBpbnQzMl90IG5UZXh0QnVmTGVuZ3RoID0gR2V0VGV4dEJ1Zkxlbmd0aCgpOw0KKyAgaWYgKG5Db3VudCA9PSAtMSkgew0KKyAgICBuQ291bnQgPSBuVGV4dEJ1Zkxlbmd0aCAtIG5TdGFydDsNCisgIH0NCisjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQorICBpbnQzMl90IG5CbG9ja0NvdW50ID0gbV9CbG9ja0FycmF5LkdldFNpemUoKTsNCisgIGlmIChuQmxvY2tDb3VudCA9PSAwIHx8IG1fd3NGaXhUZXh0LklzRW1wdHkoKSkgew0KKyAgICBtX3BUeHRCdWYtPkdldFJhbmdlKHdzVGV4dCwgblN0YXJ0LCBuQ291bnQpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7DQorICBjb25zdCBGWF9XQ0hBUiogbHBGaXhCdWZmZXIgPSBjb25zdCBGWF9XQ0hBUiAqIChtX3dzRml4VGV4dCk7DQorICBGWF9XQ0hBUiogbHBCdWZmZXIgPSB3c1RlbXAuR2V0QnVmZmVyKG5UZXh0QnVmTGVuZ3RoKTsNCisgIGludDMyX3QgblJlYWxMZW5ndGggPSAwOw0KKyAgaW50MzJfdCBuUHJlUG9zID0gMDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5CbG9ja0NvdW50OyBpKyspIHsNCisgICAgQ0ZERV9UeHRFZHRCbG9jayogcEJsb2NrID0gbV9CbG9ja0FycmF5W2ldOw0KKyAgICBpbnQzMl90IG5Qb3MgPSBwQmxvY2stPkdldFBvcygpOw0KKyAgICBpbnQzMl90IG5Db3B5TGVuZ3RoID0gblBvcyAtIG5QcmVQb3M7DQorICAgIEZYU1lTX21lbWNweShscEJ1ZmZlciArIG5SZWFsTGVuZ3RoLCBscEZpeEJ1ZmZlciArIG5QcmVQb3MsDQorICAgICAgICAgICAgICAgICBuQ29weUxlbmd0aCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICBuUmVhbExlbmd0aCArPSBuQ29weUxlbmd0aDsNCisgICAgblByZVBvcyA9IG5Qb3M7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQmxvY2s7DQorICAgIHBCbG9jay0+R2V0UmVhbFRleHQod3NCbG9jayk7DQorICAgIG5Db3B5TGVuZ3RoID0gd3NCbG9jay5HZXRMZW5ndGgoKTsNCisgICAgRlhTWVNfbWVtY3B5KGxwQnVmZmVyICsgblJlYWxMZW5ndGgsIGNvbnN0IEZYX1dDSEFSKih3c0Jsb2NrKSwNCisgICAgICAgICAgICAgICAgIG5Db3B5TGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgIG5SZWFsTGVuZ3RoICs9IG5Db3B5TGVuZ3RoOw0KKyAgfQ0KKyAgaW50MzJfdCBuTGVmdExlbmd0aCA9IG1fd3NGaXhUZXh0LkdldExlbmd0aCgpIC0gblByZVBvczsNCisgIGlmIChuTGVmdExlbmd0aCA+IDApIHsNCisgICAgRlhTWVNfbWVtY3B5KGxwQnVmZmVyICsgblJlYWxMZW5ndGgsIGxwRml4QnVmZmVyICsgblByZVBvcywNCisgICAgICAgICAgICAgICAgIG5MZWZ0TGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgIG5SZWFsTGVuZ3RoICs9IG5MZWZ0TGVuZ3RoOw0KKyAgfQ0KKyAgd3NUZW1wLlJlbGVhc2VCdWZmZXIoblJlYWxMZW5ndGgpOw0KKyAgaW50MzJfdCBuUmVhbEJnbiA9IEdldFJlYWxJbmRleChuU3RhcnQpOw0KKyAgaW50MzJfdCBuUmVhbEVuZCA9IEdldFJlYWxJbmRleChuU3RhcnQgKyBuQ291bnQgLSAxKTsNCisgIGludDMyX3QgblJlYWxDb3VudCA9IG5SZWFsRW5kIC0gblJlYWxCZ247DQorICBGWF9XQ0hBUiogbHBEZXN0QnVmID0gd3NUZXh0LkdldEJ1ZmZlcihuUmVhbENvdW50KTsNCisgIEZYU1lTX21lbWNweShscERlc3RCdWYsIGNvbnN0IEZYX1dDSEFSKih3c1RlbXApICsgblJlYWxCZ24sDQorICAgICAgICAgICAgICAgblJlYWxDb3VudCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgd3NUZXh0LlJlbGVhc2VCdWZmZXIoKTsNCisjZWxzZQ0KKyAgbV9wVHh0QnVmLT5HZXRSYW5nZSh3c1RleHQsIG5TdGFydCwgbkNvdW50KTsNCisgIFJlY292ZXJQYXJhZ0VuZCh3c1RleHQpOw0KKyAgcmV0dXJuOw0KKyNlbmRpZg0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpDbGVhclRleHQoKSB7DQorICBEZWxldGVSYW5nZSgwLCAtMSk7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldENhcmV0UmVjdChDRlhfUmVjdEYmIHJ0Q2FyZXQpIGNvbnN0IHsNCisgIHJ0Q2FyZXQgPSBtX3J0Q2FyZXQ7DQorICByZXR1cm4gbV9uQ2FyZXQ7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldENhcmV0UG9zKCkgY29uc3Qgew0KKyAgaWYgKElzTG9ja2VkKCkpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICByZXR1cm4gbV9uQ2FyZXQgKyAobV9iQmVmb3JlID8gMCA6IDEpOw0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpTZXRDYXJldFBvcyhpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiQmVmb3JlKSB7DQorICBpZiAoSXNMb2NrZWQoKSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIEZYU1lTX2Fzc2VydChuSW5kZXggPj0gMCAmJiBuSW5kZXggPD0gR2V0VGV4dEJ1Zkxlbmd0aCgpKTsNCisgIGlmIChtX1BhZ2VQdHJBcnJheS5HZXRTaXplKCkgPD0gbV9uQ2FyZXRQYWdlKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCisgIGlmIChtX0Jsb2NrQXJyYXkuR2V0U2l6ZSgpID4gMCkgew0KKyAgICBuSW5kZXggPSBOb3JtYWxpemVDYXJldFBvcyhuSW5kZXgsIEZERV9GT1JNQVRfQ0FSRVRfTUlERExFLCBiQmVmb3JlKTsNCisgIH0NCisjZW5kaWYNCisgIG1fYkJlZm9yZSA9IGJCZWZvcmU7DQorICBtX25DYXJldCA9IG5JbmRleDsNCisgIE1vdmVQYWdlMkNoYXIobV9uQ2FyZXQpOw0KKyAgR2V0Q2FyZXRSZWN0KG1fcnRDYXJldCwgbV9uQ2FyZXRQYWdlLCBtX25DYXJldCwgbV9iQmVmb3JlKTsNCisgIGlmICghbV9iQmVmb3JlKSB7DQorICAgIG1fbkNhcmV0Kys7DQorICAgIG1fYkJlZm9yZSA9IFRSVUU7DQorICB9DQorICBtX2ZDYXJldFBvc1Jlc2VydmUgPSAobV9QYXJhbS5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9Eb2NWZXJ0aWNhbCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1fcnRDYXJldC50b3ANCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1fcnRDYXJldC5sZWZ0Ow0KKyAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9DYXJldENoYW5nZWQodGhpcywgbV9uQ2FyZXRQYWdlLCAwKTsNCisgIG1fbkFuY2hvclBvcyA9IC0xOw0KKyAgcmV0dXJuIG1fbkNhcmV0Ow0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpNb3ZlQ2FyZXRQb3MoRkRFX1RYVEVEVE1PVkVDQVJFVCBlTW92ZUNhcmV0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ3RybCkgew0KKyAgaWYgKElzTG9ja2VkKCkpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpZiAobV9QYWdlUHRyQXJyYXkuR2V0U2l6ZSgpIDw9IG1fbkNhcmV0UGFnZSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIEZYX0JPT0wgYlNlbENoYW5nZSA9IEZBTFNFOw0KKyAgaWYgKElzU2VsZWN0KCkpIHsNCisgICAgQ2xlYXJTZWxlY3Rpb24oKTsNCisgICAgYlNlbENoYW5nZSA9IFRSVUU7DQorICB9DQorICBpZiAoYlNoaWZ0KSB7DQorICAgIGlmIChtX25BbmNob3JQb3MgPT0gLTEpIHsNCisgICAgICBtX25BbmNob3JQb3MgPSBtX25DYXJldDsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgbV9uQW5jaG9yUG9zID0gLTE7DQorICB9DQorICBGWF9CT09MIGJWZXJ0aWNhbCA9IG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfRG9jVmVydGljYWw7DQorICBzd2l0Y2ggKGVNb3ZlQ2FyZXQpIHsNCisgICAgY2FzZSBNQ19MZWZ0OiB7DQorICAgICAgaWYgKGJWZXJ0aWNhbCkgew0KKyAgICAgICAgQ0ZYX1BvaW50RiBwdENhcmV0Ow0KKyAgICAgICAgaWYgKE1vdmVVcChwdENhcmV0KSkgew0KKyAgICAgICAgICBVcGRhdGVDYXJldEluZGV4KHB0Q2FyZXQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBGWF9CT09MIGJCZWZvcmUgPSBUUlVFOw0KKyAgICAgICAgaW50MzJfdCBuSW5kZXggPSBNb3ZlQmFja3dhcmQoYkJlZm9yZSk7DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgICAgICAgaWYgKG1fQmxvY2tBcnJheS5HZXRTaXplKCkpIHsNCisgICAgICAgICAgbkluZGV4ID0NCisgICAgICAgICAgICAgIE5vcm1hbGl6ZUNhcmV0UG9zKG5JbmRleCwgRkRFX0ZPUk1BVF9DQVJFVF9CQUNLV0FSRCwgYkJlZm9yZSk7DQorICAgICAgICAgIGlmIChuSW5kZXggPCAwKSB7DQorICAgICAgICAgICAgcmV0dXJuIG1fbkNhcmV0Ow0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorI2VuZGlmDQorICAgICAgICBpZiAobkluZGV4ID49IDApIHsNCisgICAgICAgICAgVXBkYXRlQ2FyZXRSZWN0KG5JbmRleCwgYkJlZm9yZSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIE1DX1JpZ2h0OiB7DQorICAgICAgaWYgKGJWZXJ0aWNhbCkgew0KKyAgICAgICAgQ0ZYX1BvaW50RiBwdENhcmV0Ow0KKyAgICAgICAgaWYgKE1vdmVEb3duKHB0Q2FyZXQpKSB7DQorICAgICAgICAgIFVwZGF0ZUNhcmV0SW5kZXgocHRDYXJldCk7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEZYX0JPT0wgYkJlZm9yZSA9IFRSVUU7DQorICAgICAgICBpbnQzMl90IG5JbmRleCA9IE1vdmVGb3J3YXJkKGJCZWZvcmUpOw0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCisgICAgICAgIGlmIChtX0Jsb2NrQXJyYXkuR2V0U2l6ZSgpKSB7DQorICAgICAgICAgIGlmIChuSW5kZXggPT0gLTEpIHsNCisgICAgICAgICAgICBuSW5kZXggPSBHZXRUZXh0QnVmTGVuZ3RoKCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgbkluZGV4ID0gTm9ybWFsaXplQ2FyZXRQb3MobkluZGV4LCBGREVfRk9STUFUX0NBUkVUX0ZPUldBUkQsIGJCZWZvcmUpOw0KKyAgICAgICAgfQ0KKyNlbmRpZg0KKyAgICAgICAgaWYgKG5JbmRleCA+PSAwKSB7DQorICAgICAgICAgIFVwZGF0ZUNhcmV0UmVjdChuSW5kZXgsIGJCZWZvcmUpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBNQ19VcDogew0KKyAgICAgIGlmIChiVmVydGljYWwpIHsNCisgICAgICAgIEZYX0JPT0wgYkJlZm9yZSA9IFRSVUU7DQorICAgICAgICBpbnQzMl90IG5JbmRleCA9IE1vdmVCYWNrd2FyZChiQmVmb3JlKTsNCisjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQorICAgICAgICBpZiAobV9CbG9ja0FycmF5LkdldFNpemUoKSkgew0KKyAgICAgICAgICBuSW5kZXggPQ0KKyAgICAgICAgICAgICAgTm9ybWFsaXplQ2FyZXRQb3MobkluZGV4LCBGREVfRk9STUFUX0NBUkVUX0JBQ0tXQVJELCBiQmVmb3JlKTsNCisgICAgICAgIH0NCisjZW5kaWYNCisgICAgICAgIGlmIChuSW5kZXggPj0gMCkgew0KKyAgICAgICAgICBVcGRhdGVDYXJldFJlY3QobkluZGV4LCBiQmVmb3JlKTsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX1BvaW50RiBwdENhcmV0Ow0KKyAgICAgICAgaWYgKE1vdmVVcChwdENhcmV0KSkgew0KKyAgICAgICAgICBVcGRhdGVDYXJldEluZGV4KHB0Q2FyZXQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBNQ19Eb3duOiB7DQorICAgICAgaWYgKGJWZXJ0aWNhbCkgew0KKyAgICAgICAgRlhfQk9PTCBiQmVmb3JlID0gVFJVRTsNCisgICAgICAgIGludDMyX3QgbkluZGV4ID0gTW92ZUZvcndhcmQoYkJlZm9yZSk7DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgICAgICAgaWYgKG1fQmxvY2tBcnJheS5HZXRTaXplKCkpIHsNCisgICAgICAgICAgbkluZGV4ID0gTm9ybWFsaXplQ2FyZXRQb3MobkluZGV4LCBGREVfRk9STUFUX0NBUkVUX0ZPUldBUkQsIGJCZWZvcmUpOw0KKyAgICAgICAgfQ0KKyNlbmRpZg0KKyAgICAgICAgaWYgKG5JbmRleCA+PSAwKSB7DQorICAgICAgICAgIFVwZGF0ZUNhcmV0UmVjdChuSW5kZXgsIGJCZWZvcmUpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfUG9pbnRGIHB0Q2FyZXQ7DQorICAgICAgICBpZiAoTW92ZURvd24ocHRDYXJldCkpIHsNCisgICAgICAgICAgVXBkYXRlQ2FyZXRJbmRleChwdENhcmV0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgTUNfV29yZEJhY2t3YXJkOg0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIE1DX1dvcmRGb3J3YXJkOg0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIE1DX0xpbmVTdGFydDoNCisgICAgICBNb3ZlTGluZVN0YXJ0KCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgTUNfTGluZUVuZDoNCisgICAgICBNb3ZlTGluZUVuZCgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIE1DX1BhcmFnU3RhcnQ6DQorICAgICAgTW92ZVBhcmFnU3RhcnQoKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBNQ19QYXJhZ0VuZDoNCisgICAgICBNb3ZlUGFyYWdFbmQoKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBNQ19QYWdlRG93bjoNCisgICAgICBicmVhazsNCisgICAgY2FzZSBNQ19QYWdlVXA6DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgTUNfSG9tZToNCisgICAgICBNb3ZlSG9tZSgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIE1DX0VuZDoNCisgICAgICBNb3ZlRW5kKCk7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICBpZiAoYlNoaWZ0ICYmIG1fbkFuY2hvclBvcyAhPSAtMSAmJiAobV9uQW5jaG9yUG9zICE9IG1fbkNhcmV0KSkgew0KKyAgICBBZGRTZWxSYW5nZShzdGQ6Om1pbihtX25BbmNob3JQb3MsIG1fbkNhcmV0KSwNCisgICAgICAgICAgICAgICAgRlhTWVNfYWJzKG1fbkFuY2hvclBvcyAtIG1fbkNhcmV0KSk7DQorICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fU2VsQ2hhbmdlZCh0aGlzKTsNCisgIH0NCisgIGlmIChiU2VsQ2hhbmdlKSB7DQorICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fU2VsQ2hhbmdlZCh0aGlzKTsNCisgIH0NCisgIHJldHVybiBtX25DYXJldDsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6TG9jaygpIHsNCisgIG1fYkxvY2sgPSBUUlVFOw0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpVbmxvY2soKSB7DQorICBtX2JMb2NrID0gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6OklzTG9ja2VkKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fYkxvY2s7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6Okluc2VydChpbnQzMl90IG5TdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuZ3RoKSB7DQorICBpZiAoSXNMb2NrZWQoKSkgew0KKyAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfTG9ja2VkOw0KKyAgfQ0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCisgIGludDMyX3QgbkJsb2NrQ291bnQgPSBtX0Jsb2NrQXJyYXkuR2V0U2l6ZSgpOw0KKyAgaWYgKG5CbG9ja0NvdW50KSB7DQorICAgIGlmIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfRklFTERfVEFCICYmIG5MZW5ndGggPT0gMSAmJg0KKyAgICAgICAgbHBUZXh0WzBdID09IEwnXHQnKSB7DQorICAgICAgcmV0dXJuIE1vdmUyTmV4dEVkaXRhYmxlRmllbGQoblN0YXJ0KSA/IEZERV9UWFRFRFRfTU9ESUZZX1JFVF9UX1RhYg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGREVfVFhURURUX01PRElGWV9SRVRfRl9UYWI7DQorICAgIH0NCisgICAgaW50MzJfdCBuU2VsUmFuZ2VDb3VudCA9IENvdW50U2VsUmFuZ2VzKCk7DQorICAgIGlmIChuU2VsUmFuZ2VDb3VudCA+IDApIHsNCisgICAgICBpZiAoblNlbFJhbmdlQ291bnQgPiAxKSB7DQorICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfQm91bmRhcnk7DQorICAgICAgfQ0KKyAgICAgIGludDMyX3QgblNlbFN0YXJ0Ow0KKyAgICAgIGludDMyX3QgblNlbENvdW50Ow0KKyAgICAgIG5TZWxDb3VudCA9IEdldFNlbFJhbmdlKDAsIG5TZWxTdGFydCk7DQorICAgICAgaW50MzJfdCBuU2VsRW5kID0gblNlbFN0YXJ0ICsgblNlbENvdW50Ow0KKyAgICAgIGludDMyX3QgbkJnbiA9IDA7DQorICAgICAgaW50MzJfdCBuRW5kID0gMDsNCisgICAgICBDRkRFX1R4dEVkdEZpZWxkKiBwRmllbGQgPSBOVUxMOw0KKyAgICAgIEZYX0JPT0wgYkluRmllbGQgPSBHZXRGaWVsZEJvdW5kYXJ5KG5TZWxTdGFydCwgbkJnbiwgbkVuZCwgcEZpZWxkKTsNCisgICAgICBpZiAoblNlbEVuZCA+IG5FbmQpIHsNCisgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9Cb3VuZGFyeTsNCisgICAgICB9DQorICAgICAgaWYgKGJJbkZpZWxkKSB7DQorICAgICAgICBwRmllbGQtPkJhY2t1cCgpOw0KKyAgICAgICAgRlhfQk9PTCBiQmVmb3JlID0gRkFMU0U7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RlbDsNCisgICAgICAgIGludDMyX3QgbkNhcmV0Ow0KKyAgICAgICAgaW50MzJfdCBuSW5kZXhJbkZpZWxkID0gblNlbFN0YXJ0IC0gbkJnbjsNCisgICAgICAgIGludDMyX3QgblJldCA9IHBGaWVsZC0+UmVwbGFjZShuU2VsU3RhcnQgLSBuQmduLCBuU2VsQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDKGxwVGV4dCwgbkxlbmd0aCksIHdzRGVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DYXJldCwgYkJlZm9yZSk7DQorICAgICAgICBzd2l0Y2ggKG5SZXQpIHsNCisgICAgICAgICAgY2FzZSBGREVfRk9STUFUX0ZJRUxEX0lOU0VSVF9SRVRfRl9GVUxMOg0KKyAgICAgICAgICAgIHBGaWVsZC0+UmVzdG9yZSgpOw0KKyAgICAgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9GdWxsOw0KKyAgICAgICAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9GX0lOVkFMSURBVEU6DQorICAgICAgICAgICAgcEZpZWxkLT5SZXN0b3JlKCk7DQorICAgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0ludmFsaWRhdGU7DQorICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0ZpZWxkOw0KKyAgICAgICAgcEZpZWxkLT5HZXRGaWVsZFRleHQod3NGaWVsZCk7DQorICAgICAgICBpZiAoIW1fUGFyYW0ucEV2ZW50U2luay0+T25fVmFsaWRhdGVGaWVsZCh0aGlzLCBwRmllbGQtPkdldEJsb2NrSW5kZXgoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWVsZC0+R2V0SW5kZXgoKSwgd3NGaWVsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKSB7DQorICAgICAgICAgIHBGaWVsZC0+UmVzdG9yZSgpOw0KKyAgICAgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfSW52YWxpZGF0ZTsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGlzcGxheTsNCisgICAgICAgIHBGaWVsZC0+R2V0RGlzcGxheVRleHQod3NEaXNwbGF5KTsNCisgICAgICAgIGlmICgobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX0xpbWl0QXJlYV9WZXJ0KSB8fA0KKyAgICAgICAgICAgIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTGltaXRBcmVhX0hvcnopKSB7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICAgICAgR2V0UHJlUmVwbGFjZVRleHQod3NUZXh0LCBuQmduLCBuRW5kIC0gbkJnbiArIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKih3c0Rpc3BsYXkpLCB3c0Rpc3BsYXkuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgICBpZiAoIUlzRml0QXJlYSh3c1RleHQpKSB7DQorICAgICAgICAgICAgcEZpZWxkLT5SZXN0b3JlKCk7DQorICAgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0Z1bGw7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIFJlcGxhY2UobkJnbiwgbkVuZCAtIG5CZ24gKyAxLCB3c0Rpc3BsYXkpOw0KKyAgICAgICAgaW50MzJfdCBuTmV3Q2FyZXQgPSBuQmduICsgbkNhcmV0Ow0KKyAgICAgICAgaWYgKCEobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX05vUmVkb1VuZG8pKSB7DQorICAgICAgICAgIElGREVfVHh0RWR0RG9SZWNvcmQqIHBSZWNvcmQgPSBuZXcgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2UoDQorICAgICAgICAgICAgICB0aGlzLCBtX25DYXJldCwgbk5ld0NhcmV0LCBwRmllbGQsIG5JbmRleEluRmllbGQsIG5CZ24sDQorICAgICAgICAgICAgICB3c0Rpc3BsYXkuR2V0TGVuZ3RoKCksIHdzRGVsLCBDRlhfV2lkZVN0cmluZ0MobHBUZXh0LCBuTGVuZ3RoKSwNCisgICAgICAgICAgICAgIFRSVUUpOw0KKyAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0RvUmVjb3JkOw0KKyAgICAgICAgICBwUmVjb3JkLT5TZXJpYWxpemUoYnNEb1JlY29yZCk7DQorICAgICAgICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fQWRkRG9SZWNvcmQodGhpcywgYnNEb1JlY29yZCk7DQorICAgICAgICAgIHBSZWNvcmQtPlJlbGVhc2UoKTsNCisgICAgICAgIH0NCisgICAgICAgIFNldENhcmV0UG9zKG5CZ24gKyBuQ2FyZXQsIGJCZWZvcmUpOw0KKyAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9TX05vcm1hbDsNCisgICAgICB9DQorICAgIH0NCisgICAgaW50MzJfdCBuQmduID0gMDsNCisgICAgaW50MzJfdCBuRW5kID0gMDsNCisgICAgQ0ZERV9UeHRFZHRGaWVsZCogcEZpZWxkID0gTlVMTDsNCisgICAgRlhfQk9PTCBiSW5GaWVsZCA9IEdldEZpZWxkQm91bmRhcnkobV9uQ2FyZXQsIG5CZ24sIG5FbmQsIHBGaWVsZCk7DQorICAgIGludDMyX3QgbkNhcmV0SW5GaWVsZCA9IG1fbkNhcmV0IC0gbkJnbjsNCisgICAgRlhfQk9PTCBiQmVmb3JlID0gRkFMU0U7DQorICAgIGlmIChiSW5GaWVsZCkgew0KKyAgICAgIHBGaWVsZC0+QmFja3VwKCk7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSW5zKGxwVGV4dCwgbkxlbmd0aCk7DQorICAgICAgaW50MzJfdCBuUmV0ID0NCisgICAgICAgICAgcEZpZWxkLT5JbnNlcnQobkNhcmV0SW5GaWVsZCwgd3NJbnMsIG5DYXJldEluRmllbGQsIGJCZWZvcmUpOw0KKyAgICAgIEZYX0JPT0wgYkZ1bGwgPSBGQUxTRTsNCisgICAgICBzd2l0Y2ggKG5SZXQpIHsNCisgICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX1NfTk9STUFMOg0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX1NfRlVMTDoNCisgICAgICAgICAgYkZ1bGwgPSBUUlVFOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX0ZfRlVMTDoNCisgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0Z1bGw7DQorICAgICAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9GX0lOVkFMSURBVEU6DQorICAgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9JbnZhbGlkYXRlOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX05vcm1hbDsNCisgICAgICB9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWVsZDsNCisgICAgICBwRmllbGQtPkdldEZpZWxkVGV4dCh3c0ZpZWxkKTsNCisgICAgICBpZiAoIW1fUGFyYW0ucEV2ZW50U2luay0+T25fVmFsaWRhdGVGaWVsZCgNCisgICAgICAgICAgICAgIHRoaXMsIHBGaWVsZC0+R2V0QmxvY2tJbmRleCgpLCBwRmllbGQtPkdldEluZGV4KCksIHdzRmllbGQsIDApKSB7DQorICAgICAgICBwRmllbGQtPlJlc3RvcmUoKTsNCisgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9JbnZhbGlkYXRlOw0KKyAgICAgIH0NCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0Rpc3BsYXk7DQorICAgICAgcEZpZWxkLT5HZXREaXNwbGF5VGV4dCh3c0Rpc3BsYXkpOw0KKyAgICAgIGlmICgobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX0xpbWl0QXJlYV9WZXJ0KSB8fA0KKyAgICAgICAgICAobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX0xpbWl0QXJlYV9Ib3J6KSkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICAgICAgR2V0UHJlUmVwbGFjZVRleHQod3NUZXh0LCBuQmduLCBuRW5kIC0gbkJnbiArIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiood3NEaXNwbGF5KSwgd3NEaXNwbGF5LkdldExlbmd0aCgpKTsNCisgICAgICAgIGlmICghSXNGaXRBcmVhKHdzVGV4dCkpIHsNCisgICAgICAgICAgcEZpZWxkLT5SZXN0b3JlKCk7DQorICAgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9GdWxsOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBSZXBsYWNlKG5CZ24sIG5FbmQgLSBuQmduICsgMSwgd3NEaXNwbGF5KTsNCisgICAgICBpZiAoIShtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTm9SZWRvVW5kbykpIHsNCisgICAgICAgIElGREVfVHh0RWR0RG9SZWNvcmQqIHBSZWNvcmQgPSBuZXcgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZEluc2VydCgNCisgICAgICAgICAgICB0aGlzLCBtX25DYXJldCwgcEZpZWxkLCBtX25DYXJldCAtIG5CZ24sIG5CZ24sIG5FbmQgLSBuQmduICsgMSwNCisgICAgICAgICAgICB3c0Rpc3BsYXkuR2V0TGVuZ3RoKCksIENGWF9XaWRlU3RyaW5nQyhscFRleHQsIG5MZW5ndGgpLCBGQUxTRSk7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0RvUmVjb3JkOw0KKyAgICAgICAgcFJlY29yZC0+U2VyaWFsaXplKGJzRG9SZWNvcmQpOw0KKyAgICAgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9BZGREb1JlY29yZCh0aGlzLCBic0RvUmVjb3JkKTsNCisgICAgICAgIHBSZWNvcmQtPlJlbGVhc2UoKTsNCisgICAgICB9DQorICAgICAgaW50MzJfdCBuQ2FyZXRQb3MgPSBuQmduICsgbkNhcmV0SW5GaWVsZDsNCisgICAgICBpZiAobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX0ZJRUxEX0FVVE8gJiYgYkZ1bGwgJiYNCisgICAgICAgICAgbkNhcmV0UG9zID09IG5FbmQpIHsNCisgICAgICAgIGlmIChNb3ZlMk5leHRFZGl0YWJsZUZpZWxkKG5FbmQsIFRSVUUsIEZBTFNFKSkgew0KKyAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgU2V0Q2FyZXRQb3MobkNhcmV0UG9zLCBiQmVmb3JlKTsNCisgICAgICByZXR1cm4gYkZ1bGwgPyBGREVfVFhURURUX01PRElGWV9SRVRfU19GdWxsDQorICAgICAgICAgICAgICAgICAgIDogRkRFX1RYVEVEVF9NT0RJRllfUkVUX1NfTm9ybWFsOw0KKyAgICB9DQorICAgIEZYU1lTX2Fzc2VydCgwKTsNCisgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX05vcm1hbDsNCisgIH0NCisjZW5kaWYNCisgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCisgIEZYX1dDSEFSKiBscEJ1ZmZlciA9IHdzVGVtcC5HZXRCdWZmZXIobkxlbmd0aCk7DQorICBGWFNZU19tZW1jcHkobHBCdWZmZXIsIGxwVGV4dCwgbkxlbmd0aCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgUmVwbGFjZVBhcmFnRW5kKGxwQnVmZmVyLCBuTGVuZ3RoLCBGQUxTRSk7DQorICB3c1RlbXAuUmVsZWFzZUJ1ZmZlcihuTGVuZ3RoKTsNCisgIEZYX0JPT0wgYlBhcnQgPSBGQUxTRTsNCisgIGlmIChtX25MaW1pdCA+IDApIHsNCisgICAgaW50MzJfdCBuVG90YWxMZW5ndGggPSBHZXRUZXh0QnVmTGVuZ3RoKCk7DQorICAgIGludDMyX3QgbkNvdW50ID0gbV9TZWxSYW5nZVB0ckFyci5HZXRTaXplKCk7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgICAgRkRFX0xQVFhURURUU0VMUkFOR0UgbHBTZWxSYW5nZSA9IG1fU2VsUmFuZ2VQdHJBcnIuR2V0QXQoaSk7DQorICAgICAgblRvdGFsTGVuZ3RoIC09IGxwU2VsUmFuZ2UtPm5Db3VudDsNCisgICAgfQ0KKyAgICBpbnQzMl90IG5FeHBlY3RMZW5ndGggPSBuVG90YWxMZW5ndGggKyBuTGVuZ3RoOw0KKyAgICBpZiAoblRvdGFsTGVuZ3RoID09IG1fbkxpbWl0KSB7DQorICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0Z1bGw7DQorICAgIH0NCisgICAgaWYgKG5FeHBlY3RMZW5ndGggPiBtX25MaW1pdCkgew0KKyAgICAgIG5MZW5ndGggLT0gKG5FeHBlY3RMZW5ndGggLSBtX25MaW1pdCk7DQorICAgICAgYlBhcnQgPSBUUlVFOw0KKyAgICB9DQorICB9DQorICBpZiAoKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9MaW1pdEFyZWFfVmVydCkgfHwNCisgICAgICAobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX0xpbWl0QXJlYV9Ib3J6KSkgew0KKyAgICBpbnQzMl90IG5UZW1wID0gbkxlbmd0aDsNCisgICAgaWYgKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9QYXNzd29yZCkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICB3aGlsZSAobkxlbmd0aCA+IDApIHsNCisgICAgICAgIEdldFByZUluc2VydFRleHQod3NUZXh0LCBtX25DYXJldCwgbHBCdWZmZXIsIG5MZW5ndGgpOw0KKyAgICAgICAgaW50MzJfdCBuVG90YWwgPSB3c1RleHQuR2V0TGVuZ3RoKCk7DQorICAgICAgICBGWF9XQ0hBUiogbHBCdWYgPSB3c1RleHQuR2V0QnVmZmVyKG5Ub3RhbCk7DQorICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuVG90YWw7IGkrKykgew0KKyAgICAgICAgICBscEJ1ZltpXSA9IG1fd2NBbGlhc0NoYXI7DQorICAgICAgICB9DQorICAgICAgICB3c1RleHQuUmVsZWFzZUJ1ZmZlcihuVG90YWwpOw0KKyAgICAgICAgaWYgKElzRml0QXJlYSh3c1RleHQpKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbkxlbmd0aC0tOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICAgICAgd2hpbGUgKG5MZW5ndGggPiAwKSB7DQorICAgICAgICBHZXRQcmVJbnNlcnRUZXh0KHdzVGV4dCwgbV9uQ2FyZXQsIGxwQnVmZmVyLCBuTGVuZ3RoKTsNCisgICAgICAgIGlmIChJc0ZpdEFyZWEod3NUZXh0KSkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIG5MZW5ndGgtLTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKG5MZW5ndGggPT0gMCkgew0KKyAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9GdWxsOw0KKyAgICB9DQorICAgIGlmIChuTGVuZ3RoIDwgblRlbXApIHsNCisgICAgICBiUGFydCA9IFRSVUU7DQorICAgIH0NCisgIH0NCisgIGlmIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfVmFsaWRhdGUpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICBHZXRQcmVJbnNlcnRUZXh0KHdzVGV4dCwgbV9uQ2FyZXQsIGxwQnVmZmVyLCBuTGVuZ3RoKTsNCisgICAgaWYgKCFtX1BhcmFtLnBFdmVudFNpbmstPk9uX1ZhbGlkYXRlKHRoaXMsIHdzVGV4dCkpIHsNCisgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfSW52YWxpZGF0ZTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKElzU2VsZWN0KCkpIHsNCisgICAgRGVsZXRlU2VsZWN0KCk7DQorICB9DQorICBpZiAoIShtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTm9SZWRvVW5kbykpIHsNCisgICAgSUZERV9UeHRFZHREb1JlY29yZCogcFJlY29yZCA9DQorICAgICAgICBuZXcgQ0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQodGhpcywgbV9uQ2FyZXQsIGxwQnVmZmVyLCBuTGVuZ3RoKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEb1JlY29yZDsNCisgICAgcFJlY29yZC0+U2VyaWFsaXplKGJzRG9SZWNvcmQpOw0KKyAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX0FkZERvUmVjb3JkKHRoaXMsIGJzRG9SZWNvcmQpOw0KKyAgICBwUmVjb3JkLT5SZWxlYXNlKCk7DQorICB9DQorICBHZXRUZXh0KG1fQ2hhbmdlSW5mby53c1ByZXZUZXh0LCAwKTsNCisgIElubmVyX0luc2VydChtX25DYXJldCwgbHBCdWZmZXIsIG5MZW5ndGgpOw0KKyAgbV9DaGFuZ2VJbmZvLm5DaGFuZ2VUeXBlID0gRkRFX1RYVEVEVF9URVhUQ0hBTkdFX1RZUEVfSW5zZXJ0Ow0KKyAgbV9DaGFuZ2VJbmZvLndzSW5zZXJ0ID0gQ0ZYX1dpZGVTdHJpbmcobHBCdWZmZXIsIG5MZW5ndGgpOw0KKyAgblN0YXJ0ID0gbV9uQ2FyZXQ7DQorICBuU3RhcnQgKz0gbkxlbmd0aDsNCisgIEZYX1dDSEFSIHdDaGFyID0gbV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuU3RhcnQgLSAxKTsNCisgIEZYX0JPT0wgYkJlZm9yZSA9IFRSVUU7DQorICBpZiAod0NoYXIgIT0gTCdcbicgJiYgd0NoYXIgIT0gTCdccicpIHsNCisgICAgblN0YXJ0LS07DQorICAgIGJCZWZvcmUgPSBGQUxTRTsNCisgIH0NCisgIFNldENhcmV0UG9zKG5TdGFydCwgYkJlZm9yZSk7DQorICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1RleHRDaGFuZ2VkKHRoaXMsIG1fQ2hhbmdlSW5mbyk7DQorICByZXR1cm4gYlBhcnQgPyBGREVfVFhURURUX01PRElGWV9SRVRfU19QYXJ0IDogRkRFX1RYVEVEVF9NT0RJRllfUkVUX1NfTm9ybWFsOw0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpEZWxldGUoaW50MzJfdCBuU3RhcnQsIEZYX0JPT0wgYkJhY2tzcGFjZSkgew0KKyAgaWYgKElzTG9ja2VkKCkpIHsNCisgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0xvY2tlZDsNCisgIH0NCisgIGlmIChJc1NlbGVjdCgpKSB7DQorICAgIERlbGV0ZVNlbGVjdCgpOw0KKyAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX1NfTm9ybWFsOw0KKyAgfQ0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCisgIGludDMyX3QgbkJsb2NrQ291bnQgPSBtX0Jsb2NrQXJyYXkuR2V0U2l6ZSgpOw0KKyAgaWYgKG5CbG9ja0NvdW50ID4gMCkgew0KKyAgICBpZiAoYkJhY2tzcGFjZSkgew0KKyAgICAgIG5TdGFydC0tOw0KKyAgICB9DQorICAgIGludDMyX3QgbkNvdW50ID0gMTsNCisgICAgaW50MzJfdCBuQmduID0gMDsNCisgICAgaW50MzJfdCBuRW5kID0gMDsNCisgICAgQ0ZERV9UeHRFZHRGaWVsZCogcEZpZWxkID0gTlVMTDsNCisgICAgRlhfQk9PTCBiSW5GaWVsZCA9IEdldEZpZWxkQm91bmRhcnkoblN0YXJ0LCBuQmduLCBuRW5kLCBwRmllbGQpOw0KKyAgICBpbnQzMl90IG5DYXJldEluRmllbGQgPSBuU3RhcnQgLSBuQmduOw0KKyAgICBGWF9CT09MIGJCZWZvcmUgPSBGQUxTRTsNCisgICAgaWYgKGJJbkZpZWxkICYmICFwRmllbGQtPklzRml4KCkpIHsNCisgICAgICBwRmllbGQtPkJhY2t1cCgpOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGVsOw0KKyAgICAgIGludDMyX3QgbkNhcmV0ID0gMDsNCisgICAgICBpbnQzMl90IG5SZXQgPQ0KKyAgICAgICAgICBwRmllbGQtPkRlbGV0ZShuQ2FyZXRJbkZpZWxkLCBuQ291bnQsIHdzRGVsLCBuQ2FyZXQsIGJCZWZvcmUpOw0KKyAgICAgIG5DYXJldCArPSBuQmduOw0KKyAgICAgIHN3aXRjaCAoblJldCkgew0KKyAgICAgICAgY2FzZSBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfUzoNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9GX0lOVkFMSURBVEU6DQorICAgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9JbnZhbGlkYXRlOw0KKyAgICAgICAgY2FzZSBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfRl9CT1VOREFSWToNCisgICAgICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0JvdW5kYXJ5Ow0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgRlhTWVNfYXNzZXJ0KDApOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWVsZDsNCisgICAgICBwRmllbGQtPkdldEZpZWxkVGV4dCh3c0ZpZWxkKTsNCisgICAgICBpZiAoIW1fUGFyYW0ucEV2ZW50U2luay0+T25fVmFsaWRhdGVGaWVsZCgNCisgICAgICAgICAgICAgIHRoaXMsIHBGaWVsZC0+R2V0QmxvY2tJbmRleCgpLCBwRmllbGQtPkdldEluZGV4KCksIHdzRmllbGQsIDApKSB7DQorICAgICAgICBwRmllbGQtPlJlc3RvcmUoKTsNCisgICAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9JbnZhbGlkYXRlOw0KKyAgICAgIH0NCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0Rpc3BsYXk7DQorICAgICAgcEZpZWxkLT5HZXREaXNwbGF5VGV4dCh3c0Rpc3BsYXkpOw0KKyAgICAgIFJlcGxhY2UobkJnbiwgbkVuZCAtIG5CZ24gKyAxLCB3c0Rpc3BsYXkpOw0KKyAgICAgIGlmICghKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9Ob1JlZG9VbmRvKSkgew0KKyAgICAgICAgSUZERV9UeHRFZHREb1JlY29yZCogcFJlY29yZCA9IG5ldyBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlKA0KKyAgICAgICAgICAgIHRoaXMsIG5TdGFydCwgcEZpZWxkLCBuQ2FyZXRJbkZpZWxkLCBuQmduLCBuRW5kIC0gbkJnbiArIDEsDQorICAgICAgICAgICAgd3NEaXNwbGF5LkdldExlbmd0aCgpLCB3c0RlbCwgRkFMU0UpOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEb1JlY29yZDsNCisgICAgICAgIHBSZWNvcmQtPlNlcmlhbGl6ZShic0RvUmVjb3JkKTsNCisgICAgICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fQWRkRG9SZWNvcmQodGhpcywgYnNEb1JlY29yZCk7DQorICAgICAgICBwUmVjb3JkLT5SZWxlYXNlKCk7DQorICAgICAgfQ0KKyAgICAgIFNldENhcmV0UG9zKG5TdGFydCwgYkJlZm9yZSk7DQorICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9TX05vcm1hbDsNCisgICAgfQ0KKyAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfQm91bmRhcnk7DQorICB9DQorI2VuZGlmDQorICBpbnQzMl90IG5Db3VudCA9IDE7DQorICBpZiAoYkJhY2tzcGFjZSkgew0KKyAgICBpZiAoblN0YXJ0ID09IDApIHsNCisgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfQm91bmRhcnk7DQorICAgIH0NCisgICAgaWYgKG5TdGFydCA+IDIgJiYgbV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuU3RhcnQgLSAxKSA9PSBMJ1xuJyAmJg0KKyAgICAgICAgbV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuU3RhcnQgLSAyKSA9PSBMJ1xyJykgew0KKyAgICAgIG5TdGFydC0tOw0KKyAgICAgIG5Db3VudCsrOw0KKyAgICB9DQorICAgIG5TdGFydC0tOw0KKyAgfSBlbHNlIHsNCisgICAgaWYgKG5TdGFydCA9PSBHZXRUZXh0QnVmTGVuZ3RoKCkpIHsNCisgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfRnVsbDsNCisgICAgfQ0KKyAgICBpZiAoKG5TdGFydCArIDEgPCBHZXRUZXh0QnVmTGVuZ3RoKCkpICYmDQorICAgICAgICAobV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuU3RhcnQpID09IEwnXHInKSAmJg0KKyAgICAgICAgKG1fcFR4dEJ1Zi0+R2V0Q2hhckJ5SW5kZXgoblN0YXJ0ICsgMSkgPT0gTCdcbicpKSB7DQorICAgICAgbkNvdW50Kys7DQorICAgIH0NCisgIH0NCisgIGlmIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfVmFsaWRhdGUpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICBHZXRQcmVEZWxldGVUZXh0KHdzVGV4dCwgblN0YXJ0LCBuQ291bnQpOw0KKyAgICBpZiAoIW1fUGFyYW0ucEV2ZW50U2luay0+T25fVmFsaWRhdGUodGhpcywgd3NUZXh0KSkgew0KKyAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9JbnZhbGlkYXRlOw0KKyAgICB9DQorICB9DQorICBpZiAoIShtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTm9SZWRvVW5kbykpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NSYW5nZTsNCisgICAgbV9wVHh0QnVmLT5HZXRSYW5nZSh3c1JhbmdlLCBuU3RhcnQsIG5Db3VudCk7DQorICAgIElGREVfVHh0RWR0RG9SZWNvcmQqIHBSZWNvcmQgPQ0KKyAgICAgICAgbmV3IENGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2UodGhpcywgblN0YXJ0LCBtX25DYXJldCwgd3NSYW5nZSk7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzRG9SZWNvcmQ7DQorICAgIHBSZWNvcmQtPlNlcmlhbGl6ZShic0RvUmVjb3JkKTsNCisgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9BZGREb1JlY29yZCh0aGlzLCBic0RvUmVjb3JkKTsNCisgICAgcFJlY29yZC0+UmVsZWFzZSgpOw0KKyAgfQ0KKyAgbV9DaGFuZ2VJbmZvLm5DaGFuZ2VUeXBlID0gRkRFX1RYVEVEVF9URVhUQ0hBTkdFX1RZUEVfRGVsZXRlOw0KKyAgR2V0VGV4dChtX0NoYW5nZUluZm8ud3NEZWxldGUsIG5TdGFydCwgbkNvdW50KTsNCisgIElubmVyX0RlbGV0ZVJhbmdlKG5TdGFydCwgbkNvdW50KTsNCisgIFNldENhcmV0UG9zKG5TdGFydCArICgoIWJCYWNrc3BhY2UgJiYgblN0YXJ0ID4gMCkgPyAtMSA6IDApLA0KKyAgICAgICAgICAgICAgKGJCYWNrc3BhY2UgfHwgblN0YXJ0ID09IDApKTsNCisgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fVGV4dENoYW5nZWQodGhpcywgbV9DaGFuZ2VJbmZvKTsNCisgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfU19Ob3JtYWw7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkRlbGV0ZVJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCkgew0KKyAgaWYgKElzTG9ja2VkKCkpIHsNCisgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0xvY2tlZDsNCisgIH0NCisgIGlmIChuQ291bnQgPT0gLTEpIHsNCisgICAgbkNvdW50ID0gR2V0VGV4dEJ1Zkxlbmd0aCgpOw0KKyAgfQ0KKyAgaWYgKG5Db3VudCA9PSAwKSB7DQorICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfU19Ob3JtYWw7DQorICB9DQorICBpZiAobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX1ZhbGlkYXRlKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgR2V0UHJlRGVsZXRlVGV4dCh3c1RleHQsIG5TdGFydCwgbkNvdW50KTsNCisgICAgaWYgKCFtX1BhcmFtLnBFdmVudFNpbmstPk9uX1ZhbGlkYXRlKHRoaXMsIHdzVGV4dCkpIHsNCisgICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfSW52YWxpZGF0ZTsNCisgICAgfQ0KKyAgfQ0KKyAgRGVsZXRlUmFuZ2VfRG9SZWNvcmQoblN0YXJ0LCBuQ291bnQpOw0KKyAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9UZXh0Q2hhbmdlZCh0aGlzLCBtX0NoYW5nZUluZm8pOw0KKyAgU2V0Q2FyZXRQb3MoblN0YXJ0LCBUUlVFKTsNCisgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfU19Ob3JtYWw7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OlJlcGxhY2UoaW50MzJfdCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NSZXBsYWNlKSB7DQorICBpZiAoSXNMb2NrZWQoKSkgew0KKyAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfTG9ja2VkOw0KKyAgfQ0KKyAgaWYgKG5TdGFydCA8IDAgfHwgKG5TdGFydCArIG5MZW5ndGggPiBHZXRUZXh0QnVmTGVuZ3RoKCkpKSB7DQorICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9Cb3VuZGFyeTsNCisgIH0NCisgIGlmIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfVmFsaWRhdGUpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICBHZXRQcmVSZXBsYWNlVGV4dCh3c1RleHQsIG5TdGFydCwgbkxlbmd0aCwgd3NSZXBsYWNlLmNfc3RyKCksDQorICAgICAgICAgICAgICAgICAgICAgIHdzUmVwbGFjZS5HZXRMZW5ndGgoKSk7DQorICAgIGlmICghbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9WYWxpZGF0ZSh0aGlzLCB3c1RleHQpKSB7DQorICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0ludmFsaWRhdGU7DQorICAgIH0NCisgIH0NCisgIGlmIChJc1NlbGVjdCgpKSB7DQorICAgIENsZWFyU2VsZWN0aW9uKCk7DQorICB9DQorICBtX0NoYW5nZUluZm8ubkNoYW5nZVR5cGUgPSBGREVfVFhURURUX1RFWFRDSEFOR0VfVFlQRV9SZXBsYWNlOw0KKyAgR2V0VGV4dChtX0NoYW5nZUluZm8ud3NEZWxldGUsIG5TdGFydCwgbkxlbmd0aCk7DQorICBpZiAobkxlbmd0aCA+IDApIHsNCisgICAgSW5uZXJfRGVsZXRlUmFuZ2UoblN0YXJ0LCBuTGVuZ3RoKTsNCisgIH0NCisgIGludDMyX3QgblRleHRMZW5ndGggPSB3c1JlcGxhY2UuR2V0TGVuZ3RoKCk7DQorICBpZiAoblRleHRMZW5ndGggPiAwKSB7DQorICAgIElubmVyX0luc2VydChuU3RhcnQsIHdzUmVwbGFjZS5jX3N0cigpLCBuVGV4dExlbmd0aCk7DQorICB9DQorICBtX0NoYW5nZUluZm8ud3NJbnNlcnQgPSBDRlhfV2lkZVN0cmluZyh3c1JlcGxhY2UuY19zdHIoKSwgblRleHRMZW5ndGgpOw0KKyAgblN0YXJ0ICs9IG5UZXh0TGVuZ3RoOw0KKyAgRlhfV0NIQVIgd0NoYXIgPSBtX3BUeHRCdWYtPkdldENoYXJCeUluZGV4KG5TdGFydCAtIDEpOw0KKyAgRlhfQk9PTCBiQmVmb3JlID0gVFJVRTsNCisgIGlmICh3Q2hhciAhPSBMJ1xuJyAmJiB3Q2hhciAhPSBMJ1xyJykgew0KKyAgICBuU3RhcnQtLTsNCisgICAgYkJlZm9yZSA9IEZBTFNFOw0KKyAgfQ0KKyAgU2V0Q2FyZXRQb3MoblN0YXJ0LCBiQmVmb3JlKTsNCisgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZVVubG9hZCh0aGlzLCBtX25DYXJldFBhZ2UsIDApOw0KKyAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9QYWdlTG9hZCh0aGlzLCBtX25DYXJldFBhZ2UsIDApOw0KKyAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9UZXh0Q2hhbmdlZCh0aGlzLCBtX0NoYW5nZUluZm8pOw0KKyAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9TX05vcm1hbDsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6U2V0TGltaXQoaW50MzJfdCBuTGltaXQpIHsNCisgIG1fbkxpbWl0ID0gbkxpbWl0Ow0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpTZXRBbGlhc0NoYXIoRlhfV0NIQVIgd2NBbGlhcykgew0KKyAgbV93Y0FsaWFzQ2hhciA9IHdjQWxpYXM7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlNldEZvcm1hdEJsb2NrKGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Jsb2NrRm9ybWF0KSB7DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgaWYgKG1fbkZpeExlbmd0aCA9PSAtMSkgew0KKyAgICBtX25GaXhMZW5ndGggPSBHZXRUZXh0TGVuZ3RoKCk7DQorICAgIEZYU1lTX2Fzc2VydChtX3dzRml4VGV4dC5Jc0VtcHR5KCkpOw0KKyAgICBHZXRUZXh0KG1fd3NGaXhUZXh0LCAwLCAtMSk7DQorICB9DQorICBGWF9CT09MIGJJbkJsb2NrID0gRkFMU0U7DQorICBpbnQzMl90IG5DaGFySW5kZXggPSAwOw0KKyAgaW50MzJfdCBuQmxvY2tJbmRleCA9IDA7DQorICBpbnQzMl90IG5CbG9ja1BvcyA9IC0xOw0KKyAgRlhfV0NIQVIgd2M7DQorICBDRkRFX1R4dEVkdEJ1Zkl0ZXIqIHBJdGVyID0NCisgICAgICBuZXcgQ0ZERV9UeHRFZHRCdWZJdGVyKChDRkRFX1R4dEVkdEJ1ZiopbV9wVHh0QnVmLCBGQUxTRSk7DQorICBwSXRlci0+U2V0QXQoMCk7DQorICBkbyB7DQorICAgIHdjID0gcEl0ZXItPkdldENoYXIoKTsNCisgICAgaWYgKGJJbkJsb2NrKSB7DQorICAgICAgaWYgKHdjID09IEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfRU5EKSB7DQorICAgICAgICBuQmxvY2tJbmRleCsrOw0KKyAgICAgICAgYkluQmxvY2sgPSBGQUxTRTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKHdjID09IEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfQkdOKSB7DQorICAgICAgICBiSW5CbG9jayA9IFRSVUU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChuQ2hhckluZGV4KysgPT0gbkluZGV4KSB7DQorICAgICAgICAgIG5CbG9ja1BvcyA9IHBJdGVyLT5HZXRBdCgpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0gd2hpbGUgKHBJdGVyLT5OZXh0KCkpOw0KKyAgcEl0ZXItPlJlbGVhc2UoKTsNCisgIGlmIChuQmxvY2tQb3MgPT0gLTEpIHsNCisgICAgbkJsb2NrUG9zID0gR2V0VGV4dEJ1Zkxlbmd0aCgpOw0KKyAgfQ0KKyAgQ0ZERV9UeHRFZHRCbG9jayogcEVkaXRCbG9jayA9DQorICAgICAgbmV3IENGREVfVHh0RWR0QmxvY2sodGhpcywgd3NCbG9ja0Zvcm1hdCwgbkluZGV4KTsNCisgIG1fQmxvY2tBcnJheS5JbnNlcnRBdChtX0Jsb2NrQXJyYXkuR2V0U2l6ZSgpLCBwRWRpdEJsb2NrKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzRGlzcGxheTsNCisgIHBFZGl0QmxvY2stPkdldERpc3BsYXlUZXh0KHdzRGlzcGxheSk7DQorICBtX25DYXJldCA9IG5CbG9ja1BvczsNCisgIGlmICh3c0Rpc3BsYXkuR2V0TGVuZ3RoKCkgPiAwKSB7DQorICAgIFJhd0luc2VydChuQmxvY2tQb3MsIGNvbnN0IEZYX1dDSEFSKih3c0Rpc3BsYXkpLCB3c0Rpc3BsYXkuR2V0TGVuZ3RoKCkpOw0KKyAgfQ0KKyNlbmRpZg0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpDb3VudEVkaXRCbG9ja3MoKSBjb25zdCB7DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgcmV0dXJuIG1fQmxvY2tBcnJheS5HZXRTaXplKCk7DQorI2Vsc2UNCisgIHJldHVybiAwOw0KKyNlbmRpZg0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpHZXRFZGl0QmxvY2tUZXh0KGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQmxvY2tUZXh0KSBjb25zdCB7DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgQ0ZERV9UeHRFZHRCbG9jayogcEJsb2NrID0gbV9CbG9ja0FycmF5W25JbmRleF07DQorICBwQmxvY2stPkdldEJsb2NrVGV4dCh3c0Jsb2NrVGV4dCk7DQorI2VuZGlmDQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkNvdW50RWRpdEZpZWxkcyhpbnQzMl90IG5CbG9ja0luZGV4KSBjb25zdCB7DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgQ0ZERV9UeHRFZHRCbG9jayogcEJsb2NrID0gbV9CbG9ja0FycmF5W25CbG9ja0luZGV4XTsNCisgIHJldHVybiBwQmxvY2stPkNvdW50RmllbGQoKTsNCisjZWxzZQ0KKyAgcmV0dXJuIDA7DQorI2VuZGlmDQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldEVkaXRGaWVsZFRleHQoaW50MzJfdCBuQmxvY2tJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZpZWxkSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NGaWVsZFRleHQpIGNvbnN0IHsNCisjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQorICBDRkRFX1R4dEVkdEJsb2NrKiBwQmxvY2sgPSBtX0Jsb2NrQXJyYXlbbkJsb2NrSW5kZXhdOw0KKyAgcEJsb2NrLT5HZXRGaWVsZFRleHQobkZpZWxkSW5kZXgsIHdzRmllbGRUZXh0KTsNCisjZW5kaWYNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6U3RhcnRFZGl0KCkgew0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCisjZW5kaWYNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6RW5kRWRpdCgpIHsNCisjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQorI2VuZGlmDQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlJlbW92ZVNlbFJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCkgew0KKyAgRkRFX0xQVFhURURUU0VMUkFOR0UgbHBUZW1wID0gTlVMTDsNCisgIGludDMyX3QgblJhbmdlQ291bnQgPSBtX1NlbFJhbmdlUHRyQXJyLkdldFNpemUoKTsNCisgIGludDMyX3QgaSA9IDA7DQorICBmb3IgKGkgPSAwOyBpIDwgblJhbmdlQ291bnQ7IGkrKykgew0KKyAgICBscFRlbXAgPSBtX1NlbFJhbmdlUHRyQXJyW2ldOw0KKyAgICBpZiAobHBUZW1wLT5uU3RhcnQgPT0gblN0YXJ0ICYmIGxwVGVtcC0+bkNvdW50ID09IG5Db3VudCkgew0KKyAgICAgIGRlbGV0ZSBscFRlbXA7DQorICAgICAgbV9TZWxSYW5nZVB0ckFyci5SZW1vdmVBdChpKTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgIH0NCisgIHJldHVybjsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6QWRkU2VsUmFuZ2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50KSB7DQorICBpZiAobkNvdW50ID09IC0xKSB7DQorICAgIG5Db3VudCA9IEdldFRleHRMZW5ndGgoKSAtIG5TdGFydDsNCisgIH0NCisgIGludDMyX3QgblNpemUgPSBtX1NlbFJhbmdlUHRyQXJyLkdldFNpemUoKTsNCisgIGlmIChuU2l6ZSA8PSAwKSB7DQorICAgIEZERV9MUFRYVEVEVFNFTFJBTkdFIGxwU2VsUmFuZ2UgPSBuZXcgRkRFX1RYVEVEVFNFTFJBTkdFOw0KKyAgICBscFNlbFJhbmdlLT5uU3RhcnQgPSBuU3RhcnQ7DQorICAgIGxwU2VsUmFuZ2UtPm5Db3VudCA9IG5Db3VudDsNCisgICAgbV9TZWxSYW5nZVB0ckFyci5BZGQobHBTZWxSYW5nZSk7DQorICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fU2VsQ2hhbmdlZCh0aGlzKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRkRFX0xQVFhURURUU0VMUkFOR0UgbHBUZW1wID0gTlVMTDsNCisgIGxwVGVtcCA9IG1fU2VsUmFuZ2VQdHJBcnJbblNpemUgLSAxXTsNCisgIGlmIChuU3RhcnQgPj0gbHBUZW1wLT5uU3RhcnQgKyBscFRlbXAtPm5Db3VudCkgew0KKyAgICBGREVfTFBUWFRFRFRTRUxSQU5HRSBscFNlbFJhbmdlID0gbmV3IEZERV9UWFRFRFRTRUxSQU5HRTsNCisgICAgbHBTZWxSYW5nZS0+blN0YXJ0ID0gblN0YXJ0Ow0KKyAgICBscFNlbFJhbmdlLT5uQ291bnQgPSBuQ291bnQ7DQorICAgIG1fU2VsUmFuZ2VQdHJBcnIuQWRkKGxwU2VsUmFuZ2UpOw0KKyAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1NlbENoYW5nZWQodGhpcyk7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgbkVuZCA9IG5TdGFydCArIG5Db3VudCAtIDE7DQorICBGWF9CT09MIGJCZWdpbiA9IEZBTFNFOw0KKyAgaW50MzJfdCBuUmFuZ2VCZ24gPSAwOw0KKyAgaW50MzJfdCBuUmFuZ2VDbnQgPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgblNpemU7IGkrKykgew0KKyAgICBscFRlbXAgPSBtX1NlbFJhbmdlUHRyQXJyW2ldOw0KKyAgICBpbnQzMl90IG5UZW1wQmduID0gbHBUZW1wLT5uU3RhcnQ7DQorICAgIGludDMyX3QgblRlbXBFbmQgPSBuVGVtcEJnbiArIGxwVGVtcC0+bkNvdW50IC0gMTsNCisgICAgaWYgKGJCZWdpbikgew0KKyAgICAgIGlmIChuRW5kIDwgblRlbXBCZ24pIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0gZWxzZSBpZiAoblN0YXJ0ID49IG5UZW1wQmduICYmIG5TdGFydCA8PSBuVGVtcEVuZCkgew0KKyAgICAgICAgblJhbmdlQ250Kys7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgblJhbmdlQ250Kys7DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKG5TdGFydCA8PSBuVGVtcEVuZCkgew0KKyAgICAgICAgblJhbmdlQmduID0gaTsNCisgICAgICAgIGlmIChuRW5kIDwgblRlbXBCZ24pIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBuUmFuZ2VDbnQgPSAxOw0KKyAgICAgICAgYkJlZ2luID0gVFJVRTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmIChuUmFuZ2VDbnQgPT0gMCkgew0KKyAgICBGREVfTFBUWFRFRFRTRUxSQU5HRSBscFNlbFJhbmdlID0gbmV3IEZERV9UWFRFRFRTRUxSQU5HRTsNCisgICAgbHBTZWxSYW5nZS0+blN0YXJ0ID0gblN0YXJ0Ow0KKyAgICBscFNlbFJhbmdlLT5uQ291bnQgPSBuQ291bnQ7DQorICAgIG1fU2VsUmFuZ2VQdHJBcnIuSW5zZXJ0QXQoblJhbmdlQmduLCBscFNlbFJhbmdlKTsNCisgIH0gZWxzZSB7DQorICAgIGxwVGVtcCA9IG1fU2VsUmFuZ2VQdHJBcnJbblJhbmdlQmduXTsNCisgICAgbHBUZW1wLT5uU3RhcnQgPSBuU3RhcnQ7DQorICAgIGxwVGVtcC0+bkNvdW50ID0gbkNvdW50Ow0KKyAgICBuUmFuZ2VDbnQtLTsNCisgICAgblJhbmdlQmduKys7DQorICAgIHdoaWxlIChuUmFuZ2VDbnQtLSkgew0KKyAgICAgIGRlbGV0ZSBtX1NlbFJhbmdlUHRyQXJyW25SYW5nZUJnbl07DQorICAgICAgbV9TZWxSYW5nZVB0ckFyci5SZW1vdmVBdChuUmFuZ2VCZ24pOw0KKyAgICB9DQorICB9DQorICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1NlbENoYW5nZWQodGhpcyk7DQorICByZXR1cm47DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkNvdW50U2VsUmFuZ2VzKCkgew0KKyAgcmV0dXJuIG1fU2VsUmFuZ2VQdHJBcnIuR2V0U2l6ZSgpOw0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpHZXRTZWxSYW5nZShpbnQzMl90IG5JbmRleCwgaW50MzJfdCYgblN0YXJ0KSB7DQorICBuU3RhcnQgPSBtX1NlbFJhbmdlUHRyQXJyW25JbmRleF0tPm5TdGFydDsNCisgIHJldHVybiBtX1NlbFJhbmdlUHRyQXJyW25JbmRleF0tPm5Db3VudDsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6Q2xlYXJTZWxlY3Rpb24oKSB7DQorICBpbnQzMl90IG5Db3VudCA9IG1fU2VsUmFuZ2VQdHJBcnIuR2V0U2l6ZSgpOw0KKyAgRkRFX0xQVFhURURUU0VMUkFOR0UgbHBSYW5nZSA9IE5VTEw7DQorICBpbnQzMl90IGkgPSAwOw0KKyAgZm9yIChpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgIGxwUmFuZ2UgPSBtX1NlbFJhbmdlUHRyQXJyW2ldOw0KKyAgICBpZiAobHBSYW5nZSAhPSBOVUxMKSB7DQorICAgICAgZGVsZXRlIGxwUmFuZ2U7DQorICAgICAgbHBSYW5nZSA9IE5VTEw7DQorICAgIH0NCisgIH0NCisgIG1fU2VsUmFuZ2VQdHJBcnIuUmVtb3ZlQWxsKCk7DQorICBpZiAobkNvdW50ICYmIG1fUGFyYW0ucEV2ZW50U2luaykgew0KKyAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1NlbENoYW5nZWQodGhpcyk7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6OlJlZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlZG8pIHsNCisgIGlmIChJc0xvY2tlZCgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTm9SZWRvVW5kbykgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBJRkRFX1R4dEVkdERvUmVjb3JkKiBwRG9SZWNvcmQgPSBJRkRFX1R4dEVkdERvUmVjb3JkOjpDcmVhdGUoYnNSZWRvKTsNCisgIEZYU1lTX2Fzc2VydChwRG9SZWNvcmQpOw0KKyAgaWYgKHBEb1JlY29yZCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZYX0JPT0wgYk9LID0gcERvUmVjb3JkLT5SZWRvKCk7DQorICBwRG9SZWNvcmQtPlJlbGVhc2UoKTsNCisgIHJldHVybiBiT0s7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6OlVuZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1VuZG8pIHsNCisgIGlmIChJc0xvY2tlZCgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTm9SZWRvVW5kbykgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBJRkRFX1R4dEVkdERvUmVjb3JkKiBwRG9SZWNvcmQgPSBJRkRFX1R4dEVkdERvUmVjb3JkOjpDcmVhdGUoYnNVbmRvKTsNCisgIEZYU1lTX2Fzc2VydChwRG9SZWNvcmQpOw0KKyAgaWYgKHBEb1JlY29yZCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZYX0JPT0wgYk9LID0gcERvUmVjb3JkLT5VbmRvKCk7DQorICBwRG9SZWNvcmQtPlJlbGVhc2UoKTsNCisgIHJldHVybiBiT0s7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OlN0YXJ0TGF5b3V0KCkgew0KKyAgTG9jaygpOw0KKyAgUmVtb3ZlQWxsUGFnZXMoKTsNCisgIG1fbkxheW91dFBvcyA9IDA7DQorICBtX25MaW5lQ291bnQgPSAwOw0KKyAgcmV0dXJuIDA7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkRvTGF5b3V0KElGWF9QYXVzZSogcFBhdXNlKSB7DQorICBpbnQzMl90IG5Db3VudCA9IG1fUGFyYWdQdHJBcnJheS5HZXRTaXplKCk7DQorICBDRkRFX1R4dEVkdFBhcmFnKiBwUGFyYWcgPSBOVUxMOw0KKyAgaW50MzJfdCBuTGluZUNvdW50ID0gMDsNCisgIGZvciAoOyBtX25MYXlvdXRQb3MgPCBuQ291bnQ7IG1fbkxheW91dFBvcysrKSB7DQorICAgIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVttX25MYXlvdXRQb3NdOw0KKyAgICBwUGFyYWctPkNhbGNMaW5lcygpOw0KKyAgICBuTGluZUNvdW50ICs9IHBQYXJhZy0+bV9uTGluZUNvdW50Ow0KKyAgICBpZiAoKHBQYXVzZSAhPSBOVUxMKSAmJiAobkxpbmVDb3VudCA+IG1fblBhZ2VMaW5lQ291bnQpICYmDQorICAgICAgICBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsNCisgICAgICBtX25MaW5lQ291bnQgKz0gbkxpbmVDb3VudDsNCisgICAgICByZXR1cm4gKCsrbV9uTGF5b3V0UG9zICogMTAwKSAvIG5Db3VudDsNCisgICAgfQ0KKyAgfQ0KKyAgbV9uTGluZUNvdW50ICs9IG5MaW5lQ291bnQ7DQorICByZXR1cm4gMTAwOw0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpFbmRMYXlvdXQoKSB7DQorICBVcGRhdGVQYWdlcygpOw0KKyAgaW50MzJfdCBuTGVuZ3RoID0gR2V0VGV4dExlbmd0aCgpOw0KKyAgaWYgKG1fbkNhcmV0ID4gbkxlbmd0aCkgew0KKyAgICBtX25DYXJldCA9IG5MZW5ndGg7DQorICB9DQorICBpbnQzMl90IG5JbmRleCA9IG1fbkNhcmV0Ow0KKyAgaWYgKCFtX2JCZWZvcmUpIHsNCisgICAgbkluZGV4LS07DQorICB9DQorICBtX3J0Q2FyZXQuU2V0KDAsIDAsIDEsIG1fUGFyYW0uZkZvbnRTaXplKTsNCisgIFVubG9jaygpOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0RW5naW5lOjpPcHRpbWl6ZShJRlhfUGF1c2UqIHBQYXVzZSkgew0KKyAgcmV0dXJuIG1fcFR4dEJ1Zi0+T3B0aW1pemUocFBhdXNlKTsNCit9DQorSUZERV9UeHRFZHRCdWYqIENGREVfVHh0RWR0RW5naW5lOjpHZXRUZXh0QnVmKCkgY29uc3Qgew0KKyAgcmV0dXJuIChJRkRFX1R4dEVkdEJ1ZiopbV9wVHh0QnVmOw0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpHZXRUZXh0QnVmTGVuZ3RoKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fcFR4dEJ1Zi0+R2V0VGV4dExlbmd0aCgpIC0gMTsNCit9DQorSUZYX1R4dEJyZWFrKiBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0VGV4dEJyZWFrKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fcFRleHRCcmVhazsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0TGluZUNvdW50KCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fbkxpbmVDb3VudDsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0UGFnZUxpbmVDb3VudCgpIGNvbnN0IHsNCisgIHJldHVybiBtX25QYWdlTGluZUNvdW50Ow0KK30NCitpbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpDb3VudFBhcmFncygpIGNvbnN0IHsNCisgIHJldHVybiBtX1BhcmFnUHRyQXJyYXkuR2V0U2l6ZSgpOw0KK30NCitJRkRFX1R4dEVkdFBhcmFnKiBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0UGFyYWcoaW50MzJfdCBuUGFyYWdJbmRleCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fUGFyYWdQdHJBcnJheVtuUGFyYWdJbmRleF07DQorfQ0KK0lGWF9DaGFySXRlciogQ0ZERV9UeHRFZHRFbmdpbmU6OkNyZWF0ZUNoYXJJdGVyKCkgew0KKyAgaWYgKCFtX3BUeHRCdWYpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gbmV3IENGREVfVHh0RWR0QnVmSXRlcigoQ0ZERV9UeHRFZHRCdWYqKW1fcFR4dEJ1Zik7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkxpbmUyUGFyYWcoaW50MzJfdCBuU3RhcnRQYXJhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0TGluZW9mUGFyYWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MaW5lSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuU3RhcnRMaW5lKSBjb25zdCB7DQorICBpbnQzMl90IG5MaW5lVG90YWwgPSBuU3RhcnRMaW5lb2ZQYXJhZzsNCisgIGludDMyX3QgbkNvdW50ID0gbV9QYXJhZ1B0ckFycmF5LkdldFNpemUoKTsNCisgIENGREVfVHh0RWR0UGFyYWcqIHBQYXJhZyA9IE5VTEw7DQorICBpbnQzMl90IGkgPSBuU3RhcnRQYXJhZzsNCisgIGZvciAoOyBpIDwgbkNvdW50OyBpKyspIHsNCisgICAgcFBhcmFnID0gbV9QYXJhZ1B0ckFycmF5W2ldOw0KKyAgICBuTGluZVRvdGFsICs9IHBQYXJhZy0+bV9uTGluZUNvdW50Ow0KKyAgICBpZiAobkxpbmVUb3RhbCA+IG5MaW5lSW5kZXgpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgblN0YXJ0TGluZSA9IG5MaW5lVG90YWwgLSBwUGFyYWctPm1fbkxpbmVDb3VudDsNCisgIHJldHVybiBpOw0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpHZXRQcmVEZWxldGVUZXh0KENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbkxlbmd0aCkgew0KKyAgR2V0VGV4dCh3c1RleHQsIDAsIEdldFRleHRCdWZMZW5ndGgoKSk7DQorICB3c1RleHQuRGVsZXRlKG5JbmRleCwgbkxlbmd0aCk7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldFByZUluc2VydFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbkxlbmd0aCkgew0KKyAgR2V0VGV4dCh3c1RleHQsIDAsIEdldFRleHRCdWZMZW5ndGgoKSk7DQorICBpbnQzMl90IG5TZWxJbmRleCA9IDA7DQorICBpbnQzMl90IG5TZWxMZW5ndGggPSAwOw0KKyAgaW50MzJfdCBuU2VsQ291bnQgPSBDb3VudFNlbFJhbmdlcygpOw0KKyAgd2hpbGUgKG5TZWxDb3VudC0tKSB7DQorICAgIG5TZWxMZW5ndGggPSBHZXRTZWxSYW5nZShuU2VsQ291bnQsIG5TZWxJbmRleCk7DQorICAgIHdzVGV4dC5EZWxldGUoblNlbEluZGV4LCBuU2VsTGVuZ3RoKTsNCisgICAgbkluZGV4ID0gblNlbEluZGV4Ow0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KKyAgaW50MzJfdCBuT2xkTGVuZ3RoID0gd3NUZXh0LkdldExlbmd0aCgpOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBPbGRCdWZmZXIgPSB3c1RleHQuY19zdHIoKTsNCisgIEZYX1dDSEFSKiBscEJ1ZmZlciA9IHdzVGVtcC5HZXRCdWZmZXIobk9sZExlbmd0aCArIG5MZW5ndGgpOw0KKyAgRlhTWVNfbWVtY3B5KGxwQnVmZmVyLCBwT2xkQnVmZmVyLCAobkluZGV4KSAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgRlhTWVNfbWVtY3B5KGxwQnVmZmVyICsgbkluZGV4LCBscFRleHQsIG5MZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgIEZYU1lTX21lbWNweShscEJ1ZmZlciArIG5JbmRleCArIG5MZW5ndGgsIHBPbGRCdWZmZXIgKyBuSW5kZXgsDQorICAgICAgICAgICAgICAgKG5PbGRMZW5ndGggLSBuSW5kZXgpICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICB3c1RlbXAuUmVsZWFzZUJ1ZmZlcihuT2xkTGVuZ3RoICsgbkxlbmd0aCk7DQorICB3c1RleHQgPSB3c1RlbXA7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldFByZVJlcGxhY2VUZXh0KENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuT3JpZ2luTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBscFRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuZ3RoKSB7DQorICBHZXRUZXh0KHdzVGV4dCwgMCwgR2V0VGV4dEJ1Zkxlbmd0aCgpKTsNCisgIGludDMyX3QgblNlbEluZGV4ID0gMDsNCisgIGludDMyX3QgblNlbExlbmd0aCA9IDA7DQorICBpbnQzMl90IG5TZWxDb3VudCA9IENvdW50U2VsUmFuZ2VzKCk7DQorICB3aGlsZSAoblNlbENvdW50LS0pIHsNCisgICAgblNlbExlbmd0aCA9IEdldFNlbFJhbmdlKG5TZWxDb3VudCwgblNlbEluZGV4KTsNCisgICAgd3NUZXh0LkRlbGV0ZShuU2VsSW5kZXgsIG5TZWxMZW5ndGgpOw0KKyAgfQ0KKyAgd3NUZXh0LkRlbGV0ZShuSW5kZXgsIG5PcmlnaW5MZW5ndGgpOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIGZvciAoaSA9IDA7IGkgPCBuTGVuZ3RoOyBpKyspIHsNCisgICAgd3NUZXh0Lkluc2VydChuSW5kZXgrKywgbHBUZXh0W2ldKTsNCisgIH0NCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6SW5uZXJfSW5zZXJ0KGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MZW5ndGgpIHsNCisgIEZYU1lTX2Fzc2VydChuTGVuZ3RoID4gMCk7DQorICBGREVfVFhURURUUEFSQUdQT1MgUGFyYWdQb3M7DQorICBUZXh0UG9zMlBhcmFnUG9zKG5TdGFydCwgUGFyYWdQb3MpOw0KKyAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9QYWdlVW5sb2FkKHRoaXMsIG1fbkNhcmV0UGFnZSwgMCk7DQorICBpbnQzMl90IG5QYXJhZ0NvdW50ID0gbV9QYXJhZ1B0ckFycmF5LkdldFNpemUoKTsNCisgIGludDMyX3QgaSA9IDA7DQorICBmb3IgKGkgPSBQYXJhZ1Bvcy5uUGFyYWdJbmRleCArIDE7IGkgPCBuUGFyYWdDb3VudDsgaSsrKSB7DQorICAgIG1fUGFyYWdQdHJBcnJheVtpXS0+bV9uQ2hhclN0YXJ0ICs9IG5MZW5ndGg7DQorICB9DQorICBDRkRFX1R4dEVkdFBhcmFnKiBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbUGFyYWdQb3MublBhcmFnSW5kZXhdOw0KKyAgaW50MzJfdCBuUmVzZXJ2ZUxpbmVDb3VudCA9IHBQYXJhZy0+bV9uTGluZUNvdW50Ow0KKyAgaW50MzJfdCBuUmVzZXJ2ZUNoYXJTdGFydCA9IHBQYXJhZy0+bV9uQ2hhclN0YXJ0Ow0KKyAgaW50MzJfdCBuTGVhdmVQYXJ0ID0gUGFyYWdQb3MubkNoYXJJbmRleDsNCisgIGludDMyX3QgbkN1dFBhcnQgPSBwUGFyYWctPm1fbkNoYXJDb3VudCAtIFBhcmFnUG9zLm5DaGFySW5kZXg7DQorICBpbnQzMl90IG5UZXh0U3RhcnQgPSAwOw0KKyAgRlhfV0NIQVIgd0N1ckNoYXIgPSBMJyAnOw0KKyAgY29uc3QgRlhfV0NIQVIqIGxwUG9zID0gbHBUZXh0Ow0KKyAgRlhfQk9PTCBiRmlyc3QgPSBUUlVFOw0KKyAgaW50MzJfdCBuUGFyYWdJbmRleCA9IFBhcmFnUG9zLm5QYXJhZ0luZGV4Ow0KKyAgZm9yIChpID0gMDsgaSA8IG5MZW5ndGg7IGkrKywgbHBQb3MrKykgew0KKyAgICB3Q3VyQ2hhciA9ICpscFBvczsNCisgICAgaWYgKHdDdXJDaGFyID09IG1fd0xpbmVFbmQpIHsNCisgICAgICBpZiAoYkZpcnN0KSB7DQorICAgICAgICBwUGFyYWctPm1fbkNoYXJDb3VudCA9IG5MZWF2ZVBhcnQgKyAoaSAtIG5UZXh0U3RhcnQgKyAxKTsNCisgICAgICAgIHBQYXJhZy0+bV9uTGluZUNvdW50ID0gLTE7DQorICAgICAgICBuUmVzZXJ2ZUNoYXJTdGFydCArPSBwUGFyYWctPm1fbkNoYXJDb3VudDsNCisgICAgICAgIGJGaXJzdCA9IEZBTFNFOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBwUGFyYWcgPSBuZXcgQ0ZERV9UeHRFZHRQYXJhZyh0aGlzKTsNCisgICAgICAgIHBQYXJhZy0+bV9uTGluZUNvdW50ID0gLTE7DQorICAgICAgICBwUGFyYWctPm1fbkNoYXJDb3VudCA9IGkgLSBuVGV4dFN0YXJ0ICsgMTsNCisgICAgICAgIHBQYXJhZy0+bV9uQ2hhclN0YXJ0ID0gblJlc2VydmVDaGFyU3RhcnQ7DQorICAgICAgICBtX1BhcmFnUHRyQXJyYXkuSW5zZXJ0QXQoKytuUGFyYWdJbmRleCwgcFBhcmFnKTsNCisgICAgICAgIG5SZXNlcnZlQ2hhclN0YXJ0ICs9IHBQYXJhZy0+bV9uQ2hhckNvdW50Ow0KKyAgICAgIH0NCisgICAgICBuVGV4dFN0YXJ0ID0gaSArIDE7DQorICAgIH0NCisgIH0NCisgIGlmIChiRmlyc3QpIHsNCisgICAgcFBhcmFnLT5tX25DaGFyQ291bnQgKz0gbkxlbmd0aDsNCisgICAgcFBhcmFnLT5tX25MaW5lQ291bnQgPSAtMTsNCisgICAgYkZpcnN0ID0gRkFMU0U7DQorICB9IGVsc2Ugew0KKyAgICBwUGFyYWcgPSBuZXcgQ0ZERV9UeHRFZHRQYXJhZyh0aGlzKTsNCisgICAgcFBhcmFnLT5tX25MaW5lQ291bnQgPSAtMTsNCisgICAgcFBhcmFnLT5tX25DaGFyQ291bnQgPSBuTGVuZ3RoIC0gblRleHRTdGFydCArIG5DdXRQYXJ0Ow0KKyAgICBwUGFyYWctPm1fbkNoYXJTdGFydCA9IG5SZXNlcnZlQ2hhclN0YXJ0Ow0KKyAgICBtX1BhcmFnUHRyQXJyYXkuSW5zZXJ0QXQoKytuUGFyYWdJbmRleCwgcFBhcmFnKTsNCisgIH0NCisgIG1fcFR4dEJ1Zi0+SW5zZXJ0KG5TdGFydCwgbHBUZXh0LCBuTGVuZ3RoKTsNCisgIGludDMyX3QgblRvdGFsTGluZUNvdW50ID0gMDsNCisgIGZvciAoaSA9IFBhcmFnUG9zLm5QYXJhZ0luZGV4OyBpIDw9IG5QYXJhZ0luZGV4OyBpKyspIHsNCisgICAgcFBhcmFnID0gbV9QYXJhZ1B0ckFycmF5W2ldOw0KKyAgICBwUGFyYWctPkNhbGNMaW5lcygpOw0KKyAgICBuVG90YWxMaW5lQ291bnQgKz0gcFBhcmFnLT5tX25MaW5lQ291bnQ7DQorICB9DQorICBtX25MaW5lQ291bnQgKz0gblRvdGFsTGluZUNvdW50IC0gblJlc2VydmVMaW5lQ291bnQ7DQorICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VMb2FkKHRoaXMsIG1fbkNhcmV0UGFnZSwgMCk7DQorICBVcGRhdGVQYWdlcygpOw0KK30NCisjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6UmF3SW5zZXJ0KGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MZW5ndGgpIHsNCisgIEZYU1lTX2Fzc2VydChuTGVuZ3RoID4gMCk7DQorICBGREVfVFhURURUUEFSQUdQT1MgUGFyYWdQb3M7DQorICBUZXh0UG9zMlBhcmFnUG9zKG5TdGFydCwgUGFyYWdQb3MpOw0KKyAgaW50MzJfdCBuUGFyYWdDb3VudCA9IG1fUGFyYWdQdHJBcnJheS5HZXRTaXplKCk7DQorICBpbnQzMl90IGkgPSAwOw0KKyAgZm9yIChpID0gUGFyYWdQb3MublBhcmFnSW5kZXggKyAxOyBpIDwgblBhcmFnQ291bnQ7IGkrKykgew0KKyAgICBtX1BhcmFnUHRyQXJyYXlbaV0tPm1fbkNoYXJTdGFydCArPSBuTGVuZ3RoOw0KKyAgfQ0KKyAgQ0ZERV9UeHRFZHRQYXJhZyogcFBhcmFnID0gbV9QYXJhZ1B0ckFycmF5W1BhcmFnUG9zLm5QYXJhZ0luZGV4XTsNCisgIGludDMyX3QgblJlc2VydmVMaW5lQ291bnQgPSBwUGFyYWctPm1fbkxpbmVDb3VudDsNCisgIGludDMyX3QgblJlc2VydmVDaGFyU3RhcnQgPSBwUGFyYWctPm1fbkNoYXJTdGFydDsNCisgIGludDMyX3QgbkxlYXZlUGFydCA9IFBhcmFnUG9zLm5DaGFySW5kZXg7DQorICBpbnQzMl90IG5DdXRQYXJ0ID0gcFBhcmFnLT5tX25DaGFyQ291bnQgLSBQYXJhZ1Bvcy5uQ2hhckluZGV4Ow0KKyAgaW50MzJfdCBuVGV4dFN0YXJ0ID0gMDsNCisgIEZYX1dDSEFSIHdDdXJDaGFyID0gTCcgJzsNCisgIGNvbnN0IEZYX1dDSEFSKiBscFBvcyA9IGxwVGV4dDsNCisgIEZYX0JPT0wgYkZpcnN0ID0gVFJVRTsNCisgIGludDMyX3QgblBhcmFnSW5kZXggPSBQYXJhZ1Bvcy5uUGFyYWdJbmRleDsNCisgIGZvciAoaSA9IDA7IGkgPCBuTGVuZ3RoOyBpKyssIGxwUG9zKyspIHsNCisgICAgd0N1ckNoYXIgPSAqbHBQb3M7DQorICAgIGlmICh3Q3VyQ2hhciA9PSBtX3dMaW5lRW5kKSB7DQorICAgICAgaWYgKGJGaXJzdCkgew0KKyAgICAgICAgcFBhcmFnLT5tX25DaGFyQ291bnQgPSBuTGVhdmVQYXJ0ICsgKGkgLSBuVGV4dFN0YXJ0ICsgMSk7DQorICAgICAgICBwUGFyYWctPm1fbkxpbmVDb3VudCA9IC0xOw0KKyAgICAgICAgblJlc2VydmVDaGFyU3RhcnQgKz0gcFBhcmFnLT5tX25DaGFyQ291bnQ7DQorICAgICAgICBiRmlyc3QgPSBGQUxTRTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcFBhcmFnID0gbmV3IENGREVfVHh0RWR0UGFyYWcodGhpcyk7DQorICAgICAgICBwUGFyYWctPm1fbkxpbmVDb3VudCA9IC0xOw0KKyAgICAgICAgcFBhcmFnLT5tX25DaGFyQ291bnQgPSBpIC0gblRleHRTdGFydCArIDE7DQorICAgICAgICBwUGFyYWctPm1fbkNoYXJTdGFydCA9IG5SZXNlcnZlQ2hhclN0YXJ0Ow0KKyAgICAgICAgbV9QYXJhZ1B0ckFycmF5Lkluc2VydEF0KCsrblBhcmFnSW5kZXgsIHBQYXJhZyk7DQorICAgICAgICBuUmVzZXJ2ZUNoYXJTdGFydCArPSBwUGFyYWctPm1fbkNoYXJDb3VudDsNCisgICAgICB9DQorICAgICAgblRleHRTdGFydCA9IGkgKyAxOw0KKyAgICB9DQorICB9DQorICBpZiAoYkZpcnN0KSB7DQorICAgIHBQYXJhZy0+bV9uQ2hhckNvdW50ICs9IG5MZW5ndGg7DQorICAgIHBQYXJhZy0+bV9uTGluZUNvdW50ID0gLTE7DQorICAgIGJGaXJzdCA9IEZBTFNFOw0KKyAgfSBlbHNlIHsNCisgICAgcFBhcmFnID0gbmV3IENGREVfVHh0RWR0UGFyYWcodGhpcyk7DQorICAgIHBQYXJhZy0+bV9uTGluZUNvdW50ID0gLTE7DQorICAgIHBQYXJhZy0+bV9uQ2hhckNvdW50ID0gbkxlbmd0aCAtIG5UZXh0U3RhcnQgKyBuQ3V0UGFydDsNCisgICAgcFBhcmFnLT5tX25DaGFyU3RhcnQgPSBuUmVzZXJ2ZUNoYXJTdGFydDsNCisgICAgbV9QYXJhZ1B0ckFycmF5Lkluc2VydEF0KCsrblBhcmFnSW5kZXgsIHBQYXJhZyk7DQorICB9DQorICBtX3BUeHRCdWYtPkluc2VydChuU3RhcnQsIGxwVGV4dCwgbkxlbmd0aCk7DQorfQ0KKyNlbmRpZg0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OklubmVyX0RlbGV0ZVJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCkgew0KKyAgaWYgKG5Db3VudCA9PSAtMSkgew0KKyAgICBuQ291bnQgPSBtX3BUeHRCdWYtPkdldFRleHRMZW5ndGgoKSAtIG5TdGFydDsNCisgIH0NCisgIGludDMyX3QgbkVuZCA9IG5TdGFydCArIG5Db3VudCAtIDE7DQorICBGWFNZU19hc3NlcnQoblN0YXJ0ID49IDAgJiYgbkVuZCA8IG1fcFR4dEJ1Zi0+R2V0VGV4dExlbmd0aCgpKTsNCisgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZVVubG9hZCh0aGlzLCBtX25DYXJldFBhZ2UsIDApOw0KKyAgRkRFX1RYVEVEVFBBUkFHUE9TIFBhcmFnUG9zQmduLCBQYXJhZ1Bvc0VuZDsNCisgIFRleHRQb3MyUGFyYWdQb3MoblN0YXJ0LCBQYXJhZ1Bvc0Jnbik7DQorICBUZXh0UG9zMlBhcmFnUG9zKG5FbmQsIFBhcmFnUG9zRW5kKTsNCisgIENGREVfVHh0RWR0UGFyYWcqIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtQYXJhZ1Bvc0VuZC5uUGFyYWdJbmRleF07DQorICBGWF9CT09MIGJMYXN0UGFyYWcgPSBGQUxTRTsNCisgIGlmIChQYXJhZ1Bvc0VuZC5uQ2hhckluZGV4ID09IHBQYXJhZy0+bV9uQ2hhckNvdW50IC0gMSkgew0KKyAgICBpZiAoUGFyYWdQb3NFbmQublBhcmFnSW5kZXggPCBtX1BhcmFnUHRyQXJyYXkuR2V0U2l6ZSgpIC0gMSkgew0KKyAgICAgIFBhcmFnUG9zRW5kLm5QYXJhZ0luZGV4Kys7DQorICAgIH0gZWxzZSB7DQorICAgICAgYkxhc3RQYXJhZyA9IFRSVUU7DQorICAgIH0NCisgIH0NCisgIGludDMyX3QgblRvdGFsTGluZUNvdW50ID0gMDsNCisgIGludDMyX3QgblRvdGFsQ2hhckNvdW50ID0gMDsNCisgIGludDMyX3QgaSA9IDA7DQorICBmb3IgKGkgPSBQYXJhZ1Bvc0Jnbi5uUGFyYWdJbmRleDsgaSA8PSBQYXJhZ1Bvc0VuZC5uUGFyYWdJbmRleDsgaSsrKSB7DQorICAgIENGREVfVHh0RWR0UGFyYWcqIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtpXTsNCisgICAgcFBhcmFnLT5DYWxjTGluZXMoKTsNCisgICAgblRvdGFsTGluZUNvdW50ICs9IHBQYXJhZy0+bV9uTGluZUNvdW50Ow0KKyAgICBuVG90YWxDaGFyQ291bnQgKz0gcFBhcmFnLT5tX25DaGFyQ291bnQ7DQorICB9DQorICBtX3BUeHRCdWYtPkRlbGV0ZShuU3RhcnQsIG5Db3VudCk7DQorICBpbnQzMl90IG5OZXh0UGFyYWdJbmRleCA9IChQYXJhZ1Bvc0Jnbi5uQ2hhckluZGV4ID09IDAgJiYgYkxhc3RQYXJhZykNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUGFyYWdQb3NCZ24ublBhcmFnSW5kZXgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKFBhcmFnUG9zQmduLm5QYXJhZ0luZGV4ICsgMSk7DQorICBmb3IgKGkgPSBuTmV4dFBhcmFnSW5kZXg7IGkgPD0gUGFyYWdQb3NFbmQublBhcmFnSW5kZXg7IGkrKykgew0KKyAgICBDRkRFX1R4dEVkdFBhcmFnKiBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbbk5leHRQYXJhZ0luZGV4XTsNCisgICAgZGVsZXRlIHBQYXJhZzsNCisgICAgbV9QYXJhZ1B0ckFycmF5LlJlbW92ZUF0KG5OZXh0UGFyYWdJbmRleCk7DQorICB9DQorICBpZiAoIShiTGFzdFBhcmFnICYmIFBhcmFnUG9zQmduLm5DaGFySW5kZXggPT0gMCkpIHsNCisgICAgcFBhcmFnID0gbV9QYXJhZ1B0ckFycmF5W1BhcmFnUG9zQmduLm5QYXJhZ0luZGV4XTsNCisgICAgcFBhcmFnLT5tX25DaGFyQ291bnQgPSBuVG90YWxDaGFyQ291bnQgLSBuQ291bnQ7DQorICAgIHBQYXJhZy0+Q2FsY0xpbmVzKCk7DQorICAgIG5Ub3RhbExpbmVDb3VudCAtPSBwUGFyYWctPm1fbkxpbmVDb3VudDsNCisgIH0NCisgIGludDMyX3QgblBhcmFnQ291bnQgPSBtX1BhcmFnUHRyQXJyYXkuR2V0U2l6ZSgpOw0KKyAgZm9yIChpID0gbk5leHRQYXJhZ0luZGV4OyBpIDwgblBhcmFnQ291bnQ7IGkrKykgew0KKyAgICBtX1BhcmFnUHRyQXJyYXlbaV0tPm1fbkNoYXJTdGFydCAtPSBuQ291bnQ7DQorICB9DQorICBtX25MaW5lQ291bnQgLT0gblRvdGFsTGluZUNvdW50Ow0KKyAgVXBkYXRlUGFnZXMoKTsNCisgIGludDMyX3QgblBhZ2VDb3VudCA9IENvdW50UGFnZXMoKTsNCisgIGlmIChtX25DYXJldFBhZ2UgPj0gblBhZ2VDb3VudCkgew0KKyAgICBtX25DYXJldFBhZ2UgPSBuUGFnZUNvdW50IC0gMTsNCisgIH0NCisgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZUxvYWQodGhpcywgbV9uQ2FyZXRQYWdlLCAwKTsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6RGVsZXRlUmFuZ2VfRG9SZWNvcmQoaW50MzJfdCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2VsKSB7DQorICBGWFNZU19hc3NlcnQoblN0YXJ0ID49IDApOw0KKyAgaWYgKG5Db3VudCA9PSAtMSkgew0KKyAgICBuQ291bnQgPSBHZXRUZXh0TGVuZ3RoKCkgLSBuU3RhcnQ7DQorICB9DQorICBGWFNZU19hc3NlcnQoKG5TdGFydCArIG5Db3VudCkgPD0gbV9wVHh0QnVmLT5HZXRUZXh0TGVuZ3RoKCkpOw0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCisgIGludDMyX3QgbkJsb2NrQ291bnQgPSBtX0Jsb2NrQXJyYXkuR2V0U2l6ZSgpOw0KKyAgaWYgKG5CbG9ja0NvdW50ID4gMCkgew0KKyAgfQ0KKyNlbmRpZg0KKyAgaWYgKCEobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX05vUmVkb1VuZG8pKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzUmFuZ2U7DQorICAgIG1fcFR4dEJ1Zi0+R2V0UmFuZ2Uod3NSYW5nZSwgblN0YXJ0LCBuQ291bnQpOw0KKyAgICBJRkRFX1R4dEVkdERvUmVjb3JkKiBwUmVjb3JkID0gbmV3IENGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2UoDQorICAgICAgICB0aGlzLCBuU3RhcnQsIG1fbkNhcmV0LCB3c1JhbmdlLCBiU2VsKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEb1JlY29yZDsNCisgICAgcFJlY29yZC0+U2VyaWFsaXplKGJzRG9SZWNvcmQpOw0KKyAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX0FkZERvUmVjb3JkKHRoaXMsIGJzRG9SZWNvcmQpOw0KKyAgICBwUmVjb3JkLT5SZWxlYXNlKCk7DQorICB9DQorICBtX0NoYW5nZUluZm8ubkNoYW5nZVR5cGUgPSBGREVfVFhURURUX1RFWFRDSEFOR0VfVFlQRV9EZWxldGU7DQorICBHZXRUZXh0KG1fQ2hhbmdlSW5mby53c0RlbGV0ZSwgblN0YXJ0LCBuQ291bnQpOw0KKyAgSW5uZXJfRGVsZXRlUmFuZ2UoblN0YXJ0LCBuQ291bnQpOw0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpSZXNldEVuZ2luZSgpIHsNCisgIFJlbW92ZUFsbFBhZ2VzKCk7DQorICBSZW1vdmVBbGxQYXJhZ3MoKTsNCisgIENsZWFyU2VsZWN0aW9uKCk7DQorICBtX25DYXJldCA9IDA7DQorICBtX3BUeHRCdWYtPkNsZWFyKEZBTFNFKTsNCisgIG1fbkNhcmV0ID0gMDsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6UmVidWlsZFBhcmFncmFwaHMoKSB7DQorICBSZW1vdmVBbGxQYXJhZ3MoKTsNCisgIEZYX1dDSEFSIHdDaGFyID0gTCcgJzsNCisgIGludDMyX3QgblBhcmFnU3RhcnQgPSAwOw0KKyAgaW50MzJfdCBuSW5kZXggPSAwOw0KKyAgSUZYX0NoYXJJdGVyKiBwSXRlciA9IG5ldyBDRkRFX1R4dEVkdEJ1Zkl0ZXIoKENGREVfVHh0RWR0QnVmKiltX3BUeHRCdWYpOw0KKyAgcEl0ZXItPlNldEF0KDApOw0KKyAgZG8gew0KKyAgICB3Q2hhciA9IHBJdGVyLT5HZXRDaGFyKCk7DQorICAgIG5JbmRleCA9IHBJdGVyLT5HZXRBdCgpOw0KKyAgICBpZiAod0NoYXIgPT0gbV93TGluZUVuZCkgew0KKyAgICAgIENGREVfVHh0RWR0UGFyYWcqIHBQYXJhZyA9IG5ldyBDRkRFX1R4dEVkdFBhcmFnKHRoaXMpOw0KKyAgICAgIHBQYXJhZy0+bV9uQ2hhclN0YXJ0ID0gblBhcmFnU3RhcnQ7DQorICAgICAgcFBhcmFnLT5tX25DaGFyQ291bnQgPSBuSW5kZXggLSBuUGFyYWdTdGFydCArIDE7DQorICAgICAgcFBhcmFnLT5tX25MaW5lQ291bnQgPSAtMTsNCisgICAgICBtX1BhcmFnUHRyQXJyYXkuQWRkKHBQYXJhZyk7DQorICAgICAgblBhcmFnU3RhcnQgPSBuSW5kZXggKyAxOw0KKyAgICB9DQorICB9IHdoaWxlIChwSXRlci0+TmV4dCgpKTsNCisgIHBJdGVyLT5SZWxlYXNlKCk7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlJlbW92ZUFsbFBhcmFncygpIHsNCisgIGludDMyX3QgbkNvdW50ID0gbV9QYXJhZ1B0ckFycmF5LkdldFNpemUoKTsNCisgIGludDMyX3QgaSA9IDA7DQorICBmb3IgKGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsNCisgICAgQ0ZERV9UeHRFZHRQYXJhZyogcFBhcmFnID0gbV9QYXJhZ1B0ckFycmF5W2ldOw0KKyAgICBpZiAocFBhcmFnKSB7DQorICAgICAgZGVsZXRlIHBQYXJhZzsNCisgICAgfQ0KKyAgfQ0KKyAgbV9QYXJhZ1B0ckFycmF5LlJlbW92ZUFsbCgpOw0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpSZW1vdmVBbGxQYWdlcygpIHsNCisgIGludDMyX3QgbkNvdW50ID0gbV9QYWdlUHRyQXJyYXkuR2V0U2l6ZSgpOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIGZvciAoaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICBJRkRFX1R4dEVkdFBhZ2UqIHBQYWdlID0gbV9QYWdlUHRyQXJyYXlbaV07DQorICAgIGlmIChwUGFnZSkgew0KKyAgICAgIHBQYWdlLT5SZWxlYXNlKCk7DQorICAgIH0NCisgIH0NCisgIG1fUGFnZVB0ckFycmF5LlJlbW92ZUFsbCgpOw0KK30NCit2b2lkIENGREVfVHh0RWR0RW5naW5lOjpVcGRhdGVQYXJhZ3MoKSB7DQorICBpbnQzMl90IG5Db3VudCA9IG1fUGFyYWdQdHJBcnJheS5HZXRTaXplKCk7DQorICBpZiAobkNvdW50ID09IDApIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZERV9UeHRFZHRQYXJhZyogcFBhcmFnID0gTlVMTDsNCisgIGludDMyX3QgbkxpbmVDb3VudCA9IDA7DQorICBpbnQzMl90IGkgPSAwOw0KKyAgZm9yIChpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtpXTsNCisgICAgaWYgKHBQYXJhZy0+bV9uTGluZUNvdW50ID09IC0xKSB7DQorICAgICAgcFBhcmFnLT5DYWxjTGluZXMoKTsNCisgICAgfQ0KKyAgICBuTGluZUNvdW50ICs9IHBQYXJhZy0+bV9uTGluZUNvdW50Ow0KKyAgfQ0KKyAgbV9uTGluZUNvdW50ID0gbkxpbmVDb3VudDsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6VXBkYXRlUGFnZXMoKSB7DQorICBpZiAobV9uTGluZUNvdW50ID09IDApIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBuUGFnZUNvdW50ID0gKG1fbkxpbmVDb3VudCAtIDEpIC8gKG1fblBhZ2VMaW5lQ291bnQpICsgMTsNCisgIGludDMyX3QgblNpemUgPSBtX1BhZ2VQdHJBcnJheS5HZXRTaXplKCk7DQorICBpZiAoblNpemUgPT0gblBhZ2VDb3VudCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoblNpemUgPiBuUGFnZUNvdW50KSB7DQorICAgIElGREVfVHh0RWR0UGFnZSogcFBhZ2UgPSBOVUxMOw0KKyAgICBpbnQzMl90IGkgPSAwOw0KKyAgICBmb3IgKGkgPSBuU2l6ZSAtIDE7IGkgPj0gblBhZ2VDb3VudDsgaS0tKSB7DQorICAgICAgcFBhZ2UgPSBtX1BhZ2VQdHJBcnJheVtpXTsNCisgICAgICBpZiAocFBhZ2UpIHsNCisgICAgICAgIHBQYWdlLT5SZWxlYXNlKCk7DQorICAgICAgfQ0KKyAgICAgIG1fUGFnZVB0ckFycmF5LlJlbW92ZUF0KGkpOw0KKyAgICB9DQorICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZUNvdW50Q2hhbmdlZCh0aGlzKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG5TaXplIDwgblBhZ2VDb3VudCkgew0KKyAgICBJRkRFX1R4dEVkdFBhZ2UqIHBQYWdlID0gTlVMTDsNCisgICAgaW50MzJfdCBpID0gMDsNCisgICAgZm9yIChpID0gblNpemU7IGkgPCBuUGFnZUNvdW50OyBpKyspIHsNCisgICAgICBwUGFnZSA9IElGREVfVHh0RWR0UGFnZTo6Q3JlYXRlKHRoaXMsIGkpOw0KKyAgICAgIG1fUGFnZVB0ckFycmF5LkFkZChwUGFnZSk7DQorICAgIH0NCisgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9QYWdlQ291bnRDaGFuZ2VkKHRoaXMpOw0KKyAgICByZXR1cm47DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlVwZGF0ZVR4dEJyZWFrKCkgew0KKyAgRlhfRFdPUkQgZHdTdHlsZSA9IG1fcFRleHRCcmVhay0+R2V0TGF5b3V0U3R5bGVzKCk7DQorICBpZiAobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX011bHRpTGluZXMpIHsNCisgICAgZHdTdHlsZSAmPSB+RlhfVFhUTEFZT1VUU1RZTEVfU2luZ2xlTGluZTsNCisgIH0gZWxzZSB7DQorICAgIGR3U3R5bGUgfD0gRlhfVFhUTEFZT1VUU1RZTEVfU2luZ2xlTGluZTsNCisgIH0NCisgIGlmIChtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0RvY1ZlcnRpY2FsKSB7DQorICAgIGR3U3R5bGUgfD0gRlhfVFhUTEFZT1VUU1RZTEVfVmVydGljYWxMYXlvdXQ7DQorICB9IGVsc2Ugew0KKyAgICBkd1N0eWxlICY9IH5GWF9UWFRMQVlPVVRTVFlMRV9WZXJ0aWNhbExheW91dDsNCisgIH0NCisgIGlmIChtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0xpbmVSZXNlcnZlKSB7DQorICAgIGR3U3R5bGUgfD0gRlhfVFhUTEFZT1VUU1RZTEVfUmV2ZXJzZUxpbmU7DQorICB9IGVsc2Ugew0KKyAgICBkd1N0eWxlICY9IH5GWF9UWFRMQVlPVVRTVFlMRV9SZXZlcnNlTGluZTsNCisgIH0NCisgIGlmIChtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX1JUTCkgew0KKyAgICBkd1N0eWxlIHw9IEZYX1RYVExBWU9VVFNUWUxFX1JUTFJlYWRpbmdPcmRlcjsNCisgIH0gZWxzZSB7DQorICAgIGR3U3R5bGUgJj0gfkZYX1RYVExBWU9VVFNUWUxFX1JUTFJlYWRpbmdPcmRlcjsNCisgIH0NCisgIGlmIChtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0NvbWJUZXh0KSB7DQorICAgIGR3U3R5bGUgfD0gRlhfVFhUTEFZT1VUU1RZTEVfQ29tYlRleHQ7DQorICB9IGVsc2Ugew0KKyAgICBkd1N0eWxlICY9IH5GWF9UWFRMQVlPVVRTVFlMRV9Db21iVGV4dDsNCisgIH0NCisgIGlmIChtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0NoYXJWZXJ0aWFsKSB7DQorICAgIGR3U3R5bGUgfD0gRlhfVFhUTEFZT1VUU1RZTEVfVmVydGljYWxDaGFyczsNCisgIH0gZWxzZSB7DQorICAgIGR3U3R5bGUgJj0gfkZYX1RYVExBWU9VVFNUWUxFX1ZlcnRpY2FsQ2hhcnM7DQorICB9DQorICBpZiAobV9QYXJhbS5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9FeHBhbmRUYWIpIHsNCisgICAgZHdTdHlsZSB8PSBGWF9UWFRMQVlPVVRTVFlMRV9FeHBhbmRUYWI7DQorICB9IGVsc2Ugew0KKyAgICBkd1N0eWxlICY9IH5GWF9UWFRMQVlPVVRTVFlMRV9FeHBhbmRUYWI7DQorICB9DQorICBpZiAobV9QYXJhbS5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9BcmFiaWNDb250ZXh0KSB7DQorICAgIGR3U3R5bGUgfD0gRlhfVFhUTEFZT1VUU1RZTEVfQXJhYmljQ29udGV4dDsNCisgIH0gZWxzZSB7DQorICAgIGR3U3R5bGUgJj0gfkZYX1RYVExBWU9VVFNUWUxFX0FyYWJpY0NvbnRleHQ7DQorICB9DQorICBpZiAobV9QYXJhbS5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9BcmFiaWNTaGFwZXMpIHsNCisgICAgZHdTdHlsZSB8PSBGWF9UWFRMQVlPVVRTVFlMRV9BcmFiaWNTaGFwZXM7DQorICB9IGVsc2Ugew0KKyAgICBkd1N0eWxlICY9IH5GWF9UWFRMQVlPVVRTVFlMRV9BcmFiaWNTaGFwZXM7DQorICB9DQorICBtX3BUZXh0QnJlYWstPlNldExheW91dFN0eWxlcyhkd1N0eWxlKTsNCisgIEZYX0RXT1JEIGR3QWxpZ21lbnQgPSAwOw0KKyAgaWYgKG1fUGFyYW0uZHdBbGlnbm1lbnQgJiBGREVfVEVYVEVESVRBTElHTl9KdXN0aWZpZWQpIHsNCisgICAgZHdBbGlnbWVudCB8PSBGWF9UWFRMSU5FQUxJR05NRU5UX0p1c3RpZmllZDsNCisgIH0gZWxzZSBpZiAobV9QYXJhbS5kd0FsaWdubWVudCAmIEZERV9URVhURURJVEFMSUdOX0Rpc3RyaWJ1dGVkKSB7DQorICAgIGR3QWxpZ21lbnQgfD0gRlhfVFhUTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZDsNCisgIH0NCisgIGlmIChtX1BhcmFtLmR3QWxpZ25tZW50ICYgRkRFX1RFWFRFRElUQUxJR05fQ2VudGVyKSB7DQorICAgIGR3QWxpZ21lbnQgfD0gRlhfVFhUTElORUFMSUdOTUVOVF9DZW50ZXI7DQorICB9IGVsc2UgaWYgKG1fUGFyYW0uZHdBbGlnbm1lbnQgJiBGREVfVEVYVEVESVRBTElHTl9SaWdodCkgew0KKyAgICBkd0FsaWdtZW50IHw9IEZYX1RYVExJTkVBTElHTk1FTlRfUmlnaHQ7DQorICB9DQorICBtX3BUZXh0QnJlYWstPlNldEFsaWdubWVudChkd0FsaWdtZW50KTsNCisgIGlmIChtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0RvY1ZlcnRpY2FsKSB7DQorICAgIGlmIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfQXV0b0xpbmVXcmFwKSB7DQorICAgICAgbV9wVGV4dEJyZWFrLT5TZXRMaW5lV2lkdGgobV9QYXJhbS5mUGxhdGVIZWlnaHQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG1fcFRleHRCcmVhay0+U2V0TGluZVdpZHRoKEZERV9QQUdFV0lEVEhfTUFYKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgaWYgKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9BdXRvTGluZVdyYXApIHsNCisgICAgICBtX3BUZXh0QnJlYWstPlNldExpbmVXaWR0aChtX1BhcmFtLmZQbGF0ZVdpZHRoKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBtX3BUZXh0QnJlYWstPlNldExpbmVXaWR0aChGREVfUEFHRVdJRFRIX01BWCk7DQorICAgIH0NCisgIH0NCisgIG1fblBhZ2VMaW5lQ291bnQgPSBtX1BhcmFtLm5MaW5lQ291bnQ7DQorICBpZiAobV9QYXJhbS5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9Db21iVGV4dCkgew0KKyAgICBGWF9GTE9BVCBmQ29tYldpZHRoID0NCisgICAgICAgIG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfRG9jVmVydGljYWwNCisgICAgICAgICAgICA/IG1fUGFyYW0uZlBsYXRlSGVpZ2h0DQorICAgICAgICAgICAgOiBtX1BhcmFtLmZQbGF0ZVdpZHRoOw0KKyAgICBpZiAobV9uTGltaXQgPiAwKSB7DQorICAgICAgZkNvbWJXaWR0aCAvPSBtX25MaW1pdDsNCisgICAgfQ0KKyAgICBtX3BUZXh0QnJlYWstPlNldENvbWJXaWR0aChmQ29tYldpZHRoKTsNCisgIH0NCisgIG1fcFRleHRCcmVhay0+U2V0Rm9udChtX1BhcmFtLnBGb250KTsNCisgIG1fcFRleHRCcmVhay0+U2V0Rm9udFNpemUobV9QYXJhbS5mRm9udFNpemUpOw0KKyAgbV9wVGV4dEJyZWFrLT5TZXRUYWJXaWR0aChtX1BhcmFtLmZUYWJXaWR0aCwgbV9QYXJhbS5iVGFiRXF1aWRpc3RhbnQpOw0KKyAgbV9wVGV4dEJyZWFrLT5TZXREZWZhdWx0Q2hhcihtX1BhcmFtLndEZWZDaGFyKTsNCisgIG1fcFRleHRCcmVhay0+U2V0UGFyYWdyYXBoQnJlYWtDaGFyKG1fUGFyYW0ud0xpbmVCcmVha0NoYXIpOw0KKyAgbV9wVGV4dEJyZWFrLT5TZXRDaGFyUm90YXRpb24obV9QYXJhbS5uQ2hhclJvdGF0aW9uKTsNCisgIG1fcFRleHRCcmVhay0+U2V0TGluZUJyZWFrVG9sZXJhbmNlKG1fUGFyYW0uZkZvbnRTaXplICogMC4yZik7DQorICBtX3BUZXh0QnJlYWstPlNldEhvcml6b250YWxTY2FsZShtX1BhcmFtLm5Ib3J6U2NhbGUpOw0KKyAgbV9wVGV4dEJyZWFrLT5TZXRDaGFyU3BhY2UobV9QYXJhbS5mQ2hhclNwYWNlKTsNCit9DQorRlhfQk9PTCBDRkRFX1R4dEVkdEVuZ2luZTo6UmVwbGFjZVBhcmFnRW5kKEZYX1dDSEFSKiYgbHBUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcmVJc0NSKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuTGVuZ3RoOyBpKyspIHsNCisgICAgRlhfV0NIQVIgd2MgPSBscFRleHRbaV07DQorICAgIHN3aXRjaCAod2MpIHsNCisgICAgICBjYXNlIEwnXHInOiB7DQorICAgICAgICBscFRleHRbaV0gPSBtX3dMaW5lRW5kOw0KKyAgICAgICAgYlByZUlzQ1IgPSBUUlVFOw0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBMJ1xuJzogew0KKyAgICAgICAgaWYgKGJQcmVJc0NSID09IFRSVUUpIHsNCisgICAgICAgICAgaW50MzJfdCBuTmV4dCA9IGkgKyAxOw0KKyAgICAgICAgICBpZiAobk5leHQgPCBuTGVuZ3RoKSB7DQorICAgICAgICAgICAgRlhTWVNfbWVtbW92ZShscFRleHQgKyBpLCBscFRleHQgKyBuTmV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIChuTGVuZ3RoIC0gbk5leHQpICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaS0tOw0KKyAgICAgICAgICBuTGVuZ3RoLS07DQorICAgICAgICAgIGJQcmVJc0NSID0gRkFMU0U7DQorICAgICAgICAgIGlmIChtX2JBdXRvTGluZUVuZCkgew0KKyAgICAgICAgICAgIG1fbkZpcnN0TGluZUVuZCA9IEZERV9UWFRFRElUX0xJTkVFTkRfQ1JMRjsNCisgICAgICAgICAgICBtX2JBdXRvTGluZUVuZCA9IEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBscFRleHRbaV0gPSBtX3dMaW5lRW5kOw0KKyAgICAgICAgICBpZiAobV9iQXV0b0xpbmVFbmQpIHsNCisgICAgICAgICAgICBtX25GaXJzdExpbmVFbmQgPSBGREVfVFhURURJVF9MSU5FRU5EX0xGOw0KKyAgICAgICAgICAgIG1fYkF1dG9MaW5lRW5kID0gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgIGlmIChiUHJlSXNDUiAmJiBtX2JBdXRvTGluZUVuZCkgew0KKyAgICAgICAgICBtX25GaXJzdExpbmVFbmQgPSBGREVfVFhURURJVF9MSU5FRU5EX0NSOw0KKyAgICAgICAgICBtX2JBdXRvTGluZUVuZCA9IEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYlByZUlzQ1IgPSBGQUxTRTsNCisgICAgICB9IGJyZWFrOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gYlByZUlzQ1I7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlJlY292ZXJQYXJhZ0VuZChDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7DQorICBGWF9XQ0hBUiB3YyA9IChtX25GaXJzdExpbmVFbmQgPT0gRkRFX1RYVEVESVRfTElORUVORF9DUikgPyBMJ1xuJyA6IEwnXHInOw0KKyAgaWYgKG1fbkZpcnN0TGluZUVuZCA9PSBGREVfVFhURURJVF9MSU5FRU5EX0NSTEYpIHsNCisgICAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4gUG9zQXJyOw0KKyAgICBpbnQzMl90IG5MZW5ndGggPSB3c1RleHQuR2V0TGVuZ3RoKCk7DQorICAgIGludDMyX3QgaSA9IDA7DQorICAgIEZYX1dDSEFSKiBscFBvcyA9IChGWF9XQ0hBUiopKGNvbnN0IEZYX1dDSEFSKil3c1RleHQ7DQorICAgIGZvciAoaSA9IDA7IGkgPCBuTGVuZ3RoOyBpKyssIGxwUG9zKyspIHsNCisgICAgICBpZiAoKmxwUG9zID09IG1fd0xpbmVFbmQpIHsNCisgICAgICAgICpscFBvcyA9IHdjOw0KKyAgICAgICAgUG9zQXJyLkFkZChpKTsNCisgICAgICB9DQorICAgIH0NCisgICAgY29uc3QgRlhfV0NIQVIqIGxwU3JjQnVmID0gd3NUZXh0LmNfc3RyKCk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCisgICAgaW50MzJfdCBuQ291bnQgPSBQb3NBcnIuR2V0U2l6ZSgpOw0KKyAgICBGWF9XQ0hBUiogbHBEc3RCdWYgPSB3c1RlbXAuR2V0QnVmZmVyKG5MZW5ndGggKyBuQ291bnQpOw0KKyAgICBpbnQzMl90IG5Ec3RQb3MgPSAwOw0KKyAgICBpbnQzMl90IG5TcmNQb3MgPSAwOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsNCisgICAgICBpbnQzMl90IG5Qb3MgPSBQb3NBcnJbaV07DQorICAgICAgaW50MzJfdCBuQ29weUxlbiA9IG5Qb3MgLSBuU3JjUG9zICsgMTsNCisgICAgICBGWFNZU19tZW1jcHkobHBEc3RCdWYgKyBuRHN0UG9zLCBscFNyY0J1ZiArIG5TcmNQb3MsDQorICAgICAgICAgICAgICAgICAgIG5Db3B5TGVuICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorICAgICAgbkRzdFBvcyArPSBuQ29weUxlbjsNCisgICAgICBuU3JjUG9zICs9IG5Db3B5TGVuOw0KKyAgICAgIGxwRHN0QnVmW25Ec3RQb3NdID0gTCdcbic7DQorICAgICAgbkRzdFBvcysrOw0KKyAgICB9DQorICAgIGlmIChuU3JjUG9zIDwgbkxlbmd0aCkgew0KKyAgICAgIEZYU1lTX21lbWNweShscERzdEJ1ZiArIG5Ec3RQb3MsIGxwU3JjQnVmICsgblNyY1BvcywNCisgICAgICAgICAgICAgICAgICAgKG5MZW5ndGggLSBuU3JjUG9zKSAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgICB9DQorICAgIHdzVGVtcC5SZWxlYXNlQnVmZmVyKG5MZW5ndGggKyBuQ291bnQpOw0KKyAgICB3c1RleHQgPSB3c1RlbXA7DQorICB9IGVsc2Ugew0KKyAgICBpbnQzMl90IG5MZW5ndGggPSB3c1RleHQuR2V0TGVuZ3RoKCk7DQorICAgIEZYX1dDSEFSKiBscEJ1ZiA9IChGWF9XQ0hBUiopKGNvbnN0IEZYX1dDSEFSKil3c1RleHQ7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5MZW5ndGg7IGkrKywgbHBCdWYrKykgew0KKyAgICAgIGlmICgqbHBCdWYgPT0gbV93TGluZUVuZCkgew0KKyAgICAgICAgKmxwQnVmID0gd2M7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6Ok1vdmVQYWdlMkNoYXIoaW50MzJfdCBuSW5kZXgpIHsNCisgIEZYU1lTX2Fzc2VydChuSW5kZXggPj0gMCk7DQorICBGWFNZU19hc3NlcnQobkluZGV4IDw9IG1fcFR4dEJ1Zi0+R2V0VGV4dExlbmd0aCgpKTsNCisgIGlmIChtX25DYXJldFBhZ2UgPj0gMCkgew0KKyAgICBJRkRFX1R4dEVkdFBhZ2UqIHBQYWdlID0gbV9QYWdlUHRyQXJyYXlbbV9uQ2FyZXRQYWdlXTsNCisgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9QYWdlTG9hZCh0aGlzLCBtX25DYXJldFBhZ2UsIDApOw0KKyAgICBpbnQzMl90IG5QYWdlQ2hhclN0YXJ0ID0gcFBhZ2UtPkdldENoYXJTdGFydCgpOw0KKyAgICBpbnQzMl90IG5QYWdlQ2hhckNvdW50ID0gcFBhZ2UtPkdldENoYXJDb3VudCgpOw0KKyAgICBpZiAobkluZGV4ID49IG5QYWdlQ2hhclN0YXJ0ICYmIG5JbmRleCA8IG5QYWdlQ2hhclN0YXJ0ICsgblBhZ2VDaGFyQ291bnQpIHsNCisgICAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VVbmxvYWQodGhpcywgbV9uQ2FyZXRQYWdlLCAwKTsNCisgICAgICByZXR1cm4gbV9uQ2FyZXRQYWdlOw0KKyAgICB9DQorICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZVVubG9hZCh0aGlzLCBtX25DYXJldFBhZ2UsIDApOw0KKyAgfQ0KKyAgQ0ZERV9UeHRFZHRQYXJhZyogcFBhcmFnID0gTlVMTDsNCisgIGludDMyX3QgbkxpbmVDb3VudCA9IDA7DQorICBpbnQzMl90IG5QYXJhZ0NvdW50ID0gbV9QYXJhZ1B0ckFycmF5LkdldFNpemUoKTsNCisgIGludDMyX3QgaSA9IDA7DQorICBmb3IgKGkgPSAwOyBpIDwgblBhcmFnQ291bnQ7IGkrKykgew0KKyAgICBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbaV07DQorICAgIGlmIChwUGFyYWctPm1fbkNoYXJTdGFydCA8PSBuSW5kZXggJiYNCisgICAgICAgIG5JbmRleCA8IChwUGFyYWctPm1fbkNoYXJTdGFydCArIHBQYXJhZy0+bV9uQ2hhckNvdW50KSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIG5MaW5lQ291bnQgKz0gcFBhcmFnLT5tX25MaW5lQ291bnQ7DQorICB9DQorICBwUGFyYWctPkxvYWRQYXJhZygpOw0KKyAgaW50MzJfdCBuTGluZVN0YXJ0ID0gLTE7DQorICBpbnQzMl90IG5MaW5lQ2hhckNvdW50ID0gLTE7DQorICBmb3IgKGkgPSAwOyBpIDwgcFBhcmFnLT5tX25MaW5lQ291bnQ7IGkrKykgew0KKyAgICBwUGFyYWctPkdldExpbmVSYW5nZShpLCBuTGluZVN0YXJ0LCBuTGluZUNoYXJDb3VudCk7DQorICAgIGlmIChuTGluZVN0YXJ0IDw9IG5JbmRleCAmJiBuSW5kZXggPCAobkxpbmVTdGFydCArIG5MaW5lQ2hhckNvdW50KSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBGWFNZU19hc3NlcnQoaSA8IHBQYXJhZy0+bV9uTGluZUNvdW50KTsNCisgIG5MaW5lQ291bnQgKz0gKGkgKyAxKTsNCisgIG1fbkNhcmV0UGFnZSA9IChuTGluZUNvdW50IC0gMSkgLyBtX25QYWdlTGluZUNvdW50ICsgMSAtIDE7DQorICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VDaGFuZ2UodGhpcywgbV9uQ2FyZXRQYWdlKTsNCisgIHBQYXJhZy0+VW5sb2FkUGFyYWcoKTsNCisgIHJldHVybiBtX25DYXJldFBhZ2U7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlRleHRQb3MyUGFyYWdQb3MoaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfVFhURURUUEFSQUdQT1MmIFBhcmFnUG9zKSBjb25zdCB7DQorICBGWFNZU19hc3NlcnQobkluZGV4ID49IDAgJiYgbkluZGV4IDwgbV9wVHh0QnVmLT5HZXRUZXh0TGVuZ3RoKCkpOw0KKyAgaW50MzJfdCBuQ291bnQgPSBtX1BhcmFnUHRyQXJyYXkuR2V0U2l6ZSgpOw0KKyAgaW50MzJfdCBuQmduID0gMDsNCisgIGludDMyX3Qgbk1pZCA9IDA7DQorICBpbnQzMl90IG5FbmQgPSBuQ291bnQgLSAxOw0KKyAgd2hpbGUgKG5FbmQgPiBuQmduKSB7DQorICAgIG5NaWQgPSAobkJnbiArIG5FbmQpIC8gMjsNCisgICAgQ0ZERV9UeHRFZHRQYXJhZyogcFBhcmFnID0gbV9QYXJhZ1B0ckFycmF5W25NaWRdOw0KKyAgICBpZiAobkluZGV4IDwgcFBhcmFnLT5tX25DaGFyU3RhcnQpIHsNCisgICAgICBuRW5kID0gbk1pZCAtIDE7DQorICAgIH0gZWxzZSBpZiAobkluZGV4ID49IChwUGFyYWctPm1fbkNoYXJTdGFydCArIHBQYXJhZy0+bV9uQ2hhckNvdW50KSkgew0KKyAgICAgIG5CZ24gPSBuTWlkICsgMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKG5CZ24gPT0gbkVuZCkgew0KKyAgICBuTWlkID0gbkJnbjsNCisgIH0NCisgIEZYU1lTX2Fzc2VydChuSW5kZXggPj0gbV9QYXJhZ1B0ckFycmF5W25NaWRdLT5tX25DaGFyU3RhcnQgJiYNCisgICAgICAgICAgICAgICAobkluZGV4IDwgbV9QYXJhZ1B0ckFycmF5W25NaWRdLT5tX25DaGFyU3RhcnQgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9QYXJhZ1B0ckFycmF5W25NaWRdLT5tX25DaGFyQ291bnQpKTsNCisgIFBhcmFnUG9zLm5QYXJhZ0luZGV4ID0gbk1pZDsNCisgIFBhcmFnUG9zLm5DaGFySW5kZXggPSBuSW5kZXggLSBtX1BhcmFnUHRyQXJyYXlbbk1pZF0tPm1fbkNoYXJTdGFydDsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdEVuZ2luZTo6TW92ZUZvcndhcmQoRlhfQk9PTCYgYkJlZm9yZSkgew0KKyAgaWYgKG1fbkNhcmV0ID09IG1fcFR4dEJ1Zi0+R2V0VGV4dExlbmd0aCgpIC0gMSkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBpbnQzMl90IG5DYXJldCA9IG1fbkNhcmV0Ow0KKyAgaWYgKChuQ2FyZXQgKyAxIDwgbV9wVHh0QnVmLT5HZXRUZXh0TGVuZ3RoKCkpICYmDQorICAgICAgKG1fcFR4dEJ1Zi0+R2V0Q2hhckJ5SW5kZXgobkNhcmV0KSA9PSBMJ1xyJykgJiYNCisgICAgICAobV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuQ2FyZXQgKyAxKSA9PSBMJ1xuJykpIHsNCisgICAgbkNhcmV0Kys7DQorICB9DQorICBuQ2FyZXQrKzsNCisgIGJCZWZvcmUgPSBUUlVFOw0KKyAgcmV0dXJuIG5DYXJldDsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdEVuZ2luZTo6TW92ZUJhY2t3YXJkKEZYX0JPT0wmIGJCZWZvcmUpIHsNCisgIGlmIChtX25DYXJldCA9PSAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGludDMyX3QgbkNhcmV0ID0gbV9uQ2FyZXQ7DQorICBpZiAobkNhcmV0ID4gMiAmJiBtX3BUeHRCdWYtPkdldENoYXJCeUluZGV4KG5DYXJldCAtIDEpID09IEwnXG4nICYmDQorICAgICAgbV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuQ2FyZXQgLSAyKSA9PSBMJ1xyJykgew0KKyAgICBuQ2FyZXQtLTsNCisgIH0NCisgIG5DYXJldC0tOw0KKyAgYkJlZm9yZSA9IFRSVUU7DQorICByZXR1cm4gbkNhcmV0Ow0KK30NCitGWF9CT09MIENGREVfVHh0RWR0RW5naW5lOjpNb3ZlVXAoQ0ZYX1BvaW50RiYgcHRDYXJldCkgew0KKyAgSUZERV9UeHRFZHRQYWdlKiBwUGFnZSA9IEdldFBhZ2UobV9uQ2FyZXRQYWdlKTsNCisgIGNvbnN0IENGWF9SZWN0RiYgcnRDb250ZW50ID0gcFBhZ2UtPkdldENvbnRlbnRzQm94KCk7DQorICBpZiAobV9QYXJhbS5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9Eb2NWZXJ0aWNhbCkgew0KKyAgICBwdENhcmV0LnggPSBtX3J0Q2FyZXQubGVmdCArIG1fcnRDYXJldC53aWR0aCAvIDIgLSBtX1BhcmFtLmZMaW5lU3BhY2U7DQorICAgIHB0Q2FyZXQueSA9IG1fZkNhcmV0UG9zUmVzZXJ2ZTsNCisgICAgRlhfQk9PTCBiTGluZVJlc2VydmUgPQ0KKyAgICAgICAgbV9QYXJhbS5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9MaW5lUmVzZXJ2ZTsNCisgICAgaWYgKHB0Q2FyZXQueCA8IHJ0Q29udGVudC5sZWZ0KSB7DQorICAgICAgaWYgKGJMaW5lUmVzZXJ2ZSkgew0KKyAgICAgICAgaWYgKG1fbkNhcmV0UGFnZSA9PSBDb3VudFBhZ2VzKCkgLSAxKSB7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKG1fbkNhcmV0UGFnZSA9PSAwKSB7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgaWYgKGJMaW5lUmVzZXJ2ZSkgew0KKyAgICAgICAgbV9uQ2FyZXRQYWdlKys7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIG1fbkNhcmV0UGFnZS0tOw0KKyAgICAgIH0NCisgICAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VDaGFuZ2UodGhpcywgbV9uQ2FyZXRQYWdlKTsNCisgICAgICBwdENhcmV0LnggLT0gcnRDb250ZW50LmxlZnQ7DQorICAgICAgSUZERV9UeHRFZHRQYWdlKiBwQ3VyUGFnZSA9IEdldFBhZ2UobV9uQ2FyZXRQYWdlKTsNCisgICAgICBwdENhcmV0LnggKz0gcEN1clBhZ2UtPkdldENvbnRlbnRzQm94KCkucmlnaHQoKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgcHRDYXJldC54ID0gbV9mQ2FyZXRQb3NSZXNlcnZlOw0KKyAgICBwdENhcmV0LnkgPSBtX3J0Q2FyZXQudG9wICsgbV9ydENhcmV0LmhlaWdodCAvIDIgLSBtX1BhcmFtLmZMaW5lU3BhY2U7DQorICAgIGlmIChwdENhcmV0LnkgPCBydENvbnRlbnQudG9wKSB7DQorICAgICAgaWYgKG1fbkNhcmV0UGFnZSA9PSAwKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIHB0Q2FyZXQueSAtPSBydENvbnRlbnQudG9wOw0KKyAgICAgIG1fbkNhcmV0UGFnZS0tOw0KKyAgICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZUNoYW5nZSh0aGlzLCBtX25DYXJldFBhZ2UpOw0KKyAgICAgIElGREVfVHh0RWR0UGFnZSogcEN1clBhZ2UgPSBHZXRQYWdlKG1fbkNhcmV0UGFnZSk7DQorICAgICAgcHRDYXJldC55ICs9IHBDdXJQYWdlLT5HZXRDb250ZW50c0JveCgpLmJvdHRvbSgpOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRkRFX1R4dEVkdEVuZ2luZTo6TW92ZURvd24oQ0ZYX1BvaW50RiYgcHRDYXJldCkgew0KKyAgSUZERV9UeHRFZHRQYWdlKiBwUGFnZSA9IEdldFBhZ2UobV9uQ2FyZXRQYWdlKTsNCisgIGNvbnN0IENGWF9SZWN0RiYgcnRDb250ZW50ID0gcFBhZ2UtPkdldENvbnRlbnRzQm94KCk7DQorICBpZiAobV9QYXJhbS5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9Eb2NWZXJ0aWNhbCkgew0KKyAgICBwdENhcmV0LnggPSBtX3J0Q2FyZXQubGVmdCArIG1fcnRDYXJldC53aWR0aCAvIDIgKyBtX1BhcmFtLmZMaW5lU3BhY2U7DQorICAgIHB0Q2FyZXQueSA9IG1fZkNhcmV0UG9zUmVzZXJ2ZTsNCisgICAgaWYgKHB0Q2FyZXQueCA+PSBydENvbnRlbnQucmlnaHQoKSkgew0KKyAgICAgIEZYX0JPT0wgYkxpbmVSZXNlcnZlID0NCisgICAgICAgICAgbV9QYXJhbS5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9MaW5lUmVzZXJ2ZTsNCisgICAgICBpZiAoYkxpbmVSZXNlcnZlKSB7DQorICAgICAgICBpZiAobV9uQ2FyZXRQYWdlID09IDApIHsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAobV9uQ2FyZXRQYWdlID09IENvdW50UGFnZXMoKSAtIDEpIHsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoYkxpbmVSZXNlcnZlKSB7DQorICAgICAgICBtX25DYXJldFBhZ2UtLTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9uQ2FyZXRQYWdlKys7DQorICAgICAgfQ0KKyAgICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZUNoYW5nZSh0aGlzLCBtX25DYXJldFBhZ2UpOw0KKyAgICAgIHB0Q2FyZXQueCAtPSBydENvbnRlbnQucmlnaHQoKTsNCisgICAgICBJRkRFX1R4dEVkdFBhZ2UqIHBDdXJQYWdlID0gR2V0UGFnZShtX25DYXJldFBhZ2UpOw0KKyAgICAgIHB0Q2FyZXQueCArPSBwQ3VyUGFnZS0+R2V0Q29udGVudHNCb3goKS5sZWZ0Ow0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBwdENhcmV0LnggPSBtX2ZDYXJldFBvc1Jlc2VydmU7DQorICAgIHB0Q2FyZXQueSA9IG1fcnRDYXJldC50b3AgKyBtX3J0Q2FyZXQuaGVpZ2h0IC8gMiArIG1fUGFyYW0uZkxpbmVTcGFjZTsNCisgICAgaWYgKHB0Q2FyZXQueSA+PSBydENvbnRlbnQuYm90dG9tKCkpIHsNCisgICAgICBpZiAobV9uQ2FyZXRQYWdlID09IENvdW50UGFnZXMoKSAtIDEpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgcHRDYXJldC55IC09IHJ0Q29udGVudC5ib3R0b20oKTsNCisgICAgICBtX25DYXJldFBhZ2UrKzsNCisgICAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VDaGFuZ2UodGhpcywgbV9uQ2FyZXRQYWdlKTsNCisgICAgICBJRkRFX1R4dEVkdFBhZ2UqIHBDdXJQYWdlID0gR2V0UGFnZShtX25DYXJldFBhZ2UpOw0KKyAgICAgIHB0Q2FyZXQueSArPSBwQ3VyUGFnZS0+R2V0Q29udGVudHNCb3goKS50b3A7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0RW5naW5lOjpNb3ZlTGluZVN0YXJ0KCkgew0KKyAgaW50MzJfdCBuSW5kZXggPSBtX2JCZWZvcmUgPyBtX25DYXJldCA6IG1fbkNhcmV0IC0gMTsNCisgIEZERV9UWFRFRFRQQVJBR1BPUyBQYXJhZ1BvczsNCisgIFRleHRQb3MyUGFyYWdQb3MobkluZGV4LCBQYXJhZ1Bvcyk7DQorICBDRkRFX1R4dEVkdFBhcmFnKiBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbUGFyYWdQb3MublBhcmFnSW5kZXhdOw0KKyAgcFBhcmFnLT5Mb2FkUGFyYWcoKTsNCisgIGludDMyX3QgbkxpbmVDb3VudCA9IHBQYXJhZy0+bV9uTGluZUNvdW50Ow0KKyAgaW50MzJfdCBpID0gMDsNCisgIGludDMyX3QgblN0YXJ0ID0gMDsNCisgIGludDMyX3QgbkNvdW50ID0gMDsNCisgIGZvciAoOyBpIDwgbkxpbmVDb3VudDsgaSsrKSB7DQorICAgIHBQYXJhZy0+R2V0TGluZVJhbmdlKGksIG5TdGFydCwgbkNvdW50KTsNCisgICAgaWYgKG5JbmRleCA+PSBuU3RhcnQgJiYgbkluZGV4IDwgblN0YXJ0ICsgbkNvdW50KSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIFVwZGF0ZUNhcmV0UmVjdChuU3RhcnQsIFRSVUUpOw0KKyAgcFBhcmFnLT5VbmxvYWRQYXJhZygpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6Ok1vdmVMaW5lRW5kKCkgew0KKyAgaW50MzJfdCBuSW5kZXggPSBtX2JCZWZvcmUgPyBtX25DYXJldCA6IG1fbkNhcmV0IC0gMTsNCisgIEZERV9UWFRFRFRQQVJBR1BPUyBQYXJhZ1BvczsNCisgIFRleHRQb3MyUGFyYWdQb3MobkluZGV4LCBQYXJhZ1Bvcyk7DQorICBDRkRFX1R4dEVkdFBhcmFnKiBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbUGFyYWdQb3MublBhcmFnSW5kZXhdOw0KKyAgcFBhcmFnLT5Mb2FkUGFyYWcoKTsNCisgIGludDMyX3QgbkxpbmVDb3VudCA9IHBQYXJhZy0+bV9uTGluZUNvdW50Ow0KKyAgaW50MzJfdCBpID0gMDsNCisgIGludDMyX3QgblN0YXJ0ID0gMDsNCisgIGludDMyX3QgbkNvdW50ID0gMDsNCisgIGZvciAoOyBpIDwgbkxpbmVDb3VudDsgaSsrKSB7DQorICAgIHBQYXJhZy0+R2V0TGluZVJhbmdlKGksIG5TdGFydCwgbkNvdW50KTsNCisgICAgaWYgKG5JbmRleCA+PSBuU3RhcnQgJiYgbkluZGV4IDwgblN0YXJ0ICsgbkNvdW50KSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIG5JbmRleCA9IG5TdGFydCArIG5Db3VudCAtIDE7DQorICBGWFNZU19hc3NlcnQobkluZGV4IDw9IEdldFRleHRCdWZMZW5ndGgoKSk7DQorICBGWF9XQ0hBUiB3Q2hhciA9IG1fcFR4dEJ1Zi0+R2V0Q2hhckJ5SW5kZXgobkluZGV4KTsNCisgIEZYX0JPT0wgYkJlZm9yZSA9IEZBTFNFOw0KKyAgaWYgKG5JbmRleCA8PSBHZXRUZXh0QnVmTGVuZ3RoKCkpIHsNCisgICAgaWYgKHdDaGFyID09IEwnXHInKSB7DQorICAgICAgYkJlZm9yZSA9IFRSVUU7DQorICAgIH0gZWxzZSBpZiAod0NoYXIgPT0gTCdcbicgJiYgbkluZGV4ID4gblN0YXJ0KSB7DQorICAgICAgYkJlZm9yZSA9IFRSVUU7DQorICAgICAgbkluZGV4LS07DQorICAgICAgd0NoYXIgPSBtX3BUeHRCdWYtPkdldENoYXJCeUluZGV4KG5JbmRleCk7DQorICAgICAgaWYgKHdDaGFyICE9IEwnXHInKSB7DQorICAgICAgICBuSW5kZXgrKzsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIFVwZGF0ZUNhcmV0UmVjdChuSW5kZXgsIGJCZWZvcmUpOw0KKyAgcFBhcmFnLT5VbmxvYWRQYXJhZygpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6Ok1vdmVQYXJhZ1N0YXJ0KCkgew0KKyAgaW50MzJfdCBuSW5kZXggPSBtX2JCZWZvcmUgPyBtX25DYXJldCA6IG1fbkNhcmV0IC0gMTsNCisgIEZERV9UWFRFRFRQQVJBR1BPUyBQYXJhZ1BvczsNCisgIFRleHRQb3MyUGFyYWdQb3MobkluZGV4LCBQYXJhZ1Bvcyk7DQorICBDRkRFX1R4dEVkdFBhcmFnKiBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbUGFyYWdQb3MublBhcmFnSW5kZXhdOw0KKyAgVXBkYXRlQ2FyZXRSZWN0KHBQYXJhZy0+bV9uQ2hhclN0YXJ0LCBUUlVFKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0RW5naW5lOjpNb3ZlUGFyYWdFbmQoKSB7DQorICBpbnQzMl90IG5JbmRleCA9IG1fYkJlZm9yZSA/IG1fbkNhcmV0IDogbV9uQ2FyZXQgLSAxOw0KKyAgRkRFX1RYVEVEVFBBUkFHUE9TIFBhcmFnUG9zOw0KKyAgVGV4dFBvczJQYXJhZ1BvcyhuSW5kZXgsIFBhcmFnUG9zKTsNCisgIENGREVfVHh0RWR0UGFyYWcqIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtQYXJhZ1Bvcy5uUGFyYWdJbmRleF07DQorICBuSW5kZXggPSBwUGFyYWctPm1fbkNoYXJTdGFydCArIHBQYXJhZy0+bV9uQ2hhckNvdW50IC0gMTsNCisgIEZYX1dDSEFSIHdDaGFyID0gbV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuSW5kZXgpOw0KKyAgaWYgKHdDaGFyID09IEwnXG4nICYmIG5JbmRleCA+IDApIHsNCisgICAgbkluZGV4LS07DQorICAgIHdDaGFyID0gbV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuSW5kZXgpOw0KKyAgICBpZiAod0NoYXIgIT0gTCdccicpIHsNCisgICAgICBuSW5kZXgrKzsNCisgICAgfQ0KKyAgfQ0KKyAgVXBkYXRlQ2FyZXRSZWN0KG5JbmRleCwgVFJVRSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRkRFX1R4dEVkdEVuZ2luZTo6TW92ZUhvbWUoKSB7DQorICBVcGRhdGVDYXJldFJlY3QoMCwgVFJVRSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRkRFX1R4dEVkdEVuZ2luZTo6TW92ZUVuZCgpIHsNCisgIFVwZGF0ZUNhcmV0UmVjdChHZXRUZXh0QnVmTGVuZ3RoKCksIFRSVUUpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCitpbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpOb3JtYWxpemVDYXJldFBvcyhpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5GbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiQmVmb3JlKSB7DQorICBiQmVmb3JlID0gVFJVRTsNCisgIGludDMyX3QgbkJnbiA9IDAsIG5FbmQgPSAwOw0KKyAgaW50MzJfdCBuUmVjb3JkID0gLTE7DQorICBDRkRFX1R4dEVkdEZpZWxkKiBwRmllbGQgPSBOVUxMOw0KKyAgRlhfQk9PTCBiUmV0ID0gR2V0RmllbGRCb3VuZGFyeShuSW5kZXgsIG5CZ24sIG5FbmQsIHBGaWVsZCk7DQorICBpbnQzMl90IG5EZWx0YSA9IDA7DQorICBpZiAoYlJldCAmJiAhcEZpZWxkLT5Jc0ZpeCgpKSB7DQorICAgIGlmIChuSW5kZXggLSBuQmduIDwgRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX0hBREVSU0laRSkgew0KKyAgICAgIGlmIChuRmxhZ3MgPT0gRkRFX0ZPUk1BVF9DQVJFVF9CQUNLV0FSRCkgew0KKyAgICAgICAgQ0ZERV9UeHRFZHRGaWVsZCogcEVkaXRhYmxlRmllbGQgPSBOVUxMOw0KKyAgICAgICAgaWYgKEZpbmRFZGl0YWJsZUZpZWxkKG5JbmRleCwgbkJnbiwgbkVuZCwgcEVkaXRhYmxlRmllbGQsIEZBTFNFKSkgew0KKyAgICAgICAgICByZXR1cm4gcEVkaXRhYmxlRmllbGQtPk5vcm1hbGl6ZUNhcmV0UG9zKG5FbmQgLSBuQmduLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9GT1JNQVRfQ0FSRVRfQkFDS1dBUkQpICsNCisgICAgICAgICAgICAgICAgIG5CZ247DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIG5JbmRleCA9IG5CZ24gKyBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFOw0KKyAgICB9DQorICAgIGludDMyX3QgblJldCA9IHBGaWVsZC0+Tm9ybWFsaXplQ2FyZXRQb3MoDQorICAgICAgICBuSW5kZXggLSBuQmduLCAoRkRFX0ZPUk1BVF9DQVJFVF9ESVJFQ1RJT04pbkZsYWdzKTsNCisgICAgaWYgKG5SZXQgPj0gMCkgew0KKyAgICAgIHJldHVybiBuUmV0ICsgbkJnbjsNCisgICAgfQ0KKyAgICBpZiAoblJldCA9PSAtMikgew0KKyAgICAgIGludDMyX3QgbkVkaXRhYmxlUG9zQmduID0gMCwgbkVkaXRhYmxlUG9zRW5kID0gMDsNCisgICAgICBwRmllbGQtPkdldEVkaXRhYmxlUmFuZ2UobkVkaXRhYmxlUG9zQmduLCBuRWRpdGFibGVQb3NFbmQpOw0KKyAgICAgIG5SZWNvcmQgPSBuQmduICsgbkVkaXRhYmxlUG9zQmduOw0KKyAgICAgIG5GbGFncyA9IEZERV9GT1JNQVRfQ0FSRVRfQkFDS1dBUkQ7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhTWVNfYXNzZXJ0KG5SZXQgPT0gLTEpOw0KKyAgICAgIGludDMyX3QgbkVkaXRhYmxlUG9zQmduID0gMCwgbkVkaXRhYmxlUG9zRW5kID0gMDsNCisgICAgICBwRmllbGQtPkdldEVkaXRhYmxlUmFuZ2UobkVkaXRhYmxlUG9zQmduLCBuRWRpdGFibGVQb3NFbmQpOw0KKyAgICAgIG5SZWNvcmQgPSBuQmduICsgbkVkaXRhYmxlUG9zRW5kOw0KKyAgICAgIG5GbGFncyA9IEZERV9GT1JNQVRfQ0FSRVRfRk9SV0FSRDsNCisgICAgfQ0KKyAgfSBlbHNlIGlmICghYlJldCkgew0KKyAgICBuRGVsdGEgPSBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFIC0gRkRFX0ZPUk1BVF9FRElUX0ZJRUxEX1RBSUxTSVpFOw0KKyAgfQ0KKyAgc3dpdGNoIChuRmxhZ3MpIHsNCisgICAgY2FzZSBGREVfRk9STUFUX0NBUkVUX0ZPUldBUkQ6IHsNCisgICAgICBpZiAoRmluZEVkaXRhYmxlRmllbGQobkluZGV4LCBuQmduLCBuRW5kLCBwRmllbGQpKSB7DQorICAgICAgICByZXR1cm4gcEZpZWxkLT5Ob3JtYWxpemVDYXJldFBvcyhGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0ZPUk1BVF9DQVJFVF9GT1JXQVJEKSArDQorICAgICAgICAgICAgICAgbkJnbjsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKG5SZWNvcmQgIT0gLTEpIHsNCisgICAgICAgICAgcmV0dXJuIG5SZWNvcmQ7DQorICAgICAgICB9DQorICAgICAgICBiUmV0ID0gRmluZEVkaXRhYmxlRmllbGQobkluZGV4LCBuQmduLCBuRW5kLCBwRmllbGQsIEZBTFNFKTsNCisgICAgICAgIEZYU1lTX2Fzc2VydChiUmV0KTsNCisgICAgICAgIHJldHVybiBwRmllbGQtPk5vcm1hbGl6ZUNhcmV0UG9zKG5FbmQgLSBuQmduLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0ZPUk1BVF9DQVJFVF9CQUNLV0FSRCkgKw0KKyAgICAgICAgICAgICAgIG5CZ247DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZERV9GT1JNQVRfQ0FSRVRfTUlERExFOiB7DQorICAgICAgaW50MzJfdCBuQmduMSA9IDAsIG5FbmQxID0gMCwgbkJnbjIgPSAwLCBuRW5kMiA9IDA7DQorICAgICAgQ0ZERV9UeHRFZHRGaWVsZCogcEVkaXRhYmxlRmllbGQxID0gTlVMTDsNCisgICAgICBDRkRFX1R4dEVkdEZpZWxkKiBwRWRpdGFibGVGaWVsZDIgPSBOVUxMOw0KKyAgICAgIEZYX0JPT0wgYlJldDEgPQ0KKyAgICAgICAgICBGaW5kRWRpdGFibGVGaWVsZChuSW5kZXgsIG5CZ24xLCBuRW5kMSwgcEVkaXRhYmxlRmllbGQxLCBGQUxTRSk7DQorICAgICAgRlhfQk9PTCBiUmV0MiA9IEZpbmRFZGl0YWJsZUZpZWxkKG5JbmRleCwgbkJnbjIsIG5FbmQyLCBwRWRpdGFibGVGaWVsZDIpOw0KKyAgICAgIGlmIChiUmV0MSA9PSBGQUxTRSkgew0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KGJSZXQyKTsNCisgICAgICAgIHJldHVybiBwRWRpdGFibGVGaWVsZDItPk5vcm1hbGl6ZUNhcmV0UG9zKA0KKyAgICAgICAgICAgICAgICAgICBGREVfRk9STUFUX0VESVRfRklFTERfSEFERVJTSVpFLCBGREVfRk9STUFUX0NBUkVUX0ZPUldBUkQpICsNCisgICAgICAgICAgICAgICBuQmduMjsNCisgICAgICB9IGVsc2UgaWYgKGJSZXQyID09IEZBTFNFKSB7DQorICAgICAgICBGWFNZU19hc3NlcnQoYlJldDEpOw0KKyAgICAgICAgcmV0dXJuIHBFZGl0YWJsZUZpZWxkMS0+Tm9ybWFsaXplQ2FyZXRQb3MobkVuZDEgLSBuQmduMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9GT1JNQVRfQ0FSRVRfQkFDS1dBUkQpICsNCisgICAgICAgICAgICAgICBuQmduMTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaW50MzJfdCBuRWRpdGFibGVQb3NCZ24gPSAwLCBuRWRpdGFibGVQb3NFbmQgPSAwOw0KKyAgICAgICAgaWYgKG5JbmRleCAtIG5FbmQxIDwgbkJnbjIgKyBuRGVsdGEgLSBuSW5kZXgpIHsNCisgICAgICAgICAgcEVkaXRhYmxlRmllbGQxLT5HZXRFZGl0YWJsZVJhbmdlKG5FZGl0YWJsZVBvc0JnbiwgbkVkaXRhYmxlUG9zRW5kKTsNCisgICAgICAgICAgcmV0dXJuIG5FZGl0YWJsZVBvc0VuZCArIG5CZ24xOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcEVkaXRhYmxlRmllbGQyLT5HZXRFZGl0YWJsZVJhbmdlKG5FZGl0YWJsZVBvc0JnbiwgbkVkaXRhYmxlUG9zRW5kKTsNCisgICAgICAgICAgcmV0dXJuIG5FZGl0YWJsZVBvc0JnbiArIG5CZ24yOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGREVfRk9STUFUX0NBUkVUX0JBQ0tXQVJEOiB7DQorICAgICAgaWYgKEZpbmRFZGl0YWJsZUZpZWxkKG5JbmRleCwgbkJnbiwgbkVuZCwgcEZpZWxkLCBGQUxTRSkpIHsNCisgICAgICAgIHJldHVybiBwRmllbGQtPk5vcm1hbGl6ZUNhcmV0UG9zKG5FbmQgLSBuQmduLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0ZPUk1BVF9DQVJFVF9CQUNLV0FSRCkgKw0KKyAgICAgICAgICAgICAgIG5CZ247DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChuUmVjb3JkICE9IC0xKSB7DQorICAgICAgICAgIHJldHVybiBuUmVjb3JkOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYlJldCA9IEZpbmRFZGl0YWJsZUZpZWxkKG5JbmRleCwgbkJnbiwgbkVuZCwgcEZpZWxkKTsNCisgICAgICAgIEZYU1lTX2Fzc2VydChiUmV0KTsNCisgICAgICAgIHJldHVybiBwRmllbGQtPk5vcm1hbGl6ZUNhcmV0UG9zKEZERV9GT1JNQVRfRURJVF9GSUVMRF9IQURFUlNJWkUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfRk9STUFUX0NBUkVUX0ZPUldBUkQpICsNCisgICAgICAgICAgICAgICBuQmduOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBGWFNZU19hc3NlcnQoMCk7DQorICAgICAgcmV0dXJuIG5JbmRleDsNCisgIH0NCit9DQorRlhfQk9PTCBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0RmllbGRCb3VuZGFyeShpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5CZ24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuRW5kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9UeHRFZHRGaWVsZComIHBGaWVsZCkgew0KKyAgQ0ZERV9UeHRFZHRCdWZJdGVyKiBwSXRlciA9DQorICAgICAgbmV3IENGREVfVHh0RWR0QnVmSXRlcigoQ0ZERV9UeHRFZHRCdWYqKW1fcFR4dEJ1ZiwgRkFMU0UpOw0KKyAgcEl0ZXItPlNldEF0KG5JbmRleCk7DQorICBGWF9CT09MIGJGaW5kID0gRkFMU0U7DQorICBkbyB7DQorICAgIEZYX1dDSEFSIHdjID0gcEl0ZXItPkdldENoYXIoKTsNCisgICAgaWYgKHdjID09IEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfRU5EKSB7DQorICAgICAgbkVuZCA9IHBJdGVyLT5HZXRBdCgpOw0KKyAgICAgIGJGaW5kID0gVFJVRTsNCisgICAgICBuSW5kZXgtLTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAod2MgPT0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19CR04pIHsNCisgICAgICBwSXRlci0+UmVsZWFzZSgpOw0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgfSB3aGlsZSAocEl0ZXItPk5leHQoKSk7DQorICBpZiAoIWJGaW5kKSB7DQorICAgIHBJdGVyLT5SZWxlYXNlKCk7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHBJdGVyLT5TZXRBdChuSW5kZXgpOw0KKyAgZG8gew0KKyAgICBGWF9XQ0hBUiB3YyA9IHBJdGVyLT5HZXRDaGFyKCk7DQorICAgIGlmICh3YyA9PSBGREVfVFhURURUX0ZPUk1BVEJMT0NLX0JHTikgew0KKyAgICAgIG5CZ24gPSBwSXRlci0+R2V0QXQoKTsNCisgICAgICBwSXRlci0+TmV4dCgpOw0KKyAgICAgIEZYX0RXT1JEIGR3UHJlID0gKEZYX0RXT1JEKXBJdGVyLT5HZXRDaGFyKCk7DQorICAgICAgcEl0ZXItPk5leHQoKTsNCisgICAgICBGWF9EV09SRCBkd0N1ciA9IChGWF9EV09SRClwSXRlci0+R2V0Q2hhcigpOw0KKyAgICAgIHBGaWVsZCA9IChDRkRFX1R4dEVkdEZpZWxkKikoKGR3Q3VyIDw8IDE2KSB8IGR3UHJlKTsNCisgICAgICBwSXRlci0+UmVsZWFzZSgpOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGlmICh3YyA9PSBGREVfVFhURURUX0ZPUk1BVEJMT0NLX0VORCkgew0KKyAgICAgIHBJdGVyLT5SZWxlYXNlKCk7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICB9IHdoaWxlIChwSXRlci0+TmV4dChUUlVFKSk7DQorICBwSXRlci0+UmVsZWFzZSgpOw0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0RW5naW5lOjpGaW5kRWRpdGFibGVGaWVsZChpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuQmduLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5FbmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9UeHRFZHRGaWVsZComIHBGaWVsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGb3J3YXJkKSB7DQorICBGWF9XQ0hBUiB3Y0ZpcnN0ID0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19CR047DQorICBGWF9XQ0hBUiB3Y1NlY29uZCA9IEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfRU5EOw0KKyAgaWYgKCFiRm9yd2FyZCkgew0KKyAgICB3Y0ZpcnN0ID0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19FTkQ7DQorICAgIHdjU2Vjb25kID0gRkRFX1RYVEVEVF9GT1JNQVRCTE9DS19CR047DQorICB9DQorICBDRkRFX1R4dEVkdEJ1Zkl0ZXIqIHBJdGVyID0NCisgICAgICBuZXcgQ0ZERV9UeHRFZHRCdWZJdGVyKChDRkRFX1R4dEVkdEJ1ZiopbV9wVHh0QnVmLCBGQUxTRSk7DQorICBwSXRlci0+U2V0QXQobkluZGV4KTsNCisgIGludDMyX3QgYkZpbmQgPSBGQUxTRTsNCisgIGRvIHsNCisgICAgRlhfV0NIQVIgd2MgPSBwSXRlci0+R2V0Q2hhcigpOw0KKyAgICBpZiAod2MgPT0gd2NGaXJzdCkgew0KKyAgICAgIG5CZ24gPSBwSXRlci0+R2V0QXQoKTsNCisgICAgICBiRmluZCA9IFRSVUU7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0gd2hpbGUgKHBJdGVyLT5OZXh0KCFiRm9yd2FyZCkpOw0KKyAgaWYgKCFiRmluZCkgew0KKyAgICBwSXRlci0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBiRmluZCA9IEZBTFNFOw0KKyAgZG8gew0KKyAgICBGWF9XQ0hBUiB3YyA9IHBJdGVyLT5HZXRDaGFyKCk7DQorICAgIGlmICh3YyA9PSB3Y1NlY29uZCkgew0KKyAgICAgIG5FbmQgPSBwSXRlci0+R2V0QXQoKTsNCisgICAgICBiRmluZCA9IFRSVUU7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0gd2hpbGUgKHBJdGVyLT5OZXh0KCFiRm9yd2FyZCkpOw0KKyAgRlhTWVNfYXNzZXJ0KGJGaW5kKTsNCisgIGlmICghYkZvcndhcmQpIHsNCisgICAgaW50MzJfdCBuVGVtcCA9IG5CZ247DQorICAgIG5CZ24gPSBuRW5kOw0KKyAgICBuRW5kID0gblRlbXA7DQorICB9DQorICBwSXRlci0+U2V0QXQobkJnbiArIDEpOw0KKyAgRlhfRFdPUkQgZHdQcmUgPSAoRlhfRFdPUkQpcEl0ZXItPkdldENoYXIoKTsNCisgIHBJdGVyLT5OZXh0KCk7DQorICBGWF9EV09SRCBkd0N1ciA9IChGWF9EV09SRClwSXRlci0+R2V0Q2hhcigpOw0KKyAgcEZpZWxkID0gKENGREVfVHh0RWR0RmllbGQqKSgoZHdDdXIgPDwgMTYpIHwgZHdQcmUpOw0KKyAgcEl0ZXItPlJlbGVhc2UoKTsNCisgIGlmICghcEZpZWxkLT5Jc0ZpeCgpKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEZpbmRFZGl0YWJsZUZpZWxkKChiRm9yd2FyZCA/IG5FbmQgOiBuQmduKSwgbkJnbiwgbkVuZCwgcEZpZWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGb3J3YXJkKTsNCit9DQorRlhfQk9PTCBDRkRFX1R4dEVkdEVuZ2luZTo6TW92ZTJOZXh0RWRpdGFibGVGaWVsZChpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZvcndhcmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZWxlY3QpIHsNCisgIGlmIChtX1NlbFJhbmdlUHRyQXJyLkdldFNpemUoKSA+IDApIHsNCisgICAgQ2xlYXJTZWxlY3Rpb24oKTsNCisgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9TZWxDaGFuZ2VkKHRoaXMpOw0KKyAgfQ0KKyAgaW50MzJfdCBuQmduID0gMCwgbkVuZCA9IDA7DQorICBDRkRFX1R4dEVkdEZpZWxkKiBwRmllbGQgPSBOVUxMOw0KKyAgRlhfQk9PTCBiUmV0ID0gRmluZEVkaXRhYmxlRmllbGQobkluZGV4LCBuQmduLCBuRW5kLCBwRmllbGQsIGJGb3J3YXJkKTsNCisgIGlmICghYlJldCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpbnQzMl90IG5FZGl0YWJsZUJnbiA9IDAsIG5FZGl0YWJsZUVuZCA9IDA7DQorICBwRmllbGQtPkdldEVkaXRhYmxlUmFuZ2UobkVkaXRhYmxlQmduLCBuRWRpdGFibGVFbmQpOw0KKyAgbkVkaXRhYmxlQmduICs9IG5CZ247DQorICBuRWRpdGFibGVFbmQgKz0gbkJnbjsNCisgIGlmIChiU2VsZWN0KSB7DQorICAgIGludDMyX3QgblJhbmdlQ291bnQgPSBuRWRpdGFibGVFbmQgLSBuRWRpdGFibGVCZ247DQorICAgIGlmIChuUmFuZ2VDb3VudCA+IDApIHsNCisgICAgICBBZGRTZWxSYW5nZShuRWRpdGFibGVCZ24sIG5FZGl0YWJsZUVuZCAtIG5FZGl0YWJsZUJnbik7DQorICAgIH0NCisgIH0NCisgIFNldENhcmV0UG9zKG5FZGl0YWJsZUVuZCwgVFJVRSk7DQorICByZXR1cm4gVFJVRTsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0UmVhbEluZGV4KGludDMyX3QgbkluZGV4KSBjb25zdCB7DQorICBDRkRFX1R4dEVkdEJ1Zkl0ZXIqIHBJdGVyID0NCisgICAgICBuZXcgQ0ZERV9UeHRFZHRCdWZJdGVyKChDRkRFX1R4dEVkdEJ1ZiopbV9wVHh0QnVmLCBGQUxTRSk7DQorICBwSXRlci0+U2V0QXQoMCk7DQorICBGWF9CT09MIGJJbkZpZWxkID0gRkFMU0U7DQorICBpbnQzMl90IG5GaWVsZEJnbiA9IDA7DQorICBpbnQzMl90IG5SZWFsSW5kZXggPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDw9IG5JbmRleDsgaSsrKSB7DQorICAgIEZYX1dDSEFSIHdjID0gcEl0ZXItPkdldENoYXIoKTsNCisgICAgaWYgKGJJbkZpZWxkKSB7DQorICAgICAgaWYgKHdjID09IEZERV9UWFRFRFRfRk9STUFUQkxPQ0tfRU5EKSB7DQorICAgICAgICBGWF9EV09SRCBkd1ByZSA9IChGWF9EV09SRCltX3BUeHRCdWYtPkdldENoYXJCeUluZGV4KG5GaWVsZEJnbiArIDEpOw0KKyAgICAgICAgRlhfRFdPUkQgZHdDdXIgPSAoRlhfRFdPUkQpbV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuRmllbGRCZ24gKyAyKTsNCisgICAgICAgIENGREVfVHh0RWR0RmllbGQqIHBGaWVsZCA9IChDRkRFX1R4dEVkdEZpZWxkKikoKGR3Q3VyIDw8IDE2KSB8IGR3UHJlKTsNCisgICAgICAgIG5SZWFsSW5kZXggKz0gcEZpZWxkLT5HZXRGaWVsZFRleHRMZW5ndGgoKTsNCisgICAgICAgIGJJbkZpZWxkID0gRkFMU0U7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmICh3YyA9PSBGREVfVFhURURUX0ZPUk1BVEJMT0NLX0JHTikgew0KKyAgICAgICAgYkluRmllbGQgPSBUUlVFOw0KKyAgICAgICAgbkZpZWxkQmduID0gcEl0ZXItPkdldEF0KCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIG5SZWFsSW5kZXgrKzsNCisgICAgICB9DQorICAgIH0NCisgICAgcEl0ZXItPk5leHQoKTsNCisgIH0NCisgIGlmICghYkluRmllbGQpIHsNCisgICAgcEl0ZXItPlJlbGVhc2UoKTsNCisgICAgcmV0dXJuIG5SZWFsSW5kZXg7DQorICB9DQorICBwSXRlci0+U2V0QXQobkZpZWxkQmduICsgMSk7DQorICBGWF9EV09SRCBkd1ByZSA9IChGWF9EV09SRClwSXRlci0+R2V0Q2hhcigpOw0KKyAgcEl0ZXItPk5leHQoKTsNCisgIEZYX0RXT1JEIGR3Q3VyID0gKEZYX0RXT1JEKXBJdGVyLT5HZXRDaGFyKCk7DQorICBDRkRFX1R4dEVkdEZpZWxkKiBwRmllbGQgPSAoQ0ZERV9UeHRFZHRGaWVsZCopKChkd0N1ciA8PCAxNikgfCBkd1ByZSk7DQorICBwSXRlci0+UmVsZWFzZSgpOw0KKyAgaWYgKHBGaWVsZC0+SXNGaXgoKSkgew0KKyAgICBpbnQzMl90IG5EZWx0YSA9IG5JbmRleCAtIG5GaWVsZEJnbiAtIEZERV9GT1JNQVRfRURJVF9GSUVMRF9IQURFUlNJWkUgKyAxOw0KKyAgICByZXR1cm4gblJlYWxJbmRleCArIChuRGVsdGEgPiAwID8gbkRlbHRhIDogMCk7DQorICB9IGVsc2Ugew0KKyAgICByZXR1cm4gblJlYWxJbmRleCArIHBGaWVsZC0+R2V0UmVhbEluZGV4KG5JbmRleCAtIG5GaWVsZEJnbik7DQorICB9DQorfQ0KKyNlbmRpZg0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6OklzRml0QXJlYShDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7DQorICBJRkRFX1RleHRPdXQqIHBUZXh0T3V0ID0gSUZERV9UZXh0T3V0OjpDcmVhdGUoKTsNCisgIHBUZXh0T3V0LT5TZXRMaW5lU3BhY2UobV9QYXJhbS5mTGluZVNwYWNlKTsNCisgIHBUZXh0T3V0LT5TZXRGb250KG1fUGFyYW0ucEZvbnQpOw0KKyAgcFRleHRPdXQtPlNldEZvbnRTaXplKG1fUGFyYW0uZkZvbnRTaXplKTsNCisgIENGWF9SZWN0RiByY1RleHQ7DQorICBGWFNZU19tZW1zZXQoJnJjVGV4dCwgMCwgc2l6ZW9mKHJjVGV4dCkpOw0KKyAgRlhfRFdPUkQgZHdTdHlsZSA9IDA7DQorICBpZiAoIShtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTXVsdGlMaW5lcykpIHsNCisgICAgZHdTdHlsZSB8PSBGREVfVFRPU1RZTEVfU2luZ2xlTGluZTsNCisgIH0NCisgIGlmIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfQXV0b0xpbmVXcmFwKSB7DQorICAgIGR3U3R5bGUgfD0gRkRFX1RUT1NUWUxFX0xpbmVXcmFwOw0KKyAgICByY1RleHQud2lkdGggPSBtX1BhcmFtLmZQbGF0ZVdpZHRoOw0KKyAgfSBlbHNlIHsNCisgICAgcmNUZXh0LndpZHRoID0gNjU1MzU7DQorICB9DQorICBwVGV4dE91dC0+U2V0U3R5bGVzKGR3U3R5bGUpOw0KKyAgd3NUZXh0ICs9IEwiXG4iOw0KKyAgcFRleHRPdXQtPkNhbGNMb2dpY1NpemUod3NUZXh0LCB3c1RleHQuR2V0TGVuZ3RoKCksIHJjVGV4dCk7DQorICBwVGV4dE91dC0+UmVsZWFzZSgpOw0KKyAgd3NUZXh0LkRlbGV0ZSh3c1RleHQuR2V0TGVuZ3RoKCkgLSAxKTsNCisgIGlmICgobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX0xpbWl0QXJlYV9Ib3J6KSAmJg0KKyAgICAgIChyY1RleHQud2lkdGggPiBtX1BhcmFtLmZQbGF0ZVdpZHRoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9MaW1pdEFyZWFfVmVydCkgJiYNCisgICAgICAocmNUZXh0LmhlaWdodCA+IG1fUGFyYW0uZkxpbmVTcGFjZSAqIG1fUGFyYW0ubkxpbmVDb3VudCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlVwZGF0ZUNhcmV0UmVjdChpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiQmVmb3JlKSB7DQorICBNb3ZlUGFnZTJDaGFyKG5JbmRleCk7DQorICBHZXRDYXJldFJlY3QobV9ydENhcmV0LCBtX25DYXJldFBhZ2UsIG5JbmRleCwgYkJlZm9yZSk7DQorICBtX25DYXJldCA9IG5JbmRleDsNCisgIG1fYkJlZm9yZSA9IGJCZWZvcmU7DQorICBpZiAoIW1fYkJlZm9yZSkgew0KKyAgICBtX25DYXJldCsrOw0KKyAgICBtX2JCZWZvcmUgPSBUUlVFOw0KKyAgfQ0KKyAgbV9mQ2FyZXRQb3NSZXNlcnZlID0gKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfRG9jVmVydGljYWwpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtX3J0Q2FyZXQudG9wDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX3J0Q2FyZXQubGVmdDsNCisgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fQ2FyZXRDaGFuZ2VkKHRoaXMsIG1fbkNhcmV0UGFnZSwgMCk7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldENhcmV0UmVjdChDRlhfUmVjdEYmIHJ0Q2FyZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblBhZ2VJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2FyZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkJlZm9yZSkgew0KKyAgSUZERV9UeHRFZHRQYWdlKiBwUGFnZSA9IG1fUGFnZVB0ckFycmF5W21fbkNhcmV0UGFnZV07DQorICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VMb2FkKHRoaXMsIG1fbkNhcmV0UGFnZSwgMCk7DQorICBGWF9CT09MIGJDb21iVGV4dCA9IG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfQ29tYlRleHQ7DQorICBpbnQzMl90IG5JbmRleElucGFnZSA9IG5DYXJldCAtIHBQYWdlLT5HZXRDaGFyU3RhcnQoKTsNCisgIGlmIChiQmVmb3JlICYmIGJDb21iVGV4dCAmJiBuSW5kZXhJbnBhZ2UgPiAwKSB7DQorICAgIG5JbmRleElucGFnZS0tOw0KKyAgICBiQmVmb3JlID0gRkFMU0U7DQorICB9DQorICBpbnQzMl90IG5CSURJTGV2ZWwgPSBwUGFnZS0+R2V0Q2hhclJlY3QobkluZGV4SW5wYWdlLCBydENhcmV0LCBiQ29tYlRleHQpOw0KKyAgaWYgKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfRG9jVmVydGljYWwpIHsNCisgICAgaWYgKCghRlhfSXNPZGQobkJJRElMZXZlbCkgJiYgIWJCZWZvcmUpIHx8DQorICAgICAgICAoRlhfSXNPZGQobkJJRElMZXZlbCkgJiYgYkJlZm9yZSkpIHsNCisgICAgICBydENhcmV0Lk9mZnNldCgwLCBydENhcmV0LmhlaWdodCAtIDEuMGYpOw0KKyAgICB9DQorICAgIGlmIChydENhcmV0LmhlaWdodCA9PSAwICYmIHJ0Q2FyZXQudG9wID4gMS4wZikgew0KKyAgICAgIHJ0Q2FyZXQudG9wIC09IDEuMGY7DQorICAgIH0NCisgICAgcnRDYXJldC5oZWlnaHQgPSAxLjBmOw0KKyAgfSBlbHNlIHsNCisgICAgaWYgKCghRlhfSXNPZGQobkJJRElMZXZlbCkgJiYgIWJCZWZvcmUpIHx8DQorICAgICAgICAoRlhfSXNPZGQobkJJRElMZXZlbCkgJiYgYkJlZm9yZSkpIHsNCisgICAgICBydENhcmV0Lk9mZnNldChydENhcmV0LndpZHRoIC0gMS4wZiwgMCk7DQorICAgIH0NCisgICAgaWYgKHJ0Q2FyZXQud2lkdGggPT0gMCAmJiBydENhcmV0LmxlZnQgPiAxLjBmKSB7DQorICAgICAgcnRDYXJldC5sZWZ0IC09IDEuMGY7DQorICAgIH0NCisgICAgcnRDYXJldC53aWR0aCA9IDEuMGY7DQorICB9DQorICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX1BhZ2VVbmxvYWQodGhpcywgbV9uQ2FyZXRQYWdlLCAwKTsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6VXBkYXRlQ2FyZXRJbmRleChjb25zdCBDRlhfUG9pbnRGJiBwdENhcmV0KSB7DQorICBJRkRFX1R4dEVkdFBhZ2UqIHBQYWdlID0gbV9QYWdlUHRyQXJyYXlbbV9uQ2FyZXRQYWdlXTsNCisgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fUGFnZUxvYWQodGhpcywgbV9uQ2FyZXRQYWdlLCAwKTsNCisgIG1fbkNhcmV0ID0gcFBhZ2UtPkdldENoYXJJbmRleChwdENhcmV0LCBtX2JCZWZvcmUpOw0KKyAgR2V0Q2FyZXRSZWN0KG1fcnRDYXJldCwgbV9uQ2FyZXRQYWdlLCBtX25DYXJldCwgbV9iQmVmb3JlKTsNCisgIGlmICghbV9iQmVmb3JlKSB7DQorICAgIG1fbkNhcmV0Kys7DQorICAgIG1fYkJlZm9yZSA9IFRSVUU7DQorICB9DQorICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX0NhcmV0Q2hhbmdlZCh0aGlzLCBtX25DYXJldFBhZ2UpOw0KKyAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9QYWdlVW5sb2FkKHRoaXMsIG1fbkNhcmV0UGFnZSwgMCk7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRFbmdpbmU6OklzU2VsZWN0KCkgew0KKyAgcmV0dXJuIG1fU2VsUmFuZ2VQdHJBcnIuR2V0U2l6ZSgpID4gMDsNCit9DQordm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6RGVsZXRlU2VsZWN0KCkgew0KKyAgaW50MzJfdCBuQ291bnRSYW5nZSA9IENvdW50U2VsUmFuZ2VzKCk7DQorICBpZiAobkNvdW50UmFuZ2UgPiAwKSB7DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KKyAgICBpbnQzMl90IG5CbG9ja0NvdW50ID0gbV9CbG9ja0FycmF5LkdldFNpemUoKTsNCisgICAgaWYgKG5CbG9ja0NvdW50ID4gMCkgew0KKyAgICAgIGlmIChuQ291bnRSYW5nZSA+IDEpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgICAgaW50MzJfdCBuU2VsU3RhcnQ7DQorICAgICAgaW50MzJfdCBuU2VsQ291bnQ7DQorICAgICAgblNlbENvdW50ID0gR2V0U2VsUmFuZ2UoMCwgblNlbFN0YXJ0KTsNCisgICAgICBpbnQzMl90IG5TZWxFbmQgPSBuU2VsU3RhcnQgKyBuU2VsQ291bnQ7DQorICAgICAgaW50MzJfdCBuQmduID0gMDsNCisgICAgICBpbnQzMl90IG5FbmQgPSAwOw0KKyAgICAgIENGREVfVHh0RWR0RmllbGQqIHBGaWVsZCA9IE5VTEw7DQorICAgICAgRlhfQk9PTCBiSW5GaWVsZCA9IEdldEZpZWxkQm91bmRhcnkoblNlbFN0YXJ0LCBuQmduLCBuRW5kLCBwRmllbGQpOw0KKyAgICAgIGludDMyX3QgbkNhcmV0SW5GaWVsZCA9IG5TZWxTdGFydCAtIG5CZ247DQorICAgICAgRlhfQk9PTCBiQmVmb3JlID0gRkFMU0U7DQorICAgICAgaWYgKCFiSW5GaWVsZCB8fCBwRmllbGQtPklzRml4KCkgfHwgblNlbEVuZCA+IG5FbmQpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgICAgcEZpZWxkLT5CYWNrdXAoKTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0RlbDsNCisgICAgICBpbnQzMl90IG5DYXJldCA9IDA7DQorICAgICAgaW50MzJfdCBuUmV0ID0NCisgICAgICAgICAgcEZpZWxkLT5EZWxldGUobkNhcmV0SW5GaWVsZCwgblNlbENvdW50LCB3c0RlbCwgbkNhcmV0LCBiQmVmb3JlKTsNCisgICAgICBuQ2FyZXQgKz0gbkJnbjsNCisgICAgICBzd2l0Y2ggKG5SZXQpIHsNCisgICAgICAgIGNhc2UgRkRFX0ZPUk1BVF9GSUVMRF9ERUxFVEVfUkVUX1M6DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfRl9JTlZBTElEQVRFOg0KKyAgICAgICAgY2FzZSBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfRl9CT1VOREFSWToNCisgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgRlhTWVNfYXNzZXJ0KDApOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWVsZDsNCisgICAgICBwRmllbGQtPkdldEZpZWxkVGV4dCh3c0ZpZWxkKTsNCisgICAgICBpZiAoIW1fUGFyYW0ucEV2ZW50U2luay0+T25fVmFsaWRhdGVGaWVsZCgNCisgICAgICAgICAgICAgIHRoaXMsIHBGaWVsZC0+R2V0QmxvY2tJbmRleCgpLCBwRmllbGQtPkdldEluZGV4KCksIHdzRmllbGQsIDApKSB7DQorICAgICAgICBwRmllbGQtPlJlc3RvcmUoKTsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEaXNwbGF5Ow0KKyAgICAgIHBGaWVsZC0+R2V0RGlzcGxheVRleHQod3NEaXNwbGF5KTsNCisgICAgICBSZXBsYWNlKG5CZ24sIG5FbmQgLSBuQmduICsgMSwgd3NEaXNwbGF5KTsNCisgICAgICBpZiAoIShtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTm9SZWRvVW5kbykpIHsNCisgICAgICAgIElGREVfVHh0RWR0RG9SZWNvcmQqIHBSZWNvcmQgPSBuZXcgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZSgNCisgICAgICAgICAgICB0aGlzLCBuU2VsU3RhcnQsIHBGaWVsZCwgbkNhcmV0SW5GaWVsZCwgbkJnbiwgbkVuZCAtIG5CZ24gKyAxLA0KKyAgICAgICAgICAgIHdzRGlzcGxheS5HZXRMZW5ndGgoKSwgd3NEZWwsIEZBTFNFKTsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzRG9SZWNvcmQ7DQorICAgICAgICBwUmVjb3JkLT5TZXJpYWxpemUoYnNEb1JlY29yZCk7DQorICAgICAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uX0FkZERvUmVjb3JkKHRoaXMsIGJzRG9SZWNvcmQpOw0KKyAgICAgICAgcFJlY29yZC0+UmVsZWFzZSgpOw0KKyAgICAgIH0NCisgICAgICBTZXRDYXJldFBvcyhuU2VsU3RhcnQsIGJCZWZvcmUpOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyNlbmRpZg0KKyAgICBpbnQzMl90IG5TZWxTdGFydDsNCisgICAgaW50MzJfdCBuU2VsQ291bnQ7DQorICAgIHdoaWxlIChuQ291bnRSYW5nZSA+IDApIHsNCisgICAgICBuU2VsQ291bnQgPSBHZXRTZWxSYW5nZSgtLW5Db3VudFJhbmdlLCBuU2VsU3RhcnQpOw0KKyAgICAgIEZERV9MUFRYVEVEVFNFTFJBTkdFIGxwVGVtcCA9IG1fU2VsUmFuZ2VQdHJBcnJbbkNvdW50UmFuZ2VdOw0KKyAgICAgIGRlbGV0ZSBscFRlbXA7DQorICAgICAgbV9TZWxSYW5nZVB0ckFyci5SZW1vdmVBdChuQ291bnRSYW5nZSk7DQorICAgICAgRGVsZXRlUmFuZ2VfRG9SZWNvcmQoblNlbFN0YXJ0LCBuU2VsQ291bnQsIFRSVUUpOw0KKyAgICB9DQorICAgIENsZWFyU2VsZWN0aW9uKCk7DQorICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25fVGV4dENoYW5nZWQodGhpcywgbV9DaGFuZ2VJbmZvKTsNCisgICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5Pbl9TZWxDaGFuZ2VkKHRoaXMpOw0KKyAgICBTZXRDYXJldFBvcyhuU2VsU3RhcnQsIFRSVUUpOw0KKyAgICByZXR1cm47DQorICB9DQorfQ0KK0lGREVfVHh0RWR0RG9SZWNvcmQqIElGREVfVHh0RWR0RG9SZWNvcmQ6OkNyZWF0ZSgNCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RvUmVjb3JkKSB7DQorICBjb25zdCBGWF9DSEFSKiBscEJ1ZiA9IGJzRG9SZWNvcmQuR2V0Q1N0cigpOw0KKyAgaW50MzJfdCBuVHlwZSA9ICooKGludDMyX3QqKWxwQnVmKTsNCisgIHN3aXRjaCAoblR5cGUpIHsNCisgICAgY2FzZSBGREVfVFhURURUX0RPUkVDT1JEX0lOUzoNCisgICAgICByZXR1cm4gbmV3IENGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0KGJzRG9SZWNvcmQpOw0KKyAgICBjYXNlIEZERV9UWFRFRFRfRE9SRUNPUkRfREVMOg0KKyAgICAgIHJldHVybiBuZXcgQ0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZShic0RvUmVjb3JkKTsNCisjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQorICAgIGNhc2UgRkRFX1RYVEVEVF9ET1JFQ09SRF9GT1JNQVRJTlM6DQorICAgICAgcmV0dXJuIG5ldyBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkSW5zZXJ0KGJzRG9SZWNvcmQpOw0KKyAgICBjYXNlIEZERV9UWFRFRFRfRE9SRUNPUkRfRk9STUFUREVMOg0KKyAgICAgIHJldHVybiBuZXcgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZShic0RvUmVjb3JkKTsNCisgICAgY2FzZSBGREVfVFhURURUX0RPUkVDT1JEX0ZPUk1BVFJFUDoNCisgICAgICByZXR1cm4gbmV3IENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRSZXBsYWNlKGJzRG9SZWNvcmQpOw0KKyNlbmRpZg0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0NGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0OjpDRkRFX1R4dEVkdERvUmVjb3JkX0luc2VydCgNCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RvUmVjb3JkKSB7DQorICBEZXNlcmlhbGl6ZShic0RvUmVjb3JkKTsNCit9DQorQ0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQ6OkNGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0KA0KKyAgICBDRkRFX1R4dEVkdEVuZ2luZSogcEVuZ2luZSwNCisgICAgaW50MzJfdCBuQ2FyZXQsDQorICAgIGNvbnN0IEZYX1dDSEFSKiBscFRleHQsDQorICAgIGludDMyX3Qgbkxlbmd0aCkNCisgICAgOiBtX3BFbmdpbmUocEVuZ2luZSksIG1fbkNhcmV0KG5DYXJldCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBFbmdpbmUpOw0KKyAgRlhfV0NIQVIqIGxwQnVmZmVyID0gbV93c0luc2VydC5HZXRCdWZmZXIobkxlbmd0aCk7DQorICBGWFNZU19tZW1jcHkobHBCdWZmZXIsIGxwVGV4dCwgbkxlbmd0aCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgbV93c0luc2VydC5SZWxlYXNlQnVmZmVyKCk7DQorfQ0KK0NGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0Ojp+Q0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQoKSB7fQ0KK3ZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQ6OlJlbGVhc2UoKSB7DQorICBkZWxldGUgdGhpczsNCit9DQorRlhfQk9PTCBDRkRFX1R4dEVkdERvUmVjb3JkX0luc2VydDo6VW5kbygpIHsNCisgIGlmIChtX3BFbmdpbmUtPklzU2VsZWN0KCkpIHsNCisgICAgbV9wRW5naW5lLT5DbGVhclNlbGVjdGlvbigpOw0KKyAgfQ0KKyAgbV9wRW5naW5lLT5Jbm5lcl9EZWxldGVSYW5nZShtX25DYXJldCwgbV93c0luc2VydC5HZXRMZW5ndGgoKSk7DQorICBGREVfVFhURURUUEFSQU1TJiBQYXJhbSA9IG1fcEVuZ2luZS0+bV9QYXJhbTsNCisgIG1fcEVuZ2luZS0+bV9DaGFuZ2VJbmZvLm5DaGFuZ2VUeXBlID0gRkRFX1RYVEVEVF9URVhUQ0hBTkdFX1RZUEVfRGVsZXRlOw0KKyAgbV9wRW5naW5lLT5tX0NoYW5nZUluZm8ud3NEZWxldGUgPSBtX3dzSW5zZXJ0Ow0KKyAgUGFyYW0ucEV2ZW50U2luay0+T25fVGV4dENoYW5nZWQobV9wRW5naW5lLCBtX3BFbmdpbmUtPm1fQ2hhbmdlSW5mbyk7DQorICBtX3BFbmdpbmUtPlNldENhcmV0UG9zKG1fbkNhcmV0LCBUUlVFKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0OjpSZWRvKCkgew0KKyAgbV9wRW5naW5lLT5Jbm5lcl9JbnNlcnQobV9uQ2FyZXQsIG1fd3NJbnNlcnQuY19zdHIoKSwgbV93c0luc2VydC5HZXRMZW5ndGgoKSk7DQorICBGREVfVFhURURUUEFSQU1TJiBQYXJhbSA9IG1fcEVuZ2luZS0+bV9QYXJhbTsNCisgIG1fcEVuZ2luZS0+bV9DaGFuZ2VJbmZvLm5DaGFuZ2VUeXBlID0gRkRFX1RYVEVEVF9URVhUQ0hBTkdFX1RZUEVfSW5zZXJ0Ow0KKyAgbV9wRW5naW5lLT5tX0NoYW5nZUluZm8ud3NEZWxldGUgPSBtX3dzSW5zZXJ0Ow0KKyAgUGFyYW0ucEV2ZW50U2luay0+T25fVGV4dENoYW5nZWQobV9wRW5naW5lLCBtX3BFbmdpbmUtPm1fQ2hhbmdlSW5mbyk7DQorICBtX3BFbmdpbmUtPlNldENhcmV0UG9zKG1fbkNhcmV0LCBGQUxTRSk7DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDRkRFX1R4dEVkdERvUmVjb3JkX0luc2VydDo6U2VyaWFsaXplKENGWF9CeXRlU3RyaW5nJiBic0RvUmVjb3JkKSBjb25zdCB7DQorICBDRlhfQXJjaGl2ZVNhdmVyIEFyY2hpdmVTYXZlcjsNCisgIEFyY2hpdmVTYXZlciA8PCBpbnQzMl90KEZERV9UWFRFRFRfRE9SRUNPUkRfSU5TKTsNCisgIEFyY2hpdmVTYXZlciA8PCAoaW50MzJfdCkodWludHB0cl90KW1fcEVuZ2luZTsNCisgIEFyY2hpdmVTYXZlciA8PCBtX25DYXJldDsNCisgIEFyY2hpdmVTYXZlciA8PCBtX3dzSW5zZXJ0Ow0KKyAgaW50MzJfdCBuTGVuZ3RoID0gQXJjaGl2ZVNhdmVyLkdldExlbmd0aCgpOw0KKyAgY29uc3QgdWludDhfdCogbHBTcmNCdWYgPSBBcmNoaXZlU2F2ZXIuR2V0QnVmZmVyKCk7DQorICBGWF9DSEFSKiBscERzdEJ1ZiA9IGJzRG9SZWNvcmQuR2V0QnVmZmVyKG5MZW5ndGgpOw0KKyAgRlhTWVNfbWVtY3B5KGxwRHN0QnVmLCBscFNyY0J1Ziwgbkxlbmd0aCk7DQorICBic0RvUmVjb3JkLlJlbGVhc2VCdWZmZXIobkxlbmd0aCk7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQ6OkRlc2VyaWFsaXplKA0KKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpIHsNCisgIENGWF9BcmNoaXZlTG9hZGVyIEFyY2hpdmVMb2FkZXIoKGNvbnN0IHVpbnQ4X3QqKWJzRG9SZWNvcmQuR2V0Q1N0cigpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic0RvUmVjb3JkLkdldExlbmd0aCgpKTsNCisgIGludDMyX3QgblR5cGUgPSAwOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBuVHlwZTsNCisgIEZYU1lTX2Fzc2VydChuVHlwZSA9PSBGREVfVFhURURUX0RPUkVDT1JEX0lOUyk7DQorICBpbnQzMl90IG5FbmdpbmUgPSAwOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBuRW5naW5lOw0KKyAgbV9wRW5naW5lID0gKENGREVfVHh0RWR0RW5naW5lKikodWludHB0cl90KW5FbmdpbmU7DQorICBBcmNoaXZlTG9hZGVyID4+IG1fbkNhcmV0Ow0KKyAgQXJjaGl2ZUxvYWRlciA+PiBtX3dzSW5zZXJ0Ow0KK30NCitDRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlOjpDRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlKA0KKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpIHsNCisgIERlc2VyaWFsaXplKGJzRG9SZWNvcmQpOw0KK30NCitDRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlOjpDRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlKA0KKyAgICBDRkRFX1R4dEVkdEVuZ2luZSogcEVuZ2luZSwNCisgICAgaW50MzJfdCBuSW5kZXgsDQorICAgIGludDMyX3QgbkNhcmV0LA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NSYW5nZSwNCisgICAgRlhfQk9PTCBiU2VsKQ0KKyAgICA6IG1fcEVuZ2luZShwRW5naW5lKSwNCisgICAgICBtX2JTZWwoYlNlbCksDQorICAgICAgbV9uSW5kZXgobkluZGV4KSwNCisgICAgICBtX25DYXJldChuQ2FyZXQpLA0KKyAgICAgIG1fd3NSYW5nZSh3c1JhbmdlKSB7DQorICBGWFNZU19hc3NlcnQocEVuZ2luZSk7DQorfQ0KK0NGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2U6On5DRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlKCkge30NCit2b2lkIENGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2U6OlJlbGVhc2UoKSB7DQorICBkZWxldGUgdGhpczsNCit9DQorRlhfQk9PTCBDRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlOjpVbmRvKCkgew0KKyAgaWYgKG1fcEVuZ2luZS0+SXNTZWxlY3QoKSkgew0KKyAgICBtX3BFbmdpbmUtPkNsZWFyU2VsZWN0aW9uKCk7DQorICB9DQorICBtX3BFbmdpbmUtPklubmVyX0luc2VydChtX25JbmRleCwgbV93c1JhbmdlLmNfc3RyKCksIG1fd3NSYW5nZS5HZXRMZW5ndGgoKSk7DQorICBpZiAobV9iU2VsKSB7DQorICAgIG1fcEVuZ2luZS0+QWRkU2VsUmFuZ2UobV9uSW5kZXgsIG1fd3NSYW5nZS5HZXRMZW5ndGgoKSk7DQorICB9DQorICBGREVfVFhURURUUEFSQU1TJiBQYXJhbSA9IG1fcEVuZ2luZS0+bV9QYXJhbTsNCisgIG1fcEVuZ2luZS0+bV9DaGFuZ2VJbmZvLm5DaGFuZ2VUeXBlID0gRkRFX1RYVEVEVF9URVhUQ0hBTkdFX1RZUEVfSW5zZXJ0Ow0KKyAgbV9wRW5naW5lLT5tX0NoYW5nZUluZm8ud3NEZWxldGUgPSBtX3dzUmFuZ2U7DQorICBQYXJhbS5wRXZlbnRTaW5rLT5Pbl9UZXh0Q2hhbmdlZChtX3BFbmdpbmUsIG1fcEVuZ2luZS0+bV9DaGFuZ2VJbmZvKTsNCisgIG1fcEVuZ2luZS0+U2V0Q2FyZXRQb3MobV9uQ2FyZXQsIFRSVUUpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZTo6UmVkbygpIHsNCisgIG1fcEVuZ2luZS0+SW5uZXJfRGVsZXRlUmFuZ2UobV9uSW5kZXgsIG1fd3NSYW5nZS5HZXRMZW5ndGgoKSk7DQorICBpZiAobV9iU2VsKSB7DQorICAgIG1fcEVuZ2luZS0+UmVtb3ZlU2VsUmFuZ2UobV9uSW5kZXgsIG1fd3NSYW5nZS5HZXRMZW5ndGgoKSk7DQorICB9DQorICBGREVfVFhURURUUEFSQU1TJiBQYXJhbSA9IG1fcEVuZ2luZS0+bV9QYXJhbTsNCisgIG1fcEVuZ2luZS0+bV9DaGFuZ2VJbmZvLm5DaGFuZ2VUeXBlID0gRkRFX1RYVEVEVF9URVhUQ0hBTkdFX1RZUEVfSW5zZXJ0Ow0KKyAgbV9wRW5naW5lLT5tX0NoYW5nZUluZm8ud3NEZWxldGUgPSBtX3dzUmFuZ2U7DQorICBQYXJhbS5wRXZlbnRTaW5rLT5Pbl9UZXh0Q2hhbmdlZChtX3BFbmdpbmUsIG1fcEVuZ2luZS0+bV9DaGFuZ2VJbmZvKTsNCisgIG1fcEVuZ2luZS0+U2V0Q2FyZXRQb3MobV9uSW5kZXgsIFRSVUUpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZTo6U2VyaWFsaXplKA0KKyAgICBDRlhfQnl0ZVN0cmluZyYgYnNEb1JlY29yZCkgY29uc3Qgew0KKyAgQ0ZYX0FyY2hpdmVTYXZlciBBcmNoaXZlU2F2ZXI7DQorICBBcmNoaXZlU2F2ZXIgPDwgaW50MzJfdChGREVfVFhURURUX0RPUkVDT1JEX0RFTCk7DQorICBBcmNoaXZlU2F2ZXIgPDwgKGludDMyX3QpKHVpbnRwdHJfdCltX3BFbmdpbmU7DQorICBBcmNoaXZlU2F2ZXIgPDwgKGludDMyX3QpbV9iU2VsOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fbkluZGV4Ow0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fbkNhcmV0Ow0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fd3NSYW5nZTsNCisgIGludDMyX3Qgbkxlbmd0aCA9IEFyY2hpdmVTYXZlci5HZXRMZW5ndGgoKTsNCisgIGNvbnN0IHVpbnQ4X3QqIGxwU3JjQnVmID0gQXJjaGl2ZVNhdmVyLkdldEJ1ZmZlcigpOw0KKyAgRlhfQ0hBUiogbHBEc3RCdWYgPSBic0RvUmVjb3JkLkdldEJ1ZmZlcihuTGVuZ3RoKTsNCisgIEZYU1lTX21lbWNweShscERzdEJ1ZiwgbHBTcmNCdWYsIG5MZW5ndGgpOw0KKyAgYnNEb1JlY29yZC5SZWxlYXNlQnVmZmVyKG5MZW5ndGgpOw0KK30NCit2b2lkIENGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2U6OkRlc2VyaWFsaXplKA0KKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpIHsNCisgIENGWF9BcmNoaXZlTG9hZGVyIEFyY2hpdmVMb2FkZXIoKGNvbnN0IHVpbnQ4X3QqKWJzRG9SZWNvcmQuR2V0Q1N0cigpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic0RvUmVjb3JkLkdldExlbmd0aCgpKTsNCisgIGludDMyX3QgblR5cGUgPSAwOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBuVHlwZTsNCisgIEZYU1lTX2Fzc2VydChuVHlwZSA9PSBGREVfVFhURURUX0RPUkVDT1JEX0RFTCk7DQorICBpbnQzMl90IG5FbmdpbmUgPSAwOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBuRW5naW5lOw0KKyAgbV9wRW5naW5lID0gKENGREVfVHh0RWR0RW5naW5lKikodWludHB0cl90KW5FbmdpbmU7DQorICBpbnQzMl90IGlTZWwgPSAwOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBpU2VsOw0KKyAgbV9iU2VsID0gISFpU2VsOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBtX25JbmRleDsNCisgIEFyY2hpdmVMb2FkZXIgPj4gbV9uQ2FyZXQ7DQorICBBcmNoaXZlTG9hZGVyID4+IG1fd3NSYW5nZTsNCit9DQorI2lmZGVmIEZERV9VU0VGT1JNQVRCTE9DSw0KK0NGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRJbnNlcnQ6OkNGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRJbnNlcnQoDQorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCkgew0KKyAgRGVzZXJpYWxpemUoYnNEb1JlY29yZCk7DQorfQ0KK0NGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRJbnNlcnQ6OkNGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRJbnNlcnQoDQorICAgIENGREVfVHh0RWR0RW5naW5lKiBwRW5naW5lLA0KKyAgICBpbnQzMl90IG5DYXJldCwNCisgICAgQ0ZERV9UeHRFZHRGaWVsZCogcEZpZWxkLA0KKyAgICBpbnQzMl90IG5JbmRleEluRmllbGQsDQorICAgIGludDMyX3QgbkZpZWxkQmduLA0KKyAgICBpbnQzMl90IG5PbGRGaWVsZExlbmd0aCwNCisgICAgaW50MzJfdCBuTmV3RmllbGRMZW5ndGgsDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0lucywNCisgICAgRlhfQk9PTCBiU2VsKQ0KKyAgICA6IG1fcEVuZ2luZShwRW5naW5lKSwNCisgICAgICBtX25DYXJldChuQ2FyZXQpLA0KKyAgICAgIG1fcEZpZWxkKHBGaWVsZCksDQorICAgICAgbV9uSW5kZXhJbkZpZWxkKG5JbmRleEluRmllbGQpLA0KKyAgICAgIG1fbkZpZWxkQmduKG5GaWVsZEJnbiksDQorICAgICAgbV9uT2xkRmllbGRMZW5ndGgobk9sZEZpZWxkTGVuZ3RoKSwNCisgICAgICBtX25OZXdGaWVsZExlbmd0aChuTmV3RmllbGRMZW5ndGgpLA0KKyAgICAgIG1fd3NJbnMod3NJbnMpLA0KKyAgICAgIG1fYlNlbChiU2VsKSB7DQorICBGWFNZU19hc3NlcnQocEVuZ2luZSk7DQorICBGWFNZU19hc3NlcnQocEZpZWxkKTsNCit9DQorQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZEluc2VydDo6fkNGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRJbnNlcnQoKSB7fQ0KK3ZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZEluc2VydDo6UmVsZWFzZSgpIHsNCisgIGRlbGV0ZSB0aGlzOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRJbnNlcnQ6OlVuZG8oKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c0RlbDsNCisgIGludDMyX3QgbkNhcmV0ID0gMDsNCisgIEZYX0JPT0wgYkJlZm9yZSA9IEZBTFNFOw0KKyAgaW50MzJfdCBuUmV0ID0gbV9wRmllbGQtPkRlbGV0ZShtX25JbmRleEluRmllbGQsIG1fd3NJbnMuR2V0TGVuZ3RoKCksIHdzRGVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2FyZXQsIGJCZWZvcmUpOw0KKyAgRlhTWVNfYXNzZXJ0KG5SZXQgIT0gRkRFX0ZPUk1BVF9GSUVMRF9ERUxFVEVfUkVUX0ZfSU5WQUxJREFURSAmJg0KKyAgICAgICAgICAgICAgIG5SZXQgIT0gRkRFX0ZPUk1BVF9GSUVMRF9ERUxFVEVfUkVUX0ZfQk9VTkRBUlkpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NEaXNwbGF5Ow0KKyAgbV9wRmllbGQtPkdldERpc3BsYXlUZXh0KHdzRGlzcGxheSk7DQorICBtX3BFbmdpbmUtPlJlcGxhY2UobV9uRmllbGRCZ24sIG1fbk5ld0ZpZWxkTGVuZ3RoLCB3c0Rpc3BsYXkpOw0KKyAgbV9wRW5naW5lLT5TZXRDYXJldFBvcyhtX25DYXJldCwgVFJVRSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkSW5zZXJ0OjpSZWRvKCkgew0KKyAgaW50MzJfdCBuQ2FyZXQgPSAwOw0KKyAgRlhfQk9PTCBiQmVmb3JlID0gRkFMU0U7DQorICBpbnQzMl90IG5SZXQgPSBtX3BGaWVsZC0+SW5zZXJ0KG1fbkluZGV4SW5GaWVsZCwgbV93c0lucywgbkNhcmV0LCBiQmVmb3JlKTsNCisgIEZYU1lTX2Fzc2VydChuUmV0ICE9IEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9GX0ZVTEwgJiYNCisgICAgICAgICAgICAgICBuUmV0ICE9IEZERV9GT1JNQVRfRklFTERfSU5TRVJUX1JFVF9GX0lOVkFMSURBVEUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NEaXNwbGF5Ow0KKyAgbV9wRmllbGQtPkdldERpc3BsYXlUZXh0KHdzRGlzcGxheSk7DQorICBtX3BFbmdpbmUtPlJlcGxhY2UobV9uRmllbGRCZ24sIG1fbk9sZEZpZWxkTGVuZ3RoLCB3c0Rpc3BsYXkpOw0KKyAgbV9wRW5naW5lLT5TZXRDYXJldFBvcyhtX25DYXJldCArIG1fd3NJbnMuR2V0TGVuZ3RoKCksIFRSVUUpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZEluc2VydDo6U2VyaWFsaXplKA0KKyAgICBDRlhfQnl0ZVN0cmluZyYgYnNEb1JlY29yZCkgY29uc3Qgew0KKyAgQ0ZYX0FyY2hpdmVTYXZlciBBcmNoaXZlU2F2ZXI7DQorICBBcmNoaXZlU2F2ZXIgPDwgaW50MzJfdChGREVfVFhURURUX0RPUkVDT1JEX0ZPUk1BVElOUyk7DQorICBBcmNoaXZlU2F2ZXIgPDwgaW50MzJfdChtX3BFbmdpbmUpOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fbkNhcmV0Ow0KKyAgQXJjaGl2ZVNhdmVyIDw8IGludDMyX3QobV9wRmllbGQpOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fbkluZGV4SW5GaWVsZDsNCisgIEFyY2hpdmVTYXZlciA8PCBtX25GaWVsZEJnbjsNCisgIEFyY2hpdmVTYXZlciA8PCBtX25PbGRGaWVsZExlbmd0aDsNCisgIEFyY2hpdmVTYXZlciA8PCBtX25OZXdGaWVsZExlbmd0aDsNCisgIEFyY2hpdmVTYXZlciA8PCBtX3dzSW5zOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fYlNlbDsNCisgIGludDMyX3Qgbkxlbmd0aCA9IEFyY2hpdmVTYXZlci5HZXRMZW5ndGgoKTsNCisgIGNvbnN0IHVpbnQ4X3QqIGxwU3JjQnVmID0gQXJjaGl2ZVNhdmVyLkdldEJ1ZmZlcigpOw0KKyAgRlhfQ0hBUiogbHBEc3RCdWYgPSBic0RvUmVjb3JkLkdldEJ1ZmZlcihuTGVuZ3RoKTsNCisgIEZYU1lTX21lbWNweShscERzdEJ1ZiwgbHBTcmNCdWYsIG5MZW5ndGgpOw0KKyAgYnNEb1JlY29yZC5SZWxlYXNlQnVmZmVyKG5MZW5ndGgpOw0KK30NCit2b2lkIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRJbnNlcnQ6OkRlc2VyaWFsaXplKA0KKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpIHsNCisgIENGWF9BcmNoaXZlTG9hZGVyIEFyY2hpdmVMb2FkZXIoKGNvbnN0IHVpbnQ4X3QqKWJzRG9SZWNvcmQuR2V0Q1N0cigpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic0RvUmVjb3JkLkdldExlbmd0aCgpKTsNCisgIGludDMyX3QgblR5cGUgPSAwOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBuVHlwZTsNCisgIEZYU1lTX2Fzc2VydChuVHlwZSA9PSBGREVfVFhURURUX0RPUkVDT1JEX0ZPUk1BVElOUyk7DQorICBpbnQzMl90IG5FbmdpbmUgPSAwOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBuRW5naW5lOw0KKyAgbV9wRW5naW5lID0gKENGREVfVHh0RWR0RW5naW5lKikodWludHB0cl90KW5FbmdpbmU7DQorICBBcmNoaXZlTG9hZGVyID4+IG1fbkNhcmV0Ow0KKyAgaW50MzJfdCBuRmllbGQgPSAwOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBuRmllbGQ7DQorICBtX3BGaWVsZCA9IChDRkRFX1R4dEVkdEZpZWxkKiluRmllbGQ7DQorICBBcmNoaXZlTG9hZGVyID4+IG1fbkluZGV4SW5GaWVsZDsNCisgIEFyY2hpdmVMb2FkZXIgPj4gbV9uRmllbGRCZ247DQorICBBcmNoaXZlTG9hZGVyID4+IG1fbk9sZEZpZWxkTGVuZ3RoOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBtX25OZXdGaWVsZExlbmd0aDsNCisgIEFyY2hpdmVMb2FkZXIgPj4gbV93c0luczsNCisgIEFyY2hpdmVMb2FkZXIgPj4gbV9iU2VsOw0KK30NCitDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlOjpDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlKA0KKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpIHsNCisgIERlc2VyaWFsaXplKGJzRG9SZWNvcmQpOw0KK30NCitDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlOjpDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlKA0KKyAgICBDRkRFX1R4dEVkdEVuZ2luZSogcEVuZ2luZSwNCisgICAgaW50MzJfdCBuQ2FyZXQsDQorICAgIENGREVfVHh0RWR0RmllbGQqIHBGaWVsZCwNCisgICAgaW50MzJfdCBuSW5kZXhJbkZpZWxkLA0KKyAgICBpbnQzMl90IG5GaWVsZEJnbiwNCisgICAgaW50MzJfdCBuT2xkTGVuZ3RoLA0KKyAgICBpbnQzMl90IG5OZXdMZW5ndGgsDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RlbCwNCisgICAgRlhfQk9PTCBiU2VsKQ0KKyAgICA6IG1fcEVuZ2luZShwRW5naW5lKSwNCisgICAgICBtX25DYXJldChuQ2FyZXQpLA0KKyAgICAgIG1fcEZpZWxkKHBGaWVsZCksDQorICAgICAgbV9uSW5kZXhJbkZpZWxkKG5JbmRleEluRmllbGQpLA0KKyAgICAgIG1fbkZpZWxkQmduKG5GaWVsZEJnbiksDQorICAgICAgbV9uT2xkRmllbGRMZW5ndGgobk9sZExlbmd0aCksDQorICAgICAgbV9uTmV3RmllbGRMZW5ndGgobk5ld0xlbmd0aCksDQorICAgICAgbV93c0RlbCh3c0RlbCksDQorICAgICAgbV9iU2VsKGJTZWwpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BFbmdpbmUpOw0KKyAgRlhTWVNfYXNzZXJ0KG1fcEZpZWxkKTsNCit9DQorQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZTo6fkNGREVfVHh0RWR0RG9SZWNvcmRfRmllbGREZWxldGUoKSB7fQ0KK3ZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZTo6UmVsZWFzZSgpIHsNCisgIGRlbGV0ZSB0aGlzOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGREZWxldGU6OlVuZG8oKSB7DQorICBpbnQzMl90IG5DYXJldCA9IDA7DQorICBGWF9CT09MIGJCZWZvcmUgPSBGQUxTRTsNCisgIGludDMyX3QgblJldCA9IG1fcEZpZWxkLT5JbnNlcnQobV9uSW5kZXhJbkZpZWxkLCBtX3dzRGVsLCBuQ2FyZXQsIGJCZWZvcmUpOw0KKyAgRlhTWVNfYXNzZXJ0KG5SZXQgIT0gRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX0ZfRlVMTCAmJg0KKyAgICAgICAgICAgICAgIG5SZXQgIT0gRkRFX0ZPUk1BVF9GSUVMRF9JTlNFUlRfUkVUX0ZfSU5WQUxJREFURSk7DQorICBDRlhfV2lkZVN0cmluZyB3c0Rpc3BsYXk7DQorICBtX3BGaWVsZC0+R2V0RGlzcGxheVRleHQod3NEaXNwbGF5KTsNCisgIG1fcEVuZ2luZS0+UmVwbGFjZShtX25GaWVsZEJnbiwgbV9uTmV3RmllbGRMZW5ndGgsIHdzRGlzcGxheSk7DQorICBtX3BFbmdpbmUtPlNldENhcmV0UG9zKG1fbkNhcmV0LCBUUlVFKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGREZWxldGU6OlJlZG8oKSB7DQorICBpbnQzMl90IG5DYXJldCA9IDA7DQorICBGWF9CT09MIGJCZWZvcmUgPSAwOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NEZWw7DQorICBpbnQzMl90IG5SZXQgPSBtX3BGaWVsZC0+RGVsZXRlKG1fbkluZGV4SW5GaWVsZCwgbV93c0RlbC5HZXRMZW5ndGgoKSwgd3NEZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DYXJldCwgYkJlZm9yZSk7DQorICBGWFNZU19hc3NlcnQoblJldCAhPSBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfRl9JTlZBTElEQVRFICYmDQorICAgICAgICAgICAgICAgblJldCAhPSBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfRl9CT1VOREFSWSk7DQorICBDRlhfV2lkZVN0cmluZyB3c0Rpc3BsYXk7DQorICBtX3BGaWVsZC0+R2V0RGlzcGxheVRleHQod3NEaXNwbGF5KTsNCisgIG1fcEVuZ2luZS0+UmVwbGFjZShtX25GaWVsZEJnbiwgbV9uT2xkRmllbGRMZW5ndGgsIHdzRGlzcGxheSk7DQorICBtX3BFbmdpbmUtPlNldENhcmV0UG9zKG1fbkNhcmV0IC0gbV93c0RlbC5HZXRMZW5ndGgoKSwgVFJVRSk7DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlOjpTZXJpYWxpemUoDQorICAgIENGWF9CeXRlU3RyaW5nJiBic0RvUmVjb3JkKSBjb25zdCB7DQorICBDRlhfQXJjaGl2ZVNhdmVyIEFyY2hpdmVTYXZlcjsNCisgIEFyY2hpdmVTYXZlciA8PCBpbnQzMl90KEZERV9UWFRFRFRfRE9SRUNPUkRfRk9STUFUREVMKTsNCisgIEFyY2hpdmVTYXZlciA8PCBpbnQzMl90KG1fcEVuZ2luZSk7DQorICBBcmNoaXZlU2F2ZXIgPDwgbV9uQ2FyZXQ7DQorICBBcmNoaXZlU2F2ZXIgPDwgaW50MzJfdChtX3BGaWVsZCk7DQorICBBcmNoaXZlU2F2ZXIgPDwgbV9uSW5kZXhJbkZpZWxkOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fbkZpZWxkQmduOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fbk9sZEZpZWxkTGVuZ3RoOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fbk5ld0ZpZWxkTGVuZ3RoOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fd3NEZWw7DQorICBBcmNoaXZlU2F2ZXIgPDwgbV9iU2VsOw0KKyAgaW50MzJfdCBuTGVuZ3RoID0gQXJjaGl2ZVNhdmVyLkdldExlbmd0aCgpOw0KKyAgY29uc3QgdWludDhfdCogbHBTcmNCdWYgPSBBcmNoaXZlU2F2ZXIuR2V0QnVmZmVyKCk7DQorICBGWF9DSEFSKiBscERzdEJ1ZiA9IGJzRG9SZWNvcmQuR2V0QnVmZmVyKG5MZW5ndGgpOw0KKyAgRlhTWVNfbWVtY3B5KGxwRHN0QnVmLCBscFNyY0J1Ziwgbkxlbmd0aCk7DQorICBic0RvUmVjb3JkLlJlbGVhc2VCdWZmZXIobkxlbmd0aCk7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZTo6RGVzZXJpYWxpemUoDQorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCkgew0KKyAgQ0ZYX0FyY2hpdmVMb2FkZXIgQXJjaGl2ZUxvYWRlcigoY29uc3QgdWludDhfdCopYnNEb1JlY29yZC5HZXRDU3RyKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzRG9SZWNvcmQuR2V0TGVuZ3RoKCkpOw0KKyAgaW50MzJfdCBuVHlwZSA9IDA7DQorICBBcmNoaXZlTG9hZGVyID4+IG5UeXBlOw0KKyAgRlhTWVNfYXNzZXJ0KG5UeXBlID09IEZERV9UWFRFRFRfRE9SRUNPUkRfRk9STUFUREVMKTsNCisgIGludDMyX3QgbkVuZ2luZSA9IDA7DQorICBBcmNoaXZlTG9hZGVyID4+IG5FbmdpbmU7DQorICBtX3BFbmdpbmUgPSAoQ0ZERV9UeHRFZHRFbmdpbmUqKSh1aW50cHRyX3QpbkVuZ2luZTsNCisgIEFyY2hpdmVMb2FkZXIgPj4gbV9uQ2FyZXQ7DQorICBpbnQzMl90IG5GaWVsZCA9IDA7DQorICBBcmNoaXZlTG9hZGVyID4+IG5GaWVsZDsNCisgIG1fcEZpZWxkID0gKENGREVfVHh0RWR0RmllbGQqKW5GaWVsZDsNCisgIEFyY2hpdmVMb2FkZXIgPj4gbV9uSW5kZXhJbkZpZWxkOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBtX25GaWVsZEJnbjsNCisgIEFyY2hpdmVMb2FkZXIgPj4gbV9uT2xkRmllbGRMZW5ndGg7DQorICBBcmNoaXZlTG9hZGVyID4+IG1fbk5ld0ZpZWxkTGVuZ3RoOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBtX3dzRGVsOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBtX2JTZWw7DQorfQ0KK0NGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRSZXBsYWNlOjpDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkUmVwbGFjZSgNCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RvUmVjb3JkKSB7DQorICBEZXNlcmlhbGl6ZShic0RvUmVjb3JkKTsNCit9DQorQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2U6OkNGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRSZXBsYWNlKA0KKyAgICBDRkRFX1R4dEVkdEVuZ2luZSogcEVuZ2luZSwNCisgICAgaW50MzJfdCBuQ2FyZXQsDQorICAgIGludDMyX3Qgbk5ld0NhcmV0LA0KKyAgICBDRkRFX1R4dEVkdEZpZWxkKiBwRmllbGQsDQorICAgIGludDMyX3QgbkluZGV4SW5GaWVsZCwNCisgICAgaW50MzJfdCBuRmllbGRCZ24sDQorICAgIGludDMyX3QgbkZpZWxkTmV3TGVuZ3RoLA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEZWwsDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0lucywNCisgICAgRlhfQk9PTCBiU2VsKQ0KKyAgICA6IG1fcEVuZ2luZShwRW5naW5lKSwNCisgICAgICBtX25DYXJldChuQ2FyZXQpLA0KKyAgICAgIG1fbk5ld0NhcmV0KG5OZXdDYXJldCksDQorICAgICAgbV9wRmllbGQocEZpZWxkKSwNCisgICAgICBtX25JbmRleEluRmllbGQobkluZGV4SW5GaWVsZCksDQorICAgICAgbV9uRmllbGRCZ24obkZpZWxkQmduKSwNCisgICAgICBtX25GaWVsZE5ld0xlbmd0aChuRmllbGROZXdMZW5ndGgpLA0KKyAgICAgIG1fd3NEZWwod3NEZWwpLA0KKyAgICAgIG1fd3NJbnMod3NJbnMpLA0KKyAgICAgIG1fYlNlbChiU2VsKSB7DQorICBGWFNZU19hc3NlcnQobV9wRW5naW5lKTsNCisgIEZYU1lTX2Fzc2VydChtX3BGaWVsZCk7DQorfQ0KK0NGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRSZXBsYWNlOjp+Q0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2UoKSB7fQ0KK3ZvaWQgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2U6OlJlbGVhc2UoKSB7DQorICBkZWxldGUgdGhpczsNCit9DQorRlhfQk9PTCBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkUmVwbGFjZTo6VW5kbygpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzRGVsOw0KKyAgaW50MzJfdCBuQ2FyZXQgPSAwOw0KKyAgRlhfQk9PTCBiQmVmb3JlID0gRkFMU0U7DQorICBpbnQzMl90IG5SZXQgPSBtX3BGaWVsZC0+UmVwbGFjZShtX25JbmRleEluRmllbGQsIG1fd3NJbnMuR2V0TGVuZ3RoKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3dzRGVsLCB3c0RlbCwgbkNhcmV0LCBiQmVmb3JlKTsNCisgIEZYU1lTX2Fzc2VydChuUmV0ICE9IEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9GX0lOVkFMSURBVEUgJiYNCisgICAgICAgICAgICAgICBuUmV0ICE9IEZERV9GT1JNQVRfRklFTERfREVMRVRFX1JFVF9GX0JPVU5EQVJZKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzRGlzcGxheTsNCisgIG1fcEZpZWxkLT5HZXREaXNwbGF5VGV4dCh3c0Rpc3BsYXkpOw0KKyAgbV9wRW5naW5lLT5SZXBsYWNlKG1fbkZpZWxkQmduLCBtX25GaWVsZE5ld0xlbmd0aCwgd3NEaXNwbGF5KTsNCisgIG1fcEVuZ2luZS0+U2V0Q2FyZXRQb3MobV9uQ2FyZXQsIFRSVUUpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2U6OlJlZG8oKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c0RlbDsNCisgIGludDMyX3QgbkNhcmV0ID0gMDsNCisgIEZYX0JPT0wgYkJlZm9yZSA9IEZBTFNFOw0KKyAgaW50MzJfdCBuUmV0ID0gbV9wRmllbGQtPlJlcGxhY2UobV9uSW5kZXhJbkZpZWxkLCBtX3dzRGVsLkdldExlbmd0aCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV93c0lucywgd3NEZWwsIG5DYXJldCwgYkJlZm9yZSk7DQorICBGWFNZU19hc3NlcnQoblJldCAhPSBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfRl9JTlZBTElEQVRFICYmDQorICAgICAgICAgICAgICAgblJldCAhPSBGREVfRk9STUFUX0ZJRUxEX0RFTEVURV9SRVRfRl9CT1VOREFSWSk7DQorICBDRlhfV2lkZVN0cmluZyB3c0Rpc3BsYXk7DQorICBtX3BGaWVsZC0+R2V0RGlzcGxheVRleHQod3NEaXNwbGF5KTsNCisgIG1fcEVuZ2luZS0+UmVwbGFjZShtX25GaWVsZEJnbiwgbV9uRmllbGROZXdMZW5ndGgsIHdzRGlzcGxheSk7DQorICBtX3BFbmdpbmUtPlNldENhcmV0UG9zKG1fbk5ld0NhcmV0LCBUUlVFKTsNCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRSZXBsYWNlOjpTZXJpYWxpemUoDQorICAgIENGWF9CeXRlU3RyaW5nJiBic0RvUmVjb3JkKSBjb25zdCB7DQorICBDRlhfQXJjaGl2ZVNhdmVyIEFyY2hpdmVTYXZlcjsNCisgIEFyY2hpdmVTYXZlciA8PCBpbnQzMl90KEZERV9UWFRFRFRfRE9SRUNPUkRfRk9STUFUUkVQKTsNCisgIEFyY2hpdmVTYXZlciA8PCBpbnQzMl90KG1fcEVuZ2luZSk7DQorICBBcmNoaXZlU2F2ZXIgPDwgbV9uQ2FyZXQ7DQorICBBcmNoaXZlU2F2ZXIgPDwgbV9uTmV3Q2FyZXQ7DQorICBBcmNoaXZlU2F2ZXIgPDwgaW50MzJfdChtX3BGaWVsZCk7DQorICBBcmNoaXZlU2F2ZXIgPDwgbV9uSW5kZXhJbkZpZWxkOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fbkZpZWxkQmduOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fbkZpZWxkTmV3TGVuZ3RoOw0KKyAgQXJjaGl2ZVNhdmVyIDw8IG1fd3NEZWw7DQorICBBcmNoaXZlU2F2ZXIgPDwgbV93c0luczsNCisgIEFyY2hpdmVTYXZlciA8PCBtX2JTZWw7DQorICBpbnQzMl90IG5MZW5ndGggPSBBcmNoaXZlU2F2ZXIuR2V0TGVuZ3RoKCk7DQorICBjb25zdCB1aW50OF90KiBscFNyY0J1ZiA9IEFyY2hpdmVTYXZlci5HZXRCdWZmZXIoKTsNCisgIEZYX0NIQVIqIGxwRHN0QnVmID0gYnNEb1JlY29yZC5HZXRCdWZmZXIobkxlbmd0aCk7DQorICBGWFNZU19tZW1jcHkobHBEc3RCdWYsIGxwU3JjQnVmLCBuTGVuZ3RoKTsNCisgIGJzRG9SZWNvcmQuUmVsZWFzZUJ1ZmZlcihuTGVuZ3RoKTsNCit9DQordm9pZCBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkUmVwbGFjZTo6RGVzZXJpYWxpemUoDQorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCkgew0KKyAgQ0ZYX0FyY2hpdmVMb2FkZXIgQXJjaGl2ZUxvYWRlcigoY29uc3QgdWludDhfdCopYnNEb1JlY29yZC5HZXRDU3RyKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzRG9SZWNvcmQuR2V0TGVuZ3RoKCkpOw0KKyAgaW50MzJfdCBuVHlwZSA9IDA7DQorICBBcmNoaXZlTG9hZGVyID4+IG5UeXBlOw0KKyAgRlhTWVNfYXNzZXJ0KG5UeXBlID09IEZERV9UWFRFRFRfRE9SRUNPUkRfRk9STUFUUkVQKTsNCisgIGludDMyX3QgbkVuZ2luZSA9IDA7DQorICBBcmNoaXZlTG9hZGVyID4+IG5FbmdpbmU7DQorICBtX3BFbmdpbmUgPSAoQ0ZERV9UeHRFZHRFbmdpbmUqKSh1aW50cHRyX3QpbkVuZ2luZTsNCisgIEFyY2hpdmVMb2FkZXIgPj4gbV9uQ2FyZXQ7DQorICBBcmNoaXZlTG9hZGVyID4+IG1fbk5ld0NhcmV0Ow0KKyAgaW50MzJfdCBuRmllbGQgPSAwOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBuRmllbGQ7DQorICBtX3BGaWVsZCA9IChDRkRFX1R4dEVkdEZpZWxkKiluRmllbGQ7DQorICBBcmNoaXZlTG9hZGVyID4+IG1fbkluZGV4SW5GaWVsZDsNCisgIEFyY2hpdmVMb2FkZXIgPj4gbV9uRmllbGRCZ247DQorICBBcmNoaXZlTG9hZGVyID4+IG1fbkZpZWxkTmV3TGVuZ3RoOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBtX3dzRGVsOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBtX3dzSW5zOw0KKyAgQXJjaGl2ZUxvYWRlciA+PiBtX2JTZWw7DQorfQ0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGVuZ2luZS5oIGIveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0ZW5naW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg2MTY4ZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdGVuZ2luZS5oCkBAIC0wLDAgKzEsMzcyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZERV9UWFRFRFRFTkdJTkVfSA0KKyNkZWZpbmUgX0ZERV9UWFRFRFRFTkdJTkVfSA0KK2NsYXNzIENGREVfVHh0RWR0QnVmOw0KK2NsYXNzIENGREVfVHh0RWR0UGFnZTsNCitjbGFzcyBJRlhfVHh0QnJlYWs7DQorY2xhc3MgQ0ZERV9UeHRFZHRQYXJhZzsNCitjbGFzcyBDRkRFX1R4dEVkdEtNUE1hdGNoOw0KK2NsYXNzIElGREVfVHh0RWR0Rm9ybWF0b3I7DQorY2xhc3MgQ0ZERV9UeHRFZHRGaWVsZDsNCitjbGFzcyBDRkRFX1R4dEVkdEJsb2NrOw0KK2NsYXNzIElGWF9DaGFySXRlcjsNCitjbGFzcyBDRkRFX1R4dEVkdEVuZ2luZTsNCitjbGFzcyBDRkRFX1R4dEVkdERvUmVjb3JkX0luc2VydDsNCitjbGFzcyBDRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlOw0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCitjbGFzcyBDRkRFX1R4dEVkdERvUmVjb3JkX0Zvcm1hdEluc2VydDsNCitjbGFzcyBDRkRFX1R4dEVkdERvUmVjb3JkX0Zvcm1hdERlbGV0ZTsNCitjbGFzcyBDRkRFX1R4dEVkdERvUmVjb3JkX0Zvcm1hdFJlcGxhY2U7DQorY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZEluc2VydDsNCitjbGFzcyBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlOw0KK2NsYXNzIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRSZXBsYWNlOw0KKyNlbmRpZg0KK2NsYXNzIElGREVfVHh0RWR0RG9SZWNvcmQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZERV9UeHRFZHREb1JlY29yZCogQ3JlYXRlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCk7DQorICB2aXJ0dWFsIH5JRkRFX1R4dEVkdERvUmVjb3JkKCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFJlZG8oKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgVW5kbygpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXJpYWxpemUoQ0ZYX0J5dGVTdHJpbmcmIGJzRG9SZWNvcmQpIGNvbnN0ID0gMDsNCit9Ow0KK2NsYXNzIENGREVfVHh0RWR0RW5naW5lIDogcHVibGljIElGREVfVHh0RWR0RW5naW5lIHsNCisgIGZyaWVuZCBjbGFzcyBDRkRFX1R4dEVkdERvUmVjb3JkX0luc2VydDsNCisgIGZyaWVuZCBjbGFzcyBDRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlOw0KKyAgZnJpZW5kIGNsYXNzIENGREVfVHh0RWR0UGFnZTsNCisjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQorICBmcmllbmQgY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9Gb3JtYXRJbnNlcnQ7DQorICBmcmllbmQgY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9Gb3JtYXREZWxldGU7DQorICBmcmllbmQgY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9Gb3JtYXRSZXBsYWNlOw0KKyAgZnJpZW5kIGNsYXNzIENGREVfVHh0RWR0QmxvY2s7DQorI2VuZGlmDQorICBzdHJ1Y3QgX0ZERV9UWFRFRFRTRUxSQU5HRSB7DQorICAgIGludDMyX3QgblN0YXJ0Ow0KKyAgICBpbnQzMl90IG5Db3VudDsNCisgIH07DQorICB0eXBlZGVmIF9GREVfVFhURURUU0VMUkFOR0UgRkRFX1RYVEVEVFNFTFJBTkdFOw0KKyAgdHlwZWRlZiBfRkRFX1RYVEVEVFNFTFJBTkdFKiBGREVfTFBUWFRFRFRTRUxSQU5HRTsNCisgIHN0cnVjdCBfRkRFX1RYVEVEVFBBUkFHUE9TIHsNCisgICAgaW50MzJfdCBuUGFyYWdJbmRleDsNCisgICAgaW50MzJfdCBuQ2hhckluZGV4Ow0KKyAgfTsNCisgIHR5cGVkZWYgX0ZERV9UWFRFRFRQQVJBR1BPUyBGREVfVFhURURUUEFSQUdQT1M7DQorICB0eXBlZGVmIF9GREVfVFhURURUUEFSQUdQT1MqIEZERV9MUFRYVEVEVFBBUkFHUE9TOw0KKw0KKyBwdWJsaWM6DQorICBDRkRFX1R4dEVkdEVuZ2luZSgpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKTsNCisNCisgIHZpcnR1YWwgdm9pZCBTZXRFZGl0UGFyYW1zKGNvbnN0IEZERV9UWFRFRFRQQVJBTVMmIHBhcmFtcyk7DQorICB2aXJ0dWFsIGNvbnN0IEZERV9UWFRFRFRQQVJBTVMqIEdldEVkaXRQYXJhbXMoKSBjb25zdDsNCisNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudFBhZ2VzKCkgY29uc3Q7DQorICB2aXJ0dWFsIElGREVfVHh0RWR0UGFnZSogR2V0UGFnZShpbnQzMl90IG5JbmRleCk7DQorDQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0QnVmQ2h1bmtTaXplKGludDMyX3QgbkNodW5rU2l6ZSk7DQorICB2aXJ0dWFsIHZvaWQgU2V0VGV4dEJ5U3RyZWFtKElGWF9TdHJlYW0qIHBTdHJlYW0pOw0KKyAgdmlydHVhbCB2b2lkIFNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0VGV4dExlbmd0aCgpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEdldFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQgPSAtMSk7DQorICB2aXJ0dWFsIHZvaWQgQ2xlYXJUZXh0KCk7DQorDQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q2FyZXRSZWN0KENGWF9SZWN0RiYgcnRDYXJldCkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q2FyZXRQb3MoKSBjb25zdDsNCisgIHZpcnR1YWwgaW50MzJfdCBTZXRDYXJldFBvcyhpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiQmVmb3JlKTsNCisgIHZpcnR1YWwgaW50MzJfdCBNb3ZlQ2FyZXRQb3MoRkRFX1RYVEVEVE1PVkVDQVJFVCBlTW92ZUNhcmV0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDdHJsID0gRkFMU0UpOw0KKyAgdmlydHVhbCB2b2lkIExvY2soKTsNCisgIHZpcnR1YWwgdm9pZCBVbmxvY2soKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0xvY2tlZCgpIGNvbnN0Ow0KKw0KKyAgdmlydHVhbCBpbnQzMl90IEluc2VydChpbnQzMl90IG5TdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuZ3RoKTsNCisgIHZpcnR1YWwgaW50MzJfdCBEZWxldGUoaW50MzJfdCBuU3RhcnQsIEZYX0JPT0wgYkJhY2tzcGFjZSA9IEZBTFNFKTsNCisgIHZpcnR1YWwgaW50MzJfdCBEZWxldGVSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQgPSAtMSk7DQorICB2aXJ0dWFsIGludDMyX3QgUmVwbGFjZShpbnQzMl90IG5TdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbkxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1JlcGxhY2UpOw0KKw0KKyAgdmlydHVhbCB2b2lkIFNldExpbWl0KGludDMyX3QgbkxpbWl0KTsNCisgIHZpcnR1YWwgdm9pZCBTZXRBbGlhc0NoYXIoRlhfV0NIQVIgd2NBbGlhcyk7DQorICB2aXJ0dWFsIHZvaWQgU2V0Rm9ybWF0QmxvY2soaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQmxvY2tGb3JtYXQpOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50RWRpdEJsb2NrcygpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEdldEVkaXRCbG9ja1RleHQoaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NCbG9ja1RleHQpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50RWRpdEZpZWxkcyhpbnQzMl90IG5CbG9ja0luZGV4KSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBHZXRFZGl0RmllbGRUZXh0KGludDMyX3QgbkJsb2NrSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5GaWVsZEluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRmllbGRUZXh0KSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBTdGFydEVkaXQoKTsNCisgIHZpcnR1YWwgdm9pZCBFbmRFZGl0KCk7DQorDQorICB2b2lkIFJlbW92ZVNlbFJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCA9IC0xKTsNCisNCisgIHZpcnR1YWwgdm9pZCBBZGRTZWxSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQgPSAtMSk7DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRTZWxSYW5nZXMoKTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRTZWxSYW5nZShpbnQzMl90IG5JbmRleCwgaW50MzJfdCYgblN0YXJ0KTsNCisgIHZpcnR1YWwgdm9pZCBDbGVhclNlbGVjdGlvbigpOw0KKw0KKyAgdmlydHVhbCBGWF9CT09MIFJlZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlZG8pOw0KKyAgdmlydHVhbCBGWF9CT09MIFVuZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1VuZG8pOw0KKw0KKyAgdmlydHVhbCBpbnQzMl90IFN0YXJ0TGF5b3V0KCk7DQorICB2aXJ0dWFsIGludDMyX3QgRG9MYXlvdXQoSUZYX1BhdXNlKiBwUGF1c2UpOw0KKyAgdmlydHVhbCB2b2lkIEVuZExheW91dCgpOw0KKw0KKyAgdmlydHVhbCBGWF9CT09MIE9wdGltaXplKElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCk7DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRQYXJhZ3MoKSBjb25zdDsNCisgIHZpcnR1YWwgSUZERV9UeHRFZHRQYXJhZyogR2V0UGFyYWcoaW50MzJfdCBuUGFyYWdJbmRleCkgY29uc3Q7DQorICB2aXJ0dWFsIElGWF9DaGFySXRlciogQ3JlYXRlQ2hhckl0ZXIoKTsNCisgIElGREVfVHh0RWR0QnVmKiBHZXRUZXh0QnVmKCkgY29uc3Q7DQorICBpbnQzMl90IEdldFRleHRCdWZMZW5ndGgoKSBjb25zdDsNCisgIElGWF9UeHRCcmVhayogR2V0VGV4dEJyZWFrKCkgY29uc3Q7DQorICBpbnQzMl90IEdldExpbmVDb3VudCgpIGNvbnN0Ow0KKyAgaW50MzJfdCBHZXRQYWdlTGluZUNvdW50KCkgY29uc3Q7DQorDQorICBpbnQzMl90IExpbmUyUGFyYWcoaW50MzJfdCBuU3RhcnRQYXJhZywNCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TdGFydExpbmVvZlBhcmFnLA0KKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkxpbmVJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuU3RhcnRMaW5lKSBjb25zdDsNCisgIEZYX1dDSEFSIEdldEFsaWFzQ2hhcigpIGNvbnN0IHsgcmV0dXJuIG1fd2NBbGlhc0NoYXI7IH0NCisNCisgcHJvdGVjdGVkOg0KKyAgdmlydHVhbCB+Q0ZERV9UeHRFZHRFbmdpbmUoKTsNCisNCisgcHJpdmF0ZToNCisgIHZvaWQgSW5uZXJfSW5zZXJ0KGludDMyX3QgblN0YXJ0LCBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LCBpbnQzMl90IG5MZW5ndGgpOw0KKyNpZmRlZiBGREVfVVNFRk9STUFUQkxPQ0sNCisgIHZvaWQgUmF3SW5zZXJ0KGludDMyX3QgblN0YXJ0LCBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LCBpbnQzMl90IG5MZW5ndGgpOw0KKyNlbmRpZg0KKyAgdm9pZCBHZXRQcmVEZWxldGVUZXh0KENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuZ3RoKTsNCisgIHZvaWQgR2V0UHJlSW5zZXJ0VGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBscFRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuZ3RoKTsNCisgIHZvaWQgR2V0UHJlUmVwbGFjZVRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbk9yaWdpbkxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuZ3RoKTsNCisNCisgIHZvaWQgSW5uZXJfRGVsZXRlUmFuZ2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50ID0gLTEpOw0KKyAgdm9pZCBEZWxldGVSYW5nZV9Eb1JlY29yZChpbnQzMl90IG5TdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNlbCA9IEZBTFNFKTsNCisgIHZvaWQgUmVzZXRFbmdpbmUoKTsNCisgIHZvaWQgUmVidWlsZFBhcmFncmFwaHMoKTsNCisgIHZvaWQgUmVtb3ZlQWxsUGFyYWdzKCk7DQorICB2b2lkIFJlbW92ZUFsbFBhZ2VzKCk7DQorICB2b2lkIFVwZGF0ZVBhcmFncygpOw0KKyAgdm9pZCBVcGRhdGVQYWdlcygpOw0KKyAgdm9pZCBVcGRhdGVUeHRCcmVhaygpOw0KKw0KKyAgRlhfQk9PTCBSZXBsYWNlUGFyYWdFbmQoRlhfV0NIQVIqJiBscFRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJlSXNDUiA9IEZBTFNFKTsNCisgIHZvaWQgUmVjb3ZlclBhcmFnRW5kKENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgaW50MzJfdCBNb3ZlUGFnZTJDaGFyKGludDMyX3QgbkluZGV4KTsNCisgIHZvaWQgVGV4dFBvczJQYXJhZ1BvcyhpbnQzMl90IG5JbmRleCwgRkRFX1RYVEVEVFBBUkFHUE9TJiBQYXJhZ1BvcykgY29uc3Q7DQorICBpbnQzMl90IE1vdmVGb3J3YXJkKEZYX0JPT0wmIGJCZWZvcmUpOw0KKyAgaW50MzJfdCBNb3ZlQmFja3dhcmQoRlhfQk9PTCYgYkJlZm9yZSk7DQorICBGWF9CT09MIE1vdmVVcChDRlhfUG9pbnRGJiBwdENhcmV0KTsNCisgIEZYX0JPT0wgTW92ZURvd24oQ0ZYX1BvaW50RiYgcHRDYXJldCk7DQorICBGWF9CT09MIE1vdmVMaW5lU3RhcnQoKTsNCisgIEZYX0JPT0wgTW92ZUxpbmVFbmQoKTsNCisgIEZYX0JPT0wgTW92ZVBhcmFnU3RhcnQoKTsNCisgIEZYX0JPT0wgTW92ZVBhcmFnRW5kKCk7DQorICBGWF9CT09MIE1vdmVIb21lKCk7DQorICBGWF9CT09MIE1vdmVFbmQoKTsNCisgIEZYX0JPT0wgSXNGaXRBcmVhKENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgdm9pZCBVcGRhdGVDYXJldFJlY3QoaW50MzJfdCBuSW5kZXgsIEZYX0JPT0wgYkJlZm9yZSA9IFRSVUUpOw0KKyAgdm9pZCBHZXRDYXJldFJlY3QoQ0ZYX1JlY3RGJiBydENhcmV0LA0KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuUGFnZUluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2FyZXQsDQorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJCZWZvcmUgPSBUUlVFKTsNCisgIHZvaWQgVXBkYXRlQ2FyZXRJbmRleChjb25zdCBDRlhfUG9pbnRGJiBwdENhcmV0KTsNCisNCisgIEZYX0JPT0wgSXNTZWxlY3QoKTsNCisgIHZvaWQgRGVsZXRlU2VsZWN0KCk7DQorDQorICBJRkRFX1R4dEVkdEJ1ZiogbV9wVHh0QnVmOw0KKyAgSUZYX1R4dEJyZWFrKiBtX3BUZXh0QnJlYWs7DQorICBGREVfVFhURURUUEFSQU1TIG1fUGFyYW07DQorICBDRlhfQXJyYXlUZW1wbGF0ZTxJRkRFX1R4dEVkdFBhZ2UqPiBtX1BhZ2VQdHJBcnJheTsNCisgIENGWF9BcnJheVRlbXBsYXRlPENGREVfVHh0RWR0UGFyYWcqPiBtX1BhcmFnUHRyQXJyYXk7DQorICBDRlhfQXJyYXlUZW1wbGF0ZTxGREVfTFBUWFRFRFRTRUxSQU5HRT4gbV9TZWxSYW5nZVB0ckFycjsNCisgIGludDMyX3QgbV9uUGFnZUxpbmVDb3VudDsNCisgIGludDMyX3QgbV9uTGluZUNvdW50Ow0KKyAgaW50MzJfdCBtX25BbmNob3JQb3M7DQorICBpbnQzMl90IG1fbkxheW91dFBvczsNCisgIEZYX0ZMT0FUIG1fZkNhcmV0UG9zUmVzZXJ2ZTsNCisgIGludDMyX3QgbV9uQ2FyZXQ7DQorICBGWF9CT09MIG1fYkJlZm9yZTsNCisgIGludDMyX3QgbV9uQ2FyZXRQYWdlOw0KKyAgQ0ZYX1JlY3RGIG1fcnRDYXJldDsNCisgIEZYX0RXT1JEIG1fZHdGaW5kRmxhZ3M7DQorICBGWF9CT09MIG1fYkxvY2s7DQorICBpbnQzMl90IG1fbkxpbWl0Ow0KKyAgRlhfV0NIQVIgbV93Y0FsaWFzQ2hhcjsNCisgIGludDMyX3QgbV9uRmlyc3RMaW5lRW5kOw0KKyAgRlhfQk9PTCBtX2JBdXRvTGluZUVuZDsNCisgIEZYX1dDSEFSIG1fd0xpbmVFbmQ7DQorICBGREVfVFhURURUX1RFWFRDSEFOR0VfSU5GTyBtX0NoYW5nZUluZm87DQorfTsNCitjbGFzcyBDRkRFX1R4dEVkdERvUmVjb3JkX0luc2VydCA6IHB1YmxpYyBJRkRFX1R4dEVkdERvUmVjb3JkIHsNCisgcHVibGljOg0KKyAgQ0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RvUmVjb3JkKTsNCisgIENGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0KENGREVfVHh0RWR0RW5naW5lKiBwRW5naW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2FyZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuZ3RoKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgVW5kbygpOw0KKyAgdmlydHVhbCBGWF9CT09MIFJlZG8oKTsNCisgIHZpcnR1YWwgdm9pZCBTZXJpYWxpemUoQ0ZYX0J5dGVTdHJpbmcmIGJzRG9SZWNvcmQpIGNvbnN0Ow0KKw0KKyBwcm90ZWN0ZWQ6DQorICB+Q0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQoKTsNCisgIHZvaWQgRGVzZXJpYWxpemUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RvUmVjb3JkKTsNCisNCisgcHJpdmF0ZToNCisgIENGREVfVHh0RWR0RW5naW5lKiBtX3BFbmdpbmU7DQorICBpbnQzMl90IG1fbkNhcmV0Ow0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c0luc2VydDsNCit9Ow0KK2NsYXNzIENGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2UgOiBwdWJsaWMgSUZERV9UeHRFZHREb1JlY29yZCB7DQorIHB1YmxpYzoNCisgIENGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RvUmVjb3JkKTsNCisgIENGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2UoQ0ZERV9UeHRFZHRFbmdpbmUqIHBFbmdpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DYXJldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUmFuZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNlbCA9IEZBTFNFKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgVW5kbygpOw0KKyAgdmlydHVhbCBGWF9CT09MIFJlZG8oKTsNCisgIHZpcnR1YWwgdm9pZCBTZXJpYWxpemUoQ0ZYX0J5dGVTdHJpbmcmIGJzRG9SZWNvcmQpIGNvbnN0Ow0KKw0KKyBwcm90ZWN0ZWQ6DQorICB+Q0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZSgpOw0KKyAgdm9pZCBEZXNlcmlhbGl6ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0ZERV9UeHRFZHRFbmdpbmUqIG1fcEVuZ2luZTsNCisgIEZYX0JPT0wgbV9iU2VsOw0KKyAgaW50MzJfdCBtX25JbmRleDsNCisgIGludDMyX3QgbV9uQ2FyZXQ7DQorICBDRlhfV2lkZVN0cmluZyBtX3dzUmFuZ2U7DQorfTsNCisjaWZkZWYgRkRFX1VTRUZPUk1BVEJMT0NLDQorY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZEluc2VydCA6IHB1YmxpYyBJRkRFX1R4dEVkdERvUmVjb3JkIHsNCisgcHVibGljOg0KKyAgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZEluc2VydChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpOw0KKyAgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZEluc2VydChDRkRFX1R4dEVkdEVuZ2luZSogcEVuZ2luZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2FyZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfVHh0RWR0RmllbGQqIHBGaWVsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXhJbkZpZWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5GaWVsZEJnbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuT2xkRmllbGRMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbk5ld0ZpZWxkTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NJbnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNlbCA9IEZBTFNFKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgVW5kbygpOw0KKyAgdmlydHVhbCBGWF9CT09MIFJlZG8oKTsNCisgIHZpcnR1YWwgdm9pZCBTZXJpYWxpemUoQ0ZYX0J5dGVTdHJpbmcmIGJzRG9SZWNvcmQpIGNvbnN0Ow0KKw0KKyBwcm90ZWN0ZWQ6DQorICB+Q0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZEluc2VydCgpOw0KKyAgdm9pZCBEZXNlcmlhbGl6ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0ZERV9UeHRFZHRFbmdpbmUqIG1fcEVuZ2luZTsNCisgIGludDMyX3QgbV9uQ2FyZXQ7DQorICBDRkRFX1R4dEVkdEZpZWxkKiBtX3BGaWVsZDsNCisgIGludDMyX3QgbV9uSW5kZXhJbkZpZWxkOw0KKyAgaW50MzJfdCBtX25GaWVsZEJnbjsNCisgIGludDMyX3QgbV9uT2xkRmllbGRMZW5ndGg7DQorICBpbnQzMl90IG1fbk5ld0ZpZWxkTGVuZ3RoOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c0luczsNCisgIEZYX0JPT0wgbV9iU2VsOw0KK307DQorY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZSA6IHB1YmxpYyBJRkRFX1R4dEVkdERvUmVjb3JkIHsNCisgcHVibGljOg0KKyAgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpOw0KKyAgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZERlbGV0ZShDRkRFX1R4dEVkdEVuZ2luZSogcEVuZ2luZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2FyZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfVHh0RWR0RmllbGQqIHBGaWVsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXhJbkZpZWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5GaWVsZEJnbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuT2xkTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5OZXdMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2VsID0gRkFMU0UpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBVbmRvKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUmVkbygpOw0KKyAgdmlydHVhbCB2b2lkIFNlcmlhbGl6ZShDRlhfQnl0ZVN0cmluZyYgYnNEb1JlY29yZCkgY29uc3Q7DQorDQorIHByb3RlY3RlZDoNCisgIH5DRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkRGVsZXRlKCk7DQorICB2b2lkIERlc2VyaWFsaXplKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCk7DQorDQorIHByaXZhdGU6DQorICBDRkRFX1R4dEVkdEVuZ2luZSogbV9wRW5naW5lOw0KKyAgaW50MzJfdCBtX25DYXJldDsNCisgIENGREVfVHh0RWR0RmllbGQqIG1fcEZpZWxkOw0KKyAgaW50MzJfdCBtX25JbmRleEluRmllbGQ7DQorICBpbnQzMl90IG1fbkZpZWxkQmduOw0KKyAgaW50MzJfdCBtX25PbGRGaWVsZExlbmd0aDsNCisgIGludDMyX3QgbV9uTmV3RmllbGRMZW5ndGg7DQorICBDRlhfV2lkZVN0cmluZyBtX3dzRGVsOw0KKyAgRlhfQk9PTCBtX2JTZWw7DQorfTsNCitjbGFzcyBDRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkUmVwbGFjZSA6IHB1YmxpYyBJRkRFX1R4dEVkdERvUmVjb3JkIHsNCisgcHVibGljOg0KKyAgQ0ZERV9UeHRFZHREb1JlY29yZF9GaWVsZFJlcGxhY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RvUmVjb3JkKTsNCisgIENGREVfVHh0RWR0RG9SZWNvcmRfRmllbGRSZXBsYWNlKENGREVfVHh0RWR0RW5naW5lKiBwRW5naW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2FyZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5OZXdDYXJldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfVHh0RWR0RmllbGQqIHBGaWVsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4SW5GaWVsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZpZWxkQmduLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRmllbGROZXdMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NJbnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZWwpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBVbmRvKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUmVkbygpOw0KKyAgdmlydHVhbCB2b2lkIFNlcmlhbGl6ZShDRlhfQnl0ZVN0cmluZyYgYnNEb1JlY29yZCkgY29uc3Q7DQorDQorIHByb3RlY3RlZDoNCisgIH5DRkRFX1R4dEVkdERvUmVjb3JkX0ZpZWxkUmVwbGFjZSgpOw0KKyAgdm9pZCBEZXNlcmlhbGl6ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRG9SZWNvcmQpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0ZERV9UeHRFZHRFbmdpbmUqIG1fcEVuZ2luZTsNCisgIGludDMyX3QgbV9uQ2FyZXQ7DQorICBpbnQzMl90IG1fbk5ld0NhcmV0Ow0KKyAgQ0ZERV9UeHRFZHRGaWVsZCogbV9wRmllbGQ7DQorICBpbnQzMl90IG1fbkluZGV4SW5GaWVsZDsNCisgIGludDMyX3QgbV9uRmllbGRCZ247DQorICBpbnQzMl90IG1fbkZpZWxkTmV3TGVuZ3RoOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c0RlbDsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NJbnM7DQorICBGWF9CT09MIG1fYlNlbDsNCit9Ow0KKyNlbmRpZg0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdHBhZ2UuY3BwIGIveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0cGFnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJlY2NiZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdHBhZ2UuY3BwCkBAIC0wLDAgKzEsNjQ3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlIDxhbGdvcml0aG0+DQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9mZWUvaW5jbHVkZS9pZmRlX3R4dGVkdGJ1Zi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZlZS9pbmNsdWRlL2lmZGVfdHh0ZWR0ZW5naW5lLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZmVlL2luY2x1ZGUvaWZkZV90eHRlZHRwYWdlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZmVlL2luY2x1ZGUvZnhfd29yZGJyZWFrLmgiDQorI2luY2x1ZGUgImZkZV90eHRlZHRwYWdlLmgiDQorI2luY2x1ZGUgImZkZV90eHRlZHRlbmdpbmUuaCINCisjaW5jbHVkZSAiZmRlX3R4dGVkdHBhcmFnLmgiDQorI2luY2x1ZGUgImZkZV90eHRlZHRidWYuaCINCisjZGVmaW5lIEZERV9UWFRFRFRfVE9MRVJBTkNFIDAuMWYNCitJRkRFX1R4dEVkdFBhZ2UqIElGREVfVHh0RWR0UGFnZTo6Q3JlYXRlKElGREVfVHh0RWR0RW5naW5lKiBwRW5naW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgpIHsNCisgIHJldHVybiAoSUZERV9UeHRFZHRQYWdlKiluZXcgQ0ZERV9UeHRFZHRQYWdlKHBFbmdpbmUsIG5JbmRleCk7DQorfQ0KK0NGREVfVHh0RWR0VGV4dFNldDo6Q0ZERV9UeHRFZHRUZXh0U2V0KENGREVfVHh0RWR0UGFnZSogcFBhZ2UpDQorICAgIDogbV9wUGFnZShwUGFnZSkge30NCitDRkRFX1R4dEVkdFRleHRTZXQ6On5DRkRFX1R4dEVkdFRleHRTZXQoKSB7fQ0KK0ZERV9WSVNVQUxPQkpUWVBFIENGREVfVHh0RWR0VGV4dFNldDo6R2V0VHlwZSgpIHsNCisgIHJldHVybiBGREVfVklTVUFMT0JKX1RleHQ7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRUZXh0U2V0OjpHZXRCQm94KEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmosDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBiYm94KSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRUZXh0U2V0OjpHZXRNYXRyaXgoRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgmIG1hdHJpeCkgew0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0VGV4dFNldDo6R2V0UmVjdChGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqLCBDRlhfUmVjdEYmIHJ0KSB7DQorICBydCA9ICgoRkRFX0xQVEVYVEVESVRQSUVDRSkoaFZpc3VhbE9iaikpLT5ydFBpZWNlOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRUZXh0U2V0OjpHZXRDbGlwKEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmosIENGWF9SZWN0RiYgcnQpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdFRleHRTZXQ6OkdldFN0cmluZyhGREVfSFZJU1VBTE9CSiBoVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIEZERV9MUFRFWFRFRElUUElFQ0UgcFBpZWNlID0gKEZERV9MUFRFWFRFRElUUElFQ0UpaFRleHQ7DQorICBGWF9XQ0hBUiogcEJ1ZmZlciA9IHdzVGV4dC5HZXRCdWZmZXIocFBpZWNlLT5uQ291bnQpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcFBpZWNlLT5uQ291bnQ7IGkrKykgew0KKyAgICBwQnVmZmVyW2ldID0gbV9wUGFnZS0+R2V0Q2hhcigodm9pZCopaFRleHQsIGkpOw0KKyAgfQ0KKyAgd3NUZXh0LlJlbGVhc2VCdWZmZXIocFBpZWNlLT5uQ291bnQpOw0KKyAgcmV0dXJuIHBQaWVjZS0+bkNvdW50Ow0KK30NCitJRlhfRm9udCogQ0ZERV9UeHRFZHRUZXh0U2V0OjpHZXRGb250KEZERV9IVklTVUFMT0JKIGhUZXh0KSB7DQorICByZXR1cm4gbV9wUGFnZS0+R2V0RW5naW5lKCktPkdldEVkaXRQYXJhbXMoKS0+cEZvbnQ7DQorfQ0KK0ZYX0ZMT0FUIENGREVfVHh0RWR0VGV4dFNldDo6R2V0Rm9udFNpemUoRkRFX0hWSVNVQUxPQkogaFRleHQpIHsNCisgIHJldHVybiBtX3BQYWdlLT5HZXRFbmdpbmUoKS0+R2V0RWRpdFBhcmFtcygpLT5mRm9udFNpemU7DQorfQ0KK0ZYX0FSR0IgQ0ZERV9UeHRFZHRUZXh0U2V0OjpHZXRGb250Q29sb3IoRkRFX0hWSVNVQUxPQkogaFRleHQpIHsNCisgIHJldHVybiBtX3BQYWdlLT5HZXRFbmdpbmUoKS0+R2V0RWRpdFBhcmFtcygpLT5kd0ZvbnRDb2xvcjsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdFRleHRTZXQ6OkdldERpc3BsYXlQb3MoRkRFX0hWSVNVQUxPQkogaFRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJDb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nKiBwV1NGb3Jtcykgew0KKyAgaWYgKGhUZXh0ID09IE5VTEwpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBGREVfTFBURVhURURJVFBJRUNFIHBQaWVjZSA9IChGREVfTFBURVhURURJVFBJRUNFKWhUZXh0Ow0KKyAgaW50MzJfdCBuTGVuZ3RoID0gcFBpZWNlLT5uQ291bnQ7DQorICBpZiAobkxlbmd0aCA8IDEpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBDRkRFX1R4dEVkdEVuZ2luZSogcEVuZ2luZSA9IChDRkRFX1R4dEVkdEVuZ2luZSopKG1fcFBhZ2UtPkdldEVuZ2luZSgpKTsNCisgIGNvbnN0IEZERV9UWFRFRFRQQVJBTVMqIHBUZXh0UGFyYW1zID0gcEVuZ2luZS0+R2V0RWRpdFBhcmFtcygpOw0KKyAgSUZYX1R4dEJyZWFrKiBwQnJlYWsgPSBwRW5naW5lLT5HZXRUZXh0QnJlYWsoKTsNCisgIEZYX0RXT1JEIGR3TGF5b3V0U3R5bGUgPSBwQnJlYWstPkdldExheW91dFN0eWxlcygpOw0KKyAgRlhfVFhUUlVOIHRyOw0KKyAgdHIucEFjY2VzcyA9IG1fcFBhZ2U7DQorICB0ci5wSWRlbnRpdHkgPSAodm9pZCopaFRleHQ7DQorICB0ci5wU3RyID0gTlVMTDsNCisgIHRyLnBXaWR0aHMgPSBOVUxMOw0KKyAgdHIuaUxlbmd0aCA9IG5MZW5ndGg7DQorICB0ci5wRm9udCA9IHBUZXh0UGFyYW1zLT5wRm9udDsNCisgIHRyLmZGb250U2l6ZSA9IHBUZXh0UGFyYW1zLT5mRm9udFNpemU7DQorICB0ci5kd1N0eWxlcyA9IGR3TGF5b3V0U3R5bGU7DQorICB0ci5pQ2hhclJvdGF0aW9uID0gcFRleHRQYXJhbXMtPm5DaGFyUm90YXRpb247DQorICB0ci5kd0NoYXJTdHlsZXMgPSBwUGllY2UtPmR3Q2hhclN0eWxlczsNCisgIHRyLnBSZWN0ID0gJihwUGllY2UtPnJ0UGllY2UpOw0KKyAgdHIud0xpbmVCcmVha0NoYXIgPSBwVGV4dFBhcmFtcy0+d0xpbmVCcmVha0NoYXI7DQorICByZXR1cm4gcEJyZWFrLT5HZXREaXNwbGF5UG9zKCZ0ciwgcENoYXJQb3MsIGJDaGFyQ29kZSwgcFdTRm9ybXMpOw0KK30NCitpbnQzMl90IENGREVfVHh0RWR0VGV4dFNldDo6R2V0Q2hhclJlY3RzKEZERV9IVklTVUFMT0JKIGhUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGQXJyYXkmIHJ0QXJyYXkpIHsNCisgIHJldHVybiBHZXRDaGFyUmVjdHNfSW1wbChoVGV4dCwgcnRBcnJheSk7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRUZXh0U2V0OjpHZXRDaGFyUmVjdHNfSW1wbChGREVfSFZJU1VBTE9CSiBoVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGQXJyYXkmIHJ0QXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkJCb3gpIHsNCisgIGlmIChoVGV4dCA9PSBOVUxMKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgRkRFX0xQVEVYVEVESVRQSUVDRSBwUGllY2UgPSAoRkRFX0xQVEVYVEVESVRQSUVDRSloVGV4dDsNCisgIENGREVfVHh0RWR0RW5naW5lKiBwRW5naW5lID0gKENGREVfVHh0RWR0RW5naW5lKikobV9wUGFnZS0+R2V0RW5naW5lKCkpOw0KKyAgaW50MzJfdCBuTGVuZ3RoID0gcFBpZWNlLT5uQ291bnQ7DQorICBpZiAobkxlbmd0aCA8IDEpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBjb25zdCBGREVfVFhURURUUEFSQU1TKiBwVGV4dFBhcmFtcyA9IHBFbmdpbmUtPkdldEVkaXRQYXJhbXMoKTsNCisgIEZYX0RXT1JEIGR3TGF5b3V0U3R5bGUgPSBwRW5naW5lLT5HZXRUZXh0QnJlYWsoKS0+R2V0TGF5b3V0U3R5bGVzKCk7DQorICBGWF9UWFRSVU4gdHI7DQorICB0ci5wQWNjZXNzID0gbV9wUGFnZTsNCisgIHRyLnBJZGVudGl0eSA9ICh2b2lkKiloVGV4dDsNCisgIHRyLnBTdHIgPSBOVUxMOw0KKyAgdHIucFdpZHRocyA9IE5VTEw7DQorICB0ci5pTGVuZ3RoID0gbkxlbmd0aDsNCisgIHRyLnBGb250ID0gcFRleHRQYXJhbXMtPnBGb250Ow0KKyAgdHIuZkZvbnRTaXplID0gcFRleHRQYXJhbXMtPmZGb250U2l6ZTsNCisgIHRyLmR3U3R5bGVzID0gZHdMYXlvdXRTdHlsZTsNCisgIHRyLmlDaGFyUm90YXRpb24gPSBwVGV4dFBhcmFtcy0+bkNoYXJSb3RhdGlvbjsNCisgIHRyLmR3Q2hhclN0eWxlcyA9IHBQaWVjZS0+ZHdDaGFyU3R5bGVzOw0KKyAgdHIucFJlY3QgPSAmKHBQaWVjZS0+cnRQaWVjZSk7DQorICB0ci53TGluZUJyZWFrQ2hhciA9IHBUZXh0UGFyYW1zLT53TGluZUJyZWFrQ2hhcjsNCisgIHJldHVybiBwRW5naW5lLT5HZXRUZXh0QnJlYWsoKS0+R2V0Q2hhclJlY3RzKCZ0ciwgcnRBcnJheSwgYkJCb3gpOw0KK30NCitDRkRFX1R4dEVkdFBhZ2U6OkNGREVfVHh0RWR0UGFnZShJRkRFX1R4dEVkdEVuZ2luZSogcEVuZ2luZSwgaW50MzJfdCBuUGFnZUluZGV4KQ0KKyAgICA6IG1fcEl0ZXIobnVsbHB0ciksDQorICAgICAgbV9wVGV4dFNldChudWxscHRyKSwNCisgICAgICBtX3BCZ25QYXJhZyhudWxscHRyKSwNCisgICAgICBtX3BFbmRQYXJhZyhudWxscHRyKSwNCisgICAgICBtX25SZWZDb3VudCgwKSwNCisgICAgICBtX25QYWdlU3RhcnQoLTEpLA0KKyAgICAgIG1fbkNoYXJDb3VudCgwKSwNCisgICAgICBtX25QYWdlSW5kZXgoblBhZ2VJbmRleCksDQorICAgICAgbV9iTG9hZGVkKEZBTFNFKSwNCisgICAgICBtX3BDaGFyV2lkdGgobnVsbHB0cikgew0KKyAgRlhTWVNfbWVtc2V0KCZtX3J0UGFnZSwgMCwgc2l6ZW9mKENGWF9SZWN0RikpOw0KKyAgRlhTWVNfbWVtc2V0KCZtX3J0UGFnZU1hcmdpbiwgMCwgc2l6ZW9mKENGWF9SZWN0RikpOw0KKyAgRlhTWVNfbWVtc2V0KCZtX3J0UGFnZUNvbnRlbnRzLCAwLCBzaXplb2YoQ0ZYX1JlY3RGKSk7DQorICBGWFNZU19tZW1zZXQoJm1fcnRQYWdlQ2FudmFzLCAwLCBzaXplb2YoQ0ZYX1JlY3RGKSk7DQorICBtX3BFZGl0RW5naW5lID0gKENGREVfVHh0RWR0RW5naW5lKilwRW5naW5lOw0KK30NCitDRkRFX1R4dEVkdFBhZ2U6On5DRkRFX1R4dEVkdFBhZ2UoKSB7DQorICBtX1BpZWNlTWFzc0Fyci5SZW1vdmVBbGwoVFJVRSk7DQorICBpZiAobV9wVGV4dFNldCkgew0KKyAgICBkZWxldGUgbV9wVGV4dFNldDsNCisgICAgbV9wVGV4dFNldCA9IE5VTEw7DQorICB9DQorICBpZiAobV9wQ2hhcldpZHRoKSB7DQorICAgIGRlbGV0ZVtdIG1fcENoYXJXaWR0aDsNCisgICAgbV9wQ2hhcldpZHRoID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BJdGVyICE9IE5VTEwpIHsNCisgICAgbV9wSXRlci0+UmVsZWFzZSgpOw0KKyAgICBtX3BJdGVyID0gTlVMTDsNCisgIH0NCit9DQordm9pZCBDRkRFX1R4dEVkdFBhZ2U6OlJlbGVhc2UoKSB7DQorICBkZWxldGUgdGhpczsNCit9DQorSUZERV9UeHRFZHRFbmdpbmUqIENGREVfVHh0RWR0UGFnZTo6R2V0RW5naW5lKCkgY29uc3Qgew0KKyAgcmV0dXJuIChJRkRFX1R4dEVkdEVuZ2luZSopbV9wRWRpdEVuZ2luZTsNCit9DQorRkRFX1ZJU1VBTE9CSlRZUEUgQ0ZERV9UeHRFZHRQYWdlOjpHZXRUeXBlKCkgew0KKyAgcmV0dXJuIEZERV9WSVNVQUxPQkpfVGV4dDsNCit9DQorRlhfQk9PTCBDRkRFX1R4dEVkdFBhZ2U6OkdldEJCb3goRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX1JlY3RGJiBiYm94KSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRQYWdlOjpHZXRNYXRyaXgoRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgmIG1hdHJpeCkgew0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENGREVfVHh0RWR0UGFnZTo6R2V0UmVjdChGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqLCBDRlhfUmVjdEYmIHJ0KSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRQYWdlOjpHZXRDbGlwKEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmosIENGWF9SZWN0RiYgcnQpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdFBhZ2U6OkdldENoYXJSZWN0KGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkJCb3gpIGNvbnN0IHsNCisgIEZYU1lTX2Fzc2VydChtX25SZWZDb3VudCA+IDApOw0KKyAgRlhTWVNfYXNzZXJ0KG5JbmRleCA+PSAwICYmIG5JbmRleCA8IG1fbkNoYXJDb3VudCk7DQorICBpZiAobV9uUmVmQ291bnQgPCAxKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaW50MzJfdCBuQ291bnQgPSBtX1BpZWNlTWFzc0Fyci5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICBjb25zdCBGREVfTFBURVhURURJVFBJRUNFIHBQaWVjZSA9IG1fUGllY2VNYXNzQXJyLkdldFB0ckF0KGkpOw0KKyAgICBpZiAobkluZGV4ID49IHBQaWVjZS0+blN0YXJ0ICYmDQorICAgICAgICBuSW5kZXggPCAocFBpZWNlLT5uU3RhcnQgKyBwUGllY2UtPm5Db3VudCkpIHsNCisgICAgICBDRlhfUmVjdEZBcnJheSByZWN0QXJyOw0KKyAgICAgIGlmIChiQkJveCkgew0KKyAgICAgICAgbV9wVGV4dFNldC0+R2V0Q2hhclJlY3RzX0ltcGwoKEZERV9IVklTVUFMT0JKKXBQaWVjZSwgcmVjdEFyciwgYkJCb3gpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBtX3BUZXh0U2V0LT5HZXRDaGFyUmVjdHMoKEZERV9IVklTVUFMT0JKKXBQaWVjZSwgcmVjdEFycik7DQorICAgICAgfQ0KKyAgICAgIHJlY3QgPSByZWN0QXJyW25JbmRleCAtIHBQaWVjZS0+blN0YXJ0XTsNCisgICAgICByZXR1cm4gcFBpZWNlLT5uQmlkaUxldmVsOw0KKyAgICB9DQorICB9DQorICBGWFNZU19hc3NlcnQoMCk7DQorICByZXR1cm4gMDsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdFBhZ2U6OkdldENoYXJJbmRleChjb25zdCBDRlhfUG9pbnRGJiBmUG9pbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiQmVmb3JlKSB7DQorICBGWF9CT09MIGJWZXJ0aWNhbCA9IG1fcEVkaXRFbmdpbmUtPkdldEVkaXRQYXJhbXMoKS0+ZHdMYXlvdXRTdHlsZXMgJg0KKyAgICAgICAgICAgICAgICAgICAgICBGREVfVEVYVEVESVRMQVlPVVRfRG9jVmVydGljYWw7DQorICBDRlhfUG9pbnRGIHB0RiA9IGZQb2ludDsNCisgIE5vcm1hbGl6ZVB0MlJlY3QocHRGLCBtX3J0UGFnZUNvbnRlbnRzLCBGREVfVFhURURUX1RPTEVSQU5DRSk7DQorICBpbnQzMl90IG5Db3VudCA9IG1fUGllY2VNYXNzQXJyLkdldFNpemUoKTsNCisgIENGWF9SZWN0RiBydExpbmU7DQorICBpbnQzMl90IG5CZ24gPSAwOw0KKyAgaW50MzJfdCBuRW5kID0gMDsNCisgIEZYX0JPT0wgYkluTGluZSA9IEZBTFNFOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIGZvciAoaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICBjb25zdCBGREVfTFBURVhURURJVFBJRUNFIHBQaWVjZSA9IG1fUGllY2VNYXNzQXJyLkdldFB0ckF0KGkpOw0KKyAgICBpZiAoIWJJbkxpbmUgJiYgKGJWZXJ0aWNhbCA/IChwUGllY2UtPnJ0UGllY2UubGVmdCA8PSBwdEYueCAmJg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGllY2UtPnJ0UGllY2UucmlnaHQoKSA+IHB0Ri54KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChwUGllY2UtPnJ0UGllY2UudG9wIDw9IHB0Ri55ICYmDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaWVjZS0+cnRQaWVjZS5ib3R0b20oKSA+IHB0Ri55KSkpIHsNCisgICAgICBuQmduID0gbkVuZCA9IGk7DQorICAgICAgcnRMaW5lID0gcFBpZWNlLT5ydFBpZWNlOw0KKyAgICAgIGJJbkxpbmUgPSBUUlVFOw0KKyAgICB9IGVsc2UgaWYgKGJJbkxpbmUpIHsNCisgICAgICBpZiAoYlZlcnRpY2FsID8gKCEocFBpZWNlLT5ydFBpZWNlLmxlZnQgPD0gcHRGLnggJiYNCisgICAgICAgICAgICAgICAgICAgICAgICAgcFBpZWNlLT5ydFBpZWNlLnJpZ2h0KCkgPiBwdEYueCkpDQorICAgICAgICAgICAgICAgICAgICA6IChwUGllY2UtPnJ0UGllY2UuYm90dG9tKCkgPD0gcHRGLnkgfHwNCisgICAgICAgICAgICAgICAgICAgICAgIHBQaWVjZS0+cnRQaWVjZS50b3AgPiBwdEYueSkpIHsNCisgICAgICAgIG5FbmQgPSBpIC0gMTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBydExpbmUuVW5pb24ocFBpZWNlLT5ydFBpZWNlKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIE5vcm1hbGl6ZVB0MlJlY3QocHRGLCBydExpbmUsIEZERV9UWFRFRFRfVE9MRVJBTkNFKTsNCisgIGludDMyX3QgbkNhcmV0ID0gMDsNCisgIEZERV9MUFRFWFRFRElUUElFQ0UgcFBpZWNlID0gTlVMTDsNCisgIGZvciAoaSA9IG5CZ247IGkgPD0gbkVuZDsgaSsrKSB7DQorICAgIHBQaWVjZSA9IG1fUGllY2VNYXNzQXJyLkdldFB0ckF0KGkpOw0KKyAgICBuQ2FyZXQgPSBtX25QYWdlU3RhcnQgKyBwUGllY2UtPm5TdGFydDsNCisgICAgaWYgKHBQaWVjZS0+cnRQaWVjZS5Db250YWlucyhwdEYpKSB7DQorICAgICAgQ0ZYX1JlY3RGQXJyYXkgcmVjdEFycjsNCisgICAgICBtX3BUZXh0U2V0LT5HZXRDaGFyUmVjdHMoKEZERV9IVklTVUFMT0JKKXBQaWVjZSwgcmVjdEFycik7DQorICAgICAgaW50MzJfdCBuUnRDb3VudCA9IHJlY3RBcnIuR2V0U2l6ZSgpOw0KKyAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IG5SdENvdW50OyBqKyspIHsNCisgICAgICAgIGlmIChyZWN0QXJyW2pdLkNvbnRhaW5zKHB0RikpIHsNCisgICAgICAgICAgbkNhcmV0ID0gbV9uUGFnZVN0YXJ0ICsgcFBpZWNlLT5uU3RhcnQgKyBqOw0KKyAgICAgICAgICBpZiAobkNhcmV0ID49IG1fcEVkaXRFbmdpbmUtPkdldFRleHRCdWZMZW5ndGgoKSkgew0KKyAgICAgICAgICAgIGJCZWZvcmUgPSBUUlVFOw0KKyAgICAgICAgICAgIHJldHVybiBtX3BFZGl0RW5naW5lLT5HZXRUZXh0QnVmTGVuZ3RoKCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgRlhfV0NIQVIgd0NoYXIgPSBtX3BFZGl0RW5naW5lLT5HZXRUZXh0QnVmKCktPkdldENoYXJCeUluZGV4KG5DYXJldCk7DQorICAgICAgICAgIGlmICh3Q2hhciA9PSBMJ1xuJyB8fCB3Q2hhciA9PSBMJ1xyJykgew0KKyAgICAgICAgICAgIGlmICh3Q2hhciA9PSBMJ1xuJykgew0KKyAgICAgICAgICAgICAgaWYgKG1fcEVkaXRFbmdpbmUtPkdldFRleHRCdWYoKS0+R2V0Q2hhckJ5SW5kZXgobkNhcmV0IC0gMSkgPT0NCisgICAgICAgICAgICAgICAgICBMJ1xyJykgew0KKyAgICAgICAgICAgICAgICBuQ2FyZXQtLTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYkJlZm9yZSA9IFRSVUU7DQorICAgICAgICAgICAgcmV0dXJuIG5DYXJldDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoYlZlcnRpY2FsDQorICAgICAgICAgICAgICAgICAgPyAocHRGLnkgPiAoKHJlY3RBcnJbal0udG9wICsgcmVjdEFycltqXS5ib3R0b20oKSkgLyAyKSkNCisgICAgICAgICAgICAgICAgICA6IChwdEYueCA+ICgocmVjdEFycltqXS5sZWZ0ICsgcmVjdEFycltqXS5yaWdodCgpKSAvIDIpKSkgew0KKyAgICAgICAgICAgIGJCZWZvcmUgPSBGWF9Jc09kZChwUGllY2UtPm5CaWRpTGV2ZWwpOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGJCZWZvcmUgPSAhRlhfSXNPZGQocFBpZWNlLT5uQmlkaUxldmVsKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICByZXR1cm4gbkNhcmV0Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgYkJlZm9yZSA9IFRSVUU7DQorICByZXR1cm4gbkNhcmV0Ow0KK30NCitpbnQzMl90IENGREVfVHh0RWR0UGFnZTo6R2V0Q2hhclN0YXJ0KCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fblBhZ2VTdGFydDsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdFBhZ2U6OkdldENoYXJDb3VudCgpIGNvbnN0IHsNCisgIHJldHVybiBtX25DaGFyQ291bnQ7DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRQYWdlOjpHZXREaXNwbGF5UG9zKGNvbnN0IENGWF9SZWN0RiYgcnRDbGlwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiYgcENoYXJQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBSRUNURiBwQkJveCkgY29uc3Qgew0KKyAgcENoYXJQb3MgPSBGWF9BbGxvYyhGWFRFWFRfQ0hBUlBPUywgbV9uQ2hhckNvdW50KTsNCisgIGludDMyX3QgbkNoYXJQb3NDb3VudCA9IDA7DQorICBGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqID0gTlVMTDsNCisgIGludDMyX3QgblZpc3VhbE9iakNvdW50ID0gbV9QaWVjZU1hc3NBcnIuR2V0U2l6ZSgpOw0KKyAgRlhURVhUX0NIQVJQT1MqIHBvcyA9IHBDaGFyUG9zOw0KKyAgQ0ZYX1JlY3RGIHJ0T2JqOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgblZpc3VhbE9iakNvdW50OyBpKyspIHsNCisgICAgaFZpc3VhbE9iaiA9IChGREVfSFZJU1VBTE9CSiltX1BpZWNlTWFzc0Fyci5HZXRQdHJBdChpKTsNCisgICAgbV9wVGV4dFNldC0+R2V0UmVjdChoVmlzdWFsT2JqLCBydE9iaik7DQorICAgIGlmICghcnRDbGlwLkludGVyc2VjdFdpdGgocnRPYmopKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaW50MzJfdCBuQ291bnQgPSBtX3BUZXh0U2V0LT5HZXREaXNwbGF5UG9zKGhWaXN1YWxPYmosIHBvcywgRkFMU0UpOw0KKyAgICBuQ2hhclBvc0NvdW50ICs9IG5Db3VudDsNCisgICAgcG9zICs9IG5Db3VudDsNCisgIH0NCisgIGlmICgobkNoYXJQb3NDb3VudCAqIDUpIDwgKG1fbkNoYXJDb3VudCA8PCAyKSkgew0KKyAgICBGWFRFWFRfQ0hBUlBPUyogcFRlbXAgPSBGWF9BbGxvYyhGWFRFWFRfQ0hBUlBPUywgbkNoYXJQb3NDb3VudCk7DQorICAgIEZYU1lTX21lbWNweShwVGVtcCwgcENoYXJQb3MsIHNpemVvZihGWFRFWFRfQ0hBUlBPUykgKiBuQ2hhclBvc0NvdW50KTsNCisgICAgRlhfRnJlZShwQ2hhclBvcyk7DQorICAgIHBDaGFyUG9zID0gcFRlbXA7DQorICB9DQorICByZXR1cm4gbkNoYXJQb3NDb3VudDsNCit9DQordm9pZCBDRkRFX1R4dEVkdFBhZ2U6OkNhbGNSYW5nZVJlY3RBcnJheShpbnQzMl90IG5TdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGQXJyYXkmIFJlY3RGQXJyKSBjb25zdCB7DQorICBpbnQzMl90IG5QaWVjZUNvdW50ID0gbV9QaWVjZU1hc3NBcnIuR2V0U2l6ZSgpOw0KKyAgaW50MzJfdCBuRW5kID0gblN0YXJ0ICsgbkNvdW50IC0gMTsNCisgIEZYX0JPT0wgYkluUmFuZ2UgPSBGQUxTRTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5QaWVjZUNvdW50OyBpKyspIHsNCisgICAgRkRFX0xQVEVYVEVESVRQSUVDRSBwaWVjZSA9IG1fUGllY2VNYXNzQXJyLkdldFB0ckF0KGkpOw0KKyAgICBpZiAoIWJJblJhbmdlKSB7DQorICAgICAgaWYgKG5TdGFydCA+PSBwaWVjZS0+blN0YXJ0ICYmIG5TdGFydCA8IChwaWVjZS0+blN0YXJ0ICsgcGllY2UtPm5Db3VudCkpIHsNCisgICAgICAgIGludDMyX3QgblJhbmdlRW5kID0gcGllY2UtPm5Db3VudCAtIDE7DQorICAgICAgICBGWF9CT09MIGJFbmQgPSBGQUxTRTsNCisgICAgICAgIGlmIChuRW5kID49IHBpZWNlLT5uU3RhcnQgJiYgbkVuZCA8IChwaWVjZS0+blN0YXJ0ICsgcGllY2UtPm5Db3VudCkpIHsNCisgICAgICAgICAgblJhbmdlRW5kID0gbkVuZCAtIHBpZWNlLT5uU3RhcnQ7DQorICAgICAgICAgIGJFbmQgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1JlY3RGQXJyYXkgcmNBcnI7DQorICAgICAgICBtX3BUZXh0U2V0LT5HZXRDaGFyUmVjdHMoKEZERV9IVklTVUFMT0JKKXBpZWNlLCByY0Fycik7DQorICAgICAgICBDRlhfUmVjdEYgcmVjdFBpZWNlID0gcmNBcnJbblN0YXJ0IC0gcGllY2UtPm5TdGFydF07DQorICAgICAgICByZWN0UGllY2UuVW5pb24ocmNBcnJbblJhbmdlRW5kXSk7DQorICAgICAgICBSZWN0RkFyci5BZGQocmVjdFBpZWNlKTsNCisgICAgICAgIGlmIChiRW5kKSB7DQorICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIGJJblJhbmdlID0gVFJVRTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKG5FbmQgPj0gcGllY2UtPm5TdGFydCAmJiBuRW5kIDwgKHBpZWNlLT5uU3RhcnQgKyBwaWVjZS0+bkNvdW50KSkgew0KKyAgICAgICAgQ0ZYX1JlY3RGQXJyYXkgcmNBcnI7DQorICAgICAgICBtX3BUZXh0U2V0LT5HZXRDaGFyUmVjdHMoKEZERV9IVklTVUFMT0JKKXBpZWNlLCByY0Fycik7DQorICAgICAgICBDRlhfUmVjdEYgcmVjdFBpZWNlID0gcmNBcnJbMF07DQorICAgICAgICByZWN0UGllY2UuVW5pb24ocmNBcnJbbkVuZCAtIHBpZWNlLT5uU3RhcnRdKTsNCisgICAgICAgIFJlY3RGQXJyLkFkZChyZWN0UGllY2UpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgICBSZWN0RkFyci5BZGQocGllY2UtPnJ0UGllY2UpOw0KKyAgICB9DQorICB9DQorICByZXR1cm47DQorfQ0KK2ludDMyX3QgQ0ZERV9UeHRFZHRQYWdlOjpTZWxlY3RXb3JkKGNvbnN0IENGWF9Qb2ludEYmIGZQb2ludCwgaW50MzJfdCYgbkNvdW50KSB7DQorICBpZiAobV9uUmVmQ291bnQgPCAwKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIElGREVfVHh0RWR0QnVmKiBwQnVmID0gbV9wRWRpdEVuZ2luZS0+R2V0VGV4dEJ1ZigpOw0KKyAgRlhfQk9PTCBiQmVmb3JlOw0KKyAgaW50MzJfdCBuSW5kZXggPSBHZXRDaGFySW5kZXgoZlBvaW50LCBiQmVmb3JlKTsNCisgIGlmIChuSW5kZXggPT0gbV9wRWRpdEVuZ2luZS0+R2V0VGV4dEJ1Zkxlbmd0aCgpKSB7DQorICAgIG5JbmRleCA9IG1fcEVkaXRFbmdpbmUtPkdldFRleHRCdWZMZW5ndGgoKSAtIDE7DQorICB9DQorICBpZiAobkluZGV4IDwgMCkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBJRlhfV29yZEJyZWFrKiBwSXRlciA9IEZYX1dvcmRCcmVha19DcmVhdGUoKTsNCisgIHBJdGVyLT5BdHRhY2gobmV3IENGREVfVHh0RWR0QnVmSXRlcigoQ0ZERV9UeHRFZHRCdWYqKXBCdWYpKTsNCisgIHBJdGVyLT5TZXRBdChuSW5kZXgpOw0KKyAgbkNvdW50ID0gcEl0ZXItPkdldFdvcmRMZW5ndGgoKTsNCisgIGludDMyX3QgblJldCA9IHBJdGVyLT5HZXRXb3JkUG9zKCk7DQorICBwSXRlci0+UmVsZWFzZSgpOw0KKyAgcmV0dXJuIG5SZXQ7DQorfQ0KK0ZYX0JPT0wgQ0ZERV9UeHRFZHRQYWdlOjpJc0xvYWRlZChGWF9MUENSRUNURiBwQ2xpcEJveCkgew0KKyAgcmV0dXJuIG1fYkxvYWRlZDsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdFBhZ2U6OkxvYWRQYWdlKEZYX0xQQ1JFQ1RGIHBDbGlwQm94LCBJRlhfUGF1c2UqIHBQYXVzZSkgew0KKyAgaWYgKG1fblJlZkNvdW50ID4gMCkgew0KKyAgICBtX25SZWZDb3VudCsrOw0KKyAgICByZXR1cm4gbV9uUmVmQ291bnQ7DQorICB9DQorICBJRkRFX1R4dEVkdEJ1ZiogcEJ1ZiA9IG1fcEVkaXRFbmdpbmUtPkdldFRleHRCdWYoKTsNCisgIGNvbnN0IEZERV9UWFRFRFRQQVJBTVMqIHBQYXJhbXMgPSBtX3BFZGl0RW5naW5lLT5HZXRFZGl0UGFyYW1zKCk7DQorICBpZiAobV9wSXRlciAhPSBOVUxMKSB7DQorICAgIG1fcEl0ZXItPlJlbGVhc2UoKTsNCisgIH0NCisgIEZYX1dDSEFSIHdjQWxpYXMgPSAwOw0KKyAgaWYgKHBQYXJhbXMtPmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfUGFzc3dvcmQpIHsNCisgICAgd2NBbGlhcyA9IG1fcEVkaXRFbmdpbmUtPkdldEFsaWFzQ2hhcigpOw0KKyAgfQ0KKyAgbV9wSXRlciA9IG5ldyBDRkRFX1R4dEVkdEJ1Zkl0ZXIoKENGREVfVHh0RWR0QnVmKilwQnVmLCB3Y0FsaWFzKTsNCisgIElGWF9UeHRCcmVhayogcEJyZWFrID0gbV9wRWRpdEVuZ2luZS0+R2V0VGV4dEJyZWFrKCk7DQorICBwQnJlYWstPkVuZEJyZWFrKEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKTsNCisgIHBCcmVhay0+Q2xlYXJCcmVha1BpZWNlcygpOw0KKyAgaW50MzJfdCBuUGFnZUxpbmVDb3VudCA9IG1fcEVkaXRFbmdpbmUtPkdldFBhZ2VMaW5lQ291bnQoKTsNCisgIGludDMyX3QgblN0YXJ0TGluZSA9IG5QYWdlTGluZUNvdW50ICogbV9uUGFnZUluZGV4Ow0KKyAgaW50MzJfdCBuRW5kTGluZSA9IHN0ZDo6bWluKChuU3RhcnRMaW5lICsgblBhZ2VMaW5lQ291bnQgLSAxKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV9wRWRpdEVuZ2luZS0+R2V0TGluZUNvdW50KCkgLSAxKSk7DQorICBpbnQzMl90IG5QYWdlU3RhcnQsIG5QYWdlRW5kLCBuVGVtcCwgbkJnblBhcmFnLCBuU3RhcnRMaW5lSW5QYXJhZywgbkVuZFBhcmFnLA0KKyAgICAgIG5FbmRMaW5lSW5QYXJhZzsNCisgIG5CZ25QYXJhZyA9IG1fcEVkaXRFbmdpbmUtPkxpbmUyUGFyYWcoMCwgMCwgblN0YXJ0TGluZSwgblN0YXJ0TGluZUluUGFyYWcpOw0KKyAgbV9wQmduUGFyYWcgPSAoQ0ZERV9UeHRFZHRQYXJhZyopbV9wRWRpdEVuZ2luZS0+R2V0UGFyYWcobkJnblBhcmFnKTsNCisgIG1fcEJnblBhcmFnLT5Mb2FkUGFyYWcoKTsNCisgIG1fcEJnblBhcmFnLT5HZXRMaW5lUmFuZ2UoblN0YXJ0TGluZSAtIG5TdGFydExpbmVJblBhcmFnLCBuUGFnZVN0YXJ0LCBuVGVtcCk7DQorICBuRW5kUGFyYWcgPSBtX3BFZGl0RW5naW5lLT5MaW5lMlBhcmFnKG5CZ25QYXJhZywgblN0YXJ0TGluZUluUGFyYWcsIG5FbmRMaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuRW5kTGluZUluUGFyYWcpOw0KKyAgbV9wRW5kUGFyYWcgPSAoQ0ZERV9UeHRFZHRQYXJhZyopbV9wRWRpdEVuZ2luZS0+R2V0UGFyYWcobkVuZFBhcmFnKTsNCisgIG1fcEVuZFBhcmFnLT5Mb2FkUGFyYWcoKTsNCisgIG1fcEVuZFBhcmFnLT5HZXRMaW5lUmFuZ2UobkVuZExpbmUgLSBuRW5kTGluZUluUGFyYWcsIG5QYWdlRW5kLCBuVGVtcCk7DQorICBuUGFnZUVuZCArPSAoblRlbXAgLSAxKTsNCisgIEZYX0JPT0wgYlZlcnRpYWwgPSBwUGFyYW1zLT5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9Eb2NWZXJ0aWNhbDsNCisgIEZYX0JPT0wgYkxpbmVSZXNlcnZlID0NCisgICAgICBwUGFyYW1zLT5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9MaW5lUmVzZXJ2ZTsNCisgIEZYX0ZMT0FUIGZMaW5lU3RhcnQgPQ0KKyAgICAgIGJWZXJ0aWFsDQorICAgICAgICAgID8gKGJMaW5lUmVzZXJ2ZSA/IChwUGFyYW1zLT5mUGxhdGVXaWR0aCAtIHBQYXJhbXMtPmZMaW5lU3BhY2UpIDogMC4wZikNCisgICAgICAgICAgOiAwLjBmOw0KKyAgRlhfRkxPQVQgZkxpbmVTdGVwID0NCisgICAgICAoYlZlcnRpYWwgJiYgYkxpbmVSZXNlcnZlKSA/ICgtcFBhcmFtcy0+ZkxpbmVTcGFjZSkgOiBwUGFyYW1zLT5mTGluZVNwYWNlOw0KKyAgRlhfRkxPQVQgZkxpbmVQb3MgPSBmTGluZVN0YXJ0Ow0KKyAgaWYgKG1fcFRleHRTZXQgPT0gTlVMTCkgew0KKyAgICBtX3BUZXh0U2V0ID0gbmV3IENGREVfVHh0RWR0VGV4dFNldCh0aGlzKTsNCisgIH0NCisgIG1fUGllY2VNYXNzQXJyLlJlbW92ZUFsbChUUlVFKTsNCisgIEZYX0RXT1JEIGR3QnJlYWtTdGF0dXMgPSBGWF9UWFRCUkVBS19Ob25lOw0KKyAgaW50MzJfdCBuUGllY2VTdGFydCA9IDA7DQorICBpZiAobV9wQ2hhcldpZHRoICE9IE5VTEwpIHsNCisgICAgZGVsZXRlW10gbV9wQ2hhcldpZHRoOw0KKyAgfQ0KKyAgbV9wQ2hhcldpZHRoID0gbmV3IGludDMyX3RbblBhZ2VFbmQgLSBuUGFnZVN0YXJ0ICsgMV07DQorICBwQnJlYWstPkVuZEJyZWFrKEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKTsNCisgIHBCcmVhay0+Q2xlYXJCcmVha1BpZWNlcygpOw0KKyAgbV9uUGFnZVN0YXJ0ID0gblBhZ2VTdGFydDsNCisgIG1fbkNoYXJDb3VudCA9IG5QYWdlRW5kIC0gblBhZ2VTdGFydCArIDE7DQorICBGWF9CT09MIGJSZWxvYWQgPSBGQUxTRTsNCisgIEZYX0ZMT0FUIGZEZWZDaGFyV2lkdGggPSAwOw0KKyAgSUZYX0NoYXJJdGVyKiBwSXRlciA9IG1fcEl0ZXItPkNsb25lKCk7DQorICBwSXRlci0+U2V0QXQoblBhZ2VTdGFydCk7DQorICBtX3BJdGVyLT5TZXRBdChuUGFnZVN0YXJ0KTsNCisgIEZYX0JPT0wgYkZpcnN0UGllY2UgPSBUUlVFOw0KKyAgZG8gew0KKyAgICBpZiAoYlJlbG9hZCkgew0KKyAgICAgIGR3QnJlYWtTdGF0dXMgPSBwQnJlYWstPkVuZEJyZWFrKEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWF9XQ0hBUiB3QXBwZW5kID0gcEl0ZXItPkdldENoYXIoKTsNCisgICAgICBkd0JyZWFrU3RhdHVzID0gcEJyZWFrLT5BcHBlbmRDaGFyKHdBcHBlbmQpOw0KKyAgICB9DQorICAgIGlmIChwSXRlci0+R2V0QXQoKSA9PSBuUGFnZUVuZCAmJiBkd0JyZWFrU3RhdHVzIDwgRlhfVFhUQlJFQUtfTGluZUJyZWFrKSB7DQorICAgICAgZHdCcmVha1N0YXR1cyA9IHBCcmVhay0+RW5kQnJlYWsoRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspOw0KKyAgICB9DQorICAgIGlmIChkd0JyZWFrU3RhdHVzID4gRlhfVFhUQlJFQUtfUGllY2VCcmVhaykgew0KKyAgICAgIGludDMyX3QgblBpZWNlQ291bnQgPSBwQnJlYWstPkNvdW50QnJlYWtQaWVjZXMoKTsNCisgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBuUGllY2VDb3VudDsgaisrKSB7DQorICAgICAgICBjb25zdCBDRlhfVHh0UGllY2UqIHBQaWVjZSA9IHBCcmVhay0+R2V0QnJlYWtQaWVjZShqKTsNCisgICAgICAgIEZERV9URVhURURJVFBJRUNFIFR4dEVkdFBpZWNlOw0KKyAgICAgICAgRlhTWVNfbWVtc2V0KCZUeHRFZHRQaWVjZSwgMCwgc2l6ZW9mKEZERV9URVhURURJVFBJRUNFKSk7DQorICAgICAgICBUeHRFZHRQaWVjZS5uQmlkaUxldmVsID0gcFBpZWNlLT5tX2lCaWRpTGV2ZWw7DQorICAgICAgICBUeHRFZHRQaWVjZS5uQ291bnQgPSBwUGllY2UtPkdldExlbmd0aCgpOw0KKyAgICAgICAgVHh0RWR0UGllY2UublN0YXJ0ID0gblBpZWNlU3RhcnQ7DQorICAgICAgICBUeHRFZHRQaWVjZS5kd0NoYXJTdHlsZXMgPSBwUGllY2UtPm1fZHdDaGFyU3R5bGVzOw0KKyAgICAgICAgaWYgKEZYX0lzT2RkKHBQaWVjZS0+bV9pQmlkaUxldmVsKSkgew0KKyAgICAgICAgICBUeHRFZHRQaWVjZS5kd0NoYXJTdHlsZXMgfD0gRlhfVFhUQ0hBUlNUWUxFX09kZEJpZGlMZXZlbDsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0ZMT0FUIGZQYXJhQnJlYWtXaWR0aCA9IDAuMGY7DQorICAgICAgICBpZiAocFBpZWNlLT5tX2R3U3RhdHVzID4gRlhfVFhUQlJFQUtfUGllY2VCcmVhaykgew0KKyAgICAgICAgICBGWF9XQ0hBUiB3UnRDaGFyID0gcFBhcmFtcy0+d0xpbmVCcmVha0NoYXI7DQorICAgICAgICAgIGlmIChUeHRFZHRQaWVjZS5uQ291bnQgPj0gMikgew0KKyAgICAgICAgICAgIEZYX1dDSEFSIHdDaGFyID0gcEJ1Zi0+R2V0Q2hhckJ5SW5kZXgoDQorICAgICAgICAgICAgICAgIG1fblBhZ2VTdGFydCArIFR4dEVkdFBpZWNlLm5TdGFydCArIFR4dEVkdFBpZWNlLm5Db3VudCAtIDEpOw0KKyAgICAgICAgICAgIEZYX1dDSEFSIHdDaGFyUHJlID0gcEJ1Zi0+R2V0Q2hhckJ5SW5kZXgoDQorICAgICAgICAgICAgICAgIG1fblBhZ2VTdGFydCArIFR4dEVkdFBpZWNlLm5TdGFydCArIFR4dEVkdFBpZWNlLm5Db3VudCAtIDIpOw0KKyAgICAgICAgICAgIGlmICh3Q2hhciA9PSB3UnRDaGFyKSB7DQorICAgICAgICAgICAgICBmUGFyYUJyZWFrV2lkdGggKz0gZkRlZkNoYXJXaWR0aDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHdDaGFyUHJlID09IHdSdENoYXIpIHsNCisgICAgICAgICAgICAgIGZQYXJhQnJlYWtXaWR0aCArPSBmRGVmQ2hhcldpZHRoOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIGlmIChUeHRFZHRQaWVjZS5uQ291bnQgPj0gMSkgew0KKyAgICAgICAgICAgIEZYX1dDSEFSIHdDaGFyID0gcEJ1Zi0+R2V0Q2hhckJ5SW5kZXgoDQorICAgICAgICAgICAgICAgIG1fblBhZ2VTdGFydCArIFR4dEVkdFBpZWNlLm5TdGFydCArIFR4dEVkdFBpZWNlLm5Db3VudCAtIDEpOw0KKyAgICAgICAgICAgIGlmICh3Q2hhciA9PSB3UnRDaGFyKSB7DQorICAgICAgICAgICAgICBmUGFyYUJyZWFrV2lkdGggKz0gZkRlZkNoYXJXaWR0aDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChwUGFyYW1zLT5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9Eb2NWZXJ0aWNhbCkgew0KKyAgICAgICAgICBUeHRFZHRQaWVjZS5ydFBpZWNlLmxlZnQgPSBmTGluZVBvczsNCisgICAgICAgICAgVHh0RWR0UGllY2UucnRQaWVjZS50b3AgPSAoRlhfRkxPQVQpcFBpZWNlLT5tX2lTdGFydFBvcyAvIDIwMDAwLjBmOw0KKyAgICAgICAgICBUeHRFZHRQaWVjZS5ydFBpZWNlLndpZHRoID0gcFBhcmFtcy0+ZkxpbmVTcGFjZTsNCisgICAgICAgICAgVHh0RWR0UGllY2UucnRQaWVjZS5oZWlnaHQgPQ0KKyAgICAgICAgICAgICAgKEZYX0ZMT0FUKXBQaWVjZS0+bV9pV2lkdGggLyAyMDAwMC4wZiArIGZQYXJhQnJlYWtXaWR0aDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIFR4dEVkdFBpZWNlLnJ0UGllY2UubGVmdCA9IChGWF9GTE9BVClwUGllY2UtPm1faVN0YXJ0UG9zIC8gMjAwMDAuMGY7DQorICAgICAgICAgIFR4dEVkdFBpZWNlLnJ0UGllY2UudG9wID0gZkxpbmVQb3M7DQorICAgICAgICAgIFR4dEVkdFBpZWNlLnJ0UGllY2Uud2lkdGggPQ0KKyAgICAgICAgICAgICAgKEZYX0ZMT0FUKXBQaWVjZS0+bV9pV2lkdGggLyAyMDAwMC4wZiArIGZQYXJhQnJlYWtXaWR0aDsNCisgICAgICAgICAgVHh0RWR0UGllY2UucnRQaWVjZS5oZWlnaHQgPSBwUGFyYW1zLT5mTGluZVNwYWNlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGJGaXJzdFBpZWNlKSB7DQorICAgICAgICAgIG1fcnRQYWdlQ29udGVudHMgPSBUeHRFZHRQaWVjZS5ydFBpZWNlOw0KKyAgICAgICAgICBiRmlyc3RQaWVjZSA9IEZBTFNFOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgbV9ydFBhZ2VDb250ZW50cy5VbmlvbihUeHRFZHRQaWVjZS5ydFBpZWNlKTsNCisgICAgICAgIH0NCisgICAgICAgIG5QaWVjZVN0YXJ0ICs9IFR4dEVkdFBpZWNlLm5Db3VudDsNCisgICAgICAgIG1fUGllY2VNYXNzQXJyLkFkZChUeHRFZHRQaWVjZSk7DQorICAgICAgICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBUeHRFZHRQaWVjZS5uQ291bnQ7IGsrKykgew0KKyAgICAgICAgICBDRlhfQ2hhciogcHRjID0gcFBpZWNlLT5HZXRDaGFyUHRyKGspOw0KKyAgICAgICAgICBtX3BDaGFyV2lkdGhbVHh0RWR0UGllY2UublN0YXJ0ICsga10gPSBwdGMtPm1faUNoYXJXaWR0aDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgZkxpbmVQb3MgKz0gZkxpbmVTdGVwOw0KKyAgICAgIHBCcmVhay0+Q2xlYXJCcmVha1BpZWNlcygpOw0KKyAgICB9DQorICAgIGlmIChwSXRlci0+R2V0QXQoKSA9PSBuUGFnZUVuZCAmJiBkd0JyZWFrU3RhdHVzID09IEZYX1RYVEJSRUFLX0xpbmVCcmVhaykgew0KKyAgICAgIGJSZWxvYWQgPSBUUlVFOw0KKyAgICAgIHBJdGVyLT5OZXh0KFRSVUUpOw0KKyAgICB9DQorICB9IHdoaWxlIChwSXRlci0+TmV4dChGQUxTRSkgJiYgKHBJdGVyLT5HZXRBdCgpIDw9IG5QYWdlRW5kKSk7DQorICBpZiAobV9ydFBhZ2VDb250ZW50cy5sZWZ0ICE9IDApIHsNCisgICAgRlhfRkxPQVQgZkRlbHRhID0gMC4wZjsNCisgICAgaWYgKG1fcnRQYWdlQ29udGVudHMud2lkdGggPCBwUGFyYW1zLT5mUGxhdGVXaWR0aCkgew0KKyAgICAgIGlmIChwUGFyYW1zLT5kd0FsaWdubWVudCAmIEZERV9URVhURURJVEFMSUdOX1JpZ2h0KSB7DQorICAgICAgICBmRGVsdGEgPSBwUGFyYW1zLT5mUGxhdGVXaWR0aCAtIG1fcnRQYWdlQ29udGVudHMud2lkdGg7DQorICAgICAgfSBlbHNlIGlmIChwUGFyYW1zLT5kd0FsaWdubWVudCAmIEZERV9URVhURURJVEFMSUdOX0NlbnRlcikgew0KKyAgICAgICAgaWYgKChwUGFyYW1zLT5kd0xheW91dFN0eWxlcyAmIEZERV9URVhURURJVExBWU9VVF9Db21iVGV4dCkgJiYNCisgICAgICAgICAgICBtX25DaGFyQ291bnQgPiAxKSB7DQorICAgICAgICAgIGludDMyX3QgbkNvdW50ID0gbV9uQ2hhckNvdW50IC0gMTsNCisgICAgICAgICAgaW50MzJfdCBuID0gKG1fcEVkaXRFbmdpbmUtPm1fbkxpbWl0IC0gbkNvdW50KSAvIDI7DQorICAgICAgICAgIGZEZWx0YSA9IChtX3J0UGFnZUNvbnRlbnRzLndpZHRoIC8gbkNvdW50KSAqIG47DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBmRGVsdGEgPSAocFBhcmFtcy0+ZlBsYXRlV2lkdGggLSBtX3J0UGFnZUNvbnRlbnRzLndpZHRoKSAvIDI7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZPZmZzZXQgPSBtX3J0UGFnZUNvbnRlbnRzLmxlZnQgLSBmRGVsdGE7DQorICAgIGludDMyX3QgbkNvdW50ID0gbV9QaWVjZU1hc3NBcnIuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICAgIEZERV9MUFRFWFRFRElUUElFQ0UgcFBpZWNlID0gbV9QaWVjZU1hc3NBcnIuR2V0UHRyQXQoaSk7DQorICAgICAgcFBpZWNlLT5ydFBpZWNlLk9mZnNldCgtZk9mZnNldCwgMC4wZik7DQorICAgIH0NCisgICAgbV9ydFBhZ2VDb250ZW50cy5PZmZzZXQoLWZPZmZzZXQsIDAuMGYpOw0KKyAgfQ0KKyAgaWYgKG1fcEVkaXRFbmdpbmUtPkdldEVkaXRQYXJhbXMoKS0+ZHdMYXlvdXRTdHlsZXMgJg0KKyAgICAgIEZERV9URVhURURJVExBWU9VVF9MYXN0TGluZUhlaWdodCkgew0KKyAgICBtX3J0UGFnZUNvbnRlbnRzLmhlaWdodCAtPSBwUGFyYW1zLT5mTGluZVNwYWNlIC0gcFBhcmFtcy0+ZkZvbnRTaXplOw0KKyAgICBpbnQzMl90IG5Db3VudCA9IG1fUGllY2VNYXNzQXJyLkdldFNpemUoKTsNCisgICAgRkRFX0xQVEVYVEVESVRQSUVDRSBwUGllY2UgPSBtX1BpZWNlTWFzc0Fyci5HZXRQdHJBdChuQ291bnQgLSAxKTsNCisgICAgcFBpZWNlLT5ydFBpZWNlLmhlaWdodCA9IHBQYXJhbXMtPmZGb250U2l6ZTsNCisgIH0NCisgIHBJdGVyLT5SZWxlYXNlKCk7DQorICBtX25SZWZDb3VudCA9IDE7DQorICBtX2JMb2FkZWQgPSBUUlVFOw0KKyAgcmV0dXJuIDA7DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRQYWdlOjpVbmxvYWRQYWdlKEZYX0xQQ1JFQ1RGIHBDbGlwQm94KSB7DQorICBGWFNZU19hc3NlcnQobV9uUmVmQ291bnQgPiAwKTsNCisgIG1fblJlZkNvdW50LS07DQorICBpZiAobV9uUmVmQ291bnQgPT0gMCkgew0KKyAgICBtX1BpZWNlTWFzc0Fyci5SZW1vdmVBbGwoKTsNCisgICAgaWYgKG1fcFRleHRTZXQpIHsNCisgICAgICBkZWxldGUgbV9wVGV4dFNldDsNCisgICAgICBtX3BUZXh0U2V0ID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAobV9wQ2hhcldpZHRoKSB7DQorICAgICAgZGVsZXRlW10gbV9wQ2hhcldpZHRoOw0KKyAgICAgIG1fcENoYXJXaWR0aCA9IE5VTEw7DQorICAgIH0NCisgICAgaWYgKG1fcEJnblBhcmFnKSB7DQorICAgICAgbV9wQmduUGFyYWctPlVubG9hZFBhcmFnKCk7DQorICAgIH0NCisgICAgaWYgKG1fcEVuZFBhcmFnKSB7DQorICAgICAgbV9wRW5kUGFyYWctPlVubG9hZFBhcmFnKCk7DQorICAgIH0NCisgICAgaWYgKG1fcEl0ZXIpIHsNCisgICAgICBtX3BJdGVyLT5SZWxlYXNlKCk7DQorICAgICAgbV9wSXRlciA9IE5VTEw7DQorICAgIH0NCisgICAgbV9wQmduUGFyYWcgPSBOVUxMOw0KKyAgICBtX3BFbmRQYXJhZyA9IE5VTEw7DQorICB9DQorICByZXR1cm47DQorfQ0KK2NvbnN0IENGWF9SZWN0RiYgQ0ZERV9UeHRFZHRQYWdlOjpHZXRDb250ZW50c0JveCgpIHsNCisgIHJldHVybiBtX3J0UGFnZUNvbnRlbnRzOw0KK30NCitGWF9QT1NJVElPTiBDRkRFX1R4dEVkdFBhZ2U6OkdldEZpcnN0UG9zaXRpb24oRkRFX0hWSVNVQUxPQkogaENhbnZhcykgew0KKyAgaWYgKG1fUGllY2VNYXNzQXJyLkdldFNpemUoKSA8IDEpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gKEZYX1BPU0lUSU9OKTE7DQorfQ0KK0ZERV9IVklTVUFMT0JKIENGREVfVHh0RWR0UGFnZTo6R2V0TmV4dChGREVfSFZJU1VBTE9CSiBoQ2FudmFzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9QT1NJVElPTiYgcG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1Zpc3VhbFNldComIHBWaXN1YWxTZXQpIHsNCisgIGlmIChtX3BUZXh0U2V0ID09IE5VTEwpIHsNCisgICAgcG9zID0gTlVMTDsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpbnQzMl90IG5Qb3MgPSAoaW50MzJfdCkodWludHB0cl90KXBvczsNCisgIHBWaXN1YWxTZXQgPSBtX3BUZXh0U2V0Ow0KKyAgaWYgKG5Qb3MgKyAxID4gbV9QaWVjZU1hc3NBcnIuR2V0U2l6ZSgpKSB7DQorICAgIHBvcyA9IE5VTEw7DQorICB9IGVsc2Ugew0KKyAgICBwb3MgPSAoRlhfUE9TSVRJT04pKHVpbnRwdHJfdCkoblBvcyArIDEpOw0KKyAgfQ0KKyAgcmV0dXJuIChGREVfSFZJU1VBTE9CSikobV9QaWVjZU1hc3NBcnIuR2V0UHRyQXQoblBvcyAtIDEpKTsNCit9DQorRkRFX0hWSVNVQUxPQkogQ0ZERV9UeHRFZHRQYWdlOjpHZXRQYXJlbnRDYW52YXMoRkRFX0hWSVNVQUxPQkogaENhbnZhcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1Zpc3VhbFNldComIHBWaXN1YWxTZXQpIHsNCisgIHJldHVybiBOVUxMOw0KK30NCitGWF9XQ0hBUiBDRkRFX1R4dEVkdFBhZ2U6OkdldENoYXIodm9pZCogcElkZW50aXR5LCBpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICBpbnQzMl90IG5JbmRleCA9DQorICAgICAgbV9uUGFnZVN0YXJ0ICsgKChGREVfTFBURVhURURJVFBJRUNFKXBJZGVudGl0eSktPm5TdGFydCArIGluZGV4Ow0KKyAgaWYgKG5JbmRleCAhPSBtX3BJdGVyLT5HZXRBdCgpKSB7DQorICAgIG1fcEl0ZXItPlNldEF0KG5JbmRleCk7DQorICB9DQorICBGWF9XQ0hBUiB3Q2hhciA9IG1fcEl0ZXItPkdldENoYXIoKTsNCisgIG1fcEl0ZXItPk5leHQoKTsNCisgIHJldHVybiB3Q2hhcjsNCit9DQoraW50MzJfdCBDRkRFX1R4dEVkdFBhZ2U6OkdldFdpZHRoKHZvaWQqIHBJZGVudGl0eSwgaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgaW50MzJfdCBuV2lkdGggPQ0KKyAgICAgIG1fcENoYXJXaWR0aFsoKEZERV9MUFRFWFRFRElUUElFQ0UpcElkZW50aXR5KS0+blN0YXJ0ICsgaW5kZXhdOw0KKyAgcmV0dXJuIG5XaWR0aDsNCit9DQordm9pZCBDRkRFX1R4dEVkdFBhZ2U6Ok5vcm1hbGl6ZVB0MlJlY3QoQ0ZYX1BvaW50RiYgcHRGLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRGLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUb2xlcmFuY2UpIGNvbnN0IHsNCisgIGlmIChydEYuQ29udGFpbnMocHRGLngsIHB0Ri55KSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAocHRGLnggPCBydEYubGVmdCkgew0KKyAgICBwdEYueCA9IHJ0Ri5sZWZ0Ow0KKyAgfSBlbHNlIGlmIChwdEYueCA+PSBydEYucmlnaHQoKSkgew0KKyAgICBwdEYueCA9IHJ0Ri5yaWdodCgpIC0gZlRvbGVyYW5jZTsNCisgIH0NCisgIGlmIChwdEYueSA8IHJ0Ri50b3ApIHsNCisgICAgcHRGLnkgPSBydEYudG9wOw0KKyAgfSBlbHNlIGlmIChwdEYueSA+PSBydEYuYm90dG9tKCkpIHsNCisgICAgcHRGLnkgPSBydEYuYm90dG9tKCkgLSBmVG9sZXJhbmNlOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRwYWdlLmggYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRwYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkzNWIzMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdHBhZ2UuaApAQCAtMCwwICsxLDE1NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GREVfVFhURURUUEFHRV9IDQorI2RlZmluZSBfRkRFX1RYVEVEVFBBR0VfSA0KK2NsYXNzIENGREVfVHh0RWR0RW5naW5lOw0KK2NsYXNzIElGWF9DaGFySXRlcjsNCitjbGFzcyBDRkRFX1R4dEVkdFBhZ2U7DQorY2xhc3MgQ0ZERV9UeHRFZHRMaW5lRXh0Ow0KK2NsYXNzIENGREVfVHh0RWR0VGV4dFNldDsNCitjbGFzcyBDRkRFX1R4dEVkdFBhcmFnOw0KK2VudW0gRkRFX1RYVEVEVF9DSEFSVFlQRSB7DQorICBGREVfVFhURURUX0NIQVJUWVBFX1Vua25vd24gPSAwLA0KKyAgRkRFX1RYVEVEVF9DSEFSVFlQRV9UYWIsDQorICBGREVfVFhURURUX0NIQVJUWVBFX1NwYWNlLA0KKyAgRkRFX1RYVEVEVF9DSEFSVFlQRV9QdW5jdHVhdGlvbiwNCisgIEZERV9UWFRFRFRfQ0hBUlRZUEVfTGluZUJyZWFrLA0KKyAgRkRFX1RYVEVEVF9DSEFSVFlQRV9OdW1iZXIsDQorICBGREVfVFhURURUX0NIQVJUWVBFX0NoYXIsDQorICBGREVfVFhURURUX0NIQVJUWVBFX0NKSywNCit9Ow0KK2lubGluZSBGREVfVFhURURUX0NIQVJUWVBFIEZERV9HZXRFZGl0U2VsQ2hhclR5cGUoRlhfV0NIQVIgd0NoYXIpIHsNCisgIGlmICh3Q2hhciA9PSAweDkpIHsNCisgICAgcmV0dXJuIEZERV9UWFRFRFRfQ0hBUlRZUEVfVGFiOw0KKyAgfSBlbHNlIGlmICh3Q2hhciA9PSAweDIwIHx8IHdDaGFyID09IDB4QTApIHsNCisgICAgcmV0dXJuIEZERV9UWFRFRFRfQ0hBUlRZUEVfU3BhY2U7DQorICB9IGVsc2UgaWYgKHdDaGFyID09IDB4OSB8fCB3Q2hhciA9PSAweDIwIHx8IHdDaGFyID09IDB4QTAgfHwNCisgICAgICAgICAgICAgKHdDaGFyID49IEwnIScgJiYgd0NoYXIgPD0gTCcvJykgfHwNCisgICAgICAgICAgICAgKHdDaGFyID49IEwnOicgJiYgd0NoYXIgPD0gTCdAJykgfHwNCisgICAgICAgICAgICAgKHdDaGFyID49IEwnWycgJiYgd0NoYXIgPD0gTCdeJykgfHwNCisgICAgICAgICAgICAgKHdDaGFyID49IEwneycgJiYgd0NoYXIgPD0gTCd+JykgfHwgd0NoYXIgPT0gMHg2MCkgew0KKyAgICByZXR1cm4gRkRFX1RYVEVEVF9DSEFSVFlQRV9QdW5jdHVhdGlvbjsNCisgIH0gZWxzZSBpZiAod0NoYXIgPT0gMHgwYSB8fCB3Q2hhciA9PSAweDBkKSB7DQorICAgIHJldHVybiBGREVfVFhURURUX0NIQVJUWVBFX0xpbmVCcmVhazsNCisgIH0gZWxzZSBpZiAod0NoYXIgPj0gJzAnICYmIHdDaGFyIDw9ICc5Jykgew0KKyAgICByZXR1cm4gRkRFX1RYVEVEVF9DSEFSVFlQRV9OdW1iZXI7DQorICB9IGVsc2UgaWYgKCh3Q2hhciA+PSAweDJlODAgJiYgd0NoYXIgPD0gMHgyZWZmKSB8fA0KKyAgICAgICAgICAgICAod0NoYXIgPj0gMHgzMDAwICYmIHdDaGFyIDw9IDB4MzAzZikgfHwNCisgICAgICAgICAgICAgKHdDaGFyID49IDB4MzFjMCAmJiB3Q2hhciA8PSAweDMxZWYpIHx8DQorICAgICAgICAgICAgICh3Q2hhciA+PSAweDMyMDAgJiYgd0NoYXIgPD0gMHgzMmZmKSB8fA0KKyAgICAgICAgICAgICAod0NoYXIgPj0gMHgzMzAwICYmIHdDaGFyIDw9IDB4MzNmZikgfHwNCisgICAgICAgICAgICAgKHdDaGFyID49IDB4MzQwMCAmJiB3Q2hhciA8PSAweDRkYmYpIHx8DQorICAgICAgICAgICAgICh3Q2hhciA+PSAweDRlMDAgJiYgd0NoYXIgPD0gMHg5ZmZmKSB8fA0KKyAgICAgICAgICAgICAod0NoYXIgPj0gMHhmOTAwICYmIHdDaGFyIDw9IDB4ZmFmZikgfHwNCisgICAgICAgICAgICAgKHdDaGFyID49IDB4ZmUzMCAmJiB3Q2hhciA8PSAweGZlNGYpKSB7DQorICAgIHJldHVybiBGREVfVFhURURUX0NIQVJUWVBFX0NKSzsNCisgIH0gZWxzZSB7DQorICAgIHJldHVybiBGREVfVFhURURUX0NIQVJUWVBFX0NoYXI7DQorICB9DQorfQ0KK3R5cGVkZWYgc3RydWN0IF9GREVfVFhURURUUElFQ0Ugew0KKyAgaW50MzJfdCBuU3RhcnQ7DQorICBpbnQzMl90IG5Db3VudDsNCisgIGludDMyX3QgbkJpZGlMZXZlbDsNCisgIENGWF9SZWN0RiBydFBpZWNlOw0KKyAgRlhfRFdPUkQgZHdDaGFyU3R5bGVzOw0KK30gRkRFX1RFWFRFRElUUElFQ0UsICpGREVfTFBURVhURURJVFBJRUNFOw0KK3R5cGVkZWYgQ0ZYX01hc3NBcnJheVRlbXBsYXRlPEZERV9URVhURURJVFBJRUNFPiBDRkRFX1RYVEVEVFBpZWNlTWFzc0FycmF5Ow0KK2NsYXNzIENGREVfVHh0RWR0VGV4dFNldCA6IHB1YmxpYyBJRkRFX1RleHRTZXQgew0KKyBwdWJsaWM6DQorICBDRkRFX1R4dEVkdFRleHRTZXQoQ0ZERV9UeHRFZHRQYWdlKiBwUGFnZSk7DQorICB+Q0ZERV9UeHRFZHRUZXh0U2V0KCk7DQorDQorICB2aXJ0dWFsIEZERV9WSVNVQUxPQkpUWVBFIEdldFR5cGUoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRCQm94KEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmosIENGWF9SZWN0RiYgYmJveCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0TWF0cml4KEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmosIENGWF9NYXRyaXgmIG1hdHJpeCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0UmVjdChGREVfSFZJU1VBTE9CSiBoVmlzdWFsT2JqLCBDRlhfUmVjdEYmIHJ0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRDbGlwKEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmosIENGWF9SZWN0RiYgcnQpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFN0cmluZyhGREVfSFZJU1VBTE9CSiBoVGV4dCwgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorICB2aXJ0dWFsIElGWF9Gb250KiBHZXRGb250KEZERV9IVklTVUFMT0JKIGhUZXh0KTsNCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0Rm9udFNpemUoRkRFX0hWSVNVQUxPQkogaFRleHQpOw0KKyAgdmlydHVhbCBGWF9BUkdCIEdldEZvbnRDb2xvcihGREVfSFZJU1VBTE9CSiBoVGV4dCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0RGlzcGxheVBvcyhGREVfSFZJU1VBTE9CSiBoVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyogcFdTRm9ybXMgPSBOVUxMKTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDaGFyUmVjdHMoRkRFX0hWSVNVQUxPQkogaFRleHQsIENGWF9SZWN0RkFycmF5JiBydEFycmF5KTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDaGFyUmVjdHNfSW1wbChGREVfSFZJU1VBTE9CSiBoVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEZBcnJheSYgcnRBcnJheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJCQm94ID0gRkFMU0UpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0ZERV9UeHRFZHRQYWdlKiBtX3BQYWdlOw0KK307DQorY2xhc3MgQ0ZERV9UeHRFZHRQYWdlIDogcHVibGljIElGREVfVHh0RWR0UGFnZSB7DQorIHB1YmxpYzoNCisgIENGREVfVHh0RWR0UGFnZShJRkRFX1R4dEVkdEVuZ2luZSogcEVuZ2luZSwgaW50MzJfdCBuTGluZUluZGV4KTsNCisNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCk7DQorICB2aXJ0dWFsIElGREVfVHh0RWR0RW5naW5lKiBHZXRFbmdpbmUoKSBjb25zdDsNCisNCisgIHZpcnR1YWwgRkRFX1ZJU1VBTE9CSlRZUEUgR2V0VHlwZSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldEJCb3goRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX1JlY3RGJiBiYm94KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRNYXRyaXgoRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX01hdHJpeCYgbWF0cml4KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRSZWN0KEZERV9IVklTVUFMT0JKIGhWaXN1YWxPYmosIENGWF9SZWN0RiYgcnQpOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldENsaXAoRkRFX0hWSVNVQUxPQkogaFZpc3VhbE9iaiwgQ0ZYX1JlY3RGJiBydCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q2hhclJlY3QoaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkJCb3ggPSBGQUxTRSkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q2hhckluZGV4KGNvbnN0IENGWF9Qb2ludEYmIGZQb2ludCwgRlhfQk9PTCYgYkJlZm9yZSk7DQorICB2aXJ0dWFsIGludDMyX3QgU2VsZWN0V29yZChjb25zdCBDRlhfUG9pbnRGJiBmUG9pbnQsIGludDMyX3QmIG5Db3VudCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q2hhclN0YXJ0KCkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q2hhckNvdW50KCkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgQ2FsY1JhbmdlUmVjdEFycmF5KGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGQXJyYXkmIFJlY3RGQXJyKSBjb25zdDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXREaXNwbGF5UG9zKGNvbnN0IENGWF9SZWN0RiYgcnRDbGlwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqJiBwQ2hhclBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQUkVDVEYgcEJCb3gpIGNvbnN0Ow0KKw0KKyAgdmlydHVhbCBGWF9CT09MIElzTG9hZGVkKEZYX0xQQ1JFQ1RGIHBDbGlwQm94ID0gTlVMTCk7DQorICB2aXJ0dWFsIGludDMyX3QgTG9hZFBhZ2UoRlhfTFBDUkVDVEYgcENsaXBCb3ggPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCk7DQorICB2aXJ0dWFsIHZvaWQgVW5sb2FkUGFnZShGWF9MUENSRUNURiBwQ2xpcEJveCA9IE5VTEwpOw0KKw0KKyAgdmlydHVhbCBjb25zdCBDRlhfUmVjdEYmIEdldENvbnRlbnRzQm94KCk7DQorICB2aXJ0dWFsIEZYX1BPU0lUSU9OIEdldEZpcnN0UG9zaXRpb24oRkRFX0hWSVNVQUxPQkogaENhbnZhcyk7DQorICB2aXJ0dWFsIEZERV9IVklTVUFMT0JKIEdldE5leHQoRkRFX0hWSVNVQUxPQkogaENhbnZhcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9QT1NJVElPTiYgcG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfVmlzdWFsU2V0KiYgcFZpc3VhbFNldCk7DQorICB2aXJ0dWFsIEZERV9IVklTVUFMT0JKIEdldFBhcmVudENhbnZhcyhGREVfSFZJU1VBTE9CSiBoQ2FudmFzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9WaXN1YWxTZXQqJiBwVmlzdWFsU2V0KTsNCisgIHZpcnR1YWwgRlhfV0NIQVIgR2V0Q2hhcih2b2lkKiBwSWRlbnRpdHksIGludDMyX3QgaW5kZXgpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IEdldFdpZHRoKHZvaWQqIHBJZGVudGl0eSwgaW50MzJfdCBpbmRleCkgY29uc3Q7DQorDQorIHByb3RlY3RlZDoNCisgIHZpcnR1YWwgfkNGREVfVHh0RWR0UGFnZSgpOw0KKw0KKyBwcml2YXRlOg0KKyAgdm9pZCBOb3JtYWxpemVQdDJSZWN0KENGWF9Qb2ludEYmIHB0RiwNCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0RiwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVG9sZXJhbmNlKSBjb25zdDsNCisgIElGWF9DaGFySXRlciogbV9wSXRlcjsNCisgIENGREVfVHh0RWR0VGV4dFNldCogbV9wVGV4dFNldDsNCisgIENGREVfVHh0RWR0RW5naW5lKiBtX3BFZGl0RW5naW5lOw0KKyAgQ0ZERV9UWFRFRFRQaWVjZU1hc3NBcnJheSBtX1BpZWNlTWFzc0FycjsNCisgIENGREVfVHh0RWR0UGFyYWcqIG1fcEJnblBhcmFnOw0KKyAgQ0ZERV9UeHRFZHRQYXJhZyogbV9wRW5kUGFyYWc7DQorDQorICBpbnQzMl90IG1fblJlZkNvdW50Ow0KKyAgaW50MzJfdCBtX25QYWdlU3RhcnQ7DQorICBpbnQzMl90IG1fbkNoYXJDb3VudDsNCisgIGludDMyX3QgbV9uUGFnZUluZGV4Ow0KKyAgRlhfQk9PTCBtX2JMb2FkZWQ7DQorICBDRlhfUmVjdEYgbV9ydFBhZ2U7DQorICBDRlhfUmVjdEYgbV9ydFBhZ2VNYXJnaW47DQorICBDRlhfUmVjdEYgbV9ydFBhZ2VDb250ZW50czsNCisgIENGWF9SZWN0RiBtX3J0UGFnZUNhbnZhczsNCisgIGludDMyX3QqIG1fcENoYXJXaWR0aDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdHBhcmFnLmNwcCBiL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdHBhcmFnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmUzYTI3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZWUvc3JjL2ZlZS9mZGVfdHh0ZWR0cGFyYWcuY3BwCkBAIC0wLDAgKzEsMTQ4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZmVlL2luY2x1ZGUvaWZkZV90eHRlZHRidWYuaCINCisjaW5jbHVkZSAieGZhL3NyYy9mZWUvaW5jbHVkZS9pZmRlX3R4dGVkdGVuZ2luZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZlZS9pbmNsdWRlL2Z4X3dvcmRicmVhay5oIg0KKyNpbmNsdWRlICJmZGVfdHh0ZWR0cGFyYWcuaCINCisjaW5jbHVkZSAiZmRlX3R4dGVkdGVuZ2luZS5oIg0KKyNpbmNsdWRlICJmZGVfdHh0ZWR0YnVmLmgiDQorQ0ZERV9UeHRFZHRQYXJhZzo6Q0ZERV9UeHRFZHRQYXJhZyhDRkRFX1R4dEVkdEVuZ2luZSogcEVuZ2luZSkNCisgICAgOiBtX25DaGFyU3RhcnQoMCksDQorICAgICAgbV9uQ2hhckNvdW50KDApLA0KKyAgICAgIG1fbkxpbmVDb3VudCgwKSwNCisgICAgICBtX2xwRGF0YShOVUxMKSwNCisgICAgICBtX3BFbmdpbmUocEVuZ2luZSkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcEVuZ2luZSk7DQorfQ0KK0NGREVfVHh0RWR0UGFyYWc6On5DRkRFX1R4dEVkdFBhcmFnKCkgew0KKyAgaWYgKG1fbHBEYXRhICE9IE5VTEwpIHsNCisgICAgRlhfRnJlZShtX2xwRGF0YSk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZERV9UeHRFZHRQYXJhZzo6TG9hZFBhcmFnKCkgew0KKyAgaWYgKG1fbHBEYXRhICE9IE5VTEwpIHsNCisgICAgKChpbnQzMl90KiltX2xwRGF0YSlbMF0rKzsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSUZYX1R4dEJyZWFrKiBwVHh0QnJlYWsgPSBtX3BFbmdpbmUtPkdldFRleHRCcmVhaygpOw0KKyAgSUZERV9UeHRFZHRCdWYqIHBUeHRCdWYgPSBtX3BFbmdpbmUtPkdldFRleHRCdWYoKTsNCisgIGNvbnN0IEZERV9UWFRFRFRQQVJBTVMqIHBQYXJhbSA9IG1fcEVuZ2luZS0+R2V0RWRpdFBhcmFtcygpOw0KKyAgRlhfV0NIQVIgd2NBbGlhcyA9IDA7DQorICBpZiAocFBhcmFtLT5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX1Bhc3N3b3JkKSB7DQorICAgIHdjQWxpYXMgPSBtX3BFbmdpbmUtPkdldEFsaWFzQ2hhcigpOw0KKyAgfQ0KKyAgSUZYX0NoYXJJdGVyKiBwSXRlciA9DQorICAgICAgbmV3IENGREVfVHh0RWR0QnVmSXRlcigoQ0ZERV9UeHRFZHRCdWYqKXBUeHRCdWYsIHdjQWxpYXMpOw0KKyAgcEl0ZXItPlNldEF0KG1fbkNoYXJTdGFydCk7DQorICBpbnQzMl90IG5FbmRJbmRleCA9IG1fbkNoYXJTdGFydCArIG1fbkNoYXJDb3VudDsNCisgIENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+IExpbmVCYXNlQXJyOw0KKyAgRlhfQk9PTCBiUmVsb2FkID0gRkFMU0U7DQorICBGWF9EV09SRCBkd0JyZWFrU3RhdHVzID0gRlhfVFhUQlJFQUtfTm9uZTsNCisgIGRvIHsNCisgICAgaWYgKGJSZWxvYWQpIHsNCisgICAgICBkd0JyZWFrU3RhdHVzID0gcFR4dEJyZWFrLT5FbmRCcmVhayhGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhayk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhfV0NIQVIgd0FwcGVuZCA9IHBJdGVyLT5HZXRDaGFyKCk7DQorICAgICAgZHdCcmVha1N0YXR1cyA9IHBUeHRCcmVhay0+QXBwZW5kQ2hhcih3QXBwZW5kKTsNCisgICAgfQ0KKyAgICBpZiAocEl0ZXItPkdldEF0KCkgKyAxID09IG5FbmRJbmRleCAmJg0KKyAgICAgICAgZHdCcmVha1N0YXR1cyA8IEZYX1RYVEJSRUFLX0xpbmVCcmVhaykgew0KKyAgICAgIGR3QnJlYWtTdGF0dXMgPSBwVHh0QnJlYWstPkVuZEJyZWFrKEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKTsNCisgICAgfQ0KKyAgICBpZiAoZHdCcmVha1N0YXR1cyA+IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspIHsNCisgICAgICBpbnQzMl90IG5Db3VudCA9IHBUeHRCcmVhay0+Q291bnRCcmVha1BpZWNlcygpOw0KKyAgICAgIGludDMyX3QgblRvdGFsID0gMDsNCisgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBuQ291bnQ7IGorKykgew0KKyAgICAgICAgY29uc3QgQ0ZYX1R4dFBpZWNlKiBQaWVjZSA9IHBUeHRCcmVhay0+R2V0QnJlYWtQaWVjZShqKTsNCisgICAgICAgIG5Ub3RhbCArPSBQaWVjZS0+R2V0TGVuZ3RoKCk7DQorICAgICAgfQ0KKyAgICAgIExpbmVCYXNlQXJyLkFkZChuVG90YWwpOw0KKyAgICAgIHBUeHRCcmVhay0+Q2xlYXJCcmVha1BpZWNlcygpOw0KKyAgICB9DQorICAgIGlmICgocEl0ZXItPkdldEF0KCkgKyAxID09IG5FbmRJbmRleCkgJiYNCisgICAgICAgIChkd0JyZWFrU3RhdHVzID09IEZYX1RYVEJSRUFLX0xpbmVCcmVhaykpIHsNCisgICAgICBiUmVsb2FkID0gVFJVRTsNCisgICAgICBwSXRlci0+TmV4dChUUlVFKTsNCisgICAgfQ0KKyAgfSB3aGlsZSAocEl0ZXItPk5leHQoRkFMU0UpICYmIChwSXRlci0+R2V0QXQoKSA8IG5FbmRJbmRleCkpOw0KKyAgcEl0ZXItPlJlbGVhc2UoKTsNCisgIHBUeHRCcmVhay0+RW5kQnJlYWsoRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspOw0KKyAgcFR4dEJyZWFrLT5DbGVhckJyZWFrUGllY2VzKCk7DQorICBpbnQzMl90IG5MaW5lQ291bnQgPSBMaW5lQmFzZUFyci5HZXRTaXplKCk7DQorICBtX25MaW5lQ291bnQgPSBuTGluZUNvdW50Ow0KKyAgaWYgKG1fbHBEYXRhID09IE5VTEwpIHsNCisgICAgbV9scERhdGEgPSBGWF9BbGxvYyhpbnQzMl90LCBuTGluZUNvdW50ICsgMSk7DQorICB9IGVsc2Ugew0KKyAgICBtX2xwRGF0YSA9IEZYX1JlYWxsb2MoaW50MzJfdCwgbV9scERhdGEsIChuTGluZUNvdW50ICsgMSkpOw0KKyAgfQ0KKyAgaW50MzJfdCogcEludEFyciA9IChpbnQzMl90KiltX2xwRGF0YTsNCisgIHBJbnRBcnJbMF0gPSAxOw0KKyAgbV9uTGluZUNvdW50ID0gbkxpbmVDb3VudDsNCisgIHBJbnRBcnIrKzsNCisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IG5MaW5lQ291bnQ7IGorKywgcEludEFycisrKSB7DQorICAgICpwSW50QXJyID0gTGluZUJhc2VBcnJbal07DQorICB9DQorICBMaW5lQmFzZUFyci5SZW1vdmVBbGwoKTsNCit9DQordm9pZCBDRkRFX1R4dEVkdFBhcmFnOjpVbmxvYWRQYXJhZygpIHsNCisgIEZYU1lTX2Fzc2VydChtX2xwRGF0YSAhPSBOVUxMKTsNCisgICgoaW50MzJfdCopbV9scERhdGEpWzBdLS07DQorICBGWFNZU19hc3NlcnQoKChpbnQzMl90KiltX2xwRGF0YSlbMF0gPj0gMCk7DQorICBpZiAoKChpbnQzMl90KiltX2xwRGF0YSlbMF0gPT0gMCkgew0KKyAgICBGWF9GcmVlKG1fbHBEYXRhKTsNCisgICAgbV9scERhdGEgPSBOVUxMOw0KKyAgfQ0KK30NCit2b2lkIENGREVfVHh0RWR0UGFyYWc6OkNhbGNMaW5lcygpIHsNCisgIElGWF9UeHRCcmVhayogcFR4dEJyZWFrID0gbV9wRW5naW5lLT5HZXRUZXh0QnJlYWsoKTsNCisgIElGREVfVHh0RWR0QnVmKiBwVHh0QnVmID0gbV9wRW5naW5lLT5HZXRUZXh0QnVmKCk7DQorICBJRlhfQ2hhckl0ZXIqIHBJdGVyID0gbmV3IENGREVfVHh0RWR0QnVmSXRlcigoQ0ZERV9UeHRFZHRCdWYqKXBUeHRCdWYpOw0KKyAgaW50MzJfdCBuQ291bnQgPSAwOw0KKyAgRlhfRFdPUkQgZHdCcmVha1N0YXR1cyA9IEZYX1RYVEJSRUFLX05vbmU7DQorICBpbnQzMl90IG5FbmRJbmRleCA9IG1fbkNoYXJTdGFydCArIG1fbkNoYXJDb3VudDsNCisgIHBJdGVyLT5TZXRBdChtX25DaGFyU3RhcnQpOw0KKyAgRlhfQk9PTCBiUmVsb2FkID0gRkFMU0U7DQorICBkbyB7DQorICAgIGlmIChiUmVsb2FkKSB7DQorICAgICAgZHdCcmVha1N0YXR1cyA9IHBUeHRCcmVhay0+RW5kQnJlYWsoRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYX1dDSEFSIHdBcHBlbmQgPSBwSXRlci0+R2V0Q2hhcigpOw0KKyAgICAgIGR3QnJlYWtTdGF0dXMgPSBwVHh0QnJlYWstPkFwcGVuZENoYXIod0FwcGVuZCk7DQorICAgIH0NCisgICAgaWYgKHBJdGVyLT5HZXRBdCgpICsgMSA9PSBuRW5kSW5kZXggJiYNCisgICAgICAgIGR3QnJlYWtTdGF0dXMgPCBGWF9UWFRCUkVBS19MaW5lQnJlYWspIHsNCisgICAgICBkd0JyZWFrU3RhdHVzID0gcFR4dEJyZWFrLT5FbmRCcmVhayhGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhayk7DQorICAgIH0NCisgICAgaWYgKGR3QnJlYWtTdGF0dXMgPiBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSB7DQorICAgICAgbkNvdW50Kys7DQorICAgICAgcFR4dEJyZWFrLT5DbGVhckJyZWFrUGllY2VzKCk7DQorICAgIH0NCisgICAgaWYgKChwSXRlci0+R2V0QXQoKSArIDEgPT0gbkVuZEluZGV4KSAmJg0KKyAgICAgICAgKGR3QnJlYWtTdGF0dXMgPT0gRlhfVFhUQlJFQUtfTGluZUJyZWFrKSkgew0KKyAgICAgIGJSZWxvYWQgPSBUUlVFOw0KKyAgICAgIHBJdGVyLT5OZXh0KFRSVUUpOw0KKyAgICB9DQorICB9IHdoaWxlIChwSXRlci0+TmV4dChGQUxTRSkgJiYgKHBJdGVyLT5HZXRBdCgpIDwgbkVuZEluZGV4KSk7DQorICBwSXRlci0+UmVsZWFzZSgpOw0KKyAgcFR4dEJyZWFrLT5FbmRCcmVhayhGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhayk7DQorICBwVHh0QnJlYWstPkNsZWFyQnJlYWtQaWVjZXMoKTsNCisgIG1fbkxpbmVDb3VudCA9IG5Db3VudDsNCit9DQordm9pZCBDRkRFX1R4dEVkdFBhcmFnOjpHZXRMaW5lUmFuZ2UoaW50MzJfdCBuTGluZUluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5TdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuQ291bnQpIGNvbnN0IHsNCisgIGludDMyX3QqIHBMaW5lQmFzZUFyciA9IChpbnQzMl90KiltX2xwRGF0YTsNCisgIEZYU1lTX2Fzc2VydChuTGluZUluZGV4IDwgbV9uTGluZUNvdW50KTsNCisgIG5TdGFydCA9IG1fbkNoYXJTdGFydDsNCisgIHBMaW5lQmFzZUFycisrOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkxpbmVJbmRleDsgaSsrKSB7DQorICAgIG5TdGFydCArPSAqcExpbmVCYXNlQXJyOw0KKyAgICBwTGluZUJhc2VBcnIrKzsNCisgIH0NCisgIG5Db3VudCA9ICpwTGluZUJhc2VBcnI7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmVlL3NyYy9mZWUvZmRlX3R4dGVkdHBhcmFnLmggYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRwYXJhZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNjg1YmUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZlZS9zcmMvZmVlL2ZkZV90eHRlZHRwYXJhZy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRkRFX1RYVEVEVFBBUkFHX0gNCisjZGVmaW5lIF9GREVfVFhURURUUEFSQUdfSA0KK2NsYXNzIENGREVfVHh0RWR0RW5naW5lOw0KK2NsYXNzIENGREVfVHh0RWR0UGFyYWc7DQorY2xhc3MgQ0ZERV9UeHRFZHRQYXJhZyA6IHB1YmxpYyBJRkRFX1R4dEVkdFBhcmFnIHsNCisgcHVibGljOg0KKyAgQ0ZERV9UeHRFZHRQYXJhZyhDRkRFX1R4dEVkdEVuZ2luZSogcEVuZ2luZSk7DQorICB+Q0ZERV9UeHRFZHRQYXJhZygpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFRleHRMZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX25DaGFyQ291bnQ7IH0NCisgIHZpcnR1YWwgaW50MzJfdCBHZXRTdGFydEluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9uQ2hhclN0YXJ0OyB9DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRMaW5lcygpIGNvbnN0IHsgcmV0dXJuIG1fbkxpbmVDb3VudDsgfQ0KKyAgdmlydHVhbCB2b2lkIEdldExpbmVSYW5nZShpbnQzMl90IG5MaW5lSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5TdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbkNvdW50KSBjb25zdDsNCisgIHZvaWQgTG9hZFBhcmFnKCk7DQorICB2b2lkIFVubG9hZFBhcmFnKCk7DQorICB2b2lkIENhbGNMaW5lcygpOw0KKyAgaW50MzJfdCBtX25DaGFyU3RhcnQ7DQorICBpbnQzMl90IG1fbkNoYXJDb3VudDsNCisgIGludDMyX3QgbV9uTGluZUNvdW50Ow0KKw0KKyBwcml2YXRlOg0KKyAgdm9pZCogbV9scERhdGE7DQorICBDRkRFX1R4dEVkdEVuZ2luZSogbV9wRW5naW5lOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZWUvc3JjL2Z4X3dvcmRicmVhay9meF93b3JkYnJlYWtfaW1wbC5jcHAgYi94ZmEvc3JjL2ZlZS9zcmMvZnhfd29yZGJyZWFrL2Z4X3dvcmRicmVha19pbXBsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODQxNTIzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZWUvc3JjL2Z4X3dvcmRicmVhay9meF93b3JkYnJlYWtfaW1wbC5jcHAKQEAgLTAsMCArMSwyMzkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAiZnhfd29yZGJyZWFrX2ltcGwuaCINCisjZGVmaW5lIEZYX0lzT2RkKGEpICgoYSkmMSkNCitGWF9Xb3JkQnJlYWtQcm9wIEZYX0dldFdvcmRCcmVha1Byb3BlcnR5KEZYX1dDSEFSIHdjQ29kZVBvaW50KSB7DQorICBGWF9EV09SRCBkd1Byb3BlcnR5ID0NCisgICAgICAoRlhfRFdPUkQpZ3NfRlhfV29yZEJyZWFrX0NvZGVQb2ludFByb3BlcnRpZXNbd2NDb2RlUG9pbnQgPj4gMV07DQorICByZXR1cm4gKEZYX1dvcmRCcmVha1Byb3ApKEZYX0lzT2RkKHdjQ29kZVBvaW50KSA/IChkd1Byb3BlcnR5ICYgMHgwRikNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGR3UHJvcGVydHkgPj4gNCkpOw0KK30NCitDRlhfQ2hhckl0ZXI6OkNGWF9DaGFySXRlcihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KQ0KKyAgICA6IG1fd3NUZXh0KHdzVGV4dCksIG1fbkluZGV4KDApIHsNCisgIEZYU1lTX2Fzc2VydCghd3NUZXh0LklzRW1wdHkoKSk7DQorfQ0KK0NGWF9DaGFySXRlcjo6fkNGWF9DaGFySXRlcigpIHt9DQordm9pZCBDRlhfQ2hhckl0ZXI6OlJlbGVhc2UoKSB7DQorICBkZWxldGUgdGhpczsNCit9DQorRlhfQk9PTCBDRlhfQ2hhckl0ZXI6Ok5leHQoRlhfQk9PTCBiUHJldikgew0KKyAgaWYgKGJQcmV2KSB7DQorICAgIGlmIChtX25JbmRleCA8PSAwKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIG1fbkluZGV4LS07DQorICB9IGVsc2Ugew0KKyAgICBpZiAobV9uSW5kZXggKyAxID49IG1fd3NUZXh0LkdldExlbmd0aCgpKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIG1fbkluZGV4Kys7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfV0NIQVIgQ0ZYX0NoYXJJdGVyOjpHZXRDaGFyKCkgew0KKyAgcmV0dXJuIG1fd3NUZXh0LkdldEF0KG1fbkluZGV4KTsNCit9DQordm9pZCBDRlhfQ2hhckl0ZXI6OlNldEF0KGludDMyX3QgbkluZGV4KSB7DQorICBpZiAobkluZGV4IDwgMCB8fCBuSW5kZXggPj0gbV93c1RleHQuR2V0TGVuZ3RoKCkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV9uSW5kZXggPSBuSW5kZXg7DQorfQ0KK2ludDMyX3QgQ0ZYX0NoYXJJdGVyOjpHZXRBdCgpIGNvbnN0IHsNCisgIHJldHVybiBtX25JbmRleDsNCit9DQorRlhfQk9PTCBDRlhfQ2hhckl0ZXI6OklzRU9GKEZYX0JPT0wgYlRhaWwpIGNvbnN0IHsNCisgIHJldHVybiBiVGFpbCA/IChtX25JbmRleCArIDEgPT0gbV93c1RleHQuR2V0TGVuZ3RoKCkpIDogKG1fbkluZGV4ID09IDApOw0KK30NCitJRlhfQ2hhckl0ZXIqIENGWF9DaGFySXRlcjo6Q2xvbmUoKSB7DQorICBDRlhfQ2hhckl0ZXIqIHBJdGVyID0gbmV3IENGWF9DaGFySXRlcihtX3dzVGV4dCk7DQorICBwSXRlci0+bV9uSW5kZXggPSBtX25JbmRleDsNCisgIHJldHVybiBwSXRlcjsNCit9DQorQ0ZYX1dvcmRCcmVhazo6Q0ZYX1dvcmRCcmVhaygpIDogbV9wUHJlSXRlcihOVUxMKSwgbV9wQ3VySXRlcihOVUxMKSB7fQ0KK0NGWF9Xb3JkQnJlYWs6On5DRlhfV29yZEJyZWFrKCkgew0KKyAgaWYgKG1fcFByZUl0ZXIpIHsNCisgICAgbV9wUHJlSXRlci0+UmVsZWFzZSgpOw0KKyAgICBtX3BQcmVJdGVyID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BDdXJJdGVyKSB7DQorICAgIG1fcEN1ckl0ZXItPlJlbGVhc2UoKTsNCisgICAgbV9wQ3VySXRlciA9IE5VTEw7DQorICB9DQorfQ0KK3ZvaWQgQ0ZYX1dvcmRCcmVhazo6UmVsZWFzZSgpIHsNCisgIGRlbGV0ZSB0aGlzOw0KK30NCit2b2lkIENGWF9Xb3JkQnJlYWs6OkF0dGFjaChJRlhfQ2hhckl0ZXIqIHBJdGVyKSB7DQorICBGWFNZU19hc3NlcnQocEl0ZXIpOw0KKyAgbV9wQ3VySXRlciA9IHBJdGVyOw0KK30NCit2b2lkIENGWF9Xb3JkQnJlYWs6OkF0dGFjaChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7DQorICBtX3BDdXJJdGVyID0gbmV3IENGWF9DaGFySXRlcih3c1RleHQpOw0KK30NCitGWF9CT09MIENGWF9Xb3JkQnJlYWs6Ok5leHQoRlhfQk9PTCBiUHJldikgew0KKyAgSUZYX0NoYXJJdGVyKiBwSXRlciA9IGJQcmV2ID8gbV9wUHJlSXRlci0+Q2xvbmUoKSA6IG1fcEN1ckl0ZXItPkNsb25lKCk7DQorICBpZiAocEl0ZXItPklzRU9GKCFiUHJldikpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcEl0ZXItPk5leHQoYlByZXYpOw0KKyAgaWYgKCFGaW5kTmV4dEJyZWFrUG9zKHBJdGVyLCBiUHJldiwgVFJVRSkpIHsNCisgICAgcEl0ZXItPlJlbGVhc2UoKTsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGJQcmV2KSB7DQorICAgIG1fcEN1ckl0ZXItPlJlbGVhc2UoKTsNCisgICAgbV9wQ3VySXRlciA9IG1fcFByZUl0ZXI7DQorICAgIG1fcEN1ckl0ZXItPk5leHQoVFJVRSk7DQorICAgIG1fcFByZUl0ZXIgPSBwSXRlcjsNCisgIH0gZWxzZSB7DQorICAgIG1fcFByZUl0ZXItPlJlbGVhc2UoKTsNCisgICAgbV9wUHJlSXRlciA9IG1fcEN1ckl0ZXI7DQorICAgIG1fcFByZUl0ZXItPk5leHQoKTsNCisgICAgbV9wQ3VySXRlciA9IHBJdGVyOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZYX1dvcmRCcmVhazo6U2V0QXQoaW50MzJfdCBuSW5kZXgpIHsNCisgIGlmIChtX3BQcmVJdGVyKSB7DQorICAgIG1fcFByZUl0ZXItPlJlbGVhc2UoKTsNCisgICAgbV9wUHJlSXRlciA9IE5VTEw7DQorICB9DQorICBtX3BDdXJJdGVyLT5TZXRBdChuSW5kZXgpOw0KKyAgRmluZE5leHRCcmVha1BvcyhtX3BDdXJJdGVyLCBUUlVFLCBGQUxTRSk7DQorICBtX3BQcmVJdGVyID0gbV9wQ3VySXRlcjsNCisgIG1fcEN1ckl0ZXIgPSBtX3BQcmVJdGVyLT5DbG9uZSgpOw0KKyAgRmluZE5leHRCcmVha1BvcyhtX3BDdXJJdGVyLCBGQUxTRSwgRkFMU0UpOw0KK30NCitpbnQzMl90IENGWF9Xb3JkQnJlYWs6OkdldFdvcmRQb3MoKSBjb25zdCB7DQorICByZXR1cm4gbV9wUHJlSXRlci0+R2V0QXQoKTsNCit9DQoraW50MzJfdCBDRlhfV29yZEJyZWFrOjpHZXRXb3JkTGVuZ3RoKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fcEN1ckl0ZXItPkdldEF0KCkgLSBtX3BQcmVJdGVyLT5HZXRBdCgpICsgMTsNCit9DQordm9pZCBDRlhfV29yZEJyZWFrOjpHZXRXb3JkKENGWF9XaWRlU3RyaW5nJiB3c1dvcmQpIGNvbnN0IHsNCisgIGludDMyX3QgbldvcmRMZW5ndGggPSBHZXRXb3JkTGVuZ3RoKCk7DQorICBpZiAobldvcmRMZW5ndGggPD0gMCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9XQ0hBUiogbHBCdWYgPSB3c1dvcmQuR2V0QnVmZmVyKG5Xb3JkTGVuZ3RoKTsNCisgIElGWF9DaGFySXRlciogcFRlbXBJdGVyID0gbV9wUHJlSXRlci0+Q2xvbmUoKTsNCisgIGludDMyX3QgaSA9IDA7DQorICB3aGlsZSAocFRlbXBJdGVyLT5HZXRBdCgpIDw9IG1fcEN1ckl0ZXItPkdldEF0KCkpIHsNCisgICAgbHBCdWZbaSsrXSA9IHBUZW1wSXRlci0+R2V0Q2hhcigpOw0KKyAgICBGWF9CT09MIGJFbmQgPSBwVGVtcEl0ZXItPk5leHQoKTsNCisgICAgaWYgKCFiRW5kKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHBUZW1wSXRlci0+UmVsZWFzZSgpOw0KKyAgd3NXb3JkLlJlbGVhc2VCdWZmZXIobldvcmRMZW5ndGgpOw0KK30NCitGWF9CT09MIENGWF9Xb3JkQnJlYWs6OklzRU9GKEZYX0JPT0wgYlRhaWwpIGNvbnN0IHsNCisgIHJldHVybiBtX3BDdXJJdGVyLT5Jc0VPRihiVGFpbCk7DQorfQ0KK0ZYX0JPT0wgQ0ZYX1dvcmRCcmVhazo6RmluZE5leHRCcmVha1BvcyhJRlhfQ2hhckl0ZXIqIHBJdGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcmV2LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJGcm9tTmV4dCkgew0KKyAgRlhfV29yZEJyZWFrUHJvcCBlUHJlVHlwZSA9IEZYX1dvcmRCcmVha1Byb3BfTm9uZTsNCisgIEZYX1dvcmRCcmVha1Byb3AgZUN1clR5cGUgPSBGWF9Xb3JkQnJlYWtQcm9wX05vbmU7DQorICBGWF9Xb3JkQnJlYWtQcm9wIGVOZXh0VHlwZSA9IEZYX1dvcmRCcmVha1Byb3BfTm9uZTsNCisgIGlmIChwSXRlci0+SXNFT0YoIWJQcmV2KSkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIGlmICghKGJGcm9tTmV4dCB8fCBwSXRlci0+SXNFT0YoYlByZXYpKSkgew0KKyAgICBwSXRlci0+TmV4dCghYlByZXYpOw0KKyAgICBGWF9XQ0hBUiB3Y1RlbXAgPSBwSXRlci0+R2V0Q2hhcigpOw0KKyAgICBlUHJlVHlwZSA9IEZYX0dldFdvcmRCcmVha1Byb3BlcnR5KHdjVGVtcCk7DQorICAgIHBJdGVyLT5OZXh0KGJQcmV2KTsNCisgIH0NCisgIEZYX1dDSEFSIHdjVGVtcCA9IHBJdGVyLT5HZXRDaGFyKCk7DQorICBlQ3VyVHlwZSA9IEZYX0dldFdvcmRCcmVha1Byb3BlcnR5KHdjVGVtcCk7DQorICBGWF9CT09MIGJGaXJzdCA9IFRSVUU7DQorICBkbyB7DQorICAgIHBJdGVyLT5OZXh0KGJQcmV2KTsNCisgICAgRlhfV0NIQVIgd2NUZW1wID0gcEl0ZXItPkdldENoYXIoKTsNCisgICAgZU5leHRUeXBlID0gRlhfR2V0V29yZEJyZWFrUHJvcGVydHkod2NUZW1wKTsNCisgICAgRlhfV09SRCB3QnJlYWsgPQ0KKyAgICAgICAgZ3NfRlhfV29yZEJyZWFrX1RhYmxlW2VDdXJUeXBlXSAmICgoRlhfV09SRCkoMSA8PCBlTmV4dFR5cGUpKTsNCisgICAgaWYgKHdCcmVhaykgew0KKyAgICAgIGlmIChwSXRlci0+SXNFT0YoIWJQcmV2KSkgew0KKyAgICAgICAgcEl0ZXItPk5leHQoIWJQcmV2KTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgICBpZiAoYkZpcnN0KSB7DQorICAgICAgICBpbnQzMl90IG5GbGFncyA9IDA7DQorICAgICAgICBpZiAoZUN1clR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9NaWRMZXR0ZXIpIHsNCisgICAgICAgICAgaWYgKGVOZXh0VHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX0FMZXR0ZXIpIHsNCisgICAgICAgICAgICBuRmxhZ3MgPSAxOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKGVDdXJUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfTWlkTnVtKSB7DQorICAgICAgICAgIGlmIChlTmV4dFR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9OdW1iZXJpYykgew0KKyAgICAgICAgICAgIG5GbGFncyA9IDI7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoZUN1clR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9NaWROdW1MZXQpIHsNCisgICAgICAgICAgaWYgKGVOZXh0VHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX0FMZXR0ZXIpIHsNCisgICAgICAgICAgICBuRmxhZ3MgPSAxOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKGVOZXh0VHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX051bWJlcmljKSB7DQorICAgICAgICAgICAgbkZsYWdzID0gMjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG5GbGFncyA+IDApIHsNCisgICAgICAgICAgRlhTWVNfYXNzZXJ0KG5GbGFncyA8PSAyKTsNCisgICAgICAgICAgaWYgKCEoKG5GbGFncyA9PSAxICYmIGVQcmVUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfQUxldHRlcikgfHwNCisgICAgICAgICAgICAgICAgKG5GbGFncyA9PSAyICYmIGVQcmVUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfTnVtYmVyaWMpKSkgew0KKyAgICAgICAgICAgIHBJdGVyLT5OZXh0KCFiUHJldik7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcEl0ZXItPk5leHQoYlByZXYpOw0KKyAgICAgICAgICB3QnJlYWsgPSBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGJGaXJzdCA9IEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBpZiAod0JyZWFrKSB7DQorICAgICAgICBpbnQzMl90IG5GbGFncyA9IDA7DQorICAgICAgICBpZiAoZU5leHRUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfTWlkTGV0dGVyKSB7DQorICAgICAgICAgIGlmIChlQ3VyVHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX0FMZXR0ZXIpIHsNCisgICAgICAgICAgICBuRmxhZ3MgPSAxOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKGVOZXh0VHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX01pZE51bSkgew0KKyAgICAgICAgICBpZiAoZUN1clR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9OdW1iZXJpYykgew0KKyAgICAgICAgICAgIG5GbGFncyA9IDI7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoZU5leHRUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfTWlkTnVtTGV0KSB7DQorICAgICAgICAgIGlmIChlQ3VyVHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX0FMZXR0ZXIpIHsNCisgICAgICAgICAgICBuRmxhZ3MgPSAxOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKGVDdXJUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfTnVtYmVyaWMpIHsNCisgICAgICAgICAgICBuRmxhZ3MgPSAyOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAobkZsYWdzIDw9IDApIHsNCisgICAgICAgICAgcEl0ZXItPk5leHQoIWJQcmV2KTsNCisgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBGWFNZU19hc3NlcnQobkZsYWdzIDw9IDIpOw0KKyAgICAgICAgcEl0ZXItPk5leHQoYlByZXYpOw0KKyAgICAgICAgd2NUZW1wID0gcEl0ZXItPkdldENoYXIoKTsNCisgICAgICAgIGVOZXh0VHlwZSA9IChGWF9Xb3JkQnJlYWtQcm9wKUZYX0dldFdvcmRCcmVha1Byb3BlcnR5KHdjVGVtcCk7DQorICAgICAgICBpZiAoISgobkZsYWdzID09IDEgJiYgZU5leHRUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfQUxldHRlcikgfHwNCisgICAgICAgICAgICAgIChuRmxhZ3MgPT0gMiAmJiBlTmV4dFR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9OdW1iZXJpYykpKSB7DQorICAgICAgICAgIHBJdGVyLT5OZXh0KCFiUHJldik7DQorICAgICAgICAgIHBJdGVyLT5OZXh0KCFiUHJldik7DQorICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBlUHJlVHlwZSA9IGVDdXJUeXBlOw0KKyAgICBlQ3VyVHlwZSA9IGVOZXh0VHlwZTsNCisgICAgYkZpcnN0ID0gRkFMU0U7DQorICB9IHdoaWxlICghcEl0ZXItPklzRU9GKCFiUHJldikpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0lGWF9Xb3JkQnJlYWsqIEZYX1dvcmRCcmVha19DcmVhdGUoKSB7DQorICByZXR1cm4gbmV3IENGWF9Xb3JkQnJlYWs7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmVlL3NyYy9meF93b3JkYnJlYWsvZnhfd29yZGJyZWFrX2ltcGwuaCBiL3hmYS9zcmMvZmVlL3NyYy9meF93b3JkYnJlYWsvZnhfd29yZGJyZWFrX2ltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDE4NTk1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZWUvc3JjL2Z4X3dvcmRicmVhay9meF93b3JkYnJlYWtfaW1wbC5oCkBAIC0wLDAgKzEsNjggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhfV09SREJSRUFLX0lNUExfSA0KKyNkZWZpbmUgX0ZYX1dPUkRCUkVBS19JTVBMX0gNCitleHRlcm4gY29uc3QgRlhfV09SRCBnc19GWF9Xb3JkQnJlYWtfVGFibGVbMTZdOw0KK2V4dGVybiBjb25zdCB1aW50OF90IGdzX0ZYX1dvcmRCcmVha19Db2RlUG9pbnRQcm9wZXJ0aWVzWygweEZGRkYgLSAxKSAvIDIgKyAxXTsNCitlbnVtIEZYX1dvcmRCcmVha1Byb3Agew0KKyAgRlhfV29yZEJyZWFrUHJvcF9Ob25lID0gMCwNCisgIEZYX1dvcmRCcmVha1Byb3BfQ1IsDQorICBGWF9Xb3JkQnJlYWtQcm9wX0xGLA0KKyAgRlhfV29yZEJyZWFrUHJvcF9OZXdMaW5lLA0KKyAgRlhfV29yZEJyZWFrUHJvcF9FeHRlbmQsDQorICBGWF9Xb3JkQnJlYWtQcm9wX0Zvcm1hdCwNCisgIEZYX1dvcmRCcmVha1Byb3BfS2F0YUthbmEsDQorICBGWF9Xb3JkQnJlYWtQcm9wX0FMZXR0ZXIsDQorICBGWF9Xb3JkQnJlYWtQcm9wX01pZExldHRlciwNCisgIEZYX1dvcmRCcmVha1Byb3BfTWlkTnVtLA0KKyAgRlhfV29yZEJyZWFrUHJvcF9NaWROdW1MZXQsDQorICBGWF9Xb3JkQnJlYWtQcm9wX051bWJlcmljLA0KKyAgRlhfV29yZEJyZWFrUHJvcF9FeHRlbmROdW1MZXQsDQorfTsNCitGWF9Xb3JkQnJlYWtQcm9wIEZYX0dldFdvcmRCcmVha1Byb3BlcnR5KEZYX1dDSEFSIHdjQ29kZVBvaW50KTsNCitjbGFzcyBDRlhfQ2hhckl0ZXIgOiBwdWJsaWMgSUZYX0NoYXJJdGVyIHsNCisgcHVibGljOg0KKyAgQ0ZYX0NoYXJJdGVyKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBOZXh0KEZYX0JPT0wgYlByZXYgPSBGQUxTRSk7DQorICB2aXJ0dWFsIEZYX1dDSEFSIEdldENoYXIoKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRBdChpbnQzMl90IG5JbmRleCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0QXQoKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0VPRihGWF9CT09MIGJUYWlsID0gVFJVRSkgY29uc3Q7DQorICB2aXJ0dWFsIElGWF9DaGFySXRlciogQ2xvbmUoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgfkNGWF9DaGFySXRlcigpOw0KKw0KKyBwcml2YXRlOg0KKyAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG1fd3NUZXh0Ow0KKyAgaW50MzJfdCBtX25JbmRleDsNCit9Ow0KK2NsYXNzIENGWF9Xb3JkQnJlYWsgOiBwdWJsaWMgSUZYX1dvcmRCcmVhayB7DQorIHB1YmxpYzoNCisgIENGWF9Xb3JkQnJlYWsoKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCk7DQorICB2aXJ0dWFsIHZvaWQgQXR0YWNoKElGWF9DaGFySXRlciogcEl0ZXIpOw0KKyAgdmlydHVhbCB2b2lkIEF0dGFjaChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBOZXh0KEZYX0JPT0wgYlByZXYpOw0KKyAgdmlydHVhbCB2b2lkIFNldEF0KGludDMyX3QgbkluZGV4KTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRXb3JkUG9zKCkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0V29yZExlbmd0aCgpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEdldFdvcmQoQ0ZYX1dpZGVTdHJpbmcmIHdzV29yZCkgY29uc3Q7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNFT0YoRlhfQk9PTCBiVGFpbCkgY29uc3Q7DQorDQorIHByb3RlY3RlZDoNCisgIH5DRlhfV29yZEJyZWFrKCk7DQorICBGWF9CT09MIEZpbmROZXh0QnJlYWtQb3MoSUZYX0NoYXJJdGVyKiBwSXRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcmV2LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZyb21OZXh0ID0gVFJVRSk7DQorDQorIHByaXZhdGU6DQorICBJRlhfQ2hhckl0ZXIqIG1fcFByZUl0ZXI7DQorICBJRlhfQ2hhckl0ZXIqIG1fcEN1ckl0ZXI7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZlZS9zcmMvZnhfd29yZGJyZWFrL2Z4X3dvcmRicmVha2RhdGEuY3BwIGIveGZhL3NyYy9mZWUvc3JjL2Z4X3dvcmRicmVhay9meF93b3JkYnJlYWtkYXRhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTI3YTc5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZWUvc3JjL2Z4X3dvcmRicmVhay9meF93b3JkYnJlYWtkYXRhLmNwcApAQCAtMCwwICsxLDI3NDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAiZnhfd29yZGJyZWFrX2ltcGwuaCINCitleHRlcm4gY29uc3QgRlhfV09SRCBnc19GWF9Xb3JkQnJlYWtfVGFibGVbMTZdID0gew0KKyAgICAweEZGRkYsIDB4RkZGOSwgMHhGRkZCLCAweEZGRkIsIDB4RkZGQiwgMHhGRkZCLCAweEVGQkIsIDB4RTc3QiwNCisgICAgMHhGRkZCLCAweEZGRkIsIDB4RkZGQiwgMHhFNzdCLCAweEU3M0IsIDB4RkZGQiwgMHhGRkZCLCAweEZGRkIsDQorfTsNCitleHRlcm4gY29uc3QgdWludDhfdCBnc19GWF9Xb3JkQnJlYWtfQ29kZVBvaW50UHJvcGVydGllc1soMHhGRkZGIC0gMSkgLyAyICsgMV0gPQ0KKyAgICB7DQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIzLCAweDMxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQSwgMHgwMCwgMHgwMCwgMHg5MCwgMHhBMCwNCisgICAgICAgIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4ODksIDB4MDAsIDB4MDAsIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDBDLA0KKyAgICAgICAgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHg3MCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHgwOCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDcwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHg3MCwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsDQorICAgICAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwNCisgICAgICAgIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsDQorICAgICAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDc3LCAweDc3LCAweDcwLCAweDc3LA0KKyAgICAgICAgMHgwMCwgMHg3NywgMHg3NywgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3OCwgMHg3NywgMHg3MCwgMHg3MCwgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDA0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsDQorICAgICAgICAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsDQorICAgICAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHgwNCwgMHgwNCwgMHg0MCwgMHg0NCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHgwMCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwNCisgICAgICAgIDB4NDQsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwNCisgICAgICAgIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4MEIsIDB4OTAsIDB4NzcsIDB4NDcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDQ0LA0KKyAgICAgICAgMHg0NCwgMHg0NCwgMHg0NSwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NywgMHg3NCwgMHg0MCwgMHg0NCwgMHg0NCwgMHg3NywNCisgICAgICAgIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4NzcsIDB4NzAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDA1LCAweDc0LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwNCisgICAgICAgIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDAsIDB4MDcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAgICAgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwNCisgICAgICAgIDB4QkIsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDc3LCAweDAwLA0KKyAgICAgICAgMHg5MCwgMHg3MCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NDQsIDB4NDQsIDB4NzQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NzQsIDB4NDQsDQorICAgICAgICAweDc0LCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDQ0LCAweDQ0LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4NDcsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsDQorICAgICAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDc0LCAweDQ0LCAweDQ0LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg0NCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwNywgMHg3MCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDQsIDB4NDQsIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDcsDQorICAgICAgICAweDcwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3MCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHg0NywgMHg0NCwNCisgICAgICAgIDB4NDQsIDB4NDQsIDB4NDAsIDB4MDQsIDB4NDAsIDB4MDQsIDB4NDQsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsDQorICAgICAgICAweDAwLCAweDAwLCAweDc3LCAweDA3LCAweDc3LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLA0KKyAgICAgICAgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0NCwgMHgwNywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzAsIDB4MDAsIDB4MDcsIDB4NzAsIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDA3LCAweDcwLA0KKyAgICAgICAgMHg3NywgMHgwMCwgMHg0MCwgMHg0NCwgMHg0NCwgMHg0MCwgMHgwMCwgMHgwNCwgMHg0MCwgMHgwNCwgMHg0NCwgMHgwMCwNCisgICAgICAgIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NzcsIDB4NzAsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkIsDQorICAgICAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDQ0LCAweDc3LCAweDc0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwNCwgMHg0NCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwNywgMHg3NywgMHgwNywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDcwLCAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDAwLCAweDQ3LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDA0LA0KKyAgICAgICAgMHg0NCwgMHgwNCwgMHg0NCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4NzcsIDB4NDQsIDB4MDAsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ0LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDA3LA0KKyAgICAgICAgMHg3MCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsIDB4MDcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4NDcsIDB4NDQsDQorICAgICAgICAweDQ0LCAweDQ0LCAweDQwLCAweDA0LCAweDQwLCAweDA0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHg3NywgMHgwNywgMHg3NywgMHg0NCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwNCisgICAgICAgIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDcsIDB4MDcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDcwLCAweDAwLCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDAwLCAweDA3LCAweDcwLCAweDcwLCAweDc3LA0KKyAgICAgICAgMHgwMCwgMHgwNywgMHg3MCwgMHgwMCwgMHg3NywgMHg3MCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4NDAsIDB4MDAsIDB4NDQsIDB4NDAsIDB4NDQsIDB4NDQsIDB4MDAsDQorICAgICAgICAweDcwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJCLA0KKyAgICAgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDQsIDB4NDQsIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsIDB4NzAsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHgwNywgMHg3NywgMHg3NywgMHgwMCwgMHgwNywgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHg0NCwNCisgICAgICAgIDB4NDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4NDAsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDc3LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywNCisgICAgICAgIDB4NzAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDAwLCAweDQ3LCAweDQ0LA0KKyAgICAgICAgMHg0NCwgMHg0NCwgMHg0MCwgMHg0NCwgMHg0MCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0MCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4NzcsIDB4NDQsIDB4MDAsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDA3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDAwLCAweDA3LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDQ0LCAweDQwLCAweDQ0LCAweDQ0LCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg0NCwgMHgwMCwgMHhCQiwNCisgICAgICAgIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDAwLCAweDQ0LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLA0KKyAgICAgICAgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDcsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsDQorICAgICAgICAweDAwLCAweDQwLCAweDAwLCAweDA0LCAweDQ0LCAweDQ0LCAweDQwLCAweDQwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDAsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsDQorICAgICAgICAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDQ0LCAweDQ0LA0KKyAgICAgICAgMHg0NCwgMHgwNCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHg0NCwgMHgwMCwNCisgICAgICAgIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDQ0LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDAsIDB4MDQsIDB4NDQsIDB4NDQsIDB4NDQsDQorICAgICAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDQ0LCAweDc3LCAweDc3LCAweDAwLCAweDAwLA0KKyAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHgwNCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwNCisgICAgICAgIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwNCisgICAgICAgIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDAsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDQ0LCAweDQwLCAweDQ0LCAweDQwLCAweDA0LA0KKyAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwNCwgMHg0NCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4MDQsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsDQorICAgICAgICAweEJCLCAweDQ0LCAweDQ0LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3MCwgMHg3MCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDcwLCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDcwLCAweDc3LCAweDc3LCAweDAwLA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsIDB4NzcsIDB4MDAsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwNCisgICAgICAgIDB4NzAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsDQorICAgICAgICAweDc3LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg0NCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NDQsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LA0KKyAgICAgICAgMHg3MCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDU1LCAweDQ0LA0KKyAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwNCisgICAgICAgIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsDQorICAgICAgICAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0NCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwNCisgICAgICAgIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzQsIDB4NzAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLA0KKyAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwNCisgICAgICAgIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QjAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzQsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0NCwNCisgICAgICAgIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDAsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsDQorICAgICAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDA0LCAweEJCLCAweEJCLCAweEJCLCAweEJCLA0KKyAgICAgICAgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDQ0LCAweDQ0LCAweDQ3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAgICAgMHg0NCwgMHg0MCwgMHgwMCwgMHg3NywgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwNywgMHg3NywNCisgICAgICAgIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0MCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwNCisgICAgICAgIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDcsIDB4NzcsIDB4NzQsIDB4NzcsIDB4NzcsIDB4NDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsDQorICAgICAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0NCwNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHgwMCwNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDAwLA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzAsIDB4MDAsIDB4NzcsIDB4NzAsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3MCwgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NTUsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEEwLCAweDA4LA0KKyAgICAgICAgMHgzMywgMHg1NSwgMHg1NSwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywNCisgICAgICAgIDB4QzAsIDB4MDAsIDB4OTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDUwLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDU1LA0KKyAgICAgICAgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsDQorICAgICAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwNywgMHgwMCwNCisgICAgICAgIDB4MDcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4NzAsIDB4NzAsIDB4NzcsIDB4NzcsIDB4MDcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDA3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDcsIDB4NzcsIDB4NzQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAgICAgMHgwNiwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwNywgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4NDYsIDB4NjAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsDQorICAgICAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LA0KKyAgICAgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwNCisgICAgICAgIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsDQorICAgICAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDYwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDA3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwNCisgICAgICAgIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsDQorICAgICAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDYwLA0KKyAgICAgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwNCisgICAgICAgIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsDQorICAgICAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LA0KKyAgICAgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzQsIDB4NDQsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDQsIDB4MDcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzAsIDB4MDcsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg0NywgMHg3NywgMHg0NywgMHg3NywgMHg3NCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzQsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsDQorICAgICAgICAweDQ0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLA0KKyAgICAgICAgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwNCisgICAgICAgIDB4NDQsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsDQorICAgICAgICAweEJCLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsDQorICAgICAgICAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwNCisgICAgICAgIDB4NDQsIDB4NDQsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHg3NywgMHg3NCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg0NCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwNCisgICAgICAgIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4NDQsIDB4NDAsIDB4MDQsDQorICAgICAgICAweDQwLCAweDAwLCAweDAwLCAweDQ0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDQ0LCAweDAwLA0KKyAgICAgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDcwLCAweDcwLA0KKyAgICAgICAgMHg3NywgMHgwNywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LA0KKyAgICAgICAgMHg5MCwgMHgwOCwgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBDLCAweENDLCAweDkwLCAweEEwLCAweDk4LCAweDAwLA0KKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwNSwNCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEEsIDB4MDAsIDB4MDAsIDB4OTAsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDg5LCAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LA0KKyAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwQywgMHgwNywgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LA0KKyAgICAgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwNCisgICAgICAgIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NDQsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsDQorICAgICAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLA0KKyAgICAgICAgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywNCisgICAgICAgIDB4MDAsIDB4NzcsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA1LCAweDU1LCAweDAwLCAweDAwLA0KK307DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZmdhcy5oIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZmdhcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMTU1YTAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9mZ2FzLmgKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisvLyBUT0RPKHRoZXN0aWcpOiBSZW1vdmUgdGhpcyBmaWxlIGFuZCBkbyBJV1lVLg0KKw0KKyNpZm5kZWYgX0ZHQVNfDQorI2RlZmluZSBfRkdBU18NCisjaW5jbHVkZSAiZnhfc3lzLmgiDQorI2luY2x1ZGUgImZ4X21lbS5oIg0KKyNpbmNsdWRlICJmeF9sZ2cuaCINCisjaW5jbHVkZSAiZnhfdXRsLmgiDQorI2luY2x1ZGUgImZ4X2FsZy5oIg0KKyNpbmNsdWRlICJmeF9jcGcuaCINCisjaW5jbHVkZSAiZnhfc3RtLmgiDQorI2luY2x1ZGUgImZ4X2RhdGV0aW1lLmgiDQorI2luY2x1ZGUgImZ4X2xvY2FsZS5oIg0KKyNpbmNsdWRlICJmeF9zYXguaCINCisjaW5jbHVkZSAiZnhfZm50LmgiDQorI2luY2x1ZGUgImZ4X3VjZC5oIg0KKyNpbmNsdWRlICJmeF9sYmsuaCINCisjaW5jbHVkZSAiZnhfdGJrLmgiDQorI2luY2x1ZGUgImZ4X3Jiay5oIg0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2FsZy5oIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfYWxnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJlN2UzMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2FsZy5oCkBAIC0wLDAgKzEsNDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhfQUxHT1JJVEhNDQorI2RlZmluZSBfRlhfQUxHT1JJVEhNDQorI2RlZmluZSBGWF9Jc09kZChhKSAoKGEpJjEpDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmDQoraW50MzJfdCBGWF9CYXNlNjRFbmNvZGVBKGNvbnN0IHVpbnQ4X3QqIHBTcmMsIGludDMyX3QgaVNyY0xlbiwgRlhfQ0hBUiogcERzdCk7DQoraW50MzJfdCBGWF9CYXNlNjREZWNvZGVBKGNvbnN0IEZYX0NIQVIqIHBTcmMsIGludDMyX3QgaVNyY0xlbiwgdWludDhfdCogcERzdCk7DQoraW50MzJfdCBGWF9CYXNlNjREZWNvZGVXKGNvbnN0IEZYX1dDSEFSKiBwU3JjLCBpbnQzMl90IGlTcmNMZW4sIHVpbnQ4X3QqIHBEc3QpOw0KK3VpbnQ4X3QgRlhfSGV4MkRlYyh1aW50OF90IGhleEhpZ2gsIHVpbnQ4X3QgaGV4TG93KTsNCitpbnQzMl90IEZYX1NlcGFyYXRlU3RyaW5nVyhjb25zdCBGWF9XQ0hBUiogcFN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdHJMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgZGVsaW1pdGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQXJyYXkmIHBpZWNlcyk7DQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfTsNCisjZW5kaWYNCit0ZW1wbGF0ZSA8Y2xhc3MgYmFzZVR5cGU+DQorY2xhc3MgQ0ZYX0RTUEFUZW1wbGF0ZSB7DQorIHB1YmxpYzoNCisgIGludDMyX3QgTG9va3VwKGNvbnN0IGJhc2VUeXBlJiBmaW5kLCBjb25zdCBiYXNlVHlwZSogcEFycmF5LCBpbnQzMl90IGlDb3VudCkgew0KKyAgICBGWFNZU19hc3NlcnQocEFycmF5ICE9IE5VTEwpOw0KKyAgICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKyAgICBpbnQzMl90IGlTdGFydCA9IDAsIGlFbmQgPSBpQ291bnQgLSAxLCBpTWlkOw0KKyAgICBkbyB7DQorICAgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgICAgY29uc3QgYmFzZVR5cGUmIHYgPSBwQXJyYXlbaU1pZF07DQorICAgICAgaWYgKGZpbmQgPT0gdikgew0KKyAgICAgICAgcmV0dXJuIGlNaWQ7DQorICAgICAgfSBlbHNlIGlmIChmaW5kIDwgdikgew0KKyAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgICB9DQorICAgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfY3BnLmggYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9jcGcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTU1ZTQ2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfY3BnLmgKQEAgLTAsMCArMSwyNDggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhfQ09ERVBBR0UNCisjZGVmaW5lIF9GWF9DT0RFUEFHRQ0KK2NsYXNzIElGWF9Db2RlUGFnZTsNCisjZGVmaW5lIEZYX0NPREVQQUdFX0RlZkFOU0kgMA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfRGVmT0VNIDENCisjZGVmaW5lIEZYX0NPREVQQUdFX0RlZk1BQyAyDQorI2RlZmluZSBGWF9DT0RFUEFHRV9UaHJlYWQgMw0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfU3ltYm9sIDQyDQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19VUyA0MzcNCisjZGVmaW5lIEZYX0NPREVQQUdFX0FyYWJpY19BU01PNzA4IDcwOA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfQXJhYmljX0FTTU80NDlQbHVzIDcwOQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfQXJhYmljX1RyYW5zcGFyZW50IDcxMA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfQXJhYmljX05hZml0aGFFbmhhbmNlZCA3MTENCisjZGVmaW5lIEZYX0NPREVQQUdFX0FyYWJpY19UcmFuc3BhcmVudEFTTU8gNzIwDQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19HcmVlazEgNzM3DQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19CYWx0aWMgNzc1DQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU1dpbjMxX1dlc3Rlcm5FdXJvcGVhbiA4MTkNCisjZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX1dlc3Rlcm5FdXJvcGVhbiA4NTANCisjZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX0Vhc3Rlcm5FdXJvcGVhbiA4NTINCisjZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX0xhdGluMyA4NTMNCisjZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX0N5cmlsbGljIDg1NQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfVHVya2lzaCA4NTcNCisjZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX0xhdGluMUV1cm8gODU4DQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19Qb3J0dWd1ZXNlIDg2MA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfSWNlbGFuZGljIDg2MQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfSGVicmV3IDg2Mg0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfRnJlbmNoQ2FuYWRpYW4gODYzDQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19BcmFiaWMgODY0DQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19Ob3J3ZWdpYW4gODY1DQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19SdXNzaWFuIDg2Ng0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfR3JlZWsyIDg2OQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfVGhhaSA4NzQNCisjZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX0thbWVuaWNreUNTIDg5NQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfU2hpZnRKSVMgOTMyDQorI2RlZmluZSBGWF9DT0RFUEFHRV9DaGluZXNlU2ltcGxpZmllZCA5MzYNCisjZGVmaW5lIEZYX0NPREVQQUdFX0tvcmVhbiA5NDkNCisjZGVmaW5lIEZYX0NPREVQQUdFX0NoaW5lc2VUcmFkaXRpb25hbCA5NTANCisjZGVmaW5lIEZYX0NPREVQQUdFX1VURjE2TEUgMTIwMA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfVVRGMTZCRSAxMjAxDQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW4gMTI1MA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNXaW5fQ3lyaWxsaWMgMTI1MQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFuIDEyNTINCisjZGVmaW5lIEZYX0NPREVQQUdFX01TV2luX0dyZWVrIDEyNTMNCisjZGVmaW5lIEZYX0NPREVQQUdFX01TV2luX1R1cmtpc2ggMTI1NA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNXaW5fSGVicmV3IDEyNTUNCisjZGVmaW5lIEZYX0NPREVQQUdFX01TV2luX0FyYWJpYyAxMjU2DQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU1dpbl9CYWx0aWMgMTI1Nw0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNXaW5fVmlldG5hbWVzZSAxMjU4DQorI2RlZmluZSBGWF9DT0RFUEFHRV9Kb2hhYiAxMzYxDQorI2RlZmluZSBGWF9DT0RFUEFHRV9NQUNfUm9tYW4gMTAwMDANCisjZGVmaW5lIEZYX0NPREVQQUdFX01BQ19TaGlmdEpJUyAxMDAwMQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX0NoaW5lc2VUcmFkaXRpb25hbCAxMDAwMg0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX0tvcmVhbiAxMDAwMw0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX0FyYWJpYyAxMDAwNA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX0hlYnJldyAxMDAwNQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX0dyZWVrIDEwMDA2DQorI2RlZmluZSBGWF9DT0RFUEFHRV9NQUNfQ3lyaWxsaWMgMTAwMDcNCisjZGVmaW5lIEZYX0NPREVQQUdFX01BQ19DaGluZXNlU2ltcGxpZmllZCAxMDAwOA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX1RoYWkgMTAwMjENCisjZGVmaW5lIEZYX0NPREVQQUdFX01BQ19FYXN0ZXJuRXVyb3BlYW4gMTAwMjkNCisjZGVmaW5lIEZYX0NPREVQQUdFX01BQ19UdXJraXNoIDEwMDgxDQorI2RlZmluZSBGWF9DT0RFUEFHRV9VVEYzMkxFIDEyMDAwDQorI2RlZmluZSBGWF9DT0RFUEFHRV9VVEYzMkJFIDEyMDAxDQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzEgMjg1OTENCisjZGVmaW5lIEZYX0NPREVQQUdFX0lTTzg4NTlfMiAyODU5Mg0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV8zIDI4NTkzDQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzQgMjg1OTQNCisjZGVmaW5lIEZYX0NPREVQQUdFX0lTTzg4NTlfNSAyODU5NQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV82IDI4NTk2DQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzcgMjg1OTcNCisjZGVmaW5lIEZYX0NPREVQQUdFX0lTTzg4NTlfOCAyODU5OA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV85IDI4NTk5DQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzEwIDI4NjAwDQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzExIDI4NjAxDQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzEyIDI4NjAyDQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzEzIDI4NjAzDQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzE0IDI4NjA0DQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzE1IDI4NjA1DQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzE2IDI4NjA2DQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU0NJSV9EZXZhbmFnYXJpIDU3MDAyDQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU0NJSV9CZW5nYWxpIDU3MDAzDQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU0NJSV9UYW1pbCA1NzAwNA0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNDSUlfVGVsdWd1IDU3MDA1DQorI2RlZmluZSBGWF9DT0RFUEFHRV9JU0NJSV9Bc3NhbWVzZSA1NzAwNg0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNDSUlfT3JpeWEgNTcwMDcNCisjZGVmaW5lIEZYX0NPREVQQUdFX0lTQ0lJX0thbm5hZGEgNTcwMDgNCisjZGVmaW5lIEZYX0NPREVQQUdFX0lTQ0lJX01hbGF5YWxhbSA1NzAwOQ0KKyNkZWZpbmUgRlhfQ09ERVBBR0VfSVNDSUlfR3VqYXJhdGkgNTcwMTANCisjZGVmaW5lIEZYX0NPREVQQUdFX0lTQ0lJX1B1bmphYmkgNTcwMTENCisjZGVmaW5lIEZYX0NPREVQQUdFX1VURjcgNjUwMDANCisjZGVmaW5lIEZYX0NPREVQQUdFX1VURjggNjUwMDENCisjZGVmaW5lIEZYX0NIQVJTRVRfQU5TSSAwDQorI2RlZmluZSBGWF9DSEFSU0VUX0RlZmF1bHQgMQ0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9TeW1ib2wgMg0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9NQUNfUm9tYW4gNzcNCisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX1NoaWZ0SklTIDc4DQorI2RlZmluZSBGWF9DSEFSU0VUX01BQ19Lb3JlYW4gNzkNCisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX0NoaW5lc2VTaW1wbGlmaWVkIDgwDQorI2RlZmluZSBGWF9DSEFSU0VUX01BQ19DaGluZXNlVHJpZGl0aW9uYWwgODENCisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX0pvaGFiIDgyDQorI2RlZmluZSBGWF9DSEFSU0VUX01BQ19IZWJyZXcgODMNCisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX0FyYWJpYyA4NA0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9NQUNfR3JlZWsgODUNCisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX1R1cmtpc2ggODYNCisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX1RoYWkgODcNCisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX0Vhc3Rlcm5FdXJvcGVhbiA4OA0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9NQUNfQ3lyaWxsaWMgODkNCisjZGVmaW5lIEZYX0NIQVJTRVRfU2hpZnRKSVMgMTI4DQorI2RlZmluZSBGWF9DSEFSU0VUX0tvcmVhbiAxMjkNCisjZGVmaW5lIEZYX0NIQVJTRVRfSm9oYWIgMTMwDQorI2RlZmluZSBGWF9DSEFSU0VUX0NoaW5lc2VTaW1wbGlmaWVkIDEzNA0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9DaGluZXNlVHJpZGl0aW9uYWwgMTM2DQorI2RlZmluZSBGWF9DSEFSU0VUX01TV2luX0dyZWVrIDE2MQ0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9NU1dpbl9UdXJraXNoIDE2Mg0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9NU1dpbl9WaWV0bmFtZXNlIDE2Mw0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9NU1dpbl9IZWJyZXcgMTc3DQorI2RlZmluZSBGWF9DSEFSU0VUX01TV2luX0FyYWJpYyAxNzgNCisjZGVmaW5lIEZYX0NIQVJTRVRfQXJhYmljVHJhZGl0aW9uYWwgMTc5DQorI2RlZmluZSBGWF9DSEFSU0VUX0FyYWJpY1VzZXIgMTgwDQorI2RlZmluZSBGWF9DSEFSU0VUX0hlYnJld1VzZXIgMTgxDQorI2RlZmluZSBGWF9DSEFSU0VUX01TV2luX0JhbHRpYyAxODYNCisjZGVmaW5lIEZYX0NIQVJTRVRfTVNXaW5fQ3lyaWxsaWMgMjA0DQorI2RlZmluZSBGWF9DSEFSU0VUX1RoYWkgMjIyDQorI2RlZmluZSBGWF9DSEFSU0VUX01TV2luX0Vhc3RlckV1cm9wZWFuIDIzOA0KKyNkZWZpbmUgRlhfQ0hBUlNFVF9VUyAyNTQNCisjZGVmaW5lIEZYX0NIQVJTRVRfT0VNIDI1NQ0KK0ZYX1dPUkQgRlhfR2V0Q29kZVBhZ2VGcm9tQ2hhcnNldCh1aW50OF90IGNoYXJzZXQpOw0KK0ZYX1dPUkQgRlhfR2V0Q2hhcnNldEZyb21Db2RlUGFnZShGWF9XT1JEIGNvZGVwYWdlKTsNCitGWF9XT1JEIEZYX0dldENvZGVQYWdlRnJvbVN0cmluZ0EoY29uc3QgRlhfQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKTsNCitGWF9XT1JEIEZYX0dldENvZGVQYWdlRm9ybVN0cmluZ1coY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCk7DQorRlhfV09SRCBGWF9HZXREZWZDb2RlUGFnZUJ5TGFuZ3VhZ2UoRlhfV09SRCB3TGFuZ3VhZ2UpOw0KK3ZvaWQgRlhfU3dhcEJ5dGVPcmRlcihGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKTsNCit2b2lkIEZYX1N3YXBCeXRlT3JkZXJDb3B5KGNvbnN0IEZYX1dDSEFSKiBwU3JjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIqIHBEc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgpOw0KK3ZvaWQgRlhfVVRGMTZUb1dDaGFyKHZvaWQqIHBCdWZmZXIsIGludDMyX3QgaUxlbmd0aCk7DQordm9pZCBGWF9VVEYxNlRvV0NoYXJDb3B5KGNvbnN0IEZYX1dPUkQqIHBVVEYxNiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIqIHBXQ2hhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoKTsNCit2b2lkIEZYX1dDaGFyVG9VVEYxNih2b2lkKiBwQnVmZmVyLCBpbnQzMl90IGlMZW5ndGgpOw0KK3ZvaWQgRlhfV0NoYXJUb1VURjE2Q29weShjb25zdCBGWF9XQ0hBUiogcFdDaGFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEKiBwVVRGMTYsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCk7DQoraW50MzJfdCBGWF9EZWNvZGVTdHJpbmcoRlhfV09SRCB3Q29kZVBhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogcFNyYywNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBwU3JjTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSKiBwRHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBEc3RMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRXJyQnJlYWsgPSBGQUxTRSk7DQoraW50MzJfdCBGWF9VVEY4RGVjb2RlKGNvbnN0IEZYX0NIQVIqIHBTcmMsDQorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBTcmNMZW4sDQorICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSKiBwRHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBwRHN0TGVuKTsNCitlbnVtIEZYX0NPREVTWVNURU0gew0KKyAgRlhfTUJDUyA9IDAsDQorICBGWF9TQkNTLA0KKyAgRlhfREJDUywNCit9Ow0KK3R5cGVkZWYgc3RydWN0IF9GWF9DT0RFUEFHRV9IRUFERVIgew0KKyAgdWludDE2X3QgdUNQSUQ7DQorICB1aW50OF90IHVNaW5DaGFyQnl0ZXM7DQorICB1aW50OF90IHVNYXhDaGFyQnl0ZXM7DQorICBGWF9DT0RFU1lTVEVNIGVDUFR5cGU7DQorICBGWF9CT09MIGJIYXNMZWFkQnl0ZTsNCisgIEZYX1dDSEFSIHdNaW5DaGFyOw0KKyAgRlhfV0NIQVIgd01heENoYXI7DQorICBGWF9XQ0hBUiB3RGVmQ2hhcjsNCisgIEZYX1dDSEFSIHdNaW5Vbmljb2RlOw0KKyAgRlhfV0NIQVIgd01heFVuaWNvZGU7DQorICBGWF9XQ0hBUiB3RGVmVW5pY29kZTsNCit9IEZYX0NPREVQQUdFX0hFQURFUjsNCisjZGVmaW5lIEZYX0NQTUFQVFlQRV9Db25zZWN1dGlvbiAxDQorI2RlZmluZSBGWF9DUE1BUFRZUEVfU3RyaWN0IDINCisjZGVmaW5lIEZYX0NQTUFQVFlQRV9Ob01hcHBpbmcgMw0KKyNkZWZpbmUgRlhfQ1BNQVBUWVBFX0RlbHRhIDQNCit0eXBlZGVmIHN0cnVjdCBfRlhfQ1BDVV9NQVBUQUJMRTEgew0KKyAgdWludDE2X3QgdU1hcFR5cGU7DQorICB1aW50MTZfdCB1VW5pb2NkZTsNCit9IEZYX0NQQ1VfTUFQVEFCTEUxOw0KK3R5cGVkZWYgc3RydWN0IF9GWF9DUENVX01BUFRBQkxFMiB7DQorICB1aW50OF90IHVUcmFpbEJ5dGU7DQorICB1aW50OF90IHVNYXBUeXBlOw0KKyAgdWludDE2X3QgdU9mZnNldDsNCit9IEZYX0NQQ1VfTUFQVEFCTEUyOw0KK3R5cGVkZWYgc3RydWN0IF9GWF9DUENVX01BUElORk8gew0KKyAgRlhfQ1BDVV9NQVBUQUJMRTEqIHBNYXBUYWJsZTE7DQorICBGWF9DUENVX01BUFRBQkxFMiogcE1hcFRhYmxlMjsNCisgIGNvbnN0IHVpbnQ4X3QqIHBNYXBEYXRhOw0KK30gRlhfQ1BDVV9NQVBJTkZPOw0KK3R5cGVkZWYgc3RydWN0IF9GWF9DUFVDX01BUFRBQkxFIHsNCisgIHVpbnQxNl90IHVTdGFydFVuaWNvZGU7DQorICB1aW50MTZfdCB1RW5kVW5pY29kZTsNCisgIHVpbnQxNl90IHVNYXBUeXBlOw0KKyAgdWludDE2X3QgdU9mZnNldDsNCit9IEZYX0NQVUNfTUFQVEFCTEU7DQordHlwZWRlZiBzdHJ1Y3QgX0ZYX0NQVUNfTUFQSU5GTyB7DQorICB1aW50MzJfdCB1TWFwQ291bnQ7DQorICBGWF9DUFVDX01BUFRBQkxFKiBwTWFwVGFibGU7DQorICBjb25zdCB1aW50OF90KiBwTWFwRGF0YTsNCit9IEZYX0NQVUNfTUFQSU5GTzsNCit0eXBlZGVmIHN0cnVjdCBfRlhfQ09ERVBBR0Ugew0KKyAgRlhfQ09ERVBBR0VfSEVBREVSIGNvbnN0KiBwQ1BIZWFkZXI7DQorICBGWF9DUENVX01BUElORk8gY29uc3QqIHBDUENVTWFwSW5mbzsNCisgIEZYX0NQVUNfTUFQSU5GTyBjb25zdCogcENQVUNNYXBJbmZvOw0KK30gRlhfQ09ERVBBR0UsICpGWF9MUENPREVQQUdFOw0KK3R5cGVkZWYgRlhfQ09ERVBBR0UgY29uc3QqIEZYX0xQQ0NPREVQQUdFOw0KK3R5cGVkZWYgc3RydWN0IF9GWF9TVFIyQ1BIQVNIIHsNCisgIHVpbnQzMl90IHVIYXNoOw0KKyAgdWludDMyX3QgdUNvZGVQYWdlOw0KK30gRlhfU1RSMkNQSEFTSDsNCit0eXBlZGVmIHN0cnVjdCBfRlhfQ0hBUlNFVF9NQVAgew0KKyAgdWludDE2X3QgY2hhcnNldDsNCisgIHVpbnQxNl90IGNvZGVwYWdlOw0KK30gRlhfQ0hBUlNFVF9NQVA7DQordHlwZWRlZiBzdHJ1Y3QgX0ZYX0xBTkcyQ1BNQVAgew0KKyAgRlhfV09SRCB3TGFuZ3VhZ2U7DQorICBGWF9XT1JEIHdDb2RlcGFnZTsNCit9IEZYX0xBTkcyQ1BNQVA7DQorDQorY2xhc3MgSUZYX0NvZGVQYWdlIHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGWF9Db2RlUGFnZSogQ3JlYXRlKEZYX1dPUkQgd0NvZGVQYWdlKTsNCisgIHZpcnR1YWwgfklGWF9Db2RlUGFnZSgpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisgIHZpcnR1YWwgRlhfV09SRCBHZXRDb2RlUGFnZU51bWJlcigpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfQ09ERVNZU1RFTSBHZXRDb2RlU3lzdGVtVHlwZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBIYXNMZWFkQnl0ZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0xlYWRCeXRlKHVpbnQ4X3QgYnl0ZSkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldE1pbkJ5dGVzUGVyQ2hhcigpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRNYXhCeXRlc1BlckNoYXIoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX1dDSEFSIEdldE1pbkNoYXJjb2RlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9XQ0hBUiBHZXRNYXhDaGFyY29kZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfV0NIQVIgR2V0RGVmQ2hhcmNvZGUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX1dDSEFSIEdldE1pblVuaWNvZGUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX1dDSEFSIEdldE1heFVuaWNvZGUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX1dDSEFSIEdldERlZlVuaWNvZGUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNWYWxpZENoYXJjb2RlKEZYX1dPUkQgd0NoYXJjb2RlKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX1dDSEFSIEdldFVuaWNvZGUoRlhfV09SRCB3Q2hhcmNvZGUpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc1ZhbGlkVW5pY29kZShGWF9XQ0hBUiB3VW5pY29kZSkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9XT1JEIEdldENoYXJjb2RlKEZYX1dDSEFSIHdVbmljb2RlKSBjb25zdCA9IDA7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9kYXRldGltZS5oIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfZGF0ZXRpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzIzYjQzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfZGF0ZXRpbWUuaApAQCAtMCwwICsxLDM5MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWF9EQVRFVElNRV9IXw0KKyNkZWZpbmUgX0ZYX0RBVEVUSU1FX0hfDQorY2xhc3MgQ0ZYX1VuaXRpbWU7DQorY2xhc3MgQ0ZYX0RhdGVUaW1lOw0KK3R5cGVkZWYgaW50NjRfdCBGWF9VTklUSU1FOw0KK2VudW0gRlhfV0VFS0RBWSB7DQorICBGWF9TdW5kYXkgPSAwLA0KKyAgRlhfTW9uZGF5LA0KKyAgRlhfVHVlc2RheSwNCisgIEZYX1dlZG5lc2RheSwNCisgIEZYX1RodXJzZGF5LA0KKyAgRlhfRnJpZGF5LA0KKyAgRlhfU2F0dXJkYXksDQorfTsNCitGWF9CT09MIEZYX0lzTGVhcFllYXIoaW50MzJfdCBpWWVhcik7DQoraW50MzJfdCBGWF9EYXlzSW5ZZWFyKGludDMyX3QgaVllYXIpOw0KK3VpbnQ4X3QgRlhfRGF5c0luTW9udGgoaW50MzJfdCBpWWVhciwgdWludDhfdCBpTW9udGgpOw0KK2NsYXNzIENGWF9Vbml0aW1lIHsNCisgcHVibGljOg0KKyAgQ0ZYX1VuaXRpbWUoKSB7IG1faVVuaXRpbWUgPSAwOyB9DQorICBDRlhfVW5pdGltZShGWF9VTklUSU1FIGlVbml0aW1lKSB7IG1faVVuaXRpbWUgPSBpVW5pdGltZTsgfQ0KKyAgQ0ZYX1VuaXRpbWUoY29uc3QgQ0ZYX1VuaXRpbWUmIHVuaXRpbWUpIHsgbV9pVW5pdGltZSA9IHVuaXRpbWUubV9pVW5pdGltZTsgfQ0KKyAgb3BlcmF0b3IgRlhfVU5JVElNRSooKSB7IHJldHVybiAmbV9pVW5pdGltZTsgfQ0KKyAgb3BlcmF0b3IgRlhfVU5JVElNRSBjb25zdCooKSBjb25zdCB7IHJldHVybiAmbV9pVW5pdGltZTsgfQ0KKyAgb3BlcmF0b3IgRlhfVU5JVElNRSYoKSB7IHJldHVybiBtX2lVbml0aW1lOyB9DQorICBvcGVyYXRvciBjb25zdCBGWF9VTklUSU1FJigpIGNvbnN0IHsgcmV0dXJuIG1faVVuaXRpbWU7IH0NCisgIENGWF9Vbml0aW1lJiBvcGVyYXRvcj0oY29uc3QgQ0ZYX1VuaXRpbWUmIHQpIHsNCisgICAgbV9pVW5pdGltZSA9IHQubV9pVW5pdGltZTsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKyAgQ0ZYX1VuaXRpbWUmIG9wZXJhdG9yPShGWF9VTklUSU1FIHQpIHsNCisgICAgbV9pVW5pdGltZSA9IHQ7DQorICAgIHJldHVybiAqdGhpczsNCisgIH0NCisgIENGWF9Vbml0aW1lJiBvcGVyYXRvcis9KGNvbnN0IENGWF9Vbml0aW1lJiB0KSB7DQorICAgIG1faVVuaXRpbWUgKz0gdC5tX2lVbml0aW1lOw0KKyAgICByZXR1cm4gKnRoaXM7DQorICB9DQorICBDRlhfVW5pdGltZSYgb3BlcmF0b3IrPShGWF9VTklUSU1FIHQpIHsNCisgICAgbV9pVW5pdGltZSArPSB0Ow0KKyAgICByZXR1cm4gKnRoaXM7DQorICB9DQorICBDRlhfVW5pdGltZSYgb3BlcmF0b3ItPShjb25zdCBDRlhfVW5pdGltZSYgdCkgew0KKyAgICBtX2lVbml0aW1lIC09IHQubV9pVW5pdGltZTsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKyAgQ0ZYX1VuaXRpbWUmIG9wZXJhdG9yLT0oRlhfVU5JVElNRSB0KSB7DQorICAgIG1faVVuaXRpbWUgLT0gdDsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKyAgdm9pZCBOb3coKTsNCisgIHZvaWQgU2V0R01UaW1lKCk7DQorICB2b2lkIFNldChpbnQzMl90IHllYXIsDQorICAgICAgICAgICB1aW50OF90IG1vbnRoLA0KKyAgICAgICAgICAgdWludDhfdCBkYXksDQorICAgICAgICAgICB1aW50OF90IGhvdXIgPSAwLA0KKyAgICAgICAgICAgdWludDhfdCBtaW51dGUgPSAwLA0KKyAgICAgICAgICAgdWludDhfdCBzZWNvbmQgPSAwLA0KKyAgICAgICAgICAgRlhfV09SRCBtaWxsaXNlY29uZCA9IDApOw0KKyAgdm9pZCBTZXQoRlhfVU5JVElNRSB0KTsNCisgIGludDMyX3QgR2V0WWVhcigpIGNvbnN0Ow0KKyAgdWludDhfdCBHZXRNb250aCgpIGNvbnN0Ow0KKyAgdWludDhfdCBHZXREYXkoKSBjb25zdDsNCisgIEZYX1dFRUtEQVkgR2V0RGF5T2ZXZWVrKCkgY29uc3Q7DQorICBGWF9XT1JEIEdldERheU9mWWVhcigpIGNvbnN0Ow0KKyAgaW50NjRfdCBHZXREYXlPZkFEKCkgY29uc3Q7DQorICB1aW50OF90IEdldEhvdXIoKSBjb25zdDsNCisgIHVpbnQ4X3QgR2V0TWludXRlKCkgY29uc3Q7DQorICB1aW50OF90IEdldFNlY29uZCgpIGNvbnN0Ow0KKyAgRlhfV09SRCBHZXRNaWxsaXNlY29uZCgpIGNvbnN0Ow0KKyAgRlhfQk9PTCBBZGRZZWFycyhpbnQzMl90IGlZZWFycyk7DQorICBGWF9CT09MIEFkZE1vbnRocyhpbnQzMl90IGlNb250aHMpOw0KKyAgRlhfQk9PTCBBZGREYXlzKGludDMyX3QgaURheXMpOw0KKyAgRlhfQk9PTCBBZGRIb3VycyhpbnQzMl90IGlIb3Vycyk7DQorICBGWF9CT09MIEFkZE1pbnV0ZXMoaW50MzJfdCBpTWludXRlcyk7DQorICBGWF9CT09MIEFkZFNlY29uZHMoaW50MzJfdCBpU2Vjb25kcyk7DQorICBGWF9CT09MIEFkZE1pbGxpc2Vjb25kcyhpbnQzMl90IGlNaWxsaXNlY29uZHMpOw0KKyAgZnJpZW5kIENGWF9Vbml0aW1lIG9wZXJhdG9yKyhjb25zdCBDRlhfVW5pdGltZSYgdDEsIGNvbnN0IENGWF9Vbml0aW1lJiB0Mikgew0KKyAgICByZXR1cm4gQ0ZYX1VuaXRpbWUodDEubV9pVW5pdGltZSArIHQyLm1faVVuaXRpbWUpOw0KKyAgfQ0KKyAgZnJpZW5kIENGWF9Vbml0aW1lIG9wZXJhdG9yKyhjb25zdCBDRlhfVW5pdGltZSYgdDEsIEZYX1VOSVRJTUUgdDIpIHsNCisgICAgcmV0dXJuIENGWF9Vbml0aW1lKHQxLm1faVVuaXRpbWUgKyB0Mik7DQorICB9DQorICBmcmllbmQgQ0ZYX1VuaXRpbWUgb3BlcmF0b3IrKEZYX1VOSVRJTUUgdDEsIGNvbnN0IENGWF9Vbml0aW1lJiB0Mikgew0KKyAgICByZXR1cm4gQ0ZYX1VuaXRpbWUodDEgKyB0Mi5tX2lVbml0aW1lKTsNCisgIH0NCisgIGZyaWVuZCBDRlhfVW5pdGltZSBvcGVyYXRvci0oY29uc3QgQ0ZYX1VuaXRpbWUmIHQxLCBjb25zdCBDRlhfVW5pdGltZSYgdDIpIHsNCisgICAgcmV0dXJuIENGWF9Vbml0aW1lKHQxLm1faVVuaXRpbWUgKyB0Mi5tX2lVbml0aW1lKTsNCisgIH0NCisgIGZyaWVuZCBDRlhfVW5pdGltZSBvcGVyYXRvci0oY29uc3QgQ0ZYX1VuaXRpbWUmIHQxLCBGWF9VTklUSU1FIHQyKSB7DQorICAgIHJldHVybiBDRlhfVW5pdGltZSh0MS5tX2lVbml0aW1lICsgdDIpOw0KKyAgfQ0KKyAgZnJpZW5kIENGWF9Vbml0aW1lIG9wZXJhdG9yLShGWF9VTklUSU1FIHQxLCBjb25zdCBDRlhfVW5pdGltZSYgdDIpIHsNCisgICAgcmV0dXJuIENGWF9Vbml0aW1lKHQxICsgdDIubV9pVW5pdGltZSk7DQorICB9DQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvcj09KGNvbnN0IENGWF9Vbml0aW1lJiB0MSwgY29uc3QgQ0ZYX1VuaXRpbWUmIHQyKSB7DQorICAgIHJldHVybiB0MS5tX2lVbml0aW1lID09IHQyLm1faVVuaXRpbWU7DQorICB9DQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvcj09KGNvbnN0IENGWF9Vbml0aW1lJiB0MSwgRlhfVU5JVElNRSB0Mikgew0KKyAgICByZXR1cm4gdDEubV9pVW5pdGltZSA9PSB0MjsNCisgIH0NCisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yPT0oRlhfVU5JVElNRSB0MSwgY29uc3QgQ0ZYX1VuaXRpbWUmIHQyKSB7DQorICAgIHJldHVybiB0MSA9PSB0Mi5tX2lVbml0aW1lOw0KKyAgfQ0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3IhPShjb25zdCBDRlhfVW5pdGltZSYgdDEsIGNvbnN0IENGWF9Vbml0aW1lJiB0Mikgew0KKyAgICByZXR1cm4gdDEubV9pVW5pdGltZSAhPSB0Mi5tX2lVbml0aW1lOw0KKyAgfQ0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3IhPShjb25zdCBDRlhfVW5pdGltZSYgdDEsIEZYX1VOSVRJTUUgdDIpIHsNCisgICAgcmV0dXJuIHQxLm1faVVuaXRpbWUgIT0gdDI7DQorICB9DQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvciE9KEZYX1VOSVRJTUUgdDEsIGNvbnN0IENGWF9Vbml0aW1lJiB0Mikgew0KKyAgICByZXR1cm4gdDEgIT0gdDIubV9pVW5pdGltZTsNCisgIH0NCisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yPihjb25zdCBDRlhfVW5pdGltZSYgdDEsIGNvbnN0IENGWF9Vbml0aW1lJiB0Mikgew0KKyAgICByZXR1cm4gdDEubV9pVW5pdGltZSA+IHQyLm1faVVuaXRpbWU7DQorICB9DQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvcj4oY29uc3QgQ0ZYX1VuaXRpbWUmIHQxLCBGWF9VTklUSU1FIHQyKSB7DQorICAgIHJldHVybiB0MS5tX2lVbml0aW1lID4gdDI7DQorICB9DQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvcj4oRlhfVU5JVElNRSB0MSwgY29uc3QgQ0ZYX1VuaXRpbWUmIHQyKSB7DQorICAgIHJldHVybiB0MSA+IHQyLm1faVVuaXRpbWU7DQorICB9DQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvcj49KGNvbnN0IENGWF9Vbml0aW1lJiB0MSwgY29uc3QgQ0ZYX1VuaXRpbWUmIHQyKSB7DQorICAgIHJldHVybiB0MS5tX2lVbml0aW1lID49IHQyLm1faVVuaXRpbWU7DQorICB9DQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvcj49KGNvbnN0IENGWF9Vbml0aW1lJiB0MSwgRlhfVU5JVElNRSB0Mikgew0KKyAgICByZXR1cm4gdDEubV9pVW5pdGltZSA+PSB0MjsNCisgIH0NCisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yPj0oRlhfVU5JVElNRSB0MSwgY29uc3QgQ0ZYX1VuaXRpbWUmIHQyKSB7DQorICAgIHJldHVybiB0MSA+PSB0Mi5tX2lVbml0aW1lOw0KKyAgfQ0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3I8KGNvbnN0IENGWF9Vbml0aW1lJiB0MSwgY29uc3QgQ0ZYX1VuaXRpbWUmIHQyKSB7DQorICAgIHJldHVybiB0MS5tX2lVbml0aW1lIDwgdDIubV9pVW5pdGltZTsNCisgIH0NCisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yPChjb25zdCBDRlhfVW5pdGltZSYgdDEsIEZYX1VOSVRJTUUgdDIpIHsNCisgICAgcmV0dXJuIHQxLm1faVVuaXRpbWUgPCB0MjsNCisgIH0NCisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yPChGWF9VTklUSU1FIHQxLCBjb25zdCBDRlhfVW5pdGltZSYgdDIpIHsNCisgICAgcmV0dXJuIHQxIDwgdDIubV9pVW5pdGltZTsNCisgIH0NCisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yPD0oY29uc3QgQ0ZYX1VuaXRpbWUmIHQxLCBjb25zdCBDRlhfVW5pdGltZSYgdDIpIHsNCisgICAgcmV0dXJuIHQxLm1faVVuaXRpbWUgPD0gdDIubV9pVW5pdGltZTsNCisgIH0NCisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yPD0oY29uc3QgQ0ZYX1VuaXRpbWUmIHQxLCBGWF9VTklUSU1FIHQyKSB7DQorICAgIHJldHVybiB0MS5tX2lVbml0aW1lIDw9IHQyOw0KKyAgfQ0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3I8PShGWF9VTklUSU1FIHQxLCBjb25zdCBDRlhfVW5pdGltZSYgdDIpIHsNCisgICAgcmV0dXJuIHQxIDw9IHQyLm1faVVuaXRpbWU7DQorICB9DQorDQorIHByaXZhdGU6DQorICBGWF9VTklUSU1FIG1faVVuaXRpbWU7DQorfTsNCisjaWYgX0ZYX09TXyAhPSBfRlhfQU5EUk9JRF8NCisjcHJhZ21hIHBhY2socHVzaCwgMSkNCisjZW5kaWYNCit0eXBlZGVmIHN0cnVjdCBfRlhfREFURSB7DQorICBpbnQzMl90IHllYXI7DQorICB1aW50OF90IG1vbnRoOw0KKyAgdWludDhfdCBkYXk7DQorfSBGWF9EQVRFLCAqRlhfTFBEQVRFOw0KK3R5cGVkZWYgRlhfREFURSBjb25zdCogRlhfTFBDREFURTsNCit0eXBlZGVmIHN0cnVjdCBfRlhfVElNRSB7DQorICB1aW50OF90IGhvdXI7DQorICB1aW50OF90IG1pbnV0ZTsNCisgIHVpbnQ4X3Qgc2Vjb25kOw0KKyAgRlhfV09SRCBtaWxsaXNlY29uZDsNCit9IEZYX1RJTUUsICpGWF9MUFRJTUU7DQordHlwZWRlZiBGWF9USU1FIGNvbnN0KiBGWF9MUENUSU1FOw0KK3R5cGVkZWYgc3RydWN0IF9GWF9USU1FWk9ORSB7DQorICBpbnQ4X3QgdHpIb3VyOw0KKyAgdWludDhfdCB0ek1pbnV0ZTsNCit9IEZYX1RJTUVaT05FLCAqRlhfTFBUSU1FWk9ORTsNCit0eXBlZGVmIEZYX1RJTUVaT05FIGNvbnN0KiBGWF9MUENUSU1FWk9ORTsNCit0eXBlZGVmIHN0cnVjdCBfRlhfREFURVRJTUUgew0KKyAgdW5pb24gew0KKyAgICBzdHJ1Y3Qgew0KKyAgICAgIGludDMyX3QgeWVhcjsNCisgICAgICB1aW50OF90IG1vbnRoOw0KKyAgICAgIHVpbnQ4X3QgZGF5Ow0KKyAgICB9IHNEYXRlOw0KKyAgICBGWF9EQVRFIGFEYXRlOw0KKyAgfSBEYXRlOw0KKyAgdW5pb24gew0KKyAgICBzdHJ1Y3Qgew0KKyAgICAgIHVpbnQ4X3QgaG91cjsNCisgICAgICB1aW50OF90IG1pbnV0ZTsNCisgICAgICB1aW50OF90IHNlY29uZDsNCisgICAgICBGWF9XT1JEIG1pbGxpc2Vjb25kOw0KKyAgICB9IHNUaW1lOw0KKyAgICBGWF9USU1FIGFUaW1lOw0KKyAgfSBUaW1lOw0KK30gRlhfREFURVRJTUUsICpGWF9MUERBVEVUSU1FOw0KK3R5cGVkZWYgRlhfREFURVRJTUUgY29uc3QqIEZYX0xQQ0RBVEVUSU1FOw0KK3R5cGVkZWYgc3RydWN0IF9GWF9EQVRFVElNRVpPTkUgew0KKyAgdW5pb24gew0KKyAgICBzdHJ1Y3Qgew0KKyAgICAgIHVuaW9uIHsNCisgICAgICAgIHN0cnVjdCB7DQorICAgICAgICAgIGludDMyX3QgeWVhcjsNCisgICAgICAgICAgdWludDhfdCBtb250aDsNCisgICAgICAgICAgdWludDhfdCBkYXk7DQorICAgICAgICB9Ow0KKyAgICAgICAgRlhfREFURSBkYXRlOw0KKyAgICAgIH07DQorICAgICAgdW5pb24gew0KKyAgICAgICAgc3RydWN0IHsNCisgICAgICAgICAgdWludDhfdCBob3VyOw0KKyAgICAgICAgICB1aW50OF90IG1pbnV0ZTsNCisgICAgICAgICAgdWludDhfdCBzZWNvbmQ7DQorICAgICAgICAgIEZYX1dPUkQgbWlsbGlzZWNvbmQ7DQorICAgICAgICB9Ow0KKyAgICAgICAgRlhfVElNRSB0aW1lOw0KKyAgICAgIH07DQorICAgIH07DQorICAgIEZYX0RBVEVUSU1FIGR0Ow0KKyAgfTsNCisgIHVuaW9uIHsNCisgICAgc3RydWN0IHsNCisgICAgICBpbnQ4X3QgdHpIb3VyOw0KKyAgICAgIHVpbnQ4X3QgdHpNaW51dGU7DQorICAgIH07DQorICAgIEZYX1RJTUVaT05FIHR6Ow0KKyAgfTsNCit9IEZYX0RBVEVUSU1FWk9ORSwgKkZYX0xQREFURVRJTUVaT05FOw0KK3R5cGVkZWYgRlhfREFURVRJTUVaT05FIGNvbnN0KiBGWF9MUENEQVRFVElNRVpPTkU7DQorI2lmIF9GWF9PU18gIT0gX0ZYX0FORFJPSURfDQorI3ByYWdtYSBwYWNrKHBvcCkNCisjZW5kaWYNCitjbGFzcyBDRlhfRGF0ZVRpbWUgew0KKyBwdWJsaWM6DQorICBDRlhfRGF0ZVRpbWUoKSB7fQ0KKyAgQ0ZYX0RhdGVUaW1lKGNvbnN0IEZYX0RBVEVUSU1FJiBkdCkgeyBtX0RhdGVUaW1lID0gZHQ7IH0NCisgIENGWF9EYXRlVGltZShjb25zdCBDRlhfRGF0ZVRpbWUmIGR0KSB7IG1fRGF0ZVRpbWUgPSBkdC5tX0RhdGVUaW1lOyB9DQorICB2aXJ0dWFsIH5DRlhfRGF0ZVRpbWUoKSB7fQ0KKyAgb3BlcmF0b3IgRlhfREFURVRJTUUqKCkgeyByZXR1cm4gJm1fRGF0ZVRpbWU7IH0NCisgIG9wZXJhdG9yIEZYX0RBVEVUSU1FIGNvbnN0KigpIGNvbnN0IHsgcmV0dXJuICZtX0RhdGVUaW1lOyB9DQorICBvcGVyYXRvciBGWF9EQVRFVElNRSYoKSB7IHJldHVybiBtX0RhdGVUaW1lOyB9DQorICBvcGVyYXRvciBjb25zdCBGWF9EQVRFVElNRSYoKSBjb25zdCB7IHJldHVybiBtX0RhdGVUaW1lOyB9DQorICBDRlhfRGF0ZVRpbWUmIG9wZXJhdG9yPShjb25zdCBDRlhfRGF0ZVRpbWUmIGR0KSB7DQorICAgIG1fRGF0ZVRpbWUgPSBkdC5tX0RhdGVUaW1lOw0KKyAgICByZXR1cm4gKnRoaXM7DQorICB9DQorICBDRlhfRGF0ZVRpbWUmIG9wZXJhdG9yPShjb25zdCBGWF9EQVRFVElNRSYgZHQpIHsNCisgICAgbV9EYXRlVGltZSA9IGR0Ow0KKyAgICByZXR1cm4gKnRoaXM7DQorICB9DQorICBDRlhfRGF0ZVRpbWUmIG9wZXJhdG9yKz0oY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdCkgew0KKyAgICBGcm9tVW5pdGltZShUb1VuaXRpbWUoKSArIGR0LlRvVW5pdGltZSgpKTsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKyAgQ0ZYX0RhdGVUaW1lJiBvcGVyYXRvcis9KGNvbnN0IEZYX0RBVEVUSU1FJiBkdCkgew0KKyAgICBGcm9tVW5pdGltZShUb1VuaXRpbWUoKSArICgoY29uc3QgQ0ZYX0RhdGVUaW1lJilkdCkuVG9Vbml0aW1lKCkpOw0KKyAgICByZXR1cm4gKnRoaXM7DQorICB9DQorICBDRlhfRGF0ZVRpbWUmIG9wZXJhdG9yLT0oY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdCkgew0KKyAgICBGcm9tVW5pdGltZShUb1VuaXRpbWUoKSAtIGR0LlRvVW5pdGltZSgpKTsNCisgICAgcmV0dXJuICp0aGlzOw0KKyAgfQ0KKyAgQ0ZYX0RhdGVUaW1lJiBvcGVyYXRvci09KGNvbnN0IEZYX0RBVEVUSU1FJiBkdCkgew0KKyAgICBGcm9tVW5pdGltZShUb1VuaXRpbWUoKSAtICgoY29uc3QgQ0ZYX0RhdGVUaW1lJilkdCkuVG9Vbml0aW1lKCkpOw0KKyAgICByZXR1cm4gKnRoaXM7DQorICB9DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0KGludDMyX3QgeWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkYXksDQorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaG91ciA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWludXRlID0gMCwNCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzZWNvbmQgPSAwLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIG1pbGxpc2Vjb25kID0gMCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRnJvbVVuaXRpbWUoRlhfVU5JVElNRSB0KTsNCisgIHZpcnR1YWwgRlhfVU5JVElNRSBUb1VuaXRpbWUoKSBjb25zdDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRZZWFyKCkgY29uc3Q7DQorICB2aXJ0dWFsIHVpbnQ4X3QgR2V0TW9udGgoKSBjb25zdDsNCisgIHZpcnR1YWwgdWludDhfdCBHZXREYXkoKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfV0VFS0RBWSBHZXREYXlPZldlZWsoKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfV09SRCBHZXREYXlPZlllYXIoKSBjb25zdDsNCisgIHZpcnR1YWwgaW50NjRfdCBHZXREYXlPZkFEKCkgY29uc3Q7DQorICB2aXJ0dWFsIHVpbnQ4X3QgR2V0SG91cigpIGNvbnN0Ow0KKyAgdmlydHVhbCB1aW50OF90IEdldE1pbnV0ZSgpIGNvbnN0Ow0KKyAgdmlydHVhbCB1aW50OF90IEdldFNlY29uZCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9XT1JEIEdldE1pbGxpc2Vjb25kKCkgY29uc3Q7DQorICB2aXJ0dWFsIEZYX0JPT0wgQWRkWWVhcnMoaW50MzJfdCBpWWVhcnMpOw0KKyAgdmlydHVhbCBGWF9CT09MIEFkZE1vbnRocyhpbnQzMl90IGlNb250aHMpOw0KKyAgdmlydHVhbCBGWF9CT09MIEFkZERheXMoaW50MzJfdCBpRGF5cyk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQWRkSG91cnMoaW50MzJfdCBpSG91cnMpOw0KKyAgdmlydHVhbCBGWF9CT09MIEFkZE1pbnV0ZXMoaW50MzJfdCBpTWludXRlcyk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQWRkU2Vjb25kcyhpbnQzMl90IGlTZWNvbmRzKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBBZGRNaWxsaXNlY29uZHMoaW50MzJfdCBpTWlsbGlzZWNvbmRzKTsNCisgIGZyaWVuZCBDRlhfRGF0ZVRpbWUgb3BlcmF0b3IrKGNvbnN0IENGWF9EYXRlVGltZSYgZHQxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDIpIHsNCisgICAgQ0ZYX0RhdGVUaW1lIGR0Ow0KKyAgICBkdC5Gcm9tVW5pdGltZShkdDEuVG9Vbml0aW1lKCkgKyBkdDIuVG9Vbml0aW1lKCkpOw0KKyAgICByZXR1cm4gZHQ7DQorICB9DQorICBmcmllbmQgQ0ZYX0RhdGVUaW1lIG9wZXJhdG9yKyhjb25zdCBDRlhfRGF0ZVRpbWUmIGR0MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0RBVEVUSU1FJiBkdDIpIHsNCisgICAgQ0ZYX0RhdGVUaW1lIGR0Ow0KKyAgICBkdC5Gcm9tVW5pdGltZShkdDEuVG9Vbml0aW1lKCkgKyAoKGNvbnN0IENGWF9EYXRlVGltZSYpZHQyKS5Ub1VuaXRpbWUoKSk7DQorICAgIHJldHVybiBkdDsNCisgIH0NCisgIGZyaWVuZCBDRlhfRGF0ZVRpbWUgb3BlcmF0b3IrKGNvbnN0IEZYX0RBVEVUSU1FJiBkdDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRGF0ZVRpbWUmIGR0Mikgew0KKyAgICBDRlhfRGF0ZVRpbWUgZHQ7DQorICAgIGR0LkZyb21Vbml0aW1lKCgoY29uc3QgQ0ZYX0RhdGVUaW1lJilkdDEpLlRvVW5pdGltZSgpICsgZHQyLlRvVW5pdGltZSgpKTsNCisgICAgcmV0dXJuIGR0Ow0KKyAgfQ0KKyAgZnJpZW5kIENGWF9EYXRlVGltZSBvcGVyYXRvci0oY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRGF0ZVRpbWUmIGR0Mikgew0KKyAgICBDRlhfRGF0ZVRpbWUgZHQ7DQorICAgIGR0LkZyb21Vbml0aW1lKGR0MS5Ub1VuaXRpbWUoKSAtIGR0Mi5Ub1VuaXRpbWUoKSk7DQorICAgIHJldHVybiBkdDsNCisgIH0NCisgIGZyaWVuZCBDRlhfRGF0ZVRpbWUgb3BlcmF0b3ItKGNvbnN0IENGWF9EYXRlVGltZSYgZHQxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfREFURVRJTUUmIGR0Mikgew0KKyAgICBDRlhfRGF0ZVRpbWUgZHQ7DQorICAgIGR0LkZyb21Vbml0aW1lKGR0MS5Ub1VuaXRpbWUoKSAtICgoY29uc3QgQ0ZYX0RhdGVUaW1lJilkdDIpLlRvVW5pdGltZSgpKTsNCisgICAgcmV0dXJuIGR0Ow0KKyAgfQ0KKyAgZnJpZW5kIENGWF9EYXRlVGltZSBvcGVyYXRvci0oY29uc3QgRlhfREFURVRJTUUmIGR0MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9EYXRlVGltZSYgZHQyKSB7DQorICAgIENGWF9EYXRlVGltZSBkdDsNCisgICAgZHQuRnJvbVVuaXRpbWUoKChjb25zdCBDRlhfRGF0ZVRpbWUmKWR0MSkuVG9Vbml0aW1lKCkgLSBkdDIuVG9Vbml0aW1lKCkpOw0KKyAgICByZXR1cm4gZHQ7DQorICB9DQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvcj09KGNvbnN0IENGWF9EYXRlVGltZSYgZHQxLCBjb25zdCBDRlhfRGF0ZVRpbWUmIGR0Mikgew0KKyAgICByZXR1cm4gRlhTWVNfbWVtY21wKChGWF9MUENEQVRFVElNRSlkdDEsIChGWF9MUENEQVRFVElNRSlkdDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZYX0RBVEVUSU1FKSkgPT0gMDsNCisgIH0NCisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yPT0oY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDEsIGNvbnN0IEZYX0RBVEVUSU1FJiBkdDIpIHsNCisgICAgcmV0dXJuIEZYU1lTX21lbWNtcCgoRlhfTFBDREFURVRJTUUpZHQxLCAmZHQyLCBzaXplb2YoRlhfREFURVRJTUUpKSA9PSAwOw0KKyAgfQ0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3I9PShjb25zdCBGWF9EQVRFVElNRSYgZHQxLCBjb25zdCBDRlhfRGF0ZVRpbWUmIGR0Mikgew0KKyAgICByZXR1cm4gRlhTWVNfbWVtY21wKCZkdDEsIChGWF9MUENEQVRFVElNRSlkdDIsIHNpemVvZihGWF9EQVRFVElNRSkpID09IDA7DQorICB9DQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvciE9KGNvbnN0IENGWF9EYXRlVGltZSYgZHQxLCBjb25zdCBDRlhfRGF0ZVRpbWUmIGR0Mikgew0KKyAgICByZXR1cm4gRlhTWVNfbWVtY21wKChGWF9MUENEQVRFVElNRSlkdDEsIChGWF9MUENEQVRFVElNRSlkdDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZYX0RBVEVUSU1FKSkgIT0gMDsNCisgIH0NCisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yIT0oY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDEsIGNvbnN0IEZYX0RBVEVUSU1FJiBkdDIpIHsNCisgICAgcmV0dXJuIEZYU1lTX21lbWNtcCgoRlhfTFBDREFURVRJTUUpZHQxLCAmZHQyLCBzaXplb2YoRlhfREFURVRJTUUpKSAhPSAwOw0KKyAgfQ0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3IhPShjb25zdCBGWF9EQVRFVElNRSYgZHQxLCBjb25zdCBDRlhfRGF0ZVRpbWUmIGR0Mikgew0KKyAgICByZXR1cm4gRlhTWVNfbWVtY21wKCZkdDEsIChGWF9MUENEQVRFVElNRSlkdDIsIHNpemVvZihGWF9EQVRFVElNRSkpICE9IDA7DQorICB9DQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvcj4oY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDEsIGNvbnN0IENGWF9EYXRlVGltZSYgZHQyKSB7DQorICAgIHJldHVybiBkdDEuVG9Vbml0aW1lKCkgPiBkdDIuVG9Vbml0aW1lKCk7DQorICB9DQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvcj4oY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDEsIGNvbnN0IEZYX0RBVEVUSU1FJiBkdDIpIHsNCisgICAgcmV0dXJuIGR0MS5Ub1VuaXRpbWUoKSA+ICgoY29uc3QgQ0ZYX0RhdGVUaW1lJilkdDIpLlRvVW5pdGltZSgpOw0KKyAgfQ0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3I+KGNvbnN0IEZYX0RBVEVUSU1FJiBkdDEsIGNvbnN0IENGWF9EYXRlVGltZSYgZHQyKSB7DQorICAgIHJldHVybiAoKGNvbnN0IENGWF9EYXRlVGltZSYpZHQxKS5Ub1VuaXRpbWUoKSA+IGR0Mi5Ub1VuaXRpbWUoKTsNCisgIH0NCisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yPj0oY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDEsIGNvbnN0IENGWF9EYXRlVGltZSYgZHQyKSB7DQorICAgIHJldHVybiBkdDEuVG9Vbml0aW1lKCkgPj0gZHQyLlRvVW5pdGltZSgpOw0KKyAgfQ0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3I+PShjb25zdCBDRlhfRGF0ZVRpbWUmIGR0MSwgY29uc3QgRlhfREFURVRJTUUmIGR0Mikgew0KKyAgICByZXR1cm4gZHQxLlRvVW5pdGltZSgpID49ICgoY29uc3QgQ0ZYX0RhdGVUaW1lJilkdDIpLlRvVW5pdGltZSgpOw0KKyAgfQ0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3I+PShjb25zdCBGWF9EQVRFVElNRSYgZHQxLCBjb25zdCBDRlhfRGF0ZVRpbWUmIGR0Mikgew0KKyAgICByZXR1cm4gKChjb25zdCBDRlhfRGF0ZVRpbWUmKWR0MSkuVG9Vbml0aW1lKCkgPj0gZHQyLlRvVW5pdGltZSgpOw0KKyAgfQ0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3I8KGNvbnN0IENGWF9EYXRlVGltZSYgZHQxLCBjb25zdCBDRlhfRGF0ZVRpbWUmIGR0Mikgew0KKyAgICByZXR1cm4gZHQxLlRvVW5pdGltZSgpIDwgZHQyLlRvVW5pdGltZSgpOw0KKyAgfQ0KKyAgZnJpZW5kIEZYX0JPT0wgb3BlcmF0b3I8KGNvbnN0IENGWF9EYXRlVGltZSYgZHQxLCBjb25zdCBGWF9EQVRFVElNRSYgZHQyKSB7DQorICAgIHJldHVybiBkdDEuVG9Vbml0aW1lKCkgPCAoKGNvbnN0IENGWF9EYXRlVGltZSYpZHQyKS5Ub1VuaXRpbWUoKTsNCisgIH0NCisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yPChjb25zdCBGWF9EQVRFVElNRSYgZHQxLCBjb25zdCBDRlhfRGF0ZVRpbWUmIGR0Mikgew0KKyAgICByZXR1cm4gKChjb25zdCBDRlhfRGF0ZVRpbWUmKWR0MSkuVG9Vbml0aW1lKCkgPCBkdDIuVG9Vbml0aW1lKCk7DQorICB9DQorICBmcmllbmQgRlhfQk9PTCBvcGVyYXRvcjw9KGNvbnN0IENGWF9EYXRlVGltZSYgZHQxLCBjb25zdCBDRlhfRGF0ZVRpbWUmIGR0Mikgew0KKyAgICByZXR1cm4gZHQxLlRvVW5pdGltZSgpIDw9IGR0Mi5Ub1VuaXRpbWUoKTsNCisgIH0NCisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yPD0oY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDEsIGNvbnN0IEZYX0RBVEVUSU1FJiBkdDIpIHsNCisgICAgcmV0dXJuIGR0MS5Ub1VuaXRpbWUoKSA8PSAoKGNvbnN0IENGWF9EYXRlVGltZSYpZHQyKS5Ub1VuaXRpbWUoKTsNCisgIH0NCisgIGZyaWVuZCBGWF9CT09MIG9wZXJhdG9yPD0oY29uc3QgRlhfREFURVRJTUUmIGR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDIpIHsNCisgICAgcmV0dXJuICgoY29uc3QgQ0ZYX0RhdGVUaW1lJilkdDEpLlRvVW5pdGltZSgpIDw9IGR0Mi5Ub1VuaXRpbWUoKTsNCisgIH0NCisNCisgcHJpdmF0ZToNCisgIEZYX0RBVEVUSU1FIG1fRGF0ZVRpbWU7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9mbnQuaCBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2ZudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNjBhZjIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9mbnQuaApAQCAtMCwwICsxLDI2NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWF9GT05UDQorI2RlZmluZSBfRlhfRk9OVA0KK2NsYXNzIElGWF9Gb250Ow0KK2NsYXNzIElGWF9Gb250TWdyOw0KKyNkZWZpbmUgRlhfRk9OVFNUWUxFX05vcm1hbCAweDAwDQorI2RlZmluZSBGWF9GT05UU1RZTEVfRml4ZWRQaXRjaCAweDAxDQorI2RlZmluZSBGWF9GT05UU1RZTEVfU2VyaWYgMHgwMg0KKyNkZWZpbmUgRlhfRk9OVFNUWUxFX1N5bWJvbGljIDB4MDQNCisjZGVmaW5lIEZYX0ZPTlRTVFlMRV9TY3JpcHQgMHgwOA0KKyNkZWZpbmUgRlhfRk9OVFNUWUxFX0l0YWxpYyAweDQwDQorI2RlZmluZSBGWF9GT05UU1RZTEVfQm9sZCAweDQwMDAwDQorI2RlZmluZSBGWF9GT05UU1RZTEVfQm9sZEl0YWxpYyAoRlhfRk9OVFNUWUxFX0JvbGQgfCBGWF9GT05UU1RZTEVfSXRhbGljKQ0KKyNkZWZpbmUgRlhfRk9OVFNUWUxFX0V4YWN0TWF0Y2ggMHg4MDAwMDAwMA0KKyNkZWZpbmUgRlhfRk9OVERFQ09SQVRJT05fVW5kZXJsaW5lIDB4MDAwMDAwMDENCisjZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX1N0cmlrZW91dCAweDAwMDAwMDAyDQorI2RlZmluZSBGWF9GT05UREVDT1JBVElPTl9PdmVybGluZSAweDAwMDAwMDA0DQorI2RlZmluZSBGWF9GT05UREVDT1JBVElPTl9FbXBoYXNpcyAweDAwMDAwMDA4DQorI2RlZmluZSBGWF9GT05UREVDT1JBVElPTl9TdXBlcnNjcmlwdCAweDAwMDAwMDEwDQorI2RlZmluZSBGWF9GT05UREVDT1JBVElPTl9TdWJzY3JpcHQgMHgwMDAwMDAyMA0KKyNkZWZpbmUgRlhfRk9OVERFQ09SQVRJT05fU21hbGxDYXBpdGFsIDB4MDAwMDAwNDANCisjZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX0NhcGl0YWwgMHgwMDAwMDA4MA0KKyNkZWZpbmUgRlhfRk9OVERFQ09SQVRJT05fTG93ZXJjYXNlIDB4MDAwMDAwQzANCisjZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX1JhaXNlZCAweDAwMDAwMTAwDQorI2RlZmluZSBGWF9GT05UREVDT1JBVElPTl9TdW5rZW4gMHgwMDAwMDIwMA0KKyNkZWZpbmUgRlhfRk9OVERFQ09SQVRJT05fU2hhZG93IDB4MDAwMDA0MDANCisjZGVmaW5lIEZYX0ZPTlRERUNPUkFUSU9OX0JvdW5kaW5nU2hhcGUgMHgyMDAwMDAwMA0KKyNkZWZpbmUgRlhfRk9OVERFQ09SQVRJT05fSGlkZSAweDQwMDAwMDAwDQorI2RlZmluZSBGWF9GT05UREVDT1JBVElPTl9TdHJva2VGaWxsIDB4ODAwMDAwMDANCisjZGVmaW5lIEZYX0JPVU5ESU5HU0hBUEVfTm9uZSAwDQorI2RlZmluZSBGWF9CT1VORElOR1NIQVBFX0NpcmNsZSAxDQorI2RlZmluZSBGWF9CT1VORElOR1NIQVBFX1NxdWFyZSAyDQorI2RlZmluZSBGWF9CT1VORElOR1NIQVBFX1RyaWFuZ2xlIDMNCisjZGVmaW5lIEZYX0JPVU5ESU5HU0hBUEVfRGlhbW9uZCA0DQorDQorY2xhc3MgSUZYX0ZvbnRQcm92aWRlciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGWF9Gb250UHJvdmlkZXIoKSB7fQ0KKyAgdmlydHVhbCBGWF9CT09MIEdldENoYXJXaWR0aChJRlhfRm9udCogcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIHdVbmljb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UpID0gMDsNCit9Ow0KKw0KK2NsYXNzIElGWF9Gb250IHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGWF9Gb250KiBMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnRNZ3IqIHBGb250TWdyKTsNCisgIHN0YXRpYyBJRlhfRm9udCogTG9hZEZvbnQoY29uc3QgdWludDhfdCogcEJ1ZmZlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRm9udE1nciogcEZvbnRNZ3IpOw0KKyAgc3RhdGljIElGWF9Gb250KiBMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6RmlsZU5hbWUsIElGWF9Gb250TWdyKiBwRm9udE1ncik7DQorICBzdGF0aWMgSUZYX0ZvbnQqIExvYWRGb250KElGWF9TdHJlYW0qIHBGb250U3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRm9udE1nciogcEZvbnRNZ3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNhdmVTdHJlYW0gPSBGQUxTRSk7DQorICBzdGF0aWMgSUZYX0ZvbnQqIExvYWRGb250KENGWF9Gb250KiBwRXh0Rm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnRNZ3IqIHBGb250TWdyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUYWtlT3ZlciA9IEZBTFNFKTsNCisgIHZpcnR1YWwgfklGWF9Gb250KCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCBJRlhfRm9udCogUmV0YWluKCkgPSAwOw0KKyAgdmlydHVhbCBJRlhfRm9udCogRGVyaXZlKEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCB3Q29kZVBhZ2UgPSAwKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0RmFtaWx5TmFtZShDRlhfV2lkZVN0cmluZyYgd3NGYW1pbHkpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXRQc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRGb250U3R5bGVzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB1aW50OF90IEdldENoYXJTZXQoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0Q2hhcldpZHRoKEZYX1dDSEFSIHdVbmljb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRHbHlwaEluZGV4KEZYX1dDSEFSIHdVbmljb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEFzY2VudCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXREZXNjZW50KCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldENoYXJCQm94KEZYX1dDSEFSIHdVbmljb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0JiBiYm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRCQm94KENGWF9SZWN0JiBiYm94KSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0SXRhbGljQW5nbGUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgUmVzZXQoKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Gb250KiBHZXRTdWJzdEZvbnQoaW50MzJfdCBpR2x5cGhJbmRleCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkKiBHZXREZXZGb250KCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEZvbnRQcm92aWRlcihJRlhfRm9udFByb3ZpZGVyKiBwUHJvdmlkZXIpID0gMDsNCisjaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KKyAgdmlydHVhbCB2b2lkIFNldExvZ2ljYWxGb250U3R5bGUoRlhfRFdPUkQgZHdMb2dGb250U3R5bGUpID0gMDsNCisjZW5kaWYNCit9Ow0KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQordHlwZWRlZiBzdHJ1Y3QgX0ZYX0ZPTlRNQVRDSFBBUkFNUyB7DQorICBjb25zdCBGWF9XQ0hBUiogcHdzRmFtaWx5Ow0KKyAgRlhfRFdPUkQgZHdGb250U3R5bGVzOw0KKyAgRlhfRFdPUkQgZHdVU0I7DQorICBGWF9EV09SRCBkd01hdGNoRmxhZ3M7DQorICBGWF9XQ0hBUiB3VW5pY29kZTsNCisgIEZYX1dPUkQgd0NvZGVQYWdlOw0KK30gRlhfRk9OVE1BVENIUEFSQU1TLCAqRlhfTFBGT05UTUFUQ0hQQVJBTVM7DQordHlwZWRlZiBGWF9GT05UTUFUQ0hQQVJBTVMgY29uc3QqIEZYX0xQQ0ZPTlRNQVRDSFBBUkFNUzsNCit0eXBlZGVmIHN0cnVjdCBfRlhfRk9OVFNJR05BVFVSRSA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgIEZYX0RXT1JEIGZzVXNiWzRdOw0KKyAgRlhfRFdPUkQgZnNDc2JbMl07DQorfSBGWF9GT05UU0lHTkFUVVJFOw0KK3R5cGVkZWYgc3RydWN0IF9GWF9GT05UREVTQ1JJUFRPUiA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgIEZYX1dDSEFSIHdzRm9udEZhY2VbMzJdOw0KKyAgRlhfRFdPUkQgZHdGb250U3R5bGVzOw0KKyAgdWludDhfdCB1Q2hhclNldDsNCisgIEZYX0ZPTlRTSUdOQVRVUkUgRm9udFNpZ25hdHVyZTsNCit9IEZYX0ZPTlRERVNDUklQVE9SLCAqRlhfTFBGT05UREVTQ1JJUFRPUjsNCit0eXBlZGVmIEZYX0ZPTlRERVNDUklQVE9SIGNvbnN0KiBGWF9MUENGT05UREVTQ1JJUFRPUjsNCit0eXBlZGVmIENGWF9NYXNzQXJyYXlUZW1wbGF0ZTxGWF9GT05UREVTQ1JJUFRPUj4gQ0ZYX0ZvbnREZXNjcmlwdG9yczsNCitpbmxpbmUgRlhfQk9PTCBvcGVyYXRvcj09KGNvbnN0IEZYX0ZPTlRERVNDUklQVE9SJiBsZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfRk9OVERFU0NSSVBUT1ImIHJpZ2h0KSB7DQorICByZXR1cm4gbGVmdC51Q2hhclNldCA9PSByaWdodC51Q2hhclNldCAmJg0KKyAgICAgICAgIGxlZnQuZHdGb250U3R5bGVzID09IHJpZ2h0LmR3Rm9udFN0eWxlcyAmJg0KKyAgICAgICAgIEZYU1lTX3djc2NtcChsZWZ0LndzRm9udEZhY2UsIHJpZ2h0LndzRm9udEZhY2UpID09IDAgJiYNCisgICAgICAgICBGWFNZU19tZW1jbXAoJmxlZnQuRm9udFNpZ25hdHVyZSwgJnJpZ2h0LkZvbnRTaWduYXR1cmUsDQorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGWF9GT05UU0lHTkFUVVJFKSkgPT0gMDsNCit9DQorI2RlZmluZSBGWF9GT05UTUFUQ0hQQVJBX01hY3RoU3R5bGUgMHgwMQ0KKyNkZWZpbmUgRlhfRk9OVE1BVENIUEFSQV9NYWN0aEZhbWlseSAweDAyDQorI2RlZmluZSBGWF9GT05UTUFUQ0hQQVJBX01hY3RoVW5pY29kZSAweDA0DQordHlwZWRlZiB2b2lkICgqRlhfTFBFbnVtQWxsRm9udHMpKENGWF9Gb250RGVzY3JpcHRvcnMmIGZvbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVXNlckRhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwd3NGYWNlTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgd1VuaWNvZGUpOw0KK0ZYX0xQRW51bUFsbEZvbnRzIEZYX0dldERlZkZvbnRFbnVtZXJhdG9yKCk7DQordHlwZWRlZiBGWF9MUENGT05UREVTQ1JJUFRPUiAoKkZYX0xQTWF0Y2hGb250KShGWF9MUEZPTlRNQVRDSFBBUkFNUyBwUGFyYW1zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0ZvbnREZXNjcmlwdG9ycyYgZm9udHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVXNlckRhdGEpOw0KK0ZYX0xQTWF0Y2hGb250IEZYX0dldERlZkZvbnRNYXRjaG9yKCk7DQorY2xhc3MgSUZYX0ZvbnRNZ3Igew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZYX0ZvbnRNZ3IqIENyZWF0ZShGWF9MUEVudW1BbGxGb250cyBwRW51bWVyYXRvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQTWF0Y2hGb250IHBNYXRjaGVyID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBVc2VyRGF0YSA9IE5VTEwpOw0KKyAgdmlydHVhbCB+SUZYX0ZvbnRNZ3IoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Gb250KiBHZXREZWZGb250QnlDb2RlUGFnZSgNCisgICAgICBGWF9XT1JEIHdDb2RlUGFnZSwNCisgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Gb250KiBHZXREZWZGb250QnlDaGFyc2V0KA0KKyAgICAgIHVpbnQ4X3QgbkNoYXJzZXQsDQorICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBJRlhfRm9udCogR2V0RGVmRm9udEJ5VW5pY29kZSgNCisgICAgICBGWF9XQ0hBUiB3VW5pY29kZSwNCisgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Gb250KiBHZXREZWZGb250QnlMYW5ndWFnZSgNCisgICAgICBGWF9XT1JEIHdMYW5ndWFnZSwNCisgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Gb250KiBMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlID0gMHhGRkZGKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Gb250KiBMb2FkRm9udChjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlMZW5ndGgpID0gMDsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIExvYWRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGaWxlTmFtZSkgPSAwOw0KKyAgdmlydHVhbCBJRlhfRm9udCogTG9hZEZvbnQoSUZYX1N0cmVhbSogcEZvbnRTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEFsaWFzID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcyA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlU3RyZWFtID0gRkFMU0UpID0gMDsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIExvYWRGb250KElGWF9Gb250KiBwU3JjRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlID0gMHhGRkZGKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgQ2xlYXJGb250Q2FjaGUoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgUmVtb3ZlRm9udChJRlhfRm9udCogcEZvbnQpID0gMDsNCit9Ow0KKyNlbHNlDQorY2xhc3MgSUZYX0ZvbnRNZ3JEZWxlZ2F0ZSB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGWF9Gb250TWdyRGVsZWdhdGUoKSB7fQ0KKyAgdmlydHVhbCBJRlhfRm9udCogR2V0RGVmRm9udEJ5Q29kZVBhZ2UoDQorICAgICAgSUZYX0ZvbnRNZ3IqIHBGb250TWdyLA0KKyAgICAgIEZYX1dPUkQgd0NvZGVQYWdlLA0KKyAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIEdldERlZkZvbnRCeUNoYXJzZXQoDQorICAgICAgSUZYX0ZvbnRNZ3IqIHBGb250TWdyLA0KKyAgICAgIHVpbnQ4X3QgbkNoYXJzZXQsDQorICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBJRlhfRm9udCogR2V0RGVmRm9udEJ5VW5pY29kZSgNCisgICAgICBJRlhfRm9udE1nciogcEZvbnRNZ3IsDQorICAgICAgRlhfV0NIQVIgd1VuaWNvZGUsDQorICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBJRlhfRm9udCogR2V0RGVmRm9udEJ5TGFuZ3VhZ2UoDQorICAgICAgSUZYX0ZvbnRNZ3IqIHBGb250TWdyLA0KKyAgICAgIEZYX1dPUkQgd0xhbmd1YWdlLA0KKyAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSA9IE5VTEwpID0gMDsNCit9Ow0KK2NsYXNzIElGWF9Gb250U291cmNlRW51bSB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGWF9Gb250U291cmNlRW51bSgpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisgIHZpcnR1YWwgRlhfUE9TSVRJT04gR2V0U3RhcnRQb3NpdGlvbih2b2lkKiBwVXNlckRhdGEgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIElGWF9GaWxlQWNjZXNzKiBHZXROZXh0KEZYX1BPU0lUSU9OJiBwb3MsIHZvaWQqIHBVc2VyRGF0YSA9IE5VTEwpID0gMDsNCit9Ow0KK0lGWF9Gb250U291cmNlRW51bSogRlhfQ3JlYXRlRGVmYXVsdEZvbnRTb3VyY2VFbnVtKCk7DQorY2xhc3MgSUZYX0ZvbnRNZ3Igew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZYX0ZvbnRNZ3IqIENyZWF0ZShJRlhfRm9udFNvdXJjZUVudW0qIHBGb250RW51bSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Gb250TWdyRGVsZWdhdGUqIHBEZWxlZ2F0ZSA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVXNlckRhdGEgPSBOVUxMKTsNCisgIHZpcnR1YWwgfklGWF9Gb250TWdyKCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCBJRlhfRm9udCogR2V0RGVmRm9udEJ5Q29kZVBhZ2UoDQorICAgICAgRlhfV09SRCB3Q29kZVBhZ2UsDQorICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBJRlhfRm9udCogR2V0RGVmRm9udEJ5Q2hhcnNldCgNCisgICAgICB1aW50OF90IG5DaGFyc2V0LA0KKyAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIEdldERlZkZvbnRCeVVuaWNvZGUoDQorICAgICAgRlhfV0NIQVIgd1VuaWNvZGUsDQorICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBJRlhfRm9udCogR2V0RGVmRm9udEJ5TGFuZ3VhZ2UoDQorICAgICAgRlhfV09SRCB3TGFuZ3VhZ2UsDQorICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBJRlhfRm9udCogR2V0Rm9udEJ5Q29kZVBhZ2UoRlhfV09SRCB3Q29kZVBhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSA9IE5VTEwpID0gMDsNCisgIGlubGluZSBJRlhfRm9udCogTG9hZEZvbnQoY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UpIHsNCisgICAgcmV0dXJuIEdldEZvbnRCeUNvZGVQYWdlKHdDb2RlUGFnZSwgZHdGb250U3R5bGVzLCBwc3pGb250RmFtaWx5KTsNCisgIH0NCisgIHZpcnR1YWwgSUZYX0ZvbnQqIEdldEZvbnRCeUNoYXJzZXQodWludDhfdCBuQ2hhcnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIEdldEZvbnRCeVVuaWNvZGUoRlhfV0NIQVIgd1VuaWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Gb250KiBHZXRGb250QnlMYW5ndWFnZShGWF9XT1JEIHdMYW5ndWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBJRlhfRm9udCogTG9hZEZvbnQoY29uc3QgdWludDhfdCogcEJ1ZmZlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZhY2VJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBGYWNlQ291bnQgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Gb250KiBMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6RmlsZU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlGYWNlSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBwRmFjZUNvdW50ID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBJRlhfRm9udCogTG9hZEZvbnQoSUZYX1N0cmVhbSogcEZvbnRTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlGYWNlSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBwRmFjZUNvdW50ID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNhdmVTdHJlYW0gPSBGQUxTRSkgPSAwOw0KKw0KKyAgdmlydHVhbCB2b2lkIENsZWFyRm9udENhY2hlKCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFJlbW92ZUZvbnQoSUZYX0ZvbnQqIHBGb250KSA9IDA7DQorfTsNCisjZW5kaWYNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9sYmsuaCBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2xiay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NDIxZWIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9sYmsuaApAQCAtMCwwICsxLDM5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYX0xJTkVCUkVBSw0KKyNkZWZpbmUgX0ZYX0xJTkVCUkVBSw0KKw0KKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfc3lzdGVtLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3V0bC5oIg0KKw0KK2VudW0gRlhfTElORUJSRUFLVFlQRSB7DQorICBGWF9MQlRfVU5LTk9XTiA9IDB4MDAsDQorICBGWF9MQlRfRElSRUNUX0JSSyA9IDB4MUEsDQorICBGWF9MQlRfSU5ESVJFQ1RfQlJLID0gMHgyQiwNCisgIEZYX0xCVF9DT01fSU5ESVJFQ1RfQlJLID0gMHgzQywNCisgIEZYX0xCVF9DT01fUFJPSElCSVRFRF9CUksgPSAweDRELA0KKyAgRlhfTEJUX1BST0hJQklURURfQlJLID0gMHg1RSwNCisgIEZYX0xCVF9IQU5HVUxfU1BBQ0VfQlJLID0gMHg2RiwNCit9Ow0KKw0KKyNkZWZpbmUgRlhfTEJVTiBGWF9MQlRfVU5LTk9XTg0KKyNkZWZpbmUgRlhfTEJEQiBGWF9MQlRfRElSRUNUX0JSSw0KKyNkZWZpbmUgRlhfTEJJQiBGWF9MQlRfSU5ESVJFQ1RfQlJLDQorI2RlZmluZSBGWF9MQkNCIEZYX0xCVF9DT01fSU5ESVJFQ1RfQlJLDQorI2RlZmluZSBGWF9MQkNQIEZYX0xCVF9DT01fUFJPSElCSVRFRF9CUksNCisjZGVmaW5lIEZYX0xCUEIgRlhfTEJUX1BST0hJQklURURfQlJLDQorI2RlZmluZSBGWF9MQkhTIEZYX0xCVF9IQU5HVUxfU1BBQ0VfQlJLDQorDQorZXh0ZXJuIGNvbnN0IEZYX0xJTkVCUkVBS1RZUEUgZ3NfRlhfTGluZUJyZWFrX1BhaXJUYWJsZVs2NF1bMzJdOw0KKw0KK3ZvaWQgRlhfR2V0TGluZUJyZWFrUG9zaXRpb25zKGNvbnN0IEZYX1dDSEFSKiBwd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xJTkVCUkVBS1RZUEUqIHBCcmtUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCk7DQordm9pZCBGWF9HZXRMaW5lQnJlYWtQb3NpdGlvbnMoY29uc3QgRlhfV0NIQVIqIHB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMk1hc3NBcnJheSYgYnApOw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2xnZy5oIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfbGdnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI5ODFmYwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2xnZy5oCkBAIC0wLDAgKzEsMjY3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYX0xBTkdVQUdFDQorI2RlZmluZSBfRlhfTEFOR1VBR0UNCisjZGVmaW5lIEZYX0xBTkdfTmV1dHJhbCAweDAwMDANCisjZGVmaW5lIEZYX0xBTkdfSW52YXJpYW50IDB4MDA3Zg0KKyNkZWZpbmUgRlhfTEFOR19Vc2VyRGVmYXVsdCAweDA0MDANCisjZGVmaW5lIEZYX0xBTkdfU3lzdGVtRGVmYXVsdCAweDA4MDANCisjZGVmaW5lIEZYX0xBTkdfQWZyaWthYW5zX1NvdXRoQWZyaWNhIDB4MDQzNg0KKyNkZWZpbmUgRlhfTEFOR19BbGJhbmlhbl9BbGJhbmlhIDB4MDQxYw0KKyNkZWZpbmUgRlhfTEFOR19BbHNhdGlhbl9GcmFuY2UgMHgwNDg0DQorI2RlZmluZSBGWF9MQU5HX0FtaGFyaWNfRXRoaW9waWEgMHgwNDVlDQorI2RlZmluZSBGWF9MQU5HX0FyYWJpY19BbGdlcmlhIDB4MTQwMQ0KKyNkZWZpbmUgRlhfTEFOR19BcmFiaWNfQmFocmFpbiAweDNjMDENCisjZGVmaW5lIEZYX0xBTkdfQXJhYmljX0VneXB0IDB4MGMwMQ0KKyNkZWZpbmUgRlhfTEFOR19BcmFiaWNfSXJhcSAweDA4MDENCisjZGVmaW5lIEZYX0xBTkdfQXJhYmljX0pvcmRhbiAweDJjMDENCisjZGVmaW5lIEZYX0xBTkdfQXJhYmljX0t1d2FpdCAweDM0MDENCisjZGVmaW5lIEZYX0xBTkdfQXJhYmljX0xlYmFub24gMHgzMDAxDQorI2RlZmluZSBGWF9MQU5HX0FyYWJpY19MaWJ5YSAweDEwMDENCisjZGVmaW5lIEZYX0xBTkdfQXJhYmljX01vcm9jY28gMHgxODAxDQorI2RlZmluZSBGWF9MQU5HX0FyYWJpY19PbWFuIDB4MjAwMQ0KKyNkZWZpbmUgRlhfTEFOR19BcmFiaWNfUWF0YXIgMHg0MDAxDQorI2RlZmluZSBGWF9MQU5HX0FyYWJpY19TYXVkaUFyYWJpYSAweDA0MDENCisjZGVmaW5lIEZYX0xBTkdfQXJhYmljX1N5cmlhIDB4MjgwMQ0KKyNkZWZpbmUgRlhfTEFOR19BcmFiaWNfVHVuaXNpYSAweDFjMDENCisjZGVmaW5lIEZYX0xBTkdfQXJhYmljX1VBRSAweDM4MDENCisjZGVmaW5lIEZYX0xBTkdfQXJhYmljX1llbWVuIDB4MjQwMQ0KKyNkZWZpbmUgRlhfTEFOR19Bcm1lbmlhbl9Bcm1lbmlhIDB4MDQyYg0KKyNkZWZpbmUgRlhfTEFOR19Bc3NhbWVzZV9JbmRpYSAweDA0NGQNCisjZGVmaW5lIEZYX0xBTkdfQXplcmJhaWphbl9DeXJpbGxpYyAweDA4MmMNCisjZGVmaW5lIEZYX0xBTkdfQXplcmJhaWphbl9MYXRpbiAweDA0MmMNCisjZGVmaW5lIEZYX0xBTkdfQmFzaGtpcl9SdXNzaWEgMHgwNDZkDQorI2RlZmluZSBGWF9MQU5HX0Jhc3F1ZV9CYXNxdWUgMHgwNDJkDQorI2RlZmluZSBGWF9MQU5HX0JlbGFydXNpYW5fQmVsYXJ1cyAweDA0MjMNCisjZGVmaW5lIEZYX0xBTkdfQmVuZ2FsaV9CYW5nbGFkZXNoIDB4MDg0NQ0KKyNkZWZpbmUgRlhfTEFOR19CZW5nYWxpX0luZGlhIDB4MDQ0NQ0KKyNkZWZpbmUgRlhfTEFOR19Cb3NuaWFfSGVyemVnb3ZpbmEgMHgxMDFhDQorI2RlZmluZSBGWF9MQU5HX0Jvc25pYW5fQ3lyaWxsaWMgMHgyMDFhDQorI2RlZmluZSBGWF9MQU5HX0Jvc25pYW5fTGF0aW4gMHgxNDFhDQorI2RlZmluZSBGWF9MQU5HX0JyZXRvbl9GcmFuY2UgMHgwNDdlDQorI2RlZmluZSBGWF9MQU5HX0J1bGdhcmlhbl9CdWxnYXJpYSAweDA0MDINCisjZGVmaW5lIEZYX0xBTkdfQnVybWVzZSAweDA0NTUNCisjZGVmaW5lIEZYX0xBTkdfQ2F0YWxhbl9DYXRhbGFuIDB4MDQwMw0KKyNkZWZpbmUgRlhfTEFOR19DaGVyb2tlZSAweDA0NWMNCisjZGVmaW5lIEZYX0xBTkdfQ2hpbmVzZV9Ib25nS29uZyAweDBjMDQNCisjZGVmaW5lIEZYX0xBTkdfQ2hpbmVzZV9NYWNhbyAweDE0MDQNCisjZGVmaW5lIEZYX0xBTkdfQ2hpbmVzZV9QUkMgMHgwODA0DQorI2RlZmluZSBGWF9MQU5HX0NoaW5lc2VfU2luZ2Fwb3JlIDB4MTAwNA0KKyNkZWZpbmUgRlhfTEFOR19DaGluZXNlX1RhaXdhbiAweDA0MDQNCisjZGVmaW5lIEZYX0xBTkdfQ29yc2ljYW5fRnJhbmNlIDB4MDQ4Mw0KKyNkZWZpbmUgRlhfTEFOR19Dcm9hdGlhbl9Dcm9hdGlhIDB4MDQxYQ0KKyNkZWZpbmUgRlhfTEFOR19Dcm9hdGlhbl9MYXRpbiAweDEwMWENCisjZGVmaW5lIEZYX0xBTkdfQ3VzdG9tQ3VycmVudCAweDBjMDANCisjZGVmaW5lIEZYX0xBTkdfQ3plY2hSZXB1YmxpYyAweDA0MDUNCisjZGVmaW5lIEZYX0xBTkdfRGFuaXNoX0Rlbm1hcmsgMHgwNDA2DQorI2RlZmluZSBGWF9MQU5HX0RhcmlfQWZnaGFuaXN0YW4gMHgwNDhjDQorI2RlZmluZSBGWF9MQU5HX0RpdmVoaV9NYWxkaXZlcyAweDA0NjUNCisjZGVmaW5lIEZYX0xBTkdfRHV0Y2hfQmVsZ2l1bSAweDA4MTMNCisjZGVmaW5lIEZYX0xBTkdfRHV0Y2hfTmV0aGVybGFuZHMgMHgwNDEzDQorI2RlZmluZSBGWF9MQU5HX0R1dGNoX1ByZWZlcnJlZCAweDAwMTMNCisjZGVmaW5lIEZYX0xBTkdfRHpvbmdraGEgMHgwODUxDQorI2RlZmluZSBGWF9MQU5HX0VkbyAweDA0NjYNCisjZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9BdXN0cmFsaWEgMHgwYzA5DQorI2RlZmluZSBGWF9MQU5HX0VuZ2xpc2hfQmVsaXplIDB4MjgwOQ0KKyNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX0NhbmFkYSAweDEwMDkNCisjZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9DYXJpYmJlYW4gMHgyNDA5DQorI2RlZmluZSBGWF9MQU5HX0VuZ2xpc2hfSG9uZ0tvbmcgMHgzYzA5DQorI2RlZmluZSBGWF9MQU5HX0VuZ2xpc2hfSW5kaWEgMHg0MDA5DQorI2RlZmluZSBGWF9MQU5HX0VuZ2xpc2hfSW5kb25lc2lhIDB4MzgwOQ0KKyNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX0lyZWxhbmQgMHgxODA5DQorI2RlZmluZSBGWF9MQU5HX0VuZ2xpc2hfSmFtYWljYSAweDIwMDkNCisjZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9NYWxheXNpYSAweDQ0MDkNCisjZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9OZXdaZWFsYW5kIDB4MTQwOQ0KKyNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX1BoaWxpcHBpbmVzIDB4MzQwOQ0KKyNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX1NpbmdhcG9yZSAweDQ4MDkNCisjZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9Tb3V0aEFmcmljYSAweDFjMDkNCisjZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9UcmluaWRhZFRvYmFnbyAweDJjMDkNCisjZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9Vbml0ZWRLaW5nZG9tIDB4MDgwOQ0KKyNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX1VuaXRlZFN0YXRlcyAweDA0MDkNCisjZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9aaW1iYWJ3ZSAweDMwMDkNCisjZGVmaW5lIEZYX0xBTkdfRXN0b25pYW5fRXN0b25pYSAweDA0MjUNCisjZGVmaW5lIEZYX0xBTkdfRmFyb2VzZV9GYXJvZUlzbGFuZHMgMHgwNDM4DQorI2RlZmluZSBGWF9MQU5HX0ZpbGlwaW5vX1BoaWxpcHBpbmVzIDB4MDQ2NA0KKyNkZWZpbmUgRlhfTEFOR19GaW5uaXNoX0ZpbmxhbmQgMHgwNDBiDQorI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9CZWxnaXVtIDB4MDgwYw0KKyNkZWZpbmUgRlhfTEFOR19GcmVuY2hfQ2FtZXJvb24gMHgyYzBjDQorI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9DYW5hZGEgMHgwYzBjDQorI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9Db25nb0RSQyAweDI0MGMNCisjZGVmaW5lIEZYX0xBTkdfRnJlbmNoX0NvdGVkSXZvaXJlIDB4MzAwYw0KKyNkZWZpbmUgRlhfTEFOR19GcmVuY2hfRnJhbmNlIDB4MDQwYw0KKyNkZWZpbmUgRlhfTEFOR19GcmVuY2hfSGFpdGkgMHgzYzBjDQorI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9MdXhlbWJvdXJnIDB4MTQwYw0KKyNkZWZpbmUgRlhfTEFOR19GcmVuY2hfTWFsaSAweDM0MGMNCisjZGVmaW5lIEZYX0xBTkdfRnJlbmNoX01vbmFjbyAweDE4MGMNCisjZGVmaW5lIEZYX0xBTkdfRnJlbmNoX01vcm9jY28gMHgzODBjDQorI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9SZXVuaW9uIDB4MjAwYw0KKyNkZWZpbmUgRlhfTEFOR19GcmVuY2hfU2VuZWdhbCAweDI4MGMNCisjZGVmaW5lIEZYX0xBTkdfRnJlbmNoX1N3aXR6ZXJsYW5kIDB4MTAwYw0KKyNkZWZpbmUgRlhfTEFOR19GcmVuY2hfV2VzdEluZGllcyAweDFjMGMNCisjZGVmaW5lIEZYX0xBTkdfRnJpc2lhbl9OZXRoZXJsYW5kcyAweDA0NjINCisjZGVmaW5lIEZYX0xBTkdfRnVsZnVsZGUgMHgwNDY3DQorI2RlZmluZSBGWF9MQU5HX0dhZWxpY19JcmVsYW5kIDB4MDgzYw0KKyNkZWZpbmUgRlhfTEFOR19HYWVsaWNfU2NvdGxhbmQgMHgwNDNjDQorI2RlZmluZSBGWF9MQU5HX0dhbGljaWFuX0dhbGljaWFuIDB4MDQ1Ng0KKyNkZWZpbmUgRlhfTEFOR19HZW9yZ2lhbl9HZW9yZ2lhIDB4MDQzNw0KKyNkZWZpbmUgRlhfTEFOR19HZXJtYW5fQXVzdHJpYSAweDBjMDcNCisjZGVmaW5lIEZYX0xBTkdfR2VybWFuX0dlcm1hbnkgMHgwNDA3DQorI2RlZmluZSBGWF9MQU5HX0dlcm1hbl9MaWVjaHRlbnN0ZWluIDB4MTQwNw0KKyNkZWZpbmUgRlhfTEFOR19HZXJtYW5fTHV4ZW1ib3VyZyAweDEwMDcNCisjZGVmaW5lIEZYX0xBTkdfR2VybWFuX1N3aXR6ZXJsYW5kIDB4MDgwNw0KKyNkZWZpbmUgRlhfTEFOR19HcmVla19HcmVlY2UgMHgwNDA4DQorI2RlZmluZSBGWF9MQU5HX0dyZWVubGFuZGljX0dyZWVubGFuZCAweDA0NmYNCisjZGVmaW5lIEZYX0xBTkdfR3VhcmFuaSAweDA0NzQNCisjZGVmaW5lIEZYX0xBTkdfR3VqYXJhdGlfSW5kaWEgMHgwNDQ3DQorI2RlZmluZSBGWF9MQU5HX0hhdXNhX0xhdGluTmlnZXJpYSAweDA0NjgNCisjZGVmaW5lIEZYX0xBTkdfSGF3YWlpYW4gMHgwNDc1DQorI2RlZmluZSBGWF9MQU5HX0hlYnJld19Jc3JhZWwgMHgwNDBkDQorI2RlZmluZSBGWF9MQU5HX0hpbmRpX0luZGlhIDB4MDQzOQ0KKyNkZWZpbmUgRlhfTEFOR19IdW5nYXJpYW5fSHVuZ2FyeSAweDA0MGUNCisjZGVmaW5lIEZYX0xBTkdfSWJpYmlvX05pZ2VyaWEgMHgwNDY5DQorI2RlZmluZSBGWF9MQU5HX0ljZWxhbmRpY19JY2VsYW5kIDB4MDQwZg0KKyNkZWZpbmUgRlhfTEFOR19JZ2JvX05pZ2VyaWEgMHgwNDcwDQorI2RlZmluZSBGWF9MQU5HX0luZG9uZXNpYW5fSW5kb25lc2lhIDB4MDQyMQ0KKyNkZWZpbmUgRlhfTEFOR19JbnVrdGl0dXRfTGF0aW5DYW5hZGEgMHgwODVkDQorI2RlZmluZSBGWF9MQU5HX0ludWt0aXR1dF9TeWxsYWJpY3NDYW5hZGEgMHgwNDVkDQorI2RlZmluZSBGWF9MQU5HX0lzaVhob3NhX1NvdXRoQWZyaWNhIDB4MDQzNA0KKyNkZWZpbmUgRlhfTEFOR19Jc2ladWx1X1NvdXRoQWZyaWNhIDB4MDQzNQ0KKyNkZWZpbmUgRlhfTEFOR19JdGFsaWFuX0l0YWx5IDB4MDQxMA0KKyNkZWZpbmUgRlhfTEFOR19JdGFsaWFuX1N3aXR6ZXJsYW5kIDB4MDgxMA0KKyNkZWZpbmUgRlhfTEFOR19KYXBhbmVzZV9KYXBhbiAweDA0MTENCisjZGVmaW5lIEZYX0xBTkdfS2FubmFkYV9JbmRpYSAweDA0NGINCisjZGVmaW5lIEZYX0xBTkdfS2FudXJpIDB4MDQ3MQ0KKyNkZWZpbmUgRlhfTEFOR19LYXNobWlyaSAweDA4NjANCisjZGVmaW5lIEZYX0xBTkdfS2FzaG1pcmlfQXJhYmljIDB4MDQ2MA0KKyNkZWZpbmUgRlhfTEFOR19LYXpha2hfS2F6YWtoc3RhbiAweDA0M2YNCisjZGVmaW5lIEZYX0xBTkdfS2htZXJfQ2FtYm9kaWEgMHgwNDUzDQorI2RlZmluZSBGWF9MQU5HX0tpY2hlX0d1YXRlbWFsYSAweDA0ODYNCisjZGVmaW5lIEZYX0xBTkdfS2lueWFyd2FuZGFfUndhbmRhIDB4MDQ4Nw0KKyNkZWZpbmUgRlhfTEFOR19LaXN3YWhpbGlfS2VueWEgMHgwNDQxDQorI2RlZmluZSBGWF9MQU5HX0tvbmthbmlfSW5kaWEgMHgwNDU3DQorI2RlZmluZSBGWF9MQU5HX0tvcmVhbl9Lb3JlYSAweDA0MTINCisjZGVmaW5lIEZYX0xBTkdfS3lyZ3l6X0t5cmd5enN0YW4gMHgwNDQwDQorI2RlZmluZSBGWF9MQU5HX0xhb19MYW9QRFIgMHgwNDU0DQorI2RlZmluZSBGWF9MQU5HX0xhdGluIDB4MDQ3Ng0KKyNkZWZpbmUgRlhfTEFOR19MYXR2aWFuX0xhdHZpYSAweDA0MjYNCisjZGVmaW5lIEZYX0xBTkdfTGl0aHVhbmlhbl9MaXRodWFuaWEgMHgwNDI3DQorI2RlZmluZSBGWF9MQU5HX0xpdGh1YW5pYW5UcmFkIDB4MDgyNw0KKyNkZWZpbmUgRlhfTEFOR19Mb3dlciBTb3JiaWFuX0dlcm1hbnkgMHgwODJlDQorI2RlZmluZSBGWF9MQU5HX0x1eGVtYm91cmdpc2hfTHV4ZW1ib3VyZyAweDA0NmUNCisjZGVmaW5lIEZYX0xBTkdfTWFjZWRvbmlhbiAweDA0MmYNCisjZGVmaW5lIEZYX0xBTkdfTWFsYXlfQnJ1bmVpRGFydXNzYWxhbSAweDA4M2UNCisjZGVmaW5lIEZYX0xBTkdfTWFsYXlfTWFsYXlzaWEgMHgwNDNlDQorI2RlZmluZSBGWF9MQU5HX01hbGF5YWxhbV9JbmRpYSAweDA0NGMNCisjZGVmaW5lIEZYX0xBTkdfTWFsZGl2aWFuIDB4MDQ2NQ0KKyNkZWZpbmUgRlhfTEFOR19NYWx0ZXNlX01hbHRhIDB4MDQzYQ0KKyNkZWZpbmUgRlhfTEFOR19NYW5pcHVyaSAweDA0NTgNCisjZGVmaW5lIEZYX0xBTkdfTWFvcmlfTmV3WmVhbGFuZCAweDA0ODENCisjZGVmaW5lIEZYX0xBTkdfTWFwdWR1bmd1bl9DaGlsZSAweDA0N2ENCisjZGVmaW5lIEZYX0xBTkdfTWFyYXRoaV9JbmRpYSAweDA0NGUNCisjZGVmaW5lIEZYX0xBTkdfTW9oYXdrX01vaGF3ayAweDA0N2MNCisjZGVmaW5lIEZYX0xBTkdfTW9uZ29saWFuX0N5cmlsbGljTW9uZ29saWEgMHgwNDUwDQorI2RlZmluZSBGWF9MQU5HX01vbmdvbGlhbl9UcmFkaXRpb25hbE1vbmdvbGlhbiAweDA4NTANCisjZGVmaW5lIEZYX0xBTkdfTmVwYWxpX0luZGlhIDB4MDg2MQ0KKyNkZWZpbmUgRlhfTEFOR19OZXBhbGlfTmVwYWwgMHgwNDYxDQorI2RlZmluZSBGWF9MQU5HX05vcndlZ2lhbl9Cb2ttYWwgMHgwNDE0DQorI2RlZmluZSBGWF9MQU5HX05vcndlZ2lhbl9OeW5vcnNrIDB4MDgxNA0KKyNkZWZpbmUgRlhfTEFOR19PY2NpdGFuX0ZyYW5jZSAweDA0ODINCisjZGVmaW5lIEZYX0xBTkdfT3JpeWFfSW5kaWEgMHgwNDQ4DQorI2RlZmluZSBGWF9MQU5HX09yb21vIDB4MDQ3Mg0KKyNkZWZpbmUgRlhfTEFOR19QYXBpYW1lbnR1IDB4MDQ3OQ0KKyNkZWZpbmUgRlhfTEFOR19QYXNodG9fQWZnaGFuaXN0YW4gMHgwNDYzDQorI2RlZmluZSBGWF9MQU5HX1BlcnNpYW4gMHgwNDI5DQorI2RlZmluZSBGWF9MQU5HX1BvbGlzaF9Qb2xhbmQgMHgwNDE1DQorI2RlZmluZSBGWF9MQU5HX1BvcnR1Z3Vlc2VfQnJhemlsIDB4MDQxNg0KKyNkZWZpbmUgRlhfTEFOR19Qb3J0dWd1ZXNlX1BvcnR1Z2FsIDB4MDgxNg0KKyNkZWZpbmUgRlhfTEFOR19QdW5qYWJpX0luZGlhIDB4MDQ0Ng0KKyNkZWZpbmUgRlhfTEFOR19QdW5qYWJpX1Bha2lzdGFuIDB4MDg0Ng0KKyNkZWZpbmUgRlhfTEFOR19RdWVjaHVhX0JvbGl2aWEgMHgwNDZiDQorI2RlZmluZSBGWF9MQU5HX1F1ZWNodWFfRWN1YWRvciAweDA4NmINCisjZGVmaW5lIEZYX0xBTkdfUXVlY2h1YV9QZXJ1IDB4MGM2Yg0KKyNkZWZpbmUgRlhfTEFOR19Sb21hbmlhbl9Nb2xkb3ZhIDB4MDgxOA0KKyNkZWZpbmUgRlhfTEFOR19Sb21hbmlhbl9Sb21hbmlhIDB4MDQxOA0KKyNkZWZpbmUgRlhfTEFOR19Sb21hbnNoX1N3aXR6ZXJsYW5kIDB4MDQxNw0KKyNkZWZpbmUgRlhfTEFOR19SdXNzaWFuX01vbGRvdmEgMHgwODE5DQorI2RlZmluZSBGWF9MQU5HX1J1c3NpYW5fUnVzc2lhIDB4MDQxOQ0KKyNkZWZpbmUgRlhfTEFOR19TYW1pX0luYXJpRmlubGFuZCAweDI0M2INCisjZGVmaW5lIEZYX0xBTkdfU2FtaV9MdWxlTm9yd2F5IDB4MTAzYg0KKyNkZWZpbmUgRlhfTEFOR19TYW1pX0x1bGVTd2VkZW4gMHgxNDNiDQorI2RlZmluZSBGWF9MQU5HX1NhbWlfTm9ydGhlcm5GaW5sYW5kIDB4MGMzYg0KKyNkZWZpbmUgRlhfTEFOR19TYW1pX05vcnRoZXJuTm9yd2F5IDB4MDQzYg0KKyNkZWZpbmUgRlhfTEFOR19TYW1pX05vcnRoZXJuU3dlZGVuIDB4MDgzYg0KKyNkZWZpbmUgRlhfTEFOR19TYW1pX1Nrb2x0RmlubGFuZCAweDIwM2INCisjZGVmaW5lIEZYX0xBTkdfU2FtaV9Tb3V0aGVybk5vcndheSAweDE4M2INCisjZGVmaW5lIEZYX0xBTkdfU2FtaV9Tb3V0aGVyblN3ZWRlbiAweDFjM2INCisjZGVmaW5lIEZYX0xBTkdfU2Fuc2tyaXRJbmRpYSAweDA0NGYNCisjZGVmaW5lIEZYX0xBTkdfU2VyYmlhbkN5cmlsbGljX0Jvc25pYUhlcnplZ292aW5hIDB4MWMxYQ0KKyNkZWZpbmUgRlhfTEFOR19TZXJiaWFuQ3lyaWxsaWNfU2VyYmlhIDB4MGMxYQ0KKyNkZWZpbmUgRlhfTEFOR19TZXJiaWFuTGF0aW5fQm9zbmlhSGVyemVnb3ZpbmEgMHgxODFhDQorI2RlZmluZSBGWF9MQU5HX1NlcmJpYW5MYXRpbl9TZXJiaWEgMHgwODFhDQorI2RlZmluZSBGWF9MQU5HX1Nlc290aG9TYUxlYm9hIDB4MDQ2Yw0KKyNkZWZpbmUgRlhfTEFOR19TZXRzd2FuYV9Tb3V0aEFmcmljYSAweDA0MzINCisjZGVmaW5lIEZYX0xBTkdfU2luZGhpX0FyYWJpYyAweDA4NTkNCisjZGVmaW5lIEZYX0xBTkdfU2luZGhpX0RldmFuYWdhcmkgMHgwNDU5DQorI2RlZmluZSBGWF9MQU5HX1NpbmhhbGFfU3JpTGFua2EgMHgwNDViDQorI2RlZmluZSBGWF9MQU5HX1Nsb3Zha19TbG92YWtpYSAweDA0MWINCisjZGVmaW5lIEZYX0xBTkdfU2xvdmVuaWFuX1Nsb3ZlbmlhIDB4MDQyNA0KKyNkZWZpbmUgRlhfTEFOR19Tb21hbGkgMHgwNDc3DQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfQXJnZW50aW5hIDB4MmMwYQ0KKyNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX0JvbGl2aWEgMHg0MDBhDQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfQ2hpbGUgMHgzNDBhDQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfQ29sb21iaWEgMHgyNDBhDQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfQ29zdGFSaWNhIDB4MTQwYQ0KKyNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX0RvbWluaWNhblJlcHVibGljIDB4MWMwYQ0KKyNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX0VjdWFkb3IgMHgzMDBhDQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfRWxTYWx2YWRvciAweDQ0MGENCisjZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9HdWF0ZW1hbGEgMHgxMDBhDQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfSG9uZHVyYXMgMHg0ODBhDQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfTWV4aWNvIDB4MDgwYQ0KKyNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX05pY2FyYWd1YSAweDRjMGENCisjZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9QYW5hbWEgMHgxODBhDQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfUGFyYWd1YXkgMHgzYzBhDQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfUGVydSAweDI4MGENCisjZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9QdWVydG9SaWNvIDB4NTAwYQ0KKyNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX0ludGVybmF0aW9uYWxTb3J0IDB4MGMwYQ0KKyNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX1RyYWRpdGlvbmFsU29ydCAweDA0MGENCisjZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9Vbml0ZWRTdGF0ZXMgMHg1NDBhDQorI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfVXJ1Z3VheSAweDM4MGENCisjZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9WZW5lenVlbGEgMHgyMDBhDQorI2RlZmluZSBGWF9MQU5HX1N1dHVfU291dGhBZnJpY2EgMHgwNDMwDQorI2RlZmluZSBGWF9MQU5HX1N3ZWRpc2hfRmlubGFuZCAweDA4MWQNCisjZGVmaW5lIEZYX0xBTkdfU3dlZGlzaF9Td2VkZW4gMHgwNDFkDQorI2RlZmluZSBGWF9MQU5HX1N5cmlhY19TeXJpYSAweDA0NWENCisjZGVmaW5lIEZYX0xBTkdfVGFqaWtfQ3lyaWxsaWNUYWppa2lzdGFuIDB4MDQyOA0KKyNkZWZpbmUgRlhfTEFOR19UYW1hemlnaHRfQXJhYmljTW9yb2NjbyAweDA0NWYNCisjZGVmaW5lIEZYX0xBTkdfVGFtYXppZ2h0X0xhdGluQWxnZXJpYSAweDA4NWYNCisjZGVmaW5lIEZYX0xBTkdfVGFtaWxfSW5kaWEgMHgwNDQ5DQorI2RlZmluZSBGWF9MQU5HX1RhdGFyX1J1c3NpYSAweDA0NDQNCisjZGVmaW5lIEZYX0xBTkdfVGVsdWd1X0luZGlhIDB4MDQ0YQ0KKyNkZWZpbmUgRlhfTEFOR19UaGFpX1RoYWlsYW5kIDB4MDQxZQ0KKyNkZWZpbmUgRlhfTEFOR19UaWJldGFuUFJDIDB4MDQ1MQ0KKyNkZWZpbmUgRlhfTEFOR19UaWdyaWduYV9Fcml0cmVhIDB4MDg3Mw0KKyNkZWZpbmUgRlhfTEFOR19UaWdyaWduYV9FdGhpb3BpYSAweDA0NzMNCisjZGVmaW5lIEZYX0xBTkdfVHNvbmdhIDB4MDQzMQ0KKyNkZWZpbmUgRlhfTEFOR19UdXJraXNoX1R1cmtleSAweDA0MWYNCisjZGVmaW5lIEZYX0xBTkdfVHVya21lbl9UdXJrbWVuaXN0YW4gMHgwNDQyDQorI2RlZmluZSBGWF9MQU5HX1VpZ2h1clBSQyAweDA0ODANCisjZGVmaW5lIEZYX0xBTkdfVWtyYWluaWFuX1VrcmFpbmUgMHgwNDIyDQorI2RlZmluZSBGWF9MQU5HX1VwcGVyU29yYmlhbl9HZXJtYW55IDB4MDQyZQ0KKyNkZWZpbmUgRlhfTEFOR19VcmR1X1Bha2lzdGFuIDB4MDQyMA0KKyNkZWZpbmUgRlhfTEFOR19VcmR1X0luZGlhIDB4MDgyMA0KKyNkZWZpbmUgRlhfTEFOR19VemJla19DeXJpbGxpY1V6YmVraXN0YW4gMHgwODQzDQorI2RlZmluZSBGWF9MQU5HX1V6YmVrX0xhdGluVXpiZWtpc3RhbiAweDA0NDMNCisjZGVmaW5lIEZYX0xBTkdfVmVuZGEgMHgwNDMzDQorI2RlZmluZSBGWF9MQU5HX1ZpZXRuYW1lc2VfVmlldG5hbSAweDA0MmENCisjZGVmaW5lIEZYX0xBTkdfV2Vsc2hfVW5pdGVkS2luZ2RvbSAweDA0NTINCisjZGVmaW5lIEZYX0xBTkdfV29sb2ZfU2VuZWdhbCAweDA0ODgNCisjZGVmaW5lIEZYX0xBTkdfWGhvc2EgMHgwNDM0DQorI2RlZmluZSBGWF9MQU5HX1lha3V0X1J1c3NpYSAweDA0ODUNCisjZGVmaW5lIEZYX0xBTkdfWWlQUkMgMHgwNDc4DQorI2RlZmluZSBGWF9MQU5HX1lpZGRpc2ggMHgwNDNkDQorI2RlZmluZSBGWF9MQU5HX1lvcnViYV9OaWdlcmlhIDB4MDQ2YQ0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2xvY2FsZS5oIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfbG9jYWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdhMmY5MQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X2xvY2FsZS5oCkBAIC0wLDAgKzEsMjAzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYX0xPQ0FMRV9IXw0KKyNkZWZpbmUgX0ZYX0xPQ0FMRV9IXw0KK2NsYXNzIENGWF9Vbml0aW1lOw0KK2NsYXNzIElGWF9Mb2NhbGU7DQorY2xhc3MgSUZYX0Zvcm1hdFN0cmluZzsNCitjbGFzcyBJRlhfTG9jYWxlTWdyOw0KK2VudW0gRlhfTE9DQUxFTlVNU1lNQk9MIHsNCisgIEZYX0xPQ0FMRU5VTVNZTUJPTF9EZWNpbWFsLA0KKyAgRlhfTE9DQUxFTlVNU1lNQk9MX0dyb3VwaW5nLA0KKyAgRlhfTE9DQUxFTlVNU1lNQk9MX1BlcmNlbnQsDQorICBGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMsDQorICBGWF9MT0NBTEVOVU1TWU1CT0xfWmVybywNCisgIEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbCwNCisgIEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeU5hbWUsDQorfTsNCitlbnVtIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgew0KKyAgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0LA0KKyAgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9TaG9ydCwNCisgIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtLA0KKyAgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9GdWxsLA0KKyAgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9Mb25nLA0KK307DQorZW51bSBGWF9MT0NBTEVOVU1TVUJDQVRFR09SWSB7DQorICBGWF9MT0NBTEVOVU1QQVRURVJOX1BlcmNlbnQsDQorICBGWF9MT0NBTEVOVU1QQVRURVJOX0N1cnJlbmN5LA0KKyAgRlhfTE9DQUxFTlVNUEFUVEVSTl9EZWNpbWFsLA0KKyAgRlhfTE9DQUxFTlVNUEFUVEVSTl9JbnRlZ2VyLA0KK307DQorZW51bSBGWF9MT0NBTEVDQVRFR09SWSB7DQorICBGWF9MT0NBTEVDQVRFR09SWV9Vbmtub3duLA0KKyAgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZSwNCisgIEZYX0xPQ0FMRUNBVEVHT1JZX1RpbWUsDQorICBGWF9MT0NBTEVDQVRFR09SWV9EYXRlVGltZSwNCisgIEZYX0xPQ0FMRUNBVEVHT1JZX051bSwNCisgIEZYX0xPQ0FMRUNBVEVHT1JZX1RleHQsDQorICBGWF9MT0NBTEVDQVRFR09SWV9aZXJvLA0KKyAgRlhfTE9DQUxFQ0FURUdPUllfTnVsbCwNCit9Ow0KK2VudW0gRlhfREFURVRJTUVUWVBFIHsNCisgIEZYX0RBVEVUSU1FVFlQRV9Vbmtub3duLA0KKyAgRlhfREFURVRJTUVUWVBFX0RhdGUsDQorICBGWF9EQVRFVElNRVRZUEVfVGltZSwNCisgIEZYX0RBVEVUSU1FVFlQRV9EYXRlVGltZSwNCisgIEZYX0RBVEVUSU1FVFlQRV9UaW1lRGF0ZSwNCit9Ow0KKw0KK2NsYXNzIElGWF9Mb2NhbGUgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZYX0xvY2FsZSogQ3JlYXRlKENYTUxfRWxlbWVudCogcExvY2FsZURhdGEpOw0KKw0KKyAgdmlydHVhbCB+SUZYX0xvY2FsZSgpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisNCisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0TmFtZSgpID0gMDsNCisNCisgIHZpcnR1YWwgdm9pZCBHZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0wgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTnVtU3ltYm9sKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0RGF0ZVRpbWVTeW1ib2xzKENGWF9XaWRlU3RyaW5nJiB3c0R0U3ltYm9sKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0TW9udGhOYW1lKGludDMyX3Qgbk1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NNb250aE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFiYnIgPSBUUlVFKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0RGF5TmFtZShpbnQzMl90IG5XZWVrLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF5TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFiYnIgPSBUUlVFKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0TWVyaWRpZW1OYW1lKENGWF9XaWRlU3RyaW5nJiB3c01lcmlkaWVtTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQU0gPSBUUlVFKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0VGltZVpvbmUoRlhfVElNRVpPTkUmIHR6KSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0RXJhTmFtZShDRlhfV2lkZVN0cmluZyYgd3NFcmFOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQUQgPSBUUlVFKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0RGF0ZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHZvaWQgR2V0TnVtUGF0dGVybihGWF9MT0NBTEVOVU1TVUJDQVRFR09SWSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0ID0gMDsNCit9Ow0KKw0KK2NsYXNzIElGWF9Mb2NhbGVNZ3Igew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRlhfTG9jYWxlTWdyKCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9XT1JEIEdldERlZkxvY2FsZUlEKCkgPSAwOw0KKyAgdmlydHVhbCBJRlhfTG9jYWxlKiBHZXREZWZMb2NhbGUoKSA9IDA7DQorICB2aXJ0dWFsIElGWF9Mb2NhbGUqIEdldExvY2FsZShGWF9XT1JEIGxjaWQpID0gMDsNCisgIHZpcnR1YWwgSUZYX0xvY2FsZSogR2V0TG9jYWxlQnlOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMb2NhbGVOYW1lKSA9IDA7DQorfTsNCitJRlhfTG9jYWxlTWdyKiBGWF9Mb2NhbGVNZ3JfQ3JlYXRlKGNvbnN0IEZYX1dDSEFSKiBwc3pMb2NhbFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdEZWZhdWx0TENJRCk7DQordm9pZCBGWF9QYXJzZU51bVN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NOdW0sIENGWF9XaWRlU3RyaW5nJiB3c1Jlc3VsdCk7DQorRlhfQk9PTCBGWF9EYXRlRnJvbUNhbm9uaWNhbChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1VuaXRpbWUmIGRhdGV0aW1lKTsNCitGWF9CT09MIEZYX1RpbWVGcm9tQ2Fub25pY2FsKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUaW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1VuaXRpbWUmIGRhdGV0aW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSk7DQorY2xhc3MgSUZYX0Zvcm1hdFN0cmluZyB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRlhfRm9ybWF0U3RyaW5nKiBDcmVhdGUoSUZYX0xvY2FsZU1nciogcExvY2FsZU1nciwgRlhfQk9PTCBiVXNlTENJRCk7DQorDQorICB2aXJ0dWFsIH5JRlhfRm9ybWF0U3RyaW5nKCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNwbGl0Rm9ybWF0U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdFN0cmluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0FycmF5JiB3c1BhdHRlcm5zKSA9IDA7DQorICB2aXJ0dWFsIEZYX0xPQ0FMRUNBVEVHT1JZIEdldENhdGVnb3J5KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pID0gMDsNCisgIHZpcnR1YWwgRlhfV09SRCBHZXRMQ0lEKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pID0gMDsNCisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0TG9jYWxlTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgUGFyc2VUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgUGFyc2VOdW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjTnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZWYWx1ZSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIFBhcnNlTnVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY051bSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgUGFyc2VEYXRlVGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNEYXRlVGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EQVRFVElNRVRZUEUgZURhdGVUaW1lVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Vbml0aW1lJiBkdFZhbHVlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgUGFyc2VaZXJvKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBQYXJzZU51bGwoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEZvcm1hdFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBGb3JtYXROdW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjTnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBGb3JtYXROdW0oRlhfRkxPQVQgZk51bSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgRm9ybWF0RGF0ZVRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjRGF0ZVRpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBGb3JtYXREYXRlVGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNEYXRlVGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EQVRFVElNRVRZUEUgZURhdGVUaW1lVHlwZSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEZvcm1hdERhdGVUaW1lKGNvbnN0IENGWF9Vbml0aW1lJiBkdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEZvcm1hdFplcm8oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEZvcm1hdE51bGwoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkgPSAwOw0KK307DQorY2xhc3MgQ0ZYX0RlY2ltYWwgew0KKyBwdWJsaWM6DQorICBDRlhfRGVjaW1hbCgpOw0KKyAgQ0ZYX0RlY2ltYWwodWludDMyX3QgdmFsKTsNCisgIENGWF9EZWNpbWFsKHVpbnQ2NF90IHZhbCk7DQorICBDRlhfRGVjaW1hbChpbnQzMl90IHZhbCk7DQorICBDRlhfRGVjaW1hbChpbnQ2NF90IHZhbCk7DQorICBDRlhfRGVjaW1hbChGWF9GTE9BVCB2YWwsIHVpbnQ4X3Qgc2NhbGUgPSAzKTsNCisgIENGWF9EZWNpbWFsKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKTsNCisgIENGWF9EZWNpbWFsKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKTsNCisgIG9wZXJhdG9yIENGWF9XaWRlU3RyaW5nKCkgY29uc3Q7DQorICBvcGVyYXRvciBkb3VibGUoKSBjb25zdDsNCisgIEZYX0JPT0wgb3BlcmF0b3I9PShjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdDsNCisgIEZYX0JPT0wgb3BlcmF0b3I8PShjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdDsNCisgIEZYX0JPT0wgb3BlcmF0b3I+PShjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdDsNCisgIEZYX0JPT0wgb3BlcmF0b3IhPShjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdDsNCisgIEZYX0JPT0wgb3BlcmF0b3I8KGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0Ow0KKyAgRlhfQk9PTCBvcGVyYXRvcj4oY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7DQorICBDRlhfRGVjaW1hbCBvcGVyYXRvcisoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7DQorICBDRlhfRGVjaW1hbCBvcGVyYXRvci0oY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7DQorICBDRlhfRGVjaW1hbCBvcGVyYXRvciooY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7DQorICBDRlhfRGVjaW1hbCBvcGVyYXRvci8oY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7DQorICBDRlhfRGVjaW1hbCBvcGVyYXRvciUoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7DQorICB2b2lkIFNldFNjYWxlKHVpbnQ4X3QgbmV3U2NhbGUpOw0KKyAgdWludDhfdCBHZXRTY2FsZSgpOw0KKyAgdm9pZCBTZXRBYnMoKTsNCisgIHZvaWQgU2V0TmVnYXRlKCk7DQorICB2b2lkIFNldEZsb29yKCk7DQorICB2b2lkIFNldENlaWxpbmcoKTsNCisgIHZvaWQgU2V0VHJ1bmNhdGUoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX0RlY2ltYWwodWludDMyX3QgaGksDQorICAgICAgICAgICAgICB1aW50MzJfdCBtaWQsDQorICAgICAgICAgICAgICB1aW50MzJfdCBsbywNCisgICAgICAgICAgICAgIEZYX0JPT0wgbmVnLA0KKyAgICAgICAgICAgICAgdWludDhfdCBzY2FsZSk7DQorICBpbmxpbmUgRlhfQk9PTCBJc05vdFplcm8oKSBjb25zdCB7IHJldHVybiBtX3VIaSB8fCBtX3VNaWQgfHwgbV91TG87IH0NCisgIGlubGluZSBpbnQ4X3QgQ29tcGFyZShjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdDsNCisgIGlubGluZSB2b2lkIFN3YXAoQ0ZYX0RlY2ltYWwmIHZhbCk7DQorICBpbmxpbmUgdm9pZCBGbG9vck9yQ2VpbChGWF9CT09MIGJGbG9vcik7DQorICBDRlhfRGVjaW1hbCBBZGRPck1pbnVzKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwsIEZYX0JPT0wgaXNBZGRpbmcpIGNvbnN0Ow0KKyAgQ0ZYX0RlY2ltYWwgTXVsdGlwbHkoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7DQorICBDRlhfRGVjaW1hbCBEaXZpZGUoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7DQorICBDRlhfRGVjaW1hbCBNb2R1bHVzKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0Ow0KKyAgdWludDMyX3QgbV91RmxhZ3M7DQorICB1aW50MzJfdCBtX3VIaTsNCisgIHVpbnQzMl90IG1fdUxvOw0KKyAgdWludDMyX3QgbV91TWlkOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfbWVtLmggYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9tZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTY1ZWE3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfbWVtLmgKQEAgLTAsMCArMSw1NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWF9NRU1PUlkNCisjZGVmaW5lIF9GWF9NRU1PUlkNCisNCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X21lbW9yeS5oIiAgLy8gRm9yIEZYX0FsbG9jKCkuDQorDQorY2xhc3MgSUZYX01FTUFsbG9jYXRvcjsNCitjbGFzcyBDRlhfVGFyZ2V0Ow0KK2VudW0gRlhfQUxMT0NUWVBFIHsNCisgIEZYX0FMTE9DVFlQRV9EZWZhdWx0ID0gMCwNCisgIEZYX0FMTE9DVFlQRV9TdGF0aWMsDQorICBGWF9BTExPQ1RZUEVfRml4ZWQsDQorICBGWF9BTExPQ1RZUEVfRHluYW1pYywNCit9Ow0KKw0KK2NsYXNzIElGWF9NRU1BbGxvY2F0b3Igew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JRlhfTUVNQWxsb2NhdG9yKCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkKiBBbGxvYyhzaXplX3Qgc2l6ZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEZyZWUodm9pZCogcEJsb2NrKSA9IDA7DQorICB2aXJ0dWFsIHNpemVfdCBHZXRCbG9ja1NpemUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHNpemVfdCBHZXREZWZDaHVua1NpemUoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIHNpemVfdCBTZXREZWZDaHVua1NpemUoc2l6ZV90IHNpemUpID0gMDsNCisgIHZpcnR1YWwgc2l6ZV90IEdldEN1cnJlbnREYXRhU2l6ZSgpIGNvbnN0ID0gMDsNCit9Ow0KKw0KK0lGWF9NRU1BbGxvY2F0b3IqIEZYX0NyZWF0ZUFsbG9jYXRvcihGWF9BTExPQ1RZUEUgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjaHVua1NpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBibG9ja1NpemUpOw0KK2NsYXNzIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5DRlhfVGFyZ2V0KCkge30NCisgIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSkgeyByZXR1cm4gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7IH0NCisgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqIHApIHsgRlhfRnJlZShwKTsgfQ0KKyAgdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCBzaXplLCBJRlhfTUVNQWxsb2NhdG9yKiBwQWxsb2NhdG9yKSB7DQorICAgIHJldHVybiBwQWxsb2NhdG9yLT5BbGxvYyhzaXplKTsNCisgIH0NCisgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqIHAsIElGWF9NRU1BbGxvY2F0b3IqIHBBbGxvY2F0b3IpIHsNCisgICAgcEFsbG9jYXRvci0+RnJlZShwKTsNCisgIH0NCisgIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSwgdm9pZCogcGxhY2UpIHsgcmV0dXJuIHBsYWNlOyB9DQorICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiBwLCB2b2lkKiBwbGFjZSkge30NCit9Ow0KKyNkZWZpbmUgRlhUQVJHRVRfTmV3V2l0aChfX2FsbG9jYXRvcl9fKSBuZXcgKF9fYWxsb2NhdG9yX18pDQorI2RlZmluZSBGWFRBUkdFVF9EZWxldGVXaXRoKF9fY2xhc3NfXywgX19hbGxvY2F0b3JfXywgcG9pbnRlcikgXA0KKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgKHBvaW50ZXIpLT5+X19jbGFzc19fKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgIChwb2ludGVyKS0+b3BlcmF0b3IgZGVsZXRlKChwb2ludGVyKSwgKF9fYWxsb2NhdG9yX18pKTsgICAgXA0KKyAgfQ0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3Jiay5oIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfcmJrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ1ZThlNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3Jiay5oCkBAIC0wLDAgKzEsMjI4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYX1JURkJSRUFLDQorI2RlZmluZSBfRlhfUlRGQlJFQUsNCitjbGFzcyBJRlhfVW5rbm93bjsNCitjbGFzcyBJRlhfRm9udDsNCitjbGFzcyBDRlhfQ2hhcjsNCitjbGFzcyBDRlhfUlRGQ2hhcjsNCitjbGFzcyBDRlhfUlRGQnJlYWtQaWVjZTsNCitjbGFzcyBJRlhfUlRGQnJlYWs7DQorI2RlZmluZSBGWF9SVEZCUkVBS1BPTElDWV9Ob25lIDB4MDANCisjZGVmaW5lIEZYX1JURkJSRUFLUE9MSUNZX1NwYWNlQnJlYWsgMHgwMQ0KKyNkZWZpbmUgRlhfUlRGQlJFQUtQT0xJQ1lfTnVtYmVyQnJlYWsgMHgwMg0KKyNkZWZpbmUgRlhfUlRGQlJFQUtQT0xJQ1lfSW5maXhCcmVhayAweDA0DQorI2RlZmluZSBGWF9SVEZCUkVBS1BPTElDWV9UYWJCcmVhayAweDA4DQorI2RlZmluZSBGWF9SVEZCUkVBS1BPTElDWV9PcnBoYW5Qb3NpdGlvbmVkVGFiIDB4MTANCisjZGVmaW5lIEZYX1JURkJSRUFLX05vbmUgMHgwMA0KKyNkZWZpbmUgRlhfUlRGQlJFQUtfUGllY2VCcmVhayAweDAxDQorI2RlZmluZSBGWF9SVEZCUkVBS19MaW5lQnJlYWsgMHgwMg0KKyNkZWZpbmUgRlhfUlRGQlJFQUtfUGFyYWdyYXBoQnJlYWsgMHgwMw0KKyNkZWZpbmUgRlhfUlRGQlJFQUtfUGFnZUJyZWFrIDB4MDQNCisjZGVmaW5lIEZYX1JURkxBWU9VVFNUWUxFX1BhZ2luYXRpb24gMHgwMQ0KKyNkZWZpbmUgRlhfUlRGTEFZT1VUU1RZTEVfVmVydGljYWxMYXlvdXQgMHgwMg0KKyNkZWZpbmUgRlhfUlRGTEFZT1VUU1RZTEVfVmVydGljYWxDaGFycyAweDA0DQorI2RlZmluZSBGWF9SVEZMQVlPVVRTVFlMRV9MaW5lRGlyZWN0aW9uIDB4MDgNCisjZGVmaW5lIEZYX1JURkxBWU9VVFNUWUxFX0V4cGFuZFRhYiAweDEwDQorI2RlZmluZSBGWF9SVEZMQVlPVVRTVFlMRV9BcmFiaWNOdW1iZXIgMHgyMA0KKyNkZWZpbmUgRlhfUlRGTEFZT1VUU1RZTEVfU2luZ2xlTGluZSAweDQwDQorI2RlZmluZSBGWF9SVEZMQVlPVVRTVFlMRV9NQkNTQ29kZSAweDgwDQorI2RlZmluZSBGWF9SVEZDSEFSU1RZTEVfQWxpZ25tZW50IDB4MDAwRg0KKyNkZWZpbmUgRlhfUlRGQ0hBUlNUWUxFX0FyYWJpY051bWJlciAweDAwMTANCisjZGVmaW5lIEZYX1JURkNIQVJTVFlMRV9BcmFiaWNTaGFkZGEgMHgwMDIwDQorI2RlZmluZSBGWF9SVEZDSEFSU1RZTEVfT2RkQmlkaUxldmVsIDB4MDA0MA0KKyNkZWZpbmUgRlhfUlRGQ0hBUlNUWUxFX1JUTFJlYWRpbmdPcmRlciAweDAwODANCisjZGVmaW5lIEZYX1JURkNIQVJTVFlMRV9BcmFiaWNDb250ZXh0IDB4MDMwMA0KKyNkZWZpbmUgRlhfUlRGQ0hBUlNUWUxFX0FyYWJpY0luZGljIDB4MDQwMA0KKyNkZWZpbmUgRlhfUlRGQ0hBUlNUWUxFX0FyYWJpY0NvbW1hIDB4MDgwMA0KKyNkZWZpbmUgRlhfUlRGTElORUFMSUdOTUVOVF9MZWZ0IDANCisjZGVmaW5lIEZYX1JURkxJTkVBTElHTk1FTlRfQ2VudGVyIDENCisjZGVmaW5lIEZYX1JURkxJTkVBTElHTk1FTlRfUmlnaHQgMg0KKyNkZWZpbmUgRlhfUlRGTElORUFMSUdOTUVOVF9KdXN0aWZpZWQgKDEgPDwgMikNCisjZGVmaW5lIEZYX1JURkxJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWQgKDIgPDwgMikNCisjZGVmaW5lIEZYX1JURkxJTkVBTElHTk1FTlRfSnVzdGlmaWVkTGVmdCBcDQorICAoRlhfUlRGTElORUFMSUdOTUVOVF9MZWZ0IHwgRlhfUlRGTElORUFMSUdOTUVOVF9KdXN0aWZpZWQpDQorI2RlZmluZSBGWF9SVEZMSU5FQUxJR05NRU5UX0p1c3RpZmllZENlbnRlciBcDQorICAoRlhfUlRGTElORUFMSUdOTUVOVF9DZW50ZXIgfCBGWF9SVEZMSU5FQUxJR05NRU5UX0p1c3RpZmllZCkNCisjZGVmaW5lIEZYX1JURkxJTkVBTElHTk1FTlRfSnVzdGlmaWVkUmlnaHQgXA0KKyAgKEZYX1JURkxJTkVBTElHTk1FTlRfUmlnaHQgfCBGWF9SVEZMSU5FQUxJR05NRU5UX0p1c3RpZmllZCkNCisjZGVmaW5lIEZYX1JURkxJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWRMZWZ0IFwNCisgIChGWF9SVEZMSU5FQUxJR05NRU5UX0xlZnQgfCBGWF9SVEZMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkKQ0KKyNkZWZpbmUgRlhfUlRGTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZENlbnRlciBcDQorICAoRlhfUlRGTElORUFMSUdOTUVOVF9DZW50ZXIgfCBGWF9SVEZMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkKQ0KKyNkZWZpbmUgRlhfUlRGTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZFJpZ2h0IFwNCisgIChGWF9SVEZMSU5FQUxJR05NRU5UX1JpZ2h0IHwgRlhfUlRGTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZCkNCisjZGVmaW5lIEZYX1JURkxJTkVBTElHTk1FTlRfTG93ZXJNYXNrIDB4MDMNCisjZGVmaW5lIEZYX1JURkxJTkVBTElHTk1FTlRfSGlnaGVyTWFzayAweDBDDQordHlwZWRlZiBzdHJ1Y3QgX0ZYX1JURlRFWFRPQkogew0KKyAgX0ZYX1JURlRFWFRPQkooKSB7DQorICAgIHBTdHIgPSBOVUxMOw0KKyAgICBwV2lkdGhzID0gTlVMTDsNCisgICAgaUxlbmd0aCA9IDA7DQorICAgIHBGb250ID0gTlVMTDsNCisgICAgZkZvbnRTaXplID0gMTIuMGY7DQorICAgIGR3TGF5b3V0U3R5bGVzID0gMDsNCisgICAgaUNoYXJSb3RhdGlvbiA9IDA7DQorICAgIGlCaWRpTGV2ZWwgPSAwOw0KKyAgICBwUmVjdCA9IE5VTEw7DQorICAgIHdMaW5lQnJlYWtDaGFyID0gTCdcbic7DQorICAgIGlIb3Jpem9udGFsU2NhbGUgPSAxMDA7DQorICAgIGlWZXJ0aWNhbFNjYWxlID0gMTAwOw0KKyAgfQ0KKyAgY29uc3QgRlhfV0NIQVIqIHBTdHI7DQorICBpbnQzMl90KiBwV2lkdGhzOw0KKyAgaW50MzJfdCBpTGVuZ3RoOw0KKyAgSUZYX0ZvbnQqIHBGb250Ow0KKyAgRlhfRkxPQVQgZkZvbnRTaXplOw0KKyAgRlhfRFdPUkQgZHdMYXlvdXRTdHlsZXM7DQorICBpbnQzMl90IGlDaGFyUm90YXRpb247DQorICBpbnQzMl90IGlCaWRpTGV2ZWw7DQorICBGWF9MUENSRUNURiBwUmVjdDsNCisgIEZYX1dDSEFSIHdMaW5lQnJlYWtDaGFyOw0KKyAgaW50MzJfdCBpSG9yaXpvbnRhbFNjYWxlOw0KKyAgaW50MzJfdCBpVmVydGljYWxTY2FsZTsNCit9IEZYX1JURlRFWFRPQkosICpGWF9MUFJURlRFWFRPQko7DQordHlwZWRlZiBGWF9SVEZURVhUT0JKIGNvbnN0KiBGWF9MUENSVEZURVhUT0JKOw0KK2NsYXNzIENGWF9SVEZQaWVjZSA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZYX1JURlBpZWNlKCkNCisgICAgICA6IG1fZHdTdGF0dXMoRlhfUlRGQlJFQUtfUGllY2VCcmVhayksDQorICAgICAgICBtX2lTdGFydFBvcygwKSwNCisgICAgICAgIG1faVdpZHRoKC0xKSwNCisgICAgICAgIG1faVN0YXJ0Q2hhcigwKSwNCisgICAgICAgIG1faUNoYXJzKDApLA0KKyAgICAgICAgbV9pQmlkaUxldmVsKDApLA0KKyAgICAgICAgbV9pQmlkaVBvcygwKSwNCisgICAgICAgIG1faUZvbnRTaXplKDApLA0KKyAgICAgICAgbV9pRm9udEhlaWdodCgwKSwNCisgICAgICAgIG1faUhvcml6b250YWxTY2FsZSgxMDApLA0KKyAgICAgICAgbV9pVmVydGljYWxTY2FsZSgxMDApLA0KKyAgICAgICAgbV9kd0xheW91dFN0eWxlcygwKSwNCisgICAgICAgIG1fZHdJZGVudGl0eSgwKSwNCisgICAgICAgIG1fcENoYXJzKE5VTEwpLA0KKyAgICAgICAgbV9wVXNlckRhdGEoTlVMTCkge30NCisgIH5DRlhfUlRGUGllY2UoKSB7IFJlc2V0KCk7IH0NCisgIHZvaWQgQXBwZW5kQ2hhcihjb25zdCBDRlhfUlRGQ2hhciYgdGMpIHsNCisgICAgRlhTWVNfYXNzZXJ0KG1fcENoYXJzICE9IE5VTEwpOw0KKyAgICBtX3BDaGFycy0+QWRkKHRjKTsNCisgICAgaWYgKG1faVdpZHRoIDwgMCkgew0KKyAgICAgIG1faVdpZHRoID0gdGMubV9pQ2hhcldpZHRoOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG1faVdpZHRoICs9IHRjLm1faUNoYXJXaWR0aDsNCisgICAgfQ0KKyAgICBtX2lDaGFycysrOw0KKyAgfQ0KKyAgaW50MzJfdCBHZXRFbmRQb3MoKSBjb25zdCB7DQorICAgIHJldHVybiBtX2lXaWR0aCA8IDAgPyBtX2lTdGFydFBvcyA6IG1faVN0YXJ0UG9zICsgbV9pV2lkdGg7DQorICB9DQorICBpbnQzMl90IEdldExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1faUNoYXJzOyB9DQorICBpbnQzMl90IEdldEVuZENoYXIoKSBjb25zdCB7IHJldHVybiBtX2lTdGFydENoYXIgKyBtX2lDaGFyczsgfQ0KKyAgQ0ZYX1JURkNoYXImIEdldENoYXIoaW50MzJfdCBpbmRleCkgew0KKyAgICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSAmJiBpbmRleCA8IG1faUNoYXJzICYmIG1fcENoYXJzICE9IE5VTEwpOw0KKyAgICByZXR1cm4gKm1fcENoYXJzLT5HZXREYXRhUHRyKG1faVN0YXJ0Q2hhciArIGluZGV4KTsNCisgIH0NCisgIENGWF9SVEZDaGFyKiBHZXRDaGFyUHRyKGludDMyX3QgaW5kZXgpIGNvbnN0IHsNCisgICAgRlhTWVNfYXNzZXJ0KGluZGV4ID4gLTEgJiYgaW5kZXggPCBtX2lDaGFycyAmJiBtX3BDaGFycyAhPSBOVUxMKTsNCisgICAgcmV0dXJuIG1fcENoYXJzLT5HZXREYXRhUHRyKG1faVN0YXJ0Q2hhciArIGluZGV4KTsNCisgIH0NCisgIHZvaWQgR2V0U3RyaW5nKEZYX1dDSEFSKiBwVGV4dCkgY29uc3Qgew0KKyAgICBGWFNZU19hc3NlcnQocFRleHQgIT0gTlVMTCk7DQorICAgIGludDMyX3QgaUVuZENoYXIgPSBtX2lTdGFydENoYXIgKyBtX2lDaGFyczsNCisgICAgQ0ZYX1JURkNoYXIqIHBDaGFyOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IG1faVN0YXJ0Q2hhcjsgaSA8IGlFbmRDaGFyOyBpKyspIHsNCisgICAgICBwQ2hhciA9IG1fcENoYXJzLT5HZXREYXRhUHRyKGkpOw0KKyAgICAgICpwVGV4dCsrID0gKEZYX1dDSEFSKXBDaGFyLT5tX3dDaGFyQ29kZTsNCisgICAgfQ0KKyAgfQ0KKyAgdm9pZCBHZXRTdHJpbmcoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgY29uc3Qgew0KKyAgICBGWF9XQ0hBUiogcFRleHQgPSB3c1RleHQuR2V0QnVmZmVyKG1faUNoYXJzKTsNCisgICAgR2V0U3RyaW5nKHBUZXh0KTsNCisgICAgd3NUZXh0LlJlbGVhc2VCdWZmZXIobV9pQ2hhcnMpOw0KKyAgfQ0KKyAgdm9pZCBHZXRXaWR0aHMoaW50MzJfdCogcFdpZHRocykgY29uc3Qgew0KKyAgICBGWFNZU19hc3NlcnQocFdpZHRocyAhPSBOVUxMKTsNCisgICAgaW50MzJfdCBpRW5kQ2hhciA9IG1faVN0YXJ0Q2hhciArIG1faUNoYXJzOw0KKyAgICBDRlhfUlRGQ2hhciogcENoYXI7DQorICAgIGZvciAoaW50MzJfdCBpID0gbV9pU3RhcnRDaGFyOyBpIDwgaUVuZENoYXI7IGkrKykgew0KKyAgICAgIHBDaGFyID0gbV9wQ2hhcnMtPkdldERhdGFQdHIoaSk7DQorICAgICAgKnBXaWR0aHMrKyA9IHBDaGFyLT5tX2lDaGFyV2lkdGg7DQorICAgIH0NCisgIH0NCisgIHZvaWQgUmVzZXQoKSB7DQorICAgIG1fZHdTdGF0dXMgPSBGWF9SVEZCUkVBS19QaWVjZUJyZWFrOw0KKyAgICBpZiAobV9pV2lkdGggPiAtMSkgew0KKyAgICAgIG1faVN0YXJ0UG9zICs9IG1faVdpZHRoOw0KKyAgICB9DQorICAgIG1faVdpZHRoID0gLTE7DQorICAgIG1faVN0YXJ0Q2hhciArPSBtX2lDaGFyczsNCisgICAgbV9pQ2hhcnMgPSAwOw0KKyAgICBtX2lCaWRpTGV2ZWwgPSAwOw0KKyAgICBtX2lCaWRpUG9zID0gMDsNCisgICAgbV9pSG9yaXpvbnRhbFNjYWxlID0gMTAwOw0KKyAgICBtX2lWZXJ0aWNhbFNjYWxlID0gMTAwOw0KKyAgfQ0KKyAgRlhfRFdPUkQgbV9kd1N0YXR1czsNCisgIGludDMyX3QgbV9pU3RhcnRQb3M7DQorICBpbnQzMl90IG1faVdpZHRoOw0KKyAgaW50MzJfdCBtX2lTdGFydENoYXI7DQorICBpbnQzMl90IG1faUNoYXJzOw0KKyAgaW50MzJfdCBtX2lCaWRpTGV2ZWw7DQorICBpbnQzMl90IG1faUJpZGlQb3M7DQorICBpbnQzMl90IG1faUZvbnRTaXplOw0KKyAgaW50MzJfdCBtX2lGb250SGVpZ2h0Ow0KKyAgaW50MzJfdCBtX2lIb3Jpem9udGFsU2NhbGU7DQorICBpbnQzMl90IG1faVZlcnRpY2FsU2NhbGU7DQorICBGWF9EV09SRCBtX2R3TGF5b3V0U3R5bGVzOw0KKyAgRlhfRFdPUkQgbV9kd0lkZW50aXR5Ow0KKyAgQ0ZYX1JURkNoYXJBcnJheSogbV9wQ2hhcnM7DQorICBJRlhfVW5rbm93biogbV9wVXNlckRhdGE7DQorfTsNCit0eXBlZGVmIENGWF9CYXNlQXJyYXlUZW1wbGF0ZTxDRlhfUlRGUGllY2U+IENGWF9SVEZQaWVjZUFycmF5Ow0KK2NsYXNzIElGWF9SVEZCcmVhayB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRlhfUlRGQnJlYWsqIENyZWF0ZShGWF9EV09SRCBkd1BvbGljaWVzKTsNCisgIHZpcnR1YWwgfklGWF9SVEZCcmVhaygpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRMaW5lQm91bmRhcnkoRlhfRkxPQVQgZkxpbmVTdGFydCwgRlhfRkxPQVQgZkxpbmVFbmQpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRMaW5lU3RhcnRQb3MoRlhfRkxPQVQgZkxpbmVQb3MpID0gMDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0TGF5b3V0U3R5bGVzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldExheW91dFN0eWxlcyhGWF9EV09SRCBkd0xheW91dFN0eWxlcykgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEZvbnQoSUZYX0ZvbnQqIHBGb250KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0VGFiV2lkdGgoRlhfRkxPQVQgZlRhYldpZHRoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgQWRkUG9zaXRpb25lZFRhYihGWF9GTE9BVCBmVGFiUG9zKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0UG9zaXRpb25lZFRhYnMoY29uc3QgQ0ZYX0Zsb2F0QXJyYXkmIHRhYnMpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBDbGVhclBvc2l0aW9uZWRUYWJzKCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldERlZmF1bHRDaGFyKEZYX1dDSEFSIHdjaCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldExpbmVCcmVha0NoYXIoRlhfV0NIQVIgd2NoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0TGluZUJyZWFrVG9sZXJhbmNlKEZYX0ZMT0FUIGZUb2xlcmFuY2UpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRIb3Jpem9udGFsU2NhbGUoaW50MzJfdCBpU2NhbGUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRWZXJ0aWNhbFNjYWxlKGludDMyX3QgaVNjYWxlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q2hhclJvdGF0aW9uKGludDMyX3QgaUNoYXJSb3RhdGlvbikgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0V29yZFNwYWNlKEZYX0JPT0wgYkRlZmF1bHQsIEZYX0ZMT0FUIGZXb3JkU3BhY2UpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRSZWFkaW5nT3JkZXIoRlhfQk9PTCBiUlRMID0gRkFMU0UpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRBbGlnbm1lbnQoaW50MzJfdCBpQWxpZ25tZW50ID0gRlhfUlRGTElORUFMSUdOTUVOVF9MZWZ0KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0VXNlckRhdGEoSUZYX1Vua25vd24qIHBVc2VyRGF0YSkgPSAwOw0KKyAgdmlydHVhbCBGWF9EV09SRCBBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCkgPSAwOw0KKyAgdmlydHVhbCBGWF9EV09SRCBFbmRCcmVhayhGWF9EV09SRCBkd1N0YXR1cyA9IEZYX1JURkJSRUFLX1BpZWNlQnJlYWspID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudEJyZWFrUGllY2VzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBjb25zdCBDRlhfUlRGUGllY2UqIEdldEJyZWFrUGllY2UoaW50MzJfdCBpbmRleCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldExpbmVSZWN0KENGWF9SZWN0RiYgcmVjdCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIENsZWFyQnJlYWtQaWVjZXMoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgUmVzZXQoKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0RGlzcGxheVBvcygNCisgICAgICBGWF9MUENSVEZURVhUT0JKIHBUZXh0LA0KKyAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywNCisgICAgICBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFLA0KKyAgICAgIENGWF9XaWRlU3RyaW5nKiBwV1NGb3JtcyA9IE5VTEwsDQorICAgICAgRlhfQWRqdXN0Q2hhckRpc3BsYXlQb3MgcEFkanVzdFBvcyA9IE5VTEwpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDaGFyUmVjdHMoRlhfTFBDUlRGVEVYVE9CSiBwVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGQXJyYXkmIHJ0QXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJCQm94ID0gRkFMU0UpIGNvbnN0ID0gMDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3NheC5oIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfc2F4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ5NDM1NAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3NheC5oCkBAIC0wLDAgKzEsNjMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhfU0FYXw0KKyNkZWZpbmUgX0ZYX1NBWF8NCitjbGFzcyBJRlhfU0FYUmVhZGVySGFuZGxlcjsNCitjbGFzcyBJRlhfU0FYUmVhZGVyOw0KKyNkZWZpbmUgRlhfU0FYUEFSU0VNT0RFX05vdENvbnZlcnRfYW1wIDB4MDAwMQ0KKyNkZWZpbmUgRlhfU0FYUEFSU0VNT0RFX05vdENvbnZlcnRfbHQgMHgwMDAyDQorI2RlZmluZSBGWF9TQVhQQVJTRU1PREVfTm90Q29udmVydF9ndCAweDAwMDQNCisjZGVmaW5lIEZYX1NBWFBBUlNFTU9ERV9Ob3RDb252ZXJ0X2Fwb3MgMHgwMDA4DQorI2RlZmluZSBGWF9TQVhQQVJTRU1PREVfTm90Q29udmVydF9xdW90IDB4MDAxMA0KKyNkZWZpbmUgRlhfU0FYUEFSU0VNT0RFX05vdENvbnZlcnRfc2hhcnAgMHgwMDIwDQorI2RlZmluZSBGWF9TQVhQQVJTRU1PREVfTm90U2tpcFNwYWNlIDB4MDEwMA0KK2VudW0gRlhfU0FYTk9ERSB7DQorICBGWF9TQVhOT0RFX1Vua25vd24gPSAwLA0KKyAgRlhfU0FYTk9ERV9JbnN0cnVjdGlvbiwNCisgIEZYX1NBWE5PREVfRGVjbGFyYXRpb24sDQorICBGWF9TQVhOT0RFX0NvbW1lbnQsDQorICBGWF9TQVhOT0RFX1RhZywNCisgIEZYX1NBWE5PREVfVGV4dCwNCisgIEZYX1NBWE5PREVfQ2hhckRhdGEsDQorfTsNCitjbGFzcyBJRlhfU0FYUmVhZGVySGFuZGxlciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGWF9TQVhSZWFkZXJIYW5kbGVyKCkge30NCisgIHZpcnR1YWwgdm9pZCogT25UYWdFbnRlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzVGFnTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TQVhOT0RFIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhcnRQb3MpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBPblRhZ0F0dHJpYnV0ZSh2b2lkKiBwVGFnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNBdHRyaSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzVmFsdWUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBPblRhZ0JyZWFrKHZvaWQqIHBUYWcpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBPblRhZ0RhdGEodm9pZCogcFRhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfU0FYTk9ERSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhcnRQb3MpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBPblRhZ0Nsb3NlKHZvaWQqIHBUYWcsIEZYX0RXT1JEIGR3RW5kUG9zKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgT25UYWdFbmQodm9pZCogcFRhZywNCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzVGFnTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0VuZFBvcykgPSAwOw0KKyAgdmlydHVhbCB2b2lkIE9uVGFyZ2V0RGF0YSh2b2lkKiBwVGFnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TQVhOT0RFIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGFydFBvcykgPSAwOw0KK307DQorY2xhc3MgSUZYX1NBWFJlYWRlciB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGWF9TQVhSZWFkZXIoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgU3RhcnRQYXJzZShJRlhfRmlsZVJlYWQqIHBGaWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGFydCA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0xlbiA9IC0xLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQYXJzZU1vZGUgPSAwKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgQ29udGludWVQYXJzZShJRlhfUGF1c2UqIHBQYXVzZSA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTa2lwQ3VycmVudE5vZGUoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0SGFuZGxlcihJRlhfU0FYUmVhZGVySGFuZGxlciogcEhhbmRsZXIpID0gMDsNCit9Ow0KK0lGWF9TQVhSZWFkZXIqIEZYX1NBWFJlYWRlcl9DcmVhdGUoKTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9zdG0uaCBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3N0bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NDIyYjAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9zdG0uaApAQCAtMCwwICsxLDcyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYX1NUUkVBTQ0KKyNkZWZpbmUgX0ZYX1NUUkVBTQ0KK2NsYXNzIElGWF9TdHJlYW07DQorSUZYX0ZpbGVSZWFkKiBGWF9DcmVhdGVGaWxlUmVhZChJRlhfU3RyZWFtKiBwQmFzZVN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlbGVhc2VTdHJlYW0gPSBGQUxTRSk7DQorSUZYX0ZpbGVSZWFkKiBGWF9DcmVhdGVGaWxlUmVhZChJRlhfQnVmZmVyUmVhZCogcEJ1ZmZlclJlYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBpRmlsZVNpemUgPSAtMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlbGVhc2VTdHJlYW0gPSBUUlVFKTsNCitJRlhfRmlsZVdyaXRlKiBGWF9DcmVhdGVGaWxlV3JpdGUoSUZYX1N0cmVhbSogcEJhc2VTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlbGVhc2VTdHJlYW0gPSBGQUxTRSk7DQorZW51bSBGWF9TVFJFQU1BQ0NFU1Mgew0KKyAgRlhfU1RSRUFNQUNDRVNTX0JpbmFyeSA9IDB4MDAsDQorICBGWF9TVFJFQU1BQ0NFU1NfVGV4dCA9IDB4MDEsDQorICBGWF9TVFJFQU1BQ0NFU1NfUmVhZCA9IDB4MDIsDQorICBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUgPSAweDA0LA0KKyAgRlhfU1RSRUFNQUNDRVNTX1RydW5jYXRlID0gMHgxMCwNCisgIEZYX1NUUkVBTUFDQ0VTU19BcHBlbmQgPSAweDIwLA0KKyAgRlhfU1RSRUFNQUNDRVNTX0NyZWF0ZSA9IDB4ODAsDQorfTsNCitlbnVtIEZYX1NUUkVBTVNFRUsgew0KKyAgRlhfU1RSRUFNU0VFS19CZWdpbiA9IDAsDQorICBGWF9TVFJFQU1TRUVLX0N1cnJlbnQsDQorICBGWF9TVFJFQU1TRUVLX0VuZCwNCit9Ow0KK2NsYXNzIElGWF9TdHJlYW0gew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZYX1N0cmVhbSogQ3JlYXRlU3RyZWFtKElGWF9GaWxlUmVhZCogcEZpbGVSZWFkLCBGWF9EV09SRCBkd0FjY2Vzcyk7DQorICBzdGF0aWMgSUZYX1N0cmVhbSogQ3JlYXRlU3RyZWFtKElGWF9GaWxlV3JpdGUqIHBGaWxlV3JpdGUsIEZYX0RXT1JEIGR3QWNjZXNzKTsNCisgIHN0YXRpYyBJRlhfU3RyZWFtKiBDcmVhdGVTdHJlYW0oY29uc3QgRlhfV0NIQVIqIHBzekZpbGVOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0FjY2Vzcyk7DQorICBzdGF0aWMgSUZYX1N0cmVhbSogQ3JlYXRlU3RyZWFtKHVpbnQ4X3QqIHBEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdBY2Nlc3MpOw0KKyAgc3RhdGljIElGWF9TdHJlYW0qIENyZWF0ZVN0cmVhbShJRlhfQnVmZmVyUmVhZCogcEJ1ZmZlclJlYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3QWNjZXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlGaWxlU2l6ZSA9IC0xLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZWxlYXNlQnVmZmVyUmVhZCA9IFRSVUUpOw0KKyAgc3RhdGljIElGWF9TdHJlYW0qIENyZWF0ZVRleHRTdHJlYW0oSUZYX1N0cmVhbSogcEJhc2VTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEZWxldGVPblJlbGVhc2UpOw0KKyAgdmlydHVhbCB+SUZYX1N0cmVhbSgpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisgIHZpcnR1YWwgSUZYX1N0cmVhbSogUmV0YWluKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRBY2Nlc3NNb2RlcygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRMZW5ndGgoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgU2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRQb3NpdGlvbigpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0VPRigpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBSZWFkRGF0YSh1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgUmVhZFN0cmluZyhGWF9XQ0hBUiogcFN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1heExlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFT1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbnN0KiBwQnl0ZVNpemUgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgV3JpdGVEYXRhKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBXcml0ZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgRmx1c2goKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0TGVuZ3RoKGludDMyX3QgaUxlbmd0aCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEJPTSh1aW50OF90IGJvbVs0XSkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9XT1JEIEdldENvZGVQYWdlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBGWF9XT1JEIFNldENvZGVQYWdlKEZYX1dPUkQgd0NvZGVQYWdlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgTG9jaygpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBVbmxvY2soKSA9IDA7DQorICB2aXJ0dWFsIElGWF9TdHJlYW0qIENyZWF0ZVNoYXJlZFN0cmVhbShGWF9EV09SRCBkd0FjY2VzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU9mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCkgPSAwOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfc3lzLmggYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9zeXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjZiMjZhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfc3lzLmgKQEAgLTAsMCArMSw2NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWF9TWVNURU0NCisjZGVmaW5lIF9GWF9TWVNURU0NCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYNCisjZGVmaW5lIEZYX1JBRDJERUcocikgKChyKSoxODAuMGYgLyBGWF9QSSkNCisjZGVmaW5lIEZYX0RFRzJSQUQoYSkgKChhKSpGWF9QSSAvIDE4MC4wZikNCit0eXBlZGVmIGludDhfdCogRlhfTFBJTlQ4Ow0KK3R5cGVkZWYgaW50OF90IGNvbnN0KiBGWF9MUENJTlQ4Ow0KK3R5cGVkZWYgaW50MzJfdCogRlhfTFBJTlQzMjsNCit0eXBlZGVmIGludDMyX3QgY29uc3QqIEZYX0xQQ0lOVDMyOw0KK3R5cGVkZWYgbG9uZyBGWF9MT05HOw0KK3R5cGVkZWYgRlhfTE9ORyogRlhfTFBMT05HOw0KK3R5cGVkZWYgRlhfTE9ORyBjb25zdCogRlhfTFBDTE9ORzsNCit0eXBlZGVmIEZYX0ZMT0FUIGNvbnN0KiBGWF9MUENGTE9BVDsNCit0eXBlZGVmIGRvdWJsZSBGWF9ET1VCTEU7DQordHlwZWRlZiBGWF9ET1VCTEUqIEZYX0xQRE9VQkxFOw0KK3R5cGVkZWYgRlhfRE9VQkxFIGNvbnN0KiBGWF9MUENET1VCTEU7DQorRlhfRkxPQVQgRlhfdGFuKEZYX0ZMT0FUIGEpOw0KK0ZYX0ZMT0FUIEZYX2xvZyhGWF9GTE9BVCBiLCBGWF9GTE9BVCB4KTsNCitGWF9GTE9BVCBGWF9zdHJ0b2YoY29uc3QgRlhfQ0hBUiogcGNzU3RyLA0KKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGggPSAtMSwNCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcFVzZWRMZW4gPSBOVUxMKTsNCitGWF9GTE9BVCBGWF93Y3N0b2YoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwNCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoID0gLTEsDQorICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBVc2VkTGVuID0gTlVMTCk7DQorRlhfV0NIQVIqIEZYX3djc25jcHkoRlhfV0NIQVIqIGRzdFN0ciwgY29uc3QgRlhfV0NIQVIqIHNyY1N0ciwgc2l6ZV90IGNvdW50KTsNCitpbnQzMl90IEZYX3djc25pY21wKGNvbnN0IEZYX1dDSEFSKiBzMSwgY29uc3QgRlhfV0NIQVIqIHMyLCBzaXplX3QgY291bnQpOw0KK2ludDMyX3QgRlhfc3RybmljbXAoY29uc3QgRlhfQ0hBUiogczEsIGNvbnN0IEZYX0NIQVIqIHMyLCBzaXplX3QgY291bnQpOw0KK2lubGluZSBGWF9CT09MIEZYX2lzbG93ZXIoaW50MzJfdCBjaCkgew0KKyAgcmV0dXJuIGNoID49ICdhJyAmJiBjaCA8PSAneic7DQorfQ0KK2lubGluZSBGWF9CT09MIEZYX2lzdXBwZXIoaW50MzJfdCBjaCkgew0KKyAgcmV0dXJuIGNoID49ICdBJyAmJiBjaCA8PSAnWic7DQorfQ0KK2lubGluZSBpbnQzMl90IEZYX3RvbG93ZXIoaW50MzJfdCBjaCkgew0KKyAgcmV0dXJuIEZYX2lzdXBwZXIoY2gpID8gKGNoICsgMHgyMCkgOiBjaDsNCit9DQoraW5saW5lIGludDMyX3QgRlhfdG91cHBlcihpbnQzMl90IGNoKSB7DQorICByZXR1cm4gRlhfaXNsb3dlcihjaCkgPyAoY2ggLSAweDIwKSA6IGNoOw0KK30NCitpbnQzMl90IEZYX2ZpbGVsZW5ndGgoRlhTWVNfRklMRSogZmlsZSk7DQorRlhfQk9PTCBGWF9mc2V0c2l6ZShGWFNZU19GSUxFKiBmaWxlLCBpbnQzMl90IHNpemUpOw0KK3ZvaWQgRlhfbWVtc2V0KHZvaWQqIHBCdWYsIGludDMyX3QgaVZhbHVlLCBzaXplX3Qgc2l6ZSk7DQordm9pZCBGWF9tZW1jcHkodm9pZCogcERzdCwgY29uc3Qgdm9pZCogcFNyYywgc2l6ZV90IHNpemUpOw0KK0ZYX0JPT0wgRlhfSXNSZWxhdGl2ZVBhdGgoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1BhdGgpOw0KK0ZYX0JPT0wgRlhfSm9pblBhdGgoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0Jhc2VQYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1JlbGF0aXZlUGF0aCwNCisgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0Fic29sdXRlUGF0aCk7DQordHlwZWRlZiBzdHJ1Y3QgX0ZYX1ZFUlNJT04gew0KKyAgRlhfRFdPUkQgZHdNYWpvclZlcnNpb247DQorICBGWF9EV09SRCBkd01pbm9yVmVyc2lvbjsNCisgIEZYX0RXT1JEIGR3QnVpbGRWZXJzaW9uOw0KK30gRlhfVkVSU0lPTiwgKkZYX0xQVkVSU0lPTjsNCit0eXBlZGVmIEZYX1ZFUlNJT04gY29uc3QqIEZYX0xQQ1ZFUlNJT047DQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfTsNCisjZW5kaWYNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF90YmsuaCBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3Riay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OWZjMTYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF90YmsuaApAQCAtMCwwICsxLDIxNCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWF9URVhUQlJFQUsNCisjZGVmaW5lIF9GWF9URVhUQlJFQUsNCisNCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3VjZC5oIg0KKw0KK2NsYXNzIElGWF9Gb250Ow0KK2NsYXNzIENGWF9DaGFyOw0KK2NsYXNzIElGWF9UeHRBY2Nlc3M7DQorY2xhc3MgQ0ZYX1R4dENoYXI7DQorY2xhc3MgQ0ZYX1R4dFBpZWNlOw0KK2NsYXNzIElGWF9UeHRCcmVhazsNCisjZGVmaW5lIEZYX1RYVEJSRUFLUE9MSUNZX05vbmUgMHgwMA0KKyNkZWZpbmUgRlhfVFhUQlJFQUtQT0xJQ1lfUGFnaW5hdGlvbiAweDAxDQorI2RlZmluZSBGWF9UWFRCUkVBS1BPTElDWV9TcGFjZUJyZWFrIDB4MDINCisjZGVmaW5lIEZYX1RYVEJSRUFLUE9MSUNZX051bWJlckJyZWFrIDB4MDQNCisjZGVmaW5lIEZYX1RYVEJSRUFLX05vbmUgMHgwMA0KKyNkZWZpbmUgRlhfVFhUQlJFQUtfUGllY2VCcmVhayAweDAxDQorI2RlZmluZSBGWF9UWFRCUkVBS19MaW5lQnJlYWsgMHgwMg0KKyNkZWZpbmUgRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWsgMHgwMw0KKyNkZWZpbmUgRlhfVFhUQlJFQUtfUGFnZUJyZWFrIDB4MDQNCisjZGVmaW5lIEZYX1RYVEJSRUFLX0NvbnRyb2xDaGFyIDB4MTANCisjZGVmaW5lIEZYX1RYVEJSRUFLX0JyZWFrQ2hhciAweDIwDQorI2RlZmluZSBGWF9UWFRCUkVBS19Vbmtub3duQ2hhciAweDQwDQorI2RlZmluZSBGWF9UWFRCUkVBS19SZW1vdmVDaGFyIDB4ODANCisjZGVmaW5lIEZYX1RYVExBWU9VVFNUWUxFX011dGlwbGVGb3JtYXQgMHgwMDAxDQorI2RlZmluZSBGWF9UWFRMQVlPVVRTVFlMRV9WZXJ0aWNhbExheW91dCAweDAwMDINCisjZGVmaW5lIEZYX1RYVExBWU9VVFNUWUxFX1ZlcnRpY2FsQ2hhcnMgMHgwMDA0DQorI2RlZmluZSBGWF9UWFRMQVlPVVRTVFlMRV9SZXZlcnNlTGluZSAweDAwMDgNCisjZGVmaW5lIEZYX1RYVExBWU9VVFNUWUxFX0FyYWJpY0NvbnRleHQgMHgwMDEwDQorI2RlZmluZSBGWF9UWFRMQVlPVVRTVFlMRV9BcmFiaWNTaGFwZXMgMHgwMDIwDQorI2RlZmluZSBGWF9UWFRMQVlPVVRTVFlMRV9SVExSZWFkaW5nT3JkZXIgMHgwMDQwDQorI2RlZmluZSBGWF9UWFRMQVlPVVRTVFlMRV9FeHBhbmRUYWIgMHgwMTAwDQorI2RlZmluZSBGWF9UWFRMQVlPVVRTVFlMRV9TaW5nbGVMaW5lIDB4MDIwMA0KKyNkZWZpbmUgRlhfVFhUTEFZT1VUU1RZTEVfQ29tYlRleHQgMHgwNDAwDQorI2RlZmluZSBGWF9UWFRDSEFSU1RZTEVfQWxpZ25tZW50IDB4MDAwRg0KKyNkZWZpbmUgRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY051bWJlciAweDAwMTANCisjZGVmaW5lIEZYX1RYVENIQVJTVFlMRV9BcmFiaWNTaGFkZGEgMHgwMDIwDQorI2RlZmluZSBGWF9UWFRDSEFSU1RZTEVfT2RkQmlkaUxldmVsIDB4MDA0MA0KKyNkZWZpbmUgRlhfVFhUQ0hBUlNUWUxFX1JUTFJlYWRpbmdPcmRlciAweDAwODANCisjZGVmaW5lIEZYX1RYVENIQVJTVFlMRV9BcmFiaWNDb250ZXh0IDB4MDMwMA0KKyNkZWZpbmUgRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY0luZGljIDB4MDQwMA0KKyNkZWZpbmUgRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY0NvbW1hIDB4MDgwMA0KKyNkZWZpbmUgRlhfVFhUTElORUFMSUdOTUVOVF9MZWZ0IDANCisjZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfQ2VudGVyIDENCisjZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfUmlnaHQgMg0KKyNkZWZpbmUgRlhfVFhUTElORUFMSUdOTUVOVF9KdXN0aWZpZWQgKDEgPDwgMikNCisjZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWQgKDIgPDwgMikNCisjZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfSnVzdGlmaWVkTGVmdCBcDQorICAoRlhfVFhUTElORUFMSUdOTUVOVF9MZWZ0IHwgRlhfVFhUTElORUFMSUdOTUVOVF9KdXN0aWZpZWQpDQorI2RlZmluZSBGWF9UWFRMSU5FQUxJR05NRU5UX0p1c3RpZmllZENlbnRlciBcDQorICAoRlhfVFhUTElORUFMSUdOTUVOVF9DZW50ZXIgfCBGWF9UWFRMSU5FQUxJR05NRU5UX0p1c3RpZmllZCkNCisjZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfSnVzdGlmaWVkUmlnaHQgXA0KKyAgKEZYX1RYVExJTkVBTElHTk1FTlRfUmlnaHQgfCBGWF9UWFRMSU5FQUxJR05NRU5UX0p1c3RpZmllZCkNCisjZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWRMZWZ0IFwNCisgIChGWF9UWFRMSU5FQUxJR05NRU5UX0xlZnQgfCBGWF9UWFRMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkKQ0KKyNkZWZpbmUgRlhfVFhUTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZENlbnRlciBcDQorICAoRlhfVFhUTElORUFMSUdOTUVOVF9DZW50ZXIgfCBGWF9UWFRMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkKQ0KKyNkZWZpbmUgRlhfVFhUTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZFJpZ2h0IFwNCisgIChGWF9UWFRMSU5FQUxJR05NRU5UX1JpZ2h0IHwgRlhfVFhUTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZCkNCisjZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfTG93ZXJNYXNrIDB4MDMNCisjZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfSGlnaGVyTWFzayAweDBDDQorI2RlZmluZSBGWF9UWFRCUkVBS19NaW5pbXVtVGFiV2lkdGggMTYwMDAwDQorDQorY2xhc3MgSUZYX1R4dEFjY2VzcyB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklGWF9UeHRBY2Nlc3MoKSB7fQ0KKyAgdmlydHVhbCBGWF9XQ0hBUiBHZXRDaGFyKHZvaWQqIHBJZGVudGl0eSwgaW50MzJfdCBpbmRleCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFdpZHRoKHZvaWQqIHBJZGVudGl0eSwgaW50MzJfdCBpbmRleCkgY29uc3QgPSAwOw0KK307DQordHlwZWRlZiBzdHJ1Y3QgX0ZYX1RYVFJVTiB7DQorICBfRlhfVFhUUlVOKCkgew0KKyAgICBwQWNjZXNzID0gTlVMTDsNCisgICAgcElkZW50aXR5ID0gTlVMTDsNCisgICAgcFN0ciA9IE5VTEw7DQorICAgIHBXaWR0aHMgPSBOVUxMOw0KKyAgICBpTGVuZ3RoID0gMDsNCisgICAgcEZvbnQgPSBOVUxMOw0KKyAgICBmRm9udFNpemUgPSAxMjsNCisgICAgZHdTdHlsZXMgPSAwOw0KKyAgICBpSG9yaXpvbnRhbFNjYWxlID0gMTAwOw0KKyAgICBpVmVydGljYWxTY2FsZSA9IDEwMDsNCisgICAgaUNoYXJSb3RhdGlvbiA9IDA7DQorICAgIGR3Q2hhclN0eWxlcyA9IDA7DQorICAgIHBSZWN0ID0gTlVMTDsNCisgICAgd0xpbmVCcmVha0NoYXIgPSBMJ1xuJzsNCisgICAgYlNraXBTcGFjZSA9IFRSVUU7DQorICB9DQorICBJRlhfVHh0QWNjZXNzKiBwQWNjZXNzOw0KKyAgdm9pZCogcElkZW50aXR5Ow0KKyAgY29uc3QgRlhfV0NIQVIqIHBTdHI7DQorICBpbnQzMl90KiBwV2lkdGhzOw0KKyAgaW50MzJfdCBpTGVuZ3RoOw0KKyAgSUZYX0ZvbnQqIHBGb250Ow0KKyAgRlhfRkxPQVQgZkZvbnRTaXplOw0KKyAgRlhfRFdPUkQgZHdTdHlsZXM7DQorICBpbnQzMl90IGlIb3Jpem9udGFsU2NhbGU7DQorICBpbnQzMl90IGlWZXJ0aWNhbFNjYWxlOw0KKyAgaW50MzJfdCBpQ2hhclJvdGF0aW9uOw0KKyAgRlhfRFdPUkQgZHdDaGFyU3R5bGVzOw0KKyAgRlhfTFBDUkVDVEYgcFJlY3Q7DQorICBGWF9XQ0hBUiB3TGluZUJyZWFrQ2hhcjsNCisgIEZYX0JPT0wgYlNraXBTcGFjZTsNCit9IEZYX1RYVFJVTiwgKkZYX0xQVFhUUlVOOw0KK3R5cGVkZWYgRlhfVFhUUlVOIGNvbnN0KiBGWF9MUENUWFRSVU47DQorY2xhc3MgQ0ZYX1R4dFBpZWNlIDogcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRlhfVHh0UGllY2UoKQ0KKyAgICAgIDogbV9kd1N0YXR1cyhGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSwNCisgICAgICAgIG1faVN0YXJ0UG9zKDApLA0KKyAgICAgICAgbV9pV2lkdGgoLTEpLA0KKyAgICAgICAgbV9pU3RhcnRDaGFyKDApLA0KKyAgICAgICAgbV9pQ2hhcnMoMCksDQorICAgICAgICBtX2lCaWRpTGV2ZWwoMCksDQorICAgICAgICBtX2lCaWRpUG9zKDApLA0KKyAgICAgICAgbV9pSG9yaXpvbnRhbFNjYWxlKDEwMCksDQorICAgICAgICBtX2lWZXJ0aWNhbFNjYWxlKDEwMCksDQorICAgICAgICBtX2R3Q2hhclN0eWxlcygwKSwNCisgICAgICAgIG1fcENoYXJzKE5VTEwpLA0KKyAgICAgICAgbV9wVXNlckRhdGEoTlVMTCkge30NCisgIGludDMyX3QgR2V0RW5kUG9zKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9pV2lkdGggPCAwID8gbV9pU3RhcnRQb3MgOiBtX2lTdGFydFBvcyArIG1faVdpZHRoOw0KKyAgfQ0KKyAgaW50MzJfdCBHZXRMZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX2lDaGFyczsgfQ0KKyAgaW50MzJfdCBHZXRFbmRDaGFyKCkgY29uc3QgeyByZXR1cm4gbV9pU3RhcnRDaGFyICsgbV9pQ2hhcnM7IH0NCisgIENGWF9UeHRDaGFyKiBHZXRDaGFyUHRyKGludDMyX3QgaW5kZXgpIGNvbnN0IHsNCisgICAgRlhTWVNfYXNzZXJ0KGluZGV4ID4gLTEgJiYgaW5kZXggPCBtX2lDaGFycyAmJiBtX3BDaGFycyAhPSBOVUxMKTsNCisgICAgcmV0dXJuIG1fcENoYXJzLT5HZXREYXRhUHRyKG1faVN0YXJ0Q2hhciArIGluZGV4KTsNCisgIH0NCisgIHZvaWQgR2V0U3RyaW5nKEZYX1dDSEFSKiBwVGV4dCkgY29uc3Qgew0KKyAgICBGWFNZU19hc3NlcnQocFRleHQgIT0gTlVMTCk7DQorICAgIGludDMyX3QgaUVuZENoYXIgPSBtX2lTdGFydENoYXIgKyBtX2lDaGFyczsNCisgICAgQ0ZYX0NoYXIqIHBDaGFyOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IG1faVN0YXJ0Q2hhcjsgaSA8IGlFbmRDaGFyOyBpKyspIHsNCisgICAgICBwQ2hhciA9IG1fcENoYXJzLT5HZXREYXRhUHRyKGkpOw0KKyAgICAgICpwVGV4dCsrID0gKEZYX1dDSEFSKXBDaGFyLT5tX3dDaGFyQ29kZTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgdm9pZCBHZXRTdHJpbmcoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgY29uc3Qgew0KKyAgICBGWF9XQ0hBUiogcFRleHQgPSB3c1RleHQuR2V0QnVmZmVyKG1faUNoYXJzKTsNCisgICAgR2V0U3RyaW5nKHBUZXh0KTsNCisgICAgd3NUZXh0LlJlbGVhc2VCdWZmZXIobV9pQ2hhcnMpOw0KKyAgfQ0KKyAgdm9pZCBHZXRXaWR0aHMoaW50MzJfdCogcFdpZHRocykgY29uc3Qgew0KKyAgICBGWFNZU19hc3NlcnQocFdpZHRocyAhPSBOVUxMKTsNCisgICAgaW50MzJfdCBpRW5kQ2hhciA9IG1faVN0YXJ0Q2hhciArIG1faUNoYXJzOw0KKyAgICBDRlhfQ2hhciogcENoYXI7DQorICAgIGZvciAoaW50MzJfdCBpID0gbV9pU3RhcnRDaGFyOyBpIDwgaUVuZENoYXI7IGkrKykgew0KKyAgICAgIHBDaGFyID0gbV9wQ2hhcnMtPkdldERhdGFQdHIoaSk7DQorICAgICAgKnBXaWR0aHMrKyA9IHBDaGFyLT5tX2lDaGFyV2lkdGg7DQorICAgIH0NCisgIH0NCisgIEZYX0RXT1JEIG1fZHdTdGF0dXM7DQorICBpbnQzMl90IG1faVN0YXJ0UG9zOw0KKyAgaW50MzJfdCBtX2lXaWR0aDsNCisgIGludDMyX3QgbV9pU3RhcnRDaGFyOw0KKyAgaW50MzJfdCBtX2lDaGFyczsNCisgIGludDMyX3QgbV9pQmlkaUxldmVsOw0KKyAgaW50MzJfdCBtX2lCaWRpUG9zOw0KKyAgaW50MzJfdCBtX2lIb3Jpem9udGFsU2NhbGU7DQorICBpbnQzMl90IG1faVZlcnRpY2FsU2NhbGU7DQorICBGWF9EV09SRCBtX2R3Q2hhclN0eWxlczsNCisgIENGWF9UeHRDaGFyQXJyYXkqIG1fcENoYXJzOw0KKyAgdm9pZCogbV9wVXNlckRhdGE7DQorfTsNCit0eXBlZGVmIENGWF9CYXNlQXJyYXlUZW1wbGF0ZTxDRlhfVHh0UGllY2U+IENGWF9UeHRQaWVjZUFycmF5Ow0KK2NsYXNzIElGWF9UeHRCcmVhayB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJRlhfVHh0QnJlYWsqIENyZWF0ZShGWF9EV09SRCBkd1BvbGljaWVzKTsNCisgIHZpcnR1YWwgfklGWF9UeHRCcmVhaygpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRMaW5lV2lkdGgoRlhfRkxPQVQgZkxpbmVXaWR0aCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldExpbmVQb3MoRlhfRkxPQVQgZkxpbmVQb3MpID0gMDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0TGF5b3V0U3R5bGVzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldExheW91dFN0eWxlcyhGWF9EV09SRCBkd0xheW91dFN0eWxlcykgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEZvbnQoSUZYX0ZvbnQqIHBGb250KSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0VGFiV2lkdGgoRlhfRkxPQVQgZlRhYldpZHRoLCBGWF9CT09MIGJFcXVpZGlzdGFudCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldERlZmF1bHRDaGFyKEZYX1dDSEFSIHdjaCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldFBhcmFncmFwaEJyZWFrQ2hhcihGWF9XQ0hBUiB3Y2gpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRMaW5lQnJlYWtUb2xlcmFuY2UoRlhfRkxPQVQgZlRvbGVyYW5jZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEhvcml6b250YWxTY2FsZShpbnQzMl90IGlTY2FsZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldFZlcnRpY2FsU2NhbGUoaW50MzJfdCBpU2NhbGUpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRDaGFyUm90YXRpb24oaW50MzJfdCBpQ2hhclJvdGF0aW9uKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRBbGlnbm1lbnQoaW50MzJfdCBpQWxpZ25tZW50KSA9IDA7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldENvbnRleHRDaGFyU3R5bGVzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldENvbnRleHRDaGFyU3R5bGVzKEZYX0RXT1JEIGR3Q2hhclN0eWxlcykgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldENvbWJXaWR0aChGWF9GTE9BVCBmQ29tYldpZHRoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgU2V0VXNlckRhdGEodm9pZCogcFVzZXJEYXRhKSA9IDA7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEFwcGVuZENoYXIoRlhfV0NIQVIgd2NoKSA9IDA7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEVuZEJyZWFrKEZYX0RXT1JEIGR3U3RhdHVzID0gRlhfVFhUQlJFQUtfUGllY2VCcmVhaykgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50QnJlYWtDaGFycygpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudEJyZWFrUGllY2VzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBjb25zdCBDRlhfVHh0UGllY2UqIEdldEJyZWFrUGllY2UoaW50MzJfdCBpbmRleCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIENsZWFyQnJlYWtQaWVjZXMoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgUmVzZXQoKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0RGlzcGxheVBvcygNCisgICAgICBGWF9MUENUWFRSVU4gcFR4dFJ1biwNCisgICAgICBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsDQorICAgICAgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSwNCisgICAgICBDRlhfV2lkZVN0cmluZyogcFdTRm9ybXMgPSBOVUxMLA0KKyAgICAgIEZYX0FkanVzdENoYXJEaXNwbGF5UG9zIHBBZGp1c3RQb3MgPSBOVUxMKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q2hhclJlY3RzKEZYX0xQQ1RYVFJVTiBwVHh0UnVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEZBcnJheSYgcnRBcnJheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckJCb3ggPSBGQUxTRSkgY29uc3QgPSAwOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfdWNkLmggYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF91Y2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmQyY2U1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfdWNkLmgKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GR0FTX1VOSUNPREVfDQorI2RlZmluZSBfRkdBU19VTklDT0RFXw0KKyNkZWZpbmUgRlhfSkFQQ0hBUlBST1BFUlRZRVhfTGVmdCAweDAxDQorI2RlZmluZSBGWF9KQVBDSEFSUFJPUEVSVFlFWF9DZW50ZXIgMHgwMg0KKyNkZWZpbmUgRlhfSkFQQ0hBUlBST1BFUlRZRVhfUmlnaHQgMHgwMw0KKyNkZWZpbmUgRlhfSkFQQ0hBUlBST1BFUlRZRVhfVG9wIDB4MTANCisjZGVmaW5lIEZYX0pBUENIQVJQUk9QRVJUWUVYX01pZGRsZSAweDIwDQorI2RlZmluZSBGWF9KQVBDSEFSUFJPUEVSVFlFWF9Cb3R0b20gMHgzMA0KK3R5cGVkZWYgc3RydWN0IF9GWF9KQVBDSEFSUFJPUEVSVFlFWCB7DQorICBGWF9XQ0hBUiB3Q2hhcjsNCisgIHVpbnQ4X3QgdUFsaWduOw0KK30gRlhfSkFQQ0hBUlBST1BFUlRZRVgsICpGWF9MUEpBUENIQVJQUk9QRVJUWUVYOw0KK3R5cGVkZWYgRlhfSkFQQ0hBUlBST1BFUlRZRVggY29uc3QqIEZYX0xQQ0pBUENIQVJQUk9QRVJUWUVYOw0KK0ZYX0xQQ0pBUENIQVJQUk9QRVJUWUVYIEZYX0dldEphcENoYXJQcm9wZXJ0eUV4KEZYX1dDSEFSIHdjaCk7DQordHlwZWRlZiBGWF9CT09MICgqRlhfQWRqdXN0Q2hhckRpc3BsYXlQb3MpKEZYX1dDSEFSIHdjaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTUJDU0NvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Gb250KiBwRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJWZXJ0aWNhbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RiYgcHRPZmZzZXQpOw0KK0ZYX0JPT0wgRlhfQWRqdXN0SmFwQ2hhckRpc3BsYXlQb3MoRlhfV0NIQVIgd2NoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTUJDU0NvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRm9udCogcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJWZXJ0aWNhbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Qb2ludEYmIHB0T2Zmc2V0KTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF91dGwuaCBiL3hmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3V0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NWFhOTkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF91dGwuaApAQCAtMCwwICsxLDcyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWF9VVElMUw0KKyNkZWZpbmUgX0ZYX1VUSUxTDQorDQorI2luY2x1ZGUgImZ4X21lbS5oIg0KKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIgIC8vIEZvciBDRlhfUmVjdC4NCisNCitjbGFzcyBDRlhfVGhyZWFkTG9jazsNCitjbGFzcyBDRlhfQmFzZUFycmF5Ow0KK3RlbXBsYXRlIDxjbGFzcyBiYXNlVHlwZT4NCitjbGFzcyBDRlhfQmFzZUFycmF5VGVtcGxhdGU7DQordGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPg0KK2NsYXNzIENGWF9PYmplY3RCYXNlQXJyYXlUZW1wbGF0ZTsNCitjbGFzcyBDRlhfQmFzZU1hc3NBcnJheTsNCitjbGFzcyBDRlhfQmFzZU1hc3NBcnJheUltcDsNCit0ZW1wbGF0ZSA8Y2xhc3MgYmFzZVR5cGU+DQorY2xhc3MgQ0ZYX01hc3NBcnJheVRlbXBsYXRlOw0KK3RlbXBsYXRlIDxjbGFzcyBiYXNlVHlwZT4NCitjbGFzcyBDRlhfT2JqZWN0TWFzc0FycmF5VGVtcGxhdGU7DQorY2xhc3MgQ0ZYX0Jhc2VEaXNjcmV0ZUFycmF5Ow0KK3RlbXBsYXRlIDxjbGFzcyBiYXNlVHlwZT4NCitjbGFzcyBDRlhfRGlzY3JldGVBcnJheVRlbXBsYXRlOw0KK2NsYXNzIENGWF9CYXNlU3RhY2s7DQordGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPg0KK2NsYXNzIENGWF9TdGFja1RlbXBsYXRlOw0KK3RlbXBsYXRlIDxjbGFzcyBiYXNlVHlwZT4NCitjbGFzcyBDRlhfT2JqZWN0U3RhY2tUZW1wbGF0ZTsNCit0ZW1wbGF0ZSA8Y2xhc3MgYmFzZVR5cGU+DQorY2xhc3MgQ0ZYX0NQTFRyZWVOb2RlOw0KK3RlbXBsYXRlIDxjbGFzcyBiYXNlVHlwZT4NCitjbGFzcyBDRlhfQ1BMVHJlZTsNCitjbGFzcyBGWF9CQVNFQVJSQVlEQVRBOw0KKw0KK2NsYXNzIENGWF9UaHJlYWRMb2NrIHsNCisgcHVibGljOg0KKyAgQ0ZYX1RocmVhZExvY2soKTsNCisgIHZpcnR1YWwgfkNGWF9UaHJlYWRMb2NrKCk7DQorICB2b2lkIExvY2soKTsNCisgIHZvaWQgVW5sb2NrKCk7DQorfTsNCitjbGFzcyBDRlhfQmFzZUFycmF5IDogcHVibGljIENGWF9UYXJnZXQgew0KKyBwcm90ZWN0ZWQ6DQorICBDRlhfQmFzZUFycmF5KGludDMyX3QgaUdyb3dTaXplLCBpbnQzMl90IGlCbG9ja1NpemUpOw0KKyAgfkNGWF9CYXNlQXJyYXkoKTsNCisgIGludDMyX3QgR2V0U2l6ZSgpIGNvbnN0Ow0KKyAgaW50MzJfdCBHZXRCbG9ja1NpemUoKSBjb25zdDsNCisgIHVpbnQ4X3QqIEFkZFNwYWNlVG8oaW50MzJfdCBpbmRleCk7DQorICB1aW50OF90KiBHZXRBdChpbnQzMl90IGluZGV4KSBjb25zdDsNCisgIHVpbnQ4X3QqIEdldEJ1ZmZlcigpIGNvbnN0Ow0KKyAgaW50MzJfdCBBcHBlbmQoY29uc3QgQ0ZYX0Jhc2VBcnJheSYgc3JjLA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQgPSAwLA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQgPSAtMSk7DQorICBpbnQzMl90IENvcHkoY29uc3QgQ0ZYX0Jhc2VBcnJheSYgc3JjLA0KKyAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0ID0gMCwNCisgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCA9IC0xKTsNCisgIGludDMyX3QgUmVtb3ZlTGFzdChpbnQzMl90IGlDb3VudCA9IC0xKTsNCisgIHZvaWQgUmVtb3ZlQWxsKEZYX0JPT0wgYkxlYXZlTWVtb3J5ID0gRkFMU0UpOw0KKw0KKyAgRlhfQkFTRUFSUkFZREFUQSogbV9wRGF0YTsNCit9Ow0KK3RlbXBsYXRlIDxjbGFzcyBiYXNlVHlwZT4NCitjbGFzcyBDRlhfQmFzZUFycmF5VGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0Jhc2VBcnJheSB7DQorIHB1YmxpYzoNCisgIENGWF9CYXNlQXJyYXlUZW1wbGF0ZShpbnQzMl90IGlHcm93U2l6ZSA9IDEwMCkNCisgICAgICA6IENGWF9CYXNlQXJyYXkoaUdyb3dTaXplLCBzaXplb2YoYmFzZVR5cGUpKSB7fQ0KKyAgQ0ZYX0Jhc2VBcnJheVRlbXBsYXRlKGludDMyX3QgaUdyb3dTaXplLCBpbnQzMl90IGlCbG9ja1NpemUpDQorICAgICAgOiBDRlhfQmFzZUFycmF5KGlHcm93U2l6ZSwgaUJsb2NrU2l6ZSkge30NCisgIGludDMyX3QgR2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIENGWF9CYXNlQXJyYXk6OkdldFNpemUoKTsgfQ0KKyAgaW50MzJfdCBHZXRCbG9ja1NpemUoKSBjb25zdCB7IHJldHVybiBDRlhfQmFzZUFycmF5OjpHZXRCbG9ja1NpemUoKTsgfQ0KKyAgYmFzZVR5cGUqIEFkZFNwYWNlKCkgew0KKyAgICByZXR1cm4gKGJhc2VUeXBlKilDRlhfQmFzZUFycmF5OjpBZGRTcGFjZVRvKENGWF9CYXNlQXJyYXk6OkdldFNpemUoKSk7DQorICB9DQorICBpbnQzMl90IEFkZChjb25zdCBiYXNlVHlwZSYgZWxlbWVudCkgew0KKyAgICBpbnQzMl90IGluZGV4ID0gQ0ZYX0Jhc2VBcnJheTo6R2V0U2l6ZSgpOw0KKyAgICAqKGJhc2VUeXBlKilDRlhfQmFzZUFycmF5OjpBZGRTcGFjZVRvKGluZGV4KSA9IGVsZW1lbnQ7DQorICAgIHJldHVybiBpbmRleDsNCisgIH0NCisgIGJhc2VUeXBlKiBHZXRCdWZmZXIoKSBjb25zdCB7IHJldHVybiAoYmFzZVR5cGUqKUNGWF9CYXNlQXJyYXk6OkdldEJ1ZmZlcigpOyB9DQorICBiYXNlVHlwZSYgR2V0QXQoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgICByZXR1cm4gKihiYXNlVHlwZSopQ0ZYX0Jhc2VBcnJheTo6R2V0QXQoaW5kZXgpOw0KKyAgfQ0KKyAgYmFzZVR5cGUqIEdldFB0ckF0KGludDMyX3QgaW5kZXgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VBcnJheTo6R2V0QXQoaW5kZXgpOw0KKyAgfQ0KKyAgdm9pZCBTZXRBdChpbnQzMl90IGluZGV4LCBjb25zdCBiYXNlVHlwZSYgZWxlbWVudCkgew0KKyAgICAqKGJhc2VUeXBlKilDRlhfQmFzZUFycmF5OjpHZXRBdChpbmRleCkgPSBlbGVtZW50Ow0KKyAgfQ0KKyAgdm9pZCBTZXRBdEdyb3coaW50MzJfdCBpbmRleCwgY29uc3QgYmFzZVR5cGUmIGVsZW1lbnQpIHsNCisgICAgKihiYXNlVHlwZSopQ0ZYX0Jhc2VBcnJheTo6QWRkU3BhY2VUbyhpbmRleCkgPSBlbGVtZW50Ow0KKyAgfQ0KKyAgaW50MzJfdCBBcHBlbmQoY29uc3QgQ0ZYX0Jhc2VBcnJheVRlbXBsYXRlJiBzcmMsDQorICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCA9IDAsDQorICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCA9IC0xKSB7DQorICAgIHJldHVybiBDRlhfQmFzZUFycmF5OjpBcHBlbmQoc3JjLCBpU3RhcnQsIGlDb3VudCk7DQorICB9DQorICBpbnQzMl90IENvcHkoY29uc3QgQ0ZYX0Jhc2VBcnJheVRlbXBsYXRlJiBzcmMsDQorICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQgPSAwLA0KKyAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50ID0gLTEpIHsNCisgICAgcmV0dXJuIENGWF9CYXNlQXJyYXk6OkNvcHkoc3JjLCBpU3RhcnQsIGlDb3VudCk7DQorICB9DQorICBpbnQzMl90IFJlbW92ZUxhc3QoaW50MzJfdCBpQ291bnQgPSAtMSkgew0KKyAgICByZXR1cm4gQ0ZYX0Jhc2VBcnJheTo6UmVtb3ZlTGFzdChpQ291bnQpOw0KKyAgfQ0KKyAgdm9pZCBSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkgPSBGQUxTRSkgew0KKyAgICBDRlhfQmFzZUFycmF5OjpSZW1vdmVBbGwoYkxlYXZlTWVtb3J5KTsNCisgIH0NCit9Ow0KK3R5cGVkZWYgQ0ZYX0Jhc2VBcnJheVRlbXBsYXRlPHZvaWQqPiBDRkRFX1B0ckFycmF5Ow0KK3R5cGVkZWYgQ0ZYX0Jhc2VBcnJheVRlbXBsYXRlPEZYX0RXT1JEPiBDRkRFX0RXb3JkQXJyYXk7DQordHlwZWRlZiBDRlhfQmFzZUFycmF5VGVtcGxhdGU8RlhfV09SRD4gQ0ZERV9Xb3JkQXJyYXk7DQordGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPg0KK2NsYXNzIENGWF9PYmplY3RCYXNlQXJyYXlUZW1wbGF0ZSA6IHB1YmxpYyBDRlhfQmFzZUFycmF5IHsNCisgcHVibGljOg0KKyAgQ0ZYX09iamVjdEJhc2VBcnJheVRlbXBsYXRlKGludDMyX3QgaUdyb3dTaXplID0gMTAwKQ0KKyAgICAgIDogQ0ZYX0Jhc2VBcnJheShpR3Jvd1NpemUsIHNpemVvZihiYXNlVHlwZSkpIHt9DQorICB+Q0ZYX09iamVjdEJhc2VBcnJheVRlbXBsYXRlKCkgeyBSZW1vdmVBbGwoRkFMU0UpOyB9DQorICBpbnQzMl90IEdldFNpemUoKSBjb25zdCB7IHJldHVybiBDRlhfQmFzZUFycmF5OjpHZXRTaXplKCk7IH0NCisgIGludDMyX3QgR2V0QmxvY2tTaXplKCkgY29uc3QgeyByZXR1cm4gQ0ZYX0Jhc2VBcnJheTo6R2V0QmxvY2tTaXplKCk7IH0NCisgIGludDMyX3QgQWRkKGNvbnN0IGJhc2VUeXBlJiBlbGVtZW50KSB7DQorICAgIGludDMyX3QgaW5kZXggPSBDRlhfQmFzZUFycmF5OjpHZXRTaXplKCk7DQorICAgIGJhc2VUeXBlKiBwID0gKGJhc2VUeXBlKilDRlhfQmFzZUFycmF5OjpBZGRTcGFjZVRvKGluZGV4KTsNCisgICAgbmV3ICgodm9pZCopcCkgYmFzZVR5cGUoZWxlbWVudCk7DQorICAgIHJldHVybiBpbmRleDsNCisgIH0NCisgIGJhc2VUeXBlJiBHZXRBdChpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICAgIHJldHVybiAqKGJhc2VUeXBlKilDRlhfQmFzZUFycmF5OjpHZXRBdChpbmRleCk7DQorICB9DQorICBiYXNlVHlwZSogR2V0UHRyQXQoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgICByZXR1cm4gKGJhc2VUeXBlKilDRlhfQmFzZUFycmF5OjpHZXRBdChpbmRleCk7DQorICB9DQorICBpbnQzMl90IEFwcGVuZChjb25zdCBDRlhfT2JqZWN0QmFzZUFycmF5VGVtcGxhdGUmIHNyYywNCisgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0ID0gMCwNCisgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50ID0gLTEpIHsNCisgICAgRlhTWVNfYXNzZXJ0KEdldEJsb2NrU2l6ZSgpID09IHNyYy5HZXRCbG9ja1NpemUoKSk7DQorICAgIGlmIChpQ291bnQgPT0gMCkgew0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIGludDMyX3QgaVNpemUgPSBzcmMuR2V0U2l6ZSgpOw0KKyAgICBGWFNZU19hc3NlcnQoaVN0YXJ0ID4gLTEgJiYgaVN0YXJ0IDwgaVNpemUpOw0KKyAgICBpZiAoaUNvdW50IDwgMCkgew0KKyAgICAgIGlDb3VudCA9IGlTaXplOw0KKyAgICB9DQorICAgIGlmIChpU3RhcnQgKyBpQ291bnQgPiBpU2l6ZSkgew0KKyAgICAgIGlDb3VudCA9IGlTaXplIC0gaVN0YXJ0Ow0KKyAgICB9DQorICAgIGlmIChpQ291bnQgPCAxKSB7DQorICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgaVNpemUgPSBDRlhfQmFzZUFycmF5OjpHZXRTaXplKCk7DQorICAgIENGWF9CYXNlQXJyYXk6OkFkZFNwYWNlVG8oaVNpemUgKyBpQ291bnQgLSAxKTsNCisgICAgdWludDhfdCoqIHBTdGFydCA9IENGWF9CYXNlQXJyYXk6OkdldEF0KGlTaXplKTsNCisgICAgaW50MzJfdCBpQmxvY2tTaXplID0gQ0ZYX0Jhc2VBcnJheTo6R2V0QmxvY2tTaXplKCk7DQorICAgIGlTaXplID0gaVN0YXJ0ICsgaUNvdW50Ow0KKyAgICBmb3IgKGludDMyX3QgaSA9IGlTdGFydDsgaSA8IGlTaXplOyBpKyspIHsNCisgICAgICBGWFRBUkdFVF9OZXdXaXRoKCh2b2lkKilwU3RhcnQpIGJhc2VUeXBlKHNyYy5HZXRBdChpKSk7DQorICAgICAgcFN0YXJ0ICs9IGlCbG9ja1NpemU7DQorICAgIH0NCisgICAgcmV0dXJuIGlDb3VudDsNCisgIH0NCisgIGludDMyX3QgQ29weShjb25zdCBDRlhfT2JqZWN0QmFzZUFycmF5VGVtcGxhdGUmIHNyYywNCisgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCA9IDAsDQorICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQgPSAtMSkgew0KKyAgICBGWFNZU19hc3NlcnQoR2V0QmxvY2tTaXplKCkgPT0gc3JjLkdldEJsb2NrU2l6ZSgpKTsNCisgICAgaWYgKGlDb3VudCA9PSAwKSB7DQorICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgaW50MzJfdCBpU2l6ZSA9IHNyYy5HZXRTaXplKCk7DQorICAgIEZYU1lTX2Fzc2VydChpU3RhcnQgPiAtMSAmJiBpU3RhcnQgPCBpU2l6ZSk7DQorICAgIGlmIChpQ291bnQgPCAwKSB7DQorICAgICAgaUNvdW50ID0gaVNpemU7DQorICAgIH0NCisgICAgaWYgKGlTdGFydCArIGlDb3VudCA+IGlTaXplKSB7DQorICAgICAgaUNvdW50ID0gaVNpemUgLSBpU3RhcnQ7DQorICAgIH0NCisgICAgaWYgKGlDb3VudCA8IDEpIHsNCisgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBSZW1vdmVBbGwoVFJVRSk7DQorICAgIENGWF9CYXNlQXJyYXk6OkFkZFNwYWNlVG8oaUNvdW50IC0gMSk7DQorICAgIHVpbnQ4X3QqKiBwU3RhcnQgPSBDRlhfQmFzZUFycmF5OjpHZXRBdCgwKTsNCisgICAgaW50MzJfdCBpQmxvY2tTaXplID0gQ0ZYX0Jhc2VBcnJheTo6R2V0QmxvY2tTaXplKCk7DQorICAgIGlTaXplID0gaVN0YXJ0ICsgaUNvdW50Ow0KKyAgICBmb3IgKGludDMyX3QgaSA9IGlTdGFydDsgaSA8IGlTaXplOyBpKyspIHsNCisgICAgICBuZXcgKCh2b2lkKilwU3RhcnQpIGJhc2VUeXBlKHNyYy5HZXRBdChpKSk7DQorICAgICAgcFN0YXJ0ICs9IGlCbG9ja1NpemU7DQorICAgIH0NCisgICAgcmV0dXJuIGlDb3VudDsNCisgIH0NCisgIGludDMyX3QgUmVtb3ZlTGFzdChpbnQzMl90IGlDb3VudCA9IC0xKSB7DQorICAgIGludDMyX3QgaVNpemUgPSBDRlhfQmFzZUFycmF5OjpHZXRTaXplKCk7DQorICAgIGlmIChpQ291bnQgPCAwIHx8IGlDb3VudCA+IGlTaXplKSB7DQorICAgICAgaUNvdW50ID0gaVNpemU7DQorICAgIH0NCisgICAgaWYgKGlDb3VudCA9PSAwKSB7DQorICAgICAgcmV0dXJuIGlTaXplOw0KKyAgICB9DQorICAgIGZvciAoaW50MzJfdCBpID0gaVNpemUgLSBpQ291bnQ7IGkgPCBpU2l6ZTsgaSsrKSB7DQorICAgICAgKChiYXNlVHlwZSopR2V0UHRyQXQoaSkpLT5+YmFzZVR5cGUoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZYX0Jhc2VBcnJheTo6UmVtb3ZlTGFzdChpQ291bnQpOw0KKyAgfQ0KKyAgdm9pZCBSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkgPSBGQUxTRSkgew0KKyAgICBpbnQzMl90IGlTaXplID0gQ0ZYX0Jhc2VBcnJheTo6R2V0U2l6ZSgpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgaSsrKSB7DQorICAgICAgKChiYXNlVHlwZSopR2V0UHRyQXQoaSkpLT5+YmFzZVR5cGUoKTsNCisgICAgfQ0KKyAgICBDRlhfQmFzZUFycmF5OjpSZW1vdmVBbGwoYkxlYXZlTWVtb3J5KTsNCisgIH0NCit9Ow0KK2NsYXNzIENGWF9CYXNlTWFzc0FycmF5IDogcHVibGljIENGWF9UYXJnZXQgew0KKyBwcm90ZWN0ZWQ6DQorICBDRlhfQmFzZU1hc3NBcnJheShpbnQzMl90IGlDaHVua1NpemUsIGludDMyX3QgaUJsb2NrU2l6ZSk7DQorICB+Q0ZYX0Jhc2VNYXNzQXJyYXkoKTsNCisgIGludDMyX3QgR2V0U2l6ZSgpIGNvbnN0Ow0KKyAgdWludDhfdCogQWRkU3BhY2VUbyhpbnQzMl90IGluZGV4KTsNCisgIHVpbnQ4X3QqIEdldEF0KGludDMyX3QgaW5kZXgpIGNvbnN0Ow0KKyAgaW50MzJfdCBBcHBlbmQoY29uc3QgQ0ZYX0Jhc2VNYXNzQXJyYXkmIHNyYywNCisgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0ID0gMCwNCisgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50ID0gLTEpOw0KKyAgaW50MzJfdCBDb3B5KGNvbnN0IENGWF9CYXNlTWFzc0FycmF5JiBzcmMsDQorICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQgPSAwLA0KKyAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50ID0gLTEpOw0KKyAgaW50MzJfdCBSZW1vdmVMYXN0KGludDMyX3QgaUNvdW50ID0gLTEpOw0KKyAgdm9pZCBSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkgPSBGQUxTRSk7DQorICBDRlhfQmFzZU1hc3NBcnJheUltcCogbV9wRGF0YTsNCit9Ow0KK3RlbXBsYXRlIDxjbGFzcyBiYXNlVHlwZT4NCitjbGFzcyBDRlhfTWFzc0FycmF5VGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0Jhc2VNYXNzQXJyYXkgew0KKyBwdWJsaWM6DQorICBDRlhfTWFzc0FycmF5VGVtcGxhdGUoaW50MzJfdCBpQ2h1bmtTaXplID0gMTAwKQ0KKyAgICAgIDogQ0ZYX0Jhc2VNYXNzQXJyYXkoaUNodW5rU2l6ZSwgc2l6ZW9mKGJhc2VUeXBlKSkge30NCisgIENGWF9NYXNzQXJyYXlUZW1wbGF0ZShpbnQzMl90IGlDaHVua1NpemUsIGludDMyX3QgaUJsb2NrU2l6ZSkNCisgICAgICA6IENGWF9CYXNlTWFzc0FycmF5KGlDaHVua1NpemUsIGlCbG9ja1NpemUpIHt9DQorICBpbnQzMl90IEdldFNpemUoKSBjb25zdCB7IHJldHVybiBDRlhfQmFzZU1hc3NBcnJheTo6R2V0U2l6ZSgpOyB9DQorICBiYXNlVHlwZSogQWRkU3BhY2UoKSB7DQorICAgIHJldHVybiAoYmFzZVR5cGUqKUNGWF9CYXNlTWFzc0FycmF5OjpBZGRTcGFjZVRvKA0KKyAgICAgICAgQ0ZYX0Jhc2VNYXNzQXJyYXk6OkdldFNpemUoKSk7DQorICB9DQorICBpbnQzMl90IEFkZChjb25zdCBiYXNlVHlwZSYgZWxlbWVudCkgew0KKyAgICBpbnQzMl90IGluZGV4ID0gQ0ZYX0Jhc2VNYXNzQXJyYXk6OkdldFNpemUoKTsNCisgICAgKihiYXNlVHlwZSopQ0ZYX0Jhc2VNYXNzQXJyYXk6OkFkZFNwYWNlVG8oaW5kZXgpID0gZWxlbWVudDsNCisgICAgcmV0dXJuIGluZGV4Ow0KKyAgfQ0KKyAgYmFzZVR5cGUmIEdldEF0KGludDMyX3QgaW5kZXgpIGNvbnN0IHsNCisgICAgcmV0dXJuICooYmFzZVR5cGUqKUNGWF9CYXNlTWFzc0FycmF5OjpHZXRBdChpbmRleCk7DQorICB9DQorICBiYXNlVHlwZSogR2V0UHRyQXQoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgICByZXR1cm4gKGJhc2VUeXBlKilDRlhfQmFzZU1hc3NBcnJheTo6R2V0QXQoaW5kZXgpOw0KKyAgfQ0KKyAgdm9pZCBTZXRBdChpbnQzMl90IGluZGV4LCBjb25zdCBiYXNlVHlwZSYgZWxlbWVudCkgew0KKyAgICAqKGJhc2VUeXBlKilDRlhfQmFzZU1hc3NBcnJheTo6R2V0QXQoaW5kZXgpID0gZWxlbWVudDsNCisgIH0NCisgIHZvaWQgU2V0QXRHcm93KGludDMyX3QgaW5kZXgsIGNvbnN0IGJhc2VUeXBlJiBlbGVtZW50KSB7DQorICAgICooYmFzZVR5cGUqKUNGWF9CYXNlTWFzc0FycmF5OjpBZGRTcGFjZVRvKGluZGV4KSA9IGVsZW1lbnQ7DQorICB9DQorICBpbnQzMl90IEFwcGVuZChjb25zdCBDRlhfTWFzc0FycmF5VGVtcGxhdGUmIHNyYywNCisgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0ID0gMCwNCisgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50ID0gLTEpIHsNCisgICAgcmV0dXJuIENGWF9CYXNlTWFzc0FycmF5OjpBcHBlbmQoc3JjLCBpU3RhcnQsIGlDb3VudCk7DQorICB9DQorICBpbnQzMl90IENvcHkoY29uc3QgQ0ZYX01hc3NBcnJheVRlbXBsYXRlJiBzcmMsDQorICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQgPSAwLA0KKyAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50ID0gLTEpIHsNCisgICAgcmV0dXJuIENGWF9CYXNlTWFzc0FycmF5OjpDb3B5KHNyYywgaVN0YXJ0LCBpQ291bnQpOw0KKyAgfQ0KKyAgaW50MzJfdCBSZW1vdmVMYXN0KGludDMyX3QgaUNvdW50ID0gLTEpIHsNCisgICAgcmV0dXJuIENGWF9CYXNlTWFzc0FycmF5OjpSZW1vdmVMYXN0KGlDb3VudCk7DQorICB9DQorICB2b2lkIFJlbW92ZUFsbChGWF9CT09MIGJMZWF2ZU1lbW9yeSA9IEZBTFNFKSB7DQorICAgIENGWF9CYXNlTWFzc0FycmF5OjpSZW1vdmVBbGwoYkxlYXZlTWVtb3J5KTsNCisgIH0NCit9Ow0KK3R5cGVkZWYgQ0ZYX01hc3NBcnJheVRlbXBsYXRlPHZvaWQqPiBDRlhfUHRyTWFzc0FycmF5Ow0KK3R5cGVkZWYgQ0ZYX01hc3NBcnJheVRlbXBsYXRlPGludDMyX3Q+IENGWF9JbnQzMk1hc3NBcnJheTsNCit0eXBlZGVmIENGWF9NYXNzQXJyYXlUZW1wbGF0ZTxGWF9EV09SRD4gQ0ZYX0RXb3JkTWFzc0FycmF5Ow0KK3R5cGVkZWYgQ0ZYX01hc3NBcnJheVRlbXBsYXRlPEZYX1dPUkQ+IENGWF9Xb3JkTWFzc0FycmF5Ow0KK3R5cGVkZWYgQ0ZYX01hc3NBcnJheVRlbXBsYXRlPENGWF9SZWN0PiBDRlhfUmVjdE1hc3NBcnJheTsNCit0eXBlZGVmIENGWF9NYXNzQXJyYXlUZW1wbGF0ZTxDRlhfUmVjdEY+IENGWF9SZWN0Rk1hc3NBcnJheTsNCit0ZW1wbGF0ZSA8Y2xhc3MgYmFzZVR5cGU+DQorY2xhc3MgQ0ZYX09iamVjdE1hc3NBcnJheVRlbXBsYXRlIDogcHVibGljIENGWF9CYXNlTWFzc0FycmF5IHsNCisgcHVibGljOg0KKyAgQ0ZYX09iamVjdE1hc3NBcnJheVRlbXBsYXRlKGludDMyX3QgaUNodW5rU2l6ZSA9IDEwMCkNCisgICAgICA6IENGWF9CYXNlTWFzc0FycmF5KGlDaHVua1NpemUsIHNpemVvZihiYXNlVHlwZSkpIHt9DQorICB+Q0ZYX09iamVjdE1hc3NBcnJheVRlbXBsYXRlKCkgeyBSZW1vdmVBbGwoRkFMU0UpOyB9DQorICBpbnQzMl90IEdldFNpemUoKSBjb25zdCB7IHJldHVybiBDRlhfQmFzZU1hc3NBcnJheTo6R2V0U2l6ZSgpOyB9DQorICBpbnQzMl90IEFkZChjb25zdCBiYXNlVHlwZSYgZWxlbWVudCkgew0KKyAgICBpbnQzMl90IGluZGV4ID0gQ0ZYX0Jhc2VNYXNzQXJyYXk6OkdldFNpemUoKTsNCisgICAgYmFzZVR5cGUqIHAgPSAoYmFzZVR5cGUqKUNGWF9CYXNlTWFzc0FycmF5OjpBZGRTcGFjZVRvKGluZGV4KTsNCisgICAgbmV3ICgodm9pZCopcCkgYmFzZVR5cGUoZWxlbWVudCk7DQorICAgIHJldHVybiBpbmRleDsNCisgIH0NCisgIGJhc2VUeXBlJiBHZXRBdChpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICAgIHJldHVybiAqKGJhc2VUeXBlKilDRlhfQmFzZU1hc3NBcnJheTo6R2V0QXQoaW5kZXgpOw0KKyAgfQ0KKyAgYmFzZVR5cGUqIEdldFB0ckF0KGludDMyX3QgaW5kZXgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VNYXNzQXJyYXk6OkdldEF0KGluZGV4KTsNCisgIH0NCisgIGludDMyX3QgQXBwZW5kKGNvbnN0IENGWF9PYmplY3RNYXNzQXJyYXlUZW1wbGF0ZSYgc3JjLA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQgPSAwLA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQgPSAtMSkgew0KKyAgICBpZiAoaUNvdW50ID09IDApIHsNCisgICAgICByZXR1cm4gQ0ZYX0Jhc2VNYXNzQXJyYXk6OkdldFNpemUoKTsNCisgICAgfQ0KKyAgICBpbnQzMl90IGlTaXplID0gc3JjLkdldFNpemUoKTsNCisgICAgRlhTWVNfYXNzZXJ0KGlTdGFydCA+IC0xICYmIGlTdGFydCA8IGlTaXplKTsNCisgICAgaWYgKGlDb3VudCA8IDApIHsNCisgICAgICBpQ291bnQgPSBpU2l6ZTsNCisgICAgfQ0KKyAgICBpbnQzMl90IGlFbmQgPSBpU3RhcnQgKyBpQ291bnQ7DQorICAgIGlmIChpRW5kID4gaVNpemUpIHsNCisgICAgICBpRW5kID0gaVNpemU7DQorICAgIH0NCisgICAgZm9yIChpbnQzMl90IGkgPSBpU3RhcnQ7IGkgPCBpRW5kOyBpKyspIHsNCisgICAgICBBZGQoc3JjLkdldEF0KGkpKTsNCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZYX0Jhc2VNYXNzQXJyYXk6OkdldFNpemUoKTsNCisgIH0NCisgIGludDMyX3QgQ29weShjb25zdCBDRlhfT2JqZWN0TWFzc0FycmF5VGVtcGxhdGUmIHNyYywNCisgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCA9IDAsDQorICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQgPSAtMSkgew0KKyAgICBpZiAoaUNvdW50ID09IDApIHsNCisgICAgICByZXR1cm4gQ0ZYX0Jhc2VNYXNzQXJyYXk6OkdldFNpemUoKTsNCisgICAgfQ0KKyAgICBpbnQzMl90IGlTaXplID0gc3JjLkdldFNpemUoKTsNCisgICAgRlhTWVNfYXNzZXJ0KGlTdGFydCA+IC0xICYmIGlTdGFydCA8IGlTaXplKTsNCisgICAgaWYgKGlDb3VudCA8IDApIHsNCisgICAgICBpQ291bnQgPSBpU2l6ZTsNCisgICAgfQ0KKyAgICBpbnQzMl90IGlFbmQgPSBpU3RhcnQgKyBpQ291bnQ7DQorICAgIGlmIChpRW5kID4gaVNpemUpIHsNCisgICAgICBpRW5kID0gaVNpemU7DQorICAgIH0NCisgICAgUmVtb3ZlQWxsKFRSVUUpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IGlTdGFydDsgaSA8IGlFbmQ7IGkrKykgew0KKyAgICAgIEFkZChzcmMuR2V0QXQoaSkpOw0KKyAgICB9DQorICAgIHJldHVybiBDRlhfQmFzZU1hc3NBcnJheTo6R2V0U2l6ZSgpOw0KKyAgfQ0KKyAgaW50MzJfdCBSZW1vdmVMYXN0KGludDMyX3QgaUNvdW50ID0gLTEpIHsNCisgICAgaW50MzJfdCBpU2l6ZSA9IENGWF9CYXNlTWFzc0FycmF5OjpHZXRTaXplKCk7DQorICAgIGlmIChpQ291bnQgPCAwIHx8IGlDb3VudCA+IGlTaXplKSB7DQorICAgICAgaUNvdW50ID0gaVNpemU7DQorICAgIH0NCisgICAgaWYgKGlDb3VudCA9PSAwKSB7DQorICAgICAgcmV0dXJuIGlTaXplOw0KKyAgICB9DQorICAgIGZvciAoaW50MzJfdCBpID0gaVNpemUgLSBpQ291bnQ7IGkgPCBpU2l6ZTsgaSsrKSB7DQorICAgICAgKChiYXNlVHlwZSopR2V0UHRyQXQoaSkpLT5+YmFzZVR5cGUoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZYX0Jhc2VNYXNzQXJyYXk6OlJlbW92ZUxhc3QoaUNvdW50KTsNCisgIH0NCisgIHZvaWQgUmVtb3ZlQWxsKEZYX0JPT0wgYkxlYXZlTWVtb3J5ID0gRkFMU0UpIHsNCisgICAgaW50MzJfdCBpU2l6ZSA9IENGWF9CYXNlTWFzc0FycmF5OjpHZXRTaXplKCk7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTaXplOyBpKyspIHsNCisgICAgICAoKGJhc2VUeXBlKilHZXRQdHJBdChpKSktPn5iYXNlVHlwZSgpOw0KKyAgICB9DQorICAgIENGWF9CYXNlTWFzc0FycmF5OjpSZW1vdmVBbGwoYkxlYXZlTWVtb3J5KTsNCisgIH0NCit9Ow0KK2NsYXNzIENGWF9CYXNlRGlzY3JldGVBcnJheSA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX0Jhc2VEaXNjcmV0ZUFycmF5KGludDMyX3QgaUNodW5rU2l6ZSwgaW50MzJfdCBpQmxvY2tTaXplKTsNCisgIH5DRlhfQmFzZURpc2NyZXRlQXJyYXkoKTsNCisgIHVpbnQ4X3QqIEFkZFNwYWNlVG8oaW50MzJfdCBpbmRleCk7DQorICB1aW50OF90KiBHZXRBdChpbnQzMl90IGluZGV4KSBjb25zdDsNCisgIHZvaWQgUmVtb3ZlQWxsKCk7DQorICB2b2lkKiBtX3BEYXRhOw0KK307DQordGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPg0KK2NsYXNzIENGWF9EaXNjcmV0ZUFycmF5VGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0Jhc2VEaXNjcmV0ZUFycmF5IHsNCisgcHVibGljOg0KKyAgQ0ZYX0Rpc2NyZXRlQXJyYXlUZW1wbGF0ZShpbnQzMl90IGlDaHVua1NpemUgPSAxMDApDQorICAgICAgOiBDRlhfQmFzZURpc2NyZXRlQXJyYXkoaUNodW5rU2l6ZSwgc2l6ZW9mKGJhc2VUeXBlKSkge30NCisgIGJhc2VUeXBlJiBHZXRBdChpbnQzMl90IGluZGV4LCBjb25zdCBiYXNlVHlwZSYgZGVmVmFsdWUpIGNvbnN0IHsNCisgICAgYmFzZVR5cGUqIHAgPSAoYmFzZVR5cGUqKUNGWF9CYXNlRGlzY3JldGVBcnJheTo6R2V0QXQoaW5kZXgpOw0KKyAgICByZXR1cm4gcCA9PSBOVUxMID8gKGJhc2VUeXBlJilkZWZWYWx1ZSA6ICpwOw0KKyAgfQ0KKyAgYmFzZVR5cGUqIEdldFB0ckF0KGludDMyX3QgaW5kZXgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VEaXNjcmV0ZUFycmF5OjpHZXRBdChpbmRleCk7DQorICB9DQorICB2b2lkIFNldEF0R3JvdyhpbnQzMl90IGluZGV4LCBjb25zdCBiYXNlVHlwZSYgZWxlbWVudCkgew0KKyAgICAqKGJhc2VUeXBlKilDRlhfQmFzZURpc2NyZXRlQXJyYXk6OkFkZFNwYWNlVG8oaW5kZXgpID0gZWxlbWVudDsNCisgIH0NCisgIHZvaWQgUmVtb3ZlQWxsKCkgeyBDRlhfQmFzZURpc2NyZXRlQXJyYXk6OlJlbW92ZUFsbCgpOyB9DQorfTsNCit0eXBlZGVmIENGWF9EaXNjcmV0ZUFycmF5VGVtcGxhdGU8dm9pZCo+IENGWF9QdHJEaXNjcmV0ZUFycmF5Ow0KK3R5cGVkZWYgQ0ZYX0Rpc2NyZXRlQXJyYXlUZW1wbGF0ZTxGWF9EV09SRD4gQ0ZYX0RXb3JkRGlzY3JldGVBcnJheTsNCit0eXBlZGVmIENGWF9EaXNjcmV0ZUFycmF5VGVtcGxhdGU8RlhfV09SRD4gQ0ZYX1dvcmREaXNjcmV0ZUFycmF5Ow0KK2NsYXNzIENGWF9CYXNlU3RhY2sgOiBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHByb3RlY3RlZDoNCisgIENGWF9CYXNlU3RhY2soaW50MzJfdCBpQ2h1bmtTaXplLCBpbnQzMl90IGlCbG9ja1NpemUpOw0KKyAgfkNGWF9CYXNlU3RhY2soKTsNCisgIHVpbnQ4X3QqIFB1c2goKTsNCisgIHZvaWQgUG9wKCk7DQorICB1aW50OF90KiBHZXRUb3BFbGVtZW50KCkgY29uc3Q7DQorICBpbnQzMl90IEdldFNpemUoKSBjb25zdDsNCisgIHVpbnQ4X3QqIEdldEF0KGludDMyX3QgaW5kZXgpIGNvbnN0Ow0KKyAgdm9pZCBSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkgPSBGQUxTRSk7DQorICBDRlhfQmFzZU1hc3NBcnJheUltcCogbV9wRGF0YTsNCit9Ow0KK3RlbXBsYXRlIDxjbGFzcyBiYXNlVHlwZT4NCitjbGFzcyBDRlhfU3RhY2tUZW1wbGF0ZSA6IHB1YmxpYyBDRlhfQmFzZVN0YWNrIHsNCisgcHVibGljOg0KKyAgQ0ZYX1N0YWNrVGVtcGxhdGUoaW50MzJfdCBpQ2h1bmtTaXplID0gMTAwKQ0KKyAgICAgIDogQ0ZYX0Jhc2VTdGFjayhpQ2h1bmtTaXplLCBzaXplb2YoYmFzZVR5cGUpKSB7fQ0KKyAgaW50MzJfdCBQdXNoKGNvbnN0IGJhc2VUeXBlJiBlbGVtZW50KSB7DQorICAgIGludDMyX3QgaW5kZXggPSBDRlhfQmFzZVN0YWNrOjpHZXRTaXplKCk7DQorICAgICooYmFzZVR5cGUqKUNGWF9CYXNlU3RhY2s6OlB1c2goKSA9IGVsZW1lbnQ7DQorICAgIHJldHVybiBpbmRleDsNCisgIH0NCisgIHZvaWQgUG9wKCkgeyBDRlhfQmFzZVN0YWNrOjpQb3AoKTsgfQ0KKyAgYmFzZVR5cGUqIEdldFRvcEVsZW1lbnQoKSBjb25zdCB7DQorICAgIHJldHVybiAoYmFzZVR5cGUqKUNGWF9CYXNlU3RhY2s6OkdldFRvcEVsZW1lbnQoKTsNCisgIH0NCisgIGludDMyX3QgR2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIENGWF9CYXNlU3RhY2s6OkdldFNpemUoKTsgfQ0KKyAgYmFzZVR5cGUqIEdldEF0KGludDMyX3QgaW5kZXgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VTdGFjazo6R2V0QXQoaW5kZXgpOw0KKyAgfQ0KKyAgdm9pZCBSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkgPSBGQUxTRSkgew0KKyAgICBDRlhfQmFzZVN0YWNrOjpSZW1vdmVBbGwoYkxlYXZlTWVtb3J5KTsNCisgIH0NCit9Ow0KK3R5cGVkZWYgQ0ZYX1N0YWNrVGVtcGxhdGU8dm9pZCo+IENGWF9QdHJTdGFjazsNCit0eXBlZGVmIENGWF9TdGFja1RlbXBsYXRlPEZYX0RXT1JEPiBDRlhfRFdvcmRTdGFjazsNCit0eXBlZGVmIENGWF9TdGFja1RlbXBsYXRlPEZYX1dPUkQ+IENGWF9Xb3JkU3RhY2s7DQordHlwZWRlZiBDRlhfU3RhY2tUZW1wbGF0ZTxpbnQzMl90PiBDRlhfSW50MzJTdGFjazsNCit0ZW1wbGF0ZSA8Y2xhc3MgYmFzZVR5cGU+DQorY2xhc3MgQ0ZYX09iamVjdFN0YWNrVGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0Jhc2VTdGFjayB7DQorIHB1YmxpYzoNCisgIENGWF9PYmplY3RTdGFja1RlbXBsYXRlKGludDMyX3QgaUNodW5rU2l6ZSA9IDEwMCkNCisgICAgICA6IENGWF9CYXNlU3RhY2soaUNodW5rU2l6ZSwgc2l6ZW9mKGJhc2VUeXBlKSkge30NCisgIH5DRlhfT2JqZWN0U3RhY2tUZW1wbGF0ZSgpIHsgUmVtb3ZlQWxsKCk7IH0NCisgIGludDMyX3QgUHVzaChjb25zdCBiYXNlVHlwZSYgZWxlbWVudCkgew0KKyAgICBpbnQzMl90IGluZGV4ID0gQ0ZYX0Jhc2VTdGFjazo6R2V0U2l6ZSgpOw0KKyAgICBiYXNlVHlwZSogcCA9IChiYXNlVHlwZSopQ0ZYX0Jhc2VTdGFjazo6UHVzaCgpOw0KKyAgICBuZXcgKCh2b2lkKilwKSBiYXNlVHlwZShlbGVtZW50KTsNCisgICAgcmV0dXJuIGluZGV4Ow0KKyAgfQ0KKyAgdm9pZCBQb3AoKSB7DQorICAgIGJhc2VUeXBlKiBwID0gKGJhc2VUeXBlKilDRlhfQmFzZVN0YWNrOjpHZXRUb3BFbGVtZW50KCk7DQorICAgIGlmIChwICE9IE5VTEwpIHsNCisgICAgICBwLT5+YmFzZVR5cGUoKTsNCisgICAgfQ0KKyAgICBDRlhfQmFzZVN0YWNrOjpQb3AoKTsNCisgIH0NCisgIGJhc2VUeXBlKiBHZXRUb3BFbGVtZW50KCkgY29uc3Qgew0KKyAgICByZXR1cm4gKGJhc2VUeXBlKilDRlhfQmFzZVN0YWNrOjpHZXRUb3BFbGVtZW50KCk7DQorICB9DQorICBpbnQzMl90IEdldFNpemUoKSBjb25zdCB7IHJldHVybiBDRlhfQmFzZVN0YWNrOjpHZXRTaXplKCk7IH0NCisgIGJhc2VUeXBlKiBHZXRBdChpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICAgIHJldHVybiAoYmFzZVR5cGUqKUNGWF9CYXNlU3RhY2s6OkdldEF0KGluZGV4KTsNCisgIH0NCisgIHZvaWQgUmVtb3ZlQWxsKEZYX0JPT0wgYkxlYXZlTWVtb3J5ID0gRkFMU0UpIHsNCisgICAgaW50MzJfdCBpU2l6ZSA9IENGWF9CYXNlU3RhY2s6OkdldFNpemUoKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7IGkrKykgew0KKyAgICAgICgoYmFzZVR5cGUqKUNGWF9CYXNlU3RhY2s6OkdldEF0KGkpKS0+fmJhc2VUeXBlKCk7DQorICAgIH0NCisgICAgQ0ZYX0Jhc2VTdGFjazo6UmVtb3ZlQWxsKGJMZWF2ZU1lbW9yeSk7DQorICB9DQorICBpbnQzMl90IENvcHkoY29uc3QgQ0ZYX09iamVjdFN0YWNrVGVtcGxhdGUmIHNyYywNCisgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCA9IDAsDQorICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQgPSAtMSkgew0KKyAgICBpZiAoaUNvdW50ID09IDApIHsNCisgICAgICByZXR1cm4gQ0ZYX0Jhc2VTdGFjazo6R2V0U2l6ZSgpOw0KKyAgICB9DQorICAgIGludDMyX3QgaVNpemUgPSBzcmMuR2V0U2l6ZSgpOw0KKyAgICBGWFNZU19hc3NlcnQoaVN0YXJ0ID4gLTEgJiYgaVN0YXJ0IDwgaVNpemUpOw0KKyAgICBpZiAoaUNvdW50IDwgMCkgew0KKyAgICAgIGlDb3VudCA9IGlTaXplOw0KKyAgICB9DQorICAgIGludDMyX3QgaUVuZCA9IGlTdGFydCArIGlDb3VudDsNCisgICAgaWYgKGlFbmQgPiBpU2l6ZSkgew0KKyAgICAgIGlFbmQgPSBpU2l6ZTsNCisgICAgfQ0KKyAgICBSZW1vdmVBbGwoVFJVRSk7DQorICAgIGZvciAoaW50MzJfdCBpID0gaVN0YXJ0OyBpIDwgaUVuZDsgaSsrKSB7DQorICAgICAgUHVzaCgqc3JjLkdldEF0KGkpKTsNCisgICAgfQ0KKyAgICByZXR1cm4gQ0ZYX0Jhc2VTdGFjazo6R2V0U2l6ZSgpOw0KKyAgfQ0KK307DQordGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPg0KK2NsYXNzIENGWF9DUExUcmVlTm9kZSA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgdHlwZWRlZiBDRlhfQ1BMVHJlZU5vZGU8YmFzZVR5cGU+IENQTFRyZWVOb2RlOw0KKyAgQ0ZYX0NQTFRyZWVOb2RlKCkNCisgICAgICA6IG1fcFBhcmVudE5vZGUoTlVMTCksDQorICAgICAgICBtX3BDaGlsZE5vZGUoTlVMTCksDQorICAgICAgICBtX3BQcmV2Tm9kZShOVUxMKSwNCisgICAgICAgIG1fcE5leHROb2RlKE5VTEwpLA0KKyAgICAgICAgbV9EYXRhKCkge30NCisgIGVudW0gVHJlZU5vZGUgew0KKyAgICBSb290ID0gMCwNCisgICAgUGFyZW50LA0KKyAgICBGaXJzdFNpYmxpbmcsDQorICAgIFByZXZpb3VzU2libGluZywNCisgICAgTmV4dFNpYmxpbmcsDQorICAgIExhc3RTaWJsaW5nLA0KKyAgICBGaXJzdE5laWdoYm9yLA0KKyAgICBQcmV2aW91c05laWdoYm9yLA0KKyAgICBOZXh0TmVpZ2hib3IsDQorICAgIExhc3ROZWlnaGJvciwNCisgICAgRmlyc3RDaGlsZCwNCisgICAgTGFzdENoaWxkDQorICB9Ow0KKyAgQ1BMVHJlZU5vZGUqIEdldE5vZGUoVHJlZU5vZGUgZU5vZGUpIGNvbnN0IHsNCisgICAgc3dpdGNoIChlTm9kZSkgew0KKyAgICAgIGNhc2UgUm9vdDogew0KKyAgICAgICAgQ1BMVHJlZU5vZGUqIHBQYXJlbnQgPSAoQ1BMVHJlZU5vZGUqKXRoaXM7DQorICAgICAgICBDUExUcmVlTm9kZSogcFRlbXA7DQorICAgICAgICB3aGlsZSAoKHBUZW1wID0gcFBhcmVudC0+bV9wUGFyZW50Tm9kZSkgIT0gTlVMTCkgew0KKyAgICAgICAgICBwUGFyZW50ID0gcFRlbXA7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcFBhcmVudDsNCisgICAgICB9DQorICAgICAgY2FzZSBQYXJlbnQ6DQorICAgICAgICByZXR1cm4gbV9wUGFyZW50Tm9kZTsNCisgICAgICBjYXNlIEZpcnN0U2libGluZzogew0KKyAgICAgICAgQ1BMVHJlZU5vZGUqIHBOb2RlID0gKENQTFRyZWVOb2RlKil0aGlzOw0KKyAgICAgICAgQ1BMVHJlZU5vZGUqIHBUZW1wOw0KKyAgICAgICAgd2hpbGUgKChwVGVtcCA9IHBOb2RlLT5tX3BQcmV2Tm9kZSkgIT0gTlVMTCkgew0KKyAgICAgICAgICBwTm9kZSA9IHBUZW1wOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHBOb2RlID09IChDUExUcmVlTm9kZSopdGhpcyA/IE5VTEwgOiBwTm9kZTsNCisgICAgICB9DQorICAgICAgY2FzZSBQcmV2aW91c1NpYmxpbmc6DQorICAgICAgICByZXR1cm4gbV9wUHJldk5vZGU7DQorICAgICAgY2FzZSBOZXh0U2libGluZzoNCisgICAgICAgIHJldHVybiBtX3BOZXh0Tm9kZTsNCisgICAgICBjYXNlIExhc3RTaWJsaW5nOiB7DQorICAgICAgICBDUExUcmVlTm9kZSogcE5vZGUgPSAoQ1BMVHJlZU5vZGUqKXRoaXM7DQorICAgICAgICBDUExUcmVlTm9kZSogcFRlbXA7DQorICAgICAgICB3aGlsZSAoKHBUZW1wID0gcE5vZGUtPm1fcE5leHROb2RlKSAhPSBOVUxMKSB7DQorICAgICAgICAgIHBOb2RlID0gcFRlbXA7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcE5vZGUgPT0gKENQTFRyZWVOb2RlKil0aGlzID8gTlVMTCA6IHBOb2RlOw0KKyAgICAgIH0NCisgICAgICBjYXNlIEZpcnN0TmVpZ2hib3I6IHsNCisgICAgICAgIENQTFRyZWVOb2RlKiBwUGFyZW50ID0gKENQTFRyZWVOb2RlKil0aGlzOw0KKyAgICAgICAgQ1BMVHJlZU5vZGUqIHBUZW1wOw0KKyAgICAgICAgd2hpbGUgKChwVGVtcCA9IHBQYXJlbnQtPm1fcFBhcmVudE5vZGUpICE9IE5VTEwpIHsNCisgICAgICAgICAgcFBhcmVudCA9IHBUZW1wOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHBQYXJlbnQgPT0gKENQTFRyZWVOb2RlKil0aGlzID8gTlVMTCA6IHBQYXJlbnQ7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgUHJldmlvdXNOZWlnaGJvcjogew0KKyAgICAgICAgaWYgKG1fcFByZXZOb2RlID09IE5VTEwpIHsNCisgICAgICAgICAgcmV0dXJuIG1fcFBhcmVudE5vZGU7DQorICAgICAgICB9DQorICAgICAgICBDUExUcmVlTm9kZSogcE5vZGUgPSBtX3BQcmV2Tm9kZTsNCisgICAgICAgIENQTFRyZWVOb2RlKiBwVGVtcDsNCisgICAgICAgIHdoaWxlICgocFRlbXAgPSBwTm9kZS0+bV9wQ2hpbGROb2RlKSAhPSBOVUxMKSB7DQorICAgICAgICAgIHBOb2RlID0gcFRlbXA7DQorICAgICAgICAgIHdoaWxlICgocFRlbXAgPSBwTm9kZS0+bV9wTmV4dE5vZGUpICE9IE5VTEwpIHsNCisgICAgICAgICAgICBwTm9kZSA9IHBUZW1wOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcE5vZGU7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgTmV4dE5laWdoYm9yOiB7DQorICAgICAgICBpZiAobV9wQ2hpbGROb2RlICE9IE5VTEwpIHsNCisgICAgICAgICAgcmV0dXJuIG1fcENoaWxkTm9kZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChtX3BOZXh0Tm9kZSAhPSBOVUxMKSB7DQorICAgICAgICAgIHJldHVybiBtX3BOZXh0Tm9kZTsNCisgICAgICAgIH0NCisgICAgICAgIENQTFRyZWVOb2RlKiBwTm9kZSA9IG1fcFBhcmVudE5vZGU7DQorICAgICAgICB3aGlsZSAocE5vZGUgIT0gTlVMTCkgew0KKyAgICAgICAgICBpZiAocE5vZGUtPm1fcE5leHROb2RlICE9IE5VTEwpIHsNCisgICAgICAgICAgICByZXR1cm4gcE5vZGUtPm1fcE5leHROb2RlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHBOb2RlID0gcE5vZGUtPm1fcFBhcmVudE5vZGU7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICB9DQorICAgICAgY2FzZSBMYXN0TmVpZ2hib3I6IHsNCisgICAgICAgIENQTFRyZWVOb2RlKiBwTm9kZSA9IChDUExUcmVlTm9kZSopdGhpczsNCisgICAgICAgIENQTFRyZWVOb2RlKiBwVGVtcDsNCisgICAgICAgIHdoaWxlICgocFRlbXAgPSBwTm9kZS0+bV9wUGFyZW50Tm9kZSkgIT0gTlVMTCkgew0KKyAgICAgICAgICBwTm9kZSA9IHBUZW1wOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd2hpbGUgKFRSVUUpIHsNCisgICAgICAgICAgQ1BMVHJlZU5vZGUqIHBUZW1wOw0KKyAgICAgICAgICB3aGlsZSAoKHBUZW1wID0gcE5vZGUtPm1fcE5leHROb2RlKSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgcE5vZGUgPSBwVGVtcDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAocE5vZGUtPm1fcENoaWxkTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcE5vZGUgPSBwTm9kZS0+bV9wQ2hpbGROb2RlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHBOb2RlID09IChDUExUcmVlTm9kZSopdGhpcyA/IE5VTEwgOiBwTm9kZTsNCisgICAgICB9DQorICAgICAgY2FzZSBGaXJzdENoaWxkOg0KKyAgICAgICAgcmV0dXJuIG1fcENoaWxkTm9kZTsNCisgICAgICBjYXNlIExhc3RDaGlsZDogew0KKyAgICAgICAgaWYgKG1fcENoaWxkTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1BMVHJlZU5vZGUqIHBDaGlsZCA9IG1fcENoaWxkTm9kZTsNCisgICAgICAgIENQTFRyZWVOb2RlKiBwVGVtcDsNCisgICAgICAgIHdoaWxlICgocFRlbXAgPSBwQ2hpbGQtPm1fcE5leHROb2RlKSAhPSBOVUxMKSB7DQorICAgICAgICAgIHBDaGlsZCA9IHBUZW1wOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHBDaGlsZDsNCisgICAgICB9DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgdm9pZCBTZXRQYXJlbnROb2RlKENQTFRyZWVOb2RlKiBwTm9kZSkgeyBtX3BQYXJlbnROb2RlID0gcE5vZGU7IH0NCisgIGludDMyX3QgQ291bnRDaGlsZE5vZGVzKCkgY29uc3Qgew0KKyAgICBpbnQzMl90IGlDb3VudCA9IDA7DQorICAgIENQTFRyZWVOb2RlKiBwTm9kZSA9IG1fcENoaWxkTm9kZTsNCisgICAgd2hpbGUgKHBOb2RlKSB7DQorICAgICAgaUNvdW50Kys7DQorICAgICAgcE5vZGUgPSBwTm9kZS0+bV9wTmV4dE5vZGU7DQorICAgIH0NCisgICAgcmV0dXJuIGlDb3VudDsNCisgIH0NCisgIENQTFRyZWVOb2RlKiBHZXRDaGlsZE5vZGUoaW50MzJfdCBpSW5kZXgpIGNvbnN0IHsNCisgICAgaW50MzJfdCBpQ291bnQgPSAwOw0KKyAgICBDUExUcmVlTm9kZSogcE5vZGUgPSBtX3BDaGlsZE5vZGU7DQorICAgIHdoaWxlIChwTm9kZSkgew0KKyAgICAgIGlmIChpSW5kZXggPT0gaUNvdW50KSB7DQorICAgICAgICByZXR1cm4gcE5vZGU7DQorICAgICAgfQ0KKyAgICAgIGlDb3VudCsrOw0KKyAgICAgIHBOb2RlID0gcE5vZGUtPm1fcE5leHROb2RlOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaW50MzJfdCBHZXROb2RlSW5kZXgoKSBjb25zdCB7DQorICAgIGludDMyX3QgaW5kZXggPSAwOw0KKyAgICBDUExUcmVlTm9kZSogcE5vZGUgPSBtX3BQcmV2Tm9kZTsNCisgICAgd2hpbGUgKHBOb2RlICE9IE5VTEwpIHsNCisgICAgICBpbmRleCsrOw0KKyAgICAgIHBOb2RlID0gcE5vZGUtPm1fcFByZXZOb2RlOw0KKyAgICB9DQorICAgIHJldHVybiBpbmRleDsNCisgIH0NCisgIEZYX0JPT0wgSXNQYXJlbnROb2RlKGNvbnN0IENQTFRyZWVOb2RlKiBwTm9kZSkgY29uc3Qgew0KKyAgICBDUExUcmVlTm9kZSogcFBhcmVudCA9IG1fcFBhcmVudE5vZGU7DQorICAgIHdoaWxlIChwUGFyZW50ICE9IE5VTEwpIHsNCisgICAgICBpZiAocFBhcmVudCA9PSBwTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfQ0KKyAgICAgIHBQYXJlbnQgPSBwUGFyZW50LT5HZXRUcmVlTm9kZShQYXJlbnQpOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZYX0JPT0wgSXNDaGlsZE5vZGUoY29uc3QgQ1BMVHJlZU5vZGUqIHBOb2RlKSBjb25zdCB7DQorICAgIGlmIChwTm9kZSA9PSBOVUxMKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHJldHVybiBwTm9kZS0+SXNQYXJlbnROb2RlKChjb25zdCBDUExUcmVlTm9kZSopdGhpcyk7DQorICB9DQorICB2b2lkIFNldENoaWxkTm9kZShDUExUcmVlTm9kZSogcE5vZGUpIHsgbV9wQ2hpbGROb2RlID0gcE5vZGU7IH0NCisgIHZvaWQgU2V0UHJldk5vZGUoQ1BMVHJlZU5vZGUqIHBOb2RlKSB7IG1fcFByZXZOb2RlID0gcE5vZGU7IH0NCisgIHZvaWQgU2V0TmV4dE5vZGUoQ1BMVHJlZU5vZGUqIHBOb2RlKSB7IG1fcE5leHROb2RlID0gcE5vZGU7IH0NCisgIGludDMyX3QgR2V0Tm9kZUxldmVsKCkgY29uc3Qgew0KKyAgICBpbnQzMl90IGlMZXZlbCA9IDA7DQorICAgIENQTFRyZWVOb2RlKiBwTm9kZSA9IChDUExUcmVlTm9kZSopdGhpczsNCisgICAgd2hpbGUgKChwTm9kZSA9IHBOb2RlLT5tX3BQYXJlbnROb2RlKSAhPSBOVUxMKSB7DQorICAgICAgaUxldmVsKys7DQorICAgIH0NCisgICAgcmV0dXJuIGlMZXZlbDsNCisgIH0NCisgIEZYX0JPT0wgSXNSb290Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fcFBhcmVudE5vZGUgPT0gTlVMTDsgfQ0KKyAgYmFzZVR5cGUgR2V0RGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fRGF0YTsgfQ0KKyAgdm9pZCBTZXREYXRhKGJhc2VUeXBlIGRhdGEpIHsgbV9EYXRhID0gZGF0YTsgfQ0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDUExUcmVlTm9kZSogbV9wUGFyZW50Tm9kZTsNCisgIENQTFRyZWVOb2RlKiBtX3BDaGlsZE5vZGU7DQorICBDUExUcmVlTm9kZSogbV9wUHJldk5vZGU7DQorICBDUExUcmVlTm9kZSogbV9wTmV4dE5vZGU7DQorICBiYXNlVHlwZSBtX0RhdGE7DQorICBmcmllbmQgY2xhc3MgQ0ZYX0NQTFRyZWU8YmFzZVR5cGU+Ow0KK307DQordGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPg0KK2NsYXNzIENGWF9DUExUcmVlIHsNCisgcHVibGljOg0KKyAgdHlwZWRlZiBDRlhfQ1BMVHJlZU5vZGU8YmFzZVR5cGU+IENQTFRyZWVOb2RlOw0KKyAgQ0ZYX0NQTFRyZWUoKSA6IG1fUm9vdCgpIHt9DQorICB+Q0ZYX0NQTFRyZWUoKSB7DQorICAgIENQTFRyZWVOb2RlKiBwTm9kZSA9IG1fUm9vdC5HZXROb2RlKENQTFRyZWVOb2RlOjpMYXN0TmVpZ2hib3IpOw0KKyAgICB3aGlsZSAocE5vZGUgIT0gTlVMTCkgew0KKyAgICAgIGlmIChwTm9kZS0+SXNSb290Tm9kZSgpKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgQ1BMVHJlZU5vZGUqIHBUZW1wID0gcE5vZGUtPkdldE5vZGUoQ1BMVHJlZU5vZGU6OlByZXZpb3VzTmVpZ2hib3IpOw0KKyAgICAgIGRlbGV0ZSBwTm9kZTsNCisgICAgICBwTm9kZSA9IHBUZW1wOw0KKyAgICB9DQorICB9DQorICBDUExUcmVlTm9kZSogR2V0Um9vdCgpIHsgcmV0dXJuICZtX1Jvb3Q7IH0NCisgIENQTFRyZWVOb2RlKiBBZGRDaGlsZChiYXNlVHlwZSBkYXRhLCBDUExUcmVlTm9kZSogcFBhcmVudCA9IE5VTEwpIHsNCisgICAgaWYgKHBQYXJlbnQgPT0gTlVMTCkgew0KKyAgICAgIHBQYXJlbnQgPSAmbV9Sb290Ow0KKyAgICB9DQorICAgIENQTFRyZWVOb2RlKiBwQ2hpbGQgPSBuZXcgQ1BMVHJlZU5vZGU7DQorICAgIHBDaGlsZC0+U2V0UGFyZW50Tm9kZShwUGFyZW50KTsNCisgICAgcENoaWxkLT5TZXREYXRhKGRhdGEpOw0KKyAgICBpZiAocFBhcmVudC0+bV9wQ2hpbGROb2RlID09IE5VTEwpIHsNCisgICAgICBwUGFyZW50LT5tX3BDaGlsZE5vZGUgPSBwQ2hpbGQ7DQorICAgIH0gZWxzZSB7DQorICAgICAgQ1BMVHJlZU5vZGUqIHBMYXN0ID0gcFBhcmVudC0+R2V0Tm9kZShDUExUcmVlTm9kZTo6TGFzdENoaWxkKTsNCisgICAgICBwQ2hpbGQtPlNldFByZXZOb2RlKHBMYXN0KTsNCisgICAgICBwTGFzdC0+U2V0TmV4dE5vZGUocENoaWxkKTsNCisgICAgfQ0KKyAgICByZXR1cm4gcENoaWxkOw0KKyAgfQ0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDUExUcmVlTm9kZSBtX1Jvb3Q7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9hbGdvcml0aG0uY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfYWxnb3JpdGhtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzg0ODQ1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfYWxnb3JpdGhtLmNwcApAQCAtMCwwICsxLDI5OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mZ2FzL3NyYy9mZ2FzX2Jhc2UuaCINCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYNCitjb25zdCBzdGF0aWMgRlhfQ0hBUiBnX0ZYQmFzZTY0RW5jb2Rlck1hcFs2NF0gPSB7DQorICAgICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0gnLCAnSScsICdKJywgJ0snLCAnTCcsICdNJywNCisgICAgJ04nLCAnTycsICdQJywgJ1EnLCAnUicsICdTJywgJ1QnLCAnVScsICdWJywgJ1cnLCAnWCcsICdZJywgJ1onLA0KKyAgICAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicsICdrJywgJ2wnLCAnbScsDQorICAgICduJywgJ28nLCAncCcsICdxJywgJ3InLCAncycsICd0JywgJ3UnLCAndicsICd3JywgJ3gnLCAneScsICd6JywNCisgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnKycsICcvJywNCit9Ow0KK3R5cGVkZWYgc3RydWN0IF9GWF9CQVNFNjREQVRBIHsNCisgIEZYX0RXT1JEIGRhdGExIDogMjsNCisgIEZYX0RXT1JEIGRhdGEyIDogNjsNCisgIEZYX0RXT1JEIGRhdGEzIDogNDsNCisgIEZYX0RXT1JEIGRhdGE0IDogNDsNCisgIEZYX0RXT1JEIGRhdGE1IDogNjsNCisgIEZYX0RXT1JEIGRhdGE2IDogMjsNCisgIEZYX0RXT1JEIGRhdGE3IDogODsNCit9IEZYX0JBU0U2NERBVEEsICpGWF9MUEJBU0U2NEVOQ09ERURBVEE7DQordHlwZWRlZiBGWF9CQVNFNjREQVRBIGNvbnN0KiBGWF9MUENCQVNFNjREQVRBOw0KK3N0YXRpYyB2b2lkIEZYX0Jhc2U2NEVuY29kZVBpZWNlKGNvbnN0IEZYX0JBU0U2NERBVEEmIHNyYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCeXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DSEFSIGRzdFs0XSkgew0KKyAgZHN0WzBdID0gZ19GWEJhc2U2NEVuY29kZXJNYXBbc3JjLmRhdGEyXTsNCisgIEZYX0RXT1JEIGIgPSBzcmMuZGF0YTEgPDwgNDsNCisgIGlmIChpQnl0ZXMgPiAxKSB7DQorICAgIGIgfD0gc3JjLmRhdGE0Ow0KKyAgfQ0KKyAgZHN0WzFdID0gZ19GWEJhc2U2NEVuY29kZXJNYXBbYl07DQorICBpZiAoaUJ5dGVzID4gMSkgew0KKyAgICBiID0gc3JjLmRhdGEzIDw8IDI7DQorICAgIGlmIChpQnl0ZXMgPiAyKSB7DQorICAgICAgYiB8PSBzcmMuZGF0YTY7DQorICAgIH0NCisgICAgZHN0WzJdID0gZ19GWEJhc2U2NEVuY29kZXJNYXBbYl07DQorICAgIGlmIChpQnl0ZXMgPiAyKSB7DQorICAgICAgZHN0WzNdID0gZ19GWEJhc2U2NEVuY29kZXJNYXBbc3JjLmRhdGE1XTsNCisgICAgfSBlbHNlIHsNCisgICAgICBkc3RbM10gPSAnPSc7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGRzdFsyXSA9IGRzdFszXSA9ICc9JzsNCisgIH0NCit9DQoraW50MzJfdCBGWF9CYXNlNjRFbmNvZGVBKGNvbnN0IHVpbnQ4X3QqIHBTcmMsIGludDMyX3QgaVNyY0xlbiwgRlhfQ0hBUiogcERzdCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBTcmMgIT0gTlVMTCk7DQorICBpZiAoaVNyY0xlbiA8IDEpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpZiAocERzdCA9PSBOVUxMKSB7DQorICAgIGludDMyX3QgaURzdExlbiA9IGlTcmNMZW4gLyAzICogNDsNCisgICAgaWYgKChpU3JjTGVuICUgMykgIT0gMCkgew0KKyAgICAgIGlEc3RMZW4gKz0gNDsNCisgICAgfQ0KKyAgICByZXR1cm4gaURzdExlbjsNCisgIH0NCisgIEZYX0JBU0U2NERBVEEgc3JjRGF0YTsNCisgIGludDMyX3QgaUJ5dGVzID0gMzsNCisgIEZYX0NIQVIqIHBEc3RFbmQgPSBwRHN0Ow0KKyAgd2hpbGUgKGlTcmNMZW4gPiAwKSB7DQorICAgIGlmIChpU3JjTGVuID4gMikgew0KKyAgICAgICgodWludDhfdCopJnNyY0RhdGEpWzBdID0gKnBTcmMrKzsNCisgICAgICAoKHVpbnQ4X3QqKSZzcmNEYXRhKVsxXSA9ICpwU3JjKys7DQorICAgICAgKCh1aW50OF90Kikmc3JjRGF0YSlbMl0gPSAqcFNyYysrOw0KKyAgICAgIGlTcmNMZW4gLT0gMzsNCisgICAgfSBlbHNlIHsNCisgICAgICAqKChGWF9EV09SRCopJnNyY0RhdGEpID0gMDsNCisgICAgICAoKHVpbnQ4X3QqKSZzcmNEYXRhKVswXSA9ICpwU3JjKys7DQorICAgICAgaWYgKGlTcmNMZW4gPiAxKSB7DQorICAgICAgICAoKHVpbnQ4X3QqKSZzcmNEYXRhKVsxXSA9ICpwU3JjKys7DQorICAgICAgfQ0KKyAgICAgIGlCeXRlcyA9IGlTcmNMZW47DQorICAgICAgaVNyY0xlbiA9IDA7DQorICAgIH0NCisgICAgRlhfQmFzZTY0RW5jb2RlUGllY2Uoc3JjRGF0YSwgaUJ5dGVzLCBwRHN0RW5kKTsNCisgICAgcERzdEVuZCArPSA0Ow0KKyAgfQ0KKyAgcmV0dXJuIHBEc3RFbmQgLSBwRHN0Ow0KK30NCitjb25zdCBzdGF0aWMgdWludDhfdCBnX0ZYQmFzZTY0RGVjb2Rlck1hcFsyNTZdID0gew0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDNFLCAweEZGLCAweEZGLCAweEZGLCAweDNGLA0KKyAgICAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LCAweDNBLCAweDNCLCAweDNDLCAweDNELCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LA0KKyAgICAweDA3LCAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLCAweDEwLCAweDExLCAweDEyLA0KKyAgICAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweDFBLCAweDFCLCAweDFDLCAweDFELCAweDFFLCAweDFGLCAweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LA0KKyAgICAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJBLCAweDJCLCAweDJDLCAweDJELCAweDJFLCAweDJGLCAweDMwLA0KKyAgICAweDMxLCAweDMyLCAweDMzLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLA0KK307DQorc3RhdGljIHZvaWQgRlhfQmFzZTY0RGVjb2RlUGllY2UoY29uc3QgRlhfQ0hBUiBzcmNbNF0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ2hhcnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQkFTRTY0REFUQSYgZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlCeXRlcykgew0KKyAgRlhTWVNfYXNzZXJ0KGlDaGFycyA+IDAgJiYgaUNoYXJzIDwgNSk7DQorICBpQnl0ZXMgPSAxOw0KKyAgZHN0LmRhdGEyID0gZ19GWEJhc2U2NERlY29kZXJNYXBbKHVpbnQ4X3Qpc3JjWzBdXTsNCisgIGlmIChpQ2hhcnMgPiAxKSB7DQorICAgIHVpbnQ4X3QgYiA9IGdfRlhCYXNlNjREZWNvZGVyTWFwWyh1aW50OF90KXNyY1sxXV07DQorICAgIGRzdC5kYXRhMSA9IGIgPj4gNDsNCisgICAgZHN0LmRhdGE0ID0gYjsNCisgICAgaWYgKGlDaGFycyA+IDIpIHsNCisgICAgICBpQnl0ZXMgPSAyOw0KKyAgICAgIGIgPSBnX0ZYQmFzZTY0RGVjb2Rlck1hcFsodWludDhfdClzcmNbMl1dOw0KKyAgICAgIGRzdC5kYXRhMyA9IGIgPj4gMjsNCisgICAgICBkc3QuZGF0YTYgPSBiOw0KKyAgICAgIGlmIChpQ2hhcnMgPiAzKSB7DQorICAgICAgICBpQnl0ZXMgPSAzOw0KKyAgICAgICAgZHN0LmRhdGE1ID0gZ19GWEJhc2U2NERlY29kZXJNYXBbKHVpbnQ4X3Qpc3JjWzNdXTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgZHN0LmRhdGE1ID0gMDsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgZHN0LmRhdGEzID0gMDsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgZHN0LmRhdGExID0gMDsNCisgIH0NCit9DQoraW50MzJfdCBGWF9CYXNlNjREZWNvZGVBKGNvbnN0IEZYX0NIQVIqIHBTcmMsIGludDMyX3QgaVNyY0xlbiwgdWludDhfdCogcERzdCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBTcmMgIT0gTlVMTCk7DQorICBpZiAoaVNyY0xlbiA8IDEpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICB3aGlsZSAoaVNyY0xlbiA+IDAgJiYgcFNyY1tpU3JjTGVuIC0gMV0gPT0gJz0nKSB7DQorICAgIGlTcmNMZW4tLTsNCisgIH0NCisgIGlmIChpU3JjTGVuIDwgMSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGlmIChwRHN0ID09IE5VTEwpIHsNCisgICAgaW50MzJfdCBpRHN0TGVuID0gaVNyY0xlbiAvIDQgKiAzOw0KKyAgICBpU3JjTGVuICU9IDQ7DQorICAgIGlmIChpU3JjTGVuID09IDEpIHsNCisgICAgICBpRHN0TGVuICs9IDE7DQorICAgIH0gZWxzZSBpZiAoaVNyY0xlbiA9PSAyKSB7DQorICAgICAgaURzdExlbiArPSAxOw0KKyAgICB9IGVsc2UgaWYgKGlTcmNMZW4gPT0gMykgew0KKyAgICAgIGlEc3RMZW4gKz0gMjsNCisgICAgfQ0KKyAgICByZXR1cm4gaURzdExlbjsNCisgIH0NCisgIEZYX0NIQVIgc3JjRGF0YVs0XTsNCisgIEZYX0JBU0U2NERBVEEgZHN0RGF0YTsNCisgIGludDMyX3QgaUNoYXJzID0gNCwgaUJ5dGVzOw0KKyAgdWludDhfdCogcERzdEVuZCA9IHBEc3Q7DQorICB3aGlsZSAoaVNyY0xlbiA+IDApIHsNCisgICAgaWYgKGlTcmNMZW4gPiAzKSB7DQorICAgICAgKigoRlhfRFdPUkQqKXNyY0RhdGEpID0gKigoRlhfRFdPUkQqKXBTcmMpOw0KKyAgICAgIHBTcmMgKz0gNDsNCisgICAgICBpU3JjTGVuIC09IDQ7DQorICAgIH0gZWxzZSB7DQorICAgICAgKigoRlhfRFdPUkQqKSZkc3REYXRhKSA9IDA7DQorICAgICAgKigoRlhfRFdPUkQqKXNyY0RhdGEpID0gMDsNCisgICAgICBzcmNEYXRhWzBdID0gKnBTcmMrKzsNCisgICAgICBpZiAoaVNyY0xlbiA+IDEpIHsNCisgICAgICAgIHNyY0RhdGFbMV0gPSAqcFNyYysrOw0KKyAgICAgIH0NCisgICAgICBpZiAoaVNyY0xlbiA+IDIpIHsNCisgICAgICAgIHNyY0RhdGFbMl0gPSAqcFNyYysrOw0KKyAgICAgIH0NCisgICAgICBpQ2hhcnMgPSBpU3JjTGVuOw0KKyAgICAgIGlTcmNMZW4gPSAwOw0KKyAgICB9DQorICAgIEZYX0Jhc2U2NERlY29kZVBpZWNlKHNyY0RhdGEsIGlDaGFycywgZHN0RGF0YSwgaUJ5dGVzKTsNCisgICAgKnBEc3RFbmQrKyA9ICgodWludDhfdCopJmRzdERhdGEpWzBdOw0KKyAgICBpZiAoaUJ5dGVzID4gMSkgew0KKyAgICAgICpwRHN0RW5kKysgPSAoKHVpbnQ4X3QqKSZkc3REYXRhKVsxXTsNCisgICAgfQ0KKyAgICBpZiAoaUJ5dGVzID4gMikgew0KKyAgICAgICpwRHN0RW5kKysgPSAoKHVpbnQ4X3QqKSZkc3REYXRhKVsyXTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHBEc3RFbmQgLSBwRHN0Ow0KK30NCitpbnQzMl90IEZYX0Jhc2U2NERlY29kZVcoY29uc3QgRlhfV0NIQVIqIHBTcmMsIGludDMyX3QgaVNyY0xlbiwgdWludDhfdCogcERzdCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBTcmMgIT0gTlVMTCk7DQorICBpZiAoaVNyY0xlbiA8IDEpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICB3aGlsZSAoaVNyY0xlbiA+IDAgJiYgcFNyY1tpU3JjTGVuIC0gMV0gPT0gJz0nKSB7DQorICAgIGlTcmNMZW4tLTsNCisgIH0NCisgIGlmIChpU3JjTGVuIDwgMSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGlmIChwRHN0ID09IE5VTEwpIHsNCisgICAgaW50MzJfdCBpRHN0TGVuID0gaVNyY0xlbiAvIDQgKiAzOw0KKyAgICBpU3JjTGVuICU9IDQ7DQorICAgIGlmIChpU3JjTGVuID09IDEpIHsNCisgICAgICBpRHN0TGVuICs9IDE7DQorICAgIH0gZWxzZSBpZiAoaVNyY0xlbiA9PSAyKSB7DQorICAgICAgaURzdExlbiArPSAxOw0KKyAgICB9IGVsc2UgaWYgKGlTcmNMZW4gPT0gMykgew0KKyAgICAgIGlEc3RMZW4gKz0gMjsNCisgICAgfQ0KKyAgICByZXR1cm4gaURzdExlbjsNCisgIH0NCisgIEZYX0NIQVIgc3JjRGF0YVs0XTsNCisgIEZYX0JBU0U2NERBVEEgZHN0RGF0YTsNCisgIGludDMyX3QgaUNoYXJzID0gNCwgaUJ5dGVzOw0KKyAgdWludDhfdCogcERzdEVuZCA9IHBEc3Q7DQorICB3aGlsZSAoaVNyY0xlbiA+IDApIHsNCisgICAgaWYgKGlTcmNMZW4gPiAzKSB7DQorICAgICAgc3JjRGF0YVswXSA9IChGWF9DSEFSKSpwU3JjKys7DQorICAgICAgc3JjRGF0YVsxXSA9IChGWF9DSEFSKSpwU3JjKys7DQorICAgICAgc3JjRGF0YVsyXSA9IChGWF9DSEFSKSpwU3JjKys7DQorICAgICAgc3JjRGF0YVszXSA9IChGWF9DSEFSKSpwU3JjKys7DQorICAgICAgaVNyY0xlbiAtPSA0Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgICooKEZYX0RXT1JEKikmZHN0RGF0YSkgPSAwOw0KKyAgICAgICooKEZYX0RXT1JEKilzcmNEYXRhKSA9IDA7DQorICAgICAgc3JjRGF0YVswXSA9IChGWF9DSEFSKSpwU3JjKys7DQorICAgICAgaWYgKGlTcmNMZW4gPiAxKSB7DQorICAgICAgICBzcmNEYXRhWzFdID0gKEZYX0NIQVIpKnBTcmMrKzsNCisgICAgICB9DQorICAgICAgaWYgKGlTcmNMZW4gPiAyKSB7DQorICAgICAgICBzcmNEYXRhWzJdID0gKEZYX0NIQVIpKnBTcmMrKzsNCisgICAgICB9DQorICAgICAgaUNoYXJzID0gaVNyY0xlbjsNCisgICAgICBpU3JjTGVuID0gMDsNCisgICAgfQ0KKyAgICBGWF9CYXNlNjREZWNvZGVQaWVjZShzcmNEYXRhLCBpQ2hhcnMsIGRzdERhdGEsIGlCeXRlcyk7DQorICAgICpwRHN0RW5kKysgPSAoKHVpbnQ4X3QqKSZkc3REYXRhKVswXTsNCisgICAgaWYgKGlCeXRlcyA+IDEpIHsNCisgICAgICAqcERzdEVuZCsrID0gKCh1aW50OF90KikmZHN0RGF0YSlbMV07DQorICAgIH0NCisgICAgaWYgKGlCeXRlcyA+IDIpIHsNCisgICAgICAqcERzdEVuZCsrID0gKCh1aW50OF90KikmZHN0RGF0YSlbMl07DQorICAgIH0NCisgIH0NCisgIHJldHVybiBwRHN0RW5kIC0gcERzdDsNCit9DQorY29uc3Qgc3RhdGljIHVpbnQ4X3QgZ19GWEhleDJEZWNNYXBbMjU2XSA9IHsNCisgICAgMCwgIDAsICAwLCAgMCwgMCwgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsICAwLA0KKyAgICAwLCAgMCwgIDAsICAwLCAwLCAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgIDAsDQorICAgIDAsICAwLCAgMCwgIDAsIDAsIDAsICAwLCAgMCwgIDAsICAxLCAgMiwgIDMsIDQsIDUsIDYsIDcsIDgsIDksICAwLCAgMCwNCisgICAgMCwgIDAsICAwLCAgMCwgMCwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsICAwLA0KKyAgICAwLCAgMCwgIDAsICAwLCAwLCAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAxMCwgMTEsIDEyLA0KKyAgICAxMywgMTQsIDE1LCAwLCAwLCAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgIDAsDQorICAgIDAsICAwLCAgMCwgIDAsIDAsIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAgMCwNCisgICAgMCwgIDAsICAwLCAgMCwgMCwgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsICAwLA0KKyAgICAwLCAgMCwgIDAsICAwLCAwLCAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgIDAsDQorICAgIDAsICAwLCAgMCwgIDAsIDAsIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAgMCwNCisgICAgMCwgIDAsICAwLCAgMCwgMCwgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsICAwLA0KKyAgICAwLCAgMCwgIDAsICAwLCAwLCAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgIDAsDQorICAgIDAsICAwLCAgMCwgIDAsIDAsIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDAsIDAsIDAsIDAsDQorfTsNCit1aW50OF90IEZYX0hleDJEZWModWludDhfdCBoZXhIaWdoLCB1aW50OF90IGhleExvdykgew0KKyAgcmV0dXJuIChnX0ZYSGV4MkRlY01hcFtoZXhIaWdoXSA8PCA0KSArIGdfRlhIZXgyRGVjTWFwW2hleExvd107DQorfQ0KK2ludDMyX3QgRlhfU2VwYXJhdGVTdHJpbmdXKGNvbnN0IEZYX1dDSEFSKiBwU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0ckxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiBkZWxpbWl0ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSYgcGllY2VzKSB7DQorICBpZiAocFN0ciA9PSBOVUxMKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaWYgKGlTdHJMZW4gPCAwKSB7DQorICAgIGlTdHJMZW4gPSBGWFNZU193Y3NsZW4ocFN0cik7DQorICB9DQorICBjb25zdCBGWF9XQ0hBUiogcFRva2VuID0gcFN0cjsNCisgIGNvbnN0IEZYX1dDSEFSKiBwRW5kID0gcFN0ciArIGlTdHJMZW47DQorICB3aGlsZSAoVFJVRSkgew0KKyAgICBpZiAocFN0ciA+PSBwRW5kIHx8IGRlbGltaXRlciA9PSAqcFN0cikgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHN1YihwVG9rZW4sIHBTdHIgLSBwVG9rZW4pOw0KKyAgICAgIHBpZWNlcy5BZGQoc3ViKTsNCisgICAgICBwVG9rZW4gPSBwU3RyICsgMTsNCisgICAgICBpZiAocFN0ciA+PSBwRW5kKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgcFN0cisrOw0KKyAgfQ0KKyAgcmV0dXJuIHBpZWNlcy5HZXRTaXplKCk7DQorfQ0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfY29kZXBhZ2UuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfY29kZXBhZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNDhkMzMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9jb2RlcGFnZS5jcHAKQEAgLTAsMCArMSwzNDAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZmdhcy9zcmMvZmdhc19iYXNlLmgiDQorc3RhdGljIGNvbnN0IEZYX0NIQVJTRVRfTUFQIGdfRlhDaGFyc2V0MkNvZGVQYWdlVGFibGVbXSA9IHsNCisgICAgezAsIDEyNTJ9LCAgIHsxLCAwfSwgICAgICB7MiwgNDJ9LCAgICAgezc3LCAxMDAwMH0sIHs3OCwgMTAwMDF9LA0KKyAgICB7NzksIDEwMDAzfSwgezgwLCAxMDAwOH0sIHs4MSwgMTAwMDJ9LCB7ODMsIDEwMDA1fSwgezg0LCAxMDAwNH0sDQorICAgIHs4NSwgMTAwMDZ9LCB7ODYsIDEwMDgxfSwgezg3LCAxMDAyMX0sIHs4OCwgMTAwMjl9LCB7ODksIDEwMDA3fSwNCisgICAgezEyOCwgOTMyfSwgIHsxMjksIDk0OX0sICB7MTMwLCAxMzYxfSwgezEzNCwgOTM2fSwgIHsxMzYsIDk1MH0sDQorICAgIHsxNjEsIDEyNTN9LCB7MTYyLCAxMjU0fSwgezE2MywgMTI1OH0sIHsxNzcsIDEyNTV9LCB7MTc4LCAxMjU2fSwNCisgICAgezE4NiwgMTI1N30sIHsyMDQsIDEyNTF9LCB7MjIyLCA4NzR9LCAgezIzOCwgMTI1MH0sIHsyNTQsIDQzN30sDQorICAgIHsyNTUsIDg1MH0sDQorfTsNCitGWF9XT1JEIEZYX0dldENvZGVQYWdlRnJvbUNoYXJzZXQodWludDhfdCBjaGFyc2V0KSB7DQorICBpbnQzMl90IGlFbmQgPSBzaXplb2YoZ19GWENoYXJzZXQyQ29kZVBhZ2VUYWJsZSkgLyBzaXplb2YoRlhfQ0hBUlNFVF9NQVApIC0gMTsNCisgIEZYU1lTX2Fzc2VydChpRW5kID49IDApOw0KKyAgaW50MzJfdCBpU3RhcnQgPSAwLCBpTWlkOw0KKyAgZG8gew0KKyAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgY29uc3QgRlhfQ0hBUlNFVF9NQVAmIGNwID0gZ19GWENoYXJzZXQyQ29kZVBhZ2VUYWJsZVtpTWlkXTsNCisgICAgaWYgKGNoYXJzZXQgPT0gY3AuY2hhcnNldCkgew0KKyAgICAgIHJldHVybiBjcC5jb2RlcGFnZTsNCisgICAgfSBlbHNlIGlmIChjaGFyc2V0IDwgY3AuY2hhcnNldCkgew0KKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgfQ0KKyAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgcmV0dXJuIDB4RkZGRjsNCit9DQorc3RhdGljIGNvbnN0IEZYX0NIQVJTRVRfTUFQIGdfRlhDb2RlcGFnZTJDaGFyc2V0VGFibGVbXSA9IHsNCisgICAgezEsIDB9LCAgICAgIHsyLCA0Mn0sICAgICB7MjU0LCA0Mzd9LCAgezI1NSwgODUwfSwgIHsyMjIsIDg3NH0sDQorICAgIHsxMjgsIDkzMn0sICB7MTM0LCA5MzZ9LCAgezEyOSwgOTQ5fSwgIHsxMzYsIDk1MH0sICB7MjM4LCAxMjUwfSwNCisgICAgezIwNCwgMTI1MX0sIHswLCAxMjUyfSwgICB7MTYxLCAxMjUzfSwgezE2MiwgMTI1NH0sIHsxNzcsIDEyNTV9LA0KKyAgICB7MTc4LCAxMjU2fSwgezE4NiwgMTI1N30sIHsxNjMsIDEyNTh9LCB7MTMwLCAxMzYxfSwgezc3LCAxMDAwMH0sDQorICAgIHs3OCwgMTAwMDF9LCB7NzksIDEwMDAzfSwgezgwLCAxMDAwOH0sIHs4MSwgMTAwMDJ9LCB7ODMsIDEwMDA1fSwNCisgICAgezg0LCAxMDAwNH0sIHs4NSwgMTAwMDZ9LCB7ODYsIDEwMDgxfSwgezg3LCAxMDAyMX0sIHs4OCwgMTAwMjl9LA0KKyAgICB7ODksIDEwMDA3fSwNCit9Ow0KK0ZYX1dPUkQgRlhfR2V0Q2hhcnNldEZyb21Db2RlUGFnZShGWF9XT1JEIGNvZGVwYWdlKSB7DQorICBpbnQzMl90IGlFbmQgPSBzaXplb2YoZ19GWENvZGVwYWdlMkNoYXJzZXRUYWJsZSkgLyBzaXplb2YoRlhfQ0hBUlNFVF9NQVApIC0gMTsNCisgIEZYU1lTX2Fzc2VydChpRW5kID49IDApOw0KKyAgaW50MzJfdCBpU3RhcnQgPSAwLCBpTWlkOw0KKyAgZG8gew0KKyAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgY29uc3QgRlhfQ0hBUlNFVF9NQVAmIGNwID0gZ19GWENvZGVwYWdlMkNoYXJzZXRUYWJsZVtpTWlkXTsNCisgICAgaWYgKGNvZGVwYWdlID09IGNwLmNvZGVwYWdlKSB7DQorICAgICAgcmV0dXJuIGNwLmNoYXJzZXQ7DQorICAgIH0gZWxzZSBpZiAoY29kZXBhZ2UgPCBjcC5jb2RlcGFnZSkgew0KKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgfQ0KKyAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgcmV0dXJuIDB4RkZGRjsNCit9DQorY29uc3QgRlhfTEFORzJDUE1BUCBnX0ZYTGFuZzJDb2RlcGFnZVRhYmxlW10gPSB7DQorICAgIHtGWF9MQU5HX0FyYWJpY19TYXVkaUFyYWJpYSwgRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljfSwNCisgICAge0ZYX0xBTkdfQnVsZ2FyaWFuX0J1bGdhcmlhLCBGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpY30sDQorICAgIHtGWF9MQU5HX0NhdGFsYW5fQ2F0YWxhbiwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQ2hpbmVzZV9UYWl3YW4sIEZYX0NPREVQQUdFX0NoaW5lc2VUcmFkaXRpb25hbH0sDQorICAgIHtGWF9MQU5HX0N6ZWNoUmVwdWJsaWMsIEZYX0NPREVQQUdFX01TV2luX0Vhc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX0RhbmlzaF9EZW5tYXJrLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19HZXJtYW5fR2VybWFueSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfR3JlZWtfR3JlZWNlLCBGWF9DT0RFUEFHRV9NU1dpbl9HcmVla30sDQorICAgIHtGWF9MQU5HX0VuZ2xpc2hfVW5pdGVkU3RhdGVzLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19TcGFuaXNoX1RyYWRpdGlvbmFsU29ydCwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfRmlubmlzaF9GaW5sYW5kLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19GcmVuY2hfRnJhbmNlLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19IZWJyZXdfSXNyYWVsLCBGWF9DT0RFUEFHRV9NU1dpbl9IZWJyZXd9LA0KKyAgICB7RlhfTEFOR19IdW5nYXJpYW5fSHVuZ2FyeSwgRlhfQ09ERVBBR0VfTVNXaW5fRWFzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfSWNlbGFuZGljX0ljZWxhbmQsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX0l0YWxpYW5fSXRhbHksIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX0phcGFuZXNlX0phcGFuLCBGWF9DT0RFUEFHRV9TaGlmdEpJU30sDQorICAgIHtGWF9MQU5HX0tvcmVhbl9Lb3JlYSwgRlhfQ09ERVBBR0VfS29yZWFufSwNCisgICAge0ZYX0xBTkdfRHV0Y2hfTmV0aGVybGFuZHMsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX05vcndlZ2lhbl9Cb2ttYWwsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1BvbGlzaF9Qb2xhbmQsIEZYX0NPREVQQUdFX01TV2luX0Vhc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1BvcnR1Z3Vlc2VfQnJhemlsLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19Sb21hbmlhbl9Sb21hbmlhLCBGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19SdXNzaWFuX1J1c3NpYSwgRlhfQ09ERVBBR0VfTVNXaW5fQ3lyaWxsaWN9LA0KKyAgICB7RlhfTEFOR19Dcm9hdGlhbl9Dcm9hdGlhLCBGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19TbG92YWtfU2xvdmFraWEsIEZYX0NPREVQQUdFX01TV2luX0Vhc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX0FsYmFuaWFuX0FsYmFuaWEsIEZYX0NPREVQQUdFX01TV2luX0Vhc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1N3ZWRpc2hfU3dlZGVuLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19UaGFpX1RoYWlsYW5kLCBGWF9DT0RFUEFHRV9NU0RPU19UaGFpfSwNCisgICAge0ZYX0xBTkdfVHVya2lzaF9UdXJrZXksIEZYX0NPREVQQUdFX01TV2luX1R1cmtpc2h9LA0KKyAgICB7RlhfTEFOR19VcmR1X1Bha2lzdGFuLCBGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWN9LA0KKyAgICB7RlhfTEFOR19JbmRvbmVzaWFuX0luZG9uZXNpYSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfVWtyYWluaWFuX1VrcmFpbmUsIEZYX0NPREVQQUdFX01TV2luX0N5cmlsbGljfSwNCisgICAge0ZYX0xBTkdfQmVsYXJ1c2lhbl9CZWxhcnVzLCBGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpY30sDQorICAgIHtGWF9MQU5HX1Nsb3Zlbmlhbl9TbG92ZW5pYSwgRlhfQ09ERVBBR0VfTVNXaW5fRWFzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfRXN0b25pYW5fRXN0b25pYSwgRlhfQ09ERVBBR0VfTVNXaW5fQmFsdGljfSwNCisgICAge0ZYX0xBTkdfTGF0dmlhbl9MYXR2aWEsIEZYX0NPREVQQUdFX01TV2luX0JhbHRpY30sDQorICAgIHtGWF9MQU5HX0xpdGh1YW5pYW5fTGl0aHVhbmlhLCBGWF9DT0RFUEFHRV9NU1dpbl9CYWx0aWN9LA0KKyAgICB7RlhfTEFOR19QZXJzaWFuLCBGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWN9LA0KKyAgICB7RlhfTEFOR19WaWV0bmFtZXNlX1ZpZXRuYW0sIEZYX0NPREVQQUdFX01TV2luX1ZpZXRuYW1lc2V9LA0KKyAgICB7RlhfTEFOR19Bcm1lbmlhbl9Bcm1lbmlhLCBGWF9DT0RFUEFHRV9EZWZBTlNJfSwNCisgICAge0ZYX0xBTkdfQXplcmJhaWphbl9MYXRpbiwgRlhfQ09ERVBBR0VfTVNXaW5fVHVya2lzaH0sDQorICAgIHtGWF9MQU5HX0Jhc3F1ZV9CYXNxdWUsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX01hY2Vkb25pYW4sIEZYX0NPREVQQUdFX01TV2luX0N5cmlsbGljfSwNCisgICAge0ZYX0xBTkdfQWZyaWthYW5zX1NvdXRoQWZyaWNhLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19HZW9yZ2lhbl9HZW9yZ2lhLCBGWF9DT0RFUEFHRV9EZWZBTlNJfSwNCisgICAge0ZYX0xBTkdfRmFyb2VzZV9GYXJvZUlzbGFuZHMsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX0hpbmRpX0luZGlhLCBGWF9DT0RFUEFHRV9EZWZBTlNJfSwNCisgICAge0ZYX0xBTkdfTWFsYXlfTWFsYXlzaWEsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX0themFraF9LYXpha2hzdGFuLCBGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpY30sDQorICAgIHtGWF9MQU5HX0t5cmd5el9LeXJneXpzdGFuLCBGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpY30sDQorICAgIHtGWF9MQU5HX0tpc3dhaGlsaV9LZW55YSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfVXpiZWtfTGF0aW5VemJla2lzdGFuLCBGWF9DT0RFUEFHRV9NU1dpbl9UdXJraXNofSwNCisgICAge0ZYX0xBTkdfVGF0YXJfUnVzc2lhLCBGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpY30sDQorICAgIHtGWF9MQU5HX1B1bmphYmlfSW5kaWEsIEZYX0NPREVQQUdFX0RlZkFOU0l9LA0KKyAgICB7RlhfTEFOR19HdWphcmF0aV9JbmRpYSwgRlhfQ09ERVBBR0VfRGVmQU5TSX0sDQorICAgIHtGWF9MQU5HX1RhbWlsX0luZGlhLCBGWF9DT0RFUEFHRV9EZWZBTlNJfSwNCisgICAge0ZYX0xBTkdfVGVsdWd1X0luZGlhLCBGWF9DT0RFUEFHRV9EZWZBTlNJfSwNCisgICAge0ZYX0xBTkdfS2FubmFkYV9JbmRpYSwgRlhfQ09ERVBBR0VfRGVmQU5TSX0sDQorICAgIHtGWF9MQU5HX01hcmF0aGlfSW5kaWEsIEZYX0NPREVQQUdFX0RlZkFOU0l9LA0KKyAgICB7RlhfTEFOR19TYW5za3JpdEluZGlhLCBGWF9DT0RFUEFHRV9EZWZBTlNJfSwNCisgICAge0ZYX0xBTkdfTW9uZ29saWFuX0N5cmlsbGljTW9uZ29saWEsIEZYX0NPREVQQUdFX01TV2luX0N5cmlsbGljfSwNCisgICAge0ZYX0xBTkdfR2FsaWNpYW5fR2FsaWNpYW4sIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX0tvbmthbmlfSW5kaWEsIEZYX0NPREVQQUdFX0RlZkFOU0l9LA0KKyAgICB7RlhfTEFOR19TeXJpYWNfU3lyaWEsIEZYX0NPREVQQUdFX0RlZkFOU0l9LA0KKyAgICB7RlhfTEFOR19EaXZlaGlfTWFsZGl2ZXMsIEZYX0NPREVQQUdFX0RlZkFOU0l9LA0KKyAgICB7RlhfTEFOR19BcmFiaWNfSXJhcSwgRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljfSwNCisgICAge0ZYX0xBTkdfQ2hpbmVzZV9QUkMsIEZYX0NPREVQQUdFX0NoaW5lc2VTaW1wbGlmaWVkfSwNCisgICAge0ZYX0xBTkdfR2VybWFuX1N3aXR6ZXJsYW5kLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19FbmdsaXNoX1VuaXRlZEtpbmdkb20sIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1NwYW5pc2hfTWV4aWNvLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19GcmVuY2hfQmVsZ2l1bSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfSXRhbGlhbl9Td2l0emVybGFuZCwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfRHV0Y2hfQmVsZ2l1bSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfTm9yd2VnaWFuX055bm9yc2ssIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1BvcnR1Z3Vlc2VfUG9ydHVnYWwsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1NlcmJpYW5MYXRpbl9TZXJiaWEsIEZYX0NPREVQQUdFX01TV2luX0Vhc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1N3ZWRpc2hfRmlubGFuZCwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXplcmJhaWphbl9DeXJpbGxpYywgRlhfQ09ERVBBR0VfTVNXaW5fQ3lyaWxsaWN9LA0KKyAgICB7RlhfTEFOR19NYWxheV9CcnVuZWlEYXJ1c3NhbGFtLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19VemJla19DeXJpbGxpY1V6YmVraXN0YW4sIEZYX0NPREVQQUdFX01TV2luX0N5cmlsbGljfSwNCisgICAge0ZYX0xBTkdfQXJhYmljX0VneXB0LCBGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWN9LA0KKyAgICB7RlhfTEFOR19DaGluZXNlX0hvbmdLb25nLCBGWF9DT0RFUEFHRV9DaGluZXNlVHJhZGl0aW9uYWx9LA0KKyAgICB7RlhfTEFOR19HZXJtYW5fQXVzdHJpYSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfRW5nbGlzaF9BdXN0cmFsaWEsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1NwYW5pc2hfSW50ZXJuYXRpb25hbFNvcnQsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX0ZyZW5jaF9DYW5hZGEsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1NlcmJpYW5DeXJpbGxpY19TZXJiaWEsIEZYX0NPREVQQUdFX01TV2luX0N5cmlsbGljfSwNCisgICAge0ZYX0xBTkdfQXJhYmljX0xpYnlhLCBGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWN9LA0KKyAgICB7RlhfTEFOR19DaGluZXNlX1NpbmdhcG9yZSwgRlhfQ09ERVBBR0VfQ2hpbmVzZVNpbXBsaWZpZWR9LA0KKyAgICB7RlhfTEFOR19HZXJtYW5fTHV4ZW1ib3VyZywgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfRW5nbGlzaF9DYW5hZGEsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1NwYW5pc2hfR3VhdGVtYWxhLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19GcmVuY2hfU3dpdHplcmxhbmQsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX0FyYWJpY19BbGdlcmlhLCBGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWN9LA0KKyAgICB7RlhfTEFOR19DaGluZXNlX01hY2FvLCBGWF9DT0RFUEFHRV9DaGluZXNlVHJhZGl0aW9uYWx9LA0KKyAgICB7RlhfTEFOR19HZXJtYW5fTGllY2h0ZW5zdGVpbiwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfRW5nbGlzaF9OZXdaZWFsYW5kLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19TcGFuaXNoX0Nvc3RhUmljYSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfRnJlbmNoX0x1eGVtYm91cmcsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX0FyYWJpY19Nb3JvY2NvLCBGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWN9LA0KKyAgICB7RlhfTEFOR19FbmdsaXNoX0lyZWxhbmQsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1NwYW5pc2hfUGFuYW1hLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19GcmVuY2hfTW9uYWNvLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19BcmFiaWNfVHVuaXNpYSwgRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljfSwNCisgICAge0ZYX0xBTkdfRW5nbGlzaF9Tb3V0aEFmcmljYSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9Eb21pbmljYW5SZXB1YmxpYywgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXJhYmljX09tYW4sIEZYX0NPREVQQUdFX01TV2luX0FyYWJpY30sDQorICAgIHtGWF9MQU5HX0VuZ2xpc2hfSmFtYWljYSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9WZW5lenVlbGEsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX0FyYWJpY19ZZW1lbiwgRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljfSwNCisgICAge0ZYX0xBTkdfRW5nbGlzaF9DYXJpYmJlYW4sIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1NwYW5pc2hfQ29sb21iaWEsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX0FyYWJpY19TeXJpYSwgRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljfSwNCisgICAge0ZYX0xBTkdfRW5nbGlzaF9CZWxpemUsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1NwYW5pc2hfUGVydSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXJhYmljX0pvcmRhbiwgRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljfSwNCisgICAge0ZYX0xBTkdfRW5nbGlzaF9UcmluaWRhZFRvYmFnbywgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9BcmdlbnRpbmEsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX0FyYWJpY19MZWJhbm9uLCBGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWN9LA0KKyAgICB7RlhfTEFOR19FbmdsaXNoX1ppbWJhYndlLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19TcGFuaXNoX0VjdWFkb3IsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX0FyYWJpY19LdXdhaXQsIEZYX0NPREVQQUdFX01TV2luX0FyYWJpY30sDQorICAgIHtGWF9MQU5HX0VuZ2xpc2hfUGhpbGlwcGluZXMsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1NwYW5pc2hfQ2hpbGUsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX0FyYWJpY19VQUUsIEZYX0NPREVQQUdFX01TV2luX0FyYWJpY30sDQorICAgIHtGWF9MQU5HX1NwYW5pc2hfVXJ1Z3VheSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwNCisgICAge0ZYX0xBTkdfQXJhYmljX0JhaHJhaW4sIEZYX0NPREVQQUdFX01TV2luX0FyYWJpY30sDQorICAgIHtGWF9MQU5HX1NwYW5pc2hfUGFyYWd1YXksIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX0FyYWJpY19RYXRhciwgRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljfSwNCisgICAge0ZYX0xBTkdfU3BhbmlzaF9Cb2xpdmlhLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19TcGFuaXNoX0VsU2FsdmFkb3IsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1NwYW5pc2hfSG9uZHVyYXMsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorICAgIHtGWF9MQU5HX1NwYW5pc2hfTmljYXJhZ3VhLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LA0KKyAgICB7RlhfTEFOR19TcGFuaXNoX1B1ZXJ0b1JpY28sIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sDQorfTsNCitGWF9XT1JEIEZYX0dldERlZkNvZGVQYWdlQnlMYW5ndWFnZShGWF9XT1JEIHdMYW5ndWFnZSkgew0KKyAgaW50MzJfdCBpRW5kID0gc2l6ZW9mKGdfRlhMYW5nMkNvZGVwYWdlVGFibGUpIC8gc2l6ZW9mKEZYX0xBTkcyQ1BNQVApIC0gMTsNCisgIEZYU1lTX2Fzc2VydChpRW5kID49IDApOw0KKyAgaW50MzJfdCBpU3RhcnQgPSAwLCBpTWlkOw0KKyAgZG8gew0KKyAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgY29uc3QgRlhfTEFORzJDUE1BUCYgY3AgPSBnX0ZYTGFuZzJDb2RlcGFnZVRhYmxlW2lNaWRdOw0KKyAgICBpZiAod0xhbmd1YWdlID09IGNwLndMYW5ndWFnZSkgew0KKyAgICAgIHJldHVybiBjcC53Q29kZXBhZ2U7DQorICAgIH0gZWxzZSBpZiAod0xhbmd1YWdlIDwgY3Aud0xhbmd1YWdlKSB7DQorICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICB9DQorICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICByZXR1cm4gMHhGRkZGOw0KK30NCitzdGF0aWMgY29uc3QgRlhfU1RSMkNQSEFTSCBnX0ZYQ1BIYXNoVGFibGVbXSA9IHsNCisgICAgezB4ZDQ1LCAweDZmYWZ9LCAgICAgIHsweGQ0NiwgMHg2ZmIwfSwgICAgICB7MHhkNDcsIDB4NmZiMX0sDQorICAgIHsweGQ0OCwgMHg2ZmIyfSwgICAgICB7MHhkNDksIDB4NGU2fSwgICAgICAgezB4ZDRkLCAweDZmYmR9LA0KKyAgICB7MHhlOWUsIDB4NGU0fSwgICAgICAgezB4Yzk5OCwgMHgxYjV9LCAgICAgIHsweDE4ZWYwLCAweDNhOH0sDQorICAgIHsweDE5Zjg1LCAweDUxODJ9LCAgICB7MHgyZTIzMzUsIDB4M2I2fSwgICAgezB4MzI1MTUzLCAweDUxODJ9LA0KKyAgICB7MHgxNDViZGVkLCAweDI3MTZ9LCAgezB4M2M5YTVmMiwgMHhjNmYzfSwgIHsweDRjNDVmMmQsIDB4M2E0fSwNCisgICAgezB4NGM0NWY0ZSwgMHhjNDMxfSwgIHsweDU4Y2FmNTEsIDB4NGU0fSwgICB7MHg1YTVjZDdkLCAweDNhOH0sDQorICAgIHsweDVhNmM2YTcsIDB4NGU0fSwgICB7MHg1YTZjYTBiLCAweDFiNX0sICAgezB4NWE2Y2Q2OCwgMHgzMDd9LA0KKyAgICB7MHg1YTZkOGQzLCAweDRlNH0sICAgezB4NWE2ZDk0OCwgMHgzNTR9LCAgIHsweDVhNmQ5NmIsIDB4MzYyfSwNCisgICAgezB4NWE2ZDk4NCwgMHgzNjZ9LCAgIHsweDVhOTBlMzUsIDB4MWI1fSwgICB7MHg1ZTBjZjAwLCAweDZmYjV9LA0KKyAgICB7MHg2MDljMzI0LCAweDU1MX0sICAgezB4NjE3ZDk3ZiwgMHg1MTgyfSwgIHsweDZhNmZkOTEsIDB4ZmRlOH0sDQorICAgIHsweDZhNmZkOTIsIDB4ZmRlOX0sICB7MHg2YjEwMmRlLCAweGNhZGN9LCAgezB4NmIxMGY0OCwgMHg0ZTg5fSwNCisgICAgezB4MTAyMDgwNWYsIDB4NGU0fSwgIHsweDEwZjA1MjRjLCAweDZmYjV9LCB7MHgxMWQ1NThmZSwgMHg2ZmIwfSwNCisgICAgezB4MTM4OThkMTksIDB4YzQyZH0sIHsweDEzODk4ZDNhLCAweGM0MzF9LCB7MHgxMzhhMzE5ZSwgMHg2ZmIxfSwNCisgICAgezB4MTQ2NzljMDksIDB4OTZjNn0sIHsweDE1M2YwYTNkLCAweDZmYjJ9LCB7MHgxNTc2ZWViMywgMHg0ZTIwfSwNCisgICAgezB4MTY5YTBjZTYsIDB4YzZmOX0sIHsweDE2ZjNlMmRjLCAweDZmYjN9LCB7MHgxOGE4YmI3YSwgMHg2ZmI0fSwNCisgICAgezB4MWE1ZDk0MTksIDB4NmZiNX0sIHsweDFhODQ3YjQ4LCAweDNhOH0sICB7MHgxYjc2MjQxOSwgMHhjZWM4fSwNCisgICAgezB4MWI5ZDc4NDcsIDB4NDc1fSwgIHsweDFjMTI2Y2I5LCAweDZmYjZ9LCB7MHgxY2NkYmM3ZCwgMHg0ZjQyfSwNCisgICAgezB4MWQzMzBmNWYsIDB4MjcxNH0sIHsweDFkYzc0NTU5LCAweDRlNn0sICB7MHgxZWRkODBkYSwgMHg0ZTR9LA0KKyAgICB7MHgyM2U0YjAzZCwgMHhmZGU4fSwgezB4MjRmMjhhMTYsIDB4NGYzZH0sIHsweDI4NmU3YTMyLCAweDI3MTV9LA0KKyAgICB7MHgyYzdjMThlZCwgMHgzYTh9LCAgezB4MmUyMTAzYjcsIDB4MjcxM30sIHsweDMwNGJmNDc5LCAweDZmYjR9LA0KKyAgICB7MHgzMDRiZjQ3ZCwgMHg2ZmI1fSwgezB4MzA5YmI4NjksIDB4ZmRlOH0sIHsweDMwOWJiODZhLCAweGZkZTl9LA0KKyAgICB7MHgzMzY2NDM1NywgMHgzYjZ9LCAgezB4MzUyZDZiNDksIDB4M2E0fSwgIHsweDM2ZjU2NjFjLCAweDFiNX0sDQorICAgIHsweDM5MmU4ZjQ4LCAweGNhZGN9LCB7MHgzZGM3YzY0YywgMHg0N2N9LCAgezB4M2VkMmU4ZTEsIDB4NGU0fSwNCisgICAgezB4M2YwYzJmZWEsIDB4Y2FlZH0sIHsweDNmMGZlZjhmLCAweGM2ZjJ9LCB7MHgzZjVlMTMwZiwgMHg1MTgyfSwNCisgICAgezB4NDcxNzRkMWYsIDB4M2E4fSwgIHsweDQ5Njg2YjdiLCAweDZmYjR9LCB7MHg0YjgwYjBkOSwgMHgzYTR9LA0KKyAgICB7MHg0ZGNkYTk3YSwgMHg0ZTR9LCAgezB4NGRjZGE5YjYsIDB4NGU0fSwgIHsweDRlODgxZTZhLCAweDUyMjF9LA0KKyAgICB7MHg0ZmZkZjVhMSwgMHgzNmF9LCAgezB4NGZmZGY1YTUsIDB4NmZiZH0sIHsweDUyNDFjZTE2LCAweDRlOGJ9LA0KKyAgICB7MHg1NDZiYWI5ZCwgMHg0ZTR9LCAgezB4NTRhM2Q2NGUsIDB4NmZiNn0sIHsweDU2MjE3OWJkLCAweDUxNjF9LA0KKyAgICB7MHg1N2MxZGYxNSwgMHhjNmY3fSwgezB4NjFmZjZlNjIsIDB4NGYzNn0sIHsweDYzNTljN2Q4LCAweDRmMzV9LA0KKyAgICB7MHg2M2YzYzMzNSwgMHgzYTh9LCAgezB4NjQ1YTBmNzgsIDB4NDc3fSwgIHsweDY5MWFjMmZkLCAweDI3NWZ9LA0KKyAgICB7MHg2ZGMyZWFiMCwgMHgyZDB9LCAgezB4NmRjMmVlZWYsIDB4MzVlfSwgIHsweDZkYzJlZjEwLCAweDM2YX0sDQorICAgIHsweDcxMDMxMzhhLCAweDQ3ZH0sICB7MHg3MTBkZmJkMCwgMHhjNmY1fSwgezB4NzMxOWY2Y2IsIDB4MzZhfSwNCisgICAgezB4NzQ1MDk2YWQsIDB4M2E4fSwgIHsweDc0ODY2MjI5LCAweDRlOGN9LCB7MHg3NzE4NWZhNSwgMHgzYTh9LA0KKyAgICB7MHg3OTUzZjAwMiwgMHg2ZmFmfSwgezB4Nzk1M2YwMDMsIDB4NmZiMH0sIHsweDc5NTNmMDA0LCAweDZmYjF9LA0KKyAgICB7MHg3OTUzZjAwNSwgMHg2ZmIyfSwgezB4Nzk1M2YwMDYsIDB4NmZiN30sIHsweDc5NTNmMDBhLCAweDZmYmR9LA0KKyAgICB7MHg3YzU3NzU3MSwgMHgyNzYxfSwgezB4N2U4YzhmZjEsIDB4NDc5fSwgIHsweDgwMzFmNDdmLCAweDNiNX0sDQorICAgIHsweDgwMzFmNDgxLCAweDNiNX0sICB7MHg4MGM0YTcxMCwgMHg1MTg3fSwgezB4ODU3YzdlMTQsIDB4ZmRlOH0sDQorICAgIHsweDg1N2M3ZTE1LCAweGZkZTl9LCB7MHg4NmI1OWM5MCwgMHg0ZTR9LCAgezB4ODZiNTljOTEsIDB4NmZiMH0sDQorICAgIHsweDg2YjU5YzkyLCAweDZmYjF9LCB7MHg4NmI1OWM5MywgMHg2ZmIyfSwgezB4ODZiNTljOTQsIDB4NmZiM30sDQorICAgIHsweDg2YjU5Yzk1LCAweDZmYjR9LCB7MHg4NmI1OWM5NiwgMHg2ZmI1fSwgezB4ODZiNTljOTcsIDB4NGU3fSwNCisgICAgezB4ODZiNTljOTgsIDB4NGU2fSwgIHsweDhiNGIyNGVjLCAweDUxOTB9LCB7MHg4ZmFjZTM2MiwgMHg0ZTR9LA0KKyAgICB7MHg4ZmY5ZWMyYSwgMHhmZGU5fSwgezB4OTE5ZDM5ODksIDB4Y2FkY30sIHsweDk5NjdlNWFkLCAweDRlMjJ9LA0KKyAgICB7MHg5OWY4YjkzMywgMHg2ZmJkfSwgezB4OWJkMmEzODAsIDB4NGZjN30sIHsweDliZWZhZDIzLCAweDRmMzh9LA0KKyAgICB7MHg5YzdhYzY0OSwgMHg0ZjNjfSwgezB4YTAyNDY4ZGIsIDB4ZGVhZX0sIHsweGEwMjQ2OGVjLCAweGRlYWJ9LA0KKyAgICB7MHhhMDI0NjkyYSwgMHhkZWFhfSwgezB4YTAyNDY5OTcsIDB4ZGViMn0sIHsweGEwMjQ2OWZmLCAweGRlYjB9LA0KKyAgICB7MHhhMDI0NmEzZCwgMHhkZWIxfSwgezB4YTAyNDZhOGMsIDB4ZGVhZn0sIHsweGEwMjQ2YTlhLCAweGRlYjN9LA0KKyAgICB7MHhhMDI0NmIxNiwgMHhkZWFjfSwgezB4YTAyNDZiMWEsIDB4ZGVhZH0sIHsweGEwNzFhZGRjLCAweDRiMX0sDQorICAgIHsweGEzOGI2MmRjLCAweDQ3NH0sICB7MHhhNGMwOWZlZCwgMHgzYTh9LCAgezB4YTUxZTg2ZTUsIDB4NGU3fSwNCisgICAgezB4YTY3YWIxM2UsIDB4M2E0fSwgIHsweGE3NDE0MjQ0LCAweDUxYTl9LCB7MHhhOWRkYmVhZCwgMHhjNmZifSwNCisgICAgezB4YWIyNGZmYWIsIDB4NGU4YX0sIHsweGFiZWY4YWM0LCAweDI3MTB9LCB7MHhhYmZhMjBhYywgMHg2ZmI0fSwNCisgICAgezB4YWQzNjg5NWUsIDB4NGUyfSwgIHsweGFkMzY4OTVmLCAweDRlM30sICB7MHhhZjMxMGU5MCwgMHg0MDJ9LA0KKyAgICB7MHhhZjMxMTY2ZiwgMHg0ZTh9LCAgezB4YWY3Mjc3YTUsIDB4M2I2fSwgIHsweGFmYzBkOGIzLCAweDk2YzZ9LA0KKyAgICB7MHhiMGZkNWRiYSwgMHhjYWUwfSwgezB4YjBmZDVlOTUsIDB4Y2FkY30sIHsweGIxMDUyODkzLCAweDcxNDl9LA0KKyAgICB7MHhiMWU5ODc0NSwgMHgzNmF9LCAgezB4YjI3N2U5MWMsIDB4NTE2Nn0sIHsweGIyZjdlYWM1LCAweGNhZTB9LA0KKyAgICB7MHhiMmY3ZWJhMCwgMHhjYWRjfSwgezB4YjJmN2ViYzEsIDB4M2I1fSwgIHsweGI1M2ZhNzdkLCAweDNhOH0sDQorICAgIHsweGI2MzkxMTM4LCAweDZmYjV9LCB7MHhiNzM1OGI3ZiwgMHg2ZmI2fSwgezB4YjhjNDJiNDAsIDB4NGU0fSwNCisgICAgezB4YjhjNDJlYTQsIDB4MWI1fSwgIHsweGI4YzQzOWU3LCAweDJlMX0sICB7MHhiOGM0M2E2MSwgMHgzMDd9LA0KKyAgICB7MHhiOGM0M2Q2YywgMHg0ZTR9LCAgezB4YjhjNDNkZGYsIDB4MzUyfSwgIHsweGI4YzQzZGUxLCAweDM1NH0sDQorICAgIHsweGI4YzQzZGU2LCAweDM1OX0sICB7MHhiOGM0M2RmZiwgMHgzNWR9LCAgezB4YjhjNDNlMDQsIDB4MzYyfSwNCisgICAgezB4YjhjNDNlMDcsIDB4MzY1fSwgIHsweGJjZDI5YTdmLCAweDNhOH0sICB7MHhiY2UzNGU3OCwgMHg1MTgyfSwNCisgICAgezB4YmNlMzRlN2IsIDB4NTU2YX0sIHsweGJjZTgxNTA0LCAweDNiNX0sICB7MHhiZDhhNGM5NSwgMHgyNzJkfSwNCisgICAgezB4YmRkODlkYWQsIDB4NGU0fSwgIHsweGJkZDg5ZGFlLCAweDZmYjB9LCB7MHhiZGQ4OWRhZiwgMHg2ZmIxfSwNCisgICAgezB4YmRkODlkYjAsIDB4NmZiMn0sIHsweGJkZDg5ZGIxLCAweDRlNn0sICB7MHhiZGQ4OWRiNSwgMHg2ZmJkfSwNCisgICAgezB4YzE3NTZlOWYsIDB4MzZifSwgIHsweGM3NDgyNDQ0LCAweDQ3YX0sICB7MHhjOTI4MWMxOCwgMHg0ZTR9LA0KKyAgICB7MHhjOWVmOTVkZiwgMHg0N2J9LCAgezB4Y2NjOWRiMGQsIDB4NGU0fSwgIHsweGNjYzlkYjBlLCAweDZmYjB9LA0KKyAgICB7MHhjZDczNDI1ZiwgMHgzYjZ9LCAgezB4Y2UzOGI0MGIsIDB4NGIwfSwgIHsweGNlOTllNTQ5LCAweDI1fSwNCisgICAgezB4Y2Y1OTg3NDAsIDB4NGU3fSwgIHsweGNmNmQ2Zjc4LCAweDRlNH0sICB7MHhjZjc1OGRmNiwgMHgzYTR9LA0KKyAgICB7MHhkMTI2NmU1MSwgMHg2ZmI1fSwgezB4ZDI5MTAyMTMsIDB4MjcxOH0sIHsweGQyOTE5NmJiLCAweDI3MTJ9LA0KKyAgICB7MHhkM2ViMmZjMiwgMHg0NzZ9LCAgezB4ZDQ0MmRjMmMsIDB4NGZjNH0sIHsweGQ5ZGE0ZGE0LCAweDI3MTF9LA0KKyAgICB7MHhkYmFkMmY0MiwgMHg0ZTR9LCAgezB4ZGJhZDJmNDMsIDB4NmZiMH0sIHsweGRiYWQyZjQ0LCAweDZmYjF9LA0KKyAgICB7MHhkYmFkMmY0NSwgMHg2ZmIyfSwgezB4ZGJhZDJmNDYsIDB4NmZiM30sIHsweGRiYWQyZjQ3LCAweDZmYjR9LA0KKyAgICB7MHhkYmFkMmY0OCwgMHg2ZmI1fSwgezB4ZGJhZDJmNDksIDB4NmZiNn0sIHsweGRiYWQyZjRhLCAweDRlNn0sDQorICAgIHsweGRjNDM4MDMzLCAweDRmMzF9LCB7MHhkY2NiNDM5YiwgMHg0Nzd9LCAgezB4ZGNjZGM2MjYsIDB4M2I1fSwNCisgICAgezB4ZGQ4MGE1OTUsIDB4NGU0fSwgIHsweGRkODBhNTk2LCAweDZmYjB9LCB7MHhkZDgwYTU5ZSwgMHg2ZmIxfSwNCisgICAgezB4ZGQ4MGE1YjQsIDB4NmZiMn0sIHsweGRkODBhNWQ5LCAweDZmYjV9LCB7MHhkZDgwYTVkYSwgMHg2ZmI0fSwNCisgICAgezB4ZGQ4MGE1ZmEsIDB4NmZiNn0sIHsweGRkODBhNjE1LCAweDZmYjN9LCB7MHhkZDgwYTYxOSwgMHg0ZTZ9LA0KKyAgICB7MHhkZDgwYTYxYSwgMHgzYjV9LCAgezB4ZGQ4MGMwZjgsIDB4NGU5Zn0sIHsweGRmN2U0NmZmLCAweDRmYzh9LA0KKyAgICB7MHhkZjg2ODBmZCwgMHg1NTZhfSwgezB4ZGZiMGJkNmUsIDB4YzQyZH0sIHsweGRmZjA1NDg2LCAweDJjNH0sDQorICAgIHsweGUzMzIzMzk5LCAweDNhNH0sICB7MHhlNjA0MTJkZCwgMHgzYjV9LCAgezB4ZWVlNDdhZGQsIDB4NGIwfSwNCisgICAgezB4ZjAyMWExODYsIDB4NGUyfSwgIHsweGYwMjFhMTg3LCAweDRlM30sICB7MHhmMDIxYTE4OCwgMHg0ZTR9LA0KKyAgICB7MHhmMDIxYTE4OSwgMHg0ZTV9LCAgezB4ZjAyMWExOGEsIDB4NGU2fSwgIHsweGYwMjFhMThiLCAweDRlN30sDQorICAgIHsweGYwMjFhMThjLCAweDRlOH0sICB7MHhmMDIxYTE4ZCwgMHg0ZTl9LCAgezB4ZjAyMWExOGUsIDB4NGVhfSwNCisgICAgezB4ZjA3MDA0NTYsIDB4NmZiM30sIHsweGYyNzRmMTc1LCAweDNiNX0sICB7MHhmMmE5NzMwYiwgMHgzYTh9LA0KKyAgICB7MHhmM2Q0NjNjMiwgMHgzYTR9LCAgezB4ZjUyYTcwYTMsIDB4YzQyZX0sIHsweGY1NjkzMTQ3LCAweDZmYjN9LA0KKyAgICB7MHhmNjM3ZTE1NywgMHg0Nzh9LCAgezB4ZmMyMTNmM2EsIDB4MjcxN30sIHsweGZmNjU0ZDE0LCAweDNiNX0sDQorfTsNCitGWF9XT1JEIEZYX0dldENvZGVQYWdlRnJvbVN0cmluZ0EoY29uc3QgRlhfQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKSB7DQorICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMKTsNCisgIGlmIChpTGVuZ3RoIDwgMCkgew0KKyAgICBpTGVuZ3RoID0gRlhTWVNfc3RybGVuKHBTdHIpOw0KKyAgfQ0KKyAgaWYgKGlMZW5ndGggPT0gMCkgew0KKyAgICByZXR1cm4gMHhGRkZGOw0KKyAgfQ0KKyAgdWludDMyX3QgdUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0QShwU3RyLCBpTGVuZ3RoLCBUUlVFKTsNCisgIGludDMyX3QgaVN0YXJ0ID0gMCwgaU1pZDsNCisgIGludDMyX3QgaUVuZCA9IHNpemVvZihnX0ZYQ1BIYXNoVGFibGUpIC8gc2l6ZW9mKEZYX1NUUjJDUEhBU0gpIC0gMTsNCisgIEZYU1lTX2Fzc2VydChpRW5kID49IDApOw0KKyAgZG8gew0KKyAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgY29uc3QgRlhfU1RSMkNQSEFTSCYgY3AgPSBnX0ZYQ1BIYXNoVGFibGVbaU1pZF07DQorICAgIGlmICh1SGFzaCA9PSBjcC51SGFzaCkgew0KKyAgICAgIHJldHVybiAoRlhfV09SRCljcC51Q29kZVBhZ2U7DQorICAgIH0gZWxzZSBpZiAodUhhc2ggPCBjcC51SGFzaCkgew0KKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgfQ0KKyAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgcmV0dXJuIDB4RkZGRjsNCit9DQorRlhfV09SRCBGWF9HZXRDb2RlUGFnZUZvcm1TdHJpbmdXKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgpIHsNCisgIGlmIChpTGVuZ3RoIDwgMCkgew0KKyAgICBpTGVuZ3RoID0gRlhTWVNfd2NzbGVuKHBTdHIpOw0KKyAgfQ0KKyAgaWYgKGlMZW5ndGggPT0gMCkgew0KKyAgICByZXR1cm4gMHhGRkZGOw0KKyAgfQ0KKyAgQ0ZYX0J5dGVTdHJpbmcgY3NTdHI7DQorICBGWF9DSEFSKiBwQnVmID0gY3NTdHIuR2V0QnVmZmVyKGlMZW5ndGggKyAxKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMZW5ndGg7ICsraSkgew0KKyAgICAqcEJ1ZisrID0gKEZYX0NIQVIpKnBTdHIrKzsNCisgIH0NCisgIGNzU3RyLlJlbGVhc2VCdWZmZXIoaUxlbmd0aCk7DQorICByZXR1cm4gRlhfR2V0Q29kZVBhZ2VGcm9tU3RyaW5nQShjc1N0ciwgaUxlbmd0aCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X2VuY29kZS5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9lbmNvZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYzVhY2IKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9lbmNvZGUuY3BwCkBAIC0wLDAgKzEsMTkyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZnYXMvc3JjL2ZnYXNfYmFzZS5oIg0KK3ZvaWQgRlhfU3dhcEJ5dGVPcmRlcihGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKSB7DQorICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMKTsNCisgIGlmIChpTGVuZ3RoIDwgMCkgew0KKyAgICBpTGVuZ3RoID0gRlhTWVNfd2NzbGVuKHBTdHIpOw0KKyAgfQ0KKyAgRlhfV09SRCB3Y2g7DQorICBpZiAoc2l6ZW9mKEZYX1dDSEFSKSA+IDIpIHsNCisgICAgd2hpbGUgKGlMZW5ndGgtLSA+IDApIHsNCisgICAgICB3Y2ggPSAoRlhfV09SRCkqcFN0cjsNCisgICAgICB3Y2ggPSAod2NoID4+IDgpIHwgKHdjaCA8PCA4KTsNCisgICAgICB3Y2ggJj0gMHgwMEZGOw0KKyAgICAgICpwU3RyKysgPSB3Y2g7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIHdoaWxlIChpTGVuZ3RoLS0gPiAwKSB7DQorICAgICAgd2NoID0gKEZYX1dPUkQpKnBTdHI7DQorICAgICAgd2NoID0gKHdjaCA+PiA4KSB8ICh3Y2ggPDwgOCk7DQorICAgICAgKnBTdHIrKyA9IHdjaDsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIEZYX1N3YXBCeXRlT3JkZXJDb3B5KGNvbnN0IEZYX1dDSEFSKiBwU3JjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIqIHBEc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgpIHsNCisgIEZYU1lTX2Fzc2VydChwU3JjICE9IE5VTEwgJiYgcERzdCAhPSBOVUxMKTsNCisgIGlmIChpTGVuZ3RoIDwgMCkgew0KKyAgICBpTGVuZ3RoID0gRlhTWVNfd2NzbGVuKHBTcmMpOw0KKyAgfQ0KKyAgRlhfV09SRCB3Y2g7DQorICBpZiAoc2l6ZW9mKEZYX1dDSEFSKSA+IDIpIHsNCisgICAgd2hpbGUgKGlMZW5ndGgtLSA+IDApIHsNCisgICAgICB3Y2ggPSAoRlhfV09SRCkqcFNyYysrOw0KKyAgICAgIHdjaCA9ICh3Y2ggPj4gOCkgfCAod2NoIDw8IDgpOw0KKyAgICAgIHdjaCAmPSAweDAwRkY7DQorICAgICAgKnBEc3QrKyA9IHdjaDsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgd2hpbGUgKGlMZW5ndGgtLSA+IDApIHsNCisgICAgICB3Y2ggPSAoRlhfV09SRCkqcFNyYysrOw0KKyAgICAgIHdjaCA9ICh3Y2ggPj4gOCkgfCAod2NoIDw8IDgpOw0KKyAgICAgICpwRHN0KysgPSB3Y2g7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBGWF9VVEYxNlRvV0NoYXIodm9pZCogcEJ1ZmZlciwgaW50MzJfdCBpTGVuZ3RoKSB7DQorICBGWFNZU19hc3NlcnQocEJ1ZmZlciAhPSBOVUxMICYmIGlMZW5ndGggPiAwKTsNCisgIGlmIChzaXplb2YoRlhfV0NIQVIpID09IDIpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfV09SRCogcFNyYyA9IChGWF9XT1JEKilwQnVmZmVyOw0KKyAgRlhfV0NIQVIqIHBEc3QgPSAoRlhfV0NIQVIqKXBCdWZmZXI7DQorICB3aGlsZSAoLS1pTGVuZ3RoID49IDApIHsNCisgICAgcERzdFtpTGVuZ3RoXSA9IChGWF9XQ0hBUilwU3JjW2lMZW5ndGhdOw0KKyAgfQ0KK30NCit2b2lkIEZYX1VURjE2VG9XQ2hhckNvcHkoY29uc3QgRlhfV09SRCogcFVURjE2LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiogcFdDaGFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgpIHsNCisgIEZYU1lTX2Fzc2VydChwVVRGMTYgIT0gTlVMTCAmJiBwV0NoYXIgIT0gTlVMTCAmJiBpTGVuZ3RoID4gMCk7DQorICBpZiAoc2l6ZW9mKEZYX1dDSEFSKSA9PSAyKSB7DQorICAgIEZYU1lTX21lbWNweShwV0NoYXIsIHBVVEYxNiwgaUxlbmd0aCAqIHNpemVvZihGWF9XQ0hBUikpOw0KKyAgfSBlbHNlIHsNCisgICAgd2hpbGUgKC0taUxlbmd0aCA+PSAwKSB7DQorICAgICAgcFdDaGFyW2lMZW5ndGhdID0gKEZYX1dDSEFSKXBVVEYxNltpTGVuZ3RoXTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIEZYX1dDaGFyVG9VVEYxNih2b2lkKiBwQnVmZmVyLCBpbnQzMl90IGlMZW5ndGgpIHsNCisgIEZYU1lTX2Fzc2VydChwQnVmZmVyICE9IE5VTEwgJiYgaUxlbmd0aCA+IDApOw0KKyAgaWYgKHNpemVvZihGWF9XQ0hBUikgPT0gMikgew0KKyAgICByZXR1cm47DQorICB9DQorICBjb25zdCBGWF9XQ0hBUiogcFNyYyA9IChjb25zdCBGWF9XQ0hBUiopcEJ1ZmZlcjsNCisgIEZYX1dPUkQqIHBEc3QgPSAoRlhfV09SRCopcEJ1ZmZlcjsNCisgIHdoaWxlICgtLWlMZW5ndGggPj0gMCkgew0KKyAgICAqcERzdCsrID0gKEZYX1dPUkQpKnBTcmMrKzsNCisgIH0NCit9DQordm9pZCBGWF9XQ2hhclRvVVRGMTZDb3B5KGNvbnN0IEZYX1dDSEFSKiBwV0NoYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQqIHBVVEYxNiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoKSB7DQorICBGWFNZU19hc3NlcnQocFdDaGFyICE9IE5VTEwgJiYgcFVURjE2ICE9IE5VTEwgJiYgaUxlbmd0aCA+IDApOw0KKyAgaWYgKHNpemVvZihGWF9XQ0hBUikgPT0gMikgew0KKyAgICBGWFNZU19tZW1jcHkocFVURjE2LCBwV0NoYXIsIGlMZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgIH0gZWxzZSB7DQorICAgIHdoaWxlICgtLWlMZW5ndGggPj0gMCkgew0KKyAgICAgICpwVVRGMTYrKyA9IChGWF9XT1JEKSpwV0NoYXIrKzsNCisgICAgfQ0KKyAgfQ0KK30NCitpbmxpbmUgRlhfRFdPUkQgRlhfRFdvcmRGcm9tQnl0ZXMoY29uc3QgdWludDhfdCogcFN0cikgew0KKyAgcmV0dXJuIEZYQlNUUl9JRChwU3RyWzNdLCBwU3RyWzJdLCBwU3RyWzFdLCBwU3RyWzBdKTsNCit9DQoraW5saW5lIEZYX1dPUkQgRlhfV29yZEZyb21CeXRlcyhjb25zdCB1aW50OF90KiBwU3RyKSB7DQorICByZXR1cm4gKHBTdHJbMV0gPDwgOCB8IHBTdHJbMF0pOw0KK30NCitpbnQzMl90IEZYX0RlY29kZVN0cmluZyhGWF9XT1JEIHdDb2RlUGFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBwU3JjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBTcmNMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIqIHBEc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcERzdExlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJFcnJCcmVhaykgew0KKyAgaWYgKHdDb2RlUGFnZSA9PSBGWF9DT0RFUEFHRV9VVEY4KSB7DQorICAgIHJldHVybiBGWF9VVEY4RGVjb2RlKHBTcmMsIHBTcmNMZW4sIHBEc3QsIHBEc3RMZW4pOw0KKyAgfQ0KKyAgcmV0dXJuIC0xOw0KK30NCitpbnQzMl90IEZYX1VURjhEZWNvZGUoY29uc3QgRlhfQ0hBUiogcFNyYywNCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcFNyY0xlbiwNCisgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIqIHBEc3QsDQorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBEc3RMZW4pIHsNCisgIGlmIChwU3JjTGVuID09IE5VTEwgfHwgcERzdExlbiA9PSBOVUxMKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIGludDMyX3QgaVNyY0xlbiA9ICpwU3JjTGVuOw0KKyAgaWYgKGlTcmNMZW4gPCAxKSB7DQorICAgICpwU3JjTGVuID0gKnBEc3RMZW4gPSAwOw0KKyAgICByZXR1cm4gMTsNCisgIH0NCisgIGludDMyX3QgaURzdExlbiA9ICpwRHN0TGVuOw0KKyAgRlhfQk9PTCBiVmFsaWREc3QgPSAocERzdCAhPSBOVUxMICYmIGlEc3RMZW4gPiAwKTsNCisgIEZYX0RXT1JEIGR3Q29kZSA9IDA7DQorICBpbnQzMl90IGlQZW5kaW5nID0gMDsNCisgIGludDMyX3QgaVNyY051bSA9IDAsIGlEc3ROdW0gPSAwOw0KKyAgaW50MzJfdCBrID0gMDsNCisgIGludDMyX3QgaUluZGV4ID0gMDsNCisgIGsgPSAxOw0KKyAgd2hpbGUgKGlJbmRleCA8IGlTcmNMZW4pIHsNCisgICAgdWludDhfdCBieXRlID0gKHVpbnQ4X3QpICogKHBTcmMgKyBpSW5kZXgpOw0KKyAgICBpZiAoYnl0ZSA8IDB4ODApIHsNCisgICAgICBpUGVuZGluZyA9IDA7DQorICAgICAgayA9IDE7DQorICAgICAgaURzdE51bSsrOw0KKyAgICAgIGlTcmNOdW0gKz0gazsNCisgICAgICBpZiAoYlZhbGlkRHN0KSB7DQorICAgICAgICAqcERzdCsrID0gYnl0ZTsNCisgICAgICAgIGlmIChpRHN0TnVtID49IGlEc3RMZW4pIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGJ5dGUgPCAweGMwKSB7DQorICAgICAgaWYgKGlQZW5kaW5nIDwgMSkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlQZW5kaW5nLS07DQorICAgICAgZHdDb2RlIHw9IChieXRlICYgMHgzZikgPDwgKGlQZW5kaW5nICogNik7DQorICAgICAgaWYgKGlQZW5kaW5nID09IDApIHsNCisgICAgICAgIGlEc3ROdW0rKzsNCisgICAgICAgIGlTcmNOdW0gKz0gazsNCisgICAgICAgIGlmIChiVmFsaWREc3QpIHsNCisgICAgICAgICAgKnBEc3QrKyA9IGR3Q29kZTsNCisgICAgICAgICAgaWYgKGlEc3ROdW0gPj0gaURzdExlbikgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGJ5dGUgPCAweGUwKSB7DQorICAgICAgaVBlbmRpbmcgPSAxOw0KKyAgICAgIGsgPSAyOw0KKyAgICAgIGR3Q29kZSA9IChieXRlICYgMHgxZikgPDwgNjsNCisgICAgfSBlbHNlIGlmIChieXRlIDwgMHhmMCkgew0KKyAgICAgIGlQZW5kaW5nID0gMjsNCisgICAgICBrID0gMzsNCisgICAgICBkd0NvZGUgPSAoYnl0ZSAmIDB4MGYpIDw8IDEyOw0KKyAgICB9IGVsc2UgaWYgKGJ5dGUgPCAweGY4KSB7DQorICAgICAgaVBlbmRpbmcgPSAzOw0KKyAgICAgIGsgPSA0Ow0KKyAgICAgIGR3Q29kZSA9IChieXRlICYgMHgwNykgPDwgMTg7DQorICAgIH0gZWxzZSBpZiAoYnl0ZSA8IDB4ZmMpIHsNCisgICAgICBpUGVuZGluZyA9IDQ7DQorICAgICAgayA9IDU7DQorICAgICAgZHdDb2RlID0gKGJ5dGUgJiAweDAzKSA8PCAyNDsNCisgICAgfSBlbHNlIGlmIChieXRlIDwgMHhmZSkgew0KKyAgICAgIGlQZW5kaW5nID0gNTsNCisgICAgICBrID0gNjsNCisgICAgICBkd0NvZGUgPSAoYnl0ZSAmIDB4MDEpIDw8IDMwOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlJbmRleCsrOw0KKyAgfQ0KKyAgKnBTcmNMZW4gPSBpU3JjTnVtOw0KKyAgKnBEc3RMZW4gPSBpRHN0TnVtOw0KKyAgcmV0dXJuIDE7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X21lbW9yeS5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9tZW1vcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMTdkYzgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9tZW1vcnkuY3BwCkBAIC0wLDAgKzEsMzI0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlIDxhbGdvcml0aG0+DQorDQorI2luY2x1ZGUgInhmYS9zcmMvZmdhcy9zcmMvZmdhc19iYXNlLmgiDQorI2luY2x1ZGUgImZ4X21lbW9yeS5oIg0KKyNkZWZpbmUgRlhfNEJZVEVBTElHTihzaXplKSAoKChzaXplKSArIDMpIC8gNCAqIDQpDQorSUZYX01FTUFsbG9jYXRvciogRlhfQ3JlYXRlQWxsb2NhdG9yKEZYX0FMTE9DVFlQRSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNodW5rU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJsb2NrU2l6ZSkgew0KKyAgc3dpdGNoIChlVHlwZSkgew0KKyNpZm5kZWYgX0ZYRU1CDQorICAgIGNhc2UgRlhfQUxMT0NUWVBFX0R5bmFtaWM6DQorICAgICAgcmV0dXJuIG5ldyBDRlhfRHluYW1pY1N0b3JlKGNodW5rU2l6ZSk7DQorI2VuZGlmDQorICAgIGNhc2UgRlhfQUxMT0NUWVBFX0RlZmF1bHQ6DQorICAgICAgcmV0dXJuIG5ldyBDRlhfRGVmU3RvcmUoKTsNCisgICAgY2FzZSBGWF9BTExPQ1RZUEVfU3RhdGljOg0KKyAgICAgIHJldHVybiBuZXcgQ0ZYX1N0YXRpY1N0b3JlKGNodW5rU2l6ZSk7DQorICAgIGNhc2UgRlhfQUxMT0NUWVBFX0ZpeGVkOg0KKyAgICAgIHJldHVybiBuZXcgQ0ZYX0ZpeGVkU3RvcmUoYmxvY2tTaXplLCBjaHVua1NpemUpOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KK30NCitDRlhfU3RhdGljU3RvcmU6OkNGWF9TdGF0aWNTdG9yZShzaXplX3QgaURlZkNodW5rU2l6ZSkNCisgICAgOiBtX2lBbGxvY2F0ZWRTaXplKDApLA0KKyAgICAgIG1faURlZkNodW5rU2l6ZShpRGVmQ2h1bmtTaXplKSwNCisgICAgICBtX3BDaHVuayhOVUxMKSwNCisgICAgICBtX3BMYXN0Q2h1bmsoTlVMTCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1faURlZkNodW5rU2l6ZSAhPSAwKTsNCit9DQorQ0ZYX1N0YXRpY1N0b3JlOjp+Q0ZYX1N0YXRpY1N0b3JlKCkgew0KKyAgRlhfTFBTVEFUSUNTVE9SRUNIVU5LIHBDaHVuaywgcE5leHQ7DQorICBwQ2h1bmsgPSBtX3BDaHVuazsNCisgIHdoaWxlIChwQ2h1bmsgIT0gTlVMTCkgew0KKyAgICBwTmV4dCA9IHBDaHVuay0+cE5leHRDaHVuazsNCisgICAgRlhfRnJlZShwQ2h1bmspOw0KKyAgICBwQ2h1bmsgPSBwTmV4dDsNCisgIH0NCit9DQorRlhfTFBTVEFUSUNTVE9SRUNIVU5LIENGWF9TdGF0aWNTdG9yZTo6QWxsb2NDaHVuayhzaXplX3Qgc2l6ZSkgew0KKyAgRlhTWVNfYXNzZXJ0KHNpemUgIT0gMCk7DQorICBGWF9MUFNUQVRJQ1NUT1JFQ0hVTksgcENodW5rID0gKEZYX0xQU1RBVElDU1RPUkVDSFVOSylGWF9BbGxvYygNCisgICAgICB1aW50OF90LCBzaXplb2YoRlhfU1RBVElDU1RPUkVDSFVOSykgKyBzaXplKTsNCisgIHBDaHVuay0+aUNodW5rU2l6ZSA9IHNpemU7DQorICBwQ2h1bmstPmlGcmVlU2l6ZSA9IHNpemU7DQorICBwQ2h1bmstPnBOZXh0Q2h1bmsgPSBOVUxMOw0KKyAgaWYgKG1fcExhc3RDaHVuayA9PSBOVUxMKSB7DQorICAgIG1fcENodW5rID0gcENodW5rOw0KKyAgfSBlbHNlIHsNCisgICAgbV9wTGFzdENodW5rLT5wTmV4dENodW5rID0gcENodW5rOw0KKyAgfQ0KKyAgbV9wTGFzdENodW5rID0gcENodW5rOw0KKyAgcmV0dXJuIHBDaHVuazsNCit9DQorRlhfTFBTVEFUSUNTVE9SRUNIVU5LIENGWF9TdGF0aWNTdG9yZTo6RmluZENodW5rKHNpemVfdCBzaXplKSB7DQorICBGWFNZU19hc3NlcnQoc2l6ZSAhPSAwKTsNCisgIGlmIChtX3BMYXN0Q2h1bmsgPT0gTlVMTCB8fCBtX3BMYXN0Q2h1bmstPmlGcmVlU2l6ZSA8IHNpemUpIHsNCisgICAgcmV0dXJuIEFsbG9jQ2h1bmsoc3RkOjptYXgobV9pRGVmQ2h1bmtTaXplLCBzaXplKSk7DQorICB9DQorICByZXR1cm4gbV9wTGFzdENodW5rOw0KK30NCit2b2lkKiBDRlhfU3RhdGljU3RvcmU6OkFsbG9jKHNpemVfdCBzaXplKSB7DQorICBzaXplID0gRlhfNEJZVEVBTElHTihzaXplKTsNCisgIEZYU1lTX2Fzc2VydChzaXplICE9IDApOw0KKyAgRlhfTFBTVEFUSUNTVE9SRUNIVU5LIHBDaHVuayA9IEZpbmRDaHVuayhzaXplKTsNCisgIEZYU1lTX2Fzc2VydChwQ2h1bmsgIT0gTlVMTCAmJiBwQ2h1bmstPmlGcmVlU2l6ZSA+PSBzaXplKTsNCisgIHVpbnQ4X3QqIHAgPSAodWludDhfdCopcENodW5rOw0KKyAgcCArPSBzaXplb2YoRlhfU1RBVElDU1RPUkVDSFVOSykgKyBwQ2h1bmstPmlDaHVua1NpemUgLSBwQ2h1bmstPmlGcmVlU2l6ZTsNCisgIHBDaHVuay0+aUZyZWVTaXplIC09IHNpemU7DQorICBtX2lBbGxvY2F0ZWRTaXplICs9IHNpemU7DQorICByZXR1cm4gcDsNCit9DQorc2l6ZV90IENGWF9TdGF0aWNTdG9yZTo6U2V0RGVmQ2h1bmtTaXplKHNpemVfdCBzaXplKSB7DQorICBGWFNZU19hc3NlcnQoc2l6ZSAhPSAwKTsNCisgIHNpemVfdCB2ID0gbV9pRGVmQ2h1bmtTaXplOw0KKyAgbV9pRGVmQ2h1bmtTaXplID0gc2l6ZTsNCisgIHJldHVybiB2Ow0KK30NCitDRlhfRml4ZWRTdG9yZTo6Q0ZYX0ZpeGVkU3RvcmUoc2l6ZV90IGlCbG9ja1NpemUsIHNpemVfdCBpQmxvY2tOdW1zSW5DaHVuaykNCisgICAgOiBtX2lCbG9ja1NpemUoRlhfNEJZVEVBTElHTihpQmxvY2tTaXplKSksDQorICAgICAgbV9pRGVmQ2h1bmtTaXplKEZYXzRCWVRFQUxJR04oaUJsb2NrTnVtc0luQ2h1bmspKSwNCisgICAgICBtX3BDaHVuayhOVUxMKSB7DQorICBGWFNZU19hc3NlcnQobV9pQmxvY2tTaXplICE9IDAgJiYgbV9pRGVmQ2h1bmtTaXplICE9IDApOw0KK30NCitDRlhfRml4ZWRTdG9yZTo6fkNGWF9GaXhlZFN0b3JlKCkgew0KKyAgRlhfTFBGSVhFRFNUT1JFQ0hVTksgcENodW5rLCBwTmV4dDsNCisgIHBDaHVuayA9IG1fcENodW5rOw0KKyAgd2hpbGUgKHBDaHVuayAhPSBOVUxMKSB7DQorICAgIHBOZXh0ID0gcENodW5rLT5wTmV4dENodW5rOw0KKyAgICBGWF9GcmVlKHBDaHVuayk7DQorICAgIHBDaHVuayA9IHBOZXh0Ow0KKyAgfQ0KK30NCitGWF9MUEZJWEVEU1RPUkVDSFVOSyBDRlhfRml4ZWRTdG9yZTo6QWxsb2NDaHVuaygpIHsNCisgIGludDMyX3QgaVRvdGFsU2l6ZSA9IHNpemVvZihGWF9GSVhFRFNUT1JFQ0hVTkspICsgbV9pRGVmQ2h1bmtTaXplICsNCisgICAgICAgICAgICAgICAgICAgICAgIG1faUJsb2NrU2l6ZSAqIG1faURlZkNodW5rU2l6ZTsNCisgIEZYX0xQRklYRURTVE9SRUNIVU5LIHBDaHVuayA9DQorICAgICAgKEZYX0xQRklYRURTVE9SRUNIVU5LKUZYX0FsbG9jKHVpbnQ4X3QsIGlUb3RhbFNpemUpOw0KKyAgaWYgKHBDaHVuayA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgRlhTWVNfbWVtc2V0KHBDaHVuay0+Rmlyc3RGbGFnKCksIDAsIG1faURlZkNodW5rU2l6ZSk7DQorICBwQ2h1bmstPnBOZXh0Q2h1bmsgPSBtX3BDaHVuazsNCisgIHBDaHVuay0+aUNodW5rU2l6ZSA9IG1faURlZkNodW5rU2l6ZTsNCisgIHBDaHVuay0+aUZyZWVOdW0gPSBtX2lEZWZDaHVua1NpemU7DQorICBtX3BDaHVuayA9IHBDaHVuazsNCisgIHJldHVybiBwQ2h1bms7DQorfQ0KK3ZvaWQqIENGWF9GaXhlZFN0b3JlOjpBbGxvYyhzaXplX3Qgc2l6ZSkgew0KKyAgaWYgKHNpemUgPiBtX2lCbG9ja1NpemUpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBGWF9MUEZJWEVEU1RPUkVDSFVOSyBwQ2h1bmsgPSBtX3BDaHVuazsNCisgIHdoaWxlIChwQ2h1bmsgIT0gTlVMTCkgew0KKyAgICBpZiAocENodW5rLT5pRnJlZU51bSA+IDApIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBwQ2h1bmsgPSBwQ2h1bmstPnBOZXh0Q2h1bms7DQorICB9DQorICBpZiAocENodW5rID09IE5VTEwpIHsNCisgICAgcENodW5rID0gQWxsb2NDaHVuaygpOw0KKyAgfQ0KKyAgRlhTWVNfYXNzZXJ0KHBDaHVuayAhPSBOVUxMKTsNCisgIHVpbnQ4X3QqIHBGbGFncyA9IHBDaHVuay0+Rmlyc3RGbGFnKCk7DQorICBzaXplX3QgaSA9IDA7DQorICBmb3IgKDsgaSA8IHBDaHVuay0+aUNodW5rU2l6ZTsgaSsrKQ0KKyAgICBpZiAocEZsYWdzW2ldID09IDApIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgRlhTWVNfYXNzZXJ0KGkgPCBwQ2h1bmstPmlDaHVua1NpemUpOw0KKyAgcEZsYWdzW2ldID0gMTsNCisgIHBDaHVuay0+aUZyZWVOdW0tLTsNCisgIHJldHVybiBwQ2h1bmstPkZpcnN0QmxvY2soKSArIGkgKiBtX2lCbG9ja1NpemU7DQorfQ0KK3ZvaWQgQ0ZYX0ZpeGVkU3RvcmU6OkZyZWUodm9pZCogcEJsb2NrKSB7DQorICBGWFNZU19hc3NlcnQocEJsb2NrICE9IE5VTEwpOw0KKyAgRlhfTFBGSVhFRFNUT1JFQ0hVTksgcFByaW9yLCBwQ2h1bms7DQorICBwUHJpb3IgPSBOVUxMLCBwQ2h1bmsgPSBtX3BDaHVuazsNCisgIHVpbnQ4X3QqIHBTdGFydCA9IE5VTEw7DQorICB1aW50OF90KiBwRW5kOw0KKyAgd2hpbGUgKHBDaHVuayAhPSBOVUxMKSB7DQorICAgIHBTdGFydCA9IHBDaHVuay0+Rmlyc3RCbG9jaygpOw0KKyAgICBpZiAocEJsb2NrID49IHBTdGFydCkgew0KKyAgICAgIHBFbmQgPSBwU3RhcnQgKyBtX2lCbG9ja1NpemUgKiBwQ2h1bmstPmlDaHVua1NpemU7DQorICAgICAgaWYgKHBCbG9jayA8IHBFbmQpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBwUHJpb3IgPSBwQ2h1bmssIHBDaHVuayA9IHBDaHVuay0+cE5leHRDaHVuazsNCisgIH0NCisgIEZYU1lTX2Fzc2VydChwQ2h1bmsgIT0gTlVMTCk7DQorICBzaXplX3QgaVBvcyA9ICgodWludDhfdCopcEJsb2NrIC0gcFN0YXJ0KSAvIG1faUJsb2NrU2l6ZTsNCisgIEZYU1lTX2Fzc2VydChpUG9zIDwgcENodW5rLT5pQ2h1bmtTaXplKTsNCisgIHVpbnQ4X3QqIHBGbGFncyA9IHBDaHVuay0+Rmlyc3RGbGFnKCk7DQorICBpZiAocEZsYWdzW2lQb3NdID09IDApIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgcEZsYWdzW2lQb3NdID0gMDsNCisgIHBDaHVuay0+aUZyZWVOdW0rKzsNCisgIGlmIChwQ2h1bmstPmlGcmVlTnVtID09IHBDaHVuay0+aUNodW5rU2l6ZSkgew0KKyAgICBpZiAocFByaW9yID09IE5VTEwpIHsNCisgICAgICBtX3BDaHVuayA9IHBDaHVuay0+cE5leHRDaHVuazsNCisgICAgfSBlbHNlIHsNCisgICAgICBwUHJpb3ItPnBOZXh0Q2h1bmsgPSBwQ2h1bmstPnBOZXh0Q2h1bms7DQorICAgIH0NCisgICAgRlhfRnJlZShwQ2h1bmspOw0KKyAgfQ0KK30NCitzaXplX3QgQ0ZYX0ZpeGVkU3RvcmU6OlNldERlZkNodW5rU2l6ZShzaXplX3QgaUNodW5rU2l6ZSkgew0KKyAgRlhTWVNfYXNzZXJ0KGlDaHVua1NpemUgIT0gMCk7DQorICBzaXplX3QgdiA9IG1faURlZkNodW5rU2l6ZTsNCisgIG1faURlZkNodW5rU2l6ZSA9IEZYXzRCWVRFQUxJR04oaUNodW5rU2l6ZSk7DQorICByZXR1cm4gdjsNCit9DQorI2lmbmRlZiBfRlhFTUINCitDRlhfRHluYW1pY1N0b3JlOjpDRlhfRHluYW1pY1N0b3JlKHNpemVfdCBpRGVmQ2h1bmtTaXplKQ0KKyAgICA6IG1faURlZkNodW5rU2l6ZShpRGVmQ2h1bmtTaXplKSwgbV9wQ2h1bmsoTlVMTCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1faURlZkNodW5rU2l6ZSAhPSAwKTsNCit9DQorQ0ZYX0R5bmFtaWNTdG9yZTo6fkNGWF9EeW5hbWljU3RvcmUoKSB7DQorICBGWF9MUERZTkFNSUNTVE9SRUNIVU5LIHBDaHVuaywgcE5leHQ7DQorICBwQ2h1bmsgPSBtX3BDaHVuazsNCisgIHdoaWxlIChwQ2h1bmsgIT0gTlVMTCkgew0KKyAgICBwTmV4dCA9IHBDaHVuay0+cE5leHRDaHVuazsNCisgICAgRlhfRnJlZShwQ2h1bmspOw0KKyAgICBwQ2h1bmsgPSBwTmV4dDsNCisgIH0NCit9DQorRlhfTFBEWU5BTUlDU1RPUkVDSFVOSyBDRlhfRHluYW1pY1N0b3JlOjpBbGxvY0NodW5rKHNpemVfdCBzaXplKSB7DQorICBGWFNZU19hc3NlcnQoc2l6ZSAhPSAwKTsNCisgIEZYX0xQRFlOQU1JQ1NUT1JFQ0hVTksgcENodW5rID0gKEZYX0xQRFlOQU1JQ1NUT1JFQ0hVTkspRlhfQWxsb2MoDQorICAgICAgdWludDhfdCwNCisgICAgICBzaXplb2YoRlhfRFlOQU1JQ1NUT1JFQ0hVTkspICsgc2l6ZW9mKEZYX0RZTkFNSUNTVE9SRUJMT0NLKSAqIDIgKyBzaXplKTsNCisgIGlmIChwQ2h1bmsgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHBDaHVuay0+aUNodW5rU2l6ZSA9IHNpemU7DQorICBwQ2h1bmstPmlGcmVlU2l6ZSA9IHNpemU7DQorICBGWF9MUERZTkFNSUNTVE9SRUJMT0NLIHBCbG9jayA9IHBDaHVuay0+Rmlyc3RCbG9jaygpOw0KKyAgcEJsb2NrLT5pQmxvY2tTaXplID0gc2l6ZTsNCisgIHBCbG9jay0+YlVzZWQgPSBGQUxTRTsNCisgIHBCbG9jayA9IHBCbG9jay0+TmV4dEJsb2NrKCk7DQorICBwQmxvY2stPmlCbG9ja1NpemUgPSAwOw0KKyAgcEJsb2NrLT5iVXNlZCA9IFRSVUU7DQorICBpZiAobV9wQ2h1bmsgIT0gTlVMTCAmJiBzaXplID49IG1faURlZkNodW5rU2l6ZSkgew0KKyAgICBGWF9MUERZTkFNSUNTVE9SRUNIVU5LIHBMYXN0ID0gbV9wQ2h1bms7DQorICAgIHdoaWxlIChwTGFzdC0+cE5leHRDaHVuayAhPSBOVUxMKSB7DQorICAgICAgcExhc3QgPSBwTGFzdC0+cE5leHRDaHVuazsNCisgICAgfQ0KKyAgICBwTGFzdC0+cE5leHRDaHVuayA9IHBDaHVuazsNCisgICAgcENodW5rLT5wTmV4dENodW5rID0gTlVMTDsNCisgIH0gZWxzZSB7DQorICAgIHBDaHVuay0+cE5leHRDaHVuayA9IG1fcENodW5rOw0KKyAgICBtX3BDaHVuayA9IHBDaHVuazsNCisgIH0NCisgIHJldHVybiBwQ2h1bms7DQorfQ0KK3ZvaWQqIENGWF9EeW5hbWljU3RvcmU6OkFsbG9jKHNpemVfdCBzaXplKSB7DQorICBzaXplID0gRlhfNEJZVEVBTElHTihzaXplKTsNCisgIEZYU1lTX2Fzc2VydChzaXplICE9IDApOw0KKyAgRlhfTFBEWU5BTUlDU1RPUkVDSFVOSyBwQ2h1bmsgPSBtX3BDaHVuazsNCisgIEZYX0xQRFlOQU1JQ1NUT1JFQkxPQ0sgcEJsb2NrID0gTlVMTDsNCisgIHdoaWxlIChwQ2h1bmsgIT0gTlVMTCkgew0KKyAgICBpZiAocENodW5rLT5pRnJlZVNpemUgPj0gc2l6ZSkgew0KKyAgICAgIHBCbG9jayA9IHBDaHVuay0+Rmlyc3RCbG9jaygpOw0KKyAgICAgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsNCisgICAgICB3aGlsZSAocEJsb2NrLT5pQmxvY2tTaXplICE9IDApIHsNCisgICAgICAgIGlmICghcEJsb2NrLT5iVXNlZCAmJiBwQmxvY2stPmlCbG9ja1NpemUgPj0gc2l6ZSkgew0KKyAgICAgICAgICBiRmluZCA9IFRSVUU7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcEJsb2NrID0gcEJsb2NrLT5OZXh0QmxvY2soKTsNCisgICAgICB9DQorICAgICAgaWYgKGJGaW5kKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgcENodW5rID0gcENodW5rLT5wTmV4dENodW5rOw0KKyAgfQ0KKyAgaWYgKHBDaHVuayA9PSBOVUxMKSB7DQorICAgIHBDaHVuayA9IEFsbG9jQ2h1bmsoc3RkOjptYXgobV9pRGVmQ2h1bmtTaXplLCBzaXplKSk7DQorICAgIHBCbG9jayA9IHBDaHVuay0+Rmlyc3RCbG9jaygpOw0KKyAgfQ0KKyAgRlhTWVNfYXNzZXJ0KHBDaHVuayAhPSBOVUxMICYmIHBCbG9jayAhPSBOVUxMKTsNCisgIHNpemVfdCBtID0gc2l6ZSArIHNpemVvZihGWF9EWU5BTUlDU1RPUkVCTE9DSyk7DQorICBwQmxvY2stPmJVc2VkID0gVFJVRTsNCisgIGlmIChwQmxvY2stPmlCbG9ja1NpemUgPiBtKSB7DQorICAgIHNpemVfdCBuID0gcEJsb2NrLT5pQmxvY2tTaXplOw0KKyAgICBwQmxvY2stPmlCbG9ja1NpemUgPSBzaXplOw0KKyAgICBGWF9MUERZTkFNSUNTVE9SRUJMT0NLIHBOZXh0QmxvY2sgPSBwQmxvY2stPk5leHRCbG9jaygpOw0KKyAgICBwTmV4dEJsb2NrLT5iVXNlZCA9IEZBTFNFOw0KKyAgICBwTmV4dEJsb2NrLT5pQmxvY2tTaXplID0gbiAtIHNpemUgLSBzaXplb2YoRlhfRFlOQU1JQ1NUT1JFQkxPQ0spOw0KKyAgICBwQ2h1bmstPmlGcmVlU2l6ZSAtPSBzaXplICsgc2l6ZW9mKEZYX0RZTkFNSUNTVE9SRUJMT0NLKTsNCisgIH0gZWxzZSB7DQorICAgIHBDaHVuay0+aUZyZWVTaXplIC09IHBCbG9jay0+aUJsb2NrU2l6ZTsNCisgIH0NCisgIHJldHVybiBwQmxvY2stPkRhdGEoKTsNCit9DQordm9pZCBDRlhfRHluYW1pY1N0b3JlOjpGcmVlKHZvaWQqIHBCbG9jaykgew0KKyAgRlhTWVNfYXNzZXJ0KHBCbG9jayAhPSBOVUxMKTsNCisgIEZYX0xQRFlOQU1JQ1NUT1JFQ0hVTksgcFByaW9yQ2h1bmssIHBDaHVuazsNCisgIHBQcmlvckNodW5rID0gTlVMTCwgcENodW5rID0gbV9wQ2h1bms7DQorICB3aGlsZSAocENodW5rICE9IE5VTEwpIHsNCisgICAgaWYgKHBCbG9jayA+IHBDaHVuayAmJg0KKyAgICAgICAgcEJsb2NrIDw9ICgodWludDhfdCopcENodW5rICsgc2l6ZW9mKEZYX0RZTkFNSUNTVE9SRUNIVU5LKSArDQorICAgICAgICAgICAgICAgICAgIHBDaHVuay0+aUNodW5rU2l6ZSkpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBwUHJpb3JDaHVuayA9IHBDaHVuaywgcENodW5rID0gcENodW5rLT5wTmV4dENodW5rOw0KKyAgfQ0KKyAgRlhTWVNfYXNzZXJ0KHBDaHVuayAhPSBOVUxMKTsNCisgIEZYX0xQRFlOQU1JQ1NUT1JFQkxPQ0sgcFByaW9yQmxvY2ssIHBGaW5kQmxvY2s7DQorICBwUHJpb3JCbG9jayA9IE5VTEwsIHBGaW5kQmxvY2sgPSBwQ2h1bmstPkZpcnN0QmxvY2soKTsNCisgIHdoaWxlIChwRmluZEJsb2NrLT5pQmxvY2tTaXplICE9IDApIHsNCisgICAgaWYgKHBCbG9jayA9PSAodm9pZCopcEZpbmRCbG9jay0+RGF0YSgpKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgcFByaW9yQmxvY2sgPSBwRmluZEJsb2NrOw0KKyAgICBwRmluZEJsb2NrID0gcEZpbmRCbG9jay0+TmV4dEJsb2NrKCk7DQorICB9DQorICBGWFNZU19hc3NlcnQocEZpbmRCbG9jay0+aUJsb2NrU2l6ZSAhPSAwICYmIHBGaW5kQmxvY2stPmJVc2VkICYmDQorICAgICAgICAgICAgICAgcEJsb2NrID09ICh2b2lkKilwRmluZEJsb2NrLT5EYXRhKCkpOw0KKyAgcEZpbmRCbG9jay0+YlVzZWQgPSBGQUxTRTsNCisgIHBDaHVuay0+aUZyZWVTaXplICs9IHBGaW5kQmxvY2stPmlCbG9ja1NpemU7DQorICBpZiAocFByaW9yQmxvY2sgPT0gTlVMTCkgew0KKyAgICBwUHJpb3JCbG9jayA9IHBDaHVuay0+Rmlyc3RCbG9jaygpOw0KKyAgfSBlbHNlIGlmIChwUHJpb3JCbG9jay0+YlVzZWQpIHsNCisgICAgcFByaW9yQmxvY2sgPSBwRmluZEJsb2NrOw0KKyAgfQ0KKyAgcEZpbmRCbG9jayA9IHBQcmlvckJsb2NrOw0KKyAgc2l6ZV90IHNpemVGcmVlID0gMDsNCisgIHNpemVfdCBzaXplQmxvY2sgPSAwOw0KKyAgd2hpbGUgKHBGaW5kQmxvY2stPmlCbG9ja1NpemUgIT0gMCAmJiAhcEZpbmRCbG9jay0+YlVzZWQpIHsNCisgICAgaWYgKHBGaW5kQmxvY2sgIT0gcFByaW9yQmxvY2spIHsNCisgICAgICBzaXplRnJlZSArPSBzaXplb2YoRlhfRFlOQU1JQ1NUT1JFQkxPQ0spOw0KKyAgICAgIHNpemVCbG9jayArPSBzaXplb2YoRlhfRFlOQU1JQ1NUT1JFQkxPQ0spOw0KKyAgICB9DQorICAgIHNpemVCbG9jayArPSBwRmluZEJsb2NrLT5pQmxvY2tTaXplOw0KKyAgICBwRmluZEJsb2NrID0gcEZpbmRCbG9jay0+TmV4dEJsb2NrKCk7DQorICB9DQorICBwUHJpb3JCbG9jay0+aUJsb2NrU2l6ZSA9IHNpemVCbG9jazsNCisgIHBDaHVuay0+aUZyZWVTaXplICs9IHNpemVGcmVlOw0KKyAgaWYgKHBDaHVuay0+aUZyZWVTaXplID09IHBDaHVuay0+aUNodW5rU2l6ZSkgew0KKyAgICBpZiAocFByaW9yQ2h1bmsgPT0gTlVMTCkgew0KKyAgICAgIG1fcENodW5rID0gcENodW5rLT5wTmV4dENodW5rOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHBQcmlvckNodW5rLT5wTmV4dENodW5rID0gcENodW5rLT5wTmV4dENodW5rOw0KKyAgICB9DQorICAgIEZYX0ZyZWUocENodW5rKTsNCisgIH0NCit9DQorc2l6ZV90IENGWF9EeW5hbWljU3RvcmU6OlNldERlZkNodW5rU2l6ZShzaXplX3Qgc2l6ZSkgew0KKyAgRlhTWVNfYXNzZXJ0KHNpemUgIT0gMCk7DQorICBzaXplX3QgdiA9IG1faURlZkNodW5rU2l6ZTsNCisgIG1faURlZkNodW5rU2l6ZSA9IHNpemU7DQorICByZXR1cm4gdjsNCit9DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfbWVtb3J5LmggYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9tZW1vcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjQyNzczCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfbWVtb3J5LmgKQEAgLTAsMCArMSwxMzUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhfTUVNT1JZX0lNUA0KKyNkZWZpbmUgX0ZYX01FTU9SWV9JTVANCitjbGFzcyBDRlhfRGVmU3RvcmU7DQorY2xhc3MgQ0ZYX1N0YXRpY1N0b3JlOw0KK2NsYXNzIENGWF9GaXhlZFN0b3JlOw0KK2NsYXNzIENGWF9EeW5hbWljU3RvcmU7DQorY2xhc3MgQ0ZYX0RlZlN0b3JlIDogcHVibGljIElGWF9NRU1BbGxvY2F0b3IsIHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZYX0RlZlN0b3JlKCkge30NCisgIH5DRlhfRGVmU3RvcmUoKSB7fQ0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICB2aXJ0dWFsIHZvaWQqIEFsbG9jKHNpemVfdCBzaXplKSB7IHJldHVybiBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsgfQ0KKyAgdmlydHVhbCB2b2lkIEZyZWUodm9pZCogcEJsb2NrKSB7IEZYX0ZyZWUocEJsb2NrKTsgfQ0KKyAgdmlydHVhbCBzaXplX3QgR2V0QmxvY2tTaXplKCkgY29uc3QgeyByZXR1cm4gMDsgfQ0KKyAgdmlydHVhbCBzaXplX3QgR2V0RGVmQ2h1bmtTaXplKCkgY29uc3QgeyByZXR1cm4gMDsgfQ0KKyAgdmlydHVhbCBzaXplX3QgU2V0RGVmQ2h1bmtTaXplKHNpemVfdCBzaXplKSB7IHJldHVybiAwOyB9DQorICB2aXJ0dWFsIHNpemVfdCBHZXRDdXJyZW50RGF0YVNpemUoKSBjb25zdCB7IHJldHVybiAwOyB9DQorfTsNCisjaWYgX0ZYX09TXyAhPSBfRlhfQU5EUk9JRF8NCisjcHJhZ21hIHBhY2socHVzaCwgMSkNCisjZW5kaWYNCit0eXBlZGVmIHN0cnVjdCBfRlhfU1RBVElDU1RPUkVDSFVOSyB7DQorICBfRlhfU1RBVElDU1RPUkVDSFVOSyogcE5leHRDaHVuazsNCisgIHNpemVfdCBpQ2h1bmtTaXplOw0KKyAgc2l6ZV90IGlGcmVlU2l6ZTsNCit9IEZYX1NUQVRJQ1NUT1JFQ0hVTkssICpGWF9MUFNUQVRJQ1NUT1JFQ0hVTks7DQordHlwZWRlZiBGWF9TVEFUSUNTVE9SRUNIVU5LIGNvbnN0KiBGWF9MUENTVEFUSUNTVE9SRUNIVU5LOw0KKyNpZiBfRlhfT1NfICE9IF9GWF9BTkRST0lEXw0KKyNwcmFnbWEgcGFjayhwb3ApDQorI2VuZGlmDQorY2xhc3MgQ0ZYX1N0YXRpY1N0b3JlIDogcHVibGljIElGWF9NRU1BbGxvY2F0b3IsIHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZYX1N0YXRpY1N0b3JlKHNpemVfdCBpRGVmQ2h1bmtTaXplID0gNDA5Nik7DQorICB+Q0ZYX1N0YXRpY1N0b3JlKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgdm9pZCogQWxsb2Moc2l6ZV90IHNpemUpOw0KKyAgdmlydHVhbCB2b2lkIEZyZWUodm9pZCogcEJsb2NrKSB7fQ0KKyAgdmlydHVhbCBzaXplX3QgR2V0QmxvY2tTaXplKCkgY29uc3QgeyByZXR1cm4gMDsgfQ0KKyAgdmlydHVhbCBzaXplX3QgR2V0RGVmQ2h1bmtTaXplKCkgY29uc3QgeyByZXR1cm4gbV9pRGVmQ2h1bmtTaXplOyB9DQorICB2aXJ0dWFsIHNpemVfdCBTZXREZWZDaHVua1NpemUoc2l6ZV90IHNpemUpOw0KKyAgdmlydHVhbCBzaXplX3QgR2V0Q3VycmVudERhdGFTaXplKCkgY29uc3QgeyByZXR1cm4gbV9pQWxsb2NhdGVkU2l6ZTsgfQ0KKw0KKyBwcm90ZWN0ZWQ6DQorICBzaXplX3QgbV9pQWxsb2NhdGVkU2l6ZTsNCisgIHNpemVfdCBtX2lEZWZDaHVua1NpemU7DQorICBGWF9MUFNUQVRJQ1NUT1JFQ0hVTksgbV9wQ2h1bms7DQorICBGWF9MUFNUQVRJQ1NUT1JFQ0hVTksgbV9wTGFzdENodW5rOw0KKyAgRlhfTFBTVEFUSUNTVE9SRUNIVU5LIEFsbG9jQ2h1bmsoc2l6ZV90IHNpemUpOw0KKyAgRlhfTFBTVEFUSUNTVE9SRUNIVU5LIEZpbmRDaHVuayhzaXplX3Qgc2l6ZSk7DQorfTsNCisjaWYgX0ZYX09TXyAhPSBfRlhfQU5EUk9JRF8NCisjcHJhZ21hIHBhY2socHVzaCwgMSkNCisjZW5kaWYNCit0eXBlZGVmIHN0cnVjdCBfRlhfRklYRURTVE9SRUNIVU5LIHsNCisgIHVpbnQ4X3QqIEZpcnN0RmxhZygpIGNvbnN0IHsNCisgICAgcmV0dXJuICh1aW50OF90Kil0aGlzICsgc2l6ZW9mKF9GWF9GSVhFRFNUT1JFQ0hVTkspOw0KKyAgfQ0KKyAgdWludDhfdCogRmlyc3RCbG9jaygpIGNvbnN0IHsgcmV0dXJuIEZpcnN0RmxhZygpICsgaUNodW5rU2l6ZTsgfQ0KKyAgX0ZYX0ZJWEVEU1RPUkVDSFVOSyogcE5leHRDaHVuazsNCisgIHNpemVfdCBpQ2h1bmtTaXplOw0KKyAgc2l6ZV90IGlGcmVlTnVtOw0KK30gRlhfRklYRURTVE9SRUNIVU5LLCAqRlhfTFBGSVhFRFNUT1JFQ0hVTks7DQordHlwZWRlZiBGWF9GSVhFRFNUT1JFQ0hVTksgY29uc3QqIEZYX0xQQ0ZJWEVEU1RPUkVDSFVOSzsNCisjaWYgX0ZYX09TXyAhPSBfRlhfQU5EUk9JRF8NCisjcHJhZ21hIHBhY2socG9wKQ0KKyNlbmRpZg0KK2NsYXNzIENGWF9GaXhlZFN0b3JlIDogcHVibGljIElGWF9NRU1BbGxvY2F0b3IsIHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZYX0ZpeGVkU3RvcmUoc2l6ZV90IGlCbG9ja1NpemUsIHNpemVfdCBpQmxvY2tOdW1zSW5DaHVuayk7DQorICB2aXJ0dWFsIH5DRlhfRml4ZWRTdG9yZSgpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICB2aXJ0dWFsIHZvaWQqIEFsbG9jKHNpemVfdCBzaXplKTsNCisgIHZpcnR1YWwgdm9pZCBGcmVlKHZvaWQqIHBCbG9jayk7DQorICB2aXJ0dWFsIHNpemVfdCBHZXRCbG9ja1NpemUoKSBjb25zdCB7IHJldHVybiBtX2lCbG9ja1NpemU7IH0NCisgIHZpcnR1YWwgc2l6ZV90IEdldERlZkNodW5rU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1faURlZkNodW5rU2l6ZTsgfQ0KKyAgdmlydHVhbCBzaXplX3QgU2V0RGVmQ2h1bmtTaXplKHNpemVfdCBpQ2h1bmtTaXplKTsNCisgIHZpcnR1YWwgc2l6ZV90IEdldEN1cnJlbnREYXRhU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0NCisNCisgcHJvdGVjdGVkOg0KKyAgc2l6ZV90IG1faUJsb2NrU2l6ZTsNCisgIHNpemVfdCBtX2lEZWZDaHVua1NpemU7DQorICBGWF9MUEZJWEVEU1RPUkVDSFVOSyBtX3BDaHVuazsNCisgIEZYX0xQRklYRURTVE9SRUNIVU5LIEFsbG9jQ2h1bmsoKTsNCit9Ow0KKyNpZiBfRlhfT1NfICE9IF9GWF9BTkRST0lEXw0KKyNwcmFnbWEgcGFjayhwdXNoLCAxKQ0KKyNlbmRpZg0KK3R5cGVkZWYgc3RydWN0IF9GWF9EWU5BTUlDU1RPUkVCTE9DSyB7DQorICBfRlhfRFlOQU1JQ1NUT1JFQkxPQ0sqIE5leHRCbG9jaygpIGNvbnN0IHsNCisgICAgcmV0dXJuIChfRlhfRFlOQU1JQ1NUT1JFQkxPQ0sqKShEYXRhKCkgKyBpQmxvY2tTaXplKTsNCisgIH0NCisgIHVpbnQ4X3QqIERhdGEoKSBjb25zdCB7DQorICAgIHJldHVybiAodWludDhfdCopdGhpcyArIHNpemVvZihfRlhfRFlOQU1JQ1NUT1JFQkxPQ0spOw0KKyAgfQ0KKyAgc2l6ZV90IGlCbG9ja1NpemU7DQorICBGWF9CT09MIGJVc2VkOw0KK30gRlhfRFlOQU1JQ1NUT1JFQkxPQ0ssICpGWF9MUERZTkFNSUNTVE9SRUJMT0NLOw0KK3R5cGVkZWYgRlhfRFlOQU1JQ1NUT1JFQkxPQ0sgY29uc3QqIEZYX0xQQ0RZTkFNSUNTVE9SRUJMT0NLOw0KK3R5cGVkZWYgc3RydWN0IF9GWF9EWU5BTUlDU1RPUkVDSFVOSyB7DQorICBGWF9MUERZTkFNSUNTVE9SRUJMT0NLIEZpcnN0QmxvY2soKSBjb25zdCB7DQorICAgIHJldHVybiAoRlhfTFBEWU5BTUlDU1RPUkVCTE9DSykoKHVpbnQ4X3QqKXRoaXMgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihfRlhfRFlOQU1JQ1NUT1JFQ0hVTkspKTsNCisgIH0NCisgIF9GWF9EWU5BTUlDU1RPUkVDSFVOSyogcE5leHRDaHVuazsNCisgIHNpemVfdCBpQ2h1bmtTaXplOw0KKyAgc2l6ZV90IGlGcmVlU2l6ZTsNCit9IEZYX0RZTkFNSUNTVE9SRUNIVU5LLCAqRlhfTFBEWU5BTUlDU1RPUkVDSFVOSzsNCit0eXBlZGVmIEZYX0RZTkFNSUNTVE9SRUNIVU5LIGNvbnN0KiBGWF9MUENEWU5BTUlDU1RPUkVDSFVOSzsNCisjaWYgX0ZYX09TXyAhPSBfRlhfQU5EUk9JRF8NCisjcHJhZ21hIHBhY2socG9wKQ0KKyNlbmRpZg0KK2NsYXNzIENGWF9EeW5hbWljU3RvcmUgOiBwdWJsaWMgSUZYX01FTUFsbG9jYXRvciwgcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBDRlhfRHluYW1pY1N0b3JlKHNpemVfdCBpRGVmQ2h1bmtTaXplID0gNDA5Nik7DQorICB2aXJ0dWFsIH5DRlhfRHluYW1pY1N0b3JlKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgdm9pZCogQWxsb2Moc2l6ZV90IHNpemUpOw0KKyAgdmlydHVhbCB2b2lkIEZyZWUodm9pZCogcEJsb2NrKTsNCisgIHZpcnR1YWwgc2l6ZV90IEdldEJsb2NrU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0NCisgIHZpcnR1YWwgc2l6ZV90IEdldERlZkNodW5rU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1faURlZkNodW5rU2l6ZTsgfQ0KKyAgdmlydHVhbCBzaXplX3QgU2V0RGVmQ2h1bmtTaXplKHNpemVfdCBzaXplKTsNCisgIHZpcnR1YWwgc2l6ZV90IEdldEN1cnJlbnREYXRhU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0NCisNCisgcHJvdGVjdGVkOg0KKyAgc2l6ZV90IG1faURlZkNodW5rU2l6ZTsNCisgIEZYX0xQRFlOQU1JQ1NUT1JFQ0hVTksgbV9wQ2h1bms7DQorICBGWF9MUERZTkFNSUNTVE9SRUNIVU5LIEFsbG9jQ2h1bmsoc2l6ZV90IHNpemUpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfc3RyZWFtLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3N0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg2MjE2NwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3N0cmVhbS5jcHAKQEAgLTAsMCArMSwxMzU3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlIDxhbGdvcml0aG0+DQorDQorI2luY2x1ZGUgInhmYS9zcmMvZmdhcy9zcmMvZmdhc19iYXNlLmgiDQorI2luY2x1ZGUgImZ4X3N0cmVhbS5oIg0KK0lGWF9TdHJlYW0qIElGWF9TdHJlYW06OkNyZWF0ZVN0cmVhbShJRlhfQnVmZmVyUmVhZCogcEJ1ZmZlclJlYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3QWNjZXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlGaWxlU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVsZWFzZUJ1ZmZlclJlYWQpIHsNCisgIENGWF9TdHJlYW0qIHBTUiA9IG5ldyBDRlhfU3RyZWFtOw0KKyAgaWYgKCFwU1ItPkxvYWRCdWZmZXJSZWFkKHBCdWZmZXJSZWFkLCBpRmlsZVNpemUsIGR3QWNjZXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZWxlYXNlQnVmZmVyUmVhZCkpIHsNCisgICAgcFNSLT5SZWxlYXNlKCk7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1RleHQpIHsNCisgICAgcmV0dXJuIG5ldyBDRlhfVGV4dFN0cmVhbShwU1IsIFRSVUUpOw0KKyAgfQ0KKyAgcmV0dXJuIHBTUjsNCit9DQorSUZYX1N0cmVhbSogSUZYX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKElGWF9GaWxlUmVhZCogcEZpbGVSZWFkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0FjY2Vzcykgew0KKyAgQ0ZYX1N0cmVhbSogcFNSID0gbmV3IENGWF9TdHJlYW07DQorICBpZiAoIXBTUi0+TG9hZEZpbGVSZWFkKHBGaWxlUmVhZCwgZHdBY2Nlc3MpKSB7DQorICAgIHBTUi0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19UZXh0KSB7DQorICAgIHJldHVybiBuZXcgQ0ZYX1RleHRTdHJlYW0ocFNSLCBUUlVFKTsNCisgIH0NCisgIHJldHVybiBwU1I7DQorfQ0KK0lGWF9TdHJlYW0qIElGWF9TdHJlYW06OkNyZWF0ZVN0cmVhbShJRlhfRmlsZVdyaXRlKiBwRmlsZVdyaXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0FjY2Vzcykgew0KKyAgQ0ZYX1N0cmVhbSogcFNSID0gbmV3IENGWF9TdHJlYW07DQorICBpZiAoIXBTUi0+TG9hZEZpbGVXcml0ZShwRmlsZVdyaXRlLCBkd0FjY2VzcykpIHsNCisgICAgcFNSLT5SZWxlYXNlKCk7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1RleHQpIHsNCisgICAgcmV0dXJuIG5ldyBDRlhfVGV4dFN0cmVhbShwU1IsIFRSVUUpOw0KKyAgfQ0KKyAgcmV0dXJuIHBTUjsNCit9DQorSUZYX1N0cmVhbSogSUZYX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKGNvbnN0IEZYX1dDSEFSKiBwc3pGaWxlTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdBY2Nlc3MpIHsNCisgIENGWF9TdHJlYW0qIHBTUiA9IG5ldyBDRlhfU3RyZWFtOw0KKyAgaWYgKCFwU1ItPkxvYWRGaWxlKHBzekZpbGVOYW1lLCBkd0FjY2VzcykpIHsNCisgICAgcFNSLT5SZWxlYXNlKCk7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1RleHQpIHsNCisgICAgcmV0dXJuIG5ldyBDRlhfVGV4dFN0cmVhbShwU1IsIFRSVUUpOw0KKyAgfQ0KKyAgcmV0dXJuIHBTUjsNCit9DQorSUZYX1N0cmVhbSogSUZYX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKHVpbnQ4X3QqIHBEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdBY2Nlc3MpIHsNCisgIENGWF9TdHJlYW0qIHBTUiA9IG5ldyBDRlhfU3RyZWFtOw0KKyAgaWYgKCFwU1ItPkxvYWRCdWZmZXIocERhdGEsIGxlbmd0aCwgZHdBY2Nlc3MpKSB7DQorICAgIHBTUi0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19UZXh0KSB7DQorICAgIHJldHVybiBuZXcgQ0ZYX1RleHRTdHJlYW0ocFNSLCBUUlVFKTsNCisgIH0NCisgIHJldHVybiBwU1I7DQorfQ0KK0NGWF9TdHJlYW1JbXA6OkNGWF9TdHJlYW1JbXAoKSA6IENGWF9UaHJlYWRMb2NrKCksIG1fZHdBY2Nlc3MoMCkge30NCitDRlhfRmlsZVN0cmVhbUltcDo6Q0ZYX0ZpbGVTdHJlYW1JbXAoKQ0KKyAgICA6IENGWF9TdHJlYW1JbXAoKSwgbV9oRmlsZShOVUxMKSwgbV9pTGVuZ3RoKDApIHt9DQorQ0ZYX0ZpbGVTdHJlYW1JbXA6On5DRlhfRmlsZVN0cmVhbUltcCgpIHsNCisgIGlmIChtX2hGaWxlICE9IE5VTEwpIHsNCisgICAgRlhTWVNfZmNsb3NlKG1faEZpbGUpOw0KKyAgfQ0KK30NCitGWF9CT09MIENGWF9GaWxlU3RyZWFtSW1wOjpMb2FkRmlsZShjb25zdCBGWF9XQ0hBUiogcHN6U3JjRmlsZU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdBY2Nlc3MpIHsNCisgIEZYU1lTX2Fzc2VydChtX2hGaWxlID09IE5VTEwpOw0KKyAgRlhTWVNfYXNzZXJ0KHBzelNyY0ZpbGVOYW1lICE9IE5VTEwgJiYgRlhTWVNfd2NzbGVuKHBzelNyY0ZpbGVOYW1lKSA+IDApOw0KKyNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU4zMl9NT0JJTEVfIHx8IFwNCisgICAgX0ZYX09TXyA9PSBfRlhfV0lONjRfDQorICBDRlhfV2lkZVN0cmluZyB3c01vZGU7DQorICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpIHsNCisgICAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX0FwcGVuZCkgew0KKyAgICAgIHdzTW9kZSA9IEwiYStiIjsNCisgICAgfSBlbHNlIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19UcnVuY2F0ZSkgew0KKyAgICAgIHdzTW9kZSA9IEwidytiIjsNCisgICAgfSBlbHNlIHsNCisgICAgICB3c01vZGUgPSBMInIrYiI7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIHdzTW9kZSA9IEwicmIiOw0KKyAgfQ0KKyNpZmRlZiBfRlhfV0lOQVBJX1BBUlRJVElPTl9BUFBfDQorICBDRlhfV2lkZVN0cmluZyB3c1NyY0ZpbGVOYW1lKHBzelNyY0ZpbGVOYW1lKTsNCisgIF93Zm9wZW5fcygmbV9oRmlsZSwgd3NTcmNGaWxlTmFtZSwgd3NNb2RlKTsNCisjZWxzZQ0KKyAgbV9oRmlsZSA9IEZYU1lTX3dmb3Blbihwc3pTcmNGaWxlTmFtZSwgd3NNb2RlKTsNCisjZW5kaWYNCisgIGlmIChtX2hGaWxlID09IE5VTEwpIHsNCisgICAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSB7DQorICAgICAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX0NyZWF0ZSkgew0KKyNpZmRlZiBfRlhfV0lOQVBJX1BBUlRJVElPTl9BUFBfDQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1NyY0ZpbGVOYW1lKHBzelNyY0ZpbGVOYW1lKTsNCisgICAgICAgIF93Zm9wZW5fcygmbV9oRmlsZSwgd3NTcmNGaWxlTmFtZSwgTCJ3K2IiKTsNCisjZWxzZQ0KKyAgICAgICAgbV9oRmlsZSA9IEZYU1lTX3dmb3Blbihwc3pTcmNGaWxlTmFtZSwgTCJ3K2IiKTsNCisjZW5kaWYNCisgICAgICB9DQorICAgICAgaWYgKG1faEZpbGUgPT0gTlVMTCkgew0KKyNpZmRlZiBfRlhfV0lOQVBJX1BBUlRJVElPTl9BUFBfDQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1NyY0ZpbGVOYW1lKHBzelNyY0ZpbGVOYW1lKTsNCisgICAgICAgIF93Zm9wZW5fcygmbV9oRmlsZSwgd3NTcmNGaWxlTmFtZSwgTCJyK2IiKTsNCisjZWxzZQ0KKyAgICAgICAgbV9oRmlsZSA9IEZYU1lTX3dmb3Blbihwc3pTcmNGaWxlTmFtZSwgTCJyK2IiKTsNCisjZW5kaWYNCisgICAgICAgIGlmIChtX2hGaWxlID09IE5VTEwpIHsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1RydW5jYXRlKSB7DQorICAgICAgICAgIEZYX2ZzZXRzaXplKG1faEZpbGUsIDApOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgIH0NCisjZWxzZQ0KKyAgQ0ZYX0J5dGVTdHJpbmcgd3NNb2RlOw0KKyAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSB7DQorICAgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19BcHBlbmQpIHsNCisgICAgICB3c01vZGUgPSAiYStiIjsNCisgICAgfSBlbHNlIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19UcnVuY2F0ZSkgew0KKyAgICAgIHdzTW9kZSA9ICJ3K2IiOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHdzTW9kZSA9ICJyK2IiOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICB3c01vZGUgPSAicmIiOw0KKyAgfQ0KKyAgQ0ZYX0J5dGVTdHJpbmcgc3pGaWxlTmFtZSA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwc3pTcmNGaWxlTmFtZSk7DQorICBtX2hGaWxlID0gRlhTWVNfZm9wZW4oc3pGaWxlTmFtZSwgd3NNb2RlKTsNCisgIGlmIChtX2hGaWxlID09IE5VTEwpIHsNCisgICAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSB7DQorICAgICAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX0NyZWF0ZSkgew0KKyAgICAgICAgbV9oRmlsZSA9IEZYU1lTX2ZvcGVuKHN6RmlsZU5hbWUsICJ3K2IiKTsNCisgICAgICB9DQorICAgICAgaWYgKG1faEZpbGUgPT0gTlVMTCkgew0KKyAgICAgICAgbV9oRmlsZSA9IEZYU1lTX2ZvcGVuKHN6RmlsZU5hbWUsICJyK2IiKTsNCisgICAgICAgIGlmIChtX2hGaWxlID09IE5VTEwpIHsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1RydW5jYXRlKSB7DQorICAgICAgICAgIEZYX2ZzZXRzaXplKG1faEZpbGUsIDApOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgIH0NCisjZW5kaWYNCisgIG1fZHdBY2Nlc3MgPSBkd0FjY2VzczsNCisgIGlmICgoZHdBY2Nlc3MgJiAoRlhfU1RSRUFNQUNDRVNTX1dyaXRlIHwgRlhfU1RSRUFNQUNDRVNTX1RydW5jYXRlKSkgPT0NCisgICAgICAoRlhfU1RSRUFNQUNDRVNTX1dyaXRlIHwgRlhfU1RSRUFNQUNDRVNTX1RydW5jYXRlKSkgew0KKyAgICBtX2lMZW5ndGggPSAwOw0KKyAgfSBlbHNlIHsNCisgICAgbV9pTGVuZ3RoID0gRlhfZmlsZWxlbmd0aChtX2hGaWxlKTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitpbnQzMl90IENGWF9GaWxlU3RyZWFtSW1wOjpHZXRMZW5ndGgoKSBjb25zdCB7DQorICBGWFNZU19hc3NlcnQobV9oRmlsZSAhPSBOVUxMKTsNCisgIHJldHVybiBtX2lMZW5ndGg7DQorfQ0KK2ludDMyX3QgQ0ZYX0ZpbGVTdHJlYW1JbXA6OlNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgaW50MzJfdCBpT2Zmc2V0KSB7DQorICBGWFNZU19hc3NlcnQobV9oRmlsZSAhPSBOVUxMKTsNCisgIEZYU1lTX2ZzZWVrKG1faEZpbGUsIGlPZmZzZXQsIGVTZWVrKTsNCisgIHJldHVybiBGWFNZU19mdGVsbChtX2hGaWxlKTsNCit9DQoraW50MzJfdCBDRlhfRmlsZVN0cmVhbUltcDo6R2V0UG9zaXRpb24oKSB7DQorICBGWFNZU19hc3NlcnQobV9oRmlsZSAhPSBOVUxMKTsNCisgIHJldHVybiBGWFNZU19mdGVsbChtX2hGaWxlKTsNCit9DQorRlhfQk9PTCBDRlhfRmlsZVN0cmVhbUltcDo6SXNFT0YoKSBjb25zdCB7DQorICBGWFNZU19hc3NlcnQobV9oRmlsZSAhPSBOVUxMKTsNCisgIHJldHVybiBGWFNZU19mdGVsbChtX2hGaWxlKSA+PSBtX2lMZW5ndGg7DQorfQ0KK2ludDMyX3QgQ0ZYX0ZpbGVTdHJlYW1JbXA6OlJlYWREYXRhKHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpIHsNCisgIEZYU1lTX2Fzc2VydChtX2hGaWxlICE9IE5VTEwpOw0KKyAgRlhTWVNfYXNzZXJ0KHBCdWZmZXIgIT0gTlVMTCAmJiBpQnVmZmVyU2l6ZSA+IDApOw0KKyAgcmV0dXJuIEZYU1lTX2ZyZWFkKHBCdWZmZXIsIDEsIGlCdWZmZXJTaXplLCBtX2hGaWxlKTsNCit9DQoraW50MzJfdCBDRlhfRmlsZVN0cmVhbUltcDo6UmVhZFN0cmluZyhGWF9XQ0hBUiogcFN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1heExlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFT1MpIHsNCisgIEZYU1lTX2Fzc2VydChtX2hGaWxlICE9IE5VTEwpOw0KKyAgRlhTWVNfYXNzZXJ0KHBTdHIgIT0gTlVMTCAmJiBpTWF4TGVuZ3RoID4gMCk7DQorICBpZiAobV9pTGVuZ3RoIDw9IDApIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpbnQzMl90IGlQb3NpdGlvbiA9IEZYU1lTX2Z0ZWxsKG1faEZpbGUpOw0KKyAgaW50MzJfdCBpTGVuID0gc3RkOjptaW4oKG1faUxlbmd0aCAtIGlQb3NpdGlvbikgLyAyLCBpTWF4TGVuZ3RoKTsNCisgIGlmIChpTGVuIDw9IDApIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpTGVuID0gRlhTWVNfZnJlYWQocFN0ciwgMiwgaUxlbiwgbV9oRmlsZSk7DQorICBpbnQzMl90IGlDb3VudCA9IDA7DQorICB3aGlsZSAoKnBTdHIgIT0gTCdcMCcgJiYgaUNvdW50IDwgaUxlbikgew0KKyAgICBwU3RyKyssIGlDb3VudCsrOw0KKyAgfQ0KKyAgaVBvc2l0aW9uICs9IGlDb3VudCAqIDI7DQorICBpZiAoRlhTWVNfZnRlbGwobV9oRmlsZSkgIT0gaVBvc2l0aW9uKSB7DQorICAgIEZYU1lTX2ZzZWVrKG1faEZpbGUsIGlQb3NpdGlvbiwgMCk7DQorICB9DQorICBiRU9TID0gKGlQb3NpdGlvbiA+PSBtX2lMZW5ndGgpOw0KKyAgcmV0dXJuIGlDb3VudDsNCit9DQoraW50MzJfdCBDRlhfRmlsZVN0cmVhbUltcDo6V3JpdGVEYXRhKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJ1ZmZlclNpemUpIHsNCisgIEZYU1lTX2Fzc2VydChtX2hGaWxlICE9IE5VTEwgJiYgKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpICE9IDApOw0KKyAgRlhTWVNfYXNzZXJ0KHBCdWZmZXIgIT0gTlVMTCAmJiBpQnVmZmVyU2l6ZSA+IDApOw0KKyAgaW50MzJfdCBpUmV0ID0gRlhTWVNfZndyaXRlKHBCdWZmZXIsIDEsIGlCdWZmZXJTaXplLCBtX2hGaWxlKTsNCisgIGlmIChpUmV0ICE9IDApIHsNCisgICAgaW50MzJfdCBpUG9zID0gRlhTWVNfZnRlbGwobV9oRmlsZSk7DQorICAgIGlmIChpUG9zID4gbV9pTGVuZ3RoKSB7DQorICAgICAgbV9pTGVuZ3RoID0gaVBvczsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGlSZXQ7DQorfQ0KK2ludDMyX3QgQ0ZYX0ZpbGVTdHJlYW1JbXA6OldyaXRlU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgpIHsNCisgIEZYU1lTX2Fzc2VydChtX2hGaWxlICE9IE5VTEwgJiYgKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpICE9IDApOw0KKyAgRlhTWVNfYXNzZXJ0KHBTdHIgIT0gTlVMTCAmJiBpTGVuZ3RoID4gMCk7DQorICBpbnQzMl90IGlSZXQgPSBGWFNZU19md3JpdGUocFN0ciwgMiwgaUxlbmd0aCwgbV9oRmlsZSk7DQorICBpZiAoaVJldCAhPSAwKSB7DQorICAgIGludDMyX3QgaVBvcyA9IEZYU1lTX2Z0ZWxsKG1faEZpbGUpOw0KKyAgICBpZiAoaVBvcyA+IG1faUxlbmd0aCkgew0KKyAgICAgIG1faUxlbmd0aCA9IGlQb3M7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBpUmV0Ow0KK30NCit2b2lkIENGWF9GaWxlU3RyZWFtSW1wOjpGbHVzaCgpIHsNCisgIEZYU1lTX2Fzc2VydChtX2hGaWxlICE9IE5VTEwgJiYgKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpICE9IDApOw0KKyAgRlhTWVNfZmZsdXNoKG1faEZpbGUpOw0KK30NCitGWF9CT09MIENGWF9GaWxlU3RyZWFtSW1wOjpTZXRMZW5ndGgoaW50MzJfdCBpTGVuZ3RoKSB7DQorICBGWFNZU19hc3NlcnQobV9oRmlsZSAhPSBOVUxMICYmIChtX2R3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSAhPSAwKTsNCisgIEZYX0JPT0wgYlJldCA9IEZYX2ZzZXRzaXplKG1faEZpbGUsIGlMZW5ndGgpOw0KKyAgbV9pTGVuZ3RoID0gRlhfZmlsZWxlbmd0aChtX2hGaWxlKTsNCisgIHJldHVybiBiUmV0Ow0KK30NCitDRlhfRmlsZVJlYWRTdHJlYW1JbXA6OkNGWF9GaWxlUmVhZFN0cmVhbUltcCgpDQorICAgIDogbV9wRmlsZVJlYWQoTlVMTCksIG1faVBvc2l0aW9uKDApLCBtX2lMZW5ndGgoMCkge30NCitGWF9CT09MIENGWF9GaWxlUmVhZFN0cmVhbUltcDo6TG9hZEZpbGVSZWFkKElGWF9GaWxlUmVhZCogcEZpbGVSZWFkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdBY2Nlc3MpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BGaWxlUmVhZCA9PSBOVUxMICYmIHBGaWxlUmVhZCAhPSBOVUxMKTsNCisgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX3BGaWxlUmVhZCA9IHBGaWxlUmVhZDsNCisgIG1faUxlbmd0aCA9IG1fcEZpbGVSZWFkLT5HZXRTaXplKCk7DQorICByZXR1cm4gVFJVRTsNCit9DQoraW50MzJfdCBDRlhfRmlsZVJlYWRTdHJlYW1JbXA6OkdldExlbmd0aCgpIGNvbnN0IHsNCisgIHJldHVybiBtX2lMZW5ndGg7DQorfQ0KK2ludDMyX3QgQ0ZYX0ZpbGVSZWFkU3RyZWFtSW1wOjpTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIGludDMyX3QgaU9mZnNldCkgew0KKyAgc3dpdGNoIChlU2Vlaykgew0KKyAgICBjYXNlIEZYX1NUUkVBTVNFRUtfQmVnaW46DQorICAgICAgbV9pUG9zaXRpb24gPSBpT2Zmc2V0Ow0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX1NUUkVBTVNFRUtfQ3VycmVudDoNCisgICAgICBtX2lQb3NpdGlvbiArPSBpT2Zmc2V0Ow0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX1NUUkVBTVNFRUtfRW5kOg0KKyAgICAgIG1faVBvc2l0aW9uID0gbV9pTGVuZ3RoICsgaU9mZnNldDsNCisgICAgICBicmVhazsNCisgIH0NCisgIGlmIChtX2lQb3NpdGlvbiA8IDApIHsNCisgICAgbV9pUG9zaXRpb24gPSAwOw0KKyAgfSBlbHNlIGlmIChtX2lQb3NpdGlvbiA+PSBtX2lMZW5ndGgpIHsNCisgICAgbV9pUG9zaXRpb24gPSBtX2lMZW5ndGg7DQorICB9DQorICByZXR1cm4gbV9pUG9zaXRpb247DQorfQ0KK0ZYX0JPT0wgQ0ZYX0ZpbGVSZWFkU3RyZWFtSW1wOjpJc0VPRigpIGNvbnN0IHsNCisgIHJldHVybiBtX2lQb3NpdGlvbiA+PSBtX2lMZW5ndGg7DQorfQ0KK2ludDMyX3QgQ0ZYX0ZpbGVSZWFkU3RyZWFtSW1wOjpSZWFkRGF0YSh1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKSB7DQorICBGWFNZU19hc3NlcnQobV9wRmlsZVJlYWQgIT0gTlVMTCk7DQorICBGWFNZU19hc3NlcnQocEJ1ZmZlciAhPSBOVUxMICYmIGlCdWZmZXJTaXplID4gMCk7DQorICBpZiAoaUJ1ZmZlclNpemUgPiBtX2lMZW5ndGggLSBtX2lQb3NpdGlvbikgew0KKyAgICBpQnVmZmVyU2l6ZSA9IG1faUxlbmd0aCAtIG1faVBvc2l0aW9uOw0KKyAgfQ0KKyAgaWYgKG1fcEZpbGVSZWFkLT5SZWFkQmxvY2socEJ1ZmZlciwgbV9pUG9zaXRpb24sIGlCdWZmZXJTaXplKSkgew0KKyAgICBtX2lQb3NpdGlvbiArPSBpQnVmZmVyU2l6ZTsNCisgICAgcmV0dXJuIGlCdWZmZXJTaXplOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KK2ludDMyX3QgQ0ZYX0ZpbGVSZWFkU3RyZWFtSW1wOjpSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1heExlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRU9TKSB7DQorICBGWFNZU19hc3NlcnQobV9wRmlsZVJlYWQgIT0gTlVMTCk7DQorICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMICYmIGlNYXhMZW5ndGggPiAwKTsNCisgIGlNYXhMZW5ndGggPSBSZWFkRGF0YSgodWludDhfdCopcFN0ciwgaU1heExlbmd0aCAqIDIpIC8gMjsNCisgIGlmIChpTWF4TGVuZ3RoIDw9IDApIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpbnQzMl90IGkgPSAwOw0KKyAgd2hpbGUgKGkgPCBpTWF4TGVuZ3RoICYmIHBTdHJbaV0gIT0gTCdcMCcpIHsNCisgICAgKytpOw0KKyAgfQ0KKyAgYkVPUyA9IChtX2lQb3NpdGlvbiA+PSBtX2lMZW5ndGgpIHx8IHBTdHJbaV0gPT0gTCdcMCc7DQorICByZXR1cm4gaTsNCit9DQorQ0ZYX0J1ZmZlclJlYWRTdHJlYW1JbXA6OkNGWF9CdWZmZXJSZWFkU3RyZWFtSW1wKCkNCisgICAgOiBtX3BCdWZmZXJSZWFkKE5VTEwpLA0KKyAgICAgIG1fYlJlbGVhc2VCdWZmZXJSZWFkKEZBTFNFKSwNCisgICAgICBtX2lQb3NpdGlvbigwKSwNCisgICAgICBtX2lCdWZmZXJTaXplKDApIHt9DQorQ0ZYX0J1ZmZlclJlYWRTdHJlYW1JbXA6On5DRlhfQnVmZmVyUmVhZFN0cmVhbUltcCgpIHsNCisgIGlmIChtX2JSZWxlYXNlQnVmZmVyUmVhZCAmJiBtX3BCdWZmZXJSZWFkICE9IE5VTEwpIHsNCisgICAgbV9wQnVmZmVyUmVhZC0+UmVsZWFzZSgpOw0KKyAgfQ0KK30NCitGWF9CT09MIENGWF9CdWZmZXJSZWFkU3RyZWFtSW1wOjpMb2FkQnVmZmVyUmVhZChJRlhfQnVmZmVyUmVhZCogcEJ1ZmZlclJlYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRmlsZVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdBY2Nlc3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVsZWFzZUJ1ZmZlclJlYWQpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BCdWZmZXJSZWFkID09IE5VTEwgJiYgcEJ1ZmZlclJlYWQgIT0gTlVMTCk7DQorICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9iUmVsZWFzZUJ1ZmZlclJlYWQgPSBiUmVsZWFzZUJ1ZmZlclJlYWQ7DQorICBtX3BCdWZmZXJSZWFkID0gcEJ1ZmZlclJlYWQ7DQorICBtX2lCdWZmZXJTaXplID0gaUZpbGVTaXplOw0KKyAgaWYgKG1faUJ1ZmZlclNpemUgPj0gMCkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIGlmICghbV9wQnVmZmVyUmVhZC0+UmVhZE5leHRCbG9jayhUUlVFKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX2lCdWZmZXJTaXplID0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tTaXplKCk7DQorICB3aGlsZSAoIW1fcEJ1ZmZlclJlYWQtPklzRU9GKCkpIHsNCisgICAgbV9wQnVmZmVyUmVhZC0+UmVhZE5leHRCbG9jayhGQUxTRSk7DQorICAgIG1faUJ1ZmZlclNpemUgKz0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tTaXplKCk7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQoraW50MzJfdCBDRlhfQnVmZmVyUmVhZFN0cmVhbUltcDo6R2V0TGVuZ3RoKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1faUJ1ZmZlclNpemU7DQorfQ0KK2ludDMyX3QgQ0ZYX0J1ZmZlclJlYWRTdHJlYW1JbXA6OlNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgaW50MzJfdCBpT2Zmc2V0KSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBHZXRMZW5ndGgoKTsNCisgIHN3aXRjaCAoZVNlZWspIHsNCisgICAgY2FzZSBGWF9TVFJFQU1TRUVLX0JlZ2luOg0KKyAgICAgIG1faVBvc2l0aW9uID0gaU9mZnNldDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWF9TVFJFQU1TRUVLX0N1cnJlbnQ6DQorICAgICAgbV9pUG9zaXRpb24gKz0gaU9mZnNldDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWF9TVFJFQU1TRUVLX0VuZDoNCisgICAgICBtX2lQb3NpdGlvbiA9IGlMZW5ndGggKyBpT2Zmc2V0Ow0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgaWYgKG1faVBvc2l0aW9uIDwgMCkgew0KKyAgICBtX2lQb3NpdGlvbiA9IDA7DQorICB9IGVsc2UgaWYgKG1faVBvc2l0aW9uID49IGlMZW5ndGgpIHsNCisgICAgbV9pUG9zaXRpb24gPSBpTGVuZ3RoOw0KKyAgfQ0KKyAgcmV0dXJuIG1faVBvc2l0aW9uOw0KK30NCitGWF9CT09MIENGWF9CdWZmZXJSZWFkU3RyZWFtSW1wOjpJc0VPRigpIGNvbnN0IHsNCisgIHJldHVybiBtX3BCdWZmZXJSZWFkID8gbV9wQnVmZmVyUmVhZC0+SXNFT0YoKSA6IFRSVUU7DQorfQ0KK2ludDMyX3QgQ0ZYX0J1ZmZlclJlYWRTdHJlYW1JbXA6OlJlYWREYXRhKHVpbnQ4X3QqIHBCdWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQnVmZmVyU2l6ZSkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcEJ1ZmZlclJlYWQgIT0gTlVMTCk7DQorICBGWFNZU19hc3NlcnQocEJ1ZmZlciAhPSBOVUxMICYmIGlCdWZmZXJTaXplID4gMCk7DQorICBpbnQzMl90IGlMZW5ndGggPSBHZXRMZW5ndGgoKTsNCisgIGlmIChtX2lQb3NpdGlvbiA+PSBpTGVuZ3RoKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaWYgKGlCdWZmZXJTaXplID4gaUxlbmd0aCAtIG1faVBvc2l0aW9uKSB7DQorICAgIGlCdWZmZXJTaXplID0gaUxlbmd0aCAtIG1faVBvc2l0aW9uOw0KKyAgfQ0KKyAgRlhfRFdPUkQgZHdCbG9ja09mZnNldCA9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrT2Zmc2V0KCk7DQorICBGWF9EV09SRCBkd0Jsb2NrU2l6ZSA9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrU2l6ZSgpOw0KKyAgaWYgKG1faVBvc2l0aW9uIDwgKGludDMyX3QpZHdCbG9ja09mZnNldCkgew0KKyAgICBpZiAoIW1fcEJ1ZmZlclJlYWQtPlJlYWROZXh0QmxvY2soVFJVRSkpIHsNCisgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBkd0Jsb2NrT2Zmc2V0ID0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tPZmZzZXQoKTsNCisgICAgZHdCbG9ja1NpemUgPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja1NpemUoKTsNCisgIH0NCisgIHdoaWxlIChtX2lQb3NpdGlvbiA8IChpbnQzMl90KWR3QmxvY2tPZmZzZXQgfHwNCisgICAgICAgICBtX2lQb3NpdGlvbiA+PSAoaW50MzJfdCkoZHdCbG9ja09mZnNldCArIGR3QmxvY2tTaXplKSkgew0KKyAgICBpZiAobV9wQnVmZmVyUmVhZC0+SXNFT0YoKSB8fCAhbV9wQnVmZmVyUmVhZC0+UmVhZE5leHRCbG9jayhGQUxTRSkpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkd0Jsb2NrT2Zmc2V0ID0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tPZmZzZXQoKTsNCisgICAgZHdCbG9ja1NpemUgPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja1NpemUoKTsNCisgIH0NCisgIGlmIChtX2lQb3NpdGlvbiA8IChpbnQzMl90KWR3QmxvY2tPZmZzZXQgfHwNCisgICAgICBtX2lQb3NpdGlvbiA+PSAoaW50MzJfdCkoZHdCbG9ja09mZnNldCArIGR3QmxvY2tTaXplKSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXJUbXAgPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja0J1ZmZlcigpOw0KKyAgRlhfRFdPUkQgZHdPZmZzZXRUbXAgPSBtX2lQb3NpdGlvbiAtIGR3QmxvY2tPZmZzZXQ7DQorICBGWF9EV09SRCBkd0NvcHlTaXplID0NCisgICAgICBzdGQ6Om1pbihpQnVmZmVyU2l6ZSwgKGludDMyX3QpKGR3QmxvY2tTaXplIC0gZHdPZmZzZXRUbXApKTsNCisgIEZYU1lTX21lbWNweShwQnVmZmVyLCBwQnVmZmVyVG1wICsgZHdPZmZzZXRUbXAsIGR3Q29weVNpemUpOw0KKyAgZHdPZmZzZXRUbXAgPSBkd0NvcHlTaXplOw0KKyAgaUJ1ZmZlclNpemUgLT0gZHdDb3B5U2l6ZTsNCisgIHdoaWxlIChpQnVmZmVyU2l6ZSA+IDApIHsNCisgICAgaWYgKCFtX3BCdWZmZXJSZWFkLT5SZWFkTmV4dEJsb2NrKEZBTFNFKSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGR3QmxvY2tPZmZzZXQgPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja09mZnNldCgpOw0KKyAgICBkd0Jsb2NrU2l6ZSA9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrU2l6ZSgpOw0KKyAgICBwQnVmZmVyVG1wID0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tCdWZmZXIoKTsNCisgICAgZHdDb3B5U2l6ZSA9IHN0ZDo6bWluKChGWF9EV09SRClpQnVmZmVyU2l6ZSwgZHdCbG9ja1NpemUpOw0KKyAgICBGWFNZU19tZW1jcHkocEJ1ZmZlciArIGR3T2Zmc2V0VG1wLCBwQnVmZmVyVG1wLCBkd0NvcHlTaXplKTsNCisgICAgZHdPZmZzZXRUbXAgKz0gZHdDb3B5U2l6ZTsNCisgICAgaUJ1ZmZlclNpemUgLT0gZHdDb3B5U2l6ZTsNCisgIH0NCisgIG1faVBvc2l0aW9uICs9IGR3T2Zmc2V0VG1wOw0KKyAgcmV0dXJuIGR3T2Zmc2V0VG1wOw0KK30NCitpbnQzMl90IENGWF9CdWZmZXJSZWFkU3RyZWFtSW1wOjpSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTWF4TGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkVPUykgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcEJ1ZmZlclJlYWQgIT0gTlVMTCk7DQorICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMICYmIGlNYXhMZW5ndGggPiAwKTsNCisgIGlNYXhMZW5ndGggPSBSZWFkRGF0YSgodWludDhfdCopcFN0ciwgaU1heExlbmd0aCAqIDIpIC8gMjsNCisgIGlmIChpTWF4TGVuZ3RoIDw9IDApIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpbnQzMl90IGkgPSAwOw0KKyAgd2hpbGUgKGkgPCBpTWF4TGVuZ3RoICYmIHBTdHJbaV0gIT0gTCdcMCcpIHsNCisgICAgKytpOw0KKyAgfQ0KKyAgYkVPUyA9IChtX2lQb3NpdGlvbiA+PSBHZXRMZW5ndGgoKSkgfHwgcFN0cltpXSA9PSBMJ1wwJzsNCisgIHJldHVybiBpOw0KK30NCitDRlhfRmlsZVdyaXRlU3RyZWFtSW1wOjpDRlhfRmlsZVdyaXRlU3RyZWFtSW1wKCkNCisgICAgOiBtX3BGaWxlV3JpdGUoTlVMTCksIG1faVBvc2l0aW9uKDApIHt9DQorRlhfQk9PTCBDRlhfRmlsZVdyaXRlU3RyZWFtSW1wOjpMb2FkRmlsZVdyaXRlKElGWF9GaWxlV3JpdGUqIHBGaWxlV3JpdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3QWNjZXNzKSB7DQorICBGWFNZU19hc3NlcnQobV9wRmlsZVdyaXRlID09IE5VTEwgJiYgcEZpbGVXcml0ZSAhPSBOVUxMKTsNCisgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19SZWFkKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19BcHBlbmQpIHsNCisgICAgbV9pUG9zaXRpb24gPSBwRmlsZVdyaXRlLT5HZXRTaXplKCk7DQorICB9DQorICBtX3BGaWxlV3JpdGUgPSBwRmlsZVdyaXRlOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK2ludDMyX3QgQ0ZYX0ZpbGVXcml0ZVN0cmVhbUltcDo6R2V0TGVuZ3RoKCkgY29uc3Qgew0KKyAgaWYgKCFtX3BGaWxlV3JpdGUpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICByZXR1cm4gKGludDMyX3QpbV9wRmlsZVdyaXRlLT5HZXRTaXplKCk7DQorfQ0KK2ludDMyX3QgQ0ZYX0ZpbGVXcml0ZVN0cmVhbUltcDo6U2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IEdldExlbmd0aCgpOw0KKyAgc3dpdGNoIChlU2Vlaykgew0KKyAgICBjYXNlIEZYX1NUUkVBTVNFRUtfQmVnaW46DQorICAgICAgbV9pUG9zaXRpb24gPSBpT2Zmc2V0Ow0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX1NUUkVBTVNFRUtfQ3VycmVudDoNCisgICAgICBtX2lQb3NpdGlvbiArPSBpT2Zmc2V0Ow0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX1NUUkVBTVNFRUtfRW5kOg0KKyAgICAgIG1faVBvc2l0aW9uID0gaUxlbmd0aCArIGlPZmZzZXQ7DQorICAgICAgYnJlYWs7DQorICB9DQorICBpZiAobV9pUG9zaXRpb24gPCAwKSB7DQorICAgIG1faVBvc2l0aW9uID0gMDsNCisgIH0gZWxzZSBpZiAobV9pUG9zaXRpb24gPj0gaUxlbmd0aCkgew0KKyAgICBtX2lQb3NpdGlvbiA9IGlMZW5ndGg7DQorICB9DQorICByZXR1cm4gbV9pUG9zaXRpb247DQorfQ0KK0ZYX0JPT0wgQ0ZYX0ZpbGVXcml0ZVN0cmVhbUltcDo6SXNFT0YoKSBjb25zdCB7DQorICByZXR1cm4gbV9pUG9zaXRpb24gPj0gR2V0TGVuZ3RoKCk7DQorfQ0KK2ludDMyX3QgQ0ZYX0ZpbGVXcml0ZVN0cmVhbUltcDo6V3JpdGVEYXRhKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQnVmZmVyU2l6ZSkgew0KKyAgaWYgKCFtX3BGaWxlV3JpdGUpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpZiAobV9wRmlsZVdyaXRlLT5Xcml0ZUJsb2NrKHBCdWZmZXIsIG1faVBvc2l0aW9uLCBpQnVmZmVyU2l6ZSkpIHsNCisgICAgbV9pUG9zaXRpb24gKz0gaUJ1ZmZlclNpemU7DQorICB9DQorICByZXR1cm4gaUJ1ZmZlclNpemU7DQorfQ0KK2ludDMyX3QgQ0ZYX0ZpbGVXcml0ZVN0cmVhbUltcDo6V3JpdGVTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHBTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgpIHsNCisgIHJldHVybiBXcml0ZURhdGEoKGNvbnN0IHVpbnQ4X3QqKXBTdHIsIGlMZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsNCit9DQordm9pZCBDRlhfRmlsZVdyaXRlU3RyZWFtSW1wOjpGbHVzaCgpIHsNCisgIGlmIChtX3BGaWxlV3JpdGUpIHsNCisgICAgbV9wRmlsZVdyaXRlLT5GbHVzaCgpOw0KKyAgfQ0KK30NCitDRlhfQnVmZmVyU3RyZWFtSW1wOjpDRlhfQnVmZmVyU3RyZWFtSW1wKCkNCisgICAgOiBDRlhfU3RyZWFtSW1wKCksDQorICAgICAgbV9wRGF0YShOVUxMKSwNCisgICAgICBtX2lUb3RhbFNpemUoMCksDQorICAgICAgbV9pUG9zaXRpb24oMCksDQorICAgICAgbV9pTGVuZ3RoKDApIHt9DQorRlhfQk9PTCBDRlhfQnVmZmVyU3RyZWFtSW1wOjpMb2FkQnVmZmVyKHVpbnQ4X3QqIHBEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlUb3RhbFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3QWNjZXNzKSB7DQorICBGWFNZU19hc3NlcnQobV9wRGF0YSA9PSBOVUxMKTsNCisgIEZYU1lTX2Fzc2VydChwRGF0YSAhPSBOVUxMICYmIGlUb3RhbFNpemUgPiAwKTsNCisgIG1fZHdBY2Nlc3MgPSBkd0FjY2VzczsNCisgIG1fcERhdGEgPSBwRGF0YTsNCisgIG1faVRvdGFsU2l6ZSA9IGlUb3RhbFNpemU7DQorICBtX2lQb3NpdGlvbiA9IDA7DQorICBtX2lMZW5ndGggPSAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpICE9IDAgPyAwIDogaVRvdGFsU2l6ZTsNCisgIHJldHVybiBUUlVFOw0KK30NCitpbnQzMl90IENGWF9CdWZmZXJTdHJlYW1JbXA6OkdldExlbmd0aCgpIGNvbnN0IHsNCisgIEZYU1lTX2Fzc2VydChtX3BEYXRhICE9IE5VTEwpOw0KKyAgcmV0dXJuIG1faUxlbmd0aDsNCit9DQoraW50MzJfdCBDRlhfQnVmZmVyU3RyZWFtSW1wOjpTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIGludDMyX3QgaU9mZnNldCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcERhdGEgIT0gTlVMTCk7DQorICBpZiAoZVNlZWsgPT0gRlhfU1RSRUFNU0VFS19CZWdpbikgew0KKyAgICBtX2lQb3NpdGlvbiA9IGlPZmZzZXQ7DQorICB9IGVsc2UgaWYgKGVTZWVrID09IEZYX1NUUkVBTVNFRUtfQ3VycmVudCkgew0KKyAgICBtX2lQb3NpdGlvbiArPSBpT2Zmc2V0Ow0KKyAgfSBlbHNlIGlmIChlU2VlayA9PSBGWF9TVFJFQU1TRUVLX0VuZCkgew0KKyAgICBtX2lQb3NpdGlvbiA9IG1faUxlbmd0aCArIGlPZmZzZXQ7DQorICB9DQorICBpZiAobV9pUG9zaXRpb24gPiBtX2lMZW5ndGgpIHsNCisgICAgbV9pUG9zaXRpb24gPSBtX2lMZW5ndGg7DQorICB9DQorICBpZiAobV9pUG9zaXRpb24gPCAwKSB7DQorICAgIG1faVBvc2l0aW9uID0gMDsNCisgIH0NCisgIHJldHVybiBtX2lQb3NpdGlvbjsNCit9DQoraW50MzJfdCBDRlhfQnVmZmVyU3RyZWFtSW1wOjpHZXRQb3NpdGlvbigpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BEYXRhICE9IE5VTEwpOw0KKyAgcmV0dXJuIG1faVBvc2l0aW9uOw0KK30NCitGWF9CT09MIENGWF9CdWZmZXJTdHJlYW1JbXA6OklzRU9GKCkgY29uc3Qgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcERhdGEgIT0gTlVMTCk7DQorICByZXR1cm4gbV9pUG9zaXRpb24gPj0gbV9pTGVuZ3RoOw0KK30NCitpbnQzMl90IENGWF9CdWZmZXJTdHJlYW1JbXA6OlJlYWREYXRhKHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BEYXRhICE9IE5VTEwpOw0KKyAgRlhTWVNfYXNzZXJ0KHBCdWZmZXIgIT0gTlVMTCAmJiBpQnVmZmVyU2l6ZSA+IDApOw0KKyAgaW50MzJfdCBpTGVuID0gc3RkOjptaW4obV9pTGVuZ3RoIC0gbV9pUG9zaXRpb24sIGlCdWZmZXJTaXplKTsNCisgIGlmIChpTGVuIDw9IDApIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBGWFNZU19tZW1jcHkocEJ1ZmZlciwgbV9wRGF0YSArIG1faVBvc2l0aW9uLCBpTGVuKTsNCisgIG1faVBvc2l0aW9uICs9IGlMZW47DQorICByZXR1cm4gaUxlbjsNCit9DQoraW50MzJfdCBDRlhfQnVmZmVyU3RyZWFtSW1wOjpSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNYXhMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJFT1MpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BEYXRhICE9IE5VTEwpOw0KKyAgRlhTWVNfYXNzZXJ0KHBTdHIgIT0gTlVMTCAmJiBpTWF4TGVuZ3RoID4gMCk7DQorICBpbnQzMl90IGlMZW4gPSBzdGQ6Om1pbigobV9pTGVuZ3RoIC0gbV9pUG9zaXRpb24pIC8gMiwgaU1heExlbmd0aCk7DQorICBpZiAoaUxlbiA8PSAwKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgY29uc3QgRlhfV0NIQVIqIHBTcmMgPSAoY29uc3QgRlhfV0NIQVIqKShGWF9DSEFSKikobV9wRGF0YSArIG1faVBvc2l0aW9uKTsNCisgIGludDMyX3QgaUNvdW50ID0gMDsNCisgIHdoaWxlICgqcFNyYyAhPSBMJ1wwJyAmJiBpQ291bnQgPCBpTGVuKSB7DQorICAgICpwU3RyKysgPSAqcFNyYysrLCBpQ291bnQrKzsNCisgIH0NCisgIG1faVBvc2l0aW9uICs9IGlDb3VudCAqIDI7DQorICBiRU9TID0gKCpwU3JjID09IEwnXDAnKSB8fCAobV9pUG9zaXRpb24gPj0gbV9pTGVuZ3RoKTsNCisgIHJldHVybiBpQ291bnQ7DQorfQ0KK2ludDMyX3QgQ0ZYX0J1ZmZlclN0cmVhbUltcDo6V3JpdGVEYXRhKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQnVmZmVyU2l6ZSkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcERhdGEgIT0gTlVMTCAmJiAobV9kd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgIT0gMCk7DQorICBGWFNZU19hc3NlcnQocEJ1ZmZlciAhPSBOVUxMICYmIGlCdWZmZXJTaXplID4gMCk7DQorICBpbnQzMl90IGlMZW4gPSBzdGQ6Om1pbihtX2lUb3RhbFNpemUgLSBtX2lQb3NpdGlvbiwgaUJ1ZmZlclNpemUpOw0KKyAgaWYgKGlMZW4gPD0gMCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIEZYU1lTX21lbWNweShtX3BEYXRhICsgbV9pUG9zaXRpb24sIHBCdWZmZXIsIGlMZW4pOw0KKyAgbV9pUG9zaXRpb24gKz0gaUxlbjsNCisgIGlmIChtX2lQb3NpdGlvbiA+IG1faUxlbmd0aCkgew0KKyAgICBtX2lMZW5ndGggPSBtX2lQb3NpdGlvbjsNCisgIH0NCisgIHJldHVybiBpTGVuOw0KK30NCitpbnQzMl90IENGWF9CdWZmZXJTdHJlYW1JbXA6OldyaXRlU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoKSB7DQorICBGWFNZU19hc3NlcnQobV9wRGF0YSAhPSBOVUxMICYmIChtX2R3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSAhPSAwKTsNCisgIEZYU1lTX2Fzc2VydChwU3RyICE9IE5VTEwgJiYgaUxlbmd0aCA+IDApOw0KKyAgaW50MzJfdCBpTGVuID0gc3RkOjptaW4oKG1faVRvdGFsU2l6ZSAtIG1faVBvc2l0aW9uKSAvIDIsIGlMZW5ndGgpOw0KKyAgaWYgKGlMZW4gPD0gMCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIEZYU1lTX21lbWNweShtX3BEYXRhICsgbV9pUG9zaXRpb24sIHBTdHIsIGlMZW4gKiAyKTsNCisgIG1faVBvc2l0aW9uICs9IGlMZW4gKiAyOw0KKyAgaWYgKG1faVBvc2l0aW9uID4gbV9pTGVuZ3RoKSB7DQorICAgIG1faUxlbmd0aCA9IG1faVBvc2l0aW9uOw0KKyAgfQ0KKyAgcmV0dXJuIGlMZW47DQorfQ0KK0lGWF9TdHJlYW0qIElGWF9TdHJlYW06OkNyZWF0ZVRleHRTdHJlYW0oSUZYX1N0cmVhbSogcEJhc2VTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEZWxldGVPblJlbGVhc2UpIHsNCisgIEZYU1lTX2Fzc2VydChwQmFzZVN0cmVhbSAhPSBOVUxMKTsNCisgIHJldHVybiBuZXcgQ0ZYX1RleHRTdHJlYW0ocEJhc2VTdHJlYW0sIGJEZWxldGVPblJlbGVhc2UpOw0KK30NCitDRlhfVGV4dFN0cmVhbTo6Q0ZYX1RleHRTdHJlYW0oSUZYX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiRGVsU3RyZWFtKQ0KKyAgICA6IG1fd0NvZGVQYWdlKEZYX0NPREVQQUdFX0RlZkFOU0kpLA0KKyAgICAgIG1fd0JPTUxlbmd0aCgwKSwNCisgICAgICBtX2R3Qk9NKDApLA0KKyAgICAgIG1fcEJ1ZihOVUxMKSwNCisgICAgICBtX2lCdWZTaXplKDApLA0KKyAgICAgIG1fYkRlbFN0cmVhbShiRGVsU3RyZWFtKSwNCisgICAgICBtX3BTdHJlYW1JbXAocFN0cmVhbSksDQorICAgICAgbV9pUmVmQ291bnQoMSkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcFN0cmVhbUltcCAhPSBOVUxMKTsNCisgIG1fcFN0cmVhbUltcC0+UmV0YWluKCk7DQorICBJbml0U3RyZWFtKCk7DQorfQ0KK0NGWF9UZXh0U3RyZWFtOjp+Q0ZYX1RleHRTdHJlYW0oKSB7DQorICBtX3BTdHJlYW1JbXAtPlJlbGVhc2UoKTsNCisgIGlmIChtX2JEZWxTdHJlYW0pIHsNCisgICAgbV9wU3RyZWFtSW1wLT5SZWxlYXNlKCk7DQorICB9DQorICBpZiAobV9wQnVmICE9IE5VTEwpIHsNCisgICAgRlhfRnJlZShtX3BCdWYpOw0KKyAgfQ0KK30NCit2b2lkIENGWF9UZXh0U3RyZWFtOjpJbml0U3RyZWFtKCkgew0KKyAgaW50MzJfdCBpUG9zaXRpb24gPSBtX3BTdHJlYW1JbXAtPkdldFBvc2l0aW9uKCk7DQorICBtX3BTdHJlYW1JbXAtPlNlZWsoRlhfU1RSRUFNU0VFS19CZWdpbiwgMCk7DQorICBtX3BTdHJlYW1JbXAtPlJlYWREYXRhKCh1aW50OF90KikmbV9kd0JPTSwgMyk7DQorI2lmIF9GWF9FTkRJQU5fID09IF9GWF9MSVRUTEVfRU5ESUFOXw0KKyAgbV9kd0JPTSAmPSAweDAwRkZGRkZGOw0KKyAgaWYgKG1fZHdCT00gPT0gMHgwMEJGQkJFRikgew0KKyAgICBtX3dCT01MZW5ndGggPSAzOw0KKyAgICBtX3dDb2RlUGFnZSA9IEZYX0NPREVQQUdFX1VURjg7DQorICB9IGVsc2Ugew0KKyAgICBtX2R3Qk9NICY9IDB4MDAwMEZGRkY7DQorICAgIGlmIChtX2R3Qk9NID09IDB4MDAwMEZGRkUpIHsNCisgICAgICBtX3dCT01MZW5ndGggPSAyOw0KKyAgICAgIG1fd0NvZGVQYWdlID0gRlhfQ09ERVBBR0VfVVRGMTZCRTsNCisgICAgfSBlbHNlIGlmIChtX2R3Qk9NID09IDB4MDAwMEZFRkYpIHsNCisgICAgICBtX3dCT01MZW5ndGggPSAyOw0KKyAgICAgIG1fd0NvZGVQYWdlID0gRlhfQ09ERVBBR0VfVVRGMTZMRTsNCisgICAgfSBlbHNlIHsNCisgICAgICBtX3dCT01MZW5ndGggPSAwOw0KKyAgICAgIG1fZHdCT00gPSAwOw0KKyAgICAgIG1fd0NvZGVQYWdlID0gRlhTWVNfR2V0QUNQKCk7DQorICAgIH0NCisgIH0NCisjZWxzZQ0KKyAgbV9kd0JPTSAmPSAweEZGRkZGRjAwOw0KKyAgaWYgKG1fZHdCT00gPT0gMHhFRkJCQkYwMCkgew0KKyAgICBtX3dCT01MZW5ndGggPSAzOw0KKyAgICBtX3dDb2RlUGFnZSA9IEZYX0NPREVQQUdFX1VURjg7DQorICB9IGVsc2Ugew0KKyAgICBtX2R3Qk9NICY9IDB4RkZGRjAwMDA7DQorICAgIGlmIChtX2R3Qk9NID09IDB4RkVGRjAwMDApIHsNCisgICAgICBtX3dCT01MZW5ndGggPSAyOw0KKyAgICAgIG1fd0NvZGVQYWdlID0gRlhfQ09ERVBBR0VfVVRGMTZCRTsNCisgICAgfSBlbHNlIGlmIChtX2R3Qk9NID09IDB4RkZGRTAwMDApIHsNCisgICAgICBtX3dCT01MZW5ndGggPSAyOw0KKyAgICAgIG1fd0NvZGVQYWdlID0gRlhfQ09ERVBBR0VfVVRGMTZMRTsNCisgICAgfSBlbHNlIHsNCisgICAgICBtX3dCT01MZW5ndGggPSAwOw0KKyAgICAgIG1fZHdCT00gPSAwOw0KKyAgICAgIG1fd0NvZGVQYWdlID0gRlhTWVNfR2V0QUNQKCk7DQorICAgIH0NCisgIH0NCisjZW5kaWYNCisgIG1fcFN0cmVhbUltcC0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCBzdGQ6Om1heChtX3dCT01MZW5ndGgsIGlQb3NpdGlvbikpOw0KK30NCit2b2lkIENGWF9UZXh0U3RyZWFtOjpSZWxlYXNlKCkgew0KKyAgaWYgKC0tbV9pUmVmQ291bnQgPCAxKSB7DQorICAgIGRlbGV0ZSB0aGlzOw0KKyAgfQ0KK30NCitJRlhfU3RyZWFtKiBDRlhfVGV4dFN0cmVhbTo6UmV0YWluKCkgew0KKyAgbV9pUmVmQ291bnQrKzsNCisgIHJldHVybiB0aGlzOw0KK30NCitGWF9EV09SRCBDRlhfVGV4dFN0cmVhbTo6R2V0QWNjZXNzTW9kZXMoKSBjb25zdCB7DQorICByZXR1cm4gbV9wU3RyZWFtSW1wLT5HZXRBY2Nlc3NNb2RlcygpIHwgRlhfU1RSRUFNQUNDRVNTX1RleHQ7DQorfQ0KK2ludDMyX3QgQ0ZYX1RleHRTdHJlYW06OkdldExlbmd0aCgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BTdHJlYW1JbXAtPkdldExlbmd0aCgpOw0KK30NCitpbnQzMl90IENGWF9UZXh0U3RyZWFtOjpTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIGludDMyX3QgaU9mZnNldCkgew0KKyAgcmV0dXJuIG1fcFN0cmVhbUltcC0+U2VlayhlU2VlaywgaU9mZnNldCk7DQorfQ0KK2ludDMyX3QgQ0ZYX1RleHRTdHJlYW06OkdldFBvc2l0aW9uKCkgew0KKyAgcmV0dXJuIG1fcFN0cmVhbUltcC0+R2V0UG9zaXRpb24oKTsNCit9DQorRlhfQk9PTCBDRlhfVGV4dFN0cmVhbTo6SXNFT0YoKSBjb25zdCB7DQorICByZXR1cm4gbV9wU3RyZWFtSW1wLT5Jc0VPRigpOw0KK30NCitpbnQzMl90IENGWF9UZXh0U3RyZWFtOjpSZWFkRGF0YSh1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKSB7DQorICByZXR1cm4gbV9wU3RyZWFtSW1wLT5SZWFkRGF0YShwQnVmZmVyLCBpQnVmZmVyU2l6ZSk7DQorfQ0KK2ludDMyX3QgQ0ZYX1RleHRTdHJlYW06OldyaXRlRGF0YShjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKSB7DQorICByZXR1cm4gbV9wU3RyZWFtSW1wLT5Xcml0ZURhdGEocEJ1ZmZlciwgaUJ1ZmZlclNpemUpOw0KK30NCit2b2lkIENGWF9UZXh0U3RyZWFtOjpGbHVzaCgpIHsNCisgIG1fcFN0cmVhbUltcC0+Rmx1c2goKTsNCit9DQorRlhfQk9PTCBDRlhfVGV4dFN0cmVhbTo6U2V0TGVuZ3RoKGludDMyX3QgaUxlbmd0aCkgew0KKyAgcmV0dXJuIG1fcFN0cmVhbUltcC0+U2V0TGVuZ3RoKGlMZW5ndGgpOw0KK30NCitGWF9XT1JEIENGWF9UZXh0U3RyZWFtOjpHZXRDb2RlUGFnZSgpIGNvbnN0IHsNCisgIHJldHVybiBtX3dDb2RlUGFnZTsNCit9DQorSUZYX1N0cmVhbSogQ0ZYX1RleHRTdHJlYW06OkNyZWF0ZVNoYXJlZFN0cmVhbShGWF9EV09SRCBkd0FjY2VzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU9mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCkgew0KKyAgSUZYX1N0cmVhbSogcFNSID0NCisgICAgICBtX3BTdHJlYW1JbXAtPkNyZWF0ZVNoYXJlZFN0cmVhbShkd0FjY2VzcywgaU9mZnNldCwgaUxlbmd0aCk7DQorICBpZiAocFNSID09IE5VTEwpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfVGV4dCkgew0KKyAgICByZXR1cm4gbmV3IENGWF9UZXh0U3RyZWFtKHBTUiwgVFJVRSk7DQorICB9DQorICByZXR1cm4gcFNSOw0KK30NCitpbnQzMl90IENGWF9UZXh0U3RyZWFtOjpHZXRCT00odWludDhfdCBib21bNF0pIGNvbnN0IHsNCisgIGlmIChtX3dCT01MZW5ndGggPCAxKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgKihGWF9EV09SRCopYm9tID0gbV9kd0JPTTsNCisgIHJldHVybiBtX3dCT01MZW5ndGg7DQorfQ0KK0ZYX1dPUkQgQ0ZYX1RleHRTdHJlYW06OlNldENvZGVQYWdlKEZYX1dPUkQgd0NvZGVQYWdlKSB7DQorICBpZiAobV93Qk9NTGVuZ3RoID4gMCkgew0KKyAgICByZXR1cm4gbV93Q29kZVBhZ2U7DQorICB9DQorICBGWF9XT1JEIHYgPSBtX3dDb2RlUGFnZTsNCisgIG1fd0NvZGVQYWdlID0gd0NvZGVQYWdlOw0KKyAgcmV0dXJuIHY7DQorfQ0KK2ludDMyX3QgQ0ZYX1RleHRTdHJlYW06OlJlYWRTdHJpbmcoRlhfV0NIQVIqIHBTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNYXhMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRU9TLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb25zdCogcEJ5dGVTaXplKSB7DQorICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMICYmIGlNYXhMZW5ndGggPiAwKTsNCisgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBpbnQzMl90IGlMZW47DQorICBpZiAobV93Q29kZVBhZ2UgPT0gRlhfQ09ERVBBR0VfVVRGMTZMRSB8fA0KKyAgICAgIG1fd0NvZGVQYWdlID09IEZYX0NPREVQQUdFX1VURjE2QkUpIHsNCisgICAgaW50MzJfdCBpQnl0ZXMgPSBwQnl0ZVNpemUgPT0gTlVMTCA/IGlNYXhMZW5ndGggKiAyIDogKnBCeXRlU2l6ZTsNCisgICAgbV9wU3RyZWFtSW1wLT5Mb2NrKCk7DQorICAgIGlMZW4gPSBtX3BTdHJlYW1JbXAtPlJlYWREYXRhKCh1aW50OF90KilwU3RyLCBpQnl0ZXMpOw0KKyAgICBtX3BTdHJlYW1JbXAtPlVubG9jaygpOw0KKyAgICBpTWF4TGVuZ3RoID0gaUxlbiAvIDI7DQorICAgIGlmIChzaXplb2YoRlhfV0NIQVIpID4gMikgew0KKyAgICAgIEZYX1VURjE2VG9XQ2hhcihwU3RyLCBpTWF4TGVuZ3RoKTsNCisgICAgfQ0KKyNpZiBfRlhfRU5ESUFOXyA9PSBfRlhfQklHX0VORElBTl8NCisgICAgaWYgKG1fd0NvZGVQYWdlID09IEZYX0NPREVQQUdFX1VURjE2TEUpIHsNCisgICAgICBGWF9Td2FwQnl0ZU9yZGVyKHBTdHIsIGlNYXhMZW5ndGgpOw0KKyAgICB9DQorI2Vsc2UNCisgICAgaWYgKG1fd0NvZGVQYWdlID09IEZYX0NPREVQQUdFX1VURjE2QkUpIHsNCisgICAgICBGWF9Td2FwQnl0ZU9yZGVyKHBTdHIsIGlNYXhMZW5ndGgpOw0KKyAgICB9DQorI2VuZGlmDQorICB9IGVsc2Ugew0KKyAgICBpbnQzMl90IHBvcyA9IG1fcFN0cmVhbUltcC0+R2V0UG9zaXRpb24oKTsNCisgICAgaW50MzJfdCBpQnl0ZXMgPSBwQnl0ZVNpemUgPT0gTlVMTCA/IGlNYXhMZW5ndGggOiAqcEJ5dGVTaXplOw0KKyAgICBpQnl0ZXMgPSBzdGQ6Om1pbihpQnl0ZXMsIG1fcFN0cmVhbUltcC0+R2V0TGVuZ3RoKCkgLSBwb3MpOw0KKyAgICBpZiAoaUJ5dGVzID4gMCkgew0KKyAgICAgIGlmIChtX3BCdWYgPT0gTlVMTCkgew0KKyAgICAgICAgbV9wQnVmID0gRlhfQWxsb2ModWludDhfdCwgaUJ5dGVzKTsNCisgICAgICAgIG1faUJ1ZlNpemUgPSBpQnl0ZXM7DQorICAgICAgfSBlbHNlIGlmIChpQnl0ZXMgPiBtX2lCdWZTaXplKSB7DQorICAgICAgICBtX3BCdWYgPSBGWF9SZWFsbG9jKHVpbnQ4X3QsIG1fcEJ1ZiwgaUJ5dGVzKTsNCisgICAgICAgIG1faUJ1ZlNpemUgPSBpQnl0ZXM7DQorICAgICAgfQ0KKyAgICAgIG1fcFN0cmVhbUltcC0+TG9jaygpOw0KKyAgICAgIGlMZW4gPSBtX3BTdHJlYW1JbXAtPlJlYWREYXRhKG1fcEJ1ZiwgaUJ5dGVzKTsNCisgICAgICBpbnQzMl90IGlTcmMgPSBpTGVuOw0KKyAgICAgIGludDMyX3QgaURlY29kZSA9IEZYX0RlY29kZVN0cmluZyhtX3dDb2RlUGFnZSwgKGNvbnN0IEZYX0NIQVIqKW1fcEJ1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlTcmMsIHBTdHIsICZpTWF4TGVuZ3RoLCBUUlVFKTsNCisgICAgICBtX3BTdHJlYW1JbXAtPlNlZWsoRlhfU1RSRUFNU0VFS19DdXJyZW50LCBpU3JjIC0gaUxlbik7DQorICAgICAgbV9wU3RyZWFtSW1wLT5VbmxvY2soKTsNCisgICAgICBpZiAoaURlY29kZSA8IDEpIHsNCisgICAgICAgIHJldHVybiAtMTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgaU1heExlbmd0aCA9IDA7DQorICAgIH0NCisgIH0NCisgIGJFT1MgPSBtX3BTdHJlYW1JbXAtPklzRU9GKCk7DQorICByZXR1cm4gaU1heExlbmd0aDsNCit9DQoraW50MzJfdCBDRlhfVGV4dFN0cmVhbTo6V3JpdGVTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBTdHIgIT0gTlVMTCAmJiBpTGVuZ3RoID4gMCk7DQorICBpZiAoKG1fcFN0cmVhbUltcC0+R2V0QWNjZXNzTW9kZXMoKSAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgPT0gMCkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBpZiAobV93Q29kZVBhZ2UgPT0gRlhfQ09ERVBBR0VfVVRGOCkgew0KKyAgICBpbnQzMl90IGxlbiA9IGlMZW5ndGg7DQorICAgIENGWF9VVEY4RW5jb2RlciBlbmNvZGVyOw0KKyAgICB3aGlsZSAobGVuLS0gPiAwKSB7DQorICAgICAgZW5jb2Rlci5JbnB1dCgqcFN0cisrKTsNCisgICAgfQ0KKyAgICBDRlhfQnl0ZVN0cmluZ0MgYnNSZXN1bHQgPSBlbmNvZGVyLkdldFJlc3VsdCgpOw0KKyAgICBtX3BTdHJlYW1JbXAtPkxvY2soKTsNCisgICAgbV9wU3RyZWFtSW1wLT5Xcml0ZURhdGEoKGNvbnN0IHVpbnQ4X3QqKWJzUmVzdWx0LkdldENTdHIoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNSZXN1bHQuR2V0TGVuZ3RoKCkpOw0KKyAgICBtX3BTdHJlYW1JbXAtPlVubG9jaygpOw0KKyAgfQ0KKyAgcmV0dXJuIGlMZW5ndGg7DQorfQ0KK0NGWF9TdHJlYW06OkNGWF9TdHJlYW0oKQ0KKyAgICA6IG1fZVN0cmVhbVR5cGUoRlhfU1JFQU1UWVBFX1Vua25vd24pLA0KKyAgICAgIG1fcFN0cmVhbUltcChOVUxMKSwNCisgICAgICBtX2R3QWNjZXNzKDApLA0KKyAgICAgIG1faVRvdGFsU2l6ZSgwKSwNCisgICAgICBtX2lQb3NpdGlvbigwKSwNCisgICAgICBtX2lTdGFydCgwKSwNCisgICAgICBtX2lMZW5ndGgoMCksDQorICAgICAgbV9pUmVmQ291bnQoMSkge30NCitDRlhfU3RyZWFtOjp+Q0ZYX1N0cmVhbSgpIHsNCisgIGlmIChtX2VTdHJlYW1UeXBlICE9IEZYX1NUUkVBTVRZUEVfU3RyZWFtICYmIG1fcFN0cmVhbUltcCAhPSBOVUxMKSB7DQorICAgIG1fcFN0cmVhbUltcC0+UmVsZWFzZSgpOw0KKyAgfQ0KK30NCitGWF9CT09MIENGWF9TdHJlYW06OkxvYWRGaWxlKGNvbnN0IEZYX1dDSEFSKiBwc3pTcmNGaWxlTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3QWNjZXNzKSB7DQorICBpZiAobV9lU3RyZWFtVHlwZSAhPSBGWF9TUkVBTVRZUEVfVW5rbm93biB8fCBtX3BTdHJlYW1JbXAgIT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAocHN6U3JjRmlsZU5hbWUgPT0gTlVMTCB8fCBGWFNZU193Y3NsZW4ocHN6U3JjRmlsZU5hbWUpIDwgMSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX3BTdHJlYW1JbXAgPSBuZXcgQ0ZYX0ZpbGVTdHJlYW1JbXAoKTsNCisgIEZYX0JPT0wgYlJldCA9DQorICAgICAgKChDRlhfRmlsZVN0cmVhbUltcCopbV9wU3RyZWFtSW1wKS0+TG9hZEZpbGUocHN6U3JjRmlsZU5hbWUsIGR3QWNjZXNzKTsNCisgIGlmICghYlJldCkgew0KKyAgICBtX3BTdHJlYW1JbXAtPlJlbGVhc2UoKTsNCisgICAgbV9wU3RyZWFtSW1wID0gTlVMTDsNCisgIH0gZWxzZSB7DQorICAgIG1fZVN0cmVhbVR5cGUgPSBGWF9TVFJFQU1UWVBFX0ZpbGU7DQorICAgIG1fZHdBY2Nlc3MgPSBkd0FjY2VzczsNCisgICAgbV9pTGVuZ3RoID0gbV9wU3RyZWFtSW1wLT5HZXRMZW5ndGgoKTsNCisgIH0NCisgIHJldHVybiBiUmV0Ow0KK30NCitGWF9CT09MIENGWF9TdHJlYW06OkxvYWRGaWxlUmVhZChJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZCwgRlhfRFdPUkQgZHdBY2Nlc3MpIHsNCisgIGlmIChtX2VTdHJlYW1UeXBlICE9IEZYX1NSRUFNVFlQRV9Vbmtub3duIHx8IG1fcFN0cmVhbUltcCAhPSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChwRmlsZVJlYWQgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX3BTdHJlYW1JbXAgPSBuZXcgQ0ZYX0ZpbGVSZWFkU3RyZWFtSW1wKCk7DQorICBGWF9CT09MIGJSZXQgPQ0KKyAgICAgICgoQ0ZYX0ZpbGVSZWFkU3RyZWFtSW1wKiltX3BTdHJlYW1JbXApLT5Mb2FkRmlsZVJlYWQocEZpbGVSZWFkLCBkd0FjY2Vzcyk7DQorICBpZiAoIWJSZXQpIHsNCisgICAgbV9wU3RyZWFtSW1wLT5SZWxlYXNlKCk7DQorICAgIG1fcFN0cmVhbUltcCA9IE5VTEw7DQorICB9IGVsc2Ugew0KKyAgICBtX2VTdHJlYW1UeXBlID0gRlhfU1RSRUFNVFlQRV9GaWxlOw0KKyAgICBtX2R3QWNjZXNzID0gZHdBY2Nlc3M7DQorICAgIG1faUxlbmd0aCA9IG1fcFN0cmVhbUltcC0+R2V0TGVuZ3RoKCk7DQorICB9DQorICByZXR1cm4gYlJldDsNCit9DQorRlhfQk9PTCBDRlhfU3RyZWFtOjpMb2FkRmlsZVdyaXRlKElGWF9GaWxlV3JpdGUqIHBGaWxlV3JpdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3QWNjZXNzKSB7DQorICBpZiAobV9lU3RyZWFtVHlwZSAhPSBGWF9TUkVBTVRZUEVfVW5rbm93biB8fCBtX3BTdHJlYW1JbXAgIT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAocEZpbGVXcml0ZSA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIG1fcFN0cmVhbUltcCA9IG5ldyBDRlhfRmlsZVdyaXRlU3RyZWFtSW1wKCk7DQorICBGWF9CT09MIGJSZXQgPSAoKENGWF9GaWxlV3JpdGVTdHJlYW1JbXAqKW1fcFN0cmVhbUltcCkNCisgICAgICAgICAgICAgICAgICAgICAtPkxvYWRGaWxlV3JpdGUocEZpbGVXcml0ZSwgZHdBY2Nlc3MpOw0KKyAgaWYgKCFiUmV0KSB7DQorICAgIG1fcFN0cmVhbUltcC0+UmVsZWFzZSgpOw0KKyAgICBtX3BTdHJlYW1JbXAgPSBOVUxMOw0KKyAgfSBlbHNlIHsNCisgICAgbV9lU3RyZWFtVHlwZSA9IEZYX1NUUkVBTVRZUEVfRmlsZTsNCisgICAgbV9kd0FjY2VzcyA9IGR3QWNjZXNzOw0KKyAgICBtX2lMZW5ndGggPSBtX3BTdHJlYW1JbXAtPkdldExlbmd0aCgpOw0KKyAgfQ0KKyAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wgQ0ZYX1N0cmVhbTo6TG9hZEJ1ZmZlcih1aW50OF90KiBwRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVG90YWxTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0FjY2Vzcykgew0KKyAgaWYgKG1fZVN0cmVhbVR5cGUgIT0gRlhfU1JFQU1UWVBFX1Vua25vd24gfHwgbV9wU3RyZWFtSW1wICE9IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHBEYXRhID09IE5VTEwgfHwgaVRvdGFsU2l6ZSA8IDEpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9wU3RyZWFtSW1wID0gbmV3IENGWF9CdWZmZXJTdHJlYW1JbXAoKTsNCisgIEZYX0JPT0wgYlJldCA9ICgoQ0ZYX0J1ZmZlclN0cmVhbUltcCopbV9wU3RyZWFtSW1wKQ0KKyAgICAgICAgICAgICAgICAgICAgIC0+TG9hZEJ1ZmZlcihwRGF0YSwgaVRvdGFsU2l6ZSwgZHdBY2Nlc3MpOw0KKyAgaWYgKCFiUmV0KSB7DQorICAgIG1fcFN0cmVhbUltcC0+UmVsZWFzZSgpOw0KKyAgICBtX3BTdHJlYW1JbXAgPSBOVUxMOw0KKyAgfSBlbHNlIHsNCisgICAgbV9lU3RyZWFtVHlwZSA9IEZYX1NUUkVBTVRZUEVfQnVmZmVyOw0KKyAgICBtX2R3QWNjZXNzID0gZHdBY2Nlc3M7DQorICAgIG1faUxlbmd0aCA9IG1fcFN0cmVhbUltcC0+R2V0TGVuZ3RoKCk7DQorICB9DQorICByZXR1cm4gYlJldDsNCit9DQorRlhfQk9PTCBDRlhfU3RyZWFtOjpMb2FkQnVmZmVyUmVhZChJRlhfQnVmZmVyUmVhZCogcEJ1ZmZlclJlYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlGaWxlU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3QWNjZXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVsZWFzZUJ1ZmZlclJlYWQpIHsNCisgIGlmIChtX2VTdHJlYW1UeXBlICE9IEZYX1NSRUFNVFlQRV9Vbmtub3duIHx8IG1fcFN0cmVhbUltcCAhPSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICghcEJ1ZmZlclJlYWQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9wU3RyZWFtSW1wID0gbmV3IENGWF9CdWZmZXJSZWFkU3RyZWFtSW1wOw0KKyAgRlhfQk9PTCBiUmV0ID0gKChDRlhfQnVmZmVyUmVhZFN0cmVhbUltcCopbV9wU3RyZWFtSW1wKQ0KKyAgICAgICAgICAgICAgICAgICAgIC0+TG9hZEJ1ZmZlclJlYWQocEJ1ZmZlclJlYWQsIGlGaWxlU2l6ZSwgZHdBY2Nlc3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVsZWFzZUJ1ZmZlclJlYWQpOw0KKyAgaWYgKCFiUmV0KSB7DQorICAgIG1fcFN0cmVhbUltcC0+UmVsZWFzZSgpOw0KKyAgICBtX3BTdHJlYW1JbXAgPSBOVUxMOw0KKyAgfSBlbHNlIHsNCisgICAgbV9lU3RyZWFtVHlwZSA9IEZYX1NUUkVBTVRZUEVfQnVmZmVyUmVhZDsNCisgICAgbV9kd0FjY2VzcyA9IGR3QWNjZXNzOw0KKyAgICBtX2lMZW5ndGggPSBtX3BTdHJlYW1JbXAtPkdldExlbmd0aCgpOw0KKyAgfQ0KKyAgcmV0dXJuIGJSZXQ7DQorfQ0KK3ZvaWQgQ0ZYX1N0cmVhbTo6UmVsZWFzZSgpIHsNCisgIGlmICgtLW1faVJlZkNvdW50IDwgMSkgew0KKyAgICBkZWxldGUgdGhpczsNCisgIH0NCit9DQorSUZYX1N0cmVhbSogQ0ZYX1N0cmVhbTo6UmV0YWluKCkgew0KKyAgbV9pUmVmQ291bnQrKzsNCisgIHJldHVybiB0aGlzOw0KK30NCitpbnQzMl90IENGWF9TdHJlYW06OkdldExlbmd0aCgpIGNvbnN0IHsNCisgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBpZiAobV9lU3RyZWFtVHlwZSA9PSBGWF9TVFJFQU1UWVBFX0ZpbGUgfHwNCisgICAgICBtX2VTdHJlYW1UeXBlID09IEZYX1NUUkVBTVRZUEVfQnVmZmVyKSB7DQorICAgIHJldHVybiBtX3BTdHJlYW1JbXAtPkdldExlbmd0aCgpOw0KKyAgfQ0KKyAgcmV0dXJuIG1faUxlbmd0aDsNCit9DQoraW50MzJfdCBDRlhfU3RyZWFtOjpTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIGludDMyX3QgaU9mZnNldCkgew0KKyAgaWYgKG1fcFN0cmVhbUltcCA9PSBOVUxMKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIGlmIChtX2VTdHJlYW1UeXBlID09IEZYX1NUUkVBTVRZUEVfRmlsZSB8fA0KKyAgICAgIG1fZVN0cmVhbVR5cGUgPT0gRlhfU1RSRUFNVFlQRV9CdWZmZXIpIHsNCisgICAgcmV0dXJuIG1faVBvc2l0aW9uID0gbV9wU3RyZWFtSW1wLT5TZWVrKGVTZWVrLCBpT2Zmc2V0KTsNCisgIH0NCisgIGludDMyX3QgaUVuZCA9IG1faVN0YXJ0ICsgbV9pTGVuZ3RoOw0KKyAgaW50MzJfdCBpUG9zaXRpb24gPSBtX2lTdGFydCArIGlPZmZzZXQ7DQorICBpZiAoZVNlZWsgPT0gRlhfU1RSRUFNU0VFS19CZWdpbikgew0KKyAgICBtX2lQb3NpdGlvbiA9IGlQb3NpdGlvbjsNCisgIH0gZWxzZSBpZiAoZVNlZWsgPT0gRlhfU1RSRUFNU0VFS19DdXJyZW50KSB7DQorICAgIG1faVBvc2l0aW9uICs9IGlPZmZzZXQ7DQorICB9IGVsc2UgaWYgKGVTZWVrID09IEZYX1NUUkVBTVNFRUtfRW5kKSB7DQorICAgIG1faVBvc2l0aW9uID0gaUVuZCArIGlPZmZzZXQ7DQorICB9DQorICBpZiAobV9pUG9zaXRpb24gPiBpRW5kKSB7DQorICAgIG1faVBvc2l0aW9uID0gaUVuZDsNCisgIH0NCisgIGlmIChtX2lQb3NpdGlvbiA8IG1faVN0YXJ0KSB7DQorICAgIG1faVBvc2l0aW9uID0gbV9pU3RhcnQ7DQorICB9DQorICByZXR1cm4gbV9pUG9zaXRpb24gLSBtX2lTdGFydDsNCit9DQoraW50MzJfdCBDRlhfU3RyZWFtOjpHZXRQb3NpdGlvbigpIHsNCisgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBpZiAobV9lU3RyZWFtVHlwZSA9PSBGWF9TVFJFQU1UWVBFX0ZpbGUgfHwNCisgICAgICBtX2VTdHJlYW1UeXBlID09IEZYX1NUUkVBTVRZUEVfQnVmZmVyKSB7DQorICAgIHJldHVybiBtX2lQb3NpdGlvbiA9IG1fcFN0cmVhbUltcC0+R2V0UG9zaXRpb24oKTsNCisgIH0NCisgIHJldHVybiBtX2lQb3NpdGlvbiAtIG1faVN0YXJ0Ow0KK30NCitGWF9CT09MIENGWF9TdHJlYW06OklzRU9GKCkgY29uc3Qgew0KKyAgaWYgKG1fcFN0cmVhbUltcCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaWYgKG1fZVN0cmVhbVR5cGUgPT0gRlhfU1RSRUFNVFlQRV9GaWxlIHx8DQorICAgICAgbV9lU3RyZWFtVHlwZSA9PSBGWF9TVFJFQU1UWVBFX0J1ZmZlcikgew0KKyAgICByZXR1cm4gbV9wU3RyZWFtSW1wLT5Jc0VPRigpOw0KKyAgfQ0KKyAgcmV0dXJuIG1faVBvc2l0aW9uID49IG1faVN0YXJ0ICsgbV9pTGVuZ3RoOw0KK30NCitpbnQzMl90IENGWF9TdHJlYW06OlJlYWREYXRhKHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpIHsNCisgIEZYU1lTX2Fzc2VydChwQnVmZmVyICE9IE5VTEwgJiYgaUJ1ZmZlclNpemUgPiAwKTsNCisgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBpbnQzMl90IGlMZW4gPSBzdGQ6Om1pbihtX2lTdGFydCArIG1faUxlbmd0aCAtIG1faVBvc2l0aW9uLCBpQnVmZmVyU2l6ZSk7DQorICBpZiAoaUxlbiA8PSAwKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgbV9wU3RyZWFtSW1wLT5Mb2NrKCk7DQorICBpZiAobV9wU3RyZWFtSW1wLT5HZXRQb3NpdGlvbigpICE9IG1faVBvc2l0aW9uKSB7DQorICAgIG1fcFN0cmVhbUltcC0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCBtX2lQb3NpdGlvbik7DQorICB9DQorICBpTGVuID0gbV9wU3RyZWFtSW1wLT5SZWFkRGF0YShwQnVmZmVyLCBpTGVuKTsNCisgIG1faVBvc2l0aW9uID0gbV9wU3RyZWFtSW1wLT5HZXRQb3NpdGlvbigpOw0KKyAgbV9wU3RyZWFtSW1wLT5VbmxvY2soKTsNCisgIHJldHVybiBpTGVuOw0KK30NCitpbnQzMl90IENGWF9TdHJlYW06OlJlYWRTdHJpbmcoRlhfV0NIQVIqIHBTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1heExlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkVPUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb25zdCogcEJ5dGVTaXplKSB7DQorICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMICYmIGlNYXhMZW5ndGggPiAwKTsNCisgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBpbnQzMl90IGlFbmQgPSBtX2lTdGFydCArIG1faUxlbmd0aDsNCisgIGludDMyX3QgaUxlbiA9IGlFbmQgLSBtX2lQb3NpdGlvbjsNCisgIGlmIChwQnl0ZVNpemUgIT0gTlVMTCkgew0KKyAgICBpTGVuID0gc3RkOjptaW4oaUxlbiwgKnBCeXRlU2l6ZSk7DQorICB9DQorICBpTGVuID0gc3RkOjptaW4oaUVuZCAvIDIsIGlNYXhMZW5ndGgpOw0KKyAgaWYgKGlMZW4gPD0gMCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIG1fcFN0cmVhbUltcC0+TG9jaygpOw0KKyAgaWYgKG1fcFN0cmVhbUltcC0+R2V0UG9zaXRpb24oKSAhPSBtX2lQb3NpdGlvbikgew0KKyAgICBtX3BTdHJlYW1JbXAtPlNlZWsoRlhfU1RSRUFNU0VFS19CZWdpbiwgbV9pUG9zaXRpb24pOw0KKyAgfQ0KKyAgaUxlbiA9IG1fcFN0cmVhbUltcC0+UmVhZFN0cmluZyhwU3RyLCBpTGVuLCBiRU9TKTsNCisgIG1faVBvc2l0aW9uID0gbV9wU3RyZWFtSW1wLT5HZXRQb3NpdGlvbigpOw0KKyAgaWYgKGlMZW4gPiAwICYmIG1faVBvc2l0aW9uID49IGlFbmQpIHsNCisgICAgYkVPUyA9IFRSVUU7DQorICB9DQorICBtX3BTdHJlYW1JbXAtPlVubG9jaygpOw0KKyAgcmV0dXJuIGlMZW47DQorfQ0KK2ludDMyX3QgQ0ZYX1N0cmVhbTo6V3JpdGVEYXRhKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpIHsNCisgIEZYU1lTX2Fzc2VydChwQnVmZmVyICE9IE5VTEwgJiYgaUJ1ZmZlclNpemUgPiAwKTsNCisgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBpZiAoKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpID09IDApIHsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgaW50MzJfdCBpTGVuID0gaUJ1ZmZlclNpemU7DQorICBpZiAobV9lU3RyZWFtVHlwZSA9PSBGWF9TVFJFQU1UWVBFX1N0cmVhbSkgew0KKyAgICBpTGVuID0gc3RkOjptaW4obV9pU3RhcnQgKyBtX2lUb3RhbFNpemUgLSBtX2lQb3NpdGlvbiwgaUJ1ZmZlclNpemUpOw0KKyAgICBpZiAoaUxlbiA8PSAwKSB7DQorICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgIH0NCisgIG1fcFN0cmVhbUltcC0+TG9jaygpOw0KKyAgaW50MzJfdCBpRW5kID0gbV9pU3RhcnQgKyBtX2lMZW5ndGg7DQorICBpZiAobV9wU3RyZWFtSW1wLT5HZXRQb3NpdGlvbigpICE9IG1faVBvc2l0aW9uKSB7DQorICAgIG1fcFN0cmVhbUltcC0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCBtX2lQb3NpdGlvbik7DQorICB9DQorICBpTGVuID0gbV9wU3RyZWFtSW1wLT5Xcml0ZURhdGEocEJ1ZmZlciwgaUxlbik7DQorICBtX2lQb3NpdGlvbiA9IG1fcFN0cmVhbUltcC0+R2V0UG9zaXRpb24oKTsNCisgIGlmIChtX2lQb3NpdGlvbiA+IGlFbmQpIHsNCisgICAgbV9pTGVuZ3RoID0gbV9pUG9zaXRpb24gLSBtX2lTdGFydDsNCisgIH0NCisgIG1fcFN0cmVhbUltcC0+VW5sb2NrKCk7DQorICByZXR1cm4gaUxlbjsNCit9DQoraW50MzJfdCBDRlhfU3RyZWFtOjpXcml0ZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKSB7DQorICBGWFNZU19hc3NlcnQocFN0ciAhPSBOVUxMICYmIGlMZW5ndGggPiAwKTsNCisgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBpZiAoKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpID09IDApIHsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgaW50MzJfdCBpTGVuID0gaUxlbmd0aDsNCisgIGlmIChtX2VTdHJlYW1UeXBlID09IEZYX1NUUkVBTVRZUEVfU3RyZWFtKSB7DQorICAgIGlMZW4gPSBzdGQ6Om1pbigobV9pU3RhcnQgKyBtX2lUb3RhbFNpemUgLSBtX2lQb3NpdGlvbikgLyAyLCBpTGVuZ3RoKTsNCisgICAgaWYgKGlMZW4gPD0gMCkgew0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICB9DQorICBtX3BTdHJlYW1JbXAtPkxvY2soKTsNCisgIGludDMyX3QgaUVuZCA9IG1faVN0YXJ0ICsgbV9pTGVuZ3RoOw0KKyAgaWYgKG1fcFN0cmVhbUltcC0+R2V0UG9zaXRpb24oKSAhPSBtX2lQb3NpdGlvbikgew0KKyAgICBtX3BTdHJlYW1JbXAtPlNlZWsoRlhfU1RSRUFNU0VFS19CZWdpbiwgbV9pUG9zaXRpb24pOw0KKyAgfQ0KKyAgaUxlbiA9IG1fcFN0cmVhbUltcC0+V3JpdGVTdHJpbmcocFN0ciwgaUxlbik7DQorICBtX2lQb3NpdGlvbiA9IG1fcFN0cmVhbUltcC0+R2V0UG9zaXRpb24oKTsNCisgIGlmIChtX2lQb3NpdGlvbiA+IGlFbmQpIHsNCisgICAgbV9pTGVuZ3RoID0gbV9pUG9zaXRpb24gLSBtX2lTdGFydDsNCisgIH0NCisgIG1fcFN0cmVhbUltcC0+VW5sb2NrKCk7DQorICByZXR1cm4gaUxlbjsNCit9DQordm9pZCBDRlhfU3RyZWFtOjpGbHVzaCgpIHsNCisgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpID09IDApIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV9wU3RyZWFtSW1wLT5GbHVzaCgpOw0KK30NCitGWF9CT09MIENGWF9TdHJlYW06OlNldExlbmd0aChpbnQzMl90IGlMZW5ndGgpIHsNCisgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpID09IDApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcFN0cmVhbUltcC0+U2V0TGVuZ3RoKGlMZW5ndGgpOw0KK30NCitpbnQzMl90IENGWF9TdHJlYW06OkdldEJPTSh1aW50OF90IGJvbVs0XSkgY29uc3Qgew0KKyAgaWYgKG1fcFN0cmVhbUltcCA9PSBOVUxMKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCitGWF9XT1JEIENGWF9TdHJlYW06OkdldENvZGVQYWdlKCkgY29uc3Qgew0KKyNpZiBfRlhfRU5ESUFOXyA9PSBfRlhfTElUVExFX0VORElBTl8NCisgIHJldHVybiBGWF9DT0RFUEFHRV9VVEYxNkxFOw0KKyNlbHNlDQorICByZXR1cm4gRlhfQ09ERVBBR0VfVVRGMTZCRTsNCisjZW5kaWYNCit9DQorRlhfV09SRCBDRlhfU3RyZWFtOjpTZXRDb2RlUGFnZShGWF9XT1JEIHdDb2RlUGFnZSkgew0KKyNpZiBfRlhfRU5ESUFOXyA9PSBfRlhfTElUVExFX0VORElBTl8NCisgIHJldHVybiBGWF9DT0RFUEFHRV9VVEYxNkxFOw0KKyNlbHNlDQorICByZXR1cm4gRlhfQ09ERVBBR0VfVVRGMTZCRTsNCisjZW5kaWYNCit9DQorSUZYX1N0cmVhbSogQ0ZYX1N0cmVhbTo6Q3JlYXRlU2hhcmVkU3RyZWFtKEZYX0RXT1JEIGR3QWNjZXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlPZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCkgew0KKyAgRlhTWVNfYXNzZXJ0KGlMZW5ndGggPiAwKTsNCisgIGlmIChtX3BTdHJlYW1JbXAgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGlmICgobV9kd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19UZXh0KSAhPSAwICYmDQorICAgICAgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1RleHQpID09IDApIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpZiAoKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpID09IDAgJiYNCisgICAgICAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpICE9IDApIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpbnQzMl90IGlTdGFydCA9IG1faVN0YXJ0ICsgaU9mZnNldDsNCisgIGludDMyX3QgaVRvdGFsID0gbV9pU3RhcnQgKyBtX2lMZW5ndGg7DQorICBpZiAoaVN0YXJ0IDwgbV9pU3RhcnQgfHwgaVN0YXJ0ID49IGlUb3RhbCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGludDMyX3QgaUVuZCA9IGlTdGFydCArIGlMZW5ndGg7DQorICBpZiAoaUVuZCA8IGlTdGFydCB8fCBpRW5kID4gaVRvdGFsKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0ZYX1N0cmVhbSogcFNoYXJlZCA9IG5ldyBDRlhfU3RyZWFtOw0KKyAgcFNoYXJlZC0+bV9lU3RyZWFtVHlwZSA9IEZYX1NUUkVBTVRZUEVfU3RyZWFtOw0KKyAgcFNoYXJlZC0+bV9wU3RyZWFtSW1wID0gbV9wU3RyZWFtSW1wOw0KKyAgcFNoYXJlZC0+bV9kd0FjY2VzcyA9IGR3QWNjZXNzOw0KKyAgcFNoYXJlZC0+bV9pVG90YWxTaXplID0gaUxlbmd0aDsNCisgIHBTaGFyZWQtPm1faVBvc2l0aW9uID0gaVN0YXJ0Ow0KKyAgcFNoYXJlZC0+bV9pU3RhcnQgPSBpU3RhcnQ7DQorICBwU2hhcmVkLT5tX2lMZW5ndGggPSAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpICE9IDAgPyAwIDogaUxlbmd0aDsNCisgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19UZXh0KSB7DQorICAgIHJldHVybiBJRlhfU3RyZWFtOjpDcmVhdGVUZXh0U3RyZWFtKHBTaGFyZWQsIFRSVUUpOw0KKyAgfQ0KKyAgcmV0dXJuIHBTaGFyZWQ7DQorfQ0KK0lGWF9GaWxlUmVhZCogRlhfQ3JlYXRlRmlsZVJlYWQoSUZYX1N0cmVhbSogcEJhc2VTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKSB7DQorICBGWFNZU19hc3NlcnQocEJhc2VTdHJlYW0gIT0gTlVMTCk7DQorICByZXR1cm4gbmV3IENGR0FTX0ZpbGVSZWFkKHBCYXNlU3RyZWFtLCBiUmVsZWFzZVN0cmVhbSk7DQorfQ0KK0NGR0FTX0ZpbGVSZWFkOjpDRkdBU19GaWxlUmVhZChJRlhfU3RyZWFtKiBwU3RyZWFtLCBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKQ0KKyAgICA6IG1fYlJlbGVhc2VTdHJlYW0oYlJlbGVhc2VTdHJlYW0pLCBtX3BTdHJlYW0ocFN0cmVhbSkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcFN0cmVhbSAhPSBOVUxMKTsNCit9DQorQ0ZHQVNfRmlsZVJlYWQ6On5DRkdBU19GaWxlUmVhZCgpIHsNCisgIGlmIChtX2JSZWxlYXNlU3RyZWFtKSB7DQorICAgIG1fcFN0cmVhbS0+UmVsZWFzZSgpOw0KKyAgfQ0KK30NCitGWF9GSUxFU0laRSBDRkdBU19GaWxlUmVhZDo6R2V0U2l6ZSgpIHsNCisgIHJldHVybiAoRlhfRklMRVNJWkUpbV9wU3RyZWFtLT5HZXRMZW5ndGgoKTsNCit9DQorRlhfQk9PTCBDRkdBU19GaWxlUmVhZDo6UmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgew0KKyAgbV9wU3RyZWFtLT5Mb2NrKCk7DQorICBtX3BTdHJlYW0tPlNlZWsoRlhfU1RSRUFNU0VFS19CZWdpbiwgKGludDMyX3Qpb2Zmc2V0KTsNCisgIGludDMyX3QgaUxlbiA9IG1fcFN0cmVhbS0+UmVhZERhdGEoKHVpbnQ4X3QqKWJ1ZmZlciwgKGludDMyX3Qpc2l6ZSk7DQorICBtX3BTdHJlYW0tPlVubG9jaygpOw0KKyAgcmV0dXJuIGlMZW4gPT0gKGludDMyX3Qpc2l6ZTsNCit9DQorDQorSUZYX0ZpbGVSZWFkKiBGWF9DcmVhdGVGaWxlUmVhZChJRlhfQnVmZmVyUmVhZCogcEJ1ZmZlclJlYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBpRmlsZVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKSB7DQorICBpZiAoIXBCdWZmZXJSZWFkKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIG5ldyBDRlhfQnVmZmVyQWNjSW1wKHBCdWZmZXJSZWFkLCBpRmlsZVNpemUsIGJSZWxlYXNlU3RyZWFtKTsNCit9DQorQ0ZYX0J1ZmZlckFjY0ltcDo6Q0ZYX0J1ZmZlckFjY0ltcChJRlhfQnVmZmVyUmVhZCogcEJ1ZmZlclJlYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBpRmlsZVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKQ0KKyAgICA6IG1fcEJ1ZmZlclJlYWQocEJ1ZmZlclJlYWQpLA0KKyAgICAgIG1fYlJlbGVhc2VTdHJlYW0oYlJlbGVhc2VTdHJlYW0pLA0KKyAgICAgIG1faUJ1ZlNpemUoaUZpbGVTaXplKSB7DQorICBGWFNZU19hc3NlcnQobV9wQnVmZmVyUmVhZCk7DQorfQ0KK0NGWF9CdWZmZXJBY2NJbXA6On5DRlhfQnVmZmVyQWNjSW1wKCkgew0KKyAgaWYgKG1fYlJlbGVhc2VTdHJlYW0gJiYgbV9wQnVmZmVyUmVhZCkgew0KKyAgICBtX3BCdWZmZXJSZWFkLT5SZWxlYXNlKCk7DQorICB9DQorfQ0KK0ZYX0ZJTEVTSVpFIENGWF9CdWZmZXJBY2NJbXA6OkdldFNpemUoKSB7DQorICBpZiAoIW1fcEJ1ZmZlclJlYWQpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpZiAobV9pQnVmU2l6ZSA+PSAwKSB7DQorICAgIHJldHVybiBtX2lCdWZTaXplOw0KKyAgfQ0KKyAgaWYgKCFtX3BCdWZmZXJSZWFkLT5SZWFkTmV4dEJsb2NrKFRSVUUpKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgbV9pQnVmU2l6ZSA9IChGWF9GSUxFU0laRSltX3BCdWZmZXJSZWFkLT5HZXRCbG9ja1NpemUoKTsNCisgIHdoaWxlICghbV9wQnVmZmVyUmVhZC0+SXNFT0YoKSkgew0KKyAgICBtX3BCdWZmZXJSZWFkLT5SZWFkTmV4dEJsb2NrKEZBTFNFKTsNCisgICAgbV9pQnVmU2l6ZSArPSAoRlhfRklMRVNJWkUpbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tTaXplKCk7DQorICB9DQorICByZXR1cm4gbV9pQnVmU2l6ZTsNCit9DQorRlhfQk9PTCBDRlhfQnVmZmVyQWNjSW1wOjpSZWFkQmxvY2sodm9pZCogYnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgew0KKyAgaWYgKCFtX3BCdWZmZXJSZWFkKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICghYnVmZmVyIHx8ICFzaXplKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgRlhfRklMRVNJWkUgZHdCdWZTaXplID0gR2V0U2l6ZSgpOw0KKyAgaWYgKG9mZnNldCA+PSBkd0J1ZlNpemUpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgc2l6ZV90IGR3QmxvY2tTaXplID0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tTaXplKCk7DQorICBGWF9GSUxFU0laRSBkd0Jsb2NrT2Zmc2V0ID0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tPZmZzZXQoKTsNCisgIGlmIChvZmZzZXQgPCBkd0Jsb2NrT2Zmc2V0KSB7DQorICAgIGlmICghbV9wQnVmZmVyUmVhZC0+UmVhZE5leHRCbG9jayhUUlVFKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBkd0Jsb2NrU2l6ZSA9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrU2l6ZSgpOw0KKyAgICBkd0Jsb2NrT2Zmc2V0ID0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tPZmZzZXQoKTsNCisgIH0NCisgIHdoaWxlIChvZmZzZXQgPCBkd0Jsb2NrT2Zmc2V0IHx8DQorICAgICAgICAgb2Zmc2V0ID49IChGWF9GSUxFU0laRSkoZHdCbG9ja09mZnNldCArIGR3QmxvY2tTaXplKSkgew0KKyAgICBpZiAobV9wQnVmZmVyUmVhZC0+SXNFT0YoKSB8fCAhbV9wQnVmZmVyUmVhZC0+UmVhZE5leHRCbG9jayhGQUxTRSkpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkd0Jsb2NrU2l6ZSA9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrU2l6ZSgpOw0KKyAgICBkd0Jsb2NrT2Zmc2V0ID0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tPZmZzZXQoKTsNCisgIH0NCisgIGlmIChvZmZzZXQgPCBkd0Jsb2NrT2Zmc2V0IHx8DQorICAgICAgb2Zmc2V0ID49IChGWF9GSUxFU0laRSkoZHdCbG9ja09mZnNldCArIGR3QmxvY2tTaXplKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBjb25zdCB1aW50OF90KiBwQnVmZmVyID0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tCdWZmZXIoKTsNCisgIGNvbnN0IEZYX0ZJTEVTSVpFIGR3T2Zmc2V0ID0gb2Zmc2V0IC0gZHdCbG9ja09mZnNldDsNCisgIHNpemVfdCBkd0NvcHlTaXplID0NCisgICAgICBzdGQ6Om1pbihzaXplLCBzdGF0aWNfY2FzdDxzaXplX3Q+KGR3QmxvY2tTaXplIC0gZHdPZmZzZXQpKTsNCisgIEZYU1lTX21lbWNweShidWZmZXIsIHBCdWZmZXIgKyBkd09mZnNldCwgZHdDb3B5U2l6ZSk7DQorICBvZmZzZXQgPSBkd0NvcHlTaXplOw0KKyAgc2l6ZSAtPSBkd0NvcHlTaXplOw0KKyAgd2hpbGUgKHNpemUpIHsNCisgICAgaWYgKCFtX3BCdWZmZXJSZWFkLT5SZWFkTmV4dEJsb2NrKEZBTFNFKSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGR3QmxvY2tPZmZzZXQgPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja09mZnNldCgpOw0KKyAgICBkd0Jsb2NrU2l6ZSA9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrU2l6ZSgpOw0KKyAgICBwQnVmZmVyID0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tCdWZmZXIoKTsNCisgICAgZHdDb3B5U2l6ZSA9IHN0ZDo6bWluKHNpemUsIGR3QmxvY2tTaXplKTsNCisgICAgRlhTWVNfbWVtY3B5KCgodWludDhfdCopYnVmZmVyKSArIG9mZnNldCwgcEJ1ZmZlciwgZHdDb3B5U2l6ZSk7DQorICAgIG9mZnNldCArPSBkd0NvcHlTaXplOw0KKyAgICBzaXplIC09IGR3Q29weVNpemU7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorDQorSUZYX0ZpbGVXcml0ZSogRlhfQ3JlYXRlRmlsZVdyaXRlKElGWF9TdHJlYW0qIHBCYXNlU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKSB7DQorICBGWFNZU19hc3NlcnQocEJhc2VTdHJlYW0gIT0gTlVMTCk7DQorICByZXR1cm4gbmV3IENGR0FTX0ZpbGVXcml0ZShwQmFzZVN0cmVhbSwgYlJlbGVhc2VTdHJlYW0pOw0KK30NCisNCitDRkdBU19GaWxlV3JpdGU6OkNGR0FTX0ZpbGVXcml0ZShJRlhfU3RyZWFtKiBwU3RyZWFtLCBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKQ0KKyAgICA6IG1fcFN0cmVhbShwU3RyZWFtKSwgbV9iUmVsZWFzZVN0cmVhbShiUmVsZWFzZVN0cmVhbSkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcFN0cmVhbSAhPSBOVUxMKTsNCit9DQorQ0ZHQVNfRmlsZVdyaXRlOjp+Q0ZHQVNfRmlsZVdyaXRlKCkgew0KKyAgaWYgKG1fYlJlbGVhc2VTdHJlYW0pIHsNCisgICAgbV9wU3RyZWFtLT5SZWxlYXNlKCk7DQorICB9DQorfQ0KK0ZYX0ZJTEVTSVpFIENGR0FTX0ZpbGVXcml0ZTo6R2V0U2l6ZSgpIHsNCisgIHJldHVybiBtX3BTdHJlYW0tPkdldExlbmd0aCgpOw0KK30NCitGWF9CT09MIENGR0FTX0ZpbGVXcml0ZTo6Rmx1c2goKSB7DQorICBtX3BTdHJlYW0tPkZsdXNoKCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRkdBU19GaWxlV3JpdGU6OldyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIHNpemVfdCBzaXplKSB7DQorICByZXR1cm4gbV9wU3RyZWFtLT5Xcml0ZURhdGEoKGNvbnN0IHVpbnQ4X3QqKXBEYXRhLCAoaW50MzJfdClzaXplKSA9PQ0KKyAgICAgICAgIChpbnQzMl90KXNpemU7DQorfQ0KK0ZYX0JPT0wgQ0ZHQVNfRmlsZVdyaXRlOjpXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgew0KKyAgbV9wU3RyZWFtLT5Mb2NrKCk7DQorICBtX3BTdHJlYW0tPlNlZWsoRlhfU1RSRUFNU0VFS19CZWdpbiwgb2Zmc2V0KTsNCisgIGludDMyX3QgaUxlbiA9IG1fcFN0cmVhbS0+V3JpdGVEYXRhKCh1aW50OF90KilwRGF0YSwgKGludDMyX3Qpc2l6ZSk7DQorICBtX3BTdHJlYW0tPlVubG9jaygpOw0KKyAgcmV0dXJuIGlMZW4gPT0gKGludDMyX3Qpc2l6ZTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfc3RyZWFtLmggYi94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9zdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWVmNmU4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfc3RyZWFtLmgKQEAgLTAsMCArMSwzMTEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhfU1RSRUFNX0lNUA0KKyNkZWZpbmUgX0ZYX1NUUkVBTV9JTVANCitjbGFzcyBDRlhfU3RyZWFtSW1wOw0KK2NsYXNzIENGWF9GaWxlU3RyZWFtSW1wOw0KK2NsYXNzIENGWF9CdWZmZXJTdHJlYW1JbXA7DQorY2xhc3MgQ0ZYX0ZpbGVSZWFkU3RyZWFtSW1wOw0KK2NsYXNzIENGWF9CdWZmZXJSZWFkU3RyZWFtSW1wOw0KK2NsYXNzIENGWF9GaWxlV3JpdGVTdHJlYW1JbXA7DQorY2xhc3MgQ0ZYX1N0cmVhbTsNCitjbGFzcyBDRlhfVGV4dFN0cmVhbTsNCitjbGFzcyBDRlhfRmlsZVJlYWQ7DQorY2xhc3MgQ0ZYX0ZpbGVXcml0ZTsNCitjbGFzcyBDRlhfQnVmZmVyQWNjSW1wOw0KK2NsYXNzIENGWF9TdHJlYW1JbXAgOiBwdWJsaWMgQ0ZYX1RocmVhZExvY2sgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0QWNjZXNzTW9kZXMoKSBjb25zdCB7IHJldHVybiBtX2R3QWNjZXNzOyB9DQorICB2aXJ0dWFsIGludDMyX3QgR2V0TGVuZ3RoKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IFNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgaW50MzJfdCBpT2Zmc2V0KSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0UG9zaXRpb24oKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNFT0YoKSBjb25zdCA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgUmVhZERhdGEodWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IFJlYWRTdHJpbmcoRlhfV0NIQVIqIHBTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNYXhMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRU9TKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgV3JpdGVEYXRhKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBXcml0ZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgRmx1c2goKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0TGVuZ3RoKGludDMyX3QgaUxlbmd0aCkgPSAwOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRlhfU3RyZWFtSW1wKCk7DQorICB2aXJ0dWFsIH5DRlhfU3RyZWFtSW1wKCkge30NCisgIEZYX0RXT1JEIG1fZHdBY2Nlc3M7DQorfTsNCitjbGFzcyBDRlhfRmlsZVN0cmVhbUltcCA6IHB1YmxpYyBDRlhfU3RyZWFtSW1wIHsNCisgcHVibGljOg0KKyAgQ0ZYX0ZpbGVTdHJlYW1JbXAoKTsNCisgIHZpcnR1YWwgfkNGWF9GaWxlU3RyZWFtSW1wKCk7DQorICBGWF9CT09MIExvYWRGaWxlKGNvbnN0IEZYX1dDSEFSKiBwc3pTcmNGaWxlTmFtZSwgRlhfRFdPUkQgZHdBY2Nlc3MpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldExlbmd0aCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IFNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgaW50MzJfdCBpT2Zmc2V0KTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRQb3NpdGlvbigpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzRU9GKCkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgUmVhZERhdGEodWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSk7DQorICB2aXJ0dWFsIGludDMyX3QgUmVhZFN0cmluZyhGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTWF4TGVuZ3RoLCBGWF9CT09MJiBiRU9TKTsNCisgIHZpcnR1YWwgaW50MzJfdCBXcml0ZURhdGEoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSk7DQorICB2aXJ0dWFsIGludDMyX3QgV3JpdGVTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCk7DQorICB2aXJ0dWFsIHZvaWQgRmx1c2goKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRMZW5ndGgoaW50MzJfdCBpTGVuZ3RoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgRlhTWVNfRklMRSogbV9oRmlsZTsNCisgIGludDMyX3QgbV9pTGVuZ3RoOw0KK307DQorY2xhc3MgQ0ZYX0J1ZmZlclN0cmVhbUltcCA6IHB1YmxpYyBDRlhfU3RyZWFtSW1wIHsNCisgcHVibGljOg0KKyAgQ0ZYX0J1ZmZlclN0cmVhbUltcCgpOw0KKyAgdmlydHVhbCB+Q0ZYX0J1ZmZlclN0cmVhbUltcCgpIHt9DQorICBGWF9CT09MIExvYWRCdWZmZXIodWludDhfdCogcERhdGEsIGludDMyX3QgaVRvdGFsU2l6ZSwgRlhfRFdPUkQgZHdBY2Nlc3MpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldExlbmd0aCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IFNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgaW50MzJfdCBpT2Zmc2V0KTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRQb3NpdGlvbigpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzRU9GKCkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgUmVhZERhdGEodWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSk7DQorICB2aXJ0dWFsIGludDMyX3QgUmVhZFN0cmluZyhGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTWF4TGVuZ3RoLCBGWF9CT09MJiBiRU9TKTsNCisgIHZpcnR1YWwgaW50MzJfdCBXcml0ZURhdGEoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSk7DQorICB2aXJ0dWFsIGludDMyX3QgV3JpdGVTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCk7DQorICB2aXJ0dWFsIHZvaWQgRmx1c2goKSB7fQ0KKyAgdmlydHVhbCBGWF9CT09MIFNldExlbmd0aChpbnQzMl90IGlMZW5ndGgpIHsgcmV0dXJuIEZBTFNFOyB9DQorDQorIHByb3RlY3RlZDoNCisgIHVpbnQ4X3QqIG1fcERhdGE7DQorICBpbnQzMl90IG1faVRvdGFsU2l6ZTsNCisgIGludDMyX3QgbV9pUG9zaXRpb247DQorICBpbnQzMl90IG1faUxlbmd0aDsNCit9Ow0KK2NsYXNzIENGWF9GaWxlUmVhZFN0cmVhbUltcCA6IHB1YmxpYyBDRlhfU3RyZWFtSW1wIHsNCisgcHVibGljOg0KKyAgQ0ZYX0ZpbGVSZWFkU3RyZWFtSW1wKCk7DQorICB2aXJ0dWFsIH5DRlhfRmlsZVJlYWRTdHJlYW1JbXAoKSB7fQ0KKyAgRlhfQk9PTCBMb2FkRmlsZVJlYWQoSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQsIEZYX0RXT1JEIGR3QWNjZXNzKTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRMZW5ndGgoKSBjb25zdDsNCisgIHZpcnR1YWwgaW50MzJfdCBTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIGludDMyX3QgaU9mZnNldCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0UG9zaXRpb24oKSB7IHJldHVybiBtX2lQb3NpdGlvbjsgfQ0KKyAgdmlydHVhbCBGWF9CT09MIElzRU9GKCkgY29uc3Q7DQorDQorICB2aXJ0dWFsIGludDMyX3QgUmVhZERhdGEodWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSk7DQorICB2aXJ0dWFsIGludDMyX3QgUmVhZFN0cmluZyhGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTWF4TGVuZ3RoLCBGWF9CT09MJiBiRU9TKTsNCisgIHZpcnR1YWwgaW50MzJfdCBXcml0ZURhdGEoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHZpcnR1YWwgaW50MzJfdCBXcml0ZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIEZsdXNoKCkge30NCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRMZW5ndGgoaW50MzJfdCBpTGVuZ3RoKSB7IHJldHVybiBGQUxTRTsgfQ0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRlhfRmlsZVJlYWQqIG1fcEZpbGVSZWFkOw0KKyAgaW50MzJfdCBtX2lQb3NpdGlvbjsNCisgIGludDMyX3QgbV9pTGVuZ3RoOw0KK307DQorY2xhc3MgQ0ZYX0J1ZmZlclJlYWRTdHJlYW1JbXAgOiBwdWJsaWMgQ0ZYX1N0cmVhbUltcCB7DQorIHB1YmxpYzoNCisgIENGWF9CdWZmZXJSZWFkU3RyZWFtSW1wKCk7DQorICB+Q0ZYX0J1ZmZlclJlYWRTdHJlYW1JbXAoKTsNCisgIEZYX0JPT0wgTG9hZEJ1ZmZlclJlYWQoSUZYX0J1ZmZlclJlYWQqIHBCdWZmZXJSZWFkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlGaWxlU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdBY2Nlc3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlbGVhc2VCdWZmZXJSZWFkKTsNCisNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRMZW5ndGgoKSBjb25zdDsNCisgIHZpcnR1YWwgaW50MzJfdCBTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIGludDMyX3QgaU9mZnNldCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0UG9zaXRpb24oKSB7IHJldHVybiBtX2lQb3NpdGlvbjsgfQ0KKyAgdmlydHVhbCBGWF9CT09MIElzRU9GKCkgY29uc3Q7DQorDQorICB2aXJ0dWFsIGludDMyX3QgUmVhZERhdGEodWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSk7DQorICB2aXJ0dWFsIGludDMyX3QgUmVhZFN0cmluZyhGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTWF4TGVuZ3RoLCBGWF9CT09MJiBiRU9TKTsNCisgIHZpcnR1YWwgaW50MzJfdCBXcml0ZURhdGEoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHZpcnR1YWwgaW50MzJfdCBXcml0ZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIEZsdXNoKCkge30NCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRMZW5ndGgoaW50MzJfdCBpTGVuZ3RoKSB7IHJldHVybiBGQUxTRTsgfQ0KKw0KKyBwcml2YXRlOg0KKyAgSUZYX0J1ZmZlclJlYWQqIG1fcEJ1ZmZlclJlYWQ7DQorICBGWF9CT09MIG1fYlJlbGVhc2VCdWZmZXJSZWFkOw0KKyAgaW50MzJfdCBtX2lQb3NpdGlvbjsNCisgIGludDMyX3QgbV9pQnVmZmVyU2l6ZTsNCit9Ow0KK2NsYXNzIENGWF9GaWxlV3JpdGVTdHJlYW1JbXAgOiBwdWJsaWMgQ0ZYX1N0cmVhbUltcCB7DQorIHB1YmxpYzoNCisgIENGWF9GaWxlV3JpdGVTdHJlYW1JbXAoKTsNCisgIHZpcnR1YWwgfkNGWF9GaWxlV3JpdGVTdHJlYW1JbXAoKSB7fQ0KKyAgRlhfQk9PTCBMb2FkRmlsZVdyaXRlKElGWF9GaWxlV3JpdGUqIHBGaWxlV3JpdGUsIEZYX0RXT1JEIGR3QWNjZXNzKTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRMZW5ndGgoKSBjb25zdDsNCisgIHZpcnR1YWwgaW50MzJfdCBTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIGludDMyX3QgaU9mZnNldCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0UG9zaXRpb24oKSB7IHJldHVybiBtX2lQb3NpdGlvbjsgfQ0KKyAgdmlydHVhbCBGWF9CT09MIElzRU9GKCkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgUmVhZERhdGEodWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSkgeyByZXR1cm4gMDsgfQ0KKyAgdmlydHVhbCBpbnQzMl90IFJlYWRTdHJpbmcoRlhfV0NIQVIqIHBTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNYXhMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRU9TKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgdmlydHVhbCBpbnQzMl90IFdyaXRlRGF0YShjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKTsNCisgIHZpcnR1YWwgaW50MzJfdCBXcml0ZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKTsNCisgIHZpcnR1YWwgdm9pZCBGbHVzaCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldExlbmd0aChpbnQzMl90IGlMZW5ndGgpIHsgcmV0dXJuIEZBTFNFOyB9DQorDQorIHByb3RlY3RlZDoNCisgIElGWF9GaWxlV3JpdGUqIG1fcEZpbGVXcml0ZTsNCisgIGludDMyX3QgbV9pUG9zaXRpb247DQorfTsNCitlbnVtIEZYX1NUUkVBTVRZUEUgew0KKyAgRlhfU1JFQU1UWVBFX1Vua25vd24gPSAwLA0KKyAgRlhfU1RSRUFNVFlQRV9GaWxlLA0KKyAgRlhfU1RSRUFNVFlQRV9CdWZmZXIsDQorICBGWF9TVFJFQU1UWVBFX1N0cmVhbSwNCisgIEZYX1NUUkVBTVRZUEVfQnVmZmVyUmVhZCwNCit9Ow0KK2NsYXNzIENGWF9TdHJlYW0gOiBwdWJsaWMgSUZYX1N0cmVhbSwgcHVibGljIENGWF9UaHJlYWRMb2NrIHsNCisgcHVibGljOg0KKyAgQ0ZYX1N0cmVhbSgpOw0KKyAgfkNGWF9TdHJlYW0oKTsNCisgIEZYX0JPT0wgTG9hZEZpbGUoY29uc3QgRlhfV0NIQVIqIHBzelNyY0ZpbGVOYW1lLCBGWF9EV09SRCBkd0FjY2Vzcyk7DQorICBGWF9CT09MIExvYWRCdWZmZXIodWludDhfdCogcERhdGEsIGludDMyX3QgaVRvdGFsU2l6ZSwgRlhfRFdPUkQgZHdBY2Nlc3MpOw0KKyAgRlhfQk9PTCBMb2FkRmlsZVJlYWQoSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQsIEZYX0RXT1JEIGR3QWNjZXNzKTsNCisgIEZYX0JPT0wgTG9hZEZpbGVXcml0ZShJRlhfRmlsZVdyaXRlKiBwRmlsZVdyaXRlLCBGWF9EV09SRCBkd0FjY2Vzcyk7DQorICBGWF9CT09MIExvYWRCdWZmZXJSZWFkKElGWF9CdWZmZXJSZWFkKiBwQnVmZmVyUmVhZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRmlsZVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3QWNjZXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZWxlYXNlQnVmZmVyUmVhZCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpOw0KKyAgdmlydHVhbCBJRlhfU3RyZWFtKiBSZXRhaW4oKTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0QWNjZXNzTW9kZXMoKSBjb25zdCB7IHJldHVybiBtX2R3QWNjZXNzOyB9DQorICB2aXJ0dWFsIGludDMyX3QgR2V0TGVuZ3RoKCkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgU2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFBvc2l0aW9uKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNFT0YoKSBjb25zdDsNCisgIHZpcnR1YWwgaW50MzJfdCBSZWFkRGF0YSh1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKTsNCisgIHZpcnR1YWwgaW50MzJfdCBSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTWF4TGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkVPUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29uc3QqIHBCeXRlU2l6ZSA9IE5VTEwpOw0KKyAgdmlydHVhbCBpbnQzMl90IFdyaXRlRGF0YShjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKTsNCisgIHZpcnR1YWwgaW50MzJfdCBXcml0ZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKTsNCisgIHZpcnR1YWwgdm9pZCBGbHVzaCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldExlbmd0aChpbnQzMl90IGlMZW5ndGgpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEJPTSh1aW50OF90IGJvbVs0XSkgY29uc3Q7DQorICB2aXJ0dWFsIEZYX1dPUkQgR2V0Q29kZVBhZ2UoKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfV09SRCBTZXRDb2RlUGFnZShGWF9XT1JEIHdDb2RlUGFnZSk7DQorICB2aXJ0dWFsIHZvaWQgTG9jaygpIHsgQ0ZYX1RocmVhZExvY2s6OkxvY2soKTsgfQ0KKyAgdmlydHVhbCB2b2lkIFVubG9jaygpIHsgQ0ZYX1RocmVhZExvY2s6OlVubG9jaygpOyB9DQorICB2aXJ0dWFsIElGWF9TdHJlYW0qIENyZWF0ZVNoYXJlZFN0cmVhbShGWF9EV09SRCBkd0FjY2VzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU9mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCk7DQorDQorIHByb3RlY3RlZDoNCisgIEZYX1NUUkVBTVRZUEUgbV9lU3RyZWFtVHlwZTsNCisgIENGWF9TdHJlYW1JbXAqIG1fcFN0cmVhbUltcDsNCisgIEZYX0RXT1JEIG1fZHdBY2Nlc3M7DQorICBpbnQzMl90IG1faVRvdGFsU2l6ZTsNCisgIGludDMyX3QgbV9pUG9zaXRpb247DQorICBpbnQzMl90IG1faVN0YXJ0Ow0KKyAgaW50MzJfdCBtX2lMZW5ndGg7DQorICBpbnQzMl90IG1faVJlZkNvdW50Ow0KK307DQorY2xhc3MgQ0ZYX1RleHRTdHJlYW0gOiBwdWJsaWMgSUZYX1N0cmVhbSwgcHVibGljIENGWF9UaHJlYWRMb2NrIHsNCisgcHVibGljOg0KKyAgQ0ZYX1RleHRTdHJlYW0oSUZYX1N0cmVhbSogcFN0cmVhbSwgRlhfQk9PTCBiRGVsU3RyZWFtKTsNCisgIH5DRlhfVGV4dFN0cmVhbSgpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKTsNCisgIHZpcnR1YWwgSUZYX1N0cmVhbSogUmV0YWluKCk7DQorDQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldEFjY2Vzc01vZGVzKCkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0TGVuZ3RoKCkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgU2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFBvc2l0aW9uKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNFT0YoKSBjb25zdDsNCisNCisgIHZpcnR1YWwgaW50MzJfdCBSZWFkRGF0YSh1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKTsNCisgIHZpcnR1YWwgaW50MzJfdCBSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTWF4TGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkVPUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29uc3QqIHBCeXRlU2l6ZSA9IE5VTEwpOw0KKyAgdmlydHVhbCBpbnQzMl90IFdyaXRlRGF0YShjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKTsNCisgIHZpcnR1YWwgaW50MzJfdCBXcml0ZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKTsNCisgIHZpcnR1YWwgdm9pZCBGbHVzaCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldExlbmd0aChpbnQzMl90IGlMZW5ndGgpOw0KKw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEJPTSh1aW50OF90IGJvbVs0XSkgY29uc3Q7DQorICB2aXJ0dWFsIEZYX1dPUkQgR2V0Q29kZVBhZ2UoKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfV09SRCBTZXRDb2RlUGFnZShGWF9XT1JEIHdDb2RlUGFnZSk7DQorDQorICB2aXJ0dWFsIHZvaWQgTG9jaygpIHsgQ0ZYX1RocmVhZExvY2s6OkxvY2soKTsgfQ0KKyAgdmlydHVhbCB2b2lkIFVubG9jaygpIHsgQ0ZYX1RocmVhZExvY2s6OlVubG9jaygpOyB9DQorDQorICB2aXJ0dWFsIElGWF9TdHJlYW0qIENyZWF0ZVNoYXJlZFN0cmVhbShGWF9EV09SRCBkd0FjY2VzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU9mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCk7DQorDQorIHByb3RlY3RlZDoNCisgIEZYX1dPUkQgbV93Q29kZVBhZ2U7DQorICBpbnQzMl90IG1fd0JPTUxlbmd0aDsNCisgIEZYX0RXT1JEIG1fZHdCT007DQorICB1aW50OF90KiBtX3BCdWY7DQorICBpbnQzMl90IG1faUJ1ZlNpemU7DQorICBGWF9CT09MIG1fYkRlbFN0cmVhbTsNCisgIElGWF9TdHJlYW0qIG1fcFN0cmVhbUltcDsNCisgIGludDMyX3QgbV9pUmVmQ291bnQ7DQorICB2b2lkIEluaXRTdHJlYW0oKTsNCit9Ow0KKw0KK2NsYXNzIENGR0FTX0ZpbGVSZWFkIDogcHVibGljIElGWF9GaWxlUmVhZCB7DQorIHB1YmxpYzoNCisgIENGR0FTX0ZpbGVSZWFkKElGWF9TdHJlYW0qIHBTdHJlYW0sIEZYX0JPT0wgYlJlbGVhc2VTdHJlYW0pOw0KKyAgdmlydHVhbCB+Q0ZHQVNfRmlsZVJlYWQoKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKyAgdmlydHVhbCBGWF9GSUxFU0laRSBHZXRTaXplKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7DQorDQorIHByb3RlY3RlZDoNCisgIEZYX0JPT0wgbV9iUmVsZWFzZVN0cmVhbTsNCisgIElGWF9TdHJlYW0qIG1fcFN0cmVhbTsNCit9Ow0KKw0KK2NsYXNzIENGWF9CdWZmZXJBY2NJbXAgOiBwdWJsaWMgSUZYX0ZpbGVSZWFkIHsNCisgcHVibGljOg0KKyAgQ0ZYX0J1ZmZlckFjY0ltcChJRlhfQnVmZmVyUmVhZCogcEJ1ZmZlclJlYWQsDQorICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIGlGaWxlU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVsZWFzZVN0cmVhbSk7DQorICB2aXJ0dWFsIH5DRlhfQnVmZmVyQWNjSW1wKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgRlhfRklMRVNJWkUgR2V0U2l6ZSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIFJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRlhfQnVmZmVyUmVhZCogbV9wQnVmZmVyUmVhZDsNCisgIEZYX0JPT0wgbV9iUmVsZWFzZVN0cmVhbTsNCisgIEZYX0ZJTEVTSVpFIG1faUJ1ZlNpemU7DQorfTsNCisNCitjbGFzcyBDRkdBU19GaWxlV3JpdGUgOiBwdWJsaWMgSUZYX0ZpbGVXcml0ZSB7DQorIHB1YmxpYzoNCisgIENGR0FTX0ZpbGVXcml0ZShJRlhfU3RyZWFtKiBwU3RyZWFtLCBGWF9CT09MIGJSZWxlYXNlU3RyZWFtKTsNCisgIHZpcnR1YWwgfkNGR0FTX0ZpbGVXcml0ZSgpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICB2aXJ0dWFsIEZYX0ZJTEVTSVpFIEdldFNpemUoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBGbHVzaCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIFdyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIHNpemVfdCBzaXplKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRlhfU3RyZWFtKiBtX3BTdHJlYW07DQorICBGWF9CT09MIG1fYlJlbGVhc2VTdHJlYW07DQorfTsNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2NydC9meF9zeXN0ZW0uY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfc3lzdGVtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjFkMTE3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfc3lzdGVtLmNwcApAQCAtMCwwICsxLDIyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSA8YWxnb3JpdGhtPg0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZnYXMvc3JjL2ZnYXNfYmFzZS5oIg0KKyNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU4zMl9NT0JJTEVfIHx8IFwNCisgICAgX0ZYX09TXyA9PSBfRlhfV0lONjRfDQorI2luY2x1ZGUgPGlvLmg+DQorI2VsaWYgX0ZYX09TXyA9PSBfRlhfTElOVVhfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfTElOVVhfTWluaV8NCisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+DQorI2VuZGlmDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmDQorRlhfRkxPQVQgRlhfdGFuKEZYX0ZMT0FUIGEpIHsNCisgIHJldHVybiAoRlhfRkxPQVQpdGFuKGEpOw0KK30NCitGWF9GTE9BVCBGWF9sb2coRlhfRkxPQVQgYiwgRlhfRkxPQVQgeCkgew0KKyAgcmV0dXJuIEZYU1lTX2xvZyh4KSAvIEZYU1lTX2xvZyhiKTsNCit9DQorRlhfV0NIQVIqIEZYX3djc25jcHkoRlhfV0NIQVIqIGRzdFN0ciwgY29uc3QgRlhfV0NIQVIqIHNyY1N0ciwgc2l6ZV90IGNvdW50KSB7DQorICBGWFNZU19hc3NlcnQoZHN0U3RyICE9IE5VTEwgJiYgc3JjU3RyICE9IE5VTEwgJiYgY291bnQgPiAwKTsNCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkNCisgICAgaWYgKChkc3RTdHJbaV0gPSBzcmNTdHJbaV0pID09IEwnXDAnKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIHJldHVybiBkc3RTdHI7DQorfQ0KK2ludDMyX3QgRlhfd2NzbmljbXAoY29uc3QgRlhfV0NIQVIqIHMxLCBjb25zdCBGWF9XQ0hBUiogczIsIHNpemVfdCBjb3VudCkgew0KKyAgRlhTWVNfYXNzZXJ0KHMxICE9IE5VTEwgJiYgczIgIT0gTlVMTCAmJiBjb3VudCA+IDApOw0KKyAgRlhfV0NIQVIgd2NoMSA9IDAsIHdjaDIgPSAwOw0KKyAgd2hpbGUgKGNvdW50LS0gPiAwKSB7DQorICAgIHdjaDEgPSAoRlhfV0NIQVIpRlhfdG9sb3dlcigqczErKyk7DQorICAgIHdjaDIgPSAoRlhfV0NIQVIpRlhfdG9sb3dlcigqczIrKyk7DQorICAgIGlmICh3Y2gxICE9IHdjaDIpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHdjaDEgLSB3Y2gyOw0KK30NCitpbnQzMl90IEZYX3N0cm5pY21wKGNvbnN0IEZYX0NIQVIqIHMxLCBjb25zdCBGWF9DSEFSKiBzMiwgc2l6ZV90IGNvdW50KSB7DQorICBGWFNZU19hc3NlcnQoczEgIT0gTlVMTCAmJiBzMiAhPSBOVUxMICYmIGNvdW50ID4gMCk7DQorICBGWF9DSEFSIGNoMSA9IDAsIGNoMiA9IDA7DQorICB3aGlsZSAoY291bnQtLSA+IDApIHsNCisgICAgY2gxID0gKEZYX0NIQVIpRlhfdG9sb3dlcigqczErKyk7DQorICAgIGNoMiA9IChGWF9DSEFSKUZYX3RvbG93ZXIoKnMyKyspOw0KKyAgICBpZiAoY2gxICE9IGNoMikgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gY2gxIC0gY2gyOw0KK30NCitpbnQzMl90IEZYX2ZpbGVsZW5ndGgoRlhTWVNfRklMRSogZmlsZSkgew0KKyAgRlhTWVNfYXNzZXJ0KGZpbGUgIT0gTlVMTCk7DQorI2lmIF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjY0Xw0KKyAgcmV0dXJuIF9maWxlbGVuZ3RoKF9maWxlbm8oZmlsZSkpOw0KKyNlbHNlDQorICBpbnQzMl90IGlQb3MgPSBGWFNZU19mdGVsbChmaWxlKTsNCisgIEZYU1lTX2ZzZWVrKGZpbGUsIDAsIEZYU1lTX1NFRUtfRU5EKTsNCisgIGludDMyX3QgaUxlbiA9IEZYU1lTX2Z0ZWxsKGZpbGUpOw0KKyAgRlhTWVNfZnNlZWsoZmlsZSwgaVBvcywgRlhTWVNfU0VFS19TRVQpOw0KKyAgcmV0dXJuIGlMZW47DQorI2VuZGlmDQorfQ0KK0ZYX0JPT0wgRlhfZnNldHNpemUoRlhTWVNfRklMRSogZmlsZSwgaW50MzJfdCBzaXplKSB7DQorICBGWFNZU19hc3NlcnQoZmlsZSAhPSBOVUxMKTsNCisjaWYgX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lONjRfDQorICByZXR1cm4gX2Noc2l6ZShfZmlsZW5vKGZpbGUpLCBzaXplKSA9PSAwOw0KKyNlbGlmIF9GWF9PU18gPT0gX0ZYX1dJTjMyX01PQklMRV8NCisgIEhBTkRMRSBoRmlsZSA9IF9maWxlbm8oZmlsZSk7DQorICBGWF9EV09SRCBkd1BvcyA9IDo6U2V0RmlsZVBvaW50ZXIoaEZpbGUsIDAsIDAsIEZJTEVfQ1VSUkVOVCk7DQorICA6OlNldEZpbGVQb2ludGVyKGhGaWxlLCBzaXplLCAwLCBGSUxFX0JFR0lOKTsNCisgIEZYX0JPT0wgYlJldCA9IDo6U2V0RW5kT2ZGaWxlKGhGaWxlKTsNCisgIDo6U2V0RmlsZVBvaW50ZXIoaEZpbGUsIChpbnQzMl90KWR3UG9zLCAwLCBGSUxFX0JFR0lOKTsNCisgIHJldHVybiBiUmV0Ow0KKyNlbHNlDQorICByZXR1cm4gRkFMU0U7DQorI2VuZGlmDQorfQ0KK0ZYX0ZMT0FUIEZYX3N0cnRvZihjb25zdCBGWF9DSEFSKiBwY3NTdHIsIGludDMyX3QgaUxlbmd0aCwgaW50MzJfdCogcFVzZWRMZW4pIHsNCisgIEZYU1lTX2Fzc2VydChwY3NTdHIgIT0gTlVMTCk7DQorICBpZiAoaUxlbmd0aCA8IDApIHsNCisgICAgaUxlbmd0aCA9IEZYU1lTX3N0cmxlbihwY3NTdHIpOw0KKyAgfQ0KKyAgcmV0dXJuIEZYX3djc3RvZihDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBjc1N0ciwgaUxlbmd0aCksIGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgIHBVc2VkTGVuKTsNCit9DQorRlhfRkxPQVQgRlhfd2NzdG9mKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsIGludDMyX3QgaUxlbmd0aCwgaW50MzJfdCogcFVzZWRMZW4pIHsNCisgIEZYU1lTX2Fzc2VydChwd3NTdHIgIT0gTlVMTCk7DQorICBpZiAoaUxlbmd0aCA8IDApIHsNCisgICAgaUxlbmd0aCA9IEZYU1lTX3djc2xlbihwd3NTdHIpOw0KKyAgfQ0KKyAgaWYgKGlMZW5ndGggPT0gMCkgew0KKyAgICByZXR1cm4gMC4wZjsNCisgIH0NCisgIGludDMyX3QgaVVzZWRMZW4gPSAwOw0KKyAgRlhfQk9PTCBiTmVndGl2ZSA9IEZBTFNFOw0KKyAgc3dpdGNoIChwd3NTdHJbaVVzZWRMZW5dKSB7DQorICAgIGNhc2UgJy0nOg0KKyAgICAgIGJOZWd0aXZlID0gVFJVRTsNCisgICAgY2FzZSAnKyc6DQorICAgICAgaVVzZWRMZW4rKzsNCisgICAgICBicmVhazsNCisgIH0NCisgIEZYX0ZMT0FUIGZWYWx1ZSA9IDAuMGY7DQorICB3aGlsZSAoaVVzZWRMZW4gPCBpTGVuZ3RoKSB7DQorICAgIEZYX1dDSEFSIHdjaCA9IHB3c1N0cltpVXNlZExlbl07DQorICAgIGlmICh3Y2ggPj0gTCcwJyAmJiB3Y2ggPD0gTCc5Jykgew0KKyAgICAgIGZWYWx1ZSA9IGZWYWx1ZSAqIDEwLjBmICsgKHdjaCAtIEwnMCcpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlVc2VkTGVuKys7DQorICB9DQorICBpZiAoaVVzZWRMZW4gPCBpTGVuZ3RoICYmIHB3c1N0cltpVXNlZExlbl0gPT0gTCcuJykgew0KKyAgICBGWF9GTE9BVCBmUHJlY2lzZSA9IDAuMWY7DQorICAgIHdoaWxlICgrK2lVc2VkTGVuIDwgaUxlbmd0aCkgew0KKyAgICAgIEZYX1dDSEFSIHdjaCA9IHB3c1N0cltpVXNlZExlbl07DQorICAgICAgaWYgKHdjaCA+PSBMJzAnICYmIHdjaCA8PSBMJzknKSB7DQorICAgICAgICBmVmFsdWUgKz0gKHdjaCAtIEwnMCcpICogZlByZWNpc2U7DQorICAgICAgICBmUHJlY2lzZSAqPSAwLjFmOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmIChwVXNlZExlbikgew0KKyAgICAqcFVzZWRMZW4gPSBpVXNlZExlbjsNCisgIH0NCisgIHJldHVybiBiTmVndGl2ZSA/IC1mVmFsdWUgOiBmVmFsdWU7DQorfQ0KK3ZvaWQgRlhfbWVtc2V0KHZvaWQqIHBCdWYsIGludDMyX3QgaVZhbHVlLCBzaXplX3Qgc2l6ZSkgew0KKyAgRlhTWVNfYXNzZXJ0KHBCdWYgIT0gTlVMTCAmJiBzaXplID4gMCAmJiAoc2l6ZSAmIDB4MDMpID09IDApOw0KKyAgRlhTWVNfYXNzZXJ0KCgoKHNpemVfdClwQnVmKSAmIDB4MDMpID09IDApOw0KKyAgRlhfRFdPUkQqIHBTdGFydCA9IChGWF9EV09SRCopcEJ1ZjsNCisgIEZYX0RXT1JEKiBwRW5kID0gcFN0YXJ0ICsgKHNpemUgPj4gMik7DQorICB3aGlsZSAocFN0YXJ0IDwgcEVuZCkgew0KKyAgICAqcFN0YXJ0KysgPSBpVmFsdWU7DQorICB9DQorfQ0KK3ZvaWQgRlhfbWVtY3B5KHZvaWQqIHBEc3QsIGNvbnN0IHZvaWQqIHBTcmMsIHNpemVfdCBzaXplKSB7DQorICBGWFNZU19hc3NlcnQocERzdCAhPSBOVUxMICYmIHBTcmMgIT0gTlVMTCAmJiBzaXplID4gMCAmJiAoc2l6ZSAmIDB4MDMpID09IDApOw0KKyAgRlhTWVNfYXNzZXJ0KCgoKHNpemVfdClwRHN0KSAmIDB4MDMpID09IDAgJiYgKCgoc2l6ZV90KXBTcmMpICYgMHgwMykgPT0gMCk7DQorICBGWF9EV09SRCogcFN0YXJ0ID0gKEZYX0RXT1JEKilwRHN0Ow0KKyAgRlhfRFdPUkQqIHBFbmQgPSBwU3RhcnQgKyAoc2l6ZSA+PiAyKTsNCisgIEZYX0RXT1JEKiBwVmFsdWUgPSAoRlhfRFdPUkQqKXBTcmM7DQorICB3aGlsZSAocFN0YXJ0IDwgcEVuZCkgew0KKyAgICAqcFN0YXJ0KysgPSAqcFZhbHVlKys7DQorICB9DQorfQ0KK0ZYX0JPT0wgRlhfSXNSZWxhdGl2ZVBhdGgoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1VybCkgew0KKyAgaW50MzJfdCBpVXJsTGVuID0gd3NVcmwuR2V0TGVuZ3RoKCk7DQorICBpZiAoaVVybExlbiA9PSAwKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IGkgPSBzdGQ6Om1pbig1LCBpVXJsTGVuKSAtIDE7IGkgPj0gMDsgLS1pKQ0KKyAgICBpZiAod3NVcmwuR2V0QXQoaSkgPT0gJzonKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBGWF9Kb2luUGF0aChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQmFzZVBhdGgsDQorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzUmVsYXRpdmVQYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQWJzb2x1dGVQYXRoKSB7DQorICBpZiAoIUZYX0lzUmVsYXRpdmVQYXRoKHdzUmVsYXRpdmVQYXRoKSkgew0KKyAgICB3c0Fic29sdXRlUGF0aCA9IHdzUmVsYXRpdmVQYXRoOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIGNvbnN0IEZYX1dDSEFSKiBwUmVsU3RhcnQgPSB3c1JlbGF0aXZlUGF0aC5HZXRQdHIoKTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwUmVsRW5kID0gcFJlbFN0YXJ0ICsgd3NSZWxhdGl2ZVBhdGguR2V0TGVuZ3RoKCk7DQorICBpZiAocFJlbFN0YXJ0IDwgcFJlbEVuZCkgew0KKyAgICBzd2l0Y2ggKCpwUmVsU3RhcnQpIHsNCisgICAgICBjYXNlICcjJzoNCisgICAgICAgIHdzQWJzb2x1dGVQYXRoID0gQ0ZYX1dpZGVTdHJpbmcod3NCYXNlUGF0aCwgd3NSZWxhdGl2ZVBhdGgpOw0KKyAgICAgICAgcmV0dXJuIHdzQWJzb2x1dGVQYXRoLkdldExlbmd0aCgpID4gMDsNCisgICAgICBjYXNlICcvJzoNCisgICAgICBjYXNlICdcXCc6DQorICAgICAgICB3c0Fic29sdXRlUGF0aCA9IHdzUmVsYXRpdmVQYXRoOw0KKyAgICAgICAgcmV0dXJuIHdzQWJzb2x1dGVQYXRoLkdldExlbmd0aCgpID4gMDsNCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBuQmFja0NvdW50ID0gMDsNCisgIGZvciAoOzspIHsNCisgICAgaWYgKHBSZWxTdGFydCA+PSBwUmVsRW5kKSB7DQorICAgICAgd3NBYnNvbHV0ZVBhdGggPSB3c0Jhc2VQYXRoOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGlmICgqcFJlbFN0YXJ0ICE9ICcuJykgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChwUmVsU3RhcnQgKyAxIDwgcFJlbEVuZCAmJg0KKyAgICAgICAgKHBSZWxTdGFydFsxXSA9PSAnLycgfHwgcFJlbFN0YXJ0WzFdID09ICdcXCcpKSB7DQorICAgICAgcFJlbFN0YXJ0ICs9IDI7DQorICAgIH0gZWxzZSBpZiAocFJlbFN0YXJ0ICsgMiA8IHBSZWxFbmQgJiYgcFJlbFN0YXJ0WzFdID09ICcuJyAmJg0KKyAgICAgICAgICAgICAgIChwUmVsU3RhcnRbMl0gPT0gJy8nIHx8IHBSZWxTdGFydFsyXSA9PSAnXFwnKSkgew0KKyAgICAgIHBSZWxTdGFydCArPSAzOw0KKyAgICAgIG5CYWNrQ291bnQrKzsNCisgICAgfSBlbHNlIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgIH0NCisgIGNvbnN0IEZYX1dDSEFSKiBwQmFzZVN0YXJ0ID0gd3NCYXNlUGF0aC5HZXRQdHIoKTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwQmFzZUVuZCA9IHBCYXNlU3RhcnQgKyB3c0Jhc2VQYXRoLkdldExlbmd0aCgpOw0KKyAgd2hpbGUgKHBCYXNlU3RhcnQgPCAoLS1wQmFzZUVuZCkgJiYgKnBCYXNlRW5kICE9ICcvJyAmJiAqcEJhc2VFbmQgIT0gJ1xcJykNCisgICAgOw0KKyAgaWYgKHBCYXNlU3RhcnQgPT0gcEJhc2VFbmQpIHsNCisgICAgd3NBYnNvbHV0ZVBhdGggPSBDRlhfV2lkZVN0cmluZ0MocFJlbFN0YXJ0LCBwUmVsRW5kIC0gcFJlbFN0YXJ0KTsNCisgICAgcmV0dXJuIHdzQWJzb2x1dGVQYXRoLkdldExlbmd0aCgpID4gMDsNCisgIH0NCisgIHdoaWxlIChuQmFja0NvdW50ID4gMCkgew0KKyAgICBpZiAocEJhc2VTdGFydCA+PSAoLS1wQmFzZUVuZCkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0gZWxzZSBpZiAoKnBCYXNlRW5kID09ICcvJyB8fCAqcEJhc2VFbmQgPT0gJ1xcJykNCisgICAgICBpZiAoKC0tbkJhY2tDb3VudCkgPD0gMCkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgfQ0KKyAgd3NBYnNvbHV0ZVBhdGggPQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nKENGWF9XaWRlU3RyaW5nQyhwQmFzZVN0YXJ0LCBwQmFzZUVuZCAtIHBCYXNlU3RhcnQgKyAxKSwNCisgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0MocFJlbFN0YXJ0LCBwUmVsRW5kIC0gcFJlbFN0YXJ0KSk7DQorICByZXR1cm4gd3NBYnNvbHV0ZVBhdGguR2V0TGVuZ3RoKCkgPiAwOw0KK30NCisjaWZkZWYgX19jcGx1c3BsdXMNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3V0aWxzLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGJlMGQ4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfdXRpbHMuY3BwCkBAIC0wLDAgKzEsNDMyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlIDxhbGdvcml0aG0+DQorDQorI2luY2x1ZGUgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2Z4X3V0bC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZnYXMvc3JjL2ZnYXNfYmFzZS5oIg0KKyNpbmNsdWRlICJmeF91dGlscy5oIg0KKw0KK0NGWF9UaHJlYWRMb2NrOjpDRlhfVGhyZWFkTG9jaygpIHsNCit9DQorQ0ZYX1RocmVhZExvY2s6On5DRlhfVGhyZWFkTG9jaygpIHt9DQordm9pZCBDRlhfVGhyZWFkTG9jazo6TG9jaygpIHt9DQordm9pZCBDRlhfVGhyZWFkTG9jazo6VW5sb2NrKCkge30NCitjbGFzcyBGWF9CQVNFQVJSQVlEQVRBIDogcHVibGljIENGWF9UYXJnZXQgew0KKyBwdWJsaWM6DQorICBGWF9CQVNFQVJSQVlEQVRBKGludDMyX3QgZ3Jvd3NpemUsIGludDMyX3QgYmxvY2tzaXplKQ0KKyAgICAgIDogaUdyb3dTaXplKGdyb3dzaXplKSwNCisgICAgICAgIGlCbG9ja1NpemUoYmxvY2tzaXplKSwNCisgICAgICAgIGlUb3RhbENvdW50KDApLA0KKyAgICAgICAgaUJsb2NrQ291bnQoMCksDQorICAgICAgICBwQnVmZmVyKG51bGxwdHIpIHt9DQorDQorICB+RlhfQkFTRUFSUkFZREFUQSgpIHsgRlhfRnJlZShwQnVmZmVyKTsgfQ0KKw0KKyAgaW50MzJfdCBpR3Jvd1NpemU7DQorICBpbnQzMl90IGlCbG9ja1NpemU7DQorICBpbnQzMl90IGlUb3RhbENvdW50Ow0KKyAgaW50MzJfdCBpQmxvY2tDb3VudDsNCisgIHVpbnQ4X3QqIHBCdWZmZXI7DQorfTsNCitDRlhfQmFzZUFycmF5OjpDRlhfQmFzZUFycmF5KGludDMyX3QgaUdyb3dTaXplLCBpbnQzMl90IGlCbG9ja1NpemUpIHsNCisgIEZYU1lTX2Fzc2VydChpR3Jvd1NpemUgPiAwICYmIGlCbG9ja1NpemUgPiAwKTsNCisgIG1fcERhdGEgPSBuZXcgRlhfQkFTRUFSUkFZREFUQShpR3Jvd1NpemUsIGlCbG9ja1NpemUpOw0KK30NCitDRlhfQmFzZUFycmF5Ojp+Q0ZYX0Jhc2VBcnJheSgpIHsNCisgIFJlbW92ZUFsbCgpOw0KKyAgZGVsZXRlIG1fcERhdGE7DQorfQ0KK2ludDMyX3QgQ0ZYX0Jhc2VBcnJheTo6R2V0U2l6ZSgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BEYXRhLT5pQmxvY2tDb3VudDsNCit9DQoraW50MzJfdCBDRlhfQmFzZUFycmF5OjpHZXRCbG9ja1NpemUoKSBjb25zdCB7DQorICByZXR1cm4gbV9wRGF0YS0+aUJsb2NrU2l6ZTsNCit9DQordWludDhfdCogQ0ZYX0Jhc2VBcnJheTo6QWRkU3BhY2VUbyhpbnQzMl90IGluZGV4KSB7DQorICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSk7DQorICB1aW50OF90KiYgcEJ1ZmZlciA9IG1fcERhdGEtPnBCdWZmZXI7DQorICBpbnQzMl90JiBpVG90YWxDb3VudCA9IG1fcERhdGEtPmlUb3RhbENvdW50Ow0KKyAgaW50MzJfdCBpQmxvY2tTaXplID0gbV9wRGF0YS0+aUJsb2NrU2l6ZTsNCisgIGlmIChpbmRleCA+PSBpVG90YWxDb3VudCkgew0KKyAgICBpbnQzMl90IGlHcm93U2l6ZSA9IG1fcERhdGEtPmlHcm93U2l6ZTsNCisgICAgaVRvdGFsQ291bnQgPSAoaW5kZXggLyBpR3Jvd1NpemUgKyAxKSAqIGlHcm93U2l6ZTsNCisgICAgaW50MzJfdCBpTmV3U2l6ZSA9IGlUb3RhbENvdW50ICogaUJsb2NrU2l6ZTsNCisgICAgaWYgKCFwQnVmZmVyKSB7DQorICAgICAgcEJ1ZmZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIGlOZXdTaXplKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBwQnVmZmVyID0gRlhfUmVhbGxvYyh1aW50OF90LCBwQnVmZmVyLCBpTmV3U2l6ZSk7DQorICAgIH0NCisgIH0NCisgIGludDMyX3QmIGlCbG9ja0NvdW50ID0gbV9wRGF0YS0+aUJsb2NrQ291bnQ7DQorICBpZiAoaW5kZXggPj0gaUJsb2NrQ291bnQpIHsNCisgICAgaUJsb2NrQ291bnQgPSBpbmRleCArIDE7DQorICB9DQorICByZXR1cm4gcEJ1ZmZlciArIGluZGV4ICogaUJsb2NrU2l6ZTsNCit9DQordWludDhfdCogQ0ZYX0Jhc2VBcnJheTo6R2V0QXQoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgRlhTWVNfYXNzZXJ0KGluZGV4ID4gLTEgJiYgaW5kZXggPCBtX3BEYXRhLT5pQmxvY2tDb3VudCk7DQorICByZXR1cm4gbV9wRGF0YS0+cEJ1ZmZlciArIGluZGV4ICogbV9wRGF0YS0+aUJsb2NrU2l6ZTsNCit9DQordWludDhfdCogQ0ZYX0Jhc2VBcnJheTo6R2V0QnVmZmVyKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fcERhdGEtPnBCdWZmZXI7DQorfQ0KK2ludDMyX3QgQ0ZYX0Jhc2VBcnJheTo6QXBwZW5kKGNvbnN0IENGWF9CYXNlQXJyYXkmIHNyYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCkgew0KKyAgaW50MzJfdCBpQmxvY2tTaXplID0gbV9wRGF0YS0+aUJsb2NrU2l6ZTsNCisgIEZYU1lTX2Fzc2VydChpQmxvY2tTaXplID09IHNyYy5tX3BEYXRhLT5pQmxvY2tTaXplKTsNCisgIGludDMyX3QmIGlCbG9ja0NvdW50ID0gbV9wRGF0YS0+aUJsb2NrQ291bnQ7DQorICBpbnQzMl90IGlBZGRlZCA9IHNyYy5HZXRTaXplKCk7DQorICBGWFNZU19hc3NlcnQoaVN0YXJ0ID4gLTEgJiYgaVN0YXJ0IDwgaUFkZGVkKTsNCisgIGlmIChpQ291bnQgPCAwKSB7DQorICAgIGlDb3VudCA9IGlBZGRlZDsNCisgIH0NCisgIGlmIChpU3RhcnQgKyBpQ291bnQgPiBpQWRkZWQpIHsNCisgICAgaUNvdW50ID0gaUFkZGVkIC0gaVN0YXJ0Ow0KKyAgfQ0KKyAgaWYgKGlDb3VudCA8IDEpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICB1aW50OF90KiBwRHN0ID0gbV9wRGF0YS0+cEJ1ZmZlciArIGlCbG9ja0NvdW50ICogaUJsb2NrU2l6ZTsNCisgIEFkZFNwYWNlVG8oaUJsb2NrQ291bnQgKyBpQ291bnQgLSAxKTsNCisgIEZYX21lbWNweShwRHN0LCBzcmMubV9wRGF0YS0+cEJ1ZmZlciArIGlTdGFydCAqIGlCbG9ja1NpemUsDQorICAgICAgICAgICAgaUNvdW50ICogaUJsb2NrU2l6ZSk7DQorICByZXR1cm4gaUNvdW50Ow0KK30NCitpbnQzMl90IENGWF9CYXNlQXJyYXk6OkNvcHkoY29uc3QgQ0ZYX0Jhc2VBcnJheSYgc3JjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQpIHsNCisgIGludDMyX3QgaUJsb2NrU2l6ZSA9IG1fcERhdGEtPmlCbG9ja1NpemU7DQorICBGWFNZU19hc3NlcnQoaUJsb2NrU2l6ZSA9PSBzcmMubV9wRGF0YS0+aUJsb2NrU2l6ZSk7DQorICBpbnQzMl90IGlDb3BpZWQgPSBzcmMuR2V0U2l6ZSgpOw0KKyAgRlhTWVNfYXNzZXJ0KGlTdGFydCA+IC0xICYmIGlTdGFydCA8IGlDb3BpZWQpOw0KKyAgaWYgKGlDb3VudCA8IDApIHsNCisgICAgaUNvdW50ID0gaUNvcGllZDsNCisgIH0NCisgIGlmIChpU3RhcnQgKyBpQ291bnQgPiBpQ29waWVkKSB7DQorICAgIGlDb3VudCA9IGlDb3BpZWQgLSBpU3RhcnQ7DQorICB9DQorICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIFJlbW92ZUFsbChUUlVFKTsNCisgIEFkZFNwYWNlVG8oaUNvdW50IC0gMSk7DQorICBGWF9tZW1jcHkobV9wRGF0YS0+cEJ1ZmZlciwgc3JjLm1fcERhdGEtPnBCdWZmZXIgKyBpU3RhcnQgKiBpQmxvY2tTaXplLA0KKyAgICAgICAgICAgIGlDb3VudCAqIGlCbG9ja1NpemUpOw0KKyAgcmV0dXJuIGlDb3VudDsNCit9DQoraW50MzJfdCBDRlhfQmFzZUFycmF5OjpSZW1vdmVMYXN0KGludDMyX3QgaUNvdW50KSB7DQorICBpbnQzMl90JiBpQmxvY2tDb3VudCA9IG1fcERhdGEtPmlCbG9ja0NvdW50Ow0KKyAgaWYgKGlDb3VudCA8IDAgfHwgaUNvdW50ID4gaUJsb2NrQ291bnQpIHsNCisgICAgaUNvdW50ID0gaUJsb2NrQ291bnQ7DQorICAgIGlCbG9ja0NvdW50ID0gMDsNCisgIH0gZWxzZSB7DQorICAgIGlCbG9ja0NvdW50IC09IGlDb3VudDsNCisgIH0NCisgIHJldHVybiBpQ291bnQ7DQorfQ0KK3ZvaWQgQ0ZYX0Jhc2VBcnJheTo6UmVtb3ZlQWxsKEZYX0JPT0wgYkxlYXZlTWVtb3J5KSB7DQorICBpZiAoIWJMZWF2ZU1lbW9yeSkgew0KKyAgICB1aW50OF90KiYgcEJ1ZmZlciA9IG1fcERhdGEtPnBCdWZmZXI7DQorICAgIGlmIChwQnVmZmVyICE9IE5VTEwpIHsNCisgICAgICBGWF9GcmVlKHBCdWZmZXIpOw0KKyAgICAgIHBCdWZmZXIgPSBOVUxMOw0KKyAgICB9DQorICAgIG1fcERhdGEtPmlUb3RhbENvdW50ID0gMDsNCisgIH0NCisgIG1fcERhdGEtPmlCbG9ja0NvdW50ID0gMDsNCit9DQorQ0ZYX0Jhc2VNYXNzQXJyYXlJbXA6OkNGWF9CYXNlTWFzc0FycmF5SW1wKGludDMyX3QgaUNodW5rU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQmxvY2tTaXplKQ0KKyAgICA6IG1faUNodW5rU2l6ZShpQ2h1bmtTaXplKSwNCisgICAgICBtX2lCbG9ja1NpemUoaUJsb2NrU2l6ZSksDQorICAgICAgbV9pQ2h1bmtDb3VudCgwKSwNCisgICAgICBtX2lCbG9ja0NvdW50KDApIHsNCisgIEZYU1lTX2Fzc2VydChtX2lDaHVua1NpemUgPiAwICYmIG1faUJsb2NrU2l6ZSA+IDApOw0KKyAgbV9wRGF0YSA9IG5ldyBDRlhfUHRyQXJyYXk7DQorICBtX3BEYXRhLT5TZXRTaXplKDE2KTsNCit9DQorQ0ZYX0Jhc2VNYXNzQXJyYXlJbXA6On5DRlhfQmFzZU1hc3NBcnJheUltcCgpIHsNCisgIFJlbW92ZUFsbCgpOw0KKyAgZGVsZXRlIG1fcERhdGE7DQorfQ0KK3VpbnQ4X3QqIENGWF9CYXNlTWFzc0FycmF5SW1wOjpBZGRTcGFjZVRvKGludDMyX3QgaW5kZXgpIHsNCisgIEZYU1lTX2Fzc2VydChpbmRleCA+IC0xKTsNCisgIHVpbnQ4X3QqIHBDaHVuazsNCisgIGlmIChpbmRleCA8IG1faUJsb2NrQ291bnQpIHsNCisgICAgcENodW5rID0gKHVpbnQ4X3QqKW1fcERhdGEtPkdldEF0KGluZGV4IC8gbV9pQ2h1bmtTaXplKTsNCisgIH0gZWxzZSB7DQorICAgIGludDMyX3QgaU1lbVNpemUgPSBtX2lDaHVua1NpemUgKiBtX2lCbG9ja1NpemU7DQorICAgIHdoaWxlIChUUlVFKSB7DQorICAgICAgaWYgKGluZGV4IDwgbV9pQ2h1bmtDb3VudCAqIG1faUNodW5rU2l6ZSkgew0KKyAgICAgICAgcENodW5rID0gKHVpbnQ4X3QqKW1fcERhdGEtPkdldEF0KGluZGV4IC8gbV9pQ2h1bmtTaXplKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBwQ2h1bmsgPSBGWF9BbGxvYyh1aW50OF90LCBpTWVtU2l6ZSk7DQorICAgICAgICBpZiAobV9pQ2h1bmtDb3VudCA8IG1fcERhdGEtPkdldFNpemUoKSkgew0KKyAgICAgICAgICBtX3BEYXRhLT5TZXRBdChtX2lDaHVua0NvdW50LCBwQ2h1bmspOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgbV9wRGF0YS0+QWRkKHBDaHVuayk7DQorICAgICAgICB9DQorICAgICAgICBtX2lDaHVua0NvdW50Kys7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBGWFNZU19hc3NlcnQocENodW5rICE9IE5VTEwpOw0KKyAgbV9pQmxvY2tDb3VudCA9IGluZGV4ICsgMTsNCisgIHJldHVybiBwQ2h1bmsgKyAoaW5kZXggJSBtX2lDaHVua1NpemUpICogbV9pQmxvY2tTaXplOw0KK30NCit1aW50OF90KiBDRlhfQmFzZU1hc3NBcnJheUltcDo6R2V0QXQoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgRlhTWVNfYXNzZXJ0KGluZGV4ID4gLTEgJiYgaW5kZXggPCBtX2lCbG9ja0NvdW50KTsNCisgIHVpbnQ4X3QqIHBDaHVuayA9ICh1aW50OF90KiltX3BEYXRhLT5HZXRBdChpbmRleCAvIG1faUNodW5rU2l6ZSk7DQorICBGWFNZU19hc3NlcnQocENodW5rICE9IE5VTEwpOw0KKyAgcmV0dXJuIHBDaHVuayArIChpbmRleCAlIG1faUNodW5rU2l6ZSkgKiBtX2lCbG9ja1NpemU7DQorfQ0KK2ludDMyX3QgQ0ZYX0Jhc2VNYXNzQXJyYXlJbXA6OkFwcGVuZChjb25zdCBDRlhfQmFzZU1hc3NBcnJheUltcCYgc3JjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQpIHsNCisgIEZYU1lTX2Fzc2VydChtX2lCbG9ja1NpemUgPT0gc3JjLm1faUJsb2NrU2l6ZSk7DQorICBpbnQzMl90IGlBZGRlZCA9IHNyYy5tX2lCbG9ja0NvdW50Ow0KKyAgRlhTWVNfYXNzZXJ0KGlTdGFydCA+IC0xICYmIGlTdGFydCA8IGlBZGRlZCk7DQorICBpZiAoaUNvdW50IDwgMCkgew0KKyAgICBpQ291bnQgPSBpQWRkZWQ7DQorICB9DQorICBpZiAoaVN0YXJ0ICsgaUNvdW50ID4gaUFkZGVkKSB7DQorICAgIGlDb3VudCA9IGlBZGRlZCAtIGlTdGFydDsNCisgIH0NCisgIGlmIChpQ291bnQgPCAxKSB7DQorICAgIHJldHVybiBtX2lCbG9ja0NvdW50Ow0KKyAgfQ0KKyAgaW50MzJfdCBpQmxvY2tDb3VudCA9IG1faUJsb2NrQ291bnQ7DQorICBpbnQzMl90IGlUb3RhbCA9IG1faUJsb2NrQ291bnQgKyBpQ291bnQ7DQorICBBZGRTcGFjZVRvKGlUb3RhbCAtIDEpOw0KKyAgQXBwZW5kKGlCbG9ja0NvdW50LCBzcmMsIGlTdGFydCwgaUNvdW50KTsNCisgIHJldHVybiBtX2lCbG9ja0NvdW50Ow0KK30NCitpbnQzMl90IENGWF9CYXNlTWFzc0FycmF5SW1wOjpDb3B5KGNvbnN0IENGWF9CYXNlTWFzc0FycmF5SW1wJiBzcmMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50KSB7DQorICBGWFNZU19hc3NlcnQobV9pQmxvY2tTaXplID09IHNyYy5tX2lCbG9ja1NpemUpOw0KKyAgaW50MzJfdCBpQ29waWVkID0gc3JjLm1faUJsb2NrQ291bnQ7DQorICBGWFNZU19hc3NlcnQoaVN0YXJ0ID4gLTEpOw0KKyAgaWYgKGlTdGFydCA+PSBpQ29waWVkKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgUmVtb3ZlQWxsKFRSVUUpOw0KKyAgaWYgKGlDb3VudCA8IDApIHsNCisgICAgaUNvdW50ID0gaUNvcGllZDsNCisgIH0NCisgIGlmIChpU3RhcnQgKyBpQ291bnQgPiBpQ29waWVkKSB7DQorICAgIGlDb3VudCA9IGlDb3BpZWQgLSBpU3RhcnQ7DQorICB9DQorICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGlmIChtX2lCbG9ja0NvdW50IDwgaUNvdW50KSB7DQorICAgIEFkZFNwYWNlVG8oaUNvdW50IC0gMSk7DQorICB9DQorICBBcHBlbmQoMCwgc3JjLCBpU3RhcnQsIGlDb3VudCk7DQorICByZXR1cm4gbV9pQmxvY2tDb3VudDsNCit9DQordm9pZCBDRlhfQmFzZU1hc3NBcnJheUltcDo6QXBwZW5kKGludDMyX3QgaURzdFN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQmFzZU1hc3NBcnJheUltcCYgc3JjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTcmNTdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3JjQ291bnQpIHsNCisgIEZYU1lTX2Fzc2VydChpRHN0U3RhcnQgPiAtMSAmJiBtX2lCbG9ja1NpemUgPT0gc3JjLm1faUJsb2NrU2l6ZSk7DQorICBpbnQzMl90IGlTcmNUb3RhbCA9IHNyYy5tX2lCbG9ja0NvdW50Ow0KKyAgRlhTWVNfYXNzZXJ0KGlTcmNUb3RhbCA+IDAgJiYgbV9pQmxvY2tDb3VudCA+PSBpRHN0U3RhcnQgKyBpU3JjQ291bnQpOw0KKyAgRlhTWVNfYXNzZXJ0KGlTcmNTdGFydCA+IC0xICYmIGlTcmNTdGFydCA8IGlTcmNUb3RhbCAmJiBpU3JjQ291bnQgPiAwICYmDQorICAgICAgICAgICAgICAgaVNyY1N0YXJ0ICsgaVNyY0NvdW50IDw9IGlTcmNUb3RhbCk7DQorICBpbnQzMl90IGlEc3RDaHVua0luZGV4ID0gaURzdFN0YXJ0IC8gbV9pQ2h1bmtTaXplOw0KKyAgaW50MzJfdCBpU3JjQ2h1bmtJbmRleCA9IGlTcmNTdGFydCAvIHNyYy5tX2lDaHVua1NpemU7DQorICB1aW50OF90KiBwRHN0Q2h1bmsgPSAodWludDhfdCopR2V0QXQoaURzdFN0YXJ0KTsNCisgIHVpbnQ4X3QqIHBTcmNDaHVuayA9ICh1aW50OF90KilzcmMuR2V0QXQoaVNyY1N0YXJ0KTsNCisgIGludDMyX3QgaURzdENodW5rU2l6ZSA9IG1faUNodW5rU2l6ZSAtIChpRHN0U3RhcnQgJSBtX2lDaHVua1NpemUpOw0KKyAgaW50MzJfdCBpU3JjQ2h1bmtTaXplID0gc3JjLm1faUNodW5rU2l6ZSAtIChpU3JjU3RhcnQgJSBzcmMubV9pQ2h1bmtTaXplKTsNCisgIGludDMyX3QgaUNvcHlTaXplID0NCisgICAgICBzdGQ6Om1pbihpU3JjQ291bnQsIHN0ZDo6bWluKGlTcmNDaHVua1NpemUsIGlEc3RDaHVua1NpemUpKTsNCisgIGludDMyX3QgaUNvcHlCeXRlcyA9IGlDb3B5U2l6ZSAqIG1faUJsb2NrU2l6ZTsNCisgIHdoaWxlIChpU3JjQ291bnQgPiAwKSB7DQorICAgIEZYU1lTX2Fzc2VydChwRHN0Q2h1bmsgIT0gTlVMTCAmJiBwU3JjQ2h1bmsgIT0gTlVMTCk7DQorICAgIEZYU1lTX21lbWNweShwRHN0Q2h1bmssIHBTcmNDaHVuaywgaUNvcHlCeXRlcyk7DQorICAgIGlTcmNDb3VudCAtPSBpQ29weVNpemU7DQorICAgIGlTcmNDaHVua1NpemUgLT0gaUNvcHlTaXplOw0KKyAgICBpZiAoaVNyY0NodW5rU2l6ZSA8IDEpIHsNCisgICAgICBpU3JjQ2h1bmtTaXplID0gc3JjLm1faUNodW5rU2l6ZTsNCisgICAgICBpU3JjQ2h1bmtJbmRleCsrOw0KKyAgICAgIHBTcmNDaHVuayA9ICh1aW50OF90KilzcmMubV9wRGF0YS0+R2V0QXQoaVNyY0NodW5rSW5kZXgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHBTcmNDaHVuayArPSBpQ29weUJ5dGVzOw0KKyAgICB9DQorICAgIGlEc3RDaHVua1NpemUgLT0gaUNvcHlTaXplOw0KKyAgICBpZiAoaURzdENodW5rU2l6ZSA8IDEpIHsNCisgICAgICBpRHN0Q2h1bmtTaXplID0gbV9pQ2h1bmtTaXplOw0KKyAgICAgIGlEc3RDaHVua0luZGV4Kys7DQorICAgICAgcERzdENodW5rID0gKHVpbnQ4X3QqKW1fcERhdGEtPkdldEF0KGlEc3RDaHVua0luZGV4KTsNCisgICAgfSBlbHNlIHsNCisgICAgICBwRHN0Q2h1bmsgKz0gaUNvcHlCeXRlczsNCisgICAgfQ0KKyAgICBpQ29weVNpemUgPSBzdGQ6Om1pbihpU3JjQ291bnQsIHN0ZDo6bWluKGlTcmNDaHVua1NpemUsIGlEc3RDaHVua1NpemUpKTsNCisgICAgaUNvcHlCeXRlcyA9IGlDb3B5U2l6ZSAqIG1faUJsb2NrU2l6ZTsNCisgIH0NCit9DQoraW50MzJfdCBDRlhfQmFzZU1hc3NBcnJheUltcDo6UmVtb3ZlTGFzdChpbnQzMl90IGlDb3VudCkgew0KKyAgaWYgKGlDb3VudCA8IDAgfHwgaUNvdW50ID49IG1faUJsb2NrQ291bnQpIHsNCisgICAgbV9pQmxvY2tDb3VudCA9IDA7DQorICB9IGVsc2Ugew0KKyAgICBtX2lCbG9ja0NvdW50IC09IGlDb3VudDsNCisgIH0NCisgIHJldHVybiBtX2lCbG9ja0NvdW50Ow0KK30NCit2b2lkIENGWF9CYXNlTWFzc0FycmF5SW1wOjpSZW1vdmVBbGwoRlhfQk9PTCBiTGVhdmVNZW1vcnkpIHsNCisgIGlmIChiTGVhdmVNZW1vcnkpIHsNCisgICAgbV9pQmxvY2tDb3VudCA9IDA7DQorICAgIHJldHVybjsNCisgIH0NCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1faUNodW5rQ291bnQ7IGkrKykgew0KKyAgICB2b2lkKiBwID0gbV9wRGF0YS0+R2V0QXQoaSk7DQorICAgIGlmIChwID09IE5VTEwpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBGWF9GcmVlKHApOw0KKyAgfQ0KKyAgbV9wRGF0YS0+UmVtb3ZlQWxsKCk7DQorICBtX2lDaHVua0NvdW50ID0gMDsNCisgIG1faUJsb2NrQ291bnQgPSAwOw0KK30NCitDRlhfQmFzZU1hc3NBcnJheTo6Q0ZYX0Jhc2VNYXNzQXJyYXkoaW50MzJfdCBpQ2h1bmtTaXplLCBpbnQzMl90IGlCbG9ja1NpemUpIHsNCisgIG1fcERhdGEgPSBuZXcgQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAoaUNodW5rU2l6ZSwgaUJsb2NrU2l6ZSk7DQorfQ0KK0NGWF9CYXNlTWFzc0FycmF5Ojp+Q0ZYX0Jhc2VNYXNzQXJyYXkoKSB7DQorICBkZWxldGUgbV9wRGF0YTsNCit9DQoraW50MzJfdCBDRlhfQmFzZU1hc3NBcnJheTo6R2V0U2l6ZSgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BEYXRhLT5tX2lCbG9ja0NvdW50Ow0KK30NCit1aW50OF90KiBDRlhfQmFzZU1hc3NBcnJheTo6QWRkU3BhY2VUbyhpbnQzMl90IGluZGV4KSB7DQorICByZXR1cm4gbV9wRGF0YS0+QWRkU3BhY2VUbyhpbmRleCk7DQorfQ0KK3VpbnQ4X3QqIENGWF9CYXNlTWFzc0FycmF5OjpHZXRBdChpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICByZXR1cm4gbV9wRGF0YS0+R2V0QXQoaW5kZXgpOw0KK30NCitpbnQzMl90IENGWF9CYXNlTWFzc0FycmF5OjpBcHBlbmQoY29uc3QgQ0ZYX0Jhc2VNYXNzQXJyYXkmIHNyYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50KSB7DQorICByZXR1cm4gbV9wRGF0YS0+QXBwZW5kKCooQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAqKXNyYy5tX3BEYXRhLCBpU3RhcnQsIGlDb3VudCk7DQorfQ0KK2ludDMyX3QgQ0ZYX0Jhc2VNYXNzQXJyYXk6OkNvcHkoY29uc3QgQ0ZYX0Jhc2VNYXNzQXJyYXkmIHNyYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQpIHsNCisgIHJldHVybiBtX3BEYXRhLT5Db3B5KCooQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAqKXNyYy5tX3BEYXRhLCBpU3RhcnQsIGlDb3VudCk7DQorfQ0KK2ludDMyX3QgQ0ZYX0Jhc2VNYXNzQXJyYXk6OlJlbW92ZUxhc3QoaW50MzJfdCBpQ291bnQpIHsNCisgIHJldHVybiBtX3BEYXRhLT5SZW1vdmVMYXN0KGlDb3VudCk7DQorfQ0KK3ZvaWQgQ0ZYX0Jhc2VNYXNzQXJyYXk6OlJlbW92ZUFsbChGWF9CT09MIGJMZWF2ZU1lbW9yeSkgew0KKyAgbV9wRGF0YS0+UmVtb3ZlQWxsKGJMZWF2ZU1lbW9yeSk7DQorfQ0KK3R5cGVkZWYgc3RydWN0IF9GWF9CQVNFRElTQ1JFVEVBUlJBWURBVEEgew0KKyAgaW50MzJfdCBpQmxvY2tTaXplOw0KKyAgaW50MzJfdCBpQ2h1bmtTaXplOw0KKyAgaW50MzJfdCBpQ2h1bmtDb3VudDsNCisgIENGWF9QdHJBcnJheSBDaHVua0J1ZmZlcjsNCit9IEZYX0JBU0VESVNDUkVURUFSUkFZREFUQSwgKkZYX0xQQkFTRURJU0NSRVRFQVJSQVlEQVRBOw0KK3R5cGVkZWYgRlhfQkFTRURJU0NSRVRFQVJSQVlEQVRBIGNvbnN0KiBGWF9MUENCQVNFRElTQ1JFVEVBUlJBWURBVEE7DQorQ0ZYX0Jhc2VEaXNjcmV0ZUFycmF5OjpDRlhfQmFzZURpc2NyZXRlQXJyYXkoaW50MzJfdCBpQ2h1bmtTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJsb2NrU2l6ZSkgew0KKyAgRlhTWVNfYXNzZXJ0KGlDaHVua1NpemUgPiAwICYmIGlCbG9ja1NpemUgPiAwKTsNCisgIEZYX0xQQkFTRURJU0NSRVRFQVJSQVlEQVRBIHBEYXRhOw0KKyAgbV9wRGF0YSA9IHBEYXRhID0gbmV3IEZYX0JBU0VESVNDUkVURUFSUkFZREFUQTsNCisgIHBEYXRhLT5DaHVua0J1ZmZlci5TZXRTaXplKDE2KTsNCisgIHBEYXRhLT5pQ2h1bmtDb3VudCA9IDA7DQorICBwRGF0YS0+aUNodW5rU2l6ZSA9IGlDaHVua1NpemU7DQorICBwRGF0YS0+aUJsb2NrU2l6ZSA9IGlCbG9ja1NpemU7DQorfQ0KK0NGWF9CYXNlRGlzY3JldGVBcnJheTo6fkNGWF9CYXNlRGlzY3JldGVBcnJheSgpIHsNCisgIFJlbW92ZUFsbCgpOw0KKyAgZGVsZXRlIChGWF9MUEJBU0VESVNDUkVURUFSUkFZREFUQSkgbV9wRGF0YTsNCit9DQordWludDhfdCogQ0ZYX0Jhc2VEaXNjcmV0ZUFycmF5OjpBZGRTcGFjZVRvKGludDMyX3QgaW5kZXgpIHsNCisgIEZYU1lTX2Fzc2VydChpbmRleCA+IC0xKTsNCisgIEZYX0xQQkFTRURJU0NSRVRFQVJSQVlEQVRBIHBEYXRhID0gKEZYX0xQQkFTRURJU0NSRVRFQVJSQVlEQVRBKW1fcERhdGE7DQorICBpbnQzMl90JiBpQ2h1bmtDb3VudCA9IHBEYXRhLT5pQ2h1bmtDb3VudDsNCisgIGludDMyX3QgaUNodW5rU2l6ZSA9IHBEYXRhLT5pQ2h1bmtTaXplOw0KKyAgdWludDhfdCogcENodW5rID0gTlVMTDsNCisgIGludDMyX3QgaUNodW5rID0gaW5kZXggLyBpQ2h1bmtTaXplOw0KKyAgaWYgKGlDaHVuayA8IGlDaHVua0NvdW50KSB7DQorICAgIHBDaHVuayA9ICh1aW50OF90KilwRGF0YS0+Q2h1bmtCdWZmZXIuR2V0QXQoaUNodW5rKTsNCisgIH0NCisgIGlmICghcENodW5rKSB7DQorICAgIHBDaHVuayA9IEZYX0FsbG9jMkQodWludDhfdCwgaUNodW5rU2l6ZSwgcERhdGEtPmlCbG9ja1NpemUpOw0KKyAgICBGWFNZU19tZW1zZXQocENodW5rLCAwLCBpQ2h1bmtTaXplICogcERhdGEtPmlCbG9ja1NpemUpOw0KKyAgICBwRGF0YS0+Q2h1bmtCdWZmZXIuU2V0QXRHcm93KGlDaHVuaywgcENodW5rKTsNCisgICAgaWYgKGlDaHVua0NvdW50IDw9IGlDaHVuaykgew0KKyAgICAgIGlDaHVua0NvdW50ID0gaUNodW5rICsgMTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHBDaHVuayArIChpbmRleCAlIGlDaHVua1NpemUpICogcERhdGEtPmlCbG9ja1NpemU7DQorfQ0KK3VpbnQ4X3QqIENGWF9CYXNlRGlzY3JldGVBcnJheTo6R2V0QXQoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgRlhTWVNfYXNzZXJ0KGluZGV4ID4gLTEpOw0KKyAgRlhfTFBCQVNFRElTQ1JFVEVBUlJBWURBVEEgcERhdGEgPSAoRlhfTFBCQVNFRElTQ1JFVEVBUlJBWURBVEEpbV9wRGF0YTsNCisgIGludDMyX3QgaUNodW5rU2l6ZSA9IHBEYXRhLT5pQ2h1bmtTaXplOw0KKyAgaW50MzJfdCBpQ2h1bmsgPSBpbmRleCAvIGlDaHVua1NpemU7DQorICBpZiAoaUNodW5rID49IHBEYXRhLT5pQ2h1bmtDb3VudCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHVpbnQ4X3QqIHBDaHVuayA9ICh1aW50OF90KilwRGF0YS0+Q2h1bmtCdWZmZXIuR2V0QXQoaUNodW5rKTsNCisgIGlmIChwQ2h1bmsgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBwQ2h1bmsgKyAoaW5kZXggJSBpQ2h1bmtTaXplKSAqIHBEYXRhLT5pQmxvY2tTaXplOw0KK30NCit2b2lkIENGWF9CYXNlRGlzY3JldGVBcnJheTo6UmVtb3ZlQWxsKCkgew0KKyAgRlhfTFBCQVNFRElTQ1JFVEVBUlJBWURBVEEgcERhdGEgPSAoRlhfTFBCQVNFRElTQ1JFVEVBUlJBWURBVEEpbV9wRGF0YTsNCisgIENGWF9QdHJBcnJheSYgQ2h1bmtCdWZmZXIgPSBwRGF0YS0+Q2h1bmtCdWZmZXI7DQorICBpbnQzMl90JiBpQ2h1bmtDb3VudCA9IHBEYXRhLT5pQ2h1bmtDb3VudDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDaHVua0NvdW50OyBpKyspIHsNCisgICAgdm9pZCogcCA9IENodW5rQnVmZmVyLkdldEF0KGkpOw0KKyAgICBpZiAocCA9PSBOVUxMKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgRlhfRnJlZShwKTsNCisgIH0NCisgIENodW5rQnVmZmVyLlJlbW92ZUFsbCgpOw0KKyAgaUNodW5rQ291bnQgPSAwOw0KK30NCitDRlhfQmFzZVN0YWNrOjpDRlhfQmFzZVN0YWNrKGludDMyX3QgaUNodW5rU2l6ZSwgaW50MzJfdCBpQmxvY2tTaXplKSB7DQorICBtX3BEYXRhID0gbmV3IENGWF9CYXNlTWFzc0FycmF5SW1wKGlDaHVua1NpemUsIGlCbG9ja1NpemUpOw0KK30NCitDRlhfQmFzZVN0YWNrOjp+Q0ZYX0Jhc2VTdGFjaygpIHsNCisgIGRlbGV0ZSAoQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAqKW1fcERhdGE7DQorfQ0KK3VpbnQ4X3QqIENGWF9CYXNlU3RhY2s6OlB1c2goKSB7DQorICByZXR1cm4gbV9wRGF0YS0+QWRkU3BhY2UoKTsNCit9DQordm9pZCBDRlhfQmFzZVN0YWNrOjpQb3AoKSB7DQorICBpbnQzMl90JiBpQmxvY2tDb3VudCA9IG1fcERhdGEtPm1faUJsb2NrQ291bnQ7DQorICBpZiAoaUJsb2NrQ291bnQgPCAxKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlCbG9ja0NvdW50LS07DQorfQ0KK3VpbnQ4X3QqIENGWF9CYXNlU3RhY2s6OkdldFRvcEVsZW1lbnQoKSBjb25zdCB7DQorICBpbnQzMl90IGlTaXplID0gbV9wRGF0YS0+bV9pQmxvY2tDb3VudDsNCisgIGlmIChpU2l6ZSA8IDEpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gbV9wRGF0YS0+R2V0QXQoaVNpemUgLSAxKTsNCit9DQoraW50MzJfdCBDRlhfQmFzZVN0YWNrOjpHZXRTaXplKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fcERhdGEtPm1faUJsb2NrQ291bnQ7DQorfQ0KK3VpbnQ4X3QqIENGWF9CYXNlU3RhY2s6OkdldEF0KGludDMyX3QgaW5kZXgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BEYXRhLT5HZXRBdChpbmRleCk7DQorfQ0KK3ZvaWQgQ0ZYX0Jhc2VTdGFjazo6UmVtb3ZlQWxsKEZYX0JPT0wgYkxlYXZlTWVtb3J5KSB7DQorICBtX3BEYXRhLT5SZW1vdmVBbGwoYkxlYXZlTWVtb3J5KTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9jcnQvZnhfdXRpbHMuaCBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlZTQzZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvY3J0L2Z4X3V0aWxzLmgKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWF9VVElMU19JTVANCisjZGVmaW5lIF9GWF9VVElMU19JTVANCitjbGFzcyBDRlhfQmFzZU1hc3NBcnJheUltcCA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAoaW50MzJfdCBpQ2h1bmtTaXplLCBpbnQzMl90IGlCbG9ja1NpemUpOw0KKyAgfkNGWF9CYXNlTWFzc0FycmF5SW1wKCk7DQorICB1aW50OF90KiBBZGRTcGFjZSgpIHsgcmV0dXJuIEFkZFNwYWNlVG8obV9pQmxvY2tDb3VudCk7IH0NCisgIHVpbnQ4X3QqIEFkZFNwYWNlVG8oaW50MzJfdCBpbmRleCk7DQorICB1aW50OF90KiBHZXRBdChpbnQzMl90IGluZGV4KSBjb25zdDsNCisgIGludDMyX3QgQXBwZW5kKGNvbnN0IENGWF9CYXNlTWFzc0FycmF5SW1wJiBzcmMsDQorICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCA9IDAsDQorICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCA9IC0xKTsNCisgIGludDMyX3QgQ29weShjb25zdCBDRlhfQmFzZU1hc3NBcnJheUltcCYgc3JjLA0KKyAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0ID0gMCwNCisgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCA9IC0xKTsNCisgIGludDMyX3QgUmVtb3ZlTGFzdChpbnQzMl90IGlDb3VudCA9IC0xKTsNCisgIHZvaWQgUmVtb3ZlQWxsKEZYX0JPT0wgYkxlYXZlTWVtb3J5ID0gRkFMU0UpOw0KKyAgaW50MzJfdCBtX2lDaHVua1NpemU7DQorICBpbnQzMl90IG1faUJsb2NrU2l6ZTsNCisgIGludDMyX3QgbV9pQ2h1bmtDb3VudDsNCisgIGludDMyX3QgbV9pQmxvY2tDb3VudDsNCisgIENGWF9QdHJBcnJheSogbV9wRGF0YTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBBcHBlbmQoaW50MzJfdCBpRHN0U3RhcnQsDQorICAgICAgICAgICAgICBjb25zdCBDRlhfQmFzZU1hc3NBcnJheUltcCYgc3JjLA0KKyAgICAgICAgICAgICAgaW50MzJfdCBpU3JjU3RhcnQgPSAwLA0KKyAgICAgICAgICAgICAgaW50MzJfdCBpU3JjQ291bnQgPSAtMSk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2ZnYXNfYmFzZS5oIGIveGZhL3NyYy9mZ2FzL3NyYy9mZ2FzX2Jhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWEzYjZjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9mZ2FzX2Jhc2UuaApAQCAtMCwwICsxLDE0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKy8vIFRPRE8odGhlc3RpZyk6IFJlbW92ZSB0aGlzIGZpbGUgYW5kIGRvIElXWVUuDQorDQorI2lmbmRlZiBfRlhNQVRIX0JBU0VfDQorI2RlZmluZSBfRlhNQVRIX0JBU0VfDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZnJlZXR5cGUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9mZ2FzL2luY2x1ZGUvZmdhcy5oIg0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9mb250dXRpbHMuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2ZvbnR1dGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU3ZTA1OQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9mb250dXRpbHMuY3BwCkBAIC0wLDAgKzEsMTQ5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZnYXMvc3JjL2ZnYXNfYmFzZS5oIg0KKyNpbmNsdWRlICJmeF9mb250dXRpbHMuaCINCitGWF9EV09SRCBGR0FTX0dldEZvbnRIYXNoQ29kZShGWF9XT1JEIHdDb2RlUGFnZSwgRlhfRFdPUkQgZHdGb250U3R5bGVzKSB7DQorICBGWF9EV09SRCBkd0hhc2ggPSB3Q29kZVBhZ2U7DQorICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0ZpeGVkUGl0Y2gpIHsNCisgICAgZHdIYXNoIHw9IDB4MDAwMTAwMDA7DQorICB9DQorICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX1NlcmlmKSB7DQorICAgIGR3SGFzaCB8PSAweDAwMDIwMDAwOw0KKyAgfQ0KKyAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TeW1ib2xpYykgew0KKyAgICBkd0hhc2ggfD0gMHgwMDA0MDAwMDsNCisgIH0NCisgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU2NyaXB0KSB7DQorICAgIGR3SGFzaCB8PSAweDAwMDgwMDAwOw0KKyAgfQ0KKyAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9JdGFsaWMpIHsNCisgICAgZHdIYXNoIHw9IDB4MDAxMDAwMDA7DQorICB9DQorICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0JvbGQpIHsNCisgICAgZHdIYXNoIHw9IDB4MDAyMDAwMDA7DQorICB9DQorICByZXR1cm4gZHdIYXNoOw0KK30NCitGWF9EV09SRCBGR0FTX0dldEZvbnRGYW1pbHlIYXNoKGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzRm9udChwc3pGb250RmFtaWx5KTsNCisgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfQm9sZCkgew0KKyAgICB3c0ZvbnQgKz0gTCJCb2xkIjsNCisgIH0NCisgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfSXRhbGljKSB7DQorICAgIHdzRm9udCArPSBMIkl0YWxpYyI7DQorICB9DQorICB3c0ZvbnQgKz0gd0NvZGVQYWdlOw0KKyAgcmV0dXJuIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKChjb25zdCBGWF9XQ0hBUiopd3NGb250LCB3c0ZvbnQuR2V0TGVuZ3RoKCkpOw0KK30NCitzdGF0aWMgY29uc3QgRkdBU19GT05UVVNCIGdfRlhHZGlGb250VVNCVGFibGVbXSA9IHsNCisgICAgezB4MDAwMCwgMHgwMDdGLCAwLCAxMjUyfSwgICAgIHsweDAwODAsIDB4MDBGRiwgMSwgMTI1Mn0sDQorICAgIHsweDAxMDAsIDB4MDE3RiwgMiwgMTI1MH0sICAgICB7MHgwMTgwLCAweDAyNEYsIDMsIDEyNTB9LA0KKyAgICB7MHgwMjUwLCAweDAyQUYsIDQsIDB4RkZGRn0sICAgezB4MDJCMCwgMHgwMkZGLCA1LCAweEZGRkZ9LA0KKyAgICB7MHgwMzAwLCAweDAzNkYsIDYsIDB4RkZGRn0sICAgezB4MDM3MCwgMHgwM0ZGLCA3LCAxMjUzfSwNCisgICAgezB4MDQwMCwgMHgwNEZGLCA5LCAxMjUxfSwgICAgIHsweDA1MDAsIDB4MDUyRiwgOSwgMHhGRkZGfSwNCisgICAgezB4MDUzMCwgMHgwNThGLCAxMCwgMHhGRkZGfSwgIHsweDA1OTAsIDB4MDVGRiwgMTEsIDEyNTV9LA0KKyAgICB7MHgwNjAwLCAweDA2RkYsIDEzLCAxMjU2fSwgICAgezB4MDcwMCwgMHgwNzRGLCA3MSwgMHhGRkZGfSwNCisgICAgezB4MDc1MCwgMHgwNzdGLCAxMywgMHhGRkZGfSwgIHsweDA3ODAsIDB4MDdCRiwgNzIsIDB4RkZGRn0sDQorICAgIHsweDA3QzAsIDB4MDdGRiwgMTQsIDB4RkZGRn0sICB7MHgwODAwLCAweDA4RkYsIDk5OSwgMHhGRkZGfSwNCisgICAgezB4MDkwMCwgMHgwOTdGLCAxNSwgMHhGRkZGfSwgIHsweDA5ODAsIDB4MDlGRiwgMTYsIDB4RkZGRn0sDQorICAgIHsweDBBMDAsIDB4MEE3RiwgMTcsIDB4RkZGRn0sICB7MHgwQTgwLCAweDBBRkYsIDE4LCAweEZGRkZ9LA0KKyAgICB7MHgwQjAwLCAweDBCN0YsIDE5LCAweEZGRkZ9LCAgezB4MEI4MCwgMHgwQkZGLCAyMCwgMHhGRkZGfSwNCisgICAgezB4MEMwMCwgMHgwQzdGLCAyMSwgMHhGRkZGfSwgIHsweDBDODAsIDB4MENGRiwgMjIsIDB4RkZGRn0sDQorICAgIHsweDBEMDAsIDB4MEQ3RiwgMjMsIDB4RkZGRn0sICB7MHgwRDgwLCAweDBERkYsIDczLCAweEZGRkZ9LA0KKyAgICB7MHgwRTAwLCAweDBFN0YsIDI0LCA4NzR9LCAgICAgezB4MEU4MCwgMHgwRUZGLCAyNSwgMHhGRkZGfSwNCisgICAgezB4MEYwMCwgMHgwRkZGLCA3MCwgMHhGRkZGfSwgIHsweDEwMDAsIDB4MTA5RiwgNzQsIDB4RkZGRn0sDQorICAgIHsweDEwQTAsIDB4MTBGRiwgMjYsIDB4RkZGRn0sICB7MHgxMTAwLCAweDExRkYsIDI4LCAweEZGRkZ9LA0KKyAgICB7MHgxMjAwLCAweDEzN0YsIDc1LCAweEZGRkZ9LCAgezB4MTM4MCwgMHgxMzlGLCA3NSwgMHhGRkZGfSwNCisgICAgezB4MTNBMCwgMHgxM0ZGLCA3NiwgMHhGRkZGfSwgIHsweDE0MDAsIDB4MTY3RiwgNzcsIDB4RkZGRn0sDQorICAgIHsweDE2ODAsIDB4MTY5RiwgNzgsIDB4RkZGRn0sICB7MHgxNkEwLCAweDE2RkYsIDc5LCAweEZGRkZ9LA0KKyAgICB7MHgxNzAwLCAweDE3MUYsIDg0LCAweEZGRkZ9LCAgezB4MTcyMCwgMHgxNzNGLCA4NCwgMHhGRkZGfSwNCisgICAgezB4MTc0MCwgMHgxNzVGLCA4NCwgMHhGRkZGfSwgIHsweDE3NjAsIDB4MTc3RiwgODQsIDB4RkZGRn0sDQorICAgIHsweDE3ODAsIDB4MTdGRiwgODAsIDB4RkZGRn0sICB7MHgxODAwLCAweDE4QUYsIDgxLCAweEZGRkZ9LA0KKyAgICB7MHgxOEIwLCAweDE4RkYsIDk5OSwgMHhGRkZGfSwgezB4MTkwMCwgMHgxOTRGLCA5MywgMHhGRkZGfSwNCisgICAgezB4MTk1MCwgMHgxOTdGLCA5NCwgMHhGRkZGfSwgIHsweDE5ODAsIDB4MTlERiwgOTUsIDB4RkZGRn0sDQorICAgIHsweDE5RTAsIDB4MTlGRiwgODAsIDB4RkZGRn0sICB7MHgxQTAwLCAweDFBMUYsIDk2LCAweEZGRkZ9LA0KKyAgICB7MHgxQTIwLCAweDFBRkYsIDk5OSwgMHhGRkZGfSwgezB4MUIwMCwgMHgxQjdGLCAyNywgMHhGRkZGfSwNCisgICAgezB4MUI4MCwgMHgxQkJGLCAxMTIsIDB4RkZGRn0sIHsweDFCQzAsIDB4MUJGRiwgOTk5LCAweEZGRkZ9LA0KKyAgICB7MHgxQzAwLCAweDFDNEYsIDExMywgMHhGRkZGfSwgezB4MUM1MCwgMHgxQzdGLCAxMTQsIDB4RkZGRn0sDQorICAgIHsweDFDODAsIDB4MUNGRiwgOTk5LCAweEZGRkZ9LCB7MHgxRDAwLCAweDFEN0YsIDQsIDB4RkZGRn0sDQorICAgIHsweDFEODAsIDB4MURCRiwgNCwgMHhGRkZGfSwgICB7MHgxREMwLCAweDFERkYsIDYsIDB4RkZGRn0sDQorICAgIHsweDFFMDAsIDB4MUVGRiwgMjksIDB4RkZGRn0sICB7MHgxRjAwLCAweDFGRkYsIDMwLCAweEZGRkZ9LA0KKyAgICB7MHgyMDAwLCAweDIwNkYsIDMxLCAweEZGRkZ9LCAgezB4MjA3MCwgMHgyMDlGLCAzMiwgMHhGRkZGfSwNCisgICAgezB4MjBBMCwgMHgyMENGLCAzMywgMHhGRkZGfSwgIHsweDIwRDAsIDB4MjBGRiwgMzQsIDB4RkZGRn0sDQorICAgIHsweDIxMDAsIDB4MjE0RiwgMzUsIDB4RkZGRn0sICB7MHgyMTUwLCAweDIxNUYsIDM2LCAweEZGRkZ9LA0KKyAgICB7MHgyMTYwLCAweDIxNkIsIDM2LCA5MzZ9LCAgICAgezB4MjE2QywgMHgyMTZGLCAzNiwgMHhGRkZGfSwNCisgICAgezB4MjE3MCwgMHgyMTc5LCAzNiwgOTM2fSwgICAgIHsweDIxN0EsIDB4MjE4RiwgMzYsIDB4RkZGRn0sDQorICAgIHsweDIxOTAsIDB4MjE5OSwgMzcsIDk0OX0sICAgICB7MHgyMTlBLCAweDIxRkYsIDM3LCAweEZGRkZ9LA0KKyAgICB7MHgyMjAwLCAweDIyRkYsIDM4LCAweEZGRkZ9LCAgezB4MjMwMCwgMHgyM0ZGLCAzOSwgMHhGRkZGfSwNCisgICAgezB4MjQwMCwgMHgyNDNGLCA0MCwgMHhGRkZGfSwgIHsweDI0NDAsIDB4MjQ1RiwgNDEsIDB4RkZGRn0sDQorICAgIHsweDI0NjAsIDB4MjQ3MywgNDIsIDkzMn0sICAgICB7MHgyNDc0LCAweDI0OUIsIDQyLCA5MzZ9LA0KKyAgICB7MHgyNDlDLCAweDI0RTksIDQyLCA5NDl9LCAgICAgezB4MjRFQSwgMHgyNEZGLCA0MiwgMHhGRkZGfSwNCisgICAgezB4MjUwMCwgMHgyNTczLCA0MywgOTM2fSwgICAgIHsweDI1NzQsIDB4MjU3RiwgNDMsIDB4RkZGRn0sDQorICAgIHsweDI1ODAsIDB4MjU4MCwgNDQsIDB4RkZGRn0sICB7MHgyNTgxLCAweDI1OEYsIDQ0LCA5MzZ9LA0KKyAgICB7MHgyNTkwLCAweDI1OUYsIDQ0LCAweEZGRkZ9LCAgezB4MjVBMCwgMHgyNUZGLCA0NSwgMHhGRkZGfSwNCisgICAgezB4MjYwMCwgMHgyNkZGLCA0NiwgMHhGRkZGfSwgIHsweDI3MDAsIDB4MjdCRiwgNDcsIDB4RkZGRn0sDQorICAgIHsweDI3QzAsIDB4MjdFRiwgMzgsIDB4RkZGRn0sICB7MHgyN0YwLCAweDI3RkYsIDM3LCAweEZGRkZ9LA0KKyAgICB7MHgyODAwLCAweDI4RkYsIDgyLCAweEZGRkZ9LCAgezB4MjkwMCwgMHgyOTdGLCAzNywgMHhGRkZGfSwNCisgICAgezB4Mjk4MCwgMHgyOUZGLCAzOCwgMHhGRkZGfSwgIHsweDJBMDAsIDB4MkFGRiwgMzgsIDB4RkZGRn0sDQorICAgIHsweDJCMDAsIDB4MkJGRiwgMzcsIDB4RkZGRn0sICB7MHgyQzAwLCAweDJDNUYsIDk3LCAweEZGRkZ9LA0KKyAgICB7MHgyQzYwLCAweDJDN0YsIDI5LCAweEZGRkZ9LCAgezB4MkM4MCwgMHgyQ0ZGLCA4LCAweEZGRkZ9LA0KKyAgICB7MHgyRDAwLCAweDJEMkYsIDI2LCAweEZGRkZ9LCAgezB4MkQzMCwgMHgyRDdGLCA5OCwgMHhGRkZGfSwNCisgICAgezB4MkQ4MCwgMHgyRERGLCA3NSwgMHhGRkZGfSwgIHsweDJERTAsIDB4MkRGRiwgOSwgMHhGRkZGfSwNCisgICAgezB4MkUwMCwgMHgyRTdGLCAzMSwgMHhGRkZGfSwgIHsweDJFODAsIDB4MkVGRiwgNTksIDB4RkZGRn0sDQorICAgIHsweDJGMDAsIDB4MkZERiwgNTksIDB4RkZGRn0sICB7MHgyRkUwLCAweDJGRUYsIDk5OSwgMHhGRkZGfSwNCisgICAgezB4MkZGMCwgMHgyRkZGLCA1OSwgMHhGRkZGfSwgIHsweDMwMDAsIDB4MzAzRiwgNDgsIDB4RkZGRn0sDQorICAgIHsweDMwNDAsIDB4MzA5RiwgNDksIDkzMn0sICAgICB7MHgzMEEwLCAweDMwRkYsIDUwLCA5MzJ9LA0KKyAgICB7MHgzMTAwLCAweDMxMjksIDUxLCA5MzZ9LCAgICAgezB4MzEyQSwgMHgzMTJGLCA1MSwgMHhGRkZGfSwNCisgICAgezB4MzEzMCwgMHgzMThGLCA1MiwgOTQ5fSwgICAgIHsweDMxOTAsIDB4MzE5RiwgNTksIDB4RkZGRn0sDQorICAgIHsweDMxQTAsIDB4MzFCRiwgNTEsIDB4RkZGRn0sICB7MHgzMUMwLCAweDMxRUYsIDYxLCAweEZGRkZ9LA0KKyAgICB7MHgzMUYwLCAweDMxRkYsIDUwLCAweEZGRkZ9LCAgezB4MzIwMCwgMHgzMjFDLCA1NCwgOTQ5fSwNCisgICAgezB4MzIxRCwgMHgzMjVGLCA1NCwgMHhGRkZGfSwgIHsweDMyNjAsIDB4MzI3RiwgNTQsIDk0OX0sDQorICAgIHsweDMyODAsIDB4MzJGRiwgNTQsIDB4RkZGRn0sICB7MHgzMzAwLCAweDMzODcsIDU1LCAweEZGRkZ9LA0KKyAgICB7MHgzMzg4LCAweDMzRDAsIDU1LCA5NDl9LCAgICAgezB4MzNEMSwgMHgzM0ZGLCA1NSwgMHhGRkZGfSwNCisgICAgezB4MzQwMCwgMHg0REJGLCA1OSwgMHhGRkZGfSwgIHsweDREQzAsIDB4NERGRiwgOTksIDB4RkZGRn0sDQorICAgIHsweDRFMDAsIDB4OUZBNSwgNTksIDkzNn0sICAgICB7MHg5RkE2LCAweDlGRkYsIDU5LCAweEZGRkZ9LA0KKyAgICB7MHhBMDAwLCAweEE0OEYsIDgzLCAweEZGRkZ9LCAgezB4QTQ5MCwgMHhBNENGLCA4MywgMHhGRkZGfSwNCisgICAgezB4QTREMCwgMHhBNEZGLCA5OTksIDB4RkZGRn0sIHsweEE1MDAsIDB4QTYzRiwgMTIsIDB4RkZGRn0sDQorICAgIHsweEE2NDAsIDB4QTY5RiwgOSwgMHhGRkZGfSwgICB7MHhBNkEwLCAweEE2RkYsIDk5OSwgMHhGRkZGfSwNCisgICAgezB4QTcwMCwgMHhBNzFGLCA1LCAweEZGRkZ9LCAgIHsweEE3MjAsIDB4QTdGRiwgMjksIDB4RkZGRn0sDQorICAgIHsweEE4MDAsIDB4QTgyRiwgMTAwLCAweEZGRkZ9LCB7MHhBODMwLCAweEE4RkYsIDk5OSwgMHhGRkZGfSwNCisgICAgezB4QTg0MCwgMHhBODdGLCA1MywgMHhGRkZGfSwgIHsweEE4ODAsIDB4QThERiwgMTE1LCAweEZGRkZ9LA0KKyAgICB7MHhBOEUwLCAweEE4RkYsIDk5OSwgMHhGRkZGfSwgezB4QTkwMCwgMHhBOTJGLCAxMTYsIDB4RkZGRn0sDQorICAgIHsweEE5MzAsIDB4QTk1RiwgMTE3LCAweEZGRkZ9LCB7MHhBOTYwLCAweEE5RkYsIDk5OSwgMHhGRkZGfSwNCisgICAgezB4QUEwMCwgMHhBQTVGLCAxMTgsIDB4RkZGRn0sIHsweEFBNjAsIDB4QUJGRiwgOTk5LCAweEZGRkZ9LA0KKyAgICB7MHhBQzAwLCAweEQ3QUYsIDU2LCA5NDl9LCAgICAgezB4RDdCMCwgMHhEN0ZGLCA5OTksIDB4RkZGRn0sDQorICAgIHsweEQ4MDAsIDB4REI3RiwgNTcsIDB4RkZGRn0sICB7MHhEQjgwLCAweERCRkYsIDU3LCAweEZGRkZ9LA0KKyAgICB7MHhEQzAwLCAweERGRkYsIDU3LCAweEZGRkZ9LCAgezB4RTAwMCwgMHhFODE0LCA2MCwgMHhGRkZGfSwNCisgICAgezB4RTgxNSwgMHhFODY0LCA2MCwgOTM2fSwgICAgIHsweEU4NjUsIDB4RjhGRiwgNjAsIDB4RkZGRn0sDQorICAgIHsweEY5MDAsIDB4RkEwQiwgNjEsIDk0OX0sICAgICB7MHhGQTBDLCAweEZBMEQsIDYxLCA5MzZ9LA0KKyAgICB7MHhGQTBFLCAweEZBMkQsIDYxLCA5MzJ9LCAgICAgezB4RkEyRSwgMHhGQUZGLCA2MSwgMHhGRkZGfSwNCisgICAgezB4RkIwMCwgMHhGQjRGLCA2MiwgMHhGRkZGfSwgIHsweEZCNTAsIDB4RkRGRiwgNjMsIDEyNTZ9LA0KKyAgICB7MHhGRTAwLCAweEZFMEYsIDkxLCAweEZGRkZ9LCAgezB4RkUxMCwgMHhGRTFGLCA2NSwgMHhGRkZGfSwNCisgICAgezB4RkUyMCwgMHhGRTJGLCA2NCwgMHhGRkZGfSwgIHsweEZFMzAsIDB4RkU0RiwgNjUsIDB4RkZGRn0sDQorICAgIHsweEZFNTAsIDB4RkU2RiwgNjYsIDB4RkZGRn0sICB7MHhGRTcwLCAweEZFRkYsIDY3LCAxMjU2fSwNCisgICAgezB4RkYwMCwgMHhGRjVGLCA2OCwgOTM2fSwgICAgIHsweEZGNjAsIDB4RkY5RiwgNjgsIDkzMn0sDQorICAgIHsweEZGQTAsIDB4RkZFRiwgNjgsIDB4RkZGRn0sDQorfTsNCitGR0FTX0xQQ0ZPTlRVU0IgRkdBU19HZXRVbmljb2RlQml0RmllbGQoRlhfV0NIQVIgd1VuaWNvZGUpIHsNCisgIGludDMyX3QgaUVuZCA9IHNpemVvZihnX0ZYR2RpRm9udFVTQlRhYmxlKSAvIHNpemVvZihGR0FTX0ZPTlRVU0IpIC0gMTsNCisgIEZYU1lTX2Fzc2VydChpRW5kID49IDApOw0KKyAgaW50MzJfdCBpU3RhcnQgPSAwLCBpTWlkOw0KKyAgZG8gew0KKyAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgY29uc3QgRkdBU19GT05UVVNCJiB1c2IgPSBnX0ZYR2RpRm9udFVTQlRhYmxlW2lNaWRdOw0KKyAgICBpZiAod1VuaWNvZGUgPCB1c2Iud1N0YXJ0VW5pY29kZSkgew0KKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgfSBlbHNlIGlmICh3VW5pY29kZSA+IHVzYi53RW5kVW5pY29kZSkgew0KKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJldHVybiAmdXNiOw0KKyAgICB9DQorICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICByZXR1cm4gTlVMTDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2ZvbnR1dGlscy5oIGIveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2ZvbnR1dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZmY1NzYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfZm9udHV0aWxzLmgKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GR0FTX0ZPTlRVVElMX0hfDQorI2RlZmluZSBfRkdBU19GT05UVVRJTF9IXw0KK3R5cGVkZWYgc3RydWN0IF9GR0FTX0ZPTlRVU0Igew0KKyAgRlhfV0NIQVIgd1N0YXJ0VW5pY29kZTsNCisgIEZYX1dDSEFSIHdFbmRVbmljb2RlOw0KKyAgRlhfV09SRCB3Qml0RmllbGQ7DQorICBGWF9XT1JEIHdDb2RlUGFnZTsNCit9IEZHQVNfRk9OVFVTQiwgKkZHQVNfTFBGT05UVVNCOw0KK3R5cGVkZWYgRkdBU19GT05UVVNCIGNvbnN0KiBGR0FTX0xQQ0ZPTlRVU0I7DQorRlhfRFdPUkQgRkdBU19HZXRGb250SGFzaENvZGUoRlhfV09SRCB3Q29kZVBhZ2UsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcyk7DQorRlhfRFdPUkQgRkdBU19HZXRGb250RmFtaWx5SGFzaChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlKTsNCitGR0FTX0xQQ0ZPTlRVU0IgRkdBU19HZXRVbmljb2RlQml0RmllbGQoRlhfV0NIQVIgd1VuaWNvZGUpOw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9nZGlmb250LmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9nZGlmb250LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTkyM2I2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2dkaWZvbnQuY3BwCkBAIC0wLDAgKzEsNTM5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZnYXMvc3JjL2ZnYXNfYmFzZS5oIg0KKyNpbmNsdWRlICJmeF9nZGlmb250LmgiDQorI2luY2x1ZGUgImZ4X3N0ZGZvbnRtZ3IuaCINCisjaWZkZWYgX0ZYUExVUw0KKyNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU4zMl9NT0JJTEVfIHx8IFwNCisgICAgX0ZYX09TXyA9PSBfRlhfV0lONjRfDQorQ0ZYX0dkaUZvbnRDYWNoZTo6Q0ZYX0dkaUZvbnRDYWNoZSgpIDogbV9HbHlwaE1hcCgxMjgpIHt9DQorQ0ZYX0dkaUZvbnRDYWNoZTo6fkNGWF9HZGlGb250Q2FjaGUoKSB7DQorICBGWF9QT1NJVElPTiBwb3MgPSBtX0dseXBoTWFwLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIGludDMyX3QgaUdseXBoOw0KKyAgRlhfTFBHRElHT0NBQ0hFIHBHbHlwaDsNCisgIHdoaWxlIChwb3MgIT0gTlVMTCkgew0KKyAgICBwR2x5cGggPSBOVUxMOw0KKyAgICBtX0dseXBoTWFwLkdldE5leHRBc3NvYyhwb3MsICh2b2lkKiYpaUdseXBoLCAodm9pZComKXBHbHlwaCk7DQorICAgIGlmIChwR2x5cGggIT0gTlVMTCkgew0KKyAgICAgIEZYX0ZyZWUocEdseXBoLT5wT3V0bGluZSk7DQorICAgICAgRlhfRnJlZShwR2x5cGgpOw0KKyAgICB9DQorICB9DQorICBtX0dseXBoTWFwLlJlbW92ZUFsbCgpOw0KK30NCit2b2lkIENGWF9HZGlGb250Q2FjaGU6OlNldENhY2hlZEdseXBoT3V0bGluZShGWF9EV09SRCBkd0dseXBoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMWVBITUVUUklDUyYgZ20sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcE91dGxpbmUpIHsNCisgIEZYU1lTX2Fzc2VydChwT3V0bGluZSAhPSBOVUxMKTsNCisgIEZYX0xQR0RJR09DQUNIRSBwR2x5cGggPSBGWF9BbGxvYyhGWF9HRElHT0NBQ0hFLCAxKTsNCisgIHBHbHlwaC0+Z20gPSBnbTsNCisgIHBHbHlwaC0+cE91dGxpbmUgPSBwT3V0bGluZTsNCisgIG1fR2x5cGhNYXAuU2V0QXQoKHZvaWQqKWR3R2x5cGgsICh2b2lkKilwR2x5cGgpOw0KK30NCitGWF9MUENHRElHT0NBQ0hFIENGWF9HZGlGb250Q2FjaGU6OkdldENhY2hlZEdseXBoT3V0bGluZSgNCisgICAgRlhfRFdPUkQgZHdHbHlwaCkgY29uc3Qgew0KKyAgRlhfTFBDR0RJR09DQUNIRSBwR2x5cGggPSBOVUxMOw0KKyAgaWYgKCFtX0dseXBoTWFwLkxvb2t1cCgodm9pZCopZHdHbHlwaCwgKHZvaWQqJilwR2x5cGgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBwR2x5cGg7DQorfQ0KK0lGWF9Gb250KiBJRlhfRm9udDo6TG9hZEZvbnQoY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Gb250TWdyKiBwRm9udE1ncikgew0KKyAgQ0ZYX0dkaUZvbnQqIHBGb250ID0gbmV3IENGWF9HZGlGb250KHBGb250TWdyKTsNCisgIGlmICghcEZvbnQtPkxvYWRGb250KHBzekZvbnRGYW1pbHksIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKSkgew0KKyAgICBwRm9udC0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBwRm9udDsNCit9DQorSUZYX0ZvbnQqIElGWF9Gb250OjpMb2FkRm9udChjb25zdCB1aW50OF90KiBwQnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnRNZ3IqIHBGb250TWdyKSB7DQorICBDRlhfR2RpRm9udCogcEZvbnQgPSBuZXcgQ0ZYX0dkaUZvbnQocEZvbnRNZ3IpOw0KKyAgaWYgKCFwRm9udC0+TG9hZEZvbnQocEJ1ZmZlciwgaUxlbmd0aCkpIHsNCisgICAgcEZvbnQtPlJlbGVhc2UoKTsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gcEZvbnQ7DQorfQ0KK0lGWF9Gb250KiBJRlhfRm9udDo6TG9hZEZvbnQoY29uc3QgRlhfV0NIQVIqIHBzekZpbGVOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnRNZ3IqIHBGb250TWdyKSB7DQorICBDRlhfR2RpRm9udCogcEZvbnQgPSBuZXcgQ0ZYX0dkaUZvbnQocEZvbnRNZ3IpOw0KKyAgaWYgKCFwRm9udC0+TG9hZEZvbnQocHN6RmlsZU5hbWUpKSB7DQorICAgIHBGb250LT5SZWxlYXNlKCk7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIHBGb250Ow0KK30NCitJRlhfRm9udCogSUZYX0ZvbnQ6OkxvYWRGb250KElGWF9TdHJlYW0qIHBGb250U3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnRNZ3IqIHBGb250TWdyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVN0cmVhbSkgew0KKyAgQ0ZYX0dkaUZvbnQqIHBGb250ID0gbmV3IENGWF9HZGlGb250KHBGb250TWdyKTsNCisgIGlmICghcEZvbnQtPkxvYWRGb250KHBGb250U3RyZWFtKSkgew0KKyAgICBwRm9udC0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBwRm9udDsNCit9DQorSUZYX0ZvbnQqIElGWF9Gb250OjpMb2FkRm9udChDRlhfRm9udCogcEV4dEZvbnQsIElGWF9Gb250TWdyKiBwRm9udE1ncikgew0KKyAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCisgIHJldHVybiBOVUxMOw0KK30NCisjZGVmaW5lIEZYX0dESUZPTlRfRk9OVENBQ0hFU0laRSA4DQorQ0ZYX0dkaUZvbnQ6OkNGWF9HZGlGb250KElGWF9Gb250TWdyKiBwRm9udE1ncikNCisgICAgOiBtX3BGb250TWdyKHBGb250TWdyKSwNCisgICAgICBtX2lSZWZDb3VudCgxKSwNCisgICAgICBtX1dpZHRoQ2FjaGUoMTAyNCksDQorICAgICAgbV9oT2xkRm9udChOVUxMKSwNCisgICAgICBtX2hGb250KE5VTEwpLA0KKyAgICAgIG1faERDKE5VTEwpLA0KKyAgICAgIG1fd3NGb250RmlsZU5hbWUoKSwNCisgICAgICBtX0ZvbnRGYW1pbGllcygpLA0KKyAgICAgIG1faFJlcyhOVUxMKSwNCisgICAgICBtX2R3U3R5bGVzKDApLA0KKyAgICAgIG1fU3Vic3RGb250cygpLA0KKyAgICAgIG1fRm9udE1hcHBlcigxNiksDQorICAgICAgbV9Gb250Q2FjaGUoRlhfR0RJRk9OVF9GT05UQ0FDSEVTSVpFKSB7DQorICBtX2hEQyA9IDo6Q3JlYXRlQ29tcGF0aWJsZURDKE5VTEwpOw0KKyAgRlhfbWVtc2V0KCZtX0xvZ0ZvbnQsIDAsIHNpemVvZihtX0xvZ0ZvbnQpKTsNCisgIEZYU1lTX2Fzc2VydChtX2hEQyAhPSBOVUxMKTsNCit9DQorQ0ZYX0dkaUZvbnQ6On5DRlhfR2RpRm9udCgpIHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9TdWJzdEZvbnRzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIElGWF9Gb250KiBwRm9udCA9IChJRlhfRm9udCopbV9TdWJzdEZvbnRzW2ldOw0KKyAgICBwRm9udC0+UmVsZWFzZSgpOw0KKyAgfQ0KKyAgbV9TdWJzdEZvbnRzLlJlbW92ZUFsbCgpOw0KKyAgbV9Gb250TWFwcGVyLlJlbW92ZUFsbCgpOw0KKyAgaWYgKG1faEZvbnQgIT0gTlVMTCkgew0KKyAgICA6OlNlbGVjdE9iamVjdChtX2hEQywgbV9oT2xkRm9udCk7DQorICAgIDo6RGVsZXRlT2JqZWN0KG1faEZvbnQpOw0KKyAgfQ0KKyAgOjpEZWxldGVEQyhtX2hEQyk7DQorICBpZiAobV9oUmVzICE9IE5VTEwpIHsNCisgICAgaWYgKG1fd3NGb250RmlsZU5hbWUuR2V0TGVuZ3RoKCkgPiAwKSB7DQorICAgICAgOjpSZW1vdmVGb250UmVzb3VyY2VXKChjb25zdCBGWF9XQ0hBUiopbV93c0ZvbnRGaWxlTmFtZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgOjpSZW1vdmVGb250TWVtUmVzb3VyY2VFeChtX2hSZXMpOw0KKyAgICB9DQorICB9DQorICBtX1dpZHRoQ2FjaGUuUmVtb3ZlQWxsKCk7DQorICBDbGVhckNhY2hlKCk7DQorfQ0KK3ZvaWQgQ0ZYX0dkaUZvbnQ6OkNsZWFyQ2FjaGUoKSB7DQorICBpbnQzMl90IGlDb3VudCA9IG1fU3Vic3RGb250cy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBJRlhfRm9udCogcEZvbnQgPSAoSUZYX0ZvbnQqKW1fU3Vic3RGb250c1tpXTsNCisgICAgKChDRlhfR2RpRm9udCopcEZvbnQpLT5DbGVhckNhY2hlKCk7DQorICB9DQorICBGWF9QT1NJVElPTiBwb3MgPSBtX0ZvbnRDYWNoZS5HZXRTdGFydFBvc2l0aW9uKCk7DQorICBGWF9EV09SRCBkd01BVDI7DQorICBDRlhfR2RpRm9udENhY2hlKiBwQ2FjaGU7DQorICB3aGlsZSAocG9zICE9IE5VTEwpIHsNCisgICAgcENhY2hlID0gTlVMTDsNCisgICAgbV9Gb250Q2FjaGUuR2V0TmV4dEFzc29jKHBvcywgKHZvaWQqJilkd01BVDIsICh2b2lkKiYpcENhY2hlKTsNCisgICAgaWYgKHBDYWNoZSAhPSBOVUxMKSB7DQorICAgICAgZGVsZXRlIHBDYWNoZTsNCisgICAgfQ0KKyAgfQ0KKyAgbV9Gb250Q2FjaGUuUmVtb3ZlQWxsKCk7DQorfQ0KK3ZvaWQgQ0ZYX0dkaUZvbnQ6OlJlbGVhc2UoKSB7DQorICBpZiAoLS1tX2lSZWZDb3VudCA8IDEpIHsNCisgICAgaWYgKG1fcEZvbnRNZ3IgIT0gTlVMTCkgew0KKyAgICAgIG1fcEZvbnRNZ3ItPlJlbW92ZUZvbnQodGhpcyk7DQorICAgIH0NCisgICAgZGVsZXRlIHRoaXM7DQorICB9DQorfQ0KK0lGWF9Gb250KiBDRlhfR2RpRm9udDo6UmV0YWluKCkgew0KKyAgKyttX2lSZWZDb3VudDsNCisgIHJldHVybiB0aGlzOw0KK30NCitGWF9CT09MIENGWF9HZGlGb250OjpMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UpIHsNCisgIEZYU1lTX2Fzc2VydChtX2hGb250ID09IE5VTEwpOw0KKyAgTE9HRk9OVFcgbGY7DQorICBGWF9tZW1zZXQoJmxmLCAwLCBzaXplb2YobGYpKTsNCisgIGxmLmxmSGVpZ2h0ID0gLTEwMDA7DQorICBsZi5sZldlaWdodCA9IChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfQm9sZCkgPyBGV19CT0xEIDogRldfTk9STUFMOw0KKyAgbGYubGZJdGFsaWMgPSAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0l0YWxpYykgIT0gMDsNCisgIGxmLmxmUGl0Y2hBbmRGYW1pbHkgPQ0KKyAgICAgIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfRml4ZWRQaXRjaCkgPyBGSVhFRF9QSVRDSCA6IFZBUklBQkxFX1BJVENIOw0KKyAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TZXJpZikgew0KKyAgICBsZi5sZlBpdGNoQW5kRmFtaWx5IHw9IEZGX1JPTUFOOw0KKyAgfQ0KKyAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TY3JpcHQpIHsNCisgICAgbGYubGZQaXRjaEFuZEZhbWlseSB8PSBGRl9TQ1JJUFQ7DQorICB9DQorICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX1N5bWJvbGljKSB7DQorICAgIGxmLmxmQ2hhclNldCA9IFNZTUJPTF9DSEFSU0VUOw0KKyAgfSBlbHNlIHsNCisgICAgRlhfV09SRCB3Q2hhclNldCA9IEZYX0dldENoYXJzZXRGcm9tQ29kZVBhZ2Uod0NvZGVQYWdlKTsNCisgICAgbGYubGZDaGFyU2V0ID0gd0NoYXJTZXQgIT0gMHhGRkZGID8gKHVpbnQ4X3Qpd0NoYXJTZXQgOiBERUZBVUxUX0NIQVJTRVQ7DQorICB9DQorICBpZiAocHN6Rm9udEZhbWlseSA9PSBOVUxMKSB7DQorICAgIGxmLmxmRmFjZU5hbWVbMF0gPSBMJ1wwJzsNCisgIH0gZWxzZSB7DQorICAgIEZYU1lTX3djc25jcHkobGYubGZGYWNlTmFtZSwgcHN6Rm9udEZhbWlseSwgMzEpOw0KKyAgfQ0KKyAgcmV0dXJuIExvYWRGb250KGxmKTsNCit9DQorRlhfQk9PTCBDRlhfR2RpRm9udDo6TG9hZEZvbnQoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpTGVuZ3RoKSB7DQorICBGWFNZU19hc3NlcnQobV9oRm9udCA9PSBOVUxMICYmIHBCdWZmZXIgIT0gTlVMTCAmJiBpTGVuZ3RoID4gMCk7DQorICBHZGlwbHVzOjpQcml2YXRlRm9udENvbGxlY3Rpb24gcGZjOw0KKyAgaWYgKHBmYy5BZGRNZW1vcnlGb250KHBCdWZmZXIsIGlMZW5ndGgpICE9IEdkaXBsdXM6Ok9rKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChHZXRGb250RmFtaWxpZXMocGZjKSA8IDEpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRlhfRFdPUkQgZHdDb3VudCA9IDA7DQorICBtX2hSZXMgPSA6OkFkZEZvbnRNZW1SZXNvdXJjZUV4KCh2b2lkKilwQnVmZmVyLCBpTGVuZ3RoLCAwLCAmZHdDb3VudCk7DQorICBpZiAobV9oUmVzID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGYW1pbHkgPSBtX0ZvbnRGYW1pbGllc1swXTsNCisgIG1faEZvbnQgPQ0KKyAgICAgIDo6Q3JlYXRlRm9udFcoLTEwMDAsIDAsIDAsIDAsIEZXX05PUk1BTCwgRkFMU0UsIDAsIDAsIERFRkFVTFRfQ0hBUlNFVCwgMCwNCisgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIChjb25zdCBGWF9XQ0hBUiopd3NGYW1pbHkpOw0KKyAgaWYgKG1faEZvbnQgPT0gTlVMTCkgew0KKyAgICA6OlJlbW92ZUZvbnRNZW1SZXNvdXJjZUV4KG1faFJlcyk7DQorICAgIG1faFJlcyA9IE5VTEw7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIFJldHJpZXZlRm9udFN0eWxlcygpOw0KKyAgbV9oT2xkRm9udCA9IDo6U2VsZWN0T2JqZWN0KG1faERDLCBtX2hGb250KTsNCisgIDo6R2V0T3V0bGluZVRleHRNZXRyaWNzVyhtX2hEQywgc2l6ZW9mKG1fT3V0bGluZVRNKSwgJm1fT3V0bGluZVRNKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9HZGlGb250OjpMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6RmlsZU5hbWUpIHsNCisgIEZYU1lTX2Fzc2VydChtX2hGb250ID09IE5VTEwgJiYgcHN6RmlsZU5hbWUgIT0gTlVMTCk7DQorICBHZGlwbHVzOjpQcml2YXRlRm9udENvbGxlY3Rpb24gcGZjOw0KKyAgaWYgKHBmYy5BZGRGb250RmlsZShwc3pGaWxlTmFtZSkgIT0gR2RpcGx1czo6T2spIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKEdldEZvbnRGYW1pbGllcyhwZmMpIDwgMSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX3dzRm9udEZpbGVOYW1lID0gcHN6RmlsZU5hbWU7DQorICBtX2hSZXMgPSAoSEFORExFKTo6QWRkRm9udFJlc291cmNlVyhwc3pGaWxlTmFtZSk7DQorICBpZiAobV9oUmVzID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGYW1pbHkgPSBtX0ZvbnRGYW1pbGllc1swXTsNCisgIG1faEZvbnQgPQ0KKyAgICAgIDo6Q3JlYXRlRm9udFcoLTEwMDAsIDAsIDAsIDAsIEZXX05PUk1BTCwgRkFMU0UsIDAsIDAsIERFRkFVTFRfQ0hBUlNFVCwgMCwNCisgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIChjb25zdCBGWF9XQ0hBUiopd3NGYW1pbHkpOw0KKyAgaWYgKG1faEZvbnQgPT0gTlVMTCkgew0KKyAgICA6OlJlbW92ZUZvbnRSZXNvdXJjZVcocHN6RmlsZU5hbWUpOw0KKyAgICBtX2hSZXMgPSBOVUxMOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBSZXRyaWV2ZUZvbnRTdHlsZXMoKTsNCisgIDo6U2VsZWN0T2JqZWN0KG1faERDLCBtX2hGb250KTsNCisgIDo6R2V0T3V0bGluZVRleHRNZXRyaWNzVyhtX2hEQywgc2l6ZW9mKG1fT3V0bGluZVRNKSwgJm1fT3V0bGluZVRNKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9HZGlGb250OjpMb2FkRm9udChJRlhfU3RyZWFtKiBwRm9udFN0cmVhbSkgew0KKyAgRlhTWVNfYXNzZXJ0KG1faEZvbnQgPT0gTlVMTCAmJiBwRm9udFN0cmVhbSAhPSBOVUxMKTsNCisgIGludDMyX3QgaUxlbmd0aCA9IHBGb250U3RyZWFtLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoIDwgMSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB1aW50OF90KiBwQnVmID0gRlhfQWxsb2ModWludDhfdCwgaUxlbmd0aCk7DQorICBpTGVuZ3RoID0gcEZvbnRTdHJlYW0tPlJlYWREYXRhKHBCdWYsIGlMZW5ndGgpOw0KKyAgRlhfQk9PTCBiUmV0ID0gTG9hZEZvbnQocEJ1ZiwgaUxlbmd0aCk7DQorICBGWF9GcmVlKHBCdWYpOw0KKyAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0dkaUZvbnQ6OkxvYWRGb250KGNvbnN0IExPR0ZPTlRXJiBsZikgew0KKyAgRlhTWVNfYXNzZXJ0KG1faEZvbnQgPT0gTlVMTCk7DQorICBtX2hGb250ID0gOjpDcmVhdGVGb250SW5kaXJlY3RXKChMUExPR0ZPTlRXKSZsZik7DQorICBpZiAobV9oRm9udCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIFJldHJpZXZlRm9udFN0eWxlcygpOw0KKyAgOjpTZWxlY3RPYmplY3QobV9oREMsIG1faEZvbnQpOw0KKyAgOjpHZXRPdXRsaW5lVGV4dE1ldHJpY3NXKG1faERDLCBzaXplb2YobV9PdXRsaW5lVE0pLCAmbV9PdXRsaW5lVE0pOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK2ludDMyX3QgQ0ZYX0dkaUZvbnQ6OkdldEZvbnRGYW1pbGllcyhHZGlwbHVzOjpGb250Q29sbGVjdGlvbiYgZmMpIHsNCisgIGludDMyX3QgaUNvdW50ID0gZmMuR2V0RmFtaWx5Q291bnQoKTsNCisgIGlmIChpQ291bnQgPCAxKSB7DQorICAgIHJldHVybiBpQ291bnQ7DQorICB9DQorICBHZGlwbHVzOjpGb250RmFtaWx5KiBwRm9udEZhbWlsaWVzID0gRlhfQWxsb2MoR2RpcGx1czo6Rm9udEZhbWlseSwgaUNvdW50KTsNCisgIGludDMyX3QgaUZpbmQgPSAwOw0KKyAgZmMuR2V0RmFtaWxpZXMoaUNvdW50LCBwRm9udEZhbWlsaWVzLCAmaUZpbmQpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGYW1pbHlOYW1lOw0KKyAgICBGWF9XQ0hBUiogcE5hbWUgPSB3c0ZhbWlseU5hbWUuR2V0QnVmZmVyKExGX0ZBQ0VTSVpFKTsNCisgICAgcEZvbnRGYW1pbGllc1tpXS5HZXRGYW1pbHlOYW1lKHBOYW1lKTsNCisgICAgd3NGYW1pbHlOYW1lLlJlbGVhc2VCdWZmZXIoKTsNCisgICAgbV9Gb250RmFtaWxpZXMuQWRkKHdzRmFtaWx5TmFtZSk7DQorICB9DQorICBGWF9GcmVlKHBGb250RmFtaWxpZXMpOw0KKyAgcmV0dXJuIGlDb3VudDsNCit9DQordm9pZCBDRlhfR2RpRm9udDo6UmV0cmlldmVGb250U3R5bGVzKCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1faEZvbnQgIT0gTlVMTCk7DQorICBGWF9tZW1zZXQoJm1fTG9nRm9udCwgMCwgc2l6ZW9mKG1fTG9nRm9udCkpOw0KKyAgOjpHZXRPYmplY3RXKG1faEZvbnQsIHNpemVvZihtX0xvZ0ZvbnQpLCAmbV9Mb2dGb250KTsNCisgIG1fZHdTdHlsZXMgPSBGWF9HZXRHZGlGb250U3R5bGVzKG1fTG9nRm9udCk7DQorfQ0KK3ZvaWQgQ0ZYX0dkaUZvbnQ6OkdldEZhbWlseU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzRmFtaWx5KSBjb25zdCB7DQorICBGWFNZU19hc3NlcnQobV9oRm9udCAhPSBOVUxMKTsNCisgIHdzRmFtaWx5ID0gbV9Mb2dGb250LmxmRmFjZU5hbWU7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0dkaUZvbnQ6OkdldENoYXJXaWR0aChGWF9XQ0hBUiB3VW5pY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZWN1cnNpdmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJDb2RlKSB7DQorICBpV2lkdGggPSAoaW50MzJfdCkoaW50MTZfdCltX1dpZHRoQ2FjaGUuR2V0QXQod1VuaWNvZGUsIDApOw0KKyAgaWYgKGlXaWR0aCA9PSAwIHx8IGlXaWR0aCA9PSAtMSkgew0KKyAgICBJRlhfRm9udCogcEZvbnQgPSBOVUxMOw0KKyAgICBpbnQzMl90IGlHbHlwaCA9IEdldEdseXBoSW5kZXgod1VuaWNvZGUsIFRSVUUsICZwRm9udCwgYkNoYXJDb2RlKTsNCisgICAgaWYgKGlHbHlwaCAhPSAweEZGRkYgJiYgcEZvbnQgIT0gTlVMTCkgew0KKyAgICAgIGlmIChwRm9udCA9PSAoSUZYX0ZvbnQqKXRoaXMpIHsNCisgICAgICAgIGlmICghOjpHZXRDaGFyV2lkdGhJKG1faERDLCBpR2x5cGgsIDEsIE5VTEwsICZpV2lkdGgpKSB7DQorICAgICAgICAgIGlXaWR0aCA9IC0xOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSBpZiAoKChDRlhfR2RpRm9udCopcEZvbnQpDQorICAgICAgICAgICAgICAgICAgICAgLT5HZXRDaGFyV2lkdGgod1VuaWNvZGUsIGlXaWR0aCwgRkFMU0UsIGJDaGFyQ29kZSkpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBpV2lkdGggPSAtMTsNCisgICAgfQ0KKyAgICBMb2NrKCk7DQorICAgIG1fV2lkdGhDYWNoZS5TZXRBdEdyb3cod1VuaWNvZGUsIChpbnQxNl90KWlXaWR0aCk7DQorICAgIFVubG9jaygpOw0KKyAgfQ0KKyAgcmV0dXJuIGlXaWR0aCA+IDA7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0dkaUZvbnQ6OkdldENoYXJXaWR0aChGWF9XQ0hBUiB3VW5pY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFyQ29kZSkgew0KKyAgcmV0dXJuIEdldENoYXJXaWR0aCh3VW5pY29kZSwgaVdpZHRoLCBUUlVFLCBiQ2hhckNvZGUpOw0KK30NCitpbnQzMl90IENGWF9HZGlGb250OjpHZXRHbHlwaEluZGV4KEZYX1dDSEFSIHdVbmljb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVjdXJzaXZlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnQqKiBwcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFyQ29kZSkgew0KKyAgaW50MzJfdCBpR2x5cGggPSAwWEZGRkY7DQorICBpZiAoOjpHZXRHbHlwaEluZGljZXNXKG1faERDLCAmd1VuaWNvZGUsIDEsIChMUFdPUkQpJmlHbHlwaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgR0dJX01BUktfTk9ORVhJU1RJTkdfR0xZUEhTKSAhPSBHRElfRVJST1IgJiYNCisgICAgICBpR2x5cGggIT0gMHhGRkZGKSB7DQorICAgIGlmIChwcEZvbnQgIT0gTlVMTCkgew0KKyAgICAgICpwcEZvbnQgPSAoSUZYX0ZvbnQqKXRoaXM7DQorICAgIH0NCisgICAgcmV0dXJuIGlHbHlwaDsNCisgIH0NCisgIEZYX0xQQ0ZPTlRVU0IgcEZvbnRVU0IgPSBGWF9HZXRVbmljb2RlQml0RmllbGQod1VuaWNvZGUpOw0KKyAgaWYgKHBGb250VVNCID09IE5VTEwpIHsNCisgICAgcmV0dXJuIDB4RkZGRjsNCisgIH0NCisgIEZYX1dPUkQgd0JpdEZpZWxkID0gcEZvbnRVU0ItPndCaXRGaWVsZDsNCisgIGlmICh3Qml0RmllbGQgPj0gMTI4KSB7DQorICAgIHJldHVybiAweEZGRkY7DQorICB9DQorICBJRlhfRm9udCogcEZvbnQgPSBOVUxMOw0KKyAgbV9Gb250TWFwcGVyLkxvb2t1cCgodm9pZCopd0JpdEZpZWxkLCAodm9pZComKXBGb250KTsNCisgIGlmIChwRm9udCAhPSBOVUxMICYmIHBGb250ICE9IChJRlhfRm9udCopdGhpcykgew0KKyAgICBpR2x5cGggPQ0KKyAgICAgICAgKChDRlhfR2RpRm9udCopcEZvbnQpLT5HZXRHbHlwaEluZGV4KHdVbmljb2RlLCBGQUxTRSwgTlVMTCwgYkNoYXJDb2RlKTsNCisgICAgaWYgKGlHbHlwaCAhPSAweEZGRkYpIHsNCisgICAgICBpbnQzMl90IGkgPSBtX1N1YnN0Rm9udHMuRmluZChwRm9udCk7DQorICAgICAgaWYgKGkgPiAtMSkgew0KKyAgICAgICAgaUdseXBoIHw9ICgoaSArIDEpIDw8IDI0KTsNCisgICAgICAgIGlmIChwcEZvbnQgIT0gTlVMTCkgew0KKyAgICAgICAgICAqcHBGb250ID0gcEZvbnQ7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gaUdseXBoOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKG1fcEZvbnRNZ3IgIT0gTlVMTCAmJiBiUmVjdXJzaXZlKSB7DQorICAgIElGWF9Gb250KiBwRm9udCA9IG1fcEZvbnRNZ3ItPkdldERlZkZvbnRCeVVuaWNvZGUod1VuaWNvZGUsIG1fZHdTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Mb2dGb250LmxmRmFjZU5hbWUpOw0KKyAgICBpZiAocEZvbnQgIT0gTlVMTCkgew0KKyAgICAgIGlmIChwRm9udCA9PSAoSUZYX0ZvbnQqKXRoaXMpIHsNCisgICAgICAgIHBGb250LT5SZWxlYXNlKCk7DQorICAgICAgICByZXR1cm4gMHhGRkZGOw0KKyAgICAgIH0NCisgICAgICBtX0ZvbnRNYXBwZXIuU2V0QXQoKHZvaWQqKXdCaXRGaWVsZCwgKHZvaWQqKXBGb250KTsNCisgICAgICBpbnQzMl90IGkgPSBtX1N1YnN0Rm9udHMuR2V0U2l6ZSgpOw0KKyAgICAgIG1fU3Vic3RGb250cy5BZGQocEZvbnQpOw0KKyAgICAgIGlHbHlwaCA9ICgoQ0ZYX0dkaUZvbnQqKXBGb250KQ0KKyAgICAgICAgICAgICAgICAgICAtPkdldEdseXBoSW5kZXgod1VuaWNvZGUsIEZBTFNFLCBOVUxMLCBiQ2hhckNvZGUpOw0KKyAgICAgIGlmIChpR2x5cGggIT0gMHhGRkZGKSB7DQorICAgICAgICBpR2x5cGggfD0gKChpICsgMSkgPDwgMjQpOw0KKyAgICAgICAgaWYgKHBwRm9udCAhPSBOVUxMKSB7DQorICAgICAgICAgICpwcEZvbnQgPSBwRm9udDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBpR2x5cGg7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gMHhGRkZGOw0KK30NCitpbnQzMl90IENGWF9HZGlGb250OjpHZXRHbHlwaEluZGV4KEZYX1dDSEFSIHdVbmljb2RlLCBGWF9CT09MIGJDaGFyQ29kZSkgew0KKyAgcmV0dXJuIEdldEdseXBoSW5kZXgod1VuaWNvZGUsIFRSVUUsIE5VTEwsIGJDaGFyQ29kZSk7DQorfQ0KK2ludDMyX3QgQ0ZYX0dkaUZvbnQ6OkdldEFzY2VudCgpIGNvbnN0IHsNCisgIHJldHVybiBtX091dGxpbmVUTS5vdG1Bc2NlbnQ7DQorfQ0KK2ludDMyX3QgQ0ZYX0dkaUZvbnQ6OkdldERlc2NlbnQoKSBjb25zdCB7DQorICByZXR1cm4gbV9PdXRsaW5lVE0ub3RtRGVzY2VudDsNCit9DQorRlhfQk9PTCBDRlhfR2RpRm9udDo6R2V0Q2hhckJCb3goRlhfV0NIQVIgd1VuaWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3QmIGJib3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckNvZGUpIHsNCisgIGludDMyX3QgaUdseXBoSW5kZXggPSBHZXRHbHlwaEluZGV4KHdVbmljb2RlLCBiQ2hhckNvZGUpOw0KKyAgaWYgKGlHbHlwaEluZGV4ID09IDB4RkZGRikgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBJRlhfRm9udCogcEZvbnQgPSBHZXRTdWJzdEZvbnQoaUdseXBoSW5kZXgpOw0KKyAgaWYgKHBGb250ID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgR0xZUEhNRVRSSUNTIGdtOw0KKyAgaUdseXBoSW5kZXggJj0gMHgwMEZGRkZGRjsNCisgIHN0YXRpYyBjb25zdCBNQVQyIG1hdDIgPSB7ezAsIDF9LCB7MCwgMH0sIHswLCAwfSwgezAsIDF9fTsNCisgIGlmICg6OkdldEdseXBoT3V0bGluZVcoKChDRlhfR2RpRm9udCopcEZvbnQpLT5tX2hEQywgaUdseXBoSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEdHT19HTFlQSF9JTkRFWCB8IEdHT19NRVRSSUNTLCAmZ20sIDAsIE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICZtYXQyKSAhPSBHRElfRVJST1IpIHsNCisgICAgYmJveC5sZWZ0ID0gZ20uZ21wdEdseXBoT3JpZ2luLng7DQorICAgIGJib3gudG9wID0gZ20uZ21wdEdseXBoT3JpZ2luLnk7DQorICAgIGJib3gud2lkdGggPSBnbS5nbUJsYWNrQm94WDsNCisgICAgYmJveC5oZWlnaHQgPSBnbS5nbUJsYWNrQm94WTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0dkaUZvbnQ6OkdldEJCb3goQ0ZYX1JlY3QmIGJib3gpIHsNCisgIGJib3gubGVmdCA9IG1fT3V0bGluZVRNLm90bXJjRm9udEJveC5sZWZ0Ow0KKyAgYmJveC50b3AgPSBtX091dGxpbmVUTS5vdG1yY0ZvbnRCb3gudG9wOw0KKyAgYmJveC53aWR0aCA9IG1fT3V0bGluZVRNLm90bXJjRm9udEJveC5yaWdodCAtIG1fT3V0bGluZVRNLm90bXJjRm9udEJveC5sZWZ0Ow0KKyAgYmJveC5oZWlnaHQgPSBtX091dGxpbmVUTS5vdG1yY0ZvbnRCb3guYm90dG9tIC0gbV9PdXRsaW5lVE0ub3RtcmNGb250Qm94LnRvcDsNCisgIHJldHVybiBUUlVFOw0KK30NCitpbnQzMl90IENGWF9HZGlGb250OjpHZXRJdGFsaWNBbmdsZSgpIGNvbnN0IHsNCisgIHJldHVybiBtX091dGxpbmVUTS5vdG1JdGFsaWNBbmdsZSAvIDEwOw0KK30NCit2b2lkIENGWF9HZGlGb250OjpSZXNldCgpIHsNCisgIExvY2soKTsNCisgIG1fV2lkdGhDYWNoZS5SZW1vdmVBbGwoKTsNCisgIENsZWFyQ2FjaGUoKTsNCisgIFVubG9jaygpOw0KK30NCitJRlhfRm9udCogQ0ZYX0dkaUZvbnQ6OkdldFN1YnN0Rm9udChpbnQzMl90IGlHbHlwaEluZGV4KSBjb25zdCB7DQorICBpbnQzMl90IGlIaWdoZXIgPSAoaUdseXBoSW5kZXggJiAweDdGMDAwMDAwKSA+PiAyNDsNCisgIGlmIChpSGlnaGVyID09IDApIHsNCisgICAgcmV0dXJuIChJRlhfRm9udCopdGhpczsNCisgIH0NCisgIGlmIChpSGlnaGVyID4gbV9TdWJzdEZvbnRzLkdldFNpemUoKSkgew0KKyAgICByZXR1cm4gKElGWF9Gb250Kil0aGlzOw0KKyAgfQ0KKyAgcmV0dXJuIChJRlhfRm9udCopbV9TdWJzdEZvbnRzW2lIaWdoZXIgLSAxXTsNCit9DQorRlhfRFdPUkQgQ0ZYX0dkaUZvbnQ6OkdldEdseXBoRElCaXRzKGludDMyX3QgaUdseXBoSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUFUMiogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xZUEhNRVRSSUNTJiBnbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEJ1ZmZlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgYnVmU2l6ZSkgew0KKyAgc3RhdGljIGNvbnN0IFVJTlQgdUZvcm1hdCA9IEdHT19HTFlQSF9JTkRFWCB8IEdHT19HUkFZOF9CSVRNQVA7DQorICBJRlhfRm9udCogcEZvbnQgPSBHZXRTdWJzdEZvbnQoaUdseXBoSW5kZXgpOw0KKyAgaWYgKHBGb250ID09IE5VTEwpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpZiAocEZvbnQgIT0gKElGWF9Gb250Kil0aGlzKSB7DQorICAgIHJldHVybiAoKENGWF9HZGlGb250KilwRm9udCkNCisgICAgICAgIC0+R2V0R2x5cGhESUJpdHMoaUdseXBoSW5kZXggJiAweDAwRkZGRkZGLCBhcmdiLCBwTWF0cml4LCBnbSwgcEJ1ZmZlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgYnVmU2l6ZSk7DQorICB9DQorICB1aW50OF90KiBwR2x5cGhPdXRsaW5lID0gTlVMTDsNCisgIEZYU1lTX2Fzc2VydChwTWF0cml4ICE9IE5VTEwpOw0KKyAgRlhfRFdPUkQgZHdNQVQyID0gR2V0TUFUMkhhc2hDb2RlKChjb25zdCBGSVhFRCopcE1hdHJpeCk7DQorICBDRlhfR2RpRm9udENhY2hlKiBwQ2FjaGUgPSBOVUxMOw0KKyAgaWYgKG1fRm9udENhY2hlLkxvb2t1cCgodm9pZCopZHdNQVQyLCAodm9pZComKXBDYWNoZSkgJiYgcENhY2hlICE9IE5VTEwpIHsNCisgICAgRlhfTFBDR0RJR09DQUNIRSBwR08gPSBwQ2FjaGUtPkdldENhY2hlZEdseXBoT3V0bGluZShpR2x5cGhJbmRleCk7DQorICAgIGlmIChwR08gIT0gTlVMTCkgew0KKyAgICAgIGdtID0gcEdPLT5nbTsNCisgICAgICBwR2x5cGhPdXRsaW5lID0gcEdPLT5wT3V0bGluZTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHBHbHlwaE91dGxpbmUgPT0gTlVMTCkgew0KKyAgICBGWF9EV09SRCBkd0dseXBoU2l6ZSA9DQorICAgICAgICA6OkdldEdseXBoT3V0bGluZVcobV9oREMsIGlHbHlwaEluZGV4LCB1Rm9ybWF0LCAmZ20sIDAsIE5VTEwsIHBNYXRyaXgpOw0KKyAgICBpZiAoZHdHbHlwaFNpemUgPT0gMCB8fCBkd0dseXBoU2l6ZSA9PSBHRElfRVJST1IpIHsNCisgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBwR2x5cGhPdXRsaW5lID0gRlhfQWxsb2ModWludDhfdCwgZHdHbHlwaFNpemUpOw0KKyAgICA6OkdldEdseXBoT3V0bGluZVcobV9oREMsIGlHbHlwaEluZGV4LCB1Rm9ybWF0LCAmZ20sIGR3R2x5cGhTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgcEdseXBoT3V0bGluZSwgcE1hdHJpeCk7DQorICAgIGlmIChwQ2FjaGUgPT0gTlVMTCkgew0KKyAgICAgIHBDYWNoZSA9IG5ldyBDRlhfR2RpRm9udENhY2hlOw0KKyAgICAgIGlmIChtX0ZvbnRDYWNoZS5HZXRDb3VudCgpID49IEZYX0dESUZPTlRfRk9OVENBQ0hFU0laRSkgew0KKyAgICAgICAgQ2xlYXJDYWNoZSgpOw0KKyAgICAgIH0NCisgICAgICBtX0ZvbnRDYWNoZS5TZXRBdCgodm9pZCopZHdNQVQyLCAodm9pZCopcENhY2hlKTsNCisgICAgfQ0KKyAgICBwQ2FjaGUtPlNldENhY2hlZEdseXBoT3V0bGluZShpR2x5cGhJbmRleCwgZ20sIHBHbHlwaE91dGxpbmUpOw0KKyAgfQ0KKyAgRlhfRFdPUkQgZHdEaWJTaXplID0gZ20uZ21CbGFja0JveFggKiA0ICogZ20uZ21CbGFja0JveFk7DQorICBpZiAocEJ1ZmZlciA9PSBOVUxMIHx8IGJ1ZlNpemUgPCBkd0RpYlNpemUpIHsNCisgICAgcmV0dXJuIGR3RGliU2l6ZTsNCisgIH0NCisgIENyZWF0ZUdseXBoQml0bWFwKGdtLmdtQmxhY2tCb3hYLCBnbS5nbUJsYWNrQm94WSwgcEdseXBoT3V0bGluZSwNCisgICAgICAgICAgICAgICAgICAgIChGWF9EV09SRCopcEJ1ZmZlciwgYXJnYik7DQorICByZXR1cm4gZHdEaWJTaXplOw0KK30NCitGWF9EV09SRCBDRlhfR2RpRm9udDo6R2V0SGFzaENvZGUoKSBjb25zdCB7DQorICByZXR1cm4gRlhfR2V0Rm9udEhhc2hDb2RlKEZYX0dldENvZGVQYWdlRnJvbUNoYXJzZXQobV9Mb2dGb250LmxmQ2hhclNldCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0dldEdkaUZvbnRTdHlsZXMobV9Mb2dGb250KSk7DQorfQ0KK0ZYX0RXT1JEIENGWF9HZGlGb250OjpHZXRNQVQySGFzaENvZGUoY29uc3QgRklYRUQqIHBGaXhlZCkgew0KKyAgRlhTWVNfYXNzZXJ0KHBGaXhlZCAhPSBOVUxMKTsNCisgIEZYX0RXT1JEIGR3SGFzaDEgPSAwLCBkd0hhc2gyID0gNTM4MSwgZHdSZXQ7DQorICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgew0KKyAgICBkd1JldCA9ICooKGNvbnN0IEZYX0RXT1JEKilwRml4ZWQpOw0KKyAgICBkd0hhc2gxID0gMTMxMyAqIGR3SGFzaDEgKyBkd1JldDsNCisgICAgZHdIYXNoMiArPSAoZHdIYXNoMiA8PCA1KSArIGR3UmV0Ow0KKyAgICBwRml4ZWQrKzsNCisgIH0NCisgIHJldHVybiAoKGR3SGFzaDEgJiAweDAwMDBGRkZGKSA8PCAxNikgfCAoZHdIYXNoMiAmIDB4MDAwMEZGRkYpOw0KK30NCit2b2lkIENGWF9HZGlGb250OjpDcmVhdGVHbHlwaEJpdG1hcChpbnQzMl90IGlXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcE91dGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQqIHBESUIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiKSB7DQorICBpbnQzMl90IHBhZGRpbmcgPSAoKGlXaWR0aCArIDMpIC8gNCkgKiA0IC0gaVdpZHRoOw0KKyAgRlhfRFdPUkQgYWxwaGE7DQorICBpbnQzMl90IGksIGo7DQorICBmb3IgKGogPSBpSGVpZ2h0IC0gMTsgaiA+PSAwOyAtLWopIHsNCisgICAgZm9yIChpID0gaVdpZHRoIC0gMTsgaSA+PSAwOyAtLWkpIHsNCisgICAgICBpZiAoKGFscGhhID0gKnBPdXRsaW5lKyspID09IDApIHsNCisgICAgICAgICpwRElCKysgPSAwOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBhbHBoYSA9IChhcmdiID4+IDI0KSAqIChhbHBoYSAqIDQgLSAxKSAvIDI1NjsNCisgICAgICAgICpwRElCKysgPSAoYWxwaGEgPDwgMjQpIHwgKGFyZ2IgJiAweDAwRkZGRkZGKTsNCisgICAgICB9DQorICAgIH0NCisgICAgcE91dGxpbmUgKz0gcGFkZGluZzsNCisgIH0NCit9DQorI2VuZGlmDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2dkaWZvbnQuaCBiL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9nZGlmb250LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUwNTYzYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9nZGlmb250LmgKQEAgLTAsMCArMSwxMDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhfR0RJT0JKRUNUX0lNUA0KKyNkZWZpbmUgX0ZYX0dESU9CSkVDVF9JTVANCisjaWZkZWYgX0ZYUExVUw0KKyNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU4zMl9NT0JJTEVfIHx8IFwNCisgICAgX0ZYX09TXyA9PSBfRlhfV0lONjRfDQordHlwZWRlZiBzdHJ1Y3QgX0ZYX0dESUdPQ0FDSEUgew0KKyAgR0xZUEhNRVRSSUNTIGdtOw0KKyAgdWludDhfdCogcE91dGxpbmU7DQorfSBGWF9HRElHT0NBQ0hFLCAqRlhfTFBHRElHT0NBQ0hFOw0KK3R5cGVkZWYgRlhfR0RJR09DQUNIRSBjb25zdCogRlhfTFBDR0RJR09DQUNIRTsNCitjbGFzcyBDRlhfR2RpRm9udENhY2hlIHsNCisgcHVibGljOg0KKyAgQ0ZYX0dkaUZvbnRDYWNoZSgpOw0KKyAgfkNGWF9HZGlGb250Q2FjaGUoKTsNCisgIHZvaWQgU2V0Q2FjaGVkR2x5cGhPdXRsaW5lKEZYX0RXT1JEIGR3R2x5cGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTFlQSE1FVFJJQ1MmIGdtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcE91dGxpbmUpOw0KKyAgRlhfTFBDR0RJR09DQUNIRSBHZXRDYWNoZWRHbHlwaE91dGxpbmUoRlhfRFdPUkQgZHdHbHlwaCkgY29uc3Q7DQorDQorIHByb3RlY3RlZDoNCisgIENGWF9NYXBQdHJUb1B0ciBtX0dseXBoTWFwOw0KK307DQorY2xhc3MgQ0ZYX0dkaUZvbnQgOiBwdWJsaWMgSUZYX0ZvbnQsIHB1YmxpYyBDRlhfVGhyZWFkTG9jayB7DQorIHB1YmxpYzoNCisgIENGWF9HZGlGb250KElGWF9Gb250TWdyKiBwRm9udE1ncik7DQorICB+Q0ZYX0dkaUZvbnQoKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCk7DQorICB2aXJ0dWFsIElGWF9Gb250KiBSZXRhaW4oKTsNCisgIEZYX0JPT0wgTG9hZEZvbnQoY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHksDQorICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UpOw0KKyAgRlhfQk9PTCBMb2FkRm9udChjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlMZW5ndGgpOw0KKyAgRlhfQk9PTCBMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6RmlsZU5hbWUpOw0KKyAgRlhfQk9PTCBMb2FkRm9udChJRlhfU3RyZWFtKiBwRm9udFN0cmVhbSk7DQorICBGWF9CT09MIExvYWRGb250KGNvbnN0IExPR0ZPTlRXJiBsZik7DQorICB2aXJ0dWFsIElGWF9Gb250KiBEZXJpdmUoRlhfRFdPUkQgZHdGb250U3R5bGVzLCBGWF9XT1JEIHdDb2RlUGFnZSA9IDApIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgR2V0RmFtaWx5TmFtZShDRlhfV2lkZVN0cmluZyYgd3NGYW1pbHkpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRGb250U3R5bGVzKCkgY29uc3QgeyByZXR1cm4gbV9kd1N0eWxlczsgfQ0KKyAgdmlydHVhbCB1aW50OF90IEdldENoYXJTZXQoKSBjb25zdCB7IHJldHVybiBtX0xvZ0ZvbnQubGZDaGFyU2V0OyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0Q2hhcldpZHRoKEZYX1dDSEFSIHdVbmljb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEdseXBoSW5kZXgoRlhfV0NIQVIgd1VuaWNvZGUsIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEFzY2VudCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IEdldERlc2NlbnQoKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRDaGFyQkJveChGWF9XQ0hBUiB3VW5pY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdCYgYmJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRCQm94KENGWF9SZWN0JiBiYm94KTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRJdGFsaWNBbmdsZSgpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIFJlc2V0KCk7DQorICBGWF9EV09SRCBHZXRHbHlwaERJQml0cyhpbnQzMl90IGlHbHlwaEluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUFUMiogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdMWVBITUVUUklDUyYgZ20sDQorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwQnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgYnVmU2l6ZSk7DQorICBGWF9EV09SRCBHZXRIYXNoQ29kZSgpIGNvbnN0Ow0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRlhfRm9udE1nciogbV9wRm9udE1ncjsNCisgIGludDMyX3QgbV9pUmVmQ291bnQ7DQorICBDRlhfV29yZERpc2NyZXRlQXJyYXkgbV9XaWR0aENhY2hlOw0KKyAgT1VUTElORVRFWFRNRVRSSUNXIG1fT3V0bGluZVRNOw0KKyAgSEdESU9CSiBtX2hPbGRGb250Ow0KKyAgSEZPTlQgbV9oRm9udDsNCisgIEhEQyBtX2hEQzsNCisgIExPR0ZPTlRXIG1fTG9nRm9udDsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NGb250RmlsZU5hbWU7DQorICBDRlhfV2lkZVN0cmluZ0FycmF5IG1fRm9udEZhbWlsaWVzOw0KKyAgSEFORExFIG1faFJlczsNCisgIEZYX0RXT1JEIG1fZHdTdHlsZXM7DQorICBDRlhfUHRyQXJyYXkgbV9TdWJzdEZvbnRzOw0KKyAgQ0ZYX01hcFB0clRvUHRyIG1fRm9udE1hcHBlcjsNCisgIENGWF9NYXBQdHJUb1B0ciBtX0ZvbnRDYWNoZTsNCisgIHZvaWQgQ2xlYXJDYWNoZSgpOw0KKyAgaW50MzJfdCBHZXRGb250RmFtaWxpZXMoR2RpcGx1czo6Rm9udENvbGxlY3Rpb24mIGZjKTsNCisgIHZvaWQgUmV0cmlldmVGb250U3R5bGVzKCk7DQorICBJRlhfRm9udCogR2V0U3Vic3RGb250KGludDMyX3QgaUdseXBoSW5kZXgpIGNvbnN0Ow0KKyAgRlhfQk9PTCBHZXRDaGFyV2lkdGgoRlhfV0NIQVIgd1VuaWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZWN1cnNpdmUsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFKTsNCisgIGludDMyX3QgR2V0R2x5cGhJbmRleChGWF9XQ0hBUiB3VW5pY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZWN1cnNpdmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnQqKiBwcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSk7DQorICBGWF9EV09SRCBHZXRNQVQySGFzaENvZGUoY29uc3QgRklYRUQqIHBGaXhlZCk7DQorICB2b2lkIENyZWF0ZUdseXBoQml0bWFwKGludDMyX3QgaVdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBPdXRsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogcERJQiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiKTsNCisgIGZyaWVuZCBjbGFzcyBDRlhfR2RpRm9udE1ncjsNCit9Ow0KKyNlbmRpZg0KKyNlbmRpZg0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9nZWZvbnQuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X2dlZm9udC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc2NDQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9nZWZvbnQuY3BwCkBAIC0wLDAgKzEsNTg4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZnYXMvc3JjL2ZnYXNfYmFzZS5oIg0KKyNpbmNsdWRlICJmeF9nZWZvbnQuaCINCisjaW5jbHVkZSAiZnhfZm9udHV0aWxzLmgiDQorI2lmbmRlZiBfRlhQTFVTDQorSUZYX0ZvbnQqIElGWF9Gb250OjpMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnRNZ3IqIHBGb250TWdyKSB7DQorI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCisgIGlmIChOVUxMICE9IHBGb250TWdyKSB7DQorICAgIHJldHVybiBwRm9udE1nci0+R2V0Rm9udEJ5Q29kZVBhZ2Uod0NvZGVQYWdlLCBkd0ZvbnRTdHlsZXMsIHBzekZvbnRGYW1pbHkpOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorI2Vsc2UNCisgIENGWF9HRUZvbnQqIHBGb250ID0gbmV3IENGWF9HRUZvbnQocEZvbnRNZ3IpOw0KKyAgaWYgKCFwRm9udC0+TG9hZEZvbnQocHN6Rm9udEZhbWlseSwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpKSB7DQorICAgIHBGb250LT5SZWxlYXNlKCk7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIHBGb250Ow0KKyNlbmRpZg0KK30NCitJRlhfRm9udCogSUZYX0ZvbnQ6OkxvYWRGb250KGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRm9udE1nciogcEZvbnRNZ3IpIHsNCisjaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KKyAgaWYgKE5VTEwgIT0gcEZvbnRNZ3IpIHsNCisgICAgcmV0dXJuIHBGb250TWdyLT5Mb2FkRm9udChwQnVmZmVyLCBpTGVuZ3RoLCAwLCBOVUxMKTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KKyNlbHNlDQorICBDRlhfR0VGb250KiBwRm9udCA9IG5ldyBDRlhfR0VGb250KHBGb250TWdyKTsNCisgIGlmICghcEZvbnQtPkxvYWRGb250KHBCdWZmZXIsIGlMZW5ndGgpKSB7DQorICAgIHBGb250LT5SZWxlYXNlKCk7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIHBGb250Ow0KKyNlbmRpZg0KK30NCitJRlhfRm9udCogSUZYX0ZvbnQ6OkxvYWRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGaWxlTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Gb250TWdyKiBwRm9udE1ncikgew0KKyNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQorICBpZiAoTlVMTCAhPSBwRm9udE1ncikgew0KKyAgICByZXR1cm4gcEZvbnRNZ3ItPkxvYWRGb250KHBzekZpbGVOYW1lLCAwLCBOVUxMKTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KKyNlbHNlDQorICBDRlhfR0VGb250KiBwRm9udCA9IG5ldyBDRlhfR0VGb250KHBGb250TWdyKTsNCisgIGlmICghcEZvbnQtPkxvYWRGb250KHBzekZpbGVOYW1lKSkgew0KKyAgICBwRm9udC0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBwRm9udDsNCisjZW5kaWYNCit9DQorSUZYX0ZvbnQqIElGWF9Gb250OjpMb2FkRm9udChJRlhfU3RyZWFtKiBwRm9udFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Gb250TWdyKiBwRm9udE1nciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNhdmVTdHJlYW0pIHsNCisjaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KKyAgaWYgKE5VTEwgIT0gcEZvbnRNZ3IpIHsNCisgICAgcmV0dXJuIHBGb250TWdyLT5Mb2FkRm9udChwRm9udFN0cmVhbSwgMCwgTlVMTCk7DQorICB9DQorICByZXR1cm4gTlVMTDsNCisjZWxzZQ0KKyAgQ0ZYX0dFRm9udCogcEZvbnQgPSBuZXcgQ0ZYX0dFRm9udChwRm9udE1ncik7DQorICBpZiAoIXBGb250LT5Mb2FkRm9udChwRm9udFN0cmVhbSwgYlNhdmVTdHJlYW0pKSB7DQorICAgIHBGb250LT5SZWxlYXNlKCk7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIHBGb250Ow0KKyNlbmRpZg0KK30NCitJRlhfRm9udCogSUZYX0ZvbnQ6OkxvYWRGb250KENGWF9Gb250KiBwRXh0Rm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Gb250TWdyKiBwRm9udE1nciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRha2VPdmVyKSB7DQorICBDRlhfR0VGb250KiBwRm9udCA9IG5ldyBDRlhfR0VGb250KHBGb250TWdyKTsNCisgIGlmICghcEZvbnQtPkxvYWRGb250KHBFeHRGb250LCBiVGFrZU92ZXIpKSB7DQorICAgIHBGb250LT5SZWxlYXNlKCk7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIHBGb250Ow0KK30NCitDRlhfR0VGb250OjpDRlhfR0VGb250KElGWF9Gb250TWdyKiBwRm9udE1ncikNCisgICAgOiBDRlhfVGhyZWFkTG9jaygpLA0KKyNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQorICAgICAgbV9iVXNlTG9nRm9udFN0eWxlKEZBTFNFKSwNCisgICAgICBtX2R3TG9nRm9udFN0eWxlKDApLA0KKyNlbmRpZg0KKyAgICAgIG1fcEZvbnQoTlVMTCksDQorICAgICAgbV9wRm9udE1ncihwRm9udE1nciksDQorICAgICAgbV9pUmVmQ291bnQoMSksDQorICAgICAgbV9iRXh0Rm9udChGQUxTRSksDQorICAgICAgbV9wU3RyZWFtKE5VTEwpLA0KKyAgICAgIG1fcEZpbGVSZWFkKE5VTEwpLA0KKyAgICAgIG1fcEZvbnRFbmNvZGluZyhOVUxMKSwNCisgICAgICBtX3BDaGFyV2lkdGhNYXAoTlVMTCksDQorICAgICAgbV9wUmVjdEFycmF5KE5VTEwpLA0KKyAgICAgIG1fcEJCb3hNYXAoTlVMTCksDQorICAgICAgbV9wUHJvdmlkZXIoTlVMTCksDQorICAgICAgbV93Q2hhclNldCgweEZGRkYpLA0KKyAgICAgIG1fU3Vic3RGb250cygpLA0KKyAgICAgIG1fRm9udE1hcHBlcigxNikgew0KK30NCisNCitDRlhfR0VGb250OjpDRlhfR0VGb250KGNvbnN0IENGWF9HRUZvbnQmIHNyYywgRlhfRFdPUkQgZHdGb250U3R5bGVzKQ0KKyAgICA6IENGWF9UaHJlYWRMb2NrKCksDQorI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCisgICAgICBtX2JVc2VMb2dGb250U3R5bGUoRkFMU0UpLA0KKyAgICAgIG1fZHdMb2dGb250U3R5bGUoMCksDQorI2VuZGlmDQorICAgICAgbV9wRm9udChOVUxMKSwNCisgICAgICBtX3BGb250TWdyKHNyYy5tX3BGb250TWdyKSwNCisgICAgICBtX2lSZWZDb3VudCgxKSwNCisgICAgICBtX2JFeHRGb250KEZBTFNFKSwNCisgICAgICBtX3BTdHJlYW0oTlVMTCksDQorICAgICAgbV9wRmlsZVJlYWQoTlVMTCksDQorICAgICAgbV9wRm9udEVuY29kaW5nKE5VTEwpLA0KKyAgICAgIG1fcENoYXJXaWR0aE1hcChOVUxMKSwNCisgICAgICBtX3BSZWN0QXJyYXkoTlVMTCksDQorICAgICAgbV9wQkJveE1hcChOVUxMKSwNCisgICAgICBtX3BQcm92aWRlcihOVUxMKSwNCisgICAgICBtX3dDaGFyU2V0KDB4RkZGRiksDQorICAgICAgbV9TdWJzdEZvbnRzKCksDQorICAgICAgbV9Gb250TWFwcGVyKDE2KSB7DQorICBtX3BGb250ID0gbmV3IENGWF9Gb250Ow0KKyAgRlhTWVNfYXNzZXJ0KG1fcEZvbnQgIT0gTlVMTCk7DQorICBGWFNZU19hc3NlcnQoc3JjLm1fcEZvbnQgIT0gTlVMTCk7DQorICBtX3BGb250LT5Mb2FkQ2xvbmUoc3JjLm1fcEZvbnQpOw0KKyAgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0ID0gbV9wRm9udC0+R2V0U3Vic3RGb250KCk7DQorICBpZiAoIXBTdWJzdCkgew0KKyAgICBwU3Vic3QgPSBuZXcgQ0ZYX1N1YnN0Rm9udDsNCisgICAgbV9wRm9udC0+U2V0U3Vic3RGb250KHBTdWJzdCk7DQorICB9DQorICBwU3Vic3QtPm1fV2VpZ2h0ID0NCisgICAgICAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0JvbGQpID8gRlhGT05UX0ZXX0JPTEQgOiBGWEZPTlRfRldfTk9STUFMOw0KKyAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9JdGFsaWMpIHsNCisgICAgcFN1YnN0LT5tX1N1YnN0RmxhZ3MgfD0gRlhGT05UX1NVQlNUX0lUQUxJQzsNCisgIH0NCisgIEluaXRGb250KCk7DQorfQ0KK0NGWF9HRUZvbnQ6On5DRlhfR0VGb250KCkgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX1N1YnN0Rm9udHMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgSUZYX0ZvbnQqIHBGb250ID0gKElGWF9Gb250KiltX1N1YnN0Rm9udHNbaV07DQorICAgIHBGb250LT5SZWxlYXNlKCk7DQorICB9DQorICBtX1N1YnN0Rm9udHMuUmVtb3ZlQWxsKCk7DQorICBtX0ZvbnRNYXBwZXIuUmVtb3ZlQWxsKCk7DQorICBpZiAobV9wRmlsZVJlYWQgIT0gTlVMTCkgew0KKyAgICBtX3BGaWxlUmVhZC0+UmVsZWFzZSgpOw0KKyAgfQ0KKyAgaWYgKG1fcFN0cmVhbSAhPSBOVUxMKSB7DQorICAgIG1fcFN0cmVhbS0+UmVsZWFzZSgpOw0KKyAgfQ0KKyAgaWYgKG1fcEZvbnRFbmNvZGluZyAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBtX3BGb250RW5jb2Rpbmc7DQorICB9DQorICBpZiAobV9wQ2hhcldpZHRoTWFwICE9IE5VTEwpIHsNCisgICAgZGVsZXRlIG1fcENoYXJXaWR0aE1hcDsNCisgIH0NCisgIGlmIChtX3BSZWN0QXJyYXkgIT0gTlVMTCkgew0KKyAgICBkZWxldGUgbV9wUmVjdEFycmF5Ow0KKyAgfQ0KKyAgaWYgKG1fcEJCb3hNYXAgIT0gTlVMTCkgew0KKyAgICBkZWxldGUgbV9wQkJveE1hcDsNCisgIH0NCisgIGlmIChtX3BGb250ICE9IE5VTEwgJiYgIW1fYkV4dEZvbnQpIHsNCisgICAgZGVsZXRlIG1fcEZvbnQ7DQorICB9DQorfQ0KK3ZvaWQgQ0ZYX0dFRm9udDo6UmVsZWFzZSgpIHsNCisgIGlmICgtLW1faVJlZkNvdW50IDwgMSkgew0KKyAgICBpZiAobV9wRm9udE1nciAhPSBOVUxMKSB7DQorICAgICAgbV9wRm9udE1nci0+UmVtb3ZlRm9udCh0aGlzKTsNCisgICAgfQ0KKyAgICBkZWxldGUgdGhpczsNCisgIH0NCit9DQorSUZYX0ZvbnQqIENGWF9HRUZvbnQ6OlJldGFpbigpIHsNCisgICsrbV9pUmVmQ291bnQ7DQorICByZXR1cm4gdGhpczsNCit9DQorRlhfQk9PTCBDRlhfR0VGb250OjpMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlKSB7DQorICBpZiAobV9wRm9udCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBMb2NrKCk7DQorICBDRlhfQnl0ZVN0cmluZyBjc0ZvbnRGYW1pbHk7DQorICBpZiAocHN6Rm9udEZhbWlseSAhPSBOVUxMKSB7DQorICAgIGNzRm9udEZhbWlseSA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwc3pGb250RmFtaWx5KTsNCisgIH0NCisgIEZYX0RXT1JEIGR3RmxhZ3MgPSAwOw0KKyAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9GaXhlZFBpdGNoKSB7DQorICAgIGR3RmxhZ3MgfD0gRlhGT05UX0ZJWEVEX1BJVENIOw0KKyAgfQ0KKyAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TZXJpZikgew0KKyAgICBkd0ZsYWdzIHw9IEZYRk9OVF9TRVJJRjsNCisgIH0NCisgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU3ltYm9saWMpIHsNCisgICAgZHdGbGFncyB8PSBGWEZPTlRfU1lNQk9MSUM7DQorICB9DQorICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX1NjcmlwdCkgew0KKyAgICBkd0ZsYWdzIHw9IEZYRk9OVF9TQ1JJUFQ7DQorICB9DQorICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0l0YWxpYykgew0KKyAgICBkd0ZsYWdzIHw9IEZYRk9OVF9JVEFMSUM7DQorICB9DQorICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0JvbGQpIHsNCisgICAgZHdGbGFncyB8PSBGWEZPTlRfQk9MRDsNCisgIH0NCisgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfRXhhY3RNYXRjaCkgew0KKyAgICBkd0ZsYWdzIHw9IEZYRk9OVF9FWEFDVE1BVENIOw0KKyAgfQ0KKyAgaW50MzJfdCBpV2VpZ2h0ID0NCisgICAgICAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0JvbGQpID8gRlhGT05UX0ZXX0JPTEQgOiBGWEZPTlRfRldfTk9STUFMOw0KKyAgRlhfV09SRCB3Q2hhclNldCA9IEZYX0dldENoYXJzZXRGcm9tQ29kZVBhZ2Uod0NvZGVQYWdlKTsNCisgIGlmICh3Q2hhclNldCA9PSAweEZGRkYpIHsNCisgICAgd0NoYXJTZXQgPSBGWFNZU19HZXRBQ1AoKTsNCisgIH0NCisgIG1fd0NoYXJTZXQgPSB3Q2hhclNldDsNCisgIG1fcEZvbnQgPSBuZXcgQ0ZYX0ZvbnQ7DQorICBpZiAoKGR3RmxhZ3MgJiBGWEZPTlRfSVRBTElDKSAmJiAoZHdGbGFncyAmIEZYRk9OVF9CT0xEKSkgew0KKyAgICBjc0ZvbnRGYW1pbHkgKz0gIixCb2xkSXRhbGljIjsNCisgIH0gZWxzZSBpZiAoZHdGbGFncyAmIEZYRk9OVF9CT0xEKSB7DQorICAgIGNzRm9udEZhbWlseSArPSAiLEJvbGQiOw0KKyAgfSBlbHNlIGlmIChkd0ZsYWdzICYgRlhGT05UX0lUQUxJQykgew0KKyAgICBjc0ZvbnRGYW1pbHkgKz0gIixJdGFsaWMiOw0KKyAgfQ0KKyAgbV9wRm9udC0+TG9hZFN1YnN0KGNzRm9udEZhbWlseSwgVFJVRSwgZHdGbGFncywgaVdlaWdodCwgMCwgd0NvZGVQYWdlKTsNCisgIEZYX0JPT0wgYlJldCA9IG1fcEZvbnQtPkdldEZhY2UoKSAhPSBudWxscHRyOw0KKyAgaWYgKGJSZXQpIHsNCisgICAgYlJldCA9IEluaXRGb250KCk7DQorICB9DQorICBVbmxvY2soKTsNCisgIHJldHVybiBiUmV0Ow0KK30NCitGWF9CT09MIENGWF9HRUZvbnQ6OkxvYWRGb250KGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgbGVuZ3RoKSB7DQorICBpZiAobV9wRm9udCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBMb2NrKCk7DQorICBtX3BGb250ID0gbmV3IENGWF9Gb250Ow0KKyAgRlhfQk9PTCBiUmV0ID0gbV9wRm9udC0+TG9hZEVtYmVkZGVkKHBCdWZmZXIsIGxlbmd0aCk7DQorICBpZiAoYlJldCkgew0KKyAgICBiUmV0ID0gSW5pdEZvbnQoKTsNCisgIH0NCisgIG1fd0NoYXJTZXQgPSAweEZGRkY7DQorICBVbmxvY2soKTsNCisgIHJldHVybiBiUmV0Ow0KK30NCitGWF9CT09MIENGWF9HRUZvbnQ6OkxvYWRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGaWxlTmFtZSkgew0KKyAgaWYgKG1fcEZvbnQgfHwgbV9wU3RyZWFtIHx8IG1fcEZpbGVSZWFkKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIExvY2soKTsNCisgIG1fcFN0cmVhbSA9IElGWF9TdHJlYW06OkNyZWF0ZVN0cmVhbSgNCisgICAgICBwc3pGaWxlTmFtZSwgRlhfU1RSRUFNQUNDRVNTX0JpbmFyeSB8IEZYX1NUUkVBTUFDQ0VTU19SZWFkKTsNCisgIG1fcEZpbGVSZWFkID0gRlhfQ3JlYXRlRmlsZVJlYWQobV9wU3RyZWFtKTsNCisgIEZYX0JPT0wgYlJldCA9IEZBTFNFOw0KKyAgaWYgKG1fcFN0cmVhbSAmJiBtX3BGaWxlUmVhZCkgew0KKyAgICBtX3BGb250ID0gbmV3IENGWF9Gb250Ow0KKyAgICBiUmV0ID0gbV9wRm9udC0+TG9hZEZpbGUobV9wRmlsZVJlYWQpOw0KKyAgICBpZiAoYlJldCkgew0KKyAgICAgIGJSZXQgPSBJbml0Rm9udCgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG1fcEZpbGVSZWFkLT5SZWxlYXNlKCk7DQorICAgICAgbV9wRmlsZVJlYWQgPSBudWxscHRyOw0KKyAgICB9DQorICB9DQorICBtX3dDaGFyU2V0ID0gMHhGRkZGOw0KKyAgVW5sb2NrKCk7DQorICByZXR1cm4gYlJldDsNCit9DQorRlhfQk9PTCBDRlhfR0VGb250OjpMb2FkRm9udChJRlhfU3RyZWFtKiBwRm9udFN0cmVhbSwgRlhfQk9PTCBiU2F2ZVN0cmVhbSkgew0KKyAgaWYgKG1fcEZvbnQgfHwgbV9wRmlsZVJlYWQgfHwgIXBGb250U3RyZWFtIHx8IHBGb250U3RyZWFtLT5HZXRMZW5ndGgoKSA8IDEpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgTG9jaygpOw0KKyAgaWYgKGJTYXZlU3RyZWFtKSB7DQorICAgIG1fcFN0cmVhbSA9IHBGb250U3RyZWFtOw0KKyAgfQ0KKyAgbV9wRmlsZVJlYWQgPSBGWF9DcmVhdGVGaWxlUmVhZChwRm9udFN0cmVhbSk7DQorICBtX3BGb250ID0gbmV3IENGWF9Gb250Ow0KKyAgRlhfQk9PTCBiUmV0ID0gbV9wRm9udC0+TG9hZEZpbGUobV9wRmlsZVJlYWQpOw0KKyAgaWYgKGJSZXQpIHsNCisgICAgYlJldCA9IEluaXRGb250KCk7DQorICB9IGVsc2Ugew0KKyAgICBtX3BGaWxlUmVhZC0+UmVsZWFzZSgpOw0KKyAgICBtX3BGaWxlUmVhZCA9IG51bGxwdHI7DQorICB9DQorICBtX3dDaGFyU2V0ID0gMHhGRkZGOw0KKyAgVW5sb2NrKCk7DQorICByZXR1cm4gYlJldDsNCit9DQorRlhfQk9PTCBDRlhfR0VGb250OjpMb2FkRm9udChDRlhfRm9udCogcEV4dEZvbnQsIEZYX0JPT0wgYlRha2VPdmVyKSB7DQorICBpZiAobV9wRm9udCB8fCAhcEV4dEZvbnQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgTG9jaygpOw0KKyAgbV9wRm9udCA9IHBFeHRGb250Ow0KKyAgRlhfQk9PTCBiUmV0ID0gISFtX3BGb250Ow0KKyAgaWYgKGJSZXQpIHsNCisgICAgbV9iRXh0Rm9udCA9ICFiVGFrZU92ZXI7DQorICAgIGJSZXQgPSBJbml0Rm9udCgpOw0KKyAgfSBlbHNlIHsNCisgICAgbV9iRXh0Rm9udCA9IFRSVUU7DQorICB9DQorICBtX3dDaGFyU2V0ID0gMHhGRkZGOw0KKyAgVW5sb2NrKCk7DQorICByZXR1cm4gYlJldDsNCit9DQorRlhfQk9PTCBDRlhfR0VGb250OjpJbml0Rm9udCgpIHsNCisgIGlmICghbV9wRm9udCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoIW1fcEZvbnRFbmNvZGluZykgew0KKyAgICBtX3BGb250RW5jb2RpbmcgPSBGWF9DcmVhdGVGb250RW5jb2RpbmdFeChtX3BGb250KTsNCisgICAgaWYgKCFtX3BGb250RW5jb2RpbmcpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgIH0NCisgIGlmICghbV9wQ2hhcldpZHRoTWFwKSB7DQorICAgIG1fcENoYXJXaWR0aE1hcCA9IG5ldyBDRlhfV29yZERpc2NyZXRlQXJyYXkoMTAyNCk7DQorICB9DQorICBpZiAoIW1fcFJlY3RBcnJheSkgew0KKyAgICBtX3BSZWN0QXJyYXkgPSBuZXcgQ0ZYX1JlY3RNYXNzQXJyYXkoMTYpOw0KKyAgfQ0KKyAgaWYgKCFtX3BCQm94TWFwKSB7DQorICAgIG1fcEJCb3hNYXAgPSBuZXcgQ0ZYX01hcFB0clRvUHRyKDE2KTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitJRlhfRm9udCogQ0ZYX0dFRm9udDo6RGVyaXZlKEZYX0RXT1JEIGR3Rm9udFN0eWxlcywgRlhfV09SRCB3Q29kZVBhZ2UpIHsNCisgIGlmIChHZXRGb250U3R5bGVzKCkgPT0gZHdGb250U3R5bGVzKSB7DQorICAgIHJldHVybiBSZXRhaW4oKTsNCisgIH0NCisgIHJldHVybiBuZXcgQ0ZYX0dFRm9udCgqdGhpcywgZHdGb250U3R5bGVzKTsNCit9DQordWludDhfdCBDRlhfR0VGb250OjpHZXRDaGFyU2V0KCkgY29uc3Qgew0KKyAgaWYgKG1fd0NoYXJTZXQgIT0gMHhGRkZGKSB7DQorICAgIHJldHVybiAodWludDhfdCltX3dDaGFyU2V0Ow0KKyAgfQ0KKyAgaWYgKCFtX3BGb250LT5HZXRTdWJzdEZvbnQoKSkgew0KKyAgICByZXR1cm4gRlhfQ0hBUlNFVF9EZWZhdWx0Ow0KKyAgfQ0KKyAgcmV0dXJuIG1fcEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX0NoYXJzZXQ7DQorfQ0KK3ZvaWQgQ0ZYX0dFRm9udDo6R2V0RmFtaWx5TmFtZShDRlhfV2lkZVN0cmluZyYgd3NGYW1pbHkpIGNvbnN0IHsNCisgIGlmICghbV9wRm9udC0+R2V0U3Vic3RGb250KCkgfHwNCisgICAgICBtX3BGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9GYW1pbHkuR2V0TGVuZ3RoKCkgPT0gMCkgew0KKyAgICB3c0ZhbWlseSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwobV9wRm9udC0+R2V0RmFtaWx5TmFtZSgpKTsNCisgIH0gZWxzZSB7DQorICAgIHdzRmFtaWx5ID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChtX3BGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9GYW1pbHkpOw0KKyAgfQ0KK30NCit2b2lkIENGWF9HRUZvbnQ6OkdldFBzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NOYW1lKSBjb25zdCB7DQorICB3c05hbWUgPSBtX3BGb250LT5HZXRQc05hbWUoKTsNCit9DQorRlhfRFdPUkQgQ0ZYX0dFRm9udDo6R2V0Rm9udFN0eWxlcygpIGNvbnN0IHsNCisgIEZYU1lTX2Fzc2VydChtX3BGb250ICE9IE5VTEwpOw0KKyNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQorICBpZiAobV9iVXNlTG9nRm9udFN0eWxlKSB7DQorICAgIHJldHVybiBtX2R3TG9nRm9udFN0eWxlOw0KKyAgfQ0KKyNlbmRpZg0KKyAgRlhfRFdPUkQgZHdTdHlsZXMgPSAwOw0KKyAgaWYgKCFtX3BGb250LT5HZXRTdWJzdEZvbnQoKSkgew0KKyAgICBpZiAobV9wRm9udC0+SXNCb2xkKCkpIHsNCisgICAgICBkd1N0eWxlcyB8PSBGWF9GT05UU1RZTEVfQm9sZDsNCisgICAgfQ0KKyAgICBpZiAobV9wRm9udC0+SXNJdGFsaWMoKSkgew0KKyAgICAgIGR3U3R5bGVzIHw9IEZYX0ZPTlRTVFlMRV9JdGFsaWM7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGlmIChtX3BGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9XZWlnaHQgPT0gRlhGT05UX0ZXX0JPTEQpIHsNCisgICAgICBkd1N0eWxlcyB8PSBGWF9GT05UU1RZTEVfQm9sZDsNCisgICAgfQ0KKyAgICBpZiAobV9wRm9udC0+R2V0U3Vic3RGb250KCktPm1fU3Vic3RGbGFncyAmIEZYRk9OVF9TVUJTVF9JVEFMSUMpIHsNCisgICAgICBkd1N0eWxlcyB8PSBGWF9GT05UU1RZTEVfSXRhbGljOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gZHdTdHlsZXM7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0dFRm9udDo6R2V0Q2hhcldpZHRoKEZYX1dDSEFSIHdVbmljb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFyQ29kZSkgew0KKyAgcmV0dXJuIEdldENoYXJXaWR0aCh3VW5pY29kZSwgaVdpZHRoLCBUUlVFLCBiQ2hhckNvZGUpOw0KK30NCitGWF9CT09MIENGWF9HRUZvbnQ6OkdldENoYXJXaWR0aChGWF9XQ0hBUiB3VW5pY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVjdXJzaXZlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJDb2RlKSB7DQorICBGWFNZU19hc3NlcnQobV9wQ2hhcldpZHRoTWFwICE9IE5VTEwpOw0KKyAgaVdpZHRoID0gbV9wQ2hhcldpZHRoTWFwLT5HZXRBdCh3VW5pY29kZSwgMCk7DQorICBpZiAoaVdpZHRoIDwgMSkgew0KKyAgICBpZiAoIW1fcFByb3ZpZGVyIHx8DQorICAgICAgICAhbV9wUHJvdmlkZXItPkdldENoYXJXaWR0aCh0aGlzLCB3VW5pY29kZSwgaVdpZHRoLCBiQ2hhckNvZGUpKSB7DQorICAgICAgSUZYX0ZvbnQqIHBGb250ID0gTlVMTDsNCisgICAgICBpbnQzMl90IGlHbHlwaCA9IEdldEdseXBoSW5kZXgod1VuaWNvZGUsIFRSVUUsICZwRm9udCwgYkNoYXJDb2RlKTsNCisgICAgICBpZiAoaUdseXBoICE9IDB4RkZGRiAmJiBwRm9udCAhPSBOVUxMKSB7DQorICAgICAgICBpZiAocEZvbnQgPT0gKElGWF9Gb250Kil0aGlzKSB7DQorICAgICAgICAgIGlXaWR0aCA9IG1fcEZvbnQtPkdldEdseXBoV2lkdGgoaUdseXBoKTsNCisgICAgICAgICAgaWYgKGlXaWR0aCA8IDApIHsNCisgICAgICAgICAgICBpV2lkdGggPSAtMTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmICgoKENGWF9HRUZvbnQqKXBGb250KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgLT5HZXRDaGFyV2lkdGgod1VuaWNvZGUsIGlXaWR0aCwgRkFMU0UsIGJDaGFyQ29kZSkpIHsNCisgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlXaWR0aCA9IC0xOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBMb2NrKCk7DQorICAgIG1fcENoYXJXaWR0aE1hcC0+U2V0QXRHcm93KHdVbmljb2RlLCAoaW50MTZfdClpV2lkdGgpOw0KKyAgICBVbmxvY2soKTsNCisgIH0gZWxzZSBpZiAoaVdpZHRoID09IDY1NTM1KSB7DQorICAgIGlXaWR0aCA9IC0xOw0KKyAgfQ0KKyAgcmV0dXJuIGlXaWR0aCA+IDA7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0dFRm9udDo6R2V0Q2hhckJCb3goRlhfV0NIQVIgd1VuaWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdCYgYmJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJDb2RlKSB7DQorICByZXR1cm4gR2V0Q2hhckJCb3god1VuaWNvZGUsIGJib3gsIFRSVUUsIGJDaGFyQ29kZSk7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0dFRm9udDo6R2V0Q2hhckJCb3goRlhfV0NIQVIgd1VuaWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdCYgYmJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlY3Vyc2l2ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJDb2RlKSB7DQorICBGWFNZU19hc3NlcnQobV9wUmVjdEFycmF5ICE9IE5VTEwpOw0KKyAgRlhTWVNfYXNzZXJ0KG1fcEJCb3hNYXAgIT0gTlVMTCk7DQorICB2b2lkKiBwUmVjdCA9IE5VTEw7DQorICBpZiAoIW1fcEJCb3hNYXAtPkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdCl3VW5pY29kZSwgcFJlY3QpKSB7DQorICAgIElGWF9Gb250KiBwRm9udCA9IE5VTEw7DQorICAgIGludDMyX3QgaUdseXBoID0gR2V0R2x5cGhJbmRleCh3VW5pY29kZSwgVFJVRSwgJnBGb250LCBiQ2hhckNvZGUpOw0KKyAgICBpZiAoaUdseXBoICE9IDB4RkZGRiAmJiBwRm9udCAhPSBOVUxMKSB7DQorICAgICAgaWYgKHBGb250ID09IChJRlhfRm9udCopdGhpcykgew0KKyAgICAgICAgRlhfUkVDVCBydEJCb3g7DQorICAgICAgICBpZiAobV9wRm9udC0+R2V0R2x5cGhCQm94KGlHbHlwaCwgcnRCQm94KSkgew0KKyAgICAgICAgICBMb2NrKCk7DQorICAgICAgICAgIENGWF9SZWN0IHJ0Ow0KKyAgICAgICAgICBydC5TZXQocnRCQm94LmxlZnQsIHJ0QkJveC50b3AsIHJ0QkJveC5XaWR0aCgpLCBydEJCb3guSGVpZ2h0KCkpOw0KKyAgICAgICAgICBpbnQzMl90IGluZGV4ID0gbV9wUmVjdEFycmF5LT5BZGQocnQpOw0KKyAgICAgICAgICBwUmVjdCA9IG1fcFJlY3RBcnJheS0+R2V0UHRyQXQoaW5kZXgpOw0KKyAgICAgICAgICBtX3BCQm94TWFwLT5TZXRBdCgodm9pZCopKHVpbnRwdHJfdCl3VW5pY29kZSwgcFJlY3QpOw0KKyAgICAgICAgICBVbmxvY2soKTsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2UgaWYgKCgoQ0ZYX0dFRm9udCopcEZvbnQpDQorICAgICAgICAgICAgICAgICAgICAgLT5HZXRDaGFyQkJveCh3VW5pY29kZSwgYmJveCwgRkFMU0UsIGJDaGFyQ29kZSkpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHBSZWN0ID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgYmJveCA9ICooRlhfTFBDUkVDVClwUmVjdDsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9HRUZvbnQ6OkdldEJCb3goQ0ZYX1JlY3QmIGJib3gpIHsNCisgIEZYX1JFQ1QgcnQoMCwgMCwgMCwgMCk7DQorICBGWF9CT09MIGJSZXQgPSBtX3BGb250LT5HZXRCQm94KHJ0KTsNCisgIGlmIChiUmV0KSB7DQorICAgIGJib3gubGVmdCA9IHJ0LmxlZnQ7DQorICAgIGJib3gud2lkdGggPSBydC5XaWR0aCgpOw0KKyAgICBiYm94LnRvcCA9IHJ0LmJvdHRvbTsNCisgICAgYmJveC5oZWlnaHQgPSAtcnQuSGVpZ2h0KCk7DQorICB9DQorICByZXR1cm4gYlJldDsNCit9DQoraW50MzJfdCBDRlhfR0VGb250OjpHZXRJdGFsaWNBbmdsZSgpIGNvbnN0IHsNCisgIGlmICghbV9wRm9udC0+R2V0U3Vic3RGb250KCkpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICByZXR1cm4gbV9wRm9udC0+R2V0U3Vic3RGb250KCktPm1fSXRhbGljQW5nbGU7DQorfQ0KK2ludDMyX3QgQ0ZYX0dFRm9udDo6R2V0R2x5cGhJbmRleChGWF9XQ0hBUiB3VW5pY29kZSwgRlhfQk9PTCBiQ2hhckNvZGUpIHsNCisgIHJldHVybiBHZXRHbHlwaEluZGV4KHdVbmljb2RlLCBUUlVFLCBOVUxMLCBiQ2hhckNvZGUpOw0KK30NCitpbnQzMl90IENGWF9HRUZvbnQ6OkdldEdseXBoSW5kZXgoRlhfV0NIQVIgd1VuaWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlY3Vyc2l2ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnQqKiBwcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJDb2RlKSB7DQorICBGWFNZU19hc3NlcnQobV9wRm9udEVuY29kaW5nICE9IE5VTEwpOw0KKyAgaW50MzJfdCBpR2x5cGhJbmRleCA9IG1fcEZvbnRFbmNvZGluZy0+R2x5cGhGcm9tQ2hhckNvZGUod1VuaWNvZGUpOw0KKyAgaWYgKGlHbHlwaEluZGV4ID4gMCkgew0KKyAgICBpZiAocHBGb250ICE9IE5VTEwpIHsNCisgICAgICAqcHBGb250ID0gKElGWF9Gb250Kil0aGlzOw0KKyAgICB9DQorICAgIHJldHVybiBpR2x5cGhJbmRleDsNCisgIH0NCisgIEZHQVNfTFBDRk9OVFVTQiBwRm9udFVTQiA9IEZHQVNfR2V0VW5pY29kZUJpdEZpZWxkKHdVbmljb2RlKTsNCisgIGlmIChwRm9udFVTQiA9PSBOVUxMKSB7DQorICAgIHJldHVybiAweEZGRkY7DQorICB9DQorICBGWF9XT1JEIHdCaXRGaWVsZCA9IHBGb250VVNCLT53Qml0RmllbGQ7DQorICBpZiAod0JpdEZpZWxkID49IDEyOCkgew0KKyAgICByZXR1cm4gMHhGRkZGOw0KKyAgfQ0KKyAgSUZYX0ZvbnQqIHBGb250ID0gTlVMTDsNCisgIG1fRm9udE1hcHBlci5Mb29rdXAoKHZvaWQqKSh1aW50cHRyX3Qpd1VuaWNvZGUsICh2b2lkKiYpcEZvbnQpOw0KKyAgaWYgKHBGb250ICE9IE5VTEwgJiYgcEZvbnQgIT0gKElGWF9Gb250Kil0aGlzKSB7DQorICAgIGlHbHlwaEluZGV4ID0NCisgICAgICAgICgoQ0ZYX0dFRm9udCopcEZvbnQpLT5HZXRHbHlwaEluZGV4KHdVbmljb2RlLCBGQUxTRSwgTlVMTCwgYkNoYXJDb2RlKTsNCisgICAgaWYgKGlHbHlwaEluZGV4ICE9IDB4RkZGRikgew0KKyAgICAgIGludDMyX3QgaSA9IG1fU3Vic3RGb250cy5GaW5kKHBGb250KTsNCisgICAgICBpZiAoaSA+IC0xKSB7DQorICAgICAgICBpR2x5cGhJbmRleCB8PSAoKGkgKyAxKSA8PCAyNCk7DQorICAgICAgICBpZiAocHBGb250ICE9IE5VTEwpIHsNCisgICAgICAgICAgKnBwRm9udCA9IHBGb250Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGlHbHlwaEluZGV4Ow0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKG1fcEZvbnRNZ3IgIT0gTlVMTCAmJiBiUmVjdXJzaXZlKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRmFtaWx5Ow0KKyAgICBHZXRGYW1pbHlOYW1lKHdzRmFtaWx5KTsNCisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KKyAgICBJRlhfRm9udCogcEZvbnQgPSBtX3BGb250TWdyLT5HZXREZWZGb250QnlVbmljb2RlKA0KKyAgICAgICAgd1VuaWNvZGUsIEdldEZvbnRTdHlsZXMoKSwgKGNvbnN0IEZYX1dDSEFSKil3c0ZhbWlseSk7DQorI2Vsc2UNCisgICAgSUZYX0ZvbnQqIHBGb250ID0gbV9wRm9udE1nci0+R2V0Rm9udEJ5VW5pY29kZSh3VW5pY29kZSwgR2V0Rm9udFN0eWxlcygpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBGWF9XQ0hBUiopd3NGYW1pbHkpOw0KKyAgICBpZiAoTlVMTCA9PSBwRm9udCkgew0KKyAgICAgIHBGb250ID0gbV9wRm9udE1nci0+R2V0Rm9udEJ5VW5pY29kZSh3VW5pY29kZSwgR2V0Rm9udFN0eWxlcygpLCBOVUxMKTsNCisgICAgfQ0KKyNlbmRpZg0KKyAgICBpZiAocEZvbnQgIT0gTlVMTCkgew0KKyAgICAgIGlmIChwRm9udCA9PSAoSUZYX0ZvbnQqKXRoaXMpIHsNCisgICAgICAgIHBGb250LT5SZWxlYXNlKCk7DQorICAgICAgICByZXR1cm4gMHhGRkZGOw0KKyAgICAgIH0NCisgICAgICBtX0ZvbnRNYXBwZXIuU2V0QXQoKHZvaWQqKSh1aW50cHRyX3Qpd1VuaWNvZGUsICh2b2lkKilwRm9udCk7DQorICAgICAgaW50MzJfdCBpID0gbV9TdWJzdEZvbnRzLkdldFNpemUoKTsNCisgICAgICBtX1N1YnN0Rm9udHMuQWRkKHBGb250KTsNCisgICAgICBpR2x5cGhJbmRleCA9DQorICAgICAgICAgICgoQ0ZYX0dFRm9udCopcEZvbnQpLT5HZXRHbHlwaEluZGV4KHdVbmljb2RlLCBGQUxTRSwgTlVMTCwgYkNoYXJDb2RlKTsNCisgICAgICBpZiAoaUdseXBoSW5kZXggIT0gMHhGRkZGKSB7DQorICAgICAgICBpR2x5cGhJbmRleCB8PSAoKGkgKyAxKSA8PCAyNCk7DQorICAgICAgICBpZiAocHBGb250ICE9IE5VTEwpIHsNCisgICAgICAgICAgKnBwRm9udCA9IHBGb250Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGlHbHlwaEluZGV4Ow0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIDB4RkZGRjsNCit9DQoraW50MzJfdCBDRlhfR0VGb250OjpHZXRBc2NlbnQoKSBjb25zdCB7DQorICByZXR1cm4gbV9wRm9udC0+R2V0QXNjZW50KCk7DQorfQ0KK2ludDMyX3QgQ0ZYX0dFRm9udDo6R2V0RGVzY2VudCgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BGb250LT5HZXREZXNjZW50KCk7DQorfQ0KK3ZvaWQgQ0ZYX0dFRm9udDo6UmVzZXQoKSB7DQorICBMb2NrKCk7DQorICBpbnQzMl90IGlDb3VudCA9IG1fU3Vic3RGb250cy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBJRlhfRm9udCogcEZvbnQgPSAoSUZYX0ZvbnQqKW1fU3Vic3RGb250c1tpXTsNCisgICAgKChDRlhfR0VGb250KilwRm9udCktPlJlc2V0KCk7DQorICB9DQorICBpZiAobV9wQ2hhcldpZHRoTWFwICE9IE5VTEwpIHsNCisgICAgbV9wQ2hhcldpZHRoTWFwLT5SZW1vdmVBbGwoKTsNCisgIH0NCisgIGlmIChtX3BCQm94TWFwICE9IE5VTEwpIHsNCisgICAgbV9wQkJveE1hcC0+UmVtb3ZlQWxsKCk7DQorICB9DQorICBpZiAobV9wUmVjdEFycmF5ICE9IE5VTEwpIHsNCisgICAgbV9wUmVjdEFycmF5LT5SZW1vdmVBbGwoKTsNCisgIH0NCisgIFVubG9jaygpOw0KK30NCitJRlhfRm9udCogQ0ZYX0dFRm9udDo6R2V0U3Vic3RGb250KGludDMyX3QgaUdseXBoSW5kZXgpIGNvbnN0IHsNCisgIGlHbHlwaEluZGV4ID0gKChGWF9EV09SRClpR2x5cGhJbmRleCkgPj4gMjQ7DQorICByZXR1cm4gaUdseXBoSW5kZXggPT0gMCA/IChJRlhfRm9udCopdGhpcw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoSUZYX0ZvbnQqKW1fU3Vic3RGb250c1tpR2x5cGhJbmRleCAtIDFdOw0KK30NCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfZ2Vmb250LmggYi94ZmEvc3JjL2ZnYXMvc3JjL2ZvbnQvZnhfZ2Vmb250LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1Y2ZmYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9nZWZvbnQuaApAQCAtMCwwICsxLDkwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYX0dSQVBIT0JKU19JTVANCisjZGVmaW5lIF9GWF9HUkFQSE9CSlNfSU1QDQorI2lmbmRlZiBfRlhQTFVTDQorY2xhc3MgQ0ZYX0dFRm9udE1ncjsNCisjaWZuZGVmIEZYRk9OVF9TVUJTVF9JVEFMSUMNCisjZGVmaW5lIEZYRk9OVF9TVUJTVF9JVEFMSUMgMHgwMg0KKyNlbmRpZg0KK2NsYXNzIENGWF9HRUZvbnQgOiBwdWJsaWMgSUZYX0ZvbnQsIHB1YmxpYyBDRlhfVGhyZWFkTG9jayB7DQorIHB1YmxpYzoNCisgIENGWF9HRUZvbnQoY29uc3QgQ0ZYX0dFRm9udCYgc3JjLCBGWF9EV09SRCBkd0ZvbnRTdHlsZXMpOw0KKyAgQ0ZYX0dFRm9udChJRlhfRm9udE1nciogcEZvbnRNZ3IpOw0KKyAgfkNGWF9HRUZvbnQoKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCk7DQorICB2aXJ0dWFsIElGWF9Gb250KiBSZXRhaW4oKTsNCisgIEZYX0JPT0wgTG9hZEZvbnQoY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHksDQorICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UpOw0KKyAgRlhfQk9PTCBMb2FkRm9udChjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGxlbmd0aCk7DQorICBGWF9CT09MIExvYWRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGaWxlTmFtZSk7DQorICBGWF9CT09MIExvYWRGb250KElGWF9TdHJlYW0qIHBGb250U3RyZWFtLCBGWF9CT09MIGJTYXZlU3RyZWFtKTsNCisgIEZYX0JPT0wgTG9hZEZvbnQoQ0ZYX0ZvbnQqIHBFeHRGb250LCBGWF9CT09MIGJUYWtlT3ZlciA9IEZBTFNFKTsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIERlcml2ZShGWF9EV09SRCBkd0ZvbnRTdHlsZXMsIEZYX1dPUkQgd0NvZGVQYWdlID0gMCk7DQorICB2aXJ0dWFsIHZvaWQgR2V0RmFtaWx5TmFtZShDRlhfV2lkZVN0cmluZyYgd3NGYW1pbHkpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEdldFBzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NOYW1lKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Rm9udFN0eWxlcygpIGNvbnN0Ow0KKyAgdmlydHVhbCB1aW50OF90IEdldENoYXJTZXQoKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRDaGFyV2lkdGgoRlhfV0NIQVIgd1VuaWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0R2x5cGhJbmRleChGWF9XQ0hBUiB3VW5pY29kZSwgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0QXNjZW50KCkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0RGVzY2VudCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9CT09MIEdldENoYXJCQm94KEZYX1dDSEFSIHdVbmljb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0JiBiYm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UpOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldEJCb3goQ0ZYX1JlY3QmIGJib3gpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEl0YWxpY0FuZ2xlKCkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgUmVzZXQoKTsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIEdldFN1YnN0Rm9udChpbnQzMl90IGlHbHlwaEluZGV4KSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCogR2V0RGV2Rm9udCgpIGNvbnN0IHsgcmV0dXJuICh2b2lkKiltX3BGb250OyB9DQorICB2aXJ0dWFsIHZvaWQgU2V0Rm9udFByb3ZpZGVyKElGWF9Gb250UHJvdmlkZXIqIHBQcm92aWRlcikgew0KKyAgICBtX3BQcm92aWRlciA9IHBQcm92aWRlcjsNCisgIH0NCisjaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KKyAgdmlydHVhbCB2b2lkIFNldExvZ2ljYWxGb250U3R5bGUoRlhfRFdPUkQgZHdMb2dGb250U3R5bGUpIHsNCisgICAgbV9iVXNlTG9nRm9udFN0eWxlID0gVFJVRTsNCisgICAgbV9kd0xvZ0ZvbnRTdHlsZSA9IGR3TG9nRm9udFN0eWxlOw0KKyAgfTsNCisjZW5kaWYNCisgcHJvdGVjdGVkOg0KKyNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQorICBGWF9CT09MIG1fYlVzZUxvZ0ZvbnRTdHlsZTsNCisgIEZYX0RXT1JEIG1fZHdMb2dGb250U3R5bGU7DQorI2VuZGlmDQorICBDRlhfRm9udCogbV9wRm9udDsNCisgIElGWF9Gb250TWdyKiBtX3BGb250TWdyOw0KKyAgaW50MzJfdCBtX2lSZWZDb3VudDsNCisgIEZYX0JPT0wgbV9iRXh0Rm9udDsNCisgIElGWF9TdHJlYW0qIG1fcFN0cmVhbTsNCisgIElGWF9GaWxlUmVhZCogbV9wRmlsZVJlYWQ7DQorICBDRlhfVW5pY29kZUVuY29kaW5nKiBtX3BGb250RW5jb2Rpbmc7DQorICBDRlhfV29yZERpc2NyZXRlQXJyYXkqIG1fcENoYXJXaWR0aE1hcDsNCisgIENGWF9SZWN0TWFzc0FycmF5KiBtX3BSZWN0QXJyYXk7DQorICBDRlhfTWFwUHRyVG9QdHIqIG1fcEJCb3hNYXA7DQorICBJRlhfRm9udFByb3ZpZGVyKiBtX3BQcm92aWRlcjsNCisgIEZYX1dPUkQgbV93Q2hhclNldDsNCisgIENGWF9QdHJBcnJheSBtX1N1YnN0Rm9udHM7DQorICBDRlhfTWFwUHRyVG9QdHIgbV9Gb250TWFwcGVyOw0KKyAgRlhfQk9PTCBJbml0Rm9udCgpOw0KKyAgRlhfQk9PTCBHZXRDaGFyQkJveChGWF9XQ0hBUiB3VW5pY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3QmIGJib3gsDQorICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlY3Vyc2l2ZSwNCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckNvZGUgPSBGQUxTRSk7DQorICBGWF9CT09MIEdldENoYXJXaWR0aChGWF9XQ0hBUiB3VW5pY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlY3Vyc2l2ZSwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UpOw0KKyAgaW50MzJfdCBHZXRHbHlwaEluZGV4KEZYX1dDSEFSIHdVbmljb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlY3Vyc2l2ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRm9udCoqIHBwRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFKTsNCit9Ow0KKyNlbmRpZg0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9zdGRmb250bWdyLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9zdGRmb250bWdyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjAxMDIyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X3N0ZGZvbnRtZ3IuY3BwCkBAIC0wLDAgKzEsMTQ2MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mZ2FzL3NyYy9mZ2FzX2Jhc2UuaCINCisjaW5jbHVkZSAiZnhfc3RkZm9udG1nci5oIg0KKyNpbmNsdWRlICJmeF9mb250dXRpbHMuaCINCisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KK0lGWF9Gb250TWdyKiBJRlhfRm9udE1ncjo6Q3JlYXRlKEZYX0xQRW51bUFsbEZvbnRzIHBFbnVtZXJhdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0xQTWF0Y2hGb250IHBNYXRjaGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBVc2VyRGF0YSkgew0KKyAgcmV0dXJuIG5ldyBDRlhfU3RkRm9udE1nckltcChwRW51bWVyYXRvciwgcE1hdGNoZXIsIHBVc2VyRGF0YSk7DQorfQ0KK0NGWF9TdGRGb250TWdySW1wOjpDRlhfU3RkRm9udE1nckltcChGWF9MUEVudW1BbGxGb250cyBwRW51bWVyYXRvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTFBNYXRjaEZvbnQgcE1hdGNoZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBVc2VyRGF0YSkNCisgICAgOiBtX3BNYXRjaGVyKHBNYXRjaGVyKSwNCisgICAgICBtX3BFbnVtZXJhdG9yKHBFbnVtZXJhdG9yKSwNCisgICAgICBtX0ZvbnRGYWNlcygpLA0KKyAgICAgIG1fRm9udHMoKSwNCisgICAgICBtX0NQRm9udHMoOCksDQorICAgICAgbV9GYW1pbHlGb250cygxNiksDQorICAgICAgbV9Vbmljb2RlRm9udHMoMTYpLA0KKyAgICAgIG1fQnVmZmVyRm9udHMoNCksDQorICAgICAgbV9GaWxlRm9udHMoNCksDQorICAgICAgbV9TdHJlYW1Gb250cyg0KSwNCisgICAgICBtX0Rlcml2ZUZvbnRzKDQpLA0KKyAgICAgIG1fcFVzZXJEYXRhKHBVc2VyRGF0YSkgew0KKyAgaWYgKG1fcEVudW1lcmF0b3IgIT0gTlVMTCkgew0KKyAgICBtX3BFbnVtZXJhdG9yKG1fRm9udEZhY2VzLCBtX3BVc2VyRGF0YSwgTlVMTCwgMHhGRUZGKTsNCisgIH0NCisgIGlmIChtX3BNYXRjaGVyID09IE5VTEwpIHsNCisgICAgbV9wTWF0Y2hlciA9IEZYX0RlZkZvbnRNYXRjaGVyOw0KKyAgfQ0KKyAgRlhTWVNfYXNzZXJ0KG1fcE1hdGNoZXIgIT0gTlVMTCk7DQorfQ0KK0NGWF9TdGRGb250TWdySW1wOjp+Q0ZYX1N0ZEZvbnRNZ3JJbXAoKSB7DQorICBtX0ZvbnRGYWNlcy5SZW1vdmVBbGwoKTsNCisgIG1fQ1BGb250cy5SZW1vdmVBbGwoKTsNCisgIG1fRmFtaWx5Rm9udHMuUmVtb3ZlQWxsKCk7DQorICBtX1VuaWNvZGVGb250cy5SZW1vdmVBbGwoKTsNCisgIG1fQnVmZmVyRm9udHMuUmVtb3ZlQWxsKCk7DQorICBtX0ZpbGVGb250cy5SZW1vdmVBbGwoKTsNCisgIG1fU3RyZWFtRm9udHMuUmVtb3ZlQWxsKCk7DQorICBtX0Rlcml2ZUZvbnRzLlJlbW92ZUFsbCgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSBtX0ZvbnRzLkdldFVwcGVyQm91bmQoKTsgaSA+PSAwOyBpLS0pIHsNCisgICAgSUZYX0ZvbnQqIHBGb250ID0gKElGWF9Gb250KiltX0ZvbnRzW2ldOw0KKyAgICBpZiAocEZvbnQgIT0gTlVMTCkgew0KKyAgICAgIHBGb250LT5SZWxlYXNlKCk7DQorICAgIH0NCisgIH0NCisgIG1fRm9udHMuUmVtb3ZlQWxsKCk7DQorfQ0KK0lGWF9Gb250KiBDRlhfU3RkRm9udE1nckltcDo6R2V0RGVmRm9udEJ5Q29kZVBhZ2UoDQorICAgIEZYX1dPUkQgd0NvZGVQYWdlLA0KKyAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5KSB7DQorICBGWF9EV09SRCBkd0hhc2ggPSBGR0FTX0dldEZvbnRIYXNoQ29kZSh3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcyk7DQorICBJRlhfRm9udCogcEZvbnQgPSBOVUxMOw0KKyAgaWYgKG1fQ1BGb250cy5Mb29rdXAoKHZvaWQqKSh1aW50cHRyX3QpZHdIYXNoLCAodm9pZComKXBGb250KSkgew0KKyAgICByZXR1cm4gcEZvbnQgPyBMb2FkRm9udChwRm9udCwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpIDogTlVMTDsNCisgIH0NCisgIEZYX0xQQ0ZPTlRERVNDUklQVE9SIHBGRDsNCisgIGlmICgocEZEID0gRmluZEZvbnQocHN6Rm9udEZhbWlseSwgZHdGb250U3R5bGVzLCBUUlVFLCB3Q29kZVBhZ2UpKSA9PSBOVUxMKQ0KKyAgICBpZiAoKHBGRCA9IEZpbmRGb250KE5VTEwsIGR3Rm9udFN0eWxlcywgVFJVRSwgd0NvZGVQYWdlKSkgPT0gTlVMTCkNCisgICAgICBpZiAoKHBGRCA9IEZpbmRGb250KE5VTEwsIGR3Rm9udFN0eWxlcywgRkFMU0UsIHdDb2RlUGFnZSkpID09IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0NCisgIEZYU1lTX2Fzc2VydChwRkQgIT0gTlVMTCk7DQorICBwRm9udCA9IElGWF9Gb250OjpMb2FkRm9udChwRkQtPndzRm9udEZhY2UsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlLCB0aGlzKTsNCisgIGlmIChwRm9udCAhPSBOVUxMKSB7DQorICAgIG1fRm9udHMuQWRkKHBGb250KTsNCisgICAgbV9DUEZvbnRzLlNldEF0KCh2b2lkKikodWludHB0cl90KWR3SGFzaCwgKHZvaWQqKXBGb250KTsNCisgICAgZHdIYXNoID0gRkdBU19HZXRGb250RmFtaWx5SGFzaChwRkQtPndzRm9udEZhY2UsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKTsNCisgICAgbV9GYW1pbHlGb250cy5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKilwRm9udCk7DQorICAgIHJldHVybiBMb2FkRm9udChwRm9udCwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0lGWF9Gb250KiBDRlhfU3RkRm9udE1nckltcDo6R2V0RGVmRm9udEJ5Q2hhcnNldCgNCisgICAgdWludDhfdCBuQ2hhcnNldCwNCisgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSkgew0KKyAgcmV0dXJuIEdldERlZkZvbnRCeUNvZGVQYWdlKEZYX0dldENvZGVQYWdlRnJvbUNoYXJzZXQobkNoYXJzZXQpLCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN6Rm9udEZhbWlseSk7DQorfQ0KKyNkZWZpbmUgX0ZYX1VTRUdBU0ZPTlRNR1JfDQorSUZYX0ZvbnQqIENGWF9TdGRGb250TWdySW1wOjpHZXREZWZGb250QnlVbmljb2RlKA0KKyAgICBGWF9XQ0hBUiB3VW5pY29kZSwNCisgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSkgew0KKyAgRkdBU19MUENGT05UVVNCIHBSZXQgPSBGR0FTX0dldFVuaWNvZGVCaXRGaWVsZCh3VW5pY29kZSk7DQorICBpZiAocFJldC0+d0JpdEZpZWxkID09IDk5OSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIEZYX0RXT1JEIGR3SGFzaCA9DQorICAgICAgRkdBU19HZXRGb250RmFtaWx5SGFzaChwc3pGb250RmFtaWx5LCBkd0ZvbnRTdHlsZXMsIHBSZXQtPndCaXRGaWVsZCk7DQorICBJRlhfRm9udCogcEZvbnQgPSBOVUxMOw0KKyAgaWYgKG1fVW5pY29kZUZvbnRzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKiYpcEZvbnQpKSB7DQorICAgIHJldHVybiBwRm9udCA/IExvYWRGb250KHBGb250LCBkd0ZvbnRTdHlsZXMsIHBSZXQtPndDb2RlUGFnZSkgOiBOVUxMOw0KKyAgfQ0KKyNpZmRlZiBfRlhfVVNFR0FTRk9OVE1HUl8NCisgIEZYX0xQQ0ZPTlRERVNDUklQVE9SIHBGRCA9DQorICAgICAgRmluZEZvbnQocHN6Rm9udEZhbWlseSwgZHdGb250U3R5bGVzLCBGQUxTRSwgcFJldC0+d0NvZGVQYWdlLA0KKyAgICAgICAgICAgICAgIHBSZXQtPndCaXRGaWVsZCwgd1VuaWNvZGUpOw0KKyAgaWYgKHBGRCA9PSBOVUxMICYmIHBzekZvbnRGYW1pbHkpIHsNCisgICAgcEZEID0gRmluZEZvbnQoTlVMTCwgZHdGb250U3R5bGVzLCBGQUxTRSwgcFJldC0+d0NvZGVQYWdlLCBwUmV0LT53Qml0RmllbGQsDQorICAgICAgICAgICAgICAgICAgIHdVbmljb2RlKTsNCisgIH0NCisgIGlmIChwRkQgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIEZYU1lTX2Fzc2VydChwRkQpOw0KKyAgRlhfV09SRCB3Q29kZVBhZ2UgPSBGWF9HZXRDb2RlUGFnZUZyb21DaGFyc2V0KHBGRC0+dUNoYXJTZXQpOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBGb250RmFjZSA9IHBGRC0+d3NGb250RmFjZTsNCisgIHBGb250ID0gSUZYX0ZvbnQ6OkxvYWRGb250KHBGb250RmFjZSwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UsIHRoaXMpOw0KKyNlbHNlDQorICBDRlhfRm9udE1hcHBlciogcEJ1aWx0aW5NYXBwZXIgPQ0KKyAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+bV9wQnVpbHRpbk1hcHBlcjsNCisgIGlmIChwQnVpbHRpbk1hcHBlciA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaW50MzJfdCBpV2VpZ2h0ID0NCisgICAgICAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0JvbGQpID8gRlhGT05UX0ZXX0JPTEQgOiBGWEZPTlRfRldfTk9STUFMOw0KKyAgaW50IGl0YWxpY19hbmdsZSA9IDA7DQorICBGWEZUX0ZhY2UgZnRGYWNlID0gcEJ1aWx0aW5NYXBwZXItPkZpbmRTdWJzdEZvbnRCeVVuaWNvZGUoDQorICAgICAgd1VuaWNvZGUsIGR3Rm9udFN0eWxlcywgaVdlaWdodCwgaXRhbGljX2FuZ2xlKTsNCisgIGlmIChmdEZhY2UgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENGWF9Gb250KiBwRlhGb250ID0gbmV3IENGWF9Gb250Ow0KKyAgcEZYRm9udC0+bV9GYWNlID0gZnRGYWNlOw0KKyAgcEZYRm9udC0+bV9wRm9udERhdGEgPSBGWEZUX0dldF9GYWNlX1N0cmVhbV9CYXNlKGZ0RmFjZSk7DQorICBwRlhGb250LT5tX2R3U2l6ZSA9IEZYRlRfR2V0X0ZhY2VfU3RyZWFtX1NpemUoZnRGYWNlKTsNCisgIHBGb250ID0gSUZYX0ZvbnQ6OkxvYWRGb250KHBGWEZvbnQsIHRoaXMpOw0KKyAgRlhfV09SRCB3Q29kZVBhZ2UgPSBwUmV0LT53Q29kZVBhZ2U7DQorICBDRlhfV2lkZVN0cmluZyB3c1BzTmFtZSA9IHBGWEZvbnQtPkdldFBzTmFtZSgpOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBGb250RmFjZSA9IHdzUHNOYW1lOw0KKyNlbmRpZg0KKyAgaWYgKHBGb250ICE9IE5VTEwpIHsNCisgICAgbV9Gb250cy5BZGQocEZvbnQpOw0KKyAgICBtX1VuaWNvZGVGb250cy5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKilwRm9udCk7DQorICAgIGR3SGFzaCA9IEZHQVNfR2V0Rm9udEhhc2hDb2RlKHdDb2RlUGFnZSwgZHdGb250U3R5bGVzKTsNCisgICAgbV9DUEZvbnRzLlNldEF0KCh2b2lkKikodWludHB0cl90KWR3SGFzaCwgKHZvaWQqKXBGb250KTsNCisgICAgZHdIYXNoID0gRkdBU19HZXRGb250RmFtaWx5SGFzaChwRm9udEZhY2UsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKTsNCisgICAgbV9GYW1pbHlGb250cy5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKilwRm9udCk7DQorICAgIHJldHVybiBMb2FkRm9udChwRm9udCwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0lGWF9Gb250KiBDRlhfU3RkRm9udE1nckltcDo6R2V0RGVmRm9udEJ5TGFuZ3VhZ2UoDQorICAgIEZYX1dPUkQgd0xhbmd1YWdlLA0KKyAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5KSB7DQorICByZXR1cm4gR2V0RGVmRm9udEJ5Q29kZVBhZ2UoRlhfR2V0RGVmQ29kZVBhZ2VCeUxhbmd1YWdlKHdMYW5ndWFnZSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdGb250U3R5bGVzLCBwc3pGb250RmFtaWx5KTsNCit9DQorSUZYX0ZvbnQqIENGWF9TdGRGb250TWdySW1wOjpMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlKSB7DQorICBGWF9EV09SRCBkd0hhc2ggPQ0KKyAgICAgIEZHQVNfR2V0Rm9udEZhbWlseUhhc2gocHN6Rm9udEZhbWlseSwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOw0KKyAgSUZYX0ZvbnQqIHBGb250ID0gTlVMTDsNCisgIGlmIChtX0ZhbWlseUZvbnRzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKiYpcEZvbnQpKSB7DQorICAgIHJldHVybiBwRm9udCA/IExvYWRGb250KHBGb250LCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSkgOiBOVUxMOw0KKyAgfQ0KKyAgRlhfTFBDRk9OVERFU0NSSVBUT1IgcEZEID0gTlVMTDsNCisgIGlmICgocEZEID0gRmluZEZvbnQocHN6Rm9udEZhbWlseSwgZHdGb250U3R5bGVzLCBUUlVFLCB3Q29kZVBhZ2UpKSA9PSBOVUxMKQ0KKyAgICBpZiAoKHBGRCA9IEZpbmRGb250KHBzekZvbnRGYW1pbHksIGR3Rm9udFN0eWxlcywgRkFMU0UsIHdDb2RlUGFnZSkpID09DQorICAgICAgICBOVUxMKSB7DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgIEZYU1lTX2Fzc2VydChwRkQgIT0gTlVMTCk7DQorICBpZiAod0NvZGVQYWdlID09IDB4RkZGRikgew0KKyAgICB3Q29kZVBhZ2UgPSBGWF9HZXRDb2RlUGFnZUZyb21DaGFyc2V0KHBGRC0+dUNoYXJTZXQpOw0KKyAgfQ0KKyAgcEZvbnQgPSBJRlhfRm9udDo6TG9hZEZvbnQocEZELT53c0ZvbnRGYWNlLCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSwgdGhpcyk7DQorICBpZiAocEZvbnQgIT0gTlVMTCkgew0KKyAgICBtX0ZvbnRzLkFkZChwRm9udCk7DQorICAgIG1fRmFtaWx5Rm9udHMuU2V0QXQoKHZvaWQqKSh1aW50cHRyX3QpZHdIYXNoLCAodm9pZCopcEZvbnQpOw0KKyAgICBkd0hhc2ggPSBGR0FTX0dldEZvbnRIYXNoQ29kZSh3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcyk7DQorICAgIG1fQ1BGb250cy5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKilwRm9udCk7DQorICAgIHJldHVybiBMb2FkRm9udChwRm9udCwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0lGWF9Gb250KiBDRlhfU3RkRm9udE1nckltcDo6TG9hZEZvbnQoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpTGVuZ3RoKSB7DQorICBGWFNZU19hc3NlcnQocEJ1ZmZlciAhPSBOVUxMICYmIGlMZW5ndGggPiAwKTsNCisgIElGWF9Gb250KiBwRm9udCA9IE5VTEw7DQorICBpZiAobV9CdWZmZXJGb250cy5Mb29rdXAoKHZvaWQqKXBCdWZmZXIsICh2b2lkKiYpcEZvbnQpKSB7DQorICAgIGlmIChwRm9udCAhPSBOVUxMKSB7DQorICAgICAgcmV0dXJuIHBGb250LT5SZXRhaW4oKTsNCisgICAgfQ0KKyAgfQ0KKyAgcEZvbnQgPSBJRlhfRm9udDo6TG9hZEZvbnQocEJ1ZmZlciwgaUxlbmd0aCwgdGhpcyk7DQorICBpZiAocEZvbnQgIT0gTlVMTCkgew0KKyAgICBtX0ZvbnRzLkFkZChwRm9udCk7DQorICAgIG1fQnVmZmVyRm9udHMuU2V0QXQoKHZvaWQqKXBCdWZmZXIsIHBGb250KTsNCisgICAgcmV0dXJuIHBGb250LT5SZXRhaW4oKTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitJRlhfRm9udCogQ0ZYX1N0ZEZvbnRNZ3JJbXA6OkxvYWRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGaWxlTmFtZSkgew0KKyAgRlhTWVNfYXNzZXJ0KHBzekZpbGVOYW1lICE9IE5VTEwpOw0KKyAgRlhfRFdPUkQgZHdIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcocHN6RmlsZU5hbWUsIC0xKTsNCisgIElGWF9Gb250KiBwRm9udCA9IE5VTEw7DQorICBpZiAobV9GaWxlRm9udHMuTG9va3VwKCh2b2lkKikodWludHB0cl90KWR3SGFzaCwgKHZvaWQqJilwRm9udCkpIHsNCisgICAgaWYgKHBGb250ICE9IE5VTEwpIHsNCisgICAgICByZXR1cm4gcEZvbnQtPlJldGFpbigpOw0KKyAgICB9DQorICB9DQorICBwRm9udCA9IElGWF9Gb250OjpMb2FkRm9udChwc3pGaWxlTmFtZSwgTlVMTCk7DQorICBpZiAocEZvbnQgIT0gTlVMTCkgew0KKyAgICBtX0ZvbnRzLkFkZChwRm9udCk7DQorICAgIG1fRmlsZUZvbnRzLlNldEF0KCh2b2lkKikodWludHB0cl90KWR3SGFzaCwgKHZvaWQqKXBGb250KTsNCisgICAgcmV0dXJuIHBGb250LT5SZXRhaW4oKTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitJRlhfRm9udCogQ0ZYX1N0ZEZvbnRNZ3JJbXA6OkxvYWRGb250KElGWF9TdHJlYW0qIHBGb250U3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRBbGlhcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVN0cmVhbSkgew0KKyAgRlhTWVNfYXNzZXJ0KHBGb250U3RyZWFtICE9IE5VTEwgJiYgcEZvbnRTdHJlYW0tPkdldExlbmd0aCgpID4gMCk7DQorICBJRlhfRm9udCogcEZvbnQgPSBOVUxMOw0KKyAgaWYgKG1fU3RyZWFtRm9udHMuTG9va3VwKCh2b2lkKilwRm9udFN0cmVhbSwgKHZvaWQqJilwRm9udCkpIHsNCisgICAgaWYgKHBGb250ICE9IE5VTEwpIHsNCisgICAgICBpZiAocHN6Rm9udEFsaWFzICE9IE5VTEwpIHsNCisgICAgICAgIEZYX0RXT1JEIGR3SGFzaCA9DQorICAgICAgICAgICAgRkdBU19HZXRGb250RmFtaWx5SGFzaChwc3pGb250QWxpYXMsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKTsNCisgICAgICAgIG1fRmFtaWx5Rm9udHMuU2V0QXQoKHZvaWQqKSh1aW50cHRyX3QpZHdIYXNoLCAodm9pZCopcEZvbnQpOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gTG9hZEZvbnQocEZvbnQsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKTsNCisgICAgfQ0KKyAgfQ0KKyAgcEZvbnQgPSBJRlhfRm9udDo6TG9hZEZvbnQocEZvbnRTdHJlYW0sIHRoaXMsIGJTYXZlU3RyZWFtKTsNCisgIGlmIChwRm9udCAhPSBOVUxMKSB7DQorICAgIG1fRm9udHMuQWRkKHBGb250KTsNCisgICAgbV9TdHJlYW1Gb250cy5TZXRBdCgodm9pZCopcEZvbnRTdHJlYW0sICh2b2lkKilwRm9udCk7DQorICAgIGlmIChwc3pGb250QWxpYXMgIT0gTlVMTCkgew0KKyAgICAgIEZYX0RXT1JEIGR3SGFzaCA9DQorICAgICAgICAgIEZHQVNfR2V0Rm9udEZhbWlseUhhc2gocHN6Rm9udEFsaWFzLCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7DQorICAgICAgbV9GYW1pbHlGb250cy5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKilwRm9udCk7DQorICAgIH0NCisgICAgcmV0dXJuIExvYWRGb250KHBGb250LCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorSUZYX0ZvbnQqIENGWF9TdGRGb250TWdySW1wOjpMb2FkRm9udChJRlhfRm9udCogcFNyY0ZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSkgew0KKyAgRlhTWVNfYXNzZXJ0KHBTcmNGb250ICE9IE5VTEwpOw0KKyAgaWYgKHBTcmNGb250LT5HZXRGb250U3R5bGVzKCkgPT0gZHdGb250U3R5bGVzKSB7DQorICAgIHJldHVybiBwU3JjRm9udC0+UmV0YWluKCk7DQorICB9DQorICB2b2lkKiBidWZmZXJbM10gPSB7cFNyY0ZvbnQsICh2b2lkKikodWludHB0cl90KWR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAodm9pZCopKHVpbnRwdHJfdCl3Q29kZVBhZ2V9Ow0KKyAgRlhfRFdPUkQgZHdIYXNoID0NCisgICAgICBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0QSgoY29uc3QgRlhfQ0hBUiopYnVmZmVyLCAzICogc2l6ZW9mKHZvaWQqKSk7DQorICBJRlhfRm9udCogcEZvbnQgPSBOVUxMOw0KKyAgaWYgKG1fRGVyaXZlRm9udHMuR2V0Q291bnQoKSA+IDApIHsNCisgICAgbV9EZXJpdmVGb250cy5Mb29rdXAoKHZvaWQqKSh1aW50cHRyX3QpZHdIYXNoLCAodm9pZComKXBGb250KTsNCisgICAgaWYgKHBGb250ICE9IE5VTEwpIHsNCisgICAgICByZXR1cm4gcEZvbnQtPlJldGFpbigpOw0KKyAgICB9DQorICB9DQorICBwRm9udCA9IHBTcmNGb250LT5EZXJpdmUoZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOw0KKyAgaWYgKHBGb250ICE9IE5VTEwpIHsNCisgICAgbV9EZXJpdmVGb250cy5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKilwRm9udCk7DQorICAgIGludDMyX3QgaW5kZXggPSBtX0ZvbnRzLkZpbmQocEZvbnQpOw0KKyAgICBpZiAoaW5kZXggPCAwKSB7DQorICAgICAgbV9Gb250cy5BZGQocEZvbnQpOw0KKyAgICAgIHBGb250LT5SZXRhaW4oKTsNCisgICAgfQ0KKyAgICByZXR1cm4gcEZvbnQ7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQordm9pZCBDRlhfU3RkRm9udE1nckltcDo6Q2xlYXJGb250Q2FjaGUoKSB7DQorICBpbnQzMl90IGlDb3VudCA9IG1fRm9udHMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgSUZYX0ZvbnQqIHBGb250ID0gKElGWF9Gb250KiltX0ZvbnRzW2ldOw0KKyAgICBpZiAocEZvbnQgIT0gTlVMTCkgew0KKyAgICAgIHBGb250LT5SZXNldCgpOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0ZYX1N0ZEZvbnRNZ3JJbXA6OlJlbW92ZUZvbnQoQ0ZYX01hcFB0clRvUHRyJiBmb250TWFwLCBJRlhfRm9udCogcEZvbnQpIHsNCisgIEZYX1BPU0lUSU9OIHBvcyA9IGZvbnRNYXAuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgdm9pZCogcEtleTsNCisgIHZvaWQqIHBGaW5kOw0KKyAgd2hpbGUgKHBvcyAhPSBOVUxMKSB7DQorICAgIHBGaW5kID0gTlVMTDsNCisgICAgZm9udE1hcC5HZXROZXh0QXNzb2MocG9zLCBwS2V5LCBwRmluZCk7DQorICAgIGlmIChwRmluZCAhPSAodm9pZCopcEZvbnQpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBmb250TWFwLlJlbW92ZUtleShwS2V5KTsNCisgICAgYnJlYWs7DQorICB9DQorfQ0KK3ZvaWQgQ0ZYX1N0ZEZvbnRNZ3JJbXA6OlJlbW92ZUZvbnQoSUZYX0ZvbnQqIHBGb250KSB7DQorICBSZW1vdmVGb250KG1fQ1BGb250cywgcEZvbnQpOw0KKyAgUmVtb3ZlRm9udChtX0ZhbWlseUZvbnRzLCBwRm9udCk7DQorICBSZW1vdmVGb250KG1fVW5pY29kZUZvbnRzLCBwRm9udCk7DQorICBSZW1vdmVGb250KG1fQnVmZmVyRm9udHMsIHBGb250KTsNCisgIFJlbW92ZUZvbnQobV9GaWxlRm9udHMsIHBGb250KTsNCisgIFJlbW92ZUZvbnQobV9TdHJlYW1Gb250cywgcEZvbnQpOw0KKyAgUmVtb3ZlRm9udChtX0Rlcml2ZUZvbnRzLCBwRm9udCk7DQorICBpbnQzMl90IGlGaW5kID0gbV9Gb250cy5GaW5kKHBGb250KTsNCisgIGlmIChpRmluZCA+IC0xKSB7DQorICAgIG1fRm9udHMuUmVtb3ZlQXQoaUZpbmQsIDEpOw0KKyAgfQ0KK30NCitGWF9MUENGT05UREVTQ1JJUFRPUiBDRlhfU3RkRm9udE1nckltcDo6RmluZEZvbnQoY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdNYXRjaEZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdVU0IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIHdVbmljb2RlKSB7DQorICBpZiAobV9wTWF0Y2hlciA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgRlhfRk9OVE1BVENIUEFSQU1TIHBhcmFtczsNCisgIEZYX21lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7DQorICBwYXJhbXMuZHdVU0IgPSBkd1VTQjsNCisgIHBhcmFtcy53VW5pY29kZSA9IHdVbmljb2RlOw0KKyAgcGFyYW1zLndDb2RlUGFnZSA9IHdDb2RlUGFnZTsNCisgIHBhcmFtcy5wd3NGYW1pbHkgPSBwc3pGb250RmFtaWx5Ow0KKyAgcGFyYW1zLmR3Rm9udFN0eWxlcyA9IGR3Rm9udFN0eWxlczsNCisgIHBhcmFtcy5kd01hdGNoRmxhZ3MgPSBkd01hdGNoRmxhZ3M7DQorICBGWF9MUENGT05UREVTQ1JJUFRPUiBwRGVzYyA9IG1fcE1hdGNoZXIoJnBhcmFtcywgbV9Gb250RmFjZXMsIG1fcFVzZXJEYXRhKTsNCisgIGlmIChwRGVzYykgew0KKyAgICByZXR1cm4gcERlc2M7DQorICB9DQorICBpZiAocHN6Rm9udEZhbWlseSAmJiBtX3BFbnVtZXJhdG9yKSB7DQorICAgIENGWF9Gb250RGVzY3JpcHRvcnMgbmFtZWRGb250czsNCisgICAgbV9wRW51bWVyYXRvcihuYW1lZEZvbnRzLCBtX3BVc2VyRGF0YSwgcHN6Rm9udEZhbWlseSwgd1VuaWNvZGUpOw0KKyAgICBwYXJhbXMucHdzRmFtaWx5ID0gTlVMTDsNCisgICAgcERlc2MgPSBtX3BNYXRjaGVyKCZwYXJhbXMsIG5hbWVkRm9udHMsIG1fcFVzZXJEYXRhKTsNCisgICAgaWYgKHBEZXNjID09IE5VTEwpIHsNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBmb3IgKGludDMyX3QgaSA9IG1fRm9udEZhY2VzLkdldFNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7DQorICAgICAgRlhfTFBDRk9OVERFU0NSSVBUT1IgcE1hdGNoID0gbV9Gb250RmFjZXMuR2V0UHRyQXQoaSk7DQorICAgICAgaWYgKCpwTWF0Y2ggPT0gKnBEZXNjKSB7DQorICAgICAgICByZXR1cm4gcE1hdGNoOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpbnQgaW5kZXggPSBtX0ZvbnRGYWNlcy5BZGQoKnBEZXNjKTsNCisgICAgcmV0dXJuIG1fRm9udEZhY2VzLkdldFB0ckF0KGluZGV4KTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitGWF9MUENGT05UREVTQ1JJUFRPUiBGWF9EZWZGb250TWF0Y2hlcihGWF9MUEZPTlRNQVRDSFBBUkFNUyBwUGFyYW1zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Gb250RGVzY3JpcHRvcnMmIGZvbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBVc2VyRGF0YSkgew0KKyAgRlhfTFBDRk9OVERFU0NSSVBUT1IgcEJlc3RGb250ID0gTlVMTDsNCisgIGludDMyX3QgaUJlc3RTaW1pbGFyID0gMDsNCisgIEZYX0JPT0wgYk1hdGNoU3R5bGUgPQ0KKyAgICAgIChwUGFyYW1zLT5kd01hdGNoRmxhZ3MgJiBGWF9GT05UTUFUQ0hQQVJBX01hY3RoU3R5bGUpID4gMDsNCisgIGludDMyX3QgaUNvdW50ID0gZm9udHMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyArK2kpIHsNCisgICAgRlhfTFBDRk9OVERFU0NSSVBUT1IgcEZvbnQgPSBmb250cy5HZXRQdHJBdChpKTsNCisgICAgaWYgKChwRm9udC0+ZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0JvbGRJdGFsaWMpID09DQorICAgICAgICBGWF9GT05UU1RZTEVfQm9sZEl0YWxpYykgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChwUGFyYW1zLT5wd3NGYW1pbHkpIHsNCisgICAgICBpZiAoRlhTWVNfd2NzaWNtcChwUGFyYW1zLT5wd3NGYW1pbHksIHBGb250LT53c0ZvbnRGYWNlKSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmIChwRm9udC0+dUNoYXJTZXQgPT0gRlhfQ0hBUlNFVF9TeW1ib2wpIHsNCisgICAgICAgIHJldHVybiBwRm9udDsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKHBGb250LT51Q2hhclNldCA9PSBGWF9DSEFSU0VUX1N5bWJvbCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChwUGFyYW1zLT53Q29kZVBhZ2UgIT0gMHhGRkZGKSB7DQorICAgICAgaWYgKEZYX0dldENvZGVQYWdlRnJvbUNoYXJzZXQocEZvbnQtPnVDaGFyU2V0KSAhPSBwUGFyYW1zLT53Q29kZVBhZ2UpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAocFBhcmFtcy0+ZHdVU0IgPCAxMjgpIHsNCisgICAgICAgIEZYX0RXT1JEIGR3Qnl0ZSA9IHBQYXJhbXMtPmR3VVNCIC8gMzI7DQorICAgICAgICBGWF9EV09SRCBkd1VTQiA9IDEgPDwgKHBQYXJhbXMtPmR3VVNCICUgMzIpOw0KKyAgICAgICAgaWYgKChwRm9udC0+Rm9udFNpZ25hdHVyZS5mc1VzYltkd0J5dGVdICYgZHdVU0IpID09IDApIHsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChiTWF0Y2hTdHlsZSkgew0KKyAgICAgIGlmICgocEZvbnQtPmR3Rm9udFN0eWxlcyAmIDB4MEYpID09IChwUGFyYW1zLT5kd0ZvbnRTdHlsZXMgJiAweDBGKSkgew0KKyAgICAgICAgcmV0dXJuIHBGb250Ow0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKHBQYXJhbXMtPnB3c0ZhbWlseSAhPSBOVUxMKSB7DQorICAgICAgaWYgKEZYU1lTX3djc2ljbXAocFBhcmFtcy0+cHdzRmFtaWx5LCBwRm9udC0+d3NGb250RmFjZSkgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIHBGb250Ow0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpbnQzMl90IGlTaW1pbGFyVmFsdWUgPSBGWF9HZXRTaW1pbGFyVmFsdWUocEZvbnQsIHBQYXJhbXMtPmR3Rm9udFN0eWxlcyk7DQorICAgIGlmIChpQmVzdFNpbWlsYXIgPCBpU2ltaWxhclZhbHVlKSB7DQorICAgICAgaUJlc3RTaW1pbGFyID0gaVNpbWlsYXJWYWx1ZTsNCisgICAgICBwQmVzdEZvbnQgPSBwRm9udDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGlCZXN0U2ltaWxhciA8IDEgPyBOVUxMIDogcEJlc3RGb250Ow0KK30NCitpbnQzMl90IEZYX0dldFNpbWlsYXJWYWx1ZShGWF9MUENGT05UREVTQ1JJUFRPUiBwRm9udCwgRlhfRFdPUkQgZHdGb250U3R5bGVzKSB7DQorICBpbnQzMl90IGlWYWx1ZSA9IDA7DQorICBpZiAoKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TeW1ib2xpYykgPT0NCisgICAgICAocEZvbnQtPmR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TeW1ib2xpYykpIHsNCisgICAgaVZhbHVlICs9IDY0Ow0KKyAgfQ0KKyAgaWYgKChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfRml4ZWRQaXRjaCkgPT0NCisgICAgICAocEZvbnQtPmR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9GaXhlZFBpdGNoKSkgew0KKyAgICBpVmFsdWUgKz0gMzI7DQorICB9DQorICBpZiAoKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TZXJpZikgPT0NCisgICAgICAocEZvbnQtPmR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TZXJpZikpIHsNCisgICAgaVZhbHVlICs9IDE2Ow0KKyAgfQ0KKyAgaWYgKChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU2NyaXB0KSA9PQ0KKyAgICAgIChwRm9udC0+ZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX1NjcmlwdCkpIHsNCisgICAgaVZhbHVlICs9IDg7DQorICB9DQorICByZXR1cm4gaVZhbHVlOw0KK30NCitGWF9MUE1hdGNoRm9udCBGWF9HZXREZWZGb250TWF0Y2hvcigpIHsNCisgIHJldHVybiBGWF9EZWZGb250TWF0Y2hlcjsNCit9DQorRlhfRFdPUkQgRlhfR2V0R2RpRm9udFN0eWxlcyhjb25zdCBMT0dGT05UVyYgbGYpIHsNCisgIEZYX0RXT1JEIGR3U3R5bGVzID0gMDsNCisgIGlmICgobGYubGZQaXRjaEFuZEZhbWlseSAmIDB4MDMpID09IEZJWEVEX1BJVENIKSB7DQorICAgIGR3U3R5bGVzIHw9IEZYX0ZPTlRTVFlMRV9GaXhlZFBpdGNoOw0KKyAgfQ0KKyAgdWludDhfdCBuRmFtaWxpZXMgPSBsZi5sZlBpdGNoQW5kRmFtaWx5ICYgMHhGMDsNCisgIGlmIChuRmFtaWxpZXMgPT0gRkZfUk9NQU4pIHsNCisgICAgZHdTdHlsZXMgfD0gRlhfRk9OVFNUWUxFX1NlcmlmOw0KKyAgfQ0KKyAgaWYgKG5GYW1pbGllcyA9PSBGRl9TQ1JJUFQpIHsNCisgICAgZHdTdHlsZXMgfD0gRlhfRk9OVFNUWUxFX1NjcmlwdDsNCisgIH0NCisgIGlmIChsZi5sZkNoYXJTZXQgPT0gU1lNQk9MX0NIQVJTRVQpIHsNCisgICAgZHdTdHlsZXMgfD0gRlhfRk9OVFNUWUxFX1N5bWJvbGljOw0KKyAgfQ0KKyAgcmV0dXJuIGR3U3R5bGVzOw0KK30NCitzdGF0aWMgaW50MzJfdCBDQUxMQkFDSyBGWF9HZGlGb250RW51bVByb2MoRU5VTUxPR0ZPTlRFWCogbHBlbGZlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVdURVhUTUVUUklDRVgqIGxwbnRtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdGb250VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSkgew0KKyAgaWYgKGR3Rm9udFR5cGUgIT0gVFJVRVRZUEVfRk9OVFRZUEUpIHsNCisgICAgcmV0dXJuIDE7DQorICB9DQorICBjb25zdCBMT0dGT05UVyYgbGYgPSAoKExQRU5VTUxPR0ZPTlRFWFcpbHBlbGZlKS0+ZWxmTG9nRm9udDsNCisgIGlmIChsZi5sZkZhY2VOYW1lWzBdID09IEwnQCcpIHsNCisgICAgcmV0dXJuIDE7DQorICB9DQorICBGWF9MUEZPTlRERVNDUklQVE9SIHBGb250ID0gRlhfQWxsb2MoRlhfRk9OVERFU0NSSVBUT1IsIDEpOw0KKyAgRlhTWVNfbWVtc2V0KHBGb250LCAwLCBzaXplb2YoRlhfRk9OVERFU0NSSVBUT1IpKTsNCisgIHBGb250LT51Q2hhclNldCA9IGxmLmxmQ2hhclNldDsNCisgIHBGb250LT5kd0ZvbnRTdHlsZXMgPSBGWF9HZXRHZGlGb250U3R5bGVzKGxmKTsNCisgIEZYU1lTX3djc25jcHkocEZvbnQtPndzRm9udEZhY2UsIChjb25zdCBGWF9XQ0hBUiopbGYubGZGYWNlTmFtZSwgMzEpOw0KKyAgcEZvbnQtPndzRm9udEZhY2VbMzFdID0gMDsNCisgIEZYX21lbWNweSgmcEZvbnQtPkZvbnRTaWduYXR1cmUsICZscG50bWUtPm50bUZvbnRTaWcsDQorICAgICAgICAgICAgc2l6ZW9mKGxwbnRtZS0+bnRtRm9udFNpZykpOw0KKyAgKChDRlhfRm9udERlc2NyaXB0b3JzKilsUGFyYW0pLT5BZGQoKnBGb250KTsNCisgIEZYX0ZyZWUocEZvbnQpOw0KKyAgcmV0dXJuIDE7DQorfQ0KK3N0YXRpYyB2b2lkIEZYX0VudW1HZGlGb250cyhDRlhfRm9udERlc2NyaXB0b3JzJiBmb250cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFVzZXJEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHdzRmFjZU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIHdVbmljb2RlKSB7DQorICBIREMgaERDID0gOjpHZXREQyhOVUxMKTsNCisgIExPR0ZPTlRXIGxmRmluZDsNCisgIEZYX21lbXNldCgmbGZGaW5kLCAwLCBzaXplb2YobGZGaW5kKSk7DQorICBsZkZpbmQubGZDaGFyU2V0ID0gREVGQVVMVF9DSEFSU0VUOw0KKyAgaWYgKHB3c0ZhY2VOYW1lKSB7DQorICAgIEZYU1lTX3djc25jcHkoKEZYX1dDSEFSKilsZkZpbmQubGZGYWNlTmFtZSwgcHdzRmFjZU5hbWUsIDMxKTsNCisgICAgbGZGaW5kLmxmRmFjZU5hbWVbMzFdID0gMDsNCisgIH0NCisgIEVudW1Gb250RmFtaWxpZXNFeFcoaERDLCAoTFBMT0dGT05UVykmbGZGaW5kLA0KKyAgICAgICAgICAgICAgICAgICAgICAoRk9OVEVOVU1QUk9DVylGWF9HZGlGb250RW51bVByb2MsIChMUEFSQU0pJmZvbnRzLCAwKTsNCisgIDo6UmVsZWFzZURDKE5VTEwsIGhEQyk7DQorfQ0KK0ZYX0xQRW51bUFsbEZvbnRzIEZYX0dldERlZkZvbnRFbnVtZXJhdG9yKCkgew0KKyAgcmV0dXJuIEZYX0VudW1HZGlGb250czsNCit9DQorI2Vsc2UNCitjb25zdCBGWF9DSEFSKiBnX0ZvbnRGb2xkZXJzW10gPSB7DQorI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fTElOVVhfDQorICAgICIvdXNyL3NoYXJlL2ZvbnRzIiwgIi91c3Ivc2hhcmUvWDExL2ZvbnRzL1R5cGUxIiwNCisgICAgIi91c3Ivc2hhcmUvWDExL2ZvbnRzL1RURiIsICIvdXNyL2xvY2FsL3NoYXJlL2ZvbnRzIiwNCisjZWxpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXw0KKyAgICAifi9MaWJyYXJ5L0ZvbnRzIiwgIi9MaWJyYXJ5L0ZvbnRzIiwgIi9TeXN0ZW0vTGlicmFyeS9Gb250cyIsDQorI2VsaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BTkRST0lEXw0KKyAgICAiL3N5c3RlbS9mb250cyIsDQorI2VuZGlmDQorfTsNCitDRlhfRm9udFNvdXJjZUVudW1fRmlsZTo6Q0ZYX0ZvbnRTb3VyY2VFbnVtX0ZpbGUoKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplb2YoZ19Gb250Rm9sZGVycykgLyBzaXplb2YoY29uc3QgRlhfQ0hBUiopOyBpKyspIHsNCisgICAgbV9Gb2xkZXJQYXRocy5BZGQoZ19Gb250Rm9sZGVyc1tpXSk7DQorICB9DQorfQ0KK0NGWF9CeXRlU3RyaW5nIENGWF9Gb250U291cmNlRW51bV9GaWxlOjpHZXROZXh0RmlsZSgpIHsNCitSZXN0YXJ0Og0KKyAgdm9pZCogcEN1ckhhbmRsZSA9DQorICAgICAgbV9Gb2xkZXJRdWV1ZS5HZXRTaXplKCkgPT0gMA0KKyAgICAgICAgICA/IE5VTEwNCisgICAgICAgICAgOiBtX0ZvbGRlclF1ZXVlLkdldERhdGFQdHIobV9Gb2xkZXJRdWV1ZS5HZXRTaXplKCkgLSAxKS0+cEZpbGVIYW5kbGU7DQorICBpZiAoTlVMTCA9PSBwQ3VySGFuZGxlKSB7DQorICAgIGlmIChtX0ZvbGRlclBhdGhzLkdldFNpemUoKSA8IDEpIHsNCisgICAgICByZXR1cm4gIiI7DQorICAgIH0NCisgICAgcEN1ckhhbmRsZSA9IEZYX09wZW5Gb2xkZXIobV9Gb2xkZXJQYXRoc1ttX0ZvbGRlclBhdGhzLkdldFNpemUoKSAtIDFdKTsNCisgICAgRlhfSGFuZGxlUGFyZW50UGF0aCBocHA7DQorICAgIGhwcC5wRmlsZUhhbmRsZSA9IHBDdXJIYW5kbGU7DQorICAgIGhwcC5ic1BhcmVudFBhdGggPSBtX0ZvbGRlclBhdGhzW21fRm9sZGVyUGF0aHMuR2V0U2l6ZSgpIC0gMV07DQorICAgIG1fRm9sZGVyUXVldWUuQWRkKGhwcCk7DQorICB9DQorICBDRlhfQnl0ZVN0cmluZyBic05hbWU7DQorICBGWF9CT09MIGJGb2xkZXI7DQorICBDRlhfQnl0ZVN0cmluZyBic0ZvbGRlclNwZWFyYXRvciA9DQorICAgICAgQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKENGWF9XaWRlU3RyaW5nKEZYX0dldEZvbGRlclNlcGFyYXRvcigpKSk7DQorICB3aGlsZSAoVFJVRSkgew0KKyAgICBpZiAoIUZYX0dldE5leHRGaWxlKHBDdXJIYW5kbGUsIGJzTmFtZSwgYkZvbGRlcikpIHsNCisgICAgICBGWF9DbG9zZUZvbGRlcihwQ3VySGFuZGxlKTsNCisgICAgICBtX0ZvbGRlclF1ZXVlLlJlbW92ZUF0KG1fRm9sZGVyUXVldWUuR2V0U2l6ZSgpIC0gMSk7DQorICAgICAgaWYgKG1fRm9sZGVyUXVldWUuR2V0U2l6ZSgpID09IDApIHsNCisgICAgICAgIG1fRm9sZGVyUGF0aHMuUmVtb3ZlQXQobV9Gb2xkZXJQYXRocy5HZXRTaXplKCkgLSAxKTsNCisgICAgICAgIGlmIChtX0ZvbGRlclBhdGhzLkdldFNpemUoKSA9PSAwKSB7DQorICAgICAgICAgIHJldHVybiAiIjsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGdvdG8gUmVzdGFydDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcEN1ckhhbmRsZSA9DQorICAgICAgICAgIG1fRm9sZGVyUXVldWUuR2V0RGF0YVB0cihtX0ZvbGRlclF1ZXVlLkdldFNpemUoKSAtIDEpLT5wRmlsZUhhbmRsZTsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAoYnNOYW1lID09ICIuIiB8fCBic05hbWUgPT0gIi4uIikgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChiRm9sZGVyKSB7DQorICAgICAgRlhfSGFuZGxlUGFyZW50UGF0aCBocHA7DQorICAgICAgaHBwLmJzUGFyZW50UGF0aCA9DQorICAgICAgICAgIG1fRm9sZGVyUXVldWUuR2V0RGF0YVB0cihtX0ZvbGRlclF1ZXVlLkdldFNpemUoKSAtIDEpLT5ic1BhcmVudFBhdGggKw0KKyAgICAgICAgICBic0ZvbGRlclNwZWFyYXRvciArIGJzTmFtZTsNCisgICAgICBocHAucEZpbGVIYW5kbGUgPSBGWF9PcGVuRm9sZGVyKGhwcC5ic1BhcmVudFBhdGgpOw0KKyAgICAgIGlmIChocHAucEZpbGVIYW5kbGUgPT0gTlVMTCkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIG1fRm9sZGVyUXVldWUuQWRkKGhwcCk7DQorICAgICAgcEN1ckhhbmRsZSA9IGhwcC5wRmlsZUhhbmRsZTsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBic05hbWUgPQ0KKyAgICAgICAgbV9Gb2xkZXJRdWV1ZS5HZXREYXRhUHRyKG1fRm9sZGVyUXVldWUuR2V0U2l6ZSgpIC0gMSktPmJzUGFyZW50UGF0aCArDQorICAgICAgICBic0ZvbGRlclNwZWFyYXRvciArIGJzTmFtZTsNCisgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gYnNOYW1lOw0KK30NCitGWF9QT1NJVElPTiBDRlhfRm9udFNvdXJjZUVudW1fRmlsZTo6R2V0U3RhcnRQb3NpdGlvbih2b2lkKiBwVXNlckRhdGEpIHsNCisgIG1fd3NOZXh0ID0gR2V0TmV4dEZpbGUoKS5VVEY4RGVjb2RlKCk7DQorICBpZiAoMCA9PSBtX3dzTmV4dC5HZXRMZW5ndGgoKSkgew0KKyAgICByZXR1cm4gKEZYX1BPU0lUSU9OKTA7DQorICB9DQorICByZXR1cm4gKEZYX1BPU0lUSU9OKS0xOw0KK30NCitJRlhfRmlsZUFjY2VzcyogQ0ZYX0ZvbnRTb3VyY2VFbnVtX0ZpbGU6OkdldE5leHQoRlhfUE9TSVRJT04mIHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFVzZXJEYXRhKSB7DQorICBJRlhfRmlsZUFjY2VzcyogcEFjY2VzcyA9IEZYX0NyZWF0ZURlZmF1bHRGaWxlQWNjZXNzKG1fd3NOZXh0KTsNCisgIG1fd3NOZXh0ID0gR2V0TmV4dEZpbGUoKS5VVEY4RGVjb2RlKCk7DQorICBwb3MgPSAwICE9IG1fd3NOZXh0LkdldExlbmd0aCgpID8gcEFjY2VzcyA6IE5VTEw7DQorICByZXR1cm4gKElGWF9GaWxlQWNjZXNzKilwQWNjZXNzOw0KK30NCitJRlhfRm9udFNvdXJjZUVudW0qIEZYX0NyZWF0ZURlZmF1bHRGb250U291cmNlRW51bSgpIHsNCisgIHJldHVybiAoSUZYX0ZvbnRTb3VyY2VFbnVtKiluZXcgQ0ZYX0ZvbnRTb3VyY2VFbnVtX0ZpbGU7DQorfQ0KK0lGWF9Gb250TWdyKiBJRlhfRm9udE1ncjo6Q3JlYXRlKElGWF9Gb250U291cmNlRW51bSogcEZvbnRFbnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Gb250TWdyRGVsZWdhdGUqIHBEZWxlZ2F0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVXNlckRhdGEpIHsNCisgIGlmIChOVUxMID09IHBGb250RW51bSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENGWF9Gb250TWdySW1wKiBwRm9udE1nciA9DQorICAgICAgbmV3IENGWF9Gb250TWdySW1wKHBGb250RW51bSwgcERlbGVnYXRlLCBwVXNlckRhdGEpOw0KKyAgaWYgKHBGb250TWdyLT5FbnVtRm9udHMoKSkgew0KKyAgICByZXR1cm4gcEZvbnRNZ3I7DQorICB9DQorICBkZWxldGUgcEZvbnRNZ3I7DQorICByZXR1cm4gTlVMTDsNCit9DQorQ0ZYX0ZvbnRNZ3JJbXA6OkNGWF9Gb250TWdySW1wKElGWF9Gb250U291cmNlRW51bSogcEZvbnRFbnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRm9udE1nckRlbGVnYXRlKiBwRGVsZWdhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBVc2VyRGF0YSkNCisgICAgOiBtX3BGb250U291cmNlKHBGb250RW51bSksDQorICAgICAgbV9wRGVsZWdhdGUocERlbGVnYXRlKSwNCisgICAgICBtX3BVc2VyRGF0YShwVXNlckRhdGEpIHt9DQorDQorRlhfQk9PTCBDRlhfRm9udE1nckltcDo6RW51bUZvbnRzKCkgew0KKyAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5Jbml0RlRMaWJyYXJ5KCk7DQorICBGWEZUX0ZhY2UgcEZhY2UgPSBOVUxMOw0KKyAgRlhfUE9TSVRJT04gcG9zID0gbV9wRm9udFNvdXJjZS0+R2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgSUZYX0ZpbGVBY2Nlc3MqIHBGb250U291cmNlID0gTlVMTDsNCisgIElGWF9GaWxlUmVhZCogcEZvbnRTdHJlYW0gPSBOVUxMOw0KKyAgd2hpbGUgKHBvcykgew0KKyAgICBwRm9udFNvdXJjZSA9IG1fcEZvbnRTb3VyY2UtPkdldE5leHQocG9zKTsNCisgICAgcEZvbnRTdHJlYW0gPSBwRm9udFNvdXJjZS0+Q3JlYXRlRmlsZVN0cmVhbShGWF9GSUxFTU9ERV9SZWFkT25seSk7DQorICAgIGlmIChOVUxMID09IHBGb250U3RyZWFtKSB7DQorICAgICAgcEZvbnRTb3VyY2UtPlJlbGVhc2UoKTsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAoTlVMTCA9PSAocEZhY2UgPSBMb2FkRmFjZShwRm9udFN0cmVhbSwgMCkpKSB7DQorICAgICAgcEZvbnRTdHJlYW0tPlJlbGVhc2UoKTsNCisgICAgICBwRm9udFNvdXJjZS0+UmVsZWFzZSgpOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGludDMyX3QgbkZhY2VDb3VudCA9IHBGYWNlLT5udW1fZmFjZXM7DQorICAgIFJlcG9ydEZhY2UocEZhY2UsIG1fSW5zdGFsbGVkRm9udHMsIHBGb250U291cmNlKTsNCisgICAgaWYgKEZYRlRfR2V0X0ZhY2VfRXh0ZXJuYWxfU3RyZWFtKHBGYWNlKSkgew0KKyAgICAgIEZYRlRfQ2xlYXJfRmFjZV9FeHRlcm5hbF9TdHJlYW0ocEZhY2UpOw0KKyAgICB9DQorICAgIEZYRlRfRG9uZV9GYWNlKHBGYWNlKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgbkZhY2VDb3VudDsgaSsrKSB7DQorICAgICAgaWYgKE5VTEwgPT0gKHBGYWNlID0gTG9hZEZhY2UocEZvbnRTdHJlYW0sIGkpKSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIFJlcG9ydEZhY2UocEZhY2UsIG1fSW5zdGFsbGVkRm9udHMsIHBGb250U291cmNlKTsNCisgICAgICBpZiAoRlhGVF9HZXRfRmFjZV9FeHRlcm5hbF9TdHJlYW0ocEZhY2UpKSB7DQorICAgICAgICBGWEZUX0NsZWFyX0ZhY2VfRXh0ZXJuYWxfU3RyZWFtKHBGYWNlKTsNCisgICAgICB9DQorICAgICAgRlhGVF9Eb25lX0ZhY2UocEZhY2UpOw0KKyAgICB9DQorICAgIHBGb250U3RyZWFtLT5SZWxlYXNlKCk7DQorICAgIHBGb250U291cmNlLT5SZWxlYXNlKCk7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDRlhfRm9udE1nckltcDo6UmVsZWFzZSgpIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fSW5zdGFsbGVkRm9udHMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgZGVsZXRlIG1fSW5zdGFsbGVkRm9udHNbaV07DQorICB9DQorICBGWF9QT1NJVElPTiBwb3MgPSBtX0hhc2gyQ2FuZGlkYXRlTGlzdC5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocG9zKSB7DQorICAgIEZYX0RXT1JEIGR3SGFzaDsNCisgICAgQ0ZYX0ZvbnREZXNjcmlwdG9ySW5mb3MqIHBEZXNjczsNCisgICAgbV9IYXNoMkNhbmRpZGF0ZUxpc3QuR2V0TmV4dEFzc29jKHBvcywgZHdIYXNoLCBwRGVzY3MpOw0KKyAgICBpZiAoTlVMTCAhPSBwRGVzY3MpIHsNCisgICAgICBkZWxldGUgcERlc2NzOw0KKyAgICB9DQorICB9DQorICBwb3MgPSBtX0hhc2gyRm9udHMuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBvcykgew0KKyAgICBGWF9EV09SRCBkd0hhc2g7DQorICAgIENGWF9BcnJheVRlbXBsYXRlPElGWF9Gb250Kj4qIHBGb250czsNCisgICAgbV9IYXNoMkZvbnRzLkdldE5leHRBc3NvYyhwb3MsIGR3SGFzaCwgcEZvbnRzKTsNCisgICAgaWYgKE5VTEwgIT0gcEZvbnRzKSB7DQorICAgICAgZGVsZXRlIHBGb250czsNCisgICAgfQ0KKyAgfQ0KKyAgbV9IYXNoMkZvbnRzLlJlbW92ZUFsbCgpOw0KKyAgcG9zID0gbV9IYXNoMkZpbGVBY2Nlc3MuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBvcykgew0KKyAgICBGWF9EV09SRCBkd0hhc2g7DQorICAgIElGWF9GaWxlQWNjZXNzKiBwRmlsZUFjY2VzczsNCisgICAgbV9IYXNoMkZpbGVBY2Nlc3MuR2V0TmV4dEFzc29jKHBvcywgZHdIYXNoLCBwRmlsZUFjY2Vzcyk7DQorICAgIGlmIChOVUxMICE9IHBGaWxlQWNjZXNzKSB7DQorICAgICAgcEZpbGVBY2Nlc3MtPlJlbGVhc2UoKTsNCisgICAgfQ0KKyAgfQ0KKyAgcG9zID0gbV9GaWxlQWNjZXNzMklGWEZvbnQuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBvcykgew0KKyAgICBGWF9EV09SRCBkd0hhc2g7DQorICAgIElGWF9Gb250KiBwRm9udDsNCisgICAgbV9GaWxlQWNjZXNzMklGWEZvbnQuR2V0TmV4dEFzc29jKHBvcywgZHdIYXNoLCBwRm9udCk7DQorICAgIGlmIChOVUxMICE9IHBGb250KSB7DQorICAgICAgcEZvbnQtPlJlbGVhc2UoKTsNCisgICAgfQ0KKyAgfQ0KKyAgcG9zID0gbV9JRlhGb250MkZpbGVSZWFkLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChwb3MpIHsNCisgICAgSUZYX0ZvbnQqIHBGb250Ow0KKyAgICBJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZDsNCisgICAgbV9JRlhGb250MkZpbGVSZWFkLkdldE5leHRBc3NvYyhwb3MsIHBGb250LCBwRmlsZVJlYWQpOw0KKyAgICBwRmlsZVJlYWQtPlJlbGVhc2UoKTsNCisgIH0NCisgIGRlbGV0ZSB0aGlzOw0KK30NCitJRlhfRm9udCogQ0ZYX0ZvbnRNZ3JJbXA6OkdldERlZkZvbnRCeUNvZGVQYWdlKEZYX1dPUkQgd0NvZGVQYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkpIHsNCisgIHJldHVybiBOVUxMID09IG1fcERlbGVnYXRlID8gTlVMTCA6IG1fcERlbGVnYXRlLT5HZXREZWZGb250QnlDb2RlUGFnZSgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCB3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3pGb250RmFtaWx5KTsNCit9DQorSUZYX0ZvbnQqIENGWF9Gb250TWdySW1wOjpHZXREZWZGb250QnlDaGFyc2V0KHVpbnQ4X3QgbkNoYXJzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkpIHsNCisgIHJldHVybiBOVUxMID09IG1fcERlbGVnYXRlID8gTlVMTA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX3BEZWxlZ2F0ZS0+R2V0RGVmRm9udEJ5Q2hhcnNldCgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIG5DaGFyc2V0LCBkd0ZvbnRTdHlsZXMsIHBzekZvbnRGYW1pbHkpOw0KK30NCitJRlhfRm9udCogQ0ZYX0ZvbnRNZ3JJbXA6OkdldERlZkZvbnRCeVVuaWNvZGUoRlhfV0NIQVIgd1VuaWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkpIHsNCisgIHJldHVybiBOVUxMID09IG1fcERlbGVnYXRlID8gTlVMTA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX3BEZWxlZ2F0ZS0+R2V0RGVmRm9udEJ5VW5pY29kZSgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIHdVbmljb2RlLCBkd0ZvbnRTdHlsZXMsIHBzekZvbnRGYW1pbHkpOw0KK30NCitJRlhfRm9udCogQ0ZYX0ZvbnRNZ3JJbXA6OkdldERlZkZvbnRCeUxhbmd1YWdlKEZYX1dPUkQgd0xhbmd1YWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkpIHsNCisgIHJldHVybiBOVUxMID09IG1fcERlbGVnYXRlID8gTlVMTCA6IG1fcERlbGVnYXRlLT5HZXREZWZGb250QnlMYW5ndWFnZSgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCB3TGFuZ3VhZ2UsIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3pGb250RmFtaWx5KTsNCit9DQorSUZYX0ZvbnQqIENGWF9Gb250TWdySW1wOjpHZXRGb250QnlDb2RlUGFnZShGWF9XT1JEIHdDb2RlUGFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5KSB7DQorICBDRlhfQnl0ZVN0cmluZyBic0hhc2g7DQorICBic0hhc2guRm9ybWF0KCIlZCwgJWQiLCB3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcyk7DQorICBic0hhc2ggKz0gQ0ZYX1dpZGVTdHJpbmcocHN6Rm9udEZhbWlseSkuVVRGOEVuY29kZSgpOw0KKyAgRlhfRFdPUkQgZHdIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldEEoYnNIYXNoLCBic0hhc2guR2V0TGVuZ3RoKCkpOw0KKyAgQ0ZYX0FycmF5VGVtcGxhdGU8SUZYX0ZvbnQqPiogcEZvbnRzID0gTlVMTDsNCisgIElGWF9Gb250KiBwRm9udCA9IE5VTEw7DQorICBpZiAobV9IYXNoMkZvbnRzLkxvb2t1cChkd0hhc2gsIHBGb250cykpIHsNCisgICAgaWYgKE5VTEwgPT0gcEZvbnRzKSB7DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgaWYgKDAgIT0gcEZvbnRzLT5HZXRTaXplKCkpIHsNCisgICAgICByZXR1cm4gcEZvbnRzLT5HZXRBdCgwKS0+UmV0YWluKCk7DQorICAgIH0NCisgIH0NCisgIGlmICghcEZvbnRzKQ0KKyAgICBwRm9udHMgPSBuZXcgQ0ZYX0FycmF5VGVtcGxhdGU8SUZYX0ZvbnQqPjsNCisgIG1fSGFzaDJGb250cy5TZXRBdChkd0hhc2gsIHBGb250cyk7DQorICBDRlhfRm9udERlc2NyaXB0b3JJbmZvcyogc29ydGVkRm9udHMgPSBOVUxMOw0KKyAgaWYgKCFtX0hhc2gyQ2FuZGlkYXRlTGlzdC5Mb29rdXAoZHdIYXNoLCBzb3J0ZWRGb250cykpIHsNCisgICAgc29ydGVkRm9udHMgPSBuZXcgQ0ZYX0ZvbnREZXNjcmlwdG9ySW5mb3M7DQorICAgIE1hdGNoRm9udHMoKnNvcnRlZEZvbnRzLCB3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyhwc3pGb250RmFtaWx5KSwgMCk7DQorICAgIG1fSGFzaDJDYW5kaWRhdGVMaXN0LlNldEF0KGR3SGFzaCwgc29ydGVkRm9udHMpOw0KKyAgfQ0KKyAgaWYgKHNvcnRlZEZvbnRzLT5HZXRTaXplKCkgPT0gMCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENGWF9Gb250RGVzY3JpcHRvciogcERlc2MgPSBzb3J0ZWRGb250cy0+R2V0QXQoMCkucEZvbnQ7DQorICBwRm9udCA9IExvYWRGb250KHBEZXNjLT5tX3BGaWxlQWNjZXNzLCBwRGVzYy0+bV9uRmFjZUluZGV4LCBOVUxMKTsNCisgIGlmIChOVUxMICE9IHBGb250KSB7DQorICAgIHBGb250LT5TZXRMb2dpY2FsRm9udFN0eWxlKGR3Rm9udFN0eWxlcyk7DQorICB9DQorICBwRm9udHMtPkFkZChwRm9udCk7DQorICByZXR1cm4gcEZvbnQ7DQorfQ0KK0lGWF9Gb250KiBDRlhfRm9udE1nckltcDo6R2V0Rm9udEJ5Q2hhcnNldCh1aW50OF90IG5DaGFyc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5KSB7DQorICByZXR1cm4gR2V0Rm9udEJ5Q29kZVBhZ2UoRlhfR2V0Q29kZVBhZ2VGcm9tQ2hhcnNldChuQ2hhcnNldCksIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3pGb250RmFtaWx5KTsNCit9DQorSUZYX0ZvbnQqIENGWF9Gb250TWdySW1wOjpHZXRGb250QnlVbmljb2RlKEZYX1dDSEFSIHdVbmljb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5KSB7DQorICBJRlhfRm9udCogcEZvbnQgPSBOVUxMOw0KKyAgaWYgKG1fRmFpbGVkVW5pY29kZXMyTlVMTC5Mb29rdXAod1VuaWNvZGUsIHBGb250KSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIEZHQVNfTFBDRk9OVFVTQiB4ID0gRkdBU19HZXRVbmljb2RlQml0RmllbGQod1VuaWNvZGUpOw0KKyAgRlhfV09SRCB3Q29kZVBhZ2UgPSBOVUxMID09IHggPyAweEZGRkYgOiB4LT53Q29kZVBhZ2U7DQorICBGWF9XT1JEIHdCaXRGaWVsZCA9IE5VTEwgPT0geCA/IDk5OSA6IHgtPndCaXRGaWVsZDsNCisgIENGWF9CeXRlU3RyaW5nIGJzSGFzaDsNCisgIGlmICh3Q29kZVBhZ2UgPT0gMHhGRkZGKSB7DQorICAgIGJzSGFzaC5Gb3JtYXQoIiVkLCAlZCwgJWQiLCB3Q29kZVBhZ2UsIHdCaXRGaWVsZCwgZHdGb250U3R5bGVzKTsNCisgIH0gZWxzZSB7DQorICAgIGJzSGFzaC5Gb3JtYXQoIiVkLCAlZCIsIHdDb2RlUGFnZSwgZHdGb250U3R5bGVzKTsNCisgIH0NCisgIGJzSGFzaCArPSBDRlhfV2lkZVN0cmluZyhwc3pGb250RmFtaWx5KS5VVEY4RW5jb2RlKCk7DQorICBGWF9EV09SRCBkd0hhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0QShic0hhc2gsIGJzSGFzaC5HZXRMZW5ndGgoKSk7DQorICBDRlhfQXJyYXlUZW1wbGF0ZTxJRlhfRm9udCo+KiBwRm9udHMgPSBOVUxMOw0KKyAgaWYgKG1fSGFzaDJGb250cy5Mb29rdXAoZHdIYXNoLCBwRm9udHMpKSB7DQorICAgIGlmIChOVUxMID09IHBGb250cykgew0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIGlmICgwICE9IHBGb250cy0+R2V0U2l6ZSgpKSB7DQorICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcEZvbnRzLT5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgaWYgKFZlcmlmeVVuaWNvZGUocEZvbnRzLT5HZXRBdChpKSwgd1VuaWNvZGUpKSB7DQorICAgICAgICAgIHJldHVybiBwRm9udHMtPkdldEF0KGkpLT5SZXRhaW4oKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmICghcEZvbnRzKQ0KKyAgICBwRm9udHMgPSBuZXcgQ0ZYX0FycmF5VGVtcGxhdGU8SUZYX0ZvbnQqPjsNCisgIG1fSGFzaDJGb250cy5TZXRBdChkd0hhc2gsIHBGb250cyk7DQorICBDRlhfRm9udERlc2NyaXB0b3JJbmZvcyogc29ydGVkRm9udHMgPSBOVUxMOw0KKyAgaWYgKCFtX0hhc2gyQ2FuZGlkYXRlTGlzdC5Mb29rdXAoZHdIYXNoLCBzb3J0ZWRGb250cykpIHsNCisgICAgc29ydGVkRm9udHMgPSBuZXcgQ0ZYX0ZvbnREZXNjcmlwdG9ySW5mb3M7DQorICAgIE1hdGNoRm9udHMoKnNvcnRlZEZvbnRzLCB3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyhwc3pGb250RmFtaWx5KSwgd1VuaWNvZGUpOw0KKyAgICBtX0hhc2gyQ2FuZGlkYXRlTGlzdC5TZXRBdChkd0hhc2gsIHNvcnRlZEZvbnRzKTsNCisgIH0NCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNvcnRlZEZvbnRzLT5HZXRTaXplKCk7IGkrKykgew0KKyAgICBDRlhfRm9udERlc2NyaXB0b3IqIHBEZXNjID0gc29ydGVkRm9udHMtPkdldEF0KGkpLnBGb250Ow0KKyAgICBpZiAoVmVyaWZ5VW5pY29kZShwRGVzYywgd1VuaWNvZGUpKSB7DQorICAgICAgcEZvbnQgPSBMb2FkRm9udChwRGVzYy0+bV9wRmlsZUFjY2VzcywgcERlc2MtPm1fbkZhY2VJbmRleCwgTlVMTCk7DQorICAgICAgaWYgKE5VTEwgIT0gcEZvbnQpIHsNCisgICAgICAgIHBGb250LT5TZXRMb2dpY2FsRm9udFN0eWxlKGR3Rm9udFN0eWxlcyk7DQorICAgICAgfQ0KKyAgICAgIHBGb250cy0+QWRkKHBGb250KTsNCisgICAgICByZXR1cm4gcEZvbnQ7DQorICAgIH0NCisgIH0NCisgIGlmIChOVUxMID09IHBzekZvbnRGYW1pbHkpIHsNCisgICAgbV9GYWlsZWRVbmljb2RlczJOVUxMLlNldEF0KHdVbmljb2RlLCBOVUxMKTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitGWF9CT09MIENGWF9Gb250TWdySW1wOjpWZXJpZnlVbmljb2RlKENGWF9Gb250RGVzY3JpcHRvciogcERlc2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiB3Y1VuaWNvZGUpIHsNCisgIElGWF9GaWxlUmVhZCogcEZpbGVSZWFkID0NCisgICAgICBwRGVzYy0+bV9wRmlsZUFjY2Vzcy0+Q3JlYXRlRmlsZVN0cmVhbShGWF9GSUxFTU9ERV9SZWFkT25seSk7DQorICBpZiAoTlVMTCA9PSBwRmlsZVJlYWQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRlhGVF9GYWNlIHBGYWNlID0gTG9hZEZhY2UocEZpbGVSZWFkLCBwRGVzYy0+bV9uRmFjZUluZGV4KTsNCisgIGlmIChOVUxMID09IHBGYWNlKSB7DQorICAgIGdvdG8gQmFkUmV0Ow0KKyAgfQ0KKyAgaWYgKDAgIT0gRlhGVF9TZWxlY3RfQ2hhcm1hcChwRmFjZSwgRlhGVF9FTkNPRElOR19VTklDT0RFKSkgew0KKyAgICBnb3RvIEJhZFJldDsNCisgIH0NCisgIGlmICgwID09IEZYRlRfR2V0X0NoYXJfSW5kZXgocEZhY2UsIHdjVW5pY29kZSkpIHsNCisgICAgZ290byBCYWRSZXQ7DQorICB9DQorICBwRmlsZVJlYWQtPlJlbGVhc2UoKTsNCisgIGlmIChGWEZUX0dldF9GYWNlX0V4dGVybmFsX1N0cmVhbShwRmFjZSkpIHsNCisgICAgRlhGVF9DbGVhcl9GYWNlX0V4dGVybmFsX1N0cmVhbShwRmFjZSk7DQorICB9DQorICBGWEZUX0RvbmVfRmFjZShwRmFjZSk7DQorICByZXR1cm4gVFJVRTsNCitCYWRSZXQ6DQorICBpZiAoTlVMTCAhPSBwRmlsZVJlYWQpIHsNCisgICAgcEZpbGVSZWFkLT5SZWxlYXNlKCk7DQorICB9DQorICBpZiAoTlVMTCAhPSBwRmFjZSkgew0KKyAgICBpZiAoRlhGVF9HZXRfRmFjZV9FeHRlcm5hbF9TdHJlYW0ocEZhY2UpKSB7DQorICAgICAgRlhGVF9DbGVhcl9GYWNlX0V4dGVybmFsX1N0cmVhbShwRmFjZSk7DQorICAgIH0NCisgICAgRlhGVF9Eb25lX0ZhY2UocEZhY2UpOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENGWF9Gb250TWdySW1wOjpWZXJpZnlVbmljb2RlKElGWF9Gb250KiBwRm9udCwgRlhfV0NIQVIgd2NVbmljb2RlKSB7DQorICBpZiAoTlVMTCA9PSBwRm9udCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWEZUX0ZhY2UgcEZhY2UgPSAoKENGWF9Gb250KilwRm9udC0+R2V0RGV2Rm9udCgpKS0+R2V0RmFjZSgpOw0KKyAgRlhGVF9DaGFyTWFwIGNoYXJtYXAgPSBGWEZUX0dldF9GYWNlX0NoYXJtYXAocEZhY2UpOw0KKyAgaWYgKDAgIT0gRlhGVF9TZWxlY3RfQ2hhcm1hcChwRmFjZSwgRlhGVF9FTkNPRElOR19VTklDT0RFKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoMCA9PSBGWEZUX0dldF9DaGFyX0luZGV4KHBGYWNlLCB3Y1VuaWNvZGUpKSB7DQorICAgIEZYRlRfU2V0X0NoYXJtYXAocEZhY2UsIGNoYXJtYXApOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorSUZYX0ZvbnQqIENGWF9Gb250TWdySW1wOjpHZXRGb250QnlMYW5ndWFnZShGWF9XT1JEIHdMYW5ndWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5KSB7DQorICByZXR1cm4gR2V0Rm9udEJ5Q29kZVBhZ2UoRlhfR2V0RGVmQ29kZVBhZ2VCeUxhbmd1YWdlKHdMYW5ndWFnZSksIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3pGb250RmFtaWx5KTsNCit9DQorSUZYX0ZvbnQqIENGWF9Gb250TWdySW1wOjpMb2FkRm9udChjb25zdCB1aW50OF90KiBwQnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRmFjZUluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcEZhY2VDb3VudCkgew0KKyAgdm9pZCogSGFzaFsyXSA9IHsodm9pZCopKHVpbnRwdHJfdClwQnVmZmVyLCAodm9pZCopKHVpbnRwdHJfdClpTGVuZ3RofTsNCisgIEZYX0RXT1JEIGR3SGFzaCA9DQorICAgICAgRlhfSGFzaENvZGVfU3RyaW5nX0dldEEoKGNvbnN0IEZYX0NIQVIqKUhhc2gsIDIgKiBzaXplb2Yodm9pZCopKTsNCisgIElGWF9GaWxlQWNjZXNzKiBwRm9udEFjY2VzcyA9IE5VTEw7DQorICBpZiAoIW1fSGFzaDJGaWxlQWNjZXNzLkxvb2t1cChkd0hhc2gsIHBGb250QWNjZXNzKSkgew0KKyAgfQ0KKyAgaWYgKE5VTEwgIT0gcEZvbnRBY2Nlc3MpIHsNCisgICAgcmV0dXJuIExvYWRGb250KHBGb250QWNjZXNzLCBpRmFjZUluZGV4LCBwRmFjZUNvdW50LCBUUlVFKTsNCisgIH0gZWxzZSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KK30NCitJRlhfRm9udCogQ0ZYX0ZvbnRNZ3JJbXA6OkxvYWRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGaWxlTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZhY2VJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBGYWNlQ291bnQpIHsNCisgIENGWF9CeXRlU3RyaW5nIGJzSGFzaDsNCisgIGJzSGFzaCArPSBDRlhfV2lkZVN0cmluZyhwc3pGaWxlTmFtZSkuVVRGOEVuY29kZSgpOw0KKyAgRlhfRFdPUkQgZHdIYXNoID0NCisgICAgICBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0QSgoY29uc3QgRlhfQ0hBUiopYnNIYXNoLCBic0hhc2guR2V0TGVuZ3RoKCkpOw0KKyAgSUZYX0ZpbGVBY2Nlc3MqIHBGb250QWNjZXNzID0gTlVMTDsNCisgIGlmICghbV9IYXNoMkZpbGVBY2Nlc3MuTG9va3VwKGR3SGFzaCwgcEZvbnRBY2Nlc3MpKSB7DQorICAgIHBGb250QWNjZXNzID0gRlhfQ3JlYXRlRGVmYXVsdEZpbGVBY2Nlc3MocHN6RmlsZU5hbWUpOw0KKyAgICBtX0hhc2gyRmlsZUFjY2Vzcy5TZXRBdChkd0hhc2gsIHBGb250QWNjZXNzKTsNCisgIH0NCisgIGlmIChOVUxMICE9IHBGb250QWNjZXNzKSB7DQorICAgIHJldHVybiBMb2FkRm9udChwRm9udEFjY2VzcywgaUZhY2VJbmRleCwgcEZhY2VDb3VudCwgVFJVRSk7DQorICB9IGVsc2Ugew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCit9DQorSUZYX0ZvbnQqIENGWF9Gb250TWdySW1wOjpMb2FkRm9udChJRlhfU3RyZWFtKiBwRm9udFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZhY2VJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBGYWNlQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlU3RyZWFtKSB7DQorICB2b2lkKiBIYXNoWzFdID0geyh2b2lkKikodWludHB0cl90KXBGb250U3RyZWFtfTsNCisgIEZYX0RXT1JEIGR3SGFzaCA9DQorICAgICAgRlhfSGFzaENvZGVfU3RyaW5nX0dldEEoKGNvbnN0IEZYX0NIQVIqKUhhc2gsIDEgKiBzaXplb2Yodm9pZCopKTsNCisgIElGWF9GaWxlQWNjZXNzKiBwRm9udEFjY2VzcyA9IE5VTEw7DQorICBpZiAoIW1fSGFzaDJGaWxlQWNjZXNzLkxvb2t1cChkd0hhc2gsIHBGb250QWNjZXNzKSkgew0KKyAgfQ0KKyAgaWYgKE5VTEwgIT0gcEZvbnRBY2Nlc3MpIHsNCisgICAgcmV0dXJuIExvYWRGb250KHBGb250QWNjZXNzLCBpRmFjZUluZGV4LCBwRmFjZUNvdW50LCBUUlVFKTsNCisgIH0gZWxzZSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KK30NCitJRlhfRm9udCogQ0ZYX0ZvbnRNZ3JJbXA6OkxvYWRGb250KElGWF9GaWxlQWNjZXNzKiBwRm9udEFjY2VzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZhY2VJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBGYWNlQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJXYW50Q2FjaGUpIHsNCisgIEZYX0RXT1JEIGR3SGFzaCA9IDA7DQorICBJRlhfRm9udCogcEZvbnQgPSBOVUxMOw0KKyAgaWYgKGJXYW50Q2FjaGUpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNIYXNoOw0KKyAgICBic0hhc2guRm9ybWF0KCIlZCwgJWQiLCAodWludHB0cl90KXBGb250QWNjZXNzLCBpRmFjZUluZGV4KTsNCisgICAgZHdIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldEEoYnNIYXNoLCBic0hhc2guR2V0TGVuZ3RoKCkpOw0KKyAgICBpZiAobV9GaWxlQWNjZXNzMklGWEZvbnQuTG9va3VwKGR3SGFzaCwgcEZvbnQpKSB7DQorICAgICAgaWYgKE5VTEwgIT0gcEZvbnQpIHsNCisgICAgICAgIGlmIChOVUxMICE9IHBGYWNlQ291bnQpIHsNCisgICAgICAgICAgKnBGYWNlQ291bnQgPSAoKENGWF9Gb250KilwRm9udC0+R2V0RGV2Rm9udCgpKS0+R2V0RmFjZSgpLT5udW1fZmFjZXM7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcEZvbnQtPlJldGFpbigpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgQ0ZYX0ZvbnQqIHBJbnRlcm5hbEZvbnQgPSBuZXcgQ0ZYX0ZvbnQ7DQorICBJRlhfRmlsZVJlYWQqIHBGb250U3RyZWFtID0NCisgICAgICBwRm9udEFjY2Vzcy0+Q3JlYXRlRmlsZVN0cmVhbShGWF9GSUxFTU9ERV9SZWFkT25seSk7DQorICBpZiAoTlVMTCA9PSBwRm9udFN0cmVhbSkgew0KKyAgICBkZWxldGUgcEludGVybmFsRm9udDsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpZiAoIXBJbnRlcm5hbEZvbnQtPkxvYWRGaWxlKHBGb250U3RyZWFtLCBpRmFjZUluZGV4KSkgew0KKyAgICBkZWxldGUgcEludGVybmFsRm9udDsNCisgICAgcEZvbnRTdHJlYW0tPlJlbGVhc2UoKTsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBwRm9udCA9IElGWF9Gb250OjpMb2FkRm9udChwSW50ZXJuYWxGb250LCB0aGlzLCBUUlVFKTsNCisgIGlmIChOVUxMID09IHBGb250KSB7DQorICAgIGRlbGV0ZSBwSW50ZXJuYWxGb250Ow0KKyAgICBwRm9udFN0cmVhbS0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGlmIChiV2FudENhY2hlKSB7DQorICAgIG1fRmlsZUFjY2VzczJJRlhGb250LlNldEF0KGR3SGFzaCwgcEZvbnQpOw0KKyAgfQ0KKyAgbV9JRlhGb250MkZpbGVSZWFkLlNldEF0KHBGb250LCBwRm9udFN0cmVhbSk7DQorICBpZiAoTlVMTCAhPSBwRmFjZUNvdW50KSB7DQorICAgICpwRmFjZUNvdW50ID0gKChDRlhfRm9udCopcEZvbnQtPkdldERldkZvbnQoKSktPkdldEZhY2UoKS0+bnVtX2ZhY2VzOw0KKyAgfQ0KKyAgcmV0dXJuIHBGb250Ow0KK30NCitleHRlcm4gIkMiIHsNCit1bnNpZ25lZCBsb25nIF9mdFN0cmVhbVJlYWQoRlhGVF9TdHJlYW0gc3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogYnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50KSB7DQorICBpZiAoY291bnQgPT0gMCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIElGWF9GaWxlUmVhZCogcEZpbGUgPSAoSUZYX0ZpbGVSZWFkKilzdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlcjsNCisgIGludCByZXMgPSBwRmlsZS0+UmVhZEJsb2NrKGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCk7DQorICBpZiAocmVzKSB7DQorICAgIHJldHVybiBjb3VudDsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCit2b2lkIF9mdFN0cmVhbUNsb3NlKEZYRlRfU3RyZWFtIHN0cmVhbSkge30NCit9Ow0KKw0KK0ZYRlRfRmFjZSBDRlhfRm9udE1nckltcDo6TG9hZEZhY2UoSUZYX0ZpbGVSZWFkKiBwRm9udFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZhY2VJbmRleCkgew0KKyAgaWYgKCFwRm9udFN0cmVhbSkNCisgICAgcmV0dXJuIG51bGxwdHI7DQorDQorICBDRlhfRm9udE1nciogcEZvbnRNZ3IgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCk7DQorICBwRm9udE1nci0+SW5pdEZUTGlicmFyeSgpOw0KKyAgRlhGVF9MaWJyYXJ5IGxpYnJhcnkgPSBwRm9udE1nci0+R2V0RlRMaWJyYXJ5KCk7DQorICBpZiAoIWxpYnJhcnkpDQorICAgIHJldHVybiBudWxscHRyOw0KKw0KKyAgRlhGVF9TdHJlYW0gZnRTdHJlYW0gPSBGWF9BbGxvYyhGWEZUX1N0cmVhbVJlYywgMSk7DQorICBGWFNZU19tZW1zZXQoZnRTdHJlYW0sIDAsIHNpemVvZihGWEZUX1N0cmVhbVJlYykpOw0KKyAgZnRTdHJlYW0tPmJhc2UgPSBOVUxMOw0KKyAgZnRTdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlciA9IHBGb250U3RyZWFtOw0KKyAgZnRTdHJlYW0tPnBvcyA9IDA7DQorICBmdFN0cmVhbS0+c2l6ZSA9ICh1bnNpZ25lZCBsb25nKXBGb250U3RyZWFtLT5HZXRTaXplKCk7DQorICBmdFN0cmVhbS0+cmVhZCA9IF9mdFN0cmVhbVJlYWQ7DQorICBmdFN0cmVhbS0+Y2xvc2UgPSBfZnRTdHJlYW1DbG9zZTsNCisNCisgIEZYRlRfT3Blbl9BcmdzIGZ0QXJnczsNCisgIEZYU1lTX21lbXNldCgmZnRBcmdzLCAwLCBzaXplb2YoRlhGVF9PcGVuX0FyZ3MpKTsNCisgIGZ0QXJncy5mbGFncyB8PSBGVF9PUEVOX1NUUkVBTTsNCisgIGZ0QXJncy5zdHJlYW0gPSBmdFN0cmVhbTsNCisNCisgIEZYRlRfRmFjZSBwRmFjZSA9IE5VTEw7DQorICBpZiAoRlhGVF9PcGVuX0ZhY2UobGlicmFyeSwgJmZ0QXJncywgaUZhY2VJbmRleCwgJnBGYWNlKSkgew0KKyAgICBGWF9GcmVlKGZ0U3RyZWFtKTsNCisgICAgcmV0dXJuIG51bGxwdHI7DQorICB9DQorDQorICBGWEZUX1NldF9QaXhlbF9TaXplcyhwRmFjZSwgMCwgNjQpOw0KKyAgcmV0dXJuIHBGYWNlOw0KK30NCisNCitpbnQzMl90IENGWF9Gb250TWdySW1wOjpNYXRjaEZvbnRzKENGWF9Gb250RGVzY3JpcHRvckluZm9zJiBNYXRjaGVkRm9udHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBGb250TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIHdjVW5pY29kZSkgew0KKyAgTWF0Y2hlZEZvbnRzLlJlbW92ZUFsbCgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NOb3JtYWxpemVkRm9udE5hbWUgPSBGb250TmFtZTsNCisgIE5vcm1hbGl6ZUZvbnROYW1lKHdzTm9ybWFsaXplZEZvbnROYW1lKTsNCisgIHN0YXRpYyBjb25zdCBpbnQzMl90IG5NYXggPSAweGZmZmY7DQorICBDRlhfRm9udERlc2NyaXB0b3IqIHBGb250ID0gTlVMTDsNCisgIGludDMyX3QgbkNvdW50ID0gbV9JbnN0YWxsZWRGb250cy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICBwRm9udCA9IG1fSW5zdGFsbGVkRm9udHNbaV07DQorICAgIGludDMyX3QgblBlbmFsdHkgPSBDYWxjUGVuYWx0eShwRm9udCwgd0NvZGVQYWdlLCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c05vcm1hbGl6ZWRGb250TmFtZSwgd2NVbmljb2RlKTsNCisgICAgaWYgKG5QZW5hbHR5ID49IDB4RkZGRikgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIEZYX0ZvbnREZXNjcmlwdG9ySW5mbyBGb250SW5mbzsNCisgICAgRm9udEluZm8ucEZvbnQgPSBwRm9udDsNCisgICAgRm9udEluZm8ublBlbmFsdHkgPSBuUGVuYWx0eTsNCisgICAgTWF0Y2hlZEZvbnRzLkFkZChGb250SW5mbyk7DQorICAgIGlmIChNYXRjaGVkRm9udHMuR2V0U2l6ZSgpID09IG5NYXgpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKE1hdGNoZWRGb250cy5HZXRTaXplKCkgPT0gMCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIENGWF9TU29ydFRlbXBsYXRlPEZYX0ZvbnREZXNjcmlwdG9ySW5mbz4gc3NvcnQ7DQorICBzc29ydC5TaGVsbFNvcnQoTWF0Y2hlZEZvbnRzLkdldERhdGEoKSwgTWF0Y2hlZEZvbnRzLkdldFNpemUoKSk7DQorICByZXR1cm4gTWF0Y2hlZEZvbnRzLkdldFNpemUoKTsNCit9DQorc3RydWN0IEZYX0JpdENvZGVQYWdlIHsNCisgIEZYX1dPUkQgd0JpdDsNCisgIEZYX1dPUkQgd0NvZGVQYWdlOw0KK307DQorc3RhdGljIGNvbnN0IEZYX0JpdENvZGVQYWdlIGdfQml0MkNvZGVQYWdlW10gPSB7DQorICAgIHswLCAxMjUyfSwgezEsIDEyNTB9LCB7MiwgMTI1MX0sIHszLCAxMjUzfSwgIHs0LCAxMjU0fSwgezUsIDEyNTV9LA0KKyAgICB7NiwgMTI1Nn0sIHs3LCAxMjU3fSwgezgsIDEyNTh9LCB7OSwgMH0sICAgICB7MTAsIDB9LCAgIHsxMSwgMH0sDQorICAgIHsxMiwgMH0sICAgezEzLCAwfSwgICB7MTQsIDB9LCAgIHsxNSwgMH0sICAgIHsxNiwgODc0fSwgezE3LCA5MzJ9LA0KKyAgICB7MTgsIDkzNn0sIHsxOSwgOTQ5fSwgezIwLCA5NTB9LCB7MjEsIDEzNjF9LCB7MjIsIDB9LCAgIHsyMywgMH0sDQorICAgIHsyNCwgMH0sICAgezI1LCAwfSwgICB7MjYsIDB9LCAgIHsyNywgMH0sICAgIHsyOCwgMH0sICAgezI5LCAwfSwNCisgICAgezMwLCAwfSwgICB7MzEsIDB9LCAgIHszMiwgMH0sICAgezMzLCAwfSwgICAgezM0LCAwfSwgICB7MzUsIDB9LA0KKyAgICB7MzYsIDB9LCAgIHszNywgMH0sICAgezM4LCAwfSwgICB7MzksIDB9LCAgICB7NDAsIDB9LCAgIHs0MSwgMH0sDQorICAgIHs0MiwgMH0sICAgezQzLCAwfSwgICB7NDQsIDB9LCAgIHs0NSwgMH0sICAgIHs0NiwgMH0sICAgezQ3LCAwfSwNCisgICAgezQ4LCA4Njl9LCB7NDksIDg2Nn0sIHs1MCwgODY1fSwgezUxLCA4NjR9LCAgezUyLCA4NjN9LCB7NTMsIDg2Mn0sDQorICAgIHs1NCwgODYxfSwgezU1LCA4NjB9LCB7NTYsIDg1N30sIHs1NywgODU1fSwgIHs1OCwgODUyfSwgezU5LCA3NzV9LA0KKyAgICB7NjAsIDczN30sIHs2MSwgNzA4fSwgezYyLCA4NTB9LCB7NjMsIDQzN30sDQorfTsNCitGWF9XT1JEIEZYX0dldENvZGVQYWdlQml0KEZYX1dPUkQgd0NvZGVQYWdlKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplb2YoZ19CaXQyQ29kZVBhZ2UpIC8gc2l6ZW9mKEZYX0JpdENvZGVQYWdlKTsNCisgICAgICAgaSsrKSB7DQorICAgIGlmIChnX0JpdDJDb2RlUGFnZVtpXS53Q29kZVBhZ2UgPT0gd0NvZGVQYWdlKSB7DQorICAgICAgcmV0dXJuIGdfQml0MkNvZGVQYWdlW2ldLndCaXQ7DQorICAgIH0NCisgIH0NCisgIHJldHVybiAoRlhfV09SRCktMTsNCit9DQorRlhfV09SRCBGWF9HZXRVbmljb2RlQml0KEZYX1dDSEFSIHdjVW5pY29kZSkgew0KKyAgRkdBU19MUENGT05UVVNCIHggPSBGR0FTX0dldFVuaWNvZGVCaXRGaWVsZCh3Y1VuaWNvZGUpOw0KKyAgaWYgKE5VTEwgPT0geCkgew0KKyAgICByZXR1cm4gOTk5Ow0KKyAgfQ0KKyAgcmV0dXJuIHgtPndCaXRGaWVsZDsNCit9DQoraW50MzJfdCBDRlhfRm9udE1nckltcDo6Q2FsY1BlbmFsdHkoQ0ZYX0ZvbnREZXNjcmlwdG9yKiBwSW5zdGFsbGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgRm9udE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgd2NVbmljb2RlKSB7DQorICBpbnQzMl90IG5QZW5hbHR5ID0gMzAwMDA7DQorICBpZiAoMCAhPSBGb250TmFtZS5HZXRMZW5ndGgoKSkgew0KKyAgICBpZiAoRm9udE5hbWUgIT0gcEluc3RhbGxlZC0+bV93c0ZhY2VOYW1lKSB7DQorICAgICAgaW50MzJfdCBpOw0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBwSW5zdGFsbGVkLT5tX3dzRmFtaWx5TmFtZXMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIGlmIChwSW5zdGFsbGVkLT5tX3dzRmFtaWx5TmFtZXNbaV0gPT0gRm9udE5hbWUpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmIChpID09IHBJbnN0YWxsZWQtPm1fd3NGYW1pbHlOYW1lcy5HZXRTaXplKCkpIHsNCisgICAgICAgIG5QZW5hbHR5ICs9IDB4RkZGRjsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgblBlbmFsdHkgLT0gMjgwMDA7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG5QZW5hbHR5IC09IDMwMDAwOw0KKyAgICB9DQorICAgIGlmICgzMDAwMCA9PSBuUGVuYWx0eSAmJg0KKyAgICAgICAgMCA9PSBJc1BhcnROYW1lKHBJbnN0YWxsZWQtPm1fd3NGYWNlTmFtZSwgRm9udE5hbWUpKSB7DQorICAgICAgaW50MzJfdCBpOw0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBwSW5zdGFsbGVkLT5tX3dzRmFtaWx5TmFtZXMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIGlmICgwICE9IElzUGFydE5hbWUocEluc3RhbGxlZC0+bV93c0ZhbWlseU5hbWVzW2ldLCBGb250TmFtZSkpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmIChpID09IHBJbnN0YWxsZWQtPm1fd3NGYW1pbHlOYW1lcy5HZXRTaXplKCkpIHsNCisgICAgICAgIG5QZW5hbHR5ICs9IDB4RkZGRjsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgblBlbmFsdHkgLT0gMjYwMDA7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG5QZW5hbHR5IC09IDI3MDAwOw0KKyAgICB9DQorICB9DQorICBGWF9EV09SRCBkd1N0eWxlTWFzayA9IHBJbnN0YWxsZWQtPm1fZHdGb250U3R5bGVzIF4gZHdGb250U3R5bGVzOw0KKyAgaWYgKGR3U3R5bGVNYXNrICYgRlhfRk9OVFNUWUxFX0JvbGQpIHsNCisgICAgblBlbmFsdHkgKz0gNDUwMDsNCisgIH0NCisgIGlmIChkd1N0eWxlTWFzayAmIEZYX0ZPTlRTVFlMRV9GaXhlZFBpdGNoKSB7DQorICAgIG5QZW5hbHR5ICs9IDEwMDAwOw0KKyAgfQ0KKyAgaWYgKGR3U3R5bGVNYXNrICYgRlhfRk9OVFNUWUxFX0l0YWxpYykgew0KKyAgICBuUGVuYWx0eSArPSAxMDAwMDsNCisgIH0NCisgIGlmIChkd1N0eWxlTWFzayAmIEZYX0ZPTlRTVFlMRV9TZXJpZikgew0KKyAgICBuUGVuYWx0eSArPSA1MDA7DQorICB9DQorICBpZiAoZHdTdHlsZU1hc2sgJiBGWF9GT05UU1RZTEVfU3ltYm9saWMpIHsNCisgICAgblBlbmFsdHkgKz0gMHhGRkZGOw0KKyAgfQ0KKyAgaWYgKG5QZW5hbHR5ID49IDB4RkZGRikgew0KKyAgICByZXR1cm4gMHhGRkZGOw0KKyAgfQ0KKyAgRlhfV09SRCB3Qml0ID0NCisgICAgICAoKDAgPT0gd0NvZGVQYWdlIHx8IDB4RkZGRiA9PSB3Q29kZVBhZ2UpID8gKEZYX1dPUkQpLTENCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhfR2V0Q29kZVBhZ2VCaXQod0NvZGVQYWdlKSk7DQorICBpZiAod0JpdCAhPSAoRlhfV09SRCktMSkgew0KKyAgICBGWFNZU19hc3NlcnQod0JpdCA8IDY0KTsNCisgICAgaWYgKDAgPT0gKHBJbnN0YWxsZWQtPm1fZHdDc2Jbd0JpdCAvIDMyXSAmICgxIDw8ICh3Qml0ICUgMzIpKSkpIHsNCisgICAgICBuUGVuYWx0eSArPSAweEZGRkY7DQorICAgIH0gZWxzZSB7DQorICAgICAgblBlbmFsdHkgLT0gNjAwMDA7DQorICAgIH0NCisgIH0NCisgIHdCaXQgPQ0KKyAgICAgICgoMCA9PSB3Y1VuaWNvZGUgfHwgMHhGRkZFID09IHdjVW5pY29kZSkgPyAoRlhfV09SRCk5OTkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhfR2V0VW5pY29kZUJpdCh3Y1VuaWNvZGUpKTsNCisgIGlmICh3Qml0ICE9IChGWF9XT1JEKTk5OSkgew0KKyAgICBGWFNZU19hc3NlcnQod0JpdCA8IDEyOCk7DQorICAgIGlmICgwID09IChwSW5zdGFsbGVkLT5tX2R3VXNiW3dCaXQgLyAzMl0gJiAoMSA8PCAod0JpdCAlIDMyKSkpKSB7DQorICAgICAgblBlbmFsdHkgKz0gMHhGRkZGOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG5QZW5hbHR5IC09IDYwMDAwOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gblBlbmFsdHk7DQorfQ0KK3ZvaWQgQ0ZYX0ZvbnRNZ3JJbXA6OkNsZWFyRm9udENhY2hlKCkgew0KKyAgRlhfUE9TSVRJT04gcG9zID0gbV9IYXNoMkNhbmRpZGF0ZUxpc3QuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBvcykgew0KKyAgICBGWF9EV09SRCBkd0hhc2g7DQorICAgIENGWF9Gb250RGVzY3JpcHRvckluZm9zKiBwRGVzY3M7DQorICAgIG1fSGFzaDJDYW5kaWRhdGVMaXN0LkdldE5leHRBc3NvYyhwb3MsIGR3SGFzaCwgcERlc2NzKTsNCisgICAgaWYgKE5VTEwgIT0gcERlc2NzKSB7DQorICAgICAgZGVsZXRlIHBEZXNjczsNCisgICAgfQ0KKyAgfQ0KKyAgcG9zID0gbV9GaWxlQWNjZXNzMklGWEZvbnQuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBvcykgew0KKyAgICBGWF9EV09SRCBkd0hhc2g7DQorICAgIElGWF9Gb250KiBwRm9udDsNCisgICAgbV9GaWxlQWNjZXNzMklGWEZvbnQuR2V0TmV4dEFzc29jKHBvcywgZHdIYXNoLCBwRm9udCk7DQorICAgIGlmIChOVUxMICE9IHBGb250KSB7DQorICAgICAgcEZvbnQtPlJlbGVhc2UoKTsNCisgICAgfQ0KKyAgfQ0KKyAgcG9zID0gbV9JRlhGb250MkZpbGVSZWFkLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChwb3MpIHsNCisgICAgSUZYX0ZvbnQqIHBGb250Ow0KKyAgICBJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZDsNCisgICAgbV9JRlhGb250MkZpbGVSZWFkLkdldE5leHRBc3NvYyhwb3MsIHBGb250LCBwRmlsZVJlYWQpOw0KKyAgICBwRmlsZVJlYWQtPlJlbGVhc2UoKTsNCisgIH0NCit9DQordm9pZCBDRlhfRm9udE1nckltcDo6UmVtb3ZlRm9udChJRlhfRm9udCogcEVGb250KSB7DQorICBpZiAoTlVMTCA9PSBwRUZvbnQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQ7DQorICBpZiAobV9JRlhGb250MkZpbGVSZWFkLkxvb2t1cChwRUZvbnQsIHBGaWxlUmVhZCkpIHsNCisgICAgcEZpbGVSZWFkLT5SZWxlYXNlKCk7DQorICAgIG1fSUZYRm9udDJGaWxlUmVhZC5SZW1vdmVLZXkocEVGb250KTsNCisgIH0NCisgIEZYX1BPU0lUSU9OIHBvczsNCisgIHBvcyA9IG1fRmlsZUFjY2VzczJJRlhGb250LkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChwb3MpIHsNCisgICAgRlhfRFdPUkQgZHdIYXNoOw0KKyAgICBJRlhfRm9udCogcENGb250Ow0KKyAgICBtX0ZpbGVBY2Nlc3MySUZYRm9udC5HZXROZXh0QXNzb2MocG9zLCBkd0hhc2gsIHBDRm9udCk7DQorICAgIGlmIChwQ0ZvbnQgPT0gcEVGb250KSB7DQorICAgICAgbV9GaWxlQWNjZXNzMklGWEZvbnQuUmVtb3ZlS2V5KGR3SGFzaCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHBvcyA9IG1fSGFzaDJGb250cy5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocG9zKSB7DQorICAgIEZYX0RXT1JEIGR3SGFzaDsNCisgICAgQ0ZYX0FycmF5VGVtcGxhdGU8SUZYX0ZvbnQqPiogcEZvbnRzOw0KKyAgICBtX0hhc2gyRm9udHMuR2V0TmV4dEFzc29jKHBvcywgZHdIYXNoLCBwRm9udHMpOw0KKyAgICBpZiAoTlVMTCAhPSBwRm9udHMpIHsNCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwRm9udHMtPkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICBpZiAocEZvbnRzLT5HZXRBdChpKSA9PSBwRUZvbnQpIHsNCisgICAgICAgICAgcEZvbnRzLT5TZXRBdChpLCBOVUxMKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgbV9IYXNoMkZvbnRzLlJlbW92ZUtleShkd0hhc2gpOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0ZYX0ZvbnRNZ3JJbXA6OlJlcG9ydEZhY2UoRlhGVF9GYWNlIHBGYWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnREZXNjcmlwdG9ycyYgRm9udHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRmlsZUFjY2VzcyogcEZvbnRBY2Nlc3MpIHsNCisgIGlmICgwID09IChwRmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX0ZvbnREZXNjcmlwdG9yKiBwRm9udCA9IG5ldyBDRlhfRm9udERlc2NyaXB0b3I7DQorICBwRm9udC0+bV9kd0ZvbnRTdHlsZXMgfD0gRlhGVF9Jc19GYWNlX0JvbGQocEZhY2UpID8gRlhfRk9OVFNUWUxFX0JvbGQgOiAwOw0KKyAgcEZvbnQtPm1fZHdGb250U3R5bGVzIHw9IEZYRlRfSXNfRmFjZV9JdGFsaWMocEZhY2UpID8gRlhfRk9OVFNUWUxFX0l0YWxpYyA6IDA7DQorICBwRm9udC0+bV9kd0ZvbnRTdHlsZXMgfD0gR2V0RmxhZ3MocEZhY2UpOw0KKyAgQ0ZYX1dvcmRBcnJheSBDaGFyc2V0czsNCisgIEdldENoYXJzZXRzKHBGYWNlLCBDaGFyc2V0cyk7DQorICBHZXRVU0JDU0IocEZhY2UsIHBGb250LT5tX2R3VXNiLCBwRm9udC0+bV9kd0NzYik7DQorICB1bnNpZ25lZCBsb25nIG5MZW5ndGggPSAwOw0KKyAgRlRfVUxvbmcgZHdUYWc7DQorICB1aW50OF90KiBwVGFibGUgPSBOVUxMOw0KKyAgRlRfRU5DX1RBRyhkd1RhZywgJ24nLCAnYScsICdtJywgJ2UnKTsNCisgIHVuc2lnbmVkIGludCBlcnJvciA9IEZYRlRfTG9hZF9TZm50X1RhYmxlKHBGYWNlLCBkd1RhZywgMCwgTlVMTCwgJm5MZW5ndGgpOw0KKyAgaWYgKDAgPT0gZXJyb3IgJiYgMCAhPSBuTGVuZ3RoKSB7DQorICAgIHBUYWJsZSA9IEZYX0FsbG9jKHVpbnQ4X3QsIG5MZW5ndGgpOw0KKyAgICBlcnJvciA9IEZYRlRfTG9hZF9TZm50X1RhYmxlKHBGYWNlLCBkd1RhZywgMCwgcFRhYmxlLCBOVUxMKTsNCisgICAgaWYgKDAgIT0gZXJyb3IpIHsNCisgICAgICBGWF9GcmVlKHBUYWJsZSk7DQorICAgICAgcFRhYmxlID0gTlVMTDsNCisgICAgfQ0KKyAgfQ0KKyAgR2V0TmFtZXMocFRhYmxlLCBwRm9udC0+bV93c0ZhbWlseU5hbWVzKTsNCisgIGlmIChOVUxMICE9IHBUYWJsZSkgew0KKyAgICBGWF9GcmVlKHBUYWJsZSk7DQorICB9DQorICBwRm9udC0+bV93c0ZhbWlseU5hbWVzLkFkZChDRlhfQnl0ZVN0cmluZyhwRmFjZS0+ZmFtaWx5X25hbWUpLlVURjhEZWNvZGUoKSk7DQorICBwRm9udC0+bV93c0ZhY2VOYW1lID0NCisgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKEZYRlRfR2V0X1Bvc3RzY3JpcHRfTmFtZShwRmFjZSkpOw0KKyAgcEZvbnQtPm1fbkZhY2VJbmRleCA9IHBGYWNlLT5mYWNlX2luZGV4Ow0KKyAgcEZvbnQtPm1fcEZpbGVBY2Nlc3MgPSBwRm9udEFjY2Vzcy0+UmV0YWluKCk7DQorICBOb3JtYWxpemVGb250TmFtZShwRm9udC0+bV93c0ZhY2VOYW1lKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHBGb250LT5tX3dzRmFtaWx5TmFtZXMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgTm9ybWFsaXplRm9udE5hbWUocEZvbnQtPm1fd3NGYW1pbHlOYW1lc1tpXSk7DQorICB9DQorICBGb250cy5BZGQocEZvbnQpOw0KK30NCitGWF9EV09SRCBDRlhfRm9udE1nckltcDo6R2V0RmxhZ3MoRlhGVF9GYWNlIHBGYWNlKSB7DQorICBGWF9EV09SRCBmbGFnID0gMDsNCisgIGlmIChGVF9JU19GSVhFRF9XSURUSChwRmFjZSkpIHsNCisgICAgZmxhZyB8PSBGWF9GT05UU1RZTEVfRml4ZWRQaXRjaDsNCisgIH0NCisgIFRUX09TMiogcE9TMiA9IChUVF9PUzIqKUZUX0dldF9TZm50X1RhYmxlKHBGYWNlLCBmdF9zZm50X29zMik7DQorICBpZiAoIXBPUzIpIHsNCisgICAgcmV0dXJuIGZsYWc7DQorICB9DQorICBpZiAocE9TMi0+dWxDb2RlUGFnZVJhbmdlMSAmICgxIDw8IDMxKSkgew0KKyAgICBmbGFnIHw9IEZYX0ZPTlRTVFlMRV9TeW1ib2xpYzsNCisgIH0NCisgIGlmIChwT1MyLT5wYW5vc2VbMF0gPT0gMikgew0KKyAgICB1aW50OF90IHVTZXJpZiA9IHBPUzItPnBhbm9zZVsxXTsNCisgICAgaWYgKCh1U2VyaWYgPiAxICYmIHVTZXJpZiA8IDEwKSB8fCB1U2VyaWYgPiAxMykgew0KKyAgICAgIGZsYWcgfD0gRlhfRk9OVFNUWUxFX1NlcmlmOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gZmxhZzsNCit9DQorI2RlZmluZSBHZXRVSW50OChwKSAoKHVpbnQ4X3QpKChwKVswXSkpDQorI2RlZmluZSBHZXRVSW50MTYocCkgKCh1aW50MTZfdCkoKHApWzBdIDw8IDggfCAocClbMV0pKQ0KKyNkZWZpbmUgR2V0VUludDMyKHApIFwNCisgICgodWludDMyX3QpKChwKVswXSA8PCAyNCB8IChwKVsxXSA8PCAxNiB8IChwKVsyXSA8PCA4IHwgKHApWzNdKSkNCit2b2lkIENGWF9Gb250TWdySW1wOjpHZXROYW1lcyhjb25zdCB1aW50OF90KiBuYW1lX3RhYmxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQXJyYXkmIE5hbWVzKSB7DQorICBpZiAoTlVMTCA9PSBuYW1lX3RhYmxlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHVpbnQ4X3QqIGxwVGFibGUgPSAodWludDhfdCopbmFtZV90YWJsZTsNCisgIENGWF9XaWRlU3RyaW5nIHdzRmFtaWx5Ow0KKyAgdWludDhfdCogc3AgPSBscFRhYmxlICsgMjsNCisgIHVpbnQ4X3QqIGxwTmFtZVJlY29yZCA9IGxwVGFibGUgKyA2Ow0KKyAgdWludDE2X3Qgbk5hbWVDb3VudCA9IEdldFVJbnQxNihzcCk7DQorICB1aW50OF90KiBscFN0ciA9IGxwVGFibGUgKyBHZXRVSW50MTYoc3AgKyAyKTsNCisgIGZvciAodWludDE2X3QgaiA9IDA7IGogPCBuTmFtZUNvdW50OyBqKyspIHsNCisgICAgdWludDE2X3Qgbk5hbWVJRCA9IEdldFVJbnQxNihscE5hbWVSZWNvcmQgKyBqICogMTIgKyA2KTsNCisgICAgaWYgKG5OYW1lSUQgIT0gMSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIHVpbnQxNl90IG5QbGF0Zm9ybUlEID0gR2V0VUludDE2KGxwTmFtZVJlY29yZCArIGogKiAxMiArIDApOw0KKyAgICB1aW50MTZfdCBuTmFtZUxlbmd0aCA9IEdldFVJbnQxNihscE5hbWVSZWNvcmQgKyBqICogMTIgKyA4KTsNCisgICAgdWludDE2X3Qgbk5hbWVPZmZzZXQgPSBHZXRVSW50MTYobHBOYW1lUmVjb3JkICsgaiAqIDEyICsgMTApOw0KKyAgICB3c0ZhbWlseS5FbXB0eSgpOw0KKyAgICBpZiAoblBsYXRmb3JtSUQgIT0gMSkgew0KKyAgICAgIGZvciAodWludDE2X3QgayA9IDA7IGsgPCBuTmFtZUxlbmd0aCAvIDI7IGsrKykgew0KKyAgICAgICAgRlhfV0NIQVIgd2NUZW1wID0gR2V0VUludDE2KGxwU3RyICsgbk5hbWVPZmZzZXQgKyBrICogMik7DQorICAgICAgICB3c0ZhbWlseSArPSB3Y1RlbXA7DQorICAgICAgfQ0KKyAgICAgIE5hbWVzLkFkZCh3c0ZhbWlseSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgZm9yICh1aW50MTZfdCBrID0gMDsgayA8IG5OYW1lTGVuZ3RoOyBrKyspIHsNCisgICAgICAgIEZYX1dDSEFSIHdjVGVtcCA9IEdldFVJbnQ4KGxwU3RyICsgbk5hbWVPZmZzZXQgKyBrKTsNCisgICAgICAgIHdzRmFtaWx5ICs9IHdjVGVtcDsNCisgICAgICB9DQorICAgICAgTmFtZXMuQWRkKHdzRmFtaWx5KTsNCisgICAgfQ0KKyAgfQ0KK30NCisjdW5kZWYgR2V0VUludDgNCisjdW5kZWYgR2V0VUludDE2DQorI3VuZGVmIEdldFVJbnQzMg0KK3N0cnVjdCBGWF9CSVQyQ0hBUlNFVCB7DQorICBGWF9XT1JEIHdCaXQ7DQorICBGWF9XT1JEIHdDaGFyc2V0Ow0KK307DQorRlhfQklUMkNIQVJTRVQgZ19GWF9CaXQyQ2hhcnNldDFbMTZdID0gew0KKyAgICB7MSA8PCAwLCBGWF9DSEFSU0VUX0FOU0l9LA0KKyAgICB7MSA8PCAxLCBGWF9DSEFSU0VUX01TV2luX0Vhc3RlckV1cm9wZWFufSwNCisgICAgezEgPDwgMiwgRlhfQ0hBUlNFVF9NU1dpbl9DeXJpbGxpY30sDQorICAgIHsxIDw8IDMsIEZYX0NIQVJTRVRfTVNXaW5fR3JlZWt9LA0KKyAgICB7MSA8PCA0LCBGWF9DSEFSU0VUX01TV2luX1R1cmtpc2h9LA0KKyAgICB7MSA8PCA1LCBGWF9DSEFSU0VUX01TV2luX0hlYnJld30sDQorICAgIHsxIDw8IDYsIEZYX0NIQVJTRVRfTVNXaW5fQXJhYmljfSwNCisgICAgezEgPDwgNywgRlhfQ0hBUlNFVF9NU1dpbl9CYWx0aWN9LA0KKyAgICB7MSA8PCA4LCBGWF9DSEFSU0VUX01TV2luX1ZpZXRuYW1lc2V9LA0KKyAgICB7MSA8PCA5LCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCAxMCwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgMTEsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDEyLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCAxMywgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgMTQsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDE1LCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KK307DQorRlhfQklUMkNIQVJTRVQgZ19GWF9CaXQyQ2hhcnNldDJbMTZdID0gew0KKyAgICB7MSA8PCAwLCBGWF9DSEFSU0VUX1RoYWl9LA0KKyAgICB7MSA8PCAxLCBGWF9DSEFSU0VUX1NoaWZ0SklTfSwNCisgICAgezEgPDwgMiwgRlhfQ0hBUlNFVF9DaGluZXNlU2ltcGxpZmllZH0sDQorICAgIHsxIDw8IDMsIEZYX0NIQVJTRVRfS29yZWFufSwNCisgICAgezEgPDwgNCwgRlhfQ0hBUlNFVF9DaGluZXNlVHJpZGl0aW9uYWx9LA0KKyAgICB7MSA8PCA1LCBGWF9DSEFSU0VUX0pvaGFifSwNCisgICAgezEgPDwgNiwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgNywgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgOCwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgOSwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgMTAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDExLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCAxMiwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgMTMsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDE0LCBGWF9DSEFSU0VUX09FTX0sDQorICAgIHsxIDw8IDE1LCBGWF9DSEFSU0VUX1N5bWJvbH0sDQorfTsNCitGWF9CSVQyQ0hBUlNFVCBnX0ZYX0JpdDJDaGFyc2V0M1sxNl0gPSB7DQorICAgIHsxIDw8IDAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sICB7MSA8PCAxLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCAyLCBGWF9DSEFSU0VUX0RlZmF1bHR9LCAgezEgPDwgMywgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgNCwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwgIHsxIDw8IDUsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDYsIEZYX0NIQVJTRVRfRGVmYXVsdH0sICB7MSA8PCA3LCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCA4LCBGWF9DSEFSU0VUX0RlZmF1bHR9LCAgezEgPDwgOSwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgMTAsIEZYX0NIQVJTRVRfRGVmYXVsdH0sIHsxIDw8IDExLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCAxMiwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwgezEgPDwgMTMsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDE0LCBGWF9DSEFSU0VUX0RlZmF1bHR9LCB7MSA8PCAxNSwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCit9Ow0KK0ZYX0JJVDJDSEFSU0VUIGdfRlhfQml0MkNoYXJzZXQ0WzE2XSA9IHsNCisgICAgezEgPDwgMCwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwgIHsxIDw8IDEsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDIsIEZYX0NIQVJTRVRfRGVmYXVsdH0sICB7MSA8PCAzLCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCA0LCBGWF9DSEFSU0VUX0RlZmF1bHR9LCAgezEgPDwgNSwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgNiwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwgIHsxIDw8IDcsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDgsIEZYX0NIQVJTRVRfRGVmYXVsdH0sICB7MSA8PCA5LCBGWF9DSEFSU0VUX0RlZmF1bHR9LA0KKyAgICB7MSA8PCAxMCwgRlhfQ0hBUlNFVF9EZWZhdWx0fSwgezEgPDwgMTEsIEZYX0NIQVJTRVRfRGVmYXVsdH0sDQorICAgIHsxIDw8IDEyLCBGWF9DSEFSU0VUX0RlZmF1bHR9LCB7MSA8PCAxMywgRlhfQ0hBUlNFVF9EZWZhdWx0fSwNCisgICAgezEgPDwgMTQsIEZYX0NIQVJTRVRfRGVmYXVsdH0sIHsxIDw8IDE1LCBGWF9DSEFSU0VUX1VTfSwNCit9Ow0KKyNkZWZpbmUgQ09ERVBBR0VSQU5HRV9JTVBMRU1FTlQobikgICAgICAgICAgICAgICAgICAgXA0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMTY7IGkrKykgeyAgICAgICAgICAgICAgICAgXA0KKyAgICBpZiAoKGEjI24gJiBnX0ZYX0JpdDJDaGFyc2V0IyNuW2ldLndCaXQpICE9IDApIHsgXA0KKyAgICAgIENoYXJzZXRzLkFkZChnX0ZYX0JpdDJDaGFyc2V0IyNuW2ldLndDaGFyc2V0KTsgXA0KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgfQ0KK3ZvaWQgQ0ZYX0ZvbnRNZ3JJbXA6OkdldENoYXJzZXRzKEZYRlRfRmFjZSBwRmFjZSwgQ0ZYX1dvcmRBcnJheSYgQ2hhcnNldHMpIHsNCisgIENoYXJzZXRzLlJlbW92ZUFsbCgpOw0KKyAgVFRfT1MyKiBwT1MyID0gKFRUX09TMiopRlRfR2V0X1NmbnRfVGFibGUocEZhY2UsIGZ0X3NmbnRfb3MyKTsNCisgIGlmIChOVUxMICE9IHBPUzIpIHsNCisgICAgRlhfV09SRCBhMSwgYTIsIGEzLCBhNDsNCisgICAgYTEgPSBwT1MyLT51bENvZGVQYWdlUmFuZ2UxICYgMHgwMDAwZmZmZjsNCisgICAgQ09ERVBBR0VSQU5HRV9JTVBMRU1FTlQoMSk7DQorICAgIGEyID0gKHBPUzItPnVsQ29kZVBhZ2VSYW5nZTEgPj4gMTYpICYgMHgwMDAwZmZmZjsNCisgICAgQ09ERVBBR0VSQU5HRV9JTVBMRU1FTlQoMik7DQorICAgIGEzID0gcE9TMi0+dWxDb2RlUGFnZVJhbmdlMiAmIDB4MDAwMGZmZmY7DQorICAgIENPREVQQUdFUkFOR0VfSU1QTEVNRU5UKDMpOw0KKyAgICBhNCA9IChwT1MyLT51bENvZGVQYWdlUmFuZ2UyID4+IDE2KSAmIDB4MDAwMGZmZmY7DQorICAgIENPREVQQUdFUkFOR0VfSU1QTEVNRU5UKDQpOw0KKyAgfSBlbHNlIHsNCisgICAgQ2hhcnNldHMuQWRkKEZYX0NIQVJTRVRfRGVmYXVsdCk7DQorICB9DQorfQ0KKyN1bmRlZiBDT0RFUEFHRVJBTkdFX0lNUExFTUVOVA0KK3ZvaWQgQ0ZYX0ZvbnRNZ3JJbXA6OkdldFVTQkNTQihGWEZUX0ZhY2UgcEZhY2UsIEZYX0RXT1JEKiBVU0IsIEZYX0RXT1JEKiBDU0IpIHsNCisgIFRUX09TMiogcE9TMiA9IChUVF9PUzIqKUZUX0dldF9TZm50X1RhYmxlKHBGYWNlLCBmdF9zZm50X29zMik7DQorICBpZiAoTlVMTCAhPSBwT1MyKSB7DQorICAgIFVTQlswXSA9IHBPUzItPnVsVW5pY29kZVJhbmdlMTsNCisgICAgVVNCWzFdID0gcE9TMi0+dWxVbmljb2RlUmFuZ2UyOw0KKyAgICBVU0JbMl0gPSBwT1MyLT51bFVuaWNvZGVSYW5nZTM7DQorICAgIFVTQlszXSA9IHBPUzItPnVsVW5pY29kZVJhbmdlNDsNCisgICAgQ1NCWzBdID0gcE9TMi0+dWxDb2RlUGFnZVJhbmdlMTsNCisgICAgQ1NCWzFdID0gcE9TMi0+dWxDb2RlUGFnZVJhbmdlMjsNCisgIH0gZWxzZSB7DQorICAgIFVTQlswXSA9IDA7DQorICAgIFVTQlsxXSA9IDA7DQorICAgIFVTQlsyXSA9IDA7DQorICAgIFVTQlszXSA9IDA7DQorICAgIENTQlswXSA9IDA7DQorICAgIENTQlsxXSA9IDA7DQorICB9DQorfQ0KK3ZvaWQgQ0ZYX0ZvbnRNZ3JJbXA6Ok5vcm1hbGl6ZUZvbnROYW1lKENGWF9XaWRlU3RyaW5nJiBGb250TmFtZSkgew0KKyAgRm9udE5hbWUuTWFrZUxvd2VyKCk7DQorICBGb250TmFtZS5SZW1vdmUoJyAnKTsNCisgIEZvbnROYW1lLlJlbW92ZSgnLScpOw0KK30NCitpbnQzMl90IENGWF9Gb250TWdySW1wOjpJc1BhcnROYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBOYW1lMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBOYW1lMikgew0KKyAgaWYgKE5hbWUxLkZpbmQoKGNvbnN0IEZYX1dDSEFSKilOYW1lMikgIT0gLTEpIHsNCisgICAgcmV0dXJuIDE7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9mb250L2Z4X3N0ZGZvbnRtZ3IuaCBiL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9zdGRmb250bWdyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FiOTg0ZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvZm9udC9meF9zdGRmb250bWdyLmgKQEAgLTAsMCArMSwyMjUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhfRk9OVE1HUl9JTVANCisjZGVmaW5lIF9GWF9GT05UTUdSX0lNUA0KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQoraW50MzJfdCBGWF9HZXRTaW1pbGFyVmFsdWUoRlhfTFBDRk9OVERFU0NSSVBUT1IgcEZvbnQsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcyk7DQorRlhfTFBDRk9OVERFU0NSSVBUT1IgRlhfRGVmRm9udE1hdGNoZXIoRlhfTFBGT05UTUFUQ0hQQVJBTVMgcFBhcmFtcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRm9udERlc2NyaXB0b3JzJiBmb250cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVXNlckRhdGEpOw0KK2NsYXNzIENGWF9TdGRGb250TWdySW1wIDogcHVibGljIElGWF9Gb250TWdyIHsNCisgcHVibGljOg0KKyAgQ0ZYX1N0ZEZvbnRNZ3JJbXAoRlhfTFBFbnVtQWxsRm9udHMgcEVudW1lcmF0b3IsDQorICAgICAgICAgICAgICAgICAgICBGWF9MUE1hdGNoRm9udCBwTWF0Y2hlciwNCisgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBVc2VyRGF0YSk7DQorICB+Q0ZYX1N0ZEZvbnRNZ3JJbXAoKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKyAgdmlydHVhbCBJRlhfRm9udCogR2V0RGVmRm9udEJ5Q29kZVBhZ2UoRlhfV09SRCB3Q29kZVBhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSA9IE5VTEwpOw0KKyAgdmlydHVhbCBJRlhfRm9udCogR2V0RGVmRm9udEJ5Q2hhcnNldCh1aW50OF90IG5DaGFyc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCk7DQorICB2aXJ0dWFsIElGWF9Gb250KiBHZXREZWZGb250QnlVbmljb2RlKEZYX1dDSEFSIHdVbmljb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCk7DQorICB2aXJ0dWFsIElGWF9Gb250KiBHZXREZWZGb250QnlMYW5ndWFnZShGWF9XT1JEIHdMYW5ndWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCk7DQorICB2aXJ0dWFsIElGWF9Gb250KiBMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlID0gMHhGRkZGKTsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIExvYWRGb250KGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUxlbmd0aCk7DQorICB2aXJ0dWFsIElGWF9Gb250KiBMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6RmlsZU5hbWUpOw0KKyAgdmlydHVhbCBJRlhfRm9udCogTG9hZEZvbnQoSUZYX1N0cmVhbSogcEZvbnRTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEFsaWFzID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcyA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlU3RyZWFtID0gRkFMU0UpOw0KKyAgdmlydHVhbCBJRlhfRm9udCogTG9hZEZvbnQoSUZYX0ZvbnQqIHBTcmNGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UgPSAweEZGRkYpOw0KKyAgdmlydHVhbCB2b2lkIENsZWFyRm9udENhY2hlKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVtb3ZlRm9udChJRlhfRm9udCogcEZvbnQpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBGWF9MUE1hdGNoRm9udCBtX3BNYXRjaGVyOw0KKyAgRlhfTFBFbnVtQWxsRm9udHMgbV9wRW51bWVyYXRvcjsNCisgIENGWF9Gb250RGVzY3JpcHRvcnMgbV9Gb250RmFjZXM7DQorICBDRlhfUHRyQXJyYXkgbV9Gb250czsNCisgIENGWF9NYXBQdHJUb1B0ciBtX0NQRm9udHM7DQorICBDRlhfTWFwUHRyVG9QdHIgbV9GYW1pbHlGb250czsNCisgIENGWF9NYXBQdHJUb1B0ciBtX1VuaWNvZGVGb250czsNCisgIENGWF9NYXBQdHJUb1B0ciBtX0J1ZmZlckZvbnRzOw0KKyAgQ0ZYX01hcFB0clRvUHRyIG1fRmlsZUZvbnRzOw0KKyAgQ0ZYX01hcFB0clRvUHRyIG1fU3RyZWFtRm9udHM7DQorICBDRlhfTWFwUHRyVG9QdHIgbV9EZXJpdmVGb250czsNCisgIHZvaWQqIG1fcFVzZXJEYXRhOw0KKyAgdm9pZCBSZW1vdmVGb250KENGWF9NYXBQdHJUb1B0ciYgZm9udE1hcCwgSUZYX0ZvbnQqIHBGb250KTsNCisgIEZYX0xQQ0ZPTlRERVNDUklQVE9SIEZpbmRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdNYXRjaEZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1VTQiA9IDk5OSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIHdVbmljb2RlID0gMCk7DQorICBJRlhfRm9udCogR2V0Rm9udChGWF9MUENGT05UREVTQ1JJUFRPUiBwRkQsIEZYX0RXT1JEIGR3Rm9udFN0eWxlcyk7DQorfTsNCitGWF9EV09SRCBGWF9HZXRHZGlGb250U3R5bGVzKGNvbnN0IExPR0ZPTlRXJiBsZik7DQorI2Vsc2UNCitjbGFzcyBDRlhfRm9udERlc2NyaXB0b3Igew0KKyBwdWJsaWM6DQorICBDRlhfRm9udERlc2NyaXB0b3IoKQ0KKyAgICAgIDogbV9wRmlsZUFjY2VzcyhOVUxMKSwgbV9uRmFjZUluZGV4KDApLCBtX2R3Rm9udFN0eWxlcygwKSB7DQorICAgIG1fZHdVc2JbMF0gPSBtX2R3VXNiWzFdID0gbV9kd1VzYlsyXSA9IG1fZHdVc2JbM10gPSAwOw0KKyAgICBtX2R3Q3NiWzBdID0gbV9kd0NzYlsxXSA9IDA7DQorICB9DQorICB+Q0ZYX0ZvbnREZXNjcmlwdG9yKCkgew0KKyAgICBpZiAoTlVMTCAhPSBtX3BGaWxlQWNjZXNzKSB7DQorICAgICAgbV9wRmlsZUFjY2Vzcy0+UmVsZWFzZSgpOw0KKyAgICB9DQorICB9DQorICBJRlhfRmlsZUFjY2VzcyogbV9wRmlsZUFjY2VzczsNCisgIGludDMyX3QgbV9uRmFjZUluZGV4Ow0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c0ZhY2VOYW1lOw0KKyAgQ0ZYX1dpZGVTdHJpbmdBcnJheSBtX3dzRmFtaWx5TmFtZXM7DQorICBGWF9EV09SRCBtX2R3Rm9udFN0eWxlczsNCisgIEZYX0RXT1JEIG1fZHdVc2JbNF07DQorICBGWF9EV09SRCBtX2R3Q3NiWzJdOw0KK307DQordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxDRlhfRm9udERlc2NyaXB0b3IqPiBDRlhfRm9udERlc2NyaXB0b3JzOw0KK3N0cnVjdCBGWF9Gb250RGVzY3JpcHRvckluZm8gew0KKyBwdWJsaWM6DQorICBDRlhfRm9udERlc2NyaXB0b3IqIHBGb250Ow0KKyAgaW50MzJfdCBuUGVuYWx0eTsNCisgIEZYX0JPT0wgb3BlcmF0b3I+KGNvbnN0IEZYX0ZvbnREZXNjcmlwdG9ySW5mbyYgeCkgew0KKyAgICByZXR1cm4gdGhpcy0+blBlbmFsdHkgPiB4Lm5QZW5hbHR5Ow0KKyAgfTsNCisgIEZYX0JPT0wgb3BlcmF0b3I8KGNvbnN0IEZYX0ZvbnREZXNjcmlwdG9ySW5mbyYgeCkgew0KKyAgICByZXR1cm4gdGhpcy0+blBlbmFsdHkgPCB4Lm5QZW5hbHR5Ow0KKyAgfTsNCisgIEZYX0JPT0wgb3BlcmF0b3I9PShjb25zdCBGWF9Gb250RGVzY3JpcHRvckluZm8mIHgpIHsNCisgICAgcmV0dXJuIHRoaXMtPm5QZW5hbHR5ID09IHgublBlbmFsdHk7DQorICB9Ow0KK307DQordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxGWF9Gb250RGVzY3JpcHRvckluZm8+IENGWF9Gb250RGVzY3JpcHRvckluZm9zOw0KK3N0cnVjdCBGWF9IYW5kbGVQYXJlbnRQYXRoIHsNCisgIEZYX0hhbmRsZVBhcmVudFBhdGgoKSB7fQ0KKyAgRlhfSGFuZGxlUGFyZW50UGF0aChjb25zdCBGWF9IYW5kbGVQYXJlbnRQYXRoJiB4KSB7DQorICAgIHBGaWxlSGFuZGxlID0geC5wRmlsZUhhbmRsZTsNCisgICAgYnNQYXJlbnRQYXRoID0geC5ic1BhcmVudFBhdGg7DQorICB9DQorICB2b2lkKiBwRmlsZUhhbmRsZTsNCisgIENGWF9CeXRlU3RyaW5nIGJzUGFyZW50UGF0aDsNCit9Ow0KK2NsYXNzIENGWF9Gb250U291cmNlRW51bV9GaWxlIDogcHVibGljIElGWF9Gb250U291cmNlRW51bSB7DQorIHB1YmxpYzoNCisgIENGWF9Gb250U291cmNlRW51bV9GaWxlKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH07DQorICB2aXJ0dWFsIEZYX1BPU0lUSU9OIEdldFN0YXJ0UG9zaXRpb24odm9pZCogcFVzZXJEYXRhID0gTlVMTCk7DQorICB2aXJ0dWFsIElGWF9GaWxlQWNjZXNzKiBHZXROZXh0KEZYX1BPU0lUSU9OJiBwb3MsIHZvaWQqIHBVc2VyRGF0YSA9IE5VTEwpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0TmV4dEZpbGUoKTsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NOZXh0Ow0KKyAgQ0ZYX09iamVjdEFycmF5PEZYX0hhbmRsZVBhcmVudFBhdGg+IG1fRm9sZGVyUXVldWU7DQorICBDRlhfQnl0ZVN0cmluZ0FycmF5IG1fRm9sZGVyUGF0aHM7DQorfTsNCit0eXBlZGVmIENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9EV09SRCwgSUZYX0ZpbGVBY2Nlc3MqPiBDRlhfSGFzaEZpbGVNYXA7DQordHlwZWRlZiBDRlhfTWFwUHRyVGVtcGxhdGU8RlhfRFdPUkQsIElGWF9Gb250Kj4gQ0ZYX0hhc2hGb250TWFwOw0KK3R5cGVkZWYgQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0RXT1JELCBDRlhfRm9udERlc2NyaXB0b3JJbmZvcyo+DQorICAgIENGWF9IYXNoRm9udERlc2NzTWFwOw0KK3R5cGVkZWYgQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0RXT1JELCBDRlhfQXJyYXlUZW1wbGF0ZTxJRlhfRm9udCo+Kj4NCisgICAgQ0ZYX0hhc2hGb250c01hcDsNCit0eXBlZGVmIENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9XQ0hBUiwgSUZYX0ZvbnQqPiBDRlhfVW5pY29kZUZvbnRNYXA7DQordHlwZWRlZiBDRlhfTWFwUHRyVGVtcGxhdGU8SUZYX0ZpbGVBY2Nlc3MqLCBDRlhfQXJyYXlUZW1wbGF0ZTxJRlhfRm9udCo+Kj4NCisgICAgQ0ZYX0ZpbGVGb250TWFwOw0KK3R5cGVkZWYgQ0ZYX01hcFB0clRlbXBsYXRlPElGWF9Gb250KiwgSUZYX0ZpbGVSZWFkKj4gQ0ZYX0ZvblN0cmVhbXRNYXA7DQorY2xhc3MgQ0ZYX0ZvbnRNZ3JJbXAgOiBwdWJsaWMgSUZYX0ZvbnRNZ3Igew0KKyBwdWJsaWM6DQorICBDRlhfRm9udE1nckltcChJRlhfRm9udFNvdXJjZUVudW0qIHBGb250RW51bSwNCisgICAgICAgICAgICAgICAgIElGWF9Gb250TWdyRGVsZWdhdGUqIHBEZWxlZ2F0ZSA9IE5VTEwsDQorICAgICAgICAgICAgICAgICB2b2lkKiBwVXNlckRhdGEgPSBOVUxMKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCk7DQorICB2aXJ0dWFsIElGWF9Gb250KiBHZXREZWZGb250QnlDb2RlUGFnZShGWF9XT1JEIHdDb2RlUGFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5ID0gTlVMTCk7DQorICB2aXJ0dWFsIElGWF9Gb250KiBHZXREZWZGb250QnlDaGFyc2V0KHVpbnQ4X3QgbkNoYXJzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKTsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIEdldERlZkZvbnRCeVVuaWNvZGUoRlhfV0NIQVIgd1VuaWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKTsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIEdldERlZkZvbnRCeUxhbmd1YWdlKEZYX1dPUkQgd0xhbmd1YWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKTsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIEdldEZvbnRCeUNvZGVQYWdlKEZYX1dPUkQgd0NvZGVQYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkgPSBOVUxMKTsNCisgIHZpcnR1YWwgSUZYX0ZvbnQqIEdldEZvbnRCeUNoYXJzZXQodWludDhfdCBuQ2hhcnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSA9IE5VTEwpOw0KKyAgdmlydHVhbCBJRlhfRm9udCogR2V0Rm9udEJ5VW5pY29kZShGWF9XQ0hBUiB3VW5pY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSA9IE5VTEwpOw0KKyAgdmlydHVhbCBJRlhfRm9udCogR2V0Rm9udEJ5TGFuZ3VhZ2UoRlhfV09SRCB3TGFuZ3VhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSA9IE5VTEwpOw0KKyAgdmlydHVhbCBJRlhfRm9udCogTG9hZEZvbnQoY29uc3QgdWludDhfdCogcEJ1ZmZlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZhY2VJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBGYWNlQ291bnQpOw0KKyAgdmlydHVhbCBJRlhfRm9udCogTG9hZEZvbnQoY29uc3QgRlhfV0NIQVIqIHBzekZpbGVOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRmFjZUluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcEZhY2VDb3VudCk7DQorICB2aXJ0dWFsIElGWF9Gb250KiBMb2FkRm9udChJRlhfU3RyZWFtKiBwRm9udFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZhY2VJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBGYWNlQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlU3RyZWFtID0gRkFMU0UpOw0KKyAgdmlydHVhbCB2b2lkIENsZWFyRm9udENhY2hlKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVtb3ZlRm9udChJRlhfRm9udCogcEZvbnQpOw0KKyAgRlhfQk9PTCBFbnVtRm9udHMoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBSZXBvcnRGYWNlKEZYRlRfRmFjZSBwRmFjZSwNCisgICAgICAgICAgICAgICAgICBDRlhfRm9udERlc2NyaXB0b3JzJiBGb250cywNCisgICAgICAgICAgICAgICAgICBJRlhfRmlsZUFjY2VzcyogcEZvbnRBY2Nlc3MpOw0KKyAgdm9pZCBHZXROYW1lcyhjb25zdCB1aW50OF90KiBuYW1lX3RhYmxlLCBDRlhfV2lkZVN0cmluZ0FycmF5JiBOYW1lcyk7DQorICB2b2lkIEdldENoYXJzZXRzKEZYRlRfRmFjZSBwRmFjZSwgQ0ZYX1dvcmRBcnJheSYgQ2hhcnNldHMpOw0KKyAgdm9pZCBHZXRVU0JDU0IoRlhGVF9GYWNlIHBGYWNlLCBGWF9EV09SRCogVVNCLCBGWF9EV09SRCogQ1NCKTsNCisgIEZYX0RXT1JEIEdldEZsYWdzKEZYRlRfRmFjZSBwRmFjZSk7DQorICBDRlhfRm9udERlc2NyaXB0b3JzIG1fSW5zdGFsbGVkRm9udHM7DQorICBGWF9CT09MIFZlcmlmeVVuaWNvZGUoQ0ZYX0ZvbnREZXNjcmlwdG9yKiBwRGVzYywgRlhfV0NIQVIgd2NVbmljb2RlKTsNCisgIEZYX0JPT0wgVmVyaWZ5VW5pY29kZShJRlhfRm9udCogcEZvbnQsIEZYX1dDSEFSIHdjVW5pY29kZSk7DQorICB2b2lkIE5vcm1hbGl6ZUZvbnROYW1lKENGWF9XaWRlU3RyaW5nJiBGb250TmFtZSk7DQorICBpbnQzMl90IElzUGFydE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIE5hbWUxLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgTmFtZTIpOw0KKyAgaW50MzJfdCBNYXRjaEZvbnRzKENGWF9Gb250RGVzY3JpcHRvckluZm9zJiBNYXRjaGVkRm9udHMsDQorICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBGb250TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiB3Y1VuaWNvZGUgPSAweEZGRkUpOw0KKyAgaW50MzJfdCBDYWxjUGVuYWx0eShDRlhfRm9udERlc2NyaXB0b3IqIHBJbnN0YWxsZWQsDQorICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBGb250TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgd2NVbmljb2RlID0gMHhGRkZFKTsNCisgIElGWF9Gb250KiBMb2FkRm9udChJRlhfRmlsZUFjY2VzcyogcEZvbnRBY2Nlc3MsDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRmFjZUluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBGYWNlQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiV2FudENhY2hlID0gRkFMU0UpOw0KKyAgRlhGVF9GYWNlIExvYWRGYWNlKElGWF9GaWxlUmVhZCogcEZvbnRTdHJlYW0sIGludDMyX3QgaUZhY2VJbmRleCk7DQorICBDRlhfSGFzaEZvbnREZXNjc01hcCBtX0hhc2gyQ2FuZGlkYXRlTGlzdDsNCisgIENGWF9IYXNoRm9udHNNYXAgbV9IYXNoMkZvbnRzOw0KKyAgQ0ZYX0hhc2hGaWxlTWFwIG1fSGFzaDJGaWxlQWNjZXNzOw0KKyAgQ0ZYX0hhc2hGb250TWFwIG1fRmlsZUFjY2VzczJJRlhGb250Ow0KKyAgQ0ZYX0ZvblN0cmVhbXRNYXAgbV9JRlhGb250MkZpbGVSZWFkOw0KKyAgQ0ZYX1VuaWNvZGVGb250TWFwIG1fRmFpbGVkVW5pY29kZXMyTlVMTDsNCisgIElGWF9Gb250U291cmNlRW51bSogbV9wRm9udFNvdXJjZTsNCisgIElGWF9Gb250TWdyRGVsZWdhdGUqIG1fcERlbGVnYXRlOw0KKyAgdm9pZCogbV9wVXNlckRhdGE7DQorfTsNCisjZW5kaWYNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF9saW5lYnJlYWsuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfbGluZWJyZWFrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzU3OTA0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfbGluZWJyZWFrLmNwcApAQCAtMCwwICsxLDMxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mZ2FzL3NyYy9mZ2FzX2Jhc2UuaCINCisNCitjb25zdCBGWF9MSU5FQlJFQUtUWVBFIGdzX0ZYX0xpbmVCcmVha19QYWlyVGFibGVbNjRdWzMyXSA9IHsNCisgICAge0ZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsDQorICAgICBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJDUCwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsDQorICAgICBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLA0KKyAgICAgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQklCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQklCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsDQorICAgICBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLA0KKyAgICAgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQklCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsDQorICAgICBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwNCisgICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsDQorICAgICBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwNCisgICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsDQorICAgICBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsDQorICAgICBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsDQorICAgICBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQlBCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJJQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsDQorICAgICBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwNCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsDQorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLA0KKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sDQorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwNCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sDQorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLA0KKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwNCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LA0KK307DQorDQordm9pZCBGWF9HZXRMaW5lQnJlYWtQb3NpdGlvbnMoY29uc3QgRlhfV0NIQVIqIHB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfTElORUJSRUFLVFlQRSogcEJya1R5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoKSB7DQorICBpZiAoaUxlbmd0aCA8IDIpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfRFdPUkQgZHdDdXIsIGR3TmV4dDsNCisgIEZYX1dDSEFSIHdjaDsNCisgIHdjaCA9ICpwd3NUZXh0Kys7DQorICBkd0N1ciA9IGtUZXh0TGF5b3V0Q29kZVByb3BlcnRpZXNbKEZYX1dPUkQpd2NoXSAmIDB4MDAzRjsNCisgIGlMZW5ndGgtLTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMZW5ndGg7IGkrKykgew0KKyAgICB3Y2ggPSAqcHdzVGV4dCsrOw0KKyAgICBkd05leHQgPSBrVGV4dExheW91dENvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF0gJiAweDAwM0Y7DQorICAgIGlmIChkd05leHQgPT0gRlhfQ0JQX1NQKSB7DQorICAgICAgcEJya1R5cGVbaV0gPSBGWF9MQlRfUFJPSElCSVRFRF9CUks7DQorICAgIH0gZWxzZSB7DQorICAgICAgcEJya1R5cGVbaV0gPSAqKChjb25zdCBGWF9MSU5FQlJFQUtUWVBFKilnc19GWF9MaW5lQnJlYWtfUGFpclRhYmxlICsNCisgICAgICAgICAgICAgICAgICAgICAgKGR3Q3VyIDw8IDUpICsgZHdOZXh0KTsNCisgICAgfQ0KKyAgICBkd0N1ciA9IGR3TmV4dDsNCisgIH0NCisgIHBCcmtUeXBlW2lMZW5ndGhdID0gRlhfTEJUX0lORElSRUNUX0JSSzsNCit9DQordm9pZCBGWF9HZXRMaW5lQnJlYWtQb3NpdGlvbnMoY29uc3QgRlhfV0NIQVIqIHB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMk1hc3NBcnJheSYgYnApIHsNCisgIGlmIChpTGVuZ3RoIDwgMikgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9MSU5FQlJFQUtUWVBFIGVUeXBlOw0KKyAgRlhfRFdPUkQgZHdDdXIsIGR3TmV4dDsNCisgIEZYX1dDSEFSIHdjaDsNCisgIHdjaCA9ICpwd3NUZXh0Kys7DQorICBkd0N1ciA9IGtUZXh0TGF5b3V0Q29kZVByb3BlcnRpZXNbKEZYX1dPUkQpd2NoXSAmIDB4MDAzRjsNCisgIGlMZW5ndGgtLTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMZW5ndGg7IGkrKykgew0KKyAgICB3Y2ggPSAqcHdzVGV4dCsrOw0KKyAgICBkd05leHQgPSBrVGV4dExheW91dENvZGVQcm9wZXJ0aWVzWyhGWF9XT1JEKXdjaF0gJiAweDAwM0Y7DQorICAgIGlmIChkd05leHQgPT0gRlhfQ0JQX1NQKSB7DQorICAgICAgZVR5cGUgPSBGWF9MQlRfUFJPSElCSVRFRF9CUks7DQorICAgIH0gZWxzZSB7DQorICAgICAgZVR5cGUgPSAqKChjb25zdCBGWF9MSU5FQlJFQUtUWVBFKilnc19GWF9MaW5lQnJlYWtfUGFpclRhYmxlICsNCisgICAgICAgICAgICAgICAgKGR3Q3VyIDw8IDUpICsgZHdOZXh0KTsNCisgICAgfQ0KKyAgICBpZiAoZVR5cGUgPT0gRlhfTEJUX0RJUkVDVF9CUkspIHsNCisgICAgICBicC5BZGQoaSk7DQorICAgIH0NCisgICAgZHdDdXIgPSBkd05leHQ7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3J0ZmJyZWFrLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3J0ZmJyZWFrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDlkOWJhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfcnRmYnJlYWsuY3BwCkBAIC0wLDAgKzEsMTUyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSA8YWxnb3JpdGhtPg0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZnYXMvaW5jbHVkZS9meF9sYmsuaCINCisjaW5jbHVkZSAieGZhL3NyYy9mZ2FzL3NyYy9mZ2FzX2Jhc2UuaCINCisjaW5jbHVkZSAieGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfdW5pY29kZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF9ydGZicmVhay5oIg0KKw0KK0lGWF9SVEZCcmVhayogSUZYX1JURkJyZWFrOjpDcmVhdGUoRlhfRFdPUkQgZHdQb2xpY2llcykgew0KKyAgcmV0dXJuIG5ldyBDRlhfUlRGQnJlYWsoZHdQb2xpY2llcyk7DQorfQ0KK0NGWF9SVEZCcmVhazo6Q0ZYX1JURkJyZWFrKEZYX0RXT1JEIGR3UG9saWNpZXMpDQorICAgIDogbV9kd1BvbGljaWVzKGR3UG9saWNpZXMpLA0KKyAgICAgIG1fcEFyYWJpY0NoYXIoTlVMTCksDQorICAgICAgbV9pQm91bmRhcnlTdGFydCgwKSwNCisgICAgICBtX2lCb3VuZGFyeUVuZCgyMDAwMDAwKSwNCisgICAgICBtX2R3TGF5b3V0U3R5bGVzKDApLA0KKyAgICAgIG1fYlBhZ2luYXRpb24oRkFMU0UpLA0KKyAgICAgIG1fYlZlcnRpY2FsKEZBTFNFKSwNCisgICAgICBtX2JTaW5nbGVMaW5lKEZBTFNFKSwNCisgICAgICBtX2JDaGFyQ29kZShGQUxTRSksDQorICAgICAgbV9wRm9udChOVUxMKSwNCisgICAgICBtX2lGb250SGVpZ2h0KDI0MCksDQorICAgICAgbV9pRm9udFNpemUoMjQwKSwNCisgICAgICBtX2lUYWJXaWR0aCg3MjAwMDApLA0KKyAgICAgIG1fUG9zaXRpb25lZFRhYnMoKSwNCisgICAgICBtX2JPcnBoYW5MaW5lKEZBTFNFKSwNCisgICAgICBtX3dEZWZDaGFyKDB4RkVGRiksDQorICAgICAgbV9pRGVmQ2hhcigwKSwNCisgICAgICBtX3dMaW5lQnJlYWtDaGFyKEwnXG4nKSwNCisgICAgICBtX2lIb3Jpem9udGFsU2NhbGUoMTAwKSwNCisgICAgICBtX2lWZXJ0aWNhbFNjYWxlKDEwMCksDQorICAgICAgbV9pTGluZVJvdGF0aW9uKDApLA0KKyAgICAgIG1faUNoYXJSb3RhdGlvbigwKSwNCisgICAgICBtX2lSb3RhdGlvbigwKSwNCisgICAgICBtX2lDaGFyU3BhY2UoMCksDQorICAgICAgbV9iV29yZFNwYWNlKEZBTFNFKSwNCisgICAgICBtX2lXb3JkU3BhY2UoMCksDQorICAgICAgbV9iUlRMKEZBTFNFKSwNCisgICAgICBtX2lBbGlnbm1lbnQoRlhfUlRGTElORUFMSUdOTUVOVF9MZWZ0KSwNCisgICAgICBtX3BVc2VyRGF0YShOVUxMKSwNCisgICAgICBtX2R3Q2hhclR5cGUoMCksDQorICAgICAgbV9kd0lkZW50aXR5KDApLA0KKyAgICAgIG1fUlRGTGluZTEoKSwNCisgICAgICBtX1JURkxpbmUyKCksDQorICAgICAgbV9wQ3VyTGluZShOVUxMKSwNCisgICAgICBtX2lSZWFkeSgwKSwNCisgICAgICBtX2lUb2xlcmFuY2UoMCkgew0KKyAgbV9wQXJhYmljQ2hhciA9IElGWF9BcmFiaWNDaGFyOjpDcmVhdGUoKTsNCisgIG1fcEN1ckxpbmUgPSAmbV9SVEZMaW5lMTsNCit9DQorQ0ZYX1JURkJyZWFrOjp+Q0ZYX1JURkJyZWFrKCkgew0KKyAgUmVzZXQoKTsNCisgIG1fUG9zaXRpb25lZFRhYnMuUmVtb3ZlQWxsKCk7DQorICBtX3BBcmFiaWNDaGFyLT5SZWxlYXNlKCk7DQorICBpZiAobV9wVXNlckRhdGEgIT0gTlVMTCkgew0KKyAgICBtX3BVc2VyRGF0YS0+UmVsZWFzZSgpOw0KKyAgfQ0KK30NCit2b2lkIENGWF9SVEZCcmVhazo6U2V0TGluZUJvdW5kYXJ5KEZYX0ZMT0FUIGZMaW5lU3RhcnQsIEZYX0ZMT0FUIGZMaW5lRW5kKSB7DQorICBpZiAoZkxpbmVTdGFydCA+IGZMaW5lRW5kKQ0KKyAgICByZXR1cm47DQorICBtX2lCb3VuZGFyeVN0YXJ0ID0gRlhTWVNfcm91bmQoZkxpbmVTdGFydCAqIDIwMDAwLjBmKTsNCisgIG1faUJvdW5kYXJ5RW5kID0gRlhTWVNfcm91bmQoZkxpbmVFbmQgKiAyMDAwMC4wZik7DQorICBtX3BDdXJMaW5lLT5tX2lTdGFydCA9IHN0ZDo6bWluKG1fcEN1ckxpbmUtPm1faVN0YXJ0LCBtX2lCb3VuZGFyeUVuZCk7DQorICBtX3BDdXJMaW5lLT5tX2lTdGFydCA9IHN0ZDo6bWF4KG1fcEN1ckxpbmUtPm1faVN0YXJ0LCBtX2lCb3VuZGFyeVN0YXJ0KTsNCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OlNldExpbmVTdGFydFBvcyhGWF9GTE9BVCBmTGluZVBvcykgew0KKyAgaW50MzJfdCBpTGluZVBvcyA9IEZYU1lTX3JvdW5kKGZMaW5lUG9zICogMjAwMDAuMGYpOw0KKyAgaUxpbmVQb3MgPSBzdGQ6Om1pbihpTGluZVBvcywgbV9pQm91bmRhcnlFbmQpOw0KKyAgaUxpbmVQb3MgPSBzdGQ6Om1heChpTGluZVBvcywgbV9pQm91bmRhcnlTdGFydCk7DQorICBtX3BDdXJMaW5lLT5tX2lTdGFydCA9IGlMaW5lUG9zOw0KK30NCit2b2lkIENGWF9SVEZCcmVhazo6U2V0TGF5b3V0U3R5bGVzKEZYX0RXT1JEIGR3TGF5b3V0U3R5bGVzKSB7DQorICBpZiAobV9kd0xheW91dFN0eWxlcyA9PSBkd0xheW91dFN0eWxlcykgew0KKyAgICByZXR1cm47DQorICB9DQorICBTZXRCcmVha1N0YXR1cygpOw0KKyAgbV9kd0xheW91dFN0eWxlcyA9IGR3TGF5b3V0U3R5bGVzOw0KKyAgbV9iUGFnaW5hdGlvbiA9IChtX2R3TGF5b3V0U3R5bGVzICYgRlhfUlRGTEFZT1VUU1RZTEVfUGFnaW5hdGlvbikgIT0gMDsNCisgIG1fYlZlcnRpY2FsID0gKG1fZHdMYXlvdXRTdHlsZXMgJiBGWF9SVEZMQVlPVVRTVFlMRV9WZXJ0aWNhbENoYXJzKSAhPSAwOw0KKyAgbV9iU2luZ2xlTGluZSA9IChtX2R3TGF5b3V0U3R5bGVzICYgRlhfUlRGTEFZT1VUU1RZTEVfU2luZ2xlTGluZSkgIT0gMDsNCisgIG1fYkNoYXJDb2RlID0gKG1fZHdMYXlvdXRTdHlsZXMgJiBGWF9SVEZMQVlPVVRTVFlMRV9NQkNTQ29kZSkgIT0gMDsNCisgIG1faUxpbmVSb3RhdGlvbiA9IEdldExpbmVSb3RhdGlvbihtX2R3TGF5b3V0U3R5bGVzKTsNCisgIG1faVJvdGF0aW9uID0gbV9pTGluZVJvdGF0aW9uICsgbV9pQ2hhclJvdGF0aW9uOw0KKyAgbV9pUm90YXRpb24gJT0gNDsNCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OlNldEZvbnQoSUZYX0ZvbnQqIHBGb250KSB7DQorICBpZiAocEZvbnQgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAobV9wRm9udCA9PSBwRm9udCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBTZXRCcmVha1N0YXR1cygpOw0KKyAgbV9wRm9udCA9IHBGb250Ow0KKyAgbV9pRGVmQ2hhciA9IDA7DQorICBpZiAobV9wRm9udCAhPSBOVUxMKSB7DQorICAgIG1faUZvbnRIZWlnaHQgPSBtX2lGb250U2l6ZTsNCisgICAgaWYgKG1fd0RlZkNoYXIgIT0gMHhGRUZGKSB7DQorICAgICAgbV9wRm9udC0+R2V0Q2hhcldpZHRoKG1fd0RlZkNoYXIsIG1faURlZkNoYXIsIEZBTFNFKTsNCisgICAgICBtX2lEZWZDaGFyICo9IG1faUZvbnRTaXplOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpIHsNCisgIGludDMyX3QgaUZvbnRTaXplID0gRlhTWVNfcm91bmQoZkZvbnRTaXplICogMjAuMGYpOw0KKyAgaWYgKG1faUZvbnRTaXplID09IGlGb250U2l6ZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBTZXRCcmVha1N0YXR1cygpOw0KKyAgbV9pRm9udFNpemUgPSBpRm9udFNpemU7DQorICBtX2lEZWZDaGFyID0gMDsNCisgIGlmIChtX3BGb250ICE9IE5VTEwpIHsNCisgICAgbV9pRm9udEhlaWdodCA9IG1faUZvbnRTaXplOw0KKyAgICBpZiAobV93RGVmQ2hhciAhPSAweEZFRkYpIHsNCisgICAgICBtX3BGb250LT5HZXRDaGFyV2lkdGgobV93RGVmQ2hhciwgbV9pRGVmQ2hhciwgRkFMU0UpOw0KKyAgICAgIG1faURlZkNoYXIgKj0gbV9pRm9udFNpemU7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OlNldFRhYldpZHRoKEZYX0ZMT0FUIGZUYWJXaWR0aCkgew0KKyAgbV9pVGFiV2lkdGggPSBGWFNZU19yb3VuZChmVGFiV2lkdGggKiAyMDAwMC4wZik7DQorfQ0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpBZGRQb3NpdGlvbmVkVGFiKEZYX0ZMT0FUIGZUYWJQb3MpIHsNCisgIGludDMyX3QgaUxpbmVFbmQgPSBtX2lCb3VuZGFyeUVuZDsNCisgIGludDMyX3QgaVRhYlBvcyA9IEZYU1lTX3JvdW5kKGZUYWJQb3MgKiAyMDAwMC4wZikgKyBtX2lCb3VuZGFyeVN0YXJ0Ow0KKyAgaWYgKGlUYWJQb3MgPiBpTGluZUVuZCkgew0KKyAgICBpVGFiUG9zID0gaUxpbmVFbmQ7DQorICB9DQorICBpZiAobV9Qb3NpdGlvbmVkVGFicy5GaW5kKGlUYWJQb3MsIDApID4gLTEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpQ291bnQgPSBtX1Bvc2l0aW9uZWRUYWJzLkdldFNpemUoKTsNCisgIGludDMyX3QgaUZpbmQgPSAwOw0KKyAgZm9yICg7IGlGaW5kIDwgaUNvdW50OyBpRmluZCsrKSB7DQorICAgIGlmIChtX1Bvc2l0aW9uZWRUYWJzW2lGaW5kXSA+IGlUYWJQb3MpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgbV9Qb3NpdGlvbmVkVGFicy5JbnNlcnRBdChpRmluZCwgaVRhYlBvcyk7DQorICBpZiAobV9kd1BvbGljaWVzICYgRlhfUlRGQlJFQUtQT0xJQ1lfT3JwaGFuUG9zaXRpb25lZFRhYikgew0KKyAgICBtX2JPcnBoYW5MaW5lID0gR2V0TGFzdFBvc2l0aW9uZWRUYWIoKSA+PSBpTGluZUVuZDsNCisgIH0gZWxzZSB7DQorICAgIG1fYk9ycGhhbkxpbmUgPSBGQUxTRTsNCisgIH0NCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OlNldFBvc2l0aW9uZWRUYWJzKGNvbnN0IENGWF9GbG9hdEFycmF5JiB0YWJzKSB7DQorICBtX1Bvc2l0aW9uZWRUYWJzLlJlbW92ZUFsbCgpOw0KKyAgaW50MzJfdCBpQ291bnQgPSB0YWJzLkdldFNpemUoKTsNCisgIG1fUG9zaXRpb25lZFRhYnMuU2V0U2l6ZShpQ291bnQpOw0KKyAgaW50MzJfdCBpTGluZUVuZCA9IG1faUJvdW5kYXJ5RW5kOw0KKyAgaW50MzJfdCBpVGFiUG9zOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgaVRhYlBvcyA9IEZYU1lTX3JvdW5kKHRhYnNbaV0gKiAyMDAwMC4wZikgKyBtX2lCb3VuZGFyeVN0YXJ0Ow0KKyAgICBpZiAoaVRhYlBvcyA+IGlMaW5lRW5kKSB7DQorICAgICAgaVRhYlBvcyA9IGlMaW5lRW5kOw0KKyAgICB9DQorICAgIG1fUG9zaXRpb25lZFRhYnNbaV0gPSBpVGFiUG9zOw0KKyAgfQ0KKyAgaWYgKG1fZHdQb2xpY2llcyAmIEZYX1JURkJSRUFLUE9MSUNZX09ycGhhblBvc2l0aW9uZWRUYWIpIHsNCisgICAgbV9iT3JwaGFuTGluZSA9IEdldExhc3RQb3NpdGlvbmVkVGFiKCkgPj0gaUxpbmVFbmQ7DQorICB9IGVsc2Ugew0KKyAgICBtX2JPcnBoYW5MaW5lID0gRkFMU0U7DQorICB9DQorfQ0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpDbGVhclBvc2l0aW9uZWRUYWJzKCkgew0KKyAgbV9Qb3NpdGlvbmVkVGFicy5SZW1vdmVBbGwoKTsNCisgIG1fYk9ycGhhbkxpbmUgPSBGQUxTRTsNCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OlNldERlZmF1bHRDaGFyKEZYX1dDSEFSIHdjaCkgew0KKyAgbV93RGVmQ2hhciA9IHdjaDsNCisgIG1faURlZkNoYXIgPSAwOw0KKyAgaWYgKG1fd0RlZkNoYXIgIT0gMHhGRUZGICYmIG1fcEZvbnQgIT0gTlVMTCkgew0KKyAgICBtX3BGb250LT5HZXRDaGFyV2lkdGgobV93RGVmQ2hhciwgbV9pRGVmQ2hhciwgRkFMU0UpOw0KKyAgICBpZiAobV9pRGVmQ2hhciA8IDApIHsNCisgICAgICBtX2lEZWZDaGFyID0gMDsNCisgICAgfSBlbHNlIHsNCisgICAgICBtX2lEZWZDaGFyICo9IG1faUZvbnRTaXplOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpTZXRMaW5lQnJlYWtDaGFyKEZYX1dDSEFSIHdjaCkgew0KKyAgaWYgKHdjaCAhPSBMJ1xyJyAmJiB3Y2ggIT0gTCdcbicpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV93TGluZUJyZWFrQ2hhciA9IHdjaDsNCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OlNldExpbmVCcmVha1RvbGVyYW5jZShGWF9GTE9BVCBmVG9sZXJhbmNlKSB7DQorICBtX2lUb2xlcmFuY2UgPSBGWFNZU19yb3VuZChmVG9sZXJhbmNlICogMjAwMDAuMGYpOw0KK30NCit2b2lkIENGWF9SVEZCcmVhazo6U2V0SG9yaXpvbnRhbFNjYWxlKGludDMyX3QgaVNjYWxlKSB7DQorICBpZiAoaVNjYWxlIDwgMCkgew0KKyAgICBpU2NhbGUgPSAwOw0KKyAgfQ0KKyAgaWYgKG1faUhvcml6b250YWxTY2FsZSA9PSBpU2NhbGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgU2V0QnJlYWtTdGF0dXMoKTsNCisgIG1faUhvcml6b250YWxTY2FsZSA9IGlTY2FsZTsNCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OlNldFZlcnRpY2FsU2NhbGUoaW50MzJfdCBpU2NhbGUpIHsNCisgIGlmIChpU2NhbGUgPCAwKSB7DQorICAgIGlTY2FsZSA9IDA7DQorICB9DQorICBpZiAobV9pVmVydGljYWxTY2FsZSA9PSBpU2NhbGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgU2V0QnJlYWtTdGF0dXMoKTsNCisgIG1faVZlcnRpY2FsU2NhbGUgPSBpU2NhbGU7DQorfQ0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpTZXRDaGFyUm90YXRpb24oaW50MzJfdCBpQ2hhclJvdGF0aW9uKSB7DQorICBpZiAoaUNoYXJSb3RhdGlvbiA8IDApIHsNCisgICAgaUNoYXJSb3RhdGlvbiArPSAoLWlDaGFyUm90YXRpb24gLyA0ICsgMSkgKiA0Ow0KKyAgfSBlbHNlIGlmIChpQ2hhclJvdGF0aW9uID4gMykgew0KKyAgICBpQ2hhclJvdGF0aW9uIC09IChpQ2hhclJvdGF0aW9uIC8gNCkgKiA0Ow0KKyAgfQ0KKyAgaWYgKG1faUNoYXJSb3RhdGlvbiA9PSBpQ2hhclJvdGF0aW9uKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIFNldEJyZWFrU3RhdHVzKCk7DQorICBtX2lDaGFyUm90YXRpb24gPSBpQ2hhclJvdGF0aW9uOw0KKyAgbV9pUm90YXRpb24gPSBtX2lMaW5lUm90YXRpb24gKyBtX2lDaGFyUm90YXRpb247DQorICBtX2lSb3RhdGlvbiAlPSA0Ow0KK30NCit2b2lkIENGWF9SVEZCcmVhazo6U2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpIHsNCisgIG1faUNoYXJTcGFjZSA9IEZYU1lTX3JvdW5kKGZDaGFyU3BhY2UgKiAyMDAwMC4wZik7DQorfQ0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpTZXRXb3JkU3BhY2UoRlhfQk9PTCBiRGVmYXVsdCwgRlhfRkxPQVQgZldvcmRTcGFjZSkgew0KKyAgbV9iV29yZFNwYWNlID0gIWJEZWZhdWx0Ow0KKyAgbV9pV29yZFNwYWNlID0gRlhTWVNfcm91bmQoZldvcmRTcGFjZSAqIDIwMDAwLjBmKTsNCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OlNldFJlYWRpbmdPcmRlcihGWF9CT09MIGJSVEwpIHsNCisgIG1fYlJUTCA9IGJSVEw7DQorfQ0KK3ZvaWQgQ0ZYX1JURkJyZWFrOjpTZXRBbGlnbm1lbnQoaW50MzJfdCBpQWxpZ25tZW50KSB7DQorICBGWFNZU19hc3NlcnQoaUFsaWdubWVudCA+PSBGWF9SVEZMSU5FQUxJR05NRU5UX0xlZnQgJiYNCisgICAgICAgICAgICAgICBpQWxpZ25tZW50IDw9IEZYX1JURkxJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWQpOw0KKyAgbV9pQWxpZ25tZW50ID0gaUFsaWdubWVudDsNCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OlNldFVzZXJEYXRhKElGWF9Vbmtub3duKiBwVXNlckRhdGEpIHsNCisgIGlmIChtX3BVc2VyRGF0YSA9PSBwVXNlckRhdGEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgU2V0QnJlYWtTdGF0dXMoKTsNCisgIGlmIChtX3BVc2VyRGF0YSAhPSBOVUxMKSB7DQorICAgIG1fcFVzZXJEYXRhLT5SZWxlYXNlKCk7DQorICB9DQorICBtX3BVc2VyRGF0YSA9IHBVc2VyRGF0YTsNCisgIGlmIChtX3BVc2VyRGF0YSAhPSBOVUxMKSB7DQorICAgIG1fcFVzZXJEYXRhLT5BZGRSZWYoKTsNCisgIH0NCit9DQorc3RhdGljIGNvbnN0IGludDMyX3QgZ3NfRlhfUlRGTGluZVJvdGF0aW9uc1s4XSA9IHswLCAzLCAxLCAwLCAyLCAxLCAzLCAyfTsNCitpbnQzMl90IENGWF9SVEZCcmVhazo6R2V0TGluZVJvdGF0aW9uKEZYX0RXT1JEIGR3U3R5bGVzKSBjb25zdCB7DQorICByZXR1cm4gZ3NfRlhfUlRGTGluZVJvdGF0aW9uc1soZHdTdHlsZXMgJiAweDBFKSA+PiAxXTsNCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OlNldEJyZWFrU3RhdHVzKCkgew0KKyAgbV9kd0lkZW50aXR5Kys7DQorICBpbnQzMl90IGlDb3VudCA9IG1fcEN1ckxpbmUtPkNvdW50Q2hhcnMoKTsNCisgIGlmIChpQ291bnQgPCAxKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9SVEZDaGFyJiB0YyA9IG1fcEN1ckxpbmUtPkdldENoYXIoaUNvdW50IC0gMSk7DQorICBpZiAodGMubV9kd1N0YXR1cyA9PSAwKSB7DQorICAgIHRjLm1fZHdTdGF0dXMgPSBGWF9SVEZCUkVBS19QaWVjZUJyZWFrOw0KKyAgfQ0KK30NCitDRlhfUlRGQ2hhciogQ0ZYX1JURkJyZWFrOjpHZXRMYXN0Q2hhcihpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICBDRlhfUlRGQ2hhckFycmF5JiB0Y2EgPSBtX3BDdXJMaW5lLT5tX0xpbmVDaGFyczsNCisgIGludDMyX3QgaUNvdW50ID0gdGNhLkdldFNpemUoKTsNCisgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gaUNvdW50KSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0ZYX1JURkNoYXIqIHBUQzsNCisgIGludDMyX3QgaVN0YXJ0ID0gaUNvdW50IC0gMTsNCisgIHdoaWxlIChpU3RhcnQgPiAtMSkgew0KKyAgICBwVEMgPSB0Y2EuR2V0RGF0YVB0cihpU3RhcnQtLSk7DQorICAgIGlmIChwVEMtPm1faUNoYXJXaWR0aCA+PSAwIHx8DQorICAgICAgICBwVEMtPkdldENoYXJUeXBlKCkgIT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pIHsNCisgICAgICBpZiAoLS1pbmRleCA8IDApIHsNCisgICAgICAgIHJldHVybiBwVEM7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorQ0ZYX1JURkxpbmUqIENGWF9SVEZCcmVhazo6R2V0UlRGTGluZShGWF9CT09MIGJSZWFkeSkgY29uc3Qgew0KKyAgaWYgKGJSZWFkeSkgew0KKyAgICBpZiAobV9pUmVhZHkgPT0gMSkgew0KKyAgICAgIHJldHVybiAoQ0ZYX1JURkxpbmUqKSZtX1JURkxpbmUxOw0KKyAgICB9IGVsc2UgaWYgKG1faVJlYWR5ID09IDIpIHsNCisgICAgICByZXR1cm4gKENGWF9SVEZMaW5lKikmbV9SVEZMaW5lMjsNCisgICAgfSBlbHNlIHsNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgfQ0KKyAgRlhTWVNfYXNzZXJ0KG1fcEN1ckxpbmUgIT0gTlVMTCk7DQorICByZXR1cm4gbV9wQ3VyTGluZTsNCit9DQorQ0ZYX1JURlBpZWNlQXJyYXkqIENGWF9SVEZCcmVhazo6R2V0UlRGUGllY2VzKEZYX0JPT0wgYlJlYWR5KSBjb25zdCB7DQorICBDRlhfUlRGTGluZSogcFJURkxpbmUgPSBHZXRSVEZMaW5lKGJSZWFkeSk7DQorICBpZiAocFJURkxpbmUgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiAmcFJURkxpbmUtPm1fTGluZVBpZWNlczsNCit9DQoraW5saW5lIEZYX0RXT1JEIENGWF9SVEZCcmVhazo6R2V0VW5pZmllZENoYXJUeXBlKEZYX0RXT1JEIGR3VHlwZSkgY29uc3Qgew0KKyAgcmV0dXJuIGR3VHlwZSA+PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmID8gRlhfQ0hBUlRZUEVfQXJhYmljIDogZHdUeXBlOw0KK30NCitpbnQzMl90IENGWF9SVEZCcmVhazo6R2V0TGFzdFBvc2l0aW9uZWRUYWIoKSBjb25zdCB7DQorICBpbnQzMl90IGlDb3VudCA9IG1fUG9zaXRpb25lZFRhYnMuR2V0U2l6ZSgpOw0KKyAgaWYgKGlDb3VudCA8IDEpIHsNCisgICAgcmV0dXJuIG1faUJvdW5kYXJ5U3RhcnQ7DQorICB9DQorICByZXR1cm4gbV9Qb3NpdGlvbmVkVGFic1tpQ291bnQgLSAxXTsNCit9DQorRlhfQk9PTCBDRlhfUlRGQnJlYWs6OkdldFBvc2l0aW9uZWRUYWIoaW50MzJfdCYgaVRhYlBvcykgY29uc3Qgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX1Bvc2l0aW9uZWRUYWJzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIGlmIChtX1Bvc2l0aW9uZWRUYWJzW2ldID4gaVRhYlBvcykgew0KKyAgICAgIGlUYWJQb3MgPSBtX1Bvc2l0aW9uZWRUYWJzW2ldOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK3R5cGVkZWYgRlhfRFdPUkQgKENGWF9SVEZCcmVhazo6KkZYX1JURkJyZWFrX0xQRkFwcGVuZENoYXIpKA0KKyAgICBDRlhfUlRGQ2hhciogcEN1ckNoYXIsDQorICAgIGludDMyX3QgaVJvdGF0aW9uKTsNCitzdGF0aWMgY29uc3QgRlhfUlRGQnJlYWtfTFBGQXBwZW5kQ2hhciBnX0ZYX1JURkJyZWFrX2xwZkFwcGVuZENoYXJbMTZdID0gew0KKyAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX090aGVycywgICAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX1RhYiwNCisgICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsICAgICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9Db250cm9sLA0KKyAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX0NvbWJpbmF0aW9uLCAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX090aGVycywNCisgICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsICAgICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMsDQorICAgICZDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfQXJhYmljLCAgICAgICZDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfQXJhYmljLA0KKyAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYywgICAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYywNCisgICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMsICAgICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsDQorICAgICZDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfT3RoZXJzLCAgICAgICZDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfT3RoZXJzLA0KK307DQorRlhfRFdPUkQgQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcEZvbnQgIT0gTlVMTCAmJiBtX3BDdXJMaW5lICE9IE5VTEwgJiYgbV9wQXJhYmljQ2hhciAhPSBOVUxMKTsNCisgIGlmIChtX2JDaGFyQ29kZSkgew0KKyAgICByZXR1cm4gQXBwZW5kQ2hhcl9DaGFyQ29kZSh3Y2gpOw0KKyAgfQ0KKyAgRlhfRFdPUkQgZHdQcm9wcyA9IGtUZXh0TGF5b3V0Q29kZVByb3BlcnRpZXNbKEZYX1dPUkQpd2NoXTsNCisgIEZYX0RXT1JEIGR3VHlwZSA9IChkd1Byb3BzICYgRlhfQ0hBUlRZUEVCSVRTTUFTSyk7DQorICBDRlhfUlRGQ2hhckFycmF5JiB0Y2EgPSBtX3BDdXJMaW5lLT5tX0xpbmVDaGFyczsNCisgIENGWF9SVEZDaGFyKiBwQ3VyQ2hhciA9IHRjYS5BZGRTcGFjZSgpOw0KKyAgcEN1ckNoYXItPm1fZHdTdGF0dXMgPSAwOw0KKyAgcEN1ckNoYXItPm1fd0NoYXJDb2RlID0gd2NoOw0KKyAgcEN1ckNoYXItPm1fZHdDaGFyUHJvcHMgPSBkd1Byb3BzOw0KKyAgcEN1ckNoYXItPm1fZHdDaGFyU3R5bGVzID0gMDsNCisgIHBDdXJDaGFyLT5tX2R3TGF5b3V0U3R5bGVzID0gMDsNCisgIHBDdXJDaGFyLT5tX2lGb250U2l6ZSA9IG1faUZvbnRTaXplOw0KKyAgcEN1ckNoYXItPm1faUZvbnRIZWlnaHQgPSBtX2lGb250SGVpZ2h0Ow0KKyAgcEN1ckNoYXItPm1faUhvcml6b250YWxTY2FsZSA9IG1faUhvcml6b250YWxTY2FsZTsNCisgIHBDdXJDaGFyLT5tX2lWZXJ0aWFsU2NhbGUgPSBtX2lWZXJ0aWNhbFNjYWxlOw0KKyAgcEN1ckNoYXItPm1fblJvdGF0aW9uID0gbV9pQ2hhclJvdGF0aW9uOw0KKyAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IDA7DQorICBwQ3VyQ2hhci0+bV9kd0lkZW50aXR5ID0gbV9kd0lkZW50aXR5Ow0KKyAgaWYgKG1fcFVzZXJEYXRhICE9IE5VTEwpIHsNCisgICAgbV9wVXNlckRhdGEtPkFkZFJlZigpOw0KKyAgfQ0KKyAgcEN1ckNoYXItPm1fcFVzZXJEYXRhID0gbV9wVXNlckRhdGE7DQorICBGWF9EV09SRCBkd1JldDEgPSBGWF9SVEZCUkVBS19Ob25lOw0KKyAgaWYgKGR3VHlwZSAhPSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbiAmJg0KKyAgICAgIEdldFVuaWZpZWRDaGFyVHlwZShtX2R3Q2hhclR5cGUpICE9IEdldFVuaWZpZWRDaGFyVHlwZShkd1R5cGUpKSB7DQorICAgIGlmICghbV9iU2luZ2xlTGluZSAmJiAhbV9iT3JwaGFuTGluZSAmJiBtX2R3Q2hhclR5cGUgPiAwICYmDQorICAgICAgICBtX3BDdXJMaW5lLT5HZXRMaW5lRW5kKCkgPiBtX2lCb3VuZGFyeUVuZCArIG1faVRvbGVyYW5jZSkgew0KKyAgICAgIGlmIChtX2R3Q2hhclR5cGUgIT0gRlhfQ0hBUlRZUEVfU3BhY2UgfHwgZHdUeXBlICE9IEZYX0NIQVJUWVBFX0NvbnRyb2wpIHsNCisgICAgICAgIGR3UmV0MSA9IEVuZEJyZWFrKEZYX1JURkJSRUFLX0xpbmVCcmVhayk7DQorICAgICAgICBpbnQzMl90IGlDb3VudCA9IG1fcEN1ckxpbmUtPkNvdW50Q2hhcnMoKTsNCisgICAgICAgIGlmIChpQ291bnQgPiAwKSB7DQorICAgICAgICAgIHBDdXJDaGFyID0gbV9wQ3VyTGluZS0+bV9MaW5lQ2hhcnMuR2V0RGF0YVB0cihpQ291bnQgLSAxKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGludDMyX3QgaVJvdGF0aW9uID0gbV9pUm90YXRpb247DQorICBpZiAobV9iVmVydGljYWwgJiYgKGR3UHJvcHMgJiAweDgwMDApICE9IDApIHsNCisgICAgaVJvdGF0aW9uID0gKGlSb3RhdGlvbiArIDEpICUgNDsNCisgIH0NCisgIEZYX0RXT1JEIGR3UmV0MiA9DQorICAgICAgKHRoaXMtPipnX0ZYX1JURkJyZWFrX2xwZkFwcGVuZENoYXJbZHdUeXBlID4+IEZYX0NIQVJUWVBFQklUU10pKA0KKyAgICAgICAgICBwQ3VyQ2hhciwgaVJvdGF0aW9uKTsNCisgIG1fZHdDaGFyVHlwZSA9IGR3VHlwZTsNCisgIHJldHVybiBzdGQ6Om1heChkd1JldDEsIGR3UmV0Mik7DQorfQ0KK0ZYX0RXT1JEIENGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9DaGFyQ29kZShGWF9XQ0hBUiB3Y2gpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BGb250ICE9IE5VTEwgJiYgbV9wQ3VyTGluZSAhPSBOVUxMKTsNCisgIEZYU1lTX2Fzc2VydChtX2JDaGFyQ29kZSk7DQorICBtX3BDdXJMaW5lLT5tX2lNQkNTQ2hhcnMrKzsNCisgIENGWF9SVEZDaGFyQXJyYXkmIHRjYSA9IG1fcEN1ckxpbmUtPm1fTGluZUNoYXJzOw0KKyAgQ0ZYX1JURkNoYXIqIHBDdXJDaGFyID0gdGNhLkFkZFNwYWNlKCk7DQorICBwQ3VyQ2hhci0+bV9kd1N0YXR1cyA9IDA7DQorICBwQ3VyQ2hhci0+bV93Q2hhckNvZGUgPSB3Y2g7DQorICBwQ3VyQ2hhci0+bV9kd0NoYXJQcm9wcyA9IDA7DQorICBwQ3VyQ2hhci0+bV9kd0NoYXJTdHlsZXMgPSAwOw0KKyAgcEN1ckNoYXItPm1fZHdMYXlvdXRTdHlsZXMgPSBtX2R3TGF5b3V0U3R5bGVzOw0KKyAgcEN1ckNoYXItPm1faUZvbnRTaXplID0gbV9pRm9udFNpemU7DQorICBwQ3VyQ2hhci0+bV9pRm9udEhlaWdodCA9IG1faUZvbnRIZWlnaHQ7DQorICBwQ3VyQ2hhci0+bV9pSG9yaXpvbnRhbFNjYWxlID0gbV9pSG9yaXpvbnRhbFNjYWxlOw0KKyAgcEN1ckNoYXItPm1faVZlcnRpYWxTY2FsZSA9IG1faVZlcnRpY2FsU2NhbGU7DQorICBwQ3VyQ2hhci0+bV9uUm90YXRpb24gPSBtX2lDaGFyUm90YXRpb247DQorICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gMDsNCisgIHBDdXJDaGFyLT5tX2R3SWRlbnRpdHkgPSBtX2R3SWRlbnRpdHk7DQorICBpZiAobV9wVXNlckRhdGEgIT0gTlVMTCkgew0KKyAgICBtX3BVc2VyRGF0YS0+QWRkUmVmKCk7DQorICB9DQorICBwQ3VyQ2hhci0+bV9wVXNlckRhdGEgPSBtX3BVc2VyRGF0YTsNCisgIGludDMyX3QgaUNoYXJXaWR0aCA9IDA7DQorICBpZiAobV9iVmVydGljYWwgIT0gRlhfSXNPZGQobV9pUm90YXRpb24pKSB7DQorICAgIGlDaGFyV2lkdGggPSAxMDAwOw0KKyAgfSBlbHNlIHsNCisgICAgaWYgKCFtX3BGb250LT5HZXRDaGFyV2lkdGgod2NoLCBpQ2hhcldpZHRoLCBUUlVFKSkgew0KKyAgICAgIGlDaGFyV2lkdGggPSBtX2lEZWZDaGFyOw0KKyAgICB9DQorICB9DQorICBpQ2hhcldpZHRoICo9IG1faUZvbnRTaXplOw0KKyAgaUNoYXJXaWR0aCA9IGlDaGFyV2lkdGggKiBtX2lIb3Jpem9udGFsU2NhbGUgLyAxMDA7DQorICBpQ2hhcldpZHRoICs9IG1faUNoYXJTcGFjZTsNCisgIHBDdXJDaGFyLT5tX2lDaGFyV2lkdGggPSBpQ2hhcldpZHRoOw0KKyAgbV9wQ3VyTGluZS0+bV9pV2lkdGggKz0gaUNoYXJXaWR0aDsNCisgIG1fZHdDaGFyVHlwZSA9IDA7DQorICBpZiAoIW1fYlNpbmdsZUxpbmUgJiYNCisgICAgICBtX3BDdXJMaW5lLT5HZXRMaW5lRW5kKCkgPiBtX2lCb3VuZGFyeUVuZCArIG1faVRvbGVyYW5jZSkgew0KKyAgICByZXR1cm4gRW5kQnJlYWsoRlhfUlRGQlJFQUtfTGluZUJyZWFrKTsNCisgIH0NCisgIHJldHVybiBGWF9SVEZCUkVBS19Ob25lOw0KK30NCitGWF9EV09SRCBDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfQ29tYmluYXRpb24oQ0ZYX1JURkNoYXIqIHBDdXJDaGFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSb3RhdGlvbikgew0KKyAgaW50MzJfdCBpQ2hhcldpZHRoID0gMDsNCisgIGlmIChtX2JWZXJ0aWNhbCAhPSBGWF9Jc09kZChpUm90YXRpb24pKSB7DQorICAgIGlDaGFyV2lkdGggPSAxMDAwOw0KKyAgfSBlbHNlIHsNCisgICAgaWYgKCFtX3BGb250LT5HZXRDaGFyV2lkdGgocEN1ckNoYXItPm1fd0NoYXJDb2RlLCBpQ2hhcldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JDaGFyQ29kZSkpIHsNCisgICAgICBpQ2hhcldpZHRoID0gMDsNCisgICAgfQ0KKyAgfQ0KKyAgaUNoYXJXaWR0aCAqPSBtX2lGb250U2l6ZTsNCisgIGlDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogbV9pSG9yaXpvbnRhbFNjYWxlIC8gMTAwOw0KKyAgQ0ZYX1JURkNoYXIqIHBMYXN0Q2hhciA9IEdldExhc3RDaGFyKDApOw0KKyAgaWYgKHBMYXN0Q2hhciAhPSBOVUxMICYmIHBMYXN0Q2hhci0+R2V0Q2hhclR5cGUoKSA+IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uKSB7DQorICAgIGlDaGFyV2lkdGggPSAtaUNoYXJXaWR0aDsNCisgIH0gZWxzZSB7DQorICAgIG1fZHdDaGFyVHlwZSA9IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uOw0KKyAgfQ0KKyAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IGlDaGFyV2lkdGg7DQorICBpZiAoaUNoYXJXaWR0aCA+IDApIHsNCisgICAgbV9wQ3VyTGluZS0+bV9pV2lkdGggKz0gaUNoYXJXaWR0aDsNCisgIH0NCisgIHJldHVybiBGWF9SVEZCUkVBS19Ob25lOw0KK30NCitGWF9EV09SRCBDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfVGFiKENGWF9SVEZDaGFyKiBwQ3VyQ2hhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0aW9uKSB7DQorICBpZiAobV9kd0xheW91dFN0eWxlcyAmIEZYX1JURkxBWU9VVFNUWUxFX0V4cGFuZFRhYikgew0KKyAgICBGWF9CT09MIGJCcmVhayA9IEZBTFNFOw0KKyAgICBpZiAoKG1fZHdQb2xpY2llcyAmIEZYX1JURkJSRUFLUE9MSUNZX1RhYkJyZWFrKSAhPSAwKSB7DQorICAgICAgYkJyZWFrID0gKG1fcEN1ckxpbmUtPkdldExpbmVFbmQoKSA+IG1faUJvdW5kYXJ5RW5kICsgbV9pVG9sZXJhbmNlKTsNCisgICAgfQ0KKyAgICBpbnQzMl90JiBpTGluZVdpZHRoID0gbV9wQ3VyTGluZS0+bV9pV2lkdGg7DQorICAgIGludDMyX3QgaUNoYXJXaWR0aCA9IGlMaW5lV2lkdGg7DQorICAgIGlmIChHZXRQb3NpdGlvbmVkVGFiKGlDaGFyV2lkdGgpKSB7DQorICAgICAgaUNoYXJXaWR0aCAtPSBpTGluZVdpZHRoOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlDaGFyV2lkdGggPSBtX2lUYWJXaWR0aCAqIChpTGluZVdpZHRoIC8gbV9pVGFiV2lkdGggKyAxKSAtIGlMaW5lV2lkdGg7DQorICAgIH0NCisgICAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IGlDaGFyV2lkdGg7DQorICAgIGlMaW5lV2lkdGggKz0gaUNoYXJXaWR0aDsNCisgICAgaWYgKCFtX2JTaW5nbGVMaW5lICYmICFtX2JPcnBoYW5MaW5lICYmIGJCcmVhaykgew0KKyAgICAgIHJldHVybiBFbmRCcmVhayhGWF9SVEZCUkVBS19MaW5lQnJlYWspOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRlhfUlRGQlJFQUtfTm9uZTsNCit9DQorRlhfRFdPUkQgQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX0NvbnRyb2woQ0ZYX1JURkNoYXIqIHBDdXJDaGFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0aW9uKSB7DQorICBGWF9EV09SRCBkd1JldDIgPSBGWF9SVEZCUkVBS19Ob25lOw0KKyAgaWYgKCFtX2JTaW5nbGVMaW5lKSB7DQorICAgIHN3aXRjaCAocEN1ckNoYXItPm1fd0NoYXJDb2RlKSB7DQorICAgICAgY2FzZSBMJ1x2JzoNCisgICAgICBjYXNlIDB4MjAyODoNCisgICAgICAgIGR3UmV0MiA9IEZYX1JURkJSRUFLX0xpbmVCcmVhazsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgTCdcZic6DQorICAgICAgICBkd1JldDIgPSBGWF9SVEZCUkVBS19QYWdlQnJlYWs7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIDB4MjAyOToNCisgICAgICAgIGR3UmV0MiA9IEZYX1JURkJSRUFLX1BhcmFncmFwaEJyZWFrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGlmIChwQ3VyQ2hhci0+bV93Q2hhckNvZGUgPT0gbV93TGluZUJyZWFrQ2hhcikgew0KKyAgICAgICAgICBkd1JldDIgPSBGWF9SVEZCUkVBS19QYXJhZ3JhcGhCcmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChkd1JldDIgIT0gRlhfUlRGQlJFQUtfTm9uZSkgew0KKyAgICAgIGR3UmV0MiA9IEVuZEJyZWFrKGR3UmV0Mik7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBkd1JldDI7DQorfQ0KK0ZYX0RXT1JEIENGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMoQ0ZYX1JURkNoYXIqIHBDdXJDaGFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRpb24pIHsNCisgIENGWF9SVEZDaGFyKiBwTGFzdENoYXIgPSBOVUxMOw0KKyAgaW50MzJfdCYgaUxpbmVXaWR0aCA9IG1fcEN1ckxpbmUtPm1faVdpZHRoOw0KKyAgaW50MzJfdCBpQ2hhcldpZHRoID0gMDsNCisgIEZYX1dDSEFSIHdGb3JtOw0KKyAgRlhfQk9PTCBiQWxlZiA9IEZBTFNFOw0KKyAgaWYgKG1fZHdDaGFyVHlwZSA+PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmICYmDQorICAgICAgbV9kd0NoYXJUeXBlIDw9IEZYX0NIQVJUWVBFX0FyYWJpY0Rpc3RvcnRpb24pIHsNCisgICAgcExhc3RDaGFyID0gR2V0TGFzdENoYXIoMSk7DQorICAgIGlmIChwTGFzdENoYXIgIT0gTlVMTCkgew0KKyAgICAgIGlMaW5lV2lkdGggLT0gcExhc3RDaGFyLT5tX2lDaGFyV2lkdGg7DQorICAgICAgQ0ZYX1JURkNoYXIqIHBQcmV2Q2hhciA9IEdldExhc3RDaGFyKDIpOw0KKyAgICAgIHdGb3JtID0gbV9wQXJhYmljQ2hhci0+R2V0Rm9ybUNoYXIocExhc3RDaGFyLCBwUHJldkNoYXIsIHBDdXJDaGFyKTsNCisgICAgICBiQWxlZiA9ICh3Rm9ybSA9PSAweEZFRkYgJiYNCisgICAgICAgICAgICAgICBwTGFzdENoYXItPkdldENoYXJUeXBlKCkgPT0gRlhfQ0hBUlRZUEVfQXJhYmljQWxlZik7DQorICAgICAgaW50MzJfdCBpTGFzdFJvdGF0aW9uID0gcExhc3RDaGFyLT5tX25Sb3RhdGlvbiArIG1faUxpbmVSb3RhdGlvbjsNCisgICAgICBpZiAobV9iVmVydGljYWwgJiYgKHBMYXN0Q2hhci0+bV9kd0NoYXJQcm9wcyAmIDB4ODAwMCkgIT0gMCkgew0KKyAgICAgICAgaUxhc3RSb3RhdGlvbisrOw0KKyAgICAgIH0NCisgICAgICBpZiAobV9iVmVydGljYWwgIT0gRlhfSXNPZGQoaUxhc3RSb3RhdGlvbikpIHsNCisgICAgICAgIGlDaGFyV2lkdGggPSAxMDAwOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAoIW1fcEZvbnQtPkdldENoYXJXaWR0aCh3Rm9ybSwgaUNoYXJXaWR0aCwgbV9iQ2hhckNvZGUpKQ0KKyAgICAgICAgICBpZiAoIW1fcEZvbnQtPkdldENoYXJXaWR0aChwTGFzdENoYXItPm1fd0NoYXJDb2RlLCBpQ2hhcldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JDaGFyQ29kZSkpIHsNCisgICAgICAgICAgICBpQ2hhcldpZHRoID0gbV9pRGVmQ2hhcjsNCisgICAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpQ2hhcldpZHRoICo9IG1faUZvbnRTaXplOw0KKyAgICAgIGlDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogbV9pSG9yaXpvbnRhbFNjYWxlIC8gMTAwOw0KKyAgICAgIHBMYXN0Q2hhci0+bV9pQ2hhcldpZHRoID0gaUNoYXJXaWR0aDsNCisgICAgICBpTGluZVdpZHRoICs9IGlDaGFyV2lkdGg7DQorICAgICAgaUNoYXJXaWR0aCA9IDA7DQorICAgIH0NCisgIH0NCisgIHdGb3JtID0NCisgICAgICBtX3BBcmFiaWNDaGFyLT5HZXRGb3JtQ2hhcihwQ3VyQ2hhciwgKGJBbGVmID8gTlVMTCA6IHBMYXN0Q2hhciksIE5VTEwpOw0KKyAgaWYgKG1fYlZlcnRpY2FsICE9IEZYX0lzT2RkKGlSb3RhdGlvbikpIHsNCisgICAgaUNoYXJXaWR0aCA9IDEwMDA7DQorICB9IGVsc2Ugew0KKyAgICBpZiAoIW1fcEZvbnQtPkdldENoYXJXaWR0aCh3Rm9ybSwgaUNoYXJXaWR0aCwgbV9iQ2hhckNvZGUpKQ0KKyAgICAgIGlmICghbV9wRm9udC0+R2V0Q2hhcldpZHRoKHBDdXJDaGFyLT5tX3dDaGFyQ29kZSwgaUNoYXJXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JDaGFyQ29kZSkpIHsNCisgICAgICAgIGlDaGFyV2lkdGggPSBtX2lEZWZDaGFyOw0KKyAgICAgIH0NCisgIH0NCisgIGlDaGFyV2lkdGggKj0gbV9pRm9udFNpemU7DQorICBpQ2hhcldpZHRoID0gaUNoYXJXaWR0aCAqIG1faUhvcml6b250YWxTY2FsZSAvIDEwMDsNCisgIHBDdXJDaGFyLT5tX2lDaGFyV2lkdGggPSBpQ2hhcldpZHRoOw0KKyAgaUxpbmVXaWR0aCArPSBpQ2hhcldpZHRoOw0KKyAgbV9wQ3VyTGluZS0+bV9pQXJhYmljQ2hhcnMrKzsNCisgIGlmICghbV9iU2luZ2xlTGluZSAmJiAhbV9iT3JwaGFuTGluZSAmJg0KKyAgICAgIG1fcEN1ckxpbmUtPkdldExpbmVFbmQoKSA+IG1faUJvdW5kYXJ5RW5kICsgbV9pVG9sZXJhbmNlKSB7DQorICAgIHJldHVybiBFbmRCcmVhayhGWF9SVEZCUkVBS19MaW5lQnJlYWspOw0KKyAgfQ0KKyAgcmV0dXJuIEZYX1JURkJSRUFLX05vbmU7DQorfQ0KK0ZYX0RXT1JEIENGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMoQ0ZYX1JURkNoYXIqIHBDdXJDaGFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRpb24pIHsNCisgIEZYX0RXT1JEIGR3VHlwZSA9IChwQ3VyQ2hhci0+bV9kd0NoYXJQcm9wcyAmIEZYX0NIQVJUWVBFQklUU01BU0spOw0KKyAgRlhfV0NIQVIgd0Zvcm07DQorICBpZiAoZHdUeXBlID09IEZYX0NIQVJUWVBFX051bWVyaWMpIHsNCisgICAgaWYgKG1fZHdMYXlvdXRTdHlsZXMgJiBGWF9SVEZMQVlPVVRTVFlMRV9BcmFiaWNOdW1iZXIpIHsNCisgICAgICB3Rm9ybSA9IHBDdXJDaGFyLT5tX3dDaGFyQ29kZSArIDB4MDYzMDsNCisgICAgfSBlbHNlIHsNCisgICAgICB3Rm9ybSA9IHBDdXJDaGFyLT5tX3dDaGFyQ29kZTsNCisgICAgfQ0KKyAgfSBlbHNlIGlmIChtX2JSVEwgfHwgbV9iVmVydGljYWwpIHsNCisgICAgd0Zvcm0gPSBGWF9HZXRNaXJyb3JDaGFyKHBDdXJDaGFyLT5tX3dDaGFyQ29kZSwgcEN1ckNoYXItPm1fZHdDaGFyUHJvcHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JSVEwsIG1fYlZlcnRpY2FsKTsNCisgIH0gZWxzZSB7DQorICAgIHdGb3JtID0gcEN1ckNoYXItPm1fd0NoYXJDb2RlOw0KKyAgfQ0KKyAgaW50MzJfdCBpQ2hhcldpZHRoID0gMDsNCisgIGlmIChtX2JWZXJ0aWNhbCAhPSBGWF9Jc09kZChpUm90YXRpb24pKSB7DQorICAgIGlDaGFyV2lkdGggPSAxMDAwOw0KKyAgfSBlbHNlIHsNCisgICAgaWYgKCFtX3BGb250LT5HZXRDaGFyV2lkdGgod0Zvcm0sIGlDaGFyV2lkdGgsIG1fYkNoYXJDb2RlKSkgew0KKyAgICAgIGlDaGFyV2lkdGggPSBtX2lEZWZDaGFyOw0KKyAgICB9DQorICB9DQorICBpQ2hhcldpZHRoICo9IG1faUZvbnRTaXplOw0KKyAgaUNoYXJXaWR0aCA9IGlDaGFyV2lkdGggKiBtX2lIb3Jpem9udGFsU2NhbGUgLyAxMDA7DQorICBpQ2hhcldpZHRoICs9IG1faUNoYXJTcGFjZTsNCisgIGlmIChkd1R5cGUgPT0gRlhfQ0hBUlRZUEVfU3BhY2UgJiYgbV9iV29yZFNwYWNlKSB7DQorICAgIGlDaGFyV2lkdGggKz0gbV9pV29yZFNwYWNlOw0KKyAgfQ0KKyAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IGlDaGFyV2lkdGg7DQorICBtX3BDdXJMaW5lLT5tX2lXaWR0aCArPSBpQ2hhcldpZHRoOw0KKyAgRlhfQk9PTCBiQnJlYWsgPSAoZHdUeXBlICE9IEZYX0NIQVJUWVBFX1NwYWNlIHx8DQorICAgICAgICAgICAgICAgICAgICAobV9kd1BvbGljaWVzICYgRlhfUlRGQlJFQUtQT0xJQ1lfU3BhY2VCcmVhaykgIT0gMCk7DQorICBpZiAoIW1fYlNpbmdsZUxpbmUgJiYgIW1fYk9ycGhhbkxpbmUgJiYgYkJyZWFrICYmDQorICAgICAgbV9wQ3VyTGluZS0+R2V0TGluZUVuZCgpID4gbV9pQm91bmRhcnlFbmQgKyBtX2lUb2xlcmFuY2UpIHsNCisgICAgcmV0dXJuIEVuZEJyZWFrKEZYX1JURkJSRUFLX0xpbmVCcmVhayk7DQorICB9DQorICByZXR1cm4gRlhfUlRGQlJFQUtfTm9uZTsNCit9DQorRlhfRFdPUkQgQ0ZYX1JURkJyZWFrOjpFbmRCcmVhayhGWF9EV09SRCBkd1N0YXR1cykgew0KKyAgRlhTWVNfYXNzZXJ0KGR3U3RhdHVzID49IEZYX1JURkJSRUFLX1BpZWNlQnJlYWsgJiYNCisgICAgICAgICAgICAgICBkd1N0YXR1cyA8PSBGWF9SVEZCUkVBS19QYWdlQnJlYWspOw0KKyAgbV9kd0lkZW50aXR5Kys7DQorICBDRlhfUlRGUGllY2VBcnJheSogcEN1clBpZWNlcyA9ICZtX3BDdXJMaW5lLT5tX0xpbmVQaWVjZXM7DQorICBpbnQzMl90IGlDb3VudCA9IHBDdXJQaWVjZXMtPkdldFNpemUoKTsNCisgIGlmIChpQ291bnQgPiAwKSB7DQorICAgIENGWF9SVEZQaWVjZSogcExhc3RQaWVjZSA9IHBDdXJQaWVjZXMtPkdldFB0ckF0KC0taUNvdW50KTsNCisgICAgaWYgKGR3U3RhdHVzID4gRlhfUlRGQlJFQUtfUGllY2VCcmVhaykgew0KKyAgICAgIHBMYXN0UGllY2UtPm1fZHdTdGF0dXMgPSBkd1N0YXR1czsNCisgICAgfSBlbHNlIHsNCisgICAgICBkd1N0YXR1cyA9IHBMYXN0UGllY2UtPm1fZHdTdGF0dXM7DQorICAgIH0NCisgICAgcmV0dXJuIGR3U3RhdHVzOw0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX1JURkxpbmUqIHBMYXN0TGluZSA9IEdldFJURkxpbmUoVFJVRSk7DQorICAgIGlmIChwTGFzdExpbmUgIT0gTlVMTCkgew0KKyAgICAgIHBDdXJQaWVjZXMgPSAmcExhc3RMaW5lLT5tX0xpbmVQaWVjZXM7DQorICAgICAgaUNvdW50ID0gcEN1clBpZWNlcy0+R2V0U2l6ZSgpOw0KKyAgICAgIGlmIChpQ291bnQtLSA+IDApIHsNCisgICAgICAgIENGWF9SVEZQaWVjZSogcExhc3RQaWVjZSA9IHBDdXJQaWVjZXMtPkdldFB0ckF0KGlDb3VudCk7DQorICAgICAgICBpZiAoZHdTdGF0dXMgPiBGWF9SVEZCUkVBS19QaWVjZUJyZWFrKSB7DQorICAgICAgICAgIHBMYXN0UGllY2UtPm1fZHdTdGF0dXMgPSBkd1N0YXR1czsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGR3U3RhdHVzID0gcExhc3RQaWVjZS0+bV9kd1N0YXR1czsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBkd1N0YXR1czsNCisgICAgICB9DQorICAgICAgcmV0dXJuIEZYX1JURkJSRUFLX05vbmU7DQorICAgIH0NCisgICAgaUNvdW50ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpOw0KKyAgICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICAgIHJldHVybiBGWF9SVEZCUkVBS19Ob25lOw0KKyAgICB9DQorICAgIENGWF9SVEZDaGFyJiB0YyA9IG1fcEN1ckxpbmUtPkdldENoYXIoaUNvdW50IC0gMSk7DQorICAgIHRjLm1fZHdTdGF0dXMgPSBkd1N0YXR1czsNCisgICAgaWYgKGR3U3RhdHVzIDw9IEZYX1JURkJSRUFLX1BpZWNlQnJlYWspIHsNCisgICAgICByZXR1cm4gZHdTdGF0dXM7DQorICAgIH0NCisgIH0NCisgIG1faVJlYWR5ID0gKG1fcEN1ckxpbmUgPT0gJm1fUlRGTGluZTEpID8gMSA6IDI7DQorICBDRlhfUlRGTGluZSogcE5leHRMaW5lID0NCisgICAgICAobV9wQ3VyTGluZSA9PSAmbV9SVEZMaW5lMSkgPyAmbV9SVEZMaW5lMiA6ICZtX1JURkxpbmUxOw0KKyAgRlhfQk9PTCBiQWxsQ2hhcnMgPSAobV9pQWxpZ25tZW50ID4gRlhfUlRGTElORUFMSUdOTUVOVF9SaWdodCk7DQorICBDRlhfVFBPQXJyYXkgdHBvczsNCisgIGlmIChFbmRCcmVha19TcGxpdExpbmUocE5leHRMaW5lLCBiQWxsQ2hhcnMsIGR3U3RhdHVzKSkgew0KKyAgICBnb3RvIEVuZEJyZWFrX1JldDsNCisgIH0NCisgIGlmICghbV9iQ2hhckNvZGUpIHsNCisgICAgRW5kQnJlYWtfQmlkaUxpbmUodHBvcywgZHdTdGF0dXMpOw0KKyAgfQ0KKyAgaWYgKCFtX2JQYWdpbmF0aW9uICYmIG1faUFsaWdubWVudCA+IEZYX1JURkxJTkVBTElHTk1FTlRfTGVmdCkgew0KKyAgICBFbmRCcmVha19BbGlnbm1lbnQodHBvcywgYkFsbENoYXJzLCBkd1N0YXR1cyk7DQorICB9DQorRW5kQnJlYWtfUmV0Og0KKyAgbV9wQ3VyTGluZSA9IHBOZXh0TGluZTsNCisgIG1fcEN1ckxpbmUtPm1faVN0YXJ0ID0gbV9pQm91bmRhcnlTdGFydDsNCisgIENGWF9SVEZDaGFyKiBwVEMgPSBHZXRMYXN0Q2hhcigwKTsNCisgIG1fZHdDaGFyVHlwZSA9IHBUQyA9PSBOVUxMID8gMCA6IHBUQy0+R2V0Q2hhclR5cGUoKTsNCisgIHJldHVybiBkd1N0YXR1czsNCit9DQorRlhfQk9PTCBDRlhfUlRGQnJlYWs6OkVuZEJyZWFrX1NwbGl0TGluZShDRlhfUlRGTGluZSogcE5leHRMaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWxsQ2hhcnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXR1cykgew0KKyAgRlhfQk9PTCBiRG9uZSA9IEZBTFNFOw0KKyAgaWYgKCFtX2JTaW5nbGVMaW5lICYmICFtX2JPcnBoYW5MaW5lICYmDQorICAgICAgbV9wQ3VyTGluZS0+R2V0TGluZUVuZCgpID4gbV9pQm91bmRhcnlFbmQgKyBtX2lUb2xlcmFuY2UpIHsNCisgICAgQ0ZYX1JURkNoYXImIHRjID0gbV9wQ3VyTGluZS0+R2V0Q2hhcihtX3BDdXJMaW5lLT5Db3VudENoYXJzKCkgLSAxKTsNCisgICAgc3dpdGNoICh0Yy5HZXRDaGFyVHlwZSgpKSB7DQorICAgICAgY2FzZSBGWF9DSEFSVFlQRV9UYWI6DQorICAgICAgICBpZiAoKG1fZHdQb2xpY2llcyAmIEZYX1JURkJSRUFLUE9MSUNZX1RhYkJyZWFrKSAhPSAwKSB7DQorICAgICAgICAgIFNwbGl0VGV4dExpbmUobV9wQ3VyTGluZSwgcE5leHRMaW5lLCAhbV9iUGFnaW5hdGlvbiAmJiBiQWxsQ2hhcnMpOw0KKyAgICAgICAgICBiRG9uZSA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZYX0NIQVJUWVBFX0NvbnRyb2w6DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZYX0NIQVJUWVBFX1NwYWNlOg0KKyAgICAgICAgaWYgKChtX2R3UG9saWNpZXMgJiBGWF9SVEZCUkVBS1BPTElDWV9TcGFjZUJyZWFrKSAhPSAwKSB7DQorICAgICAgICAgIFNwbGl0VGV4dExpbmUobV9wQ3VyTGluZSwgcE5leHRMaW5lLCAhbV9iUGFnaW5hdGlvbiAmJiBiQWxsQ2hhcnMpOw0KKyAgICAgICAgICBiRG9uZSA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgU3BsaXRUZXh0TGluZShtX3BDdXJMaW5lLCBwTmV4dExpbmUsICFtX2JQYWdpbmF0aW9uICYmIGJBbGxDaGFycyk7DQorICAgICAgICBiRG9uZSA9IFRSVUU7DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKG1fYlBhZ2luYXRpb24gfHwgbV9wQ3VyTGluZS0+bV9pTUJDU0NoYXJzID4gMCkgew0KKyAgICBjb25zdCBDRlhfUlRGQ2hhciogcEN1ckNoYXJzID0gbV9wQ3VyTGluZS0+bV9MaW5lQ2hhcnMuR2V0RGF0YSgpOw0KKyAgICBjb25zdCBDRlhfUlRGQ2hhciogcFRDOw0KKyAgICBDRlhfUlRGUGllY2VBcnJheSogcEN1clBpZWNlcyA9ICZtX3BDdXJMaW5lLT5tX0xpbmVQaWVjZXM7DQorICAgIENGWF9SVEZQaWVjZSB0cDsNCisgICAgdHAubV9wQ2hhcnMgPSAmbV9wQ3VyTGluZS0+bV9MaW5lQ2hhcnM7DQorICAgIEZYX0JPT0wgYk5ldyA9IFRSVUU7DQorICAgIEZYX0RXT1JEIGR3SWRlbnRpdHkgPSAoRlhfRFdPUkQpLTE7DQorICAgIGludDMyX3QgaUxhc3QgPSBtX3BDdXJMaW5lLT5Db3VudENoYXJzKCkgLSAxLCBqID0gMDsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDw9IGlMYXN0Oykgew0KKyAgICAgIHBUQyA9IHBDdXJDaGFycyArIGk7DQorICAgICAgaWYgKGJOZXcpIHsNCisgICAgICAgIHRwLm1faVN0YXJ0Q2hhciA9IGk7DQorICAgICAgICB0cC5tX2lTdGFydFBvcyArPSB0cC5tX2lXaWR0aDsNCisgICAgICAgIHRwLm1faVdpZHRoID0gMDsNCisgICAgICAgIHRwLm1fZHdTdGF0dXMgPSBwVEMtPm1fZHdTdGF0dXM7DQorICAgICAgICB0cC5tX2lGb250U2l6ZSA9IHBUQy0+bV9pRm9udFNpemU7DQorICAgICAgICB0cC5tX2lGb250SGVpZ2h0ID0gcFRDLT5tX2lGb250SGVpZ2h0Ow0KKyAgICAgICAgdHAubV9pSG9yaXpvbnRhbFNjYWxlID0gcFRDLT5tX2lIb3Jpem9udGFsU2NhbGU7DQorICAgICAgICB0cC5tX2lWZXJ0aWNhbFNjYWxlID0gcFRDLT5tX2lWZXJ0aWFsU2NhbGU7DQorICAgICAgICB0cC5tX2R3TGF5b3V0U3R5bGVzID0gcFRDLT5tX2R3TGF5b3V0U3R5bGVzOw0KKyAgICAgICAgZHdJZGVudGl0eSA9IHBUQy0+bV9kd0lkZW50aXR5Ow0KKyAgICAgICAgdHAubV9kd0lkZW50aXR5ID0gZHdJZGVudGl0eTsNCisgICAgICAgIHRwLm1fcFVzZXJEYXRhID0gcFRDLT5tX3BVc2VyRGF0YTsNCisgICAgICAgIGogPSBpOw0KKyAgICAgICAgYk5ldyA9IEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBpZiAoaSA9PSBpTGFzdCB8fCBwVEMtPm1fZHdTdGF0dXMgIT0gRlhfUlRGQlJFQUtfTm9uZSB8fA0KKyAgICAgICAgICBwVEMtPm1fZHdJZGVudGl0eSAhPSBkd0lkZW50aXR5KSB7DQorICAgICAgICB0cC5tX2lDaGFycyA9IGkgLSBqOw0KKyAgICAgICAgaWYgKHBUQy0+bV9kd0lkZW50aXR5ID09IGR3SWRlbnRpdHkpIHsNCisgICAgICAgICAgdHAubV9kd1N0YXR1cyA9IHBUQy0+bV9kd1N0YXR1czsNCisgICAgICAgICAgdHAubV9pV2lkdGggKz0gcFRDLT5tX2lDaGFyV2lkdGg7DQorICAgICAgICAgIHRwLm1faUNoYXJzICs9IDE7DQorICAgICAgICAgIGkrKzsNCisgICAgICAgIH0NCisgICAgICAgIHBDdXJQaWVjZXMtPkFkZCh0cCk7DQorICAgICAgICBiTmV3ID0gVFJVRTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgdHAubV9pV2lkdGggKz0gcFRDLT5tX2lDaGFyV2lkdGg7DQorICAgICAgICBpKys7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaWYgKGJBbGxDaGFycyAmJiAhYkRvbmUpIHsNCisgICAgaW50MzJfdCBpRW5kUG9zID0gbV9wQ3VyTGluZS0+R2V0TGluZUVuZCgpOw0KKyAgICBHZXRCcmVha1BvcyhtX3BDdXJMaW5lLT5tX0xpbmVDaGFycywgaUVuZFBvcywgYkFsbENoYXJzLCBUUlVFKTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OkVuZEJyZWFrX0JpZGlMaW5lKENGWF9UUE9BcnJheSYgdHBvcywgRlhfRFdPUkQgZHdTdGF0dXMpIHsNCisgIEZYX1RQTyB0cG87DQorICBDRlhfUlRGUGllY2UgdHA7DQorICBDRlhfUlRGQ2hhciogcFRDOw0KKyAgaW50MzJfdCBpLCBqOw0KKyAgQ0ZYX1JURkNoYXJBcnJheSYgY2hhcnMgPSBtX3BDdXJMaW5lLT5tX0xpbmVDaGFyczsNCisgIGludDMyX3QgaUNvdW50ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpOw0KKyAgRlhfQk9PTCBiRG9uZSA9ICghbV9iUGFnaW5hdGlvbiAmJiAhbV9iQ2hhckNvZGUgJiYNCisgICAgICAgICAgICAgICAgICAgKG1fcEN1ckxpbmUtPm1faUFyYWJpY0NoYXJzID4gMCB8fCBtX2JSVEwpKTsNCisgIGlmIChiRG9uZSkgew0KKyAgICBpbnQzMl90IGlCaWRpTnVtID0gMDsNCisgICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cihpKTsNCisgICAgICBwVEMtPm1faUJpZGlQb3MgPSBpOw0KKyAgICAgIGlmIChwVEMtPkdldENoYXJUeXBlKCkgIT0gRlhfQ0hBUlRZUEVfQ29udHJvbCkgew0KKyAgICAgICAgaUJpZGlOdW0gPSBpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaSA9PSAwKSB7DQorICAgICAgICBwVEMtPm1faUJpZGlMZXZlbCA9IDE7DQorICAgICAgfQ0KKyAgICB9DQorICAgIEZYX0JpZGlMaW5lKGNoYXJzLCBpQmlkaU51bSArIDEsIG1fYlJUTCA/IDEgOiAwKTsNCisgIH0gZWxzZSB7DQorICAgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgIHBUQyA9IGNoYXJzLkdldERhdGFQdHIoaSk7DQorICAgICAgcFRDLT5tX2lCaWRpTGV2ZWwgPSAwOw0KKyAgICAgIHBUQy0+bV9pQmlkaVBvcyA9IDA7DQorICAgICAgcFRDLT5tX2lCaWRpT3JkZXIgPSAwOw0KKyAgICB9DQorICB9DQorICB0cC5tX2R3U3RhdHVzID0gRlhfUlRGQlJFQUtfUGllY2VCcmVhazsNCisgIHRwLm1faVN0YXJ0UG9zID0gbV9wQ3VyTGluZS0+bV9pU3RhcnQ7DQorICB0cC5tX3BDaGFycyA9ICZjaGFyczsNCisgIENGWF9SVEZQaWVjZUFycmF5KiBwQ3VyUGllY2VzID0gJm1fcEN1ckxpbmUtPm1fTGluZVBpZWNlczsNCisgIGludDMyX3QgaUJpZGlMZXZlbCA9IC0xLCBpQ2hhcldpZHRoOw0KKyAgRlhfRFdPUkQgZHdJZGVudGl0eSA9IChGWF9EV09SRCktMTsNCisgIGkgPSBqID0gMDsNCisgIHdoaWxlIChpIDwgaUNvdW50KSB7DQorICAgIHBUQyA9IGNoYXJzLkdldERhdGFQdHIoaSk7DQorICAgIGlmIChpQmlkaUxldmVsIDwgMCkgew0KKyAgICAgIGlCaWRpTGV2ZWwgPSBwVEMtPm1faUJpZGlMZXZlbDsNCisgICAgICBpQ2hhcldpZHRoID0gcFRDLT5tX2lDaGFyV2lkdGg7DQorICAgICAgaWYgKGlDaGFyV2lkdGggPCAxKSB7DQorICAgICAgICB0cC5tX2lXaWR0aCA9IDA7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHRwLm1faVdpZHRoID0gaUNoYXJXaWR0aDsNCisgICAgICB9DQorICAgICAgdHAubV9pQmlkaUxldmVsID0gaUJpZGlMZXZlbDsNCisgICAgICB0cC5tX2lCaWRpUG9zID0gcFRDLT5tX2lCaWRpT3JkZXI7DQorICAgICAgdHAubV9pRm9udFNpemUgPSBwVEMtPm1faUZvbnRTaXplOw0KKyAgICAgIHRwLm1faUZvbnRIZWlnaHQgPSBwVEMtPm1faUZvbnRIZWlnaHQ7DQorICAgICAgdHAubV9pSG9yaXpvbnRhbFNjYWxlID0gcFRDLT5tX2lIb3Jpem9udGFsU2NhbGU7DQorICAgICAgdHAubV9pVmVydGljYWxTY2FsZSA9IHBUQy0+bV9pVmVydGlhbFNjYWxlOw0KKyAgICAgIGR3SWRlbnRpdHkgPSBwVEMtPm1fZHdJZGVudGl0eTsNCisgICAgICB0cC5tX2R3SWRlbnRpdHkgPSBkd0lkZW50aXR5Ow0KKyAgICAgIHRwLm1fcFVzZXJEYXRhID0gcFRDLT5tX3BVc2VyRGF0YTsNCisgICAgICB0cC5tX2R3U3RhdHVzID0gRlhfUlRGQlJFQUtfUGllY2VCcmVhazsNCisgICAgICBpKys7DQorICAgIH0gZWxzZSBpZiAoaUJpZGlMZXZlbCAhPSBwVEMtPm1faUJpZGlMZXZlbCB8fA0KKyAgICAgICAgICAgICAgIHBUQy0+bV9kd0lkZW50aXR5ICE9IGR3SWRlbnRpdHkpIHsNCisgICAgICB0cC5tX2lDaGFycyA9IGkgLSB0cC5tX2lTdGFydENoYXI7DQorICAgICAgcEN1clBpZWNlcy0+QWRkKHRwKTsNCisgICAgICB0cC5tX2lTdGFydFBvcyArPSB0cC5tX2lXaWR0aDsNCisgICAgICB0cC5tX2lTdGFydENoYXIgPSBpOw0KKyAgICAgIHRwby5pbmRleCA9IGorKzsNCisgICAgICB0cG8ucG9zID0gdHAubV9pQmlkaVBvczsNCisgICAgICB0cG9zLkFkZCh0cG8pOw0KKyAgICAgIGlCaWRpTGV2ZWwgPSAtMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpQ2hhcldpZHRoID0gcFRDLT5tX2lDaGFyV2lkdGg7DQorICAgICAgaWYgKGlDaGFyV2lkdGggPiAwKSB7DQorICAgICAgICB0cC5tX2lXaWR0aCArPSBpQ2hhcldpZHRoOw0KKyAgICAgIH0NCisgICAgICBpKys7DQorICAgIH0NCisgIH0NCisgIGlmIChpID4gdHAubV9pU3RhcnRDaGFyKSB7DQorICAgIHRwLm1fZHdTdGF0dXMgPSBkd1N0YXR1czsNCisgICAgdHAubV9pQ2hhcnMgPSBpIC0gdHAubV9pU3RhcnRDaGFyOw0KKyAgICBwQ3VyUGllY2VzLT5BZGQodHApOw0KKyAgICB0cG8uaW5kZXggPSBqOw0KKyAgICB0cG8ucG9zID0gdHAubV9pQmlkaVBvczsNCisgICAgdHBvcy5BZGQodHBvKTsNCisgIH0NCisgIGlmICghbV9iQ2hhckNvZGUpIHsNCisgICAgaiA9IHRwb3MuR2V0U2l6ZSgpIC0gMTsNCisgICAgRlhfVEVYVExBWU9VVF9QaWVjZVNvcnQodHBvcywgMCwgaik7DQorICAgIGludDMyX3QgaVN0YXJ0UG9zID0gbV9wQ3VyTGluZS0+bV9pU3RhcnQ7DQorICAgIGZvciAoaSA9IDA7IGkgPD0gajsgaSsrKSB7DQorICAgICAgdHBvID0gdHBvcy5HZXRBdChpKTsNCisgICAgICBDRlhfUlRGUGllY2UmIHR0cCA9IHBDdXJQaWVjZXMtPkdldEF0KHRwby5pbmRleCk7DQorICAgICAgdHRwLm1faVN0YXJ0UG9zID0gaVN0YXJ0UG9zOw0KKyAgICAgIGlTdGFydFBvcyArPSB0dHAubV9pV2lkdGg7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OkVuZEJyZWFrX0FsaWdubWVudChDRlhfVFBPQXJyYXkmIHRwb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBbGxDaGFycywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzKSB7DQorICBDRlhfUlRGUGllY2VBcnJheSogcEN1clBpZWNlcyA9ICZtX3BDdXJMaW5lLT5tX0xpbmVQaWVjZXM7DQorICBpbnQzMl90IGlOZXRXaWR0aCA9IG1fcEN1ckxpbmUtPm1faVdpZHRoLCBpR2FwQ2hhcnMgPSAwLCBpQ2hhcldpZHRoOw0KKyAgaW50MzJfdCBpQ291bnQgPSBwQ3VyUGllY2VzLT5HZXRTaXplKCk7DQorICBGWF9CT09MIGJGaW5kID0gRkFMU0U7DQorICBGWF9EV09SRCBkd0NoYXJUeXBlOw0KKyAgaW50MzJfdCBpLCBqOw0KKyAgRlhfVFBPIHRwbzsNCisgIGZvciAoaSA9IGlDb3VudCAtIDE7IGkgPiAtMTsgaS0tKSB7DQorICAgIHRwbyA9IHRwb3MuR2V0QXQoaSk7DQorICAgIENGWF9SVEZQaWVjZSYgdHRwID0gcEN1clBpZWNlcy0+R2V0QXQodHBvLmluZGV4KTsNCisgICAgaWYgKCFiRmluZCkgew0KKyAgICAgIGlOZXRXaWR0aCA9IHR0cC5HZXRFbmRQb3MoKTsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJBcmFiaWMgPSBGWF9Jc09kZCh0dHAubV9pQmlkaUxldmVsKTsNCisgICAgaiA9IGJBcmFiaWMgPyAwIDogdHRwLm1faUNoYXJzIC0gMTsNCisgICAgd2hpbGUgKGogPiAtMSAmJiBqIDwgdHRwLm1faUNoYXJzKSB7DQorICAgICAgY29uc3QgQ0ZYX1JURkNoYXImIHRjID0gdHRwLkdldENoYXIoaik7DQorICAgICAgaWYgKHRjLm1fbkJyZWFrVHlwZSA9PSBGWF9MQlRfRElSRUNUX0JSSykgew0KKyAgICAgICAgaUdhcENoYXJzKys7DQorICAgICAgfQ0KKyAgICAgIGlmICghYkZpbmQgfHwgIWJBbGxDaGFycykgew0KKyAgICAgICAgZHdDaGFyVHlwZSA9IHRjLkdldENoYXJUeXBlKCk7DQorICAgICAgICBpZiAoZHdDaGFyVHlwZSA9PSBGWF9DSEFSVFlQRV9TcGFjZSB8fA0KKyAgICAgICAgICAgIGR3Q2hhclR5cGUgPT0gRlhfQ0hBUlRZUEVfQ29udHJvbCkgew0KKyAgICAgICAgICBpZiAoIWJGaW5kKSB7DQorICAgICAgICAgICAgaUNoYXJXaWR0aCA9IHRjLm1faUNoYXJXaWR0aDsNCisgICAgICAgICAgICBpZiAoYkFsbENoYXJzICYmIGlDaGFyV2lkdGggPiAwKSB7DQorICAgICAgICAgICAgICBpTmV0V2lkdGggLT0gaUNoYXJXaWR0aDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJGaW5kID0gVFJVRTsNCisgICAgICAgICAgaWYgKCFiQWxsQ2hhcnMpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBqICs9IGJBcmFiaWMgPyAxIDogLTE7DQorICAgIH0NCisgICAgaWYgKCFiQWxsQ2hhcnMgJiYgYkZpbmQpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBpT2Zmc2V0ID0gbV9pQm91bmRhcnlFbmQgLSBpTmV0V2lkdGg7DQorICBpbnQzMl90IGlMb3dlckFsaWdubWVudCA9IChtX2lBbGlnbm1lbnQgJiBGWF9SVEZMSU5FQUxJR05NRU5UX0xvd2VyTWFzayk7DQorICBpbnQzMl90IGlIaWdoZXJBbGlnbm1lbnQgPSAobV9pQWxpZ25tZW50ICYgRlhfUlRGTElORUFMSUdOTUVOVF9IaWdoZXJNYXNrKTsNCisgIGlmIChpR2FwQ2hhcnMgPiAwICYmIChpSGlnaGVyQWxpZ25tZW50ID09IEZYX1JURkxJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWQgfHwNCisgICAgICAgICAgICAgICAgICAgICAgICAoaUhpZ2hlckFsaWdubWVudCA9PSBGWF9SVEZMSU5FQUxJR05NRU5UX0p1c3RpZmllZCAmJg0KKyAgICAgICAgICAgICAgICAgICAgICAgICBkd1N0YXR1cyAhPSBGWF9SVEZCUkVBS19QYXJhZ3JhcGhCcmVhaykpKSB7DQorICAgIGludDMyX3QgaVN0YXJ0ID0gLTE7DQorICAgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgIHRwbyA9IHRwb3MuR2V0QXQoaSk7DQorICAgICAgQ0ZYX1JURlBpZWNlJiB0dHAgPSBwQ3VyUGllY2VzLT5HZXRBdCh0cG8uaW5kZXgpOw0KKyAgICAgIGlmIChpU3RhcnQgPCAwKSB7DQorICAgICAgICBpU3RhcnQgPSB0dHAubV9pU3RhcnRQb3M7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHR0cC5tX2lTdGFydFBvcyA9IGlTdGFydDsNCisgICAgICB9DQorICAgICAgaW50MzJfdCBrOw0KKyAgICAgIGZvciAoaiA9IDA7IGogPCB0dHAubV9pQ2hhcnM7IGorKykgew0KKyAgICAgICAgQ0ZYX1JURkNoYXImIHRjID0gdHRwLkdldENoYXIoaik7DQorICAgICAgICBpZiAodGMubV9uQnJlYWtUeXBlICE9IEZYX0xCVF9ESVJFQ1RfQlJLIHx8IHRjLm1faUNoYXJXaWR0aCA8IDApIHsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBrID0gaU9mZnNldCAvIGlHYXBDaGFyczsNCisgICAgICAgIHRjLm1faUNoYXJXaWR0aCArPSBrOw0KKyAgICAgICAgdHRwLm1faVdpZHRoICs9IGs7DQorICAgICAgICBpT2Zmc2V0IC09IGs7DQorICAgICAgICBpR2FwQ2hhcnMtLTsNCisgICAgICAgIGlmIChpR2FwQ2hhcnMgPCAxKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpU3RhcnQgKz0gdHRwLm1faVdpZHRoOw0KKyAgICB9DQorICB9IGVsc2UgaWYgKGlMb3dlckFsaWdubWVudCA+IEZYX1JURkxJTkVBTElHTk1FTlRfTGVmdCkgew0KKyAgICBpZiAoaUxvd2VyQWxpZ25tZW50ID09IEZYX1JURkxJTkVBTElHTk1FTlRfQ2VudGVyKSB7DQorICAgICAgaU9mZnNldCAvPSAyOw0KKyAgICB9DQorICAgIGlmIChpT2Zmc2V0ID4gMCkgew0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgICAgQ0ZYX1JURlBpZWNlJiB0dHAgPSBwQ3VyUGllY2VzLT5HZXRBdChpKTsNCisgICAgICAgIHR0cC5tX2lTdGFydFBvcyArPSBpT2Zmc2V0Ow0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KK30NCitpbnQzMl90IENGWF9SVEZCcmVhazo6R2V0QnJlYWtQb3MoQ0ZYX1JURkNoYXJBcnJheSYgdGNhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpRW5kUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBbGxDaGFycywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiT25seUJyaykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gdGNhLkdldFNpemUoKSAtIDE7DQorICBpZiAoaUxlbmd0aCA8IDEpIHsNCisgICAgcmV0dXJuIGlMZW5ndGg7DQorICB9DQorICBpbnQzMl90IGlCcmVhayA9IC0xLCBpQnJlYWtQb3MgPSAtMSwgaUluZGlyZWN0ID0gLTEsIGlJbmRpcmVjdFBvcyA9IC0xLA0KKyAgICAgICAgICBpTGFzdCA9IC0xLCBpTGFzdFBvcyA9IC0xOw0KKyAgaWYgKG1fYlNpbmdsZUxpbmUgfHwgbV9iT3JwaGFuTGluZSB8fCBpRW5kUG9zIDw9IG1faUJvdW5kYXJ5RW5kKSB7DQorICAgIGlmICghYkFsbENoYXJzIHx8IG1fYkNoYXJDb2RlKSB7DQorICAgICAgcmV0dXJuIGlMZW5ndGg7DQorICAgIH0NCisgICAgaUJyZWFrID0gaUxlbmd0aDsNCisgICAgaUJyZWFrUG9zID0gaUVuZFBvczsNCisgIH0NCisgIENGWF9SVEZDaGFyKiBwQ2hhckFycmF5ID0gdGNhLkdldERhdGEoKTsNCisgIGlmIChtX2JDaGFyQ29kZSkgew0KKyAgICBjb25zdCBDRlhfUlRGQ2hhciogcENoYXI7DQorICAgIGludDMyX3QgaUNoYXJXaWR0aDsNCisgICAgd2hpbGUgKGlMZW5ndGggPiAwKSB7DQorICAgICAgaWYgKGlFbmRQb3MgPD0gbV9pQm91bmRhcnlFbmQpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBwQ2hhciA9IHBDaGFyQXJyYXkgKyBpTGVuZ3RoLS07DQorICAgICAgaUNoYXJXaWR0aCA9IHBDaGFyLT5tX2lDaGFyV2lkdGg7DQorICAgICAgaWYgKGlDaGFyV2lkdGggPiAwKSB7DQorICAgICAgICBpRW5kUG9zIC09IGlDaGFyV2lkdGg7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBpTGVuZ3RoOw0KKyAgfQ0KKyAgRlhfQk9PTCBiU3BhY2VCcmVhayA9IChtX2R3UG9saWNpZXMgJiBGWF9SVEZCUkVBS1BPTElDWV9TcGFjZUJyZWFrKSAhPSAwOw0KKyAgRlhfQk9PTCBiVGFiQnJlYWsgPSAobV9kd1BvbGljaWVzICYgRlhfUlRGQlJFQUtQT0xJQ1lfVGFiQnJlYWspICE9IDA7DQorICBGWF9CT09MIGJOdW1iZXJCcmVhayA9IChtX2R3UG9saWNpZXMgJiBGWF9SVEZCUkVBS1BPTElDWV9OdW1iZXJCcmVhaykgIT0gMDsNCisgIEZYX0JPT0wgYkluZml4QnJlYWsgPSAobV9kd1BvbGljaWVzICYgRlhfUlRGQlJFQUtQT0xJQ1lfSW5maXhCcmVhaykgIT0gMDsNCisgIEZYX0xJTkVCUkVBS1RZUEUgZVR5cGU7DQorICBGWF9EV09SRCBuQ29kZVByb3AsIG5DdXIsIG5OZXh0Ow0KKyAgQ0ZYX1JURkNoYXIqIHBDdXIgPSBwQ2hhckFycmF5ICsgaUxlbmd0aC0tOw0KKyAgaWYgKGJBbGxDaGFycykgew0KKyAgICBwQ3VyLT5tX25CcmVha1R5cGUgPSBGWF9MQlRfVU5LTk9XTjsNCisgIH0NCisgIG5Db2RlUHJvcCA9IHBDdXItPm1fZHdDaGFyUHJvcHM7DQorICBuTmV4dCA9IG5Db2RlUHJvcCAmIDB4MDAzRjsNCisgIGludDMyX3QgaUNoYXJXaWR0aCA9IHBDdXItPm1faUNoYXJXaWR0aDsNCisgIGlmIChpQ2hhcldpZHRoID4gMCkgew0KKyAgICBpRW5kUG9zIC09IGlDaGFyV2lkdGg7DQorICB9DQorICB3aGlsZSAoaUxlbmd0aCA+PSAwKSB7DQorICAgIHBDdXIgPSBwQ2hhckFycmF5ICsgaUxlbmd0aDsNCisgICAgbkNvZGVQcm9wID0gcEN1ci0+bV9kd0NoYXJQcm9wczsNCisgICAgbkN1ciA9IG5Db2RlUHJvcCAmIDB4MDAzRjsNCisgICAgRlhfQk9PTCBiTmVlZEJyZWFrID0gRkFMU0U7DQorICAgIGlmIChuQ3VyID09IEZYX0NCUF9TUCkgew0KKyAgICAgIGJOZWVkQnJlYWsgPSAhYlNwYWNlQnJlYWs7DQorICAgICAgaWYgKG5OZXh0ID09IEZYX0NCUF9TUCkgew0KKyAgICAgICAgZVR5cGUgPSBiU3BhY2VCcmVhayA/IEZYX0xCVF9ESVJFQ1RfQlJLIDogRlhfTEJUX1BST0hJQklURURfQlJLOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBlVHlwZSA9ICooKGNvbnN0IEZYX0xJTkVCUkVBS1RZUEUqKWdzX0ZYX0xpbmVCcmVha19QYWlyVGFibGUgKw0KKyAgICAgICAgICAgICAgICAgIChuQ3VyIDw8IDUpICsgbk5leHQpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChuQ3VyID09IEZYX0NCUF9UQikgew0KKyAgICAgIGJOZWVkQnJlYWsgPSAhYlRhYkJyZWFrOw0KKyAgICAgIGlmIChuTmV4dCA9PSBGWF9DQlBfVEIpIHsNCisgICAgICAgIGVUeXBlID0gYlRhYkJyZWFrID8gRlhfTEJUX0RJUkVDVF9CUksgOiBGWF9MQlRfUFJPSElCSVRFRF9CUks7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGVUeXBlID0gKigoY29uc3QgRlhfTElORUJSRUFLVFlQRSopZ3NfRlhfTGluZUJyZWFrX1BhaXJUYWJsZSArDQorICAgICAgICAgICAgICAgICAgKG5DdXIgPDwgNSkgKyBuTmV4dCk7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGJOdW1iZXJCcmVhayAmJiBuQ3VyID09IEZYX0NCUF9OVSAmJiBuTmV4dCA9PSBGWF9DQlBfTlUpIHsNCisgICAgICBlVHlwZSA9IEZYX0xCVF9ESVJFQ1RfQlJLOw0KKyAgICB9IGVsc2UgaWYgKGJJbmZpeEJyZWFrICYmIG5DdXIgPT0gRlhfQ0JQX0lTICYmIG5OZXh0ID09IEZYX0NCUF9JUykgew0KKyAgICAgIGVUeXBlID0gRlhfTEJUX0RJUkVDVF9CUks7DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKG5OZXh0ID09IEZYX0NCUF9TUCkgew0KKyAgICAgICAgZVR5cGUgPSBGWF9MQlRfUFJPSElCSVRFRF9CUks7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGVUeXBlID0gKigoY29uc3QgRlhfTElORUJSRUFLVFlQRSopZ3NfRlhfTGluZUJyZWFrX1BhaXJUYWJsZSArDQorICAgICAgICAgICAgICAgICAgKG5DdXIgPDwgNSkgKyBuTmV4dCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChiQWxsQ2hhcnMpIHsNCisgICAgICBwQ3VyLT5tX25CcmVha1R5cGUgPSBlVHlwZTsNCisgICAgfQ0KKyAgICBpZiAoIWJPbmx5QnJrKSB7DQorICAgICAgaUNoYXJXaWR0aCA9IHBDdXItPm1faUNoYXJXaWR0aDsNCisgICAgICBGWF9CT09MIGJCcmVhayA9IEZBTFNFOw0KKyAgICAgIGlmIChuQ3VyID09IEZYX0NCUF9UQiAmJiBiVGFiQnJlYWspIHsNCisgICAgICAgIGJCcmVhayA9IGlDaGFyV2lkdGggPiAwICYmIGlFbmRQb3MgLSBpQ2hhcldpZHRoIDw9IG1faUJvdW5kYXJ5RW5kOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBiQnJlYWsgPSBpRW5kUG9zIDw9IG1faUJvdW5kYXJ5RW5kOw0KKyAgICAgIH0NCisgICAgICBpZiAobV9iU2luZ2xlTGluZSB8fCBtX2JPcnBoYW5MaW5lIHx8IGJCcmVhayB8fCBiTmVlZEJyZWFrKSB7DQorICAgICAgICBpZiAoZVR5cGUgPT0gRlhfTEJUX0RJUkVDVF9CUksgJiYgaUJyZWFrIDwgMCkgew0KKyAgICAgICAgICBpQnJlYWsgPSBpTGVuZ3RoOw0KKyAgICAgICAgICBpQnJlYWtQb3MgPSBpRW5kUG9zOw0KKyAgICAgICAgICBpZiAoIWJBbGxDaGFycykgew0KKyAgICAgICAgICAgIHJldHVybiBpTGVuZ3RoOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKGVUeXBlID09IEZYX0xCVF9JTkRJUkVDVF9CUksgJiYgaUluZGlyZWN0IDwgMCkgew0KKyAgICAgICAgICBpSW5kaXJlY3QgPSBpTGVuZ3RoOw0KKyAgICAgICAgICBpSW5kaXJlY3RQb3MgPSBpRW5kUG9zOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGlMYXN0IDwgMCkgew0KKyAgICAgICAgICBpTGFzdCA9IGlMZW5ndGg7DQorICAgICAgICAgIGlMYXN0UG9zID0gaUVuZFBvczsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgaWYgKGlDaGFyV2lkdGggPiAwKSB7DQorICAgICAgICBpRW5kUG9zIC09IGlDaGFyV2lkdGg7DQorICAgICAgfQ0KKyAgICB9DQorICAgIG5OZXh0ID0gbkNvZGVQcm9wICYgMHgwMDNGOw0KKyAgICBpTGVuZ3RoLS07DQorICB9DQorICBpZiAoYk9ubHlCcmspIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpZiAoaUJyZWFrID4gLTEpIHsNCisgICAgaUVuZFBvcyA9IGlCcmVha1BvczsNCisgICAgcmV0dXJuIGlCcmVhazsNCisgIH0NCisgIGlmIChpSW5kaXJlY3QgPiAtMSkgew0KKyAgICBpRW5kUG9zID0gaUluZGlyZWN0UG9zOw0KKyAgICByZXR1cm4gaUluZGlyZWN0Ow0KKyAgfQ0KKyAgaWYgKGlMYXN0ID4gLTEpIHsNCisgICAgaUVuZFBvcyA9IGlMYXN0UG9zOw0KKyAgICByZXR1cm4gaUxhc3Q7DQorICB9DQorICByZXR1cm4gMDsNCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OlNwbGl0VGV4dExpbmUoQ0ZYX1JURkxpbmUqIHBDdXJMaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SVEZMaW5lKiBwTmV4dExpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWxsQ2hhcnMpIHsNCisgIEZYU1lTX2Fzc2VydChwQ3VyTGluZSAhPSBOVUxMICYmIHBOZXh0TGluZSAhPSBOVUxMKTsNCisgIGludDMyX3QgaUNvdW50ID0gcEN1ckxpbmUtPkNvdW50Q2hhcnMoKTsNCisgIGlmIChpQ291bnQgPCAyKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgaUVuZFBvcyA9IHBDdXJMaW5lLT5HZXRMaW5lRW5kKCk7DQorICBDRlhfUlRGQ2hhckFycmF5JiBjdXJDaGFycyA9IHBDdXJMaW5lLT5tX0xpbmVDaGFyczsNCisgIGludDMyX3QgaUNoYXJQb3MgPSBHZXRCcmVha1BvcyhjdXJDaGFycywgaUVuZFBvcywgYkFsbENoYXJzLCBGQUxTRSk7DQorICBpZiAoaUNoYXJQb3MgPCAwKSB7DQorICAgIGlDaGFyUG9zID0gMDsNCisgIH0NCisgIGlDaGFyUG9zKys7DQorICBpZiAoaUNoYXJQb3MgPj0gaUNvdW50KSB7DQorICAgIHBOZXh0TGluZS0+UmVtb3ZlQWxsKFRSVUUpOw0KKyAgICBDRlhfQ2hhciogcFRDID0gY3VyQ2hhcnMuR2V0RGF0YVB0cihpQ2hhclBvcyAtIDEpOw0KKyAgICBwVEMtPm1fbkJyZWFrVHlwZSA9IEZYX0xCVF9VTktOT1dOOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfUlRGQ2hhckFycmF5JiBuZXh0Q2hhcnMgPSBwTmV4dExpbmUtPm1fTGluZUNoYXJzOw0KKyAgaW50IGN1cl9zaXplID0gY3VyQ2hhcnMuR2V0U2l6ZSgpOw0KKyAgbmV4dENoYXJzLlNldFNpemUoY3VyX3NpemUgLSBpQ2hhclBvcyk7DQorICBGWFNZU19tZW1jcHkobmV4dENoYXJzLkdldERhdGEoKSwgY3VyQ2hhcnMuR2V0RGF0YVB0cihpQ2hhclBvcyksDQorICAgICAgICAgICAgICAgKGN1cl9zaXplIC0gaUNoYXJQb3MpICogc2l6ZW9mKENGWF9SVEZDaGFyKSk7DQorICBpQ291bnQgLT0gaUNoYXJQb3M7DQorICBjdXJfc2l6ZSA9IGN1ckNoYXJzLkdldFNpemUoKTsNCisgIGN1ckNoYXJzLlJlbW92ZUF0KGN1cl9zaXplIC0gaUNvdW50LCBpQ291bnQpOw0KKyAgcE5leHRMaW5lLT5tX2lTdGFydCA9IHBDdXJMaW5lLT5tX2lTdGFydDsNCisgIHBOZXh0TGluZS0+bV9pV2lkdGggPSBwQ3VyTGluZS0+R2V0TGluZUVuZCgpIC0gaUVuZFBvczsNCisgIHBDdXJMaW5lLT5tX2lXaWR0aCA9IGlFbmRQb3M7DQorICBDRlhfUlRGQ2hhciogdGMgPSBjdXJDaGFycy5HZXREYXRhUHRyKGlDaGFyUG9zIC0gMSk7DQorICB0Yy0+bV9uQnJlYWtUeXBlID0gRlhfTEJUX1VOS05PV047DQorICBpQ291bnQgPSBuZXh0Q2hhcnMuR2V0U2l6ZSgpOw0KKyAgQ0ZYX1JURkNoYXIqIHBOZXh0Q2hhcnMgPSBuZXh0Q2hhcnMuR2V0RGF0YSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgQ0ZYX1JURkNoYXIqIHRjID0gcE5leHRDaGFycyArIGk7DQorICAgIGlmICh0Yy0+R2V0Q2hhclR5cGUoKSA+PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmKSB7DQorICAgICAgcEN1ckxpbmUtPm1faUFyYWJpY0NoYXJzLS07DQorICAgICAgcE5leHRMaW5lLT5tX2lBcmFiaWNDaGFycysrOw0KKyAgICB9DQorICAgIGlmICh0Yy0+bV9kd0xheW91dFN0eWxlcyAmIEZYX1JURkxBWU9VVFNUWUxFX01CQ1NDb2RlKSB7DQorICAgICAgcEN1ckxpbmUtPm1faU1CQ1NDaGFycy0tOw0KKyAgICAgIHBOZXh0TGluZS0+bV9pTUJDU0NoYXJzKys7DQorICAgIH0NCisgICAgdGMtPm1fZHdTdGF0dXMgPSAwOw0KKyAgfQ0KK30NCitpbnQzMl90IENGWF9SVEZCcmVhazo6Q291bnRCcmVha1BpZWNlcygpIGNvbnN0IHsNCisgIENGWF9SVEZQaWVjZUFycmF5KiBwUlRGUGllY2VzID0gR2V0UlRGUGllY2VzKFRSVUUpOw0KKyAgaWYgKHBSVEZQaWVjZXMgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHJldHVybiBwUlRGUGllY2VzLT5HZXRTaXplKCk7DQorfQ0KK2NvbnN0IENGWF9SVEZQaWVjZSogQ0ZYX1JURkJyZWFrOjpHZXRCcmVha1BpZWNlKGludDMyX3QgaW5kZXgpIGNvbnN0IHsNCisgIENGWF9SVEZQaWVjZUFycmF5KiBwUlRGUGllY2VzID0gR2V0UlRGUGllY2VzKFRSVUUpOw0KKyAgaWYgKHBSVEZQaWVjZXMgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gcFJURlBpZWNlcy0+R2V0U2l6ZSgpKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIHBSVEZQaWVjZXMtPkdldFB0ckF0KGluZGV4KTsNCit9DQordm9pZCBDRlhfUlRGQnJlYWs6OkdldExpbmVSZWN0KENGWF9SZWN0RiYgcmVjdCkgY29uc3Qgew0KKyAgcmVjdC50b3AgPSAwOw0KKyAgQ0ZYX1JURkxpbmUqIHBSVEZMaW5lID0gR2V0UlRGTGluZShUUlVFKTsNCisgIGlmIChwUlRGTGluZSA9PSBOVUxMKSB7DQorICAgIHJlY3QubGVmdCA9ICgoRlhfRkxPQVQpbV9pQm91bmRhcnlTdGFydCkgLyAyMDAwMC4wZjsNCisgICAgcmVjdC53aWR0aCA9IHJlY3QuaGVpZ2h0ID0gMDsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgcmVjdC5sZWZ0ID0gKChGWF9GTE9BVClwUlRGTGluZS0+bV9pU3RhcnQpIC8gMjAwMDAuMGY7DQorICByZWN0LndpZHRoID0gKChGWF9GTE9BVClwUlRGTGluZS0+bV9pV2lkdGgpIC8gMjAwMDAuMGY7DQorICBDRlhfUlRGUGllY2VBcnJheSYgcnRmUGllY2VzID0gcFJURkxpbmUtPm1fTGluZVBpZWNlczsNCisgIGludDMyX3QgaUNvdW50ID0gcnRmUGllY2VzLkdldFNpemUoKTsNCisgIGlmIChpQ291bnQgPCAxKSB7DQorICAgIHJlY3Qud2lkdGggPSAwOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfUlRGUGllY2UqIHBCcmVha1BpZWNlOw0KKyAgaW50MzJfdCBpTGluZUhlaWdodCA9IDAsIGlNYXg7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBwQnJlYWtQaWVjZSA9IHJ0ZlBpZWNlcy5HZXRQdHJBdChpKTsNCisgICAgaW50MzJfdCBpRm9udEhlaWdodCA9IEZYU1lTX3JvdW5kKHBCcmVha1BpZWNlLT5tX2lGb250SGVpZ2h0ICoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCcmVha1BpZWNlLT5tX2lWZXJ0aWNhbFNjYWxlIC8gMTAwLjBmKTsNCisgICAgaU1heCA9IHN0ZDo6bWF4KHBCcmVha1BpZWNlLT5tX2lGb250U2l6ZSwgaUZvbnRIZWlnaHQpOw0KKyAgICBpZiAoaSA9PSAwKSB7DQorICAgICAgaUxpbmVIZWlnaHQgPSBpTWF4Ow0KKyAgICB9IGVsc2UgaWYgKGlMaW5lSGVpZ2h0IDwgaU1heCkgew0KKyAgICAgIGlMaW5lSGVpZ2h0ID0gaU1heDsNCisgICAgfQ0KKyAgfQ0KKyAgcmVjdC5oZWlnaHQgPSAoKEZYX0ZMT0FUKWlMaW5lSGVpZ2h0KSAvIDIwLjBmOw0KK30NCit2b2lkIENGWF9SVEZCcmVhazo6Q2xlYXJCcmVha1BpZWNlcygpIHsNCisgIENGWF9SVEZMaW5lKiBwUlRGTGluZSA9IEdldFJURkxpbmUoVFJVRSk7DQorICBpZiAocFJURkxpbmUgIT0gTlVMTCkgew0KKyAgICBwUlRGTGluZS0+UmVtb3ZlQWxsKFRSVUUpOw0KKyAgfQ0KKyAgbV9pUmVhZHkgPSAwOw0KK30NCit2b2lkIENGWF9SVEZCcmVhazo6UmVzZXQoKSB7DQorICBtX2R3Q2hhclR5cGUgPSAwOw0KKyAgbV9SVEZMaW5lMS5SZW1vdmVBbGwoVFJVRSk7DQorICBtX1JURkxpbmUyLlJlbW92ZUFsbChUUlVFKTsNCit9DQoraW50MzJfdCBDRlhfUlRGQnJlYWs6OkdldERpc3BsYXlQb3MoRlhfTFBDUlRGVEVYVE9CSiBwVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcqIHBXU0Zvcm1zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FkanVzdENoYXJEaXNwbGF5UG9zIHBBZGp1c3RQb3MpIGNvbnN0IHsNCisgIGlmIChwVGV4dCA9PSBOVUxMIHx8IHBUZXh0LT5pTGVuZ3RoIDwgMSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIEZYU1lTX2Fzc2VydChwVGV4dC0+cFN0ciAhPSBOVUxMICYmIHBUZXh0LT5wV2lkdGhzICE9IE5VTEwgJiYNCisgICAgICAgICAgICAgICBwVGV4dC0+cEZvbnQgIT0gTlVMTCAmJiBwVGV4dC0+cFJlY3QgIT0gTlVMTCk7DQorICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9IHBUZXh0LT5wU3RyOw0KKyAgaW50MzJfdCogcFdpZHRocyA9IHBUZXh0LT5wV2lkdGhzOw0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcFRleHQtPmlMZW5ndGggLSAxOw0KKyAgSUZYX0ZvbnQqIHBGb250ID0gcFRleHQtPnBGb250Ow0KKyAgRlhfRFdPUkQgZHdTdHlsZXMgPSBwVGV4dC0+ZHdMYXlvdXRTdHlsZXM7DQorICBDRlhfUmVjdEYgcnRUZXh0KCpwVGV4dC0+cFJlY3QpOw0KKyAgRlhfQk9PTCBiUlRMUGllY2UgPSBGWF9Jc09kZChwVGV4dC0+aUJpZGlMZXZlbCk7DQorICBGWF9GTE9BVCBmRm9udFNpemUgPSBwVGV4dC0+ZkZvbnRTaXplOw0KKyAgaW50MzJfdCBpRm9udFNpemUgPSBGWFNZU19yb3VuZChmRm9udFNpemUgKiAyMC4wZik7DQorICBpbnQzMl90IGlBc2NlbnQgPSBwRm9udC0+R2V0QXNjZW50KCk7DQorICBpbnQzMl90IGlEZXNjZW50ID0gcEZvbnQtPkdldERlc2NlbnQoKTsNCisgIGludDMyX3QgaU1heEhlaWdodCA9IGlBc2NlbnQgLSBpRGVzY2VudDsNCisgIEZYX0ZMT0FUIGZGb250SGVpZ2h0ID0gZkZvbnRTaXplOw0KKyAgRlhfRkxPQVQgZkFzY2VudCA9IGZGb250SGVpZ2h0ICogKEZYX0ZMT0FUKWlBc2NlbnQgLyAoRlhfRkxPQVQpaU1heEhlaWdodDsNCisgIEZYX0ZMT0FUIGZEZXNjZW50ID0gZkZvbnRIZWlnaHQgKiAoRlhfRkxPQVQpaURlc2NlbnQgLyAoRlhfRkxPQVQpaU1heEhlaWdodDsNCisgIEZYX0JPT0wgYlZlcnRpY2FsRG9jID0gKGR3U3R5bGVzICYgRlhfUlRGTEFZT1VUU1RZTEVfVmVydGljYWxMYXlvdXQpICE9IDA7DQorICBGWF9CT09MIGJWZXJ0aWNhbENoYXIgPSAoZHdTdHlsZXMgJiBGWF9SVEZMQVlPVVRTVFlMRV9WZXJ0aWNhbENoYXJzKSAhPSAwOw0KKyAgRlhfQk9PTCBiQXJhYmljTnVtYmVyID0gKGR3U3R5bGVzICYgRlhfUlRGTEFZT1VUU1RZTEVfQXJhYmljTnVtYmVyKSAhPSAwOw0KKyAgRlhfQk9PTCBiTUJDU0NvZGUgPSAoZHdTdHlsZXMgJiBGWF9SVEZMQVlPVVRTVFlMRV9NQkNTQ29kZSkgIT0gMDsNCisgIGludDMyX3QgaVJvdGF0aW9uID0gR2V0TGluZVJvdGF0aW9uKGR3U3R5bGVzKSArIHBUZXh0LT5pQ2hhclJvdGF0aW9uOw0KKyAgaW50MzJfdCBpQ2hhclJvdGF0aW9uOw0KKyAgRlhfV0NIQVIgd2NoLCB3UHJldiA9IDB4RkVGRiwgd05leHQsIHdGb3JtOw0KKyAgaW50MzJfdCBpV2lkdGgsIGlDaGFyV2lkdGgsIGlDaGFySGVpZ2h0Ow0KKyAgRlhfRkxPQVQgZlgsIGZZLCBmQ2hhcldpZHRoLCBmQ2hhckhlaWdodDsNCisgIGludDMyX3QgaUhvclNjYWxlID0gcFRleHQtPmlIb3Jpem9udGFsU2NhbGU7DQorICBpbnQzMl90IGlWZXJTY2FsZSA9IHBUZXh0LT5pVmVydGljYWxTY2FsZTsNCisgIEZYX0JPT0wgYkVtcHR5Q2hhcjsNCisgIEZYX0RXT1JEIGR3UHJvcHMsIGR3Q2hhclR5cGU7DQorICBmWCA9IHJ0VGV4dC5sZWZ0Ow0KKyAgZlkgPSBydFRleHQudG9wOw0KKyAgaWYgKGJWZXJ0aWNhbERvYykgew0KKyAgICBmWCArPSAocnRUZXh0LndpZHRoIC0gZkZvbnRTaXplKSAvIDIuMGY7DQorICAgIGlmIChiUlRMUGllY2UpIHsNCisgICAgICBmWSA9IHJ0VGV4dC5ib3R0b20oKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgaWYgKGJSVExQaWVjZSkgew0KKyAgICAgIGZYID0gcnRUZXh0LnJpZ2h0KCk7DQorICAgIH0NCisgICAgZlkgKz0gZkFzY2VudDsNCisgIH0NCisgIGludDMyX3QgaUNvdW50ID0gMDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8PSBpTGVuZ3RoOyBpKyspIHsNCisgICAgd2NoID0gKnBTdHIrKzsNCisgICAgaVdpZHRoID0gKnBXaWR0aHMrKzsNCisgICAgaWYgKCFiTUJDU0NvZGUpIHsNCisgICAgICBkd1Byb3BzID0gRlhfR2V0VW5pY29kZVByb3BlcnRpZXMod2NoKTsNCisgICAgICBkd0NoYXJUeXBlID0gKGR3UHJvcHMgJiBGWF9DSEFSVFlQRUJJVFNNQVNLKTsNCisgICAgICBpZiAoZHdDaGFyVHlwZSA9PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmICYmIGlXaWR0aCA9PSAwKSB7DQorICAgICAgICB3UHJldiA9IDB4RkVGRjsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBkd1Byb3BzID0gMDsNCisgICAgICBkd0NoYXJUeXBlID0gMDsNCisgICAgfQ0KKyAgICBpZiAoaVdpZHRoICE9IDApIHsNCisgICAgICBpQ2hhcldpZHRoID0gaVdpZHRoOw0KKyAgICAgIGlmIChpQ2hhcldpZHRoIDwgMCkgew0KKyAgICAgICAgaUNoYXJXaWR0aCA9IC1pQ2hhcldpZHRoOw0KKyAgICAgIH0NCisgICAgICBpZiAoIWJNQkNTQ29kZSkgew0KKyAgICAgICAgYkVtcHR5Q2hhciA9IChkd0NoYXJUeXBlID49IEZYX0NIQVJUWVBFX1RhYiAmJg0KKyAgICAgICAgICAgICAgICAgICAgICBkd0NoYXJUeXBlIDw9IEZYX0NIQVJUWVBFX0NvbnRyb2wpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBiRW1wdHlDaGFyID0gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGlmICghYkVtcHR5Q2hhcikgew0KKyAgICAgICAgaUNvdW50Kys7DQorICAgICAgfQ0KKyAgICAgIGlmIChwQ2hhclBvcyAhPSBOVUxMKSB7DQorICAgICAgICBpQ2hhcldpZHRoIC89IGlGb250U2l6ZTsNCisgICAgICAgIHdGb3JtID0gd2NoOw0KKyAgICAgICAgaWYgKCFiTUJDU0NvZGUpIHsNCisgICAgICAgICAgaWYgKGR3Q2hhclR5cGUgPj0gRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikgew0KKyAgICAgICAgICAgIGlmIChpIDwgaUxlbmd0aCkgew0KKyAgICAgICAgICAgICAgd05leHQgPSAqcFN0cjsNCisgICAgICAgICAgICAgIGlmICgqcFdpZHRocyA8IDApIHsNCisgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaUxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICAgIHdOZXh0ID0gcFN0clsxXTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICB3TmV4dCA9IDB4RkVGRjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd0Zvcm0gPSBtX3BBcmFiaWNDaGFyLT5HZXRGb3JtQ2hhcih3Y2gsIHdQcmV2LCB3TmV4dCk7DQorICAgICAgICAgIH0gZWxzZSBpZiAoYlJUTFBpZWNlIHx8IGJWZXJ0aWNhbENoYXIpIHsNCisgICAgICAgICAgICB3Rm9ybSA9IEZYX0dldE1pcnJvckNoYXIod2NoLCBkd1Byb3BzLCBiUlRMUGllY2UsIGJWZXJ0aWNhbENoYXIpOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKGR3Q2hhclR5cGUgPT0gRlhfQ0hBUlRZUEVfTnVtZXJpYyAmJiBiQXJhYmljTnVtYmVyKSB7DQorICAgICAgICAgICAgd0Zvcm0gPSB3Y2ggKyAweDA2MzA7DQorICAgICAgICAgIH0NCisgICAgICAgICAgZHdQcm9wcyA9IEZYX0dldFVuaWNvZGVQcm9wZXJ0aWVzKHdGb3JtKTsNCisgICAgICAgIH0NCisgICAgICAgIGlDaGFyUm90YXRpb24gPSBpUm90YXRpb247DQorICAgICAgICBpZiAoIWJNQkNTQ29kZSAmJiBiVmVydGljYWxDaGFyICYmIChkd1Byb3BzICYgMHg4MDAwKSAhPSAwKSB7DQorICAgICAgICAgIGlDaGFyUm90YXRpb24rKzsNCisgICAgICAgICAgaUNoYXJSb3RhdGlvbiAlPSA0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFiRW1wdHlDaGFyKSB7DQorICAgICAgICAgIGlmIChiQ2hhckNvZGUpIHsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9HbHlwaEluZGV4ID0gd2NoOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0dseXBoSW5kZXggPSBwRm9udC0+R2V0R2x5cGhJbmRleCh3Rm9ybSwgYk1CQ1NDb2RlKTsNCisgICAgICAgICAgICBpZiAocENoYXJQb3MtPm1fR2x5cGhJbmRleCA9PSAweEZGRkYpIHsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0dseXBoSW5kZXggPSBwRm9udC0+R2V0R2x5cGhJbmRleCh3Y2gsIGJNQkNTQ29kZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHBDaGFyUG9zLT5tX0V4dEdJRCA9IHBDaGFyUG9zLT5tX0dseXBoSW5kZXg7DQorICAgICAgICAgIHBDaGFyUG9zLT5tX0ZvbnRDaGFyV2lkdGggPSBpQ2hhcldpZHRoOw0KKyAgICAgICAgICBpZiAocFdTRm9ybXMpIHsNCisgICAgICAgICAgICAqcFdTRm9ybXMgKz0gd0Zvcm07DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChiVmVydGljYWxEb2MpIHsNCisgICAgICAgICAgaUNoYXJIZWlnaHQgPSBpQ2hhcldpZHRoOw0KKyAgICAgICAgICBpQ2hhcldpZHRoID0gMTAwMDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGlDaGFySGVpZ2h0ID0gMTAwMDsNCisgICAgICAgIH0NCisgICAgICAgIGZDaGFyV2lkdGggPSBmRm9udFNpemUgKiBpQ2hhcldpZHRoIC8gMTAwMC4wZjsNCisgICAgICAgIGZDaGFySGVpZ2h0ID0gZkZvbnRTaXplICogaUNoYXJIZWlnaHQgLyAxMDAwLjBmOw0KKyAgICAgICAgaWYgKCFiTUJDU0NvZGUgJiYgYlJUTFBpZWNlICYmIGR3Q2hhclR5cGUgIT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pIHsNCisgICAgICAgICAgaWYgKGJWZXJ0aWNhbERvYykgew0KKyAgICAgICAgICAgIGZZIC09IGZDaGFySGVpZ2h0Ow0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGZYIC09IGZDaGFyV2lkdGg7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmICghYkVtcHR5Q2hhcikgew0KKyAgICAgICAgICBDRlhfUG9pbnRGIHB0T2Zmc2V0Ow0KKyAgICAgICAgICBwdE9mZnNldC5SZXNldCgpOw0KKyAgICAgICAgICBGWF9CT09MIGJBZGp1c3RlZCA9IEZBTFNFOw0KKyAgICAgICAgICBpZiAocEFkanVzdFBvcykgew0KKyAgICAgICAgICAgIGJBZGp1c3RlZCA9IHBBZGp1c3RQb3Mod0Zvcm0sIGJNQkNTQ29kZSwgcEZvbnQsIGZGb250U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWZXJ0aWNhbENoYXIsIHB0T2Zmc2V0KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoIXBBZGp1c3RQb3MgJiYgYlZlcnRpY2FsQ2hhciAmJiAoZHdQcm9wcyAmIDB4MDAwMTAwMDApICE9IDApIHsNCisgICAgICAgICAgICBDRlhfUmVjdCBydEJCb3g7DQorICAgICAgICAgICAgcnRCQm94LlJlc2V0KCk7DQorICAgICAgICAgICAgaWYgKHBGb250LT5HZXRDaGFyQkJveCh3Rm9ybSwgcnRCQm94LCBiTUJDU0NvZGUpKSB7DQorICAgICAgICAgICAgICBwdE9mZnNldC54ID0gZkZvbnRTaXplICogKDg1MCAtIHJ0QkJveC5yaWdodCgpKSAvIDEwMDAuMGY7DQorICAgICAgICAgICAgICBwdE9mZnNldC55ID0gZkZvbnRTaXplICogKDEwMDAgLSBydEJCb3guaGVpZ2h0KSAvIDIwMDAuMGY7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblggPSBmWCArIHB0T2Zmc2V0Lng7DQorICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblkgPSBmWSAtIHB0T2Zmc2V0Lnk7DQorICAgICAgICB9DQorICAgICAgICBpZiAoIWJSVExQaWVjZSAmJiBkd0NoYXJUeXBlICE9IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uKSB7DQorICAgICAgICAgIGlmIChiVmVydGljYWxEb2MpIHsNCisgICAgICAgICAgICBmWSArPSBmQ2hhckhlaWdodDsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBmWCArPSBmQ2hhcldpZHRoOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoIWJFbXB0eUNoYXIpIHsNCisgICAgICAgICAgcENoYXJQb3MtPm1fYkdseXBoQWRqdXN0ID0gVFJVRTsNCisgICAgICAgICAgaWYgKGJWZXJ0aWNhbERvYykgew0KKyAgICAgICAgICAgIGlmIChpQ2hhclJvdGF0aW9uID09IDApIHsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IC0xOw0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gMDsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IDA7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM10gPSAxOw0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWSArPSBmQXNjZW50ICogaVZlclNjYWxlIC8gMTAwLjBmOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaUNoYXJSb3RhdGlvbiA9PSAxKSB7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gPSAwOw0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gLTE7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPSAtMTsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IDA7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5YIC09DQorICAgICAgICAgICAgICAgICAgZkRlc2NlbnQgKyBmQXNjZW50ICogaVZlclNjYWxlIC8gMTAwLjBmIC0gZkFzY2VudDsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKGlDaGFyUm90YXRpb24gPT0gMikgew0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0gMTsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9IDA7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPSAwOw0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0gLTE7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5YICs9IGZDaGFyV2lkdGg7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZICs9IGZBc2NlbnQ7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IDA7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSAxOw0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gMTsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IDA7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5YICs9IGZBc2NlbnQ7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZICs9IGZDaGFyV2lkdGg7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChpQ2hhclJvdGF0aW9uID09IDApIHsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IC0xOw0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gMDsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IDA7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM10gPSAxOw0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWSArPSBmQXNjZW50ICogaVZlclNjYWxlIC8gMTAwLjBmIC0gZkFzY2VudDsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKGlDaGFyUm90YXRpb24gPT0gMSkgew0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0gMDsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9IC0xOw0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gLTE7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM10gPSAwOw0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWCAtPSBmRGVzY2VudDsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblkgLT0gZkFzY2VudCArIGZEZXNjZW50Ow0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaUNoYXJSb3RhdGlvbiA9PSAyKSB7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gPSAxOw0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gMDsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IDA7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM10gPSAtMTsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblggKz0gZkNoYXJXaWR0aDsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblkgLT0gZkFzY2VudDsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0gMDsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9IDE7DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPSAxOw0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0gMDsNCisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblggKz0gZkFzY2VudCAqIGlWZXJTY2FsZSAvIDEwMC4wZjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGlIb3JTY2FsZSAhPSAxMDAgfHwgaVZlclNjYWxlICE9IDEwMCkgew0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9DQorICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSAqIGlIb3JTY2FsZSAvIDEwMC4wZjsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPQ0KKyAgICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gKiBpSG9yU2NhbGUgLyAxMDAuMGY7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0NCisgICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdICogaVZlclNjYWxlIC8gMTAwLjBmOw0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9DQorICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSAqIGlWZXJTY2FsZSAvIDEwMC4wZjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwQ2hhclBvcysrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoaVdpZHRoID4gMCkgew0KKyAgICAgIHdQcmV2ID0gd2NoOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gaUNvdW50Ow0KK30NCitpbnQzMl90IENGWF9SVEZCcmVhazo6R2V0Q2hhclJlY3RzKEZYX0xQQ1JURlRFWFRPQkogcFRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEZBcnJheSYgcnRBcnJheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJCQm94KSBjb25zdCB7DQorICBpZiAocFRleHQgPT0gTlVMTCB8fCBwVGV4dC0+aUxlbmd0aCA8IDEpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBGWFNZU19hc3NlcnQocFRleHQtPnBTdHIgIT0gTlVMTCAmJiBwVGV4dC0+cFdpZHRocyAhPSBOVUxMICYmDQorICAgICAgICAgICAgICAgcFRleHQtPnBGb250ICE9IE5VTEwgJiYgcFRleHQtPnBSZWN0ICE9IE5VTEwpOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBTdHIgPSBwVGV4dC0+cFN0cjsNCisgIGludDMyX3QqIHBXaWR0aHMgPSBwVGV4dC0+cFdpZHRoczsNCisgIGludDMyX3QgaUxlbmd0aCA9IHBUZXh0LT5pTGVuZ3RoOw0KKyAgQ0ZYX1JlY3RGIHJlY3QoKnBUZXh0LT5wUmVjdCk7DQorICBGWF9CT09MIGJSVExQaWVjZSA9IEZYX0lzT2RkKHBUZXh0LT5pQmlkaUxldmVsKTsNCisgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IHBUZXh0LT5mRm9udFNpemU7DQorICBpbnQzMl90IGlGb250U2l6ZSA9IEZYU1lTX3JvdW5kKGZGb250U2l6ZSAqIDIwLjBmKTsNCisgIEZYX0ZMT0FUIGZTY2FsZSA9IGZGb250U2l6ZSAvIDEwMDAuMGY7DQorICBJRlhfRm9udCogcEZvbnQgPSBwVGV4dC0+cEZvbnQ7DQorICBpZiAocEZvbnQgPT0gTlVMTCkgew0KKyAgICBiQ2hhckJCb3ggPSBGQUxTRTsNCisgIH0NCisgIENGWF9SZWN0IGJib3g7DQorICBiYm94LlNldCgwLCAwLCAwLCAwKTsNCisgIGlmIChiQ2hhckJCb3gpIHsNCisgICAgYkNoYXJCQm94ID0gcEZvbnQtPkdldEJCb3goYmJveCk7DQorICB9DQorICBGWF9GTE9BVCBmTGVmdCA9IHN0ZDo6bWF4KDAuMGYsIGJib3gubGVmdCAqIGZTY2FsZSk7DQorICBGWF9GTE9BVCBmSGVpZ2h0ID0gRlhTWVNfZmFicyhiYm94LmhlaWdodCAqIGZTY2FsZSk7DQorICBydEFycmF5LlJlbW92ZUFsbCgpOw0KKyAgcnRBcnJheS5TZXRTaXplKGlMZW5ndGgpOw0KKyAgRlhfRFdPUkQgZHdTdHlsZXMgPSBwVGV4dC0+ZHdMYXlvdXRTdHlsZXM7DQorICBGWF9CT09MIGJWZXJ0aWNhbCA9IChkd1N0eWxlcyAmIEZYX1JURkxBWU9VVFNUWUxFX1ZlcnRpY2FsTGF5b3V0KSAhPSAwOw0KKyAgRlhfQk9PTCBiU2luZ2xlTGluZSA9IChkd1N0eWxlcyAmIEZYX1JURkxBWU9VVFNUWUxFX1NpbmdsZUxpbmUpICE9IDA7DQorICBGWF9CT09MIGJDb21iVGV4dCA9IChkd1N0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX0NvbWJUZXh0KSAhPSAwOw0KKyAgRlhfV0NIQVIgd2NoLCB3TGluZUJyZWFrQ2hhciA9IHBUZXh0LT53TGluZUJyZWFrQ2hhcjsNCisgIGludDMyX3QgaUNoYXJTaXplOw0KKyAgRlhfRkxPQVQgZkNoYXJTaXplLCBmU3RhcnQ7DQorICBpZiAoYlZlcnRpY2FsKSB7DQorICAgIGZTdGFydCA9IGJSVExQaWVjZSA/IHJlY3QuYm90dG9tKCkgOiByZWN0LnRvcDsNCisgIH0gZWxzZSB7DQorICAgIGZTdGFydCA9IGJSVExQaWVjZSA/IHJlY3QucmlnaHQoKSA6IHJlY3QubGVmdDsNCisgIH0NCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMZW5ndGg7IGkrKykgew0KKyAgICB3Y2ggPSAqcFN0cisrOw0KKyAgICBpQ2hhclNpemUgPSAqcFdpZHRocysrOw0KKyAgICBmQ2hhclNpemUgPSAoRlhfRkxPQVQpaUNoYXJTaXplIC8gMjAwMDAuMGY7DQorICAgIEZYX0JPT0wgYlJldCA9ICghYlNpbmdsZUxpbmUgJiYgRlhfSXNDdHJsQ29kZSh3Y2gpKTsNCisgICAgaWYgKCEod2NoID09IEwnXHYnIHx8IHdjaCA9PSBMJ1xmJyB8fCB3Y2ggPT0gMHgyMDI4IHx8IHdjaCA9PSAweDIwMjkgfHwNCisgICAgICAgICAgKHdMaW5lQnJlYWtDaGFyICE9IDB4RkVGRiAmJiB3Y2ggPT0gd0xpbmVCcmVha0NoYXIpKSkgew0KKyAgICAgIGJSZXQgPSBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAoYlJldCkgew0KKyAgICAgIGlDaGFyU2l6ZSA9IGlGb250U2l6ZSAqIDUwMDsNCisgICAgICBmQ2hhclNpemUgPSBmRm9udFNpemUgLyAyLjBmOw0KKyAgICB9DQorICAgIGlmIChiVmVydGljYWwpIHsNCisgICAgICByZWN0LnRvcCA9IGZTdGFydDsNCisgICAgICBpZiAoYlJUTFBpZWNlKSB7DQorICAgICAgICByZWN0LnRvcCAtPSBmQ2hhclNpemU7DQorICAgICAgICBmU3RhcnQgLT0gZkNoYXJTaXplOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBmU3RhcnQgKz0gZkNoYXJTaXplOw0KKyAgICAgIH0NCisgICAgICByZWN0LmhlaWdodCA9IGZDaGFyU2l6ZTsNCisgICAgfSBlbHNlIHsNCisgICAgICByZWN0LmxlZnQgPSBmU3RhcnQ7DQorICAgICAgaWYgKGJSVExQaWVjZSkgew0KKyAgICAgICAgcmVjdC5sZWZ0IC09IGZDaGFyU2l6ZTsNCisgICAgICAgIGZTdGFydCAtPSBmQ2hhclNpemU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGZTdGFydCArPSBmQ2hhclNpemU7DQorICAgICAgfQ0KKyAgICAgIHJlY3Qud2lkdGggPSBmQ2hhclNpemU7DQorICAgIH0NCisgICAgaWYgKGJDaGFyQkJveCAmJiAhYlJldCkgew0KKyAgICAgIGludDMyX3QgaUNoYXJXaWR0aCA9IDEwMDA7DQorICAgICAgcEZvbnQtPkdldENoYXJXaWR0aCh3Y2gsIGlDaGFyV2lkdGgpOw0KKyAgICAgIEZYX0ZMT0FUIGZSVExlZnQgPSAwLCBmQ2hhcldpZHRoID0gMDsNCisgICAgICBpZiAoaUNoYXJXaWR0aCA+IDApIHsNCisgICAgICAgIGZDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogZlNjYWxlOw0KKyAgICAgICAgZlJUTGVmdCA9IGZMZWZ0Ow0KKyAgICAgICAgaWYgKGJDb21iVGV4dCkgew0KKyAgICAgICAgICBmUlRMZWZ0ID0gKHJlY3Qud2lkdGggLSBmQ2hhcldpZHRoKSAvIDIuMGY7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIENGWF9SZWN0RiBydEJCb3hGOw0KKyAgICAgIGlmIChiVmVydGljYWwpIHsNCisgICAgICAgIHJ0QkJveEYudG9wID0gcmVjdC5sZWZ0ICsgZlJUTGVmdDsNCisgICAgICAgIHJ0QkJveEYubGVmdCA9IHJlY3QudG9wICsgKHJlY3QuaGVpZ2h0IC0gZkhlaWdodCkgLyAyLjBmOw0KKyAgICAgICAgcnRCQm94Ri5oZWlnaHQgPSBmQ2hhcldpZHRoOw0KKyAgICAgICAgcnRCQm94Ri53aWR0aCA9IGZIZWlnaHQ7DQorICAgICAgICBydEJCb3hGLmxlZnQgPSBzdGQ6Om1heChydEJCb3hGLmxlZnQsIDAuMGYpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBydEJCb3hGLmxlZnQgPSByZWN0LmxlZnQgKyBmUlRMZWZ0Ow0KKyAgICAgICAgcnRCQm94Ri50b3AgPSByZWN0LnRvcCArIChyZWN0LmhlaWdodCAtIGZIZWlnaHQpIC8gMi4wZjsNCisgICAgICAgIHJ0QkJveEYud2lkdGggPSBmQ2hhcldpZHRoOw0KKyAgICAgICAgcnRCQm94Ri5oZWlnaHQgPSBmSGVpZ2h0Ow0KKyAgICAgICAgcnRCQm94Ri50b3AgPSBzdGQ6Om1heChydEJCb3hGLnRvcCwgMC4wZik7DQorICAgICAgfQ0KKyAgICAgIHJ0QXJyYXkuU2V0QXQoaSwgcnRCQm94Rik7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgcnRBcnJheS5TZXRBdChpLCByZWN0KTsNCisgIH0NCisgIHJldHVybiBpTGVuZ3RoOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF9ydGZicmVhay5oIGIveGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfcnRmYnJlYWsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWRkZDUyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfcnRmYnJlYWsuaApAQCAtMCwwICsxLDE3NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWF9SVEZCUkVBS19JTVANCisjZGVmaW5lIF9GWF9SVEZCUkVBS19JTVANCisNCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2FyYi5oIg0KKw0KK2NsYXNzIENGWF9SVEZMaW5lOw0KK2NsYXNzIENGWF9SVEZCcmVhazsNCitjbGFzcyBDRlhfUlRGTGluZSB7DQorIHB1YmxpYzoNCisgIENGWF9SVEZMaW5lKCkNCisgICAgICA6IG1fTGluZVBpZWNlcygxNiksDQorICAgICAgICBtX2lTdGFydCgwKSwNCisgICAgICAgIG1faVdpZHRoKDApLA0KKyAgICAgICAgbV9pQXJhYmljQ2hhcnMoMCksDQorICAgICAgICBtX2lNQkNTQ2hhcnMoMCkge30NCisgIH5DRlhfUlRGTGluZSgpIHsgUmVtb3ZlQWxsKCk7IH0NCisgIGludDMyX3QgQ291bnRDaGFycygpIGNvbnN0IHsgcmV0dXJuIG1fTGluZUNoYXJzLkdldFNpemUoKTsgfQ0KKyAgQ0ZYX1JURkNoYXImIEdldENoYXIoaW50MzJfdCBpbmRleCkgew0KKyAgICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSAmJiBpbmRleCA8IG1fTGluZUNoYXJzLkdldFNpemUoKSk7DQorICAgIHJldHVybiAqbV9MaW5lQ2hhcnMuR2V0RGF0YVB0cihpbmRleCk7DQorICB9DQorICBDRlhfUlRGQ2hhciogR2V0Q2hhclB0cihpbnQzMl90IGluZGV4KSB7DQorICAgIEZYU1lTX2Fzc2VydChpbmRleCA+IC0xICYmIGluZGV4IDwgbV9MaW5lQ2hhcnMuR2V0U2l6ZSgpKTsNCisgICAgcmV0dXJuIG1fTGluZUNoYXJzLkdldERhdGFQdHIoaW5kZXgpOw0KKyAgfQ0KKyAgaW50MzJfdCBDb3VudFBpZWNlcygpIGNvbnN0IHsgcmV0dXJuIG1fTGluZVBpZWNlcy5HZXRTaXplKCk7IH0NCisgIENGWF9SVEZQaWVjZSYgR2V0UGllY2UoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSAmJiBpbmRleCA8IG1fTGluZVBpZWNlcy5HZXRTaXplKCkpOw0KKyAgICByZXR1cm4gbV9MaW5lUGllY2VzLkdldEF0KGluZGV4KTsNCisgIH0NCisgIENGWF9SVEZQaWVjZSogR2V0UGllY2VQdHIoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSAmJiBpbmRleCA8IG1fTGluZVBpZWNlcy5HZXRTaXplKCkpOw0KKyAgICByZXR1cm4gbV9MaW5lUGllY2VzLkdldFB0ckF0KGluZGV4KTsNCisgIH0NCisgIGludDMyX3QgR2V0TGluZUVuZCgpIGNvbnN0IHsgcmV0dXJuIG1faVN0YXJ0ICsgbV9pV2lkdGg7IH0NCisgIHZvaWQgUmVtb3ZlQWxsKEZYX0JPT0wgYkxlYXZlTWVtb3J5ID0gRkFMU0UpIHsNCisgICAgQ0ZYX1JURkNoYXIqIHBDaGFyOw0KKyAgICBJRlhfVW5rbm93biogcFVua25vd247DQorICAgIGludDMyX3QgaUNvdW50ID0gbV9MaW5lQ2hhcnMuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgIHBDaGFyID0gbV9MaW5lQ2hhcnMuR2V0RGF0YVB0cihpKTsNCisgICAgICBpZiAoKHBVbmtub3duID0gcENoYXItPm1fcFVzZXJEYXRhKSAhPSBOVUxMKSB7DQorICAgICAgICBwVW5rbm93bi0+UmVsZWFzZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBtX0xpbmVDaGFycy5SZW1vdmVBbGwoKTsNCisgICAgbV9MaW5lUGllY2VzLlJlbW92ZUFsbChiTGVhdmVNZW1vcnkpOw0KKyAgICBtX2lXaWR0aCA9IDA7DQorICAgIG1faUFyYWJpY0NoYXJzID0gMDsNCisgICAgbV9pTUJDU0NoYXJzID0gMDsNCisgIH0NCisgIENGWF9SVEZDaGFyQXJyYXkgbV9MaW5lQ2hhcnM7DQorICBDRlhfUlRGUGllY2VBcnJheSBtX0xpbmVQaWVjZXM7DQorICBpbnQzMl90IG1faVN0YXJ0Ow0KKyAgaW50MzJfdCBtX2lXaWR0aDsNCisgIGludDMyX3QgbV9pQXJhYmljQ2hhcnM7DQorICBpbnQzMl90IG1faU1CQ1NDaGFyczsNCit9Ow0KK2NsYXNzIENGWF9SVEZCcmVhayA6IHB1YmxpYyBJRlhfUlRGQnJlYWsgew0KKyBwdWJsaWM6DQorICBDRlhfUlRGQnJlYWsoRlhfRFdPUkQgZHdQb2xpY2llcyk7DQorICB+Q0ZYX1JURkJyZWFrKCk7DQorICB2b2lkIFJlbGVhc2UoKSBvdmVycmlkZSB7IGRlbGV0ZSB0aGlzOyB9DQorICB2b2lkIFNldExpbmVCb3VuZGFyeShGWF9GTE9BVCBmTGluZVN0YXJ0LCBGWF9GTE9BVCBmTGluZUVuZCkgb3ZlcnJpZGUgZmluYWw7DQorICB2b2lkIFNldExpbmVTdGFydFBvcyhGWF9GTE9BVCBmTGluZVBvcykgb3ZlcnJpZGUgZmluYWw7DQorICBGWF9EV09SRCBHZXRMYXlvdXRTdHlsZXMoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtX2R3TGF5b3V0U3R5bGVzOyB9DQorICB2b2lkIFNldExheW91dFN0eWxlcyhGWF9EV09SRCBkd0xheW91dFN0eWxlcykgb3ZlcnJpZGU7DQorICB2b2lkIFNldEZvbnQoSUZYX0ZvbnQqIHBGb250KSBvdmVycmlkZTsNCisgIHZvaWQgU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSBvdmVycmlkZTsNCisgIHZvaWQgU2V0VGFiV2lkdGgoRlhfRkxPQVQgZlRhYldpZHRoKSBvdmVycmlkZTsNCisgIHZvaWQgQWRkUG9zaXRpb25lZFRhYihGWF9GTE9BVCBmVGFiUG9zKSBvdmVycmlkZTsNCisgIHZvaWQgU2V0UG9zaXRpb25lZFRhYnMoY29uc3QgQ0ZYX0Zsb2F0QXJyYXkmIHRhYnMpIG92ZXJyaWRlOw0KKyAgdm9pZCBDbGVhclBvc2l0aW9uZWRUYWJzKCkgb3ZlcnJpZGU7DQorICB2b2lkIFNldERlZmF1bHRDaGFyKEZYX1dDSEFSIHdjaCkgb3ZlcnJpZGU7DQorICB2b2lkIFNldExpbmVCcmVha0NoYXIoRlhfV0NIQVIgd2NoKSBvdmVycmlkZTsNCisgIHZvaWQgU2V0TGluZUJyZWFrVG9sZXJhbmNlKEZYX0ZMT0FUIGZUb2xlcmFuY2UpIG92ZXJyaWRlOw0KKyAgdm9pZCBTZXRIb3Jpem9udGFsU2NhbGUoaW50MzJfdCBpU2NhbGUpIG92ZXJyaWRlOw0KKyAgdm9pZCBTZXRWZXJ0aWNhbFNjYWxlKGludDMyX3QgaVNjYWxlKSBvdmVycmlkZTsNCisgIHZvaWQgU2V0Q2hhclJvdGF0aW9uKGludDMyX3QgaUNoYXJSb3RhdGlvbikgb3ZlcnJpZGU7DQorICB2b2lkIFNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlKSBvdmVycmlkZTsNCisgIHZvaWQgU2V0V29yZFNwYWNlKEZYX0JPT0wgYkRlZmF1bHQsIEZYX0ZMT0FUIGZXb3JkU3BhY2UpIG92ZXJyaWRlOw0KKyAgdm9pZCBTZXRSZWFkaW5nT3JkZXIoRlhfQk9PTCBiUlRMID0gRkFMU0UpIG92ZXJyaWRlOw0KKyAgdm9pZCBTZXRBbGlnbm1lbnQoaW50MzJfdCBpQWxpZ25tZW50ID0gRlhfUlRGTElORUFMSUdOTUVOVF9MZWZ0KSBvdmVycmlkZTsNCisgIHZvaWQgU2V0VXNlckRhdGEoSUZYX1Vua25vd24qIHBVc2VyRGF0YSkgb3ZlcnJpZGU7DQorICBGWF9EV09SRCBBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCkgb3ZlcnJpZGU7DQorICBGWF9EV09SRCBFbmRCcmVhayhGWF9EV09SRCBkd1N0YXR1cyA9IEZYX1JURkJSRUFLX1BpZWNlQnJlYWspIG92ZXJyaWRlOw0KKyAgaW50MzJfdCBDb3VudEJyZWFrUGllY2VzKCkgY29uc3Qgb3ZlcnJpZGU7DQorICBjb25zdCBDRlhfUlRGUGllY2UqIEdldEJyZWFrUGllY2UoaW50MzJfdCBpbmRleCkgY29uc3Qgb3ZlcnJpZGU7DQorICB2b2lkIEdldExpbmVSZWN0KENGWF9SZWN0RiYgcmVjdCkgY29uc3Qgb3ZlcnJpZGU7DQorICB2b2lkIENsZWFyQnJlYWtQaWVjZXMoKSBvdmVycmlkZTsNCisgIHZvaWQgUmVzZXQoKSBvdmVycmlkZTsNCisgIGludDMyX3QgR2V0RGlzcGxheVBvcygNCisgICAgICBGWF9MUENSVEZURVhUT0JKIHBUZXh0LA0KKyAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywNCisgICAgICBGWF9CT09MIGJDaGFyQ29kZSA9IEZBTFNFLA0KKyAgICAgIENGWF9XaWRlU3RyaW5nKiBwV1NGb3JtcyA9IE5VTEwsDQorICAgICAgRlhfQWRqdXN0Q2hhckRpc3BsYXlQb3MgcEFkanVzdFBvcyA9IE5VTEwpIGNvbnN0IG92ZXJyaWRlOw0KKyAgaW50MzJfdCBHZXRDaGFyUmVjdHMoRlhfTFBDUlRGVEVYVE9CSiBwVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RkFycmF5JiBydEFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckJCb3ggPSBGQUxTRSkgY29uc3Qgb3ZlcnJpZGU7DQorICBGWF9EV09SRCBBcHBlbmRDaGFyX0NoYXJDb2RlKEZYX1dDSEFSIHdjaCk7DQorICBGWF9EV09SRCBBcHBlbmRDaGFyX0NvbWJpbmF0aW9uKENGWF9SVEZDaGFyKiBwQ3VyQ2hhciwgaW50MzJfdCBpUm90YXRpb24pOw0KKyAgRlhfRFdPUkQgQXBwZW5kQ2hhcl9UYWIoQ0ZYX1JURkNoYXIqIHBDdXJDaGFyLCBpbnQzMl90IGlSb3RhdGlvbik7DQorICBGWF9EV09SRCBBcHBlbmRDaGFyX0NvbnRyb2woQ0ZYX1JURkNoYXIqIHBDdXJDaGFyLCBpbnQzMl90IGlSb3RhdGlvbik7DQorICBGWF9EV09SRCBBcHBlbmRDaGFyX0FyYWJpYyhDRlhfUlRGQ2hhciogcEN1ckNoYXIsIGludDMyX3QgaVJvdGF0aW9uKTsNCisgIEZYX0RXT1JEIEFwcGVuZENoYXJfT3RoZXJzKENGWF9SVEZDaGFyKiBwQ3VyQ2hhciwgaW50MzJfdCBpUm90YXRpb24pOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBGWF9EV09SRCBtX2R3UG9saWNpZXM7DQorICBJRlhfQXJhYmljQ2hhciogbV9wQXJhYmljQ2hhcjsNCisgIGludDMyX3QgbV9pQm91bmRhcnlTdGFydDsNCisgIGludDMyX3QgbV9pQm91bmRhcnlFbmQ7DQorICBGWF9EV09SRCBtX2R3TGF5b3V0U3R5bGVzOw0KKyAgRlhfQk9PTCBtX2JQYWdpbmF0aW9uOw0KKyAgRlhfQk9PTCBtX2JWZXJ0aWNhbDsNCisgIEZYX0JPT0wgbV9iU2luZ2xlTGluZTsNCisgIEZYX0JPT0wgbV9iQ2hhckNvZGU7DQorICBJRlhfRm9udCogbV9wRm9udDsNCisgIGludDMyX3QgbV9pRm9udEhlaWdodDsNCisgIGludDMyX3QgbV9pRm9udFNpemU7DQorICBpbnQzMl90IG1faVRhYldpZHRoOw0KKyAgQ0ZYX0ludDMyQXJyYXkgbV9Qb3NpdGlvbmVkVGFiczsNCisgIEZYX0JPT0wgbV9iT3JwaGFuTGluZTsNCisgIEZYX1dDSEFSIG1fd0RlZkNoYXI7DQorICBpbnQzMl90IG1faURlZkNoYXI7DQorICBGWF9XQ0hBUiBtX3dMaW5lQnJlYWtDaGFyOw0KKyAgaW50MzJfdCBtX2lIb3Jpem9udGFsU2NhbGU7DQorICBpbnQzMl90IG1faVZlcnRpY2FsU2NhbGU7DQorICBpbnQzMl90IG1faUxpbmVSb3RhdGlvbjsNCisgIGludDMyX3QgbV9pQ2hhclJvdGF0aW9uOw0KKyAgaW50MzJfdCBtX2lSb3RhdGlvbjsNCisgIGludDMyX3QgbV9pQ2hhclNwYWNlOw0KKyAgRlhfQk9PTCBtX2JXb3JkU3BhY2U7DQorICBpbnQzMl90IG1faVdvcmRTcGFjZTsNCisgIEZYX0JPT0wgbV9iUlRMOw0KKyAgaW50MzJfdCBtX2lBbGlnbm1lbnQ7DQorICBJRlhfVW5rbm93biogbV9wVXNlckRhdGE7DQorICBGWF9EV09SRCBtX2R3Q2hhclR5cGU7DQorICBGWF9EV09SRCBtX2R3SWRlbnRpdHk7DQorICBDRlhfUlRGTGluZSBtX1JURkxpbmUxOw0KKyAgQ0ZYX1JURkxpbmUgbV9SVEZMaW5lMjsNCisgIENGWF9SVEZMaW5lKiBtX3BDdXJMaW5lOw0KKyAgaW50MzJfdCBtX2lSZWFkeTsNCisgIGludDMyX3QgbV9pVG9sZXJhbmNlOw0KKyAgaW50MzJfdCBHZXRMaW5lUm90YXRpb24oRlhfRFdPUkQgZHdTdHlsZXMpIGNvbnN0Ow0KKyAgdm9pZCBTZXRCcmVha1N0YXR1cygpOw0KKyAgQ0ZYX1JURkNoYXIqIEdldExhc3RDaGFyKGludDMyX3QgaW5kZXgpIGNvbnN0Ow0KKyAgQ0ZYX1JURkxpbmUqIEdldFJURkxpbmUoRlhfQk9PTCBiUmVhZHkpIGNvbnN0Ow0KKyAgQ0ZYX1JURlBpZWNlQXJyYXkqIEdldFJURlBpZWNlcyhGWF9CT09MIGJSZWFkeSkgY29uc3Q7DQorICBGWF9EV09SRCBHZXRVbmlmaWVkQ2hhclR5cGUoRlhfRFdPUkQgZHdUeXBlKSBjb25zdDsNCisgIGludDMyX3QgR2V0TGFzdFBvc2l0aW9uZWRUYWIoKSBjb25zdDsNCisgIEZYX0JPT0wgR2V0UG9zaXRpb25lZFRhYihpbnQzMl90JiBpVGFiUG9zKSBjb25zdDsNCisgIGludDMyX3QgR2V0QnJlYWtQb3MoQ0ZYX1JURkNoYXJBcnJheSYgdGNhLA0KKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpRW5kUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBbGxDaGFycyA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJPbmx5QnJrID0gRkFMU0UpOw0KKyAgdm9pZCBTcGxpdFRleHRMaW5lKENGWF9SVEZMaW5lKiBwQ3VyTGluZSwNCisgICAgICAgICAgICAgICAgICAgICBDRlhfUlRGTGluZSogcE5leHRMaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFsbENoYXJzID0gRkFMU0UpOw0KKyAgRlhfQk9PTCBFbmRCcmVha19TcGxpdExpbmUoQ0ZYX1JURkxpbmUqIHBOZXh0TGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFsbENoYXJzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMpOw0KKyAgdm9pZCBFbmRCcmVha19CaWRpTGluZShDRlhfVFBPQXJyYXkmIHRwb3MsIEZYX0RXT1JEIGR3U3RhdHVzKTsNCisgIHZvaWQgRW5kQnJlYWtfQWxpZ25tZW50KENGWF9UUE9BcnJheSYgdHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFsbENoYXJzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfdGV4dGJyZWFrLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3RleHRicmVhay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTljZTg1OQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3RleHRicmVhay5jcHAKQEAgLTAsMCArMSwxNjYxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlIDxhbGdvcml0aG0+DQorDQorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9hcmIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9mZ2FzL2luY2x1ZGUvZnhfbGJrLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZmdhcy9zcmMvZmdhc19iYXNlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3VuaWNvZGUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfdGV4dGJyZWFrLmgiDQorDQorZXh0ZXJuIGNvbnN0IEZYX0xJTkVCUkVBS1RZUEUgZ3NfRlhfTGluZUJyZWFrX1BhaXJUYWJsZVs2NF1bMzJdOw0KK0lGWF9UeHRCcmVhayogSUZYX1R4dEJyZWFrOjpDcmVhdGUoRlhfRFdPUkQgZHdQb2xpY2llcykgew0KKyAgcmV0dXJuIG5ldyBDRlhfVHh0QnJlYWsoZHdQb2xpY2llcyk7DQorfQ0KK0NGWF9UeHRCcmVhazo6Q0ZYX1R4dEJyZWFrKEZYX0RXT1JEIGR3UG9saWNpZXMpDQorICAgIDogbV9kd1BvbGljaWVzKGR3UG9saWNpZXMpLA0KKyAgICAgIG1fcEFyYWJpY0NoYXIoTlVMTCksDQorICAgICAgbV9pTGluZVdpZHRoKDIwMDAwMDApLA0KKyAgICAgIG1fZHdMYXlvdXRTdHlsZXMoMCksDQorICAgICAgbV9iVmVydGljYWwoRkFMU0UpLA0KKyAgICAgIG1fYkFyYWJpY0NvbnRleHQoRkFMU0UpLA0KKyAgICAgIG1fYkFyYWJpY1NoYXBlcyhGQUxTRSksDQorICAgICAgbV9iUlRMKEZBTFNFKSwNCisgICAgICBtX2JTaW5nbGVMaW5lKEZBTFNFKSwNCisgICAgICBtX2JDb21iVGV4dChGQUxTRSksDQorICAgICAgbV9pQXJhYmljQ29udGV4dCgxKSwNCisgICAgICBtX2lDdXJBcmFiaWNDb250ZXh0KDEpLA0KKyAgICAgIG1fcEZvbnQoTlVMTCksDQorICAgICAgbV9pRm9udFNpemUoMjQwKSwNCisgICAgICBtX2JFcXVpZGlzdGFudChUUlVFKSwNCisgICAgICBtX2lUYWJXaWR0aCg3MjAwMDApLA0KKyAgICAgIG1fd0RlZkNoYXIoMHhGRUZGKSwNCisgICAgICBtX3dQYXJhZ0JyZWFrQ2hhcihMJ1xuJyksDQorICAgICAgbV9pRGVmQ2hhcigwKSwNCisgICAgICBtX2lMaW5lUm90YXRpb24oMCksDQorICAgICAgbV9pQ2hhclJvdGF0aW9uKDApLA0KKyAgICAgIG1faVJvdGF0aW9uKDApLA0KKyAgICAgIG1faUFsaWdubWVudChGWF9UWFRMSU5FQUxJR05NRU5UX0xlZnQpLA0KKyAgICAgIG1fZHdDb250ZXh0Q2hhclN0eWxlcygwKSwNCisgICAgICBtX2lDb21iV2lkdGgoMzYwMDAwKSwNCisgICAgICBtX3BVc2VyRGF0YShOVUxMKSwNCisgICAgICBtX2R3Q2hhclR5cGUoMCksDQorICAgICAgbV9iQXJhYmljTnVtYmVyKEZBTFNFKSwNCisgICAgICBtX2JBcmFiaWNDb21tYShGQUxTRSksDQorICAgICAgbV9wQ3VyTGluZShOVUxMKSwNCisgICAgICBtX2lSZWFkeSgwKSwNCisgICAgICBtX2lUb2xlcmFuY2UoMCksDQorICAgICAgbV9pSG9yU2NhbGUoMTAwKSwNCisgICAgICBtX2lWZXJTY2FsZSgxMDApLA0KKyAgICAgIG1faUNoYXJTcGFjZSgwKSB7DQorICBtX2JQYWdpbmF0aW9uID0gKG1fZHdQb2xpY2llcyAmIEZYX1RYVEJSRUFLUE9MSUNZX1BhZ2luYXRpb24pICE9IDA7DQorICBtX3BBcmFiaWNDaGFyID0gSUZYX0FyYWJpY0NoYXI6OkNyZWF0ZSgpOw0KKyAgaWYgKG1fYlBhZ2luYXRpb24pIHsNCisgICAgbV9wVHh0TGluZTEgPSBuZXcgQ0ZYX1R4dExpbmUoc2l6ZW9mKENGWF9DaGFyKSk7DQorICAgIG1fcFR4dExpbmUyID0gbmV3IENGWF9UeHRMaW5lKHNpemVvZihDRlhfQ2hhcikpOw0KKyAgfSBlbHNlIHsNCisgICAgbV9wVHh0TGluZTEgPSBuZXcgQ0ZYX1R4dExpbmUoc2l6ZW9mKENGWF9UeHRDaGFyKSk7DQorICAgIG1fcFR4dExpbmUyID0gbmV3IENGWF9UeHRMaW5lKHNpemVvZihDRlhfVHh0Q2hhcikpOw0KKyAgfQ0KKyAgbV9wQ3VyTGluZSA9IG1fcFR4dExpbmUxOw0KKyAgUmVzZXRBcmFiaWNDb250ZXh0KCk7DQorfQ0KK0NGWF9UeHRCcmVhazo6fkNGWF9UeHRCcmVhaygpIHsNCisgIFJlc2V0KCk7DQorICBkZWxldGUgbV9wVHh0TGluZTE7DQorICBkZWxldGUgbV9wVHh0TGluZTI7DQorICBtX3BBcmFiaWNDaGFyLT5SZWxlYXNlKCk7DQorfQ0KK3ZvaWQgQ0ZYX1R4dEJyZWFrOjpTZXRMaW5lV2lkdGgoRlhfRkxPQVQgZkxpbmVXaWR0aCkgew0KKyAgbV9pTGluZVdpZHRoID0gRlhTWVNfcm91bmQoZkxpbmVXaWR0aCAqIDIwMDAwLjBmKTsNCisgIEZYU1lTX2Fzc2VydChtX2lMaW5lV2lkdGggPj0gMjAwMDApOw0KK30NCit2b2lkIENGWF9UeHRCcmVhazo6U2V0TGluZVBvcyhGWF9GTE9BVCBmTGluZVBvcykgew0KKyAgaW50MzJfdCBpTGluZVBvcyA9IEZYU1lTX3JvdW5kKGZMaW5lUG9zICogMjAwMDAuMGYpOw0KKyAgaWYgKGlMaW5lUG9zIDwgMCkgew0KKyAgICBpTGluZVBvcyA9IDA7DQorICB9DQorICBpZiAoaUxpbmVQb3MgPiBtX2lMaW5lV2lkdGgpIHsNCisgICAgaUxpbmVQb3MgPSBtX2lMaW5lV2lkdGg7DQorICB9DQorICBtX3BDdXJMaW5lLT5tX2lTdGFydCA9IGlMaW5lUG9zOw0KKyAgbV9wQ3VyTGluZS0+bV9pV2lkdGggKz0gaUxpbmVQb3M7DQorfQ0KK3ZvaWQgQ0ZYX1R4dEJyZWFrOjpTZXRMYXlvdXRTdHlsZXMoRlhfRFdPUkQgZHdMYXlvdXRTdHlsZXMpIHsNCisgIG1fZHdMYXlvdXRTdHlsZXMgPSBkd0xheW91dFN0eWxlczsNCisgIG1fYlZlcnRpY2FsID0gKG1fZHdMYXlvdXRTdHlsZXMgJiBGWF9UWFRMQVlPVVRTVFlMRV9WZXJ0aWNhbENoYXJzKSAhPSAwOw0KKyAgbV9iQXJhYmljQ29udGV4dCA9IChtX2R3TGF5b3V0U3R5bGVzICYgRlhfVFhUTEFZT1VUU1RZTEVfQXJhYmljQ29udGV4dCkgIT0gMDsNCisgIG1fYkFyYWJpY1NoYXBlcyA9IChtX2R3TGF5b3V0U3R5bGVzICYgRlhfVFhUTEFZT1VUU1RZTEVfQXJhYmljU2hhcGVzKSAhPSAwOw0KKyAgbV9iUlRMID0gKG1fZHdMYXlvdXRTdHlsZXMgJiBGWF9UWFRMQVlPVVRTVFlMRV9SVExSZWFkaW5nT3JkZXIpICE9IDA7DQorICBtX2JTaW5nbGVMaW5lID0gKG1fZHdMYXlvdXRTdHlsZXMgJiBGWF9UWFRMQVlPVVRTVFlMRV9TaW5nbGVMaW5lKSAhPSAwOw0KKyAgbV9iQ29tYlRleHQgPSAobV9kd0xheW91dFN0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX0NvbWJUZXh0KSAhPSAwOw0KKyAgUmVzZXRBcmFiaWNDb250ZXh0KCk7DQorICBtX2lMaW5lUm90YXRpb24gPSBHZXRMaW5lUm90YXRpb24obV9kd0xheW91dFN0eWxlcyk7DQorICBtX2lSb3RhdGlvbiA9IG1faUxpbmVSb3RhdGlvbiArIG1faUNoYXJSb3RhdGlvbjsNCisgIG1faVJvdGF0aW9uICU9IDQ7DQorfQ0KK3ZvaWQgQ0ZYX1R4dEJyZWFrOjpTZXRGb250KElGWF9Gb250KiBwRm9udCkgew0KKyAgaWYgKHBGb250ID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1fcEZvbnQgPT0gcEZvbnQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgU2V0QnJlYWtTdGF0dXMoKTsNCisgIG1fcEZvbnQgPSBwRm9udDsNCisgIG1faURlZkNoYXIgPSAwOw0KKyAgaWYgKG1fd0RlZkNoYXIgIT0gMHhGRUZGICYmIG1fcEZvbnQgIT0gTlVMTCkgew0KKyAgICBtX3BGb250LT5HZXRDaGFyV2lkdGgobV93RGVmQ2hhciwgbV9pRGVmQ2hhciwgRkFMU0UpOw0KKyAgICBtX2lEZWZDaGFyICo9IG1faUZvbnRTaXplOw0KKyAgfQ0KK30NCit2b2lkIENGWF9UeHRCcmVhazo6U2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSB7DQorICBpbnQzMl90IGlGb250U2l6ZSA9IEZYU1lTX3JvdW5kKGZGb250U2l6ZSAqIDIwLjBmKTsNCisgIGlmIChtX2lGb250U2l6ZSA9PSBpRm9udFNpemUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgU2V0QnJlYWtTdGF0dXMoKTsNCisgIG1faUZvbnRTaXplID0gaUZvbnRTaXplOw0KKyAgbV9pRGVmQ2hhciA9IDA7DQorICBpZiAobV93RGVmQ2hhciAhPSAweEZFRkYgJiYgbV9wRm9udCAhPSBOVUxMKSB7DQorICAgIG1fcEZvbnQtPkdldENoYXJXaWR0aChtX3dEZWZDaGFyLCBtX2lEZWZDaGFyLCBGQUxTRSk7DQorICAgIG1faURlZkNoYXIgKj0gbV9pRm9udFNpemU7DQorICB9DQorfQ0KK3ZvaWQgQ0ZYX1R4dEJyZWFrOjpTZXRUYWJXaWR0aChGWF9GTE9BVCBmVGFiV2lkdGgsIEZYX0JPT0wgYkVxdWlkaXN0YW50KSB7DQorICBtX2lUYWJXaWR0aCA9IEZYU1lTX3JvdW5kKGZUYWJXaWR0aCAqIDIwMDAwLjBmKTsNCisgIGlmIChtX2lUYWJXaWR0aCA8IEZYX1RYVEJSRUFLX01pbmltdW1UYWJXaWR0aCkgew0KKyAgICBtX2lUYWJXaWR0aCA9IEZYX1RYVEJSRUFLX01pbmltdW1UYWJXaWR0aDsNCisgIH0NCisgIG1fYkVxdWlkaXN0YW50ID0gYkVxdWlkaXN0YW50Ow0KK30NCit2b2lkIENGWF9UeHRCcmVhazo6U2V0RGVmYXVsdENoYXIoRlhfV0NIQVIgd2NoKSB7DQorICBtX3dEZWZDaGFyID0gd2NoOw0KKyAgbV9pRGVmQ2hhciA9IDA7DQorICBpZiAobV93RGVmQ2hhciAhPSAweEZFRkYgJiYgbV9wRm9udCAhPSBOVUxMKSB7DQorICAgIG1fcEZvbnQtPkdldENoYXJXaWR0aChtX3dEZWZDaGFyLCBtX2lEZWZDaGFyLCBGQUxTRSk7DQorICAgIGlmIChtX2lEZWZDaGFyIDwgMCkgew0KKyAgICAgIG1faURlZkNoYXIgPSAwOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG1faURlZkNoYXIgKj0gbV9pRm9udFNpemU7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDRlhfVHh0QnJlYWs6OlNldFBhcmFncmFwaEJyZWFrQ2hhcihGWF9XQ0hBUiB3Y2gpIHsNCisgIGlmICh3Y2ggIT0gTCdccicgJiYgd2NoICE9IEwnXG4nKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIG1fd1BhcmFnQnJlYWtDaGFyID0gd2NoOw0KK30NCit2b2lkIENGWF9UeHRCcmVhazo6U2V0TGluZUJyZWFrVG9sZXJhbmNlKEZYX0ZMT0FUIGZUb2xlcmFuY2UpIHsNCisgIG1faVRvbGVyYW5jZSA9IEZYU1lTX3JvdW5kKGZUb2xlcmFuY2UgKiAyMDAwMC4wZik7DQorfQ0KK3ZvaWQgQ0ZYX1R4dEJyZWFrOjpTZXRDaGFyUm90YXRpb24oaW50MzJfdCBpQ2hhclJvdGF0aW9uKSB7DQorICBpZiAoaUNoYXJSb3RhdGlvbiA8IDApIHsNCisgICAgaUNoYXJSb3RhdGlvbiArPSAoLWlDaGFyUm90YXRpb24gLyA0ICsgMSkgKiA0Ow0KKyAgfSBlbHNlIGlmIChpQ2hhclJvdGF0aW9uID4gMykgew0KKyAgICBpQ2hhclJvdGF0aW9uIC09IChpQ2hhclJvdGF0aW9uIC8gNCkgKiA0Ow0KKyAgfQ0KKyAgaWYgKG1faUNoYXJSb3RhdGlvbiA9PSBpQ2hhclJvdGF0aW9uKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIFNldEJyZWFrU3RhdHVzKCk7DQorICBtX2lDaGFyUm90YXRpb24gPSBpQ2hhclJvdGF0aW9uOw0KKyAgbV9pUm90YXRpb24gPSBtX2lMaW5lUm90YXRpb24gKyBtX2lDaGFyUm90YXRpb247DQorICBtX2lSb3RhdGlvbiAlPSA0Ow0KK30NCit2b2lkIENGWF9UeHRCcmVhazo6U2V0QWxpZ25tZW50KGludDMyX3QgaUFsaWdubWVudCkgew0KKyAgRlhTWVNfYXNzZXJ0KGlBbGlnbm1lbnQgPj0gRlhfVFhUTElORUFMSUdOTUVOVF9MZWZ0ICYmDQorICAgICAgICAgICAgICAgaUFsaWdubWVudCA8PSBGWF9UWFRMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkKTsNCisgIG1faUFsaWdubWVudCA9IGlBbGlnbm1lbnQ7DQorICBSZXNldEFyYWJpY0NvbnRleHQoKTsNCit9DQordm9pZCBDRlhfVHh0QnJlYWs6OlJlc2V0Q29udGV4dENoYXJTdHlsZXMoKSB7DQorICBtX2R3Q29udGV4dENoYXJTdHlsZXMgPSBtX2JBcmFiaWNDb250ZXh0ID8gbV9pQ3VyQWxpZ25tZW50IDogbV9pQWxpZ25tZW50Ow0KKyAgaWYgKG1fYkFyYWJpY051bWJlcikgew0KKyAgICBtX2R3Q29udGV4dENoYXJTdHlsZXMgfD0gRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY051bWJlcjsNCisgIH0NCisgIGlmIChtX2JBcmFiaWNDb21tYSkgew0KKyAgICBtX2R3Q29udGV4dENoYXJTdHlsZXMgfD0gRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY0NvbW1hOw0KKyAgfQ0KKyAgaWYgKChtX2JBcmFiaWNDb250ZXh0ICYmIG1fYkN1clJUTCkgfHwgKCFtX2JBcmFiaWNDb250ZXh0ICYmIG1fYlJUTCkpIHsNCisgICAgbV9kd0NvbnRleHRDaGFyU3R5bGVzIHw9IEZYX1RYVENIQVJTVFlMRV9SVExSZWFkaW5nT3JkZXI7DQorICB9DQorICBtX2R3Q29udGV4dENoYXJTdHlsZXMgfD0gKG1faUFyYWJpY0NvbnRleHQgPDwgOCk7DQorfQ0KK0ZYX0RXT1JEIENGWF9UeHRCcmVhazo6R2V0Q29udGV4dENoYXJTdHlsZXMoKSBjb25zdCB7DQorICByZXR1cm4gbV9kd0NvbnRleHRDaGFyU3R5bGVzOw0KK30NCit2b2lkIENGWF9UeHRCcmVhazo6U2V0Q29udGV4dENoYXJTdHlsZXMoRlhfRFdPUkQgZHdDaGFyU3R5bGVzKSB7DQorICBtX2lDdXJBbGlnbm1lbnQgPSBkd0NoYXJTdHlsZXMgJiAweDBGOw0KKyAgbV9iQXJhYmljTnVtYmVyID0gKGR3Q2hhclN0eWxlcyAmIEZYX1RYVENIQVJTVFlMRV9BcmFiaWNOdW1iZXIpICE9IDA7DQorICBtX2JBcmFiaWNDb21tYSA9IChkd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfQXJhYmljQ29tbWEpICE9IDA7DQorICBtX2JDdXJSVEwgPSAoZHdDaGFyU3R5bGVzICYgRlhfVFhUQ0hBUlNUWUxFX1JUTFJlYWRpbmdPcmRlcikgIT0gMDsNCisgIG1faUN1ckFyYWJpY0NvbnRleHQgPSBtX2lBcmFiaWNDb250ZXh0ID0gKChkd0NoYXJTdHlsZXMgJiAweDAzMDApID4+IDgpOw0KKyAgUmVzZXRDb250ZXh0Q2hhclN0eWxlcygpOw0KK30NCit2b2lkIENGWF9UeHRCcmVhazo6U2V0Q29tYldpZHRoKEZYX0ZMT0FUIGZDb21iV2lkdGgpIHsNCisgIG1faUNvbWJXaWR0aCA9IEZYU1lTX3JvdW5kKGZDb21iV2lkdGggKiAyMDAwMC4wZik7DQorfQ0KK3ZvaWQgQ0ZYX1R4dEJyZWFrOjpTZXRVc2VyRGF0YSh2b2lkKiBwVXNlckRhdGEpIHsNCisgIGlmIChtX3BVc2VyRGF0YSA9PSBwVXNlckRhdGEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgU2V0QnJlYWtTdGF0dXMoKTsNCisgIG1fcFVzZXJEYXRhID0gcFVzZXJEYXRhOw0KK30NCit2b2lkIENGWF9UeHRCcmVhazo6U2V0QnJlYWtTdGF0dXMoKSB7DQorICBpZiAobV9iUGFnaW5hdGlvbikgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlDb3VudCA9IG1fcEN1ckxpbmUtPkNvdW50Q2hhcnMoKTsNCisgIGlmIChpQ291bnQgPCAxKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9UeHRDaGFyKiBwVEMgPSAoQ0ZYX1R4dENoYXIqKW1fcEN1ckxpbmUtPkdldENoYXJQdHIoaUNvdW50IC0gMSk7DQorICBpZiAocFRDLT5tX2R3U3RhdHVzID09IDApIHsNCisgICAgcFRDLT5tX2R3U3RhdHVzID0gRlhfVFhUQlJFQUtfUGllY2VCcmVhazsNCisgIH0NCit9DQordm9pZCBDRlhfVHh0QnJlYWs6OlNldEhvcml6b250YWxTY2FsZShpbnQzMl90IGlTY2FsZSkgew0KKyAgaWYgKGlTY2FsZSA8IDApIHsNCisgICAgaVNjYWxlID0gMDsNCisgIH0NCisgIGlmIChpU2NhbGUgPT0gbV9pSG9yU2NhbGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgU2V0QnJlYWtTdGF0dXMoKTsNCisgIG1faUhvclNjYWxlID0gaVNjYWxlOw0KK30NCit2b2lkIENGWF9UeHRCcmVhazo6U2V0VmVydGljYWxTY2FsZShpbnQzMl90IGlTY2FsZSkgew0KKyAgaWYgKGlTY2FsZSA8IDApIHsNCisgICAgaVNjYWxlID0gMDsNCisgIH0NCisgIGlmIChpU2NhbGUgPT0gbV9pSG9yU2NhbGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgU2V0QnJlYWtTdGF0dXMoKTsNCisgIG1faVZlclNjYWxlID0gaVNjYWxlOw0KK30NCit2b2lkIENGWF9UeHRCcmVhazo6U2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpIHsNCisgIG1faUNoYXJTcGFjZSA9IEZYU1lTX3JvdW5kKGZDaGFyU3BhY2UgKiAyMDAwMC4wZik7DQorfQ0KK3N0YXRpYyBjb25zdCBpbnQzMl90IGdzX0ZYX1R4dExpbmVSb3RhdGlvbnNbOF0gPSB7MCwgMywgMSwgMCwgMiwgMSwgMywgMn07DQoraW50MzJfdCBDRlhfVHh0QnJlYWs6OkdldExpbmVSb3RhdGlvbihGWF9EV09SRCBkd1N0eWxlcykgY29uc3Qgew0KKyAgcmV0dXJuIGdzX0ZYX1R4dExpbmVSb3RhdGlvbnNbKGR3U3R5bGVzICYgMHgwRSkgPj4gMV07DQorfQ0KK0NGWF9UeHRDaGFyKiBDRlhfVHh0QnJlYWs6OkdldExhc3RDaGFyKGludDMyX3QgaW5kZXgsIEZYX0JPT0wgYk9taXRDaGFyKSBjb25zdCB7DQorICBDRlhfVHh0Q2hhckFycmF5JiBjYSA9ICptX3BDdXJMaW5lLT5tX3BMaW5lQ2hhcnM7DQorICBpbnQzMl90IGlDb3VudCA9IGNhLkdldFNpemUoKTsNCisgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gaUNvdW50KSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0ZYX1R4dENoYXIqIHBUQzsNCisgIGludDMyX3QgaVN0YXJ0ID0gaUNvdW50IC0gMTsNCisgIHdoaWxlIChpU3RhcnQgPiAtMSkgew0KKyAgICBwVEMgPSBjYS5HZXREYXRhUHRyKGlTdGFydC0tKTsNCisgICAgaWYgKGJPbWl0Q2hhciAmJiBwVEMtPkdldENoYXJUeXBlKCkgPT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAoLS1pbmRleCA8IDApIHsNCisgICAgICByZXR1cm4gcFRDOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorQ0ZYX1R4dExpbmUqIENGWF9UeHRCcmVhazo6R2V0VHh0TGluZShGWF9CT09MIGJSZWFkeSkgY29uc3Qgew0KKyAgaWYgKCFiUmVhZHkpIHsNCisgICAgcmV0dXJuIG1fcEN1ckxpbmU7DQorICB9DQorICBpZiAobV9pUmVhZHkgPT0gMSkgew0KKyAgICByZXR1cm4gbV9wVHh0TGluZTE7DQorICB9IGVsc2UgaWYgKG1faVJlYWR5ID09IDIpIHsNCisgICAgcmV0dXJuIG1fcFR4dExpbmUyOw0KKyAgfSBlbHNlIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorfQ0KK0NGWF9UeHRQaWVjZUFycmF5KiBDRlhfVHh0QnJlYWs6OkdldFR4dFBpZWNlcyhGWF9CT09MIGJSZWFkeSkgY29uc3Qgew0KKyAgQ0ZYX1R4dExpbmUqIHBUeHRMaW5lID0gR2V0VHh0TGluZShiUmVhZHkpOw0KKyAgaWYgKHBUeHRMaW5lID09IE5VTEwpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gcFR4dExpbmUtPm1fcExpbmVQaWVjZXM7DQorfQ0KK2lubGluZSBGWF9EV09SRCBDRlhfVHh0QnJlYWs6OkdldFVuaWZpZWRDaGFyVHlwZShGWF9EV09SRCBkd1R5cGUpIGNvbnN0IHsNCisgIHJldHVybiBkd1R5cGUgPj0gRlhfQ0hBUlRZUEVfQXJhYmljQWxlZiA/IEZYX0NIQVJUWVBFX0FyYWJpYyA6IGR3VHlwZTsNCit9DQordm9pZCBDRlhfVHh0QnJlYWs6OlJlc2V0QXJhYmljQ29udGV4dCgpIHsNCisgIGlmIChtX2JBcmFiaWNDb250ZXh0KSB7DQorICAgIG1fYkN1clJUTCA9IG1faUN1ckFyYWJpY0NvbnRleHQgPiAxOw0KKyAgICBtX2lDdXJBbGlnbm1lbnQgPSBtX2lDdXJBcmFiaWNDb250ZXh0ID4gMSA/IEZYX1RYVExJTkVBTElHTk1FTlRfUmlnaHQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGWF9UWFRMSU5FQUxJR05NRU5UX0xlZnQ7DQorICAgIG1faUN1ckFsaWdubWVudCB8PSAobV9pQWxpZ25tZW50ICYgRlhfVFhUTElORUFMSUdOTUVOVF9IaWdoZXJNYXNrKTsNCisgICAgbV9iQXJhYmljTnVtYmVyID0gbV9pQXJhYmljQ29udGV4dCA+PSAxICYmIG1fYkFyYWJpY1NoYXBlczsNCisgIH0gZWxzZSB7DQorICAgIGlmIChtX2JQYWdpbmF0aW9uKSB7DQorICAgICAgbV9iQ3VyUlRMID0gRkFMU0U7DQorICAgICAgbV9pQ3VyQWxpZ25tZW50ID0gMDsNCisgICAgfSBlbHNlIHsNCisgICAgICBtX2JDdXJSVEwgPSBtX2JSVEw7DQorICAgICAgbV9pQ3VyQWxpZ25tZW50ID0gbV9pQWxpZ25tZW50Ow0KKyAgICB9DQorICAgIGlmIChtX2JSVEwpIHsNCisgICAgICBtX2JBcmFiaWNOdW1iZXIgPSBtX2lBcmFiaWNDb250ZXh0ID49IDE7DQorICAgIH0gZWxzZSB7DQorICAgICAgbV9iQXJhYmljTnVtYmVyID0gbV9pQXJhYmljQ29udGV4dCA+IDE7DQorICAgIH0NCisgICAgbV9iQXJhYmljTnVtYmVyID0gbV9iQXJhYmljTnVtYmVyICYmIG1fYkFyYWJpY1NoYXBlczsNCisgIH0NCisgIG1fYkFyYWJpY0NvbW1hID0gbV9iQXJhYmljTnVtYmVyOw0KKyAgUmVzZXRDb250ZXh0Q2hhclN0eWxlcygpOw0KK30NCit2b2lkIENGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9QYWdlTG9hZChDRlhfQ2hhciogcEN1ckNoYXIsIEZYX0RXT1JEIGR3UHJvcHMpIHsNCisgIGlmICghbV9iUGFnaW5hdGlvbikgew0KKyAgICAoKENGWF9UeHRDaGFyKilwQ3VyQ2hhciktPm1fZHdTdGF0dXMgPSAwOw0KKyAgICAoKENGWF9UeHRDaGFyKilwQ3VyQ2hhciktPm1fcFVzZXJEYXRhID0gbV9wVXNlckRhdGE7DQorICB9DQorICBpZiAobV9iQXJhYmljQ29udGV4dCB8fCBtX2JBcmFiaWNTaGFwZXMpIHsNCisgICAgaW50MzJfdCBpQmlkaUNscyA9IChkd1Byb3BzICYgRlhfQklESUNMQVNTQklUU01BU0spID4+IEZYX0JJRElDTEFTU0JJVFM7DQorICAgIGludDMyX3QgaUFyYWJpY0NvbnRleHQgPQ0KKyAgICAgICAgKGlCaWRpQ2xzID09IEZYX0JJRElDTEFTU19SIHx8IGlCaWRpQ2xzID09IEZYX0JJRElDTEFTU19BTCkNCisgICAgICAgICAgICA/IDINCisgICAgICAgICAgICA6ICgoaUJpZGlDbHMgPT0gRlhfQklESUNMQVNTX0wgfHwgaUJpZGlDbHMgPT0gRlhfQklESUNMQVNTX1MpID8gMA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAxKTsNCisgICAgaWYgKGlBcmFiaWNDb250ZXh0ICE9IG1faUFyYWJpY0NvbnRleHQgJiYgaUFyYWJpY0NvbnRleHQgIT0gMSkgew0KKyAgICAgIG1faUFyYWJpY0NvbnRleHQgPSBpQXJhYmljQ29udGV4dDsNCisgICAgICBpZiAobV9pQ3VyQXJhYmljQ29udGV4dCA9PSAxKSB7DQorICAgICAgICBtX2lDdXJBcmFiaWNDb250ZXh0ID0gaUFyYWJpY0NvbnRleHQ7DQorICAgICAgfQ0KKyAgICAgIFJlc2V0QXJhYmljQ29udGV4dCgpOw0KKyAgICAgIGlmICghbV9iUGFnaW5hdGlvbikgew0KKyAgICAgICAgQ0ZYX1R4dENoYXIqIHBMYXN0Q2hhciA9IChDRlhfVHh0Q2hhciopR2V0TGFzdENoYXIoMSwgRkFMU0UpOw0KKyAgICAgICAgaWYgKHBMYXN0Q2hhciAhPSBOVUxMICYmIHBMYXN0Q2hhci0+bV9kd1N0YXR1cyA8IDEpIHsNCisgICAgICAgICAgcExhc3RDaGFyLT5tX2R3U3RhdHVzID0gRlhfVFhUQlJFQUtfUGllY2VCcmVhazsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHBDdXJDaGFyLT5tX2R3Q2hhclN0eWxlcyA9IG1fZHdDb250ZXh0Q2hhclN0eWxlczsNCit9DQorRlhfRFdPUkQgQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX0NvbWJpbmF0aW9uKENGWF9DaGFyKiBwQ3VyQ2hhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRpb24pIHsNCisgIEZYU1lTX2Fzc2VydChwQ3VyQ2hhciAhPSBOVUxMKTsNCisgIEZYX1dDSEFSIHdjaCA9IHBDdXJDaGFyLT5tX3dDaGFyQ29kZTsNCisgIEZYX1dDSEFSIHdGb3JtOw0KKyAgaW50MzJfdCBpQ2hhcldpZHRoID0gMDsNCisgIENGWF9DaGFyKiBwTGFzdENoYXI7DQorICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gLTE7DQorICBpZiAobV9iQ29tYlRleHQpIHsNCisgICAgaUNoYXJXaWR0aCA9IG1faUNvbWJXaWR0aDsNCisgIH0gZWxzZSB7DQorICAgIGlmIChtX2JWZXJ0aWNhbCAhPSBGWF9Jc09kZChpUm90YXRpb24pKSB7DQorICAgICAgaUNoYXJXaWR0aCA9IDEwMDA7DQorICAgIH0gZWxzZSB7DQorICAgICAgd0Zvcm0gPSB3Y2g7DQorICAgICAgaWYgKCFtX2JQYWdpbmF0aW9uKSB7DQorICAgICAgICBwTGFzdENoYXIgPSBHZXRMYXN0Q2hhcigwLCBGQUxTRSk7DQorICAgICAgICBpZiAocExhc3RDaGFyICE9IE5VTEwgJiYNCisgICAgICAgICAgICAoKChDRlhfVHh0Q2hhciopcExhc3RDaGFyKS0+bV9kd0NoYXJTdHlsZXMgJg0KKyAgICAgICAgICAgICBGWF9UWFRDSEFSU1RZTEVfQXJhYmljU2hhZGRhKSA9PSAwKSB7DQorICAgICAgICAgIEZYX0JPT0wgYlNoYWRkYSA9IEZBTFNFOw0KKyAgICAgICAgICBpZiAod2NoID09IDB4MDY1MSkgew0KKyAgICAgICAgICAgIEZYX1dDSEFSIHdMYXN0ID0gcExhc3RDaGFyLT5tX3dDaGFyQ29kZTsNCisgICAgICAgICAgICBpZiAod0xhc3QgPj0gMHgwNjRDICYmIHdMYXN0IDw9IDB4MDY1MCkgew0KKyAgICAgICAgICAgICAgd0Zvcm0gPSBGWF9HZXRBcmFiaWNGcm9tU2hhZGRhVGFibGUod0xhc3QpOw0KKyAgICAgICAgICAgICAgYlNoYWRkYSA9IFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2UgaWYgKHdjaCA+PSAweDA2NEMgJiYgd2NoIDw9IDB4MDY1MCkgew0KKyAgICAgICAgICAgIGlmIChwTGFzdENoYXItPm1fd0NoYXJDb2RlID09IDB4MDY1MSkgew0KKyAgICAgICAgICAgICAgd0Zvcm0gPSBGWF9HZXRBcmFiaWNGcm9tU2hhZGRhVGFibGUod2NoKTsNCisgICAgICAgICAgICAgIGJTaGFkZGEgPSBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoYlNoYWRkYSkgew0KKyAgICAgICAgICAgICgoQ0ZYX1R4dENoYXIqKXBMYXN0Q2hhciktPm1fZHdDaGFyU3R5bGVzIHw9DQorICAgICAgICAgICAgICAgIEZYX1RYVENIQVJTVFlMRV9BcmFiaWNTaGFkZGE7DQorICAgICAgICAgICAgKChDRlhfVHh0Q2hhciopcExhc3RDaGFyKS0+bV9pQ2hhcldpZHRoID0gMDsNCisgICAgICAgICAgICAoKENGWF9UeHRDaGFyKilwQ3VyQ2hhciktPm1fZHdDaGFyU3R5bGVzIHw9DQorICAgICAgICAgICAgICAgIEZYX1RYVENIQVJTVFlMRV9BcmFiaWNTaGFkZGE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgaWYgKCFtX3BGb250LT5HZXRDaGFyV2lkdGgod0Zvcm0sIGlDaGFyV2lkdGgsIEZBTFNFKSkgew0KKyAgICAgICAgaUNoYXJXaWR0aCA9IDA7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlDaGFyV2lkdGggKj0gbV9pRm9udFNpemU7DQorICAgIGlDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogbV9pSG9yU2NhbGUgLyAxMDA7DQorICB9DQorICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gLWlDaGFyV2lkdGg7DQorICByZXR1cm4gRlhfVFhUQlJFQUtfTm9uZTsNCit9DQorRlhfRFdPUkQgQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX1RhYihDRlhfQ2hhciogcEN1ckNoYXIsIGludDMyX3QgaVJvdGF0aW9uKSB7DQorICBtX2R3Q2hhclR5cGUgPSBGWF9DSEFSVFlQRV9UYWI7DQorICBpZiAoKG1fZHdMYXlvdXRTdHlsZXMgJiBGWF9UWFRMQVlPVVRTVFlMRV9FeHBhbmRUYWIpID09IDApIHsNCisgICAgcmV0dXJuIEZYX1RYVEJSRUFLX05vbmU7DQorICB9DQorICBpbnQzMl90JiBpTGluZVdpZHRoID0gbV9wQ3VyTGluZS0+bV9pV2lkdGg7DQorICBpbnQzMl90IGlDaGFyV2lkdGg7DQorICBpZiAobV9iQ29tYlRleHQpIHsNCisgICAgaUNoYXJXaWR0aCA9IG1faUNvbWJXaWR0aDsNCisgIH0gZWxzZSB7DQorICAgIGlmIChtX2JFcXVpZGlzdGFudCkgew0KKyAgICAgIGlDaGFyV2lkdGggPSBpTGluZVdpZHRoOw0KKyAgICAgIGlDaGFyV2lkdGggPSBtX2lUYWJXaWR0aCAqIChpQ2hhcldpZHRoIC8gbV9pVGFiV2lkdGggKyAxKSAtIGlDaGFyV2lkdGg7DQorICAgICAgaWYgKGlDaGFyV2lkdGggPCBGWF9UWFRCUkVBS19NaW5pbXVtVGFiV2lkdGgpIHsNCisgICAgICAgIGlDaGFyV2lkdGggKz0gbV9pVGFiV2lkdGg7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlDaGFyV2lkdGggPSBtX2lUYWJXaWR0aDsNCisgICAgfQ0KKyAgfQ0KKyAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IGlDaGFyV2lkdGg7DQorICBpTGluZVdpZHRoICs9IGlDaGFyV2lkdGg7DQorICBpZiAoIW1fYlNpbmdsZUxpbmUgJiYgaUxpbmVXaWR0aCA+PSBtX2lMaW5lV2lkdGggKyBtX2lUb2xlcmFuY2UpIHsNCisgICAgcmV0dXJuIEVuZEJyZWFrKEZYX1RYVEJSRUFLX0xpbmVCcmVhayk7DQorICB9DQorICByZXR1cm4gRlhfVFhUQlJFQUtfTm9uZTsNCit9DQorRlhfRFdPUkQgQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX0NvbnRyb2woQ0ZYX0NoYXIqIHBDdXJDaGFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0aW9uKSB7DQorICBtX2R3Q2hhclR5cGUgPSBGWF9DSEFSVFlQRV9Db250cm9sOw0KKyAgRlhfRFdPUkQgZHdSZXQgPSBGWF9UWFRCUkVBS19Ob25lOw0KKyAgaWYgKCFtX2JTaW5nbGVMaW5lKSB7DQorICAgIEZYX1dDSEFSIHdjaCA9IHBDdXJDaGFyLT5tX3dDaGFyQ29kZTsNCisgICAgc3dpdGNoICh3Y2gpIHsNCisgICAgICBjYXNlIEwnXHYnOg0KKyAgICAgIGNhc2UgMHgyMDI4Og0KKyAgICAgICAgZHdSZXQgPSBGWF9UWFRCUkVBS19MaW5lQnJlYWs7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEwnXGYnOg0KKyAgICAgICAgZHdSZXQgPSBGWF9UWFRCUkVBS19QYWdlQnJlYWs7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIDB4MjAyOToNCisgICAgICAgIGR3UmV0ID0gRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWs7DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgaWYgKHdjaCA9PSBtX3dQYXJhZ0JyZWFrQ2hhcikgew0KKyAgICAgICAgICBkd1JldCA9IEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKGR3UmV0ICE9IEZYX1RYVEJSRUFLX05vbmUpIHsNCisgICAgICBkd1JldCA9IEVuZEJyZWFrKGR3UmV0KTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGR3UmV0Ow0KK30NCitGWF9EV09SRCBDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfQXJhYmljKENGWF9DaGFyKiBwQ3VyQ2hhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0aW9uKSB7DQorICBGWF9EV09SRCBkd1R5cGUgPSAocEN1ckNoYXItPm1fZHdDaGFyUHJvcHMgJiBGWF9DSEFSVFlQRUJJVFNNQVNLKTsNCisgIGludDMyX3QmIGlMaW5lV2lkdGggPSBtX3BDdXJMaW5lLT5tX2lXaWR0aDsNCisgIEZYX1dDSEFSIHdGb3JtOw0KKyAgaW50MzJfdCBpQ2hhcldpZHRoID0gMDsNCisgIENGWF9DaGFyKiBwTGFzdENoYXIgPSBOVUxMOw0KKyAgRlhfQk9PTCBiQWxlZiA9IEZBTFNFOw0KKyAgaWYgKCFtX2JDb21iVGV4dCAmJiBtX2R3Q2hhclR5cGUgPj0gRlhfQ0hBUlRZUEVfQXJhYmljQWxlZiAmJg0KKyAgICAgIG1fZHdDaGFyVHlwZSA8PSBGWF9DSEFSVFlQRV9BcmFiaWNEaXN0b3J0aW9uKSB7DQorICAgIHBMYXN0Q2hhciA9IEdldExhc3RDaGFyKDEpOw0KKyAgICBpZiAocExhc3RDaGFyICE9IE5VTEwpIHsNCisgICAgICBpQ2hhcldpZHRoID0gcExhc3RDaGFyLT5tX2lDaGFyV2lkdGg7DQorICAgICAgaWYgKGlDaGFyV2lkdGggPiAwKSB7DQorICAgICAgICBpTGluZVdpZHRoIC09IGlDaGFyV2lkdGg7DQorICAgICAgfQ0KKyAgICAgIENGWF9DaGFyKiBwUHJldkNoYXIgPSBHZXRMYXN0Q2hhcigyKTsNCisgICAgICB3Rm9ybSA9IG1fcEFyYWJpY0NoYXItPkdldEZvcm1DaGFyKHBMYXN0Q2hhciwgcFByZXZDaGFyLCBwQ3VyQ2hhcik7DQorICAgICAgYkFsZWYgPSAod0Zvcm0gPT0gMHhGRUZGICYmDQorICAgICAgICAgICAgICAgcExhc3RDaGFyLT5HZXRDaGFyVHlwZSgpID09IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYpOw0KKyAgICAgIGludDMyX3QgaUxhc3RSb3RhdGlvbiA9IHBMYXN0Q2hhci0+bV9uUm90YXRpb24gKyBtX2lMaW5lUm90YXRpb247DQorICAgICAgaWYgKG1fYlZlcnRpY2FsICYmIChwTGFzdENoYXItPm1fZHdDaGFyUHJvcHMgJiAweDgwMDApICE9IDApIHsNCisgICAgICAgIGlMYXN0Um90YXRpb24rKzsNCisgICAgICB9DQorICAgICAgaWYgKG1fYlZlcnRpY2FsICE9IEZYX0lzT2RkKGlMYXN0Um90YXRpb24pKSB7DQorICAgICAgICBpQ2hhcldpZHRoID0gMTAwMDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wRm9udC0+R2V0Q2hhcldpZHRoKHdGb3JtLCBpQ2hhcldpZHRoLCBGQUxTRSk7DQorICAgICAgfQ0KKyAgICAgIGlmICh3Rm9ybSA9PSAweEZFRkYpIHsNCisgICAgICAgIGlDaGFyV2lkdGggPSBtX2lEZWZDaGFyOw0KKyAgICAgIH0NCisgICAgICBpQ2hhcldpZHRoICo9IG1faUZvbnRTaXplOw0KKyAgICAgIGlDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogbV9pSG9yU2NhbGUgLyAxMDA7DQorICAgICAgcExhc3RDaGFyLT5tX2lDaGFyV2lkdGggPSBpQ2hhcldpZHRoOw0KKyAgICAgIGlMaW5lV2lkdGggKz0gaUNoYXJXaWR0aDsNCisgICAgICBpQ2hhcldpZHRoID0gMDsNCisgICAgfQ0KKyAgfQ0KKyAgbV9kd0NoYXJUeXBlID0gZHdUeXBlOw0KKyAgd0Zvcm0gPSBtX3BBcmFiaWNDaGFyLT5HZXRGb3JtQ2hhcihwQ3VyQ2hhciwgYkFsZWYgPyBOVUxMIDogcExhc3RDaGFyLCBOVUxMKTsNCisgIGlmIChtX2JDb21iVGV4dCkgew0KKyAgICBpQ2hhcldpZHRoID0gbV9pQ29tYldpZHRoOw0KKyAgfSBlbHNlIHsNCisgICAgaWYgKG1fYlZlcnRpY2FsICE9IEZYX0lzT2RkKGlSb3RhdGlvbikpIHsNCisgICAgICBpQ2hhcldpZHRoID0gMTAwMDsNCisgICAgfSBlbHNlIHsNCisgICAgICBtX3BGb250LT5HZXRDaGFyV2lkdGgod0Zvcm0sIGlDaGFyV2lkdGgsIEZBTFNFKTsNCisgICAgfQ0KKyAgICBpZiAod0Zvcm0gPT0gMHhGRUZGKSB7DQorICAgICAgaUNoYXJXaWR0aCA9IG1faURlZkNoYXI7DQorICAgIH0NCisgICAgaUNoYXJXaWR0aCAqPSBtX2lGb250U2l6ZTsNCisgICAgaUNoYXJXaWR0aCA9IGlDaGFyV2lkdGggKiBtX2lIb3JTY2FsZSAvIDEwMDsNCisgIH0NCisgIHBDdXJDaGFyLT5tX2lDaGFyV2lkdGggPSBpQ2hhcldpZHRoOw0KKyAgaUxpbmVXaWR0aCArPSBpQ2hhcldpZHRoOw0KKyAgbV9wQ3VyTGluZS0+bV9pQXJhYmljQ2hhcnMrKzsNCisgIGlmICghbV9iU2luZ2xlTGluZSAmJiBpTGluZVdpZHRoID4gbV9pTGluZVdpZHRoICsgbV9pVG9sZXJhbmNlKSB7DQorICAgIHJldHVybiBFbmRCcmVhayhGWF9UWFRCUkVBS19MaW5lQnJlYWspOw0KKyAgfQ0KKyAgcmV0dXJuIEZYX1RYVEJSRUFLX05vbmU7DQorfQ0KK0ZYX0RXT1JEIENGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMoQ0ZYX0NoYXIqIHBDdXJDaGFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRpb24pIHsNCisgIEZYX0RXT1JEIGR3UHJvcHMgPSBwQ3VyQ2hhci0+bV9kd0NoYXJQcm9wczsNCisgIEZYX0RXT1JEIGR3VHlwZSA9IChkd1Byb3BzICYgRlhfQ0hBUlRZUEVCSVRTTUFTSyk7DQorICBpbnQzMl90JiBpTGluZVdpZHRoID0gbV9wQ3VyTGluZS0+bV9pV2lkdGg7DQorICBpbnQzMl90IGlDaGFyV2lkdGggPSAwOw0KKyAgbV9kd0NoYXJUeXBlID0gZHdUeXBlOw0KKyAgRlhfV0NIQVIgd2NoID0gcEN1ckNoYXItPm1fd0NoYXJDb2RlOw0KKyAgRlhfV0NIQVIgd0Zvcm0gPSB3Y2g7DQorICBpZiAoZHdUeXBlID09IEZYX0NIQVJUWVBFX051bWVyaWMpIHsNCisgICAgaWYgKG1fYkFyYWJpY051bWJlcikgew0KKyAgICAgIHdGb3JtID0gd2NoICsgMHgwNjMwOw0KKyAgICAgIHBDdXJDaGFyLT5tX2R3Q2hhclN0eWxlcyB8PSBGWF9UWFRDSEFSU1RZTEVfQXJhYmljSW5kaWM7DQorICAgIH0NCisgIH0gZWxzZSBpZiAod2NoID09IEwnLCcpIHsNCisgICAgaWYgKG1fYkFyYWJpY1NoYXBlcyAmJiBtX2lDdXJBcmFiaWNDb250ZXh0ID4gMCkgew0KKyAgICAgIHdGb3JtID0gMHgwNjBDOw0KKyAgICAgIHBDdXJDaGFyLT5tX2R3Q2hhclN0eWxlcyB8PSBGWF9UWFRDSEFSU1RZTEVfQXJhYmljQ29tbWE7DQorICAgIH0NCisgIH0gZWxzZSBpZiAobV9iQ3VyUlRMIHx8IG1fYlZlcnRpY2FsKSB7DQorICAgIHdGb3JtID0gRlhfR2V0TWlycm9yQ2hhcih3Y2gsIGR3UHJvcHMsIG1fYkN1clJUTCwgbV9iVmVydGljYWwpOw0KKyAgfQ0KKyAgaWYgKG1fYkNvbWJUZXh0KSB7DQorICAgIGlDaGFyV2lkdGggPSBtX2lDb21iV2lkdGg7DQorICB9IGVsc2Ugew0KKyAgICBpZiAobV9iVmVydGljYWwgIT0gRlhfSXNPZGQoaVJvdGF0aW9uKSkgew0KKyAgICAgIGlDaGFyV2lkdGggPSAxMDAwOw0KKyAgICB9IGVsc2UgaWYgKCFtX3BGb250LT5HZXRDaGFyV2lkdGgod0Zvcm0sIGlDaGFyV2lkdGgsIEZBTFNFKSkgew0KKyAgICAgIGlDaGFyV2lkdGggPSBtX2lEZWZDaGFyOw0KKyAgICB9DQorICAgIGlDaGFyV2lkdGggKj0gbV9pRm9udFNpemU7DQorICAgIGlDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogbV9pSG9yU2NhbGUgLyAxMDA7DQorICB9DQorICBpQ2hhcldpZHRoICs9IG1faUNoYXJTcGFjZTsNCisgIHBDdXJDaGFyLT5tX2lDaGFyV2lkdGggPSBpQ2hhcldpZHRoOw0KKyAgaUxpbmVXaWR0aCArPSBpQ2hhcldpZHRoOw0KKyAgRlhfQk9PTCBiQnJlYWsgPSAoZHdUeXBlICE9IEZYX0NIQVJUWVBFX1NwYWNlIHx8DQorICAgICAgICAgICAgICAgICAgICAobV9kd1BvbGljaWVzICYgRlhfVFhUQlJFQUtQT0xJQ1lfU3BhY2VCcmVhaykgIT0gMCk7DQorICBpZiAoIW1fYlNpbmdsZUxpbmUgJiYgYkJyZWFrICYmIGlMaW5lV2lkdGggPiBtX2lMaW5lV2lkdGggKyBtX2lUb2xlcmFuY2UpIHsNCisgICAgcmV0dXJuIEVuZEJyZWFrKEZYX1RYVEJSRUFLX0xpbmVCcmVhayk7DQorICB9DQorICByZXR1cm4gRlhfVFhUQlJFQUtfTm9uZTsNCit9DQordHlwZWRlZiBGWF9EV09SRCAoQ0ZYX1R4dEJyZWFrOjoqRlhfVHh0QnJlYWtfTFBGQXBwZW5kQ2hhcikoQ0ZYX0NoYXIqIHBDdXJDaGFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0aW9uKTsNCitzdGF0aWMgY29uc3QgRlhfVHh0QnJlYWtfTFBGQXBwZW5kQ2hhciBnX0ZYX1R4dEJyZWFrX2xwZkFwcGVuZENoYXJbMTZdID0gew0KKyAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX090aGVycywgICAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX1RhYiwNCisgICAgJkNGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsICAgICAgJkNGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9Db250cm9sLA0KKyAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX0NvbWJpbmF0aW9uLCAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX090aGVycywNCisgICAgJkNGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsICAgICAgJkNGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMsDQorICAgICZDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfQXJhYmljLCAgICAgICZDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfQXJhYmljLA0KKyAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYywgICAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYywNCisgICAgJkNGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMsICAgICAgJkNGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsDQorICAgICZDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfT3RoZXJzLCAgICAgICZDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfT3RoZXJzLA0KK307DQorRlhfRFdPUkQgQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCkgew0KKyAgRlhfRFdPUkQgZHdQcm9wcyA9IGtUZXh0TGF5b3V0Q29kZVByb3BlcnRpZXNbKEZYX1dPUkQpd2NoXTsNCisgIEZYX0RXT1JEIGR3VHlwZSA9IChkd1Byb3BzICYgRlhfQ0hBUlRZUEVCSVRTTUFTSyk7DQorICBDRlhfVHh0Q2hhciogcEN1ckNoYXIgPSBtX3BDdXJMaW5lLT5tX3BMaW5lQ2hhcnMtPkFkZFNwYWNlKCk7DQorICBwQ3VyQ2hhci0+bV93Q2hhckNvZGUgPSAoRlhfV09SRCl3Y2g7DQorICBwQ3VyQ2hhci0+bV9uUm90YXRpb24gPSBtX2lDaGFyUm90YXRpb247DQorICBwQ3VyQ2hhci0+bV9kd0NoYXJQcm9wcyA9IGR3UHJvcHM7DQorICBwQ3VyQ2hhci0+bV9kd0NoYXJTdHlsZXMgPSAwOw0KKyAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IDA7DQorICBwQ3VyQ2hhci0+bV9pSG9yaXpvbnRhbFNjYWxlID0gbV9pSG9yU2NhbGU7DQorICBwQ3VyQ2hhci0+bV9pVmVydGlhbFNjYWxlID0gbV9pVmVyU2NhbGU7DQorICBwQ3VyQ2hhci0+bV9kd1N0YXR1cyA9IDA7DQorICBwQ3VyQ2hhci0+bV9pQmlkaUNsYXNzID0gMDsNCisgIHBDdXJDaGFyLT5tX2lCaWRpTGV2ZWwgPSAwOw0KKyAgcEN1ckNoYXItPm1faUJpZGlQb3MgPSAwOw0KKyAgcEN1ckNoYXItPm1faUJpZGlPcmRlciA9IDA7DQorICBwQ3VyQ2hhci0+bV9wVXNlckRhdGEgPSBOVUxMOw0KKyAgQXBwZW5kQ2hhcl9QYWdlTG9hZChwQ3VyQ2hhciwgZHdQcm9wcyk7DQorICBGWF9EV09SRCBkd1JldDEgPSBGWF9UWFRCUkVBS19Ob25lOw0KKyAgaWYgKGR3VHlwZSAhPSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbiAmJg0KKyAgICAgIEdldFVuaWZpZWRDaGFyVHlwZShtX2R3Q2hhclR5cGUpICE9IEdldFVuaWZpZWRDaGFyVHlwZShkd1R5cGUpKSB7DQorICAgIGlmIChtX2R3Q2hhclR5cGUgPiAwICYmDQorICAgICAgICBtX3BDdXJMaW5lLT5tX2lXaWR0aCA+IG1faUxpbmVXaWR0aCArIG1faVRvbGVyYW5jZSAmJiAhbV9iU2luZ2xlTGluZSkgew0KKyAgICAgIGlmIChtX2R3Q2hhclR5cGUgIT0gRlhfQ0hBUlRZUEVfU3BhY2UgfHwgZHdUeXBlICE9IEZYX0NIQVJUWVBFX0NvbnRyb2wpIHsNCisgICAgICAgIGR3UmV0MSA9IEVuZEJyZWFrKEZYX1RYVEJSRUFLX0xpbmVCcmVhayk7DQorICAgICAgICBpbnQzMl90IGlDb3VudCA9IG1fcEN1ckxpbmUtPkNvdW50Q2hhcnMoKTsNCisgICAgICAgIGlmIChpQ291bnQgPiAwKSB7DQorICAgICAgICAgIHBDdXJDaGFyID0gbV9wQ3VyTGluZS0+bV9wTGluZUNoYXJzLT5HZXREYXRhUHRyKGlDb3VudCAtIDEpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBpUm90YXRpb24gPSBtX2lSb3RhdGlvbjsNCisgIGlmIChtX2JWZXJ0aWNhbCAmJiAoZHdQcm9wcyAmIDB4ODAwMCkgIT0gMCkgew0KKyAgICBpUm90YXRpb24gPSAoaVJvdGF0aW9uICsgMSkgJSA0Ow0KKyAgfQ0KKyAgRlhfRFdPUkQgZHdSZXQyID0NCisgICAgICAodGhpcy0+KmdfRlhfVHh0QnJlYWtfbHBmQXBwZW5kQ2hhcltkd1R5cGUgPj4gRlhfQ0hBUlRZUEVCSVRTXSkoDQorICAgICAgICAgIHBDdXJDaGFyLCBpUm90YXRpb24pOw0KKyAgcmV0dXJuIHN0ZDo6bWF4KGR3UmV0MSwgZHdSZXQyKTsNCit9DQordm9pZCBDRlhfVHh0QnJlYWs6OkVuZEJyZWFrX1VwZGF0ZUFyYWJpY1NoYXBlcygpIHsNCisgIEZYU1lTX2Fzc2VydChtX2JBcmFiaWNTaGFwZXMpOw0KKyAgaW50MzJfdCBpQ291bnQgPSBtX3BDdXJMaW5lLT5Db3VudENoYXJzKCk7DQorICBpZiAoaUNvdW50IDwgMikgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90JiBpTGluZVdpZHRoID0gbV9wQ3VyTGluZS0+bV9pV2lkdGg7DQorICBDRlhfQ2hhciAqcEN1ciwgKnBOZXh0Ow0KKyAgcEN1ciA9IG1fcEN1ckxpbmUtPkdldENoYXJQdHIoMCk7DQorICBGWF9CT09MIGJQcmV2TnVtID0gKHBDdXItPm1fZHdDaGFyU3R5bGVzICYgRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY0luZGljKSAhPSAwOw0KKyAgcEN1ciA9IG1fcEN1ckxpbmUtPkdldENoYXJQdHIoMSk7DQorICBGWF9XQ0hBUiB3Y2gsIHdGb3JtOw0KKyAgRlhfQk9PTCBiTmV4dE51bTsNCisgIGludDMyX3QgaSA9IDEsIGlDaGFyV2lkdGgsIGlSb3RhdGlvbjsNCisgIGRvIHsNCisgICAgaSsrOw0KKyAgICBpZiAoaSA8IGlDb3VudCkgew0KKyAgICAgIHBOZXh0ID0gbV9wQ3VyTGluZS0+R2V0Q2hhclB0cihpKTsNCisgICAgICBiTmV4dE51bSA9IChwTmV4dC0+bV9kd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfQXJhYmljSW5kaWMpICE9IDA7DQorICAgIH0gZWxzZSB7DQorICAgICAgcE5leHQgPSBOVUxMOw0KKyAgICAgIGJOZXh0TnVtID0gRkFMU0U7DQorICAgIH0NCisgICAgd2NoID0gcEN1ci0+bV93Q2hhckNvZGU7DQorICAgIGlmICh3Y2ggPT0gTCcuJykgew0KKyAgICAgIGlmIChiUHJldk51bSAmJiBiTmV4dE51bSkgew0KKyAgICAgICAgaVJvdGF0aW9uID0gbV9pUm90YXRpb247DQorICAgICAgICBpZiAobV9iVmVydGljYWwgJiYgKHBDdXItPm1fZHdDaGFyUHJvcHMgJiAweDgwMDApICE9IDApIHsNCisgICAgICAgICAgaVJvdGF0aW9uID0gKChpUm90YXRpb24gKyAxKSAmIDB4MDMpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd0Zvcm0gPSB3Y2ggPT0gTCcuJyA/IDB4MDY2QiA6IDB4MDY2QzsNCisgICAgICAgIGlMaW5lV2lkdGggLT0gcEN1ci0+bV9pQ2hhcldpZHRoOw0KKyAgICAgICAgaWYgKG1fYkNvbWJUZXh0KSB7DQorICAgICAgICAgIGlDaGFyV2lkdGggPSBtX2lDb21iV2lkdGg7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBpZiAobV9iVmVydGljYWwgIT0gRlhfSXNPZGQoaVJvdGF0aW9uKSkgew0KKyAgICAgICAgICAgIGlDaGFyV2lkdGggPSAxMDAwOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKCFtX3BGb250LT5HZXRDaGFyV2lkdGgod0Zvcm0sIGlDaGFyV2lkdGgsIEZBTFNFKSkgew0KKyAgICAgICAgICAgIGlDaGFyV2lkdGggPSBtX2lEZWZDaGFyOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlDaGFyV2lkdGggKj0gbV9pRm9udFNpemU7DQorICAgICAgICAgIGlDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogbV9pSG9yU2NhbGUgLyAxMDA7DQorICAgICAgICB9DQorICAgICAgICBwQ3VyLT5tX2lDaGFyV2lkdGggPSBpQ2hhcldpZHRoOw0KKyAgICAgICAgaUxpbmVXaWR0aCArPSBpQ2hhcldpZHRoOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBiUHJldk51bSA9IChwQ3VyLT5tX2R3Q2hhclN0eWxlcyAmIEZYX1RYVENIQVJTVFlMRV9BcmFiaWNJbmRpYykgIT0gMDsNCisgICAgcEN1ciA9IHBOZXh0Ow0KKyAgfSB3aGlsZSAoaSA8IGlDb3VudCk7DQorfQ0KK0ZYX0JPT0wgQ0ZYX1R4dEJyZWFrOjpFbmRCcmVha19TcGxpdExpbmUoQ0ZYX1R4dExpbmUqIHBOZXh0TGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFsbENoYXJzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMpIHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpOw0KKyAgRlhfQk9PTCBiRG9uZSA9IEZBTFNFOw0KKyAgQ0ZYX0NoYXIqIHBUQzsNCisgIGlmICghbV9iU2luZ2xlTGluZSAmJiBtX3BDdXJMaW5lLT5tX2lXaWR0aCA+IG1faUxpbmVXaWR0aCArIG1faVRvbGVyYW5jZSkgew0KKyAgICBwVEMgPSBtX3BDdXJMaW5lLT5HZXRDaGFyUHRyKGlDb3VudCAtIDEpOw0KKyAgICBzd2l0Y2ggKHBUQy0+R2V0Q2hhclR5cGUoKSkgew0KKyAgICAgIGNhc2UgRlhfQ0hBUlRZUEVfVGFiOg0KKyAgICAgIGNhc2UgRlhfQ0hBUlRZUEVfQ29udHJvbDoNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRlhfQ0hBUlRZUEVfU3BhY2U6DQorICAgICAgICBpZiAoKG1fZHdQb2xpY2llcyAmIEZYX1RYVEJSRUFLUE9MSUNZX1NwYWNlQnJlYWspICE9IDApIHsNCisgICAgICAgICAgU3BsaXRUZXh0TGluZShtX3BDdXJMaW5lLCBwTmV4dExpbmUsICFtX2JQYWdpbmF0aW9uICYmIGJBbGxDaGFycyk7DQorICAgICAgICAgIGJEb25lID0gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBTcGxpdFRleHRMaW5lKG1fcEN1ckxpbmUsIHBOZXh0TGluZSwgIW1fYlBhZ2luYXRpb24gJiYgYkFsbENoYXJzKTsNCisgICAgICAgIGJEb25lID0gVFJVRTsNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpQ291bnQgPSBtX3BDdXJMaW5lLT5Db3VudENoYXJzKCk7DQorICBDRlhfVHh0UGllY2VBcnJheSogcEN1clBpZWNlcyA9IG1fcEN1ckxpbmUtPm1fcExpbmVQaWVjZXM7DQorICBDRlhfVHh0UGllY2UgdHA7DQorICBpZiAobV9iUGFnaW5hdGlvbikgew0KKyAgICB0cC5tX2R3U3RhdHVzID0gZHdTdGF0dXM7DQorICAgIHRwLm1faVN0YXJ0UG9zID0gbV9wQ3VyTGluZS0+bV9pU3RhcnQ7DQorICAgIHRwLm1faVdpZHRoID0gbV9wQ3VyTGluZS0+bV9pV2lkdGg7DQorICAgIHRwLm1faVN0YXJ0Q2hhciA9IDA7DQorICAgIHRwLm1faUNoYXJzID0gaUNvdW50Ow0KKyAgICB0cC5tX3BDaGFycyA9IG1fcEN1ckxpbmUtPm1fcExpbmVDaGFyczsNCisgICAgdHAubV9wVXNlckRhdGEgPSBtX3BVc2VyRGF0YTsNCisgICAgcFRDID0gbV9wQ3VyTGluZS0+R2V0Q2hhclB0cigwKTsNCisgICAgdHAubV9kd0NoYXJTdHlsZXMgPSBwVEMtPm1fZHdDaGFyU3R5bGVzOw0KKyAgICB0cC5tX2lIb3Jpem9udGFsU2NhbGUgPSBwVEMtPm1faUhvcml6b250YWxTY2FsZTsNCisgICAgdHAubV9pVmVydGljYWxTY2FsZSA9IHBUQy0+bV9pVmVydGlhbFNjYWxlOw0KKyAgICBwQ3VyUGllY2VzLT5BZGQodHApOw0KKyAgICBtX3BDdXJMaW5lID0gcE5leHRMaW5lOw0KKyAgICBtX2R3Q2hhclR5cGUgPSAwOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIGlmIChiQWxsQ2hhcnMgJiYgIWJEb25lKSB7DQorICAgIGludDMyX3QgaUVuZFBvcyA9IG1fcEN1ckxpbmUtPm1faVdpZHRoOw0KKyAgICBHZXRCcmVha1BvcygqbV9wQ3VyTGluZS0+bV9wTGluZUNoYXJzLCBpRW5kUG9zLCBiQWxsQ2hhcnMsIFRSVUUpOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkIENGWF9UeHRCcmVhazo6RW5kQnJlYWtfQmlkaUxpbmUoQ0ZYX1RQT0FycmF5JiB0cG9zLCBGWF9EV09SRCBkd1N0YXR1cykgew0KKyAgQ0ZYX1R4dFBpZWNlIHRwOw0KKyAgRlhfVFBPIHRwbzsNCisgIENGWF9UeHRDaGFyKiBwVEM7DQorICBpbnQzMl90IGksIGo7DQorICBDRlhfVHh0Q2hhckFycmF5JiBjaGFycyA9ICptX3BDdXJMaW5lLT5tX3BMaW5lQ2hhcnM7DQorICBpbnQzMl90IGlDb3VudCA9IG1fcEN1ckxpbmUtPkNvdW50Q2hhcnMoKTsNCisgIEZYX0JPT0wgYkRvbmUgPSAobV9wQ3VyTGluZS0+bV9pQXJhYmljQ2hhcnMgPiAwIHx8IG1fYkN1clJUTCk7DQorICBpZiAoIW1fYlBhZ2luYXRpb24gJiYgYkRvbmUpIHsNCisgICAgaW50MzJfdCBpQmlkaU51bSA9IDA7DQorICAgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgIHBUQyA9IGNoYXJzLkdldERhdGFQdHIoaSk7DQorICAgICAgcFRDLT5tX2lCaWRpUG9zID0gaTsNCisgICAgICBpZiAocFRDLT5HZXRDaGFyVHlwZSgpICE9IEZYX0NIQVJUWVBFX0NvbnRyb2wpIHsNCisgICAgICAgIGlCaWRpTnVtID0gaTsNCisgICAgICB9DQorICAgICAgaWYgKGkgPT0gMCkgew0KKyAgICAgICAgcFRDLT5tX2lCaWRpTGV2ZWwgPSAxOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9CaWRpTGluZShjaGFycywgaUJpZGlOdW0gKyAxLCBtX2JDdXJSVEwgPyAxIDogMCk7DQorICB9DQorICBDRlhfVHh0UGllY2VBcnJheSogcEN1clBpZWNlcyA9IG1fcEN1ckxpbmUtPm1fcExpbmVQaWVjZXM7DQorICBpZiAoIW1fYlBhZ2luYXRpb24gJiYNCisgICAgICAoYkRvbmUgfHwgKG1fZHdMYXlvdXRTdHlsZXMgJiBGWF9UWFRMQVlPVVRTVFlMRV9NdXRpcGxlRm9ybWF0KSAhPSAwKSkgew0KKyAgICB0cC5tX2R3U3RhdHVzID0gRlhfVFhUQlJFQUtfUGllY2VCcmVhazsNCisgICAgdHAubV9pU3RhcnRQb3MgPSBtX3BDdXJMaW5lLT5tX2lTdGFydDsNCisgICAgdHAubV9wQ2hhcnMgPSBtX3BDdXJMaW5lLT5tX3BMaW5lQ2hhcnM7DQorICAgIGludDMyX3QgaUJpZGlMZXZlbCA9IC0xLCBpQ2hhcldpZHRoOw0KKyAgICBpID0gMCwgaiA9IC0xOw0KKyAgICB3aGlsZSAoaSA8IGlDb3VudCkgew0KKyAgICAgIHBUQyA9IGNoYXJzLkdldERhdGFQdHIoaSk7DQorICAgICAgaWYgKGlCaWRpTGV2ZWwgPCAwKSB7DQorICAgICAgICBpQmlkaUxldmVsID0gcFRDLT5tX2lCaWRpTGV2ZWw7DQorICAgICAgICB0cC5tX2lXaWR0aCA9IDA7DQorICAgICAgICB0cC5tX2lCaWRpTGV2ZWwgPSBpQmlkaUxldmVsOw0KKyAgICAgICAgdHAubV9pQmlkaVBvcyA9IHBUQy0+bV9pQmlkaU9yZGVyOw0KKyAgICAgICAgdHAubV9kd0NoYXJTdHlsZXMgPSBwVEMtPm1fZHdDaGFyU3R5bGVzOw0KKyAgICAgICAgdHAubV9wVXNlckRhdGEgPSBwVEMtPm1fcFVzZXJEYXRhOw0KKyAgICAgICAgdHAubV9pSG9yaXpvbnRhbFNjYWxlID0gcFRDLT5tX2lIb3Jpem9udGFsU2NhbGU7DQorICAgICAgICB0cC5tX2lWZXJ0aWNhbFNjYWxlID0gcFRDLT5tX2lWZXJ0aWFsU2NhbGU7DQorICAgICAgICB0cC5tX2R3U3RhdHVzID0gRlhfVFhUQlJFQUtfUGllY2VCcmVhazsNCisgICAgICB9DQorICAgICAgaWYgKGlCaWRpTGV2ZWwgIT0gcFRDLT5tX2lCaWRpTGV2ZWwgfHwgcFRDLT5tX2R3U3RhdHVzICE9IDApIHsNCisgICAgICAgIGlmIChpQmlkaUxldmVsID09IHBUQy0+bV9pQmlkaUxldmVsKSB7DQorICAgICAgICAgIHRwLm1fZHdTdGF0dXMgPSBwVEMtPm1fZHdTdGF0dXM7DQorICAgICAgICAgIGlDaGFyV2lkdGggPSBwVEMtPm1faUNoYXJXaWR0aDsNCisgICAgICAgICAgaWYgKGlDaGFyV2lkdGggPiAwKSB7DQorICAgICAgICAgICAgdHAubV9pV2lkdGggKz0gaUNoYXJXaWR0aDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpKys7DQorICAgICAgICB9DQorICAgICAgICB0cC5tX2lDaGFycyA9IGkgLSB0cC5tX2lTdGFydENoYXI7DQorICAgICAgICBwQ3VyUGllY2VzLT5BZGQodHApOw0KKyAgICAgICAgdHAubV9pU3RhcnRQb3MgKz0gdHAubV9pV2lkdGg7DQorICAgICAgICB0cC5tX2lTdGFydENoYXIgPSBpOw0KKyAgICAgICAgdHBvLmluZGV4ID0gKytqOw0KKyAgICAgICAgdHBvLnBvcyA9IHRwLm1faUJpZGlQb3M7DQorICAgICAgICB0cG9zLkFkZCh0cG8pOw0KKyAgICAgICAgaUJpZGlMZXZlbCA9IC0xOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpQ2hhcldpZHRoID0gcFRDLT5tX2lDaGFyV2lkdGg7DQorICAgICAgICBpZiAoaUNoYXJXaWR0aCA+IDApIHsNCisgICAgICAgICAgdHAubV9pV2lkdGggKz0gaUNoYXJXaWR0aDsNCisgICAgICAgIH0NCisgICAgICAgIGkrKzsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGkgPiB0cC5tX2lTdGFydENoYXIpIHsNCisgICAgICB0cC5tX2R3U3RhdHVzID0gZHdTdGF0dXM7DQorICAgICAgdHAubV9pQ2hhcnMgPSBpIC0gdHAubV9pU3RhcnRDaGFyOw0KKyAgICAgIHBDdXJQaWVjZXMtPkFkZCh0cCk7DQorICAgICAgdHBvLmluZGV4ID0gKytqOw0KKyAgICAgIHRwby5wb3MgPSB0cC5tX2lCaWRpUG9zOw0KKyAgICAgIHRwb3MuQWRkKHRwbyk7DQorICAgIH0NCisgICAgaWYgKGogPiAtMSkgew0KKyAgICAgIGlmIChqID4gMCkgew0KKyAgICAgICAgRlhfVEVYVExBWU9VVF9QaWVjZVNvcnQodHBvcywgMCwgaik7DQorICAgICAgICBpbnQzMl90IGlTdGFydFBvcyA9IDA7DQorICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGo7IGkrKykgew0KKyAgICAgICAgICB0cG8gPSB0cG9zLkdldEF0KGkpOw0KKyAgICAgICAgICBDRlhfVHh0UGllY2UmIHR0cCA9IHBDdXJQaWVjZXMtPkdldEF0KHRwby5pbmRleCk7DQorICAgICAgICAgIHR0cC5tX2lTdGFydFBvcyA9IGlTdGFydFBvczsNCisgICAgICAgICAgaVN0YXJ0UG9zICs9IHR0cC5tX2lXaWR0aDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgQ0ZYX1R4dFBpZWNlJiB0dHAgPSBwQ3VyUGllY2VzLT5HZXRBdChqKTsNCisgICAgICB0dHAubV9kd1N0YXR1cyA9IGR3U3RhdHVzOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICB0cC5tX2R3U3RhdHVzID0gZHdTdGF0dXM7DQorICAgIHRwLm1faVN0YXJ0UG9zID0gbV9wQ3VyTGluZS0+bV9pU3RhcnQ7DQorICAgIHRwLm1faVdpZHRoID0gbV9wQ3VyTGluZS0+bV9pV2lkdGg7DQorICAgIHRwLm1faVN0YXJ0Q2hhciA9IDA7DQorICAgIHRwLm1faUNoYXJzID0gaUNvdW50Ow0KKyAgICB0cC5tX3BDaGFycyA9IG1fcEN1ckxpbmUtPm1fcExpbmVDaGFyczsNCisgICAgdHAubV9wVXNlckRhdGEgPSBtX3BVc2VyRGF0YTsNCisgICAgcFRDID0gY2hhcnMuR2V0RGF0YVB0cigwKTsNCisgICAgdHAubV9kd0NoYXJTdHlsZXMgPSBwVEMtPm1fZHdDaGFyU3R5bGVzOw0KKyAgICB0cC5tX2lIb3Jpem9udGFsU2NhbGUgPSBwVEMtPm1faUhvcml6b250YWxTY2FsZTsNCisgICAgdHAubV9pVmVydGljYWxTY2FsZSA9IHBUQy0+bV9pVmVydGlhbFNjYWxlOw0KKyAgICBwQ3VyUGllY2VzLT5BZGQodHApOw0KKyAgICB0cG8uaW5kZXggPSAwOw0KKyAgICB0cG8ucG9zID0gMDsNCisgICAgdHBvcy5BZGQodHBvKTsNCisgIH0NCit9DQordm9pZCBDRlhfVHh0QnJlYWs6OkVuZEJyZWFrX0FsaWdubWVudChDRlhfVFBPQXJyYXkmIHRwb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBbGxDaGFycywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzKSB7DQorICBpbnQzMl90IGlOZXRXaWR0aCA9IG1fcEN1ckxpbmUtPm1faVdpZHRoLCBpR2FwQ2hhcnMgPSAwLCBpQ2hhcldpZHRoOw0KKyAgQ0ZYX1R4dFBpZWNlQXJyYXkqIHBDdXJQaWVjZXMgPSBtX3BDdXJMaW5lLT5tX3BMaW5lUGllY2VzOw0KKyAgaW50MzJfdCBpLCBqLCBpQ291bnQgPSBwQ3VyUGllY2VzLT5HZXRTaXplKCk7DQorICBGWF9CT09MIGJGaW5kID0gRkFMU0U7DQorICBGWF9UUE8gdHBvOw0KKyAgQ0ZYX1R4dENoYXIqIHBUQzsNCisgIEZYX0RXT1JEIGR3Q2hhclR5cGU7DQorICBmb3IgKGkgPSBpQ291bnQgLSAxOyBpID4gLTE7IGktLSkgew0KKyAgICB0cG8gPSB0cG9zLkdldEF0KGkpOw0KKyAgICBDRlhfVHh0UGllY2UmIHR0cCA9IHBDdXJQaWVjZXMtPkdldEF0KHRwby5pbmRleCk7DQorICAgIGlmICghYkZpbmQpIHsNCisgICAgICBpTmV0V2lkdGggPSB0dHAuR2V0RW5kUG9zKCk7DQorICAgIH0NCisgICAgRlhfQk9PTCBiQXJhYmljID0gRlhfSXNPZGQodHRwLm1faUJpZGlMZXZlbCk7DQorICAgIGogPSBiQXJhYmljID8gMCA6IHR0cC5tX2lDaGFycyAtIDE7DQorICAgIHdoaWxlIChqID4gLTEgJiYgaiA8IHR0cC5tX2lDaGFycykgew0KKyAgICAgIHBUQyA9IHR0cC5HZXRDaGFyUHRyKGopOw0KKyAgICAgIGlmIChwVEMtPm1fbkJyZWFrVHlwZSA9PSBGWF9MQlRfRElSRUNUX0JSSykgew0KKyAgICAgICAgaUdhcENoYXJzKys7DQorICAgICAgfQ0KKyAgICAgIGlmICghYkZpbmQgfHwgIWJBbGxDaGFycykgew0KKyAgICAgICAgZHdDaGFyVHlwZSA9IHBUQy0+R2V0Q2hhclR5cGUoKTsNCisgICAgICAgIGlmIChkd0NoYXJUeXBlID09IEZYX0NIQVJUWVBFX1NwYWNlIHx8DQorICAgICAgICAgICAgZHdDaGFyVHlwZSA9PSBGWF9DSEFSVFlQRV9Db250cm9sKSB7DQorICAgICAgICAgIGlmICghYkZpbmQpIHsNCisgICAgICAgICAgICBpQ2hhcldpZHRoID0gcFRDLT5tX2lDaGFyV2lkdGg7DQorICAgICAgICAgICAgaWYgKGJBbGxDaGFycyAmJiBpQ2hhcldpZHRoID4gMCkgew0KKyAgICAgICAgICAgICAgaU5ldFdpZHRoIC09IGlDaGFyV2lkdGg7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBiRmluZCA9IFRSVUU7DQorICAgICAgICAgIGlmICghYkFsbENoYXJzKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgaiArPSBiQXJhYmljID8gMSA6IC0xOw0KKyAgICB9DQorICAgIGlmICghYkFsbENoYXJzICYmIGJGaW5kKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGludDMyX3QgaU9mZnNldCA9IG1faUxpbmVXaWR0aCAtIGlOZXRXaWR0aDsNCisgIGludDMyX3QgaUxvd2VyQWxpZ25tZW50ID0gKG1faUN1ckFsaWdubWVudCAmIEZYX1RYVExJTkVBTElHTk1FTlRfTG93ZXJNYXNrKTsNCisgIGludDMyX3QgaUhpZ2hlckFsaWdubWVudCA9IChtX2lDdXJBbGlnbm1lbnQgJiBGWF9UWFRMSU5FQUxJR05NRU5UX0hpZ2hlck1hc2spOw0KKyAgaWYgKGlHYXBDaGFycyA+IDAgJiYgKGlIaWdoZXJBbGlnbm1lbnQgPT0gRlhfVFhUTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZCB8fA0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpSGlnaGVyQWxpZ25tZW50ID09IEZYX1RYVExJTkVBTElHTk1FTlRfSnVzdGlmaWVkICYmDQorICAgICAgICAgICAgICAgICAgICAgICAgIGR3U3RhdHVzICE9IEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKSkpIHsNCisgICAgaW50MzJfdCBpU3RhcnQgPSAtMTsNCisgICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgdHBvID0gdHBvcy5HZXRBdChpKTsNCisgICAgICBDRlhfVHh0UGllY2UmIHR0cCA9IHBDdXJQaWVjZXMtPkdldEF0KHRwby5pbmRleCk7DQorICAgICAgaWYgKGlTdGFydCA8IC0xKSB7DQorICAgICAgICBpU3RhcnQgPSB0dHAubV9pU3RhcnRQb3M7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHR0cC5tX2lTdGFydFBvcyA9IGlTdGFydDsNCisgICAgICB9DQorICAgICAgaW50MzJfdCBrOw0KKyAgICAgIGZvciAoaiA9IDA7IGogPCB0dHAubV9pQ2hhcnM7IGorKykgew0KKyAgICAgICAgcFRDID0gdHRwLkdldENoYXJQdHIoaik7DQorICAgICAgICBpZiAocFRDLT5tX25CcmVha1R5cGUgIT0gRlhfTEJUX0RJUkVDVF9CUksgfHwgcFRDLT5tX2lDaGFyV2lkdGggPCAwKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgayA9IGlPZmZzZXQgLyBpR2FwQ2hhcnM7DQorICAgICAgICBwVEMtPm1faUNoYXJXaWR0aCArPSBrOw0KKyAgICAgICAgdHRwLm1faVdpZHRoICs9IGs7DQorICAgICAgICBpT2Zmc2V0IC09IGs7DQorICAgICAgICBpR2FwQ2hhcnMtLTsNCisgICAgICAgIGlmIChpR2FwQ2hhcnMgPCAxKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpU3RhcnQgKz0gdHRwLm1faVdpZHRoOw0KKyAgICB9DQorICB9IGVsc2UgaWYgKGlMb3dlckFsaWdubWVudCA+IEZYX1RYVExJTkVBTElHTk1FTlRfTGVmdCkgew0KKyAgICBpZiAoaUxvd2VyQWxpZ25tZW50ID09IEZYX1RYVExJTkVBTElHTk1FTlRfQ2VudGVyKSB7DQorICAgICAgaU9mZnNldCAvPSAyOw0KKyAgICB9DQorICAgIGlmIChpT2Zmc2V0ID4gMCkgew0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgICAgQ0ZYX1R4dFBpZWNlJiB0dHAgPSBwQ3VyUGllY2VzLT5HZXRBdChpKTsNCisgICAgICAgIHR0cC5tX2lTdGFydFBvcyArPSBpT2Zmc2V0Ow0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KK30NCitGWF9EV09SRCBDRlhfVHh0QnJlYWs6OkVuZEJyZWFrKEZYX0RXT1JEIGR3U3RhdHVzKSB7DQorICBGWFNZU19hc3NlcnQoZHdTdGF0dXMgPj0gRlhfVFhUQlJFQUtfUGllY2VCcmVhayAmJg0KKyAgICAgICAgICAgICAgIGR3U3RhdHVzIDw9IEZYX1RYVEJSRUFLX1BhZ2VCcmVhayk7DQorICBDRlhfVHh0UGllY2VBcnJheSogcEN1clBpZWNlcyA9IG1fcEN1ckxpbmUtPm1fcExpbmVQaWVjZXM7DQorICBpbnQzMl90IGlDb3VudCA9IHBDdXJQaWVjZXMtPkdldFNpemUoKTsNCisgIGlmIChpQ291bnQgPiAwKSB7DQorICAgIENGWF9UeHRQaWVjZSogcExhc3RQaWVjZSA9IHBDdXJQaWVjZXMtPkdldFB0ckF0KC0taUNvdW50KTsNCisgICAgaWYgKGR3U3RhdHVzID4gRlhfVFhUQlJFQUtfUGllY2VCcmVhaykgew0KKyAgICAgIHBMYXN0UGllY2UtPm1fZHdTdGF0dXMgPSBkd1N0YXR1czsNCisgICAgfSBlbHNlIHsNCisgICAgICBkd1N0YXR1cyA9IHBMYXN0UGllY2UtPm1fZHdTdGF0dXM7DQorICAgIH0NCisgICAgcmV0dXJuIGR3U3RhdHVzOw0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX1R4dExpbmUqIHBMYXN0TGluZSA9IEdldFR4dExpbmUoVFJVRSk7DQorICAgIGlmIChwTGFzdExpbmUgIT0gTlVMTCkgew0KKyAgICAgIHBDdXJQaWVjZXMgPSBwTGFzdExpbmUtPm1fcExpbmVQaWVjZXM7DQorICAgICAgaUNvdW50ID0gcEN1clBpZWNlcy0+R2V0U2l6ZSgpOw0KKyAgICAgIGlmIChpQ291bnQtLSA+IDApIHsNCisgICAgICAgIENGWF9UeHRQaWVjZSogcExhc3RQaWVjZSA9IHBDdXJQaWVjZXMtPkdldFB0ckF0KGlDb3VudCk7DQorICAgICAgICBpZiAoZHdTdGF0dXMgPiBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSB7DQorICAgICAgICAgIHBMYXN0UGllY2UtPm1fZHdTdGF0dXMgPSBkd1N0YXR1czsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGR3U3RhdHVzID0gcExhc3RQaWVjZS0+bV9kd1N0YXR1czsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBkd1N0YXR1czsNCisgICAgICB9DQorICAgICAgcmV0dXJuIEZYX1RYVEJSRUFLX05vbmU7DQorICAgIH0NCisgICAgaUNvdW50ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpOw0KKyAgICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICAgIHJldHVybiBGWF9UWFRCUkVBS19Ob25lOw0KKyAgICB9DQorICAgIGlmICghbV9iUGFnaW5hdGlvbikgew0KKyAgICAgIENGWF9UeHRDaGFyKiBwVEMgPSBtX3BDdXJMaW5lLT5HZXRDaGFyUHRyKGlDb3VudCAtIDEpOw0KKyAgICAgIHBUQy0+bV9kd1N0YXR1cyA9IGR3U3RhdHVzOw0KKyAgICB9DQorICAgIGlmIChkd1N0YXR1cyA8PSBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSB7DQorICAgICAgcmV0dXJuIGR3U3RhdHVzOw0KKyAgICB9DQorICB9DQorICBtX2lSZWFkeSA9IChtX3BDdXJMaW5lID09IG1fcFR4dExpbmUxKSA/IDEgOiAyOw0KKyAgQ0ZYX1R4dExpbmUqIHBOZXh0TGluZSA9DQorICAgICAgKG1fcEN1ckxpbmUgPT0gbV9wVHh0TGluZTEpID8gbV9wVHh0TGluZTIgOiBtX3BUeHRMaW5lMTsNCisgIEZYX0JPT0wgYkFsbENoYXJzID0gKG1faUN1ckFsaWdubWVudCA+IEZYX1RYVExJTkVBTElHTk1FTlRfUmlnaHQpOw0KKyAgQ0ZYX1RQT0FycmF5IHRwb3M7DQorICBDRlhfQ2hhciogcFRDOw0KKyAgaWYgKG1fYkFyYWJpY1NoYXBlcykgew0KKyAgICBFbmRCcmVha19VcGRhdGVBcmFiaWNTaGFwZXMoKTsNCisgIH0NCisgIGlmIChFbmRCcmVha19TcGxpdExpbmUocE5leHRMaW5lLCBiQWxsQ2hhcnMsIGR3U3RhdHVzKSkgew0KKyAgICBnb3RvIEVuZEJyZWFrX1JldDsNCisgIH0NCisgIEVuZEJyZWFrX0JpZGlMaW5lKHRwb3MsIGR3U3RhdHVzKTsNCisgIGlmICghbV9iUGFnaW5hdGlvbiAmJiBtX2lDdXJBbGlnbm1lbnQgPiBGWF9UWFRMSU5FQUxJR05NRU5UX0xlZnQpIHsNCisgICAgRW5kQnJlYWtfQWxpZ25tZW50KHRwb3MsIGJBbGxDaGFycywgZHdTdGF0dXMpOw0KKyAgfQ0KK0VuZEJyZWFrX1JldDoNCisgIG1fcEN1ckxpbmUgPSBwTmV4dExpbmU7DQorICBwVEMgPSBHZXRMYXN0Q2hhcigwLCBGQUxTRSk7DQorICBtX2R3Q2hhclR5cGUgPSBwVEMgPT0gTlVMTCA/IDAgOiBwVEMtPkdldENoYXJUeXBlKCk7DQorICBpZiAoZHdTdGF0dXMgPT0gRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspIHsNCisgICAgbV9pQXJhYmljQ29udGV4dCA9IG1faUN1ckFyYWJpY0NvbnRleHQgPSAxOw0KKyAgICBSZXNldEFyYWJpY0NvbnRleHQoKTsNCisgIH0NCisgIHJldHVybiBkd1N0YXR1czsNCit9DQoraW50MzJfdCBDRlhfVHh0QnJlYWs6OkdldEJyZWFrUG9zKENGWF9UeHRDaGFyQXJyYXkmIGNhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpRW5kUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBbGxDaGFycywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiT25seUJyaykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gY2EuR2V0U2l6ZSgpIC0gMTsNCisgIGlmIChpTGVuZ3RoIDwgMSkgew0KKyAgICByZXR1cm4gaUxlbmd0aDsNCisgIH0NCisgIGludDMyX3QgaUJyZWFrID0gLTEsIGlCcmVha1BvcyA9IC0xLCBpSW5kaXJlY3QgPSAtMSwgaUluZGlyZWN0UG9zID0gLTEsDQorICAgICAgICAgIGlMYXN0ID0gLTEsIGlMYXN0UG9zID0gLTE7DQorICBpZiAobV9iU2luZ2xlTGluZSB8fCBpRW5kUG9zIDw9IG1faUxpbmVXaWR0aCkgew0KKyAgICBpZiAoIWJBbGxDaGFycykgew0KKyAgICAgIHJldHVybiBpTGVuZ3RoOw0KKyAgICB9DQorICAgIGlCcmVhayA9IGlMZW5ndGg7DQorICAgIGlCcmVha1BvcyA9IGlFbmRQb3M7DQorICB9DQorICBGWF9CT09MIGJTcGFjZUJyZWFrID0gKG1fZHdQb2xpY2llcyAmIEZYX1RYVEJSRUFLUE9MSUNZX1NwYWNlQnJlYWspICE9IDA7DQorICBGWF9CT09MIGJOdW1iZXJCcmVhayA9IChtX2R3UG9saWNpZXMgJiBGWF9UWFRCUkVBS1BPTElDWV9OdW1iZXJCcmVhaykgIT0gMDsNCisgIEZYX0xJTkVCUkVBS1RZUEUgZVR5cGU7DQorICBGWF9EV09SRCBuQ29kZVByb3AsIG5DdXIsIG5OZXh0Ow0KKyAgQ0ZYX0NoYXIqIHBDdXIgPSBjYS5HZXREYXRhUHRyKGlMZW5ndGgtLSk7DQorICBpZiAoYkFsbENoYXJzKSB7DQorICAgIHBDdXItPm1fbkJyZWFrVHlwZSA9IEZYX0xCVF9VTktOT1dOOw0KKyAgfQ0KKyAgbkNvZGVQcm9wID0gcEN1ci0+bV9kd0NoYXJQcm9wczsNCisgIG5OZXh0ID0gbkNvZGVQcm9wICYgMHgwMDNGOw0KKyAgaW50MzJfdCBpQ2hhcldpZHRoID0gcEN1ci0+bV9pQ2hhcldpZHRoOw0KKyAgaWYgKGlDaGFyV2lkdGggPiAwKSB7DQorICAgIGlFbmRQb3MgLT0gaUNoYXJXaWR0aDsNCisgIH0NCisgIHdoaWxlIChpTGVuZ3RoID49IDApIHsNCisgICAgcEN1ciA9IGNhLkdldERhdGFQdHIoaUxlbmd0aCk7DQorICAgIG5Db2RlUHJvcCA9IHBDdXItPm1fZHdDaGFyUHJvcHM7DQorICAgIG5DdXIgPSBuQ29kZVByb3AgJiAweDAwM0Y7DQorICAgIGlmIChuQ3VyID09IEZYX0NCUF9TUCkgew0KKyAgICAgIGlmIChuTmV4dCA9PSBGWF9DQlBfU1ApIHsNCisgICAgICAgIGVUeXBlID0gYlNwYWNlQnJlYWsgPyBGWF9MQlRfRElSRUNUX0JSSyA6IEZYX0xCVF9QUk9ISUJJVEVEX0JSSzsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgZVR5cGUgPSAqKChjb25zdCBGWF9MSU5FQlJFQUtUWVBFKilnc19GWF9MaW5lQnJlYWtfUGFpclRhYmxlICsNCisgICAgICAgICAgICAgICAgICAobkN1ciA8PCA1KSArIG5OZXh0KTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoYk51bWJlckJyZWFrICYmIG5DdXIgPT0gRlhfQ0JQX05VICYmIG5OZXh0ID09IEZYX0NCUF9OVSkgew0KKyAgICAgIGVUeXBlID0gRlhfTEJUX0RJUkVDVF9CUks7DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKG5OZXh0ID09IEZYX0NCUF9TUCkgew0KKyAgICAgICAgZVR5cGUgPSBGWF9MQlRfUFJPSElCSVRFRF9CUks7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGVUeXBlID0gKigoY29uc3QgRlhfTElORUJSRUFLVFlQRSopZ3NfRlhfTGluZUJyZWFrX1BhaXJUYWJsZSArDQorICAgICAgICAgICAgICAgICAgKG5DdXIgPDwgNSkgKyBuTmV4dCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChiQWxsQ2hhcnMpIHsNCisgICAgICBwQ3VyLT5tX25CcmVha1R5cGUgPSAodWludDhfdCllVHlwZTsNCisgICAgfQ0KKyAgICBpZiAoIWJPbmx5QnJrKSB7DQorICAgICAgaWYgKG1fYlNpbmdsZUxpbmUgfHwgaUVuZFBvcyA8PSBtX2lMaW5lV2lkdGggfHwNCisgICAgICAgICAgKG5DdXIgPT0gRlhfQ0JQX1NQICYmICFiU3BhY2VCcmVhaykpIHsNCisgICAgICAgIGlmIChlVHlwZSA9PSBGWF9MQlRfRElSRUNUX0JSSyAmJiBpQnJlYWsgPCAwKSB7DQorICAgICAgICAgIGlCcmVhayA9IGlMZW5ndGg7DQorICAgICAgICAgIGlCcmVha1BvcyA9IGlFbmRQb3M7DQorICAgICAgICAgIGlmICghYkFsbENoYXJzKSB7DQorICAgICAgICAgICAgcmV0dXJuIGlMZW5ndGg7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gRlhfTEJUX0lORElSRUNUX0JSSyAmJiBpSW5kaXJlY3QgPCAwKSB7DQorICAgICAgICAgIGlJbmRpcmVjdCA9IGlMZW5ndGg7DQorICAgICAgICAgIGlJbmRpcmVjdFBvcyA9IGlFbmRQb3M7DQorICAgICAgICB9DQorICAgICAgICBpZiAoaUxhc3QgPCAwKSB7DQorICAgICAgICAgIGlMYXN0ID0gaUxlbmd0aDsNCisgICAgICAgICAgaUxhc3RQb3MgPSBpRW5kUG9zOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpQ2hhcldpZHRoID0gcEN1ci0+bV9pQ2hhcldpZHRoOw0KKyAgICAgIGlmIChpQ2hhcldpZHRoID4gMCkgew0KKyAgICAgICAgaUVuZFBvcyAtPSBpQ2hhcldpZHRoOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBuTmV4dCA9IG5Db2RlUHJvcCAmIDB4MDAzRjsNCisgICAgaUxlbmd0aC0tOw0KKyAgfQ0KKyAgaWYgKGJPbmx5QnJrKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaWYgKGlCcmVhayA+IC0xKSB7DQorICAgIGlFbmRQb3MgPSBpQnJlYWtQb3M7DQorICAgIHJldHVybiBpQnJlYWs7DQorICB9DQorICBpZiAoaUluZGlyZWN0ID4gLTEpIHsNCisgICAgaUVuZFBvcyA9IGlJbmRpcmVjdFBvczsNCisgICAgcmV0dXJuIGlJbmRpcmVjdDsNCisgIH0NCisgIGlmIChpTGFzdCA+IC0xKSB7DQorICAgIGlFbmRQb3MgPSBpTGFzdFBvczsNCisgICAgcmV0dXJuIGlMYXN0Ow0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KK3ZvaWQgQ0ZYX1R4dEJyZWFrOjpTcGxpdFRleHRMaW5lKENGWF9UeHRMaW5lKiBwQ3VyTGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfVHh0TGluZSogcE5leHRMaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFsbENoYXJzKSB7DQorICBGWFNZU19hc3NlcnQocEN1ckxpbmUgIT0gTlVMTCAmJiBwTmV4dExpbmUgIT0gTlVMTCk7DQorICBpbnQzMl90IGlDb3VudCA9IHBDdXJMaW5lLT5Db3VudENoYXJzKCk7DQorICBpZiAoaUNvdW50IDwgMikgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlFbmRQb3MgPSBwQ3VyTGluZS0+bV9pV2lkdGg7DQorICBDRlhfVHh0Q2hhckFycmF5JiBjdXJDaGFycyA9ICpwQ3VyTGluZS0+bV9wTGluZUNoYXJzOw0KKyAgaW50MzJfdCBpQ2hhclBvcyA9IEdldEJyZWFrUG9zKGN1ckNoYXJzLCBpRW5kUG9zLCBiQWxsQ2hhcnMsIEZBTFNFKTsNCisgIGlmIChpQ2hhclBvcyA8IDApIHsNCisgICAgaUNoYXJQb3MgPSAwOw0KKyAgfQ0KKyAgaUNoYXJQb3MrKzsNCisgIGlmIChpQ2hhclBvcyA+PSBpQ291bnQpIHsNCisgICAgcE5leHRMaW5lLT5SZW1vdmVBbGwoVFJVRSk7DQorICAgIENGWF9DaGFyKiBwVEMgPSBjdXJDaGFycy5HZXREYXRhUHRyKGlDaGFyUG9zIC0gMSk7DQorICAgIHBUQy0+bV9uQnJlYWtUeXBlID0gRlhfTEJUX1VOS05PV047DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9UeHRDaGFyQXJyYXkmIG5leHRDaGFycyA9ICpwTmV4dExpbmUtPm1fcExpbmVDaGFyczsNCisgIGludCBjdXJfc2l6ZSA9IGN1ckNoYXJzLkdldFNpemUoKTsNCisgIG5leHRDaGFycy5TZXRTaXplKGN1cl9zaXplIC0gaUNoYXJQb3MpOw0KKyAgRlhTWVNfbWVtY3B5KG5leHRDaGFycy5HZXREYXRhKCksIGN1ckNoYXJzLkdldERhdGFQdHIoaUNoYXJQb3MpLA0KKyAgICAgICAgICAgICAgIChjdXJfc2l6ZSAtIGlDaGFyUG9zKSAqIHNpemVvZihDRlhfVHh0Q2hhcikpOw0KKyAgaUNvdW50IC09IGlDaGFyUG9zOw0KKyAgY3VyX3NpemUgPSBjdXJDaGFycy5HZXRTaXplKCk7DQorICBjdXJDaGFycy5SZW1vdmVBdChjdXJfc2l6ZSAtIGlDb3VudCwgaUNvdW50KTsNCisgIHBDdXJMaW5lLT5tX2lXaWR0aCA9IGlFbmRQb3M7DQorICBDRlhfVHh0Q2hhciogcFRDID0gY3VyQ2hhcnMuR2V0RGF0YVB0cihpQ2hhclBvcyAtIDEpOw0KKyAgcFRDLT5tX25CcmVha1R5cGUgPSBGWF9MQlRfVU5LTk9XTjsNCisgIGlDb3VudCA9IG5leHRDaGFycy5HZXRTaXplKCk7DQorICBpbnQzMl90IGlDaGFyV2lkdGgsIGlXaWR0aCA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBwVEMgPSBuZXh0Q2hhcnMuR2V0RGF0YVB0cihpKTsNCisgICAgaWYgKHBUQy0+R2V0Q2hhclR5cGUoKSA+PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmKSB7DQorICAgICAgcEN1ckxpbmUtPm1faUFyYWJpY0NoYXJzLS07DQorICAgICAgcE5leHRMaW5lLT5tX2lBcmFiaWNDaGFycysrOw0KKyAgICB9DQorICAgIGlDaGFyV2lkdGggPSBwVEMtPm1faUNoYXJXaWR0aDsNCisgICAgaWYgKGlDaGFyV2lkdGggPiAwKSB7DQorICAgICAgaVdpZHRoICs9IGlDaGFyV2lkdGg7DQorICAgIH0NCisgICAgaWYgKG1fYlBhZ2luYXRpb24pIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBwVEMtPm1fZHdTdGF0dXMgPSAwOw0KKyAgfQ0KKyAgcE5leHRMaW5lLT5tX2lXaWR0aCA9IGlXaWR0aDsNCit9DQoraW50MzJfdCBDRlhfVHh0QnJlYWs6OkNvdW50QnJlYWtDaGFycygpIGNvbnN0IHsNCisgIENGWF9UeHRMaW5lKiBwVHh0TGluZSA9IEdldFR4dExpbmUoVFJVRSk7DQorICByZXR1cm4gcFR4dExpbmUgPT0gTlVMTCA/IDAgOiBwVHh0TGluZS0+Q291bnRDaGFycygpOw0KK30NCitpbnQzMl90IENGWF9UeHRCcmVhazo6Q291bnRCcmVha1BpZWNlcygpIGNvbnN0IHsNCisgIENGWF9UeHRQaWVjZUFycmF5KiBwVHh0UGllY2VzID0gR2V0VHh0UGllY2VzKFRSVUUpOw0KKyAgaWYgKHBUeHRQaWVjZXMgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHJldHVybiBwVHh0UGllY2VzLT5HZXRTaXplKCk7DQorfQ0KK2NvbnN0IENGWF9UeHRQaWVjZSogQ0ZYX1R4dEJyZWFrOjpHZXRCcmVha1BpZWNlKGludDMyX3QgaW5kZXgpIGNvbnN0IHsNCisgIENGWF9UeHRQaWVjZUFycmF5KiBwVHh0UGllY2VzID0gR2V0VHh0UGllY2VzKFRSVUUpOw0KKyAgaWYgKHBUeHRQaWVjZXMgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gcFR4dFBpZWNlcy0+R2V0U2l6ZSgpKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIHBUeHRQaWVjZXMtPkdldFB0ckF0KGluZGV4KTsNCit9DQordm9pZCBDRlhfVHh0QnJlYWs6OkNsZWFyQnJlYWtQaWVjZXMoKSB7DQorICBDRlhfVHh0TGluZSogcFR4dExpbmUgPSBHZXRUeHRMaW5lKFRSVUUpOw0KKyAgaWYgKHBUeHRMaW5lICE9IE5VTEwpIHsNCisgICAgcFR4dExpbmUtPlJlbW92ZUFsbChUUlVFKTsNCisgIH0NCisgIG1faVJlYWR5ID0gMDsNCit9DQordm9pZCBDRlhfVHh0QnJlYWs6OlJlc2V0KCkgew0KKyAgbV9kd0NoYXJUeXBlID0gMDsNCisgIG1faUFyYWJpY0NvbnRleHQgPSBtX2lDdXJBcmFiaWNDb250ZXh0ID0gMTsNCisgIFJlc2V0QXJhYmljQ29udGV4dCgpOw0KKyAgbV9wVHh0TGluZTEtPlJlbW92ZUFsbChUUlVFKTsNCisgIG1fcFR4dExpbmUyLT5SZW1vdmVBbGwoVFJVRSk7DQorfQ0KK3R5cGVkZWYgc3RydWN0IF9GWF9GT1JNQ0hBUiB7DQorICBGWF9XT1JEIHdjaDsNCisgIEZYX1dPUkQgd0Zvcm07DQorICBpbnQzMl90IGlXaWR0aDsNCit9IEZYX0ZPUk1DSEFSLCAqRlhfTFBGT1JNQ0hBUjsNCit0eXBlZGVmIEZYX0ZPUk1DSEFSIGNvbnN0KiBGWF9MUENGT1JNQ0hBUjsNCitpbnQzMl90IENGWF9UeHRCcmVhazo6R2V0RGlzcGxheVBvcyhGWF9MUENUWFRSVU4gcFR4dFJ1biwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcqIHBXU0Zvcm1zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FkanVzdENoYXJEaXNwbGF5UG9zIHBBZGp1c3RQb3MpIGNvbnN0IHsNCisgIGlmIChwVHh0UnVuID09IE5VTEwgfHwgcFR4dFJ1bi0+aUxlbmd0aCA8IDEpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBJRlhfVHh0QWNjZXNzKiBwQWNjZXNzID0gcFR4dFJ1bi0+cEFjY2VzczsNCisgIHZvaWQqIHBJZGVudGl0eSA9IHBUeHRSdW4tPnBJZGVudGl0eTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwU3RyID0gcFR4dFJ1bi0+cFN0cjsNCisgIGludDMyX3QqIHBXaWR0aHMgPSBwVHh0UnVuLT5wV2lkdGhzOw0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcFR4dFJ1bi0+aUxlbmd0aCAtIDE7DQorICBJRlhfRm9udCogcEZvbnQgPSBwVHh0UnVuLT5wRm9udDsNCisgIEZYX0RXT1JEIGR3U3R5bGVzID0gcFR4dFJ1bi0+ZHdTdHlsZXM7DQorICBDRlhfUmVjdEYgcnRUZXh0KCpwVHh0UnVuLT5wUmVjdCk7DQorICBGWF9CT09MIGJSVExQaWVjZSA9DQorICAgICAgKHBUeHRSdW4tPmR3Q2hhclN0eWxlcyAmIEZYX1RYVENIQVJTVFlMRV9PZGRCaWRpTGV2ZWwpICE9IDA7DQorICBGWF9CT09MIGJBcmFiaWNOdW1iZXIgPQ0KKyAgICAgIChwVHh0UnVuLT5kd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfQXJhYmljTnVtYmVyKSAhPSAwOw0KKyAgRlhfQk9PTCBiQXJhYmljQ29tbWEgPQ0KKyAgICAgIChwVHh0UnVuLT5kd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfQXJhYmljQ29tbWEpICE9IDA7DQorICBGWF9GTE9BVCBmRm9udFNpemUgPSBwVHh0UnVuLT5mRm9udFNpemU7DQorICBpbnQzMl90IGlGb250U2l6ZSA9IEZYU1lTX3JvdW5kKGZGb250U2l6ZSAqIDIwLjBmKTsNCisgIGludDMyX3QgaUFzY2VudCA9IHBGb250LT5HZXRBc2NlbnQoKTsNCisgIGludDMyX3QgaURlc2NlbnQgPSBwRm9udC0+R2V0RGVzY2VudCgpOw0KKyAgaW50MzJfdCBpTWF4SGVpZ2h0ID0gaUFzY2VudCAtIGlEZXNjZW50Ow0KKyAgRlhfRkxPQVQgZkZvbnRIZWlnaHQgPSBmRm9udFNpemU7DQorICBGWF9GTE9BVCBmQXNjZW50ID0gZkZvbnRIZWlnaHQgKiAoRlhfRkxPQVQpaUFzY2VudCAvIChGWF9GTE9BVClpTWF4SGVpZ2h0Ow0KKyAgRlhfRkxPQVQgZkRlc2NlbnQgPSBmRm9udEhlaWdodCAqIChGWF9GTE9BVClpRGVzY2VudCAvIChGWF9GTE9BVClpTWF4SGVpZ2h0Ow0KKyAgRlhfQk9PTCBiVmVydGljYWxEb2MgPSAoZHdTdHlsZXMgJiBGWF9UWFRMQVlPVVRTVFlMRV9WZXJ0aWNhbExheW91dCkgIT0gMDsNCisgIEZYX0JPT0wgYlZlcnRpY2FsQ2hhciA9IChkd1N0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX1ZlcnRpY2FsQ2hhcnMpICE9IDA7DQorICBpbnQzMl90IGlSb3RhdGlvbiA9IEdldExpbmVSb3RhdGlvbihkd1N0eWxlcykgKyBwVHh0UnVuLT5pQ2hhclJvdGF0aW9uOw0KKyAgaW50MzJfdCBpQ2hhclJvdGF0aW9uOw0KKyAgRlhfV0NIQVIgd2NoLCB3UHJldiA9IDB4RkVGRiwgd05leHQsIHdGb3JtLCB3TGFzdCA9IDB4RkVGRjsNCisgIGludDMyX3QgaVdpZHRoLCBpQ2hhcldpZHRoLCBpQ2hhckhlaWdodDsNCisgIEZYX0ZMT0FUIGZYLCBmWSwgZkNoYXJXaWR0aCwgZkNoYXJIZWlnaHQ7DQorICBpbnQzMl90IGlIb3JTY2FsZSA9IHBUeHRSdW4tPmlIb3Jpem9udGFsU2NhbGU7DQorICBpbnQzMl90IGlWZXJTY2FsZSA9IHBUeHRSdW4tPmlWZXJ0aWNhbFNjYWxlOw0KKyAgRlhfQk9PTCBiU2tpcFNwYWNlID0gcFR4dFJ1bi0+YlNraXBTcGFjZTsNCisgIEZYX0JPT0wgYkVtcHR5Q2hhciwgYlNoYWRkYSA9IEZBTFNFLCBiTGFtID0gRkFMU0U7DQorICBGWF9EV09SRCBkd1Byb3BzLCBkd0NoYXJUeXBlOw0KKyAgRlhfRk9STUNIQVIgZm9ybUNoYXJzWzNdOw0KKyAgRlhfRkxPQVQgZllCYXNlOw0KKyAgZlggPSBydFRleHQubGVmdDsNCisgIGlmIChiVmVydGljYWxEb2MpIHsNCisgICAgZlggKz0gKHJ0VGV4dC53aWR0aCAtIGZGb250U2l6ZSkgLyAyLjBmOw0KKyAgICBmWUJhc2UgPSBiUlRMUGllY2UgPyBydFRleHQuYm90dG9tKCkgOiBydFRleHQudG9wOw0KKyAgICBmWSA9IGZZQmFzZTsNCisgIH0gZWxzZSB7DQorICAgIGlmIChiUlRMUGllY2UpIHsNCisgICAgICBmWCA9IHJ0VGV4dC5yaWdodCgpOw0KKyAgICB9DQorICAgIGZZQmFzZSA9IHJ0VGV4dC50b3AgKyAocnRUZXh0LmhlaWdodCAtIGZGb250U2l6ZSkgLyAyLjBmOw0KKyAgICBmWSA9IGZZQmFzZSArIGZBc2NlbnQ7DQorICB9DQorICBpbnQzMl90IGlDb3VudCA9IDAsIGlOZXh0LCBpRm9ybXM7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPD0gaUxlbmd0aDsgaSsrKSB7DQorICAgIGlmIChwQWNjZXNzICE9IE5VTEwpIHsNCisgICAgICB3Y2ggPSBwQWNjZXNzLT5HZXRDaGFyKHBJZGVudGl0eSwgaSk7DQorICAgICAgaVdpZHRoID0gcEFjY2Vzcy0+R2V0V2lkdGgocElkZW50aXR5LCBpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICB3Y2ggPSAqcFN0cisrOw0KKyAgICAgIGlXaWR0aCA9ICpwV2lkdGhzKys7DQorICAgIH0NCisgICAgZHdQcm9wcyA9IEZYX0dldFVuaWNvZGVQcm9wZXJ0aWVzKHdjaCk7DQorICAgIGR3Q2hhclR5cGUgPSAoZHdQcm9wcyAmIEZYX0NIQVJUWVBFQklUU01BU0spOw0KKyAgICBpZiAoZHdDaGFyVHlwZSA9PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmICYmIGlXaWR0aCA9PSAwKSB7DQorICAgICAgd1ByZXYgPSAweEZFRkY7DQorICAgICAgd0xhc3QgPSB3Y2g7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKGR3Q2hhclR5cGUgPj0gRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikgew0KKyAgICAgIGlmIChpIDwgaUxlbmd0aCkgew0KKyAgICAgICAgaWYgKHBBY2Nlc3MgIT0gTlVMTCkgew0KKyAgICAgICAgICBpTmV4dCA9IGkgKyAxOw0KKyAgICAgICAgICB3aGlsZSAoaU5leHQgPD0gaUxlbmd0aCkgew0KKyAgICAgICAgICAgIHdOZXh0ID0gcEFjY2Vzcy0+R2V0Q2hhcihwSWRlbnRpdHksIGlOZXh0KTsNCisgICAgICAgICAgICBkd1Byb3BzID0gRlhfR2V0VW5pY29kZVByb3BlcnRpZXMod05leHQpOw0KKyAgICAgICAgICAgIGlmICgoZHdQcm9wcyAmIEZYX0NIQVJUWVBFQklUU01BU0spICE9IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uKSB7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaU5leHQrKzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaU5leHQgPiBpTGVuZ3RoKSB7DQorICAgICAgICAgICAgd05leHQgPSAweEZFRkY7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGludDMyX3QgaiA9IC0xOw0KKyAgICAgICAgICBkbyB7DQorICAgICAgICAgICAgaisrOw0KKyAgICAgICAgICAgIGlmIChpICsgaiA+PSBpTGVuZ3RoKSB7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgd05leHQgPSBwU3RyW2pdOw0KKyAgICAgICAgICAgIGR3UHJvcHMgPSBGWF9HZXRVbmljb2RlUHJvcGVydGllcyh3TmV4dCk7DQorICAgICAgICAgIH0gd2hpbGUgKChkd1Byb3BzICYgRlhfQ0hBUlRZUEVCSVRTTUFTSykgPT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pOw0KKyAgICAgICAgICBpZiAoaSArIGogPj0gaUxlbmd0aCkgew0KKyAgICAgICAgICAgIHdOZXh0ID0gMHhGRUZGOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHdOZXh0ID0gMHhGRUZGOw0KKyAgICAgIH0NCisgICAgICB3Rm9ybSA9IG1fcEFyYWJpY0NoYXItPkdldEZvcm1DaGFyKHdjaCwgd1ByZXYsIHdOZXh0KTsNCisgICAgICBiTGFtID0gKHdQcmV2ID09IDB4MDY0NCAmJiB3Y2ggPT0gMHgwNjQ0ICYmIHdOZXh0ID09IDB4MDY0Nyk7DQorICAgIH0gZWxzZSBpZiAoZHdDaGFyVHlwZSA9PSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbikgew0KKyAgICAgIHdGb3JtID0gd2NoOw0KKyAgICAgIGlmICh3Y2ggPj0gMHgwNjRDICYmIHdjaCA8PSAweDA2NTEpIHsNCisgICAgICAgIGlmIChiU2hhZGRhKSB7DQorICAgICAgICAgIHdGb3JtID0gMHhGRUZGOw0KKyAgICAgICAgICBiU2hhZGRhID0gRkFMU0U7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICB3TmV4dCA9IDB4RkVGRjsNCisgICAgICAgICAgaWYgKHBBY2Nlc3MgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIGlOZXh0ID0gaSArIDE7DQorICAgICAgICAgICAgaWYgKGlOZXh0IDw9IGlMZW5ndGgpIHsNCisgICAgICAgICAgICAgIHdOZXh0ID0gcEFjY2Vzcy0+R2V0Q2hhcihwSWRlbnRpdHksIGlOZXh0KTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKGkgPCBpTGVuZ3RoKSB7DQorICAgICAgICAgICAgICB3TmV4dCA9ICpwU3RyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAod2NoID09IDB4MDY1MSkgew0KKyAgICAgICAgICAgIGlmICh3TmV4dCA+PSAweDA2NEMgJiYgd05leHQgPD0gMHgwNjUwKSB7DQorICAgICAgICAgICAgICB3Rm9ybSA9IEZYX0dldEFyYWJpY0Zyb21TaGFkZGFUYWJsZSh3TmV4dCk7DQorICAgICAgICAgICAgICBiU2hhZGRhID0gVFJVRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKHdOZXh0ID09IDB4MDY1MSkgew0KKyAgICAgICAgICAgICAgd0Zvcm0gPSBGWF9HZXRBcmFiaWNGcm9tU2hhZGRhVGFibGUod2NoKTsNCisgICAgICAgICAgICAgIGJTaGFkZGEgPSBUUlVFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBiU2hhZGRhID0gRkFMU0U7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGR3Q2hhclR5cGUgPT0gRlhfQ0hBUlRZUEVfTnVtZXJpYykgew0KKyAgICAgIHdGb3JtID0gd2NoOw0KKyAgICAgIGlmIChiQXJhYmljTnVtYmVyKSB7DQorICAgICAgICB3Rm9ybSArPSAweDA2MzA7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKHdjaCA9PSBMJy4nKSB7DQorICAgICAgd0Zvcm0gPSB3Y2g7DQorICAgICAgaWYgKGJBcmFiaWNOdW1iZXIpIHsNCisgICAgICAgIHdOZXh0ID0gMHhGRUZGOw0KKyAgICAgICAgaWYgKHBBY2Nlc3MgIT0gTlVMTCkgew0KKyAgICAgICAgICBpTmV4dCA9IGkgKyAxOw0KKyAgICAgICAgICBpZiAoaU5leHQgPD0gaUxlbmd0aCkgew0KKyAgICAgICAgICAgIHdOZXh0ID0gcEFjY2Vzcy0+R2V0Q2hhcihwSWRlbnRpdHksIGlOZXh0KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgaWYgKGkgPCBpTGVuZ3RoKSB7DQorICAgICAgICAgICAgd05leHQgPSAqcFN0cjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHdOZXh0ID49IEwnMCcgJiYgd05leHQgPD0gTCc5Jykgew0KKyAgICAgICAgICB3Rm9ybSA9IDB4MDY2QjsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAod2NoID09IEwnLCcpIHsNCisgICAgICB3Rm9ybSA9IHdjaDsNCisgICAgICBpZiAoYkFyYWJpY0NvbW1hKSB7DQorICAgICAgICB3Rm9ybSA9IDB4MDYwQzsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoYlJUTFBpZWNlIHx8IGJWZXJ0aWNhbENoYXIpIHsNCisgICAgICB3Rm9ybSA9IEZYX0dldE1pcnJvckNoYXIod2NoLCBkd1Byb3BzLCBiUlRMUGllY2UsIGJWZXJ0aWNhbENoYXIpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHdGb3JtID0gd2NoOw0KKyAgICB9DQorICAgIGlmIChkd0NoYXJUeXBlICE9IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uKSB7DQorICAgICAgYlNoYWRkYSA9IEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChkd0NoYXJUeXBlIDwgRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikgew0KKyAgICAgIGJMYW0gPSBGQUxTRTsNCisgICAgfQ0KKyAgICBkd1Byb3BzID0gRlhfR2V0VW5pY29kZVByb3BlcnRpZXMod0Zvcm0pOw0KKyAgICBpQ2hhclJvdGF0aW9uID0gaVJvdGF0aW9uOw0KKyAgICBpZiAoYlZlcnRpY2FsQ2hhciAmJiAoZHdQcm9wcyAmIDB4ODAwMCkgIT0gMCkgew0KKyAgICAgIGlDaGFyUm90YXRpb24rKzsNCisgICAgfQ0KKyAgICBpQ2hhclJvdGF0aW9uICU9IDQ7DQorICAgIGJFbXB0eUNoYXIgPQ0KKyAgICAgICAgKGR3Q2hhclR5cGUgPj0gRlhfQ0hBUlRZUEVfVGFiICYmIGR3Q2hhclR5cGUgPD0gRlhfQ0hBUlRZUEVfQ29udHJvbCk7DQorICAgIGlmICh3Rm9ybSA9PSAweEZFRkYpIHsNCisgICAgICBiRW1wdHlDaGFyID0gVFJVRTsNCisgICAgfQ0KKyAgICBpRm9ybXMgPSBiTGFtID8gMyA6IDE7DQorICAgIGlDb3VudCArPSAoYkVtcHR5Q2hhciAmJiBiU2tpcFNwYWNlKSA/IDAgOiBpRm9ybXM7DQorICAgIGlmIChwQ2hhclBvcyA9PSBOVUxMKSB7DQorICAgICAgaWYgKGlXaWR0aCA+IDApIHsNCisgICAgICAgIHdQcmV2ID0gd2NoOw0KKyAgICAgIH0NCisgICAgICB3TGFzdCA9IHdjaDsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpQ2hhcldpZHRoID0gaVdpZHRoOw0KKyAgICBpZiAoaUNoYXJXaWR0aCA8IDApIHsNCisgICAgICBpQ2hhcldpZHRoID0gLWlDaGFyV2lkdGg7DQorICAgIH0NCisgICAgaUNoYXJXaWR0aCAvPSBpRm9udFNpemU7DQorICAgIGZvcm1DaGFyc1swXS53Y2ggPSB3Y2g7DQorICAgIGZvcm1DaGFyc1swXS53Rm9ybSA9IHdGb3JtOw0KKyAgICBmb3JtQ2hhcnNbMF0uaVdpZHRoID0gaUNoYXJXaWR0aDsNCisgICAgaWYgKGJMYW0pIHsNCisgICAgICBmb3JtQ2hhcnNbMV0ud0Zvcm0gPSAweDA2NTE7DQorICAgICAgaUNoYXJXaWR0aCA9IDA7DQorICAgICAgcEZvbnQtPkdldENoYXJXaWR0aCgweDA2NTEsIGlDaGFyV2lkdGgsIEZBTFNFKTsNCisgICAgICBmb3JtQ2hhcnNbMV0uaVdpZHRoID0gaUNoYXJXaWR0aDsNCisgICAgICBmb3JtQ2hhcnNbMl0ud0Zvcm0gPSAweDA2NzA7DQorICAgICAgaUNoYXJXaWR0aCA9IDA7DQorICAgICAgcEZvbnQtPkdldENoYXJXaWR0aCgweDA2NzAsIGlDaGFyV2lkdGgsIEZBTFNFKTsNCisgICAgICBmb3JtQ2hhcnNbMl0uaVdpZHRoID0gaUNoYXJXaWR0aDsNCisgICAgfQ0KKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpRm9ybXM7IGorKykgew0KKyAgICAgIHdGb3JtID0gKEZYX1dDSEFSKWZvcm1DaGFyc1tqXS53Rm9ybTsNCisgICAgICBpQ2hhcldpZHRoID0gZm9ybUNoYXJzW2pdLmlXaWR0aDsNCisgICAgICBpZiAoaiA+IDApIHsNCisgICAgICAgIGR3Q2hhclR5cGUgPSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbjsNCisgICAgICAgIHdjaCA9IHdGb3JtOw0KKyAgICAgICAgd0xhc3QgPSAoRlhfV0NIQVIpZm9ybUNoYXJzW2ogLSAxXS53Rm9ybTsNCisgICAgICB9DQorICAgICAgaWYgKCFiRW1wdHlDaGFyIHx8IChiRW1wdHlDaGFyICYmICFiU2tpcFNwYWNlKSkgew0KKyAgICAgICAgcENoYXJQb3MtPm1fR2x5cGhJbmRleCA9DQorICAgICAgICAgICAgYkNoYXJDb2RlID8gd2NoIDogcEZvbnQtPkdldEdseXBoSW5kZXgod0Zvcm0sIEZBTFNFKTsNCisgICAgICAgIHBDaGFyUG9zLT5tX0V4dEdJRCA9IHBDaGFyUG9zLT5tX0dseXBoSW5kZXg7DQorICAgICAgICBwQ2hhclBvcy0+bV9Gb250Q2hhcldpZHRoID0gaUNoYXJXaWR0aDsNCisgICAgICAgIGlmIChwV1NGb3Jtcykgew0KKyAgICAgICAgICAqcFdTRm9ybXMgKz0gd0Zvcm07DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmIChiVmVydGljYWxEb2MpIHsNCisgICAgICAgIGlDaGFySGVpZ2h0ID0gaUNoYXJXaWR0aDsNCisgICAgICAgIGlDaGFyV2lkdGggPSAxMDAwOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpQ2hhckhlaWdodCA9IDEwMDA7DQorICAgICAgfQ0KKyAgICAgIGZDaGFyV2lkdGggPSBmRm9udFNpemUgKiBpQ2hhcldpZHRoIC8gMTAwMC4wZjsNCisgICAgICBmQ2hhckhlaWdodCA9IGZGb250U2l6ZSAqIGlDaGFySGVpZ2h0IC8gMTAwMC4wZjsNCisgICAgICBpZiAoYlJUTFBpZWNlICYmIGR3Q2hhclR5cGUgIT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pIHsNCisgICAgICAgIGlmIChiVmVydGljYWxEb2MpIHsNCisgICAgICAgICAgZlkgLT0gZkNoYXJIZWlnaHQ7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBmWCAtPSBmQ2hhcldpZHRoOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoIWJFbXB0eUNoYXIgfHwgKGJFbXB0eUNoYXIgJiYgIWJTa2lwU3BhY2UpKSB7DQorICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5YID0gZlg7DQorICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZID0gZlk7DQorICAgICAgICBpZiAoKGR3U3R5bGVzICYgRlhfVFhUTEFZT1VUU1RZTEVfQ29tYlRleHQpICE9IDApIHsNCisgICAgICAgICAgaW50MzJfdCBpRm9ybVdpZHRoID0gaUNoYXJXaWR0aDsNCisgICAgICAgICAgcEZvbnQtPkdldENoYXJXaWR0aCh3Rm9ybSwgaUZvcm1XaWR0aCwgRkFMU0UpOw0KKyAgICAgICAgICBGWF9GTE9BVCBmT2Zmc2V0ID0gZkZvbnRTaXplICogKGlDaGFyV2lkdGggLSBpRm9ybVdpZHRoKSAvIDIwMDAuMGY7DQorICAgICAgICAgIGlmIChiVmVydGljYWxEb2MpIHsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZICs9IGZPZmZzZXQ7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWCArPSBmT2Zmc2V0Ow0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoZHdDaGFyVHlwZSA9PSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbikgew0KKyAgICAgICAgICBDRlhfUmVjdCBydEJCb3g7DQorICAgICAgICAgIHJ0QkJveC5SZXNldCgpOw0KKyAgICAgICAgICBpZiAocEZvbnQtPkdldENoYXJCQm94KHdGb3JtLCBydEJCb3gsIEZBTFNFKSkgew0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblkgPQ0KKyAgICAgICAgICAgICAgICBmWUJhc2UgKyBmRm9udFNpemUgLQ0KKyAgICAgICAgICAgICAgICBmRm9udFNpemUgKiAoRlhfRkxPQVQpcnRCQm94LmhlaWdodCAvIChGWF9GTE9BVClpTWF4SGVpZ2h0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmICh3Rm9ybSA9PSB3Y2ggJiYgd0xhc3QgIT0gMHhGRUZGKSB7DQorICAgICAgICAgICAgRlhfRFdPUkQgZHdMYXN0UHJvcHMgPSBGWF9HZXRVbmljb2RlUHJvcGVydGllcyh3TGFzdCk7DQorICAgICAgICAgICAgaWYgKChkd0xhc3RQcm9wcyAmIEZYX0NIQVJUWVBFQklUU01BU0spID09DQorICAgICAgICAgICAgICAgIEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uKSB7DQorICAgICAgICAgICAgICBDRlhfUmVjdCBydEJCb3g7DQorICAgICAgICAgICAgICBydEJCb3guUmVzZXQoKTsNCisgICAgICAgICAgICAgIGlmIChwRm9udC0+R2V0Q2hhckJCb3god0xhc3QsIHJ0QkJveCwgRkFMU0UpKSB7DQorICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblkgLT0gZkZvbnRTaXplICogcnRCQm94LmhlaWdodCAvIGlNYXhIZWlnaHQ7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBDRlhfUG9pbnRGIHB0T2Zmc2V0Ow0KKyAgICAgICAgcHRPZmZzZXQuUmVzZXQoKTsNCisgICAgICAgIEZYX0JPT0wgYkFkanVzdGVkID0gRkFMU0U7DQorICAgICAgICBpZiAocEFkanVzdFBvcykgew0KKyAgICAgICAgICBiQWRqdXN0ZWQgPSBwQWRqdXN0UG9zKHdGb3JtLCBiQ2hhckNvZGUsIHBGb250LCBmRm9udFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZlcnRpY2FsQ2hhciwgcHRPZmZzZXQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFiQWRqdXN0ZWQgJiYgYlZlcnRpY2FsQ2hhciAmJiAoZHdQcm9wcyAmIDB4MDAwMTAwMDApICE9IDApIHsNCisgICAgICAgICAgQ0ZYX1JlY3QgcnRCQm94Ow0KKyAgICAgICAgICBydEJCb3guUmVzZXQoKTsNCisgICAgICAgICAgaWYgKHBGb250LT5HZXRDaGFyQkJveCh3Rm9ybSwgcnRCQm94LCBGQUxTRSkpIHsNCisgICAgICAgICAgICBwdE9mZnNldC54ID0gZkZvbnRTaXplICogKDg1MCAtIHJ0QkJveC5yaWdodCgpKSAvIGlNYXhIZWlnaHQ7DQorICAgICAgICAgICAgcHRPZmZzZXQueSA9IGZGb250U2l6ZSAqIChpQXNjZW50IC0gcnRCQm94LnRvcCAtIDE1MCkgLyBpTWF4SGVpZ2h0Ow0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5YICs9IHB0T2Zmc2V0Lng7DQorICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZIC09IHB0T2Zmc2V0Lnk7DQorICAgICAgfQ0KKyAgICAgIGlmICghYlJUTFBpZWNlICYmIGR3Q2hhclR5cGUgIT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pIHsNCisgICAgICAgIGlmIChiVmVydGljYWxEb2MpIHsNCisgICAgICAgICAgZlkgKz0gZkNoYXJIZWlnaHQ7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBmWCArPSBmQ2hhcldpZHRoOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoIWJFbXB0eUNoYXIgfHwgKGJFbXB0eUNoYXIgJiYgIWJTa2lwU3BhY2UpKSB7DQorICAgICAgICBwQ2hhclBvcy0+bV9iR2x5cGhBZGp1c3QgPSBUUlVFOw0KKyAgICAgICAgaWYgKGJWZXJ0aWNhbERvYykgew0KKyAgICAgICAgICBpZiAoaUNoYXJSb3RhdGlvbiA9PSAwKSB7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0gLTE7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gMDsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPSAwOw0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IDE7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWSArPSBmQXNjZW50Ow0KKyAgICAgICAgICB9IGVsc2UgaWYgKGlDaGFyUm90YXRpb24gPT0gMSkgew0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IDA7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gLTE7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gLTE7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0gMDsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5YIC09IGZEZXNjZW50Ow0KKyAgICAgICAgICB9IGVsc2UgaWYgKGlDaGFyUm90YXRpb24gPT0gMikgew0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IDE7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gMDsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPSAwOw0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IC0xOw0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpblggKz0gZkNoYXJXaWR0aDsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZICs9IGZBc2NlbnQ7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0gMDsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSAxOw0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IDE7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0gMDsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5YICs9IGZBc2NlbnQ7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGlmIChpQ2hhclJvdGF0aW9uID09IDApIHsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gPSAtMTsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSAwOw0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IDA7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0gMTsNCisgICAgICAgICAgfSBlbHNlIGlmIChpQ2hhclJvdGF0aW9uID09IDEpIHsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gPSAwOw0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9IC0xOw0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IC0xOw0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IDA7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWCAtPSBmRGVzY2VudDsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5ZIC09IGZBc2NlbnQgKyBmRGVzY2VudDsNCisgICAgICAgICAgfSBlbHNlIGlmIChpQ2hhclJvdGF0aW9uID09IDIpIHsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gPSAxOw0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9IDA7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gMDsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM10gPSAtMTsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW5YICs9IGZDaGFyV2lkdGg7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWSAtPSBmQXNjZW50Ow0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IDA7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gMTsNCisgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPSAxOw0KKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IDA7DQorICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luWCArPSBmQXNjZW50Ow0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoaUhvclNjYWxlICE9IDEwMCB8fCBpVmVyU2NhbGUgIT0gMTAwKSB7DQorICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gKiBpSG9yU2NhbGUgLyAxMDAuMGY7DQorICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gKiBpSG9yU2NhbGUgLyAxMDAuMGY7DQorICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gKiBpVmVyU2NhbGUgLyAxMDAuMGY7DQorICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9DQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM10gKiBpVmVyU2NhbGUgLyAxMDAuMGY7DQorICAgICAgICB9DQorICAgICAgICBwQ2hhclBvcysrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoaVdpZHRoID4gMCkgew0KKyAgICAgIHdQcmV2ID0gKEZYX1dDSEFSKWZvcm1DaGFyc1swXS53Y2g7DQorICAgIH0NCisgICAgd0xhc3QgPSB3Y2g7DQorICB9DQorICByZXR1cm4gaUNvdW50Ow0KK30NCitpbnQzMl90IENGWF9UeHRCcmVhazo6R2V0Q2hhclJlY3RzKEZYX0xQQ1RYVFJVTiBwVHh0UnVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGQXJyYXkmIHJ0QXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGFyQkJveCkgY29uc3Qgew0KKyAgaWYgKHBUeHRSdW4gPT0gTlVMTCB8fCBwVHh0UnVuLT5pTGVuZ3RoIDwgMSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIElGWF9UeHRBY2Nlc3MqIHBBY2Nlc3MgPSBwVHh0UnVuLT5wQWNjZXNzOw0KKyAgdm9pZCogcElkZW50aXR5ID0gcFR4dFJ1bi0+cElkZW50aXR5Ow0KKyAgY29uc3QgRlhfV0NIQVIqIHBTdHIgPSBwVHh0UnVuLT5wU3RyOw0KKyAgaW50MzJfdCogcFdpZHRocyA9IHBUeHRSdW4tPnBXaWR0aHM7DQorICBpbnQzMl90IGlMZW5ndGggPSBwVHh0UnVuLT5pTGVuZ3RoOw0KKyAgQ0ZYX1JlY3RGIHJlY3QoKnBUeHRSdW4tPnBSZWN0KTsNCisgIEZYX0JPT0wgYlJUTFBpZWNlID0NCisgICAgICAocFR4dFJ1bi0+ZHdDaGFyU3R5bGVzICYgRlhfVFhUQ0hBUlNUWUxFX09kZEJpZGlMZXZlbCkgIT0gMDsNCisgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IHBUeHRSdW4tPmZGb250U2l6ZTsNCisgIGludDMyX3QgaUZvbnRTaXplID0gRlhTWVNfcm91bmQoZkZvbnRTaXplICogMjAuMGYpOw0KKyAgRlhfRkxPQVQgZlNjYWxlID0gZkZvbnRTaXplIC8gMTAwMC4wZjsNCisgIElGWF9Gb250KiBwRm9udCA9IHBUeHRSdW4tPnBGb250Ow0KKyAgaWYgKHBGb250ID09IE5VTEwpIHsNCisgICAgYkNoYXJCQm94ID0gRkFMU0U7DQorICB9DQorICBDRlhfUmVjdCBiYm94Ow0KKyAgYmJveC5TZXQoMCwgMCwgMCwgMCk7DQorICBpZiAoYkNoYXJCQm94KSB7DQorICAgIGJDaGFyQkJveCA9IHBGb250LT5HZXRCQm94KGJib3gpOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZkxlZnQgPSBzdGQ6Om1heCgwLjBmLCBiYm94LmxlZnQgKiBmU2NhbGUpOw0KKyAgRlhfRkxPQVQgZkhlaWdodCA9IEZYU1lTX2ZhYnMoYmJveC5oZWlnaHQgKiBmU2NhbGUpOw0KKyAgcnRBcnJheS5SZW1vdmVBbGwoKTsNCisgIHJ0QXJyYXkuU2V0U2l6ZShpTGVuZ3RoKTsNCisgIEZYX0JPT0wgYlZlcnRpY2FsID0NCisgICAgICAocFR4dFJ1bi0+ZHdTdHlsZXMgJiBGWF9UWFRMQVlPVVRTVFlMRV9WZXJ0aWNhbExheW91dCkgIT0gMDsNCisgIEZYX0JPT0wgYlNpbmdsZUxpbmUgPSAocFR4dFJ1bi0+ZHdTdHlsZXMgJiBGWF9UWFRMQVlPVVRTVFlMRV9TaW5nbGVMaW5lKSAhPSAwOw0KKyAgRlhfQk9PTCBiQ29tYlRleHQgPSAocFR4dFJ1bi0+ZHdTdHlsZXMgJiBGWF9UWFRMQVlPVVRTVFlMRV9Db21iVGV4dCkgIT0gMDsNCisgIEZYX1dDSEFSIHdjaCwgd0xpbmVCcmVha0NoYXIgPSBwVHh0UnVuLT53TGluZUJyZWFrQ2hhcjsNCisgIGludDMyX3QgaUNoYXJTaXplOw0KKyAgRlhfRkxPQVQgZkNoYXJTaXplLCBmU3RhcnQ7DQorICBpZiAoYlZlcnRpY2FsKSB7DQorICAgIGZTdGFydCA9IGJSVExQaWVjZSA/IHJlY3QuYm90dG9tKCkgOiByZWN0LnRvcDsNCisgIH0gZWxzZSB7DQorICAgIGZTdGFydCA9IGJSVExQaWVjZSA/IHJlY3QucmlnaHQoKSA6IHJlY3QubGVmdDsNCisgIH0NCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMZW5ndGg7IGkrKykgew0KKyAgICBpZiAocEFjY2VzcyAhPSBOVUxMKSB7DQorICAgICAgd2NoID0gcEFjY2Vzcy0+R2V0Q2hhcihwSWRlbnRpdHksIGkpOw0KKyAgICAgIGlDaGFyU2l6ZSA9IHBBY2Nlc3MtPkdldFdpZHRoKHBJZGVudGl0eSwgaSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgd2NoID0gKnBTdHIrKzsNCisgICAgICBpQ2hhclNpemUgPSAqcFdpZHRocysrOw0KKyAgICB9DQorICAgIGZDaGFyU2l6ZSA9IChGWF9GTE9BVClpQ2hhclNpemUgLyAyMDAwMC4wZjsNCisgICAgRlhfQk9PTCBiUmV0ID0gKCFiU2luZ2xlTGluZSAmJiBGWF9Jc0N0cmxDb2RlKHdjaCkpOw0KKyAgICBpZiAoISh3Y2ggPT0gTCdcdicgfHwgd2NoID09IEwnXGYnIHx8IHdjaCA9PSAweDIwMjggfHwgd2NoID09IDB4MjAyOSB8fA0KKyAgICAgICAgICAod0xpbmVCcmVha0NoYXIgIT0gMHhGRUZGICYmIHdjaCA9PSB3TGluZUJyZWFrQ2hhcikpKSB7DQorICAgICAgYlJldCA9IEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChiUmV0KSB7DQorICAgICAgaUNoYXJTaXplID0gaUZvbnRTaXplICogNTAwOw0KKyAgICAgIGZDaGFyU2l6ZSA9IGZGb250U2l6ZSAvIDIuMGY7DQorICAgIH0NCisgICAgaWYgKGJWZXJ0aWNhbCkgew0KKyAgICAgIHJlY3QudG9wID0gZlN0YXJ0Ow0KKyAgICAgIGlmIChiUlRMUGllY2UpIHsNCisgICAgICAgIHJlY3QudG9wIC09IGZDaGFyU2l6ZTsNCisgICAgICAgIGZTdGFydCAtPSBmQ2hhclNpemU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGZTdGFydCArPSBmQ2hhclNpemU7DQorICAgICAgfQ0KKyAgICAgIHJlY3QuaGVpZ2h0ID0gZkNoYXJTaXplOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJlY3QubGVmdCA9IGZTdGFydDsNCisgICAgICBpZiAoYlJUTFBpZWNlKSB7DQorICAgICAgICByZWN0LmxlZnQgLT0gZkNoYXJTaXplOw0KKyAgICAgICAgZlN0YXJ0IC09IGZDaGFyU2l6ZTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgZlN0YXJ0ICs9IGZDaGFyU2l6ZTsNCisgICAgICB9DQorICAgICAgcmVjdC53aWR0aCA9IGZDaGFyU2l6ZTsNCisgICAgfQ0KKyAgICBpZiAoYkNoYXJCQm94ICYmICFiUmV0KSB7DQorICAgICAgaW50MzJfdCBpQ2hhcldpZHRoID0gMTAwMDsNCisgICAgICBwRm9udC0+R2V0Q2hhcldpZHRoKHdjaCwgaUNoYXJXaWR0aCk7DQorICAgICAgRlhfRkxPQVQgZlJUTGVmdCA9IDAsIGZDaGFyV2lkdGggPSAwOw0KKyAgICAgIGlmIChpQ2hhcldpZHRoID4gMCkgew0KKyAgICAgICAgZkNoYXJXaWR0aCA9IGlDaGFyV2lkdGggKiBmU2NhbGU7DQorICAgICAgICBmUlRMZWZ0ID0gZkxlZnQ7DQorICAgICAgICBpZiAoYkNvbWJUZXh0KSB7DQorICAgICAgICAgIGZSVExlZnQgPSAocmVjdC53aWR0aCAtIGZDaGFyV2lkdGgpIC8gMi4wZjsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgQ0ZYX1JlY3RGIHJ0QkJveEY7DQorICAgICAgaWYgKGJWZXJ0aWNhbCkgew0KKyAgICAgICAgcnRCQm94Ri50b3AgPSByZWN0LmxlZnQgKyBmUlRMZWZ0Ow0KKyAgICAgICAgcnRCQm94Ri5sZWZ0ID0gcmVjdC50b3AgKyAocmVjdC5oZWlnaHQgLSBmSGVpZ2h0KSAvIDIuMGY7DQorICAgICAgICBydEJCb3hGLmhlaWdodCA9IGZDaGFyV2lkdGg7DQorICAgICAgICBydEJCb3hGLndpZHRoID0gZkhlaWdodDsNCisgICAgICAgIHJ0QkJveEYubGVmdCA9IHN0ZDo6bWF4KHJ0QkJveEYubGVmdCwgMC4wZik7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJ0QkJveEYubGVmdCA9IHJlY3QubGVmdCArIGZSVExlZnQ7DQorICAgICAgICBydEJCb3hGLnRvcCA9IHJlY3QudG9wICsgKHJlY3QuaGVpZ2h0IC0gZkhlaWdodCkgLyAyLjBmOw0KKyAgICAgICAgcnRCQm94Ri53aWR0aCA9IGZDaGFyV2lkdGg7DQorICAgICAgICBydEJCb3hGLmhlaWdodCA9IGZIZWlnaHQ7DQorICAgICAgICBydEJCb3hGLnRvcCA9IHN0ZDo6bWF4KHJ0QkJveEYudG9wLCAwLjBmKTsNCisgICAgICB9DQorICAgICAgcnRBcnJheS5TZXRBdChpLCBydEJCb3hGKTsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBydEFycmF5LlNldEF0KGksIHJlY3QpOw0KKyAgfQ0KKyAgcmV0dXJuIGlMZW5ndGg7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3RleHRicmVhay5oIGIveGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfdGV4dGJyZWFrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkZWVkNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3RleHRicmVhay5oCkBAIC0wLDAgKzEsMTcxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYX1RFWFRCUkVBS19JTVANCisjZGVmaW5lIF9GWF9URVhUQlJFQUtfSU1QDQorDQorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9tZW1vcnkuaCINCisNCitjbGFzcyBJRlhfQXJhYmljQ2hhcjsNCitjbGFzcyBDRlhfVHh0YnJlYWs7DQorDQorY2xhc3MgQ0ZYX1R4dExpbmUgew0KKyBwdWJsaWM6DQorICBDRlhfVHh0TGluZShpbnQzMl90IGlCbG9ja1NpemUpDQorICAgICAgOiBtX2lTdGFydCgwKSwgbV9pV2lkdGgoMCksIG1faUFyYWJpY0NoYXJzKDApIHsNCisgICAgbV9wTGluZUNoYXJzID0gbmV3IENGWF9UeHRDaGFyQXJyYXk7DQorICAgIG1fcExpbmVQaWVjZXMgPSBuZXcgQ0ZYX1R4dFBpZWNlQXJyYXkoMTYpOw0KKyAgfQ0KKyAgfkNGWF9UeHRMaW5lKCkgew0KKyAgICBSZW1vdmVBbGwoKTsNCisgICAgZGVsZXRlIG1fcExpbmVDaGFyczsNCisgICAgZGVsZXRlIG1fcExpbmVQaWVjZXM7DQorICB9DQorICBpbnQzMl90IENvdW50Q2hhcnMoKSBjb25zdCB7IHJldHVybiBtX3BMaW5lQ2hhcnMtPkdldFNpemUoKTsgfQ0KKyAgQ0ZYX1R4dENoYXIqIEdldENoYXJQdHIoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSAmJiBpbmRleCA8IG1fcExpbmVDaGFycy0+R2V0U2l6ZSgpKTsNCisgICAgcmV0dXJuIG1fcExpbmVDaGFycy0+R2V0RGF0YVB0cihpbmRleCk7DQorICB9DQorICBpbnQzMl90IENvdW50UGllY2VzKCkgY29uc3QgeyByZXR1cm4gbV9wTGluZVBpZWNlcy0+R2V0U2l6ZSgpOyB9DQorICBDRlhfVHh0UGllY2UqIEdldFBpZWNlUHRyKGludDMyX3QgaW5kZXgpIGNvbnN0IHsNCisgICAgRlhTWVNfYXNzZXJ0KGluZGV4ID4gLTEgJiYgaW5kZXggPCBtX3BMaW5lUGllY2VzLT5HZXRTaXplKCkpOw0KKyAgICByZXR1cm4gbV9wTGluZVBpZWNlcy0+R2V0UHRyQXQoaW5kZXgpOw0KKyAgfQ0KKyAgdm9pZCBHZXRTdHJpbmcoQ0ZYX1dpZGVTdHJpbmcmIHdzU3RyKSBjb25zdCB7DQorICAgIGludDMyX3QgaUNvdW50ID0gbV9wTGluZUNoYXJzLT5HZXRTaXplKCk7DQorICAgIEZYX1dDSEFSKiBwQnVmID0gd3NTdHIuR2V0QnVmZmVyKGlDb3VudCk7DQorICAgIENGWF9DaGFyKiBwQ2hhcjsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICBwQ2hhciA9IG1fcExpbmVDaGFycy0+R2V0RGF0YVB0cihpKTsNCisgICAgICAqcEJ1ZisrID0gKEZYX1dDSEFSKXBDaGFyLT5tX3dDaGFyQ29kZTsNCisgICAgfQ0KKyAgICB3c1N0ci5SZWxlYXNlQnVmZmVyKGlDb3VudCk7DQorICB9DQorICB2b2lkIFJlbW92ZUFsbChGWF9CT09MIGJMZWF2ZU1lbW9yeSA9IEZBTFNFKSB7DQorICAgIG1fcExpbmVDaGFycy0+UmVtb3ZlQWxsKCk7DQorICAgIG1fcExpbmVQaWVjZXMtPlJlbW92ZUFsbChiTGVhdmVNZW1vcnkpOw0KKyAgICBtX2lXaWR0aCA9IDA7DQorICAgIG1faUFyYWJpY0NoYXJzID0gMDsNCisgIH0NCisgIENGWF9UeHRDaGFyQXJyYXkqIG1fcExpbmVDaGFyczsNCisgIENGWF9UeHRQaWVjZUFycmF5KiBtX3BMaW5lUGllY2VzOw0KKyAgaW50MzJfdCBtX2lTdGFydDsNCisgIGludDMyX3QgbV9pV2lkdGg7DQorICBpbnQzMl90IG1faUFyYWJpY0NoYXJzOw0KK307DQorY2xhc3MgQ0ZYX1R4dEJyZWFrIDogcHVibGljIElGWF9UeHRCcmVhayB7DQorIHB1YmxpYzoNCisgIENGWF9UeHRCcmVhayhGWF9EV09SRCBkd1BvbGljaWVzKTsNCisgIH5DRlhfVHh0QnJlYWsoKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKyAgdmlydHVhbCB2b2lkIFNldExpbmVXaWR0aChGWF9GTE9BVCBmTGluZVdpZHRoKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRMaW5lUG9zKEZYX0ZMT0FUIGZMaW5lUG9zKTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0TGF5b3V0U3R5bGVzKCkgY29uc3QgeyByZXR1cm4gbV9kd0xheW91dFN0eWxlczsgfQ0KKyAgdmlydHVhbCB2b2lkIFNldExheW91dFN0eWxlcyhGWF9EV09SRCBkd0xheW91dFN0eWxlcyk7DQorICB2aXJ0dWFsIHZvaWQgU2V0Rm9udChJRlhfRm9udCogcEZvbnQpOw0KKyAgdmlydHVhbCB2b2lkIFNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSk7DQorICB2aXJ0dWFsIHZvaWQgU2V0VGFiV2lkdGgoRlhfRkxPQVQgZlRhYldpZHRoLCBGWF9CT09MIGJFcXVpZGlzdGFudCk7DQorICB2aXJ0dWFsIHZvaWQgU2V0RGVmYXVsdENoYXIoRlhfV0NIQVIgd2NoKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRQYXJhZ3JhcGhCcmVha0NoYXIoRlhfV0NIQVIgd2NoKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRMaW5lQnJlYWtUb2xlcmFuY2UoRlhfRkxPQVQgZlRvbGVyYW5jZSk7DQorICB2aXJ0dWFsIHZvaWQgU2V0SG9yaXpvbnRhbFNjYWxlKGludDMyX3QgaVNjYWxlKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRWZXJ0aWNhbFNjYWxlKGludDMyX3QgaVNjYWxlKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRDaGFyUm90YXRpb24oaW50MzJfdCBpQ2hhclJvdGF0aW9uKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSk7DQorICB2aXJ0dWFsIHZvaWQgU2V0QWxpZ25tZW50KGludDMyX3QgaUFsaWdubWVudCk7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldENvbnRleHRDaGFyU3R5bGVzKCkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgU2V0Q29udGV4dENoYXJTdHlsZXMoRlhfRFdPUkQgZHdDaGFyU3R5bGVzKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRDb21iV2lkdGgoRlhfRkxPQVQgZkNvbWJXaWR0aCk7DQorICB2aXJ0dWFsIHZvaWQgU2V0VXNlckRhdGEodm9pZCogcFVzZXJEYXRhKTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgQXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBFbmRCcmVhayhGWF9EV09SRCBkd1N0YXR1cyA9IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50QnJlYWtDaGFycygpIGNvbnN0Ow0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50QnJlYWtQaWVjZXMoKSBjb25zdDsNCisgIHZpcnR1YWwgY29uc3QgQ0ZYX1R4dFBpZWNlKiBHZXRCcmVha1BpZWNlKGludDMyX3QgaW5kZXgpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIENsZWFyQnJlYWtQaWVjZXMoKTsNCisgIHZpcnR1YWwgdm9pZCBSZXNldCgpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldERpc3BsYXlQb3MoDQorICAgICAgRlhfTFBDVFhUUlVOIHBUeHRSdW4sDQorICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLA0KKyAgICAgIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UsDQorICAgICAgQ0ZYX1dpZGVTdHJpbmcqIHBXU0Zvcm1zID0gTlVMTCwNCisgICAgICBGWF9BZGp1c3RDaGFyRGlzcGxheVBvcyBwQWRqdXN0UG9zID0gTlVMTCkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0Q2hhclJlY3RzKEZYX0xQQ1RYVFJVTiBwVHh0UnVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEZBcnJheSYgcnRBcnJheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckJCb3ggPSBGQUxTRSkgY29uc3Q7DQorICB2b2lkIEFwcGVuZENoYXJfUGFnZUxvYWQoQ0ZYX0NoYXIqIHBDdXJDaGFyLCBGWF9EV09SRCBkd1Byb3BzKTsNCisgIEZYX0RXT1JEIEFwcGVuZENoYXJfQ29tYmluYXRpb24oQ0ZYX0NoYXIqIHBDdXJDaGFyLCBpbnQzMl90IGlSb3RhdGlvbik7DQorICBGWF9EV09SRCBBcHBlbmRDaGFyX1RhYihDRlhfQ2hhciogcEN1ckNoYXIsIGludDMyX3QgaVJvdGF0aW9uKTsNCisgIEZYX0RXT1JEIEFwcGVuZENoYXJfQ29udHJvbChDRlhfQ2hhciogcEN1ckNoYXIsIGludDMyX3QgaVJvdGF0aW9uKTsNCisgIEZYX0RXT1JEIEFwcGVuZENoYXJfQXJhYmljKENGWF9DaGFyKiBwQ3VyQ2hhciwgaW50MzJfdCBpUm90YXRpb24pOw0KKyAgRlhfRFdPUkQgQXBwZW5kQ2hhcl9PdGhlcnMoQ0ZYX0NoYXIqIHBDdXJDaGFyLCBpbnQzMl90IGlSb3RhdGlvbik7DQorDQorIHByb3RlY3RlZDoNCisgIEZYX0RXT1JEIG1fZHdQb2xpY2llczsNCisgIEZYX0JPT0wgbV9iUGFnaW5hdGlvbjsNCisgIElGWF9BcmFiaWNDaGFyKiBtX3BBcmFiaWNDaGFyOw0KKyAgaW50MzJfdCBtX2lMaW5lV2lkdGg7DQorICBGWF9EV09SRCBtX2R3TGF5b3V0U3R5bGVzOw0KKyAgRlhfQk9PTCBtX2JWZXJ0aWNhbDsNCisgIEZYX0JPT0wgbV9iQXJhYmljQ29udGV4dDsNCisgIEZYX0JPT0wgbV9iQXJhYmljU2hhcGVzOw0KKyAgRlhfQk9PTCBtX2JSVEw7DQorICBGWF9CT09MIG1fYlNpbmdsZUxpbmU7DQorICBGWF9CT09MIG1fYkNvbWJUZXh0Ow0KKyAgaW50MzJfdCBtX2lBcmFiaWNDb250ZXh0Ow0KKyAgaW50MzJfdCBtX2lDdXJBcmFiaWNDb250ZXh0Ow0KKyAgSUZYX0ZvbnQqIG1fcEZvbnQ7DQorICBpbnQzMl90IG1faUZvbnRTaXplOw0KKyAgRlhfQk9PTCBtX2JFcXVpZGlzdGFudDsNCisgIGludDMyX3QgbV9pVGFiV2lkdGg7DQorICBGWF9XQ0hBUiBtX3dEZWZDaGFyOw0KKyAgRlhfV0NIQVIgbV93UGFyYWdCcmVha0NoYXI7DQorICBpbnQzMl90IG1faURlZkNoYXI7DQorICBpbnQzMl90IG1faUxpbmVSb3RhdGlvbjsNCisgIGludDMyX3QgbV9pQ2hhclJvdGF0aW9uOw0KKyAgaW50MzJfdCBtX2lSb3RhdGlvbjsNCisgIGludDMyX3QgbV9pQWxpZ25tZW50Ow0KKyAgRlhfRFdPUkQgbV9kd0NvbnRleHRDaGFyU3R5bGVzOw0KKyAgaW50MzJfdCBtX2lDb21iV2lkdGg7DQorICB2b2lkKiBtX3BVc2VyRGF0YTsNCisgIEZYX0RXT1JEIG1fZHdDaGFyVHlwZTsNCisgIEZYX0JPT0wgbV9iQ3VyUlRMOw0KKyAgaW50MzJfdCBtX2lDdXJBbGlnbm1lbnQ7DQorICBGWF9CT09MIG1fYkFyYWJpY051bWJlcjsNCisgIEZYX0JPT0wgbV9iQXJhYmljQ29tbWE7DQorICBDRlhfVHh0TGluZSogbV9wVHh0TGluZTE7DQorICBDRlhfVHh0TGluZSogbV9wVHh0TGluZTI7DQorICBDRlhfVHh0TGluZSogbV9wQ3VyTGluZTsNCisgIGludDMyX3QgbV9pUmVhZHk7DQorICBpbnQzMl90IG1faVRvbGVyYW5jZTsNCisgIGludDMyX3QgbV9pSG9yU2NhbGU7DQorICBpbnQzMl90IG1faVZlclNjYWxlOw0KKyAgaW50MzJfdCBtX2lDaGFyU3BhY2U7DQorICB2b2lkIFNldEJyZWFrU3RhdHVzKCk7DQorICBpbnQzMl90IEdldExpbmVSb3RhdGlvbihGWF9EV09SRCBkd1N0eWxlcykgY29uc3Q7DQorICBDRlhfVHh0Q2hhciogR2V0TGFzdENoYXIoaW50MzJfdCBpbmRleCwgRlhfQk9PTCBiT21pdENoYXIgPSBUUlVFKSBjb25zdDsNCisgIENGWF9UeHRMaW5lKiBHZXRUeHRMaW5lKEZYX0JPT0wgYlJlYWR5KSBjb25zdDsNCisgIENGWF9UeHRQaWVjZUFycmF5KiBHZXRUeHRQaWVjZXMoRlhfQk9PTCBiUmVhZHkpIGNvbnN0Ow0KKyAgRlhfRFdPUkQgR2V0VW5pZmllZENoYXJUeXBlKEZYX0RXT1JEIGR3VHlwZSkgY29uc3Q7DQorICB2b2lkIFJlc2V0QXJhYmljQ29udGV4dCgpOw0KKyAgdm9pZCBSZXNldENvbnRleHRDaGFyU3R5bGVzKCk7DQorICB2b2lkIEVuZEJyZWFrX1VwZGF0ZUFyYWJpY1NoYXBlcygpOw0KKyAgRlhfQk9PTCBFbmRCcmVha19TcGxpdExpbmUoQ0ZYX1R4dExpbmUqIHBOZXh0TGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFsbENoYXJzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMpOw0KKyAgdm9pZCBFbmRCcmVha19CaWRpTGluZShDRlhfVFBPQXJyYXkmIHRwb3MsIEZYX0RXT1JEIGR3U3RhdHVzKTsNCisgIHZvaWQgRW5kQnJlYWtfQWxpZ25tZW50KENGWF9UUE9BcnJheSYgdHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFsbENoYXJzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMpOw0KKyAgaW50MzJfdCBHZXRCcmVha1BvcyhDRlhfVHh0Q2hhckFycmF5JiBjYSwNCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUVuZFBvcywNCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWxsQ2hhcnMgPSBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiT25seUJyayA9IEZBTFNFKTsNCisgIHZvaWQgU3BsaXRUZXh0TGluZShDRlhfVHh0TGluZSogcEN1ckxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1R4dExpbmUqIHBOZXh0TGluZSwNCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBbGxDaGFycyA9IEZBTFNFKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3VuaWNvZGUuY3BwIGIveGZhL3NyYy9mZ2FzL3NyYy9sYXlvdXQvZnhfdW5pY29kZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY5ODc2MAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3VuaWNvZGUuY3BwCkBAIC0wLDAgKzEsMTE3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZnYXMvc3JjL2ZnYXNfYmFzZS5oIg0KKyNpbmNsdWRlICJmeF91bmljb2RlLmgiDQordm9pZCBGWF9URVhUTEFZT1VUX1BpZWNlU29ydChDRlhfVFBPQXJyYXkmIHRwb3MsIGludDMyX3QgaVN0YXJ0LCBpbnQzMl90IGlFbmQpIHsNCisgIEZYU1lTX2Fzc2VydChpU3RhcnQgPiAtMSAmJiBpU3RhcnQgPCB0cG9zLkdldFNpemUoKSk7DQorICBGWFNZU19hc3NlcnQoaUVuZCA+IC0xICYmIGlFbmQgPCB0cG9zLkdldFNpemUoKSk7DQorICBpZiAoaVN0YXJ0ID49IGlFbmQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpID0gaVN0YXJ0LCBqID0gaUVuZDsNCisgIEZYX1RQTyAqcEN1ciA9IHRwb3MuR2V0UHRyQXQoaVN0YXJ0KSwgKnBTb3J0Ow0KKyAgaW50MzJfdCB2ID0gcEN1ci0+cG9zOw0KKyAgd2hpbGUgKGkgPCBqKSB7DQorICAgIHdoaWxlIChqID4gaSkgew0KKyAgICAgIHBTb3J0ID0gdHBvcy5HZXRQdHJBdChqKTsNCisgICAgICBpZiAocFNvcnQtPnBvcyA8IHYpIHsNCisgICAgICAgIEZYX1RQTyB0ID0gKnBTb3J0Ow0KKyAgICAgICAgKnBTb3J0ID0gKnBDdXI7DQorICAgICAgICAqcEN1ciA9IHQ7DQorICAgICAgICBwQ3VyID0gcFNvcnQ7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgai0tOw0KKyAgICB9DQorICAgIHdoaWxlIChpIDwgaikgew0KKyAgICAgIHBTb3J0ID0gdHBvcy5HZXRQdHJBdChpKTsNCisgICAgICBpZiAocFNvcnQtPnBvcyA+IHYpIHsNCisgICAgICAgIEZYX1RQTyB0ID0gKnBTb3J0Ow0KKyAgICAgICAgKnBTb3J0ID0gKnBDdXI7DQorICAgICAgICAqcEN1ciA9IHQ7DQorICAgICAgICBwQ3VyID0gcFNvcnQ7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgaSsrOw0KKyAgICB9DQorICB9DQorICBpLS0sIGorKzsNCisgIGlmIChpU3RhcnQgPCBpKSB7DQorICAgIEZYX1RFWFRMQVlPVVRfUGllY2VTb3J0KHRwb3MsIGlTdGFydCwgaSk7DQorICB9DQorICBpZiAoaiA8IGlFbmQpIHsNCisgICAgRlhfVEVYVExBWU9VVF9QaWVjZVNvcnQodHBvcywgaiwgaUVuZCk7DQorICB9DQorfQ0KK3N0YXRpYyBjb25zdCBGWF9KQVBDSEFSUFJPUEVSVFlFWCBnc19GWF9KYXBDaGFyUHJvcGVydHlzRXhbXSA9IHsNCisgICAgezB4MzAwMSwgMHgxM30sIHsweDMwMDIsIDB4MTN9LCB7MHgzMDQxLCAweDIzfSwgezB4MzA0MywgMHgyM30sDQorICAgIHsweDMwNDUsIDB4MjN9LCB7MHgzMDQ3LCAweDIzfSwgezB4MzA0OSwgMHgyM30sIHsweDMwNjMsIDB4MjN9LA0KKyAgICB7MHgzMDgzLCAweDIzfSwgezB4MzA4NSwgMHgyM30sIHsweDMwODcsIDB4MjN9LCB7MHgzMDhFLCAweDIzfSwNCisgICAgezB4MzA5NSwgMHgyM30sIHsweDMwOTYsIDB4MjN9LCB7MHgzMEExLCAweDIzfSwgezB4MzBBMywgMHgyM30sDQorICAgIHsweDMwQTUsIDB4MjN9LCB7MHgzMEE3LCAweDIzfSwgezB4MzBBOSwgMHgyM30sIHsweDMwQzMsIDB4MjN9LA0KKyAgICB7MHgzMEUzLCAweDIzfSwgezB4MzBFNSwgMHgyM30sIHsweDMwRTcsIDB4MjN9LCB7MHgzMEVFLCAweDIzfSwNCisgICAgezB4MzBGNSwgMHgyM30sIHsweDMwRjYsIDB4MjN9LCB7MHgzMEZCLCAweDIyfSwgezB4MzFGMCwgMHgyM30sDQorICAgIHsweDMxRjEsIDB4MjN9LCB7MHgzMUYyLCAweDIzfSwgezB4MzFGMywgMHgyM30sIHsweDMxRjQsIDB4MjN9LA0KKyAgICB7MHgzMUY1LCAweDIzfSwgezB4MzFGNiwgMHgyM30sIHsweDMxRjcsIDB4MjN9LCB7MHgzMUY4LCAweDIzfSwNCisgICAgezB4MzFGOSwgMHgyM30sIHsweDMxRkEsIDB4MjN9LCB7MHgzMUZCLCAweDIzfSwgezB4MzFGQywgMHgyM30sDQorICAgIHsweDMxRkQsIDB4MjN9LCB7MHgzMUZFLCAweDIzfSwgezB4MzFGRiwgMHgyM30sDQorfTsNCitGWF9MUENKQVBDSEFSUFJPUEVSVFlFWCBGWF9HZXRKYXBDaGFyUHJvcGVydHlFeChGWF9XQ0hBUiB3Y2gpIHsNCisgIGludDMyX3QgaVN0YXJ0ID0gMDsNCisgIGludDMyX3QgaUVuZCA9DQorICAgICAgc2l6ZW9mKGdzX0ZYX0phcENoYXJQcm9wZXJ0eXNFeCkgLyBzaXplb2YoRlhfSkFQQ0hBUlBST1BFUlRZRVgpOw0KKyAgd2hpbGUgKGlTdGFydCA8PSBpRW5kKSB7DQorICAgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgIEZYX1dDSEFSIHdKYXBDaGFyID0gZ3NfRlhfSmFwQ2hhclByb3BlcnR5c0V4W2lNaWRdLndDaGFyOw0KKyAgICBpZiAod2NoID09IHdKYXBDaGFyKSB7DQorICAgICAgcmV0dXJuIGdzX0ZYX0phcENoYXJQcm9wZXJ0eXNFeCArIGlNaWQ7DQorICAgIH0gZWxzZSBpZiAod2NoIDwgd0phcENoYXIpIHsNCisgICAgICBpRW5kID0gaU1pZCAtIDE7DQorICAgIH0gZWxzZSB7DQorICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitGWF9CT09MIEZYX0FkanVzdEphcENoYXJEaXNwbGF5UG9zKEZYX1dDSEFSIHdjaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1CQ1NDb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZvbnQqIHBGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydGljYWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGJiBwdE9mZnNldCkgew0KKyAgaWYgKHBGb250ID09IE5VTEwgfHwgIWJWZXJ0aWNhbCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAod2NoIDwgMHgzMDAxIHx8IHdjaCA+IDB4MzFGRikgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWF9MUENKQVBDSEFSUFJPUEVSVFlFWCBwSmFwQ2hhciA9IEZYX0dldEphcENoYXJQcm9wZXJ0eUV4KHdjaCk7DQorICBpZiAocEphcENoYXIgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfUmVjdCBydEJCb3g7DQorICBydEJCb3guUmVzZXQoKTsNCisgIGlmIChwRm9udC0+R2V0Q2hhckJCb3god2NoLCBydEJCb3gsIGJNQkNTQ29kZSkpIHsNCisgICAgc3dpdGNoIChwSmFwQ2hhci0+dUFsaWduICYgMHhGMCkgew0KKyAgICAgIGNhc2UgRlhfSkFQQ0hBUlBST1BFUlRZRVhfVG9wOg0KKyAgICAgICAgcHRPZmZzZXQueSA9IGZGb250U2l6ZSAqICgxMDAwIC0gcnRCQm94LmhlaWdodCkgLyAxMjAwLjBmOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGWF9KQVBDSEFSUFJPUEVSVFlFWF9NaWRkbGU6DQorICAgICAgICBwdE9mZnNldC55ID0gZkZvbnRTaXplICogKDEwMDAgLSBydEJCb3guaGVpZ2h0KSAvIDYwMDAuMGY7DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBzd2l0Y2ggKHBKYXBDaGFyLT51QWxpZ24gJiAweDBGKSB7DQorICAgICAgY2FzZSBGWF9KQVBDSEFSUFJPUEVSVFlFWF9DZW50ZXI6DQorICAgICAgICBwdE9mZnNldC54ID0gZkZvbnRTaXplICogKDYwMCAtIHJ0QkJveC5yaWdodCgpKSAvIDEwMDAuMGY7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZYX0pBUENIQVJQUk9QRVJUWUVYX1JpZ2h0Og0KKyAgICAgICAgcHRPZmZzZXQueCA9IGZGb250U2l6ZSAqICg5NTAgLSBydEJCb3gucmlnaHQoKSkgLyAxMDAwLjBmOw0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF91bmljb2RlLmggYi94ZmEvc3JjL2ZnYXMvc3JjL2xheW91dC9meF91bmljb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFkMTgxMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvbGF5b3V0L2Z4X3VuaWNvZGUuaApAQCAtMCwwICsxLDE1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZHQVNfVU5JQ09ERV9JTVANCisjZGVmaW5lIF9GR0FTX1VOSUNPREVfSU1QDQordHlwZWRlZiBzdHJ1Y3QgX0ZYX1RQTyB7DQorICBpbnQzMl90IGluZGV4Ow0KKyAgaW50MzJfdCBwb3M7DQorfSBGWF9UUE87DQordHlwZWRlZiBDRlhfTWFzc0FycmF5VGVtcGxhdGU8RlhfVFBPPiBDRlhfVFBPQXJyYXk7DQordm9pZCBGWF9URVhUTEFZT1VUX1BpZWNlU29ydChDRlhfVFBPQXJyYXkmIHRwb3MsIGludDMyX3QgaVN0YXJ0LCBpbnQzMl90IGlFbmQpOw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvbG9jYWxpemF0aW9uL2Z4X2RhdGV0aW1lLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvbG9jYWxpemF0aW9uL2Z4X2RhdGV0aW1lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGRjOGRjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9mZ2FzL3NyYy9sb2NhbGl6YXRpb24vZnhfZGF0ZXRpbWUuY3BwCkBAIC0wLDAgKzEsNTUzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZnYXMvc3JjL2ZnYXNfYmFzZS5oIg0KK2NvbnN0IHVpbnQ4X3QgZ19GWERheXNQZXJNb250aFsxMl0gPSB7MzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzF9Ow0KK2NvbnN0IHVpbnQ4X3QgZ19GWERheXNQZXJMZWFwTW9udGhbMTJdID0gezMxLCAyOSwgMzEsIDMwLCAzMSwgMzAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMX07DQorY29uc3QgaW50MzJfdCBnX0ZYRGF5c0JlZm9yZU1vbnRoWzEyXSA9IHswLCAgIDMxLCAgNTksICA5MCwgIDEyMCwgMTUxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNH07DQorY29uc3QgaW50MzJfdCBnX0ZYRGF5c0JlZm9yZUxlYXBNb250aFsxMl0gPSB7MCwgICAzMSwgIDYwLCAgOTEsICAxMjEsIDE1MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODIsIDIxMywgMjQ0LCAyNzQsIDMwNSwgMzM1fTsNCitjb25zdCBpbnQzMl90IGdfRlhEYXlzUGVyWWVhciA9IDM2NTsNCitjb25zdCBpbnQzMl90IGdfRlhEYXlzUGVyTGVhcFllYXIgPSAzNjY7DQorY29uc3QgaW50MzJfdCBnX0ZYRGF5c1BlcjRZZWFycyA9IDE0NjE7DQorY29uc3QgaW50MzJfdCBnX0ZYRGF5c1BlcjEwMFllYXJzID0gMzY1MjQ7DQorY29uc3QgaW50MzJfdCBnX0ZYRGF5c1BlcjQwMFllYXJzID0gMTQ2MDk3Ow0KK2NvbnN0IGludDY0X3QgZ19GWE1pbGxpc2Vjb25kc1BlclNlY29uZCA9IDEwMDA7DQorY29uc3QgaW50NjRfdCBnX0ZYTWlsbGlzZWNvbmRzUGVyTWludXRlID0gNjAwMDA7DQorY29uc3QgaW50NjRfdCBnX0ZYTWlsbGlzZWNvbmRzUGVySG91ciA9IDM2MDAwMDA7DQorY29uc3QgaW50NjRfdCBnX0ZYTWlsbGlzZWNvbmRzUGVyRGF5ID0gODY0MDAwMDA7DQorI2lmIF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjMyX01PQklMRV8gfHwgXA0KKyAgICBfRlhfT1NfID09IF9GWF9XSU42NF8NCitjb25zdCBpbnQ2NF90IGdfRlhNaWxsaXNlY29uZHNQZXJZZWFyID0gMHgwNzU3QjEyQzAwOw0KK2NvbnN0IGludDY0X3QgZ19GWE1pbGxpc2Vjb25kc1BlckxlYXBZZWFyID0gMHgwNzVDRDc4ODAwOw0KK2NvbnN0IGludDY0X3QgZ19GWE1pbGxpc2Vjb25kc1BlcjRZZWFycyA9IDB4MUQ2M0VCMEMwMDsNCitjb25zdCBpbnQ2NF90IGdfRlhNaWxsaXNlY29uZHNQZXIxMDBZZWFycyA9IDB4MDJERUJDQ0REMDAwOw0KK2NvbnN0IGludDY0X3QgZ19GWE1pbGxpc2Vjb25kc1BlcjQwMFllYXJzID0gMHgwQjdBRjg1RDlDMDA7DQorI2VuZGlmDQorRlhfQk9PTCBGWF9Jc0xlYXBZZWFyKGludDMyX3QgaVllYXIpIHsNCisgIEZYU1lTX2Fzc2VydChpWWVhciAhPSAwKTsNCisgIHJldHVybiAoKGlZZWFyICUgNCkgPT0gMCAmJiAoaVllYXIgJSAxMDApICE9IDApIHx8IChpWWVhciAlIDQwMCkgPT0gMDsNCit9DQoraW50MzJfdCBGWF9EYXlzSW5ZZWFyKGludDMyX3QgaVllYXIpIHsNCisgIEZYU1lTX2Fzc2VydChpWWVhciAhPSAwKTsNCisgIHJldHVybiBGWF9Jc0xlYXBZZWFyKGlZZWFyKSA/IGdfRlhEYXlzUGVyTGVhcFllYXIgOiBnX0ZYRGF5c1BlclllYXI7DQorfQ0KK3VpbnQ4X3QgRlhfRGF5c0luTW9udGgoaW50MzJfdCBpWWVhciwgdWludDhfdCBpTW9udGgpIHsNCisgIEZYU1lTX2Fzc2VydChpWWVhciAhPSAwKTsNCisgIEZYU1lTX2Fzc2VydChpTW9udGggPj0gMSAmJiBpTW9udGggPD0gMTIpOw0KKyAgY29uc3QgdWludDhfdCogcCA9DQorICAgICAgRlhfSXNMZWFwWWVhcihpWWVhcikgPyBnX0ZYRGF5c1BlckxlYXBNb250aCA6IGdfRlhEYXlzUGVyTW9udGg7DQorICByZXR1cm4gcFtpTW9udGggLSAxXTsNCit9DQorc3RhdGljIGludDMyX3QgRlhfRGF5c0JlZm9yZU1vbnRoSW5ZZWFyKGludDMyX3QgaVllYXIsIHVpbnQ4X3QgaU1vbnRoKSB7DQorICBGWFNZU19hc3NlcnQoaVllYXIgIT0gMCk7DQorICBGWFNZU19hc3NlcnQoaU1vbnRoID49IDEgJiYgaU1vbnRoIDw9IDEyKTsNCisgIGNvbnN0IGludDMyX3QqIHAgPQ0KKyAgICAgIEZYX0lzTGVhcFllYXIoaVllYXIpID8gZ19GWERheXNCZWZvcmVMZWFwTW9udGggOiBnX0ZYRGF5c0JlZm9yZU1vbnRoOw0KKyAgcmV0dXJuIHBbaU1vbnRoIC0gMV07DQorfQ0KK3N0YXRpYyBpbnQ2NF90IEZYX0RhdGVUb0RheXMoaW50MzJfdCBpWWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaU1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpRGF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSW5jbHVkZVRoaXNEYXkgPSBGQUxTRSkgew0KKyAgRlhTWVNfYXNzZXJ0KGlZZWFyICE9IDApOw0KKyAgRlhTWVNfYXNzZXJ0KGlNb250aCA+PSAxICYmIGlNb250aCA8PSAxMik7DQorICBGWFNZU19hc3NlcnQoaURheSA+PSAxICYmIGlEYXkgPD0gRlhfRGF5c0luTW9udGgoaVllYXIsIGlNb250aCkpOw0KKyAgaW50NjRfdCBpRGF5cyA9IEZYX0RheXNCZWZvcmVNb250aEluWWVhcihpWWVhciwgaU1vbnRoKTsNCisgIGlEYXlzICs9IGlEYXk7DQorICBpZiAoIWJJbmNsdWRlVGhpc0RheSkgew0KKyAgICBpRGF5cy0tOw0KKyAgfQ0KKyAgaWYgKGlZZWFyID4gMCkgew0KKyAgICBpWWVhci0tOw0KKyAgfSBlbHNlIHsNCisgICAgaURheXMgLT0gRlhfRGF5c0luWWVhcihpWWVhcik7DQorICAgIGlZZWFyKys7DQorICB9DQorICByZXR1cm4gaURheXMgKyAoaW50NjRfdClpWWVhciAqIDM2NSArIGlZZWFyIC8gNCAtIGlZZWFyIC8gMTAwICsgaVllYXIgLyA0MDA7DQorfQ0KK3N0YXRpYyB2b2lkIEZYX0RheXNUb0RhdGUoaW50NjRfdCBpRGF5cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCYgaU1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCYgaURheSkgew0KKyAgRlhfQk9PTCBiQkMgPSBpRGF5cyA8IDA7DQorICBpZiAoYkJDKSB7DQorICAgIGlEYXlzID0gLWlEYXlzOw0KKyAgfQ0KKyAgaVllYXIgPSAxOw0KKyAgaU1vbnRoID0gMTsNCisgIGlEYXkgPSAxOw0KKyAgaWYgKGlEYXlzID49IGdfRlhEYXlzUGVyNDAwWWVhcnMpIHsNCisgICAgaVllYXIgKz0gKGludDMyX3QpKGlEYXlzIC8gZ19GWERheXNQZXI0MDBZZWFycyAqIDQwMCk7DQorICAgIGlEYXlzICU9IGdfRlhEYXlzUGVyNDAwWWVhcnM7DQorICB9DQorICBpZiAoaURheXMgPj0gZ19GWERheXNQZXIxMDBZZWFycykgew0KKyAgICBpZiAoaURheXMgPT0gZ19GWERheXNQZXIxMDBZZWFycyAqIDQpIHsNCisgICAgICBpWWVhciArPSAzMDA7DQorICAgICAgaURheXMgLT0gZ19GWERheXNQZXIxMDBZZWFycyAqIDM7DQorICAgIH0gZWxzZSB7DQorICAgICAgaVllYXIgKz0gKGludDMyX3QpKGlEYXlzIC8gZ19GWERheXNQZXIxMDBZZWFycyAqIDEwMCk7DQorICAgICAgaURheXMgJT0gZ19GWERheXNQZXIxMDBZZWFyczsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGlEYXlzID49IGdfRlhEYXlzUGVyNFllYXJzKSB7DQorICAgIGlZZWFyICs9IChpbnQzMl90KShpRGF5cyAvIGdfRlhEYXlzUGVyNFllYXJzICogNCk7DQorICAgIGlEYXlzICU9IGdfRlhEYXlzUGVyNFllYXJzOw0KKyAgfQ0KKyAgd2hpbGUgKFRSVUUpIHsNCisgICAgaW50MzJfdCBpWWVhckRheXMgPSBGWF9EYXlzSW5ZZWFyKGlZZWFyKTsNCisgICAgaWYgKGlEYXlzIDwgaVllYXJEYXlzKSB7DQorICAgICAgaWYgKGJCQykgew0KKyAgICAgICAgaVllYXIgPSAtaVllYXI7DQorICAgICAgICBpRGF5cyA9IGlZZWFyRGF5cyAtIGlEYXlzOw0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpWWVhcisrOw0KKyAgICBpRGF5cyAtPSBpWWVhckRheXM7DQorICB9DQorICB3aGlsZSAoVFJVRSkgew0KKyAgICBpbnQzMl90IGlNb250aERheXMgPSBGWF9EYXlzSW5Nb250aChpWWVhciwgaU1vbnRoKTsNCisgICAgaWYgKGlEYXlzIDwgaU1vbnRoRGF5cykgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlNb250aCsrOw0KKyAgICBpRGF5cyAtPSBpTW9udGhEYXlzOw0KKyAgfQ0KKyAgaURheSArPSAodWludDhfdClpRGF5czsNCit9DQorI2lmIF9GWF9PU18gPT0gX0ZYX0xJTlVYX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX0FORFJPSURfIHx8IFwNCisgICAgX0ZYX09TXyA9PSBfRlhfTUFDT1NYXyB8fCBfRlhfT1NfID09IF9GWF9JT1NfDQorI2luY2x1ZGUgPHRpbWUuaD4NCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4NCisjZW5kaWYNCit0eXBlZGVmIHN0cnVjdCBfRlhVVF9TWVNURU1USU1FIHsNCisgIEZYX1dPUkQgd1llYXI7DQorICBGWF9XT1JEIHdNb250aDsNCisgIEZYX1dPUkQgd0RheU9mV2VlazsNCisgIEZYX1dPUkQgd0RheTsNCisgIEZYX1dPUkQgd0hvdXI7DQorICBGWF9XT1JEIHdNaW51dGU7DQorICBGWF9XT1JEIHdTZWNvbmQ7DQorICBGWF9XT1JEIHdNaWxsaXNlY29uZHM7DQorfSBGWFVUX1NZU1RFTVRJTUU7DQordm9pZCBDRlhfVW5pdGltZTo6Tm93KCkgew0KKyAgRlhVVF9TWVNURU1USU1FIHV0TG9jYWw7DQorI2lmIF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjMyX01PQklMRV8gfHwgXA0KKyAgICBfRlhfT1NfID09IF9GWF9XSU42NF8NCisgIDo6R2V0TG9jYWxUaW1lKChMUFNZU1RFTVRJTUUpJnV0TG9jYWwpOw0KKyNlbGlmIF9GWF9PU18gIT0gX0ZYX0VNQkVEREVEXw0KKyNpZiAxDQorICB0aW1ldmFsIGN1clRpbWU7DQorICBnZXR0aW1lb2ZkYXkoJmN1clRpbWUsIE5VTEwpOw0KKyNlbHNlDQorICBzdHJ1Y3QgdGltZXNwZWMgY3VyVGltZTsNCisgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lELCAmY3VyVGltZSk7DQorI2VuZGlmDQorICBzdHJ1Y3QgdG0gc3Q7DQorICBsb2NhbHRpbWVfcigmY3VyVGltZS50dl9zZWMsICZzdCk7DQorICB1dExvY2FsLndZZWFyID0gc3QudG1feWVhciArIDE5MDA7DQorICB1dExvY2FsLndNb250aCA9IHN0LnRtX21vbiArIDE7DQorICB1dExvY2FsLndEYXlPZldlZWsgPSBzdC50bV93ZGF5Ow0KKyAgdXRMb2NhbC53RGF5ID0gc3QudG1fbWRheTsNCisgIHV0TG9jYWwud0hvdXIgPSBzdC50bV9ob3VyOw0KKyAgdXRMb2NhbC53TWludXRlID0gc3QudG1fbWluOw0KKyAgdXRMb2NhbC53U2Vjb25kID0gc3QudG1fc2VjOw0KKyAgdXRMb2NhbC53TWlsbGlzZWNvbmRzID0gY3VyVGltZS50dl91c2VjIC8gMTAwMDsNCisjZW5kaWYNCisgIFNldCh1dExvY2FsLndZZWFyLCAodWludDhfdCl1dExvY2FsLndNb250aCwgKHVpbnQ4X3QpdXRMb2NhbC53RGF5LA0KKyAgICAgICh1aW50OF90KXV0TG9jYWwud0hvdXIsICh1aW50OF90KXV0TG9jYWwud01pbnV0ZSwNCisgICAgICAodWludDhfdCl1dExvY2FsLndTZWNvbmQsIChGWF9XT1JEKXV0TG9jYWwud01pbGxpc2Vjb25kcyk7DQorfQ0KK3ZvaWQgQ0ZYX1VuaXRpbWU6OlNldEdNVGltZSgpIHsNCisgIEZYVVRfU1lTVEVNVElNRSB1dExvY2FsOw0KKyNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU4zMl9NT0JJTEVfIHx8IFwNCisgICAgX0ZYX09TXyA9PSBfRlhfV0lONjRfDQorICA6OkdldFN5c3RlbVRpbWUoKExQU1lTVEVNVElNRSkmdXRMb2NhbCk7DQorI2VsaWYgX0ZYX09TXyAhPSBfRlhfRU1CRURERURfDQorI2lmIDENCisgIHRpbWV2YWwgY3VyVGltZTsNCisgIGdldHRpbWVvZmRheSgmY3VyVGltZSwgTlVMTCk7DQorI2Vsc2UNCisgIHN0cnVjdCB0aW1lc3BlYyBjdXJUaW1lOw0KKyAgY2xvY2tfZ2V0dGltZShDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQsICZjdXJUaW1lKTsNCisjZW5kaWYNCisgIHN0cnVjdCB0bSBzdDsNCisgIGdtdGltZV9yKCZjdXJUaW1lLnR2X3NlYywgJnN0KTsNCisgIHV0TG9jYWwud1llYXIgPSBzdC50bV95ZWFyICsgMTkwMDsNCisgIHV0TG9jYWwud01vbnRoID0gc3QudG1fbW9uICsgMTsNCisgIHV0TG9jYWwud0RheU9mV2VlayA9IHN0LnRtX3dkYXk7DQorICB1dExvY2FsLndEYXkgPSBzdC50bV9tZGF5Ow0KKyAgdXRMb2NhbC53SG91ciA9IHN0LnRtX2hvdXI7DQorICB1dExvY2FsLndNaW51dGUgPSBzdC50bV9taW47DQorICB1dExvY2FsLndTZWNvbmQgPSBzdC50bV9zZWM7DQorICB1dExvY2FsLndNaWxsaXNlY29uZHMgPSBjdXJUaW1lLnR2X3VzZWMgLyAxMDAwOw0KKyNlbmRpZg0KKyAgU2V0KHV0TG9jYWwud1llYXIsICh1aW50OF90KXV0TG9jYWwud01vbnRoLCAodWludDhfdCl1dExvY2FsLndEYXksDQorICAgICAgKHVpbnQ4X3QpdXRMb2NhbC53SG91ciwgKHVpbnQ4X3QpdXRMb2NhbC53TWludXRlLA0KKyAgICAgICh1aW50OF90KXV0TG9jYWwud1NlY29uZCwgKEZYX1dPUkQpdXRMb2NhbC53TWlsbGlzZWNvbmRzKTsNCit9DQordm9pZCBDRlhfVW5pdGltZTo6U2V0KGludDMyX3QgeWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkYXksDQorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaG91ciwNCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtaW51dGUsDQorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2Vjb25kLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIG1pbGxpc2Vjb25kKSB7DQorICBGWFNZU19hc3NlcnQoaG91ciA8PSAyMyk7DQorICBGWFNZU19hc3NlcnQobWludXRlIDw9IDU5KTsNCisgIEZYU1lTX2Fzc2VydChzZWNvbmQgPD0gNTkpOw0KKyAgRlhTWVNfYXNzZXJ0KG1pbGxpc2Vjb25kIDw9IDk5OSk7DQorICBtX2lVbml0aW1lID0gKGludDY0X3QpaG91ciAqIGdfRlhNaWxsaXNlY29uZHNQZXJIb3VyICsNCisgICAgICAgICAgICAgICAoaW50NjRfdCltaW51dGUgKiBnX0ZYTWlsbGlzZWNvbmRzUGVyTWludXRlICsNCisgICAgICAgICAgICAgICAoaW50NjRfdClzZWNvbmQgKiBnX0ZYTWlsbGlzZWNvbmRzUGVyU2Vjb25kICsgbWlsbGlzZWNvbmQ7DQorICBpZiAoeWVhciA+IDApIHsNCisgICAgbV9pVW5pdGltZSA9DQorICAgICAgICBtX2lVbml0aW1lICsNCisgICAgICAgIEZYX0RhdGVUb0RheXMoeWVhciwgbW9udGgsIGRheSwgRkFMU0UpICogZ19GWE1pbGxpc2Vjb25kc1BlckRheTsNCisgIH0NCit9DQordm9pZCBDRlhfVW5pdGltZTo6U2V0KEZYX1VOSVRJTUUgdCkgew0KKyAgbV9pVW5pdGltZSA9IHQ7DQorfQ0KK2ludDMyX3QgQ0ZYX1VuaXRpbWU6OkdldFllYXIoKSBjb25zdCB7DQorICBpbnQzMl90IGlZZWFyOw0KKyAgdWludDhfdCBpTW9udGgsIGlEYXk7DQorICBGWF9EYXlzVG9EYXRlKEdldERheU9mQUQoKSwgaVllYXIsIGlNb250aCwgaURheSk7DQorICByZXR1cm4gaVllYXI7DQorfQ0KK3VpbnQ4X3QgQ0ZYX1VuaXRpbWU6OkdldE1vbnRoKCkgY29uc3Qgew0KKyAgaW50MzJfdCBpWWVhcjsNCisgIHVpbnQ4X3QgaU1vbnRoLCBpRGF5Ow0KKyAgRlhfRGF5c1RvRGF0ZShHZXREYXlPZkFEKCksIGlZZWFyLCBpTW9udGgsIGlEYXkpOw0KKyAgcmV0dXJuIGlNb250aDsNCit9DQordWludDhfdCBDRlhfVW5pdGltZTo6R2V0RGF5KCkgY29uc3Qgew0KKyAgaW50MzJfdCBpWWVhcjsNCisgIHVpbnQ4X3QgaU1vbnRoLCBpRGF5Ow0KKyAgRlhfRGF5c1RvRGF0ZShHZXREYXlPZkFEKCksIGlZZWFyLCBpTW9udGgsIGlEYXkpOw0KKyAgcmV0dXJuIGlEYXk7DQorfQ0KK0ZYX1dFRUtEQVkgQ0ZYX1VuaXRpbWU6OkdldERheU9mV2VlaygpIGNvbnN0IHsNCisgIGludDMyX3QgdiA9IChpbnQzMl90KSgobV9pVW5pdGltZSAvIGdfRlhNaWxsaXNlY29uZHNQZXJEYXkgKyAxKSAlIDcpOw0KKyAgaWYgKHYgPCAwKSB7DQorICAgIHYgKz0gNzsNCisgIH0NCisgIHJldHVybiAoRlhfV0VFS0RBWSl2Ow0KK30NCitGWF9XT1JEIENGWF9Vbml0aW1lOjpHZXREYXlPZlllYXIoKSBjb25zdCB7DQorICBpbnQzMl90IGlZZWFyOw0KKyAgdWludDhfdCBpTW9udGgsIGlEYXk7DQorICBGWF9EYXlzVG9EYXRlKEdldERheU9mQUQoKSwgaVllYXIsIGlNb250aCwgaURheSk7DQorICByZXR1cm4gRlhfRGF5c0JlZm9yZU1vbnRoSW5ZZWFyKGlZZWFyLCBpTW9udGgpICsgaURheTsNCit9DQoraW50NjRfdCBDRlhfVW5pdGltZTo6R2V0RGF5T2ZBRCgpIGNvbnN0IHsNCisgIEZYX0JPT0wgYkJDID0gbV9pVW5pdGltZSA8IDA7DQorICBpbnQ2NF90IGlEYXlzID0gbV9pVW5pdGltZSAvIGdfRlhNaWxsaXNlY29uZHNQZXJEYXk7DQorICBpRGF5cyArPSBiQkMgPyAtMSA6IDA7DQorICBpZiAoYkJDICYmIChtX2lVbml0aW1lICUgZ19GWE1pbGxpc2Vjb25kc1BlckRheSkgPT0gMCkgew0KKyAgICBpRGF5cysrOw0KKyAgfQ0KKyAgcmV0dXJuIGlEYXlzOw0KK30NCit1aW50OF90IENGWF9Vbml0aW1lOjpHZXRIb3VyKCkgY29uc3Qgew0KKyAgaW50MzJfdCB2ID0gKGludDMyX3QpKG1faVVuaXRpbWUgJSBnX0ZYTWlsbGlzZWNvbmRzUGVyRGF5KTsNCisgIGlmICh2IDwgMCkgew0KKyAgICB2ICs9IGdfRlhNaWxsaXNlY29uZHNQZXJEYXk7DQorICB9DQorICByZXR1cm4gKHVpbnQ4X3QpKHYgLyBnX0ZYTWlsbGlzZWNvbmRzUGVySG91cik7DQorfQ0KK3VpbnQ4X3QgQ0ZYX1VuaXRpbWU6OkdldE1pbnV0ZSgpIGNvbnN0IHsNCisgIGludDMyX3QgdiA9IChpbnQzMl90KShtX2lVbml0aW1lICUgZ19GWE1pbGxpc2Vjb25kc1BlckhvdXIpOw0KKyAgaWYgKHYgPCAwKSB7DQorICAgIHYgKz0gZ19GWE1pbGxpc2Vjb25kc1BlckhvdXI7DQorICB9DQorICByZXR1cm4gKHVpbnQ4X3QpKHYgLyBnX0ZYTWlsbGlzZWNvbmRzUGVyTWludXRlKTsNCit9DQordWludDhfdCBDRlhfVW5pdGltZTo6R2V0U2Vjb25kKCkgY29uc3Qgew0KKyAgaW50MzJfdCB2ID0gKGludDMyX3QpKG1faVVuaXRpbWUgJSBnX0ZYTWlsbGlzZWNvbmRzUGVyTWludXRlKTsNCisgIGlmICh2IDwgMCkgew0KKyAgICB2ICs9IGdfRlhNaWxsaXNlY29uZHNQZXJNaW51dGU7DQorICB9DQorICByZXR1cm4gKHVpbnQ4X3QpKHYgLyBnX0ZYTWlsbGlzZWNvbmRzUGVyU2Vjb25kKTsNCit9DQorRlhfV09SRCBDRlhfVW5pdGltZTo6R2V0TWlsbGlzZWNvbmQoKSBjb25zdCB7DQorICBpbnQzMl90IHYgPSAoaW50MzJfdCkobV9pVW5pdGltZSAlIGdfRlhNaWxsaXNlY29uZHNQZXJTZWNvbmQpOw0KKyAgaWYgKHYgPCAwKSB7DQorICAgIHYgKz0gZ19GWE1pbGxpc2Vjb25kc1BlclNlY29uZDsNCisgIH0NCisgIHJldHVybiAoRlhfV09SRCl2Ow0KK30NCitGWF9CT09MIENGWF9Vbml0aW1lOjpBZGRZZWFycyhpbnQzMl90IGlZZWFycykgew0KKyAgRlhfVU5JVElNRSB1dCA9IG1faVVuaXRpbWU7DQorICBpZiAodXQgPCAwKSB7DQorICAgIHV0ID0gLXV0Ow0KKyAgfQ0KKyAgRlhfVU5JVElNRSByID0gdXQgJSBnX0ZYTWlsbGlzZWNvbmRzUGVyRGF5Ow0KKyAgaW50MzJfdCBpWWVhcjsNCisgIHVpbnQ4X3QgaU1vbnRoLCBpRGF5Ow0KKyAgRlhfRGF5c1RvRGF0ZShHZXREYXlPZkFEKCksIGlZZWFyLCBpTW9udGgsIGlEYXkpOw0KKyAgaVllYXIgKz0gaVllYXJzOw0KKyAgaWYgKGlZZWFyID09IDApIHsNCisgICAgaVllYXIgPSBpWWVhcnMgPiAwID8gMSA6IC0xOw0KKyAgfQ0KKyAgbV9pVW5pdGltZSA9DQorICAgICAgRlhfRGF0ZVRvRGF5cyhpWWVhciwgaU1vbnRoLCBpRGF5LCBGQUxTRSkgKiBnX0ZYTWlsbGlzZWNvbmRzUGVyRGF5Ow0KKyAgbV9pVW5pdGltZSArPSAoaVllYXIgPCAwKSA/IC1yIDogcjsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9Vbml0aW1lOjpBZGRNb250aHMoaW50MzJfdCBpTW9udGhzKSB7DQorICBGWF9CT09MIGIgPSBpTW9udGhzID4gMDsNCisgIEZYX1VOSVRJTUUgdXQgPSBtX2lVbml0aW1lOw0KKyAgaWYgKHV0IDwgMCkgew0KKyAgICB1dCA9IC11dDsNCisgIH0NCisgIEZYX1VOSVRJTUUgciA9IHV0ICUgZ19GWE1pbGxpc2Vjb25kc1BlckRheTsNCisgIGludDMyX3QgaVllYXI7DQorICB1aW50OF90IGlNb250aCwgaURheTsNCisgIEZYX0RheXNUb0RhdGUoR2V0RGF5T2ZBRCgpLCBpWWVhciwgaU1vbnRoLCBpRGF5KTsNCisgIGlNb250aHMgKz0gaU1vbnRoOw0KKyAgd2hpbGUgKGlNb250aHMgPCAxKSB7DQorICAgIGlZZWFyLS0sIGlNb250aHMgKz0gMTI7DQorICB9DQorICB3aGlsZSAoaU1vbnRocyA+IDEyKSB7DQorICAgIGlZZWFyKyssIGlNb250aHMgLT0gMTI7DQorICB9DQorICBpZiAoaVllYXIgPT0gMCkgew0KKyAgICBpWWVhciA9IGIgPyAxIDogLTE7DQorICB9DQorICBtX2lVbml0aW1lID0gRlhfRGF0ZVRvRGF5cyhpWWVhciwgKHVpbnQ4X3QpaU1vbnRocywgaURheSwgRkFMU0UpICoNCisgICAgICAgICAgICAgICBnX0ZYTWlsbGlzZWNvbmRzUGVyRGF5Ow0KKyAgbV9pVW5pdGltZSArPSAoaVllYXIgPCAwKSA/IC1yIDogcjsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9Vbml0aW1lOjpBZGREYXlzKGludDMyX3QgaURheXMpIHsNCisgIG1faVVuaXRpbWUgKz0gKGludDY0X3QpaURheXMgKiBnX0ZYTWlsbGlzZWNvbmRzUGVyRGF5Ow0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZYX1VuaXRpbWU6OkFkZEhvdXJzKGludDMyX3QgaUhvdXJzKSB7DQorICBtX2lVbml0aW1lICs9IChpbnQ2NF90KWlIb3VycyAqIGdfRlhNaWxsaXNlY29uZHNQZXJIb3VyOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZYX1VuaXRpbWU6OkFkZE1pbnV0ZXMoaW50MzJfdCBpTWludXRlcykgew0KKyAgbV9pVW5pdGltZSArPSAoaW50NjRfdClpTWludXRlcyAqIGdfRlhNaWxsaXNlY29uZHNQZXJNaW51dGU7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhfVW5pdGltZTo6QWRkU2Vjb25kcyhpbnQzMl90IGlTZWNvbmRzKSB7DQorICBtX2lVbml0aW1lICs9ICgoaW50NjRfdClpU2Vjb25kcykgKiBnX0ZYTWlsbGlzZWNvbmRzUGVyU2Vjb25kOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZYX1VuaXRpbWU6OkFkZE1pbGxpc2Vjb25kcyhpbnQzMl90IGlNaWxsaXNlY29uZHMpIHsNCisgIG1faVVuaXRpbWUgKz0gaU1pbGxpc2Vjb25kczsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9EYXRlVGltZTo6U2V0KGludDMyX3QgeWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaG91ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWludXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzZWNvbmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIG1pbGxpc2Vjb25kKSB7DQorICBBU1NFUlQoeWVhciAhPSAwKTsNCisgIEFTU0VSVChtb250aCA+PSAxICYmIG1vbnRoIDw9IDEyKTsNCisgIEFTU0VSVChkYXkgPj0gMSAmJiBkYXkgPD0gRlhfRGF5c0luTW9udGgoeWVhciwgbW9udGgpKTsNCisgIEFTU0VSVChob3VyIDw9IDIzKTsNCisgIEFTU0VSVChtaW51dGUgPD0gNTkpOw0KKyAgQVNTRVJUKHNlY29uZCA8PSA1OSk7DQorICBBU1NFUlQobWlsbGlzZWNvbmQgPD0gOTk5KTsNCisgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyID0geWVhcjsNCisgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5tb250aCA9IG1vbnRoOw0KKyAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLmRheSA9IGRheTsNCisgIG1fRGF0ZVRpbWUuVGltZS5zVGltZS5ob3VyID0gaG91cjsNCisgIG1fRGF0ZVRpbWUuVGltZS5zVGltZS5taW51dGUgPSBtaW51dGU7DQorICBtX0RhdGVUaW1lLlRpbWUuc1RpbWUuc2Vjb25kID0gc2Vjb25kOw0KKyAgbV9EYXRlVGltZS5UaW1lLnNUaW1lLm1pbGxpc2Vjb25kID0gbWlsbGlzZWNvbmQ7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhfRGF0ZVRpbWU6OkZyb21Vbml0aW1lKEZYX1VOSVRJTUUgdCkgew0KKyAgQ0ZYX1VuaXRpbWUgdXQodCk7DQorICBGWF9EYXlzVG9EYXRlKHV0LkdldERheU9mQUQoKSwgbV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIsDQorICAgICAgICAgICAgICAgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5tb250aCwgbV9EYXRlVGltZS5EYXRlLnNEYXRlLmRheSk7DQorICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5ID0gdXQuR2V0SG91cigpOw0KKyAgbV9EYXRlVGltZS5UaW1lLnNUaW1lLm1pbnV0ZSA9IHV0LkdldE1pbnV0ZSgpOw0KKyAgbV9EYXRlVGltZS5UaW1lLnNUaW1lLnNlY29uZCA9IHV0LkdldFNlY29uZCgpOw0KKyAgbV9EYXRlVGltZS5UaW1lLnNUaW1lLm1pbGxpc2Vjb25kID0gdXQuR2V0TWlsbGlzZWNvbmQoKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9VTklUSU1FIENGWF9EYXRlVGltZTo6VG9Vbml0aW1lKCkgY29uc3Qgew0KKyAgRlhfVU5JVElNRSB2ID0NCisgICAgICAoaW50NjRfdCltX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5ICogZ19GWE1pbGxpc2Vjb25kc1BlckhvdXIgKw0KKyAgICAgIChpbnQ2NF90KW1fRGF0ZVRpbWUuVGltZS5zVGltZS5taW51dGUgKiBnX0ZYTWlsbGlzZWNvbmRzUGVyTWludXRlICsNCisgICAgICAoaW50NjRfdCltX0RhdGVUaW1lLlRpbWUuc1RpbWUuc2Vjb25kICogZ19GWE1pbGxpc2Vjb25kc1BlclNlY29uZCArDQorICAgICAgbV9EYXRlVGltZS5UaW1lLnNUaW1lLm1pbGxpc2Vjb25kOw0KKyAgdiArPSBGWF9EYXRlVG9EYXlzKG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyLCBtX0RhdGVUaW1lLkRhdGUuc0RhdGUubW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLmRheSwgRkFMU0UpICoNCisgICAgICAgZ19GWE1pbGxpc2Vjb25kc1BlckRheTsNCisgIHJldHVybiB2Ow0KK30NCitpbnQzMl90IENGWF9EYXRlVGltZTo6R2V0WWVhcigpIGNvbnN0IHsNCisgIHJldHVybiBtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhcjsNCit9DQordWludDhfdCBDRlhfRGF0ZVRpbWU6OkdldE1vbnRoKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5tb250aDsNCit9DQordWludDhfdCBDRlhfRGF0ZVRpbWU6OkdldERheSgpIGNvbnN0IHsNCisgIHJldHVybiBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5Ow0KK30NCitGWF9XRUVLREFZIENGWF9EYXRlVGltZTo6R2V0RGF5T2ZXZWVrKCkgY29uc3Qgew0KKyAgaW50MzJfdCB2ID0gKGludDMyX3QpKEZYX0RhdGVUb0RheXMobV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUubW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5LCBUUlVFKSAlDQorICAgICAgICAgICAgICAgICAgICAgICAgNyk7DQorICBpZiAodiA8IDApIHsNCisgICAgdiArPSA3Ow0KKyAgfQ0KKyAgcmV0dXJuIChGWF9XRUVLREFZKXY7DQorfQ0KK0ZYX1dPUkQgQ0ZYX0RhdGVUaW1lOjpHZXREYXlPZlllYXIoKSBjb25zdCB7DQorICByZXR1cm4gRlhfRGF5c0JlZm9yZU1vbnRoSW5ZZWFyKG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUubW9udGgpICsNCisgICAgICAgICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5Ow0KK30NCitpbnQ2NF90IENGWF9EYXRlVGltZTo6R2V0RGF5T2ZBRCgpIGNvbnN0IHsNCisgIHJldHVybiBGWF9EYXRlVG9EYXlzKG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyLCBtX0RhdGVUaW1lLkRhdGUuc0RhdGUubW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5LCBUUlVFKTsNCit9DQordWludDhfdCBDRlhfRGF0ZVRpbWU6OkdldEhvdXIoKSBjb25zdCB7DQorICByZXR1cm4gbV9EYXRlVGltZS5EYXRlLnNEYXRlLmRheTsNCit9DQordWludDhfdCBDRlhfRGF0ZVRpbWU6OkdldE1pbnV0ZSgpIGNvbnN0IHsNCisgIHJldHVybiBtX0RhdGVUaW1lLlRpbWUuc1RpbWUubWludXRlOw0KK30NCit1aW50OF90IENGWF9EYXRlVGltZTo6R2V0U2Vjb25kKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fRGF0ZVRpbWUuVGltZS5zVGltZS5zZWNvbmQ7DQorfQ0KK0ZYX1dPUkQgQ0ZYX0RhdGVUaW1lOjpHZXRNaWxsaXNlY29uZCgpIGNvbnN0IHsNCisgIHJldHVybiBtX0RhdGVUaW1lLlRpbWUuc1RpbWUubWlsbGlzZWNvbmQ7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0RhdGVUaW1lOjpBZGRZZWFycyhpbnQzMl90IGlZZWFycykgew0KKyAgaWYgKGlZZWFycyA9PSAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGludDMyX3QgdiA9IG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyICsgaVllYXJzOw0KKyAgaWYgKHYgPj0gMCAmJiBtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhciA8IDApIHsNCisgICAgdisrOw0KKyAgfSBlbHNlIGlmICh2IDw9IDAgJiYgbV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIgPiAwKSB7DQorICAgIHYtLTsNCisgIH0NCisgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyID0gdjsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9EYXRlVGltZTo6QWRkTW9udGhzKGludDMyX3QgaU1vbnRocykgew0KKyAgaWYgKGlNb250aHMgPT0gMCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWF9CT09MIGIgPSBpTW9udGhzID4gMDsNCisgIGlNb250aHMgKz0gbV9EYXRlVGltZS5EYXRlLnNEYXRlLm1vbnRoOw0KKyAgd2hpbGUgKGlNb250aHMgPCAxKSB7DQorICAgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyLS07DQorICAgIGlmIChtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhciA9PSAwKSB7DQorICAgICAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIgPSAtMTsNCisgICAgfQ0KKyAgICBpTW9udGhzICs9IDEyOw0KKyAgfQ0KKyAgd2hpbGUgKGlNb250aHMgPiAxMikgew0KKyAgICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhcisrOw0KKyAgICBpZiAobV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIgPT0gMCkgew0KKyAgICAgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyID0gMTsNCisgICAgfQ0KKyAgICBpTW9udGhzIC09IDEyOw0KKyAgfQ0KKyAgaWYgKG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyID09IDApIHsNCisgICAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIgPSBiID8gMSA6IC0xOw0KKyAgfQ0KKyAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLm1vbnRoID0gKHVpbnQ4X3QpaU1vbnRoczsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9EYXRlVGltZTo6QWRkRGF5cyhpbnQzMl90IGlEYXlzKSB7DQorICBpZiAoaURheXMgPT0gMCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpbnQ2NF90IHYxID0NCisgICAgICBGWF9EYXRlVG9EYXlzKG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyLCBtX0RhdGVUaW1lLkRhdGUuc0RhdGUubW9udGgsDQorICAgICAgICAgICAgICAgICAgICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5LCBUUlVFKTsNCisgIGludDY0X3QgdjIgPSB2MSArIGlEYXlzOw0KKyAgaWYgKHYyIDw9IDAgJiYgdjEgPiAwKSB7DQorICAgIHYyLS07DQorICB9IGVsc2UgaWYgKHYyID49IDAgJiYgdjEgPCAwKSB7DQorICAgIHYyKys7DQorICB9DQorICBGWF9EYXlzVG9EYXRlKHYyLCBtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhciwgbV9EYXRlVGltZS5EYXRlLnNEYXRlLm1vbnRoLA0KKyAgICAgICAgICAgICAgICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5KTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9EYXRlVGltZTo6QWRkSG91cnMoaW50MzJfdCBpSG91cnMpIHsNCisgIGlmIChpSG91cnMgPT0gMCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpSG91cnMgKz0gbV9EYXRlVGltZS5EYXRlLnNEYXRlLmRheTsNCisgIGludDMyX3QgaURheXMgPSBpSG91cnMgLyAyNDsNCisgIGlIb3VycyAlPSAyNDsNCisgIGlmIChpSG91cnMgPCAwKSB7DQorICAgIGlEYXlzLS0sIGlIb3VycyArPSAyNDsNCisgIH0NCisgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5kYXkgPSAodWludDhfdClpSG91cnM7DQorICBpZiAoaURheXMgIT0gMCkgew0KKyAgICBBZGREYXlzKGlEYXlzKTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9EYXRlVGltZTo6QWRkTWludXRlcyhpbnQzMl90IGlNaW51dGVzKSB7DQorICBpZiAoaU1pbnV0ZXMgPT0gMCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpTWludXRlcyArPSBtX0RhdGVUaW1lLlRpbWUuc1RpbWUubWludXRlOw0KKyAgaW50MzJfdCBpSG91cnMgPSBpTWludXRlcyAvIDYwOw0KKyAgaU1pbnV0ZXMgJT0gNjA7DQorICBpZiAoaU1pbnV0ZXMgPCAwKSB7DQorICAgIGlIb3Vycy0tLCBpTWludXRlcyArPSA2MDsNCisgIH0NCisgIG1fRGF0ZVRpbWUuVGltZS5zVGltZS5taW51dGUgPSAodWludDhfdClpTWludXRlczsNCisgIGlmIChpSG91cnMgIT0gMCkgew0KKyAgICBBZGRIb3VycyhpSG91cnMpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0RhdGVUaW1lOjpBZGRTZWNvbmRzKGludDMyX3QgaVNlY29uZHMpIHsNCisgIGlmIChpU2Vjb25kcyA9PSAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlTZWNvbmRzICs9IG1fRGF0ZVRpbWUuVGltZS5zVGltZS5zZWNvbmQ7DQorICBpbnQzMl90IGlNaW51dGVzID0gaVNlY29uZHMgLyA2MDsNCisgIGlTZWNvbmRzICU9IDYwOw0KKyAgaWYgKGlTZWNvbmRzIDwgMCkgew0KKyAgICBpTWludXRlcy0tLCBpU2Vjb25kcyArPSA2MDsNCisgIH0NCisgIG1fRGF0ZVRpbWUuVGltZS5zVGltZS5zZWNvbmQgPSAodWludDhfdClpU2Vjb25kczsNCisgIGlmIChpTWludXRlcyAhPSAwKSB7DQorICAgIEFkZE1pbnV0ZXMoaU1pbnV0ZXMpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0RhdGVUaW1lOjpBZGRNaWxsaXNlY29uZHMoaW50MzJfdCBpTWlsbGlzZWNvbmRzKSB7DQorICBpZiAoaU1pbGxpc2Vjb25kcyA9PSAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlNaWxsaXNlY29uZHMgKz0gbV9EYXRlVGltZS5UaW1lLnNUaW1lLm1pbGxpc2Vjb25kOw0KKyAgaW50MzJfdCBpU2Vjb25kcyA9IChpbnQzMl90KShpTWlsbGlzZWNvbmRzIC8gZ19GWE1pbGxpc2Vjb25kc1BlclNlY29uZCk7DQorICBpTWlsbGlzZWNvbmRzICU9IGdfRlhNaWxsaXNlY29uZHNQZXJTZWNvbmQ7DQorICBpZiAoaU1pbGxpc2Vjb25kcyA8IDApIHsNCisgICAgaVNlY29uZHMtLSwgaU1pbGxpc2Vjb25kcyArPSBnX0ZYTWlsbGlzZWNvbmRzUGVyU2Vjb25kOw0KKyAgfQ0KKyAgbV9EYXRlVGltZS5UaW1lLnNUaW1lLm1pbGxpc2Vjb25kID0gKEZYX1dPUkQpaU1pbGxpc2Vjb25kczsNCisgIGlmIChpU2Vjb25kcyAhPSAwKSB7DQorICAgIEFkZFNlY29uZHMoaVNlY29uZHMpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvbG9jYWxpemF0aW9uL2Z4X2xvY2FsZS5jcHAgYi94ZmEvc3JjL2ZnYXMvc3JjL2xvY2FsaXphdGlvbi9meF9sb2NhbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NjI5MTAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2xvY2FsaXphdGlvbi9meF9sb2NhbGUuY3BwCkBAIC0wLDAgKzEsNTEyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSA8YWxnb3JpdGhtPg0KKw0KKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfeG1sLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZmdhcy9zcmMvZmdhc19iYXNlLmgiDQorI2luY2x1ZGUgImZ4X2xvY2FsZWltcC5oIg0KKw0KKyNkZWZpbmUgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZUhhc2ggMHhiZGU5YWJkZQ0KKyNkZWZpbmUgRlhfTE9DQUxFQ0FURUdPUllfVGltZUhhc2ggMHgyZDcxYjAwZg0KKyNkZWZpbmUgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZVRpbWVIYXNoIDB4MTU4YzcyZWQNCisjZGVmaW5lIEZYX0xPQ0FMRUNBVEVHT1JZX051bUhhc2ggMHgwYjRmZjg3MA0KKyNkZWZpbmUgRlhfTE9DQUxFQ0FURUdPUllfVGV4dEhhc2ggMHgyZDA4YWY4NQ0KKyNkZWZpbmUgRlhfTE9DQUxFQ0FURUdPUllfWmVyb0hhc2ggMHg1NjhjYjUwMA0KKyNkZWZpbmUgRlhfTE9DQUxFQ0FURUdPUllfTnVsbEhhc2ggMHgwNTI5MzFiYg0KK3R5cGVkZWYgc3RydWN0IF9GWF9MT0NBTEVTVUJDQVRFR09SWUlORk8gew0KKyAgdWludDMyX3QgdUhhc2g7DQorICBjb25zdCBGWF9XQ0hBUiogcE5hbWU7DQorICBpbnQzMl90IGVTdWJDYXRlZ29yeTsNCit9IEZYX0xPQ0FMRVNVQkNBVEVHT1JZSU5GTywgKkZYX0xQTE9DQUxFU1VCQ0FURUdPUllJTkZPOw0KK3R5cGVkZWYgRlhfTE9DQUxFU1VCQ0FURUdPUllJTkZPIGNvbnN0KiBGWF9MUENMT0NBTEVTVUJDQVRFR09SWUlORk87DQorY29uc3Qgc3RhdGljIEZYX0xPQ0FMRVNVQkNBVEVHT1JZSU5GTyBnX0ZYTG9jYWxlRGF0ZVRpbWVTdWJDYXREYXRhW10gPSB7DQorICAgIHsweDE0ZGEyMTI1LCBMImRlZmF1bHQiLCBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0RlZmF1bHR9LA0KKyAgICB7MHg5MDQxZDRiMCwgTCJzaG9ydCIsIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnR9LA0KKyAgICB7MHhhMDg0YTM4MSwgTCJtZWRpdW0iLCBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bX0sDQorICAgIHsweGNkY2U1NmIzLCBMImZ1bGwiLCBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0Z1bGx9LA0KKyAgICB7MHhmNmI0YWZiMCwgTCJsb25nIiwgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9Mb25nfSwNCit9Ow0KK2NvbnN0IHN0YXRpYyBpbnQzMl90IGdfaUZYTG9jYWxlRGF0ZVRpbWVTdWJDYXRDb3VudCA9DQorICAgIHNpemVvZihnX0ZYTG9jYWxlRGF0ZVRpbWVTdWJDYXREYXRhKSAvIHNpemVvZihGWF9MT0NBTEVTVUJDQVRFR09SWUlORk8pOw0KK2NvbnN0IHN0YXRpYyBGWF9MT0NBTEVTVUJDQVRFR09SWUlORk8gZ19GWExvY2FsZU51bVN1YkNhdERhdGFbXSA9IHsNCisgICAgezB4NDZmOTU1MzEsIEwicGVyY2VudCIsIEZYX0xPQ0FMRU5VTVBBVFRFUk5fUGVyY2VudH0sDQorICAgIHsweDRjNGU4YWNiLCBMImN1cnJlbmN5IiwgRlhfTE9DQUxFTlVNUEFUVEVSTl9DdXJyZW5jeX0sDQorICAgIHsweDU0MDM0YzJmLCBMImRlY2ltYWwiLCBGWF9MT0NBTEVOVU1QQVRURVJOX0RlY2ltYWx9LA0KKyAgICB7MHg3NTY4ZTZhZSwgTCJpbnRlZ2VyIiwgRlhfTE9DQUxFTlVNUEFUVEVSTl9JbnRlZ2VyfSwNCit9Ow0KK2NvbnN0IHN0YXRpYyBpbnQzMl90IGdfaUZYTG9jYWxlTnVtU3ViQ2F0Q291bnQgPQ0KKyAgICBzaXplb2YoZ19GWExvY2FsZU51bVN1YkNhdERhdGEpIC8gc2l6ZW9mKEZYX0xPQ0FMRVNVQkNBVEVHT1JZSU5GTyk7DQordHlwZWRlZiBzdHJ1Y3QgX0ZYX0xPQ0FMRVRJTUVaT05FSU5GTyB7DQorICBGWF9EV09SRCB1SGFzaDsNCisgIGludDE2X3QgaUhvdXI7DQorICBpbnQxNl90IGlNaW51dGU7DQorfSBGWF9MT0NBTEVUSU1FWk9ORUlORk8sICpGWF9MUExPQ0FMRVRJTUVaT05FSU5GTzsNCit0eXBlZGVmIEZYX0xPQ0FMRVRJTUVaT05FSU5GTyBjb25zdCogRlhfTFBDTE9DQUxFVElNRVpPTkVJTkZPOw0KK2NvbnN0IHN0YXRpYyBGWF9MT0NBTEVUSU1FWk9ORUlORk8gZ19GWExvY2FsZVRpbWVab25lRGF0YVtdID0gew0KKyAgICB7RlhCU1RSX0lEKDAsICdDJywgJ0QnLCAnVCcpLCAtNSwgMH0sIHtGWEJTVFJfSUQoMCwgJ0MnLCAnUycsICdUJyksIC02LCAwfSwNCisgICAge0ZYQlNUUl9JRCgwLCAnRScsICdEJywgJ1QnKSwgLTQsIDB9LCB7RlhCU1RSX0lEKDAsICdFJywgJ1MnLCAnVCcpLCAtNSwgMH0sDQorICAgIHtGWEJTVFJfSUQoMCwgJ00nLCAnRCcsICdUJyksIC02LCAwfSwge0ZYQlNUUl9JRCgwLCAnTScsICdTJywgJ1QnKSwgLTcsIDB9LA0KKyAgICB7RlhCU1RSX0lEKDAsICdQJywgJ0QnLCAnVCcpLCAtNywgMH0sIHtGWEJTVFJfSUQoMCwgJ1AnLCAnUycsICdUJyksIC04LCAwfSwNCit9Ow0KK2NvbnN0IHN0YXRpYyBpbnQzMl90IGdfaUZYTG9jYWxlVGltZVpvbmVDb3VudCA9DQorICAgIHNpemVvZihnX0ZYTG9jYWxlVGltZVpvbmVEYXRhKSAvIHNpemVvZihGWF9MT0NBTEVUSU1FWk9ORUlORk8pOw0KK2NvbnN0IHN0YXRpYyBDRlhfV2lkZVN0cmluZ0MgZ3Nfd3NUZXh0U3ltYm9scyA9IEZYX1dTVFJDKEwiQVhPMDkiKTsNCitjb25zdCBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmdDIGdzX3dzVGltZVN5bWJvbHMgPSBGWF9XU1RSQyhMImhIa0tNU0ZBeloiKTsNCitjb25zdCBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmdDIGdzX3dzRGF0ZVN5bWJvbHMgPSBGWF9XU1RSQyhMIkRKTUVlR2dZd1ciKTsNCitjb25zdCBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmdDIGdzX3dzQ29uc3RDaGFycyA9IEZYX1dTVFJDKEwiLC06Ly4gIik7DQorc3RhdGljIEZYX1NUUlNJWkUgRlhfTG9jYWxfRmluZChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzU3ltYm9scywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIGNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSBuU3RhcnQgPSAwKSB7DQorICBGWF9TVFJTSVpFIG5MZW5ndGggPSB3c1N5bWJvbHMuR2V0TGVuZ3RoKCk7DQorICBpZiAobkxlbmd0aCA8IDEgfHwgblN0YXJ0ID4gbkxlbmd0aCkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBjb25zdCBGWF9XQ0hBUiogbHBzeiA9DQorICAgICAgKGNvbnN0IEZYX1dDSEFSKilGWFNZU193Y3NjaHIod3NTeW1ib2xzLkdldFB0cigpICsgblN0YXJ0LCBjaCk7DQorICByZXR1cm4gKGxwc3ogPT0gTlVMTCkgPyAtMSA6IChGWF9TVFJTSVpFKShscHN6IC0gd3NTeW1ib2xzLkdldFB0cigpKTsNCit9DQorc3RhdGljIGNvbnN0IEZYX1dDSEFSKiBjb25zdCBnc19Mb2NhbE51bWJlclN5bWJvbHNbXSA9IHsNCisgICAgTCJkZWNpbWFsIiwgTCJncm91cGluZyIsICAgICAgIEwicGVyY2VudCIsICAgICAgTCJtaW51cyIsDQorICAgIEwiemVybyIsICAgIEwiY3VycmVuY3lTeW1ib2wiLCBMImN1cnJlbmN5TmFtZSIsDQorfTsNCitJRlhfTG9jYWxlKiBJRlhfTG9jYWxlOjpDcmVhdGUoQ1hNTF9FbGVtZW50KiBwTG9jYWxlRGF0YSkgew0KKyAgcmV0dXJuIG5ldyBDRlhfTG9jYWxlKHBMb2NhbGVEYXRhKTsNCit9DQorQ0ZYX0xvY2FsZTo6Q0ZYX0xvY2FsZShDWE1MX0VsZW1lbnQqIHBMb2NhbGVEYXRhKSB7DQorICBtX3BFbGVtZW50ID0gcExvY2FsZURhdGE7DQorfQ0KK0NGWF9Mb2NhbGU6On5DRlhfTG9jYWxlKCkge30NCitDRlhfV2lkZVN0cmluZyBDRlhfTG9jYWxlOjpHZXROYW1lKCkgew0KKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7DQorfQ0KK3N0YXRpYyBDRlhfV2lkZVN0cmluZyBGWF9HZXRYTUxDb250ZW50KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNTcGFjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWE1MX0VsZW1lbnQqIHB4bWxFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNUYWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpIHsNCisgIENYTUxfRWxlbWVudCogcERhdGVQYXR0ZXJuID0gTlVMTDsNCisgIGludDMyX3QgbkNvdW50ID0gcHhtbEVsZW1lbnQtPkNvdW50RWxlbWVudHMoYnNTcGFjZSwgYnNUYWcpOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIGZvciAoOyBpIDwgbkNvdW50OyBpKyspIHsNCisgICAgcERhdGVQYXR0ZXJuID0gcHhtbEVsZW1lbnQtPkdldEVsZW1lbnQoYnNTcGFjZSwgYnNUYWcsIGkpOw0KKyAgICBpZiAocERhdGVQYXR0ZXJuLT5HZXRBdHRyVmFsdWUoIm5hbWUiKSA9PSB3c05hbWUpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGkgPCBuQ291bnQgJiYgcERhdGVQYXR0ZXJuKSB7DQorICAgIHJldHVybiBwRGF0ZVBhdHRlcm4tPkdldENvbnRlbnQoMCk7DQorICB9DQorICByZXR1cm4gTCIiOw0KK30NCit2b2lkIENGWF9Mb2NhbGU6OkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTCBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c051bVN5bWJvbCkgY29uc3Qgew0KKyAgaWYgKCFtX3BFbGVtZW50KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9CeXRlU3RyaW5nIGJzU3BhY2U7DQorICBDRlhfV2lkZVN0cmluZyB3c05hbWUgPSBnc19Mb2NhbE51bWJlclN5bWJvbHNbZVR5cGVdOw0KKyAgQ1hNTF9FbGVtZW50KiBwTnVtYmVyU3ltYm9scyA9DQorICAgICAgbV9wRWxlbWVudC0+R2V0RWxlbWVudChic1NwYWNlLCAibnVtYmVyU3ltYm9scyIpOw0KKyAgaWYgKCFwTnVtYmVyU3ltYm9scykgew0KKyAgICByZXR1cm47DQorICB9DQorICB3c051bVN5bWJvbCA9DQorICAgICAgRlhfR2V0WE1MQ29udGVudChic1NwYWNlLCBwTnVtYmVyU3ltYm9scywgIm51bWJlclN5bWJvbCIsIHdzTmFtZSk7DQorfQ0KK3ZvaWQgQ0ZYX0xvY2FsZTo6R2V0RGF0ZVRpbWVTeW1ib2xzKENGWF9XaWRlU3RyaW5nJiB3c0R0U3ltYm9sKSBjb25zdCB7DQorICBpZiAoIW1fcEVsZW1lbnQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnNTcGFjZTsNCisgIENYTUxfRWxlbWVudCogcE51bWJlclN5bWJvbHMgPQ0KKyAgICAgIG1fcEVsZW1lbnQtPkdldEVsZW1lbnQoYnNTcGFjZSwgImRhdGVUaW1lU3ltYm9scyIpOw0KKyAgaWYgKCFwTnVtYmVyU3ltYm9scykgew0KKyAgICByZXR1cm47DQorICB9DQorICB3c0R0U3ltYm9sID0gcE51bWJlclN5bWJvbHMtPkdldENvbnRlbnQoMCk7DQorfQ0KK3N0YXRpYyB2b2lkIEZYX0dldENhbGVuZGFyU3ltYm9sKENYTUxfRWxlbWVudCogcFhtbEVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN5bWJvbF90eXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWJiciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NOYW1lKSB7DQorICBDRlhfQnl0ZVN0cmluZyBic1NwYWNlOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgcHN0clN5bWJvbE5hbWVzID0gc3ltYm9sX3R5cGUgKyAiTmFtZXMiOw0KKyAgQ1hNTF9FbGVtZW50KiBwQ2hpbGQgPSBwWG1sRWxlbWVudC0+R2V0RWxlbWVudChic1NwYWNlLCAiY2FsZW5kYXJTeW1ib2xzIik7DQorICBpZiAoIXBDaGlsZCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWE1MX0VsZW1lbnQqIHBTeW1ib2xOYW1lcyA9IHBDaGlsZC0+R2V0RWxlbWVudChic1NwYWNlLCBwc3RyU3ltYm9sTmFtZXMpOw0KKyAgaWYgKCFwU3ltYm9sTmFtZXMpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKHBTeW1ib2xOYW1lcy0+R2V0QXR0ckludGVnZXIoImFiYnIiKSAhPSBiQWJicikgew0KKyAgICBwU3ltYm9sTmFtZXMgPSBwQ2hpbGQtPkdldEVsZW1lbnQoYnNTcGFjZSwgcHN0clN5bWJvbE5hbWVzLCAxKTsNCisgIH0NCisgIGlmIChwU3ltYm9sTmFtZXMgJiYgcFN5bWJvbE5hbWVzLT5HZXRBdHRySW50ZWdlcigiYWJiciIpID09IGJBYmJyKSB7DQorICAgIENYTUxfRWxlbWVudCogcFN5bWJvbE5hbWUgPQ0KKyAgICAgICAgcFN5bWJvbE5hbWVzLT5HZXRFbGVtZW50KGJzU3BhY2UsIHN5bWJvbF90eXBlLCBpbmRleCk7DQorICAgIGlmIChwU3ltYm9sTmFtZSkgew0KKyAgICAgIHdzTmFtZSA9IHBTeW1ib2xOYW1lLT5HZXRDb250ZW50KDApOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0ZYX0xvY2FsZTo6R2V0TW9udGhOYW1lKGludDMyX3Qgbk1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c01vbnRoTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBYmJyKSBjb25zdCB7DQorICBpZiAoIW1fcEVsZW1lbnQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfR2V0Q2FsZW5kYXJTeW1ib2wobV9wRWxlbWVudCwgIm1vbnRoIiwgbk1vbnRoLCBiQWJiciwgd3NNb250aE5hbWUpOw0KK30NCit2b2lkIENGWF9Mb2NhbGU6OkdldERheU5hbWUoaW50MzJfdCBuV2VlaywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF5TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWJicikgY29uc3Qgew0KKyAgaWYgKCFtX3BFbGVtZW50KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0dldENhbGVuZGFyU3ltYm9sKG1fcEVsZW1lbnQsICJkYXkiLCBuV2VlaywgYkFiYnIsIHdzRGF5TmFtZSk7DQorfQ0KK3ZvaWQgQ0ZYX0xvY2FsZTo6R2V0TWVyaWRpZW1OYW1lKENGWF9XaWRlU3RyaW5nJiB3c01lcmlkaWVtTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBTSkgY29uc3Qgew0KKyAgaWYgKCFtX3BFbGVtZW50KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0dldENhbGVuZGFyU3ltYm9sKG1fcEVsZW1lbnQsICJtZXJpZGllbSIsIGJBTSA/IDAgOiAxLCBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICAgIHdzTWVyaWRpZW1OYW1lKTsNCit9DQorc3RhdGljIGludDMyX3QgRlhfUGFyc2VUaW1lWm9uZShjb25zdCBGWF9XQ0hBUiogcFN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1RJTUVaT05FJiB0eikgew0KKyAgdHoudHpIb3VyID0gMDsNCisgIHR6LnR6TWludXRlID0gMDsNCisgIGlmIChpTGVuIDwgMCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGludDMyX3QgaVN0YXJ0ID0gMTsNCisgIGludDMyX3QgaUVuZCA9IGlTdGFydCArIDI7DQorICB3aGlsZSAoaVN0YXJ0IDwgaUxlbiAmJiBpU3RhcnQgPCBpRW5kKSB7DQorICAgIHR6LnR6SG91ciA9IHR6LnR6SG91ciAqIDEwICsgcFN0cltpU3RhcnQrK10gLSAnMCc7DQorICB9DQorICBpZiAoaVN0YXJ0IDwgaUxlbiAmJiBwU3RyW2lTdGFydF0gPT0gJzonKSB7DQorICAgIGlTdGFydCsrOw0KKyAgfQ0KKyAgaUVuZCA9IGlTdGFydCArIDI7DQorICB3aGlsZSAoaVN0YXJ0IDwgaUxlbiAmJiBpU3RhcnQgPCBpRW5kKSB7DQorICAgIHR6LnR6TWludXRlID0gdHoudHpNaW51dGUgKiAxMCArIHBTdHJbaVN0YXJ0KytdIC0gJzAnOw0KKyAgfQ0KKyAgaWYgKHBTdHJbMF0gPT0gJy0nKSB7DQorICAgIHR6LnR6SG91ciA9IC10ei50ekhvdXI7DQorICB9DQorICByZXR1cm4gaVN0YXJ0Ow0KK30NCit2b2lkIENGWF9Mb2NhbGU6OkdldFRpbWVab25lKEZYX1RJTUVaT05FJiB0eikgY29uc3Qgew0KKyAgdHoudHpIb3VyID0gMDsNCisgIHR6LnR6TWludXRlID0gMDsNCisgIGlmICghbV9wRWxlbWVudCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWE1MX0VsZW1lbnQqIHB4bWxUaW1lWm9uZSA9IG1fcEVsZW1lbnQtPkdldEVsZW1lbnQoIiIsICJ0aW1lWm9uZSIpOw0KKyAgaWYgKHB4bWxUaW1lWm9uZSkgew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1RpbWVab25lID0gcHhtbFRpbWVab25lLT5HZXRDb250ZW50KDApOw0KKyAgICBGWF9QYXJzZVRpbWVab25lKHdzVGltZVpvbmUsIHdzVGltZVpvbmUuR2V0TGVuZ3RoKCksIHR6KTsNCisgIH0NCit9DQordm9pZCBDRlhfTG9jYWxlOjpHZXRFcmFOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0VyYU5hbWUsIEZYX0JPT0wgYkFEKSBjb25zdCB7DQorICBpZiAoIW1fcEVsZW1lbnQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfR2V0Q2FsZW5kYXJTeW1ib2wobV9wRWxlbWVudCwgImVyYSIsIGJBRCA/IDAgOiAxLCBGQUxTRSwgd3NFcmFOYW1lKTsNCit9DQorc3RhdGljIHZvaWQgRlhfR2V0UGF0dGVybihDWE1MX0VsZW1lbnQqIHBYbWxFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJzQ2F0ZWdvcnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTdWJDYXRlZ29yeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIHsNCisgIENGWF9CeXRlU3RyaW5nIGJzU3BhY2U7DQorICBDWE1MX0VsZW1lbnQqIHBEYXRlUGF0dGVybnMgPQ0KKyAgICAgIHBYbWxFbGVtZW50LT5HZXRFbGVtZW50KGJzU3BhY2UsIGJzQ2F0ZWdvcnkgKyAicyIpOw0KKyAgaWYgKCFwRGF0ZVBhdHRlcm5zKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHdzUGF0dGVybiA9DQorICAgICAgRlhfR2V0WE1MQ29udGVudChic1NwYWNlLCBwRGF0ZVBhdHRlcm5zLCBic0NhdGVnb3J5LCB3c1N1YkNhdGVnb3J5KTsNCit9DQorc3RhdGljIHZvaWQgRlhfR2V0RGF0ZVRpbWVQYXR0ZXJuKENYTUxfRWxlbWVudCogcFhtbEVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic0NhdGVnb3J5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1R5cGUgPSBnX0ZYTG9jYWxlRGF0ZVRpbWVTdWJDYXREYXRhW2VUeXBlXS5wTmFtZTsNCisgIEZYX0dldFBhdHRlcm4ocFhtbEVsZW1lbnQsIGJzQ2F0ZWdvcnksIHdzVHlwZSwgd3NQYXR0ZXJuKTsNCit9DQordm9pZCBDRlhfTG9jYWxlOjpHZXREYXRlUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Qgew0KKyAgaWYgKCFtX3BFbGVtZW50KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0dldERhdGVUaW1lUGF0dGVybihtX3BFbGVtZW50LCAiZGF0ZVBhdHRlcm4iLCBlVHlwZSwgd3NQYXR0ZXJuKTsNCit9DQordm9pZCBDRlhfTG9jYWxlOjpHZXRUaW1lUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Qgew0KKyAgaWYgKCFtX3BFbGVtZW50KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0dldERhdGVUaW1lUGF0dGVybihtX3BFbGVtZW50LCAidGltZVBhdHRlcm4iLCBlVHlwZSwgd3NQYXR0ZXJuKTsNCit9DQordm9pZCBDRlhfTG9jYWxlOjpHZXROdW1QYXR0ZXJuKEZYX0xPQ0FMRU5VTVNVQkNBVEVHT1JZIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdCB7DQorICBDRlhfV2lkZVN0cmluZyB3c1R5cGUgPSBnX0ZYTG9jYWxlTnVtU3ViQ2F0RGF0YVtlVHlwZV0ucE5hbWU7DQorICBGWF9HZXRQYXR0ZXJuKG1fcEVsZW1lbnQsICJudW1iZXJQYXR0ZXJuIiwgd3NUeXBlLCB3c1BhdHRlcm4pOw0KK30NCitzdGF0aWMgRlhfQk9PTCBGWF9Jc0RpZ2l0KEZYX1dDSEFSIGMpIHsNCisgIHJldHVybiBjID49ICcwJyAmJiBjIDw9ICc5JzsNCit9DQorc3RhdGljIEZYX0JPT0wgRlhfSXNBbHBoYShGWF9XQ0hBUiBjKSB7DQorICByZXR1cm4gKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpOw0KK30NCitzdGF0aWMgRlhfQk9PTCBGWF9Jc1NwYWNlKEZYX1dDSEFSIGMpIHsNCisgIHJldHVybiAoYyA9PSAweDIwKSB8fCAoYyA9PSAweDBkKSB8fCAoYyA9PSAweDBhKSB8fCAoYyA9PSAweDA5KTsNCit9DQorc3RhdGljIGNvbnN0IEZYX0ZMT0FUIGdzX2ZyYWN0aW9uX3NjYWxlc1tdID0gew0KKyAgICAwLjFmLCAgICAgICAgIDAuMDFmLCAgICAgICAgIDAuMDAxZiwgICAgICAgIDAuMDAwMWYsDQorICAgIDAuMDAwMDFmLCAgICAgMC4wMDAwMDFmLCAgICAgMC4wMDAwMDAxZiwgICAgMC4wMDAwMDAwMWYsDQorICAgIDAuMDAwMDAwMDAxZiwgMC4wMDAwMDAwMDAxZiwgMC4wMDAwMDAwMDAwMWZ9Ow0KK3N0YXRpYyBjb25zdCBpbnQzMl90IGdzX2ZyYWN0aW9uX2NvdW50ID0NCisgICAgc2l6ZW9mKGdzX2ZyYWN0aW9uX3NjYWxlcykgLyBzaXplb2YoRlhfRkxPQVQpOw0KK2NsYXNzIENGWF9MQ051bWVyaWMgew0KKyBwdWJsaWM6DQorICBDRlhfTENOdW1lcmljKCk7DQorICBDRlhfTENOdW1lcmljKGludDY0X3QgaW50ZWdyYWwsDQorICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZyYWN0aW9uYWwgPSAwLA0KKyAgICAgICAgICAgICAgICBpbnQzMl90IGV4cG9uZW50ID0gMCk7DQorICBDRlhfTENOdW1lcmljKEZYX0ZMT0FUIGRiUmV0VmFsdWUpOw0KKyAgQ0ZYX0xDTnVtZXJpYyhkb3VibGUgZGJ2YWx1ZSk7DQorICBDRlhfTENOdW1lcmljKENGWF9XaWRlU3RyaW5nJiB3c051bWVyaWMpOw0KKw0KKyAgRlhfRkxPQVQgR2V0RmxvYXQoKSBjb25zdDsNCisgIGRvdWJsZSBHZXREb3VibGUoKSBjb25zdDsNCisgIENGWF9XaWRlU3RyaW5nIFRvU3RyaW5nKCkgY29uc3Q7DQorICBDRlhfV2lkZVN0cmluZyBUb1N0cmluZyhpbnQzMl90IG5UcmVhZGluZywgRlhfQk9PTCBiVHJpbVRhaWxaZXJvcykgY29uc3Q7DQorICBpbnQ2NF90IG1fSW50ZWdyYWw7DQorICBGWF9EV09SRCBtX0ZyYWN0aW9uYWw7DQorI2lmZGVmIEZYX05VTV9ET1VCTEUNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NWYWx1ZTsNCisjZW5kaWYNCisgIGludDMyX3QgbV9FeHBvbmVudDsNCit9Ow0KK3N0YXRpYyBGWF9CT09MIEZYX1dTdHJpbmdUb051bWVyaWMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTENOdW1lcmljJiBsY251bSkgew0KKyAgaW50NjRfdCogcEludGVncmFsID0gJmxjbnVtLm1fSW50ZWdyYWw7DQorICBGWF9EV09SRCogcEZyYWN0aW9uYWwgPSAmbGNudW0ubV9GcmFjdGlvbmFsOw0KKyAgaW50MzJfdCogcEV4cG9uZW50ID0gJmxjbnVtLm1fRXhwb25lbnQ7DQorICAqcEludGVncmFsID0gMDsNCisgICpwRnJhY3Rpb25hbCA9IDA7DQorICAqcEV4cG9uZW50ID0gMDsNCisjaWZkZWYgRlhfTlVNX0RPVUJMRQ0KKyAgbGNudW0ubV93c1ZhbHVlLkVtcHR5KCk7DQorI2VuZGlmDQorICBpZiAod3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgY29uc3QgaW50MzJfdCBuSW50ZWdyYWxNYXhMZW4gPSAxNzsNCisgIGludDMyX3QgY2MgPSAwOw0KKyAgRlhfQk9PTCBiTmVnYXRpdmUgPSBGQUxTRSwgYkV4cFNpZ24gPSBGQUxTRTsNCisgIGNvbnN0IEZYX1dDSEFSKiBzdHIgPSAoY29uc3QgRlhfV0NIQVIqKXdzVmFsdWU7DQorICBpbnQzMl90IGxlbiA9IHdzVmFsdWUuR2V0TGVuZ3RoKCk7DQorICB3aGlsZSAoY2MgPCBsZW4gJiYgRlhfSXNTcGFjZShzdHJbY2NdKSkgew0KKyAgICBjYysrOw0KKyAgfQ0KKyAgaWYgKGNjID49IGxlbikgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoc3RyW2NjXSA9PSAnKycpIHsNCisgICAgY2MrKzsNCisgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnLScpIHsNCisgICAgYk5lZ2F0aXZlID0gVFJVRTsNCisgICAgY2MrKzsNCisgIH0NCisgIGludDMyX3QgbkludGVncmFsTGVuID0gMDsNCisgIHdoaWxlIChjYyA8IGxlbikgew0KKyAgICBpZiAoc3RyW2NjXSA9PSAnLicpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICBpZiAoKHN0cltjY10gPT0gJ0UnIHx8IHN0cltjY10gPT0gJ2UnKSkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKG5JbnRlZ3JhbExlbiA8IG5JbnRlZ3JhbE1heExlbikgew0KKyAgICAgICpwSW50ZWdyYWwgPSAqcEludGVncmFsICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KKyAgICAgIG5JbnRlZ3JhbExlbisrOw0KKyAgICB9DQorICAgIGNjKys7DQorICB9DQorICAqcEludGVncmFsID0gYk5lZ2F0aXZlID8gLSpwSW50ZWdyYWwgOiAqcEludGVncmFsOw0KKyAgaWYgKGNjIDwgbGVuICYmIHN0cltjY10gPT0gJy4nKSB7DQorICAgIGludCBzY2FsZSA9IDA7DQorICAgIGRvdWJsZSBmcmFjdGlvbiA9IDAuMDsNCisgICAgY2MrKzsNCisgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQorICAgICAgaWYgKHNjYWxlID49IGdzX2ZyYWN0aW9uX2NvdW50KSB7DQorICAgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCisgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2MrKzsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICBpZiAoKHN0cltjY10gPT0gJ0UnIHx8IHN0cltjY10gPT0gJ2UnKSkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgZnJhY3Rpb24gKz0gZ3NfZnJhY3Rpb25fc2NhbGVzW3NjYWxlXSAqIChzdHJbY2NdIC0gJzAnKTsNCisgICAgICBzY2FsZSsrOw0KKyAgICAgIGNjKys7DQorICAgIH0NCisgICAgKnBGcmFjdGlvbmFsID0gKEZYX0RXT1JEKShmcmFjdGlvbiAqIDQyOTQ5NjcyOTYuMCk7DQorICB9DQorICBpZiAoY2MgPCBsZW4gJiYgKHN0cltjY10gPT0gJ0UnIHx8IHN0cltjY10gPT0gJ2UnKSkgew0KKyAgICBjYysrOw0KKyAgICBpZiAoY2MgPCBsZW4pIHsNCisgICAgICBpZiAoc3RyW2NjXSA9PSAnKycpIHsNCisgICAgICAgIGNjKys7DQorICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICctJykgew0KKyAgICAgICAgYkV4cFNpZ24gPSBUUlVFOw0KKyAgICAgICAgY2MrKzsNCisgICAgICB9DQorICAgIH0NCisgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQorICAgICAgaWYgKEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgKnBFeHBvbmVudCA9ICpwRXhwb25lbnQgKiAxMCArIHN0cltjY10gLSAnMCc7DQorICAgICAgY2MrKzsNCisgICAgfQ0KKyAgICAqcEV4cG9uZW50ID0gYkV4cFNpZ24gPyAtKnBFeHBvbmVudCA6ICpwRXhwb25lbnQ7DQorICB9DQorI2lmZGVmIEZYX05VTV9ET1VCTEUNCisgIGVsc2Ugew0KKyAgICBsY251bS5tX3dzVmFsdWUgPSB3c1ZhbHVlOw0KKyAgfQ0KKyNlbmRpZg0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0NGWF9MQ051bWVyaWM6OkNGWF9MQ051bWVyaWMoKSB7DQorICBtX0ludGVncmFsID0gMDsNCisgIG1fRnJhY3Rpb25hbCA9IDA7DQorICBtX0V4cG9uZW50ID0gMDsNCit9DQorQ0ZYX0xDTnVtZXJpYzo6Q0ZYX0xDTnVtZXJpYyhpbnQ2NF90IGludGVncmFsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZnJhY3Rpb25hbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXhwb25lbnQpIHsNCisgIG1fSW50ZWdyYWwgPSBpbnRlZ3JhbDsNCisgIG1fRnJhY3Rpb25hbCA9IGZyYWN0aW9uYWw7DQorICBtX0V4cG9uZW50ID0gZXhwb25lbnQ7DQorfQ0KK0NGWF9MQ051bWVyaWM6OkNGWF9MQ051bWVyaWMoRlhfRkxPQVQgZGJSZXRWYWx1ZSkgew0KKyAgbV9JbnRlZ3JhbCA9IChpbnQ2NF90KWRiUmV0VmFsdWU7DQorICBtX0ZyYWN0aW9uYWwgPSAoRlhfRFdPUkQpKCgoZGJSZXRWYWx1ZSA+IDApID8gKGRiUmV0VmFsdWUgLSBtX0ludGVncmFsKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChtX0ludGVncmFsIC0gZGJSZXRWYWx1ZSkpICoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDI5NDk2NzI5Nik7DQorICBtX0V4cG9uZW50ID0gMDsNCit9DQorQ0ZYX0xDTnVtZXJpYzo6Q0ZYX0xDTnVtZXJpYyhkb3VibGUgZGJ2YWx1ZSkgew0KKyAgbV9JbnRlZ3JhbCA9IChpbnQ2NF90KWRidmFsdWU7DQorICBtX0ZyYWN0aW9uYWwgPSAoRlhfRFdPUkQpKA0KKyAgICAgICgoZGJ2YWx1ZSA+IDApID8gKGRidmFsdWUgLSBtX0ludGVncmFsKSA6IChtX0ludGVncmFsIC0gZGJ2YWx1ZSkpICoNCisgICAgICA0Mjk0OTY3Mjk2KTsNCisgIG1fRXhwb25lbnQgPSAwOw0KK30NCitDRlhfTENOdW1lcmljOjpDRlhfTENOdW1lcmljKENGWF9XaWRlU3RyaW5nJiB3c051bWVyaWMpIHsNCisgIEZYX1dTdHJpbmdUb051bWVyaWMod3NOdW1lcmljLCAqdGhpcyk7DQorfQ0KK0ZYX0ZMT0FUIENGWF9MQ051bWVyaWM6OkdldEZsb2F0KCkgY29uc3Qgew0KKyAgRlhfRkxPQVQgZGJSZXRWYWx1ZSA9IG1fRnJhY3Rpb25hbCAvIDQyOTQ5NjcyOTYuMGY7DQorICBkYlJldFZhbHVlID0gbV9JbnRlZ3JhbCArIChtX0ludGVncmFsID49IDAgPyBkYlJldFZhbHVlIDogLWRiUmV0VmFsdWUpOw0KKyAgaWYgKG1fRXhwb25lbnQgIT0gMCkgew0KKyAgICBkYlJldFZhbHVlICo9IEZYU1lTX3BvdygxMCwgKEZYX0ZMT0FUKW1fRXhwb25lbnQpOw0KKyAgfQ0KKyAgcmV0dXJuIGRiUmV0VmFsdWU7DQorfQ0KK2RvdWJsZSBDRlhfTENOdW1lcmljOjpHZXREb3VibGUoKSBjb25zdCB7DQorICBkb3VibGUgdmFsdWUgPSBtX0ZyYWN0aW9uYWwgLyA0Mjk0OTY3Mjk2LjA7DQorICB2YWx1ZSA9IG1fSW50ZWdyYWwgKyAobV9JbnRlZ3JhbCA+PSAwID8gdmFsdWUgOiAtdmFsdWUpOw0KKyAgaWYgKG1fRXhwb25lbnQgIT0gMCkgew0KKyAgICB2YWx1ZSAqPSBGWFNZU19wb3coMTAsIChGWF9GTE9BVCltX0V4cG9uZW50KTsNCisgIH0NCisgIHJldHVybiB2YWx1ZTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0ZYX0xDTnVtZXJpYzo6VG9TdHJpbmcoKSBjb25zdCB7DQorICByZXR1cm4gVG9TdHJpbmcoOCwgVFJVRSk7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENGWF9MQ051bWVyaWM6OlRvU3RyaW5nKGludDMyX3QgblRyZWFkaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRyaW1UYWlsWmVyb3MpIGNvbnN0IHsNCisjaWZkZWYgRlhfTlVNX0RPVUJMRQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXN1bHQ7DQorICBpZiAoIW1fd3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgY29uc3QgaW50MzJfdCBuSW50ZWdyYWxNYXhMZW4gPSAxNzsNCisgICAgaW50MzJfdCBjYyA9IDA7DQorICAgIEZYX0JPT0wgYk5lZ2F0aXZlID0gRkFMU0UsIGJFeHBTaWduID0gRkFMU0U7DQorICAgIGNvbnN0IEZYX1dDSEFSKiBzdHIgPSAoY29uc3QgRlhfV0NIQVIqKW1fd3NWYWx1ZTsNCisgICAgaW50MzJfdCBsZW4gPSBtX3dzVmFsdWUuR2V0TGVuZ3RoKCk7DQorICAgIHdoaWxlIChjYyA8IGxlbiAmJiBGWF9Jc1NwYWNlKHN0cltjY10pKSB7DQorICAgICAgY2MrKzsNCisgICAgfQ0KKyAgICBpZiAoY2MgPj0gbGVuKSB7DQorICAgICAgcmV0dXJuIHdzUmVzdWx0Ow0KKyAgICB9DQorICAgIGlmIChzdHJbY2NdID09ICcrJykgew0KKyAgICAgIGNjKys7DQorICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnLScpIHsNCisgICAgICBiTmVnYXRpdmUgPSBUUlVFOw0KKyAgICAgIGNjKys7DQorICAgIH0NCisgICAgaW50MzJfdCBuSW50ZWdyYWxMZW4gPSAwOw0KKyAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCisgICAgICBpZiAoc3RyW2NjXSA9PSAnLicpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgIGlmICgoc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScpKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmV0dXJuIHdzUmVzdWx0Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAobkludGVncmFsTGVuIDwgbkludGVncmFsTWF4TGVuKSB7DQorICAgICAgICAqcEludGVncmFsID0gKnBJbnRlZ3JhbCAqIDEwICsgc3RyW2NjXSAtICcwJzsNCisgICAgICAgIG5JbnRlZ3JhbExlbisrOw0KKyAgICAgIH0NCisgICAgICBjYysrOw0KKyAgICB9DQorICAgICpwSW50ZWdyYWwgPSBiTmVnYXRpdmUgPyAtKnBJbnRlZ3JhbCA6ICpwSW50ZWdyYWw7DQorICAgIGlmIChjYyA8IGxlbiAmJiBzdHJbY2NdID09ICcuJykgew0KKyAgICAgIGludCBzY2FsZSA9IDA7DQorICAgICAgZG91YmxlIGZyYWN0aW9uID0gMC4wOw0KKyAgICAgIGNjKys7DQorICAgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQorICAgICAgICBpZiAoc2NhbGUgPj0gZ3NfZnJhY3Rpb25fY291bnQpIHsNCisgICAgICAgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQorICAgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgIGlmICgoc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScpKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBmcmFjdGlvbiArPSBnc19mcmFjdGlvbl9zY2FsZXNbc2NhbGVdICogKHN0cltjY10gLSAnMCcpOw0KKyAgICAgICAgc2NhbGUrKzsNCisgICAgICAgIGNjKys7DQorICAgICAgfQ0KKyAgICAgICpwRnJhY3Rpb25hbCA9IChGWF9EV09SRCkoZnJhY3Rpb24gKiA0Mjk0OTY3Mjk2LjApOw0KKyAgICB9DQorICB9DQorICBkb3VibGUgZGJWYWxldSA9IEdldERvdWJsZSgpOw0KKyAgaW50NjRfdCBpSW50ZSA9IChpbnQ2NF90KWRiVmFsZXU7DQorICB3c1Jlc3VsdC5Gb3JtYXQoTCIlbCIsIChpbnQ2NF90KWlJbnRlKTsNCisgIGlmIChtX0ZyYWN0aW9uYWwpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXQ7DQorICAgIHdzRm9ybWF0LkZvcm1hdChMIiUlLiVkRyIsIG5UcmVhZGluZyk7DQorICAgIGRvdWJsZSBkYmxNYW50aXNzYSA9IChkYlZhbGV1ID4gMCkgPyAoZGJWYWxldSAtIGlJbnRlKSA6IChpSW50ZSAtIGRiVmFsZXUpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0ZyYWM7DQorICAgIHdzRnJhYy5Gb3JtYXQoKGNvbnN0IEZYX1dDSEFSKil3c0Zvcm1hdCwgZGJsTWFudGlzc2EpOw0KKyAgICB3c1Jlc3VsdCArPQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDKChjb25zdCBGWF9XQ0hBUiopd3NGcmFjICsgMSwgd3NGcmFjLkdldExlbmd0aCgpIC0gMSk7DQorICAgIGlmIChiVHJpbVRhaWxaZXJvcyAmJiBuVHJlYWRpbmcgPiAwKSB7DQorICAgICAgd3NSZXN1bHQuVHJpbVJpZ2h0KEwiMCIpOw0KKyAgICAgIHdzUmVzdWx0LlRyaW1SaWdodChMIi4iKTsNCisgICAgfQ0KKyAgfQ0KKyNlbmRpZg0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXQ7DQorICB3c0Zvcm1hdC5Gb3JtYXQoTCIlJS4lZGYiLCBuVHJlYWRpbmcpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXN1bHQ7DQorICB3c1Jlc3VsdC5Gb3JtYXQod3NGb3JtYXQuY19zdHIoKSwgR2V0RG91YmxlKCkpOw0KKyAgaWYgKGJUcmltVGFpbFplcm9zICYmIG5UcmVhZGluZyA+IDApIHsNCisgICAgd3NSZXN1bHQuVHJpbVJpZ2h0KEwiMCIpOw0KKyAgICB3c1Jlc3VsdC5UcmltUmlnaHQoTCIuIik7DQorICB9DQorICByZXR1cm4gd3NSZXN1bHQ7DQorfQ0KK0lGWF9Gb3JtYXRTdHJpbmcqIElGWF9Gb3JtYXRTdHJpbmc6OkNyZWF0ZShJRlhfTG9jYWxlTWdyKiBwTG9jYWxlTWdyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVc2VMQ0lEKSB7DQorICBpZiAoIXBMb2NhbGVNZ3IpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gbmV3IENGWF9Gb3JtYXRTdHJpbmcocExvY2FsZU1nciwgYlVzZUxDSUQpOw0KK30NCitDRlhfRm9ybWF0U3RyaW5nOjpDRlhfRm9ybWF0U3RyaW5nKElGWF9Mb2NhbGVNZ3IqIHBMb2NhbGVNZ3IsIEZYX0JPT0wgYlVzZUxDSUQpDQorICAgIDogbV9wTG9jYWxlTWdyKHBMb2NhbGVNZ3IpLCBtX2JVc2VMQ0lEKGJVc2VMQ0lEKSB7fQ0KK0NGWF9Gb3JtYXRTdHJpbmc6On5DRlhfRm9ybWF0U3RyaW5nKCkge30NCit2b2lkIENGWF9Gb3JtYXRTdHJpbmc6OlNwbGl0Rm9ybWF0U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdFN0cmluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQXJyYXkmIHdzUGF0dGVybnMpIHsNCisgIGludDMyX3QgaVN0ckxlbiA9IHdzRm9ybWF0U3RyaW5nLkdldExlbmd0aCgpOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBTdHIgPSAoY29uc3QgRlhfV0NIQVIqKXdzRm9ybWF0U3RyaW5nOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBUb2tlbiA9IHBTdHI7DQorICBjb25zdCBGWF9XQ0hBUiogcEVuZCA9IHBTdHIgKyBpU3RyTGVuOw0KKyAgRlhfQk9PTCBpUXVvdGUgPSBGQUxTRTsNCisgIHdoaWxlIChUUlVFKSB7DQorICAgIGlmIChwU3RyID49IHBFbmQpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyBzdWIocFRva2VuLCBwU3RyIC0gcFRva2VuKTsNCisgICAgICB3c1BhdHRlcm5zLkFkZChzdWIpOw0KKyAgICAgIHJldHVybjsNCisgICAgfSBlbHNlIGlmICgqcFN0ciA9PSAnXCcnKSB7DQorICAgICAgaVF1b3RlID0gIWlRdW90ZTsNCisgICAgfSBlbHNlIGlmICgqcFN0ciA9PSBMJ3wnICYmICFpUXVvdGUpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyBzdWIocFRva2VuLCBwU3RyIC0gcFRva2VuKTsNCisgICAgICB3c1BhdHRlcm5zLkFkZChzdWIpOw0KKyAgICAgIHBUb2tlbiA9IHBTdHIgKyAxOw0KKyAgICB9DQorICAgIHBTdHIrKzsNCisgIH0NCit9DQorc3RhdGljIENGWF9XaWRlU3RyaW5nIEZYX0dldExpdGVyYWxUZXh0KGNvbnN0IEZYX1dDSEFSKiBwU3RyUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlblBhdHRlcm4pIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzT3V0cHV0Ow0KKyAgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSAhPSAnXCcnKSB7DQorICAgIHJldHVybiB3c091dHB1dDsNCisgIH0NCisgIGlQYXR0ZXJuKys7DQorICBpbnQzMl90IGlRdW90ZSA9IDE7DQorICB3aGlsZSAoaVBhdHRlcm4gPCBpTGVuUGF0dGVybikgew0KKyAgICBpZiAocFN0clBhdHRlcm5baVBhdHRlcm5dID09ICdcJycpIHsNCisgICAgICBpUXVvdGUrKzsNCisgICAgICBpZiAoKGlQYXR0ZXJuICsgMSA+PSBpTGVuUGF0dGVybikgfHwNCisgICAgICAgICAgKChwU3RyUGF0dGVybltpUGF0dGVybiArIDFdICE9ICdcJycpICYmIChpUXVvdGUgJSAyID09IDApKSkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlRdW90ZSsrOw0KKyAgICAgIH0NCisgICAgICBpUGF0dGVybisrOw0KKyAgICB9IGVsc2UgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSA9PSAnXFwnICYmIChpUGF0dGVybiArIDEgPCBpTGVuUGF0dGVybikgJiYNCisgICAgICAgICAgICAgICBwU3RyUGF0dGVybltpUGF0dGVybiArIDFdID09ICd1Jykgew0KKyAgICAgIGludDMyX3QgaUtleVZhbHVlID0gMDsNCisgICAgICBpUGF0dGVybiArPSAyOw0KKyAgICAgIGludDMyX3QgaSA9IDA7DQorICAgICAgd2hpbGUgKGlQYXR0ZXJuIDwgaUxlblBhdHRlcm4gJiYgaSsrIDwgNCkgew0KKyAgICAgICAgRlhfV0NIQVIgY2ggPSBwU3RyUGF0dGVybltpUGF0dGVybisrXTsNCisgICAgICAgIGlmICgoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykpIHsNCisgICAgICAgICAgaUtleVZhbHVlID0gaUtleVZhbHVlICogMTYgKyBjaCAtICcwJzsNCisgICAgICAgIH0gZWxzZSBpZiAoKGNoID49ICdhJyAmJiBjaCA8PSAnZicpKSB7DQorICAgICAgICAgIGlLZXlWYWx1ZSA9IGlLZXlWYWx1ZSAqIDE2ICsgY2ggLSAnYScgKyAxMDsNCisgICAgICAgIH0gZWxzZSBpZiAoKGNoID49ICdBJyAmJiBjaCA8PSAnRicpKSB7DQorICAgICAgICAgIGlLZXlWYWx1ZSA9IGlLZXlWYWx1ZSAqIDE2ICsgY2ggLSAnQScgKyAxMDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgaWYgKGlLZXlWYWx1ZSAhPSAwKSB7DQorICAgICAgICB3c091dHB1dCArPSAoRlhfV0NIQVIpKGlLZXlWYWx1ZSAmIDB4MDAwMEZGRkYpOw0KKyAgICAgIH0NCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICB3c091dHB1dCArPSBwU3RyUGF0dGVybltpUGF0dGVybisrXTsNCisgIH0NCisgIHJldHVybiB3c091dHB1dDsNCit9DQorc3RhdGljIENGWF9XaWRlU3RyaW5nIEZYX0dldExpdGVyYWxUZXh0UmV2ZXJzZShjb25zdCBGWF9XQ0hBUiogcFN0clBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpUGF0dGVybikgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NPdXRwdXQ7DQorICBpZiAocFN0clBhdHRlcm5baVBhdHRlcm5dICE9ICdcJycpIHsNCisgICAgcmV0dXJuIHdzT3V0cHV0Ow0KKyAgfQ0KKyAgaVBhdHRlcm4tLTsNCisgIGludDMyX3QgaVF1b3RlID0gMTsNCisgIHdoaWxlIChpUGF0dGVybiA+PSAwKSB7DQorICAgIGlmIChwU3RyUGF0dGVybltpUGF0dGVybl0gPT0gJ1wnJykgew0KKyAgICAgIGlRdW90ZSsrOw0KKyAgICAgIGlmIChpUGF0dGVybiAtIDEgPj0gMCB8fA0KKyAgICAgICAgICAoKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuIC0gMV0gIT0gJ1wnJykgJiYgKGlRdW90ZSAlIDIgPT0gMCkpKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaVF1b3RlKys7DQorICAgICAgfQ0KKyAgICAgIGlQYXR0ZXJuLS07DQorICAgIH0gZWxzZSBpZiAocFN0clBhdHRlcm5baVBhdHRlcm5dID09ICdcXCcgJiYNCisgICAgICAgICAgICAgICBwU3RyUGF0dGVybltpUGF0dGVybiArIDFdID09ICd1Jykgew0KKyAgICAgIGlQYXR0ZXJuLS07DQorICAgICAgaW50MzJfdCBpS2V5VmFsdWUgPSAwOw0KKyAgICAgIGludDMyX3QgaUxlbiA9IHdzT3V0cHV0LkdldExlbmd0aCgpOw0KKyAgICAgIGludDMyX3QgaSA9IDE7DQorICAgICAgZm9yICg7IGkgPCBpTGVuICYmIGkgPCA1OyBpKyspIHsNCisgICAgICAgIEZYX1dDSEFSIGNoID0gd3NPdXRwdXRbaV07DQorICAgICAgICBpZiAoKGNoID49ICcwJyAmJiBjaCA8PSAnOScpKSB7DQorICAgICAgICAgIGlLZXlWYWx1ZSA9IGlLZXlWYWx1ZSAqIDE2ICsgY2ggLSAnMCc7DQorICAgICAgICB9IGVsc2UgaWYgKChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKSkgew0KKyAgICAgICAgICBpS2V5VmFsdWUgPSBpS2V5VmFsdWUgKiAxNiArIGNoIC0gJ2EnICsgMTA7DQorICAgICAgICB9IGVsc2UgaWYgKChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKSkgew0KKyAgICAgICAgICBpS2V5VmFsdWUgPSBpS2V5VmFsdWUgKiAxNiArIGNoIC0gJ0EnICsgMTA7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmIChpS2V5VmFsdWUgIT0gMCkgew0KKyAgICAgICAgd3NPdXRwdXQuRGVsZXRlKDAsIGkpOw0KKyAgICAgICAgd3NPdXRwdXQgPSAoRlhfV0NIQVIpKGlLZXlWYWx1ZSAmIDB4MDAwMEZGRkYpICsgd3NPdXRwdXQ7DQorICAgICAgfQ0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIHdzT3V0cHV0ID0gcFN0clBhdHRlcm5baVBhdHRlcm4tLV0gKyB3c091dHB1dDsNCisgIH0NCisgIHJldHVybiB3c091dHB1dDsNCit9DQorRlhfTE9DQUxFQ0FURUdPUlkgQ0ZYX0Zvcm1hdFN0cmluZzo6R2V0Q2F0ZWdvcnkoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIHsNCisgIEZYX0xPQ0FMRUNBVEVHT1JZIGVDYXRlZ29yeSA9IEZYX0xPQ0FMRUNBVEVHT1JZX1Vua25vd247DQorICBpbnQzMl90IGNjZiA9IDA7DQorICBpbnQzMl90IGlMZW5mID0gd3NQYXR0ZXJuLkdldExlbmd0aCgpOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBTdHIgPSAoY29uc3QgRlhfV0NIQVIqKXdzUGF0dGVybjsNCisgIEZYX0JPT0wgYkJyYWNlT3BlbiA9IEZBTFNFOw0KKyAgd2hpbGUgKGNjZiA8IGlMZW5mKSB7DQorICAgIGlmIChwU3RyW2NjZl0gPT0gJ1wnJykgew0KKyAgICAgIEZYX0dldExpdGVyYWxUZXh0KHBTdHIsIGNjZiwgaUxlbmYpOw0KKyAgICB9IGVsc2UgaWYgKCFiQnJhY2VPcGVuICYmIEZYX0xvY2FsX0ZpbmQoZ3Nfd3NDb25zdENoYXJzLCBwU3RyW2NjZl0pIDwgMCkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2F0ZWdvcnkocFN0cltjY2ZdKTsNCisgICAgICBjY2YrKzsNCisgICAgICB3aGlsZSAoVFJVRSkgew0KKyAgICAgICAgaWYgKGNjZiA9PSBpTGVuZikgew0KKyAgICAgICAgICByZXR1cm4gZUNhdGVnb3J5Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBTdHJbY2NmXSA9PSAnLicgfHwgcFN0cltjY2ZdID09ICcoJykgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwU3RyW2NjZl0gPT0gJ3snKSB7DQorICAgICAgICAgIGJCcmFjZU9wZW4gPSBUUlVFOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIHdzQ2F0ZWdvcnkgKz0gcFN0cltjY2ZdOw0KKyAgICAgICAgY2NmKys7DQorICAgICAgfQ0KKyAgICAgIEZYX0RXT1JEIGR3SGFzaCA9DQorICAgICAgICAgIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzQ2F0ZWdvcnksIHdzQ2F0ZWdvcnkuR2V0TGVuZ3RoKCkpOw0KKyAgICAgIGlmIChkd0hhc2ggPT0gRlhfTE9DQUxFQ0FURUdPUllfRGF0ZUhhc2gpIHsNCisgICAgICAgIGlmIChlQ2F0ZWdvcnkgPT0gRlhfTE9DQUxFQ0FURUdPUllfVGltZSkgew0KKyAgICAgICAgICByZXR1cm4gRlhfTE9DQUxFQ0FURUdPUllfRGF0ZVRpbWU7DQorICAgICAgICB9DQorICAgICAgICBlQ2F0ZWdvcnkgPSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlOw0KKyAgICAgIH0gZWxzZSBpZiAoZHdIYXNoID09IEZYX0xPQ0FMRUNBVEVHT1JZX1RpbWVIYXNoKSB7DQorICAgICAgICBpZiAoZUNhdGVnb3J5ID09IEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGUpIHsNCisgICAgICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVUaW1lOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZUNhdGVnb3J5ID0gRlhfTE9DQUxFQ0FURUdPUllfVGltZTsNCisgICAgICB9IGVsc2UgaWYgKGR3SGFzaCA9PSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlVGltZUhhc2gpIHsNCisgICAgICAgIHJldHVybiBGWF9MT0NBTEVDQVRFR09SWV9EYXRlVGltZTsNCisgICAgICB9IGVsc2UgaWYgKGR3SGFzaCA9PSBGWF9MT0NBTEVDQVRFR09SWV9UZXh0SGFzaCkgew0KKyAgICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX1RleHQ7DQorICAgICAgfSBlbHNlIGlmIChkd0hhc2ggPT0gRlhfTE9DQUxFQ0FURUdPUllfTnVtSGFzaCkgew0KKyAgICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX051bTsNCisgICAgICB9IGVsc2UgaWYgKGR3SGFzaCA9PSBGWF9MT0NBTEVDQVRFR09SWV9aZXJvSGFzaCkgew0KKyAgICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX1plcm87DQorICAgICAgfSBlbHNlIGlmIChkd0hhc2ggPT0gRlhfTE9DQUxFQ0FURUdPUllfTnVsbEhhc2gpIHsNCisgICAgICAgIHJldHVybiBGWF9MT0NBTEVDQVRFR09SWV9OdWxsOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChwU3RyW2NjZl0gPT0gJ30nKSB7DQorICAgICAgYkJyYWNlT3BlbiA9IEZBTFNFOw0KKyAgICB9DQorICAgIGNjZisrOw0KKyAgfQ0KKyAgcmV0dXJuIGVDYXRlZ29yeTsNCit9DQorc3RhdGljIEZYX1dPUkQgRlhfV1N0cmluZ1RvTENJRChjb25zdCBGWF9XQ0hBUiogcHN0ckxDSUQpIHsNCisgIGlmICghcHN0ckxDSUQpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICB3Y2hhcl90KiBwRW5kOw0KKyAgcmV0dXJuIChGWF9XT1JEKXdjc3RvbCgod2NoYXJfdCopcHN0ckxDSUQsICZwRW5kLCAxNik7DQorfQ0KK0ZYX1dPUkQgQ0ZYX0Zvcm1hdFN0cmluZzo6R2V0TENJRChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSB7DQorICByZXR1cm4gRlhfV1N0cmluZ1RvTENJRChHZXRMb2NhbGVOYW1lKHdzUGF0dGVybikpOw0KK30NCitDRlhfV2lkZVN0cmluZyBDRlhfRm9ybWF0U3RyaW5nOjpHZXRMb2NhbGVOYW1lKA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSB7DQorICBpbnQzMl90IGNjZiA9IDA7DQorICBpbnQzMl90IGlMZW5mID0gd3NQYXR0ZXJuLkdldExlbmd0aCgpOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBTdHIgPSAoY29uc3QgRlhfV0NIQVIqKXdzUGF0dGVybjsNCisgIHdoaWxlIChjY2YgPCBpTGVuZikgew0KKyAgICBpZiAocFN0cltjY2ZdID09ICdcJycpIHsNCisgICAgICBGWF9HZXRMaXRlcmFsVGV4dChwU3RyLCBjY2YsIGlMZW5mKTsNCisgICAgfSBlbHNlIGlmIChwU3RyW2NjZl0gPT0gJygnKSB7DQorICAgICAgY2NmKys7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMQ0lEOw0KKyAgICAgIHdoaWxlIChjY2YgPCBpTGVuZiAmJiBwU3RyW2NjZl0gIT0gJyknKSB7DQorICAgICAgICB3c0xDSUQgKz0gcFN0cltjY2YrK107DQorICAgICAgfQ0KKyAgICAgIHJldHVybiB3c0xDSUQ7DQorICAgIH0NCisgICAgY2NmKys7DQorICB9DQorICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsNCit9DQorSUZYX0xvY2FsZSogQ0ZYX0Zvcm1hdFN0cmluZzo6R2V0VGV4dEZvcm1hdChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NhdGVnb3J5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUHVyZ2VQYXR0ZXJuKSB7DQorICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gTlVMTDsNCisgIGludDMyX3QgY2NmID0gMDsNCisgIGludDMyX3QgaUxlbmYgPSB3c1BhdHRlcm4uR2V0TGVuZ3RoKCk7DQorICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9IChjb25zdCBGWF9XQ0hBUiopd3NQYXR0ZXJuOw0KKyAgRlhfQk9PTCBiQnJhY2tPcGVuID0gRkFMU0U7DQorICB3aGlsZSAoY2NmIDwgaUxlbmYpIHsNCisgICAgaWYgKHBTdHJbY2NmXSA9PSAnXCcnKSB7DQorICAgICAgaW50MzJfdCBpQ3VyQ2hhciA9IGNjZjsNCisgICAgICBGWF9HZXRMaXRlcmFsVGV4dChwU3RyLCBjY2YsIGlMZW5mKTsNCisgICAgICB3c1B1cmdlUGF0dGVybiArPSBDRlhfV2lkZVN0cmluZ0MocFN0ciArIGlDdXJDaGFyLCBjY2YgLSBpQ3VyQ2hhciArIDEpOw0KKyAgICB9IGVsc2UgaWYgKCFiQnJhY2tPcGVuICYmIEZYX0xvY2FsX0ZpbmQoZ3Nfd3NDb25zdENoYXJzLCBwU3RyW2NjZl0pIDwgMCkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzU2VhcmNoQ2F0ZWdvcnkocFN0cltjY2ZdKTsNCisgICAgICBjY2YrKzsNCisgICAgICB3aGlsZSAoY2NmIDwgaUxlbmYgJiYgcFN0cltjY2ZdICE9ICd7JyAmJiBwU3RyW2NjZl0gIT0gJy4nICYmDQorICAgICAgICAgICAgIHBTdHJbY2NmXSAhPSAnKCcpIHsNCisgICAgICAgIHdzU2VhcmNoQ2F0ZWdvcnkgKz0gcFN0cltjY2ZdOw0KKyAgICAgICAgY2NmKys7DQorICAgICAgfQ0KKyAgICAgIGlmICh3c1NlYXJjaENhdGVnb3J5ICE9IHdzQ2F0ZWdvcnkpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICB3aGlsZSAoY2NmIDwgaUxlbmYpIHsNCisgICAgICAgIGlmIChwU3RyW2NjZl0gPT0gJygnKSB7DQorICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0xDSUQ7DQorICAgICAgICAgIHdoaWxlIChjY2YgPCBpTGVuZiAmJiBwU3RyW2NjZl0gIT0gJyknKSB7DQorICAgICAgICAgICAgd3NMQ0lEICs9IHBTdHJbY2NmKytdOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHBMb2NhbGUgPSBHZXRQYXR0ZXJuTG9jYWxlKHdzTENJRCk7DQorICAgICAgICB9IGVsc2UgaWYgKHBTdHJbY2NmXSA9PSAneycpIHsNCisgICAgICAgICAgYkJyYWNrT3BlbiA9IFRSVUU7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmKys7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKHBTdHJbY2NmXSAhPSAnfScpIHsNCisgICAgICB3c1B1cmdlUGF0dGVybiArPSBwU3RyW2NjZl07DQorICAgIH0NCisgICAgY2NmKys7DQorICB9DQorICBpZiAoIWJCcmFja09wZW4pIHsNCisgICAgd3NQdXJnZVBhdHRlcm4gPSB3c1BhdHRlcm47DQorICB9DQorICBpZiAoIXBMb2NhbGUpIHsNCisgICAgcExvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7DQorICB9DQorICByZXR1cm4gcExvY2FsZTsNCit9DQorI2RlZmluZSBGWF9OVU1TVFlMRV9QZXJjZW50IDB4MDENCisjZGVmaW5lIEZYX05VTVNUWUxFX0V4cG9uZW50IDB4MDINCisjZGVmaW5lIEZYX05VTVNUWUxFX0RvdFZvcnYgMHgwNA0KK0lGWF9Mb2NhbGUqIENGWF9Gb3JtYXRTdHJpbmc6OkdldE51bWVyaWNGb3JtYXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlEb3RJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBkd1N0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUHVyZ2VQYXR0ZXJuKSB7DQorICBkd1N0eWxlID0gMDsNCisgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBOVUxMOw0KKyAgaW50MzJfdCBjY2YgPSAwOw0KKyAgaW50MzJfdCBpTGVuZiA9IHdzUGF0dGVybi5HZXRMZW5ndGgoKTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwU3RyID0gKGNvbnN0IEZYX1dDSEFSKil3c1BhdHRlcm47DQorICBGWF9CT09MIGJGaW5kRG90ID0gRkFMU0U7DQorICBGWF9CT09MIGJCcmFja09wZW4gPSBGQUxTRTsNCisgIHdoaWxlIChjY2YgPCBpTGVuZikgew0KKyAgICBpZiAocFN0cltjY2ZdID09ICdcJycpIHsNCisgICAgICBpbnQzMl90IGlDdXJDaGFyID0gY2NmOw0KKyAgICAgIEZYX0dldExpdGVyYWxUZXh0KHBTdHIsIGNjZiwgaUxlbmYpOw0KKyAgICAgIHdzUHVyZ2VQYXR0ZXJuICs9IENGWF9XaWRlU3RyaW5nQyhwU3RyICsgaUN1ckNoYXIsIGNjZiAtIGlDdXJDaGFyICsgMSk7DQorICAgIH0gZWxzZSBpZiAoIWJCcmFja09wZW4gJiYgRlhfTG9jYWxfRmluZChnc193c0NvbnN0Q2hhcnMsIHBTdHJbY2NmXSkgPCAwKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDYXRlZ29yeShwU3RyW2NjZl0pOw0KKyAgICAgIGNjZisrOw0KKyAgICAgIHdoaWxlIChjY2YgPCBpTGVuZiAmJiBwU3RyW2NjZl0gIT0gJ3snICYmIHBTdHJbY2NmXSAhPSAnLicgJiYNCisgICAgICAgICAgICAgcFN0cltjY2ZdICE9ICcoJykgew0KKyAgICAgICAgd3NDYXRlZ29yeSArPSBwU3RyW2NjZl07DQorICAgICAgICBjY2YrKzsNCisgICAgICB9DQorICAgICAgaWYgKHdzQ2F0ZWdvcnkgIT0gRlhfV1NUUkMoTCJudW0iKSkgew0KKyAgICAgICAgYkJyYWNrT3BlbiA9IFRSVUU7DQorICAgICAgICBjY2YgPSAwOw0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIHdoaWxlIChjY2YgPCBpTGVuZikgew0KKyAgICAgICAgaWYgKHBTdHJbY2NmXSA9PSAnKCcpIHsNCisgICAgICAgICAgY2NmKys7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTENJRDsNCisgICAgICAgICAgd2hpbGUgKGNjZiA8IGlMZW5mICYmIHBTdHJbY2NmXSAhPSAnKScpIHsNCisgICAgICAgICAgICB3c0xDSUQgKz0gcFN0cltjY2YrK107DQorICAgICAgICAgIH0NCisgICAgICAgICAgcExvY2FsZSA9IEdldFBhdHRlcm5Mb2NhbGUod3NMQ0lEKTsNCisgICAgICAgIH0gZWxzZSBpZiAocFN0cltjY2ZdID09ICd7Jykgew0KKyAgICAgICAgICBiQnJhY2tPcGVuID0gVFJVRTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9IGVsc2UgaWYgKHBTdHJbY2NmXSA9PSAnLicpIHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTdWJDYXRlZ29yeTsNCisgICAgICAgICAgY2NmKys7DQorICAgICAgICAgIHdoaWxlIChjY2YgPCBpTGVuZiAmJiBwU3RyW2NjZl0gIT0gJygnICYmIHBTdHJbY2NmXSAhPSAneycpIHsNCisgICAgICAgICAgICB3c1N1YkNhdGVnb3J5ICs9IHBTdHJbY2NmKytdOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIEZYX0RXT1JEIGR3U3ViSGFzaCA9DQorICAgICAgICAgICAgICBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c1N1YkNhdGVnb3J5LCB3c1N1YkNhdGVnb3J5LkdldExlbmd0aCgpKTsNCisgICAgICAgICAgRlhfTE9DQUxFTlVNU1VCQ0FURUdPUlkgZVN1YkNhdGVnb3J5ID0gRlhfTE9DQUxFTlVNUEFUVEVSTl9EZWNpbWFsOw0KKyAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBnX2lGWExvY2FsZU51bVN1YkNhdENvdW50OyBpKyspIHsNCisgICAgICAgICAgICBpZiAoZ19GWExvY2FsZU51bVN1YkNhdERhdGFbaV0udUhhc2ggPT0gZHdTdWJIYXNoKSB7DQorICAgICAgICAgICAgICBlU3ViQ2F0ZWdvcnkgPSAoRlhfTE9DQUxFTlVNU1VCQ0FURUdPUlkpZ19GWExvY2FsZU51bVN1YkNhdERhdGFbaV0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZVN1YkNhdGVnb3J5Ow0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHdzU3ViQ2F0ZWdvcnkuRW1wdHkoKTsNCisgICAgICAgICAgaWYgKCFwTG9jYWxlKSB7DQorICAgICAgICAgICAgcExvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBMb2NhbGUgIT0gTlVMTCk7DQorICAgICAgICAgIHBMb2NhbGUtPkdldE51bVBhdHRlcm4oZVN1YkNhdGVnb3J5LCB3c1N1YkNhdGVnb3J5KTsNCisgICAgICAgICAgaURvdEluZGV4ID0gd3NTdWJDYXRlZ29yeS5GaW5kKCcuJyk7DQorICAgICAgICAgIGlmIChpRG90SW5kZXggPiAwKSB7DQorICAgICAgICAgICAgaURvdEluZGV4ICs9IHdzUHVyZ2VQYXR0ZXJuLkdldExlbmd0aCgpOw0KKyAgICAgICAgICAgIGJGaW5kRG90ID0gVFJVRTsNCisgICAgICAgICAgICBkd1N0eWxlIHw9IEZYX05VTVNUWUxFX0RvdFZvcnY7DQorICAgICAgICAgIH0NCisgICAgICAgICAgd3NQdXJnZVBhdHRlcm4gKz0gd3NTdWJDYXRlZ29yeTsNCisgICAgICAgICAgaWYgKGVTdWJDYXRlZ29yeSA9PSBGWF9MT0NBTEVOVU1QQVRURVJOX1BlcmNlbnQpIHsNCisgICAgICAgICAgICBkd1N0eWxlIHw9IEZYX05VTVNUWUxFX1BlcmNlbnQ7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBjY2YrKzsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAocFN0cltjY2ZdID09ICdFJykgew0KKyAgICAgIGR3U3R5bGUgfD0gRlhfTlVNU1RZTEVfRXhwb25lbnQ7DQorICAgICAgd3NQdXJnZVBhdHRlcm4gKz0gcFN0cltjY2ZdOw0KKyAgICB9IGVsc2UgaWYgKHBTdHJbY2NmXSA9PSAnJScpIHsNCisgICAgICBkd1N0eWxlIHw9IEZYX05VTVNUWUxFX1BlcmNlbnQ7DQorICAgICAgd3NQdXJnZVBhdHRlcm4gKz0gcFN0cltjY2ZdOw0KKyAgICB9IGVsc2UgaWYgKHBTdHJbY2NmXSAhPSAnfScpIHsNCisgICAgICB3c1B1cmdlUGF0dGVybiArPSBwU3RyW2NjZl07DQorICAgIH0NCisgICAgaWYgKCFiRmluZERvdCkgew0KKyAgICAgIGlmIChwU3RyW2NjZl0gPT0gJy4nIHx8IHBTdHJbY2NmXSA9PSAnVicgfHwgcFN0cltjY2ZdID09ICd2Jykgew0KKyAgICAgICAgYkZpbmREb3QgPSBUUlVFOw0KKyAgICAgICAgaURvdEluZGV4ID0gd3NQdXJnZVBhdHRlcm4uR2V0TGVuZ3RoKCkgLSAxOw0KKyAgICAgICAgZHdTdHlsZSB8PSBGWF9OVU1TVFlMRV9Eb3RWb3J2Ow0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBjY2YrKzsNCisgIH0NCisgIGlmICghYkZpbmREb3QpIHsNCisgICAgaURvdEluZGV4ID0gd3NQdXJnZVBhdHRlcm4uR2V0TGVuZ3RoKCk7DQorICB9DQorICBpZiAoIXBMb2NhbGUpIHsNCisgICAgcExvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7DQorICB9DQorICByZXR1cm4gcExvY2FsZTsNCit9DQorc3RhdGljIEZYX0JPT0wgRlhfR2V0TnVtZXJpY0RvdEluZGV4KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c051bSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRG90U3ltYm9sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpRG90SW5kZXgpIHsNCisgIGludDMyX3QgY2NmID0gMDsNCisgIGludDMyX3QgaUxlbmYgPSB3c051bS5HZXRMZW5ndGgoKTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwU3RyID0gKGNvbnN0IEZYX1dDSEFSKil3c051bTsNCisgIGludDMyX3QgaUxlbkRvdCA9IHdzRG90U3ltYm9sLkdldExlbmd0aCgpOw0KKyAgd2hpbGUgKGNjZiA8IGlMZW5mKSB7DQorICAgIGlmIChwU3RyW2NjZl0gPT0gJ1wnJykgew0KKyAgICAgIEZYX0dldExpdGVyYWxUZXh0KHBTdHIsIGNjZiwgaUxlbmYpOw0KKyAgICB9IGVsc2UgaWYgKGNjZiArIGlMZW5Eb3QgPD0gaUxlbmYgJiYNCisgICAgICAgICAgICAgICAhRlhTWVNfd2NzbmNtcChwU3RyICsgY2NmLCAoY29uc3QgRlhfV0NIQVIqKXdzRG90U3ltYm9sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlMZW5Eb3QpKSB7DQorICAgICAgaURvdEluZGV4ID0gY2NmOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGNjZisrOw0KKyAgfQ0KKyAgaURvdEluZGV4ID0gd3NOdW0uRmluZCgnLicpOw0KKyAgaWYgKGlEb3RJbmRleCA8IDApIHsNCisgICAgaURvdEluZGV4ID0gaUxlbmY7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9Gb3JtYXRTdHJpbmc6OlBhcnNlVGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpIHsNCisgIHdzVmFsdWUuRW1wdHkoKTsNCisgIGlmICh3c1NyY1RleHQuSXNFbXB0eSgpIHx8IHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Rm9ybWF0Ow0KKyAgR2V0VGV4dEZvcm1hdCh3c1BhdHRlcm4sIEZYX1dTVFJDKEwidGV4dCIpLCB3c1RleHRGb3JtYXQpOw0KKyAgaWYgKHdzVGV4dEZvcm1hdC5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaW50MzJfdCBpVGV4dCA9IDAsIGlQYXR0ZXJuID0gMDsNCisgIGNvbnN0IEZYX1dDSEFSKiBwU3RyVGV4dCA9IChjb25zdCBGWF9XQ0hBUiopd3NTcmNUZXh0Ow0KKyAgaW50MzJfdCBpTGVuVGV4dCA9IHdzU3JjVGV4dC5HZXRMZW5ndGgoKTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwU3RyUGF0dGVybiA9IChjb25zdCBGWF9XQ0hBUiopd3NUZXh0Rm9ybWF0Ow0KKyAgaW50MzJfdCBpTGVuUGF0dGVybiA9IHdzVGV4dEZvcm1hdC5HZXRMZW5ndGgoKTsNCisgIHdoaWxlIChpUGF0dGVybiA8IGlMZW5QYXR0ZXJuICYmIGlUZXh0IDwgaUxlblRleHQpIHsNCisgICAgc3dpdGNoIChwU3RyUGF0dGVybltpUGF0dGVybl0pIHsNCisgICAgICBjYXNlICdcJyc6IHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTGl0ZXJhbCA9DQorICAgICAgICAgICAgRlhfR2V0TGl0ZXJhbFRleHQocFN0clBhdHRlcm4sIGlQYXR0ZXJuLCBpTGVuUGF0dGVybik7DQorICAgICAgICBpbnQzMl90IGlMaXRlcmFsTGVuID0gd3NMaXRlcmFsLkdldExlbmd0aCgpOw0KKyAgICAgICAgaWYgKGlUZXh0ICsgaUxpdGVyYWxMZW4gPiBpTGVuVGV4dCB8fA0KKyAgICAgICAgICAgIEZYU1lTX3djc25jbXAocFN0clRleHQgKyBpVGV4dCwgKGNvbnN0IEZYX1dDSEFSKil3c0xpdGVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpTGl0ZXJhbExlbikpIHsNCisgICAgICAgICAgd3NWYWx1ZSA9IHdzU3JjVGV4dDsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaVRleHQgKz0gaUxpdGVyYWxMZW47DQorICAgICAgICBpUGF0dGVybisrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgJ0EnOg0KKyAgICAgICAgaWYgKEZYX0lzQWxwaGEocFN0clRleHRbaVRleHRdKSkgew0KKyAgICAgICAgICB3c1ZhbHVlICs9IHBTdHJUZXh0W2lUZXh0XTsNCisgICAgICAgICAgaVRleHQrKzsNCisgICAgICAgIH0NCisgICAgICAgIGlQYXR0ZXJuKys7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdYJzoNCisgICAgICAgIHdzVmFsdWUgKz0gcFN0clRleHRbaVRleHRdOw0KKyAgICAgICAgaVRleHQrKzsNCisgICAgICAgIGlQYXR0ZXJuKys7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdPJzoNCisgICAgICBjYXNlICcwJzoNCisgICAgICAgIGlmIChGWF9Jc0RpZ2l0KHBTdHJUZXh0W2lUZXh0XSkgfHwgRlhfSXNBbHBoYShwU3RyVGV4dFtpVGV4dF0pKSB7DQorICAgICAgICAgIHdzVmFsdWUgKz0gcFN0clRleHRbaVRleHRdOw0KKyAgICAgICAgICBpVGV4dCsrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaVBhdHRlcm4rKzsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJzknOg0KKyAgICAgICAgaWYgKEZYX0lzRGlnaXQocFN0clRleHRbaVRleHRdKSkgew0KKyAgICAgICAgICB3c1ZhbHVlICs9IHBTdHJUZXh0W2lUZXh0XTsNCisgICAgICAgICAgaVRleHQrKzsNCisgICAgICAgIH0NCisgICAgICAgIGlQYXR0ZXJuKys7DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSAhPSBwU3RyVGV4dFtpVGV4dF0pIHsNCisgICAgICAgICAgd3NWYWx1ZSA9IHdzU3JjVGV4dDsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaVBhdHRlcm4rKzsNCisgICAgICAgIGlUZXh0Kys7DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGlQYXR0ZXJuID09IGlMZW5QYXR0ZXJuICYmIGlUZXh0ID09IGlMZW5UZXh0Ow0KK30NCitGWF9CT09MIENGWF9Gb3JtYXRTdHJpbmc6OlBhcnNlTnVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY051bSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZlZhbHVlKSB7DQorICBmVmFsdWUgPSAwLjBmOw0KKyAgaWYgKHdzU3JjTnVtLklzRW1wdHkoKSB8fCB3c1BhdHRlcm4uSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGludDMyX3QgZG90X2luZGV4X2YgPSAtMTsNCisgIEZYX0RXT1JEIGR3Rm9ybWF0U3R5bGUgPSAwOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NOdW1Gb3JtYXQ7DQorICBJRlhfTG9jYWxlKiBwTG9jYWxlID0NCisgICAgICBHZXROdW1lcmljRm9ybWF0KHdzUGF0dGVybiwgZG90X2luZGV4X2YsIGR3Rm9ybWF0U3R5bGUsIHdzTnVtRm9ybWF0KTsNCisgIGlmICghcExvY2FsZSB8fCB3c051bUZvcm1hdC5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaW50MzJfdCBpRXhwb25lbnQgPSAwOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NEb3RTeW1ib2w7DQorICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfRGVjaW1hbCwgd3NEb3RTeW1ib2wpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NHcm91cFN5bWJvbDsNCisgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9Hcm91cGluZywgd3NHcm91cFN5bWJvbCk7DQorICBpbnQzMl90IGlHcm91cExlbiA9IHdzR3JvdXBTeW1ib2wuR2V0TGVuZ3RoKCk7DQorICBDRlhfV2lkZVN0cmluZyB3c01pbnVzOw0KKyAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzLCB3c01pbnVzKTsNCisgIGludDMyX3QgaU1pbnVzTGVuID0gd3NNaW51cy5HZXRMZW5ndGgoKTsNCisgIGludCBjYyA9IDAsIGNjZiA9IDA7DQorICBjb25zdCBGWF9XQ0hBUiogc3RyID0gKGNvbnN0IEZYX1dDSEFSKil3c1NyY051bTsNCisgIGludCBsZW4gPSB3c1NyY051bS5HZXRMZW5ndGgoKTsNCisgIGNvbnN0IEZYX1dDSEFSKiBzdHJmID0gKGNvbnN0IEZYX1dDSEFSKil3c051bUZvcm1hdDsNCisgIGludCBsZW5mID0gd3NOdW1Gb3JtYXQuR2V0TGVuZ3RoKCk7DQorICBkb3VibGUgZGJSZXRWYWx1ZSA9IDA7DQorICBkb3VibGUgY29lZmYgPSAxOw0KKyAgRlhfQk9PTCBiSGF2ZVBlcmNlbnRTeW1ib2wgPSBGQUxTRTsNCisgIEZYX0JPT0wgYk5lZyA9IEZBTFNFOw0KKyAgRlhfQk9PTCBiUmV2ZXJzZVBhcnNlID0gRkFMU0U7DQorICBpbnQzMl90IGRvdF9pbmRleCA9IDA7DQorICBpZiAoIUZYX0dldE51bWVyaWNEb3RJbmRleCh3c1NyY051bSwgd3NEb3RTeW1ib2wsIGRvdF9pbmRleCkgJiYNCisgICAgICAoZHdGb3JtYXRTdHlsZSAmIEZYX05VTVNUWUxFX0RvdFZvcnYpKSB7DQorICAgIGJSZXZlcnNlUGFyc2UgPSBUUlVFOw0KKyAgfQ0KKyAgYlJldmVyc2VQYXJzZSA9IEZBTFNFOw0KKyAgaWYgKGJSZXZlcnNlUGFyc2UpIHsNCisgICAgY2NmID0gbGVuZiAtIDE7DQorICAgIGNjID0gbGVuIC0gMTsNCisgICAgd2hpbGUgKGNjZiA+IGRvdF9pbmRleF9mICYmIGNjID49IDApIHsNCisgICAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgew0KKyAgICAgICAgY2FzZSAnXCcnOiB7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTGl0ZXJhbCA9IEZYX0dldExpdGVyYWxUZXh0UmV2ZXJzZShzdHJmLCBjY2YpOw0KKyAgICAgICAgICBpbnQzMl90IGlMaXRlcmFsTGVuID0gd3NMaXRlcmFsLkdldExlbmd0aCgpOw0KKyAgICAgICAgICBjYyAtPSBpTGl0ZXJhbExlbiAtIDE7DQorICAgICAgICAgIGlmIChjYyA8IDAgfHwgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c0xpdGVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTGl0ZXJhbExlbikpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgY2NmLS07DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2FzZSAnOSc6DQorICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBkYlJldFZhbHVlID0gZGJSZXRWYWx1ZSAqIGNvZWZmICsgKHN0cltjY10gLSAnMCcpICogMC4xOw0KKyAgICAgICAgICBjb2VmZiAqPSAwLjE7DQorICAgICAgICAgIGNjLS07DQorICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgJ3onOg0KKyAgICAgICAgICBpZiAoY2MgPj0gMCkgew0KKyAgICAgICAgICAgIGRiUmV0VmFsdWUgPSBkYlJldFZhbHVlICogY29lZmYgKyAoc3RyW2NjXSAtICcwJykgKiAwLjE7DQorICAgICAgICAgICAgY29lZmYgKj0gMC4xOw0KKyAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmLS07DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAnWic6DQorICAgICAgICAgIGlmIChzdHJbY2NdICE9ICcgJykgew0KKyAgICAgICAgICAgIGRiUmV0VmFsdWUgPSBkYlJldFZhbHVlICogY29lZmYgKyAoc3RyW2NjXSAtICcwJykgKiAwLjE7DQorICAgICAgICAgICAgY29lZmYgKj0gMC4xOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjLS07DQorICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgJ1MnOg0KKyAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycgfHwgc3RyW2NjXSA9PSAnICcpIHsNCisgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGNjIC09IGlNaW51c0xlbiAtIDE7DQorICAgICAgICAgICAgaWYgKGNjIDwgMCB8fA0KKyAgICAgICAgICAgICAgICBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzTWludXMsIGlNaW51c0xlbikpIHsNCisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YtLTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICdzJzoNCisgICAgICAgICAgaWYgKHN0cltjY10gPT0gJysnKSB7DQorICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBjYyAtPSBpTWludXNMZW4gLSAxOw0KKyAgICAgICAgICAgIGlmIChjYyA8IDAgfHwNCisgICAgICAgICAgICAgICAgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c01pbnVzLCBpTWludXNMZW4pKSB7DQorICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmLS07DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAnRSc6IHsNCisgICAgICAgICAgaWYgKGNjID49IGRvdF9pbmRleCkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBGWF9CT09MIGJFeHBTaWduID0gRkFMU0U7DQorICAgICAgICAgIHdoaWxlIChjYyA+PSAwKSB7DQorICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJ0UnIHx8IHN0cltjY10gPT0gJ2UnKSB7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgIGlFeHBvbmVudCA9IGlFeHBvbmVudCArIChzdHJbY2NdIC0gJzAnKSAqIDEwOw0KKyAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnKycpIHsNCisgICAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKGNjIC0gaU1pbnVzTGVuICsgMSA+IDAgJiYNCisgICAgICAgICAgICAgICAgICAgICAgICFGWFNZU193Y3NuY21wKHN0ciArIChjYyAtIGlNaW51c0xlbiArIDEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IEZYX1dDSEFSKil3c01pbnVzLCBpTWludXNMZW4pKSB7DQorICAgICAgICAgICAgICBiRXhwU2lnbiA9IFRSVUU7DQorICAgICAgICAgICAgICBjYyAtPSBpTWludXNMZW47DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgaUV4cG9uZW50ID0gYkV4cFNpZ24gPyAtaUV4cG9uZW50IDogaUV4cG9uZW50Ow0KKyAgICAgICAgICBjY2YtLTsNCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBjYXNlICckJzogew0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCisgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1N5bWJvbCk7DQorICAgICAgICAgIGludDMyX3QgaVN5bWJvbExlbiA9IHdzU3ltYm9sLkdldExlbmd0aCgpOw0KKyAgICAgICAgICBjYyAtPSBpU3ltYm9sTGVuIC0gMTsNCisgICAgICAgICAgaWYgKGNjIDwgMCB8fA0KKyAgICAgICAgICAgICAgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c1N5bWJvbCwgaVN5bWJvbExlbikpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgY2NmLS07DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSAncic6DQorICAgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnYycpIHsNCisgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnUicgJiYgY2MgLSAxID49IDAgJiYgc3RyW2NjIC0gMV0gPT0gJ0MnKSB7DQorICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgIGNjIC09IDI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNjZiAtPSAyOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAnUic6DQorICAgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnQycpIHsNCisgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnICcpIHsNCisgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICdSJyAmJiBjYyAtIDEgPj0gMCAmJiBzdHJbY2MgLSAxXSA9PSAnQycpIHsNCisgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgY2MgLT0gMjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2NmIC09IDI7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgY2NmLS07DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICdiJzoNCisgICAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdkJykgew0KKyAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICdCJyAmJiBjYyAtIDEgPj0gMCAmJiBzdHJbY2MgLSAxXSA9PSAnRCcpIHsNCisgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgY2MgLT0gMjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2NmIC09IDI7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgY2NmLS07DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICdCJzoNCisgICAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdEJykgew0KKyAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcgJykgew0KKyAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJ0InICYmIGNjIC0gMSA+PSAwICYmIHN0cltjYyAtIDFdID09ICdEJykgew0KKyAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICBjYyAtPSAyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjY2YgLT0gMjsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBjY2YtLTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgJy4nOg0KKyAgICAgICAgY2FzZSAnVic6DQorICAgICAgICBjYXNlICd2JzoNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgY2FzZSAnJSc6IHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQorICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50LCB3c1N5bWJvbCk7DQorICAgICAgICAgIGludDMyX3QgaVN5c21ib2xMZW4gPSB3c1N5bWJvbC5HZXRMZW5ndGgoKTsNCisgICAgICAgICAgY2MgLT0gaVN5c21ib2xMZW4gLSAxOw0KKyAgICAgICAgICBpZiAoY2MgPCAwIHx8DQorICAgICAgICAgICAgICBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzU3ltYm9sLCBpU3lzbWJvbExlbikpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgY2NmLS07DQorICAgICAgICAgIGJIYXZlUGVyY2VudFN5bWJvbCA9IFRSVUU7DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSAnOCc6DQorICAgICAgICAgIHdoaWxlIChjY2YgPCBsZW5mICYmIHN0cmZbY2NmXSA9PSAnOCcpIHsNCisgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICB3aGlsZSAoY2MgPCBsZW4gJiYgRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgIGRiUmV0VmFsdWUgPSAoc3RyW2NjXSAtICcwJykgKiBjb2VmZiArIGRiUmV0VmFsdWU7DQorICAgICAgICAgICAgY29lZmYgKj0gMC4xOw0KKyAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICcsJzogew0KKyAgICAgICAgICBpZiAoY2MgPj0gMCkgew0KKyAgICAgICAgICAgIGNjIC09IGlHcm91cExlbiAtIDE7DQorICAgICAgICAgICAgaWYgKGNjID49IDAgJiYNCisgICAgICAgICAgICAgICAgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c0dyb3VwU3ltYm9sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlHcm91cExlbikgPT0gMCkgew0KKyAgICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgY2MgKz0gaUdyb3VwTGVuIC0gMTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmLS07DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSAnKCc6DQorICAgICAgICAgIGlmIChzdHJbY2NdID09IEwnKCcpIHsNCisgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdICE9IEwnICcpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgY2NmLS07DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAnKSc6DQorICAgICAgICAgIGlmIChzdHJbY2NdID09IEwnKScpIHsNCisgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdICE9IEwnICcpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgY2NmLS07DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgaWYgKHN0cmZbY2NmXSAhPSBzdHJbY2NdKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjLS07DQorICAgICAgICAgIGNjZi0tOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBkb3RfaW5kZXggPSBjYyArIDE7DQorICB9DQorICBjY2YgPSBkb3RfaW5kZXhfZiAtIDE7DQorICBjYyA9IGRvdF9pbmRleCAtIDE7DQorICBjb2VmZiA9IDE7DQorICB3aGlsZSAoY2NmID49IDAgJiYgY2MgPj0gMCkgew0KKyAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgew0KKyAgICAgIGNhc2UgJ1wnJzogew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMaXRlcmFsID0gRlhfR2V0TGl0ZXJhbFRleHRSZXZlcnNlKHN0cmYsIGNjZik7DQorICAgICAgICBpbnQzMl90IGlMaXRlcmFsTGVuID0gd3NMaXRlcmFsLkdldExlbmd0aCgpOw0KKyAgICAgICAgY2MgLT0gaUxpdGVyYWxMZW4gLSAxOw0KKyAgICAgICAgaWYgKGNjIDwgMCB8fA0KKyAgICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NMaXRlcmFsLCBpTGl0ZXJhbExlbikpIHsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2MtLTsNCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgJzknOg0KKyAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGRiUmV0VmFsdWUgPSBkYlJldFZhbHVlICsgKHN0cltjY10gLSAnMCcpICogY29lZmY7DQorICAgICAgICBjb2VmZiAqPSAxMDsNCisgICAgICAgIGNjLS07DQorICAgICAgICBjY2YtLTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ3onOg0KKyAgICAgICAgaWYgKEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgZGJSZXRWYWx1ZSA9IGRiUmV0VmFsdWUgKyAoc3RyW2NjXSAtICcwJykgKiBjb2VmZjsNCisgICAgICAgICAgY29lZmYgKj0gMTA7DQorICAgICAgICAgIGNjLS07DQorICAgICAgICB9DQorICAgICAgICBjY2YtLTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ1onOg0KKyAgICAgICAgaWYgKHN0cltjY10gIT0gJyAnKSB7DQorICAgICAgICAgIGlmIChGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgZGJSZXRWYWx1ZSA9IGRiUmV0VmFsdWUgKyAoc3RyW2NjXSAtICcwJykgKiBjb2VmZjsNCisgICAgICAgICAgICBjb2VmZiAqPSAxMDsNCisgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBjYy0tOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdTJzoNCisgICAgICAgIGlmIChzdHJbY2NdID09ICcrJyB8fCBzdHJbY2NdID09ICcgJykgew0KKyAgICAgICAgICBjYy0tOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgY2MgLT0gaU1pbnVzTGVuIC0gMTsNCisgICAgICAgICAgaWYgKGNjIDwgMCB8fA0KKyAgICAgICAgICAgICAgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c01pbnVzLCBpTWludXNMZW4pKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjLS07DQorICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdzJzoNCisgICAgICAgIGlmIChzdHJbY2NdID09ICcrJykgew0KKyAgICAgICAgICBjYy0tOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgY2MgLT0gaU1pbnVzTGVuIC0gMTsNCisgICAgICAgICAgaWYgKGNjIDwgMCB8fA0KKyAgICAgICAgICAgICAgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c01pbnVzLCBpTWludXNMZW4pKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjLS07DQorICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdFJzogew0KKyAgICAgICAgaWYgKGNjID49IGRvdF9pbmRleCkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBGWF9CT09MIGJFeHBTaWduID0gRkFMU0U7DQorICAgICAgICB3aGlsZSAoY2MgPj0gMCkgew0KKyAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgIGlFeHBvbmVudCA9IGlFeHBvbmVudCArIChzdHJbY2NdIC0gJzAnKSAqIDEwOw0KKyAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnKycpIHsNCisgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKGNjIC0gaU1pbnVzTGVuICsgMSA+IDAgJiYNCisgICAgICAgICAgICAgICAgICAgICAhRlhTWVNfd2NzbmNtcChzdHIgKyAoY2MgLSBpTWludXNMZW4gKyAxKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgRlhfV0NIQVIqKXdzTWludXMsIGlNaW51c0xlbikpIHsNCisgICAgICAgICAgICBiRXhwU2lnbiA9IFRSVUU7DQorICAgICAgICAgICAgY2MgLT0gaU1pbnVzTGVuOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgY2MtLTsNCisgICAgICAgIGlFeHBvbmVudCA9IGJFeHBTaWduID8gLWlFeHBvbmVudCA6IGlFeHBvbmVudDsNCisgICAgICAgIGNjZi0tOw0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSAnJCc6IHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOw0KKyAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sLCB3c1N5bWJvbCk7DQorICAgICAgICBpbnQzMl90IGlTeW1ib2xMZW4gPSB3c1N5bWJvbC5HZXRMZW5ndGgoKTsNCisgICAgICAgIGNjIC09IGlTeW1ib2xMZW4gLSAxOw0KKyAgICAgICAgaWYgKGNjIDwgMCB8fA0KKyAgICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NTeW1ib2wsIGlTeW1ib2xMZW4pKSB7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGNjLS07DQorICAgICAgICBjY2YtLTsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgJ3InOg0KKyAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdjJykgew0KKyAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnUicgJiYgY2MgLSAxID49IDAgJiYgc3RyW2NjIC0gMV0gPT0gJ0MnKSB7DQorICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgY2MgLT0gMjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YgLT0gMjsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnUic6DQorICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ0MnKSB7DQorICAgICAgICAgIGlmIChzdHJbY2NdID09ICcgJykgew0KKyAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnUicgJiYgY2MgLSAxID49IDAgJiYgc3RyW2NjIC0gMV0gPT0gJ0MnKSB7DQorICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgY2MgLT0gMjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YgLT0gMjsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnYic6DQorICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ2QnKSB7DQorICAgICAgICAgIGlmIChzdHJbY2NdID09ICdCJyAmJiBjYyAtIDEgPj0gMCAmJiBzdHJbY2MgLSAxXSA9PSAnRCcpIHsNCisgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICBjYyAtPSAyOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjZiAtPSAyOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgY2NmLS07DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdCJzoNCisgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnRCcpIHsNCisgICAgICAgICAgaWYgKHN0cltjY10gPT0gJyAnKSB7DQorICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICdCJyAmJiBjYyAtIDEgPj0gMCAmJiBzdHJbY2MgLSAxXSA9PSAnRCcpIHsNCisgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICBjYyAtPSAyOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjZiAtPSAyOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgY2NmLS07DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICcuJzoNCisgICAgICBjYXNlICdWJzoNCisgICAgICBjYXNlICd2JzoNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICBjYXNlICclJzogew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQorICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfUGVyY2VudCwgd3NTeW1ib2wpOw0KKyAgICAgICAgaW50MzJfdCBpU3lzbWJvbExlbiA9IHdzU3ltYm9sLkdldExlbmd0aCgpOw0KKyAgICAgICAgY2MgLT0gaVN5c21ib2xMZW4gLSAxOw0KKyAgICAgICAgaWYgKGNjIDwgMCB8fA0KKyAgICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NTeW1ib2wsIGlTeXNtYm9sTGVuKSkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBjYy0tOw0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBiSGF2ZVBlcmNlbnRTeW1ib2wgPSBUUlVFOw0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSAnOCc6DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgY2FzZSAnLCc6IHsNCisgICAgICAgIGlmIChjYyA+PSAwKSB7DQorICAgICAgICAgIGNjIC09IGlHcm91cExlbiAtIDE7DQorICAgICAgICAgIGlmIChjYyA+PSAwICYmDQorICAgICAgICAgICAgICBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzR3JvdXBTeW1ib2wsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlHcm91cExlbikgPT0gMCkgew0KKyAgICAgICAgICAgIGNjLS07DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgY2MgKz0gaUdyb3VwTGVuIC0gMTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlICcoJzoNCisgICAgICAgIGlmIChzdHJbY2NdID09IEwnKCcpIHsNCisgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gIT0gTCcgJykgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBjYy0tOw0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICcpJzoNCisgICAgICAgIGlmIChzdHJbY2NdID09IEwnKScpIHsNCisgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gIT0gTCcgJykgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBjYy0tOw0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgaWYgKHN0cmZbY2NmXSAhPSBzdHJbY2NdKSB7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGNjLS07DQorICAgICAgICBjY2YtLTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGNjID49IDApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKCFiUmV2ZXJzZVBhcnNlKSB7DQorICAgIGNjZiA9IGRvdF9pbmRleF9mICsgMTsNCisgICAgY2MgPSAoZG90X2luZGV4ID09IGxlbikgPyBsZW4gOiBkb3RfaW5kZXggKyAxOw0KKyAgICBjb2VmZiA9IDAuMTsNCisgICAgd2hpbGUgKGNjIDwgbGVuICYmIGNjZiA8IGxlbmYpIHsNCisgICAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgew0KKyAgICAgICAgY2FzZSAnXCcnOiB7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTGl0ZXJhbCA9IEZYX0dldExpdGVyYWxUZXh0KHN0cmYsIGNjZiwgbGVuZik7DQorICAgICAgICAgIGludDMyX3QgaUxpdGVyYWxMZW4gPSB3c0xpdGVyYWwuR2V0TGVuZ3RoKCk7DQorICAgICAgICAgIGlmIChjYyArIGlMaXRlcmFsTGVuID4gbGVuIHx8DQorICAgICAgICAgICAgICBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzTGl0ZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUxpdGVyYWxMZW4pKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjICs9IGlMaXRlcmFsTGVuOw0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBjYXNlICc5JzoNCisgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHsNCisgICAgICAgICAgICBkYlJldFZhbHVlID0gZGJSZXRWYWx1ZSArIChzdHJbY2NdIC0gJzAnKSAqIGNvZWZmOw0KKyAgICAgICAgICAgIGNvZWZmICo9IDAuMTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjYysrOw0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICd6JzoNCisgICAgICAgICAgaWYgKEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICBkYlJldFZhbHVlID0gZGJSZXRWYWx1ZSArIChzdHJbY2NdIC0gJzAnKSAqIGNvZWZmOw0KKyAgICAgICAgICAgIGNvZWZmICo9IDAuMTsNCisgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgJ1onOg0KKyAgICAgICAgICBpZiAoc3RyW2NjXSAhPSAnICcpIHsNCisgICAgICAgICAgICBpZiAoRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgZGJSZXRWYWx1ZSA9IGRiUmV0VmFsdWUgKyAoc3RyW2NjXSAtICcwJykgKiBjb2VmZjsNCisgICAgICAgICAgICAgIGNvZWZmICo9IDAuMTsNCisgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmKys7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAnUyc6DQorICAgICAgICAgIGlmIChzdHJbY2NdID09ICcrJyB8fCBzdHJbY2NdID09ICcgJykgew0KKyAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKGNjICsgaU1pbnVzTGVuID4gbGVuIHx8DQorICAgICAgICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NNaW51cywgaU1pbnVzTGVuKSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICBjYyArPSBpTWludXNMZW47DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmKys7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAncyc6DQorICAgICAgICAgIGlmIChzdHJbY2NdID09ICcrJykgew0KKyAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKGNjICsgaU1pbnVzTGVuID4gbGVuIHx8DQorICAgICAgICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NNaW51cywgaU1pbnVzTGVuKSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICBjYyArPSBpTWludXNMZW47DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmKys7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAnRSc6IHsNCisgICAgICAgICAgaWYgKGNjID49IGxlbiB8fCAoc3RyW2NjXSAhPSAnRScgJiYgc3RyW2NjXSAhPSAnZScpKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIEZYX0JPT0wgYkV4cFNpZ24gPSBGQUxTRTsNCisgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgaWYgKGNjIDwgbGVuKSB7DQorICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJysnKSB7DQorICAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnLScpIHsNCisgICAgICAgICAgICAgIGJFeHBTaWduID0gVFJVRTsNCisgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHdoaWxlIChjYyA8IGxlbikgew0KKyAgICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlFeHBvbmVudCA9IGlFeHBvbmVudCAqIDEwICsgc3RyW2NjXSAtICcwJzsNCisgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlFeHBvbmVudCA9IGJFeHBTaWduID8gLWlFeHBvbmVudCA6IGlFeHBvbmVudDsNCisgICAgICAgICAgY2NmKys7DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSAnJCc6IHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQorICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NTeW1ib2wpOw0KKyAgICAgICAgICBpbnQzMl90IGlTeW1ib2xMZW4gPSB3c1N5bWJvbC5HZXRMZW5ndGgoKTsNCisgICAgICAgICAgaWYgKGNjICsgaVN5bWJvbExlbiA+IGxlbiB8fA0KKyAgICAgICAgICAgICAgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c1N5bWJvbCwgaVN5bWJvbExlbikpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2MgKz0gaVN5bWJvbExlbjsNCisgICAgICAgICAgY2NmKys7DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSAnYyc6DQorICAgICAgICAgIGlmIChjY2YgKyAxIDwgbGVuZiAmJiBzdHJmW2NjZiArIDFdID09ICdyJykgew0KKyAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICdDJyAmJiBjYyArIDEgPCBsZW4gJiYgc3RyW2NjICsgMV0gPT0gJ1InKSB7DQorICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgIGNjICs9IDI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNjZiArPSAyOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAnQyc6DQorICAgICAgICAgIGlmIChjY2YgKyAxIDwgbGVuZiAmJiBzdHJmW2NjZiArIDFdID09ICdSJykgew0KKyAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcgJykgew0KKyAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJ0MnICYmIGNjICsgMSA8IGxlbiAmJiBzdHJbY2MgKyAxXSA9PSAnUicpIHsNCisgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgY2MgKz0gMjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2NmICs9IDI7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICdkJzoNCisgICAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ2InKSB7DQorICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJ0QnICYmIGNjICsgMSA8IGxlbiAmJiBzdHJbY2MgKyAxXSA9PSAnQicpIHsNCisgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgY2MgKz0gMjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2NmICs9IDI7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICdEJzoNCisgICAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ0InKSB7DQorICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJyAnKSB7DQorICAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnRCcgJiYgY2MgKyAxIDwgbGVuICYmIHN0cltjYyArIDFdID09ICdCJykgew0KKyAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICBjYyArPSAyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjY2YgKz0gMjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgJy4nOg0KKyAgICAgICAgY2FzZSAnVic6DQorICAgICAgICBjYXNlICd2JzoNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgY2FzZSAnJSc6IHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQorICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50LCB3c1N5bWJvbCk7DQorICAgICAgICAgIGludDMyX3QgaVN5c21ib2xMZW4gPSB3c1N5bWJvbC5HZXRMZW5ndGgoKTsNCisgICAgICAgICAgaWYgKGNjICsgaVN5c21ib2xMZW4gPD0gbGVuICYmDQorICAgICAgICAgICAgICAhRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c1N5bWJvbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTeXNtYm9sTGVuKSkgew0KKyAgICAgICAgICAgIGNjICs9IGlTeXNtYm9sTGVuOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICBiSGF2ZVBlcmNlbnRTeW1ib2wgPSBUUlVFOw0KKyAgICAgICAgfSBicmVhazsNCisgICAgICAgIGNhc2UgJzgnOiB7DQorICAgICAgICAgIHdoaWxlIChjY2YgPCBsZW5mICYmIHN0cmZbY2NmXSA9PSAnOCcpIHsNCisgICAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICB3aGlsZSAoY2MgPCBsZW4gJiYgRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgIGRiUmV0VmFsdWUgPSAoc3RyW2NjXSAtICcwJykgKiBjb2VmZiArIGRiUmV0VmFsdWU7DQorICAgICAgICAgICAgY29lZmYgKj0gMC4xOw0KKyAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBjYXNlICcsJzogew0KKyAgICAgICAgICBpZiAoY2MgKyBpR3JvdXBMZW4gPD0gbGVuICYmDQorICAgICAgICAgICAgICBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzR3JvdXBTeW1ib2wsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlHcm91cExlbikgPT0gMCkgew0KKyAgICAgICAgICAgIGNjICs9IGlHcm91cExlbjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBjYXNlICcoJzoNCisgICAgICAgICAgaWYgKHN0cltjY10gPT0gTCcoJykgew0KKyAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gIT0gTCcgJykgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjYysrOw0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICcpJzoNCisgICAgICAgICAgaWYgKHN0cltjY10gPT0gTCcpJykgew0KKyAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gIT0gTCcgJykgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjYysrOw0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBpZiAoc3RyZltjY2ZdICE9IHN0cltjY10pIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgY2NmKys7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChjYyAhPSBsZW4pIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgIH0NCisgIGlmIChpRXhwb25lbnQpIHsNCisgICAgZGJSZXRWYWx1ZSAqPSBGWFNZU19wb3coMTAsIChGWF9GTE9BVClpRXhwb25lbnQpOw0KKyAgfQ0KKyAgaWYgKGJIYXZlUGVyY2VudFN5bWJvbCkgew0KKyAgICBkYlJldFZhbHVlIC89IDEwMC4wOw0KKyAgfQ0KKyAgaWYgKGJOZWcpIHsNCisgICAgZGJSZXRWYWx1ZSA9IC1kYlJldFZhbHVlOw0KKyAgfQ0KKyAgZlZhbHVlID0gKEZYX0ZMT0FUKWRiUmV0VmFsdWU7DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBGWF9QYXJzZU51bVN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NOdW0sIENGWF9XaWRlU3RyaW5nJiB3c1Jlc3VsdCkgew0KKyAgaW50MzJfdCBpQ291bnQgPSB3c051bS5HZXRMZW5ndGgoKTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwU3RyID0gKGNvbnN0IEZYX1dDSEFSKil3c051bTsNCisgIEZYX1dDSEFSKiBwRHN0ID0gd3NSZXN1bHQuR2V0QnVmZmVyKGlDb3VudCk7DQorICBpbnQzMl90IG5JbmRleCA9IDA7DQorICBGWF9CT09MIGJNaW51cyA9IEZBTFNFOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBGWF9XQ0hBUiB3YyA9IHBTdHJbaV07DQorICAgIGlmICh3YyA9PSAnLicpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoKHdjID09IEwnMCcgfHwgd2MgPT0gTCcgJyB8fCB3YyA9PSAnKycpICYmIG5JbmRleCA9PSAwKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKHdjID09ICctJykgew0KKyAgICAgIHBEc3RbbkluZGV4KytdID0gd2M7DQorICAgICAgYk1pbnVzID0gVFJVRTsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAod2MgPT0gTCcwJyAmJiBuSW5kZXggPT0gMSAmJiBiTWludXMpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBwRHN0W25JbmRleCsrXSA9IHdjOw0KKyAgfQ0KKyAgaWYgKGJNaW51cyAmJiBuSW5kZXggPT0gMSkgew0KKyAgICBwRHN0W25JbmRleCsrXSA9ICcwJzsNCisgIH0NCisgIGlmIChuSW5kZXggPT0gMCkgew0KKyAgICB3c1Jlc3VsdC5SZWxlYXNlQnVmZmVyKDApOw0KKyAgICBwRHN0ID0gd3NSZXN1bHQuR2V0QnVmZmVyKGlDb3VudCArIDEpOw0KKyAgICBwRHN0W25JbmRleCsrXSA9ICcwJzsNCisgIH0NCisgIGludDMyX3QgaiA9IDA7DQorICBmb3IgKGogPSBpQ291bnQgLSAxOyBqID4gaTsgai0tKSB7DQorICAgIEZYX1dDSEFSIHdjID0gcFN0cltqXTsNCisgICAgaWYgKHdjICE9IEwnMCcgJiYgd2MgIT0gTCcgJykgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpZiAoaiA+IGkpIHsNCisgICAgcERzdFtuSW5kZXgrK10gPSAnLic7DQorICAgIEZYU1lTX3djc25jcHkocERzdCArIG5JbmRleCwgcFN0ciArIGkgKyAxLCBqIC0gaSk7DQorICAgIG5JbmRleCArPSBqIC0gaTsNCisgIH0NCisgIHdzUmVzdWx0LlJlbGVhc2VCdWZmZXIobkluZGV4KTsNCit9DQorRlhfQk9PTCBDRlhfRm9ybWF0U3RyaW5nOjpQYXJzZU51bShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNOdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpIHsNCisgIHdzVmFsdWUuRW1wdHkoKTsNCisgIGlmICh3c1NyY051bS5Jc0VtcHR5KCkgfHwgd3NQYXR0ZXJuLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpbnQzMl90IGRvdF9pbmRleF9mID0gLTE7DQorICBGWF9EV09SRCBkd0Zvcm1hdFN0eWxlID0gMDsNCisgIENGWF9XaWRlU3RyaW5nIHdzTnVtRm9ybWF0Ow0KKyAgSUZYX0xvY2FsZSogcExvY2FsZSA9DQorICAgICAgR2V0TnVtZXJpY0Zvcm1hdCh3c1BhdHRlcm4sIGRvdF9pbmRleF9mLCBkd0Zvcm1hdFN0eWxlLCB3c051bUZvcm1hdCk7DQorICBpZiAoIXBMb2NhbGUgfHwgd3NOdW1Gb3JtYXQuSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGludDMyX3QgaUV4cG9uZW50ID0gMDsNCisgIENGWF9XaWRlU3RyaW5nIHdzRG90U3ltYm9sOw0KKyAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0RlY2ltYWwsIHdzRG90U3ltYm9sKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzR3JvdXBTeW1ib2w7DQorICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfR3JvdXBpbmcsIHdzR3JvdXBTeW1ib2wpOw0KKyAgaW50MzJfdCBpR3JvdXBMZW4gPSB3c0dyb3VwU3ltYm9sLkdldExlbmd0aCgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51czsNCisgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cywgd3NNaW51cyk7DQorICBpbnQzMl90IGlNaW51c0xlbiA9IHdzTWludXMuR2V0TGVuZ3RoKCk7DQorICBpbnQgY2MgPSAwLCBjY2YgPSAwOw0KKyAgY29uc3QgRlhfV0NIQVIqIHN0ciA9IChjb25zdCBGWF9XQ0hBUiopd3NTcmNOdW07DQorICBpbnQgbGVuID0gd3NTcmNOdW0uR2V0TGVuZ3RoKCk7DQorICBjb25zdCBGWF9XQ0hBUiogc3RyZiA9IChjb25zdCBGWF9XQ0hBUiopd3NOdW1Gb3JtYXQ7DQorICBpbnQgbGVuZiA9IHdzTnVtRm9ybWF0LkdldExlbmd0aCgpOw0KKyAgRlhfQk9PTCBiSGF2ZVBlcmNlbnRTeW1ib2wgPSBGQUxTRTsNCisgIEZYX0JPT0wgYk5lZyA9IEZBTFNFOw0KKyAgRlhfQk9PTCBiUmV2ZXJzZVBhcnNlID0gRkFMU0U7DQorICBpbnQzMl90IGRvdF9pbmRleCA9IDA7DQorICBpZiAoIUZYX0dldE51bWVyaWNEb3RJbmRleCh3c1NyY051bSwgd3NEb3RTeW1ib2wsIGRvdF9pbmRleCkgJiYNCisgICAgICAoZHdGb3JtYXRTdHlsZSAmIEZYX05VTVNUWUxFX0RvdFZvcnYpKSB7DQorICAgIGJSZXZlcnNlUGFyc2UgPSBUUlVFOw0KKyAgfQ0KKyAgYlJldmVyc2VQYXJzZSA9IEZBTFNFOw0KKyAgY2NmID0gZG90X2luZGV4X2YgLSAxOw0KKyAgY2MgPSBkb3RfaW5kZXggLSAxOw0KKyAgd2hpbGUgKGNjZiA+PSAwICYmIGNjID49IDApIHsNCisgICAgc3dpdGNoIChzdHJmW2NjZl0pIHsNCisgICAgICBjYXNlICdcJyc6IHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTGl0ZXJhbCA9IEZYX0dldExpdGVyYWxUZXh0UmV2ZXJzZShzdHJmLCBjY2YpOw0KKyAgICAgICAgaW50MzJfdCBpTGl0ZXJhbExlbiA9IHdzTGl0ZXJhbC5HZXRMZW5ndGgoKTsNCisgICAgICAgIGNjIC09IGlMaXRlcmFsTGVuIC0gMTsNCisgICAgICAgIGlmIChjYyA8IDAgfHwNCisgICAgICAgICAgICBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzTGl0ZXJhbCwgaUxpdGVyYWxMZW4pKSB7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGNjLS07DQorICAgICAgICBjY2YtLTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlICc5JzoNCisgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICB3c1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmdDKHN0cltjY10pICsgd3NWYWx1ZTsNCisgICAgICAgIGNjLS07DQorICAgICAgICBjY2YtLTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ3onOg0KKyAgICAgICAgaWYgKEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgd3NWYWx1ZSA9IENGWF9XaWRlU3RyaW5nQyhzdHJbY2NdKSArIHdzVmFsdWU7DQorICAgICAgICAgIGNjLS07DQorICAgICAgICB9DQorICAgICAgICBjY2YtLTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ1onOg0KKyAgICAgICAgaWYgKHN0cltjY10gIT0gJyAnKSB7DQorICAgICAgICAgIGlmIChGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgd3NWYWx1ZSA9IENGWF9XaWRlU3RyaW5nQyhzdHJbY2NdKSArIHdzVmFsdWU7DQorICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgY2MtLTsNCisgICAgICAgIH0NCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnUyc6DQorICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycgfHwgc3RyW2NjXSA9PSAnICcpIHsNCisgICAgICAgICAgY2MtLTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGNjIC09IGlNaW51c0xlbiAtIDE7DQorICAgICAgICAgIGlmIChjYyA8IDAgfHwNCisgICAgICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NNaW51cywgaU1pbnVzTGVuKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAncyc6DQorICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycpIHsNCisgICAgICAgICAgY2MtLTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGNjIC09IGlNaW51c0xlbiAtIDE7DQorICAgICAgICAgIGlmIChjYyA8IDAgfHwNCisgICAgICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NNaW51cywgaU1pbnVzTGVuKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnRSc6IHsNCisgICAgICAgIGlmIChjYyA+PSBkb3RfaW5kZXgpIHsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfQk9PTCBiRXhwU2lnbiA9IEZBTFNFOw0KKyAgICAgICAgd2hpbGUgKGNjID49IDApIHsNCisgICAgICAgICAgaWYgKHN0cltjY10gPT0gJ0UnIHx8IHN0cltjY10gPT0gJ2UnKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICBpRXhwb25lbnQgPSBpRXhwb25lbnQgKyAoc3RyW2NjXSAtICcwJykgKiAxMDsNCisgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJysnKSB7DQorICAgICAgICAgICAgY2MtLTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgfSBlbHNlIGlmIChjYyAtIGlNaW51c0xlbiArIDEgPiAwICYmDQorICAgICAgICAgICAgICAgICAgICAgIUZYU1lTX3djc25jbXAoc3RyICsgKGNjIC0gaU1pbnVzTGVuICsgMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IEZYX1dDSEFSKil3c01pbnVzLCBpTWludXNMZW4pKSB7DQorICAgICAgICAgICAgYkV4cFNpZ24gPSBUUlVFOw0KKyAgICAgICAgICAgIGNjIC09IGlNaW51c0xlbjsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGNjLS07DQorICAgICAgICBpRXhwb25lbnQgPSBiRXhwU2lnbiA/IC1pRXhwb25lbnQgOiBpRXhwb25lbnQ7DQorICAgICAgICBjY2YtLTsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgJyQnOiB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCisgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbCwgd3NTeW1ib2wpOw0KKyAgICAgICAgaW50MzJfdCBpU3ltYm9sTGVuID0gd3NTeW1ib2wuR2V0TGVuZ3RoKCk7DQorICAgICAgICBjYyAtPSBpU3ltYm9sTGVuIC0gMTsNCisgICAgICAgIGlmIChjYyA8IDAgfHwNCisgICAgICAgICAgICBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzU3ltYm9sLCBpU3ltYm9sTGVuKSkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBjYy0tOw0KKyAgICAgICAgY2NmLS07DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlICdyJzoNCisgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnYycpIHsNCisgICAgICAgICAgaWYgKHN0cltjY10gPT0gJ1InICYmIGNjIC0gMSA+PSAwICYmIHN0cltjYyAtIDFdID09ICdDJykgew0KKyAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgIGNjIC09IDI7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmIC09IDI7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBjY2YtLTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ1InOg0KKyAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdDJykgew0KKyAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnICcpIHsNCisgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJ1InICYmIGNjIC0gMSA+PSAwICYmIHN0cltjYyAtIDFdID09ICdDJykgew0KKyAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgIGNjIC09IDI7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmIC09IDI7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBjY2YtLTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ2InOg0KKyAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdkJykgew0KKyAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnQicgJiYgY2MgLSAxID49IDAgJiYgc3RyW2NjIC0gMV0gPT0gJ0QnKSB7DQorICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgY2MgLT0gMjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YgLT0gMjsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnQic6DQorICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ0QnKSB7DQorICAgICAgICAgIGlmIChzdHJbY2NdID09ICcgJykgew0KKyAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnQicgJiYgY2MgLSAxID49IDAgJiYgc3RyW2NjIC0gMV0gPT0gJ0QnKSB7DQorICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgY2MgLT0gMjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YgLT0gMjsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGNjZi0tOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnLic6DQorICAgICAgY2FzZSAnVic6DQorICAgICAgY2FzZSAndic6DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgY2FzZSAnJSc6IHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOw0KKyAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX1BlcmNlbnQsIHdzU3ltYm9sKTsNCisgICAgICAgIGludDMyX3QgaVN5c21ib2xMZW4gPSB3c1N5bWJvbC5HZXRMZW5ndGgoKTsNCisgICAgICAgIGNjIC09IGlTeXNtYm9sTGVuIC0gMTsNCisgICAgICAgIGlmIChjYyA8IDAgfHwNCisgICAgICAgICAgICBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzU3ltYm9sLCBpU3lzbWJvbExlbikpIHsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2MtLTsNCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYkhhdmVQZXJjZW50U3ltYm9sID0gVFJVRTsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgJzgnOg0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIGNhc2UgJywnOiB7DQorICAgICAgICBpZiAoY2MgPj0gMCkgew0KKyAgICAgICAgICBjYyAtPSBpR3JvdXBMZW4gLSAxOw0KKyAgICAgICAgICBpZiAoY2MgPj0gMCAmJg0KKyAgICAgICAgICAgICAgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c0dyb3VwU3ltYm9sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpR3JvdXBMZW4pID09IDApIHsNCisgICAgICAgICAgICBjYy0tOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGNjICs9IGlHcm91cExlbiAtIDE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGNjZi0tOw0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSAnKCc6DQorICAgICAgICBpZiAoc3RyW2NjXSA9PSBMJygnKSB7DQorICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdICE9IEwnICcpIHsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2MtLTsNCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnKSc6DQorICAgICAgICBpZiAoc3RyW2NjXSA9PSBMJyknKSB7DQorICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdICE9IEwnICcpIHsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2MtLTsNCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGlmIChzdHJmW2NjZl0gIT0gc3RyW2NjXSkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBjYy0tOw0KKyAgICAgICAgY2NmLS07DQorICAgIH0NCisgIH0NCisgIGlmIChjYyA+PSAwKSB7DQorICAgIGlmIChzdHJbY2NdID09ICctJykgew0KKyAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgIGNjLS07DQorICAgIH0NCisgICAgaWYgKGNjID49IDApIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgIH0NCisgIGlmIChkb3RfaW5kZXggPCBsZW4gJiYgKGR3Rm9ybWF0U3R5bGUgJiBGWF9OVU1TVFlMRV9Eb3RWb3J2KSkgew0KKyAgICB3c1ZhbHVlICs9ICcuJzsNCisgIH0NCisgIGlmICghYlJldmVyc2VQYXJzZSkgew0KKyAgICBjY2YgPSBkb3RfaW5kZXhfZiArIDE7DQorICAgIGNjID0gKGRvdF9pbmRleCA9PSBsZW4pID8gbGVuIDogZG90X2luZGV4ICsgMTsNCisgICAgd2hpbGUgKGNjIDwgbGVuICYmIGNjZiA8IGxlbmYpIHsNCisgICAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgew0KKyAgICAgICAgY2FzZSAnXCcnOiB7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTGl0ZXJhbCA9IEZYX0dldExpdGVyYWxUZXh0KHN0cmYsIGNjZiwgbGVuZik7DQorICAgICAgICAgIGludDMyX3QgaUxpdGVyYWxMZW4gPSB3c0xpdGVyYWwuR2V0TGVuZ3RoKCk7DQorICAgICAgICAgIGlmIChjYyArIGlMaXRlcmFsTGVuID4gbGVuIHx8DQorICAgICAgICAgICAgICBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzTGl0ZXJhbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUxpdGVyYWxMZW4pKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjICs9IGlMaXRlcmFsTGVuOw0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBjYXNlICc5JzoNCisgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHsgd3NWYWx1ZSArPSBzdHJbY2NdOyB9DQorICAgICAgICAgIGNjKys7DQorICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgJ3onOg0KKyAgICAgICAgICBpZiAoRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgIHdzVmFsdWUgKz0gc3RyW2NjXTsNCisgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgJ1onOg0KKyAgICAgICAgICBpZiAoc3RyW2NjXSAhPSAnICcpIHsNCisgICAgICAgICAgICBpZiAoRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgICAgd3NWYWx1ZSArPSBzdHJbY2NdOw0KKyAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICdTJzoNCisgICAgICAgICAgaWYgKHN0cltjY10gPT0gJysnIHx8IHN0cltjY10gPT0gJyAnKSB7DQorICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAoY2MgKyBpTWludXNMZW4gPiBsZW4gfHwNCisgICAgICAgICAgICAgICAgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c01pbnVzLCBpTWludXNMZW4pKSB7DQorICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgIGNjICs9IGlNaW51c0xlbjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICdzJzoNCisgICAgICAgICAgaWYgKHN0cltjY10gPT0gJysnKSB7DQorICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAoY2MgKyBpTWludXNMZW4gPiBsZW4gfHwNCisgICAgICAgICAgICAgICAgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgKGNvbnN0IEZYX1dDSEFSKil3c01pbnVzLCBpTWludXNMZW4pKSB7DQorICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgIGNjICs9IGlNaW51c0xlbjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICdFJzogew0KKyAgICAgICAgICBpZiAoY2MgPj0gbGVuIHx8IChzdHJbY2NdICE9ICdFJyAmJiBzdHJbY2NdICE9ICdlJykpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgRlhfQk9PTCBiRXhwU2lnbiA9IEZBTFNFOw0KKyAgICAgICAgICBjYysrOw0KKyAgICAgICAgICBpZiAoY2MgPCBsZW4pIHsNCisgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycpIHsNCisgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICctJykgew0KKyAgICAgICAgICAgICAgYkV4cFNpZ24gPSBUUlVFOw0KKyAgICAgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQorICAgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaUV4cG9uZW50ID0gaUV4cG9uZW50ICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KKyAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaUV4cG9uZW50ID0gYkV4cFNpZ24gPyAtaUV4cG9uZW50IDogaUV4cG9uZW50Ow0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBjYXNlICckJzogew0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCisgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1N5bWJvbCk7DQorICAgICAgICAgIGludDMyX3QgaVN5bWJvbExlbiA9IHdzU3ltYm9sLkdldExlbmd0aCgpOw0KKyAgICAgICAgICBpZiAoY2MgKyBpU3ltYm9sTGVuID4gbGVuIHx8DQorICAgICAgICAgICAgICBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzU3ltYm9sLCBpU3ltYm9sTGVuKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjYyArPSBpU3ltYm9sTGVuOw0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBjYXNlICdjJzoNCisgICAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ3InKSB7DQorICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJ0MnICYmIGNjICsgMSA8IGxlbiAmJiBzdHJbY2MgKyAxXSA9PSAnUicpIHsNCisgICAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICAgICAgY2MgKz0gMjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgY2NmICs9IDI7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICdDJzoNCisgICAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ1InKSB7DQorICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJyAnKSB7DQorICAgICAgICAgICAgICBjYysrOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnQycgJiYgY2MgKyAxIDwgbGVuICYmIHN0cltjYyArIDFdID09ICdSJykgew0KKyAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICBjYyArPSAyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjY2YgKz0gMjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgJ2QnOg0KKyAgICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAnYicpIHsNCisgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnRCcgJiYgY2MgKyAxIDwgbGVuICYmIHN0cltjYyArIDFdID09ICdCJykgew0KKyAgICAgICAgICAgICAgYk5lZyA9IFRSVUU7DQorICAgICAgICAgICAgICBjYyArPSAyOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBjY2YgKz0gMjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgJ0QnOg0KKyAgICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAnQicpIHsNCisgICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnICcpIHsNCisgICAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICdEJyAmJiBjYyArIDEgPCBsZW4gJiYgc3RyW2NjICsgMV0gPT0gJ0InKSB7DQorICAgICAgICAgICAgICBiTmVnID0gVFJVRTsNCisgICAgICAgICAgICAgIGNjICs9IDI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNjZiArPSAyOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAnLic6DQorICAgICAgICBjYXNlICdWJzoNCisgICAgICAgIGNhc2UgJ3YnOg0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICBjYXNlICclJzogew0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCisgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX1BlcmNlbnQsIHdzU3ltYm9sKTsNCisgICAgICAgICAgaW50MzJfdCBpU3lzbWJvbExlbiA9IHdzU3ltYm9sLkdldExlbmd0aCgpOw0KKyAgICAgICAgICBpZiAoY2MgKyBpU3lzbWJvbExlbiA8PSBsZW4gJiYNCisgICAgICAgICAgICAgICFGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzU3ltYm9sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVN5c21ib2xMZW4pKSB7DQorICAgICAgICAgICAgY2MgKz0gaVN5c21ib2xMZW47DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmKys7DQorICAgICAgICAgIGJIYXZlUGVyY2VudFN5bWJvbCA9IFRSVUU7DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSAnOCc6IHsNCisgICAgICAgICAgd2hpbGUgKGNjZiA8IGxlbmYgJiYgc3RyZltjY2ZdID09ICc4Jykgew0KKyAgICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHdoaWxlIChjYyA8IGxlbiAmJiBGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgd3NWYWx1ZSArPSBzdHJbY2NdOw0KKyAgICAgICAgICAgIGNjKys7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBjYXNlICcsJzogew0KKyAgICAgICAgICBpZiAoY2MgKyBpR3JvdXBMZW4gPD0gbGVuICYmDQorICAgICAgICAgICAgICBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzR3JvdXBTeW1ib2wsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlHcm91cExlbikgPT0gMCkgew0KKyAgICAgICAgICAgIGNjICs9IGlHcm91cExlbjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBjYXNlICcoJzoNCisgICAgICAgICAgaWYgKHN0cltjY10gPT0gTCcoJykgew0KKyAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gIT0gTCcgJykgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjYysrOw0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICcpJzoNCisgICAgICAgICAgaWYgKHN0cltjY10gPT0gTCcpJykgew0KKyAgICAgICAgICAgIGJOZWcgPSBUUlVFOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gIT0gTCcgJykgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjYysrOw0KKyAgICAgICAgICBjY2YrKzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBpZiAoc3RyZltjY2ZdICE9IHN0cltjY10pIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2MrKzsNCisgICAgICAgICAgY2NmKys7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChjYyAhPSBsZW4pIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgIH0NCisgIGlmIChpRXhwb25lbnQgfHwgYkhhdmVQZXJjZW50U3ltYm9sKSB7DQorICAgIENGWF9EZWNpbWFsIGRlY2ltYWwgPSBDRlhfRGVjaW1hbCh3c1ZhbHVlKTsNCisgICAgaWYgKGlFeHBvbmVudCkgew0KKyAgICAgIGRlY2ltYWwgPSBkZWNpbWFsICogQ0ZYX0RlY2ltYWwoRlhTWVNfcG93KDEwLCAoRlhfRkxPQVQpaUV4cG9uZW50KSk7DQorICAgIH0NCisgICAgaWYgKGJIYXZlUGVyY2VudFN5bWJvbCkgew0KKyAgICAgIGRlY2ltYWwgPSBkZWNpbWFsIC8gQ0ZYX0RlY2ltYWwoMTAwKTsNCisgICAgfQ0KKyAgICB3c1ZhbHVlID0gZGVjaW1hbDsNCisgIH0NCisgIGlmIChiTmVnKSB7DQorICAgIHdzVmFsdWUgPSBDRlhfV2lkZVN0cmluZ0MoJy0nKSArIHdzVmFsdWU7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfREFURVRJTUVUWVBFIENGWF9Gb3JtYXRTdHJpbmc6OkdldERhdGVUaW1lRm9ybWF0KA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICBJRlhfTG9jYWxlKiYgcExvY2FsZSwNCisgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZVBhdHRlcm4sDQorICAgIENGWF9XaWRlU3RyaW5nJiB3c1RpbWVQYXR0ZXJuKSB7DQorICBwTG9jYWxlID0gTlVMTDsNCisgIENGWF9XaWRlU3RyaW5nIHdzVGVtcFBhdHRlcm47DQorICBGWF9MT0NBTEVDQVRFR09SWSBlQ2F0ZWdvcnkgPSBGWF9MT0NBTEVDQVRFR09SWV9Vbmtub3duOw0KKyAgaW50MzJfdCBjY2YgPSAwOw0KKyAgaW50MzJfdCBpTGVuZiA9IHdzUGF0dGVybi5HZXRMZW5ndGgoKTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwU3RyID0gKGNvbnN0IEZYX1dDSEFSKil3c1BhdHRlcm47DQorICBpbnQzMl90IGlGaW5kQ2F0ZWdvcnkgPSAwOw0KKyAgRlhfQk9PTCBiQnJhY2VPcGVuID0gRkFMU0U7DQorICB3aGlsZSAoY2NmIDwgaUxlbmYpIHsNCisgICAgaWYgKHBTdHJbY2NmXSA9PSAnXCcnKSB7DQorICAgICAgaW50MzJfdCBpQ3VyQ2hhciA9IGNjZjsNCisgICAgICBGWF9HZXRMaXRlcmFsVGV4dChwU3RyLCBjY2YsIGlMZW5mKTsNCisgICAgICB3c1RlbXBQYXR0ZXJuICs9IENGWF9XaWRlU3RyaW5nQyhwU3RyICsgaUN1ckNoYXIsIGNjZiAtIGlDdXJDaGFyICsgMSk7DQorICAgIH0gZWxzZSBpZiAoIWJCcmFjZU9wZW4gJiYgaUZpbmRDYXRlZ29yeSAhPSAzICYmDQorICAgICAgICAgICAgICAgRlhfTG9jYWxfRmluZChnc193c0NvbnN0Q2hhcnMsIHBTdHJbY2NmXSkgPCAwKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDYXRlZ29yeShwU3RyW2NjZl0pOw0KKyAgICAgIGNjZisrOw0KKyAgICAgIHdoaWxlIChjY2YgPCBpTGVuZiAmJiBwU3RyW2NjZl0gIT0gJ3snICYmIHBTdHJbY2NmXSAhPSAnLicgJiYNCisgICAgICAgICAgICAgcFN0cltjY2ZdICE9ICcoJykgew0KKyAgICAgICAgaWYgKHBTdHJbY2NmXSA9PSAnVCcpIHsNCisgICAgICAgICAgd3NEYXRlUGF0dGVybiA9IHdzUGF0dGVybi5MZWZ0KGNjZik7DQorICAgICAgICAgIHdzVGltZVBhdHRlcm4gPSB3c1BhdHRlcm4uUmlnaHQod3NQYXR0ZXJuLkdldExlbmd0aCgpIC0gY2NmKTsNCisgICAgICAgICAgd3NUaW1lUGF0dGVybi5TZXRBdCgwLCAnICcpOw0KKyAgICAgICAgICBpZiAoIXBMb2NhbGUpIHsNCisgICAgICAgICAgICBwTG9jYWxlID0gbV9wTG9jYWxlTWdyLT5HZXREZWZMb2NhbGUoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICByZXR1cm4gRlhfREFURVRJTUVUWVBFX0RhdGVUaW1lOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd3NDYXRlZ29yeSArPSBwU3RyW2NjZl07DQorICAgICAgICBjY2YrKzsNCisgICAgICB9DQorICAgICAgaWYgKCEoaUZpbmRDYXRlZ29yeSAmIDEpICYmIHdzQ2F0ZWdvcnkgPT0gRlhfV1NUUkMoTCJkYXRlIikpIHsNCisgICAgICAgIGlGaW5kQ2F0ZWdvcnkgfD0gMTsNCisgICAgICAgIGVDYXRlZ29yeSA9IEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGU7DQorICAgICAgICBpZiAoaUZpbmRDYXRlZ29yeSAmIDIpIHsNCisgICAgICAgICAgaUZpbmRDYXRlZ29yeSA9IDQ7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIGlmICghKGlGaW5kQ2F0ZWdvcnkgJiAyKSAmJiB3c0NhdGVnb3J5ID09IEZYX1dTVFJDKEwidGltZSIpKSB7DQorICAgICAgICBpRmluZENhdGVnb3J5IHw9IDI7DQorICAgICAgICBlQ2F0ZWdvcnkgPSBGWF9MT0NBTEVDQVRFR09SWV9UaW1lOw0KKyAgICAgIH0gZWxzZSBpZiAod3NDYXRlZ29yeSA9PSBGWF9XU1RSQyhMImRhdGV0aW1lIikpIHsNCisgICAgICAgIGlGaW5kQ2F0ZWdvcnkgPSAzOw0KKyAgICAgICAgZUNhdGVnb3J5ID0gRlhfTE9DQUxFQ0FURUdPUllfRGF0ZVRpbWU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICB3aGlsZSAoY2NmIDwgaUxlbmYpIHsNCisgICAgICAgIGlmIChwU3RyW2NjZl0gPT0gJygnKSB7DQorICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0xDSUQ7DQorICAgICAgICAgIHdoaWxlIChjY2YgPCBpTGVuZiAmJiBwU3RyW2NjZl0gIT0gJyknKSB7DQorICAgICAgICAgICAgd3NMQ0lEICs9IHBTdHJbY2NmKytdOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHBMb2NhbGUgPSBHZXRQYXR0ZXJuTG9jYWxlKHdzTENJRCk7DQorICAgICAgICB9IGVsc2UgaWYgKHBTdHJbY2NmXSA9PSAneycpIHsNCisgICAgICAgICAgYkJyYWNlT3BlbiA9IFRSVUU7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfSBlbHNlIGlmIChwU3RyW2NjZl0gPT0gJy4nKSB7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ViQ2F0ZWdvcnk7DQorICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgICB3aGlsZSAoY2NmIDwgaUxlbmYgJiYgcFN0cltjY2ZdICE9ICcoJyAmJiBwU3RyW2NjZl0gIT0gJ3snKSB7DQorICAgICAgICAgICAgd3NTdWJDYXRlZ29yeSArPSBwU3RyW2NjZisrXTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBGWF9EV09SRCBkd1N1Ykhhc2ggPQ0KKyAgICAgICAgICAgICAgRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NTdWJDYXRlZ29yeSwgd3NTdWJDYXRlZ29yeS5HZXRMZW5ndGgoKSk7DQorICAgICAgICAgIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVN1YkNhdGVnb3J5ID0NCisgICAgICAgICAgICAgIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtOw0KKyAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBnX2lGWExvY2FsZURhdGVUaW1lU3ViQ2F0Q291bnQ7IGkrKykgew0KKyAgICAgICAgICAgIGlmIChnX0ZYTG9jYWxlRGF0ZVRpbWVTdWJDYXREYXRhW2ldLnVIYXNoID09IGR3U3ViSGFzaCkgew0KKyAgICAgICAgICAgICAgZVN1YkNhdGVnb3J5ID0NCisgICAgICAgICAgICAgICAgICAoRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSlnX0ZYTG9jYWxlRGF0ZVRpbWVTdWJDYXREYXRhW2ldDQorICAgICAgICAgICAgICAgICAgICAgIC5lU3ViQ2F0ZWdvcnk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKCFwTG9jYWxlKSB7DQorICAgICAgICAgICAgcExvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBMb2NhbGUgIT0gTlVMTCk7DQorICAgICAgICAgIHN3aXRjaCAoZUNhdGVnb3J5KSB7DQorICAgICAgICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlOg0KKyAgICAgICAgICAgICAgcExvY2FsZS0+R2V0RGF0ZVBhdHRlcm4oZVN1YkNhdGVnb3J5LCB3c0RhdGVQYXR0ZXJuKTsNCisgICAgICAgICAgICAgIHdzRGF0ZVBhdHRlcm4gPSB3c1RlbXBQYXR0ZXJuICsgd3NEYXRlUGF0dGVybjsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfVGltZToNCisgICAgICAgICAgICAgIHBMb2NhbGUtPkdldFRpbWVQYXR0ZXJuKGVTdWJDYXRlZ29yeSwgd3NUaW1lUGF0dGVybik7DQorICAgICAgICAgICAgICB3c1RpbWVQYXR0ZXJuID0gd3NUZW1wUGF0dGVybiArIHdzVGltZVBhdHRlcm47DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVUaW1lOg0KKyAgICAgICAgICAgICAgcExvY2FsZS0+R2V0RGF0ZVBhdHRlcm4oZVN1YkNhdGVnb3J5LCB3c0RhdGVQYXR0ZXJuKTsNCisgICAgICAgICAgICAgIHdzRGF0ZVBhdHRlcm4gPSB3c1RlbXBQYXR0ZXJuICsgd3NEYXRlUGF0dGVybjsNCisgICAgICAgICAgICAgIHBMb2NhbGUtPkdldFRpbWVQYXR0ZXJuKGVTdWJDYXRlZ29yeSwgd3NUaW1lUGF0dGVybik7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgd3NUZW1wUGF0dGVybi5FbXB0eSgpOw0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGNjZisrOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChwU3RyW2NjZl0gPT0gJ30nKSB7DQorICAgICAgYkJyYWNlT3BlbiA9IEZBTFNFOw0KKyAgICAgIGlmICghd3NUZW1wUGF0dGVybi5Jc0VtcHR5KCkpIHsNCisgICAgICAgIGlmIChlQ2F0ZWdvcnkgPT0gRlhfTE9DQUxFQ0FURUdPUllfVGltZSkgew0KKyAgICAgICAgICB3c1RpbWVQYXR0ZXJuID0gd3NUZW1wUGF0dGVybjsNCisgICAgICAgIH0gZWxzZSBpZiAoZUNhdGVnb3J5ID09IEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGUpIHsNCisgICAgICAgICAgd3NEYXRlUGF0dGVybiA9IHdzVGVtcFBhdHRlcm47DQorICAgICAgICB9DQorICAgICAgICB3c1RlbXBQYXR0ZXJuLkVtcHR5KCk7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHdzVGVtcFBhdHRlcm4gKz0gcFN0cltjY2ZdOw0KKyAgICB9DQorICAgIGNjZisrOw0KKyAgfQ0KKyAgaWYgKCF3c1RlbXBQYXR0ZXJuLklzRW1wdHkoKSkgew0KKyAgICBpZiAoZUNhdGVnb3J5ID09IEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGUpIHsNCisgICAgICB3c0RhdGVQYXR0ZXJuICs9IHdzVGVtcFBhdHRlcm47DQorICAgIH0gZWxzZSB7DQorICAgICAgd3NUaW1lUGF0dGVybiArPSB3c1RlbXBQYXR0ZXJuOw0KKyAgICB9DQorICB9DQorICBpZiAoIXBMb2NhbGUpIHsNCisgICAgcExvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7DQorICB9DQorICBpZiAoIWlGaW5kQ2F0ZWdvcnkpIHsNCisgICAgd3NUaW1lUGF0dGVybi5FbXB0eSgpOw0KKyAgICB3c0RhdGVQYXR0ZXJuID0gd3NQYXR0ZXJuOw0KKyAgfQ0KKyAgcmV0dXJuIChGWF9EQVRFVElNRVRZUEUpaUZpbmRDYXRlZ29yeTsNCit9DQorc3RhdGljIEZYX0JPT0wgRlhfUGFyc2VMb2NhbGVEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGVQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfVW5pdGltZSYgZGF0ZXRpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGNjKSB7DQorICBpbnQzMl90IHllYXIgPSAxOTAwOw0KKyAgaW50MzJfdCBtb250aCA9IDE7DQorICBpbnQzMl90IGRheSA9IDE7DQorICBpbnQzMl90IGNjZiA9IDA7DQorICBjb25zdCBGWF9XQ0hBUiogc3RyID0gKGNvbnN0IEZYX1dDSEFSKil3c0RhdGU7DQorICBpbnQzMl90IGxlbiA9IHdzRGF0ZS5HZXRMZW5ndGgoKTsNCisgIGNvbnN0IEZYX1dDSEFSKiBzdHJmID0gKGNvbnN0IEZYX1dDSEFSKil3c0RhdGVQYXR0ZXJuOw0KKyAgaW50MzJfdCBsZW5mID0gd3NEYXRlUGF0dGVybi5HZXRMZW5ndGgoKTsNCisgIHdoaWxlIChjYyA8IGxlbiAmJiBjY2YgPCBsZW5mKSB7DQorICAgIGlmIChzdHJmW2NjZl0gPT0gJ1wnJykgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzTGl0ZXJhbCA9IEZYX0dldExpdGVyYWxUZXh0KHN0cmYsIGNjZiwgbGVuZik7DQorICAgICAgaW50MzJfdCBpTGl0ZXJhbExlbiA9IHdzTGl0ZXJhbC5HZXRMZW5ndGgoKTsNCisgICAgICBpZiAoY2MgKyBpTGl0ZXJhbExlbiA+IGxlbiB8fA0KKyAgICAgICAgICBGWFNZU193Y3NuY21wKHN0ciArIGNjLCAoY29uc3QgRlhfV0NIQVIqKXdzTGl0ZXJhbCwgaUxpdGVyYWxMZW4pKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGNjICs9IGlMaXRlcmFsTGVuOw0KKyAgICAgIGNjZisrOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9IGVsc2UgaWYgKEZYX0xvY2FsX0ZpbmQoZ3Nfd3NEYXRlU3ltYm9scywgc3RyZltjY2ZdKSA8IDApIHsNCisgICAgICBpZiAoc3RyZltjY2ZdICE9IHN0cltjY10pIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgY2MrKzsNCisgICAgICBjY2YrKzsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBGWF9EV09SRCBkd1N5bWJvbE51bSA9IDE7DQorICAgIEZYX0RXT1JEIGR3U3ltYm9sID0gc3RyZltjY2YrK107DQorICAgIHdoaWxlIChjY2YgPCBsZW5mICYmIHN0cmZbY2NmXSA9PSBkd1N5bWJvbCkgew0KKyAgICAgIGNjZisrOw0KKyAgICAgIGR3U3ltYm9sTnVtKys7DQorICAgIH0NCisgICAgZHdTeW1ib2wgPSAoZHdTeW1ib2wgPDwgOCkgfCAoZHdTeW1ib2xOdW0gKyAnMCcpOw0KKyAgICBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdEJywgJzEnKSkgew0KKyAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBkYXkgPSBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgaWYgKGNjIDwgbGVuICYmIEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgIGRheSA9IGRheSAqIDEwICsgc3RyW2NjKytdIC0gJzAnOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0QnLCAnMicpKSB7DQorICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGRheSA9IHN0cltjYysrXSAtICcwJzsNCisgICAgICBpZiAoY2MgPCBsZW4pIHsNCisgICAgICAgIGRheSA9IGRheSAqIDEwICsgc3RyW2NjKytdIC0gJzAnOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0onLCAnMScpKSB7DQorICAgICAgaW50IGkgPSAwOw0KKyAgICAgIHdoaWxlIChjYyA8IGxlbiAmJiBpIDwgMyAmJiBGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICBjYysrOw0KKyAgICAgICAgaSsrOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0onLCAnMycpKSB7DQorICAgICAgY2MgKz0gMzsNCisgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ00nLCAnMScpKSB7DQorICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIG1vbnRoID0gc3RyW2NjKytdIC0gJzAnOw0KKyAgICAgIGlmIChjYyA8IGxlbiAmJiBGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICBtb250aCA9IG1vbnRoICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICcyJykpIHsNCisgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgbW9udGggPSBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgaWYgKGNjIDwgbGVuKSB7DQorICAgICAgICBtb250aCA9IG1vbnRoICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICczJykpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c01vbnRoTmFtZUFiYnI7DQorICAgICAgRlhfV09SRCBpID0gMDsNCisgICAgICBmb3IgKDsgaSA8IDEyOyBpKyspIHsNCisgICAgICAgIHBMb2NhbGUtPkdldE1vbnRoTmFtZShpLCB3c01vbnRoTmFtZUFiYnIsIFRSVUUpOw0KKyAgICAgICAgaWYgKHdzTW9udGhOYW1lQWJici5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoIUZYU1lTX3djc25jbXAoKGNvbnN0IEZYX1dDSEFSKil3c01vbnRoTmFtZUFiYnIsIHN0ciArIGNjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzTW9udGhOYW1lQWJici5HZXRMZW5ndGgoKSkpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmIChpIDwgMTIpIHsNCisgICAgICAgIGNjICs9IHdzTW9udGhOYW1lQWJici5HZXRMZW5ndGgoKTsNCisgICAgICAgIG1vbnRoID0gaSArIDE7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICc0JykpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c01vbnRoTmFtZTsNCisgICAgICBGWF9XT1JEIGkgPSAwOw0KKyAgICAgIGZvciAoOyBpIDwgMTI7IGkrKykgew0KKyAgICAgICAgcExvY2FsZS0+R2V0TW9udGhOYW1lKGksIHdzTW9udGhOYW1lLCBGQUxTRSk7DQorICAgICAgICBpZiAod3NNb250aE5hbWUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFGWFNZU193Y3NuY21wKChjb25zdCBGWF9XQ0hBUiopd3NNb250aE5hbWUsIHN0ciArIGNjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzTW9udGhOYW1lLkdldExlbmd0aCgpKSkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgaWYgKGkgPCAxMikgew0KKyAgICAgICAgY2MgKz0gd3NNb250aE5hbWUuR2V0TGVuZ3RoKCk7DQorICAgICAgICBtb250aCA9IGkgKyAxOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0UnLCAnMScpKSB7DQorICAgICAgY2MgKz0gMTsNCisgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0UnLCAnMycpKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXlOYW1lQWJicjsNCisgICAgICBGWF9XT1JEIGkgPSAwOw0KKyAgICAgIGZvciAoOyBpIDwgNzsgaSsrKSB7DQorICAgICAgICBwTG9jYWxlLT5HZXREYXlOYW1lKGksIHdzRGF5TmFtZUFiYnIsIFRSVUUpOw0KKyAgICAgICAgaWYgKHdzRGF5TmFtZUFiYnIuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFGWFNZU193Y3NuY21wKChjb25zdCBGWF9XQ0hBUiopd3NEYXlOYW1lQWJiciwgc3RyICsgY2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NEYXlOYW1lQWJici5HZXRMZW5ndGgoKSkpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmIChpIDwgMTIpIHsNCisgICAgICAgIGNjICs9IHdzRGF5TmFtZUFiYnIuR2V0TGVuZ3RoKCk7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnRScsICc0JykpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0RheU5hbWU7DQorICAgICAgaW50MzJfdCBpID0gMDsNCisgICAgICBmb3IgKDsgaSA8IDc7IGkrKykgew0KKyAgICAgICAgcExvY2FsZS0+R2V0RGF5TmFtZShpLCB3c0RheU5hbWUsIEZBTFNFKTsNCisgICAgICAgIGlmICh3c0RheU5hbWUgPT0gTCIiKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCFGWFNZU193Y3NuY21wKChjb25zdCBGWF9XQ0hBUiopd3NEYXlOYW1lLCBzdHIgKyBjYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0RheU5hbWUuR2V0TGVuZ3RoKCkpKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoaSA8IDEyKSB7DQorICAgICAgICBjYyArPSB3c0RheU5hbWUuR2V0TGVuZ3RoKCk7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnZScsICcxJykpIHsNCisgICAgICBjYyArPSAxOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnRycsICcxJykpIHsNCisgICAgICBjYyArPSAyOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnWScsICcyJykpIHsNCisgICAgICBpZiAoY2MgKyAyID4gbGVuKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICB5ZWFyID0gc3RyW2NjKytdIC0gJzAnOw0KKyAgICAgIGlmIChjYyA+PSBsZW4gfHwgIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgeWVhciA9IHllYXIgKiAxMCArIHN0cltjYysrXSAtICcwJzsNCisgICAgICBpZiAoeWVhciA8PSAyOSkgew0KKyAgICAgICAgeWVhciArPSAyMDAwOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICB5ZWFyICs9IDE5MDA7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnWScsICc0JykpIHsNCisgICAgICBpbnQgaSA9IDA7DQorICAgICAgeWVhciA9IDA7DQorICAgICAgaWYgKGNjICsgNCA+IGxlbikgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICB3aGlsZSAoaSA8IDQpIHsNCisgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICB5ZWFyID0geWVhciAqIDEwICsgc3RyW2NjXSAtICcwJzsNCisgICAgICAgIGNjKys7DQorICAgICAgICBpKys7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAndycsICcxJykpIHsNCisgICAgICBjYyArPSAxOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnVycsICcyJykpIHsNCisgICAgICBjYyArPSAyOw0KKyAgICB9DQorICB9DQorICBpZiAoY2MgPCBsZW4pIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1VuaXRpbWUgdXQ7DQorICB1dC5TZXQoeWVhciwgbW9udGgsIGRheSk7DQorICBkYXRldGltZSA9IGRhdGV0aW1lICsgdXQ7DQorICByZXR1cm4gY2M7DQorfQ0KK3N0YXRpYyB2b2lkIEZYX1Jlc29sdmVab25lKHVpbnQ4X3QmIHdIb3VyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QmIHdNaW51dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVElNRVpPTkUgdHpEaWZmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUpIHsNCisgIGludDMyX3QgaU1pbnV0ZURpZmYgPSB3SG91ciAqIDYwICsgd01pbnV0ZTsNCisgIEZYX1RJTUVaT05FIHR6TG9jYWxlOw0KKyAgcExvY2FsZS0+R2V0VGltZVpvbmUodHpMb2NhbGUpOw0KKyAgaU1pbnV0ZURpZmYgKz0gdHpMb2NhbGUudHpIb3VyICogNjAgKw0KKyAgICAgICAgICAgICAgICAgKHR6TG9jYWxlLnR6SG91ciA8IDAgPyAtdHpMb2NhbGUudHpNaW51dGUgOiB0ekxvY2FsZS50ek1pbnV0ZSk7DQorICBpTWludXRlRGlmZiAtPSB0ekRpZmYudHpIb3VyICogNjAgKw0KKyAgICAgICAgICAgICAgICAgKHR6RGlmZi50ekhvdXIgPCAwID8gLXR6RGlmZi50ek1pbnV0ZSA6IHR6RGlmZi50ek1pbnV0ZSk7DQorICB3aGlsZSAoaU1pbnV0ZURpZmYgPiAxNDQwKSB7DQorICAgIGlNaW51dGVEaWZmIC09IDE0NDA7DQorICB9DQorICB3aGlsZSAoaU1pbnV0ZURpZmYgPCAwKSB7DQorICAgIGlNaW51dGVEaWZmICs9IDE0NDA7DQorICB9DQorICB3SG91ciA9IGlNaW51dGVEaWZmIC8gNjA7DQorICB3TWludXRlID0gaU1pbnV0ZURpZmYgJSA2MDsNCit9DQorc3RhdGljIEZYX0JPT0wgRlhfUGFyc2VMb2NhbGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RpbWVQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfVW5pdGltZSYgZGF0ZXRpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGNjKSB7DQorICB1aW50OF90IGhvdXIgPSAwOw0KKyAgdWludDhfdCBtaW51dGUgPSAwOw0KKyAgdWludDhfdCBzZWNvbmQgPSAwOw0KKyAgRlhfV09SRCBtaWxsaXNlY29uZCA9IDA7DQorICBpbnQzMl90IGNjZiA9IDA7DQorICBjb25zdCBGWF9XQ0hBUiogc3RyID0gKGNvbnN0IEZYX1dDSEFSKil3c1RpbWU7DQorICBpbnQgbGVuID0gd3NUaW1lLkdldExlbmd0aCgpOw0KKyAgY29uc3QgRlhfV0NIQVIqIHN0cmYgPSAoY29uc3QgRlhfV0NIQVIqKXdzVGltZVBhdHRlcm47DQorICBpbnQgbGVuZiA9IHdzVGltZVBhdHRlcm4uR2V0TGVuZ3RoKCk7DQorICBGWF9CT09MIGJIYXNBID0gRkFMU0U7DQorICBGWF9CT09MIGJQTSA9IEZBTFNFOw0KKyAgd2hpbGUgKGNjIDwgbGVuICYmIGNjZiA8IGxlbmYpIHsNCisgICAgaWYgKHN0cmZbY2NmXSA9PSAnXCcnKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMaXRlcmFsID0gRlhfR2V0TGl0ZXJhbFRleHQoc3RyZiwgY2NmLCBsZW5mKTsNCisgICAgICBpbnQzMl90IGlMaXRlcmFsTGVuID0gd3NMaXRlcmFsLkdldExlbmd0aCgpOw0KKyAgICAgIGlmIChjYyArIGlMaXRlcmFsTGVuID4gbGVuIHx8DQorICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIChjb25zdCBGWF9XQ0hBUiopd3NMaXRlcmFsLCBpTGl0ZXJhbExlbikpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgY2MgKz0gaUxpdGVyYWxMZW47DQorICAgICAgY2NmKys7DQorICAgICAgY29udGludWU7DQorICAgIH0gZWxzZSBpZiAoRlhfTG9jYWxfRmluZChnc193c1RpbWVTeW1ib2xzLCBzdHJmW2NjZl0pID09IC0xKSB7DQorICAgICAgaWYgKHN0cmZbY2NmXSAhPSBzdHJbY2NdKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGNjKys7DQorICAgICAgY2NmKys7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgRlhfRFdPUkQgZHdTeW1ib2xOdW0gPSAxOw0KKyAgICBGWF9EV09SRCBkd1N5bWJvbCA9IHN0cmZbY2NmKytdOw0KKyAgICB3aGlsZSAoY2NmIDwgbGVuZiAmJiBzdHJmW2NjZl0gPT0gZHdTeW1ib2wpIHsNCisgICAgICBjY2YrKzsNCisgICAgICBkd1N5bWJvbE51bSsrOw0KKyAgICB9DQorICAgIGR3U3ltYm9sID0gKGR3U3ltYm9sIDw8IDgpIHwgKGR3U3ltYm9sTnVtICsgJzAnKTsNCisgICAgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnaycsICcxJykgfHwNCisgICAgICAgIGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSCcsICcxJykgfHwNCisgICAgICAgIGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnaCcsICcxJykgfHwNCisgICAgICAgIGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSycsICcxJykpIHsNCisgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgaG91ciA9IHN0cltjYysrXSAtICcwJzsNCisgICAgICBpZiAoY2MgPCBsZW4gJiYgRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgaG91ciA9IGhvdXIgKiAxMCArIHN0cltjYysrXSAtICcwJzsNCisgICAgICB9DQorICAgICAgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSycsICcxJykgJiYgaG91ciA9PSAyNCkgew0KKyAgICAgICAgaG91ciA9IDA7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnaycsICcyJykgfHwNCisgICAgICAgICAgICAgICBkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0gnLCAnMicpIHx8DQorICAgICAgICAgICAgICAgZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdoJywgJzInKSB8fA0KKyAgICAgICAgICAgICAgIGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSycsICcyJykpIHsNCisgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgaG91ciA9IHN0cltjYysrXSAtICcwJzsNCisgICAgICBpZiAoY2MgPj0gbGVuKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBob3VyID0gaG91ciAqIDEwICsgc3RyW2NjKytdIC0gJzAnOw0KKyAgICAgIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0snLCAnMicpICYmIGhvdXIgPT0gMjQpIHsNCisgICAgICAgIGhvdXIgPSAwOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ00nLCAnMScpKSB7DQorICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIG1pbnV0ZSA9IHN0cltjYysrXSAtICcwJzsNCisgICAgICBpZiAoY2MgPCBsZW4gJiYgRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgbWludXRlID0gbWludXRlICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICcyJykpIHsNCisgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgbWludXRlID0gc3RyW2NjKytdIC0gJzAnOw0KKyAgICAgIGlmIChjYyA+PSBsZW4pIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIG1pbnV0ZSA9IG1pbnV0ZSAqIDEwICsgc3RyW2NjKytdIC0gJzAnOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnUycsICcxJykpIHsNCisgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgc2Vjb25kID0gc3RyW2NjKytdIC0gJzAnOw0KKyAgICAgIGlmIChjYyA8IGxlbiAmJiBGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICBzZWNvbmQgPSBzZWNvbmQgKiAxMCArIHN0cltjYysrXSAtICcwJzsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdTJywgJzInKSkgew0KKyAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBzZWNvbmQgPSBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgaWYgKGNjID49IGxlbikgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgc2Vjb25kID0gc2Vjb25kICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdGJywgJzMnKSkgew0KKyAgICAgIGlmIChjYyArIDMgPj0gbGVuKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGludCBpID0gMDsNCisgICAgICB3aGlsZSAoaSA8IDMpIHsNCisgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBtaWxsaXNlY29uZCA9IG1pbGxpc2Vjb25kICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQorICAgICAgICBpKys7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnQScsICcxJykpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0FNOw0KKyAgICAgIHBMb2NhbGUtPkdldE1lcmlkaWVtTmFtZSh3c0FNLCBUUlVFKTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1BNOw0KKyAgICAgIHBMb2NhbGUtPkdldE1lcmlkaWVtTmFtZSh3c1BNLCBGQUxTRSk7DQorICAgICAgaWYgKChjYyArIHdzQU0uR2V0TGVuZ3RoKCkgPD0gbGVuKSAmJg0KKyAgICAgICAgICAoQ0ZYX1dpZGVTdHJpbmdDKHN0ciArIGNjLCB3c0FNLkdldExlbmd0aCgpKSA9PSB3c0FNKSkgew0KKyAgICAgICAgY2MgKz0gd3NBTS5HZXRMZW5ndGgoKTsNCisgICAgICAgIGJIYXNBID0gVFJVRTsNCisgICAgICB9IGVsc2UgaWYgKChjYyArIHdzUE0uR2V0TGVuZ3RoKCkgPD0gbGVuKSAmJg0KKyAgICAgICAgICAgICAgICAgKENGWF9XaWRlU3RyaW5nQyhzdHIgKyBjYywgd3NQTS5HZXRMZW5ndGgoKSkgPT0gd3NQTSkpIHsNCisgICAgICAgIGNjICs9IHdzUE0uR2V0TGVuZ3RoKCk7DQorICAgICAgICBiSGFzQSA9IFRSVUU7DQorICAgICAgICBiUE0gPSBUUlVFOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ1onLCAnMScpKSB7DQorICAgICAgaWYgKGNjICsgMyA+IGxlbikgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIEZYX0RXT1JEIGR3SGFzaCA9IHN0cltjYysrXTsNCisgICAgICBkd0hhc2ggPSAoZHdIYXNoIDw8IDgpIHwgc3RyW2NjKytdOw0KKyAgICAgIGR3SGFzaCA9IChkd0hhc2ggPDwgOCkgfCBzdHJbY2MrK107DQorICAgICAgaWYgKGR3SGFzaCA9PSBGWEJTVFJfSUQoMCwgJ0cnLCAnTScsICdUJykpIHsNCisgICAgICAgIEZYX1RJTUVaT05FIHR6RGlmZjsNCisgICAgICAgIHR6RGlmZi50ekhvdXIgPSAwOw0KKyAgICAgICAgdHpEaWZmLnR6TWludXRlID0gMDsNCisgICAgICAgIGlmIChjYyA8IGxlbiAmJiAoc3RyW2NjXSA9PSAnLScgfHwgc3RyW2NjXSA9PSAnKycpKSB7DQorICAgICAgICAgIGNjICs9IEZYX1BhcnNlVGltZVpvbmUoc3RyICsgY2MsIGxlbiAtIGNjLCB0ekRpZmYpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfUmVzb2x2ZVpvbmUoaG91ciwgbWludXRlLCB0ekRpZmYsIHBMb2NhbGUpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBGWF9MUENMT0NBTEVUSU1FWk9ORUlORk8gcFRpbWVab25lSW5mbyA9IE5VTEw7DQorICAgICAgICBpbnQzMl90IGlTdGFydCA9IDAsIGlFbmQgPSBnX2lGWExvY2FsZVRpbWVab25lQ291bnQgLSAxOw0KKyAgICAgICAgZG8gew0KKyAgICAgICAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICAgICAgICBGWF9MUENMT0NBTEVUSU1FWk9ORUlORk8gcEluZm8gPSBnX0ZYTG9jYWxlVGltZVpvbmVEYXRhICsgaU1pZDsNCisgICAgICAgICAgaWYgKGR3SGFzaCA9PSBwSW5mby0+dUhhc2gpIHsNCisgICAgICAgICAgICBwVGltZVpvbmVJbmZvID0gcEluZm87DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0gZWxzZSBpZiAoZHdIYXNoIDwgcEluZm8tPnVIYXNoKSB7DQorICAgICAgICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICAgICAgICBpZiAocFRpbWVab25lSW5mbykgew0KKyAgICAgICAgICBob3VyICs9IHBUaW1lWm9uZUluZm8tPmlIb3VyOw0KKyAgICAgICAgICBtaW51dGUgKz0gcFRpbWVab25lSW5mby0+aUhvdXIgPiAwID8gcFRpbWVab25lSW5mby0+aU1pbnV0ZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogLXBUaW1lWm9uZUluZm8tPmlNaW51dGU7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAneicsICcxJykpIHsNCisgICAgICBpZiAoc3RyW2NjXSAhPSAnWicpIHsNCisgICAgICAgIEZYX1RJTUVaT05FIHR6RGlmZjsNCisgICAgICAgIGNjICs9IEZYX1BhcnNlVGltZVpvbmUoc3RyICsgY2MsIGxlbiAtIGNjLCB0ekRpZmYpOw0KKyAgICAgICAgRlhfUmVzb2x2ZVpvbmUoaG91ciwgbWludXRlLCB0ekRpZmYsIHBMb2NhbGUpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBjYysrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGJIYXNBKSB7DQorICAgIGlmIChiUE0pIHsNCisgICAgICBob3VyICs9IDEyOw0KKyAgICAgIGlmIChob3VyID09IDI0KSB7DQorICAgICAgICBob3VyID0gMTI7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChob3VyID09IDEyKSB7DQorICAgICAgICBob3VyID0gMDsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIENGWF9Vbml0aW1lIHV0Ow0KKyAgdXQuU2V0KDAsIDAsIDAsIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCk7DQorICBkYXRldGltZSA9IGRhdGV0aW1lICsgdXQ7DQorICByZXR1cm4gY2M7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0Zvcm1hdFN0cmluZzo6UGFyc2VEYXRlVGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNEYXRlVGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfREFURVRJTUVUWVBFIGVEYXRlVGltZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Vbml0aW1lJiBkdFZhbHVlKSB7DQorICBkdFZhbHVlLlNldCgwKTsNCisgIGlmICh3c1NyY0RhdGVUaW1lLklzRW1wdHkoKSB8fCB3c1BhdHRlcm4uSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZVBhdHRlcm4sIHdzVGltZVBhdHRlcm47DQorICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gTlVMTDsNCisgIEZYX0RBVEVUSU1FVFlQRSBlQ2F0ZWdvcnkgPQ0KKyAgICAgIEdldERhdGVUaW1lRm9ybWF0KHdzUGF0dGVybiwgcExvY2FsZSwgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybik7DQorICBpZiAoIXBMb2NhbGUpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGVDYXRlZ29yeSA9PSBGWF9EQVRFVElNRVRZUEVfVW5rbm93bikgew0KKyAgICBlQ2F0ZWdvcnkgPSBlRGF0ZVRpbWVUeXBlOw0KKyAgfQ0KKyAgaWYgKGVDYXRlZ29yeSA9PSBGWF9EQVRFVElNRVRZUEVfVW5rbm93bikgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoZUNhdGVnb3J5ID09IEZYX0RBVEVUSU1FVFlQRV9UaW1lRGF0ZSkgew0KKyAgICBpbnQzMl90IGlTdGFydCA9IDA7DQorICAgIGlmICghRlhfUGFyc2VMb2NhbGVUaW1lKHdzU3JjRGF0ZVRpbWUsIHdzVGltZVBhdHRlcm4sIHBMb2NhbGUsIGR0VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTdGFydCkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKCFGWF9QYXJzZUxvY2FsZURhdGUod3NTcmNEYXRlVGltZSwgd3NEYXRlUGF0dGVybiwgcExvY2FsZSwgZHRWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVN0YXJ0KSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgaW50MzJfdCBpU3RhcnQgPSAwOw0KKyAgICBpZiAoKGVDYXRlZ29yeSAmIEZYX0RBVEVUSU1FVFlQRV9EYXRlKSAmJg0KKyAgICAgICAgIUZYX1BhcnNlTG9jYWxlRGF0ZSh3c1NyY0RhdGVUaW1lLCB3c0RhdGVQYXR0ZXJuLCBwTG9jYWxlLCBkdFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpU3RhcnQpKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmICgoZUNhdGVnb3J5ICYgRlhfREFURVRJTUVUWVBFX1RpbWUpICYmDQorICAgICAgICAhRlhfUGFyc2VMb2NhbGVUaW1lKHdzU3JjRGF0ZVRpbWUsIHdzVGltZVBhdHRlcm4sIHBMb2NhbGUsIGR0VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTdGFydCkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9Gb3JtYXRTdHJpbmc6OlBhcnNlWmVybyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzVGV4dEZvcm1hdDsNCisgIEdldFRleHRGb3JtYXQod3NQYXR0ZXJuLCBGWF9XU1RSQyhMInplcm8iKSwgd3NUZXh0Rm9ybWF0KTsNCisgIGludDMyX3QgaVRleHQgPSAwLCBpUGF0dGVybiA9IDA7DQorICBjb25zdCBGWF9XQ0hBUiogcFN0clRleHQgPSAoY29uc3QgRlhfV0NIQVIqKXdzU3JjVGV4dDsNCisgIGludDMyX3QgaUxlblRleHQgPSB3c1NyY1RleHQuR2V0TGVuZ3RoKCk7DQorICBjb25zdCBGWF9XQ0hBUiogcFN0clBhdHRlcm4gPSAoY29uc3QgRlhfV0NIQVIqKXdzVGV4dEZvcm1hdDsNCisgIGludDMyX3QgaUxlblBhdHRlcm4gPSB3c1RleHRGb3JtYXQuR2V0TGVuZ3RoKCk7DQorICB3aGlsZSAoaVBhdHRlcm4gPCBpTGVuUGF0dGVybiAmJiBpVGV4dCA8IGlMZW5UZXh0KSB7DQorICAgIGlmIChwU3RyUGF0dGVybltpUGF0dGVybl0gPT0gJ1wnJykgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzTGl0ZXJhbCA9DQorICAgICAgICAgIEZYX0dldExpdGVyYWxUZXh0KHBTdHJQYXR0ZXJuLCBpUGF0dGVybiwgaUxlblBhdHRlcm4pOw0KKyAgICAgIGludDMyX3QgaUxpdGVyYWxMZW4gPSB3c0xpdGVyYWwuR2V0TGVuZ3RoKCk7DQorICAgICAgaWYgKGlUZXh0ICsgaUxpdGVyYWxMZW4gPiBpTGVuVGV4dCB8fA0KKyAgICAgICAgICBGWFNZU193Y3NuY21wKHBTdHJUZXh0ICsgaVRleHQsIChjb25zdCBGWF9XQ0hBUiopd3NMaXRlcmFsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlMaXRlcmFsTGVuKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBpVGV4dCArPSBpTGl0ZXJhbExlbjsNCisgICAgICBpUGF0dGVybisrOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9IGVsc2UgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSAhPSBwU3RyVGV4dFtpVGV4dF0pIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0gZWxzZSB7DQorICAgICAgaVRleHQrKzsNCisgICAgICBpUGF0dGVybisrOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gaVBhdHRlcm4gPT0gaUxlblBhdHRlcm4gJiYgaVRleHQgPT0gaUxlblRleHQ7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0Zvcm1hdFN0cmluZzo6UGFyc2VOdWxsKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Rm9ybWF0Ow0KKyAgR2V0VGV4dEZvcm1hdCh3c1BhdHRlcm4sIEZYX1dTVFJDKEwibnVsbCIpLCB3c1RleHRGb3JtYXQpOw0KKyAgaW50MzJfdCBpVGV4dCA9IDAsIGlQYXR0ZXJuID0gMDsNCisgIGNvbnN0IEZYX1dDSEFSKiBwU3RyVGV4dCA9IChjb25zdCBGWF9XQ0hBUiopd3NTcmNUZXh0Ow0KKyAgaW50MzJfdCBpTGVuVGV4dCA9IHdzU3JjVGV4dC5HZXRMZW5ndGgoKTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwU3RyUGF0dGVybiA9IChjb25zdCBGWF9XQ0hBUiopd3NUZXh0Rm9ybWF0Ow0KKyAgaW50MzJfdCBpTGVuUGF0dGVybiA9IHdzVGV4dEZvcm1hdC5HZXRMZW5ndGgoKTsNCisgIHdoaWxlIChpUGF0dGVybiA8IGlMZW5QYXR0ZXJuICYmIGlUZXh0IDwgaUxlblRleHQpIHsNCisgICAgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSA9PSAnXCcnKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMaXRlcmFsID0NCisgICAgICAgICAgRlhfR2V0TGl0ZXJhbFRleHQocFN0clBhdHRlcm4sIGlQYXR0ZXJuLCBpTGVuUGF0dGVybik7DQorICAgICAgaW50MzJfdCBpTGl0ZXJhbExlbiA9IHdzTGl0ZXJhbC5HZXRMZW5ndGgoKTsNCisgICAgICBpZiAoaVRleHQgKyBpTGl0ZXJhbExlbiA+IGlMZW5UZXh0IHx8DQorICAgICAgICAgIEZYU1lTX3djc25jbXAocFN0clRleHQgKyBpVGV4dCwgKGNvbnN0IEZYX1dDSEFSKil3c0xpdGVyYWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgaUxpdGVyYWxMZW4pKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGlUZXh0ICs9IGlMaXRlcmFsTGVuOw0KKyAgICAgIGlQYXR0ZXJuKys7DQorICAgICAgY29udGludWU7DQorICAgIH0gZWxzZSBpZiAocFN0clBhdHRlcm5baVBhdHRlcm5dICE9IHBTdHJUZXh0W2lUZXh0XSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpVGV4dCsrOw0KKyAgICAgIGlQYXR0ZXJuKys7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBpUGF0dGVybiA9PSBpTGVuUGF0dGVybiAmJiBpVGV4dCA9PSBpTGVuVGV4dDsNCit9DQorRlhfQk9PTCBDRlhfRm9ybWF0U3RyaW5nOjpGb3JtYXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkgew0KKyAgaWYgKHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaW50MzJfdCBpTGVuVGV4dCA9IHdzU3JjVGV4dC5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuVGV4dCA9PSAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzVGV4dEZvcm1hdDsNCisgIEdldFRleHRGb3JtYXQod3NQYXR0ZXJuLCBGWF9XU1RSQyhMInRleHQiKSwgd3NUZXh0Rm9ybWF0KTsNCisgIGludDMyX3QgaVRleHQgPSAwLCBpUGF0dGVybiA9IDA7DQorICBjb25zdCBGWF9XQ0hBUiogcFN0clRleHQgPSAoY29uc3QgRlhfV0NIQVIqKXdzU3JjVGV4dDsNCisgIGNvbnN0IEZYX1dDSEFSKiBwU3RyUGF0dGVybiA9IChjb25zdCBGWF9XQ0hBUiopd3NUZXh0Rm9ybWF0Ow0KKyAgaW50MzJfdCBpTGVuUGF0dGVybiA9IHdzVGV4dEZvcm1hdC5HZXRMZW5ndGgoKTsNCisgIHdoaWxlIChpUGF0dGVybiA8IGlMZW5QYXR0ZXJuKSB7DQorICAgIHN3aXRjaCAocFN0clBhdHRlcm5baVBhdHRlcm5dKSB7DQorICAgICAgY2FzZSAnXCcnOiB7DQorICAgICAgICB3c091dHB1dCArPSBGWF9HZXRMaXRlcmFsVGV4dChwU3RyUGF0dGVybiwgaVBhdHRlcm4sIGlMZW5QYXR0ZXJuKTsNCisgICAgICAgIGlQYXR0ZXJuKys7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2FzZSAnQSc6DQorICAgICAgICBpZiAoaVRleHQgPj0gaUxlblRleHQgfHwgIUZYX0lzQWxwaGEocFN0clRleHRbaVRleHRdKSkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICB3c091dHB1dCArPSBwU3RyVGV4dFtpVGV4dCsrXTsNCisgICAgICAgIGlQYXR0ZXJuKys7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdYJzoNCisgICAgICAgIGlmIChpVGV4dCA+PSBpTGVuVGV4dCkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICB3c091dHB1dCArPSBwU3RyVGV4dFtpVGV4dCsrXTsNCisgICAgICAgIGlQYXR0ZXJuKys7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdPJzoNCisgICAgICBjYXNlICcwJzoNCisgICAgICAgIGlmIChpVGV4dCA+PSBpTGVuVGV4dCB8fA0KKyAgICAgICAgICAgICghRlhfSXNEaWdpdChwU3RyVGV4dFtpVGV4dF0pICYmICFGWF9Jc0FscGhhKHBTdHJUZXh0W2lUZXh0XSkpKSB7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIHdzT3V0cHV0ICs9IHBTdHJUZXh0W2lUZXh0KytdOw0KKyAgICAgICAgaVBhdHRlcm4rKzsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJzknOg0KKyAgICAgICAgaWYgKGlUZXh0ID49IGlMZW5UZXh0IHx8ICFGWF9Jc0RpZ2l0KHBTdHJUZXh0W2lUZXh0XSkpIHsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd3NPdXRwdXQgKz0gcFN0clRleHRbaVRleHQrK107DQorICAgICAgICBpUGF0dGVybisrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIHdzT3V0cHV0ICs9IHBTdHJQYXR0ZXJuW2lQYXR0ZXJuKytdOw0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBpVGV4dCA9PSBpTGVuVGV4dDsNCit9DQorc3RhdGljIGludDMyX3QgRlhfR2V0TnVtVHJhaWxpbmdMaW1pdChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaURvdFBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJUcmltVGFpbFplcm9zKSB7DQorICBpZiAoaURvdFBvcyA8IDApIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpbnQzMl90IGlDb3VudCA9IHdzRm9ybWF0LkdldExlbmd0aCgpOw0KKyAgaW50MzJfdCBpVHJlYWRpbmcgPSAwOw0KKyAgZm9yIChpRG90UG9zKys7IGlEb3RQb3MgPCBpQ291bnQ7IGlEb3RQb3MrKykgew0KKyAgICBGWF9XQ0hBUiB3YyA9IHdzRm9ybWF0W2lEb3RQb3NdOw0KKyAgICBpZiAod2MgPT0gTCd6JyB8fCB3YyA9PSBMJzknIHx8IHdjID09ICdaJykgew0KKyAgICAgIGlUcmVhZGluZysrOw0KKyAgICAgIGJUcmltVGFpbFplcm9zID0gKHdjID09IEwnOScgPyBGQUxTRSA6IFRSVUUpOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gaVRyZWFkaW5nOw0KK30NCitGWF9CT09MIENGWF9Gb3JtYXRTdHJpbmc6OkZvcm1hdFN0ck51bShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzSW5wdXROdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpIHsNCisgIGlmICh3c0lucHV0TnVtLklzRW1wdHkoKSB8fCB3c1BhdHRlcm4uSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGludDMyX3QgZG90X2luZGV4X2YgPSAtMTsNCisgIEZYX0RXT1JEIGR3TnVtU3R5bGUgPSAwOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NOdW1Gb3JtYXQ7DQorICBJRlhfTG9jYWxlKiBwTG9jYWxlID0NCisgICAgICBHZXROdW1lcmljRm9ybWF0KHdzUGF0dGVybiwgZG90X2luZGV4X2YsIGR3TnVtU3R5bGUsIHdzTnVtRm9ybWF0KTsNCisgIGlmICghcExvY2FsZSB8fCB3c051bUZvcm1hdC5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaW50MzJfdCBjYyA9IDAsIGNjZiA9IDA7DQorICBjb25zdCBGWF9XQ0hBUiogc3RyZiA9IChjb25zdCBGWF9XQ0hBUiopd3NOdW1Gb3JtYXQ7DQorICBpbnQgbGVuZiA9IHdzTnVtRm9ybWF0LkdldExlbmd0aCgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NTcmNOdW0gPSB3c0lucHV0TnVtOw0KKyAgd3NTcmNOdW0uVHJpbUxlZnQoJzAnKTsNCisgIGlmICh3c1NyY051bS5Jc0VtcHR5KCkgfHwgd3NTcmNOdW1bMF0gPT0gJy4nKSB7DQorICAgIHdzU3JjTnVtLkluc2VydCgwLCAnMCcpOw0KKyAgfQ0KKyAgQ0ZYX0RlY2ltYWwgZGVjaW1hbCA9IENGWF9EZWNpbWFsKHdzU3JjTnVtKTsNCisgIGlmIChkd051bVN0eWxlICYgRlhfTlVNU1RZTEVfUGVyY2VudCkgew0KKyAgICBkZWNpbWFsID0gZGVjaW1hbCAqIENGWF9EZWNpbWFsKDEwMCk7DQorICAgIHdzU3JjTnVtID0gZGVjaW1hbDsNCisgIH0NCisgIGludDMyX3QgZXhwb25lbnQgPSAwOw0KKyAgaWYgKGR3TnVtU3R5bGUgJiBGWF9OVU1TVFlMRV9FeHBvbmVudCkgew0KKyAgICBpbnQgZml4ZWRfY291bnQgPSAwOw0KKyAgICB3aGlsZSAoY2NmIDwgZG90X2luZGV4X2YpIHsNCisgICAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgew0KKyAgICAgICAgY2FzZSAnXCcnOg0KKyAgICAgICAgICBGWF9HZXRMaXRlcmFsVGV4dChzdHJmLCBjY2YsIGRvdF9pbmRleF9mKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICc5JzoNCisgICAgICAgIGNhc2UgJ3onOg0KKyAgICAgICAgY2FzZSAnWic6DQorICAgICAgICAgIGZpeGVkX2NvdW50Kys7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjY2YrKzsNCisgICAgfQ0KKyAgICBpbnQgdGhyZXNob2xkID0gMTsNCisgICAgd2hpbGUgKGZpeGVkX2NvdW50ID4gMSkgew0KKyAgICAgIHRocmVzaG9sZCAqPSAxMDsNCisgICAgICBmaXhlZF9jb3VudC0tOw0KKyAgICB9DQorICAgIGlmIChkZWNpbWFsICE9IENGWF9EZWNpbWFsKDApKSB7DQorICAgICAgaWYgKGRlY2ltYWwgPCBDRlhfRGVjaW1hbCh0aHJlc2hvbGQpKSB7DQorICAgICAgICBkZWNpbWFsID0gZGVjaW1hbCAqIENGWF9EZWNpbWFsKDEwKTsNCisgICAgICAgIGV4cG9uZW50ID0gLTE7DQorICAgICAgICB3aGlsZSAoZGVjaW1hbCA8IENGWF9EZWNpbWFsKHRocmVzaG9sZCkpIHsNCisgICAgICAgICAgZGVjaW1hbCA9IGRlY2ltYWwgKiBDRlhfRGVjaW1hbCgxMCk7DQorICAgICAgICAgIGV4cG9uZW50IC09IDE7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIGlmIChkZWNpbWFsID4gQ0ZYX0RlY2ltYWwodGhyZXNob2xkKSkgew0KKyAgICAgICAgdGhyZXNob2xkICo9IDEwOw0KKyAgICAgICAgd2hpbGUgKGRlY2ltYWwgPiBDRlhfRGVjaW1hbCh0aHJlc2hvbGQpKSB7DQorICAgICAgICAgIGRlY2ltYWwgPSBkZWNpbWFsIC8gQ0ZYX0RlY2ltYWwoMTApOw0KKyAgICAgICAgICBleHBvbmVudCArPSAxOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgRlhfQk9PTCBiVHJpbVRhaWxaZXJvcyA9IEZBTFNFOw0KKyAgaW50MzJfdCBpVHJlYWRpbmcgPQ0KKyAgICAgIEZYX0dldE51bVRyYWlsaW5nTGltaXQod3NOdW1Gb3JtYXQsIGRvdF9pbmRleF9mLCBiVHJpbVRhaWxaZXJvcyk7DQorICBpbnQzMl90IHNjYWxlID0gZGVjaW1hbC5HZXRTY2FsZSgpOw0KKyAgaWYgKGlUcmVhZGluZyA8IHNjYWxlKSB7DQorICAgIGRlY2ltYWwuU2V0U2NhbGUoaVRyZWFkaW5nKTsNCisgICAgd3NTcmNOdW0gPSBkZWNpbWFsOw0KKyAgfQ0KKyAgaWYgKGJUcmltVGFpbFplcm9zICYmIHNjYWxlID4gMCAmJiBpVHJlYWRpbmcgPiAwKSB7DQorICAgIHdzU3JjTnVtLlRyaW1SaWdodChMIjAiKTsNCisgICAgd3NTcmNOdW0uVHJpbVJpZ2h0KEwiLiIpOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NHcm91cFN5bWJvbDsNCisgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9Hcm91cGluZywgd3NHcm91cFN5bWJvbCk7DQorICBGWF9CT09MIGJOZWcgPSBGQUxTRTsNCisgIGlmICh3c1NyY051bVswXSA9PSAnLScpIHsNCisgICAgYk5lZyA9IFRSVUU7DQorICAgIHdzU3JjTnVtLkRlbGV0ZSgwLCAxKTsNCisgIH0NCisgIEZYX0JPT0wgYkFkZE5lZyA9IEZBTFNFOw0KKyAgY29uc3QgRlhfV0NIQVIqIHN0ciA9IChjb25zdCBGWF9XQ0hBUiopd3NTcmNOdW07DQorICBpbnQgbGVuID0gd3NTcmNOdW0uR2V0TGVuZ3RoKCk7DQorICBpbnQgZG90X2luZGV4ID0gd3NTcmNOdW0uRmluZCgnLicpOw0KKyAgaWYgKGRvdF9pbmRleCA9PSAtMSkgew0KKyAgICBkb3RfaW5kZXggPSBsZW47DQorICB9DQorICBjY2YgPSBkb3RfaW5kZXhfZiAtIDE7DQorICBjYyA9IGRvdF9pbmRleCAtIDE7DQorICB3aGlsZSAoY2NmID49IDApIHsNCisgICAgc3dpdGNoIChzdHJmW2NjZl0pIHsNCisgICAgICBjYXNlICc5JzoNCisgICAgICAgIGlmIChjYyA+PSAwKSB7DQorICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICB3c091dHB1dCA9IENGWF9XaWRlU3RyaW5nQyhzdHJbY2NdKSArIHdzT3V0cHV0Ow0KKyAgICAgICAgICBjYy0tOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgd3NPdXRwdXQgPSBDRlhfV2lkZVN0cmluZ0MoTCcwJykgKyB3c091dHB1dDsNCisgICAgICAgIH0NCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAneic6DQorICAgICAgICBpZiAoY2MgPj0gMCkgew0KKyAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKHN0clswXSAhPSAnMCcpIHsNCisgICAgICAgICAgICB3c091dHB1dCA9IENGWF9XaWRlU3RyaW5nQyhzdHJbY2NdKSArIHdzT3V0cHV0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjLS07DQorICAgICAgICB9DQorICAgICAgICBjY2YtLTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ1onOg0KKyAgICAgICAgaWYgKGNjID49IDApIHsNCisgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChzdHJbMF0gPT0gJzAnKSB7DQorICAgICAgICAgICAgd3NPdXRwdXQgPSBDRlhfV2lkZVN0cmluZ0MoTCcgJykgKyB3c091dHB1dDsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICB3c091dHB1dCA9IENGWF9XaWRlU3RyaW5nQyhzdHJbY2NdKSArIHdzT3V0cHV0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjLS07DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICB3c091dHB1dCA9IENGWF9XaWRlU3RyaW5nQyhMJyAnKSArIHdzT3V0cHV0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdTJzoNCisgICAgICAgIGlmIChiTmVnKSB7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWludXNTeW1ib2w7DQorICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cywgd3NNaW51c1N5bWJvbCk7DQorICAgICAgICAgIHdzT3V0cHV0ID0gd3NNaW51c1N5bWJvbCArIHdzT3V0cHV0Ow0KKyAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHdzT3V0cHV0ID0gQ0ZYX1dpZGVTdHJpbmdDKEwnICcpICsgd3NPdXRwdXQ7DQorICAgICAgICB9DQorICAgICAgICBjY2YtLTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ3MnOg0KKyAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51c1N5bWJvbDsNCisgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzLCB3c01pbnVzU3ltYm9sKTsNCisgICAgICAgICAgd3NPdXRwdXQgPSB3c01pbnVzU3ltYm9sICsgd3NPdXRwdXQ7DQorICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdFJzogew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHA7DQorICAgICAgICB3c0V4cC5Gb3JtYXQoTCJFJStkIiwgZXhwb25lbnQpOw0KKyAgICAgICAgd3NPdXRwdXQgPSB3c0V4cCArIHdzT3V0cHV0Ow0KKyAgICAgIH0NCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnJCc6IHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOw0KKyAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sLCB3c1N5bWJvbCk7DQorICAgICAgICB3c091dHB1dCA9IHdzU3ltYm9sICsgd3NPdXRwdXQ7DQorICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdyJzoNCisgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnYycpIHsNCisgICAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgICB3c091dHB1dCA9IEwiQ1IiICsgd3NPdXRwdXQ7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmIC09IDI7DQorICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnUic6DQorICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ0MnKSB7DQorICAgICAgICAgIGlmIChiTmVnKSB7DQorICAgICAgICAgICAgd3NPdXRwdXQgPSBMIkNSIiArIHdzT3V0cHV0Ow0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHdzT3V0cHV0ID0gTCIgICIgKyB3c091dHB1dDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YgLT0gMjsNCisgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdiJzoNCisgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnZCcpIHsNCisgICAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgICB3c091dHB1dCA9IEwiZGIiICsgd3NPdXRwdXQ7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmIC09IDI7DQorICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnQic6DQorICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ0QnKSB7DQorICAgICAgICAgIGlmIChiTmVnKSB7DQorICAgICAgICAgICAgd3NPdXRwdXQgPSBMIkRCIiArIHdzT3V0cHV0Ow0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHdzT3V0cHV0ID0gTCIgICIgKyB3c091dHB1dDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YgLT0gMjsNCisgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICclJzogew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQorICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfUGVyY2VudCwgd3NTeW1ib2wpOw0KKyAgICAgICAgd3NPdXRwdXQgPSB3c1N5bWJvbCArIHdzT3V0cHV0Ow0KKyAgICAgIH0NCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnLCc6DQorICAgICAgICBpZiAoY2MgPj0gMCkgew0KKyAgICAgICAgICB3c091dHB1dCA9IHdzR3JvdXBTeW1ib2wgKyB3c091dHB1dDsNCisgICAgICAgIH0NCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnKCc6DQorICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICB3c091dHB1dCA9IEwiKCIgKyB3c091dHB1dDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHdzT3V0cHV0ID0gTCIgIiArIHdzT3V0cHV0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQorICAgICAgICBjY2YtLTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJyknOg0KKyAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgd3NPdXRwdXQgPSBMIikiICsgd3NPdXRwdXQ7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICB3c091dHB1dCA9IEwiICIgKyB3c091dHB1dDsNCisgICAgICAgIH0NCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnXCcnOg0KKyAgICAgICAgd3NPdXRwdXQgPSBGWF9HZXRMaXRlcmFsVGV4dFJldmVyc2Uoc3RyZiwgY2NmKSArIHdzT3V0cHV0Ow0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgd3NPdXRwdXQgPSBDRlhfV2lkZVN0cmluZ0Moc3RyZltjY2ZdKSArIHdzT3V0cHV0Ow0KKyAgICAgICAgY2NmLS07DQorICAgIH0NCisgIH0NCisgIGlmIChjYyA+PSAwKSB7DQorICAgIGludCBuUG9zID0gZG90X2luZGV4ICUgMzsNCisgICAgd3NPdXRwdXQuRW1wdHkoKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZG90X2luZGV4OyBpKyspIHsNCisgICAgICBpZiAoaSAlIDMgPT0gblBvcyAmJiBpICE9IDApIHsNCisgICAgICAgIHdzT3V0cHV0ICs9IHdzR3JvdXBTeW1ib2w7DQorICAgICAgfQ0KKyAgICAgIHdzT3V0cHV0ICs9IHdzU3JjTnVtW2ldOw0KKyAgICB9DQorICAgIGlmIChkb3RfaW5kZXggPCBsZW4pIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCisgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfRGVjaW1hbCwgd3NTeW1ib2wpOw0KKyAgICAgIHdzT3V0cHV0ICs9IHdzU3ltYm9sOw0KKyAgICAgIHdzT3V0cHV0ICs9IHdzU3JjTnVtLlJpZ2h0KGxlbiAtIGRvdF9pbmRleCAtIDEpOw0KKyAgICB9DQorICAgIGlmIChiTmVnKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51c3ltYm9sOw0KKyAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cywgd3NNaW51c3ltYm9sKTsNCisgICAgICB3c091dHB1dCA9IHdzTWludXN5bWJvbCArIHdzT3V0cHV0Ow0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChkb3RfaW5kZXhfZiA9PSB3c051bUZvcm1hdC5HZXRMZW5ndGgoKSkgew0KKyAgICBpZiAoIWJBZGROZWcgJiYgYk5lZykgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWludXN5bWJvbDsNCisgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMsIHdzTWludXN5bWJvbCk7DQorICAgICAgd3NPdXRwdXQgPSB3c01pbnVzeW1ib2wgKyB3c091dHB1dDsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzRG90U3ltYm9sOw0KKyAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0RlY2ltYWwsIHdzRG90U3ltYm9sKTsNCisgIGlmIChzdHJmW2RvdF9pbmRleF9mXSA9PSAnVicpIHsNCisgICAgd3NPdXRwdXQgKz0gd3NEb3RTeW1ib2w7DQorICB9IGVsc2UgaWYgKHN0cmZbZG90X2luZGV4X2ZdID09ICcuJykgew0KKyAgICBpZiAoZG90X2luZGV4IDwgbGVuKSB7DQorICAgICAgd3NPdXRwdXQgKz0gd3NEb3RTeW1ib2w7DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKHN0cmZbZG90X2luZGV4X2YgKyAxXSA9PSAnOScgfHwgc3RyZltkb3RfaW5kZXhfZiArIDFdID09ICdaJykgew0KKyAgICAgICAgd3NPdXRwdXQgKz0gd3NEb3RTeW1ib2w7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBjY2YgPSBkb3RfaW5kZXhfZiArIDE7DQorICBjYyA9IGRvdF9pbmRleCArIDE7DQorICB3aGlsZSAoY2NmIDwgbGVuZikgew0KKyAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgew0KKyAgICAgIGNhc2UgJ1wnJzoNCisgICAgICAgIHdzT3V0cHV0ICs9IEZYX0dldExpdGVyYWxUZXh0KHN0cmYsIGNjZiwgbGVuZik7DQorICAgICAgICBjY2YrKzsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJzknOg0KKyAgICAgICAgaWYgKGNjIDwgbGVuKSB7DQorICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICB3c091dHB1dCArPSBzdHJbY2NdOw0KKyAgICAgICAgICBjYysrOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgd3NPdXRwdXQgKz0gTCcwJzsNCisgICAgICAgIH0NCisgICAgICAgIGNjZisrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAneic6DQorICAgICAgICBpZiAoY2MgPCBsZW4pIHsNCisgICAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHdzT3V0cHV0ICs9IHN0cltjY107DQorICAgICAgICAgIGNjKys7DQorICAgICAgICB9DQorICAgICAgICBjY2YrKzsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ1onOg0KKyAgICAgICAgaWYgKGNjIDwgbGVuKSB7DQorICAgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICB3c091dHB1dCArPSBzdHJbY2NdOw0KKyAgICAgICAgICBjYysrOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgd3NPdXRwdXQgKz0gTCcwJzsNCisgICAgICAgIH0NCisgICAgICAgIGNjZisrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnRSc6IHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRXhwOw0KKyAgICAgICAgd3NFeHAuRm9ybWF0KEwiRSUrZCIsIGV4cG9uZW50KTsNCisgICAgICAgIHdzT3V0cHV0ICs9IHdzRXhwOw0KKyAgICAgIH0NCisgICAgICAgIGNjZisrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnJCc6IHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOw0KKyAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sLCB3c1N5bWJvbCk7DQorICAgICAgICB3c091dHB1dCArPSB3c1N5bWJvbDsNCisgICAgICB9DQorICAgICAgICBjY2YrKzsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ2MnOg0KKyAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ3InKSB7DQorICAgICAgICAgIGlmIChiTmVnKSB7DQorICAgICAgICAgICAgd3NPdXRwdXQgKz0gTCJDUiI7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmICs9IDI7DQorICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnQyc6DQorICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAnUicpIHsNCisgICAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgICB3c091dHB1dCArPSBMIkNSIjsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICB3c091dHB1dCArPSBMIiAgIjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YgKz0gMjsNCisgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdkJzoNCisgICAgICAgIGlmIChjY2YgKyAxIDwgbGVuZiAmJiBzdHJmW2NjZiArIDFdID09ICdiJykgew0KKyAgICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICAgIHdzT3V0cHV0ICs9IEwiZGIiOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjZiArPSAyOw0KKyAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ0QnOg0KKyAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ0InKSB7DQorICAgICAgICAgIGlmIChiTmVnKSB7DQorICAgICAgICAgICAgd3NPdXRwdXQgKz0gTCJEQiI7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgd3NPdXRwdXQgKz0gTCIgICI7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmICs9IDI7DQorICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnJSc6IHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOw0KKyAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX1BlcmNlbnQsIHdzU3ltYm9sKTsNCisgICAgICAgIHdzT3V0cHV0ICs9IHdzU3ltYm9sOw0KKyAgICAgIH0NCisgICAgICAgIGNjZisrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnOCc6IHsNCisgICAgICAgIHdoaWxlIChjY2YgPCBsZW5mICYmIHN0cmZbY2NmXSA9PSAnOCcpIHsNCisgICAgICAgICAgY2NmKys7DQorICAgICAgICB9DQorICAgICAgICB3aGlsZSAoY2MgPCBsZW4gJiYgRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICB3c091dHB1dCArPSBzdHJbY2NdOw0KKyAgICAgICAgICBjYysrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSAnLCc6DQorICAgICAgICB3c091dHB1dCArPSB3c0dyb3VwU3ltYm9sOw0KKyAgICAgICAgY2NmKys7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICcoJzoNCisgICAgICAgIGlmIChiTmVnKSB7DQorICAgICAgICAgIHdzT3V0cHV0ICs9ICcoJzsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHdzT3V0cHV0ICs9ICcgJzsNCisgICAgICAgIH0NCisgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KKyAgICAgICAgY2NmKys7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICcpJzoNCisgICAgICAgIGlmIChiTmVnKSB7DQorICAgICAgICAgIHdzT3V0cHV0ICs9ICcpJzsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHdzT3V0cHV0ICs9ICcgJzsNCisgICAgICAgIH0NCisgICAgICAgIGNjZisrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGNjZisrOw0KKyAgICB9DQorICB9DQorICBpZiAoIWJBZGROZWcgJiYgYk5lZykgew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c01pbnVzeW1ib2w7DQorICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cywgd3NNaW51c3ltYm9sKTsNCisgICAgd3NPdXRwdXQgPQ0KKyAgICAgICAgd3NNaW51c3ltYm9sICsgd3NPdXRwdXRbMF0gKyB3c091dHB1dC5NaWQoMSwgd3NPdXRwdXQuR2V0TGVuZ3RoKCkgLSAxKTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWF9Gb3JtYXRTdHJpbmc6OkZvcm1hdExDTnVtZXJpYyhDRlhfTENOdW1lcmljJiBsY051bSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkgew0KKyAgaW50MzJfdCBkb3RfaW5kZXhfZiA9IC0xOw0KKyAgRlhfRFdPUkQgZHdOdW1TdHlsZSA9IDA7DQorICBDRlhfV2lkZVN0cmluZyB3c051bUZvcm1hdDsNCisgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPQ0KKyAgICAgIEdldE51bWVyaWNGb3JtYXQod3NQYXR0ZXJuLCBkb3RfaW5kZXhfZiwgZHdOdW1TdHlsZSwgd3NOdW1Gb3JtYXQpOw0KKyAgaWYgKCFwTG9jYWxlIHx8IHdzTnVtRm9ybWF0LklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpbnQzMl90IGNjID0gMCwgY2NmID0gMDsNCisgIGNvbnN0IEZYX1dDSEFSKiBzdHJmID0gKGNvbnN0IEZYX1dDSEFSKil3c051bUZvcm1hdDsNCisgIGludCBsZW5mID0gd3NOdW1Gb3JtYXQuR2V0TGVuZ3RoKCk7DQorICBkb3VibGUgZGJPcmdSYXcgPSBsY051bS5HZXREb3VibGUoKTsNCisgIGRvdWJsZSBkYlJldFZhbHVlID0gZGJPcmdSYXc7DQorICBpZiAoZHdOdW1TdHlsZSAmIEZYX05VTVNUWUxFX1BlcmNlbnQpIHsNCisgICAgZGJSZXRWYWx1ZSAqPSAxMDA7DQorICB9DQorICBpbnQzMl90IGV4cG9uZW50ID0gMDsNCisgIGlmIChkd051bVN0eWxlICYgRlhfTlVNU1RZTEVfRXhwb25lbnQpIHsNCisgICAgaW50IGZpeGVkX2NvdW50ID0gMDsNCisgICAgd2hpbGUgKGNjZiA8IGRvdF9pbmRleF9mKSB7DQorICAgICAgc3dpdGNoIChzdHJmW2NjZl0pIHsNCisgICAgICAgIGNhc2UgJ1wnJzoNCisgICAgICAgICAgRlhfR2V0TGl0ZXJhbFRleHQoc3RyZiwgY2NmLCBkb3RfaW5kZXhfZik7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAnOSc6DQorICAgICAgICBjYXNlICd6JzoNCisgICAgICAgIGNhc2UgJ1onOg0KKyAgICAgICAgICBmaXhlZF9jb3VudCsrOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2NmKys7DQorICAgIH0NCisgICAgaW50IHRocmVzaG9sZCA9IDE7DQorICAgIHdoaWxlIChmaXhlZF9jb3VudCA+IDEpIHsNCisgICAgICB0aHJlc2hvbGQgKj0gMTA7DQorICAgICAgZml4ZWRfY291bnQtLTsNCisgICAgfQ0KKyAgICBpZiAoZGJSZXRWYWx1ZSAhPSAwKSB7DQorICAgICAgaWYgKGRiUmV0VmFsdWUgPCB0aHJlc2hvbGQpIHsNCisgICAgICAgIGRiUmV0VmFsdWUgKj0gMTA7DQorICAgICAgICBleHBvbmVudCA9IC0xOw0KKyAgICAgICAgd2hpbGUgKGRiUmV0VmFsdWUgPCB0aHJlc2hvbGQpIHsNCisgICAgICAgICAgZGJSZXRWYWx1ZSAqPSAxMDsNCisgICAgICAgICAgZXhwb25lbnQgLT0gMTsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2UgaWYgKGRiUmV0VmFsdWUgPiB0aHJlc2hvbGQpIHsNCisgICAgICAgIHRocmVzaG9sZCAqPSAxMDsNCisgICAgICAgIHdoaWxlIChkYlJldFZhbHVlID4gdGhyZXNob2xkKSB7DQorICAgICAgICAgIGRiUmV0VmFsdWUgLz0gMTA7DQorICAgICAgICAgIGV4cG9uZW50ICs9IDE7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAoZHdOdW1TdHlsZSAmIChGWF9OVU1TVFlMRV9QZXJjZW50IHwgRlhfTlVNU1RZTEVfRXhwb25lbnQpKSB7DQorICAgIGxjTnVtID0gQ0ZYX0xDTnVtZXJpYyhkYlJldFZhbHVlKTsNCisgIH0NCisgIEZYX0JPT0wgYlRyaW1UYWlsWmVyb3MgPSBGQUxTRTsNCisgIGludDMyX3QgaVRyZWFkaW5nID0NCisgICAgICBGWF9HZXROdW1UcmFpbGluZ0xpbWl0KHdzTnVtRm9ybWF0LCBkb3RfaW5kZXhfZiwgYlRyaW1UYWlsWmVyb3MpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NOdW1lcmljID0gbGNOdW0uVG9TdHJpbmcoaVRyZWFkaW5nLCBiVHJpbVRhaWxaZXJvcyk7DQorICBpZiAod3NOdW1lcmljLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0dyb3VwU3ltYm9sOw0KKyAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0dyb3VwaW5nLCB3c0dyb3VwU3ltYm9sKTsNCisgIEZYX0JPT0wgYk5lZyA9IEZBTFNFOw0KKyAgaWYgKHdzTnVtZXJpY1swXSA9PSAnLScpIHsNCisgICAgYk5lZyA9IFRSVUU7DQorICAgIHdzTnVtZXJpYy5EZWxldGUoMCwgMSk7DQorICB9DQorICBGWF9CT09MIGJBZGROZWcgPSBGQUxTRTsNCisgIGNvbnN0IEZYX1dDSEFSKiBzdHIgPSAoY29uc3QgRlhfV0NIQVIqKXdzTnVtZXJpYzsNCisgIGludCBsZW4gPSB3c051bWVyaWMuR2V0TGVuZ3RoKCk7DQorICBpbnQgZG90X2luZGV4ID0gd3NOdW1lcmljLkZpbmQoJy4nKTsNCisgIGlmIChkb3RfaW5kZXggPT0gLTEpIHsNCisgICAgZG90X2luZGV4ID0gbGVuOw0KKyAgfQ0KKyAgY2NmID0gZG90X2luZGV4X2YgLSAxOw0KKyAgY2MgPSBkb3RfaW5kZXggLSAxOw0KKyAgd2hpbGUgKGNjZiA+PSAwKSB7DQorICAgIHN3aXRjaCAoc3RyZltjY2ZdKSB7DQorICAgICAgY2FzZSAnOSc6DQorICAgICAgICBpZiAoY2MgPj0gMCkgew0KKyAgICAgICAgICB3c091dHB1dCA9IENGWF9XaWRlU3RyaW5nQyhzdHJbY2NdKSArIHdzT3V0cHV0Ow0KKyAgICAgICAgICBjYy0tOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgd3NPdXRwdXQgPSBDRlhfV2lkZVN0cmluZ0MoTCcwJykgKyB3c091dHB1dDsNCisgICAgICAgIH0NCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAneic6DQorICAgICAgICBpZiAoY2MgPj0gMCkgew0KKyAgICAgICAgICBpZiAobGNOdW0ubV9JbnRlZ3JhbCAhPSAwKSB7DQorICAgICAgICAgICAgd3NPdXRwdXQgPSBDRlhfV2lkZVN0cmluZ0Moc3RyW2NjXSkgKyB3c091dHB1dDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjYy0tOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdaJzoNCisgICAgICAgIGlmIChjYyA+PSAwKSB7DQorICAgICAgICAgIGlmIChsY051bS5tX0ludGVncmFsID09IDApIHsNCisgICAgICAgICAgICB3c091dHB1dCA9IENGWF9XaWRlU3RyaW5nQyhMJyAnKSArIHdzT3V0cHV0Ow0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHdzT3V0cHV0ID0gQ0ZYX1dpZGVTdHJpbmdDKHN0cltjY10pICsgd3NPdXRwdXQ7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2MtLTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHdzT3V0cHV0ID0gQ0ZYX1dpZGVTdHJpbmdDKEwnICcpICsgd3NPdXRwdXQ7DQorICAgICAgICB9DQorICAgICAgICBjY2YtLTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ1MnOg0KKyAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51c1N5bWJvbDsNCisgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzLCB3c01pbnVzU3ltYm9sKTsNCisgICAgICAgICAgd3NPdXRwdXQgPSB3c01pbnVzU3ltYm9sICsgd3NPdXRwdXQ7DQorICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgd3NPdXRwdXQgPSBDRlhfV2lkZVN0cmluZ0MoTCcgJykgKyB3c091dHB1dDsNCisgICAgICAgIH0NCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAncyc6DQorICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c01pbnVzU3ltYm9sOw0KKyAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMsIHdzTWludXNTeW1ib2wpOw0KKyAgICAgICAgICB3c091dHB1dCA9IHdzTWludXNTeW1ib2wgKyB3c091dHB1dDsNCisgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBjY2YtLTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ0UnOiB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0V4cDsNCisgICAgICAgIHdzRXhwLkZvcm1hdChMIkUlK2QiLCBleHBvbmVudCk7DQorICAgICAgICB3c091dHB1dCA9IHdzRXhwICsgd3NPdXRwdXQ7DQorICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICckJzogew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7DQorICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfQ3VycmVuY3lTeW1ib2wsIHdzU3ltYm9sKTsNCisgICAgICAgIHdzT3V0cHV0ID0gd3NTeW1ib2wgKyB3c091dHB1dDsNCisgICAgICB9DQorICAgICAgICBjY2YtLTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ3InOg0KKyAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdjJykgew0KKyAgICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICAgIHdzT3V0cHV0ID0gTCJDUiIgKyB3c091dHB1dDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YgLT0gMjsNCisgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdSJzoNCisgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnQycpIHsNCisgICAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgICB3c091dHB1dCA9IEwiQ1IiICsgd3NPdXRwdXQ7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgd3NPdXRwdXQgPSBMIiAgIiArIHdzT3V0cHV0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjZiAtPSAyOw0KKyAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ2InOg0KKyAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdkJykgew0KKyAgICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICAgIHdzT3V0cHV0ID0gTCJkYiIgKyB3c091dHB1dDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YgLT0gMjsNCisgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdCJzoNCisgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnRCcpIHsNCisgICAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgICB3c091dHB1dCA9IEwiREIiICsgd3NPdXRwdXQ7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgd3NPdXRwdXQgPSBMIiAgIiArIHdzT3V0cHV0Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjZiAtPSAyOw0KKyAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJyUnOiB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCisgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50LCB3c1N5bWJvbCk7DQorICAgICAgICB3c091dHB1dCA9IHdzU3ltYm9sICsgd3NPdXRwdXQ7DQorICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICcsJzoNCisgICAgICAgIGlmIChjYyA+PSAwKSB7DQorICAgICAgICAgIHdzT3V0cHV0ID0gd3NHcm91cFN5bWJvbCArIHdzT3V0cHV0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICcoJzoNCisgICAgICAgIGlmIChiTmVnKSB7DQorICAgICAgICAgIHdzT3V0cHV0ID0gTCIoIiArIHdzT3V0cHV0Ow0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgd3NPdXRwdXQgPSBMIiAiICsgd3NPdXRwdXQ7DQorICAgICAgICB9DQorICAgICAgICBiQWRkTmVnID0gVFJVRTsNCisgICAgICAgIGNjZi0tOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnKSc6DQorICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICB3c091dHB1dCA9IEwiKSIgKyB3c091dHB1dDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHdzT3V0cHV0ID0gTCIgIiArIHdzT3V0cHV0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgY2NmLS07DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdcJyc6DQorICAgICAgICB3c091dHB1dCA9IEZYX0dldExpdGVyYWxUZXh0UmV2ZXJzZShzdHJmLCBjY2YpICsgd3NPdXRwdXQ7DQorICAgICAgICBjY2YtLTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICB3c091dHB1dCA9IENGWF9XaWRlU3RyaW5nQyhzdHJmW2NjZl0pICsgd3NPdXRwdXQ7DQorICAgICAgICBjY2YtLTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGNjID49IDApIHsNCisgICAgaW50IG5Qb3MgPSBkb3RfaW5kZXggJSAzOw0KKyAgICB3c091dHB1dC5FbXB0eSgpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBkb3RfaW5kZXg7IGkrKykgew0KKyAgICAgIGlmIChpICUgMyA9PSBuUG9zICYmIGkgIT0gMCkgew0KKyAgICAgICAgd3NPdXRwdXQgKz0gd3NHcm91cFN5bWJvbDsNCisgICAgICB9DQorICAgICAgd3NPdXRwdXQgKz0gd3NOdW1lcmljW2ldOw0KKyAgICB9DQorICAgIGlmIChkb3RfaW5kZXggPCBsZW4pIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCisgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfRGVjaW1hbCwgd3NTeW1ib2wpOw0KKyAgICAgIHdzT3V0cHV0ICs9IHdzU3ltYm9sOw0KKyAgICAgIHdzT3V0cHV0ICs9IHdzTnVtZXJpYy5SaWdodChsZW4gLSBkb3RfaW5kZXggLSAxKTsNCisgICAgfQ0KKyAgICBpZiAoYk5lZykgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWludXN5bWJvbDsNCisgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMsIHdzTWludXN5bWJvbCk7DQorICAgICAgd3NPdXRwdXQgPSB3c01pbnVzeW1ib2wgKyB3c091dHB1dDsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoZG90X2luZGV4X2YgPT0gd3NOdW1Gb3JtYXQuR2V0TGVuZ3RoKCkpIHsNCisgICAgaWYgKCFiQWRkTmVnICYmIGJOZWcpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c01pbnVzeW1ib2w7DQorICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzLCB3c01pbnVzeW1ib2wpOw0KKyAgICAgIHdzT3V0cHV0ID0gd3NNaW51c3ltYm9sICsgd3NPdXRwdXQ7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0RvdFN5bWJvbDsNCisgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9EZWNpbWFsLCB3c0RvdFN5bWJvbCk7DQorICBpZiAoc3RyZltkb3RfaW5kZXhfZl0gPT0gJ1YnKSB7DQorICAgIHdzT3V0cHV0ICs9IHdzRG90U3ltYm9sOw0KKyAgfSBlbHNlIGlmIChzdHJmW2RvdF9pbmRleF9mXSA9PSAnLicpIHsNCisgICAgaWYgKGRvdF9pbmRleCA8IGxlbikgew0KKyAgICAgIHdzT3V0cHV0ICs9IHdzRG90U3ltYm9sOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChzdHJmW2RvdF9pbmRleF9mICsgMV0gPT0gJzknIHx8IHN0cmZbZG90X2luZGV4X2YgKyAxXSA9PSAnWicpIHsNCisgICAgICAgIHdzT3V0cHV0ICs9IHdzRG90U3ltYm9sOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgY2NmID0gZG90X2luZGV4X2YgKyAxOw0KKyAgY2MgPSBkb3RfaW5kZXggKyAxOw0KKyAgd2hpbGUgKGNjZiA8IGxlbmYpIHsNCisgICAgc3dpdGNoIChzdHJmW2NjZl0pIHsNCisgICAgICBjYXNlICdcJyc6DQorICAgICAgICB3c091dHB1dCArPSBGWF9HZXRMaXRlcmFsVGV4dChzdHJmLCBjY2YsIGxlbmYpOw0KKyAgICAgICAgY2NmKys7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICc5JzoNCisgICAgICAgIGlmIChjYyA8IGxlbikgew0KKyAgICAgICAgICB3c091dHB1dCArPSBzdHJbY2NdOw0KKyAgICAgICAgICBjYysrOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgd3NPdXRwdXQgKz0gTCcwJzsNCisgICAgICAgIH0NCisgICAgICAgIGNjZisrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAneic6DQorICAgICAgICBpZiAoY2MgPCBsZW4pIHsNCisgICAgICAgICAgd3NPdXRwdXQgKz0gc3RyW2NjXTsNCisgICAgICAgICAgY2MrKzsNCisgICAgICAgIH0NCisgICAgICAgIGNjZisrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnWic6DQorICAgICAgICBpZiAoY2MgPCBsZW4pIHsNCisgICAgICAgICAgd3NPdXRwdXQgKz0gc3RyW2NjXTsNCisgICAgICAgICAgY2MrKzsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHdzT3V0cHV0ICs9IEwnMCc7DQorICAgICAgICB9DQorICAgICAgICBjY2YrKzsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ0UnOiB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0V4cDsNCisgICAgICAgIHdzRXhwLkZvcm1hdChMIkUlK2QiLCBleHBvbmVudCk7DQorICAgICAgICB3c091dHB1dCArPSB3c0V4cDsNCisgICAgICB9DQorICAgICAgICBjY2YrKzsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJyQnOiB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCisgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbCwgd3NTeW1ib2wpOw0KKyAgICAgICAgd3NPdXRwdXQgKz0gd3NTeW1ib2w7DQorICAgICAgfQ0KKyAgICAgICAgY2NmKys7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdjJzoNCisgICAgICAgIGlmIChjY2YgKyAxIDwgbGVuZiAmJiBzdHJmW2NjZiArIDFdID09ICdyJykgew0KKyAgICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICAgIHdzT3V0cHV0ICs9IEwiQ1IiOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjZiArPSAyOw0KKyAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ0MnOg0KKyAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ1InKSB7DQorICAgICAgICAgIGlmIChiTmVnKSB7DQorICAgICAgICAgICAgd3NPdXRwdXQgKz0gTCJDUiI7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgd3NPdXRwdXQgKz0gTCIgICI7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2NmICs9IDI7DQorICAgICAgICAgIGJBZGROZWcgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnZCc6DQorICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAnYicpIHsNCisgICAgICAgICAgaWYgKGJOZWcpIHsNCisgICAgICAgICAgICB3c091dHB1dCArPSBMImRiIjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjY2YgKz0gMjsNCisgICAgICAgICAgYkFkZE5lZyA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdEJzoNCisgICAgICAgIGlmIChjY2YgKyAxIDwgbGVuZiAmJiBzdHJmW2NjZiArIDFdID09ICdCJykgew0KKyAgICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICAgIHdzT3V0cHV0ICs9IEwiREIiOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHdzT3V0cHV0ICs9IEwiICAiOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNjZiArPSAyOw0KKyAgICAgICAgICBiQWRkTmVnID0gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJyUnOiB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsNCisgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50LCB3c1N5bWJvbCk7DQorICAgICAgICB3c091dHB1dCArPSB3c1N5bWJvbDsNCisgICAgICB9DQorICAgICAgICBjY2YrKzsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJzgnOiB7DQorICAgICAgICB3aGlsZSAoY2NmIDwgbGVuZiAmJiBzdHJmW2NjZl0gPT0gJzgnKSB7DQorICAgICAgICAgIGNjZisrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd2hpbGUgKGNjIDwgbGVuICYmIEZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgd3NPdXRwdXQgKz0gc3RyW2NjXTsNCisgICAgICAgICAgY2MrKzsNCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgJywnOg0KKyAgICAgICAgd3NPdXRwdXQgKz0gd3NHcm91cFN5bWJvbDsNCisgICAgICAgIGNjZisrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnKCc6DQorICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICB3c091dHB1dCArPSAnKCc7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICB3c091dHB1dCArPSAnICc7DQorICAgICAgICB9DQorICAgICAgICBiQWRkTmVnID0gVFJVRTsNCisgICAgICAgIGNjZisrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnKSc6DQorICAgICAgICBpZiAoYk5lZykgew0KKyAgICAgICAgICB3c091dHB1dCArPSAnKSc7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICB3c091dHB1dCArPSAnICc7DQorICAgICAgICB9DQorICAgICAgICBjY2YrKzsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBjY2YrKzsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKCFiQWRkTmVnICYmIGJOZWcpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51c3ltYm9sOw0KKyAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMsIHdzTWludXN5bWJvbCk7DQorICAgIHdzT3V0cHV0ID0NCisgICAgICAgIHdzT3V0cHV0WzBdICsgd3NNaW51c3ltYm9sICsgd3NPdXRwdXQuTWlkKDEsIHdzT3V0cHV0LkdldExlbmd0aCgpIC0gMSk7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhfRm9ybWF0U3RyaW5nOjpGb3JtYXROdW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjTnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KSB7DQorICBpZiAod3NTcmNOdW0uSXNFbXB0eSgpIHx8IHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIEZvcm1hdFN0ck51bSh3c1NyY051bSwgd3NQYXR0ZXJuLCB3c091dHB1dCk7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0Zvcm1hdFN0cmluZzo6Rm9ybWF0TnVtKEZYX0ZMT0FUIGZOdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpIHsNCisgIGlmICh3c1BhdHRlcm4uSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGWF9MQ051bWVyaWMgbGNOdW0oZk51bSk7DQorICByZXR1cm4gRm9ybWF0TENOdW1lcmljKGxjTnVtLCB3c1BhdHRlcm4sIHdzT3V0cHV0KTsNCit9DQorRlhfQk9PTCBGWF9EYXRlRnJvbUNhbm9uaWNhbChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1VuaXRpbWUmIGRhdGV0aW1lKSB7DQorICBpbnQzMl90IHllYXIgPSAxOTAwOw0KKyAgaW50MzJfdCBtb250aCA9IDE7DQorICBpbnQzMl90IGRheSA9IDE7DQorICBGWF9XT1JEIHdZZWFyID0gMDsNCisgIGludCBjY19zdGFydCA9IDAsIGNjID0gMDsNCisgIGNvbnN0IEZYX1dDSEFSKiBzdHIgPSAoY29uc3QgRlhfV0NIQVIqKXdzRGF0ZTsNCisgIGludCBsZW4gPSB3c0RhdGUuR2V0TGVuZ3RoKCk7DQorICBpZiAobGVuID4gMTApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgd2hpbGUgKGNjIDwgbGVuICYmIGNjIDwgNCkgew0KKyAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgd1llYXIgPSB3WWVhciAqIDEwICsgc3RyW2NjKytdIC0gJzAnOw0KKyAgfQ0KKyAgeWVhciA9IHdZZWFyOw0KKyAgaWYgKGNjIDwgNCB8fCB3WWVhciA8IDE5MDApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGNjIDwgbGVuKSB7DQorICAgIGlmIChzdHJbY2NdID09ICctJykgew0KKyAgICAgIGNjKys7DQorICAgIH0NCisgICAgY2Nfc3RhcnQgPSBjYzsNCisgICAgdWludDhfdCB0bXBNID0gMDsNCisgICAgd2hpbGUgKGNjIDwgbGVuICYmIGNjIDwgY2Nfc3RhcnQgKyAyKSB7DQorICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIHRtcE0gPSB0bXBNICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQorICAgIH0NCisgICAgbW9udGggPSB0bXBNOw0KKyAgICBpZiAoY2MgPT0gY2Nfc3RhcnQgKyAxIHx8IHRtcE0gPiAxMiB8fCB0bXBNIDwgMSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAoY2MgPCBsZW4pIHsNCisgICAgICBpZiAoc3RyW2NjXSA9PSAnLScpIHsNCisgICAgICAgIGNjKys7DQorICAgICAgfQ0KKyAgICAgIHVpbnQ4X3QgdG1wRCA9IDA7DQorICAgICAgY2Nfc3RhcnQgPSBjYzsNCisgICAgICB3aGlsZSAoY2MgPCBsZW4gJiYgY2MgPCBjY19zdGFydCArIDIpIHsNCisgICAgICAgIGlmICghRlhfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICB0bXBEID0gdG1wRCAqIDEwICsgc3RyW2NjKytdIC0gJzAnOw0KKyAgICAgIH0NCisgICAgICBkYXkgPSB0bXBEOw0KKyAgICAgIGlmICh0bXBEIDwgMSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBpZiAoKHRtcE0gPT0gMSB8fCB0bXBNID09IDMgfHwgdG1wTSA9PSA1IHx8IHRtcE0gPT0gNyB8fCB0bXBNID09IDggfHwNCisgICAgICAgICAgIHRtcE0gPT0gMTAgfHwgdG1wTSA9PSAxMikgJiYNCisgICAgICAgICAgdG1wRCA+IDMxKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGlmICgodG1wTSA9PSA0IHx8IHRtcE0gPT0gNiB8fCB0bXBNID09IDkgfHwgdG1wTSA9PSAxMSkgJiYgdG1wRCA+IDMwKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIEZYX0JPT0wgaUxlYXBZZWFyOw0KKyAgICAgIGlmICgod1llYXIgJSA0ID09IDAgJiYgd1llYXIgJSAxMDAgIT0gMCkgfHwgd1llYXIgJSA0MDAgPT0gMCkgew0KKyAgICAgICAgaUxlYXBZZWFyID0gVFJVRTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaUxlYXBZZWFyID0gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGlmICgoaUxlYXBZZWFyICYmIHRtcE0gPT0gMiAmJiB0bXBEID4gMjkpIHx8DQorICAgICAgICAgICghaUxlYXBZZWFyICYmIHRtcE0gPT0gMiAmJiB0bXBEID4gMjgpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBDRlhfVW5pdGltZSB1dDsNCisgIHV0LlNldCh5ZWFyLCBtb250aCwgZGF5KTsNCisgIGRhdGV0aW1lID0gZGF0ZXRpbWUgKyB1dDsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIEZYX1RpbWVGcm9tQ2Fub25pY2FsKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUaW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1VuaXRpbWUmIGRhdGV0aW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSkgew0KKyAgaWYgKHdzVGltZS5HZXRMZW5ndGgoKSA9PSAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHVpbnQ4X3QgaG91ciA9IDA7DQorICB1aW50OF90IG1pbnV0ZSA9IDA7DQorICB1aW50OF90IHNlY29uZCA9IDA7DQorICBGWF9XT1JEIG1pbGxpc2Vjb25kID0gMDsNCisgIGludCBjY19zdGFydCA9IDAsIGNjID0gY2Nfc3RhcnQ7DQorICBjb25zdCBGWF9XQ0hBUiogc3RyID0gKGNvbnN0IEZYX1dDSEFSKil3c1RpbWUuR2V0UHRyKCk7DQorICBpbnQgbGVuID0gd3NUaW1lLkdldExlbmd0aCgpOw0KKyAgd2hpbGUgKGNjIDwgbGVuICYmIGNjIDwgMikgew0KKyAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaG91ciA9IGhvdXIgKiAxMCArIHN0cltjYysrXSAtICcwJzsNCisgIH0NCisgIGlmIChjYyA8IDIgfHwgaG91ciA+PSAyNCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoY2MgPCBsZW4pIHsNCisgICAgaWYgKHN0cltjY10gPT0gJzonKSB7DQorICAgICAgY2MrKzsNCisgICAgfQ0KKyAgICBjY19zdGFydCA9IGNjOw0KKyAgICB3aGlsZSAoY2MgPCBsZW4gJiYgY2MgPCBjY19zdGFydCArIDIpIHsNCisgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgbWludXRlID0gbWludXRlICogMTAgKyBzdHJbY2MrK10gLSAnMCc7DQorICAgIH0NCisgICAgaWYgKGNjID09IGNjX3N0YXJ0ICsgMSB8fCBtaW51dGUgPj0gNjApIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKGNjIDwgbGVuKSB7DQorICAgICAgaWYgKHN0cltjY10gPT0gJzonKSB7DQorICAgICAgICBjYysrOw0KKyAgICAgIH0NCisgICAgICBjY19zdGFydCA9IGNjOw0KKyAgICAgIHdoaWxlIChjYyA8IGxlbiAmJiBjYyA8IGNjX3N0YXJ0ICsgMikgew0KKyAgICAgICAgaWYgKCFGWF9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIHNlY29uZCA9IHNlY29uZCAqIDEwICsgc3RyW2NjKytdIC0gJzAnOw0KKyAgICAgIH0NCisgICAgICBpZiAoY2MgPT0gY2Nfc3RhcnQgKyAxIHx8IHNlY29uZCA+PSA2MCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBpZiAoY2MgPCBsZW4pIHsNCisgICAgICAgIGlmIChzdHJbY2NdID09ICcuJykgew0KKyAgICAgICAgICBjYysrOw0KKyAgICAgICAgICBjY19zdGFydCA9IGNjOw0KKyAgICAgICAgICB3aGlsZSAoY2MgPCBsZW4gJiYgY2MgPCBjY19zdGFydCArIDMpIHsNCisgICAgICAgICAgICBpZiAoIUZYX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbWlsbGlzZWNvbmQgPSBtaWxsaXNlY29uZCAqIDEwICsgc3RyW2NjKytdIC0gJzAnOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChjYyA8IGNjX3N0YXJ0ICsgMyB8fCBtaWxsaXNlY29uZCA+PSAxMDAwKSB7DQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoY2MgPCBsZW4pIHsNCisgICAgICAgICAgRlhfVElNRVpPTkUgdHpEaWZmOw0KKyAgICAgICAgICB0ekRpZmYudHpIb3VyID0gMDsNCisgICAgICAgICAgdHpEaWZmLnR6TWludXRlID0gMDsNCisgICAgICAgICAgaWYgKHN0cltjY10gIT0gJ1onKSB7DQorICAgICAgICAgICAgY2MgKz0gRlhfUGFyc2VUaW1lWm9uZShzdHIgKyBjYywgbGVuIC0gY2MsIHR6RGlmZik7DQorICAgICAgICAgIH0NCisgICAgICAgICAgRlhfUmVzb2x2ZVpvbmUoaG91ciwgbWludXRlLCB0ekRpZmYsIHBMb2NhbGUpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgQ0ZYX1VuaXRpbWUgdXQ7DQorICB1dC5TZXQoMCwgMCwgMCwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kKTsNCisgIGRhdGV0aW1lID0gZGF0ZXRpbWUgKyB1dDsNCisgIHJldHVybiBUUlVFOw0KK30NCitzdGF0aWMgRlhfV09SRCBGWF9HZXRTb2xhck1vbnRoRGF5cyhGWF9XT1JEIHllYXIsIEZYX1dPUkQgbW9udGgpIHsNCisgIGlmIChtb250aCAlIDIpIHsNCisgICAgcmV0dXJuIDMxOw0KKyAgfSBlbHNlIGlmIChtb250aCA9PSAyKSB7DQorICAgIHJldHVybiBGWF9Jc0xlYXBZZWFyKHllYXIpID8gMjkgOiAyODsNCisgIH0NCisgIHJldHVybiAzMDsNCit9DQorc3RhdGljIEZYX1dPUkQgRlhfR2V0V2Vla0RheShGWF9XT1JEIHllYXIsIEZYX1dPUkQgbW9udGgsIEZYX1dPUkQgZGF5KSB7DQorICBGWF9XT1JEIGdfbW9udGhfZGF5W10gPSB7MCwgMywgMywgNiwgMSwgNCwgNiwgMiwgNSwgMCwgMywgNX07DQorICBGWF9XT1JEIG5EYXlzID0NCisgICAgICAoeWVhciAtIDEpICUgNyArICh5ZWFyIC0gMSkgLyA0IC0gKHllYXIgLSAxKSAvIDEwMCArICh5ZWFyIC0gMSkgLyA0MDA7DQorICBuRGF5cyArPSBnX21vbnRoX2RheVttb250aCAtIDFdICsgZGF5Ow0KKyAgaWYgKEZYX0lzTGVhcFllYXIoeWVhcikgJiYgbW9udGggPiAyKSB7DQorICAgIG5EYXlzKys7DQorICB9DQorICByZXR1cm4gbkRheXMgJSA3Ow0KK30NCitzdGF0aWMgRlhfV09SRCBGWF9HZXRXZWVrT2ZNb250aChGWF9XT1JEIHllYXIsIEZYX1dPUkQgbW9udGgsIEZYX1dPUkQgZGF5KSB7DQorICBGWF9XT1JEIHdlZWtfZGF5ID0gRlhfR2V0V2Vla0RheSh5ZWFyLCBtb250aCwgMSk7DQorICBGWF9XT1JEIHdlZWtfaW5kZXggPSAwOw0KKyAgd2Vla19pbmRleCArPSBkYXkgLyA3Ow0KKyAgZGF5ID0gZGF5ICUgNzsNCisgIGlmICh3ZWVrX2RheSArIGRheSA+IDcpIHsNCisgICAgd2Vla19pbmRleCsrOw0KKyAgfQ0KKyAgcmV0dXJuIHdlZWtfaW5kZXg7DQorfQ0KK3N0YXRpYyBGWF9XT1JEIEZYX0dldFdlZWtPZlllYXIoRlhfV09SRCB5ZWFyLCBGWF9XT1JEIG1vbnRoLCBGWF9XT1JEIGRheSkgew0KKyAgRlhfV09SRCBuRGF5cyA9IDA7DQorICBmb3IgKEZYX1dPUkQgaSA9IDE7IGkgPCBtb250aDsgaSsrKSB7DQorICAgIG5EYXlzICs9IEZYX0dldFNvbGFyTW9udGhEYXlzKHllYXIsIGkpOw0KKyAgfQ0KKyAgbkRheXMgKz0gZGF5Ow0KKyAgRlhfV09SRCB3ZWVrX2RheSA9IEZYX0dldFdlZWtEYXkoeWVhciwgMSwgMSk7DQorICBGWF9XT1JEIHdlZWtfaW5kZXggPSAxOw0KKyAgd2Vla19pbmRleCArPSBuRGF5cyAvIDc7DQorICBuRGF5cyA9IG5EYXlzICUgNzsNCisgIGlmICh3ZWVrX2RheSArIG5EYXlzID4gNykgew0KKyAgICB3ZWVrX2luZGV4Kys7DQorICB9DQorICByZXR1cm4gd2Vla19pbmRleDsNCit9DQorc3RhdGljIEZYX0JPT0wgRlhfRGF0ZUZvcm1hdChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRlUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfVW5pdGltZSYgZGF0ZXRpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NSZXN1bHQpIHsNCisgIEZYX0JPT0wgYlJldCA9IFRSVUU7DQorICBpbnQzMl90IHllYXIgPSBkYXRldGltZS5HZXRZZWFyKCk7DQorICB1aW50OF90IG1vbnRoID0gZGF0ZXRpbWUuR2V0TW9udGgoKTsNCisgIHVpbnQ4X3QgZGF5ID0gZGF0ZXRpbWUuR2V0RGF5KCk7DQorICBpbnQzMl90IGNjZiA9IDA7DQorICBjb25zdCBGWF9XQ0hBUiogc3RyZiA9IChjb25zdCBGWF9XQ0hBUiopd3NEYXRlUGF0dGVybjsNCisgIGludDMyX3QgbGVuZiA9IHdzRGF0ZVBhdHRlcm4uR2V0TGVuZ3RoKCk7DQorICB3aGlsZSAoY2NmIDwgbGVuZikgew0KKyAgICBpZiAoc3RyZltjY2ZdID09ICdcJycpIHsNCisgICAgICB3c1Jlc3VsdCArPSBGWF9HZXRMaXRlcmFsVGV4dChzdHJmLCBjY2YsIGxlbmYpOw0KKyAgICAgIGNjZisrOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9IGVsc2UgaWYgKEZYX0xvY2FsX0ZpbmQoZ3Nfd3NEYXRlU3ltYm9scywgc3RyZltjY2ZdKSA8IDApIHsNCisgICAgICB3c1Jlc3VsdCArPSBzdHJmW2NjZisrXTsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBGWF9EV09SRCBkd1N5bWJvbE51bSA9IDE7DQorICAgIEZYX0RXT1JEIGR3U3ltYm9sID0gc3RyZltjY2YrK107DQorICAgIHdoaWxlIChjY2YgPCBsZW5mICYmIHN0cmZbY2NmXSA9PSBkd1N5bWJvbCkgew0KKyAgICAgIGNjZisrOw0KKyAgICAgIGR3U3ltYm9sTnVtKys7DQorICAgIH0NCisgICAgZHdTeW1ib2wgPSAoZHdTeW1ib2wgPDwgOCkgfCAoZHdTeW1ib2xOdW0gKyAnMCcpOw0KKyAgICBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdEJywgJzEnKSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF5Ow0KKyAgICAgIHdzRGF5LkZvcm1hdChMIiVkIiwgZGF5KTsNCisgICAgICB3c1Jlc3VsdCArPSB3c0RheTsNCisgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0QnLCAnMicpKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXk7DQorICAgICAgd3NEYXkuRm9ybWF0KEwiJTAyZCIsIGRheSk7DQorICAgICAgd3NSZXN1bHQgKz0gd3NEYXk7DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdKJywgJzEnKSkgew0KKyAgICAgIEZYX1dPUkQgbkRheXMgPSAwOw0KKyAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbW9udGg7IGkrKykgew0KKyAgICAgICAgbkRheXMgKz0gRlhfR2V0U29sYXJNb250aERheXMoeWVhciwgaSk7DQorICAgICAgfQ0KKyAgICAgIG5EYXlzICs9IGRheTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0RheXM7DQorICAgICAgd3NEYXlzLkZvcm1hdChMIiVkIiwgbkRheXMpOw0KKyAgICAgIHdzUmVzdWx0ICs9IHdzRGF5czsNCisgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0onLCAnMycpKSB7DQorICAgICAgRlhfV09SRCBuRGF5cyA9IDA7DQorICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBtb250aDsgaSsrKSB7DQorICAgICAgICBuRGF5cyArPSBGWF9HZXRTb2xhck1vbnRoRGF5cyh5ZWFyLCBpKTsNCisgICAgICB9DQorICAgICAgbkRheXMgKz0gZGF5Ow0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF5czsNCisgICAgICB3c0RheXMuRm9ybWF0KEwiJTAzZCIsIG5EYXlzKTsNCisgICAgICB3c1Jlc3VsdCArPSB3c0RheXM7DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdNJywgJzEnKSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzTW9udGg7DQorICAgICAgd3NNb250aC5Gb3JtYXQoTCIlZCIsIG1vbnRoKTsNCisgICAgICB3c1Jlc3VsdCArPSB3c01vbnRoOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICcyJykpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c01vbnRoOw0KKyAgICAgIHdzTW9udGguRm9ybWF0KEwiJTAyZCIsIG1vbnRoKTsNCisgICAgICB3c1Jlc3VsdCArPSB3c01vbnRoOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICczJykpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7DQorICAgICAgcExvY2FsZS0+R2V0TW9udGhOYW1lKG1vbnRoIC0gMSwgd3NUZW1wLCBUUlVFKTsNCisgICAgICB3c1Jlc3VsdCArPSB3c1RlbXA7DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdNJywgJzQnKSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCisgICAgICBwTG9jYWxlLT5HZXRNb250aE5hbWUobW9udGggLSAxLCB3c1RlbXAsIEZBTFNFKTsNCisgICAgICB3c1Jlc3VsdCArPSB3c1RlbXA7DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdFJywgJzEnKSkgew0KKyAgICAgIEZYX1dPUkQgd1dlZWtEYXkgPSBGWF9HZXRXZWVrRGF5KHllYXIsIG1vbnRoLCBkYXkpOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzV2Vla0RheTsNCisgICAgICB3c1dlZWtEYXkuRm9ybWF0KEwiJWQiLCB3V2Vla0RheSArIDEpOw0KKyAgICAgIHdzUmVzdWx0ICs9IHdzV2Vla0RheTsNCisgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0UnLCAnMycpKSB7DQorICAgICAgRlhfV09SRCB3V2Vla0RheSA9IEZYX0dldFdlZWtEYXkoeWVhciwgbW9udGgsIGRheSk7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KKyAgICAgIHBMb2NhbGUtPkdldERheU5hbWUod1dlZWtEYXksIHdzVGVtcCwgVFJVRSk7DQorICAgICAgd3NSZXN1bHQgKz0gd3NUZW1wOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnRScsICc0JykpIHsNCisgICAgICBGWF9XT1JEIHdXZWVrRGF5ID0gRlhfR2V0V2Vla0RheSh5ZWFyLCBtb250aCwgZGF5KTsNCisgICAgICBpZiAocExvY2FsZSkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KKyAgICAgICAgcExvY2FsZS0+R2V0RGF5TmFtZSh3V2Vla0RheSwgd3NUZW1wLCBGQUxTRSk7DQorICAgICAgICB3c1Jlc3VsdCArPSB3c1RlbXA7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnZScsICcxJykpIHsNCisgICAgICBGWF9XT1JEIHdXZWVrRGF5ID0gRlhfR2V0V2Vla0RheSh5ZWFyLCBtb250aCwgZGF5KTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1dlZWtEYXk7DQorICAgICAgd3NXZWVrRGF5LkZvcm1hdChMIiVkIiwgd1dlZWtEYXkgPyB3V2Vla0RheSA6IDcpOw0KKyAgICAgIHdzUmVzdWx0ICs9IHdzV2Vla0RheTsNCisgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0cnLCAnMScpKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KKyAgICAgIHBMb2NhbGUtPkdldEVyYU5hbWUod3NUZW1wLCB5ZWFyIDwgMCk7DQorICAgICAgd3NSZXN1bHQgKz0gd3NUZW1wOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnWScsICcyJykpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1llYXI7DQorICAgICAgd3NZZWFyLkZvcm1hdChMIiUwMmQiLCB5ZWFyICUgMTAwKTsNCisgICAgICB3c1Jlc3VsdCArPSB3c1llYXI7DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdZJywgJzQnKSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzWWVhcjsNCisgICAgICB3c1llYXIuRm9ybWF0KEwiJWQiLCB5ZWFyKTsNCisgICAgICB3c1Jlc3VsdCArPSB3c1llYXI7DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICd3JywgJzEnKSkgew0KKyAgICAgIEZYX1dPUkQgd2Vla19pbmRleCA9IEZYX0dldFdlZWtPZk1vbnRoKHllYXIsIG1vbnRoLCBkYXkpOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzV2Vla0luTW9udGg7DQorICAgICAgd3NXZWVrSW5Nb250aC5Gb3JtYXQoTCIlZCIsIHdlZWtfaW5kZXgpOw0KKyAgICAgIHdzUmVzdWx0ICs9IHdzV2Vla0luTW9udGg7DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdXJywgJzInKSkgew0KKyAgICAgIEZYX1dPUkQgd2Vla19pbmRleCA9IEZYX0dldFdlZWtPZlllYXIoeWVhciwgbW9udGgsIGRheSk7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NXZWVrSW5ZZWFyOw0KKyAgICAgIHdzV2Vla0luWWVhci5Gb3JtYXQoTCIlMDJkIiwgd2Vla19pbmRleCk7DQorICAgICAgd3NSZXN1bHQgKz0gd3NXZWVrSW5ZZWFyOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gYlJldDsNCit9DQorc3RhdGljIEZYX0JPT0wgRlhfVGltZUZvcm1hdChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUaW1lUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfVW5pdGltZSYgZGF0ZXRpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NSZXN1bHQpIHsNCisgIEZYX0JPT0wgYkdNVCA9IEZBTFNFOw0KKyAgRlhfQk9PTCBiUmV0ID0gVFJVRTsNCisgIHVpbnQ4X3QgaG91ciA9IGRhdGV0aW1lLkdldEhvdXIoKTsNCisgIHVpbnQ4X3QgbWludXRlID0gZGF0ZXRpbWUuR2V0TWludXRlKCk7DQorICB1aW50OF90IHNlY29uZCA9IGRhdGV0aW1lLkdldFNlY29uZCgpOw0KKyAgRlhfV09SRCBtaWxsaXNlY29uZCA9IGRhdGV0aW1lLkdldE1pbGxpc2Vjb25kKCk7DQorICBpbnQzMl90IGNjZiA9IDA7DQorICBjb25zdCBGWF9XQ0hBUiogc3RyZiA9IChjb25zdCBGWF9XQ0hBUiopd3NUaW1lUGF0dGVybjsNCisgIGludDMyX3QgbGVuZiA9IHdzVGltZVBhdHRlcm4uR2V0TGVuZ3RoKCk7DQorICBGWF9XT1JEIHdIb3VyID0gaG91cjsNCisgIEZYX0JPT0wgYlBNID0gRkFMU0U7DQorICBpZiAod3NUaW1lUGF0dGVybi5GaW5kKCdBJykgIT0gLTEpIHsNCisgICAgaWYgKHdIb3VyID49IDEyKSB7DQorICAgICAgYlBNID0gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgd2hpbGUgKGNjZiA8IGxlbmYpIHsNCisgICAgaWYgKHN0cmZbY2NmXSA9PSAnXCcnKSB7DQorICAgICAgd3NSZXN1bHQgKz0gRlhfR2V0TGl0ZXJhbFRleHQoc3RyZiwgY2NmLCBsZW5mKTsNCisgICAgICBjY2YrKzsNCisgICAgICBjb250aW51ZTsNCisgICAgfSBlbHNlIGlmIChGWF9Mb2NhbF9GaW5kKGdzX3dzVGltZVN5bWJvbHMsIHN0cmZbY2NmXSkgPCAwKSB7DQorICAgICAgd3NSZXN1bHQgKz0gc3RyZltjY2YrK107DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgRlhfRFdPUkQgZHdTeW1ib2xOdW0gPSAxOw0KKyAgICBGWF9EV09SRCBkd1N5bWJvbCA9IHN0cmZbY2NmKytdOw0KKyAgICB3aGlsZSAoY2NmIDwgbGVuZiAmJiBzdHJmW2NjZl0gPT0gZHdTeW1ib2wpIHsNCisgICAgICBjY2YrKzsNCisgICAgICBkd1N5bWJvbE51bSsrOw0KKyAgICB9DQorICAgIGR3U3ltYm9sID0gKGR3U3ltYm9sIDw8IDgpIHwgKGR3U3ltYm9sTnVtICsgJzAnKTsNCisgICAgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnaCcsICcxJykpIHsNCisgICAgICBpZiAod0hvdXIgPiAxMikgew0KKyAgICAgICAgd0hvdXIgLT0gMTI7DQorICAgICAgfQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzSG91cjsNCisgICAgICB3c0hvdXIuRm9ybWF0KEwiJWQiLCB3SG91ciA9PSAwID8gMTIgOiB3SG91cik7DQorICAgICAgd3NSZXN1bHQgKz0gd3NIb3VyOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnaCcsICcyJykpIHsNCisgICAgICBpZiAod0hvdXIgPiAxMikgew0KKyAgICAgICAgd0hvdXIgLT0gMTI7DQorICAgICAgfQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzSG91cjsNCisgICAgICB3c0hvdXIuRm9ybWF0KEwiJTAyZCIsIHdIb3VyID09IDAgPyAxMiA6IHdIb3VyKTsNCisgICAgICB3c1Jlc3VsdCArPSB3c0hvdXI7DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdLJywgJzEnKSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzSG91cjsNCisgICAgICB3c0hvdXIuRm9ybWF0KEwiJWQiLCB3SG91ciA9PSAwID8gMjQgOiB3SG91cik7DQorICAgICAgd3NSZXN1bHQgKz0gd3NIb3VyOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSycsICcyJykpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0hvdXI7DQorICAgICAgd3NIb3VyLkZvcm1hdChMIiUwMmQiLCB3SG91ciA9PSAwID8gMjQgOiB3SG91cik7DQorICAgICAgd3NSZXN1bHQgKz0gd3NIb3VyOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnaycsICcxJykpIHsNCisgICAgICBpZiAod0hvdXIgPiAxMikgew0KKyAgICAgICAgd0hvdXIgLT0gMTI7DQorICAgICAgfQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzSG91cjsNCisgICAgICB3c0hvdXIuRm9ybWF0KEwiJWQiLCB3SG91cik7DQorICAgICAgd3NSZXN1bHQgKz0gd3NIb3VyOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSCcsICcxJykpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0hvdXI7DQorICAgICAgd3NIb3VyLkZvcm1hdChMIiVkIiwgd0hvdXIpOw0KKyAgICAgIHdzUmVzdWx0ICs9IHdzSG91cjsNCisgICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ2snLCAnMicpKSB7DQorICAgICAgaWYgKHdIb3VyID4gMTIpIHsNCisgICAgICAgIHdIb3VyIC09IDEyOw0KKyAgICAgIH0NCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0hvdXI7DQorICAgICAgd3NIb3VyLkZvcm1hdChMIiUwMmQiLCB3SG91cik7DQorICAgICAgd3NSZXN1bHQgKz0gd3NIb3VyOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSCcsICcyJykpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0hvdXI7DQorICAgICAgd3NIb3VyLkZvcm1hdChMIiUwMmQiLCB3SG91cik7DQorICAgICAgd3NSZXN1bHQgKz0gd3NIb3VyOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICcxJykpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c01pbnV0ZTsNCisgICAgICB3c01pbnV0ZS5Gb3JtYXQoTCIlZCIsIG1pbnV0ZSk7DQorICAgICAgd3NSZXN1bHQgKz0gd3NNaW51dGU7DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdNJywgJzInKSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWludXRlOw0KKyAgICAgIHdzTWludXRlLkZvcm1hdChMIiUwMmQiLCBtaW51dGUpOw0KKyAgICAgIHdzUmVzdWx0ICs9IHdzTWludXRlOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnUycsICcxJykpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1NlY29uZDsNCisgICAgICB3c1NlY29uZC5Gb3JtYXQoTCIlZCIsIHNlY29uZCk7DQorICAgICAgd3NSZXN1bHQgKz0gd3NTZWNvbmQ7DQorICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdTJywgJzInKSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzU2Vjb25kOw0KKyAgICAgIHdzU2Vjb25kLkZvcm1hdChMIiUwMmQiLCBzZWNvbmQpOw0KKyAgICAgIHdzUmVzdWx0ICs9IHdzU2Vjb25kOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnRicsICczJykpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c01pbGxpc2Vjb25kczsNCisgICAgICB3c01pbGxpc2Vjb25kcy5Gb3JtYXQoTCIlMDNkIiwgbWlsbGlzZWNvbmQpOw0KKyAgICAgIHdzUmVzdWx0ICs9IHdzTWlsbGlzZWNvbmRzOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnQScsICcxJykpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c01lcmlkaWVtOw0KKyAgICAgIHBMb2NhbGUtPkdldE1lcmlkaWVtTmFtZSh3c01lcmlkaWVtLCAhYlBNKTsNCisgICAgICB3c1Jlc3VsdCArPSB3c01lcmlkaWVtOw0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnWicsICcxJykpIHsNCisgICAgICB3c1Jlc3VsdCArPSBGWF9XU1RSQyhMIkdNVCIpOw0KKyAgICAgIEZYX1RJTUVaT05FIHR6Ow0KKyAgICAgIHBMb2NhbGUtPkdldFRpbWVab25lKHR6KTsNCisgICAgICBpZiAoIWJHTVQgJiYgKHR6LnR6SG91ciAhPSAwIHx8IHR6LnR6TWludXRlICE9IDApKSB7DQorICAgICAgICBpZiAodHoudHpIb3VyIDwgMCkgew0KKyAgICAgICAgICB3c1Jlc3VsdCArPSBGWF9XU1RSQyhMIi0iKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHdzUmVzdWx0ICs9IEZYX1dTVFJDKEwiKyIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUaW1lem9uZTsNCisgICAgICAgIHdzVGltZXpvbmUuRm9ybWF0KEwiJTAyZDolMDJkIiwgRlhTWVNfYWJzKHR6LnR6SG91ciksIHR6LnR6TWludXRlKTsNCisgICAgICAgIHdzUmVzdWx0ICs9IHdzVGltZXpvbmU7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAneicsICcxJykpIHsNCisgICAgICBGWF9USU1FWk9ORSB0ejsNCisgICAgICBwTG9jYWxlLT5HZXRUaW1lWm9uZSh0eik7DQorICAgICAgaWYgKCFiR01UICYmIHR6LnR6SG91ciAhPSAwICYmIHR6LnR6TWludXRlICE9IDApIHsNCisgICAgICAgIGlmICh0ei50ekhvdXIgPCAwKSB7DQorICAgICAgICAgIHdzUmVzdWx0ICs9IEZYX1dTVFJDKEwiLSIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgd3NSZXN1bHQgKz0gRlhfV1NUUkMoTCIrIik7DQorICAgICAgICB9DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RpbWV6b25lOw0KKyAgICAgICAgd3NUaW1lem9uZS5Gb3JtYXQoTCIlMDJkOiUwMmQiLCBGWFNZU19hYnModHoudHpIb3VyKSwgdHoudHpNaW51dGUpOw0KKyAgICAgICAgd3NSZXN1bHQgKz0gd3NUaW1lem9uZTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBiUmV0Ow0KK30NCitzdGF0aWMgRlhfQk9PTCBGWF9Gb3JtYXREYXRlVGltZShjb25zdCBDRlhfVW5pdGltZSYgZHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZVBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGltZVBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRGF0ZUZpcnN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KSB7DQorICBGWF9CT09MIGJSZXQgPSBUUlVFOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlT3V0LCB3c1RpbWVPdXQ7DQorICBpZiAoIXdzRGF0ZVBhdHRlcm4uSXNFbXB0eSgpKSB7DQorICAgIGJSZXQgJj0gRlhfRGF0ZUZvcm1hdCh3c0RhdGVQYXR0ZXJuLCBwTG9jYWxlLCBkdCwgd3NEYXRlT3V0KTsNCisgIH0NCisgIGlmICghd3NUaW1lUGF0dGVybi5Jc0VtcHR5KCkpIHsNCisgICAgYlJldCAmPSBGWF9UaW1lRm9ybWF0KHdzVGltZVBhdHRlcm4sIHBMb2NhbGUsIGR0LCB3c1RpbWVPdXQpOw0KKyAgfQ0KKyAgd3NPdXRwdXQgPSBiRGF0ZUZpcnN0ID8gd3NEYXRlT3V0ICsgd3NUaW1lT3V0IDogd3NUaW1lT3V0ICsgd3NEYXRlT3V0Ow0KKyAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0Zvcm1hdFN0cmluZzo6Rm9ybWF0RGF0ZVRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjRGF0ZVRpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KSB7DQorICBpZiAod3NTcmNEYXRlVGltZS5Jc0VtcHR5KCkgfHwgd3NQYXR0ZXJuLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0RhdGVQYXR0ZXJuLCB3c1RpbWVQYXR0ZXJuOw0KKyAgSUZYX0xvY2FsZSogcExvY2FsZSA9IE5VTEw7DQorICBGWF9EQVRFVElNRVRZUEUgZUNhdGVnb3J5ID0NCisgICAgICBHZXREYXRlVGltZUZvcm1hdCh3c1BhdHRlcm4sIHBMb2NhbGUsIHdzRGF0ZVBhdHRlcm4sIHdzVGltZVBhdHRlcm4pOw0KKyAgaWYgKHBMb2NhbGUgPT0gTlVMTCB8fCBlQ2F0ZWdvcnkgPT0gRlhfREFURVRJTUVUWVBFX1Vua25vd24pIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1VuaXRpbWUgZHQoMCk7DQorICBpbnQzMl90IGlUID0gd3NTcmNEYXRlVGltZS5GaW5kKEwiVCIpOw0KKyAgaWYgKGlUIDwgMCkgew0KKyAgICBpZiAoZUNhdGVnb3J5ID09IEZYX0RBVEVUSU1FVFlQRV9EYXRlKSB7DQorICAgICAgRlhfRGF0ZUZyb21DYW5vbmljYWwod3NTcmNEYXRlVGltZSwgZHQpOw0KKyAgICB9IGVsc2UgaWYgKGVDYXRlZ29yeSA9PSBGWF9EQVRFVElNRVRZUEVfVGltZSkgew0KKyAgICAgIEZYX1RpbWVGcm9tQ2Fub25pY2FsKHdzU3JjRGF0ZVRpbWUsIGR0LCBwTG9jYWxlKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgRlhfRGF0ZUZyb21DYW5vbmljYWwod3NTcmNEYXRlVGltZS5MZWZ0KGlUKSwgZHQpOw0KKyAgICBGWF9UaW1lRnJvbUNhbm9uaWNhbCgNCisgICAgICAgIHdzU3JjRGF0ZVRpbWUuUmlnaHQod3NTcmNEYXRlVGltZS5HZXRMZW5ndGgoKSAtIGlUIC0gMSksIGR0LCBwTG9jYWxlKTsNCisgIH0NCisgIHJldHVybiBGWF9Gb3JtYXREYXRlVGltZShkdCwgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlQ2F0ZWdvcnkgIT0gRlhfREFURVRJTUVUWVBFX1RpbWVEYXRlLCBwTG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0KTsNCit9DQorRlhfQk9PTCBDRlhfRm9ybWF0U3RyaW5nOjpGb3JtYXREYXRlVGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNEYXRlVGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EQVRFVElNRVRZUEUgZURhdGVUaW1lVHlwZSkgew0KKyAgaWYgKHdzU3JjRGF0ZVRpbWUuSXNFbXB0eSgpIHx8IHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybjsNCisgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBOVUxMOw0KKyAgRlhfREFURVRJTUVUWVBFIGVDYXRlZ29yeSA9DQorICAgICAgR2V0RGF0ZVRpbWVGb3JtYXQod3NQYXR0ZXJuLCBwTG9jYWxlLCB3c0RhdGVQYXR0ZXJuLCB3c1RpbWVQYXR0ZXJuKTsNCisgIGlmICghcExvY2FsZSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoZUNhdGVnb3J5ID09IEZYX0RBVEVUSU1FVFlQRV9Vbmtub3duKSB7DQorICAgIGlmIChlRGF0ZVRpbWVUeXBlID09IEZYX0RBVEVUSU1FVFlQRV9UaW1lKSB7DQorICAgICAgd3NUaW1lUGF0dGVybiA9IHdzRGF0ZVBhdHRlcm47DQorICAgICAgd3NEYXRlUGF0dGVybi5FbXB0eSgpOw0KKyAgICB9DQorICAgIGVDYXRlZ29yeSA9IGVEYXRlVGltZVR5cGU7DQorICB9DQorICBpZiAoZUNhdGVnb3J5ID09IEZYX0RBVEVUSU1FVFlQRV9Vbmtub3duKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGWF9Vbml0aW1lIGR0KDApOw0KKyAgaW50MzJfdCBpVCA9IHdzU3JjRGF0ZVRpbWUuRmluZChMIlQiKTsNCisgIGlmIChpVCA8IDApIHsNCisgICAgaWYgKGVDYXRlZ29yeSA9PSBGWF9EQVRFVElNRVRZUEVfRGF0ZSAmJg0KKyAgICAgICAgRlhfRGF0ZUZyb21DYW5vbmljYWwod3NTcmNEYXRlVGltZSwgZHQpKSB7DQorICAgICAgcmV0dXJuIEZYX0Zvcm1hdERhdGVUaW1lKGR0LCB3c0RhdGVQYXR0ZXJuLCB3c1RpbWVQYXR0ZXJuLCBUUlVFLCBwTG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCk7DQorICAgIH0gZWxzZSBpZiAoZUNhdGVnb3J5ID09IEZYX0RBVEVUSU1FVFlQRV9UaW1lICYmDQorICAgICAgICAgICAgICAgRlhfVGltZUZyb21DYW5vbmljYWwod3NTcmNEYXRlVGltZSwgZHQsIHBMb2NhbGUpKSB7DQorICAgICAgcmV0dXJuIEZYX0Zvcm1hdERhdGVUaW1lKGR0LCB3c0RhdGVQYXR0ZXJuLCB3c1RpbWVQYXR0ZXJuLCBUUlVFLCBwTG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c1NyY0RhdGUoKGNvbnN0IEZYX1dDSEFSKil3c1NyY0RhdGVUaW1lLCBpVCk7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c1NyY1RpbWUoKGNvbnN0IEZYX1dDSEFSKil3c1NyY0RhdGVUaW1lICsgaVQgKyAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzU3JjRGF0ZVRpbWUuR2V0TGVuZ3RoKCkgLSBpVCAtIDEpOw0KKyAgICBpZiAod3NTcmNEYXRlLklzRW1wdHkoKSB8fCB3c1NyY1RpbWUuSXNFbXB0eSgpKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChGWF9EYXRlRnJvbUNhbm9uaWNhbCh3c1NyY0RhdGUsIGR0KSAmJg0KKyAgICAgICAgRlhfVGltZUZyb21DYW5vbmljYWwod3NTcmNUaW1lLCBkdCwgcExvY2FsZSkpIHsNCisgICAgICByZXR1cm4gRlhfRm9ybWF0RGF0ZVRpbWUoZHQsIHdzRGF0ZVBhdHRlcm4sIHdzVGltZVBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVDYXRlZ29yeSAhPSBGWF9EQVRFVElNRVRZUEVfVGltZURhdGUsIHBMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0KTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENGWF9Gb3JtYXRTdHJpbmc6OkZvcm1hdERhdGVUaW1lKGNvbnN0IENGWF9Vbml0aW1lJiBkdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpIHsNCisgIGlmICh3c1BhdHRlcm4uSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZVBhdHRlcm4sIHdzVGltZVBhdHRlcm47DQorICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gTlVMTDsNCisgIEZYX0RBVEVUSU1FVFlQRSBlQ2F0ZWdvcnkgPQ0KKyAgICAgIEdldERhdGVUaW1lRm9ybWF0KHdzUGF0dGVybiwgcExvY2FsZSwgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybik7DQorICBpZiAoIXBMb2NhbGUpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIEZYX0Zvcm1hdERhdGVUaW1lKGR0LCB3c1BhdHRlcm4sIHdzVGltZVBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNhdGVnb3J5ICE9IEZYX0RBVEVUSU1FVFlQRV9UaW1lRGF0ZSwgcExvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCk7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0Zvcm1hdFN0cmluZzo6Rm9ybWF0WmVybyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpIHsNCisgIGlmICh3c1BhdHRlcm4uSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzVGV4dEZvcm1hdDsNCisgIEdldFRleHRGb3JtYXQod3NQYXR0ZXJuLCBGWF9XU1RSQyhMInplcm8iKSwgd3NUZXh0Rm9ybWF0KTsNCisgIGludDMyX3QgaVBhdHRlcm4gPSAwOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBTdHJQYXR0ZXJuID0gKGNvbnN0IEZYX1dDSEFSKil3c1RleHRGb3JtYXQ7DQorICBpbnQzMl90IGlMZW5QYXR0ZXJuID0gd3NUZXh0Rm9ybWF0LkdldExlbmd0aCgpOw0KKyAgd2hpbGUgKGlQYXR0ZXJuIDwgaUxlblBhdHRlcm4pIHsNCisgICAgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSA9PSAnXCcnKSB7DQorICAgICAgd3NPdXRwdXQgKz0gRlhfR2V0TGl0ZXJhbFRleHQocFN0clBhdHRlcm4sIGlQYXR0ZXJuLCBpTGVuUGF0dGVybik7DQorICAgICAgaVBhdHRlcm4rKzsNCisgICAgICBjb250aW51ZTsNCisgICAgfSBlbHNlIHsNCisgICAgICB3c091dHB1dCArPSBwU3RyUGF0dGVybltpUGF0dGVybisrXTsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0Zvcm1hdFN0cmluZzo6Rm9ybWF0TnVsbChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpIHsNCisgIGlmICh3c1BhdHRlcm4uSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzVGV4dEZvcm1hdDsNCisgIEdldFRleHRGb3JtYXQod3NQYXR0ZXJuLCBGWF9XU1RSQyhMIm51bGwiKSwgd3NUZXh0Rm9ybWF0KTsNCisgIGludDMyX3QgaVBhdHRlcm4gPSAwOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBTdHJQYXR0ZXJuID0gKGNvbnN0IEZYX1dDSEFSKil3c1RleHRGb3JtYXQ7DQorICBpbnQzMl90IGlMZW5QYXR0ZXJuID0gd3NUZXh0Rm9ybWF0LkdldExlbmd0aCgpOw0KKyAgd2hpbGUgKGlQYXR0ZXJuIDwgaUxlblBhdHRlcm4pIHsNCisgICAgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSA9PSAnXCcnKSB7DQorICAgICAgd3NPdXRwdXQgKz0gRlhfR2V0TGl0ZXJhbFRleHQocFN0clBhdHRlcm4sIGlQYXR0ZXJuLCBpTGVuUGF0dGVybik7DQorICAgICAgaVBhdHRlcm4rKzsNCisgICAgICBjb250aW51ZTsNCisgICAgfSBlbHNlIHsNCisgICAgICB3c091dHB1dCArPSBwU3RyUGF0dGVybltpUGF0dGVybisrXTsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0lGWF9Mb2NhbGUqIENGWF9Gb3JtYXRTdHJpbmc6OkdldFBhdHRlcm5Mb2NhbGUoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMb2NhbGUpIHsNCisgIGlmIChtX2JVc2VMQ0lEKSB7DQorICB9DQorICByZXR1cm4gbV9wTG9jYWxlTWdyLT5HZXRMb2NhbGVCeU5hbWUod3NMb2NhbGUpOw0KK30NCisjZGVmaW5lIEZYTUFUSF9ERUNJTUFMX1NDQUxFTElNSVQgMHgxYw0KKyNkZWZpbmUgRlhNQVRIX0RFQ0lNQUxfTkVHTUFTSyAoMHg4MDAwMDAwMEwpDQorI2RlZmluZSBGWE1BVEhfREVDSU1BTF9GT1JDRUJPT0woeCkgKCEoISh4KSkpDQorI2RlZmluZSBGWE1BVEhfREVDSU1BTF9NQUtFRkxBR1MoTkVHLCBTQ0FMRSkgXA0KKyAgKCgoU0NBTEUpIDw8IDB4MTApIHwgKChORUcpID8gRlhNQVRIX0RFQ0lNQUxfTkVHTUFTSyA6IDApKQ0KKyNkZWZpbmUgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKEZMQUdTKSBcDQorICBGWE1BVEhfREVDSU1BTF9GT1JDRUJPT0woKEZMQUdTKSZGWE1BVEhfREVDSU1BTF9ORUdNQVNLKQ0KKyNkZWZpbmUgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUoRkxBR1MpIFwNCisgICgodWludDhfdCkoKChGTEFHUykgJiB+RlhNQVRIX0RFQ0lNQUxfTkVHTUFTSykgPj4gMHgxMCkpDQorI2RlZmluZSBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVCh4KSAoKHgpID4+IDB4MTAgPj4gMHgxMCkNCisjZGVmaW5lIEZYTUFUSF9ERUNJTUFMX0xTSElGVDMyQklUKHgpICgoeCkgPDwgMHgxMCA8PCAweDEwKQ0KK3N0YXRpYyBpbmxpbmUgdWludDhfdCBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfZGl2MTAodWludDY0X3QmIHBoaSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90JiBwbWlkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QmIHBsbykgew0KKyAgdWludDhfdCByZXRWYWw7DQorICBwbWlkICs9IEZYTUFUSF9ERUNJTUFMX0xTSElGVDMyQklUKHBoaSAlIDB4QSk7DQorICBwaGkgLz0gMHhBOw0KKyAgcGxvICs9IEZYTUFUSF9ERUNJTUFMX0xTSElGVDMyQklUKHBtaWQgJSAweEEpOw0KKyAgcG1pZCAvPSAweEE7DQorICByZXRWYWwgPSBwbG8gJSAweEE7DQorICBwbG8gLz0gMHhBOw0KKyAgcmV0dXJuIHJldFZhbDsNCit9DQorc3RhdGljIGlubGluZSB1aW50OF90IGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9kaXYxMF9hbnkodWludDY0X3QgbnVtc1tdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtY291bnQpIHsNCisgIHVpbnQ4X3QgcmV0VmFsID0gMDsNCisgIGZvciAoaW50IGkgPSBudW1jb3VudCAtIDE7IGkgPiAwOyBpLS0pIHsNCisgICAgbnVtc1tpIC0gMV0gKz0gRlhNQVRIX0RFQ0lNQUxfTFNISUZUMzJCSVQobnVtc1tpXSAlIDB4QSk7DQorICAgIG51bXNbaV0gLz0gMHhBOw0KKyAgfQ0KKyAgaWYgKG51bWNvdW50KSB7DQorICAgIHJldFZhbCA9IG51bXNbMF0gJSAweEE7DQorICAgIG51bXNbMF0gLz0gMHhBOw0KKyAgfQ0KKyAgcmV0dXJuIHJldFZhbDsNCit9DQorc3RhdGljIGlubGluZSB2b2lkIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9tdWwxMCh1aW50NjRfdCYgcGhpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QmIHBtaWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCYgcGxvKSB7DQorICBwbG8gKj0gMHhBOw0KKyAgcG1pZCA9IHBtaWQgKiAweEEgKyBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVChwbG8pOw0KKyAgcGxvID0gKHVpbnQzMl90KXBsbzsNCisgIHBoaSA9IHBoaSAqIDB4QSArIEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKHBtaWQpOw0KKyAgcG1pZCA9ICh1aW50MzJfdClwbWlkOw0KK30NCitzdGF0aWMgaW5saW5lIHZvaWQgZnhtYXRoX2RlY2ltYWxfaGVscGVyX211bDEwX2FueSh1aW50NjRfdCBudW1zW10sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1jb3VudCkgew0KKyAgbnVtc1swXSAqPSAweEE7DQorICBmb3IgKGludCBpID0gMTsgaSA8IG51bWNvdW50OyBpKyspIHsNCisgICAgbnVtc1tpXSA9IG51bXNbaV0gKiAweEEgKyBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVChudW1zW2kgLSAxXSk7DQorICAgIG51bXNbaSAtIDFdID0gKHVpbnQzMl90KW51bXNbaSAtIDFdOw0KKyAgfQ0KK30NCitzdGF0aWMgaW5saW5lIHZvaWQgZnhtYXRoX2RlY2ltYWxfaGVscGVyX25vcm1hbGl6ZSh1aW50NjRfdCYgcGhpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90JiBwbWlkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90JiBwbG8pIHsNCisgIHBoaSArPSBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVChwbWlkKTsNCisgIHBtaWQgPSAodWludDMyX3QpcG1pZDsNCisgIHBtaWQgKz0gRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQocGxvKTsNCisgIHBsbyA9ICh1aW50MzJfdClwbG87DQorICBwaGkgKz0gRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQocG1pZCk7DQorICBwbWlkID0gKHVpbnQzMl90KXBtaWQ7DQorfQ0KK3N0YXRpYyBpbmxpbmUgdm9pZCBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbm9ybWFsaXplX2FueSh1aW50NjRfdCBudW1zW10sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuKSB7DQorICB7DQorICAgIGZvciAoaW50IGkgPSBsZW4gLSAyOyBpID4gMDsgaS0tKSB7DQorICAgICAgbnVtc1tpICsgMV0gKz0gRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQobnVtc1tpXSk7DQorICAgICAgbnVtc1tpXSA9ICh1aW50MzJfdCludW1zW2ldOw0KKyAgICB9DQorICB9DQorICB7DQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuIC0gMTsgaSsrKSB7DQorICAgICAgbnVtc1tpICsgMV0gKz0gRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQobnVtc1tpXSk7DQorICAgICAgbnVtc1tpXSA9ICh1aW50MzJfdCludW1zW2ldOw0KKyAgICB9DQorICB9DQorfQ0KK3N0YXRpYyBpbmxpbmUgaW50OF90IGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9yYXdfY29tcGFyZSh1aW50MzJfdCBoaTEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1pZDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxvMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGkyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtaWQyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsbzIpIHsNCisgIGludDhfdCByZXRWYWwgPSAwOw0KKyAgaWYgKCFyZXRWYWwpIHsNCisgICAgcmV0VmFsICs9IChoaTEgPiBoaTIgPyAxIDogKGhpMSA8IGhpMiA/IC0xIDogMCkpOw0KKyAgfQ0KKyAgaWYgKCFyZXRWYWwpIHsNCisgICAgcmV0VmFsICs9IChtaWQxID4gbWlkMiA/IDEgOiAobWlkMSA8IG1pZDIgPyAtMSA6IDApKTsNCisgIH0NCisgIGlmICghcmV0VmFsKSB7DQorICAgIHJldFZhbCArPSAobG8xID4gbG8yID8gMSA6IChsbzEgPCBsbzIgPyAtMSA6IDApKTsNCisgIH0NCisgIHJldHVybiByZXRWYWw7DQorfQ0KK3N0YXRpYyBpbmxpbmUgaW50OF90IGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9yYXdfY29tcGFyZV9hbnkodWludDY0X3QgYVtdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJbXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYmwpIHsNCisgIGludDhfdCByZXRWYWwgPSAwOw0KKyAgZm9yIChpbnQgaSA9IHN0ZDo6bWF4KGFsIC0gMSwgYmwgLSAxKTsgaSA+PSAwOyBpLS0pIHsNCisgICAgdWludDY0X3QgbCA9IChpID49IGFsID8gMCA6IGFbaV0pLCByID0gKGkgPj0gYmwgPyAwIDogYltpXSk7DQorICAgIHJldFZhbCArPSAobCA+IHIgPyAxIDogKGwgPCByID8gLTEgOiAwKSk7DQorICAgIGlmIChyZXRWYWwpIHsNCisgICAgICByZXR1cm4gcmV0VmFsOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gcmV0VmFsOw0KK30NCitzdGF0aWMgaW5saW5lIHZvaWQgZnhtYXRoX2RlY2ltYWxfaGVscGVyX2RlY19hbnkodWludDY0X3QgYVtdLCB1aW50OF90IGFsKSB7DQorICBmb3IgKGludCBpID0gMDsgaSA8IGFsOyBpKyspIHsNCisgICAgaWYgKGFbaV0tLSkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgfQ0KK30NCitzdGF0aWMgaW5saW5lIHZvaWQgZnhtYXRoX2RlY2ltYWxfaGVscGVyX2luY19hbnkodWludDY0X3QgYVtdLCB1aW50OF90IGFsKSB7DQorICBmb3IgKGludCBpID0gMDsgaSA8IGFsOyBpKyspIHsNCisgICAgYVtpXSsrOw0KKyAgICBpZiAoKHVpbnQzMl90KWFbaV0gPT0gYVtpXSkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBhW2ldID0gMDsNCisgIH0NCit9DQorc3RhdGljIGlubGluZSB2b2lkIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9yYXdfbXVsKHVpbnQ2NF90IGFbXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYltdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGJsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBjW10sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2wpIHsNCisgIGFzc2VydChhbCArIGJsIDw9IGNsKTsNCisgIHsNCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbDsgaSsrKSB7DQorICAgICAgY1tpXSA9IDA7DQorICAgIH0NCisgIH0NCisgIHsNCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbDsgaSsrKSB7DQorICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBibDsgaisrKSB7DQorICAgICAgICB1aW50NjRfdCBtID0gKHVpbnQ2NF90KWFbaV0gKiBiW2pdOw0KKyAgICAgICAgY1tpICsgal0gKz0gKHVpbnQzMl90KW07DQorICAgICAgICBjW2kgKyBqICsgMV0gKz0gRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQobSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICB7DQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2wgLSAxOyBpKyspIHsNCisgICAgICBjW2kgKyAxXSArPSBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVChjW2ldKTsNCisgICAgICBjW2ldID0gKHVpbnQzMl90KWNbaV07DQorICAgIH0NCisgIH0NCisgIHsNCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbDsgaSsrKSB7DQorICAgICAgY1tpXSA9ICh1aW50MzJfdCljW2ldOw0KKyAgICB9DQorICB9DQorfQ0KK3N0YXRpYyBpbmxpbmUgdm9pZCBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfcmF3X2Rpdih1aW50NjRfdCBhW10sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJbXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBibCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgY1tdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNsKSB7DQorICBpbnQgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBjbDsgaSsrKSB7DQorICAgIGNbaV0gPSAwOw0KKyAgfQ0KKyAgdWludDY0X3QgbGVmdFsxNl0gPSB7MH0sIHJpZ2h0WzE2XSA9IHswfTsNCisgIGxlZnRbMF0gPSAwOw0KKyAgZm9yIChpID0gMDsgaSA8IGFsOyBpKyspIHsNCisgICAgcmlnaHRbaV0gPSBhW2ldOw0KKyAgfQ0KKyAgdWludDY0X3QgdG1wWzE2XTsNCisgIHdoaWxlIChmeG1hdGhfZGVjaW1hbF9oZWxwZXJfcmF3X2NvbXBhcmVfYW55KGxlZnQsIGFsLCByaWdodCwgYWwpIDw9IDApIHsNCisgICAgdWludDY0X3QgY3VyWzE2XTsNCisgICAgZm9yIChpID0gMDsgaSA8IGFsOyBpKyspIHsNCisgICAgICBjdXJbaV0gPSBsZWZ0W2ldICsgcmlnaHRbaV07DQorICAgIH0NCisgICAgZm9yIChpID0gYWwgLSAxOyBpID49IDA7IGktLSkgew0KKyAgICAgIGlmIChpKSB7DQorICAgICAgICBjdXJbaSAtIDFdICs9IEZYTUFUSF9ERUNJTUFMX0xTSElGVDMyQklUKGN1cltpXSAlIDIpOw0KKyAgICAgIH0NCisgICAgICBjdXJbaV0gLz0gMjsNCisgICAgfQ0KKyAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfcmF3X211bChjdXIsIGFsLCBiLCBibCwgdG1wLCAxNik7DQorICAgIHN3aXRjaCAoZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Jhd19jb21wYXJlX2FueSh0bXAsIDE2LCBhLCBhbCkpIHsNCisgICAgICBjYXNlIC0xOg0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsNCisgICAgICAgICAgbGVmdFtpXSA9IGN1cltpXTsNCisgICAgICAgIH0NCisgICAgICAgIGxlZnRbMF0rKzsNCisgICAgICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9ub3JtYWxpemVfYW55KGxlZnQsIGFsKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgMToNCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7DQorICAgICAgICAgIHJpZ2h0W2ldID0gY3VyW2ldOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX2RlY19hbnkocmlnaHQsIGFsKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgMDoNCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdGQ6Om1pbihhbCwgY2wpOyBpKyspIHsNCisgICAgICAgICAgY1tpXSA9IGN1cltpXTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgfQ0KKyAgZm9yIChpID0gMDsgaSA8IHN0ZDo6bWluKGFsLCBjbCk7IGkrKykgew0KKyAgICBjW2ldID0gbGVmdFtpXTsNCisgIH0NCit9DQorc3RhdGljIGlubGluZSBGWF9CT09MIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9vdXRvZnJhbmdlKHVpbnQ2NF90IGFbXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBnb2FsKSB7DQorICBmb3IgKGludCBpID0gZ29hbDsgaSA8IGFsOyBpKyspIHsNCisgICAgaWYgKGFbaV0pIHsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitzdGF0aWMgaW5saW5lIHZvaWQgZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Nocmlua2ludG9yYW5nZSh1aW50NjRfdCBhW10sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGdvYWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCYgc2NhbGUpIHsNCisgIEZYX0JPT0wgYlJvdW5kVXAgPSBGQUxTRTsNCisgIHdoaWxlIChzY2FsZSAhPSAwICYmIChzY2FsZSA+IEZYTUFUSF9ERUNJTUFMX1NDQUxFTElNSVQgfHwNCisgICAgICAgICAgICAgICAgICAgICAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfb3V0b2ZyYW5nZShhLCBhbCwgZ29hbCkpKSB7DQorICAgIGJSb3VuZFVwID0gZnhtYXRoX2RlY2ltYWxfaGVscGVyX2RpdjEwX2FueShhLCBhbCkgPj0gNTsNCisgICAgc2NhbGUtLTsNCisgIH0NCisgIGlmIChiUm91bmRVcCkgew0KKyAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbm9ybWFsaXplX2FueShhLCBnb2FsKTsNCisgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX2luY19hbnkoYSwgZ29hbCk7DQorICB9DQorfQ0KK3N0YXRpYyBpbmxpbmUgdm9pZCBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfdHJ1bmNhdGUodWludDY0X3QmIHBoaSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90JiBwbWlkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QmIHBsbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QmIHNjYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtaW5zY2FsZSA9IDApIHsNCisgIHdoaWxlIChzY2FsZSA+IG1pbnNjYWxlKSB7DQorICAgIHVpbnQ2NF90IHRoaSA9IHBoaSwgdG1pZCA9IHBtaWQsIHRsbyA9IHBsbzsNCisgICAgaWYgKGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9kaXYxMCh0aGksIHRtaWQsIHRsbykgIT0gMCkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHBoaSA9IHRoaSwgcG1pZCA9IHRtaWQsIHBsbyA9IHRsbzsNCisgICAgc2NhbGUtLTsNCisgIH0NCit9DQorQ0ZYX0RlY2ltYWw6OkNGWF9EZWNpbWFsKCkgew0KKyAgbV91TG8gPSBtX3VNaWQgPSBtX3VIaSA9IG1fdUZsYWdzID0gMDsNCit9DQorQ0ZYX0RlY2ltYWw6OkNGWF9EZWNpbWFsKHVpbnQ2NF90IHZhbCkgew0KKyAgbV91TG8gPSAodWludDMyX3QpdmFsOw0KKyAgbV91TWlkID0gKHVpbnQzMl90KUZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKHZhbCk7DQorICBtX3VIaSA9IDA7DQorICBtX3VGbGFncyA9IDA7DQorfQ0KK0NGWF9EZWNpbWFsOjpDRlhfRGVjaW1hbCh1aW50MzJfdCB2YWwpIHsNCisgIG1fdUxvID0gKHVpbnQzMl90KXZhbDsNCisgIG1fdU1pZCA9IG1fdUhpID0gMDsNCisgIG1fdUZsYWdzID0gMDsNCit9DQorQ0ZYX0RlY2ltYWw6OkNGWF9EZWNpbWFsKHVpbnQzMl90IGxvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtaWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGhpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIG5lZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY2FsZSkgew0KKyAgc2NhbGUgPSAoc2NhbGUgPiBGWE1BVEhfREVDSU1BTF9TQ0FMRUxJTUlUID8gMCA6IHNjYWxlKTsNCisgIG1fdUxvID0gbG87DQorICBtX3VNaWQgPSBtaWQ7DQorICBtX3VIaSA9IGhpOw0KKyAgbV91RmxhZ3MgPSBGWE1BVEhfREVDSU1BTF9NQUtFRkxBR1MobmVnICYmIElzTm90WmVybygpLCBzY2FsZSk7DQorfQ0KK0NGWF9EZWNpbWFsOjpDRlhfRGVjaW1hbChpbnQzMl90IHZhbCkgew0KKyAgaWYgKHZhbCA+PSAwKSB7DQorICAgICp0aGlzID0gQ0ZYX0RlY2ltYWwoKHVpbnQzMl90KXZhbCk7DQorICB9IGVsc2Ugew0KKyAgICAqdGhpcyA9IENGWF9EZWNpbWFsKCh1aW50MzJfdCktdmFsKTsNCisgICAgU2V0TmVnYXRlKCk7DQorICB9DQorfQ0KK0NGWF9EZWNpbWFsOjpDRlhfRGVjaW1hbChpbnQ2NF90IHZhbCkgew0KKyAgaWYgKHZhbCA+PSAwKSB7DQorICAgICp0aGlzID0gQ0ZYX0RlY2ltYWwoKHVpbnQ2NF90KXZhbCk7DQorICB9IGVsc2Ugew0KKyAgICAqdGhpcyA9IENGWF9EZWNpbWFsKCh1aW50NjRfdCktdmFsKTsNCisgICAgU2V0TmVnYXRlKCk7DQorICB9DQorfQ0KK0NGWF9EZWNpbWFsOjpDRlhfRGVjaW1hbChGWF9GTE9BVCB2YWwsIHVpbnQ4X3Qgc2NhbGUpIHsNCisgIEZYX0ZMT0FUIG5ld3ZhbCA9IGZhYnModmFsKTsNCisgIHVpbnQ2NF90IHBoaSwgcG1pZCwgcGxvOw0KKyAgcGxvID0gKHVpbnQ2NF90KW5ld3ZhbDsNCisgIHBtaWQgPSAodWludDY0X3QpKG5ld3ZhbCAvIDFlMzIpOw0KKyAgcGhpID0gKHVpbnQ2NF90KShuZXd2YWwgLyAxZTY0KTsNCisgIG5ld3ZhbCA9IEZYU1lTX2Ztb2QobmV3dmFsLCAxLjBmKTsNCisgIGZvciAodWludDhfdCBpdGVyID0gMDsgaXRlciA8IHNjYWxlOyBpdGVyKyspIHsNCisgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX211bDEwKHBoaSwgcG1pZCwgcGxvKTsNCisgICAgbmV3dmFsICo9IDEwOw0KKyAgICBwbG8gKz0gKHVpbnQ2NF90KW5ld3ZhbDsNCisgICAgbmV3dmFsID0gRlhTWVNfZm1vZChuZXd2YWwsIDEuMGYpOw0KKyAgfQ0KKyAgcGxvICs9IEZYU1lTX3JvdW5kKG5ld3ZhbCk7DQorICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbm9ybWFsaXplKHBoaSwgcG1pZCwgcGxvKTsNCisgIG1fdUhpID0gKHVpbnQzMl90KXBoaTsNCisgIG1fdU1pZCA9ICh1aW50MzJfdClwbWlkOw0KKyAgbV91TG8gPSAodWludDMyX3QpcGxvOw0KKyAgbV91RmxhZ3MgPSBGWE1BVEhfREVDSU1BTF9NQUtFRkxBR1ModmFsIDwgMCAmJiBJc05vdFplcm8oKSwgc2NhbGUpOw0KK30NCitDRlhfRGVjaW1hbDo6Q0ZYX0RlY2ltYWwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHJPYmopIHsNCisgIGNvbnN0IEZYX1dDSEFSKiBzdHIgPSBzdHJPYmouR2V0UHRyKCk7DQorICBjb25zdCBGWF9XQ0hBUiogc3RyQm91bmQgPSBzdHIgKyBzdHJPYmouR2V0TGVuZ3RoKCk7DQorICBGWF9CT09MIHBvaW50bWV0ID0gMDsNCisgIEZYX0JPT0wgbmVnbWV0ID0gMDsNCisgIHVpbnQ4X3Qgc2NhbGUgPSAwOw0KKyAgbV91SGkgPSBtX3VNaWQgPSBtX3VMbyA9IDA7DQorICB3aGlsZSAoc3RyICE9IHN0ckJvdW5kICYmICpzdHIgPT0gJyAnKSB7DQorICAgIHN0cisrOw0KKyAgfQ0KKyAgaWYgKHN0ciAhPSBzdHJCb3VuZCAmJiAqc3RyID09ICctJykgew0KKyAgICBuZWdtZXQgPSAxOw0KKyAgICBzdHIrKzsNCisgIH0gZWxzZSBpZiAoc3RyICE9IHN0ckJvdW5kICYmICpzdHIgPT0gJysnKSB7DQorICAgIHN0cisrOw0KKyAgfQ0KKyAgd2hpbGUgKHN0ciAhPSBzdHJCb3VuZCAmJiAoKCpzdHIgPj0gJzAnICYmICpzdHIgPD0gJzknKSB8fCAqc3RyID09ICcuJykgJiYNCisgICAgICAgICBzY2FsZSA8IEZYTUFUSF9ERUNJTUFMX1NDQUxFTElNSVQpIHsNCisgICAgaWYgKCpzdHIgPT0gJy4nKSB7DQorICAgICAgaWYgKHBvaW50bWV0KSB7DQorICAgICAgICBnb3RvIGNvbnQ7DQorICAgICAgfQ0KKyAgICAgIHBvaW50bWV0ID0gMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBtX3VIaSA9IG1fdUhpICogMHhBICsgRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQoKHVpbnQ2NF90KW1fdU1pZCAqIDB4QSk7DQorICAgICAgbV91TWlkID0gbV91TWlkICogMHhBICsgRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQoKHVpbnQ2NF90KW1fdUxvICogMHhBKTsNCisgICAgICBtX3VMbyA9IG1fdUxvICogMHhBICsgKCpzdHIgLSAnMCcpOw0KKyAgICAgIGlmIChwb2ludG1ldCkgew0KKyAgICAgICAgc2NhbGUrKzsNCisgICAgICB9DQorICAgIH0NCisgIGNvbnQ6DQorICAgIHN0cisrOw0KKyAgfQ0KKyAgbV91RmxhZ3MgPSBGWE1BVEhfREVDSU1BTF9NQUtFRkxBR1MobmVnbWV0ICYmIElzTm90WmVybygpLCBzY2FsZSk7DQorfQ0KK0NGWF9EZWNpbWFsOjpDRlhfRGVjaW1hbChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0ck9iaikgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3N0ck9iajsNCisgIHdzdHJPYmouQ29udmVydEZyb20oc3RyT2JqKTsNCisgICp0aGlzID0gQ0ZYX0RlY2ltYWwod3N0ck9iaik7DQorfQ0KK0NGWF9EZWNpbWFsOjpvcGVyYXRvciBDRlhfV2lkZVN0cmluZygpIGNvbnN0IHsNCisgIENGWF9XaWRlU3RyaW5nIHJldFN0cmluZzsNCisgIENGWF9XaWRlU3RyaW5nIHRtcGJ1ZjsNCisgIHVpbnQ2NF90IHBoaSA9IG1fdUhpLCBwbWlkID0gbV91TWlkLCBwbG8gPSBtX3VMbzsNCisgIHdoaWxlIChwaGkgfHwgcG1pZCB8fCBwbG8pIHsNCisgICAgdG1wYnVmICs9IGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9kaXYxMChwaGksIHBtaWQsIHBsbykgKyAnMCc7DQorICB9DQorICB1aW50OF90IG91dHB1dGxlbiA9ICh1aW50OF90KXRtcGJ1Zi5HZXRMZW5ndGgoKTsNCisgIHVpbnQ4X3Qgc2NhbGUgPSAodWludDhfdClGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShtX3VGbGFncyk7DQorICB3aGlsZSAoc2NhbGUgPj0gb3V0cHV0bGVuKSB7DQorICAgIHRtcGJ1ZiArPSAnMCc7DQorICAgIG91dHB1dGxlbisrOw0KKyAgfQ0KKyAgaWYgKEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhtX3VGbGFncykgJiYgSXNOb3RaZXJvKCkpIHsNCisgICAgcmV0U3RyaW5nICs9ICctJzsNCisgIH0NCisgIGZvciAodWludDhfdCBpZHggPSAwOyBpZHggPCBvdXRwdXRsZW47IGlkeCsrKSB7DQorICAgIGlmIChpZHggPT0gKG91dHB1dGxlbiAtIHNjYWxlKSAmJiBzY2FsZSAhPSAwKSB7DQorICAgICAgcmV0U3RyaW5nICs9ICcuJzsNCisgICAgfQ0KKyAgICByZXRTdHJpbmcgKz0gdG1wYnVmW291dHB1dGxlbiAtIDEgLSBpZHhdOw0KKyAgfQ0KKyAgcmV0dXJuIHJldFN0cmluZzsNCit9DQorQ0ZYX0RlY2ltYWw6Om9wZXJhdG9yIGRvdWJsZSgpIGNvbnN0IHsNCisgIGRvdWJsZSBwb3cgPSAoZG91YmxlKSgxIDw8IDE2KSAqICgxIDw8IDE2KTsNCisgIGRvdWJsZSBiYXNlID0NCisgICAgICAoKGRvdWJsZSltX3VIaSkgKiBwb3cgKiBwb3cgKyAoKGRvdWJsZSltX3VNaWQpICogcG93ICsgKChkb3VibGUpbV91TG8pOw0KKyAgaW50OF90IHNjYWxlID0gRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobV91RmxhZ3MpOw0KKyAgRlhfQk9PTCBiTmVnID0gRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKG1fdUZsYWdzKTsNCisgIHJldHVybiAoYk5lZyA/IC0xIDogMSkgKiBiYXNlICogOjpwb3coMTAuMCwgLXNjYWxlKTsNCit9DQordm9pZCBDRlhfRGVjaW1hbDo6U2V0U2NhbGUodWludDhfdCBuZXdzY2FsZSkgew0KKyAgdWludDhfdCBvbGRzY2FsZSA9IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKG1fdUZsYWdzKTsNCisgIGlmIChuZXdzY2FsZSA+IG9sZHNjYWxlKSB7DQorICAgIHVpbnQ2NF90IHBoaSA9IG1fdUhpLCBwbWlkID0gbV91TWlkLCBwbG8gPSBtX3VMbzsNCisgICAgZm9yICh1aW50OF90IGl0ZXIgPSAwOyBpdGVyIDwgbmV3c2NhbGUgLSBvbGRzY2FsZTsgaXRlcisrKSB7DQorICAgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX211bDEwKHBoaSwgcG1pZCwgcGxvKTsNCisgICAgfQ0KKyAgICBtX3VIaSA9ICh1aW50MzJfdClwaGk7DQorICAgIG1fdU1pZCA9ICh1aW50MzJfdClwbWlkOw0KKyAgICBtX3VMbyA9ICh1aW50MzJfdClwbG87DQorICAgIG1fdUZsYWdzID0gRlhNQVRIX0RFQ0lNQUxfTUFLRUZMQUdTKA0KKyAgICAgICAgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKG1fdUZsYWdzKSAmJiBJc05vdFplcm8oKSwgbmV3c2NhbGUpOw0KKyAgfSBlbHNlIGlmIChuZXdzY2FsZSA8IG9sZHNjYWxlKSB7DQorICAgIHVpbnQ2NF90IHBoaSwgcG1pZCwgcGxvOw0KKyAgICBwaGkgPSAwLCBwbWlkID0gMCwgcGxvID0gNTsNCisgICAgew0KKyAgICAgIGZvciAodWludDhfdCBpdGVyID0gMDsgaXRlciA8IG9sZHNjYWxlIC0gbmV3c2NhbGUgLSAxOyBpdGVyKyspIHsNCisgICAgICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9tdWwxMChwaGksIHBtaWQsIHBsbyk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHBoaSArPSBtX3VIaTsNCisgICAgcG1pZCArPSBtX3VNaWQ7DQorICAgIHBsbyArPSBtX3VMbzsNCisgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX25vcm1hbGl6ZShwaGksIHBtaWQsIHBsbyk7DQorICAgIHsNCisgICAgICBmb3IgKHVpbnQ4X3QgaXRlciA9IDA7IGl0ZXIgPCBvbGRzY2FsZSAtIG5ld3NjYWxlOyBpdGVyKyspIHsNCisgICAgICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9kaXYxMChwaGksIHBtaWQsIHBsbyk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIG1fdUhpID0gKHVpbnQzMl90KXBoaTsNCisgICAgbV91TWlkID0gKHVpbnQzMl90KXBtaWQ7DQorICAgIG1fdUxvID0gKHVpbnQzMl90KXBsbzsNCisgICAgbV91RmxhZ3MgPSBGWE1BVEhfREVDSU1BTF9NQUtFRkxBR1MoDQorICAgICAgICBGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobV91RmxhZ3MpICYmIElzTm90WmVybygpLCBuZXdzY2FsZSk7DQorICB9DQorfQ0KK3VpbnQ4X3QgQ0ZYX0RlY2ltYWw6OkdldFNjYWxlKCkgew0KKyAgdWludDhfdCBvbGRzY2FsZSA9IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKG1fdUZsYWdzKTsNCisgIHJldHVybiBvbGRzY2FsZTsNCit9DQordm9pZCBDRlhfRGVjaW1hbDo6U2V0QWJzKCkgew0KKyAgbV91RmxhZ3MgJj0gfkZYTUFUSF9ERUNJTUFMX05FR01BU0s7DQorfQ0KK3ZvaWQgQ0ZYX0RlY2ltYWw6OlNldE5lZ2F0ZSgpIHsNCisgIGlmIChJc05vdFplcm8oKSkgew0KKyAgICBtX3VGbGFncyBePSBGWE1BVEhfREVDSU1BTF9ORUdNQVNLOw0KKyAgfQ0KK30NCit2b2lkIENGWF9EZWNpbWFsOjpGbG9vck9yQ2VpbChGWF9CT09MIGJGbG9vcikgew0KKyAgdWludDY0X3QgbnVtc1szXSA9IHttX3VMbywgbV91TWlkLCBtX3VIaX07DQorICBGWF9CT09MIGJEYXRhTG9zcyA9IEZBTFNFOw0KKyAgZm9yIChpbnQgaSA9IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKG1fdUZsYWdzKTsgaSA+IDA7IGktLSkgew0KKyAgICBiRGF0YUxvc3MgPSBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfZGl2MTBfYW55KG51bXMsIDMpIHx8IGJEYXRhTG9zczsNCisgIH0NCisgIGlmIChiRGF0YUxvc3MgJiYgKGJGbG9vciA/IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhtX3VGbGFncykNCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICFGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobV91RmxhZ3MpKSkgew0KKyAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfaW5jX2FueShudW1zLCAzKTsNCisgIH0NCisgIG1fdUhpID0gKHVpbnQzMl90KW51bXNbMl07DQorICBtX3VNaWQgPSAodWludDMyX3QpbnVtc1sxXTsNCisgIG1fdUxvID0gKHVpbnQzMl90KW51bXNbMF07DQorICBtX3VGbGFncyA9IEZYTUFUSF9ERUNJTUFMX01BS0VGTEFHUygNCisgICAgICBGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobV91RmxhZ3MpICYmIElzTm90WmVybygpLCAwKTsNCit9DQordm9pZCBDRlhfRGVjaW1hbDo6U2V0Rmxvb3IoKSB7DQorICBGbG9vck9yQ2VpbChUUlVFKTsNCit9DQordm9pZCBDRlhfRGVjaW1hbDo6U2V0Q2VpbGluZygpIHsNCisgIEZsb29yT3JDZWlsKEZBTFNFKTsNCit9DQordm9pZCBDRlhfRGVjaW1hbDo6U2V0VHJ1bmNhdGUoKSB7DQorICBGbG9vck9yQ2VpbCghRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKG1fdUZsYWdzKSk7DQorfQ0KK3ZvaWQgQ0ZYX0RlY2ltYWw6OlN3YXAoQ0ZYX0RlY2ltYWwmIHZhbCkgew0KKyAgdWludDMyX3QgdG1wOw0KKyAgdG1wID0gbV91SGk7DQorICBtX3VIaSA9IHZhbC5tX3VIaTsNCisgIHZhbC5tX3VIaSA9IHRtcDsNCisgIHRtcCA9IG1fdU1pZDsNCisgIG1fdU1pZCA9IHZhbC5tX3VNaWQ7DQorICB2YWwubV91TWlkID0gdG1wOw0KKyAgdG1wID0gbV91TG87DQorICBtX3VMbyA9IHZhbC5tX3VMbzsNCisgIHZhbC5tX3VMbyA9IHRtcDsNCisgIHRtcCA9IG1fdUZsYWdzOw0KKyAgbV91RmxhZ3MgPSB2YWwubV91RmxhZ3M7DQorICB2YWwubV91RmxhZ3MgPSB0bXA7DQorfQ0KK2ludDhfdCBDRlhfRGVjaW1hbDo6Q29tcGFyZShjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdCB7DQorICBDRlhfRGVjaW1hbCBsaHMgPSAqdGhpcywgcmhzID0gdmFsOw0KKyAgaW50OF90IHJldFZhbCA9IDA7DQorICBpZiAoRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobGhzLm1fdUZsYWdzKSAhPQ0KKyAgICAgIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKHJocy5tX3VGbGFncykpIHsNCisgICAgdWludDhfdCBzY2FsZSA9IHN0ZDo6bWluKEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKGxocy5tX3VGbGFncyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShyaHMubV91RmxhZ3MpKTsNCisgICAgbGhzLlNldFNjYWxlKHNjYWxlKTsNCisgICAgcmhzLlNldFNjYWxlKHNjYWxlKTsNCisgIH0NCisgIHJldFZhbCA9IC0oRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKGxocy5tX3VGbGFncykgLQ0KKyAgICAgICAgICAgICBGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcocmhzLm1fdUZsYWdzKSk7DQorICBpZiAocmV0VmFsKSB7DQorICAgIHJldHVybiByZXRWYWw7DQorICB9DQorICByZXRWYWwgPSBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfcmF3X2NvbXBhcmUobGhzLm1fdUhpLCBsaHMubV91TWlkLCBsaHMubV91TG8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmhzLm1fdUhpLCByaHMubV91TWlkLCByaHMubV91TG8pOw0KKyAgcmV0dXJuIChGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobGhzLm1fdUZsYWdzKSA/IC1yZXRWYWwgOiByZXRWYWwpOw0KK30NCitDRlhfRGVjaW1hbCBDRlhfRGVjaW1hbDo6QWRkT3JNaW51cyhjb25zdCBDRlhfRGVjaW1hbCYgdmFsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNBZGRpbmcpIGNvbnN0IHsNCisgIENGWF9EZWNpbWFsIGxocyA9ICp0aGlzLCByaHMgPSB2YWw7DQorICBpZiAoRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobGhzLm1fdUZsYWdzKSAhPQ0KKyAgICAgIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKHJocy5tX3VGbGFncykpIHsNCisgICAgdWludDhfdCBzY2FsZSA9IHN0ZDo6bWF4KEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKGxocy5tX3VGbGFncyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShyaHMubV91RmxhZ3MpKTsNCisgICAgbGhzLlNldFNjYWxlKHNjYWxlKTsNCisgICAgcmhzLlNldFNjYWxlKHNjYWxlKTsNCisgIH0NCisgIGlmICghaXNBZGRpbmcpIHsNCisgICAgcmhzLlNldE5lZ2F0ZSgpOw0KKyAgfQ0KKyAgRlhfQk9PTCBkb1Jhd0FkZCA9IChGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobGhzLm1fdUZsYWdzKSA9PQ0KKyAgICAgICAgICAgICAgICAgICAgICBGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcocmhzLm1fdUZsYWdzKSk7DQorICBpZiAoZG9SYXdBZGQpIHsNCisgICAgdWludDY0X3QgcGhpID0gbGhzLm1fdUhpLCBwbWlkID0gbGhzLm1fdU1pZCwgcGxvID0gbGhzLm1fdUxvOw0KKyAgICBwaGkgKz0gcmhzLm1fdUhpOw0KKyAgICBwbWlkICs9IHJocy5tX3VNaWQ7DQorICAgIHBsbyArPSByaHMubV91TG87DQorICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9ub3JtYWxpemUocGhpLCBwbWlkLCBwbG8pOw0KKyAgICBpZiAoRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQocGhpKSAmJg0KKyAgICAgICAgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobGhzLm1fdUZsYWdzKSAhPSAwKSB7DQorICAgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX2RpdjEwKHBoaSwgcG1pZCwgcGxvKTsNCisgICAgICBsaHMubV91RmxhZ3MgPSBGWE1BVEhfREVDSU1BTF9NQUtFRkxBR1MoDQorICAgICAgICAgIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhsaHMubV91RmxhZ3MpLA0KKyAgICAgICAgICBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShsaHMubV91RmxhZ3MpIC0gMSk7DQorICAgIH0NCisgICAgbGhzLm1fdUhpID0gKHVpbnQzMl90KXBoaTsNCisgICAgbGhzLm1fdU1pZCA9ICh1aW50MzJfdClwbWlkOw0KKyAgICBsaHMubV91TG8gPSAodWludDMyX3QpcGxvOw0KKyAgICByZXR1cm4gbGhzOw0KKyAgfSBlbHNlIHsNCisgICAgaWYgKGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9yYXdfY29tcGFyZShsaHMubV91SGksIGxocy5tX3VNaWQsIGxocy5tX3VMbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaHMubV91SGksIHJocy5tX3VNaWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmhzLm1fdUxvKSA8IDApIHsNCisgICAgICBsaHMuU3dhcChyaHMpOw0KKyAgICB9DQorICAgIGxocy5tX3VIaSAtPSByaHMubV91SGk7DQorICAgIGlmIChsaHMubV91TWlkIDwgcmhzLm1fdU1pZCkgew0KKyAgICAgIGxocy5tX3VIaS0tOw0KKyAgICB9DQorICAgIGxocy5tX3VNaWQgLT0gcmhzLm1fdU1pZDsNCisgICAgaWYgKGxocy5tX3VMbyA8IHJocy5tX3VMbykgew0KKyAgICAgIGlmICghbGhzLm1fdU1pZCkgew0KKyAgICAgICAgbGhzLm1fdUhpLS07DQorICAgICAgfQ0KKyAgICAgIGxocy5tX3VNaWQtLTsNCisgICAgfQ0KKyAgICBsaHMubV91TG8gLT0gcmhzLm1fdUxvOw0KKyAgICByZXR1cm4gbGhzOw0KKyAgfQ0KK30NCitDRlhfRGVjaW1hbCBDRlhfRGVjaW1hbDo6TXVsdGlwbHkoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Qgew0KKyAgdWludDY0X3QgYVszXSA9IHttX3VMbywgbV91TWlkLCBtX3VIaX0sDQorICAgICAgICAgICBiWzNdID0ge3ZhbC5tX3VMbywgdmFsLm1fdU1pZCwgdmFsLm1fdUhpfTsNCisgIHVpbnQ2NF90IGNbNl07DQorICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfcmF3X211bChhLCAzLCBiLCAzLCBjLCA2KTsNCisgIEZYX0JPT0wgbmVnID0gRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKG1fdUZsYWdzKSBeDQorICAgICAgICAgICAgICAgIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyh2YWwubV91RmxhZ3MpOw0KKyAgdWludDhfdCBzY2FsZSA9IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKG1fdUZsYWdzKSArDQorICAgICAgICAgICAgICAgICAgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUodmFsLm1fdUZsYWdzKTsNCisgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9zaHJpbmtpbnRvcmFuZ2UoYywgNiwgMywgc2NhbGUpOw0KKyAgcmV0dXJuIENGWF9EZWNpbWFsKCh1aW50MzJfdCljWzBdLCAodWludDMyX3QpY1sxXSwgKHVpbnQzMl90KWNbMl0sIG5lZywNCisgICAgICAgICAgICAgICAgICAgICBzY2FsZSk7DQorfQ0KK0NGWF9EZWNpbWFsIENGWF9EZWNpbWFsOjpEaXZpZGUoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Qgew0KKyAgaWYgKCF2YWwuSXNOb3RaZXJvKCkpIHsNCisgICAgcmV0dXJuIENGWF9EZWNpbWFsKCk7DQorICB9DQorICBGWF9CT09MIG5lZyA9IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhtX3VGbGFncykgXg0KKyAgICAgICAgICAgICAgICBGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcodmFsLm1fdUZsYWdzKTsNCisgIHVpbnQ2NF90IGFbN10gPSB7bV91TG8sIG1fdU1pZCwgbV91SGl9LA0KKyAgICAgICAgICAgYlszXSA9IHt2YWwubV91TG8sIHZhbC5tX3VNaWQsIHZhbC5tX3VIaX0sIGNbN10gPSB7MH07DQorICB1aW50OF90IHNjYWxlID0gMDsNCisgIGlmIChGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShtX3VGbGFncykgPA0KKyAgICAgIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKHZhbC5tX3VGbGFncykpIHsNCisgICAgZm9yIChpbnQgaSA9IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKHZhbC5tX3VGbGFncykgLQ0KKyAgICAgICAgICAgICAgICAgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobV91RmxhZ3MpOw0KKyAgICAgICAgIGkgPiAwOyBpLS0pIHsNCisgICAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbXVsMTBfYW55KGEsIDcpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBzY2FsZSA9IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKG1fdUZsYWdzKSAtDQorICAgICAgICAgICAgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUodmFsLm1fdUZsYWdzKTsNCisgIH0NCisgIHVpbnQ4X3QgbWluc2NhbGUgPSBzY2FsZTsNCisgIGlmICghSXNOb3RaZXJvKCkpIHsNCisgICAgcmV0dXJuIENGWF9EZWNpbWFsKDAsIDAsIDAsIDAsIG1pbnNjYWxlKTsNCisgIH0NCisgIHdoaWxlICghYVs2XSkgew0KKyAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbXVsMTBfYW55KGEsIDcpOw0KKyAgICBzY2FsZSsrOw0KKyAgfQ0KKyAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX2RpdjEwX2FueShhLCA3KTsNCisgIHNjYWxlLS07DQorICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfcmF3X2RpdihhLCA2LCBiLCAzLCBjLCA3KTsNCisgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9zaHJpbmtpbnRvcmFuZ2UoYywgNiwgMywgc2NhbGUpOw0KKyAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX3RydW5jYXRlKGNbMl0sIGNbMV0sIGNbMF0sIHNjYWxlLCBtaW5zY2FsZSk7DQorICByZXR1cm4gQ0ZYX0RlY2ltYWwoKHVpbnQzMl90KWNbMF0sICh1aW50MzJfdCljWzFdLCAodWludDMyX3QpY1syXSwgbmVnLA0KKyAgICAgICAgICAgICAgICAgICAgIHNjYWxlKTsNCit9DQorQ0ZYX0RlY2ltYWwgQ0ZYX0RlY2ltYWw6Ok1vZHVsdXMoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Qgew0KKyAgQ0ZYX0RlY2ltYWwgbGhzID0gKnRoaXMsIHJoc19hYnMgPSB2YWw7DQorICByaHNfYWJzLlNldEFicygpOw0KKyAgaWYgKCFyaHNfYWJzLklzTm90WmVybygpKSB7DQorICAgIHJldHVybiAqdGhpczsNCisgIH0NCisgIHdoaWxlIChUUlVFKSB7DQorICAgIENGWF9EZWNpbWFsIGxoc19hYnMgPSBsaHM7DQorICAgIGxoc19hYnMuU2V0QWJzKCk7DQorICAgIGlmIChsaHNfYWJzIDwgcmhzX2Ficykgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIENGWF9EZWNpbWFsIHF1b3QgPSBsaHMgLyByaHNfYWJzOw0KKyAgICBxdW90LlNldFRydW5jYXRlKCk7DQorICAgIGxocyA9IGxocyAtIHF1b3QgKiByaHNfYWJzOw0KKyAgfQ0KKyAgcmV0dXJuIGxoczsNCit9DQorRlhfQk9PTCBDRlhfRGVjaW1hbDo6b3BlcmF0b3I9PShjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdCB7DQorICByZXR1cm4gQ29tcGFyZSh2YWwpID09IDA7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0RlY2ltYWw6Om9wZXJhdG9yPD0oY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Qgew0KKyAgcmV0dXJuIENvbXBhcmUodmFsKSA8PSAwOw0KK30NCitGWF9CT09MIENGWF9EZWNpbWFsOjpvcGVyYXRvcj49KGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0IHsNCisgIHJldHVybiBDb21wYXJlKHZhbCkgPj0gMDsNCit9DQorRlhfQk9PTCBDRlhfRGVjaW1hbDo6b3BlcmF0b3IhPShjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdCB7DQorICByZXR1cm4gQ29tcGFyZSh2YWwpICE9IDA7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0RlY2ltYWw6Om9wZXJhdG9yPChjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdCB7DQorICByZXR1cm4gQ29tcGFyZSh2YWwpIDwgMDsNCit9DQorRlhfQk9PTCBDRlhfRGVjaW1hbDo6b3BlcmF0b3I+KGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0IHsNCisgIHJldHVybiBDb21wYXJlKHZhbCkgPiAwOw0KK30NCitDRlhfRGVjaW1hbCBDRlhfRGVjaW1hbDo6b3BlcmF0b3IrKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0IHsNCisgIHJldHVybiBBZGRPck1pbnVzKHZhbCwgVFJVRSk7DQorfQ0KK0NGWF9EZWNpbWFsIENGWF9EZWNpbWFsOjpvcGVyYXRvci0oY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Qgew0KKyAgcmV0dXJuIEFkZE9yTWludXModmFsLCBGQUxTRSk7DQorfQ0KK0NGWF9EZWNpbWFsIENGWF9EZWNpbWFsOjpvcGVyYXRvciooY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Qgew0KKyAgcmV0dXJuIE11bHRpcGx5KHZhbCk7DQorfQ0KK0NGWF9EZWNpbWFsIENGWF9EZWNpbWFsOjpvcGVyYXRvci8oY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Qgew0KKyAgcmV0dXJuIERpdmlkZSh2YWwpOw0KK30NCitDRlhfRGVjaW1hbCBDRlhfRGVjaW1hbDo6b3BlcmF0b3IlKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0IHsNCisgIHJldHVybiBNb2R1bHVzKHZhbCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZmdhcy9zcmMvbG9jYWxpemF0aW9uL2Z4X2xvY2FsZWltcC5oIGIveGZhL3NyYy9mZ2FzL3NyYy9sb2NhbGl6YXRpb24vZnhfbG9jYWxlaW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmViYmFhOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvbG9jYWxpemF0aW9uL2Z4X2xvY2FsZWltcC5oCkBAIC0wLDAgKzEsMTE2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYX0xPQ0FMRV9JTVBfSF8NCisjZGVmaW5lIF9GWF9MT0NBTEVfSU1QX0hfDQorY2xhc3MgQ0ZYX0xDTnVtZXJpYzsNCitjbGFzcyBDRlhfTG9jYWxlIDogcHVibGljIElGWF9Mb2NhbGUgew0KKyBwdWJsaWM6DQorICBDRlhfTG9jYWxlKENYTUxfRWxlbWVudCogcExvY2FsZURhdGEpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorDQorICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIEdldE5hbWUoKTsNCisgIHZpcnR1YWwgdm9pZCBHZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0wgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTnVtU3ltYm9sKSBjb25zdDsNCisNCisgIHZpcnR1YWwgdm9pZCBHZXREYXRlVGltZVN5bWJvbHMoQ0ZYX1dpZGVTdHJpbmcmIHdzRHRTeW1ib2wpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEdldE1vbnRoTmFtZShpbnQzMl90IG5Nb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTW9udGhOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBYmJyID0gVFJVRSkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0RGF5TmFtZShpbnQzMl90IG5XZWVrLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF5TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFiYnIgPSBUUlVFKSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBHZXRNZXJpZGllbU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzTWVyaWRpZW1OYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBTSA9IFRSVUUpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEdldFRpbWVab25lKEZYX1RJTUVaT05FJiB0eikgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0RXJhTmFtZShDRlhfV2lkZVN0cmluZyYgd3NFcmFOYW1lLCBGWF9CT09MIGJBRCA9IFRSVUUpIGNvbnN0Ow0KKw0KKyAgdmlydHVhbCB2b2lkIEdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBHZXROdW1QYXR0ZXJuKEZYX0xPQ0FMRU5VTVNVQkNBVEVHT1JZIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Q7DQorDQorIHByb3RlY3RlZDoNCisgIHZpcnR1YWwgfkNGWF9Mb2NhbGUoKTsNCisgIENYTUxfRWxlbWVudCogbV9wRWxlbWVudDsNCit9Ow0KK2NsYXNzIENGWF9Gb3JtYXRTdHJpbmcgOiBwdWJsaWMgSUZYX0Zvcm1hdFN0cmluZyB7DQorIHB1YmxpYzoNCisgIENGWF9Gb3JtYXRTdHJpbmcoSUZYX0xvY2FsZU1nciogcExvY2FsZU1nciwgRlhfQk9PTCBiVXNlTENJRCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisNCisgIHZpcnR1YWwgdm9pZCBTcGxpdEZvcm1hdFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXRTdHJpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdBcnJheSYgd3NQYXR0ZXJucyk7DQorICB2aXJ0dWFsIEZYX0xPQ0FMRUNBVEVHT1JZIEdldENhdGVnb3J5KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pOw0KKyAgdmlydHVhbCBGWF9XT1JEIEdldExDSUQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybik7DQorICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIEdldExvY2FsZU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybik7DQorICB2aXJ0dWFsIEZYX0JPT0wgUGFyc2VUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBQYXJzZU51bShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNOdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZlZhbHVlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBQYXJzZU51bShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNOdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUGFyc2VEYXRlVGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNEYXRlVGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EQVRFVElNRVRZUEUgZURhdGVUaW1lVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Vbml0aW1lJiBkdFZhbHVlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBQYXJzZVplcm8oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybik7DQorICB2aXJ0dWFsIEZYX0JPT0wgUGFyc2VOdWxsKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pOw0KKyAgdmlydHVhbCBGWF9CT09MIEZvcm1hdFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIEZvcm1hdE51bShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNOdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRm9ybWF0TnVtKEZYX0ZMT0FUIGZOdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRm9ybWF0RGF0ZVRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjRGF0ZVRpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIEZvcm1hdERhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY0RhdGVUaW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RBVEVUSU1FVFlQRSBlRGF0ZVRpbWVUeXBlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBGb3JtYXREYXRlVGltZShjb25zdCBDRlhfVW5pdGltZSYgZHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIEZvcm1hdFplcm8oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRm9ybWF0TnVsbChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdmlydHVhbCB+Q0ZYX0Zvcm1hdFN0cmluZygpOw0KKyAgSUZYX0xvY2FsZSogR2V0VGV4dEZvcm1hdChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2F0ZWdvcnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1B1cmdlUGF0dGVybik7DQorICBJRlhfTG9jYWxlKiBHZXROdW1lcmljRm9ybWF0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlEb3RJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQmIGR3U3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1B1cmdlUGF0dGVybik7DQorICBGWF9CT09MIEZvcm1hdFN0ck51bShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzSW5wdXROdW0sDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KTsNCisgIEZYX0JPT0wgRm9ybWF0TENOdW1lcmljKENGWF9MQ051bWVyaWMmIGxjTnVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCk7DQorICBGWF9EQVRFVElNRVRZUEUgR2V0RGF0ZVRpbWVGb3JtYXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiYgcExvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NEYXRlUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NUaW1lUGF0dGVybik7DQorICBJRlhfTG9jYWxlKiBHZXRQYXR0ZXJuTG9jYWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMb2NhbGUpOw0KKyAgSUZYX0xvY2FsZU1nciogbV9wTG9jYWxlTWdyOw0KKyAgRlhfQk9PTCBtX2JVc2VMQ0lEOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9mZ2FzL3NyYy9sb2NhbGl6YXRpb24vZnhfbG9jYWxlbWdyLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMvbG9jYWxpemF0aW9uL2Z4X2xvY2FsZW1nci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VhNjgxYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMvbG9jYWxpemF0aW9uL2Z4X2xvY2FsZW1nci5jcHAKQEAgLTAsMCArMSw5NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3htbC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZnYXMvc3JjL2ZnYXNfYmFzZS5oIg0KKyNpbmNsdWRlICJmeF9sb2NhbGVtZ3IuaCINCisNCitJRlhfTG9jYWxlTWdyKiBGWF9Mb2NhbGVNZ3JfQ3JlYXRlKGNvbnN0IEZYX1dDSEFSKiBwc3pMb2NhbFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdEZWZhdWx0TENJRCkgew0KKyAgdm9pZCogcFBhdGhIYW5kbGUgPSBGWF9PcGVuRm9sZGVyKHBzekxvY2FsUGF0aCk7DQorICBpZiAoIXBQYXRoSGFuZGxlKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0ZYX0xvY2FsZU1nciogcExvY2FsZU1nciA9IG5ldyBDRlhfTG9jYWxlTWdyKHdEZWZhdWx0TENJRCk7DQorICBDRlhfV2lkZVN0cmluZyB3c0ZpbGVOYW1lOw0KKyAgRlhfQk9PTCBiRm9sZGVyID0gRkFMU0U7DQorICB3aGlsZSAoRlhfR2V0TmV4dEZpbGUocFBhdGhIYW5kbGUsIHdzRmlsZU5hbWUsIGJGb2xkZXIpKSB7DQorICAgIGlmICghYkZvbGRlcikgew0KKyAgICAgIGlmICh3c0ZpbGVOYW1lLkdldExlbmd0aCgpIDwgNCkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzRXh0ID0gd3NGaWxlTmFtZS5SaWdodCg0KTsNCisgICAgICB3c0V4dC5NYWtlTG93ZXIoKTsNCisgICAgICBpZiAod3NFeHQgIT0gTCIueG1sIikgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzRnVsbFBhdGgocHN6TG9jYWxQYXRoKTsNCisgICAgICB3c0Z1bGxQYXRoICs9IEwiXFwiICsgd3NGaWxlTmFtZTsNCisgICAgICBJRlhfRmlsZVJlYWQqIHBSZWFkID0gRlhfQ3JlYXRlRmlsZVJlYWQod3NGdWxsUGF0aCk7DQorICAgICAgaWYgKCFwUmVhZCkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIENYTUxfRWxlbWVudCogcFhtbExvY2FsZSA9IENYTUxfRWxlbWVudDo6UGFyc2UocFJlYWQpOw0KKyAgICAgIHBSZWFkLT5SZWxlYXNlKCk7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNzcCA9IHBYbWxMb2NhbGUtPkdldE5hbWVzcGFjZSgpOw0KKyAgICAgIGlmIChic3NwID09ICJodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tL2xvY2FsaXphdGlvbiIpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTENJRCA9IHBYbWxMb2NhbGUtPkdldEF0dHJWYWx1ZSgiIiwgImxjaWQiKTsNCisgICAgICAgIHdjaGFyX3QqIHBFbmQgPSBOVUxMOw0KKyAgICAgICAgRlhfRFdPUkQgZHdMQ0lEID0gd2NzdG9sKHdzTENJRCwgJnBFbmQsIDE2KTsNCisgICAgICAgIGlmIChwTG9jYWxlTWdyLT5tX2xjaWQyeG1sLkdldFZhbHVlQXQoKHZvaWQqKSh1aW50cHRyX3QpZHdMQ0lEKSkgew0KKyAgICAgICAgICBkZWxldGUgcFhtbExvY2FsZTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHBMb2NhbGVNZ3ItPm1fbGNpZDJ4bWwuU2V0QXQoKHZvaWQqKSh1aW50cHRyX3QpZHdMQ0lELCBwWG1sTG9jYWxlKTsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgZGVsZXRlIHBYbWxMb2NhbGU7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBGWF9DbG9zZUZvbGRlcihwUGF0aEhhbmRsZSk7DQorICByZXR1cm4gcExvY2FsZU1ncjsNCit9DQorQ0ZYX0xvY2FsZU1ncjo6Q0ZYX0xvY2FsZU1ncihGWF9XT1JEIHdEZWZMQ0lEKSA6IG1fd0RlZkxDSUQod0RlZkxDSUQpIHt9DQorQ0ZYX0xvY2FsZU1ncjo6fkNGWF9Mb2NhbGVNZ3IoKSB7DQorICBGWF9QT1NJVElPTiBwcyA9IG1fbGNpZDJsb2NhbGUuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBzKSB7DQorICAgIHZvaWQqIHBsY2lkOw0KKyAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gTlVMTDsNCisgICAgbV9sY2lkMmxvY2FsZS5HZXROZXh0QXNzb2MocHMsIHBsY2lkLCAodm9pZComKXBMb2NhbGUpOw0KKyAgICBwTG9jYWxlLT5SZWxlYXNlKCk7DQorICB9DQorICBtX2xjaWQybG9jYWxlLlJlbW92ZUFsbCgpOw0KKyAgcHMgPSBtX2xjaWQyeG1sLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChwcykgew0KKyAgICB2b2lkKiBwbGNpZDsNCisgICAgQ1hNTF9FbGVtZW50KiBweG1sID0gTlVMTDsNCisgICAgbV9sY2lkMnhtbC5HZXROZXh0QXNzb2MocHMsIHBsY2lkLCAodm9pZComKXB4bWwpOw0KKyAgICBkZWxldGUgcHhtbDsNCisgIH0NCisgIG1fbGNpZDJ4bWwuUmVtb3ZlQWxsKCk7DQorfQ0KK0ZYX1dPUkQgQ0ZYX0xvY2FsZU1ncjo6R2V0RGVmTG9jYWxlSUQoKSB7DQorICByZXR1cm4gbV93RGVmTENJRDsNCit9DQorSUZYX0xvY2FsZSogQ0ZYX0xvY2FsZU1ncjo6R2V0RGVmTG9jYWxlKCkgew0KKyAgcmV0dXJuIEdldExvY2FsZShtX3dEZWZMQ0lEKTsNCit9DQorSUZYX0xvY2FsZSogQ0ZYX0xvY2FsZU1ncjo6R2V0TG9jYWxlKEZYX1dPUkQgbGNpZCkgew0KKyAgSUZYX0xvY2FsZSogcExvY2FsZSA9DQorICAgICAgKElGWF9Mb2NhbGUqKW1fbGNpZDJsb2NhbGUuR2V0VmFsdWVBdCgodm9pZCopKHVpbnRwdHJfdClsY2lkKTsNCisgIGlmICghcExvY2FsZSkgew0KKyAgICBDWE1MX0VsZW1lbnQqIHB4bWwgPQ0KKyAgICAgICAgKENYTUxfRWxlbWVudCopbV9sY2lkMnhtbC5HZXRWYWx1ZUF0KCh2b2lkKikodWludHB0cl90KWxjaWQpOw0KKyAgICBpZiAocHhtbCkgew0KKyAgICAgIHBMb2NhbGUgPSBJRlhfTG9jYWxlOjpDcmVhdGUocHhtbCk7DQorICAgICAgbV9sY2lkMmxvY2FsZS5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClsY2lkLCBwTG9jYWxlKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHBMb2NhbGU7DQorfQ0KK0lGWF9Mb2NhbGUqIENGWF9Mb2NhbGVNZ3I6OkdldExvY2FsZUJ5TmFtZSgNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0xvY2FsZU5hbWUpIHsNCisgIHJldHVybiBOVUxMOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL2xvY2FsaXphdGlvbi9meF9sb2NhbGVtZ3IuaCBiL3hmYS9zcmMvZmdhcy9zcmMvbG9jYWxpemF0aW9uL2Z4X2xvY2FsZW1nci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhM2U5MGUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL2xvY2FsaXphdGlvbi9meF9sb2NhbGVtZ3IuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYX0xPQ0FMRU1HUl9JTVBfSF8NCisjZGVmaW5lIF9GWF9MT0NBTEVNR1JfSU1QX0hfDQorY2xhc3MgQ0ZYX0xvY2FsZU1nciA6IHB1YmxpYyBJRlhfTG9jYWxlTWdyIHsNCisgcHVibGljOg0KKyAgQ0ZYX0xvY2FsZU1ncihGWF9XT1JEIHdEZWZMQ0lEKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKyAgdmlydHVhbCBGWF9XT1JEIEdldERlZkxvY2FsZUlEKCk7DQorICB2aXJ0dWFsIElGWF9Mb2NhbGUqIEdldERlZkxvY2FsZSgpOw0KKyAgdmlydHVhbCBJRlhfTG9jYWxlKiBHZXRMb2NhbGUoRlhfV09SRCBsY2lkKTsNCisgIHZpcnR1YWwgSUZYX0xvY2FsZSogR2V0TG9jYWxlQnlOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMb2NhbGVOYW1lKTsNCisgIENGWF9NYXBQdHJUb1B0ciBtX2xjaWQyeG1sOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB+Q0ZYX0xvY2FsZU1ncigpOw0KKyAgQ0ZYX01hcFB0clRvUHRyIG1fbGNpZDJsb2NhbGU7DQorICBGWF9XT1JEIG1fd0RlZkxDSUQ7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL3htbC9meF9zYXhfaW1wLmNwcCBiL3hmYS9zcmMvZmdhcy9zcmMveG1sL2Z4X3NheF9pbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiM2NjNzcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2ZnYXMvc3JjL3htbC9meF9zYXhfaW1wLmNwcApAQCAtMCwwICsxLDY4OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSA8YWxnb3JpdGhtPg0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZnYXMvc3JjL2ZnYXNfYmFzZS5oIg0KKyNpbmNsdWRlICJmeF9zYXhfaW1wLmgiDQorDQorbmFtZXNwYWNlIHsNCisNCitjb25zdCBGWF9EV09SRCBrU2F4RmlsZUJ1ZlNpemUgPSAzMjc2ODsNCisNCit9ICAvLyBuYW1lc3BhY2UNCisNCitJRlhfU0FYUmVhZGVyKiBGWF9TQVhSZWFkZXJfQ3JlYXRlKCkgew0KKyAgcmV0dXJuIG5ldyBDRlhfU0FYUmVhZGVyOw0KK30NCitDRlhfU0FYRmlsZTo6Q0ZYX1NBWEZpbGUoKQ0KKyAgICA6IG1fcEZpbGUoTlVMTCksDQorICAgICAgbV9kd1N0YXJ0KDApLA0KKyAgICAgIG1fZHdFbmQoMCksDQorICAgICAgbV9kd0N1cigwKSwNCisgICAgICBtX3BCdWYoTlVMTCksDQorICAgICAgbV9kd0J1ZlNpemUoMCksDQorICAgICAgbV9kd0J1ZkluZGV4KDApIHt9DQorRlhfQk9PTCBDRlhfU0FYRmlsZTo6U3RhcnRGaWxlKElGWF9GaWxlUmVhZCogcEZpbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TGVuKSB7DQorICBGWFNZU19hc3NlcnQobV9wRmlsZSA9PSBOVUxMICYmIHBGaWxlICE9IE5VTEwpOw0KKyAgRlhfRFdPUkQgZHdTaXplID0gcEZpbGUtPkdldFNpemUoKTsNCisgIGlmIChkd1N0YXJ0ID49IGR3U2l6ZSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoZHdMZW4gPT0gLTEgfHwgZHdTdGFydCArIGR3TGVuID4gZHdTaXplKSB7DQorICAgIGR3TGVuID0gZHdTaXplIC0gZHdTdGFydDsNCisgIH0NCisgIGlmIChkd0xlbiA9PSAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIG1fZHdCdWZTaXplID0gc3RkOjptaW4oZHdMZW4sIGtTYXhGaWxlQnVmU2l6ZSk7DQorICBtX3BCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBtX2R3QnVmU2l6ZSk7DQorICBpZiAoIXBGaWxlLT5SZWFkQmxvY2sobV9wQnVmLCBkd1N0YXJ0LCBtX2R3QnVmU2l6ZSkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9kd1N0YXJ0ID0gZHdTdGFydDsNCisgIG1fZHdFbmQgPSBkd1N0YXJ0ICsgZHdMZW47DQorICBtX2R3Q3VyID0gZHdTdGFydDsNCisgIG1fcEZpbGUgPSBwRmlsZTsNCisgIG1fZHdCdWZJbmRleCA9IDA7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhfU0FYRmlsZTo6UmVhZE5leHRCbG9jaygpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BGaWxlICE9IE5VTEwpOw0KKyAgRlhfRFdPUkQgZHdTaXplID0gbV9kd0VuZCAtIG1fZHdDdXI7DQorICBpZiAoZHdTaXplID09IDApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9kd0J1ZlNpemUgPSBzdGQ6Om1pbihkd1NpemUsIGtTYXhGaWxlQnVmU2l6ZSk7DQorICBpZiAoIW1fcEZpbGUtPlJlYWRCbG9jayhtX3BCdWYsIG1fZHdDdXIsIG1fZHdCdWZTaXplKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX2R3QnVmSW5kZXggPSAwOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZYX1NBWEZpbGU6OlJlc2V0KCkgew0KKyAgaWYgKG1fcEJ1Zikgew0KKyAgICBGWF9GcmVlKG1fcEJ1Zik7DQorICAgIG1fcEJ1ZiA9IE5VTEw7DQorICB9DQorICBtX3BGaWxlID0gTlVMTDsNCit9DQorQ0ZYX1NBWFJlYWRlcjo6Q0ZYX1NBWFJlYWRlcigpDQorICAgIDogbV9GaWxlKCksDQorICAgICAgbV9wSGFuZGxlcihudWxscHRyKSwNCisgICAgICBtX2lTdGF0ZSgtMSksDQorICAgICAgbV9wUm9vdChudWxscHRyKSwNCisgICAgICBtX3BDdXJJdGVtKG51bGxwdHIpLA0KKyAgICAgIG1fZHdJdGVtSUQoMCksDQorICAgICAgbV9pRGF0YVNpemUoMjU2KSwNCisgICAgICBtX2lOYW1lU2l6ZSgyNTYpLA0KKyAgICAgIG1fZHdQYXJzZU1vZGUoMCksDQorICAgICAgbV9wQ29tbWVudENvbnRleHQobnVsbHB0cikgew0KKyAgbV9wc3pEYXRhID0gRlhfQWxsb2ModWludDhfdCwgbV9pRGF0YVNpemUpOw0KKyAgbV9wc3pOYW1lID0gRlhfQWxsb2ModWludDhfdCwgbV9pTmFtZVNpemUpOw0KK30NCitDRlhfU0FYUmVhZGVyOjp+Q0ZYX1NBWFJlYWRlcigpIHsNCisgIFJlc2V0KCk7DQorICBpZiAobV9wc3pEYXRhKSB7DQorICAgIEZYX0ZyZWUobV9wc3pEYXRhKTsNCisgICAgbV9wc3pEYXRhID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3Bzek5hbWUpIHsNCisgICAgRlhfRnJlZShtX3Bzek5hbWUpOw0KKyAgICBtX3Bzek5hbWUgPSBOVUxMOw0KKyAgfQ0KK30NCit2b2lkIENGWF9TQVhSZWFkZXI6OlJlc2V0KCkgew0KKyAgbV9GaWxlLlJlc2V0KCk7DQorICBDRlhfU0FYSXRlbSogcEl0ZW0gPSBtX3BSb290Ow0KKyAgd2hpbGUgKHBJdGVtKSB7DQorICAgIENGWF9TQVhJdGVtKiBwTmV4dCA9IHBJdGVtLT5tX3BOZXh0Ow0KKyAgICBkZWxldGUgcEl0ZW07DQorICAgIHBJdGVtID0gcE5leHQ7DQorICB9DQorICBtX3BSb290ID0gTlVMTDsNCisgIG1fcEN1ckl0ZW0gPSBOVUxMOw0KKyAgbV9kd0l0ZW1JRCA9IDA7DQorICBtX1NraXBTdGFjay5SZW1vdmVBbGwoKTsNCisgIG1fU2tpcENoYXIgPSAwOw0KKyAgbV9pRGF0YUxlbmd0aCA9IDA7DQorICBtX2lFbnRpdHlTdGFydCA9IC0xOw0KKyAgbV9pTmFtZUxlbmd0aCA9IDA7DQorICBtX2lEYXRhUG9zID0gMDsNCisgIGlmIChtX3BDb21tZW50Q29udGV4dCkgew0KKyAgICBkZWxldGUgbV9wQ29tbWVudENvbnRleHQ7DQorICAgIG1fcENvbW1lbnRDb250ZXh0ID0gTlVMTDsNCisgIH0NCit9DQoraW5saW5lIHZvaWQgQ0ZYX1NBWFJlYWRlcjo6UHVzaCgpIHsNCisgIENGWF9TQVhJdGVtKiBwTmV3ID0gbmV3IENGWF9TQVhJdGVtOw0KKyAgcE5ldy0+bV9kd0lEID0gKyttX2R3SXRlbUlEOw0KKyAgcE5ldy0+bV9iU2tpcCA9IG1fcEN1ckl0ZW0tPm1fYlNraXA7DQorICBwTmV3LT5tX3BQcmV2ID0gbV9wQ3VySXRlbTsNCisgIG1fcEN1ckl0ZW0tPm1fcE5leHQgPSBwTmV3Ow0KKyAgbV9wQ3VySXRlbSA9IHBOZXc7DQorfQ0KK2lubGluZSB2b2lkIENGWF9TQVhSZWFkZXI6OlBvcCgpIHsNCisgIGlmICghbV9wQ3VySXRlbSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfU0FYSXRlbSogcFByZXYgPSBtX3BDdXJJdGVtLT5tX3BQcmV2Ow0KKyAgcFByZXYtPm1fcE5leHQgPSBOVUxMOw0KKyAgZGVsZXRlIG1fcEN1ckl0ZW07DQorICBtX3BDdXJJdGVtID0gcFByZXY7DQorfQ0KK2lubGluZSB2b2lkIENGWF9TQVhSZWFkZXI6OkFwcGVuZERhdGEodWludDhfdCBjaCkgew0KKyAgUmVhbGxvY0RhdGFCdWZmZXIoKTsNCisgIG1fcHN6RGF0YVttX2lEYXRhUG9zKytdID0gY2g7DQorfQ0KK2lubGluZSB2b2lkIENGWF9TQVhSZWFkZXI6OkFwcGVuZE5hbWUodWludDhfdCBjaCkgew0KKyAgUmVhbGxvY05hbWVCdWZmZXIoKTsNCisgIG1fcHN6TmFtZVttX2lEYXRhUG9zKytdID0gY2g7DQorfQ0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6UmVhbGxvY0RhdGFCdWZmZXIoKSB7DQorICBpZiAobV9pRGF0YVBvcyA8IG1faURhdGFTaXplKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChtX2lEYXRhU2l6ZSA8PSAxMDI0ICogMTAyNCkgew0KKyAgICBtX2lEYXRhU2l6ZSAqPSAyOw0KKyAgfSBlbHNlIHsNCisgICAgbV9pRGF0YVNpemUgKz0gMTAyNCAqIDEwMjQ7DQorICB9DQorICBtX3BzekRhdGEgPSAodWludDhfdCopRlhfUmVhbGxvYyh1aW50OF90LCBtX3BzekRhdGEsIG1faURhdGFTaXplKTsNCit9DQordm9pZCBDRlhfU0FYUmVhZGVyOjpSZWFsbG9jTmFtZUJ1ZmZlcigpIHsNCisgIGlmIChtX2lEYXRhUG9zIDwgbV9pTmFtZVNpemUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1faU5hbWVTaXplIDw9IDEwMjQgKiAxMDI0KSB7DQorICAgIG1faU5hbWVTaXplICo9IDI7DQorICB9IGVsc2Ugew0KKyAgICBtX2lOYW1lU2l6ZSArPSAxMDI0ICogMTAyNDsNCisgIH0NCisgIG1fcHN6TmFtZSA9ICh1aW50OF90KilGWF9SZWFsbG9jKHVpbnQ4X3QsIG1fcHN6TmFtZSwgbV9pTmFtZVNpemUpOw0KK30NCitpbmxpbmUgRlhfQk9PTCBDRlhfU0FYUmVhZGVyOjpTa2lwU3BhY2UodWludDhfdCBjaCkgew0KKyAgcmV0dXJuIChtX2R3UGFyc2VNb2RlICYgRlhfU0FYUEFSU0VNT0RFX05vdFNraXBTcGFjZSkgPT0gMCAmJiBjaCA8IDB4MjE7DQorfQ0KK2ludDMyX3QgQ0ZYX1NBWFJlYWRlcjo6U3RhcnRQYXJzZShJRlhfRmlsZVJlYWQqIHBGaWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0xlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQYXJzZU1vZGUpIHsNCisgIG1faVN0YXRlID0gLTE7DQorICBSZXNldCgpOw0KKyAgaWYgKCFtX0ZpbGUuU3RhcnRGaWxlKHBGaWxlLCBkd1N0YXJ0LCBkd0xlbikpIHsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgbV9pU3RhdGUgPSAwOw0KKyAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGV4dDsNCisgIG1fZVByZXZNb2RlID0gRlhfU0FYTU9ERV9UZXh0Ow0KKyAgbV9iQ2hhckRhdGEgPSBGQUxTRTsNCisgIG1fZHdEYXRhT2Zmc2V0ID0gMDsNCisgIG1fcFJvb3QgPSBtX3BDdXJJdGVtID0gbmV3IENGWF9TQVhJdGVtOw0KKyAgbV9wQ3VySXRlbS0+bV9kd0lEID0gKyttX2R3SXRlbUlEOw0KKyAgbV9kd1BhcnNlTW9kZSA9IGR3UGFyc2VNb2RlOw0KKyAgcmV0dXJuIDA7DQorfQ0KK3R5cGVkZWYgdm9pZCAoQ0ZYX1NBWFJlYWRlcjo6KkZYX1NBWFJlYWRlcl9MUEZQYXJzZSkoKTsNCitzdGF0aWMgY29uc3QgRlhfU0FYUmVhZGVyX0xQRlBhcnNlIGdfRlhfU0FYUmVhZGVyX0xQRlBhcnNlW0ZYX1NBWE1PREVfTUFYXSA9IHsNCisgICAgJkNGWF9TQVhSZWFkZXI6OlBhcnNlVGV4dCwNCisgICAgJkNGWF9TQVhSZWFkZXI6OlBhcnNlTm9kZVN0YXJ0LA0KKyAgICAmQ0ZYX1NBWFJlYWRlcjo6UGFyc2VEZWNsT3JDb21tZW50LA0KKyAgICAmQ0ZYX1NBWFJlYWRlcjo6UGFyc2VEZWNsTm9kZSwNCisgICAgJkNGWF9TQVhSZWFkZXI6OlBhcnNlQ29tbWVudCwNCisgICAgJkNGWF9TQVhSZWFkZXI6OlBhcnNlQ29tbWVudENvbnRlbnQsDQorICAgICZDRlhfU0FYUmVhZGVyOjpQYXJzZVRhZ05hbWUsDQorICAgICZDRlhfU0FYUmVhZGVyOjpQYXJzZVRhZ0F0dHJpYnV0ZU5hbWUsDQorICAgICZDRlhfU0FYUmVhZGVyOjpQYXJzZVRhZ0F0dHJpYnV0ZUVxdWFsLA0KKyAgICAmQ0ZYX1NBWFJlYWRlcjo6UGFyc2VUYWdBdHRyaWJ1dGVWYWx1ZSwNCisgICAgJkNGWF9TQVhSZWFkZXI6OlBhcnNlTWF5YmVDbG9zZSwNCisgICAgJkNGWF9TQVhSZWFkZXI6OlBhcnNlVGFnQ2xvc2UsDQorICAgICZDRlhfU0FYUmVhZGVyOjpQYXJzZVRhZ0VuZCwNCisgICAgJkNGWF9TQVhSZWFkZXI6OlBhcnNlVGFyZ2V0RGF0YSwNCit9Ow0KK2ludDMyX3QgQ0ZYX1NBWFJlYWRlcjo6Q29udGludWVQYXJzZShJRlhfUGF1c2UqIHBQYXVzZSkgew0KKyAgaWYgKG1faVN0YXRlIDwgMCB8fCBtX2lTdGF0ZSA+IDk5KSB7DQorICAgIHJldHVybiBtX2lTdGF0ZTsNCisgIH0NCisgIHdoaWxlIChtX0ZpbGUubV9kd0N1ciA8IG1fRmlsZS5tX2R3RW5kKSB7DQorICAgIEZYX0RXT1JEJiBpbmRleCA9IG1fRmlsZS5tX2R3QnVmSW5kZXg7DQorICAgIEZYX0RXT1JEIHNpemUgPSBtX0ZpbGUubV9kd0J1ZlNpemU7DQorICAgIGNvbnN0IHVpbnQ4X3QqIHBCdWYgPSBtX0ZpbGUubV9wQnVmOw0KKyAgICB3aGlsZSAoaW5kZXggPCBzaXplKSB7DQorICAgICAgbV9DdXJCeXRlID0gcEJ1ZltpbmRleF07DQorICAgICAgKHRoaXMtPipnX0ZYX1NBWFJlYWRlcl9MUEZQYXJzZVttX2VNb2RlXSkoKTsNCisgICAgICBpbmRleCsrOw0KKyAgICB9DQorICAgIG1fRmlsZS5tX2R3Q3VyICs9IGluZGV4Ow0KKyAgICBtX2lTdGF0ZSA9IChtX0ZpbGUubV9kd0N1ciAtIG1fRmlsZS5tX2R3U3RhcnQpICogMTAwIC8NCisgICAgICAgICAgICAgICAobV9GaWxlLm1fZHdFbmQgLSBtX0ZpbGUubV9kd1N0YXJ0KTsNCisgICAgaWYgKG1fRmlsZS5tX2R3Q3VyID49IG1fRmlsZS5tX2R3RW5kKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKCFtX0ZpbGUuUmVhZE5leHRCbG9jaygpKSB7DQorICAgICAgbV9pU3RhdGUgPSAtMjsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBtX2R3RGF0YU9mZnNldCA9IDA7DQorICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBtX2lTdGF0ZTsNCit9DQordm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZUNoYXIodWludDhfdCBjaCkgew0KKyAgUmVhbGxvY0RhdGFCdWZmZXIoKTsNCisgIG1fcHN6RGF0YVttX2lEYXRhUG9zXSA9IGNoOw0KKyAgaWYgKG1faUVudGl0eVN0YXJ0ID4gLTEgJiYgY2ggPT0gJzsnKSB7DQorICAgIGludDMyX3QgaVNhdmVFbnRpdHlTdGFydCA9IG1faUVudGl0eVN0YXJ0Ow0KKyAgICBDRlhfQnl0ZVN0cmluZyBjc0VudGl0eShtX3BzekRhdGEgKyBtX2lFbnRpdHlTdGFydCArIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faURhdGFQb3MgLSBtX2lFbnRpdHlTdGFydCAtIDEpOw0KKyAgICBpbnQzMl90IGlMZW4gPSBjc0VudGl0eS5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGlMZW4gPiAwKSB7DQorICAgICAgaWYgKGNzRW50aXR5WzBdID09ICcjJykgew0KKyAgICAgICAgaWYgKChtX2R3UGFyc2VNb2RlICYgRlhfU0FYUEFSU0VNT0RFX05vdENvbnZlcnRfc2hhcnApID09IDApIHsNCisgICAgICAgICAgY2ggPSAwOw0KKyAgICAgICAgICB1aW50OF90IHc7DQorICAgICAgICAgIGlmIChpTGVuID4gMSAmJiBjc0VudGl0eVsxXSA9PSAneCcpIHsNCisgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDI7IGkgPCBpTGVuOyBpKyspIHsNCisgICAgICAgICAgICAgIHcgPSBjc0VudGl0eVtpXTsNCisgICAgICAgICAgICAgIGlmICh3ID49ICcwJyAmJiB3IDw9ICc5Jykgew0KKyAgICAgICAgICAgICAgICBjaCA9IChjaCA8PCA0KSArIHcgLSAnMCc7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYgKHcgPj0gJ0EnICYmIHcgPD0gJ0YnKSB7DQorICAgICAgICAgICAgICAgIGNoID0gKGNoIDw8IDQpICsgdyAtIDU1Ow0KKyAgICAgICAgICAgICAgfSBlbHNlIGlmICh3ID49ICdhJyAmJiB3IDw9ICdmJykgew0KKyAgICAgICAgICAgICAgICBjaCA9IChjaCA8PCA0KSArIHcgLSA4NzsNCisgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBpTGVuOyBpKyspIHsNCisgICAgICAgICAgICAgIHcgPSBjc0VudGl0eVtpXTsNCisgICAgICAgICAgICAgIGlmICh3IDwgJzAnIHx8IHcgPiAnOScpIHsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBjaCA9IGNoICogMTAgKyB3IC0gJzAnOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoY2ggIT0gMCkgew0KKyAgICAgICAgICAgIG1fcHN6RGF0YVttX2lFbnRpdHlTdGFydCsrXSA9IGNoOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChjc0VudGl0eS5Db21wYXJlKCJhbXAiKSA9PSAwKSB7DQorICAgICAgICAgIGlmICgobV9kd1BhcnNlTW9kZSAmIEZYX1NBWFBBUlNFTU9ERV9Ob3RDb252ZXJ0X2FtcCkgPT0gMCkgew0KKyAgICAgICAgICAgIG1fcHN6RGF0YVttX2lFbnRpdHlTdGFydCsrXSA9ICcmJzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChjc0VudGl0eS5Db21wYXJlKCJsdCIpID09IDApIHsNCisgICAgICAgICAgaWYgKChtX2R3UGFyc2VNb2RlICYgRlhfU0FYUEFSU0VNT0RFX05vdENvbnZlcnRfbHQpID09IDApIHsNCisgICAgICAgICAgICBtX3BzekRhdGFbbV9pRW50aXR5U3RhcnQrK10gPSAnPCc7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoY3NFbnRpdHkuQ29tcGFyZSgiZ3QiKSA9PSAwKSB7DQorICAgICAgICAgIGlmICgobV9kd1BhcnNlTW9kZSAmIEZYX1NBWFBBUlNFTU9ERV9Ob3RDb252ZXJ0X2d0KSA9PSAwKSB7DQorICAgICAgICAgICAgbV9wc3pEYXRhW21faUVudGl0eVN0YXJ0KytdID0gJz4nOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKGNzRW50aXR5LkNvbXBhcmUoImFwb3MiKSA9PSAwKSB7DQorICAgICAgICAgIGlmICgobV9kd1BhcnNlTW9kZSAmIEZYX1NBWFBBUlNFTU9ERV9Ob3RDb252ZXJ0X2Fwb3MpID09IDApIHsNCisgICAgICAgICAgICBtX3BzekRhdGFbbV9pRW50aXR5U3RhcnQrK10gPSAnXCcnOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKGNzRW50aXR5LkNvbXBhcmUoInF1b3QiKSA9PSAwKSB7DQorICAgICAgICAgIGlmICgobV9kd1BhcnNlTW9kZSAmIEZYX1NBWFBBUlNFTU9ERV9Ob3RDb252ZXJ0X3F1b3QpID09IDApIHsNCisgICAgICAgICAgICBtX3BzekRhdGFbbV9pRW50aXR5U3RhcnQrK10gPSAnXCInOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChpU2F2ZUVudGl0eVN0YXJ0ICE9IG1faUVudGl0eVN0YXJ0KSB7DQorICAgICAgbV9pRGF0YVBvcyA9IG1faUVudGl0eVN0YXJ0Ow0KKyAgICAgIG1faUVudGl0eVN0YXJ0ID0gLTE7DQorICAgIH0gZWxzZSB7DQorICAgICAgbV9pRGF0YVBvcysrOw0KKyAgICAgIG1faUVudGl0eVN0YXJ0ID0gLTE7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGlmIChtX2lFbnRpdHlTdGFydCA8IDAgJiYgY2ggPT0gJyYnKSB7DQorICAgICAgbV9pRW50aXR5U3RhcnQgPSBtX2lEYXRhUG9zOw0KKyAgICB9DQorICAgIG1faURhdGFQb3MrKzsNCisgIH0NCit9DQordm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZVRleHQoKSB7DQorICBpZiAobV9DdXJCeXRlID09ICc8Jykgew0KKyAgICBpZiAobV9pRGF0YVBvcyA+IDApIHsNCisgICAgICBtX2lEYXRhTGVuZ3RoID0gbV9pRGF0YVBvczsNCisgICAgICBtX2lEYXRhUG9zID0gMDsNCisgICAgICBpZiAobV9wSGFuZGxlcikgew0KKyAgICAgICAgTm90aWZ5RGF0YSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBQdXNoKCk7DQorICAgIG1fZHdOb2RlUG9zID0gbV9GaWxlLm1fZHdDdXIgKyBtX0ZpbGUubV9kd0J1ZkluZGV4Ow0KKyAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9Ob2RlU3RhcnQ7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChtX2lEYXRhUG9zIDwgMSAmJiBTa2lwU3BhY2UobV9DdXJCeXRlKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBQYXJzZUNoYXIobV9DdXJCeXRlKTsNCit9DQordm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZU5vZGVTdGFydCgpIHsNCisgIGlmIChtX0N1ckJ5dGUgPT0gJz8nKSB7DQorICAgIG1fcEN1ckl0ZW0tPm1fZU5vZGUgPSBGWF9TQVhOT0RFX0luc3RydWN0aW9uOw0KKyAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UYWdOYW1lOw0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAobV9DdXJCeXRlID09ICchJykgew0KKyAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9EZWNsT3JDb21tZW50Ow0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAobV9DdXJCeXRlID09ICcvJykgew0KKyAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UYWdFbmQ7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChtX0N1ckJ5dGUgPT0gJz4nKSB7DQorICAgIFBvcCgpOw0KKyAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UZXh0Ow0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAobV9DdXJCeXRlID4gMHgyMCkgew0KKyAgICBtX2R3RGF0YU9mZnNldCA9IG1fRmlsZS5tX2R3QnVmSW5kZXg7DQorICAgIG1fcEN1ckl0ZW0tPm1fZU5vZGUgPSBGWF9TQVhOT0RFX1RhZzsNCisgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGFnTmFtZTsNCisgICAgQXBwZW5kRGF0YShtX0N1ckJ5dGUpOw0KKyAgfQ0KK30NCit2b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlRGVjbE9yQ29tbWVudCgpIHsNCisgIGlmIChtX0N1ckJ5dGUgPT0gJy0nKSB7DQorICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX0NvbW1lbnQ7DQorICAgIG1fcEN1ckl0ZW0tPm1fZU5vZGUgPSBGWF9TQVhOT0RFX0NvbW1lbnQ7DQorICAgIGlmIChtX3BDb21tZW50Q29udGV4dCA9PSBOVUxMKSB7DQorICAgICAgbV9wQ29tbWVudENvbnRleHQgPSBuZXcgQ0ZYX1NBWENvbW1lbnRDb250ZXh0Ow0KKyAgICB9DQorICAgIG1fcENvbW1lbnRDb250ZXh0LT5tX2lIZWFkZXJDb3VudCA9IDE7DQorICAgIG1fcENvbW1lbnRDb250ZXh0LT5tX2lUYWlsQ291bnQgPSAwOw0KKyAgfSBlbHNlIHsNCisgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfRGVjbE5vZGU7DQorICAgIG1fZHdEYXRhT2Zmc2V0ID0gbV9GaWxlLm1fZHdCdWZJbmRleDsNCisgICAgbV9Ta2lwQ2hhciA9ICc+JzsNCisgICAgbV9Ta2lwU3RhY2suQWRkKCc+Jyk7DQorICAgIFNraXBOb2RlKCk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VDb21tZW50KCkgew0KKyAgbV9wQ29tbWVudENvbnRleHQtPm1faUhlYWRlckNvdW50ID0gMjsNCisgIG1fZHdOb2RlUG9zID0gbV9GaWxlLm1fZHdDdXIgKyBtX0ZpbGUubV9kd0J1ZkluZGV4Ow0KKyAgbV9lTW9kZSA9IEZYX1NBWE1PREVfQ29tbWVudENvbnRlbnQ7DQorfQ0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VDb21tZW50Q29udGVudCgpIHsNCisgIGlmIChtX0N1ckJ5dGUgPT0gJy0nKSB7DQorICAgIG1fcENvbW1lbnRDb250ZXh0LT5tX2lUYWlsQ291bnQrKzsNCisgIH0gZWxzZSBpZiAobV9DdXJCeXRlID09ICc+JyAmJiBtX3BDb21tZW50Q29udGV4dC0+bV9pVGFpbENvdW50ID09IDIpIHsNCisgICAgbV9pRGF0YUxlbmd0aCA9IG1faURhdGFQb3M7DQorICAgIG1faURhdGFQb3MgPSAwOw0KKyAgICBpZiAobV9wSGFuZGxlcikgew0KKyAgICAgIE5vdGlmeVRhcmdldERhdGEoKTsNCisgICAgfQ0KKyAgICBQb3AoKTsNCisgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGV4dDsNCisgIH0gZWxzZSB7DQorICAgIHdoaWxlIChtX3BDb21tZW50Q29udGV4dC0+bV9pVGFpbENvdW50ID4gMCkgew0KKyAgICAgIEFwcGVuZERhdGEoJy0nKTsNCisgICAgICBtX3BDb21tZW50Q29udGV4dC0+bV9pVGFpbENvdW50LS07DQorICAgIH0NCisgICAgQXBwZW5kRGF0YShtX0N1ckJ5dGUpOw0KKyAgfQ0KK30NCit2b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlRGVjbE5vZGUoKSB7DQorICBTa2lwTm9kZSgpOw0KK30NCit2b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlVGFnTmFtZSgpIHsNCisgIGlmIChtX0N1ckJ5dGUgPCAweDIxIHx8IG1fQ3VyQnl0ZSA9PSAnLycgfHwgbV9DdXJCeXRlID09ICc+JyB8fA0KKyAgICAgIG1fQ3VyQnl0ZSA9PSAnPycpIHsNCisgICAgbV9pRGF0YUxlbmd0aCA9IG1faURhdGFQb3M7DQorICAgIG1faURhdGFQb3MgPSAwOw0KKyAgICBpZiAobV9wSGFuZGxlcikgew0KKyAgICAgIE5vdGlmeUVudGVyKCk7DQorICAgIH0NCisgICAgaWYgKG1fQ3VyQnl0ZSA8IDB4MjEpIHsNCisgICAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UYWdBdHRyaWJ1dGVOYW1lOw0KKyAgICB9IGVsc2UgaWYgKG1fQ3VyQnl0ZSA9PSAnLycgfHwgbV9DdXJCeXRlID09ICc/Jykgew0KKyAgICAgIG1fZVByZXZNb2RlID0gbV9lTW9kZTsNCisgICAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UYWdNYXliZUNsb3NlOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChtX3BIYW5kbGVyKSB7DQorICAgICAgICBOb3RpZnlCcmVhaygpOw0KKyAgICAgIH0NCisgICAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UZXh0Ow0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBBcHBlbmREYXRhKG1fQ3VyQnl0ZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VUYWdBdHRyaWJ1dGVOYW1lKCkgew0KKyAgaWYgKG1fQ3VyQnl0ZSA8IDB4MjEgfHwgbV9DdXJCeXRlID09ICc9Jykgew0KKyAgICBpZiAobV9pRGF0YVBvcyA8IDEgJiYgbV9DdXJCeXRlIDwgMHgyMSkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBtX2lOYW1lTGVuZ3RoID0gbV9pRGF0YVBvczsNCisgICAgbV9pRGF0YVBvcyA9IDA7DQorICAgIG1fU2tpcENoYXIgPSAwOw0KKyAgICBtX2VNb2RlID0gbV9DdXJCeXRlID09ICc9JyA/IEZYX1NBWE1PREVfVGFnQXR0cmlidXRlVmFsdWUNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGWF9TQVhNT0RFX1RhZ0F0dHJpYnV0ZUVxdWFsOw0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAobV9DdXJCeXRlID09ICcvJyB8fCBtX0N1ckJ5dGUgPT0gJz4nIHx8IG1fQ3VyQnl0ZSA9PSAnPycpIHsNCisgICAgaWYgKG1fQ3VyQnl0ZSA9PSAnLycgfHwgbV9DdXJCeXRlID09ICc/Jykgew0KKyAgICAgIG1fZVByZXZNb2RlID0gbV9lTW9kZTsNCisgICAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UYWdNYXliZUNsb3NlOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChtX3BIYW5kbGVyKSB7DQorICAgICAgICBOb3RpZnlCcmVhaygpOw0KKyAgICAgIH0NCisgICAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UZXh0Ow0KKyAgICB9DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChtX2lEYXRhUG9zIDwgMSkgew0KKyAgICBtX2R3RGF0YU9mZnNldCA9IG1fRmlsZS5tX2R3QnVmSW5kZXg7DQorICB9DQorICBBcHBlbmROYW1lKG1fQ3VyQnl0ZSk7DQorfQ0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VUYWdBdHRyaWJ1dGVFcXVhbCgpIHsNCisgIGlmIChtX0N1ckJ5dGUgPT0gJz0nKSB7DQorICAgIG1fU2tpcENoYXIgPSAwOw0KKyAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UYWdBdHRyaWJ1dGVWYWx1ZTsNCisgICAgcmV0dXJuOw0KKyAgfSBlbHNlIGlmIChtX3BDdXJJdGVtLT5tX2VOb2RlID09IEZYX1NBWE5PREVfSW5zdHJ1Y3Rpb24pIHsNCisgICAgbV9pRGF0YVBvcyA9IG1faU5hbWVMZW5ndGg7DQorICAgIEFwcGVuZE5hbWUoMHgyMCk7DQorICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX1RhcmdldERhdGE7DQorICAgIFBhcnNlVGFyZ2V0RGF0YSgpOw0KKyAgfQ0KK30NCit2b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlVGFnQXR0cmlidXRlVmFsdWUoKSB7DQorICBpZiAobV9Ta2lwQ2hhcikgew0KKyAgICBpZiAobV9Ta2lwQ2hhciA9PSBtX0N1ckJ5dGUpIHsNCisgICAgICB7DQorICAgICAgICBtX2lEYXRhTGVuZ3RoID0gbV9pRGF0YVBvczsNCisgICAgICAgIG1faURhdGFQb3MgPSAwOw0KKyAgICAgICAgaWYgKG1fcEhhbmRsZXIpIHsNCisgICAgICAgICAgTm90aWZ5QXR0cmlidXRlKCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIG1fU2tpcENoYXIgPSAwOw0KKyAgICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX1RhZ0F0dHJpYnV0ZU5hbWU7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIFBhcnNlQ2hhcihtX0N1ckJ5dGUpOw0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAobV9DdXJCeXRlIDwgMHgyMSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAobV9pRGF0YVBvcyA8IDEpIHsNCisgICAgaWYgKG1fQ3VyQnl0ZSA9PSAnXCcnIHx8IG1fQ3VyQnl0ZSA9PSAnXCInKSB7DQorICAgICAgbV9Ta2lwQ2hhciA9IG1fQ3VyQnl0ZTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlTWF5YmVDbG9zZSgpIHsNCisgIGlmIChtX0N1ckJ5dGUgPT0gJz4nKSB7DQorICAgIGlmIChtX3BDdXJJdGVtLT5tX2VOb2RlID09IEZYX1NBWE5PREVfSW5zdHJ1Y3Rpb24pIHsNCisgICAgICBtX2lOYW1lTGVuZ3RoID0gbV9pRGF0YVBvczsNCisgICAgICBtX2lEYXRhUG9zID0gMDsNCisgICAgICBpZiAobV9wSGFuZGxlcikgew0KKyAgICAgICAgTm90aWZ5VGFyZ2V0RGF0YSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBQYXJzZVRhZ0Nsb3NlKCk7DQorICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX1RleHQ7DQorICB9IGVsc2UgaWYgKG1fZVByZXZNb2RlID09IEZYX1NBWE1PREVfVGFnTmFtZSkgew0KKyAgICBBcHBlbmREYXRhKCcvJyk7DQorICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX1RhZ05hbWU7DQorICAgIG1fZVByZXZNb2RlID0gRlhfU0FYTU9ERV9UZXh0Ow0KKyAgICBQYXJzZVRhZ05hbWUoKTsNCisgIH0gZWxzZSBpZiAobV9lUHJldk1vZGUgPT0gRlhfU0FYTU9ERV9UYWdBdHRyaWJ1dGVOYW1lKSB7DQorICAgIEFwcGVuZE5hbWUoJy8nKTsNCisgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGFnQXR0cmlidXRlTmFtZTsNCisgICAgbV9lUHJldk1vZGUgPSBGWF9TQVhNT0RFX1RleHQ7DQorICAgIFBhcnNlVGFnQXR0cmlidXRlTmFtZSgpOw0KKyAgfSBlbHNlIGlmIChtX2VQcmV2TW9kZSA9PSBGWF9TQVhNT0RFX1RhcmdldERhdGEpIHsNCisgICAgQXBwZW5kTmFtZSgnPycpOw0KKyAgICBtX2VNb2RlID0gRlhfU0FYTU9ERV9UYXJnZXREYXRhOw0KKyAgICBtX2VQcmV2TW9kZSA9IEZYX1NBWE1PREVfVGV4dDsNCisgICAgUGFyc2VUYXJnZXREYXRhKCk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VUYWdDbG9zZSgpIHsNCisgIG1fZHdOb2RlUG9zID0gbV9GaWxlLm1fZHdDdXIgKyBtX0ZpbGUubV9kd0J1ZkluZGV4Ow0KKyAgaWYgKG1fcEhhbmRsZXIpIHsNCisgICAgTm90aWZ5Q2xvc2UoKTsNCisgIH0NCisgIFBvcCgpOw0KK30NCit2b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlVGFnRW5kKCkgew0KKyAgaWYgKG1fQ3VyQnl0ZSA8IDB4MjEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1fQ3VyQnl0ZSA9PSAnPicpIHsNCisgICAgUG9wKCk7DQorICAgIG1fZHdOb2RlUG9zID0gbV9GaWxlLm1fZHdDdXIgKyBtX0ZpbGUubV9kd0J1ZkluZGV4Ow0KKyAgICBtX2lEYXRhTGVuZ3RoID0gbV9pRGF0YVBvczsNCisgICAgbV9pRGF0YVBvcyA9IDA7DQorICAgIGlmIChtX3BIYW5kbGVyKSB7DQorICAgICAgTm90aWZ5RW5kKCk7DQorICAgIH0NCisgICAgUG9wKCk7DQorICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX1RleHQ7DQorICB9IGVsc2Ugew0KKyAgICBQYXJzZUNoYXIobV9DdXJCeXRlKTsNCisgIH0NCit9DQordm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZVRhcmdldERhdGEoKSB7DQorICBpZiAobV9DdXJCeXRlID09ICc/Jykgew0KKyAgICBtX2VQcmV2TW9kZSA9IG1fZU1vZGU7DQorICAgIG1fZU1vZGUgPSBGWF9TQVhNT0RFX1RhZ01heWJlQ2xvc2U7DQorICB9IGVsc2Ugew0KKyAgICBBcHBlbmROYW1lKG1fQ3VyQnl0ZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6U2tpcE5vZGUoKSB7DQorICBpbnQzMl90IGlMZW4gPSBtX1NraXBTdGFjay5HZXRTaXplKCk7DQorICBpZiAobV9Ta2lwQ2hhciA9PSAnXCcnIHx8IG1fU2tpcENoYXIgPT0gJ1wiJykgew0KKyAgICBpZiAobV9DdXJCeXRlICE9IG1fU2tpcENoYXIpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaUxlbi0tOw0KKyAgICBGWFNZU19hc3NlcnQoaUxlbiA+IC0xKTsNCisgICAgbV9Ta2lwU3RhY2suUmVtb3ZlQXQoaUxlbiwgMSk7DQorICAgIG1fU2tpcENoYXIgPSBpTGVuID8gbV9Ta2lwU3RhY2tbaUxlbiAtIDFdIDogMDsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgc3dpdGNoIChtX0N1ckJ5dGUpIHsNCisgICAgY2FzZSAnPCc6DQorICAgICAgbV9Ta2lwQ2hhciA9ICc+JzsNCisgICAgICBtX1NraXBTdGFjay5BZGQoJz4nKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAnWyc6DQorICAgICAgbV9Ta2lwQ2hhciA9ICddJzsNCisgICAgICBtX1NraXBTdGFjay5BZGQoJ10nKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAnKCc6DQorICAgICAgbV9Ta2lwQ2hhciA9ICcpJzsNCisgICAgICBtX1NraXBTdGFjay5BZGQoJyknKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAnXCcnOg0KKyAgICAgIG1fU2tpcENoYXIgPSAnXCcnOw0KKyAgICAgIG1fU2tpcFN0YWNrLkFkZCgnXCcnKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAnXCInOg0KKyAgICAgIG1fU2tpcENoYXIgPSAnXCInOw0KKyAgICAgIG1fU2tpcFN0YWNrLkFkZCgnXCInKTsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBpZiAobV9DdXJCeXRlID09IG1fU2tpcENoYXIpIHsNCisgICAgICAgIGlMZW4tLTsNCisgICAgICAgIG1fU2tpcFN0YWNrLlJlbW92ZUF0KGlMZW4sIDEpOw0KKyAgICAgICAgbV9Ta2lwQ2hhciA9IGlMZW4gPyBtX1NraXBTdGFja1tpTGVuIC0gMV0gOiAwOw0KKyAgICAgICAgaWYgKGlMZW4gPT0gMCAmJiBtX0N1ckJ5dGUgPT0gJz4nKSB7DQorICAgICAgICAgIG1faURhdGFMZW5ndGggPSBtX2lEYXRhUG9zOw0KKyAgICAgICAgICBtX2lEYXRhUG9zID0gMDsNCisgICAgICAgICAgaWYgKG1faURhdGFMZW5ndGggPj0gOSAmJg0KKyAgICAgICAgICAgICAgRlhTWVNfbWVtY21wKG1fcHN6RGF0YSwgIltDREFUQVsiLCA3ICogc2l6ZW9mKHVpbnQ4X3QpKSA9PSAwICYmDQorICAgICAgICAgICAgICBGWFNZU19tZW1jbXAobV9wc3pEYXRhICsgbV9pRGF0YUxlbmd0aCAtIDIsICJdXSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIHNpemVvZih1aW50OF90KSkgPT0gMCkgew0KKyAgICAgICAgICAgIFBvcCgpOw0KKyAgICAgICAgICAgIG1faURhdGFMZW5ndGggLT0gOTsNCisgICAgICAgICAgICBtX2R3RGF0YU9mZnNldCArPSA3Ow0KKyAgICAgICAgICAgIEZYU1lTX21lbW1vdmUobV9wc3pEYXRhLCBtX3BzekRhdGEgKyA3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pRGF0YUxlbmd0aCAqIHNpemVvZih1aW50OF90KSk7DQorICAgICAgICAgICAgbV9iQ2hhckRhdGEgPSBUUlVFOw0KKyAgICAgICAgICAgIGlmIChtX3BIYW5kbGVyKSB7DQorICAgICAgICAgICAgICBOb3RpZnlEYXRhKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIG1fYkNoYXJEYXRhID0gRkFMU0U7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgUG9wKCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgbV9lTW9kZSA9IEZYX1NBWE1PREVfVGV4dDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICB9DQorICBpZiAoaUxlbiA+IDApIHsNCisgICAgUGFyc2VDaGFyKG1fQ3VyQnl0ZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6Tm90aWZ5RGF0YSgpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BIYW5kbGVyICE9IE5VTEwpOw0KKyAgaWYgKG1fcEN1ckl0ZW0tPm1fZU5vZGUgPT0gRlhfU0FYTk9ERV9UYWcpDQorICAgIG1fcEhhbmRsZXItPk9uVGFnRGF0YShtX3BDdXJJdGVtLT5tX3BOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iQ2hhckRhdGEgPyBGWF9TQVhOT0RFX0NoYXJEYXRhIDogRlhfU0FYTk9ERV9UZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDKG1fcHN6RGF0YSwgbV9pRGF0YUxlbmd0aCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICBtX0ZpbGUubV9kd0N1ciArIG1fZHdEYXRhT2Zmc2V0KTsNCit9DQordm9pZCBDRlhfU0FYUmVhZGVyOjpOb3RpZnlFbnRlcigpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BIYW5kbGVyICE9IE5VTEwpOw0KKyAgaWYgKG1fcEN1ckl0ZW0tPm1fZU5vZGUgPT0gRlhfU0FYTk9ERV9UYWcgfHwNCisgICAgICBtX3BDdXJJdGVtLT5tX2VOb2RlID09IEZYX1NBWE5PREVfSW5zdHJ1Y3Rpb24pIHsNCisgICAgbV9wQ3VySXRlbS0+bV9wTm9kZSA9DQorICAgICAgICBtX3BIYW5kbGVyLT5PblRhZ0VudGVyKENGWF9CeXRlU3RyaW5nQyhtX3BzekRhdGEsIG1faURhdGFMZW5ndGgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJJdGVtLT5tX2VOb2RlLCBtX2R3Tm9kZVBvcyk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6Tm90aWZ5QXR0cmlidXRlKCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcEhhbmRsZXIgIT0gTlVMTCk7DQorICBpZiAobV9wQ3VySXRlbS0+bV9lTm9kZSA9PSBGWF9TQVhOT0RFX1RhZyB8fA0KKyAgICAgIG1fcEN1ckl0ZW0tPm1fZU5vZGUgPT0gRlhfU0FYTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICBtX3BIYW5kbGVyLT5PblRhZ0F0dHJpYnV0ZShtX3BDdXJJdGVtLT5tX3BOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0MobV9wc3pOYW1lLCBtX2lOYW1lTGVuZ3RoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDKG1fcHN6RGF0YSwgbV9pRGF0YUxlbmd0aCkpOw0KKyAgfQ0KK30NCit2b2lkIENGWF9TQVhSZWFkZXI6Ok5vdGlmeUJyZWFrKCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcEhhbmRsZXIgIT0gTlVMTCk7DQorICBpZiAobV9wQ3VySXRlbS0+bV9lTm9kZSA9PSBGWF9TQVhOT0RFX1RhZykgew0KKyAgICBtX3BIYW5kbGVyLT5PblRhZ0JyZWFrKG1fcEN1ckl0ZW0tPm1fcE5vZGUpOw0KKyAgfQ0KK30NCit2b2lkIENGWF9TQVhSZWFkZXI6Ok5vdGlmeUNsb3NlKCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcEhhbmRsZXIgIT0gTlVMTCk7DQorICBpZiAobV9wQ3VySXRlbS0+bV9lTm9kZSA9PSBGWF9TQVhOT0RFX1RhZyB8fA0KKyAgICAgIG1fcEN1ckl0ZW0tPm1fZU5vZGUgPT0gRlhfU0FYTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICBtX3BIYW5kbGVyLT5PblRhZ0Nsb3NlKG1fcEN1ckl0ZW0tPm1fcE5vZGUsIG1fZHdOb2RlUG9zKTsNCisgIH0NCit9DQordm9pZCBDRlhfU0FYUmVhZGVyOjpOb3RpZnlFbmQoKSB7DQorICBGWFNZU19hc3NlcnQobV9wSGFuZGxlciAhPSBOVUxMKTsNCisgIGlmIChtX3BDdXJJdGVtLT5tX2VOb2RlID09IEZYX1NBWE5PREVfVGFnKSB7DQorICAgIG1fcEhhbmRsZXItPk9uVGFnRW5kKG1fcEN1ckl0ZW0tPm1fcE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQyhtX3BzekRhdGEsIG1faURhdGFMZW5ndGgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3Tm9kZVBvcyk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6Tm90aWZ5VGFyZ2V0RGF0YSgpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BIYW5kbGVyICE9IE5VTEwpOw0KKyAgaWYgKG1fcEN1ckl0ZW0tPm1fZU5vZGUgPT0gRlhfU0FYTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICBtX3BIYW5kbGVyLT5PblRhcmdldERhdGEobV9wQ3VySXRlbS0+bV9wTm9kZSwgbV9wQ3VySXRlbS0+bV9lTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQyhtX3Bzek5hbWUsIG1faU5hbWVMZW5ndGgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd05vZGVQb3MpOw0KKyAgfSBlbHNlIGlmIChtX3BDdXJJdGVtLT5tX2VOb2RlID09IEZYX1NBWE5PREVfQ29tbWVudCkgew0KKyAgICBtX3BIYW5kbGVyLT5PblRhcmdldERhdGEobV9wQ3VySXRlbS0+bV9wTm9kZSwgbV9wQ3VySXRlbS0+bV9lTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQyhtX3BzekRhdGEsIG1faURhdGFMZW5ndGgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd05vZGVQb3MpOw0KKyAgfQ0KK30NCit2b2lkIENGWF9TQVhSZWFkZXI6OlNraXBDdXJyZW50Tm9kZSgpIHsNCisgIGlmICghbV9wQ3VySXRlbSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBtX3BDdXJJdGVtLT5tX2JTa2lwID0gVFJVRTsNCit9DQordm9pZCBDRlhfU0FYUmVhZGVyOjpTZXRIYW5kbGVyKElGWF9TQVhSZWFkZXJIYW5kbGVyKiBwSGFuZGxlcikgew0KKyAgbV9wSGFuZGxlciA9IHBIYW5kbGVyOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZnYXMvc3JjL3htbC9meF9zYXhfaW1wLmggYi94ZmEvc3JjL2ZnYXMvc3JjL3htbC9meF9zYXhfaW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiZTM4OAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZmdhcy9zcmMveG1sL2Z4X3NheF9pbXAuaApAQCAtMCwwICsxLDEzNCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWF9TQVhfSU1QXw0KKyNkZWZpbmUgX0ZYX1NBWF9JTVBfDQorDQorY2xhc3MgQ0ZYX1NBWEZpbGUgew0KKyBwdWJsaWM6DQorICBDRlhfU0FYRmlsZSgpOw0KKyAgRlhfQk9PTCBTdGFydEZpbGUoSUZYX0ZpbGVSZWFkKiBwRmlsZSwgRlhfRFdPUkQgZHdTdGFydCwgRlhfRFdPUkQgZHdMZW4pOw0KKyAgRlhfQk9PTCBSZWFkTmV4dEJsb2NrKCk7DQorICB2b2lkIFJlc2V0KCk7DQorICBJRlhfRmlsZVJlYWQqIG1fcEZpbGU7DQorICBGWF9EV09SRCBtX2R3U3RhcnQ7DQorICBGWF9EV09SRCBtX2R3RW5kOw0KKyAgRlhfRFdPUkQgbV9kd0N1cjsNCisgIHVpbnQ4X3QqIG1fcEJ1ZjsNCisgIEZYX0RXT1JEIG1fZHdCdWZTaXplOw0KKyAgRlhfRFdPUkQgbV9kd0J1ZkluZGV4Ow0KK307DQorZW51bSBGWF9TQVhNT0RFIHsNCisgIEZYX1NBWE1PREVfVGV4dCA9IDAsDQorICBGWF9TQVhNT0RFX05vZGVTdGFydCwNCisgIEZYX1NBWE1PREVfRGVjbE9yQ29tbWVudCwNCisgIEZYX1NBWE1PREVfRGVjbE5vZGUsDQorICBGWF9TQVhNT0RFX0NvbW1lbnQsDQorICBGWF9TQVhNT0RFX0NvbW1lbnRDb250ZW50LA0KKyAgRlhfU0FYTU9ERV9UYWdOYW1lLA0KKyAgRlhfU0FYTU9ERV9UYWdBdHRyaWJ1dGVOYW1lLA0KKyAgRlhfU0FYTU9ERV9UYWdBdHRyaWJ1dGVFcXVhbCwNCisgIEZYX1NBWE1PREVfVGFnQXR0cmlidXRlVmFsdWUsDQorICBGWF9TQVhNT0RFX1RhZ01heWJlQ2xvc2UsDQorICBGWF9TQVhNT0RFX1RhZ0Nsb3NlLA0KKyAgRlhfU0FYTU9ERV9UYWdFbmQsDQorICBGWF9TQVhNT0RFX1RhcmdldERhdGEsDQorICBGWF9TQVhNT0RFX01BWCwNCit9Ow0KK2NsYXNzIENGWF9TQVhJdGVtIHsNCisgcHVibGljOg0KKyAgQ0ZYX1NBWEl0ZW0oKQ0KKyAgICAgIDogbV9wTm9kZShOVUxMKSwNCisgICAgICAgIG1fZU5vZGUoRlhfU0FYTk9ERV9Vbmtub3duKSwNCisgICAgICAgIG1fZHdJRCgwKSwNCisgICAgICAgIG1fYlNraXAoRkFMU0UpLA0KKyAgICAgICAgbV9wUHJldihOVUxMKSwNCisgICAgICAgIG1fcE5leHQoTlVMTCkge30NCisgIHZvaWQqIG1fcE5vZGU7DQorICBGWF9TQVhOT0RFIG1fZU5vZGU7DQorICBGWF9EV09SRCBtX2R3SUQ7DQorICBGWF9CT09MIG1fYlNraXA7DQorICBDRlhfU0FYSXRlbSogbV9wUHJldjsNCisgIENGWF9TQVhJdGVtKiBtX3BOZXh0Ow0KK307DQorY2xhc3MgQ0ZYX1NBWENvbW1lbnRDb250ZXh0IHsNCisgcHVibGljOg0KKyAgQ0ZYX1NBWENvbW1lbnRDb250ZXh0KCkgOiBtX2lIZWFkZXJDb3VudCgwKSwgbV9pVGFpbENvdW50KDApIHt9DQorICBpbnQzMl90IG1faUhlYWRlckNvdW50Ow0KKyAgaW50MzJfdCBtX2lUYWlsQ291bnQ7DQorfTsNCitjbGFzcyBDRlhfU0FYUmVhZGVyIDogcHVibGljIElGWF9TQVhSZWFkZXIgew0KKyBwdWJsaWM6DQorICBDRlhfU0FYUmVhZGVyKCk7DQorICB+Q0ZYX1NBWFJlYWRlcigpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICB2aXJ0dWFsIGludDMyX3QgU3RhcnRQYXJzZShJRlhfRmlsZVJlYWQqIHBGaWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGFydCA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0xlbiA9IC0xLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQYXJzZU1vZGUgPSAwKTsNCisgIHZpcnR1YWwgaW50MzJfdCBDb250aW51ZVBhcnNlKElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCk7DQorICB2aXJ0dWFsIHZvaWQgU2tpcEN1cnJlbnROb2RlKCk7DQorICB2aXJ0dWFsIHZvaWQgU2V0SGFuZGxlcihJRlhfU0FYUmVhZGVySGFuZGxlciogcEhhbmRsZXIpOw0KKyAgdm9pZCBBcHBlbmREYXRhKHVpbnQ4X3QgY2gpOw0KKyAgdm9pZCBBcHBlbmROYW1lKHVpbnQ4X3QgY2gpOw0KKyAgdm9pZCBQYXJzZVRleHQoKTsNCisgIHZvaWQgUGFyc2VOb2RlU3RhcnQoKTsNCisgIHZvaWQgUGFyc2VJbnN0cnVjdGlvbigpOw0KKyAgdm9pZCBQYXJzZURlY2xPckNvbW1lbnQoKTsNCisgIHZvaWQgUGFyc2VEZWNsTm9kZSgpOw0KKyAgdm9pZCBQYXJzZUNvbW1lbnQoKTsNCisgIHZvaWQgUGFyc2VDb21tZW50Q29udGVudCgpOw0KKyAgdm9pZCBQYXJzZVRhZ05hbWUoKTsNCisgIHZvaWQgUGFyc2VUYWdBdHRyaWJ1dGVOYW1lKCk7DQorICB2b2lkIFBhcnNlVGFnQXR0cmlidXRlRXF1YWwoKTsNCisgIHZvaWQgUGFyc2VUYWdBdHRyaWJ1dGVWYWx1ZSgpOw0KKyAgdm9pZCBQYXJzZU1heWJlQ2xvc2UoKTsNCisgIHZvaWQgUGFyc2VUYWdDbG9zZSgpOw0KKyAgdm9pZCBQYXJzZVRhZ0VuZCgpOw0KKyAgdm9pZCBQYXJzZVRhcmdldERhdGEoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX1NBWEZpbGUgbV9GaWxlOw0KKyAgSUZYX1NBWFJlYWRlckhhbmRsZXIqIG1fcEhhbmRsZXI7DQorICBpbnQzMl90IG1faVN0YXRlOw0KKyAgQ0ZYX1NBWEl0ZW0qIG1fcFJvb3Q7DQorICBDRlhfU0FYSXRlbSogbV9wQ3VySXRlbTsNCisgIEZYX0RXT1JEIG1fZHdJdGVtSUQ7DQorICBGWF9TQVhNT0RFIG1fZU1vZGU7DQorICBGWF9TQVhNT0RFIG1fZVByZXZNb2RlOw0KKyAgRlhfQk9PTCBtX2JDaGFyRGF0YTsNCisgIHVpbnQ4X3QgbV9DdXJCeXRlOw0KKyAgRlhfRFdPUkQgbV9kd0RhdGFPZmZzZXQ7DQorICBDRlhfQnl0ZUFycmF5IG1fU2tpcFN0YWNrOw0KKyAgdWludDhfdCBtX1NraXBDaGFyOw0KKyAgRlhfRFdPUkQgbV9kd05vZGVQb3M7DQorICB1aW50OF90KiBtX3BzekRhdGE7DQorICBpbnQzMl90IG1faURhdGFTaXplOw0KKyAgaW50MzJfdCBtX2lEYXRhTGVuZ3RoOw0KKyAgaW50MzJfdCBtX2lFbnRpdHlTdGFydDsNCisgIGludDMyX3QgbV9pRGF0YVBvczsNCisgIHVpbnQ4X3QqIG1fcHN6TmFtZTsNCisgIGludDMyX3QgbV9pTmFtZVNpemU7DQorICBpbnQzMl90IG1faU5hbWVMZW5ndGg7DQorICBGWF9EV09SRCBtX2R3UGFyc2VNb2RlOw0KKyAgQ0ZYX1NBWENvbW1lbnRDb250ZXh0KiBtX3BDb21tZW50Q29udGV4dDsNCisgIHZvaWQgUmVzZXQoKTsNCisgIHZvaWQgUHVzaCgpOw0KKyAgdm9pZCBQb3AoKTsNCisgIEZYX0JPT0wgU2tpcFNwYWNlKHVpbnQ4X3QgY2gpOw0KKyAgdm9pZCBTa2lwTm9kZSgpOw0KKyAgdm9pZCBOb3RpZnlEYXRhKCk7DQorICB2b2lkIE5vdGlmeUVudGVyKCk7DQorICB2b2lkIE5vdGlmeUF0dHJpYnV0ZSgpOw0KKyAgdm9pZCBOb3RpZnlCcmVhaygpOw0KKyAgdm9pZCBOb3RpZnlDbG9zZSgpOw0KKyAgdm9pZCBOb3RpZnlFbmQoKTsNCisgIHZvaWQgTm90aWZ5VGFyZ2V0RGF0YSgpOw0KKyAgdm9pZCBSZWFsbG9jRGF0YUJ1ZmZlcigpOw0KKyAgdm9pZCBSZWFsbG9jTmFtZUJ1ZmZlcigpOw0KKyAgdm9pZCBQYXJzZUNoYXIodWludDhfdCBjaCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2ZveGl0bGliLmggYi94ZmEvc3JjL2ZveGl0bGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ5NmIxYwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZm94aXRsaWIuaApAQCAtMCwwICsxLDE3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKy8vIFRPRE8odGhlc3RpZyk6IFJlbW92ZSB0aGlzIGZpbGUgYW5kIGRvIElXWVUuDQorDQorI2lmbmRlZiBfRk9YSVRfTElCX0hfDQorI2RlZmluZSBfRk9YSVRfTElCX0hfDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2ZveGl0eGZhLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZmdhcy9pbmNsdWRlL2ZnYXMuaCINCisjaW5jbHVkZSAieGZhL3NyYy9mZHAvaW5jbHVkZS9mZGUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9mZWUvaW5jbHVkZS9pZmRlX3R4dGVkdGVuZ2luZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZlZS9pbmNsdWRlL2lmZGVfdHh0ZWR0cGFnZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZlZS9pbmNsdWRlL2Z4X3dvcmRicmVhay5oIg0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9iYXJjb2RlaW1wLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9iYXJjb2RlaW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTYxYTkzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2JhcmNvZGVpbXAuY3BwCkBAIC0wLDAgKzEsMjIwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3RhcmdldGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9ub3RlaW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3dpZGdldGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9lZGl0aW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2JhcmNvZGVpbXAuaCINCisNCisvLyBzdGF0aWMNCitJRldMX0JhcmNvZGUqIElGV0xfQmFyY29kZTo6Q3JlYXRlKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcykgew0KKyAgSUZXTF9CYXJjb2RlKiBwQmFyY29kZSA9IG5ldyBJRldMX0JhcmNvZGU7DQorICBDRldMX0JhcmNvZGVJbXAqIHBCYXJjb2RlSW1wbCA9IG5ldyBDRldMX0JhcmNvZGVJbXAocHJvcGVydGllcywgbnVsbHB0cik7DQorICBwQmFyY29kZS0+U2V0SW1wbChwQmFyY29kZUltcGwpOw0KKyAgcEJhcmNvZGVJbXBsLT5TZXRJbnRlcmZhY2UocEJhcmNvZGUpOw0KKyAgcmV0dXJuIHBCYXJjb2RlOw0KK30NCitJRldMX0JhcmNvZGU6OklGV0xfQmFyY29kZSgpIHt9DQordm9pZCBJRldMX0JhcmNvZGU6OlNldFR5cGUoQkNfVFlQRSB0eXBlKSB7DQorICBzdGF0aWNfY2FzdDxDRldMX0JhcmNvZGVJbXAqPihHZXRJbXBsKCkpLT5TZXRUeXBlKHR5cGUpOw0KK30NCitGWF9CT09MIElGV0xfQmFyY29kZTo6SXNQcm90ZWN0ZWRUeXBlKCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfQmFyY29kZUltcCo+KEdldEltcGwoKSktPklzUHJvdGVjdGVkVHlwZSgpOw0KK30NCisNCitDRldMX0JhcmNvZGVJbXA6OkNGV0xfQmFyY29kZUltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikNCisgICAgOiBDRldMX0VkaXRJbXAocHJvcGVydGllcywgcE91dGVyKSwNCisgICAgICBtX3BCYXJjb2RlRW5naW5lKE5VTEwpLA0KKyAgICAgIG1fZHdTdGF0dXMoMCksDQorICAgICAgbV90eXBlKEJDX1VOS05PV04pIHt9DQorQ0ZXTF9CYXJjb2RlSW1wOjp+Q0ZXTF9CYXJjb2RlSW1wKCkgew0KKyAgUmVsZWFzZUJhcmNvZGVFbmdpbmUoKTsNCit9DQorRldMX0VSUiBDRldMX0JhcmNvZGVJbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Qgew0KKyAgd3NDbGFzcyA9IEZXTF9DTEFTU19CYXJjb2RlOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9EV09SRCBDRldMX0JhcmNvZGVJbXA6OkdldENsYXNzSUQoKSBjb25zdCB7DQorICByZXR1cm4gRldMX0NMQVNTSEFTSF9CYXJjb2RlOw0KK30NCitGV0xfRVJSIENGV0xfQmFyY29kZUltcDo6SW5pdGlhbGl6ZSgpIHsNCisgIGlmICghbV9wRGVsZWdhdGUpIHsNCisgICAgbV9wRGVsZWdhdGUgPSBuZXcgQ0ZXTF9CYXJjb2RlSW1wRGVsZWdhdGUodGhpcyk7DQorICB9DQorICBpZiAoQ0ZXTF9FZGl0SW1wOjpJbml0aWFsaXplKCkgIT0gRldMX0VSUl9TdWNjZWVkZWQpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9CYXJjb2RlSW1wOjpGaW5hbGl6ZSgpIHsNCisgIGRlbGV0ZSBtX3BEZWxlZ2F0ZTsNCisgIG1fcERlbGVnYXRlID0gbnVsbHB0cjsNCisgIFJlbGVhc2VCYXJjb2RlRW5naW5lKCk7DQorICByZXR1cm4gQ0ZXTF9FZGl0SW1wOjpGaW5hbGl6ZSgpOw0KK30NCitGV0xfRVJSIENGV0xfQmFyY29kZUltcDo6VXBkYXRlKCkgew0KKyAgaWYgKElzTG9ja2VkKCkpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIH0NCisgIEZXTF9FUlIgcmV0ID0gQ0ZXTF9FZGl0SW1wOjpVcGRhdGUoKTsNCisgIEdlbmVyYXRlQmFyY29kZUltYWdlQ2FjaGUoKTsNCisgIHJldHVybiByZXQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9CYXJjb2RlSW1wOjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIGlmICghcEdyYXBoaWNzKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpID09IDApIHsNCisgICAgR2VuZXJhdGVCYXJjb2RlSW1hZ2VDYWNoZSgpOw0KKyAgICBpZiAoIW1fcEJhcmNvZGVFbmdpbmUgfHwgKG1fZHdTdGF0dXMgJiBYRkFfQkNTX0VuY29kZVN1Y2Nlc3MpID09IDApIHsNCisgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgQ0ZYX01hdHJpeCBtdDsNCisgICAgbXQuZSA9IG1fcnRDbGllbnQubGVmdDsNCisgICAgbXQuZiA9IG1fcnRDbGllbnQudG9wOw0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgIG10LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIH0NCisgICAgaW50MzJfdCBlcnJvckNvZGUgPSAwOw0KKyAgICBpZiAoIW1fcEJhcmNvZGVFbmdpbmUtPlJlbmRlckRldmljZShwR3JhcGhpY3MtPkdldFJlbmRlckRldmljZSgpLCBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUpKSB7DQorICAgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICByZXR1cm4gQ0ZXTF9FZGl0SW1wOjpEcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorfQ0KK3ZvaWQgQ0ZXTF9CYXJjb2RlSW1wOjpHZW5lcmF0ZUJhcmNvZGVJbWFnZUNhY2hlKCkgew0KKyAgaWYgKChtX2R3U3RhdHVzICYgWEZBX0JDU19OZWVkVXBkYXRlKSA9PSAwKQ0KKyAgICByZXR1cm47DQorICBtX2R3U3RhdHVzID0gMDsNCisgIENyZWF0ZUJhcmNvZGVFbmdpbmUoKTsNCisgIElGV0xfQmFyY29kZURQKiBwRGF0YSA9DQorICAgICAgc3RhdGljX2Nhc3Q8SUZXTF9CYXJjb2RlRFAqPihtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgaWYgKCFwRGF0YSkNCisgICAgcmV0dXJuOw0KKyAgaWYgKCFtX3BCYXJjb2RlRW5naW5lKQ0KKyAgICByZXR1cm47DQorICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICBpZiAoR2V0VGV4dCh3c1RleHQpICE9IEZXTF9FUlJfU3VjY2VlZGVkKQ0KKyAgICByZXR1cm47DQorICBDRldMX1RoZW1lUGFydCBwYXJ0Ow0KKyAgcGFydC5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICBJRlhfRm9udCogcEZvbnQgPQ0KKyAgICAgIHN0YXRpY19jYXN0PElGWF9Gb250Kj4ocFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX0ZvbnQpKTsNCisgIENGWF9Gb250KiBwQ1hGb250ID0NCisgICAgICBwRm9udCA/IHN0YXRpY19jYXN0PENGWF9Gb250Kj4ocEZvbnQtPkdldERldkZvbnQoKSkgOiBudWxscHRyOw0KKyAgaWYgKHBDWEZvbnQpIHsNCisgICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0Rm9udChwQ1hGb250KTsNCisgIH0NCisgIEZYX0ZMT0FUKiBwRm9udFNpemUgPSBzdGF0aWNfY2FzdDxGWF9GTE9BVCo+KA0KKyAgICAgIHBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9Gb250U2l6ZSkpOw0KKyAgaWYgKHBGb250U2l6ZSkgew0KKyAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRGb250U2l6ZSgqcEZvbnRTaXplKTsNCisgIH0NCisgIEZYX0FSR0IqIHBGb250Q29sb3IgPSBzdGF0aWNfY2FzdDxGWF9BUkdCKj4oDQorICAgICAgcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX1RleHRDb2xvcikpOw0KKyAgaWYgKHBGb250Q29sb3IpIHsNCisgICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0Rm9udENvbG9yKCpwRm9udENvbG9yKTsNCisgIH0NCisgIG1fcEJhcmNvZGVFbmdpbmUtPlNldEhlaWdodChpbnQzMl90KG1fcnRDbGllbnQuaGVpZ2h0KSk7DQorICBtX3BCYXJjb2RlRW5naW5lLT5TZXRXaWR0aChpbnQzMl90KG1fcnRDbGllbnQud2lkdGgpKTsNCisgIEZYX0RXT1JEIGR3QXR0cmlidXRlTWFzayA9IHBEYXRhLT5HZXRCYXJjb2RlQXR0cmlidXRlTWFzaygpOw0KKyAgaWYgKGR3QXR0cmlidXRlTWFzayAmIEZXTF9CQ0RBVFRSSUJVVEVfQ0hBUkVOQ09ESU5HKSB7DQorICAgIG1fcEJhcmNvZGVFbmdpbmUtPlNldENoYXJFbmNvZGluZyhwRGF0YS0+R2V0Q2hhckVuY29kaW5nKCkpOw0KKyAgfQ0KKyAgaWYgKGR3QXR0cmlidXRlTWFzayAmIEZXTF9CQ0RBVFRSSUJVVEVfTU9EVUxFSEVJR0hUKSB7DQorICAgIG1fcEJhcmNvZGVFbmdpbmUtPlNldE1vZHVsZUhlaWdodChwRGF0YS0+R2V0TW9kdWxlSGVpZ2h0KCkpOw0KKyAgfQ0KKyAgaWYgKGR3QXR0cmlidXRlTWFzayAmIEZXTF9CQ0RBVFRSSUJVVEVfTU9EVUxFV0lEVEgpIHsNCisgICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0TW9kdWxlV2lkdGgocERhdGEtPkdldE1vZHVsZVdpZHRoKCkpOw0KKyAgfQ0KKyAgaWYgKGR3QXR0cmlidXRlTWFzayAmIEZXTF9CQ0RBVFRSSUJVVEVfREFUQUxFTkdUSCkgew0KKyAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXREYXRhTGVuZ3RoKHBEYXRhLT5HZXREYXRhTGVuZ3RoKCkpOw0KKyAgfQ0KKyAgaWYgKGR3QXR0cmlidXRlTWFzayAmIEZXTF9CQ0RBVFRSSUJVVEVfQ0FMQ0hFQ0tTVU0pIHsNCisgICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0Q2FsQ2hlY2tzdW0ocERhdGEtPkdldENhbENoZWNrc3VtKCkpOw0KKyAgfQ0KKyAgaWYgKGR3QXR0cmlidXRlTWFzayAmIEZXTF9CQ0RBVFRSSUJVVEVfUFJJTlRDSEVDS1NVTSkgew0KKyAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRQcmludENoZWNrc3VtKHBEYXRhLT5HZXRQcmludENoZWNrc3VtKCkpOw0KKyAgfQ0KKyAgaWYgKGR3QXR0cmlidXRlTWFzayAmIEZXTF9CQ0RBVFRSSUJVVEVfVEVYVExPQ0FUSU9OKSB7DQorICAgIG1fcEJhcmNvZGVFbmdpbmUtPlNldFRleHRMb2NhdGlvbihwRGF0YS0+R2V0VGV4dExvY2F0aW9uKCkpOw0KKyAgfQ0KKyAgaWYgKGR3QXR0cmlidXRlTWFzayAmIEZXTF9CQ0RBVFRSSUJVVEVfV0lERU5BUlJPV1JBVElPKSB7DQorICAgIG1fcEJhcmNvZGVFbmdpbmUtPlNldFdpZGVOYXJyb3dSYXRpbyhwRGF0YS0+R2V0V2lkZU5hcnJvd1JhdGlvKCkpOw0KKyAgfQ0KKyAgaWYgKGR3QXR0cmlidXRlTWFzayAmIEZXTF9CQ0RBVFRSSUJVVEVfU1RBUlRDSEFSKSB7DQorICAgIG1fcEJhcmNvZGVFbmdpbmUtPlNldFN0YXJ0Q2hhcihwRGF0YS0+R2V0U3RhcnRDaGFyKCkpOw0KKyAgfQ0KKyAgaWYgKGR3QXR0cmlidXRlTWFzayAmIEZXTF9CQ0RBVFRSSUJVVEVfRU5EQ0hBUikgew0KKyAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRFbmRDaGFyKHBEYXRhLT5HZXRFbmRDaGFyKCkpOw0KKyAgfQ0KKyAgaWYgKGR3QXR0cmlidXRlTWFzayAmIEZXTF9CQ0RBVFRSSUJVVEVfVkVSU0lPTikgew0KKyAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRWZXJzaW9uKHBEYXRhLT5HZXRWZXJzaW9uKCkpOw0KKyAgfQ0KKyAgaWYgKGR3QXR0cmlidXRlTWFzayAmIEZXTF9CQ0RBVFRSSUJVVEVfRUNMRVZFTCkgew0KKyAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRFcnJvckNvcnJlY3Rpb25MZXZlbChwRGF0YS0+R2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoKSk7DQorICB9DQorICBpZiAoZHdBdHRyaWJ1dGVNYXNrICYgRldMX0JDREFUVFJJQlVURV9UUlVOQ0FURUQpIHsNCisgICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0VHJ1bmNhdGVkKHBEYXRhLT5HZXRUcnVuY2F0ZWQoKSk7DQorICB9DQorICBpbnQzMl90IGVycm9yQ29kZSA9IDA7DQorICBtX2R3U3RhdHVzID0gbV9wQmFyY29kZUVuZ2luZS0+RW5jb2RlKHdzVGV4dCwgVFJVRSwgZXJyb3JDb2RlKQ0KKyAgICAgICAgICAgICAgICAgICA/IFhGQV9CQ1NfRW5jb2RlU3VjY2Vzcw0KKyAgICAgICAgICAgICAgICAgICA6IDA7DQorfQ0KK3ZvaWQgQ0ZXTF9CYXJjb2RlSW1wOjpDcmVhdGVCYXJjb2RlRW5naW5lKCkgew0KKyAgaWYgKChtX3BCYXJjb2RlRW5naW5lID09IE5VTEwpICYmIChtX3R5cGUgIT0gQkNfVU5LTk9XTikpIHsNCisgICAgbV9wQmFyY29kZUVuZ2luZSA9IEZYX0JhcmNvZGVfQ3JlYXRlKG1fdHlwZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9CYXJjb2RlSW1wOjpSZWxlYXNlQmFyY29kZUVuZ2luZSgpIHsNCisgIGlmIChtX3BCYXJjb2RlRW5naW5lKSB7DQorICAgIG1fcEJhcmNvZGVFbmdpbmUtPlJlbGVhc2UoKTsNCisgICAgbV9wQmFyY29kZUVuZ2luZSA9IE5VTEw7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9CYXJjb2RlSW1wOjpTZXRUeXBlKEJDX1RZUEUgdHlwZSkgew0KKyAgaWYgKG1fdHlwZSA9PSB0eXBlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIFJlbGVhc2VCYXJjb2RlRW5naW5lKCk7DQorICBtX3R5cGUgPSB0eXBlOw0KKyAgbV9kd1N0YXR1cyA9IFhGQV9CQ1NfTmVlZFVwZGF0ZTsNCit9DQorRldMX0VSUiBDRldMX0JhcmNvZGVJbXA6OlNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgUmVsZWFzZUJhcmNvZGVFbmdpbmUoKTsNCisgIG1fZHdTdGF0dXMgPSBYRkFfQkNTX05lZWRVcGRhdGU7DQorICByZXR1cm4gQ0ZXTF9FZGl0SW1wOjpTZXRUZXh0KHdzVGV4dCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9CYXJjb2RlSW1wOjpJc1Byb3RlY3RlZFR5cGUoKSB7DQorICBpZiAoIW1fcEJhcmNvZGVFbmdpbmUpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBCQ19UWVBFIHRFbmdpbmVUeXBlID0gbV9wQmFyY29kZUVuZ2luZS0+R2V0VHlwZSgpOw0KKyAgaWYgKHRFbmdpbmVUeXBlID09IEJDX1FSX0NPREUgfHwgdEVuZ2luZVR5cGUgPT0gQkNfUERGNDE3IHx8DQorICAgICAgdEVuZ2luZVR5cGUgPT0gQkNfREFUQU1BVFJJWCkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorQ0ZXTF9CYXJjb2RlSW1wRGVsZWdhdGU6OkNGV0xfQmFyY29kZUltcERlbGVnYXRlKENGV0xfQmFyY29kZUltcCogcE93bmVyKQ0KKyAgICA6IENGV0xfRWRpdEltcERlbGVnYXRlKHBPd25lcikge30NCitGV0xfRVJSIENGV0xfQmFyY29kZUltcERlbGVnYXRlOjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsNCisgIEZYX0RXT1JEIGR3RmxhZyA9IHBFdmVudC0+R2V0Q2xhc3NJRCgpOw0KKyAgaWYgKGR3RmxhZyA9PSBGV0xfRVZUSEFTSF9FRFRfVGV4dENoYW5nZWQpIHsNCisgICAgQ0ZXTF9CYXJjb2RlSW1wKiBwT3duZXIgPSBzdGF0aWNfY2FzdDxDRldMX0JhcmNvZGVJbXAqPihtX3BPd25lcik7DQorICAgIHBPd25lci0+UmVsZWFzZUJhcmNvZGVFbmdpbmUoKTsNCisgICAgcE93bmVyLT5tX2R3U3RhdHVzID0gWEZBX0JDU19OZWVkVXBkYXRlOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfRWRpdEltcERlbGVnYXRlOjpPblByb2Nlc3NFdmVudChwRXZlbnQpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfY2FyZXRpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2NhcmV0aW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGU2OTFjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2NhcmV0aW1wLmNwcApAQCAtMCwwICsxLDE1NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF90YXJnZXRpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF93aWRnZXRpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfY2FyZXRpbXAuaCINCisNCisvLyBzdGF0aWMNCitJRldMX0NhcmV0KiBJRldMX0NhcmV0OjpDcmVhdGUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKSB7DQorICBJRldMX0NhcmV0KiBwQ2FyZXQgPSBuZXcgSUZXTF9DYXJldDsNCisgIENGV0xfQ2FyZXRJbXAqIHBDYXJldEltcGwgPSBuZXcgQ0ZXTF9DYXJldEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpOw0KKyAgcENhcmV0LT5TZXRJbXBsKHBDYXJldEltcGwpOw0KKyAgcENhcmV0SW1wbC0+U2V0SW50ZXJmYWNlKHBDYXJldCk7DQorICByZXR1cm4gcENhcmV0Ow0KK30NCitJRldMX0NhcmV0OjpJRldMX0NhcmV0KCkge30NCitGV0xfRVJSIElGV0xfQ2FyZXQ6OlNob3dDYXJldChGWF9CT09MIGJGbGFnKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9DYXJldEltcCo+KEdldEltcGwoKSktPlNob3dDYXJldChiRmxhZyk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9DYXJldDo6R2V0RnJlcXVlbmN5KEZYX0RXT1JEJiBlbGFwc2UpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0NhcmV0SW1wKj4oR2V0SW1wbCgpKS0+R2V0RnJlcXVlbmN5KGVsYXBzZSk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9DYXJldDo6U2V0RnJlcXVlbmN5KEZYX0RXT1JEIGVsYXBzZSkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfQ2FyZXRJbXAqPihHZXRJbXBsKCkpLT5TZXRGcmVxdWVuY3koZWxhcHNlKTsNCit9DQorRldMX0VSUiBJRldMX0NhcmV0OjpTZXRDb2xvcihDRlhfQ29sb3IgY3JGaWxsKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9DYXJldEltcCo+KEdldEltcGwoKSktPlNldENvbG9yKGNyRmlsbCk7DQorfQ0KKw0KK0NGV0xfQ2FyZXRJbXA6OkNGV0xfQ2FyZXRJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikNCisgICAgOiBDRldMX1dpZGdldEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpLA0KKyAgICAgIG1faFRpbWVyKG51bGxwdHIpLA0KKyAgICAgIG1fZHdFbGFwc2UoNDAwKSwNCisgICAgICBtX2JTZXRDb2xvcihGQUxTRSkgew0KKyAgbV9wVGltZXIgPSBuZXcgQ0ZXTF9DYXJldFRpbWVyKHRoaXMpOw0KKyAgU2V0U3RhdGVzKEZXTF9TVEFURV9DQVRfSGlnaHRMaWdodCk7DQorfQ0KK0NGV0xfQ2FyZXRJbXA6On5DRldMX0NhcmV0SW1wKCkgew0KKyAgaWYgKG1fcFRpbWVyKSB7DQorICAgIGRlbGV0ZSBtX3BUaW1lcjsNCisgICAgbV9wVGltZXIgPSBOVUxMOw0KKyAgfQ0KK30NCitGV0xfRVJSIENGV0xfQ2FyZXRJbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Qgew0KKyAgd3NDbGFzcyA9IEZXTF9DTEFTU19DYXJldDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9DYXJldEltcDo6R2V0Q2xhc3NJRCgpIGNvbnN0IHsNCisgIHJldHVybiBGV0xfQ0xBU1NIQVNIX0NhcmV0Ow0KK30NCitGV0xfRVJSIENGV0xfQ2FyZXRJbXA6OkluaXRpYWxpemUoKSB7DQorICBpZiAoQ0ZXTF9XaWRnZXRJbXA6OkluaXRpYWxpemUoKSAhPSBGV0xfRVJSX1N1Y2NlZWRlZCkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIG1fcERlbGVnYXRlID0gbmV3IENGV0xfQ2FyZXRJbXBEZWxlZ2F0ZSh0aGlzKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0NhcmV0SW1wOjpGaW5hbGl6ZSgpIHsNCisgIGlmIChtX2hUaW1lcikgew0KKyAgICBGV0xfU3RvcFRpbWVyKG1faFRpbWVyKTsNCisgICAgbV9oVGltZXIgPSBOVUxMOw0KKyAgfQ0KKyAgZGVsZXRlIG1fcERlbGVnYXRlOw0KKyAgbV9wRGVsZWdhdGUgPSBudWxscHRyOw0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpGaW5hbGl6ZSgpOw0KK30NCitGV0xfRVJSIENGV0xfQ2FyZXRJbXA6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIGlmICghcEdyYXBoaWNzKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKQ0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCisgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIERyYXdDYXJldEJLKHBHcmFwaGljcywgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwgcE1hdHJpeCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9DYXJldEltcDo6U2hvd0NhcmV0KEZYX0JPT0wgYkZsYWcpIHsNCisgIGlmIChtX2hUaW1lcikgew0KKyAgICBGV0xfU3RvcFRpbWVyKG1faFRpbWVyKTsNCisgICAgbV9oVGltZXIgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKGJGbGFnKSB7DQorICAgIG1faFRpbWVyID0gRldMX1N0YXJ0VGltZXIobV9wVGltZXIsIG1fZHdFbGFwc2UpOw0KKyAgfQ0KKyAgcmV0dXJuIFNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCAhYkZsYWcpOw0KK30NCitGV0xfRVJSIENGV0xfQ2FyZXRJbXA6OkdldEZyZXF1ZW5jeShGWF9EV09SRCYgZWxhcHNlKSB7DQorICBlbGFwc2UgPSBtX2R3RWxhcHNlOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ2FyZXRJbXA6OlNldEZyZXF1ZW5jeShGWF9EV09SRCBlbGFwc2UpIHsNCisgIG1fZHdFbGFwc2UgPSBlbGFwc2U7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9DYXJldEltcDo6U2V0Q29sb3IoQ0ZYX0NvbG9yIGNyRmlsbCkgew0KKyAgbV9iU2V0Q29sb3IgPSBUUlVFOw0KKyAgbV9jckZpbGwgPSBjckZpbGw7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9DYXJldEltcDo6RHJhd0NhcmV0QksoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGWF9SZWN0RiByZWN0Ow0KKyAgR2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgIHJlY3QuU2V0KDAsIDAsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsNCisgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICBwYXJhbS5tX3J0UGFydCA9IHJlY3Q7DQorICBpZiAobV9iU2V0Q29sb3IpIHsNCisgICAgcGFyYW0ubV9wRGF0YSA9ICZtX2NyRmlsbDsNCisgIH0NCisgIGlmICghKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfQ0FUX0hpZ2h0TGlnaHQpKSB7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIH0NCisgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9DQVRfQmFja2dyb3VuZDsNCisgIHBhcmFtLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0NBVF9IaWdodExpZ2h0Ow0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorQ0ZXTF9DYXJldEltcDo6Q0ZXTF9DYXJldFRpbWVyOjpDRldMX0NhcmV0VGltZXIoQ0ZXTF9DYXJldEltcCogbV9wQ2FyZXQpIHsNCisgIHRoaXMtPm1fcENhcmV0ID0gbV9wQ2FyZXQ7DQorfQ0KK2ludDMyX3QgQ0ZXTF9DYXJldEltcDo6Q0ZXTF9DYXJldFRpbWVyOjpSdW4oRldMX0hUSU1FUiBoVGltZXIpIHsNCisgIGlmIChtX3BDYXJldC0+R2V0U3RhdGVzKCkgJiBGV0xfU1RBVEVfQ0FUX0hpZ2h0TGlnaHQpIHsNCisgICAgbV9wQ2FyZXQtPlNldFN0YXRlcyhGV0xfU1RBVEVfQ0FUX0hpZ2h0TGlnaHQsIEZBTFNFKTsNCisgIH0gZWxzZSB7DQorICAgIG1fcENhcmV0LT5TZXRTdGF0ZXMoRldMX1NUQVRFX0NBVF9IaWdodExpZ2h0KTsNCisgIH0NCisgIENGWF9SZWN0RiBydDsNCisgIG1fcENhcmV0LT5HZXRXaWRnZXRSZWN0KHJ0KTsNCisgIHJ0LlNldCgwLCAwLCBydC53aWR0aCArIDEsIHJ0LmhlaWdodCk7DQorICBtX3BDYXJldC0+UmVwYWludCgmcnQpOw0KKyAgcmV0dXJuIDE7DQorfQ0KK0NGV0xfQ2FyZXRJbXBEZWxlZ2F0ZTo6Q0ZXTF9DYXJldEltcERlbGVnYXRlKENGV0xfQ2FyZXRJbXAqIHBPd25lcikNCisgICAgOiBtX3BPd25lcihwT3duZXIpIHt9DQoraW50MzJfdCBDRldMX0NhcmV0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgcmV0dXJuIDE7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9DYXJldEltcERlbGVnYXRlOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICByZXR1cm4gbV9wT3duZXItPkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2NoZWNrYm94aW1wLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9jaGVja2JveGltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhMjExOQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9jaGVja2JveGltcC5jcHAKQEAgLTAsMCArMSw1NTEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgPGFsZ29yaXRobT4NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF90YXJnZXRpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF93aWRnZXRpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0bWdyaW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2NoZWNrYm94aW1wLmgiDQorI2RlZmluZSBGV0xfQ0tCX0NhcHRpb25NYXJnaW4gNQ0KKw0KKy8vIHN0YXRpYw0KK0lGV0xfQ2hlY2tCb3gqIElGV0xfQ2hlY2tCb3g6OkNyZWF0ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpIHsNCisgIElGV0xfQ2hlY2tCb3gqIHBDaGVja0JveCA9IG5ldyBJRldMX0NoZWNrQm94Ow0KKyAgQ0ZXTF9DaGVja0JveEltcCogcENoZWNrQm94SW1wbCA9IG5ldyBDRldMX0NoZWNrQm94SW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQorICBwQ2hlY2tCb3gtPlNldEltcGwocENoZWNrQm94SW1wbCk7DQorICBwQ2hlY2tCb3hJbXBsLT5TZXRJbnRlcmZhY2UocENoZWNrQm94KTsNCisgIHJldHVybiBwQ2hlY2tCb3g7DQorfQ0KK0lGV0xfQ2hlY2tCb3g6OklGV0xfQ2hlY2tCb3goKSB7fQ0KK2ludDMyX3QgSUZXTF9DaGVja0JveDo6R2V0Q2hlY2tTdGF0ZSgpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0NoZWNrQm94SW1wKj4oR2V0SW1wbCgpKS0+R2V0Q2hlY2tTdGF0ZSgpOw0KK30NCitGV0xfRVJSIElGV0xfQ2hlY2tCb3g6OlNldENoZWNrU3RhdGUoaW50MzJfdCBpQ2hlY2spIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0NoZWNrQm94SW1wKj4oR2V0SW1wbCgpKS0+U2V0Q2hlY2tTdGF0ZShpQ2hlY2spOw0KK30NCisNCitDRldMX0NoZWNrQm94SW1wOjpDRldMX0NoZWNrQm94SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocHJvcGVydGllcywgcE91dGVyKSwNCisgICAgICBtX2R3VFRPU3R5bGVzKEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lKSwNCisgICAgICBtX2lUVE9BbGlnbihGREVfVFRPQUxJR05NRU5UX0NlbnRlciksDQorICAgICAgbV9iQnRuRG93bihGQUxTRSkgew0KKyAgbV9ydENsaWVudC5SZXNldCgpOw0KKyAgbV9ydEJveC5SZXNldCgpOw0KKyAgbV9ydENhcHRpb24uUmVzZXQoKTsNCisgIG1fcnRGb2N1cy5SZXNldCgpOw0KK30NCitDRldMX0NoZWNrQm94SW1wOjp+Q0ZXTF9DaGVja0JveEltcCgpIHt9DQorRldMX0VSUiBDRldMX0NoZWNrQm94SW1wOjpHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2xhc3MpIGNvbnN0IHsNCisgIHdzQ2xhc3MgPSBGV0xfQ0xBU1NfQ2hlY2tCb3g7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfQ2hlY2tCb3hJbXA6OkdldENsYXNzSUQoKSBjb25zdCB7DQorICByZXR1cm4gRldMX0NMQVNTSEFTSF9DaGVja0JveDsNCit9DQorRldMX0VSUiBDRldMX0NoZWNrQm94SW1wOjpJbml0aWFsaXplKCkgew0KKyAgaWYgKENGV0xfV2lkZ2V0SW1wOjpJbml0aWFsaXplKCkgIT0gRldMX0VSUl9TdWNjZWVkZWQpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBtX3BEZWxlZ2F0ZSA9IG5ldyBDRldMX0NoZWNrQm94SW1wRGVsZWdhdGUodGhpcyk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9DaGVja0JveEltcDo6RmluYWxpemUoKSB7DQorICBkZWxldGUgbV9wRGVsZWdhdGU7DQorICBtX3BEZWxlZ2F0ZSA9IG51bGxwdHI7DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OkZpbmFsaXplKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9DaGVja0JveEltcDo6R2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsIEZYX0JPT0wgYkF1dG9TaXplKSB7DQorICBpZiAoYkF1dG9TaXplKSB7DQorICAgIHJlY3QuU2V0KDAsIDAsIDAsIDApOw0KKyAgICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpDQorICAgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICAgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikNCisgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcikNCisgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0NhcHRpb247DQorICAgIG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlci0+R2V0Q2FwdGlvbihtX3BJbnRlcmZhY2UsIHdzQ2FwdGlvbik7DQorICAgIGlmICh3c0NhcHRpb24uR2V0TGVuZ3RoKCkgPiAwKSB7DQorICAgICAgQ0ZYX1NpemVGIHN6ID0gQ2FsY1RleHRTaXplKA0KKyAgICAgICAgICB3c0NhcHRpb24sIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsDQorICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfQ0tCX011bHRpTGluZSk7DQorICAgICAgcmVjdC5TZXQoMCwgMCwgc3oueCwgc3oueSk7DQorICAgIH0NCisgICAgcmVjdC5JbmZsYXRlKEZXTF9DS0JfQ2FwdGlvbk1hcmdpbiwgRldMX0NLQl9DYXB0aW9uTWFyZ2luKTsNCisgICAgSUZXTF9DaGVja0JveERQKiBwRGF0YSA9DQorICAgICAgICBzdGF0aWNfY2FzdDxJRldMX0NoZWNrQm94RFAqPihtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgICBGWF9GTE9BVCBmQ2hlY2tCb3ggPSBwRGF0YS0+R2V0Qm94U2l6ZShtX3BJbnRlcmZhY2UpOw0KKyAgICByZWN0LndpZHRoICs9IGZDaGVja0JveDsNCisgICAgaWYgKHJlY3QuaGVpZ2h0IDwgZkNoZWNrQm94KSB7DQorICAgICAgcmVjdC5oZWlnaHQgPSBmQ2hlY2tCb3g7DQorICAgIH0NCisgICAgQ0ZXTF9XaWRnZXRJbXA6OkdldFdpZGdldFJlY3QocmVjdCwgVFJVRSk7DQorICB9IGVsc2Ugew0KKyAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0NoZWNrQm94SW1wOjpVcGRhdGUoKSB7DQorICBpZiAoSXNMb2NrZWQoKSkgew0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgfQ0KKyAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKSB7DQorICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KKyAgfQ0KKyAgVXBkYXRlVGV4dE91dFN0eWxlcygpOw0KKyAgTGF5b3V0KCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9DaGVja0JveEltcDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgaWYgKCFwR3JhcGhpY3MpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICBpZiAoSGFzQm9yZGVyKCkpIHsNCisgICAgRHJhd0JvcmRlcihwR3JhcGhpY3MsIEZXTF9QQVJUX0NLQl9Cb3JkZXIsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsDQorICAgICAgICAgICAgICAgcE1hdHJpeCk7DQorICB9DQorICBpZiAoSGFzRWRnZSgpKSB7DQorICAgIERyYXdFZGdlKHBHcmFwaGljcywgRldMX1BBUlRfQ0tCX0VkZ2UsIHBUaGVtZSwgcE1hdHJpeCk7DQorICB9DQorICBpbnQzMl90IGR3U3RhdGVzID0gR2V0UGFydFN0YXRlcygpOw0KKyAgew0KKyAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgICAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfQ0tCX0JhY2tncm91bmQ7DQorICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBkd1N0YXRlczsNCisgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgICAgfQ0KKyAgICBwYXJhbS5tX3J0UGFydCA9IG1fcnRDbGllbnQ7DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpIHsNCisgICAgICBwYXJhbS5tX3BEYXRhID0gJm1fcnRGb2N1czsNCisgICAgfQ0KKyAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9DS0JfQ2hlY2tCb3g7DQorICAgIHBhcmFtLm1fcnRQYXJ0ID0gbV9ydEJveDsNCisgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KKyAgfQ0KKyAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQ2FwdGlvbjsNCisgICAgbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyLT5HZXRDYXB0aW9uKG1fcEludGVyZmFjZSwgd3NDYXB0aW9uKTsNCisgICAgaW50MzJfdCBpTGVuID0gd3NDYXB0aW9uLkdldExlbmd0aCgpOw0KKyAgICBpZiAoaUxlbiA8PSAwKQ0KKyAgICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICAgIENGV0xfVGhlbWVUZXh0IHRleHRQYXJhbTsNCisgICAgdGV4dFBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgdGV4dFBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9DS0JfQ2FwdGlvbjsNCisgICAgdGV4dFBhcmFtLm1fZHdTdGF0ZXMgPSBkd1N0YXRlczsNCisgICAgdGV4dFBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgIHRleHRQYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgICB9DQorICAgIHRleHRQYXJhbS5tX3J0UGFydCA9IG1fcnRDYXB0aW9uOw0KKyAgICB0ZXh0UGFyYW0ubV93c1RleHQgPSB3c0NhcHRpb247DQorICAgIHRleHRQYXJhbS5tX2R3VFRPU3R5bGVzID0gbV9kd1RUT1N0eWxlczsNCisgICAgdGV4dFBhcmFtLm1faVRUT0FsaWduID0gbV9pVFRPQWxpZ247DQorICAgIHBUaGVtZS0+RHJhd1RleHQoJnRleHRQYXJhbSk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK2ludDMyX3QgQ0ZXTF9DaGVja0JveEltcDo6R2V0Q2hlY2tTdGF0ZSgpIHsNCisgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DS0JfM1N0YXRlKSAmJg0KKyAgICAgICgobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9DS0JfQ2hlY2tNYXNrKSA9PQ0KKyAgICAgICBGV0xfU1RBVEVfQ0tCX05ldXRyYWwpKSB7DQorICAgIHJldHVybiAyOw0KKyAgfQ0KKyAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1NUQVRFX0NLQl9DaGVja01hc2spID09DQorICAgICAgRldMX1NUQVRFX0NLQl9DaGVja2VkKSB7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9DaGVja0JveEltcDo6U2V0Q2hlY2tTdGF0ZShpbnQzMl90IGlDaGVjaykgew0KKyAgbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1NUQVRFX0NLQl9DaGVja01hc2s7DQorICBzd2l0Y2ggKGlDaGVjaykgew0KKyAgICBjYXNlIDA6IHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIDE6IHsNCisgICAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9DS0JfQ2hlY2tlZDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIDI6IHsNCisgICAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DS0JfM1N0YXRlKSB7DQorICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9DS0JfTmV1dHJhbDsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZGVmYXVsdDoge30NCisgIH0NCisgIFJlcGFpbnQoJm1fcnRDbGllbnQpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCit2b2lkIENGV0xfQ2hlY2tCb3hJbXA6OkxheW91dCgpIHsNCisgIGludDMyX3Qgd2lkdGggPSBpbnQzMl90KG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGggKyAwLjVmKTsNCisgIGludDMyX3QgaGVpZ2h0ID0gaW50MzJfdChtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodCArIDAuNWYpOw0KKyAgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aCA9IChGWF9GTE9BVCl3aWR0aDsNCisgIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0ID0gKEZYX0ZMT0FUKWhlaWdodDsNCisgIEdldENsaWVudFJlY3QobV9ydENsaWVudCk7DQorICBGWF9GTE9BVCBmQm94VG9wID0gbV9ydENsaWVudC50b3A7DQorICBGWF9GTE9BVCBmQm94TGVmdCA9IG1fcnRDbGllbnQubGVmdDsNCisgIEZYX0ZMT0FUIGZUZXh0TGVmdCA9IDAuMCwgZlRleHRSaWdodCA9IDAuMDsNCisgIEZYX0ZMT0FUIGZDbGllbnRSaWdodCA9IG1fcnRDbGllbnQucmlnaHQoKTsNCisgIEZYX0ZMT0FUIGZDbGllbnRCb3R0b20gPSBtX3J0Q2xpZW50LmJvdHRvbSgpOw0KKyAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpDQorICAgIHJldHVybjsNCisgIElGV0xfQ2hlY2tCb3hEUCogcERhdGEgPQ0KKyAgICAgIHN0YXRpY19jYXN0PElGV0xfQ2hlY2tCb3hEUCo+KG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQorICBGWF9GTE9BVCBmQ2hlY2tCb3ggPSBwRGF0YS0+R2V0Qm94U2l6ZShtX3BJbnRlcmZhY2UpOw0KKyAgc3dpdGNoIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NLQl9WTGF5b3V0TWFzaykgew0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfVG9wOiB7DQorICAgICAgZkJveFRvcCA9IG1fcnRDbGllbnQudG9wOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9Cb3R0b206IHsNCisgICAgICBmQm94VG9wID0gZkNsaWVudEJvdHRvbSAtIGZDaGVja0JveDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfVkNlbnRlcjoNCisgICAgZGVmYXVsdDogew0KKyAgICAgIGZCb3hUb3AgPSBtX3J0Q2xpZW50LnRvcCArIChtX3J0Q2xpZW50LmhlaWdodCAtIGZDaGVja0JveCkgLyAyOw0KKyAgICAgIGZCb3hUb3AgPSBGWFNZU19mbG9vcihmQm94VG9wKTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfQ0tCX0xlZnRUZXh0KSB7DQorICAgIGZCb3hMZWZ0ID0gZkNsaWVudFJpZ2h0IC0gZkNoZWNrQm94Ow0KKyAgICBmVGV4dExlZnQgPSBtX3J0Q2xpZW50LmxlZnQ7DQorICAgIGZUZXh0UmlnaHQgPSBmQm94TGVmdDsNCisgIH0gZWxzZSB7DQorICAgIGZUZXh0TGVmdCA9IGZCb3hMZWZ0ICsgZkNoZWNrQm94Ow0KKyAgICBmVGV4dFJpZ2h0ID0gZkNsaWVudFJpZ2h0Ow0KKyAgfQ0KKyAgbV9ydEJveC5TZXQoZkJveExlZnQsIGZCb3hUb3AsIGZDaGVja0JveCwgZkNoZWNrQm94KTsNCisgIG1fcnRDYXB0aW9uLlNldChmVGV4dExlZnQsIG1fcnRDbGllbnQudG9wLCBmVGV4dFJpZ2h0IC0gZlRleHRMZWZ0LA0KKyAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQuaGVpZ2h0KTsNCisgIG1fcnRDYXB0aW9uLkluZmxhdGUoLUZXTF9DS0JfQ2FwdGlvbk1hcmdpbiwgLUZXTF9DS0JfQ2FwdGlvbk1hcmdpbik7DQorICBDRlhfUmVjdEYgcnRGb2N1czsNCisgIHJ0Rm9jdXMuU2V0KG1fcnRDYXB0aW9uLmxlZnQsIG1fcnRDYXB0aW9uLnRvcCwgbV9ydENhcHRpb24ud2lkdGgsDQorICAgICAgICAgICAgICBtX3J0Q2FwdGlvbi5oZWlnaHQpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NDYXB0aW9uOw0KKyAgbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyLT5HZXRDYXB0aW9uKG1fcEludGVyZmFjZSwgd3NDYXB0aW9uKTsNCisgIGlmICh3c0NhcHRpb24uSXNFbXB0eSgpKSB7DQorICAgIG1fcnRGb2N1cy5TZXQoMCwgMCwgMCwgMCk7DQorICB9IGVsc2Ugew0KKyAgICBDYWxjVGV4dFJlY3Qod3NDYXB0aW9uLCBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLCBtX2R3VFRPU3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgbV9pVFRPQWxpZ24sIHJ0Rm9jdXMpOw0KKyAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfQ0tCX011bHRpTGluZSkgPT0gMCkgew0KKyAgICAgIEZYX0ZMT0FUIGZXaWR0aCA9IHN0ZDo6bWF4KG1fcnRDYXB0aW9uLndpZHRoLCBydEZvY3VzLndpZHRoKTsNCisgICAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gc3RkOjptaW4obV9ydENhcHRpb24uaGVpZ2h0LCBydEZvY3VzLmhlaWdodCk7DQorICAgICAgRlhfRkxPQVQgZkxlZnQgPSBtX3J0Q2FwdGlvbi5sZWZ0Ow0KKyAgICAgIEZYX0ZMT0FUIGZUb3AgPSBtX3J0Q2FwdGlvbi50b3A7DQorICAgICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NLQl9ITGF5b3V0TWFzaykgPT0NCisgICAgICAgICAgRldMX1NUWUxFRVhUX0NLQl9DZW50ZXIpIHsNCisgICAgICAgIGZMZWZ0ID0gbV9ydENhcHRpb24ubGVmdCArIChtX3J0Q2FwdGlvbi53aWR0aCAtIGZXaWR0aCkgLyAyOw0KKyAgICAgIH0gZWxzZSBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJg0KKyAgICAgICAgICAgICAgICAgIEZXTF9TVFlMRUVYVF9DS0JfSExheW91dE1hc2spID09IEZXTF9TVFlMRUVYVF9DS0JfUmlnaHQpIHsNCisgICAgICAgIGZMZWZ0ID0gbV9ydENhcHRpb24ucmlnaHQoKSAtIGZXaWR0aDsNCisgICAgICB9DQorICAgICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NLQl9WTGF5b3V0TWFzaykgPT0NCisgICAgICAgICAgRldMX1NUWUxFRVhUX0NLQl9WQ2VudGVyKSB7DQorICAgICAgICBmVG9wID0gbV9ydENhcHRpb24udG9wICsgKG1fcnRDYXB0aW9uLmhlaWdodCAtIGZIZWlnaHQpIC8gMjsNCisgICAgICB9IGVsc2UgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYNCisgICAgICAgICAgICAgICAgICBGV0xfU1RZTEVFWFRfQ0tCX1ZMYXlvdXRNYXNrKSA9PSBGV0xfU1RZTEVFWFRfQ0tCX0JvdHRvbSkgew0KKyAgICAgICAgZlRvcCA9IG1fcnRDYXB0aW9uLmJvdHRvbSgpIC0gZkhlaWdodDsNCisgICAgICB9DQorICAgICAgbV9ydEZvY3VzLlNldChmTGVmdCwgZlRvcCwgZldpZHRoLCBmSGVpZ2h0KTsNCisgICAgfSBlbHNlIHsNCisgICAgICBtX3J0Rm9jdXMuU2V0KHJ0Rm9jdXMubGVmdCwgcnRGb2N1cy50b3AsIHJ0Rm9jdXMud2lkdGgsIHJ0Rm9jdXMuaGVpZ2h0KTsNCisgICAgfQ0KKyAgICBtX3J0Rm9jdXMuSW5mbGF0ZSgxLCAxKTsNCisgIH0NCit9DQorRlhfRFdPUkQgQ0ZXTF9DaGVja0JveEltcDo6R2V0UGFydFN0YXRlcygpIHsNCisgIGludDMyX3QgZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0NLQl9VbkNoZWNrZWQ7DQorICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfQ0tCX0NoZWNrTWFzaykgPT0NCisgICAgICBGV0xfU1RBVEVfQ0tCX05ldXRyYWwpIHsNCisgICAgZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0NLQl9OZXV0cmFsOw0KKyAgfSBlbHNlIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9DS0JfQ2hlY2tNYXNrKSA9PQ0KKyAgICAgICAgICAgICBGV0xfU1RBVEVfQ0tCX0NoZWNrZWQpIHsNCisgICAgZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0NLQl9DaGVja2VkOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpIHsNCisgICAgZHdTdGF0ZXMgfD0gRldMX1BBUlRTVEFURV9DS0JfRGlzYWJsZWQ7DQorICB9IGVsc2UgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfQ0tCX0hvdmVyZWQpIHsNCisgICAgZHdTdGF0ZXMgfD0gRldMX1BBUlRTVEFURV9DS0JfSG92ZXJlZDsNCisgIH0gZWxzZSBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9DS0JfUHJlc3NlZCkgew0KKyAgICBkd1N0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX0NLQl9QcmVzc2VkOw0KKyAgfSBlbHNlIHsNCisgICAgZHdTdGF0ZXMgfD0gRldMX1BBUlRTVEFURV9DS0JfTm9ybWFsOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgew0KKyAgICBkd1N0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX0NLQl9Gb2N1c2VkOw0KKyAgfQ0KKyAgcmV0dXJuIGR3U3RhdGVzOw0KK30NCit2b2lkIENGV0xfQ2hlY2tCb3hJbXA6OlVwZGF0ZVRleHRPdXRTdHlsZXMoKSB7DQorICBtX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyOw0KKyAgc3dpdGNoIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYNCisgICAgICAgICAgKEZXTF9TVFlMRUVYVF9DS0JfSExheW91dE1hc2sgfCBGV0xfU1RZTEVFWFRfQ0tCX1ZMYXlvdXRNYXNrKSkgew0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfTGVmdCB8IEZXTF9TVFlMRUVYVF9DS0JfVG9wOiB7DQorICAgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX1RvcExlZnQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX0NlbnRlciB8IEZXTF9TVFlMRUVYVF9DS0JfVG9wOiB7DQorICAgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX1RvcENlbnRlcjsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfUmlnaHQgfCBGV0xfU1RZTEVFWFRfQ0tCX1RvcDogew0KKyAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9Ub3BSaWdodDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfTGVmdCB8IEZXTF9TVFlMRUVYVF9DS0JfVkNlbnRlcjogew0KKyAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJMZWZ0Ow0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9DZW50ZXIgfCBGV0xfU1RZTEVFWFRfQ0tCX1ZDZW50ZXI6IHsNCisgICAgICBtX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9SaWdodCB8IEZXTF9TVFlMRUVYVF9DS0JfVkNlbnRlcjogew0KKyAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJSaWdodDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfTGVmdCB8IEZXTF9TVFlMRUVYVF9DS0JfQm90dG9tOiB7DQorICAgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0JvdHRvbUxlZnQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX0NlbnRlciB8IEZXTF9TVFlMRUVYVF9DS0JfQm90dG9tOiB7DQorICAgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0JvdHRvbUNlbnRlcjsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfUmlnaHQgfCBGV0xfU1RZTEVFWFRfQ0tCX0JvdHRvbTogew0KKyAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9Cb3R0b21SaWdodDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KKyAgbV9kd1RUT1N0eWxlcyA9IDA7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9XR1RTVFlMRV9SVExSZWFkaW5nKSB7DQorICAgIG1fZHdUVE9TdHlsZXMgfD0gRkRFX1RUT1NUWUxFX1JUTDsNCisgIH0NCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NLQl9NdWx0aUxpbmUpIHsNCisgICAgbV9kd1RUT1N0eWxlcyB8PSBGREVfVFRPU1RZTEVfTGluZVdyYXA7DQorICB9IGVsc2Ugew0KKyAgICBtX2R3VFRPU3R5bGVzIHw9IEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfQ2hlY2tCb3hJbXA6Ok5leHRTdGF0ZXMoKSB7DQorICBGWF9EV09SRCBkd0ZpcnN0c3RhdGUgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzOw0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfQ0tCX1JhZGlvQnV0dG9uKSB7DQorICAgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9DS0JfQ2hlY2tNYXNrKSA9PQ0KKyAgICAgICAgRldMX1NUQVRFX0NLQl9VbmNoZWNrZWQpIHsNCisgICAgICBDRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9DQorICAgICAgICAgIHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0TWdyKj4oRldMX0dldFdpZGdldE1ncigpKTsNCisgICAgICBpZiAoIXBXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgICAgIENGWF9QdHJBcnJheSByYWRpb2FycjsNCisgICAgICAgIHBXaWRnZXRNZ3ItPkdldFNhbWVHcm91cFJhZGlvQnV0dG9uKG1fcEludGVyZmFjZSwgcmFkaW9hcnIpOw0KKyAgICAgICAgSUZXTF9DaGVja0JveCogcENoZWNrQm94ID0gTlVMTDsNCisgICAgICAgIGludDMyX3QgaUNvdW50ID0gcmFkaW9hcnIuR2V0U2l6ZSgpOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICAgICAgcENoZWNrQm94ID0gc3RhdGljX2Nhc3Q8SUZXTF9DaGVja0JveCo+KHJhZGlvYXJyW2ldKTsNCisgICAgICAgICAgaWYgKHBDaGVja0JveCAhPSBtX3BJbnRlcmZhY2UgJiYNCisgICAgICAgICAgICAgIHBDaGVja0JveC0+R2V0U3RhdGVzKCkgJiBGV0xfU1RBVEVfQ0tCX0NoZWNrZWQpIHsNCisgICAgICAgICAgICBwQ2hlY2tCb3gtPlNldENoZWNrU3RhdGUoMCk7DQorICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0Ow0KKyAgICAgICAgICAgIHBDaGVja0JveC0+R2V0V2lkZ2V0UmVjdChydCk7DQorICAgICAgICAgICAgcnQubGVmdCA9IHJ0LnRvcCA9IDA7DQorICAgICAgICAgICAgbV9wV2lkZ2V0TWdyLT5SZXBhaW50V2lkZ2V0KHBDaGVja0JveCwgJnJ0KTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9DS0JfQ2hlY2tlZDsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1NUQVRFX0NLQl9DaGVja01hc2spID09DQorICAgICAgICBGV0xfU1RBVEVfQ0tCX05ldXRyYWwpIHsNCisgICAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfU1RBVEVfQ0tCX0NoZWNrTWFzazsNCisgICAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DS0JfM1N0YXRlKSB7DQorICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9DS0JfQ2hlY2tlZDsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfQ0tCX0NoZWNrTWFzaykgPT0NCisgICAgICAgICAgICAgICBGV0xfU1RBVEVfQ0tCX0NoZWNrZWQpIHsNCisgICAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfU1RBVEVfQ0tCX0NoZWNrTWFzazsNCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DS0JfM1N0YXRlKSB7DQorICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9DS0JfTmV1dHJhbDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfU1RBVEVfQ0tCX0NoZWNrZWQ7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBSZXBhaW50KCZtX3J0Q2xpZW50KTsNCisgIEZYX0RXT1JEIGR3TGFzdHN0YXRlID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCisgIGlmIChkd0ZpcnN0c3RhdGUgIT0gZHdMYXN0c3RhdGUpIHsNCisgICAgQ0ZXTF9FdnRDa2JDaGVja1N0YXRlQ2hhbmdlZCB3bUNoZWNrQm94U3RhdGU7DQorICAgIHdtQ2hlY2tCb3hTdGF0ZS5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIERpc3BhdGNoRXZlbnQoJndtQ2hlY2tCb3hTdGF0ZSk7DQorICB9DQorfQ0KK0NGV0xfQ2hlY2tCb3hJbXBEZWxlZ2F0ZTo6Q0ZXTF9DaGVja0JveEltcERlbGVnYXRlKENGV0xfQ2hlY2tCb3hJbXAqIHBPd25lcikNCisgICAgOiBtX3BPd25lcihwT3duZXIpIHt9DQoraW50MzJfdCBDRldMX0NoZWNrQm94SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgaWYgKCFwTWVzc2FnZSkNCisgICAgcmV0dXJuIDA7DQorICBGWF9EV09SRCBkd01zZ0NvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KKyAgaW50MzJfdCBpUmV0ID0gMTsNCisgIHN3aXRjaCAoZHdNc2dDb2RlKSB7DQorICAgIGNhc2UgRldMX01TR0hBU0hfQWN0aXZhdGU6IHsNCisgICAgICBPbkFjdGl2YXRlKHBNZXNzYWdlKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX1NldEZvY3VzOg0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX0tpbGxGb2N1czogew0KKyAgICAgIE9uRm9jdXNDaGFuZ2VkKHBNZXNzYWdlLCBkd01zZ0NvZGUgPT0gRldMX01TR0hBU0hfU2V0Rm9jdXMpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01TR0hBU0hfTW91c2U6IHsNCisgICAgICBDRldMX01zZ01vdXNlKiBwTXNnID0gc3RhdGljX2Nhc3Q8Q0ZXTF9Nc2dNb3VzZSo+KHBNZXNzYWdlKTsNCisgICAgICBGWF9EV09SRCBkd0NtZCA9IHBNc2ctPm1fZHdDbWQ7DQorICAgICAgc3dpdGNoIChkd0NtZCkgew0KKyAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRvd246IHsNCisgICAgICAgICAgT25MQnV0dG9uRG93bihwTXNnKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA6IHsNCisgICAgICAgICAgT25MQnV0dG9uVXAocE1zZyk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTW91c2VNb3ZlOiB7DQorICAgICAgICAgIE9uTW91c2VNb3ZlKHBNc2cpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTGVhdmU6IHsNCisgICAgICAgICAgT25Nb3VzZUxlYXZlKHBNc2cpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHt9DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01TR0hBU0hfS2V5OiB7DQorICAgICAgQ0ZXTF9Nc2dLZXkqIHBLZXkgPSBzdGF0aWNfY2FzdDxDRldMX01zZ0tleSo+KHBNZXNzYWdlKTsNCisgICAgICBpZiAocEtleS0+bV9kd0NtZCA9PSBGV0xfTVNHS0VZQ01EX0tleURvd24pIHsNCisgICAgICAgIE9uS2V5RG93bihwS2V5KTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZGVmYXVsdDogeyBpUmV0ID0gMDsgfQ0KKyAgfQ0KKyAgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorICByZXR1cm4gaVJldDsNCit9DQorRldMX0VSUiBDRldMX0NoZWNrQm94SW1wRGVsZWdhdGU6Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIHJldHVybiBtX3BPd25lci0+RHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KK30NCit2b2lkIENGV0xfQ2hlY2tCb3hJbXBEZWxlZ2F0ZTo6T25BY3RpdmF0ZShDRldMX01lc3NhZ2UqIHBNc2cpIHsNCisgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfV0dUU1RBVEVfRGVhY3RpdmF0ZWQ7DQorICBtX3BPd25lci0+UmVwYWludCgmKG1fcE93bmVyLT5tX3J0Q2xpZW50KSk7DQorfQ0KK3ZvaWQgQ0ZXTF9DaGVja0JveEltcERlbGVnYXRlOjpPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UqIHBNc2csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldCkgew0KKyAgaWYgKGJTZXQpIHsNCisgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICB9IGVsc2Ugew0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICB9DQorICBtX3BPd25lci0+UmVwYWludCgmKG1fcE93bmVyLT5tX3J0Q2xpZW50KSk7DQorfQ0KK3ZvaWQgQ0ZXTF9DaGVja0JveEltcERlbGVnYXRlOjpPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpID09IDApIHsNCisgICAgbV9wT3duZXItPlNldEZvY3VzKFRSVUUpOw0KKyAgfQ0KKyAgbV9wT3duZXItPm1fYkJ0bkRvd24gPSBUUlVFOw0KKyAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9TVEFURV9DS0JfSG92ZXJlZDsNCisgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9DS0JfUHJlc3NlZDsNCisgIG1fcE93bmVyLT5SZXBhaW50KCYobV9wT3duZXItPm1fcnRDbGllbnQpKTsNCit9DQordm9pZCBDRldMX0NoZWNrQm94SW1wRGVsZWdhdGU6Ok9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmICghbV9wT3duZXItPm1fYkJ0bkRvd24pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV9wT3duZXItPm1fYkJ0bkRvd24gPSBGQUxTRTsNCisgIGlmICghbV9wT3duZXItPm1fcnRDbGllbnQuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX0NLQl9Ib3ZlcmVkOw0KKyAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9TVEFURV9DS0JfUHJlc3NlZDsNCisgIG1fcE93bmVyLT5OZXh0U3RhdGVzKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9DaGVja0JveEltcERlbGVnYXRlOjpPbk1vdXNlTW92ZShDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfQk9PTCBiUmVwYWludCA9IEZBTFNFOw0KKyAgaWYgKG1fcE93bmVyLT5tX2JCdG5Eb3duKSB7DQorICAgIGlmIChtX3BPd25lci0+bV9ydENsaWVudC5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICAgIGlmICgobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfQ0tCX1ByZXNzZWQpID09IDApIHsNCisgICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCisgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9TVEFURV9DS0JfUHJlc3NlZDsNCisgICAgICB9DQorICAgICAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9DS0JfSG92ZXJlZCkpIHsNCisgICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCisgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfU1RBVEVfQ0tCX0hvdmVyZWQ7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9DS0JfUHJlc3NlZCkgew0KKyAgICAgICAgYlJlcGFpbnQgPSBUUlVFOw0KKyAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9TVEFURV9DS0JfUHJlc3NlZDsNCisgICAgICB9DQorICAgICAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9DS0JfSG92ZXJlZCkgPT0gMCkgew0KKyAgICAgICAgYlJlcGFpbnQgPSBUUlVFOw0KKyAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX0NLQl9Ib3ZlcmVkOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgaWYgKG1fcE93bmVyLT5tX3J0Q2xpZW50LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgICAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9DS0JfSG92ZXJlZCkgPT0gMCkgew0KKyAgICAgICAgYlJlcGFpbnQgPSBUUlVFOw0KKyAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX0NLQl9Ib3ZlcmVkOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGJSZXBhaW50KSB7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCYobV9wT3duZXItPm1fcnRCb3gpKTsNCisgIH0NCit9DQordm9pZCBDRldMX0NoZWNrQm94SW1wRGVsZWdhdGU6Ok9uTW91c2VMZWF2ZShDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBpZiAobV9wT3duZXItPm1fYkJ0bkRvd24pIHsNCisgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX0NLQl9Ib3ZlcmVkOw0KKyAgfSBlbHNlIHsNCisgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9TVEFURV9DS0JfSG92ZXJlZDsNCisgIH0NCisgIG1fcE93bmVyLT5SZXBhaW50KCYobV9wT3duZXItPm1fcnRCb3gpKTsNCit9DQordm9pZCBDRldMX0NoZWNrQm94SW1wRGVsZWdhdGU6Ok9uS2V5RG93bihDRldMX01zZ0tleSogcE1zZykgew0KKyAgaWYgKHBNc2ctPm1fZHdLZXlDb2RlID09IEZXTF9WS0VZX1RhYikgew0KKyAgICBtX3BPd25lci0+RGlzcGF0Y2hLZXlFdmVudChwTXNnKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKHBNc2ctPm1fZHdLZXlDb2RlID09IEZXTF9WS0VZX1JldHVybiB8fA0KKyAgICAgIHBNc2ctPm1fZHdLZXlDb2RlID09IEZXTF9WS0VZX1NwYWNlKSB7DQorICAgIG1fcE93bmVyLT5OZXh0U3RhdGVzKCk7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9jb21ib2JveGltcC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfY29tYm9ib3hpbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZTgyM2EKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfY29tYm9ib3hpbXAuY3BwCkBAIC0wLDAgKzEsMTg2NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF90aHJlYWRpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfYXBwaW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3RhcmdldGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9ub3RlaW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3dpZGdldGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9wYW5lbGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9mb3JtaW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3dpZGdldG1ncmltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9zY3JvbGxiYXJpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfZWRpdGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9saXN0Ym94aW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2Zvcm1wcm94eWltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9jb21ib2JveGltcC5oIg0KKw0KKy8vIHN0YXRpYw0KK0lGV0xfQ29tYm9Cb3gqIElGV0xfQ29tYm9Cb3g6OkNyZWF0ZSgNCisgICAgY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzKSB7DQorICBJRldMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPSBuZXcgSUZXTF9Db21ib0JveDsNCisgIENGV0xfQ29tYm9Cb3hJbXAqIHBDb21ib0JveEltcGwgPSBuZXcgQ0ZXTF9Db21ib0JveEltcChwcm9wZXJ0aWVzLCBudWxscHRyKTsNCisgIHBDb21ib0JveC0+U2V0SW1wbChwQ29tYm9Cb3hJbXBsKTsNCisgIHBDb21ib0JveEltcGwtPlNldEludGVyZmFjZShwQ29tYm9Cb3gpOw0KKyAgcmV0dXJuIHBDb21ib0JveDsNCit9DQorSUZXTF9Db21ib0JveDo6SUZXTF9Db21ib0JveCgpIHt9DQoraW50MzJfdCBJRldMX0NvbWJvQm94OjpHZXRDdXJTZWwoKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9Db21ib0JveEltcCo+KEdldEltcGwoKSktPkdldEN1clNlbCgpOw0KK30NCitGV0xfRVJSIElGV0xfQ29tYm9Cb3g6OlNldEN1clNlbChpbnQzMl90IGlTZWwpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0NvbWJvQm94SW1wKj4oR2V0SW1wbCgpKS0+U2V0Q3VyU2VsKGlTZWwpOw0KK30NCitGV0xfRVJSIElGV0xfQ29tYm9Cb3g6OlNldEVkaXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0NvbWJvQm94SW1wKj4oR2V0SW1wbCgpKS0+U2V0RWRpdFRleHQod3NUZXh0KTsNCit9DQoraW50MzJfdCBJRldMX0NvbWJvQm94OjpHZXRFZGl0VGV4dExlbmd0aCgpIGNvbnN0IHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0NvbWJvQm94SW1wKj4oR2V0SW1wbCgpKS0+R2V0RWRpdFRleHRMZW5ndGgoKTsNCit9DQorRldMX0VSUiBJRldMX0NvbWJvQm94OjpHZXRFZGl0VGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCkgY29uc3Qgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfQ29tYm9Cb3hJbXAqPihHZXRJbXBsKCkpDQorICAgICAgLT5HZXRFZGl0VGV4dCh3c1RleHQsIG5TdGFydCwgbkNvdW50KTsNCit9DQorRldMX0VSUiBJRldMX0NvbWJvQm94OjpTZXRFZGl0U2VsUmFuZ2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9Db21ib0JveEltcCo+KEdldEltcGwoKSkNCisgICAgICAtPlNldEVkaXRTZWxSYW5nZShuU3RhcnQsIG5Db3VudCk7DQorfQ0KK2ludDMyX3QgSUZXTF9Db21ib0JveDo6R2V0RWRpdFNlbFJhbmdlKGludDMyX3QgbkluZGV4LCBpbnQzMl90JiBuU3RhcnQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0NvbWJvQm94SW1wKj4oR2V0SW1wbCgpKQ0KKyAgICAgIC0+R2V0RWRpdFNlbFJhbmdlKG5JbmRleCwgblN0YXJ0KTsNCit9DQoraW50MzJfdCBJRldMX0NvbWJvQm94OjpHZXRFZGl0TGltaXQoKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9Db21ib0JveEltcCo+KEdldEltcGwoKSktPkdldEVkaXRMaW1pdCgpOw0KK30NCitGV0xfRVJSIElGV0xfQ29tYm9Cb3g6OlNldEVkaXRMaW1pdChpbnQzMl90IG5MaW1pdCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfQ29tYm9Cb3hJbXAqPihHZXRJbXBsKCkpLT5TZXRFZGl0TGltaXQobkxpbWl0KTsNCit9DQorRldMX0VSUiBJRldMX0NvbWJvQm94OjpFZGl0RG9DbGlwYm9hcmQoaW50MzJfdCBpQ21kKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9Db21ib0JveEltcCo+KEdldEltcGwoKSktPkVkaXREb0NsaXBib2FyZChpQ21kKTsNCit9DQorRlhfQk9PTCBJRldMX0NvbWJvQm94OjpFZGl0UmVkbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9Db21ib0JveEltcCo+KEdldEltcGwoKSktPkVkaXRSZWRvKGJzUmVjb3JkKTsNCit9DQorRlhfQk9PTCBJRldMX0NvbWJvQm94OjpFZGl0VW5kbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9Db21ib0JveEltcCo+KEdldEltcGwoKSktPkVkaXRVbmRvKGJzUmVjb3JkKTsNCit9DQorSUZXTF9MaXN0Qm94KiBJRldMX0NvbWJvQm94OjpHZXRMaXN0Qm94dCgpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0NvbWJvQm94SW1wKj4oR2V0SW1wbCgpKS0+R2V0TGlzdEJveHQoKTsNCit9DQorRlhfQk9PTCBJRldMX0NvbWJvQm94OjpBZnRlckZvY3VzU2hvd0Ryb3BMaXN0KCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfQ29tYm9Cb3hJbXAqPihHZXRJbXBsKCkpLT5BZnRlckZvY3VzU2hvd0Ryb3BMaXN0KCk7DQorfQ0KK0ZYX0VSUiBJRldMX0NvbWJvQm94OjpPcGVuRHJvcERvd25MaXN0KEZYX0JPT0wgYkFjdGl2YXRlKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9Db21ib0JveEltcCo+KEdldEltcGwoKSktPk9wZW5Ecm9wRG93bkxpc3QoYkFjdGl2YXRlKTsNCit9DQorRlhfQk9PTCBJRldMX0NvbWJvQm94OjpFZGl0Q2FuVW5kbygpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0NvbWJvQm94SW1wKj4oR2V0SW1wbCgpKS0+RWRpdENhblVuZG8oKTsNCit9DQorRlhfQk9PTCBJRldMX0NvbWJvQm94OjpFZGl0Q2FuUmVkbygpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0NvbWJvQm94SW1wKj4oR2V0SW1wbCgpKS0+RWRpdENhblJlZG8oKTsNCit9DQorRlhfQk9PTCBJRldMX0NvbWJvQm94OjpFZGl0VW5kbygpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0NvbWJvQm94SW1wKj4oR2V0SW1wbCgpKS0+RWRpdFVuZG8oKTsNCit9DQorRlhfQk9PTCBJRldMX0NvbWJvQm94OjpFZGl0UmVkbygpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0NvbWJvQm94SW1wKj4oR2V0SW1wbCgpKS0+RWRpdFJlZG8oKTsNCit9DQorRlhfQk9PTCBJRldMX0NvbWJvQm94OjpFZGl0Q2FuQ29weSgpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0NvbWJvQm94SW1wKj4oR2V0SW1wbCgpKS0+RWRpdENhbkNvcHkoKTsNCit9DQorRlhfQk9PTCBJRldMX0NvbWJvQm94OjpFZGl0Q2FuQ3V0KCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfQ29tYm9Cb3hJbXAqPihHZXRJbXBsKCkpLT5FZGl0Q2FuQ3V0KCk7DQorfQ0KK0ZYX0JPT0wgSUZXTF9Db21ib0JveDo6RWRpdENhblNlbGVjdEFsbCgpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0NvbWJvQm94SW1wKj4oR2V0SW1wbCgpKS0+RWRpdENhblNlbGVjdEFsbCgpOw0KK30NCitGWF9CT09MIElGV0xfQ29tYm9Cb3g6OkVkaXRDb3B5KENGWF9XaWRlU3RyaW5nJiB3c0NvcHkpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0NvbWJvQm94SW1wKj4oR2V0SW1wbCgpKS0+RWRpdENvcHkod3NDb3B5KTsNCit9DQorRlhfQk9PTCBJRldMX0NvbWJvQm94OjpFZGl0Q3V0KENGWF9XaWRlU3RyaW5nJiB3c0N1dCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfQ29tYm9Cb3hJbXAqPihHZXRJbXBsKCkpLT5FZGl0Q3V0KHdzQ3V0KTsNCit9DQorRlhfQk9PTCBJRldMX0NvbWJvQm94OjpFZGl0UGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGFzdGUpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0NvbWJvQm94SW1wKj4oR2V0SW1wbCgpKS0+RWRpdFBhc3RlKHdzUGFzdGUpOw0KK30NCitGWF9CT09MIElGV0xfQ29tYm9Cb3g6OkVkaXRTZWxlY3RBbGwoKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9Db21ib0JveEltcCo+KEdldEltcGwoKSktPkVkaXRTZWxlY3RBbGwoKTsNCit9DQorRlhfQk9PTCBJRldMX0NvbWJvQm94OjpFZGl0RGVsZXRlKCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfQ29tYm9Cb3hJbXAqPihHZXRJbXBsKCkpLT5FZGl0RGVsZXRlKCk7DQorfQ0KK0ZYX0JPT0wgSUZXTF9Db21ib0JveDo6RWRpdERlU2VsZWN0KCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfQ29tYm9Cb3hJbXAqPihHZXRJbXBsKCkpLT5FZGl0RGVTZWxlY3QoKTsNCit9DQorRldMX0VSUiBJRldMX0NvbWJvQm94OjpHZXRCQm94KENGWF9SZWN0RiYgcmVjdCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfQ29tYm9Cb3hJbXAqPihHZXRJbXBsKCkpLT5HZXRCQm94KHJlY3QpOw0KK30NCitGV0xfRVJSIElGV0xfQ29tYm9Cb3g6OkVkaXRNb2RpZnlTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0NvbWJvQm94SW1wKj4oR2V0SW1wbCgpKQ0KKyAgICAgIC0+RWRpdE1vZGlmeVN0eWxlc0V4KGR3U3R5bGVzRXhBZGRlZCwgZHdTdHlsZXNFeFJlbW92ZWQpOw0KK30NCisNCitDRldMX0NvbWJvRWRpdEltcDo6Q0ZXTF9Db21ib0VkaXRJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKQ0KKyAgICA6IENGV0xfRWRpdEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpIHsNCisgIG1fcE91dGVyID0gc3RhdGljX2Nhc3Q8Q0ZXTF9Db21ib0JveEltcCo+KHBPdXRlci0+R2V0SW1wbCgpKTsNCit9DQorDQorQ0ZXTF9Db21ib0VkaXRJbXBEZWxlZ2F0ZTo6Q0ZXTF9Db21ib0VkaXRJbXBEZWxlZ2F0ZShDRldMX0NvbWJvRWRpdEltcCogcE93bmVyKQ0KKyAgICA6IENGV0xfRWRpdEltcERlbGVnYXRlKHBPd25lciksIG1fcE93bmVyKHBPd25lcikgew0KK30NCitpbnQzMl90IENGV0xfQ29tYm9FZGl0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgaWYgKCFwTWVzc2FnZSkNCisgICAgcmV0dXJuIDA7DQorICBGWF9EV09SRCBkd01zZ0NvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KKyAgRlhfQk9PTCBiYWNrRGVmYXVsdCA9IFRSVUU7DQorICBzd2l0Y2ggKGR3TXNnQ29kZSkgew0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX1NldEZvY3VzOg0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX0tpbGxGb2N1czogew0KKyAgICAgIGlmIChkd01zZ0NvZGUgPT0gRldMX01TR0hBU0hfU2V0Rm9jdXMpIHsNCisgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9XR1RTVEFURV9Gb2N1c2VkOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICAgICAgfQ0KKyAgICAgIGJhY2tEZWZhdWx0ID0gRkFMU0U7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9Nb3VzZTogew0KKyAgICAgIENGV0xfTXNnTW91c2UqIHBNc2cgPSBzdGF0aWNfY2FzdDxDRldMX01zZ01vdXNlKj4ocE1lc3NhZ2UpOw0KKyAgICAgIGlmICgocE1zZy0+bV9kd0NtZCA9PSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRvd24pICYmDQorICAgICAgICAgICgobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgPT0gMCkpIHsNCisgICAgICAgIG1fcE93bmVyLT5TZXRTZWxlY3RlZCgpOw0KKyAgICAgICAgbV9wT3duZXItPlNldENvbWJvQm94Rm9jdXMoVFJVRSk7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQorICBpZiAoIWJhY2tEZWZhdWx0KSB7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfRWRpdEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCit9DQordm9pZCBDRldMX0NvbWJvRWRpdEltcDo6Q2xlYXJTZWxlY3RlZCgpIHsNCisgIENsZWFyU2VsZWN0aW9ucygpOw0KKyAgUmVwYWludCgmbV9ydENsaWVudCk7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0VkaXRJbXA6OlNldFNlbGVjdGVkKCkgew0KKyAgRmxhZ0ZvY3VzKFRSVUUpOw0KKyAgRW5kQ2FyZXQoKTsNCisgIEFkZFNlbFJhbmdlKDApOw0KK30NCit2b2lkIENGV0xfQ29tYm9FZGl0SW1wOjpFbmRDYXJldCgpIHsNCisgIG1fcEVkdEVuZ2luZS0+TW92ZUNhcmV0UG9zKE1DX0VuZCk7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0VkaXRJbXA6OkZsYWdGb2N1cyhGWF9CT09MIGJTZXQpIHsNCisgIGlmIChiU2V0KSB7DQorICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICB9IGVsc2Ugew0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfV0dUU1RBVEVfRm9jdXNlZDsNCisgICAgU2hvd0NhcmV0KEZBTFNFKTsNCisgIH0NCit9Ow0KK3ZvaWQgQ0ZXTF9Db21ib0VkaXRJbXA6OlNldENvbWJvQm94Rm9jdXMoRlhfQk9PTCBiU2V0KSB7DQorICBtX3BPdXRlci0+U2V0Rm9jdXMoYlNldCk7DQorfQ0KK0NGV0xfQ29tYm9MaXN0SW1wOjpDRldMX0NvbWJvTGlzdEltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpDQorICAgIDogQ0ZXTF9MaXN0Qm94SW1wKHByb3BlcnRpZXMsIHBPdXRlciksIG1fYk5vdGlmeU93bmVyKFRSVUUpIHsNCisgIEZYU1lTX2Fzc2VydChwT3V0ZXIgIT0gTlVMTCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0xpc3RJbXA6OkluaXRpYWxpemUoKSB7DQorICBpZiAoQ0ZXTF9MaXN0Qm94SW1wOjpJbml0aWFsaXplKCkgIT0gRldMX0VSUl9TdWNjZWVkZWQpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBkZWxldGUgbV9wRGVsZWdhdGU7DQorICBtX3BEZWxlZ2F0ZSA9IG5ldyBDRldMX0NvbWJvTGlzdEltcERlbGVnYXRlKHRoaXMpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9MaXN0SW1wOjpGaW5hbGl6ZSgpIHsNCisgIGRlbGV0ZSBtX3BEZWxlZ2F0ZTsNCisgIG1fcERlbGVnYXRlID0gbnVsbHB0cjsNCisgIHJldHVybiBDRldMX0xpc3RCb3hJbXA6OkZpbmFsaXplKCk7DQorfQ0KK2ludDMyX3QgQ0ZXTF9Db21ib0xpc3RJbXA6Ok1hdGNoSXRlbShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NNYXRjaCkgew0KKyAgaWYgKHdzTWF0Y2guSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIGlmICghbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKQ0KKyAgICByZXR1cm4gLTE7DQorICBJRldMX0xpc3RCb3hEUCogcERhdGEgPQ0KKyAgICAgIHN0YXRpY19jYXN0PElGV0xfTGlzdEJveERQKj4obV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgIGludDMyX3QgaUNvdW50ID0gcERhdGEtPkNvdW50SXRlbXMobV9wSW50ZXJmYWNlKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGkpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICAgIHBEYXRhLT5HZXRJdGVtVGV4dChtX3BJbnRlcmZhY2UsIGhJdGVtLCB3c1RleHQpOw0KKyAgICBGWF9TVFJTSVpFIHBvcyA9IHdzVGV4dC5GaW5kKHdzTWF0Y2guY19zdHIoKSk7DQorICAgIGlmICghcG9zKSB7DQorICAgICAgcmV0dXJuIGk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiAtMTsNCit9DQordm9pZCBDRldMX0NvbWJvTGlzdEltcDo6Q2hhbmdlU2VsZWN0ZWQoaW50MzJfdCBpU2VsKSB7DQorICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcikNCisgICAgcmV0dXJuOw0KKyAgSUZXTF9MaXN0Qm94RFAqIHBEYXRhID0NCisgICAgICBzdGF0aWNfY2FzdDxJRldMX0xpc3RCb3hEUCo+KG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQorICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpU2VsKTsNCisgIENGWF9SZWN0RiBydEludmFsaWRhdGU7DQorICBydEludmFsaWRhdGUuUmVzZXQoKTsNCisgIEZXTF9ITElTVElURU0gaE9sZCA9IEdldFNlbEl0ZW0oMCk7DQorICBpbnQzMl90IGlPbGQgPSBwRGF0YS0+R2V0SXRlbUluZGV4KG1fcEludGVyZmFjZSwgaE9sZCk7DQorICBpZiAoaU9sZCA9PSBpU2VsKSB7DQorICAgIHJldHVybjsNCisgIH0gZWxzZSBpZiAoaU9sZCA+IC0xKSB7DQorICAgIEdldEl0ZW1SZWN0KGlPbGQsIHJ0SW52YWxpZGF0ZSk7DQorICAgIFNldFNlbEl0ZW0oaE9sZCwgRkFMU0UpOw0KKyAgfQ0KKyAgaWYgKGhJdGVtKSB7DQorICAgIENGWF9SZWN0RiByZWN0Ow0KKyAgICBHZXRJdGVtUmVjdChpU2VsLCByZWN0KTsNCisgICAgcnRJbnZhbGlkYXRlLlVuaW9uKHJlY3QpOw0KKyAgICBGV0xfSExJU1RJVEVNIGhTZWwgPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGlTZWwpOw0KKyAgICBTZXRTZWxJdGVtKGhTZWwsIFRSVUUpOw0KKyAgfQ0KKyAgaWYgKCFydEludmFsaWRhdGUuSXNFbXB0eSgpKSB7DQorICAgIFJlcGFpbnQoJnJ0SW52YWxpZGF0ZSk7DQorICB9DQorfQ0KK2ludDMyX3QgQ0ZXTF9Db21ib0xpc3RJbXA6OkNvdW50SXRlbXMoKSB7DQorICBJRldMX0xpc3RCb3hEUCogcERhdGEgPQ0KKyAgICAgIHN0YXRpY19jYXN0PElGV0xfTGlzdEJveERQKj4obV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgIHJldHVybiBwRGF0YSA/IHBEYXRhLT5Db3VudEl0ZW1zKG1fcEludGVyZmFjZSkgOiAwOw0KK30NCit2b2lkIENGV0xfQ29tYm9MaXN0SW1wOjpHZXRJdGVtUmVjdChpbnQzMl90IG5JbmRleCwgQ0ZYX1JlY3RGJiBydEl0ZW0pIHsNCisgIElGV0xfTGlzdEJveERQKiBwRGF0YSA9DQorICAgICAgc3RhdGljX2Nhc3Q8SUZXTF9MaXN0Qm94RFAqPihtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgbkluZGV4KTsNCisgIHBEYXRhLT5HZXRJdGVtUmVjdChtX3BJbnRlcmZhY2UsIGhJdGVtLCBydEl0ZW0pOw0KK30NCit2b2lkIENGV0xfQ29tYm9MaXN0SW1wOjpDbGllbnRUb091dGVyKEZYX0ZMT0FUJiBmeCwgRlhfRkxPQVQmIGZ5KSB7DQorICBmeCArPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmxlZnQsIGZ5ICs9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQudG9wOw0KKyAgSUZXTF9XaWRnZXQqIHBPd25lciA9IEdldE93bmVyKCk7DQorICBpZiAoIXBPd25lcikNCisgICAgcmV0dXJuOw0KKyAgcE93bmVyLT5UcmFuc2Zvcm1UbyhtX3BPdXRlciwgZngsIGZ5KTsNCit9DQordm9pZCBDRldMX0NvbWJvTGlzdEltcDo6U2V0Rm9jdXMoRlhfQk9PTCBiU2V0KSB7DQorICBDRldMX1dpZGdldEltcDo6U2V0Rm9jdXMoYlNldCk7DQorfQ0KK0NGV0xfQ29tYm9MaXN0SW1wRGVsZWdhdGU6OkNGV0xfQ29tYm9MaXN0SW1wRGVsZWdhdGUoQ0ZXTF9Db21ib0xpc3RJbXAqIHBPd25lcikNCisgICAgOiBDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZShwT3duZXIpLCBtX3BPd25lcihwT3duZXIpIHsNCit9DQoraW50MzJfdCBDRldMX0NvbWJvTGlzdEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsNCisgIGlmICghcE1lc3NhZ2UpDQorICAgIHJldHVybiAwOw0KKyAgRlhfRFdPUkQgZHdIYXNoQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQorICBGWF9CT09MIGJhY2tEZWZhdWx0ID0gVFJVRTsNCisgIGlmIChkd0hhc2hDb2RlID09IEZXTF9NU0dIQVNIX1NldEZvY3VzIHx8DQorICAgICAgZHdIYXNoQ29kZSA9PSBGV0xfTVNHSEFTSF9LaWxsRm9jdXMpIHsNCisgICAgT25Ecm9wTGlzdEZvY3VzQ2hhbmdlZChwTWVzc2FnZSwgZHdIYXNoQ29kZSA9PSBGV0xfTVNHSEFTSF9TZXRGb2N1cyk7DQorICB9IGVsc2UgaWYgKGR3SGFzaENvZGUgPT0gRldMX01TR0hBU0hfTW91c2UpIHsNCisgICAgQ0ZXTF9Nc2dNb3VzZSogcE1zZyA9IHN0YXRpY19jYXN0PENGV0xfTXNnTW91c2UqPihwTWVzc2FnZSk7DQorICAgIGlmIChtX3BPd25lci0+SXNTaG93U2Nyb2xsQmFyKFRSVUUpICYmIG1fcE93bmVyLT5tX3BWZXJ0U2Nyb2xsQmFyKSB7DQorICAgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgICAgbV9wT3duZXItPm1fcFZlcnRTY3JvbGxCYXItPkdldFdpZGdldFJlY3QocmVjdCk7DQorICAgICAgaWYgKHJlY3QuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgICAgIHBNc2ctPm1fZnggLT0gcmVjdC5sZWZ0Ow0KKyAgICAgICAgcE1zZy0+bV9meSAtPSByZWN0LnRvcDsNCisgICAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9DQorICAgICAgICAgICAgbV9wT3duZXItPm1fcFZlcnRTY3JvbGxCYXItPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgICAgICAgcmV0dXJuIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTXNnKTsNCisgICAgICB9DQorICAgIH0NCisgICAgRlhfRFdPUkQgZHdDbWQgPSBwTXNnLT5tX2R3Q21kOw0KKyAgICBzd2l0Y2ggKGR3Q21kKSB7DQorICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTW91c2VNb3ZlOiB7DQorICAgICAgICBiYWNrRGVmYXVsdCA9IEZBTFNFOw0KKyAgICAgICAgT25Ecm9wTGlzdE1vdXNlTW92ZShwTXNnKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjogew0KKyAgICAgICAgYmFja0RlZmF1bHQgPSBGQUxTRTsNCisgICAgICAgIE9uRHJvcExpc3RMQnV0dG9uRG93bihwTXNnKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA6IHsNCisgICAgICAgIGJhY2tEZWZhdWx0ID0gRkFMU0U7DQorICAgICAgICBPbkRyb3BMaXN0TEJ1dHRvblVwKHBNc2cpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGRlZmF1bHQ6IHt9DQorICAgIH0NCisgIH0gZWxzZSBpZiAoZHdIYXNoQ29kZSA9PSBGV0xfTVNHSEFTSF9LZXkpIHsNCisgICAgYmFja0RlZmF1bHQgPSAhT25Ecm9wTGlzdEtleShzdGF0aWNfY2FzdDxDRldMX01zZ0tleSo+KHBNZXNzYWdlKSk7DQorICB9DQorICBpZiAoIWJhY2tEZWZhdWx0KSB7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfTGlzdEJveEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCit9DQordm9pZCBDRldMX0NvbWJvTGlzdEltcERlbGVnYXRlOjpPbkRyb3BMaXN0Rm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSogcE1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0KSB7DQorICBpZiAoIWJTZXQpIHsNCisgICAgQ0ZXTF9Nc2dLaWxsRm9jdXMqIHBLaWxsID0gc3RhdGljX2Nhc3Q8Q0ZXTF9Nc2dLaWxsRm9jdXMqPihwTXNnKTsNCisgICAgQ0ZXTF9Db21ib0JveEltcCogcE91dGVyID0NCisgICAgICAgIHN0YXRpY19jYXN0PENGV0xfQ29tYm9Cb3hJbXAqPihtX3BPd25lci0+bV9wT3V0ZXItPkdldEltcGwoKSk7DQorICAgIGlmIChwS2lsbC0+bV9wU2V0Rm9jdXMgPT0gbV9wT3duZXItPm1fcE91dGVyIHx8DQorICAgICAgICBwS2lsbC0+bV9wU2V0Rm9jdXMgPT0gcE91dGVyLT5tX3BFZGl0LmdldCgpKSB7DQorICAgICAgcE91dGVyLT5TaG93RHJvcExpc3QoRkFMU0UpOw0KKyAgICB9DQorICB9DQorfQ0KK2ludDMyX3QgQ0ZXTF9Db21ib0xpc3RJbXBEZWxlZ2F0ZTo6T25Ecm9wTGlzdE1vdXNlTW92ZShDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBpZiAobV9wT3duZXItPm1fcnRDbGllbnQuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgaWYgKG1fcE93bmVyLT5tX2JOb3RpZnlPd25lcikgew0KKyAgICAgIG1fcE93bmVyLT5tX2JOb3RpZnlPd25lciA9IEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChtX3BPd25lci0+SXNTaG93U2Nyb2xsQmFyKFRSVUUpICYmIG1fcE93bmVyLT5tX3BWZXJ0U2Nyb2xsQmFyKSB7DQorICAgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgICAgbV9wT3duZXItPm1fcFZlcnRTY3JvbGxCYXItPkdldFdpZGdldFJlY3QocmVjdCk7DQorICAgICAgaWYgKHJlY3QuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgICAgIHJldHVybiAxOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gbV9wT3duZXItPkdldEl0ZW1BdFBvaW50KHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgICBpZiAoaEl0ZW0pIHsNCisgICAgICBpZiAoIW1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpDQorICAgICAgICByZXR1cm4gMDsNCisgICAgICBJRldMX0xpc3RCb3hEUCogcERhdGEgPSBzdGF0aWNfY2FzdDxJRldMX0xpc3RCb3hEUCo+KA0KKyAgICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgICAgICBpbnQzMl90IGlTZWwgPSBwRGF0YS0+R2V0SXRlbUluZGV4KG1fcE93bmVyLT5tX3BJbnRlcmZhY2UsIGhJdGVtKTsNCisgICAgICBDRldMX0V2dENtYkhvdmVyQ2hhbmdlZCBldmVudDsNCisgICAgICBldmVudC5tX3BTcmNUYXJnZXQgPSBtX3BPd25lci0+bV9wT3V0ZXI7DQorICAgICAgZXZlbnQubV9pQ3VySG92ZXIgPSBpU2VsOw0KKyAgICAgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZldmVudCk7DQorICAgICAgbV9wT3duZXItPkNoYW5nZVNlbGVjdGVkKGlTZWwpOw0KKyAgICB9DQorICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX2JOb3RpZnlPd25lcikgew0KKyAgICBtX3BPd25lci0+Q2xpZW50VG9PdXRlcihwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgICAgQ0ZXTF9Db21ib0JveEltcCogcE91dGVyID0NCisgICAgICAgIHN0YXRpY19jYXN0PENGV0xfQ29tYm9Cb3hJbXAqPihtX3BPd25lci0+bV9wT3V0ZXItPkdldEltcGwoKSk7DQorICAgIHBPdXRlci0+bV9wRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1zZyk7DQorICB9DQorICByZXR1cm4gMTsNCit9DQoraW50MzJfdCBDRldMX0NvbWJvTGlzdEltcERlbGVnYXRlOjpPbkRyb3BMaXN0TEJ1dHRvbkRvd24oQ0ZXTF9Nc2dNb3VzZSogcE1zZykgew0KKyAgaWYgKG1fcE93bmVyLT5tX3J0Q2xpZW50LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgQ0ZXTF9Db21ib0JveEltcCogcE91dGVyID0NCisgICAgICBzdGF0aWNfY2FzdDxDRldMX0NvbWJvQm94SW1wKj4obV9wT3duZXItPm1fcE91dGVyLT5HZXRJbXBsKCkpOw0KKyAgcE91dGVyLT5TaG93RHJvcExpc3QoRkFMU0UpOw0KKyAgcmV0dXJuIDE7DQorfQ0KK2ludDMyX3QgQ0ZXTF9Db21ib0xpc3RJbXBEZWxlZ2F0ZTo6T25Ecm9wTGlzdExCdXR0b25VcChDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBDRldMX0NvbWJvQm94SW1wKiBwT3V0ZXIgPQ0KKyAgICAgIHN0YXRpY19jYXN0PENGV0xfQ29tYm9Cb3hJbXAqPihtX3BPd25lci0+bV9wT3V0ZXItPkdldEltcGwoKSk7DQorICBpZiAobV9wT3duZXItPm1fYk5vdGlmeU93bmVyKSB7DQorICAgIG1fcE93bmVyLT5DbGllbnRUb091dGVyKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgICBwT3V0ZXItPm1fcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNc2cpOw0KKyAgfSBlbHNlIHsNCisgICAgaWYgKG1fcE93bmVyLT5Jc1Nob3dTY3JvbGxCYXIoVFJVRSkgJiYgbV9wT3duZXItPm1fcFZlcnRTY3JvbGxCYXIpIHsNCisgICAgICBDRlhfUmVjdEYgcmVjdDsNCisgICAgICBtX3BPd25lci0+bV9wVmVydFNjcm9sbEJhci0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgICAgICBpZiAocmVjdC5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICAgICAgcmV0dXJuIDE7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHBPdXRlci0+U2hvd0Ryb3BMaXN0KEZBTFNFKTsNCisgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IG1fcE93bmVyLT5HZXRJdGVtQXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgICAgaWYgKGhJdGVtKSB7DQorICAgICAgcE91dGVyLT5Qcm9jZXNzU2VsQ2hhbmdlZChUUlVFKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIDE7DQorfQ0KK2ludDMyX3QgQ0ZXTF9Db21ib0xpc3RJbXBEZWxlZ2F0ZTo6T25Ecm9wTGlzdEtleShDRldMX01zZ0tleSogcEtleSkgew0KKyAgQ0ZXTF9Db21ib0JveEltcCogcE91dGVyID0NCisgICAgICBzdGF0aWNfY2FzdDxDRldMX0NvbWJvQm94SW1wKj4obV9wT3duZXItPm1fcE91dGVyLT5HZXRJbXBsKCkpOw0KKyAgRlhfQk9PTCBiUHJvcGFnYXRlID0gRkFMU0U7DQorICBpZiAocEtleS0+bV9kd0NtZCA9PSBGV0xfTVNHS0VZQ01EX0tleURvd24pIHsNCisgICAgRlhfRFdPUkQgZHdLZXlDb2RlID0gcEtleS0+bV9kd0tleUNvZGU7DQorICAgIHN3aXRjaCAoZHdLZXlDb2RlKSB7DQorICAgICAgY2FzZSBGV0xfVktFWV9SZXR1cm46DQorICAgICAgY2FzZSBGV0xfVktFWV9Fc2NhcGU6IHsNCisgICAgICAgIHBPdXRlci0+U2hvd0Ryb3BMaXN0KEZBTFNFKTsNCisgICAgICAgIHJldHVybiAxOw0KKyAgICAgIH0NCisgICAgICBjYXNlIEZXTF9WS0VZX1VwOg0KKyAgICAgIGNhc2UgRldMX1ZLRVlfRG93bjogew0KKyAgICAgICAgT25Ecm9wTGlzdEtleURvd24ocEtleSk7DQorICAgICAgICBwT3V0ZXItPlNldERlbGVnYXRlKG51bGxwdHIpOw0KKyAgICAgICAgcE91dGVyLT5Qcm9jZXNzU2VsQ2hhbmdlZChGQUxTRSk7DQorICAgICAgICByZXR1cm4gMTsNCisgICAgICB9DQorICAgICAgZGVmYXVsdDogeyBiUHJvcGFnYXRlID0gVFJVRTsgfQ0KKyAgICB9DQorICB9IGVsc2UgaWYgKHBLZXktPm1fZHdDbWQgPT0gRldMX01TR0tFWUNNRF9DaGFyKSB7DQorICAgIGJQcm9wYWdhdGUgPSBUUlVFOw0KKyAgfQ0KKyAgaWYgKGJQcm9wYWdhdGUpIHsNCisgICAgcEtleS0+bV9wRHN0VGFyZ2V0ID0gbV9wT3duZXItPm1fcE91dGVyOw0KKyAgICBwT3V0ZXItPm1fcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBLZXkpOw0KKyAgICByZXR1cm4gMTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCit2b2lkIENGV0xfQ29tYm9MaXN0SW1wRGVsZWdhdGU6Ok9uRHJvcExpc3RLZXlEb3duKENGV0xfTXNnS2V5KiBwS2V5KSB7DQorICBGWF9EV09SRCBkd0tleUNvZGUgPSBwS2V5LT5tX2R3S2V5Q29kZTsNCisgIHN3aXRjaCAoZHdLZXlDb2RlKSB7DQorICAgIGNhc2UgRldMX1ZLRVlfVXA6DQorICAgIGNhc2UgRldMX1ZLRVlfRG93bjoNCisgICAgY2FzZSBGV0xfVktFWV9Ib21lOg0KKyAgICBjYXNlIEZXTF9WS0VZX0VuZDogew0KKyAgICAgIENGV0xfQ29tYm9Cb3hJbXAqIHBPdXRlciA9DQorICAgICAgICAgIHN0YXRpY19jYXN0PENGV0xfQ29tYm9Cb3hJbXAqPihtX3BPd25lci0+bV9wT3V0ZXItPkdldEltcGwoKSk7DQorICAgICAgSUZXTF9MaXN0Qm94RFAqIHBEYXRhID0gc3RhdGljX2Nhc3Q8SUZXTF9MaXN0Qm94RFAqPigNCisgICAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQorICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9DQorICAgICAgICAgIHBEYXRhLT5HZXRJdGVtKG1fcE93bmVyLT5tX3BJbnRlcmZhY2UsIHBPdXRlci0+bV9pQ3VyU2VsKTsNCisgICAgICBoSXRlbSA9IG1fcE93bmVyLT5HZXRJdGVtKGhJdGVtLCBkd0tleUNvZGUpOw0KKyAgICAgIGlmICghaEl0ZW0pIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBtX3BPd25lci0+U2V0U2VsZWN0aW9uKGhJdGVtLCBoSXRlbSwgVFJVRSk7DQorICAgICAgbV9wT3duZXItPlNjcm9sbFRvVmlzaWJsZShoSXRlbSk7DQorICAgICAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZTsNCisgICAgICBydEludmFsaWRhdGUuU2V0KDAsIDAsIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0KTsNCisgICAgICBtX3BPd25lci0+UmVwYWludCgmcnRJbnZhbGlkYXRlKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KK30NCitDRldMX0NvbWJvQm94SW1wOjpDRldMX0NvbWJvQm94SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocHJvcGVydGllcywgcE91dGVyKSwNCisgICAgICBtX3BGb3JtKE5VTEwpLA0KKyAgICAgIG1fYkxCdXR0b25Eb3duKEZBTFNFKSwNCisgICAgICBtX2lDdXJTZWwoLTEpLA0KKyAgICAgIG1faUJ0blN0YXRlKEZXTF9QQVJUU1RBVEVfQ01CX05vcm1hbCksDQorICAgICAgbV9mQ29tYm9Gb3JtSGFuZGxlcigwKSwNCisgICAgICBtX2JOZWVkU2hvd0xpc3QoRkFMU0UpIHsNCisgIG1fcnRDbGllbnQuUmVzZXQoKTsNCisgIG1fcnRCdG4uUmVzZXQoKTsNCisgIG1fcnRIYW5kbGVyLlJlc2V0KCk7DQorfQ0KK0NGV0xfQ29tYm9Cb3hJbXA6On5DRldMX0NvbWJvQm94SW1wKCkgew0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Qgew0KKyAgd3NDbGFzcyA9IEZXTF9DTEFTU19Db21ib0JveDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9Db21ib0JveEltcDo6R2V0Q2xhc3NJRCgpIGNvbnN0IHsNCisgIHJldHVybiBGV0xfQ0xBU1NIQVNIX0NvbWJvQm94Ow0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OkluaXRpYWxpemUoKSB7DQorICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgIHJldHVybiBEaXNGb3JtX0luaXRpYWxpemUoKTsNCisgIH0NCisgIGlmIChDRldMX1dpZGdldEltcDo6SW5pdGlhbGl6ZSgpICE9IEZXTF9FUlJfU3VjY2VlZGVkKQ0KKyAgICByZXR1cm4gRldMX1dHVFNUQVRFX0ludmlzaWJsZTsgIC8vIFByb2JhYmx5IGEgYnVnOyBub3QgYSBGV0xfRVJSXyB2YWx1ZS4NCisgIG1fcERlbGVnYXRlID0gbmV3IENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZSh0aGlzKTsNCisgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wOw0KKyAgcHJvcC5tX3BUaGVtZVByb3ZpZGVyID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgIHByb3AubV9kd1N0eWxlcyB8PSBGV0xfV0dUU1RZTEVfQm9yZGVyIHwgRldMX1dHVFNUWUxFX1ZTY3JvbGw7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DTUJfTGlzdEl0ZW1JY29uVGV4dCkgew0KKyAgICBwcm9wLm1fZHdTdHlsZUV4ZXMgfD0gRldMX1NUWUxFRVhUX0xUQl9JY29uOw0KKyAgfQ0KKyAgcHJvcC5tX3BEYXRhUHJvdmlkZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICBtX3BMaXN0Qm94LnJlc2V0KElGV0xfTGlzdEJveDo6Q3JlYXRlQ29tYm9MaXN0KHByb3AsIG1fcEludGVyZmFjZSkpOw0KKyAgbV9wTGlzdEJveC0+SW5pdGlhbGl6ZSgpOw0KKyAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NNQl9Ecm9wRG93bikgJiYgIW1fcEVkaXQpIHsNCisgICAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3AyOw0KKyAgICBtX3BFZGl0LnJlc2V0KElGV0xfRWRpdDo6Q3JlYXRlQ29tYm9FZGl0KHByb3AyLCBtX3BJbnRlcmZhY2UpKTsNCisgICAgbV9wRWRpdC0+SW5pdGlhbGl6ZSgpOw0KKyAgICBzdGF0aWNfY2FzdDxDRldMX0VkaXRJbXAqPihtX3BFZGl0LT5HZXRJbXBsKCkpLT5TZXRPdXRlcihtX3BJbnRlcmZhY2UpOw0KKyAgfQ0KKyAgaWYgKG1fcEVkaXQpIHsNCisgICAgbV9wRWRpdC0+U2V0UGFyZW50KG1fcEludGVyZmFjZSk7DQorICB9DQorICBTZXRTdGF0ZXMobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveEltcDo6RmluYWxpemUoKSB7DQorICBpZiAobV9wRWRpdCkgew0KKyAgICBtX3BFZGl0LT5GaW5hbGl6ZSgpOw0KKyAgfQ0KKyAgbV9wTGlzdEJveC0+RmluYWxpemUoKTsNCisgIGRlbGV0ZSBtX3BEZWxlZ2F0ZTsNCisgIG1fcERlbGVnYXRlID0gbnVsbHB0cjsNCisgIHJldHVybiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94SW1wOjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUpIHsNCisgIGlmIChiQXV0b1NpemUpIHsNCisgICAgcmVjdC5SZXNldCgpOw0KKyAgICBGWF9CT09MIGJJc0Ryb3BEb3duID0gSXNEcm9wRG93blN0eWxlKCk7DQorICAgIGlmIChiSXNEcm9wRG93biAmJiBtX3BFZGl0KSB7DQorICAgICAgbV9wRWRpdC0+R2V0V2lkZ2V0UmVjdChyZWN0LCBUUlVFKTsNCisgICAgfSBlbHNlIHsNCisgICAgICByZWN0LndpZHRoID0gMTAwOw0KKyAgICAgIHJlY3QuaGVpZ2h0ID0gMTY7DQorICAgIH0NCisgICAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKSB7DQorICAgICAgUmVTZXRUaGVtZSgpOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUKiBwRldpZHRoID0gc3RhdGljX2Nhc3Q8RlhfRkxPQVQqPigNCisgICAgICAgIEdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX1Njcm9sbEJhcldpZHRoKSk7DQorICAgIGlmICghcEZXaWR0aCkNCisgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgICByZWN0LkluZmxhdGUoMCwgMCwgKnBGV2lkdGgsIDApOw0KKyAgICBDRldMX1dpZGdldEltcDo6R2V0V2lkZ2V0UmVjdChyZWN0LCBUUlVFKTsNCisgIH0gZWxzZSB7DQorICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6Ok1vZGlmeVN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKSB7DQorICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgIHJldHVybiBEaXNGb3JtX01vZGlmeVN0eWxlc0V4KGR3U3R5bGVzRXhBZGRlZCwgZHdTdHlsZXNFeFJlbW92ZWQpOw0KKyAgfQ0KKyAgRlhfQk9PTCBiQWRkRHJvcERvd24gPSBkd1N0eWxlc0V4QWRkZWQgJiBGV0xfU1RZTEVFWFRfQ01CX0Ryb3BEb3duOw0KKyAgRlhfQk9PTCBiUmVtb3ZlRHJvcERvd24gPSBkd1N0eWxlc0V4UmVtb3ZlZCAmIEZXTF9TVFlMRUVYVF9DTUJfRHJvcERvd247DQorICBpZiAoYkFkZERyb3BEb3duICYmICFtX3BFZGl0KSB7DQorICAgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wOw0KKyAgICBtX3BFZGl0LnJlc2V0KElGV0xfRWRpdDo6Q3JlYXRlQ29tYm9FZGl0KHByb3AsIG51bGxwdHIpKTsNCisgICAgbV9wRWRpdC0+SW5pdGlhbGl6ZSgpOw0KKyAgICBzdGF0aWNfY2FzdDxDRldMX0VkaXRJbXAqPihtX3BFZGl0LT5HZXRJbXBsKCkpLT5TZXRPdXRlcihtX3BJbnRlcmZhY2UpOw0KKyAgICBtX3BFZGl0LT5TZXRQYXJlbnQobV9wSW50ZXJmYWNlKTsNCisgIH0gZWxzZSBpZiAoYlJlbW92ZURyb3BEb3duICYmIG1fcEVkaXQpIHsNCisgICAgbV9wRWRpdC0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsIFRSVUUpOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpNb2RpZnlTdHlsZXNFeChkd1N0eWxlc0V4QWRkZWQsIGR3U3R5bGVzRXhSZW1vdmVkKTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94SW1wOjpVcGRhdGUoKSB7DQorICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgIHJldHVybiBEaXNGb3JtX1VwZGF0ZSgpOw0KKyAgfQ0KKyAgaWYgKElzTG9ja2VkKCkpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIH0NCisgIFJlU2V0VGhlbWUoKTsNCisgIEZYX0JPT0wgYkRyb3BEb3duID0gSXNEcm9wRG93blN0eWxlKCk7DQorICBpZiAoYkRyb3BEb3duICYmIG1fcEVkaXQpIHsNCisgICAgUmVTZXRFZGl0QWxpZ25tZW50KCk7DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9PSBOVUxMKSB7DQorICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KKyAgfQ0KKyAgTGF5b3V0KCk7DQorICBDRldMX1RoZW1lUGFydCBwYXJ0Ow0KKyAgcGFydC5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBtX2ZDb21ib0Zvcm1IYW5kbGVyID0NCisgICAgICAqc3RhdGljX2Nhc3Q8RlhfRkxPQVQqPihtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLT5HZXRDYXBhY2l0eSgNCisgICAgICAgICAgJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9DTUJfQ29tYm9Gb3JtSGFuZGxlcikpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9EV09SRCBDRldMX0NvbWJvQm94SW1wOjpIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICByZXR1cm4gRGlzRm9ybV9IaXRUZXN0KGZ4LCBmeSk7DQorICB9DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OkhpdFRlc3QoZngsIGZ5KTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94SW1wOjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgIHJldHVybiBEaXNGb3JtX0RyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCisgIH0NCisgIGlmICghcEdyYXBoaWNzKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KKyAgRlhfQk9PTCBiSXNEcm9wRG93biA9IElzRHJvcERvd25TdHlsZSgpOw0KKyAgaWYgKEhhc0JvcmRlcigpKSB7DQorICAgIERyYXdCb3JkZXIocEdyYXBoaWNzLCBGV0xfUEFSVF9DTUJfQm9yZGVyLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgaWYgKEhhc0VkZ2UoKSkgew0KKyAgICBEcmF3RWRnZShwR3JhcGhpY3MsIEZXTF9QQVJUX0NNQl9FZGdlLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgaWYgKCFiSXNEcm9wRG93bikgew0KKyAgICBDRlhfUmVjdEYgcnRUZXh0QmsobV9ydENsaWVudCk7DQorICAgIHJ0VGV4dEJrLndpZHRoIC09IG1fcnRCdG4ud2lkdGg7DQorICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9DTUJfQmFja2dyb3VuZDsNCisgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgICAgfQ0KKyAgICBwYXJhbS5tX3J0UGFydCA9IHJ0VGV4dEJrOw0KKyAgICBpZiAobV9pQ3VyU2VsID49IDApIHsNCisgICAgICBJRldMX0xpc3RCb3hEUCogcERhdGEgPSBzdGF0aWNfY2FzdDxJRldMX0xpc3RCb3hEUCo+KA0KKyAgICAgICAgICBzdGF0aWNfY2FzdDxDRldMX0NvbWJvTGlzdEltcCo+KG1fcExpc3RCb3gtPkdldEltcGwoKSkNCisgICAgICAgICAgICAgIC0+bV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgICAgICB2b2lkKiBwID0gcERhdGEtPkdldEl0ZW1EYXRhKG1fcExpc3RCb3guZ2V0KCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+R2V0SXRlbShtX3BMaXN0Qm94LmdldCgpLCBtX2lDdXJTZWwpKTsNCisgICAgICBpZiAocCAhPSBOVUxMKSB7DQorICAgICAgICBwYXJhbS5tX3BEYXRhID0gcDsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpIHsNCisgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9DTUJfRGlzYWJsZWQ7DQorICAgIH0gZWxzZSBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgJiYNCisgICAgICAgICAgICAgICAobV9pQ3VyU2VsID49IDApKSB7DQorICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfQ01CX1NlbGVjdGVkOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0NNQl9Ob3JtYWw7DQorICAgIH0NCisgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KKyAgICBpZiAobV9pQ3VyU2VsID49IDApIHsNCisgICAgICBpZiAoIW1fcExpc3RCb3gpDQorICAgICAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICBJRldMX0NvbWJvQm94RFAqIHBEYXRhID0NCisgICAgICAgICAgc3RhdGljX2Nhc3Q8SUZXTF9Db21ib0JveERQKj4obV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBtX2lDdXJTZWwpOw0KKyAgICAgIHN0YXRpY19jYXN0PENGV0xfQ29tYm9MaXN0SW1wKj4obV9wTGlzdEJveC0+R2V0SW1wbCgpKQ0KKyAgICAgICAgICAtPkdldEl0ZW1UZXh0KGhJdGVtLCB3c1RleHQpOw0KKyAgICAgIENGV0xfVGhlbWVUZXh0IHBhcmFtOw0KKyAgICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfQ01CX0NhcHRpb247DQorICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IG1faUJ0blN0YXRlOw0KKyAgICAgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgICAgcGFyYW0ubV9ydFBhcnQgPSBydFRleHRCazsNCisgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gRldMX1BBUlRTVEFURV9DTUJfU2VsZWN0ZWQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRldMX1BBUlRTVEFURV9DTUJfTm9ybWFsOw0KKyAgICAgIHBhcmFtLm1fd3NUZXh0ID0gd3NUZXh0Ow0KKyAgICAgIHBhcmFtLm1fZHdUVE9TdHlsZXMgPSBGREVfVFRPU1RZTEVfU2luZ2xlTGluZTsNCisgICAgICBwYXJhbS5tX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyTGVmdDsNCisgICAgICBwVGhlbWUtPkRyYXdUZXh0KCZwYXJhbSk7DQorICAgIH0NCisgIH0NCisgIHsNCisgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0NNQl9Ecm9wRG93bkJ1dHRvbjsNCisgICAgcGFyYW0ubV9kd1N0YXRlcyA9IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgID8gRldMX1BBUlRTVEFURV9DTUJfRGlzYWJsZWQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1faUJ0blN0YXRlOw0KKyAgICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgICAgcGFyYW0ubV9ydFBhcnQgPSBtX3J0QnRuOw0KKyAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveEltcDo6U2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZVByb3ZpZGVyKSB7DQorICBpZiAoIXBUaGVtZVByb3ZpZGVyKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IHBUaGVtZVByb3ZpZGVyOw0KKyAgaWYgKG1fcExpc3RCb3ggJiYgcFRoZW1lUHJvdmlkZXItPklzVmFsaWRXaWRnZXQobV9wTGlzdEJveC5nZXQoKSkpIHsNCisgICAgbV9wTGlzdEJveC0+U2V0VGhlbWVQcm92aWRlcihwVGhlbWVQcm92aWRlcik7DQorICB9DQorICBpZiAobV9wRWRpdCAmJiBwVGhlbWVQcm92aWRlci0+SXNWYWxpZFdpZGdldChtX3BFZGl0LmdldCgpKSkgew0KKyAgICBtX3BFZGl0LT5TZXRUaGVtZVByb3ZpZGVyKHBUaGVtZVByb3ZpZGVyKTsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQoraW50MzJfdCBDRldMX0NvbWJvQm94SW1wOjpHZXRDdXJTZWwoKSB7DQorICByZXR1cm4gbV9pQ3VyU2VsOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OlNldEN1clNlbChpbnQzMl90IGlTZWwpIHsNCisgIGludDMyX3QgaUNvdW50ID0NCisgICAgICBzdGF0aWNfY2FzdDxDRldMX0NvbWJvTGlzdEltcCo+KG1fcExpc3RCb3gtPkdldEltcGwoKSktPkNvdW50SXRlbXMoKTsNCisgIEZYX0JPT0wgYkNsZWFyU2VsID0gaVNlbCA8IDAgfHwgaVNlbCA+PSBpQ291bnQ7DQorICBGWF9CT09MIGJEcm9wRG93biA9IElzRHJvcERvd25TdHlsZSgpOw0KKyAgaWYgKGJEcm9wRG93biAmJiBtX3BFZGl0KSB7DQorICAgIGlmIChiQ2xlYXJTZWwpIHsNCisgICAgICBtX3BFZGl0LT5TZXRUZXh0KENGWF9XaWRlU3RyaW5nKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICBJRldMX0NvbWJvQm94RFAqIHBEYXRhID0NCisgICAgICAgICAgc3RhdGljX2Nhc3Q8SUZXTF9Db21ib0JveERQKj4obV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpU2VsKTsNCisgICAgICBzdGF0aWNfY2FzdDxDRldMX0NvbWJvTGlzdEltcCo+KG1fcExpc3RCb3gtPkdldEltcGwoKSkNCisgICAgICAgICAgLT5HZXRJdGVtVGV4dChoSXRlbSwgd3NUZXh0KTsNCisgICAgICBtX3BFZGl0LT5TZXRUZXh0KHdzVGV4dCk7DQorICAgIH0NCisgICAgbV9wRWRpdC0+VXBkYXRlKCk7DQorICB9DQorICBtX2lDdXJTZWwgPSBiQ2xlYXJTZWwgPyAtMSA6IGlTZWw7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveEltcDo6U2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQpIHsNCisgIEZYX0JPT0wgYklzRHJvcERvd24gPSBJc0Ryb3BEb3duU3R5bGUoKTsNCisgIGlmIChiSXNEcm9wRG93biAmJiBtX3BFZGl0KSB7DQorICAgIG1fcEVkaXQtPlNldFN0YXRlcyhkd1N0YXRlcywgYlNldCk7DQorICB9DQorICBpZiAobV9wTGlzdEJveCkgew0KKyAgICBtX3BMaXN0Qm94LT5TZXRTdGF0ZXMoZHdTdGF0ZXMsIGJTZXQpOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpTZXRTdGF0ZXMoZHdTdGF0ZXMsIGJTZXQpOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OlNldEVkaXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIGlmICghbV9wRWRpdCkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIG1fcEVkaXQtPlNldFRleHQod3NUZXh0KTsNCisgIHJldHVybiBtX3BFZGl0LT5VcGRhdGUoKTsNCit9DQoraW50MzJfdCBDRldMX0NvbWJvQm94SW1wOjpHZXRFZGl0VGV4dExlbmd0aCgpIGNvbnN0IHsNCisgIGlmICghbV9wRWRpdCkNCisgICAgcmV0dXJuIC0xOw0KKyAgcmV0dXJuIG1fcEVkaXQtPkdldFRleHRMZW5ndGgoKTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94SW1wOjpHZXRFZGl0VGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCkgY29uc3Qgew0KKyAgaWYgKG1fcEVkaXQpIHsNCisgICAgcmV0dXJuIG1fcEVkaXQtPkdldFRleHQod3NUZXh0LCBuU3RhcnQsIG5Db3VudCk7DQorICB9IGVsc2UgaWYgKG1fcExpc3RCb3gpIHsNCisgICAgSUZXTF9Db21ib0JveERQKiBwRGF0YSA9DQorICAgICAgICBzdGF0aWNfY2FzdDxJRldMX0NvbWJvQm94RFAqPihtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBtX2lDdXJTZWwpOw0KKyAgICByZXR1cm4gbV9wTGlzdEJveC0+R2V0SXRlbVRleHQoaEl0ZW0sIHdzVGV4dCk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OlNldEVkaXRTZWxSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQpIHsNCisgIGlmICghbV9wRWRpdCkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHN0YXRpY19jYXN0PENGV0xfQ29tYm9FZGl0SW1wKj4obV9wRWRpdC0+R2V0SW1wbCgpKS0+Q2xlYXJTZWxlY3RlZCgpOw0KKyAgbV9wRWRpdC0+QWRkU2VsUmFuZ2UoblN0YXJ0LCBuQ291bnQpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitpbnQzMl90IENGV0xfQ29tYm9Cb3hJbXA6OkdldEVkaXRTZWxSYW5nZShpbnQzMl90IG5JbmRleCwgaW50MzJfdCYgblN0YXJ0KSB7DQorICBpZiAoIW1fcEVkaXQpDQorICAgIHJldHVybiAtMTsNCisgIHJldHVybiBtX3BFZGl0LT5HZXRTZWxSYW5nZShuSW5kZXgsIG5TdGFydCk7DQorfQ0KK2ludDMyX3QgQ0ZXTF9Db21ib0JveEltcDo6R2V0RWRpdExpbWl0KCkgew0KKyAgaWYgKCFtX3BFZGl0KQ0KKyAgICByZXR1cm4gLTE7DQorICByZXR1cm4gbV9wRWRpdC0+R2V0TGltaXQoKTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94SW1wOjpTZXRFZGl0TGltaXQoaW50MzJfdCBuTGltaXQpIHsNCisgIGlmICghbV9wRWRpdCkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHJldHVybiBtX3BFZGl0LT5TZXRMaW1pdChuTGltaXQpOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OkVkaXREb0NsaXBib2FyZChpbnQzMl90IGlDbWQpIHsNCisgIGlmICghbV9wRWRpdCkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHJldHVybiBtX3BFZGl0LT5Eb0NsaXBib2FyZChpQ21kKTsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94SW1wOjpFZGl0UmVkbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKSB7DQorICBpZiAoIW1fcEVkaXQpDQorICAgIHJldHVybiBGQUxTRTsNCisgIHJldHVybiBtX3BFZGl0LT5SZWRvKGJzUmVjb3JkKTsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94SW1wOjpFZGl0VW5kbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKSB7DQorICBpZiAoIW1fcEVkaXQpDQorICAgIHJldHVybiBGQUxTRTsNCisgIHJldHVybiBtX3BFZGl0LT5VbmRvKGJzUmVjb3JkKTsNCit9DQorSUZXTF9MaXN0Qm94KiBDRldMX0NvbWJvQm94SW1wOjpHZXRMaXN0Qm94dCgpIHsNCisgIHJldHVybiBtX3BMaXN0Qm94LmdldCgpOw0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3hJbXA6OkFmdGVyRm9jdXNTaG93RHJvcExpc3QoKSB7DQorICBpZiAoIW1fYk5lZWRTaG93TGlzdCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAobV9wRWRpdCkgew0KKyAgICBNYXRjaEVkaXRUZXh0KCk7DQorICB9DQorICBTaG93RHJvcExpc3QoVFJVRSk7DQorICBtX2JOZWVkU2hvd0xpc3QgPSBGQUxTRTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9FUlIgQ0ZXTF9Db21ib0JveEltcDo6T3BlbkRyb3BEb3duTGlzdChGWF9CT09MIGJBY3RpdmF0ZSkgew0KKyAgU2hvd0Ryb3BMaXN0KGJBY3RpdmF0ZSk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Db21ib0JveEltcDo6RWRpdENhblVuZG8oKSB7DQorICByZXR1cm4gbV9wRWRpdC0+Q2FuVW5kbygpOw0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3hJbXA6OkVkaXRDYW5SZWRvKCkgew0KKyAgcmV0dXJuIG1fcEVkaXQtPkNhblJlZG8oKTsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94SW1wOjpFZGl0VW5kbygpIHsNCisgIHJldHVybiBtX3BFZGl0LT5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Db21ib0JveEltcDo6RWRpdFJlZG8oKSB7DQorICByZXR1cm4gbV9wRWRpdC0+UmVkbygpOw0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3hJbXA6OkVkaXRDYW5Db3B5KCkgew0KKyAgcmV0dXJuIG1fcEVkaXQtPkNvdW50U2VsUmFuZ2VzKCkgPiAwOw0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3hJbXA6OkVkaXRDYW5DdXQoKSB7DQorICBpZiAobV9wRWRpdC0+R2V0U3R5bGVzRXgoKSAmIEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcEVkaXQtPkNvdW50U2VsUmFuZ2VzKCkgPiAwOw0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3hJbXA6OkVkaXRDYW5TZWxlY3RBbGwoKSB7DQorICByZXR1cm4gbV9wRWRpdC0+R2V0VGV4dExlbmd0aCgpID4gMDsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94SW1wOjpFZGl0Q29weShDRlhfV2lkZVN0cmluZyYgd3NDb3B5KSB7DQorICByZXR1cm4gbV9wRWRpdC0+Q29weSh3c0NvcHkpOw0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3hJbXA6OkVkaXRDdXQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ3V0KSB7DQorICByZXR1cm4gbV9wRWRpdC0+Q3V0KHdzQ3V0KTsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94SW1wOjpFZGl0UGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGFzdGUpIHsNCisgIHJldHVybiBtX3BFZGl0LT5QYXN0ZSh3c1Bhc3RlKTsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94SW1wOjpFZGl0U2VsZWN0QWxsKCkgew0KKyAgcmV0dXJuIG1fcEVkaXQtPkFkZFNlbFJhbmdlKDApID09IEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3hJbXA6OkVkaXREZWxldGUoKSB7DQorICByZXR1cm4gbV9wRWRpdC0+Q2xlYXJUZXh0KCkgPT0gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Db21ib0JveEltcDo6RWRpdERlU2VsZWN0KCkgew0KKyAgcmV0dXJuIG1fcEVkaXQtPkNsZWFyU2VsZWN0aW9ucygpID09IEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OkdldEJCb3goQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgIHJldHVybiBEaXNGb3JtX0dldEJCb3gocmVjdCk7DQorICB9DQorICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIGlmIChtX3BMaXN0Qm94ICYmIElzRHJvcExpc3RTaG93ZWQoKSkgew0KKyAgICBDRlhfUmVjdEYgcnRMaXN0Ow0KKyAgICBtX3BMaXN0Qm94LT5HZXRXaWRnZXRSZWN0KHJ0TGlzdCk7DQorICAgIHJ0TGlzdC5PZmZzZXQocmVjdC5sZWZ0LCByZWN0LnRvcCk7DQorICAgIHJlY3QuVW5pb24ocnRMaXN0KTsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94SW1wOjpFZGl0TW9kaWZ5U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKSB7DQorICBpZiAobV9wRWRpdCAhPSBOVUxMKSB7DQorICAgIHJldHVybiBtX3BFZGl0LT5Nb2RpZnlTdHlsZXNFeChkd1N0eWxlc0V4QWRkZWQsIGR3U3R5bGVzRXhSZW1vdmVkKTsNCisgIH0gZWxzZSB7DQorICAgIHJldHVybiBGV0xfRVJSX1BhcmFtZXRlcl9JbnZhbGlkOw0KKyAgfQ0KK30NCitGWF9GTE9BVCBDRldMX0NvbWJvQm94SW1wOjpHZXRMaXN0SGVpZ2h0KCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfQ29tYm9Cb3hEUCo+KG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcikNCisgICAgICAtPkdldExpc3RIZWlnaHQobV9wSW50ZXJmYWNlKTsNCit9DQordm9pZCBDRldMX0NvbWJvQm94SW1wOjpEcmF3U3RyZXRjaEhhbmRsZXIoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9DTUJfU3RyZXRjZ0hhbmRsZXI7DQorICBwYXJhbS5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9DTUJfTm9ybWFsOw0KKyAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIHBhcmFtLm1fcnRQYXJ0ID0gbV9ydEhhbmRsZXI7DQorICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KK30NCit2b2lkIENGV0xfQ29tYm9Cb3hJbXA6OlNob3dEcm9wTGlzdChGWF9CT09MIGJBY3RpdmF0ZSkgew0KKyAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICByZXR1cm4gRGlzRm9ybV9TaG93RHJvcExpc3QoYkFjdGl2YXRlKTsNCisgIH0NCisgIEZYX0JPT0wgYkRyb3BMaXN0ID0gSXNEcm9wTGlzdFNob3dlZCgpOw0KKyAgaWYgKGJEcm9wTGlzdCA9PSBiQWN0aXZhdGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKCFtX3BGb3JtKSB7DQorICAgIEluaXRQcm94eUZvcm0oKTsNCisgIH0NCisgIG1fcExpc3RQcm94eURlbGVnYXRlLT5SZXNldCgpOw0KKyAgaWYgKGJBY3RpdmF0ZSkgew0KKyAgICBzdGF0aWNfY2FzdDxDRldMX0NvbWJvTGlzdEltcCo+KG1fcExpc3RCb3gtPkdldEltcGwoKSkNCisgICAgICAgIC0+Q2hhbmdlU2VsZWN0ZWQobV9pQ3VyU2VsKTsNCisgICAgUmVTZXRMaXN0SXRlbUFsaWdubWVudCgpOw0KKyAgICBGWF9EV09SRCBkd1N0eWxlQWRkID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmDQorICAgICAgICAgICAgICAgICAgICAgICAgICAoRldMX1NUWUxFRVhUX0NNQl9Tb3J0IHwgRldMX1NUWUxFRVhUX0NNQl9Pd25lckRyYXcpOw0KKyAgICBtX3BMaXN0Qm94LT5Nb2RpZnlTdHlsZXNFeChkd1N0eWxlQWRkLCAwKTsNCisgICAgbV9wTGlzdEJveC0+R2V0V2lkZ2V0UmVjdChtX3J0TGlzdCwgVFJVRSk7DQorICAgIEZYX0ZMT0FUIGZIZWlnaHQgPSBHZXRMaXN0SGVpZ2h0KCk7DQorICAgIGlmIChmSGVpZ2h0ID4gMCkgew0KKyAgICAgIGlmIChtX3J0TGlzdC5oZWlnaHQgPiBHZXRMaXN0SGVpZ2h0KCkpIHsNCisgICAgICAgIG1fcnRMaXN0LmhlaWdodCA9IEdldExpc3RIZWlnaHQoKTsNCisgICAgICAgIG1fcExpc3RCb3gtPk1vZGlmeVN0eWxlcyhGV0xfV0dUU1RZTEVfVlNjcm9sbCwgMCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIENGWF9SZWN0RiBydEFuY2hvcjsNCisgICAgcnRBbmNob3IuU2V0KDAsIDAsIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGgsDQorICAgICAgICAgICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodCk7DQorICAgIEZYX0ZMT0FUIGZNaW5IZWlnaHQgPSAwOw0KKyAgICBpZiAobV9ydExpc3Qud2lkdGggPCBtX3J0Q2xpZW50LndpZHRoKSB7DQorICAgICAgbV9ydExpc3Qud2lkdGggPSBtX3J0Q2xpZW50LndpZHRoOw0KKyAgICB9DQorICAgIG1fcnRQcm94eSA9IG1fcnRMaXN0Ow0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9DTUJfTGlzdERyYWcpIHsNCisgICAgICBtX3J0UHJveHkuaGVpZ2h0ICs9IG1fZkNvbWJvRm9ybUhhbmRsZXI7DQorICAgIH0NCisgICAgR2V0UG9wdXBQb3MoZk1pbkhlaWdodCwgbV9ydFByb3h5LmhlaWdodCwgcnRBbmNob3IsIG1fcnRQcm94eSk7DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NNQl9MaXN0RHJhZykgew0KKyAgICAgIEZYX0ZMT0FUIGZ4ID0gMDsNCisgICAgICBGWF9GTE9BVCBmeSA9IG1fcnRDbGllbnQudG9wICsgbV9ydENsaWVudC5oZWlnaHQgLyAyOw0KKyAgICAgIFRyYW5zZm9ybVRvKE5VTEwsIGZ4LCBmeSk7DQorICAgICAgbV9iVXBGb3JtSGFuZGxlciA9IGZ5ID4gbV9ydFByb3h5LnRvcDsNCisgICAgICBpZiAobV9iVXBGb3JtSGFuZGxlcikgew0KKyAgICAgICAgbV9ydEhhbmRsZXIuU2V0KDAsIDAsIG1fcnRMaXN0LndpZHRoLCBtX2ZDb21ib0Zvcm1IYW5kbGVyKTsNCisgICAgICAgIG1fcnRMaXN0LnRvcCA9IG1fZkNvbWJvRm9ybUhhbmRsZXI7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcnRIYW5kbGVyLlNldCgwLCBtX3J0TGlzdC5oZWlnaHQsIG1fcnRMaXN0LndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZkNvbWJvRm9ybUhhbmRsZXIpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBtX3BGb3JtLT5TZXRXaWRnZXRSZWN0KG1fcnRQcm94eSk7DQorICAgIG1fcEZvcm0tPlVwZGF0ZSgpOw0KKyAgICBtX3BMaXN0Qm94LT5TZXRXaWRnZXRSZWN0KG1fcnRMaXN0KTsNCisgICAgbV9wTGlzdEJveC0+VXBkYXRlKCk7DQorICAgIENGV0xfRXZ0Q21iUHJlRHJvcERvd24gZXY7DQorICAgIGV2Lm1fcFNyY1RhcmdldCA9IG1fcEludGVyZmFjZTsNCisgICAgRGlzcGF0Y2hFdmVudCgmZXYpOw0KKyAgICBtX2ZJdGVtSGVpZ2h0ID0NCisgICAgICAgIHN0YXRpY19jYXN0PENGV0xfQ29tYm9MaXN0SW1wKj4obV9wTGlzdEJveC0+R2V0SW1wbCgpKS0+bV9mSXRlbUhlaWdodDsNCisgICAgc3RhdGljX2Nhc3Q8Q0ZXTF9Db21ib0xpc3RJbXAqPihtX3BMaXN0Qm94LT5HZXRJbXBsKCkpLT5TZXRGb2N1cyhUUlVFKTsNCisgICAgbV9wRm9ybS0+RG9Nb2RhbCgpOw0KKyAgICBzdGF0aWNfY2FzdDxDRldMX0NvbWJvTGlzdEltcCo+KG1fcExpc3RCb3gtPkdldEltcGwoKSktPlNldEZvY3VzKEZBTFNFKTsNCisgIH0gZWxzZSB7DQorICAgIG1fcEZvcm0tPkVuZERvTW9kYWwoKTsNCisgICAgQ0ZXTF9FdnRDbWJDbG9zZVVwIGV2Ow0KKyAgICBldi5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIERpc3BhdGNoRXZlbnQoJmV2KTsNCisgICAgbV9iTEJ1dHRvbkRvd24gPSBGQUxTRTsNCisgICAgc3RhdGljX2Nhc3Q8Q0ZXTF9Db21ib0xpc3RJbXAqPihtX3BMaXN0Qm94LT5HZXRJbXBsKCkpLT5tX2JOb3RpZnlPd25lciA9DQorICAgICAgICBUUlVFOw0KKyAgICBTZXRGb2N1cyhUUlVFKTsNCisgIH0NCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94SW1wOjpJc0Ryb3BMaXN0U2hvd2VkKCkgew0KKyAgcmV0dXJuIG1fcEZvcm0gJiYgIShtX3BGb3JtLT5HZXRTdGF0ZXMoKSAmIEZXTF9XR1RTVEFURV9JbnZpc2libGUpOw0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3hJbXA6OklzRHJvcERvd25TdHlsZSgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0NNQl9Ecm9wRG93bjsNCit9DQordm9pZCBDRldMX0NvbWJvQm94SW1wOjpNYXRjaEVkaXRUZXh0KCkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgbV9wRWRpdC0+R2V0VGV4dCh3c1RleHQpOw0KKyAgaW50MzJfdCBpTWF0Y2ggPQ0KKyAgICAgIHN0YXRpY19jYXN0PENGV0xfQ29tYm9MaXN0SW1wKj4obV9wTGlzdEJveC0+R2V0SW1wbCgpKS0+TWF0Y2hJdGVtKHdzVGV4dCk7DQorICBpZiAoaU1hdGNoICE9IG1faUN1clNlbCkgew0KKyAgICBzdGF0aWNfY2FzdDxDRldMX0NvbWJvTGlzdEltcCo+KG1fcExpc3RCb3gtPkdldEltcGwoKSkNCisgICAgICAgIC0+Q2hhbmdlU2VsZWN0ZWQoaU1hdGNoKTsNCisgICAgaWYgKGlNYXRjaCA+PSAwKSB7DQorICAgICAgU3luY2hyRWRpdFRleHQoaU1hdGNoKTsNCisgICAgfQ0KKyAgfSBlbHNlIGlmIChpTWF0Y2ggPj0gMCkgew0KKyAgICBzdGF0aWNfY2FzdDxDRldMX0NvbWJvRWRpdEltcCo+KG1fcEVkaXQtPkdldEltcGwoKSktPlNldFNlbGVjdGVkKCk7DQorICB9DQorICBtX2lDdXJTZWwgPSBpTWF0Y2g7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcDo6U3luY2hyRWRpdFRleHQoaW50MzJfdCBpTGlzdEl0ZW0pIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgIElGV0xfQ29tYm9Cb3hEUCogcERhdGEgPQ0KKyAgICAgIHN0YXRpY19jYXN0PElGV0xfQ29tYm9Cb3hEUCo+KG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQorICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpTGlzdEl0ZW0pOw0KKyAgc3RhdGljX2Nhc3Q8Q0ZXTF9Db21ib0xpc3RJbXAqPihtX3BMaXN0Qm94LT5HZXRJbXBsKCkpDQorICAgICAgLT5HZXRJdGVtVGV4dChoSXRlbSwgd3NUZXh0KTsNCisgIG1fcEVkaXQtPlNldFRleHQod3NUZXh0KTsNCisgIG1fcEVkaXQtPlVwZGF0ZSgpOw0KKyAgc3RhdGljX2Nhc3Q8Q0ZXTF9Db21ib0VkaXRJbXAqPihtX3BFZGl0LT5HZXRJbXBsKCkpLT5TZXRTZWxlY3RlZCgpOw0KK30NCit2b2lkIENGV0xfQ29tYm9Cb3hJbXA6OkxheW91dCgpIHsNCisgIGlmIChtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgcmV0dXJuIERpc0Zvcm1fTGF5b3V0KCk7DQorICB9DQorICBHZXRDbGllbnRSZWN0KG1fcnRDbGllbnQpOw0KKyAgRlhfRkxPQVQqIHBGV2lkdGggPQ0KKyAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUKj4oR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGgpKTsNCisgIGlmICghcEZXaWR0aCkNCisgICAgcmV0dXJuOw0KKyAgRlhfRkxPQVQgZkJ0biA9ICpwRldpZHRoOw0KKyAgbV9ydEJ0bi5TZXQobV9ydENsaWVudC5yaWdodCgpIC0gZkJ0biwgbV9ydENsaWVudC50b3AsIGZCdG4sDQorICAgICAgICAgICAgICBtX3J0Q2xpZW50LmhlaWdodCk7DQorICBGWF9CT09MIGJJc0Ryb3BEb3duID0gSXNEcm9wRG93blN0eWxlKCk7DQorICBpZiAoYklzRHJvcERvd24gJiYgbV9wRWRpdCkgew0KKyAgICBDRlhfUmVjdEYgcnRFZGl0Ow0KKyAgICBydEVkaXQuU2V0KG1fcnRDbGllbnQubGVmdCwgbV9ydENsaWVudC50b3AsIG1fcnRDbGllbnQud2lkdGggLSBmQnRuLA0KKyAgICAgICAgICAgICAgIG1fcnRDbGllbnQuaGVpZ2h0KTsNCisgICAgbV9wRWRpdC0+U2V0V2lkZ2V0UmVjdChydEVkaXQpOw0KKyAgICBpZiAobV9pQ3VyU2VsID49IDApIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICAgICAgSUZXTF9Db21ib0JveERQKiBwRGF0YSA9DQorICAgICAgICAgIHN0YXRpY19jYXN0PElGV0xfQ29tYm9Cb3hEUCo+KG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQorICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgbV9pQ3VyU2VsKTsNCisgICAgICBzdGF0aWNfY2FzdDxDRldMX0NvbWJvTGlzdEltcCo+KG1fcExpc3RCb3gtPkdldEltcGwoKSkNCisgICAgICAgICAgLT5HZXRJdGVtVGV4dChoSXRlbSwgd3NUZXh0KTsNCisgICAgICBtX3BFZGl0LT5Mb2NrVXBkYXRlKCk7DQorICAgICAgbV9wRWRpdC0+U2V0VGV4dCh3c1RleHQpOw0KKyAgICAgIG1fcEVkaXQtPlVubG9ja1VwZGF0ZSgpOw0KKyAgICB9DQorICAgIG1fcEVkaXQtPlVwZGF0ZSgpOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfQ29tYm9Cb3hJbXA6OlJlU2V0VGhlbWUoKSB7DQorICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICBpZiAoIXBUaGVtZSkgew0KKyAgICBwVGhlbWUgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gcFRoZW1lOw0KKyAgfQ0KKyAgaWYgKG1fcExpc3RCb3gpIHsNCisgICAgaWYgKCFtX3BMaXN0Qm94LT5HZXRUaGVtZVByb3ZpZGVyKCkgJiYNCisgICAgICAgIHBUaGVtZS0+SXNWYWxpZFdpZGdldChtX3BMaXN0Qm94LmdldCgpKSkgew0KKyAgICAgIG1fcExpc3RCb3gtPlNldFRoZW1lUHJvdmlkZXIocFRoZW1lKTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKG1fcEVkaXQpIHsNCisgICAgaWYgKCFtX3BFZGl0LT5HZXRUaGVtZVByb3ZpZGVyKCkgJiYgcFRoZW1lLT5Jc1ZhbGlkV2lkZ2V0KG1fcEVkaXQuZ2V0KCkpKSB7DQorICAgICAgbV9wRWRpdC0+U2V0VGhlbWVQcm92aWRlcihwVGhlbWUpOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcDo6UmVTZXRFZGl0QWxpZ25tZW50KCkgew0KKyAgaWYgKCFtX3BFZGl0KQ0KKyAgICByZXR1cm47DQorICBGWF9EV09SRCBkd1N0eWxFeGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlczsNCisgIEZYX0RXT1JEIGR3QWRkID0gMDsNCisgIHN3aXRjaCAoZHdTdHlsRXhlcyAmIEZXTF9TVFlMRUVYVF9DTUJfRWRpdEhBbGlnbk1hc2spIHsNCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRIQ2VudGVyOiB7DQorICAgICAgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0VEVF9IQ2VudGVyOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX0NNQl9FZGl0SEZhcjogew0KKyAgICAgIGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9FRFRfSEZhcjsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9FRFRfSE5lYXI7IH0NCisgIH0NCisgIHN3aXRjaCAoZHdTdHlsRXhlcyAmIEZXTF9TVFlMRUVYVF9DTUJfRWRpdFZBbGlnbk1hc2spIHsNCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRWQ2VudGVyOiB7DQorICAgICAgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0VEVF9WQ2VudGVyOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX0NNQl9FZGl0VkZhcjogew0KKyAgICAgIGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9FRFRfVkZhcjsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9FRFRfVk5lYXI7IH0NCisgIH0NCisgIGlmIChkd1N0eWxFeGVzICYgRldMX1NUWUxFRVhUX0NNQl9FZGl0SnVzdGlmaWVkKSB7DQorICAgIGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9FRFRfSnVzdGlmaWVkOw0KKyAgfQ0KKyAgaWYgKGR3U3R5bEV4ZXMgJiBGV0xfU1RZTEVFWFRfQ01CX0VkaXREaXN0cmlidXRlZCkgew0KKyAgICBkd0FkZCB8PSBGV0xfU1RZTEVFWFRfRURUX0Rpc3RyaWJ1dGVkOw0KKyAgfQ0KKyAgbV9wRWRpdC0+TW9kaWZ5U3R5bGVzRXgoZHdBZGQsIEZXTF9TVFlMRUVYVF9FRFRfSEFsaWduTWFzayB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9TVFlMRUVYVF9FRFRfSEFsaWduTW9kZU1hc2sgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfU1RZTEVFWFRfRURUX1ZBbGlnbk1hc2spOw0KK30NCit2b2lkIENGV0xfQ29tYm9Cb3hJbXA6OlJlU2V0TGlzdEl0ZW1BbGlnbm1lbnQoKSB7DQorICBpZiAoIW1fcExpc3RCb3gpDQorICAgIHJldHVybjsNCisgIEZYX0RXT1JEIGR3U3R5bEV4ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzOw0KKyAgRlhfRFdPUkQgZHdBZGQgPSAwOw0KKyAgc3dpdGNoIChkd1N0eWxFeGVzICYgRldMX1NUWUxFRVhUX0NNQl9MaXN0SXRlbUFsaWduTWFzaykgew0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9DTUJfTGlzdEl0ZW1DZW50ZXJBbGlnbjogew0KKyAgICAgIGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9MVEJfQ2VudGVyQWxpZ247DQorICAgIH0NCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ01CX0xpc3RJdGVtUmlnaHRBbGlnbjogew0KKyAgICAgIGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9MVEJfUmlnaHRBbGlnbjsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9MVEJfTGVmdEFsaWduOyB9DQorICB9DQorICBtX3BMaXN0Qm94LT5Nb2RpZnlTdHlsZXNFeChkd0FkZCwgRldMX1NUWUxFRVhUX0NNQl9MaXN0SXRlbUFsaWduTWFzayk7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcDo6UHJvY2Vzc1NlbENoYW5nZWQoRlhfQk9PTCBiTEJ1dHRvblVwKSB7DQorICBJRldMX0NvbWJvQm94RFAqIHBEYXRhcyA9DQorICAgICAgc3RhdGljX2Nhc3Q8SUZXTF9Db21ib0JveERQKj4obV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgIG1faUN1clNlbCA9IHBEYXRhcy0+R2V0SXRlbUluZGV4KG1fcEludGVyZmFjZSwgbV9wTGlzdEJveC0+R2V0U2VsSXRlbSgwKSk7DQorICBGWF9CT09MIGJEcm9wRG93biA9IElzRHJvcERvd25TdHlsZSgpOw0KKyAgaWYgKGJEcm9wRG93bikgew0KKyAgICBJRldMX0NvbWJvQm94RFAqIHBEYXRhID0NCisgICAgICAgIHN0YXRpY19jYXN0PElGV0xfQ29tYm9Cb3hEUCo+KG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQorICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIG1faUN1clNlbCk7DQorICAgIGlmIChoSXRlbSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICBwRGF0YS0+R2V0SXRlbVRleHQobV9wSW50ZXJmYWNlLCBoSXRlbSwgd3NUZXh0KTsNCisgICAgICBpZiAobV9wRWRpdCkgew0KKyAgICAgICAgbV9wRWRpdC0+U2V0VGV4dCh3c1RleHQpOw0KKyAgICAgICAgbV9wRWRpdC0+VXBkYXRlKCk7DQorICAgICAgICBzdGF0aWNfY2FzdDxDRldMX0NvbWJvRWRpdEltcCo+KG1fcEVkaXQtPkdldEltcGwoKSktPlNldFNlbGVjdGVkKCk7DQorICAgICAgfQ0KKyAgICAgIENGV0xfRXZ0Q21iU2VsQ2hhbmdlZCBldjsNCisgICAgICBldi5iTEJ1dHRvblVwID0gYkxCdXR0b25VcDsNCisgICAgICBldi5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgICAgZXYuaUFycmF5U2Vscy5BZGQobV9pQ3VyU2VsKTsNCisgICAgICBEaXNwYXRjaEV2ZW50KCZldik7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIFJlcGFpbnQoJm1fcnRDbGllbnQpOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfQ29tYm9Cb3hJbXA6OkluaXRQcm94eUZvcm0oKSB7DQorICBpZiAobV9wRm9ybSkNCisgICAgcmV0dXJuOw0KKyAgaWYgKCFtX3BMaXN0Qm94KQ0KKyAgICByZXR1cm47DQorICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcEZvcm07DQorICBwcm9wRm9ybS5tX3BPd25lciA9IG1fcEludGVyZmFjZTsNCisgIHByb3BGb3JtLm1fZHdTdHlsZXMgPSBGV0xfV0dUU1RZTEVfUG9wdXA7DQorICBwcm9wRm9ybS5tX2R3U3RhdGVzID0gRldMX1dHVFNUQVRFX0ludmlzaWJsZTsNCisgIENGWF9XaWRlU3RyaW5nIGNsYXNzTmFtZTsNCisgIG1fcEZvcm0gPSBJRldMX0Zvcm06OkNyZWF0ZUZvcm1Qcm94eShwcm9wRm9ybSwgJmNsYXNzTmFtZSwgbV9wTGlzdEJveC5nZXQoKSk7DQorICBtX3BGb3JtLT5Jbml0aWFsaXplKCk7DQorICBtX3BQcm94eSA9IHN0YXRpY19jYXN0PENGV0xfRm9ybVByb3h5SW1wKj4obV9wRm9ybS0+R2V0SW1wbCgpKTsNCisgIG1fcExpc3RCb3gtPlNldFBhcmVudChtX3BGb3JtKTsNCisgIG1fcExpc3RQcm94eURlbGVnYXRlID0gbmV3IENGV0xfQ29tYm9Qcm94eUltcERlbGVnYXRlKG1fcEZvcm0sIHRoaXMpOw0KKyAgbV9wUHJveHktPlNldERlbGVnYXRlKG1fcExpc3RQcm94eURlbGVnYXRlKTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94SW1wOjpEaXNGb3JtX0luaXRpYWxpemUoKSB7DQorICBpZiAoQ0ZXTF9XaWRnZXRJbXA6OkluaXRpYWxpemUoKSAhPSBGV0xfRVJSX1N1Y2NlZWRlZCkNCisgICAgcmV0dXJuIEZXTF9XR1RTVEFURV9JbnZpc2libGU7ICAvLyBEaXR0by4NCisgIG1fcERlbGVnYXRlID0gbmV3IENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZSh0aGlzKTsNCisgIERpc0Zvcm1fSW5pdENvbWJvTGlzdCgpOw0KKyAgRGlzRm9ybV9Jbml0Q29tYm9FZGl0KCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcDo6RGlzRm9ybV9Jbml0Q29tYm9MaXN0KCkgew0KKyAgaWYgKG1fcExpc3RCb3gpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3A7DQorICBwcm9wLm1fcFBhcmVudCA9IG1fcEludGVyZmFjZTsNCisgIHByb3AubV9kd1N0eWxlcyA9IEZXTF9XR1RTVFlMRV9Cb3JkZXIgfCBGV0xfV0dUU1RZTEVfVlNjcm9sbDsNCisgIHByb3AubV9kd1N0YXRlcyA9IEZXTF9XR1RTVEFURV9JbnZpc2libGU7DQorICBwcm9wLm1fcERhdGFQcm92aWRlciA9IG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgIHByb3AubV9wVGhlbWVQcm92aWRlciA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICBtX3BMaXN0Qm94LnJlc2V0KElGV0xfTGlzdEJveDo6Q3JlYXRlQ29tYm9MaXN0KHByb3AsIG1fcEludGVyZmFjZSkpOw0KKyAgbV9wTGlzdEJveC0+SW5pdGlhbGl6ZSgpOw0KK30NCit2b2lkIENGV0xfQ29tYm9Cb3hJbXA6OkRpc0Zvcm1fSW5pdENvbWJvRWRpdCgpIHsNCisgIGlmIChtX3BFZGl0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wOw0KKyAgcHJvcC5tX3BQYXJlbnQgPSBtX3BJbnRlcmZhY2U7DQorICBwcm9wLm1fcFRoZW1lUHJvdmlkZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KKyAgbV9wRWRpdC5yZXNldChJRldMX0VkaXQ6OkNyZWF0ZUNvbWJvRWRpdChwcm9wLCBtX3BJbnRlcmZhY2UpKTsNCisgIG1fcEVkaXQtPkluaXRpYWxpemUoKTsNCisgIHN0YXRpY19jYXN0PENGV0xfQ29tYm9FZGl0SW1wKj4obV9wRWRpdC0+R2V0SW1wbCgpKS0+U2V0T3V0ZXIobV9wSW50ZXJmYWNlKTsNCit9DQordm9pZCBDRldMX0NvbWJvQm94SW1wOjpEaXNGb3JtX1Nob3dEcm9wTGlzdChGWF9CT09MIGJBY3RpdmF0ZSkgew0KKyAgRlhfQk9PTCBiRHJvcExpc3QgPSBEaXNGb3JtX0lzRHJvcExpc3RTaG93ZWQoKTsNCisgIGlmIChiRHJvcExpc3QgPT0gYkFjdGl2YXRlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChiQWN0aXZhdGUpIHsNCisgICAgQ0ZXTF9FdnRDbWJQcmVEcm9wRG93biBwcmVFdmVudDsNCisgICAgcHJlRXZlbnQubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBEaXNwYXRjaEV2ZW50KCZwcmVFdmVudCk7DQorICAgIENGV0xfQ29tYm9MaXN0SW1wKiBwQ29tYm9MaXN0ID0NCisgICAgICAgIHN0YXRpY19jYXN0PENGV0xfQ29tYm9MaXN0SW1wKj4obV9wTGlzdEJveC0+R2V0SW1wbCgpKTsNCisgICAgaW50MzJfdCBpSXRlbXMgPSBwQ29tYm9MaXN0LT5Db3VudEl0ZW1zKCk7DQorICAgIGlmIChpSXRlbXMgPCAxKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIFJlU2V0TGlzdEl0ZW1BbGlnbm1lbnQoKTsNCisgICAgcENvbWJvTGlzdC0+Q2hhbmdlU2VsZWN0ZWQobV9pQ3VyU2VsKTsNCisgICAgRlhfRkxPQVQgZkl0ZW1IZWlnaHQgPSBwQ29tYm9MaXN0LT5HZXRJdGVtSGVpZ3QoKTsNCisgICAgRlhfRkxPQVQgZkJvcmRlciA9IEdldEJvcmRlclNpemUoKTsNCisgICAgRlhfRkxPQVQgZlBvcHVwTWluID0gMC4wZjsNCisgICAgaWYgKGlJdGVtcyA+IDMpIHsNCisgICAgICBmUG9wdXBNaW4gPSBmSXRlbUhlaWdodCAqIDMgKyBmQm9yZGVyICogMjsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmUG9wdXBNYXggPSBmSXRlbUhlaWdodCAqIGlJdGVtcyArIGZCb3JkZXIgKiAyOw0KKyAgICBDRlhfUmVjdEYgcnRMaXN0Ow0KKyAgICBydExpc3QubGVmdCA9IG1fcnRDbGllbnQubGVmdDsNCisgICAgcnRMaXN0LndpZHRoID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aDsNCisgICAgcnRMaXN0LnRvcCA9IDA7DQorICAgIHJ0TGlzdC5oZWlnaHQgPSAwOw0KKyAgICBHZXRQb3B1cFBvcyhmUG9wdXBNaW4sIGZQb3B1cE1heCwgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldCwgcnRMaXN0KTsNCisgICAgbV9wTGlzdEJveC0+U2V0V2lkZ2V0UmVjdChydExpc3QpOw0KKyAgICBtX3BMaXN0Qm94LT5VcGRhdGUoKTsNCisgIH0gZWxzZSB7DQorICAgIFNldEZvY3VzKFRSVUUpOw0KKyAgfQ0KKyAgbV9wTGlzdEJveC0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsICFiQWN0aXZhdGUpOw0KKyAgaWYgKGJBY3RpdmF0ZSkgew0KKyAgICBDRldMX0V2dENtYlBvc3REcm9wRG93biBwb3N0RXZlbnQ7DQorICAgIHBvc3RFdmVudC5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIERpc3BhdGNoRXZlbnQoJnBvc3RFdmVudCk7DQorICB9DQorICBDRlhfUmVjdEYgcmVjdDsNCisgIG1fcExpc3RCb3gtPkdldFdpZGdldFJlY3QocmVjdCk7DQorICByZWN0LkluZmxhdGUoMiwgMik7DQorICBSZXBhaW50KCZyZWN0KTsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94SW1wOjpEaXNGb3JtX0lzRHJvcExpc3RTaG93ZWQoKSB7DQorICByZXR1cm4gIShtX3BMaXN0Qm94LT5HZXRTdGF0ZXMoKSAmIEZXTF9XR1RTVEFURV9JbnZpc2libGUpOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OkRpc0Zvcm1fTW9kaWZ5U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCkgew0KKyAgaWYgKCFtX3BFZGl0KSB7DQorICAgIERpc0Zvcm1fSW5pdENvbWJvRWRpdCgpOw0KKyAgfQ0KKyAgRlhfQk9PTCBiQWRkRHJvcERvd24gPSBkd1N0eWxlc0V4QWRkZWQgJiBGV0xfU1RZTEVFWFRfQ01CX0Ryb3BEb3duOw0KKyAgRlhfQk9PTCBiRGVsRHJvcERvd24gPSBkd1N0eWxlc0V4UmVtb3ZlZCAmIEZXTF9TVFlMRUVYVF9DTUJfRHJvcERvd247DQorICBkd1N0eWxlc0V4UmVtb3ZlZCAmPSB+RldMX1NUWUxFRVhUX0NNQl9Ecm9wRG93bjsNCisgIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgfD0gRldMX1NUWUxFRVhUX0NNQl9Ecm9wRG93bjsNCisgIGlmIChiQWRkRHJvcERvd24pIHsNCisgICAgbV9wRWRpdC0+TW9kaWZ5U3R5bGVzRXgoMCwgRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seSk7DQorICB9IGVsc2UgaWYgKGJEZWxEcm9wRG93bikgew0KKyAgICBtX3BFZGl0LT5Nb2RpZnlTdHlsZXNFeChGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5LCAwKTsNCisgIH0NCisgIHJldHVybiBDRldMX1dpZGdldEltcDo6TW9kaWZ5U3R5bGVzRXgoZHdTdHlsZXNFeEFkZGVkLCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveEltcDo6RGlzRm9ybV9VcGRhdGUoKSB7DQorICBpZiAobV9pTG9jaykgew0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgfQ0KKyAgaWYgKG1fcEVkaXQpIHsNCisgICAgUmVTZXRFZGl0QWxpZ25tZW50KCk7DQorICB9DQorICBSZVNldFRoZW1lKCk7DQorICBMYXlvdXQoKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9Db21ib0JveEltcDo6RGlzRm9ybV9IaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgQ0ZYX1JlY3RGIHJlY3Q7DQorICByZWN0LlNldCgwLCAwLCBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LndpZHRoIC0gbV9ydEJ0bi53aWR0aCwNCisgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0KTsNCisgIGlmIChyZWN0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0VkaXQ7DQorICB9DQorICBpZiAobV9ydEJ0bi5Db250YWlucyhmeCwgZnkpKSB7DQorICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9DbGllbnQ7DQorICB9DQorICBpZiAoRGlzRm9ybV9Jc0Ryb3BMaXN0U2hvd2VkKCkpIHsNCisgICAgbV9wTGlzdEJveC0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgICAgaWYgKHJlY3QuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9DbGllbnQ7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Vbmtub3duOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OkRpc0Zvcm1fRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICBDRlhfTWF0cml4IG10T3JnOw0KKyAgbXRPcmcuU2V0KDEsIDAsIDAsIDEsIDAsIDApOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgbXRPcmcgPSAqcE1hdHJpeDsNCisgIH0NCisgIEZYX0JPT0wgYkxpc3RTaG93ZWQgPSBtX3BMaXN0Qm94ICYmIERpc0Zvcm1fSXNEcm9wTGlzdFNob3dlZCgpOw0KKyAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgcEdyYXBoaWNzLT5Db25jYXRNYXRyaXgoJm10T3JnKTsNCisgIGlmICghbV9ydEJ0bi5Jc0VtcHR5KDAuMWYpKSB7DQorICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9DTUJfRHJvcERvd25CdXR0b247DQorICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBtX2lCdG5TdGF0ZTsNCisgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIHBhcmFtLm1fcnRQYXJ0ID0gbV9ydEJ0bjsNCisgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KKyAgfQ0KKyAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgaWYgKG1fcEVkaXQpIHsNCisgICAgQ0ZYX1JlY3RGIHJ0RWRpdDsNCisgICAgbV9wRWRpdC0+R2V0V2lkZ2V0UmVjdChydEVkaXQpOw0KKyAgICBDRlhfTWF0cml4IG10Ow0KKyAgICBtdC5TZXQoMSwgMCwgMCwgMSwgcnRFZGl0LmxlZnQsIHJ0RWRpdC50b3ApOw0KKyAgICBtdC5Db25jYXQobXRPcmcpOw0KKyAgICBtX3BFZGl0LT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgJm10KTsNCisgIH0NCisgIGlmIChiTGlzdFNob3dlZCkgew0KKyAgICBDRlhfUmVjdEYgcnRMaXN0Ow0KKyAgICBtX3BMaXN0Qm94LT5HZXRXaWRnZXRSZWN0KHJ0TGlzdCk7DQorICAgIENGWF9NYXRyaXggbXQ7DQorICAgIG10LlNldCgxLCAwLCAwLCAxLCBydExpc3QubGVmdCwgcnRMaXN0LnRvcCk7DQorICAgIG10LkNvbmNhdChtdE9yZyk7DQorICAgIG1fcExpc3RCb3gtPkRyYXdXaWRnZXQocEdyYXBoaWNzLCAmbXQpOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXA6OkRpc0Zvcm1fR2V0QkJveChDRlhfUmVjdEYmIHJlY3QpIHsNCisgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgaWYgKG1fcExpc3RCb3ggJiYgRGlzRm9ybV9Jc0Ryb3BMaXN0U2hvd2VkKCkpIHsNCisgICAgQ0ZYX1JlY3RGIHJ0TGlzdDsNCisgICAgbV9wTGlzdEJveC0+R2V0V2lkZ2V0UmVjdChydExpc3QpOw0KKyAgICBydExpc3QuT2Zmc2V0KHJlY3QubGVmdCwgcmVjdC50b3ApOw0KKyAgICByZWN0LlVuaW9uKHJ0TGlzdCk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcDo6RGlzRm9ybV9MYXlvdXQoKSB7DQorICBHZXRDbGllbnRSZWN0KG1fcnRDbGllbnQpOw0KKyAgbV9ydENvbnRlbnQgPSBtX3J0Q2xpZW50Ow0KKyAgRlhfRkxPQVQqIHBGV2lkdGggPQ0KKyAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUKj4oR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGgpKTsNCisgIGlmICghcEZXaWR0aCkNCisgICAgcmV0dXJuOw0KKyAgRlhfRkxPQVQgYm9yZGVyV2lkdGggPSAwOw0KKyAgeyBib3JkZXJXaWR0aCA9IEZXTF9QQVJUX0NNQl9Cb3JkZXI7IH0NCisgIEZYX0ZMT0FUIGZCdG4gPSAqcEZXaWR0aDsNCisgIGlmICghKHRoaXMtPkdldFN0eWxlc0V4KCkgJiBGV0xfU1RZTEVFWFRfQ01CX1JlYWRPbmx5KSkgew0KKyAgICBtX3J0QnRuLlNldChtX3J0Q2xpZW50LnJpZ2h0KCkgLSBmQnRuLCBtX3J0Q2xpZW50LnRvcCArIGJvcmRlcldpZHRoLA0KKyAgICAgICAgICAgICAgICBmQnRuIC0gYm9yZGVyV2lkdGgsIG1fcnRDbGllbnQuaGVpZ2h0IC0gMiAqIGJvcmRlcldpZHRoKTsNCisgIH0NCisgIENGWF9SZWN0RiogcFVJTWFyZ2luID0NCisgICAgICBzdGF0aWNfY2FzdDxDRlhfUmVjdEYqPihHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9VSU1hcmdpbikpOw0KKyAgaWYgKHBVSU1hcmdpbikgew0KKyAgICBtX3J0Q29udGVudC5EZWZsYXRlKHBVSU1hcmdpbi0+bGVmdCwgcFVJTWFyZ2luLT50b3AsIHBVSU1hcmdpbi0+d2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgcFVJTWFyZ2luLT5oZWlnaHQpOw0KKyAgfQ0KKyAgRlhfQk9PTCBiSXNEcm9wRG93biA9IElzRHJvcERvd25TdHlsZSgpOw0KKyAgaWYgKGJJc0Ryb3BEb3duICYmIG1fcEVkaXQpIHsNCisgICAgQ0ZYX1JlY3RGIHJ0RWRpdDsNCisgICAgcnRFZGl0LlNldChtX3J0Q29udGVudC5sZWZ0LCBtX3J0Q29udGVudC50b3AsIG1fcnRDb250ZW50LndpZHRoIC0gZkJ0biwNCisgICAgICAgICAgICAgICBtX3J0Q29udGVudC5oZWlnaHQpOw0KKyAgICBtX3BFZGl0LT5TZXRXaWRnZXRSZWN0KHJ0RWRpdCk7DQorICAgIGlmIChtX2lDdXJTZWwgPj0gMCkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICBJRldMX0NvbWJvQm94RFAqIHBEYXRhID0NCisgICAgICAgICAgc3RhdGljX2Nhc3Q8SUZXTF9Db21ib0JveERQKj4obV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBtX2lDdXJTZWwpOw0KKyAgICAgIHN0YXRpY19jYXN0PENGV0xfQ29tYm9MaXN0SW1wKj4obV9wTGlzdEJveC0+R2V0SW1wbCgpKQ0KKyAgICAgICAgICAtPkdldEl0ZW1UZXh0KGhJdGVtLCB3c1RleHQpOw0KKyAgICAgIG1fcEVkaXQtPkxvY2tVcGRhdGUoKTsNCisgICAgICBtX3BFZGl0LT5TZXRUZXh0KHdzVGV4dCk7DQorICAgICAgbV9wRWRpdC0+VW5sb2NrVXBkYXRlKCk7DQorICAgIH0NCisgICAgbV9wRWRpdC0+VXBkYXRlKCk7DQorICB9DQorfQ0KK0NGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZTo6Q0ZXTF9Db21ib0JveEltcERlbGVnYXRlKENGV0xfQ29tYm9Cb3hJbXAqIHBPd25lcikNCisgICAgOiBtX3BPd25lcihwT3duZXIpIHt9DQoraW50MzJfdCBDRldMX0NvbWJvQm94SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgaWYgKG1fcE93bmVyLT5tX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgcmV0dXJuIERpc0Zvcm1fT25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorICB9DQorICBpZiAoIXBNZXNzYWdlKQ0KKyAgICByZXR1cm4gMDsNCisgIEZYX0RXT1JEIGR3TXNnQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQorICBGWF9CT09MIGlSZXQgPSAxOw0KKyAgc3dpdGNoIChkd01zZ0NvZGUpIHsNCisgICAgY2FzZSBGV0xfTVNHSEFTSF9TZXRGb2N1czoNCisgICAgY2FzZSBGV0xfTVNHSEFTSF9LaWxsRm9jdXM6IHsNCisgICAgICBPbkZvY3VzQ2hhbmdlZChwTWVzc2FnZSwgZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX1NldEZvY3VzKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX01vdXNlOiB7DQorICAgICAgQ0ZXTF9Nc2dNb3VzZSogcE1zZyA9IHN0YXRpY19jYXN0PENGV0xfTXNnTW91c2UqPihwTWVzc2FnZSk7DQorICAgICAgRlhfRFdPUkQgZHdDbWQgPSBwTXNnLT5tX2R3Q21kOw0KKyAgICAgIHN3aXRjaCAoZHdDbWQpIHsNCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duOiB7DQorICAgICAgICAgIE9uTEJ1dHRvbkRvd24ocE1zZyk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvblVwOiB7DQorICAgICAgICAgIE9uTEJ1dHRvblVwKHBNc2cpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTW92ZTogew0KKyAgICAgICAgICBPbk1vdXNlTW92ZShwTXNnKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlOiB7DQorICAgICAgICAgIE9uTW91c2VMZWF2ZShwTXNnKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7fQ0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX0tleTogew0KKyAgICAgIE9uS2V5KHN0YXRpY19jYXN0PENGV0xfTXNnS2V5Kj4ocE1lc3NhZ2UpKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IGlSZXQgPSAwOyB9DQorICB9DQorICBDRldMX1dpZGdldEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCisgIHJldHVybiBpUmV0Ow0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSB7DQorICBGWF9EV09SRCBkd0ZsYWcgPSBwRXZlbnQtPkdldENsYXNzSUQoKTsNCisgIGlmIChkd0ZsYWcgPT0gRldMX0VWVEhBU0hfTFRCX0RyYXdJdGVtKSB7DQorICAgIENGV0xfRXZ0THRiRHJhd0l0ZW0qIHBEcmF3SXRlbUV2ZW50ID0NCisgICAgICAgIHN0YXRpY19jYXN0PENGV0xfRXZ0THRiRHJhd0l0ZW0qPihwRXZlbnQpOw0KKyAgICBDRldMX0V2dENtYkRyYXdJdGVtIHBUZW1wOw0KKyAgICBwVGVtcC5tX3BTcmNUYXJnZXQgPSBtX3BPd25lci0+bV9wSW50ZXJmYWNlOw0KKyAgICBwVGVtcC5tX3BHcmFwaGljcyA9IHBEcmF3SXRlbUV2ZW50LT5tX3BHcmFwaGljczsNCisgICAgcFRlbXAubV9pbmRleCA9IHBEcmF3SXRlbUV2ZW50LT5tX2luZGV4Ow0KKyAgICBwVGVtcC5tX3J0SXRlbSA9IHBEcmF3SXRlbUV2ZW50LT5tX3JlY3Q7DQorICAgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZwVGVtcCk7DQorICB9IGVsc2UgaWYgKGR3RmxhZyA9PSBGV0xfRVZUSEFTSF9TY3JvbGwpIHsNCisgICAgQ0ZXTF9FdnRTY3JvbGwqIHBTY3JvbGxFdmVudCA9IHN0YXRpY19jYXN0PENGV0xfRXZ0U2Nyb2xsKj4ocEV2ZW50KTsNCisgICAgQ0ZXTF9FdnRTY3JvbGwgcFNjcm9sbEV2Ow0KKyAgICBwU2Nyb2xsRXYubV9wU3JjVGFyZ2V0ID0gbV9wT3duZXItPm1fcEludGVyZmFjZTsNCisgICAgcFNjcm9sbEV2Lm1faVNjcm9sbENvZGUgPSBwU2Nyb2xsRXZlbnQtPm1faVNjcm9sbENvZGU7DQorICAgIHBTY3JvbGxFdi5tX2ZQb3MgPSBwU2Nyb2xsRXZlbnQtPm1fZlBvczsNCisgICAgbV9wT3duZXItPkRpc3BhdGNoRXZlbnQoJnBTY3JvbGxFdik7DQorICB9IGVsc2UgaWYgKGR3RmxhZyA9PSBGV0xfRVZUSEFTSF9FRFRfVGV4dENoYW5nZWQpIHsNCisgICAgQ0ZXTF9FdnRFZHRUZXh0Q2hhbmdlZCogcFRleHRDaGFuZ2VkRXZlbnQgPQ0KKyAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZXTF9FdnRFZHRUZXh0Q2hhbmdlZCo+KHBFdmVudCk7DQorICAgIENGV0xfRXZ0Q21iRWRpdENoYW5nZWQgcFRlbXA7DQorICAgIHBUZW1wLm1fcFNyY1RhcmdldCA9IG1fcE93bmVyLT5tX3BJbnRlcmZhY2U7DQorICAgIHBUZW1wLndzSW5zZXJ0ID0gcFRleHRDaGFuZ2VkRXZlbnQtPndzSW5zZXJ0Ow0KKyAgICBwVGVtcC53c0RlbGV0ZSA9IHBUZXh0Q2hhbmdlZEV2ZW50LT53c0RlbGV0ZTsNCisgICAgcFRlbXAubkNoYW5nZVR5cGUgPSBwVGV4dENoYW5nZWRFdmVudC0+bkNoYW5nZVR5cGU7DQorICAgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZwVGVtcCk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICByZXR1cm4gbV9wT3duZXItPkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCit9DQordm9pZCBDRldMX0NvbWJvQm94SW1wRGVsZWdhdGU6Ok9uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSogcE1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0KSB7DQorICBJRldMX1RhcmdldCogcERzdFRhcmdldCA9IHBNc2ctPm1fcERzdFRhcmdldDsNCisgIElGV0xfVGFyZ2V0KiBwU3JjVGFyZ2V0ID0gcE1zZy0+bV9wU3JjVGFyZ2V0Ow0KKyAgRlhfQk9PTCBiRHJvcERvd24gPSBtX3BPd25lci0+SXNEcm9wRG93blN0eWxlKCk7DQorICBpZiAoYlNldCkgew0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfV0dUU1RBVEVfRm9jdXNlZDsNCisgICAgaWYgKGJEcm9wRG93biAmJiBwU3JjVGFyZ2V0ICE9IG1fcE93bmVyLT5tX3BMaXN0Qm94LmdldCgpKSB7DQorICAgICAgaWYgKCFtX3BPd25lci0+bV9wRWRpdCkNCisgICAgICAgIHJldHVybjsNCisgICAgICBzdGF0aWNfY2FzdDxDRldMX0NvbWJvRWRpdEltcCo+KG1fcE93bmVyLT5tX3BFZGl0LT5HZXRJbXBsKCkpDQorICAgICAgICAgIC0+U2V0U2VsZWN0ZWQoKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICAgIGlmIChiRHJvcERvd24gJiYgcERzdFRhcmdldCAhPSBtX3BPd25lci0+bV9wTGlzdEJveC5nZXQoKSkgew0KKyAgICAgIGlmICghbV9wT3duZXItPm1fcEVkaXQpDQorICAgICAgICByZXR1cm47DQorICAgICAgc3RhdGljX2Nhc3Q8Q0ZXTF9Db21ib0VkaXRJbXAqPihtX3BPd25lci0+bV9wRWRpdC0+R2V0SW1wbCgpKQ0KKyAgICAgICAgICAtPkZsYWdGb2N1cyhGQUxTRSk7DQorICAgICAgc3RhdGljX2Nhc3Q8Q0ZXTF9Db21ib0VkaXRJbXAqPihtX3BPd25lci0+bV9wRWRpdC0+R2V0SW1wbCgpKQ0KKyAgICAgICAgICAtPkNsZWFyU2VsZWN0ZWQoKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlOjpPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9CT09MIGJEcm9wRG93biA9IG1fcE93bmVyLT5Jc0Ryb3BEb3duU3R5bGUoKTsNCisgIENGWF9SZWN0RiYgcnRCdG4gPSBiRHJvcERvd24gPyBtX3BPd25lci0+bV9ydEJ0biA6IG1fcE93bmVyLT5tX3J0Q2xpZW50Ow0KKyAgRlhfQk9PTCBiQ2xpY2tCdG4gPSBydEJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgIGlmIChiQ2xpY2tCdG4pIHsNCisgICAgaWYgKGJEcm9wRG93biAmJiBtX3BPd25lci0+bV9wRWRpdCkgew0KKyAgICAgIG1fcE93bmVyLT5NYXRjaEVkaXRUZXh0KCk7DQorICAgIH0NCisgICAgbV9wT3duZXItPm1fYkxCdXR0b25Eb3duID0gVFJVRTsNCisgICAgbV9wT3duZXItPm1faUJ0blN0YXRlID0gRldMX1BBUlRTVEFURV9DTUJfUHJlc3NlZDsNCisgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCisgICAgbV9wT3duZXItPlNob3dEcm9wTGlzdChUUlVFKTsNCisgICAgbV9wT3duZXItPm1faUJ0blN0YXRlID0gRldMX1BBUlRTVEFURV9DTUJfTm9ybWFsOw0KKyAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZTo6T25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSogcE1zZykgew0KKyAgbV9wT3duZXItPm1fYkxCdXR0b25Eb3duID0gRkFMU0U7DQorICBpZiAobV9wT3duZXItPm1fcnRCdG4uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgbV9wT3duZXItPm1faUJ0blN0YXRlID0gRldMX1BBUlRTVEFURV9DTUJfSG92ZXJlZDsNCisgIH0gZWxzZSB7DQorICAgIG1fcE93bmVyLT5tX2lCdG5TdGF0ZSA9IEZXTF9QQVJUU1RBVEVfQ01CX05vcm1hbDsNCisgIH0NCisgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydEJ0bik7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlOjpPbk1vdXNlTW92ZShDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBpbnQzMl90IGlPbGRTdGF0ZSA9IG1fcE93bmVyLT5tX2lCdG5TdGF0ZTsNCisgIGlmIChtX3BPd25lci0+bV9ydEJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICBtX3BPd25lci0+bV9pQnRuU3RhdGUgPSBtX3BPd25lci0+bV9iTEJ1dHRvbkRvd24NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gRldMX1BBUlRTVEFURV9DTUJfUHJlc3NlZA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGV0xfUEFSVFNUQVRFX0NNQl9Ib3ZlcmVkOw0KKyAgfSBlbHNlIHsNCisgICAgbV9wT3duZXItPm1faUJ0blN0YXRlID0gRldMX1BBUlRTVEFURV9DTUJfTm9ybWFsOw0KKyAgfQ0KKyAgaWYgKChpT2xkU3RhdGUgIT0gbV9wT3duZXItPm1faUJ0blN0YXRlKSAmJg0KKyAgICAgICEoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSA9PQ0KKyAgICAgICAgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSkgew0KKyAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRCdG4pOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZTo6T25Nb3VzZUxlYXZlKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmICghbV9wT3duZXItPklzRHJvcExpc3RTaG93ZWQoKSAmJg0KKyAgICAgICEoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSA9PQ0KKyAgICAgICAgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSkgew0KKyAgICBtX3BPd25lci0+bV9pQnRuU3RhdGUgPSBGV0xfUEFSVFNUQVRFX0NNQl9Ob3JtYWw7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydEJ0bik7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlOjpPbktleShDRldMX01zZ0tleSogcE1zZykgew0KKyAgRlhfRFdPUkQgZHdLZXlDb2RlID0gcE1zZy0+bV9kd0tleUNvZGU7DQorICBpZiAoZHdLZXlDb2RlID09IEZXTF9WS0VZX1RhYikgew0KKyAgICBtX3BPd25lci0+RGlzcGF0Y2hLZXlFdmVudChwTXNnKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfQk9PTCBiU3ViQ3RybEtleSA9IHBNc2ctPm1fcERzdFRhcmdldCA9PSBtX3BPd25lci0+bV9wSW50ZXJmYWNlOw0KKyAgaWYgKGJTdWJDdHJsS2V5KSB7DQorICAgIERvU3ViQ3RybEtleShwTXNnKTsNCisgIH0NCit9DQordm9pZCBDRldMX0NvbWJvQm94SW1wRGVsZWdhdGU6OkRvU3ViQ3RybEtleShDRldMX01zZ0tleSogcE1zZykgew0KKyAgRlhfRFdPUkQgZHdLZXlDb2RlID0gcE1zZy0+bV9kd0tleUNvZGU7DQorICBGWF9CT09MIGJVcCA9IGR3S2V5Q29kZSA9PSBGV0xfVktFWV9VcDsNCisgIEZYX0JPT0wgYkRvd24gPSBkd0tleUNvZGUgPT0gRldMX1ZLRVlfRG93bjsNCisgIGlmIChiVXAgfHwgYkRvd24pIHsNCisgICAgaW50MzJfdCBpQ291bnQgPSBzdGF0aWNfY2FzdDxDRldMX0NvbWJvTGlzdEltcCo+KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9wTGlzdEJveC0+R2V0SW1wbCgpKS0+Q291bnRJdGVtcygpOw0KKyAgICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJNYXRjaEVxdWFsID0gRkFMU0U7DQorICAgIGludDMyX3QgaUN1clNlbCA9IG1fcE93bmVyLT5tX2lDdXJTZWw7DQorICAgIEZYX0JPT0wgYkRyb3BEb3duID0gbV9wT3duZXItPklzRHJvcERvd25TdHlsZSgpOw0KKyAgICBpZiAoYkRyb3BEb3duICYmIG1fcE93bmVyLT5tX3BFZGl0KSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICAgIG1fcE93bmVyLT5tX3BFZGl0LT5HZXRUZXh0KHdzVGV4dCk7DQorICAgICAgaUN1clNlbCA9IHN0YXRpY19jYXN0PENGV0xfQ29tYm9MaXN0SW1wKj4obV9wT3duZXItPm1fcExpc3RCb3gtPkdldEltcGwoKSkNCisgICAgICAgICAgICAgICAgICAgIC0+TWF0Y2hJdGVtKHdzVGV4dCk7DQorICAgICAgaWYgKGlDdXJTZWwgPj0gMCkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KKyAgICAgICAgSUZXTF9Db21ib0JveERQKiBwRGF0YSA9IHN0YXRpY19jYXN0PElGV0xfQ29tYm9Cb3hEUCo+KA0KKyAgICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcE93bmVyLT5tX3BJbnRlcmZhY2UsIGlDdXJTZWwpOw0KKyAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZXTF9Db21ib0xpc3RJbXAqPihtX3BPd25lci0+bV9wTGlzdEJveC0+R2V0SW1wbCgpKQ0KKyAgICAgICAgICAgIC0+R2V0SXRlbVRleHQoaEl0ZW0sIHdzVGVtcCk7DQorICAgICAgICBiTWF0Y2hFcXVhbCA9IHdzVGV4dC5FcXVhbCh3c1RlbXApOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoaUN1clNlbCA8IDApIHsNCisgICAgICBpQ3VyU2VsID0gMDsNCisgICAgfSBlbHNlIGlmICghYkRyb3BEb3duIHx8IGJNYXRjaEVxdWFsKSB7DQorICAgICAgaWYgKChiVXAgJiYgaUN1clNlbCA9PSAwKSB8fCAoYkRvd24gJiYgaUN1clNlbCA9PSBpQ291bnQgLSAxKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgICBpZiAoYlVwKSB7DQorICAgICAgICBpQ3VyU2VsLS07DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlDdXJTZWwrKzsNCisgICAgICB9DQorICAgIH0NCisgICAgbV9wT3duZXItPm1faUN1clNlbCA9IGlDdXJTZWw7DQorICAgIGlmIChiRHJvcERvd24gJiYgbV9wT3duZXItPm1fcEVkaXQpIHsNCisgICAgICBtX3BPd25lci0+U3luY2hyRWRpdFRleHQobV9wT3duZXItPm1faUN1clNlbCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCisgICAgfQ0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9CT09MIGJEcm9wRG93biA9IG1fcE93bmVyLT5Jc0Ryb3BEb3duU3R5bGUoKTsNCisgIGlmIChiRHJvcERvd24pIHsNCisgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogcERlbGVnYXRlID0gbV9wT3duZXItPm1fcEVkaXQtPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgICBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1zZyk7DQorICB9DQorfQ0KK2ludDMyX3QgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlOjpEaXNGb3JtX09uUHJvY2Vzc01lc3NhZ2UoDQorICAgIENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsNCisgIGlmICghcE1lc3NhZ2UpDQorICAgIHJldHVybiAwOw0KKyAgRlhfRFdPUkQgZHdNc2dDb2RlID0gcE1lc3NhZ2UtPkdldENsYXNzSUQoKTsNCisgIEZYX0JPT0wgYmFja0RlZmF1bHQgPSBUUlVFOw0KKyAgc3dpdGNoIChkd01zZ0NvZGUpIHsNCisgICAgY2FzZSBGV0xfTVNHSEFTSF9TZXRGb2N1czoNCisgICAgY2FzZSBGV0xfTVNHSEFTSF9LaWxsRm9jdXM6IHsNCisgICAgICBiYWNrRGVmYXVsdCA9IEZBTFNFOw0KKyAgICAgIERpc0Zvcm1fT25Gb2N1c0NoYW5nZWQocE1lc3NhZ2UsIGR3TXNnQ29kZSA9PSBGV0xfTVNHSEFTSF9TZXRGb2N1cyk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9Nb3VzZTogew0KKyAgICAgIGJhY2tEZWZhdWx0ID0gRkFMU0U7DQorICAgICAgQ0ZXTF9Nc2dNb3VzZSogcE1zZyA9IHN0YXRpY19jYXN0PENGV0xfTXNnTW91c2UqPihwTWVzc2FnZSk7DQorICAgICAgRlhfRFdPUkQgZHdDbWQgPSBwTXNnLT5tX2R3Q21kOw0KKyAgICAgIHN3aXRjaCAoZHdDbWQpIHsNCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duOiB7DQorICAgICAgICAgIERpc0Zvcm1fT25MQnV0dG9uRG93bihwTXNnKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA6IHsNCisgICAgICAgICAgT25MQnV0dG9uVXAocE1zZyk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDoge30NCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9LZXk6IHsNCisgICAgICBiYWNrRGVmYXVsdCA9IEZBTFNFOw0KKyAgICAgIENGV0xfTXNnS2V5KiBwS2V5ID0gc3RhdGljX2Nhc3Q8Q0ZXTF9Nc2dLZXkqPihwTWVzc2FnZSk7DQorICAgICAgaWYgKHBLZXktPm1fZHdDbWQgPT0gRldMX01TR0tFWUNNRF9LZXlVcCkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlmIChtX3BPd25lci0+RGlzRm9ybV9Jc0Ryb3BMaXN0U2hvd2VkKCkgJiYNCisgICAgICAgICAgcEtleS0+bV9kd0NtZCA9PSBGV0xfTVNHS0VZQ01EX0tleURvd24pIHsNCisgICAgICAgIEZYX0RXT1JEIGR3S2V5Q29kZSA9IHBLZXktPm1fZHdLZXlDb2RlOw0KKyAgICAgICAgRlhfQk9PTCBiTGlzdEtleSA9DQorICAgICAgICAgICAgZHdLZXlDb2RlID09IEZXTF9WS0VZX1VwIHx8IGR3S2V5Q29kZSA9PSBGV0xfVktFWV9Eb3duIHx8DQorICAgICAgICAgICAgZHdLZXlDb2RlID09IEZXTF9WS0VZX1JldHVybiB8fCBkd0tleUNvZGUgPT0gRldMX1ZLRVlfRXNjYXBlOw0KKyAgICAgICAgaWYgKGJMaXN0S2V5KSB7DQorICAgICAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9DQorICAgICAgICAgICAgICBtX3BPd25lci0+bV9wTGlzdEJveC0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICAgICAgICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBEaXNGb3JtX09uS2V5KHBLZXkpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQorICBpZiAoIWJhY2tEZWZhdWx0KSB7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KK30NCit2b2lkIENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZTo6RGlzRm9ybV9PbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIEZYX0JPT0wgYkRyb3BEb3duID0gbV9wT3duZXItPkRpc0Zvcm1fSXNEcm9wTGlzdFNob3dlZCgpOw0KKyAgQ0ZYX1JlY3RGJiBydEJ0biA9IGJEcm9wRG93biA/IG1fcE93bmVyLT5tX3J0QnRuIDogbV9wT3duZXItPm1fcnRDbGllbnQ7DQorICBGWF9CT09MIGJDbGlja0J0biA9IHJ0QnRuLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgaWYgKGJDbGlja0J0bikgew0KKyAgICBpZiAobV9wT3duZXItPkRpc0Zvcm1fSXNEcm9wTGlzdFNob3dlZCgpKSB7DQorICAgICAgbV9wT3duZXItPkRpc0Zvcm1fU2hvd0Ryb3BMaXN0KEZBTFNFKTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgew0KKyAgICAgIGlmIChtX3BPd25lci0+bV9wRWRpdCkgew0KKyAgICAgICAgbV9wT3duZXItPk1hdGNoRWRpdFRleHQoKTsNCisgICAgICB9DQorICAgICAgbV9wT3duZXItPkRpc0Zvcm1fU2hvd0Ryb3BMaXN0KFRSVUUpOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlOjpEaXNGb3JtX09uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSogcE1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXQpIHsNCisgIGlmIChiU2V0KSB7DQorICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9XR1RTVEFURV9Gb2N1c2VkOw0KKyAgICBpZiAoKG1fcE93bmVyLT5tX3BFZGl0LT5HZXRTdGF0ZXMoKSAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSA9PSAwKSB7DQorICAgICAgQ0ZXTF9Nc2dTZXRGb2N1cyBtc2c7DQorICAgICAgbXNnLm1fcERzdFRhcmdldCA9IG1fcE93bmVyLT5tX3BFZGl0LmdldCgpOw0KKyAgICAgIG1zZy5tX3BTcmNUYXJnZXQgPSBOVUxMOw0KKyAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9IG1fcE93bmVyLT5tX3BFZGl0LT5TZXREZWxlZ2F0ZShOVUxMKTsNCisgICAgICBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UoJm1zZyk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfV0dUU1RBVEVfRm9jdXNlZDsNCisgICAgbV9wT3duZXItPkRpc0Zvcm1fU2hvd0Ryb3BMaXN0KEZBTFNFKTsNCisgICAgQ0ZXTF9Nc2dLaWxsRm9jdXMgbXNnOw0KKyAgICBtc2cubV9wRHN0VGFyZ2V0ID0gTlVMTDsNCisgICAgbXNnLm1fcFNyY1RhcmdldCA9IG1fcE93bmVyLT5tX3BFZGl0LmdldCgpOw0KKyAgICBJRldMX1dpZGdldERlbGVnYXRlKiBwRGVsZWdhdGUgPSBtX3BPd25lci0+bV9wRWRpdC0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZSgmbXNnKTsNCisgIH0NCit9DQordm9pZCBDRldMX0NvbWJvQm94SW1wRGVsZWdhdGU6OkRpc0Zvcm1fT25LZXkoQ0ZXTF9Nc2dLZXkqIHBNc2cpIHsNCisgIEZYX0RXT1JEIGR3S2V5Q29kZSA9IHBNc2ctPm1fZHdLZXlDb2RlOw0KKyAgRlhfQk9PTCBiVXAgPSBkd0tleUNvZGUgPT0gRldMX1ZLRVlfVXA7DQorICBGWF9CT09MIGJEb3duID0gZHdLZXlDb2RlID09IEZXTF9WS0VZX0Rvd247DQorICBpZiAoYlVwIHx8IGJEb3duKSB7DQorICAgIENGV0xfQ29tYm9MaXN0SW1wKiBwQ29tYm9MaXN0ID0NCisgICAgICAgIHN0YXRpY19jYXN0PENGV0xfQ29tYm9MaXN0SW1wKj4obV9wT3duZXItPm1fcExpc3RCb3gtPkdldEltcGwoKSk7DQorICAgIGludDMyX3QgaUNvdW50ID0gcENvbWJvTGlzdC0+Q291bnRJdGVtcygpOw0KKyAgICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJNYXRjaEVxdWFsID0gRkFMU0U7DQorICAgIGludDMyX3QgaUN1clNlbCA9IG1fcE93bmVyLT5tX2lDdXJTZWw7DQorICAgIGlmIChtX3BPd25lci0+bV9wRWRpdCkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICBtX3BPd25lci0+bV9wRWRpdC0+R2V0VGV4dCh3c1RleHQpOw0KKyAgICAgIGlDdXJTZWwgPSBwQ29tYm9MaXN0LT5NYXRjaEl0ZW0od3NUZXh0KTsNCisgICAgICBpZiAoaUN1clNlbCA+PSAwKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7DQorICAgICAgICBGV0xfSExJU1RJVEVNIGl0ZW0gPSBtX3BPd25lci0+bV9wTGlzdEJveC0+R2V0U2VsSXRlbShpQ3VyU2VsKTsNCisgICAgICAgIG1fcE93bmVyLT5tX3BMaXN0Qm94LT5HZXRJdGVtVGV4dChpdGVtLCB3c1RlbXApOw0KKyAgICAgICAgYk1hdGNoRXF1YWwgPSB3c1RleHQuRXF1YWwod3NUZW1wKTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGlDdXJTZWwgPCAwKSB7DQorICAgICAgaUN1clNlbCA9IDA7DQorICAgIH0gZWxzZSBpZiAoYk1hdGNoRXF1YWwpIHsNCisgICAgICBpZiAoKGJVcCAmJiBpQ3VyU2VsID09IDApIHx8IChiRG93biAmJiBpQ3VyU2VsID09IGlDb3VudCAtIDEpKSB7DQorICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICAgIGlmIChiVXApIHsNCisgICAgICAgIGlDdXJTZWwtLTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaUN1clNlbCsrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBtX3BPd25lci0+bV9pQ3VyU2VsID0gaUN1clNlbDsNCisgICAgbV9wT3duZXItPlN5bmNockVkaXRUZXh0KG1fcE93bmVyLT5tX2lDdXJTZWwpOw0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAobV9wT3duZXItPm1fcEVkaXQpIHsNCisgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogcERlbGVnYXRlID0gbV9wT3duZXItPm1fcEVkaXQtPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgICBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1zZyk7DQorICB9DQorfQ0KK0NGV0xfQ29tYm9Qcm94eUltcERlbGVnYXRlOjpDRldMX0NvbWJvUHJveHlJbXBEZWxlZ2F0ZSgNCisgICAgSUZXTF9Gb3JtKiBwRm9ybSwNCisgICAgQ0ZXTF9Db21ib0JveEltcCogcENvbWJvQm94KQ0KKyAgICA6IG1fYkxCdXR0b25Eb3duKEZBTFNFKSwNCisgICAgICBtX2JMQnV0dG9uVXBTZWxmKEZBTFNFKSwNCisgICAgICBtX2ZTdGFydFBvcygwKSwNCisgICAgICBtX3BGb3JtKHBGb3JtKSwNCisgICAgICBtX3BDb21ib0JveChwQ29tYm9Cb3gpIHsNCit9DQoraW50MzJfdCBDRldMX0NvbWJvUHJveHlJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7DQorICBpZiAoIXBNZXNzYWdlKQ0KKyAgICByZXR1cm4gMDsNCisgIEZYX0RXT1JEIGR3TXNnQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQorICBpZiAoZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX01vdXNlKSB7DQorICAgIENGV0xfTXNnTW91c2UqIHBNc2cgPSBzdGF0aWNfY2FzdDxDRldMX01zZ01vdXNlKj4ocE1lc3NhZ2UpOw0KKyAgICBGWF9EV09SRCBkd0NtZCA9IHBNc2ctPm1fZHdDbWQ7DQorICAgIHN3aXRjaCAoZHdDbWQpIHsNCisgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjogew0KKyAgICAgICAgT25MQnV0dG9uRG93bihwTXNnKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA6IHsNCisgICAgICAgIE9uTEJ1dHRvblVwKHBNc2cpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTW92ZTogew0KKyAgICAgICAgT25Nb3VzZU1vdmUocE1zZyk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgZGVmYXVsdDoge30NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGR3TXNnQ29kZSA9PSBGV0xfTVNHSEFTSF9EZWFjdGl2YXRlKSB7DQorICAgIE9uRGVhY3RpdmUoc3RhdGljX2Nhc3Q8Q0ZXTF9Nc2dEZWFjdGl2YXRlKj4ocE1lc3NhZ2UpKTsNCisgIH0NCisgIGlmIChkd01zZ0NvZGUgPT0gRldMX01TR0hBU0hfS2lsbEZvY3VzIHx8IGR3TXNnQ29kZSA9PSBGV0xfTVNHSEFTSF9TZXRGb2N1cykgew0KKyAgICBPbkZvY3VzQ2hhbmdlZChzdGF0aWNfY2FzdDxDRldMX01zZ0tpbGxGb2N1cyo+KHBNZXNzYWdlKSwNCisgICAgICAgICAgICAgICAgICAgZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX1NldEZvY3VzKTsNCisgIH0NCisgIHJldHVybiBDRldMX1dpZGdldEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvUHJveHlJbXBEZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBtX3BDb21ib0JveC0+RHJhd1N0cmV0Y2hIYW5kbGVyKHBHcmFwaGljcywgcE1hdHJpeCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib1Byb3h5SW1wRGVsZWdhdGU6Ok9uTEJ1dHRvbkRvd24oQ0ZXTF9Nc2dNb3VzZSogcE1zZykgew0KKyAgSUZXTF9Ob3RlVGhyZWFkKiBwVGhyZWFkID0gbV9wRm9ybS0+R2V0T3duZXJUaHJlYWQoKTsNCisgIGlmICghcFRocmVhZCkNCisgICAgcmV0dXJuOw0KKyAgQ0ZXTF9Ob3RlRHJpdmVyKiBwRHJpdmVyID0NCisgICAgICBzdGF0aWNfY2FzdDxDRldMX05vdGVEcml2ZXIqPihwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCkpOw0KKyAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KKyAgbV9wRm9ybS0+R2V0V2lkZ2V0UmVjdChydFdpZGdldCk7DQorICBydFdpZGdldC5sZWZ0ID0gcnRXaWRnZXQudG9wID0gMDsNCisgIGlmIChydFdpZGdldC5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICBtX2JMQnV0dG9uRG93biA9IFRSVUU7DQorICAgIHBEcml2ZXItPlNldEdyYWIobV9wRm9ybSwgVFJVRSk7DQorICB9IGVsc2Ugew0KKyAgICBtX2JMQnV0dG9uRG93biA9IEZBTFNFOw0KKyAgICBwRHJpdmVyLT5TZXRHcmFiKG1fcEZvcm0sIEZBTFNFKTsNCisgICAgbV9wQ29tYm9Cb3gtPlNob3dEcm9wTGlzdChGQUxTRSk7DQorICAgIHJldHVybjsNCisgIH0NCisgIElGV0xfQWRhcHRlck5hdGl2ZSogcE5hdGl2ZSA9IEZXTF9HZXRBZGFwdGVyTmF0aXZlKCk7DQorICBJRldMX0FkYXB0ZXJDdXJzb3JNZ3IqIHBDdXJzb3JNZ3IgPSBwTmF0aXZlLT5HZXRDdXJzb3JNZ3IoKTsNCisgIEZXTF9IQ1VSU09SIGhDdXJzb3IgPSBwQ3Vyc29yTWdyLT5HZXRTeXN0ZW1DdXJzb3IoRldMX0NVUlNPUlRZUEVfU2l6ZU5TKTsNCisgIHBDdXJzb3JNZ3ItPlNldEN1cnNvcihoQ3Vyc29yKTsNCisgIHBDdXJzb3JNZ3ItPlNob3dDdXJzb3IoVFJVRSk7DQorICBtX3BGb3JtLT5UcmFuc2Zvcm1UbyhOVUxMLCBwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgIG1fZlN0YXJ0UG9zID0gcE1zZy0+bV9meTsNCit9DQordm9pZCBDRldMX0NvbWJvUHJveHlJbXBEZWxlZ2F0ZTo6T25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSogcE1zZykgew0KKyAgbV9iTEJ1dHRvbkRvd24gPSBGQUxTRTsNCisgIElGV0xfTm90ZVRocmVhZCogcFRocmVhZCA9IG1fcEZvcm0tPkdldE93bmVyVGhyZWFkKCk7DQorICBpZiAoIXBUaHJlYWQpDQorICAgIHJldHVybjsNCisgIENGV0xfTm90ZURyaXZlciogcERyaXZlciA9DQorICAgICAgc3RhdGljX2Nhc3Q8Q0ZXTF9Ob3RlRHJpdmVyKj4ocFRocmVhZC0+R2V0Tm90ZURyaXZlcigpKTsNCisgIHBEcml2ZXItPlNldEdyYWIobV9wRm9ybSwgRkFMU0UpOw0KKyAgaWYgKG1fYkxCdXR0b25VcFNlbGYpIHsNCisgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgIG1fcEZvcm0tPkdldFdpZGdldFJlY3QocmVjdCk7DQorICAgIHJlY3QubGVmdCA9IHJlY3QudG9wID0gMDsNCisgICAgaWYgKCFyZWN0LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpICYmDQorICAgICAgICBtX3BDb21ib0JveC0+SXNEcm9wTGlzdFNob3dlZCgpKSB7DQorICAgICAgbV9wQ29tYm9Cb3gtPlNob3dEcm9wTGlzdChGQUxTRSk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIG1fYkxCdXR0b25VcFNlbGYgPSBUUlVFOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfQ29tYm9Qcm94eUltcERlbGVnYXRlOjpPbk1vdXNlTW92ZShDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBJRldMX0FkYXB0ZXJOYXRpdmUqIHBOYXRpdmUgPSBGV0xfR2V0QWRhcHRlck5hdGl2ZSgpOw0KKyAgSUZXTF9BZGFwdGVyQ3Vyc29yTWdyKiBwQ3Vyc29yTWdyID0gcE5hdGl2ZS0+R2V0Q3Vyc29yTWdyKCk7DQorICBGV0xfQ1VSU09SVFlQRSBjdXJzb3JUeXBlID0gRldMX0NVUlNPUlRZUEVfQXJyb3c7DQorICBpZiAobV9wQ29tYm9Cb3gtPm1fcnRIYW5kbGVyLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgIGN1cnNvclR5cGUgPSBGV0xfQ1VSU09SVFlQRV9TaXplTlM7DQorICB9DQorICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKGN1cnNvclR5cGUpOw0KKyAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KKyAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgIGlmICghbV9iTEJ1dHRvbkRvd24pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV9wRm9ybS0+VHJhbnNmb3JtVG8oTlVMTCwgcE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICBGWF9GTE9BVCBmQ2hhbmdlZCA9IHBNc2ctPm1fZnkgLSBtX2ZTdGFydFBvczsNCisgIGlmIChtX3BDb21ib0JveC0+bV9iVXBGb3JtSGFuZGxlcikgew0KKyAgICBmQ2hhbmdlZCA9IG1fZlN0YXJ0UG9zIC0gcE1zZy0+bV9meTsNCisgIH0NCisgIGlmIChtX3BDb21ib0JveC0+bV9ydExpc3QuaGVpZ2h0ICsgZkNoYW5nZWQgPCBtX3BDb21ib0JveC0+bV9mSXRlbUhlaWdodCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBtX3BDb21ib0JveC0+bV9ydExpc3QuaGVpZ2h0ICs9IGZDaGFuZ2VkOw0KKyAgbV9wQ29tYm9Cb3gtPm1fcnRQcm94eS5oZWlnaHQgKz0gZkNoYW5nZWQ7DQorICBpZiAobV9wQ29tYm9Cb3gtPm1fYlVwRm9ybUhhbmRsZXIpIHsNCisgICAgbV9wQ29tYm9Cb3gtPm1fcnRQcm94eS50b3AgLT0gZkNoYW5nZWQ7DQorICAgIG1fcENvbWJvQm94LT5tX3J0SGFuZGxlci5TZXQoMCwgMCwgbV9wQ29tYm9Cb3gtPm1fcnRMaXN0LndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcENvbWJvQm94LT5tX2ZDb21ib0Zvcm1IYW5kbGVyKTsNCisgIH0gZWxzZSB7DQorICAgIG1fcENvbWJvQm94LT5tX3J0SGFuZGxlci5TZXQoMCwgbV9wQ29tYm9Cb3gtPm1fcnRMaXN0LmhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDb21ib0JveC0+bV9ydExpc3Qud2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ29tYm9Cb3gtPm1fZkNvbWJvRm9ybUhhbmRsZXIpOw0KKyAgfQ0KKyAgbV9wRm9ybS0+U2V0V2lkZ2V0UmVjdChtX3BDb21ib0JveC0+bV9ydFByb3h5KTsNCisgIG1fcENvbWJvQm94LT5tX3BMaXN0Qm94LT5TZXRXaWRnZXRSZWN0KG1fcENvbWJvQm94LT5tX3J0TGlzdCk7DQorICBtX3BDb21ib0JveC0+bV9wTGlzdEJveC0+VXBkYXRlKCk7DQorICBtX2ZTdGFydFBvcyA9IHBNc2ctPm1fZnk7DQorfQ0KK3ZvaWQgQ0ZXTF9Db21ib1Byb3h5SW1wRGVsZWdhdGU6Ok9uRGVhY3RpdmUoQ0ZXTF9Nc2dEZWFjdGl2YXRlKiBwTXNnKSB7DQorICBtX3BDb21ib0JveC0+U2hvd0Ryb3BMaXN0KEZBTFNFKTsNCit9DQordm9pZCBDRldMX0NvbWJvUHJveHlJbXBEZWxlZ2F0ZTo6T25Gb2N1c0NoYW5nZWQoQ0ZXTF9Nc2dLaWxsRm9jdXMqIHBNc2csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0KSB7DQorICBpZiAoIWJTZXQpIHsNCisgICAgaWYgKHBNc2ctPm1fcFNldEZvY3VzID09IE5VTEwpIHsNCisgICAgICBtX3BDb21ib0JveC0+U2hvd0Ryb3BMaXN0KEZBTFNFKTsNCisgICAgfQ0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfZGF0ZXRpbWVwaWNrZXJpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2RhdGV0aW1lcGlja2VyaW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2MyMTI2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2RhdGV0aW1lcGlja2VyaW1wLmNwcApAQCAtMCwwICsxLDExNjIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX25vdGVpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0aW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3BhbmVsaW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX2Zvcm1pbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0bWdyaW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2Zvcm1wcm94eWltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9lZGl0aW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX21vbnRoY2FsZW5kYXJpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfZGF0ZXRpbWVwaWNrZXJpbXAuaCINCisjZGVmaW5lIEZXTF9EVFBfV0lEVEggMTAwDQorI2RlZmluZSBGV0xfRFRQX0hFSUdIVCAyMA0KKw0KKy8vIHN0YXRpYw0KK0lGV0xfRGF0ZVRpbWVQaWNrZXIqIElGV0xfRGF0ZVRpbWVQaWNrZXI6OkNyZWF0ZSgNCisgICAgY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICBJRldMX1dpZGdldCogcE91dGVyKSB7DQorICBJRldMX0RhdGVUaW1lUGlja2VyKiBwRGF0ZVRpbWVQaWNrZXIgPSBuZXcgSUZXTF9EYXRlVGltZVBpY2tlcjsNCisgIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqIHBEYXRlVGltZVBpY2tlckltcGwgPQ0KKyAgICAgIG5ldyBDRldMX0RhdGVUaW1lUGlja2VySW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQorICBwRGF0ZVRpbWVQaWNrZXItPlNldEltcGwocERhdGVUaW1lUGlja2VySW1wbCk7DQorICBwRGF0ZVRpbWVQaWNrZXJJbXBsLT5TZXRJbnRlcmZhY2UocERhdGVUaW1lUGlja2VyKTsNCisgIHJldHVybiBwRGF0ZVRpbWVQaWNrZXI7DQorfQ0KKw0KKy8vIFN0YXRpYw0KK0lGV0xfRGF0ZVRpbWVGb3JtKiBJRldMX0RhdGVUaW1lRm9ybTo6Q3JlYXRlKA0KKyAgICBjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpIHsNCisgIElGV0xfRGF0ZVRpbWVGb3JtKiBwRGF0ZVRpbWVGb3JtID0gbmV3IElGV0xfRGF0ZVRpbWVGb3JtOw0KKyAgQ0ZXTF9Gb3JtUHJveHlJbXAqIHBGb3JtUHJveHlJbXBsID0gbmV3IENGV0xfRm9ybVByb3h5SW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQorICBwRGF0ZVRpbWVGb3JtLT5TZXRJbXBsKHBGb3JtUHJveHlJbXBsKTsNCisgIHBGb3JtUHJveHlJbXBsLT5TZXRJbnRlcmZhY2UocERhdGVUaW1lRm9ybSk7DQorICByZXR1cm4gcERhdGVUaW1lRm9ybTsNCit9DQorDQorLy8gc3RhdGljDQorSUZXTF9EYXRlVGltZUNhbGVuZGVyKiBJRldMX0RhdGVUaW1lQ2FsZW5kZXI6OkNyZWF0ZSgNCisgICAgY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICBJRldMX1dpZGdldCogcE91dGVyKSB7DQorICBJRldMX0RhdGVUaW1lQ2FsZW5kZXIqIHBEYXRlVGltZUNhbGVuZGFyID0gbmV3IElGV0xfRGF0ZVRpbWVDYWxlbmRlcjsNCisgIENGV0xfRGF0ZVRpbWVDYWxlbmRhciogcERhdGVUaW1lQ2FsZW5kYXJJbXBsID0NCisgICAgICBuZXcgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyKHByb3BlcnRpZXMsIHBPdXRlcik7DQorICBwRGF0ZVRpbWVDYWxlbmRhci0+U2V0SW1wbChwRGF0ZVRpbWVDYWxlbmRhckltcGwpOw0KKyAgcERhdGVUaW1lQ2FsZW5kYXJJbXBsLT5TZXRJbnRlcmZhY2UocERhdGVUaW1lQ2FsZW5kYXIpOw0KKyAgcmV0dXJuIHBEYXRlVGltZUNhbGVuZGFyOw0KK30NCisNCisvLyBzdGF0aWMNCitJRldMX0RhdGVUaW1lRWRpdCogSUZXTF9EYXRlVGltZUVkaXQ6OkNyZWF0ZSgNCisgICAgY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICBJRldMX1dpZGdldCogcE91dGVyKSB7DQorICBJRldMX0RhdGVUaW1lRWRpdCogcERhdGVUaW1lRWRpdCA9IG5ldyBJRldMX0RhdGVUaW1lRWRpdDsNCisgIENGV0xfRGF0ZVRpbWVFZGl0KiBwRGF0ZVRpbWVFZGl0SW1wbCA9DQorICAgICAgbmV3IENGV0xfRGF0ZVRpbWVFZGl0KHByb3BlcnRpZXMsIHBPdXRlcik7DQorICBwRGF0ZVRpbWVFZGl0LT5TZXRJbXBsKHBEYXRlVGltZUVkaXRJbXBsKTsNCisgIHBEYXRlVGltZUVkaXRJbXBsLT5TZXRJbnRlcmZhY2UocERhdGVUaW1lRWRpdCk7DQorICByZXR1cm4gcERhdGVUaW1lRWRpdDsNCit9DQorDQorSUZXTF9EYXRlVGltZVBpY2tlcjo6SUZXTF9EYXRlVGltZVBpY2tlcigpIHsNCit9DQoraW50MzJfdCBJRldMX0RhdGVUaW1lUGlja2VyOjpDb3VudFNlbFJhbmdlcygpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0RhdGVUaW1lUGlja2VySW1wKj4oR2V0SW1wbCgpKQ0KKyAgICAgIC0+R2V0RGF0YVRpbWVFZGl0KCkNCisgICAgICAtPkNvdW50U2VsUmFuZ2VzKCk7DQorfQ0KK2ludDMyX3QgSUZXTF9EYXRlVGltZVBpY2tlcjo6R2V0U2VsUmFuZ2UoaW50MzJfdCBuSW5kZXgsIGludDMyX3QmIG5TdGFydCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqPihHZXRJbXBsKCkpDQorICAgICAgLT5HZXREYXRhVGltZUVkaXQoKQ0KKyAgICAgIC0+R2V0U2VsUmFuZ2UobkluZGV4LCBuU3RhcnQpOw0KK30NCitGV0xfRVJSIElGV0xfRGF0ZVRpbWVQaWNrZXI6OkdldEN1clNlbChpbnQzMl90JiBpWWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaURheSkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqPihHZXRJbXBsKCkpDQorICAgICAgLT5HZXRDdXJTZWwoaVllYXIsIGlNb250aCwgaURheSk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9EYXRlVGltZVBpY2tlcjo6U2V0Q3VyU2VsKGludDMyX3QgaVllYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGF5KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9EYXRlVGltZVBpY2tlckltcCo+KEdldEltcGwoKSkNCisgICAgICAtPlNldEN1clNlbChpWWVhciwgaU1vbnRoLCBpRGF5KTsNCit9DQorRldMX0VSUiBJRldMX0RhdGVUaW1lUGlja2VyOjpTZXRFZGl0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9EYXRlVGltZVBpY2tlckltcCo+KEdldEltcGwoKSktPlNldEVkaXRUZXh0KHdzVGV4dCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9EYXRlVGltZVBpY2tlcjo6R2V0RWRpdFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQpIGNvbnN0IHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0RhdGVUaW1lUGlja2VySW1wKj4oR2V0SW1wbCgpKQ0KKyAgICAgIC0+R2V0RWRpdFRleHQod3NUZXh0LCBuU3RhcnQsIG5Db3VudCk7DQorfQ0KK0ZYX0JPT0wgSUZXTF9EYXRlVGltZVBpY2tlcjo6Q2FuVW5kbygpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0RhdGVUaW1lUGlja2VySW1wKj4oR2V0SW1wbCgpKS0+Q2FuVW5kbygpOw0KK30NCitGWF9CT09MIElGV0xfRGF0ZVRpbWVQaWNrZXI6OkNhblJlZG8oKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9EYXRlVGltZVBpY2tlckltcCo+KEdldEltcGwoKSktPkNhblJlZG8oKTsNCit9DQorRlhfQk9PTCBJRldMX0RhdGVUaW1lUGlja2VyOjpVbmRvKCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqPihHZXRJbXBsKCkpLT5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wgSUZXTF9EYXRlVGltZVBpY2tlcjo6UmVkbygpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0RhdGVUaW1lUGlja2VySW1wKj4oR2V0SW1wbCgpKS0+UmVkbygpOw0KK30NCitGWF9CT09MIElGV0xfRGF0ZVRpbWVQaWNrZXI6OkNhbkNvcHkoKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9EYXRlVGltZVBpY2tlckltcCo+KEdldEltcGwoKSktPkNhbkNvcHkoKTsNCit9DQorRlhfQk9PTCBJRldMX0RhdGVUaW1lUGlja2VyOjpDYW5DdXQoKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9EYXRlVGltZVBpY2tlckltcCo+KEdldEltcGwoKSktPkNhbkN1dCgpOw0KK30NCitGWF9CT09MIElGV0xfRGF0ZVRpbWVQaWNrZXI6OkNhblNlbGVjdEFsbCgpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0RhdGVUaW1lUGlja2VySW1wKj4oR2V0SW1wbCgpKS0+Q2FuU2VsZWN0QWxsKCk7DQorfQ0KK0ZYX0JPT0wgSUZXTF9EYXRlVGltZVBpY2tlcjo6Q29weShDRlhfV2lkZVN0cmluZyYgd3NDb3B5KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9EYXRlVGltZVBpY2tlckltcCo+KEdldEltcGwoKSktPkNvcHkod3NDb3B5KTsNCit9DQorRlhfQk9PTCBJRldMX0RhdGVUaW1lUGlja2VyOjpDdXQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ3V0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9EYXRlVGltZVBpY2tlckltcCo+KEdldEltcGwoKSktPkN1dCh3c0N1dCk7DQorfQ0KK0ZYX0JPT0wgSUZXTF9EYXRlVGltZVBpY2tlcjo6UGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGFzdGUpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0RhdGVUaW1lUGlja2VySW1wKj4oR2V0SW1wbCgpKS0+UGFzdGUod3NQYXN0ZSk7DQorfQ0KK0ZYX0JPT0wgSUZXTF9EYXRlVGltZVBpY2tlcjo6U2VsZWN0QWxsKCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqPihHZXRJbXBsKCkpLT5TZWxlY3RBbGwoKTsNCit9DQorRlhfQk9PTCBJRldMX0RhdGVUaW1lUGlja2VyOjpEZWxldGUoKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9EYXRlVGltZVBpY2tlckltcCo+KEdldEltcGwoKSktPkRlbGV0ZSgpOw0KK30NCitGWF9CT09MIElGV0xfRGF0ZVRpbWVQaWNrZXI6OkRlU2VsZWN0KCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqPihHZXRJbXBsKCkpLT5EZVNlbGVjdCgpOw0KK30NCitGV0xfRVJSIElGV0xfRGF0ZVRpbWVQaWNrZXI6OkdldEJCb3goQ0ZYX1JlY3RGJiByZWN0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9EYXRlVGltZVBpY2tlckltcCo+KEdldEltcGwoKSktPkdldEJCb3gocmVjdCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9EYXRlVGltZVBpY2tlcjo6U2V0RWRpdExpbWl0KGludDMyX3QgbkxpbWl0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9EYXRlVGltZVBpY2tlckltcCo+KEdldEltcGwoKSktPlNldEVkaXRMaW1pdChuTGltaXQpOw0KK30NCitGV0xfRVJSIElGV0xfRGF0ZVRpbWVQaWNrZXI6Ok1vZGlmeUVkaXRTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0RhdGVUaW1lUGlja2VySW1wKj4oR2V0SW1wbCgpKQ0KKyAgICAgIC0+TW9kaWZ5RWRpdFN0eWxlc0V4KGR3U3R5bGVzRXhBZGRlZCwgZHdTdHlsZXNFeFJlbW92ZWQpOw0KK30NCitDRldMX0RhdGVUaW1lRWRpdDo6Q0ZXTF9EYXRlVGltZUVkaXQoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKQ0KKyAgICA6IENGV0xfRWRpdEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpIHt9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lRWRpdDo6SW5pdGlhbGl6ZSgpIHsNCisgIG1fcERlbGVnYXRlID0gbmV3IENGV0xfRGF0ZVRpbWVFZGl0SW1wRGVsZWdhdGUodGhpcyk7DQorICBpZiAoQ0ZXTF9FZGl0SW1wOjpJbml0aWFsaXplKCkgIT0gRldMX0VSUl9TdWNjZWVkZWQpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZUVkaXQ6OkZpbmFsaXplKCkgew0KKyAgZGVsZXRlIG1fcERlbGVnYXRlOw0KKyAgbV9wRGVsZWdhdGUgPSBudWxscHRyOw0KKyAgcmV0dXJuIENGV0xfRWRpdEltcDo6RmluYWxpemUoKTsNCit9DQorQ0ZXTF9EYXRlVGltZUVkaXRJbXBEZWxlZ2F0ZTo6Q0ZXTF9EYXRlVGltZUVkaXRJbXBEZWxlZ2F0ZSgNCisgICAgQ0ZXTF9EYXRlVGltZUVkaXQqIHBPd25lcikNCisgICAgOiBDRldMX0VkaXRJbXBEZWxlZ2F0ZShwT3duZXIpLCBtX3BPd25lcihwT3duZXIpIHsNCit9DQoraW50MzJfdCBDRldMX0RhdGVUaW1lRWRpdEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsNCisgIGlmIChtX3BPd25lci0+bV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgIHJldHVybiBEaXNGb3JtX09uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KKyAgfQ0KKyAgRlhfRFdPUkQgZHdIYXNoQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQorICBpZiAoZHdIYXNoQ29kZSA9PSBGV0xfTVNHSEFTSF9TZXRGb2N1cyB8fA0KKyAgICAgIGR3SGFzaENvZGUgPT0gRldMX01TR0hBU0hfS2lsbEZvY3VzKSB7DQorICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBtX3BPd25lci0+R2V0T3V0ZXIoKTsNCisgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogcERlbGVnYXRlID0gcE91dGVyLT5TZXREZWxlZ2F0ZShOVUxMKTsNCisgICAgcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCisgIH0NCisgIHJldHVybiAxOw0KK30NCitpbnQzMl90IENGV0xfRGF0ZVRpbWVFZGl0SW1wRGVsZWdhdGU6OkRpc0Zvcm1fT25Qcm9jZXNzTWVzc2FnZSgNCisgICAgQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgRlhfRFdPUkQgZHdIYXNoQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQorICBpZiAobV9wT3duZXItPm1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICBpZiAoZHdIYXNoQ29kZSA9PSBGV0xfTVNHSEFTSF9Nb3VzZSkgew0KKyAgICAgIENGV0xfTXNnTW91c2UqIHBNb3VzZSA9IHN0YXRpY19jYXN0PENGV0xfTXNnTW91c2UqPihwTWVzc2FnZSk7DQorICAgICAgaWYgKHBNb3VzZS0+bV9kd0NtZCA9PSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRvd24gfHwNCisgICAgICAgICAgcE1vdXNlLT5tX2R3Q21kID09IEZXTF9NU0dNT1VTRUNNRF9SQnV0dG9uRG93bikgew0KKyAgICAgICAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSA9PSAwKSB7DQorICAgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9XR1RTVEFURV9Gb2N1c2VkOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZXTF9EYXRlVGltZVBpY2tlckltcCogcERhdGVUaW1lID0NCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxDRldMX0RhdGVUaW1lUGlja2VySW1wKj4obV9wT3duZXItPm1fcE91dGVyLT5HZXRJbXBsKCkpOw0KKyAgICAgICAgaWYgKHBEYXRlVGltZS0+SXNNb250aENhbGVuZGFyU2hvd2VkKCkpIHsNCisgICAgICAgICAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZTsNCisgICAgICAgICAgcERhdGVUaW1lLT5HZXRXaWRnZXRSZWN0KHJ0SW52YWxpZGF0ZSk7DQorICAgICAgICAgIHBEYXRlVGltZS0+U2hvd01vbnRoQ2FsZW5kYXIoRkFMU0UpOw0KKyAgICAgICAgICBydEludmFsaWRhdGUuT2Zmc2V0KC1ydEludmFsaWRhdGUubGVmdCwgLXJ0SW52YWxpZGF0ZS50b3ApOw0KKyAgICAgICAgICBwRGF0ZVRpbWUtPlJlcGFpbnQoJnJ0SW52YWxpZGF0ZSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGR3SGFzaENvZGUgPT0gRldMX01TR0hBU0hfS2V5KSB7DQorICAgICAgcmV0dXJuIENGV0xfRWRpdEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfRWRpdEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCit9DQorQ0ZXTF9EYXRlVGltZUNhbGVuZGFyOjpDRldMX0RhdGVUaW1lQ2FsZW5kYXIoDQorICAgIGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikNCisgICAgOiBDRldMX01vbnRoQ2FsZW5kYXJJbXAocHJvcGVydGllcywgcE91dGVyKSB7fQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyOjpJbml0aWFsaXplKCkgew0KKyAgaWYgKENGV0xfTW9udGhDYWxlbmRhckltcDo6SW5pdGlhbGl6ZSgpICE9IEZXTF9FUlJfU3VjY2VlZGVkKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgZGVsZXRlIG1fcERlbGVnYXRlOw0KKyAgbV9wRGVsZWdhdGUgPSBuZXcgQ0ZXTF9EYXRlVGltZUNhbGVuZGFySW1wRGVsZWdhdGUodGhpcyk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyOjpGaW5hbGl6ZSgpIHsNCisgIGRlbGV0ZSBtX3BEZWxlZ2F0ZTsNCisgIG1fcERlbGVnYXRlID0gbnVsbHB0cjsNCisgIHJldHVybiBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkZpbmFsaXplKCk7DQorfQ0KK0NGV0xfRGF0ZVRpbWVDYWxlbmRhckltcERlbGVnYXRlOjpDRldMX0RhdGVUaW1lQ2FsZW5kYXJJbXBEZWxlZ2F0ZSgNCisgICAgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyKiBwT3duZXIpDQorICAgIDogQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGUocE93bmVyKSwgbV9wT3duZXIocE93bmVyKSB7DQorICBtX2JGbGFnID0gRkFMU0U7DQorfQ0KK2ludDMyX3QgQ0ZXTF9EYXRlVGltZUNhbGVuZGFySW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoDQorICAgIENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsNCisgIEZYX0RXT1JEIGR3Q29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQorICBpZiAoZHdDb2RlID09IEZXTF9NU0dIQVNIX1NldEZvY3VzIHx8IGR3Q29kZSA9PSBGV0xfTVNHSEFTSF9LaWxsRm9jdXMpIHsNCisgICAgSUZXTF9XaWRnZXQqIHBPdXRlciA9IG1fcE93bmVyLT5HZXRPdXRlcigpOw0KKyAgICBJRldMX1dpZGdldERlbGVnYXRlKiBwRGVsZWdhdGUgPSBwT3V0ZXItPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgICByZXR1cm4gcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCisgIH0gZWxzZSBpZiAoZHdDb2RlID09IEZXTF9NU0dIQVNIX01vdXNlKSB7DQorICAgIENGV0xfTXNnTW91c2UqIHBNc2cgPSBzdGF0aWNfY2FzdDxDRldMX01zZ01vdXNlKj4ocE1lc3NhZ2UpOw0KKyAgICBpZiAocE1zZy0+bV9kd0NtZCA9PSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRvd24pIHsNCisgICAgICBPbkxCdXR0b25Eb3duRXgocE1zZyk7DQorICAgICAgcmV0dXJuIDE7DQorICAgIH0gZWxzZSBpZiAocE1zZy0+bV9kd0NtZCA9PSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvblVwKSB7DQorICAgICAgT25MQnV0dG9uVXBFeChwTXNnKTsNCisgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCit9DQordm9pZCBDRldMX0RhdGVUaW1lQ2FsZW5kYXJJbXBEZWxlZ2F0ZTo6T25MQnV0dG9uRG93bkV4KENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmIChtX3BPd25lci0+bV9ydExCdG4uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgbV9wT3duZXItPm1faUxCdG5QYXJ0U3RhdGVzID0gRldMX1BBUlRTVEFURV9NQ0RfUHJlc3NlZDsNCisgICAgbV9wT3duZXItPlByZXZNb250aCgpOw0KKyAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KKyAgfSBlbHNlIGlmIChtX3BPd25lci0+bV9ydFJCdG4uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgbV9wT3duZXItPm1faVJCdG5QYXJ0U3RhdGVzIHw9IEZXTF9QQVJUU1RBVEVfTUNEX1ByZXNzZWQ7DQorICAgIG1fcE93bmVyLT5OZXh0TW9udGgoKTsNCisgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCisgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fcnRUb2RheS5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX01DRF9Ob1RvZGF5KSA9PQ0KKyAgICAgICAgMCkgew0KKyAgICAgIG1fcE93bmVyLT5KdW1wVG9Ub2RheSgpOw0KKyAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIElGV0xfRGF0ZVRpbWVQaWNrZXIqIHBJUGlja2VyID0NCisgICAgICAgIHN0YXRpY19jYXN0PElGV0xfRGF0ZVRpbWVQaWNrZXIqPihtX3BPd25lci0+bV9wT3V0ZXIpOw0KKyAgICBDRldMX0RhdGVUaW1lUGlja2VySW1wKiBwUGlja2VyID0NCisgICAgICAgIHN0YXRpY19jYXN0PENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqPihwSVBpY2tlci0+R2V0SW1wbCgpKTsNCisgICAgaWYgKHBQaWNrZXItPklzTW9udGhDYWxlbmRhclNob3dlZCgpKSB7DQorICAgICAgbV9iRmxhZyA9IDE7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDRldMX0RhdGVUaW1lQ2FsZW5kYXJJbXBEZWxlZ2F0ZTo6T25MQnV0dG9uVXBFeChDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBpZiAobV9wT3duZXItPm1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICByZXR1cm4gRGlzRm9ybV9PbkxCdXR0b25VcEV4KHBNc2cpOw0KKyAgfQ0KKyAgaWYgKG1fcE93bmVyLT5tX3J0TEJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICBtX3BPd25lci0+bV9pTEJ0blBhcnRTdGF0ZXMgPSAwOw0KKyAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRMQnRuKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1fcE93bmVyLT5tX3J0UkJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICBtX3BPd25lci0+bV9pUkJ0blBhcnRTdGF0ZXMgPSAwOw0KKyAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRSQnRuKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1fcE93bmVyLT5tX3J0VG9kYXkuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpT2xkU2VsID0gMDsNCisgIGlmIChtX3BPd25lci0+bV9hcnJTZWxEYXlzLkdldFNpemUoKSA+IDApIHsNCisgICAgaU9sZFNlbCA9IG1fcE93bmVyLT5tX2FyclNlbERheXNbMF07DQorICB9DQorICBpbnQzMl90IGlDdXJTZWwgPSBtX3BPd25lci0+R2V0RGF5QXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgIENGWF9SZWN0RiBydDsNCisgIElGV0xfRGF0ZVRpbWVQaWNrZXIqIHBJUGlja2VyID0NCisgICAgICBzdGF0aWNfY2FzdDxJRldMX0RhdGVUaW1lUGlja2VyKj4obV9wT3duZXItPm1fcE91dGVyKTsNCisgIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqIHBQaWNrZXIgPQ0KKyAgICAgIHN0YXRpY19jYXN0PENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqPihwSVBpY2tlci0+R2V0SW1wbCgpKTsNCisgIHBQaWNrZXItPm1fcEZvcm0tPkdldFdpZGdldFJlY3QocnQpOw0KKyAgcnQuU2V0KDAsIDAsIHJ0LndpZHRoLCBydC5oZWlnaHQpOw0KKyAgaWYgKGlDdXJTZWwgPiAwKSB7DQorICAgIExQREFURUlORk8gbHBEYXRlc0luZm8gPQ0KKyAgICAgICAgKExQREFURUlORk8pbV9wT3duZXItPm1fYXJyRGF0ZXMuR2V0QXQoaUN1clNlbCAtIDEpOw0KKyAgICBDRlhfUmVjdEYgcnRJbnZhbGlkYXRlKGxwRGF0ZXNJbmZvLT5yZWN0KTsNCisgICAgaWYgKGlPbGRTZWwgPiAwICYmIGlPbGRTZWwgPD0gbV9wT3duZXItPm1fYXJyRGF0ZXMuR2V0U2l6ZSgpKSB7DQorICAgICAgbHBEYXRlc0luZm8gPSAoTFBEQVRFSU5GTyltX3BPd25lci0+bV9hcnJEYXRlcy5HZXRBdChpT2xkU2VsIC0gMSk7DQorICAgICAgcnRJbnZhbGlkYXRlLlVuaW9uKGxwRGF0ZXNJbmZvLT5yZWN0KTsNCisgICAgfQ0KKyAgICBtX3BPd25lci0+QWRkU2VsRGF5KGlDdXJTZWwpOw0KKyAgICBpZiAoIW1fcE93bmVyLT5tX3BPdXRlcikNCisgICAgICByZXR1cm47DQorICAgIHBQaWNrZXItPlByb2Nlc3NTZWxDaGFuZ2VkKG1fcE93bmVyLT5tX2lDdXJZZWFyLCBtX3BPd25lci0+bV9pQ3VyTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDdXJTZWwpOw0KKyAgICBwUGlja2VyLT5TaG93TW9udGhDYWxlbmRhcihGQUxTRSk7DQorICB9IGVsc2UgaWYgKG1fYkZsYWcgJiYgKCFydC5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkpIHsNCisgICAgSUZXTF9EYXRlVGltZVBpY2tlciogcElQaWNrZXIgPQ0KKyAgICAgICAgc3RhdGljX2Nhc3Q8SUZXTF9EYXRlVGltZVBpY2tlcio+KG1fcE93bmVyLT5tX3BPdXRlcik7DQorICAgIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqIHBQaWNrZXIgPQ0KKyAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZXTF9EYXRlVGltZVBpY2tlckltcCo+KHBJUGlja2VyLT5HZXRJbXBsKCkpOw0KKyAgICBwUGlja2VyLT5TaG93TW9udGhDYWxlbmRhcihGQUxTRSk7DQorICB9DQorICBtX2JGbGFnID0gMDsNCit9DQordm9pZCBDRldMX0RhdGVUaW1lQ2FsZW5kYXJJbXBEZWxlZ2F0ZTo6T25Nb3VzZU1vdmVFeChDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTUNEX011bHRpU2VsZWN0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0JPT0wgYlJlcGFpbnQgPSBGQUxTRTsNCisgIENGWF9SZWN0RiBydEludmFsaWRhdGU7DQorICBydEludmFsaWRhdGUuU2V0KDAsIDAsIDAsIDApOw0KKyAgaWYgKG1fcE93bmVyLT5tX3J0RGF0ZXMuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgaW50MzJfdCBpSG92ZXIgPSBtX3BPd25lci0+R2V0RGF5QXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgICAgYlJlcGFpbnQgPSBtX3BPd25lci0+bV9pSG92ZXJlZCAhPSBpSG92ZXI7DQorICAgIGlmIChiUmVwYWludCkgew0KKyAgICAgIGlmIChtX3BPd25lci0+bV9pSG92ZXJlZCA+IDApIHsNCisgICAgICAgIG1fcE93bmVyLT5HZXREYXlSZWN0KG1fcE93bmVyLT5tX2lIb3ZlcmVkLCBydEludmFsaWRhdGUpOw0KKyAgICAgIH0NCisgICAgICBpZiAoaUhvdmVyID4gMCkgew0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0RGF5Ow0KKyAgICAgICAgbV9wT3duZXItPkdldERheVJlY3QoaUhvdmVyLCBydERheSk7DQorICAgICAgICBpZiAocnRJbnZhbGlkYXRlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICBydEludmFsaWRhdGUgPSBydERheTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJ0SW52YWxpZGF0ZS5VbmlvbihydERheSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIG1fcE93bmVyLT5tX2lIb3ZlcmVkID0gaUhvdmVyOw0KKyAgICBDRldMX0V2ZW50X0R0cEhvdmVyQ2hhbmdlZCBldjsNCisgICAgZXYuaG92ZXJkYXkgPSBpSG92ZXI7DQorICAgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZldik7DQorICB9IGVsc2Ugew0KKyAgICBiUmVwYWludCA9IG1fcE93bmVyLT5tX2lIb3ZlcmVkID4gMDsNCisgICAgaWYgKGJSZXBhaW50KSB7DQorICAgICAgbV9wT3duZXItPkdldERheVJlY3QobV9wT3duZXItPm1faUhvdmVyZWQsIHJ0SW52YWxpZGF0ZSk7DQorICAgIH0NCisgICAgbV9wT3duZXItPm1faUhvdmVyZWQgPSAtMTsNCisgIH0NCisgIGlmIChiUmVwYWludCAmJiAhcnRJbnZhbGlkYXRlLklzRW1wdHkoKSkgew0KKyAgICBtX3BPd25lci0+UmVwYWludCgmcnRJbnZhbGlkYXRlKTsNCisgIH0NCit9DQoraW50MzJfdCBDRldMX0RhdGVUaW1lQ2FsZW5kYXJJbXBEZWxlZ2F0ZTo6RGlzRm9ybV9PblByb2Nlc3NNZXNzYWdlKA0KKyAgICBDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7DQorICBpZiAocE1lc3NhZ2UtPkdldENsYXNzSUQoKSA9PSBGV0xfTVNHSEFTSF9Nb3VzZSkgew0KKyAgICBDRldMX01zZ01vdXNlKiBwTXNnID0gc3RhdGljX2Nhc3Q8Q0ZXTF9Nc2dNb3VzZSo+KHBNZXNzYWdlKTsNCisgICAgaWYgKHBNc2ctPm1fZHdDbWQgPT0gRldMX01TR01PVVNFQ01EX0xCdXR0b25VcCkgew0KKyAgICAgIERpc0Zvcm1fT25MQnV0dG9uVXBFeChwTXNnKTsNCisgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCit9DQordm9pZCBDRldMX0RhdGVUaW1lQ2FsZW5kYXJJbXBEZWxlZ2F0ZTo6RGlzRm9ybV9PbkxCdXR0b25VcEV4KA0KKyAgICBDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBpZiAobV9wT3duZXItPm1fcnRMQnRuLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgIG1fcE93bmVyLT5tX2lMQnRuUGFydFN0YXRlcyA9IDA7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCYobV9wT3duZXItPm1fcnRMQnRuKSk7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChtX3BPd25lci0+bV9ydFJCdG4uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgbV9wT3duZXItPm1faVJCdG5QYXJ0U3RhdGVzID0gMDsNCisgICAgbV9wT3duZXItPlJlcGFpbnQoJihtX3BPd25lci0+bV9ydFJCdG4pKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1fcE93bmVyLT5tX3J0VG9kYXkuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpT2xkU2VsID0gMDsNCisgIGlmIChtX3BPd25lci0+bV9hcnJTZWxEYXlzLkdldFNpemUoKSA+IDApIHsNCisgICAgaU9sZFNlbCA9IG1fcE93bmVyLT5tX2FyclNlbERheXNbMF07DQorICB9DQorICBpbnQzMl90IGlDdXJTZWwgPSBtX3BPd25lci0+R2V0RGF5QXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgIGlmIChpQ3VyU2VsID4gMCkgew0KKyAgICBMUERBVEVJTkZPIGxwRGF0ZXNJbmZvID0NCisgICAgICAgIChMUERBVEVJTkZPKW1fcE93bmVyLT5tX2FyckRhdGVzLkdldEF0KGlDdXJTZWwgLSAxKTsNCisgICAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZShscERhdGVzSW5mby0+cmVjdCk7DQorICAgIGlmIChpT2xkU2VsID4gMCAmJiBpT2xkU2VsIDw9IG1fcE93bmVyLT5tX2FyckRhdGVzLkdldFNpemUoKSkgew0KKyAgICAgIGxwRGF0ZXNJbmZvID0gKExQREFURUlORk8pbV9wT3duZXItPm1fYXJyRGF0ZXMuR2V0QXQoaU9sZFNlbCAtIDEpOw0KKyAgICAgIHJ0SW52YWxpZGF0ZS5VbmlvbihscERhdGVzSW5mby0+cmVjdCk7DQorICAgIH0NCisgICAgbV9wT3duZXItPkFkZFNlbERheShpQ3VyU2VsKTsNCisgICAgQ0ZXTF9EYXRlVGltZVBpY2tlckltcCogcERhdGVUaW1lID0NCisgICAgICAgIHN0YXRpY19jYXN0PENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAqPihtX3BPd25lci0+bV9wT3V0ZXItPkdldEltcGwoKSk7DQorICAgIHBEYXRlVGltZS0+UHJvY2Vzc1NlbENoYW5nZWQobV9wT3duZXItPm1faUN1clllYXIsIG1fcE93bmVyLT5tX2lDdXJNb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ3VyU2VsKTsNCisgICAgcERhdGVUaW1lLT5TaG93TW9udGhDYWxlbmRhcihGQUxTRSk7DQorICB9DQorfQ0KK0NGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkNGV0xfRGF0ZVRpbWVQaWNrZXJJbXAoDQorICAgIGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikNCisgICAgOiBDRldMX1dpZGdldEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpLA0KKyAgICAgIG1faUJ0blN0YXRlKDEpLA0KKyAgICAgIG1faVllYXIoLTEpLA0KKyAgICAgIG1faU1vbnRoKC0xKSwNCisgICAgICBtX2lEYXkoLTEpLA0KKyAgICAgIG1fYkxCdG5Eb3duKEZBTFNFKSwNCisgICAgICBtX3BFZGl0KG51bGxwdHIpLA0KKyAgICAgIG1fcE1vbnRoQ2FsKG51bGxwdHIpLA0KKyAgICAgIG1fcEZvcm0obnVsbHB0cikgew0KKyAgbV9ydEJ0bi5TZXQoMCwgMCwgMCwgMCk7DQorfQ0KK0NGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6On5DRldMX0RhdGVUaW1lUGlja2VySW1wKCkgew0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Qgew0KKyAgd3NDbGFzcyA9IEZXTF9DTEFTU19EYXRlVGltZVBpY2tlcjsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6R2V0Q2xhc3NJRCgpIGNvbnN0IHsNCisgIHJldHVybiBGV0xfQ0xBU1NIQVNIX0RhdGVUaW1lUGlja2VyOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkluaXRpYWxpemUoKSB7DQorICBpZiAoQ0ZXTF9XaWRnZXRJbXA6OkluaXRpYWxpemUoKSAhPSBGV0xfRVJSX1N1Y2NlZWRlZCkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIG1fcERlbGVnYXRlID0gbmV3IENGV0xfRGF0ZVRpbWVQaWNrZXJJbXBEZWxlZ2F0ZSh0aGlzKTsNCisgIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgPSBGV0xfU1RZTEVFWFRfRFRQX1Nob3J0RGF0ZUZvcm1hdDsNCisgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wTW9udGg7DQorICBwcm9wTW9udGgubV9kd1N0eWxlcyA9IEZXTF9XR1RTVFlMRV9Qb3B1cCB8IEZXTF9XR1RTVFlMRV9Cb3JkZXI7DQorICBwcm9wTW9udGgubV9kd1N0YXRlcyA9IEZXTF9XR1RTVEFURV9JbnZpc2libGU7DQorICBwcm9wTW9udGgubV9wRGF0YVByb3ZpZGVyID0gJm1fTW9udGhDYWxlbmRhckRQOw0KKyAgcHJvcE1vbnRoLm1fcFBhcmVudCA9IG1fcEludGVyZmFjZTsNCisgIHByb3BNb250aC5tX3BUaGVtZVByb3ZpZGVyID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgIG1fcE1vbnRoQ2FsLnJlc2V0KElGV0xfRGF0ZVRpbWVDYWxlbmRlcjo6Q3JlYXRlKHByb3BNb250aCwgbV9wSW50ZXJmYWNlKSk7DQorICBtX3BNb250aENhbC0+SW5pdGlhbGl6ZSgpOw0KKyAgQ0ZYX1JlY3RGIHJ0TW9udGhDYWw7DQorICBtX3BNb250aENhbC0+R2V0V2lkZ2V0UmVjdChydE1vbnRoQ2FsLCBUUlVFKTsNCisgIHJ0TW9udGhDYWwuU2V0KDAsIDAsIHJ0TW9udGhDYWwud2lkdGgsIHJ0TW9udGhDYWwuaGVpZ2h0KTsNCisgIG1fcE1vbnRoQ2FsLT5TZXRXaWRnZXRSZWN0KHJ0TW9udGhDYWwpOw0KKyAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3BFZGl0Ow0KKyAgcHJvcEVkaXQubV9wUGFyZW50ID0gbV9wSW50ZXJmYWNlOw0KKyAgcHJvcEVkaXQubV9wVGhlbWVQcm92aWRlciA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICBtX3BFZGl0LnJlc2V0KElGV0xfRGF0ZVRpbWVFZGl0OjpDcmVhdGUocHJvcEVkaXQsIG1fcEludGVyZmFjZSkpOw0KKyAgbV9wRWRpdC0+SW5pdGlhbGl6ZSgpOw0KKyAgUmVnaXN0ZXJFdmVudFRhcmdldChtX3BNb250aENhbC5nZXQoKSk7DQorICBSZWdpc3RlckV2ZW50VGFyZ2V0KG1fcEVkaXQuZ2V0KCkpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkZpbmFsaXplKCkgew0KKyAgaWYgKG1fcEVkaXQpIHsNCisgICAgbV9wRWRpdC0+RmluYWxpemUoKTsNCisgIH0NCisgIGlmIChtX3BNb250aENhbCkgew0KKyAgICBtX3BNb250aENhbC0+RmluYWxpemUoKTsNCisgIH0NCisgIGlmIChtX3BGb3JtKSB7DQorICAgIG1fcEZvcm0tPkZpbmFsaXplKCk7DQorICB9DQorICBVbnJlZ2lzdGVyRXZlbnRUYXJnZXQoKTsNCisgIGRlbGV0ZSBtX3BEZWxlZ2F0ZTsNCisgIG1fcERlbGVnYXRlID0gbnVsbHB0cjsNCisgIHJldHVybiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKTsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQXV0b1NpemUpIHsNCisgIGlmIChtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgcmV0dXJuIERpc0Zvcm1fR2V0V2lkZ2V0UmVjdChyZWN0LCBiQXV0b1NpemUpOw0KKyAgfQ0KKyAgaWYgKGJBdXRvU2l6ZSkgew0KKyAgICByZWN0LlNldCgwLCAwLCBGV0xfRFRQX1dJRFRILCBGV0xfRFRQX0hFSUdIVCk7DQorICAgIENGV0xfV2lkZ2V0SW1wOjpHZXRXaWRnZXRSZWN0KHJlY3QsIFRSVUUpOw0KKyAgfSBlbHNlIHsNCisgICAgcmVjdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6VXBkYXRlKCkgew0KKyAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICByZXR1cm4gRGlzRm9ybV9VcGRhdGUoKTsNCisgIH0NCisgIGlmIChtX2lMb2NrKSB7DQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICB9DQorICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpIHsNCisgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICB9DQorICBtX3BFZGl0LT5TZXRUaGVtZVByb3ZpZGVyKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpOw0KKyAgR2V0Q2xpZW50UmVjdChtX3J0Q2xpZW50KTsNCisgIEZYX0ZMT0FUKiBwRldpZHRoID0NCisgICAgICBzdGF0aWNfY2FzdDxGWF9GTE9BVCo+KEdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX1Njcm9sbEJhcldpZHRoKSk7DQorICBpZiAoIXBGV2lkdGgpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBGWF9GTE9BVCBmQnRuID0gKnBGV2lkdGg7DQorICBtX3J0QnRuLlNldChtX3J0Q2xpZW50LnJpZ2h0KCkgLSBmQnRuLCBtX3J0Q2xpZW50LnRvcCwgZkJ0biAtIDEsDQorICAgICAgICAgICAgICBtX3J0Q2xpZW50LmhlaWdodCAtIDEpOw0KKyAgQ0ZYX1JlY3RGIHJ0RWRpdDsNCisgIHJ0RWRpdC5TZXQobV9ydENsaWVudC5sZWZ0LCBtX3J0Q2xpZW50LnRvcCwgbV9ydENsaWVudC53aWR0aCAtIGZCdG4sDQorICAgICAgICAgICAgIG1fcnRDbGllbnQuaGVpZ2h0KTsNCisgIG1fcEVkaXQtPlNldFdpZGdldFJlY3QocnRFZGl0KTsNCisgIFJlU2V0RWRpdEFsaWdubWVudCgpOw0KKyAgbV9wRWRpdC0+VXBkYXRlKCk7DQorICBpZiAoIShtX3BNb250aENhbC0+R2V0VGhlbWVQcm92aWRlcigpKSkgew0KKyAgICBtX3BNb250aENhbC0+U2V0VGhlbWVQcm92aWRlcihtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKTsNCisgIH0NCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpIHsNCisgICAgSUZXTF9EYXRlVGltZVBpY2tlckRQKiBwRGF0YSA9DQorICAgICAgICBzdGF0aWNfY2FzdDxJRldMX0RhdGVUaW1lUGlja2VyRFAqPihtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgICBwRGF0YS0+R2V0VG9kYXkobV9wSW50ZXJmYWNlLCBtX01vbnRoQ2FsZW5kYXJEUC5tX2lDdXJZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgbV9Nb250aENhbGVuZGFyRFAubV9pQ3VyTW9udGgsIG1fTW9udGhDYWxlbmRhckRQLm1faUN1ckRheSk7DQorICB9DQorICBDRlhfUmVjdEYgcnRNb250aENhbDsNCisgIG1fcE1vbnRoQ2FsLT5HZXRXaWRnZXRSZWN0KHJ0TW9udGhDYWwsIFRSVUUpOw0KKyAgQ0ZYX1JlY3RGIHJ0UG9wVXA7DQorICBydFBvcFVwLlNldChydE1vbnRoQ2FsLmxlZnQsIHJ0TW9udGhDYWwudG9wICsgRldMX0RUUF9IRUlHSFQsDQorICAgICAgICAgICAgICBydE1vbnRoQ2FsLndpZHRoLCBydE1vbnRoQ2FsLmhlaWdodCk7DQorICBtX3BNb250aENhbC0+U2V0V2lkZ2V0UmVjdChydFBvcFVwKTsNCisgIG1fcE1vbnRoQ2FsLT5VcGRhdGUoKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6SGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIGlmIChtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgcmV0dXJuIERpc0Zvcm1fSGl0VGVzdChmeCwgZnkpOw0KKyAgfQ0KKyAgaWYgKG1fcnRDbGllbnQuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQ2xpZW50Ow0KKyAgfQ0KKyAgaWYgKElzTW9udGhDYWxlbmRhclNob3dlZCgpKSB7DQorICAgIENGWF9SZWN0RiByZWN0Ow0KKyAgICBtX3BNb250aENhbC0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgICAgaWYgKHJlY3QuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9DbGllbnQ7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Vbmtub3duOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIGlmICghcEdyYXBoaWNzKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KKyAgaWYgKEhhc0JvcmRlcigpKSB7DQorICAgIERyYXdCb3JkZXIocEdyYXBoaWNzLCBGV0xfUEFSVF9EVFBfQm9yZGVyLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgaWYgKEhhc0VkZ2UoKSkgew0KKyAgICBEcmF3RWRnZShwR3JhcGhpY3MsIEZXTF9QQVJUX0RUUF9FZGdlLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgaWYgKCFtX3J0QnRuLklzRW1wdHkoKSkgew0KKyAgICBEcmF3RHJvcERvd25CdXR0b24ocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICByZXR1cm4gRGlzRm9ybV9EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6U2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIqIHBUUCkgew0KKyAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IHBUUDsNCisgIG1fcE1vbnRoQ2FsLT5TZXRUaGVtZVByb3ZpZGVyKHBUUCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6R2V0Q3VyU2VsKGludDMyX3QmIGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpRGF5KSB7DQorICBpWWVhciA9IG1faVllYXI7DQorICBpTW9udGggPSBtX2lNb250aDsNCisgIGlEYXkgPSBtX2lEYXk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6U2V0Q3VyU2VsKGludDMyX3QgaVllYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGF5KSB7DQorICBpZiAoaVllYXIgPD0gMCB8fCBpWWVhciA+PSAzMDAwKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgaWYgKGlNb250aCA8PSAwIHx8IGlNb250aCA+PSAxMykNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIGlmIChpRGF5IDw9IDAgfHwgaURheSA+PSAzMikNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIG1faVllYXIgPSBpWWVhcjsNCisgIG1faU1vbnRoID0gaU1vbnRoOw0KKyAgbV9pRGF5ID0gaURheTsNCisgIG1fcE1vbnRoQ2FsLT5TZXRTZWxlY3QoaVllYXIsIGlNb250aCwgaURheSk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6U2V0RWRpdFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgaWYgKCFtX3BFZGl0KQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgaW50MzJfdCBpUmV0ID0gbV9wRWRpdC0+U2V0VGV4dCh3c1RleHQpOw0KKyAgUmVwYWludCgmbV9ydENsaWVudCk7DQorICBDRldMX0V2ZW50X0R0cEVkaXRDaGFuZ2VkIGV2Ow0KKyAgZXYubV93c1RleHQgPSB3c1RleHQ7DQorICBEaXNwYXRjaEV2ZW50KCZldik7DQorICByZXR1cm4gaVJldDsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpHZXRFZGl0VGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCkgY29uc3Qgew0KKyAgaWYgKG1fcEVkaXQpIHsNCisgICAgcmV0dXJuIG1fcEVkaXQtPkdldFRleHQod3NUZXh0LCBuU3RhcnQsIG5Db3VudCk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KK30NCitGWF9CT09MIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkNhblVuZG8oKSB7DQorICByZXR1cm4gbV9wRWRpdC0+Q2FuVW5kbygpOw0KK30NCitGWF9CT09MIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkNhblJlZG8oKSB7DQorICByZXR1cm4gbV9wRWRpdC0+Q2FuUmVkbygpOw0KK30NCitGWF9CT09MIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OlVuZG8oKSB7DQorICByZXR1cm4gbV9wRWRpdC0+VW5kbygpOw0KK30NCitGWF9CT09MIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OlJlZG8oKSB7DQorICByZXR1cm4gbV9wRWRpdC0+UmVkbygpOw0KK30NCitGWF9CT09MIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkNhbkNvcHkoKSB7DQorICBpbnQzMl90IG5Db3VudCA9IG1fcEVkaXQtPkNvdW50U2VsUmFuZ2VzKCk7DQorICByZXR1cm4gbkNvdW50ID4gMDsNCit9DQorRlhfQk9PTCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpDYW5DdXQoKSB7DQorICBpZiAobV9wRWRpdC0+R2V0U3R5bGVzRXgoKSAmIEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaW50MzJfdCBuQ291bnQgPSBtX3BFZGl0LT5Db3VudFNlbFJhbmdlcygpOw0KKyAgcmV0dXJuIG5Db3VudCA+IDA7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6Q2FuU2VsZWN0QWxsKCkgew0KKyAgcmV0dXJuIG1fcEVkaXQtPkdldFRleHRMZW5ndGgoKSA+IDA7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6Q29weShDRlhfV2lkZVN0cmluZyYgd3NDb3B5KSB7DQorICByZXR1cm4gbV9wRWRpdC0+Q29weSh3c0NvcHkpOw0KK30NCitGWF9CT09MIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkN1dChDRlhfV2lkZVN0cmluZyYgd3NDdXQpIHsNCisgIHJldHVybiBtX3BFZGl0LT5DdXQod3NDdXQpOw0KK30NCitGWF9CT09MIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OlBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1Bhc3RlKSB7DQorICByZXR1cm4gbV9wRWRpdC0+UGFzdGUod3NQYXN0ZSk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6U2VsZWN0QWxsKCkgew0KKyAgcmV0dXJuIG1fcEVkaXQtPkFkZFNlbFJhbmdlKDApID09IEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9CT09MIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkRlbGV0ZSgpIHsNCisgIHJldHVybiBtX3BFZGl0LT5DbGVhclRleHQoKSA9PSBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfQk9PTCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpEZVNlbGVjdCgpIHsNCisgIHJldHVybiBtX3BFZGl0LT5DbGVhclNlbGVjdGlvbnMoKSA9PSBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpHZXRCQm94KENGWF9SZWN0RiYgcmVjdCkgew0KKyAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICByZXR1cm4gRGlzRm9ybV9HZXRCQm94KHJlY3QpOw0KKyAgfQ0KKyAgcmVjdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICBpZiAoSXNNb250aENhbGVuZGFyU2hvd2VkKCkpIHsNCisgICAgQ0ZYX1JlY3RGIHJ0TW9udGg7DQorICAgIG1fcE1vbnRoQ2FsLT5HZXRXaWRnZXRSZWN0KHJ0TW9udGgpOw0KKyAgICBydE1vbnRoLk9mZnNldChtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmxlZnQsDQorICAgICAgICAgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQudG9wKTsNCisgICAgcmVjdC5VbmlvbihydE1vbnRoKTsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpTZXRFZGl0TGltaXQoaW50MzJfdCBuTGltaXQpIHsNCisgIHJldHVybiBtX3BFZGl0LT5TZXRMaW1pdChuTGltaXQpOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6Ok1vZGlmeUVkaXRTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpIHsNCisgIHJldHVybiBtX3BFZGl0LT5Nb2RpZnlTdHlsZXNFeChkd1N0eWxlc0V4QWRkZWQsIGR3U3R5bGVzRXhSZW1vdmVkKTsNCit9DQordm9pZCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpEcmF3RHJvcERvd25CdXR0b24oQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0RUUF9TcGluKSA9PQ0KKyAgICAgIEZXTF9TVFlMRUVYVF9EVFBfU3Bpbikgew0KKyAgICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcDsNCisgICAgcHJvcC5tX2R3U3R5bGVFeGVzIHw9IEZXTF9TVFlMRUVYRV9TUEJfVmVydDsNCisgICAgcHJvcC5tX3BQYXJlbnQgPSBtX3BJbnRlcmZhY2U7DQorICAgIHByb3AubV9ydFdpZGdldCA9IG1fcnRCdG47DQorICAgIElGV0xfU3BpbkJ1dHRvbiogcFNwaW4gPSBJRldMX1NwaW5CdXR0b246OkNyZWF0ZShwcm9wLCBtX3BJbnRlcmZhY2UpOw0KKyAgICBwU3Bpbi0+SW5pdGlhbGl6ZSgpOw0KKyAgfSBlbHNlIHsNCisgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0RUUF9Ecm9wRG93bkJ1dHRvbjsNCisgICAgcGFyYW0ubV9kd1N0YXRlcyA9IG1faUJ0blN0YXRlOw0KKyAgICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgICAgcGFyYW0ubV9ydFBhcnQgPSBtX3J0QnRuOw0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIH0NCisgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkZvcm1hdERhdGVTdHJpbmcoaW50MzJfdCBpWWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaURheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0RUUF9TaG9ydERhdGVGb3JtYXQpID09DQorICAgICAgRldMX1NUWUxFRVhUX0RUUF9TaG9ydERhdGVGb3JtYXQpIHsNCisgICAgd3NUZXh0LkZvcm1hdChMIiVkLSVkLSVkIiwgaVllYXIsIGlNb250aCwgaURheSk7DQorICB9IGVsc2UgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0RUUF9Mb25nRGF0ZUZvcm1hdCkgPT0NCisgICAgICAgICAgICAgRldMX1NUWUxFRVhUX0RUUF9Mb25nRGF0ZUZvcm1hdCkgew0KKyAgICB3c1RleHQuRm9ybWF0KEwiJWQgWWVhciAlZCBNb250aCAlZCBEYXkiLCBpWWVhciwgaU1vbnRoLCBpRGF5KTsNCisgIH0gZWxzZSBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRFRQX1RpbWVGb3JtYXQpID09DQorICAgICAgICAgICAgIEZXTF9TVFlMRUVYVF9EVFBfVGltZUZvcm1hdCkgew0KKyAgfQ0KK30NCit2b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OlNob3dNb250aENhbGVuZGFyKEZYX0JPT0wgYkFjdGl2YXRlKSB7DQorICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgIHJldHVybiBEaXNGb3JtX1Nob3dNb250aENhbGVuZGFyKGJBY3RpdmF0ZSk7DQorICB9DQorICBpZiAoSXNNb250aENhbGVuZGFyU2hvd2VkKCkgPT0gYkFjdGl2YXRlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmICghbV9wRm9ybSkgew0KKyAgICBJbml0UHJveHlGb3JtKCk7DQorICB9DQorICBpZiAoYkFjdGl2YXRlKSB7DQorICAgIENGWF9SZWN0RiBydE1vbnRoOw0KKyAgICBtX3BNb250aENhbC0+R2V0V2lkZ2V0UmVjdChydE1vbnRoKTsNCisgICAgQ0ZYX1JlY3RGIHJ0QW5jaG9yOw0KKyAgICBydEFuY2hvci5TZXQoMCwgMCwgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aCwNCisgICAgICAgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0KTsNCisgICAgR2V0UG9wdXBQb3MoMCwgcnRNb250aC5oZWlnaHQsIHJ0QW5jaG9yLCBydE1vbnRoKTsNCisgICAgbV9wRm9ybS0+U2V0V2lkZ2V0UmVjdChydE1vbnRoKTsNCisgICAgcnRNb250aC5sZWZ0ID0gcnRNb250aC50b3AgPSAwOw0KKyAgICBtX3BNb250aENhbC0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsICFiQWN0aXZhdGUpOw0KKyAgICBtX3BNb250aENhbC0+U2V0V2lkZ2V0UmVjdChydE1vbnRoKTsNCisgICAgbV9wTW9udGhDYWwtPlVwZGF0ZSgpOw0KKyAgICBtX3BGb3JtLT5Eb01vZGFsKCk7DQorICB9IGVsc2Ugew0KKyAgICBtX3BGb3JtLT5FbmREb01vZGFsKCk7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6SXNNb250aENhbGVuZGFyU2hvd2VkKCkgew0KKyAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICByZXR1cm4gRGlzRm9ybV9Jc01vbnRoQ2FsZW5kYXJTaG93ZWQoKTsNCisgIH0NCisgIGlmICghbV9wRm9ybSkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgcmV0dXJuICEobV9wRm9ybS0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfSW52aXNpYmxlKTsNCit9DQordm9pZCBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpSZVNldEVkaXRBbGlnbm1lbnQoKSB7DQorICBpZiAoIW1fcEVkaXQpDQorICAgIHJldHVybjsNCisgIEZYX0RXT1JEIGR3U3R5bEV4ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzOw0KKyAgRlhfRFdPUkQgZHdBZGQgPSAwOw0KKyAgc3dpdGNoIChkd1N0eWxFeGVzICYgRldMX1NUWUxFRVhUX0RUUF9FZGl0SEFsaWduTWFzaykgew0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9EVFBfRWRpdEhDZW50ZXI6IHsNCisgICAgICBkd0FkZCB8PSBGV0xfU1RZTEVFWFRfRURUX0hDZW50ZXI7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRIRmFyOiB7DQorICAgICAgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0VEVF9IRmFyOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0VEVF9ITmVhcjsgfQ0KKyAgfQ0KKyAgc3dpdGNoIChkd1N0eWxFeGVzICYgRldMX1NUWUxFRVhUX0RUUF9FZGl0VkFsaWduTWFzaykgew0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9EVFBfRWRpdFZDZW50ZXI6IHsNCisgICAgICBkd0FkZCB8PSBGV0xfU1RZTEVFWFRfRURUX1ZDZW50ZXI7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRWRmFyOiB7DQorICAgICAgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0VEVF9WRmFyOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0VEVF9WTmVhcjsgfQ0KKyAgfQ0KKyAgaWYgKGR3U3R5bEV4ZXMgJiBGV0xfU1RZTEVFWFRfRFRQX0VkaXRKdXN0aWZpZWQpIHsNCisgICAgZHdBZGQgfD0gRldMX1NUWUxFRVhUX0VEVF9KdXN0aWZpZWQ7DQorICB9DQorICBpZiAoZHdTdHlsRXhlcyAmIEZXTF9TVFlMRUVYVF9EVFBfRWRpdERpc3RyaWJ1dGVkKSB7DQorICAgIGR3QWRkIHw9IEZXTF9TVFlMRUVYVF9FRFRfRGlzdHJpYnV0ZWQ7DQorICB9DQorICBtX3BFZGl0LT5Nb2RpZnlTdHlsZXNFeChkd0FkZCwgRldMX1NUWUxFRVhUX0VEVF9IQWxpZ25NYXNrIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1NUWUxFRVhUX0VEVF9IQWxpZ25Nb2RlTWFzayB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9TVFlMRUVYVF9FRFRfVkFsaWduTWFzayk7DQorfQ0KK3ZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6UHJvY2Vzc1NlbENoYW5nZWQoaW50MzJfdCBpWWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGF5KSB7DQorICBtX2lZZWFyID0gaVllYXI7DQorICBtX2lNb250aCA9IGlNb250aDsNCisgIG1faURheSA9IGlEYXk7DQorICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICBGb3JtYXREYXRlU3RyaW5nKG1faVllYXIsIG1faU1vbnRoLCBtX2lEYXksIHdzVGV4dCk7DQorICBtX3BFZGl0LT5TZXRUZXh0KHdzVGV4dCk7DQorICBtX3BFZGl0LT5VcGRhdGUoKTsNCisgIFJlcGFpbnQoJm1fcnRDbGllbnQpOw0KKyAgQ0ZXTF9FdmVudF9EdHBTZWxlY3RDaGFuZ2VkIGV2Ow0KKyAgZXYubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgZXYuaVllYXIgPSBtX2lZZWFyOw0KKyAgZXYuaU1vbnRoID0gbV9pTW9udGg7DQorICBldi5pRGF5ID0gbV9pRGF5Ow0KKyAgRGlzcGF0Y2hFdmVudCgmZXYpOw0KK30NCit2b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkluaXRQcm94eUZvcm0oKSB7DQorICBpZiAobV9wRm9ybSkNCisgICAgcmV0dXJuOw0KKyAgaWYgKCFtX3BNb250aENhbCkNCisgICAgcmV0dXJuOw0KKyAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3BGb3JtOw0KKyAgcHJvcEZvcm0ubV9kd1N0eWxlcyA9IEZXTF9XR1RTVFlMRV9Qb3B1cDsNCisgIHByb3BGb3JtLm1fZHdTdGF0ZXMgPSBGV0xfV0dUU1RBVEVfSW52aXNpYmxlOw0KKyAgcHJvcEZvcm0ubV9wT3duZXIgPSBtX3BJbnRlcmZhY2U7DQorICBtX3BGb3JtLnJlc2V0KElGV0xfRGF0ZVRpbWVGb3JtOjpDcmVhdGUocHJvcEZvcm0sIG1fcE1vbnRoQ2FsLmdldCgpKSk7DQorICBtX3BGb3JtLT5Jbml0aWFsaXplKCk7DQorICBtX3BNb250aENhbC0+U2V0UGFyZW50KG1fcEZvcm0uZ2V0KCkpOw0KK30NCitJRldMX0RhdGVUaW1lRWRpdCogQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6R2V0RGF0YVRpbWVFZGl0KCkgew0KKyAgcmV0dXJuIG1fcEVkaXQuZ2V0KCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6RGlzRm9ybV9Jbml0aWFsaXplKCkgew0KKyAgbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyA9IEZXTF9TVFlMRUVYVF9EVFBfU2hvcnREYXRlRm9ybWF0Ow0KKyAgRGlzRm9ybV9Jbml0RGF0ZVRpbWVDYWxlbmRhcigpOw0KKyAgRGlzRm9ybV9Jbml0RGF0ZVRpbWVFZGl0KCk7DQorICBSZWdpc3RlckV2ZW50VGFyZ2V0KG1fcE1vbnRoQ2FsLmdldCgpKTsNCisgIFJlZ2lzdGVyRXZlbnRUYXJnZXQobV9wRWRpdC5nZXQoKSk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK3ZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6RGlzRm9ybV9Jbml0RGF0ZVRpbWVDYWxlbmRhcigpIHsNCisgIGlmIChtX3BNb250aENhbCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcE1vbnRoOw0KKyAgcHJvcE1vbnRoLm1fZHdTdHlsZXMgPQ0KKyAgICAgIEZXTF9XR1RTVFlMRV9Qb3B1cCB8IEZXTF9XR1RTVFlMRV9Cb3JkZXIgfCBGV0xfV0dUU1RZTEVfRWRnZVN1bmtlbjsNCisgIHByb3BNb250aC5tX2R3U3RhdGVzID0gRldMX1dHVFNUQVRFX0ludmlzaWJsZTsNCisgIHByb3BNb250aC5tX3BQYXJlbnQgPSBtX3BJbnRlcmZhY2U7DQorICBwcm9wTW9udGgubV9wRGF0YVByb3ZpZGVyID0gJm1fTW9udGhDYWxlbmRhckRQOw0KKyAgcHJvcE1vbnRoLm1fcFRoZW1lUHJvdmlkZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KKyAgbV9wTW9udGhDYWwucmVzZXQoSUZXTF9EYXRlVGltZUNhbGVuZGVyOjpDcmVhdGUocHJvcE1vbnRoLCBtX3BJbnRlcmZhY2UpKTsNCisgIG1fcE1vbnRoQ2FsLT5Jbml0aWFsaXplKCk7DQorICBDRlhfUmVjdEYgcnRNb250aENhbDsNCisgIG1fcE1vbnRoQ2FsLT5HZXRXaWRnZXRSZWN0KHJ0TW9udGhDYWwsIFRSVUUpOw0KKyAgcnRNb250aENhbC5TZXQoMCwgMCwgcnRNb250aENhbC53aWR0aCwgcnRNb250aENhbC5oZWlnaHQpOw0KKyAgbV9wTW9udGhDYWwtPlNldFdpZGdldFJlY3QocnRNb250aENhbCk7DQorfQ0KK3ZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6RGlzRm9ybV9Jbml0RGF0ZVRpbWVFZGl0KCkgew0KKyAgaWYgKG1fcEVkaXQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3BFZGl0Ow0KKyAgcHJvcEVkaXQubV9wUGFyZW50ID0gbV9wSW50ZXJmYWNlOw0KKyAgcHJvcEVkaXQubV9wVGhlbWVQcm92aWRlciA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICBtX3BFZGl0LnJlc2V0KElGV0xfRGF0ZVRpbWVFZGl0OjpDcmVhdGUocHJvcEVkaXQsIG1fcEludGVyZmFjZSkpOw0KKyAgbV9wRWRpdC0+SW5pdGlhbGl6ZSgpOw0KK30NCitGWF9CT09MIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkRpc0Zvcm1fSXNNb250aENhbGVuZGFyU2hvd2VkKCkgew0KKyAgaWYgKCFtX3BNb250aENhbCkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgcmV0dXJuICEobV9wTW9udGhDYWwtPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSk7DQorfQ0KK3ZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6RGlzRm9ybV9TaG93TW9udGhDYWxlbmRhcihGWF9CT09MIGJBY3RpdmF0ZSkgew0KKyAgRlhfQk9PTCBiU2hvd2VkID0gSXNNb250aENhbGVuZGFyU2hvd2VkKCk7DQorICBpZiAoYlNob3dlZCA9PSBiQWN0aXZhdGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKGJBY3RpdmF0ZSkgew0KKyAgICBDRlhfUmVjdEYgcnRNb250aENhbDsNCisgICAgbV9wTW9udGhDYWwtPkdldFdpZGdldFJlY3QocnRNb250aENhbCwgVFJVRSk7DQorICAgIEZYX0ZMT0FUIGZQb3B1cE1pbiA9IHJ0TW9udGhDYWwuaGVpZ2h0Ow0KKyAgICBGWF9GTE9BVCBmUG9wdXBNYXggPSBydE1vbnRoQ2FsLmhlaWdodDsNCisgICAgQ0ZYX1JlY3RGIHJ0QW5jaG9yKG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQpOw0KKyAgICBydEFuY2hvci53aWR0aCA9IHJ0TW9udGhDYWwud2lkdGg7DQorICAgIHJ0TW9udGhDYWwubGVmdCA9IG1fcnRDbGllbnQubGVmdDsNCisgICAgcnRNb250aENhbC50b3AgPSBydEFuY2hvci5IZWlnaHQoKTsNCisgICAgR2V0UG9wdXBQb3MoZlBvcHVwTWluLCBmUG9wdXBNYXgsIHJ0QW5jaG9yLCBydE1vbnRoQ2FsKTsNCisgICAgbV9wTW9udGhDYWwtPlNldFdpZGdldFJlY3QocnRNb250aENhbCk7DQorICAgIGlmIChtX2lZZWFyID4gMCAmJiBtX2lNb250aCA+IDAgJiYgbV9pRGF5ID4gMCkgew0KKyAgICAgIG1fcE1vbnRoQ2FsLT5TZXRTZWxlY3QobV9pWWVhciwgbV9pTW9udGgsIG1faURheSk7DQorICAgIH0NCisgICAgbV9wTW9udGhDYWwtPlVwZGF0ZSgpOw0KKyAgfQ0KKyAgbV9wTW9udGhDYWwtPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCAhYkFjdGl2YXRlKTsNCisgIGlmIChiQWN0aXZhdGUpIHsNCisgICAgQ0ZXTF9Nc2dTZXRGb2N1cyBtc2c7DQorICAgIG1zZy5tX3BEc3RUYXJnZXQgPSBtX3BNb250aENhbC5nZXQoKTsNCisgICAgbXNnLm1fcFNyY1RhcmdldCA9IG1fcEVkaXQuZ2V0KCk7DQorICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9IG1fcEVkaXQtPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgICBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UoJm1zZyk7DQorICB9DQorICBDRlhfUmVjdEYgcnRJbnZhbGlkYXRlLCBydENhbDsNCisgIHJ0SW52YWxpZGF0ZS5TZXQoMCwgMCwgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aCwNCisgICAgICAgICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQpOw0KKyAgbV9wTW9udGhDYWwtPkdldFdpZGdldFJlY3QocnRDYWwpOw0KKyAgcnRJbnZhbGlkYXRlLlVuaW9uKHJ0Q2FsKTsNCisgIHJ0SW52YWxpZGF0ZS5JbmZsYXRlKDIsIDIpOw0KKyAgUmVwYWludCgmcnRJbnZhbGlkYXRlKTsNCit9DQorRlhfRFdPUkQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDo6RGlzRm9ybV9IaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgQ0ZYX1JlY3RGIHJlY3Q7DQorICByZWN0LlNldCgwLCAwLCBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LndpZHRoLA0KKyAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQpOw0KKyAgaWYgKHJlY3QuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfRWRpdDsNCisgIH0NCisgIGlmIChEaXNGb3JtX0lzTmVlZFNob3dCdXR0b24oKSkgew0KKyAgICByZWN0LndpZHRoICs9IG1fZkJ0bjsNCisgIH0NCisgIGlmIChyZWN0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0NsaWVudDsNCisgIH0NCisgIGlmIChJc01vbnRoQ2FsZW5kYXJTaG93ZWQoKSkgew0KKyAgICBtX3BNb250aENhbC0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgICAgaWYgKHJlY3QuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9DbGllbnQ7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Vbmtub3duOw0KK30NCitGWF9CT09MIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkRpc0Zvcm1fSXNOZWVkU2hvd0J1dHRvbigpIHsNCisgIEZYX0JPT0wgYkZvY3VzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkIHx8DQorICAgICAgICAgICAgICAgICAgIG1fcE1vbnRoQ2FsLT5HZXRTdGF0ZXMoKSAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkIHx8DQorICAgICAgICAgICAgICAgICAgIG1fcEVkaXQtPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICByZXR1cm4gYkZvY3VzOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkRpc0Zvcm1fVXBkYXRlKCkgew0KKyAgaWYgKG1faUxvY2spIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIH0NCisgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikgew0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCisgIH0NCisgIG1fcEVkaXQtPlNldFRoZW1lUHJvdmlkZXIobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcik7DQorICBHZXRDbGllbnRSZWN0KG1fcnRDbGllbnQpOw0KKyAgbV9wRWRpdC0+U2V0V2lkZ2V0UmVjdChtX3J0Q2xpZW50KTsNCisgIFJlU2V0RWRpdEFsaWdubWVudCgpOw0KKyAgbV9wRWRpdC0+VXBkYXRlKCk7DQorICBpZiAobV9wTW9udGhDYWwtPkdldFRoZW1lUHJvdmlkZXIoKSA9PSBOVUxMKSB7DQorICAgIG1fcE1vbnRoQ2FsLT5TZXRUaGVtZVByb3ZpZGVyKG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcikgew0KKyAgICBJRldMX0RhdGVUaW1lUGlja2VyRFAqIHBEYXRhID0NCisgICAgICAgIHN0YXRpY19jYXN0PElGV0xfRGF0ZVRpbWVQaWNrZXJEUCo+KG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQorICAgIHBEYXRhLT5HZXRUb2RheShtX3BJbnRlcmZhY2UsIG1fTW9udGhDYWxlbmRhckRQLm1faUN1clllYXIsDQorICAgICAgICAgICAgICAgICAgICBtX01vbnRoQ2FsZW5kYXJEUC5tX2lDdXJNb250aCwgbV9Nb250aENhbGVuZGFyRFAubV9pQ3VyRGF5KTsNCisgIH0NCisgIEZYX0ZMT0FUKiBwV2lkdGggPQ0KKyAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUKj4oR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGgpKTsNCisgIGlmICghcFdpZHRoKQ0KKyAgICByZXR1cm4gMDsNCisgIG1fZkJ0biA9ICpwV2lkdGg7DQorICBDRlhfUmVjdEYgcnRNb250aENhbDsNCisgIG1fcE1vbnRoQ2FsLT5HZXRXaWRnZXRSZWN0KHJ0TW9udGhDYWwsIFRSVUUpOw0KKyAgQ0ZYX1JlY3RGIHJ0UG9wVXA7DQorICBydFBvcFVwLlNldChydE1vbnRoQ2FsLmxlZnQsIHJ0TW9udGhDYWwudG9wICsgRldMX0RUUF9IRUlHSFQsDQorICAgICAgICAgICAgICBydE1vbnRoQ2FsLndpZHRoLCBydE1vbnRoQ2FsLmhlaWdodCk7DQorICBtX3BNb250aENhbC0+U2V0V2lkZ2V0UmVjdChydFBvcFVwKTsNCisgIG1fcE1vbnRoQ2FsLT5VcGRhdGUoKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpEaXNGb3JtX0dldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkF1dG9TaXplKSB7DQorICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIGlmIChEaXNGb3JtX0lzTmVlZFNob3dCdXR0b24oKSkgew0KKyAgICByZWN0LndpZHRoICs9IG1fZkJ0bjsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VySW1wOjpEaXNGb3JtX0dldEJCb3goQ0ZYX1JlY3RGJiByZWN0KSB7DQorICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIGlmIChEaXNGb3JtX0lzTmVlZFNob3dCdXR0b24oKSkgew0KKyAgICByZWN0LndpZHRoICs9IG1fZkJ0bjsNCisgIH0NCisgIGlmIChJc01vbnRoQ2FsZW5kYXJTaG93ZWQoKSkgew0KKyAgICBDRlhfUmVjdEYgcnRNb250aDsNCisgICAgbV9wTW9udGhDYWwtPkdldFdpZGdldFJlY3QocnRNb250aCk7DQorICAgIHJ0TW9udGguT2Zmc2V0KG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQubGVmdCwNCisgICAgICAgICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC50b3ApOw0KKyAgICByZWN0LlVuaW9uKHJ0TW9udGgpOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXA6OkRpc0Zvcm1fRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBpZiAoIXBHcmFwaGljcykNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIGlmIChtX3BFZGl0KSB7DQorICAgIENGWF9SZWN0RiBydEVkaXQ7DQorICAgIG1fcEVkaXQtPkdldFdpZGdldFJlY3QocnRFZGl0KTsNCisgICAgQ0ZYX01hdHJpeCBtdDsNCisgICAgbXQuU2V0KDEsIDAsIDAsIDEsIHJ0RWRpdC5sZWZ0LCBydEVkaXQudG9wKTsNCisgICAgaWYgKHBNYXRyaXgpIHsNCisgICAgICBtdC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgICB9DQorICAgIG1fcEVkaXQtPkRyYXdXaWRnZXQocEdyYXBoaWNzLCAmbXQpOw0KKyAgfQ0KKyAgaWYgKElzTW9udGhDYWxlbmRhclNob3dlZCgpKSB7DQorICAgIENGWF9SZWN0RiBydE1vbnRoOw0KKyAgICBtX3BNb250aENhbC0+R2V0V2lkZ2V0UmVjdChydE1vbnRoKTsNCisgICAgQ0ZYX01hdHJpeCBtdDsNCisgICAgbXQuU2V0KDEsIDAsIDAsIDEsIHJ0TW9udGgubGVmdCwgcnRNb250aC50b3ApOw0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgIG10LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIH0NCisgICAgbV9wTW9udGhDYWwtPkRyYXdXaWRnZXQocEdyYXBoaWNzLCAmbXQpOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitDRldMX0RhdGVUaW1lUGlja2VySW1wRGVsZWdhdGU6OkNGV0xfRGF0ZVRpbWVQaWNrZXJJbXBEZWxlZ2F0ZSgNCisgICAgQ0ZXTF9EYXRlVGltZVBpY2tlckltcCogcE93bmVyKQ0KKyAgICA6IG1fcE93bmVyKHBPd25lcikge30NCitpbnQzMl90IENGV0xfRGF0ZVRpbWVQaWNrZXJJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZSgNCisgICAgQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgaWYgKCFwTWVzc2FnZSkNCisgICAgcmV0dXJuIDA7DQorICBGWF9EV09SRCBkd01zZ0NvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KKyAgaW50MzJfdCBpUmV0ID0gMTsNCisgIHN3aXRjaCAoZHdNc2dDb2RlKSB7DQorICAgIGNhc2UgRldMX01TR0hBU0hfU2V0Rm9jdXM6DQorICAgIGNhc2UgRldMX01TR0hBU0hfS2lsbEZvY3VzOiB7DQorICAgICAgT25Gb2N1c0NoYW5nZWQocE1lc3NhZ2UsIGR3TXNnQ29kZSA9PSBGV0xfTVNHSEFTSF9TZXRGb2N1cyk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9Nb3VzZTogew0KKyAgICAgIENGV0xfTXNnTW91c2UqIHBNb3VzZSA9IHN0YXRpY19jYXN0PENGV0xfTXNnTW91c2UqPihwTWVzc2FnZSk7DQorICAgICAgRlhfRFdPUkQgZHdDbWQgPSBwTW91c2UtPm1fZHdDbWQ7DQorICAgICAgc3dpdGNoIChkd0NtZCkgew0KKyAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRvd246IHsNCisgICAgICAgICAgT25MQnV0dG9uRG93bihwTW91c2UpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25VcDogew0KKyAgICAgICAgICBPbkxCdXR0b25VcChwTW91c2UpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTW92ZTogew0KKyAgICAgICAgICBPbk1vdXNlTW92ZShwTW91c2UpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTGVhdmU6IHsNCisgICAgICAgICAgT25Nb3VzZUxlYXZlKHBNb3VzZSk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDoge30NCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZGVmYXVsdDogeyBpUmV0ID0gMDsgfQ0KKyAgfQ0KKyAgaWYgKGR3TXNnQ29kZSA9PSBGV0xfTVNHSEFTSF9LZXkgJiYNCisgICAgICBtX3BPd25lci0+bV9wRWRpdC0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgew0KKyAgICBJRldMX1dpZGdldERlbGVnYXRlKiBwRGVsZWdhdGUgPSBtX3BPd25lci0+bV9wRWRpdC0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICAgIHJldHVybiBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXBEZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KA0KKyAgICBDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgcmV0dXJuIG1fcE93bmVyLT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorfQ0KK3ZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcERlbGVnYXRlOjpPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UqIHBNc2csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldCkgew0KKyAgaWYgKCFwTXNnKQ0KKyAgICByZXR1cm47DQorICBpZiAobV9wT3duZXItPm1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICByZXR1cm4gRGlzRm9ybV9PbkZvY3VzQ2hhbmdlZChwTXNnLCBiU2V0KTsNCisgIH0NCisgIGlmIChiU2V0KSB7DQorICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IChGV0xfV0dUU1RBVEVfRm9jdXNlZCk7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorICB9IGVsc2Ugew0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+KEZXTF9XR1RTVEFURV9Gb2N1c2VkKTsNCisgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCisgIH0NCisgIGlmIChwTXNnLT5tX3BTcmNUYXJnZXQgPT0gbV9wT3duZXItPm1fcE1vbnRoQ2FsLmdldCgpICYmDQorICAgICAgbV9wT3duZXItPklzTW9udGhDYWxlbmRhclNob3dlZCgpKSB7DQorICAgIG1fcE93bmVyLT5TaG93TW9udGhDYWxlbmRhcihGQUxTRSk7DQorICB9DQorICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KK30NCit2b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXBEZWxlZ2F0ZTo6T25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBpZiAoIXBNc2cpDQorICAgIHJldHVybjsNCisgIGlmICgobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgPT0gMCkgew0KKyAgICBtX3BPd25lci0+U2V0Rm9jdXMoVFJVRSk7DQorICB9DQorICBpZiAobV9wT3duZXItPm1fcnRCdG4uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgaWYgKG1fcE93bmVyLT5Jc01vbnRoQ2FsZW5kYXJTaG93ZWQoKSkgew0KKyAgICAgIG1fcE93bmVyLT5TaG93TW9udGhDYWxlbmRhcihGQUxTRSk7DQorICAgICAgQ0ZXTF9FdmVudF9EdHBDbG9zZVVwIGV2Ow0KKyAgICAgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZldik7DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKCEobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJg0KKyAgICAgICAgICAgIEZXTF9TVFlMRUVYVF9EVFBfVGltZUZvcm1hdCkpIHsNCisgICAgICAgIG1fcE93bmVyLT5TaG93TW9udGhDYWxlbmRhcihUUlVFKTsNCisgICAgICAgIENGV0xfRXZlbnRfRHRwRHJvcERvd24gZXY7DQorICAgICAgICBtX3BPd25lci0+RGlzcGF0Y2hFdmVudCgmZXYpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgfQ0KKyAgICAgIG1fcE93bmVyLT5tX2JMQnRuRG93biA9IFRSVUU7DQorICAgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXBEZWxlZ2F0ZTo6T25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSogcE1zZykgew0KKyAgaWYgKCFwTXNnKQ0KKyAgICByZXR1cm47DQorICBtX3BPd25lci0+bV9iTEJ0bkRvd24gPSBGQUxTRTsNCisgIGlmIChtX3BPd25lci0+bV9ydEJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICBtX3BPd25lci0+bV9pQnRuU3RhdGUgPSBGV0xfUEFSVFNUQVRFX0RUUF9Ib3ZlcmVkOw0KKyAgfSBlbHNlIHsNCisgICAgbV9wT3duZXItPm1faUJ0blN0YXRlID0gRldMX1BBUlRTVEFURV9EVFBfTm9ybWFsOw0KKyAgfQ0KKyAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0QnRuKTsNCit9DQordm9pZCBDRldMX0RhdGVUaW1lUGlja2VySW1wRGVsZWdhdGU6Ok9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmIChtX3BPd25lci0+bV9ydEJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgfSBlbHNlIHsNCisgICAgbV9wT3duZXItPm1faUJ0blN0YXRlID0gRldMX1BBUlRTVEFURV9EVFBfTm9ybWFsOw0KKyAgfQ0KKyAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0QnRuKTsNCit9DQordm9pZCBDRldMX0RhdGVUaW1lUGlja2VySW1wRGVsZWdhdGU6Ok9uTW91c2VMZWF2ZShDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBpZiAoIXBNc2cpDQorICAgIHJldHVybjsNCisgIG1fcE93bmVyLT5tX2lCdG5TdGF0ZSA9IEZXTF9QQVJUU1RBVEVfRFRQX05vcm1hbDsNCisgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydEJ0bik7DQorfQ0KK3ZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlckltcERlbGVnYXRlOjpEaXNGb3JtX09uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSogcE1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXQpIHsNCisgIENGWF9SZWN0RiBydEludmFsaWRhdGUobV9wT3duZXItPm1fcnRCdG4pOw0KKyAgaWYgKGJTZXQpIHsNCisgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICAgIGlmIChtX3BPd25lci0+bV9wRWRpdCAmJg0KKyAgICAgICAgIShtX3BPd25lci0+bV9wRWRpdC0+R2V0U3R5bGVzRXgoKSAmIEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHkpKSB7DQorICAgICAgbV9wT3duZXItPm1fcnRCdG4uU2V0KG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LndpZHRoLCAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9mQnRuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQgLSAxKTsNCisgICAgfQ0KKyAgICBydEludmFsaWRhdGUgPSBtX3BPd25lci0+bV9ydEJ0bjsNCisgICAgcE1zZy0+bV9wRHN0VGFyZ2V0ID0gbV9wT3duZXItPm1fcEVkaXQuZ2V0KCk7DQorICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9IG1fcE93bmVyLT5tX3BFZGl0LT5TZXREZWxlZ2F0ZShOVUxMKTsNCisgICAgcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNc2cpOw0KKyAgfSBlbHNlIHsNCisgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9XR1RTVEFURV9Gb2N1c2VkOw0KKyAgICBtX3BPd25lci0+bV9ydEJ0bi5TZXQoMCwgMCwgMCwgMCk7DQorICAgIGlmIChtX3BPd25lci0+RGlzRm9ybV9Jc01vbnRoQ2FsZW5kYXJTaG93ZWQoKSkgew0KKyAgICAgIG1fcE93bmVyLT5TaG93TW9udGhDYWxlbmRhcihGQUxTRSk7DQorICAgIH0NCisgICAgaWYgKG1fcE93bmVyLT5tX3BFZGl0LT5HZXRTdGF0ZXMoKSAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSB7DQorICAgICAgcE1zZy0+bV9wU3JjVGFyZ2V0ID0gbV9wT3duZXItPm1fcEVkaXQuZ2V0KCk7DQorICAgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogcERlbGVnYXRlID0gbV9wT3duZXItPm1fcEVkaXQtPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTXNnKTsNCisgICAgfQ0KKyAgfQ0KKyAgcnRJbnZhbGlkYXRlLkluZmxhdGUoMiwgMik7DQorICBtX3BPd25lci0+UmVwYWludCgmcnRJbnZhbGlkYXRlKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2VkaXRpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2VkaXRpbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZTE4NWUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfZWRpdGltcC5jcHAKQEAgLTAsMCArMSwyMjI0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlIDxhbGdvcml0aG0+DQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGhyZWFkaW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX2FwcGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF90YXJnZXRpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF93aWRnZXRpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0bWdyaW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2NhcmV0aW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2NvbWJvYm94aW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2VkaXRpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfc2Nyb2xsYmFyaW1wLmgiDQorDQorLy8gc3RhdGljDQorSUZXTF9FZGl0KiBJRldMX0VkaXQ6OkNyZWF0ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKSB7DQorICBJRldMX0VkaXQqIHBFZGl0ID0gbmV3IElGV0xfRWRpdDsNCisgIENGV0xfRWRpdEltcCogcEVkaXRJbXBsID0gbmV3IENGV0xfRWRpdEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpOw0KKyAgcEVkaXQtPlNldEltcGwocEVkaXRJbXBsKTsNCisgIHBFZGl0SW1wbC0+U2V0SW50ZXJmYWNlKHBFZGl0KTsNCisgIHJldHVybiBwRWRpdDsNCit9DQorLy8gc3RhdGljDQorSUZXTF9FZGl0KiBJRldMX0VkaXQ6OkNyZWF0ZUNvbWJvRWRpdCgNCisgICAgY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICBJRldMX1dpZGdldCogcE91dGVyKSB7DQorICBJRldMX0VkaXQqIHBFZGl0ID0gbmV3IElGV0xfRWRpdDsNCisgIENGV0xfRWRpdEltcCogcENvbWJvRWRpdEltcGwgPSBuZXcgQ0ZXTF9Db21ib0VkaXRJbXAocHJvcGVydGllcywgcE91dGVyKTsNCisgIHBFZGl0LT5TZXRJbXBsKHBDb21ib0VkaXRJbXBsKTsNCisgIHBDb21ib0VkaXRJbXBsLT5TZXRJbnRlcmZhY2UocEVkaXQpOw0KKyAgcmV0dXJuIHBFZGl0Ow0KK30NCitJRldMX0VkaXQ6OklGV0xfRWRpdCgpIHt9DQorRldMX0VSUiBJRldMX0VkaXQ6OlNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfRWRpdEltcCo+KEdldEltcGwoKSktPlNldFRleHQod3NUZXh0KTsNCit9DQoraW50MzJfdCBJRldMX0VkaXQ6OkdldFRleHRMZW5ndGgoKSBjb25zdCB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9FZGl0SW1wKj4oR2V0SW1wbCgpKS0+R2V0VGV4dExlbmd0aCgpOw0KK30NCitGV0xfRVJSIElGV0xfRWRpdDo6R2V0VGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50KSBjb25zdCB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9FZGl0SW1wKj4oR2V0SW1wbCgpKS0+R2V0VGV4dCh3c1RleHQsIG5TdGFydCwgbkNvdW50KTsNCit9DQorRldMX0VSUiBJRldMX0VkaXQ6OkNsZWFyVGV4dCgpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0VkaXRJbXAqPihHZXRJbXBsKCkpLT5DbGVhclRleHQoKTsNCit9DQoraW50MzJfdCBJRldMX0VkaXQ6OkdldENhcmV0UG9zKCkgY29uc3Qgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfRWRpdEltcCo+KEdldEltcGwoKSktPkdldENhcmV0UG9zKCk7DQorfQ0KK2ludDMyX3QgSUZXTF9FZGl0OjpTZXRDYXJldFBvcyhpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiQmVmb3JlKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9FZGl0SW1wKj4oR2V0SW1wbCgpKS0+U2V0Q2FyZXRQb3MobkluZGV4LCBiQmVmb3JlKTsNCit9DQorRldMX0VSUiBJRldMX0VkaXQ6OkFkZFNlbFJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfRWRpdEltcCo+KEdldEltcGwoKSktPkFkZFNlbFJhbmdlKG5TdGFydCwgbkNvdW50KTsNCit9DQoraW50MzJfdCBJRldMX0VkaXQ6OkNvdW50U2VsUmFuZ2VzKCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfRWRpdEltcCo+KEdldEltcGwoKSktPkNvdW50U2VsUmFuZ2VzKCk7DQorfQ0KK2ludDMyX3QgSUZXTF9FZGl0OjpHZXRTZWxSYW5nZShpbnQzMl90IG5JbmRleCwgaW50MzJfdCYgblN0YXJ0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9FZGl0SW1wKj4oR2V0SW1wbCgpKS0+R2V0U2VsUmFuZ2UobkluZGV4LCBuU3RhcnQpOw0KK30NCitGV0xfRVJSIElGV0xfRWRpdDo6Q2xlYXJTZWxlY3Rpb25zKCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfRWRpdEltcCo+KEdldEltcGwoKSktPkNsZWFyU2VsZWN0aW9ucygpOw0KK30NCitpbnQzMl90IElGV0xfRWRpdDo6R2V0TGltaXQoKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9FZGl0SW1wKj4oR2V0SW1wbCgpKS0+R2V0TGltaXQoKTsNCit9DQorRldMX0VSUiBJRldMX0VkaXQ6OlNldExpbWl0KGludDMyX3QgbkxpbWl0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9FZGl0SW1wKj4oR2V0SW1wbCgpKS0+U2V0TGltaXQobkxpbWl0KTsNCit9DQorRldMX0VSUiBJRldMX0VkaXQ6OlNldEFsaWFzQ2hhcihGWF9XQ0hBUiB3QWxpYXMpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0VkaXRJbXAqPihHZXRJbXBsKCkpLT5TZXRBbGlhc0NoYXIod0FsaWFzKTsNCit9DQorRldMX0VSUiBJRldMX0VkaXQ6OlNldEZvcm1hdFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0VkaXRJbXAqPihHZXRJbXBsKCkpLT5TZXRGb3JtYXRTdHJpbmcod3NGb3JtYXQpOw0KK30NCitGV0xfRVJSIElGV0xfRWRpdDo6SW5zZXJ0KGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbkxlbikgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfRWRpdEltcCo+KEdldEltcGwoKSktPkluc2VydChuU3RhcnQsIGxwVGV4dCwgbkxlbik7DQorfQ0KK0ZXTF9FUlIgSUZXTF9FZGl0OjpEZWxldGVTZWxlY3Rpb25zKCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfRWRpdEltcCo+KEdldEltcGwoKSktPkRlbGV0ZVNlbGVjdGlvbnMoKTsNCit9DQorRldMX0VSUiBJRldMX0VkaXQ6OkRlbGV0ZVJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfRWRpdEltcCo+KEdldEltcGwoKSktPkRlbGV0ZVJhbmdlKG5TdGFydCwgbkNvdW50KTsNCit9DQorRldMX0VSUiBJRldMX0VkaXQ6OlJlcGxhY2VTZWxlY3Rpb25zKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NSZXBsYWNlKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9FZGl0SW1wKj4oR2V0SW1wbCgpKS0+UmVwbGFjZVNlbGVjdGlvbnMod3NSZXBsYWNlKTsNCit9DQorRldMX0VSUiBJRldMX0VkaXQ6OlJlcGxhY2UoaW50MzJfdCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NSZXBsYWNlKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9FZGl0SW1wKj4oR2V0SW1wbCgpKQ0KKyAgICAgIC0+UmVwbGFjZShuU3RhcnQsIG5MZW4sIHdzUmVwbGFjZSk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9FZGl0OjpEb0NsaXBib2FyZChpbnQzMl90IGlDbWQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0VkaXRJbXAqPihHZXRJbXBsKCkpLT5Eb0NsaXBib2FyZChpQ21kKTsNCit9DQorRlhfQk9PTCBJRldMX0VkaXQ6OkNvcHkoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29weSkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfRWRpdEltcCo+KEdldEltcGwoKSktPkNvcHkod3NDb3B5KTsNCit9DQorRlhfQk9PTCBJRldMX0VkaXQ6OkN1dChDRlhfV2lkZVN0cmluZyYgd3NDdXQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0VkaXRJbXAqPihHZXRJbXBsKCkpLT5DdXQod3NDdXQpOw0KK30NCitGWF9CT09MIElGV0xfRWRpdDo6UGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGFzdGUpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0VkaXRJbXAqPihHZXRJbXBsKCkpLT5QYXN0ZSh3c1Bhc3RlKTsNCit9DQorRlhfQk9PTCBJRldMX0VkaXQ6OkRlbGV0ZSgpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0VkaXRJbXAqPihHZXRJbXBsKCkpLT5EZWxldGUoKTsNCit9DQorRlhfQk9PTCBJRldMX0VkaXQ6OlJlZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfRWRpdEltcCo+KEdldEltcGwoKSktPlJlZG8oYnNSZWNvcmQpOw0KK30NCitGWF9CT09MIElGV0xfRWRpdDo6VW5kbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9FZGl0SW1wKj4oR2V0SW1wbCgpKS0+VW5kbyhic1JlY29yZCk7DQorfQ0KK0ZYX0JPT0wgSUZXTF9FZGl0OjpVbmRvKCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfRWRpdEltcCo+KEdldEltcGwoKSktPlVuZG8oKTsNCit9DQorRlhfQk9PTCBJRldMX0VkaXQ6OlJlZG8oKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9FZGl0SW1wKj4oR2V0SW1wbCgpKS0+UmVkbygpOw0KK30NCitGWF9CT09MIElGV0xfRWRpdDo6Q2FuVW5kbygpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0VkaXRJbXAqPihHZXRJbXBsKCkpLT5DYW5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wgSUZXTF9FZGl0OjpDYW5SZWRvKCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfRWRpdEltcCo+KEdldEltcGwoKSktPkNhblJlZG8oKTsNCit9DQorRldMX0VSUiBJRldMX0VkaXQ6OlNldFRhYldpZHRoKEZYX0ZMT0FUIGZUYWJXaWR0aCwgRlhfQk9PTCBiRXF1aWRpc3RhbnQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0VkaXRJbXAqPihHZXRJbXBsKCkpDQorICAgICAgLT5TZXRUYWJXaWR0aChmVGFiV2lkdGgsIGJFcXVpZGlzdGFudCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9FZGl0OjpTZXRPdXRlcihJRldMX1dpZGdldCogcE91dGVyKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9FZGl0SW1wKj4oR2V0SW1wbCgpKS0+U2V0T3V0ZXIocE91dGVyKTsNCit9DQorRldMX0VSUiBJRldMX0VkaXQ6OlNldE51bWJlclJhbmdlKGludDMyX3QgaU1pbiwgaW50MzJfdCBpTWF4KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9FZGl0SW1wKj4oR2V0SW1wbCgpKS0+U2V0TnVtYmVyUmFuZ2UoaU1pbiwgaU1heCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9FZGl0OjpTZXRCYWNrQ29sb3IoRlhfRFdPUkQgZHdDb2xvcikgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfRWRpdEltcCo+KEdldEltcGwoKSktPlNldEJhY2tncm91bmRDb2xvcihkd0NvbG9yKTsNCit9DQorRldMX0VSUiBJRldMX0VkaXQ6OlNldEZvbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9udCwgRlhfRkxPQVQgZlNpemUpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0VkaXRJbXAqPihHZXRJbXBsKCkpLT5TZXRGb250KHdzRm9udCwgZlNpemUpOw0KK30NCit2b2lkIElGV0xfRWRpdDo6U2V0U2Nyb2xsT2Zmc2V0KEZYX0ZMT0FUIGZTY3JvbGxPZmZzZXQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0VkaXRJbXAqPihHZXRJbXBsKCkpLT5TZXRTY3JvbGxPZmZzZXQoZlNjcm9sbE9mZnNldCk7DQorfQ0KK0ZYX0JPT0wgSUZXTF9FZGl0OjpHZXRTdWdnZXN0V29yZHMoQ0ZYX1BvaW50RiBwb2ludGYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0FycmF5JiBzU3VnZ2VzdCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfRWRpdEltcCo+KEdldEltcGwoKSkNCisgICAgICAtPkdldFN1Z2dlc3RXb3Jkcyhwb2ludGYsIHNTdWdnZXN0KTsNCit9DQorRlhfQk9PTCBJRldMX0VkaXQ6OlJlcGxhY2VTcGVsbENoZWNrV29yZChDRlhfUG9pbnRGIHBvaW50ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZXBsYWNlKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9FZGl0SW1wKj4oR2V0SW1wbCgpKQ0KKyAgICAgIC0+UmVwbGFjZVNwZWxsQ2hlY2tXb3JkKHBvaW50ZiwgYnNSZXBsYWNlKTsNCit9DQorI2RlZmluZSBGV0xfRURJVF9NYXJnaW4gMw0KK0NGV0xfRWRpdEltcDo6Q0ZXTF9FZGl0SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKQ0KKyAgICA6IENGV0xfV2lkZ2V0SW1wKHByb3BlcnRpZXMsIHBPdXRlciksDQorICAgICAgbV9mVkFsaWduT2Zmc2V0KDAuMGYpLA0KKyAgICAgIG1fZlNjcm9sbE9mZnNldFgoMC4wZiksDQorICAgICAgbV9mU2Nyb2xsT2Zmc2V0WSgwLjBmKSwNCisgICAgICBtX3BFZHRFbmdpbmUoTlVMTCksDQorICAgICAgbV9iTEJ1dHRvbkRvd24oRkFMU0UpLA0KKyAgICAgIG1fblNlbFN0YXJ0KDApLA0KKyAgICAgIG1fbkxpbWl0KC0xKSwNCisgICAgICBtX2ZTcGFjZUFib3ZlKDApLA0KKyAgICAgIG1fZlNwYWNlQmVsb3coMCksDQorICAgICAgbV9mRm9udFNpemUoMCksDQorICAgICAgbV9iU2V0UmFuZ2UoRkFMU0UpLA0KKyAgICAgIG1faU1pbigtMSksDQorICAgICAgbV9pTWF4KDB4RkZGRkZGRiksDQorICAgICAgbV9iYWNrQ29sb3IoMCksDQorICAgICAgbV91cGRhdGVCYWNrQ29sb3IoRkFMU0UpLA0KKyAgICAgIG1faUN1clJlY29yZCgtMSksDQorICAgICAgbV9pTWF4UmVjb3JkKDEyOCkgew0KKyAgbV9ydENsaWVudC5SZXNldCgpOw0KKyAgbV9ydEVuZ2luZS5SZXNldCgpOw0KKyAgbV9ydFN0YXRpYy5SZXNldCgpOw0KK30NCitDRldMX0VkaXRJbXA6On5DRldMX0VkaXRJbXAoKSB7DQorICBpZiAobV9wRWR0RW5naW5lKSB7DQorICAgIG1fcEVkdEVuZ2luZS0+UmVsZWFzZSgpOw0KKyAgICBtX3BFZHRFbmdpbmUgPSBOVUxMOw0KKyAgfQ0KKyAgQ2xlYXJSZWNvcmQoKTsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Qgew0KKyAgd3NDbGFzcyA9IEZXTF9DTEFTU19FZGl0Ow0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9EV09SRCBDRldMX0VkaXRJbXA6OkdldENsYXNzSUQoKSBjb25zdCB7DQorICByZXR1cm4gRldMX0NMQVNTSEFTSF9FZGl0Ow0KK30NCitGV0xfRVJSIENGV0xfRWRpdEltcDo6SW5pdGlhbGl6ZSgpIHsNCisgIGlmIChDRldMX1dpZGdldEltcDo6SW5pdGlhbGl6ZSgpICE9IEZXTF9FUlJfU3VjY2VlZGVkKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgaWYgKCFtX3BEZWxlZ2F0ZSkgew0KKyAgICBtX3BEZWxlZ2F0ZSA9IG5ldyBDRldMX0VkaXRJbXBEZWxlZ2F0ZSh0aGlzKTsNCisgIH0NCisgIEluaXRDYXJldCgpOw0KKyAgaWYgKCFtX3BFZHRFbmdpbmUpIHsNCisgICAgSW5pdEVuZ2luZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdEltcDo6RmluYWxpemUoKSB7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSB7DQorICAgIFNob3dDYXJldChGQUxTRSk7DQorICB9DQorICBpZiAobV9wSG9yelNjcm9sbEJhcikgew0KKyAgICBtX3BIb3J6U2Nyb2xsQmFyLT5GaW5hbGl6ZSgpOw0KKyAgfQ0KKyAgaWYgKG1fcFZlcnRTY3JvbGxCYXIpIHsNCisgICAgbV9wVmVydFNjcm9sbEJhci0+RmluYWxpemUoKTsNCisgIH0NCisgIGRlbGV0ZSBtX3BEZWxlZ2F0ZTsNCisgIG1fcERlbGVnYXRlID0gbnVsbHB0cjsNCisgIHJldHVybiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKTsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OkdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSkgew0KKyAgaWYgKGJBdXRvU2l6ZSkgew0KKyAgICByZWN0LlNldCgwLCAwLCAwLCAwKTsNCisgICAgaWYgKG1fcEVkdEVuZ2luZSkgew0KKyAgICAgIGludDMyX3QgaVRleHRMZW4gPSBtX3BFZHRFbmdpbmUtPkdldFRleHRMZW5ndGgoKTsNCisgICAgICBpZiAoaVRleHRMZW4gPiAwKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICAgICAgICBtX3BFZHRFbmdpbmUtPkdldFRleHQod3NUZXh0LCAwKTsNCisgICAgICAgIENGWF9TaXplRiBzeiA9IENhbGNUZXh0U2l6ZSgNCisgICAgICAgICAgICB3c1RleHQsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsDQorICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfTXVsdGlMaW5lKTsNCisgICAgICAgIHJlY3QuU2V0KDAsIDAsIHN6LngsIHN6LnkpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBDRldMX1dpZGdldEltcDo6R2V0V2lkZ2V0UmVjdChyZWN0LCBUUlVFKTsNCisgIH0gZWxzZSB7DQorICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfT3V0ZXJTY3JvbGxiYXIpIHsNCisgICAgICBpZiAoSXNTaG93U2Nyb2xsQmFyKFRSVUUpKSB7DQorICAgICAgICBGWF9GTE9BVCogcGZXaWR0aCA9IHN0YXRpY19jYXN0PEZYX0ZMT0FUKj4oDQorICAgICAgICAgICAgR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGgpKTsNCisgICAgICAgIHJlY3Qud2lkdGggKz0gKnBmV2lkdGg7DQorICAgICAgICByZWN0LndpZHRoICs9IEZXTF9FRElUX01hcmdpbjsNCisgICAgICB9DQorICAgICAgaWYgKElzU2hvd1Njcm9sbEJhcihGQUxTRSkpIHsNCisgICAgICAgIEZYX0ZMT0FUKiBwZldpZHRoID0gc3RhdGljX2Nhc3Q8RlhfRkxPQVQqPigNCisgICAgICAgICAgICBHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9TY3JvbGxCYXJXaWR0aCkpOw0KKyAgICAgICAgcmVjdC5oZWlnaHQgKz0gKnBmV2lkdGg7DQorICAgICAgICByZWN0LmhlaWdodCArPSBGV0xfRURJVF9NYXJnaW47DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpTZXRTdGF0ZXMoRlhfRFdPUkQgZHdTdGF0ZXMsIEZYX0JPT0wgYlNldCkgew0KKyAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSkgfHwNCisgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkpIHsNCisgICAgU2hvd0NhcmV0KEZBTFNFKTsNCisgIH0NCisgIHJldHVybiBDRldMX1dpZGdldEltcDo6U2V0U3RhdGVzKGR3U3RhdGVzLCBiU2V0KTsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OlNldFdpZGdldFJlY3QoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OlNldFdpZGdldFJlY3QocmVjdCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpVcGRhdGUoKSB7DQorICBpZiAoSXNMb2NrZWQoKSkgew0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgfQ0KKyAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKSB7DQorICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KKyAgfQ0KKyAgTGF5b3V0KCk7DQorICBpZiAobV9ydENsaWVudC5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIH0NCisgIFVwZGF0ZUVkaXRFbmdpbmUoKTsNCisgIFVwZGF0ZVZBbGlnbm1lbnQoKTsNCisgIFVwZGF0ZVNjcm9sbCgpOw0KKyAgSW5pdENhcmV0KCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfRWRpdEltcDo6SGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9PdXRlclNjcm9sbGJhcikgew0KKyAgICBpZiAoSXNTaG93U2Nyb2xsQmFyKFRSVUUpKSB7DQorICAgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgICAgbV9wVmVydFNjcm9sbEJhci0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgICAgICBpZiAocmVjdC5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfVlNjcm9sbEJhcjsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKElzU2hvd1Njcm9sbEJhcihGQUxTRSkpIHsNCisgICAgICBDRlhfUmVjdEYgcmVjdDsNCisgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5HZXRXaWRnZXRSZWN0KHJlY3QpOw0KKyAgICAgIGlmIChyZWN0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9IU2Nyb2xsQmFyOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKG1fcnRDbGllbnQuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfRWRpdDsNCisgIH0NCisgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Vbmtub3duOw0KK30NCisjZGVmaW5lIEZYX0VESVRfSVNMQVRJTldPUkQodSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgKHUgPT0gMHgyRCB8fCAodSA8PSAweDAwNUEgJiYgdSA+PSAweDAwNDEpIHx8ICAgICAgICAgICAgICAgICAgICBcDQorICAgKHUgPD0gMHgwMDdBICYmIHUgPj0gMHgwMDYxKSB8fCAodSA8PSAweDAyQUYgJiYgdSA+PSAweDAwQzApIHx8IFwNCisgICB1ID09IDB4MDAyNykNCitzdGF0aWMgdm9pZCBBZGRTcXVpZ2dseVBhdGgoQ0ZYX1BhdGgmIFBhdGhEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU3RhcnRYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRW5kWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTdGVwKSB7DQorICBQYXRoRGF0YS5Nb3ZlVG8oZlN0YXJ0WCwgZlkpOw0KKyAgRlhfRkxPQVQgZng7DQorICBpbnQzMl90IGk7DQorICBmb3IgKGkgPSAxLCBmeCA9IGZTdGFydFggKyBmU3RlcDsgZnggPCBmRW5kWDsgZnggKz0gZlN0ZXAsIGkrKykgew0KKyAgICBQYXRoRGF0YS5MaW5lVG8oZngsIGZZICsgKGkgJiAxKSAqIGZTdGVwKTsNCisgIH0NCit9DQordm9pZCBDRldMX0VkaXRJbXA6OkFkZFNwZWxsQ2hlY2tPYmooQ0ZYX1BhdGgmIFBhdGhEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZPZmZTZXRYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZPZmZTZXRZKSB7DQorICBGWF9GTE9BVCBmU3RhcnRYID0gMC4wZjsNCisgIEZYX0ZMT0FUIGZFbmRYID0gMC4wZjsNCisgIEZYX0ZMT0FUIGZZID0gMC4wZjsNCisgIEZYX0ZMT0FUIGZTdGVwID0gMC4wZjsNCisgIElGREVfVHh0RWR0UGFnZSogcFBhZ2UgPSBtX3BFZHRFbmdpbmUtPkdldFBhZ2UoMCk7DQorICBDRlhfUmVjdEZBcnJheSByZWN0QXJyYXk7DQorICBDRlhfUmVjdEYgcmVjdFRleHQ7DQorICBjb25zdCBGREVfVFhURURUUEFSQU1TKiB0eHRFZHRQYXJhbXMgPSBtX3BFZHRFbmdpbmUtPkdldEVkaXRQYXJhbXMoKTsNCisgIEZYX0ZMT0FUIGZBc2VudCA9IChGWF9GTE9BVCl0eHRFZHRQYXJhbXMtPnBGb250LT5HZXRBc2NlbnQoKSAqDQorICAgICAgICAgICAgICAgICAgICB0eHRFZHRQYXJhbXMtPmZGb250U2l6ZSAvIDEwMDA7DQorICBwUGFnZS0+Q2FsY1JhbmdlUmVjdEFycmF5KG5TdGFydCwgbkNvdW50LCByZWN0QXJyYXkpOw0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWN0QXJyYXkuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgcmVjdFRleHQgPSByZWN0QXJyYXkuR2V0QXQoaSk7DQorICAgIGZZID0gcmVjdFRleHQudG9wICsgZkFzZW50ICsgZk9mZlNldFk7DQorICAgIGZTdGVwID0gdHh0RWR0UGFyYW1zLT5mRm9udFNpemUgLyAxNi4wZjsNCisgICAgZlN0YXJ0WCA9IHJlY3RUZXh0LmxlZnQgKyBmT2ZmU2V0WDsNCisgICAgZkVuZFggPSBmU3RhcnRYICsgcmVjdFRleHQuV2lkdGgoKTsNCisgICAgQWRkU3F1aWdnbHlQYXRoKFBhdGhEYXRhLCBmU3RhcnRYLCBmRW5kWCwgZlksIGZTdGVwKTsNCisgIH0NCit9DQoraW50MzJfdCBDRldMX0VkaXRJbXA6OkdldFdvcmRBdFBvaW50KENGWF9Qb2ludEYgcG9pbnRmLCBpbnQzMl90JiBuQ291bnQpIHsNCisgIHJldHVybiAwOw0KK30NCitGWF9CT09MIENGV0xfRWRpdEltcDo6R2V0U3VnZ2VzdFdvcmRzKENGWF9Qb2ludEYgcG9pbnRmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdBcnJheSYgc1N1Z2dlc3QpIHsNCisgIGludDMyX3QgbldvcmRDb3VudCA9IDA7DQorICBpbnQzMl90IG5Xb3JkU3RhcnQgPSBHZXRXb3JkQXRQb2ludChwb2ludGYsIG5Xb3JkQ291bnQpOw0KKyAgaWYgKG5Xb3JkQ291bnQgPCAxKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzU3BlbGw7DQorICBHZXRUZXh0KHdzU3BlbGwsIG5Xb3JkU3RhcnQsIG5Xb3JkQ291bnQpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgc0xhdGluV29yZDsNCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbldvcmRDb3VudDsgaSsrKSB7DQorICAgIGlmICghRlhfRURJVF9JU0xBVElOV09SRCh3c1NwZWxsW2ldKSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHNMYXRpbldvcmQgKz0gKEZYX0NIQVIpd3NTcGVsbFtpXTsNCisgIH0NCisgIGlmIChzTGF0aW5Xb3JkLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRldMX0V2dEVkdENoZWNrV29yZCBjaGVja1dvcmRFdmVudDsNCisgIGNoZWNrV29yZEV2ZW50Lm1fcFNyY1RhcmdldCA9IG1fcEludGVyZmFjZTsNCisgIGNoZWNrV29yZEV2ZW50LmJzV29yZCA9IHNMYXRpbldvcmQ7DQorICBjaGVja1dvcmRFdmVudC5iQ2hlY2tXb3JkID0gVFJVRTsNCisgIERpc3BhdGNoRXZlbnQoJmNoZWNrV29yZEV2ZW50KTsNCisgIGlmIChjaGVja1dvcmRFdmVudC5iQ2hlY2tXb3JkKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGV0xfRXZ0RWR0R2V0U3VnZ2VzdFdvcmRzIHN1Z2dlc3RXb3Jkc0V2ZW50Ow0KKyAgc3VnZ2VzdFdvcmRzRXZlbnQubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgc3VnZ2VzdFdvcmRzRXZlbnQuYnNXb3JkID0gc0xhdGluV29yZDsNCisgIHN1Z2dlc3RXb3Jkc0V2ZW50LmJzQXJyYXlTdWdnZXN0V29yZHMgPSBzU3VnZ2VzdDsNCisgIHN1Z2dlc3RXb3Jkc0V2ZW50LmJTdWdnZXN0V29yZHMgPSBGQUxTRTsNCisgIERpc3BhdGNoRXZlbnQoJmNoZWNrV29yZEV2ZW50KTsNCisgIHJldHVybiBzdWdnZXN0V29yZHNFdmVudC5iU3VnZ2VzdFdvcmRzOw0KK30NCitGWF9CT09MIENGV0xfRWRpdEltcDo6UmVwbGFjZVNwZWxsQ2hlY2tXb3JkKENGWF9Qb2ludEYgcG9pbnRmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlcGxhY2UpIHsNCisgIGludDMyX3QgbldvcmRDb3VudCA9IDA7DQorICBpbnQzMl90IG5Xb3JkU3RhcnQgPSBHZXRXb3JkQXRQb2ludChwb2ludGYsIG5Xb3JkQ291bnQpOw0KKyAgaWYgKG5Xb3JkQ291bnQgPCAxKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzU3BlbGw7DQorICBHZXRUZXh0KHdzU3BlbGwsIG5Xb3JkU3RhcnQsIG5Xb3JkQ291bnQpOw0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuV29yZENvdW50OyBpKyspIHsNCisgICAgaWYgKCFGWF9FRElUX0lTTEFUSU5XT1JEKHdzU3BlbGxbaV0pKSB7DQorICAgICAgbldvcmRDb3VudCA9IGk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGludDMyX3QgbkRlc3RMZW4gPSBic1JlcGxhY2UuR2V0TGVuZ3RoKCk7DQorICBDRlhfV2lkZVN0cmluZyB3c0Rlc3Q7DQorICBGWF9XQ0hBUiogcEJ1ZmZlciA9IHdzRGVzdC5HZXRCdWZmZXIobkRlc3RMZW4pOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkRlc3RMZW47IGkrKykgew0KKyAgICBwQnVmZmVyW2ldID0gYnNSZXBsYWNlW2ldOw0KKyAgfQ0KKyAgd3NEZXN0LlJlbGVhc2VCdWZmZXIobkRlc3RMZW4pOw0KKyAgUmVwbGFjZShuV29yZFN0YXJ0LCBuV29yZENvdW50LCB3c0Rlc3QpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wOjpEcmF3U3BlbGxDaGVjayhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcEdyYXBoaWNzLT5Db25jYXRNYXRyaXgoY29uc3RfY2FzdDxDRlhfTWF0cml4Kj4ocE1hdHJpeCkpOw0KKyAgfQ0KKyAgRlhfQVJHQiBjciA9IDB4RkZGRjAwMDA7DQorICBDRlhfQ29sb3IgY3JMaW5lKGNyKTsNCisgIENGV0xfRXZ0RWR0Q2hlY2tXb3JkIGNoZWNrV29yZEV2ZW50Ow0KKyAgY2hlY2tXb3JkRXZlbnQubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgc0xhdGluV29yZDsNCisgIENGWF9QYXRoIHBhdGhTcGVsbDsNCisgIHBhdGhTcGVsbC5DcmVhdGUoKTsNCisgIGludDMyX3QgblN0YXJ0ID0gMDsNCisgIEZYX0ZMT0FUIGZPZmZTZXRYID0gbV9ydEVuZ2luZS5sZWZ0IC0gbV9mU2Nyb2xsT2Zmc2V0WDsNCisgIEZYX0ZMT0FUIGZPZmZTZXRZID0gbV9ydEVuZ2luZS50b3AgLSBtX2ZTY3JvbGxPZmZzZXRZICsgbV9mVkFsaWduT2Zmc2V0Ow0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NTcGVsbDsNCisgIHRoaXMtPkdldFRleHQod3NTcGVsbCk7DQorICBpbnQzMl90IG5Db250ZW50TGVuID0gd3NTcGVsbC5HZXRMZW5ndGgoKTsNCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvbnRlbnRMZW47IGkrKykgew0KKyAgICBpZiAoRlhfRURJVF9JU0xBVElOV09SRCh3c1NwZWxsW2ldKSkgew0KKyAgICAgIGlmIChzTGF0aW5Xb3JkLklzRW1wdHkoKSkgew0KKyAgICAgICAgblN0YXJ0ID0gaTsNCisgICAgICB9DQorICAgICAgc0xhdGluV29yZCArPSAoRlhfQ0hBUil3c1NwZWxsW2ldOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGNoZWNrV29yZEV2ZW50LmJzV29yZCA9IHNMYXRpbldvcmQ7DQorICAgICAgY2hlY2tXb3JkRXZlbnQuYkNoZWNrV29yZCA9IFRSVUU7DQorICAgICAgRGlzcGF0Y2hFdmVudCgmY2hlY2tXb3JkRXZlbnQpOw0KKyAgICAgIGlmICghc0xhdGluV29yZC5Jc0VtcHR5KCkgJiYgIWNoZWNrV29yZEV2ZW50LmJDaGVja1dvcmQpIHsNCisgICAgICAgIEFkZFNwZWxsQ2hlY2tPYmoocGF0aFNwZWxsLCBuU3RhcnQsIHNMYXRpbldvcmQuR2V0TGVuZ3RoKCksIGZPZmZTZXRYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBmT2ZmU2V0WSk7DQorICAgICAgfQ0KKyAgICAgIHNMYXRpbldvcmQuRW1wdHkoKTsNCisgICAgfQ0KKyAgfQ0KKyAgY2hlY2tXb3JkRXZlbnQuYnNXb3JkID0gc0xhdGluV29yZDsNCisgIGNoZWNrV29yZEV2ZW50LmJDaGVja1dvcmQgPSBUUlVFOw0KKyAgRGlzcGF0Y2hFdmVudCgmY2hlY2tXb3JkRXZlbnQpOw0KKyAgaWYgKCFzTGF0aW5Xb3JkLklzRW1wdHkoKSAmJiAhY2hlY2tXb3JkRXZlbnQuYkNoZWNrV29yZCkgew0KKyAgICBBZGRTcGVsbENoZWNrT2JqKHBhdGhTcGVsbCwgblN0YXJ0LCBzTGF0aW5Xb3JkLkdldExlbmd0aCgpLCBmT2ZmU2V0WCwNCisgICAgICAgICAgICAgICAgICAgICBmT2ZmU2V0WSk7DQorICB9DQorICBpZiAoIXBhdGhTcGVsbC5Jc0VtcHR5KCkpIHsNCisgICAgQ0ZYX1JlY3RGIHJ0Q2xpcCA9IG1fcnRFbmdpbmU7DQorICAgIENGWF9NYXRyaXggbXQ7DQorICAgIG10LlNldCgxLCAwLCAwLCAxLCBmT2ZmU2V0WCwgZk9mZlNldFkpOw0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybVJlY3QocnRDbGlwKTsNCisgICAgICBtdC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgICB9DQorICAgIHBHcmFwaGljcy0+U2V0Q2xpcFJlY3QocnRDbGlwKTsNCisgICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY3JMaW5lKTsNCisgICAgcEdyYXBoaWNzLT5TZXRMaW5lV2lkdGgoMCk7DQorICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aFNwZWxsLCBOVUxMKTsNCisgIH0NCisgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgaWYgKCFwR3JhcGhpY3MpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBpZiAobV9ydENsaWVudC5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIH0NCisgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgIGlmICghbV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgIERyYXdUZXh0QmsocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgaWYgKG1fcEVkdEVuZ2luZSkgew0KKyAgICBEcmF3Q29udGVudChwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQorICB9DQorICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgJiYNCisgICAgICAhKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5KSkgew0KKyAgICBEcmF3U3BlbGxDaGVjayhwR3JhcGhpY3MsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgaWYgKEhhc0JvcmRlcigpKSB7DQorICAgIERyYXdCb3JkZXIocEdyYXBoaWNzLCBGV0xfUEFSVF9FRFRfQm9yZGVyLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgaWYgKEhhc0VkZ2UoKSkgew0KKyAgICBEcmF3RWRnZShwR3JhcGhpY3MsIEZXTF9QQVJUX0VEVF9FZGdlLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdEltcDo6U2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZVByb3ZpZGVyKSB7DQorICBpZiAoIXBUaGVtZVByb3ZpZGVyKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgaWYgKG1fcEhvcnpTY3JvbGxCYXIpIHsNCisgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0VGhlbWVQcm92aWRlcihwVGhlbWVQcm92aWRlcik7DQorICB9DQorICBpZiAobV9wVmVydFNjcm9sbEJhcikgew0KKyAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRUaGVtZVByb3ZpZGVyKHBUaGVtZVByb3ZpZGVyKTsNCisgIH0NCisgIGlmIChtX3BDYXJldCkgew0KKyAgICBtX3BDYXJldC0+U2V0VGhlbWVQcm92aWRlcihwVGhlbWVQcm92aWRlcik7DQorICB9DQorICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gcFRoZW1lUHJvdmlkZXI7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIG1fcEVkdEVuZ2luZS0+U2V0VGV4dCh3c1RleHQpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitpbnQzMl90IENGV0xfRWRpdEltcDo6R2V0VGV4dExlbmd0aCgpIGNvbnN0IHsNCisgIGlmICghbV9wRWR0RW5naW5lKQ0KKyAgICByZXR1cm4gLTE7DQorICByZXR1cm4gbV9wRWR0RW5naW5lLT5HZXRUZXh0TGVuZ3RoKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpHZXRUZXh0KENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQpIGNvbnN0IHsNCisgIGlmICghbV9wRWR0RW5naW5lKQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICBtX3BFZHRFbmdpbmUtPkdldFRleHQod3NUZXh0LCBuU3RhcnQsIG5Db3VudCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpDbGVhclRleHQoKSB7DQorICBpZiAoIW1fcEVkdEVuZ2luZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgbV9wRWR0RW5naW5lLT5DbGVhclRleHQoKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQoraW50MzJfdCBDRldMX0VkaXRJbXA6OkdldENhcmV0UG9zKCkgY29uc3Qgew0KKyAgaWYgKCFtX3BFZHRFbmdpbmUpDQorICAgIHJldHVybiAtMTsNCisgIHJldHVybiBtX3BFZHRFbmdpbmUtPkdldENhcmV0UG9zKCk7DQorfQ0KK2ludDMyX3QgQ0ZXTF9FZGl0SW1wOjpTZXRDYXJldFBvcyhpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiQmVmb3JlKSB7DQorICBpZiAoIW1fcEVkdEVuZ2luZSkNCisgICAgcmV0dXJuIC0xOw0KKyAgcmV0dXJuIG1fcEVkdEVuZ2luZS0+U2V0Q2FyZXRQb3MobkluZGV4LCBiQmVmb3JlKTsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OkFkZFNlbFJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCkgew0KKyAgaWYgKCFtX3BFZHRFbmdpbmUpDQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIG1fcEVkdEVuZ2luZS0+QWRkU2VsUmFuZ2UoblN0YXJ0LCBuQ291bnQpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitpbnQzMl90IENGV0xfRWRpdEltcDo6Q291bnRTZWxSYW5nZXMoKSB7DQorICBpZiAoIW1fcEVkdEVuZ2luZSkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gbV9wRWR0RW5naW5lLT5Db3VudFNlbFJhbmdlcygpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitpbnQzMl90IENGV0xfRWRpdEltcDo6R2V0U2VsUmFuZ2UoaW50MzJfdCBuSW5kZXgsIGludDMyX3QmIG5TdGFydCkgew0KKyAgaWYgKCFtX3BFZHRFbmdpbmUpDQorICAgIHJldHVybiAtMTsNCisgIHJldHVybiBtX3BFZHRFbmdpbmUtPkdldFNlbFJhbmdlKG5JbmRleCwgblN0YXJ0KTsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OkNsZWFyU2VsZWN0aW9ucygpIHsNCisgIGlmICghbV9wRWR0RW5naW5lKQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICBtX3BFZHRFbmdpbmUtPkNsZWFyU2VsZWN0aW9uKCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK2ludDMyX3QgQ0ZXTF9FZGl0SW1wOjpHZXRMaW1pdCgpIHsNCisgIHJldHVybiBtX25MaW1pdDsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OlNldExpbWl0KGludDMyX3QgbkxpbWl0KSB7DQorICBtX25MaW1pdCA9IG5MaW1pdDsNCisgIGlmICghbV9wRWR0RW5naW5lKQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICBtX3BFZHRFbmdpbmUtPlNldExpbWl0KG5MaW1pdCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpTZXRBbGlhc0NoYXIoRlhfV0NIQVIgd0FsaWFzKSB7DQorICBpZiAoIW1fcEVkdEVuZ2luZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIG1fcEVkdEVuZ2luZS0+U2V0QWxpYXNDaGFyKHdBbGlhcyk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpTZXRGb3JtYXRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0KSB7DQorICBpZiAoIW1fcEVkdEVuZ2luZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgbV9wRWR0RW5naW5lLT5TZXRGb3JtYXRCbG9jaygwLCB3c0Zvcm1hdCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpJbnNlcnQoaW50MzJfdCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuKSB7DQorICBpZiAoIW1fcEVkdEVuZ2luZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seSkgfHwNCisgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIH0NCisgIG1fcEVkdEVuZ2luZS0+SW5zZXJ0KG5TdGFydCwgbHBUZXh0LCBuTGVuKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OkRlbGV0ZVNlbGVjdGlvbnMoKSB7DQorICBpZiAoIW1fcEVkdEVuZ2luZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgaW50MzJfdCBpQ291bnQgPSBtX3BFZHRFbmdpbmUtPkNvdW50U2VsUmFuZ2VzKCk7DQorICBpZiAoaUNvdW50ID4gMCkgew0KKyAgICBtX3BFZHRFbmdpbmUtPkRlbGV0ZSgtMSk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0SW1wOjpEZWxldGVSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQpIHsNCisgIGlmICghbV9wRWR0RW5naW5lKQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICBtX3BFZHRFbmdpbmUtPkRlbGV0ZVJhbmdlKG5TdGFydCwgbkNvdW50KTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OlJlcGxhY2VTZWxlY3Rpb25zKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NSZXBsYWNlKSB7DQorICBpZiAoIW1fcEVkdEVuZ2luZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgaW50MzJfdCBpQ291bnQgPSBtX3BFZHRFbmdpbmUtPkNvdW50U2VsUmFuZ2VzKCk7DQorICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIGludDMyX3QgblN0YXJ0Ow0KKyAgICBpbnQzMl90IG5Db3VudCA9IG1fcEVkdEVuZ2luZS0+R2V0U2VsUmFuZ2UoaSwgblN0YXJ0KTsNCisgICAgbV9wRWR0RW5naW5lLT5SZXBsYWNlKG5TdGFydCwgbkNvdW50LCB3c1JlcGxhY2UpOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdEltcDo6UmVwbGFjZShpbnQzMl90IG5TdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1JlcGxhY2UpIHsNCisgIGlmICghbV9wRWR0RW5naW5lKQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICBtX3BFZHRFbmdpbmUtPlJlcGxhY2UoblN0YXJ0LCBuTGVuLCB3c1JlcGxhY2UpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdEltcDo6RG9DbGlwYm9hcmQoaW50MzJfdCBpQ21kKSB7DQorICBpZiAoIW1fcEVkdEVuZ2luZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seSkgfHwNCisgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KKyAgSUZXTF9BZGFwdGVyTmF0aXZlKiBwTmF0aXZlID0gRldMX0dldEFkYXB0ZXJOYXRpdmUoKTsNCisgIGlmICghcE5hdGl2ZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIElGV0xfQWRhcHRlckNsaXBib2FyZE1nciogcENsaXBCb3JkZXIgPSBwTmF0aXZlLT5HZXRDbGlwYm9hcmRNZ3IoKTsNCisgIGlmICghcENsaXBCb3JkZXIpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICBzd2l0Y2ggKGlDbWQpIHsNCisgICAgY2FzZSAxOiB7DQorICAgICAgaW50MzJfdCBuU3RhcnQ7DQorICAgICAgaW50MzJfdCBuQ291bnQgPSBtX3BFZHRFbmdpbmUtPkdldFNlbFJhbmdlKDAsIG5TdGFydCk7DQorICAgICAgaWYgKG5Db3VudCA8IDEpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBtX3BFZHRFbmdpbmUtPkdldFRleHQod3NUZXh0LCBuU3RhcnQsIG5Db3VudCk7DQorICAgICAgcENsaXBCb3JkZXItPlNldFN0cmluZ0RhdGEod3NUZXh0KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIDI6IHsNCisgICAgICBpbnQzMl90IG5TdGFydDsNCisgICAgICBpbnQzMl90IG5Db3VudCA9IG1fcEVkdEVuZ2luZS0+R2V0U2VsUmFuZ2UoMCwgblN0YXJ0KTsNCisgICAgICBpZiAobkNvdW50IDwgMSkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIG1fcEVkdEVuZ2luZS0+R2V0VGV4dCh3c1RleHQsIG5TdGFydCwgbkNvdW50KTsNCisgICAgICBtX3BFZHRFbmdpbmUtPkRlbGV0ZVJhbmdlKG5TdGFydCwgbkNvdW50KTsNCisgICAgICBtX3BFZHRFbmdpbmUtPkNsZWFyU2VsZWN0aW9uKCk7DQorICAgICAgcENsaXBCb3JkZXItPlNldFN0cmluZ0RhdGEod3NUZXh0KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIDM6IHsNCisgICAgICBwQ2xpcEJvcmRlci0+R2V0U3RyaW5nRGF0YSh3c1RleHQpOw0KKyAgICAgIGludDMyX3QgaUxlbiA9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCisgICAgICBpZiAoaUxlbiA8IDApIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBpZiAod3NUZXh0W2lMZW5dID09IEwnXDAnKSB7DQorICAgICAgICBpZiAoaUxlbiA9PSAxKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaUxlbi0tOw0KKyAgICAgICAgd3NUZXh0ID0gd3NUZXh0LkxlZnQoaUxlbik7DQorICAgICAgfQ0KKyAgICAgIGludDMyX3QgblBvcyA9IG1fcEVkdEVuZ2luZS0+R2V0Q2FyZXRQb3MoKTsNCisgICAgICBtX3BFZHRFbmdpbmUtPkluc2VydChuUG9zLCB3c1RleHQsIGlMZW4pOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0SW1wOjpDb3B5KENGWF9XaWRlU3RyaW5nJiB3c0NvcHkpIHsNCisgIGlmICghbV9wRWR0RW5naW5lKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBpbnQzMl90IG5Db3VudCA9IG1fcEVkdEVuZ2luZS0+Q291bnRTZWxSYW5nZXMoKTsNCisgIGlmIChuQ291bnQgPT0gMCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB3c0NvcHkuRW1wdHkoKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsNCisgIGludDMyX3QgblN0YXJ0LCBuTGVuZ3RoOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsNCisgICAgbkxlbmd0aCA9IG1fcEVkdEVuZ2luZS0+R2V0U2VsUmFuZ2UoaSwgblN0YXJ0KTsNCisgICAgbV9wRWR0RW5naW5lLT5HZXRUZXh0KHdzVGVtcCwgblN0YXJ0LCBuTGVuZ3RoKTsNCisgICAgd3NDb3B5ICs9IHdzVGVtcDsNCisgICAgd3NUZW1wLkVtcHR5KCk7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX0VkaXRJbXA6OkN1dChDRlhfV2lkZVN0cmluZyYgd3NDdXQpIHsNCisgIGlmICghbV9wRWR0RW5naW5lKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBpbnQzMl90IG5Db3VudCA9IG1fcEVkdEVuZ2luZS0+Q291bnRTZWxSYW5nZXMoKTsNCisgIGlmIChuQ291bnQgPT0gMCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB3c0N1dC5FbXB0eSgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KKyAgaW50MzJfdCBuU3RhcnQsIG5MZW5ndGg7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICBuTGVuZ3RoID0gbV9wRWR0RW5naW5lLT5HZXRTZWxSYW5nZShpLCBuU3RhcnQpOw0KKyAgICBtX3BFZHRFbmdpbmUtPkdldFRleHQod3NUZW1wLCBuU3RhcnQsIG5MZW5ndGgpOw0KKyAgICB3c0N1dCArPSB3c1RlbXA7DQorICAgIHdzVGVtcC5FbXB0eSgpOw0KKyAgfQ0KKyAgbV9wRWR0RW5naW5lLT5EZWxldGUoMCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX0VkaXRJbXA6OlBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1Bhc3RlKSB7DQorICBpZiAoIW1fcEVkdEVuZ2luZSkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgaW50MzJfdCBuQ2FyZXQgPSBtX3BFZHRFbmdpbmUtPkdldENhcmV0UG9zKCk7DQorICBpbnQzMl90IGlFcnJvciA9DQorICAgICAgbV9wRWR0RW5naW5lLT5JbnNlcnQobkNhcmV0LCB3c1Bhc3RlLmNfc3RyKCksIHdzUGFzdGUuR2V0TGVuZ3RoKCkpOw0KKyAgaWYgKGlFcnJvciA8IDApIHsNCisgICAgUHJvY2Vzc0luc2VydEVycm9yKGlFcnJvcik7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGV0xfRWRpdEltcDo6RGVsZXRlKCkgew0KKyAgaWYgKCFtX3BFZHRFbmdpbmUpDQorICAgIHJldHVybiBGQUxTRTsNCisgIGludDMyX3QgbkNvdW50ID0gbV9wRWR0RW5naW5lLT5Db3VudFNlbFJhbmdlcygpOw0KKyAgaWYgKG5Db3VudCA8IDEpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9wRWR0RW5naW5lLT5EZWxldGUoMCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX0VkaXRJbXA6OlJlZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCkgew0KKyAgaWYgKCFtX3BFZHRFbmdpbmUpDQorICAgIHJldHVybiBGQUxTRTsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9Ob1JlZG9VbmRvKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcEVkdEVuZ2luZS0+UmVkbyhic1JlY29yZCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0SW1wOjpVbmRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZWNvcmQpIHsNCisgIGlmICghbV9wRWR0RW5naW5lKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfTm9SZWRvVW5kbykgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBtX3BFZHRFbmdpbmUtPlVuZG8oYnNSZWNvcmQpOw0KK30NCitGWF9CT09MIENGV0xfRWRpdEltcDo6VW5kbygpIHsNCisgIGlmICghQ2FuVW5kbygpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGWF9CeXRlU3RyaW5nIGJzUmVjb3JkID0gbV9SZWNvcmRBcnJbbV9pQ3VyUmVjb3JkLS1dOw0KKyAgcmV0dXJuIFVuZG8oYnNSZWNvcmQpOw0KK30NCitGWF9CT09MIENGV0xfRWRpdEltcDo6UmVkbygpIHsNCisgIGlmICghQ2FuUmVkbygpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGWF9CeXRlU3RyaW5nIGJzUmVjb3JkID0gbV9SZWNvcmRBcnJbKyttX2lDdXJSZWNvcmRdOw0KKyAgcmV0dXJuIFJlZG8oYnNSZWNvcmQpOw0KK30NCitGWF9CT09MIENGV0xfRWRpdEltcDo6Q2FuVW5kbygpIHsNCisgIHJldHVybiBtX2lDdXJSZWNvcmQgPj0gMDsNCit9DQorRlhfQk9PTCBDRldMX0VkaXRJbXA6OkNhblJlZG8oKSB7DQorICByZXR1cm4gbV9pQ3VyUmVjb3JkIDwgbV9SZWNvcmRBcnIuR2V0U2l6ZSgpIC0gMTsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OlNldFRhYldpZHRoKEZYX0ZMT0FUIGZUYWJXaWR0aCwgRlhfQk9PTCBiRXF1aWRpc3RhbnQpIHsNCisgIGlmICghbV9wRWR0RW5naW5lKQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICBGREVfTFBUWFRFRFRQQVJBTVMgcFBhcmFtcyA9DQorICAgICAgKEZERV9MUFRYVEVEVFBBUkFNUyltX3BFZHRFbmdpbmUtPkdldEVkaXRQYXJhbXMoKTsNCisgIHBQYXJhbXMtPmZUYWJXaWR0aCA9IGZUYWJXaWR0aDsNCisgIHBQYXJhbXMtPmJUYWJFcXVpZGlzdGFudCA9IGJFcXVpZGlzdGFudDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OlNldE91dGVyKElGV0xfV2lkZ2V0KiBwT3V0ZXIpIHsNCisgIG1fcE91dGVyID0gcE91dGVyOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdEltcDo6U2V0TnVtYmVyUmFuZ2UoaW50MzJfdCBpTWluLCBpbnQzMl90IGlNYXgpIHsNCisgIG1faU1pbiA9IGlNaW47DQorICBtX2lNYXggPSBpTWF4Ow0KKyAgbV9iU2V0UmFuZ2UgPSBUUlVFOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCit2b2lkIENGV0xfRWRpdEltcDo6T25fQ2FyZXRDaGFuZ2VkKElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblBhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJWaXNpYmxlKSB7DQorICBpZiAobV9ydEVuZ2luZS5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpID09IDApIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfQk9PTCBiUmVwYWludENvbnRlbnQgPSBVcGRhdGVPZmZzZXQoKTsNCisgIFVwZGF0ZUNhcmV0KCk7DQorICBDRlhfUmVjdEYgcnRJbnZhbGlkOw0KKyAgcnRJbnZhbGlkLlNldCgwLCAwLCAwLCAwKTsNCisgIEZYX0JPT0wgYlJlcGFpbnRTY3JvbGwgPSBGQUxTRTsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9NdWx0aUxpbmUpIHsNCisgICAgSUZXTF9TY3JvbGxCYXIqIHBTY3JvbGwgPSBVcGRhdGVTY3JvbGwoKTsNCisgICAgaWYgKHBTY3JvbGwpIHsNCisgICAgICBwU2Nyb2xsLT5HZXRXaWRnZXRSZWN0KHJ0SW52YWxpZCk7DQorICAgICAgYlJlcGFpbnRTY3JvbGwgPSBUUlVFOw0KKyAgICB9DQorICB9DQorICBpZiAoYlJlcGFpbnRDb250ZW50IHx8IGJSZXBhaW50U2Nyb2xsKSB7DQorICAgIGlmIChiUmVwYWludENvbnRlbnQpIHsNCisgICAgICBydEludmFsaWQuVW5pb24obV9ydEVuZ2luZSk7DQorICAgIH0NCisgICAgUmVwYWludCgmcnRJbnZhbGlkKTsNCisgIH0NCit9DQordm9pZCBDRldMX0VkaXRJbXA6Ok9uX1RleHRDaGFuZ2VkKElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX1RYVEVEVF9URVhUQ0hBTkdFX0lORk8mIENoYW5nZUluZm8pIHsNCisgIEZYX0RXT1JEIGR3U3R5bGVFeCA9IG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXM7DQorICBpZiAoZHdTdHlsZUV4ICYgRldMX1NUWUxFRVhUX0VEVF9WQWxpZ25NYXNrKSB7DQorICAgIFVwZGF0ZVZBbGlnbm1lbnQoKTsNCisgIH0NCisgIElGREVfVHh0RWR0UGFnZSogcGFnZSA9IG1fcEVkdEVuZ2luZS0+R2V0UGFnZSgwKTsNCisgIEZYX0ZMT0FUIGZDb250ZW50V2lkdGggPSBwYWdlLT5HZXRDb250ZW50c0JveCgpLndpZHRoOw0KKyAgRlhfRkxPQVQgZkNvbnRlbnRIZWlnaHQgPSBwYWdlLT5HZXRDb250ZW50c0JveCgpLmhlaWdodDsNCisgIENGWF9SZWN0RiBydFRlbXA7DQorICBHZXRDbGllbnRSZWN0KHJ0VGVtcCk7DQorICBGWF9CT09MIGJIU2VsZkFkYXB0aW9uID0NCisgICAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9IU2VsZkFkYXB0aW9uOw0KKyAgRlhfQk9PTCBiVlNlbGZBZGFwdGlvbiA9DQorICAgICAgbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfVlNlbGZBZGFwdGlvbjsNCisgIEZYX0JPT0wgYk5lZWRVcGRhdGUgPSBGQUxTRTsNCisgIGlmIChiSFNlbGZBZGFwdGlvbiB8fCBiVlNlbGZBZGFwdGlvbikgew0KKyAgICBDRldMX0V2dEVkdFByZVNlbGZBZGFwdGlvbiBldnQ7DQorICAgIGV2dC5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIGV2dC5iSFNlbGZBZGFwdGlvbiA9IFRSVUU7DQorICAgIGV2dC5iVlNlbGZBZGFwdGlvbiA9IFRSVUU7DQorICAgIEZYX0ZMT0FUIGZXaWR0aDsNCisgICAgRlhfRkxPQVQgZkhpZ2h0Ow0KKyAgICBmV2lkdGggPSBiSFNlbGZBZGFwdGlvbiA/IGZDb250ZW50V2lkdGggOiBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LndpZHRoOw0KKyAgICBmSGlnaHQgPSBiVlNlbGZBZGFwdGlvbiA/IGZDb250ZW50SGVpZ2h0IDogbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQ7DQorICAgIGV2dC5ydEFmdGVyQ2hhbmdlLlNldCgwLCAwLCBmV2lkdGgsIGZIaWdodCk7DQorICAgIERpc3BhdGNoRXZlbnQoJmV2dCk7DQorICAgIGlmICghZXZ0LmJIU2VsZkFkYXB0aW9uKSB7DQorICAgICAgTW9kaWZ5U3R5bGVzRXgoDQorICAgICAgICAgIDAsIEZXTF9TVFlMRUVYVF9FRFRfSFNlbGZBZGFwdGlvbiB8IEZXTF9TVFlMRUVYVF9FRFRfQXV0b0hTY3JvbGwpOw0KKyAgICB9DQorICAgIGlmICghZXZ0LmJWU2VsZkFkYXB0aW9uKSB7DQorICAgICAgTW9kaWZ5U3R5bGVzRXgoDQorICAgICAgICAgIDAsIEZXTF9TVFlMRUVYVF9FRFRfVlNlbGZBZGFwdGlvbiB8IEZXTF9TVFlMRUVYVF9FRFRfQXV0b1ZTY3JvbGwpOw0KKyAgICB9DQorICAgIGJOZWVkVXBkYXRlID0gKGJIU2VsZkFkYXB0aW9uICYmICFldnQuYkhTZWxmQWRhcHRpb24pIHx8DQorICAgICAgICAgICAgICAgICAgKGJWU2VsZkFkYXB0aW9uICYmICFldnQuYlZTZWxmQWRhcHRpb24pOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZkNvbnRlbnRXaWR0aDEgPSBmQ29udGVudFdpZHRoOw0KKyAgRlhfRkxPQVQgZkNvbnRlbnRIZWlnaHQxID0gZkNvbnRlbnRIZWlnaHQ7DQorICBpZiAoYk5lZWRVcGRhdGUpIHsNCisgICAgVXBkYXRlRWRpdFBhcmFtcygpOw0KKyAgICBVcGRhdGVFZGl0TGF5b3V0KCk7DQorICAgIElGREVfVHh0RWR0UGFnZSogcGFnZTEgPSBtX3BFZHRFbmdpbmUtPkdldFBhZ2UoMCk7DQorICAgIGZDb250ZW50V2lkdGgxID0gcGFnZTEtPkdldENvbnRlbnRzQm94KCkud2lkdGg7DQorICAgIGZDb250ZW50SGVpZ2h0MSA9IHBhZ2UxLT5HZXRDb250ZW50c0JveCgpLmhlaWdodDsNCisgIH0NCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9IU2VsZkFkYXB0aW9uKSB7DQorICAgIHJ0VGVtcC53aWR0aCA9IHN0ZDo6bWF4KG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGgsIGZDb250ZW50V2lkdGgxKTsNCisgICAgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aCA9IGZDb250ZW50V2lkdGgxOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1ZTZWxmQWRhcHRpb24pIHsNCisgICAgcnRUZW1wLmhlaWdodCA9IHN0ZDo6bWF4KG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0LCBmQ29udGVudEhlaWdodDEpOw0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodCA9IGZDb250ZW50SGVpZ2h0MTsNCisgIH0NCisgIENGV0xfRXZ0RWR0VGV4dENoYW5nZWQgZXZlbnQ7DQorICBldmVudC5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBldmVudC5uQ2hhbmdlVHlwZSA9IENoYW5nZUluZm8ubkNoYW5nZVR5cGU7DQorICBldmVudC53c0luc2VydCA9IENoYW5nZUluZm8ud3NJbnNlcnQ7DQorICBldmVudC53c0RlbGV0ZSA9IENoYW5nZUluZm8ud3NEZWxldGU7DQorICBldmVudC53c1ByZXZUZXh0ID0gQ2hhbmdlSW5mby53c1ByZXZUZXh0Ow0KKyAgRGlzcGF0Y2hFdmVudCgmZXZlbnQpOw0KKyAgTGF5b3V0U2Nyb2xsQmFyKCk7DQorICBSZXBhaW50KCZydFRlbXApOw0KK30NCit2b2lkIENGV0xfRWRpdEltcDo6T25fU2VsQ2hhbmdlZChJRkRFX1R4dEVkdEVuZ2luZSogcEVkaXQpIHsNCisgIENGWF9SZWN0RiBydFRlbXA7DQorICBHZXRDbGllbnRSZWN0KHJ0VGVtcCk7DQorICBSZXBhaW50KCZydFRlbXApOw0KK30NCitGWF9CT09MIENGV0xfRWRpdEltcDo6T25fUGFnZUxvYWQoSUZERV9UeHRFZHRFbmdpbmUqIHBFZGl0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5QYWdlSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblB1cnBvc2UpIHsNCisgIElGREVfVHh0RWR0RW5naW5lKiBwRWR0RW5naW5lID0gbV9wRWR0RW5naW5lOw0KKyAgSUZERV9UeHRFZHRQYWdlKiBwUGFnZSA9IHBFZHRFbmdpbmUtPkdldFBhZ2UoblBhZ2VJbmRleCk7DQorICBpZiAoIXBQYWdlKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBwUGFnZS0+TG9hZFBhZ2UoKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGV0xfRWRpdEltcDo6T25fUGFnZVVubG9hZChJRkRFX1R4dEVkdEVuZ2luZSogcEVkaXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuUGFnZUluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblB1cnBvc2UpIHsNCisgIElGREVfVHh0RWR0RW5naW5lKiBwRWR0RW5naW5lID0gbV9wRWR0RW5naW5lOw0KKyAgSUZERV9UeHRFZHRQYWdlKiBwUGFnZSA9IHBFZHRFbmdpbmUtPkdldFBhZ2UoblBhZ2VJbmRleCk7DQorICBpZiAoIXBQYWdlKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBwUGFnZS0+VW5sb2FkUGFnZSgpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wOjpPbl9BZGREb1JlY29yZChJRkRFX1R4dEVkdEVuZ2luZSogcEVkaXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCkgew0KKyAgQWRkRG9SZWNvcmQoYnNEb1JlY29yZCk7DQorICBDRldMX1dpZGdldEltcCogcFNyY1RhcmdldCA9IEdldFJvb3RPdXRlcigpOw0KKyAgaWYgKCFwU3JjVGFyZ2V0KSB7DQorICAgIHBTcmNUYXJnZXQgPSB0aGlzOw0KKyAgfQ0KKyAgQ0ZXTF9FdnRFZHRBZGREb1JlY29yZCBldnQ7DQorICBldnQubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgZXZ0Lm1fd3NEb1JlY29yZCA9IGJzRG9SZWNvcmQ7DQorICBtX3BEZWxlZ2F0ZS0+T25Qcm9jZXNzRXZlbnQoJmV2dCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0SW1wOjpPbl9WYWxpZGF0ZUZpZWxkKElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5CbG9ja0luZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZpZWxkSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRmllbGRUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJJbmRleCkgew0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0SW1wOjpPbl9WYWxpZGF0ZUJsb2NrKElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5CbG9ja0luZGV4KSB7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX0VkaXRJbXA6Ok9uX0dldEJsb2NrRm9ybWF0VGV4dChJRkRFX1R4dEVkdEVuZ2luZSogcEVkaXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5CbG9ja0luZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQmxvY2tUZXh0KSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0SW1wOjpPbl9WYWxpZGF0ZShJRkRFX1R4dEVkdEVuZ2luZSogcEVkaXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIElGV0xfV2lkZ2V0KiBwRHN0ID0gR2V0T3V0ZXIoKTsNCisgIGlmICghcERzdCkgew0KKyAgICBwRHN0ID0gbV9wSW50ZXJmYWNlOw0KKyAgfQ0KKyAgQ0ZXTF9FdnRFZHRWYWxpZGF0ZSBldmVudDsNCisgIGV2ZW50LnBEc3RXaWRnZXQgPSBwRHN0Ow0KKyAgZXZlbnQubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgZXZlbnQud3NJbnNlcnQgPSB3c1RleHQ7DQorICBldmVudC5iVmFsaWRhdGUgPSBUUlVFOw0KKyAgRGlzcGF0Y2hFdmVudCgmZXZlbnQpOw0KKyAgcmV0dXJuIGV2ZW50LmJWYWxpZGF0ZTsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OlNldEJhY2tncm91bmRDb2xvcihGWF9EV09SRCBjb2xvcikgew0KKyAgbV9iYWNrQ29sb3IgPSBjb2xvcjsNCisgIG1fdXBkYXRlQmFja0NvbG9yID0gVFJVRTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXA6OlNldEZvbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9udCwgRlhfRkxPQVQgZlNpemUpIHsNCisgIG1fd3NGb250ID0gd3NGb250Ow0KKyAgbV9mRm9udFNpemUgPSBmU2l6ZTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQordm9pZCBDRldMX0VkaXRJbXA6OlNldFNjcm9sbE9mZnNldChGWF9GTE9BVCBmU2Nyb2xsT2Zmc2V0KSB7DQorICBtX2ZTY3JvbGxPZmZzZXRZID0gZlNjcm9sbE9mZnNldDsNCit9DQordm9pZCBDRldMX0VkaXRJbXA6OkRyYXdUZXh0QmsoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRURUX0JhY2tncm91bmQ7DQorICBwYXJhbS5tX2R3RGF0YSA9IEZXTF9QQVJUREFUQV9FRFRfQmFja2dyb3VuZDsNCisgIHBhcmFtLm1fZHdTdGF0ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICA/IEZXTF9QQVJUU1RBVEVfRURUX1JlYWRPbmx5DQorICAgICAgICAgICAgICAgICAgICAgICAgIDogRldMX1BBUlRTVEFURV9FRFRfTm9ybWFsOw0KKyAgRlhfRFdPUkQgZHdTdGF0ZXMgPSAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCk7DQorICBpZiAoZHdTdGF0ZXMpIHsNCisgICAgcGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfRURUX0Rpc2FibGU7DQorICB9DQorICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgIHBhcmFtLm1fbWF0cml4ID0gKnBNYXRyaXg7DQorICBwYXJhbS5tX3J0UGFydCA9IG1fcnRDbGllbnQ7DQorICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorICBpZiAoIUlzU2hvd1Njcm9sbEJhcihUUlVFKSB8fCAhSXNTaG93U2Nyb2xsQmFyKEZBTFNFKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfUmVjdEYgcnRTY29ybGw7DQorICBtX3BIb3J6U2Nyb2xsQmFyLT5HZXRXaWRnZXRSZWN0KHJ0U2NvcmxsKTsNCisgIENGWF9SZWN0RiBydFN0YXRpYzsNCisgIHJ0U3RhdGljLlNldChtX3J0Q2xpZW50LnJpZ2h0KCkgLSBydFNjb3JsbC5oZWlnaHQsDQorICAgICAgICAgICAgICAgbV9ydENsaWVudC5ib3R0b20oKSAtIHJ0U2NvcmxsLmhlaWdodCwgcnRTY29ybGwuaGVpZ2h0LA0KKyAgICAgICAgICAgICAgIHJ0U2NvcmxsLmhlaWdodCk7DQorICBwYXJhbS5tX2R3RGF0YSA9IEZXTF9QQVJUREFUQV9FRFRfU3RhdGljQmFja2dyb3VuZDsNCisgIHBhcmFtLm1fcnRQYXJ0ID0gcnRTdGF0aWM7DQorICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wOjpEcmF3Q29udGVudChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIGlmICghbV9wRWR0RW5naW5lKQ0KKyAgICByZXR1cm47DQorICBJRkRFX1R4dEVkdFBhZ2UqIHBQYWdlID0gbV9wRWR0RW5naW5lLT5HZXRQYWdlKDApOw0KKyAgaWYgKCFwUGFnZSkNCisgICAgcmV0dXJuOw0KKyAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX0NvbWJUZXh0KSB7DQorICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgIH0NCisgIENGWF9SZWN0RiBydENsaXAgPSBtX3J0RW5naW5lOw0KKyAgRlhfRkxPQVQgZk9mZlNldFggPSBtX3J0RW5naW5lLmxlZnQgLSBtX2ZTY3JvbGxPZmZzZXRYOw0KKyAgRlhfRkxPQVQgZk9mZlNldFkgPSBtX3J0RW5naW5lLnRvcCAtIG1fZlNjcm9sbE9mZnNldFkgKyBtX2ZWQWxpZ25PZmZzZXQ7DQorICBDRlhfTWF0cml4IG10Ow0KKyAgbXQuU2V0KDEsIDAsIDAsIDEsIGZPZmZTZXRYLCBmT2ZmU2V0WSk7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBwTWF0cml4LT5UcmFuc2Zvcm1SZWN0KHJ0Q2xpcCk7DQorICAgIG10LkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBGWF9CT09MIGJTaG93U2VsID0NCisgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfTm9IaWRlU2VsKSB8fA0KKyAgICAgIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpOw0KKyAgaWYgKGJTaG93U2VsKSB7DQorICAgIElGV0xfV2lkZ2V0KiBwRm9ybSA9DQorICAgICAgICBtX3BXaWRnZXRNZ3ItPkdldFdpZGdldChtX3BJbnRlcmZhY2UsIEZXTF9XR1RSRUxBVElPTl9TeXN0ZW1Gb3JtKTsNCisgICAgaWYgKHBGb3JtKSB7DQorICAgICAgYlNob3dTZWwgPSAocEZvcm0tPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0RlYWN0aXZhdGVkKSAhPQ0KKyAgICAgICAgICAgICAgICAgRldMX1dHVFNUQVRFX0RlYWN0aXZhdGVkOw0KKyAgICB9DQorICB9DQorICBpbnQzMl90IG5TZWxDb3VudCA9IG1fcEVkdEVuZ2luZS0+Q291bnRTZWxSYW5nZXMoKTsNCisgIGlmIChiU2hvd1NlbCAmJiBuU2VsQ291bnQgPiAwKSB7DQorICAgIGludDMyX3QgblBhZ2VDaGFyU3RhcnQgPSBwUGFnZS0+R2V0Q2hhclN0YXJ0KCk7DQorICAgIGludDMyX3QgblBhZ2VDaGFyQ291bnQgPSBwUGFnZS0+R2V0Q2hhckNvdW50KCk7DQorICAgIGludDMyX3QgblBhZ2VDaGFyRW5kID0gblBhZ2VDaGFyU3RhcnQgKyBuUGFnZUNoYXJDb3VudCAtIDE7DQorICAgIGludDMyX3QgbkNoYXJDb3VudDsNCisgICAgaW50MzJfdCBuQ2hhclN0YXJ0Ow0KKyAgICBDRlhfUmVjdEZBcnJheSByZWN0QXJyOw0KKyAgICBpbnQzMl90IGkgPSAwOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgblNlbENvdW50OyBpKyspIHsNCisgICAgICBuQ2hhckNvdW50ID0gbV9wRWR0RW5naW5lLT5HZXRTZWxSYW5nZShpLCBuQ2hhclN0YXJ0KTsNCisgICAgICBpbnQzMl90IG5DaGFyRW5kID0gbkNoYXJTdGFydCArIG5DaGFyQ291bnQgLSAxOw0KKyAgICAgIGlmIChuQ2hhckVuZCA8IG5QYWdlQ2hhclN0YXJ0IHx8IG5DaGFyU3RhcnQgPiBuUGFnZUNoYXJFbmQpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBpbnQzMl90IG5CZ24gPSBzdGQ6Om1heChuQ2hhclN0YXJ0LCBuUGFnZUNoYXJTdGFydCk7DQorICAgICAgaW50MzJfdCBuRW5kID0gc3RkOjptaW4obkNoYXJFbmQsIG5QYWdlQ2hhckVuZCk7DQorICAgICAgcFBhZ2UtPkNhbGNSYW5nZVJlY3RBcnJheShuQmduIC0gblBhZ2VDaGFyU3RhcnQsIG5FbmQgLSBuQmduICsgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3RBcnIpOw0KKyAgICB9DQorICAgIGludDMyX3QgbkNvdW50ID0gcmVjdEFyci5HZXRTaXplKCk7DQorICAgIENGWF9QYXRoIHBhdGg7DQorICAgIHBhdGguQ3JlYXRlKCk7DQorICAgIGZvciAoaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICAgIHJlY3RBcnJbaV0ubGVmdCArPSBmT2ZmU2V0WDsNCisgICAgICByZWN0QXJyW2ldLnRvcCArPSBmT2ZmU2V0WTsNCisgICAgICBwYXRoLkFkZFJlY3RhbmdsZShyZWN0QXJyW2ldLmxlZnQsIHJlY3RBcnJbaV0udG9wLCByZWN0QXJyW2ldLndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3RBcnJbaV0uaGVpZ2h0KTsNCisgICAgfQ0KKyAgICBwR3JhcGhpY3MtPlNldENsaXBSZWN0KHJ0Q2xpcCk7DQorICAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgICAgcGFyYW0ubV9tYXRyaXggPSAqcE1hdHJpeDsNCisgICAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRURUX0JhY2tncm91bmQ7DQorICAgIHBhcmFtLm1fcFBhdGggPSAmcGF0aDsNCisgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KKyAgfQ0KKyAgQ0ZYX1JlbmRlckRldmljZSogcFJlbmRlckRldiA9IHBHcmFwaGljcy0+R2V0UmVuZGVyRGV2aWNlKCk7DQorICBpZiAoIXBSZW5kZXJEZXYpDQorICAgIHJldHVybjsNCisgIElGREVfUmVuZGVyRGV2aWNlKiBwUmVuZGVyRGV2aWNlID0gSUZERV9SZW5kZXJEZXZpY2U6OkNyZWF0ZShwUmVuZGVyRGV2KTsNCisgIGlmICghcFJlbmRlckRldmljZSkNCisgICAgcmV0dXJuOw0KKyAgSUZERV9SZW5kZXJDb250ZXh0KiBwUmVuZGVyQ29udGV4dCA9IElGREVfUmVuZGVyQ29udGV4dDo6Q3JlYXRlKCk7DQorICBpZiAoIXBSZW5kZXJDb250ZXh0KQ0KKyAgICByZXR1cm47DQorICBwUmVuZGVyRGV2aWNlLT5TZXRDbGlwUmVjdChydENsaXApOw0KKyAgcFJlbmRlckNvbnRleHQtPlN0YXJ0UmVuZGVyKHBSZW5kZXJEZXZpY2UsIHBQYWdlLCBtdCk7DQorICBwUmVuZGVyQ29udGV4dC0+RG9SZW5kZXIoTlVMTCk7DQorICBwUmVuZGVyQ29udGV4dC0+UmVsZWFzZSgpOw0KKyAgcFJlbmRlckRldmljZS0+UmVsZWFzZSgpOw0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX0NvbWJUZXh0KSB7DQorICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgICAgQ0ZYX1BhdGggcGF0aDsNCisgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgaW50MzJfdCBpTGltaXQgPSBtX25MaW1pdCA+IDAgPyBtX25MaW1pdCA6IDE7DQorICAgIEZYX0ZMT0FUIGZTdGVwID0gbV9ydEVuZ2luZS53aWR0aCAvIGlMaW1pdDsNCisgICAgRlhfRkxPQVQgZkxlZnQgPSBtX3J0RW5naW5lLmxlZnQgKyAxOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBpTGltaXQ7IGkrKykgew0KKyAgICAgIGZMZWZ0ICs9IGZTdGVwOw0KKyAgICAgIHBhdGguQWRkTGluZShmTGVmdCwgbV9ydENsaWVudC50b3AsIGZMZWZ0LCBtX3J0Q2xpZW50LmJvdHRvbSgpKTsNCisgICAgfQ0KKyAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIHBhcmFtLm1fbWF0cml4ID0gKnBNYXRyaXg7DQorICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0VEVF9Db21iVGV4dExpbmU7DQorICAgIHBhcmFtLm1fcFBhdGggPSAmcGF0aDsNCisgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KKyAgfQ0KKyAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KK30NCit2b2lkIENGV0xfRWRpdEltcDo6VXBkYXRlRWRpdEVuZ2luZSgpIHsNCisgIFVwZGF0ZUVkaXRQYXJhbXMoKTsNCisgIFVwZGF0ZUVkaXRMYXlvdXQoKTsNCisgIGlmIChtX25MaW1pdCA+IC0xKSB7DQorICAgIG1fcEVkdEVuZ2luZS0+U2V0TGltaXQobV9uTGltaXQpOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfRWRpdEltcDo6VXBkYXRlRWRpdFBhcmFtcygpIHsNCisgIEZERV9UWFRFRFRQQVJBTVMgcGFyYW1zOw0KKyAgcGFyYW1zLm5Ib3J6U2NhbGUgPSAxMDA7DQorICBwYXJhbXMuZlBsYXRlV2lkdGggPSBtX3J0RW5naW5lLndpZHRoOw0KKyAgcGFyYW1zLmZQbGF0ZUhlaWdodCA9IG1fcnRFbmdpbmUuaGVpZ2h0Ow0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfUlRMTGF5b3V0KSB7DQorICAgIHBhcmFtcy5kd0xheW91dFN0eWxlcyB8PSBGREVfVEVYVEVESVRMQVlPVVRfUlRMOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1ZlcnRpY2FsTGF5b3V0KSB7DQorICAgIHBhcmFtcy5kd0xheW91dFN0eWxlcyB8PSBGREVfVEVYVEVESVRMQVlPVVRfRG9jVmVydGljYWw7DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfVmVydGljYWxDaGFycykgew0KKyAgICBwYXJhbXMuZHdMYXlvdXRTdHlsZXMgfD0gRkRFX1RFWFRFRElUTEFZT1VUX0NoYXJWZXJ0aWFsOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1JldmVyc2VMaW5lKSB7DQorICAgIHBhcmFtcy5kd0xheW91dFN0eWxlcyB8PSBGREVfVEVYVEVESVRMQVlPVVRfTGluZVJlc2VydmU7DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfQXJhYmljU2hhcGVzKSB7DQorICAgIHBhcmFtcy5kd0xheW91dFN0eWxlcyB8PSBGREVfVEVYVEVESVRMQVlPVVRfQXJhYmljU2hhcGVzOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX0V4cGFuZFRhYikgew0KKyAgICBwYXJhbXMuZHdMYXlvdXRTdHlsZXMgfD0gRkRFX1RFWFRFRElUTEFZT1VUX0V4cGFuZFRhYjsNCisgIH0NCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9Db21iVGV4dCkgew0KKyAgICBwYXJhbXMuZHdMYXlvdXRTdHlsZXMgfD0gRkRFX1RFWFRFRElUTEFZT1VUX0NvbWJUZXh0Ow0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX0xhc3RMaW5lSGVpZ2h0KSB7DQorICAgIHBhcmFtcy5kd0xheW91dFN0eWxlcyB8PSBGREVfVEVYVEVESVRMQVlPVVRfTGFzdExpbmVIZWlnaHQ7DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfVmFsaWRhdGUpIHsNCisgICAgcGFyYW1zLmR3TW9kZSB8PSBGREVfVEVYVEVESVRNT0RFX1ZhbGlkYXRlOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1Bhc3N3b3JkKSB7DQorICAgIHBhcmFtcy5kd01vZGUgfD0gRkRFX1RFWFRFRElUTU9ERV9QYXNzd29yZDsNCisgIH0NCisgIHN3aXRjaCAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfSEFsaWduTWFzaykgew0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9FRFRfSE5lYXI6IHsNCisgICAgICBwYXJhbXMuZHdBbGlnbm1lbnQgfD0gRkRFX1RFWFRFRElUQUxJR05fTGVmdDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9FRFRfSENlbnRlcjogew0KKyAgICAgIHBhcmFtcy5kd0FsaWdubWVudCB8PSBGREVfVEVYVEVESVRBTElHTl9DZW50ZXI7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfRURUX0hGYXI6IHsNCisgICAgICBwYXJhbXMuZHdBbGlnbm1lbnQgfD0gRkRFX1RFWFRFRElUQUxJR05fUmlnaHQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZGVmYXVsdDoge30NCisgIH0NCisgIHN3aXRjaCAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfSEFsaWduTW9kZU1hc2spIHsNCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfRURUX0p1c3RpZmllZDogew0KKyAgICAgIHBhcmFtcy5kd0FsaWdubWVudCB8PSBGREVfVEVYVEVESVRBTElHTl9KdXN0aWZpZWQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfRURUX0Rpc3RyaWJ1dGVkOiB7DQorICAgICAgcGFyYW1zLmR3QWxpZ25tZW50IHw9IEZERV9URVhURURJVEFMSUdOX0Rpc3RyaWJ1dGVkOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgcGFyYW1zLmR3QWxpZ25tZW50IHw9IEZERV9URVhURURJVEFMSUdOX05vcm1hbDsgfQ0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX011bHRpTGluZSkgew0KKyAgICBwYXJhbXMuZHdNb2RlIHw9IEZERV9URVhURURJVE1PREVfTXVsdGlMaW5lczsNCisgICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0hTY3JvbGwpID09IDAgJiYNCisgICAgICAgIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9BdXRvSFNjcm9sbCkgPT0gMCkgew0KKyAgICAgIHBhcmFtcy5kd01vZGUgfD0NCisgICAgICAgICAgRkRFX1RFWFRFRElUTU9ERV9BdXRvTGluZVdyYXAgfCBGREVfVEVYVEVESVRNT0RFX0xpbWl0QXJlYV9Ib3J6Ow0KKyAgICB9DQorICAgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9WU2Nyb2xsKSA9PSAwICYmDQorICAgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfQXV0b1ZTY3JvbGwpID09IDApIHsNCisgICAgICBwYXJhbXMuZHdNb2RlIHw9IEZERV9URVhURURJVE1PREVfTGltaXRBcmVhX1ZlcnQ7DQorICAgIH0gZWxzZSB7DQorICAgICAgcGFyYW1zLmZQbGF0ZUhlaWdodCA9IDB4MDBGRkZGRkY7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfQXV0b0hTY3JvbGwpID09IDApIHsNCisgICAgICBwYXJhbXMuZHdNb2RlIHw9IEZERV9URVhURURJVE1PREVfTGltaXRBcmVhX0hvcno7DQorICAgIH0NCisgIH0NCisgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHkpIHx8DQorICAgICAgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpKSB7DQorICAgIHBhcmFtcy5kd01vZGUgfD0gRkRFX1RFWFRFRElUTU9ERV9SZWFkT25seTsNCisgIH0NCisgIEZYX0ZMT0FUKiBwRm9udFNpemUgPQ0KKyAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUKj4oR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfRm9udFNpemUpKTsNCisgIGlmICghcEZvbnRTaXplKQ0KKyAgICByZXR1cm47DQorICBtX2ZGb250U2l6ZSA9ICpwRm9udFNpemU7DQorICBGWF9EV09SRCogcEZvbnRDb2xvciA9DQorICAgICAgc3RhdGljX2Nhc3Q8RlhfRFdPUkQqPihHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9UZXh0Q29sb3IpKTsNCisgIGlmICghcEZvbnRDb2xvcikNCisgICAgcmV0dXJuOw0KKyAgcGFyYW1zLmR3Rm9udENvbG9yID0gKnBGb250Q29sb3I7DQorICBGWF9GTE9BVCogcExpbmVIZWlnaHQgPQ0KKyAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUKj4oR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfTGluZUhlaWdodCkpOw0KKyAgaWYgKCFwTGluZUhlaWdodCkNCisgICAgcmV0dXJuOw0KKyAgcGFyYW1zLmZMaW5lU3BhY2UgPSAqcExpbmVIZWlnaHQ7DQorICBJRlhfRm9udCogcEZvbnQgPQ0KKyAgICAgIHN0YXRpY19jYXN0PElGWF9Gb250Kj4oR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfRm9udCkpOw0KKyAgaWYgKCFwRm9udCkNCisgICAgcmV0dXJuOw0KKyAgcGFyYW1zLnBGb250ID0gcEZvbnQ7DQorICBwYXJhbXMuZkZvbnRTaXplID0gbV9mRm9udFNpemU7DQorICBwYXJhbXMubkxpbmVDb3VudCA9IChpbnQzMl90KShwYXJhbXMuZlBsYXRlSGVpZ2h0IC8gcGFyYW1zLmZMaW5lU3BhY2UpOw0KKyAgaWYgKHBhcmFtcy5uTGluZUNvdW50IDw9IDApIHsNCisgICAgcGFyYW1zLm5MaW5lQ291bnQgPSAxOw0KKyAgfQ0KKyAgcGFyYW1zLmZUYWJXaWR0aCA9IHBhcmFtcy5mRm9udFNpemUgKiAxOw0KKyAgcGFyYW1zLmJUYWJFcXVpZGlzdGFudCA9IFRSVUU7DQorICBwYXJhbXMud0xpbmVCcmVha0NoYXIgPSBMJ1xuJzsNCisgIHBhcmFtcy5uQ2hhclJvdGF0aW9uID0gMDsNCisgIHBhcmFtcy5wRXZlbnRTaW5rID0gdGhpczsNCisgIG1fcEVkdEVuZ2luZS0+U2V0RWRpdFBhcmFtcyhwYXJhbXMpOw0KK30NCit2b2lkIENGV0xfRWRpdEltcDo6VXBkYXRlRWRpdExheW91dCgpIHsNCisgIGlmIChtX3BFZHRFbmdpbmUtPkdldFRleHRMZW5ndGgoKSA8PSAwKSB7DQorICAgIG1fcEVkdEVuZ2luZS0+U2V0VGV4dEJ5U3RyZWFtKE5VTEwpOw0KKyAgfQ0KKyAgSUZERV9UeHRFZHRQYWdlKiBwUGFnZSA9IG1fcEVkdEVuZ2luZS0+R2V0UGFnZSgwKTsNCisgIGlmIChwUGFnZSkgew0KKyAgICBwUGFnZS0+VW5sb2FkUGFnZSgpOw0KKyAgICBwUGFnZSA9IE5VTEw7DQorICB9DQorICBtX3BFZHRFbmdpbmUtPlN0YXJ0TGF5b3V0KCk7DQorICBtX3BFZHRFbmdpbmUtPkRvTGF5b3V0KE5VTEwpOw0KKyAgbV9wRWR0RW5naW5lLT5FbmRMYXlvdXQoKTsNCisgIHBQYWdlID0gbV9wRWR0RW5naW5lLT5HZXRQYWdlKDApOw0KKyAgaWYgKHBQYWdlKSB7DQorICAgIHBQYWdlLT5Mb2FkUGFnZSgpOw0KKyAgfQ0KK30NCitGWF9CT09MIENGV0xfRWRpdEltcDo6VXBkYXRlT2Zmc2V0KCkgew0KKyAgQ0ZYX1JlY3RGIHJ0Q2FyZXQ7DQorICBtX3BFZHRFbmdpbmUtPkdldENhcmV0UmVjdChydENhcmV0KTsNCisgIEZYX0ZMT0FUIGZPZmZTZXRYID0gbV9ydEVuZ2luZS5sZWZ0IC0gbV9mU2Nyb2xsT2Zmc2V0WDsNCisgIEZYX0ZMT0FUIGZPZmZTZXRZID0gbV9ydEVuZ2luZS50b3AgLSBtX2ZTY3JvbGxPZmZzZXRZICsgbV9mVkFsaWduT2Zmc2V0Ow0KKyAgcnRDYXJldC5PZmZzZXQoZk9mZlNldFgsIGZPZmZTZXRZKTsNCisgIGNvbnN0IENGWF9SZWN0RiYgcnRFaWR0ID0gbV9ydEVuZ2luZTsNCisgIGlmIChydEVpZHQuQ29udGFpbnMocnRDYXJldCkpIHsNCisgICAgSUZERV9UeHRFZHRQYWdlKiBwUGFnZSA9IG1fcEVkdEVuZ2luZS0+R2V0UGFnZSgwKTsNCisgICAgaWYgKCFwUGFnZSkNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIENGWF9SZWN0RiBydEZERSA9IHBQYWdlLT5HZXRDb250ZW50c0JveCgpOw0KKyAgICBydEZERS5PZmZzZXQoZk9mZlNldFgsIGZPZmZTZXRZKTsNCisgICAgaWYgKHJ0RkRFLnJpZ2h0KCkgPCBydEVpZHQucmlnaHQoKSAmJiBtX2ZTY3JvbGxPZmZzZXRYID4gMCkgew0KKyAgICAgIG1fZlNjcm9sbE9mZnNldFggKz0gcnRGREUucmlnaHQoKSAtIHJ0RWlkdC5yaWdodCgpOw0KKyAgICAgIGlmIChtX2ZTY3JvbGxPZmZzZXRYIDwgMCkgew0KKyAgICAgICAgbV9mU2Nyb2xsT2Zmc2V0WCA9IDA7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChydEZERS5ib3R0b20oKSA8IHJ0RWlkdC5ib3R0b20oKSAmJiBtX2ZTY3JvbGxPZmZzZXRZID4gMCkgew0KKyAgICAgIG1fZlNjcm9sbE9mZnNldFkgKz0gcnRGREUuYm90dG9tKCkgLSBydEVpZHQuYm90dG9tKCk7DQorICAgICAgaWYgKG1fZlNjcm9sbE9mZnNldFkgPCAwKSB7DQorICAgICAgICBtX2ZTY3JvbGxPZmZzZXRZID0gMDsNCisgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfSBlbHNlIHsNCisgICAgRlhfRkxPQVQgb2Zmc2V0WCA9IDAuMDsNCisgICAgRlhfRkxPQVQgb2Zmc2V0WSA9IDAuMDsNCisgICAgaWYgKHJ0Q2FyZXQubGVmdCA8IHJ0RWlkdC5sZWZ0KSB7DQorICAgICAgb2Zmc2V0WCA9IHJ0Q2FyZXQubGVmdCAtIHJ0RWlkdC5sZWZ0Ow0KKyAgICB9DQorICAgIGlmIChydENhcmV0LnJpZ2h0KCkgPiBydEVpZHQucmlnaHQoKSkgew0KKyAgICAgIG9mZnNldFggPSBydENhcmV0LnJpZ2h0KCkgLSBydEVpZHQucmlnaHQoKTsNCisgICAgfQ0KKyAgICBpZiAocnRDYXJldC50b3AgPCBydEVpZHQudG9wKSB7DQorICAgICAgb2Zmc2V0WSA9IHJ0Q2FyZXQudG9wIC0gcnRFaWR0LnRvcDsNCisgICAgfQ0KKyAgICBpZiAocnRDYXJldC5ib3R0b20oKSA+IHJ0RWlkdC5ib3R0b20oKSkgew0KKyAgICAgIG9mZnNldFkgPSBydENhcmV0LmJvdHRvbSgpIC0gcnRFaWR0LmJvdHRvbSgpOw0KKyAgICB9DQorICAgIGlmICghKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX0hTZWxmQWRhcHRpb24pKSB7DQorICAgICAgbV9mU2Nyb2xsT2Zmc2V0WCArPSBvZmZzZXRYOw0KKyAgICB9DQorICAgIGlmICghKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1ZTZWxmQWRhcHRpb24pKSB7DQorICAgICAgbV9mU2Nyb2xsT2Zmc2V0WSArPSBvZmZzZXRZOw0KKyAgICB9DQorICAgIGlmIChtX2ZGb250U2l6ZSA+IG1fcnRFbmdpbmUuaGVpZ2h0KSB7DQorICAgICAgbV9mU2Nyb2xsT2Zmc2V0WSA9IDA7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0SW1wOjpVcGRhdGVPZmZzZXQoSUZXTF9TY3JvbGxCYXIqIHBTY3JvbGxCYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUG9zQ2hhbmdlZCkgew0KKyAgaWYgKHBTY3JvbGxCYXIgPT0gbV9wSG9yelNjcm9sbEJhci5nZXQoKSkgew0KKyAgICBtX2ZTY3JvbGxPZmZzZXRYICs9IGZQb3NDaGFuZ2VkOw0KKyAgfSBlbHNlIHsNCisgICAgbV9mU2Nyb2xsT2Zmc2V0WSArPSBmUG9zQ2hhbmdlZDsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENGV0xfRWRpdEltcDo6VXBkYXRlVkFsaWdubWVudCgpIHsNCisgIElGREVfVHh0RWR0UGFnZSogcFBhZ2UgPSBtX3BFZHRFbmdpbmUtPkdldFBhZ2UoMCk7DQorICBpZiAoIXBQYWdlKQ0KKyAgICByZXR1cm47DQorICBjb25zdCBDRlhfUmVjdEYmIHJ0RkRFID0gcFBhZ2UtPkdldENvbnRlbnRzQm94KCk7DQorICBGWF9GTE9BVCBmT2Zmc2V0WSA9IDAuMGY7DQorICBGWF9GTE9BVCBmU3BhY2VBYm92ZSA9IDAuMGY7DQorICBGWF9GTE9BVCBmU3BhY2VCZWxvdyA9IDAuMGY7DQorICBDRlhfU2l6ZUYqIHBTcGFjZSA9IHN0YXRpY19jYXN0PENGWF9TaXplRio+KA0KKyAgICAgIEdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX1NwYWNlQWJvdmVCZWxvdykpOw0KKyAgaWYgKHBTcGFjZSkgew0KKyAgICBmU3BhY2VBYm92ZSA9IHBTcGFjZS0+eDsNCisgICAgZlNwYWNlQmVsb3cgPSBwU3BhY2UtPnk7DQorICB9DQorICBpZiAoZlNwYWNlQWJvdmUgPCAwLjFmKSB7DQorICAgIGZTcGFjZUFib3ZlID0gMDsNCisgIH0NCisgIGlmIChmU3BhY2VCZWxvdyA8IDAuMWYpIHsNCisgICAgZlNwYWNlQmVsb3cgPSAwOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1ZDZW50ZXIpIHsNCisgICAgZk9mZnNldFkgPSAobV9ydEVuZ2luZS5oZWlnaHQgLSBydEZERS5oZWlnaHQpIC8gMjsNCisgICAgaWYgKGZPZmZzZXRZIDwgKGZTcGFjZUFib3ZlICsgZlNwYWNlQmVsb3cpIC8gMiAmJg0KKyAgICAgICAgZlNwYWNlQWJvdmUgPCBmU3BhY2VCZWxvdykgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBmT2Zmc2V0WSArPSAoZlNwYWNlQWJvdmUgLSBmU3BhY2VCZWxvdykgLyAyOw0KKyAgfSBlbHNlIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9WRmFyKSB7DQorICAgIGZPZmZzZXRZID0gKG1fcnRFbmdpbmUuaGVpZ2h0IC0gcnRGREUuaGVpZ2h0KTsNCisgICAgZk9mZnNldFkgLT0gZlNwYWNlQmVsb3c7DQorICB9IGVsc2Ugew0KKyAgICBmT2Zmc2V0WSArPSBmU3BhY2VBYm92ZTsNCisgIH0NCisgIG1fZlZBbGlnbk9mZnNldCA9IGZPZmZzZXRZOw0KKyAgaWYgKG1fZlZBbGlnbk9mZnNldCA8IDApIHsNCisgICAgbV9mVkFsaWduT2Zmc2V0ID0gMDsNCisgIH0NCit9DQordm9pZCBDRldMX0VkaXRJbXA6OlVwZGF0ZUNhcmV0KCkgew0KKyAgQ0ZYX1JlY3RGIHJ0RkRFOw0KKyAgbV9wRWR0RW5naW5lLT5HZXRDYXJldFJlY3QocnRGREUpOw0KKyAgcnRGREUuT2Zmc2V0KG1fcnRFbmdpbmUubGVmdCAtIG1fZlNjcm9sbE9mZnNldFgsDQorICAgICAgICAgICAgICAgbV9ydEVuZ2luZS50b3AgLSBtX2ZTY3JvbGxPZmZzZXRZICsgbV9mVkFsaWduT2Zmc2V0KTsNCisgIENGWF9SZWN0RiBydENhcmV0Ow0KKyAgcnRDYXJldC5TZXQocnRGREUubGVmdCwgcnRGREUudG9wLCBydEZERS53aWR0aCwgcnRGREUuaGVpZ2h0KTsNCisgIENGWF9SZWN0RiB0ZW1wID0gcnRDYXJldDsNCisgIENGWF9SZWN0RiBydENsaWVudDsNCisgIEdldENsaWVudFJlY3QocnRDbGllbnQpOw0KKyAgcnRDYXJldC5JbnRlcnNlY3QocnRDbGllbnQpOw0KKyAgaWYgKHJ0Q2FyZXQubGVmdCA+IHJ0Q2xpZW50LnJpZ2h0KCkpIHsNCisgICAgRlhfRkxPQVQgcmlnaHQgPSBydENhcmV0LnJpZ2h0KCk7DQorICAgIHJ0Q2FyZXQubGVmdCA9IHJ0Q2xpZW50LnJpZ2h0KCkgLSAxOw0KKyAgICBydENhcmV0LndpZHRoID0gcmlnaHQgLSBydENhcmV0LmxlZnQ7DQorICB9DQorICBGWF9CT09MIGJJbnRlcnNlY3QgPSAhcnRDYXJldC5Jc0VtcHR5KCk7DQorICBGWF9CT09MIGJTaG93ID0gVFJVRTsNCisgIEZYX0JPT0wgYlNob3dXaG9sZSA9IEZBTFNFOw0KKyAgaWYgKCEobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSB8fCAhYkludGVyc2VjdCkgew0KKyAgICBiU2hvdyA9IEZBTFNFOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX0hTZWxmQWRhcHRpb24gJiYNCisgICAgICB0ZW1wLnJpZ2h0KCkgPiBtX3J0RW5naW5lLnJpZ2h0KCkpIHsNCisgICAgYlNob3dXaG9sZSA9IFRSVUU7DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfVlNlbGZBZGFwdGlvbiAmJg0KKyAgICAgIHRlbXAuYm90dG9tKCkgPiBtX3J0RW5naW5lLmJvdHRvbSgpKSB7DQorICAgIGJTaG93V2hvbGUgPSBUUlVFOw0KKyAgfSBlbHNlIHsNCisgICAgYlNob3cgPSAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkICYmIGJJbnRlcnNlY3QpOw0KKyAgfQ0KKyAgaWYgKGJTaG93V2hvbGUpIHsNCisgICAgcnRDYXJldCA9IHRlbXA7DQorICB9DQorICBTaG93Q2FyZXQoYlNob3csICZydENhcmV0KTsNCit9DQorSUZXTF9TY3JvbGxCYXIqIENGV0xfRWRpdEltcDo6VXBkYXRlU2Nyb2xsKCkgew0KKyAgRlhfQk9PTCBiU2hvd0hvcnogPQ0KKyAgICAgIG1fcEhvcnpTY3JvbGxCYXIgJiYNCisgICAgICAoKG1fcEhvcnpTY3JvbGxCYXItPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSkgPT0gMCk7DQorICBGWF9CT09MIGJTaG93VmVydCA9DQorICAgICAgbV9wVmVydFNjcm9sbEJhciAmJg0KKyAgICAgICgobV9wVmVydFNjcm9sbEJhci0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfSW52aXNpYmxlKSA9PSAwKTsNCisgIGlmICghYlNob3dIb3J6ICYmICFiU2hvd1ZlcnQpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBJRkRFX1R4dEVkdFBhZ2UqIHBQYWdlID0gbV9wRWR0RW5naW5lLT5HZXRQYWdlKDApOw0KKyAgaWYgKCFwUGFnZSkNCisgICAgcmV0dXJuIE5VTEw7DQorICBjb25zdCBDRlhfUmVjdEYmIHJ0RkRFID0gcFBhZ2UtPkdldENvbnRlbnRzQm94KCk7DQorICBJRldMX1Njcm9sbEJhciogcFJlcGFpbnQgPSBOVUxMOw0KKyAgaWYgKGJTaG93SG9yeikgew0KKyAgICBDRlhfUmVjdEYgcnRTY3JvbGw7DQorICAgIG1fcEhvcnpTY3JvbGxCYXItPkdldFdpZGdldFJlY3QocnRTY3JvbGwpOw0KKyAgICBpZiAocnRTY3JvbGwud2lkdGggPCBydEZERS53aWR0aCkgew0KKyAgICAgIG1fcEhvcnpTY3JvbGxCYXItPkxvY2tVcGRhdGUoKTsNCisgICAgICBGWF9GTE9BVCBmUmFuZ2UgPSBydEZERS53aWR0aCAtIHJ0U2Nyb2xsLndpZHRoOw0KKyAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFJhbmdlKDAuMGYsIGZSYW5nZSk7DQorICAgICAgRlhfRkxPQVQgZlBvcyA9IG1fZlNjcm9sbE9mZnNldFg7DQorICAgICAgaWYgKGZQb3MgPCAwLjBmKSB7DQorICAgICAgICBmUG9zID0gMC4wZjsNCisgICAgICB9DQorICAgICAgaWYgKGZQb3MgPiBmUmFuZ2UpIHsNCisgICAgICAgIGZQb3MgPSBmUmFuZ2U7DQorICAgICAgfQ0KKyAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFBvcyhmUG9zKTsNCisgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRUcmFja1BvcyhmUG9zKTsNCisgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRQYWdlU2l6ZShydFNjcm9sbC53aWR0aCk7DQorICAgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0U3RlcFNpemUocnRTY3JvbGwud2lkdGggLyAxMCk7DQorICAgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9EaXNhYmxlZCwgRkFMU0UpOw0KKyAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlVubG9ja1VwZGF0ZSgpOw0KKyAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlVwZGF0ZSgpOw0KKyAgICAgIHBSZXBhaW50ID0gbV9wSG9yelNjcm9sbEJhci5nZXQoKTsNCisgICAgfSBlbHNlIGlmICgobV9wSG9yelNjcm9sbEJhci0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpID09IDApIHsNCisgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5Mb2NrVXBkYXRlKCk7DQorICAgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0UmFuZ2UoMCwgLTEpOw0KKyAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfRGlzYWJsZWQsIFRSVUUpOw0KKyAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlVubG9ja1VwZGF0ZSgpOw0KKyAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlVwZGF0ZSgpOw0KKyAgICAgIHBSZXBhaW50ID0gbV9wSG9yelNjcm9sbEJhci5nZXQoKTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGJTaG93VmVydCkgew0KKyAgICBDRlhfUmVjdEYgcnRTY3JvbGw7DQorICAgIG1fcFZlcnRTY3JvbGxCYXItPkdldFdpZGdldFJlY3QocnRTY3JvbGwpOw0KKyAgICBpZiAocnRTY3JvbGwuaGVpZ2h0IDwgcnRGREUuaGVpZ2h0KSB7DQorICAgICAgbV9wVmVydFNjcm9sbEJhci0+TG9ja1VwZGF0ZSgpOw0KKyAgICAgIEZYX0ZMT0FUIGZTdGVwID0gbV9wRWR0RW5naW5lLT5HZXRFZGl0UGFyYW1zKCktPmZMaW5lU3BhY2U7DQorICAgICAgRlhfRkxPQVQgZlJhbmdlID0gcnRGREUuaGVpZ2h0IC0gbV9ydEVuZ2luZS5oZWlnaHQ7DQorICAgICAgaWYgKGZSYW5nZSA8IGZTdGVwKSB7DQorICAgICAgICBmUmFuZ2UgPSBmU3RlcDsNCisgICAgICB9DQorICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0UmFuZ2UoMC4wZiwgZlJhbmdlKTsNCisgICAgICBGWF9GTE9BVCBmUG9zID0gbV9mU2Nyb2xsT2Zmc2V0WTsNCisgICAgICBpZiAoZlBvcyA8IDAuMGYpIHsNCisgICAgICAgIGZQb3MgPSAwLjBmOw0KKyAgICAgIH0NCisgICAgICBpZiAoZlBvcyA+IGZSYW5nZSkgew0KKyAgICAgICAgZlBvcyA9IGZSYW5nZTsNCisgICAgICB9DQorICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0UG9zKGZQb3MpOw0KKyAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFRyYWNrUG9zKGZQb3MpOw0KKyAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFBhZ2VTaXplKHJ0U2Nyb2xsLmhlaWdodCk7DQorICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0U3RlcFNpemUoZlN0ZXApOw0KKyAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfRGlzYWJsZWQsIEZBTFNFKTsNCisgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5VbmxvY2tVcGRhdGUoKTsNCisgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5VcGRhdGUoKTsNCisgICAgICBwUmVwYWludCA9IG1fcFZlcnRTY3JvbGxCYXIuZ2V0KCk7DQorICAgIH0gZWxzZSBpZiAoKG1fcFZlcnRTY3JvbGxCYXItPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSA9PSAwKSB7DQorICAgICAgbV9wVmVydFNjcm9sbEJhci0+TG9ja1VwZGF0ZSgpOw0KKyAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFJhbmdlKDAsIC0xKTsNCisgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0Rpc2FibGVkLCBUUlVFKTsNCisgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5VbmxvY2tVcGRhdGUoKTsNCisgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5VcGRhdGUoKTsNCisgICAgICBwUmVwYWludCA9IG1fcFZlcnRTY3JvbGxCYXIuZ2V0KCk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBwUmVwYWludDsNCit9DQorRlhfQk9PTCBDRldMX0VkaXRJbXA6OklzU2hvd1Njcm9sbEJhcihGWF9CT09MIGJWZXJ0KSB7DQorICBGWF9CT09MIGJTaG93ID0NCisgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfU2hvd1Njcm9sbGJhckZvY3VzKQ0KKyAgICAgICAgICA/IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpID09DQorICAgICAgICAgICAgICAgIEZXTF9XR1RTVEFURV9Gb2N1c2VkDQorICAgICAgICAgIDogVFJVRTsNCisgIGlmIChiVmVydCkgew0KKyAgICByZXR1cm4gYlNob3cgJiYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfVlNjcm9sbCkgJiYNCisgICAgICAgICAgIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9NdWx0aUxpbmUpICYmDQorICAgICAgICAgICBJc0NvbnRlbnRIZWlnaHRPdmVyZmxvdygpOw0KKyAgfQ0KKyAgcmV0dXJuIGJTaG93ICYmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0hTY3JvbGwpICYmDQorICAgICAgICAgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX011bHRpTGluZSk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0SW1wOjpJc0NvbnRlbnRIZWlnaHRPdmVyZmxvdygpIHsNCisgIGlmICghbV9wRWR0RW5naW5lKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBJRkRFX1R4dEVkdFBhZ2UqIHBQYWdlID0gbV9wRWR0RW5naW5lLT5HZXRQYWdlKDApOw0KKyAgaWYgKCFwUGFnZSkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgcmV0dXJuIHBQYWdlLT5HZXRDb250ZW50c0JveCgpLmhlaWdodCA+IG1fcnRFbmdpbmUuaGVpZ2h0ICsgMS4wZjsNCit9DQoraW50MzJfdCBDRldMX0VkaXRJbXA6OkFkZERvUmVjb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCkgew0KKyAgaW50MzJfdCBuQ291bnQgPSBtX1JlY29yZEFyci5HZXRTaXplKCk7DQorICBpZiAobV9pQ3VyUmVjb3JkID09IG5Db3VudCAtIDEpIHsNCisgICAgaWYgKG5Db3VudCA9PSBtX2lNYXhSZWNvcmQpIHsNCisgICAgICBtX1JlY29yZEFyci5SZW1vdmVBdCgwKTsNCisgICAgICBtX2lDdXJSZWNvcmQtLTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgZm9yIChpbnQzMl90IGkgPSBuQ291bnQgLSAxOyBpID4gbV9pQ3VyUmVjb3JkOyBpLS0pIHsNCisgICAgICBtX1JlY29yZEFyci5SZW1vdmVBdChpKTsNCisgICAgfQ0KKyAgfQ0KKyAgbV9SZWNvcmRBcnIuQWRkKGJzRG9SZWNvcmQpOw0KKyAgcmV0dXJuIG1faUN1clJlY29yZCA9IG1fUmVjb3JkQXJyLkdldFNpemUoKSAtIDE7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wOjpMYXlvdXQoKSB7DQorICBHZXRDbGllbnRSZWN0KG1fcnRDbGllbnQpOw0KKyAgbV9ydEVuZ2luZSA9IG1fcnRDbGllbnQ7DQorICBGWF9GTE9BVCogcGZXaWR0aCA9DQorICAgICAgc3RhdGljX2Nhc3Q8RlhfRkxPQVQqPihHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9TY3JvbGxCYXJXaWR0aCkpOw0KKyAgaWYgKCFwZldpZHRoKQ0KKyAgICByZXR1cm47DQorICBGWF9GTE9BVCBmV2lkdGggPSAqcGZXaWR0aDsNCisgIGlmICghbV9wT3V0ZXIpIHsNCisgICAgQ0ZYX1JlY3RGKiBwVUlNYXJnaW4gPQ0KKyAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZYX1JlY3RGKj4oR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfVUlNYXJnaW4pKTsNCisgICAgaWYgKHBVSU1hcmdpbikgew0KKyAgICAgIG1fcnRFbmdpbmUuRGVmbGF0ZShwVUlNYXJnaW4tPmxlZnQsIHBVSU1hcmdpbi0+dG9wLCBwVUlNYXJnaW4tPndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBwVUlNYXJnaW4tPmhlaWdodCk7DQorICAgIH0NCisgIH0gZWxzZSBpZiAobV9wT3V0ZXItPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX0RhdGVUaW1lUGlja2VyKSB7DQorICAgIENGV0xfVGhlbWVQYXJ0IHBhcnQ7DQorICAgIHBhcnQubV9wV2lkZ2V0ID0gbV9wT3V0ZXI7DQorICAgIENGWF9SZWN0RiogcFVJTWFyZ2luID0NCisgICAgICAgIHN0YXRpY19jYXN0PENGWF9SZWN0Rio+KG1fcE91dGVyLT5HZXRUaGVtZVByb3ZpZGVyKCktPkdldENhcGFjaXR5KA0KKyAgICAgICAgICAgICZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfVUlNYXJnaW4pKTsNCisgICAgaWYgKHBVSU1hcmdpbikgew0KKyAgICAgIG1fcnRFbmdpbmUuRGVmbGF0ZShwVUlNYXJnaW4tPmxlZnQsIHBVSU1hcmdpbi0+dG9wLCBwVUlNYXJnaW4tPndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBwVUlNYXJnaW4tPmhlaWdodCk7DQorICAgIH0NCisgIH0NCisgIEZYX0JPT0wgYlNob3dWZXJ0U2Nyb2xsYmFyID0gSXNTaG93U2Nyb2xsQmFyKFRSVUUpOw0KKyAgRlhfQk9PTCBiU2hvd0hvcnpTY3JvbGxiYXIgPSBJc1Nob3dTY3JvbGxCYXIoRkFMU0UpOw0KKyAgaWYgKGJTaG93VmVydFNjcm9sbGJhcikgew0KKyAgICBJbml0U2Nyb2xsQmFyKCk7DQorICAgIENGWF9SZWN0RiBydFZlcnRTY3I7DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9PdXRlclNjcm9sbGJhcikgew0KKyAgICAgIHJ0VmVydFNjci5TZXQobV9ydENsaWVudC5yaWdodCgpICsgRldMX0VESVRfTWFyZ2luLCBtX3J0Q2xpZW50LnRvcCwNCisgICAgICAgICAgICAgICAgICAgIGZXaWR0aCwgbV9ydENsaWVudC5oZWlnaHQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJ0VmVydFNjci5TZXQobV9ydENsaWVudC5yaWdodCgpIC0gZldpZHRoLCBtX3J0Q2xpZW50LnRvcCwgZldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgbV9ydENsaWVudC5oZWlnaHQpOw0KKyAgICAgIGlmIChiU2hvd0hvcnpTY3JvbGxiYXIpIHsNCisgICAgICAgIHJ0VmVydFNjci5oZWlnaHQgLT0gZldpZHRoOw0KKyAgICAgIH0NCisgICAgICBtX3J0RW5naW5lLndpZHRoIC09IGZXaWR0aDsNCisgICAgfQ0KKyAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRXaWRnZXRSZWN0KHJ0VmVydFNjcik7DQorICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBGQUxTRSk7DQorICAgIG1fcFZlcnRTY3JvbGxCYXItPlVwZGF0ZSgpOw0KKyAgfSBlbHNlIGlmIChtX3BWZXJ0U2Nyb2xsQmFyKSB7DQorICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBUUlVFKTsNCisgIH0NCisgIGlmIChiU2hvd0hvcnpTY3JvbGxiYXIpIHsNCisgICAgSW5pdFNjcm9sbEJhcihGQUxTRSk7DQorICAgIENGWF9SZWN0RiBydEhvcmlTY3I7DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9PdXRlclNjcm9sbGJhcikgew0KKyAgICAgIHJ0SG9yaVNjci5TZXQobV9ydENsaWVudC5sZWZ0LCBtX3J0Q2xpZW50LmJvdHRvbSgpICsgRldMX0VESVRfTWFyZ2luLA0KKyAgICAgICAgICAgICAgICAgICAgbV9ydENsaWVudC53aWR0aCwgZldpZHRoKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBydEhvcmlTY3IuU2V0KG1fcnRDbGllbnQubGVmdCwgbV9ydENsaWVudC5ib3R0b20oKSAtIGZXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQud2lkdGgsIGZXaWR0aCk7DQorICAgICAgaWYgKGJTaG93VmVydFNjcm9sbGJhcikgew0KKyAgICAgICAgcnRIb3JpU2NyLndpZHRoIC09IGZXaWR0aDsNCisgICAgICB9DQorICAgICAgbV9ydEVuZ2luZS5oZWlnaHQgLT0gZldpZHRoOw0KKyAgICB9DQorICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFdpZGdldFJlY3QocnRIb3JpU2NyKTsNCisgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsIEZBTFNFKTsNCisgICAgbV9wSG9yelNjcm9sbEJhci0+VXBkYXRlKCk7DQorICB9IGVsc2UgaWYgKG1fcEhvcnpTY3JvbGxCYXIpIHsNCisgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsIFRSVUUpOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfRWRpdEltcDo6TGF5b3V0U2Nyb2xsQmFyKCkgew0KKyAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9TaG93U2Nyb2xsYmFyRm9jdXMpID09DQorICAgICAgMCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9GTE9BVCogcGZXaWR0aCA9IE5VTEw7DQorICBGWF9CT09MIGJTaG93VmVydFNjcm9sbGJhciA9IElzU2hvd1Njcm9sbEJhcihUUlVFKTsNCisgIEZYX0JPT0wgYlNob3dIb3J6U2Nyb2xsYmFyID0gSXNTaG93U2Nyb2xsQmFyKEZBTFNFKTsNCisgIGlmIChiU2hvd1ZlcnRTY3JvbGxiYXIpIHsNCisgICAgaWYgKCFtX3BWZXJ0U2Nyb2xsQmFyKSB7DQorICAgICAgcGZXaWR0aCA9IHN0YXRpY19jYXN0PEZYX0ZMT0FUKj4oDQorICAgICAgICAgIEdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX1Njcm9sbEJhcldpZHRoKSk7DQorICAgICAgRlhfRkxPQVQgZldpZHRoID0gcGZXaWR0aCA/ICpwZldpZHRoIDogMDsNCisgICAgICBJbml0U2Nyb2xsQmFyKCk7DQorICAgICAgQ0ZYX1JlY3RGIHJ0VmVydFNjcjsNCisgICAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfT3V0ZXJTY3JvbGxiYXIpIHsNCisgICAgICAgIHJ0VmVydFNjci5TZXQobV9ydENsaWVudC5yaWdodCgpICsgRldMX0VESVRfTWFyZ2luLCBtX3J0Q2xpZW50LnRvcCwNCisgICAgICAgICAgICAgICAgICAgICAgZldpZHRoLCBtX3J0Q2xpZW50LmhlaWdodCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJ0VmVydFNjci5TZXQobV9ydENsaWVudC5yaWdodCgpIC0gZldpZHRoLCBtX3J0Q2xpZW50LnRvcCwgZldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LmhlaWdodCk7DQorICAgICAgICBpZiAoYlNob3dIb3J6U2Nyb2xsYmFyKSB7DQorICAgICAgICAgIHJ0VmVydFNjci5oZWlnaHQgLT0gZldpZHRoOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRXaWRnZXRSZWN0KHJ0VmVydFNjcik7DQorICAgICAgbV9wVmVydFNjcm9sbEJhci0+VXBkYXRlKCk7DQorICAgIH0NCisgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsIEZBTFNFKTsNCisgIH0gZWxzZSBpZiAobV9wVmVydFNjcm9sbEJhcikgew0KKyAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgVFJVRSk7DQorICB9DQorICBpZiAoYlNob3dIb3J6U2Nyb2xsYmFyKSB7DQorICAgIGlmICghbV9wSG9yelNjcm9sbEJhcikgew0KKyAgICAgIGlmICghcGZXaWR0aCkgew0KKyAgICAgICAgcGZXaWR0aCA9IHN0YXRpY19jYXN0PEZYX0ZMT0FUKj4oDQorICAgICAgICAgICAgR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGgpKTsNCisgICAgICB9DQorICAgICAgRlhfRkxPQVQgZldpZHRoID0gcGZXaWR0aCA/ICpwZldpZHRoIDogMDsNCisgICAgICBJbml0U2Nyb2xsQmFyKEZBTFNFKTsNCisgICAgICBDRlhfUmVjdEYgcnRIb3JpU2NyOw0KKyAgICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9PdXRlclNjcm9sbGJhcikgew0KKyAgICAgICAgcnRIb3JpU2NyLlNldChtX3J0Q2xpZW50LmxlZnQsIG1fcnRDbGllbnQuYm90dG9tKCkgKyBGV0xfRURJVF9NYXJnaW4sDQorICAgICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQud2lkdGgsIGZXaWR0aCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJ0SG9yaVNjci5TZXQobV9ydENsaWVudC5sZWZ0LCBtX3J0Q2xpZW50LmJvdHRvbSgpIC0gZldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LndpZHRoLCBmV2lkdGgpOw0KKyAgICAgICAgaWYgKGJTaG93VmVydFNjcm9sbGJhcikgew0KKyAgICAgICAgICBydEhvcmlTY3Iud2lkdGggLT0gKGZXaWR0aCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFdpZGdldFJlY3QocnRIb3JpU2NyKTsNCisgICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5VcGRhdGUoKTsNCisgICAgfQ0KKyAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgRkFMU0UpOw0KKyAgfSBlbHNlIGlmIChtX3BIb3J6U2Nyb2xsQmFyKSB7DQorICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBUUlVFKTsNCisgIH0NCisgIGlmIChiU2hvd1ZlcnRTY3JvbGxiYXIgfHwgYlNob3dIb3J6U2Nyb2xsYmFyKSB7DQorICAgIFVwZGF0ZVNjcm9sbCgpOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfRWRpdEltcDo6RGV2aWNlVG9FbmdpbmUoQ0ZYX1BvaW50RiYgcHQpIHsNCisgIHB0LnggKz0gLW1fcnRFbmdpbmUubGVmdCArIG1fZlNjcm9sbE9mZnNldFg7DQorICBwdC55ICs9IC1tX3J0RW5naW5lLnRvcCAtIG1fZlZBbGlnbk9mZnNldCArIG1fZlNjcm9sbE9mZnNldFk7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wOjpJbml0U2Nyb2xsQmFyKEZYX0JPT0wgYlZlcnQpIHsNCisgIGlmICgoYlZlcnQgJiYgbV9wVmVydFNjcm9sbEJhcikgfHwgKCFiVmVydCAmJiBtX3BIb3J6U2Nyb2xsQmFyKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcDsNCisgIHByb3AubV9kd1N0eWxlRXhlcyA9IGJWZXJ0ID8gRldMX1NUWUxFRVhUX1NDQl9WZXJ0IDogRldMX1NUWUxFRVhUX1NDQl9Ib3J6Ow0KKyAgcHJvcC5tX2R3U3RhdGVzID0gRldMX1dHVFNUQVRFX0Rpc2FibGVkIHwgRldMX1dHVFNUQVRFX0ludmlzaWJsZTsNCisgIHByb3AubV9wUGFyZW50ID0gbV9wSW50ZXJmYWNlOw0KKyAgcHJvcC5tX3BUaGVtZVByb3ZpZGVyID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgIElGV0xfU2Nyb2xsQmFyKiBwU2Nyb2xsQmFyID0gSUZXTF9TY3JvbGxCYXI6OkNyZWF0ZShwcm9wLCBtX3BJbnRlcmZhY2UpOw0KKyAgcFNjcm9sbEJhci0+SW5pdGlhbGl6ZSgpOw0KKyAgKGJWZXJ0ID8gJm1fcFZlcnRTY3JvbGxCYXIgOiAmbV9wSG9yelNjcm9sbEJhciktPnJlc2V0KHBTY3JvbGxCYXIpOw0KK30NCit2b2lkIENGV0xfRWRpdEltcDo6SW5pdEVuZ2luZSgpIHsNCisgIGlmIChtX3BFZHRFbmdpbmUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV9wRWR0RW5naW5lID0gSUZERV9UeHRFZHRFbmdpbmU6OkNyZWF0ZSgpOw0KK30NCitleHRlcm4gRlhfQk9PTCBGV0xfU2hvd0NhcmV0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmlzaWJsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJ0QW5jaG9yKTsNCit2b2lkIENGV0xfRWRpdEltcDo6U2hvd0NhcmV0KEZYX0JPT0wgYlZpc2libGUsIENGWF9SZWN0RiogcFJlY3QpIHsNCisgIGlmIChtX3BDYXJldCkgew0KKyAgICBtX3BDYXJldC0+U2hvd0NhcmV0KGJWaXNpYmxlKTsNCisgICAgaWYgKGJWaXNpYmxlICYmICFwUmVjdC0+SXNFbXB0eSgpKSB7DQorICAgICAgbV9wQ2FyZXQtPlNldFdpZGdldFJlY3QoKnBSZWN0KTsNCisgICAgfQ0KKyAgICBSZXBhaW50KCZtX3J0RW5naW5lKTsNCisgIH0gZWxzZSB7DQorICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBtX3BJbnRlcmZhY2U7DQorICAgIGlmIChiVmlzaWJsZSkgew0KKyAgICAgIHBSZWN0LT5PZmZzZXQobV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5sZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC50b3ApOw0KKyAgICB9DQorICAgIHdoaWxlIChwT3V0ZXItPkdldE91dGVyKCkpIHsNCisgICAgICBwT3V0ZXIgPSBwT3V0ZXItPkdldE91dGVyKCk7DQorICAgICAgaWYgKGJWaXNpYmxlKSB7DQorICAgICAgICBDRlhfUmVjdEYgcnRPdXRlcjsNCisgICAgICAgIHBPdXRlci0+R2V0V2lkZ2V0UmVjdChydE91dGVyKTsNCisgICAgICAgIHBSZWN0LT5PZmZzZXQocnRPdXRlci5sZWZ0LCBydE91dGVyLnRvcCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIEZXTF9TaG93Q2FyZXQocE91dGVyLCBiVmlzaWJsZSwgcFJlY3QpOw0KKyAgfQ0KK30NCitGWF9CT09MIENGV0xfRWRpdEltcDo6VmFsaWRhdGVOdW1iZXJDaGFyKEZYX1dDSEFSIGNOdW0pIHsNCisgIGlmICghbV9wRWR0RW5naW5lKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICghbV9iU2V0UmFuZ2UpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c09sZCwgd3NUZXh0Ow0KKyAgbV9wRWR0RW5naW5lLT5HZXRUZXh0KHdzVGV4dCwgMCk7DQorICBpZiAod3NUZXh0LklzRW1wdHkoKSkgew0KKyAgICBpZiAoY051bSA9PSBMJzAnKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaW50MzJfdCBjYXJldFBvcyA9IG1fcEVkdEVuZ2luZS0+R2V0Q2FyZXRQb3MoKTsNCisgIGludDMyX3QgaVNlbCA9IENvdW50U2VsUmFuZ2VzKCk7DQorICBpZiAoaVNlbCA9PSAwKSB7DQorICAgIGlmIChjTnVtID09IEwnMCcgJiYgY2FyZXRQb3MgPT0gMCkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpbnQzMl90IG5MZW4gPSB3c1RleHQuR2V0TGVuZ3RoKCk7DQorICAgIENGWF9XaWRlU3RyaW5nIGwgPSB3c1RleHQuTWlkKDAsIGNhcmV0UG9zKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgciA9IHdzVGV4dC5NaWQoY2FyZXRQb3MsIG5MZW4gLSBjYXJldFBvcyk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTmV3ID0gbCArIGNOdW0gKyByOw0KKyAgICBpZiAod3NOZXcuR2V0SW50ZWdlcigpIDw9IG1faU1heCkgew0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBpZiAod3NUZXh0LkdldEludGVnZXIoKSA8PSBtX2lNYXgpIHsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkIENGV0xfRWRpdEltcDo6SW5pdENhcmV0KCkgew0KKyAgaWYgKCFtX3BDYXJldCkgew0KKyAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX0lubmVyQ2FyZXQpKSB7DQorICAgICAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHByb3A7DQorICAgICAgbV9wQ2FyZXQucmVzZXQoSUZXTF9DYXJldDo6Q3JlYXRlKHByb3AsIG1fcEludGVyZmFjZSkpOw0KKyAgICAgIG1fcENhcmV0LT5Jbml0aWFsaXplKCk7DQorICAgICAgbV9wQ2FyZXQtPlNldFBhcmVudChtX3BJbnRlcmZhY2UpOw0KKyAgICAgIG1fcENhcmV0LT5TZXRTdGF0ZXMobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyk7DQorICAgIH0NCisgIH0gZWxzZSBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX0lubmVyQ2FyZXQpID09DQorICAgICAgICAgICAgIDApIHsNCisgICAgbV9wQ2FyZXQucmVzZXQoKTsNCisgIH0NCit9DQordm9pZCBDRldMX0VkaXRJbXA6OkNsZWFyUmVjb3JkKCkgew0KKyAgbV9pQ3VyUmVjb3JkID0gLTE7DQorICBtX1JlY29yZEFyci5SZW1vdmVBbGwoKTsNCit9DQordm9pZCBDRldMX0VkaXRJbXA6OlByb2Nlc3NJbnNlcnRFcnJvcihpbnQzMl90IGlFcnJvcikgew0KKyAgc3dpdGNoIChpRXJyb3IpIHsNCisgICAgY2FzZSAtMjogew0KKyAgICAgIENGV0xfRXZ0RWR0VGV4dEZ1bGwgdGV4dEZ1bGxFdmVudDsNCisgICAgICB0ZXh0RnVsbEV2ZW50Lm1fcFNyY1RhcmdldCA9IG1fcEludGVyZmFjZTsNCisgICAgICBEaXNwYXRjaEV2ZW50KCZ0ZXh0RnVsbEV2ZW50KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KK30NCitDRldMX0VkaXRJbXBEZWxlZ2F0ZTo6Q0ZXTF9FZGl0SW1wRGVsZWdhdGUoQ0ZXTF9FZGl0SW1wKiBwT3duZXIpDQorICAgIDogbV9wT3duZXIocE93bmVyKSB7fQ0KK2ludDMyX3QgQ0ZXTF9FZGl0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgaWYgKCFwTWVzc2FnZSkNCisgICAgcmV0dXJuIDA7DQorICBGWF9EV09SRCBkd01zZ0NvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KKyAgaW50MzJfdCBpUmV0ID0gMTsNCisgIHN3aXRjaCAoZHdNc2dDb2RlKSB7DQorICAgIGNhc2UgRldMX01TR0hBU0hfQWN0aXZhdGU6IHsNCisgICAgICBEb0FjdGl2YXRlKHN0YXRpY19jYXN0PENGV0xfTXNnQWN0aXZhdGUqPihwTWVzc2FnZSkpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01TR0hBU0hfRGVhY3RpdmF0ZTogew0KKyAgICAgIERvRGVhY3RpdmF0ZShzdGF0aWNfY2FzdDxDRldMX01zZ0RlYWN0aXZhdGUqPihwTWVzc2FnZSkpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01TR0hBU0hfU2V0Rm9jdXM6DQorICAgIGNhc2UgRldMX01TR0hBU0hfS2lsbEZvY3VzOiB7DQorICAgICAgT25Gb2N1c0NoYW5nZWQocE1lc3NhZ2UsIGR3TXNnQ29kZSA9PSBGV0xfTVNHSEFTSF9TZXRGb2N1cyk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9Nb3VzZTogew0KKyAgICAgIENGV0xfTXNnTW91c2UqIHBNc2cgPSBzdGF0aWNfY2FzdDxDRldMX01zZ01vdXNlKj4ocE1lc3NhZ2UpOw0KKyAgICAgIEZYX0RXT1JEIGR3Q21kID0gcE1zZy0+bV9kd0NtZDsNCisgICAgICBzd2l0Y2ggKGR3Q21kKSB7DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjogew0KKyAgICAgICAgICBPbkxCdXR0b25Eb3duKHBNc2cpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25VcDogew0KKyAgICAgICAgICBPbkxCdXR0b25VcChwTXNnKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRGJsQ2xrOiB7DQorICAgICAgICAgIE9uQnV0dG9uRGJsQ2xrKHBNc2cpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTW92ZTogew0KKyAgICAgICAgICBPbk1vdXNlTW92ZShwTXNnKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9SQnV0dG9uRG93bjogew0KKyAgICAgICAgICBEb0J1dHRvbkRvd24ocE1zZyk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDoge30NCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9LZXk6IHsNCisgICAgICBDRldMX01zZ0tleSogcEtleSA9IHN0YXRpY19jYXN0PENGV0xfTXNnS2V5Kj4ocE1lc3NhZ2UpOw0KKyAgICAgIEZYX0RXT1JEIGR3Q21kID0gcEtleS0+bV9kd0NtZDsNCisgICAgICBpZiAoZHdDbWQgPT0gRldMX01TR0tFWUNNRF9LZXlEb3duKSB7DQorICAgICAgICBPbktleURvd24ocEtleSk7DQorICAgICAgfSBlbHNlIGlmIChkd0NtZCA9PSBGV0xfTVNHS0VZQ01EX0NoYXIpIHsNCisgICAgICAgIE9uQ2hhcihwS2V5KTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZGVmYXVsdDogeyBpUmV0ID0gMDsgfQ0KKyAgfQ0KKyAgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorICByZXR1cm4gaVJldDsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSB7DQorICBpZiAoIXBFdmVudCkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIEZYX0RXT1JEIGR3SGFzaENvZGUgPSBwRXZlbnQtPkdldENsYXNzSUQoKTsNCisgIGlmIChkd0hhc2hDb2RlICE9IEZXTF9FVlRIQVNIX1Njcm9sbCkgew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICBJRldMX1dpZGdldCogcFNyY1RhcmdldCA9IHBFdmVudC0+bV9wU3JjVGFyZ2V0Ow0KKyAgaWYgKChwU3JjVGFyZ2V0ID09IG1fcE93bmVyLT5tX3BWZXJ0U2Nyb2xsQmFyLmdldCgpICYmDQorICAgICAgIG1fcE93bmVyLT5tX3BWZXJ0U2Nyb2xsQmFyKSB8fA0KKyAgICAgIChwU3JjVGFyZ2V0ID09IG1fcE93bmVyLT5tX3BIb3J6U2Nyb2xsQmFyLmdldCgpICYmDQorICAgICAgIG1fcE93bmVyLT5tX3BIb3J6U2Nyb2xsQmFyKSkgew0KKyAgICBDRldMX0V2dFNjcm9sbCogcFNjcm9sbEV2ZW50ID0gc3RhdGljX2Nhc3Q8Q0ZXTF9FdnRTY3JvbGwqPihwRXZlbnQpOw0KKyAgICBPblNjcm9sbChzdGF0aWNfY2FzdDxJRldMX1Njcm9sbEJhcio+KHBTcmNUYXJnZXQpLA0KKyAgICAgICAgICAgICBwU2Nyb2xsRXZlbnQtPm1faVNjcm9sbENvZGUsIHBTY3JvbGxFdmVudC0+bV9mUG9zKTsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0VkaXRJbXBEZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICByZXR1cm4gbV9wT3duZXItPkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCit9DQordm9pZCBDRldMX0VkaXRJbXBEZWxlZ2F0ZTo6RG9BY3RpdmF0ZShDRldMX01zZ0FjdGl2YXRlKiBwTXNnKSB7DQorICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSB+RldMX1dHVFNUQVRFX0RlYWN0aXZhdGVkOw0KKyAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCit9DQordm9pZCBDRldMX0VkaXRJbXBEZWxlZ2F0ZTo6RG9EZWFjdGl2YXRlKENGV0xfTXNnRGVhY3RpdmF0ZSogcE1zZykgew0KKyAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gRldMX1dHVFNUQVRFX0RlYWN0aXZhdGVkOw0KKyAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCit9DQordm9pZCBDRldMX0VkaXRJbXBEZWxlZ2F0ZTo6RG9CdXR0b25Eb3duKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmICgobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgPT0gMCkgew0KKyAgICBtX3BPd25lci0+U2V0Rm9jdXMoVFJVRSk7DQorICB9DQorICBpZiAoIW1fcE93bmVyLT5tX3BFZHRFbmdpbmUpIHsNCisgICAgbV9wT3duZXItPlVwZGF0ZUVkaXRFbmdpbmUoKTsNCisgIH0NCisgIElGREVfVHh0RWR0UGFnZSogcFBhZ2UgPSBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5HZXRQYWdlKDApOw0KKyAgaWYgKCFwUGFnZSkNCisgICAgcmV0dXJuOw0KKyAgQ0ZYX1BvaW50RiBwdDsNCisgIHB0LlNldChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgIG1fcE93bmVyLT5EZXZpY2VUb0VuZ2luZShwdCk7DQorICBGWF9CT09MIGJCZWZvcmUgPSBUUlVFOw0KKyAgaW50MzJfdCBuSW5kZXggPSBwUGFnZS0+R2V0Q2hhckluZGV4KHB0LCBiQmVmb3JlKTsNCisgIGlmIChuSW5kZXggPCAwKSB7DQorICAgIG5JbmRleCA9IDA7DQorICB9DQorICBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5TZXRDYXJldFBvcyhuSW5kZXgsIGJCZWZvcmUpOw0KK30NCit2b2lkIENGV0xfRWRpdEltcERlbGVnYXRlOjpPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UqIHBNc2csIEZYX0JPT0wgYlNldCkgew0KKyAgRlhfRFdPUkQgZHdTdHlsZUV4ID0gbV9wT3duZXItPkdldFN0eWxlc0V4KCk7DQorICBGWF9CT09MIGJSZXBhaW50ID0gZHdTdHlsZUV4ICYgRldMX1NUWUxFRVhUX0VEVF9Jbm5lckNhcmV0Ow0KKyAgaWYgKGJTZXQpIHsNCisgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICAgIGlmICghbV9wT3duZXItPm1fcEVkdEVuZ2luZSkgew0KKyAgICAgIG1fcE93bmVyLT5VcGRhdGVFZGl0RW5naW5lKCk7DQorICAgIH0NCisgICAgbV9wT3duZXItPlVwZGF0ZVZBbGlnbm1lbnQoKTsNCisgICAgbV9wT3duZXItPlVwZGF0ZU9mZnNldCgpOw0KKyAgICBtX3BPd25lci0+VXBkYXRlQ2FyZXQoKTsNCisgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgew0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1dHVFNUQVRFX0ZvY3VzZWQ7DQorICAgIG1fcE93bmVyLT5TaG93Q2FyZXQoRkFMU0UpOw0KKyAgICBpZiAobV9wT3duZXItPm1fcEVkdEVuZ2luZSAmJg0KKyAgICAgICAgKGR3U3R5bGVFeCAmIEZXTF9TVFlMRUVYVF9FRFRfTm9IaWRlU2VsKSA9PSAwKSB7DQorICAgICAgaW50MzJfdCBuU2VsID0gbV9wT3duZXItPkNvdW50U2VsUmFuZ2VzKCk7DQorICAgICAgaWYgKG5TZWwgPiAwKSB7DQorICAgICAgICBtX3BPd25lci0+Q2xlYXJTZWxlY3Rpb25zKCk7DQorICAgICAgICBiUmVwYWludCA9IFRSVUU7DQorICAgICAgfQ0KKyAgICAgIG1fcE93bmVyLT5TZXRDYXJldFBvcygwKTsNCisgICAgICBtX3BPd25lci0+VXBkYXRlT2Zmc2V0KCk7DQorICAgIH0NCisgICAgbV9wT3duZXItPkNsZWFyUmVjb3JkKCk7DQorICB9DQorICBtX3BPd25lci0+TGF5b3V0U2Nyb2xsQmFyKCk7DQorICBpZiAoYlJlcGFpbnQpIHsNCisgICAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZTsNCisgICAgcnRJbnZhbGlkYXRlLlNldCgwLCAwLCBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQpOw0KKyAgICBtX3BPd25lci0+UmVwYWludCgmcnRJbnZhbGlkYXRlKTsNCisgIH0NCit9DQordm9pZCBDRldMX0VkaXRJbXBEZWxlZ2F0ZTo6T25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBEb0N1cnNvcihwTXNnKTsNCisgIGlmIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBtX3BPd25lci0+bV9iTEJ1dHRvbkRvd24gPSBUUlVFOw0KKyAgbV9wT3duZXItPlNldEdyYWIoVFJVRSk7DQorICBEb0J1dHRvbkRvd24ocE1zZyk7DQorICBpbnQzMl90IG5JbmRleCA9IG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkdldENhcmV0UG9zKCk7DQorICBGWF9CT09MIGJSZXBhaW50ID0gRkFMU0U7DQorICBpbnQzMl90IGlDb3VudCA9IG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkNvdW50U2VsUmFuZ2VzKCk7DQorICBpZiAoaUNvdW50ID4gMCkgew0KKyAgICBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5DbGVhclNlbGVjdGlvbigpOw0KKyAgICBiUmVwYWludCA9IFRSVUU7DQorICB9DQorICBGWF9CT09MIGJTaGlmdCA9IHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX1NoaWZ0Ow0KKyAgaWYgKGJTaGlmdCAmJiBtX3BPd25lci0+bV9uU2VsU3RhcnQgIT0gbkluZGV4KSB7DQorICAgIGludDMyX3QgaVN0YXJ0ID0gc3RkOjptaW4obV9wT3duZXItPm1fblNlbFN0YXJ0LCBuSW5kZXgpOw0KKyAgICBpbnQzMl90IGlFbmQgPSBzdGQ6Om1heChtX3BPd25lci0+bV9uU2VsU3RhcnQsIG5JbmRleCk7DQorICAgIG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkFkZFNlbFJhbmdlKGlTdGFydCwgaUVuZCAtIGlTdGFydCk7DQorICAgIGJSZXBhaW50ID0gVFJVRTsNCisgIH0gZWxzZSB7DQorICAgIG1fcE93bmVyLT5tX25TZWxTdGFydCA9IG5JbmRleDsNCisgIH0NCisgIGlmIChiUmVwYWludCkgew0KKyAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRFbmdpbmUpOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfRWRpdEltcERlbGVnYXRlOjpPbkxCdXR0b25VcChDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBEb0N1cnNvcihwTXNnKTsNCisgIG1fcE93bmVyLT5tX2JMQnV0dG9uRG93biA9IEZBTFNFOw0KKyAgbV9wT3duZXItPlNldEdyYWIoRkFMU0UpOw0KK30NCit2b2lkIENGV0xfRWRpdEltcERlbGVnYXRlOjpPbkJ1dHRvbkRibENsayhDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBpZiAoIW1fcE93bmVyLT5tX3BFZHRFbmdpbmUpDQorICAgIHJldHVybjsNCisgIERvQ3Vyc29yKHBNc2cpOw0KKyAgSUZERV9UeHRFZHRQYWdlKiBwUGFnZSA9IG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkdldFBhZ2UoMCk7DQorICBpZiAoIXBQYWdlKQ0KKyAgICByZXR1cm47DQorICBDRlhfUG9pbnRGIHB0Ow0KKyAgcHQuU2V0KHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgbV9wT3duZXItPkRldmljZVRvRW5naW5lKHB0KTsNCisgIGludDMyX3QgbkNvdW50ID0gMDsNCisgIGludDMyX3QgbkluZGV4ID0gcFBhZ2UtPlNlbGVjdFdvcmQocHQsIG5Db3VudCk7DQorICBpZiAobkluZGV4IDwgMCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5BZGRTZWxSYW5nZShuSW5kZXgsIG5Db3VudCk7DQorICBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5TZXRDYXJldFBvcyhuSW5kZXggKyBuQ291bnQgLSAxLCBGQUxTRSk7DQorICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRFbmdpbmUpOw0KK30NCit2b2lkIENGV0xfRWRpdEltcERlbGVnYXRlOjpPbk1vdXNlTW92ZShDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBpZiAoIW1fcE93bmVyLT5tX3BFZHRFbmdpbmUpDQorICAgIHJldHVybjsNCisgIERvQ3Vyc29yKHBNc2cpOw0KKyAgaWYgKG1fcE93bmVyLT5tX25TZWxTdGFydCA9PSAtMSB8fCAhbV9wT3duZXItPm1fYkxCdXR0b25Eb3duKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElGREVfVHh0RWR0UGFnZSogcFBhZ2UgPSBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5HZXRQYWdlKDApOw0KKyAgaWYgKCFwUGFnZSkNCisgICAgcmV0dXJuOw0KKyAgQ0ZYX1BvaW50RiBwdDsNCisgIHB0LlNldChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgIG1fcE93bmVyLT5EZXZpY2VUb0VuZ2luZShwdCk7DQorICBGWF9CT09MIGJCZWZvcmUgPSBUUlVFOw0KKyAgaW50MzJfdCBuSW5kZXggPSBwUGFnZS0+R2V0Q2hhckluZGV4KHB0LCBiQmVmb3JlKTsNCisgIG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPlNldENhcmV0UG9zKG5JbmRleCwgYkJlZm9yZSk7DQorICBuSW5kZXggPSBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5HZXRDYXJldFBvcygpOw0KKyAgbV9wT3duZXItPm1fcEVkdEVuZ2luZS0+Q2xlYXJTZWxlY3Rpb24oKTsNCisgIGlmIChuSW5kZXggIT0gbV9wT3duZXItPm1fblNlbFN0YXJ0KSB7DQorICAgIGludDMyX3QgbkxlbiA9IG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkdldFRleHRMZW5ndGgoKTsNCisgICAgaWYgKG1fcE93bmVyLT5tX25TZWxTdGFydCA+PSBuTGVuKSB7DQorICAgICAgbV9wT3duZXItPm1fblNlbFN0YXJ0ID0gbkxlbjsNCisgICAgfQ0KKyAgICBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5BZGRTZWxSYW5nZSgNCisgICAgICAgIHN0ZDo6bWluKG1fcE93bmVyLT5tX25TZWxTdGFydCwgbkluZGV4KSwNCisgICAgICAgIEZYU1lTX2FicyhuSW5kZXggLSBtX3BPd25lci0+bV9uU2VsU3RhcnQpKTsNCisgIH0NCit9DQordm9pZCBDRldMX0VkaXRJbXBEZWxlZ2F0ZTo6T25LZXlEb3duKENGV0xfTXNnS2V5KiBwTXNnKSB7DQorICBpZiAoIW1fcE93bmVyLT5tX3BFZHRFbmdpbmUpDQorICAgIHJldHVybjsNCisgIEZERV9UWFRFRFRNT1ZFQ0FSRVQgTW92ZUNhcmV0ID0gTUNfTW92ZU5vbmU7DQorICBGWF9CT09MIGJTaGlmdCA9IHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX1NoaWZ0Ow0KKyAgRlhfQk9PTCBiQ3RybCA9IHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX0N0cmw7DQorICBGWF9EV09SRCBkd0tleUNvZGUgPSBwTXNnLT5tX2R3S2V5Q29kZTsNCisgIHN3aXRjaCAoZHdLZXlDb2RlKSB7DQorICAgIGNhc2UgRldMX1ZLRVlfTGVmdDogew0KKyAgICAgIE1vdmVDYXJldCA9IE1DX0xlZnQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfVktFWV9SaWdodDogew0KKyAgICAgIE1vdmVDYXJldCA9IE1DX1JpZ2h0Ow0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1ZLRVlfVXA6IHsNCisgICAgICBNb3ZlQ2FyZXQgPSBNQ19VcDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9WS0VZX0Rvd246IHsNCisgICAgICBNb3ZlQ2FyZXQgPSBNQ19Eb3duOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1ZLRVlfSG9tZTogew0KKyAgICAgIGlmIChiQ3RybCkgew0KKyAgICAgICAgTW92ZUNhcmV0ID0gTUNfSG9tZTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgTW92ZUNhcmV0ID0gTUNfTGluZVN0YXJ0Ow0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9WS0VZX0VuZDogew0KKyAgICAgIGlmIChiQ3RybCkgew0KKyAgICAgICAgTW92ZUNhcmV0ID0gTUNfRW5kOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBNb3ZlQ2FyZXQgPSBNQ19MaW5lRW5kOw0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9WS0VZX0luc2VydDogew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1ZLRVlfRGVsZXRlOiB7DQorICAgICAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmDQorICAgICAgICAgICBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5KSB8fA0KKyAgICAgICAgICAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgaW50MzJfdCBuQ2FyZXQgPSBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5HZXRDYXJldFBvcygpOw0KKyNpZiAoX0ZYX09TXyA9PSBfRlhfTUFDT1NYXykNCisgICAgICBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5EZWxldGUobkNhcmV0LCBUUlVFKTsNCisjZWxzZQ0KKyAgICAgIG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkRlbGV0ZShuQ2FyZXQpOw0KKyNlbmRpZg0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1ZLRVlfRjI6IHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9WS0VZX1RhYjogew0KKyAgICAgIG1fcE93bmVyLT5EaXNwYXRjaEtleUV2ZW50KHBNc2cpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsNCisjaWYgKF9GWF9PU18gPT0gX0ZYX01BQ09TWF8pDQorICAgICAgaWYgKHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX0NvbW1hbmQpDQorI2Vsc2UNCisgICAgICBpZiAocE1zZy0+bV9kd0ZsYWdzICYgRldMX0tFWUZMQUdfQ3RybCkNCisjZW5kaWYNCisgICAgICB7DQorICAgICAgICBpZiAoZHdLZXlDb2RlID09IDB4NDMgfHwgZHdLZXlDb2RlID09IDB4NjMpIHsNCisgICAgICAgICAgbV9wT3duZXItPkRvQ2xpcGJvYXJkKDEpOw0KKyAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBpZiAoZHdLZXlDb2RlID09IDB4NTggfHwgZHdLZXlDb2RlID09IDB4NzgpIHsNCisgICAgICAgICAgbV9wT3duZXItPkRvQ2xpcGJvYXJkKDIpOw0KKyAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBpZiAoZHdLZXlDb2RlID09IDB4NTYgfHwgZHdLZXlDb2RlID09IDB4NzYpIHsNCisgICAgICAgICAgbV9wT3duZXItPkRvQ2xpcGJvYXJkKDMpOw0KKyAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAoTW92ZUNhcmV0ICE9IE1DX01vdmVOb25lKSB7DQorICAgIG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPk1vdmVDYXJldFBvcyhNb3ZlQ2FyZXQsIGJTaGlmdCwgYkN0cmwpOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfRWRpdEltcERlbGVnYXRlOjpPbkNoYXIoQ0ZXTF9Nc2dLZXkqIHBNc2cpIHsNCisgIGlmICgobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5KSB8fA0KKyAgICAgIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKCFtX3BPd25lci0+bV9wRWR0RW5naW5lKQ0KKyAgICByZXR1cm47DQorICBpbnQzMl90IGlFcnJvciA9IDA7DQorICBGWF9XQ0hBUiBjID0gKEZYX1dDSEFSKXBNc2ctPm1fZHdLZXlDb2RlOw0KKyAgaW50MzJfdCBuQ2FyZXQgPSBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5HZXRDYXJldFBvcygpOw0KKyAgc3dpdGNoIChjKSB7DQorICAgIGNhc2UgRldMX1ZLRVlfQmFjazogew0KKyAgICAgIG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkRlbGV0ZShuQ2FyZXQsIFRSVUUpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgMHgwQTogew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1ZLRVlfRXNjYXBlOiB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfVktFWV9UYWI6IHsNCisgICAgICBpRXJyb3IgPSBtX3BPd25lci0+bV9wRWR0RW5naW5lLT5JbnNlcnQobkNhcmV0LCBMIlx0IiwgMSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfVktFWV9SZXR1cm46IHsNCisgICAgICBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJg0KKyAgICAgICAgICBGV0xfU1RZTEVFWFRfRURUX1dhbnRSZXR1cm4pIHsNCisgICAgICAgIGlFcnJvciA9IG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkluc2VydChuQ2FyZXQsIEwiXG4iLCAxKTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZGVmYXVsdDogew0KKyAgICAgIGlmICghbV9wT3duZXItPm1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICAgICAgaWYgKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9OdW1iZXIpIHsNCisgICAgICAgICAgaWYgKCgocE1zZy0+bV9kd0tleUNvZGUgPCBGV0xfVktFWV8wKSAmJg0KKyAgICAgICAgICAgICAgIChwTXNnLT5tX2R3S2V5Q29kZSAhPSAweDJFICYmIHBNc2ctPm1fZHdLZXlDb2RlICE9IDB4MkQpKSB8fA0KKyAgICAgICAgICAgICAgcE1zZy0+bV9kd0tleUNvZGUgPiBGV0xfVktFWV85KSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKCFtX3BPd25lci0+VmFsaWRhdGVOdW1iZXJDaGFyKGMpKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorI2lmIChfRlhfT1NfID09IF9GWF9NQUNPU1hfKQ0KKyAgICAgIGlmIChwTXNnLT5tX2R3RmxhZ3MgJiBGV0xfS0VZRkxBR19Db21tYW5kKQ0KKyNlbHNlDQorICAgICAgaWYgKHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX0N0cmwpDQorI2VuZGlmDQorICAgICAgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlFcnJvciA9IG1fcE93bmVyLT5tX3BFZHRFbmdpbmUtPkluc2VydChuQ2FyZXQsICZjLCAxKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGlFcnJvciA8IDApIHsNCisgICAgbV9wT3duZXItPlByb2Nlc3NJbnNlcnRFcnJvcihpRXJyb3IpOw0KKyAgfQ0KK30NCitGWF9CT09MIENGV0xfRWRpdEltcERlbGVnYXRlOjpPblNjcm9sbChJRldMX1Njcm9sbEJhciogcFNjcm9sbEJhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0NvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBvcykgew0KKyAgQ0ZYX1NpemVGIGZzOw0KKyAgcFNjcm9sbEJhci0+R2V0UmFuZ2UoZnMueCwgZnMueSk7DQorICBGWF9GTE9BVCBpQ3VyUG9zID0gcFNjcm9sbEJhci0+R2V0UG9zKCk7DQorICBGWF9GTE9BVCBmU3RlcCA9IHBTY3JvbGxCYXItPkdldFN0ZXBTaXplKCk7DQorICBzd2l0Y2ggKGR3Q29kZSkgew0KKyAgICBjYXNlIEZXTF9TQ0JDT0RFX01pbjogew0KKyAgICAgIGZQb3MgPSBmcy54Ow0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1NDQkNPREVfTWF4OiB7DQorICAgICAgZlBvcyA9IGZzLnk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU0NCQ09ERV9TdGVwQmFja3dhcmQ6IHsNCisgICAgICBmUG9zIC09IGZTdGVwOw0KKyAgICAgIGlmIChmUG9zIDwgZnMueCArIGZTdGVwIC8gMikgew0KKyAgICAgICAgZlBvcyA9IGZzLng7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1NDQkNPREVfU3RlcEZvcndhcmQ6IHsNCisgICAgICBmUG9zICs9IGZTdGVwOw0KKyAgICAgIGlmIChmUG9zID4gZnMueSAtIGZTdGVwIC8gMikgew0KKyAgICAgICAgZlBvcyA9IGZzLnk7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1NDQkNPREVfUGFnZUJhY2t3YXJkOiB7DQorICAgICAgZlBvcyAtPSBwU2Nyb2xsQmFyLT5HZXRQYWdlU2l6ZSgpOw0KKyAgICAgIGlmIChmUG9zIDwgZnMueCkgew0KKyAgICAgICAgZlBvcyA9IGZzLng7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1NDQkNPREVfUGFnZUZvcndhcmQ6IHsNCisgICAgICBmUG9zICs9IHBTY3JvbGxCYXItPkdldFBhZ2VTaXplKCk7DQorICAgICAgaWYgKGZQb3MgPiBmcy55KSB7DQorICAgICAgICBmUG9zID0gZnMueTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU0NCQ09ERV9Qb3M6DQorICAgIGNhc2UgRldMX1NDQkNPREVfVHJhY2tQb3M6IHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9TQ0JDT0RFX0VuZFNjcm9sbDogew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KKyAgaWYgKGlDdXJQb3MgIT0gZlBvcykgew0KKyAgICBwU2Nyb2xsQmFyLT5TZXRQb3MoZlBvcyk7DQorICAgIHBTY3JvbGxCYXItPlNldFRyYWNrUG9zKGZQb3MpOw0KKyAgICBtX3BPd25lci0+VXBkYXRlT2Zmc2V0KHBTY3JvbGxCYXIsIGZQb3MgLSBpQ3VyUG9zKTsNCisgICAgaWYgKG1fcE93bmVyLT5tX3BFZHRFbmdpbmUpIHsNCisgICAgICBtX3BPd25lci0+VXBkYXRlQ2FyZXQoKTsNCisgICAgfQ0KKyAgICBDRlhfUmVjdEYgcmVjdDsNCisgICAgbV9wT3duZXItPkdldFdpZGdldFJlY3QocmVjdCk7DQorICAgIENGWF9SZWN0RiBydEludmFsaWRhdGU7DQorICAgIHJ0SW52YWxpZGF0ZS5TZXQoMCwgMCwgcmVjdC53aWR0aCArIDIsIHJlY3QuaGVpZ2h0ICsgMik7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZydEludmFsaWRhdGUpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZXTF9FZGl0SW1wRGVsZWdhdGU6OkRvQ3Vyc29yKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmIChtX3BPd25lci0+bV9ydENsaWVudC5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICBJRldMX0FkYXB0ZXJOYXRpdmUqIHBOYXRpdmUgPSBGV0xfR2V0QWRhcHRlck5hdGl2ZSgpOw0KKyAgICBJRldMX0FkYXB0ZXJDdXJzb3JNZ3IqIHBDdXJzb3JNZ3IgPSBwTmF0aXZlLT5HZXRDdXJzb3JNZ3IoKTsNCisgICAgaWYgKE5VTEwgIT0gcEN1cnNvck1ncikgew0KKyAgICAgIEZXTF9IQ1VSU09SIGhDdXJzb3IgPQ0KKyAgICAgICAgICBwQ3Vyc29yTWdyLT5HZXRTeXN0ZW1DdXJzb3IoRldMX0NVUlNPUlRZUEVfSW5wdXRCZWFtKTsNCisgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgfQ0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfZm9ybXByb3h5aW1wLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9mb3JtcHJveHlpbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmN2ZmMjMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfZm9ybXByb3h5aW1wLmNwcApAQCAtMCwwICsxLDU1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3RhcmdldGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9ub3RlaW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3dpZGdldGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9wYW5lbGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9mb3JtaW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2Zvcm1wcm94eWltcC5oIg0KKw0KK0NGV0xfRm9ybVByb3h5SW1wOjpDRldMX0Zvcm1Qcm94eUltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpDQorICAgIDogQ0ZXTF9Gb3JtSW1wKHByb3BlcnRpZXMsIHBPdXRlcikge30NCitDRldMX0Zvcm1Qcm94eUltcDo6fkNGV0xfRm9ybVByb3h5SW1wKCkge30NCitGV0xfRVJSIENGV0xfRm9ybVByb3h5SW1wOjpHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2xhc3MpIGNvbnN0IHsNCisgIHdzQ2xhc3MgPSBGV0xfQ0xBU1NfRm9ybVByb3h5Ow0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9EV09SRCBDRldMX0Zvcm1Qcm94eUltcDo6R2V0Q2xhc3NJRCgpIGNvbnN0IHsNCisgIHJldHVybiBGV0xfQ0xBU1NIQVNIX0Zvcm1Qcm94eTsNCit9DQorRlhfQk9PTCBDRldMX0Zvcm1Qcm94eUltcDo6SXNJbnN0YW5jZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2xhc3MpIGNvbnN0IHsNCisgIGlmICh3c0NsYXNzID09IENGWF9XaWRlU3RyaW5nQyhGV0xfQ0xBU1NfRm9ybVByb3h5KSkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBDRldMX0Zvcm1JbXA6OklzSW5zdGFuY2Uod3NDbGFzcyk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Gb3JtUHJveHlJbXA6OkluaXRpYWxpemUoKSB7DQorICBpZiAoQ0ZXTF9XaWRnZXRJbXA6OkluaXRpYWxpemUoKSAhPSBGV0xfRVJSX1N1Y2NlZWRlZCkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIG1fcERlbGVnYXRlID0gbmV3IENGV0xfRm9ybVByb3h5SW1wRGVsZWdhdGUodGhpcyk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Gb3JtUHJveHlJbXA6OkZpbmFsaXplKCkgew0KKyAgZGVsZXRlIG1fcERlbGVnYXRlOw0KKyAgbV9wRGVsZWdhdGUgPSBudWxscHRyOw0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpGaW5hbGl6ZSgpOw0KK30NCitGV0xfRVJSIENGV0xfRm9ybVByb3h5SW1wOjpVcGRhdGUoKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Gb3JtUHJveHlJbXA6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0NGV0xfRm9ybVByb3h5SW1wRGVsZWdhdGU6OkNGV0xfRm9ybVByb3h5SW1wRGVsZWdhdGUoQ0ZXTF9Gb3JtUHJveHlJbXAqIHBPd25lcikNCisgICAgOiBtX3BPd25lcihwT3duZXIpIHt9DQoraW50MzJfdCBDRldMX0Zvcm1Qcm94eUltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsNCisgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9IG1fcE93bmVyLT5tX3BPdXRlci0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICByZXR1cm4gcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2xpc3Rib3hpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX2xpc3Rib3hpbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNDJkNTYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfbGlzdGJveGltcC5jcHAKQEAgLTAsMCArMSwxMjQwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3RhcmdldGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9ub3RlaW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3dpZGdldGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9zY3JvbGxiYXJpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfbGlzdGJveGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9jb21ib2JveGltcC5oIg0KKw0KKyNkZWZpbmUgRldMX0xJU1RCT1hfSXRlbVRleHRNYXJnaW4gMg0KKw0KKy8vIHN0YXRpYw0KK0lGV0xfTGlzdEJveCogSUZXTF9MaXN0Qm94OjpDcmVhdGUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikgew0KKyAgSUZXTF9MaXN0Qm94KiBwTGlzdEJveCA9IG5ldyBJRldMX0xpc3RCb3g7DQorICBDRldMX0xpc3RCb3hJbXAqIHBMaXN0Qm94SW1wbCA9IG5ldyBDRldMX0xpc3RCb3hJbXAocHJvcGVydGllcywgcE91dGVyKTsNCisgIHBMaXN0Qm94LT5TZXRJbXBsKHBMaXN0Qm94SW1wbCk7DQorICBwTGlzdEJveEltcGwtPlNldEludGVyZmFjZShwTGlzdEJveCk7DQorICByZXR1cm4gcExpc3RCb3g7DQorfQ0KKy8vIHN0YXRpYw0KK0lGV0xfTGlzdEJveCogSUZXTF9MaXN0Qm94OjpDcmVhdGVDb21ib0xpc3QoDQorICAgIGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikgew0KKyAgSUZXTF9MaXN0Qm94KiBwTGlzdEJveCA9IG5ldyBJRldMX0xpc3RCb3g7DQorICBDRldMX0xpc3RCb3hJbXAqIHBDb21ib0xpc3RJbXBsID0gbmV3IENGV0xfQ29tYm9MaXN0SW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQorICBwTGlzdEJveC0+U2V0SW1wbChwQ29tYm9MaXN0SW1wbCk7DQorICBwQ29tYm9MaXN0SW1wbC0+U2V0SW50ZXJmYWNlKHBMaXN0Qm94KTsNCisgIHJldHVybiBwTGlzdEJveDsNCit9DQorSUZXTF9MaXN0Qm94OjpJRldMX0xpc3RCb3goKSB7fQ0KK2ludDMyX3QgSUZXTF9MaXN0Qm94OjpDb3VudFNlbEl0ZW1zKCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfTGlzdEJveEltcCo+KEdldEltcGwoKSktPkNvdW50U2VsSXRlbXMoKTsNCit9DQorRldMX0hMSVNUSVRFTSBJRldMX0xpc3RCb3g6OkdldFNlbEl0ZW0oaW50MzJfdCBuSW5kZXhTZWwpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0xpc3RCb3hJbXAqPihHZXRJbXBsKCkpLT5HZXRTZWxJdGVtKG5JbmRleFNlbCk7DQorfQ0KK2ludDMyX3QgSUZXTF9MaXN0Qm94OjpHZXRTZWxJbmRleChpbnQzMl90IG5JbmRleCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfTGlzdEJveEltcCo+KEdldEltcGwoKSktPkdldFNlbEluZGV4KG5JbmRleCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9MaXN0Qm94OjpTZXRTZWxJdGVtKEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0JPT0wgYlNlbGVjdCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfTGlzdEJveEltcCo+KEdldEltcGwoKSktPlNldFNlbEl0ZW0oaEl0ZW0sIGJTZWxlY3QpOw0KK30NCitGV0xfRVJSIElGV0xfTGlzdEJveDo6R2V0SXRlbVRleHQoRldMX0hMSVNUSVRFTSBoSXRlbSwgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfTGlzdEJveEltcCo+KEdldEltcGwoKSktPkdldEl0ZW1UZXh0KGhJdGVtLCB3c1RleHQpOw0KK30NCitGV0xfRVJSIElGV0xfTGlzdEJveDo6R2V0U2Nyb2xsUG9zKEZYX0ZMT0FUJiBmUG9zLCBGWF9CT09MIGJWZXJ0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9MaXN0Qm94SW1wKj4oR2V0SW1wbCgpKS0+R2V0U2Nyb2xsUG9zKGZQb3MsIGJWZXJ0KTsNCit9DQorRldMX0VSUiogSUZXTF9MaXN0Qm94OjpTb3J0KElGV0xfTGlzdEJveENvbXBhcmUqIHBDb20pIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0xpc3RCb3hJbXAqPihHZXRJbXBsKCkpLT5Tb3J0KHBDb20pOw0KK30NCisNCitDRldMX0xpc3RCb3hJbXA6OkNGV0xfTGlzdEJveEltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikNCisgICAgOiBDRldMX1dpZGdldEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpLA0KKyAgICAgIG1fZHdUVE9TdHlsZXMoMCksDQorICAgICAgbV9pVFRPQWxpZ25zKDApLA0KKyAgICAgIG1faEFuY2hvcihOVUxMKSwNCisgICAgICBtX2ZTY29ybGxCYXJXaWR0aCgwKSwNCisgICAgICBtX2JMQnV0dG9uRG93bihGQUxTRSksDQorICAgICAgbV9wU2Nyb2xsQmFyVFAoTlVMTCkgew0KKyAgbV9ydENsaWVudC5SZXNldCgpOw0KKyAgbV9ydENvbmVudC5SZXNldCgpOw0KKyAgbV9ydFN0YXRpYy5SZXNldCgpOw0KK30NCitDRldMX0xpc3RCb3hJbXA6On5DRldMX0xpc3RCb3hJbXAoKSB7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9MaXN0Qm94SW1wOjpHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2xhc3MpIGNvbnN0IHsNCisgIHdzQ2xhc3MgPSBGV0xfQ0xBU1NfTGlzdEJveDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9MaXN0Qm94SW1wOjpHZXRDbGFzc0lEKCkgY29uc3Qgew0KKyAgcmV0dXJuIEZXTF9DTEFTU0hBU0hfTGlzdEJveDsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3hJbXA6OkluaXRpYWxpemUoKSB7DQorICBpZiAoQ0ZXTF9XaWRnZXRJbXA6OkluaXRpYWxpemUoKSAhPSBGV0xfRVJSX1N1Y2NlZWRlZCkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIG1fcERlbGVnYXRlID0gbmV3IENGV0xfTGlzdEJveEltcERlbGVnYXRlKHRoaXMpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfTGlzdEJveEltcDo6RmluYWxpemUoKSB7DQorICBpZiAobV9wVmVydFNjcm9sbEJhcikgew0KKyAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5GaW5hbGl6ZSgpOw0KKyAgfQ0KKyAgaWYgKG1fcEhvcnpTY3JvbGxCYXIpIHsNCisgICAgbV9wSG9yelNjcm9sbEJhci0+RmluYWxpemUoKTsNCisgIH0NCisgIGRlbGV0ZSBtX3BEZWxlZ2F0ZTsNCisgIG1fcERlbGVnYXRlID0gbnVsbHB0cjsNCisgIHJldHVybiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKTsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3hJbXA6OkdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSkgew0KKyAgaWYgKGJBdXRvU2l6ZSkgew0KKyAgICByZWN0LlNldCgwLCAwLCAwLCAwKTsNCisgICAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKSB7DQorICAgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICAgIH0NCisgICAgQ0ZYX1NpemVGIGZzID0gQ2FsY1NpemUoVFJVRSk7DQorICAgIHJlY3QuU2V0KDAsIDAsIGZzLngsIGZzLnkpOw0KKyAgICBDRldMX1dpZGdldEltcDo6R2V0V2lkZ2V0UmVjdChyZWN0LCBUUlVFKTsNCisgIH0gZWxzZSB7DQorICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfTGlzdEJveEltcDo6VXBkYXRlKCkgew0KKyAgaWYgKElzTG9ja2VkKCkpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIH0NCisgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikgew0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCisgIH0NCisgIG1faVRUT0FsaWducyA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyOw0KKyAgc3dpdGNoIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9BbGlnbk1hc2spIHsNCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfTFRCX0xlZnRBbGlnbjogew0KKyAgICAgIG1faVRUT0FsaWducyA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyTGVmdDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9MVEJfUmlnaHRBbGlnbjogew0KKyAgICAgIG1faVRUT0FsaWducyA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyUmlnaHQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfTFRCX0NlbnRlckFsaWduOg0KKyAgICBkZWZhdWx0OiB7IG1faVRUT0FsaWducyA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyOyB9DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9XR1RTVFlMRV9SVExSZWFkaW5nKSB7DQorICAgIG1fZHdUVE9TdHlsZXMgfD0gRkRFX1RUT1NUWUxFX1JUTDsNCisgIH0NCisgIG1fZHdUVE9TdHlsZXMgfD0gRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmU7DQorICBtX2ZTY29ybGxCYXJXaWR0aCA9IEdldFNjcm9sbFdpZHRoKCk7DQorICBTb3J0SXRlbSgpOw0KKyAgQ2FsY1NpemUoKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9MaXN0Qm94SW1wOjpIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKElzU2hvd1Njcm9sbEJhcihGQUxTRSkpIHsNCisgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgIG1fcEhvcnpTY3JvbGxCYXItPkdldFdpZGdldFJlY3QocmVjdCk7DQorICAgIGlmIChyZWN0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfSFNjcm9sbEJhcjsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKElzU2hvd1Njcm9sbEJhcihUUlVFKSkgew0KKyAgICBDRlhfUmVjdEYgcmVjdDsNCisgICAgbV9wVmVydFNjcm9sbEJhci0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgICAgaWYgKHJlY3QuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9WU2Nyb2xsQmFyOw0KKyAgICB9DQorICB9DQorICBpZiAobV9ydENsaWVudC5Db250YWlucyhmeCwgZnkpKSB7DQorICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9DbGllbnQ7DQorICB9DQorICByZXR1cm4gRldMX1dHVEhJVFRFU1RfVW5rbm93bjsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3hJbXA6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgaWYgKCFwR3JhcGhpY3MpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBpZiAoSGFzQm9yZGVyKCkpIHsNCisgICAgRHJhd0JvcmRlcihwR3JhcGhpY3MsIEZXTF9QQVJUX0xUQl9Cb3JkZXIsIHBUaGVtZSwgcE1hdHJpeCk7DQorICB9DQorICBpZiAoSGFzRWRnZSgpKSB7DQorICAgIERyYXdFZGdlKHBHcmFwaGljcywgRldMX1BBUlRfTFRCX0VkZ2UsIHBUaGVtZSwgcE1hdHJpeCk7DQorICB9DQorICBDRlhfUmVjdEYgcnRDbGlwKG1fcnRDb25lbnQpOw0KKyAgaWYgKElzU2hvd1Njcm9sbEJhcihGQUxTRSkpIHsNCisgICAgcnRDbGlwLmhlaWdodCAtPSBtX2ZTY29ybGxCYXJXaWR0aDsNCisgIH0NCisgIGlmIChJc1Nob3dTY3JvbGxCYXIoVFJVRSkpIHsNCisgICAgcnRDbGlwLndpZHRoIC09IG1fZlNjb3JsbEJhcldpZHRoOw0KKyAgfQ0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcE1hdHJpeC0+VHJhbnNmb3JtUmVjdChydENsaXApOw0KKyAgfQ0KKyAgcEdyYXBoaWNzLT5TZXRDbGlwUmVjdChydENsaXApOw0KKyAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX05vQmFja2dyb3VuZCkgPT0gMCkgew0KKyAgICBEcmF3Qmtncm91bmQocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgRHJhd0l0ZW1zKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCisgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3hJbXA6OlNldFRoZW1lUHJvdmlkZXIoSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWVQcm92aWRlcikgew0KKyAgaWYgKCFwVGhlbWVQcm92aWRlcikNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIGlmICghcFRoZW1lUHJvdmlkZXItPklzVmFsaWRXaWRnZXQobV9wSW50ZXJmYWNlKSkgew0KKyAgICBtX3BTY3JvbGxCYXJUUCA9IHBUaGVtZVByb3ZpZGVyOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gcFRoZW1lUHJvdmlkZXI7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK2ludDMyX3QgQ0ZXTF9MaXN0Qm94SW1wOjpDb3VudFNlbEl0ZW1zKCkgew0KKyAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpDQorICAgIHJldHVybiAwOw0KKyAgaW50MzJfdCBpUmV0ID0gMDsNCisgIElGV0xfTGlzdEJveERQKiBwRGF0YSA9DQorICAgICAgc3RhdGljX2Nhc3Q8SUZXTF9MaXN0Qm94RFAqPihtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgaW50MzJfdCBpQ291bnQgPSBwRGF0YS0+Q291bnRJdGVtcyhtX3BJbnRlcmZhY2UpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaSk7DQorICAgIGlmICghaEl0ZW0pIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBGWF9EV09SRCBkd1N0eWxlID0gcERhdGEtPkdldEl0ZW1TdHlsZXMobV9wSW50ZXJmYWNlLCBoSXRlbSk7DQorICAgIGlmIChkd1N0eWxlICYgRldMX0lURU1TVEFURV9MVEJfU2VsZWN0ZWQpIHsNCisgICAgICBpUmV0Kys7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBpUmV0Ow0KK30NCitGV0xfSExJU1RJVEVNIENGV0xfTGlzdEJveEltcDo6R2V0U2VsSXRlbShpbnQzMl90IG5JbmRleFNlbCkgew0KKyAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpDQorICAgIHJldHVybiBOVUxMOw0KKyAgaW50MzJfdCBpbmRleCA9IDA7DQorICBJRldMX0xpc3RCb3hEUCogcERhdGEgPQ0KKyAgICAgIHN0YXRpY19jYXN0PElGV0xfTGlzdEJveERQKj4obV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgIGludDMyX3QgaUNvdW50ID0gcERhdGEtPkNvdW50SXRlbXMobV9wSW50ZXJmYWNlKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGkpOw0KKyAgICBpZiAoIWhJdGVtKSB7DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgRlhfRFdPUkQgZHdTdHlsZSA9IHBEYXRhLT5HZXRJdGVtU3R5bGVzKG1fcEludGVyZmFjZSwgaEl0ZW0pOw0KKyAgICBpZiAoZHdTdHlsZSAmIEZXTF9JVEVNU1RBVEVfTFRCX1NlbGVjdGVkKSB7DQorICAgICAgaWYgKGluZGV4ID09IG5JbmRleFNlbCkgew0KKyAgICAgICAgcmV0dXJuIGhJdGVtOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpbmRleCsrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK2ludDMyX3QgQ0ZXTF9MaXN0Qm94SW1wOjpHZXRTZWxJbmRleChpbnQzMl90IG5JbmRleCkgew0KKyAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpDQorICAgIHJldHVybiAtMTsNCisgIGludDMyX3QgaW5kZXggPSAwOw0KKyAgSUZXTF9MaXN0Qm94RFAqIHBEYXRhID0NCisgICAgICBzdGF0aWNfY2FzdDxJRldMX0xpc3RCb3hEUCo+KG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQorICBpbnQzMl90IGlDb3VudCA9IHBEYXRhLT5Db3VudEl0ZW1zKG1fcEludGVyZmFjZSk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpKTsNCisgICAgaWYgKCFoSXRlbSkgew0KKyAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKyAgICBGWF9EV09SRCBkd1N0eWxlID0gcERhdGEtPkdldEl0ZW1TdHlsZXMobV9wSW50ZXJmYWNlLCBoSXRlbSk7DQorICAgIGlmIChkd1N0eWxlICYgRldMX0lURU1TVEFURV9MVEJfU2VsZWN0ZWQpIHsNCisgICAgICBpZiAoaW5kZXggPT0gbkluZGV4KSB7DQorICAgICAgICByZXR1cm4gaTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaW5kZXgrKzsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiAtMTsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3hJbXA6OlNldFNlbEl0ZW0oRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfQk9PTCBiU2VsZWN0KSB7DQorICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcikNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIGlmICghaEl0ZW0pIHsNCisgICAgaWYgKGJTZWxlY3QpIHsNCisgICAgICBTZWxlY3RBbGwoKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBDbGVhclNlbGVjdGlvbigpOw0KKyAgICAgIFNldEZvY3VzSXRlbShOVUxMKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTFRCX011bHRpU2VsZWN0aW9uKSB7DQorICAgIFNldFNlbGVjdGlvbkRpcmVjdChoSXRlbSwgYlNlbGVjdCk7DQorICB9IGVsc2Ugew0KKyAgICBTZXRTZWxlY3Rpb24oaEl0ZW0sIGhJdGVtLCBiU2VsZWN0KTsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3hJbXA6OkdldEl0ZW1UZXh0KEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIGlmICghbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgSUZXTF9MaXN0Qm94RFAqIHBEYXRhID0NCisgICAgICBzdGF0aWNfY2FzdDxJRldMX0xpc3RCb3hEUCo+KG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQorICBpZiAoIWhJdGVtKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgcERhdGEtPkdldEl0ZW1UZXh0KG1fcEludGVyZmFjZSwgaEl0ZW0sIHdzVGV4dCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9MaXN0Qm94SW1wOjpHZXRTY3JvbGxQb3MoRlhfRkxPQVQmIGZQb3MsIEZYX0JPT0wgYlZlcnQpIHsNCisgIGlmICgoYlZlcnQgJiYgSXNTaG93U2Nyb2xsQmFyKFRSVUUpKSB8fCAoIWJWZXJ0ICYmIElzU2hvd1Njcm9sbEJhcihGQUxTRSkpKSB7DQorICAgIElGV0xfU2Nyb2xsQmFyKiBwU2Nyb2xsQmFyID0NCisgICAgICAgIGJWZXJ0ID8gbV9wVmVydFNjcm9sbEJhci5nZXQoKSA6IG1fcEhvcnpTY3JvbGxCYXIuZ2V0KCk7DQorICAgIGZQb3MgPSBwU2Nyb2xsQmFyLT5HZXRQb3MoKTsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCit9DQorRldMX0VSUiogQ0ZXTF9MaXN0Qm94SW1wOjpTb3J0KElGV0xfTGlzdEJveENvbXBhcmUqIHBDb20pIHsNCisgIEZXTF9ITElTVElURU0gaFRlbXA7DQorICBJRldMX0xpc3RCb3hEUCogcERhdGEgPQ0KKyAgICAgIHN0YXRpY19jYXN0PElGV0xfTGlzdEJveERQKj4obV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgIGludDMyX3Qgc3ogPSBwRGF0YS0+Q291bnRJdGVtcyhtX3BJbnRlcmZhY2UpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc3ogLSAxOyBpKyspIHsNCisgICAgZm9yIChpbnQzMl90IGogPSBpICsgMTsgaiA8IHN6OyBqKyspIHsNCisgICAgICBpZiAocENvbS0+Q29tcGFyZShwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaikpID4gMCkgew0KKyAgICAgICAgaFRlbXAgPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGkpOw0KKyAgICAgICAgcERhdGEtPlNldEl0ZW1JbmRleChtX3BJbnRlcmZhY2UsIHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaiksIGkpOw0KKyAgICAgICAgcERhdGEtPlNldEl0ZW1JbmRleChtX3BJbnRlcmZhY2UsIGhUZW1wLCBqKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0hMSVNUSVRFTSBDRldMX0xpc3RCb3hJbXA6OkdldEl0ZW0oRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0tleUNvZGUpIHsNCisgIEZXTF9ITElTVElURU0gaFJldCA9IE5VTEw7DQorICBzd2l0Y2ggKGR3S2V5Q29kZSkgew0KKyAgICBjYXNlIEZXTF9WS0VZX1VwOg0KKyAgICBjYXNlIEZXTF9WS0VZX0Rvd246DQorICAgIGNhc2UgRldMX1ZLRVlfSG9tZToNCisgICAgY2FzZSBGV0xfVktFWV9FbmQ6IHsNCisgICAgICBGWF9CT09MIGJVcCA9IGR3S2V5Q29kZSA9PSBGV0xfVktFWV9VcDsNCisgICAgICBGWF9CT09MIGJEb3duID0gZHdLZXlDb2RlID09IEZXTF9WS0VZX0Rvd247DQorICAgICAgRlhfQk9PTCBiSG9tZSA9IGR3S2V5Q29kZSA9PSBGV0xfVktFWV9Ib21lOw0KKyAgICAgIElGV0xfTGlzdEJveERQKiBwRGF0YSA9DQorICAgICAgICAgIHN0YXRpY19jYXN0PElGV0xfTGlzdEJveERQKj4obV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgICAgICBpbnQzMl90IGlEc3RJdGVtID0gLTE7DQorICAgICAgaWYgKGJVcCB8fCBiRG93bikgew0KKyAgICAgICAgaW50MzJfdCBpbmRleCA9IHBEYXRhLT5HZXRJdGVtSW5kZXgobV9wSW50ZXJmYWNlLCBoSXRlbSk7DQorICAgICAgICBpRHN0SXRlbSA9IGR3S2V5Q29kZSA9PSBGV0xfVktFWV9VcCA/IGluZGV4IC0gMSA6IGluZGV4ICsgMTsNCisgICAgICB9IGVsc2UgaWYgKGJIb21lKSB7DQorICAgICAgICBpRHN0SXRlbSA9IDA7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGludDMyX3QgaUNvdW50ID0gcERhdGEtPkNvdW50SXRlbXMobV9wSW50ZXJmYWNlKTsNCisgICAgICAgIGlEc3RJdGVtID0gaUNvdW50IC0gMTsNCisgICAgICB9DQorICAgICAgaFJldCA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaURzdEl0ZW0pOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQorICByZXR1cm4gaFJldDsNCit9DQordm9pZCBDRldMX0xpc3RCb3hJbXA6OlNldFNlbGVjdGlvbihGV0xfSExJU1RJVEVNIGhTdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEVuZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNlbGVjdGVkKSB7DQorICBJRldMX0xpc3RCb3hEUCogcERhdGEgPQ0KKyAgICAgIHN0YXRpY19jYXN0PElGV0xfTGlzdEJveERQKj4obV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgIGludDMyX3QgaVN0YXJ0ID0gcERhdGEtPkdldEl0ZW1JbmRleChtX3BJbnRlcmZhY2UsIGhTdGFydCk7DQorICBpbnQzMl90IGlFbmQgPSBwRGF0YS0+R2V0SXRlbUluZGV4KG1fcEludGVyZmFjZSwgaEVuZCk7DQorICBpZiAoaVN0YXJ0ID4gaUVuZCkgew0KKyAgICBpbnQzMl90IGlUZW1wID0gaVN0YXJ0Ow0KKyAgICBpU3RhcnQgPSBpRW5kOw0KKyAgICBpRW5kID0gaVRlbXA7DQorICB9DQorICBpZiAoYlNlbGVjdGVkKSB7DQorICAgIGludDMyX3QgaUNvdW50ID0gcERhdGEtPkNvdW50SXRlbXMobV9wSW50ZXJmYWNlKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpKTsNCisgICAgICBTZXRTZWxlY3Rpb25EaXJlY3QoaEl0ZW0sIEZBTFNFKTsNCisgICAgfQ0KKyAgfQ0KKyAgZm9yICg7IGlTdGFydCA8PSBpRW5kOyBpU3RhcnQrKykgew0KKyAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpU3RhcnQpOw0KKyAgICBTZXRTZWxlY3Rpb25EaXJlY3QoaEl0ZW0sIGJTZWxlY3RlZCk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9MaXN0Qm94SW1wOjpTZXRTZWxlY3Rpb25EaXJlY3QoRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfQk9PTCBiU2VsZWN0KSB7DQorICBJRldMX0xpc3RCb3hEUCogcERhdGEgPQ0KKyAgICAgIHN0YXRpY19jYXN0PElGV0xfTGlzdEJveERQKj4obV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgIEZYX0RXT1JEIGR3T2xkU3R5bGUgPSBwRGF0YS0+R2V0SXRlbVN0eWxlcyhtX3BJbnRlcmZhY2UsIGhJdGVtKTsNCisgIGJTZWxlY3QgPyBkd09sZFN0eWxlIHw9IEZXTF9JVEVNU1RBVEVfTFRCX1NlbGVjdGVkDQorICAgICAgICAgIDogZHdPbGRTdHlsZSAmPSB+RldMX0lURU1TVEFURV9MVEJfU2VsZWN0ZWQ7DQorICBwRGF0YS0+U2V0SXRlbVN0eWxlcyhtX3BJbnRlcmZhY2UsIGhJdGVtLCBkd09sZFN0eWxlKTsNCit9DQorRlhfQk9PTCBDRldMX0xpc3RCb3hJbXA6OklzSXRlbVNlbGVjdGVkKEZXTF9ITElTVElURU0gaEl0ZW0pIHsNCisgIElGV0xfTGlzdEJveERQKiBwRGF0YSA9DQorICAgICAgc3RhdGljX2Nhc3Q8SUZXTF9MaXN0Qm94RFAqPihtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgRlhfRFdPUkQgZHdTdGF0ZSA9IHBEYXRhLT5HZXRJdGVtU3R5bGVzKG1fcEludGVyZmFjZSwgaEl0ZW0pOw0KKyAgcmV0dXJuIChkd1N0YXRlICYgRldMX0lURU1TVEFURV9MVEJfU2VsZWN0ZWQpICE9IDA7DQorfQ0KK3ZvaWQgQ0ZXTF9MaXN0Qm94SW1wOjpDbGVhclNlbGVjdGlvbigpIHsNCisgIEZYX0JPT0wgYk11bHRpID0NCisgICAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9NdWx0aVNlbGVjdGlvbjsNCisgIElGV0xfTGlzdEJveERQKiBwRGF0YSA9DQorICAgICAgc3RhdGljX2Nhc3Q8SUZXTF9MaXN0Qm94RFAqPihtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgaW50MzJfdCBpQ291bnQgPSBwRGF0YS0+Q291bnRJdGVtcyhtX3BJbnRlcmZhY2UpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaSk7DQorICAgIEZYX0RXT1JEIGR3U3RhdGUgPSBwRGF0YS0+R2V0SXRlbVN0eWxlcyhtX3BJbnRlcmZhY2UsIGhJdGVtKTsNCisgICAgRlhfQk9PTCBiRmluZFNlbCA9IGR3U3RhdGUgJiBGV0xfSVRFTVNUQVRFX0xUQl9TZWxlY3RlZDsNCisgICAgaWYgKCFiRmluZFNlbCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIFNldFNlbGVjdGlvbkRpcmVjdChoSXRlbSwgRkFMU0UpOw0KKyAgICBpZiAoIWJNdWx0aSkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENGV0xfTGlzdEJveEltcDo6U2VsZWN0QWxsKCkgew0KKyAgRlhfQk9PTCBiTXVsdGkgPQ0KKyAgICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTFRCX011bHRpU2VsZWN0aW9uOw0KKyAgaWYgKCFiTXVsdGkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSUZXTF9MaXN0Qm94RFAqIHBEYXRhID0NCisgICAgICBzdGF0aWNfY2FzdDxJRldMX0xpc3RCb3hEUCo+KG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQorICBpbnQzMl90IGlDb3VudCA9IHBEYXRhLT5Db3VudEl0ZW1zKG1fcEludGVyZmFjZSk7DQorICBpZiAoaUNvdW50ID4gMCkgew0KKyAgICBGV0xfSExJU1RJVEVNIGhJdGVtU3RhcnQgPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIDApOw0KKyAgICBGV0xfSExJU1RJVEVNIGhJdGVtRW5kID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpQ291bnQgLSAxKTsNCisgICAgU2V0U2VsZWN0aW9uKGhJdGVtU3RhcnQsIGhJdGVtRW5kLCBGQUxTRSk7DQorICB9DQorfQ0KK0ZXTF9ITElTVElURU0gQ0ZXTF9MaXN0Qm94SW1wOjpHZXRGb2N1c2VkSXRlbSgpIHsNCisgIElGV0xfTGlzdEJveERQKiBwRGF0YSA9DQorICAgICAgc3RhdGljX2Nhc3Q8SUZXTF9MaXN0Qm94RFAqPihtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgaW50MzJfdCBpQ291bnQgPSBwRGF0YS0+Q291bnRJdGVtcyhtX3BJbnRlcmZhY2UpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaSk7DQorICAgIGlmICghaEl0ZW0pDQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIGlmIChwRGF0YS0+R2V0SXRlbVN0eWxlcyhtX3BJbnRlcmZhY2UsIGhJdGVtKSAmIEZXTF9JVEVNU1RBVEVfTFRCX0ZvY3VzZWQpIHsNCisgICAgICByZXR1cm4gaEl0ZW07DQorICAgIH0NCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCit2b2lkIENGV0xfTGlzdEJveEltcDo6U2V0Rm9jdXNJdGVtKEZXTF9ITElTVElURU0gaEl0ZW0pIHsNCisgIElGV0xfTGlzdEJveERQKiBwRGF0YSA9DQorICAgICAgc3RhdGljX2Nhc3Q8SUZXTF9MaXN0Qm94RFAqPihtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgRldMX0hMSVNUSVRFTSBoRm9jdXMgPSBHZXRGb2N1c2VkSXRlbSgpOw0KKyAgaWYgKGhJdGVtICE9IGhGb2N1cykgew0KKyAgICBpZiAoaEZvY3VzKSB7DQorICAgICAgRlhfRFdPUkQgZHdTdHlsZSA9IHBEYXRhLT5HZXRJdGVtU3R5bGVzKG1fcEludGVyZmFjZSwgaEZvY3VzKTsNCisgICAgICBkd1N0eWxlICY9IH5GV0xfSVRFTVNUQVRFX0xUQl9Gb2N1c2VkOw0KKyAgICAgIHBEYXRhLT5TZXRJdGVtU3R5bGVzKG1fcEludGVyZmFjZSwgaEZvY3VzLCBkd1N0eWxlKTsNCisgICAgfQ0KKyAgICBpZiAoaEl0ZW0pIHsNCisgICAgICBGWF9EV09SRCBkd1N0eWxlID0gcERhdGEtPkdldEl0ZW1TdHlsZXMobV9wSW50ZXJmYWNlLCBoSXRlbSk7DQorICAgICAgZHdTdHlsZSB8PSBGV0xfSVRFTVNUQVRFX0xUQl9Gb2N1c2VkOw0KKyAgICAgIHBEYXRhLT5TZXRJdGVtU3R5bGVzKG1fcEludGVyZmFjZSwgaEl0ZW0sIGR3U3R5bGUpOw0KKyAgICB9DQorICB9DQorfQ0KK0ZXTF9ITElTVElURU0gQ0ZXTF9MaXN0Qm94SW1wOjpHZXRJdGVtQXRQb2ludChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIGZ4IC09IG1fcnRDb25lbnQubGVmdCwgZnkgLT0gbV9ydENvbmVudC50b3A7DQorICBGWF9GTE9BVCBmUG9zWCA9IDAuMGY7DQorICBpZiAobV9wSG9yelNjcm9sbEJhcikgew0KKyAgICBmUG9zWCA9IG1fcEhvcnpTY3JvbGxCYXItPkdldFBvcygpOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZlBvc1kgPSAwLjA7DQorICBpZiAobV9wVmVydFNjcm9sbEJhcikgew0KKyAgICBmUG9zWSA9IG1fcFZlcnRTY3JvbGxCYXItPkdldFBvcygpOw0KKyAgfQ0KKyAgSUZXTF9MaXN0Qm94RFAqIHBEYXRhID0NCisgICAgICBzdGF0aWNfY2FzdDxJRldMX0xpc3RCb3hEUCo+KG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQorICBpbnQzMl90IG5Db3VudCA9IHBEYXRhLT5Db3VudEl0ZW1zKG1fcEludGVyZmFjZSk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgew0KKyAgICBGV0xfSExJU1RJVEVNIGhJdGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpKTsNCisgICAgaWYgKCFoSXRlbSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIENGWF9SZWN0RiBydEl0ZW07DQorICAgIHBEYXRhLT5HZXRJdGVtUmVjdChtX3BJbnRlcmZhY2UsIGhJdGVtLCBydEl0ZW0pOw0KKyAgICBydEl0ZW0uT2Zmc2V0KC1mUG9zWCwgLWZQb3NZKTsNCisgICAgaWYgKHJ0SXRlbS5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgcmV0dXJuIGhJdGVtOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorRlhfQk9PTCBDRldMX0xpc3RCb3hJbXA6OkdldEl0ZW1DaGVja1JlY3QoRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJ0Q2hlY2spIHsNCisgIGlmICghbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBpZiAoIShtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9DaGVjaykpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgSUZXTF9MaXN0Qm94RFAqIHBEYXRhID0NCisgICAgICBzdGF0aWNfY2FzdDxJRldMX0xpc3RCb3hEUCo+KG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQorICBwRGF0YS0+R2V0SXRlbUNoZWNrUmVjdChtX3BJbnRlcmZhY2UsIGhJdGVtLCBydENoZWNrKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGV0xfTGlzdEJveEltcDo6R2V0SXRlbUNoZWNrZWQoRldMX0hMSVNUSVRFTSBoSXRlbSkgew0KKyAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpDQorICAgIHJldHVybiBGQUxTRTsNCisgIGlmICghKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTFRCX0NoZWNrKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBJRldMX0xpc3RCb3hEUCogcERhdGEgPQ0KKyAgICAgIHN0YXRpY19jYXN0PElGV0xfTGlzdEJveERQKj4obV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgIHJldHVybiAocERhdGEtPkdldEl0ZW1DaGVja1N0YXRlKG1fcEludGVyZmFjZSwgaEl0ZW0pICYNCisgICAgICAgICAgRldMX0lURU1TVEFURV9MVEJfQ2hlY2tlZCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9MaXN0Qm94SW1wOjpTZXRJdGVtQ2hlY2tlZChGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9CT09MIGJDaGVja2VkKSB7DQorICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcikNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgaWYgKCEobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9MVEJfQ2hlY2spKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIElGV0xfTGlzdEJveERQKiBwRGF0YSA9DQorICAgICAgc3RhdGljX2Nhc3Q8SUZXTF9MaXN0Qm94RFAqPihtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgcERhdGEtPlNldEl0ZW1DaGVja1N0YXRlKG1fcEludGVyZmFjZSwgaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNoZWNrZWQgPyBGV0xfSVRFTVNUQVRFX0xUQl9DaGVja2VkIDogMCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX0xpc3RCb3hJbXA6OlNjcm9sbFRvVmlzaWJsZShGV0xfSExJU1RJVEVNIGhJdGVtKSB7DQorICBpZiAoIW1fcFZlcnRTY3JvbGxCYXIpDQorICAgIHJldHVybiBGQUxTRTsNCisgIENGWF9SZWN0RiBydEl0ZW07DQorICBJRldMX0xpc3RCb3hEUCogcERhdGEgPQ0KKyAgICAgIHN0YXRpY19jYXN0PElGV0xfTGlzdEJveERQKj4obV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgIHBEYXRhLT5HZXRJdGVtUmVjdChtX3BJbnRlcmZhY2UsIGhJdGVtLCBydEl0ZW0pOw0KKyAgRlhfQk9PTCBiU2Nyb2xsID0gRkFMU0U7DQorICBGWF9GTE9BVCBmUG9zWSA9IG1fcFZlcnRTY3JvbGxCYXItPkdldFBvcygpOw0KKyAgcnRJdGVtLk9mZnNldCgwLCAtZlBvc1kgKyBtX3J0Q29uZW50LnRvcCk7DQorICBpZiAocnRJdGVtLnRvcCA8IG1fcnRDb25lbnQudG9wKSB7DQorICAgIGZQb3NZICs9IHJ0SXRlbS50b3AgLSBtX3J0Q29uZW50LnRvcDsNCisgICAgYlNjcm9sbCA9IFRSVUU7DQorICB9IGVsc2UgaWYgKHJ0SXRlbS5ib3R0b20oKSA+IG1fcnRDb25lbnQuYm90dG9tKCkpIHsNCisgICAgZlBvc1kgKz0gcnRJdGVtLmJvdHRvbSgpIC0gbV9ydENvbmVudC5ib3R0b20oKTsNCisgICAgYlNjcm9sbCA9IFRSVUU7DQorICB9DQorICBpZiAoIWJTY3JvbGwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9wVmVydFNjcm9sbEJhci0+U2V0UG9zKGZQb3NZKTsNCisgIG1fcFZlcnRTY3JvbGxCYXItPlNldFRyYWNrUG9zKGZQb3NZKTsNCisgIFJlcGFpbnQoJm1fcnRDbGllbnQpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZXTF9MaXN0Qm94SW1wOjpEcmF3Qmtncm91bmQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIGlmICghcEdyYXBoaWNzKQ0KKyAgICByZXR1cm47DQorICBpZiAoIXBUaGVtZSkNCisgICAgcmV0dXJuOw0KKyAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfTFRCX0JhY2tncm91bmQ7DQorICBwYXJhbS5tX2R3U3RhdGVzID0gMDsNCisgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgIHBhcmFtLm1fcnRQYXJ0ID0gbV9ydENsaWVudDsNCisgIGlmIChJc1Nob3dTY3JvbGxCYXIoRkFMU0UpICYmIElzU2hvd1Njcm9sbEJhcihUUlVFKSkgew0KKyAgICBwYXJhbS5tX3BEYXRhID0gJm1fcnRTdGF0aWM7DQorICB9DQorICBpZiAoIUlzRW5hYmxlZCgpKSB7DQorICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0xUQl9EaXNhYmxlZDsNCisgIH0NCisgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCit9DQordm9pZCBDRldMX0xpc3RCb3hJbXA6OkRyYXdJdGVtcyhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgRlhfRkxPQVQgZlBvc1ggPSAwLjBmOw0KKyAgaWYgKG1fcEhvcnpTY3JvbGxCYXIpIHsNCisgICAgZlBvc1ggPSBtX3BIb3J6U2Nyb2xsQmFyLT5HZXRQb3MoKTsNCisgIH0NCisgIEZYX0ZMT0FUIGZQb3NZID0gMC4wZjsNCisgIGlmIChtX3BWZXJ0U2Nyb2xsQmFyKSB7DQorICAgIGZQb3NZID0gbV9wVmVydFNjcm9sbEJhci0+R2V0UG9zKCk7DQorICB9DQorICBDRlhfUmVjdEYgcnRWaWV3KG1fcnRDb25lbnQpOw0KKyAgaWYgKG1fcEhvcnpTY3JvbGxCYXIpIHsNCisgICAgcnRWaWV3LmhlaWdodCAtPSBtX2ZTY29ybGxCYXJXaWR0aDsNCisgIH0NCisgIGlmIChtX3BWZXJ0U2Nyb2xsQmFyKSB7DQorICAgIHJ0Vmlldy53aWR0aCAtPSBtX2ZTY29ybGxCYXJXaWR0aDsNCisgIH0NCisgIEZYX0JPT0wgYk11bHRpQ29sID0NCisgICAgICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9NdWx0aUNvbHVtbjsNCisgIElGV0xfTGlzdEJveERQKiBwRGF0YSA9DQorICAgICAgc3RhdGljX2Nhc3Q8SUZXTF9MaXN0Qm94RFAqPihtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgaW50MzJfdCBpQ291bnQgPSBwRGF0YS0+Q291bnRJdGVtcyhtX3BJbnRlcmZhY2UpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaSk7DQorICAgIGlmICghaEl0ZW0pIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBDRlhfUmVjdEYgcnRJdGVtOw0KKyAgICBwRGF0YS0+R2V0SXRlbVJlY3QobV9wSW50ZXJmYWNlLCBoSXRlbSwgcnRJdGVtKTsNCisgICAgcnRJdGVtLk9mZnNldChtX3J0Q29uZW50LmxlZnQgLSBmUG9zWCwgbV9ydENvbmVudC50b3AgLSBmUG9zWSk7DQorICAgIGlmIChydEl0ZW0uYm90dG9tKCkgPCBtX3J0Q29uZW50LnRvcCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChydEl0ZW0udG9wID49IG1fcnRDb25lbnQuYm90dG9tKCkpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoYk11bHRpQ29sICYmIHJ0SXRlbS5sZWZ0ID4gbV9ydENvbmVudC5yaWdodCgpKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKEdldFN0eWxlc0V4KCkgJiBGV0xfU1RZTEVFWFRfTFRCX093bmVyRHJhdykgew0KKyAgICAgIENGV0xfRXZ0THRiRHJhd0l0ZW0gZXY7DQorICAgICAgZXYubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICAgIGV2Lm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgICAgIGV2Lm1fbWF0cml4ID0gKnBNYXRyaXg7DQorICAgICAgZXYubV9pbmRleCA9IGk7DQorICAgICAgZXYubV9yZWN0ID0gcnRJdGVtOw0KKyAgICAgIERpc3BhdGNoRXZlbnQoJmV2KTsNCisgICAgfSBlbHNlIHsNCisgICAgICBEcmF3SXRlbShwR3JhcGhpY3MsIHBUaGVtZSwgaEl0ZW0sIGksIHJ0SXRlbSwgcE1hdHJpeCk7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDRldMX0xpc3RCb3hJbXA6OkRyYXdJdGVtKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIElGV0xfTGlzdEJveERQKiBwRGF0YSA9DQorICAgICAgc3RhdGljX2Nhc3Q8SUZXTF9MaXN0Qm94RFAqPihtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgRlhfRFdPUkQgZHdJdGVtU3R5bGVzID0gcERhdGEtPkdldEl0ZW1TdHlsZXMobV9wSW50ZXJmYWNlLCBoSXRlbSk7DQorICBGWF9EV09SRCBkd1BhcnRTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0xUQl9Ob3JtYWw7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkgew0KKyAgICBkd1BhcnRTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0xUQl9EaXNhYmxlZDsNCisgIH0gZWxzZSBpZiAoZHdJdGVtU3R5bGVzICYgRldMX0lURU1TVEFURV9MVEJfU2VsZWN0ZWQpIHsNCisgICAgZHdQYXJ0U3RhdGVzID0gRldMX1BBUlRTVEFURV9MVEJfU2VsZWN0ZWQ7DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkICYmDQorICAgICAgZHdJdGVtU3R5bGVzICYgRldMX0lURU1TVEFURV9MVEJfRm9jdXNlZCkgew0KKyAgICBkd1BhcnRTdGF0ZXMgfD0gRldMX1BBUlRTVEFURV9MVEJfRm9jdXNlZDsNCisgIH0NCisgIEZXTF9MaXN0Qm94SXRlbURhdGEgaXRlbURhdGE7DQorICBpdGVtRGF0YS5wRGF0YVByb3ZpZGVyID0gcERhdGE7DQorICBpdGVtRGF0YS5pSW5kZXggPSBJbmRleDsNCisgIHsNCisgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICAgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0xUQl9MaXN0SXRlbTsNCisgICAgcGFyYW0ubV9kd1N0YXRlcyA9IGR3UGFydFN0YXRlczsNCisgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIHBhcmFtLm1fcnRQYXJ0ID0gcnRJdGVtOw0KKyAgICBwYXJhbS5tX2R3RGF0YSA9IChGWF9EV09SRCkodWludHB0cl90KSgmaXRlbURhdGEpOw0KKyAgICBDRlhfUmVjdEYgcnRGb2N1cyhydEl0ZW0pOw0KKyAgICBwYXJhbS5tX3BEYXRhID0gJnJ0Rm9jdXM7DQorICAgIGlmIChtX3BWZXJ0U2Nyb2xsQmFyICYmICFtX3BIb3J6U2Nyb2xsQmFyICYmDQorICAgICAgICAoZHdQYXJ0U3RhdGVzICYgRldMX1BBUlRTVEFURV9MVEJfRm9jdXNlZCkpIHsNCisgICAgICBwYXJhbS5tX3J0UGFydC5sZWZ0ICs9IDE7DQorICAgICAgcGFyYW0ubV9ydFBhcnQud2lkdGggLT0gKG1fZlNjb3JsbEJhcldpZHRoICsgMSk7DQorICAgICAgcnRGb2N1cy5EZWZsYXRlKDAuNSwgMC41LCAxICsgbV9mU2NvcmxsQmFyV2lkdGgsIDEpOw0KKyAgICB9DQorICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgIH0NCisgIHsNCisgICAgRlhfQk9PTCBiSGFzSWNvbiA9IEdldFN0eWxlc0V4KCkgJiBGV0xfU1RZTEVFWFRfTFRCX0ljb247DQorICAgIGlmIChiSGFzSWNvbikgew0KKyAgICAgIENGWF9SZWN0RiBydERJQjsNCisgICAgICBDRlhfRElCaXRtYXAqIHBEaWIgPSBwRGF0YS0+R2V0SXRlbUljb24obV9wSW50ZXJmYWNlLCBoSXRlbSk7DQorICAgICAgcnRESUIuU2V0KHJ0SXRlbS5sZWZ0LCBydEl0ZW0udG9wLCBydEl0ZW0uaGVpZ2h0LCBydEl0ZW0uaGVpZ2h0KTsNCisgICAgICBpZiAocERpYikgew0KKyAgICAgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICAgICAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfTFRCX0ljb247DQorICAgICAgICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgICAgICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgICAgICBwYXJhbS5tX3J0UGFydCA9IHJ0RElCOw0KKyAgICAgICAgcGFyYW0ubV9kd0RhdGEgPSAoRlhfRFdPUkQpKHVpbnRwdHJfdCkoJml0ZW1EYXRhKTsNCisgICAgICAgIHBhcmFtLm1fcEltYWdlID0gcERpYjsNCisgICAgICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgICAgICB9DQorICAgIH0NCisgICAgRlhfQk9PTCBiSGFzQ2hlY2sgPSBHZXRTdHlsZXNFeCgpICYgRldMX1NUWUxFRVhUX0xUQl9DaGVjazsNCisgICAgaWYgKGJIYXNDaGVjaykgew0KKyAgICAgIENGWF9SZWN0RiBydENoZWNrOw0KKyAgICAgIHJ0Q2hlY2suU2V0KHJ0SXRlbS5sZWZ0LCBydEl0ZW0udG9wLCBydEl0ZW0uaGVpZ2h0LCBydEl0ZW0uaGVpZ2h0KTsNCisgICAgICBydENoZWNrLkRlZmxhdGUoMiwgMiwgMiwgMik7DQorICAgICAgcERhdGEtPlNldEl0ZW1DaGVja1JlY3QobV9wSW50ZXJmYWNlLCBoSXRlbSwgcnRDaGVjayk7DQorICAgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICAgICAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9MVEJfQ2hlY2s7DQorICAgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICAgICAgaWYgKEdldEl0ZW1DaGVja2VkKGhJdGVtKSkgew0KKyAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTFRCX0NoZWNrZWQ7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0xUQl9VbkNoZWNrZWQ7DQorICAgICAgfQ0KKyAgICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgICAgcGFyYW0ubV9ydFBhcnQgPSBydENoZWNrOw0KKyAgICAgIHBhcmFtLm1fZHdEYXRhID0gKEZYX0RXT1JEKSh1aW50cHRyX3QpKCZpdGVtRGF0YSk7DQorICAgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgcERhdGEtPkdldEl0ZW1UZXh0KG1fcEludGVyZmFjZSwgaEl0ZW0sIHdzVGV4dCk7DQorICAgIGlmICh3c1RleHQuR2V0TGVuZ3RoKCkgPD0gMCkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfUmVjdEYgcnRUZXh0KHJ0SXRlbSk7DQorICAgIHJ0VGV4dC5EZWZsYXRlKEZXTF9MSVNUQk9YX0l0ZW1UZXh0TWFyZ2luLCBGV0xfTElTVEJPWF9JdGVtVGV4dE1hcmdpbik7DQorICAgIGlmIChiSGFzSWNvbiB8fCBiSGFzQ2hlY2spIHsNCisgICAgICBydFRleHQuRGVmbGF0ZShydEl0ZW0uaGVpZ2h0LCAwLCAwLCAwKTsNCisgICAgfQ0KKyAgICBDRldMX1RoZW1lVGV4dCB0ZXh0UGFyYW07DQorICAgIHRleHRQYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIHRleHRQYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfTFRCX0xpc3RJdGVtOw0KKyAgICB0ZXh0UGFyYW0ubV9kd1N0YXRlcyA9IGR3UGFydFN0YXRlczsNCisgICAgdGV4dFBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgICB0ZXh0UGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgICAgdGV4dFBhcmFtLm1fcnRQYXJ0ID0gcnRUZXh0Ow0KKyAgICB0ZXh0UGFyYW0ubV93c1RleHQgPSB3c1RleHQ7DQorICAgIHRleHRQYXJhbS5tX2R3VFRPU3R5bGVzID0gbV9kd1RUT1N0eWxlczsNCisgICAgdGV4dFBhcmFtLm1faVRUT0FsaWduID0gbV9pVFRPQWxpZ25zOw0KKyAgICB0ZXh0UGFyYW0ubV9kd0RhdGEgPSAoRlhfRFdPUkQpKHVpbnRwdHJfdCkoJml0ZW1EYXRhKTsNCisgICAgcFRoZW1lLT5EcmF3VGV4dCgmdGV4dFBhcmFtKTsNCisgIH0NCit9DQorQ0ZYX1NpemVGIENGV0xfTGlzdEJveEltcDo6Q2FsY1NpemUoRlhfQk9PTCBiQXV0b1NpemUpIHsNCisgIENGWF9TaXplRiBmczsNCisgIGZzLlNldCgwLCAwKTsNCisgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikNCisgICAgcmV0dXJuIGZzOw0KKyAgR2V0Q2xpZW50UmVjdChtX3J0Q2xpZW50KTsNCisgIG1fcnRDb25lbnQgPSBtX3J0Q2xpZW50Ow0KKyAgQ0ZYX1JlY3RGIHJ0VUlNYXJnaW47DQorICBydFVJTWFyZ2luLlNldCgwLCAwLCAwLCAwKTsNCisgIGlmICghbV9wT3V0ZXIpIHsNCisgICAgQ0ZYX1JlY3RGKiBwVUlNYXJnaW4gPQ0KKyAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZYX1JlY3RGKj4oR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfVUlNYXJnaW4pKTsNCisgICAgaWYgKHBVSU1hcmdpbikgew0KKyAgICAgIG1fcnRDb25lbnQuRGVmbGF0ZShwVUlNYXJnaW4tPmxlZnQsIHBVSU1hcmdpbi0+dG9wLCBwVUlNYXJnaW4tPndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBwVUlNYXJnaW4tPmhlaWdodCk7DQorICAgIH0NCisgIH0NCisgIEZYX0ZMT0FUIGZXaWR0aCA9IDA7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlci0+SXNDdXN0b21pemVkTGF5b3V0KG1fcEludGVyZmFjZSkpIHsNCisgICAgSUZXTF9MaXN0Qm94RFAqIHBEYXRhID0NCisgICAgICAgIHN0YXRpY19jYXN0PElGV0xfTGlzdEJveERQKj4obV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgICAgaWYgKCFiQXV0b1NpemUpIHsNCisgICAgfQ0KKyAgICBpbnQzMl90IGlDb3VudCA9IHBEYXRhLT5Db3VudEl0ZW1zKG1fcEludGVyZmFjZSk7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSA9IHBEYXRhLT5HZXRJdGVtKG1fcEludGVyZmFjZSwgaSk7DQorICAgICAgQ0ZXTF9UaGVtZVBhcnQgaXRlbVBhcnQ7DQorICAgICAgaXRlbVBhcnQubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICAgIGl0ZW1QYXJ0Lm1faVBhcnQgPSBGV0xfUEFSVF9MVEJfTGlzdEl0ZW07DQorICAgICAgaXRlbVBhcnQubV9wRGF0YSA9IG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcjsNCisgICAgICBpdGVtUGFydC5tX2R3RGF0YSA9IGk7DQorICAgICAgQ0ZYX1JlY3RGIHI7DQorICAgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlci0+R2V0UGFydFJlY3QoJml0ZW1QYXJ0LCByKTsNCisgICAgICBpZiAoIWJBdXRvU2l6ZSkgew0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0SXRlbTsNCisgICAgICAgIHJ0SXRlbS5TZXQobV9ydENsaWVudC5sZWZ0LCBtX3J0Q2xpZW50LnRvcCArIGZzLnksIHIud2lkdGgsIHIuaGVpZ2h0KTsNCisgICAgICAgIElGV0xfTGlzdEJveERQKiBwRGF0YSA9DQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SUZXTF9MaXN0Qm94RFAqPihtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgICAgICAgcERhdGEtPlNldEl0ZW1SZWN0KG1fcEludGVyZmFjZSwgaEl0ZW0sIHJ0SXRlbSk7DQorICAgICAgfQ0KKyAgICAgIGZzLnkgKz0gci5oZWlnaHQ7DQorICAgICAgaWYgKGZzLnggPCByLndpZHRoKSB7DQorICAgICAgICBmcy54ID0gci53aWR0aDsNCisgICAgICAgIGZXaWR0aCA9IHIud2lkdGg7DQorICAgICAgfQ0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBmV2lkdGggPSBHZXRNYXhUZXh0V2lkdGgoKTsNCisgICAgZldpZHRoICs9IDIgKiBGV0xfTElTVEJPWF9JdGVtVGV4dE1hcmdpbjsNCisgICAgaWYgKCFiQXV0b1NpemUpIHsNCisgICAgICBGWF9GTE9BVCBmQWN0dWFsV2lkdGggPQ0KKyAgICAgICAgICBtX3J0Q2xpZW50LndpZHRoIC0gcnRVSU1hcmdpbi5sZWZ0IC0gcnRVSU1hcmdpbi53aWR0aDsNCisgICAgICBpZiAoZldpZHRoIDwgZkFjdHVhbFdpZHRoKSB7DQorICAgICAgICBmV2lkdGggPSBmQWN0dWFsV2lkdGg7DQorICAgICAgfQ0KKyAgICB9DQorICAgIElGV0xfTGlzdEJveERQKiBwRGF0YSA9DQorICAgICAgICBzdGF0aWNfY2FzdDxJRldMX0xpc3RCb3hEUCo+KG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQorICAgIG1fZkl0ZW1IZWlnaHQgPSBHZXRJdGVtSGVpZ3QoKTsNCisgICAgRlhfQk9PTCBiSGFzSWNvbjsNCisgICAgYkhhc0ljb24gPSBHZXRTdHlsZXNFeCgpICYgRldMX1NUWUxFRVhUX0xUQl9JY29uOw0KKyAgICBpZiAoYkhhc0ljb24pIHsNCisgICAgICBmV2lkdGggKz0gbV9mSXRlbUhlaWdodDsNCisgICAgfQ0KKyAgICBpbnQzMl90IGlDb3VudCA9IHBEYXRhLT5Db3VudEl0ZW1zKG1fcEludGVyZmFjZSk7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgRldMX0hMSVNUSVRFTSBodGVtID0gcERhdGEtPkdldEl0ZW0obV9wSW50ZXJmYWNlLCBpKTsNCisgICAgICBHZXRJdGVtU2l6ZShmcywgaHRlbSwgZldpZHRoLCBtX2ZJdGVtSGVpZ2h0LCBiQXV0b1NpemUpOw0KKyAgICB9DQorICB9DQorICBpZiAoYkF1dG9TaXplKSB7DQorICAgIHJldHVybiBmczsNCisgIH0NCisgIEZYX0ZMT0FUIGlXaWR0aCA9IG1fcnRDbGllbnQud2lkdGggLSBydFVJTWFyZ2luLmxlZnQgLSBydFVJTWFyZ2luLndpZHRoOw0KKyAgRlhfRkxPQVQgaUhlaWdodCA9IG1fcnRDbGllbnQuaGVpZ2h0Ow0KKyAgRlhfQk9PTCBiU2hvd1ZlcnRTY3IgPQ0KKyAgICAgIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9TaG93U2Nyb2xsQmFyQWxhd2F5cykgJiYNCisgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9WU2Nyb2xsKTsNCisgIEZYX0JPT0wgYlNob3dIb3J6U2NyID0NCisgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9MVEJfU2hvd1Njcm9sbEJhckFsYXdheXMpICYmDQorICAgICAgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfSFNjcm9sbCk7DQorICBpZiAoIWJTaG93VmVydFNjciAmJiBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX1ZTY3JvbGwgJiYNCisgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9MVEJfTXVsdGlDb2x1bW4pID09IDApIHsNCisgICAgYlNob3dWZXJ0U2NyID0gKGZzLnkgPiBpSGVpZ2h0KTsNCisgIH0NCisgIGlmICghYlNob3dIb3J6U2NyICYmIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfSFNjcm9sbCkgew0KKyAgICBiU2hvd0hvcnpTY3IgPSAoZnMueCA+IGlXaWR0aCk7DQorICB9DQorICBDRlhfU2l6ZUYgc3pSYW5nZTsNCisgIGlmIChiU2hvd1ZlcnRTY3IpIHsNCisgICAgaWYgKCFtX3BWZXJ0U2Nyb2xsQmFyKSB7DQorICAgICAgSW5pdFNjcm9sbEJhcigpOw0KKyAgICB9DQorICAgIENGWF9SZWN0RiBydFNjcm9sbEJhcjsNCisgICAgcnRTY3JvbGxCYXIuU2V0KG1fcnRDbGllbnQucmlnaHQoKSAtIG1fZlNjb3JsbEJhcldpZHRoLCBtX3J0Q2xpZW50LnRvcCwNCisgICAgICAgICAgICAgICAgICAgIG1fZlNjb3JsbEJhcldpZHRoLCBtX3J0Q2xpZW50LmhlaWdodCAtIDEpOw0KKyAgICBpZiAoYlNob3dIb3J6U2NyKSB7DQorICAgICAgcnRTY3JvbGxCYXIuaGVpZ2h0IC09IG1fZlNjb3JsbEJhcldpZHRoOw0KKyAgICB9DQorICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFdpZGdldFJlY3QocnRTY3JvbGxCYXIpOw0KKyAgICBzelJhbmdlLnggPSAwLCBzelJhbmdlLnkgPSBmcy55IC0gbV9ydENvbmVudC5oZWlnaHQ7DQorICAgIGlmIChzelJhbmdlLnkgPCBtX2ZJdGVtSGVpZ2h0KSB7DQorICAgICAgc3pSYW5nZS55ID0gbV9mSXRlbUhlaWdodDsNCisgICAgfQ0KKyAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRSYW5nZShzelJhbmdlLngsIHN6UmFuZ2UueSk7DQorICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFBhZ2VTaXplKHJ0U2Nyb2xsQmFyLmhlaWdodCAqIDkgLyAxMCk7DQorICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFN0ZXBTaXplKG1fZkl0ZW1IZWlnaHQpOw0KKyAgICBGWF9GTE9BVCBmUG9zID0gbV9wVmVydFNjcm9sbEJhci0+R2V0UG9zKCk7DQorICAgIGlmIChmUG9zIDwgMCkgew0KKyAgICAgIGZQb3MgPSAwOw0KKyAgICB9DQorICAgIGlmIChmUG9zID4gc3pSYW5nZS55KSB7DQorICAgICAgZlBvcyA9IHN6UmFuZ2UueTsNCisgICAgfQ0KKyAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRQb3MoZlBvcyk7DQorICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFRyYWNrUG9zKGZQb3MpOw0KKyAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTFRCX1Nob3dTY3JvbGxCYXJGb2N1cykgPT0NCisgICAgICAgICAgICAwIHx8DQorICAgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSkgew0KKyAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBGQUxTRSk7DQorICAgIH0NCisgICAgbV9wVmVydFNjcm9sbEJhci0+VXBkYXRlKCk7DQorICB9IGVsc2UgaWYgKG1fcFZlcnRTY3JvbGxCYXIpIHsNCisgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0UG9zKDApOw0KKyAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRUcmFja1BvcygwKTsNCisgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsIFRSVUUpOw0KKyAgfQ0KKyAgaWYgKGJTaG93SG9yelNjcikgew0KKyAgICBpZiAoIW1fcEhvcnpTY3JvbGxCYXIpIHsNCisgICAgICBJbml0U2Nyb2xsQmFyKEZBTFNFKTsNCisgICAgfQ0KKyAgICBDRlhfUmVjdEYgcnRTY3JvbGxCYXI7DQorICAgIHJ0U2Nyb2xsQmFyLlNldChtX3J0Q2xpZW50LmxlZnQsIG1fcnRDbGllbnQuYm90dG9tKCkgLSBtX2ZTY29ybGxCYXJXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQud2lkdGgsIG1fZlNjb3JsbEJhcldpZHRoKTsNCisgICAgaWYgKGJTaG93VmVydFNjcikgew0KKyAgICAgIHJ0U2Nyb2xsQmFyLndpZHRoIC09IG1fZlNjb3JsbEJhcldpZHRoOw0KKyAgICB9DQorICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFdpZGdldFJlY3QocnRTY3JvbGxCYXIpOw0KKyAgICBzelJhbmdlLnggPSAwLCBzelJhbmdlLnkgPSBmcy54IC0gcnRTY3JvbGxCYXIud2lkdGg7DQorICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFJhbmdlKHN6UmFuZ2UueCwgc3pSYW5nZS55KTsNCisgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0UGFnZVNpemUoZldpZHRoICogOSAvIDEwKTsNCisgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0U3RlcFNpemUoZldpZHRoIC8gMTApOw0KKyAgICBGWF9GTE9BVCBmUG9zID0gbV9wSG9yelNjcm9sbEJhci0+R2V0UG9zKCk7DQorICAgIGlmIChmUG9zIDwgMCkgew0KKyAgICAgIGZQb3MgPSAwOw0KKyAgICB9DQorICAgIGlmIChmUG9zID4gc3pSYW5nZS55KSB7DQorICAgICAgZlBvcyA9IHN6UmFuZ2UueTsNCisgICAgfQ0KKyAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRQb3MoZlBvcyk7DQorICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFRyYWNrUG9zKGZQb3MpOw0KKyAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTFRCX1Nob3dTY3JvbGxCYXJGb2N1cykgPT0NCisgICAgICAgICAgICAwIHx8DQorICAgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSkgew0KKyAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBGQUxTRSk7DQorICAgIH0NCisgICAgbV9wSG9yelNjcm9sbEJhci0+VXBkYXRlKCk7DQorICB9IGVsc2UgaWYgKG1fcEhvcnpTY3JvbGxCYXIpIHsNCisgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0UG9zKDApOw0KKyAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRUcmFja1BvcygwKTsNCisgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsIFRSVUUpOw0KKyAgfQ0KKyAgaWYgKGJTaG93VmVydFNjciAmJiBiU2hvd0hvcnpTY3IpIHsNCisgICAgbV9ydFN0YXRpYy5TZXQobV9ydENsaWVudC5yaWdodCgpIC0gbV9mU2NvcmxsQmFyV2lkdGgsDQorICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQuYm90dG9tKCkgLSBtX2ZTY29ybGxCYXJXaWR0aCwgbV9mU2NvcmxsQmFyV2lkdGgsDQorICAgICAgICAgICAgICAgICAgIG1fZlNjb3JsbEJhcldpZHRoKTsNCisgIH0NCisgIHJldHVybiBmczsNCit9DQordm9pZCBDRldMX0xpc3RCb3hJbXA6OkdldEl0ZW1TaXplKENGWF9TaXplRiYgc2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBtX2ZJdGVtSGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBdXRvU2l6ZSkgew0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTFRCX011bHRpQ29sdW1uKSB7DQorICB9IGVsc2Ugew0KKyAgICBpZiAoIWJBdXRvU2l6ZSkgew0KKyAgICAgIENGWF9SZWN0RiBydEl0ZW07DQorICAgICAgcnRJdGVtLlNldCgwLCBzaXplLnksIGZXaWR0aCwgbV9mSXRlbUhlaWdodCk7DQorICAgICAgSUZXTF9MaXN0Qm94RFAqIHBEYXRhID0NCisgICAgICAgICAgc3RhdGljX2Nhc3Q8SUZXTF9MaXN0Qm94RFAqPihtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgICAgIHBEYXRhLT5TZXRJdGVtUmVjdChtX3BJbnRlcmZhY2UsIGhJdGVtLCBydEl0ZW0pOw0KKyAgICB9DQorICAgIHNpemUueCA9IGZXaWR0aDsNCisgICAgc2l6ZS55ICs9IG1fZkl0ZW1IZWlnaHQ7DQorICB9DQorfQ0KK0ZYX0ZMT0FUIENGV0xfTGlzdEJveEltcDo6R2V0TWF4VGV4dFdpZHRoKCkgew0KKyAgRlhfRkxPQVQgZlJldCA9IDAuMGY7DQorICBJRldMX0xpc3RCb3hEUCogcERhdGEgPQ0KKyAgICAgIHN0YXRpY19jYXN0PElGV0xfTGlzdEJveERQKj4obV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgIGludDMyX3QgaUNvdW50ID0gcERhdGEtPkNvdW50SXRlbXMobV9wSW50ZXJmYWNlKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBwRGF0YS0+R2V0SXRlbShtX3BJbnRlcmZhY2UsIGkpOw0KKyAgICBpZiAoIWhJdGVtKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICBwRGF0YS0+R2V0SXRlbVRleHQobV9wSW50ZXJmYWNlLCBoSXRlbSwgd3NUZXh0KTsNCisgICAgQ0ZYX1NpemVGIHN6ID0gQ2FsY1RleHRTaXplKHdzVGV4dCwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcik7DQorICAgIGlmIChzei54ID4gZlJldCkgew0KKyAgICAgIGZSZXQgPSBzei54Ow0KKyAgICB9DQorICB9DQorICByZXR1cm4gZlJldDsNCit9DQorRlhfRkxPQVQgQ0ZXTF9MaXN0Qm94SW1wOjpHZXRTY3JvbGxXaWR0aCgpIHsNCisgIEZYX0ZMT0FUKiBwZldpZHRoID0NCisgICAgICBzdGF0aWNfY2FzdDxGWF9GTE9BVCo+KEdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX1Njcm9sbEJhcldpZHRoKSk7DQorICBpZiAoIXBmV2lkdGgpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuICpwZldpZHRoOw0KK30NCitGWF9GTE9BVCBDRldMX0xpc3RCb3hJbXA6OkdldEl0ZW1IZWlndCgpIHsNCisgIEZYX0ZMT0FUKiBwZkZvbnQgPQ0KKyAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUKj4oR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfRm9udFNpemUpKTsNCisgIGlmICghcGZGb250KQ0KKyAgICByZXR1cm4gMjA7DQorICByZXR1cm4gKnBmRm9udCArIDIgKiBGV0xfTElTVEJPWF9JdGVtVGV4dE1hcmdpbjsNCit9DQordm9pZCBDRldMX0xpc3RCb3hJbXA6OkluaXRTY3JvbGxCYXIoRlhfQk9PTCBiVmVydCkgew0KKyAgaWYgKChiVmVydCAmJiBtX3BWZXJ0U2Nyb2xsQmFyKSB8fCAoIWJWZXJ0ICYmIG1fcEhvcnpTY3JvbGxCYXIpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBwcm9wOw0KKyAgcHJvcC5tX2R3U3R5bGVFeGVzID0gYlZlcnQgPyBGV0xfU1RZTEVFWFRfU0NCX1ZlcnQgOiBGV0xfU1RZTEVFWFRfU0NCX0hvcno7DQorICBwcm9wLm1fZHdTdGF0ZXMgPSBGV0xfV0dUU1RBVEVfSW52aXNpYmxlOw0KKyAgcHJvcC5tX3BQYXJlbnQgPSBtX3BJbnRlcmZhY2U7DQorICBwcm9wLm1fcFRoZW1lUHJvdmlkZXIgPSBtX3BTY3JvbGxCYXJUUDsNCisgIElGV0xfU2Nyb2xsQmFyKiBwU2Nyb2xsQmFyID0gSUZXTF9TY3JvbGxCYXI6OkNyZWF0ZShwcm9wLCBtX3BJbnRlcmZhY2UpOw0KKyAgcFNjcm9sbEJhci0+SW5pdGlhbGl6ZSgpOw0KKyAgKGJWZXJ0ID8gJm1fcFZlcnRTY3JvbGxCYXIgOiAmbV9wSG9yelNjcm9sbEJhciktPnJlc2V0KHBTY3JvbGxCYXIpOw0KK30NCit2b2lkIENGV0xfTGlzdEJveEltcDo6U29ydEl0ZW0oKSB7fQ0KK0ZYX0JPT0wgQ0ZXTF9MaXN0Qm94SW1wOjpJc1Nob3dTY3JvbGxCYXIoRlhfQk9PTCBiVmVydCkgew0KKyAgSUZXTF9TY3JvbGxCYXIqIHBTY3JvbGxiYXIgPQ0KKyAgICAgIGJWZXJ0ID8gbV9wVmVydFNjcm9sbEJhci5nZXQoKSA6IG1fcEhvcnpTY3JvbGxCYXIuZ2V0KCk7DQorICBpZiAoIXBTY3JvbGxiYXIgfHwgKHBTY3JvbGxiYXItPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuICEobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmDQorICAgICAgICAgICBGV0xfU1RZTEVFWFRfTFRCX1Nob3dTY3JvbGxCYXJGb2N1cykgfHwNCisgICAgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKTsNCit9DQordm9pZCBDRldMX0xpc3RCb3hJbXA6OlByb2Nlc3NTZWxDaGFuZ2VkKCkgew0KKyAgQ0ZXTF9FdnRMdGJTZWxDaGFuZ2VkIHNlbEV2ZW50Ow0KKyAgc2VsRXZlbnQubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgQ0ZYX0ludDMyQXJyYXkgYXJyU2VsczsNCisgIGludDMyX3QgaUNvdW50ID0gQ291bnRTZWxJdGVtcygpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgRldMX0hMSVNUSVRFTSBpdGVtID0gR2V0U2VsSXRlbShpKTsNCisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIHNlbEV2ZW50LmlhcnJheVNlbHMuQWRkKGkpOw0KKyAgfQ0KKyAgRGlzcGF0Y2hFdmVudCgmc2VsRXZlbnQpOw0KK30NCitDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZTo6Q0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGUoQ0ZXTF9MaXN0Qm94SW1wKiBwT3duZXIpDQorICAgIDogbV9wT3duZXIocE93bmVyKSB7fQ0KK2ludDMyX3QgQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgaWYgKCFwTWVzc2FnZSkNCisgICAgcmV0dXJuIDA7DQorICBpZiAoIW1fcE93bmVyLT5Jc0VuYWJsZWQoKSkgew0KKyAgICByZXR1cm4gMTsNCisgIH0NCisgIEZYX0RXT1JEIGR3TXNnQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQorICBpbnQzMl90IGlSZXQgPSAxOw0KKyAgc3dpdGNoIChkd01zZ0NvZGUpIHsNCisgICAgY2FzZSBGV0xfTVNHSEFTSF9TZXRGb2N1czoNCisgICAgY2FzZSBGV0xfTVNHSEFTSF9LaWxsRm9jdXM6IHsNCisgICAgICBPbkZvY3VzQ2hhbmdlZChwTWVzc2FnZSwgZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX1NldEZvY3VzKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX01vdXNlOiB7DQorICAgICAgQ0ZXTF9Nc2dNb3VzZSogcE1zZyA9IHN0YXRpY19jYXN0PENGV0xfTXNnTW91c2UqPihwTWVzc2FnZSk7DQorICAgICAgRlhfRFdPUkQgZHdDbWQgPSBwTXNnLT5tX2R3Q21kOw0KKyAgICAgIHN3aXRjaCAoZHdDbWQpIHsNCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duOiB7DQorICAgICAgICAgIE9uTEJ1dHRvbkRvd24ocE1zZyk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvblVwOiB7DQorICAgICAgICAgIE9uTEJ1dHRvblVwKHBNc2cpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHt9DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01TR0hBU0hfTW91c2VXaGVlbDogew0KKyAgICAgIE9uTW91c2VXaGVlbChzdGF0aWNfY2FzdDxDRldMX01zZ01vdXNlV2hlZWwqPihwTWVzc2FnZSkpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01TR0hBU0hfS2V5OiB7DQorICAgICAgQ0ZXTF9Nc2dLZXkqIHBNc2cgPSBzdGF0aWNfY2FzdDxDRldMX01zZ0tleSo+KHBNZXNzYWdlKTsNCisgICAgICBpZiAocE1zZy0+bV9kd0NtZCA9PSBGV0xfTVNHS0VZQ01EX0tleURvd24pDQorICAgICAgICBPbktleURvd24ocE1zZyk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZGVmYXVsdDogeyBpUmV0ID0gMDsgfQ0KKyAgfQ0KKyAgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorICByZXR1cm4gaVJldDsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSB7DQorICBpZiAoIXBFdmVudCkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIGlmIChwRXZlbnQtPkdldENsYXNzSUQoKSAhPSBGV0xfRVZUSEFTSF9TY3JvbGwpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KKyAgSUZXTF9XaWRnZXQqIHBTcmNUYXJnZXQgPSBwRXZlbnQtPm1fcFNyY1RhcmdldDsNCisgIGlmICgocFNyY1RhcmdldCA9PSBtX3BPd25lci0+bV9wVmVydFNjcm9sbEJhci5nZXQoKSAmJg0KKyAgICAgICBtX3BPd25lci0+bV9wVmVydFNjcm9sbEJhcikgfHwNCisgICAgICAocFNyY1RhcmdldCA9PSBtX3BPd25lci0+bV9wSG9yelNjcm9sbEJhci5nZXQoKSAmJg0KKyAgICAgICBtX3BPd25lci0+bV9wSG9yelNjcm9sbEJhcikpIHsNCisgICAgQ0ZXTF9FdnRTY3JvbGwqIHBTY3JvbGxFdmVudCA9IHN0YXRpY19jYXN0PENGV0xfRXZ0U2Nyb2xsKj4ocEV2ZW50KTsNCisgICAgT25TY3JvbGwoc3RhdGljX2Nhc3Q8SUZXTF9TY3JvbGxCYXIqPihwU3JjVGFyZ2V0KSwNCisgICAgICAgICAgICAgcFNjcm9sbEV2ZW50LT5tX2lTY3JvbGxDb2RlLCBwU2Nyb2xsRXZlbnQtPm1fZlBvcyk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGU6Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgcmV0dXJuIG1fcE93bmVyLT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorfQ0KK3ZvaWQgQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGU6Ok9uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSogcE1zZywgRlhfQk9PTCBiU2V0KSB7DQorICBpZiAobV9wT3duZXItPkdldFN0eWxlc0V4KCkgJiBGV0xfU1RZTEVFWFRfTFRCX1Nob3dTY3JvbGxCYXJGb2N1cykgew0KKyAgICBpZiAobV9wT3duZXItPm1fcFZlcnRTY3JvbGxCYXIpIHsNCisgICAgICBtX3BPd25lci0+bV9wVmVydFNjcm9sbEJhci0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsICFiU2V0KTsNCisgICAgfQ0KKyAgICBpZiAobV9wT3duZXItPm1fcEhvcnpTY3JvbGxCYXIpIHsNCisgICAgICBtX3BPd25lci0+bV9wSG9yelNjcm9sbEJhci0+U2V0U3RhdGVzKEZXTF9XR1RTVEFURV9JbnZpc2libGUsICFiU2V0KTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGJTZXQpIHsNCisgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gKEZXTF9XR1RTVEFURV9Gb2N1c2VkKTsNCisgIH0gZWxzZSB7DQorICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH4oRldMX1dHVFNUQVRFX0ZvY3VzZWQpOw0KKyAgfQ0KKyAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCit9DQordm9pZCBDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZTo6T25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBtX3BPd25lci0+bV9iTEJ1dHRvbkRvd24gPSBUUlVFOw0KKyAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSA9PSAwKSB7DQorICAgIG1fcE93bmVyLT5TZXRGb2N1cyhUUlVFKTsNCisgIH0NCisgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBtX3BPd25lci0+R2V0SXRlbUF0UG9pbnQocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICBpZiAoIWhJdGVtKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmDQorICAgICAgRldMX1NUWUxFRVhUX0xUQl9NdWx0aVNlbGVjdGlvbikgew0KKyAgICBpZiAocE1zZy0+bV9kd0ZsYWdzICYgRldMX0tFWUZMQUdfQ3RybCkgew0KKyAgICAgIEZYX0JPT0wgYlNlbGVjdGVkID0gbV9wT3duZXItPklzSXRlbVNlbGVjdGVkKGhJdGVtKTsNCisgICAgICBtX3BPd25lci0+U2V0U2VsZWN0aW9uRGlyZWN0KGhJdGVtLCAhYlNlbGVjdGVkKTsNCisgICAgICBtX3BPd25lci0+bV9oQW5jaG9yID0gaEl0ZW07DQorICAgIH0gZWxzZSBpZiAocE1zZy0+bV9kd0ZsYWdzICYgRldMX0tFWUZMQUdfU2hpZnQpIHsNCisgICAgICBpZiAobV9wT3duZXItPm1faEFuY2hvcikgew0KKyAgICAgICAgbV9wT3duZXItPlNldFNlbGVjdGlvbihtX3BPd25lci0+bV9oQW5jaG9yLCBoSXRlbSwgVFJVRSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcE93bmVyLT5TZXRTZWxlY3Rpb25EaXJlY3QoaEl0ZW0sIFRSVUUpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBtX3BPd25lci0+U2V0U2VsZWN0aW9uKGhJdGVtLCBoSXRlbSwgVFJVRSk7DQorICAgICAgbV9wT3duZXItPm1faEFuY2hvciA9IGhJdGVtOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBtX3BPd25lci0+U2V0U2VsZWN0aW9uKGhJdGVtLCBoSXRlbSwgVFJVRSk7DQorICB9DQorICBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTFRCX0NoZWNrKSB7DQorICAgIEZXTF9ITElTVElURU0gaFNlbGVjdGVkSXRlbSA9DQorICAgICAgICBtX3BPd25lci0+R2V0SXRlbUF0UG9pbnQocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICAgIENGWF9SZWN0RiBydENoZWNrOw0KKyAgICBtX3BPd25lci0+R2V0SXRlbUNoZWNrUmVjdChoU2VsZWN0ZWRJdGVtLCBydENoZWNrKTsNCisgICAgRlhfQk9PTCBiQ2hlY2tlZCA9IG1fcE93bmVyLT5HZXRJdGVtQ2hlY2tlZChoSXRlbSk7DQorICAgIGlmIChydENoZWNrLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgICAgaWYgKGJDaGVja2VkKSB7DQorICAgICAgICBtX3BPd25lci0+U2V0SXRlbUNoZWNrZWQoaEl0ZW0sIEZBTFNFKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wT3duZXItPlNldEl0ZW1DaGVja2VkKGhJdGVtLCBUUlVFKTsNCisgICAgICB9DQorICAgICAgbV9wT3duZXItPlVwZGF0ZSgpOw0KKyAgICB9DQorICB9DQorICBtX3BPd25lci0+U2V0Rm9jdXNJdGVtKGhJdGVtKTsNCisgIG1fcE93bmVyLT5TY3JvbGxUb1Zpc2libGUoaEl0ZW0pOw0KKyAgbV9wT3duZXItPlNldEdyYWIoVFJVRSk7DQorICBtX3BPd25lci0+UHJvY2Vzc1NlbENoYW5nZWQoKTsNCisgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorfQ0KK3ZvaWQgQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGU6Ok9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmIChtX3BPd25lci0+bV9iTEJ1dHRvbkRvd24pIHsNCisgICAgbV9wT3duZXItPm1fYkxCdXR0b25Eb3duID0gRkFMU0U7DQorICAgIG1fcE93bmVyLT5TZXRHcmFiKEZBTFNFKTsNCisgICAgRGlzcGF0Y2hTZWxDaGFuZ2VkRXYoKTsNCisgIH0NCit9DQordm9pZCBDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZTo6T25Nb3VzZVdoZWVsKENGV0xfTXNnTW91c2VXaGVlbCogcE1zZykgew0KKyAgaWYgKCFtX3BPd25lci0+SXNTaG93U2Nyb2xsQmFyKFRSVUUpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9DQorICAgICAgbV9wT3duZXItPm1fcFZlcnRTY3JvbGxCYXItPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNc2cpOw0KK30NCit2b2lkIENGV0xfTGlzdEJveEltcERlbGVnYXRlOjpPbktleURvd24oQ0ZXTF9Nc2dLZXkqIHBNc2cpIHsNCisgIEZYX0RXT1JEIGR3S2V5Q29kZSA9IHBNc2ctPm1fZHdLZXlDb2RlOw0KKyAgc3dpdGNoIChkd0tleUNvZGUpIHsNCisgICAgY2FzZSBGV0xfVktFWV9UYWI6DQorICAgIGNhc2UgRldMX1ZLRVlfVXA6DQorICAgIGNhc2UgRldMX1ZLRVlfRG93bjoNCisgICAgY2FzZSBGV0xfVktFWV9Ib21lOg0KKyAgICBjYXNlIEZXTF9WS0VZX0VuZDogew0KKyAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBtX3BPd25lci0+R2V0Rm9jdXNlZEl0ZW0oKTsNCisgICAgICBoSXRlbSA9IG1fcE93bmVyLT5HZXRJdGVtKGhJdGVtLCBkd0tleUNvZGUpOw0KKyAgICAgIEZYX0JPT0wgYlNoaWZ0ID0gcE1zZy0+bV9kd0ZsYWdzICYgRldMX0tFWUZMQUdfU2hpZnQ7DQorICAgICAgRlhfQk9PTCBiQ3RybCA9IHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX0N0cmw7DQorICAgICAgT25WSyhoSXRlbSwgYlNoaWZ0LCBiQ3RybCk7DQorICAgICAgRGlzcGF0Y2hTZWxDaGFuZ2VkRXYoKTsNCisgICAgICBtX3BPd25lci0+UHJvY2Vzc1NlbENoYW5nZWQoKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KK30NCit2b2lkIENGV0xfTGlzdEJveEltcERlbGVnYXRlOjpPblZLKEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTaGlmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkN0cmwpIHsNCisgIGlmICghaEl0ZW0pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYNCisgICAgICBGV0xfU1RZTEVFWFRfTFRCX011bHRpU2VsZWN0aW9uKSB7DQorICAgIGlmIChiQ3RybCkgew0KKyAgICB9IGVsc2UgaWYgKGJTaGlmdCkgew0KKyAgICAgIGlmIChtX3BPd25lci0+bV9oQW5jaG9yKSB7DQorICAgICAgICBtX3BPd25lci0+U2V0U2VsZWN0aW9uKG1fcE93bmVyLT5tX2hBbmNob3IsIGhJdGVtLCBUUlVFKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wT3duZXItPlNldFNlbGVjdGlvbkRpcmVjdChoSXRlbSwgVFJVRSk7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG1fcE93bmVyLT5TZXRTZWxlY3Rpb24oaEl0ZW0sIGhJdGVtLCBUUlVFKTsNCisgICAgICBtX3BPd25lci0+bV9oQW5jaG9yID0gaEl0ZW07DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIG1fcE93bmVyLT5TZXRTZWxlY3Rpb24oaEl0ZW0sIGhJdGVtLCBUUlVFKTsNCisgIH0NCisgIG1fcE93bmVyLT5TZXRGb2N1c0l0ZW0oaEl0ZW0pOw0KKyAgbV9wT3duZXItPlNjcm9sbFRvVmlzaWJsZShoSXRlbSk7DQorICB7DQorICAgIENGWF9SZWN0RiBydEludmFsaWRhdGU7DQorICAgIHJ0SW52YWxpZGF0ZS5TZXQoMCwgMCwgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0KTsNCisgICAgbV9wT3duZXItPlJlcGFpbnQoJnJ0SW52YWxpZGF0ZSk7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGU6Ok9uU2Nyb2xsKElGV0xfU2Nyb2xsQmFyKiBwU2Nyb2xsQmFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Q29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUG9zKSB7DQorICBDRlhfU2l6ZUYgZnM7DQorICBwU2Nyb2xsQmFyLT5HZXRSYW5nZShmcy54LCBmcy55KTsNCisgIEZYX0ZMT0FUIGlDdXJQb3MgPSBwU2Nyb2xsQmFyLT5HZXRQb3MoKTsNCisgIEZYX0ZMT0FUIGZTdGVwID0gcFNjcm9sbEJhci0+R2V0U3RlcFNpemUoKTsNCisgIHN3aXRjaCAoZHdDb2RlKSB7DQorICAgIGNhc2UgRldMX1NDQkNPREVfTWluOiB7DQorICAgICAgZlBvcyA9IGZzLng7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU0NCQ09ERV9NYXg6IHsNCisgICAgICBmUG9zID0gZnMueTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9TQ0JDT0RFX1N0ZXBCYWNrd2FyZDogew0KKyAgICAgIGZQb3MgLT0gZlN0ZXA7DQorICAgICAgaWYgKGZQb3MgPCBmcy54ICsgZlN0ZXAgLyAyKSB7DQorICAgICAgICBmUG9zID0gZnMueDsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU0NCQ09ERV9TdGVwRm9yd2FyZDogew0KKyAgICAgIGZQb3MgKz0gZlN0ZXA7DQorICAgICAgaWYgKGZQb3MgPiBmcy55IC0gZlN0ZXAgLyAyKSB7DQorICAgICAgICBmUG9zID0gZnMueTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU0NCQ09ERV9QYWdlQmFja3dhcmQ6IHsNCisgICAgICBmUG9zIC09IHBTY3JvbGxCYXItPkdldFBhZ2VTaXplKCk7DQorICAgICAgaWYgKGZQb3MgPCBmcy54KSB7DQorICAgICAgICBmUG9zID0gZnMueDsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU0NCQ09ERV9QYWdlRm9yd2FyZDogew0KKyAgICAgIGZQb3MgKz0gcFNjcm9sbEJhci0+R2V0UGFnZVNpemUoKTsNCisgICAgICBpZiAoZlBvcyA+IGZzLnkpIHsNCisgICAgICAgIGZQb3MgPSBmcy55Ow0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9TQ0JDT0RFX1BvczoNCisgICAgY2FzZSBGV0xfU0NCQ09ERV9UcmFja1BvczoNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGV0xfU0NCQ09ERV9FbmRTY3JvbGw6DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGlDdXJQb3MgIT0gZlBvcykgew0KKyAgICBwU2Nyb2xsQmFyLT5TZXRQb3MoZlBvcyk7DQorICAgIHBTY3JvbGxCYXItPlNldFRyYWNrUG9zKGZQb3MpOw0KKyAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGU6OkRpc3BhdGNoU2VsQ2hhbmdlZEV2KCkgew0KKyAgQ0ZXTF9FdnRMdGJTZWxDaGFuZ2VkIGV2Ow0KKyAgZXYubV9wU3JjVGFyZ2V0ID0gbV9wT3duZXItPm1fcEludGVyZmFjZTsNCisgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZldik7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9tb250aGNhbGVuZGFyaW1wLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9tb250aGNhbGVuZGFyaW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTAzODI5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX21vbnRoY2FsZW5kYXJpbXAuY3BwCkBAIC0wLDAgKzEsMTA5OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF90YXJnZXRpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF93aWRnZXRpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfbW9udGhjYWxlbmRhcmltcC5oIg0KKyNkZWZpbmUgTU9OVEhDQUxfSFNFUF9IRUlHSFQgMQ0KKyNkZWZpbmUgTU9OVEhDQUxfVlNFUF9XSURUSCAxDQorI2RlZmluZSBNT05USENBTF9ITUFSR0lOIDMNCisjZGVmaW5lIE1PTlRIQ0FMX1ZNQVJHSU4gMg0KKyNkZWZpbmUgTU9OVEhDQUxfUk9XUyA5DQorI2RlZmluZSBNT05USENBTF9DT0xVTU5TIDcNCisjZGVmaW5lIE1PTlRIQ0FMX0hFQURFUl9CVE5fVk1BUkdJTiA3DQorI2RlZmluZSBNT05USENBTF9IRUFERVJfQlROX0hNQVJHSU4gNQ0KKw0KKy8vIHN0YXRpYw0KK0lGV0xfTW9udGhDYWxlbmRhciogSUZXTF9Nb250aENhbGVuZGFyOjpDcmVhdGUoDQorICAgIGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikgew0KKyAgSUZXTF9Nb250aENhbGVuZGFyKiBwTW9udGhDYWxlbmRhciA9IG5ldyBJRldMX01vbnRoQ2FsZW5kYXI7DQorICBDRldMX01vbnRoQ2FsZW5kYXJJbXAqIHBNb250aENhbGVuZGFySW1wbCA9DQorICAgICAgbmV3IENGV0xfTW9udGhDYWxlbmRhckltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpOw0KKyAgcE1vbnRoQ2FsZW5kYXItPlNldEltcGwocE1vbnRoQ2FsZW5kYXJJbXBsKTsNCisgIHBNb250aENhbGVuZGFySW1wbC0+U2V0SW50ZXJmYWNlKHBNb250aENhbGVuZGFyKTsNCisgIHJldHVybiBwTW9udGhDYWxlbmRhcjsNCit9DQorSUZXTF9Nb250aENhbGVuZGFyOjpJRldMX01vbnRoQ2FsZW5kYXIoKSB7fQ0KK2ludDMyX3QgSUZXTF9Nb250aENhbGVuZGFyOjpDb3VudFNlbGVjdCgpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX01vbnRoQ2FsZW5kYXJJbXAqPihHZXRJbXBsKCkpLT5Db3VudFNlbGVjdCgpOw0KK30NCitGWF9CT09MIElGV0xfTW9udGhDYWxlbmRhcjo6R2V0U2VsZWN0KGludDMyX3QmIGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaURheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9Nb250aENhbGVuZGFySW1wKj4oR2V0SW1wbCgpKQ0KKyAgICAgIC0+R2V0U2VsZWN0KGlZZWFyLCBpTW9udGgsIGlEYXksIG5JbmRleCk7DQorfQ0KK0ZYX0JPT0wgSUZXTF9Nb250aENhbGVuZGFyOjpTZXRTZWxlY3QoaW50MzJfdCBpWWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGF5KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9Nb250aENhbGVuZGFySW1wKj4oR2V0SW1wbCgpKQ0KKyAgICAgIC0+U2V0U2VsZWN0KGlZZWFyLCBpTW9udGgsIGlEYXkpOw0KK30NCisNCitDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkNGV0xfTW9udGhDYWxlbmRhckltcCgNCisgICAgY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICBJRldMX1dpZGdldCogcE91dGVyKQ0KKyAgICA6IENGV0xfV2lkZ2V0SW1wKHByb3BlcnRpZXMsIHBPdXRlciksDQorICAgICAgbV9pQ3VyWWVhcigyMDExKSwNCisgICAgICBtX2lDdXJNb250aCgxKSwNCisgICAgICBtX2lZZWFyKDIwMTEpLA0KKyAgICAgIG1faU1vbnRoKDEpLA0KKyAgICAgIG1faURheSgxKSwNCisgICAgICBtX2lIb3ZlcmVkKC0xKSwNCisgICAgICBtX2lMQnRuUGFydFN0YXRlcyhGV0xfUEFSVFNUQVRFX01DRF9Ob3JtYWwpLA0KKyAgICAgIG1faVJCdG5QYXJ0U3RhdGVzKEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbCkgew0KKyAgbV9ydEhlYWQuUmVzZXQoKTsNCisgIG1fcnRXZWVrLlJlc2V0KCk7DQorICBtX3J0TEJ0bi5SZXNldCgpOw0KKyAgbV9ydFJCdG4uUmVzZXQoKTsNCisgIG1fcnREYXRlcy5SZXNldCgpOw0KKyAgbV9ydEhTZXAuUmVzZXQoKTsNCisgIG1fcnRIZWFkVGV4dC5SZXNldCgpOw0KKyAgbV9ydFRvZGF5LlJlc2V0KCk7DQorICBtX3J0VG9kYXlGbGFnLlJlc2V0KCk7DQorICBtX3J0Q2xpZW50LlJlc2V0KCk7DQorICBtX3J0V2Vla051bS5SZXNldCgpOw0KKyAgbV9ydFdlZWtOdW1TZXAuUmVzZXQoKTsNCisgIG1fc3pIZWFkLlJlc2V0KCk7DQorICBtX3N6Q2VsbC5SZXNldCgpOw0KKyAgbV9zelRvZGF5LlJlc2V0KCk7DQorICBtX3BEYXRlVGltZSA9IG5ldyBDRlhfRGF0ZVRpbWU7DQorICBtX2JJbml0ID0gRkFMU0U7DQorICBtX2lNYXhTZWwgPSAxOw0KK30NCitDRldMX01vbnRoQ2FsZW5kYXJJbXA6On5DRldMX01vbnRoQ2FsZW5kYXJJbXAoKSB7DQorICBDbGVhckRhdGVJdGVtKCk7DQorICBkZWxldGUgbV9wRGF0ZVRpbWU7DQorICBtX2FyclNlbERheXMuUmVtb3ZlQWxsKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2xhc3MpIGNvbnN0IHsNCisgIHdzQ2xhc3MgPSBGV0xfQ0xBU1NfTW9udGhDYWxlbmRhcjsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpHZXRDbGFzc0lEKCkgY29uc3Qgew0KKyAgcmV0dXJuIEZXTF9DTEFTU0hBU0hfTW9udGhDYWxlbmRhcjsNCit9DQorRldMX0VSUiBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkluaXRpYWxpemUoKSB7DQorICBpZiAoQ0ZXTF9XaWRnZXRJbXA6OkluaXRpYWxpemUoKSAhPSBGV0xfRVJSX1N1Y2NlZWRlZCkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIG1fcERlbGVnYXRlID0gbmV3IENGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlKHRoaXMpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfTW9udGhDYWxlbmRhckltcDo6RmluYWxpemUoKSB7DQorICBkZWxldGUgbV9wRGVsZWdhdGU7DQorICBtX3BEZWxlZ2F0ZSA9IG51bGxwdHI7DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OkZpbmFsaXplKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBdXRvU2l6ZSkgew0KKyAgaWYgKGJBdXRvU2l6ZSkgew0KKyAgICBDRlhfU2l6ZUYgZnMgPSBDYWxjU2l6ZShUUlVFKTsNCisgICAgcmVjdC5TZXQoMCwgMCwgZnMueCwgZnMueSk7DQorICAgIENGV0xfV2lkZ2V0SW1wOjpHZXRXaWRnZXRSZWN0KHJlY3QsIFRSVUUpOw0KKyAgfSBlbHNlIHsNCisgICAgcmVjdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpVcGRhdGUoKSB7DQorICBpZiAoSXNMb2NrZWQoKSkgew0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgfQ0KKyAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKSB7DQorICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KKyAgfQ0KKyAgR2V0Q2FwVmFsdWUoKTsNCisgIGlmICghbV9iSW5pdCkgew0KKyAgICBtX2JJbml0ID0gSW5pdERhdGUoKTsNCisgIH0NCisgIENsZWFyRGF0ZUl0ZW0oKTsNCisgIFJlU2V0RGF0ZUl0ZW0oKTsNCisgIExheU91dCgpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfTW9udGhDYWxlbmRhckltcDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBpZiAoIXBHcmFwaGljcykNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID09IE5VTEwpIHsNCisgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICB9DQorICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICBpZiAoSGFzQm9yZGVyKCkpIHsNCisgICAgRHJhd0JvcmRlcihwR3JhcGhpY3MsIEZXTF9QQVJUX01DRF9Cb3JkZXIsIHBUaGVtZSwgcE1hdHJpeCk7DQorICB9DQorICBpZiAoSGFzRWRnZSgpKSB7DQorICAgIERyYXdFZGdlKHBHcmFwaGljcywgRldMX1BBUlRfTUNEX0VkZ2UsIHBUaGVtZSwgcE1hdHJpeCk7DQorICB9DQorICBEcmF3Qmtncm91bmQocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgRHJhd0hlYWRCSyhwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQorICBEcmF3TEJ1dHRvbihwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQorICBEcmF3UkJ1dHRvbihwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQorICBEcmF3U2VwZXJhdG9yKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCisgIERyYXdEYXRlc0luQksocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgRHJhd0RhdGVzSW5DaXJjbGUocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgRHJhd0NhcHRpb24ocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgRHJhd1dlZWsocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgRHJhd0RhdGVzSW4ocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgRHJhd0RhdGVzT3V0KHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCisgIERyYXdUb2RheShwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9NQ0RfV2Vla051bWJlcnMpIHsNCisgICAgRHJhd1dlZWtOdW1iZXJTZXAocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgICBEcmF3V2Vla051bWJlcihwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK2ludDMyX3QgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpDb3VudFNlbGVjdCgpIHsNCisgIHJldHVybiBtX2FyclNlbERheXMuR2V0U2l6ZSgpOw0KK30NCitGWF9CT09MIENGV0xfTW9udGhDYWxlbmRhckltcDo6R2V0U2VsZWN0KGludDMyX3QmIGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaURheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4KSB7DQorICBpZiAobkluZGV4ID49IG1fYXJyU2VsRGF5cy5HZXRTaXplKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaVllYXIgPSBtX2lDdXJZZWFyOw0KKyAgaU1vbnRoID0gbV9pQ3VyTW9udGg7DQorICBpRGF5ID0gbV9hcnJTZWxEYXlzW25JbmRleF07DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OlNldFNlbGVjdChpbnQzMl90IGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEYXkpIHsNCisgIENoYW5nZVRvTW9udGgoaVllYXIsIGlNb250aCk7DQorICByZXR1cm4gQWRkU2VsRGF5KGlEYXkpOw0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6RHJhd0JrZ3JvdW5kKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbXM7DQorICBwYXJhbXMubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcGFyYW1zLm1faVBhcnQgPSBGV0xfUEFSVF9NQ0RfQmFja2dyb3VuZDsNCisgIHBhcmFtcy5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgIHBhcmFtcy5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9NQ0RfTm9ybWFsOw0KKyAgcGFyYW1zLm1fcnRQYXJ0ID0gbV9ydENsaWVudDsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIHBhcmFtcy5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgfQ0KKyAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW1zKTsNCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkRyYXdIZWFkQksoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW1zOw0KKyAgcGFyYW1zLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIHBhcmFtcy5tX2lQYXJ0ID0gRldMX1BBUlRfTUNEX0hlYWRlcjsNCisgIHBhcmFtcy5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgIHBhcmFtcy5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9NQ0RfTm9ybWFsOw0KKyAgcGFyYW1zLm1fcnRQYXJ0ID0gbV9ydEhlYWQ7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtcyk7DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpEcmF3TEJ1dHRvbihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtczsNCisgIHBhcmFtcy5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBwYXJhbXMubV9pUGFydCA9IEZXTF9QQVJUX01DRF9MQnRuOw0KKyAgcGFyYW1zLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgcGFyYW1zLm1fZHdTdGF0ZXMgPSBtX2lMQnRuUGFydFN0YXRlczsNCisgIHBhcmFtcy5tX3J0UGFydCA9IG1fcnRMQnRuOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbXMpOw0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6RHJhd1JCdXR0b24oQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbXM7DQorICBwYXJhbXMubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcGFyYW1zLm1faVBhcnQgPSBGV0xfUEFSVF9NQ0RfUkJ0bjsNCisgIHBhcmFtcy5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgIHBhcmFtcy5tX2R3U3RhdGVzID0gbV9pUkJ0blBhcnRTdGF0ZXM7DQorICBwYXJhbXMubV9ydFBhcnQgPSBtX3J0UkJ0bjsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIHBhcmFtcy5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgfQ0KKyAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW1zKTsNCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkRyYXdDYXB0aW9uKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZXTF9UaGVtZVRleHQgdGV4dFBhcmFtOw0KKyAgdGV4dFBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIHRleHRQYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfTUNEX0NhcHRpb247DQorICB0ZXh0UGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbDsNCisgIHRleHRQYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgIGludDMyX3QgaVllYXI7DQorICBpbnQzMl90IGlNb250aDsNCisgIGlZZWFyID0gbV9pQ3VyWWVhcjsNCisgIGlNb250aCA9IG1faUN1ck1vbnRoOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NDYXRpb247DQorICBHZXRIZWFkVGV4dChpWWVhciwgaU1vbnRoLCB3c0NhdGlvbik7DQorICB0ZXh0UGFyYW0ubV93c1RleHQgPSB3c0NhdGlvbjsNCisgIG1fc3pIZWFkID0gQ2FsY1RleHRTaXplKHRleHRQYXJhbS5tX3dzVGV4dCwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcik7DQorICBDYWxjSGVhZFNpemUoKTsNCisgIHRleHRQYXJhbS5tX3J0UGFydCA9IG1fcnRIZWFkVGV4dDsNCisgIHRleHRQYXJhbS5tX2R3VFRPU3R5bGVzID0gRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmU7DQorICB0ZXh0UGFyYW0ubV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlcjsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIHRleHRQYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgfQ0KKyAgcFRoZW1lLT5EcmF3VGV4dCgmdGV4dFBhcmFtKTsNCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkRyYXdTZXBlcmF0b3IoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW1zOw0KKyAgcGFyYW1zLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIHBhcmFtcy5tX2lQYXJ0ID0gRldMX1BBUlRfTUNEX0hTZXBhcmF0b3I7DQorICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICBwYXJhbXMubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbDsNCisgIHBhcmFtcy5tX3J0UGFydCA9IG1fcnRIU2VwOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbXMpOw0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6RHJhd0RhdGVzSW5CSyhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbXM7DQorICBwYXJhbXMubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcGFyYW1zLm1faVBhcnQgPSBGV0xfUEFSVF9NQ0RfRGF0ZUluQks7DQorICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIGludDMyX3QgaUNvdW50ID0gbV9hcnJEYXRlcy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpQ291bnQ7IGorKykgew0KKyAgICBMUERBVEVJTkZPIHBEYXRhSW5mbyA9IChMUERBVEVJTkZPKW1fYXJyRGF0ZXMuR2V0QXQoaik7DQorICAgIGlmIChwRGF0YUluZm8tPmR3U3RhdGVzICYgRldMX0lURU1TVEFURV9NQ0RfU2VsZWN0ZWQpIHsNCisgICAgICBwYXJhbXMubV9kd1N0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX01DRF9TZWxlY3RlZDsNCisgICAgICBpZiAoKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX01DRF9Ob1RvZGF5Q2lyY2xlKSA9PQ0KKyAgICAgICAgICAgMCkgJiYNCisgICAgICAgICAgcERhdGFJbmZvLT5kd1N0YXRlcyAmIEZXTF9JVEVNU1RBVEVfTUNEX0ZsYWcpIHsNCisgICAgICAgIHBhcmFtcy5tX2R3U3RhdGVzIHw9IEZXTF9QQVJUU1RBVEVfTUNEX0ZsYWdnZWQ7DQorICAgICAgfQ0KKyAgICAgIGlmIChwRGF0YUluZm8tPmR3U3RhdGVzICYgRldMX0lURU1TVEFURV9NQ0RfRm9jdXNlZCkgew0KKyAgICAgICAgcGFyYW1zLm1fZHdTdGF0ZXMgfD0gRldMX1BBUlRTVEFURV9NQ0RfRm9jdXNlZDsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoaiA9PSBtX2lIb3ZlcmVkIC0gMSkgew0KKyAgICAgIHBhcmFtcy5tX2R3U3RhdGVzIHw9IEZXTF9QQVJUU1RBVEVfTUNEX0hvdmVyZWQ7DQorICAgIH0gZWxzZSBpZiAocERhdGFJbmZvLT5kd1N0YXRlcyAmIEZXTF9JVEVNU1RBVEVfTUNEX0ZsYWcpIHsNCisgICAgICBwYXJhbXMubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTUNEX0ZsYWdnZWQ7DQorICAgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW1zKTsNCisgICAgfQ0KKyAgICBwYXJhbXMubV9ydFBhcnQgPSBwRGF0YUluZm8tPnJlY3Q7DQorICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtcyk7DQorICAgIHBhcmFtcy5tX2R3U3RhdGVzID0gMDsNCisgIH0NCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkRyYXdXZWVrKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZXTF9UaGVtZVRleHQgcGFyYW1zOw0KKyAgcGFyYW1zLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIHBhcmFtcy5tX2lQYXJ0ID0gRldMX1BBUlRfTUNEX1dlZWs7DQorICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICBwYXJhbXMubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbDsNCisgIHBhcmFtcy5tX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyOw0KKyAgaW50MzJfdCBpV2VlazsNCisgIGlXZWVrID0gbV9wRGF0ZVRpbWUtPkdldERheU9mV2VlaygpOw0KKyAgQ0ZYX1JlY3RGIHJ0RGF5T2ZXZWVrOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA3OyBpKyspIHsNCisgICAgcnREYXlPZldlZWsuU2V0KG1fcnRXZWVrLmxlZnQgKyBpICogKG1fc3pDZWxsLnggKyBNT05USENBTF9ITUFSR0lOICogMiksDQorICAgICAgICAgICAgICAgICAgICBtX3J0V2Vlay50b3AsIG1fc3pDZWxsLngsIG1fc3pDZWxsLnkpOw0KKyAgICBDRlhfV2lkZVN0cmluZyogd3NXZWVrRGF5ID0gc3RhdGljX2Nhc3Q8Q0ZYX1dpZGVTdHJpbmcqPigNCisgICAgICAgIHBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcmFtcywgaSArIEZXTF9NQ0NBUEFDSVRZX1N1bikpOw0KKyAgICBwYXJhbXMubV9ydFBhcnQgPSBydERheU9mV2VlazsNCisgICAgcGFyYW1zLm1fd3NUZXh0ID0gKndzV2Vla0RheTsNCisgICAgcGFyYW1zLm1fZHdUVE9TdHlsZXMgPSBGREVfVFRPU1RZTEVfU2luZ2xlTGluZTsNCisgICAgcFRoZW1lLT5EcmF3VGV4dCgmcGFyYW1zKTsNCisgIH0NCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkRyYXdXZWVrTnVtYmVyKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZXTF9UaGVtZVRleHQgcGFyYW1zOw0KKyAgcGFyYW1zLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIHBhcmFtcy5tX2lQYXJ0ID0gRldMX1BBUlRfTUNEX1dlZWtOdW07DQorICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICBwYXJhbXMubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbDsNCisgIHBhcmFtcy5tX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyTGVmdDsNCisgIENGWF9XaWRlU3RyaW5nIHdzV2Vla051bTsNCisgIHBhcmFtcy5tX2R3VFRPU3R5bGVzID0gRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmU7DQorICBwYXJhbXMubV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlcjsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIHBhcmFtcy5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgfQ0KKyAgaW50MzJfdCBpV2Vla051bSA9IDA7DQorICBpbnQzMl90IGlNb250aE51bSA9IG1fcERhdGVUaW1lLT5HZXRNb250aCgpOw0KKyAgaW50MzJfdCBpRGF5TnVtID0gRlhfRGF5c0luTW9udGgobV9pQ3VyWWVhciwgaU1vbnRoTnVtKTsNCisgIGludDMyX3QgaVRlbXAgPSAwOw0KKyAgRlhfRkxPQVQgZlZTdGFydFBvcyA9IG1fcnRDbGllbnQudG9wICsgbV9mSGVhZEhlaSArIG1fZkhTZXBIZWk7DQorICBGWF9GTE9BVCBmSFN0YXJ0UG9zID0gbV9ydENsaWVudC5sZWZ0Ow0KKyAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDw9IGlEYXlOdW07IGkgKz0gNykgew0KKyAgICBpVGVtcCsrOw0KKyAgICBpV2Vla051bSA9IENhbFdlZWtOdW1iZXIobV9pQ3VyWWVhciwgaU1vbnRoTnVtLCBpKTsNCisgICAgbV9ydFdlZWtOdW0uU2V0KGZIU3RhcnRQb3MsIGZWU3RhcnRQb3MgKyBtX2ZEYXRlQ2VsbEhlaSAqIGlUZW1wLA0KKyAgICAgICAgICAgICAgICAgICAgbV9mV2Vla051bVdpZCwgbV9mRGF0ZUNlbGxIZWkpOw0KKyAgICB3c1dlZWtOdW0uRm9ybWF0KEwiJWQiLCBpV2Vla051bSk7DQorICAgIHBhcmFtcy5tX3dzVGV4dCA9IHdzV2Vla051bTsNCisgICAgcGFyYW1zLm1fcnRQYXJ0ID0gbV9ydFdlZWtOdW07DQorICAgIHBUaGVtZS0+RHJhd1RleHQoJnBhcmFtcyk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpEcmF3V2Vla051bWJlclNlcChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtczsNCisgIHBhcmFtcy5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBwYXJhbXMubV9pUGFydCA9IEZXTF9QQVJUX01DRF9XZWVrTnVtU2VwOw0KKyAgcGFyYW1zLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgcGFyYW1zLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX01DRF9Ob3JtYWw7DQorICBwYXJhbXMubV9ydFBhcnQgPSBtX3J0V2Vla051bVNlcDsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIHBhcmFtcy5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgfQ0KKyAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW1zKTsNCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkRyYXdUb2RheShDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTUNEX05vVG9kYXkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZXTF9UaGVtZVRleHQgcGFyYW1zOw0KKyAgcGFyYW1zLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIHBhcmFtcy5tX2lQYXJ0ID0gRldMX1BBUlRfTUNEX1RvZGF5Ow0KKyAgcGFyYW1zLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgcGFyYW1zLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX01DRF9Ob3JtYWw7DQorICBwYXJhbXMubV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlckxlZnQ7DQorICBDRlhfV2lkZVN0cmluZyogd3NEYXkgPSBzdGF0aWNfY2FzdDxDRlhfV2lkZVN0cmluZyo+KA0KKyAgICAgIHBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcmFtcywgRldMX01DQ0FQQUNJVFlfVG9kYXkpKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgIEdldFRvZGF5VGV4dChtX2lZZWFyLCBtX2lNb250aCwgbV9pRGF5LCB3c1RleHQpOw0KKyAgcGFyYW1zLm1fd3NUZXh0ID0gKndzRGF5ICsgd3NUZXh0Ow0KKyAgbV9zelRvZGF5ID0gQ2FsY1RleHRTaXplKHBhcmFtcy5tX3dzVGV4dCwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcik7DQorICBDYWxjVG9kYXlTaXplKCk7DQorICBwYXJhbXMubV9ydFBhcnQgPSBtX3J0VG9kYXk7DQorICBwYXJhbXMubV9kd1RUT1N0eWxlcyA9IEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBwVGhlbWUtPkRyYXdUZXh0KCZwYXJhbXMpOw0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6RHJhd0RhdGVzSW4oQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRldMX1RoZW1lVGV4dCBwYXJhbXM7DQorICBwYXJhbXMubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcGFyYW1zLm1faVBhcnQgPSBGV0xfUEFSVF9NQ0RfRGF0ZXNJbjsNCisgIHBhcmFtcy5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgIHBhcmFtcy5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9NQ0RfTm9ybWFsOw0KKyAgcGFyYW1zLm1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXI7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIGludDMyX3QgaUNvdW50ID0gbV9hcnJEYXRlcy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpQ291bnQ7IGorKykgew0KKyAgICBMUERBVEVJTkZPIHBEYXRhSW5mbyA9IChMUERBVEVJTkZPKW1fYXJyRGF0ZXMuR2V0QXQoaik7DQorICAgIHBhcmFtcy5tX3dzVGV4dCA9IHBEYXRhSW5mby0+d3NEYXk7DQorICAgIHBhcmFtcy5tX3J0UGFydCA9IHBEYXRhSW5mby0+cmVjdDsNCisgICAgcGFyYW1zLm1fZHdTdGF0ZXMgPSBwRGF0YUluZm8tPmR3U3RhdGVzOw0KKyAgICBpZiAoaiArIDEgPT0gbV9pSG92ZXJlZCkgew0KKyAgICAgIHBhcmFtcy5tX2R3U3RhdGVzIHw9IEZXTF9QQVJUU1RBVEVfTUNEX0hvdmVyZWQ7DQorICAgIH0NCisgICAgcGFyYW1zLm1fZHdUVE9TdHlsZXMgPSBGREVfVFRPU1RZTEVfU2luZ2xlTGluZTsNCisgICAgcFRoZW1lLT5EcmF3VGV4dCgmcGFyYW1zKTsNCisgIH0NCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkRyYXdEYXRlc091dChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZXTF9UaGVtZVRleHQgcGFyYW1zOw0KKyAgcGFyYW1zLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIHBhcmFtcy5tX2lQYXJ0ID0gRldMX1BBUlRfTUNEX0RhdGVzT3V0Ow0KKyAgcGFyYW1zLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgcGFyYW1zLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX01DRF9Ob3JtYWw7DQorICBwYXJhbXMubV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlcjsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIHBhcmFtcy5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgfQ0KKyAgcFRoZW1lLT5EcmF3VGV4dCgmcGFyYW1zKTsNCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkRyYXdEYXRlc0luQ2lyY2xlKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTUNEX05vVG9kYXlDaXJjbGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1faU1vbnRoICE9IG1faUN1ck1vbnRoIHx8IG1faVllYXIgIT0gbV9pQ3VyWWVhcikgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAobV9pRGF5IDwgMSB8fCBtX2lEYXkgPiBtX2FyckRhdGVzLkdldFNpemUoKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBMUERBVEVJTkZPIHBEYXRlID0gKExQREFURUlORk8pbV9hcnJEYXRlc1ttX2lEYXkgLSAxXTsNCisgIGlmICghcERhdGUpDQorICAgIHJldHVybjsNCisgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtczsNCisgIHBhcmFtcy5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBwYXJhbXMubV9pUGFydCA9IEZXTF9QQVJUX01DRF9EYXRlSW5DaXJjbGU7DQorICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICBwYXJhbXMubV9ydFBhcnQgPSBwRGF0ZS0+cmVjdDsNCisgIHBhcmFtcy5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9NQ0RfTm9ybWFsOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbXMpOw0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6RHJhd1RvZGF5Q2lyY2xlKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9NQ0RfTm9Ub2RheSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9NQ0RfTm9Ub2RheUNpcmNsZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbXM7DQorICBwYXJhbXMubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcGFyYW1zLm1faVBhcnQgPSBGV0xfUEFSVF9NQ0RfVG9kYXlDaXJjbGU7DQorICBwYXJhbXMubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICBwYXJhbXMubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfTUNEX05vcm1hbDsNCisgIHBhcmFtcy5tX3J0UGFydCA9IG1fcnRUb2RheUZsYWc7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtcyk7DQorfQ0KK0NGWF9TaXplRiBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkNhbGNTaXplKEZYX0JPT0wgYkF1dG9TaXplKSB7DQorICBDRlhfU2l6ZUYgZnM7DQorICBmcy5TZXQoMCwgMCk7DQorICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpDQorICAgIHJldHVybiBmczsNCisgIGlmIChiQXV0b1NpemUpIHsNCisgICAgQ0ZXTF9UaGVtZVBhcnQgcGFyYW1zOw0KKyAgICBwYXJhbXMubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICAgIENGWF9XaWRlU3RyaW5nKiB3c1RleHQgPSBOVUxMOw0KKyAgICBGWF9GTE9BVCBmTWF4V2Vla1cgPSAwLjBmOw0KKyAgICBGWF9GTE9BVCBmTWF4V2Vla0ggPSAwLjBmOw0KKyAgICBmb3IgKEZYX0RXT1JEIHdlZWsgPSBGV0xfTUNDQVBBQ0lUWV9TdW47IHdlZWsgPD0gRldMX01DQ0FQQUNJVFlfU2F0Ow0KKyAgICAgICAgIHdlZWsrKykgew0KKyAgICAgIHdzVGV4dCA9IHN0YXRpY19jYXN0PENGWF9XaWRlU3RyaW5nKj4ocFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFyYW1zLCB3ZWVrKSk7DQorICAgICAgQ0ZYX1NpemVGIHN6ID0gQ2FsY1RleHRTaXplKCp3c1RleHQsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpOw0KKyAgICAgIGZNYXhXZWVrVyA9IChmTWF4V2Vla1cgPj0gc3oueCkgPyBmTWF4V2Vla1cgOiBzei54Ow0KKyAgICAgIGZNYXhXZWVrSCA9IChmTWF4V2Vla0ggPj0gc3oueSkgPyBmTWF4V2Vla0ggOiBzei55Ow0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZEYXlNYXhXID0gMC4wZjsNCisgICAgRlhfRkxPQVQgZkRheU1heEggPSAwLjBmOw0KKyAgICBmb3IgKGludCBkYXkgPSAxMDsgZGF5IDw9IDMxOyBkYXkrKykgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF5Ow0KKyAgICAgIHdzRGF5LkZvcm1hdChMIiVkIiwgZGF5KTsNCisgICAgICBDRlhfU2l6ZUYgc3ogPSBDYWxjVGV4dFNpemUod3NEYXksIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpOw0KKyAgICAgIGZEYXlNYXhXID0gKGZEYXlNYXhXID49IHN6LngpID8gZkRheU1heFcgOiBzei54Ow0KKyAgICAgIGZEYXlNYXhIID0gKGZEYXlNYXhIID49IHN6LnkpID8gZkRheU1heEggOiBzei55Ow0KKyAgICB9DQorICAgIG1fc3pDZWxsLnggPSBGWF9GTE9BVCgoZk1heFdlZWtXID49IGZEYXlNYXhXKSA/IChpbnQpKGZNYXhXZWVrVyArIDAuNSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGludCkoZkRheU1heFcgKyAwLjUpKTsNCisgICAgbV9zekNlbGwueSA9IChmTWF4V2Vla0ggPj0gZkRheU1heEgpID8gZk1heFdlZWtIIDogZkRheU1heEg7DQorICAgIGZzLnggPSBtX3N6Q2VsbC54ICogTU9OVEhDQUxfQ09MVU1OUyArDQorICAgICAgICAgICBNT05USENBTF9ITUFSR0lOICogTU9OVEhDQUxfQ09MVU1OUyAqIDIgKw0KKyAgICAgICAgICAgTU9OVEhDQUxfSEVBREVSX0JUTl9ITUFSR0lOICogMjsNCisgICAgRlhfRkxPQVQgZk1vbnRoTWF4VyA9IDAuMGY7DQorICAgIEZYX0ZMT0FUIGZNb250aE1heEggPSAwLjBmOw0KKyAgICBmb3IgKEZYX0RXT1JEIG1vbnRoID0gRldMX01DQ0FQQUNJVFlfSmFudWFyeTsNCisgICAgICAgICBtb250aCA8PSBGV0xfTUNDQVBBQ0lUWV9EZWNlbWJlcjsgbW9udGgrKykgew0KKyAgICAgIHdzVGV4dCA9DQorICAgICAgICAgIHN0YXRpY19jYXN0PENGWF9XaWRlU3RyaW5nKj4ocFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFyYW1zLCBtb250aCkpOw0KKyAgICAgIENGWF9TaXplRiBzeiA9IENhbGNUZXh0U2l6ZSgqd3NUZXh0LCBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKTsNCisgICAgICBmTW9udGhNYXhXID0gKGZNb250aE1heFcgPj0gc3oueCkgPyBmTW9udGhNYXhXIDogc3oueDsNCisgICAgICBmTW9udGhNYXhIID0gKGZNb250aE1heEggPj0gc3oueSkgPyBmTW9udGhNYXhIIDogc3oueTsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1llYXI7DQorICAgIEdldEhlYWRUZXh0KG1faVllYXIsIG1faU1vbnRoLCB3c1llYXIpOw0KKyAgICBDRlhfU2l6ZUYgc3pZZWFyID0gQ2FsY1RleHRTaXplKHdzWWVhciwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcik7DQorICAgIGZNb250aE1heEggPSAoZk1vbnRoTWF4SCA+PSBzelllYXIueSkgPyBmTW9udGhNYXhIIDogc3pZZWFyLnk7DQorICAgIG1fc3pIZWFkLlNldChmTW9udGhNYXhXICsgc3pZZWFyLngsIGZNb250aE1heEgpOw0KKyAgICBmTW9udGhNYXhXID0gbV9zekhlYWQueCArIE1PTlRIQ0FMX0hFQURFUl9CVE5fSE1BUkdJTiAqIDIgKyBtX3N6Q2VsbC54ICogMjsNCisgICAgZnMueCA9IChmcy54ID49IGZNb250aE1heFcpID8gZnMueCA6IGZNb250aE1heFc7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVG9kYXk7DQorICAgIEdldFRvZGF5VGV4dChtX2lZZWFyLCBtX2lNb250aCwgbV9pRGF5LCB3c1RvZGF5KTsNCisgICAgd3NUZXh0ID0gc3RhdGljX2Nhc3Q8Q0ZYX1dpZGVTdHJpbmcqPigNCisgICAgICAgIHBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcmFtcywgRldMX01DQ0FQQUNJVFlfVG9kYXkpKTsNCisgICAgbV93c1RvZGF5ID0gKndzVGV4dCArIHdzVG9kYXk7DQorICAgIG1fc3pUb2RheSA9IENhbGNUZXh0U2l6ZSh3c1RvZGF5LCBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKTsNCisgICAgbV9zelRvZGF5LnkgPSAobV9zelRvZGF5LnkgPj0gbV9zekNlbGwueSkgPyBtX3N6VG9kYXkueSA6IG1fc3pDZWxsLnk7DQorICAgIGZzLnkgPSBtX3N6Q2VsbC54ICsgbV9zekNlbGwueSAqIChNT05USENBTF9ST1dTIC0gMikgKyBtX3N6VG9kYXkueSArDQorICAgICAgICAgICBNT05USENBTF9WTUFSR0lOICogTU9OVEhDQUxfUk9XUyAqIDIgKw0KKyAgICAgICAgICAgTU9OVEhDQUxfSEVBREVSX0JUTl9WTUFSR0lOICogNDsNCisgIH0gZWxzZSB7DQorICAgIEdldENsaWVudFJlY3QobV9ydENsaWVudCk7DQorICAgIGZzLlNldChtX3J0Q2xpZW50LndpZHRoLCBtX3J0Q2xpZW50LmhlaWdodCk7DQorICB9DQorICByZXR1cm4gZnM7DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpDYWxjSGVhZFNpemUoKSB7DQorICBGWF9GTE9BVCBmSGVhZEhNYXJnaW4gPSAobV9ydENsaWVudC53aWR0aCAtIG1fc3pIZWFkLngpIC8gMjsNCisgIEZYX0ZMT0FUIGZIZWFkVk1hcmdpbiA9IChtX3N6Q2VsbC54IC0gbV9zekhlYWQueSkgLyAyOw0KKyAgbV9ydEhlYWRUZXh0LlNldChtX3J0Q2xpZW50LmxlZnQgKyBmSGVhZEhNYXJnaW4sDQorICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQudG9wICsgTU9OVEhDQUxfSEVBREVSX0JUTl9WTUFSR0lOICsNCisgICAgICAgICAgICAgICAgICAgICAgIE1PTlRIQ0FMX1ZNQVJHSU4gKyBmSGVhZFZNYXJnaW4sDQorICAgICAgICAgICAgICAgICAgIG1fc3pIZWFkLngsIG1fc3pIZWFkLnkpOw0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6Q2FsY1RvZGF5U2l6ZSgpIHsNCisgIG1fcnRUb2RheUZsYWcuU2V0KA0KKyAgICAgIG1fcnRDbGllbnQubGVmdCArIE1PTlRIQ0FMX0hFQURFUl9CVE5fSE1BUkdJTiArIE1PTlRIQ0FMX0hNQVJHSU4sDQorICAgICAgbV9ydERhdGVzLmJvdHRvbSgpICsgTU9OVEhDQUxfSEVBREVSX0JUTl9WTUFSR0lOICsgTU9OVEhDQUxfVk1BUkdJTiwNCisgICAgICBtX3N6Q2VsbC54LCBtX3N6VG9kYXkueSk7DQorICBtX3J0VG9kYXkuU2V0KA0KKyAgICAgIG1fcnRDbGllbnQubGVmdCArIE1PTlRIQ0FMX0hFQURFUl9CVE5fSE1BUkdJTiArIG1fc3pDZWxsLnggKw0KKyAgICAgICAgICBNT05USENBTF9ITUFSR0lOICogMiwNCisgICAgICBtX3J0RGF0ZXMuYm90dG9tKCkgKyBNT05USENBTF9IRUFERVJfQlROX1ZNQVJHSU4gKyBNT05USENBTF9WTUFSR0lOLA0KKyAgICAgIG1fc3pUb2RheS54LCBtX3N6VG9kYXkueSk7DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpMYXlPdXQoKSB7DQorICBHZXRDbGllbnRSZWN0KG1fcnRDbGllbnQpOw0KKyAgew0KKyAgICBtX3J0SGVhZC5TZXQoDQorICAgICAgICBtX3J0Q2xpZW50LmxlZnQgKyBNT05USENBTF9IRUFERVJfQlROX0hNQVJHSU4sIG1fcnRDbGllbnQudG9wLA0KKyAgICAgICAgbV9ydENsaWVudC53aWR0aCAtIE1PTlRIQ0FMX0hFQURFUl9CVE5fSE1BUkdJTiAqIDIsDQorICAgICAgICBtX3N6Q2VsbC54ICsgKE1PTlRIQ0FMX0hFQURFUl9CVE5fVk1BUkdJTiArIE1PTlRIQ0FMX1ZNQVJHSU4pICogMik7DQorICAgIG1fcnRXZWVrLlNldChtX3J0Q2xpZW50LmxlZnQgKyBNT05USENBTF9IRUFERVJfQlROX0hNQVJHSU4sDQorICAgICAgICAgICAgICAgICBtX3J0SGVhZC5ib3R0b20oKSwNCisgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQud2lkdGggLSBNT05USENBTF9IRUFERVJfQlROX0hNQVJHSU4gKiAyLA0KKyAgICAgICAgICAgICAgICAgbV9zekNlbGwueSArIE1PTlRIQ0FMX1ZNQVJHSU4gKiAyKTsNCisgICAgbV9ydExCdG4uU2V0KG1fcnRDbGllbnQubGVmdCArIE1PTlRIQ0FMX0hFQURFUl9CVE5fSE1BUkdJTiwNCisgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQudG9wICsgTU9OVEhDQUxfSEVBREVSX0JUTl9WTUFSR0lOLCBtX3N6Q2VsbC54LA0KKyAgICAgICAgICAgICAgICAgbV9zekNlbGwueCk7DQorICAgIG1fcnRSQnRuLlNldChtX3J0Q2xpZW50LmxlZnQgKyBtX3J0Q2xpZW50LndpZHRoIC0NCisgICAgICAgICAgICAgICAgICAgICBNT05USENBTF9IRUFERVJfQlROX0hNQVJHSU4gLSBtX3N6Q2VsbC54LA0KKyAgICAgICAgICAgICAgICAgbV9ydENsaWVudC50b3AgKyBNT05USENBTF9IRUFERVJfQlROX1ZNQVJHSU4sIG1fc3pDZWxsLngsDQorICAgICAgICAgICAgICAgICBtX3N6Q2VsbC54KTsNCisgICAgbV9ydEhTZXAuU2V0KA0KKyAgICAgICAgbV9ydENsaWVudC5sZWZ0ICsgTU9OVEhDQUxfSEVBREVSX0JUTl9ITUFSR0lOICsgTU9OVEhDQUxfSE1BUkdJTiwNCisgICAgICAgIG1fcnRXZWVrLmJvdHRvbSgpIC0gTU9OVEhDQUxfVk1BUkdJTiwNCisgICAgICAgIG1fcnRDbGllbnQud2lkdGggLSAoTU9OVEhDQUxfSEVBREVSX0JUTl9ITUFSR0lOICsgTU9OVEhDQUxfSE1BUkdJTikgKiAyLA0KKyAgICAgICAgTU9OVEhDQUxfSFNFUF9IRUlHSFQpOw0KKyAgICBtX3J0RGF0ZXMuU2V0KG1fcnRDbGllbnQubGVmdCArIE1PTlRIQ0FMX0hFQURFUl9CVE5fSE1BUkdJTiwNCisgICAgICAgICAgICAgICAgICBtX3J0V2Vlay5ib3R0b20oKSwNCisgICAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LndpZHRoIC0gTU9OVEhDQUxfSEVBREVSX0JUTl9ITUFSR0lOICogMiwNCisgICAgICAgICAgICAgICAgICBtX3N6Q2VsbC55ICogKE1PTlRIQ0FMX1JPV1MgLSAzKSArDQorICAgICAgICAgICAgICAgICAgICAgIE1PTlRIQ0FMX1ZNQVJHSU4gKiAoTU9OVEhDQUxfUk9XUyAtIDMpICogMik7DQorICB9DQorICBDYWxEYXRlSXRlbSgpOw0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6Q2FsRGF0ZUl0ZW0oKSB7DQorICBGWF9CT09MIGJOZXdXZWVrID0gRkFMU0U7DQorICBpbnQzMl90IGlXZWVrT2ZNb250aCA9IDA7DQorICBGWF9GTE9BVCBmTGVmdCA9IG1fcnREYXRlcy5sZWZ0Ow0KKyAgRlhfRkxPQVQgZlRvcCA9IG1fcnREYXRlcy50b3A7DQorICBpbnQzMl90IGlDb3VudCA9IG1fYXJyRGF0ZXMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgTFBEQVRFSU5GTyBwRGF0ZUluZm8gPSAoTFBEQVRFSU5GTyltX2FyckRhdGVzLkdldEF0KGkpOw0KKyAgICBpZiAoYk5ld1dlZWspIHsNCisgICAgICBpV2Vla09mTW9udGgrKzsNCisgICAgICBiTmV3V2VlayA9IEZBTFNFOw0KKyAgICB9DQorICAgIHBEYXRlSW5mby0+cmVjdC5TZXQoDQorICAgICAgICBmTGVmdCArIHBEYXRlSW5mby0+aURheU9mV2VlayAqIChtX3N6Q2VsbC54ICsgKE1PTlRIQ0FMX0hNQVJHSU4gKiAyKSksDQorICAgICAgICBmVG9wICsgaVdlZWtPZk1vbnRoICogKG1fc3pDZWxsLnkgKyAoTU9OVEhDQUxfVk1BUkdJTiAqIDIpKSwNCisgICAgICAgIG1fc3pDZWxsLnggKyAoTU9OVEhDQUxfSE1BUkdJTiAqIDIpLA0KKyAgICAgICAgbV9zekNlbGwueSArIChNT05USENBTF9WTUFSR0lOICogMikpOw0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9NQ0RfV2Vla051bWJlcnMpIHsNCisgICAgICBwRGF0ZUluZm8tPnJlY3QuT2Zmc2V0KG1fZldlZWtOdW1XaWQsIDApOw0KKyAgICB9DQorICAgIGlmIChwRGF0ZUluZm8tPmlEYXlPZldlZWsgPj0gNikgew0KKyAgICAgIGJOZXdXZWVrID0gVFJVRTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6R2V0Q2FwVmFsdWUoKSB7DQorICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpIHsNCisgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICB9DQorICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICBDRldMX1RoZW1lUGFydCBwYXJ0Ow0KKyAgcGFydC5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBtX2ZIZWFkV2lkID0gKnN0YXRpY19jYXN0PEZYX0ZMT0FUKj4oDQorICAgICAgcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9XSURUSCkpOw0KKyAgbV9mSGVhZEhlaSA9ICpzdGF0aWNfY2FzdDxGWF9GTE9BVCo+KA0KKyAgICAgIHBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfSGVpZ2h0KSk7DQorICBtX2ZIZWFkQnRuV2lkID0gKnN0YXRpY19jYXN0PEZYX0ZMT0FUKj4oDQorICAgICAgcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9CVE5fV0lEVEgpKTsNCisgIG1fZkhlYWRCdG5IZWkgPSAqc3RhdGljX2Nhc3Q8RlhfRkxPQVQqPigNCisgICAgICBwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9IRUlHSFQpKTsNCisgIG1fZkhlYWRCdG5ITWFyZ2luID0gKnN0YXRpY19jYXN0PEZYX0ZMT0FUKj4oDQorICAgICAgcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9CVE5fSE1BUkdJTikpOw0KKyAgbV9mSGVhZEJ0blZNYXJnaW4gPSAqc3RhdGljX2Nhc3Q8RlhfRkxPQVQqPigNCisgICAgICBwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9WTUFSR0lOKSk7DQorICBtX2ZIZWFkVGV4dFdpZCA9ICpzdGF0aWNfY2FzdDxGWF9GTE9BVCo+KA0KKyAgICAgIHBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVFdJREhUKSk7DQorICBtX2ZIZWFkVGV4dEhlaSA9ICpzdGF0aWNfY2FzdDxGWF9GTE9BVCo+KA0KKyAgICAgIHBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVEhFSUdIVCkpOw0KKyAgbV9mSGVhZFRleHRITWFyZ2luID0gKnN0YXRpY19jYXN0PEZYX0ZMT0FUKj4oDQorICAgICAgcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9URVhUX0hNQVJHSU4pKTsNCisgIG1fZkhlYWRUZXh0Vk1hcmdpbiA9ICpzdGF0aWNfY2FzdDxGWF9GTE9BVCo+KA0KKyAgICAgIHBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVF9WTUFSR0lOKSk7DQorICBtX2ZIU2VwV2lkID0gKnN0YXRpY19jYXN0PEZYX0ZMT0FUKj4oDQorICAgICAgcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX0hTRVBfV0lEVEgpKTsNCisgIG1fZkhTZXBIZWkgPSAqc3RhdGljX2Nhc3Q8RlhfRkxPQVQqPigNCisgICAgICBwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfSFNFUF9IRUlHSFQpKTsNCisgIG1fZldlZWtOdW1XaWQgPSAqc3RhdGljX2Nhc3Q8RlhfRkxPQVQqPigNCisgICAgICBwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfV0VFS05VTV9XSURUSCkpOw0KKyAgbV9mU2VwRE9mZnNldCA9ICpzdGF0aWNfY2FzdDxGWF9GTE9BVCo+KA0KKyAgICAgIHBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19TRVBfRE9GRlNFVCkpOw0KKyAgbV9mU2VwWCA9ICpzdGF0aWNfY2FzdDxGWF9GTE9BVCo+KA0KKyAgICAgIHBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19TRVBfWCkpOw0KKyAgbV9mU2VwWSA9ICpzdGF0aWNfY2FzdDxGWF9GTE9BVCo+KA0KKyAgICAgIHBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19TRVBfWSkpOw0KKyAgbV9mV2Vla051bUhlaWdoID0gKnN0YXRpY19jYXN0PEZYX0ZMT0FUKj4oDQorICAgICAgcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX1dFRUtOVU1fSEVJR0hUKSk7DQorICBtX2ZXZWVrV2lkID0gKnN0YXRpY19jYXN0PEZYX0ZMT0FUKj4oDQorICAgICAgcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX1dFRUtfV0lEVEgpKTsNCisgIG1fZldlZWtIZWkgPSAqc3RhdGljX2Nhc3Q8RlhfRkxPQVQqPigNCisgICAgICBwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfV0VFS19IRUlHSFQpKTsNCisgIG1fZkRhdGVDZWxsV2lkID0gKnN0YXRpY19jYXN0PEZYX0ZMT0FUKj4oDQorICAgICAgcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX0RBVEVTX0NFTExfV0lEVEgpKTsNCisgIG1fZkRhdGVDZWxsSGVpID0gKnN0YXRpY19jYXN0PEZYX0ZMT0FUKj4oDQorICAgICAgcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX01DX0RBVEVTX0NFTExfSEVJR0hUKSk7DQorICBtX2ZUb2RheVdpZCA9ICpzdGF0aWNfY2FzdDxGWF9GTE9BVCo+KA0KKyAgICAgIHBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9NQ19UT0RBWV9XSURIVCkpOw0KKyAgbV9mVG9kYXlIZWkgPSAqc3RhdGljX2Nhc3Q8RlhfRkxPQVQqPigNCisgICAgICBwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfVE9EQVlfSEVJR0hUKSk7DQorICBtX2ZUb2RheUZsYWdXaWQgPSAqc3RhdGljX2Nhc3Q8RlhfRkxPQVQqPigNCisgICAgICBwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfVE9EQVlfRkxBR19XSURIVCkpOw0KKyAgbV9mTUNXaWQgPSAqc3RhdGljX2Nhc3Q8RlhfRkxPQVQqPigNCisgICAgICBwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfV0lEVEgpKTsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX01DRF9XZWVrTnVtYmVycykgew0KKyAgICBtX2ZNQ1dpZCArPSBtX2ZXZWVrTnVtV2lkOw0KKyAgfQ0KKyAgbV9mTUNIZWkgPSAqc3RhdGljX2Nhc3Q8RlhfRkxPQVQqPigNCisgICAgICBwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVJR0hUKSk7DQorfQ0KK2ludDMyX3QgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpDYWxXZWVrTnVtYmVyKGludDMyX3QgaVllYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGF5KSB7DQorICByZXR1cm4gMDsNCit9DQorRlhfQk9PTCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkdldE1pbkRhdGUoaW50MzJfdCYgaVllYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlEYXkpIHsNCisgIGlZZWFyID0gbV9kdE1pbi5pWWVhcjsNCisgIGlNb250aCA9IG1fZHRNaW4uaU1vbnRoOw0KKyAgaURheSA9IG1fZHRNaW4uaURheTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGV0xfTW9udGhDYWxlbmRhckltcDo6U2V0TWluRGF0ZShpbnQzMl90IGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaURheSkgew0KKyAgbV9kdE1pbiA9IERBVEUoaVllYXIsIGlNb250aCwgaURheSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkdldE1heERhdGUoaW50MzJfdCYgaVllYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlEYXkpIHsNCisgIGlZZWFyID0gbV9kdE1heC5pWWVhcjsNCisgIGlNb250aCA9IG1fZHRNYXguaU1vbnRoOw0KKyAgaURheSA9IG1fZHRNYXguaURheTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGV0xfTW9udGhDYWxlbmRhckltcDo6U2V0TWF4RGF0ZShpbnQzMl90IGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaURheSkgew0KKyAgbV9kdE1heCA9IERBVEUoaVllYXIsIGlNb250aCwgaURheSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkluaXREYXRlKCkgew0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcikgew0KKyAgICBJRldMX01vbnRoQ2FsZW5kYXJEUCogcERhdGVQcm92ID0NCisgICAgICAgIHN0YXRpY19jYXN0PElGV0xfTW9udGhDYWxlbmRhckRQKj4obV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgICAgbV9pWWVhciA9IHBEYXRlUHJvdi0+R2V0Q3VyWWVhcihtX3BJbnRlcmZhY2UpOw0KKyAgICBtX2lNb250aCA9IHBEYXRlUHJvdi0+R2V0Q3VyTW9udGgobV9wSW50ZXJmYWNlKTsNCisgICAgbV9pRGF5ID0gcERhdGVQcm92LT5HZXRDdXJEYXkobV9wSW50ZXJmYWNlKTsNCisgICAgbV9pQ3VyWWVhciA9IG1faVllYXI7DQorICAgIG1faUN1ck1vbnRoID0gbV9pTW9udGg7DQorICB9IGVsc2Ugew0KKyAgICBtX2lEYXkgPSAxOw0KKyAgICBtX2lNb250aCA9IDE7DQorICAgIG1faVllYXIgPSAxOw0KKyAgICBtX2lDdXJZZWFyID0gbV9pWWVhcjsNCisgICAgbV9pQ3VyTW9udGggPSBtX2lNb250aDsNCisgIH0NCisgIEdldFRvZGF5VGV4dChtX2lZZWFyLCBtX2lNb250aCwgbV9pRGF5LCBtX3dzVG9kYXkpOw0KKyAgR2V0SGVhZFRleHQobV9pQ3VyWWVhciwgbV9pQ3VyTW9udGgsIG1fd3NIZWFkKTsNCisgIG1fZHRNaW4gPSBEQVRFKDE1MDAsIDEyLCAxKTsNCisgIG1fZHRNYXggPSBEQVRFKDIyMDAsIDEsIDEpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpDbGVhckRhdGVJdGVtKCkgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX2FyckRhdGVzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIExQREFURUlORk8gcERhdGEgPSAoTFBEQVRFSU5GTyltX2FyckRhdGVzLkdldEF0KGkpOw0KKyAgICBkZWxldGUgcERhdGE7DQorICB9DQorICBtX2FyckRhdGVzLlJlbW92ZUFsbCgpOw0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6UmVTZXREYXRlSXRlbSgpIHsNCisgIG1fcERhdGVUaW1lLT5TZXQobV9pQ3VyWWVhciwgbV9pQ3VyTW9udGgsIDEpOw0KKyAgaW50MzJfdCBpRGF5cyA9IEZYX0RheXNJbk1vbnRoKG1faUN1clllYXIsIG1faUN1ck1vbnRoKTsNCisgIGludDMyX3QgaURheU9mV2VlayA9IG1fcERhdGVUaW1lLT5HZXREYXlPZldlZWsoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlEYXlzOyBpKyspIHsNCisgICAgaWYgKGlEYXlPZldlZWsgPj0gNykgew0KKyAgICAgIGlEYXlPZldlZWsgPSAwOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRGF5Ow0KKyAgICB3c0RheS5Gb3JtYXQoTCIlZCIsIGkgKyAxKTsNCisgICAgRlhfRFdPUkQgZHdTdGF0ZXMgPSAwOw0KKyAgICBpZiAobV9pWWVhciA9PSBtX2lDdXJZZWFyICYmIG1faU1vbnRoID09IG1faUN1ck1vbnRoICYmIG1faURheSA9PSAoaSArIDEpKSB7DQorICAgICAgZHdTdGF0ZXMgfD0gRldMX0lURU1TVEFURV9NQ0RfRmxhZzsNCisgICAgfQ0KKyAgICBpZiAobV9hcnJTZWxEYXlzLkZpbmQoaSArIDEpICE9IC0xKSB7DQorICAgICAgZHdTdGF0ZXMgfD0gRldMX0lURU1TVEFURV9NQ0RfU2VsZWN0ZWQ7DQorICAgIH0NCisgICAgQ0ZYX1JlY3RGIHJ0RGF0ZTsNCisgICAgcnREYXRlLlNldCgwLCAwLCAwLCAwKTsNCisgICAgTFBEQVRFSU5GTyBwRGF0YSA9IG5ldyBEQVRFSU5GTyhpICsgMSwgaURheU9mV2VlaywgZHdTdGF0ZXMsIHJ0RGF0ZSwgd3NEYXkpOw0KKyAgICBtX2FyckRhdGVzLkFkZChwRGF0YSk7DQorICAgIGlEYXlPZldlZWsrKzsNCisgIH0NCit9DQorRlhfQk9PTCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6Ok5leHRNb250aCgpIHsNCisgIGludDMyX3QgaVllYXIgPSBtX2lDdXJZZWFyLCBpTW9udGggPSBtX2lDdXJNb250aDsNCisgIGlmIChpTW9udGggPj0gMTIpIHsNCisgICAgaU1vbnRoID0gMTsNCisgICAgaVllYXIrKzsNCisgIH0gZWxzZSB7DQorICAgIGlNb250aCsrOw0KKyAgfQ0KKyAgREFURSBkdChtX2lDdXJZZWFyLCBtX2lDdXJNb250aCwgMSk7DQorICBpZiAoIShkdCA8IG1fZHRNYXgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIG1faUN1clllYXIgPSBpWWVhciwgbV9pQ3VyTW9udGggPSBpTW9udGg7DQorICBDaGFuZ2VUb01vbnRoKG1faUN1clllYXIsIG1faUN1ck1vbnRoKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGV0xfTW9udGhDYWxlbmRhckltcDo6UHJldk1vbnRoKCkgew0KKyAgaW50MzJfdCBpWWVhciA9IG1faUN1clllYXIsIGlNb250aCA9IG1faUN1ck1vbnRoOw0KKyAgaWYgKGlNb250aCA8PSAxKSB7DQorICAgIGlNb250aCA9IDEyOw0KKyAgICBpWWVhci0tOw0KKyAgfSBlbHNlIHsNCisgICAgaU1vbnRoLS07DQorICB9DQorICBEQVRFIGR0KG1faUN1clllYXIsIG1faUN1ck1vbnRoLCAxKTsNCisgIGlmICghKGR0ID4gbV9kdE1pbikpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9pQ3VyWWVhciA9IGlZZWFyLCBtX2lDdXJNb250aCA9IGlNb250aDsNCisgIENoYW5nZVRvTW9udGgobV9pQ3VyWWVhciwgbV9pQ3VyTW9udGgpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpDaGFuZ2VUb01vbnRoKGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoKSB7DQorICBtX2lDdXJZZWFyID0gaVllYXI7DQorICBtX2lDdXJNb250aCA9IGlNb250aDsNCisgIG1faUhvdmVyZWQgPSAtMTsNCisgIENsZWFyRGF0ZUl0ZW0oKTsNCisgIFJlU2V0RGF0ZUl0ZW0oKTsNCisgIENhbERhdGVJdGVtKCk7DQorICBHZXRIZWFkVGV4dChtX2lDdXJZZWFyLCBtX2lDdXJNb250aCwgbV93c0hlYWQpOw0KK30NCitGWF9CT09MIENGV0xfTW9udGhDYWxlbmRhckltcDo6UmVtb3ZlU2VsRGF5KGludDMyX3QgaURheSwgRlhfQk9PTCBiQWxsKSB7DQorICBpZiAoaURheSA9PSAtMSAmJiAhYkFsbCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoYkFsbCkgew0KKyAgICBpbnQzMl90IGlDb3VudCA9IG1fYXJyU2VsRGF5cy5HZXRTaXplKCk7DQorICAgIGludDMyX3QgaURhdGVzQ291bnQgPSBtX2FyckRhdGVzLkdldFNpemUoKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICBpbnQzMl90IGlTZWxEYXkgPSBtX2FyclNlbERheXMuR2V0QXQoaSk7DQorICAgICAgaWYgKGlTZWxEYXkgPD0gaURhdGVzQ291bnQpIHsNCisgICAgICAgIExQREFURUlORk8gcERhdGVJbmZvID0gKExQREFURUlORk8pbV9hcnJEYXRlcy5HZXRBdChpU2VsRGF5IC0gMSk7DQorICAgICAgICBwRGF0ZUluZm8tPmR3U3RhdGVzICY9IH5GV0xfSVRFTVNUQVRFX01DRF9TZWxlY3RlZDsNCisgICAgICB9DQorICAgIH0NCisgICAgbV9hcnJTZWxEYXlzLlJlbW92ZUFsbCgpOw0KKyAgfSBlbHNlIHsNCisgICAgaW50MzJfdCBpbmRleCA9IG1fYXJyU2VsRGF5cy5GaW5kKGlEYXkpOw0KKyAgICBpZiAoaW5kZXggPT0gLTEpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaW50MzJfdCBpU2VsRGF5ID0gbV9hcnJTZWxEYXlzLkdldEF0KGlEYXkpOw0KKyAgICBpbnQzMl90IGlEYXRlc0NvdW50ID0gbV9hcnJEYXRlcy5HZXRTaXplKCk7DQorICAgIGlmIChpU2VsRGF5IDw9IGlEYXRlc0NvdW50KSB7DQorICAgICAgTFBEQVRFSU5GTyBwRGF0ZUluZm8gPSAoTFBEQVRFSU5GTyltX2FyckRhdGVzLkdldEF0KGlTZWxEYXkgLSAxKTsNCisgICAgICBwRGF0ZUluZm8tPmR3U3RhdGVzICY9IH5GV0xfSVRFTVNUQVRFX01DRF9TZWxlY3RlZDsNCisgICAgfQ0KKyAgICBtX2FyclNlbERheXMuUmVtb3ZlQXQoaW5kZXgpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpBZGRTZWxEYXkoaW50MzJfdCBpRGF5KSB7DQorICBGWFNZU19hc3NlcnQoaURheSA+IDApOw0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTUNEX011bHRpU2VsZWN0KSB7DQorICB9IGVsc2Ugew0KKyAgICBpZiAobV9hcnJTZWxEYXlzLkZpbmQoaURheSkgPT0gLTEpIHsNCisgICAgICBSZW1vdmVTZWxEYXkoLTEsIFRSVUUpOw0KKyAgICAgIGlmIChpRGF5IDw9IG1fYXJyRGF0ZXMuR2V0U2l6ZSgpKSB7DQorICAgICAgICBMUERBVEVJTkZPIHBEYXRlSW5mbyA9IChMUERBVEVJTkZPKW1fYXJyRGF0ZXMuR2V0QXQoaURheSAtIDEpOw0KKyAgICAgICAgcERhdGVJbmZvLT5kd1N0YXRlcyB8PSBGV0xfSVRFTVNUQVRFX01DRF9TZWxlY3RlZDsNCisgICAgICB9DQorICAgICAgbV9hcnJTZWxEYXlzLkFkZChpRGF5KTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpKdW1wVG9Ub2RheSgpIHsNCisgIGlmIChtX2lZZWFyICE9IG1faUN1clllYXIgfHwgbV9pTW9udGggIT0gbV9pQ3VyTW9udGgpIHsNCisgICAgbV9pQ3VyWWVhciA9IG1faVllYXI7DQorICAgIG1faUN1ck1vbnRoID0gbV9pTW9udGg7DQorICAgIENoYW5nZVRvTW9udGgobV9pWWVhciwgbV9pTW9udGgpOw0KKyAgICBBZGRTZWxEYXkobV9pRGF5KTsNCisgIH0gZWxzZSB7DQorICAgIGlmIChtX2FyclNlbERheXMuRmluZChtX2lEYXkpID09IC0xKSB7DQorICAgICAgQWRkU2VsRGF5KG1faURheSk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcDo6R2V0SGVhZFRleHQoaW50MzJfdCBpWWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0hlYWQpIHsNCisgIEZYU1lTX2Fzc2VydChpTW9udGggPiAwICYmIGlNb250aCA8IDEzKTsNCisgIHN0YXRpYyBjb25zdCBGWF9XQ0hBUiogY29uc3QgcE1vbnRoW10gPSB7DQorICAgICAgTCJKYW51YXJ5IiwgICBMIkZlYnJ1YXJ5IiwgTCJNYXJjaCIsICAgIEwiQXByaWwiLA0KKyAgICAgIEwiTWF5IiwgICAgICAgTCJKdW5lIiwgICAgIEwiSnVseSIsICAgICBMIkF1Z3VzdCIsDQorICAgICAgTCJTZXB0ZW1iZXIiLCBMIk9jdG9iZXIiLCAgTCJOb3ZlbWJlciIsIEwiRGVjZW1iZXIifTsNCisgIHdzSGVhZC5Gb3JtYXQoTCIlcywgJWQiLCBwTW9udGhbaU1vbnRoIC0gMV0sIGlZZWFyKTsNCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXA6OkdldFRvZGF5VGV4dChpbnQzMl90IGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NUb2RheSkgew0KKyAgd3NUb2RheS5Gb3JtYXQoTCIsICVkLyVkLyVkIiwgaURheSwgaU1vbnRoLCBpWWVhcik7DQorfQ0KK2ludDMyX3QgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpHZXREYXlBdFBvaW50KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpIHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9hcnJEYXRlcy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBMUERBVEVJTkZPIHBEYXRlSW5mbyA9IChMUERBVEVJTkZPKW1fYXJyRGF0ZXMuR2V0QXQoaSk7DQorICAgIGlmIChwRGF0ZUluZm8tPnJlY3QuQ29udGFpbnMoeCwgeSkpIHsNCisgICAgICByZXR1cm4gKytpOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gLTE7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFySW1wOjpHZXREYXlSZWN0KGludDMyX3QgaURheSwgQ0ZYX1JlY3RGJiBydERheSkgew0KKyAgaWYgKGlEYXkgPD0gMCB8fCBpRGF5ID4gbV9hcnJEYXRlcy5HZXRTaXplKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgTFBEQVRFSU5GTyBwRGF0ZUluZm8gPSAoTFBEQVRFSU5GTyltX2FyckRhdGVzW2lEYXkgLSAxXTsNCisgIGlmICghcERhdGVJbmZvKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBydERheSA9IHBEYXRlSW5mby0+cmVjdDsNCisgIHJldHVybiBUUlVFOw0KK30NCitDRldMX01vbnRoQ2FsZW5kYXJJbXBEZWxlZ2F0ZTo6Q0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGUoDQorICAgIENGV0xfTW9udGhDYWxlbmRhckltcCogcE93bmVyKQ0KKyAgICA6IG1fcE93bmVyKHBPd25lcikge30NCitpbnQzMl90IENGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKA0KKyAgICBDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7DQorICBpZiAoIXBNZXNzYWdlKQ0KKyAgICByZXR1cm4gMDsNCisgIEZYX0RXT1JEIGR3TXNnQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQorICBpbnQzMl90IGlSZXQgPSAxOw0KKyAgc3dpdGNoIChkd01zZ0NvZGUpIHsNCisgICAgY2FzZSBGV0xfTVNHSEFTSF9TZXRGb2N1czoNCisgICAgY2FzZSBGV0xfTVNHSEFTSF9LaWxsRm9jdXM6IHsNCisgICAgICBPbkZvY3VzQ2hhbmdlZChwTWVzc2FnZSwgZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX1NldEZvY3VzKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX0tleTogew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01TR0hBU0hfTW91c2U6IHsNCisgICAgICBDRldMX01zZ01vdXNlKiBwTW91c2UgPSBzdGF0aWNfY2FzdDxDRldMX01zZ01vdXNlKj4ocE1lc3NhZ2UpOw0KKyAgICAgIEZYX0RXT1JEIGR3Q21kID0gcE1vdXNlLT5tX2R3Q21kOw0KKyAgICAgIHN3aXRjaCAoZHdDbWQpIHsNCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duOiB7DQorICAgICAgICAgIE9uTEJ1dHRvbkRvd24ocE1vdXNlKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA6IHsNCisgICAgICAgICAgT25MQnV0dG9uVXAocE1vdXNlKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZU1vdmU6IHsNCisgICAgICAgICAgT25Nb3VzZU1vdmUocE1vdXNlKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlOiB7DQorICAgICAgICAgIE9uTW91c2VMZWF2ZShwTW91c2UpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6IHsgYnJlYWs7IH0NCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZGVmYXVsdDogew0KKyAgICAgIGlSZXQgPSAwOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBDRldMX1dpZGdldEltcERlbGVnYXRlOjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCisgIHJldHVybiBpUmV0Ow0KK30NCitGV0xfRVJSIENGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIHJldHVybiBtX3BPd25lci0+RHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlOjpPbkFjdGl2YXRlKENGV0xfTWVzc2FnZSogcE1zZykgew0KKyAgcmV0dXJuOw0KK30NCit2b2lkIENGV0xfTW9udGhDYWxlbmRhckltcERlbGVnYXRlOjpPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UqIHBNc2csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0KSB7DQorICBpZiAoYlNldCkgew0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfV0dUU1RBVEVfRm9jdXNlZDsNCisgIH0gZWxzZSB7DQorICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfV0dUU1RBVEVfRm9jdXNlZDsNCisgIH0NCisgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGU6Ok9uTEJ1dHRvbkRvd24oQ0ZXTF9Nc2dNb3VzZSogcE1zZykgew0KKyAgaWYgKG1fcE93bmVyLT5tX3J0TEJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICBtX3BPd25lci0+bV9pTEJ0blBhcnRTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX01DRF9QcmVzc2VkOw0KKyAgICBtX3BPd25lci0+UHJldk1vbnRoKCk7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX3J0UkJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICBtX3BPd25lci0+bV9pUkJ0blBhcnRTdGF0ZXMgfD0gRldMX1BBUlRTVEFURV9NQ0RfUHJlc3NlZDsNCisgICAgbV9wT3duZXItPk5leHRNb250aCgpOw0KKyAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KKyAgfSBlbHNlIGlmIChtX3BPd25lci0+bV9ydFRvZGF5LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgIGlmICgobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTUNEX05vVG9kYXkpID09DQorICAgICAgICAwKSB7DQorICAgICAgbV9wT3duZXItPkp1bXBUb1RvZGF5KCk7DQorICAgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgaWYgKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX01DRF9NdWx0aVNlbGVjdCkgew0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGludDMyX3QgaU9sZFNlbCA9IDA7DQorICAgICAgaWYgKG1fcE93bmVyLT5tX2FyclNlbERheXMuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgaU9sZFNlbCA9IG1fcE93bmVyLT5tX2FyclNlbERheXNbMF07DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgICAgaW50MzJfdCBpQ3VyU2VsID0gbV9wT3duZXItPkdldERheUF0UG9pbnQocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICAgICAgRlhfQk9PTCBiU2VsQ2hhbmdlZCA9IGlDdXJTZWwgPiAwICYmIGlDdXJTZWwgIT0gaU9sZFNlbDsNCisgICAgICBpZiAoYlNlbENoYW5nZWQpIHsNCisgICAgICAgIExQREFURUlORk8gbHBEYXRlc0luZm8gPQ0KKyAgICAgICAgICAgIChMUERBVEVJTkZPKW1fcE93bmVyLT5tX2FyckRhdGVzLkdldEF0KGlDdXJTZWwgLSAxKTsNCisgICAgICAgIENGWF9SZWN0RiBydEludmFsaWRhdGUobHBEYXRlc0luZm8tPnJlY3QpOw0KKyAgICAgICAgaWYgKGlPbGRTZWwgPiAwKSB7DQorICAgICAgICAgIGxwRGF0ZXNJbmZvID0gKExQREFURUlORk8pbV9wT3duZXItPm1fYXJyRGF0ZXMuR2V0QXQoaU9sZFNlbCAtIDEpOw0KKyAgICAgICAgICBydEludmFsaWRhdGUuVW5pb24obHBEYXRlc0luZm8tPnJlY3QpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wT3duZXItPkFkZFNlbERheShpQ3VyU2VsKTsNCisgICAgICAgIENGV0xfRXZ0Q2xpY2sgd21DbGljazsNCisgICAgICAgIHdtQ2xpY2subV9wU3JjVGFyZ2V0ID0gbV9wT3duZXItPm1fcEludGVyZmFjZTsNCisgICAgICAgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZ3bUNsaWNrKTsNCisgICAgICAgIENGV0xfRXZlbnRNY2REYXRlQ2hhbmdlZCB3bURhdGVTZWxlY3RlZDsNCisgICAgICAgIHdtRGF0ZVNlbGVjdGVkLm1faVN0YXJ0RGF5ID0gaUN1clNlbDsNCisgICAgICAgIHdtRGF0ZVNlbGVjdGVkLm1faUVuZERheSA9IGlDdXJTZWw7DQorICAgICAgICB3bURhdGVTZWxlY3RlZC5tX2lPbGRNb250aCA9IG1fcE93bmVyLT5tX2lDdXJNb250aDsNCisgICAgICAgIHdtRGF0ZVNlbGVjdGVkLm1faU9sZFllYXIgPSBtX3BPd25lci0+bV9pQ3VyWWVhcjsNCisgICAgICAgIHdtRGF0ZVNlbGVjdGVkLm1fcFNyY1RhcmdldCA9IG1fcE93bmVyLT5tX3BJbnRlcmZhY2U7DQorICAgICAgICBtX3BPd25lci0+RGlzcGF0Y2hFdmVudCgmd21EYXRlU2VsZWN0ZWQpOw0KKyAgICAgICAgbV9wT3duZXItPlJlcGFpbnQoJnJ0SW52YWxpZGF0ZSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGU6Ok9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmIChtX3BPd25lci0+bV9ydExCdG4uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgbV9wT3duZXItPm1faUxCdG5QYXJ0U3RhdGVzID0gMDsNCisgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0TEJ0bik7DQorICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX3J0UkJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICBtX3BPd25lci0+bV9pUkJ0blBhcnRTdGF0ZXMgPSAwOw0KKyAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRSQnRuKTsNCisgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fcnREYXRlcy5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICBpbnQzMl90IGlEYXkgPSBtX3BPd25lci0+R2V0RGF5QXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgICAgaWYgKGlEYXkgIT0gLTEpIHsNCisgICAgICBtX3BPd25lci0+QWRkU2VsRGF5KGlEYXkpOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGU6Ok9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9NQ0RfTXVsdGlTZWxlY3QpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfQk9PTCBiUmVwYWludCA9IEZBTFNFOw0KKyAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZTsNCisgIHJ0SW52YWxpZGF0ZS5TZXQoMCwgMCwgMCwgMCk7DQorICBpZiAobV9wT3duZXItPm1fcnREYXRlcy5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICBpbnQzMl90IGlIb3ZlciA9IG1fcE93bmVyLT5HZXREYXlBdFBvaW50KHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgICBiUmVwYWludCA9IG1fcE93bmVyLT5tX2lIb3ZlcmVkICE9IGlIb3ZlcjsNCisgICAgaWYgKGJSZXBhaW50KSB7DQorICAgICAgaWYgKG1fcE93bmVyLT5tX2lIb3ZlcmVkID4gMCkgew0KKyAgICAgICAgbV9wT3duZXItPkdldERheVJlY3QobV9wT3duZXItPm1faUhvdmVyZWQsIHJ0SW52YWxpZGF0ZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChpSG92ZXIgPiAwKSB7DQorICAgICAgICBDRlhfUmVjdEYgcnREYXk7DQorICAgICAgICBtX3BPd25lci0+R2V0RGF5UmVjdChpSG92ZXIsIHJ0RGF5KTsNCisgICAgICAgIGlmIChydEludmFsaWRhdGUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIHJ0SW52YWxpZGF0ZSA9IHJ0RGF5Ow0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcnRJbnZhbGlkYXRlLlVuaW9uKHJ0RGF5KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgbV9wT3duZXItPm1faUhvdmVyZWQgPSBpSG92ZXI7DQorICB9IGVsc2Ugew0KKyAgICBiUmVwYWludCA9IG1fcE93bmVyLT5tX2lIb3ZlcmVkID4gMDsNCisgICAgaWYgKGJSZXBhaW50KSB7DQorICAgICAgbV9wT3duZXItPkdldERheVJlY3QobV9wT3duZXItPm1faUhvdmVyZWQsIHJ0SW52YWxpZGF0ZSk7DQorICAgIH0NCisgICAgbV9wT3duZXItPm1faUhvdmVyZWQgPSAtMTsNCisgIH0NCisgIGlmIChiUmVwYWludCAmJiAhcnRJbnZhbGlkYXRlLklzRW1wdHkoKSkgew0KKyAgICBtX3BPd25lci0+UmVwYWludCgmcnRJbnZhbGlkYXRlKTsNCisgIH0NCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJJbXBEZWxlZ2F0ZTo6T25Nb3VzZUxlYXZlKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmIChtX3BPd25lci0+bV9pSG92ZXJlZCA+IDApIHsNCisgICAgQ0ZYX1JlY3RGIHJ0SW52YWxpZGF0ZTsNCisgICAgcnRJbnZhbGlkYXRlLlNldCgwLCAwLCAwLCAwKTsNCisgICAgbV9wT3duZXItPkdldERheVJlY3QobV9wT3duZXItPm1faUhvdmVyZWQsIHJ0SW52YWxpZGF0ZSk7DQorICAgIG1fcE93bmVyLT5tX2lIb3ZlcmVkID0gLTE7DQorICAgIGlmICghcnRJbnZhbGlkYXRlLklzRW1wdHkoKSkgew0KKyAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZydEludmFsaWRhdGUpOw0KKyAgICB9DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9waWN0dXJlYm94aW1wLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9waWN0dXJlYm94aW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTY3ZmM1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3BpY3R1cmVib3hpbXAuY3BwCkBAIC0wLDAgKzEsMTUwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3RhcmdldGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9ub3RlaW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3dpZGdldGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9waWN0dXJlYm94aW1wLmgiDQorDQorLy8gc3RhdGljDQorSUZXTF9QaWN0dXJlQm94KiBJRldMX1BpY3R1cmVCb3g6OkNyZWF0ZSgNCisgICAgY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICBJRldMX1dpZGdldCogcE91dGVyKSB7DQorICBJRldMX1BpY3R1cmVCb3gqIHBQaWN0dXJlQm94ID0gbmV3IElGV0xfUGljdHVyZUJveDsNCisgIENGV0xfUGljdHVyZUJveEltcCogcFBpY3R1cmVCb3hJbXBsID0NCisgICAgICBuZXcgQ0ZXTF9QaWN0dXJlQm94SW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQorICBwUGljdHVyZUJveC0+U2V0SW1wbChwUGljdHVyZUJveEltcGwpOw0KKyAgcFBpY3R1cmVCb3hJbXBsLT5TZXRJbnRlcmZhY2UocFBpY3R1cmVCb3gpOw0KKyAgcmV0dXJuIHBQaWN0dXJlQm94Ow0KK30NCitJRldMX1BpY3R1cmVCb3g6OklGV0xfUGljdHVyZUJveCgpIHt9DQorDQorQ0ZXTF9QaWN0dXJlQm94SW1wOjpDRldMX1BpY3R1cmVCb3hJbXAoDQorICAgIGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikNCisgICAgOiBDRldMX1dpZGdldEltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpLA0KKyAgICAgIG1fYlRvcChGQUxTRSksDQorICAgICAgbV9iVkNlbnRlcihGQUxTRSksDQorICAgICAgbV9iQnV0dG9uKEZBTFNFKSB7DQorICBtX3J0Q2xpZW50LlJlc2V0KCk7DQorICBtX3J0SW1hZ2UuUmVzZXQoKTsNCisgIG1fbWF0cml4LlNldElkZW50aXR5KCk7DQorfQ0KK0NGV0xfUGljdHVyZUJveEltcDo6fkNGV0xfUGljdHVyZUJveEltcCgpIHt9DQorRldMX0VSUiBDRldMX1BpY3R1cmVCb3hJbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Qgew0KKyAgd3NDbGFzcyA9IEZXTF9DTEFTU19QaWN0dXJlQm94Ow0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9EV09SRCBDRldMX1BpY3R1cmVCb3hJbXA6OkdldENsYXNzSUQoKSBjb25zdCB7DQorICByZXR1cm4gRldMX0NMQVNTSEFTSF9QaWN0dXJlQm94Ow0KK30NCitGV0xfRVJSIENGV0xfUGljdHVyZUJveEltcDo6SW5pdGlhbGl6ZSgpIHsNCisgIGlmIChDRldMX1dpZGdldEltcDo6SW5pdGlhbGl6ZSgpICE9IEZXTF9FUlJfU3VjY2VlZGVkKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgbV9wRGVsZWdhdGUgPSBuZXcgQ0ZXTF9QaWN0dXJlQm94SW1wRGVsZWdhdGUodGhpcyk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9QaWN0dXJlQm94SW1wOjpGaW5hbGl6ZSgpIHsNCisgIGRlbGV0ZSBtX3BEZWxlZ2F0ZTsNCisgIG1fcERlbGVnYXRlID0gbnVsbHB0cjsNCisgIHJldHVybiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKTsNCit9DQorRldMX0VSUiBDRldMX1BpY3R1cmVCb3hJbXA6OkdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSkgew0KKyAgaWYgKGJBdXRvU2l6ZSkgew0KKyAgICByZWN0LlNldCgwLCAwLCAwLCAwKTsNCisgICAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpDQorICAgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0NCisgICAgICAgIHN0YXRpY19jYXN0PElGV0xfUGljdHVyZUJveERQKj4obV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKQ0KKyAgICAgICAgICAgIC0+R2V0UGljdHVyZShtX3BJbnRlcmZhY2UpOw0KKyAgICBpZiAocEJpdG1hcCkgew0KKyAgICAgIHJlY3QuU2V0KDAsIDAsIChGWF9GTE9BVClwQml0bWFwLT5HZXRXaWR0aCgpLA0KKyAgICAgICAgICAgICAgIChGWF9GTE9BVClwQml0bWFwLT5HZXRIZWlnaHQoKSk7DQorICAgIH0NCisgICAgQ0ZXTF9XaWRnZXRJbXA6OkdldFdpZGdldFJlY3QocmVjdCwgVFJVRSk7DQorICB9IGVsc2Ugew0KKyAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1BpY3R1cmVCb3hJbXA6OlVwZGF0ZSgpIHsNCisgIGlmIChJc0xvY2tlZCgpKSB7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIH0NCisgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikgew0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCisgIH0NCisgIEdldENsaWVudFJlY3QobV9ydENsaWVudCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9QaWN0dXJlQm94SW1wOjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIGlmICghcEdyYXBoaWNzKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KKyAgaWYgKEhhc0JvcmRlcigpKSB7DQorICAgIERyYXdCb3JkZXIocEdyYXBoaWNzLCBGV0xfUEFSVF9QVEJfQm9yZGVyLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgaWYgKEhhc0VkZ2UoKSkgew0KKyAgICBEcmF3RWRnZShwR3JhcGhpY3MsIEZXTF9QQVJUX1BUQl9FZGdlLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgRHJhd0JrZ3JvdW5kKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQordm9pZCBDRldMX1BpY3R1cmVCb3hJbXA6OkRyYXdCa2dyb3VuZChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgSUZXTF9QaWN0dXJlQm94RFAqIHBQaWN0dXJlRFAgPQ0KKyAgICAgIHN0YXRpY19jYXN0PElGV0xfUGljdHVyZUJveERQKj4obV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgIGlmICghcFBpY3R1cmVEUCkNCisgICAgcmV0dXJuOw0KKw0KKyAgQ0ZYX0RJQml0bWFwKiBwUGljdHVyZSA9IHBQaWN0dXJlRFAtPkdldFBpY3R1cmUobV9wSW50ZXJmYWNlKTsNCisgIENGWF9NYXRyaXggbWF0cml4Ow0KKyAgcFBpY3R1cmVEUC0+R2V0TWF0cml4KG1fcEludGVyZmFjZSwgbWF0cml4KTsNCisgIGlmICghcFBpY3R1cmUpDQorICAgIHJldHVybjsNCisNCisgIG1hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgRlhfRkxPQVQgZnggPSAoRlhfRkxPQVQpcFBpY3R1cmUtPkdldFdpZHRoKCk7DQorICBGWF9GTE9BVCBmeSA9IChGWF9GTE9BVClwUGljdHVyZS0+R2V0SGVpZ2h0KCk7DQorICBpZiAoZnggPiBtX3J0Q2xpZW50LndpZHRoKSB7DQorICAgIGZ4ID0gbV9ydENsaWVudC53aWR0aDsNCisgIH0NCisgIGlmIChmeSA+IG1fcnRDbGllbnQuaGVpZ2h0KSB7DQorICAgIGZ5ID0gbV9ydENsaWVudC5oZWlnaHQ7DQorICB9DQorICBDRlhfUG9pbnRGIHB0Ow0KKyAgcHQuU2V0KChtX3J0Q2xpZW50LndpZHRoIC0gZngpIC8gMiwgKG1fcnRDbGllbnQuaGVpZ2h0IC0gZnkpIC8gMik7DQorICBwR3JhcGhpY3MtPkRyYXdJbWFnZShwUGljdHVyZSwgcHQsICZtYXRyaXgpOw0KK30NCitGWF9CT09MIENGV0xfUGljdHVyZUJveEltcDo6VlN0eWxlKEZYX0JPT0wgZHdTdHlsZSkgew0KKyAgc3dpdGNoIChkd1N0eWxlICYgRldMX1NUWUxFRVhUX1BUQl9WQWxpZ25NYXNrKSB7DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX1BUQl9Ub3A6IHsNCisgICAgICByZXR1cm4gbV9iVG9wID0gVFJVRTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9QVEJfVmNlbnRlcjogew0KKyAgICAgIHJldHVybiBtX2JWQ2VudGVyID0gVFJVRTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9QVEJfQm90dG9tOiB7DQorICAgICAgcmV0dXJuIG1fYkJ1dHRvbiA9IFRSVUU7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorQ0ZXTF9QaWN0dXJlQm94SW1wRGVsZWdhdGU6OkNGV0xfUGljdHVyZUJveEltcERlbGVnYXRlKA0KKyAgICBDRldMX1BpY3R1cmVCb3hJbXAqIHBPd25lcikNCisgICAgOiBtX3BPd25lcihwT3duZXIpIHt9DQorRldMX0VSUiBDRldMX1BpY3R1cmVCb3hJbXBEZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICByZXR1cm4gbV9wT3duZXItPkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3B1c2hidXR0b25pbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3B1c2hidXR0b25pbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MzQ2ZWEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfcHVzaGJ1dHRvbmltcC5jcHAKQEAgLTAsMCArMSw1NDkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX25vdGVpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0aW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3B1c2hidXR0b25pbXAuaCINCisNCisvLyBzdGF0aWMNCitJRldMX1B1c2hCdXR0b24qIElGV0xfUHVzaEJ1dHRvbjo6Q3JlYXRlKA0KKyAgICBjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpIHsNCisgIElGV0xfUHVzaEJ1dHRvbiogcFB1c2hCdXR0b24gPSBuZXcgSUZXTF9QdXNoQnV0dG9uOw0KKyAgQ0ZXTF9QdXNoQnV0dG9uSW1wKiBwUHVzaEJ1dHRvbkltcGwgPQ0KKyAgICAgIG5ldyBDRldMX1B1c2hCdXR0b25JbXAocHJvcGVydGllcywgcE91dGVyKTsNCisgIHBQdXNoQnV0dG9uLT5TZXRJbXBsKHBQdXNoQnV0dG9uSW1wbCk7DQorICBwUHVzaEJ1dHRvbkltcGwtPlNldEludGVyZmFjZShwUHVzaEJ1dHRvbik7DQorICByZXR1cm4gcFB1c2hCdXR0b247DQorfQ0KK0lGV0xfUHVzaEJ1dHRvbjo6SUZXTF9QdXNoQnV0dG9uKCkgew0KK30NCisNCitDRldMX1B1c2hCdXR0b25JbXA6OkNGV0xfUHVzaEJ1dHRvbkltcCgNCisgICAgY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICBJRldMX1dpZGdldCogcE91dGVyKQ0KKyAgICA6IENGV0xfV2lkZ2V0SW1wKHByb3BlcnRpZXMsIHBPdXRlciksDQorICAgICAgbV9iQnRuRG93bihGQUxTRSksDQorICAgICAgbV9kd1RUT1N0eWxlcyhGREVfVFRPU1RZTEVfU2luZ2xlTGluZSksDQorICAgICAgbV9pVFRPQWxpZ24oRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXIpIHsNCisgIG1fcnRDbGllbnQuU2V0KDAsIDAsIDAsIDApOw0KKyAgbV9ydENhcHRpb24uU2V0KDAsIDAsIDAsIDApOw0KK30NCitDRldMX1B1c2hCdXR0b25JbXA6On5DRldMX1B1c2hCdXR0b25JbXAoKSB7fQ0KK0ZXTF9FUlIgQ0ZXTF9QdXNoQnV0dG9uSW1wOjpHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2xhc3MpIGNvbnN0IHsNCisgIHdzQ2xhc3MgPSBGV0xfQ0xBU1NfUHVzaEJ1dHRvbjsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9QdXNoQnV0dG9uSW1wOjpHZXRDbGFzc0lEKCkgY29uc3Qgew0KKyAgcmV0dXJuIEZXTF9DTEFTU0hBU0hfUHVzaEJ1dHRvbjsNCit9DQorRldMX0VSUiBDRldMX1B1c2hCdXR0b25JbXA6OkluaXRpYWxpemUoKSB7DQorICBpZiAoQ0ZXTF9XaWRnZXRJbXA6OkluaXRpYWxpemUoKSAhPSBGV0xfRVJSX1N1Y2NlZWRlZCkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIG1fcERlbGVnYXRlID0gbmV3IENGV0xfUHVzaEJ1dHRvbkltcERlbGVnYXRlKHRoaXMpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfUHVzaEJ1dHRvbkltcDo6RmluYWxpemUoKSB7DQorICBkZWxldGUgbV9wRGVsZWdhdGU7DQorICBtX3BEZWxlZ2F0ZSA9IG51bGxwdHI7DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OkZpbmFsaXplKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9QdXNoQnV0dG9uSW1wOjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUpIHsNCisgIGlmIChiQXV0b1NpemUpIHsNCisgICAgcmVjdC5TZXQoMCwgMCwgMCwgMCk7DQorICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID09IE5VTEwpIHsNCisgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0NhcHRpb247DQorICAgIElGV0xfUHVzaEJ1dHRvbkRQKiBwRGF0YSA9DQorICAgICAgICBzdGF0aWNfY2FzdDxJRldMX1B1c2hCdXR0b25EUCo+KG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQorICAgIGlmIChwRGF0YSkgew0KKyAgICAgIHBEYXRhLT5HZXRDYXB0aW9uKG1fcEludGVyZmFjZSwgd3NDYXB0aW9uKTsNCisgICAgfQ0KKyAgICBpbnQzMl90IGlMZW4gPSB3c0NhcHRpb24uR2V0TGVuZ3RoKCk7DQorICAgIGlmIChpTGVuID4gMCkgew0KKyAgICAgIENGWF9TaXplRiBzeiA9IENhbGNUZXh0U2l6ZSh3c0NhcHRpb24sIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpOw0KKyAgICAgIHJlY3QuU2V0KDAsIDAsIHN6LngsIHN6LnkpOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUKiBmY2FwdGlvbiA9DQorICAgICAgICBzdGF0aWNfY2FzdDxGWF9GTE9BVCo+KEdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX1BTQl9NYXJnaW4pKTsNCisgICAgcmVjdC5JbmZsYXRlKCpmY2FwdGlvbiwgKmZjYXB0aW9uKTsNCisgICAgQ0ZXTF9XaWRnZXRJbXA6OkdldFdpZGdldFJlY3QocmVjdCwgVFJVRSk7DQorICB9IGVsc2Ugew0KKyAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1B1c2hCdXR0b25JbXA6OlNldFN0YXRlcyhGWF9EV09SRCBkd1N0YXRlcywgRlhfQk9PTCBiU2V0KSB7DQorICBpZiAoKGR3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSAmJiBiU2V0KSB7DQorICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgPSBGV0xfV0dUU1RBVEVfRGlzYWJsZWQ7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIH0NCisgIHJldHVybiBDRldMX1dpZGdldEltcDo6U2V0U3RhdGVzKGR3U3RhdGVzLCBiU2V0KTsNCit9DQorRldMX0VSUiBDRldMX1B1c2hCdXR0b25JbXA6OlVwZGF0ZSgpIHsNCisgIGlmIChJc0xvY2tlZCgpKSB7DQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICB9DQorICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpIHsNCisgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICB9DQorICBVcGRhdGVUZXh0T3V0U3R5bGVzKCk7DQorICBHZXRDbGllbnRSZWN0KG1fcnRDbGllbnQpOw0KKyAgbV9ydENhcHRpb24gPSBtX3J0Q2xpZW50Ow0KKyAgRlhfRkxPQVQqIGZjYXB0aW9uID0NCisgICAgICBzdGF0aWNfY2FzdDxGWF9GTE9BVCo+KEdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX1BTQl9NYXJnaW4pKTsNCisgIG1fcnRDYXB0aW9uLkluZmxhdGUoLSpmY2FwdGlvbiwgLSpmY2FwdGlvbik7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9QdXNoQnV0dG9uSW1wOjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIGlmICghcEdyYXBoaWNzKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgSUZXTF9QdXNoQnV0dG9uRFAqIHBEYXRhID0NCisgICAgICBzdGF0aWNfY2FzdDxJRldMX1B1c2hCdXR0b25EUCo+KG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQorICBDRlhfRElCaXRtYXAqIHBQaWN0dXJlID0gTlVMTDsNCisgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgIGlmIChIYXNCb3JkZXIoKSkgew0KKyAgICBEcmF3Qm9yZGVyKHBHcmFwaGljcywgRldMX1BBUlRfUFNCX0JvcmRlciwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwNCisgICAgICAgICAgICAgICBwTWF0cml4KTsNCisgIH0NCisgIGlmIChIYXNFZGdlKCkpIHsNCisgICAgRHJhd0VkZ2UocEdyYXBoaWNzLCBGV0xfUEFSVF9QU0JfRWRnZSwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwNCisgICAgICAgICAgICAgcE1hdHJpeCk7DQorICB9DQorICBEcmF3Qmtncm91bmQocEdyYXBoaWNzLCBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLCBwTWF0cml4KTsNCisgIENGWF9NYXRyaXggbWF0cml4Ow0KKyAgbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICBGWF9GTE9BVCBpUGljd2lkdGggPSAwOw0KKyAgRlhfRkxPQVQgaXBpY2hlaWdodCA9IDA7DQorICBDRlhfV2lkZVN0cmluZyB3c0NhcHRpb247DQorICBpZiAocERhdGEpIHsNCisgICAgcERhdGEtPkdldENhcHRpb24obV9wSW50ZXJmYWNlLCB3c0NhcHRpb24pOw0KKyAgfQ0KKyAgQ0ZYX1JlY3RGIHJ0VGV4dDsNCisgIHJ0VGV4dC5TZXQoMCwgMCwgMCwgMCk7DQorICBpZiAoIXdzQ2FwdGlvbi5Jc0VtcHR5KCkpIHsNCisgICAgQ2FsY1RleHRSZWN0KHdzQ2FwdGlvbiwgcFRoZW1lLCAwLCBtX2lUVE9BbGlnbiwgcnRUZXh0KTsNCisgIH0NCisgIHN3aXRjaCAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9QU0JfTW9kZU1hc2spIHsNCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfUFNCX1RleHRPbmx5Og0KKyAgICAgIERyYXdUZXh0KHBHcmFwaGljcywgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwgJm1hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX1BTQl9JY29uT25seToNCisgICAgICBpZiAocERhdGEpIHsNCisgICAgICAgIHBQaWN0dXJlID0gcERhdGEtPkdldFBpY3R1cmUobV9wSW50ZXJmYWNlKTsNCisgICAgICB9DQorICAgICAgaWYgKHBQaWN0dXJlKSB7DQorICAgICAgICBDRlhfUG9pbnRGIHBvaW50Ow0KKyAgICAgICAgc3dpdGNoIChtX2lUVE9BbGlnbikgew0KKyAgICAgICAgICBjYXNlIDA6IHsNCisgICAgICAgICAgICBwb2ludC54ID0gbV9ydENsaWVudC5sZWZ0Ow0KKyAgICAgICAgICAgIHBvaW50LnkgPSBtX3J0Q2xpZW50LnRvcDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjYXNlIDE6IHsNCisgICAgICAgICAgICBwb2ludC54ID0gbV9ydENsaWVudC5sZWZ0ICsNCisgICAgICAgICAgICAgICAgICAgICAgKG1fcnRDbGllbnQud2lkdGggLyAyIC0gcFBpY3R1cmUtPkdldFdpZHRoKCkgLyAyKTsNCisgICAgICAgICAgICBwb2ludC55ID0gbV9ydENsaWVudC50b3A7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgICAgIHBvaW50LnggPSBtX3J0Q2xpZW50LmxlZnQgKyBtX3J0Q2xpZW50LndpZHRoIC0gcFBpY3R1cmUtPkdldFdpZHRoKCk7DQorICAgICAgICAgICAgcG9pbnQueSA9IG1fcnRDbGllbnQudG9wOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBjYXNlIDQ6DQorICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdDsNCisgICAgICAgICAgICBwb2ludC55ID0gbV9ydENsaWVudC50b3AgKyBtX3J0Q2xpZW50LmhlaWdodCAvIDIgLQ0KKyAgICAgICAgICAgICAgICAgICAgICBwUGljdHVyZS0+R2V0SGVpZ2h0KCkgLyAyOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBjYXNlIDU6DQorICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdCArDQorICAgICAgICAgICAgICAgICAgICAgIChtX3J0Q2xpZW50LndpZHRoIC8gMiAtIHBQaWN0dXJlLT5HZXRXaWR0aCgpIC8gMik7DQorICAgICAgICAgICAgcG9pbnQueSA9IG1fcnRDbGllbnQudG9wICsgbV9ydENsaWVudC5oZWlnaHQgLyAyIC0NCisgICAgICAgICAgICAgICAgICAgICAgcFBpY3R1cmUtPkdldEhlaWdodCgpIC8gMjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgY2FzZSA2Og0KKyAgICAgICAgICAgIHBvaW50LnggPSBtX3J0Q2xpZW50LmxlZnQgKyBtX3J0Q2xpZW50LndpZHRoIC0gcFBpY3R1cmUtPkdldFdpZHRoKCk7DQorICAgICAgICAgICAgcG9pbnQueSA9IG1fcnRDbGllbnQudG9wICsgbV9ydENsaWVudC5oZWlnaHQgLyAyIC0NCisgICAgICAgICAgICAgICAgICAgICAgcFBpY3R1cmUtPkdldEhlaWdodCgpIC8gMjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgY2FzZSA4Og0KKyAgICAgICAgICAgIHBvaW50LnggPSBtX3J0Q2xpZW50LmxlZnQ7DQorICAgICAgICAgICAgcG9pbnQueSA9DQorICAgICAgICAgICAgICAgIG1fcnRDbGllbnQudG9wICsgbV9ydENsaWVudC5oZWlnaHQgLSBwUGljdHVyZS0+R2V0SGVpZ2h0KCk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGNhc2UgOToNCisgICAgICAgICAgICBwb2ludC54ID0gbV9ydENsaWVudC5sZWZ0ICsNCisgICAgICAgICAgICAgICAgICAgICAgKG1fcnRDbGllbnQud2lkdGggLyAyIC0gcFBpY3R1cmUtPkdldFdpZHRoKCkgLyAyKTsNCisgICAgICAgICAgICBwb2ludC55ID0NCisgICAgICAgICAgICAgICAgbV9ydENsaWVudC50b3AgKyBtX3J0Q2xpZW50LmhlaWdodCAtIHBQaWN0dXJlLT5HZXRIZWlnaHQoKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgY2FzZSAxMDoNCisgICAgICAgICAgICBwb2ludC54ID0gbV9ydENsaWVudC5sZWZ0ICsgbV9ydENsaWVudC53aWR0aCAtIHBQaWN0dXJlLT5HZXRXaWR0aCgpOw0KKyAgICAgICAgICAgIHBvaW50LnkgPQ0KKyAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LnRvcCArIG1fcnRDbGllbnQuaGVpZ2h0IC0gcFBpY3R1cmUtPkdldEhlaWdodCgpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcEdyYXBoaWNzLT5EcmF3SW1hZ2UocFBpY3R1cmUsIHBvaW50LCAmbWF0cml4KTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX1BTQl9UZXh0SWNvbjoNCisgICAgICBpZiAocFBpY3R1cmUpIHsNCisgICAgICAgIENGWF9Qb2ludEYgcG9pbnQ7DQorICAgICAgICBzd2l0Y2ggKG1faVRUT0FsaWduKSB7DQorICAgICAgICAgIGNhc2UgMDogew0KKyAgICAgICAgICAgIHBvaW50LnggPSBtX3J0Q2xpZW50LmxlZnQ7DQorICAgICAgICAgICAgcG9pbnQueSA9IG1fcnRDbGllbnQudG9wOw0KKyAgICAgICAgICAgIGlQaWN3aWR0aCA9IChGWF9GTE9BVCkocFBpY3R1cmUtPkdldFdpZHRoKCkgLSA3KTsNCisgICAgICAgICAgICBpcGljaGVpZ2h0ID0NCisgICAgICAgICAgICAgICAgcFBpY3R1cmUtPkdldEhlaWdodCgpIC8gMiAtIG1fcnRDYXB0aW9uLnRvcCAtIHJ0VGV4dC5oZWlnaHQgLyAyOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNhc2UgMTogew0KKyAgICAgICAgICAgIHBvaW50LnggPQ0KKyAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LmxlZnQgKyAobV9ydENsaWVudC53aWR0aCAvIDIgLQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBQaWN0dXJlLT5HZXRXaWR0aCgpICsgcnRUZXh0LndpZHRoKSAvIDIpOw0KKyAgICAgICAgICAgIHBvaW50LnkgPSBtX3J0Q2xpZW50LnRvcDsNCisgICAgICAgICAgICBpUGljd2lkdGggPSBwUGljdHVyZS0+R2V0V2lkdGgoKSAtDQorICAgICAgICAgICAgICAgICAgICAgICAgKChtX3J0Q2xpZW50LndpZHRoKSAvIDIgLSBydFRleHQud2lkdGggLyAyIC0gcG9pbnQueCkgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJ0VGV4dC53aWR0aCAvIDIgLSA3Ow0KKyAgICAgICAgICAgIGlwaWNoZWlnaHQgPQ0KKyAgICAgICAgICAgICAgICBwUGljdHVyZS0+R2V0SGVpZ2h0KCkgLyAyIC0gbV9ydENhcHRpb24udG9wIC0gcnRUZXh0LmhlaWdodCAvIDI7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgICAgIHBvaW50LnggPSBtX3J0Q2xpZW50LmxlZnQgKyBtX3J0Q2xpZW50LndpZHRoIC0NCisgICAgICAgICAgICAgICAgICAgICAgcFBpY3R1cmUtPkdldFdpZHRoKCkgLSBydFRleHQud2lkdGg7DQorICAgICAgICAgICAgcG9pbnQueSA9IG1fcnRDbGllbnQudG9wOw0KKyAgICAgICAgICAgIGlQaWN3aWR0aCA9IG1fcnRDbGllbnQubGVmdCArIG1fcnRDbGllbnQud2lkdGggLSBwb2ludC54IC0NCisgICAgICAgICAgICAgICAgICAgICAgICBwUGljdHVyZS0+R2V0V2lkdGgoKSAtIHJ0VGV4dC53aWR0aCArIDc7DQorICAgICAgICAgICAgaXBpY2hlaWdodCA9DQorICAgICAgICAgICAgICAgIHBQaWN0dXJlLT5HZXRIZWlnaHQoKSAvIDIgLSBtX3J0Q2FwdGlvbi50b3AgLSBydFRleHQuaGVpZ2h0IC8gMjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgY2FzZSA0Og0KKyAgICAgICAgICAgIHBvaW50LnggPSBtX3J0Q2xpZW50LmxlZnQ7DQorICAgICAgICAgICAgcG9pbnQueSA9IG1fcnRDbGllbnQudG9wICsgbV9ydENsaWVudC5oZWlnaHQgLyAyIC0NCisgICAgICAgICAgICAgICAgICAgICAgcFBpY3R1cmUtPkdldEhlaWdodCgpIC8gMjsNCisgICAgICAgICAgICBpUGljd2lkdGggPSBtX3J0Q2xpZW50LmxlZnQgKyBwUGljdHVyZS0+R2V0V2lkdGgoKSAtIDc7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGNhc2UgNToNCisgICAgICAgICAgICBwb2ludC54ID0NCisgICAgICAgICAgICAgICAgbV9ydENsaWVudC5sZWZ0ICsgKG1fcnRDbGllbnQud2lkdGggLyAyIC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwUGljdHVyZS0+R2V0V2lkdGgoKSArIHJ0VGV4dC53aWR0aCkgLyAyKTsNCisgICAgICAgICAgICBwb2ludC55ID0gbV9ydENsaWVudC50b3AgKyBtX3J0Q2xpZW50LmhlaWdodCAvIDIgLQ0KKyAgICAgICAgICAgICAgICAgICAgICBwUGljdHVyZS0+R2V0SGVpZ2h0KCkgLyAyOw0KKyAgICAgICAgICAgIGlQaWN3aWR0aCA9IHBQaWN0dXJlLT5HZXRXaWR0aCgpIC0NCisgICAgICAgICAgICAgICAgICAgICAgICAoKG1fcnRDbGllbnQud2lkdGgpIC8gMiAtIHJ0VGV4dC53aWR0aCAvIDIgLSBwb2ludC54KSArDQorICAgICAgICAgICAgICAgICAgICAgICAgcnRUZXh0LndpZHRoIC8gMiAtIDc7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGNhc2UgNjoNCisgICAgICAgICAgICBwb2ludC54ID0gbV9ydENsaWVudC5sZWZ0ICsgbV9ydENsaWVudC53aWR0aCAtDQorICAgICAgICAgICAgICAgICAgICAgIHBQaWN0dXJlLT5HZXRXaWR0aCgpIC0gcnRUZXh0LndpZHRoOw0KKyAgICAgICAgICAgIHBvaW50LnkgPSBtX3J0Q2xpZW50LnRvcCArIG1fcnRDbGllbnQuaGVpZ2h0IC8gMiAtDQorICAgICAgICAgICAgICAgICAgICAgIHBQaWN0dXJlLT5HZXRIZWlnaHQoKSAvIDI7DQorICAgICAgICAgICAgaVBpY3dpZHRoID0gbV9ydENsaWVudC5sZWZ0ICsgbV9ydENsaWVudC53aWR0aCAtIHBvaW50LnggLQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBQaWN0dXJlLT5HZXRXaWR0aCgpIC0gcnRUZXh0LndpZHRoICsgNzsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgY2FzZSA4Og0KKyAgICAgICAgICAgIHBvaW50LnggPSBtX3J0Q2xpZW50LmxlZnQ7DQorICAgICAgICAgICAgcG9pbnQueSA9DQorICAgICAgICAgICAgICAgIG1fcnRDbGllbnQudG9wICsgbV9ydENsaWVudC5oZWlnaHQgLSBwUGljdHVyZS0+R2V0SGVpZ2h0KCk7DQorICAgICAgICAgICAgaVBpY3dpZHRoID0gKEZYX0ZMT0FUKShwUGljdHVyZS0+R2V0V2lkdGgoKSAtIDcpOw0KKyAgICAgICAgICAgIGlwaWNoZWlnaHQgLT0gcnRUZXh0LmhlaWdodCAvIDI7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGNhc2UgOToNCisgICAgICAgICAgICBwb2ludC54ID0NCisgICAgICAgICAgICAgICAgbV9ydENsaWVudC5sZWZ0ICsgKG1fcnRDbGllbnQud2lkdGggLyAyIC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwUGljdHVyZS0+R2V0V2lkdGgoKSArIHJ0VGV4dC53aWR0aCkgLyAyKTsNCisgICAgICAgICAgICBwb2ludC55ID0NCisgICAgICAgICAgICAgICAgbV9ydENsaWVudC50b3AgKyBtX3J0Q2xpZW50LmhlaWdodCAtIHBQaWN0dXJlLT5HZXRIZWlnaHQoKTsNCisgICAgICAgICAgICBpUGljd2lkdGggPSBwUGljdHVyZS0+R2V0V2lkdGgoKSAtDQorICAgICAgICAgICAgICAgICAgICAgICAgKChtX3J0Q2xpZW50LndpZHRoKSAvIDIgLSBydFRleHQud2lkdGggLyAyIC0gcG9pbnQueCkgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJ0VGV4dC53aWR0aCAvIDIgLSA3Ow0KKyAgICAgICAgICAgIGlwaWNoZWlnaHQgLT0gcnRUZXh0LmhlaWdodCAvIDI7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGNhc2UgMTA6DQorICAgICAgICAgICAgcG9pbnQueCA9IG1fcnRDbGllbnQubGVmdCArIG1fcnRDbGllbnQud2lkdGggLQ0KKyAgICAgICAgICAgICAgICAgICAgICBwUGljdHVyZS0+R2V0V2lkdGgoKSAtIHJ0VGV4dC53aWR0aDsNCisgICAgICAgICAgICBwb2ludC55ID0NCisgICAgICAgICAgICAgICAgbV9ydENsaWVudC50b3AgKyBtX3J0Q2xpZW50LmhlaWdodCAtIHBQaWN0dXJlLT5HZXRIZWlnaHQoKTsNCisgICAgICAgICAgICBpUGljd2lkdGggPSBtX3J0Q2xpZW50LmxlZnQgKyBtX3J0Q2xpZW50LndpZHRoIC0gcG9pbnQueCAtDQorICAgICAgICAgICAgICAgICAgICAgICAgcFBpY3R1cmUtPkdldFdpZHRoKCkgLSBydFRleHQud2lkdGggKyA3Ow0KKyAgICAgICAgICAgIGlwaWNoZWlnaHQgLT0gcnRUZXh0LmhlaWdodCAvIDI7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBwR3JhcGhpY3MtPkRyYXdJbWFnZShwUGljdHVyZSwgcG9pbnQsICZtYXRyaXgpOw0KKyAgICAgIH0NCisgICAgICBtYXRyaXguZSArPSBtX3J0Q2xpZW50LmxlZnQgKyBpUGljd2lkdGg7DQorICAgICAgbWF0cml4LmYgKz0gbV9ydENsaWVudC50b3AgKyBpcGljaGVpZ2h0Ow0KKyAgICAgIERyYXdUZXh0KHBHcmFwaGljcywgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwgJm1hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK3ZvaWQgQ0ZXTF9QdXNoQnV0dG9uSW1wOjpEcmF3Qmtncm91bmQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX1BTQl9CYWNrZ3JvdW5kOw0KKyAgcGFyYW0ubV9kd1N0YXRlcyA9IEdldFBhcnRTdGF0ZXMoKTsNCisgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIHBhcmFtLm1fcnRQYXJ0ID0gbV9ydENsaWVudDsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpIHsNCisgICAgcGFyYW0ubV9wRGF0YSA9ICZtX3J0Q2FwdGlvbjsNCisgIH0NCisgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCit9DQordm9pZCBDRldMX1B1c2hCdXR0b25JbXA6OkRyYXdUZXh0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpDQorICAgIHJldHVybjsNCisgIENGWF9XaWRlU3RyaW5nIHdzQ2FwdGlvbjsNCisgIG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlci0+R2V0Q2FwdGlvbihtX3BJbnRlcmZhY2UsIHdzQ2FwdGlvbik7DQorICBpZiAod3NDYXB0aW9uLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRldMX1RoZW1lVGV4dCBwYXJhbTsNCisgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9QU0JfQ2FwdGlvbjsNCisgIHBhcmFtLm1fZHdTdGF0ZXMgPSBHZXRQYXJ0U3RhdGVzKCk7DQorICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBwYXJhbS5tX3J0UGFydCA9IG1fcnRDYXB0aW9uOw0KKyAgcGFyYW0ubV93c1RleHQgPSB3c0NhcHRpb247DQorICBwYXJhbS5tX2R3VFRPU3R5bGVzID0gbV9kd1RUT1N0eWxlczsNCisgIHBhcmFtLm1faVRUT0FsaWduID0gbV9pVFRPQWxpZ247DQorICBwVGhlbWUtPkRyYXdUZXh0KCZwYXJhbSk7DQorfQ0KK0ZYX0RXT1JEIENGV0xfUHVzaEJ1dHRvbkltcDo6R2V0UGFydFN0YXRlcygpIHsNCisgIEZYX0RXT1JEIGR3U3RhdGVzID0gRldMX1BBUlRTVEFURV9QU0JfTm9ybWFsOw0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgew0KKyAgICBkd1N0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX1BTQl9Gb2N1c2VkOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpIHsNCisgICAgZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX1BTQl9EaXNhYmxlZDsNCisgIH0gZWxzZSBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9QU0JfUHJlc3NlZCkgew0KKyAgICBkd1N0YXRlcyB8PSBGV0xfUEFSVFNUQVRFX1BTQl9QcmVzc2VkOw0KKyAgfSBlbHNlIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1NUQVRFX1BTQl9Ib3ZlcmVkKSB7DQorICAgIGR3U3RhdGVzIHw9IEZXTF9QQVJUU1RBVEVfUFNCX0hvdmVyZWQ7DQorICB9IGVsc2UgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfUFNCX0RlZmF1bHQpIHsNCisgICAgZHdTdGF0ZXMgfD0gRldMX1BBUlRTVEFURV9QU0JfRGVmYXVsdDsNCisgIH0NCisgIHJldHVybiBkd1N0YXRlczsNCit9DQordm9pZCBDRldMX1B1c2hCdXR0b25JbXA6OlVwZGF0ZVRleHRPdXRTdHlsZXMoKSB7DQorICBtX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyOw0KKyAgc3dpdGNoIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYNCisgICAgICAgICAgKEZXTF9TVFlMRUVYVF9QU0JfSExheW91dE1hc2sgfCBGV0xfU1RZTEVFWFRfUFNCX1ZMYXlvdXRNYXNrKSkgew0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9QU0JfTGVmdCB8IEZXTF9TVFlMRUVYVF9QU0JfVG9wOiB7DQorICAgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX1RvcExlZnQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfUFNCX0NlbnRlciB8IEZXTF9TVFlMRUVYVF9QU0JfVG9wOiB7DQorICAgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX1RvcENlbnRlcjsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9QU0JfUmlnaHQgfCBGV0xfU1RZTEVFWFRfUFNCX1RvcDogew0KKyAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9Ub3BSaWdodDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9QU0JfTGVmdCB8IEZXTF9TVFlMRUVYVF9QU0JfVkNlbnRlcjogew0KKyAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJMZWZ0Ow0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX1BTQl9DZW50ZXIgfCBGV0xfU1RZTEVFWFRfUFNCX1ZDZW50ZXI6IHsNCisgICAgICBtX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX1BTQl9SaWdodCB8IEZXTF9TVFlMRUVYVF9QU0JfVkNlbnRlcjogew0KKyAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJSaWdodDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9QU0JfTGVmdCB8IEZXTF9TVFlMRUVYVF9QU0JfQm90dG9tOiB7DQorICAgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0JvdHRvbUxlZnQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfUFNCX0NlbnRlciB8IEZXTF9TVFlMRUVYVF9QU0JfQm90dG9tOiB7DQorICAgICAgbV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0JvdHRvbUNlbnRlcjsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9TVFlMRUVYVF9QU0JfUmlnaHQgfCBGV0xfU1RZTEVFWFRfUFNCX0JvdHRvbTogew0KKyAgICAgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9Cb3R0b21SaWdodDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KKyAgbV9kd1RUT1N0eWxlcyA9IEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lOw0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfV0dUU1RZTEVfUlRMUmVhZGluZykgew0KKyAgICBtX2R3VFRPU3R5bGVzIHw9IEZERV9UVE9TVFlMRV9SVEw7DQorICB9DQorfQ0KK0NGV0xfUHVzaEJ1dHRvbkltcERlbGVnYXRlOjpDRldMX1B1c2hCdXR0b25JbXBEZWxlZ2F0ZSgNCisgICAgQ0ZXTF9QdXNoQnV0dG9uSW1wKiBwT3duZXIpDQorICAgIDogbV9wT3duZXIocE93bmVyKSB7fQ0KK2ludDMyX3QgQ0ZXTF9QdXNoQnV0dG9uSW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgaWYgKCFwTWVzc2FnZSkNCisgICAgcmV0dXJuIDA7DQorICBpZiAoIW1fcE93bmVyLT5Jc0VuYWJsZWQoKSkgew0KKyAgICByZXR1cm4gMTsNCisgIH0NCisgIGludDMyX3QgaVJldCA9IDE7DQorICBGWF9EV09SRCBkd01zZ0NvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KKyAgc3dpdGNoIChkd01zZ0NvZGUpIHsNCisgICAgY2FzZSBGV0xfTVNHSEFTSF9TZXRGb2N1czoNCisgICAgY2FzZSBGV0xfTVNHSEFTSF9LaWxsRm9jdXM6IHsNCisgICAgICBPbkZvY3VzQ2hhbmdlZChwTWVzc2FnZSwgZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX1NldEZvY3VzKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX01vdXNlOiB7DQorICAgICAgQ0ZXTF9Nc2dNb3VzZSogcE1zZyA9IHN0YXRpY19jYXN0PENGV0xfTXNnTW91c2UqPihwTWVzc2FnZSk7DQorICAgICAgRlhfRFdPUkQgZHdDbWQgPSBwTXNnLT5tX2R3Q21kOw0KKyAgICAgIHN3aXRjaCAoZHdDbWQpIHsNCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duOiB7DQorICAgICAgICAgIE9uTEJ1dHRvbkRvd24ocE1zZyk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvblVwOiB7DQorICAgICAgICAgIE9uTEJ1dHRvblVwKHBNc2cpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTW92ZTogew0KKyAgICAgICAgICBPbk1vdXNlTW92ZShwTXNnKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlOiB7DQorICAgICAgICAgIE9uTW91c2VMZWF2ZShwTXNnKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBkZWZhdWx0OiB7fQ0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX0tleTogew0KKyAgICAgIENGV0xfTXNnS2V5KiBwS2V5ID0gc3RhdGljX2Nhc3Q8Q0ZXTF9Nc2dLZXkqPihwTWVzc2FnZSk7DQorICAgICAgaWYgKHBLZXktPm1fZHdDbWQgPT0gRldMX01TR0tFWUNNRF9LZXlEb3duKSB7DQorICAgICAgICBPbktleURvd24ocEtleSk7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsNCisgICAgICBpUmV0ID0gMDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorICByZXR1cm4gaVJldDsNCit9DQorRldMX0VSUiBDRldMX1B1c2hCdXR0b25JbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9QdXNoQnV0dG9uSW1wRGVsZWdhdGU6Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgcmV0dXJuIG1fcE93bmVyLT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorfQ0KK3ZvaWQgQ0ZXTF9QdXNoQnV0dG9uSW1wRGVsZWdhdGU6Ok9uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSogcE1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXQpIHsNCisgIGlmIChiU2V0KSB7DQorICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9XR1RTVEFURV9Gb2N1c2VkOw0KKyAgfSBlbHNlIHsNCisgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9XR1RTVEFURV9Gb2N1c2VkOw0KKyAgfQ0KKyAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCit9DQordm9pZCBDRldMX1B1c2hCdXR0b25JbXBEZWxlZ2F0ZTo6T25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpID09IDApIHsNCisgICAgbV9wT3duZXItPlNldEZvY3VzKFRSVUUpOw0KKyAgfQ0KKyAgbV9wT3duZXItPm1fYkJ0bkRvd24gPSBUUlVFOw0KKyAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX1BTQl9Ib3ZlcmVkOw0KKyAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX1BTQl9QcmVzc2VkOw0KKyAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0Q2xpZW50KTsNCit9DQordm9pZCBDRldMX1B1c2hCdXR0b25JbXBEZWxlZ2F0ZTo6T25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSogcE1zZykgew0KKyAgbV9wT3duZXItPm1fYkJ0bkRvd24gPSBGQUxTRTsNCisgIGlmIChtX3BPd25lci0+bV9ydENsaWVudC5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1NUQVRFX1BTQl9QcmVzc2VkOw0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBGV0xfU1RBVEVfUFNCX0hvdmVyZWQ7DQorICB9IGVsc2Ugew0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1NUQVRFX1BTQl9Ib3ZlcmVkOw0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1NUQVRFX1BTQl9QcmVzc2VkOw0KKyAgfQ0KKyAgaWYgKG1fcE93bmVyLT5tX3J0Q2xpZW50LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgIENGV0xfRXZ0Q2xpY2sgd21DbGljazsNCisgICAgd21DbGljay5tX3BTcmNUYXJnZXQgPSBtX3BPd25lci0+bV9wSW50ZXJmYWNlOw0KKyAgICBtX3BPd25lci0+RGlzcGF0Y2hFdmVudCgmd21DbGljayk7DQorICB9DQorICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KK30NCit2b2lkIENGV0xfUHVzaEJ1dHRvbkltcERlbGVnYXRlOjpPbk1vdXNlTW92ZShDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBGWF9CT09MIGJSZXBhaW50ID0gRkFMU0U7DQorICBpZiAobV9wT3duZXItPm1fYkJ0bkRvd24pIHsNCisgICAgaWYgKG1fcE93bmVyLT5tX3J0Q2xpZW50LkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgICAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9QU0JfUHJlc3NlZCkgPT0gMCkgew0KKyAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX1BTQl9QcmVzc2VkOw0KKyAgICAgICAgYlJlcGFpbnQgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgICBpZiAobV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfU1RBVEVfUFNCX0hvdmVyZWQpIHsNCisgICAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfU1RBVEVfUFNCX0hvdmVyZWQ7DQorICAgICAgICBiUmVwYWludCA9IFRSVUU7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9QU0JfUHJlc3NlZCkgew0KKyAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9TVEFURV9QU0JfUHJlc3NlZDsNCisgICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCisgICAgICB9DQorICAgICAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9QU0JfSG92ZXJlZCkgPT0gMCkgew0KKyAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX1BTQl9Ib3ZlcmVkOw0KKyAgICAgICAgYlJlcGFpbnQgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgaWYgKCFtX3BPd25lci0+bV9ydENsaWVudC5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1NUQVRFX1BTQl9Ib3ZlcmVkKSA9PSAwKSB7DQorICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1NUQVRFX1BTQl9Ib3ZlcmVkOw0KKyAgICAgIGJSZXBhaW50ID0gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGJSZXBhaW50KSB7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9QdXNoQnV0dG9uSW1wRGVsZWdhdGU6Ok9uTW91c2VMZWF2ZShDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBtX3BPd25lci0+bV9iQnRuRG93biA9IEZBTFNFOw0KKyAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfkZXTF9TVEFURV9QU0JfSG92ZXJlZDsNCisgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfU1RBVEVfUFNCX1ByZXNzZWQ7DQorICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KK30NCit2b2lkIENGV0xfUHVzaEJ1dHRvbkltcERlbGVnYXRlOjpPbktleURvd24oQ0ZXTF9Nc2dLZXkqIHBNc2cpIHsNCisgIGlmIChwTXNnLT5tX2R3S2V5Q29kZSA9PSBGV0xfVktFWV9SZXR1cm4pIHsNCisgICAgQ0ZXTF9FdnRNb3VzZSB3bU1vdXNlOw0KKyAgICB3bU1vdXNlLm1fcFNyY1RhcmdldCA9IG1fcE93bmVyLT5tX3BJbnRlcmZhY2U7DQorICAgIHdtTW91c2UubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA7DQorICAgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZ3bU1vdXNlKTsNCisgICAgQ0ZXTF9FdnRDbGljayB3bUNsaWNrOw0KKyAgICB3bUNsaWNrLm1fcFNyY1RhcmdldCA9IG1fcE93bmVyLT5tX3BJbnRlcmZhY2U7DQorICAgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZ3bUNsaWNrKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKHBNc2ctPm1fZHdLZXlDb2RlICE9IEZXTF9WS0VZX1RhYikgew0KKyAgICByZXR1cm47DQorICB9DQorICBtX3BPd25lci0+RGlzcGF0Y2hLZXlFdmVudChwTXNnKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3Njcm9sbGJhcmltcC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfc2Nyb2xsYmFyaW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDJkMjJjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3Njcm9sbGJhcmltcC5jcHAKQEAgLTAsMCArMSw4MDIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX25vdGVpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0aW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3Njcm9sbGJhcmltcC5oIg0KKyNkZWZpbmUgRldMX1NDUk9MTEJBUl9FbGFwc2UgNTAwDQorI2RlZmluZSBGV0xfU0NST0xMQkFSX01pblRodW1iIDUNCisNCisvLyBzdGF0aWMNCitJRldMX1Njcm9sbEJhciogSUZXTF9TY3JvbGxCYXI6OkNyZWF0ZSgNCisgICAgY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICBJRldMX1dpZGdldCogcE91dGVyKSB7DQorICBJRldMX1Njcm9sbEJhciogcFNjcm9sbEJhciA9IG5ldyBJRldMX1Njcm9sbEJhcjsNCisgIENGV0xfU2Nyb2xsQmFySW1wKiBwU2Nyb2xsQmFySW1wbCA9IG5ldyBDRldMX1Njcm9sbEJhckltcChwcm9wZXJ0aWVzLCBwT3V0ZXIpOw0KKyAgcFNjcm9sbEJhci0+U2V0SW1wbChwU2Nyb2xsQmFySW1wbCk7DQorICBwU2Nyb2xsQmFySW1wbC0+U2V0SW50ZXJmYWNlKHBTY3JvbGxCYXIpOw0KKyAgcmV0dXJuIHBTY3JvbGxCYXI7DQorfQ0KK0lGV0xfU2Nyb2xsQmFyOjpJRldMX1Njcm9sbEJhcigpIHt9DQorRlhfQk9PTCBJRldMX1Njcm9sbEJhcjo6SXNWZXJ0aWNhbCgpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX1Njcm9sbEJhckltcCo+KEdldEltcGwoKSktPklzVmVydGljYWwoKTsNCit9DQorRldMX0VSUiBJRldMX1Njcm9sbEJhcjo6R2V0UmFuZ2UoRlhfRkxPQVQmIGZNaW4sIEZYX0ZMT0FUJiBmTWF4KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9TY3JvbGxCYXJJbXAqPihHZXRJbXBsKCkpLT5HZXRSYW5nZShmTWluLCBmTWF4KTsNCit9DQorRldMX0VSUiBJRldMX1Njcm9sbEJhcjo6U2V0UmFuZ2UoRlhfRkxPQVQgZk1pbiwgRlhfRkxPQVQgZk1heCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfU2Nyb2xsQmFySW1wKj4oR2V0SW1wbCgpKS0+U2V0UmFuZ2UoZk1pbiwgZk1heCk7DQorfQ0KK0ZYX0ZMT0FUIElGV0xfU2Nyb2xsQmFyOjpHZXRQYWdlU2l6ZSgpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX1Njcm9sbEJhckltcCo+KEdldEltcGwoKSktPkdldFBhZ2VTaXplKCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9TY3JvbGxCYXI6OlNldFBhZ2VTaXplKEZYX0ZMT0FUIGZQYWdlU2l6ZSkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfU2Nyb2xsQmFySW1wKj4oR2V0SW1wbCgpKS0+U2V0UGFnZVNpemUoZlBhZ2VTaXplKTsNCit9DQorRlhfRkxPQVQgSUZXTF9TY3JvbGxCYXI6OkdldFN0ZXBTaXplKCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfU2Nyb2xsQmFySW1wKj4oR2V0SW1wbCgpKS0+R2V0U3RlcFNpemUoKTsNCit9DQorRldMX0VSUiBJRldMX1Njcm9sbEJhcjo6U2V0U3RlcFNpemUoRlhfRkxPQVQgZlN0ZXBTaXplKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9TY3JvbGxCYXJJbXAqPihHZXRJbXBsKCkpLT5TZXRTdGVwU2l6ZShmU3RlcFNpemUpOw0KK30NCitGWF9GTE9BVCBJRldMX1Njcm9sbEJhcjo6R2V0UG9zKCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfU2Nyb2xsQmFySW1wKj4oR2V0SW1wbCgpKS0+R2V0UG9zKCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9TY3JvbGxCYXI6OlNldFBvcyhGWF9GTE9BVCBmUG9zKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9TY3JvbGxCYXJJbXAqPihHZXRJbXBsKCkpLT5TZXRQb3MoZlBvcyk7DQorfQ0KK0ZYX0ZMT0FUIElGV0xfU2Nyb2xsQmFyOjpHZXRUcmFja1BvcygpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX1Njcm9sbEJhckltcCo+KEdldEltcGwoKSktPkdldFRyYWNrUG9zKCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9TY3JvbGxCYXI6OlNldFRyYWNrUG9zKEZYX0ZMT0FUIGZUcmFja1Bvcykgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfU2Nyb2xsQmFySW1wKj4oR2V0SW1wbCgpKS0+U2V0VHJhY2tQb3MoZlRyYWNrUG9zKTsNCit9DQorRlhfQk9PTCBJRldMX1Njcm9sbEJhcjo6RG9TY3JvbGwoRlhfRFdPUkQgZHdDb2RlLCBGWF9GTE9BVCBmUG9zKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9TY3JvbGxCYXJJbXAqPihHZXRJbXBsKCkpLT5Eb1Njcm9sbChkd0NvZGUsIGZQb3MpOw0KK30NCitDRldMX1Njcm9sbEJhckltcDo6Q0ZXTF9TY3JvbGxCYXJJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKQ0KKyAgICA6IENGV0xfV2lkZ2V0SW1wKHByb3BlcnRpZXMsIHBPdXRlciksDQorICAgICAgbV9oVGltZXIobnVsbHB0ciksDQorICAgICAgbV9mUmFuZ2VNaW4oMCksDQorICAgICAgbV9mUmFuZ2VNYXgoLTEpLA0KKyAgICAgIG1fZlBhZ2VTaXplKDApLA0KKyAgICAgIG1fZlN0ZXBTaXplKDApLA0KKyAgICAgIG1fZlBvcygwKSwNCisgICAgICBtX2ZUcmFja1BvcygwKSwNCisgICAgICBtX2lNaW5CdXR0b25TdGF0ZShGV0xfUEFSVFNUQVRFX1NDQl9Ob3JtYWwpLA0KKyAgICAgIG1faU1heEJ1dHRvblN0YXRlKEZXTF9QQVJUU1RBVEVfU0NCX05vcm1hbCksDQorICAgICAgbV9pVGh1bWJCdXR0b25TdGF0ZShGV0xfUEFSVFNUQVRFX1NDQl9Ob3JtYWwpLA0KKyAgICAgIG1faU1pblRyYWNrU3RhdGUoRldMX1BBUlRTVEFURV9TQ0JfTm9ybWFsKSwNCisgICAgICBtX2lNYXhUcmFja1N0YXRlKEZXTF9QQVJUU1RBVEVfU0NCX05vcm1hbCksDQorICAgICAgbV9mTGFzdFRyYWNrUG9zKDApLA0KKyAgICAgIG1fY3BUcmFja1BvaW50WCgwKSwNCisgICAgICBtX2NwVHJhY2tQb2ludFkoMCksDQorICAgICAgbV9pTW91c2VXaGVlbCgwKSwNCisgICAgICBtX2JUcmFja01vdXNlTGVhdmUoRkFMU0UpLA0KKyAgICAgIG1fYk1vdXNlSG92ZXIoRkFMU0UpLA0KKyAgICAgIG1fYk1vdXNlRG93bihGQUxTRSksDQorICAgICAgbV9iUmVwYWludFRodW1iKEZBTFNFKSwNCisgICAgICBtX2ZCdXR0b25MZW4oMCksDQorICAgICAgbV9iTWluU2l6ZShGQUxTRSksDQorICAgICAgbV9iQ3VzdG9tTGF5b3V0KEZBTFNFKSwNCisgICAgICBtX2ZNaW5UaHVtYihGV0xfU0NST0xMQkFSX01pblRodW1iKSB7DQorICBtX3J0Q2xpZW50LlJlc2V0KCk7DQorICBtX3J0VGh1bWIuUmVzZXQoKTsNCisgIG1fcnRNaW5CdG4uUmVzZXQoKTsNCisgIG1fcnRNYXhCdG4uUmVzZXQoKTsNCisgIG1fcnRNaW5UcmFjay5SZXNldCgpOw0KKyAgbV9ydE1heFRyYWNrLlJlc2V0KCk7DQorfQ0KK0NGV0xfU2Nyb2xsQmFySW1wOjp+Q0ZXTF9TY3JvbGxCYXJJbXAoKSB7fQ0KK0ZXTF9FUlIgQ0ZXTF9TY3JvbGxCYXJJbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Qgew0KKyAgd3NDbGFzcyA9IEZXTF9DTEFTU19TY3JvbGxCYXI7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfU2Nyb2xsQmFySW1wOjpHZXRDbGFzc0lEKCkgY29uc3Qgew0KKyAgcmV0dXJuIEZXTF9DTEFTU0hBU0hfU2Nyb2xsQmFyOw0KK30NCitGV0xfRVJSIENGV0xfU2Nyb2xsQmFySW1wOjpJbml0aWFsaXplKCkgew0KKyAgaWYgKENGV0xfV2lkZ2V0SW1wOjpJbml0aWFsaXplKCkgIT0gRldMX0VSUl9TdWNjZWVkZWQpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBtX3BEZWxlZ2F0ZSA9IG5ldyBDRldMX1Njcm9sbEJhckltcERlbGVnYXRlKHRoaXMpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfU2Nyb2xsQmFySW1wOjpGaW5hbGl6ZSgpIHsNCisgIGRlbGV0ZSBtX3BEZWxlZ2F0ZTsNCisgIG1fcERlbGVnYXRlID0gbnVsbHB0cjsNCisgIHJldHVybiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKTsNCit9DQorRldMX0VSUiBDRldMX1Njcm9sbEJhckltcDo6R2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsIEZYX0JPT0wgYkF1dG9TaXplKSB7DQorICBpZiAoYkF1dG9TaXplKSB7DQorICAgIHJlY3QuU2V0KDAsIDAsIDAsIDApOw0KKyAgICBGWF9GTE9BVCogcGZNaW5XaWR0aCA9IHN0YXRpY19jYXN0PEZYX0ZMT0FUKj4oDQorICAgICAgICBHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9TY3JvbGxCYXJXaWR0aCkpOw0KKyAgICBpZiAoIXBmTWluV2lkdGgpDQorICAgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgICAgaWYgKElzVmVydGljYWwoKSkgew0KKyAgICAgIHJlY3QuU2V0KDAsIDAsICgqcGZNaW5XaWR0aCksICgqcGZNaW5XaWR0aCkgKiAzKTsNCisgICAgfSBlbHNlIHsNCisgICAgICByZWN0LlNldCgwLCAwLCAoKnBmTWluV2lkdGgpICogMywgKCpwZk1pbldpZHRoKSk7DQorICAgIH0NCisgICAgQ0ZXTF9XaWRnZXRJbXA6OkdldFdpZGdldFJlY3QocmVjdCwgVFJVRSk7DQorICB9IGVsc2Ugew0KKyAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1Njcm9sbEJhckltcDo6VXBkYXRlKCkgew0KKyAgaWYgKElzTG9ja2VkKCkpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIH0NCisgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikgew0KKyAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsNCisgIH0NCisgIExheW91dCgpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfU2Nyb2xsQmFySW1wOjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgaWYgKCFwR3JhcGhpY3MpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICBpZiAoSGFzQm9yZGVyKCkpIHsNCisgICAgRHJhd0JvcmRlcihwR3JhcGhpY3MsIEZXTF9QQVJUX1NDQl9Cb3JkZXIsIHBUaGVtZSwgcE1hdHJpeCk7DQorICB9DQorICBpZiAoSGFzRWRnZSgpKSB7DQorICAgIERyYXdFZGdlKHBHcmFwaGljcywgRldMX1BBUlRfU0NCX0VkZ2UsIHBUaGVtZSwgcE1hdHJpeCk7DQorICB9DQorICBEcmF3VHJhY2socEdyYXBoaWNzLCBwVGhlbWUsIFRSVUUsIHBNYXRyaXgpOw0KKyAgRHJhd1RyYWNrKHBHcmFwaGljcywgcFRoZW1lLCBGQUxTRSwgcE1hdHJpeCk7DQorICBEcmF3QXJyb3dCdG4ocEdyYXBoaWNzLCBwVGhlbWUsIFRSVUUsIHBNYXRyaXgpOw0KKyAgRHJhd0Fycm93QnRuKHBHcmFwaGljcywgcFRoZW1lLCBGQUxTRSwgcE1hdHJpeCk7DQorICBEcmF3VGh1bWIocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitpbmxpbmUgRlhfQk9PTCBDRldMX1Njcm9sbEJhckltcDo6SXNWZXJ0aWNhbCgpIHsNCisgIHJldHVybiBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX1NDQl9WZXJ0Ow0KK30NCitGV0xfRVJSIENGV0xfU2Nyb2xsQmFySW1wOjpHZXRSYW5nZShGWF9GTE9BVCYgZk1pbiwgRlhfRkxPQVQmIGZNYXgpIHsNCisgIGZNaW4gPSBtX2ZSYW5nZU1pbjsNCisgIGZNYXggPSBtX2ZSYW5nZU1heDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1Njcm9sbEJhckltcDo6U2V0UmFuZ2UoRlhfRkxPQVQgZk1pbiwgRlhfRkxPQVQgZk1heCkgew0KKyAgbV9mUmFuZ2VNaW4gPSBmTWluOw0KKyAgbV9mUmFuZ2VNYXggPSBmTWF4Ow0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9GTE9BVCBDRldMX1Njcm9sbEJhckltcDo6R2V0UGFnZVNpemUoKSB7DQorICByZXR1cm4gbV9mUGFnZVNpemU7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TY3JvbGxCYXJJbXA6OlNldFBhZ2VTaXplKEZYX0ZMT0FUIGZQYWdlU2l6ZSkgew0KKyAgbV9mUGFnZVNpemUgPSBmUGFnZVNpemU7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfU2Nyb2xsQmFySW1wOjpHZXRTdGVwU2l6ZSgpIHsNCisgIHJldHVybiBtX2ZTdGVwU2l6ZTsNCit9DQorRldMX0VSUiBDRldMX1Njcm9sbEJhckltcDo6U2V0U3RlcFNpemUoRlhfRkxPQVQgZlN0ZXBTaXplKSB7DQorICBtX2ZTdGVwU2l6ZSA9IGZTdGVwU2l6ZTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRkxPQVQgQ0ZXTF9TY3JvbGxCYXJJbXA6OkdldFBvcygpIHsNCisgIHJldHVybiBtX2ZQb3M7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TY3JvbGxCYXJJbXA6OlNldFBvcyhGWF9GTE9BVCBmUG9zKSB7DQorICBtX2ZQb3MgPSBmUG9zOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9GTE9BVCBDRldMX1Njcm9sbEJhckltcDo6R2V0VHJhY2tQb3MoKSB7DQorICByZXR1cm4gbV9mVHJhY2tQb3M7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TY3JvbGxCYXJJbXA6OlNldFRyYWNrUG9zKEZYX0ZMT0FUIGZUcmFja1Bvcykgew0KKyAgbV9mVHJhY2tQb3MgPSBmVHJhY2tQb3M7DQorICBDYWxjVGh1bWJCdXR0b25SZWN0KG1fcnRUaHVtYik7DQorICBDYWxjTWluVHJhY2tSZWN0KG1fcnRNaW5UcmFjayk7DQorICBDYWxjTWF4VHJhY2tSZWN0KG1fcnRNYXhUcmFjayk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9TY3JvbGxCYXJJbXA6OkRvU2Nyb2xsKEZYX0RXT1JEIGR3Q29kZSwgRlhfRkxPQVQgZlBvcykgew0KKyAgc3dpdGNoIChkd0NvZGUpIHsNCisgICAgY2FzZSBGV0xfU0NCQ09ERV9NaW46DQorICAgIGNhc2UgRldMX1NDQkNPREVfTWF4Og0KKyAgICBjYXNlIEZXTF9TQ0JDT0RFX1BhZ2VCYWNrd2FyZDoNCisgICAgY2FzZSBGV0xfU0NCQ09ERV9QYWdlRm9yd2FyZDoNCisgICAgY2FzZSBGV0xfU0NCQ09ERV9TdGVwQmFja3dhcmQ6DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRldMX1NDQkNPREVfU3RlcEZvcndhcmQ6DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRldMX1NDQkNPREVfUG9zOg0KKyAgICBjYXNlIEZXTF9TQ0JDT0RFX1RyYWNrUG9zOg0KKyAgICBjYXNlIEZXTF9TQ0JDT0RFX0VuZFNjcm9sbDoNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDogeyByZXR1cm4gRkFMU0U7IH0NCisgIH0NCisgIHJldHVybiBPblNjcm9sbChkd0NvZGUsIGZQb3MpOw0KK30NCitpbnQzMl90IENGV0xfU2Nyb2xsQmFySW1wOjpSdW4oRldMX0hUSU1FUiBoVGltZXIpIHsNCisgIGlmIChtX2hUaW1lcikgew0KKyAgICBGV0xfU3RvcFRpbWVyKG1faFRpbWVyKTsNCisgIH0NCisgIGlmICghU2VuZEV2ZW50KCkpIHsNCisgICAgbV9oVGltZXIgPSBGV0xfU3RhcnRUaW1lcih0aGlzLCAwKTsNCisgIH0NCisgIHJldHVybiAxOw0KK30NCitGV0xfRVJSIENGV0xfU2Nyb2xsQmFySW1wOjpTZXRPdXRlcihJRldMX1dpZGdldCogcE91dGVyKSB7DQorICBtX3BPdXRlciA9IHBPdXRlcjsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQordm9pZCBDRldMX1Njcm9sbEJhckltcDo6RHJhd1RyYWNrKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTG93ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcGFyYW0ubV9pUGFydCA9IGJMb3dlciA/IEZXTF9QQVJUX1NDQl9Mb3dlclRyYWNrIDogRldMX1BBUlRfU0NCX1VwcGVyVHJhY2s7DQorICBwYXJhbS5tX2R3U3RhdGVzID0gKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpDQorICAgICAgICAgICAgICAgICAgICAgICAgID8gRldMX1BBUlRTVEFURV9TQ0JfRGlzYWJsZWQNCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAoYkxvd2VyID8gbV9pTWluVHJhY2tTdGF0ZSA6IG1faU1heFRyYWNrU3RhdGUpOw0KKyAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgcGFyYW0ubV9ydFBhcnQgPSBiTG93ZXIgPyBtX3J0TWluVHJhY2sgOiBtX3J0TWF4VHJhY2s7DQorICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorfQ0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXA6OkRyYXdBcnJvd0J0bihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk1pbkJ0biwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBwYXJhbS5tX2lQYXJ0ID0gYk1pbkJ0biA/IEZXTF9QQVJUX1NDQl9Gb3JlQXJyb3cgOiBGV0xfUEFSVF9TQ0JfQmFja0Fycm93Ow0KKyAgcGFyYW0ubV9kd1N0YXRlcyA9IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICA/IEZXTF9QQVJUU1RBVEVfU0NCX0Rpc2FibGVkDQorICAgICAgICAgICAgICAgICAgICAgICAgIDogKGJNaW5CdG4gPyBtX2lNaW5CdXR0b25TdGF0ZSA6IG1faU1heEJ1dHRvblN0YXRlKTsNCisgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgIHBhcmFtLm1fcnRQYXJ0ID0gYk1pbkJ0biA/IG1fcnRNaW5CdG4gOiBtX3J0TWF4QnRuOw0KKyAgaWYgKHBhcmFtLm1fcnRQYXJ0LmhlaWdodCA+IDAgJiYgcGFyYW0ubV9ydFBhcnQud2lkdGggPiAwKSB7DQorICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgIH0NCit9DQordm9pZCBDRldMX1Njcm9sbEJhckltcDo6RHJhd1RodW1iKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgaWYgKCFJc0VuYWJsZWQoKSkgew0KKyAgfQ0KKyAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfU0NCX1RodW1iOw0KKyAgcGFyYW0ubV9kd1N0YXRlcyA9IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICA/IEZXTF9QQVJUU1RBVEVfU0NCX0Rpc2FibGVkDQorICAgICAgICAgICAgICAgICAgICAgICAgIDogbV9pVGh1bWJCdXR0b25TdGF0ZTsNCisgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgIHBhcmFtLm1fcnRQYXJ0ID0gbV9ydFRodW1iOw0KKyAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KK30NCit2b2lkIENGV0xfU2Nyb2xsQmFySW1wOjpMYXlvdXQoKSB7DQorICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICBDRldMX1RoZW1lUGFydCBwYXJ0Ow0KKyAgcGFydC5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBtX2ZNaW5UaHVtYiA9ICpzdGF0aWNfY2FzdDxGWF9GTE9BVCo+KA0KKyAgICAgIHBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9DQVBBQ0lUWV9TQ0JfU2l6ZSkpOw0KKyAgbV9iQ3VzdG9tTGF5b3V0ID0gcFRoZW1lLT5Jc0N1c3RvbWl6ZWRMYXlvdXQobV9wSW50ZXJmYWNlKTsNCisgIEdldENsaWVudFJlY3QobV9ydENsaWVudCk7DQorICBDYWxjQnV0dG9uTGVuKCk7DQorICBDYWxjTWluQnV0dG9uUmVjdChtX3J0TWluQnRuKTsNCisgIENhbGNNYXhCdXR0b25SZWN0KG1fcnRNYXhCdG4pOw0KKyAgQ2FsY1RodW1iQnV0dG9uUmVjdChtX3J0VGh1bWIpOw0KKyAgQ2FsY01pblRyYWNrUmVjdChtX3J0TWluVHJhY2spOw0KKyAgQ2FsY01heFRyYWNrUmVjdChtX3J0TWF4VHJhY2spOw0KK30NCit2b2lkIENGV0xfU2Nyb2xsQmFySW1wOjpDYWxjQnV0dG9uTGVuKCkgew0KKyAgbV9mQnV0dG9uTGVuID0gSXNWZXJ0aWNhbCgpID8gbV9ydENsaWVudC53aWR0aCA6IG1fcnRDbGllbnQuaGVpZ2h0Ow0KKyAgRlhfRkxPQVQgZkxlbmd0aCA9IElzVmVydGljYWwoKSA/IG1fcnRDbGllbnQuaGVpZ2h0IDogbV9ydENsaWVudC53aWR0aDsNCisgIGlmIChmTGVuZ3RoIDwgbV9mQnV0dG9uTGVuICogMikgew0KKyAgICBtX2ZCdXR0b25MZW4gPSBmTGVuZ3RoIC8gMjsNCisgICAgbV9iTWluU2l6ZSA9IFRSVUU7DQorICB9IGVsc2Ugew0KKyAgICBtX2JNaW5TaXplID0gRkFMU0U7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXA6OkNhbGNNaW5CdXR0b25SZWN0KENGWF9SZWN0RiYgcmVjdCkgew0KKyAgaWYgKG1fYkN1c3RvbUxheW91dCkgew0KKyAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICAgIENGV0xfVGhlbWVQYXJ0IHBQYXJ0Ow0KKyAgICBwUGFydC5tX3J0UGFydCA9IG1fcnRNaW5CdG47DQorICAgIHBQYXJ0Lm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgICAgcFBhcnQubV9pUGFydCA9IEZXTF9QQVJUX1NDQl9Gb3JlQXJyb3c7DQorICAgIHBQYXJ0Lm1fZHdTdGF0ZXMgPSAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEZXTF9QQVJUU1RBVEVfU0NCX0Rpc2FibGVkDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX2lNaW5CdXR0b25TdGF0ZTsNCisgICAgcFRoZW1lLT5HZXRQYXJ0UmVjdCgmcFBhcnQsIHJlY3QpOw0KKyAgfSBlbHNlIHsNCisgICAgcmVjdC5sZWZ0ID0gbV9ydENsaWVudC5sZWZ0Ow0KKyAgICByZWN0LnRvcCA9IG1fcnRDbGllbnQudG9wOw0KKyAgICByZWN0LndpZHRoID0gSXNWZXJ0aWNhbCgpID8gbV9ydENsaWVudC53aWR0aCA6IG1fZkJ1dHRvbkxlbjsNCisgICAgcmVjdC5oZWlnaHQgPSBJc1ZlcnRpY2FsKCkgPyBtX2ZCdXR0b25MZW4gOiBtX3J0Q2xpZW50LmhlaWdodDsNCisgIH0NCit9DQordm9pZCBDRldMX1Njcm9sbEJhckltcDo6Q2FsY01heEJ1dHRvblJlY3QoQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBpZiAobV9iQ3VzdG9tTGF5b3V0KSB7DQorICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgICAgQ0ZXTF9UaGVtZVBhcnQgcFBhcnQ7DQorICAgIHBQYXJ0Lm1fcnRQYXJ0ID0gbV9ydE1heEJ0bjsNCisgICAgcFBhcnQubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICBwUGFydC5tX2lQYXJ0ID0gRldMX1BBUlRfU0NCX0JhY2tBcnJvdzsNCisgICAgcFBhcnQubV9kd1N0YXRlcyA9IChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgID8gRldMX1BBUlRTVEFURV9TQ0JfRGlzYWJsZWQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1faU1heEJ1dHRvblN0YXRlOw0KKyAgICBwVGhlbWUtPkdldFBhcnRSZWN0KCZwUGFydCwgcmVjdCk7DQorICB9IGVsc2Ugew0KKyAgICByZWN0LmxlZnQgPQ0KKyAgICAgICAgSXNWZXJ0aWNhbCgpID8gbV9ydENsaWVudC5sZWZ0IDogbV9ydENsaWVudC5yaWdodCgpIC0gbV9mQnV0dG9uTGVuOw0KKyAgICByZWN0LnRvcCA9DQorICAgICAgICBJc1ZlcnRpY2FsKCkgPyBtX3J0Q2xpZW50LmJvdHRvbSgpIC0gbV9mQnV0dG9uTGVuIDogbV9ydENsaWVudC50b3A7DQorICAgIHJlY3Qud2lkdGggPSBJc1ZlcnRpY2FsKCkgPyBtX3J0Q2xpZW50LndpZHRoIDogbV9mQnV0dG9uTGVuOw0KKyAgICByZWN0LmhlaWdodCA9IElzVmVydGljYWwoKSA/IG1fZkJ1dHRvbkxlbiA6IG1fcnRDbGllbnQuaGVpZ2h0Ow0KKyAgfQ0KK30NCit2b2lkIENGV0xfU2Nyb2xsQmFySW1wOjpDYWxjVGh1bWJCdXR0b25SZWN0KENGWF9SZWN0RiYgcmVjdCkgew0KKyAgaWYgKCFJc0VuYWJsZWQoKSkgew0KKyAgICBtX3J0VGh1bWIuUmVzZXQoKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1fYk1pblNpemUpIHsNCisgICAgbV9ydFRodW1iLkVtcHR5KCk7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0ZMT0FUIGZSYW5nZSA9IG1fZlJhbmdlTWF4IC0gbV9mUmFuZ2VNaW47DQorICBtZW1zZXQoJnJlY3QsIDAsIHNpemVvZihDRlhfUmVjdCkpOw0KKyAgaWYgKGZSYW5nZSA8IDApIHsNCisgICAgaWYgKElzVmVydGljYWwoKSkgew0KKyAgICAgIHJlY3QuU2V0KG1fcnRDbGllbnQubGVmdCwgbV9ydE1heEJ0bi5ib3R0b20oKSwgbV9ydENsaWVudC53aWR0aCwgMCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgcmVjdC5TZXQobV9ydE1heEJ0bi5yaWdodCgpLCBtX3J0Q2xpZW50LnRvcCwgMCwgbV9ydENsaWVudC5oZWlnaHQpOw0KKyAgICB9DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9SZWN0RiBydENsaWVudCA9IG1fcnRDbGllbnQ7DQorICBGWF9GTE9BVCBmTGVuZ3RoID0gSXNWZXJ0aWNhbCgpID8gcnRDbGllbnQuaGVpZ2h0IDogcnRDbGllbnQud2lkdGg7DQorICBGWF9GTE9BVCBmU2l6ZSA9IG1fZkJ1dHRvbkxlbjsNCisgIGlmIChtX2JDdXN0b21MYXlvdXQpIHsNCisgICAgaWYgKElzVmVydGljYWwoKSkgew0KKyAgICAgIGZMZW5ndGggPSBmTGVuZ3RoIC0gbV9ydE1pbkJ0bi5oZWlnaHQgLSBtX3J0TWF4QnRuLmhlaWdodDsNCisgICAgICBpZiAoZkxlbmd0aCA8IG1fcnRNaW5CdG4uaGVpZ2h0IHx8IGZMZW5ndGggPCBtX3J0TWF4QnRuLmhlaWdodCkgew0KKyAgICAgICAgZkxlbmd0aCA9IDAuMGY7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGZMZW5ndGggPSBmTGVuZ3RoIC0gbV9ydE1pbkJ0bi53aWR0aCAtIG1fcnRNYXhCdG4ud2lkdGg7DQorICAgICAgaWYgKGZMZW5ndGggPCBtX3J0TWluQnRuLndpZHRoIHx8IGZMZW5ndGggPCBtX3J0TWF4QnRuLndpZHRoKSB7DQorICAgICAgICBmTGVuZ3RoID0gMC4wZjsNCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGZMZW5ndGggLT0gZlNpemUgKiAyLjBmOw0KKyAgICBpZiAoZkxlbmd0aCA8IGZTaXplKSB7DQorICAgICAgZkxlbmd0aCA9IDAuMGY7DQorICAgIH0NCisgIH0NCisgIEZYX0ZMT0FUIGZUaHVtYlNpemUgPSBmTGVuZ3RoICogZkxlbmd0aCAvIChmUmFuZ2UgKyBmTGVuZ3RoKTsNCisgIGlmIChmVGh1bWJTaXplIDwgbV9mTWluVGh1bWIpIHsNCisgICAgZlRodW1iU2l6ZSA9IG1fZk1pblRodW1iOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZkRpZmYgPSBmTGVuZ3RoIC0gZlRodW1iU2l6ZTsNCisgIGlmIChmRGlmZiA8IDAuMGYpIHsNCisgICAgZkRpZmYgPSAwLjBmOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZlRyYWNrUG9zID0gbV9mVHJhY2tQb3M7DQorICBpZiAoZlRyYWNrUG9zID4gbV9mUmFuZ2VNYXgpIHsNCisgICAgZlRyYWNrUG9zID0gbV9mUmFuZ2VNYXg7DQorICB9DQorICBpZiAoZlRyYWNrUG9zIDwgbV9mUmFuZ2VNaW4pIHsNCisgICAgZlRyYWNrUG9zID0gbV9mUmFuZ2VNaW47DQorICB9DQorICBpZiAoIWZSYW5nZSkNCisgICAgcmV0dXJuOw0KKyAgaWYgKG1fYkN1c3RvbUxheW91dCkgew0KKyAgICBGWF9GTE9BVCBpUG9zID0gZkRpZmYgKiAoZlRyYWNrUG9zIC0gbV9mUmFuZ2VNaW4pIC8gZlJhbmdlOw0KKyAgICByZWN0LmxlZnQgPSBydENsaWVudC5sZWZ0Ow0KKyAgICBpZiAoIUlzVmVydGljYWwoKSkgew0KKyAgICAgIGlmICgobV9ydE1pbkJ0bi5yaWdodCgpID09IG1fcnRNYXhCdG4ubGVmdCAmJiBtX3J0TWluQnRuLndpZHRoID4gMCAmJg0KKyAgICAgICAgICAgbV9ydE1heEJ0bi53aWR0aCA+IDApIHx8DQorICAgICAgICAgICgwID09IG1fcnRNaW5CdG4ud2lkdGggJiYgMCA9PSBtX3J0TWF4QnRuLndpZHRoKSkgew0KKyAgICAgICAgcmVjdC5sZWZ0ICs9IGlQb3M7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJlY3QubGVmdCArPSBtX3J0TWluQnRuLnJpZ2h0KCkgKyBpUG9zOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICByZWN0LnRvcCA9IHJ0Q2xpZW50LnRvcDsNCisgICAgaWYgKElzVmVydGljYWwoKSkgew0KKyAgICAgIGlmICgobV9ydE1pbkJ0bi5ib3R0b20oKSA9PSBtX3J0TWF4QnRuLnRvcCAmJiBtX3J0TWluQnRuLmhlaWdodCA+IDAgJiYNCisgICAgICAgICAgIG1fcnRNYXhCdG4uaGVpZ2h0ID4gMCkgfHwNCisgICAgICAgICAgKDAgPT0gbV9ydE1pbkJ0bi5oZWlnaHQgJiYgMCA9PSBtX3J0TWF4QnRuLmhlaWdodCkpIHsNCisgICAgICAgIHJlY3QudG9wICs9IGlQb3M7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJlY3QudG9wICs9IG1fcnRNaW5CdG4uYm90dG9tKCkgKyBpUG9zOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICByZWN0LndpZHRoID0gSXNWZXJ0aWNhbCgpID8gcnRDbGllbnQud2lkdGggOiBmVGh1bWJTaXplOw0KKyAgICByZWN0LmhlaWdodCA9IElzVmVydGljYWwoKSA/IGZUaHVtYlNpemUgOiBydENsaWVudC5oZWlnaHQ7DQorICB9IGVsc2Ugew0KKyAgICBGWF9GTE9BVCBpUG9zID0gZlNpemUgKyBmRGlmZiAqIChmVHJhY2tQb3MgLSBtX2ZSYW5nZU1pbikgLyBmUmFuZ2U7DQorICAgIHJlY3QubGVmdCA9IHJ0Q2xpZW50LmxlZnQ7DQorICAgIGlmICghSXNWZXJ0aWNhbCgpKSB7DQorICAgICAgcmVjdC5sZWZ0ICs9IGlQb3M7DQorICAgIH0NCisgICAgcmVjdC50b3AgPSBydENsaWVudC50b3A7DQorICAgIGlmIChJc1ZlcnRpY2FsKCkpIHsNCisgICAgICByZWN0LnRvcCArPSBpUG9zOw0KKyAgICB9DQorICAgIHJlY3Qud2lkdGggPSBJc1ZlcnRpY2FsKCkgPyBydENsaWVudC53aWR0aCA6IGZUaHVtYlNpemU7DQorICAgIHJlY3QuaGVpZ2h0ID0gSXNWZXJ0aWNhbCgpID8gZlRodW1iU2l6ZSA6IHJ0Q2xpZW50LmhlaWdodDsNCisgIH0NCit9DQordm9pZCBDRldMX1Njcm9sbEJhckltcDo6Q2FsY01pblRyYWNrUmVjdChDRlhfUmVjdEYmIHJlY3QpIHsNCisgIGlmIChtX2JNaW5TaXplKSB7DQorICAgIHJlY3QuRW1wdHkoKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZkJvdHRvbSA9IG1fcnRUaHVtYi5ib3R0b20oKTsNCisgIEZYX0ZMT0FUIGZSaWdodCA9IG1fcnRUaHVtYi5yaWdodCgpOw0KKyAgRlhfRkxPQVQgaXggPSAobV9ydFRodW1iLmxlZnQgKyBmUmlnaHQpIC8gMjsNCisgIEZYX0ZMT0FUIGl5ID0gKG1fcnRUaHVtYi50b3AgKyBmQm90dG9tKSAvIDI7DQorICByZWN0LmxlZnQgPSBtX3J0Q2xpZW50LmxlZnQ7DQorICByZWN0LnRvcCA9IG1fcnRDbGllbnQudG9wOw0KKyAgRlhfQk9PTCBiVmVydGljYWwgPSBJc1ZlcnRpY2FsKCk7DQorICByZWN0LndpZHRoID0gYlZlcnRpY2FsID8gbV9ydENsaWVudC53aWR0aCA6IGl4Ow0KKyAgcmVjdC5oZWlnaHQgPSBiVmVydGljYWwgPyBpeSA6IG1fcnRDbGllbnQuaGVpZ2h0Ow0KKyAgaWYgKG1fYkN1c3RvbUxheW91dCkgew0KKyAgICBpZiAoYlZlcnRpY2FsKSB7DQorICAgICAgaWYgKDAgPT0gbV9ydE1pbkJ0bi5oZWlnaHQgJiYgMCA9PSBtX3J0TWF4QnRuLmhlaWdodCkgew0KKyAgICAgICAgcmVjdC50b3AgPSBtX3J0Q2xpZW50LnRvcDsNCisgICAgICB9IGVsc2UgaWYgKG1fcnRNaW5CdG4udG9wIDwgbV9ydFRodW1iLnRvcCkgew0KKyAgICAgICAgcmVjdC50b3AgPSBtX3J0TWluQnRuLmJvdHRvbSgpOw0KKyAgICAgICAgcmVjdC5oZWlnaHQgLT0gKG1fcnRNaW5CdG4uYm90dG9tKCkgLSBtX3J0Q2xpZW50LnRvcCk7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmICgwID09IG1fcnRNaW5CdG4ud2lkdGggJiYgMCA9PSBtX3J0TWF4QnRuLndpZHRoKSB7DQorICAgICAgICByZWN0LmxlZnQgPSBtX3J0Q2xpZW50LmxlZnQ7DQorICAgICAgfSBlbHNlIGlmIChtX3J0TWluQnRuLmxlZnQgPCBtX3J0VGh1bWIubGVmdCkgew0KKyAgICAgICAgcmVjdC5sZWZ0ID0gbV9ydE1pbkJ0bi5yaWdodCgpOw0KKyAgICAgICAgcmVjdC53aWR0aCAtPSAobV9ydE1pbkJ0bi5yaWdodCgpIC0gbV9ydENsaWVudC5sZWZ0KTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDRldMX1Njcm9sbEJhckltcDo6Q2FsY01heFRyYWNrUmVjdChDRlhfUmVjdEYmIHJlY3QpIHsNCisgIGlmIChtX2JNaW5TaXplKSB7DQorICAgIHJlY3QuRW1wdHkoKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfRkxPQVQgaXggPSAobV9ydFRodW1iLmxlZnQgKyBtX3J0VGh1bWIucmlnaHQoKSkgLyAyOw0KKyAgRlhfRkxPQVQgaXkgPSAobV9ydFRodW1iLnRvcCArIG1fcnRUaHVtYi5ib3R0b20oKSkgLyAyOw0KKyAgRlhfQk9PTCBiVmVydGljYWwgPSBJc1ZlcnRpY2FsKCk7DQorICByZWN0LmxlZnQgPSBiVmVydGljYWwgPyBtX3J0Q2xpZW50LmxlZnQgOiBpeDsNCisgIHJlY3QudG9wID0gYlZlcnRpY2FsID8gaXkgOiBtX3J0Q2xpZW50LnRvcDsNCisgIHJlY3Qud2lkdGggPSBiVmVydGljYWwgPyBtX3J0Q2xpZW50LndpZHRoIDogbV9ydENsaWVudC5yaWdodCgpIC0gaXg7DQorICByZWN0LmhlaWdodCA9IGJWZXJ0aWNhbCA/IG1fcnRDbGllbnQuYm90dG9tKCkgLSBpeSA6IG1fcnRDbGllbnQuaGVpZ2h0Ow0KKyAgaWYgKG1fYkN1c3RvbUxheW91dCkgew0KKyAgICBpZiAoYlZlcnRpY2FsKSB7DQorICAgICAgaWYgKG1fcnRNaW5CdG4udG9wID4gbV9ydFRodW1iLnRvcCAmJiBtX3J0TWluQnRuLmhlaWdodCA+IDAgJiYNCisgICAgICAgICAgbV9ydE1heEJ0bi5oZWlnaHQgPiAwKSB7DQorICAgICAgICByZWN0LmhlaWdodCAtPSAobV9ydENsaWVudC5ib3R0b20oKSAtIG1fcnRNaW5CdG4udG9wKTsNCisgICAgICB9IGVsc2UgaWYgKG1fcnRNaW5CdG4uaGVpZ2h0ID4gMCAmJiBtX3J0TWF4QnRuLmhlaWdodCA+IDApIHsNCisgICAgICAgIHJlY3QuaGVpZ2h0IC09IChtX3J0Q2xpZW50LmJvdHRvbSgpIC0gbV9ydE1heEJ0bi50b3ApOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAobV9ydE1pbkJ0bi5sZWZ0ID4gbV9ydFRodW1iLmxlZnQgJiYgbV9ydE1pbkJ0bi53aWR0aCA+IDAgJiYNCisgICAgICAgICAgbV9ydE1heEJ0bi53aWR0aCA+IDApIHsNCisgICAgICAgIHJlY3Qud2lkdGggLT0gKG1fcnRDbGllbnQucmlnaHQoKSAtIG1fcnRNaW5CdG4ubGVmdCk7DQorICAgICAgfSBlbHNlIGlmIChtX3J0TWluQnRuLndpZHRoID4gMCAmJiBtX3J0TWF4QnRuLndpZHRoID4gMCkgew0KKyAgICAgICAgcmVjdC53aWR0aCAtPSAobV9ydENsaWVudC5yaWdodCgpIC0gbV9ydE1heEJ0bi5sZWZ0KTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCit9DQorRlhfRkxPQVQgQ0ZXTF9TY3JvbGxCYXJJbXA6OkdldFRyYWNrUG9pbnRQb3MoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSB7DQorICBGWF9GTE9BVCBmRGlmZlggPSBmeCAtIG1fY3BUcmFja1BvaW50WDsNCisgIEZYX0ZMT0FUIGZEaWZmWSA9IGZ5IC0gbV9jcFRyYWNrUG9pbnRZOw0KKyAgRlhfRkxPQVQgZlJhbmdlID0gbV9mUmFuZ2VNYXggLSBtX2ZSYW5nZU1pbjsNCisgIEZYX0ZMT0FUIGZQb3M7DQorICBpZiAobV9iQ3VzdG9tTGF5b3V0KSB7DQorICAgIGlmIChJc1ZlcnRpY2FsKCkpIHsNCisgICAgICBpZiAoMCA9PSBtX3J0TWluQnRuLmhlaWdodCAmJiAwID09IG1fcnRNYXhCdG4uaGVpZ2h0KSB7DQorICAgICAgICBmUG9zID0gZlJhbmdlICogZkRpZmZZIC8gKG1fcnRDbGllbnQuaGVpZ2h0IC0gbV9ydFRodW1iLmhlaWdodCk7DQorICAgICAgfSBlbHNlIGlmIChtX3J0TWluQnRuLmJvdHRvbSgpID09IG1fcnRNYXhCdG4udG9wKSB7DQorICAgICAgICBmUG9zID0gZlJhbmdlICogZkRpZmZZIC8NCisgICAgICAgICAgICAgICAobV9ydE1pbkJ0bi50b3AgLSBtX3J0Q2xpZW50LnRvcCAtIG1fcnRUaHVtYi5oZWlnaHQpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBmUG9zID0gZlJhbmdlICogZkRpZmZZIC8NCisgICAgICAgICAgICAgICAobV9ydE1heEJ0bi50b3AgLSBtX3J0TWluQnRuLmJvdHRvbSgpIC0gbV9ydFRodW1iLmhlaWdodCk7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmICgwID09IG1fcnRNaW5CdG4ud2lkdGggJiYgMCA9PSBtX3J0TWF4QnRuLndpZHRoKSB7DQorICAgICAgICBmUG9zID0gZlJhbmdlICogZkRpZmZYIC8gKG1fcnRDbGllbnQud2lkdGggLSBtX3J0VGh1bWIud2lkdGgpOw0KKyAgICAgIH0gZWxzZSBpZiAobV9ydE1pbkJ0bi5yaWdodCgpID09IG1fcnRNYXhCdG4ubGVmdCkgew0KKyAgICAgICAgZlBvcyA9IGZSYW5nZSAqIGZEaWZmWCAvDQorICAgICAgICAgICAgICAgKG1fcnRNaW5CdG4ubGVmdCAtIG1fcnRDbGllbnQubGVmdCAtIG1fcnRUaHVtYi53aWR0aCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGZQb3MgPSBmUmFuZ2UgKiBmRGlmZlggLw0KKyAgICAgICAgICAgICAgIChtX3J0TWF4QnRuLmxlZnQgLSBtX3J0TWluQnRuLnJpZ2h0KCkgLSBtX3J0VGh1bWIud2lkdGgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgaWYgKElzVmVydGljYWwoKSkgew0KKyAgICAgIGZQb3MgPSBmUmFuZ2UgKiBmRGlmZlkgLw0KKyAgICAgICAgICAgICAobV9ydE1heEJ0bi50b3AgLSBtX3J0TWluQnRuLmJvdHRvbSgpIC0gbV9ydFRodW1iLmhlaWdodCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgZlBvcyA9IGZSYW5nZSAqIGZEaWZmWCAvDQorICAgICAgICAgICAgIChtX3J0TWF4QnRuLmxlZnQgLSBtX3J0TWluQnRuLnJpZ2h0KCkgLSBtX3J0VGh1bWIud2lkdGgpOw0KKyAgICB9DQorICB9DQorICBmUG9zICs9IG1fZkxhc3RUcmFja1BvczsNCisgIGlmIChmUG9zIDwgbV9mUmFuZ2VNaW4pIHsNCisgICAgZlBvcyA9IG1fZlJhbmdlTWluOw0KKyAgfQ0KKyAgaWYgKGZQb3MgPiBtX2ZSYW5nZU1heCkgew0KKyAgICBmUG9zID0gbV9mUmFuZ2VNYXg7DQorICB9DQorICByZXR1cm4gZlBvczsNCit9DQordm9pZCBDRldMX1Njcm9sbEJhckltcDo6R2V0VHJhY2tSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiTG93ZXIpIHsNCisgIEZYX0JPT0wgYkRpc2FibGVkID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZDsNCisgIGlmIChiRGlzYWJsZWQgfHwgbV9iQ3VzdG9tTGF5b3V0KSB7DQorICAgIHJlY3QgPSBiTG93ZXIgPyBtX3J0TWluVHJhY2sgOiBtX3J0TWF4VHJhY2s7DQorICB9IGVsc2Ugew0KKyAgICBGWF9GTE9BVCBmVyA9IG1fcnRUaHVtYi53aWR0aCAvIDI7DQorICAgIEZYX0ZMT0FUIGZIID0gbV9ydFRodW1iLmhlaWdodCAvIDI7DQorICAgIEZYX0JPT0wgYlZlcnQgPSBJc1ZlcnRpY2FsKCk7DQorICAgIGlmIChiTG93ZXIpIHsNCisgICAgICBpZiAoYlZlcnQpIHsNCisgICAgICAgIEZYX0ZMT0FUIGZNaW5UcmFja0hlaWdodCA9IG1fcnRNaW5UcmFjay5oZWlnaHQgLSBmSCAtIG1fcnRNaW5CdG4uaGVpZ2h0Ow0KKyAgICAgICAgZk1pblRyYWNrSGVpZ2h0ID0gKGZNaW5UcmFja0hlaWdodCA+PSAwLjBmKSA/IGZNaW5UcmFja0hlaWdodCA6IDAuMGY7DQorICAgICAgICByZWN0LlNldChtX3J0TWluVHJhY2subGVmdCwgbV9ydE1pblRyYWNrLnRvcCArIG1fcnRNaW5CdG4uaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgbV9ydE1pblRyYWNrLndpZHRoLCBmTWluVHJhY2tIZWlnaHQpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBGWF9GTE9BVCBmTWluVHJhY2tXaWR0aCA9DQorICAgICAgICAgICAgbV9ydE1pblRyYWNrLndpZHRoIC0gZlcgLSBtX3J0TWluQnRuLndpZHRoICsgMjsNCisgICAgICAgIGZNaW5UcmFja1dpZHRoID0gKGZNaW5UcmFja1dpZHRoID49IDAuMGYpID8gZk1pblRyYWNrV2lkdGggOiAwLjBmOw0KKyAgICAgICAgcmVjdC5TZXQobV9ydE1pblRyYWNrLmxlZnQgKyBtX3J0TWluQnRuLndpZHRoIC0gMSwgbV9ydE1pblRyYWNrLnRvcCwNCisgICAgICAgICAgICAgICAgIGZNaW5UcmFja1dpZHRoLCBtX3J0TWluVHJhY2suaGVpZ2h0KTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKGJWZXJ0KSB7DQorICAgICAgICBGWF9GTE9BVCBmTWF4VHJhY2tIZWlnaHQgPSBtX3J0TWF4VHJhY2suaGVpZ2h0IC0gZkggLSBtX3J0TWF4QnRuLmhlaWdodDsNCisgICAgICAgIGZNYXhUcmFja0hlaWdodCA9IChmTWF4VHJhY2tIZWlnaHQgPj0gMC4wZikgPyBmTWF4VHJhY2tIZWlnaHQgOiAwLjBmOw0KKyAgICAgICAgcmVjdC5TZXQobV9ydE1heFRyYWNrLmxlZnQsIG1fcnRNYXhUcmFjay50b3AgKyBmSCwgbV9ydE1heFRyYWNrLndpZHRoLA0KKyAgICAgICAgICAgICAgICAgZk1heFRyYWNrSGVpZ2h0KTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfRkxPQVQgZk1heFRyYWNrV2lkdGggPQ0KKyAgICAgICAgICAgIG1fcnRNYXhUcmFjay53aWR0aCAtIGZXIC0gbV9ydE1heEJ0bi53aWR0aCArIDI7DQorICAgICAgICBmTWF4VHJhY2tXaWR0aCA9IChmTWF4VHJhY2tXaWR0aCA+PSAwLjBmKSA/IGZNYXhUcmFja1dpZHRoIDogMC4wZjsNCisgICAgICAgIHJlY3QuU2V0KG1fcnRNYXhUcmFjay5sZWZ0ICsgZlcsIG1fcnRNYXhUcmFjay50b3AsIGZNYXhUcmFja1dpZHRoLA0KKyAgICAgICAgICAgICAgICAgbV9ydE1heFRyYWNrLmhlaWdodCk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9TY3JvbGxCYXJJbXA6OlNlbmRFdmVudCgpIHsNCisgIGlmIChtX2lNaW5CdXR0b25TdGF0ZSA9PSBGV0xfUEFSVFNUQVRFX1NDQl9QcmVzc2VkKSB7DQorICAgIERvU2Nyb2xsKEZXTF9TQ0JDT0RFX1N0ZXBCYWNrd2FyZCwgbV9mVHJhY2tQb3MpOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAobV9pTWF4QnV0dG9uU3RhdGUgPT0gRldMX1BBUlRTVEFURV9TQ0JfUHJlc3NlZCkgew0KKyAgICBEb1Njcm9sbChGV0xfU0NCQ09ERV9TdGVwRm9yd2FyZCwgbV9mVHJhY2tQb3MpOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAobV9pTWluVHJhY2tTdGF0ZSA9PSBGV0xfUEFSVFNUQVRFX1NDQl9QcmVzc2VkKSB7DQorICAgIERvU2Nyb2xsKEZXTF9TQ0JDT0RFX1BhZ2VCYWNrd2FyZCwgbV9mVHJhY2tQb3MpOw0KKyAgICByZXR1cm4gbV9ydFRodW1iLkNvbnRhaW5zKG1fY3BUcmFja1BvaW50WCwgbV9jcFRyYWNrUG9pbnRZKTsNCisgIH0NCisgIGlmIChtX2lNYXhUcmFja1N0YXRlID09IEZXTF9QQVJUU1RBVEVfU0NCX1ByZXNzZWQpIHsNCisgICAgRG9TY3JvbGwoRldMX1NDQkNPREVfUGFnZUZvcndhcmQsIG1fZlRyYWNrUG9zKTsNCisgICAgcmV0dXJuIG1fcnRUaHVtYi5Db250YWlucyhtX2NwVHJhY2tQb2ludFgsIG1fY3BUcmFja1BvaW50WSk7DQorICB9DQorICBpZiAobV9pTW91c2VXaGVlbCkgew0KKyAgICBGWF9XT1JEIGR3Q29kZSA9DQorICAgICAgICBtX2lNb3VzZVdoZWVsIDwgMCA/IEZXTF9TQ0JDT0RFX1N0ZXBGb3J3YXJkIDogRldMX1NDQkNPREVfU3RlcEJhY2t3YXJkOw0KKyAgICBEb1Njcm9sbChkd0NvZGUsIG1fZlRyYWNrUG9zKTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGV0xfU2Nyb2xsQmFySW1wOjpPblNjcm9sbChGWF9EV09SRCBkd0NvZGUsIEZYX0ZMT0FUIGZQb3MpIHsNCisgIEZYX0JPT0wgYlJldCA9IFRSVUU7DQorICBDRldMX0V2dFNjcm9sbCBldjsNCisgIGV2Lm1faVNjcm9sbENvZGUgPSBkd0NvZGU7DQorICBldi5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBldi5tX2ZQb3MgPSBmUG9zOw0KKyAgZXYubV9wUmV0ID0gJmJSZXQ7DQorICBEaXNwYXRjaEV2ZW50KCZldik7DQorICByZXR1cm4gYlJldDsNCit9DQorQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZTo6Q0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZShDRldMX1Njcm9sbEJhckltcCogcE93bmVyKQ0KKyAgICA6IG1fcE93bmVyKHBPd25lcikge30NCitpbnQzMl90IENGV0xfU2Nyb2xsQmFySW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgaWYgKCFwTWVzc2FnZSkNCisgICAgcmV0dXJuIDA7DQorICBpbnQzMl90IGlSZXQgPSAxOw0KKyAgRlhfRFdPUkQgZHdNc2dDb2RlID0gcE1lc3NhZ2UtPkdldENsYXNzSUQoKTsNCisgIGlmIChkd01zZ0NvZGUgPT0gRldMX01TR0hBU0hfTW91c2UpIHsNCisgICAgQ0ZXTF9Nc2dNb3VzZSogcE1zZyA9IHN0YXRpY19jYXN0PENGV0xfTXNnTW91c2UqPihwTWVzc2FnZSk7DQorICAgIEZYX0RXT1JEIGR3Q21kID0gcE1zZy0+bV9kd0NtZDsNCisgICAgc3dpdGNoIChkd0NtZCkgew0KKyAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duOiB7DQorICAgICAgICBPbkxCdXR0b25Eb3duKHBNc2ctPm1fZHdGbGFncywgcE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvblVwOiB7DQorICAgICAgICBPbkxCdXR0b25VcChwTXNnLT5tX2R3RmxhZ3MsIHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX01vdXNlTW92ZTogew0KKyAgICAgICAgT25Nb3VzZU1vdmUocE1zZy0+bV9kd0ZsYWdzLCBwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlOiB7DQorICAgICAgICBPbk1vdXNlTGVhdmUoKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBkZWZhdWx0OiB7IGlSZXQgPSAwOyB9DQorICAgIH0NCisgIH0gZWxzZSBpZiAoZHdNc2dDb2RlID09IEZXTF9NU0dIQVNIX01vdXNlV2hlZWwpIHsNCisgICAgQ0ZXTF9Nc2dNb3VzZVdoZWVsKiBwTXNnID0gc3RhdGljX2Nhc3Q8Q0ZXTF9Nc2dNb3VzZVdoZWVsKj4ocE1lc3NhZ2UpOw0KKyAgICBPbk1vdXNlV2hlZWwocE1zZy0+bV9meCwgcE1zZy0+bV9meSwgcE1zZy0+bV9kd0ZsYWdzLCBwTXNnLT5tX2ZEZWx0YVgsDQorICAgICAgICAgICAgICAgICBwTXNnLT5tX2ZEZWx0YVkpOw0KKyAgfSBlbHNlIHsNCisgICAgaVJldCA9IDA7DQorICB9DQorICByZXR1cm4gaVJldDsNCit9DQorRldMX0VSUiBDRldMX1Njcm9sbEJhckltcERlbGVnYXRlOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgcmV0dXJuIG1fcE93bmVyLT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorfQ0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZTo6T25MQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIGlmICghbV9wT3duZXItPklzRW5hYmxlZCgpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIG1fcE93bmVyLT5tX2JNb3VzZURvd24gPSBUUlVFOw0KKyAgbV9wT3duZXItPlNldEdyYWIoVFJVRSk7DQorICBtX3BPd25lci0+bV9jcFRyYWNrUG9pbnRYID0gZng7DQorICBtX3BPd25lci0+bV9jcFRyYWNrUG9pbnRZID0gZnk7DQorICBtX3BPd25lci0+bV9mTGFzdFRyYWNrUG9zID0gbV9wT3duZXItPm1fZlRyYWNrUG9zOw0KKyAgaWYgKG1fcE93bmVyLT5tX3J0TWluQnRuLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgRG9Nb3VzZURvd24oMCwgbV9wT3duZXItPm1fcnRNaW5CdG4sIG1fcE93bmVyLT5tX2lNaW5CdXR0b25TdGF0ZSwgZngsIGZ5KTsNCisgIH0gZWxzZSB7DQorICAgIGlmIChtX3BPd25lci0+bV9ydFRodW1iLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICBEb01vdXNlRG93bigxLCBtX3BPd25lci0+bV9ydFRodW1iLCBtX3BPd25lci0+bV9pVGh1bWJCdXR0b25TdGF0ZSwgZngsDQorICAgICAgICAgICAgICAgICAgZnkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChtX3BPd25lci0+bV9ydE1heEJ0bi5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgICBEb01vdXNlRG93bigyLCBtX3BPd25lci0+bV9ydE1heEJ0biwgbV9wT3duZXItPm1faU1heEJ1dHRvblN0YXRlLCBmeCwNCisgICAgICAgICAgICAgICAgICAgIGZ5KTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKG1fcE93bmVyLT5tX3J0TWluVHJhY2suQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgICAgICBEb01vdXNlRG93bigzLCBtX3BPd25lci0+bV9ydE1pblRyYWNrLCBtX3BPd25lci0+bV9pTWluVHJhY2tTdGF0ZSwgZngsDQorICAgICAgICAgICAgICAgICAgICAgIGZ5KTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIERvTW91c2VEb3duKDQsIG1fcE93bmVyLT5tX3J0TWF4VHJhY2ssIG1fcE93bmVyLT5tX2lNYXhUcmFja1N0YXRlLCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgZnkpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKCFtX3BPd25lci0+U2VuZEV2ZW50KCkpIHsNCisgICAgbV9wT3duZXItPm1faFRpbWVyID0gRldMX1N0YXJ0VGltZXIobV9wT3duZXIsIEZXTF9TQ1JPTExCQVJfRWxhcHNlKTsNCisgIH0NCit9DQordm9pZCBDRldMX1Njcm9sbEJhckltcERlbGVnYXRlOjpPbkxCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgRldMX1N0b3BUaW1lcihtX3BPd25lci0+bV9oVGltZXIpOw0KKyAgbV9wT3duZXItPm1fYk1vdXNlRG93biA9IEZBTFNFOw0KKyAgRG9Nb3VzZVVwKDAsIG1fcE93bmVyLT5tX3J0TWluQnRuLCBtX3BPd25lci0+bV9pTWluQnV0dG9uU3RhdGUsIGZ4LCBmeSk7DQorICBEb01vdXNlVXAoMSwgbV9wT3duZXItPm1fcnRUaHVtYiwgbV9wT3duZXItPm1faVRodW1iQnV0dG9uU3RhdGUsIGZ4LCBmeSk7DQorICBEb01vdXNlVXAoMiwgbV9wT3duZXItPm1fcnRNYXhCdG4sIG1fcE93bmVyLT5tX2lNYXhCdXR0b25TdGF0ZSwgZngsIGZ5KTsNCisgIERvTW91c2VVcCgzLCBtX3BPd25lci0+bV9ydE1pblRyYWNrLCBtX3BPd25lci0+bV9pTWluVHJhY2tTdGF0ZSwgZngsIGZ5KTsNCisgIERvTW91c2VVcCg0LCBtX3BPd25lci0+bV9ydE1heFRyYWNrLCBtX3BPd25lci0+bV9pTWF4VHJhY2tTdGF0ZSwgZngsIGZ5KTsNCisgIG1fcE93bmVyLT5TZXRHcmFiKEZBTFNFKTsNCit9DQordm9pZCBDRldMX1Njcm9sbEJhckltcERlbGVnYXRlOjpPbk1vdXNlTW92ZShGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgRG9Nb3VzZU1vdmUoMCwgbV9wT3duZXItPm1fcnRNaW5CdG4sIG1fcE93bmVyLT5tX2lNaW5CdXR0b25TdGF0ZSwgZngsIGZ5KTsNCisgIERvTW91c2VNb3ZlKDEsIG1fcE93bmVyLT5tX3J0VGh1bWIsIG1fcE93bmVyLT5tX2lUaHVtYkJ1dHRvblN0YXRlLCBmeCwgZnkpOw0KKyAgRG9Nb3VzZU1vdmUoMiwgbV9wT3duZXItPm1fcnRNYXhCdG4sIG1fcE93bmVyLT5tX2lNYXhCdXR0b25TdGF0ZSwgZngsIGZ5KTsNCisgIERvTW91c2VNb3ZlKDMsIG1fcE93bmVyLT5tX3J0TWluVHJhY2ssIG1fcE93bmVyLT5tX2lNaW5UcmFja1N0YXRlLCBmeCwgZnkpOw0KKyAgRG9Nb3VzZU1vdmUoNCwgbV9wT3duZXItPm1fcnRNYXhUcmFjaywgbV9wT3duZXItPm1faU1heFRyYWNrU3RhdGUsIGZ4LCBmeSk7DQorfQ0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZTo6T25Nb3VzZUxlYXZlKCkgew0KKyAgRG9Nb3VzZUxlYXZlKDAsIG1fcE93bmVyLT5tX3J0TWluQnRuLCBtX3BPd25lci0+bV9pTWluQnV0dG9uU3RhdGUpOw0KKyAgRG9Nb3VzZUxlYXZlKDEsIG1fcE93bmVyLT5tX3J0VGh1bWIsIG1fcE93bmVyLT5tX2lUaHVtYkJ1dHRvblN0YXRlKTsNCisgIERvTW91c2VMZWF2ZSgyLCBtX3BPd25lci0+bV9ydE1heEJ0biwgbV9wT3duZXItPm1faU1heEJ1dHRvblN0YXRlKTsNCisgIERvTW91c2VMZWF2ZSgzLCBtX3BPd25lci0+bV9ydE1pblRyYWNrLCBtX3BPd25lci0+bV9pTWluVHJhY2tTdGF0ZSk7DQorICBEb01vdXNlTGVhdmUoNCwgbV9wT3duZXItPm1fcnRNYXhUcmFjaywgbV9wT3duZXItPm1faU1heFRyYWNrU3RhdGUpOw0KK30NCit2b2lkIENGV0xfU2Nyb2xsQmFySW1wRGVsZWdhdGU6Ok9uTW91c2VXaGVlbChGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZEZWx0YVgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkRlbHRhWSkgew0KKyAgbV9wT3duZXItPm1faU1vdXNlV2hlZWwgPSAoaW50MzJfdClmRGVsdGFYOw0KKyAgbV9wT3duZXItPlNlbmRFdmVudCgpOw0KKyAgbV9wT3duZXItPm1faU1vdXNlV2hlZWwgPSAwOw0KK30NCit2b2lkIENGV0xfU2Nyb2xsQmFySW1wRGVsZWdhdGU6OkRvTW91c2VEb3duKGludDMyX3QgaUl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0SXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIGlmICghcnRJdGVtLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKGlTdGF0ZSA9PSBGV0xfUEFSVFNUQVRFX1NDQl9QcmVzc2VkKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlTdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU0NCX1ByZXNzZWQ7DQorICBtX3BPd25lci0+UmVwYWludCgmcnRJdGVtKTsNCit9DQordm9pZCBDRldMX1Njcm9sbEJhckltcERlbGVnYXRlOjpEb01vdXNlVXAoaW50MzJfdCBpSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0SXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpU3RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIGludDMyX3QgaU5ld1N0YXRlID0gcnRJdGVtLkNvbnRhaW5zKGZ4LCBmeSkgPyBGV0xfUEFSVFNUQVRFX1NDQl9Ib3ZlcmVkDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRldMX1BBUlRTVEFURV9TQ0JfTm9ybWFsOw0KKyAgaWYgKGlTdGF0ZSA9PSBpTmV3U3RhdGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaVN0YXRlID0gaU5ld1N0YXRlOw0KKyAgbV9wT3duZXItPlJlcGFpbnQoJnJ0SXRlbSk7DQorICBtX3BPd25lci0+T25TY3JvbGwoRldMX1NDQkNPREVfRW5kU2Nyb2xsLCBtX3BPd25lci0+bV9mVHJhY2tQb3MpOw0KK30NCit2b2lkIENGV0xfU2Nyb2xsQmFySW1wRGVsZWdhdGU6OkRvTW91c2VNb3ZlKGludDMyX3QgaUl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0SXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIGlmICghbV9wT3duZXItPm1fYk1vdXNlRG93bikgew0KKyAgICBpbnQzMl90IGlOZXdTdGF0ZSA9IHJ0SXRlbS5Db250YWlucyhmeCwgZnkpID8gRldMX1BBUlRTVEFURV9TQ0JfSG92ZXJlZA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRldMX1BBUlRTVEFURV9TQ0JfTm9ybWFsOw0KKyAgICBpZiAoaVN0YXRlID09IGlOZXdTdGF0ZSkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpU3RhdGUgPSBpTmV3U3RhdGU7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZydEl0ZW0pOw0KKyAgfSBlbHNlIGlmICgoMiA9PSBpSXRlbSkgJiYNCisgICAgICAgICAgICAgKG1fcE93bmVyLT5tX2lUaHVtYkJ1dHRvblN0YXRlID09IEZXTF9QQVJUU1RBVEVfU0NCX1ByZXNzZWQpKSB7DQorICAgIEZYX0ZMT0FUIGZQb3MgPSBtX3BPd25lci0+R2V0VHJhY2tQb2ludFBvcyhmeCwgZnkpOw0KKyAgICBtX3BPd25lci0+bV9mVHJhY2tQb3MgPSBmUG9zOw0KKyAgICBtX3BPd25lci0+T25TY3JvbGwoRldMX1NDQkNPREVfVHJhY2tQb3MsIGZQb3MpOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfU2Nyb2xsQmFySW1wRGVsZWdhdGU6OkRvTW91c2VMZWF2ZShpbnQzMl90IGlJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlTdGF0ZSkgew0KKyAgaWYgKGlTdGF0ZSA9PSBGV0xfUEFSVFNUQVRFX1NDQl9Ob3JtYWwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaVN0YXRlID0gRldMX1BBUlRTVEFURV9TQ0JfTm9ybWFsOw0KKyAgbV9wT3duZXItPlJlcGFpbnQoJnJ0SXRlbSk7DQorfQ0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZTo6RG9Nb3VzZUhvdmVyKGludDMyX3QgaUl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVN0YXRlKSB7DQorICBpZiAoaVN0YXRlID09IEZXTF9QQVJUU1RBVEVfU0NCX0hvdmVyZWQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaVN0YXRlID0gRldMX1BBUlRTVEFURV9TQ0JfSG92ZXJlZDsNCisgIG1fcE93bmVyLT5SZXBhaW50KCZydEl0ZW0pOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfc3BpbmJ1dHRvbmltcC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfc3BpbmJ1dHRvbmltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdjMWNjNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2Z3bF9zcGluYnV0dG9uaW1wLmNwcApAQCAtMCwwICsxLDQyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF90YXJnZXRpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF93aWRnZXRpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfc3BpbmJ1dHRvbmltcC5oIg0KKyNkZWZpbmUgRldMX1NQTl9NaW5XaWR0aCAxOA0KKyNkZWZpbmUgRldMX1NQTl9NaW5IZWlnaHQgMzINCisjZGVmaW5lIEZXTF9TUElOX0VsYXBzZSAyMDANCisNCisvLyBzdGF0aWMNCitJRldMX1NwaW5CdXR0b24qIElGV0xfU3BpbkJ1dHRvbjo6Q3JlYXRlKA0KKyAgICBjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpIHsNCisgIElGV0xfU3BpbkJ1dHRvbiogcFNwaW5CdXR0b24gPSBuZXcgSUZXTF9TcGluQnV0dG9uOw0KKyAgQ0ZXTF9TcGluQnV0dG9uSW1wKiBwU3BpbkJ1dHRvbkltcGwgPQ0KKyAgICAgIG5ldyBDRldMX1NwaW5CdXR0b25JbXAocHJvcGVydGllcywgbnVsbHB0cik7DQorICBwU3BpbkJ1dHRvbi0+U2V0SW1wbChwU3BpbkJ1dHRvbkltcGwpOw0KKyAgcFNwaW5CdXR0b25JbXBsLT5TZXRJbnRlcmZhY2UocFNwaW5CdXR0b24pOw0KKyAgcmV0dXJuIHBTcGluQnV0dG9uOw0KK30NCitJRldMX1NwaW5CdXR0b246OklGV0xfU3BpbkJ1dHRvbigpIHt9DQorRldMX0VSUiBJRldMX1NwaW5CdXR0b246OkVuYWJsZUJ1dHRvbihGWF9CT09MIGJFbmFibGUsIEZYX0JPT0wgYlVwKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9TcGluQnV0dG9uSW1wKj4oR2V0SW1wbCgpKQ0KKyAgICAgIC0+RW5hYmxlQnV0dG9uKGJFbmFibGUsIGJVcCk7DQorfQ0KK0ZYX0JPT0wgSUZXTF9TcGluQnV0dG9uOjpJc0J1dHRvbkVuYWJsZShGWF9CT09MIGJVcCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfU3BpbkJ1dHRvbkltcCo+KEdldEltcGwoKSktPklzQnV0dG9uRW5hYmxlKGJVcCk7DQorfQ0KKw0KK0NGV0xfU3BpbkJ1dHRvbkltcDo6Q0ZXTF9TcGluQnV0dG9uSW1wKA0KKyAgICBjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocHJvcGVydGllcywgcE91dGVyKSwNCisgICAgICBtX2R3VXBTdGF0ZShGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWwpLA0KKyAgICAgIG1fZHdEblN0YXRlKEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbCksDQorICAgICAgbV9pQnV0dG9uSW5kZXgoMCksDQorICAgICAgbV9iTEJ1dHRvbkR3bihGQUxTRSksDQorICAgICAgbV9oVGltZXIoTlVMTCkgew0KKyAgbV9ydENsaWVudC5SZXNldCgpOw0KKyAgbV9ydFVwQnV0dG9uLlJlc2V0KCk7DQorICBtX3J0RG5CdXR0b24uUmVzZXQoKTsNCisgIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgfD0gRldMX1NUWUxFRVhFX1NQQl9WZXJ0Ow0KK30NCitDRldMX1NwaW5CdXR0b25JbXA6On5DRldMX1NwaW5CdXR0b25JbXAoKSB7fQ0KK0ZXTF9FUlIgQ0ZXTF9TcGluQnV0dG9uSW1wOjpHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2xhc3MpIGNvbnN0IHsNCisgIHdzQ2xhc3MgPSBGV0xfQ0xBU1NfU3BpbkJ1dHRvbjsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9TcGluQnV0dG9uSW1wOjpHZXRDbGFzc0lEKCkgY29uc3Qgew0KKyAgcmV0dXJuIEZXTF9DTEFTU0hBU0hfU3BpbkJ1dHRvbjsNCit9DQorRldMX0VSUiBDRldMX1NwaW5CdXR0b25JbXA6OkluaXRpYWxpemUoKSB7DQorICBpZiAoQ0ZXTF9XaWRnZXRJbXA6OkluaXRpYWxpemUoKSAhPSBGV0xfRVJSX1N1Y2NlZWRlZCkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIG1fcERlbGVnYXRlID0gbmV3IENGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlKHRoaXMpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfU3BpbkJ1dHRvbkltcDo6RmluYWxpemUoKSB7DQorICBkZWxldGUgbV9wRGVsZWdhdGU7DQorICBtX3BEZWxlZ2F0ZSA9IG51bGxwdHI7DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRJbXA6OkZpbmFsaXplKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TcGluQnV0dG9uSW1wOjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUpIHsNCisgIGlmIChiQXV0b1NpemUpIHsNCisgICAgcmVjdC5TZXQoMCwgMCwgRldMX1NQTl9NaW5XaWR0aCwgRldMX1NQTl9NaW5IZWlnaHQpOw0KKyAgICBDRldMX1dpZGdldEltcDo6R2V0V2lkZ2V0UmVjdChyZWN0LCBUUlVFKTsNCisgIH0gZWxzZSB7DQorICAgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfU3BpbkJ1dHRvbkltcDo6VXBkYXRlKCkgew0KKyAgaWYgKElzTG9ja2VkKCkpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIH0NCisgIEdldENsaWVudFJlY3QobV9ydENsaWVudCk7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYRV9TUEJfVmVydCkgew0KKyAgICBtX3J0VXBCdXR0b24uU2V0KG1fcnRDbGllbnQudG9wLCBtX3J0Q2xpZW50LmxlZnQsIG1fcnRDbGllbnQud2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgbV9ydENsaWVudC5oZWlnaHQgLyAyKTsNCisgICAgbV9ydERuQnV0dG9uLlNldChtX3J0Q2xpZW50LmxlZnQsIG1fcnRDbGllbnQudG9wICsgbV9ydENsaWVudC5oZWlnaHQgLyAyLA0KKyAgICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQud2lkdGgsIG1fcnRDbGllbnQuaGVpZ2h0IC8gMik7DQorICB9IGVsc2Ugew0KKyAgICBtX3J0VXBCdXR0b24uU2V0KG1fcnRDbGllbnQubGVmdCwgbV9ydENsaWVudC50b3AsIG1fcnRDbGllbnQud2lkdGggLyAyLA0KKyAgICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQuaGVpZ2h0KTsNCisgICAgbV9ydERuQnV0dG9uLlNldChtX3J0Q2xpZW50LmxlZnQgKyBtX3J0Q2xpZW50LndpZHRoIC8gMiwgbV9ydENsaWVudC50b3AsDQorICAgICAgICAgICAgICAgICAgICAgbV9ydENsaWVudC53aWR0aCAvIDIsIG1fcnRDbGllbnQuaGVpZ2h0KTsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9TcGluQnV0dG9uSW1wOjpIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKG1fcnRDbGllbnQuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQ2xpZW50Ow0KKyAgfQ0KKyAgaWYgKEhhc0JvcmRlcigpICYmIChtX3J0Q2xpZW50LkNvbnRhaW5zKGZ4LCBmeSkpKSB7DQorICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Cb3JkZXI7DQorICB9DQorICBpZiAoSGFzRWRnZSgpKSB7DQorICAgIENGWF9SZWN0RiBydEVkZ2U7DQorICAgIEdldEVkZ2VSZWN0KHJ0RWRnZSk7DQorICAgIGlmIChydEVkZ2UuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgIHJldHVybiBGV0xfUEFSVF9TUEJfRWRnZTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKG1fcnRVcEJ1dHRvbi5Db250YWlucyhmeCwgZnkpKSB7DQorICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9TUEJfVXBCdXR0b247DQorICB9DQorICBpZiAobV9ydERuQnV0dG9uLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1NQQl9Eb3duQnV0dG9uOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1Vua25vd247DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TcGluQnV0dG9uSW1wOjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIGlmICghcEdyYXBoaWNzKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgQ0ZYX1JlY3RGIHJ0Q2xpcChtX3J0Q2xpZW50KTsNCisgIGlmIChwTWF0cml4ICE9IE5VTEwpIHsNCisgICAgcE1hdHJpeC0+VHJhbnNmb3JtUmVjdChydENsaXApOw0KKyAgfQ0KKyAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KKyAgaWYgKEhhc0JvcmRlcigpKSB7DQorICAgIERyYXdCb3JkZXIocEdyYXBoaWNzLCBGV0xfUEFSVF9TUEJfQm9yZGVyLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgaWYgKEhhc0VkZ2UoKSkgew0KKyAgICBEcmF3RWRnZShwR3JhcGhpY3MsIEZXTF9QQVJUX1NQQl9FZGdlLCBwVGhlbWUsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgRHJhd1VwQnV0dG9uKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCisgIERyYXdEb3duQnV0dG9uKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQoraW50MzJfdCBDRldMX1NwaW5CdXR0b25JbXA6OlJ1bihGV0xfSFRJTUVSIGhUaW1lcikgew0KKyAgaWYgKG1faFRpbWVyKSB7DQorICAgIENGV0xfRXZ0U3BiQ2xpY2sgd21Qb3NDaGFuZ2VkOw0KKyAgICB3bVBvc0NoYW5nZWQubV9wU3JjVGFyZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICB3bVBvc0NoYW5nZWQubV9iVXAgPSBtX2lCdXR0b25JbmRleCA9PSAwOw0KKyAgICBEaXNwYXRjaEV2ZW50KCZ3bVBvc0NoYW5nZWQpOw0KKyAgfQ0KKyAgcmV0dXJuIDE7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TcGluQnV0dG9uSW1wOjpFbmFibGVCdXR0b24oRlhfQk9PTCBiRW5hYmxlLCBGWF9CT09MIGJVcCkgew0KKyAgaWYgKGJVcCkgew0KKyAgICBpZiAoYkVuYWJsZSkgew0KKyAgICAgIG1fZHdVcFN0YXRlID0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG1fZHdVcFN0YXRlID0gRldMX1BBUlRTVEFURV9TUEJfRGlzYWJsZWQ7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGlmIChiRW5hYmxlKSB7DQorICAgICAgbV9kd0RuU3RhdGUgPSBGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWw7DQorICAgIH0gZWxzZSB7DQorICAgICAgbV9kd0RuU3RhdGUgPSBGV0xfUEFSVFNUQVRFX1NQQl9EaXNhYmxlZDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9CT09MIENGV0xfU3BpbkJ1dHRvbkltcDo6SXNCdXR0b25FbmFibGUoRlhfQk9PTCBiVXApIHsNCisgIGlmIChiVXApIHsNCisgICAgcmV0dXJuIChtX2R3VXBTdGF0ZSAhPSBGV0xfUEFSVFNUQVRFX1NQQl9EaXNhYmxlZCk7DQorICB9DQorICByZXR1cm4gKG1fZHdEblN0YXRlICE9IEZXTF9QQVJUU1RBVEVfU1BCX0Rpc2FibGVkKTsNCit9DQordm9pZCBDRldMX1NwaW5CdXR0b25JbXA6OkRyYXdVcEJ1dHRvbihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW1zOw0KKyAgcGFyYW1zLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIHBhcmFtcy5tX2lQYXJ0ID0gRldMX1BBUlRfU1BCX1VwQnV0dG9uOw0KKyAgcGFyYW1zLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgcGFyYW1zLm1fZHdTdGF0ZXMgPSBtX2R3VXBTdGF0ZSArIDE7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIHBhcmFtcy5tX3J0UGFydCA9IG1fcnRVcEJ1dHRvbjsNCisgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtcyk7DQorfQ0KK3ZvaWQgQ0ZXTF9TcGluQnV0dG9uSW1wOjpEcmF3RG93bkJ1dHRvbihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtczsNCisgIHBhcmFtcy5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBwYXJhbXMubV9pUGFydCA9IEZXTF9QQVJUX1NQQl9Eb3duQnV0dG9uOw0KKyAgcGFyYW1zLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgcGFyYW1zLm1fZHdTdGF0ZXMgPSBtX2R3RG5TdGF0ZSArIDE7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIHBhcmFtcy5tX3J0UGFydCA9IG1fcnREbkJ1dHRvbjsNCisgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtcyk7DQorfQ0KK0NGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlOjpDRldMX1NwaW5CdXR0b25JbXBEZWxlZ2F0ZSgNCisgICAgQ0ZXTF9TcGluQnV0dG9uSW1wKiBwT3duZXIpDQorICAgIDogbV9wT3duZXIocE93bmVyKSB7fQ0KK2ludDMyX3QgQ0ZXTF9TcGluQnV0dG9uSW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgaWYgKCFwTWVzc2FnZSkNCisgICAgcmV0dXJuIDA7DQorICBpbnQzMl90IGlSZXQgPSAxOw0KKyAgRlhfRFdPUkQgZHdNc2dDb2RlID0gcE1lc3NhZ2UtPkdldENsYXNzSUQoKTsNCisgIHN3aXRjaCAoZHdNc2dDb2RlKSB7DQorICAgIGNhc2UgRldMX01TR0hBU0hfU2V0Rm9jdXM6DQorICAgIGNhc2UgRldMX01TR0hBU0hfS2lsbEZvY3VzOiB7DQorICAgICAgT25Gb2N1c0NoYW5nZWQocE1lc3NhZ2UsIGR3TXNnQ29kZSA9PSBGV0xfTVNHSEFTSF9TZXRGb2N1cyk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9Nb3VzZTogew0KKyAgICAgIENGV0xfTXNnTW91c2UqIHBNc2cgPSBzdGF0aWNfY2FzdDxDRldMX01zZ01vdXNlKj4ocE1lc3NhZ2UpOw0KKyAgICAgIEZYX0RXT1JEIGR3Q21kID0gcE1zZy0+bV9kd0NtZDsNCisgICAgICBzd2l0Y2ggKGR3Q21kKSB7DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjogew0KKyAgICAgICAgICBPbkxCdXR0b25Eb3duKHBNc2cpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25VcDogew0KKyAgICAgICAgICBPbkxCdXR0b25VcChwTXNnKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZU1vdmU6IHsNCisgICAgICAgICAgT25Nb3VzZU1vdmUocE1zZyk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTW91c2VMZWF2ZTogew0KKyAgICAgICAgICBPbk1vdXNlTGVhdmUocE1zZyk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDoge30NCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9LZXk6IHsNCisgICAgICBDRldMX01zZ0tleSogcEtleSA9IHN0YXRpY19jYXN0PENGV0xfTXNnS2V5Kj4ocE1lc3NhZ2UpOw0KKyAgICAgIGlmIChwS2V5LT5tX2R3Q21kID09IEZXTF9NU0dLRVlDTURfS2V5RG93bikgew0KKyAgICAgICAgT25LZXlEb3duKHBLZXkpOw0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7DQorICAgICAgaVJldCA9IDA7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KKyAgcmV0dXJuIGlSZXQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TcGluQnV0dG9uSW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIHJldHVybiBtX3BPd25lci0+RHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KK30NCit2b2lkIENGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlOjpPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UqIHBNc2csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0KSB7DQorICBpZiAoYlNldCkgew0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSAoRldMX1dHVFNUQVRFX0ZvY3VzZWQpOw0KKyAgfSBlbHNlIHsNCisgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfihGV0xfV0dUU1RBVEVfRm9jdXNlZCk7DQorICB9DQorICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRDbGllbnQpOw0KK30NCit2b2lkIENGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlOjpPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIG1fcE93bmVyLT5tX2JMQnV0dG9uRHduID0gVFJVRTsNCisgIG1fcE93bmVyLT5TZXRHcmFiKFRSVUUpOw0KKyAgbV9wT3duZXItPlNldEZvY3VzKFRSVUUpOw0KKyAgaWYgKCFtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKQ0KKyAgICByZXR1cm47DQorICBGWF9CT09MIGJVcFByZXNzID0gKG1fcE93bmVyLT5tX3J0VXBCdXR0b24uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkgJiYNCisgICAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPklzQnV0dG9uRW5hYmxlKFRSVUUpKTsNCisgIEZYX0JPT0wgYkRuUHJlc3MgPSAobV9wT3duZXItPm1fcnREbkJ1dHRvbi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSAmJg0KKyAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+SXNCdXR0b25FbmFibGUoRkFMU0UpKTsNCisgIGlmICghYlVwUHJlc3MgJiYgIWJEblByZXNzKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChiVXBQcmVzcykgew0KKyAgICBtX3BPd25lci0+bV9pQnV0dG9uSW5kZXggPSAwOw0KKyAgICBtX3BPd25lci0+bV9kd1VwU3RhdGUgPSBGV0xfUEFSVFNUQVRFX1NQQl9QcmVzc2VkOw0KKyAgfQ0KKyAgaWYgKGJEblByZXNzKSB7DQorICAgIG1fcE93bmVyLT5tX2lCdXR0b25JbmRleCA9IDE7DQorICAgIG1fcE93bmVyLT5tX2R3RG5TdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU1BCX1ByZXNzZWQ7DQorICB9DQorICBDRldMX0V2dFNwYkNsaWNrIHdtUG9zQ2hhbmdlZDsNCisgIHdtUG9zQ2hhbmdlZC5tX3BTcmNUYXJnZXQgPSBtX3BPd25lci0+bV9wSW50ZXJmYWNlOw0KKyAgd21Qb3NDaGFuZ2VkLm1fYlVwID0gYlVwUHJlc3M7DQorICBtX3BPd25lci0+RGlzcGF0Y2hFdmVudCgmd21Qb3NDaGFuZ2VkKTsNCisgIG1fcE93bmVyLT5SZXBhaW50KGJVcFByZXNzID8gJm1fcE93bmVyLT5tX3J0VXBCdXR0b24NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJm1fcE93bmVyLT5tX3J0RG5CdXR0b24pOw0KKyAgbV9wT3duZXItPm1faFRpbWVyID0gRldMX1N0YXJ0VGltZXIobV9wT3duZXIsIEZXTF9TUElOX0VsYXBzZSk7DQorfQ0KK3ZvaWQgQ0ZXTF9TcGluQnV0dG9uSW1wRGVsZWdhdGU6Ok9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmIChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfU1BCX0Rpc2FibGVkKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIG1fcE93bmVyLT5tX2JMQnV0dG9uRHduID0gRkFMU0U7DQorICBtX3BPd25lci0+U2V0R3JhYihGQUxTRSk7DQorICBtX3BPd25lci0+U2V0Rm9jdXMoRkFMU0UpOw0KKyAgaWYgKG1fcE93bmVyLT5tX2hUaW1lcikgew0KKyAgICBGV0xfU3RvcFRpbWVyKG1fcE93bmVyLT5tX2hUaW1lcik7DQorICAgIG1fcE93bmVyLT5tX2hUaW1lciA9IE5VTEw7DQorICB9DQorICBGWF9CT09MIGJSZXBhaW50ID0gRkFMU0U7DQorICBDRlhfUmVjdEYgcnRJbnZhbGlkYXRlOw0KKyAgaWYgKG1fcE93bmVyLT5tX2R3VXBTdGF0ZSA9PSBGV0xfUEFSVFNUQVRFX1NQQl9QcmVzc2VkICYmDQorICAgICAgbV9wT3duZXItPklzQnV0dG9uRW5hYmxlKFRSVUUpKSB7DQorICAgIG1fcE93bmVyLT5tX2R3VXBTdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbDsNCisgICAgYlJlcGFpbnQgPSBUUlVFOw0KKyAgICBydEludmFsaWRhdGUgPSBtX3BPd25lci0+bV9ydFVwQnV0dG9uOw0KKyAgfSBlbHNlIGlmIChtX3BPd25lci0+bV9kd0RuU3RhdGUgPT0gRldMX1BBUlRTVEFURV9TUEJfUHJlc3NlZCAmJg0KKyAgICAgICAgICAgICBtX3BPd25lci0+SXNCdXR0b25FbmFibGUoRkFMU0UpKSB7DQorICAgIG1fcE93bmVyLT5tX2R3RG5TdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbDsNCisgICAgYlJlcGFpbnQgPSBUUlVFOw0KKyAgICBydEludmFsaWRhdGUgPSBtX3BPd25lci0+bV9ydERuQnV0dG9uOw0KKyAgfQ0KKyAgaWYgKGJSZXBhaW50KSB7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZydEludmFsaWRhdGUpOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlOjpPbk1vdXNlTW92ZShDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBpZiAoIW1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpDQorICAgIHJldHVybjsNCisgIGlmIChtX3BPd25lci0+bV9iTEJ1dHRvbkR3bikgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9CT09MIGJSZXBhaW50ID0gRkFMU0U7DQorICBDRlhfUmVjdEYgcnRJbnZsaWRhdGU7DQorICBydEludmxpZGF0ZS5SZXNldCgpOw0KKyAgaWYgKG1fcE93bmVyLT5tX3J0VXBCdXR0b24uQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgaWYgKG1fcE93bmVyLT5Jc0J1dHRvbkVuYWJsZShUUlVFKSkgew0KKyAgICAgIGlmIChtX3BPd25lci0+bV9kd1VwU3RhdGUgPT0gRldMX1BBUlRTVEFURV9TUEJfSG92ZXJlZCkgew0KKyAgICAgICAgbV9wT3duZXItPm1fZHdVcFN0YXRlID0gRldMX1BBUlRTVEFURV9TUEJfSG92ZXJlZDsNCisgICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCisgICAgICAgIHJ0SW52bGlkYXRlID0gbV9wT3duZXItPm1fcnRVcEJ1dHRvbjsNCisgICAgICB9DQorICAgICAgaWYgKG1fcE93bmVyLT5tX2R3RG5TdGF0ZSAhPSBGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWwgJiYNCisgICAgICAgICAgbV9wT3duZXItPklzQnV0dG9uRW5hYmxlKEZBTFNFKSkgew0KKyAgICAgICAgbV9wT3duZXItPm1fZHdEblN0YXRlID0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsOw0KKyAgICAgICAgaWYgKGJSZXBhaW50KSB7DQorICAgICAgICAgIHJ0SW52bGlkYXRlLlVuaW9uKG1fcE93bmVyLT5tX3J0RG5CdXR0b24pOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcnRJbnZsaWRhdGUgPSBtX3BPd25lci0+bV9ydERuQnV0dG9uOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYlJlcGFpbnQgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoIW1fcE93bmVyLT5Jc0J1dHRvbkVuYWJsZShGQUxTRSkpIHsNCisgICAgICBtX3BPd25lci0+RW5hYmxlQnV0dG9uKEZBTFNFLCBGQUxTRSk7DQorICAgIH0NCisgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fcnREbkJ1dHRvbi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICBpZiAobV9wT3duZXItPklzQnV0dG9uRW5hYmxlKEZBTFNFKSkgew0KKyAgICAgIGlmIChtX3BPd25lci0+bV9kd0RuU3RhdGUgIT0gRldMX1BBUlRTVEFURV9TUEJfSG92ZXJlZCkgew0KKyAgICAgICAgbV9wT3duZXItPm1fZHdEblN0YXRlID0gRldMX1BBUlRTVEFURV9TUEJfSG92ZXJlZDsNCisgICAgICAgIGJSZXBhaW50ID0gVFJVRTsNCisgICAgICAgIHJ0SW52bGlkYXRlID0gbV9wT3duZXItPm1fcnREbkJ1dHRvbjsNCisgICAgICB9DQorICAgICAgaWYgKG1fcE93bmVyLT5tX2R3VXBTdGF0ZSAhPSBGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWwgJiYNCisgICAgICAgICAgbV9wT3duZXItPklzQnV0dG9uRW5hYmxlKFRSVUUpKSB7DQorICAgICAgICBtX3BPd25lci0+bV9kd1VwU3RhdGUgPSBGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWw7DQorICAgICAgICBpZiAoYlJlcGFpbnQpIHsNCisgICAgICAgICAgcnRJbnZsaWRhdGUuVW5pb24obV9wT3duZXItPm1fcnRVcEJ1dHRvbik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBydEludmxpZGF0ZSA9IG1fcE93bmVyLT5tX3J0VXBCdXR0b247DQorICAgICAgICB9DQorICAgICAgICBiUmVwYWludCA9IFRSVUU7DQorICAgICAgfQ0KKyAgICB9DQorICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX2R3VXBTdGF0ZSAhPSBGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWwgfHwNCisgICAgICAgICAgICAgbV9wT3duZXItPm1fZHdEblN0YXRlICE9IEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbCkgew0KKyAgICBpZiAobV9wT3duZXItPm1fZHdVcFN0YXRlICE9IEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbCkgew0KKyAgICAgIG1fcE93bmVyLT5tX2R3VXBTdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbDsNCisgICAgICBiUmVwYWludCA9IFRSVUU7DQorICAgICAgcnRJbnZsaWRhdGUgPSBtX3BPd25lci0+bV9ydFVwQnV0dG9uOw0KKyAgICB9DQorICAgIGlmIChtX3BPd25lci0+bV9kd0RuU3RhdGUgIT0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsKSB7DQorICAgICAgbV9wT3duZXItPm1fZHdEblN0YXRlID0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsOw0KKyAgICAgIGlmIChiUmVwYWludCkgew0KKyAgICAgICAgcnRJbnZsaWRhdGUuVW5pb24obV9wT3duZXItPm1fcnREbkJ1dHRvbik7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJ0SW52bGlkYXRlID0gbV9wT3duZXItPm1fcnREbkJ1dHRvbjsNCisgICAgICB9DQorICAgICAgYlJlcGFpbnQgPSBUUlVFOw0KKyAgICB9DQorICB9DQorICBpZiAoYlJlcGFpbnQpIHsNCisgICAgbV9wT3duZXItPlJlcGFpbnQoJnJ0SW52bGlkYXRlKTsNCisgIH0NCit9DQordm9pZCBDRldMX1NwaW5CdXR0b25JbXBEZWxlZ2F0ZTo6T25Nb3VzZUxlYXZlKENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIGlmICghcE1zZykNCisgICAgcmV0dXJuOw0KKyAgaWYgKG1fcE93bmVyLT5tX2R3VXBTdGF0ZSAhPSBGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWwgJiYNCisgICAgICBtX3BPd25lci0+SXNCdXR0b25FbmFibGUoVFJVRSkpIHsNCisgICAgbV9wT3duZXItPm1fZHdVcFN0YXRlID0gRldMX1BBUlRTVEFURV9TUEJfTm9ybWFsOw0KKyAgfQ0KKyAgaWYgKG1fcE93bmVyLT5tX2R3RG5TdGF0ZSAhPSBGV0xfUEFSVFNUQVRFX1NQQl9Ob3JtYWwgJiYNCisgICAgICBtX3BPd25lci0+SXNCdXR0b25FbmFibGUoRkFMU0UpKSB7DQorICAgIG1fcE93bmVyLT5tX2R3RG5TdGF0ZSA9IEZXTF9QQVJUU1RBVEVfU1BCX05vcm1hbDsNCisgIH0NCisgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydENsaWVudCk7DQorfQ0KK3ZvaWQgQ0ZXTF9TcGluQnV0dG9uSW1wRGVsZWdhdGU6Ok9uS2V5RG93bihDRldMX01zZ0tleSogcE1zZykgew0KKyAgaWYgKCFtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKQ0KKyAgICByZXR1cm47DQorICBGWF9CT09MIGJVcCA9DQorICAgICAgcE1zZy0+bV9kd0tleUNvZGUgPT0gRldMX1ZLRVlfVXAgfHwgcE1zZy0+bV9kd0tleUNvZGUgPT0gRldMX1ZLRVlfTGVmdDsNCisgIEZYX0JPT0wgYkRvd24gPQ0KKyAgICAgIHBNc2ctPm1fZHdLZXlDb2RlID09IEZXTF9WS0VZX0Rvd24gfHwgcE1zZy0+bV9kd0tleUNvZGUgPT0gRldMX1ZLRVlfUmlnaHQ7DQorICBpZiAoIWJVcCAmJiAhYkRvd24pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfQk9PTCBiVXBFbmFibGUgPSBtX3BPd25lci0+SXNCdXR0b25FbmFibGUoVFJVRSk7DQorICBGWF9CT09MIGJEb3duRW5hYmxlID0gbV9wT3duZXItPklzQnV0dG9uRW5hYmxlKEZBTFNFKTsNCisgIGlmICghYlVwRW5hYmxlICYmICFiRG93bkVuYWJsZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRldMX0V2dFNwYkNsaWNrIHdtUG9zQ2hhbmdlZDsNCisgIHdtUG9zQ2hhbmdlZC5tX3BTcmNUYXJnZXQgPSBtX3BPd25lci0+bV9wSW50ZXJmYWNlOw0KKyAgd21Qb3NDaGFuZ2VkLm1fYlVwID0gYlVwRW5hYmxlOw0KKyAgbV9wT3duZXItPkRpc3BhdGNoRXZlbnQoJndtUG9zQ2hhbmdlZCk7DQorICBtX3BPd25lci0+UmVwYWludChiVXBFbmFibGUgPyAmbV9wT3duZXItPm1fcnRVcEJ1dHRvbg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJm1fcE93bmVyLT5tX3J0RG5CdXR0b24pOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9md2xfdG9vbHRpcGN0cmxpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3Rvb2x0aXBjdHJsaW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTJjZjVmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZndsX3Rvb2x0aXBjdHJsaW1wLmNwcApAQCAtMCwwICsxLDI5MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF90YXJnZXRpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF93aWRnZXRpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfcGFuZWxpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfZm9ybWltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF90b29sdGlwY3RybGltcC5oIg0KKw0KKy8vIHN0YXRpYw0KK0lGV0xfVG9vbFRpcCogSUZXTF9Ub29sVGlwOjpDcmVhdGUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikgew0KKyAgSUZXTF9Ub29sVGlwKiBwVG9vbFRpcCA9IG5ldyBJRldMX1Rvb2xUaXA7DQorICBDRldMX1Rvb2xUaXBJbXAqIHBUb29sVGlwSW1wbCA9IG5ldyBDRldMX1Rvb2xUaXBJbXAocHJvcGVydGllcywgcE91dGVyKTsNCisgIHBUb29sVGlwLT5TZXRJbXBsKHBUb29sVGlwSW1wbCk7DQorICBwVG9vbFRpcEltcGwtPlNldEludGVyZmFjZShwVG9vbFRpcCk7DQorICByZXR1cm4gcFRvb2xUaXA7DQorfQ0KK0ZXTF9FUlIgSUZXTF9Ub29sVGlwOjpTZXRBbmNob3IoY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvcikgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfVG9vbFRpcEltcCo+KEdldEltcGwoKSktPlNldEFuY2hvcihydEFuY2hvcik7DQorfQ0KK0ZXTF9FUlIgSUZXTF9Ub29sVGlwOjpTaG93KCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfVG9vbFRpcEltcCo+KEdldEltcGwoKSktPlNob3coKTsNCit9DQorRldMX0VSUiBJRldMX1Rvb2xUaXA6OkhpZGUoKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9Ub29sVGlwSW1wKj4oR2V0SW1wbCgpKS0+SGlkZSgpOw0KK30NCitJRldMX1Rvb2xUaXA6OklGV0xfVG9vbFRpcCgpIHsNCit9DQorQ0ZXTF9Ub29sVGlwSW1wOjpDRldMX1Rvb2xUaXBJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpDQorICAgIDogQ0ZXTF9Gb3JtSW1wKHByb3BlcnRpZXMsIHBPdXRlciksDQorICAgICAgbV9iQnRuRG93bihGQUxTRSksDQorICAgICAgbV9kd1RUT1N0eWxlcyhGREVfVFRPU1RZTEVfU2luZ2xlTGluZSksDQorICAgICAgbV9pVFRPQWxpZ24oRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXIpLA0KKyAgICAgIG1faFRpbWVyU2hvdyhOVUxMKSwNCisgICAgICBtX2hUaW1lckhpZGUoTlVMTCksDQorICAgICAgbV9wVGltZXIoTlVMTCkgew0KKyAgbV9ydENsaWVudC5TZXQoMCwgMCwgMCwgMCk7DQorICBtX3J0Q2FwdGlvbi5TZXQoMCwgMCwgMCwgMCk7DQorICBtX3J0QW5jaG9yLlNldCgwLCAwLCAwLCAwKTsNCisgIG1fVGltZXJTaG93Lm1fcFRvb2xUaXAgPSB0aGlzOw0KKyAgbV9UaW1lckhpZGUubV9wVG9vbFRpcCA9IHRoaXM7DQorfQ0KK0NGV0xfVG9vbFRpcEltcDo6fkNGV0xfVG9vbFRpcEltcCgpIHsNCisgIGlmIChtX3BUaW1lcikgew0KKyAgICBkZWxldGUgbV9wVGltZXI7DQorICAgIG1fcFRpbWVyID0gTlVMTDsNCisgIH0NCit9DQorRldMX0VSUiBDRldMX1Rvb2xUaXBJbXA6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Qgew0KKyAgd3NDbGFzcyA9IEZXTF9DTEFTU19Ub29sVGlwOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9EV09SRCBDRldMX1Rvb2xUaXBJbXA6OkdldENsYXNzSUQoKSBjb25zdCB7DQorICByZXR1cm4gRldMX0NMQVNTSEFTSF9Ub29sVGlwOw0KK30NCitGV0xfRVJSIENGV0xfVG9vbFRpcEltcDo6SW5pdGlhbGl6ZSgpIHsNCisgIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgfD0gRldMX1dHVFNUWUxFX1BvcHVwOw0KKyAgbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmPSB+RldMX1dHVFNUWUxFX0NoaWxkOw0KKyAgaWYgKENGV0xfV2lkZ2V0SW1wOjpJbml0aWFsaXplKCkgIT0gRldMX0VSUl9TdWNjZWVkZWQpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBtX3BEZWxlZ2F0ZSA9IG5ldyBDRldMX1Rvb2xUaXBJbXBEZWxlZ2F0ZSh0aGlzKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1Rvb2xUaXBJbXA6OkZpbmFsaXplKCkgew0KKyAgZGVsZXRlIG1fcERlbGVnYXRlOw0KKyAgbV9wRGVsZWdhdGUgPSBudWxscHRyOw0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpGaW5hbGl6ZSgpOw0KK30NCitGV0xfRVJSIENGV0xfVG9vbFRpcEltcDo6R2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsIEZYX0JPT0wgYkF1dG9TaXplKSB7DQorICBpZiAoYkF1dG9TaXplKSB7DQorICAgIHJlY3QuU2V0KDAsIDAsIDAsIDApOw0KKyAgICBpZiAobV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9PSBOVUxMKSB7DQorICAgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDYXB0aW9uOw0KKyAgICBJRldMX1Rvb2xUaXBEUCogcERhdGEgPQ0KKyAgICAgICAgc3RhdGljX2Nhc3Q8SUZXTF9Ub29sVGlwRFAqPihtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgICBpZiAocERhdGEpIHsNCisgICAgICBwRGF0YS0+R2V0Q2FwdGlvbihtX3BJbnRlcmZhY2UsIHdzQ2FwdGlvbik7DQorICAgIH0NCisgICAgaW50MzJfdCBpTGVuID0gd3NDYXB0aW9uLkdldExlbmd0aCgpOw0KKyAgICBpZiAoaUxlbiA+IDApIHsNCisgICAgICBDRlhfU2l6ZUYgc3ogPSBDYWxjVGV4dFNpemUod3NDYXB0aW9uLCBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKTsNCisgICAgICByZWN0LlNldCgwLCAwLCBzei54LCBzei55KTsNCisgICAgICByZWN0LndpZHRoICs9IEZXTF9XR1RDQVBBQ0lUWV9DWEJvcmRlciAqIDI1Ow0KKyAgICAgIHJlY3QuaGVpZ2h0ICs9IEZXTF9XR1RDQVBBQ0lUWV9DWUJvcmRlciAqIDg7DQorICAgIH0NCisgICAgQ0ZXTF9XaWRnZXRJbXA6OkdldFdpZGdldFJlY3QocmVjdCwgVFJVRSk7DQorICB9IGVsc2Ugew0KKyAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1Rvb2xUaXBJbXA6OlVwZGF0ZSgpIHsNCisgIGlmIChJc0xvY2tlZCgpKSB7DQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICB9DQorICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpIHsNCisgICAgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciA9IEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICB9DQorICBVcGRhdGVUZXh0T3V0U3R5bGVzKCk7DQorICBHZXRDbGllbnRSZWN0KG1fcnRDbGllbnQpOw0KKyAgbV9ydENhcHRpb24gPSBtX3J0Q2xpZW50Ow0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfVG9vbFRpcEltcDo6R2V0Q2xpZW50UmVjdChDRlhfUmVjdEYmIHJlY3QpIHsNCisgIEZYX0ZMT0FUIHggPSAwOw0KKyAgRlhfRkxPQVQgeSA9IDA7DQorICBGWF9GTE9BVCB0ID0gMDsNCisgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgIGlmIChwVGhlbWUpIHsNCisgICAgQ0ZXTF9UaGVtZVBhcnQgcGFydDsNCisgICAgcGFydC5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIHggPSAqc3RhdGljX2Nhc3Q8RlhfRkxPQVQqPigNCisgICAgICAgIHBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9DWEJvcmRlcikpOw0KKyAgICB5ID0gKnN0YXRpY19jYXN0PEZYX0ZMT0FUKj4oDQorICAgICAgICBwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfQ1lCb3JkZXIpKTsNCisgIH0NCisgIHJlY3QgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgcmVjdC5PZmZzZXQoLXJlY3QubGVmdCwgLXJlY3QudG9wKTsNCisgIHJlY3QuRGVmbGF0ZSh4LCB0LCB4LCB5KTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1Rvb2xUaXBJbXA6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgSUZXTF9Ub29sVGlwVGFyZ2V0KiB0b29sVGlwVGFyZ2V0ID0NCisgICAgICBDRldMX1Rvb2xUaXBDb250YWluZXI6OmdldEluc3RhbmNlKCktPkdldEN1cnJlbnRUb29sVGlwVGFyZ2V0KCk7DQorICBpZiAodG9vbFRpcFRhcmdldCAmJiAhdG9vbFRpcFRhcmdldC0+VXNlRGVmYXVsdFRoZW1lKCkpIHsNCisgICAgcmV0dXJuIHRvb2xUaXBUYXJnZXQtPkRyYXdUb29sVGlwKHBHcmFwaGljcywgcE1hdHJpeCwgbV9wSW50ZXJmYWNlKTsNCisgIH0NCisgIGlmICghcEdyYXBoaWNzKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KKyAgRHJhd0JrZ3JvdW5kKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCisgIERyYXdUZXh0KHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQordm9pZCBDRldMX1Rvb2xUaXBJbXA6OkRyYXdCa2dyb3VuZChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfVFRQX0JhY2tncm91bmQ7DQorICBwYXJhbS5tX2R3U3RhdGVzID0gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCisgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIHBhcmFtLm1fcnRQYXJ0ID0gbV9ydENsaWVudDsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpIHsNCisgICAgcGFyYW0ubV9wRGF0YSA9ICZtX3J0Q2FwdGlvbjsNCisgIH0NCisgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCit9DQordm9pZCBDRldMX1Rvb2xUaXBJbXA6OkRyYXdUZXh0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpDQorICAgIHJldHVybjsNCisgIENGWF9XaWRlU3RyaW5nIHdzQ2FwdGlvbjsNCisgIG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlci0+R2V0Q2FwdGlvbihtX3BJbnRlcmZhY2UsIHdzQ2FwdGlvbik7DQorICBpZiAod3NDYXB0aW9uLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRldMX1RoZW1lVGV4dCBwYXJhbTsNCisgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9UVFBfQ2FwdGlvbjsNCisgIHBhcmFtLm1fZHdTdGF0ZXMgPSBtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzOw0KKyAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgfQ0KKyAgcGFyYW0ubV9ydFBhcnQgPSBtX3J0Q2FwdGlvbjsNCisgIHBhcmFtLm1fd3NUZXh0ID0gd3NDYXB0aW9uOw0KKyAgcGFyYW0ubV9kd1RUT1N0eWxlcyA9IG1fZHdUVE9TdHlsZXM7DQorICBwYXJhbS5tX2lUVE9BbGlnbiA9IG1faVRUT0FsaWduOw0KKyAgcFRoZW1lLT5EcmF3VGV4dCgmcGFyYW0pOw0KK30NCit2b2lkIENGV0xfVG9vbFRpcEltcDo6VXBkYXRlVGV4dE91dFN0eWxlcygpIHsNCisgIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXI7DQorICBtX2R3VFRPU3R5bGVzID0gRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmU7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9XR1RTVFlMRV9SVExSZWFkaW5nKSB7DQorICAgIG1fZHdUVE9TdHlsZXMgfD0gRkRFX1RUT1NUWUxFX1JUTDsNCisgIH0NCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX1RUUF9NdWx0aWxpbmUpIHsNCisgICAgbV9kd1RUT1N0eWxlcyAmPSB+RkRFX1RUT1NUWUxFX1NpbmdsZUxpbmU7DQorICB9DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ub29sVGlwSW1wOjpTZXRBbmNob3IoY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvcikgew0KKyAgbV9ydEFuY2hvciA9IHJ0QW5jaG9yOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ub29sVGlwSW1wOjpTaG93KCkgew0KKyAgSUZXTF9Ub29sVGlwRFAqIHBEYXRhID0NCisgICAgICBzdGF0aWNfY2FzdDxJRldMX1Rvb2xUaXBEUCo+KG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQorICBpbnQzMl90IG5Jbml0RGVsYXkgPSBwRGF0YS0+R2V0SW5pdGlhbERlbGF5KG1fcEludGVyZmFjZSk7DQorICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfSW52aXNpYmxlKSkgew0KKyAgICBtX2hUaW1lclNob3cgPSBGV0xfU3RhcnRUaW1lcigmbV9UaW1lclNob3csIG5Jbml0RGVsYXksIEZBTFNFKTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGV0xfRVJSIENGV0xfVG9vbFRpcEltcDo6SGlkZSgpIHsNCisgIFNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBUUlVFKTsNCisgIGlmIChtX2hUaW1lckhpZGUpIHsNCisgICAgRldMX1N0b3BUaW1lcihtX2hUaW1lckhpZGUpOw0KKyAgICBtX2hUaW1lckhpZGUgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1faFRpbWVyU2hvdykgew0KKyAgICBGV0xfU3RvcFRpbWVyKG1faFRpbWVyU2hvdyk7DQorICAgIG1faFRpbWVyU2hvdyA9IE5VTEw7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorRldMX0VSUiBDRldMX1Rvb2xUaXBJbXA6OlNldFN0YXRlcyhGWF9EV09SRCBkd1N0YXRlcywgRlhfQk9PTCBiU2V0KSB7DQorICBpZiAoKGR3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSkgJiYgIWJTZXQpIHsNCisgICAgSUZXTF9Ub29sVGlwRFAqIHBEYXRhID0NCisgICAgICAgIHN0YXRpY19jYXN0PElGV0xfVG9vbFRpcERQKj4obV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyKTsNCisgICAgaW50MzJfdCBuQXV0b1BvcERlbGF5ID0gcERhdGEtPkdldEF1dG9Qb3BEZWxheShtX3BJbnRlcmZhY2UpOw0KKyAgICBtX2hUaW1lckhpZGUgPSBGV0xfU3RhcnRUaW1lcigmbV9UaW1lckhpZGUsIG5BdXRvUG9wRGVsYXksIEZBTFNFKTsNCisgIH0NCisgIHJldHVybiBDRldMX1dpZGdldEltcDo6U2V0U3RhdGVzKGR3U3RhdGVzLCBiU2V0KTsNCit9DQordm9pZCBDRldMX1Rvb2xUaXBJbXA6OlJlZnJlc2hUb29sVGlwUG9zKCkgew0KKyAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX1RUUF9Ob0FuY2hvcikgPT0gMCkgew0KKyAgICBDRlhfUmVjdEYgcnRQb3B1cDsNCisgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0KG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQpOw0KKyAgICBDRlhfUmVjdEYgcnRBbmNob3IobV9ydEFuY2hvcik7DQorICAgIHJ0UG9wdXAuU2V0KDAsIDAsIDAsIDApOw0KKyAgICBGWF9GTE9BVCBmeCA9IHJ0QW5jaG9yLkNlbnRlcigpLnggKyAyMDsNCisgICAgRlhfRkxPQVQgZnkgPSBydEFuY2hvci5DZW50ZXIoKS55ICsgMjA7DQorICAgIHJ0UG9wdXAuU2V0KGZ4LCBmeSwgcnRXaWRnZXQuV2lkdGgoKSwgcnRXaWRnZXQuSGVpZ2h0KCkpOw0KKyAgICBGWF9GTE9BVCBmU2NyZWVuV2lkdGggPSAwOw0KKyAgICBGWF9GTE9BVCBmU2NyZWVuSGVpZ2h0ID0gMDsNCisgICAgR2V0U2NyZWVuU2l6ZShmU2NyZWVuV2lkdGgsIGZTY3JlZW5IZWlnaHQpOw0KKyAgICBpZiAocnRQb3B1cC5ib3R0b20oKSA+IGZTY3JlZW5IZWlnaHQpIHsNCisgICAgICBydFBvcHVwLk9mZnNldCgwLCBmU2NyZWVuSGVpZ2h0IC0gcnRQb3B1cC5ib3R0b20oKSk7DQorICAgIH0NCisgICAgaWYgKHJ0UG9wdXAucmlnaHQoKSA+IGZTY3JlZW5XaWR0aCkgew0KKyAgICAgIHJ0UG9wdXAuT2Zmc2V0KGZTY3JlZW5XaWR0aCAtIHJ0UG9wdXAucmlnaHQoKSwgMCk7DQorICAgIH0NCisgICAgaWYgKHJ0UG9wdXAubGVmdCA8IDApIHsNCisgICAgICBydFBvcHVwLk9mZnNldCgwIC0gcnRQb3B1cC5sZWZ0LCAwKTsNCisgICAgfQ0KKyAgICBpZiAocnRQb3B1cC50b3AgPCAwKSB7DQorICAgICAgcnRQb3B1cC5PZmZzZXQoMCwgMCAtIHJ0UG9wdXAudG9wKTsNCisgICAgfQ0KKyAgICBTZXRXaWRnZXRSZWN0KHJ0UG9wdXApOw0KKyAgICBVcGRhdGUoKTsNCisgIH0NCit9DQorQ0ZXTF9Ub29sVGlwSW1wOjpDRldMX1Rvb2xUaXBUaW1lcjo6Q0ZXTF9Ub29sVGlwVGltZXIoQ0ZXTF9Ub29sVGlwSW1wKiBwVG9vbFRpcCkNCisgICAgOiBtX3BUb29sVGlwKHBUb29sVGlwKSB7fQ0KK2ludDMyX3QgQ0ZXTF9Ub29sVGlwSW1wOjpDRldMX1Rvb2xUaXBUaW1lcjo6UnVuKEZXTF9IVElNRVIgaFRpbWVyKSB7DQorICBpZiAobV9wVG9vbFRpcC0+bV9oVGltZXJTaG93ID09IGhUaW1lciAmJiBtX3BUb29sVGlwLT5tX2hUaW1lclNob3cpIHsNCisgICAgaWYgKG1fcFRvb2xUaXAtPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSkgew0KKyAgICAgIG1fcFRvb2xUaXAtPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBGQUxTRSk7DQorICAgICAgbV9wVG9vbFRpcC0+UmVmcmVzaFRvb2xUaXBQb3MoKTsNCisgICAgICBGV0xfU3RvcFRpbWVyKG1fcFRvb2xUaXAtPm1faFRpbWVyU2hvdyk7DQorICAgICAgbV9wVG9vbFRpcC0+bV9oVGltZXJTaG93ID0gTlVMTDsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKG1fcFRvb2xUaXAtPm1faFRpbWVySGlkZSA9PSBoVGltZXIgJiYgbV9wVG9vbFRpcC0+bV9oVGltZXJIaWRlKSB7DQorICAgIG1fcFRvb2xUaXAtPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBUUlVFKTsNCisgICAgRldMX1N0b3BUaW1lcihtX3BUb29sVGlwLT5tX2hUaW1lckhpZGUpOw0KKyAgICBtX3BUb29sVGlwLT5tX2hUaW1lckhpZGUgPSBOVUxMOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitDRldMX1Rvb2xUaXBJbXBEZWxlZ2F0ZTo6Q0ZXTF9Ub29sVGlwSW1wRGVsZWdhdGUoQ0ZXTF9Ub29sVGlwSW1wKiBwT3duZXIpDQorICAgIDogbV9wT3duZXIocE93bmVyKSB7fQ0KK2ludDMyX3QgQ0ZXTF9Ub29sVGlwSW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KK30NCitGV0xfRVJSIENGV0xfVG9vbFRpcEltcERlbGVnYXRlOjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1Rvb2xUaXBJbXBEZWxlZ2F0ZTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICByZXR1cm4gbV9wT3duZXItPkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZnhtYXRoX2JhcmNvZGVpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvZnhtYXRoX2JhcmNvZGVpbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZjMxZTQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9meG1hdGhfYmFyY29kZWltcC5jcHAKQEAgLTAsMCArMSwzODUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9meG1hdGhfYmFyY29kZWltcC5oIg0KK3N0YXRpYyBDQkNfQ29kZUJhc2UqIEZYX0JhcmNvZGVfQ3JlYXRlQmFyQ29kZUVuZ2luZU9iamVjdChCQ19UWVBFIHR5cGUpIHsNCisgIHN3aXRjaCAodHlwZSkgew0KKyAgICBjYXNlIEJDX0NPREUzOToNCisgICAgICByZXR1cm4gbmV3IENCQ19Db2RlMzkoKTsNCisgICAgY2FzZSBCQ19DT0RBQkFSOg0KKyAgICAgIHJldHVybiBuZXcgQ0JDX0NvZGFiYXIoKTsNCisgICAgY2FzZSBCQ19DT0RFMTI4Og0KKyAgICAgIHJldHVybiBuZXcgQ0JDX0NvZGUxMjgoQkNfQ09ERTEyOF9CKTsNCisgICAgY2FzZSBCQ19DT0RFMTI4X0I6DQorICAgICAgcmV0dXJuIG5ldyBDQkNfQ29kZTEyOChCQ19DT0RFMTI4X0IpOw0KKyAgICBjYXNlIEJDX0NPREUxMjhfQzoNCisgICAgICByZXR1cm4gbmV3IENCQ19Db2RlMTI4KEJDX0NPREUxMjhfQyk7DQorICAgIGNhc2UgQkNfRUFOODoNCisgICAgICByZXR1cm4gbmV3IENCQ19FQU44KCk7DQorICAgIGNhc2UgQkNfVVBDQToNCisgICAgICByZXR1cm4gbmV3IENCQ19VUENBKCk7DQorICAgIGNhc2UgQkNfRUFOMTM6DQorICAgICAgcmV0dXJuIG5ldyBDQkNfRUFOMTMoKTsNCisgICAgY2FzZSBCQ19RUl9DT0RFOg0KKyAgICAgIHJldHVybiBuZXcgQ0JDX1FSQ29kZSgpOw0KKyAgICBjYXNlIEJDX1BERjQxNzoNCisgICAgICByZXR1cm4gbmV3IENCQ19QREY0MTdJKCk7DQorICAgIGNhc2UgQkNfREFUQU1BVFJJWDoNCisgICAgICByZXR1cm4gbmV3IENCQ19EYXRhTWF0cml4KCk7DQorICAgIGNhc2UgQkNfVU5LTk9XTjoNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gTlVMTDsNCisgIH0NCit9DQorQ0ZYX0JhcmNvZGU6OkNGWF9CYXJjb2RlKCkge30NCitDRlhfQmFyY29kZTo6fkNGWF9CYXJjb2RlKCkgew0KKyAgaWYgKG1fcEJDRW5naW5lKSB7DQorICAgIGRlbGV0ZSBtX3BCQ0VuZ2luZTsNCisgICAgbV9wQkNFbmdpbmUgPSBOVUxMOw0KKyAgfQ0KK30NCitGWF9CT09MIENGWF9CYXJjb2RlOjpDcnJlYXRlKEJDX1RZUEUgdHlwZSkgew0KKyAgbV9wQkNFbmdpbmUgPSBGWF9CYXJjb2RlX0NyZWF0ZUJhckNvZGVFbmdpbmVPYmplY3QodHlwZSk7DQorICByZXR1cm4gbV9wQkNFbmdpbmUgIT0gTlVMTDsNCit9DQordm9pZCBDRlhfQmFyY29kZTo6UmVsZWFzZSgpIHsNCisgIGRlbGV0ZSB0aGlzOw0KK30NCitCQ19UWVBFIENGWF9CYXJjb2RlOjpHZXRUeXBlKCkgew0KKyAgcmV0dXJuIG1fcEJDRW5naW5lID8gbV9wQkNFbmdpbmUtPkdldFR5cGUoKSA6IEJDX1VOS05PV047DQorfQ0KK0ZYX0JPT0wgQ0ZYX0JhcmNvZGU6OlNldENoYXJFbmNvZGluZyhCQ19DSEFSX0VOQ09ESU5HIGVuY29kaW5nKSB7DQorICByZXR1cm4gbV9wQkNFbmdpbmUgPyBtX3BCQ0VuZ2luZS0+U2V0Q2hhckVuY29kaW5nKGVuY29kaW5nKSA6IEZBTFNFOw0KK30NCitGWF9CT09MIENGWF9CYXJjb2RlOjpTZXRNb2R1bGVIZWlnaHQoaW50MzJfdCBtb2R1bGVIZWlnaHQpIHsNCisgIHJldHVybiBtX3BCQ0VuZ2luZSA/IG1fcEJDRW5naW5lLT5TZXRNb2R1bGVIZWlnaHQobW9kdWxlSGVpZ2h0KSA6IEZBTFNFOw0KK30NCitGWF9CT09MIENGWF9CYXJjb2RlOjpTZXRNb2R1bGVXaWR0aChpbnQzMl90IG1vZHVsZVdpZHRoKSB7DQorICByZXR1cm4gbV9wQkNFbmdpbmUgPyBtX3BCQ0VuZ2luZS0+U2V0TW9kdWxlV2lkdGgobW9kdWxlV2lkdGgpIDogRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0JhcmNvZGU6OlNldEhlaWdodChpbnQzMl90IGhlaWdodCkgew0KKyAgcmV0dXJuIG1fcEJDRW5naW5lID8gbV9wQkNFbmdpbmUtPlNldEhlaWdodChoZWlnaHQpIDogRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0JhcmNvZGU6OlNldFdpZHRoKGludDMyX3Qgd2lkdGgpIHsNCisgIHJldHVybiBtX3BCQ0VuZ2luZSA/IG1fcEJDRW5naW5lLT5TZXRXaWR0aCh3aWR0aCkgOiBGQUxTRTsNCit9DQorRlhfQk9PTCBDRlhfQmFyY29kZTo6Q2hlY2tDb250ZW50VmFsaWRpdHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgew0KKyAgc3dpdGNoIChHZXRUeXBlKCkpIHsNCisgICAgY2FzZSBCQ19DT0RFMzk6DQorICAgIGNhc2UgQkNfQ09EQUJBUjoNCisgICAgY2FzZSBCQ19DT0RFMTI4Og0KKyAgICBjYXNlIEJDX0NPREUxMjhfQjoNCisgICAgY2FzZSBCQ19DT0RFMTI4X0M6DQorICAgIGNhc2UgQkNfRUFOODoNCisgICAgY2FzZSBCQ19FQU4xMzoNCisgICAgY2FzZSBCQ19VUENBOg0KKyAgICAgIHJldHVybiBtX3BCQ0VuZ2luZQ0KKyAgICAgICAgICAgICAgICAgPyBzdGF0aWNfY2FzdDxDQkNfT25lQ29kZSo+KG1fcEJDRW5naW5lKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgLT5DaGVja0NvbnRlbnRWYWxpZGl0eShjb250ZW50cykNCisgICAgICAgICAgICAgICAgIDogVFJVRTsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gVFJVRTsNCisgIH0NCit9DQorRlhfQk9PTCBDRlhfQmFyY29kZTo6U2V0UHJpbnRDaGVja3N1bShGWF9CT09MIGNoZWNrc3VtKSB7DQorICBzd2l0Y2ggKEdldFR5cGUoKSkgew0KKyAgICBjYXNlIEJDX0NPREUzOToNCisgICAgY2FzZSBCQ19DT0RBQkFSOg0KKyAgICBjYXNlIEJDX0NPREUxMjg6DQorICAgIGNhc2UgQkNfQ09ERTEyOF9COg0KKyAgICBjYXNlIEJDX0NPREUxMjhfQzoNCisgICAgY2FzZSBCQ19FQU44Og0KKyAgICBjYXNlIEJDX0VBTjEzOg0KKyAgICBjYXNlIEJDX1VQQ0E6DQorICAgICAgcmV0dXJuIG1fcEJDRW5naW5lID8gKHN0YXRpY19jYXN0PENCQ19PbmVDb2RlKj4obV9wQkNFbmdpbmUpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPlNldFByaW50Q2hlY2tzdW0oY2hlY2tzdW0pLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICA6IEZBTFNFOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgIH0NCit9DQorRlhfQk9PTCBDRlhfQmFyY29kZTo6U2V0RGF0YUxlbmd0aChpbnQzMl90IGxlbmd0aCkgew0KKyAgc3dpdGNoIChHZXRUeXBlKCkpIHsNCisgICAgY2FzZSBCQ19DT0RFMzk6DQorICAgIGNhc2UgQkNfQ09EQUJBUjoNCisgICAgY2FzZSBCQ19DT0RFMTI4Og0KKyAgICBjYXNlIEJDX0NPREUxMjhfQjoNCisgICAgY2FzZSBCQ19DT0RFMTI4X0M6DQorICAgIGNhc2UgQkNfRUFOODoNCisgICAgY2FzZSBCQ19FQU4xMzoNCisgICAgY2FzZSBCQ19VUENBOg0KKyAgICAgIHJldHVybiBtX3BCQ0VuZ2luZSA/IChzdGF0aWNfY2FzdDxDQkNfT25lQ29kZSo+KG1fcEJDRW5naW5lKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5TZXREYXRhTGVuZ3RoKGxlbmd0aCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpDQorICAgICAgICAgICAgICAgICAgICAgICAgIDogRkFMU0U7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KK30NCitGWF9CT09MIENGWF9CYXJjb2RlOjpTZXRDYWxDaGVja3N1bShpbnQzMl90IHN0YXRlKSB7DQorICBzd2l0Y2ggKEdldFR5cGUoKSkgew0KKyAgICBjYXNlIEJDX0NPREUzOToNCisgICAgY2FzZSBCQ19DT0RBQkFSOg0KKyAgICBjYXNlIEJDX0NPREUxMjg6DQorICAgIGNhc2UgQkNfQ09ERTEyOF9COg0KKyAgICBjYXNlIEJDX0NPREUxMjhfQzoNCisgICAgY2FzZSBCQ19FQU44Og0KKyAgICBjYXNlIEJDX0VBTjEzOg0KKyAgICBjYXNlIEJDX1VQQ0E6DQorICAgICAgcmV0dXJuIG1fcEJDRW5naW5lID8gKHN0YXRpY19jYXN0PENCQ19PbmVDb2RlKj4obV9wQkNFbmdpbmUpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPlNldENhbENoZWNrc3VtKHN0YXRlKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgOiBGQUxTRTsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkFMU0U7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ0ZYX0JhcmNvZGU6OlNldEZvbnQoQ0ZYX0ZvbnQqIHBGb250KSB7DQorICBzd2l0Y2ggKEdldFR5cGUoKSkgew0KKyAgICBjYXNlIEJDX0NPREUzOToNCisgICAgY2FzZSBCQ19DT0RBQkFSOg0KKyAgICBjYXNlIEJDX0NPREUxMjg6DQorICAgIGNhc2UgQkNfQ09ERTEyOF9COg0KKyAgICBjYXNlIEJDX0NPREUxMjhfQzoNCisgICAgY2FzZSBCQ19FQU44Og0KKyAgICBjYXNlIEJDX0VBTjEzOg0KKyAgICBjYXNlIEJDX1VQQ0E6DQorICAgICAgcmV0dXJuIG1fcEJDRW5naW5lDQorICAgICAgICAgICAgICAgICA/IHN0YXRpY19jYXN0PENCQ19PbmVDb2RlKj4obV9wQkNFbmdpbmUpLT5TZXRGb250KHBGb250KQ0KKyAgICAgICAgICAgICAgICAgOiBGQUxTRTsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkFMU0U7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ0ZYX0JhcmNvZGU6OlNldEZvbnRTaXplKEZYX0ZMT0FUIHNpemUpIHsNCisgIHN3aXRjaCAoR2V0VHlwZSgpKSB7DQorICAgIGNhc2UgQkNfQ09ERTM5Og0KKyAgICBjYXNlIEJDX0NPREFCQVI6DQorICAgIGNhc2UgQkNfQ09ERTEyODoNCisgICAgY2FzZSBCQ19DT0RFMTI4X0I6DQorICAgIGNhc2UgQkNfQ09ERTEyOF9DOg0KKyAgICBjYXNlIEJDX0VBTjg6DQorICAgIGNhc2UgQkNfRUFOMTM6DQorICAgIGNhc2UgQkNfVVBDQToNCisgICAgICByZXR1cm4gbV9wQkNFbmdpbmUNCisgICAgICAgICAgICAgICAgID8gKHN0YXRpY19jYXN0PENCQ19PbmVDb2RlKj4obV9wQkNFbmdpbmUpLT5TZXRGb250U2l6ZShzaXplKSwNCisgICAgICAgICAgICAgICAgICAgIFRSVUUpDQorICAgICAgICAgICAgICAgICA6IEZBTFNFOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgIH0NCit9DQorRlhfQk9PTCBDRlhfQmFyY29kZTo6U2V0Rm9udFN0eWxlKGludDMyX3Qgc3R5bGUpIHsNCisgIHN3aXRjaCAoR2V0VHlwZSgpKSB7DQorICAgIGNhc2UgQkNfQ09ERTM5Og0KKyAgICBjYXNlIEJDX0NPREFCQVI6DQorICAgIGNhc2UgQkNfQ09ERTEyODoNCisgICAgY2FzZSBCQ19DT0RFMTI4X0I6DQorICAgIGNhc2UgQkNfQ09ERTEyOF9DOg0KKyAgICBjYXNlIEJDX0VBTjg6DQorICAgIGNhc2UgQkNfRUFOMTM6DQorICAgIGNhc2UgQkNfVVBDQToNCisgICAgICByZXR1cm4gbV9wQkNFbmdpbmUNCisgICAgICAgICAgICAgICAgID8gKHN0YXRpY19jYXN0PENCQ19PbmVDb2RlKj4obV9wQkNFbmdpbmUpLT5TZXRGb250U3R5bGUoc3R5bGUpLA0KKyAgICAgICAgICAgICAgICAgICAgVFJVRSkNCisgICAgICAgICAgICAgICAgIDogRkFMU0U7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KK30NCitGWF9CT09MIENGWF9CYXJjb2RlOjpTZXRGb250Q29sb3IoRlhfQVJHQiBjb2xvcikgew0KKyAgc3dpdGNoIChHZXRUeXBlKCkpIHsNCisgICAgY2FzZSBCQ19DT0RFMzk6DQorICAgIGNhc2UgQkNfQ09EQUJBUjoNCisgICAgY2FzZSBCQ19DT0RFMTI4Og0KKyAgICBjYXNlIEJDX0NPREUxMjhfQjoNCisgICAgY2FzZSBCQ19DT0RFMTI4X0M6DQorICAgIGNhc2UgQkNfRUFOODoNCisgICAgY2FzZSBCQ19FQU4xMzoNCisgICAgY2FzZSBCQ19VUENBOg0KKyAgICAgIHJldHVybiBtX3BCQ0VuZ2luZQ0KKyAgICAgICAgICAgICAgICAgPyAoc3RhdGljX2Nhc3Q8Q0JDX09uZUNvZGUqPihtX3BCQ0VuZ2luZSktPlNldEZvbnRDb2xvcihjb2xvciksDQorICAgICAgICAgICAgICAgICAgICBUUlVFKQ0KKyAgICAgICAgICAgICAgICAgOiBGQUxTRTsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkFMU0U7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ0ZYX0JhcmNvZGU6OlNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbikgew0KKyAgdHlwZWRlZiBGWF9CT09MIChDQkNfQ29kZUJhc2U6OiptZW1wdHJ0eXBlKShCQ19URVhUX0xPQyk7DQorICBtZW1wdHJ0eXBlIG1lbXB0ciA9IE5VTEw7DQorICBzd2l0Y2ggKEdldFR5cGUoKSkgew0KKyAgICBjYXNlIEJDX0NPREUzOToNCisgICAgICBtZW1wdHIgPSAobWVtcHRydHlwZSkmQ0JDX0NvZGUzOTo6U2V0VGV4dExvY2F0aW9uOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEJDX0NPREFCQVI6DQorICAgICAgbWVtcHRyID0gKG1lbXB0cnR5cGUpJkNCQ19Db2RhYmFyOjpTZXRUZXh0TG9jYXRpb247DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgQkNfQ09ERTEyODoNCisgICAgY2FzZSBCQ19DT0RFMTI4X0I6DQorICAgIGNhc2UgQkNfQ09ERTEyOF9DOg0KKyAgICAgIG1lbXB0ciA9IChtZW1wdHJ0eXBlKSZDQkNfQ29kZTEyODo6U2V0VGV4dExvY2F0aW9uOw0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcEJDRW5naW5lICYmIG1lbXB0ciA/IChtX3BCQ0VuZ2luZS0+Km1lbXB0cikobG9jYXRpb24pIDogRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0JhcmNvZGU6OlNldFdpZGVOYXJyb3dSYXRpbyhpbnQzMl90IHJhdGlvKSB7DQorICB0eXBlZGVmIEZYX0JPT0wgKENCQ19Db2RlQmFzZTo6Km1lbXB0cnR5cGUpKGludDMyX3QpOw0KKyAgbWVtcHRydHlwZSBtZW1wdHIgPSBOVUxMOw0KKyAgc3dpdGNoIChHZXRUeXBlKCkpIHsNCisgICAgY2FzZSBCQ19DT0RFMzk6DQorICAgICAgbWVtcHRyID0gKG1lbXB0cnR5cGUpJkNCQ19Db2RlMzk6OlNldFdpZGVOYXJyb3dSYXRpbzsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBCQ19DT0RBQkFSOg0KKyAgICAgIG1lbXB0ciA9IChtZW1wdHJ0eXBlKSZDQkNfQ29kYWJhcjo6U2V0V2lkZU5hcnJvd1JhdGlvOw0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcEJDRW5naW5lICYmIG1lbXB0ciA/IChtX3BCQ0VuZ2luZS0+Km1lbXB0cikocmF0aW8pIDogRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0JhcmNvZGU6OlNldFN0YXJ0Q2hhcihGWF9DSEFSIHN0YXJ0KSB7DQorICB0eXBlZGVmIEZYX0JPT0wgKENCQ19Db2RlQmFzZTo6Km1lbXB0cnR5cGUpKEZYX0NIQVIpOw0KKyAgbWVtcHRydHlwZSBtZW1wdHIgPSBOVUxMOw0KKyAgc3dpdGNoIChHZXRUeXBlKCkpIHsNCisgICAgY2FzZSBCQ19DT0RBQkFSOg0KKyAgICAgIG1lbXB0ciA9IChtZW1wdHJ0eXBlKSZDQkNfQ29kYWJhcjo6U2V0U3RhcnRDaGFyOw0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcEJDRW5naW5lICYmIG1lbXB0ciA/IChtX3BCQ0VuZ2luZS0+Km1lbXB0cikoc3RhcnQpIDogRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0JhcmNvZGU6OlNldEVuZENoYXIoRlhfQ0hBUiBlbmQpIHsNCisgIHR5cGVkZWYgRlhfQk9PTCAoQ0JDX0NvZGVCYXNlOjoqbWVtcHRydHlwZSkoRlhfQ0hBUik7DQorICBtZW1wdHJ0eXBlIG1lbXB0ciA9IE5VTEw7DQorICBzd2l0Y2ggKEdldFR5cGUoKSkgew0KKyAgICBjYXNlIEJDX0NPREFCQVI6DQorICAgICAgbWVtcHRyID0gKG1lbXB0cnR5cGUpJkNCQ19Db2RhYmFyOjpTZXRFbmRDaGFyOw0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcEJDRW5naW5lICYmIG1lbXB0ciA/IChtX3BCQ0VuZ2luZS0+Km1lbXB0cikoZW5kKSA6IEZBTFNFOw0KK30NCitGWF9CT09MIENGWF9CYXJjb2RlOjpTZXRWZXJzaW9uKGludDMyX3QgdmVyc2lvbikgew0KKyAgdHlwZWRlZiBGWF9CT09MIChDQkNfQ29kZUJhc2U6OiptZW1wdHJ0eXBlKShpbnQzMl90KTsNCisgIG1lbXB0cnR5cGUgbWVtcHRyID0gTlVMTDsNCisgIHN3aXRjaCAoR2V0VHlwZSgpKSB7DQorICAgIGNhc2UgQkNfUVJfQ09ERToNCisgICAgICBtZW1wdHIgPSAobWVtcHRydHlwZSkmQ0JDX1FSQ29kZTo6U2V0VmVyc2lvbjsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBtX3BCQ0VuZ2luZSAmJiBtZW1wdHIgPyAobV9wQkNFbmdpbmUtPiptZW1wdHIpKHZlcnNpb24pIDogRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0JhcmNvZGU6OlNldEVycm9yQ29ycmVjdGlvbkxldmVsKGludDMyX3QgbGV2ZWwpIHsNCisgIHR5cGVkZWYgRlhfQk9PTCAoQ0JDX0NvZGVCYXNlOjoqbWVtcHRydHlwZSkoaW50MzJfdCk7DQorICBtZW1wdHJ0eXBlIG1lbXB0ciA9IE5VTEw7DQorICBzd2l0Y2ggKEdldFR5cGUoKSkgew0KKyAgICBjYXNlIEJDX1FSX0NPREU6DQorICAgICAgbWVtcHRyID0gKG1lbXB0cnR5cGUpJkNCQ19RUkNvZGU6OlNldEVycm9yQ29ycmVjdGlvbkxldmVsOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEJDX1BERjQxNzoNCisgICAgICBtZW1wdHIgPSAobWVtcHRydHlwZSkmQ0JDX1BERjQxN0k6OlNldEVycm9yQ29ycmVjdGlvbkxldmVsOw0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBtX3BCQ0VuZ2luZSAmJiBtZW1wdHIgPyAobV9wQkNFbmdpbmUtPiptZW1wdHIpKGxldmVsKSA6IEZBTFNFOw0KK30NCitGWF9CT09MIENGWF9CYXJjb2RlOjpTZXRUcnVuY2F0ZWQoRlhfQk9PTCB0cnVuY2F0ZWQpIHsNCisgIHR5cGVkZWYgdm9pZCAoQ0JDX0NvZGVCYXNlOjoqbWVtcHRydHlwZSkoRlhfQk9PTCk7DQorICBtZW1wdHJ0eXBlIG1lbXB0ciA9IE5VTEw7DQorICBzd2l0Y2ggKEdldFR5cGUoKSkgew0KKyAgICBjYXNlIEJDX1BERjQxNzoNCisgICAgICBtZW1wdHIgPSAobWVtcHRydHlwZSkmQ0JDX1BERjQxN0k6OlNldFRydW5jYXRlZDsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBtX3BCQ0VuZ2luZSAmJiBtZW1wdHIgPyAoKG1fcEJDRW5naW5lLT4qbWVtcHRyKSh0cnVuY2F0ZWQpLCBUUlVFKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZBTFNFOw0KK30NCisjaWZuZGVmIEJDRXhjZXB0aW9uTk8NCisjZGVmaW5lIEJDRXhjZXB0aW9uTk8gMA0KKyNlbmRpZg0KKyNpZm5kZWYgQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb24NCisjZGVmaW5lIEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uIDgNCisjZW5kaWYNCisjaWZuZGVmIEJDRXhjZXB0aW9uVW5TdXBwb3J0ZWRCYXJjb2RlDQorI2RlZmluZSBCQ0V4Y2VwdGlvblVuU3VwcG9ydGVkQmFyY29kZSAxOA0KKyNlbmRpZg0KK0ZYX0JPT0wgQ0ZYX0JhcmNvZGU6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzRGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoIW1fcEJDRW5naW5lKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBtX3BCQ0VuZ2luZS0+RW5jb2RlKGNvbnRlbnRzLCBpc0RldmljZSwgZSk7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0JhcmNvZGU6OlJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKCFtX3BCQ0VuZ2luZSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gbV9wQkNFbmdpbmUtPlJlbmRlckRldmljZShkZXZpY2UsIG1hdGlyeCwgZSk7DQorfQ0KK0ZYX0JPT0wgQ0ZYX0JhcmNvZGU6OlJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAqJiBwT3V0Qml0bWFwLCBpbnQzMl90JiBlKSB7DQorICBpZiAoIW1fcEJDRW5naW5lKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBtX3BCQ0VuZ2luZS0+UmVuZGVyQml0bWFwKHBPdXRCaXRtYXAsIGUpOw0KK30NCisjZGVmaW5lIEJDX1RZUEVfTUlOIEJDX0NPREUzOQ0KKyNkZWZpbmUgQkNfVFlQRV9NQVggQkNfREFUQU1BVFJJWA0KK0NGWF9XaWRlU3RyaW5nIENGWF9CYXJjb2RlOjpEZWNvZGUodWludDhfdCogYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZXJyb3JDb2RlKSB7DQorICBmb3IgKEJDX1RZUEUgdCA9IEJDX1RZUEVfTUlOOyB0IDw9IEJDX1RZUEVfTUFYOw0KKyAgICAgICB0ID0gKEJDX1RZUEUpKChpbnQzMl90KXQgKyAxKSkgew0KKyAgICBDQkNfQ29kZUJhc2UqIHBUbXBFbmdpbmUgPSBGWF9CYXJjb2RlX0NyZWF0ZUJhckNvZGVFbmdpbmVPYmplY3QodCk7DQorICAgIGlmICghcFRtcEVuZ2luZSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHJldCA9IHBUbXBFbmdpbmUtPkRlY29kZShidWYsIHdpZHRoLCBoZWlnaHQsIGVycm9yQ29kZSk7DQorICAgIGlmIChlcnJvckNvZGUgPT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgIHJldHVybiByZXQ7DQorICAgIH0NCisgIH0NCisgIGVycm9yQ29kZSA9IEJDRXhjZXB0aW9uVW5TdXBwb3J0ZWRCYXJjb2RlOw0KKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENGWF9CYXJjb2RlOjpEZWNvZGUoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQzMl90JiBlcnJvckNvZGUpIHsNCisgIGZvciAoQkNfVFlQRSB0ID0gQkNfVFlQRV9NSU47IHQgPD0gQkNfVFlQRV9NQVg7DQorICAgICAgIHQgPSAoQkNfVFlQRSkoKGludDMyX3QpdCArIDEpKSB7DQorICAgIENCQ19Db2RlQmFzZSogcFRtcEVuZ2luZSA9IEZYX0JhcmNvZGVfQ3JlYXRlQmFyQ29kZUVuZ2luZU9iamVjdCh0KTsNCisgICAgaWYgKCFwVG1wRW5naW5lKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgcmV0ID0gcFRtcEVuZ2luZS0+RGVjb2RlKHBCaXRtYXAsIGVycm9yQ29kZSk7DQorICAgIGlmIChlcnJvckNvZGUgPT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgIHJldHVybiByZXQ7DQorICAgIH0NCisgIH0NCisgIGVycm9yQ29kZSA9IEJDRXhjZXB0aW9uVW5TdXBwb3J0ZWRCYXJjb2RlOw0KKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7DQorfQ0KK0lGWF9CYXJjb2RlKiBGWF9CYXJjb2RlX0NyZWF0ZShCQ19UWVBFIHR5cGUpIHsNCisgIENGWF9CYXJjb2RlKiBwQmFyY29kZSA9IG5ldyBDRlhfQmFyY29kZTsNCisgIGlmIChwQmFyY29kZS0+Q3JyZWF0ZSh0eXBlKSkgew0KKyAgICByZXR1cm4gcEJhcmNvZGU7DQorICB9DQorICBwQmFyY29kZS0+UmVsZWFzZSgpOw0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2JhcmNvZGVpbXAuaCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2JhcmNvZGVpbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2E3ZTAxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfYmFyY29kZWltcC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX0JBUkNPREVfSU1QX0gNCisjZGVmaW5lIF9GV0xfQkFSQ09ERV9JTVBfSA0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wOw0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllczsNCitjbGFzcyBDRldMX1dpZGdldEltcERlbGVnYXRlOw0KK2NsYXNzIENGV0xfRWRpdEltcDsNCitjbGFzcyBDRldMX0VkaXRJbXBEZWxlZ2F0ZTsNCitjbGFzcyBJRldMX1dpZGdldDsNCitjbGFzcyBDRldMX0JhcmNvZGVFZGl0Ow0KK2NsYXNzIENGV0xfQmFyY29kZUVkaXREZWxlZ2F0ZTsNCitjbGFzcyBDRldMX0JhcmNvZGVJbXA7DQorY2xhc3MgQ0ZXTF9CYXJjb2RlSW1wRGVsZWdhdGU7DQorI2RlZmluZSBYRkFfQkNTX05lZWRVcGRhdGUgMHgwMDAxDQorI2RlZmluZSBYRkFfQkNTX0VuY29kZVN1Y2Nlc3MgMHgwMDAyDQorY2xhc3MgQ0ZXTF9CYXJjb2RlSW1wIDogcHVibGljIENGV0xfRWRpdEltcCB7DQorIHB1YmxpYzoNCisgIENGV0xfQmFyY29kZUltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcik7DQorICB2aXJ0dWFsIH5DRldMX0JhcmNvZGVJbXAoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2xhc3MpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRDbGFzc0lEKCkgY29uc3Q7DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgVXBkYXRlKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgdmlydHVhbCB2b2lkIFNldFR5cGUoQkNfVFlQRSB0eXBlKTsNCisgIEZYX0JPT0wgSXNQcm90ZWN0ZWRUeXBlKCk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgR2VuZXJhdGVCYXJjb2RlSW1hZ2VDYWNoZSgpOw0KKyAgdm9pZCBDcmVhdGVCYXJjb2RlRW5naW5lKCk7DQorICB2b2lkIFJlbGVhc2VCYXJjb2RlRW5naW5lKCk7DQorICBJRlhfQmFyY29kZSogbV9wQmFyY29kZUVuZ2luZTsNCisgIEZYX0RXT1JEIG1fZHdTdGF0dXM7DQorICBCQ19UWVBFIG1fdHlwZTsNCisgIGZyaWVuZCBjbGFzcyBDRldMX0JhcmNvZGVJbXBEZWxlZ2F0ZTsNCit9Ow0KK2NsYXNzIENGV0xfQmFyY29kZUltcERlbGVnYXRlIDogcHVibGljIENGV0xfRWRpdEltcERlbGVnYXRlIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9CYXJjb2RlSW1wRGVsZWdhdGUoQ0ZXTF9CYXJjb2RlSW1wKiBwT3duZXIpOw0KKyAgRldMX0VSUiBPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIG92ZXJyaWRlOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfY2FyZXRpbXAuaCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2NhcmV0aW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZiNDJjZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2NhcmV0aW1wLmgKQEAgLTAsMCArMSw2NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfQ0FSRVRfSU1QX0gNCisjZGVmaW5lIF9GV0xfQ0FSRVRfSU1QX0gNCisNCisjaW5jbHVkZSAieGZhL2luY2x1ZGUvZndsL2NvcmUvZndsX3RpbWVyLmgiDQorDQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXA7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzOw0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU7DQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgQ0ZXTF9DYXJldEltcDsNCitjbGFzcyBDRldMX0NhcmV0SW1wRGVsZWdhdGU7DQorY2xhc3MgQ0ZXTF9DYXJldEltcCA6IHB1YmxpYyBDRldMX1dpZGdldEltcCB7DQorIHB1YmxpYzoNCisgIENGV0xfQ2FyZXRJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKTsNCisgIHZpcnR1YWwgfkNGV0xfQ2FyZXRJbXAoKTsNCisNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2xhc3MpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRDbGFzc0lEKCkgY29uc3Q7DQorDQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQorDQorICB2aXJ0dWFsIEZXTF9FUlIgRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisNCisgIHZpcnR1YWwgRldMX0VSUiBTaG93Q2FyZXQoRlhfQk9PTCBiRmxhZyA9IFRSVUUpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldEZyZXF1ZW5jeShGWF9EV09SRCYgZWxhcHNlKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRGcmVxdWVuY3koRlhfRFdPUkQgZWxhcHNlKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRDb2xvcihDRlhfQ29sb3IgY3JGaWxsKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgRlhfQk9PTCBEcmF3Q2FyZXRCSyhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOw0KKyAgY2xhc3MgQ0ZXTF9DYXJldFRpbWVyIDogcHVibGljIElGV0xfVGltZXIgew0KKyAgIHB1YmxpYzoNCisgICAgQ0ZXTF9DYXJldFRpbWVyKENGV0xfQ2FyZXRJbXAqIG1fcENhcmV0KTsNCisgICAgfkNGV0xfQ2FyZXRUaW1lcigpIG92ZXJyaWRlIHt9DQorICAgIGludDMyX3QgUnVuKEZXTF9IVElNRVIgaFRpbWVyKSBvdmVycmlkZTsNCisgICAgQ0ZXTF9DYXJldEltcCogbV9wQ2FyZXQ7DQorICB9Ow0KKyAgQ0ZXTF9DYXJldFRpbWVyKiBtX3BUaW1lcjsNCisgIEZXTF9IVElNRVIgbV9oVGltZXI7DQorICBGWF9EV09SRCBtX2R3RWxhcHNlOw0KKyAgQ0ZYX0NvbG9yIG1fY3JGaWxsOw0KKyAgRlhfQk9PTCBtX2JTZXRDb2xvcjsNCisgIGZyaWVuZCBjbGFzcyBDRldMX0NhcmV0SW1wRGVsZWdhdGU7DQorICBmcmllbmQgY2xhc3MgQ0ZXTF9DYXJldFRpbWVyOw0KK307DQorY2xhc3MgQ0ZXTF9DYXJldEltcERlbGVnYXRlIDogcHVibGljIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGUgew0KKyBwdWJsaWM6DQorICBDRldMX0NhcmV0SW1wRGVsZWdhdGUoQ0ZXTF9DYXJldEltcCogcE93bmVyKTsNCisgIGludDMyX3QgT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSBvdmVycmlkZTsNCisgIEZXTF9FUlIgT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpIG92ZXJyaWRlOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRldMX0NhcmV0SW1wKiBtX3BPd25lcjsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2NoZWNrYm94aW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9jaGVja2JveGltcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYmNhZGUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9jaGVja2JveGltcC5oCkBAIC0wLDAgKzEsNjIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX0NIRUNLQk9YX0lNUF9IDQorI2RlZmluZSBfRldMX0NIRUNLQk9YX0lNUF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXA7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzOw0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU7DQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgQ0ZXTF9DaGVja0JveEltcDsNCitjbGFzcyBDRldMX0NoZWNrQm94SW1wRGVsZWdhdGU7DQorY2xhc3MgQ0ZXTF9DaGVja0JveEltcCA6IHB1YmxpYyBDRldMX1dpZGdldEltcCB7DQorIHB1YmxpYzoNCisgIENGV0xfQ2hlY2tCb3hJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKTsNCisgIH5DRldMX0NoZWNrQm94SW1wKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGV0xfRVJSIEluaXRpYWxpemUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBGaW5hbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBVcGRhdGUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldENoZWNrU3RhdGUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRDaGVja1N0YXRlKGludDMyX3QgaUNoZWNrKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBMYXlvdXQoKTsNCisgIEZYX0RXT1JEIEdldFBhcnRTdGF0ZXMoKTsNCisgIHZvaWQgVXBkYXRlVGV4dE91dFN0eWxlcygpOw0KKyAgdm9pZCBOZXh0U3RhdGVzKCk7DQorICBDRlhfUmVjdEYgbV9ydENsaWVudDsNCisgIENGWF9SZWN0RiBtX3J0Qm94Ow0KKyAgQ0ZYX1JlY3RGIG1fcnRDYXB0aW9uOw0KKyAgQ0ZYX1JlY3RGIG1fcnRGb2N1czsNCisgIEZYX0RXT1JEIG1fZHdUVE9TdHlsZXM7DQorICBpbnQzMl90IG1faVRUT0FsaWduOw0KKyAgRlhfQk9PTCBtX2JCdG5Eb3duOw0KKyAgZnJpZW5kIGNsYXNzIENGV0xfQ2hlY2tCb3hJbXBEZWxlZ2F0ZTsNCit9Ow0KK2NsYXNzIENGV0xfQ2hlY2tCb3hJbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9DaGVja0JveEltcERlbGVnYXRlKENGV0xfQ2hlY2tCb3hJbXAqIHBPd25lcik7DQorICBpbnQzMl90IE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgb3ZlcnJpZGU7DQorICBGV0xfRVJSIE9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKSBvdmVycmlkZTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBPbkFjdGl2YXRlKENGV0xfTWVzc2FnZSogcE1zZyk7DQorICB2b2lkIE9uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSogcE1zZywgRlhfQk9PTCBiU2V0ID0gVFJVRSk7DQorICB2b2lkIE9uTEJ1dHRvbkRvd24oQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uTEJ1dHRvblVwKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbk1vdXNlTW92ZShDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25Nb3VzZUxlYXZlKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbktleURvd24oQ0ZXTF9Nc2dLZXkqIHBNc2cpOw0KKyAgQ0ZXTF9DaGVja0JveEltcCogbV9wT3duZXI7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9jb21ib2JveGltcC5oIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfY29tYm9ib3hpbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzE1YWYyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfY29tYm9ib3hpbXAuaApAQCAtMCwwICsxLDIzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfQ09NQk9CT1hfSU1QX0gNCisjZGVmaW5lIF9GV0xfQ09NQk9CT1hfSU1QX0gNCisNCisjaW5jbHVkZSA8bWVtb3J5Pg0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9lZGl0aW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2xpc3Rib3hpbXAuaCINCisNCitjbGFzcyBDRldMX1dpZGdldEltcDsNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTsNCitjbGFzcyBDRldMX0xpc3RCb3hJbXA7DQorY2xhc3MgQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGU7DQorY2xhc3MgQ0ZXTF9Gb3JtUHJveHlJbXA7DQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgQ0ZXTF9Db21ib0VkaXRJbXA7DQorY2xhc3MgQ0ZXTF9Db21ib0VkaXRJbXBEZWxlZ2F0ZTsNCitjbGFzcyBDRldMX0NvbWJvTGlzdEltcDsNCitjbGFzcyBDRldMX0NvbWJvTGlzdEltcERlbGVnYXRlOw0KK2NsYXNzIENGV0xfQ29tYm9Cb3hJbXA7DQorY2xhc3MgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlOw0KK2NsYXNzIENGV0xfQ29tYm9Qcm94eUltcERlbGVnYXRlOw0KK2NsYXNzIENGV0xfQ29tYm9FZGl0SW1wIDogcHVibGljIENGV0xfRWRpdEltcCB7DQorIHB1YmxpYzoNCisgIENGV0xfQ29tYm9FZGl0SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpOw0KKw0KKyAgdm9pZCBDbGVhclNlbGVjdGVkKCk7DQorICB2b2lkIFNldFNlbGVjdGVkKCk7DQorICB2b2lkIEVuZENhcmV0KCk7DQorICB2b2lkIEZsYWdGb2N1cyhGWF9CT09MIGJTZXQpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIFNldENvbWJvQm94Rm9jdXMoRlhfQk9PTCBiU2V0KTsNCisgIENGV0xfQ29tYm9Cb3hJbXAqIG1fcE91dGVyOw0KKyAgZnJpZW5kIGNsYXNzIENGV0xfQ29tYm9FZGl0SW1wRGVsZWdhdGU7DQorfTsNCitjbGFzcyBDRldMX0NvbWJvRWRpdEltcERlbGVnYXRlIDogcHVibGljIENGV0xfRWRpdEltcERlbGVnYXRlIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9Db21ib0VkaXRJbXBEZWxlZ2F0ZShDRldMX0NvbWJvRWRpdEltcCogcE93bmVyKTsNCisgIGludDMyX3QgT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSBvdmVycmlkZTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZXTF9Db21ib0VkaXRJbXAqIG1fcE93bmVyOw0KK307DQorY2xhc3MgQ0ZXTF9Db21ib0xpc3RJbXAgOiBwdWJsaWMgQ0ZXTF9MaXN0Qm94SW1wIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9Db21ib0xpc3RJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcik7DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQorICBpbnQzMl90IE1hdGNoSXRlbShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NNYXRjaCk7DQorICB2b2lkIENoYW5nZVNlbGVjdGVkKGludDMyX3QgaVNlbCk7DQorICBpbnQzMl90IENvdW50SXRlbXMoKTsNCisgIHZvaWQgR2V0SXRlbVJlY3QoaW50MzJfdCBuSW5kZXgsIENGWF9SZWN0RiYgcnRJdGVtKTsNCisgIHZvaWQgQ2xpZW50VG9PdXRlcihGWF9GTE9BVCYgZngsIEZYX0ZMT0FUJiBmeSk7DQorICB2b2lkIFNldEZvY3VzKEZYX0JPT0wgYlNldCk7DQorICBGWF9CT09MIG1fYk5vdGlmeU93bmVyOw0KKyAgZnJpZW5kIGNsYXNzIENGV0xfQ29tYm9MaXN0SW1wRGVsZWdhdGU7DQorICBmcmllbmQgY2xhc3MgQ0ZXTF9Db21ib0JveEltcDsNCit9Ow0KK2NsYXNzIENGV0xfQ29tYm9MaXN0SW1wRGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGUgew0KKyBwdWJsaWM6DQorICBDRldMX0NvbWJvTGlzdEltcERlbGVnYXRlKENGV0xfQ29tYm9MaXN0SW1wKiBwT3duZXIpOw0KKyAgaW50MzJfdCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIG92ZXJyaWRlOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIE9uRHJvcExpc3RGb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlKiBwTXNnLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgIGludDMyX3QgT25Ecm9wTGlzdE1vdXNlTW92ZShDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIGludDMyX3QgT25Ecm9wTGlzdExCdXR0b25Eb3duKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgaW50MzJfdCBPbkRyb3BMaXN0TEJ1dHRvblVwKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgaW50MzJfdCBPbkRyb3BMaXN0S2V5KENGV0xfTXNnS2V5KiBwS2V5KTsNCisgIHZvaWQgT25Ecm9wTGlzdEtleURvd24oQ0ZXTF9Nc2dLZXkqIHBLZXkpOw0KKyAgQ0ZXTF9Db21ib0xpc3RJbXAqIG1fcE93bmVyOw0KK307DQorY2xhc3MgQ0ZXTF9Db21ib0JveEltcCA6IHB1YmxpYyBDRldMX1dpZGdldEltcCB7DQorIHB1YmxpYzoNCisgIENGV0xfQ29tYm9Cb3hJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKTsNCisgIHZpcnR1YWwgfkNGV0xfQ29tYm9Cb3hJbXAoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2xhc3MpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRDbGFzc0lEKCkgY29uc3Q7DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KKyAgdmlydHVhbCBGV0xfRVJSIE1vZGlmeVN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBVcGRhdGUoKTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGV0xfRVJSIERyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZVByb3ZpZGVyKTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRDdXJTZWwoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRDdXJTZWwoaW50MzJfdCBpU2VsKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRFZGl0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRFZGl0VGV4dExlbmd0aCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGV0xfRVJSIEdldEVkaXRUZXh0KENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnQgPSAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50ID0gLTEpIGNvbnN0Ow0KKyAgdmlydHVhbCBGV0xfRVJSIFNldEVkaXRTZWxSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQgPSAtMSk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0RWRpdFNlbFJhbmdlKGludDMyX3QgbkluZGV4LCBpbnQzMl90JiBuU3RhcnQpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEVkaXRMaW1pdCgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldEVkaXRMaW1pdChpbnQzMl90IG5MaW1pdCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRWRpdERvQ2xpcGJvYXJkKGludDMyX3QgaUNtZCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRWRpdFJlZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRWRpdFVuZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCk7DQorICB2aXJ0dWFsIElGV0xfTGlzdEJveCogR2V0TGlzdEJveHQoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBBZnRlckZvY3VzU2hvd0Ryb3BMaXN0KCk7DQorICB2aXJ0dWFsIEZYX0VSUiBPcGVuRHJvcERvd25MaXN0KEZYX0JPT0wgYkFjdGl2YXRlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBFZGl0Q2FuVW5kbygpOw0KKyAgdmlydHVhbCBGWF9CT09MIEVkaXRDYW5SZWRvKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRWRpdFVuZG8oKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBFZGl0UmVkbygpOw0KKyAgdmlydHVhbCBGWF9CT09MIEVkaXRDYW5Db3B5KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRWRpdENhbkN1dCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIEVkaXRDYW5TZWxlY3RBbGwoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBFZGl0Q29weShDRlhfV2lkZVN0cmluZyYgd3NDb3B5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBFZGl0Q3V0KENGWF9XaWRlU3RyaW5nJiB3c0N1dCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRWRpdFBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1Bhc3RlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBFZGl0U2VsZWN0QWxsKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRWRpdERlbGV0ZSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIEVkaXREZVNlbGVjdCgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldEJCb3goQ0ZYX1JlY3RGJiByZWN0KTsNCisgIHZpcnR1YWwgRldMX0VSUiBFZGl0TW9kaWZ5U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgRHJhd1N0cmV0Y2hIYW5kbGVyKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIEZYX0ZMT0FUIEdldExpc3RIZWlnaHQoKTsNCisgIHZvaWQgU2hvd0Ryb3BMaXN0KEZYX0JPT0wgYkFjdGl2YXRlKTsNCisgIEZYX0JPT0wgSXNEcm9wTGlzdFNob3dlZCgpOw0KKyAgRlhfQk9PTCBJc0Ryb3BEb3duU3R5bGUoKSBjb25zdDsNCisgIHZvaWQgTWF0Y2hFZGl0VGV4dCgpOw0KKyAgdm9pZCBTeW5jaHJFZGl0VGV4dChpbnQzMl90IGlMaXN0SXRlbSk7DQorICB2b2lkIExheW91dCgpOw0KKyAgdm9pZCBSZVNldFRoZW1lKCk7DQorICB2b2lkIFJlU2V0RWRpdEFsaWdubWVudCgpOw0KKyAgdm9pZCBSZVNldExpc3RJdGVtQWxpZ25tZW50KCk7DQorICB2b2lkIFByb2Nlc3NTZWxDaGFuZ2VkKEZYX0JPT0wgYkxCdXR0b25VcCk7DQorICB2b2lkIEluaXRQcm94eUZvcm0oKTsNCisgIEZXTF9FUlIgRGlzRm9ybV9Jbml0aWFsaXplKCk7DQorICB2b2lkIERpc0Zvcm1fSW5pdENvbWJvTGlzdCgpOw0KKyAgdm9pZCBEaXNGb3JtX0luaXRDb21ib0VkaXQoKTsNCisgIHZvaWQgRGlzRm9ybV9TaG93RHJvcExpc3QoRlhfQk9PTCBiQWN0aXZhdGUpOw0KKyAgRlhfQk9PTCBEaXNGb3JtX0lzRHJvcExpc3RTaG93ZWQoKTsNCisgIEZXTF9FUlIgRGlzRm9ybV9Nb2RpZnlTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpOw0KKyAgRldMX0VSUiBEaXNGb3JtX1VwZGF0ZSgpOw0KKyAgRlhfRFdPUkQgRGlzRm9ybV9IaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICBGV0xfRVJSIERpc0Zvcm1fRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIEZXTF9FUlIgRGlzRm9ybV9HZXRCQm94KENGWF9SZWN0RiYgcmVjdCk7DQorICB2b2lkIERpc0Zvcm1fTGF5b3V0KCk7DQorDQorICBDRlhfUmVjdEYgbV9ydENsaWVudDsNCisgIENGWF9SZWN0RiBtX3J0Q29udGVudDsNCisgIENGWF9SZWN0RiBtX3J0QnRuOw0KKyAgQ0ZYX1JlY3RGIG1fcnRMaXN0Ow0KKyAgQ0ZYX1JlY3RGIG1fcnRQcm94eTsNCisgIENGWF9SZWN0RiBtX3J0SGFuZGxlcjsNCisgIHN0ZDo6dW5pcXVlX3B0cjxJRldMX0VkaXQ+IG1fcEVkaXQ7DQorICBzdGQ6OnVuaXF1ZV9wdHI8SUZXTF9MaXN0Qm94PiBtX3BMaXN0Qm94Ow0KKyAgSUZXTF9Gb3JtKiBtX3BGb3JtOw0KKyAgRlhfQk9PTCBtX2JMQnV0dG9uRG93bjsNCisgIEZYX0JPT0wgbV9iVXBGb3JtSGFuZGxlcjsNCisgIGludDMyX3QgbV9pQ3VyU2VsOw0KKyAgaW50MzJfdCBtX2lCdG5TdGF0ZTsNCisgIEZYX0ZMT0FUIG1fZkNvbWJvRm9ybUhhbmRsZXI7DQorICBGWF9GTE9BVCBtX2ZJdGVtSGVpZ2h0Ow0KKyAgRlhfQk9PTCBtX2JOZWVkU2hvd0xpc3Q7DQorICBDRldMX0Zvcm1Qcm94eUltcCogbV9wUHJveHk7DQorICBDRldMX0NvbWJvUHJveHlJbXBEZWxlZ2F0ZSogbV9wTGlzdFByb3h5RGVsZWdhdGU7DQorDQorICBmcmllbmQgY2xhc3MgQ0ZXTF9Db21ib0xpc3RJbXA7DQorICBmcmllbmQgY2xhc3MgQ0ZXTF9Db21ib0VkaXRJbXA7DQorICBmcmllbmQgY2xhc3MgQ0ZXTF9Db21ib0VkaXRJbXBEZWxlZ2F0ZTsNCisgIGZyaWVuZCBjbGFzcyBDRldMX0NvbWJvTGlzdEltcERlbGVnYXRlOw0KKyAgZnJpZW5kIGNsYXNzIENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZTsNCisgIGZyaWVuZCBjbGFzcyBDRldMX0NvbWJvUHJveHlJbXBEZWxlZ2F0ZTsNCit9Ow0KK2NsYXNzIENGV0xfQ29tYm9Cb3hJbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9Db21ib0JveEltcERlbGVnYXRlKENGV0xfQ29tYm9Cb3hJbXAqIHBPd25lcik7DQorICBpbnQzMl90IE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgb3ZlcnJpZGU7DQorICBGV0xfRVJSIE9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkgb3ZlcnJpZGU7DQorICBGV0xfRVJSIE9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKSBvdmVycmlkZTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UqIHBNc2csIEZYX0JPT0wgYlNldCA9IFRSVUUpOw0KKyAgdm9pZCBPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbkxCdXR0b25VcChDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25Nb3VzZU1vdmUoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uTW91c2VMZWF2ZShDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25LZXkoQ0ZXTF9Nc2dLZXkqIHBNc2cpOw0KKyAgdm9pZCBEb1N1YkN0cmxLZXkoQ0ZXTF9Nc2dLZXkqIHBNc2cpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBpbnQzMl90IERpc0Zvcm1fT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKTsNCisgIHZvaWQgRGlzRm9ybV9PbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBEaXNGb3JtX09uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSogcE1zZywgRlhfQk9PTCBiU2V0ID0gVFJVRSk7DQorICB2b2lkIERpc0Zvcm1fT25LZXkoQ0ZXTF9Nc2dLZXkqIHBNc2cpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRldMX0NvbWJvQm94SW1wKiBtX3BPd25lcjsNCisgIGZyaWVuZCBjbGFzcyBDRldMX0NvbWJvRWRpdEltcERlbGVnYXRlOw0KKyAgZnJpZW5kIGNsYXNzIENGV0xfQ29tYm9MaXN0SW1wRGVsZWdhdGU7DQorfTsNCitjbGFzcyBDRldMX0NvbWJvUHJveHlJbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9Db21ib1Byb3h5SW1wRGVsZWdhdGUoSUZXTF9Gb3JtKiBwRm9ybSwgQ0ZXTF9Db21ib0JveEltcCogcENvbWJvQm94KTsNCisgIGludDMyX3QgT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSBvdmVycmlkZTsNCisgIEZXTF9FUlIgT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpIG92ZXJyaWRlOw0KKyAgdm9pZCBSZXNldCgpIHsgbV9iTEJ1dHRvblVwU2VsZiA9IEZBTFNFOyB9DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgT25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbkRlYWN0aXZlKENGV0xfTXNnRGVhY3RpdmF0ZSogcE1zZyk7DQorICB2b2lkIE9uRm9jdXNDaGFuZ2VkKENGV0xfTXNnS2lsbEZvY3VzKiBwTXNnLCBGWF9CT09MIGJTZXQpOw0KKyAgRlhfQk9PTCBtX2JMQnV0dG9uRG93bjsNCisgIEZYX0JPT0wgbV9iTEJ1dHRvblVwU2VsZjsNCisgIEZYX0ZMT0FUIG1fZlN0YXJ0UG9zOw0KKyAgSUZXTF9Gb3JtKiBtX3BGb3JtOw0KKyAgQ0ZXTF9Db21ib0JveEltcCogbV9wQ29tYm9Cb3g7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9kYXRldGltZXBpY2tlcmltcC5oIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfZGF0ZXRpbWVwaWNrZXJpbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmM4MmZiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfZGF0ZXRpbWVwaWNrZXJpbXAuaApAQCAtMCwwICsxLDIzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfREFURVRJTUVQSUNLRVJfSU1QX0gNCisjZGVmaW5lIF9GV0xfREFURVRJTUVQSUNLRVJfSU1QX0gNCisNCisjaW5jbHVkZSA8bWVtb3J5Pg0KKw0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wOw0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllczsNCitjbGFzcyBDRldMX1dpZGdldEltcERlbGVnYXRlOw0KK2NsYXNzIENGV0xfRWRpdEltcDsNCitjbGFzcyBDRldMX0VkaXRJbXBEZWxlZ2F0ZTsNCitjbGFzcyBDRldMX01vbnRoQ2FsZW5kYXJJbXA7DQorY2xhc3MgQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGU7DQorY2xhc3MgQ0ZXTF9Gb3JtUHJveHlJbXA7DQorY2xhc3MgQ0ZXTF9EYXRlVGltZUVkaXQ7DQorY2xhc3MgQ0ZXTF9EYXRlVGltZUVkaXRJbXBEZWxlZ2F0ZTsNCitjbGFzcyBDRldMX0RhdGVUaW1lQ2FsZW5kYXI7DQorY2xhc3MgQ0ZXTF9EYXRlVGltZUNhbGVuZGFySW1wRGVsZWdhdGU7DQorY2xhc3MgQ0ZXTF9EYXRlVGltZVBpY2tlckltcDsNCitjbGFzcyBDRldMX0RhdGVUaW1lUGlja2VySW1wRGVsZWdhdGU7DQorDQorY2xhc3MgSUZXTF9EYXRlVGltZUZvcm0gOiBwdWJsaWMgSUZXTF9Gb3JtIHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGV0xfRGF0ZVRpbWVGb3JtKiBDcmVhdGUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcik7DQorDQorIHByb3RlY3RlZDoNCisgIElGV0xfRGF0ZVRpbWVGb3JtKCkge30NCit9Ow0KKw0KK2NsYXNzIElGV0xfRGF0ZVRpbWVDYWxlbmRlciA6IHB1YmxpYyBJRldMX01vbnRoQ2FsZW5kYXIgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSUZXTF9EYXRlVGltZUNhbGVuZGVyKiBDcmVhdGUoDQorICAgICAgY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRldMX0RhdGVUaW1lQ2FsZW5kZXIoKSB7fQ0KK307DQorDQorY2xhc3MgSUZXTF9EYXRlVGltZUVkaXQgOiBwdWJsaWMgSUZXTF9FZGl0IHsNCisgcHVibGljOg0KKyAgc3RhdGljIElGV0xfRGF0ZVRpbWVFZGl0KiBDcmVhdGUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcik7DQorDQorIHByb3RlY3RlZDoNCisgIElGV0xfRGF0ZVRpbWVFZGl0KCkge30NCit9Ow0KKw0KK2NsYXNzIENGV0xfRGF0ZVRpbWVFZGl0IDogcHVibGljIENGV0xfRWRpdEltcCB7DQorIHB1YmxpYzoNCisgIENGV0xfRGF0ZVRpbWVFZGl0KGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEluaXRpYWxpemUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBGaW5hbGl6ZSgpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBmcmllbmQgY2xhc3MgQ0ZXTF9EYXRlVGltZUVkaXRJbXBEZWxlZ2F0ZTsNCit9Ow0KK2NsYXNzIENGV0xfRGF0ZVRpbWVFZGl0SW1wRGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9FZGl0SW1wRGVsZWdhdGUgew0KKyBwdWJsaWM6DQorICBDRldMX0RhdGVUaW1lRWRpdEltcERlbGVnYXRlKENGV0xfRGF0ZVRpbWVFZGl0KiBwT3duZXIpOw0KKyAgaW50MzJfdCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIG92ZXJyaWRlOw0KKw0KKyBwcml2YXRlOg0KKyAgaW50MzJfdCBEaXNGb3JtX09uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSk7DQorDQorIHByb3RlY3RlZDoNCisgIENGV0xfRGF0ZVRpbWVFZGl0KiBtX3BPd25lcjsNCit9Ow0KK2NsYXNzIENGV0xfRGF0ZVRpbWVDYWxlbmRhciA6IHB1YmxpYyBDRldMX01vbnRoQ2FsZW5kYXJJbXAgew0KKyBwdWJsaWM6DQorICBDRldMX0RhdGVUaW1lQ2FsZW5kYXIoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEluaXRpYWxpemUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBGaW5hbGl6ZSgpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBmcmllbmQgY2xhc3MgQ0ZXTF9EYXRlVGltZUNhbGVuZGFySW1wRGVsZWdhdGU7DQorfTsNCitjbGFzcyBDRldMX0RhdGVUaW1lQ2FsZW5kYXJJbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX01vbnRoQ2FsZW5kYXJJbXBEZWxlZ2F0ZSB7DQorIHB1YmxpYzoNCisgIENGV0xfRGF0ZVRpbWVDYWxlbmRhckltcERlbGVnYXRlKENGV0xfRGF0ZVRpbWVDYWxlbmRhciogcE93bmVyKTsNCisgIGludDMyX3QgT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSBvdmVycmlkZTsNCisNCisgIHZvaWQgT25MQnV0dG9uRG93bkV4KENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbkxCdXR0b25VcEV4KENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbk1vdXNlTW92ZUV4KENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKw0KKyBwcml2YXRlOg0KKyAgaW50MzJfdCBEaXNGb3JtX09uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSk7DQorICB2b2lkIERpc0Zvcm1fT25MQnV0dG9uVXBFeChDRldMX01zZ01vdXNlKiBwTXNnKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZXTF9EYXRlVGltZUNhbGVuZGFyKiBtX3BPd25lcjsNCisgIEZYX0JPT0wgbV9iRmxhZzsNCit9Ow0KK2NsYXNzIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXAgew0KKyBwdWJsaWM6DQorICBDRldMX0RhdGVUaW1lUGlja2VySW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcik7DQorICB2aXJ0dWFsIH5DRldMX0RhdGVUaW1lUGlja2VySW1wKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGV0xfRVJSIEluaXRpYWxpemUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBGaW5hbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBVcGRhdGUoKTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGV0xfRVJSIERyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIqIHBUUCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q3VyU2VsKGludDMyX3QmIGlZZWFyLCBpbnQzMl90JiBpTW9udGgsIGludDMyX3QmIGlEYXkpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldEN1clNlbChpbnQzMl90IGlZZWFyLCBpbnQzMl90IGlNb250aCwgaW50MzJfdCBpRGF5KTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRFZGl0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRFZGl0VGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0ID0gMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCA9IC0xKSBjb25zdDsNCisNCisgcHVibGljOg0KKyAgdmlydHVhbCBGWF9CT09MIENhblVuZG8oKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5SZWRvKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgVW5kbygpOw0KKyAgdmlydHVhbCBGWF9CT09MIFJlZG8oKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5Db3B5KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuQ3V0KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuU2VsZWN0QWxsKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ29weShDRlhfV2lkZVN0cmluZyYgd3NDb3B5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDdXQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ3V0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXN0ZSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2VsZWN0QWxsKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRGVsZXRlKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRGVTZWxlY3QoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRCQm94KENGWF9SZWN0RiYgcmVjdCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0RWRpdExpbWl0KGludDMyX3QgbkxpbWl0KTsNCisgIHZpcnR1YWwgRldMX0VSUiBNb2RpZnlFZGl0U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQorDQorIHB1YmxpYzoNCisgIElGV0xfRGF0ZVRpbWVFZGl0KiBHZXREYXRhVGltZUVkaXQoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBEcmF3RHJvcERvd25CdXR0b24oQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOw0KKyAgdm9pZCBGb3JtYXREYXRlU3RyaW5nKGludDMyX3QgaVllYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgdm9pZCBTaG93TW9udGhDYWxlbmRhcihGWF9CT09MIGJBY3RpdmF0ZSk7DQorICBGWF9CT09MIElzTW9udGhDYWxlbmRhclNob3dlZCgpOw0KKyAgdm9pZCBSZVNldEVkaXRBbGlnbm1lbnQoKTsNCisgIHZvaWQgSW5pdFByb3h5Rm9ybSgpOw0KKyAgdm9pZCBQcm9jZXNzU2VsQ2hhbmdlZChpbnQzMl90IGlZZWFyLCBpbnQzMl90IGlNb250aCwgaW50MzJfdCBpRGF5KTsNCisNCisgcHJpdmF0ZToNCisgIEZXTF9FUlIgRGlzRm9ybV9Jbml0aWFsaXplKCk7DQorICB2b2lkIERpc0Zvcm1fSW5pdERhdGVUaW1lQ2FsZW5kYXIoKTsNCisgIHZvaWQgRGlzRm9ybV9Jbml0RGF0ZVRpbWVFZGl0KCk7DQorICBGWF9CT09MIERpc0Zvcm1fSXNNb250aENhbGVuZGFyU2hvd2VkKCk7DQorICB2b2lkIERpc0Zvcm1fU2hvd01vbnRoQ2FsZW5kYXIoRlhfQk9PTCBiQWN0aXZhdGUpOw0KKyAgRlhfRFdPUkQgRGlzRm9ybV9IaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICBGWF9CT09MIERpc0Zvcm1fSXNOZWVkU2hvd0J1dHRvbigpOw0KKyAgRldMX0VSUiBEaXNGb3JtX1VwZGF0ZSgpOw0KKyAgRldMX0VSUiBEaXNGb3JtX0dldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCisgIEZXTF9FUlIgRGlzRm9ybV9HZXRCQm94KENGWF9SZWN0RiYgcmVjdCk7DQorICBGV0xfRVJSIERpc0Zvcm1fRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX1JlY3RGIG1fcnRCdG47DQorICBDRlhfUmVjdEYgbV9ydENsaWVudDsNCisgIGludDMyX3QgbV9pQnRuU3RhdGU7DQorICBpbnQzMl90IG1faVllYXI7DQorICBpbnQzMl90IG1faU1vbnRoOw0KKyAgaW50MzJfdCBtX2lEYXk7DQorICBGWF9CT09MIG1fYkxCdG5Eb3duOw0KKyAgc3RkOjp1bmlxdWVfcHRyPElGV0xfRGF0ZVRpbWVFZGl0PiBtX3BFZGl0Ow0KKyAgc3RkOjp1bmlxdWVfcHRyPElGV0xfRGF0ZVRpbWVDYWxlbmRlcj4gbV9wTW9udGhDYWw7DQorICBzdGQ6OnVuaXF1ZV9wdHI8SUZXTF9EYXRlVGltZUZvcm0+IG1fcEZvcm07DQorICBGWF9GTE9BVCBtX2ZCdG47DQorICBjbGFzcyBDRldMX01vbnRoQ2FsZW5kYXJJbXBEUCA6IHB1YmxpYyBJRldMX01vbnRoQ2FsZW5kYXJEUCB7DQorICAgcHVibGljOg0KKyAgICBDRldMX01vbnRoQ2FsZW5kYXJJbXBEUCgpIHsNCisgICAgICBtX2lDdXJZZWFyID0gMjAxMDsNCisgICAgICBtX2lDdXJNb250aCA9IDM7DQorICAgICAgbV9pQ3VyRGF5ID0gMjk7DQorICAgIH0NCisgICAgdmlydHVhbCBGV0xfRVJSIEdldENhcHRpb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0NhcHRpb24pIHsNCisgICAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgdmlydHVhbCBpbnQzMl90IEdldEN1ckRheShJRldMX1dpZGdldCogcFdpZGdldCkgeyByZXR1cm4gbV9pQ3VyRGF5OyB9DQorICAgIHZpcnR1YWwgaW50MzJfdCBHZXRDdXJNb250aChJRldMX1dpZGdldCogcFdpZGdldCkgeyByZXR1cm4gbV9pQ3VyTW9udGg7IH0NCisgICAgdmlydHVhbCBpbnQzMl90IEdldEN1clllYXIoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsgcmV0dXJuIG1faUN1clllYXI7IH0NCisgICAgaW50MzJfdCBtX2lDdXJEYXk7DQorICAgIGludDMyX3QgbV9pQ3VyWWVhcjsNCisgICAgaW50MzJfdCBtX2lDdXJNb250aDsNCisgIH07DQorDQorICBDRldMX01vbnRoQ2FsZW5kYXJJbXBEUCBtX01vbnRoQ2FsZW5kYXJEUDsNCisgIGZyaWVuZCBjbGFzcyBDRldMX0RhdGVUaW1lRWRpdEltcERlbGVnYXRlOw0KKyAgZnJpZW5kIGNsYXNzIENGV0xfRGF0ZVRpbWVDYWxlbmRhcjsNCisgIGZyaWVuZCBjbGFzcyBDRldMX0RhdGVUaW1lQ2FsZW5kYXJJbXBEZWxlZ2F0ZTsNCisgIGZyaWVuZCBjbGFzcyBDRldMX0RhdGVUaW1lUGlja2VySW1wRGVsZWdhdGU7DQorfTsNCitjbGFzcyBDRldMX0RhdGVUaW1lUGlja2VySW1wRGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZSB7DQorIHB1YmxpYzoNCisgIENGV0xfRGF0ZVRpbWVQaWNrZXJJbXBEZWxlZ2F0ZShDRldMX0RhdGVUaW1lUGlja2VySW1wKiBwT3duZXIpOw0KKyAgaW50MzJfdCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIG92ZXJyaWRlOw0KKyAgRldMX0VSUiBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCkgb3ZlcnJpZGU7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgT25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlKiBwTXNnLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgIHZvaWQgT25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorDQorICBDRldMX0RhdGVUaW1lUGlja2VySW1wKiBtX3BPd25lcjsNCisNCisgcHJpdmF0ZToNCisgIHZvaWQgRGlzRm9ybV9PbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UqIHBNc2csIEZYX0JPT0wgYlNldCA9IFRSVUUpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfZWRpdGltcC5oIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfZWRpdGltcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MDUyM2MKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9lZGl0aW1wLmgKQEAgLTAsMCArMSwyMDMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX0VESVRfSU1QX0gNCisjZGVmaW5lIF9GV0xfRURJVF9JTVBfSA0KKw0KKyNpbmNsdWRlIDxtZW1vcnk+DQorDQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXA7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzOw0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU7DQorY2xhc3MgQ0ZXTF9TY3JvbGxCYXJJbXA7DQorY2xhc3MgSUZXTF9DYXJldDsNCitjbGFzcyBJRldMX0FkYXB0ZXJUZXh0RmllbGQ7DQorY2xhc3MgQ0ZXTF9FZGl0SW1wOw0KK2NsYXNzIENGV0xfRWRpdEltcERlbGVnYXRlOw0KK2NsYXNzIENGV0xfRWRpdEltcCA6IHB1YmxpYyBDRldMX1dpZGdldEltcCwgcHVibGljIElGREVfVHh0RWR0RXZlbnRTaW5rIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9FZGl0SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywgSUZXTF9XaWRnZXQqIHBPdXRlcik7DQorICB+Q0ZXTF9FZGl0SW1wKCkgb3ZlcnJpZGU7DQorDQorICAvLyBDRldMX1dpZGdldEltcDoNCisgIEZXTF9FUlIgR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdCBvdmVycmlkZTsNCisgIEZYX0RXT1JEIEdldENsYXNzSUQoKSBjb25zdCBvdmVycmlkZTsNCisgIEZXTF9FUlIgSW5pdGlhbGl6ZSgpIG92ZXJyaWRlOw0KKyAgRldMX0VSUiBGaW5hbGl6ZSgpIG92ZXJyaWRlOw0KKyAgRldMX0VSUiBHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSkgb3ZlcnJpZGU7DQorICBGV0xfRVJSIFNldFdpZGdldFJlY3QoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSBvdmVycmlkZTsNCisgIEZXTF9FUlIgVXBkYXRlKCkgb3ZlcnJpZGU7DQorICBGWF9EV09SRCBIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgb3ZlcnJpZGU7DQorICBGV0xfRVJSIFNldFN0YXRlcyhGWF9EV09SRCBkd1N0YXRlcywgRlhfQk9PTCBiU2V0ID0gVFJVRSkgb3ZlcnJpZGU7DQorICBGV0xfRVJSIERyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpIG92ZXJyaWRlOw0KKyAgRldMX0VSUiBTZXRUaGVtZVByb3ZpZGVyKElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lUHJvdmlkZXIpIG92ZXJyaWRlOw0KKw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0VGV4dExlbmd0aCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0ID0gMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50ID0gLTEpIGNvbnN0Ow0KKyAgdmlydHVhbCBGV0xfRVJSIENsZWFyVGV4dCgpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldENhcmV0UG9zKCkgY29uc3Q7DQorICB2aXJ0dWFsIGludDMyX3QgU2V0Q2FyZXRQb3MoaW50MzJfdCBuSW5kZXgsIEZYX0JPT0wgYkJlZm9yZSA9IFRSVUUpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEFkZFNlbFJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCA9IC0xKTsNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudFNlbFJhbmdlcygpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFNlbFJhbmdlKGludDMyX3QgbkluZGV4LCBpbnQzMl90JiBuU3RhcnQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIENsZWFyU2VsZWN0aW9ucygpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldExpbWl0KCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0TGltaXQoaW50MzJfdCBuTGltaXQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldEFsaWFzQ2hhcihGWF9XQ0hBUiB3QWxpYXMpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldEZvcm1hdFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEluc2VydChpbnQzMl90IG5TdGFydCwgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwgaW50MzJfdCBuTGVuKTsNCisgIHZpcnR1YWwgRldMX0VSUiBEZWxldGVTZWxlY3Rpb25zKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRGVsZXRlUmFuZ2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50ID0gLTEpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFJlcGxhY2VTZWxlY3Rpb25zKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NSZXBsYWNlKTsNCisgIHZpcnR1YWwgRldMX0VSUiBSZXBsYWNlKGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1JlcGxhY2UpOw0KKyAgdmlydHVhbCBGV0xfRVJSIERvQ2xpcGJvYXJkKGludDMyX3QgaUNtZCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ29weShDRlhfV2lkZVN0cmluZyYgd3NDb3B5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDdXQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ3V0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXN0ZSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRGVsZXRlKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUmVkbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBVbmRvKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZWNvcmQpOw0KKyAgdmlydHVhbCBGWF9CT09MIFVuZG8oKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBSZWRvKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuVW5kbygpOw0KKyAgdmlydHVhbCBGWF9CT09MIENhblJlZG8oKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRUYWJXaWR0aChGWF9GTE9BVCBmVGFiV2lkdGgsIEZYX0JPT0wgYkVxdWlkaXN0YW50KTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRPdXRlcihJRldMX1dpZGdldCogcE91dGVyKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXROdW1iZXJSYW5nZShpbnQzMl90IGlNaW4sIGludDMyX3QgaU1heCk7DQorICB2b2lkIE9uX0NhcmV0Q2hhbmdlZChJRkRFX1R4dEVkdEVuZ2luZSogcEVkaXQsDQorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5QYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmlzaWJsZSA9IHRydWUpIG92ZXJyaWRlOw0KKyAgdm9pZCBPbl9UZXh0Q2hhbmdlZChJRkRFX1R4dEVkdEVuZ2luZSogcEVkaXQsDQorICAgICAgICAgICAgICAgICAgICAgIEZERV9UWFRFRFRfVEVYVENIQU5HRV9JTkZPJiBDaGFuZ2VJbmZvKSBvdmVycmlkZTsNCisgIHZvaWQgT25fUGFnZUNvdW50Q2hhbmdlZChJRkRFX1R4dEVkdEVuZ2luZSogcEVkaXQpIG92ZXJyaWRlIHt9DQorICB2b2lkIE9uX1NlbENoYW5nZWQoSUZERV9UeHRFZHRFbmdpbmUqIHBFZGl0KSBvdmVycmlkZTsNCisgIEZYX0JPT0wgT25fUGFnZUxvYWQoSUZERV9UeHRFZHRFbmdpbmUqIHBFZGl0LA0KKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5QYWdlSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblB1cnBvc2UpIG92ZXJyaWRlOw0KKyAgRlhfQk9PTCBPbl9QYWdlVW5sb2FkKElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5QYWdlSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuUHVycG9zZSkgb3ZlcnJpZGU7DQorICBGWF9CT09MIE9uX1BhZ2VDaGFuZ2UoSUZERV9UeHRFZHRFbmdpbmUqIHBFZGl0LCBpbnQzMl90IG5QYWdlSW5kZXgpIG92ZXJyaWRlIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICB2b2lkIE9uX0FkZERvUmVjb3JkKElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCwNCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RvUmVjb3JkKSBvdmVycmlkZTsNCisgIEZYX0JPT0wgT25fVmFsaWRhdGVGaWVsZChJRkRFX1R4dEVkdEVuZ2luZSogcEVkaXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQmxvY2tJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5GaWVsZEluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0ZpZWxkVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DaGFySW5kZXgpIG92ZXJyaWRlOw0KKyAgRlhfQk9PTCBPbl9WYWxpZGF0ZUJsb2NrKElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5CbG9ja0luZGV4KSBvdmVycmlkZTsNCisgIEZYX0JPT0wgT25fR2V0QmxvY2tGb3JtYXRUZXh0KElGREVfVHh0RWR0RW5naW5lKiBwRWRpdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkJsb2NrSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NCbG9ja1RleHQpIG92ZXJyaWRlOw0KKyAgRlhfQk9PTCBPbl9WYWxpZGF0ZShJRkRFX1R4dEVkdEVuZ2luZSogcEVkaXQsDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIG92ZXJyaWRlOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldEJhY2tncm91bmRDb2xvcihGWF9EV09SRCBjb2xvcik7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0Rm9udChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb250LCBGWF9GTE9BVCBmU2l6ZSk7DQorICB2b2lkIFNldFNjcm9sbE9mZnNldChGWF9GTE9BVCBmU2Nyb2xsT2Zmc2V0KTsNCisgIEZYX0JPT0wgR2V0U3VnZ2VzdFdvcmRzKENGWF9Qb2ludEYgcG9pbnRmLCBDRlhfQnl0ZVN0cmluZ0FycmF5JiBzU3VnZ2VzdCk7DQorICBGWF9CT09MIFJlcGxhY2VTcGVsbENoZWNrV29yZChDRlhfUG9pbnRGIHBvaW50ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZXBsYWNlKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBEcmF3VGV4dEJrKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgRHJhd0NvbnRlbnQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIFVwZGF0ZUVkaXRFbmdpbmUoKTsNCisgIHZvaWQgVXBkYXRlRWRpdFBhcmFtcygpOw0KKyAgdm9pZCBVcGRhdGVFZGl0TGF5b3V0KCk7DQorICBGWF9CT09MIFVwZGF0ZU9mZnNldCgpOw0KKyAgRlhfQk9PTCBVcGRhdGVPZmZzZXQoSUZXTF9TY3JvbGxCYXIqIHBTY3JvbGxCYXIsIEZYX0ZMT0FUIGZQb3NDaGFuZ2VkKTsNCisgIHZvaWQgVXBkYXRlVkFsaWdubWVudCgpOw0KKyAgdm9pZCBVcGRhdGVDYXJldCgpOw0KKyAgSUZXTF9TY3JvbGxCYXIqIFVwZGF0ZVNjcm9sbCgpOw0KKyAgdm9pZCBMYXlvdXQoKTsNCisgIHZvaWQgTGF5b3V0U2Nyb2xsQmFyKCk7DQorICB2b2lkIERldmljZVRvRW5naW5lKENGWF9Qb2ludEYmIHB0KTsNCisgIHZvaWQgSW5pdFNjcm9sbEJhcihGWF9CT09MIGJWZXJ0ID0gVFJVRSk7DQorICB2b2lkIEluaXRFbmdpbmUoKTsNCisgIHZpcnR1YWwgdm9pZCBTaG93Q2FyZXQoRlhfQk9PTCBiVmlzaWJsZSwgQ0ZYX1JlY3RGKiBwUmVjdCA9IE5VTEwpOw0KKyAgRlhfQk9PTCBWYWxpZGF0ZU51bWJlckNoYXIoRlhfV0NIQVIgY051bSk7DQorICB2b2lkIEluaXRDYXJldCgpOw0KKyAgdm9pZCBDbGVhclJlY29yZCgpOw0KKyAgRlhfQk9PTCBJc1Nob3dTY3JvbGxCYXIoRlhfQk9PTCBiVmVydCk7DQorICBGWF9CT09MIElzQ29udGVudEhlaWdodE92ZXJmbG93KCk7DQorICBpbnQzMl90IEFkZERvUmVjb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEb1JlY29yZCk7DQorICB2b2lkIFByb2Nlc3NJbnNlcnRFcnJvcihpbnQzMl90IGlFcnJvcik7DQorDQorICB2b2lkIERyYXdTcGVsbENoZWNrKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIEFkZFNwZWxsQ2hlY2tPYmooQ0ZYX1BhdGgmIFBhdGhEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZPZmZTZXRYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZPZmZTZXRZKTsNCisgIGludDMyX3QgR2V0V29yZEF0UG9pbnQoQ0ZYX1BvaW50RiBwb2ludGYsIGludDMyX3QmIG5Db3VudCk7DQorICBDRlhfUmVjdEYgbV9ydENsaWVudDsNCisgIENGWF9SZWN0RiBtX3J0RW5naW5lOw0KKyAgQ0ZYX1JlY3RGIG1fcnRTdGF0aWM7DQorICBGWF9GTE9BVCBtX2ZWQWxpZ25PZmZzZXQ7DQorICBGWF9GTE9BVCBtX2ZTY3JvbGxPZmZzZXRYOw0KKyAgRlhfRkxPQVQgbV9mU2Nyb2xsT2Zmc2V0WTsNCisgIElGREVfVHh0RWR0RW5naW5lKiBtX3BFZHRFbmdpbmU7DQorICBGWF9CT09MIG1fYkxCdXR0b25Eb3duOw0KKyAgaW50MzJfdCBtX25TZWxTdGFydDsNCisgIGludDMyX3QgbV9uTGltaXQ7DQorICBGWF9GTE9BVCBtX2ZTcGFjZUFib3ZlOw0KKyAgRlhfRkxPQVQgbV9mU3BhY2VCZWxvdzsNCisgIEZYX0ZMT0FUIG1fZkZvbnRTaXplOw0KKyAgRlhfQVJHQiBtX2FyZ2JTZWw7DQorICBGWF9CT09MIG1fYlNldFJhbmdlOw0KKyAgaW50MzJfdCBtX2lNaW47DQorICBpbnQzMl90IG1faU1heDsNCisgIHN0ZDo6dW5pcXVlX3B0cjxJRldMX1Njcm9sbEJhcj4gbV9wVmVydFNjcm9sbEJhcjsNCisgIHN0ZDo6dW5pcXVlX3B0cjxJRldMX1Njcm9sbEJhcj4gbV9wSG9yelNjcm9sbEJhcjsNCisgIHN0ZDo6dW5pcXVlX3B0cjxJRldMX0NhcmV0PiBtX3BDYXJldDsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NDYWNoZTsNCisgIGZyaWVuZCBjbGFzcyBDRldMX1R4dEVkdEV2ZW50U2luazsNCisgIGZyaWVuZCBjbGFzcyBDRldMX0VkaXRJbXBEZWxlZ2F0ZTsNCisgIEZYX0RXT1JEIG1fYmFja0NvbG9yOw0KKyAgRlhfQk9PTCBtX3VwZGF0ZUJhY2tDb2xvcjsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NGb250Ow0KKyAgQ0ZYX0J5dGVTdHJpbmdBcnJheSBtX1JlY29yZEFycjsNCisgIGludDMyX3QgbV9pQ3VyUmVjb3JkOw0KKyAgaW50MzJfdCBtX2lNYXhSZWNvcmQ7DQorfTsNCitjbGFzcyBDRldMX0VkaXRJbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9FZGl0SW1wRGVsZWdhdGUoQ0ZXTF9FZGl0SW1wKiBwT3duZXIpOw0KKyAgaW50MzJfdCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIG92ZXJyaWRlOw0KKyAgRldMX0VSUiBPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIG92ZXJyaWRlOw0KKyAgRldMX0VSUiBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCkgb3ZlcnJpZGU7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgRG9BY3RpdmF0ZShDRldMX01zZ0FjdGl2YXRlKiBwTXNnKTsNCisgIHZvaWQgRG9EZWFjdGl2YXRlKENGV0xfTXNnRGVhY3RpdmF0ZSogcE1zZyk7DQorICB2b2lkIERvQnV0dG9uRG93bihDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlKiBwTXNnLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgIHZvaWQgT25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uQnV0dG9uRGJsQ2xrKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbk1vdXNlTW92ZShDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25LZXlEb3duKENGV0xfTXNnS2V5KiBwTXNnKTsNCisgIHZvaWQgT25DaGFyKENGV0xfTXNnS2V5KiBwTXNnKTsNCisgIEZYX0JPT0wgT25TY3JvbGwoSUZXTF9TY3JvbGxCYXIqIHBTY3JvbGxCYXIsIEZYX0RXT1JEIGR3Q29kZSwgRlhfRkxPQVQgZlBvcyk7DQorICB2b2lkIERvQ3Vyc29yKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgQ0ZXTF9FZGl0SW1wKiBtX3BPd25lcjsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2Zvcm1wcm94eWltcC5oIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfZm9ybXByb3h5aW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUxYWM4ZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2Zvcm1wcm94eWltcC5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX0ZPUk1QUk9YWV9JTVBfSA0KKyNkZWZpbmUgX0ZXTF9GT1JNUFJPWFlfSU1QX0gNCitjbGFzcyBDRldMX1dpZGdldEltcDsNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTsNCitjbGFzcyBDRldMX0Zvcm1JbXA7DQorY2xhc3MgQ0ZXTF9Gb3JtUHJveHlJbXA7DQorY2xhc3MgQ0ZXTF9Gb3JtUHJveHlJbXBEZWxlZ2F0ZTsNCitjbGFzcyBDRldMX0Zvcm1Qcm94eUltcCA6IHB1YmxpYyBDRldMX0Zvcm1JbXAgew0KKyBwdWJsaWM6DQorICBDRldMX0Zvcm1Qcm94eUltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKTsNCisgIH5DRldMX0Zvcm1Qcm94eUltcCgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Q7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldENsYXNzSUQoKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0luc3RhbmNlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDbGFzcykgY29uc3Q7DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgVXBkYXRlKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgZnJpZW5kIGNsYXNzIENGV0xfRm9ybVByb3h5SW1wRGVsZWdhdGU7DQorfTsNCitjbGFzcyBDRldMX0Zvcm1Qcm94eUltcERlbGVnYXRlIDogcHVibGljIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGUgew0KKyBwdWJsaWM6DQorICBDRldMX0Zvcm1Qcm94eUltcERlbGVnYXRlKENGV0xfRm9ybVByb3h5SW1wKiBwT3duZXIpOw0KKyAgaW50MzJfdCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIG92ZXJyaWRlOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRldMX0Zvcm1Qcm94eUltcCogbV9wT3duZXI7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9saXN0Ym94aW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9saXN0Ym94aW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcwMGY0OQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX2xpc3Rib3hpbXAuaApAQCAtMCwwICsxLDExOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfTElTVEJPWF9JTVBfSA0KKyNkZWZpbmUgX0ZXTF9MSVNUQk9YX0lNUF9IDQorDQorI2luY2x1ZGUgPG1lbW9yeT4NCisNCitjbGFzcyBDRldMX1dpZGdldEltcDsNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTsNCitjbGFzcyBDRldMX1Njcm9sbEJhckltcDsNCitjbGFzcyBJRldMX1dpZGdldDsNCitjbGFzcyBDRldMX0xpc3RCb3hJbXA7DQorY2xhc3MgQ0ZXTF9MaXN0Qm94SW1wRGVsZWdhdGU7DQorY2xhc3MgQ0ZXTF9MaXN0Qm94SW1wIDogcHVibGljIENGV0xfV2lkZ2V0SW1wIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9MaXN0Qm94SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKTsNCisgIH5DRldMX0xpc3RCb3hJbXAoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2xhc3MpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRDbGFzc0lEKCkgY29uc3Q7DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFVwZGF0ZSgpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRUaGVtZVByb3ZpZGVyKElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lUHJvdmlkZXIpOw0KKyAgdmlydHVhbCBpbnQzMl90IENvdW50U2VsSXRlbXMoKTsNCisgIHZpcnR1YWwgRldMX0hMSVNUSVRFTSBHZXRTZWxJdGVtKGludDMyX3QgbkluZGV4U2VsKTsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRTZWxJbmRleChpbnQzMl90IG5JbmRleCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0U2VsSXRlbShGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9CT09MIGJTZWxlY3QgPSBUUlVFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRJdGVtVGV4dChGV0xfSExJU1RJVEVNIGhJdGVtLCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRTY3JvbGxQb3MoRlhfRkxPQVQmIGZQb3MsIEZYX0JPT0wgYlZlcnQgPSBUUlVFKTsNCisgIHZpcnR1YWwgRldMX0VSUiogU29ydChJRldMX0xpc3RCb3hDb21wYXJlKiBwQ29tKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgRldMX0hMSVNUSVRFTSBHZXRJdGVtKEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0RXT1JEIGR3S2V5Q29kZSk7DQorICB2b2lkIFNldFNlbGVjdGlvbihGV0xfSExJU1RJVEVNIGhTdGFydCwNCisgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEVuZCwNCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNlbGVjdGVkKTsNCisgIHZvaWQgU2V0U2VsZWN0aW9uRGlyZWN0KEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0JPT0wgYlNlbGVjdCk7DQorICBGWF9CT09MIElzSXRlbVNlbGVjdGVkKEZXTF9ITElTVElURU0gaEl0ZW0pOw0KKyAgdm9pZCBDbGVhclNlbGVjdGlvbigpOw0KKyAgdm9pZCBTZWxlY3RBbGwoKTsNCisgIEZXTF9ITElTVElURU0gR2V0Rm9jdXNlZEl0ZW0oKTsNCisgIHZvaWQgU2V0Rm9jdXNJdGVtKEZXTF9ITElTVElURU0gaEl0ZW0pOw0KKyAgRldMX0hMSVNUSVRFTSBHZXRJdGVtQXRQb2ludChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgRlhfQk9PTCBHZXRJdGVtQ2hlY2tSZWN0KEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9SZWN0RiYgcnRDaGVjayk7DQorICBGWF9CT09MIFNldEl0ZW1DaGVja2VkKEZXTF9ITElTVElURU0gaEl0ZW0sIEZYX0JPT0wgYkNoZWNrZWQpOw0KKyAgRlhfQk9PTCBHZXRJdGVtQ2hlY2tlZChGV0xfSExJU1RJVEVNIGhJdGVtKTsNCisgIEZYX0JPT0wgU2Nyb2xsVG9WaXNpYmxlKEZXTF9ITElTVElURU0gaEl0ZW0pOw0KKyAgdm9pZCBEcmF3Qmtncm91bmQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgRHJhd0l0ZW1zKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIERyYXdJdGVtKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgaW50MzJfdCBJbmRleCwNCisgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEl0ZW0sDQorICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgRHJhd1N0YXRpYyhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUpOw0KKyAgQ0ZYX1NpemVGIENhbGNTaXplKEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KKyAgdm9pZCBHZXRJdGVtU2l6ZShDRlhfU2l6ZUYmIHNpemUsDQorICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQorICBGWF9GTE9BVCBHZXRNYXhUZXh0V2lkdGgoKTsNCisgIEZYX0ZMT0FUIEdldFNjcm9sbFdpZHRoKCk7DQorICBGWF9GTE9BVCBHZXRJdGVtSGVpZ3QoKTsNCisgIHZvaWQgSW5pdFNjcm9sbEJhcihGWF9CT09MIGJWZXJ0ID0gVFJVRSk7DQorICB2b2lkIFNvcnRJdGVtKCk7DQorICBGWF9CT09MIElzU2hvd1Njcm9sbEJhcihGWF9CT09MIGJWZXJ0KTsNCisgIHZvaWQgUHJvY2Vzc1NlbENoYW5nZWQoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX1JlY3RGIG1fcnRDbGllbnQ7DQorICBDRlhfUmVjdEYgbV9ydFN0YXRpYzsNCisgIENGWF9SZWN0RiBtX3J0Q29uZW50Ow0KKyAgc3RkOjp1bmlxdWVfcHRyPElGV0xfU2Nyb2xsQmFyPiBtX3BIb3J6U2Nyb2xsQmFyOw0KKyAgc3RkOjp1bmlxdWVfcHRyPElGV0xfU2Nyb2xsQmFyPiBtX3BWZXJ0U2Nyb2xsQmFyOw0KKyAgRlhfRFdPUkQgbV9kd1RUT1N0eWxlczsNCisgIGludDMyX3QgbV9pVFRPQWxpZ25zOw0KKyAgRldMX0hMSVNUSVRFTSBtX2hBbmNob3I7DQorICBGWF9GTE9BVCBtX2ZJdGVtSGVpZ2h0Ow0KKyAgRlhfRkxPQVQgbV9mU2NvcmxsQmFyV2lkdGg7DQorICBGWF9CT09MIG1fYkxCdXR0b25Eb3duOw0KKyAgSUZXTF9UaGVtZVByb3ZpZGVyKiBtX3BTY3JvbGxCYXJUUDsNCisgIGZyaWVuZCBjbGFzcyBDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZTsNCit9Ow0KK2NsYXNzIENGV0xfTGlzdEJveEltcERlbGVnYXRlIDogcHVibGljIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGUgew0KKyBwdWJsaWM6DQorICBDRldMX0xpc3RCb3hJbXBEZWxlZ2F0ZShDRldMX0xpc3RCb3hJbXAqIHBPd25lcik7DQorICBpbnQzMl90IE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgb3ZlcnJpZGU7DQorICBGV0xfRVJSIE9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkgb3ZlcnJpZGU7DQorICBGV0xfRVJSIE9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKSBvdmVycmlkZTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UqIHBNc2csIEZYX0JPT0wgYlNldCA9IFRSVUUpOw0KKyAgdm9pZCBPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbkxCdXR0b25VcChDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25Nb3VzZVdoZWVsKENGV0xfTXNnTW91c2VXaGVlbCogcE1zZyk7DQorICB2b2lkIE9uS2V5RG93bihDRldMX01zZ0tleSogcE1zZyk7DQorICB2b2lkIE9uVksoRldMX0hMSVNUSVRFTSBoSXRlbSwgRlhfQk9PTCBiU2hpZnQsIEZYX0JPT0wgYkN0cmwpOw0KKyAgRlhfQk9PTCBPblNjcm9sbChJRldMX1Njcm9sbEJhciogcFNjcm9sbEJhciwgRlhfRFdPUkQgZHdDb2RlLCBGWF9GTE9BVCBmUG9zKTsNCisgIHZvaWQgRGlzcGF0Y2hTZWxDaGFuZ2VkRXYoKTsNCisgIENGV0xfTGlzdEJveEltcCogbV9wT3duZXI7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9tb250aGNhbGVuZGFyaW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9tb250aGNhbGVuZGFyaW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE2NTllZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX21vbnRoY2FsZW5kYXJpbXAuaApAQCAtMCwwICsxLDI0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfTU9OVEhDQUxFTkRBUl9JTVBfSA0KKyNkZWZpbmUgX0ZXTF9NT05USENBTEVOREFSX0lNUF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXA7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzOw0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU7DQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgSUZERV9EYXRlVGltZTsNCitjbGFzcyBDRkRFX0RhdGVUaW1lOw0KK2V4dGVybiB1aW50OF90IEZYX0RheXNJbk1vbnRoKGludDMyX3QgaVllYXIsIHVpbnQ4X3QgaU1vbnRoKTsNCitjbGFzcyBDRldMX01vbnRoQ2FsZW5kYXJJbXA7DQorY2xhc3MgQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGU7DQorY2xhc3MgQ0ZXTF9Nb250aENhbGVuZGFySW1wIDogcHVibGljIENGV0xfV2lkZ2V0SW1wIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9Nb250aENhbGVuZGFySW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKTsNCisgIH5DRldMX01vbnRoQ2FsZW5kYXJJbXAoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2xhc3MpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRDbGFzc0lEKCkgY29uc3Q7DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFVwZGF0ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIERyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRTZWxlY3QoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRTZWxlY3QoaW50MzJfdCYgaVllYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaURheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXggPSAwKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRTZWxlY3QoaW50MzJfdCBpWWVhciwgaW50MzJfdCBpTW9udGgsIGludDMyX3QgaURheSk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgRHJhd0JrZ3JvdW5kKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIHZvaWQgRHJhd0hlYWRCSyhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIHZvaWQgRHJhd0xCdXR0b24oQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIHZvaWQgRHJhd1JCdXR0b24oQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIHZvaWQgRHJhd0NhcHRpb24oQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIHZvaWQgRHJhd1NlcGVyYXRvcihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIHZvaWQgRHJhd0RhdGVzSW5CSyhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIHZvaWQgRHJhd1dlZWsoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIHZvaWQgRHJhd1dlZWtOdW1iZXIoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIHZvaWQgRHJhd1dlZWtOdW1iZXJTZXAoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIHZvaWQgRHJhd1RvZGF5KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIHZvaWQgRHJhd0RhdGVzSW4oQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIHZvaWQgRHJhd0RhdGVzT3V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIHZvaWQgRHJhd0RhdGVzSW5DaXJjbGUoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIHZvaWQgRHJhd1RvZGF5Q2lyY2xlKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIENGWF9TaXplRiBDYWxjU2l6ZShGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCisgIHZvaWQgTGF5T3V0KCk7DQorICB2b2lkIENhbGNIZWFkU2l6ZSgpOw0KKyAgdm9pZCBDYWxjVG9kYXlTaXplKCk7DQorICB2b2lkIENhbERhdGVJdGVtKCk7DQorICB2b2lkIEdldENhcFZhbHVlKCk7DQorICBpbnQzMl90IENhbFdlZWtOdW1iZXIoaW50MzJfdCBpWWVhciwgaW50MzJfdCBpTW9udGgsIGludDMyX3QgaURheSk7DQorDQorICBGWF9CT09MIEdldE1pbkRhdGUoaW50MzJfdCYgaVllYXIsIGludDMyX3QmIGlNb250aCwgaW50MzJfdCYgaURheSk7DQorICBGWF9CT09MIFNldE1pbkRhdGUoaW50MzJfdCBpWWVhciwgaW50MzJfdCBpTW9udGgsIGludDMyX3QgaURheSk7DQorICBGWF9CT09MIEdldE1heERhdGUoaW50MzJfdCYgaVllYXIsIGludDMyX3QmIGlNb250aCwgaW50MzJfdCYgaURheSk7DQorICBGWF9CT09MIFNldE1heERhdGUoaW50MzJfdCBpWWVhciwgaW50MzJfdCBpTW9udGgsIGludDMyX3QgaURheSk7DQorICBGWF9CT09MIEluaXREYXRlKCk7DQorICB2b2lkIENsZWFyRGF0ZUl0ZW0oKTsNCisgIHZvaWQgUmVTZXREYXRlSXRlbSgpOw0KKyAgRlhfQk9PTCBOZXh0TW9udGgoKTsNCisgIEZYX0JPT0wgUHJldk1vbnRoKCk7DQorICB2b2lkIENoYW5nZVRvTW9udGgoaW50MzJfdCBpWWVhciwgaW50MzJfdCBpTW9udGgpOw0KKyAgRlhfQk9PTCBSZW1vdmVTZWxEYXkoaW50MzJfdCBpRGF5LCBGWF9CT09MIGJBbGwgPSBGQUxTRSk7DQorICBGWF9CT09MIEFkZFNlbERheShpbnQzMl90IGlEYXkpOw0KKyAgRlhfQk9PTCBKdW1wVG9Ub2RheSgpOw0KKyAgdm9pZCBHZXRIZWFkVGV4dChpbnQzMl90IGlZZWFyLCBpbnQzMl90IGlNb250aCwgQ0ZYX1dpZGVTdHJpbmcmIHdzSGVhZCk7DQorICB2b2lkIEdldFRvZGF5VGV4dChpbnQzMl90IGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEYXksDQorICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NUb2RheSk7DQorICBpbnQzMl90IEdldERheUF0UG9pbnQoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSk7DQorICBGWF9CT09MIEdldERheVJlY3QoaW50MzJfdCBpRGF5LCBDRlhfUmVjdEYmIHJ0RGF5KTsNCisgIHR5cGVkZWYgc3RydWN0IF9EQVRFIHsNCisgICAgX0RBVEUoKSB7DQorICAgICAgaVllYXIgPSAwOw0KKyAgICAgIGlNb250aCA9IDA7DQorICAgICAgaURheSA9IDA7DQorICAgIH0NCisgICAgX0RBVEUoaW50MzJfdCB5ZWFyLCBpbnQzMl90IG1vbnRoLCBpbnQzMl90IGRheSkNCisgICAgICAgIDogaVllYXIoeWVhciksIGlNb250aChtb250aCksIGlEYXkoZGF5KSB7fQ0KKyAgICBGWF9CT09MIG9wZXJhdG9yPChjb25zdCBfREFURSYgcmlnaHQpIHsNCisgICAgICBpZiAoaVllYXIgPCByaWdodC5pWWVhcikgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfSBlbHNlIGlmIChpWWVhciA9PSByaWdodC5pWWVhcikgew0KKyAgICAgICAgaWYgKGlNb250aCA8IHJpZ2h0LmlNb250aCkgew0KKyAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0gZWxzZSBpZiAoaU1vbnRoID09IHJpZ2h0LmlNb250aCkgew0KKyAgICAgICAgICByZXR1cm4gaURheSA8IHJpZ2h0LmlEYXk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBGWF9CT09MIG9wZXJhdG9yPihjb25zdCBfREFURSYgcmlnaHQpIHsNCisgICAgICBpZiAoaVllYXIgPiByaWdodC5pWWVhcikgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfSBlbHNlIGlmIChpWWVhciA9PSByaWdodC5pWWVhcikgew0KKyAgICAgICAgaWYgKGlNb250aCA+IHJpZ2h0LmlNb250aCkgew0KKyAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0gZWxzZSBpZiAoaU1vbnRoID09IHJpZ2h0LmlNb250aCkgew0KKyAgICAgICAgICByZXR1cm4gaURheSA+IHJpZ2h0LmlEYXk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpbnQzMl90IGlZZWFyOw0KKyAgICBpbnQzMl90IGlNb250aDsNCisgICAgaW50MzJfdCBpRGF5Ow0KKw0KKyAgfSBEQVRFLCAqTFBEQVRFOw0KKyAgRlhfQk9PTCBtX2JJbml0Ow0KKyAgQ0ZYX1JlY3RGIG1fcnRIZWFkOw0KKyAgQ0ZYX1JlY3RGIG1fcnRXZWVrOw0KKyAgQ0ZYX1JlY3RGIG1fcnRMQnRuOw0KKyAgQ0ZYX1JlY3RGIG1fcnRSQnRuOw0KKyAgQ0ZYX1JlY3RGIG1fcnREYXRlczsNCisgIENGWF9SZWN0RiBtX3J0SFNlcDsNCisgIENGWF9SZWN0RiBtX3J0SGVhZFRleHQ7DQorICBDRlhfUmVjdEYgbV9ydFRvZGF5Ow0KKyAgQ0ZYX1JlY3RGIG1fcnRUb2RheUZsYWc7DQorICBDRlhfUmVjdEYgbV9ydFdlZWtOdW07DQorICBDRlhfUmVjdEYgbV9ydFdlZWtOdW1TZXA7DQorICBDRlhfUmVjdEYgbV9ydFRlbXA7DQorICBDRlhfV2lkZVN0cmluZyBtX3dzSGVhZDsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NUb2RheTsNCisgIENGWF9EYXRlVGltZSogbV9wRGF0ZVRpbWU7DQorICBDRlhfUHRyQXJyYXkgbV9hcnJEYXRlczsNCisgIGludDMyX3QgbV9pQ3VyWWVhcjsNCisgIGludDMyX3QgbV9pQ3VyTW9udGg7DQorICBpbnQzMl90IG1faVllYXI7DQorICBpbnQzMl90IG1faU1vbnRoOw0KKyAgaW50MzJfdCBtX2lEYXk7DQorICBpbnQzMl90IG1faUhvdmVyZWQ7DQorICBpbnQzMl90IG1faUxCdG5QYXJ0U3RhdGVzOw0KKyAgaW50MzJfdCBtX2lSQnRuUGFydFN0YXRlczsNCisgIERBVEUgbV9kdE1pbjsNCisgIERBVEUgbV9kdE1heDsNCisgIENGWF9TaXplRiBtX3N6SGVhZDsNCisgIENGWF9TaXplRiBtX3N6Q2VsbDsNCisgIENGWF9TaXplRiBtX3N6VG9kYXk7DQorICB0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+IENGV0xfSW50MzJBcnJheTsNCisgIENGV0xfSW50MzJBcnJheSBtX2FyclNlbERheXM7DQorICBpbnQzMl90IG1faU1heFNlbDsNCisgIENGWF9SZWN0RiBtX3J0Q2xpZW50Ow0KKyAgRlhfRkxPQVQgbV9mSGVhZFdpZDsNCisgIEZYX0ZMT0FUIG1fZkhlYWRIZWk7DQorICBGWF9GTE9BVCBtX2ZIZWFkQnRuV2lkOw0KKyAgRlhfRkxPQVQgbV9mSGVhZEJ0bkhlaTsNCisgIEZYX0ZMT0FUIG1fZkhlYWRCdG5ITWFyZ2luOw0KKyAgRlhfRkxPQVQgbV9mSGVhZEJ0blZNYXJnaW47DQorICBGWF9GTE9BVCBtX2ZIZWFkVGV4dFdpZDsNCisgIEZYX0ZMT0FUIG1fZkhlYWRUZXh0SGVpOw0KKyAgRlhfRkxPQVQgbV9mSGVhZFRleHRITWFyZ2luOw0KKyAgRlhfRkxPQVQgbV9mSGVhZFRleHRWTWFyZ2luOw0KKyAgRlhfRkxPQVQgbV9mSFNlcFdpZDsNCisgIEZYX0ZMT0FUIG1fZkhTZXBIZWk7DQorDQorICBGWF9GTE9BVCBtX2ZXZWVrTnVtV2lkOw0KKyAgRlhfRkxPQVQgbV9mU2VwRE9mZnNldDsNCisgIEZYX0ZMT0FUIG1fZlNlcFg7DQorICBGWF9GTE9BVCBtX2ZTZXBZOw0KKw0KKyAgRlhfRkxPQVQgbV9mV2Vla051bUhlaWdoOw0KKyAgRlhfRkxPQVQgbV9mV2Vla1dpZDsNCisgIEZYX0ZMT0FUIG1fZldlZWtIZWk7DQorICBGWF9GTE9BVCBtX2ZEYXRlQ2VsbFdpZDsNCisgIEZYX0ZMT0FUIG1fZkRhdGVDZWxsSGVpOw0KKw0KKyAgRlhfRkxPQVQgbV9mVG9kYXlXaWQ7DQorICBGWF9GTE9BVCBtX2ZUb2RheUhlaTsNCisgIEZYX0ZMT0FUIG1fZlRvZGF5RmxhZ1dpZDsNCisNCisgIEZYX0ZMT0FUIG1fZk1DV2lkOw0KKyAgRlhfRkxPQVQgbV9mTUNIZWk7DQorICBmcmllbmQgY2xhc3MgQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGU7DQorfTsNCit0eXBlZGVmIHN0cnVjdCBfREFURUlORk8gew0KKyAgX0RBVEVJTkZPKGludDMyX3QgZGF5LA0KKyAgICAgICAgICAgIGludDMyX3QgZGF5b2Z3ZWVrLA0KKyAgICAgICAgICAgIEZYX0RXT1JEIGR3U3QsDQorICAgICAgICAgICAgQ0ZYX1JlY3RGIHJjLA0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c2RheSkNCisgICAgICA6IGlEYXkoZGF5KSwNCisgICAgICAgIGlEYXlPZldlZWsoZGF5b2Z3ZWVrKSwNCisgICAgICAgIGR3U3RhdGVzKGR3U3QpLA0KKyAgICAgICAgcmVjdChyYyksDQorICAgICAgICB3c0RheSh3c2RheSkge30NCisgIGludDMyX3QgaURheTsNCisgIGludDMyX3QgaURheU9mV2VlazsNCisgIEZYX0RXT1JEIGR3U3RhdGVzOw0KKyAgQ0ZYX1JlY3RGIHJlY3Q7DQorICBDRlhfV2lkZVN0cmluZyB3c0RheTsNCit9IERBVEVJTkZPLCAqTFBEQVRFSU5GTzsNCitjbGFzcyBDRldMX01vbnRoQ2FsZW5kYXJJbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9Nb250aENhbGVuZGFySW1wRGVsZWdhdGUoQ0ZXTF9Nb250aENhbGVuZGFySW1wKiBwT3duZXIpOw0KKyAgaW50MzJfdCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIG92ZXJyaWRlOw0KKyAgRldMX0VSUiBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCkgb3ZlcnJpZGU7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgT25BY3RpdmF0ZShDRldMX01lc3NhZ2UqIHBNc2cpOw0KKyAgdm9pZCBPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UqIHBNc2csIEZYX0JPT0wgYlNldCA9IFRSVUUpOw0KKyAgdm9pZCBPbkxCdXR0b25Eb3duKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbkxCdXR0b25VcChDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25Nb3VzZU1vdmUoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uTW91c2VMZWF2ZShDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIENGV0xfTW9udGhDYWxlbmRhckltcCogbV9wT3duZXI7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9waWN0dXJlYm94aW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9waWN0dXJlYm94aW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY1Mzc1YQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3BpY3R1cmVib3hpbXAuaApAQCAtMCwwICsxLDUxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9QSUNUVVJFQk9YX0lNUF9IDQorI2RlZmluZSBfRldMX1BJQ1RVUkVCT1hfSU1QX0gNCitjbGFzcyBDRldMX1dpZGdldEltcDsNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTsNCitjbGFzcyBJRldMX1dpZGdldDsNCitjbGFzcyBDRldMX1BpY3R1cmVCb3hJbXA7DQorY2xhc3MgQ0ZXTF9QaWN0dXJlQm94SW1wRGVsZWdhdGU7DQorY2xhc3MgQ0ZXTF9QaWN0dXJlQm94SW1wIDogcHVibGljIENGV0xfV2lkZ2V0SW1wIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9QaWN0dXJlQm94SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKTsNCisgIH5DRldMX1BpY3R1cmVCb3hJbXAoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2xhc3MpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRDbGFzc0lEKCkgY29uc3Q7DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFVwZGF0ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIERyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgRHJhd0JrZ3JvdW5kKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICBGWF9CT09MIFZTdHlsZShGWF9CT09MIGR3U3R5bGUpOw0KKyAgQ0ZYX1JlY3RGIG1fcnRDbGllbnQ7DQorICBDRlhfUmVjdEYgbV9ydEltYWdlOw0KKyAgQ0ZYX01hdHJpeCBtX21hdHJpeDsNCisgIEZYX0JPT0wgbV9iVG9wOw0KKyAgRlhfQk9PTCBtX2JWQ2VudGVyOw0KKyAgRlhfQk9PTCBtX2JCdXR0b247DQorICBmcmllbmQgY2xhc3MgQ0ZXTF9QaWN0dXJlQm94SW1wRGVsZWdhdGU7DQorfTsNCitjbGFzcyBDRldMX1BpY3R1cmVCb3hJbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9QaWN0dXJlQm94SW1wRGVsZWdhdGUoQ0ZXTF9QaWN0dXJlQm94SW1wKiBwT3duZXIpOw0KKyAgRldMX0VSUiBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCkgb3ZlcnJpZGU7DQorDQorIHByb3RlY3RlZDoNCisgIENGV0xfUGljdHVyZUJveEltcCogbV9wT3duZXI7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9wdXNoYnV0dG9uaW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9wdXNoYnV0dG9uaW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc5MzFjMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3B1c2hidXR0b25pbXAuaApAQCAtMCwwICsxLDYzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9QVVNIQlVUVE9OX0lNUF9IDQorI2RlZmluZSBfRldMX1BVU0hCVVRUT05fSU1QX0gNCitjbGFzcyBDRldMX1dpZGdldEltcDsNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTsNCitjbGFzcyBJRldMX1dpZGdldDsNCitjbGFzcyBDRldMX1B1c2hCdXR0b25JbXA7DQorY2xhc3MgQ0ZXTF9QdXNoQnV0dG9uSW1wRGVsZWdhdGU7DQorY2xhc3MgQ0ZXTF9QdXNoQnV0dG9uSW1wIDogcHVibGljIENGV0xfV2lkZ2V0SW1wIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9QdXNoQnV0dG9uSW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKTsNCisgIHZpcnR1YWwgfkNGV0xfUHVzaEJ1dHRvbkltcCgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Q7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldENsYXNzSUQoKSBjb25zdDsNCisgIHZpcnR1YWwgRldMX0VSUiBJbml0aWFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRmluYWxpemUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBVcGRhdGUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIERyYXdCa2dyb3VuZChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICB2b2lkIERyYXdUZXh0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICBGWF9EV09SRCBHZXRQYXJ0U3RhdGVzKCk7DQorICB2b2lkIFVwZGF0ZVRleHRPdXRTdHlsZXMoKTsNCisgIENGWF9SZWN0RiBtX3J0Q2xpZW50Ow0KKyAgQ0ZYX1JlY3RGIG1fcnRDYXB0aW9uOw0KKyAgRlhfQk9PTCBtX2JCdG5Eb3duOw0KKyAgRlhfRFdPUkQgbV9kd1RUT1N0eWxlczsNCisgIGludDMyX3QgbV9pVFRPQWxpZ247DQorICBmcmllbmQgY2xhc3MgQ0ZXTF9QdXNoQnV0dG9uSW1wRGVsZWdhdGU7DQorfTsNCitjbGFzcyBDRldMX1B1c2hCdXR0b25JbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9QdXNoQnV0dG9uSW1wRGVsZWdhdGUoQ0ZXTF9QdXNoQnV0dG9uSW1wKiBwT3duZXIpOw0KKyAgaW50MzJfdCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIG92ZXJyaWRlOw0KKyAgRldMX0VSUiBPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIG92ZXJyaWRlOw0KKyAgRldMX0VSUiBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCkgb3ZlcnJpZGU7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgT25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlKiBwTXNnLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgIHZvaWQgT25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uS2V5RG93bihDRldMX01zZ0tleSogcE1zZyk7DQorICBDRldMX1B1c2hCdXR0b25JbXAqIG1fcE93bmVyOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfc2Nyb2xsYmFyaW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9zY3JvbGxiYXJpbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmRmM2E2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfc2Nyb2xsYmFyaW1wLmgKQEAgLTAsMCArMSwxMzggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX1NDUk9MTEJBUl9JTVBfSA0KKyNkZWZpbmUgX0ZXTF9TQ1JPTExCQVJfSU1QX0gNCitjbGFzcyBDRldMX1dpZGdldEltcDsNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTsNCitjbGFzcyBJRldMX1dpZGdldDsNCitjbGFzcyBJRldMX1RpbWVyOw0KK2NsYXNzIElGV0xfVGltZXJEZWxlZ2F0ZTsNCitjbGFzcyBDRldMX1Njcm9sbEJhckltcDsNCitjbGFzcyBDRldMX1Njcm9sbEJhckltcERlbGVnYXRlOw0KK2NsYXNzIENGV0xfU2Nyb2xsQmFySW1wIDogcHVibGljIENGV0xfV2lkZ2V0SW1wLCBwdWJsaWMgSUZXTF9UaW1lciB7DQorIHB1YmxpYzoNCisgIENGV0xfU2Nyb2xsQmFySW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpOw0KKyAgfkNGV0xfU2Nyb2xsQmFySW1wKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGV0xfRVJSIEluaXRpYWxpemUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBGaW5hbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBVcGRhdGUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzVmVydGljYWwoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRSYW5nZShGWF9GTE9BVCYgZk1pbiwgRlhfRkxPQVQmIGZNYXgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFJhbmdlKEZYX0ZMT0FUIGZNaW4sIEZYX0ZMT0FUIGZNYXgpOw0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRQYWdlU2l6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFBhZ2VTaXplKEZYX0ZMT0FUIGZQYWdlU2l6ZSk7DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldFN0ZXBTaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0U3RlcFNpemUoRlhfRkxPQVQgZlN0ZXBTaXplKTsNCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0UG9zKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0UG9zKEZYX0ZMT0FUIGZQb3MpOw0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRUcmFja1BvcygpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFRyYWNrUG9zKEZYX0ZMT0FUIGZUcmFja1Bvcyk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRG9TY3JvbGwoRlhfRFdPUkQgZHdDb2RlLCBGWF9GTE9BVCBmUG9zID0gMC4wZik7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0T3V0ZXIoSUZXTF9XaWRnZXQqIHBPdXRlcik7DQorICB2aXJ0dWFsIGludDMyX3QgUnVuKEZXTF9IVElNRVIgaFRpbWVyKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBEcmF3VHJhY2soQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxvd2VyID0gVFJVRSwNCisgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgRHJhd0Fycm93QnRuKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJNaW5CdG4gPSBUUlVFLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdm9pZCBEcmF3VGh1bWIoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgTGF5b3V0KCk7DQorICB2b2lkIENhbGNCdXR0b25MZW4oKTsNCisgIHZvaWQgQ2FsY01pbkJ1dHRvblJlY3QoQ0ZYX1JlY3RGJiByZWN0KTsNCisgIHZvaWQgQ2FsY01heEJ1dHRvblJlY3QoQ0ZYX1JlY3RGJiByZWN0KTsNCisgIHZvaWQgQ2FsY1RodW1iQnV0dG9uUmVjdChDRlhfUmVjdEYmIHJlY3QpOw0KKyAgdm9pZCBDYWxjTWluVHJhY2tSZWN0KENGWF9SZWN0RiYgcmVjdCk7DQorICB2b2lkIENhbGNNYXhUcmFja1JlY3QoQ0ZYX1JlY3RGJiByZWN0KTsNCisgIEZYX0ZMT0FUIEdldFRyYWNrUG9pbnRQb3MoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZvaWQgR2V0VHJhY2tSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiTG93ZXIgPSBUUlVFKTsNCisgIEZYX0JPT0wgU2VuZEV2ZW50KCk7DQorICBGWF9CT09MIE9uU2Nyb2xsKEZYX0RXT1JEIGR3Q29kZSwgRlhfRkxPQVQgZlBvcyk7DQorDQorICBGV0xfSFRJTUVSIG1faFRpbWVyOw0KKyAgRlhfRkxPQVQgbV9mUmFuZ2VNaW47DQorICBGWF9GTE9BVCBtX2ZSYW5nZU1heDsNCisgIEZYX0ZMT0FUIG1fZlBhZ2VTaXplOw0KKyAgRlhfRkxPQVQgbV9mU3RlcFNpemU7DQorICBGWF9GTE9BVCBtX2ZQb3M7DQorICBGWF9GTE9BVCBtX2ZUcmFja1BvczsNCisgIGludDMyX3QgbV9pTWluQnV0dG9uU3RhdGU7DQorICBpbnQzMl90IG1faU1heEJ1dHRvblN0YXRlOw0KKyAgaW50MzJfdCBtX2lUaHVtYkJ1dHRvblN0YXRlOw0KKyAgaW50MzJfdCBtX2lNaW5UcmFja1N0YXRlOw0KKyAgaW50MzJfdCBtX2lNYXhUcmFja1N0YXRlOw0KKyAgRlhfRkxPQVQgbV9mTGFzdFRyYWNrUG9zOw0KKyAgRlhfRkxPQVQgbV9jcFRyYWNrUG9pbnRYOw0KKyAgRlhfRkxPQVQgbV9jcFRyYWNrUG9pbnRZOw0KKyAgaW50MzJfdCBtX2lNb3VzZVdoZWVsOw0KKyAgRlhfQk9PTCBtX2JUcmFja01vdXNlTGVhdmU7DQorICBGWF9CT09MIG1fYk1vdXNlSG92ZXI7DQorICBGWF9CT09MIG1fYk1vdXNlRG93bjsNCisgIEZYX0JPT0wgbV9iUmVwYWludFRodW1iOw0KKyAgRlhfRkxPQVQgbV9mQnV0dG9uTGVuOw0KKyAgRlhfQk9PTCBtX2JNaW5TaXplOw0KKyAgQ0ZYX1JlY3RGIG1fcnRDbGllbnQ7DQorICBDRlhfUmVjdEYgbV9ydFRodW1iOw0KKyAgQ0ZYX1JlY3RGIG1fcnRNaW5CdG47DQorICBDRlhfUmVjdEYgbV9ydE1heEJ0bjsNCisgIENGWF9SZWN0RiBtX3J0TWluVHJhY2s7DQorICBDRlhfUmVjdEYgbV9ydE1heFRyYWNrOw0KKyAgRlhfQk9PTCBtX2JDdXN0b21MYXlvdXQ7DQorICBGWF9GTE9BVCBtX2ZNaW5UaHVtYjsNCisgIGZyaWVuZCBjbGFzcyBDRldMX1Njcm9sbEJhckltcERlbGVnYXRlOw0KK307DQorY2xhc3MgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9TY3JvbGxCYXJJbXBEZWxlZ2F0ZShDRldMX1Njcm9sbEJhckltcCogcE93bmVyKTsNCisgIGludDMyX3QgT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSBvdmVycmlkZTsNCisgIEZXTF9FUlIgT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpIG92ZXJyaWRlOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIE9uTEJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZvaWQgT25MQnV0dG9uVXAoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZvaWQgT25Nb3VzZU1vdmUoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZvaWQgT25Nb3VzZUxlYXZlKCk7DQorICB2b2lkIE9uTW91c2VXaGVlbChGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5LA0KKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZEZWx0YVgsDQorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRGVsdGFZKTsNCisgIHZvaWQgRG9Nb3VzZURvd24oaW50MzJfdCBpSXRlbSwNCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEl0ZW0sDQorICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KTsNCisgIHZvaWQgRG9Nb3VzZVVwKGludDMyX3QgaUl0ZW0sDQorICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0SXRlbSwNCisgICAgICAgICAgICAgICAgIGludDMyX3QmIGlTdGF0ZSwNCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpOw0KKyAgdm9pZCBEb01vdXNlTW92ZShpbnQzMl90IGlJdGVtLA0KKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0SXRlbSwNCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpOw0KKyAgdm9pZCBEb01vdXNlTGVhdmUoaW50MzJfdCBpSXRlbSwgY29uc3QgQ0ZYX1JlY3RGJiBydEl0ZW0sIGludDMyX3QmIGlTdGF0ZSk7DQorICB2b2lkIERvTW91c2VIb3ZlcihpbnQzMl90IGlJdGVtLCBjb25zdCBDRlhfUmVjdEYmIHJ0SXRlbSwgaW50MzJfdCYgaVN0YXRlKTsNCisNCisgIENGV0xfU2Nyb2xsQmFySW1wKiBtX3BPd25lcjsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3NwaW5idXR0b25pbXAuaCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3NwaW5idXR0b25pbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzI0NDJmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfc3BpbmJ1dHRvbmltcC5oCkBAIC0wLDAgKzEsNjggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX1NQSU5CVVRUT05fSU1QX0gNCisjZGVmaW5lIF9GV0xfU1BJTkJVVFRPTl9JTVBfSA0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wOw0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllczsNCitjbGFzcyBDRldMX1dpZGdldEltcERlbGVnYXRlOw0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIElGV0xfVGltZXI7DQorY2xhc3MgQ0ZXTF9TcGluQnV0dG9uSW1wOw0KK2NsYXNzIENGV0xfU3BpbkJ1dHRvbkltcERlbGVnYXRlOw0KK2NsYXNzIENGV0xfU3BpbkJ1dHRvbkltcCA6IHB1YmxpYyBDRldMX1dpZGdldEltcCwgcHVibGljIElGV0xfVGltZXIgew0KKyBwdWJsaWM6DQorICBDRldMX1NwaW5CdXR0b25JbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpOw0KKyAgfkNGV0xfU3BpbkJ1dHRvbkltcCgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Q7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldENsYXNzSUQoKSBjb25zdDsNCisgIHZpcnR1YWwgRldMX0VSUiBJbml0aWFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRmluYWxpemUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgVXBkYXRlKCk7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEhpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRldMX0VSUiBEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdmlydHVhbCBpbnQzMl90IFJ1bihGV0xfSFRJTUVSIGhUaW1lcik7DQorICBGV0xfRVJSIEVuYWJsZUJ1dHRvbihGWF9CT09MIGJFbmFibGUsIEZYX0JPT0wgYlVwID0gVFJVRSk7DQorICBGWF9CT09MIElzQnV0dG9uRW5hYmxlKEZYX0JPT0wgYlVwID0gVFJVRSk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgRHJhd1VwQnV0dG9uKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIHZvaWQgRHJhd0Rvd25CdXR0b24oQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIENGWF9SZWN0RiBtX3J0Q2xpZW50Ow0KKyAgQ0ZYX1JlY3RGIG1fcnRVcEJ1dHRvbjsNCisgIENGWF9SZWN0RiBtX3J0RG5CdXR0b247DQorICBGWF9EV09SRCBtX2R3VXBTdGF0ZTsNCisgIEZYX0RXT1JEIG1fZHdEblN0YXRlOw0KKyAgaW50MzJfdCBtX2lCdXR0b25JbmRleDsNCisgIEZYX0JPT0wgbV9iTEJ1dHRvbkR3bjsNCisgIEZXTF9IVElNRVIgbV9oVGltZXI7DQorICBmcmllbmQgY2xhc3MgQ0ZXTF9TcGluQnV0dG9uSW1wRGVsZWdhdGU7DQorfTsNCitjbGFzcyBDRldMX1NwaW5CdXR0b25JbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9TcGluQnV0dG9uSW1wRGVsZWdhdGUoQ0ZXTF9TcGluQnV0dG9uSW1wKiBwT3duZXIpOw0KKyAgaW50MzJfdCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIG92ZXJyaWRlOw0KKyAgRldMX0VSUiBPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIG92ZXJyaWRlOw0KKyAgRldMX0VSUiBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCkgb3ZlcnJpZGU7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgT25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlKiBwTXNnLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgIHZvaWQgT25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uS2V5RG93bihDRldMX01zZ0tleSogcE1zZyk7DQorICBDRldMX1NwaW5CdXR0b25JbXAqIG1fcE93bmVyOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfdG9vbHRpcGN0cmxpbXAuaCBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3Rvb2x0aXBjdHJsaW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBjODk1MgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9iYXNld2lkZ2V0L2luY2x1ZGUvZndsX3Rvb2x0aXBjdHJsaW1wLmgKQEAgLTAsMCArMSw4MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfVG9vbFRpcF9JTVBfSA0KKyNkZWZpbmUgX0ZXTF9Ub29sVGlwX0lNUF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXA7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzOw0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wRGVsZWdhdGU7DQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgSUZXTF9UaW1lcjsNCitjbGFzcyBDRldMX1Rvb2xUaXBJbXA7DQorY2xhc3MgQ0ZXTF9Ub29sVGlwSW1wRGVsZWdhdGU7DQorY2xhc3MgQ0ZXTF9Ub29sVGlwSW1wIDogcHVibGljIENGV0xfRm9ybUltcCB7DQorIHB1YmxpYzoNCisgIENGV0xfVG9vbFRpcEltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcik7DQorICB2aXJ0dWFsIH5DRldMX1Rvb2xUaXBJbXAoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2xhc3MpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRDbGFzc0lEKCkgY29uc3Q7DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFVwZGF0ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIERyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldENsaWVudFJlY3QoQ0ZYX1JlY3RGJiByZWN0KTsNCisgIEZXTF9FUlIgU2V0QW5jaG9yKGNvbnN0IENGWF9SZWN0RiYgcnRBbmNob3IpOw0KKyAgRldMX0VSUiBTaG93KCk7DQorICBGV0xfRVJSIEhpZGUoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBEcmF3Qmtncm91bmQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOw0KKyAgdm9pZCBEcmF3VGV4dChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOw0KKyAgdm9pZCBVcGRhdGVUZXh0T3V0U3R5bGVzKCk7DQorICB2b2lkIFJlZnJlc2hUb29sVGlwUG9zKCk7DQorICBjbGFzcyBDRldMX1Rvb2xUaXBUaW1lciA6IHB1YmxpYyBJRldMX1RpbWVyIHsNCisgICBwdWJsaWM6DQorICAgIENGV0xfVG9vbFRpcFRpbWVyKCl7fTsNCisgICAgfkNGV0xfVG9vbFRpcFRpbWVyKCl7fTsNCisgICAgQ0ZXTF9Ub29sVGlwVGltZXIoQ0ZXTF9Ub29sVGlwSW1wKiBwVG9vbFRpcCk7DQorICAgIHZpcnR1YWwgaW50MzJfdCBSdW4oRldMX0hUSU1FUiBoVGltZXIpOw0KKyAgICBDRldMX1Rvb2xUaXBJbXAqIG1fcFRvb2xUaXA7DQorICB9Ow0KKyAgQ0ZYX1JlY3RGIG1fcnRDbGllbnQ7DQorICBDRlhfUmVjdEYgbV9ydENhcHRpb247DQorICBGWF9CT09MIG1fYkJ0bkRvd247DQorICBGWF9EV09SRCBtX2R3VFRPU3R5bGVzOw0KKyAgaW50MzJfdCBtX2lUVE9BbGlnbjsNCisgIENGWF9SZWN0RiBtX3J0QW5jaG9yOw0KKyAgRldMX0hUSU1FUiBtX2hUaW1lclNob3c7DQorICBGV0xfSFRJTUVSIG1faFRpbWVySGlkZTsNCisgIENGV0xfVG9vbFRpcFRpbWVyKiBtX3BUaW1lcjsNCisgIENGV0xfVG9vbFRpcFRpbWVyIG1fVGltZXJTaG93Ow0KKyAgQ0ZXTF9Ub29sVGlwVGltZXIgbV9UaW1lckhpZGU7DQorICBmcmllbmQgY2xhc3MgQ0ZXTF9Ub29sVGlwSW1wRGVsZWdhdGU7DQorICBmcmllbmQgY2xhc3MgQ0ZXTF9Ub29sVGlwVGltZXI7DQorfTsNCitjbGFzcyBDRldMX1Rvb2xUaXBJbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9Ub29sVGlwSW1wRGVsZWdhdGUoQ0ZXTF9Ub29sVGlwSW1wKiBwT3duZXIpOw0KKyAgaW50MzJfdCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIG92ZXJyaWRlOw0KKyAgRldMX0VSUiBPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIG92ZXJyaWRlOw0KKyAgRldMX0VSUiBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCkgb3ZlcnJpZGU7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgT25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlKiBwTXNnLCBGWF9CT09MIGJTZXQgPSBUUlVFKTsNCisgIHZvaWQgT25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uS2V5RG93bihDRldMX01zZ0tleSogcE1zZyk7DQorICBDRldMX1Rvb2xUaXBJbXAqIG1fcE93bmVyOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9meG1hdGhfYmFyY29kZWltcC5oIGIveGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9meG1hdGhfYmFyY29kZWltcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYjc1YjgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z4bWF0aF9iYXJjb2RlaW1wLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWE1BVEhfQkFSQ09ERUlNUF9IXw0KKyNkZWZpbmUgX0ZYTUFUSF9CQVJDT0RFSU1QX0hfDQorY2xhc3MgQ0ZYX0JhcmNvZGUgOiBwdWJsaWMgSUZYX0JhcmNvZGUgew0KKyBwdWJsaWM6DQorICBDRlhfQmFyY29kZSgpOw0KKyAgfkNGWF9CYXJjb2RlKCk7DQorICBGWF9CT09MIENycmVhdGUoQkNfVFlQRSB0eXBlKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCk7DQorICB2aXJ0dWFsIEJDX1RZUEUgR2V0VHlwZSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzRGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCBGWF9CT09MIFJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAqJiBwT3V0Qml0bWFwLCBpbnQzMl90JiBlKTsNCisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgRGVjb2RlKHVpbnQ4X3QqIGJ1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGVycm9yQ29kZSk7DQorICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIERlY29kZShDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludDMyX3QmIGVycm9yQ29kZSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Q2hhckVuY29kaW5nKEJDX0NIQVJfRU5DT0RJTkcgZW5jb2RpbmcpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldE1vZHVsZUhlaWdodChpbnQzMl90IG1vZHVsZUhlaWdodCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0TW9kdWxlV2lkdGgoaW50MzJfdCBtb2R1bGVXaWR0aCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0SGVpZ2h0KGludDMyX3QgaGVpZ2h0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRXaWR0aChpbnQzMl90IHdpZHRoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDaGVja0NvbnRlbnRWYWxpZGl0eShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRQcmludENoZWNrc3VtKEZYX0JPT0wgY2hlY2tzdW0pOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldERhdGFMZW5ndGgoaW50MzJfdCBsZW5ndGgpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldENhbENoZWNrc3VtKGludDMyX3Qgc3RhdGUpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldEZvbnQoQ0ZYX0ZvbnQqIHBGb250KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRGb250U2l6ZShGWF9GTE9BVCBzaXplKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRGb250U3R5bGUoaW50MzJfdCBzdHlsZSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Rm9udENvbG9yKEZYX0FSR0IgY29sb3IpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbik7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0V2lkZU5hcnJvd1JhdGlvKGludDMyX3QgcmF0aW8pOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldFN0YXJ0Q2hhcihGWF9DSEFSIHN0YXJ0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRFbmRDaGFyKEZYX0NIQVIgZW5kKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRWZXJzaW9uKGludDMyX3QgdmVyc2lvbik7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoaW50MzJfdCBsZXZlbCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0VHJ1bmNhdGVkKEZYX0JPT0wgdHJ1bmNhdGVkKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0JDX0NvZGVCYXNlKiBtX3BCQ0VuZ2luZTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9hcHBpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX2FwcGltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVhM2U3NgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9hcHBpbXAuY3BwCkBAIC0wLDAgKzEsMTIzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3RhcmdldGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF90aHJlYWRpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF93aWRnZXRtZ3JpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfYXBwaW1wLmgiDQorDQorSUZXTF9BcHAqIElGV0xfQXBwOjpDcmVhdGUoSUZXTF9BZGFwdGVyTmF0aXZlKiBwQWRhcHRlcikgew0KKyAgSUZXTF9BcHAqIHBBcHAgPSBuZXcgSUZXTF9BcHA7DQorICBwQXBwLT5TZXRJbXBsKG5ldyBDRldMX0FwcEltcChwQXBwLCBwQWRhcHRlcikpOw0KKyAgcmV0dXJuIHBBcHA7DQorfQ0KK0ZXTF9FUlIgSUZXTF9BcHA6OkluaXRpYWxpemUoKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9BcHBJbXAqPihHZXRJbXBsKCkpLT5Jbml0aWFsaXplKCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9BcHA6OkZpbmFsaXplKCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfQXBwSW1wKj4oR2V0SW1wbCgpKS0+RmluYWxpemUoKTsNCit9DQorSUZXTF9BZGFwdGVyTmF0aXZlKiBJRldMX0FwcDo6R2V0QWRhcHRlck5hdGl2ZSgpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0FwcEltcCo+KEdldEltcGwoKSktPkdldEFkYXB0ZXJOYXRpdmUoKTsNCit9DQorSUZXTF9XaWRnZXRNZ3IqIElGV0xfQXBwOjpHZXRXaWRnZXRNZ3IoKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9BcHBJbXAqPihHZXRJbXBsKCkpLT5HZXRXaWRnZXRNZ3IoKTsNCit9DQorSUZXTF9UaGVtZVByb3ZpZGVyKiBJRldMX0FwcDo6R2V0VGhlbWVQcm92aWRlcigpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0FwcEltcCo+KEdldEltcGwoKSktPkdldFRoZW1lUHJvdmlkZXIoKTsNCit9DQorRldMX0VSUiBJRldMX0FwcDo6U2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZVByb3ZpZGVyKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9BcHBJbXAqPihHZXRJbXBsKCkpLT5TZXRUaGVtZVByb3ZpZGVyKHBUaGVtZVByb3ZpZGVyKTsNCit9DQorRldMX0VSUiBJRldMX0FwcDo6RXhpdChpbnQzMl90IGlFeGl0Q29kZSkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfQXBwSW1wKj4oR2V0SW1wbCgpKS0+RXhpdChpRXhpdENvZGUpOw0KK30NCisNCitDRldMX0FwcEltcDo6Q0ZXTF9BcHBJbXAoSUZXTF9BcHAqIHBJZmFjZSwgSUZXTF9BZGFwdGVyTmF0aXZlKiBwQWRhcHRlcikNCisgICAgOiBDRldMX05vdGVUaHJlYWRJbXAocElmYWNlKSwgbV9wV2lkZ2V0TWdyKE5VTEwpLCBtX3BUaGVtZVByb3ZpZGVyKE5VTEwpIHsNCisgIGlmICghcEFkYXB0ZXIpIHsNCisgICAgcEFkYXB0ZXIgPSBGV0xfQ3JlYXRlRnVlbEFkYXB0ZXJOYXRpdmUoKTsNCisgICAgbV9iRnVlbEFkYXB0ZXIgPSBUUlVFOw0KKyAgfSBlbHNlIHsNCisgICAgbV9iRnVlbEFkYXB0ZXIgPSBGQUxTRTsNCisgIH0NCisgIG1fcEFkYXB0ZXJOYXRpdmUgPSBwQWRhcHRlcjsNCit9DQorQ0ZXTF9BcHBJbXA6On5DRldMX0FwcEltcCgpIHsNCisgIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6RGVsZXRlSW5zdGFuY2UoKTsNCisgIGlmIChtX2JGdWVsQWRhcHRlcikgew0KKyAgICBGV0xfUmVsZWFzZUZ1ZWxBZGFwdGVyTmF0aXZlKG1fcEFkYXB0ZXJOYXRpdmUpOw0KKyAgICBtX3BBZGFwdGVyTmF0aXZlID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BXaWRnZXRNZ3IpIHsNCisgICAgZGVsZXRlIG1fcFdpZGdldE1ncjsNCisgICAgbV9wV2lkZ2V0TWdyID0gTlVMTDsNCisgIH0NCit9DQorRldMX0VSUiBDRldMX0FwcEltcDo6SW5pdGlhbGl6ZSgpIHsNCisgIGlmICghbV9wV2lkZ2V0TWdyKSB7DQorICAgIG1fcFdpZGdldE1nciA9IG5ldyBDRldMX1dpZGdldE1ncihtX3BBZGFwdGVyTmF0aXZlKTsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0FwcEltcDo6RmluYWxpemUoKSB7DQorICBkZWxldGUgbV9wV2lkZ2V0TWdyOw0KKyAgbV9wV2lkZ2V0TWdyID0gTlVMTDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorSUZXTF9BZGFwdGVyTmF0aXZlKiBDRldMX0FwcEltcDo6R2V0QWRhcHRlck5hdGl2ZSgpIHsNCisgIHJldHVybiBtX3BBZGFwdGVyTmF0aXZlOw0KK30NCitJRldMX0FkYXB0ZXJXaWRnZXRNZ3IqIEZXTF9HZXRBZGFwdGVyV2lkZ2V0TWdyKCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0TWdyKj4oRldMX0dldFdpZGdldE1ncigpKQ0KKyAgICAgIC0+R2V0QWRhcHRlcldpZGdldE1ncigpOw0KK30NCitJRldMX1dpZGdldE1nciogQ0ZXTF9BcHBJbXA6OkdldFdpZGdldE1ncigpIHsNCisgIHJldHVybiBtX3BXaWRnZXRNZ3I7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9BcHBJbXA6OlNldFRoZW1lUHJvdmlkZXIoSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWVQcm92aWRlcikgew0KKyAgbV9wVGhlbWVQcm92aWRlciA9IHBUaGVtZVByb3ZpZGVyOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQXBwSW1wOjpFeGl0KGludDMyX3QgaUV4aXRDb2RlKSB7DQorICB3aGlsZSAobV9wTm90ZURyaXZlci0+UG9wTm90ZUxvb3AoKSkNCisgICAgOw0KKyAgcmV0dXJuIG1fcFdpZGdldE1nci0+R2V0QWRhcHRlcldpZGdldE1ncigpLT5FeGl0KDApOw0KK30NCitJRldMX1RoZW1lUHJvdmlkZXIqIENGV0xfQXBwSW1wOjpHZXRUaGVtZVByb3ZpZGVyKCkgew0KKyAgcmV0dXJuIG1fcFRoZW1lUHJvdmlkZXI7DQorfQ0KK0lGV0xfQWRhcHRlck5hdGl2ZSogRldMX0dldEFkYXB0ZXJOYXRpdmUoKSB7DQorICBJRldMX0FwcCogcEFwcCA9IEZXTF9HZXRBcHAoKTsNCisgIGlmICghcEFwcCkNCisgICAgcmV0dXJuIE5VTEw7DQorICByZXR1cm4gcEFwcC0+R2V0QWRhcHRlck5hdGl2ZSgpOw0KK30NCitJRldMX1RoZW1lUHJvdmlkZXIqIEZXTF9HZXRUaGVtZVByb3ZpZGVyKCkgew0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK3N0YXRpYyBJRldMX0FwcCogX3RoZUFwcCA9IE5VTEw7DQorSUZXTF9BcHAqIEZXTF9HZXRBcHAoKSB7DQorICByZXR1cm4gX3RoZUFwcDsNCit9DQordm9pZCBGV0xfU2V0QXBwKElGV0xfQXBwKiBwQXBwKSB7DQorICBfdGhlQXBwID0gcEFwcDsNCit9DQorRldMX0VSUiBGV0xfU2V0RnVsbFNjcmVlbihJRldMX1dpZGdldCogcFdpZGdldCwgRlhfQk9PTCBiRnVsbFNjcmVlbikgew0KKyAgaWYgKCFwV2lkZ2V0KQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICBJRldMX05vdGVUaHJlYWQqIHBOb3RlVHJlYWQgPSBwV2lkZ2V0LT5HZXRPd25lclRocmVhZCgpOw0KKyAgaWYgKCFwTm90ZVRyZWFkKQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICBDRldMX05vdGVEcml2ZXIqIHBOb3RlRHJpdmVyID0NCisgICAgICBzdGF0aWNfY2FzdDxDRldMX05vdGVEcml2ZXIqPihwTm90ZVRyZWFkLT5HZXROb3RlRHJpdmVyKCkpOw0KKyAgaWYgKCFwTm90ZVRyZWFkKQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICBwTm90ZURyaXZlci0+Tm90aWZ5RnVsbFNjcmVlbk1vZGUocFdpZGdldCwgYkZ1bGxTY3JlZW4pOw0KKyAgcmV0dXJuIEZXTF9HZXRBZGFwdGVyV2lkZ2V0TWdyKCktPlNldEZ1bGxTY3JlZW4ocFdpZGdldCwgYkZ1bGxTY3JlZW4pOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfY29udGVudGltcC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfY29udGVudGltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UzMjNjNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9jb250ZW50aW1wLmNwcApAQCAtMCwwICsxLDkzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3RhcmdldGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF90aHJlYWRpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF93aWRnZXRpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfY29udGVudGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF93aWRnZXRtZ3JpbXAuaCINCitGV0xfRVJSIElGV0xfQ29udGVudDo6SW5zZXJ0V2lkZ2V0KElGV0xfV2lkZ2V0KiBwQ2hpbGQsIGludDMyX3QgbkluZGV4KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9Db250ZW50SW1wKj4oR2V0SW1wbCgpKS0+SW5zZXJ0V2lkZ2V0KHBDaGlsZCwgbkluZGV4KTsNCit9DQorRldMX0VSUiBJRldMX0NvbnRlbnQ6OlJlbW92ZVdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfQ29udGVudEltcCo+KEdldEltcGwoKSktPlJlbW92ZVdpZGdldChwV2lkZ2V0KTsNCit9DQorRldMX0VSUiBJRldMX0NvbnRlbnQ6OlJlbW92ZUFsbFdpZGdldHMoKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9Db250ZW50SW1wKj4oR2V0SW1wbCgpKS0+UmVtb3ZlQWxsV2lkZ2V0cygpOw0KK30NCitGV0xfRVJSIElGV0xfQ29udGVudDo6R2V0TWluU2l6ZShGWF9GTE9BVCYgZldpZHRoLCBGWF9GTE9BVCYgZkhlaWdodCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfQ29udGVudEltcCo+KEdldEltcGwoKSktPkdldE1pblNpemUoZldpZHRoLCBmSGVpZ2h0KTsNCit9DQorRldMX0VSUiBJRldMX0NvbnRlbnQ6OlNldE1pblNpemUoRlhfRkxPQVQgZldpZHRoLCBGWF9GTE9BVCBmSGVpZ2h0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9Db250ZW50SW1wKj4oR2V0SW1wbCgpKS0+U2V0TWluU2l6ZShmV2lkdGgsIGZIZWlnaHQpOw0KK30NCitGV0xfRVJSIElGV0xfQ29udGVudDo6R2V0TWF4U2l6ZShGWF9GTE9BVCYgZldpZHRoLCBGWF9GTE9BVCYgZkhlaWdodCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfQ29udGVudEltcCo+KEdldEltcGwoKSktPkdldE1heFNpemUoZldpZHRoLCBmSGVpZ2h0KTsNCit9DQorRldMX0VSUiBJRldMX0NvbnRlbnQ6OlNldE1heFNpemUoRlhfRkxPQVQgZldpZHRoLCBGWF9GTE9BVCBmSGVpZ2h0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9Db250ZW50SW1wKj4oR2V0SW1wbCgpKS0+U2V0TWF4U2l6ZShmV2lkdGgsIGZIZWlnaHQpOw0KK30NCitJRldMX0NvbnRlbnQ6OklGV0xfQ29udGVudCgpIHsNCit9DQorQ0ZXTF9Db250ZW50SW1wOjpDRldMX0NvbnRlbnRJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocHJvcGVydGllcywgcE91dGVyKSwNCisgICAgICBtX2ZXaWR0aE1pbigwKSwNCisgICAgICBtX2ZXaWR0aE1heCgxMDAwMCksDQorICAgICAgbV9mSGVpZ2h0TWluKDApLA0KKyAgICAgIG1fZkhlaWdodE1heCgxMDAwMCkge30NCitDRldMX0NvbnRlbnRJbXA6On5DRldMX0NvbnRlbnRJbXAoKSB7fQ0KK0ZXTF9FUlIgQ0ZXTF9Db250ZW50SW1wOjpJbnNlcnRXaWRnZXQoSUZXTF9XaWRnZXQqIHBDaGlsZCwgaW50MzJfdCBuSW5kZXgpIHsNCisgIGlmICghcENoaWxkKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgcENoaWxkLT5TZXRQYXJlbnQobV9wSW50ZXJmYWNlKTsNCisgIGlmIChuSW5kZXggPT0gLTEpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KKyAgQ0ZXTF9XaWRnZXRNZ3IqIHBNZ3IgPSBzdGF0aWNfY2FzdDxDRldMX1dpZGdldE1ncio+KEZXTF9HZXRXaWRnZXRNZ3IoKSk7DQorICBpZiAoIXBNZ3IpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBwTWdyLT5TZXRXaWRnZXRJbmRleChwQ2hpbGQsIG5JbmRleCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db250ZW50SW1wOjpSZW1vdmVXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIGlmICghcFdpZGdldCkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHBXaWRnZXQtPlNldFBhcmVudChOVUxMKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0NvbnRlbnRJbXA6OlJlbW92ZUFsbFdpZGdldHMoKSB7DQorICBDRldMX1dpZGdldE1nciogcE1nciA9IHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0TWdyKj4oRldMX0dldFdpZGdldE1ncigpKTsNCisgIGlmICghcE1ncikNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHdoaWxlIChJRldMX1dpZGdldCogd2lkZ2V0ID0NCisgICAgICAgICAgICAgcE1nci0+R2V0V2lkZ2V0KG1fcEludGVyZmFjZSwgRldMX1dHVFJFTEFUSU9OX0ZpcnN0Q2hpbGQpKSB7DQorICAgIHBNZ3ItPlNldFBhcmVudChOVUxMLCB3aWRnZXQpOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ29udGVudEltcDo6R2V0TWluU2l6ZShGWF9GTE9BVCYgZldpZHRoLCBGWF9GTE9BVCYgZkhlaWdodCkgew0KKyAgZldpZHRoID0gbV9mV2lkdGhNaW47DQorICBmSGVpZ2h0ID0gbV9mSGVpZ2h0TWluOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ29udGVudEltcDo6U2V0TWluU2l6ZShGWF9GTE9BVCBmV2lkdGgsIEZYX0ZMT0FUIGZIZWlnaHQpIHsNCisgIG1fZldpZHRoTWluID0gZldpZHRoOw0KKyAgbV9mSGVpZ2h0TWluID0gZkhlaWdodDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0NvbnRlbnRJbXA6OkdldE1heFNpemUoRlhfRkxPQVQmIGZXaWR0aCwgRlhfRkxPQVQmIGZIZWlnaHQpIHsNCisgIGZXaWR0aCA9IG1fZldpZHRoTWF4Ow0KKyAgZkhlaWdodCA9IG1fZkhlaWdodE1heDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0NvbnRlbnRJbXA6OlNldE1heFNpemUoRlhfRkxPQVQgZldpZHRoLCBGWF9GTE9BVCBmSGVpZ2h0KSB7DQorICBtX2ZXaWR0aE1heCA9IGZXaWR0aDsNCisgIG1fZkhlaWdodE1heCA9IGZIZWlnaHQ7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9mb3JtaW1wLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9mb3JtaW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjI3NzQxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX2Zvcm1pbXAuY3BwCkBAIC0wLDAgKzEsMTQzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF90YXJnZXRpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGhyZWFkaW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX25vdGVpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0aW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3BhbmVsaW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX2Zvcm1pbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0bWdyaW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX2FwcGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvYmFzZXdpZGdldC9pbmNsdWRlL2Z3bF9mb3JtcHJveHlpbXAuaCINCisNCisjZGVmaW5lIEZXTF9TWVNCVE5TSVpFIDIxDQorI2RlZmluZSBGV0xfU1lTQlROTUFSR0lOIDUNCisjZGVmaW5lIEZXTF9TWVNCVE5TUEFOIDINCisjZGVmaW5lIEZXTF9Db3JuZXJFbmxhcmdlIDEwDQorDQorLy8gc3RhdGljDQorSUZXTF9Gb3JtKiBJRldMX0Zvcm06OkNyZWF0ZUZvcm1Qcm94eShDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyogY2xhc3NuYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcikgew0KKyAgSUZXTF9Gb3JtKiBwRm9ybSA9IG5ldyBJRldMX0Zvcm07DQorICBDRldMX0Zvcm1Qcm94eUltcCogcEZvcm1Qcm94eUltcGwgPSBuZXcgQ0ZXTF9Gb3JtUHJveHlJbXAocHJvcGVydGllcywgcE91dGVyKTsNCisgIHBGb3JtLT5TZXRJbXBsKHBGb3JtUHJveHlJbXBsKTsNCisgIHBGb3JtUHJveHlJbXBsLT5TZXRJbnRlcmZhY2UocEZvcm0pOw0KKyAgcmV0dXJuIHBGb3JtOw0KK30NCitJRldMX0Zvcm06OklGV0xfRm9ybSgpIHt9DQorRldMX0ZPUk1TSVpFIElGV0xfRm9ybTo6R2V0Rm9ybVNpemUoKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9Gb3JtSW1wKj4oR2V0SW1wbCgpKS0+R2V0Rm9ybVNpemUoKTsNCit9DQorRldMX0VSUiBJRldMX0Zvcm06OlNldEZvcm1TaXplKEZXTF9GT1JNU0laRSBlRm9ybVNpemUpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0Zvcm1JbXAqPihHZXRJbXBsKCkpLT5TZXRGb3JtU2l6ZShlRm9ybVNpemUpOw0KK30NCitJRldMX1dpZGdldCogSUZXTF9Gb3JtOjpEb01vZGFsKCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfRm9ybUltcCo+KEdldEltcGwoKSktPkRvTW9kYWwoKTsNCit9DQorSUZXTF9XaWRnZXQqIElGV0xfRm9ybTo6RG9Nb2RhbChGWF9EV09SRCYgZHdDb21tYW5kSUQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0Zvcm1JbXAqPihHZXRJbXBsKCkpLT5Eb01vZGFsKGR3Q29tbWFuZElEKTsNCit9DQorRldMX0VSUiBJRldMX0Zvcm06OkVuZERvTW9kYWwoKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9Gb3JtSW1wKj4oR2V0SW1wbCgpKS0+RW5kRG9Nb2RhbCgpOw0KK30NCitGV0xfRVJSIElGV0xfRm9ybTo6U2V0Qm9yZGVyUmVnaW9uKENGWF9QYXRoKiBwUGF0aCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfRm9ybUltcCo+KEdldEltcGwoKSktPlNldEJvcmRlclJlZ2lvbihwUGF0aCk7DQorfQ0KKw0KK0NGV0xfRm9ybUltcDo6Q0ZXTF9Gb3JtSW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKQ0KKyAgICA6IENGV0xfUGFuZWxJbXAocHJvcGVydGllcywgcE91dGVyKSwNCisgICAgICBtX3BDbG9zZUJveChOVUxMKSwNCisgICAgICBtX3BNaW5Cb3goTlVMTCksDQorICAgICAgbV9wTWF4Qm94KE5VTEwpLA0KKyAgICAgIG1fcENhcHRpb25Cb3goTlVMTCksDQorICAgICAgbV9wTm90ZUxvb3AoTlVMTCksDQorICAgICAgbV9wU3ViRm9jdXMoTlVMTCksDQorICAgICAgbV9mQ1hCb3JkZXIoMCksDQorICAgICAgbV9mQ1lCb3JkZXIoMCksDQorICAgICAgbV9pQ2FwdHVyZUJ0bigtMSksDQorICAgICAgbV9pU3lzQm94KDApLA0KKyAgICAgIG1fZVJlc2l6ZVR5cGUoRk9STV9SRVNJWkVUWVBFX05vbmUpLA0KKyAgICAgIG1fYkxCdXR0b25Eb3duKEZBTFNFKSwNCisgICAgICBtX2JNYXhpbWl6ZWQoRkFMU0UpLA0KKyAgICAgIG1fYlNldE1heGltaXplKEZBTFNFKSwNCisgICAgICBtX2JDdXN0b21pemVMYXlvdXQoRkFMU0UpLA0KKyAgICAgIG1fZUZvcm1TaXplKEZXTF9GT1JNU0laRV9NYW51YWwpLA0KKyAgICAgIG1fYkRvTW9kYWxGbGFnKEZBTFNFKSwNCisgICAgICBtX3BCaWdJY29uKE5VTEwpLA0KKyAgICAgIG1fcFNtYWxsSWNvbihOVUxMKSwNCisgICAgICBtX2JNb3VzZUluKEZBTFNFKSB7DQorICBtX3J0UmVsYXRpdmUuUmVzZXQoKTsNCisgIG1fcnRDYXB0aW9uLlJlc2V0KCk7DQorICBtX3J0UmVzdG9yZS5SZXNldCgpOw0KKyAgbV9ydENhcHRpb25UZXh0LlJlc2V0KCk7DQorICBtX3J0SWNvbi5SZXNldCgpOw0KKyAgbV9JbmZvU3RhcnQubV9wdFN0YXJ0LlJlc2V0KCk7DQorICBtX0luZm9TdGFydC5tX3N6U3RhcnQuUmVzZXQoKTsNCit9DQorQ0ZXTF9Gb3JtSW1wOjp+Q0ZXTF9Gb3JtSW1wKCkgew0KKyAgUmVtb3ZlU3lzQnV0dG9ucygpOw0KKyAgaWYgKG1fcE5vdGVMb29wKSB7DQorICAgIGRlbGV0ZSBtX3BOb3RlTG9vcDsNCisgICAgbV9wTm90ZUxvb3AgPSBOVUxMOw0KKyAgfQ0KK30NCitGV0xfRVJSIENGV0xfRm9ybUltcDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdCB7DQorICB3c0NsYXNzID0gRldMX0NMQVNTX0Zvcm07DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfRm9ybUltcDo6R2V0Q2xhc3NJRCgpIGNvbnN0IHsNCisgIHJldHVybiBGV0xfQ0xBU1NIQVNIX0Zvcm07DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Gb3JtSW1wOjpJc0luc3RhbmNlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDbGFzcykgY29uc3Qgew0KKyAgaWYgKHdzQ2xhc3MgPT0gQ0ZYX1dpZGVTdHJpbmdDKEZXTF9DTEFTU19Gb3JtKSkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBDRldMX1BhbmVsSW1wOjpJc0luc3RhbmNlKHdzQ2xhc3MpOw0KK30NCitGV0xfRVJSIENGV0xfRm9ybUltcDo6SW5pdGlhbGl6ZSgpIHsNCisgIGlmIChDRldMX1dpZGdldEltcDo6SW5pdGlhbGl6ZSgpICE9IEZXTF9FUlJfU3VjY2VlZGVkKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgUmVnaXN0ZXJGb3JtKCk7DQorICBSZWdpc3RlckV2ZW50VGFyZ2V0KCk7DQorICBtX3BEZWxlZ2F0ZSA9IG5ldyBDRldMX0Zvcm1JbXBEZWxlZ2F0ZSh0aGlzKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0Zvcm1JbXA6OkZpbmFsaXplKCkgew0KKyAgZGVsZXRlIG1fcERlbGVnYXRlOw0KKyAgbV9wRGVsZWdhdGUgPSBudWxscHRyOw0KKyAgVW5yZWdpc3RlckV2ZW50VGFyZ2V0KCk7DQorICBVblJlZ2lzdGVyRm9ybSgpOw0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpGaW5hbGl6ZSgpOw0KK30NCitGV0xfRVJSIENGV0xfRm9ybUltcDo6R2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsIEZYX0JPT0wgYkF1dG9TaXplKSB7DQorICBpZiAoYkF1dG9TaXplKSB7DQorICAgIHJlY3QuUmVzZXQoKTsNCisgICAgRlhfRkxPQVQgZkNhcEhlaWdodCA9IEdldENhcHRpb25IZWlnaHQoKTsNCisgICAgRlhfRkxPQVQgZkNYQm9yZGVyID0gR2V0Qm9yZGVyU2l6ZShUUlVFKTsNCisgICAgRlhfRkxPQVQgZkNZQm9yZGVyID0gR2V0Qm9yZGVyU2l6ZShGQUxTRSk7DQorICAgIEZYX0ZMT0FUIGZFZGdlID0gR2V0RWRnZVdpZHRoKCk7DQorICAgIGlmIChtX3BDb250ZW50KSB7DQorICAgICAgbV9wQ29udGVudC0+R2V0V2lkZ2V0UmVjdChyZWN0LCBUUlVFKTsNCisgICAgfQ0KKyAgICByZWN0LmhlaWdodCArPSBmQ2FwSGVpZ2h0ICsgZkNZQm9yZGVyICsgZkVkZ2UgKyBmRWRnZTsNCisgICAgcmVjdC53aWR0aCArPSBmQ1hCb3JkZXIgKyBmQ1hCb3JkZXIgKyBmRWRnZSArIGZFZGdlOw0KKyAgfSBlbHNlIHsNCisgICAgcmVjdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Gb3JtSW1wOjpHZXRDbGllbnRSZWN0KENGWF9SZWN0RiYgcmVjdCkgew0KKyAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0NhcHRpb24pID09IDApIHsNCisgICAgcmVjdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICAgIHJlY3QuT2Zmc2V0KC1yZWN0LmxlZnQsIC1yZWN0LnRvcCk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIH0NCisjaWZkZWYgRldMX1VzZU1hY1N5c3RlbUJvcmRlcg0KKyAgcmVjdCA9IG1fcnRSZWxhdGl2ZTsNCisgIENGV0xfV2lkZ2V0TWdyKiBwV2lkZ2V0TWdyID0gc3RhdGljX2Nhc3Q8Q0ZXTF9XaWRnZXRNZ3IqPihGV0xfR2V0V2lkZ2V0TWdyKCkpOw0KKyAgaWYgKCFwV2lkZ2V0TWdyKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgSUZXTF9BZGFwdGVyV2lkZ2V0TWdyKiBhZGFwdGVyV2lkZ2V0TWdyID0gcFdpZGdldE1nci0+R2V0QWRhcHRlcldpZGdldE1ncigpOw0KKyAgRlhfRkxPQVQgbCwgdCwgciwgYjsNCisgIGwgPSB0ID0gciA9IGIgPSAwOw0KKyAgYWRhcHRlcldpZGdldE1nci0+R2V0U3lzdGVtQm9yZGVyKGwsIHQsIHIsIGIpOw0KKyAgcmVjdC5EZWZsYXRlKGwsIHQsIHIsIGIpOw0KKyAgcmVjdC5sZWZ0ID0gcmVjdC50b3AgPSAwOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyNlbHNlDQorICBGWF9GTE9BVCB4ID0gMDsNCisgIEZYX0ZMT0FUIHkgPSAwOw0KKyAgRlhfRkxPQVQgdCA9IDA7DQorICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7DQorICBpZiAocFRoZW1lKSB7DQorICAgIENGV0xfVGhlbWVQYXJ0IHBhcnQ7DQorICAgIHBhcnQubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICB4ID0gKnN0YXRpY19jYXN0PEZYX0ZMT0FUKj4oDQorICAgICAgICBwVGhlbWUtPkdldENhcGFjaXR5KCZwYXJ0LCBGV0xfV0dUQ0FQQUNJVFlfQ1hCb3JkZXIpKTsNCisgICAgeSA9ICpzdGF0aWNfY2FzdDxGWF9GTE9BVCo+KA0KKyAgICAgICAgcFRoZW1lLT5HZXRDYXBhY2l0eSgmcGFydCwgRldMX1dHVENBUEFDSVRZX0NZQm9yZGVyKSk7DQorICAgIHQgPSAqc3RhdGljX2Nhc3Q8RlhfRkxPQVQqPigNCisgICAgICAgIHBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIEZXTF9XR1RDQVBBQ0lUWV9GUk1fQ1lDYXB0aW9uKSk7DQorICB9DQorICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIHJlY3QuT2Zmc2V0KC1yZWN0LmxlZnQsIC1yZWN0LnRvcCk7DQorICByZWN0LkRlZmxhdGUoeCwgdCwgeCwgeSk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorI2VuZGlmDQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Gb3JtSW1wOjpVcGRhdGUoKSB7DQorICBpZiAobV9pTG9jayA+IDApIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KKyAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKSB7DQorICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KKyAgfQ0KKyNpZmRlZiBGV0xfVXNlTWFjU3lzdGVtQm9yZGVyDQorI2Vsc2UNCisgIFNldFRoZW1lRGF0YSgpOw0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfSWNvbikgew0KKyAgICBVcGRhdGVJY29uKCk7DQorICB9DQorI2VuZGlmDQorICBVcGRhdGVDYXB0aW9uKCk7DQorICBMYXlvdXQoKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9Gb3JtSW1wOjpIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgKHZvaWQpR2V0QXZhaWxhYmxlVGhlbWUoKTsNCisgIGlmIChtX3BDbG9zZUJveCAmJiBtX3BDbG9zZUJveC0+bV9ydEJ0bi5Db250YWlucyhmeCwgZnkpKSB7DQorICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9DbG9zZUJveDsNCisgIH0NCisgIGlmIChtX3BNYXhCb3ggJiYgbV9wTWF4Qm94LT5tX3J0QnRuLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX01heEJveDsNCisgIH0NCisgIGlmIChtX3BNaW5Cb3ggJiYgbV9wTWluQm94LT5tX3J0QnRuLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX01pbkJveDsNCisgIH0NCisgIENGWF9SZWN0RiBydENhcDsNCisgIHJ0Q2FwLlNldChtX3J0Q2FwdGlvbi5sZWZ0ICsgbV9mQ1lCb3JkZXIsIG1fcnRDYXB0aW9uLnRvcCArIG1fZkNYQm9yZGVyLA0KKyAgICAgICAgICAgIG1fcnRDYXB0aW9uLndpZHRoIC0gRldMX1NZU0JUTlNJWkUgKiBtX2lTeXNCb3ggLSAyICogbV9mQ1lCb3JkZXIsDQorICAgICAgICAgICAgbV9ydENhcHRpb24uaGVpZ2h0IC0gbV9mQ1hCb3JkZXIpOw0KKyAgaWYgKHJ0Q2FwLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1RpdGxlYmFyOw0KKyAgfQ0KKyAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0JvcmRlcikgJiYNCisgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9GUk1fUmVzaXplKSkgew0KKyAgICBGWF9GTE9BVCBmV2lkdGggPQ0KKyAgICAgICAgbV9ydFJlbGF0aXZlLndpZHRoIC0gMiAqIChtX2ZDWUJvcmRlciArIEZXTF9Db3JuZXJFbmxhcmdlKTsNCisgICAgRlhfRkxPQVQgZkhlaWdodCA9DQorICAgICAgICBtX3J0UmVsYXRpdmUuaGVpZ2h0IC0gMiAqIChtX2ZDWEJvcmRlciArIEZXTF9Db3JuZXJFbmxhcmdlKTsNCisgICAgQ0ZYX1JlY3RGIHJ0Ow0KKyAgICBydC5TZXQoMCwgbV9mQ1hCb3JkZXIgKyBGV0xfQ29ybmVyRW5sYXJnZSwgbV9mQ1lCb3JkZXIsIGZIZWlnaHQpOw0KKyAgICBpZiAocnQuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9MZWZ0Ow0KKyAgICB9DQorICAgIHJ0LlNldChtX3J0UmVsYXRpdmUud2lkdGggLSBtX2ZDWUJvcmRlciwgbV9mQ1hCb3JkZXIgKyBGV0xfQ29ybmVyRW5sYXJnZSwNCisgICAgICAgICAgIG1fZkNZQm9yZGVyLCBmSGVpZ2h0KTsNCisgICAgaWYgKHJ0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfUmlnaHQ7DQorICAgIH0NCisgICAgcnQuU2V0KG1fZkNZQm9yZGVyICsgRldMX0Nvcm5lckVubGFyZ2UsIDAsIGZXaWR0aCwgbV9mQ1hCb3JkZXIpOw0KKyAgICBpZiAocnQuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Ub3A7DQorICAgIH0NCisgICAgcnQuU2V0KG1fZkNZQm9yZGVyICsgRldMX0Nvcm5lckVubGFyZ2UsIG1fcnRSZWxhdGl2ZS5oZWlnaHQgLSBtX2ZDWEJvcmRlciwNCisgICAgICAgICAgIGZXaWR0aCwgbV9mQ1hCb3JkZXIpOw0KKyAgICBpZiAocnQuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Cb3R0b207DQorICAgIH0NCisgICAgcnQuU2V0KDAsIDAsIG1fZkNZQm9yZGVyICsgRldMX0Nvcm5lckVubGFyZ2UsDQorICAgICAgICAgICBtX2ZDWEJvcmRlciArIEZXTF9Db3JuZXJFbmxhcmdlKTsNCisgICAgaWYgKHJ0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfTGVmdFRvcDsNCisgICAgfQ0KKyAgICBydC5TZXQoMCwgbV9ydFJlbGF0aXZlLmhlaWdodCAtIG1fZkNYQm9yZGVyIC0gRldMX0Nvcm5lckVubGFyZ2UsDQorICAgICAgICAgICBtX2ZDWUJvcmRlciArIEZXTF9Db3JuZXJFbmxhcmdlLCBtX2ZDWEJvcmRlciArIEZXTF9Db3JuZXJFbmxhcmdlKTsNCisgICAgaWYgKHJ0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfTGVmdEJvdHRvbTsNCisgICAgfQ0KKyAgICBydC5TZXQobV9ydFJlbGF0aXZlLndpZHRoIC0gbV9mQ1lCb3JkZXIgLSBGV0xfQ29ybmVyRW5sYXJnZSwgMCwNCisgICAgICAgICAgIG1fZkNZQm9yZGVyICsgRldMX0Nvcm5lckVubGFyZ2UsIG1fZkNYQm9yZGVyICsgRldMX0Nvcm5lckVubGFyZ2UpOw0KKyAgICBpZiAocnQuQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9SaWdodFRvcDsNCisgICAgfQ0KKyAgICBydC5TZXQobV9ydFJlbGF0aXZlLndpZHRoIC0gbV9mQ1lCb3JkZXIgLSBGV0xfQ29ybmVyRW5sYXJnZSwNCisgICAgICAgICAgIG1fcnRSZWxhdGl2ZS5oZWlnaHQgLSBtX2ZDWEJvcmRlciAtIEZXTF9Db3JuZXJFbmxhcmdlLA0KKyAgICAgICAgICAgbV9mQ1lCb3JkZXIgKyBGV0xfQ29ybmVyRW5sYXJnZSwgbV9mQ1hCb3JkZXIgKyBGV0xfQ29ybmVyRW5sYXJnZSk7DQorICAgIGlmIChydC5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1JpZ2h0Qm90dG9tOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQ2xpZW50Ow0KK30NCitGV0xfRVJSIENGV0xfRm9ybUltcDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBpZiAoIXBHcmFwaGljcykNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCisgIEZYX0JPT0wgYkluYWN0aXZlID0gIUlzQWN0aXZlKCk7DQorICBpbnQzMl90IGlTdGF0ZSA9DQorICAgICAgYkluYWN0aXZlID8gRldMX1BBUlRTVEFURV9GUk1fSW5hY3RpdmUgOiBGV0xfUEFSVFNUQVRFX0ZSTV9Ob3JtYWw7DQorICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRlJNX05vRHJhd0NsaWVudCkgPT0gMCkgew0KKyAgICBEcmF3QmFja2dyb3VuZChwR3JhcGhpY3MsIHBUaGVtZSk7DQorICB9DQorI2lmZGVmIEZXTF9Vc2VNYWNTeXN0ZW1Cb3JkZXINCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisjZW5kaWYNCisgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcGFyYW0ubV9kd1N0YXRlcyA9IGlTdGF0ZTsNCisgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgcGFyYW0ubV9ydFBhcnQgPSBtX3J0UmVsYXRpdmU7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfQm9yZGVyKSB7DQorICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9GUk1fQm9yZGVyOw0KKyAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorICB9DQorICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfV0dUU1RZTEVfRWRnZU1hc2spICE9DQorICAgICAgRldMX1dHVFNUWUxFX0VkZ2VOb25lKSB7DQorICAgIENGWF9SZWN0RiBydEVkZ2U7DQorICAgIEdldEVkZ2VSZWN0KHJ0RWRnZSk7DQorICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9GUk1fRWRnZTsNCisgICAgcGFyYW0ubV9ydFBhcnQgPSBydEVkZ2U7DQorICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBpU3RhdGU7DQorICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgIH0NCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0NhcHRpb24pIHsNCisgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9DYXB0aW9uOw0KKyAgICBwYXJhbS5tX2R3U3RhdGVzID0gaVN0YXRlOw0KKyAgICBwYXJhbS5tX3J0UGFydCA9IG1fcnRDYXB0aW9uOw0KKyAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorICAgIERyYXdDYXB0aW9uVGV4dChwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQorICB9IGVsc2UgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfTmFycm93Q2FwdGlvbikgew0KKyAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX05hcnJvd0NhcHRpb247DQorICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBpU3RhdGU7DQorICAgIHBhcmFtLm1fcnRQYXJ0ID0gbV9ydENhcHRpb247DQorICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgICAgRHJhd0NhcHRpb25UZXh0KHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsNCisgIH0NCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0ljb24pIHsNCisgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9JY29uOw0KKyAgICBpZiAoSGFzSWNvbigpKSB7DQorICAgICAgRHJhd0ljb25JbWFnZShwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7DQorICAgIH0NCisgIH0NCisjaWYgKF9GWF9PU18gPT0gX0ZYX01BQ09TWF8pDQorICB7DQorICAgIGlmIChtX3BDbG9zZUJveCkgew0KKyAgICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9GUk1fQ2xvc2VCb3g7DQorICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IG1fcENsb3NlQm94LT5HZXRQYXJ0U3RhdGUoKTsNCisgICAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EZWFjdGl2YXRlZCkgew0KKyAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfRlJNX0Rpc2FibGVkOw0KKyAgICAgIH0gZWxzZSBpZiAoRldMX1BBUlRTVEFURV9GUk1fTm9ybWFsID09IHBhcmFtLm1fZHdTdGF0ZXMgJiYgbV9iTW91c2VJbikgew0KKyAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfRlJNX0hvdmVyOw0KKyAgICAgIH0NCisgICAgICBwYXJhbS5tX3J0UGFydCA9IG1fcENsb3NlQm94LT5tX3J0QnRuOw0KKyAgICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgICAgfQ0KKyAgICBpZiAobV9wTWF4Qm94KSB7DQorICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9NYXhpbWl6ZUJveDsNCisgICAgICBwYXJhbS5tX2R3U3RhdGVzID0gbV9wTWF4Qm94LT5HZXRQYXJ0U3RhdGUoKTsNCisgICAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EZWFjdGl2YXRlZCkgew0KKyAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfRlJNX0Rpc2FibGVkOw0KKyAgICAgIH0gZWxzZSBpZiAoRldMX1BBUlRTVEFURV9GUk1fTm9ybWFsID09IHBhcmFtLm1fZHdTdGF0ZXMgJiYgbV9iTW91c2VJbikgew0KKyAgICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IEZXTF9QQVJUU1RBVEVfRlJNX0hvdmVyOw0KKyAgICAgIH0NCisgICAgICBwYXJhbS5tX3J0UGFydCA9IG1fcE1heEJveC0+bV9ydEJ0bjsNCisgICAgICBwYXJhbS5tX2R3RGF0YSA9IG1fYk1heGltaXplZDsNCisgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorICAgIH0NCisgICAgaWYgKG1fcE1pbkJveCkgew0KKyAgICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9GUk1fTWluaW1pemVCb3g7DQorICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IG1fcE1pbkJveC0+R2V0UGFydFN0YXRlKCk7DQorICAgICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGVhY3RpdmF0ZWQpIHsNCisgICAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0ZSTV9EaXNhYmxlZDsNCisgICAgICB9IGVsc2UgaWYgKEZXTF9QQVJUU1RBVEVfRlJNX05vcm1hbCA9PSBwYXJhbS5tX2R3U3RhdGVzICYmIG1fYk1vdXNlSW4pIHsNCisgICAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBGV0xfUEFSVFNUQVRFX0ZSTV9Ib3ZlcjsNCisgICAgICB9DQorICAgICAgcGFyYW0ubV9ydFBhcnQgPSBtX3BNaW5Cb3gtPm1fcnRCdG47DQorICAgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KKyAgICB9DQorICAgIG1fYk1vdXNlSW4gPSBGQUxTRTsNCisgIH0NCisjZWxzZQ0KKyAgew0KKyAgICBpZiAobV9wQ2xvc2VCb3gpIHsNCisgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX0Nsb3NlQm94Ow0KKyAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBtX3BDbG9zZUJveC0+R2V0UGFydFN0YXRlKCk7DQorICAgICAgcGFyYW0ubV9ydFBhcnQgPSBtX3BDbG9zZUJveC0+bV9ydEJ0bjsNCisgICAgICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorICAgIH0NCisgICAgaWYgKG1fcE1heEJveCkgew0KKyAgICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9GUk1fTWF4aW1pemVCb3g7DQorICAgICAgcGFyYW0ubV9kd1N0YXRlcyA9IG1fcE1heEJveC0+R2V0UGFydFN0YXRlKCk7DQorICAgICAgcGFyYW0ubV9ydFBhcnQgPSBtX3BNYXhCb3gtPm1fcnRCdG47DQorICAgICAgcGFyYW0ubV9kd0RhdGEgPSBtX2JNYXhpbWl6ZWQ7DQorICAgICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KKyAgICB9DQorICAgIGlmIChtX3BNaW5Cb3gpIHsNCisgICAgICBwYXJhbS5tX2lQYXJ0ID0gRldMX1BBUlRfRlJNX01pbmltaXplQm94Ow0KKyAgICAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBtX3BNaW5Cb3gtPkdldFBhcnRTdGF0ZSgpOw0KKyAgICAgIHBhcmFtLm1fcnRQYXJ0ID0gbV9wTWluQm94LT5tX3J0QnRuOw0KKyAgICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCisgICAgfQ0KKyAgfQ0KKyNlbmRpZg0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRk9STVNJWkUgQ0ZXTF9Gb3JtSW1wOjpHZXRGb3JtU2l6ZSgpIHsNCisgIHJldHVybiBtX2VGb3JtU2l6ZTsNCit9DQorRldMX0VSUiBDRldMX0Zvcm1JbXA6OlNldEZvcm1TaXplKEZXTF9GT1JNU0laRSBlRm9ybVNpemUpIHsNCisgIG1fZUZvcm1TaXplID0gZUZvcm1TaXplOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitJRldMX1dpZGdldCogQ0ZXTF9Gb3JtSW1wOjpEb01vZGFsKCkgew0KKyAgSUZXTF9Ob3RlVGhyZWFkKiBwVGhyZWFkID0gR2V0T3duZXJUaHJlYWQoKTsNCisgIGlmICghcFRocmVhZCkNCisgICAgcmV0dXJuIE5VTEw7DQorICBJRldMX05vdGVEcml2ZXIqIHBEcml2ZXIgPSBwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQorICBpZiAoIXBEcml2ZXIpDQorICAgIHJldHVybiBOVUxMOw0KKyAgbV9wTm90ZUxvb3AgPSBuZXcgQ0ZXTF9Ob3RlTG9vcCh0aGlzKTsNCisgIHBEcml2ZXItPlB1c2hOb3RlTG9vcChtX3BOb3RlTG9vcCk7DQorICBtX2JEb01vZGFsRmxhZyA9IFRSVUU7DQorICBTZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgRkFMU0UpOw0KKyAgcERyaXZlci0+UnVuKCk7DQorI2lmIChfRlhfT1NfID09IF9GWF9NQUNPU1hfKQ0KKyNlbHNlDQorICBwRHJpdmVyLT5Qb3BOb3RlTG9vcCgpOw0KKyNlbmRpZg0KKyAgZGVsZXRlIG1fcE5vdGVMb29wOw0KKyAgbV9wTm90ZUxvb3AgPSBOVUxMOw0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0lGV0xfV2lkZ2V0KiBDRldMX0Zvcm1JbXA6OkRvTW9kYWwoRlhfRFdPUkQmIGR3Q29tbWFuZElEKSB7DQorICByZXR1cm4gRG9Nb2RhbCgpOw0KK30NCitGV0xfRVJSIENGV0xfRm9ybUltcDo6RW5kRG9Nb2RhbCgpIHsNCisgIGlmICghbV9wTm90ZUxvb3ApDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBtX2JEb01vZGFsRmxhZyA9IEZBTFNFOw0KKyNpZiAoX0ZYX09TXyA9PSBfRlhfTUFDT1NYXykNCisgIG1fcE5vdGVMb29wLT5FbmRNb2RhbExvb3AoKTsNCisgIElGV0xfTm90ZVRocmVhZCogcFRocmVhZCA9IEdldE93bmVyVGhyZWFkKCk7DQorICBpZiAoIXBUaHJlYWQpDQorICAgIHJldHVybiBOVUxMOw0KKyAgQ0ZXTF9Ob3RlRHJpdmVyKiBwRHJpdmVyID0NCisgICAgICBzdGF0aWNfY2FzdDxDRldMX05vdGVEcml2ZXIqPihwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCkpOw0KKyAgaWYgKCFwRHJpdmVyKQ0KKyAgICByZXR1cm4gTlVMTDsNCisgIHBEcml2ZXItPlBvcE5vdGVMb29wKCk7DQorICBTZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgVFJVRSk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorI2Vsc2UNCisgIFNldFN0YXRlcyhGV0xfV0dUU1RBVEVfSW52aXNpYmxlLCBUUlVFKTsNCisgIHJldHVybiBtX3BOb3RlTG9vcC0+RW5kTW9kYWxMb29wKCk7DQorI2VuZGlmDQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Gb3JtSW1wOjpTZXRCb3JkZXJSZWdpb24oQ0ZYX1BhdGgqIHBQYXRoKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wOjpEcmF3QmFja2dyb3VuZChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUpIHsNCisgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9CYWNrZ3JvdW5kOw0KKyAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICBwYXJhbS5tX3J0UGFydCA9IG1fcnRSZWxhdGl2ZTsNCisgIHBhcmFtLm1fcnRQYXJ0LkRlZmxhdGUobV9mQ1lCb3JkZXIsIG1fcnRDYXB0aW9uLmhlaWdodCwgbV9mQ1lCb3JkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIG1fZkNYQm9yZGVyKTsNCisgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsNCit9DQorQ0ZXTF9XaWRnZXRJbXAqIENGV0xfRm9ybUltcDo6R2V0U3ViRm9jdXMoKSB7DQorICByZXR1cm4gbV9wU3ViRm9jdXM7DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wOjpTZXRTdWJGb2N1cyhDRldMX1dpZGdldEltcCogcFdpZGdldCkgew0KKyAgbV9wU3ViRm9jdXMgPSBwV2lkZ2V0Ow0KK30NCitDRlhfTWFwQWNjZWxlcmF0b3JzJiBDRldMX0Zvcm1JbXA6OkdldEFjY2VsZXJhdG9yKCkgew0KKyAgcmV0dXJuIG1fbWFwQWNjZWxlcmF0b3JzOw0KK30NCit2b2lkIENGV0xfRm9ybUltcDo6U2V0QWNjZWxlcmF0b3IoQ0ZYX01hcEFjY2VsZXJhdG9ycyogcEFjY2VsZXJhdG9ycykgew0KKyAgaWYgKCFwQWNjZWxlcmF0b3JzKQ0KKyAgICByZXR1cm47DQorICBtX21hcEFjY2VsZXJhdG9ycy5SZW1vdmVBbGwoKTsNCisgIEZYX0RXT1JEIHZyS2V5LCByVmFsdWU7DQorICBGWF9QT1NJVElPTiBwb3MgPSBwQWNjZWxlcmF0b3JzLT5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocG9zKSB7DQorICAgIHBBY2NlbGVyYXRvcnMtPkdldE5leHRBc3NvYyhwb3MsIHZyS2V5LCByVmFsdWUpOw0KKyAgICBtX21hcEFjY2VsZXJhdG9ycy5TZXRBdCh2cktleSwgclZhbHVlKTsNCisgIH0NCit9DQordm9pZCBDRldMX0Zvcm1JbXA6OlNob3dDaGlsZFdpZGdldChJRldMX1dpZGdldCogcFBhcmVudCkgew0KKyAgSUZXTF9BcHAqIHBBcHAgPSBGV0xfR2V0QXBwKCk7DQorICBpZiAoIXBBcHApDQorICAgIHJldHVybjsNCisgIENGV0xfV2lkZ2V0TWdyKiBwV2lkZ2V0TWdyID0NCisgICAgICBzdGF0aWNfY2FzdDxDRldMX1dpZGdldE1ncio+KHBBcHAtPkdldFdpZGdldE1ncigpKTsNCisgIGlmICghcFdpZGdldE1ncikNCisgICAgcmV0dXJuOw0KKyAgSUZXTF9XaWRnZXQqIHBDaGlsZCA9DQorICAgICAgcFdpZGdldE1nci0+R2V0V2lkZ2V0KHBQYXJlbnQsIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkKTsNCisgIHdoaWxlIChwQ2hpbGQpIHsNCisgICAgcFdpZGdldE1nci0+U2hvd1dpZGdldF9OYXRpdmUocENoaWxkKTsNCisgICAgU2hvd0NoaWxkV2lkZ2V0KHBDaGlsZCk7DQorICAgIHBDaGlsZCA9IHBXaWRnZXRNZ3ItPkdldFdpZGdldChwQ2hpbGQsIEZXTF9XR1RSRUxBVElPTl9OZXh0U2libGluZyk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wOjpSZW1vdmVTeXNCdXR0b25zKCkgew0KKyAgbV9ydENhcHRpb24uUmVzZXQoKTsNCisgIGlmIChtX3BDbG9zZUJveCkgew0KKyAgICBkZWxldGUgbV9wQ2xvc2VCb3g7DQorICAgIG1fcENsb3NlQm94ID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BNaW5Cb3gpIHsNCisgICAgZGVsZXRlIG1fcE1pbkJveDsNCisgICAgbV9wTWluQm94ID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BNYXhCb3gpIHsNCisgICAgZGVsZXRlIG1fcE1heEJveDsNCisgICAgbV9wTWF4Qm94ID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BDYXB0aW9uQm94KSB7DQorICAgIGRlbGV0ZSBtX3BDYXB0aW9uQm94Ow0KKyAgICBtX3BDYXB0aW9uQm94ID0gTlVMTDsNCisgIH0NCit9DQordm9pZCBDRldMX0Zvcm1JbXA6OkNhbGNDb250ZW50UmVjdChDRlhfUmVjdEYmIHJ0Q29udGVudCkgew0KKyNpZmRlZiBGV0xfVXNlTWFjU3lzdGVtQm9yZGVyDQorICBydENvbnRlbnQgPSBtX3J0UmVsYXRpdmU7DQorI2Vsc2UNCisgIEdldEVkZ2VSZWN0KHJ0Q29udGVudCk7DQorICBpZiAoSGFzRWRnZSgpKSB7DQorICAgIEZYX0ZMT0FUIGZFZGdlID0gR2V0RWRnZVdpZHRoKCk7DQorICAgIHJ0Q29udGVudC5EZWZsYXRlKGZFZGdlLCBmRWRnZSk7DQorICB9DQorI2VuZGlmDQorfQ0KK0NGV0xfU3lzQnRuKiBDRldMX0Zvcm1JbXA6OkdldFN5c0J0bkF0UG9pbnQoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSB7DQorICBpZiAobV9wQ2xvc2VCb3ggJiYgbV9wQ2xvc2VCb3gtPm1fcnRCdG4uQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICByZXR1cm4gbV9wQ2xvc2VCb3g7DQorICB9DQorICBpZiAobV9wTWF4Qm94ICYmIG1fcE1heEJveC0+bV9ydEJ0bi5Db250YWlucyhmeCwgZnkpKSB7DQorICAgIHJldHVybiBtX3BNYXhCb3g7DQorICB9DQorICBpZiAobV9wTWluQm94ICYmIG1fcE1pbkJveC0+bV9ydEJ0bi5Db250YWlucyhmeCwgZnkpKSB7DQorICAgIHJldHVybiBtX3BNaW5Cb3g7DQorICB9DQorICBpZiAobV9wQ2FwdGlvbkJveCAmJiBtX3BDYXB0aW9uQm94LT5tX3J0QnRuLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIG1fcENhcHRpb25Cb3g7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorQ0ZXTF9TeXNCdG4qIENGV0xfRm9ybUltcDo6R2V0U3lzQnRuQnlTdGF0ZShGWF9EV09SRCBkd1N0YXRlKSB7DQorICBpZiAobV9wQ2xvc2VCb3ggJiYgKG1fcENsb3NlQm94LT5tX2R3U3RhdGUgJiBkd1N0YXRlKSkgew0KKyAgICByZXR1cm4gbV9wQ2xvc2VCb3g7DQorICB9DQorICBpZiAobV9wTWF4Qm94ICYmIChtX3BNYXhCb3gtPm1fZHdTdGF0ZSAmIGR3U3RhdGUpKSB7DQorICAgIHJldHVybiBtX3BNYXhCb3g7DQorICB9DQorICBpZiAobV9wTWluQm94ICYmIChtX3BNaW5Cb3gtPm1fZHdTdGF0ZSAmIGR3U3RhdGUpKSB7DQorICAgIHJldHVybiBtX3BNaW5Cb3g7DQorICB9DQorICBpZiAobV9wQ2FwdGlvbkJveCAmJiAobV9wQ2FwdGlvbkJveC0+bV9kd1N0YXRlICYgZHdTdGF0ZSkpIHsNCisgICAgcmV0dXJuIG1fcENhcHRpb25Cb3g7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorQ0ZXTF9TeXNCdG4qIENGV0xfRm9ybUltcDo6R2V0U3lzQnRuQnlJbmRleChpbnQzMl90IG5JbmRleCkgew0KKyAgaWYgKG5JbmRleCA8IDApIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDRlhfUHRyQXJyYXkgYXJyQnRuOw0KKyAgaWYgKG1fcE1pbkJveCkgew0KKyAgICBhcnJCdG4uQWRkKG1fcE1pbkJveCk7DQorICB9DQorICBpZiAobV9wTWF4Qm94KSB7DQorICAgIGFyckJ0bi5BZGQobV9wTWF4Qm94KTsNCisgIH0NCisgIGlmIChtX3BDbG9zZUJveCkgew0KKyAgICBhcnJCdG4uQWRkKG1fcENsb3NlQm94KTsNCisgIH0NCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX1N5c0J0bio+KGFyckJ0bltuSW5kZXhdKTsNCit9DQoraW50MzJfdCBDRldMX0Zvcm1JbXA6OkdldFN5c0J0bkluZGV4KENGV0xfU3lzQnRuKiBwQnRuKSB7DQorICBDRlhfUHRyQXJyYXkgYXJyQnRuOw0KKyAgaWYgKG1fcE1pbkJveCkgew0KKyAgICBhcnJCdG4uQWRkKG1fcE1pbkJveCk7DQorICB9DQorICBpZiAobV9wTWF4Qm94KSB7DQorICAgIGFyckJ0bi5BZGQobV9wTWF4Qm94KTsNCisgIH0NCisgIGlmIChtX3BDbG9zZUJveCkgew0KKyAgICBhcnJCdG4uQWRkKG1fcENsb3NlQm94KTsNCisgIH0NCisgIHJldHVybiBhcnJCdG4uRmluZChwQnRuKTsNCit9DQorRlhfRkxPQVQgQ0ZXTF9Gb3JtSW1wOjpHZXRDYXB0aW9uSGVpZ2h0KCkgew0KKyAgRlhfRFdPUkQgZHdDYXBhY2l0eSA9IDA7DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9DYXB0aW9uKSB7DQorICAgIGR3Q2FwYWNpdHkgPSBGV0xfV0dUQ0FQQUNJVFlfRlJNX0NZQ2FwdGlvbjsNCisgIH0gZWxzZSBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9OYXJyb3dDYXB0aW9uKSB7DQorICAgIGR3Q2FwYWNpdHkgPSBGV0xfV0dUQ0FQQUNJVFlfRlJNX0NZTmFycm93Q2FwdGlvbjsNCisgIH0NCisgIGlmIChkd0NhcGFjaXR5ID4gMCkgew0KKyAgICBGWF9GTE9BVCogcGZDYXBIZWlnaHQgPQ0KKyAgICAgICAgc3RhdGljX2Nhc3Q8RlhfRkxPQVQqPihHZXRUaGVtZUNhcGFjaXR5KGR3Q2FwYWNpdHkpKTsNCisgICAgcmV0dXJuIHBmQ2FwSGVpZ2h0ID8gKnBmQ2FwSGVpZ2h0IDogMDsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCit2b2lkIENGV0xfRm9ybUltcDo6RHJhd0NhcHRpb25UZXh0KENGWF9HcmFwaGljcyogcEdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICBJRldMX0RhdGFQcm92aWRlciogcERhdGEgPSBtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXI7DQorICBwRGF0YS0+R2V0Q2FwdGlvbihtX3BJbnRlcmZhY2UsIHdzVGV4dCk7DQorICBpZiAod3NUZXh0LklzRW1wdHkoKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRldMX1RoZW1lVGV4dCB0ZXh0UGFyYW07DQorICB0ZXh0UGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgdGV4dFBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9GUk1fQ2FwdGlvbjsNCisgIHRleHRQYXJhbS5tX2R3U3RhdGVzID0gRldMX1BBUlRTVEFURV9GUk1fTm9ybWFsOw0KKyAgdGV4dFBhcmFtLm1fcEdyYXBoaWNzID0gcEdzOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgdGV4dFBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBDRlhfUmVjdEYgcnRUZXh0Ow0KKyAgaWYgKG1fYkN1c3RvbWl6ZUxheW91dCkgew0KKyAgICBydFRleHQgPSBtX3J0Q2FwdGlvblRleHQ7DQorICAgIHJ0VGV4dC50b3AgLT0gNTsNCisgIH0gZWxzZSB7DQorICAgIHJ0VGV4dCA9IG1fcnRDYXB0aW9uOw0KKyAgICBGWF9GTE9BVCBmcG9zOw0KKyAgICBmcG9zID0gSGFzSWNvbigpID8gMjkuMGYgOiAxMy4wZjsNCisgICAgcnRUZXh0LmxlZnQgKz0gZnBvczsNCisgIH0NCisgIHRleHRQYXJhbS5tX3J0UGFydCA9IHJ0VGV4dDsNCisgIHRleHRQYXJhbS5tX3dzVGV4dCA9IHdzVGV4dDsNCisgIHRleHRQYXJhbS5tX2R3VFRPU3R5bGVzID0gRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmUgfCBGREVfVFRPU1RZTEVfRWxsaXBzaXM7DQorICB0ZXh0UGFyYW0ubV9pVFRPQWxpZ24gPSBtX2JDdXN0b21pemVMYXlvdXQgPyBGREVfVFRPQUxJR05NRU5UX0NlbnRlcg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJMZWZ0Ow0KKyAgcFRoZW1lLT5EcmF3VGV4dCgmdGV4dFBhcmFtKTsNCit9DQordm9pZCBDRldMX0Zvcm1JbXA6OkRyYXdJY29uSW1hZ2UoQ0ZYX0dyYXBoaWNzKiBwR3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgSUZXTF9Gb3JtRFAqIHBEYXRhID0NCisgICAgICBzdGF0aWNfY2FzdDxJRldMX0Zvcm1EUCo+KG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQorICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgIHBhcmFtLm1fcFdpZGdldCA9IG1fcEludGVyZmFjZTsNCisgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9GUk1fSWNvbjsNCisgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdzOw0KKyAgcGFyYW0ubV9wSW1hZ2UgPSBwRGF0YS0+R2V0SWNvbihtX3BJbnRlcmZhY2UsIEZBTFNFKTsNCisgIHBhcmFtLm1fcnRQYXJ0ID0gbV9ydEljb247DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgfQ0KKyAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KK30NCit2b2lkIENGV0xfRm9ybUltcDo6R2V0RWRnZVJlY3QoQ0ZYX1JlY3RGJiBydEVkZ2UpIHsNCisgIHJ0RWRnZSA9IG1fcnRSZWxhdGl2ZTsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0JvcmRlcikgew0KKyAgICBGWF9GTE9BVCBmQ1ggPSBHZXRCb3JkZXJTaXplKCk7DQorICAgIEZYX0ZMT0FUIGZDWSA9IEdldEJvcmRlclNpemUoRkFMU0UpOw0KKyAgICBydEVkZ2UuRGVmbGF0ZShmQ1gsIG1fcnRDYXB0aW9uLkhlaWdodCgpLCBmQ1gsIGZDWSk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wOjpTZXRXb3JrQXJlYVJlY3QoKSB7DQorICBtX3J0UmVzdG9yZSA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICBDRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9IHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0TWdyKj4oRldMX0dldFdpZGdldE1ncigpKTsNCisgIGlmICghcFdpZGdldE1ncikNCisgICAgcmV0dXJuOw0KKyAgbV9iU2V0TWF4aW1pemUgPSBUUlVFOw0KKyAgcFdpZGdldE1nci0+U2V0TWF4aW1pemVfTmF0aXZlKG1fcEludGVyZmFjZSk7DQorICBSZXBhaW50KCZtX3J0UmVsYXRpdmUpOw0KK30NCit2b2lkIENGV0xfRm9ybUltcDo6U2V0Q3Vyc29yKEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgSUZXTF9BZGFwdGVyTmF0aXZlKiBwTmF0aXZlID0gRldMX0dldEFkYXB0ZXJOYXRpdmUoKTsNCisgIElGV0xfQWRhcHRlckN1cnNvck1nciogcEN1cnNvck1nciA9IHBOYXRpdmUtPkdldEN1cnNvck1ncigpOw0KKyAgaWYgKCFwQ3Vyc29yTWdyKQ0KKyAgICByZXR1cm47DQorICBGWF9EV09SRCBkd0hpdFRlc3QgPSBIaXRUZXN0KGZ4LCBmeSk7DQorICBzd2l0Y2ggKGR3SGl0VGVzdCkgew0KKyAgICBjYXNlIEZXTF9XR1RISVRURVNUX1JpZ2h0OiB7DQorICAgICAgRldMX0hDVVJTT1IgaEN1cnNvciA9IHBDdXJzb3JNZ3ItPkdldFN5c3RlbUN1cnNvcihGV0xfQ1VSU09SVFlQRV9TaXplV0UpOw0KKyAgICAgIHBDdXJzb3JNZ3ItPlNldEN1cnNvcihoQ3Vyc29yKTsNCisgICAgICBwQ3Vyc29yTWdyLT5TaG93Q3Vyc29yKFRSVUUpOw0KKyAgICAgIG1fZVJlc2l6ZVR5cGUgPSBGT1JNX1JFU0laRVRZUEVfUmlnaHQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUSElUVEVTVF9Cb3R0b206IHsNCisgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVOUyk7DQorICAgICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KKyAgICAgIHBDdXJzb3JNZ3ItPlNob3dDdXJzb3IoVFJVRSk7DQorICAgICAgbV9lUmVzaXplVHlwZSA9IEZPUk1fUkVTSVpFVFlQRV9Cb3R0b207DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUSElUVEVTVF9MZWZ0OiB7DQorICAgICAgRldMX0hDVVJTT1IgaEN1cnNvciA9IHBDdXJzb3JNZ3ItPkdldFN5c3RlbUN1cnNvcihGV0xfQ1VSU09SVFlQRV9TaXplV0UpOw0KKyAgICAgIHBDdXJzb3JNZ3ItPlNldEN1cnNvcihoQ3Vyc29yKTsNCisgICAgICBwQ3Vyc29yTWdyLT5TaG93Q3Vyc29yKFRSVUUpOw0KKyAgICAgIG1fZVJlc2l6ZVR5cGUgPSBGT1JNX1JFU0laRVRZUEVfTGVmdDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RISVRURVNUX1RvcDogew0KKyAgICAgIEZXTF9IQ1VSU09SIGhDdXJzb3IgPSBwQ3Vyc29yTWdyLT5HZXRTeXN0ZW1DdXJzb3IoRldMX0NVUlNPUlRZUEVfU2l6ZU5TKTsNCisgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgICBtX2VSZXNpemVUeXBlID0gRk9STV9SRVNJWkVUWVBFX1RvcDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RISVRURVNUX0xlZnRUb3A6IHsNCisgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0NCisgICAgICAgICAgcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVOV1NFKTsNCisgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgICBtX2VSZXNpemVUeXBlID0gRk9STV9SRVNJWkVUWVBFX0xlZnRUb3A7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUSElUVEVTVF9MZWZ0Qm90dG9tOiB7DQorICAgICAgRldMX0hDVVJTT1IgaEN1cnNvciA9DQorICAgICAgICAgIHBDdXJzb3JNZ3ItPkdldFN5c3RlbUN1cnNvcihGV0xfQ1VSU09SVFlQRV9TaXplTkVTVyk7DQorICAgICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KKyAgICAgIHBDdXJzb3JNZ3ItPlNob3dDdXJzb3IoVFJVRSk7DQorICAgICAgbV9lUmVzaXplVHlwZSA9IEZPUk1fUkVTSVpFVFlQRV9MZWZ0Qm90dG9tOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVEhJVFRFU1RfUmlnaHRUb3A6IHsNCisgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0NCisgICAgICAgICAgcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVORVNXKTsNCisgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgICBtX2VSZXNpemVUeXBlID0gRk9STV9SRVNJWkVUWVBFX1JpZ2h0VG9wOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVEhJVFRFU1RfUmlnaHRCb3R0b206IHsNCisgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0NCisgICAgICAgICAgcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVOV1NFKTsNCisgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgICBtX2VSZXNpemVUeXBlID0gRk9STV9SRVNJWkVUWVBFX1JpZ2h0Qm90dG9tOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsNCisgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX0Fycm93KTsNCisgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENGV0xfRm9ybUltcDo6TGF5b3V0KCkgew0KKyAgR2V0UmVsYXRpdmVSZWN0KG1fcnRSZWxhdGl2ZSk7DQorI2lmbmRlZiBGV0xfVXNlTWFjU3lzdGVtQm9yZGVyDQorICBSZVNldFN5c0J0bigpOw0KKyNlbmRpZg0KKyAgaWYgKG1fcENvbnRlbnQpIHsNCisgICAgQ0ZYX1JlY3RGIHJ0Q2xpZW50Ow0KKyAgICBHZXRDbGllbnRSZWN0KHJ0Q2xpZW50KTsNCisgICAgbV9wQ29udGVudC0+U2V0V2lkZ2V0UmVjdChydENsaWVudCk7DQorICAgIG1fcENvbnRlbnQtPlVwZGF0ZSgpOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfRm9ybUltcDo6UmVTZXRTeXNCdG4oKSB7DQorICBtX2ZDWEJvcmRlciA9DQorICAgICAgKnN0YXRpY19jYXN0PEZYX0ZMT0FUKj4oR2V0VGhlbWVDYXBhY2l0eShGV0xfV0dUQ0FQQUNJVFlfQ1hCb3JkZXIpKTsNCisgIG1fZkNZQm9yZGVyID0NCisgICAgICAqc3RhdGljX2Nhc3Q8RlhfRkxPQVQqPihHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9DWUJvcmRlcikpOw0KKyAgUmVtb3ZlU3lzQnV0dG9ucygpOw0KKyAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KKyAgbV9iQ3VzdG9taXplTGF5b3V0ID0gcFRoZW1lLT5Jc0N1c3RvbWl6ZWRMYXlvdXQobV9wSW50ZXJmYWNlKTsNCisgIEZYX0ZMT0FUIGZDYXBIZWlnaHQgPSBHZXRDYXB0aW9uSGVpZ2h0KCk7DQorICBpZiAoZkNhcEhlaWdodCA+IDApIHsNCisgICAgbV9ydENhcHRpb24gPSBtX3J0UmVsYXRpdmU7DQorICAgIG1fcnRDYXB0aW9uLmhlaWdodCA9IGZDYXBIZWlnaHQ7DQorICB9DQorICBtX2lTeXNCb3ggPSAwOw0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfQ2xvc2VCb3gpIHsNCisgICAgbV9wQ2xvc2VCb3ggPSBuZXcgQ0ZXTF9TeXNCdG47DQorICAgIGlmIChtX2JDdXN0b21pemVMYXlvdXQpIHsNCisgICAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgICAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9DbG9zZUJveDsNCisgICAgICBwVGhlbWUtPkdldFBhcnRSZWN0KCZwYXJhbSwgbV9wQ2xvc2VCb3gtPm1fcnRCdG4pOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG1fcENsb3NlQm94LT5tX3J0QnRuLlNldCgNCisgICAgICAgICAgbV9ydFJlbGF0aXZlLnJpZ2h0KCkgLSBGV0xfU1lTQlROTUFSR0lOIC0gRldMX1NZU0JUTlNJWkUsDQorICAgICAgICAgIEZXTF9TWVNCVE5NQVJHSU4sIEZXTF9TWVNCVE5TSVpFLCBGV0xfU1lTQlROU0laRSk7DQorICAgIH0NCisgICAgbV9pU3lzQm94Kys7DQorICB9DQorICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9NYXhpbWl6ZUJveCkgew0KKyAgICBtX3BNYXhCb3ggPSBuZXcgQ0ZXTF9TeXNCdG47DQorICAgIGlmIChtX2JDdXN0b21pemVMYXlvdXQpIHsNCisgICAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgICAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9NYXhpbWl6ZUJveDsNCisgICAgICBwVGhlbWUtPkdldFBhcnRSZWN0KCZwYXJhbSwgbV9wTWF4Qm94LT5tX3J0QnRuKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAobV9wQ2xvc2VCb3gpIHsNCisgICAgICAgIG1fcE1heEJveC0+bV9ydEJ0bi5TZXQoDQorICAgICAgICAgICAgbV9wQ2xvc2VCb3gtPm1fcnRCdG4ubGVmdCAtIEZXTF9TWVNCVE5TUEFOIC0gRldMX1NZU0JUTlNJWkUsDQorICAgICAgICAgICAgbV9wQ2xvc2VCb3gtPm1fcnRCdG4udG9wLCBGV0xfU1lTQlROU0laRSwgRldMX1NZU0JUTlNJWkUpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBtX3BNYXhCb3gtPm1fcnRCdG4uU2V0KA0KKyAgICAgICAgICAgIG1fcnRSZWxhdGl2ZS5yaWdodCgpIC0gRldMX1NZU0JUTk1BUkdJTiAtIEZXTF9TWVNCVE5TSVpFLA0KKyAgICAgICAgICAgIEZXTF9TWVNCVE5NQVJHSU4sIEZXTF9TWVNCVE5TSVpFLCBGV0xfU1lTQlROU0laRSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIG1faVN5c0JveCsrOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfTWluaW1pemVCb3gpIHsNCisgICAgbV9wTWluQm94ID0gbmV3IENGV0xfU3lzQnRuOw0KKyAgICBpZiAobV9iQ3VzdG9taXplTGF5b3V0KSB7DQorICAgICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07DQorICAgICAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgICAgIHBhcmFtLm1faVBhcnQgPSBGV0xfUEFSVF9GUk1fTWluaW1pemVCb3g7DQorICAgICAgcFRoZW1lLT5HZXRQYXJ0UmVjdCgmcGFyYW0sIG1fcE1pbkJveC0+bV9ydEJ0bik7DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKG1fcE1heEJveCkgew0KKyAgICAgICAgbV9wTWluQm94LT5tX3J0QnRuLlNldCgNCisgICAgICAgICAgICBtX3BNYXhCb3gtPm1fcnRCdG4ubGVmdCAtIEZXTF9TWVNCVE5TUEFOIC0gRldMX1NZU0JUTlNJWkUsDQorICAgICAgICAgICAgbV9wTWF4Qm94LT5tX3J0QnRuLnRvcCwgRldMX1NZU0JUTlNJWkUsIEZXTF9TWVNCVE5TSVpFKTsNCisgICAgICB9IGVsc2UgaWYgKG1fcENsb3NlQm94KSB7DQorICAgICAgICBtX3BNaW5Cb3gtPm1fcnRCdG4uU2V0KA0KKyAgICAgICAgICAgIG1fcENsb3NlQm94LT5tX3J0QnRuLmxlZnQgLSBGV0xfU1lTQlROU1BBTiAtIEZXTF9TWVNCVE5TSVpFLA0KKyAgICAgICAgICAgIG1fcENsb3NlQm94LT5tX3J0QnRuLnRvcCwgRldMX1NZU0JUTlNJWkUsIEZXTF9TWVNCVE5TSVpFKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wTWluQm94LT5tX3J0QnRuLlNldCgNCisgICAgICAgICAgICBtX3J0UmVsYXRpdmUucmlnaHQoKSAtIEZXTF9TWVNCVE5NQVJHSU4gLSBGV0xfU1lTQlROU0laRSwNCisgICAgICAgICAgICBGV0xfU1lTQlROTUFSR0lOLCBGV0xfU1lTQlROU0laRSwgRldMX1NZU0JUTlNJWkUpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBtX2lTeXNCb3grKzsNCisgIH0NCisgIElGV0xfRm9ybURQKiBwRGF0YSA9DQorICAgICAgc3RhdGljX2Nhc3Q8SUZXTF9Gb3JtRFAqPihtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfSWNvbiAmJg0KKyAgICAgIHBEYXRhLT5HZXRJY29uKG1fcEludGVyZmFjZSwgRkFMU0UpKSB7DQorICAgIGlmIChtX2JDdXN0b21pemVMYXlvdXQpIHsNCisgICAgICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsNCisgICAgICBwYXJhbS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgICAgcGFyYW0ubV9pUGFydCA9IEZXTF9QQVJUX0ZSTV9JY29uOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXItPkdldENhcHRpb24obV9wSW50ZXJmYWNlLCB3c1RleHQpOw0KKyAgICAgIHBhcmFtLm1fcERhdGEgPSAmd3NUZXh0Ow0KKyAgICAgIHBUaGVtZS0+R2V0UGFydFJlY3QoJnBhcmFtLCBtX3J0SWNvbik7DQorICAgIH0gZWxzZSB7DQorICAgICAgbV9ydEljb24uU2V0KDUsIChtX3J0Q2FwdGlvbi5oZWlnaHQgLSBtX2ZTbWFsbEljb25TeikgLyAyLCBtX2ZTbWFsbEljb25TeiwNCisgICAgICAgICAgICAgICAgICAgbV9mU21hbGxJY29uU3opOw0KKyAgICB9DQorICB9DQorICBpZiAobV9iQ3VzdG9taXplTGF5b3V0KSB7DQorICAgIENGV0xfVGhlbWVUZXh0IHBhcm1hOw0KKyAgICBwYXJtYS5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICAgIHBhcm1hLm1faVBhcnQgPSBGV0xfUEFSVF9GUk1fSGVhZFRleHQ7DQorICAgIG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlci0+R2V0Q2FwdGlvbihtX3BJbnRlcmZhY2UsIHBhcm1hLm1fd3NUZXh0KTsNCisgICAgcFRoZW1lLT5HZXRQYXJ0UmVjdCgmcGFybWEsIG1fcnRDYXB0aW9uVGV4dCk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wOjpSZWdpc3RlckZvcm0oKSB7DQorICBJRldMX05vdGVUaHJlYWQqIHBUaHJlYWQgPSBHZXRPd25lclRocmVhZCgpOw0KKyAgaWYgKCFwVGhyZWFkKQ0KKyAgICByZXR1cm47DQorICBDRldMX05vdGVEcml2ZXIqIHBEcml2ZXIgPQ0KKyAgICAgIHN0YXRpY19jYXN0PENGV0xfTm90ZURyaXZlcio+KHBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKSk7DQorICBpZiAoIXBEcml2ZXIpDQorICAgIHJldHVybjsNCisgIHBEcml2ZXItPlJlZ2lzdGVyRm9ybSh0aGlzKTsNCit9DQordm9pZCBDRldMX0Zvcm1JbXA6OlVuUmVnaXN0ZXJGb3JtKCkgew0KKyAgSUZXTF9Ob3RlVGhyZWFkKiBwVGhyZWFkID0gR2V0T3duZXJUaHJlYWQoKTsNCisgIGlmICghcFRocmVhZCkNCisgICAgcmV0dXJuOw0KKyAgQ0ZXTF9Ob3RlRHJpdmVyKiBwRHJpdmVyID0NCisgICAgICBzdGF0aWNfY2FzdDxDRldMX05vdGVEcml2ZXIqPihwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCkpOw0KKyAgaWYgKCFwRHJpdmVyKQ0KKyAgICByZXR1cm47DQorICBwRHJpdmVyLT5VblJlZ2lzdGVyRm9ybSh0aGlzKTsNCit9DQorRlhfQk9PTCBDRldMX0Zvcm1JbXA6OklzRG9Nb2RhbCgpIHsNCisgIHJldHVybiBtX2JEb01vZGFsRmxhZzsNCit9DQordm9pZCBDRldMX0Zvcm1JbXA6OlNldFRoZW1lRGF0YSgpIHsNCisgIG1fZlNtYWxsSWNvblN6ID0NCisgICAgICAqc3RhdGljX2Nhc3Q8RlhfRkxPQVQqPihHZXRUaGVtZUNhcGFjaXR5KEZXTF9XR1RDQVBBQ0lUWV9GUk1fU21hbGxJY29uKSk7DQorICBtX2ZCaWdJY29uU3ogPQ0KKyAgICAgICpzdGF0aWNfY2FzdDxGWF9GTE9BVCo+KEdldFRoZW1lQ2FwYWNpdHkoRldMX1dHVENBUEFDSVRZX0ZSTV9CaWdJY29uKSk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Gb3JtSW1wOjpIYXNJY29uKCkgew0KKyAgSUZXTF9Gb3JtRFAqIHBEYXRhID0NCisgICAgICBzdGF0aWNfY2FzdDxJRldMX0Zvcm1EUCo+KG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQorICByZXR1cm4gISFwRGF0YS0+R2V0SWNvbihtX3BJbnRlcmZhY2UsIEZBTFNFKTsNCit9DQordm9pZCBDRldMX0Zvcm1JbXA6OlVwZGF0ZUljb24oKSB7DQorICBDRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9IHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0TWdyKj4oRldMX0dldFdpZGdldE1ncigpKTsNCisgIGlmICghcFdpZGdldE1ncikNCisgICAgcmV0dXJuOw0KKyAgSUZXTF9Gb3JtRFAqIHBEYXRhID0NCisgICAgICBzdGF0aWNfY2FzdDxJRldMX0Zvcm1EUCo+KG1fcFByb3BlcnRpZXMtPm1fcERhdGFQcm92aWRlcik7DQorICBDRlhfRElCaXRtYXAqIHBCaWdJY29uID0gcERhdGEtPkdldEljb24obV9wSW50ZXJmYWNlLCBUUlVFKTsNCisgIENGWF9ESUJpdG1hcCogcFNtYWxsSWNvbiA9IHBEYXRhLT5HZXRJY29uKG1fcEludGVyZmFjZSwgRkFMU0UpOw0KKyAgaWYgKHBCaWdJY29uICYmIHBCaWdJY29uICE9IG1fcEJpZ0ljb24pIHsNCisgICAgbV9wQmlnSWNvbiA9IHBCaWdJY29uOw0KKyAgICBwV2lkZ2V0TWdyLT5TZXRXaWRnZXRJY29uX05hdGl2ZShtX3BJbnRlcmZhY2UsIG1fcEJpZ0ljb24sIFRSVUUpOw0KKyAgfQ0KKyAgaWYgKHBTbWFsbEljb24gJiYgcFNtYWxsSWNvbiAhPSBtX3BTbWFsbEljb24pIHsNCisgICAgbV9wU21hbGxJY29uID0gcFNtYWxsSWNvbjsNCisgICAgcFdpZGdldE1nci0+U2V0V2lkZ2V0SWNvbl9OYXRpdmUobV9wSW50ZXJmYWNlLCBtX3BCaWdJY29uLCBGQUxTRSk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wOjpVcGRhdGVDYXB0aW9uKCkgew0KKyAgQ0ZXTF9XaWRnZXRNZ3IqIHBXaWRnZXRNZ3IgPSBzdGF0aWNfY2FzdDxDRldMX1dpZGdldE1ncio+KEZXTF9HZXRXaWRnZXRNZ3IoKSk7DQorICBpZiAoIXBXaWRnZXRNZ3IpDQorICAgIHJldHVybjsNCisgIElGV0xfRm9ybURQKiBwRGF0YSA9DQorICAgICAgc3RhdGljX2Nhc3Q8SUZXTF9Gb3JtRFAqPihtX3BQcm9wZXJ0aWVzLT5tX3BEYXRhUHJvdmlkZXIpOw0KKyAgaWYgKCFwRGF0YSkNCisgICAgcmV0dXJuOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgdGV4dDsNCisgIHBEYXRhLT5HZXRDYXB0aW9uKG1fcEludGVyZmFjZSwgdGV4dCk7DQorICBwV2lkZ2V0TWdyLT5TZXRXaWRnZXRDYXB0aW9uX05hdGl2ZShtX3BJbnRlcmZhY2UsIHRleHQpOw0KK30NCit2b2lkIENGV0xfRm9ybUltcDo6RG9XaWR0aExpbWl0KEZYX0ZMT0FUJiBmTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ3VyWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTcGFjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZMaW1pdE1pbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZMaW1pdE1heCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxlZnQpIHsNCisgIEZYX0ZMT0FUIGZ4ID0gZkN1clg7DQorICBGWF9GTE9BVCBmeSA9IDA7DQorICBUcmFuc2Zvcm1UbyhOVUxMLCBmeCwgZnkpOw0KKyAgRlhfRkxPQVQgZlRlbXAgPQ0KKyAgICAgIGJMZWZ0ID8gKGZXaWR0aCAtIGZ4ICsgZkxlZnQgKyBmU3BhY2UpIDogKGZ4IC0gZkxlZnQgKyBmU3BhY2UpOw0KKyAgaWYgKGZUZW1wID49IGZMaW1pdE1pbiAmJiBmVGVtcCA8PSBmTGltaXRNYXgpIHsNCisgICAgZldpZHRoID0gZlRlbXA7DQorICAgIGZMZWZ0ICs9IGJMZWZ0ID8gKGZ4IC0gZkxlZnQgLSBmU3BhY2UpIDogMDsNCisgIH0gZWxzZSB7DQorICAgIGlmIChmVGVtcCA8IGZMaW1pdE1pbiAmJiBmV2lkdGggPiBmTGltaXRNaW4pIHsNCisgICAgICBmTGVmdCArPSBiTGVmdCA/IChmV2lkdGggLSBmTGltaXRNaW4pIDogMDsNCisgICAgICBmV2lkdGggPSBmTGltaXRNaW47DQorICAgIH0gZWxzZSBpZiAoZlRlbXAgPiBmTGltaXRNYXggJiYgZldpZHRoIDwgZkxpbWl0TWF4KSB7DQorICAgICAgZkxlZnQgLT0gYkxlZnQgPyAoZkxpbWl0TWF4IC0gZldpZHRoKSA6IDA7DQorICAgICAgZldpZHRoID0gZkxpbWl0TWF4Ow0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wOjpEb0hlaWdodExpbWl0KEZYX0ZMT0FUJiBmVG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmSGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDdXJZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTcGFjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTGltaXRNaW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkxpbWl0TWF4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRvcCkgew0KKyAgRlhfRkxPQVQgZnggPSAwOw0KKyAgRlhfRkxPQVQgZnkgPSBmQ3VyWTsNCisgIFRyYW5zZm9ybVRvKE5VTEwsIGZ4LCBmeSk7DQorICBGWF9GTE9BVCBmVGVtcCA9IGJUb3AgPyAoZkhlaWdodCAtIGZ5ICsgZlRvcCArIGZTcGFjZSkgOiAoZnkgLSBmVG9wICsgZlNwYWNlKTsNCisgIGlmIChmVGVtcCA+PSBmTGltaXRNaW4gJiYgZlRlbXAgPD0gZkxpbWl0TWF4KSB7DQorICAgIGZIZWlnaHQgPSBmVGVtcDsNCisgICAgZlRvcCArPSBiVG9wID8gKGZ5IC0gZlRvcCAtIGZTcGFjZSkgOiAwOw0KKyAgfSBlbHNlIHsNCisgICAgaWYgKGZUZW1wIDwgZkxpbWl0TWluICYmIGZIZWlnaHQgPiBmTGltaXRNaW4pIHsNCisgICAgICBmVG9wICs9IGJUb3AgPyAoZkhlaWdodCAtIGZMaW1pdE1pbikgOiAwOw0KKyAgICAgIGZIZWlnaHQgPSBmTGltaXRNaW47DQorICAgIH0gZWxzZSBpZiAoZlRlbXAgPiBmTGltaXRNYXggJiYgZkhlaWdodCA8IGZMaW1pdE1heCkgew0KKyAgICAgIGZUb3AgLT0gYlRvcCA/IChmTGltaXRNYXggLSBmSGVpZ2h0KSA6IDA7DQorICAgICAgZkhlaWdodCA9IGZMaW1pdE1heDsNCisgICAgfQ0KKyAgfQ0KK30NCitDRldMX0Zvcm1JbXBEZWxlZ2F0ZTo6Q0ZXTF9Gb3JtSW1wRGVsZWdhdGUoQ0ZXTF9Gb3JtSW1wKiBwT3duZXIpDQorICAgIDogbV9wT3duZXIocE93bmVyKSB7DQorfQ0KK2ludDMyX3QgQ0ZXTF9Gb3JtSW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyNpZmRlZiBGV0xfVXNlTWFjU3lzdGVtQm9yZGVyDQorICBpZiAoIXBNZXNzYWdlKQ0KKyAgICByZXR1cm4gMDsNCisgIEZYX0RXT1JEIGR3TXNnQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQorICBpbnQzMl90IGlSZXQgPSAxOw0KKyAgc3dpdGNoIChkd01zZ0NvZGUpIHsNCisgICAgY2FzZSBGV0xfTVNHSEFTSF9BY3RpdmF0ZTogew0KKyAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICY9IH5GV0xfV0dUU1RBVEVfRGVhY3RpdmF0ZWQ7DQorICAgICAgbV9wT3duZXItPlJlcGFpbnQoJm1fcE93bmVyLT5tX3J0UmVsYXRpdmUpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01TR0hBU0hfRGVhY3RpdmF0ZTogew0KKyAgICAgIG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzIHw9IEZXTF9XR1RTVEFURV9EZWFjdGl2YXRlZDsNCisgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRSZWxhdGl2ZSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisjZWxzZQ0KKyAgaWYgKCFwTWVzc2FnZSkNCisgICAgcmV0dXJuIDA7DQorICBGWF9EV09SRCBkd01zZ0NvZGUgPSBwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpOw0KKyAgaW50MzJfdCBpUmV0ID0gMTsNCisgIHN3aXRjaCAoZHdNc2dDb2RlKSB7DQorICAgIGNhc2UgRldMX01TR0hBU0hfQWN0aXZhdGU6IHsNCisgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1dHVFNUQVRFX0RlYWN0aXZhdGVkOw0KKyAgICAgIElGV0xfTm90ZVRocmVhZCogcFRocmVhZCA9IG1fcE93bmVyLT5HZXRPd25lclRocmVhZCgpOw0KKyAgICAgIENGV0xfTm90ZURyaXZlciogcERyaXZlciA9DQorICAgICAgICAgIHN0YXRpY19jYXN0PENGV0xfTm90ZURyaXZlcio+KHBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKSk7DQorICAgICAgQ0ZXTF9XaWRnZXRJbXAqIHBTdWJGb2N1c0ltcCA9IG1fcE93bmVyLT5HZXRTdWJGb2N1cygpOw0KKyAgICAgIElGV0xfV2lkZ2V0KiBwU3ViRm9jdXMgPQ0KKyAgICAgICAgICBwU3ViRm9jdXNJbXAgPyBwU3ViRm9jdXNJbXAtPkdldEludGVyZmFjZSgpIDogTlVMTDsNCisgICAgICBpZiAocFN1YkZvY3VzICYmIHBTdWJGb2N1cyAhPSBwRHJpdmVyLT5HZXRGb2N1cygpKSB7DQorICAgICAgICBwRHJpdmVyLT5TZXRGb2N1cyhwU3ViRm9jdXMpOw0KKyAgICAgIH0NCisgICAgICBtX3BPd25lci0+UmVwYWludCgmbV9wT3duZXItPm1fcnRSZWxhdGl2ZSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9EZWFjdGl2YXRlOiB7DQorICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gRldMX1dHVFNUQVRFX0RlYWN0aXZhdGVkOw0KKyAgICAgIElGV0xfTm90ZVRocmVhZCogcFRocmVhZCA9IG1fcE93bmVyLT5HZXRPd25lclRocmVhZCgpOw0KKyAgICAgIENGV0xfTm90ZURyaXZlciogcERyaXZlciA9DQorICAgICAgICAgIHN0YXRpY19jYXN0PENGV0xfTm90ZURyaXZlcio+KHBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKSk7DQorICAgICAgQ0ZXTF9XaWRnZXRJbXAqIHBTdWJGb2N1c0ltcCA9IG1fcE93bmVyLT5HZXRTdWJGb2N1cygpOw0KKyAgICAgIElGV0xfV2lkZ2V0KiBwU3ViRm9jdXMgPQ0KKyAgICAgICAgICBwU3ViRm9jdXNJbXAgPyBwU3ViRm9jdXNJbXAtPkdldEludGVyZmFjZSgpIDogTlVMTDsNCisgICAgICBpZiAocFN1YkZvY3VzKSB7DQorICAgICAgICBpZiAocFN1YkZvY3VzID09IHBEcml2ZXItPkdldEZvY3VzKCkpIHsNCisgICAgICAgICAgcERyaXZlci0+U2V0Rm9jdXMoTlVMTCk7DQorICAgICAgICB9IGVsc2UgaWYgKHBTdWJGb2N1cy0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgew0KKyAgICAgICAgICBDRldMX01zZ0tpbGxGb2N1cyBtczsNCisgICAgICAgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogcERlbGVnYXRlID0gcFN1YkZvY3VzLT5TZXREZWxlZ2F0ZShOVUxMKTsNCisgICAgICAgICAgaWYgKHBEZWxlZ2F0ZSkgew0KKyAgICAgICAgICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZSgmbXMpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIG1fcE93bmVyLT5SZXBhaW50KCZtX3BPd25lci0+bV9ydFJlbGF0aXZlKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX01vdXNlOiB7DQorICAgICAgQ0ZXTF9Nc2dNb3VzZSogcE1zZyA9IHN0YXRpY19jYXN0PENGV0xfTXNnTW91c2UqPihwTWVzc2FnZSk7DQorICAgICAgc3dpdGNoIChwTXNnLT5tX2R3Q21kKSB7DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjogew0KKyAgICAgICAgICBPbkxCdXR0b25Eb3duKHBNc2cpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGNhc2UgRldMX01TR01PVVNFQ01EX0xCdXR0b25VcDogew0KKyAgICAgICAgICBPbkxCdXR0b25VcChwTXNnKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBjYXNlIEZXTF9NU0dNT1VTRUNNRF9Nb3VzZU1vdmU6IHsNCisgICAgICAgICAgT25Nb3VzZU1vdmUocE1zZyk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTW91c2VIb3Zlcjogew0KKyAgICAgICAgICBPbk1vdXNlSG92ZXIocE1zZyk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTW91c2VMZWF2ZTogew0KKyAgICAgICAgICBPbk1vdXNlTGVhdmUocE1zZyk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY2FzZSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRibENsazogew0KKyAgICAgICAgICBPbkxCdXR0b25EYmxDbGsocE1zZyk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX1NpemU6IHsNCisgICAgICBDRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9DQorICAgICAgICAgIHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0TWdyKj4oRldMX0dldFdpZGdldE1ncigpKTsNCisgICAgICBpZiAoIXBXaWRnZXRNZ3IpDQorICAgICAgICByZXR1cm4gMDsNCisgICAgICBwV2lkZ2V0TWdyLT5BZGRSZWRyYXdDb3VudHMobV9wT3duZXItPm1fcEludGVyZmFjZSk7DQorICAgICAgaWYgKCFtX3BPd25lci0+bV9iU2V0TWF4aW1pemUpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBtX3BPd25lci0+bV9iU2V0TWF4aW1pemUgPSBGQUxTRTsNCisgICAgICBDRldMX01zZ1NpemUqIHBNc2cgPSBzdGF0aWNfY2FzdDxDRldMX01zZ1NpemUqPihwTWVzc2FnZSk7DQorICAgICAgQ0ZYX1JlY3RGIHJ0Ow0KKyAgICAgIHBXaWRnZXRNZ3ItPkdldFdpZGdldFJlY3RfTmF0aXZlKG1fcE93bmVyLT5tX3BJbnRlcmZhY2UsIHJ0KTsNCisgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5sZWZ0ID0gcnQubGVmdDsNCisgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC50b3AgPSBydC50b3A7DQorICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGggPSAoRlhfRkxPQVQpcE1zZy0+bV9pV2lkdGg7DQorICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0ID0gKEZYX0ZMT0FUKXBNc2ctPm1faUhlaWdodDsNCisgICAgICBtX3BPd25lci0+VXBkYXRlKCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9XaW5kb3dNb3ZlOiB7DQorICAgICAgT25XaW5kb3dNb3ZlKHN0YXRpY19jYXN0PENGV0xfTXNnV2luZG93TW92ZSo+KHBNZXNzYWdlKSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9DbG9zZTogew0KKyAgICAgIE9uQ2xvc2Uoc3RhdGljX2Nhc3Q8Q0ZXTF9Nc2dDbG9zZSo+KHBNZXNzYWdlKSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZGVmYXVsdDogeyBpUmV0ID0gMDsgfQ0KKyAgfQ0KKyAgcmV0dXJuIGlSZXQ7DQorI2VuZGlmDQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Gb3JtSW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkgew0KKyAgaWYgKCFwRXZlbnQpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBpZiAocEV2ZW50LT5HZXRDbGFzc0lEKCkgPT0gRldMX0VWVEhBU0hfQ2xvc2UgJiYNCisgICAgICBwRXZlbnQtPm1fcFNyY1RhcmdldCA9PSBtX3BPd25lci0+bV9wSW50ZXJmYWNlKSB7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Gb3JtSW1wRGVsZWdhdGU6Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgcmV0dXJuIG1fcE93bmVyLT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wRGVsZWdhdGU6Ok9uTEJ1dHRvbkRvd24oQ0ZXTF9Nc2dNb3VzZSogcE1zZykgew0KKyAgbV9wT3duZXItPlNldEdyYWIoVFJVRSk7DQorICBtX3BPd25lci0+bV9iTEJ1dHRvbkRvd24gPSBUUlVFOw0KKyAgbV9wT3duZXItPm1fZVJlc2l6ZVR5cGUgPSBGT1JNX1JFU0laRVRZUEVfTm9uZTsNCisgIENGV0xfU3lzQnRuKiBwUHJlc3NCdG4gPSBtX3BPd25lci0+R2V0U3lzQnRuQXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgIG1fcE93bmVyLT5tX2lDYXB0dXJlQnRuID0gbV9wT3duZXItPkdldFN5c0J0bkluZGV4KHBQcmVzc0J0bik7DQorICBDRlhfUmVjdEYgcnRDYXA7DQorICBydENhcC5TZXQobV9wT3duZXItPm1fcnRDYXB0aW9uLmxlZnQgKyBtX3BPd25lci0+bV9mQ1lCb3JkZXIsDQorICAgICAgICAgICAgbV9wT3duZXItPm1fcnRDYXB0aW9uLnRvcCArIG1fcE93bmVyLT5tX2ZDWEJvcmRlciwNCisgICAgICAgICAgICBtX3BPd25lci0+bV9ydENhcHRpb24ud2lkdGggLSBGV0xfU1lTQlROU0laRSAqIG1fcE93bmVyLT5tX2lTeXNCb3ggLQ0KKyAgICAgICAgICAgICAgICAyICogbV9wT3duZXItPm1fZkNZQm9yZGVyLA0KKyAgICAgICAgICAgIG1fcE93bmVyLT5tX3J0Q2FwdGlvbi5oZWlnaHQgLSBtX3BPd25lci0+bV9mQ1hCb3JkZXIpOw0KKyAgaWYgKHBQcmVzc0J0bikgew0KKyAgICBwUHJlc3NCdG4tPlNldFByZXNzZWQoKTsNCisgICAgbV9wT3duZXItPlJlcGFpbnQoJnBQcmVzc0J0bi0+bV9ydEJ0bik7DQorICB9IGVsc2UgaWYgKHJ0Q2FwLkNvbnRhaW5zKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpKSB7DQorICAgIG1fcE93bmVyLT5tX2VSZXNpemVUeXBlID0gRk9STV9SRVNJWkVUWVBFX0NhcDsNCisgIH0gZWxzZSBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0JvcmRlcikgJiYNCisgICAgICAgICAgICAgKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYNCisgICAgICAgICAgICAgIEZXTF9TVFlMRUVYVF9GUk1fUmVzaXplKSAmJg0KKyAgICAgICAgICAgICAhbV9wT3duZXItPm1fYk1heGltaXplZCkgew0KKyAgICBtX3BPd25lci0+U2V0Q3Vyc29yKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgfQ0KKyAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC5TZXQocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9zelN0YXJ0LlNldCgNCisgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aCwNCisgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQpOw0KK30NCit2b2lkIENGV0xfRm9ybUltcERlbGVnYXRlOjpPbkxCdXR0b25VcChDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBtX3BPd25lci0+U2V0R3JhYihGQUxTRSk7DQorICBtX3BPd25lci0+bV9iTEJ1dHRvbkRvd24gPSBGQUxTRTsNCisgIENGV0xfU3lzQnRuKiBwUG9pbnRCdG4gPSBtX3BPd25lci0+R2V0U3lzQnRuQXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgIENGV0xfU3lzQnRuKiBwUHJlc3NlZEJ0biA9DQorICAgICAgbV9wT3duZXItPkdldFN5c0J0bkJ5SW5kZXgobV9wT3duZXItPm1faUNhcHR1cmVCdG4pOw0KKyAgaWYgKCFwUHJlc3NlZEJ0biB8fCBwUG9pbnRCdG4gIT0gcFByZXNzZWRCdG4pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKHBQcmVzc2VkQnRuID09IG1fcE93bmVyLT5HZXRTeXNCdG5CeVN0YXRlKEZXTF9TWVNCVVRUT05TVEFURV9QcmVzc2VkKSkgew0KKyAgICBwUHJlc3NlZEJ0bi0+U2V0Tm9ybWFsKCk7DQorICB9DQorICBpZiAocFByZXNzZWRCdG4gPT0gbV9wT3duZXItPm1fcE1heEJveCkgew0KKyAgICBpZiAobV9wT3duZXItPm1fYk1heGltaXplZCkgew0KKyAgICAgIG1fcE93bmVyLT5TZXRXaWRnZXRSZWN0KG1fcE93bmVyLT5tX3J0UmVzdG9yZSk7DQorICAgICAgbV9wT3duZXItPlVwZGF0ZSgpOw0KKyAgICAgIG1fcE93bmVyLT5SZXBhaW50KCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgbV9wT3duZXItPlNldFdvcmtBcmVhUmVjdCgpOw0KKyAgICAgIG1fcE93bmVyLT5VcGRhdGUoKTsNCisgICAgfQ0KKyAgICBtX3BPd25lci0+bV9iTWF4aW1pemVkID0gIW1fcE93bmVyLT5tX2JNYXhpbWl6ZWQ7DQorICB9IGVsc2UgaWYgKHBQcmVzc2VkQnRuID09IG1fcE93bmVyLT5tX3BNaW5Cb3gpIHsNCisgICAgQ0ZXTF9XaWRnZXRNZ3IqIHBXaWRnZXRNZ3IgPQ0KKyAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZXTF9XaWRnZXRNZ3IqPihGV0xfR2V0V2lkZ2V0TWdyKCkpOw0KKyAgICBpZiAoIXBXaWRnZXRNZ3IpDQorICAgICAgcmV0dXJuOw0KKyAgICBwV2lkZ2V0TWdyLT5TZXRNaW5pbWl6ZV9OYXRpdmUobV9wT3duZXItPm1fcEludGVyZmFjZSk7DQorICB9IGVsc2Ugew0KKyAgICBDRldMX0V2dENsb3NlIGVDbG9zZTsNCisgICAgZUNsb3NlLm1fcFNyY1RhcmdldCA9IG1fcE93bmVyLT5tX3BJbnRlcmZhY2U7DQorICAgIG1fcE93bmVyLT5EaXNwYXRjaEV2ZW50KCZlQ2xvc2UpOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfRm9ybUltcERlbGVnYXRlOjpPbk1vdXNlTW92ZShDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBDRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9IHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0TWdyKj4oRldMX0dldFdpZGdldE1ncigpKTsNCisgIGlmIChtX3BPd25lci0+bV9iTEJ1dHRvbkRvd24pIHsNCisgICAgSUZXTF9BZGFwdGVyTmF0aXZlKiBwTmF0aXZlID0gRldMX0dldEFkYXB0ZXJOYXRpdmUoKTsNCisgICAgSUZXTF9BZGFwdGVyQ3Vyc29yTWdyKiBwQ3Vyc29yTWdyID0gcE5hdGl2ZS0+R2V0Q3Vyc29yTWdyKCk7DQorICAgIGlmICghcEN1cnNvck1ncikNCisgICAgICByZXR1cm47DQorICAgIENGV0xfU3lzQnRuKiBwUHJlc3NlZEJ0biA9DQorICAgICAgICBtX3BPd25lci0+R2V0U3lzQnRuQnlJbmRleChtX3BPd25lci0+bV9pQ2FwdHVyZUJ0bik7DQorICAgIEZYX0ZMT0FUIGZUb3AsIGZMZWZ0LCBmV2lkdGgsIGZIZWlnaHQ7DQorICAgIGZUb3AgPSBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC50b3A7DQorICAgIGZMZWZ0ID0gbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQubGVmdDsNCisgICAgZldpZHRoID0gbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGg7DQorICAgIGZIZWlnaHQgPSBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQ7DQorICAgIEZYX0ZMT0FUIGZXaWR0aE1heCwgZldpZHRoTWluLCBmSGVpZ2h0TWF4LCBmSGVpZ2h0TWluOw0KKyAgICBpZiAobV9wT3duZXItPm1fcENvbnRlbnQpIHsNCisgICAgICBtX3BPd25lci0+R2V0Q29udGVudCgpLT5HZXRNYXhTaXplKGZXaWR0aE1heCwgZkhlaWdodE1heCk7DQorICAgICAgbV9wT3duZXItPkdldENvbnRlbnQoKS0+R2V0TWluU2l6ZShmV2lkdGhNaW4sIGZIZWlnaHRNaW4pOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGZXaWR0aE1heCA9IGZIZWlnaHRNYXggPSAxMDI0ICogNDsNCisgICAgICBmV2lkdGhNaW4gPSBmSGVpZ2h0TWluID0gMDsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJXaWR0aGxpbWl0ID0gKGZXaWR0aE1pbiAhPSAwIHx8IGZXaWR0aE1heCAhPSAwKTsNCisgICAgRlhfQk9PTCBiSGVpZ2h0bGltaXQgPSAoZkhlaWdodE1pbiAhPSAwIHx8IGZIZWlnaHRNYXggIT0gMCk7DQorICAgIEZYX0JPT0wgYlNpemVsaW1pdCA9IGJXaWR0aGxpbWl0IHx8IGJIZWlnaHRsaW1pdDsNCisgICAgaWYgKGZXaWR0aE1heCAhPSAwIHx8IGZIZWlnaHRNYXggIT0gMCB8fCBmV2lkdGhNaW4gIT0gMCB8fA0KKyAgICAgICAgZkhlaWdodE1pbiAhPSAwKSB7DQorICAgICAgYlNpemVsaW1pdCA9IFRSVUU7DQorICAgIH0NCisgICAgaWYgKHBQcmVzc2VkQnRuKSB7DQorICAgICAgaWYgKCFwUHJlc3NlZEJ0bi0+bV9ydEJ0bi5Db250YWlucyhwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KSkgew0KKyAgICAgICAgcFByZXNzZWRCdG4tPlNldE5vcm1hbCgpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBwUHJlc3NlZEJ0bi0+U2V0UHJlc3NlZCgpOw0KKyAgICAgIH0NCisgICAgICBtX3BPd25lci0+UmVwYWludCgmcFByZXNzZWRCdG4tPm1fcnRCdG4pOw0KKyAgICAgIHJldHVybjsNCisgICAgfSBlbHNlIGlmIChtX3BPd25lci0+bV9iTWF4aW1pemVkKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX2VSZXNpemVUeXBlID09IEZPUk1fUkVTSVpFVFlQRV9DYXApIHsNCisgICAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5PZmZzZXQoDQorICAgICAgICAgIHBNc2ctPm1fZnggLSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LngsDQorICAgICAgICAgIHBNc2ctPm1fZnkgLSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnkpOw0KKyAgICAgIHBXaWRnZXRNZ3ItPlNldFdpZGdldFBvc2l0aW9uX05hdGl2ZSgNCisgICAgICAgICAgbV9wT3duZXItPm1fcEludGVyZmFjZSwgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQubGVmdCwNCisgICAgICAgICAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQudG9wKTsNCisgICAgICByZXR1cm47DQorICAgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fZVJlc2l6ZVR5cGUgPT0gRk9STV9SRVNJWkVUWVBFX1JpZ2h0KSB7DQorICAgICAgRldMX0hDVVJTT1IgaEN1cnNvciA9IHBDdXJzb3JNZ3ItPkdldFN5c3RlbUN1cnNvcihGV0xfQ1VSU09SVFlQRV9TaXplV0UpOw0KKyAgICAgIHBDdXJzb3JNZ3ItPlNldEN1cnNvcihoQ3Vyc29yKTsNCisgICAgICBwQ3Vyc29yTWdyLT5TaG93Q3Vyc29yKFRSVUUpOw0KKyAgICAgIGlmICghYldpZHRobGltaXQpIHsNCisgICAgICAgIGZXaWR0aCArPSBwTXNnLT5tX2Z4IC0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC54Ow0KKyAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC54ID0gcE1zZy0+bV9meDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wT3duZXItPkRvV2lkdGhMaW1pdChmTGVmdCwgZldpZHRoLCBwTXNnLT5tX2Z4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9zelN0YXJ0LnggLQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC54LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmV2lkdGhNaW4sIGZXaWR0aE1heCwgRkFMU0UpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChtX3BPd25lci0+bV9lUmVzaXplVHlwZSA9PSBGT1JNX1JFU0laRVRZUEVfTGVmdCkgew0KKyAgICAgIEZXTF9IQ1VSU09SIGhDdXJzb3IgPSBwQ3Vyc29yTWdyLT5HZXRTeXN0ZW1DdXJzb3IoRldMX0NVUlNPUlRZUEVfU2l6ZVdFKTsNCisgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgICBpZiAoIWJXaWR0aGxpbWl0KSB7DQorICAgICAgICBmTGVmdCAtPSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnggLSBwTXNnLT5tX2Z4Ow0KKyAgICAgICAgZldpZHRoICs9IG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCAtIHBNc2ctPm1fZng7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcE93bmVyLT5Eb1dpZHRoTGltaXQoZkxlZnQsIGZXaWR0aCwgcE1zZy0+bV9meCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC54LCBmV2lkdGhNaW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZXaWR0aE1heCwgVFJVRSk7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX2VSZXNpemVUeXBlID09IEZPUk1fUkVTSVpFVFlQRV9Cb3R0b20pIHsNCisgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0gcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVOUyk7DQorICAgICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KKyAgICAgIHBDdXJzb3JNZ3ItPlNob3dDdXJzb3IoVFJVRSk7DQorICAgICAgaWYgKCFiSGVpZ2h0bGltaXQpIHsNCisgICAgICAgIGZIZWlnaHQgKz0gcE1zZy0+bV9meSAtIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueTsNCisgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueSA9IHBNc2ctPm1fZnk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcE93bmVyLT5Eb0hlaWdodExpbWl0KGZUb3AsIGZIZWlnaHQsIHBNc2ctPm1fZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9zelN0YXJ0LnkgLQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZIZWlnaHRNaW4sIGZIZWlnaHRNYXgsIEZBTFNFKTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fZVJlc2l6ZVR5cGUgPT0gRk9STV9SRVNJWkVUWVBFX1RvcCkgew0KKyAgICAgIEZXTF9IQ1VSU09SIGhDdXJzb3IgPSBwQ3Vyc29yTWdyLT5HZXRTeXN0ZW1DdXJzb3IoRldMX0NVUlNPUlRZUEVfU2l6ZU5TKTsNCisgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgICBpZiAoIWJIZWlnaHRsaW1pdCkgew0KKyAgICAgICAgZlRvcCArPSBwTXNnLT5tX2Z5IC0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55Ow0KKyAgICAgICAgZkhlaWdodCAtPSBwTXNnLT5tX2Z5IC0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55Ow0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBtX3BPd25lci0+RG9IZWlnaHRMaW1pdChmVG9wLCBmSGVpZ2h0LCBwTXNnLT5tX2Z5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55LCBmSGVpZ2h0TWluLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkhlaWdodE1heCwgVFJVRSk7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKG1fcE93bmVyLT5tX2VSZXNpemVUeXBlID09IEZPUk1fUkVTSVpFVFlQRV9MZWZ0VG9wKSB7DQorICAgICAgRldMX0hDVVJTT1IgaEN1cnNvciA9DQorICAgICAgICAgIHBDdXJzb3JNZ3ItPkdldFN5c3RlbUN1cnNvcihGV0xfQ1VSU09SVFlQRV9TaXplTldTRSk7DQorICAgICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KKyAgICAgIHBDdXJzb3JNZ3ItPlNob3dDdXJzb3IoVFJVRSk7DQorICAgICAgaWYgKCFiU2l6ZWxpbWl0KSB7DQorICAgICAgICBmTGVmdCAtPSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnggLSBwTXNnLT5tX2Z4Ow0KKyAgICAgICAgZlRvcCArPSBwTXNnLT5tX2Z5IC0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55Ow0KKyAgICAgICAgZldpZHRoICs9IG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCAtIHBNc2ctPm1fZng7DQorICAgICAgICBmSGVpZ2h0IC09IHBNc2ctPm1fZnkgLSBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0Lnk7DQorICAgICAgICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnggPSBwTXNnLT5tX2Z4Ow0KKyAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55ID0gcE1zZy0+bV9meTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wT3duZXItPkRvV2lkdGhMaW1pdChmTGVmdCwgZldpZHRoLCBwTXNnLT5tX2Z4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LngsIGZXaWR0aE1pbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZldpZHRoTWF4LCBUUlVFKTsNCisgICAgICAgIG1fcE93bmVyLT5Eb0hlaWdodExpbWl0KGZUb3AsIGZIZWlnaHQsIHBNc2ctPm1fZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnksIGZIZWlnaHRNaW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmSGVpZ2h0TWF4LCBUUlVFKTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fZVJlc2l6ZVR5cGUgPT0gRk9STV9SRVNJWkVUWVBFX0xlZnRCb3R0b20pIHsNCisgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0NCisgICAgICAgICAgcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVORVNXKTsNCisgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgICBpZiAoIWJTaXplbGltaXQpIHsNCisgICAgICAgIGZMZWZ0IC09IG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCAtIHBNc2ctPm1fZng7DQorICAgICAgICBmV2lkdGggKz0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC54IC0gcE1zZy0+bV9meDsNCisgICAgICAgIGZIZWlnaHQgKz0gcE1zZy0+bV9meSAtIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueTsNCisgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCA9IHBNc2ctPm1fZng7DQorICAgICAgICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnkgPSBwTXNnLT5tX2Z5Ow0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBtX3BPd25lci0+RG9XaWR0aExpbWl0KGZMZWZ0LCBmV2lkdGgsIHBNc2ctPm1fZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCwgZldpZHRoTWluLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmV2lkdGhNYXgsIFRSVUUpOw0KKyAgICAgICAgbV9wT3duZXItPkRvSGVpZ2h0TGltaXQoZlRvcCwgZkhlaWdodCwgcE1zZy0+bV9meSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3N6U3RhcnQueSAtDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkhlaWdodE1pbiwgZkhlaWdodE1heCwgRkFMU0UpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChtX3BPd25lci0+bV9lUmVzaXplVHlwZSA9PSBGT1JNX1JFU0laRVRZUEVfUmlnaHRUb3ApIHsNCisgICAgICBGV0xfSENVUlNPUiBoQ3Vyc29yID0NCisgICAgICAgICAgcEN1cnNvck1nci0+R2V0U3lzdGVtQ3Vyc29yKEZXTF9DVVJTT1JUWVBFX1NpemVORVNXKTsNCisgICAgICBwQ3Vyc29yTWdyLT5TZXRDdXJzb3IoaEN1cnNvcik7DQorICAgICAgcEN1cnNvck1nci0+U2hvd0N1cnNvcihUUlVFKTsNCisgICAgICBpZiAoIWJTaXplbGltaXQpIHsNCisgICAgICAgIGZUb3AgKz0gcE1zZy0+bV9meSAtIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueTsNCisgICAgICAgIGZXaWR0aCArPSBwTXNnLT5tX2Z4IC0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC54Ow0KKyAgICAgICAgZkhlaWdodCAtPSBwTXNnLT5tX2Z5IC0gbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC55Ow0KKyAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fcHRTdGFydC54ID0gcE1zZy0+bV9meDsNCisgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueSA9IHBNc2ctPm1fZnk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIG1fcE93bmVyLT5Eb1dpZHRoTGltaXQoZkxlZnQsIGZXaWR0aCwgcE1zZy0+bV9meCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fc3pTdGFydC54IC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZldpZHRoTWluLCBmV2lkdGhNYXgsIEZBTFNFKTsNCisgICAgICAgIG1fcE93bmVyLT5Eb0hlaWdodExpbWl0KGZUb3AsIGZIZWlnaHQsIHBNc2ctPm1fZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnksIGZIZWlnaHRNaW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmSGVpZ2h0TWF4LCBUUlVFKTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAobV9wT3duZXItPm1fZVJlc2l6ZVR5cGUgPT0gRk9STV9SRVNJWkVUWVBFX1JpZ2h0Qm90dG9tKSB7DQorICAgICAgRldMX0hDVVJTT1IgaEN1cnNvciA9DQorICAgICAgICAgIHBDdXJzb3JNZ3ItPkdldFN5c3RlbUN1cnNvcihGV0xfQ1VSU09SVFlQRV9TaXplTldTRSk7DQorICAgICAgcEN1cnNvck1nci0+U2V0Q3Vyc29yKGhDdXJzb3IpOw0KKyAgICAgIHBDdXJzb3JNZ3ItPlNob3dDdXJzb3IoVFJVRSk7DQorICAgICAgaWYgKCFiU2l6ZWxpbWl0KSB7DQorICAgICAgICBmV2lkdGggKz0gcE1zZy0+bV9meCAtIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueDsNCisgICAgICAgIGZIZWlnaHQgKz0gcE1zZy0+bV9meSAtIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueTsNCisgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3B0U3RhcnQueCA9IHBNc2ctPm1fZng7DQorICAgICAgICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnkgPSBwTXNnLT5tX2Z5Ow0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBtX3BPd25lci0+RG9XaWR0aExpbWl0KGZMZWZ0LCBmV2lkdGgsIHBNc2ctPm1fZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE93bmVyLT5tX0luZm9TdGFydC5tX3N6U3RhcnQueCAtDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZXaWR0aE1pbiwgZldpZHRoTWF4LCBGQUxTRSk7DQorICAgICAgICBtX3BPd25lci0+RG9IZWlnaHRMaW1pdChmVG9wLCBmSGVpZ2h0LCBwTXNnLT5tX2Z5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wT3duZXItPm1fSW5mb1N0YXJ0Lm1fc3pTdGFydC55IC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BPd25lci0+bV9JbmZvU3RhcnQubV9wdFN0YXJ0LnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmSGVpZ2h0TWluLCBmSGVpZ2h0TWF4LCBGQUxTRSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChtX3BPd25lci0+bV9wQ29udGVudCkgew0KKyAgICB9DQorICAgIENGWF9SZWN0RiBydEZvcm07DQorICAgIHJ0Rm9ybS5TZXQoZkxlZnQsIGZUb3AsIGZXaWR0aCwgZkhlaWdodCk7DQorI2lmIChfRlhfT1NfID09IF9GWF9NQUNPU1hfKQ0KKyAgICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldCA9IHJ0Rm9ybTsNCisgICAgbV9wT3duZXItPlVwZGF0ZSgpOw0KKyAgICBtX3BPd25lci0+U2V0V2lkZ2V0UmVjdChydEZvcm0pOw0KKyNlbHNlDQorICAgIG1fcE93bmVyLT5TZXRXaWRnZXRSZWN0KHJ0Rm9ybSk7DQorICAgIG1fcE93bmVyLT5VcGRhdGUoKTsNCisjZW5kaWYNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKChtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9Cb3JkZXIpICYmDQorICAgICAgKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0ZSTV9SZXNpemUpICYmDQorICAgICAgIW1fcE93bmVyLT5tX2JNYXhpbWl6ZWQpIHsNCisgICAgbV9wT3duZXItPlNldEN1cnNvcihwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgIH0NCisgIENGWF9SZWN0RiBydEludmFsaWRhdGU7DQorICBydEludmFsaWRhdGUuUmVzZXQoKTsNCisgIENGV0xfU3lzQnRuKiBwUG9pbnRCdG4gPSBtX3BPd25lci0+R2V0U3lzQnRuQXRQb2ludChwTXNnLT5tX2Z4LCBwTXNnLT5tX2Z5KTsNCisgIENGV0xfU3lzQnRuKiBwT2xkSG92ZXIgPSBtX3BPd25lci0+R2V0U3lzQnRuQnlTdGF0ZShGV0xfU1lTQlVUVE9OU1RBVEVfSG92ZXIpOw0KKyNpZiAoX0ZYX09TXyA9PSBfRlhfTUFDT1NYXykNCisgIHsNCisgICAgaWYgKHBPbGRIb3ZlciAmJiBwUG9pbnRCdG4gIT0gcE9sZEhvdmVyKSB7DQorICAgICAgcE9sZEhvdmVyLT5TZXROb3JtYWwoKTsNCisgICAgfQ0KKyAgICBpZiAocFBvaW50QnRuICYmIHBQb2ludEJ0biAhPSBwT2xkSG92ZXIpIHsNCisgICAgICBwUG9pbnRCdG4tPlNldEhvdmVyKCk7DQorICAgIH0NCisgICAgaWYgKG1fcE93bmVyLT5tX3BDbG9zZUJveCkgew0KKyAgICAgIHJ0SW52YWxpZGF0ZSA9IG1fcE93bmVyLT5tX3BDbG9zZUJveC0+bV9ydEJ0bjsNCisgICAgfQ0KKyAgICBpZiAobV9wT3duZXItPm1fcE1heEJveCkgew0KKyAgICAgIGlmIChydEludmFsaWRhdGUuSXNFbXB0eSgpKSB7DQorICAgICAgICBydEludmFsaWRhdGUgPSBtX3BPd25lci0+bV9wTWF4Qm94LT5tX3J0QnRuOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBydEludmFsaWRhdGUuVW5pb24obV9wT3duZXItPm1fcE1heEJveC0+bV9ydEJ0bik7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChtX3BPd25lci0+bV9wTWluQm94KSB7DQorICAgICAgaWYgKHJ0SW52YWxpZGF0ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHJ0SW52YWxpZGF0ZSA9IG1fcE93bmVyLT5tX3BNaW5Cb3gtPm1fcnRCdG47DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJ0SW52YWxpZGF0ZS5VbmlvbihtX3BPd25lci0+bV9wTWluQm94LT5tX3J0QnRuKTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFydEludmFsaWRhdGUuSXNFbXB0eSgpICYmDQorICAgICAgICBydEludmFsaWRhdGUuQ29udGFpbnMocE1zZy0+bV9meCwgcE1zZy0+bV9meSkpIHsNCisgICAgICBtX3BPd25lci0+bV9iTW91c2VJbiA9IFRSVUU7DQorICAgIH0NCisgIH0NCisjZWxzZQ0KKyAgew0KKyAgICBpZiAocE9sZEhvdmVyICYmIHBQb2ludEJ0biAhPSBwT2xkSG92ZXIpIHsNCisgICAgICBwT2xkSG92ZXItPlNldE5vcm1hbCgpOw0KKyAgICAgIHJ0SW52YWxpZGF0ZSA9IHBPbGRIb3Zlci0+bV9ydEJ0bjsNCisgICAgfQ0KKyAgICBpZiAocFBvaW50QnRuICYmIHBQb2ludEJ0biAhPSBwT2xkSG92ZXIpIHsNCisgICAgICBwUG9pbnRCdG4tPlNldEhvdmVyKCk7DQorICAgICAgaWYgKHJ0SW52YWxpZGF0ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHJ0SW52YWxpZGF0ZSA9IHBQb2ludEJ0bi0+bV9ydEJ0bjsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcnRJbnZhbGlkYXRlLlVuaW9uKHBQb2ludEJ0bi0+bV9ydEJ0bik7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorI2VuZGlmDQorICBpZiAoIXJ0SW52YWxpZGF0ZS5Jc0VtcHR5KCkpIHsNCisgICAgbV9wT3duZXItPlJlcGFpbnQoJnJ0SW52YWxpZGF0ZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wRGVsZWdhdGU6Ok9uTW91c2VIb3ZlcihDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBtX3BPd25lci0+U2V0Q3Vyc29yKHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KK30NCit2b2lkIENGV0xfRm9ybUltcERlbGVnYXRlOjpPbk1vdXNlTGVhdmUoQ0ZXTF9Nc2dNb3VzZSogcE1zZykgew0KKyAgQ0ZXTF9TeXNCdG4qIHBIb3ZlciA9IG1fcE93bmVyLT5HZXRTeXNCdG5CeVN0YXRlKEZXTF9TWVNCVVRUT05TVEFURV9Ib3Zlcik7DQorICBpZiAocEhvdmVyKSB7DQorICAgIHBIb3Zlci0+U2V0Tm9ybWFsKCk7DQorICAgIG1fcE93bmVyLT5SZXBhaW50KCZwSG92ZXItPm1fcnRCdG4pOw0KKyAgfQ0KKyAgaWYgKHBNc2ctPm1fZHdDbWQgPT0gRldMX01TR01PVVNFQ01EX01vdXNlTGVhdmUgJiYNCisgICAgICAhbV9wT3duZXItPm1fYkxCdXR0b25Eb3duKSB7DQorICAgIG1fcE93bmVyLT5TZXRDdXJzb3IocE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtSW1wRGVsZWdhdGU6Ok9uTEJ1dHRvbkRibENsayhDRldMX01zZ01vdXNlKiBwTXNnKSB7DQorICBpZiAoKG1fcE93bmVyLT5tX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0ZSTV9SZXNpemUpICYmDQorICAgICAgbV9wT3duZXItPkhpdFRlc3QocE1zZy0+bV9meCwgcE1zZy0+bV9meSkgPT0gRldMX1dHVEhJVFRFU1RfVGl0bGViYXIpIHsNCisgICAgaWYgKG1fcE93bmVyLT5tX2JNYXhpbWl6ZWQpIHsNCisgICAgICBtX3BPd25lci0+U2V0V2lkZ2V0UmVjdChtX3BPd25lci0+bV9ydFJlc3RvcmUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG1fcE93bmVyLT5TZXRXb3JrQXJlYVJlY3QoKTsNCisgICAgfQ0KKyAgICBtX3BPd25lci0+VXBkYXRlKCk7DQorICAgIG1fcE93bmVyLT5tX2JNYXhpbWl6ZWQgPSAhbV9wT3duZXItPm1fYk1heGltaXplZDsNCisgIH0NCit9DQordm9pZCBDRldMX0Zvcm1JbXBEZWxlZ2F0ZTo6T25XaW5kb3dNb3ZlKENGV0xfTXNnV2luZG93TW92ZSogcE1zZykgew0KKyAgbV9wT3duZXItPm1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQubGVmdCA9IHBNc2ctPm1fZng7DQorICBtX3BPd25lci0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC50b3AgPSBwTXNnLT5tX2Z5Ow0KK30NCit2b2lkIENGV0xfRm9ybUltcERlbGVnYXRlOjpPbkNsb3NlKENGV0xfTXNnQ2xvc2UqIHBNc2cpIHsNCisgIENGV0xfRXZ0Q2xvc2UgZUNsb3NlOw0KKyAgZUNsb3NlLm1fcFNyY1RhcmdldCA9IG1fcE93bmVyLT5tX3BJbnRlcmZhY2U7DQorICBtX3BPd25lci0+RGlzcGF0Y2hFdmVudCgmZUNsb3NlKTsNCit9DQorRldMX0VSUiBGV0xfQWNjZWxlcmF0b3JfU2V0Rm9ybShJRldMX0Zvcm0qIHBGcm9tLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hcEFjY2VsZXJhdG9ycyogcE1hcEFjY2VsKSB7DQorICBDRldMX0Zvcm1JbXAqIHBJbXAgPSBzdGF0aWNfY2FzdDxDRldMX0Zvcm1JbXAqPihwRnJvbS0+R2V0SW1wbCgpKTsNCisgIGlmICghcEltcCkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX2dyaWRpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX2dyaWRpbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNmI4Y2EKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfZ3JpZGltcC5jcHAKQEAgLTAsMCArMSwxMzg2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3RhcmdldGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF90aHJlYWRpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF93aWRnZXRpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfY29udGVudGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9ncmlkaW1wLmgiDQorDQorLy8gc3RhdGljDQorSUZXTF9HcmlkKiBJRldMX0dyaWQ6OkNyZWF0ZShjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMpIHsNCisgIElGV0xfR3JpZCogcEdyaWQgPSBuZXcgSUZXTF9HcmlkOw0KKyAgQ0ZXTF9HcmlkSW1wKiBwR3JpZEltcGwgPSBuZXcgQ0ZXTF9HcmlkSW1wKHByb3BlcnRpZXMsIG51bGxwdHIpOw0KKyAgcEdyaWQtPlNldEltcGwocEdyaWRJbXBsKTsNCisgIHBHcmlkSW1wbC0+U2V0SW50ZXJmYWNlKHBHcmlkKTsNCisgIHJldHVybiBwR3JpZDsNCit9DQorSUZXTF9HcmlkOjpJRldMX0dyaWQoKSB7fQ0KK0ZXTF9IR1JJRENPTFJPVyBJRldMX0dyaWQ6Okluc2VydENvbFJvdyhGWF9CT09MIGJDb2x1bW4sIGludDMyX3QgbkluZGV4KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9HcmlkSW1wKj4oR2V0SW1wbCgpKS0+SW5zZXJ0Q29sUm93KGJDb2x1bW4sIG5JbmRleCk7DQorfQ0KK2ludDMyX3QgSUZXTF9HcmlkOjpDb3VudENvbFJvd3MoRlhfQk9PTCBiQ29sdW1uKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9HcmlkSW1wKj4oR2V0SW1wbCgpKS0+Q291bnRDb2xSb3dzKGJDb2x1bW4pOw0KK30NCitGV0xfSEdSSURDT0xST1cgSUZXTF9HcmlkOjpHZXRDb2xSb3coRlhfQk9PTCBiQ29sdW1uLCBpbnQzMl90IG5JbmRleCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfR3JpZEltcCo+KEdldEltcGwoKSktPkdldENvbFJvdyhiQ29sdW1uLCBuSW5kZXgpOw0KK30NCitpbnQzMl90IElGV0xfR3JpZDo6R2V0SW5kZXgoRldMX0hHUklEQ09MUk9XIGhDb2xSb3cpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0dyaWRJbXAqPihHZXRJbXBsKCkpLT5HZXRJbmRleChoQ29sUm93KTsNCit9DQorRlhfRkxPQVQgSUZXTF9HcmlkOjpHZXRTaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LCBGV0xfR1JJRFVOSVQmIGVVbml0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9HcmlkSW1wKj4oR2V0SW1wbCgpKS0+R2V0U2l6ZShoQ29sUm93LCBlVW5pdCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9HcmlkOjpTZXRTaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklEVU5JVCBlVW5pdCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfR3JpZEltcCo+KEdldEltcGwoKSktPlNldFNpemUoaENvbFJvdywgZlNpemUsIGVVbml0KTsNCit9DQorRlhfRkxPQVQgSUZXTF9HcmlkOjpHZXRNaW5TaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LCBGV0xfR1JJRFVOSVQmIGVVbml0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9HcmlkSW1wKj4oR2V0SW1wbCgpKS0+R2V0TWluU2l6ZShoQ29sUm93LCBlVW5pdCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9HcmlkOjpTZXRNaW5TaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklEVU5JVCBlVW5pdCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfR3JpZEltcCo+KEdldEltcGwoKSkNCisgICAgICAtPlNldE1pblNpemUoaENvbFJvdywgZlNpemUsIGVVbml0KTsNCit9DQorRlhfRkxPQVQgSUZXTF9HcmlkOjpHZXRNYXhTaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LCBGV0xfR1JJRFVOSVQmIGVVbml0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9HcmlkSW1wKj4oR2V0SW1wbCgpKS0+R2V0TWF4U2l6ZShoQ29sUm93LCBlVW5pdCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9HcmlkOjpTZXRNYXhTaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklEVU5JVCBlVW5pdCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfR3JpZEltcCo+KEdldEltcGwoKSkNCisgICAgICAtPlNldE1heFNpemUoaENvbFJvdywgZlNpemUsIGVVbml0KTsNCit9DQorRlhfQk9PTCBJRldMX0dyaWQ6OkRlbGV0ZUNvbFJvdyhGV0xfSEdSSURDT0xST1cgaENvbFJvdykgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfR3JpZEltcCo+KEdldEltcGwoKSktPkRlbGV0ZUNvbFJvdyhoQ29sUm93KTsNCit9DQorRlhfQk9PTCBJRldMX0dyaWQ6OklzQ29sdW1uKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9HcmlkSW1wKj4oR2V0SW1wbCgpKS0+SXNDb2x1bW4oaENvbFJvdyk7DQorfQ0KK2ludDMyX3QgSUZXTF9HcmlkOjpHZXRXaWRnZXRQb3MoSUZXTF9XaWRnZXQqIHBXaWRnZXQsIEZYX0JPT0wgYkNvbHVtbikgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfR3JpZEltcCo+KEdldEltcGwoKSktPkdldFdpZGdldFBvcyhwV2lkZ2V0LCBiQ29sdW1uKTsNCit9DQorRldMX0VSUiBJRldMX0dyaWQ6OlNldFdpZGdldFBvcyhJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNvbHVtbikgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfR3JpZEltcCo+KEdldEltcGwoKSkNCisgICAgICAtPlNldFdpZGdldFBvcyhwV2lkZ2V0LCBpUG9zLCBiQ29sdW1uKTsNCit9DQoraW50MzJfdCBJRldMX0dyaWQ6OkdldFdpZGdldFNwYW4oSUZXTF9XaWRnZXQqIHBXaWRnZXQsIEZYX0JPT0wgYkNvbHVtbikgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfR3JpZEltcCo+KEdldEltcGwoKSktPkdldFdpZGdldFNwYW4ocFdpZGdldCwgYkNvbHVtbik7DQorfQ0KK0ZXTF9FUlIgSUZXTF9HcmlkOjpTZXRXaWRnZXRTcGFuKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVNwYW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ29sdW1uKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9HcmlkSW1wKj4oR2V0SW1wbCgpKQ0KKyAgICAgIC0+U2V0V2lkZ2V0U3BhbihwV2lkZ2V0LCBpU3BhbiwgYkNvbHVtbik7DQorfQ0KK0ZYX0ZMT0FUIElGV0xfR3JpZDo6R2V0V2lkZ2V0U2l6ZShJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0dSSURTSVpFIGVTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRFVOSVQmIGVVbml0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9HcmlkSW1wKj4oR2V0SW1wbCgpKQ0KKyAgICAgIC0+R2V0V2lkZ2V0U2l6ZShwV2lkZ2V0LCBlU2l6ZSwgZVVuaXQpOw0KK30NCitGV0xfRVJSIElGV0xfR3JpZDo6U2V0V2lkZ2V0U2l6ZShJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRFNJWkUgZVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0dSSURVTklUIGVVaXQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0dyaWRJbXAqPihHZXRJbXBsKCkpDQorICAgICAgLT5TZXRXaWRnZXRTaXplKHBXaWRnZXQsIGVTaXplLCBmU2l6ZSwgZVVpdCk7DQorfQ0KK0ZYX0JPT0wgSUZXTF9HcmlkOjpHZXRXaWRnZXRNYXJnaW4oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRE1BUkdJTiBlTWFyZ2luLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZNYXJnaW4pIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0dyaWRJbXAqPihHZXRJbXBsKCkpDQorICAgICAgLT5HZXRXaWRnZXRNYXJnaW4ocFdpZGdldCwgZU1hcmdpbiwgZk1hcmdpbik7DQorfQ0KK0ZXTF9FUlIgSUZXTF9HcmlkOjpTZXRXaWRnZXRNYXJnaW4oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRE1BUkdJTiBlTWFyZ2luLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1hcmdpbikgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfR3JpZEltcCo+KEdldEltcGwoKSkNCisgICAgICAtPlNldFdpZGdldE1hcmdpbihwV2lkZ2V0LCBlTWFyZ2luLCBmTWFyZ2luKTsNCit9DQorRldMX0VSUiBJRldMX0dyaWQ6OlJlbW92ZVdpZGdldE1hcmdpbihJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklETUFSR0lOIGVNYXJnaW4pIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0dyaWRJbXAqPihHZXRJbXBsKCkpDQorICAgICAgLT5SZW1vdmVXaWRnZXRNYXJnaW4ocFdpZGdldCwgZU1hcmdpbik7DQorfQ0KK0ZYX0ZMT0FUIElGV0xfR3JpZDo6R2V0R3JpZFNpemUoRldMX0dSSURTSVpFIGVTaXplLCBGV0xfR1JJRFVOSVQmIGVVbml0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9HcmlkSW1wKj4oR2V0SW1wbCgpKS0+R2V0R3JpZFNpemUoZVNpemUsIGVVbml0KTsNCit9DQorRldMX0VSUiBJRldMX0dyaWQ6OlNldEdyaWRTaXplKEZXTF9HUklEU0laRSBlU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklEVU5JVCBlVWl0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9HcmlkSW1wKj4oR2V0SW1wbCgpKS0+U2V0R3JpZFNpemUoZVNpemUsIGZTaXplLCBlVWl0KTsNCit9DQorDQorQ0ZXTF9HcmlkSW1wOjpDRldMX0dyaWRJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpDQorICAgIDogQ0ZXTF9Db250ZW50SW1wKHByb3BlcnRpZXMsIHBPdXRlcikgew0KKyAgbV9TaXplW0ZXTF9HUklEU0laRV9XaWR0aF0uZVVuaXQgPSBGV0xfR1JJRFVOSVRfQXV0bzsNCisgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfV2lkdGhdLmZMZW5ndGggPSAwOw0KKyAgbV9TaXplW0ZXTF9HUklEU0laRV9IZWlnaHRdLmVVbml0ID0gRldMX0dSSURVTklUX0F1dG87DQorICBtX1NpemVbRldMX0dSSURTSVpFX0hlaWdodF0uZkxlbmd0aCA9IDA7DQorICBtX1NpemVbRldMX0dSSURTSVpFX01pbldpZHRoXS5lVW5pdCA9IEZXTF9HUklEVU5JVF9GaXhlZDsNCisgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluV2lkdGhdLmZMZW5ndGggPSAwOw0KKyAgbV9TaXplW0ZXTF9HUklEU0laRV9NYXhXaWR0aF0uZVVuaXQgPSBGV0xfR1JJRFVOSVRfSW5maW5pdHk7DQorICBtX1NpemVbRldMX0dSSURTSVpFX01heFdpZHRoXS5mTGVuZ3RoID0gMDsNCisgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluSGVpZ2h0XS5lVW5pdCA9IEZXTF9HUklEVU5JVF9GaXhlZDsNCisgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluSGVpZ2h0XS5mTGVuZ3RoID0gMDsNCisgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4SGVpZ2h0XS5lVW5pdCA9IEZXTF9HUklEVU5JVF9JbmZpbml0eTsNCisgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4SGVpZ2h0XS5mTGVuZ3RoID0gMDsNCit9DQorQ0ZXTF9HcmlkSW1wOjp+Q0ZXTF9HcmlkSW1wKCkgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX0NvbHVtbnMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgZGVsZXRlIHN0YXRpY19jYXN0PENGV0xfR3JpZENvbFJvdyo+KG1fQ29sdW1uc1tpXSk7DQorICB9DQorICBtX0NvbHVtbnMuUmVtb3ZlQWxsKCk7DQorICBpQ291bnQgPSBtX1Jvd3MuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaUNvdW50OyBqKyspIHsNCisgICAgZGVsZXRlIHN0YXRpY19jYXN0PENGV0xfR3JpZENvbFJvdyo+KG1fUm93c1tqXSk7DQorICB9DQorICBtX1Jvd3MuUmVtb3ZlQWxsKCk7DQorICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwV2lkZ2V0SW5mby5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocHMpIHsNCisgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQ7DQorICAgIENGV0xfR3JpZFdpZGdldEluZm8qIHBJbmZvOw0KKyAgICBtX21hcFdpZGdldEluZm8uR2V0TmV4dEFzc29jKHBzLCAodm9pZComKXBXaWRnZXQsICh2b2lkKiYpcEluZm8pOw0KKyAgICBkZWxldGUgcEluZm87DQorICB9DQorICBtX21hcFdpZGdldEluZm8uUmVtb3ZlQWxsKCk7DQorICBkZWxldGUgbV9wRGVsZWdhdGU7DQorICBtX3BEZWxlZ2F0ZSA9IG51bGxwdHI7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9HcmlkSW1wOjpHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2xhc3MpIGNvbnN0IHsNCisgIHdzQ2xhc3MgPSBGV0xfQ0xBU1NfR3JpZDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9HcmlkSW1wOjpHZXRDbGFzc0lEKCkgY29uc3Qgew0KKyAgcmV0dXJuIEZXTF9DTEFTU0hBU0hfR3JpZDsNCit9DQorRldMX0VSUiBDRldMX0dyaWRJbXA6OkluaXRpYWxpemUoKSB7DQorICBpZiAoQ0ZXTF9Db250ZW50SW1wOjpJbml0aWFsaXplKCkgIT0gRldMX0VSUl9TdWNjZWVkZWQpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBtX3BEZWxlZ2F0ZSA9IG5ldyBDRldMX0dyaWRJbXBEZWxlZ2F0ZSh0aGlzKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0dyaWRJbXA6OkZpbmFsaXplKCkgew0KKyAgaWYgKENGV0xfQ29udGVudEltcDo6RmluYWxpemUoKSAhPSBGV0xfRVJSX1N1Y2NlZWRlZCkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIGRlbGV0ZSBtX3BEZWxlZ2F0ZTsNCisgIG1fcERlbGVnYXRlID0gbnVsbHB0cjsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0dyaWRJbXA6OkdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSkgew0KKyAgaWYgKGJBdXRvU2l6ZSkgew0KKyAgICByZWN0LmxlZnQgPSAwOw0KKyAgICByZWN0LnRvcCA9IDA7DQorICAgIHJlY3Qud2lkdGggPSBQcm9jZXNzVW5DZXJ0YWluQ29sdW1ucygpOw0KKyAgICByZWN0LmhlaWdodCA9IFByb2Nlc3NVbkNlcnRhaW5Sb3dzKCk7DQorICB9IGVsc2Ugew0KKyAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0dyaWRJbXA6OlNldFdpZGdldFJlY3QoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBDRldMX1dpZGdldEltcDo6U2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0dyaWRJbXA6OlVwZGF0ZSgpIHsNCisgIGlmIChJc0xvY2tlZCgpKSB7DQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICB9DQorICBQcm9jZXNzQ29sdW1ucyhtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LndpZHRoKTsNCisgIFByb2Nlc3NSb3dzKG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0KTsNCisgIFNldEFsbFdpZGdldHNSZWN0KCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9HcmlkSW1wOjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIGlmICghcEdyYXBoaWNzKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX0dSSURTVFlMRUVYVF9TaG93R3JpZExpbmVzKSA9PSAwKSB7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIH0NCisgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIHBHcmFwaGljcy0+Q29uY2F0TWF0cml4KHBNYXRyaXgpOw0KKyAgfQ0KKyAgew0KKyAgICBGWF9CT09MIGJEcmF3TGluZSA9IEZBTFNFOw0KKyAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICBpbnQzMl90IGlDb2x1bW5zID0gbV9Db2x1bW5zLkdldFNpemUoKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgaUNvbHVtbnM7IGkrKykgew0KKyAgICAgIENGV0xfR3JpZENvbFJvdyogcENvbFJvdyA9IHN0YXRpY19jYXN0PENGV0xfR3JpZENvbFJvdyo+KG1fQ29sdW1uc1tpXSk7DQorICAgICAgaWYgKCFwQ29sUm93KSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgYkRyYXdMaW5lID0gVFJVRTsNCisgICAgICBwYXRoLkFkZExpbmUocENvbFJvdy0+bV9mQWN0dWFsUG9zLCAwLCBwQ29sUm93LT5tX2ZBY3R1YWxQb3MsDQorICAgICAgICAgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0KTsNCisgICAgfQ0KKyAgICBpbnQzMl90IGlSb3dzID0gbV9Sb3dzLkdldFNpemUoKTsNCisgICAgZm9yIChpbnQzMl90IGogPSAxOyBqIDwgaVJvd3M7IGorKykgew0KKyAgICAgIENGV0xfR3JpZENvbFJvdyogcENvbFJvdyA9IHN0YXRpY19jYXN0PENGV0xfR3JpZENvbFJvdyo+KG1fUm93c1tqXSk7DQorICAgICAgaWYgKCFwQ29sUm93KSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgYkRyYXdMaW5lID0gVFJVRTsNCisgICAgICBwYXRoLkFkZExpbmUoMCwgcENvbFJvdy0+bV9mQWN0dWFsUG9zLCBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICBwQ29sUm93LT5tX2ZBY3R1YWxQb3MpOw0KKyAgICB9DQorICAgIGlmIChiRHJhd0xpbmUpIHsNCisgICAgICBDRlhfQ29sb3IgY3IoMHhGRkZGMDAwMCk7DQorICAgICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY3IpOw0KKyAgICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCk7DQorICAgIH0NCisgIH0NCisgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0dyaWRJbXA6Okluc2VydFdpZGdldChJRldMX1dpZGdldCogcENoaWxkLCBpbnQzMl90IG5JbmRleCkgew0KKyAgaWYgKCFwQ2hpbGQpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBDRldMX0NvbnRlbnRJbXA6Okluc2VydFdpZGdldChwQ2hpbGQsIG5JbmRleCk7DQorICBpZiAoIW1fbWFwV2lkZ2V0SW5mby5HZXRWYWx1ZUF0KHBDaGlsZCkpIHsNCisgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyogcEluZm8gPSBuZXcgQ0ZXTF9HcmlkV2lkZ2V0SW5mbzsNCisgICAgbV9tYXBXaWRnZXRJbmZvLlNldEF0KHBDaGlsZCwgcEluZm8pOw0KKyAgICBtX1dpZGdldHMuQWRkKHBDaGlsZCk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9HcmlkSW1wOjpSZW1vdmVXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIGlmICghcFdpZGdldCkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIENGV0xfQ29udGVudEltcDo6UmVtb3ZlV2lkZ2V0KHBXaWRnZXQpOw0KKyAgaWYgKENGV0xfR3JpZFdpZGdldEluZm8qIHBJbmZvID0gc3RhdGljX2Nhc3Q8Q0ZXTF9HcmlkV2lkZ2V0SW5mbyo+KA0KKyAgICAgICAgICBtX21hcFdpZGdldEluZm8uR2V0VmFsdWVBdChwV2lkZ2V0KSkpIHsNCisgICAgbV9tYXBXaWRnZXRJbmZvLlJlbW92ZUtleShwV2lkZ2V0KTsNCisgICAgZGVsZXRlIHBJbmZvOw0KKyAgICBpbnQzMl90IG5JbmRleCA9IG1fV2lkZ2V0cy5GaW5kKHBXaWRnZXQpOw0KKyAgICBtX1dpZGdldHMuUmVtb3ZlQXQobkluZGV4LCAxKTsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0hHUklEQ09MUk9XIENGV0xfR3JpZEltcDo6SW5zZXJ0Q29sUm93KEZYX0JPT0wgYkNvbHVtbiwgaW50MzJfdCBuSW5kZXgpIHsNCisgIGlmIChiQ29sdW1uKSB7DQorICAgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+IG1fQ29sdW1ucy5HZXRTaXplKCkpIHsNCisgICAgICBuSW5kZXggPSBtX0NvbHVtbnMuR2V0U2l6ZSgpOw0KKyAgICB9DQorICAgIENGV0xfR3JpZENvbFJvdyogcENvbHVtbiA9IG5ldyBDRldMX0dyaWRDb2xSb3c7DQorICAgIG1fQ29sdW1ucy5JbnNlcnRBdChuSW5kZXgsIHBDb2x1bW4sIDEpOw0KKyAgICByZXR1cm4gKEZXTF9IR1JJRENPTFJPVylwQ29sdW1uOw0KKyAgfQ0KKyAgaWYgKG5JbmRleCA8IDAgfHwgbkluZGV4ID4gbV9Sb3dzLkdldFNpemUoKSkgew0KKyAgICBuSW5kZXggPSBtX1Jvd3MuR2V0U2l6ZSgpOw0KKyAgfQ0KKyAgQ0ZXTF9HcmlkQ29sUm93KiBwUm93ID0gbmV3IENGV0xfR3JpZENvbFJvdzsNCisgIG1fUm93cy5JbnNlcnRBdChuSW5kZXgsIHBSb3csIDEpOw0KKyAgcmV0dXJuIChGV0xfSEdSSURDT0xST1cpcFJvdzsNCit9DQoraW50MzJfdCBDRldMX0dyaWRJbXA6OkNvdW50Q29sUm93cyhGWF9CT09MIGJDb2x1bW4pIHsNCisgIGlmIChiQ29sdW1uKSB7DQorICAgIHJldHVybiBtX0NvbHVtbnMuR2V0U2l6ZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIG1fUm93cy5HZXRTaXplKCk7DQorfQ0KK0ZXTF9IR1JJRENPTFJPVyBDRldMX0dyaWRJbXA6OkdldENvbFJvdyhGWF9CT09MIGJDb2x1bW4sIGludDMyX3QgbkluZGV4KSB7DQorICBpZiAoYkNvbHVtbikgew0KKyAgICBpZiAobkluZGV4IDwgMCB8fCBuSW5kZXggPj0gbV9Db2x1bW5zLkdldFNpemUoKSkgew0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiAoRldMX0hHUklEQ09MUk9XKW1fQ29sdW1uc1tuSW5kZXhdOw0KKyAgfQ0KKyAgaWYgKG5JbmRleCA8IDAgfHwgbkluZGV4ID49IG1fUm93cy5HZXRTaXplKCkpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gKEZXTF9IR1JJRENPTFJPVyltX1Jvd3NbbkluZGV4XTsNCit9DQoraW50MzJfdCBDRldMX0dyaWRJbXA6OkdldEluZGV4KEZXTF9IR1JJRENPTFJPVyBoQ29sUm93KSB7DQorICBpZiAoSXNDb2x1bW4oaENvbFJvdykpIHsNCisgICAgcmV0dXJuIG1fQ29sdW1ucy5GaW5kKGhDb2xSb3cpOw0KKyAgfQ0KKyAgcmV0dXJuIG1fUm93cy5GaW5kKGhDb2xSb3cpOw0KK30NCitGWF9GTE9BVCBDRldMX0dyaWRJbXA6OkdldFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZXTF9HUklEVU5JVCYgZVVuaXQpIHsNCisgIGlmICghaENvbFJvdykNCisgICAgcmV0dXJuIC0xOw0KKyAgQ0ZXTF9HcmlkQ29sUm93KiBwQ29sUm93ID0gcmVpbnRlcnByZXRfY2FzdDxDRldMX0dyaWRDb2xSb3cqPihoQ29sUm93KTsNCisgIGVVbml0ID0gcENvbFJvdy0+bV9TaXplLmVVbml0Ow0KKyAgcmV0dXJuIHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoOw0KK30NCitGV0xfRVJSIENGV0xfR3JpZEltcDo6U2V0U2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRFVOSVQgZVVuaXQpIHsNCisgIGlmICghaENvbFJvdykNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIENGV0xfR3JpZENvbFJvdyogcENvbFJvdyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZXTF9HcmlkQ29sUm93Kj4oaENvbFJvdyk7DQorICBwQ29sUm93LT5tX1NpemUuZVVuaXQgPSBlVW5pdDsNCisgIHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoID0gZlNpemU7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfR3JpZEltcDo6R2V0TWluU2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0dSSURVTklUJiBlVW5pdCkgew0KKyAgaWYgKCFoQ29sUm93KQ0KKyAgICByZXR1cm4gLTE7DQorICBDRldMX0dyaWRDb2xSb3cqIHBDb2xSb3cgPSByZWludGVycHJldF9jYXN0PENGV0xfR3JpZENvbFJvdyo+KGhDb2xSb3cpOw0KKyAgZVVuaXQgPSBwQ29sUm93LT5tX01pblNpemUuZVVuaXQ7DQorICByZXR1cm4gcENvbFJvdy0+bV9NaW5TaXplLmZMZW5ndGg7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9HcmlkSW1wOjpTZXRNaW5TaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklEVU5JVCBlVW5pdCkgew0KKyAgaWYgKCFoQ29sUm93KQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgQ0ZXTF9HcmlkQ29sUm93KiBwQ29sUm93ID0gcmVpbnRlcnByZXRfY2FzdDxDRldMX0dyaWRDb2xSb3cqPihoQ29sUm93KTsNCisgIHBDb2xSb3ctPm1fTWluU2l6ZS5lVW5pdCA9IGVVbml0Ow0KKyAgcENvbFJvdy0+bV9NaW5TaXplLmZMZW5ndGggPSBmU2l6ZTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRkxPQVQgQ0ZXTF9HcmlkSW1wOjpHZXRNYXhTaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRFVOSVQmIGVVbml0KSB7DQorICBpZiAoIWhDb2xSb3cpDQorICAgIHJldHVybiAtMTsNCisgIENGV0xfR3JpZENvbFJvdyogcENvbFJvdyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZXTF9HcmlkQ29sUm93Kj4oaENvbFJvdyk7DQorICBlVW5pdCA9IHBDb2xSb3ctPm1fTWF4U2l6ZS5lVW5pdDsNCisgIHJldHVybiBwQ29sUm93LT5tX01heFNpemUuZkxlbmd0aDsNCit9DQorRldMX0VSUiBDRldMX0dyaWRJbXA6OlNldE1heFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0dSSURVTklUIGVVbml0KSB7DQorICBpZiAoIWhDb2xSb3cpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBDRldMX0dyaWRDb2xSb3cqIHBDb2xSb3cgPSByZWludGVycHJldF9jYXN0PENGV0xfR3JpZENvbFJvdyo+KGhDb2xSb3cpOw0KKyAgcENvbFJvdy0+bV9NYXhTaXplLmVVbml0ID0gZVVuaXQ7DQorICBwQ29sUm93LT5tX01heFNpemUuZkxlbmd0aCA9IGZTaXplOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9CT09MIENGV0xfR3JpZEltcDo6RGVsZXRlQ29sUm93KEZXTF9IR1JJRENPTFJPVyBoQ29sUm93KSB7DQorICBpbnQzMl90IG5JbmRleCA9IG1fQ29sdW1ucy5GaW5kKGhDb2xSb3cpOw0KKyAgaWYgKG5JbmRleCA+PSAwKSB7DQorICAgIG1fQ29sdW1ucy5SZW1vdmVBdChuSW5kZXgpOw0KKyAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxDRldMX0dyaWRDb2xSb3cqPihoQ29sUm93KTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBuSW5kZXggPSBtX1Jvd3MuRmluZChoQ29sUm93KTsNCisgIGlmIChuSW5kZXggPj0gMCkgew0KKyAgICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxDRldMX0dyaWRDb2xSb3cqPihoQ29sUm93KTsNCisgICAgbV9Sb3dzLlJlbW92ZUF0KG5JbmRleCk7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENGV0xfR3JpZEltcDo6SXNDb2x1bW4oRldMX0hHUklEQ09MUk9XIGhDb2xSb3cpIHsNCisgIHJldHVybiBtX0NvbHVtbnMuRmluZChoQ29sUm93KSAhPSAtMTsNCit9DQoraW50MzJfdCBDRldMX0dyaWRJbXA6OkdldFdpZGdldFBvcyhJRldMX1dpZGdldCogcFdpZGdldCwgRlhfQk9PTCBiQ29sdW1uKSB7DQorICBDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbyA9DQorICAgICAgc3RhdGljX2Nhc3Q8Q0ZXTF9HcmlkV2lkZ2V0SW5mbyo+KEdldFdpZGdldEluZm8ocFdpZGdldCkpOw0KKyAgaWYgKHBJbmZvKSB7DQorICAgIHJldHVybiBiQ29sdW1uID8gcEluZm8tPm1faUNvbHVtbiA6IHBJbmZvLT5tX2lSb3c7DQorICB9DQorICByZXR1cm4gLTE7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9HcmlkSW1wOjpTZXRXaWRnZXRQb3MoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDb2x1bW4pIHsNCisgIENGV0xfR3JpZFdpZGdldEluZm8qIHBJbmZvID0NCisgICAgICBzdGF0aWNfY2FzdDxDRldMX0dyaWRXaWRnZXRJbmZvKj4oR2V0V2lkZ2V0SW5mbyhwV2lkZ2V0KSk7DQorICBpZiAocEluZm8pIHsNCisgICAgYkNvbHVtbiA/IHBJbmZvLT5tX2lDb2x1bW4gPSBpUG9zIDogcEluZm8tPm1faVJvdyA9IGlQb3M7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK2ludDMyX3QgQ0ZXTF9HcmlkSW1wOjpHZXRXaWRnZXRTcGFuKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9CT09MIGJDb2x1bW4pIHsNCisgIENGV0xfR3JpZFdpZGdldEluZm8qIHBJbmZvID0NCisgICAgICBzdGF0aWNfY2FzdDxDRldMX0dyaWRXaWRnZXRJbmZvKj4oR2V0V2lkZ2V0SW5mbyhwV2lkZ2V0KSk7DQorICBpZiAocEluZm8pIHsNCisgICAgcmV0dXJuIGJDb2x1bW4gPyBwSW5mby0+bV9pQ29sdW1uU3BhbiA6IHBJbmZvLT5tX2lSb3dTcGFuOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9HcmlkSW1wOjpTZXRXaWRnZXRTcGFuKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVNwYW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ29sdW1uKSB7DQorICBDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbyA9DQorICAgICAgc3RhdGljX2Nhc3Q8Q0ZXTF9HcmlkV2lkZ2V0SW5mbyo+KEdldFdpZGdldEluZm8ocFdpZGdldCkpOw0KKyAgaWYgKHBJbmZvKSB7DQorICAgIGJDb2x1bW4gPyBwSW5mby0+bV9pQ29sdW1uU3BhbiA9IGlTcGFuIDogcEluZm8tPm1faVJvd1NwYW4gPSBpU3BhbjsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRkxPQVQgQ0ZXTF9HcmlkSW1wOjpHZXRXaWRnZXRTaXplKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRFNJWkUgZVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklEVU5JVCYgZVVuaXQpIHsNCisgIENGV0xfR3JpZFdpZGdldEluZm8qIHBJbmZvID0NCisgICAgICBzdGF0aWNfY2FzdDxDRldMX0dyaWRXaWRnZXRJbmZvKj4oR2V0V2lkZ2V0SW5mbyhwV2lkZ2V0KSk7DQorICBpZiAocEluZm8pIHsNCisgICAgZVVuaXQgPSBwSW5mby0+bV9TaXplW2VTaXplXS5lVW5pdDsNCisgICAgcmV0dXJuIHBJbmZvLT5tX1NpemVbZVNpemVdLmZMZW5ndGg7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorRldMX0VSUiBDRldMX0dyaWRJbXA6OlNldFdpZGdldFNpemUoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0dSSURTSVpFIGVTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklEVU5JVCBlVWl0KSB7DQorICBDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbyA9DQorICAgICAgc3RhdGljX2Nhc3Q8Q0ZXTF9HcmlkV2lkZ2V0SW5mbyo+KEdldFdpZGdldEluZm8ocFdpZGdldCkpOw0KKyAgaWYgKHBJbmZvKSB7DQorICAgIHBJbmZvLT5tX1NpemVbZVNpemVdLmZMZW5ndGggPSBmU2l6ZTsNCisgICAgcEluZm8tPm1fU2l6ZVtlU2l6ZV0uZVVuaXQgPSBlVWl0Ow0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9CT09MIENGV0xfR3JpZEltcDo6R2V0V2lkZ2V0TWFyZ2luKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0dSSURNQVJHSU4gZU1hcmdpbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmTWFyZ2luKSB7DQorICBDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbyA9DQorICAgICAgc3RhdGljX2Nhc3Q8Q0ZXTF9HcmlkV2lkZ2V0SW5mbyo+KEdldFdpZGdldEluZm8ocFdpZGdldCkpOw0KKyAgaWYgKHBJbmZvKSB7DQorICAgIGZNYXJnaW4gPSBwSW5mby0+bV9NYXJnaW5bZU1hcmdpbl07DQorICAgIHJldHVybiAocEluZm8tPm1fZHdNYXJnaW5GbGFnICYgKDEgPDwgZU1hcmdpbikpICE9IDA7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9HcmlkSW1wOjpTZXRXaWRnZXRNYXJnaW4oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRE1BUkdJTiBlTWFyZ2luLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1hcmdpbikgew0KKyAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyogcEluZm8gPQ0KKyAgICAgIHN0YXRpY19jYXN0PENGV0xfR3JpZFdpZGdldEluZm8qPihHZXRXaWRnZXRJbmZvKHBXaWRnZXQpKTsNCisgIGlmIChwSW5mbykgew0KKyAgICBwSW5mby0+bV9NYXJnaW5bZU1hcmdpbl0gPSBmTWFyZ2luOw0KKyAgICBwSW5mby0+bV9kd01hcmdpbkZsYWcgfD0gKDEgPDwgZU1hcmdpbik7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9HcmlkSW1wOjpSZW1vdmVXaWRnZXRNYXJnaW4oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRE1BUkdJTiBlTWFyZ2luKSB7DQorICBDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbyA9DQorICAgICAgc3RhdGljX2Nhc3Q8Q0ZXTF9HcmlkV2lkZ2V0SW5mbyo+KEdldFdpZGdldEluZm8ocFdpZGdldCkpOw0KKyAgaWYgKHBJbmZvKSB7DQorICAgIHBJbmZvLT5tX2R3TWFyZ2luRmxhZyAmPSB+KDEgPDwgZU1hcmdpbik7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfR3JpZEltcDo6R2V0R3JpZFNpemUoRldMX0dSSURTSVpFIGVTaXplLCBGV0xfR1JJRFVOSVQmIGVVbml0KSB7DQorICBlVW5pdCA9IG1fU2l6ZVtlU2l6ZV0uZVVuaXQ7DQorICByZXR1cm4gbV9TaXplW2VTaXplXS5mTGVuZ3RoOw0KK30NCitGV0xfRVJSIENGV0xfR3JpZEltcDo6U2V0R3JpZFNpemUoRldMX0dSSURTSVpFIGVTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0dSSURVTklUIGVVaXQpIHsNCisgIG1fU2l6ZVtlU2l6ZV0uZkxlbmd0aCA9IGZTaXplOw0KKyAgbV9TaXplW2VTaXplXS5lVW5pdCA9IGVVaXQ7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0NGV0xfR3JpZFdpZGdldEluZm8qIENGV0xfR3JpZEltcDo6R2V0V2lkZ2V0SW5mbyhJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfR3JpZFdpZGdldEluZm8qPihtX21hcFdpZGdldEluZm8uR2V0VmFsdWVBdChwV2lkZ2V0KSk7DQorfQ0KK3ZvaWQgQ0ZXTF9HcmlkSW1wOjpQcm9jRml4ZWRDb2xSb3coQ0ZXTF9HcmlkQ29sUm93KiBwQ29sUm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29sUm93U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNvbHVtbikgew0KKyAgcENvbFJvdy0+bV9mQWN0dWFsU2l6ZSA9IGZDb2xSb3dTaXplOw0KKyAgRlhfUE9TSVRJT04gcHMgPSBtX21hcFdpZGdldEluZm8uR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBzKSB7DQorICAgIHZvaWQqIGtleSA9IG51bGxwdHI7DQorICAgIHZvaWQqIHZhbHVlID0gbnVsbHB0cjsNCisgICAgbV9tYXBXaWRnZXRJbmZvLkdldE5leHRBc3NvYyhwcywga2V5LCB2YWx1ZSk7DQorICAgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0ID0gc3RhdGljX2Nhc3Q8SUZXTF9XaWRnZXQqPihrZXkpOw0KKyAgICBDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbyA9IHN0YXRpY19jYXN0PENGV0xfR3JpZFdpZGdldEluZm8qPih2YWx1ZSk7DQorICAgIGlmIChiQ29sdW1uKSB7DQorICAgICAgaWYgKHBJbmZvLT5tX2lDb2x1bW4gPT0gbkluZGV4ICYmIHBJbmZvLT5tX2lDb2x1bW5TcGFuID09IDEpIHsNCisgICAgICAgIENhbGNXaWRnZXRXaWR0aChwV2lkZ2V0LCBwSW5mbywgcENvbFJvdy0+bV9mQWN0dWFsU2l6ZSk7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChwSW5mby0+bV9pUm93ID09IG5JbmRleCAmJiBwSW5mby0+bV9pUm93U3BhbiA9PSAxKSB7DQorICAgICAgICBDYWxjV2lkZ2V0SGVpZ3QocFdpZGdldCwgcEluZm8sIHBDb2xSb3ctPm1fZkFjdHVhbFNpemUpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENGV0xfR3JpZEltcDo6UHJvY0F1dG9Db2xSb3coQ0ZXTF9HcmlkQ29sUm93KiBwQ29sUm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ29sdW1uKSB7DQorICBpZiAoIXBDb2xSb3cpDQorICAgIHJldHVybjsNCisgIEZYX0ZMT0FUIGZNYXhTaXplID0gMCwgZldpZGdldFNpemUgPSAwOw0KKyAgRlhfUE9TSVRJT04gcHMgPSBtX21hcFdpZGdldEluZm8uR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBzKSB7DQorICAgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0ID0gTlVMTDsNCisgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyogcEluZm8gPSBOVUxMOw0KKyAgICBtX21hcFdpZGdldEluZm8uR2V0TmV4dEFzc29jKHBzLCAodm9pZComKXBXaWRnZXQsICh2b2lkKiYpcEluZm8pOw0KKyAgICBpZiAoIXBXaWRnZXQgfHwgIXBJbmZvKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKGJDb2x1bW4pIHsNCisgICAgICBpZiAocEluZm8tPm1faUNvbHVtbiAhPSBuSW5kZXggfHwgcEluZm8tPm1faUNvbHVtblNwYW4gIT0gMSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGZXaWRnZXRTaXplID0gQ2FsY0F1dG9Db2x1bW5XaWRnZXRXaWR0aChwV2lkZ2V0LCBwSW5mbyk7DQorICAgICAgaWYgKGZNYXhTaXplIDwgZldpZGdldFNpemUpIHsNCisgICAgICAgIGZNYXhTaXplID0gZldpZGdldFNpemU7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChwSW5mby0+bV9pUm93ICE9IG5JbmRleCB8fCBwSW5mby0+bV9pUm93U3BhbiAhPSAxKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgZldpZGdldFNpemUgPSBDYWxjQXV0b0NvbHVtbldpZGdldEhlaWdodChwV2lkZ2V0LCBwSW5mbyk7DQorICAgICAgaWYgKGZNYXhTaXplIDwgZldpZGdldFNpemUpIHsNCisgICAgICAgIGZNYXhTaXplID0gZldpZGdldFNpemU7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBTZXRDb2xSb3dBY3R1YWxTaXplKHBDb2xSb3csIGZNYXhTaXplKTsNCit9DQordm9pZCBDRldMX0dyaWRJbXA6OlByb2NTY2FsZWRDb2xSb3coQ0ZXTF9HcmlkQ29sUm93KiBwQ29sUm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb2xSb3dTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNvbHVtbikgew0KKyAgaWYgKGZDb2xSb3dTaXplID4gMCkgew0KKyAgICBQcm9jRml4ZWRDb2xSb3cocENvbFJvdywgbkluZGV4LCBmQ29sUm93U2l6ZSwgYkNvbHVtbik7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9HcmlkSW1wOjpDYWxjV2lkZ2V0V2lkdGgoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb2x1bm1XaWR0aCkgew0KKyAgaWYgKHBJbmZvLT5tX1NpemVbRldMX0dSSURTSVpFX1dpZHRoXS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfRml4ZWQpIHsNCisgICAgU2V0V2lkZ2V0QWN0dWFsV2lkdGgocEluZm8sIHBJbmZvLT5tX1NpemVbRldMX0dSSURTSVpFX1dpZHRoXS5mTGVuZ3RoKTsNCisgIH0gZWxzZSB7DQorICAgIEZYX0ZMT0FUIGZXaWR0aCA9IDA7DQorICAgIEZYX0ZMT0FUIGZMZWZ0TWFyZ2luID0gMCwgZlJpZ2h0TWFyZ2luID0gMDsNCisgICAgRlhfQk9PTCBiTGVmdE1hcmdpbiA9DQorICAgICAgICBHZXRXaWRnZXRNYXJnaW4ocFdpZGdldCwgRldMX0dSSURNQVJHSU5fTGVmdCwgZkxlZnRNYXJnaW4pOw0KKyAgICBGWF9CT09MIGJSaWdodE1hcmdpbiA9DQorICAgICAgICBHZXRXaWRnZXRNYXJnaW4ocFdpZGdldCwgRldMX0dSSURNQVJHSU5fUmlnaHQsIGZSaWdodE1hcmdpbik7DQorICAgIGlmIChiTGVmdE1hcmdpbiAmJiBiUmlnaHRNYXJnaW4pIHsNCisgICAgICBmV2lkdGggPSBmQ29sdW5tV2lkdGggLSBmTGVmdE1hcmdpbiAtIGZSaWdodE1hcmdpbjsNCisgICAgfSBlbHNlIHsNCisgICAgICBDRlhfUmVjdEYgcnRBdXRvOw0KKyAgICAgIHBXaWRnZXQtPkdldFdpZGdldFJlY3QocnRBdXRvLCBUUlVFKTsNCisgICAgICBmV2lkdGggPSBydEF1dG8uV2lkdGgoKTsNCisgICAgfQ0KKyAgICBTZXRXaWRnZXRBY3R1YWxXaWR0aChwSW5mbywgZldpZHRoKTsNCisgIH0NCit9DQordm9pZCBDRldMX0dyaWRJbXA6OkNhbGNXaWRnZXRIZWlndChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGV0xfR3JpZFdpZGdldEluZm8qIHBJbmZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlJvd0hlaWd0KSB7DQorICBpZiAocEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfSGVpZ2h0XS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfRml4ZWQpIHsNCisgICAgU2V0V2lkZ2V0QWN0dWFsSGVpZ2h0KHBJbmZvLCBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9IZWlnaHRdLmZMZW5ndGgpOw0KKyAgfSBlbHNlIHsNCisgICAgRlhfRkxPQVQgZkhlaWdodCA9IDA7DQorICAgIEZYX0ZMT0FUIGZUb3BNYXJnaW4gPSAwLCBmQm90dG9tTWFyZ2luID0gMDsNCisgICAgRlhfQk9PTCBiVG9wTWFyZ2luID0NCisgICAgICAgIEdldFdpZGdldE1hcmdpbihwV2lkZ2V0LCBGV0xfR1JJRE1BUkdJTl9Ub3AsIGZUb3BNYXJnaW4pOw0KKyAgICBGWF9CT09MIGJCb3R0b21NYXJnaW4gPQ0KKyAgICAgICAgR2V0V2lkZ2V0TWFyZ2luKHBXaWRnZXQsIEZXTF9HUklETUFSR0lOX0JvdHRvbSwgZkJvdHRvbU1hcmdpbik7DQorICAgIGlmIChiVG9wTWFyZ2luICYmIGJCb3R0b21NYXJnaW4pIHsNCisgICAgICBmSGVpZ2h0ID0gZlJvd0hlaWd0IC0gZlRvcE1hcmdpbiAtIGZCb3R0b21NYXJnaW47DQorICAgIH0gZWxzZSB7DQorICAgICAgQ0ZYX1JlY3RGIHJ0QXV0bzsNCisgICAgICBwV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0QXV0bywgVFJVRSk7DQorICAgICAgZkhlaWdodCA9IHJ0QXV0by5IZWlnaHQoKTsNCisgICAgfQ0KKyAgICBTZXRXaWRnZXRBY3R1YWxIZWlnaHQocEluZm8sIGZIZWlnaHQpOw0KKyAgfQ0KK30NCitGWF9GTE9BVCBDRldMX0dyaWRJbXA6OkNhbGNBdXRvQ29sdW1uV2lkZ2V0V2lkdGgoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGV0xfR3JpZFdpZGdldEluZm8qIHBJbmZvKSB7DQorICBGWF9GTE9BVCBmTGVmdE1hcmdpbiA9IDAsIGZSaWdodE1hcmdpbiA9IDA7DQorICBGWF9CT09MIGJMZWZ0TWFyZ2luID0NCisgICAgICBHZXRXaWRnZXRNYXJnaW4ocFdpZGdldCwgRldMX0dSSURNQVJHSU5fTGVmdCwgZkxlZnRNYXJnaW4pOw0KKyAgRlhfQk9PTCBiUmlnaHRNYXJnaW4gPQ0KKyAgICAgIEdldFdpZGdldE1hcmdpbihwV2lkZ2V0LCBGV0xfR1JJRE1BUkdJTl9SaWdodCwgZlJpZ2h0TWFyZ2luKTsNCisgIGlmIChwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9XaWR0aF0uZVVuaXQgPT0gRldMX0dSSURVTklUX0ZpeGVkKSB7DQorICAgIFNldFdpZGdldEFjdHVhbFdpZHRoKHBJbmZvLCBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9XaWR0aF0uZkxlbmd0aCk7DQorICB9IGVsc2Ugew0KKyAgICBDRlhfUmVjdEYgcnRBdXRvOw0KKyAgICBwV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0QXV0bywgVFJVRSk7DQorICAgIEZYX0ZMT0FUIGZXaWR0aCA9IHJ0QXV0by53aWR0aDsNCisgICAgU2V0V2lkZ2V0QWN0dWFsV2lkdGgocEluZm8sIGZXaWR0aCk7DQorICB9DQorICBGWF9GTE9BVCBmVG90YWwgPSBwSW5mby0+bV9mQWN0dWFsV2lkdGg7DQorICBpZiAoYkxlZnRNYXJnaW4pIHsNCisgICAgZlRvdGFsICs9IGZMZWZ0TWFyZ2luOw0KKyAgfQ0KKyAgaWYgKGJSaWdodE1hcmdpbikgew0KKyAgICBmVG90YWwgKz0gZlJpZ2h0TWFyZ2luOw0KKyAgfQ0KKyAgcmV0dXJuIGZUb3RhbDsNCit9DQorRlhfRkxPQVQgQ0ZXTF9HcmlkSW1wOjpDYWxjQXV0b0NvbHVtbldpZGdldEhlaWdodChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGV0xfR3JpZFdpZGdldEluZm8qIHBJbmZvKSB7DQorICBGWF9GTE9BVCBmVG9wTWFyZ2luID0gMCwgZkJvdHRvbU1hcmdpbiA9IDA7DQorICBGWF9CT09MIGJUb3BNYXJnaW4gPSBHZXRXaWRnZXRNYXJnaW4ocFdpZGdldCwgRldMX0dSSURNQVJHSU5fVG9wLCBmVG9wTWFyZ2luKTsNCisgIEZYX0JPT0wgYkJvdHRvbU1hcmdpbiA9DQorICAgICAgR2V0V2lkZ2V0TWFyZ2luKHBXaWRnZXQsIEZXTF9HUklETUFSR0lOX0JvdHRvbSwgZkJvdHRvbU1hcmdpbik7DQorICBpZiAocEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfSGVpZ2h0XS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfRml4ZWQpIHsNCisgICAgU2V0V2lkZ2V0QWN0dWFsSGVpZ2h0KHBJbmZvLCBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9IZWlnaHRdLmZMZW5ndGgpOw0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX1JlY3RGIHJ0QXV0bzsNCisgICAgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydEF1dG8sIFRSVUUpOw0KKyAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gcnRBdXRvLmhlaWdodDsNCisgICAgU2V0V2lkZ2V0QWN0dWFsSGVpZ2h0KHBJbmZvLCBmSGVpZ2h0KTsNCisgIH0NCisgIEZYX0ZMT0FUIGZUb3RhbCA9IHBJbmZvLT5tX2ZBY3R1YWxIZWlnaHQ7DQorICBpZiAoYlRvcE1hcmdpbikgew0KKyAgICBmVG90YWwgKz0gZlRvcE1hcmdpbjsNCisgIH0NCisgIGlmIChiQm90dG9tTWFyZ2luKSB7DQorICAgIGZUb3RhbCArPSBmQm90dG9tTWFyZ2luOw0KKyAgfQ0KKyAgcmV0dXJuIGZUb3RhbDsNCit9DQorRlhfRkxPQVQgQ0ZXTF9HcmlkSW1wOjpQcm9jZXNzQ29sdW1ucyhGWF9GTE9BVCBmV2lkdGgpIHsNCisgIGlmIChmV2lkdGggPD0gMCkgew0KKyAgICByZXR1cm4gUHJvY2Vzc1VuQ2VydGFpbkNvbHVtbnMoKTsNCisgIH0NCisgIGludDMyX3QgaUNvbHVtbnMgPSBtX0NvbHVtbnMuR2V0U2l6ZSgpOw0KKyAgaWYgKGlDb2x1bW5zIDwgMSkgew0KKyAgICByZXR1cm4gZldpZHRoOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZkZpeGVkV2lkdGggPSAwOw0KKyAgRlhfRkxPQVQgZkF1dG9XaWR0aCA9IDA7DQorICBDRlhfUHRyQXJyYXkgYXV0b0NvbHVtbnM7DQorICBDRlhfUHRyQXJyYXkgc2NhbGVkQ29sdW1uczsNCisgIEZYX0ZMT0FUIGZTY2FsZWRDb2x1bW5OdW0gPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvbHVtbnM7IGkrKykgew0KKyAgICBDRldMX0dyaWRDb2xSb3cqIHBDb2xSb3cgPSBzdGF0aWNfY2FzdDxDRldMX0dyaWRDb2xSb3cqPihtX0NvbHVtbnNbaV0pOw0KKyAgICBpZiAoIXBDb2xSb3cpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBzd2l0Y2ggKHBDb2xSb3ctPm1fU2l6ZS5lVW5pdCkgew0KKyAgICAgIGNhc2UgRldMX0dSSURVTklUX0ZpeGVkOiB7DQorICAgICAgICBTZXRDb2xSb3dBY3R1YWxTaXplKHBDb2xSb3csIHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoKTsNCisgICAgICAgIGZGaXhlZFdpZHRoICs9IHBDb2xSb3ctPm1fZkFjdHVhbFNpemU7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2FzZSBGV0xfR1JJRFVOSVRfQXV0bzogew0KKyAgICAgICAgUHJvY0F1dG9Db2xSb3cocENvbFJvdywgaSwgVFJVRSk7DQorICAgICAgICBhdXRvQ29sdW1ucy5BZGQocENvbFJvdyk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2FzZSBGV0xfR1JJRFVOSVRfU2NhbGVkOg0KKyAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgIGZTY2FsZWRDb2x1bW5OdW0gKz0gcENvbFJvdy0+bV9TaXplLmZMZW5ndGg7DQorICAgICAgICBzY2FsZWRDb2x1bW5zLkFkZChwQ29sUm93KTsNCisgICAgICAgIFNldENvbFJvd0FjdHVhbFNpemUocENvbFJvdywgMCk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwV2lkZ2V0SW5mby5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocHMpIHsNCisgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQgPSBOVUxMOw0KKyAgICBDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbyA9IE5VTEw7DQorICAgIG1fbWFwV2lkZ2V0SW5mby5HZXROZXh0QXNzb2MocHMsICh2b2lkKiYpcFdpZGdldCwgKHZvaWQqJilwSW5mbyk7DQorICAgIGlmICghcEluZm8gfHwgcEluZm8tPm1faUNvbHVtblNwYW4gPCAyKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgQ0ZYX1B0ckFycmF5IHNwYW5BdXRvQ29sdW1uczsNCisgICAgRlhfRkxPQVQgZlNwYW5TaXplID0gMDsNCisgICAgaW50MzJfdCBpQXV0b0NvbFJvd3MgPSAwOw0KKyAgICBpbnQzMl90IGlTY2FsZWRDb2xSb3dzID0gMDsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcEluZm8tPm1faUNvbHVtblNwYW47IGkrKykgew0KKyAgICAgIENGV0xfR3JpZENvbFJvdyogcENvbHVtbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZXTF9HcmlkQ29sUm93Kj4oDQorICAgICAgICAgIEdldENvbFJvdyhUUlVFLCBwSW5mby0+bV9pQ29sdW1uICsgaSkpOw0KKyAgICAgIGlmICghcENvbHVtbikgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGZTcGFuU2l6ZSArPSBwQ29sdW1uLT5tX2ZBY3R1YWxTaXplOw0KKyAgICAgIGlmIChwQ29sdW1uLT5tX1NpemUuZVVuaXQgPT0gRldMX0dSSURVTklUX0F1dG8pIHsNCisgICAgICAgIGlBdXRvQ29sUm93cysrOw0KKyAgICAgICAgc3BhbkF1dG9Db2x1bW5zLkFkZChwQ29sdW1uKTsNCisgICAgICB9IGVsc2UgaWYgKHBDb2x1bW4tPm1fU2l6ZS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfU2NhbGVkKSB7DQorICAgICAgICBpU2NhbGVkQ29sUm93cysrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoaUF1dG9Db2xSb3dzIDwgMSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZXaWRnZXRXaWR0aCA9IENhbGNBdXRvQ29sdW1uV2lkZ2V0V2lkdGgocFdpZGdldCwgcEluZm8pOw0KKyAgICBpZiAoZldpZGdldFdpZHRoID4gZlNwYW5TaXplKSB7DQorICAgICAgaWYgKGlTY2FsZWRDb2xSb3dzID4gMCkgew0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBTZXRTcGFuQXV0b0NvbFJvd1NpemUoc3BhbkF1dG9Db2x1bW5zLCBmV2lkZ2V0V2lkdGggLSBmU3BhblNpemUpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBpQXV0b0NvbHMgPSBhdXRvQ29sdW1ucy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBpQXV0b0NvbHM7IGsrKykgew0KKyAgICBmQXV0b1dpZHRoICs9IHN0YXRpY19jYXN0PENGV0xfR3JpZENvbFJvdyo+KGF1dG9Db2x1bW5zW2tdKS0+bV9mQWN0dWFsU2l6ZTsNCisgIH0NCisgIEZYX0ZMT0FUIGZTY2FsZWRXaWR0aCA9IGZXaWR0aCAtIGZGaXhlZFdpZHRoIC0gZkF1dG9XaWR0aDsNCisgIGlmIChmU2NhbGVkV2lkdGggPiAwICYmIGZTY2FsZWRDb2x1bW5OdW0gPiAwKSB7DQorICAgIFNldFNjYWxlZENvbFJvd3NTaXplKHNjYWxlZENvbHVtbnMsIGZTY2FsZWRXaWR0aCwgZlNjYWxlZENvbHVtbk51bSk7DQorICB9DQorICByZXR1cm4gZldpZHRoOw0KK30NCitGWF9GTE9BVCBDRldMX0dyaWRJbXA6OlByb2Nlc3NSb3dzKEZYX0ZMT0FUIGZIZWlnaHQpIHsNCisgIGlmIChmSGVpZ2h0IDw9IDApIHsNCisgICAgcmV0dXJuIFByb2Nlc3NVbkNlcnRhaW5Sb3dzKCk7DQorICB9DQorICBpbnQzMl90IGlSb3dzID0gbV9Sb3dzLkdldFNpemUoKTsNCisgIGlmIChpUm93cyA8IDEpIHsNCisgICAgcmV0dXJuIGZIZWlnaHQ7DQorICB9DQorICBGWF9GTE9BVCBmRml4ZWRIZWlnaHQgPSAwOw0KKyAgRlhfRkxPQVQgZkF1dG9IZWlndCA9IDA7DQorICBDRlhfUHRyQXJyYXkgYXV0b1Jvd3M7DQorICBDRlhfUHRyQXJyYXkgc2NhbGVkUm93czsNCisgIEZYX0ZMT0FUIGZTY2FsZWRSb3dOdW0gPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVJvd3M7IGkrKykgew0KKyAgICBDRldMX0dyaWRDb2xSb3cqIHBDb2xSb3cgPSBzdGF0aWNfY2FzdDxDRldMX0dyaWRDb2xSb3cqPihtX1Jvd3NbaV0pOw0KKyAgICBpZiAoIXBDb2xSb3cpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBzd2l0Y2ggKHBDb2xSb3ctPm1fU2l6ZS5lVW5pdCkgew0KKyAgICAgIGNhc2UgRldMX0dSSURVTklUX0ZpeGVkOiB7DQorICAgICAgICBTZXRDb2xSb3dBY3R1YWxTaXplKHBDb2xSb3csIHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoKTsNCisgICAgICAgIGZGaXhlZEhlaWdodCArPSBwQ29sUm93LT5tX2ZBY3R1YWxTaXplOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgRldMX0dSSURVTklUX0F1dG86IHsNCisgICAgICAgIFByb2NBdXRvQ29sUm93KHBDb2xSb3csIGksIEZBTFNFKTsNCisgICAgICAgIGF1dG9Sb3dzLkFkZChwQ29sUm93KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIEZXTF9HUklEVU5JVF9TY2FsZWQ6DQorICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgZlNjYWxlZFJvd051bSArPSBwQ29sUm93LT5tX1NpemUuZkxlbmd0aDsNCisgICAgICAgIHNjYWxlZFJvd3MuQWRkKHBDb2xSb3cpOw0KKyAgICAgICAgU2V0Q29sUm93QWN0dWFsU2l6ZShwQ29sUm93LCAwKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgRlhfUE9TSVRJT04gcHMgPSBtX21hcFdpZGdldEluZm8uR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBzKSB7DQorICAgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0ID0gTlVMTDsNCisgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyogcEluZm8gPSBOVUxMOw0KKyAgICBtX21hcFdpZGdldEluZm8uR2V0TmV4dEFzc29jKHBzLCAodm9pZComKXBXaWRnZXQsICh2b2lkKiYpcEluZm8pOw0KKyAgICBpZiAoIXBJbmZvIHx8IHBJbmZvLT5tX2lSb3dTcGFuIDwgMikgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIENGWF9QdHJBcnJheSBzcGFuQXV0b1Jvd3M7DQorICAgIEZYX0ZMT0FUIGZTcGFuU2l6ZSA9IDA7DQorICAgIGludDMyX3QgaUF1dG9Db2xSb3dzID0gMDsNCisgICAgaW50MzJfdCBpU2NhbGVkQ29sUm93cyA9IDA7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHBJbmZvLT5tX2lSb3dTcGFuOyBpKyspIHsNCisgICAgICBDRldMX0dyaWRDb2xSb3cqIHBSb3cgPSByZWludGVycHJldF9jYXN0PENGV0xfR3JpZENvbFJvdyo+KA0KKyAgICAgICAgICBHZXRDb2xSb3coRkFMU0UsIHBJbmZvLT5tX2lSb3cgKyBpKSk7DQorICAgICAgaWYgKCFwUm93KSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgZlNwYW5TaXplICs9IHBSb3ctPm1fZkFjdHVhbFNpemU7DQorICAgICAgaWYgKHBSb3ctPm1fU2l6ZS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfQXV0bykgew0KKyAgICAgICAgaUF1dG9Db2xSb3dzKys7DQorICAgICAgICBzcGFuQXV0b1Jvd3MuQWRkKHBSb3cpOw0KKyAgICAgIH0gZWxzZSBpZiAocFJvdy0+bV9TaXplLmVVbml0ID09IEZXTF9HUklEVU5JVF9TY2FsZWQpIHsNCisgICAgICAgIGlTY2FsZWRDb2xSb3dzKys7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChpQXV0b0NvbFJvd3MgPCAxKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZldpZGdldEhlaWdodCA9IENhbGNBdXRvQ29sdW1uV2lkZ2V0SGVpZ2h0KHBXaWRnZXQsIHBJbmZvKTsNCisgICAgaWYgKGZXaWRnZXRIZWlnaHQgPiBmU3BhblNpemUpIHsNCisgICAgICBpZiAoaVNjYWxlZENvbFJvd3MgPiAwKSB7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIFNldFNwYW5BdXRvQ29sUm93U2l6ZShzcGFuQXV0b1Jvd3MsIGZXaWRnZXRIZWlnaHQgLSBmU3BhblNpemUpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBpQXV0b1Jvd3MgPSBhdXRvUm93cy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBpQXV0b1Jvd3M7IGsrKykgew0KKyAgICBmQXV0b0hlaWd0ICs9DQorICAgICAgICByZWludGVycHJldF9jYXN0PENGV0xfR3JpZENvbFJvdyo+KGF1dG9Sb3dzW2tdKS0+bV9mQWN0dWFsU2l6ZTsNCisgIH0NCisgIEZYX0ZMT0FUIGZTY2FsZWRIZWlnaHQgPSBmSGVpZ2h0IC0gZkZpeGVkSGVpZ2h0IC0gZkF1dG9IZWlndDsNCisgIGlmIChmU2NhbGVkSGVpZ2h0ID4gMCAmJiBmU2NhbGVkUm93TnVtID4gMCkgew0KKyAgICBTZXRTY2FsZWRDb2xSb3dzU2l6ZShzY2FsZWRSb3dzLCBmU2NhbGVkSGVpZ2h0LCBmU2NhbGVkUm93TnVtKTsNCisgIH0NCisgIHJldHVybiBmSGVpZ2h0Ow0KK30NCitGWF9GTE9BVCBDRldMX0dyaWRJbXA6OlByb2Nlc3NVbkNlcnRhaW5Db2x1bW5zKCkgew0KKyAgaW50MzJfdCBpQ29sdW1ucyA9IG1fQ29sdW1ucy5HZXRTaXplKCk7DQorICBpZiAoaUNvbHVtbnMgPCAxKSB7DQorICAgIENGV0xfR3JpZENvbFJvdyogcENvbFJvdyA9IG5ldyBDRldMX0dyaWRDb2xSb3c7DQorICAgIHBDb2xSb3ctPm1fU2l6ZS5lVW5pdCA9IEZXTF9HUklEVU5JVF9BdXRvOw0KKyAgICBQcm9jQXV0b0NvbFJvdyhwQ29sUm93LCAwLCBUUlVFKTsNCisgICAgRlhfRkxPQVQgZldpZHRoID0gcENvbFJvdy0+bV9mQWN0dWFsU2l6ZTsNCisgICAgZGVsZXRlIHBDb2xSb3c7DQorICAgIHJldHVybiBmV2lkdGg7DQorICB9DQorICBGWF9GTE9BVCBmRml4ZWRXaWR0aCA9IDA7DQorICBDRlhfUHRyQXJyYXkgYXV0b0NvbHVtbnM7DQorICBDRlhfUHRyQXJyYXkgc2NhbGVkQ29sdW1uczsNCisgIEZYX0ZMT0FUIGZTY2FsZWRDb2x1bW5OdW0gPSAwOw0KKyAgRlhfRkxPQVQgZlNjYWxlZE1heFBlcldpZHRoID0gMDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb2x1bW5zOyBpKyspIHsNCisgICAgQ0ZXTF9HcmlkQ29sUm93KiBwQ29sUm93ID0gcmVpbnRlcnByZXRfY2FzdDxDRldMX0dyaWRDb2xSb3cqPihtX0NvbHVtbnNbaV0pOw0KKyAgICBpZiAoIXBDb2xSb3cpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBzd2l0Y2ggKHBDb2xSb3ctPm1fU2l6ZS5lVW5pdCkgew0KKyAgICAgIGNhc2UgRldMX0dSSURVTklUX0ZpeGVkOiB7DQorICAgICAgICBTZXRDb2xSb3dBY3R1YWxTaXplKHBDb2xSb3csIHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoKTsNCisgICAgICAgIGZGaXhlZFdpZHRoICs9IHBDb2xSb3ctPm1fZkFjdHVhbFNpemU7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2FzZSBGV0xfR1JJRFVOSVRfQXV0bzogew0KKyAgICAgICAgUHJvY0F1dG9Db2xSb3cocENvbFJvdywgaSwgVFJVRSk7DQorICAgICAgICBhdXRvQ29sdW1ucy5BZGQocENvbFJvdyk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2FzZSBGV0xfR1JJRFVOSVRfU2NhbGVkOg0KKyAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgIFByb2NBdXRvQ29sUm93KHBDb2xSb3csIGksIFRSVUUpOw0KKyAgICAgICAgZlNjYWxlZENvbHVtbk51bSArPSBwQ29sUm93LT5tX1NpemUuZkxlbmd0aDsNCisgICAgICAgIHNjYWxlZENvbHVtbnMuQWRkKHBDb2xSb3cpOw0KKyAgICAgICAgaWYgKHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoIDw9IDApIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBGWF9GTE9BVCBmUGVyV2lkdGggPSBwQ29sUm93LT5tX2ZBY3R1YWxTaXplIC8gcENvbFJvdy0+bV9TaXplLmZMZW5ndGg7DQorICAgICAgICBpZiAoZlBlcldpZHRoID4gZlNjYWxlZE1heFBlcldpZHRoKSB7DQorICAgICAgICAgIGZTY2FsZWRNYXhQZXJXaWR0aCA9IGZQZXJXaWR0aDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlDb2x1bW5zID0gc2NhbGVkQ29sdW1ucy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpQ29sdW1uczsgaisrKSB7DQorICAgIENGV0xfR3JpZENvbFJvdyogcENvbFJvdyA9IHN0YXRpY19jYXN0PENGV0xfR3JpZENvbFJvdyo+KHNjYWxlZENvbHVtbnNbal0pOw0KKyAgICBpZiAoIXBDb2xSb3cpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBTZXRDb2xSb3dBY3R1YWxTaXplKHBDb2xSb3csIGZTY2FsZWRNYXhQZXJXaWR0aCAqIHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoKTsNCisgIH0NCisgIEZYX1BPU0lUSU9OIHBzID0gbV9tYXBXaWRnZXRJbmZvLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChwcykgew0KKyAgICBJRldMX1dpZGdldCogcFdpZGdldCA9IE5VTEw7DQorICAgIENGV0xfR3JpZFdpZGdldEluZm8qIHBJbmZvID0gTlVMTDsNCisgICAgbV9tYXBXaWRnZXRJbmZvLkdldE5leHRBc3NvYyhwcywgKHZvaWQqJilwV2lkZ2V0LCAodm9pZComKXBJbmZvKTsNCisgICAgaWYgKCFwSW5mbyB8fCBwSW5mby0+bV9pQ29sdW1uU3BhbiA8IDIpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBDRlhfUHRyQXJyYXkgc3BhbkF1dG9Db2x1bW5zOw0KKyAgICBDRlhfUHRyQXJyYXkgc3BhblNjYWxlZENvbHVtbnM7DQorICAgIEZYX0ZMT0FUIGZTcGFuU2l6ZSA9IDA7DQorICAgIEZYX0ZMT0FUIGZTY2FsZWRTdW0gPSAwOw0KKyAgICBpbnQzMl90IGlBdXRvQ29sUm93cyA9IDA7DQorICAgIGludDMyX3QgaVNjYWxlZENvbFJvd3MgPSAwOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwSW5mby0+bV9pQ29sdW1uU3BhbjsgaSsrKSB7DQorICAgICAgQ0ZXTF9HcmlkQ29sUm93KiBwQ29sdW1uID0gcmVpbnRlcnByZXRfY2FzdDxDRldMX0dyaWRDb2xSb3cqPigNCisgICAgICAgICAgR2V0Q29sUm93KFRSVUUsIHBJbmZvLT5tX2lDb2x1bW4gKyBpKSk7DQorICAgICAgaWYgKCFwQ29sdW1uKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgZlNwYW5TaXplICs9IHBDb2x1bW4tPm1fZkFjdHVhbFNpemU7DQorICAgICAgaWYgKHBDb2x1bW4tPm1fU2l6ZS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfQXV0bykgew0KKyAgICAgICAgaUF1dG9Db2xSb3dzKys7DQorICAgICAgICBzcGFuQXV0b0NvbHVtbnMuQWRkKHBDb2x1bW4pOw0KKyAgICAgIH0gZWxzZSBpZiAocENvbHVtbi0+bV9TaXplLmVVbml0ID09IEZXTF9HUklEVU5JVF9TY2FsZWQpIHsNCisgICAgICAgIGlTY2FsZWRDb2xSb3dzKys7DQorICAgICAgICBmU2NhbGVkU3VtICs9IHBDb2x1bW4tPm1fU2l6ZS5mTGVuZ3RoOw0KKyAgICAgICAgc3BhblNjYWxlZENvbHVtbnMuQWRkKHBDb2x1bW4pOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoaUF1dG9Db2xSb3dzIDwgMSAmJiBpU2NhbGVkQ29sUm93cyA8IDEpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmV2lkZ2V0V2lkdGggPSBDYWxjQXV0b0NvbHVtbldpZGdldFdpZHRoKHBXaWRnZXQsIHBJbmZvKTsNCisgICAgaWYgKGZXaWRnZXRXaWR0aCA+IGZTcGFuU2l6ZSkgew0KKyAgICAgIGlmIChpU2NhbGVkQ29sUm93cyA+IDApIHsNCisgICAgICAgIGlmIChmU2NhbGVkU3VtIDw9IDApIHsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBTZXRTcGFuU2NhbGVkQ29sUm93U2l6ZShzcGFuU2NhbGVkQ29sdW1ucywgZldpZGdldFdpZHRoIC0gZlNwYW5TaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlNjYWxlZFN1bSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIFNldFNwYW5BdXRvQ29sUm93U2l6ZShzcGFuQXV0b0NvbHVtbnMsIGZXaWRnZXRXaWR0aCAtIGZTcGFuU2l6ZSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBGWF9GTE9BVCBmQXV0b1dpZHRoID0gMDsNCisgIGludDMyX3QgaUF1dG9Db2xzID0gYXV0b0NvbHVtbnMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IG0gPSAwOyBtIDwgaUF1dG9Db2xzOyBtKyspIHsNCisgICAgZkF1dG9XaWR0aCArPSBzdGF0aWNfY2FzdDxDRldMX0dyaWRDb2xSb3cqPihhdXRvQ29sdW1uc1ttXSktPm1fZkFjdHVhbFNpemU7DQorICB9DQorICBGWF9GTE9BVCBmU2NhbGVkV2lkdGggPSAwOw0KKyAgaUNvbHVtbnMgPSBzY2FsZWRDb2x1bW5zLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBuID0gMDsgbiA8IGlDb2x1bW5zOyBuKyspIHsNCisgICAgZlNjYWxlZFdpZHRoICs9DQorICAgICAgICBzdGF0aWNfY2FzdDxDRldMX0dyaWRDb2xSb3cqPihzY2FsZWRDb2x1bW5zW25dKS0+bV9mQWN0dWFsU2l6ZTsNCisgIH0NCisgIHJldHVybiBmRml4ZWRXaWR0aCArIGZBdXRvV2lkdGggKyBmU2NhbGVkV2lkdGg7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfR3JpZEltcDo6UHJvY2Vzc1VuQ2VydGFpblJvd3MoKSB7DQorICBpbnQzMl90IGlSb3dzID0gbV9Sb3dzLkdldFNpemUoKTsNCisgIGlmIChpUm93cyA8IDEpIHsNCisgICAgQ0ZXTF9HcmlkQ29sUm93KiBwQ29sUm93ID0gbmV3IENGV0xfR3JpZENvbFJvdzsNCisgICAgcENvbFJvdy0+bV9TaXplLmVVbml0ID0gRldMX0dSSURVTklUX0F1dG87DQorICAgIFByb2NBdXRvQ29sUm93KHBDb2xSb3csIDAsIEZBTFNFKTsNCisgICAgRlhfRkxPQVQgZldpZHRoID0gcENvbFJvdy0+bV9mQWN0dWFsU2l6ZTsNCisgICAgZGVsZXRlIHBDb2xSb3c7DQorICAgIHJldHVybiBmV2lkdGg7DQorICB9DQorICBGWF9GTE9BVCBmRml4ZWRIZWlnaHQgPSAwOw0KKyAgQ0ZYX1B0ckFycmF5IGF1dG9Sb3dzOw0KKyAgQ0ZYX1B0ckFycmF5IHNjYWxlZFJvd3M7DQorICBGWF9GTE9BVCBmU2NhbGVkUm93TnVtID0gMDsNCisgIEZYX0ZMT0FUIGZTY2FsZWRNYXhQZXJIZWlnaHQgPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVJvd3M7IGkrKykgew0KKyAgICBDRldMX0dyaWRDb2xSb3cqIHBDb2xSb3cgPSBzdGF0aWNfY2FzdDxDRldMX0dyaWRDb2xSb3cqPihtX1Jvd3NbaV0pOw0KKyAgICBpZiAoIXBDb2xSb3cpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBzd2l0Y2ggKHBDb2xSb3ctPm1fU2l6ZS5lVW5pdCkgew0KKyAgICAgIGNhc2UgRldMX0dSSURVTklUX0ZpeGVkOiB7DQorICAgICAgICBTZXRDb2xSb3dBY3R1YWxTaXplKHBDb2xSb3csIHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoKTsNCisgICAgICAgIGZGaXhlZEhlaWdodCArPSBwQ29sUm93LT5tX2ZBY3R1YWxTaXplOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgRldMX0dSSURVTklUX0F1dG86IHsNCisgICAgICAgIFByb2NBdXRvQ29sUm93KHBDb2xSb3csIGksIEZBTFNFKTsNCisgICAgICAgIGF1dG9Sb3dzLkFkZChwQ29sUm93KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIEZXTF9HUklEVU5JVF9TY2FsZWQ6DQorICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgUHJvY0F1dG9Db2xSb3cocENvbFJvdywgaSwgRkFMU0UpOw0KKyAgICAgICAgZlNjYWxlZFJvd051bSArPSBwQ29sUm93LT5tX1NpemUuZkxlbmd0aDsNCisgICAgICAgIHNjYWxlZFJvd3MuQWRkKHBDb2xSb3cpOw0KKyAgICAgICAgaWYgKHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoID4gMCkgew0KKyAgICAgICAgICBGWF9GTE9BVCBmUGVySGVpZ2h0ID0NCisgICAgICAgICAgICAgIHBDb2xSb3ctPm1fZkFjdHVhbFNpemUgLyBwQ29sUm93LT5tX1NpemUuZkxlbmd0aDsNCisgICAgICAgICAgaWYgKGZQZXJIZWlnaHQgPiBmU2NhbGVkTWF4UGVySGVpZ2h0KSB7DQorICAgICAgICAgICAgZlNjYWxlZE1heFBlckhlaWdodCA9IGZQZXJIZWlnaHQ7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaVJvd3MgPSBzY2FsZWRSb3dzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlSb3dzOyBqKyspIHsNCisgICAgQ0ZXTF9HcmlkQ29sUm93KiBwQ29sUm93ID0gc3RhdGljX2Nhc3Q8Q0ZXTF9HcmlkQ29sUm93Kj4oc2NhbGVkUm93c1tqXSk7DQorICAgIGlmICghcENvbFJvdykgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIFNldENvbFJvd0FjdHVhbFNpemUocENvbFJvdywgZlNjYWxlZE1heFBlckhlaWdodCAqIHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoKTsNCisgIH0NCisgIEZYX1BPU0lUSU9OIHBzID0gbV9tYXBXaWRnZXRJbmZvLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChwcykgew0KKyAgICB2b2lkKiBrZXkgPSBudWxscHRyOw0KKyAgICB2b2lkKiB2YWx1ZSA9IG51bGxwdHI7DQorICAgIG1fbWFwV2lkZ2V0SW5mby5HZXROZXh0QXNzb2MocHMsIGtleSwgdmFsdWUpOw0KKyAgICBJRldMX1dpZGdldCogcFdpZGdldCA9IHN0YXRpY19jYXN0PElGV0xfV2lkZ2V0Kj4oa2V5KTsNCisgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyogcEluZm8gPSBzdGF0aWNfY2FzdDxDRldMX0dyaWRXaWRnZXRJbmZvKj4odmFsdWUpOw0KKyAgICBpZiAocEluZm8tPm1faVJvd1NwYW4gPCAyKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgQ0ZYX1B0ckFycmF5IHNwYW5BdXRvUm93czsNCisgICAgQ0ZYX1B0ckFycmF5IHNwYW5TY2FsZWRSb3dzOw0KKyAgICBGWF9GTE9BVCBmU3BhblNpemUgPSAwOw0KKyAgICBGWF9GTE9BVCBmU2NhbGVkU3VtID0gMDsNCisgICAgaW50MzJfdCBpQXV0b0NvbFJvd3MgPSAwOw0KKyAgICBpbnQzMl90IGlTY2FsZWRDb2xSb3dzID0gMDsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcEluZm8tPm1faVJvd1NwYW47IGkrKykgew0KKyAgICAgIENGV0xfR3JpZENvbFJvdyogcFJvdyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZXTF9HcmlkQ29sUm93Kj4oDQorICAgICAgICAgIEdldENvbFJvdyhGQUxTRSwgcEluZm8tPm1faVJvdyArIGkpKTsNCisgICAgICBpZiAoIXBSb3cpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBmU3BhblNpemUgKz0gcFJvdy0+bV9mQWN0dWFsU2l6ZTsNCisgICAgICBpZiAocFJvdy0+bV9TaXplLmVVbml0ID09IEZXTF9HUklEVU5JVF9BdXRvKSB7DQorICAgICAgICBpQXV0b0NvbFJvd3MrKzsNCisgICAgICAgIHNwYW5BdXRvUm93cy5BZGQocFJvdyk7DQorICAgICAgfSBlbHNlIGlmIChwUm93LT5tX1NpemUuZVVuaXQgPT0gRldMX0dSSURVTklUX1NjYWxlZCkgew0KKyAgICAgICAgaVNjYWxlZENvbFJvd3MrKzsNCisgICAgICAgIGZTY2FsZWRTdW0gKz0gcFJvdy0+bV9TaXplLmZMZW5ndGg7DQorICAgICAgICBzcGFuU2NhbGVkUm93cy5BZGQocFJvdyk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChpQXV0b0NvbFJvd3MgPCAxICYmIGlTY2FsZWRDb2xSb3dzIDwgMSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZXaWRnZXRIZWlnaHQgPSBDYWxjQXV0b0NvbHVtbldpZGdldEhlaWdodChwV2lkZ2V0LCBwSW5mbyk7DQorICAgIGlmIChmV2lkZ2V0SGVpZ2h0ID4gZlNwYW5TaXplKSB7DQorICAgICAgaWYgKGlTY2FsZWRDb2xSb3dzID4gMCkgew0KKyAgICAgICAgaWYgKGZTY2FsZWRTdW0gPD0gMCkgew0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIFNldFNwYW5TY2FsZWRDb2xSb3dTaXplKHNwYW5TY2FsZWRSb3dzLCBmV2lkZ2V0SGVpZ2h0IC0gZlNwYW5TaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlNjYWxlZFN1bSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIFNldFNwYW5BdXRvQ29sUm93U2l6ZShzcGFuQXV0b1Jvd3MsIGZXaWRnZXRIZWlnaHQgLSBmU3BhblNpemUpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgRlhfRkxPQVQgZkF1dG9IZWlndCA9IDA7DQorICBpbnQzMl90IGlBdXRvUm93cyA9IGF1dG9Sb3dzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBtID0gMDsgbSA8IGlBdXRvUm93czsgbSsrKSB7DQorICAgIGZBdXRvSGVpZ3QgKz0gc3RhdGljX2Nhc3Q8Q0ZXTF9HcmlkQ29sUm93Kj4oYXV0b1Jvd3NbbV0pLT5tX2ZBY3R1YWxTaXplOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZlNjYWxlZEhlaWdodCA9IDA7DQorICBpUm93cyA9IHNjYWxlZFJvd3MuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IG4gPSAwOyBuIDwgaVJvd3M7IG4rKykgew0KKyAgICBmU2NhbGVkSGVpZ2h0ICs9DQorICAgICAgICBzdGF0aWNfY2FzdDxDRldMX0dyaWRDb2xSb3cqPihzY2FsZWRSb3dzW25dKS0+bV9mQWN0dWFsU2l6ZTsNCisgIH0NCisgIHJldHVybiBmRml4ZWRIZWlnaHQgKyBmQXV0b0hlaWd0ICsgZlNjYWxlZEhlaWdodDsNCit9DQorRlhfQk9PTCBDRldMX0dyaWRJbXA6OlNldENvbFJvd0FjdHVhbFNpemUoQ0ZXTF9HcmlkQ29sUm93KiBwQ29sUm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldEJleW9uZCkgew0KKyAgaWYgKHBDb2xSb3ctPm1fTWluU2l6ZS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfRml4ZWQgJiYNCisgICAgICBmU2l6ZSA8IHBDb2xSb3ctPm1fTWluU2l6ZS5mTGVuZ3RoKSB7DQorICAgIHBDb2xSb3ctPm1fZkFjdHVhbFNpemUgPSBwQ29sUm93LT5tX01pblNpemUuZkxlbmd0aDsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHBDb2xSb3ctPm1fTWF4U2l6ZS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfRml4ZWQgJiYNCisgICAgICBmU2l6ZSA+IHBDb2xSb3ctPm1fTWF4U2l6ZS5mTGVuZ3RoKSB7DQorICAgIHBDb2xSb3ctPm1fZkFjdHVhbFNpemUgPSBwQ29sUm93LT5tX01heFNpemUuZkxlbmd0aDsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGJTZXRCZXlvbmQpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBwQ29sUm93LT5tX2ZBY3R1YWxTaXplID0gZlNpemU7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfRkxPQVQgQ0ZXTF9HcmlkSW1wOjpTZXRXaWRnZXRBY3R1YWxXaWR0aChDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZXaWR0aCkgew0KKyAgaWYgKHBJbmZvLT5tX1NpemVbRldMX0dSSURTSVpFX01pbldpZHRoXS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfRml4ZWQgJiYNCisgICAgICBmV2lkdGggPCBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9NaW5XaWR0aF0uZkxlbmd0aCkgew0KKyAgICBmV2lkdGggPSBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9NaW5XaWR0aF0uZkxlbmd0aDsNCisgIH0NCisgIGlmIChwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9NYXhXaWR0aF0uZVVuaXQgPT0gRldMX0dSSURVTklUX0ZpeGVkICYmDQorICAgICAgZldpZHRoID4gcEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4V2lkdGhdLmZMZW5ndGgpIHsNCisgICAgZldpZHRoID0gcEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4V2lkdGhdLmZMZW5ndGg7DQorICB9DQorICBwSW5mby0+bV9mQWN0dWFsV2lkdGggPSBmV2lkdGg7DQorICByZXR1cm4gZldpZHRoOw0KK30NCitGWF9GTE9BVCBDRldMX0dyaWRJbXA6OlNldFdpZGdldEFjdHVhbEhlaWdodChDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmSGVpZ2h0KSB7DQorICBpZiAocEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluSGVpZ2h0XS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfRml4ZWQgJiYNCisgICAgICBmSGVpZ2h0IDwgcEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluSGVpZ2h0XS5mTGVuZ3RoKSB7DQorICAgIGZIZWlnaHQgPSBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9NaW5IZWlnaHRdLmZMZW5ndGg7DQorICB9DQorICBpZiAocEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4SGVpZ2h0XS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfRml4ZWQgJiYNCisgICAgICBmSGVpZ2h0ID4gcEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4SGVpZ2h0XS5mTGVuZ3RoKSB7DQorICAgIGZIZWlnaHQgPSBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9NYXhIZWlnaHRdLmZMZW5ndGg7DQorICB9DQorICBwSW5mby0+bV9mQWN0dWFsSGVpZ2h0ID0gZkhlaWdodDsNCisgIHJldHVybiBmSGVpZ2h0Ow0KK30NCit2b2lkIENGV0xfR3JpZEltcDo6U2V0QWxsV2lkZ2V0c1JlY3QoKSB7DQorICBGWF9GTE9BVCBmU3RhcnRMZWZ0ID0gMDsNCisgIGludDMyX3QgaUNvbHVtbnMgPSBtX0NvbHVtbnMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvbHVtbnM7IGkrKykgew0KKyAgICBDRldMX0dyaWRDb2xSb3cqIHBDb2xSb3cgPSBzdGF0aWNfY2FzdDxDRldMX0dyaWRDb2xSb3cqPihtX0NvbHVtbnNbaV0pOw0KKyAgICBpZiAoIXBDb2xSb3cpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBwQ29sUm93LT5tX2ZBY3R1YWxQb3MgPSBmU3RhcnRMZWZ0Ow0KKyAgICBmU3RhcnRMZWZ0ICs9IHBDb2xSb3ctPm1fZkFjdHVhbFNpemU7DQorICB9DQorICBGWF9GTE9BVCBmU3RhcnRUb3AgPSAwOw0KKyAgaW50MzJfdCBpUm93cyA9IG1fUm93cy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpUm93czsgaisrKSB7DQorICAgIENGV0xfR3JpZENvbFJvdyogcENvbFJvdyA9IHN0YXRpY19jYXN0PENGV0xfR3JpZENvbFJvdyo+KG1fUm93c1tqXSk7DQorICAgIGlmICghcENvbFJvdykgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIHBDb2xSb3ctPm1fZkFjdHVhbFBvcyA9IGZTdGFydFRvcDsNCisgICAgZlN0YXJ0VG9wICs9IHBDb2xSb3ctPm1fZkFjdHVhbFNpemU7DQorICB9DQorICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwV2lkZ2V0SW5mby5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocHMpIHsNCisgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQgPSBOVUxMOw0KKyAgICBDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbyA9IE5VTEw7DQorICAgIG1fbWFwV2lkZ2V0SW5mby5HZXROZXh0QXNzb2MocHMsICh2b2lkKiYpcFdpZGdldCwgKHZvaWQqJilwSW5mbyk7DQorICAgIGlmICghcFdpZGdldCB8fCAhcEluZm8pIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmQ29sdW1uU3RhcnQgPSAwOw0KKyAgICBDRldMX0dyaWRDb2xSb3cqIHBDb2x1bW4gPQ0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxDRldMX0dyaWRDb2xSb3cqPihHZXRDb2xSb3coVFJVRSwgcEluZm8tPm1faUNvbHVtbikpOw0KKyAgICBpZiAocENvbHVtbikgew0KKyAgICAgIGZDb2x1bW5TdGFydCA9IHBDb2x1bW4tPm1fZkFjdHVhbFBvczsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmUm93U3RhcnQgPSAwOw0KKyAgICBDRldMX0dyaWRDb2xSb3cqIHBSb3cgPQ0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxDRldMX0dyaWRDb2xSb3cqPihHZXRDb2xSb3coRkFMU0UsIHBJbmZvLT5tX2lSb3cpKTsNCisgICAgaWYgKHBSb3cpIHsNCisgICAgICBmUm93U3RhcnQgPSBwUm93LT5tX2ZBY3R1YWxQb3M7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZkNvbHVtbldpZHRoID0gMDsNCisgICAgaWYgKGlDb2x1bW5zID4gMCkgew0KKyAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IHBJbmZvLT5tX2lDb2x1bW5TcGFuOyBqKyspIHsNCisgICAgICAgIENGV0xfR3JpZENvbFJvdyogcENvbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZXTF9HcmlkQ29sUm93Kj4oDQorICAgICAgICAgICAgR2V0Q29sUm93KFRSVUUsIHBJbmZvLT5tX2lDb2x1bW4gKyBqKSk7DQorICAgICAgICBpZiAoIXBDb2wpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBmQ29sdW1uV2lkdGggKz0gcENvbC0+bV9mQWN0dWFsU2l6ZTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgZkNvbHVtbldpZHRoID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aDsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmUm93SGVpZ2h0ID0gMDsNCisgICAgaWYgKGlSb3dzID4gMCkgew0KKyAgICAgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IHBJbmZvLT5tX2lSb3dTcGFuOyBrKyspIHsNCisgICAgICAgIENGV0xfR3JpZENvbFJvdyogcFIgPSByZWludGVycHJldF9jYXN0PENGV0xfR3JpZENvbFJvdyo+KA0KKyAgICAgICAgICAgIEdldENvbFJvdyhGQUxTRSwgcEluZm8tPm1faVJvdyArIGspKTsNCisgICAgICAgIGlmICghcFIpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBmUm93SGVpZ2h0ICs9IHBSLT5tX2ZBY3R1YWxTaXplOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBmUm93SGVpZ2h0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQ7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZkxlZnRNYXJnaW4gPSAwLCBmUmlnaHRNYXJnaW4gPSAwOw0KKyAgICBGWF9CT09MIGJMZWZ0TWFyZ2luID0NCisgICAgICAgIEdldFdpZGdldE1hcmdpbihwV2lkZ2V0LCBGV0xfR1JJRE1BUkdJTl9MZWZ0LCBmTGVmdE1hcmdpbik7DQorICAgIEZYX0JPT0wgYlJpZ2h0TWFyZ2luID0NCisgICAgICAgIEdldFdpZGdldE1hcmdpbihwV2lkZ2V0LCBGV0xfR1JJRE1BUkdJTl9SaWdodCwgZlJpZ2h0TWFyZ2luKTsNCisgICAgRlhfRkxPQVQgZlRvcE1hcmdpbiA9IDAsIGZCb3R0b21NYXJnaW4gPSAwOw0KKyAgICBGWF9CT09MIGJUb3BNYXJnaW4gPQ0KKyAgICAgICAgR2V0V2lkZ2V0TWFyZ2luKHBXaWRnZXQsIEZXTF9HUklETUFSR0lOX1RvcCwgZlRvcE1hcmdpbik7DQorICAgIEZYX0JPT0wgYkJvdHRvbU1hcmdpbiA9DQorICAgICAgICBHZXRXaWRnZXRNYXJnaW4ocFdpZGdldCwgRldMX0dSSURNQVJHSU5fQm90dG9tLCBmQm90dG9tTWFyZ2luKTsNCisgICAgRldMX0xBWU9VVERBVEEgbHRkOw0KKyAgICBsdGQuZldpZHRoID0gMDsNCisgICAgbHRkLmZIZWlnaHQgPSAwOw0KKyAgICBpZiAocEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfV2lkdGhdLmVVbml0ID09IEZXTF9HUklEVU5JVF9GaXhlZCkgew0KKyAgICAgIFNldFdpZGdldEFjdHVhbFdpZHRoKHBJbmZvLCBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9XaWR0aF0uZkxlbmd0aCk7DQorICAgICAgbHRkLmZXaWR0aCA9IHBJbmZvLT5tX2ZBY3R1YWxXaWR0aDsNCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAoYkxlZnRNYXJnaW4gJiYgYlJpZ2h0TWFyZ2luKSB7DQorICAgICAgICBTZXRXaWRnZXRBY3R1YWxXaWR0aChwSW5mbywgZkNvbHVtbldpZHRoIC0gZkxlZnRNYXJnaW4gLSBmUmlnaHRNYXJnaW4pOw0KKyAgICAgICAgbHRkLmZXaWR0aCA9IHBJbmZvLT5tX2ZBY3R1YWxXaWR0aDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0QXV0bzsNCisgICAgICAgIHBXaWRnZXQtPkdldFdpZGdldFJlY3QocnRBdXRvLCBUUlVFKTsNCisgICAgICAgIFNldFdpZGdldEFjdHVhbFdpZHRoKHBJbmZvLCBydEF1dG8ud2lkdGgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAocEluZm8tPm1fU2l6ZVtGV0xfR1JJRFNJWkVfSGVpZ2h0XS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfRml4ZWQpIHsNCisgICAgICBTZXRXaWRnZXRBY3R1YWxIZWlnaHQocEluZm8sIHBJbmZvLT5tX1NpemVbRldMX0dSSURTSVpFX0hlaWdodF0uZkxlbmd0aCk7DQorICAgICAgbHRkLmZIZWlnaHQgPSBwSW5mby0+bV9mQWN0dWFsSGVpZ2h0Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChiVG9wTWFyZ2luICYmIGJCb3R0b21NYXJnaW4pIHsNCisgICAgICAgIFNldFdpZGdldEFjdHVhbEhlaWdodChwSW5mbywgZlJvd0hlaWdodCAtIGZUb3BNYXJnaW4gLSBmQm90dG9tTWFyZ2luKTsNCisgICAgICAgIGx0ZC5mSGVpZ2h0ID0gcEluZm8tPm1fZkFjdHVhbEhlaWdodDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0QXV0bzsNCisgICAgICAgIHBXaWRnZXQtPkdldFdpZGdldFJlY3QocnRBdXRvLCBUUlVFKTsNCisgICAgICAgIFNldFdpZGdldEFjdHVhbEhlaWdodChwSW5mbywgcnRBdXRvLmhlaWdodCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChiTGVmdE1hcmdpbiAmJiBiUmlnaHRNYXJnaW4gJiYNCisgICAgICAgIHBJbmZvLT5tX1NpemVbRldMX0dSSURTSVpFX1dpZHRoXS5lVW5pdCA9PSBGV0xfR1JJRFVOSVRfRml4ZWQpIHsNCisgICAgICBmTGVmdE1hcmdpbiA9DQorICAgICAgICAgIGZDb2x1bW5TdGFydCArIGZMZWZ0TWFyZ2luICsNCisgICAgICAgICAgKGZDb2x1bW5XaWR0aCAtIGZMZWZ0TWFyZ2luIC0gZlJpZ2h0TWFyZ2luIC0gcEluZm8tPm1fZkFjdHVhbFdpZHRoKSAvDQorICAgICAgICAgICAgICAyOw0KKyAgICB9IGVsc2UgaWYgKGJMZWZ0TWFyZ2luKSB7DQorICAgICAgZkxlZnRNYXJnaW4gPSBmQ29sdW1uU3RhcnQgKyBmTGVmdE1hcmdpbjsNCisgICAgfSBlbHNlIGlmIChiUmlnaHRNYXJnaW4pIHsNCisgICAgICBmTGVmdE1hcmdpbiA9DQorICAgICAgICAgIGZDb2x1bW5TdGFydCArIGZDb2x1bW5XaWR0aCAtIGZSaWdodE1hcmdpbiAtIHBJbmZvLT5tX2ZBY3R1YWxXaWR0aDsNCisgICAgfSBlbHNlIHsNCisgICAgICBmTGVmdE1hcmdpbiA9IGZDb2x1bW5TdGFydDsNCisgICAgfQ0KKyAgICBpZiAoYlRvcE1hcmdpbiAmJiBiQm90dG9tTWFyZ2luICYmDQorICAgICAgICBwSW5mby0+bV9TaXplW0ZXTF9HUklEU0laRV9IZWlnaHRdLmVVbml0ID09IEZXTF9HUklEVU5JVF9GaXhlZCkgew0KKyAgICAgIGZUb3BNYXJnaW4gPQ0KKyAgICAgICAgICBmUm93U3RhcnQgKyBmVG9wTWFyZ2luICsNCisgICAgICAgICAgKGZSb3dIZWlnaHQgLSBmVG9wTWFyZ2luIC0gZkJvdHRvbU1hcmdpbiAtIHBJbmZvLT5tX2ZBY3R1YWxIZWlnaHQpIC8NCisgICAgICAgICAgICAgIDI7DQorICAgIH0gZWxzZSBpZiAoYlRvcE1hcmdpbikgew0KKyAgICAgIGZUb3BNYXJnaW4gPSBmUm93U3RhcnQgKyBmVG9wTWFyZ2luOw0KKyAgICB9IGVsc2UgaWYgKGJCb3R0b21NYXJnaW4pIHsNCisgICAgICBmVG9wTWFyZ2luID0NCisgICAgICAgICAgZlJvd1N0YXJ0ICsgZlJvd0hlaWdodCAtIGZCb3R0b21NYXJnaW4gLSBwSW5mby0+bV9mQWN0dWFsSGVpZ2h0Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGZUb3BNYXJnaW4gPSBmUm93U3RhcnQ7DQorICAgIH0NCisgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0LCBydE9sZDsNCisgICAgcnRXaWRnZXQuU2V0KGZMZWZ0TWFyZ2luLCBmVG9wTWFyZ2luLCBwSW5mby0+bV9mQWN0dWFsV2lkdGgsDQorICAgICAgICAgICAgICAgICBwSW5mby0+bV9mQWN0dWFsSGVpZ2h0KTsNCisgICAgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydE9sZCk7DQorICAgIGlmIChydFdpZGdldCA9PSBydE9sZCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIHBXaWRnZXQtPlNldFdpZGdldFJlY3QocnRXaWRnZXQpOw0KKyAgICBpZiAocnRXaWRnZXQud2lkdGggPT0gcnRPbGQud2lkdGggJiYgcnRXaWRnZXQuaGVpZ2h0ID09IHJ0T2xkLmhlaWdodCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIHBXaWRnZXQtPlVwZGF0ZSgpOw0KKyAgfQ0KK30NCitGWF9CT09MIENGV0xfR3JpZEltcDo6SXNHcmlkKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBpZiAoIXBXaWRnZXQpDQorICAgIHJldHVybiBGQUxTRTsNCisgIHJldHVybiBwV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9HcmlkOw0KK30NCit2b2lkIENGV0xfR3JpZEltcDo6U2V0U3BhbkF1dG9Db2xSb3dTaXplKGNvbnN0IENGWF9QdHJBcnJheSYgc3BhbkF1dG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRvdGFsU2l6ZSkgew0KKyAgaW50MzJfdCBpQXV0b0NvbFJvd3MgPSBzcGFuQXV0b3MuR2V0U2l6ZSgpOw0KKyAgaWYgKGlBdXRvQ29sUm93cyA8IDEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1B0ckFycmF5IGF1dG9Ob01pbk1heHM7DQorICBGWF9GTE9BVCBmQXV0b1BlciA9IGZUb3RhbFNpemUgLyBpQXV0b0NvbFJvd3M7DQorICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpQXV0b0NvbFJvd3M7IGorKykgew0KKyAgICBDRldMX0dyaWRDb2xSb3cqIHBDb2x1bW4gPSBzdGF0aWNfY2FzdDxDRldMX0dyaWRDb2xSb3cqPihzcGFuQXV0b3Nbal0pOw0KKyAgICBGWF9GTE9BVCBmT3JnU2l6ZSA9IHBDb2x1bW4tPm1fZkFjdHVhbFNpemU7DQorICAgIGlmIChTZXRDb2xSb3dBY3R1YWxTaXplKHBDb2x1bW4sIHBDb2x1bW4tPm1fZkFjdHVhbFNpemUgKyBmQXV0b1BlciwgVFJVRSkpIHsNCisgICAgICBhdXRvTm9NaW5NYXhzLkFkZChwQ29sdW1uKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBmVG90YWxTaXplIC09IHBDb2x1bW4tPm1fZkFjdHVhbFNpemUgLSBmT3JnU2l6ZTsNCisgICAgICBpbnQzMl90IGlOb01pbk1heCA9IGlBdXRvQ29sUm93cyAtIChqICsgMSAtIGF1dG9Ob01pbk1heHMuR2V0U2l6ZSgpKTsNCisgICAgICBpZiAoaU5vTWluTWF4ID4gMCAmJiBmVG90YWxTaXplID4gMCkgew0KKyAgICAgICAgZkF1dG9QZXIgPSBmVG90YWxTaXplIC8gaU5vTWluTWF4Ow0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGludDMyX3QgaU5vcm1hbHMgPSBhdXRvTm9NaW5NYXhzLkdldFNpemUoKTsNCisgIGlmIChmVG90YWxTaXplID4gMCkgew0KKyAgICBpZiAoaU5vcm1hbHMgPT0gaUF1dG9Db2xSb3dzKSB7DQorICAgICAgZkF1dG9QZXIgPSBmVG90YWxTaXplIC8gaU5vcm1hbHM7DQorICAgICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgaU5vcm1hbHM7IGsrKykgew0KKyAgICAgICAgQ0ZXTF9HcmlkQ29sUm93KiBwQ29sdW1uID0NCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxDRldMX0dyaWRDb2xSb3cqPihhdXRvTm9NaW5NYXhzW2tdKTsNCisgICAgICAgIHBDb2x1bW4tPm1fZkFjdHVhbFNpemUgKz0gZkF1dG9QZXI7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIFNldFNwYW5BdXRvQ29sUm93U2l6ZShhdXRvTm9NaW5NYXhzLCBmVG90YWxTaXplKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgIH0NCit9DQordm9pZCBDRldMX0dyaWRJbXA6OlNldFNwYW5TY2FsZWRDb2xSb3dTaXplKGNvbnN0IENGWF9QdHJBcnJheSYgc3BhblNjYWxlZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUb3RhbFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUb3RhbFNjYWxlZE51bSkgew0KKyAgaW50MzJfdCBpU2NhbGVkQ29sUm93cyA9IHNwYW5TY2FsZWRzLkdldFNpemUoKTsNCisgIGlmIChpU2NhbGVkQ29sUm93cyA8IDEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1B0ckFycmF5IGF1dG9Ob01pbk1heHM7DQorICBGWF9GTE9BVCBmUGVyU2l6ZSA9IGZUb3RhbFNpemUgLyBmVG90YWxTY2FsZWROdW07DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2NhbGVkQ29sUm93czsgaSsrKSB7DQorICAgIENGV0xfR3JpZENvbFJvdyogcENvbFJvdyA9IHN0YXRpY19jYXN0PENGV0xfR3JpZENvbFJvdyo+KHNwYW5TY2FsZWRzW2ldKTsNCisgICAgaWYgKFNldENvbFJvd0FjdHVhbFNpemUocENvbFJvdywgcENvbFJvdy0+bV9mQWN0dWFsU2l6ZSArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUGVyU2l6ZSAqIHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKSkgew0KKyAgICAgIGF1dG9Ob01pbk1heHMuQWRkKHBDb2xSb3cpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGZUb3RhbFNpemUgLT0gcENvbFJvdy0+bV9mQWN0dWFsU2l6ZTsNCisgICAgICBmVG90YWxTY2FsZWROdW0gLT0gcENvbFJvdy0+bV9TaXplLmZMZW5ndGg7DQorICAgICAgaW50MzJfdCBpTm9NaW5NYXggPSBpU2NhbGVkQ29sUm93cyAtIChpICsgMSAtIGF1dG9Ob01pbk1heHMuR2V0U2l6ZSgpKTsNCisgICAgICBpZiAoaU5vTWluTWF4ID4gMCAmJiBmVG90YWxTaXplID4gMCkgew0KKyAgICAgICAgZlBlclNpemUgPSBmVG90YWxTaXplIC8gZlRvdGFsU2NhbGVkTnVtOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGludDMyX3QgaU5vcm1hbHMgPSBhdXRvTm9NaW5NYXhzLkdldFNpemUoKTsNCisgIGlmIChmVG90YWxTaXplID4gMCkgew0KKyAgICBpZiAoaU5vcm1hbHMgPT0gaVNjYWxlZENvbFJvd3MpIHsNCisgICAgICBmUGVyU2l6ZSA9IGZUb3RhbFNpemUgLyBmVG90YWxTY2FsZWROdW07DQorICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaU5vcm1hbHM7IGorKykgew0KKyAgICAgICAgQ0ZXTF9HcmlkQ29sUm93KiBwQ29sdW1uID0NCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxDRldMX0dyaWRDb2xSb3cqPihhdXRvTm9NaW5NYXhzW2pdKTsNCisgICAgICAgIHBDb2x1bW4tPm1fZkFjdHVhbFNpemUgKz0gZlBlclNpemUgKiBwQ29sdW1uLT5tX1NpemUuZkxlbmd0aDsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgU2V0U3BhblNjYWxlZENvbFJvd1NpemUoYXV0b05vTWluTWF4cywgZlRvdGFsU2l6ZSwgZlRvdGFsU2NhbGVkTnVtKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgIH0NCit9DQordm9pZCBDRldMX0dyaWRJbXA6OlNldFNjYWxlZENvbFJvd3NTaXplKGNvbnN0IENGWF9QdHJBcnJheSYgc3BhblNjYWxlZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUb3RhbFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUb3RhbFNjYWxlZE51bSkgew0KKyAgaW50MzJfdCBpU2NhbGVkQ29sUm93cyA9IHNwYW5TY2FsZWRzLkdldFNpemUoKTsNCisgIGlmIChpU2NhbGVkQ29sUm93cyA8IDEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1B0ckFycmF5IGF1dG9Ob01pbk1heHM7DQorICBGWF9GTE9BVCBmUGVyU2l6ZSA9IGZUb3RhbFNpemUgLyBmVG90YWxTY2FsZWROdW07DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2NhbGVkQ29sUm93czsgaSsrKSB7DQorICAgIENGV0xfR3JpZENvbFJvdyogcENvbFJvdyA9IHN0YXRpY19jYXN0PENGV0xfR3JpZENvbFJvdyo+KHNwYW5TY2FsZWRzW2ldKTsNCisgICAgaWYgKCFwQ29sUm93KSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZlNpemUgPSBmUGVyU2l6ZSAqIHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoOw0KKyAgICBGWF9GTE9BVCBmT3JnU2l6ZSA9IHBDb2xSb3ctPm1fZkFjdHVhbFNpemU7DQorICAgIGlmIChTZXRDb2xSb3dBY3R1YWxTaXplKHBDb2xSb3csIGZTaXplLCBUUlVFKSkgew0KKyAgICAgIGF1dG9Ob01pbk1heHMuQWRkKHBDb2xSb3cpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGZUb3RhbFNpemUgLT0gcENvbFJvdy0+bV9mQWN0dWFsU2l6ZSAtIGZPcmdTaXplOw0KKyAgICAgIGZUb3RhbFNjYWxlZE51bSAtPSBwQ29sUm93LT5tX1NpemUuZkxlbmd0aDsNCisgICAgICBpbnQzMl90IGlOb01pbk1heCA9IGlTY2FsZWRDb2xSb3dzIC0gKGkgKyAxIC0gYXV0b05vTWluTWF4cy5HZXRTaXplKCkpOw0KKyAgICAgIGlmIChpTm9NaW5NYXggPiAwICYmIGZUb3RhbFNpemUgPiAwKSB7DQorICAgICAgICBmUGVyU2l6ZSA9IGZUb3RhbFNpemUgLyBmVG90YWxTY2FsZWROdW07DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBpTm9ybWFscyA9IGF1dG9Ob01pbk1heHMuR2V0U2l6ZSgpOw0KKyAgaWYgKGZUb3RhbFNpemUgPiAwKSB7DQorICAgIGlmIChpTm9ybWFscyA9PSBpU2NhbGVkQ29sUm93cykgew0KKyAgICAgIGZQZXJTaXplID0gZlRvdGFsU2l6ZSAvIGZUb3RhbFNjYWxlZE51bTsNCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTm9ybWFsczsgaSsrKSB7DQorICAgICAgICBDRldMX0dyaWRDb2xSb3cqIHBDb2xSb3cgPQ0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PENGV0xfR3JpZENvbFJvdyo+KGF1dG9Ob01pbk1heHNbaV0pOw0KKyAgICAgICAgaWYgKCFwQ29sUm93KSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRkxPQVQgZlNpemUgPSBmUGVyU2l6ZSAqIHBDb2xSb3ctPm1fU2l6ZS5mTGVuZ3RoOw0KKyAgICAgICAgcENvbFJvdy0+bV9mQWN0dWFsU2l6ZSA9IGZTaXplOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBTZXRTY2FsZWRDb2xSb3dzU2l6ZShhdXRvTm9NaW5NYXhzLCBmVG90YWxTaXplLCBmVG90YWxTY2FsZWROdW0pOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgfQ0KK30NCitDRldMX0dyaWRJbXBEZWxlZ2F0ZTo6Q0ZXTF9HcmlkSW1wRGVsZWdhdGUoQ0ZXTF9HcmlkSW1wKiBwT3duZXIpDQorICAgIDogbV9wT3duZXIocE93bmVyKSB7DQorfQ0KK2ludDMyX3QgQ0ZXTF9HcmlkSW1wRGVsZWdhdGU6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgaWYgKHBNZXNzYWdlLT5HZXRDbGFzc0lEKCkgIT0gRldMX01TR0hBU0hfTW91c2UpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBDRldMX01zZ01vdXNlKiBwTXNnID0gc3RhdGljX2Nhc3Q8Q0ZXTF9Nc2dNb3VzZSo+KHBNZXNzYWdlKTsNCisgIGlmIChwTXNnLT5tX2R3Q21kICE9IEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bikgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHJldHVybiAxOw0KK30NCitGV0xfRVJSIENGV0xfR3JpZEltcERlbGVnYXRlOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIHJldHVybiBtX3BPd25lci0+RHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfbm90ZWltcC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfbm90ZWltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JkZjkwYwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9ub3RlaW1wLmNwcApAQCAtMCwwICsxLDEwOTUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3dpZGdldGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF93aWRnZXRtZ3JpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfcGFuZWxpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfZm9ybWltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9ub3RlaW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3RocmVhZGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9hcHBpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2Jhc2V3aWRnZXQvaW5jbHVkZS9md2xfdG9vbHRpcGN0cmxpbXAuaCINCitDRldMX05vdGVMb29wOjpDRldMX05vdGVMb29wKENGV0xfV2lkZ2V0SW1wKiBwRm9ybSkNCisgICAgOiBtX3BGb3JtKHBGb3JtKSwgbV9iQ29udGludWVNb2RhbChUUlVFKSB7fQ0KK0ZYX0JPT0wgQ0ZXTF9Ob3RlTG9vcDo6UHJlUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgaWYgKCFtX3BGb3JtKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBUcmFuc2xhdGVBY2NlbGVyYXRvcihwTWVzc2FnZSk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ob3RlTG9vcDo6SWRsZShpbnQzMl90IGNvdW50KSB7DQorI2lmIChfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXykNCisgIGlmIChjb3VudCA8PSAwKQ0KKyNlbmRpZg0KKyAgew0KKyAgICBDRldMX0V2dElkbGUgZXY7DQorICAgIElGV0xfQXBwKiBwQXBwID0gRldMX0dldEFwcCgpOw0KKyAgICBpZiAoIXBBcHApDQorICAgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgICAgSUZXTF9Ob3RlRHJpdmVyKiBwRHJpdmVyID0gcEFwcC0+R2V0Tm90ZURyaXZlcigpOw0KKyAgICBpZiAoIXBEcml2ZXIpDQorICAgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgICAgcERyaXZlci0+U2VuZE5vdGUoJmV2KTsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorfQ0KK0NGV0xfV2lkZ2V0SW1wKiBDRldMX05vdGVMb29wOjpHZXRGb3JtKCkgew0KKyAgcmV0dXJuIG1fcEZvcm07DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Ob3RlTG9vcDo6Q29udGludWVNb2RhbCgpIHsNCisgIHJldHVybiBtX2JDb250aW51ZU1vZGFsOw0KK30NCitGV0xfRVJSIENGV0xfTm90ZUxvb3A6OkVuZE1vZGFsTG9vcCgpIHsNCisgIG1fYkNvbnRpbnVlTW9kYWwgPSBGQUxTRTsNCisjaWYgKF9GWF9PU18gPT0gX0ZYX01BQ09TWF8pDQorICBDRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9IHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0TWdyKj4oRldMX0dldFdpZGdldE1ncigpKTsNCisgIElGV0xfQWRhcHRlcldpZGdldE1nciogYWRhcHRlcldpZGdldE1nciA9IHBXaWRnZXRNZ3ItPkdldEFkYXB0ZXJXaWRnZXRNZ3IoKTsNCisgIGFkYXB0ZXJXaWRnZXRNZ3ItPkVuZExvb3AoKTsNCisjZW5kaWYNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfQk9PTCBDRldMX05vdGVMb29wOjpUcmFuc2xhdGVBY2NlbGVyYXRvcihDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7DQorICBpZiAocE1lc3NhZ2UtPkdldENsYXNzSUQoKSAhPSBGV0xfTVNHSEFTSF9LZXkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZXTF9Nc2dLZXkqIHBNc2dLZXkgPSBzdGF0aWNfY2FzdDxDRldMX01zZ0tleSo+KHBNZXNzYWdlKTsNCisgIGlmIChwTXNnS2V5LT5tX2R3Q21kICE9IEZXTF9NU0dLRVlDTURfS2V5RG93bikgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfTWFwQWNjZWxlcmF0b3JzJiBhY2NlbCA9DQorICAgICAgc3RhdGljX2Nhc3Q8Q0ZXTF9Gb3JtSW1wKj4obV9wRm9ybSktPkdldEFjY2VsZXJhdG9yKCk7DQorICBGWF9QT1NJVElPTiBwb3MgPSBhY2NlbC5HZXRTdGFydFBvc2l0aW9uKCk7DQorICBpZiAoIXBvcykgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWF9EV09SRCB2cktleSwgclZhbHVlOw0KKyAgd2hpbGUgKHBvcykgew0KKyAgICBhY2NlbC5HZXROZXh0QXNzb2MocG9zLCB2cktleSwgclZhbHVlKTsNCisgICAgRlhfRFdPUkQgZHdGbGFncyA9ICh2cktleSAmIDB4RkYwMCkgPj4gODsNCisgICAgRlhfRFdPUkQgbV9kd0tleUNvZGUgPSB2cktleSAmIDB4MDBGRjsNCisgICAgaWYgKHBNc2dLZXktPm1fZHdGbGFncyA9PSBkd0ZsYWdzICYmIHBNc2dLZXktPm1fZHdLZXlDb2RlID09IG1fZHdLZXlDb2RlKSB7DQorICAgICAgR2VuZXJhdGVDb21tb25kRXZlbnQoclZhbHVlKTsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGV0xfRVJSIENGV0xfTm90ZUxvb3A6OlNldE1haW5Gb3JtKENGV0xfV2lkZ2V0SW1wKiBwRm9ybSkgew0KKyAgbV9wRm9ybSA9IHBGb3JtOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCit2b2lkIENGV0xfTm90ZUxvb3A6OkdlbmVyYXRlQ29tbW9uZEV2ZW50KEZYX0RXT1JEIGR3Q29tbWFuZCkgew0KKyAgQ0ZXTF9FdnRNZW51Q29tbWFuZCBldjsNCisgIGV2Lm1faUNvbW1hbmQgPSBkd0NvbW1hbmQ7DQorICBJRldMX05vdGVUaHJlYWQqIHBUaHJlYWQgPSBtX3BGb3JtLT5HZXRPd25lclRocmVhZCgpOw0KKyAgaWYgKCFwVGhyZWFkKQ0KKyAgICByZXR1cm47DQorICBJRldMX05vdGVEcml2ZXIqIHBEcml2ZXIgPSBwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQorICBpZiAoIXBEcml2ZXIpDQorICAgIHJldHVybjsNCisgIHBEcml2ZXItPlNlbmROb3RlKCZldik7DQorfQ0KK0NGV0xfTm90ZURyaXZlcjo6Q0ZXTF9Ob3RlRHJpdmVyKCkNCisgICAgOiBtX3NlbmRFdmVudENhbGxlZCgwKSwNCisgICAgICBtX21heFNpemUoNTAwKSwNCisgICAgICBtX2JGdWxsU2NyZWVuKEZBTFNFKSwNCisgICAgICBtX3BIb3ZlcihudWxscHRyKSwNCisgICAgICBtX3BGb2N1cyhudWxscHRyKSwNCisgICAgICBtX3BHcmFiKG51bGxwdHIpLA0KKyAgICAgIG1faG9vayhudWxscHRyKSB7DQorICBtX3BOb3RlTG9vcCA9IG5ldyBDRldMX05vdGVMb29wOw0KKyAgUHVzaE5vdGVMb29wKG1fcE5vdGVMb29wKTsNCit9DQorQ0ZXTF9Ob3RlRHJpdmVyOjp+Q0ZXTF9Ob3RlRHJpdmVyKCkgew0KKyAgZGVsZXRlIG1fcE5vdGVMb29wOw0KKyAgQ2xlYXJJbnZhbGlkRXZlbnRUYXJnZXRzKFRSVUUpOw0KK30NCitGWF9CT09MIENGV0xfTm90ZURyaXZlcjo6U2VuZE5vdGUoQ0ZXTF9Ob3RlKiBwTm90ZSkgew0KKyAgaWYgKHBOb3RlLT5Jc0V2ZW50KCkpIHsNCisgICAgaW50MzJfdCBpQ291bnQgPSBtX2V2ZW50VGFyZ2V0cy5HZXRDb3VudCgpOw0KKyAgICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGlmIChGV0xfRVZUSEFTSF9Nb3VzZSA9PSBzdGF0aWNfY2FzdDxDRldMX0V2ZW50Kj4ocE5vdGUpLT5HZXRDbGFzc0lEKCkpIHsNCisgICAgICBDRldMX0V2dE1vdXNlKiBwTW91c2UgPSBzdGF0aWNfY2FzdDxDRldMX0V2dE1vdXNlKj4ocE5vdGUpOw0KKyAgICAgIGlmIChGV0xfTVNHTU9VU0VDTURfTW91c2VIb3ZlciA9PSBwTW91c2UtPm1fZHdDbWQpIHsNCisgICAgICAgIGlmIChtX3BOb3RlTG9vcC0+R2V0Rm9ybSgpICYmDQorICAgICAgICAgICAgQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOjpnZXRJbnN0YW5jZSgpLT5Qcm9jZXNzRW50ZXIoDQorICAgICAgICAgICAgICAgIHBNb3VzZSwgbV9wTm90ZUxvb3AtPkdldEZvcm0oKS0+R2V0SW50ZXJmYWNlKCkpKSB7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIGlmIChGV0xfTVNHTU9VU0VDTURfTW91c2VMZWF2ZSA9PSBwTW91c2UtPm1fZHdDbWQpIHsNCisgICAgICAgIGlmIChDRldMX1Rvb2xUaXBDb250YWluZXI6OmdldEluc3RhbmNlKCktPlByb2Nlc3NMZWF2ZShwTW91c2UpKSB7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIGlmICgoRldMX01TR01PVVNFQ01EX0xCdXR0b25Eb3duIDw9IHBNb3VzZS0+bV9kd0NtZCkgJiYNCisgICAgICAgICAgICAgICAgIChGV0xfTVNHTU9VU0VDTURfTUJ1dHRvbkRibENsayA+PSBwTW91c2UtPm1fZHdDbWQpKSB7DQorICAgICAgICBpZiAoQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOjpnZXRJbnN0YW5jZSgpLT5Qcm9jZXNzTGVhdmUocE1vdXNlKSkgew0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBtX3NlbmRFdmVudENhbGxlZCsrOw0KKyAgICBGWF9QT1NJVElPTiBwb3MgPSBtX2V2ZW50VGFyZ2V0cy5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgIHdoaWxlIChwb3MpIHsNCisgICAgICB2b2lkKiBrZXkgPSBOVUxMOw0KKyAgICAgIENGV0xfRXZlbnRUYXJnZXQqIHBFdmVudFRhcmdldDsNCisgICAgICBtX2V2ZW50VGFyZ2V0cy5HZXROZXh0QXNzb2MocG9zLCBrZXksICh2b2lkKiYpcEV2ZW50VGFyZ2V0KTsNCisgICAgICBpZiAocEV2ZW50VGFyZ2V0ICYmICFwRXZlbnRUYXJnZXQtPklzSW52YWxpZCgpKSB7DQorICAgICAgICBwRXZlbnRUYXJnZXQtPlByb2Nlc3NFdmVudChzdGF0aWNfY2FzdDxDRldMX0V2ZW50Kj4ocE5vdGUpKTsNCisgICAgICB9DQorICAgIH0NCisgICAgbV9zZW5kRXZlbnRDYWxsZWQtLTsNCisgIH0gZWxzZSB7DQorICAgIGlmICghcE5vdGUtPm1fcERzdFRhcmdldCkNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9IHBOb3RlLT5tX3BEc3RUYXJnZXQtPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgICBpZiAocERlbGVnYXRlKSB7DQorICAgICAgcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHN0YXRpY19jYXN0PENGV0xfTWVzc2FnZSo+KHBOb3RlKSk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitleHRlcm4gdm9pZCBGV0xfUG9zdE1lc3NhZ2VUb01haW5Sb29wKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpOw0KK0ZYX0JPT0wgQ0ZXTF9Ob3RlRHJpdmVyOjpQb3N0TWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7DQorICBGV0xfUG9zdE1lc3NhZ2VUb01haW5Sb29wKHBNZXNzYWdlKTsNCisgIHJldHVybiBUUlVFOw0KK30NCisjZGVmaW5lIEZXTF9Ob3RlRHJpdmVyX0V2ZW50S2V5IDExMDANCitGV0xfRVJSIENGV0xfTm90ZURyaXZlcjo6UmVnaXN0ZXJFdmVudFRhcmdldChJRldMX1dpZGdldCogcExpc3RlbmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwRXZlbnRTb3VyY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGaWx0ZXIpIHsNCisgIEZYX0RXT1JEIGR3a2V5ID0gKEZYX0RXT1JEKSh1aW50cHRyX3QpcExpc3RlbmVyLT5HZXRQcml2YXRlRGF0YSgNCisgICAgICAodm9pZCopKHVpbnRwdHJfdClGV0xfTm90ZURyaXZlcl9FdmVudEtleSk7DQorICBpZiAoZHdrZXkgPT0gMCkgew0KKyAgICB2b2lkKiByYW5kb20gPSBGWF9SYW5kb21fTVRfU3RhcnQoMCk7DQorICAgIGR3a2V5ID0gcmFuZCgpOw0KKyAgICBGWF9SYW5kb21fTVRfQ2xvc2UocmFuZG9tKTsNCisgICAgcExpc3RlbmVyLT5TZXRQcml2YXRlRGF0YSgodm9pZCopKHVpbnRwdHJfdClGV0xfTm90ZURyaXZlcl9FdmVudEtleSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopKHVpbnRwdHJfdClkd2tleSwgTlVMTCk7DQorICB9DQorICBDRldMX0V2ZW50VGFyZ2V0KiB2YWx1ZSA9IE5VTEw7DQorICBpZiAoIW1fZXZlbnRUYXJnZXRzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClkd2tleSwgKHZvaWQqJil2YWx1ZSkpIHsNCisgICAgdmFsdWUgPSBuZXcgQ0ZXTF9FdmVudFRhcmdldCh0aGlzLCBwTGlzdGVuZXIpOw0KKyAgICBtX2V2ZW50VGFyZ2V0cy5TZXRBdCgodm9pZCopKHVpbnRwdHJfdClkd2tleSwgdmFsdWUpOw0KKyAgfQ0KKyAgdmFsdWUtPlNldEV2ZW50U291cmNlKHBFdmVudFNvdXJjZSwgZHdGaWx0ZXIpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfTm90ZURyaXZlcjo6VW5yZWdpc3RlckV2ZW50VGFyZ2V0KElGV0xfV2lkZ2V0KiBwTGlzdGVuZXIpIHsNCisgIEZYX0RXT1JEIGR3a2V5ID0gKEZYX0RXT1JEKSh1aW50cHRyX3QpcExpc3RlbmVyLT5HZXRQcml2YXRlRGF0YSgNCisgICAgICAodm9pZCopKHVpbnRwdHJfdClGV0xfTm90ZURyaXZlcl9FdmVudEtleSk7DQorICBpZiAoZHdrZXkgPT0gMCkgew0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgfQ0KKyAgQ0ZXTF9FdmVudFRhcmdldCogdmFsdWUgPSBOVUxMOw0KKyAgaWYgKG1fZXZlbnRUYXJnZXRzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClkd2tleSwgKHZvaWQqJil2YWx1ZSkpIHsNCisgICAgdmFsdWUtPkZsYWdJbnZhbGlkKCk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK3ZvaWQgQ0ZXTF9Ob3RlRHJpdmVyOjpDbGVhckV2ZW50VGFyZ2V0cyhGWF9CT09MIGJSZW1vdmVBbGwpIHsNCisgIENsZWFySW52YWxpZEV2ZW50VGFyZ2V0cyhiUmVtb3ZlQWxsKTsNCit9DQoraW50MzJfdCBDRldMX05vdGVEcml2ZXI6OkdldFF1ZXVlTWF4U2l6ZSgpIGNvbnN0IHsNCisgIHJldHVybiBtX21heFNpemU7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ob3RlRHJpdmVyOjpTZXRRdWV1ZU1heFNpemUoY29uc3QgaW50MzJfdCBzaXplKSB7DQorICBtX21heFNpemUgPSBzaXplOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitJRldMX05vdGVUaHJlYWQqIENGV0xfTm90ZURyaXZlcjo6R2V0T3duZXJUaHJlYWQoKSBjb25zdCB7DQorICByZXR1cm4gRldMX0dldEFwcCgpOw0KK30NCitGV0xfRVJSIENGV0xfTm90ZURyaXZlcjo6UHVzaE5vdGVMb29wKElGV0xfTm90ZUxvb3AqIHBOb3RlTG9vcCkgew0KKyAgbV9ub3RlTG9vcFF1ZXVlLkFkZChwTm90ZUxvb3ApOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitJRldMX05vdGVMb29wKiBDRldMX05vdGVEcml2ZXI6OlBvcE5vdGVMb29wKCkgew0KKyAgaW50MzJfdCBwb3MgPSBtX25vdGVMb29wUXVldWUuR2V0U2l6ZSgpOw0KKyAgaWYgKHBvcyA8PSAwKQ0KKyAgICByZXR1cm4gTlVMTDsNCisgIElGV0xfTm90ZUxvb3AqIHAgPQ0KKyAgICAgIHN0YXRpY19jYXN0PElGV0xfTm90ZUxvb3AqPihtX25vdGVMb29wUXVldWUuR2V0QXQocG9zIC0gMSkpOw0KKyAgbV9ub3RlTG9vcFF1ZXVlLlJlbW92ZUF0KHBvcyAtIDEpOw0KKyAgcmV0dXJuIHA7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Ob3RlRHJpdmVyOjpTZXRGb2N1cyhJRldMX1dpZGdldCogcEZvY3VzLCBGWF9CT09MIGJOb3RpZnkpIHsNCisgIGlmIChtX3BGb2N1cyA9PSBwRm9jdXMpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBJRldMX1dpZGdldCogcFByZXYgPSBtX3BGb2N1czsNCisgIG1fcEZvY3VzID0gcEZvY3VzOw0KKyAgaWYgKHBQcmV2KSB7DQorICAgIENGV0xfTXNnS2lsbEZvY3VzIG1zOw0KKyAgICBtcy5tX3BEc3RUYXJnZXQgPSBwUHJldjsNCisgICAgbXMubV9wU3JjVGFyZ2V0ID0gcFByZXY7DQorICAgIGlmIChiTm90aWZ5KSB7DQorICAgICAgbXMubV9kd0V4dGVuZCA9IDE7DQorICAgIH0NCisgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogcERlbGVnYXRlID0gcFByZXYtPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgICBpZiAocERlbGVnYXRlKSB7DQorICAgICAgcERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKCZtcyk7DQorICAgIH0NCisgIH0NCisgIGlmIChwRm9jdXMpIHsNCisgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQgPQ0KKyAgICAgICAgRldMX0dldFdpZGdldE1ncigpLT5HZXRXaWRnZXQocEZvY3VzLCBGV0xfV0dUUkVMQVRJT05fU3lzdGVtRm9ybSk7DQorICAgIENGV0xfRm9ybUltcCogcEZvcm0gPQ0KKyAgICAgICAgcFdpZGdldCA/IHN0YXRpY19jYXN0PENGV0xfRm9ybUltcCo+KHBXaWRnZXQtPkdldEltcGwoKSkgOiBudWxscHRyOw0KKyAgICBpZiAocEZvcm0pIHsNCisgICAgICBDRldMX1dpZGdldEltcCogcE5ld0ZvY3VzID0NCisgICAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZXTF9XaWRnZXRJbXAqPihwRm9jdXMtPkdldEltcGwoKSk7DQorICAgICAgcEZvcm0tPlNldFN1YkZvY3VzKHBOZXdGb2N1cyk7DQorICAgIH0NCisgICAgQ0ZXTF9Nc2dTZXRGb2N1cyBtczsNCisgICAgbXMubV9wRHN0VGFyZ2V0ID0gcEZvY3VzOw0KKyAgICBpZiAoYk5vdGlmeSkgew0KKyAgICAgIG1zLm1fZHdFeHRlbmQgPSAxOw0KKyAgICB9DQorICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9IHBGb2N1cy0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICAgIGlmIChwRGVsZWdhdGUpIHsNCisgICAgICBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UoJm1zKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ob3RlRHJpdmVyOjpSdW4oKSB7DQorICBDRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9IHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0TWdyKj4oRldMX0dldFdpZGdldE1ncigpKTsNCisgIGlmICghcFdpZGdldE1ncikNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisjaWYgKF9GWF9PU18gPT0gX0ZYX01BQ09TWF8pDQorICBJRldMX0FkYXB0ZXJXaWRnZXRNZ3IqIGFkYXB0ZXJXaWRnZXRNZ3IgPSBwV2lkZ2V0TWdyLT5HZXRBZGFwdGVyV2lkZ2V0TWdyKCk7DQorICBDRldMX05vdGVMb29wKiBwVG9wTG9vcCA9IEdldFRvcExvb3AoKTsNCisgIGlmIChwVG9wTG9vcCkgew0KKyAgICBDRldMX1dpZGdldEltcCogZm9ybUltcCA9IHBUb3BMb29wLT5HZXRGb3JtKCk7DQorICAgIGlmIChmb3JtSW1wKSB7DQorICAgICAgSUZXTF9XaWRnZXQqIHBGb3JtID0gZm9ybUltcC0+R2V0SW50ZXJmYWNlKCk7DQorICAgICAgYWRhcHRlcldpZGdldE1nci0+UnVuTG9vcChwRm9ybSk7DQorICAgIH0NCisgIH0NCisjZWxpZihfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU42NF8pDQorICBGWF9CT09MIGJJZGxlID0gVFJVRTsNCisgIGludDMyX3QgaUlkbGVDb3VudCA9IDA7DQorICBDRldMX05vdGVMb29wKiBwVG9wTG9vcCA9IE5VTEw7DQorICBmb3IgKDs7KSB7DQorICAgIHBUb3BMb29wID0gR2V0VG9wTG9vcCgpOw0KKyAgICBpZiAoIXBUb3BMb29wIHx8ICFwVG9wTG9vcC0+Q29udGludWVNb2RhbCgpKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKFVucXVldWVNZXNzYWdlKHBUb3BMb29wKSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIHdoaWxlIChiSWRsZSAmJiAhKHBXaWRnZXRNZ3ItPkNoZWNrTWVzc2FnZV9OYXRpdmUoKSkpIHsNCisgICAgICBpZiAoRldMX0VSUl9JbmRlZmluaXRlID09IHBUb3BMb29wLT5JZGxlKGlJZGxlQ291bnQrKykpIHsNCisgICAgICAgIGJJZGxlID0gRkFMU0U7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGRvIHsNCisgICAgICBpZiAoRldMX0VSUl9JbmRlZmluaXRlID09IHBXaWRnZXRNZ3ItPkRpc3BhdGNoTWVzc2FnZV9OYXRpdmUoKSkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlmIChwV2lkZ2V0TWdyLT5Jc0lkbGVNZXNzYWdlX05hdGl2ZSgpKSB7DQorICAgICAgICBiSWRsZSA9IFRSVUU7DQorICAgICAgICBpSWRsZUNvdW50ID0gMDsNCisgICAgICB9DQorICAgIH0gd2hpbGUgKHBXaWRnZXRNZ3ItPkNoZWNrTWVzc2FnZV9OYXRpdmUoKSk7DQorICB9DQorI2VsaWYoX0ZYX09TXyA9PSBfRlhfTElOVVhfREVTS1RPUF8pDQorICBDRldMX05vdGVMb29wKiBwVG9wTG9vcCA9IE5VTEw7DQorICBmb3IgKDs7KSB7DQorICAgIHBUb3BMb29wID0gR2V0VG9wTG9vcCgpOw0KKyAgICBpZiAoIXBUb3BMb29wIHx8ICFwVG9wTG9vcC0+Q29udGludWVNb2RhbCgpKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKFVucXVldWVNZXNzYWdlKHBUb3BMb29wKSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChwV2lkZ2V0TWdyLT5DaGVja01lc3NhZ2VfTmF0aXZlKCkpIHsNCisgICAgICBwV2lkZ2V0TWdyLT5EaXNwYXRjaE1lc3NhZ2VfTmF0aXZlKCk7DQorICAgIH0NCisgIH0NCisjZW5kaWYNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorSUZXTF9XaWRnZXQqIENGV0xfTm90ZURyaXZlcjo6R2V0Rm9jdXMoKSB7DQorICByZXR1cm4gbV9wRm9jdXM7DQorfQ0KK0lGV0xfV2lkZ2V0KiBDRldMX05vdGVEcml2ZXI6OkdldEhvdmVyKCkgew0KKyAgcmV0dXJuIG1fcEhvdmVyOw0KK30NCit2b2lkIENGV0xfTm90ZURyaXZlcjo6U2V0SG92ZXIoSUZXTF9XaWRnZXQqIHBIb3Zlcikgew0KKyAgbV9wSG92ZXIgPSBwSG92ZXI7DQorfQ0KK3ZvaWQgQ0ZXTF9Ob3RlRHJpdmVyOjpTZXRHcmFiKElGV0xfV2lkZ2V0KiBwR3JhYiwgRlhfQk9PTCBiU2V0KSB7DQorICBtX3BHcmFiID0gYlNldCA/IHBHcmFiIDogTlVMTDsNCit9DQordm9pZCBDRldMX05vdGVEcml2ZXI6Ok5vdGlmeVRhcmdldEhpZGUoSUZXTF9XaWRnZXQqIHBOb3RlVGFyZ2V0KSB7DQorICBpZiAobV9wRm9jdXMgPT0gcE5vdGVUYXJnZXQpIHsNCisgICAgbV9wRm9jdXMgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcEhvdmVyID09IHBOb3RlVGFyZ2V0KSB7DQorICAgIG1fcEhvdmVyID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BHcmFiID09IHBOb3RlVGFyZ2V0KSB7DQorICAgIG1fcEdyYWIgPSBOVUxMOw0KKyAgfQ0KK30NCit2b2lkIENGV0xfTm90ZURyaXZlcjo6Tm90aWZ5VGFyZ2V0RGVzdHJveShJRldMX1dpZGdldCogcE5vdGVUYXJnZXQpIHsNCisgIGlmIChtX3BGb2N1cyA9PSBwTm90ZVRhcmdldCkgew0KKyAgICBtX3BGb2N1cyA9IE5VTEw7DQorICB9DQorICBpZiAobV9wSG92ZXIgPT0gcE5vdGVUYXJnZXQpIHsNCisgICAgbV9wSG92ZXIgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcEdyYWIgPT0gcE5vdGVUYXJnZXQpIHsNCisgICAgbV9wR3JhYiA9IE5VTEw7DQorICB9DQorICBVbnJlZ2lzdGVyRXZlbnRUYXJnZXQocE5vdGVUYXJnZXQpOw0KKyAgaW50MzJfdCBjb3VudCA9IG1fZm9ybXMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IG5JbmRleCA9IDA7IG5JbmRleCA8IGNvdW50OyBuSW5kZXgrKykgew0KKyAgICBDRldMX0Zvcm1JbXAqIHBGb3JtID0gc3RhdGljX2Nhc3Q8Q0ZXTF9Gb3JtSW1wKj4obV9mb3Jtc1tuSW5kZXhdKTsNCisgICAgaWYgKCFwRm9ybSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIENGV0xfV2lkZ2V0SW1wKiBwU3ViRm9jdXMgPSBwRm9ybS0+R2V0U3ViRm9jdXMoKTsNCisgICAgaWYgKCFwU3ViRm9jdXMpDQorICAgICAgcmV0dXJuOw0KKyAgICBpZiAocFN1YkZvY3VzICYmIHBTdWJGb2N1cy0+R2V0SW50ZXJmYWNlKCkgPT0gcE5vdGVUYXJnZXQpIHsNCisgICAgICBwRm9ybS0+U2V0U3ViRm9jdXMoTlVMTCk7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDRldMX05vdGVEcml2ZXI6Ok5vdGlmeUZ1bGxTY3JlZW5Nb2RlKElGV0xfV2lkZ2V0KiBwTm90ZVRhcmdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRnVsbFNjcmVlbikgew0KKyAgbV9iRnVsbFNjcmVlbiA9IGJGdWxsU2NyZWVuOw0KK30NCitGV0xfRVJSIENGV0xfTm90ZURyaXZlcjo6UmVnaXN0ZXJGb3JtKENGV0xfV2lkZ2V0SW1wKiBwRm9ybSkgew0KKyAgaWYgKCFwRm9ybSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIGlmIChtX2Zvcm1zLkZpbmQocEZvcm0pID49IDApIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIH0NCisgIG1fZm9ybXMuQWRkKHBGb3JtKTsNCisgIGlmIChtX2Zvcm1zLkdldFNpemUoKSA9PSAxKSB7DQorICAgIENGV0xfTm90ZUxvb3AqIHBMb29wID0NCisgICAgICAgIHN0YXRpY19jYXN0PENGV0xfTm90ZUxvb3AqPihtX25vdGVMb29wUXVldWUuR2V0QXQoMCkpOw0KKyAgICBpZiAoIXBMb29wKQ0KKyAgICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICAgIHBMb29wLT5TZXRNYWluRm9ybShwRm9ybSk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ob3RlRHJpdmVyOjpVblJlZ2lzdGVyRm9ybShDRldMX1dpZGdldEltcCogcEZvcm0pIHsNCisgIGlmICghcEZvcm0pDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBpbnQzMl90IG5JbmRleCA9IG1fZm9ybXMuRmluZChwRm9ybSk7DQorICBpZiAobkluZGV4IDwgMCkgew0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgfQ0KKyAgbV9mb3Jtcy5SZW1vdmVBdChuSW5kZXgpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9CT09MIENGV0xfTm90ZURyaXZlcjo6UXVldWVNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsNCisgIHBNZXNzYWdlLT5SZXRhaW4oKTsNCisgIG1fbm90ZVF1ZXVlLkFkZChwTWVzc2FnZSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX05vdGVEcml2ZXI6OlVucXVldWVNZXNzYWdlKENGV0xfTm90ZUxvb3AqIHBOb3RlTG9vcCkgew0KKyAgaWYgKG1fbm90ZVF1ZXVlLkdldFNpemUoKSA8IDEpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSA9IHN0YXRpY19jYXN0PENGV0xfTWVzc2FnZSo+KG1fbm90ZVF1ZXVlWzBdKTsNCisgIG1fbm90ZVF1ZXVlLlJlbW92ZUF0KDApOw0KKyAgaWYgKCFJc1ZhbGlkTWVzc2FnZShwTWVzc2FnZSkpIHsNCisgICAgcE1lc3NhZ2UtPlJlbGVhc2UoKTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBGWF9CT09MIGJIb29rTWVzc2FnZSA9IEZBTFNFOw0KKyAgaWYgKG1faG9vaykgew0KKyAgICBiSG9va01lc3NhZ2UgPSAoKm1faG9vaykocE1lc3NhZ2UsIG1faG9va0luZm8pOw0KKyAgfQ0KKyAgaWYgKCFiSG9va01lc3NhZ2UgJiYgIXBOb3RlTG9vcC0+UHJlUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpKSB7DQorICAgIFByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCisgIH0NCisgIHBNZXNzYWdlLT5SZWxlYXNlKCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorQ0ZXTF9Ob3RlTG9vcCogQ0ZXTF9Ob3RlRHJpdmVyOjpHZXRUb3BMb29wKCkgew0KKyAgaW50MzJfdCBzaXplID0gbV9ub3RlTG9vcFF1ZXVlLkdldFNpemUoKTsNCisgIGlmIChzaXplIDw9IDApDQorICAgIHJldHVybiBOVUxMOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfTm90ZUxvb3AqPihtX25vdGVMb29wUXVldWVbc2l6ZSAtIDFdKTsNCit9DQoraW50MzJfdCBDRldMX05vdGVEcml2ZXI6OkNvdW50TG9vcCgpIHsNCisgIHJldHVybiBtX25vdGVMb29wUXVldWUuR2V0U2l6ZSgpOw0KK30NCit2b2lkIENGV0xfTm90ZURyaXZlcjo6U2V0SG9vayhGV0xNZXNzYWdlSG9va0NhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBpbmZvKSB7DQorICBtX2hvb2sgPSBjYWxsYmFjazsNCisgIG1faG9va0luZm8gPSBpbmZvOw0KK30NCitGWF9CT09MIENGV0xfTm90ZURyaXZlcjo6UHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgQ0ZXTF9XaWRnZXRNZ3IqIHBXaWRnZXRNZ3IgPSBzdGF0aWNfY2FzdDxDRldMX1dpZGdldE1ncio+KEZXTF9HZXRXaWRnZXRNZ3IoKSk7DQorICBJRldMX1dpZGdldCogcE1lc3NhZ2VGb3JtID0gcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBNZXNzYWdlLT5tX3BEc3RUYXJnZXQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHZXRNZXNzYWdlRm9ybShwTWVzc2FnZS0+bV9wRHN0VGFyZ2V0KTsNCisgIGlmICghcE1lc3NhZ2VGb3JtKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBpZiAoRGlzcGF0Y2hNZXNzYWdlKHBNZXNzYWdlLCBwTWVzc2FnZUZvcm0pKSB7DQorICAgIGlmIChwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpID09IEZXTF9NU0dIQVNIX01vdXNlKSB7DQorICAgICAgTW91c2VTZWNvbmRhcnkoc3RhdGljX2Nhc3Q8Q0ZXTF9Nc2dNb3VzZSo+KHBNZXNzYWdlKSk7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Ob3RlRHJpdmVyOjpEaXNwYXRjaE1lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwTWVzc2FnZUZvcm0pIHsNCisgIEZYX0JPT0wgYlJldCA9IEZBTFNFOw0KKyAgc3dpdGNoIChwTWVzc2FnZS0+R2V0Q2xhc3NJRCgpKSB7DQorICAgIGNhc2UgRldMX01TR0hBU0hfQWN0aXZhdGU6IHsNCisgICAgICBiUmV0ID0gRG9BY3RpdmF0ZShzdGF0aWNfY2FzdDxDRldMX01zZ0FjdGl2YXRlKj4ocE1lc3NhZ2UpLCBwTWVzc2FnZUZvcm0pOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01TR0hBU0hfRGVhY3RpdmF0ZTogew0KKyAgICAgIGJSZXQgPSBEb0RlYWN0aXZhdGUoc3RhdGljX2Nhc3Q8Q0ZXTF9Nc2dEZWFjdGl2YXRlKj4ocE1lc3NhZ2UpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcE1lc3NhZ2VGb3JtKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX1NldEZvY3VzOiB7DQorICAgICAgYlJldCA9IERvU2V0Rm9jdXMoc3RhdGljX2Nhc3Q8Q0ZXTF9Nc2dTZXRGb2N1cyo+KHBNZXNzYWdlKSwgcE1lc3NhZ2VGb3JtKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX0tpbGxGb2N1czogew0KKyAgICAgIGJSZXQgPQ0KKyAgICAgICAgICBEb0tpbGxGb2N1cyhzdGF0aWNfY2FzdDxDRldMX01zZ0tpbGxGb2N1cyo+KHBNZXNzYWdlKSwgcE1lc3NhZ2VGb3JtKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX0tleTogew0KKyAgICAgIGJSZXQgPSBEb0tleShzdGF0aWNfY2FzdDxDRldMX01zZ0tleSo+KHBNZXNzYWdlKSwgcE1lc3NhZ2VGb3JtKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX01vdXNlOiB7DQorICAgICAgYlJldCA9IERvTW91c2Uoc3RhdGljX2Nhc3Q8Q0ZXTF9Nc2dNb3VzZSo+KHBNZXNzYWdlKSwgcE1lc3NhZ2VGb3JtKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX01vdXNlV2hlZWw6IHsNCisgICAgICBiUmV0ID0gRG9XaGVlbChzdGF0aWNfY2FzdDxDRldMX01zZ01vdXNlV2hlZWwqPihwTWVzc2FnZSksIHBNZXNzYWdlRm9ybSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9TaXplOiB7DQorICAgICAgYlJldCA9IERvU2l6ZShzdGF0aWNfY2FzdDxDRldMX01zZ1NpemUqPihwTWVzc2FnZSkpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01TR0hBU0hfQ3Vyc29yOiB7DQorICAgICAgYlJldCA9IFRSVUU7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9XaW5kb3dNb3ZlOiB7DQorICAgICAgYlJldCA9IERvV2luZG93TW92ZShzdGF0aWNfY2FzdDxDRldMX01zZ1dpbmRvd01vdmUqPihwTWVzc2FnZSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICBwTWVzc2FnZUZvcm0pOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01TR0hBU0hfRHJvcEZpbGVzOiB7DQorICAgICAgYlJldCA9DQorICAgICAgICAgIERvRHJhZ0ZpbGVzKHN0YXRpY19jYXN0PENGV0xfTXNnRHJvcEZpbGVzKj4ocE1lc3NhZ2UpLCBwTWVzc2FnZUZvcm0pOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsNCisgICAgICBiUmV0ID0gVFJVRTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGJSZXQpIHsNCisgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogcERlbGVnYXRlID0gcE1lc3NhZ2UtPm1fcERzdFRhcmdldC0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICAgIGlmIChwRGVsZWdhdGUpIHsNCisgICAgICBwRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gYlJldDsNCit9DQorRlhfQk9PTCBDRldMX05vdGVEcml2ZXI6OkRvQWN0aXZhdGUoQ0ZXTF9Nc2dBY3RpdmF0ZSogcE1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE1lc3NhZ2VGb3JtKSB7DQorICBpZiAobV9iRnVsbFNjcmVlbikgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBwTXNnLT5tX3BEc3RUYXJnZXQgPSBwTWVzc2FnZUZvcm07DQorICByZXR1cm4gKHBNc2ctPm1fcERzdFRhcmdldCktPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0RlYWN0aXZhdGVkOw0KK30NCitGWF9CT09MIENGV0xfTm90ZURyaXZlcjo6RG9EZWFjdGl2YXRlKENGV0xfTXNnRGVhY3RpdmF0ZSogcE1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwTWVzc2FnZUZvcm0pIHsNCisgIGlmIChtX2JGdWxsU2NyZWVuKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGludDMyX3QgaVRyYWNrTG9vcCA9IG1fbm90ZUxvb3BRdWV1ZS5HZXRTaXplKCk7DQorICBpZiAoaVRyYWNrTG9vcCA8PSAwKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBpZiAoaVRyYWNrTG9vcCA9PSAxKSB7DQorICAgIGlmIChwTWVzc2FnZUZvcm0tPklzSW5zdGFuY2UoRlhfV1NUUkMoTCJGV0xfRk9STVBST1hZIikpKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChwTXNnLT5tX3BTcmNUYXJnZXQgJiYNCisgICAgICAgIHBNc2ctPm1fcFNyY1RhcmdldC0+SXNJbnN0YW5jZShGWF9XU1RSQyhMIkZXTF9GT1JNUFJPWFkiKSkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKHBNc2ctPm1fcFNyY1RhcmdldCAmJiBwTXNnLT5tX3BTcmNUYXJnZXQtPkdldENsYXNzSUQoKSA9PSAxMTExOTg0NzU1KSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgSUZXTF9XaWRnZXQqIHBEc3QgPSBwTXNnLT5tX3BEc3RUYXJnZXQ7DQorICBpZiAoIXBEc3QpDQorICAgIHJldHVybiBGQUxTRTsNCisjaWYgKF9GWF9PU18gPT0gX0ZYX01BQ09TWF8pDQorICBpZiAocERzdCA9PSBwTWVzc2FnZUZvcm0gJiYgcERzdC0+SXNJbnN0YW5jZShMIkZXTF9GT1JNUFJPWFkiKSkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisjZW5kaWYNCisgIHJldHVybiBwRHN0ICE9IHBNZXNzYWdlRm9ybSAmJg0KKyAgICAgICAgICFwRHN0LT5Jc0luc3RhbmNlKEZYX1dTVFJDKEwiRldMX0ZPUk1QUk9YWSIpKSAmJg0KKyAgICAgICAgICFwTWVzc2FnZUZvcm0tPklzSW5zdGFuY2UoRlhfV1NUUkMoTCJGV0xfRk9STVBST1hZIikpOw0KK30NCitGWF9CT09MIENGV0xfTm90ZURyaXZlcjo6RG9TZXRGb2N1cyhDRldMX01zZ1NldEZvY3VzKiBwTXNnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwTWVzc2FnZUZvcm0pIHsNCisgIENGV0xfV2lkZ2V0TWdyKiBwV2lkZ2V0TWdyID0gc3RhdGljX2Nhc3Q8Q0ZXTF9XaWRnZXRNZ3IqPihGV0xfR2V0V2lkZ2V0TWdyKCkpOw0KKyAgaWYgKHBXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgbV9wRm9jdXMgPSBwTXNnLT5tX3BEc3RUYXJnZXQ7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfSBlbHNlIHsNCisgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQgPSBwTXNnLT5tX3BEc3RUYXJnZXQ7DQorICAgIENGV0xfRm9ybUltcCogcEZvcm0gPQ0KKyAgICAgICAgcFdpZGdldCA/IHN0YXRpY19jYXN0PENGV0xfRm9ybUltcCo+KHBXaWRnZXQtPkdldEltcGwoKSkgOiBudWxscHRyOw0KKyAgICBpZiAocEZvcm0pIHsNCisgICAgICBDRldMX1dpZGdldEltcCogcFN1YkZvY3VzID0gcEZvcm0tPkdldFN1YkZvY3VzKCk7DQorICAgICAgaWYgKHBTdWJGb2N1cyAmJiAoKHBTdWJGb2N1cy0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgPT0gMCkpIHsNCisgICAgICAgIHBNc2ctPm1fcERzdFRhcmdldCA9IHBTdWJGb2N1cy0+R2V0SW50ZXJmYWNlKCk7DQorICAgICAgICBpZiAobV9wRm9jdXMgIT0gcE1zZy0+bV9wRHN0VGFyZ2V0KSB7DQorICAgICAgICAgIG1fcEZvY3VzID0gcE1zZy0+bV9wRHN0VGFyZ2V0Ow0KKyAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDRldMX05vdGVEcml2ZXI6OkRvS2lsbEZvY3VzKENGV0xfTXNnS2lsbEZvY3VzKiBwTXNnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE1lc3NhZ2VGb3JtKSB7DQorICBDRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9IHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0TWdyKj4oRldMX0dldFdpZGdldE1ncigpKTsNCisgIGlmIChwV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgIGlmIChtX3BGb2N1cyA9PSBwTXNnLT5tX3BEc3RUYXJnZXQpIHsNCisgICAgICBtX3BGb2N1cyA9IE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBJRldMX1dpZGdldCogcFdpZGdldCA9IHBNc2ctPm1fcERzdFRhcmdldDsNCisgIENGV0xfRm9ybUltcCogcEZvcm0gPQ0KKyAgICAgIHBXaWRnZXQgPyBzdGF0aWNfY2FzdDxDRldMX0Zvcm1JbXAqPihwV2lkZ2V0LT5HZXRJbXBsKCkpIDogbnVsbHB0cjsNCisgIGlmIChwRm9ybSkgew0KKyAgICBDRldMX1dpZGdldEltcCogcFN1YkZvY3VzID0gcEZvcm0tPkdldFN1YkZvY3VzKCk7DQorICAgIGlmIChwU3ViRm9jdXMgJiYgKHBTdWJGb2N1cy0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkpIHsNCisgICAgICBwTXNnLT5tX3BEc3RUYXJnZXQgPSBwU3ViRm9jdXMtPkdldEludGVyZmFjZSgpOw0KKyAgICAgIGlmIChtX3BGb2N1cyA9PSBwTXNnLT5tX3BEc3RUYXJnZXQpIHsNCisgICAgICAgIG1fcEZvY3VzID0gTlVMTDsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENGV0xfTm90ZURyaXZlcjo6RG9LZXkoQ0ZXTF9Nc2dLZXkqIHBNc2csIElGV0xfV2lkZ2V0KiBwTWVzc2FnZUZvcm0pIHsNCisjaWYgKF9GWF9PU18gIT0gX0ZYX01BQ09TWF8pDQorICBpZiAocE1zZy0+bV9kd0NtZCA9PSBGV0xfTVNHS0VZQ01EX0tleURvd24gJiYNCisgICAgICBwTXNnLT5tX2R3S2V5Q29kZSA9PSBGV0xfVktFWV9UYWIpIHsNCisgICAgQ0ZXTF9XaWRnZXRNZ3IqIHBXaWRnZXRNZ3IgPQ0KKyAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZXTF9XaWRnZXRNZ3IqPihGV0xfR2V0V2lkZ2V0TWdyKCkpOw0KKyAgICBJRldMX1dpZGdldCogcEZvcm0gPSBHZXRNZXNzYWdlRm9ybShwTXNnLT5tX3BEc3RUYXJnZXQpOw0KKyAgICBJRldMX1dpZGdldCogcEZvY3VzID0gbV9wRm9jdXM7DQorICAgIGlmIChtX3BGb2N1cykgew0KKyAgICAgIGlmIChwV2lkZ2V0TWdyLT5HZXRXaWRnZXQobV9wRm9jdXMsIEZXTF9XR1RSRUxBVElPTl9TeXN0ZW1Gb3JtKSAhPQ0KKyAgICAgICAgICBwRm9ybSkgew0KKyAgICAgICAgcEZvY3VzID0gTlVMTDsNCisgICAgICB9DQorICAgIH0NCisgICAgRlhfQk9PTCBiRmluZCA9IEZBTFNFOw0KKyAgICBJRldMX1dpZGdldCogcE5leHRUYWJTdG9wID0gcFdpZGdldE1nci0+bmV4dFRhYihwRm9ybSwgcEZvY3VzLCBiRmluZCk7DQorICAgIGlmICghcE5leHRUYWJTdG9wKSB7DQorICAgICAgYkZpbmQgPSBGQUxTRTsNCisgICAgICBwTmV4dFRhYlN0b3AgPSBwV2lkZ2V0TWdyLT5uZXh0VGFiKHBGb3JtLCBOVUxMLCBiRmluZCk7DQorICAgIH0NCisgICAgaWYgKHBOZXh0VGFiU3RvcCA9PSBwRm9jdXMpIHsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBpZiAocE5leHRUYWJTdG9wKSB7DQorICAgICAgU2V0Rm9jdXMocE5leHRUYWJTdG9wKTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisjZW5kaWYNCisgIGlmICghbV9wRm9jdXMpIHsNCisgICAgaWYgKHBNc2ctPm1fZHdDbWQgPT0gRldMX01TR0tFWUNNRF9LZXlEb3duICYmDQorICAgICAgICBwTXNnLT5tX2R3S2V5Q29kZSA9PSBGV0xfVktFWV9SZXR1cm4pIHsNCisgICAgICBDRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9DQorICAgICAgICAgIHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0TWdyKj4oRldMX0dldFdpZGdldE1ncigpKTsNCisgICAgICBJRldMX1dpZGdldCogZGVmQnV0dG9uID0gcFdpZGdldE1nci0+R2V0RGVmYXVsdEJ1dHRvbihwTWVzc2FnZUZvcm0pOw0KKyAgICAgIGlmIChkZWZCdXR0b24pIHsNCisgICAgICAgIHBNc2ctPm1fcERzdFRhcmdldCA9IGRlZkJ1dHRvbjsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBwTXNnLT5tX3BEc3RUYXJnZXQgPSBtX3BGb2N1czsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGV0xfTm90ZURyaXZlcjo6RG9Nb3VzZShDRldMX01zZ01vdXNlKiBwTXNnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwTWVzc2FnZUZvcm0pIHsNCisgIGlmIChwTXNnLT5tX2R3Q21kID09IEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUxlYXZlIHx8DQorICAgICAgcE1zZy0+bV9kd0NtZCA9PSBGV0xfTVNHTU9VU0VDTURfTW91c2VIb3ZlciB8fA0KKyAgICAgIHBNc2ctPm1fZHdDbWQgPT0gRldMX01TR01PVVNFQ01EX01vdXNlRW50ZXIpIHsNCisgICAgcmV0dXJuIHBNc2ctPm1fcERzdFRhcmdldCAhPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKHBNc2ctPm1fcERzdFRhcmdldCAhPSBwTWVzc2FnZUZvcm0pIHsNCisgICAgcE1zZy0+bV9wRHN0VGFyZ2V0LT5UcmFuc2Zvcm1UbyhwTWVzc2FnZUZvcm0sIHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgfQ0KKyAgaWYgKCFEb01vdXNlRXgocE1zZywgcE1lc3NhZ2VGb3JtKSkgew0KKyAgICBwTXNnLT5tX3BEc3RUYXJnZXQgPSBwTWVzc2FnZUZvcm07DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX05vdGVEcml2ZXI6OkRvV2hlZWwoQ0ZXTF9Nc2dNb3VzZVdoZWVsKiBwTXNnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwTWVzc2FnZUZvcm0pIHsNCisgIENGV0xfV2lkZ2V0TWdyKiBwV2lkZ2V0TWdyID0gc3RhdGljX2Nhc3Q8Q0ZXTF9XaWRnZXRNZ3IqPihGV0xfR2V0V2lkZ2V0TWdyKCkpOw0KKyAgaWYgKCFwV2lkZ2V0TWdyKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBJRldMX1dpZGdldCogcERzdCA9DQorICAgICAgcFdpZGdldE1nci0+R2V0V2lkZ2V0QXRQb2ludChwTWVzc2FnZUZvcm0sIHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgaWYgKCFwRHN0KQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICB3aGlsZSAocERzdCAmJiBwRHN0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9HcmlkKSB7DQorICAgIHBEc3QgPSBwRHN0LT5HZXRQYXJlbnQoKTsNCisgIH0NCisgIHBNZXNzYWdlRm9ybS0+VHJhbnNmb3JtVG8ocERzdCwgcE1zZy0+bV9meCwgcE1zZy0+bV9meSk7DQorICBwTXNnLT5tX3BEc3RUYXJnZXQgPSBwRHN0Ow0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Ob3RlRHJpdmVyOjpEb1NpemUoQ0ZXTF9Nc2dTaXplKiBwTXNnKSB7DQorICBDRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9IHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0TWdyKj4oRldMX0dldFdpZGdldE1ncigpKTsNCisgIGlmICghcFdpZGdldE1ncikNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgcFdpZGdldE1nci0+Tm90aWZ5U2l6ZUNoYW5nZWQocE1zZy0+bV9wRHN0VGFyZ2V0LCAoRlhfRkxPQVQpcE1zZy0+bV9pV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpcE1zZy0+bV9pSGVpZ2h0KTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGV0xfTm90ZURyaXZlcjo6RG9XaW5kb3dNb3ZlKENGV0xfTXNnV2luZG93TW92ZSogcE1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwTWVzc2FnZUZvcm0pIHsNCisgIHJldHVybiBwTXNnLT5tX3BEc3RUYXJnZXQgPT0gcE1lc3NhZ2VGb3JtOw0KK30NCitGWF9CT09MIENGV0xfTm90ZURyaXZlcjo6RG9EcmFnRmlsZXMoQ0ZXTF9Nc2dEcm9wRmlsZXMqIHBNc2csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwTWVzc2FnZUZvcm0pIHsNCisgIHJldHVybiBwTXNnLT5tX3BEc3RUYXJnZXQgPT0gcE1lc3NhZ2VGb3JtOw0KK30NCitGWF9CT09MIENGV0xfTm90ZURyaXZlcjo6RG9Nb3VzZUV4KENGV0xfTXNnTW91c2UqIHBNc2csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE1lc3NhZ2VGb3JtKSB7DQorICBDRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9IHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0TWdyKj4oRldMX0dldFdpZGdldE1ncigpKTsNCisgIGlmICghcFdpZGdldE1ncikNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgSUZXTF9XaWRnZXQqIHBUYXJnZXQgPSBOVUxMOw0KKyAgaWYgKG1fcEdyYWIpDQorICAgIHBUYXJnZXQgPSBtX3BHcmFiOw0KKyAgaWYgKCFwVGFyZ2V0KSB7DQorICAgIHBUYXJnZXQgPQ0KKyAgICAgICAgcFdpZGdldE1nci0+R2V0V2lkZ2V0QXRQb2ludChwTWVzc2FnZUZvcm0sIHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgICB3aGlsZSAocFRhcmdldCAmJiBwVGFyZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9HcmlkKSB7DQorICAgICAgcFRhcmdldCA9IHBUYXJnZXQtPkdldFBhcmVudCgpOw0KKyAgICB9DQorICB9DQorICBpZiAocFRhcmdldCkgew0KKyAgICBpZiAocE1lc3NhZ2VGb3JtICE9IHBUYXJnZXQpIHsNCisgICAgICBwTWVzc2FnZUZvcm0tPlRyYW5zZm9ybVRvKHBUYXJnZXQsIHBNc2ctPm1fZngsIHBNc2ctPm1fZnkpOw0KKyAgICB9DQorICB9DQorICBpZiAoIXBUYXJnZXQpDQorICAgIHJldHVybiBGQUxTRTsNCisgIHBNc2ctPm1fcERzdFRhcmdldCA9IHBUYXJnZXQ7DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDRldMX05vdGVEcml2ZXI6Ok1vdXNlU2Vjb25kYXJ5KENGV0xfTXNnTW91c2UqIHBNc2cpIHsNCisgIElGV0xfV2lkZ2V0KiBwVGFyZ2V0ID0gcE1zZy0+bV9wRHN0VGFyZ2V0Ow0KKyAgaWYgKHBUYXJnZXQgPT0gbV9wSG92ZXIpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1fcEhvdmVyKSB7DQorICAgIENGV0xfTXNnTW91c2UgbXNMZWF2ZTsNCisgICAgbXNMZWF2ZS5tX3BEc3RUYXJnZXQgPSBtX3BIb3ZlcjsNCisgICAgbXNMZWF2ZS5tX2Z4ID0gcE1zZy0+bV9meDsNCisgICAgbXNMZWF2ZS5tX2Z5ID0gcE1zZy0+bV9meTsNCisgICAgcFRhcmdldC0+VHJhbnNmb3JtVG8obV9wSG92ZXIsIG1zTGVhdmUubV9meCwgbXNMZWF2ZS5tX2Z5KTsNCisgICAgbXNMZWF2ZS5tX2R3RmxhZ3MgPSAwOw0KKyAgICBtc0xlYXZlLm1fZHdDbWQgPSBGV0xfTVNHTU9VU0VDTURfTW91c2VMZWF2ZTsNCisgICAgRGlzcGF0Y2hNZXNzYWdlKCZtc0xlYXZlLCBOVUxMKTsNCisgIH0NCisgIGlmIChwVGFyZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9Gb3JtKSB7DQorICAgIG1fcEhvdmVyID0gTlVMTDsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV9wSG92ZXIgPSBwVGFyZ2V0Ow0KKyAgQ0ZXTF9Nc2dNb3VzZSBtc0hvdmVyOw0KKyAgbXNIb3Zlci5tX3BEc3RUYXJnZXQgPSBwVGFyZ2V0Ow0KKyAgbXNIb3Zlci5tX2Z4ID0gcE1zZy0+bV9meDsNCisgIG1zSG92ZXIubV9meSA9IHBNc2ctPm1fZnk7DQorICBtc0hvdmVyLm1fZHdGbGFncyA9IDA7DQorICBtc0hvdmVyLm1fZHdDbWQgPSBGV0xfTVNHTU9VU0VDTURfTW91c2VIb3ZlcjsNCisgIERpc3BhdGNoTWVzc2FnZSgmbXNIb3ZlciwgTlVMTCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Ob3RlRHJpdmVyOjpJc1ZhbGlkTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7DQorICBpZiAocE1lc3NhZ2UtPkdldENsYXNzSUQoKSA9PSBGV0xfTVNHSEFTSF9Qb3N0KSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaW50MzJfdCBpQ291bnQgPSBtX25vdGVMb29wUXVldWUuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgQ0ZXTF9Ob3RlTG9vcCogcE5vdGVMb29wID0gc3RhdGljX2Nhc3Q8Q0ZXTF9Ob3RlTG9vcCo+KG1fbm90ZUxvb3BRdWV1ZVtpXSk7DQorICAgIENGV0xfV2lkZ2V0SW1wKiBwRm9ybSA9IHBOb3RlTG9vcC0+R2V0Rm9ybSgpOw0KKyAgICBpZiAocEZvcm0gJiYgKHBGb3JtLT5HZXRJbnRlcmZhY2UoKSA9PSBwTWVzc2FnZS0+bV9wRHN0VGFyZ2V0KSkgew0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICB9DQorICBpQ291bnQgPSBtX2Zvcm1zLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlDb3VudDsgaisrKSB7DQorICAgIENGV0xfRm9ybUltcCogcEZvcm0gPSBzdGF0aWNfY2FzdDxDRldMX0Zvcm1JbXAqPihtX2Zvcm1zW2pdKTsNCisgICAgaWYgKHBGb3JtLT5HZXRJbnRlcmZhY2UoKSA9PSBwTWVzc2FnZS0+bV9wRHN0VGFyZ2V0KSB7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorSUZXTF9XaWRnZXQqIENGV0xfTm90ZURyaXZlcjo6R2V0TWVzc2FnZUZvcm0oSUZXTF9XaWRnZXQqIHBEc3RUYXJnZXQpIHsNCisgIGludDMyX3QgaVRyYWNrTG9vcCA9IG1fbm90ZUxvb3BRdWV1ZS5HZXRTaXplKCk7DQorICBpZiAoaVRyYWNrTG9vcCA8PSAwKQ0KKyAgICByZXR1cm4gTlVMTDsNCisgIElGV0xfV2lkZ2V0KiBwTWVzc2FnZUZvcm0gPSBOVUxMOw0KKyAgaWYgKGlUcmFja0xvb3AgPiAxKSB7DQorICAgIENGV0xfTm90ZUxvb3AqIHBOb290TG9vcCA9DQorICAgICAgICBzdGF0aWNfY2FzdDxDRldMX05vdGVMb29wKj4obV9ub3RlTG9vcFF1ZXVlW2lUcmFja0xvb3AgLSAxXSk7DQorICAgIHBNZXNzYWdlRm9ybSA9IHBOb290TG9vcC0+R2V0Rm9ybSgpLT5HZXRJbnRlcmZhY2UoKTsNCisgIH0gZWxzZSB7DQorICAgIHBNZXNzYWdlRm9ybSA9IChtX2Zvcm1zLkZpbmQocERzdFRhcmdldCkgPCAwKSA/IE5VTEwgOiBwRHN0VGFyZ2V0Ow0KKyAgfQ0KKyAgaWYgKCFwTWVzc2FnZUZvcm0gJiYgcERzdFRhcmdldCkgew0KKyAgICBDRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9DQorICAgICAgICBzdGF0aWNfY2FzdDxDRldMX1dpZGdldE1ncio+KEZXTF9HZXRXaWRnZXRNZ3IoKSk7DQorICAgIGlmICghcFdpZGdldE1ncikNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgcE1lc3NhZ2VGb3JtID0NCisgICAgICAgIHBXaWRnZXRNZ3ItPkdldFdpZGdldChwRHN0VGFyZ2V0LCBGV0xfV0dUUkVMQVRJT05fU3lzdGVtRm9ybSk7DQorICB9DQorICByZXR1cm4gcE1lc3NhZ2VGb3JtOw0KK30NCit2b2lkIENGV0xfTm90ZURyaXZlcjo6Q2xlYXJJbnZhbGlkRXZlbnRUYXJnZXRzKEZYX0JPT0wgYlJlbW92ZUFsbCkgew0KKyAgRlhfUE9TSVRJT04gcG9zID0gbV9ldmVudFRhcmdldHMuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBvcykgew0KKyAgICB2b2lkKiBrZXkgPSBOVUxMOw0KKyAgICBDRldMX0V2ZW50VGFyZ2V0KiBwRXZlbnRUYXJnZXQgPSBOVUxMOw0KKyAgICBtX2V2ZW50VGFyZ2V0cy5HZXROZXh0QXNzb2MocG9zLCBrZXksICh2b2lkKiYpcEV2ZW50VGFyZ2V0KTsNCisgICAgaWYgKHBFdmVudFRhcmdldCAmJiAoYlJlbW92ZUFsbCB8fCBwRXZlbnRUYXJnZXQtPklzSW52YWxpZCgpKSkgew0KKyAgICAgIG1fZXZlbnRUYXJnZXRzLlJlbW92ZUtleShrZXkpOw0KKyAgICAgIGRlbGV0ZSBwRXZlbnRUYXJnZXQ7DQorICAgIH0NCisgIH0NCit9DQorY2xhc3MgQ0ZXTF9Db3JlVG9vcFRpcERQIDogcHVibGljIElGV0xfVG9vbFRpcERQIHsNCisgcHVibGljOg0KKyAgRldMX0VSUiBHZXRDYXB0aW9uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyYgd3NDYXB0aW9uKTsNCisgIGludDMyX3QgR2V0SW5pdGlhbERlbGF5KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIGludDMyX3QgR2V0QXV0b1BvcERlbGF5KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIENGWF9ESUJpdG1hcCogR2V0VG9vbFRpcEljb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgQ0ZYX1NpemVGIEdldFRvb2xUaXBJY29uU2l6ZShJRldMX1dpZGdldCogcFdpZGdldCk7DQorICBDRlhfUmVjdEYgR2V0QW5jaG9yKCk7DQorICBDRldMX0NvcmVUb29wVGlwRFAoKTsNCisNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NDYXB0aW9uOw0KKyAgaW50MzJfdCBtX25Jbml0RGVsYXlUaW1lOw0KKyAgaW50MzJfdCBtX25BdXRvUG9wRGVsYXlUaW1lOw0KKyAgQ0ZYX1JlY3RGIG1fZkFuY2hvcjsNCit9Ow0KK0NGV0xfQ29yZVRvb3BUaXBEUDo6Q0ZXTF9Db3JlVG9vcFRpcERQKCkgew0KKyAgbV9uSW5pdERlbGF5VGltZSA9IDUwMDsNCisgIG1fbkF1dG9Qb3BEZWxheVRpbWUgPSA1MDAwMDsNCisgIG1fZkFuY2hvci5TZXQoMC4wLCAwLjAsIDAuMCwgMC4wKTsNCit9DQorRldMX0VSUiBDRldMX0NvcmVUb29wVGlwRFA6OkdldENhcHRpb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQ2FwdGlvbikgew0KKyAgd3NDYXB0aW9uID0gbV93c0NhcHRpb247DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK2ludDMyX3QgQ0ZXTF9Db3JlVG9vcFRpcERQOjpHZXRJbml0aWFsRGVsYXkoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBtX25Jbml0RGVsYXlUaW1lOw0KK30NCitpbnQzMl90IENGV0xfQ29yZVRvb3BUaXBEUDo6R2V0QXV0b1BvcERlbGF5KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gbV9uQXV0b1BvcERlbGF5VGltZTsNCit9DQorQ0ZYX0RJQml0bWFwKiBDRldMX0NvcmVUb29wVGlwRFA6OkdldFRvb2xUaXBJY29uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gTlVMTDsNCit9DQorQ0ZYX1NpemVGIENGV0xfQ29yZVRvb3BUaXBEUDo6R2V0VG9vbFRpcEljb25TaXplKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBDRlhfU2l6ZUYgc3o7DQorICBzei5TZXQoMCwgMCk7DQorICByZXR1cm4gc3o7DQorfQ0KK0NGWF9SZWN0RiBDRldMX0NvcmVUb29wVGlwRFA6OkdldEFuY2hvcigpIHsNCisgIHJldHVybiBtX2ZBbmNob3I7DQorfQ0KK0NGV0xfRXZlbnRUYXJnZXQ6On5DRldMX0V2ZW50VGFyZ2V0KCkgew0KKyAgbV9ldmVudFNvdXJjZXMuUmVtb3ZlQWxsKCk7DQorfQ0KK2ludDMyX3QgQ0ZXTF9FdmVudFRhcmdldDo6U2V0RXZlbnRTb3VyY2UoSUZXTF9XaWRnZXQqIHBTb3VyY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZpbHRlcikgew0KKyAgaWYgKHBTb3VyY2UpIHsNCisgICAgbV9ldmVudFNvdXJjZXMuU2V0QXQocFNvdXJjZSwgZHdGaWx0ZXIpOw0KKyAgICByZXR1cm4gbV9ldmVudFNvdXJjZXMuR2V0Q291bnQoKTsNCisgIH0NCisgIHJldHVybiAxOw0KK30NCitGWF9CT09MIENGV0xfRXZlbnRUYXJnZXQ6OlByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsNCisgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9IG1fcExpc3RlbmVyLT5TZXREZWxlZ2F0ZShOVUxMKTsNCisgIGlmICghcERlbGVnYXRlKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBpZiAobV9ldmVudFNvdXJjZXMuR2V0Q291bnQoKSA9PSAwKSB7DQorICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBGWF9QT1NJVElPTiBwb3MgPSBtX2V2ZW50U291cmNlcy5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocG9zKSB7DQorICAgIElGV0xfV2lkZ2V0KiBwU291cmNlID0gTlVMTDsNCisgICAgRlhfRFdPUkQgZHdGaWx0ZXIgPSAwOw0KKyAgICBtX2V2ZW50U291cmNlcy5HZXROZXh0QXNzb2MocG9zLCAodm9pZComKXBTb3VyY2UsIGR3RmlsdGVyKTsNCisgICAgaWYgKHBTb3VyY2UgPT0gcEV2ZW50LT5tX3BTcmNUYXJnZXQgfHwNCisgICAgICAgIHBFdmVudC0+R2V0Q2xhc3NJRCgpID09IEZXTF9FVlRIQVNIX0lkbGUpIHsNCisgICAgICBpZiAoSXNGaWx0ZXJFdmVudChwRXZlbnQsIGR3RmlsdGVyKSkgew0KKyAgICAgICAgcERlbGVnYXRlLT5PblByb2Nlc3NFdmVudChwRXZlbnQpOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FdmVudFRhcmdldDo6SXNGaWx0ZXJFdmVudChDRldMX0V2ZW50KiBwRXZlbnQsIEZYX0RXT1JEIGR3RmlsdGVyKSB7DQorICBpZiAoZHdGaWx0ZXIgPT0gRldMX0VWRU5UX0FMTF9NQVNLKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7DQorICBzd2l0Y2ggKHBFdmVudC0+R2V0Q2xhc3NJRCgpKSB7DQorICAgIGNhc2UgRldMX0VWVEhBU0hfTW91c2U6IHsNCisgICAgICBiUmV0ID0gZHdGaWx0ZXIgJiBGV0xfRVZFTlRfTU9VU0VfTUFTSzsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9FVlRIQVNIX01vdXNlV2hlZWw6IHsNCisgICAgICBiUmV0ID0gZHdGaWx0ZXIgJiBGV0xfRVZFTlRfTU9VU0VXSEVFTF9NQVNLOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX0VWVEhBU0hfS2V5OiB7DQorICAgICAgYlJldCA9IGR3RmlsdGVyICYgRldMX0VWRU5UX0tFWV9NQVNLOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX0VWVEhBU0hfU2V0Rm9jdXM6DQorICAgIGNhc2UgRldMX0VWVEhBU0hfS2lsbEZvY3VzOiB7DQorICAgICAgYlJldCA9IGR3RmlsdGVyICYgRldMX0VWRU5UX0ZPQ1VTQ0hBTkdFRF9NQVNLOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX0VWVEhBU0hfRHJhdzogew0KKyAgICAgIGJSZXQgPSBkd0ZpbHRlciAmIEZXTF9FVkVOVF9EUkFXX01BU0s7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfRVZUSEFTSF9DbG9zZTogew0KKyAgICAgIGJSZXQgPSBkd0ZpbHRlciAmIEZXTF9FVkVOVF9DTE9TRV9NQVNLOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX0VWVEhBU0hfU2l6ZUNoYW5nZWQ6IHsNCisgICAgICBiUmV0ID0gZHdGaWx0ZXIgJiBGV0xfRVZFTlRfU0laRUNIQU5HRURfTUFTSzsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9FVlRIQVNIX0lkbGU6IHsNCisgICAgICBiUmV0ID0gZHdGaWx0ZXIgJiBGV0xfRVZFTlRfSURMRV9NQVNLOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsNCisgICAgICBiUmV0ID0gZHdGaWx0ZXIgJiBGV0xfRVZFTlRfQ09OVFJPTF9NQVNLOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gYlJldDsNCit9DQorDQorQ0ZXTF9Ub29sVGlwQ29udGFpbmVyKiBDRldMX1Rvb2xUaXBDb250YWluZXI6OnNfcEluc3RhbmNlID0gTlVMTDsNCisNCitDRldMX1Rvb2xUaXBDb250YWluZXI6OkNGV0xfVG9vbFRpcENvbnRhaW5lcigpDQorICAgIDogcEN1clRhcmdldChOVUxMKSwgbV9wVG9vbFRpcEltcChOVUxMKSB7DQorICBtX1Rvb2xUaXBEcCA9IG5ldyBDRldMX0NvcmVUb29wVGlwRFA7DQorICBtX1Rvb2xUaXBEcC0+bV9uSW5pdERlbGF5VGltZSA9IDA7DQorICBtX1Rvb2xUaXBEcC0+bV9uQXV0b1BvcERlbGF5VGltZSA9IDIwMDA7DQorfQ0KK0NGV0xfVG9vbFRpcENvbnRhaW5lcjo6fkNGV0xfVG9vbFRpcENvbnRhaW5lcigpIHsNCisgIGlmIChtX3BUb29sVGlwSW1wKSB7DQorICAgIElGV0xfVG9vbFRpcCogcFRvb2xUaXAgPQ0KKyAgICAgICAgc3RhdGljX2Nhc3Q8SUZXTF9Ub29sVGlwKj4obV9wVG9vbFRpcEltcC0+R2V0SW50ZXJmYWNlKCkpOw0KKyAgICBwVG9vbFRpcC0+RmluYWxpemUoKTsNCisgICAgZGVsZXRlIHBUb29sVGlwOw0KKyAgfQ0KKyAgZGVsZXRlIG1fVG9vbFRpcERwOw0KK30NCisvLyBzdGF0aWMNCitDRldMX1Rvb2xUaXBDb250YWluZXIqIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6Z2V0SW5zdGFuY2UoKSB7DQorICBpZiAoIXNfcEluc3RhbmNlKSB7DQorICAgIHNfcEluc3RhbmNlID0gbmV3IENGV0xfVG9vbFRpcENvbnRhaW5lcjsNCisgIH0NCisgIHJldHVybiBzX3BJbnN0YW5jZTsNCit9DQorLy8gc3RhdGljDQordm9pZCBDRldMX1Rvb2xUaXBDb250YWluZXI6OkRlbGV0ZUluc3RhbmNlKCkgew0KKyAgaWYgKHNfcEluc3RhbmNlKSB7DQorICAgIGRlbGV0ZSBzX3BJbnN0YW5jZTsNCisgICAgc19wSW5zdGFuY2UgPSBOVUxMOw0KKyAgfQ0KK30NCitGWF9FUlIgQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOjpBZGRUb29sVGlwVGFyZ2V0KElGV0xfVG9vbFRpcFRhcmdldCogcFRhcmdldCkgew0KKyAgaWYgKG1fYXJyV2lkZ2V0LkZpbmQoKHZvaWQqKXBUYXJnZXQpIDwgMCkgew0KKyAgICBtX2FycldpZGdldC5BZGQoKHZvaWQqKXBUYXJnZXQpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KK30NCitGWF9FUlIgQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOjpSZW1vdmVUb29sVGlwVGFyZ2V0KElGV0xfVG9vbFRpcFRhcmdldCogcFRhcmdldCkgew0KKyAgaW50IGluZGV4ID0gbV9hcnJXaWRnZXQuRmluZCgodm9pZCopcFRhcmdldCk7DQorICBpZiAoaW5kZXggPj0gMCkgew0KKyAgICBtX2FycldpZGdldC5SZW1vdmVBdChpbmRleCk7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOjpIYXNUb29sVGlwKElGV0xfV2lkZ2V0KiBwV2VkZ2V0KSB7DQorICBpbnQzMl90IGlDb3VudCA9IG1fYXJyV2lkZ2V0LkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIElGV0xfVG9vbFRpcFRhcmdldCogcCA9IHN0YXRpY19jYXN0PElGV0xfVG9vbFRpcFRhcmdldCo+KG1fYXJyV2lkZ2V0W2ldKTsNCisgICAgaWYgKHAtPkdldFdpZGdldCgpID09IHBXZWRnZXQpIHsNCisgICAgICBwQ3VyVGFyZ2V0ID0gcDsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6UHJvY2Vzc0VudGVyKENGV0xfRXZ0TW91c2UqIHBFdnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE93bmVyKSB7DQorICBpZiAoSGFzVG9vbFRpcChwRXZ0LT5tX3BEc3RUYXJnZXQpKSB7DQorICAgIGlmIChOVUxMID09IG1fcFRvb2xUaXBJbXApIHsNCisgICAgICBDRldMX1dpZGdldEltcFByb3BlcnRpZXMgcHJvcDsNCisgICAgICBwcm9wLm1fcERhdGFQcm92aWRlciA9IG1fVG9vbFRpcERwOw0KKyAgICAgIHByb3AubV9wT3duZXIgPSBwT3duZXI7DQorICAgICAgQ0ZYX1JlY3RGIHJ0VG9vbHRpcDsNCisgICAgICBydFRvb2x0aXAuU2V0KDE1MCwgMTUwLCAxMDAsIDUwKTsNCisgICAgICBwcm9wLm1fcnRXaWRnZXQgPSBydFRvb2x0aXA7DQorICAgICAgSUZXTF9Ub29sVGlwKiBwVG9vbFRpcCA9IElGV0xfVG9vbFRpcDo6Q3JlYXRlKHByb3AsIG51bGxwdHIpOw0KKyAgICAgIHBUb29sVGlwLT5Jbml0aWFsaXplKCk7DQorICAgICAgbV9wVG9vbFRpcEltcCA9IHN0YXRpY19jYXN0PENGV0xfVG9vbFRpcEltcCo+KHBUb29sVGlwLT5HZXRJbXBsKCkpOw0KKyAgICAgIG1fcFRvb2xUaXBJbXAtPk1vZGlmeVN0eWxlc0V4KEZXTF9TVFlMRUVYVF9UVFBfTXVsdGlsaW5lLCAwKTsNCisgICAgICBtX3BUb29sVGlwSW1wLT5TZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSwgVFJVRSk7DQorICAgIH0NCisgICAgaWYgKHBDdXJUYXJnZXQtPklzU2hvd2VkKCkpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0NhcHRpb247DQorICAgICAgcEN1clRhcmdldC0+R2V0Q2FwdGlvbih3c0NhcHRpb24pOw0KKyAgICAgIGlmICghd3NDYXB0aW9uLklzRW1wdHkoKSkgew0KKyAgICAgICAgbV9Ub29sVGlwRHAtPm1fd3NDYXB0aW9uID0gd3NDYXB0aW9uOw0KKyAgICAgIH0NCisgICAgICBDRlhfUmVjdEYgcnQ7DQorICAgICAgcnQuUmVzZXQoKTsNCisgICAgICBDRlhfU2l6ZUYgc3o7DQorICAgICAgc3ouUmVzZXQoKTsNCisgICAgICBwQ3VyVGFyZ2V0LT5HZXRUb29sVGlwU2l6ZShzeik7DQorICAgICAgaWYgKHN6LnggPiAwICYmIHN6LnkgPiAwKSB7DQorICAgICAgICBydC53aWR0aCA9IHN6Lng7DQorICAgICAgICBydC5oZWlnaHQgPSBzei55Ow0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfUmVjdEYgcjsNCisgICAgICAgIG1fcFRvb2xUaXBJbXAtPkdldFdpZGdldFJlY3QociwgVFJVRSk7DQorICAgICAgICBydC53aWR0aCA9IHIud2lkdGg7DQorICAgICAgICBydC5oZWlnaHQgPSByLmhlaWdodDsNCisgICAgICB9DQorICAgICAgQ0ZYX1BvaW50RiBwdDsNCisgICAgICBwdC5TZXQocEV2dC0+bV9meCwgcEV2dC0+bV9meSk7DQorICAgICAgaWYgKHBDdXJUYXJnZXQtPkdldFRvb2xUaXBQb3MocHQpID09IEZXTF9FUlJfU3VjY2VlZGVkKSB7DQorICAgICAgICBydC5sZWZ0ID0gcHQueDsNCisgICAgICAgIHJ0LnRvcCA9IHB0Lnk7DQorICAgICAgICBtX3BUb29sVGlwSW1wLT5Nb2RpZnlTdHlsZXNFeChGV0xfU1RZTEVFWFRfVFRQX05vQW5jaG9yLCAwKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX1JlY3RGIHJ0QW5jaG9yOw0KKyAgICAgICAgcEN1clRhcmdldC0+R2V0V2lkZ2V0KCktPkdldENsaWVudFJlY3QocnRBbmNob3IpOw0KKyAgICAgICAgcEN1clRhcmdldC0+R2V0V2lkZ2V0KCktPlRyYW5zZm9ybVRvKE5VTEwsIHJ0QW5jaG9yLmxlZnQsIHJ0QW5jaG9yLnRvcCk7DQorICAgICAgICBtX3BUb29sVGlwSW1wLT5TZXRBbmNob3IocnRBbmNob3IpOw0KKyAgICAgICAgbV9wVG9vbFRpcEltcC0+TW9kaWZ5U3R5bGVzRXgoMCwgRldMX1NUWUxFRVhUX1RUUF9Ob0FuY2hvcik7DQorICAgICAgfQ0KKyAgICAgIG1fcFRvb2xUaXBJbXAtPlNldFdpZGdldFJlY3QocnQpOw0KKyAgICAgIG1fcFRvb2xUaXBJbXAtPlVwZGF0ZSgpOw0KKyAgICAgIG1fcFRvb2xUaXBJbXAtPlNob3coKTsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDRldMX1Rvb2xUaXBDb250YWluZXI6OlByb2Nlc3NMZWF2ZShDRldMX0V2dE1vdXNlKiBwRXZ0KSB7DQorICBpZiAoSGFzVG9vbFRpcChwRXZ0LT5tX3BEc3RUYXJnZXQpICYmIE5VTEwgIT0gbV9wVG9vbFRpcEltcCkgew0KKyAgICBtX3BUb29sVGlwSW1wLT5IaWRlKCk7DQorICAgIHBDdXJUYXJnZXQgPSBOVUxMOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorSUZXTF9Ub29sVGlwVGFyZ2V0KiBDRldMX1Rvb2xUaXBDb250YWluZXI6OkdldEN1cnJlbnRUb29sVGlwVGFyZ2V0KCkgew0KKyAgcmV0dXJuIHBDdXJUYXJnZXQ7DQorfQ0KK0ZYX0VSUiBDRldMX1Rvb2xUaXBDb250YWluZXI6OlNldFRvb2xUaXBJbml0aWFsRGVsYXkoaW50MzJfdCBuRGVsYXlUaW1lKSB7DQorICBtX1Rvb2xUaXBEcC0+bV9uSW5pdERlbGF5VGltZSA9IG5EZWxheVRpbWU7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0VSUiBDRldMX1Rvb2xUaXBDb250YWluZXI6OlNldFRvb2xUaXBBdXRvUG9wRGVsYXkoaW50MzJfdCBuRGVsYXlUaW1lKSB7DQorICBtX1Rvb2xUaXBEcC0+bV9uQXV0b1BvcERlbGF5VGltZSA9IG5EZWxheVRpbWU7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgRldMX0FkZFRvb2xUaXBUYXJnZXQoSUZXTF9Ub29sVGlwVGFyZ2V0KiBwVGFyZ2V0KSB7DQorICByZXR1cm4gQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOjpnZXRJbnN0YW5jZSgpLT5BZGRUb29sVGlwVGFyZ2V0KHBUYXJnZXQpOw0KK30NCitGV0xfRVJSIEZXTF9SZW1vdmVUb29sVGlwVGFyZ2V0KElGV0xfVG9vbFRpcFRhcmdldCogcFRhcmdldCkgew0KKyAgcmV0dXJuIENGV0xfVG9vbFRpcENvbnRhaW5lcjo6Z2V0SW5zdGFuY2UoKS0+UmVtb3ZlVG9vbFRpcFRhcmdldChwVGFyZ2V0KTsNCit9DQorRldMX0VSUiBGV0xfU2V0VG9vbFRpcEluaXRpYWxEZWxheShpbnQzMl90IG5EZWxheVRpbWUpIHsNCisgIHJldHVybiBDRldMX1Rvb2xUaXBDb250YWluZXI6OmdldEluc3RhbmNlKCktPlNldFRvb2xUaXBJbml0aWFsRGVsYXkoDQorICAgICAgbkRlbGF5VGltZSk7DQorfQ0KK0ZXTF9FUlIgRldMX1NldFRvb2xUaXBBdXRvUG9wRGVsYXkoaW50MzJfdCBuRGVsYXlUaW1lKSB7DQorICByZXR1cm4gQ0ZXTF9Ub29sVGlwQ29udGFpbmVyOjpnZXRJbnN0YW5jZSgpLT5TZXRUb29sVGlwQXV0b1BvcERlbGF5KA0KKyAgICAgIG5EZWxheVRpbWUpOw0KK30NCitJRldMX1dpZGdldCogRldMX0dldEN1cnJlbnRUaHJlYWRNb2RhbFdpZGdldChJRldMX05vdGVUaHJlYWQqIHBOb3RlVGhyZWFkKSB7DQorICBpZiAoIXBOb3RlVGhyZWFkKQ0KKyAgICByZXR1cm4gTlVMTDsNCisgIENGV0xfTm90ZURyaXZlciogbm90ZURyaXZlciA9DQorICAgICAgc3RhdGljX2Nhc3Q8Q0ZXTF9Ob3RlRHJpdmVyKj4ocE5vdGVUaHJlYWQtPkdldE5vdGVEcml2ZXIoKSk7DQorICBpZiAoIW5vdGVEcml2ZXIpDQorICAgIHJldHVybiBOVUxMOw0KKyAgaWYgKG5vdGVEcml2ZXItPkNvdW50TG9vcCgpID09IDEpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDRldMX05vdGVMb29wKiB0b3BMb29wID0gbm90ZURyaXZlci0+R2V0VG9wTG9vcCgpOw0KKyAgaWYgKCF0b3BMb29wKQ0KKyAgICByZXR1cm4gTlVMTDsNCisgIENGV0xfV2lkZ2V0SW1wKiB3aWRnZXQgPSB0b3BMb29wLT5HZXRGb3JtKCk7DQorICBpZiAoIXdpZGdldCkNCisgICAgcmV0dXJuIE5VTEw7DQorICByZXR1cm4gd2lkZ2V0LT5HZXRJbnRlcmZhY2UoKTsNCit9DQorRldMX0VSUiBGV0xfU2V0SG9vayhJRldMX05vdGVEcml2ZXIqIGRyaXZlciwNCisgICAgICAgICAgICAgICAgICAgIEZXTE1lc3NhZ2VIb29rQ2FsbGJhY2sgY2FsbGJhY2ssDQorICAgICAgICAgICAgICAgICAgICB2b2lkKiBpbmZvKSB7DQorICBDRldMX05vdGVEcml2ZXIqIG5vdGVEcml2ZXIgPSBzdGF0aWNfY2FzdDxDRldMX05vdGVEcml2ZXIqPihkcml2ZXIpOw0KKyAgbm90ZURyaXZlci0+U2V0SG9vayhjYWxsYmFjaywgaW5mbyk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF9wYW5lbGltcC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfcGFuZWxpbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMGJhODcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfcGFuZWxpbXAuY3BwCkBAIC0wLDAgKzEsMTQ4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3RhcmdldGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9ub3RlaW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3dpZGdldGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9wYW5lbGltcC5oIg0KKw0KKy8vIHN0YXRpYw0KK0lGV0xfUGFuZWwqIElGV0xfUGFuZWw6OkNyZWF0ZShDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpIHsNCisgIElGV0xfUGFuZWwqIHBQYW5lbCA9IG5ldyBJRldMX1BhbmVsOw0KKyAgQ0ZXTF9QYW5lbEltcCogcFBhbmVsSW1wbCA9IG5ldyBDRldMX1BhbmVsSW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQorICBwUGFuZWwtPlNldEltcGwocFBhbmVsSW1wbCk7DQorICBwUGFuZWxJbXBsLT5TZXRJbnRlcmZhY2UocFBhbmVsKTsNCisgIHJldHVybiBwUGFuZWw7DQorfQ0KK0lGV0xfUGFuZWw6OklGV0xfUGFuZWwoKSB7fQ0KK0lGV0xfQ29udGVudCogSUZXTF9QYW5lbDo6R2V0Q29udGVudCgpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX1BhbmVsSW1wKj4oR2V0SW1wbCgpKS0+R2V0Q29udGVudCgpOw0KK30NCitGV0xfRVJSIElGV0xfUGFuZWw6OlNldENvbnRlbnQoSUZXTF9Db250ZW50KiBwQ29udGVudCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfUGFuZWxJbXAqPihHZXRJbXBsKCkpLT5TZXRDb250ZW50KHBDb250ZW50KTsNCit9DQorDQorQ0ZXTF9QYW5lbEltcDo6Q0ZXTF9QYW5lbEltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKQ0KKyAgICA6IENGV0xfV2lkZ2V0SW1wKHByb3BlcnRpZXMsIHBPdXRlciksIG1fcENvbnRlbnQobnVsbHB0cikge30NCitDRldMX1BhbmVsSW1wOjp+Q0ZXTF9QYW5lbEltcCgpIHt9DQorRldMX0VSUiBDRldMX1BhbmVsSW1wOjpHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2xhc3MpIGNvbnN0IHsNCisgIHdzQ2xhc3MgPSBGV0xfQ0xBU1NfUGFuZWw7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfUGFuZWxJbXA6OkdldENsYXNzSUQoKSBjb25zdCB7DQorICByZXR1cm4gRldMX0NMQVNTSEFTSF9QYW5lbDsNCit9DQorRldMX0VSUiBDRldMX1BhbmVsSW1wOjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUpIHsNCisgIGlmIChiQXV0b1NpemUpIHsNCisgICAgaWYgKG1fcENvbnRlbnQpIHsNCisgICAgICBtX3BDb250ZW50LT5HZXRXaWRnZXRSZWN0KHJlY3QsIFRSVUUpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1BhbmVsSW1wOjpVcGRhdGUoKSB7DQorICBpZiAobV9wQ29udGVudCkgew0KKyAgICBDRlhfUmVjdEYgcnRDbGllbnQ7DQorICAgIEdldENsaWVudFJlY3QocnRDbGllbnQpOw0KKyAgICBGV0xfR1JJRFVOSVQgZVdpZHRoID0gRldMX0dSSURVTklUX0ZpeGVkLCBlSGVpZ2h0ID0gRldMX0dSSURVTklUX0ZpeGVkOw0KKyAgICBJRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9IEZXTF9HZXRXaWRnZXRNZ3IoKTsNCisgICAgaWYgKCFwV2lkZ2V0TWdyKQ0KKyAgICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICAgIElGV0xfV2lkZ2V0KiBwUGFyZW50ID0NCisgICAgICAgIHBXaWRnZXRNZ3ItPkdldFdpZGdldChHZXRJbnRlcmZhY2UoKSwgRldMX1dHVFJFTEFUSU9OX1BhcmVudCk7DQorICAgIGlmIChwUGFyZW50ICYmIHBQYXJlbnQtPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX0dyaWQpIHsNCisgICAgICBJRldMX0dyaWQqIHBHcmlkID0gc3RhdGljX2Nhc3Q8SUZXTF9HcmlkKj4ocFBhcmVudCk7DQorICAgICAgcEdyaWQtPkdldFdpZGdldFNpemUoR2V0SW50ZXJmYWNlKCksIEZXTF9HUklEU0laRV9XaWR0aCwgZVdpZHRoKTsNCisgICAgICBwR3JpZC0+R2V0V2lkZ2V0U2l6ZShHZXRJbnRlcmZhY2UoKSwgRldMX0dSSURTSVpFX0hlaWdodCwgZUhlaWdodCk7DQorICAgIH0NCisgICAgbV9wQ29udGVudC0+U2V0V2lkZ2V0UmVjdChydENsaWVudCk7DQorICAgIG1fcENvbnRlbnQtPlVwZGF0ZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitJRldMX0NvbnRlbnQqIENGV0xfUGFuZWxJbXA6OkdldENvbnRlbnQoKSB7DQorICByZXR1cm4gbV9wQ29udGVudDsNCit9DQorRldMX0VSUiBDRldMX1BhbmVsSW1wOjpTZXRDb250ZW50KElGV0xfQ29udGVudCogcENvbnRlbnQpIHsNCisgIGlmICghcENvbnRlbnQpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBtX3BDb250ZW50ID0gcENvbnRlbnQ7DQorICByZXR1cm4gcENvbnRlbnQtPlNldFBhcmVudChtX3BJbnRlcmZhY2UpOw0KK30NCitjbGFzcyBDRldMX0N1c3RvbVBhbmVsSW1wIDogcHVibGljIENGV0xfV2lkZ2V0SW1wIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9DdXN0b21QYW5lbEltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpOw0KKyAgdmlydHVhbCB+Q0ZXTF9DdXN0b21QYW5lbEltcCgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBVcGRhdGUoKTsNCisgIHZpcnR1YWwgSUZXTF9Db250ZW50KiBHZXRDb250ZW50KCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0Q29udGVudChJRldMX0NvbnRlbnQqIHBDb250ZW50KTsNCisgIEZXTF9FUlIgU2V0UHJveHkoSUZXTF9Qcm94eSogcFByb3h5KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgSUZXTF9Db250ZW50KiBtX3BDb250ZW50Ow0KKyAgSUZXTF9Qcm94eSogbV9wUHJveHk7DQorfTsNCitDRldMX0N1c3RvbVBhbmVsSW1wOjpDRldMX0N1c3RvbVBhbmVsSW1wKA0KKyAgICBjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpDQorICAgIDogQ0ZXTF9XaWRnZXRJbXAocHJvcGVydGllcywgcE91dGVyKSwNCisgICAgICBtX3BDb250ZW50KG51bGxwdHIpLA0KKyAgICAgIG1fcFByb3h5KG51bGxwdHIpIHt9DQorQ0ZXTF9DdXN0b21QYW5lbEltcDo6fkNGV0xfQ3VzdG9tUGFuZWxJbXAoKSB7fQ0KK0ZXTF9FUlIgQ0ZXTF9DdXN0b21QYW5lbEltcDo6R2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsIEZYX0JPT0wgYkF1dG9TaXplKSB7DQorICBpZiAoYkF1dG9TaXplICYmIG1fcFByb3h5ICYmDQorICAgICAgKG1fcFByb3h5LT5HZXRXaWRnZXRSZWN0KHJlY3QsIGJBdXRvU2l6ZSkgPT0gRldMX0VSUl9TdWNjZWVkZWQpKSB7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIH0NCisgIHJldHVybiBDRldMX1dpZGdldEltcDo6R2V0V2lkZ2V0UmVjdChyZWN0LCBiQXV0b1NpemUpOw0KK30NCitGV0xfRVJSIENGV0xfQ3VzdG9tUGFuZWxJbXA6OlVwZGF0ZSgpIHsNCisgIGlmIChtX3BQcm94eSkgew0KKyAgICByZXR1cm4gbV9wUHJveHktPlVwZGF0ZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpVcGRhdGUoKTsNCit9DQorSUZXTF9Db250ZW50KiBDRldMX0N1c3RvbVBhbmVsSW1wOjpHZXRDb250ZW50KCkgew0KKyAgcmV0dXJuIG1fcENvbnRlbnQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9DdXN0b21QYW5lbEltcDo6U2V0Q29udGVudChJRldMX0NvbnRlbnQqIHBDb250ZW50KSB7DQorICBpZiAoIXBDb250ZW50KQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgbV9wQ29udGVudCA9IHBDb250ZW50Ow0KKyAgcmV0dXJuIHBDb250ZW50LT5TZXRQYXJlbnQobV9wSW50ZXJmYWNlKTsNCit9DQorRldMX0VSUiBDRldMX0N1c3RvbVBhbmVsSW1wOjpTZXRQcm94eShJRldMX1Byb3h5KiBwUHJveHkpIHsNCisgIG1fcFByb3h5ID0gcFByb3h5Ow0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCisNCisvLyBzdGF0dWMNCitJRldMX0N1c3RvbVBhbmVsKiBJRldMX0N1c3RvbVBhbmVsOjpDcmVhdGUoQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKSB7DQorICBJRldMX0N1c3RvbVBhbmVsKiBwQ3VzdG9tUGFuZWwgPSBuZXcgSUZXTF9DdXN0b21QYW5lbDsNCisgIENGV0xfQ3VzdG9tUGFuZWxJbXAqIHBDdXN0b21QYW5lbEltcGwgPQ0KKyAgICAgIG5ldyBDRldMX0N1c3RvbVBhbmVsSW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQorICBwQ3VzdG9tUGFuZWwtPlNldEltcGwocEN1c3RvbVBhbmVsSW1wbCk7DQorICBwQ3VzdG9tUGFuZWxJbXBsLT5TZXRJbnRlcmZhY2UocEN1c3RvbVBhbmVsKTsNCisgIHJldHVybiBwQ3VzdG9tUGFuZWw7DQorfQ0KK0lGV0xfQ3VzdG9tUGFuZWw6OklGV0xfQ3VzdG9tUGFuZWwoKSB7fQ0KK0lGV0xfQ29udGVudCogSUZXTF9DdXN0b21QYW5lbDo6R2V0Q29udGVudCgpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0N1c3RvbVBhbmVsSW1wKj4oR2V0SW1wbCgpKS0+R2V0Q29udGVudCgpOw0KK30NCitGV0xfRVJSIElGV0xfQ3VzdG9tUGFuZWw6OlNldENvbnRlbnQoSUZXTF9Db250ZW50KiBwQ29udGVudCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfQ3VzdG9tUGFuZWxJbXAqPihHZXRJbXBsKCkpLT5TZXRDb250ZW50KHBDb250ZW50KTsNCit9DQorRldMX0VSUiBJRldMX0N1c3RvbVBhbmVsOjpTZXRQcm94eShJRldMX1Byb3h5KiBwUHJveHkpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0N1c3RvbVBhbmVsSW1wKj4oR2V0SW1wbCgpKS0+U2V0UHJveHkocFByb3h5KTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3NkYWRhcHRlcmltcC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfc2RhZGFwdGVyaW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjZhNjJlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3NkYWRhcHRlcmltcC5jcHAKQEAgLTAsMCArMSwxNjggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3RocmVhZGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9ub3RlaW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3dpZGdldG1ncmltcC5oIg0KK0NGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpDRldMX1NEQWRhcHRlcldpZGdldE1ncigpIHt9DQorQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6On5DRldMX1NEQWRhcHRlcldpZGdldE1ncigpIHt9DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6Q3JlYXRlV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcFBhcmVudCkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpEZXN0cm95V2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OlNldFdpZGdldFJlY3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6U2V0V2lkZ2V0UG9zaXRpb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6U2V0UGFyZW50V2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcFBhcmVudCkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpTaG93V2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OkhpZGVXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6U2V0Tm9ybWFsKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OlNldE1heGltaXplKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OlNldE1pbmltaXplKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OlJ1bldpZGdldChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpSZXBhaW50V2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpFeGl0KGludDMyX3QgaUV4aXRDb2RlKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OkNyZWF0ZVdpZGdldFdpdGhOYXRpdmVJZChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdnApIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6R2V0V2lkZ2V0UmVjdChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcmVjdCkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpTZXRXaWRnZXRJY29uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwSWNvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkJpZykgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpTZXRXaWRnZXRDYXB0aW9uKA0KKyAgICBJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NhcHRpb24pIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6U2V0Qm9yZGVyUmVnaW9uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aCogcFBhdGgpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6U2V0VHJhbnNwYXJlbnQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdBbHBoYSkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpTZXRGdWxsU2NyZWVuKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRnVsbFNjcmVlbikgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9CT09MIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpDaGVja01lc3NhZ2UoKSB7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6SXNJZGxlTWVzc2FnZSgpIHsNCisgIHJldHVybiBUUlVFOw0KK30NCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpEaXNwYXRjaE1lc3NhZ2UoKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OkdldFdpZGdldERDKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCB2b2lkKiYgcERDKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OlJlbGVhc2VXaWRnZXREQyhJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcERDLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYqIHBDbGlwKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK3ZvaWQqIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpHZXRXaW5kb3coSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBOVUxMOw0KK30NCitGWF9EV09SRCBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6R2V0S2V5U3RhdGUoRlhfRFdPUkQgZHdWaXJ0S2V5KSB7DQorICByZXR1cm4gMDsNCit9DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6UnVuTG9vcChJRldMX1dpZGdldCogd2lkZ2V0KSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OkVuZExvb3AoKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OkluaXRNZW51KElGV0xfTWVudSogcE1lbnUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9NZW51RFAqIHBNZW51RGF0YSkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyV2lkZ2V0TWdyOjpVcGRhdGVNZW51KElGV0xfTWVudSogcE1lbnUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVR5cGUpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQoraW50MzJfdCBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6VHJhY2tQb3B1cE1lbnUoSUZXTF9NZW51KiBwTWVudSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX01lbnVEUCogcE1lbnVEYXRhKSB7DQorICByZXR1cm4gMDsNCit9DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6U2V0TWVzc2FnZUhvb2soSUZXTF9BZGFwdGVyTWVzc2FnZUhvb2sqIGhvb2spIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1NEQWRhcHRlcldpZGdldE1ncjo6R2V0U3lzdGVtQm9yZGVyKEZYX0ZMT0FUJiBsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBiKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3I6OkdldFBvcHVwUG9zKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNaW5IZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1heEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0QW5jaG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRQb3B1cCkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitDRldMX1NEQWRhcHRlclRocmVhZE1ncjo6Q0ZXTF9TREFkYXB0ZXJUaHJlYWRNZ3IoKSB7fQ0KK0NGV0xfU0RBZGFwdGVyVGhyZWFkTWdyOjp+Q0ZXTF9TREFkYXB0ZXJUaHJlYWRNZ3IoKSB7fQ0KK0ZXTF9FUlIgQ0ZXTF9TREFkYXB0ZXJUaHJlYWRNZ3I6OlN0YXJ0KElGV0xfVGhyZWFkKiBwVGhyZWFkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9IVEhSRUFEJiBoVGhyZWFkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN1c3BlbmRlZCkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyVGhyZWFkTWdyOjpSZXN1bWUoRldMX0hUSFJFQUQgaFRocmVhZCkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyVGhyZWFkTWdyOjpTdXNwZW5kKEZXTF9IVEhSRUFEIGhUaHJlYWQpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1NEQWRhcHRlclRocmVhZE1ncjo6S2lsbChGV0xfSFRIUkVBRCBoVGhyZWFkLCBpbnQzMl90IGlFeGl0Q29kZSkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfU0RBZGFwdGVyVGhyZWFkTWdyOjpTdG9wKEZXTF9IVEhSRUFEIGhUaHJlYWQsIGludDMyX3QgaUV4aXRDb2RlKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0lGV0xfVGhyZWFkKiBDRldMX1NEQWRhcHRlclRocmVhZE1ncjo6R2V0Q3VycmVudFRocmVhZCgpIHsNCisgIHJldHVybiBGV0xfR2V0QXBwKCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF90YXJnZXRpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3RhcmdldGltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU0ZjcwOQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF90YXJnZXRpbXAuY3BwCkBAIC0wLDAgKzEsNDUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmgiDQorRldMX0VSUiBJRldMX1RhcmdldDo6R2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdCB7DQorICByZXR1cm4gbV9wSW1wbC0+R2V0Q2xhc3NOYW1lKHdzQ2xhc3MpOw0KK30NCitGWF9EV09SRCBJRldMX1RhcmdldDo6R2V0Q2xhc3NJRCgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BJbXBsLT5HZXRDbGFzc0lEKCk7DQorfQ0KK0ZYX0JPT0wgSUZXTF9UYXJnZXQ6OklzSW5zdGFuY2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NsYXNzKSBjb25zdCB7DQorICByZXR1cm4gbV9wSW1wbC0+SXNJbnN0YW5jZSh3c0NsYXNzKTsNCit9DQorRldMX0VSUiBJRldMX1RhcmdldDo6SW5pdGlhbGl6ZSgpIHsNCisgIHJldHVybiBtX3BJbXBsLT5Jbml0aWFsaXplKCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9UYXJnZXQ6OkZpbmFsaXplKCkgew0KKyAgcmV0dXJuIG1fcEltcGwtPkZpbmFsaXplKCk7DQorfQ0KK0lGV0xfVGFyZ2V0Ojp+SUZXTF9UYXJnZXQoKSB7DQorICBkZWxldGUgbV9wSW1wbDsNCit9DQorQ0ZXTF9UYXJnZXRJbXA6OkNGV0xfVGFyZ2V0SW1wKCkge30NCitDRldMX1RhcmdldEltcDo6fkNGV0xfVGFyZ2V0SW1wKCkgew0KK30NCitGV0xfRVJSIENGV0xfVGFyZ2V0SW1wOjpHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2xhc3MpIGNvbnN0IHsNCisgIHdzQ2xhc3MuRW1wdHkoKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9UYXJnZXRJbXA6OkdldENsYXNzSUQoKSBjb25zdCB7DQorICByZXR1cm4gMDsNCit9DQorRlhfQk9PTCBDRldMX1RhcmdldEltcDo6SXNJbnN0YW5jZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2xhc3MpIGNvbnN0IHsNCisgIHJldHVybiBGQUxTRTsNCit9DQorRldMX0VSUiBDRldMX1RhcmdldEltcDo6SW5pdGlhbGl6ZSgpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1RhcmdldEltcDo6RmluYWxpemUoKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF90aHJlYWRpbXAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3RocmVhZGltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyY2EzNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF90aHJlYWRpbXAuY3BwCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX25vdGVpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGhyZWFkaW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX2FwcGltcC5oIg0KKw0KK3ZvaWQgSUZXTF9UaHJlYWQ6OlJlbGVhc2UoKSB7DQorICBkZWxldGUgbV9wSW1wbDsNCit9DQorRldMX0VSUiBJRldMX1RocmVhZDo6UnVuKEZXTF9IVEhSRUFEIGhUaHJlYWQpIHsNCisgIHJldHVybiBtX3BJbXBsLT5SdW4oaFRocmVhZCk7DQorfQ0KK0lGV0xfTm90ZURyaXZlciogSUZXTF9Ob3RlVGhyZWFkOjpHZXROb3RlRHJpdmVyKCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfTm90ZVRocmVhZEltcCo+KEdldEltcGwoKSktPkdldE5vdGVEcml2ZXIoKTsNCit9DQorDQorRldMX0VSUiBDRldMX1RocmVhZEltcDo6UnVuKEZXTF9IVEhSRUFEIGhUaHJlYWQpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorQ0ZXTF9Ob3RlVGhyZWFkSW1wOjpDRldMX05vdGVUaHJlYWRJbXAoSUZXTF9Ob3RlVGhyZWFkKiBwSWZhY2UpDQorICAgIDogQ0ZXTF9UaHJlYWRJbXAocElmYWNlKSwgbV9wTm90ZURyaXZlcihuZXcgQ0ZXTF9Ob3RlRHJpdmVyKSB7fQ0KK0NGV0xfTm90ZVRocmVhZEltcDo6fkNGV0xfTm90ZVRocmVhZEltcCgpIHsNCisgIGRlbGV0ZSBtX3BOb3RlRHJpdmVyOw0KK30NCitGV0xfRVJSIENGV0xfTm90ZVRocmVhZEltcDo6UnVuKEZXTF9IVEhSRUFEIGhUaHJlYWQpIHsNCisgIGlmICghbV9wTm90ZURyaXZlcikNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHJldHVybiBtX3BOb3RlRHJpdmVyLT5SdW4oKTsNCit9DQorSUZXTF9Ob3RlRHJpdmVyKiBDRldMX05vdGVUaHJlYWRJbXA6OkdldE5vdGVEcml2ZXIoKSB7DQorICByZXR1cm4gbV9wTm90ZURyaXZlcjsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3RpbWVyaW1wLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF90aW1lcmltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFkYzY2ZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2Z3bF90aW1lcmltcC5jcHAKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF90YXJnZXRpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGhyZWFkaW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX2FwcGltcC5oIg0KK0ZXTF9IVElNRVIgRldMX1N0YXJ0VGltZXIoSUZXTF9UaW1lciogcFRpbWVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdFbGFwc2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbW1lZGlhdGVseSkgew0KKyAgSUZXTF9BZGFwdGVyTmF0aXZlKiBwQWRhcHRlck5hdGl2ZSA9IEZXTF9HZXRBZGFwdGVyTmF0aXZlKCk7DQorICBpZiAoIXBBZGFwdGVyTmF0aXZlKQ0KKyAgICByZXR1cm4gTlVMTDsNCisgIElGV0xfQWRhcHRlclRpbWVyTWdyKiBwQWRhcHRlclRpbWVyTWdyID0gcEFkYXB0ZXJOYXRpdmUtPkdldFRpbWVyTWdyKCk7DQorICBpZiAoIXBBZGFwdGVyVGltZXJNZ3IpDQorICAgIHJldHVybiBOVUxMOw0KKyAgRldMX0hUSU1FUiBoVGltZXIgPSBOVUxMOw0KKyAgcEFkYXB0ZXJUaW1lck1nci0+U3RhcnQocFRpbWVyLCBkd0VsYXBzZSwgaFRpbWVyLCBiSW1tZWRpYXRlbHkpOw0KKyAgcmV0dXJuIGhUaW1lcjsNCit9DQoraW50MzJfdCBGV0xfU3RvcFRpbWVyKEZXTF9IVElNRVIgaFRpbWVyKSB7DQorICBJRldMX0FkYXB0ZXJOYXRpdmUqIHBBZGFwdGVyTmF0aXZlID0gRldMX0dldEFkYXB0ZXJOYXRpdmUoKTsNCisgIGlmICghcEFkYXB0ZXJOYXRpdmUpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBJRldMX0FkYXB0ZXJUaW1lck1nciogcEFkYXB0ZXJUaW1lck1nciA9IHBBZGFwdGVyTmF0aXZlLT5HZXRUaW1lck1ncigpOw0KKyAgaWYgKCFwQWRhcHRlclRpbWVyTWdyKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgcmV0dXJuIHBBZGFwdGVyVGltZXJNZ3ItPlN0b3AoaFRpbWVyKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3dpZGdldGltcC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfd2lkZ2V0aW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODcyZGVmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3dpZGdldGltcC5jcHAKQEAgLTAsMCArMSwxMDk5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlIDxhbGdvcml0aG0+DQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX25vdGVpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGhyZWFkaW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX2FwcGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF93aWRnZXRtZ3JpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0aW1wLmgiDQorRldMX0VSUiBJRldMX1dpZGdldDo6R2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsIEZYX0JPT0wgYkF1dG9TaXplKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9XaWRnZXRJbXAqPihHZXRJbXBsKCkpDQorICAgICAgLT5HZXRXaWRnZXRSZWN0KHJlY3QsIGJBdXRvU2l6ZSk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9XaWRnZXQ6OkdldEdsb2JhbFJlY3QoQ0ZYX1JlY3RGJiByZWN0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9XaWRnZXRJbXAqPihHZXRJbXBsKCkpLT5HZXRHbG9iYWxSZWN0KHJlY3QpOw0KK30NCitGV0xfRVJSIElGV0xfV2lkZ2V0OjpTZXRXaWRnZXRSZWN0KGNvbnN0IENGWF9SZWN0RiYgcmVjdCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0SW1wKj4oR2V0SW1wbCgpKS0+U2V0V2lkZ2V0UmVjdChyZWN0KTsNCit9DQorRldMX0VSUiBJRldMX1dpZGdldDo6R2V0Q2xpZW50UmVjdChDRlhfUmVjdEYmIHJlY3QpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX1dpZGdldEltcCo+KEdldEltcGwoKSktPkdldENsaWVudFJlY3QocmVjdCk7DQorfQ0KK0lGV0xfV2lkZ2V0KiBJRldMX1dpZGdldDo6R2V0UGFyZW50KCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0SW1wKj4oR2V0SW1wbCgpKS0+R2V0UGFyZW50KCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9XaWRnZXQ6OlNldFBhcmVudChJRldMX1dpZGdldCogcFBhcmVudCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0SW1wKj4oR2V0SW1wbCgpKS0+U2V0UGFyZW50KHBQYXJlbnQpOw0KK30NCitJRldMX1dpZGdldCogSUZXTF9XaWRnZXQ6OkdldE93bmVyKCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0SW1wKj4oR2V0SW1wbCgpKS0+R2V0T3duZXIoKTsNCit9DQorRldMX0VSUiBJRldMX1dpZGdldDo6U2V0T3duZXIoSUZXTF9XaWRnZXQqIHBPd25lcikgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0SW1wKj4oR2V0SW1wbCgpKS0+U2V0T3duZXIocE93bmVyKTsNCit9DQorSUZXTF9XaWRnZXQqIElGV0xfV2lkZ2V0OjpHZXRPdXRlcigpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX1dpZGdldEltcCo+KEdldEltcGwoKSktPkdldE91dGVyKCk7DQorfQ0KK0ZYX0RXT1JEIElGV0xfV2lkZ2V0OjpHZXRTdHlsZXMoKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9XaWRnZXRJbXAqPihHZXRJbXBsKCkpLT5HZXRTdHlsZXMoKTsNCit9DQorRldMX0VSUiBJRldMX1dpZGdldDo6TW9kaWZ5U3R5bGVzKEZYX0RXT1JEIGR3U3R5bGVzQWRkZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGVzUmVtb3ZlZCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0SW1wKj4oR2V0SW1wbCgpKQ0KKyAgICAgIC0+TW9kaWZ5U3R5bGVzKGR3U3R5bGVzQWRkZWQsIGR3U3R5bGVzUmVtb3ZlZCk7DQorfQ0KK0ZYX0RXT1JEIElGV0xfV2lkZ2V0OjpHZXRTdHlsZXNFeCgpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX1dpZGdldEltcCo+KEdldEltcGwoKSktPkdldFN0eWxlc0V4KCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9XaWRnZXQ6Ok1vZGlmeVN0eWxlc0V4KEZYX0RXT1JEIGR3U3R5bGVzRXhBZGRlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlc0V4UmVtb3ZlZCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0SW1wKj4oR2V0SW1wbCgpKQ0KKyAgICAgIC0+TW9kaWZ5U3R5bGVzRXgoZHdTdHlsZXNFeEFkZGVkLCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQorfQ0KK0ZYX0RXT1JEIElGV0xfV2lkZ2V0OjpHZXRTdGF0ZXMoKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9XaWRnZXRJbXAqPihHZXRJbXBsKCkpLT5HZXRTdGF0ZXMoKTsNCit9DQorRldMX0VSUiBJRldMX1dpZGdldDo6U2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX1dpZGdldEltcCo+KEdldEltcGwoKSktPlNldFN0YXRlcyhkd1N0YXRlcywgYlNldCk7DQorfQ0KK0ZXTF9FUlIgSUZXTF9XaWRnZXQ6OlNldFByaXZhdGVEYXRhKHZvaWQqIG1vZHVsZV9pZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjaykgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0SW1wKj4oR2V0SW1wbCgpKQ0KKyAgICAgIC0+U2V0UHJpdmF0ZURhdGEobW9kdWxlX2lkLCBwRGF0YSwgY2FsbGJhY2spOw0KK30NCit2b2lkKiBJRldMX1dpZGdldDo6R2V0UHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9XaWRnZXRJbXAqPihHZXRJbXBsKCkpLT5HZXRQcml2YXRlRGF0YShtb2R1bGVfaWQpOw0KK30NCitGV0xfRVJSIElGV0xfV2lkZ2V0OjpVcGRhdGUoKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9XaWRnZXRJbXAqPihHZXRJbXBsKCkpLT5VcGRhdGUoKTsNCit9DQorRldMX0VSUiBJRldMX1dpZGdldDo6TG9ja1VwZGF0ZSgpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX1dpZGdldEltcCo+KEdldEltcGwoKSktPkxvY2tVcGRhdGUoKTsNCit9DQorRldMX0VSUiBJRldMX1dpZGdldDo6VW5sb2NrVXBkYXRlKCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0SW1wKj4oR2V0SW1wbCgpKS0+VW5sb2NrVXBkYXRlKCk7DQorfQ0KK0ZYX0RXT1JEIElGV0xfV2lkZ2V0OjpIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0SW1wKj4oR2V0SW1wbCgpKS0+SGl0VGVzdChmeCwgZnkpOw0KK30NCitGV0xfRVJSIElGV0xfV2lkZ2V0OjpUcmFuc2Zvcm1UbyhJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZ5KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9XaWRnZXRJbXAqPihHZXRJbXBsKCkpLT5UcmFuc2Zvcm1UbyhwV2lkZ2V0LCBmeCwgZnkpOw0KK30NCitGV0xfRVJSIElGV0xfV2lkZ2V0OjpUcmFuc2Zvcm1UbyhJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX1JlY3RGJiBydCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0SW1wKj4oR2V0SW1wbCgpKS0+VHJhbnNmb3JtVG8ocFdpZGdldCwgcnQpOw0KK30NCitGV0xfRVJSIElGV0xfV2lkZ2V0OjpHZXRNYXRyaXgoQ0ZYX01hdHJpeCYgbWF0cml4LCBGWF9CT09MIGJHbG9iYWwpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX1dpZGdldEltcCo+KEdldEltcGwoKSktPkdldE1hdHJpeChtYXRyaXgsIGJHbG9iYWwpOw0KK30NCitGV0xfRVJSIElGV0xfV2lkZ2V0OjpTZXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9XaWRnZXRJbXAqPihHZXRJbXBsKCkpLT5TZXRNYXRyaXgobWF0cml4KTsNCit9DQorRldMX0VSUiBJRldMX1dpZGdldDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX1dpZGdldEltcCo+KEdldEltcGwoKSkNCisgICAgICAtPkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCit9DQorSUZXTF9UaGVtZVByb3ZpZGVyKiBJRldMX1dpZGdldDo6R2V0VGhlbWVQcm92aWRlcigpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX1dpZGdldEltcCo+KEdldEltcGwoKSktPkdldFRoZW1lUHJvdmlkZXIoKTsNCit9DQorRldMX0VSUiBJRldMX1dpZGdldDo6U2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZVByb3ZpZGVyKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9XaWRnZXRJbXAqPihHZXRJbXBsKCkpDQorICAgICAgLT5TZXRUaGVtZVByb3ZpZGVyKHBUaGVtZVByb3ZpZGVyKTsNCit9DQorRldMX0VSUiBJRldMX1dpZGdldDo6U2V0RGF0YVByb3ZpZGVyKElGV0xfRGF0YVByb3ZpZGVyKiBwRGF0YVByb3ZpZGVyKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9XaWRnZXRJbXAqPihHZXRJbXBsKCkpDQorICAgICAgLT5TZXREYXRhUHJvdmlkZXIocERhdGFQcm92aWRlcik7DQorfQ0KK0lGV0xfV2lkZ2V0RGVsZWdhdGUqIElGV0xfV2lkZ2V0OjpTZXREZWxlZ2F0ZShJRldMX1dpZGdldERlbGVnYXRlKiBwRGVsZWdhdGUpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX1dpZGdldEltcCo+KEdldEltcGwoKSktPlNldERlbGVnYXRlKHBEZWxlZ2F0ZSk7DQorfQ0KK0lGV0xfTm90ZVRocmVhZCogSUZXTF9XaWRnZXQ6OkdldE93bmVyVGhyZWFkKCkgY29uc3Qgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0SW1wKj4oR2V0SW1wbCgpKS0+R2V0T3duZXJUaHJlYWQoKTsNCit9DQorQ0ZYX1NpemVGIElGV0xfV2lkZ2V0OjpHZXRPZmZzZXRGcm9tUGFyZW50KElGV0xfV2lkZ2V0KiBwUGFyZW50KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9XaWRnZXRJbXAqPihHZXRJbXBsKCkpLT5HZXRPZmZzZXRGcm9tUGFyZW50KHBQYXJlbnQpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpJbml0aWFsaXplKCkgew0KKyAgSUZXTF9BcHAqIHBBcHAgPSBGV0xfR2V0QXBwKCk7DQorICBpZiAoIXBBcHApDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBJRldMX0FkYXB0ZXJOYXRpdmUqIHBBZGFwdGVyID0gcEFwcC0+R2V0QWRhcHRlck5hdGl2ZSgpOw0KKyAgaWYgKCFwQWRhcHRlcikNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIElGV0xfQWRhcHRlclRocmVhZE1nciogcEFkYXB0ZXJUaHJlYWQgPSBwQWRhcHRlci0+R2V0VGhyZWFkTWdyKCk7DQorICBpZiAoIXBBZGFwdGVyVGhyZWFkKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgU2V0T3duZXJUaHJlYWQoc3RhdGljX2Nhc3Q8Q0ZXTF9Ob3RlVGhyZWFkSW1wKj4oDQorICAgICAgcEFkYXB0ZXJUaHJlYWQtPkdldEN1cnJlbnRUaHJlYWQoKS0+R2V0SW1wbCgpKSk7DQorICBJRldMX1dpZGdldCogcFBhcmVudCA9IG1fcFByb3BlcnRpZXMtPm1fcFBhcmVudDsNCisgIG1fcFdpZGdldE1nci0+SW5zZXJ0V2lkZ2V0KHBQYXJlbnQsIG1fcEludGVyZmFjZSk7DQorICBpZiAoIUlzQ2hpbGQoKSkgew0KKyAgICB7DQorICAgICAgSUZXTF9XaWRnZXQqIHBPd25lciA9IG1fcFByb3BlcnRpZXMtPm1fcE93bmVyOw0KKyAgICAgIGlmIChwT3duZXIpIHsNCisgICAgICAgIG1fcFdpZGdldE1nci0+U2V0T3duZXIocE93bmVyLCBtX3BJbnRlcmZhY2UpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBtX3BXaWRnZXRNZ3ItPkNyZWF0ZVdpZGdldF9OYXRpdmUobV9wSW50ZXJmYWNlKTsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6RmluYWxpemUoKSB7DQorICBOb3RpZnlEcml2ZXIoKTsNCisgIElGV0xfRm9ybSogcEZvcm0gPSBzdGF0aWNfY2FzdDxJRldMX0Zvcm0qPigNCisgICAgICBGV0xfR2V0V2lkZ2V0TWdyKCktPkdldFdpZGdldChtX3BJbnRlcmZhY2UsIEZXTF9XR1RSRUxBVElPTl9TeXN0ZW1Gb3JtKSk7DQorICBpZiAocEZvcm0gJiYgcEZvcm0gIT0gbV9wSW50ZXJmYWNlKSB7DQorICAgIElGV0xfQ29udGVudCogcENvbnRlbnQgPSBwRm9ybS0+R2V0Q29udGVudCgpOw0KKyAgICBpZiAocENvbnRlbnQpIHsNCisgICAgICBwQ29udGVudC0+UmVtb3ZlV2lkZ2V0KG1fcEludGVyZmFjZSk7DQorICAgIH0NCisgIH0NCisgIGlmICghSXNDaGlsZCgpKSB7DQorICAgIG1fcFdpZGdldE1nci0+RGVzdHJveVdpZGdldF9OYXRpdmUobV9wSW50ZXJmYWNlKTsNCisgIH0NCisgIG1fcFdpZGdldE1nci0+UmVtb3ZlV2lkZ2V0KG1fcEludGVyZmFjZSk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXA6OkdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSkgew0KKyAgaWYgKGJBdXRvU2l6ZSkgew0KKyAgICBpZiAoSGFzRWRnZSgpKSB7DQorICAgICAgRlhfRkxPQVQgZkVkZ2UgPSBHZXRFZGdlV2lkdGgoKTsNCisgICAgICByZWN0LkluZmxhdGUoZkVkZ2UsIGZFZGdlKTsNCisgICAgfQ0KKyAgICBpZiAoSGFzQm9yZGVyKCkpIHsNCisgICAgICBGWF9GTE9BVCBmQm9yZGVyID0gR2V0Qm9yZGVyU2l6ZSgpOw0KKyAgICAgIHJlY3QuSW5mbGF0ZShmQm9yZGVyLCBmQm9yZGVyKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgcmVjdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXA6OkdldEdsb2JhbFJlY3QoQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBJRldMX1dpZGdldCogcEZvcm0gPQ0KKyAgICAgIG1fcFdpZGdldE1nci0+R2V0V2lkZ2V0KG1fcEludGVyZmFjZSwgRldMX1dHVFJFTEFUSU9OX1N5c3RlbUZvcm0pOw0KKyAgaWYgKCFwRm9ybSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHJlY3QuU2V0KDAsIDAsIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQud2lkdGgsDQorICAgICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmhlaWdodCk7DQorICBpZiAocEZvcm0gPT0gbV9wSW50ZXJmYWNlKSB7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIH0NCisgIHJldHVybiBUcmFuc2Zvcm1UbyhwRm9ybSwgcmVjdCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXA6OlNldFdpZGdldFJlY3QoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBDRlhfUmVjdEYgcnRPbGQgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldCA9IHJlY3Q7DQorICBpZiAoSXNDaGlsZCgpKSB7DQorICAgIGlmIChGWFNZU19mYWJzKHJ0T2xkLndpZHRoIC0gcmVjdC53aWR0aCkgPiAwLjVmIHx8DQorICAgICAgICBGWFNZU19mYWJzKHJ0T2xkLmhlaWdodCAtIHJlY3QuaGVpZ2h0KSA+IDAuNWYpIHsNCisgICAgICBDRldMX0V2dFNpemVDaGFuZ2VkIGV2Ow0KKyAgICAgIGV2Lm1fcFNyY1RhcmdldCA9IG1fcEludGVyZmFjZTsNCisgICAgICBldi5tX3J0T2xkID0gcnRPbGQ7DQorICAgICAgZXYubV9ydE5ldyA9IHJlY3Q7DQorICAgICAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogcERlbGVnYXRlID0gU2V0RGVsZWdhdGUoTlVMTCk7DQorICAgICAgaWYgKHBEZWxlZ2F0ZSkgew0KKyAgICAgICAgcERlbGVnYXRlLT5PblByb2Nlc3NFdmVudCgmZXYpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICBtX3BXaWRnZXRNZ3ItPlNldFdpZGdldFJlY3RfTmF0aXZlKG1fcEludGVyZmFjZSwgcmVjdCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXA6OkdldENsaWVudFJlY3QoQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBHZXRFZGdlUmVjdChyZWN0KTsNCisgIGlmIChIYXNFZGdlKCkpIHsNCisgICAgRlhfRkxPQVQgZkVkZ2UgPSBHZXRFZGdlV2lkdGgoKTsNCisgICAgcmVjdC5EZWZsYXRlKGZFZGdlLCBmRWRnZSk7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0lGV0xfV2lkZ2V0KiBDRldMX1dpZGdldEltcDo6R2V0UGFyZW50KCkgew0KKyAgcmV0dXJuIG1fcFdpZGdldE1nci0+R2V0V2lkZ2V0KG1fcEludGVyZmFjZSwgRldMX1dHVFJFTEFUSU9OX1BhcmVudCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXA6OlNldFBhcmVudChJRldMX1dpZGdldCogcFBhcmVudCkgew0KKyAgbV9wUHJvcGVydGllcy0+bV9wUGFyZW50ID0gcFBhcmVudDsNCisgIG1fcFdpZGdldE1nci0+U2V0UGFyZW50KHBQYXJlbnQsIG1fcEludGVyZmFjZSk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0lGV0xfV2lkZ2V0KiBDRldMX1dpZGdldEltcDo6R2V0T3duZXIoKSB7DQorICByZXR1cm4gbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXQobV9wSW50ZXJmYWNlLCBGV0xfV0dUUkVMQVRJT05fT3duZXIpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpTZXRPd25lcihJRldMX1dpZGdldCogcE93bmVyKSB7DQorICBtX3BQcm9wZXJ0aWVzLT5tX3BPd25lciA9IHBPd25lcjsNCisgIG1fcFdpZGdldE1nci0+U2V0T3duZXIocE93bmVyLCBtX3BJbnRlcmZhY2UpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitJRldMX1dpZGdldCogQ0ZXTF9XaWRnZXRJbXA6OkdldE91dGVyKCkgew0KKyAgcmV0dXJuIG1fcE91dGVyOw0KK30NCitGWF9EV09SRCBDRldMX1dpZGdldEltcDo6R2V0U3R5bGVzKCkgew0KKyAgcmV0dXJuIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXM7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXA6Ok1vZGlmeVN0eWxlcyhGWF9EV09SRCBkd1N0eWxlc0FkZGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlc1JlbW92ZWQpIHsNCisgIG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgPQ0KKyAgICAgIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgfmR3U3R5bGVzUmVtb3ZlZCkgfCBkd1N0eWxlc0FkZGVkOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9EV09SRCBDRldMX1dpZGdldEltcDo6R2V0U3R5bGVzRXgoKSB7DQorICByZXR1cm4gbV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlczsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6TW9kaWZ5U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKSB7DQorICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzID0NCisgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIH5kd1N0eWxlc0V4UmVtb3ZlZCkgfCBkd1N0eWxlc0V4QWRkZWQ7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0RXT1JEIENGV0xfV2lkZ2V0SW1wOjpHZXRTdGF0ZXMoKSB7DQorICByZXR1cm4gbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlczsNCit9DQorc3RhdGljIHZvaWQgTm90aWZ5SGlkZUNoaWxkV2lkZ2V0KElGV0xfV2lkZ2V0TWdyKiB3aWRnZXRNZ3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiB3aWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGV0xfTm90ZURyaXZlciogbm90ZURyaXZlcikgew0KKyAgSUZXTF9XaWRnZXQqIGNoaWxkID0gd2lkZ2V0TWdyLT5HZXRXaWRnZXQod2lkZ2V0LCBGV0xfV0dUUkVMQVRJT05fRmlyc3RDaGlsZCk7DQorICB3aGlsZSAoY2hpbGQpIHsNCisgICAgbm90ZURyaXZlci0+Tm90aWZ5VGFyZ2V0SGlkZShjaGlsZCk7DQorICAgIE5vdGlmeUhpZGVDaGlsZFdpZGdldCh3aWRnZXRNZ3IsIGNoaWxkLCBub3RlRHJpdmVyKTsNCisgICAgY2hpbGQgPSB3aWRnZXRNZ3ItPkdldFdpZGdldChjaGlsZCwgRldMX1dHVFJFTEFUSU9OX05leHRTaWJsaW5nKTsNCisgIH0NCit9DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6U2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQpIHsNCisgIGJTZXQgPyAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyB8PSBkd1N0YXRlcykNCisgICAgICAgOiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+ZHdTdGF0ZXMpOw0KKyAgRldMX0VSUiByZXQgPSBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIGlmIChkd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9JbnZpc2libGUpIHsNCisgICAgaWYgKGJTZXQpIHsNCisgICAgICByZXQgPSBtX3BXaWRnZXRNZ3ItPkhpZGVXaWRnZXRfTmF0aXZlKG1fcEludGVyZmFjZSk7DQorICAgICAgQ0ZXTF9Ob3RlRHJpdmVyKiBub3RlRHJpdmVyID0NCisgICAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZXTF9Ob3RlRHJpdmVyKj4oR2V0T3duZXJUaHJlYWQoKS0+R2V0Tm90ZURyaXZlcigpKTsNCisgICAgICBJRldMX1dpZGdldE1nciogd2lkZ2V0TWdyID0gRldMX0dldFdpZGdldE1ncigpOw0KKyAgICAgIG5vdGVEcml2ZXItPk5vdGlmeVRhcmdldEhpZGUobV9wSW50ZXJmYWNlKTsNCisgICAgICBJRldMX1dpZGdldCogY2hpbGQgPQ0KKyAgICAgICAgICB3aWRnZXRNZ3ItPkdldFdpZGdldChtX3BJbnRlcmZhY2UsIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkKTsNCisgICAgICB3aGlsZSAoY2hpbGQpIHsNCisgICAgICAgIG5vdGVEcml2ZXItPk5vdGlmeVRhcmdldEhpZGUoY2hpbGQpOw0KKyAgICAgICAgTm90aWZ5SGlkZUNoaWxkV2lkZ2V0KHdpZGdldE1nciwgY2hpbGQsIG5vdGVEcml2ZXIpOw0KKyAgICAgICAgY2hpbGQgPSB3aWRnZXRNZ3ItPkdldFdpZGdldChjaGlsZCwgRldMX1dHVFJFTEFUSU9OX05leHRTaWJsaW5nKTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgcmV0ID0gbV9wV2lkZ2V0TWdyLT5TaG93V2lkZ2V0X05hdGl2ZShtX3BJbnRlcmZhY2UpOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gcmV0Ow0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpTZXRQcml2YXRlRGF0YSh2b2lkKiBtb2R1bGVfaWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcERhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2spIHsNCisgIGlmICghbV9wUHJpdmF0ZURhdGEpIHsNCisgICAgbV9wUHJpdmF0ZURhdGEgPSBuZXcgQ0ZYX1ByaXZhdGVEYXRhOw0KKyAgfQ0KKyAgbV9wUHJpdmF0ZURhdGEtPlNldFByaXZhdGVEYXRhKG1vZHVsZV9pZCwgcERhdGEsIGNhbGxiYWNrKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQordm9pZCogQ0ZXTF9XaWRnZXRJbXA6OkdldFByaXZhdGVEYXRhKHZvaWQqIG1vZHVsZV9pZCkgew0KKyAgaWYgKCFtX3BQcml2YXRlRGF0YSkNCisgICAgcmV0dXJuIE5VTEw7DQorICByZXR1cm4gbV9wUHJpdmF0ZURhdGEtPkdldFByaXZhdGVEYXRhKG1vZHVsZV9pZCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXA6OlVwZGF0ZSgpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6TG9ja1VwZGF0ZSgpIHsNCisgIG1faUxvY2srKzsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6VW5sb2NrVXBkYXRlKCkgew0KKyAgaWYgKElzTG9ja2VkKCkpIHsNCisgICAgbV9pTG9jay0tOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9EV09SRCBDRldMX1dpZGdldEltcDo6SGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIENGWF9SZWN0RiBydENsaWVudDsNCisgIEdldENsaWVudFJlY3QocnRDbGllbnQpOw0KKyAgaWYgKHJ0Q2xpZW50LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0NsaWVudDsNCisgIH0NCisgIGlmIChIYXNFZGdlKCkpIHsNCisgICAgQ0ZYX1JlY3RGIHJ0RWRnZTsNCisgICAgR2V0RWRnZVJlY3QocnRFZGdlKTsNCisgICAgaWYgKHJ0RWRnZS5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0VkZ2U7DQorICAgIH0NCisgIH0NCisgIGlmIChIYXNCb3JkZXIoKSkgew0KKyAgICBDRlhfUmVjdEYgcnRSZWxhdGl2ZTsNCisgICAgR2V0UmVsYXRpdmVSZWN0KHJ0UmVsYXRpdmUpOw0KKyAgICBpZiAocnRSZWxhdGl2ZS5Db250YWlucyhmeCwgZnkpKSB7DQorICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0JvcmRlcjsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1Vua25vd247DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXA6OlRyYW5zZm9ybVRvKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZnkpIHsNCisgIGlmIChtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgQ0ZYX1NpemVGIHN6T2Zmc2V0Ow0KKyAgICBpZiAoSXNQYXJlbnQocFdpZGdldCkpIHsNCisgICAgICBzek9mZnNldCA9IEdldE9mZnNldEZyb21QYXJlbnQocFdpZGdldCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgc3pPZmZzZXQgPSBwV2lkZ2V0LT5HZXRPZmZzZXRGcm9tUGFyZW50KG1fcEludGVyZmFjZSk7DQorICAgICAgc3pPZmZzZXQueCA9IC1zek9mZnNldC54Ow0KKyAgICAgIHN6T2Zmc2V0LnkgPSAtc3pPZmZzZXQueTsNCisgICAgfQ0KKyAgICBmeCArPSBzek9mZnNldC54Ow0KKyAgICBmeSArPSBzek9mZnNldC55Ow0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICBDRlhfUmVjdEYgcjsNCisgIENGWF9NYXRyaXggbTsNCisgIElGV0xfV2lkZ2V0KiBwYXJlbnQgPSBHZXRQYXJlbnQoKTsNCisgIGlmIChwYXJlbnQpIHsNCisgICAgR2V0V2lkZ2V0UmVjdChyKTsNCisgICAgZnggKz0gci5sZWZ0Ow0KKyAgICBmeSArPSByLnRvcDsNCisgICAgR2V0TWF0cml4KG0sIFRSVUUpOw0KKyAgICBtLlRyYW5zZm9ybVBvaW50KGZ4LCBmeSk7DQorICB9DQorICBJRldMX1dpZGdldCogZm9ybTEgPQ0KKyAgICAgIG1fcFdpZGdldE1nci0+R2V0V2lkZ2V0KG1fcEludGVyZmFjZSwgRldMX1dHVFJFTEFUSU9OX1N5c3RlbUZvcm0pOw0KKyAgaWYgKCFmb3JtMSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIGlmICghcFdpZGdldCkgew0KKyAgICBmb3JtMS0+R2V0V2lkZ2V0UmVjdChyKTsNCisgICAgZnggKz0gci5sZWZ0Ow0KKyAgICBmeSArPSByLnRvcDsNCisjaWZkZWYgRldMX1VzZU1hY1N5c3RlbUJvcmRlcg0KKyAgICBpZiAoZm9ybTEtPkdldFN0eWxlcygpICYgRldMX1dHVFNUWUxFX0NhcHRpb24pIHsNCisgICAgICBGWF9GTE9BVCBsLCB0LCByLCBiOw0KKyAgICAgIGwgPSB0ID0gciA9IGIgPSAwOw0KKyAgICAgIEZXTF9HZXRBZGFwdGVyV2lkZ2V0TWdyKCktPkdldFN5c3RlbUJvcmRlcihsLCB0LCByLCBiKTsNCisgICAgICBmeSArPSB0Ow0KKyAgICB9DQorI2VuZGlmDQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIH0NCisgIElGV0xfV2lkZ2V0KiBmb3JtMiA9DQorICAgICAgbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXQocFdpZGdldCwgRldMX1dHVFJFTEFUSU9OX1N5c3RlbUZvcm0pOw0KKyAgaWYgKCFmb3JtMikNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIGlmIChmb3JtMSAhPSBmb3JtMikgew0KKyAgICBmb3JtMS0+R2V0V2lkZ2V0UmVjdChyKTsNCisgICAgZnggKz0gci5sZWZ0Ow0KKyAgICBmeSArPSByLnRvcDsNCisgICAgZm9ybTItPkdldFdpZGdldFJlY3Qocik7DQorICAgIGZ4IC09IHIubGVmdDsNCisgICAgZnkgLT0gci50b3A7DQorI2lmZGVmIEZXTF9Vc2VNYWNTeXN0ZW1Cb3JkZXINCisgICAgaWYgKChmb3JtMS0+R2V0U3R5bGVzKCkgJiBGV0xfV0dUU1RZTEVfQ2FwdGlvbikgIT0NCisgICAgICAgIChmb3JtMi0+R2V0U3R5bGVzKCkgJiBGV0xfV0dUU1RZTEVfQ2FwdGlvbikpIHsNCisgICAgICBGWF9GTE9BVCBsLCB0LCByLCBiOw0KKyAgICAgIGwgPSB0ID0gciA9IGIgPSAwOw0KKyAgICAgIEZXTF9HZXRBZGFwdGVyV2lkZ2V0TWdyKCktPkdldFN5c3RlbUJvcmRlcihsLCB0LCByLCBiKTsNCisgICAgICAoZm9ybTEtPkdldFN0eWxlcygpICYgRldMX1dHVFNUWUxFX0NhcHRpb24pID8gKGZ5ICs9IHQpIDogKGZ5IC09IHQpOw0KKyAgICB9DQorI2VuZGlmDQorICB9DQorICBwYXJlbnQgPSBwV2lkZ2V0LT5HZXRQYXJlbnQoKTsNCisgIGlmIChwYXJlbnQpIHsNCisgICAgcFdpZGdldC0+R2V0TWF0cml4KG0sIFRSVUUpOw0KKyAgICBDRlhfTWF0cml4IG0xOw0KKyAgICBtMS5TZXRJZGVudGl0eSgpOw0KKyAgICBtMS5TZXRSZXZlcnNlKG0pOw0KKyAgICBtMS5UcmFuc2Zvcm1Qb2ludChmeCwgZnkpOw0KKyAgICBwV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHIpOw0KKyAgICBmeCAtPSByLmxlZnQ7DQorICAgIGZ5IC09IHIudG9wOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpUcmFuc2Zvcm1UbyhJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX1JlY3RGJiBydCkgew0KKyAgcmV0dXJuIFRyYW5zZm9ybVRvKHBXaWRnZXQsIHJ0LmxlZnQsIHJ0LnRvcCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXA6OkdldE1hdHJpeChDRlhfTWF0cml4JiBtYXRyaXgsIEZYX0JPT0wgYkdsb2JhbCkgew0KKyAgaWYgKCFtX3BQcm9wZXJ0aWVzKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgaWYgKGJHbG9iYWwpIHsNCisgICAgSUZXTF9XaWRnZXQqIHBhcmVudCA9IEdldFBhcmVudCgpOw0KKyAgICBDRlhfUHRyQXJyYXkgcGFyZW50czsNCisgICAgd2hpbGUgKHBhcmVudCkgew0KKyAgICAgIHBhcmVudHMuQWRkKHBhcmVudCk7DQorICAgICAgcGFyZW50ID0gcGFyZW50LT5HZXRQYXJlbnQoKTsNCisgICAgfQ0KKyAgICBtYXRyaXguU2V0SWRlbnRpdHkoKTsNCisgICAgQ0ZYX01hdHJpeCBjdG1PblBhcmVudDsNCisgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgIGludDMyX3QgY291bnQgPSBwYXJlbnRzLkdldFNpemUoKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSBjb3VudCAtIDI7IGkgPj0gMDsgaS0tKSB7DQorICAgICAgcGFyZW50ID0gc3RhdGljX2Nhc3Q8SUZXTF9XaWRnZXQqPihwYXJlbnRzLkdldEF0KGkpKTsNCisgICAgICBwYXJlbnQtPkdldE1hdHJpeChjdG1PblBhcmVudCwgRkFMU0UpOw0KKyAgICAgIHBhcmVudC0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgICAgICBtYXRyaXguQ29uY2F0KGN0bU9uUGFyZW50LCBUUlVFKTsNCisgICAgICBtYXRyaXguVHJhbnNsYXRlKHJlY3QubGVmdCwgcmVjdC50b3AsIFRSVUUpOw0KKyAgICB9DQorICAgIG1hdHJpeC5Db25jYXQobV9wUHJvcGVydGllcy0+bV9jdG1PblBhcmVudCwgVFJVRSk7DQorICAgIHBhcmVudHMuUmVtb3ZlQWxsKCk7DQorICB9IGVsc2Ugew0KKyAgICBtYXRyaXggPSBtX3BQcm9wZXJ0aWVzLT5tX2N0bU9uUGFyZW50Ow0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpTZXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7DQorICBpZiAoIW1fcFByb3BlcnRpZXMpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBJRldMX1dpZGdldCogcGFyZW50ID0gR2V0UGFyZW50KCk7DQorICBpZiAoIXBhcmVudCkgew0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgfQ0KKyAgbV9wUHJvcGVydGllcy0+bV9jdG1PblBhcmVudCA9IG1hdHJpeDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorfQ0KK0lGV0xfVGhlbWVQcm92aWRlciogQ0ZXTF9XaWRnZXRJbXA6OkdldFRoZW1lUHJvdmlkZXIoKSB7DQorICByZXR1cm4gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldEltcDo6U2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZVByb3ZpZGVyKSB7DQorICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gcFRoZW1lUHJvdmlkZXI7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRJbXA6OlNldERhdGFQcm92aWRlcihJRldMX0RhdGFQcm92aWRlciogcERhdGFQcm92aWRlcikgew0KKyAgbV9wUHJvcGVydGllcy0+bV9wRGF0YVByb3ZpZGVyID0gcERhdGFQcm92aWRlcjsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorSUZXTF9XaWRnZXREZWxlZ2F0ZSogQ0ZXTF9XaWRnZXRJbXA6OlNldERlbGVnYXRlKA0KKyAgICBJRldMX1dpZGdldERlbGVnYXRlKiBwRGVsZWdhdGUpIHsNCisgIGlmICghbV9wQ3VyRGVsZWdhdGUpIHsNCisgICAgbV9wQ3VyRGVsZWdhdGUgPSBtX3BEZWxlZ2F0ZTsNCisgIH0NCisgIGlmICghcERlbGVnYXRlKSB7DQorICAgIHJldHVybiBtX3BDdXJEZWxlZ2F0ZTsNCisgIH0NCisgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBPbGREZWxlZ2F0ZSA9IG1fcEN1ckRlbGVnYXRlOw0KKyAgbV9wQ3VyRGVsZWdhdGUgPSBwRGVsZWdhdGU7DQorICByZXR1cm4gcE9sZERlbGVnYXRlOw0KK30NCitJRldMX05vdGVUaHJlYWQqIENGV0xfV2lkZ2V0SW1wOjpHZXRPd25lclRocmVhZCgpIGNvbnN0IHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX05vdGVUaHJlYWQqPihtX3BPd25lclRocmVhZC0+R2V0SW50ZXJmYWNlKCkpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0SW1wOjpTZXRPd25lclRocmVhZChDRldMX05vdGVUaHJlYWRJbXAqIHBPd25lclRocmVhZCkgew0KKyAgbV9wT3duZXJUaHJlYWQgPSBwT3duZXJUaHJlYWQ7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0lGV0xfV2lkZ2V0KiBDRldMX1dpZGdldEltcDo6R2V0SW50ZXJmYWNlKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fcEludGVyZmFjZTsNCit9DQordm9pZCBDRldMX1dpZGdldEltcDo6U2V0SW50ZXJmYWNlKElGV0xfV2lkZ2V0KiBwSW50ZXJmYWNlKSB7DQorICBtX3BJbnRlcmZhY2UgPSBwSW50ZXJmYWNlOw0KK30NCitDRldMX1dpZGdldEltcDo6Q0ZXTF9XaWRnZXRJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKQ0KKyAgICA6IG1fcFByb3BlcnRpZXMobmV3IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyksDQorICAgICAgbV9wUHJpdmF0ZURhdGEoTlVMTCksDQorICAgICAgbV9wRGVsZWdhdGUoTlVMTCksDQorICAgICAgbV9wQ3VyRGVsZWdhdGUoTlVMTCksDQorICAgICAgbV9wT3V0ZXIocE91dGVyKSwNCisgICAgICBtX3BJbnRlcmZhY2UoTlVMTCksDQorICAgICAgbV9pTG9jaygwKSB7DQorICAqbV9wUHJvcGVydGllcyA9IHByb3BlcnRpZXM7DQorICBtX3BXaWRnZXRNZ3IgPSBzdGF0aWNfY2FzdDxDRldMX1dpZGdldE1ncio+KEZXTF9HZXRXaWRnZXRNZ3IoKSk7DQorICBGWFNZU19hc3NlcnQobV9wV2lkZ2V0TWdyICE9IE5VTEwpOw0KK30NCitDRldMX1dpZGdldEltcDo6fkNGV0xfV2lkZ2V0SW1wKCkgew0KKyAgaWYgKG1fcFByaXZhdGVEYXRhKSB7DQorICAgIGRlbGV0ZSBtX3BQcml2YXRlRGF0YTsNCisgICAgbV9wUHJpdmF0ZURhdGEgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcFByb3BlcnRpZXMpIHsNCisgICAgZGVsZXRlIG1fcFByb3BlcnRpZXM7DQorICAgIG1fcFByb3BlcnRpZXMgPSBOVUxMOw0KKyAgfQ0KK30NCitGWF9CT09MIENGV0xfV2lkZ2V0SW1wOjpJc0VuYWJsZWQoKSBjb25zdCB7DQorICByZXR1cm4gKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRGlzYWJsZWQpID09IDA7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRJbXA6OklzVmlzaWJsZSgpIGNvbnN0IHsNCisgIHJldHVybiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9JbnZpc2libGUpID09IDA7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRJbXA6OklzQWN0aXZlKCkgY29uc3Qgew0KKyAgcmV0dXJuIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0RlYWN0aXZhdGVkKSA9PSAwOw0KK30NCitGWF9CT09MIENGV0xfV2lkZ2V0SW1wOjpJc092ZXJMYXBwZXIoKSBjb25zdCB7DQorICByZXR1cm4gKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfV2luZG93VHlwZU1hc2spID09DQorICAgICAgICAgRldMX1dHVFNUWUxFX092ZXJMYXBwZXI7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRJbXA6OklzUG9wdXAoKSBjb25zdCB7DQorICByZXR1cm4gISEobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9Qb3B1cCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRJbXA6OklzQ2hpbGQoKSBjb25zdCB7DQorICByZXR1cm4gISEobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9DaGlsZCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRJbXA6OklzTG9ja2VkKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1faUxvY2sgPiAwOw0KK30NCitGWF9CT09MIENGV0xfV2lkZ2V0SW1wOjpJc09mZnNjcmVlbigpIGNvbnN0IHsNCisgIHJldHVybiAhIShtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX09mZnNjcmVlbik7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRJbXA6Okhhc0JvcmRlcigpIGNvbnN0IHsNCisgIHJldHVybiAhIShtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVzICYgRldMX1dHVFNUWUxFX0JvcmRlcik7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRJbXA6Okhhc0VkZ2UoKSBjb25zdCB7DQorICByZXR1cm4gISEobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9FZGdlTWFzayk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRJbXA6OkdldEVkZ2VSZWN0KENGWF9SZWN0RiYgcnRFZGdlKSB7DQorICBydEVkZ2UgPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0Ow0KKyAgcnRFZGdlLmxlZnQgPSBydEVkZ2UudG9wID0gMDsNCisgIGlmIChIYXNCb3JkZXIoKSkgew0KKyAgICBGWF9GTE9BVCBmQ1ggPSBHZXRCb3JkZXJTaXplKCk7DQorICAgIEZYX0ZMT0FUIGZDWSA9IEdldEJvcmRlclNpemUoRkFMU0UpOw0KKyAgICBydEVkZ2UuRGVmbGF0ZShmQ1gsIGZDWSk7DQorICB9DQorfQ0KK0ZYX0ZMT0FUIENGV0xfV2lkZ2V0SW1wOjpHZXRCb3JkZXJTaXplKEZYX0JPT0wgYkNYKSB7DQorICBGWF9GTE9BVCogcGZCb3JkZXIgPSBzdGF0aWNfY2FzdDxGWF9GTE9BVCo+KEdldFRoZW1lQ2FwYWNpdHkoDQorICAgICAgYkNYID8gRldMX1dHVENBUEFDSVRZX0NYQm9yZGVyIDogRldMX1dHVENBUEFDSVRZX0NZQm9yZGVyKSk7DQorICBpZiAoIXBmQm9yZGVyKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiAqcGZCb3JkZXI7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfV2lkZ2V0SW1wOjpHZXRFZGdlV2lkdGgoKSB7DQorICBGWF9EV09SRCBkd0NhcGFjaXR5ID0gMDsNCisgIHN3aXRjaCAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9FZGdlTWFzaykgew0KKyAgICBjYXNlIEZXTF9XR1RTVFlMRV9FZGdlRmxhdDogew0KKyAgICAgIGR3Q2FwYWNpdHkgPSBGV0xfV0dUQ0FQQUNJVFlfRWRnZUZsYXQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUU1RZTEVfRWRnZVJhaXNlZDogew0KKyAgICAgIGR3Q2FwYWNpdHkgPSBGV0xfV0dUQ0FQQUNJVFlfRWRnZVJhaXNlZDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RTVFlMRV9FZGdlU3Vua2VuOiB7DQorICAgICAgZHdDYXBhY2l0eSA9IEZXTF9XR1RDQVBBQ0lUWV9FZGdlU3Vua2VuOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpZiAoZHdDYXBhY2l0eSA+IDApIHsNCisgICAgRlhfRkxPQVQqIGZSZXQgPSBzdGF0aWNfY2FzdDxGWF9GTE9BVCo+KEdldFRoZW1lQ2FwYWNpdHkoZHdDYXBhY2l0eSkpOw0KKyAgICByZXR1cm4gZlJldCA/ICpmUmV0IDogMDsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0SW1wOjpHZXRSZWxhdGl2ZVJlY3QoQ0ZYX1JlY3RGJiByZWN0KSB7DQorICByZWN0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldDsNCisgIHJlY3QubGVmdCA9IHJlY3QudG9wID0gMDsNCit9DQordm9pZCogQ0ZXTF9XaWRnZXRJbXA6OkdldFRoZW1lQ2FwYWNpdHkoRlhfRFdPUkQgZHdDYXBhY2l0eSkgew0KKyAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUgPSBHZXRBdmFpbGFibGVUaGVtZSgpOw0KKyAgaWYgKCFwVGhlbWUpDQorICAgIHJldHVybiBOVUxMOw0KKyAgQ0ZXTF9UaGVtZVBhcnQgcGFydDsNCisgIHBhcnQubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcmV0dXJuIHBUaGVtZS0+R2V0Q2FwYWNpdHkoJnBhcnQsIGR3Q2FwYWNpdHkpOw0KK30NCitJRldMX1RoZW1lUHJvdmlkZXIqIENGV0xfV2lkZ2V0SW1wOjpHZXRBdmFpbGFibGVUaGVtZSgpIHsNCisgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKSB7DQorICAgIHJldHVybiBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOw0KKyAgfQ0KKyAgSUZXTF9XaWRnZXQqIHBVcCA9IG1fcEludGVyZmFjZTsNCisgIGRvIHsNCisgICAgRldMX1dHVFJFTEFUSU9OIHJlbGF0aW9uID0gKHBVcC0+R2V0U3R5bGVzKCkgJiBGV0xfV0dUU1RZTEVfUG9wdXApDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEZXTF9XR1RSRUxBVElPTl9Pd25lcg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGV0xfV0dUUkVMQVRJT05fUGFyZW50Ow0KKyAgICBwVXAgPSBtX3BXaWRnZXRNZ3ItPkdldFdpZGdldChwVXAsIHJlbGF0aW9uKTsNCisgICAgaWYgKHBVcCkgew0KKyAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFJldCA9IHBVcC0+R2V0VGhlbWVQcm92aWRlcigpOw0KKyAgICAgIGlmIChwUmV0ICYmIHBSZXQtPklzVmFsaWRXaWRnZXQobV9wSW50ZXJmYWNlKSkgew0KKyAgICAgICAgcmV0dXJuIHBSZXQ7DQorICAgICAgfQ0KKyAgICB9DQorICB9IHdoaWxlIChwVXApOw0KKyAgcmV0dXJuIEZXTF9HZXRBcHAoKS0+R2V0VGhlbWVQcm92aWRlcigpOw0KK30NCitDRldMX1dpZGdldEltcCogQ0ZXTF9XaWRnZXRJbXA6OkdldFJvb3RPdXRlcigpIHsNCisgIElGV0xfV2lkZ2V0KiBwUmV0ID0gbV9wT3V0ZXI7DQorICBpZiAoIXBSZXQpDQorICAgIHJldHVybiBudWxscHRyOw0KKyAgd2hpbGUgKElGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBwUmV0LT5HZXRPdXRlcigpKSB7DQorICAgIHBSZXQgPSBwT3V0ZXI7DQorICB9DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9XaWRnZXRJbXAqPihwUmV0LT5HZXRJbXBsKCkpOw0KK30NCisjZGVmaW5lIEZXTF9XR1RfQ2FsY0hlaWdodCAyMDQ4DQorI2RlZmluZSBGV0xfV0dUX0NhbGNXaWR0aCAyMDQ4DQorI2RlZmluZSBGV0xfV0dUX0NhbGNNdWx0aUxpbmVEZWZXaWR0aCAxMjAuMGYNCitDRlhfU2l6ZUYgQ0ZXTF9XaWRnZXRJbXA6OkNhbGNUZXh0U2l6ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk11bHRpTGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMaW5lV2lkdGgpIHsNCisgIENGWF9TaXplRiBzejsNCisgIHN6LlNldCgwLCAwKTsNCisgIGlmICghcFRoZW1lKQ0KKyAgICByZXR1cm4gc3o7DQorICBDRldMX1RoZW1lVGV4dCBjYWxQYXJ0Ow0KKyAgY2FsUGFydC5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBjYWxQYXJ0Lm1fd3NUZXh0ID0gd3NUZXh0Ow0KKyAgY2FsUGFydC5tX2R3VFRPU3R5bGVzID0NCisgICAgICBiTXVsdGlMaW5lID8gRkRFX1RUT1NUWUxFX0xpbmVXcmFwIDogRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmU7DQorICBjYWxQYXJ0Lm1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9Ub3BMZWZ0Ow0KKyAgQ0ZYX1JlY3RGIHJlY3Q7DQorICBGWF9GTE9BVCBmV2lkdGggPSBiTXVsdGlMaW5lDQorICAgICAgICAgICAgICAgICAgICAgICAgPyAoaUxpbmVXaWR0aCA+IDAgPyAoRlhfRkxPQVQpaUxpbmVXaWR0aA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRldMX1dHVF9DYWxjTXVsdGlMaW5lRGVmV2lkdGgpDQorICAgICAgICAgICAgICAgICAgICAgICAgOiBGV0xfV0dUX0NhbGNXaWR0aDsNCisgIHJlY3QuU2V0KDAsIDAsIGZXaWR0aCwgRldMX1dHVF9DYWxjSGVpZ2h0KTsNCisgIHBUaGVtZS0+Q2FsY1RleHRSZWN0KCZjYWxQYXJ0LCByZWN0KTsNCisgIHN6LnggPSByZWN0LndpZHRoOw0KKyAgc3oueSA9IHJlY3QuaGVpZ2h0Ow0KKyAgcmV0dXJuIHN6Ow0KK30NCit2b2lkIENGV0xfV2lkZ2V0SW1wOjpDYWxjVGV4dFJlY3QoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3VFRPU3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlUVE9BbGlnbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBDRldMX1RoZW1lVGV4dCBjYWxQYXJ0Ow0KKyAgY2FsUGFydC5tX3BXaWRnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBjYWxQYXJ0Lm1fd3NUZXh0ID0gd3NUZXh0Ow0KKyAgY2FsUGFydC5tX2R3VFRPU3R5bGVzID0gZHdUVE9TdHlsZXM7DQorICBjYWxQYXJ0Lm1faVRUT0FsaWduID0gaVRUT0FsaWduOw0KKyAgcFRoZW1lLT5DYWxjVGV4dFJlY3QoJmNhbFBhcnQsIHJlY3QpOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0SW1wOjpTZXRGb2N1cyhGWF9CT09MIGJGb2N1cykgew0KKyAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkNCisgICAgcmV0dXJuOw0KKyAgSUZXTF9Ob3RlVGhyZWFkKiBwVGhyZWFkID0gR2V0T3duZXJUaHJlYWQoKTsNCisgIGlmICghcFRocmVhZCkNCisgICAgcmV0dXJuOw0KKyAgQ0ZXTF9Ob3RlRHJpdmVyKiBwRHJpdmVyID0NCisgICAgICBzdGF0aWNfY2FzdDxDRldMX05vdGVEcml2ZXIqPihwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCkpOw0KKyAgaWYgKCFwRHJpdmVyKQ0KKyAgICByZXR1cm47DQorICBJRldMX1dpZGdldCogY3VyRm9jdXMgPSBwRHJpdmVyLT5HZXRGb2N1cygpOw0KKyAgaWYgKGJGb2N1cyAmJiBjdXJGb2N1cyAhPSBtX3BJbnRlcmZhY2UpIHsNCisgICAgcERyaXZlci0+U2V0Rm9jdXMobV9wSW50ZXJmYWNlKTsNCisgIH0gZWxzZSBpZiAoIWJGb2N1cyAmJiBjdXJGb2N1cyA9PSBtX3BJbnRlcmZhY2UpIHsNCisgICAgcERyaXZlci0+U2V0Rm9jdXMoTlVMTCk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRJbXA6OlNldEdyYWIoRlhfQk9PTCBiU2V0KSB7DQorICBJRldMX05vdGVUaHJlYWQqIHBUaHJlYWQgPSBHZXRPd25lclRocmVhZCgpOw0KKyAgaWYgKCFwVGhyZWFkKQ0KKyAgICByZXR1cm47DQorICBDRldMX05vdGVEcml2ZXIqIHBEcml2ZXIgPQ0KKyAgICAgIHN0YXRpY19jYXN0PENGV0xfTm90ZURyaXZlcio+KHBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKSk7DQorICBwRHJpdmVyLT5TZXRHcmFiKG1fcEludGVyZmFjZSwgYlNldCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRJbXA6OkdldFBvcHVwUG9zKEZYX0ZMT0FUIGZNaW5IZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1heEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0QW5jaG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRQb3B1cCkgew0KKyAgaWYgKEdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX01lbnUpIHsNCisgICAgcmV0dXJuIEdldFBvcHVwUG9zTWVudShmTWluSGVpZ2h0LCBmTWF4SGVpZ2h0LCBydEFuY2hvciwgcnRQb3B1cCk7DQorICB9IGVsc2Ugew0KKyAgICBpZiAoR2V0Q2xhc3NJRCgpID09IEZXTF9DTEFTU0hBU0hfQ29tYm9Cb3gpIHsNCisgICAgICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgICAgICByZXR1cm4gbV9wV2lkZ2V0TWdyLT5HZXRBZGFwdGVyUG9wdXBQb3MobV9wSW50ZXJmYWNlLCBmTWluSGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNYXhIZWlnaHQsIHJ0QW5jaG9yLCBydFBvcHVwKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcmV0dXJuIEdldFBvcHVwUG9zQ29tYm9Cb3goZk1pbkhlaWdodCwgZk1heEhlaWdodCwgcnRBbmNob3IsIHJ0UG9wdXApOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChHZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9EYXRlVGltZVBpY2tlciAmJg0KKyAgICAgICAgICAgICAgIG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICAgIHJldHVybiBtX3BXaWRnZXRNZ3ItPkdldEFkYXB0ZXJQb3B1cFBvcyhtX3BJbnRlcmZhY2UsIGZNaW5IZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZNYXhIZWlnaHQsIHJ0QW5jaG9yLCBydFBvcHVwKTsNCisgICAgfSBlbHNlIHsNCisgICAgICByZXR1cm4gR2V0UG9wdXBQb3NHZW5lcmFsKGZNaW5IZWlnaHQsIGZNYXhIZWlnaHQsIHJ0QW5jaG9yLCBydFBvcHVwKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENGV0xfV2lkZ2V0SW1wOjpHZXRQb3B1cFBvc01lbnUoRlhfRkxPQVQgZk1pbkhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1heEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydFBvcHVwKSB7DQorICBGWF9GTE9BVCBmeCA9IDA7DQorICBGWF9GTE9BVCBmeSA9IDA7DQorICBGWF9GTE9BVCBmU2NyZWVuV2lkdGggPSAwOw0KKyAgRlhfRkxPQVQgZlNjcmVlbkhlaWdodCA9IDA7DQorICBHZXRTY3JlZW5TaXplKGZTY3JlZW5XaWR0aCwgZlNjcmVlbkhlaWdodCk7DQorICBpZiAoR2V0U3R5bGVzRXgoKSAmIEZXTF9TVFlMRUVYVF9NTlVfVmVydCkgew0KKyAgICBGWF9CT09MIGJMZWZ0ID0gbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5sZWZ0IDwgMDsNCisgICAgRlhfRkxPQVQgZlJpZ2h0ID0gcnRBbmNob3IucmlnaHQoKSArIHJ0UG9wdXAud2lkdGg7DQorICAgIFRyYW5zZm9ybVRvKE5VTEwsIGZ4LCBmeSk7DQorICAgIGlmIChmUmlnaHQgKyBmeCA+IGZTY3JlZW5XaWR0aCB8fCBiTGVmdCkgew0KKyAgICAgIHJ0UG9wdXAuU2V0KHJ0QW5jaG9yLmxlZnQgLSBydFBvcHVwLndpZHRoLCBydEFuY2hvci50b3AsIHJ0UG9wdXAud2lkdGgsDQorICAgICAgICAgICAgICAgICAgcnRQb3B1cC5oZWlnaHQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJ0UG9wdXAuU2V0KHJ0QW5jaG9yLnJpZ2h0KCksIHJ0QW5jaG9yLnRvcCwgcnRQb3B1cC53aWR0aCwNCisgICAgICAgICAgICAgICAgICBydFBvcHVwLmhlaWdodCk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIEZYX0ZMT0FUIGZCb3R0b20gPSBydEFuY2hvci5ib3R0b20oKSArIHJ0UG9wdXAuaGVpZ2h0Ow0KKyAgICBUcmFuc2Zvcm1UbyhOVUxMLCBmeCwgZnkpOw0KKyAgICBpZiAoZkJvdHRvbSArIGZ5ID4gZlNjcmVlbkhlaWdodCkgew0KKyAgICAgIHJ0UG9wdXAuU2V0KHJ0QW5jaG9yLmxlZnQsIHJ0QW5jaG9yLnRvcCAtIHJ0UG9wdXAuaGVpZ2h0LCBydFBvcHVwLndpZHRoLA0KKyAgICAgICAgICAgICAgICAgIHJ0UG9wdXAuaGVpZ2h0KTsNCisgICAgfSBlbHNlIHsNCisgICAgICBydFBvcHVwLlNldChydEFuY2hvci5sZWZ0LCBydEFuY2hvci5ib3R0b20oKSwgcnRQb3B1cC53aWR0aCwNCisgICAgICAgICAgICAgICAgICBydFBvcHVwLmhlaWdodCk7DQorICAgIH0NCisgIH0NCisgIHJ0UG9wdXAuT2Zmc2V0KGZ4LCBmeSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX1dpZGdldEltcDo6R2V0UG9wdXBQb3NDb21ib0JveChGWF9GTE9BVCBmTWluSGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1heEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRBbmNob3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJ0UG9wdXApIHsNCisgIEZYX0ZMT0FUIGZ4ID0gMDsNCisgIEZYX0ZMT0FUIGZ5ID0gMDsNCisgIEZYX0ZMT0FUIGZTY3JlZW5XaWR0aCA9IDA7DQorICBGWF9GTE9BVCBmU2NyZWVuSGVpZ2h0ID0gMDsNCisgIEdldFNjcmVlblNpemUoZlNjcmVlbldpZHRoLCBmU2NyZWVuSGVpZ2h0KTsNCisgIEZYX0ZMT0FUIGZQb3BIZWlnaHQgPSBydFBvcHVwLmhlaWdodDsNCisgIGlmIChydFBvcHVwLmhlaWdodCA+IGZNYXhIZWlnaHQpIHsNCisgICAgZlBvcEhlaWdodCA9IGZNYXhIZWlnaHQ7DQorICB9IGVsc2UgaWYgKHJ0UG9wdXAuaGVpZ2h0IDwgZk1pbkhlaWdodCkgew0KKyAgICBmUG9wSGVpZ2h0ID0gZk1pbkhlaWdodDsNCisgIH0NCisgIEZYX0ZMT0FUIGZXaWR0aCA9IHN0ZDo6bWF4KHJ0QW5jaG9yLndpZHRoLCBydFBvcHVwLndpZHRoKTsNCisgIEZYX0ZMT0FUIGZCb3R0b20gPSBydEFuY2hvci5ib3R0b20oKSArIGZQb3BIZWlnaHQ7DQorICBUcmFuc2Zvcm1UbyhOVUxMLCBmeCwgZnkpOw0KKyAgaWYgKGZCb3R0b20gKyBmeSA+IGZTY3JlZW5IZWlnaHQpIHsNCisgICAgcnRQb3B1cC5TZXQocnRBbmNob3IubGVmdCwgcnRBbmNob3IudG9wIC0gZlBvcEhlaWdodCwgZldpZHRoLCBmUG9wSGVpZ2h0KTsNCisgIH0gZWxzZSB7DQorICAgIHJ0UG9wdXAuU2V0KHJ0QW5jaG9yLmxlZnQsIHJ0QW5jaG9yLmJvdHRvbSgpLCBmV2lkdGgsIGZQb3BIZWlnaHQpOw0KKyAgfQ0KKyAgcnRQb3B1cC5PZmZzZXQoZngsIGZ5KTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGV0xfV2lkZ2V0SW1wOjpHZXRQb3B1cFBvc0dlbmVyYWwoRlhfRkxPQVQgZk1pbkhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1heEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydFBvcHVwKSB7DQorICBGWF9GTE9BVCBmeCA9IDA7DQorICBGWF9GTE9BVCBmeSA9IDA7DQorICBGWF9GTE9BVCBmU2NyZWVuV2lkdGggPSAwOw0KKyAgRlhfRkxPQVQgZlNjcmVlbkhlaWdodCA9IDA7DQorICBHZXRTY3JlZW5TaXplKGZTY3JlZW5XaWR0aCwgZlNjcmVlbkhlaWdodCk7DQorICBUcmFuc2Zvcm1UbyhOVUxMLCBmeCwgZnkpOw0KKyAgaWYgKHJ0QW5jaG9yLmJvdHRvbSgpICsgZnkgPiBmU2NyZWVuSGVpZ2h0KSB7DQorICAgIHJ0UG9wdXAuU2V0KHJ0QW5jaG9yLmxlZnQsIHJ0QW5jaG9yLnRvcCAtIHJ0UG9wdXAuaGVpZ2h0LCBydFBvcHVwLndpZHRoLA0KKyAgICAgICAgICAgICAgICBydFBvcHVwLmhlaWdodCk7DQorICB9IGVsc2Ugew0KKyAgICBydFBvcHVwLlNldChydEFuY2hvci5sZWZ0LCBydEFuY2hvci5ib3R0b20oKSwgcnRQb3B1cC53aWR0aCwNCisgICAgICAgICAgICAgICAgcnRQb3B1cC5oZWlnaHQpOw0KKyAgfQ0KKyAgcnRQb3B1cC5PZmZzZXQoZngsIGZ5KTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGV0xfV2lkZ2V0SW1wOjpHZXRTY3JlZW5TaXplKEZYX0ZMT0FUJiBmeCwgRlhfRkxPQVQmIGZ5KSB7DQorICBJRldMX0FkYXB0ZXJOYXRpdmUqIHBOYXRpdmUgPSBGV0xfR2V0QWRhcHRlck5hdGl2ZSgpOw0KKyAgSUZXTF9BZGFwdGVyTW9uaXRvck1nciogcE1vbml0b3JNZ3IgPSBwTmF0aXZlLT5HZXRNb25pdG9yTWdyKCk7DQorICBpZiAoIXBNb25pdG9yTWdyKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBGV0xfSE1PTklUT1IgaE1vbml0b3IgPSBwTW9uaXRvck1nci0+R2V0TW9uaXRvckJ5UG9pbnQoZngsIGZ5KTsNCisgIHBNb25pdG9yTWdyLT5HZXRNb25pdG9yU2l6ZShoTW9uaXRvciwgZngsIGZ5KTsNCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0SW1wOjpSZWdpc3RlckV2ZW50VGFyZ2V0KElGV0xfV2lkZ2V0KiBwRXZlbnRTb3VyY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZpbHRlcikgew0KKyAgSUZXTF9Ob3RlVGhyZWFkKiBwVGhyZWFkID0gR2V0T3duZXJUaHJlYWQoKTsNCisgIGlmICghcFRocmVhZCkNCisgICAgcmV0dXJuOw0KKyAgSUZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9IHBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKTsNCisgIGlmICghcE5vdGVEcml2ZXIpDQorICAgIHJldHVybjsNCisgIHBOb3RlRHJpdmVyLT5SZWdpc3RlckV2ZW50VGFyZ2V0KG1fcEludGVyZmFjZSwgcEV2ZW50U291cmNlLCBkd0ZpbHRlcik7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRJbXA6OlVucmVnaXN0ZXJFdmVudFRhcmdldCgpIHsNCisgIElGV0xfTm90ZVRocmVhZCogcFRocmVhZCA9IEdldE93bmVyVGhyZWFkKCk7DQorICBpZiAoIXBUaHJlYWQpDQorICAgIHJldHVybjsNCisgIElGV0xfTm90ZURyaXZlciogcE5vdGVEcml2ZXIgPSBwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQorICBpZiAoIXBOb3RlRHJpdmVyKQ0KKyAgICByZXR1cm47DQorICBwTm90ZURyaXZlci0+VW5yZWdpc3RlckV2ZW50VGFyZ2V0KG1fcEludGVyZmFjZSk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRJbXA6OkRpc3BhdGNoS2V5RXZlbnQoQ0ZXTF9Nc2dLZXkqIHBOb3RlKSB7DQorICBpZiAoIXBOb3RlKQ0KKyAgICByZXR1cm47DQorICBDRldMX0V2dEtleSogcEV2ZW50ID0gbmV3IENGV0xfRXZ0S2V5Ow0KKyAgcEV2ZW50LT5tX3BTcmNUYXJnZXQgPSBtX3BJbnRlcmZhY2U7DQorICBwRXZlbnQtPm1fZHdDbWQgPSBwTm90ZS0+bV9kd0NtZDsNCisgIHBFdmVudC0+bV9kd0tleUNvZGUgPSBwTm90ZS0+bV9kd0tleUNvZGU7DQorICBwRXZlbnQtPm1fZHdGbGFncyA9IHBOb3RlLT5tX2R3RmxhZ3M7DQorICBEaXNwYXRjaEV2ZW50KHBFdmVudCk7DQorICBwRXZlbnQtPlJlbGVhc2UoKTsNCit9DQordm9pZCBDRldMX1dpZGdldEltcDo6RGlzcGF0Y2hFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsNCisgIGlmIChtX3BPdXRlcikgew0KKyAgICBJRldMX1dpZGdldERlbGVnYXRlKiBwRGVsZWdhdGUgPSBtX3BPdXRlci0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICAgIHBEZWxlZ2F0ZS0+T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSUZXTF9Ob3RlVGhyZWFkKiBwVGhyZWFkID0gR2V0T3duZXJUaHJlYWQoKTsNCisgIGlmICghcFRocmVhZCkNCisgICAgcmV0dXJuOw0KKyAgSUZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9IHBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKTsNCisgIGlmICghcE5vdGVEcml2ZXIpDQorICAgIHJldHVybjsNCisgIHBOb3RlRHJpdmVyLT5TZW5kTm90ZShwRXZlbnQpOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0SW1wOjpSZXBhaW50KGNvbnN0IENGWF9SZWN0RiogcFJlY3QpIHsNCisgIGlmIChwUmVjdCkgew0KKyAgICBtX3BXaWRnZXRNZ3ItPlJlcGFpbnRXaWRnZXQobV9wSW50ZXJmYWNlLCBwUmVjdCk7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9SZWN0RiByZWN0Ow0KKyAgcmVjdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQ7DQorICByZWN0LmxlZnQgPSByZWN0LnRvcCA9IDA7DQorICBtX3BXaWRnZXRNZ3ItPlJlcGFpbnRXaWRnZXQobV9wSW50ZXJmYWNlLCAmcmVjdCk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRJbXA6OkRyYXdCYWNrZ3JvdW5kKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVBhcnRCaywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfUmVjdEYgcnRSZWxhdGl2ZTsNCisgIEdldFJlbGF0aXZlUmVjdChydFJlbGF0aXZlKTsNCisgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcGFyYW0ubV9pUGFydCA9IGlQYXJ0Qms7DQorICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCwgVFJVRSk7DQorICB9DQorICBwYXJhbS5tX3J0UGFydCA9IHJ0UmVsYXRpdmU7DQorICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRJbXA6OkRyYXdCb3JkZXIoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQYXJ0Qm9yZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfUmVjdEYgcnRSZWxhdGl2ZTsNCisgIEdldFJlbGF0aXZlUmVjdChydFJlbGF0aXZlKTsNCisgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcGFyYW0ubV9pUGFydCA9IGlQYXJ0Qm9yZGVyOw0KKyAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgsIFRSVUUpOw0KKyAgfQ0KKyAgcGFyYW0ubV9ydFBhcnQgPSBydFJlbGF0aXZlOw0KKyAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0SW1wOjpEcmF3RWRnZShDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQYXJ0RWRnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfUmVjdEYgcnRFZGdlOw0KKyAgR2V0RWRnZVJlY3QocnRFZGdlKTsNCisgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOw0KKyAgcGFyYW0ubV9wV2lkZ2V0ID0gbV9wSW50ZXJmYWNlOw0KKyAgcGFyYW0ubV9pUGFydCA9IGlQYXJ0RWRnZTsNCisgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4LCBUUlVFKTsNCisgIH0NCisgIHBhcmFtLm1fcnRQYXJ0ID0gcnRFZGdlOw0KKyAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0SW1wOjpOb3RpZnlEcml2ZXIoKSB7DQorICBJRldMX05vdGVUaHJlYWQqIHBUaHJlYWQgPSBHZXRPd25lclRocmVhZCgpOw0KKyAgaWYgKCFwVGhyZWFkKQ0KKyAgICByZXR1cm47DQorICBDRldMX05vdGVEcml2ZXIqIHBEcml2ZXIgPQ0KKyAgICAgIHN0YXRpY19jYXN0PENGV0xfTm90ZURyaXZlcio+KHBUaHJlYWQtPkdldE5vdGVEcml2ZXIoKSk7DQorICBpZiAoIXBEcml2ZXIpDQorICAgIHJldHVybjsNCisgIHBEcml2ZXItPk5vdGlmeVRhcmdldERlc3Ryb3kobV9wSW50ZXJmYWNlKTsNCit9DQorQ0ZYX1NpemVGIENGV0xfV2lkZ2V0SW1wOjpHZXRPZmZzZXRGcm9tUGFyZW50KElGV0xfV2lkZ2V0KiBwUGFyZW50KSB7DQorICBDRlhfU2l6ZUYgc3pSZXQ7DQorICBzelJldC5TZXQoMCwgMCk7DQorICBpZiAocFBhcmVudCA9PSBHZXRJbnRlcmZhY2UoKSkgew0KKyAgICByZXR1cm4gc3pSZXQ7DQorICB9DQorICBJRldMX1dpZGdldE1nciogcFdpZGdldE1nciA9IEZXTF9HZXRXaWRnZXRNZ3IoKTsNCisgIGlmICghcFdpZGdldE1ncikNCisgICAgcmV0dXJuIHN6UmV0Ow0KKyAgc3pSZXQueCArPSBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LmxlZnQ7DQorICBzelJldC55ICs9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQudG9wOw0KKyAgSUZXTF9XaWRnZXQqIHBEc3RXaWRnZXQgPSBHZXRQYXJlbnQoKTsNCisgIHdoaWxlIChwRHN0V2lkZ2V0ICYmIHBEc3RXaWRnZXQgIT0gcFBhcmVudCkgew0KKyAgICBDRlhfUmVjdEYgcnREc3Q7DQorICAgIHBEc3RXaWRnZXQtPkdldFdpZGdldFJlY3QocnREc3QpOw0KKyAgICBzelJldC54ICs9IHJ0RHN0LmxlZnQ7DQorICAgIHN6UmV0LnkgKz0gcnREc3QudG9wOw0KKyAgICBwRHN0V2lkZ2V0ID0gcFdpZGdldE1nci0+R2V0V2lkZ2V0KHBEc3RXaWRnZXQsIEZXTF9XR1RSRUxBVElPTl9QYXJlbnQpOw0KKyAgfQ0KKyAgcmV0dXJuIHN6UmV0Ow0KK30NCitGWF9CT09MIENGV0xfV2lkZ2V0SW1wOjpJc1BhcmVudChJRldMX1dpZGdldCogcFBhcmVudCkgew0KKyAgSUZXTF9XaWRnZXQqIHBVcFdpZGdldCA9IEdldFBhcmVudCgpOw0KKyAgd2hpbGUgKHBVcFdpZGdldCkgew0KKyAgICBpZiAocFVwV2lkZ2V0ID09IHBQYXJlbnQpDQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIHBVcFdpZGdldCA9IHBVcFdpZGdldC0+R2V0UGFyZW50KCk7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0NGV0xfV2lkZ2V0SW1wRGVsZWdhdGU6OkNGV0xfV2lkZ2V0SW1wRGVsZWdhdGUoKSB7fQ0KK2ludDMyX3QgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7DQorICBpZiAoIXBNZXNzYWdlLT5tX3BEc3RUYXJnZXQpDQorICAgIHJldHVybiAwOw0KKyAgQ0ZXTF9XaWRnZXRJbXAqIHBXaWRnZXQgPQ0KKyAgICAgIHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0SW1wKj4ocE1lc3NhZ2UtPm1fcERzdFRhcmdldC0+R2V0SW1wbCgpKTsNCisgIEZYX0RXT1JEIGR3TXNnQ29kZSA9IHBNZXNzYWdlLT5HZXRDbGFzc0lEKCk7DQorICBzd2l0Y2ggKGR3TXNnQ29kZSkgew0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX01vdXNlOiB7DQorICAgICAgQ0ZXTF9Nc2dNb3VzZSogcE1zZ01vdXNlID0gc3RhdGljX2Nhc3Q8Q0ZXTF9Nc2dNb3VzZSo+KHBNZXNzYWdlKTsNCisgICAgICBDRldMX0V2dE1vdXNlIGV2dDsNCisgICAgICBldnQubV9wU3JjVGFyZ2V0ID0gcFdpZGdldC0+bV9wSW50ZXJmYWNlOw0KKyAgICAgIGV2dC5tX3BEc3RUYXJnZXQgPSBwV2lkZ2V0LT5tX3BJbnRlcmZhY2U7DQorICAgICAgZXZ0Lm1fZHdDbWQgPSBwTXNnTW91c2UtPm1fZHdDbWQ7DQorICAgICAgZXZ0Lm1fZHdGbGFncyA9IHBNc2dNb3VzZS0+bV9kd0ZsYWdzOw0KKyAgICAgIGV2dC5tX2Z4ID0gcE1zZ01vdXNlLT5tX2Z4Ow0KKyAgICAgIGV2dC5tX2Z5ID0gcE1zZ01vdXNlLT5tX2Z5Ow0KKyAgICAgIHBXaWRnZXQtPkRpc3BhdGNoRXZlbnQoJmV2dCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9Nb3VzZVdoZWVsOiB7DQorICAgICAgQ0ZXTF9Nc2dNb3VzZVdoZWVsKiBwTXNnTW91c2VXaGVlbCA9DQorICAgICAgICAgIHN0YXRpY19jYXN0PENGV0xfTXNnTW91c2VXaGVlbCo+KHBNZXNzYWdlKTsNCisgICAgICBDRldMX0V2dE1vdXNlV2hlZWwgZXZ0Ow0KKyAgICAgIGV2dC5tX3BTcmNUYXJnZXQgPSBwV2lkZ2V0LT5tX3BJbnRlcmZhY2U7DQorICAgICAgZXZ0Lm1fcERzdFRhcmdldCA9IHBXaWRnZXQtPm1fcEludGVyZmFjZTsNCisgICAgICBldnQubV9kd0ZsYWdzID0gcE1zZ01vdXNlV2hlZWwtPm1fZHdGbGFnczsNCisgICAgICBldnQubV9mRGVsdGFYID0gcE1zZ01vdXNlV2hlZWwtPm1fZkRlbHRhWDsNCisgICAgICBldnQubV9mRGVsdGFZID0gcE1zZ01vdXNlV2hlZWwtPm1fZkRlbHRhWTsNCisgICAgICBldnQubV9meCA9IHBNc2dNb3VzZVdoZWVsLT5tX2Z4Ow0KKyAgICAgIGV2dC5tX2Z5ID0gcE1zZ01vdXNlV2hlZWwtPm1fZnk7DQorICAgICAgcFdpZGdldC0+RGlzcGF0Y2hFdmVudCgmZXZ0KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NU0dIQVNIX0tleTogew0KKyAgICAgIENGV0xfTXNnS2V5KiBwTXNnS2V5ID0gc3RhdGljX2Nhc3Q8Q0ZXTF9Nc2dLZXkqPihwTWVzc2FnZSk7DQorICAgICAgQ0ZXTF9FdnRLZXkgZXZ0Ow0KKyAgICAgIGV2dC5tX3BTcmNUYXJnZXQgPSBwV2lkZ2V0LT5tX3BJbnRlcmZhY2U7DQorICAgICAgZXZ0Lm1fcERzdFRhcmdldCA9IHBXaWRnZXQtPm1fcEludGVyZmFjZTsNCisgICAgICBldnQubV9kd0tleUNvZGUgPSBwTXNnS2V5LT5tX2R3S2V5Q29kZTsNCisgICAgICBldnQubV9kd0ZsYWdzID0gcE1zZ0tleS0+bV9kd0ZsYWdzOw0KKyAgICAgIGV2dC5tX2R3Q21kID0gcE1zZ0tleS0+bV9kd0NtZDsNCisgICAgICBwV2lkZ2V0LT5EaXNwYXRjaEV2ZW50KCZldnQpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01TR0hBU0hfU2V0Rm9jdXM6IHsNCisgICAgICBDRldMX01zZ1NldEZvY3VzKiBwTXNnU2V0Rm9jdXMgPSBzdGF0aWNfY2FzdDxDRldMX01zZ1NldEZvY3VzKj4ocE1lc3NhZ2UpOw0KKyAgICAgIENGV0xfRXZ0U2V0Rm9jdXMgZXZ0Ow0KKyAgICAgIGV2dC5tX3BTcmNUYXJnZXQgPSBwTXNnU2V0Rm9jdXMtPm1fcERzdFRhcmdldDsNCisgICAgICBldnQubV9wRHN0VGFyZ2V0ID0gcE1zZ1NldEZvY3VzLT5tX3BEc3RUYXJnZXQ7DQorICAgICAgZXZ0Lm1fcFNldEZvY3VzID0gcFdpZGdldC0+bV9wSW50ZXJmYWNlOw0KKyAgICAgIHBXaWRnZXQtPkRpc3BhdGNoRXZlbnQoJmV2dCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTVNHSEFTSF9LaWxsRm9jdXM6IHsNCisgICAgICBDRldMX01zZ0tpbGxGb2N1cyogcE1zZ0tpbGxGb2N1cyA9DQorICAgICAgICAgIHN0YXRpY19jYXN0PENGV0xfTXNnS2lsbEZvY3VzKj4ocE1lc3NhZ2UpOw0KKyAgICAgIENGV0xfRXZ0S2lsbEZvY3VzIGV2dDsNCisgICAgICBldnQubV9wU3JjVGFyZ2V0ID0gcE1zZ0tpbGxGb2N1cy0+bV9wRHN0VGFyZ2V0Ow0KKyAgICAgIGV2dC5tX3BEc3RUYXJnZXQgPSBwTXNnS2lsbEZvY3VzLT5tX3BEc3RUYXJnZXQ7DQorICAgICAgZXZ0Lm1fcEtpbGxGb2N1cyA9IHBXaWRnZXQtPm1fcEludGVyZmFjZTsNCisgICAgICBwV2lkZ2V0LT5EaXNwYXRjaEV2ZW50KCZldnQpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQorICByZXR1cm4gMTsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldEltcERlbGVnYXRlOjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldEltcERlbGVnYXRlOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZXTF9FdnREcmF3IGV2dDsNCisgIGV2dC5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorY2xhc3MgQ0ZXTF9DdXN0b21JbXAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXAgew0KKyBwdWJsaWM6DQorICBDRldMX0N1c3RvbUltcChjb25zdCBDRldMX1dpZGdldEltcFByb3BlcnRpZXMmIHByb3BlcnRpZXMsDQorICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUgPSBGQUxTRSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgVXBkYXRlKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0UHJveHkoSUZXTF9Qcm94eSogcFByb3h5KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgSUZXTF9Qcm94eSogbV9wUHJveHk7DQorfTsNCitDRldMX0N1c3RvbUltcDo6Q0ZXTF9DdXN0b21JbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcE91dGVyKQ0KKyAgICA6IENGV0xfV2lkZ2V0SW1wKHByb3BlcnRpZXMsIHBPdXRlciksIG1fcFByb3h5KE5VTEwpIHt9DQorRldMX0VSUiBDRldMX0N1c3RvbUltcDo6R2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsIEZYX0JPT0wgYkF1dG9TaXplKSB7DQorICBpZiAobV9wUHJveHkgJiYNCisgICAgICAobV9wUHJveHktPkdldFdpZGdldFJlY3QocmVjdCwgYkF1dG9TaXplKSA9PSBGV0xfRVJSX1N1Y2NlZWRlZCkpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpHZXRXaWRnZXRSZWN0KHJlY3QsIGJBdXRvU2l6ZSk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9DdXN0b21JbXA6OlVwZGF0ZSgpIHsNCisgIGlmIChtX3BQcm94eSkgew0KKyAgICByZXR1cm4gbV9wUHJveHktPlVwZGF0ZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0SW1wOjpVcGRhdGUoKTsNCit9DQorRldMX0VSUiBDRldMX0N1c3RvbUltcDo6U2V0UHJveHkoSUZXTF9Qcm94eSogcFByb3h5KSB7DQorICBtX3BQcm94eSA9IHBQcm94eTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorDQorLy8gc3RhdGljDQorSUZXTF9DdXN0b20qIElGV0xfQ3VzdG9tOjpDcmVhdGUoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpIHsNCisgIElGV0xfQ3VzdG9tKiBwQ3VzdG9tID0gbmV3IElGV0xfQ3VzdG9tOw0KKyAgQ0ZXTF9DdXN0b21JbXAqIHBDdXN0b21JbXBsID0gbmV3IENGV0xfQ3VzdG9tSW1wKHByb3BlcnRpZXMsIHBPdXRlcik7DQorICBwQ3VzdG9tLT5TZXRJbXBsKHBDdXN0b21JbXBsKTsNCisgIHBDdXN0b21JbXBsLT5TZXRJbnRlcmZhY2UocEN1c3RvbSk7DQorICByZXR1cm4gcEN1c3RvbTsNCit9DQorSUZXTF9DdXN0b206OklGV0xfQ3VzdG9tKCkge30NCitGV0xfRVJSIElGV0xfQ3VzdG9tOjpTZXRQcm94eShJRldMX1Byb3h5KiBwUHJveHkpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0N1c3RvbUltcCo+KEdldEltcGwoKSktPlNldFByb3h5KHBQcm94eSk7DQorfQ0KK3ZvaWQgRldMX1NldFdpZGdldFJlY3QoSUZXTF9XaWRnZXQqIHdpZGdldCwgY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBzdGF0aWNfY2FzdDxDRldMX1dpZGdldEltcCo+KHdpZGdldC0+R2V0SW1wbCgpKS0+bV9wUHJvcGVydGllcy0+bV9ydFdpZGdldCA9DQorICAgICAgcmVjdDsNCit9DQordm9pZCBGV0xfU2V0V2lkZ2V0U3RhdGVzKElGV0xfV2lkZ2V0KiB3aWRnZXQsIEZYX0RXT1JEIGR3U3RhdGVzKSB7DQorICBzdGF0aWNfY2FzdDxDRldMX1dpZGdldEltcCo+KHdpZGdldC0+R2V0SW1wbCgpKS0+bV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyA9DQorICAgICAgZHdTdGF0ZXM7DQorfQ0KK3ZvaWQgRldMX1NldFdpZGdldFN0eWxlcyhJRldMX1dpZGdldCogd2lkZ2V0LCBGWF9EV09SRCBkd1N0eWxlcykgew0KKyAgc3RhdGljX2Nhc3Q8Q0ZXTF9XaWRnZXRJbXAqPih3aWRnZXQtPkdldEltcGwoKSktPm1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgPQ0KKyAgICAgIGR3U3R5bGVzOw0KK30NCitGV0xfRVJSIEZXTF9FbmFiZWxXaWRnZXQoSUZXTF9XaWRnZXQqIHdpZGdldCwgRlhfQk9PTCBiRW5hYmxlKSB7DQorICB3aWRnZXQtPlNldFN0YXRlcyhGV0xfV0dUU1RBVEVfRGlzYWJsZWQsICFiRW5hYmxlKTsNCisgIElGV0xfV2lkZ2V0TWdyKiB3aWRnZXRNZ3IgPSBGV0xfR2V0V2lkZ2V0TWdyKCk7DQorICBJRldMX1dpZGdldCogY2hpbGQgPSB3aWRnZXRNZ3ItPkdldFdpZGdldCh3aWRnZXQsIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkKTsNCisgIHdoaWxlIChjaGlsZCkgew0KKyAgICBGV0xfRW5hYmVsV2lkZ2V0KGNoaWxkLCBiRW5hYmxlKTsNCisgICAgY2hpbGQgPSB3aWRnZXRNZ3ItPkdldFdpZGdldChjaGlsZCwgRldMX1dHVFJFTEFUSU9OX05leHRTaWJsaW5nKTsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3dpZGdldG1ncmltcC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9md2xfd2lkZ2V0bWdyaW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGExM2U5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvZndsX3dpZGdldG1ncmltcC5jcHAKQEAgLTAsMCArMSwxMDc1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3RhcmdldGltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9ub3RlaW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3dpZGdldG1ncmltcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF90aHJlYWRpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfYXBwaW1wLmgiDQorDQorRlhfQk9PTCBGV0xfVXNlT2Zmc2NyZWVuKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorI2lmIChfRlhfT1NfID09IF9GWF9NQUNPU1hfKQ0KKyAgcmV0dXJuIEZBTFNFOw0KKyNlbHNlDQorICByZXR1cm4gcFdpZGdldC0+R2V0U3R5bGVzKCkgJiBGV0xfV0dUU1RZTEVfT2Zmc2NyZWVuOw0KKyNlbmRpZg0KK30NCitJRldMX1dpZGdldE1nciogRldMX0dldFdpZGdldE1ncigpIHsNCisgIElGV0xfQXBwKiBwQXBwID0gRldMX0dldEFwcCgpOw0KKyAgaWYgKCFwQXBwKQ0KKyAgICByZXR1cm4gTlVMTDsNCisgIHJldHVybiBwQXBwLT5HZXRXaWRnZXRNZ3IoKTsNCit9DQorQ0ZXTF9XaWRnZXRNZ3I6OkNGV0xfV2lkZ2V0TWdyKElGV0xfQWRhcHRlck5hdGl2ZSogcEFkYXB0ZXJOYXRpdmUpDQorICAgIDogbV9kd0NhcGFiaWxpdHkoMCkgew0KKyAgbV9wRGVsZWdhdGUgPSBuZXcgQ0ZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZSh0aGlzKTsNCisgIG1fcEFkYXB0ZXIgPSBwQWRhcHRlck5hdGl2ZS0+R2V0V2lkZ2V0TWdyKG1fcERlbGVnYXRlKTsNCisgIEZYU1lTX2Fzc2VydChtX3BBZGFwdGVyKTsNCisgIENGV0xfV2lkZ2V0TWdySXRlbSogcFJvb3QgPSBuZXcgQ0ZXTF9XaWRnZXRNZ3JJdGVtOw0KKyAgbV9tYXBXaWRnZXRJdGVtLlNldEF0KE5VTEwsIHBSb290KTsNCisjaWYgKF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfKSB8fCAoX0ZYX09TXyA9PSBfRlhfV0lONjRfKQ0KKyAgbV9ydFNjcmVlbi5SZXNldCgpOw0KKyAgSUZXTF9BZGFwdGVyTW9uaXRvck1nciogcE1vbml0b3JNZ3IgPSBwQWRhcHRlck5hdGl2ZS0+R2V0TW9uaXRvck1ncigpOw0KKyAgaWYgKHBNb25pdG9yTWdyKSB7DQorICAgIEZXTF9ITU9OSVRPUiBtb25pdG9yID0gcE1vbml0b3JNZ3ItPkdldEN1cnJlbnRNb25pdG9yKCk7DQorICAgIGlmIChtb25pdG9yKSB7DQorICAgICAgcE1vbml0b3JNZ3ItPkdldE1vbml0b3JTaXplKG1vbml0b3IsIG1fcnRTY3JlZW4ud2lkdGgsIG1fcnRTY3JlZW4uaGVpZ2h0KTsNCisgICAgfQ0KKyAgfQ0KKyNlbmRpZg0KK30NCitDRldMX1dpZGdldE1ncjo6fkNGV0xfV2lkZ2V0TWdyKCkgew0KKyAgRlhfUE9TSVRJT04gcHMgPSBtX21hcFdpZGdldEl0ZW0uR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBzKSB7DQorICAgIHZvaWQqIHBXaWRnZXQ7DQorICAgIENGV0xfV2lkZ2V0TWdySXRlbSogcEl0ZW07DQorICAgIG1fbWFwV2lkZ2V0SXRlbS5HZXROZXh0QXNzb2MocHMsIHBXaWRnZXQsICh2b2lkKiYpcEl0ZW0pOw0KKyAgICBkZWxldGUgcEl0ZW07DQorICB9DQorICBtX21hcFdpZGdldEl0ZW0uUmVtb3ZlQWxsKCk7DQorICBpZiAobV9wRGVsZWdhdGUpIHsNCisgICAgZGVsZXRlIG1fcERlbGVnYXRlOw0KKyAgICBtX3BEZWxlZ2F0ZSA9IE5VTEw7DQorICB9DQorfQ0KK2ludDMyX3QgQ0ZXTF9XaWRnZXRNZ3I6OkNvdW50V2lkZ2V0cyhJRldMX1dpZGdldCogcFBhcmVudCkgew0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwUGFyZW50SXRlbSA9IEdldFdpZGdldE1nckl0ZW0ocFBhcmVudCk7DQorICByZXR1cm4gVHJhdmVsV2lkZ2V0TWdyKHBQYXJlbnRJdGVtLCBOVUxMLCBOVUxMKTsNCit9DQorSUZXTF9XaWRnZXQqIENGV0xfV2lkZ2V0TWdyOjpHZXRXaWRnZXQoaW50MzJfdCBuSW5kZXgsIElGV0xfV2lkZ2V0KiBwUGFyZW50KSB7DQorICBDRldMX1dpZGdldE1nckl0ZW0qIHBQYXJlbnRJdGVtID0gR2V0V2lkZ2V0TWdySXRlbShwUGFyZW50KTsNCisgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0ID0gTlVMTDsNCisgIFRyYXZlbFdpZGdldE1ncihwUGFyZW50SXRlbSwgJm5JbmRleCwgTlVMTCwgJnBXaWRnZXQpOw0KKyAgcmV0dXJuIHBXaWRnZXQ7DQorfQ0KK0lGV0xfV2lkZ2V0KiBDRldMX1dpZGdldE1ncjo6R2V0V2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9XR1RSRUxBVElPTiBlUmVsYXRpb24pIHsNCisgIENGV0xfV2lkZ2V0TWdySXRlbSogcEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBXaWRnZXQpOw0KKyAgaWYgKCFwSXRlbSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIElGV0xfV2lkZ2V0KiBwUmV0ID0gTlVMTDsNCisgIHN3aXRjaCAoZVJlbGF0aW9uKSB7DQorICAgIGNhc2UgRldMX1dHVFJFTEFUSU9OX1BhcmVudDogew0KKyAgICAgIHBSZXQgPSBwSXRlbS0+cFBhcmVudCA/IHBJdGVtLT5wUGFyZW50LT5wV2lkZ2V0IDogTlVMTDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RSRUxBVElPTl9Pd25lcjogew0KKyAgICAgIHBSZXQgPSBwSXRlbS0+cE93bmVyID8gcEl0ZW0tPnBPd25lci0+cFdpZGdldCA6IE5VTEw7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUUkVMQVRJT05fRmlyc3RTaWJsaW5nOiB7DQorICAgICAgcEl0ZW0gPSBwSXRlbS0+cFByZXZpb3VzOw0KKyAgICAgIHdoaWxlIChwSXRlbSAmJiBwSXRlbS0+cFByZXZpb3VzKSB7DQorICAgICAgICBwSXRlbSA9IHBJdGVtLT5wUHJldmlvdXM7DQorICAgICAgfQ0KKyAgICAgIHBSZXQgPSBwSXRlbSA/IHBJdGVtLT5wV2lkZ2V0IDogTlVMTDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RSRUxBVElPTl9QcmlvclNpYmxpbmc6IHsNCisgICAgICBwUmV0ID0gcEl0ZW0tPnBQcmV2aW91cyA/IHBJdGVtLT5wUHJldmlvdXMtPnBXaWRnZXQgOiBOVUxMOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVFJFTEFUSU9OX05leHRTaWJsaW5nOiB7DQorICAgICAgcFJldCA9IHBJdGVtLT5wTmV4dCA/IHBJdGVtLT5wTmV4dC0+cFdpZGdldCA6IE5VTEw7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUUkVMQVRJT05fTGFzdFNpYmxpbmc6IHsNCisgICAgICBwSXRlbSA9IHBJdGVtLT5wTmV4dDsNCisgICAgICB3aGlsZSAocEl0ZW0gJiYgcEl0ZW0tPnBOZXh0KSB7DQorICAgICAgICBwSXRlbSA9IHBJdGVtLT5wTmV4dDsNCisgICAgICB9DQorICAgICAgcFJldCA9IHBJdGVtID8gcEl0ZW0tPnBXaWRnZXQgOiBOVUxMOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVFJFTEFUSU9OX0ZpcnN0Q2hpbGQ6IHsNCisgICAgICBwUmV0ID0gcEl0ZW0tPnBDaGlsZCA/IHBJdGVtLT5wQ2hpbGQtPnBXaWRnZXQgOiBOVUxMOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVFJFTEFUSU9OX0xhc3RDaGlsZDogew0KKyAgICAgIHBJdGVtID0gcEl0ZW0tPnBDaGlsZDsNCisgICAgICB3aGlsZSAocEl0ZW0gJiYgcEl0ZW0tPnBOZXh0KSB7DQorICAgICAgICBwSXRlbSA9IHBJdGVtLT5wTmV4dDsNCisgICAgICB9DQorICAgICAgcFJldCA9IHBJdGVtID8gcEl0ZW0tPnBXaWRnZXQgOiBOVUxMOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVFJFTEFUSU9OX1N5c3RlbUZvcm06IHsNCisgICAgICB3aGlsZSAocEl0ZW0pIHsNCisgICAgICAgIGlmIChJc0FibGVOYXRpdmUocEl0ZW0tPnBXaWRnZXQpKSB7DQorICAgICAgICAgIHBSZXQgPSBwSXRlbS0+cFdpZGdldDsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBwSXRlbSA9IHBJdGVtLT5wUGFyZW50Ow0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KKyAgcmV0dXJuIHBSZXQ7DQorfQ0KK2ludDMyX3QgQ0ZXTF9XaWRnZXRNZ3I6OkdldFdpZGdldEluZGV4KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBDRldMX1dpZGdldE1nckl0ZW0qIHBJdGVtID0gR2V0V2lkZ2V0TWdySXRlbShwV2lkZ2V0KTsNCisgIGlmICghcEl0ZW0pDQorICAgIHJldHVybiAtMTsNCisgIHJldHVybiBUcmF2ZWxXaWRnZXRNZ3IocEl0ZW0tPnBQYXJlbnQsIE5VTEwsIHBJdGVtKTsNCit9DQorRlhfQk9PTCBDRldMX1dpZGdldE1ncjo6U2V0V2lkZ2V0SW5kZXgoSUZXTF9XaWRnZXQqIHBXaWRnZXQsIGludDMyX3QgbkluZGV4KSB7DQorICBDRldMX1dpZGdldE1nckl0ZW0qIHBJdGVtID0gR2V0V2lkZ2V0TWdySXRlbShwV2lkZ2V0KTsNCisgIGlmICghcEl0ZW0pDQorICAgIHJldHVybiBGQUxTRTsNCisgIGlmICghcEl0ZW0tPnBQYXJlbnQpDQorICAgIHJldHVybiBGQUxTRTsNCisgIENGV0xfV2lkZ2V0TWdySXRlbSogcENoaWxkID0gcEl0ZW0tPnBQYXJlbnQtPnBDaGlsZDsNCisgIGludDMyX3QgaSA9IDA7DQorICB3aGlsZSAocENoaWxkKSB7DQorICAgIGlmIChwQ2hpbGQgPT0gcEl0ZW0pIHsNCisgICAgICBpZiAoaSA9PSBuSW5kZXgpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgICBpZiAocENoaWxkLT5wUHJldmlvdXMpIHsNCisgICAgICAgIHBDaGlsZC0+cFByZXZpb3VzLT5wTmV4dCA9IHBDaGlsZC0+cE5leHQ7DQorICAgICAgfQ0KKyAgICAgIGlmIChwQ2hpbGQtPnBOZXh0KSB7DQorICAgICAgICBwQ2hpbGQtPnBOZXh0LT5wUHJldmlvdXMgPSBwQ2hpbGQtPnBQcmV2aW91czsNCisgICAgICB9DQorICAgICAgaWYgKHBJdGVtLT5wUGFyZW50LT5wQ2hpbGQgPT0gcEl0ZW0pIHsNCisgICAgICAgIHBJdGVtLT5wUGFyZW50LT5wQ2hpbGQgPSBwSXRlbS0+cE5leHQ7DQorICAgICAgfQ0KKyAgICAgIHBJdGVtLT5wTmV4dCA9IE5VTEw7DQorICAgICAgcEl0ZW0tPnBQcmV2aW91cyA9IE5VTEw7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKCFwQ2hpbGQtPnBOZXh0KSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgcENoaWxkID0gcENoaWxkLT5wTmV4dDsNCisgICAgKytpOw0KKyAgfQ0KKyAgcENoaWxkID0gcEl0ZW0tPnBQYXJlbnQtPnBDaGlsZDsNCisgIGlmIChwQ2hpbGQpIHsNCisgICAgaWYgKG5JbmRleCA8IDApIHsNCisgICAgICB3aGlsZSAocENoaWxkLT5wTmV4dCkgew0KKyAgICAgICAgcENoaWxkID0gcENoaWxkLT5wTmV4dDsNCisgICAgICB9DQorICAgICAgcENoaWxkLT5wTmV4dCA9IHBJdGVtOw0KKyAgICAgIHBJdGVtLT5wUHJldmlvdXMgPSBwQ2hpbGQ7DQorICAgICAgcEl0ZW0tPnBOZXh0ID0gTlVMTDsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBpID0gMDsNCisgICAgd2hpbGUgKGkgPCBuSW5kZXggJiYgcENoaWxkLT5wTmV4dCkgew0KKyAgICAgIHBDaGlsZCA9IHBDaGlsZC0+cE5leHQ7DQorICAgICAgKytpOw0KKyAgICB9DQorICAgIGlmICghcENoaWxkLT5wTmV4dCkgew0KKyAgICAgIHBDaGlsZC0+cE5leHQgPSBwSXRlbTsNCisgICAgICBwSXRlbS0+cFByZXZpb3VzID0gcENoaWxkOw0KKyAgICAgIHBJdGVtLT5wTmV4dCA9IE5VTEw7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgaWYgKHBDaGlsZC0+cFByZXZpb3VzKSB7DQorICAgICAgcEl0ZW0tPnBQcmV2aW91cyA9IHBDaGlsZC0+cFByZXZpb3VzOw0KKyAgICAgIHBDaGlsZC0+cFByZXZpb3VzLT5wTmV4dCA9IHBJdGVtOw0KKyAgICB9DQorICAgIHBDaGlsZC0+cFByZXZpb3VzID0gcEl0ZW07DQorICAgIHBJdGVtLT5wTmV4dCA9IHBDaGlsZDsNCisgICAgaWYgKHBJdGVtLT5wUGFyZW50LT5wQ2hpbGQgPT0gcENoaWxkKSB7DQorICAgICAgcEl0ZW0tPnBQYXJlbnQtPnBDaGlsZCA9IHBJdGVtOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBwSXRlbS0+cFBhcmVudC0+cENoaWxkID0gcEl0ZW07DQorICAgIHBJdGVtLT5wUHJldmlvdXMgPSBOVUxMOw0KKyAgICBwSXRlbS0+cE5leHQgPSBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRNZ3I6OlJlcGFpbnRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0KSB7DQorICBpZiAoIW1fcEFkYXB0ZXIpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBJRldMX1dpZGdldCogcE5hdGl2ZSA9IHBXaWRnZXQ7DQorICBDRlhfUmVjdEYgcmVjdCgqcFJlY3QpOw0KKyAgaWYgKElzRm9ybURpc2FibGVkKCkpIHsNCisgICAgSUZXTF9XaWRnZXQqIHBPdXRlciA9IHBXaWRnZXQtPkdldE91dGVyKCk7DQorICAgIHdoaWxlIChwT3V0ZXIpIHsNCisgICAgICBDRlhfUmVjdEYgcnRUZW1wOw0KKyAgICAgIHBOYXRpdmUtPkdldFdpZGdldFJlY3QocnRUZW1wKTsNCisgICAgICByZWN0LmxlZnQgKz0gcnRUZW1wLmxlZnQ7DQorICAgICAgcmVjdC50b3AgKz0gcnRUZW1wLnRvcDsNCisgICAgICBwTmF0aXZlID0gcE91dGVyOw0KKyAgICAgIHBPdXRlciA9IHBPdXRlci0+R2V0T3V0ZXIoKTsNCisgICAgfQ0KKyAgfSBlbHNlIGlmICghSXNBYmxlTmF0aXZlKHBXaWRnZXQpKSB7DQorICAgIHBOYXRpdmUgPSBHZXRXaWRnZXQocFdpZGdldCwgRldMX1dHVFJFTEFUSU9OX1N5c3RlbUZvcm0pOw0KKyAgICBpZiAoIXBOYXRpdmUpDQorICAgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgICAgcFdpZGdldC0+VHJhbnNmb3JtVG8ocE5hdGl2ZSwgcmVjdC5sZWZ0LCByZWN0LnRvcCk7DQorICB9DQorICBBZGRSZWRyYXdDb3VudHMocE5hdGl2ZSk7DQorICByZXR1cm4gbV9wQWRhcHRlci0+UmVwYWludFdpZGdldChwTmF0aXZlLCAmcmVjdCk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRNZ3I6OkFkZFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwUGFyZW50SXRlbSA9IEdldFdpZGdldE1nckl0ZW0oTlVMTCk7DQorICBDRldMX1dpZGdldE1nckl0ZW0qIHBJdGVtID0gR2V0V2lkZ2V0TWdySXRlbShwV2lkZ2V0KTsNCisgIGlmICghcEl0ZW0pIHsNCisgICAgcEl0ZW0gPSBuZXcgQ0ZXTF9XaWRnZXRNZ3JJdGVtOw0KKyAgICBwSXRlbS0+cFdpZGdldCA9IHBXaWRnZXQ7DQorICAgIG1fbWFwV2lkZ2V0SXRlbS5TZXRBdChwV2lkZ2V0LCBwSXRlbSk7DQorICB9DQorICBpZiAocEl0ZW0tPnBQYXJlbnQgJiYgcEl0ZW0tPnBQYXJlbnQgIT0gcFBhcmVudEl0ZW0pIHsNCisgICAgaWYgKHBJdGVtLT5wUHJldmlvdXMpIHsNCisgICAgICBwSXRlbS0+cFByZXZpb3VzLT5wTmV4dCA9IHBJdGVtLT5wTmV4dDsNCisgICAgfQ0KKyAgICBpZiAocEl0ZW0tPnBOZXh0KSB7DQorICAgICAgcEl0ZW0tPnBOZXh0LT5wUHJldmlvdXMgPSBwSXRlbS0+cFByZXZpb3VzOw0KKyAgICB9DQorICAgIGlmIChwSXRlbS0+cFBhcmVudC0+cENoaWxkID09IHBJdGVtKSB7DQorICAgICAgcEl0ZW0tPnBQYXJlbnQtPnBDaGlsZCA9IHBJdGVtLT5wTmV4dDsNCisgICAgfQ0KKyAgfQ0KKyAgcEl0ZW0tPnBQYXJlbnQgPSBwUGFyZW50SXRlbTsNCisgIFNldFdpZGdldEluZGV4KHBXaWRnZXQsIC0xKTsNCit9DQordm9pZCBDRldMX1dpZGdldE1ncjo6SW5zZXJ0V2lkZ2V0KElGV0xfV2lkZ2V0KiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcENoaWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCkgew0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwUGFyZW50SXRlbSA9IEdldFdpZGdldE1nckl0ZW0ocFBhcmVudCk7DQorICBpZiAoIXBQYXJlbnRJdGVtKSB7DQorICAgIHBQYXJlbnRJdGVtID0gbmV3IENGV0xfV2lkZ2V0TWdySXRlbTsNCisgICAgcFBhcmVudEl0ZW0tPnBXaWRnZXQgPSBwUGFyZW50Ow0KKyAgICBtX21hcFdpZGdldEl0ZW0uU2V0QXQocFBhcmVudCwgcFBhcmVudEl0ZW0pOw0KKyAgICBDRldMX1dpZGdldE1nckl0ZW0qIHBSb290ID0gR2V0V2lkZ2V0TWdySXRlbShOVUxMKTsNCisgICAgcFBhcmVudEl0ZW0tPnBQYXJlbnQgPSBwUm9vdDsNCisgICAgU2V0V2lkZ2V0SW5kZXgocFBhcmVudCwgLTEpOw0KKyAgfQ0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwSXRlbSA9IEdldFdpZGdldE1nckl0ZW0ocENoaWxkKTsNCisgIGlmICghcEl0ZW0pIHsNCisgICAgcEl0ZW0gPSBuZXcgQ0ZXTF9XaWRnZXRNZ3JJdGVtOw0KKyAgICBwSXRlbS0+cFdpZGdldCA9IHBDaGlsZDsNCisgICAgbV9tYXBXaWRnZXRJdGVtLlNldEF0KHBDaGlsZCwgcEl0ZW0pOw0KKyAgfQ0KKyAgaWYgKHBJdGVtLT5wUGFyZW50ICYmIHBJdGVtLT5wUGFyZW50ICE9IHBQYXJlbnRJdGVtKSB7DQorICAgIGlmIChwSXRlbS0+cFByZXZpb3VzKSB7DQorICAgICAgcEl0ZW0tPnBQcmV2aW91cy0+cE5leHQgPSBwSXRlbS0+cE5leHQ7DQorICAgIH0NCisgICAgaWYgKHBJdGVtLT5wTmV4dCkgew0KKyAgICAgIHBJdGVtLT5wTmV4dC0+cFByZXZpb3VzID0gcEl0ZW0tPnBQcmV2aW91czsNCisgICAgfQ0KKyAgICBpZiAocEl0ZW0tPnBQYXJlbnQtPnBDaGlsZCA9PSBwSXRlbSkgew0KKyAgICAgIHBJdGVtLT5wUGFyZW50LT5wQ2hpbGQgPSBwSXRlbS0+cE5leHQ7DQorICAgIH0NCisgIH0NCisgIHBJdGVtLT5wUGFyZW50ID0gcFBhcmVudEl0ZW07DQorICBTZXRXaWRnZXRJbmRleChwQ2hpbGQsIG5JbmRleCk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRNZ3I6OlJlbW92ZVdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwSXRlbSA9IEdldFdpZGdldE1nckl0ZW0ocFdpZGdldCk7DQorICBpZiAoIXBJdGVtKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChwSXRlbS0+cFByZXZpb3VzKSB7DQorICAgIHBJdGVtLT5wUHJldmlvdXMtPnBOZXh0ID0gcEl0ZW0tPnBOZXh0Ow0KKyAgfQ0KKyAgaWYgKHBJdGVtLT5wTmV4dCkgew0KKyAgICBwSXRlbS0+cE5leHQtPnBQcmV2aW91cyA9IHBJdGVtLT5wUHJldmlvdXM7DQorICB9DQorICBpZiAocEl0ZW0tPnBQYXJlbnQgJiYgcEl0ZW0tPnBQYXJlbnQtPnBDaGlsZCA9PSBwSXRlbSkgew0KKyAgICBwSXRlbS0+cFBhcmVudC0+cENoaWxkID0gcEl0ZW0tPnBOZXh0Ow0KKyAgfQ0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwQ2hpbGQgPSBwSXRlbS0+cENoaWxkOw0KKyAgd2hpbGUgKHBDaGlsZCkgew0KKyAgICBDRldMX1dpZGdldE1nckl0ZW0qIHBOZXh0ID0gcENoaWxkLT5wTmV4dDsNCisgICAgUmVtb3ZlV2lkZ2V0KHBDaGlsZC0+cFdpZGdldCk7DQorICAgIHBDaGlsZCA9IHBOZXh0Ow0KKyAgfQ0KKyAgbV9tYXBXaWRnZXRJdGVtLlJlbW92ZUtleShwV2lkZ2V0KTsNCisgIGRlbGV0ZSBwSXRlbTsNCit9DQordm9pZCBDRldMX1dpZGdldE1ncjo6U2V0T3duZXIoSUZXTF9XaWRnZXQqIHBPd25lciwgSUZXTF9XaWRnZXQqIHBPd25lZCkgew0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwUGFyZW50SXRlbSA9IEdldFdpZGdldE1nckl0ZW0ocE93bmVyKTsNCisgIGlmICghcFBhcmVudEl0ZW0pIHsNCisgICAgcFBhcmVudEl0ZW0gPSBuZXcgQ0ZXTF9XaWRnZXRNZ3JJdGVtOw0KKyAgICBwUGFyZW50SXRlbS0+cFdpZGdldCA9IHBPd25lcjsNCisgICAgbV9tYXBXaWRnZXRJdGVtLlNldEF0KHBPd25lciwgcFBhcmVudEl0ZW0pOw0KKyAgICBDRldMX1dpZGdldE1nckl0ZW0qIHBSb290ID0gR2V0V2lkZ2V0TWdySXRlbShOVUxMKTsNCisgICAgcFBhcmVudEl0ZW0tPnBQYXJlbnQgPSBwUm9vdDsNCisgICAgU2V0V2lkZ2V0SW5kZXgocE93bmVyLCAtMSk7DQorICB9DQorICBDRldMX1dpZGdldE1nckl0ZW0qIHBJdGVtID0gR2V0V2lkZ2V0TWdySXRlbShwT3duZWQpOw0KKyAgaWYgKCFwSXRlbSkgew0KKyAgICBwSXRlbSA9IG5ldyBDRldMX1dpZGdldE1nckl0ZW07DQorICAgIHBJdGVtLT5wV2lkZ2V0ID0gcE93bmVkOw0KKyAgICBtX21hcFdpZGdldEl0ZW0uU2V0QXQocE93bmVkLCBwSXRlbSk7DQorICB9DQorICBwSXRlbS0+cE93bmVyID0gcFBhcmVudEl0ZW07DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRNZ3I6OlNldFBhcmVudChJRldMX1dpZGdldCogcFBhcmVudCwgSUZXTF9XaWRnZXQqIHBDaGlsZCkgew0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwUGFyZW50SXRlbSA9IEdldFdpZGdldE1nckl0ZW0ocFBhcmVudCk7DQorICBDRldMX1dpZGdldE1nckl0ZW0qIHBJdGVtID0gR2V0V2lkZ2V0TWdySXRlbShwQ2hpbGQpOw0KKyAgaWYgKCFwSXRlbSkNCisgICAgcmV0dXJuOw0KKyAgaWYgKHBJdGVtLT5wUGFyZW50ICYmIHBJdGVtLT5wUGFyZW50ICE9IHBQYXJlbnRJdGVtKSB7DQorICAgIGlmIChwSXRlbS0+cFByZXZpb3VzKSB7DQorICAgICAgcEl0ZW0tPnBQcmV2aW91cy0+cE5leHQgPSBwSXRlbS0+cE5leHQ7DQorICAgIH0NCisgICAgaWYgKHBJdGVtLT5wTmV4dCkgew0KKyAgICAgIHBJdGVtLT5wTmV4dC0+cFByZXZpb3VzID0gcEl0ZW0tPnBQcmV2aW91czsNCisgICAgfQ0KKyAgICBpZiAocEl0ZW0tPnBQYXJlbnQtPnBDaGlsZCA9PSBwSXRlbSkgew0KKyAgICAgIHBJdGVtLT5wUGFyZW50LT5wQ2hpbGQgPSBwSXRlbS0+cE5leHQ7DQorICAgIH0NCisgICAgcEl0ZW0tPnBOZXh0ID0gTlVMTDsNCisgICAgcEl0ZW0tPnBQcmV2aW91cyA9IE5VTEw7DQorICB9DQorICBwSXRlbS0+cFBhcmVudCA9IHBQYXJlbnRJdGVtOw0KKyAgU2V0V2lkZ2V0SW5kZXgocENoaWxkLCAtMSk7DQorICBpZiAoIW1fcEFkYXB0ZXIpDQorICAgIHJldHVybjsNCisgIG1fcEFkYXB0ZXItPlNldFBhcmVudFdpZGdldChwQ2hpbGQsIHBQYXJlbnQpOw0KK30NCitGWF9CT09MIENGV0xfV2lkZ2V0TWdyOjpJc0NoaWxkKElGV0xfV2lkZ2V0KiBwQ2hpbGQsIElGV0xfV2lkZ2V0KiBwUGFyZW50KSB7DQorICBJRldMX1dpZGdldCogcFRlbXAgPSBwQ2hpbGQ7DQorICBkbyB7DQorICAgIGlmIChwVGVtcCA9PSBwUGFyZW50KSB7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgcFRlbXAgPSBHZXRXaWRnZXQocFRlbXAsIEZXTF9XR1RSRUxBVElPTl9QYXJlbnQpOw0KKyAgfSB3aGlsZSAocFRlbXApOw0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0TWdyOjpDcmVhdGVXaWRnZXRfTmF0aXZlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBpZiAoIUlzQWJsZU5hdGl2ZShwV2lkZ2V0KSkgew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICByZXR1cm4gbV9wQWRhcHRlci0+Q3JlYXRlV2lkZ2V0KHBXaWRnZXQsIHBXaWRnZXQtPkdldE93bmVyKCkpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0TWdyOjpEZXN0cm95V2lkZ2V0X05hdGl2ZShJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgaWYgKCFJc0FibGVOYXRpdmUocFdpZGdldCkpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcEFkYXB0ZXItPkRlc3Ryb3lXaWRnZXQocFdpZGdldCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRNZ3I6OkdldFdpZGdldFJlY3RfTmF0aXZlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcmVjdCkgew0KKyAgaWYgKCFJc0FibGVOYXRpdmUocFdpZGdldCkpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcEFkYXB0ZXItPkdldFdpZGdldFJlY3QocFdpZGdldCwgcmVjdCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRNZ3I6OlNldFdpZGdldFJlY3RfTmF0aXZlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCkgew0KKyAgaWYgKEZXTF9Vc2VPZmZzY3JlZW4ocFdpZGdldCkpIHsNCisgICAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwSXRlbSA9IEdldFdpZGdldE1nckl0ZW0ocFdpZGdldCk7DQorICAgIHBJdGVtLT5pUmVkcmF3Q291bnRlcisrOw0KKyAgICBpZiAocEl0ZW0tPnBPZmZzY3JlZW4pIHsNCisgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlID0gcEl0ZW0tPnBPZmZzY3JlZW4tPkdldFJlbmRlckRldmljZSgpOw0KKyAgICAgIGlmIChwRGV2aWNlICYmIHBEZXZpY2UtPkdldEJpdG1hcCgpKSB7DQorICAgICAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBwRGV2aWNlLT5HZXRCaXRtYXAoKTsNCisgICAgICAgIGlmIChwQml0bWFwLT5HZXRXaWR0aCgpIC0gcmVjdC53aWR0aCA+IDEgfHwNCisgICAgICAgICAgICBwQml0bWFwLT5HZXRIZWlnaHQoKSAtIHJlY3QuaGVpZ2h0ID4gMSkgew0KKyAgICAgICAgICBkZWxldGUgcEl0ZW0tPnBPZmZzY3JlZW47DQorICAgICAgICAgIHBJdGVtLT5wT2Zmc2NyZWVuID0gTlVMTDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisjaWYgKF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfKSB8fCAoX0ZYX09TXyA9PSBfRlhfV0lONjRfKQ0KKyAgICBwSXRlbS0+Yk91dHNpZGVDaGFuZ2VkID0gIW1fcnRTY3JlZW4uQ29udGFpbnMocmVjdCk7DQorI2VuZGlmDQorICB9DQorICByZXR1cm4gbV9wQWRhcHRlci0+U2V0V2lkZ2V0UmVjdChwV2lkZ2V0LCByZWN0KTsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldE1ncjo6U2V0V2lkZ2V0UG9zaXRpb25fTmF0aXZlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIHJldHVybiBtX3BBZGFwdGVyLT5TZXRXaWRnZXRQb3NpdGlvbihwV2lkZ2V0LCBmeCwgZnkpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0TWdyOjpTZXRXaWRnZXRJY29uX05hdGl2ZShJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBJY29uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkJpZykgew0KKyAgcmV0dXJuIG1fcEFkYXB0ZXItPlNldFdpZGdldEljb24ocFdpZGdldCwgcEljb24sIGJCaWcpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0TWdyOjpTZXRXaWRnZXRDYXB0aW9uX05hdGl2ZSgNCisgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDYXB0aW9uKSB7DQorICByZXR1cm4gbV9wQWRhcHRlci0+U2V0V2lkZ2V0Q2FwdGlvbihwV2lkZ2V0LCB3c0NhcHRpb24pOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0TWdyOjpTZXRCb3JkZXJSZWdpb25fTmF0aXZlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGgqIHBQYXRoKSB7DQorICByZXR1cm4gbV9wQWRhcHRlci0+U2V0Qm9yZGVyUmVnaW9uKHBXaWRnZXQsIHBQYXRoKTsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldE1ncjo6U2hvd1dpZGdldF9OYXRpdmUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBtX3BBZGFwdGVyLT5TaG93V2lkZ2V0KHBXaWRnZXQpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0TWdyOjpIaWRlV2lkZ2V0X05hdGl2ZShJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIG1fcEFkYXB0ZXItPkhpZGVXaWRnZXQocFdpZGdldCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRNZ3I6OlNldE5vcm1hbF9OYXRpdmUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBtX3BBZGFwdGVyLT5TZXROb3JtYWwocFdpZGdldCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRNZ3I6OlNldE1heGltaXplX05hdGl2ZShJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIG1fcEFkYXB0ZXItPlNldE1heGltaXplKHBXaWRnZXQpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0TWdyOjpTZXRNaW5pbWl6ZV9OYXRpdmUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBtX3BBZGFwdGVyLT5TZXRNaW5pbWl6ZShwV2lkZ2V0KTsNCit9DQorRlhfQk9PTCBDRldMX1dpZGdldE1ncjo6Q2hlY2tNZXNzYWdlX05hdGl2ZSgpIHsNCisgIHJldHVybiBtX3BBZGFwdGVyLT5DaGVja01lc3NhZ2UoKTsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldE1ncjo6RGlzcGF0Y2hNZXNzYWdlX05hdGl2ZSgpIHsNCisgIHJldHVybiBtX3BBZGFwdGVyLT5EaXNwYXRjaE1lc3NhZ2UoKTsNCit9DQorRlhfQk9PTCBDRldMX1dpZGdldE1ncjo6SXNJZGxlTWVzc2FnZV9OYXRpdmUoKSB7DQorICByZXR1cm4gbV9wQWRhcHRlci0+SXNJZGxlTWVzc2FnZSgpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0TWdyOjpFeGl0X05hdGl2ZShpbnQzMl90IGlFeGl0Q29kZSkgew0KKyAgcmV0dXJuIG1fcEFkYXB0ZXItPkV4aXQoaUV4aXRDb2RlKTsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldE1ncjo6Q3JlYXRlV2lkZ2V0V2l0aE5hdGl2ZUlkX05hdGl2ZShJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHZwKSB7DQorICByZXR1cm4gbV9wQWRhcHRlci0+Q3JlYXRlV2lkZ2V0V2l0aE5hdGl2ZUlkKHBXaWRnZXQsIHZwKTsNCit9DQorSUZXTF9XaWRnZXQqIENGV0xfV2lkZ2V0TWdyOjpHZXRXaWRnZXRBdFBvaW50KElGV0xfV2lkZ2V0KiBwYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkpIHsNCisgIGlmICghcGFyZW50KQ0KKyAgICByZXR1cm4gTlVMTDsNCisgIEZYX0ZMT0FUIHgxOw0KKyAgRlhfRkxPQVQgeTE7DQorICBJRldMX1dpZGdldCogY2hpbGQgPSBHZXRXaWRnZXQocGFyZW50LCBGV0xfV0dUUkVMQVRJT05fTGFzdENoaWxkKTsNCisgIHdoaWxlIChjaGlsZCkgew0KKyAgICBpZiAoKGNoaWxkLT5HZXRTdGF0ZXMoKSAmIEZXTF9XR1RTVEFURV9JbnZpc2libGUpID09IDApIHsNCisgICAgICB4MSA9IHg7DQorICAgICAgeTEgPSB5Ow0KKyAgICAgIENGWF9NYXRyaXggbWF0cml4T25QYXJlbnQ7DQorICAgICAgY2hpbGQtPkdldE1hdHJpeChtYXRyaXhPblBhcmVudCk7DQorICAgICAgQ0ZYX01hdHJpeCBtOw0KKyAgICAgIG0uU2V0SWRlbnRpdHkoKTsNCisgICAgICBtLlNldFJldmVyc2UobWF0cml4T25QYXJlbnQpOw0KKyAgICAgIG0uVHJhbnNmb3JtUG9pbnQoeDEsIHkxKTsNCisgICAgICBDRlhfUmVjdEYgYm91bmRzOw0KKyAgICAgIGNoaWxkLT5HZXRXaWRnZXRSZWN0KGJvdW5kcyk7DQorICAgICAgaWYgKGJvdW5kcy5Db250YWlucyh4MSwgeTEpKSB7DQorICAgICAgICB4MSAtPSBib3VuZHMubGVmdDsNCisgICAgICAgIHkxIC09IGJvdW5kcy50b3A7DQorICAgICAgICByZXR1cm4gR2V0V2lkZ2V0QXRQb2ludChjaGlsZCwgeDEsIHkxKTsNCisgICAgICB9DQorICAgIH0NCisgICAgY2hpbGQgPSBHZXRXaWRnZXQoY2hpbGQsIEZXTF9XR1RSRUxBVElPTl9QcmlvclNpYmxpbmcpOw0KKyAgfQ0KKyAgcmV0dXJuIHBhcmVudDsNCit9DQordm9pZCBDRldMX1dpZGdldE1ncjo6Tm90aWZ5U2l6ZUNoYW5nZWQoSUZXTF9XaWRnZXQqIHBGb3JtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICBpZiAoIUZXTF9Vc2VPZmZzY3JlZW4ocEZvcm0pKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGV0xfV2lkZ2V0TWdySXRlbSogcEl0ZW0gPSBHZXRXaWRnZXRNZ3JJdGVtKHBGb3JtKTsNCisgIGlmIChwSXRlbS0+cE9mZnNjcmVlbikgew0KKyAgICBkZWxldGUgcEl0ZW0tPnBPZmZzY3JlZW47DQorICAgIHBJdGVtLT5wT2Zmc2NyZWVuID0gTlVMTDsNCisgIH0NCit9DQorSUZXTF9XaWRnZXQqIENGV0xfV2lkZ2V0TWdyOjpuZXh0VGFiKElGV0xfV2lkZ2V0KiBwYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBmb2N1cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkZpbmQpIHsNCisgIElGV0xfV2lkZ2V0KiBjaGlsZCA9DQorICAgICAgRldMX0dldFdpZGdldE1ncigpLT5HZXRXaWRnZXQocGFyZW50LCBGV0xfV0dUUkVMQVRJT05fRmlyc3RDaGlsZCk7DQorICB3aGlsZSAoY2hpbGQpIHsNCisgICAgaWYgKGZvY3VzID09IGNoaWxkKSB7DQorICAgICAgYkZpbmQgPSBUUlVFOw0KKyAgICB9DQorICAgIGlmICgoY2hpbGQtPkdldFN0eWxlcygpICYgRldMX1dHVFNUWUxFX1RhYlN0b3ApICYmDQorICAgICAgICAoIWZvY3VzIHx8IChmb2N1cyAhPSBjaGlsZCAmJiBiRmluZCkpKSB7DQorICAgICAgcmV0dXJuIGNoaWxkOw0KKyAgICB9DQorICAgIElGV0xfV2lkZ2V0KiBiUmV0ID0gbmV4dFRhYihjaGlsZCwgZm9jdXMsIGJGaW5kKTsNCisgICAgaWYgKGJSZXQpIHsNCisgICAgICByZXR1cm4gYlJldDsNCisgICAgfQ0KKyAgICBjaGlsZCA9IEZXTF9HZXRXaWRnZXRNZ3IoKS0+R2V0V2lkZ2V0KGNoaWxkLCBGV0xfV0dUUkVMQVRJT05fTmV4dFNpYmxpbmcpOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK2ludDMyX3QgQ0ZXTF9XaWRnZXRNZ3I6OkNvdW50UmFkaW9CdXR0b25Hcm91cChJRldMX1dpZGdldCogcEZpcnN0KSB7DQorICBpbnQzMl90IGlSZXQgPSAwOw0KKyAgSUZXTF9XaWRnZXQqIHBDaGlsZCA9IHBGaXJzdDsNCisgIHdoaWxlIChwQ2hpbGQpIHsNCisgICAgaWYgKChwQ2hpbGQtPkdldFN0eWxlcygpICYgRldMX1dHVFNUWUxFX0dyb3VwKSAmJg0KKyAgICAgICAgcENoaWxkLT5HZXRDbGFzc0lEKCkgPT0gMzgxMTMwNDY5MSkgew0KKyAgICAgIGlSZXQrKzsNCisgICAgfQ0KKyAgICBwQ2hpbGQgPSBHZXRXaWRnZXQocENoaWxkLCBGV0xfV0dUUkVMQVRJT05fTmV4dFNpYmxpbmcpOw0KKyAgfQ0KKyAgcmV0dXJuIGlSZXQ7DQorfQ0KK0lGV0xfV2lkZ2V0KiBDRldMX1dpZGdldE1ncjo6R2V0U2libGluZ1JhZGlvQnV0dG9uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5leHQpIHsNCisgIHdoaWxlICgocFdpZGdldCA9IEdldFdpZGdldChwV2lkZ2V0LCBiTmV4dCA/IEZXTF9XR1RSRUxBVElPTl9OZXh0U2libGluZw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRldMX1dHVFJFTEFUSU9OX1ByaW9yU2libGluZykpICE9DQorICAgICAgICAgTlVMTCkgew0KKyAgICBpZiAocFdpZGdldC0+R2V0Q2xhc3NJRCgpID09IDM4MTEzMDQ2OTEpIHsNCisgICAgICByZXR1cm4gcFdpZGdldDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0lGV0xfV2lkZ2V0KiBDRldMX1dpZGdldE1ncjo6R2V0UmFkaW9CdXR0b25Hcm91cEhlYWRlcigNCisgICAgSUZXTF9XaWRnZXQqIHBSYWRpb0J1dHRvbikgew0KKyAgaWYgKHBSYWRpb0J1dHRvbi0+R2V0U3R5bGVzKCkgJiBGV0xfV0dUU1RZTEVfR3JvdXApIHsNCisgICAgcmV0dXJuIHBSYWRpb0J1dHRvbjsNCisgIH0NCisgIElGV0xfV2lkZ2V0KiBwTmV4dCA9IHBSYWRpb0J1dHRvbjsNCisgIHdoaWxlICgocE5leHQgPSBHZXRTaWJsaW5nUmFkaW9CdXR0b24ocE5leHQsIEZBTFNFKSkgIT0gTlVMTCkgew0KKyAgICBpZiAocE5leHQtPkdldFN0eWxlcygpICYgRldMX1dHVFNUWUxFX0dyb3VwKSB7DQorICAgICAgcmV0dXJuIHBOZXh0Ow0KKyAgICB9DQorICB9DQorICBwTmV4dCA9IEdldFdpZGdldChwUmFkaW9CdXR0b24sIEZXTF9XR1RSRUxBVElPTl9MYXN0U2libGluZyk7DQorICBpZiAoKHBOZXh0LT5HZXRTdHlsZXMoKSAmIEZXTF9XR1RTVFlMRV9Hcm91cCkgJiYNCisgICAgICBwTmV4dC0+R2V0Q2xhc3NJRCgpID09IDM4MTEzMDQ2OTEpIHsNCisgICAgcmV0dXJuIHBOZXh0Ow0KKyAgfQ0KKyAgd2hpbGUgKChwTmV4dCA9IEdldFNpYmxpbmdSYWRpb0J1dHRvbihwTmV4dCwgRkFMU0UpKSAmJiBwTmV4dCAmJg0KKyAgICAgICAgIHBOZXh0ICE9IHBSYWRpb0J1dHRvbikgew0KKyAgICBpZiAocE5leHQtPkdldFN0eWxlcygpICYgRldMX1dHVFNUWUxFX0dyb3VwKSB7DQorICAgICAgcmV0dXJuIHBOZXh0Ow0KKyAgICB9DQorICB9DQorICBwTmV4dCA9IEdldFdpZGdldChwUmFkaW9CdXR0b24sIEZXTF9XR1RSRUxBVElPTl9GaXJzdFNpYmxpbmcpOw0KKyAgaWYgKHBOZXh0ICYmIChwTmV4dC0+R2V0U3R5bGVzKCkgPT0gRldMX1dHVFNUWUxFX0dyb3VwKSAmJg0KKyAgICAgIHBOZXh0LT5HZXRDbGFzc0lEKCkgPT0gMzgxMTMwNDY5MSkgew0KKyAgICByZXR1cm4gcE5leHQ7DQorICB9DQorICByZXR1cm4gR2V0U2libGluZ1JhZGlvQnV0dG9uKHBOZXh0LCBUUlVFKTsNCit9DQordm9pZCBDRldMX1dpZGdldE1ncjo6R2V0U2FtZUdyb3VwUmFkaW9CdXR0b24oSUZXTF9XaWRnZXQqIHBSYWRpb0J1dHRvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkmIGdyb3VwKSB7DQorICBJRldMX1dpZGdldCogcEZpcnN0ID0gR2V0V2lkZ2V0KHBSYWRpb0J1dHRvbiwgRldMX1dHVFJFTEFUSU9OX0ZpcnN0U2libGluZyk7DQorICBpZiAoIXBGaXJzdCkgew0KKyAgICBwRmlyc3QgPSBwUmFkaW9CdXR0b247DQorICB9DQorICBpbnQzMl90IGlHcm91cCA9IENvdW50UmFkaW9CdXR0b25Hcm91cChwRmlyc3QpOw0KKyAgaWYgKGlHcm91cCA8IDIpIHsNCisgICAgaWYgKHBGaXJzdC0+R2V0Q2xhc3NJRCgpID09IDM4MTEzMDQ2OTEpIHsNCisgICAgICBncm91cC5BZGQocEZpcnN0KTsNCisgICAgfQ0KKyAgICBJRldMX1dpZGdldCogcE5leHQgPSBwRmlyc3Q7DQorICAgIHdoaWxlICgocE5leHQgPSBHZXRTaWJsaW5nUmFkaW9CdXR0b24ocE5leHQsIFRSVUUpKSAhPSBOVUxMKSB7DQorICAgICAgZ3JvdXAuQWRkKHBOZXh0KTsNCisgICAgfQ0KKyAgICByZXR1cm47DQorICB9DQorICBJRldMX1dpZGdldCogcE5leHQgPSBHZXRSYWRpb0J1dHRvbkdyb3VwSGVhZGVyKHBSYWRpb0J1dHRvbik7DQorICBkbyB7DQorICAgIGdyb3VwLkFkZChwTmV4dCk7DQorICAgIHBOZXh0ID0gR2V0U2libGluZ1JhZGlvQnV0dG9uKHBOZXh0LCBUUlVFKTsNCisgICAgaWYgKCFwTmV4dCkgew0KKyAgICAgIGlmIChwRmlyc3QtPkdldENsYXNzSUQoKSA9PSAzODExMzA0NjkxKSB7DQorICAgICAgICBwTmV4dCA9IHBGaXJzdDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcE5leHQgPSBHZXRTaWJsaW5nUmFkaW9CdXR0b24ocEZpcnN0LCBUUlVFKTsNCisgICAgICB9DQorICAgIH0NCisgIH0gd2hpbGUgKHBOZXh0ICYmICgocE5leHQtPkdldFN0eWxlcygpICYgRldMX1dHVFNUWUxFX0dyb3VwKSA9PSAwKSk7DQorfQ0KK0lGV0xfV2lkZ2V0KiBDRldMX1dpZGdldE1ncjo6R2V0RGVmYXVsdEJ1dHRvbihJRldMX1dpZGdldCogcFBhcmVudCkgew0KKyAgaWYgKChwUGFyZW50LT5HZXRDbGFzc0lEKCkgPT0gMzUyMTYxNDI0NCkgJiYNCisgICAgICAocFBhcmVudC0+R2V0U3RhdGVzKCkgJiAoMSA8PCAoRldMX1dHVFNUQVRFX01BWCArIDIpKSkpIHsNCisgICAgcmV0dXJuIHBQYXJlbnQ7DQorICB9DQorICBJRldMX1dpZGdldCogY2hpbGQgPQ0KKyAgICAgIEZXTF9HZXRXaWRnZXRNZ3IoKS0+R2V0V2lkZ2V0KHBQYXJlbnQsIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkKTsNCisgIHdoaWxlIChjaGlsZCkgew0KKyAgICBpZiAoKGNoaWxkLT5HZXRDbGFzc0lEKCkgPT0gMzUyMTYxNDI0NCkgJiYNCisgICAgICAgIChjaGlsZC0+R2V0U3RhdGVzKCkgJiAoMSA8PCAoRldMX1dHVFNUQVRFX01BWCArIDIpKSkpIHsNCisgICAgICByZXR1cm4gY2hpbGQ7DQorICAgIH0NCisgICAgSUZXTF9XaWRnZXQqIGZpbmQgPSBHZXREZWZhdWx0QnV0dG9uKGNoaWxkKTsNCisgICAgaWYgKGZpbmQpIHsNCisgICAgICByZXR1cm4gZmluZDsNCisgICAgfQ0KKyAgICBjaGlsZCA9IEZXTF9HZXRXaWRnZXRNZ3IoKS0+R2V0V2lkZ2V0KGNoaWxkLCBGV0xfV0dUUkVMQVRJT05fTmV4dFNpYmxpbmcpOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRNZ3I6OkFkZFJlZHJhd0NvdW50cyhJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwSXRlbSA9IEdldFdpZGdldE1nckl0ZW0ocFdpZGdldCk7DQorICAocEl0ZW0tPmlSZWRyYXdDb3VudGVyKSsrOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0TWdyOjpSZXNldFJlZHJhd0NvdW50cyhJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwSXRlbSA9IEdldFdpZGdldE1nckl0ZW0ocFdpZGdldCk7DQorICBwSXRlbS0+aVJlZHJhd0NvdW50ZXIgPSAwOw0KK30NCitDRldMX1dpZGdldE1nckl0ZW0qIENGV0xfV2lkZ2V0TWdyOjpHZXRXaWRnZXRNZ3JJdGVtKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9XaWRnZXRNZ3JJdGVtKj4obV9tYXBXaWRnZXRJdGVtLkdldFZhbHVlQXQocFdpZGdldCkpOw0KK30NCitpbnQzMl90IENGV0xfV2lkZ2V0TWdyOjpUcmF2ZWxXaWRnZXRNZ3IoQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBwSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGV0xfV2lkZ2V0TWdySXRlbSogcEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiogcFdpZGdldCkgew0KKyAgaWYgKCFwUGFyZW50KSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaW50MzJfdCBpQ291bnQgPSAwOw0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwQ2hpbGQgPSBwUGFyZW50LT5wQ2hpbGQ7DQorICB3aGlsZSAocENoaWxkKSB7DQorICAgIGlDb3VudCsrOw0KKyAgICBpZiAocEluZGV4KSB7DQorICAgICAgaWYgKCpwSW5kZXggPT0gMCkgew0KKyAgICAgICAgKnBXaWRnZXQgPSBwQ2hpbGQtPnBXaWRnZXQ7DQorICAgICAgICByZXR1cm4gaUNvdW50Ow0KKyAgICAgIH0NCisgICAgICBwSW5kZXgtLTsNCisgICAgfQ0KKyAgICBpZiAocEl0ZW0gJiYgcEl0ZW0gPT0gcENoaWxkKSB7DQorICAgICAgcmV0dXJuIGlDb3VudCAtIDE7DQorICAgIH0NCisgICAgcENoaWxkID0gcENoaWxkLT5wTmV4dDsNCisgIH0NCisgIGlmIChwSW5kZXgpIHsNCisgICAgcmV0dXJuIDA7DQorICB9IGVsc2UgaWYgKHBJdGVtKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIHJldHVybiBpQ291bnQgLSAxOw0KK30NCitGWF9CT09MIENGV0xfV2lkZ2V0TWdyOjpJc0FibGVOYXRpdmUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIGlmICghcFdpZGdldCkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgaWYgKCFwV2lkZ2V0LT5Jc0luc3RhbmNlKEZYX1dTVFJDKEZXTF9DTEFTU19Gb3JtKSkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRlhfRFdPUkQgZHdTdHlsZXMgPSBwV2lkZ2V0LT5HZXRTdHlsZXMoKTsNCisgIHJldHVybiAoKGR3U3R5bGVzICYgRldMX1dHVFNUWUxFX1dpbmRvd1R5cGVNYXNrKSA9PQ0KKyAgICAgICAgICBGV0xfV0dUU1RZTEVfT3ZlckxhcHBlcikgfHwNCisgICAgICAgICAoZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfUG9wdXApOw0KK30NCitGWF9CT09MIENGV0xfV2lkZ2V0TWdyOjpJc1RocmVhZEVuYWJsZWQoKSB7DQorICByZXR1cm4gIShtX2R3Q2FwYWJpbGl0eSAmIEZXTF9XR1RNR1JfRGlzYWJsZVRocmVhZCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRNZ3I6OklzRm9ybURpc2FibGVkKCkgew0KKyAgcmV0dXJuIG1fZHdDYXBhYmlsaXR5ICYgRldMX1dHVE1HUl9EaXNhYmxlRm9ybTsNCit9DQorRlhfQk9PTCBDRldMX1dpZGdldE1ncjo6R2V0QWRhcHRlclBvcHVwUG9zKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWluSGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWF4SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0QW5jaG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJ0UG9wdXApIHsNCisgIElGV0xfQWRhcHRlcldpZGdldE1nciogcFNEQXBhcHRlciA9IEdldEFkYXB0ZXJXaWRnZXRNZ3IoKTsNCisgIHJldHVybiBwU0RBcGFwdGVyLT5HZXRQb3B1cFBvcyhwV2lkZ2V0LCBmTWluSGVpZ2h0LCBmTWF4SGVpZ2h0LCBydEFuY2hvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydFBvcHVwKTsNCit9DQorQ0ZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZTo6Q0ZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZShDRldMX1dpZGdldE1nciogcFdpZGdldE1ncikNCisgICAgOiBtX3BXaWRnZXRNZ3IocFdpZGdldE1ncikge30NCitGV0xfRVJSIENGV0xfV2lkZ2V0TWdyRGVsZWdhdGU6Ok9uU2V0Q2FwYWJpbGl0eShGWF9EV09SRCBkd0NhcGFiaWxpdHkpIHsNCisgIG1fcFdpZGdldE1nci0+bV9kd0NhcGFiaWxpdHkgPSBkd0NhcGFiaWxpdHk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK2ludDMyX3QgQ0ZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZVRvRm9ybShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7DQorICBpZiAoIXBNZXNzYWdlKQ0KKyAgICByZXR1cm4gMDsNCisgIGlmICghcE1lc3NhZ2UtPm1fcERzdFRhcmdldCkNCisgICAgcmV0dXJuIDA7DQorICBJRldMX1dpZGdldCogcERzdFdpZGdldCA9IHBNZXNzYWdlLT5tX3BEc3RUYXJnZXQ7DQorICBJRldMX05vdGVUaHJlYWQqIHBOb3RlVGhyZWFkID0gcERzdFdpZGdldC0+R2V0T3duZXJUaHJlYWQoKTsNCisgIGlmICghcE5vdGVUaHJlYWQpDQorICAgIHJldHVybiAwOw0KKyAgQ0ZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9DQorICAgICAgc3RhdGljX2Nhc3Q8Q0ZXTF9Ob3RlRHJpdmVyKj4ocE5vdGVUaHJlYWQtPkdldE5vdGVEcml2ZXIoKSk7DQorICBpZiAoIXBOb3RlRHJpdmVyKQ0KKyAgICByZXR1cm4gMDsNCisgIGlmIChtX3BXaWRnZXRNZ3ItPklzVGhyZWFkRW5hYmxlZCgpKSB7DQorICAgIHBNZXNzYWdlID0gc3RhdGljX2Nhc3Q8Q0ZXTF9NZXNzYWdlKj4ocE1lc3NhZ2UtPkNsb25lKCkpOw0KKyAgfQ0KKyAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgew0KKyAgICBwTm90ZURyaXZlci0+UHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KKyAgfSBlbHNlIHsNCisgICAgcE5vdGVEcml2ZXItPlF1ZXVlTWVzc2FnZShwTWVzc2FnZSk7DQorICB9DQorI2lmIChfRlhfT1NfID09IF9GWF9NQUNPU1hfKQ0KKyAgQ0ZXTF9Ob3RlTG9vcCogcFRvcExvb3AgPSBwTm90ZURyaXZlci0+R2V0VG9wTG9vcCgpOw0KKyAgaWYgKHBUb3BMb29wKSB7DQorICAgIHBOb3RlRHJpdmVyLT5VbnF1ZXVlTWVzc2FnZShwVG9wTG9vcCk7DQorICB9DQorI2VuZGlmDQorICBpZiAobV9wV2lkZ2V0TWdyLT5Jc1RocmVhZEVuYWJsZWQoKSkgew0KKyAgICBwTWVzc2FnZS0+UmVsZWFzZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0TWdyRGVsZWdhdGU6Ok9uRHJhd1dpZGdldChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBpZiAoIXBXaWRnZXQpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBpZiAoIXBHcmFwaGljcykNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIENGWF9HcmFwaGljcyogcFRlbXAgPSBEcmF3V2lkZ2V0QmVmb3JlKHBXaWRnZXQsIHBHcmFwaGljcywgcE1hdHJpeCk7DQorICBDRlhfUmVjdEYgY2xpcENvcHk7DQorICBwV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KGNsaXBDb3B5KTsNCisgIGNsaXBDb3B5LmxlZnQgPSBjbGlwQ29weS50b3AgPSAwOw0KKyAgaWYgKGJVc2VPZmZzY3JlZW5EaXJlY3QocFdpZGdldCkpIHsNCisgICAgRHJhd1dpZGdldEFmdGVyKHBXaWRnZXQsIHBHcmFwaGljcywgY2xpcENvcHksIHBNYXRyaXgpOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICBDRlhfUmVjdEYgY2xpcEJvdW5kczsNCisjaWYgKF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfKSB8fCAoX0ZYX09TXyA9PSBfRlhfV0lONjRfKSB8fCBcDQorICAgIChfRlhfT1NfID09IF9GWF9MSU5VWF9ERVNLVE9QXykgfHwgKF9GWF9PU18gPT0gX0ZYX0FORFJPSURfKQ0KKyAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogcERlbGVnYXRlID0gcFdpZGdldC0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICBwRGVsZWdhdGUtPk9uRHJhd1dpZGdldChwVGVtcCwgcE1hdHJpeCk7DQorICBwR3JhcGhpY3MtPkdldENsaXBSZWN0KGNsaXBCb3VuZHMpOw0KKyAgY2xpcENvcHkgPSBjbGlwQm91bmRzOw0KKyNlbGlmKF9GWF9PU18gPT0gX0ZYX01BQ09TWF8pDQorICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7DQorICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9IHBXaWRnZXQtPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgICBwRGVsZWdhdGUtPk9uRHJhd1dpZGdldChwVGVtcCwgcE1hdHJpeCk7DQorICAgIHBHcmFwaGljcy0+R2V0Q2xpcFJlY3QoY2xpcEJvdW5kcyk7DQorICAgIGNsaXBDb3B5ID0gY2xpcEJvdW5kczsNCisgIH0gZWxzZSB7DQorICAgIGNsaXBCb3VuZHMuU2V0KHBNYXRyaXgtPmEsIHBNYXRyaXgtPmIsIHBNYXRyaXgtPmMsIHBNYXRyaXgtPmQpOw0KKyAgICBjb25zdF9jYXN0PENGWF9NYXRyaXgqPihwTWF0cml4KS0+U2V0SWRlbnRpdHkoKTsgIC8vIEZJWE1FOiBjb25zdCBjYXN0Lg0KKyNpZmRlZiBGV0xfVXNlTWFjU3lzdGVtQm9yZGVyDQorI2Vsc2UNCisjZW5kaWYNCisgICAgew0KKyAgICAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9IHBXaWRnZXQtPlNldERlbGVnYXRlKE5VTEwpOw0KKyAgICAgIHBEZWxlZ2F0ZS0+T25EcmF3V2lkZ2V0KHBUZW1wLCBwTWF0cml4KTsNCisgICAgfQ0KKyAgfQ0KKyNlbmRpZg0KKyAgaWYgKCFtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsNCisgICAgQ0ZYX1JlY3RGIHJ0Q2xpZW50Ow0KKyAgICBwV2lkZ2V0LT5HZXRDbGllbnRSZWN0KHJ0Q2xpZW50KTsNCisgICAgY2xpcEJvdW5kcy5JbnRlcnNlY3QocnRDbGllbnQpOw0KKyAgfQ0KKyAgaWYgKCFjbGlwQm91bmRzLklzRW1wdHkoKSkgew0KKyAgICBEcmF3Q2hpbGQocFdpZGdldCwgY2xpcEJvdW5kcywgcFRlbXAsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgRHJhd1dpZGdldEFmdGVyKHBXaWRnZXQsIHBHcmFwaGljcywgY2xpcENvcHksIHBNYXRyaXgpOw0KKyAgbV9wV2lkZ2V0TWdyLT5SZXNldFJlZHJhd0NvdW50cyhwV2lkZ2V0KTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQordm9pZCBDRldMX1dpZGdldE1nckRlbGVnYXRlOjpEcmF3Q2hpbGQoSUZXTF9XaWRnZXQqIHBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0Q2xpcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBpZiAoIXBhcmVudCkNCisgICAgcmV0dXJuOw0KKyAgRlhfQk9PTCBiRm9ybURpc2FibGUgPSBtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCk7DQorICBJRldMX1dpZGdldCogcE5leHRDaGlsZCA9DQorICAgICAgbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXQocGFyZW50LCBGV0xfV0dUUkVMQVRJT05fRmlyc3RDaGlsZCk7DQorICB3aGlsZSAocE5leHRDaGlsZCkgew0KKyAgICBJRldMX1dpZGdldCogY2hpbGQgPSBwTmV4dENoaWxkOw0KKyAgICBwTmV4dENoaWxkID0gbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXQoY2hpbGQsIEZXTF9XR1RSRUxBVElPTl9OZXh0U2libGluZyk7DQorICAgIGlmIChjaGlsZC0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfSW52aXNpYmxlKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KKyAgICBjaGlsZC0+R2V0V2lkZ2V0UmVjdChydFdpZGdldCk7DQorICAgIGlmIChydFdpZGdldC5Jc0VtcHR5KCkpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBDRlhfTWF0cml4IHdpZGdldE1hdHJpeDsNCisgICAgQ0ZYX1JlY3RGIGNsaXBCb3VuZHMocnRXaWRnZXQpOw0KKyAgICBpZiAoIWJGb3JtRGlzYWJsZSkgew0KKyAgICAgIGNoaWxkLT5HZXRNYXRyaXgod2lkZ2V0TWF0cml4LCBUUlVFKTsNCisgICAgfQ0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgIHdpZGdldE1hdHJpeC5Db25jYXQoKnBNYXRyaXgpOw0KKyAgICB9DQorICAgIGlmICghYkZvcm1EaXNhYmxlKSB7DQorICAgICAgd2lkZ2V0TWF0cml4LlRyYW5zZm9ybVBvaW50KGNsaXBCb3VuZHMubGVmdCwgY2xpcEJvdW5kcy50b3ApOw0KKyAgICAgIGNsaXBCb3VuZHMuSW50ZXJzZWN0KHJ0Q2xpcCk7DQorICAgICAgaWYgKGNsaXBCb3VuZHMuSXNFbXB0eSgpKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICAgIHBHcmFwaGljcy0+U2V0Q2xpcFJlY3QoY2xpcEJvdW5kcyk7DQorICAgIH0NCisgICAgd2lkZ2V0TWF0cml4LlRyYW5zbGF0ZShydFdpZGdldC5sZWZ0LCBydFdpZGdldC50b3AsIFRSVUUpOw0KKyAgICBJRldMX1dpZGdldERlbGVnYXRlKiBwRGVsZWdhdGUgPSBjaGlsZC0+U2V0RGVsZWdhdGUoTlVMTCk7DQorICAgIGlmIChwRGVsZWdhdGUpIHsNCisgICAgICBpZiAobV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpIHx8DQorICAgICAgICAgIElzTmVlZFJlcGFpbnQoY2hpbGQsICZ3aWRnZXRNYXRyaXgsIHJ0Q2xpcCkpIHsNCisgICAgICAgIHBEZWxlZ2F0ZS0+T25EcmF3V2lkZ2V0KHBHcmFwaGljcywgJndpZGdldE1hdHJpeCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmICghYkZvcm1EaXNhYmxlKSB7DQorICAgICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgICB9DQorICAgIERyYXdDaGlsZChjaGlsZCwgY2xpcEJvdW5kcywgcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgYkZvcm1EaXNhYmxlID8gJndpZGdldE1hdHJpeCA6IHBNYXRyaXgpOw0KKyAgICBjaGlsZCA9IG1fcFdpZGdldE1nci0+R2V0V2lkZ2V0KGNoaWxkLCBGV0xfV0dUUkVMQVRJT05fTmV4dFNpYmxpbmcpOw0KKyAgfQ0KK30NCitDRlhfR3JhcGhpY3MqIENGV0xfV2lkZ2V0TWdyRGVsZWdhdGU6OkRyYXdXaWRnZXRCZWZvcmUoDQorICAgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICBDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgaWYgKCFGV0xfVXNlT2Zmc2NyZWVuKHBXaWRnZXQpKSB7DQorICAgIHJldHVybiBwR3JhcGhpY3M7DQorICB9DQorICBDRldMX1dpZGdldE1nckl0ZW0qIHBJdGVtID0gbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXRNZ3JJdGVtKHBXaWRnZXQpOw0KKyAgaWYgKCFwSXRlbS0+cE9mZnNjcmVlbikgew0KKyAgICBwSXRlbS0+cE9mZnNjcmVlbiA9IG5ldyBDRlhfR3JhcGhpY3M7DQorICAgIENGWF9SZWN0RiByZWN0Ow0KKyAgICBwV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJlY3QpOw0KKyAgICBwSXRlbS0+cE9mZnNjcmVlbi0+Q3JlYXRlKChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0FyZ2IpOw0KKyAgfQ0KKyAgQ0ZYX1JlY3RGIHJlY3Q7DQorICBwR3JhcGhpY3MtPkdldENsaXBSZWN0KHJlY3QpOw0KKyAgcEl0ZW0tPnBPZmZzY3JlZW4tPlNldENsaXBSZWN0KHJlY3QpOw0KKyAgcmV0dXJuIHBJdGVtLT5wT2Zmc2NyZWVuOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0TWdyRGVsZWdhdGU6OkRyYXdXaWRnZXRBZnRlcihJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJ0Q2xpcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBpZiAoRldMX1VzZU9mZnNjcmVlbihwV2lkZ2V0KSkgew0KKyAgICBDRldMX1dpZGdldE1nckl0ZW0qIHBJdGVtID0gbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXRNZ3JJdGVtKHBXaWRnZXQpOw0KKyAgICBwR3JhcGhpY3MtPlRyYW5zZmVyKHBJdGVtLT5wT2Zmc2NyZWVuLCBydENsaXAubGVmdCwgcnRDbGlwLnRvcCwgcnRDbGlwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBNYXRyaXgpOw0KKyNpZmRlZiBfV0lOMzINCisgICAgcEl0ZW0tPnBPZmZzY3JlZW4tPkNsZWFyQ2xpcCgpOw0KKyNlbmRpZg0KKyAgfQ0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwSXRlbSA9IG1fcFdpZGdldE1nci0+R2V0V2lkZ2V0TWdySXRlbShwV2lkZ2V0KTsNCisgIHBJdGVtLT5pUmVkcmF3Q291bnRlciA9IDA7DQorfQ0KKyNkZWZpbmUgRldMX05FRURSRVBBSU5USElUX1BvaW50IDEyDQorI2RlZmluZSBGV0xfTkVFRFJFUEFJTlRISVRfUGllY2UgMw0KK3R5cGVkZWYgc3RydWN0IF9GV0xfTmVlZFJlcGFpbnRIaXREYXRhIHsNCisgIENGWF9Qb2ludEYgaGl0UG9pbnQ7DQorICBGWF9CT09MIGJOb3ROZWVkUmVwYWludDsNCisgIEZYX0JPT0wgYk5vdENvbnRhaW5CeURpcnR5Ow0KK30gRldMX05lZWRSZXBhaW50SGl0RGF0YTsNCitGWF9CT09MIENGV0xfV2lkZ2V0TWdyRGVsZWdhdGU6OklzTmVlZFJlcGFpbnQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnREaXJ0eSkgew0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwSXRlbSA9IG1fcFdpZGdldE1nci0+R2V0V2lkZ2V0TWdySXRlbShwV2lkZ2V0KTsNCisgIGlmIChwSXRlbSAmJiBwSXRlbS0+aVJlZHJhd0NvdW50ZXIgPiAwKSB7DQorICAgIHBJdGVtLT5pUmVkcmF3Q291bnRlciA9IDA7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KKyAgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydFdpZGdldCk7DQorICBydFdpZGdldC5sZWZ0ID0gcnRXaWRnZXQudG9wID0gMDsNCisgIHBNYXRyaXgtPlRyYW5zZm9ybVJlY3QocnRXaWRnZXQpOw0KKyAgaWYgKCFydFdpZGdldC5JbnRlcnNlY3RXaXRoKHJ0RGlydHkpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIElGV0xfV2lkZ2V0KiBwQ2hpbGQgPQ0KKyAgICAgIEZXTF9HZXRXaWRnZXRNZ3IoKS0+R2V0V2lkZ2V0KHBXaWRnZXQsIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkKTsNCisgIGlmICghcENoaWxkKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaWYgKHBDaGlsZC0+R2V0Q2xhc3NJRCgpID09IDMxNTAyOTg2NzApIHsNCisgICAgQ0ZYX1JlY3RGIHJ0VGVtcDsNCisgICAgcENoaWxkLT5HZXRXaWRnZXRSZWN0KHJ0VGVtcCk7DQorICAgIGlmIChydFRlbXAud2lkdGggPj0gcnRXaWRnZXQud2lkdGggJiYgcnRUZW1wLmhlaWdodCA+PSBydFdpZGdldC5oZWlnaHQpIHsNCisgICAgICBwQ2hpbGQgPQ0KKyAgICAgICAgICBGV0xfR2V0V2lkZ2V0TWdyKCktPkdldFdpZGdldChwQ2hpbGQsIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkKTsNCisgICAgICBpZiAoIXBDaGlsZCkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBDRlhfUmVjdEYgcnRDaGlsZHM7DQorICBydENoaWxkcy5FbXB0eSgpOw0KKyAgRlhfQk9PTCBiQ2hpbGRJbnRlcnNlY3RXaXRoRGlydHkgPSBGQUxTRTsNCisgIEZYX0JPT0wgYk9yZ2luUHRJbnRlcnNlY3RXaWR0aENoaWxkID0gRkFMU0U7DQorICBGWF9CT09MIGJPcmdpblB0SW50ZXJzZWN0V2lkdGhEaXJ0eSA9DQorICAgICAgcnREaXJ0eS5Db250YWlucyhydFdpZGdldC5sZWZ0LCBydFdpZGdldC50b3ApOw0KKyAgc3RhdGljIEZXTF9OZWVkUmVwYWludEhpdERhdGEgaGl0UG9pbnRbRldMX05FRURSRVBBSU5USElUX1BvaW50XTsNCisgIHN0YXRpYyBpbnQzMl90IGlTaXplID0gc2l6ZW9mKEZXTF9OZWVkUmVwYWludEhpdERhdGEpOw0KKyAgRlhTWVNfbWVtc2V0KGhpdFBvaW50LCAwLCBpU2l6ZSk7DQorICBGWF9GTE9BVCBmeFBpZWNlID0gcnRXaWRnZXQud2lkdGggLyBGV0xfTkVFRFJFUEFJTlRISVRfUGllY2U7DQorICBGWF9GTE9BVCBmeVBpZWNlID0gcnRXaWRnZXQuaGVpZ2h0IC8gRldMX05FRURSRVBBSU5USElUX1BpZWNlOw0KKyAgaGl0UG9pbnRbMl0uaGl0UG9pbnQueCA9IGhpdFBvaW50WzZdLmhpdFBvaW50LnggPSBydFdpZGdldC5sZWZ0Ow0KKyAgaGl0UG9pbnRbMF0uaGl0UG9pbnQueCA9IGhpdFBvaW50WzNdLmhpdFBvaW50LnggPSBoaXRQb2ludFs3XS5oaXRQb2ludC54ID0NCisgICAgICBoaXRQb2ludFsxMF0uaGl0UG9pbnQueCA9IGZ4UGllY2UgKyBydFdpZGdldC5sZWZ0Ow0KKyAgaGl0UG9pbnRbMV0uaGl0UG9pbnQueCA9IGhpdFBvaW50WzRdLmhpdFBvaW50LnggPSBoaXRQb2ludFs4XS5oaXRQb2ludC54ID0NCisgICAgICBoaXRQb2ludFsxMV0uaGl0UG9pbnQueCA9IGZ4UGllY2UgKiAyICsgcnRXaWRnZXQubGVmdDsNCisgIGhpdFBvaW50WzVdLmhpdFBvaW50LnggPSBoaXRQb2ludFs5XS5oaXRQb2ludC54ID0NCisgICAgICBydFdpZGdldC53aWR0aCArIHJ0V2lkZ2V0LmxlZnQ7DQorICBoaXRQb2ludFswXS5oaXRQb2ludC55ID0gaGl0UG9pbnRbMV0uaGl0UG9pbnQueSA9IHJ0V2lkZ2V0LnRvcDsNCisgIGhpdFBvaW50WzJdLmhpdFBvaW50LnkgPSBoaXRQb2ludFszXS5oaXRQb2ludC55ID0gaGl0UG9pbnRbNF0uaGl0UG9pbnQueSA9DQorICAgICAgaGl0UG9pbnRbNV0uaGl0UG9pbnQueSA9IGZ5UGllY2UgKyBydFdpZGdldC50b3A7DQorICBoaXRQb2ludFs2XS5oaXRQb2ludC55ID0gaGl0UG9pbnRbN10uaGl0UG9pbnQueSA9IGhpdFBvaW50WzhdLmhpdFBvaW50LnkgPQ0KKyAgICAgIGhpdFBvaW50WzldLmhpdFBvaW50LnkgPSBmeVBpZWNlICogMiArIHJ0V2lkZ2V0LnRvcDsNCisgIGhpdFBvaW50WzEwXS5oaXRQb2ludC55ID0gaGl0UG9pbnRbMTFdLmhpdFBvaW50LnkgPQ0KKyAgICAgIHJ0V2lkZ2V0LmhlaWdodCArIHJ0V2lkZ2V0LnRvcDsNCisgIGRvIHsNCisgICAgQ0ZYX1JlY3RGIHJlY3Q7DQorICAgIHBDaGlsZC0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgICAgQ0ZYX1JlY3RGIHIgPSByZWN0Ow0KKyAgICByLmxlZnQgKz0gcnRXaWRnZXQubGVmdDsNCisgICAgci50b3AgKz0gcnRXaWRnZXQudG9wOw0KKyAgICBpZiAoci5Jc0VtcHR5KCkpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAoci5Db250YWlucyhydERpcnR5KSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAoIWJDaGlsZEludGVyc2VjdFdpdGhEaXJ0eSAmJiByLkludGVyc2VjdFdpdGgocnREaXJ0eSkpIHsNCisgICAgICBiQ2hpbGRJbnRlcnNlY3RXaXRoRGlydHkgPSBUUlVFOw0KKyAgICB9DQorICAgIGlmIChiT3JnaW5QdEludGVyc2VjdFdpZHRoRGlydHkgJiYgIWJPcmdpblB0SW50ZXJzZWN0V2lkdGhDaGlsZCkgew0KKyAgICAgIGJPcmdpblB0SW50ZXJzZWN0V2lkdGhDaGlsZCA9IHJlY3QuQ29udGFpbnMoMCwgMCk7DQorICAgIH0NCisgICAgaWYgKHJ0Q2hpbGRzLklzRW1wdHkoKSkgew0KKyAgICAgIHJ0Q2hpbGRzID0gcmVjdDsNCisgICAgfSBlbHNlIGlmICghKHBDaGlsZC0+R2V0U3RhdGVzKCkgJiBGV0xfV0dUU1RBVEVfSW52aXNpYmxlKSkgew0KKyAgICAgIHJ0Q2hpbGRzLlVuaW9uKHJlY3QpOw0KKyAgICB9DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IEZXTF9ORUVEUkVQQUlOVEhJVF9Qb2ludDsgaSsrKSB7DQorICAgICAgaWYgKGhpdFBvaW50W2ldLmJOb3RDb250YWluQnlEaXJ0eSB8fCBoaXRQb2ludFtpXS5iTm90TmVlZFJlcGFpbnQpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBpZiAoIXJ0RGlydHkuQ29udGFpbnMoaGl0UG9pbnRbaV0uaGl0UG9pbnQpKSB7DQorICAgICAgICBoaXRQb2ludFtpXS5iTm90Q29udGFpbkJ5RGlydHkgPSBUUlVFOw0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmIChyLkNvbnRhaW5zKGhpdFBvaW50W2ldLmhpdFBvaW50KSkgew0KKyAgICAgICAgaGl0UG9pbnRbaV0uYk5vdE5lZWRSZXBhaW50ID0gVFJVRTsNCisgICAgICB9DQorICAgIH0NCisgIH0gd2hpbGUgKChwQ2hpbGQgPSBGV0xfR2V0V2lkZ2V0TWdyKCktPkdldFdpZGdldCgNCisgICAgICAgICAgICAgICAgcENoaWxkLCBGV0xfV0dUUkVMQVRJT05fTmV4dFNpYmxpbmcpKSAhPSBOVUxMKTsNCisgIGlmICghYkNoaWxkSW50ZXJzZWN0V2l0aERpcnR5KSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaWYgKGJPcmdpblB0SW50ZXJzZWN0V2lkdGhEaXJ0eSAmJiAhYk9yZ2luUHRJbnRlcnNlY3RXaWR0aENoaWxkKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaWYgKHJ0Q2hpbGRzLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIGludDMyX3QgcmVwYWludFBvaW50ID0gRldMX05FRURSRVBBSU5USElUX1BvaW50Ow0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgRldMX05FRURSRVBBSU5USElUX1BvaW50OyBpKyspIHsNCisgICAgaWYgKGhpdFBvaW50W2ldLmJOb3ROZWVkUmVwYWludCkgew0KKyAgICAgIHJlcGFpbnRQb2ludC0tOw0KKyAgICB9DQorICB9DQorICBpZiAocmVwYWludFBvaW50ID4gMCkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHBNYXRyaXgtPlRyYW5zZm9ybVJlY3QocnRDaGlsZHMpOw0KKyAgaWYgKHJ0Q2hpbGRzLkNvbnRhaW5zKHJ0RGlydHkpIHx8IHJ0Q2hpbGRzLkNvbnRhaW5zKHJ0V2lkZ2V0KSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX1dpZGdldE1nckRlbGVnYXRlOjpiVXNlT2Zmc2NyZWVuRGlyZWN0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBDRldMX1dpZGdldE1nckl0ZW0qIHBJdGVtID0gbV9wV2lkZ2V0TWdyLT5HZXRXaWRnZXRNZ3JJdGVtKHBXaWRnZXQpOw0KKyAgaWYgKCFGV0xfVXNlT2Zmc2NyZWVuKHBXaWRnZXQpIHx8ICEocEl0ZW0tPnBPZmZzY3JlZW4pKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisjaWYgKF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfKSB8fCAoX0ZYX09TXyA9PSBfRlhfV0lONjRfKQ0KKyAgaWYgKHBJdGVtLT5iT3V0c2lkZUNoYW5nZWQpIHsNCisgICAgQ0ZYX1JlY3RGIHI7DQorICAgIHBXaWRnZXQtPkdldFdpZGdldFJlY3Qocik7DQorICAgIENGWF9SZWN0RiB0ZW1wKG1fcFdpZGdldE1nci0+bV9ydFNjcmVlbik7DQorICAgIHRlbXAuRGVmbGF0ZSg1MCwgNTApOw0KKyAgICBpZiAoIXRlbXAuQ29udGFpbnMocikpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcEl0ZW0tPmJPdXRzaWRlQ2hhbmdlZCA9IEZBTFNFOw0KKyAgfQ0KKyNlbmRpZg0KKyAgcmV0dXJuIHBJdGVtLT5pUmVkcmF3Q291bnRlciA9PSAwOw0KK30NCitzdGF0aWMgdm9pZCBGV0xfV3JpdGVCTVAoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSkgew0KKyAgRklMRSogZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAid2IiKTsNCisgIGlmIChmaWxlID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50IHNpemUgPSAxNCArIDQwICsgcEJpdG1hcC0+R2V0UGl0Y2goKSAqIHBCaXRtYXAtPkdldEhlaWdodCgpOw0KKyAgdW5zaWduZWQgY2hhciBidWZmZXJbNDBdOw0KKyAgYnVmZmVyWzBdID0gJ0InOw0KKyAgYnVmZmVyWzFdID0gJ00nOw0KKyAgYnVmZmVyWzJdID0gKHVuc2lnbmVkIGNoYXIpc2l6ZTsNCisgIGJ1ZmZlclszXSA9ICh1bnNpZ25lZCBjaGFyKShzaXplID4+IDgpOw0KKyAgYnVmZmVyWzRdID0gKHVuc2lnbmVkIGNoYXIpKHNpemUgPj4gMTYpOw0KKyAgYnVmZmVyWzVdID0gKHVuc2lnbmVkIGNoYXIpKHNpemUgPj4gMjQpOw0KKyAgYnVmZmVyWzZdID0gYnVmZmVyWzddID0gYnVmZmVyWzhdID0gYnVmZmVyWzldID0gMDsNCisgIGJ1ZmZlclsxMF0gPSA1NDsNCisgIGJ1ZmZlclsxMV0gPSBidWZmZXJbMTJdID0gYnVmZmVyWzEzXSA9IDA7DQorICBmd3JpdGUoYnVmZmVyLCAxNCwgMSwgZmlsZSk7DQorICBtZW1zZXQoYnVmZmVyLCAwLCA0MCk7DQorICBidWZmZXJbMF0gPSA0MDsNCisgIGJ1ZmZlcls0XSA9ICh1bnNpZ25lZCBjaGFyKXBCaXRtYXAtPkdldFdpZHRoKCk7DQorICBidWZmZXJbNV0gPSAodW5zaWduZWQgY2hhcikocEJpdG1hcC0+R2V0V2lkdGgoKSA+PiA4KTsNCisgIGJ1ZmZlcls2XSA9ICh1bnNpZ25lZCBjaGFyKShwQml0bWFwLT5HZXRXaWR0aCgpID4+IDE2KTsNCisgIGJ1ZmZlcls3XSA9ICh1bnNpZ25lZCBjaGFyKShwQml0bWFwLT5HZXRXaWR0aCgpID4+IDI0KTsNCisgIGJ1ZmZlcls4XSA9ICh1bnNpZ25lZCBjaGFyKSgtcEJpdG1hcC0+R2V0SGVpZ2h0KCkpOw0KKyAgYnVmZmVyWzldID0gKHVuc2lnbmVkIGNoYXIpKCgtcEJpdG1hcC0+R2V0SGVpZ2h0KCkpID4+IDgpOw0KKyAgYnVmZmVyWzEwXSA9ICh1bnNpZ25lZCBjaGFyKSgoLXBCaXRtYXAtPkdldEhlaWdodCgpKSA+PiAxNik7DQorICBidWZmZXJbMTFdID0gKHVuc2lnbmVkIGNoYXIpKCgtcEJpdG1hcC0+R2V0SGVpZ2h0KCkpID4+IDI0KTsNCisgIGJ1ZmZlclsxMl0gPSAxOw0KKyAgYnVmZmVyWzE0XSA9IHBCaXRtYXAtPkdldEJQUCgpOw0KKyAgZndyaXRlKGJ1ZmZlciwgNDAsIDEsIGZpbGUpOw0KKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgcEJpdG1hcC0+R2V0SGVpZ2h0KCk7IHJvdysrKSB7DQorICAgIHVpbnQ4X3QqIHNjYW5fbGluZSA9IHBCaXRtYXAtPkdldEJ1ZmZlcigpICsgcm93ICogcEJpdG1hcC0+R2V0UGl0Y2goKTsNCisgICAgZndyaXRlKHNjYW5fbGluZSwgcEJpdG1hcC0+R2V0UGl0Y2goKSwgMSwgZmlsZSk7DQorICB9DQorICBmY2xvc2UoZmlsZSk7DQorfQ0KK0ZXTF9FUlIgRldMX1dpZGdldE1nclNuYXBzaG90KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nKiBzYXZlRmlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfUmVjdEYgcjsNCisgIHBXaWRnZXQtPkdldFdpZGdldFJlY3Qocik7DQorICBDRlhfR3JhcGhpY3MgZ3M7DQorICBncy5DcmVhdGUoKGludDMyX3Qpci53aWR0aCwgKGludDMyX3Qpci5oZWlnaHQsIEZYRElCX0FyZ2IpOw0KKyAgQ0ZXTF9XaWRnZXRNZ3IqIHdpZGdldE1nciA9IHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0TWdyKj4oRldMX0dldFdpZGdldE1ncigpKTsNCisgIENGV0xfV2lkZ2V0TWdyRGVsZWdhdGUqIGRlbGVnYXRlID0gd2lkZ2V0TWdyLT5HZXREZWxlZ2F0ZSgpOw0KKyAgZGVsZWdhdGUtPk9uRHJhd1dpZGdldChwV2lkZ2V0LCAmZ3MsIHBNYXRyaXgpOw0KKyAgQ0ZYX0RJQml0bWFwKiBkaWIgPSBncy5HZXRSZW5kZXJEZXZpY2UoKS0+R2V0Qml0bWFwKCk7DQorICBGV0xfV3JpdGVCTVAoZGliLCBzYXZlRmlsZS0+VVRGOEVuY29kZSgpKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfQk9PTCBGV0xfV2lkZ2V0SXNDaGlsZChJRldMX1dpZGdldCogcGFyZW50LCBJRldMX1dpZGdldCogZmluZCkgew0KKyAgaWYgKCFmaW5kKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIElGV0xfV2lkZ2V0KiBjaGlsZCA9DQorICAgICAgRldMX0dldFdpZGdldE1ncigpLT5HZXRXaWRnZXQocGFyZW50LCBGV0xfV0dUUkVMQVRJT05fRmlyc3RDaGlsZCk7DQorICB3aGlsZSAoY2hpbGQpIHsNCisgICAgaWYgKGNoaWxkID09IGZpbmQpIHsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBpZiAoRldMX1dpZGdldElzQ2hpbGQoY2hpbGQsIGZpbmQpKSB7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgY2hpbGQgPSBGV0xfR2V0V2lkZ2V0TWdyKCktPkdldFdpZGdldChjaGlsZCwgRldMX1dHVFJFTEFUSU9OX05leHRTaWJsaW5nKTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfYXBwaW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9hcHBpbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2YwZDNmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfYXBwaW1wLmgKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIEZXTF9BUFBJTVBfSF8NCisjZGVmaW5lIEZXTF9BUFBJTVBfSF8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGhyZWFkaW1wLmgiDQorDQorY2xhc3MgQ0ZXTF9XaWRnZXRNZ3I7DQorY2xhc3MgSUZXTF9BZGFwdGVyTmF0aXZlOw0KK2NsYXNzIElGV0xfV2lkZ2V0TWdyOw0KK2NsYXNzIElGV0xfVGhlbWVQcm92aWRlcjsNCitjbGFzcyBJRldMX0FwcDsNCisNCitjbGFzcyBDRldMX0FwcEltcCA6IHB1YmxpYyBDRldMX05vdGVUaHJlYWRJbXAgew0KKyBwdWJsaWM6DQorICBDRldMX0FwcEltcChJRldMX0FwcCogcElmYWNlLCBJRldMX0FkYXB0ZXJOYXRpdmUqIHBBZGFwdGVyKTsNCisgIHZpcnR1YWwgfkNGV0xfQXBwSW1wKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQorICB2aXJ0dWFsIElGV0xfQWRhcHRlck5hdGl2ZSogR2V0QWRhcHRlck5hdGl2ZSgpOw0KKyAgdmlydHVhbCBJRldMX1dpZGdldE1nciogR2V0V2lkZ2V0TWdyKCk7DQorICB2aXJ0dWFsIElGV0xfVGhlbWVQcm92aWRlciogR2V0VGhlbWVQcm92aWRlcigpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFRoZW1lUHJvdmlkZXIoSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWVQcm92aWRlcik7DQorICB2aXJ0dWFsIEZXTF9FUlIgRXhpdChpbnQzMl90IGlFeGl0Q29kZSA9IDApOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRldMX1dpZGdldE1nciogbV9wV2lkZ2V0TWdyOw0KKyAgSUZXTF9BZGFwdGVyTmF0aXZlKiBtX3BBZGFwdGVyTmF0aXZlOw0KKyAgSUZXTF9UaGVtZVByb3ZpZGVyKiBtX3BUaGVtZVByb3ZpZGVyOw0KKyAgRlhfQk9PTCBtX2JGdWVsQWRhcHRlcjsNCit9Ow0KKw0KKyNlbmRpZiAgLy8gRldMX0FQUElNUF9IXw0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX2NvbnRlbnRpbXAuaCBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX2NvbnRlbnRpbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzgzYWUxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfY29udGVudGltcC5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX0NPTlRFTlRfSU1QX0gNCisjZGVmaW5lIF9GV0xfQ09OVEVOVF9JTVBfSA0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wOw0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIENGV0xfQ29udGVudEltcDsNCitjbGFzcyBDRldMX0NvbnRlbnRJbXAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXAgew0KKyBwdWJsaWM6DQorICBDRldMX0NvbnRlbnRJbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpOw0KKw0KKyAgdmlydHVhbCB+Q0ZXTF9Db250ZW50SW1wKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5zZXJ0V2lkZ2V0KElGV0xfV2lkZ2V0KiBwQ2hpbGQsIGludDMyX3QgbkluZGV4ID0gLTEpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFJlbW92ZVdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgUmVtb3ZlQWxsV2lkZ2V0cygpOw0KKyAgRldMX0VSUiBHZXRNaW5TaXplKEZYX0ZMT0FUJiBmV2lkdGgsIEZYX0ZMT0FUJiBmSGVpZ2h0KTsNCisgIEZXTF9FUlIgU2V0TWluU2l6ZShGWF9GTE9BVCBmV2lkdGgsIEZYX0ZMT0FUIGZIZWlnaHQpOw0KKyAgRldMX0VSUiBHZXRNYXhTaXplKEZYX0ZMT0FUJiBmV2lkdGgsIEZYX0ZMT0FUJiBmSGVpZ2h0KTsNCisgIEZXTF9FUlIgU2V0TWF4U2l6ZShGWF9GTE9BVCBmV2lkdGgsIEZYX0ZMT0FUIGZIZWlnaHQpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBGWF9GTE9BVCBtX2ZXaWR0aE1pbjsNCisgIEZYX0ZMT0FUIG1fZldpZHRoTWF4Ow0KKyAgRlhfRkxPQVQgbV9mSGVpZ2h0TWluOw0KKyAgRlhfRkxPQVQgbV9mSGVpZ2h0TWF4Ow0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfZm9ybWltcC5oIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfZm9ybWltcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYzcwNzIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9mb3JtaW1wLmgKQEAgLTAsMCArMSwxODggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX0ZPUk1fSU1QX0gNCisjZGVmaW5lIF9GV0xfRk9STV9JTVBfSA0KK2NsYXNzIENGV0xfTm90ZUxvb3A7DQorY2xhc3MgQ0ZXTF9QYW5lbEltcDsNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZTsNCitjbGFzcyBDRldMX01zZ01vdXNlOw0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIElGV0xfVGhlbWVQcm92aWRlcjsNCitjbGFzcyBDRldMX1N5c0J0bjsNCitjbGFzcyBDRldMX0Zvcm1JbXA7DQorY2xhc3MgQ0ZXTF9Gb3JtSW1wRGVsZWdhdGU7DQorI2RlZmluZSBGV0xfU1lTQlVUVE9OU1RBVEVfSG92ZXIgMHgwMDAxDQorI2RlZmluZSBGV0xfU1lTQlVUVE9OU1RBVEVfUHJlc3NlZCAweDAwMDINCisjZGVmaW5lIEZXTF9TWVNCVVRUT05TVEFURV9EaXNhYmxlZCAweDAwMTANCitjbGFzcyBDRldMX1N5c0J0biB7DQorIHB1YmxpYzoNCisgIENGV0xfU3lzQnRuKCkgew0KKyAgICBtX3J0QnRuLlNldCgwLCAwLCAwLCAwKTsNCisgICAgbV9kd1N0YXRlID0gMDsNCisgIH0NCisNCisgIEZYX0JPT0wgSXNIb3ZlcigpIHsgcmV0dXJuIG1fZHdTdGF0ZSAmIEZXTF9TWVNCVVRUT05TVEFURV9Ib3ZlcjsgfQ0KKyAgRlhfQk9PTCBJc1ByZXNzZWQoKSB7IHJldHVybiBtX2R3U3RhdGUgJiBGV0xfU1lTQlVUVE9OU1RBVEVfUHJlc3NlZDsgfQ0KKyAgRlhfQk9PTCBJc0Rpc2FibGVkKCkgeyByZXR1cm4gbV9kd1N0YXRlICYgRldMX1NZU0JVVFRPTlNUQVRFX0Rpc2FibGVkOyB9DQorICB2b2lkIFNldE5vcm1hbCgpIHsgbV9kd1N0YXRlICY9IDB4RkZGMDsgfQ0KKyAgdm9pZCBTZXRQcmVzc2VkKCkgew0KKyAgICBTZXROb3JtYWwoKTsNCisgICAgbV9kd1N0YXRlIHw9IEZXTF9TWVNCVVRUT05TVEFURV9QcmVzc2VkOw0KKyAgfQ0KKyAgdm9pZCBTZXRIb3ZlcigpIHsNCisgICAgU2V0Tm9ybWFsKCk7DQorICAgIG1fZHdTdGF0ZSB8PSBGV0xfU1lTQlVUVE9OU1RBVEVfSG92ZXI7DQorICB9DQorICB2b2lkIFNldERpc2FibGVkKEZYX0JPT0wgYkRpc2FibGVkKSB7DQorICAgIGJEaXNhYmxlZCA/IG1fZHdTdGF0ZSB8PSBGV0xfU1lTQlVUVE9OU1RBVEVfRGlzYWJsZWQNCisgICAgICAgICAgICAgIDogbV9kd1N0YXRlICY9IH5GV0xfU1lTQlVUVE9OU1RBVEVfRGlzYWJsZWQ7DQorICB9DQorICBpbnQzMl90IEdldFBhcnRTdGF0ZSgpIHsNCisgICAgcmV0dXJuIChJc0Rpc2FibGVkKCkgPyBGV0xfUEFSVFNUQVRFX0ZSTV9EaXNhYmxlZCA6IChtX2R3U3RhdGUgKyAxKSk7DQorICB9DQorDQorICBDRlhfUmVjdEYgbV9ydEJ0bjsNCisgIEZYX0RXT1JEIG1fZHdTdGF0ZTsNCit9Ow0KK2VudW0gRk9STV9SRVNJWkVUWVBFIHsNCisgIEZPUk1fUkVTSVpFVFlQRV9Ob25lID0gMCwNCisgIEZPUk1fUkVTSVpFVFlQRV9DYXAsDQorICBGT1JNX1JFU0laRVRZUEVfTGVmdCwNCisgIEZPUk1fUkVTSVpFVFlQRV9Ub3AsDQorICBGT1JNX1JFU0laRVRZUEVfUmlnaHQsDQorICBGT1JNX1JFU0laRVRZUEVfQm90dG9tLA0KKyAgRk9STV9SRVNJWkVUWVBFX0xlZnRUb3AsDQorICBGT1JNX1JFU0laRVRZUEVfTGVmdEJvdHRvbSwNCisgIEZPUk1fUkVTSVpFVFlQRV9SaWdodFRvcCwNCisgIEZPUk1fUkVTSVpFVFlQRV9SaWdodEJvdHRvbQ0KK307DQordHlwZWRlZiBzdHJ1Y3QgUmVzdG9yZVJlc2l6ZUluZm8gew0KKyAgQ0ZYX1BvaW50RiBtX3B0U3RhcnQ7DQorICBDRlhfU2l6ZUYgbV9zelN0YXJ0Ow0KK30gUmVzdG9yZUluZm87DQorY2xhc3MgQ0ZXTF9Gb3JtSW1wIDogcHVibGljIENGV0xfUGFuZWxJbXAgew0KKyBwdWJsaWM6DQorICBDRldMX0Zvcm1JbXAoY29uc3QgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzLCBJRldMX1dpZGdldCogcE91dGVyKTsNCisgIHZpcnR1YWwgfkNGV0xfRm9ybUltcCgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDbGFzcykgY29uc3Q7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldENsYXNzSUQoKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0luc3RhbmNlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDbGFzcykgY29uc3Q7DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQorDQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldENsaWVudFJlY3QoQ0ZYX1JlY3RGJiByZWN0KTsNCisgIHZpcnR1YWwgRldMX0VSUiBVcGRhdGUoKTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGV0xfRVJSIERyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZXTF9GT1JNU0laRSBHZXRGb3JtU2l6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldEZvcm1TaXplKEZXTF9GT1JNU0laRSBlRm9ybVNpemUpOw0KKyAgdmlydHVhbCBJRldMX1dpZGdldCogRG9Nb2RhbCgpOw0KKyAgdmlydHVhbCBJRldMX1dpZGdldCogRG9Nb2RhbChGWF9EV09SRCYgZHdDb21tYW5kSUQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEVuZERvTW9kYWwoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRCb3JkZXJSZWdpb24oQ0ZYX1BhdGgqIHBQYXRoKTsNCisgIHZpcnR1YWwgdm9pZCBEcmF3QmFja2dyb3VuZChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSk7DQorICBDRldMX1dpZGdldEltcCogR2V0U3ViRm9jdXMoKTsNCisgIHZvaWQgU2V0U3ViRm9jdXMoQ0ZXTF9XaWRnZXRJbXAqIHBXaWRnZXQpOw0KKyAgQ0ZYX01hcEFjY2VsZXJhdG9ycyYgR2V0QWNjZWxlcmF0b3IoKTsNCisgIHZvaWQgU2V0QWNjZWxlcmF0b3IoQ0ZYX01hcEFjY2VsZXJhdG9ycyogcEFjY2VsZXJhdG9ycyk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgU2hvd0NoaWxkV2lkZ2V0KElGV0xfV2lkZ2V0KiBwUGFyZW50KTsNCisgIHZvaWQgUmVtb3ZlU3lzQnV0dG9ucygpOw0KKyAgdm9pZCBDYWxjQ29udGVudFJlY3QoQ0ZYX1JlY3RGJiBydENvbnRlbnQpOw0KKyAgQ0ZXTF9TeXNCdG4qIEdldFN5c0J0bkF0UG9pbnQoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIENGV0xfU3lzQnRuKiBHZXRTeXNCdG5CeVN0YXRlKEZYX0RXT1JEIGR3U3RhdGUpOw0KKyAgQ0ZXTF9TeXNCdG4qIEdldFN5c0J0bkJ5SW5kZXgoaW50MzJfdCBuSW5kZXgpOw0KKyAgaW50MzJfdCBHZXRTeXNCdG5JbmRleChDRldMX1N5c0J0biogcEJ0bik7DQorICBGWF9GTE9BVCBHZXRDYXB0aW9uSGVpZ2h0KCk7DQorICB2b2lkIERyYXdDYXB0aW9uVGV4dChDRlhfR3JhcGhpY3MqIHBHcywNCisgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdm9pZCBEcmF3SWNvbkltYWdlKENGWF9HcmFwaGljcyogcEdzLA0KKyAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisgIHZvaWQgR2V0RWRnZVJlY3QoQ0ZYX1JlY3RGJiBydEVkZ2UpOw0KKyAgdm9pZCBTZXRXb3JrQXJlYVJlY3QoKTsNCisgIHZvaWQgU2V0Q3Vyc29yKEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2b2lkIExheW91dCgpOw0KKyAgdm9pZCBSZVNldFN5c0J0bigpOw0KKyAgdm9pZCBSZWdpc3RlckZvcm0oKTsNCisgIHZvaWQgVW5SZWdpc3RlckZvcm0oKTsNCisgIEZYX0JPT0wgSXNEb01vZGFsKCk7DQorICB2b2lkIFNldFRoZW1lRGF0YSgpOw0KKyAgRlhfQk9PTCBIYXNJY29uKCk7DQorICB2b2lkIFVwZGF0ZUljb24oKTsNCisgIHZvaWQgVXBkYXRlQ2FwdGlvbigpOw0KKyAgdm9pZCBEb1dpZHRoTGltaXQoRlhfRkxPQVQmIGZMZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDdXJYLA0KKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNwYWNlLA0KKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkxpbWl0TWluLA0KKyAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkxpbWl0TWF4LA0KKyAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTGVmdCk7DQorICB2b2lkIERvSGVpZ2h0TGltaXQoRlhfRkxPQVQmIGZUb3AsDQorICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkN1clksDQorICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNwYWNlLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZMaW1pdE1pbiwNCisgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTGltaXRNYXgsDQorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVG9wKTsNCisgIENGWF9NYXBBY2NlbGVyYXRvcnMgbV9tYXBBY2NlbGVyYXRvcnM7DQorICBDRlhfUmVjdEYgbV9ydFJlc3RvcmU7DQorICBDRlhfUmVjdEYgbV9ydENhcHRpb25UZXh0Ow0KKyAgQ0ZYX1JlY3RGIG1fcnRSZWxhdGl2ZTsNCisgIENGWF9SZWN0RiBtX3J0Q2FwdGlvbjsNCisgIENGWF9SZWN0RiBtX3J0SWNvbjsNCisgIENGV0xfU3lzQnRuKiBtX3BDbG9zZUJveDsNCisgIENGV0xfU3lzQnRuKiBtX3BNaW5Cb3g7DQorICBDRldMX1N5c0J0biogbV9wTWF4Qm94Ow0KKyAgQ0ZXTF9TeXNCdG4qIG1fcENhcHRpb25Cb3g7DQorICBDRldMX05vdGVMb29wKiBtX3BOb3RlTG9vcDsNCisgIENGV0xfV2lkZ2V0SW1wKiBtX3BTdWJGb2N1czsNCisgIFJlc3RvcmVJbmZvIG1fSW5mb1N0YXJ0Ow0KKyAgRlhfRkxPQVQgbV9mQ1hCb3JkZXI7DQorICBGWF9GTE9BVCBtX2ZDWUJvcmRlcjsNCisgIGludDMyX3QgbV9pQ2FwdHVyZUJ0bjsNCisgIGludDMyX3QgbV9pU3lzQm94Ow0KKyAgaW50MzJfdCBtX2VSZXNpemVUeXBlOw0KKyAgRlhfQk9PTCBtX2JMQnV0dG9uRG93bjsNCisgIEZYX0JPT0wgbV9iTWF4aW1pemVkOw0KKyAgRlhfQk9PTCBtX2JTZXRNYXhpbWl6ZTsNCisgIEZYX0JPT0wgbV9iQ3VzdG9taXplTGF5b3V0Ow0KKyAgRldMX0ZPUk1TSVpFIG1fZUZvcm1TaXplOw0KKyAgRlhfQk9PTCBtX2JEb01vZGFsRmxhZzsNCisgIEZYX0ZMT0FUIG1fZlNtYWxsSWNvblN6Ow0KKyAgRlhfRkxPQVQgbV9mQmlnSWNvblN6Ow0KKyAgQ0ZYX0RJQml0bWFwKiBtX3BCaWdJY29uOw0KKyAgQ0ZYX0RJQml0bWFwKiBtX3BTbWFsbEljb247DQorICBGWF9CT09MIG1fYk1vdXNlSW47DQorICBmcmllbmQgY2xhc3MgQ0ZXTF9Gb3JtSW1wRGVsZWdhdGU7DQorfTsNCitjbGFzcyBDRldMX0Zvcm1JbXBEZWxlZ2F0ZSA6IHB1YmxpYyBDRldMX1dpZGdldEltcERlbGVnYXRlIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9Gb3JtSW1wRGVsZWdhdGUoQ0ZXTF9Gb3JtSW1wKiBwT3duZXIpOw0KKyAgaW50MzJfdCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIG92ZXJyaWRlOw0KKyAgRldMX0VSUiBPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIG92ZXJyaWRlOw0KKyAgRldMX0VSUiBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCkgb3ZlcnJpZGU7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgT25MQnV0dG9uRG93bihDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25MQnV0dG9uVXAoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uTW91c2VNb3ZlKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbk1vdXNlSG92ZXIoQ0ZXTF9Nc2dNb3VzZSogcE1zZyk7DQorICB2b2lkIE9uTW91c2VMZWF2ZShDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIHZvaWQgT25MQnV0dG9uRGJsQ2xrKENGV0xfTXNnTW91c2UqIHBNc2cpOw0KKyAgdm9pZCBPbldpbmRvd01vdmUoQ0ZXTF9Nc2dXaW5kb3dNb3ZlKiBwTXNnKTsNCisgIHZvaWQgT25DbG9zZShDRldMX01zZ0Nsb3NlKiBwTXNnKTsNCisgIENGV0xfRm9ybUltcCogbV9wT3duZXI7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9ncmlkaW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9ncmlkaW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwMDIyZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX2dyaWRpbXAuaApAQCAtMCwwICsxLDE5MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GV0xfR1JJRF9JTVBfSA0KKyNkZWZpbmUgX0ZXTF9HUklEX0lNUF9IDQorY2xhc3MgQ0ZXTF9Db250ZW50Ow0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIENGV0xfR3JpZExlbmd0aDsNCitjbGFzcyBDRldMX0dyaWRDb2xSb3c7DQorY2xhc3MgQ0ZXTF9HcmlkV2lkZ2V0SW5mbzsNCitjbGFzcyBDRldMX0dyaWRJbXA7DQorY2xhc3MgQ0ZXTF9HcmlkTGVuZ3RoIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9HcmlkTGVuZ3RoKCkgOiBmTGVuZ3RoKDApLCBlVW5pdChGV0xfR1JJRFVOSVRfRml4ZWQpIHt9DQorICBDRldMX0dyaWRMZW5ndGgoRlhfRkxPQVQgZlZhbHVlLCBGV0xfR1JJRFVOSVQgZSkNCisgICAgICA6IGZMZW5ndGgoZlZhbHVlKSwgZVVuaXQoZSkge30NCisgIEZYX0ZMT0FUIGZMZW5ndGg7DQorICBGV0xfR1JJRFVOSVQgZVVuaXQ7DQorfTsNCitjbGFzcyBDRldMX0dyaWRDb2xSb3cgew0KKyBwdWJsaWM6DQorICBDRldMX0dyaWRDb2xSb3coKQ0KKyAgICAgIDogbV9TaXplKDEsIEZXTF9HUklEVU5JVF9TY2FsZWQpLA0KKyAgICAgICAgbV9NaW5TaXplKDAsIEZXTF9HUklEVU5JVF9GaXhlZCksDQorICAgICAgICBtX01heFNpemUoMCwgRldMX0dSSURVTklUX0luZmluaXR5KSwNCisgICAgICAgIG1fZkFjdHVhbFNpemUoMCksDQorICAgICAgICBtX2ZBY3R1YWxQb3MoMCkge30NCisgIENGV0xfR3JpZExlbmd0aCBtX1NpemU7DQorICBDRldMX0dyaWRMZW5ndGggbV9NaW5TaXplOw0KKyAgQ0ZXTF9HcmlkTGVuZ3RoIG1fTWF4U2l6ZTsNCisgIEZYX0ZMT0FUIG1fZkFjdHVhbFNpemU7DQorICBGWF9GTE9BVCBtX2ZBY3R1YWxQb3M7DQorfTsNCitjbGFzcyBDRldMX0dyaWRXaWRnZXRJbmZvIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbygpDQorICAgICAgOiBtX2lDb2x1bW4oMCksDQorICAgICAgICBtX2lDb2x1bW5TcGFuKDEpLA0KKyAgICAgICAgbV9pUm93KDApLA0KKyAgICAgICAgbV9pUm93U3BhbigxKSwNCisgICAgICAgIG1fZHdNYXJnaW5GbGFnKDApLA0KKyAgICAgICAgbV9mQWN0dWFsV2lkdGgoMCksDQorICAgICAgICBtX2ZBY3R1YWxIZWlnaHQoMCkgew0KKyAgICBtX1NpemVbRldMX0dSSURTSVpFX1dpZHRoXS5lVW5pdCA9IEZXTF9HUklEVU5JVF9BdXRvOw0KKyAgICBtX1NpemVbRldMX0dSSURTSVpFX1dpZHRoXS5mTGVuZ3RoID0gMDsNCisgICAgbV9TaXplW0ZXTF9HUklEU0laRV9IZWlnaHRdLmVVbml0ID0gRldMX0dSSURVTklUX0F1dG87DQorICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfSGVpZ2h0XS5mTGVuZ3RoID0gMDsNCisgICAgbV9TaXplW0ZXTF9HUklEU0laRV9NaW5XaWR0aF0uZVVuaXQgPSBGV0xfR1JJRFVOSVRfRml4ZWQ7DQorICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluV2lkdGhdLmZMZW5ndGggPSAwOw0KKyAgICBtX1NpemVbRldMX0dSSURTSVpFX01heFdpZHRoXS5lVW5pdCA9IEZXTF9HUklEVU5JVF9JbmZpbml0eTsNCisgICAgbV9TaXplW0ZXTF9HUklEU0laRV9NYXhXaWR0aF0uZkxlbmd0aCA9IDA7DQorICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWluSGVpZ2h0XS5lVW5pdCA9IEZXTF9HUklEVU5JVF9GaXhlZDsNCisgICAgbV9TaXplW0ZXTF9HUklEU0laRV9NaW5IZWlnaHRdLmZMZW5ndGggPSAwOw0KKyAgICBtX1NpemVbRldMX0dSSURTSVpFX01heEhlaWdodF0uZVVuaXQgPSBGV0xfR1JJRFVOSVRfSW5maW5pdHk7DQorICAgIG1fU2l6ZVtGV0xfR1JJRFNJWkVfTWF4SGVpZ2h0XS5mTGVuZ3RoID0gMDsNCisgICAgbV9NYXJnaW5bMF0gPSBtX01hcmdpblsxXSA9IG1fTWFyZ2luWzJdID0gbV9NYXJnaW5bM10gPSAwOw0KKyAgfQ0KKyAgaW50MzJfdCBtX2lDb2x1bW47DQorICBpbnQzMl90IG1faUNvbHVtblNwYW47DQorICBpbnQzMl90IG1faVJvdzsNCisgIGludDMyX3QgbV9pUm93U3BhbjsNCisgIENGV0xfR3JpZExlbmd0aCBtX1NpemVbNl07DQorICBGWF9EV09SRCBtX2R3TWFyZ2luRmxhZzsNCisgIEZYX0ZMT0FUIG1fTWFyZ2luWzRdOw0KKyAgRlhfRkxPQVQgbV9mQWN0dWFsV2lkdGg7DQorICBGWF9GTE9BVCBtX2ZBY3R1YWxIZWlnaHQ7DQorfTsNCitjbGFzcyBDRldMX0dyaWRJbXAgOiBwdWJsaWMgQ0ZXTF9Db250ZW50SW1wIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9HcmlkSW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywgSUZXTF9XaWRnZXQqIHBPdXRlcik7DQorICB2aXJ0dWFsIH5DRldMX0dyaWRJbXAoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2xhc3MpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRDbGFzc0lEKCkgY29uc3Q7DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFdpZGdldFJlY3QoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KTsNCisgIHZpcnR1YWwgRldMX0VSUiBVcGRhdGUoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKw0KKyAgdmlydHVhbCBGV0xfRVJSIEluc2VydFdpZGdldChJRldMX1dpZGdldCogcENoaWxkLCBpbnQzMl90IG5JbmRleCA9IC0xKTsNCisgIHZpcnR1YWwgRldMX0VSUiBSZW1vdmVXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGV0xfSEdSSURDT0xST1cgSW5zZXJ0Q29sUm93KEZYX0JPT0wgYkNvbHVtbiwgaW50MzJfdCBuSW5kZXggPSAtMSk7DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRDb2xSb3dzKEZYX0JPT0wgYkNvbHVtbik7DQorICB2aXJ0dWFsIEZXTF9IR1JJRENPTFJPVyBHZXRDb2xSb3coRlhfQk9PTCBiQ29sdW1uLCBpbnQzMl90IG5JbmRleCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0SW5kZXgoRldMX0hHUklEQ09MUk9XIGhDb2xSb3cpOw0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRTaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LCBGV0xfR1JJRFVOSVQmIGVVbml0KTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRTaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRFVOSVQgZVVuaXQpOw0KKyAgRlhfRkxPQVQgR2V0TWluU2l6ZShGV0xfSEdSSURDT0xST1cgaENvbFJvdywgRldMX0dSSURVTklUJiBlVW5pdCk7DQorICBGV0xfRVJSIFNldE1pblNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csDQorICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNpemUsDQorICAgICAgICAgICAgICAgICAgICAgRldMX0dSSURVTklUIGVVbml0KTsNCisgIEZYX0ZMT0FUIEdldE1heFNpemUoRldMX0hHUklEQ09MUk9XIGhDb2xSb3csIEZXTF9HUklEVU5JVCYgZVVuaXQpOw0KKyAgRldMX0VSUiBTZXRNYXhTaXplKEZXTF9IR1JJRENPTFJPVyBoQ29sUm93LA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklEVU5JVCBlVW5pdCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRGVsZXRlQ29sUm93KEZXTF9IR1JJRENPTFJPVyBoQ29sUm93KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0NvbHVtbihGV0xfSEdSSURDT0xST1cgaENvbFJvdyk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0V2lkZ2V0UG9zKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9CT09MIGJDb2x1bW4pOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFdpZGdldFBvcyhJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDb2x1bW4pOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFdpZGdldFNwYW4oSUZXTF9XaWRnZXQqIHBXaWRnZXQsIEZYX0JPT0wgYkNvbHVtbik7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0V2lkZ2V0U3BhbihJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVNwYW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDb2x1bW4pOw0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRXaWRnZXRTaXplKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklEU0laRSBlU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRFVOSVQmIGVVbml0KTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRXaWRnZXRTaXplKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0dSSURTSVpFIGVTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRFVOSVQgZVVpdCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0V2lkZ2V0TWFyZ2luKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRE1BUkdJTiBlTWFyZ2luLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZk1hcmdpbik7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0V2lkZ2V0TWFyZ2luKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRE1BUkdJTiBlTWFyZ2luLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWFyZ2luKTsNCisgIHZpcnR1YWwgRldMX0VSUiBSZW1vdmVXaWRnZXRNYXJnaW4oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9HUklETUFSR0lOIGVNYXJnaW4pOw0KKyAgdmlydHVhbCBGWF9GTE9BVCBHZXRHcmlkU2l6ZShGV0xfR1JJRFNJWkUgZVNpemUsIEZXTF9HUklEVU5JVCYgZVVuaXQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldEdyaWRTaXplKEZXTF9HUklEU0laRSBlU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfR1JJRFVOSVQgZVVpdCk7DQorDQorIHByb3RlY3RlZDoNCisgIENGV0xfR3JpZFdpZGdldEluZm8qIEdldFdpZGdldEluZm8oSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdm9pZCBQcm9jRml4ZWRDb2xSb3coQ0ZXTF9HcmlkQ29sUm93KiBwQ29sUm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29sUm93U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNvbHVtbik7DQorICB2b2lkIFByb2NBdXRvQ29sUm93KENGV0xfR3JpZENvbFJvdyogcENvbFJvdywNCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNvbHVtbik7DQorICB2b2lkIFByb2NTY2FsZWRDb2xSb3coQ0ZXTF9HcmlkQ29sUm93KiBwQ29sUm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb2xSb3dTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNvbHVtbik7DQorICB2b2lkIENhbGNXaWRnZXRXaWR0aChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgIENGV0xfR3JpZFdpZGdldEluZm8qIHBJbmZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNvbHVubVdpZHRoKTsNCisgIHZvaWQgQ2FsY1dpZGdldEhlaWd0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyogcEluZm8sDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUm93SGVpZ3QpOw0KKyAgRlhfRkxPQVQgQ2FsY0F1dG9Db2x1bW5XaWRnZXRXaWR0aChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZXTF9HcmlkV2lkZ2V0SW5mbyogcEluZm8pOw0KKyAgRlhfRkxPQVQgQ2FsY0F1dG9Db2x1bW5XaWRnZXRIZWlnaHQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRldMX0dyaWRXaWRnZXRJbmZvKiBwSW5mbyk7DQorICBGWF9GTE9BVCBQcm9jZXNzQ29sdW1ucyhGWF9GTE9BVCBmV2lkdGgpOw0KKyAgRlhfRkxPQVQgUHJvY2Vzc1Jvd3MoRlhfRkxPQVQgZkhlaWdodCk7DQorICBGWF9GTE9BVCBQcm9jZXNzVW5DZXJ0YWluQ29sdW1ucygpOw0KKyAgRlhfRkxPQVQgUHJvY2Vzc1VuQ2VydGFpblJvd3MoKTsNCisgIEZYX0JPT0wgU2V0Q29sUm93QWN0dWFsU2l6ZShDRldMX0dyaWRDb2xSb3cqIHBDb2xSb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0QmV5b25kID0gRkFMU0UpOw0KKyAgRlhfRkxPQVQgU2V0V2lkZ2V0QWN0dWFsV2lkdGgoQ0ZXTF9HcmlkV2lkZ2V0SW5mbyogcEluZm8sIEZYX0ZMT0FUIGZXaWR0aCk7DQorICBGWF9GTE9BVCBTZXRXaWRnZXRBY3R1YWxIZWlnaHQoQ0ZXTF9HcmlkV2lkZ2V0SW5mbyogcEluZm8sIEZYX0ZMT0FUIGZIZWlnaHQpOw0KKyAgdm9pZCBTZXRBbGxXaWRnZXRzUmVjdCgpOw0KKyAgRlhfQk9PTCBJc0dyaWQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdm9pZCBTZXRTcGFuQXV0b0NvbFJvd1NpemUoY29uc3QgQ0ZYX1B0ckFycmF5JiBzcGFuQXV0b3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVG90YWxTaXplKTsNCisgIHZvaWQgU2V0U3BhblNjYWxlZENvbFJvd1NpemUoY29uc3QgQ0ZYX1B0ckFycmF5JiBzcGFuU2NhbGVkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRvdGFsU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRvdGFsU2NhbGVkTnVtKTsNCisgIHZvaWQgU2V0U2NhbGVkQ29sUm93c1NpemUoY29uc3QgQ0ZYX1B0ckFycmF5JiBzcGFuU2NhbGVkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRvdGFsU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRvdGFsU2NhbGVkTnVtKTsNCisgIENGWF9QdHJBcnJheSBtX1Jvd3M7DQorICBDRlhfUHRyQXJyYXkgbV9Db2x1bW5zOw0KKyAgQ0ZYX1B0ckFycmF5IG1fV2lkZ2V0czsNCisgIENGWF9NYXBQdHJUb1B0ciBtX21hcFdpZGdldEluZm87DQorICBDRldMX0dyaWRMZW5ndGggbV9TaXplWzZdOw0KKyAgZnJpZW5kIGNsYXNzIENGV0xfR3JpZEltcERlbGVnYXRlOw0KK307DQorY2xhc3MgQ0ZXTF9HcmlkSW1wRGVsZWdhdGUgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZSB7DQorIHB1YmxpYzoNCisgIENGV0xfR3JpZEltcERlbGVnYXRlKENGV0xfR3JpZEltcCogcE93bmVyKTsNCisgIGludDMyX3QgT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSBvdmVycmlkZTsNCisgIEZXTF9FUlIgT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpIG92ZXJyaWRlOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRldMX0dyaWRJbXAqIG1fcE93bmVyOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfbm90ZWltcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZmRhZGQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9ub3RlaW1wLmgKQEAgLTAsMCArMSwxNTggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX05PVEVfSU1QX0gNCisjZGVmaW5lIF9GV0xfTk9URV9JTVBfSA0KKw0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9md2wvY29yZS9md2xfbm90ZS5oIg0KKw0KK2NsYXNzIENGV0xfVGFyZ2V0SW1wOw0KK2NsYXNzIENGV0xfV2lkZ2V0SW1wOw0KK2NsYXNzIENGV0xfTm90ZVRocmVhZEltcDsNCitjbGFzcyBDRldMX1Rvb2xUaXBJbXA7DQorY2xhc3MgQ0ZXTF9Db3JlVG9vcFRpcERQOw0KK2NsYXNzIENGV0xfTm90ZURyaXZlcjsNCitjbGFzcyBDRldMX0V2ZW50VGFyZ2V0Ow0KK2NsYXNzIENGV0xfVG9vbFRpcENvbnRhaW5lcjsNCisNCitjbGFzcyBDRldMX05vdGVMb29wIDogcHVibGljIElGV0xfTm90ZUxvb3Agew0KKyBwdWJsaWM6DQorICBDRldMX05vdGVMb29wKENGV0xfV2lkZ2V0SW1wKiBwRm9ybSA9IE5VTEwpOw0KKw0KKyAgLy8gSUZXTF9Ob3RlTG9vcDoNCisgIH5DRldMX05vdGVMb29wKCkgb3ZlcnJpZGUge30NCisgIEZYX0JPT0wgUHJlUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgb3ZlcnJpZGU7DQorICBGV0xfRVJSIElkbGUoaW50MzJfdCBjb3VudCkgb3ZlcnJpZGU7DQorDQorICBDRldMX1dpZGdldEltcCogR2V0Rm9ybSgpOw0KKyAgRlhfQk9PTCBDb250aW51ZU1vZGFsKCk7DQorICBGV0xfRVJSIEVuZE1vZGFsTG9vcCgpOw0KKyAgRlhfQk9PTCBUcmFuc2xhdGVBY2NlbGVyYXRvcihDRldMX01lc3NhZ2UqIHBNZXNzYWdlKTsNCisgIEZXTF9FUlIgU2V0TWFpbkZvcm0oQ0ZXTF9XaWRnZXRJbXAqIHBGb3JtKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBHZW5lcmF0ZUNvbW1vbmRFdmVudChGWF9EV09SRCBkd0NvbW1hbmQpOw0KKw0KKyAgQ0ZXTF9XaWRnZXRJbXAqIG1fcEZvcm07DQorICBGWF9CT09MIG1fYkNvbnRpbnVlTW9kYWw7DQorfTsNCitjbGFzcyBDRldMX05vdGVEcml2ZXIgOiBwdWJsaWMgSUZXTF9Ob3RlRHJpdmVyIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9Ob3RlRHJpdmVyKCk7DQorICB+Q0ZXTF9Ob3RlRHJpdmVyKCkgb3ZlcnJpZGU7DQorDQorICAvLyBJRldMX05vdGVEcml2ZXI6DQorICBGWF9CT09MIFNlbmROb3RlKENGV0xfTm90ZSogcE5vdGUpIG92ZXJyaWRlOw0KKyAgRlhfQk9PTCBQb3N0TWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSBvdmVycmlkZTsNCisgIEZXTF9FUlIgUmVnaXN0ZXJFdmVudFRhcmdldChJRldMX1dpZGdldCogcExpc3RlbmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwRXZlbnRTb3VyY2UgPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmlsdGVyID0gRldMX0VWRU5UX0FMTF9NQVNLKSBvdmVycmlkZTsNCisgIEZXTF9FUlIgVW5yZWdpc3RlckV2ZW50VGFyZ2V0KElGV0xfV2lkZ2V0KiBwTGlzdGVuZXIpIG92ZXJyaWRlOw0KKyAgdm9pZCBDbGVhckV2ZW50VGFyZ2V0cyhGWF9CT09MIGJSZW1vdmVBbGwpIG92ZXJyaWRlOw0KKyAgaW50MzJfdCBHZXRRdWV1ZU1heFNpemUoKSBjb25zdCBvdmVycmlkZTsNCisgIEZXTF9FUlIgU2V0UXVldWVNYXhTaXplKGNvbnN0IGludDMyX3Qgc2l6ZSkgb3ZlcnJpZGU7DQorICBJRldMX05vdGVUaHJlYWQqIEdldE93bmVyVGhyZWFkKCkgY29uc3Qgb3ZlcnJpZGU7DQorICBGV0xfRVJSIFB1c2hOb3RlTG9vcChJRldMX05vdGVMb29wKiBwTm90ZUxvb3ApIG92ZXJyaWRlOw0KKyAgSUZXTF9Ob3RlTG9vcCogUG9wTm90ZUxvb3AoKSBvdmVycmlkZTsNCisgIElGV0xfV2lkZ2V0KiBHZXRGb2N1cygpIG92ZXJyaWRlOw0KKyAgRlhfQk9PTCBTZXRGb2N1cyhJRldMX1dpZGdldCogcEZvY3VzLCBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSkgb3ZlcnJpZGU7DQorICB2b2lkIFNldEdyYWIoSUZXTF9XaWRnZXQqIHBHcmFiLCBGWF9CT09MIGJTZXQpIG92ZXJyaWRlOw0KKyAgRldMX0VSUiBSdW4oKSBvdmVycmlkZTsNCisNCisgIElGV0xfV2lkZ2V0KiBHZXRIb3ZlcigpOw0KKyAgdm9pZCBTZXRIb3ZlcihJRldMX1dpZGdldCogcEhvdmVyKTsNCisgIHZvaWQgTm90aWZ5VGFyZ2V0SGlkZShJRldMX1dpZGdldCogcE5vdGVUYXJnZXQpOw0KKyAgdm9pZCBOb3RpZnlUYXJnZXREZXN0cm95KElGV0xfV2lkZ2V0KiBwTm90ZVRhcmdldCk7DQorICB2b2lkIE5vdGlmeUZ1bGxTY3JlZW5Nb2RlKElGV0xfV2lkZ2V0KiBwTm90ZVRhcmdldCwgRlhfQk9PTCBiRnVsbFNjcmVlbik7DQorICBGV0xfRVJSIFJlZ2lzdGVyRm9ybShDRldMX1dpZGdldEltcCogcEZvcm0pOw0KKyAgRldMX0VSUiBVblJlZ2lzdGVyRm9ybShDRldMX1dpZGdldEltcCogcEZvcm0pOw0KKyAgRlhfQk9PTCBRdWV1ZU1lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSk7DQorICBGWF9CT09MIFVucXVldWVNZXNzYWdlKENGV0xfTm90ZUxvb3AqIHBOb3RlTG9vcCk7DQorICBDRldMX05vdGVMb29wKiBHZXRUb3BMb29wKCk7DQorICBpbnQzMl90IENvdW50TG9vcCgpOw0KKyAgdm9pZCBTZXRIb29rKEZXTE1lc3NhZ2VIb29rQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIGluZm8pOw0KKyAgRlhfQk9PTCBQcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgRlhfQk9PTCBEaXNwYXRjaE1lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSwgSUZXTF9XaWRnZXQqIHBNZXNzYWdlRm9ybSk7DQorICBGWF9CT09MIERvQWN0aXZhdGUoQ0ZXTF9Nc2dBY3RpdmF0ZSogcE1zZywgSUZXTF9XaWRnZXQqIHBNZXNzYWdlRm9ybSk7DQorICBGWF9CT09MIERvRGVhY3RpdmF0ZShDRldMX01zZ0RlYWN0aXZhdGUqIHBNc2csIElGV0xfV2lkZ2V0KiBwTWVzc2FnZUZvcm0pOw0KKyAgRlhfQk9PTCBEb1NldEZvY3VzKENGV0xfTXNnU2V0Rm9jdXMqIHBNc2csIElGV0xfV2lkZ2V0KiBwTWVzc2FnZUZvcm0pOw0KKyAgRlhfQk9PTCBEb0tpbGxGb2N1cyhDRldMX01zZ0tpbGxGb2N1cyogcE1zZywgSUZXTF9XaWRnZXQqIHBNZXNzYWdlRm9ybSk7DQorICBGWF9CT09MIERvS2V5KENGV0xfTXNnS2V5KiBwTXNnLCBJRldMX1dpZGdldCogcE1lc3NhZ2VGb3JtKTsNCisgIEZYX0JPT0wgRG9Nb3VzZShDRldMX01zZ01vdXNlKiBwTXNnLCBJRldMX1dpZGdldCogcE1lc3NhZ2VGb3JtKTsNCisgIEZYX0JPT0wgRG9XaGVlbChDRldMX01zZ01vdXNlV2hlZWwqIHBNc2csIElGV0xfV2lkZ2V0KiBwTWVzc2FnZUZvcm0pOw0KKyAgRlhfQk9PTCBEb1NpemUoQ0ZXTF9Nc2dTaXplKiBwTXNnKTsNCisgIEZYX0JPT0wgRG9XaW5kb3dNb3ZlKENGV0xfTXNnV2luZG93TW92ZSogcE1zZywgSUZXTF9XaWRnZXQqIHBNZXNzYWdlRm9ybSk7DQorICBGWF9CT09MIERvRHJhZ0ZpbGVzKENGV0xfTXNnRHJvcEZpbGVzKiBwTXNnLCBJRldMX1dpZGdldCogcE1lc3NhZ2VGb3JtKTsNCisgIEZYX0JPT0wgRG9Nb3VzZUV4KENGV0xfTXNnTW91c2UqIHBNc2csIElGV0xfV2lkZ2V0KiBwTWVzc2FnZUZvcm0pOw0KKyAgdm9pZCBNb3VzZVNlY29uZGFyeShDRldMX01zZ01vdXNlKiBwTXNnKTsNCisgIEZYX0JPT0wgSXNWYWxpZE1lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSk7DQorICBJRldMX1dpZGdldCogR2V0TWVzc2FnZUZvcm0oSUZXTF9XaWRnZXQqIHBEc3RUYXJnZXQpOw0KKyAgdm9pZCBDbGVhckludmFsaWRFdmVudFRhcmdldHMoRlhfQk9PTCBiUmVtb3ZlQWxsKTsNCisgIENGWF9QdHJBcnJheSBtX2Zvcm1zOw0KKyAgQ0ZYX1B0ckFycmF5IG1fbm90ZVF1ZXVlOw0KKyAgQ0ZYX1B0ckFycmF5IG1fbm90ZUxvb3BRdWV1ZTsNCisgIENGWF9NYXBQdHJUb1B0ciBtX2V2ZW50VGFyZ2V0czsNCisgIGludDMyX3QgbV9zZW5kRXZlbnRDYWxsZWQ7DQorICBpbnQzMl90IG1fbWF4U2l6ZTsNCisgIEZYX0JPT0wgbV9iRnVsbFNjcmVlbjsNCisgIElGV0xfV2lkZ2V0KiBtX3BIb3ZlcjsNCisgIElGV0xfV2lkZ2V0KiBtX3BGb2N1czsNCisgIElGV0xfV2lkZ2V0KiBtX3BHcmFiOw0KKyAgQ0ZXTF9Ob3RlTG9vcCogbV9wTm90ZUxvb3A7DQorICBGV0xNZXNzYWdlSG9va0NhbGxiYWNrIG1faG9vazsNCisgIHZvaWQqIG1faG9va0luZm87DQorfTsNCit0eXBlZGVmIENGWF9NYXBQdHJUZW1wbGF0ZTx2b2lkKiwgRlhfRFdPUkQ+IENGV0xfRXZlbnRTb3VyY2U7DQorY2xhc3MgQ0ZXTF9FdmVudFRhcmdldCB7DQorIHB1YmxpYzoNCisgIENGV0xfRXZlbnRUYXJnZXQoQ0ZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciwgSUZXTF9XaWRnZXQqIHBMaXN0ZW5lcikNCisgICAgICA6IG1fcExpc3RlbmVyKHBMaXN0ZW5lciksIG1fcE5vdGVEcml2ZXIocE5vdGVEcml2ZXIpLCBtX2JJbnZhbGlkKEZBTFNFKSB7fQ0KKyAgfkNGV0xfRXZlbnRUYXJnZXQoKTsNCisgIGludDMyX3QgU2V0RXZlbnRTb3VyY2UoSUZXTF9XaWRnZXQqIHBTb3VyY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmlsdGVyID0gRldMX0VWRU5UX0FMTF9NQVNLKTsNCisgIEZYX0JPT0wgUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCk7DQorICBGWF9CT09MIElzRmlsdGVyRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50LCBGWF9EV09SRCBkd0ZpbHRlcik7DQorICBGWF9CT09MIElzSW52YWxpZCgpIHsgcmV0dXJuIG1fYkludmFsaWQ7IH0NCisgIHZvaWQgRmxhZ0ludmFsaWQoKSB7IG1fYkludmFsaWQgPSBUUlVFOyB9DQorDQorIHByb3RlY3RlZDoNCisgIENGV0xfRXZlbnRTb3VyY2UgbV9ldmVudFNvdXJjZXM7DQorICBJRldMX1dpZGdldCogbV9wTGlzdGVuZXI7DQorICBDRldMX05vdGVEcml2ZXIqIG1fcE5vdGVEcml2ZXI7DQorICBGWF9CT09MIG1fYkludmFsaWQ7DQorfTsNCitjbGFzcyBDRldMX1Rvb2xUaXBDb250YWluZXIgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgQ0ZXTF9Ub29sVGlwQ29udGFpbmVyKiBnZXRJbnN0YW5jZSgpOw0KKyAgc3RhdGljIHZvaWQgRGVsZXRlSW5zdGFuY2UoKTsNCisNCisgIEZYX0VSUiBBZGRUb29sVGlwVGFyZ2V0KElGV0xfVG9vbFRpcFRhcmdldCogcFRhcmdldCk7DQorICBGWF9FUlIgUmVtb3ZlVG9vbFRpcFRhcmdldChJRldMX1Rvb2xUaXBUYXJnZXQqIHBUYXJnZXQpOw0KKyAgSUZXTF9Ub29sVGlwVGFyZ2V0KiBHZXRDdXJyZW50VG9vbFRpcFRhcmdldCgpOw0KKw0KKyAgRlhfQk9PTCBIYXNUb29sVGlwKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisNCisgIEZYX0JPT0wgUHJvY2Vzc0VudGVyKENGV0xfRXZ0TW91c2UqIHBFdnQsIElGV0xfV2lkZ2V0KiBwT3duZXIpOw0KKyAgRlhfQk9PTCBQcm9jZXNzTGVhdmUoQ0ZXTF9FdnRNb3VzZSogcEV2dCk7DQorDQorICBGWF9FUlIgU2V0VG9vbFRpcEluaXRpYWxEZWxheShpbnQzMl90IGlEZWxheVRpbWUpOw0KKyAgRlhfRVJSIFNldFRvb2xUaXBBdXRvUG9wRGVsYXkoaW50MzJfdCBpRGVsYXlUaW1lKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZXTF9Ub29sVGlwQ29udGFpbmVyKCk7DQorICB2aXJ0dWFsIH5DRldMX1Rvb2xUaXBDb250YWluZXIoKTsNCisNCisgIElGV0xfVG9vbFRpcFRhcmdldCogcEN1clRhcmdldDsNCisgIENGV0xfVG9vbFRpcEltcCogbV9wVG9vbFRpcEltcDsNCisgIENGV0xfQ29yZVRvb3BUaXBEUCogbV9Ub29sVGlwRHA7DQorICBDRlhfUHRyQXJyYXkgbV9hcnJXaWRnZXQ7DQorDQorIHByaXZhdGU6DQorICBzdGF0aWMgQ0ZXTF9Ub29sVGlwQ29udGFpbmVyKiBzX3BJbnN0YW5jZTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3BhbmVsaW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9wYW5lbGltcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNDJkOTUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF9wYW5lbGltcC5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRldMX1BBTkVMX0lNUF9IDQorI2RlZmluZSBfRldMX1BBTkVMX0lNUF9IDQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXA7DQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzOw0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIElGV0xfQ29udGVudDsNCitjbGFzcyBDRldMX1BhbmVsSW1wOw0KK2NsYXNzIENGV0xfUGFuZWxJbXAgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRJbXAgew0KKyBwdWJsaWM6DQorICBDRldMX1BhbmVsSW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgSUZXTF9XaWRnZXQqIHBPdXRlcik7DQorICB2aXJ0dWFsIH5DRldMX1BhbmVsSW1wKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0LCBGWF9CT09MIGJBdXRvU2l6ZSA9IEZBTFNFKTsNCisgIHZpcnR1YWwgRldMX0VSUiBVcGRhdGUoKTsNCisgIHZpcnR1YWwgSUZXTF9Db250ZW50KiBHZXRDb250ZW50KCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0Q29udGVudChJRldMX0NvbnRlbnQqIHBDb250ZW50KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgSUZXTF9Db250ZW50KiBtX3BDb250ZW50Ow0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF90YXJnZXRpbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGE2Y2FhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmgKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIEZXTF9UQVJHRVRJTVBfSF8NCisjZGVmaW5lIEZXTF9UQVJHRVRJTVBfSF8NCisNCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF90YXJnZXQuaCINCisNCitjbGFzcyBDRldMX1RhcmdldEltcCB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfkNGV0xfVGFyZ2V0SW1wKCk7DQorDQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KKyAgdmlydHVhbCBGWF9CT09MIElzSW5zdGFuY2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NsYXNzKSBjb25zdDsNCisgIHZpcnR1YWwgRldMX0VSUiBJbml0aWFsaXplKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgRmluYWxpemUoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZXTF9UYXJnZXRJbXAoKTsNCit9Ow0KKw0KKyNlbmRpZiAgLy8gRldMX1RBUkdFVElNUF9IXw0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3RocmVhZGltcC5oIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGhyZWFkaW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE5NTg3NwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3RocmVhZGltcC5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBGV0xfVEhSRUFESU1QX0hfDQorI2RlZmluZSBGV0xfVEhSRUFESU1QX0hfDQorDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF90aHJlYWQuaCIgIC8vIEZvciBGV0xfSFRIUkVBRC4NCisNCitjbGFzcyBDRldMX05vdGVEcml2ZXI7DQorY2xhc3MgSUZXTF9Ob3RlRHJpdmVyOw0KKw0KK2NsYXNzIENGV0xfVGhyZWFkSW1wIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+Q0ZXTF9UaHJlYWRJbXAoKSB7fQ0KKyAgSUZXTF9UaHJlYWQqIEdldEludGVyZmFjZSgpIGNvbnN0IHsgcmV0dXJuIG1fcElmYWNlOyB9DQorICB2aXJ0dWFsIEZXTF9FUlIgUnVuKEZXTF9IVEhSRUFEIGhUaHJlYWQpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRldMX1RocmVhZEltcChJRldMX1RocmVhZCogcElmYWNlKSA6IG1fcElmYWNlKHBJZmFjZSkge30NCisNCisgcHJpdmF0ZToNCisgIElGV0xfVGhyZWFkKiBjb25zdCBtX3BJZmFjZTsNCit9Ow0KKw0KK2NsYXNzIENGV0xfTm90ZVRocmVhZEltcCA6IHB1YmxpYyBDRldMX1RocmVhZEltcCB7DQorIHB1YmxpYzoNCisgIENGV0xfTm90ZVRocmVhZEltcChJRldMX05vdGVUaHJlYWQqIHBJZmFjZSk7DQorICB2aXJ0dWFsIH5DRldMX05vdGVUaHJlYWRJbXAoKTsNCisNCisgIEZXTF9FUlIgUnVuKEZXTF9IVEhSRUFEIGhUaHJlYWQpIG92ZXJyaWRlOw0KKyAgdmlydHVhbCBJRldMX05vdGVEcml2ZXIqIEdldE5vdGVEcml2ZXIoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZXTF9Ob3RlRHJpdmVyKiBjb25zdCBtX3BOb3RlRHJpdmVyOw0KK307DQorDQorI2VuZGlmICAvLyBGV0xfVEhSRUFESU1QX0hfDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0aW1wLmggYi94ZmEvc3JjL2Z3bC9zcmMvY29yZS9pbmNsdWRlL2Z3bF93aWRnZXRpbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzZlYTVmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0aW1wLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBGV0xfV0lER0VUSU1QX0hfDQorI2RlZmluZSBGV0xfV0lER0VUSU1QX0hfDQorDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z3bC9jb3JlL2Z3bF93aWRnZXQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmgiDQorDQorY2xhc3MgQ0ZXTF9Ob3RlVGFyZ2V0Ow0KK2NsYXNzIENGV0xfTm90ZVRocmVhZEltcDsNCitjbGFzcyBDRldMX1dpZGdldEltcFByb3BlcnRpZXM7DQorY2xhc3MgQ0ZXTF9XaWRnZXRNZ3I7DQorY2xhc3MgSUZXTF9EYXRhUHJvdmlkZXI7DQorY2xhc3MgSUZXTF9UaGVtZVByb3ZpZGVyOw0KK2NsYXNzIElGV0xfV2lkZ2V0Ow0KK2NsYXNzIElGV0xfV2lkZ2V0RGVsZWdhdGU7DQorDQorY2xhc3MgQ0ZXTF9XaWRnZXRJbXAgOiBwdWJsaWMgQ0ZXTF9UYXJnZXRJbXAgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQorDQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0V2lkZ2V0UmVjdChDRlhfUmVjdEYmIHJlY3QsIEZYX0JPT0wgYkF1dG9TaXplID0gRkFMU0UpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldEdsb2JhbFJlY3QoQ0ZYX1JlY3RGJiByZWN0KTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRXaWRnZXRSZWN0KGNvbnN0IENGWF9SZWN0RiYgcmVjdCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q2xpZW50UmVjdChDRlhfUmVjdEYmIHJlY3QpOw0KKyAgdmlydHVhbCBJRldMX1dpZGdldCogR2V0UGFyZW50KCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0UGFyZW50KElGV0xfV2lkZ2V0KiBwUGFyZW50KTsNCisgIHZpcnR1YWwgSUZXTF9XaWRnZXQqIEdldE93bmVyKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0T3duZXIoSUZXTF9XaWRnZXQqIHBPd25lcik7DQorICB2aXJ0dWFsIElGV0xfV2lkZ2V0KiBHZXRPdXRlcigpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRTdHlsZXMoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBNb2RpZnlTdHlsZXMoRlhfRFdPUkQgZHdTdHlsZXNBZGRlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdHlsZXNSZW1vdmVkKTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0U3R5bGVzRXgoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBNb2RpZnlTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRTdGF0ZXMoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBTZXRTdGF0ZXMoRlhfRFdPUkQgZHdTdGF0ZXMsIEZYX0JPT0wgYlNldCA9IFRSVUUpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFByaXZhdGVEYXRhKHZvaWQqIG1vZHVsZV9pZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjayk7DQorICB2aXJ0dWFsIHZvaWQqIEdldFByaXZhdGVEYXRhKHZvaWQqIG1vZHVsZV9pZCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgVXBkYXRlKCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgTG9ja1VwZGF0ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFVubG9ja1VwZGF0ZSgpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBIaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgVHJhbnNmb3JtVG8oSUZXTF9XaWRnZXQqIHBXaWRnZXQsIEZYX0ZMT0FUJiBmeCwgRlhfRkxPQVQmIGZ5KTsNCisgIHZpcnR1YWwgRldMX0VSUiBUcmFuc2Zvcm1UbyhJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX1JlY3RGJiBydCk7DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0TWF0cml4KENGWF9NYXRyaXgmIG1hdHJpeCwgRlhfQk9PTCBiR2xvYmFsID0gRkFMU0UpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldE1hdHJpeChjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIERyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2aXJ0dWFsIElGV0xfVGhlbWVQcm92aWRlciogR2V0VGhlbWVQcm92aWRlcigpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFRoZW1lUHJvdmlkZXIoSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWVQcm92aWRlcik7DQorICB2aXJ0dWFsIEZXTF9FUlIgU2V0RGF0YVByb3ZpZGVyKElGV0xfRGF0YVByb3ZpZGVyKiBwRGF0YVByb3ZpZGVyKTsNCisgIHZpcnR1YWwgSUZXTF9XaWRnZXREZWxlZ2F0ZSogU2V0RGVsZWdhdGUoSUZXTF9XaWRnZXREZWxlZ2F0ZSogcERlbGVnYXRlKTsNCisgIHZpcnR1YWwgSUZXTF9Ob3RlVGhyZWFkKiBHZXRPd25lclRocmVhZCgpIGNvbnN0Ow0KKyAgRldMX0VSUiBTZXRPd25lclRocmVhZChDRldMX05vdGVUaHJlYWRJbXAqIHBPd25lclRocmVhZCk7DQorICBJRldMX1dpZGdldCogR2V0SW50ZXJmYWNlKCkgY29uc3Q7DQorICB2b2lkIFNldEludGVyZmFjZShJRldMX1dpZGdldCogcEludGVyZmFjZSk7DQorICBDRlhfU2l6ZUYgR2V0T2Zmc2V0RnJvbVBhcmVudChJRldMX1dpZGdldCogcFBhcmVudCk7DQorDQorIHByb3RlY3RlZDoNCisgIENGV0xfV2lkZ2V0SW1wKGNvbnN0IENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyYgcHJvcGVydGllcywNCisgICAgICAgICAgICAgICAgIElGV0xfV2lkZ2V0KiBwT3V0ZXIpOw0KKyAgdmlydHVhbCB+Q0ZXTF9XaWRnZXRJbXAoKTsNCisgIEZYX0JPT0wgSXNFbmFibGVkKCkgY29uc3Q7DQorICBGWF9CT09MIElzVmlzaWJsZSgpIGNvbnN0Ow0KKyAgRlhfQk9PTCBJc0FjdGl2ZSgpIGNvbnN0Ow0KKyAgRlhfQk9PTCBJc092ZXJMYXBwZXIoKSBjb25zdDsNCisgIEZYX0JPT0wgSXNQb3B1cCgpIGNvbnN0Ow0KKyAgRlhfQk9PTCBJc0NoaWxkKCkgY29uc3Q7DQorICBGWF9CT09MIElzTG9ja2VkKCkgY29uc3Q7DQorICBGWF9CT09MIElzT2Zmc2NyZWVuKCkgY29uc3Q7DQorICBGWF9CT09MIEhhc0JvcmRlcigpIGNvbnN0Ow0KKyAgRlhfQk9PTCBIYXNFZGdlKCkgY29uc3Q7DQorICB2b2lkIEdldEVkZ2VSZWN0KENGWF9SZWN0RiYgcnRFZGdlKTsNCisgIEZYX0ZMT0FUIEdldEJvcmRlclNpemUoRlhfQk9PTCBiQ1ggPSBUUlVFKTsNCisgIEZYX0ZMT0FUIEdldEVkZ2VXaWR0aCgpOw0KKyAgdm9pZCBHZXRSZWxhdGl2ZVJlY3QoQ0ZYX1JlY3RGJiByZWN0KTsNCisgIHZvaWQqIEdldFRoZW1lQ2FwYWNpdHkoRlhfRFdPUkQgZHdDYXBhY2l0eSk7DQorICBJRldMX1RoZW1lUHJvdmlkZXIqIEdldEF2YWlsYWJsZVRoZW1lKCk7DQorICBDRldMX1dpZGdldEltcCogR2V0Um9vdE91dGVyKCk7DQorICBDRlhfU2l6ZUYgQ2FsY1RleHRTaXplKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJNdWx0aUxpbmUgPSBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGluZVdpZHRoID0gLTEpOw0KKyAgdm9pZCBDYWxjVGV4dFJlY3QoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdUVE9TdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlUVE9BbGlnbiwNCisgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcmVjdCk7DQorICB2b2lkIFNldEZvY3VzKEZYX0JPT0wgYkZvY3VzKTsNCisgIHZvaWQgU2V0R3JhYihGWF9CT09MIGJTZXQpOw0KKyAgRlhfQk9PTCBHZXRQb3B1cFBvcyhGWF9GTE9BVCBmTWluSGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWF4SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0QW5jaG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJ0UG9wdXApOw0KKyAgRlhfQk9PTCBHZXRQb3B1cFBvc01lbnUoRlhfRkxPQVQgZk1pbkhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNYXhIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0QW5jaG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydFBvcHVwKTsNCisgIEZYX0JPT0wgR2V0UG9wdXBQb3NDb21ib0JveChGWF9GTE9BVCBmTWluSGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNYXhIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJ0UG9wdXApOw0KKyAgRlhfQk9PTCBHZXRQb3B1cFBvc0dlbmVyYWwoRlhfRkxPQVQgZk1pbkhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNYXhIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0QW5jaG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydFBvcHVwKTsNCisgIEZYX0JPT0wgR2V0U2NyZWVuU2l6ZShGWF9GTE9BVCYgZngsIEZYX0ZMT0FUJiBmeSk7DQorICB2b2lkIFJlZ2lzdGVyRXZlbnRUYXJnZXQoSUZXTF9XaWRnZXQqIHBFdmVudFNvdXJjZSA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGaWx0ZXIgPSBGV0xfRVZFTlRfQUxMX01BU0spOw0KKyAgdm9pZCBVbnJlZ2lzdGVyRXZlbnRUYXJnZXQoKTsNCisgIHZvaWQgRGlzcGF0Y2hLZXlFdmVudChDRldMX01zZ0tleSogcE5vdGUpOw0KKyAgdm9pZCBEaXNwYXRjaEV2ZW50KENGV0xfRXZlbnQqIHBFdmVudCk7DQorICB2b2lkIFJlcGFpbnQoY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCA9IE5VTEwpOw0KKyAgdm9pZCBEcmF3QmFja2dyb3VuZChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUGFydEJrLA0KKyAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwNCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdm9pZCBEcmF3Qm9yZGVyKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QgaVBhcnRCb3JkZXIsDQorICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsDQorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgdm9pZCBEcmF3RWRnZShDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgaW50MzJfdCBpUGFydEVkZ2UsDQorICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLA0KKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCk7DQorICB2b2lkIE5vdGlmeURyaXZlcigpOw0KKw0KKyAgRlhfQk9PTCBJc1BhcmVudChJRldMX1dpZGdldCogcFBhcmVudCk7DQorICBDRldMX1dpZGdldE1nciogbV9wV2lkZ2V0TWdyOw0KKyAgQ0ZXTF9Ob3RlVGhyZWFkSW1wKiBtX3BPd25lclRocmVhZDsNCisgIENGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyogbV9wUHJvcGVydGllczsNCisgIENGWF9Qcml2YXRlRGF0YSogbV9wUHJpdmF0ZURhdGE7DQorICBJRldMX1dpZGdldERlbGVnYXRlKiBtX3BEZWxlZ2F0ZTsNCisgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIG1fcEN1ckRlbGVnYXRlOw0KKyAgSUZXTF9XaWRnZXQqIG1fcE91dGVyOw0KKyAgSUZXTF9XaWRnZXQqIG1fcEludGVyZmFjZTsNCisgIGludDMyX3QgbV9pTG9jazsNCisgIGZyaWVuZCBjbGFzcyBDRldMX1dpZGdldEltcERlbGVnYXRlOw0KKyAgZnJpZW5kIHZvaWQgRldMX1NldFdpZGdldFJlY3QoSUZXTF9XaWRnZXQqIHdpZGdldCwgY29uc3QgQ0ZYX1JlY3RGJiByZWN0KTsNCisgIGZyaWVuZCB2b2lkIEZXTF9TZXRXaWRnZXRTdGF0ZXMoSUZXTF9XaWRnZXQqIHdpZGdldCwgRlhfRFdPUkQgZHdTdGF0ZXMpOw0KKyAgZnJpZW5kIHZvaWQgRldMX1NldFdpZGdldFN0eWxlcyhJRldMX1dpZGdldCogd2lkZ2V0LCBGWF9EV09SRCBkd1N0eWxlcyk7DQorfTsNCisNCitjbGFzcyBDRldMX1dpZGdldEltcERlbGVnYXRlIDogcHVibGljIElGV0xfV2lkZ2V0RGVsZWdhdGUgew0KKyBwdWJsaWM6DQorICBDRldMX1dpZGdldEltcERlbGVnYXRlKCk7DQorICB+Q0ZXTF9XaWRnZXRJbXBEZWxlZ2F0ZSgpIG92ZXJyaWRlIHt9DQorICBpbnQzMl90IE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgb3ZlcnJpZGU7DQorICBGV0xfRVJSIE9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkgb3ZlcnJpZGU7DQorICBGV0xfRVJSIE9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKSBvdmVycmlkZTsNCit9Ow0KKw0KKyNlbmRpZiAgLy8gRldMX1dJREdFVElNUF9IXw0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3dpZGdldG1ncmltcC5oIGIveGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0bWdyaW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIxZjI0YgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3dpZGdldG1ncmltcC5oCkBAIC0wLDAgKzEsMTY4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZXTF9XSURHRVRNR1JfSU1QX0gNCisjZGVmaW5lIF9GV0xfV0lER0VUTUdSX0lNUF9IDQorY2xhc3MgQ0ZXTF9UYXJnZXRJbXA7DQorY2xhc3MgSUZXTF9XaWRnZXQ7DQorY2xhc3MgSUZXTF9BZGFwdGVyV2lkZ2V0TWdyOw0KK2NsYXNzIENGV0xfV2lkZ2V0TWdySXRlbTsNCitjbGFzcyBDRldMX1dpZGdldE1ncjsNCitjbGFzcyBDRldMX1dpZGdldE1nckRlbGVnYXRlOw0KK2NsYXNzIElGV0xfQWRhcHRlck5hdGl2ZTsNCitjbGFzcyBDRldMX1dpZGdldE1nckl0ZW0gew0KKyBwdWJsaWM6DQorICBDRldMX1dpZGdldE1nckl0ZW0oKQ0KKyAgICAgIDogcFBhcmVudChOVUxMKSwNCisgICAgICAgIHBPd25lcihOVUxMKSwNCisgICAgICAgIHBDaGlsZChOVUxMKSwNCisgICAgICAgIHBQcmV2aW91cyhOVUxMKSwNCisgICAgICAgIHBOZXh0KE5VTEwpLA0KKyAgICAgICAgcFdpZGdldChOVUxMKSwNCisgICAgICAgIHBPZmZzY3JlZW4oTlVMTCksDQorICAgICAgICBpUmVkcmF3Q291bnRlcigwKQ0KKyNpZiAoX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8pIHx8IChfRlhfT1NfID09IF9GWF9XSU42NF8pDQorICAgICAgICAsDQorICAgICAgICBiT3V0c2lkZUNoYW5nZWQoRkFMU0UpDQorI2VuZGlmDQorICB7DQorICB9DQorICB+Q0ZXTF9XaWRnZXRNZ3JJdGVtKCkgew0KKyAgICBpZiAocE9mZnNjcmVlbikgew0KKyAgICAgIGRlbGV0ZSBwT2Zmc2NyZWVuOw0KKyAgICAgIHBPZmZzY3JlZW4gPSBOVUxMOw0KKyAgICB9DQorICB9DQorICBDRldMX1dpZGdldE1nckl0ZW0qIHBQYXJlbnQ7DQorICBDRldMX1dpZGdldE1nckl0ZW0qIHBPd25lcjsNCisgIENGV0xfV2lkZ2V0TWdySXRlbSogcENoaWxkOw0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBwUHJldmlvdXM7DQorICBDRldMX1dpZGdldE1nckl0ZW0qIHBOZXh0Ow0KKyAgSUZXTF9XaWRnZXQqIHBXaWRnZXQ7DQorICBDRlhfR3JhcGhpY3MqIHBPZmZzY3JlZW47DQorICBpbnQzMl90IGlSZWRyYXdDb3VudGVyOw0KKyNpZiAoX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8pIHx8IChfRlhfT1NfID09IF9GWF9XSU42NF8pDQorICBGWF9CT09MIGJPdXRzaWRlQ2hhbmdlZDsNCisjZW5kaWYNCit9Ow0KKw0KK2NsYXNzIENGV0xfV2lkZ2V0TWdyIDogcHVibGljIElGV0xfV2lkZ2V0TWdyIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9XaWRnZXRNZ3IoSUZXTF9BZGFwdGVyTmF0aXZlKiBwQWRhcHRlck5hdGl2ZSk7DQorICB+Q0ZXTF9XaWRnZXRNZ3IoKSBvdmVycmlkZTsNCisNCisgIC8vIElGV0xfV2lkZ2V0TWdyOg0KKyAgaW50MzJfdCBDb3VudFdpZGdldHMoSUZXTF9XaWRnZXQqIHBQYXJlbnQgPSBOVUxMKSBvdmVycmlkZTsNCisgIElGV0xfV2lkZ2V0KiBHZXRXaWRnZXQoaW50MzJfdCBuSW5kZXgsIElGV0xfV2lkZ2V0KiBwUGFyZW50ID0gTlVMTCkgb3ZlcnJpZGU7DQorICBJRldMX1dpZGdldCogR2V0V2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfV0dUUkVMQVRJT04gZVJlbGF0aW9uKSBvdmVycmlkZTsNCisgIGludDMyX3QgR2V0V2lkZ2V0SW5kZXgoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIG92ZXJyaWRlOw0KKyAgRlhfQk9PTCBTZXRXaWRnZXRJbmRleChJRldMX1dpZGdldCogcFdpZGdldCwgaW50MzJfdCBuSW5kZXgpIG92ZXJyaWRlOw0KKyAgRldMX0VSUiBSZXBhaW50V2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QgPSBOVUxMKSBvdmVycmlkZTsNCisgIEZYX0RXT1JEIEdldENhcGFiaWxpdHkoKSBvdmVycmlkZSB7IHJldHVybiBtX2R3Q2FwYWJpbGl0eTsgfQ0KKw0KKyAgdm9pZCBBZGRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdm9pZCBJbnNlcnRXaWRnZXQoSUZXTF9XaWRnZXQqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCogcENoaWxkLA0KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXggPSAtMSk7DQorICB2b2lkIFJlbW92ZVdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCk7DQorICB2b2lkIFNldE93bmVyKElGV0xfV2lkZ2V0KiBwT3duZXIsIElGV0xfV2lkZ2V0KiBwT3duZWQpOw0KKyAgdm9pZCBTZXRQYXJlbnQoSUZXTF9XaWRnZXQqIHBQYXJlbnQsIElGV0xfV2lkZ2V0KiBwQ2hpbGQpOw0KKyAgRlhfQk9PTCBJc0NoaWxkKElGV0xfV2lkZ2V0KiBwQ2hpbGQsIElGV0xfV2lkZ2V0KiBwUGFyZW50KTsNCisgIEZXTF9FUlIgQ3JlYXRlV2lkZ2V0X05hdGl2ZShJRldMX1dpZGdldCogcFdpZGdldCk7DQorICBGV0xfRVJSIERlc3Ryb3lXaWRnZXRfTmF0aXZlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIEZXTF9FUlIgR2V0V2lkZ2V0UmVjdF9OYXRpdmUoSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9SZWN0RiYgcmVjdCk7DQorICBGV0xfRVJSIFNldFdpZGdldFJlY3RfTmF0aXZlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBjb25zdCBDRlhfUmVjdEYmIHJlY3QpOw0KKyAgRldMX0VSUiBTZXRXaWRnZXRQb3NpdGlvbl9OYXRpdmUoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KTsNCisgIEZXTF9FUlIgU2V0V2lkZ2V0SWNvbl9OYXRpdmUoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcEljb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkJpZyk7DQorICBGV0xfRVJSIFNldFdpZGdldENhcHRpb25fTmF0aXZlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2FwdGlvbik7DQorICBGV0xfRVJSIFNldEJvcmRlclJlZ2lvbl9OYXRpdmUoSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9QYXRoKiBwUGF0aCk7DQorICBGV0xfRVJSIFNob3dXaWRnZXRfTmF0aXZlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIEZXTF9FUlIgSGlkZVdpZGdldF9OYXRpdmUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgRldMX0VSUiBTZXROb3JtYWxfTmF0aXZlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIEZXTF9FUlIgU2V0TWF4aW1pemVfTmF0aXZlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIEZXTF9FUlIgU2V0TWluaW1pemVfTmF0aXZlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIEZYX0JPT0wgQ2hlY2tNZXNzYWdlX05hdGl2ZSgpOw0KKyAgRldMX0VSUiBEaXNwYXRjaE1lc3NhZ2VfTmF0aXZlKCk7DQorICBGWF9CT09MIElzSWRsZU1lc3NhZ2VfTmF0aXZlKCk7DQorICBGV0xfRVJSIEV4aXRfTmF0aXZlKGludDMyX3QgaUV4aXRDb2RlKTsNCisgIEZXTF9FUlIgQ3JlYXRlV2lkZ2V0V2l0aE5hdGl2ZUlkX05hdGl2ZShJRldMX1dpZGdldCogcFdpZGdldCwgdm9pZCogdnApOw0KKyAgSUZXTF9XaWRnZXQqIEdldFdpZGdldEF0UG9pbnQoSUZXTF9XaWRnZXQqIHBQYXJlbnQsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2b2lkIE5vdGlmeVNpemVDaGFuZ2VkKElGV0xfV2lkZ2V0KiBwRm9ybSwgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIElGV0xfV2lkZ2V0KiBuZXh0VGFiKElGV0xfV2lkZ2V0KiBwYXJlbnQsIElGV0xfV2lkZ2V0KiBmb2N1cywgRlhfQk9PTCYgYkZpbmQpOw0KKyAgaW50MzJfdCBDb3VudFJhZGlvQnV0dG9uR3JvdXAoSUZXTF9XaWRnZXQqIHBGaXJzdCk7DQorICBJRldMX1dpZGdldCogR2V0U2libGluZ1JhZGlvQnV0dG9uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBGWF9CT09MIGJOZXh0KTsNCisgIElGV0xfV2lkZ2V0KiBHZXRSYWRpb0J1dHRvbkdyb3VwSGVhZGVyKElGV0xfV2lkZ2V0KiBwUmFkaW9CdXR0b24pOw0KKyAgdm9pZCBHZXRTYW1lR3JvdXBSYWRpb0J1dHRvbihJRldMX1dpZGdldCogcFJhZGlvQnV0dG9uLCBDRlhfUHRyQXJyYXkmIGdyb3VwKTsNCisgIElGV0xfV2lkZ2V0KiBHZXREZWZhdWx0QnV0dG9uKElGV0xfV2lkZ2V0KiBwUGFyZW50KTsNCisgIHZvaWQgQWRkUmVkcmF3Q291bnRzKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIHZvaWQgUmVzZXRSZWRyYXdDb3VudHMoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgSUZXTF9BZGFwdGVyV2lkZ2V0TWdyKiBHZXRBZGFwdGVyV2lkZ2V0TWdyKCkgeyByZXR1cm4gbV9wQWRhcHRlcjsgfQ0KKyAgQ0ZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZSogR2V0RGVsZWdhdGUoKSB7IHJldHVybiBtX3BEZWxlZ2F0ZTsgfQ0KKyAgQ0ZXTF9XaWRnZXRNZ3JJdGVtKiBHZXRXaWRnZXRNZ3JJdGVtKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIEZYX0JPT0wgSXNUaHJlYWRFbmFibGVkKCk7DQorICBGWF9CT09MIElzRm9ybURpc2FibGVkKCk7DQorICBGWF9CT09MIEdldEFkYXB0ZXJQb3B1cFBvcyhJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNaW5IZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWF4SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRQb3B1cCk7DQorDQorIHByb3RlY3RlZDoNCisgIGludDMyX3QgVHJhdmVsV2lkZ2V0TWdyKENGV0xfV2lkZ2V0TWdySXRlbSogcFBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGV0xfV2lkZ2V0TWdySXRlbSogcEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1dpZGdldCoqIHBXaWRnZXQgPSBOVUxMKTsNCisgIEZYX0JPT0wgSXNBYmxlTmF0aXZlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIENGWF9NYXBQdHJUb1B0ciBtX21hcFdpZGdldEl0ZW07DQorICBJRldMX0FkYXB0ZXJXaWRnZXRNZ3IqIG1fcEFkYXB0ZXI7DQorICBDRldMX1dpZGdldE1nckRlbGVnYXRlKiBtX3BEZWxlZ2F0ZTsNCisgIGZyaWVuZCBjbGFzcyBDRldMX1dpZGdldE1nckRlbGVnYXRlOw0KKyAgRlhfRFdPUkQgbV9kd0NhcGFiaWxpdHk7DQorI2lmIChfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXykgfHwgKF9GWF9PU18gPT0gX0ZYX1dJTjY0XykNCisgIENGWF9SZWN0RiBtX3J0U2NyZWVuOw0KKyNlbmRpZg0KK307DQorDQorY2xhc3MgQ0ZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZSA6IHB1YmxpYyBJRldMX1dpZGdldE1nckRlbGVnYXRlIHsNCisgcHVibGljOg0KKyAgQ0ZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZShDRldMX1dpZGdldE1nciogcFdpZGdldE1ncik7DQorICB+Q0ZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZSgpIG92ZXJyaWRlIHt9DQorDQorICAvLyBJRldMX1dpZGdldE1nckRlbGVnYXRlOg0KKyAgRldMX0VSUiBPblNldENhcGFiaWxpdHkoDQorICAgICAgRlhfRFdPUkQgZHdDYXBhYmlsaXR5ID0gRldMX1dHVE1HUl9EaXNhYmxlVGhyZWFkKSBvdmVycmlkZTsNCisgIGludDMyX3QgT25Qcm9jZXNzTWVzc2FnZVRvRm9ybShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSBvdmVycmlkZTsNCisgIEZXTF9FUlIgT25EcmF3V2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSBvdmVycmlkZTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBEcmF3Q2hpbGQoSUZXTF9XaWRnZXQqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0Q2xpcCwNCisgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICBDRlhfR3JhcGhpY3MqIERyYXdXaWRnZXRCZWZvcmUoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7DQorICB2b2lkIERyYXdXaWRnZXRBZnRlcihJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydENsaXAsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIEZYX0JPT0wgSXNOZWVkUmVwYWludChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnREaXJ0eSk7DQorICBGWF9CT09MIGJVc2VPZmZzY3JlZW5EaXJlY3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKw0KKyAgQ0ZXTF9XaWRnZXRNZ3IqIG1fcFdpZGdldE1ncjsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9hcHAuY3BwIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2FwcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk2MjU5YgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9hcHAuY3BwCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCitDRldMX0FwcDo6Q0ZXTF9BcHAoKSA6IG1fcElmYWNlKElGV0xfQXBwOjpDcmVhdGUobnVsbHB0cikpLCBtX3BUaGVtZShudWxscHRyKSB7fQ0KK0NGV0xfQXBwOjp+Q0ZXTF9BcHAoKSB7DQorICBpZiAobV9wVGhlbWUpIHsNCisgICAgbV9wVGhlbWUtPkZpbmFsaXplKCk7DQorICAgIGRlbGV0ZSBtX3BUaGVtZTsNCisgICAgbV9wVGhlbWUgPSBOVUxMOw0KKyAgfQ0KKyAgbV9wSWZhY2UtPlJlbGVhc2UoKTsNCit9DQorRldMX0VSUiBDRldMX0FwcDo6SW5pdGlhbGl6ZSgpIHsNCisgIG1fcFRoZW1lID0gbmV3IENGV0xfVGhlbWU7DQorICBtX3BUaGVtZS0+SW5pdGlhbGl6ZSgpOw0KKyAgbV9wSWZhY2UtPlNldFRoZW1lUHJvdmlkZXIobV9wVGhlbWUpOw0KKyAgcmV0dXJuIG1fcElmYWNlLT5Jbml0aWFsaXplKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9BcHA6OkV4aXQoaW50MzJfdCBpRXhpdENvZGUpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZXR1cm4gbV9wSWZhY2UtPkV4aXQoaUV4aXRDb2RlKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2JhcmNvZGUuY3BwIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2JhcmNvZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZjczZWYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvYmFyY29kZS5jcHAKQEAgLTAsMCArMSw0NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSA8bWVtb3J5Pg0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorDQorQ0ZXTF9CYXJjb2RlKiBDRldMX0JhcmNvZGU6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBuZXcgQ0ZXTF9CYXJjb2RlOw0KK30NCitGV0xfRVJSIENGV0xfQmFyY29kZTo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzKSB7DQorICBpZiAobV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBpZiAocFByb3BlcnRpZXMpIHsNCisgICAgKm1fcFByb3BlcnRpZXMgPSAqcFByb3BlcnRpZXM7DQorICB9DQorICBzdGQ6OnVuaXF1ZV9wdHI8SUZXTF9CYXJjb2RlPiBwQmFyY29kZShJRldMX0JhcmNvZGU6OkNyZWF0ZSgNCisgICAgICBtX3BQcm9wZXJ0aWVzLT5NYWtlV2lkZ2V0SW1wUHJvcGVydGllcygmbV9iYXJjb2RlRGF0YSkpKTsNCisgIEZXTF9FUlIgcmV0ID0gcEJhcmNvZGUtPkluaXRpYWxpemUoKTsNCisgIGlmIChyZXQgIT0gRldMX0VSUl9TdWNjZWVkZWQpIHsNCisgICAgcmV0dXJuIHJldDsNCisgIH0NCisgIG1fcElmYWNlID0gcEJhcmNvZGUucmVsZWFzZSgpOw0KKyAgQ0ZXTF9XaWRnZXQ6OkluaXRpYWxpemUoKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorQ0ZXTF9CYXJjb2RlOjpDRldMX0JhcmNvZGUoKSB7fQ0KK0NGV0xfQmFyY29kZTo6fkNGV0xfQmFyY29kZSgpIHt9DQordm9pZCBDRldMX0JhcmNvZGU6OlNldFR5cGUoQkNfVFlQRSB0eXBlKSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm47DQorICBzdGF0aWNfY2FzdDxJRldMX0JhcmNvZGUqPihtX3BJZmFjZSktPlNldFR5cGUodHlwZSk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9CYXJjb2RlOjpJc1Byb3RlY3RlZFR5cGUoKSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0JhcmNvZGUqPihtX3BJZmFjZSktPklzUHJvdGVjdGVkVHlwZSgpOw0KK30NCitGV0xfRVJSIENGV0xfQmFyY29kZTo6Q0ZXTF9CYXJjb2RlRFA6OkdldENhcHRpb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0NhcHRpb24pIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2NhcmV0LmNwcCBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9jYXJldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI2OGYwZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9jYXJldC5jcHAKQEAgLTAsMCArMSw0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSA8bWVtb3J5Pg0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorDQorQ0ZXTF9DYXJldCogQ0ZXTF9DYXJldDo6Q3JlYXRlKCkgew0KKyAgcmV0dXJuIG5ldyBDRldMX0NhcmV0Ow0KK30NCitGV0xfRVJSIENGV0xfQ2FyZXQ6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzKiBwUHJvcGVydGllcykgew0KKyAgaWYgKG1fcElmYWNlKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgaWYgKHBQcm9wZXJ0aWVzKSB7DQorICAgICptX3BQcm9wZXJ0aWVzID0gKnBQcm9wZXJ0aWVzOw0KKyAgfQ0KKyAgc3RkOjp1bmlxdWVfcHRyPElGV0xfQ2FyZXQ+IHBDYXJldChJRldMX0NhcmV0OjpDcmVhdGUoDQorICAgICAgbV9wUHJvcGVydGllcy0+TWFrZVdpZGdldEltcFByb3BlcnRpZXMobnVsbHB0ciksIG51bGxwdHIpKTsNCisgIEZXTF9FUlIgcmV0ID0gcENhcmV0LT5Jbml0aWFsaXplKCk7DQorICBpZiAocmV0ICE9IEZXTF9FUlJfU3VjY2VlZGVkKSB7DQorICAgIHJldHVybiByZXQ7DQorICB9DQorICBtX3BJZmFjZSA9IHBDYXJldC5yZWxlYXNlKCk7DQorICBDRldMX1dpZGdldDo6SW5pdGlhbGl6ZSgpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ2FyZXQ6OlNob3dDYXJldChGWF9CT09MIGJGbGFnKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9DYXJldCo+KG1fcElmYWNlKS0+U2hvd0NhcmV0KGJGbGFnKTsNCit9DQorRldMX0VSUiBDRldMX0NhcmV0OjpHZXRGcmVxdWVuY3koRlhfRFdPUkQmIGVsYXBzZSkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfQ2FyZXQqPihtX3BJZmFjZSktPkdldEZyZXF1ZW5jeShlbGFwc2UpOw0KK30NCitGV0xfRVJSIENGV0xfQ2FyZXQ6OlNldEZyZXF1ZW5jeShGWF9EV09SRCBlbGFwc2UpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0NhcmV0Kj4obV9wSWZhY2UpLT5TZXRGcmVxdWVuY3koZWxhcHNlKTsNCit9DQorRldMX0VSUiBDRldMX0NhcmV0OjpTZXRDb2xvcihDRlhfQ29sb3IgY3JGaWxsKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9DYXJldCo+KG1fcElmYWNlKS0+U2V0Q29sb3IoY3JGaWxsKTsNCit9DQorQ0ZXTF9DYXJldDo6Q0ZXTF9DYXJldCgpIHt9DQorQ0ZXTF9DYXJldDo6fkNGV0xfQ2FyZXQoKSB7fQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9jaGVja2JveC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvY2hlY2tib3guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMzRhMWQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvY2hlY2tib3guY3BwCkBAIC0wLDAgKzEsNTUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgPG1lbW9yeT4NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKw0KK0NGV0xfQ2hlY2tCb3gqIENGV0xfQ2hlY2tCb3g6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBuZXcgQ0ZXTF9DaGVja0JveDsNCit9DQorRldMX0VSUiBDRldMX0NoZWNrQm94OjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyogcFByb3BlcnRpZXMpIHsNCisgIGlmIChtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIGlmIChwUHJvcGVydGllcykgew0KKyAgICAqbV9wUHJvcGVydGllcyA9ICpwUHJvcGVydGllczsNCisgIH0NCisgIHN0ZDo6dW5pcXVlX3B0cjxJRldMX0NoZWNrQm94PiBwQ2hlY2tCb3goSUZXTF9DaGVja0JveDo6Q3JlYXRlKA0KKyAgICAgIG1fcFByb3BlcnRpZXMtPk1ha2VXaWRnZXRJbXBQcm9wZXJ0aWVzKCZtX2NoZWNrYm94RGF0YSksIG51bGxwdHIpKTsNCisgIEZXTF9FUlIgcmV0ID0gcENoZWNrQm94LT5Jbml0aWFsaXplKCk7DQorICBpZiAocmV0ICE9IEZXTF9FUlJfU3VjY2VlZGVkKSB7DQorICAgIHJldHVybiByZXQ7DQorICB9DQorICBtX3BJZmFjZSA9IHBDaGVja0JveC5yZWxlYXNlKCk7DQorICBDRldMX1dpZGdldDo6SW5pdGlhbGl6ZSgpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ2hlY2tCb3g6OlNldENhcHRpb24oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NhcHRpb24pIHsNCisgIG1fY2hlY2tib3hEYXRhLm1fd3NDYXB0aW9uID0gd3NDYXB0aW9uOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ2hlY2tCb3g6OlNldEJveFNpemUoRlhfRkxPQVQgZkhlaWdodCkgew0KKyAgbV9jaGVja2JveERhdGEubV9mQm94SGVpZ2h0ID0gZkhlaWdodDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQoraW50MzJfdCBDRldMX0NoZWNrQm94OjpHZXRDaGVja1N0YXRlKCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfQ2hlY2tCb3gqPihtX3BJZmFjZSktPkdldENoZWNrU3RhdGUoKTsNCit9DQorRldMX0VSUiBDRldMX0NoZWNrQm94OjpTZXRDaGVja1N0YXRlKGludDMyX3QgaUNoZWNrKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9DaGVja0JveCo+KG1fcElmYWNlKS0+U2V0Q2hlY2tTdGF0ZShpQ2hlY2spOw0KK30NCitDRldMX0NoZWNrQm94OjpDRldMX0NoZWNrQm94KCkge30NCitDRldMX0NoZWNrQm94Ojp+Q0ZXTF9DaGVja0JveCgpIHt9DQorQ0ZXTF9DaGVja0JveDo6Q0ZXTF9DaGVja0JveERQOjpDRldMX0NoZWNrQm94RFAoKQ0KKyAgICA6IG1fZkJveEhlaWdodCgxNi4wZiksIG1fd3NDYXB0aW9uKEwiQ2hlY2sgYm94Iikge30NCitGV0xfRVJSIENGV0xfQ2hlY2tCb3g6OkNGV0xfQ2hlY2tCb3hEUDo6R2V0Q2FwdGlvbihJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NDYXB0aW9uKSB7DQorICB3c0NhcHRpb24gPSBtX3dzQ2FwdGlvbjsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRkxPQVQgQ0ZXTF9DaGVja0JveDo6Q0ZXTF9DaGVja0JveERQOjpHZXRCb3hTaXplKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gbV9mQm94SGVpZ2h0Ow0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvY29tYm9ib3guY3BwIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2NvbWJvYm94LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWVjZGU1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2NvbWJvYm94LmNwcApAQCAtMCwwICsxLDM1OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSA8bWVtb3J5Pg0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorDQorQ0ZXTF9Db21ib0JveCogQ0ZXTF9Db21ib0JveDo6Q3JlYXRlKCkgew0KKyAgcmV0dXJuIG5ldyBDRldMX0NvbWJvQm94Ow0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzKiBwUHJvcGVydGllcykgew0KKyAgaWYgKG1fcElmYWNlKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgaWYgKHBQcm9wZXJ0aWVzKSB7DQorICAgICptX3BQcm9wZXJ0aWVzID0gKnBQcm9wZXJ0aWVzOw0KKyAgfQ0KKyAgc3RkOjp1bmlxdWVfcHRyPElGV0xfQ29tYm9Cb3g+IHBDb21ib0JveChJRldMX0NvbWJvQm94OjpDcmVhdGUoDQorICAgICAgbV9wUHJvcGVydGllcy0+TWFrZVdpZGdldEltcFByb3BlcnRpZXMoJm1fY29tYm9Cb3hEYXRhKSkpOw0KKyAgRldMX0VSUiByZXQgPSBwQ29tYm9Cb3gtPkluaXRpYWxpemUoKTsNCisgIGlmIChyZXQgIT0gRldMX0VSUl9TdWNjZWVkZWQpIHsNCisgICAgcmV0dXJuIHJldDsNCisgIH0NCisgIG1fcElmYWNlID0gcENvbWJvQm94LnJlbGVhc2UoKTsNCisgIENGV0xfV2lkZ2V0OjpJbml0aWFsaXplKCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK2ludDMyX3QgQ0ZXTF9Db21ib0JveDo6QWRkU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUZXh0KSB7DQorICBDRldMX0NvbWJvQm94SXRlbSogcEl0ZW0gPSBuZXcgQ0ZXTF9Db21ib0JveEl0ZW07DQorICBwSXRlbS0+bV93c1RleHQgPSB3c1RleHQ7DQorICBwSXRlbS0+bV9kd1N0eWxlcyA9IDA7DQorICByZXR1cm4gbV9jb21ib0JveERhdGEubV9hcnJJdGVtLkFkZChwSXRlbSk7DQorfQ0KK2ludDMyX3QgQ0ZXTF9Db21ib0JveDo6QWRkU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcEljb24pIHsNCisgIENGV0xfQ29tYm9Cb3hJdGVtKiBwSXRlbSA9IG5ldyBDRldMX0NvbWJvQm94SXRlbTsNCisgIHBJdGVtLT5tX3dzVGV4dCA9IHdzVGV4dDsNCisgIHBJdGVtLT5tX2R3U3R5bGVzID0gMDsNCisgIHBJdGVtLT5tX3BESUIgPSBwSWNvbjsNCisgIHJldHVybiBtX2NvbWJvQm94RGF0YS5tX2Fyckl0ZW0uQWRkKHBJdGVtKTsNCit9DQoraW50MzJfdCBDRldMX0NvbWJvQm94OjpSZW1vdmVBdChpbnQzMl90IGlJbmRleCkgew0KKyAgcmV0dXJuIG1fY29tYm9Cb3hEYXRhLm1fYXJySXRlbS5SZW1vdmVBdChpSW5kZXgpOw0KK30NCitpbnQzMl90IENGV0xfQ29tYm9Cb3g6OlJlbW92ZUFsbCgpIHsNCisgIG1fY29tYm9Cb3hEYXRhLm1fYXJySXRlbS5SZW1vdmVBbGwoKTsNCisgIHJldHVybiAwOw0KK30NCitpbnQzMl90IENGV0xfQ29tYm9Cb3g6OkNvdW50SXRlbXMoKSB7DQorICByZXR1cm4gbV9jb21ib0JveERhdGEuQ291bnRJdGVtcyhHZXRXaWRnZXQoKSk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveDo6R2V0VGV4dEJ5SW5kZXgoaW50MzJfdCBpSW5kZXgsIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIENGV0xfQ29tYm9Cb3hJdGVtKiBwSXRlbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZXTF9Db21ib0JveEl0ZW0qPigNCisgICAgICBtX2NvbWJvQm94RGF0YS5HZXRJdGVtKG1fcElmYWNlLCBpSW5kZXgpKTsNCisgIGlmICghcEl0ZW0pDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICB3c1RleHQgPSBwSXRlbS0+bV93c1RleHQ7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK2ludDMyX3QgQ0ZXTF9Db21ib0JveDo6R2V0Q3VyU2VsKCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIC0xOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfQ29tYm9Cb3gqPihtX3BJZmFjZSktPkdldEN1clNlbCgpOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OlNldEN1clNlbChpbnQzMl90IGlTZWwpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9Db21ib0JveCo+KG1fcElmYWNlKS0+U2V0Q3VyU2VsKGlTZWwpOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OlNldEVkaXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUZXh0KSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfQ29tYm9Cb3gqPihtX3BJZmFjZSktPlNldEVkaXRUZXh0KHdzVGV4dCk7DQorfQ0KK2ludDMyX3QgQ0ZXTF9Db21ib0JveDo6R2V0RWRpdFRleHRMZW5ndGgoKSBjb25zdCB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0NvbWJvQm94Kj4obV9wSWZhY2UpLT5HZXRFZGl0VGV4dExlbmd0aCgpOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OkdldEVkaXRUZXh0KENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50KSBjb25zdCB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfQ29tYm9Cb3gqPihtX3BJZmFjZSkNCisgICAgICAtPkdldEVkaXRUZXh0KHdzVGV4dCwgblN0YXJ0LCBuQ291bnQpOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OlNldEVkaXRTZWxSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9Db21ib0JveCo+KG1fcElmYWNlKS0+U2V0RWRpdFNlbFJhbmdlKG5TdGFydCwgbkNvdW50KTsNCit9DQoraW50MzJfdCBDRldMX0NvbWJvQm94OjpHZXRFZGl0U2VsUmFuZ2UoaW50MzJfdCBuSW5kZXgsIGludDMyX3QmIG5TdGFydCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9Db21ib0JveCo+KG1fcElmYWNlKS0+R2V0RWRpdFNlbFJhbmdlKG5JbmRleCwgblN0YXJ0KTsNCit9DQoraW50MzJfdCBDRldMX0NvbWJvQm94OjpHZXRFZGl0TGltaXQoKSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0NvbWJvQm94Kj4obV9wSWZhY2UpLT5HZXRFZGl0TGltaXQoKTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94OjpTZXRFZGl0TGltaXQoaW50MzJfdCBuTGltaXQpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9Db21ib0JveCo+KG1fcElmYWNlKS0+U2V0RWRpdExpbWl0KG5MaW1pdCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveDo6RWRpdERvQ2xpcGJvYXJkKGludDMyX3QgaUNtZCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0NvbWJvQm94Kj4obV9wSWZhY2UpLT5FZGl0RG9DbGlwYm9hcmQoaUNtZCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Db21ib0JveDo6RWRpdFJlZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfQ29tYm9Cb3gqPihtX3BJZmFjZSktPkVkaXRSZWRvKGJzUmVjb3JkKTsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94OjpFZGl0VW5kbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9Db21ib0JveCo+KG1fcElmYWNlKS0+RWRpdFVuZG8oYnNSZWNvcmQpOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OlNldE1heExpc3RIZWlnaHQoRlhfRkxPQVQgZk1heEhlaWdodCkgew0KKyAgbV9jb21ib0JveERhdGEubV9mTWF4TGlzdEhlaWdodCA9IGZNYXhIZWlnaHQ7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveDo6U2V0SXRlbURhdGEoaW50MzJfdCBpSW5kZXgsIHZvaWQqIHBEYXRhKSB7DQorICBDRldMX0NvbWJvQm94SXRlbSogcEl0ZW0gPSByZWludGVycHJldF9jYXN0PENGV0xfQ29tYm9Cb3hJdGVtKj4oDQorICAgICAgbV9jb21ib0JveERhdGEuR2V0SXRlbShtX3BJZmFjZSwgaUluZGV4KSk7DQorICBpZiAoIXBJdGVtKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgcEl0ZW0tPm1fcERhdGEgPSBwRGF0YTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQordm9pZCogQ0ZXTF9Db21ib0JveDo6R2V0SXRlbURhdGEoaW50MzJfdCBpSW5kZXgpIHsNCisgIENGV0xfQ29tYm9Cb3hJdGVtKiBwSXRlbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZXTF9Db21ib0JveEl0ZW0qPigNCisgICAgICBtX2NvbWJvQm94RGF0YS5HZXRJdGVtKG1fcElmYWNlLCBpSW5kZXgpKTsNCisgIGlmICghcEl0ZW0pDQorICAgIHJldHVybiBOVUxMOw0KKyAgcmV0dXJuIHBJdGVtLT5tX3BEYXRhOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OlNldExpc3RUaGVtZShJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfQ29tYm9Cb3gqPihtX3BJZmFjZSktPkdldExpc3RCb3h0KCktPlNldFRoZW1lUHJvdmlkZXIoDQorICAgICAgcFRoZW1lKTsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94OjpBZnRlckZvY3VzU2hvd0Ryb3BMaXN0KCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfQ29tYm9Cb3gqPihtX3BJZmFjZSktPkFmdGVyRm9jdXNTaG93RHJvcExpc3QoKTsNCit9DQorRldMX0VSUiBDRldMX0NvbWJvQm94OjpPcGVuRHJvcERvd25MaXN0KEZYX0JPT0wgYkFjdGl2YXRlKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9Db21ib0JveCo+KG1fcElmYWNlKS0+T3BlbkRyb3BEb3duTGlzdChiQWN0aXZhdGUpOw0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3g6OkVkaXRDYW5VbmRvKCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfQ29tYm9Cb3gqPihtX3BJZmFjZSktPkVkaXRDYW5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Db21ib0JveDo6RWRpdENhblJlZG8oKSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9Db21ib0JveCo+KG1fcElmYWNlKS0+RWRpdENhblJlZG8oKTsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94OjpFZGl0VW5kbygpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGQUxTRTsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0NvbWJvQm94Kj4obV9wSWZhY2UpLT5FZGl0VW5kbygpOw0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3g6OkVkaXRSZWRvKCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfQ29tYm9Cb3gqPihtX3BJZmFjZSktPkVkaXRSZWRvKCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Db21ib0JveDo6RWRpdENhbkNvcHkoKSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9Db21ib0JveCo+KG1fcElmYWNlKS0+RWRpdENhbkNvcHkoKTsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94OjpFZGl0Q2FuQ3V0KCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfQ29tYm9Cb3gqPihtX3BJZmFjZSktPkVkaXRDYW5DdXQoKTsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94OjpFZGl0Q2FuU2VsZWN0QWxsKCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfQ29tYm9Cb3gqPihtX3BJZmFjZSktPkVkaXRDYW5TZWxlY3RBbGwoKTsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94OjpFZGl0Q29weShDRlhfV2lkZVN0cmluZyYgd3NDb3B5KSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9Db21ib0JveCo+KG1fcElmYWNlKS0+RWRpdENvcHkod3NDb3B5KTsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94OjpFZGl0Q3V0KENGWF9XaWRlU3RyaW5nJiB3c0N1dCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfQ29tYm9Cb3gqPihtX3BJZmFjZSktPkVkaXRDdXQod3NDdXQpOw0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3g6OkVkaXRQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXN0ZSkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfQ29tYm9Cb3gqPihtX3BJZmFjZSktPkVkaXRQYXN0ZSh3c1Bhc3RlKTsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94OjpFZGl0U2VsZWN0QWxsKCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfQ29tYm9Cb3gqPihtX3BJZmFjZSktPkVkaXRTZWxlY3RBbGwoKTsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94OjpFZGl0RGVsZXRlKCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfQ29tYm9Cb3gqPihtX3BJZmFjZSktPkVkaXREZWxldGUoKTsNCit9DQorRlhfQk9PTCBDRldMX0NvbWJvQm94OjpFZGl0RGVTZWxlY3QoKSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9Db21ib0JveCo+KG1fcElmYWNlKS0+RWRpdERlU2VsZWN0KCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveDo6R2V0QkJveChDRlhfUmVjdEYmIHJlY3QpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGQUxTRTsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0NvbWJvQm94Kj4obV9wSWZhY2UpLT5HZXRCQm94KHJlY3QpOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OkVkaXRNb2RpZnlTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGQUxTRTsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0NvbWJvQm94Kj4obV9wSWZhY2UpDQorICAgICAgLT5FZGl0TW9kaWZ5U3R5bGVzRXgoZHdTdHlsZXNFeEFkZGVkLCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQorfQ0KK0NGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3goKSB7fQ0KK0NGV0xfQ29tYm9Cb3g6On5DRldMX0NvbWJvQm94KCkge30NCitDRldMX0NvbWJvQm94OjpDRldMX0NvbWJvQm94RFA6OkNGV0xfQ29tYm9Cb3hEUCgpIHsNCisgIG1fZkl0ZW1IZWlnaHQgPSAwOw0KKyAgbV9mTWF4TGlzdEhlaWdodCA9IDA7DQorfQ0KK0NGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6fkNGV0xfQ29tYm9Cb3hEUCgpIHsNCisgIGludDMyX3QgbkNvdW50ID0gbV9hcnJJdGVtLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgIGRlbGV0ZSBzdGF0aWNfY2FzdDxDRldMX0NvbWJvQm94SXRlbSo+KG1fYXJySXRlbVtpXSk7DQorICB9DQorICBtX2Fyckl0ZW0uUmVtb3ZlQWxsKCk7DQorfQ0KK2ludDMyX3QgQ0ZXTF9Db21ib0JveDo6Q0ZXTF9Db21ib0JveERQOjpDb3VudEl0ZW1zKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gbV9hcnJJdGVtLkdldFNpemUoKTsNCit9DQorRldMX0hMSVNUSVRFTSBDRldMX0NvbWJvQm94OjpDRldMX0NvbWJvQm94RFA6OkdldEl0ZW0oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgpIHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9hcnJJdGVtLkdldFNpemUoKTsNCisgIGlmIChuSW5kZXggPj0gaUNvdW50IHx8IG5JbmRleCA8IDApIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gKEZXTF9ITElTVElURU0pbV9hcnJJdGVtW25JbmRleF07DQorfQ0KK2ludDMyX3QgQ0ZXTF9Db21ib0JveDo6Q0ZXTF9Db21ib0JveERQOjpHZXRJdGVtSW5kZXgoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtKSB7DQorICByZXR1cm4gbV9hcnJJdGVtLkZpbmQoaEl0ZW0pOw0KK30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6U2V0SXRlbUluZGV4KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4KSB7DQorICByZXR1cm4gbV9hcnJJdGVtLlNldEF0KG5JbmRleCwgaEl0ZW0pOw0KK30NCitGWF9EV09SRCBDRldMX0NvbWJvQm94OjpDRldMX0NvbWJvQm94RFA6OkdldEl0ZW1TdHlsZXMoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0pIHsNCisgIGlmICghaEl0ZW0pDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZXTF9Db21ib0JveEl0ZW0qPihoSXRlbSktPm1fZHdTdHlsZXM7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveDo6Q0ZXTF9Db21ib0JveERQOjpHZXRJdGVtVGV4dChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgaWYgKCFoSXRlbSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHdzVGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZXTF9Db21ib0JveEl0ZW0qPihoSXRlbSktPm1fd3NUZXh0Ow0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6R2V0SXRlbVJlY3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRJdGVtKSB7DQorICBpZiAoIWhJdGVtKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgQ0ZXTF9Db21ib0JveEl0ZW0qIHBJdGVtID0gcmVpbnRlcnByZXRfY2FzdDxDRldMX0NvbWJvQm94SXRlbSo+KGhJdGVtKTsNCisgIHJ0SXRlbS5TZXQocEl0ZW0tPm1fcnRJdGVtLmxlZnQsIHBJdGVtLT5tX3J0SXRlbS50b3AsIHBJdGVtLT5tX3J0SXRlbS53aWR0aCwNCisgICAgICAgICAgICAgcEl0ZW0tPm1fcnRJdGVtLmhlaWdodCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK3ZvaWQqIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6R2V0SXRlbURhdGEoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtKSB7DQorICBpZiAoIWhJdGVtKQ0KKyAgICByZXR1cm4gTlVMTDsNCisgIENGV0xfQ29tYm9Cb3hJdGVtKiBwSXRlbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZXTF9Db21ib0JveEl0ZW0qPihoSXRlbSk7DQorICByZXR1cm4gcEl0ZW0tPm1fcERhdGE7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveDo6Q0ZXTF9Db21ib0JveERQOjpTZXRJdGVtU3R5bGVzKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdHlsZSkgew0KKyAgaWYgKCFoSXRlbSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZXTF9Db21ib0JveEl0ZW0qPihoSXRlbSktPm1fZHdTdHlsZXMgPSBkd1N0eWxlOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6U2V0SXRlbVRleHQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pUZXh0KSB7DQorICBpZiAoIWhJdGVtKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgcmVpbnRlcnByZXRfY2FzdDxDRldMX0NvbWJvQm94SXRlbSo+KGhJdGVtKS0+bV93c1RleHQgPSBwc3pUZXh0Ow0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6U2V0SXRlbVJlY3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRJdGVtKSB7DQorICBpZiAoIWhJdGVtKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgcmVpbnRlcnByZXRfY2FzdDxDRldMX0NvbWJvQm94SXRlbSo+KGhJdGVtKS0+bV9ydEl0ZW0gPSBydEl0ZW07DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6R2V0SXRlbUhlaWdodChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIG1fZkl0ZW1IZWlnaHQ7DQorfQ0KK0NGWF9ESUJpdG1hcCogQ0ZXTF9Db21ib0JveDo6Q0ZXTF9Db21ib0JveERQOjpHZXRJdGVtSWNvbihJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSkgew0KKyAgaWYgKCFoSXRlbSkNCisgICAgcmV0dXJuIE5VTEw7DQorICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxDRldMX0NvbWJvQm94SXRlbSo+KGhJdGVtKS0+bV9wRElCOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6R2V0SXRlbUNoZWNrUmVjdChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRDaGVjaykgew0KKyAgQ0ZXTF9Db21ib0JveEl0ZW0qIHBJdGVtID0gcmVpbnRlcnByZXRfY2FzdDxDRldMX0NvbWJvQm94SXRlbSo+KGhJdGVtKTsNCisgIHJ0Q2hlY2sgPSBwSXRlbS0+bV9ydENoZWNrQm94Ow0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfQ29tYm9Cb3g6OkNGV0xfQ29tYm9Cb3hEUDo6U2V0SXRlbUNoZWNrUmVjdCgNCisgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgIGNvbnN0IENGWF9SZWN0RiYgcnRDaGVjaykgew0KKyAgQ0ZXTF9Db21ib0JveEl0ZW0qIHBJdGVtID0gcmVpbnRlcnByZXRfY2FzdDxDRldMX0NvbWJvQm94SXRlbSo+KGhJdGVtKTsNCisgIHBJdGVtLT5tX3J0Q2hlY2tCb3ggPSBydENoZWNrOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9EV09SRCBDRldMX0NvbWJvQm94OjpDRldMX0NvbWJvQm94RFA6OkdldEl0ZW1DaGVja1N0YXRlKA0KKyAgICBJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgRldMX0hMSVNUSVRFTSBoSXRlbSkgew0KKyAgQ0ZXTF9Db21ib0JveEl0ZW0qIHBJdGVtID0gcmVpbnRlcnByZXRfY2FzdDxDRldMX0NvbWJvQm94SXRlbSo+KGhJdGVtKTsNCisgIHJldHVybiBwSXRlbS0+bV9kd0NoZWNrU3RhdGU7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Db21ib0JveDo6Q0ZXTF9Db21ib0JveERQOjpTZXRJdGVtQ2hlY2tTdGF0ZSgNCisgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgIEZYX0RXT1JEIGR3Q2hlY2tTdGF0ZSkgew0KKyAgQ0ZXTF9Db21ib0JveEl0ZW0qIHBJdGVtID0gcmVpbnRlcnByZXRfY2FzdDxDRldMX0NvbWJvQm94SXRlbSo+KGhJdGVtKTsNCisgIHBJdGVtLT5tX2R3Q2hlY2tTdGF0ZSA9IGR3Q2hlY2tTdGF0ZTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRkxPQVQgQ0ZXTF9Db21ib0JveDo6Q0ZXTF9Db21ib0JveERQOjpHZXRMaXN0SGVpZ2h0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gbV9mTWF4TGlzdEhlaWdodDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2RhdGV0aW1lcGlja2VyLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9kYXRldGltZXBpY2tlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEyNzY1ZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9kYXRldGltZXBpY2tlci5jcHAKQEAgLTAsMCArMSwxMzkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgPG1lbW9yeT4NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKw0KK0NGV0xfRGF0ZVRpbWVQaWNrZXIqIENGV0xfRGF0ZVRpbWVQaWNrZXI6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBuZXcgQ0ZXTF9EYXRlVGltZVBpY2tlcjsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VyOjpJbml0aWFsaXplKA0KKyAgICBjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzKSB7DQorICBpZiAobV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBpZiAocFByb3BlcnRpZXMpIHsNCisgICAgKm1fcFByb3BlcnRpZXMgPSAqcFByb3BlcnRpZXM7DQorICB9DQorICBzdGQ6OnVuaXF1ZV9wdHI8SUZXTF9EYXRlVGltZVBpY2tlcj4gcERhdGVUaW1lUGlja2VyKA0KKyAgICAgIElGV0xfRGF0ZVRpbWVQaWNrZXI6OkNyZWF0ZSgNCisgICAgICAgICAgbV9wUHJvcGVydGllcy0+TWFrZVdpZGdldEltcFByb3BlcnRpZXMoJm1fRGF0ZVRpbWVQaWNrZXJEUCksDQorICAgICAgICAgIG51bGxwdHIpKTsNCisgIEZXTF9FUlIgcmV0ID0gcERhdGVUaW1lUGlja2VyLT5Jbml0aWFsaXplKCk7DQorICBpZiAocmV0ICE9IEZXTF9FUlJfU3VjY2VlZGVkKSB7DQorICAgIHJldHVybiByZXQ7DQorICB9DQorICBtX3BJZmFjZSA9IHBEYXRlVGltZVBpY2tlci5yZWxlYXNlKCk7DQorICBDRldMX1dpZGdldDo6SW5pdGlhbGl6ZSgpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCisNCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXI6OlNldFRvZGF5KGludDMyX3QgaVllYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaURheSkgew0KKyAgbV9EYXRlVGltZVBpY2tlckRQLm1faVllYXIgPSBpWWVhcjsNCisgIG1fRGF0ZVRpbWVQaWNrZXJEUC5tX2lNb250aCA9IGlNb250aDsNCisgIG1fRGF0ZVRpbWVQaWNrZXJEUC5tX2lEYXkgPSBpRGF5Ow0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitpbnQzMl90IENGV0xfRGF0ZVRpbWVQaWNrZXI6OkNvdW50U2VsUmFuZ2VzKCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfRGF0ZVRpbWVQaWNrZXIqPihtX3BJZmFjZSktPkNvdW50U2VsUmFuZ2VzKCk7DQorfQ0KK2ludDMyX3QgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6R2V0U2VsUmFuZ2UoaW50MzJfdCBuSW5kZXgsIGludDMyX3QmIG5TdGFydCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfRGF0ZVRpbWVQaWNrZXIqPihtX3BJZmFjZSkNCisgICAgICAtPkdldFNlbFJhbmdlKG5JbmRleCwgblN0YXJ0KTsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VyOjpHZXRFZGl0VGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9EYXRlVGltZVBpY2tlcio+KG1fcElmYWNlKS0+R2V0RWRpdFRleHQod3NUZXh0KTsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VyOjpTZXRFZGl0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVGV4dCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfRGF0ZVRpbWVQaWNrZXIqPihtX3BJZmFjZSktPlNldEVkaXRUZXh0KHdzVGV4dCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6R2V0Q3VyU2VsKGludDMyX3QmIGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpRGF5KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9EYXRlVGltZVBpY2tlcio+KG1fcElmYWNlKQ0KKyAgICAgIC0+R2V0Q3VyU2VsKGlZZWFyLCBpTW9udGgsIGlEYXkpOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXI6OlNldEN1clNlbChpbnQzMl90IGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaURheSkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfRGF0ZVRpbWVQaWNrZXIqPihtX3BJZmFjZSkNCisgICAgICAtPlNldEN1clNlbChpWWVhciwgaU1vbnRoLCBpRGF5KTsNCit9DQorQ0ZXTF9EYXRlVGltZVBpY2tlcjo6Q0ZXTF9EYXRlVGltZVBpY2tlcigpIHt9DQorQ0ZXTF9EYXRlVGltZVBpY2tlcjo6fkNGV0xfRGF0ZVRpbWVQaWNrZXIoKSB7fQ0KK0NGV0xfRGF0ZVRpbWVQaWNrZXI6OkNGV0xfRGF0ZVRpbWVQaWNrZXJEUDo6Q0ZXTF9EYXRlVGltZVBpY2tlckRQKCkgew0KKyAgbV9pWWVhciA9IDIwMTE7DQorICBtX2lNb250aCA9IDE7DQorICBtX2lEYXkgPSAxOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXI6OkNGV0xfRGF0ZVRpbWVQaWNrZXJEUDo6R2V0Q2FwdGlvbigNCisgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgIENGWF9XaWRlU3RyaW5nJiB3c0NhcHRpb24pIHsNCisgIHdzQ2FwdGlvbiA9IG1fd3NEYXRhOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXI6OkNGV0xfRGF0ZVRpbWVQaWNrZXJEUDo6R2V0VG9kYXkoDQorICAgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICBpbnQzMl90JiBpWWVhciwNCisgICAgaW50MzJfdCYgaU1vbnRoLA0KKyAgICBpbnQzMl90JiBpRGF5KSB7DQorICBpWWVhciA9IG1faVllYXI7DQorICBpTW9udGggPSBtX2lNb250aDsNCisgIGlEYXkgPSBtX2lEYXk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6Q2FuVW5kbygpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0RhdGVUaW1lUGlja2VyKj4obV9wSWZhY2UpLT5DYW5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6Q2FuUmVkbygpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0RhdGVUaW1lUGlja2VyKj4obV9wSWZhY2UpLT5DYW5SZWRvKCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6VW5kbygpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0RhdGVUaW1lUGlja2VyKj4obV9wSWZhY2UpLT5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6UmVkbygpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0RhdGVUaW1lUGlja2VyKj4obV9wSWZhY2UpLT5SZWRvKCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6Q2FuQ29weSgpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0RhdGVUaW1lUGlja2VyKj4obV9wSWZhY2UpLT5DYW5Db3B5KCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6Q2FuQ3V0KCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfRGF0ZVRpbWVQaWNrZXIqPihtX3BJZmFjZSktPkNhbkN1dCgpOw0KK30NCitGWF9CT09MIENGV0xfRGF0ZVRpbWVQaWNrZXI6OkNhblNlbGVjdEFsbCgpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0RhdGVUaW1lUGlja2VyKj4obV9wSWZhY2UpLT5DYW5TZWxlY3RBbGwoKTsNCit9DQorRlhfQk9PTCBDRldMX0RhdGVUaW1lUGlja2VyOjpDb3B5KENGWF9XaWRlU3RyaW5nJiB3c0NvcHkpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0RhdGVUaW1lUGlja2VyKj4obV9wSWZhY2UpLT5Db3B5KHdzQ29weSk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6Q3V0KENGWF9XaWRlU3RyaW5nJiB3c0N1dCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfRGF0ZVRpbWVQaWNrZXIqPihtX3BJZmFjZSktPkNvcHkod3NDdXQpOw0KK30NCitGWF9CT09MIENGV0xfRGF0ZVRpbWVQaWNrZXI6OlBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1Bhc3RlKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9EYXRlVGltZVBpY2tlcio+KG1fcElmYWNlKS0+UGFzdGUod3NQYXN0ZSk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6U2VsZWN0QWxsKCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfRGF0ZVRpbWVQaWNrZXIqPihtX3BJZmFjZSktPlNlbGVjdEFsbCgpOw0KK30NCitGWF9CT09MIENGV0xfRGF0ZVRpbWVQaWNrZXI6OkRlbGV0ZSgpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0RhdGVUaW1lUGlja2VyKj4obV9wSWZhY2UpLT5EZWxldGUoKTsNCit9DQorRlhfQk9PTCBDRldMX0RhdGVUaW1lUGlja2VyOjpEZVNlbGVjdCgpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0RhdGVUaW1lUGlja2VyKj4obV9wSWZhY2UpLT5EZVNlbGVjdCgpOw0KK30NCitGV0xfRVJSIENGV0xfRGF0ZVRpbWVQaWNrZXI6OkdldEJCb3goQ0ZYX1JlY3RGJiByZWN0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9EYXRlVGltZVBpY2tlcio+KG1fcElmYWNlKS0+R2V0QkJveChyZWN0KTsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VyOjpTZXRFZGl0TGltaXQoaW50MzJfdCBuTGltaXQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0RhdGVUaW1lUGlja2VyKj4obV9wSWZhY2UpLT5TZXRFZGl0TGltaXQobkxpbWl0KTsNCit9DQorRldMX0VSUiBDRldMX0RhdGVUaW1lUGlja2VyOjpNb2RpZnlFZGl0U3R5bGVzRXgoRlhfRFdPUkQgZHdTdHlsZXNFeEFkZGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGVzRXhSZW1vdmVkKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9EYXRlVGltZVBpY2tlcio+KG1fcElmYWNlKQ0KKyAgICAgIC0+TW9kaWZ5RWRpdFN0eWxlc0V4KGR3U3R5bGVzRXhBZGRlZCwgZHdTdHlsZXNFeFJlbW92ZWQpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvZWRpdC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvZWRpdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUyODU5YQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9lZGl0LmNwcApAQCAtMCwwICsxLDIxMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSA8bWVtb3J5Pg0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorDQorQ0ZXTF9FZGl0KiBDRldMX0VkaXQ6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBuZXcgQ0ZXTF9FZGl0Ow0KK30NCitGV0xfRVJSIENGV0xfRWRpdDo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzKSB7DQorICBpZiAobV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBpZiAocFByb3BlcnRpZXMpIHsNCisgICAgKm1fcFByb3BlcnRpZXMgPSAqcFByb3BlcnRpZXM7DQorICB9DQorICBzdGQ6OnVuaXF1ZV9wdHI8SUZXTF9FZGl0PiBwRWRpdChJRldMX0VkaXQ6OkNyZWF0ZSgNCisgICAgICBtX3BQcm9wZXJ0aWVzLT5NYWtlV2lkZ2V0SW1wUHJvcGVydGllcyhudWxscHRyKSwgbnVsbHB0cikpOw0KKyAgRldMX0VSUiByZXQgPSBwRWRpdC0+SW5pdGlhbGl6ZSgpOw0KKyAgaWYgKHJldCAhPSBGV0xfRVJSX1N1Y2NlZWRlZCkgew0KKyAgICByZXR1cm4gcmV0Ow0KKyAgfQ0KKyAgbV9wSWZhY2UgPSBwRWRpdC5yZWxlYXNlKCk7DQorICBDRldMX1dpZGdldDo6SW5pdGlhbGl6ZSgpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdDo6U2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfRWRpdCo+KG1fcElmYWNlKS0+U2V0VGV4dCh3c1RleHQpOw0KK30NCitpbnQzMl90IENGV0xfRWRpdDo6R2V0VGV4dExlbmd0aCgpIGNvbnN0IHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfRWRpdCo+KG1fcElmYWNlKS0+R2V0VGV4dExlbmd0aCgpOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdDo6R2V0VGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50KSBjb25zdCB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfRWRpdCo+KG1fcElmYWNlKS0+R2V0VGV4dCh3c1RleHQsIG5TdGFydCwgbkNvdW50KTsNCit9DQorRldMX0VSUiBDRldMX0VkaXQ6OkNsZWFyVGV4dCgpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9FZGl0Kj4obV9wSWZhY2UpLT5DbGVhclRleHQoKTsNCit9DQoraW50MzJfdCBDRldMX0VkaXQ6OkdldENhcmV0UG9zKCkgY29uc3Qgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIC0xOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfRWRpdCo+KG1fcElmYWNlKS0+R2V0Q2FyZXRQb3MoKTsNCit9DQoraW50MzJfdCBDRldMX0VkaXQ6OlNldENhcmV0UG9zKGludDMyX3QgbkluZGV4LCBGWF9CT09MIGJCZWZvcmUpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiAtMTsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0VkaXQqPihtX3BJZmFjZSktPlNldENhcmV0UG9zKG5JbmRleCwgYkJlZm9yZSk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0OjpBZGRTZWxSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBzdGF0aWNfY2FzdDxJRldMX0VkaXQqPihtX3BJZmFjZSktPkFkZFNlbFJhbmdlKG5TdGFydCwgbkNvdW50KTsNCisgIGludDMyX3QgcG9zID0gMDsNCisgIGludDMyX3Qgc3VtID0gc3RhdGljX2Nhc3Q8SUZXTF9FZGl0Kj4obV9wSWZhY2UpLT5HZXRUZXh0TGVuZ3RoKCk7DQorICBpZiAobkNvdW50ID09IC0xKSB7DQorICAgIHBvcyA9IHN1bTsNCisgIH0gZWxzZSB7DQorICAgIHBvcyA9IG5TdGFydCArIG5Db3VudDsNCisgIH0NCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0VkaXQqPihtX3BJZmFjZSktPlNldENhcmV0UG9zKHBvcyk7DQorfQ0KK2ludDMyX3QgQ0ZXTF9FZGl0OjpDb3VudFNlbFJhbmdlcygpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfRWRpdCo+KG1fcElmYWNlKS0+Q291bnRTZWxSYW5nZXMoKTsNCit9DQoraW50MzJfdCBDRldMX0VkaXQ6OkdldFNlbFJhbmdlKGludDMyX3QgbkluZGV4LCBpbnQzMl90JiBuU3RhcnQpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfRWRpdCo+KG1fcElmYWNlKS0+R2V0U2VsUmFuZ2UobkluZGV4LCBuU3RhcnQpOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdDo6Q2xlYXJTZWxlY3Rpb25zKCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0VkaXQqPihtX3BJZmFjZSktPkNsZWFyU2VsZWN0aW9ucygpOw0KK30NCitpbnQzMl90IENGV0xfRWRpdDo6R2V0TGltaXQoKSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gLTE7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9FZGl0Kj4obV9wSWZhY2UpLT5HZXRMaW1pdCgpOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdDo6U2V0TGltaXQoaW50MzJfdCBuTGltaXQpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9FZGl0Kj4obV9wSWZhY2UpLT5TZXRMaW1pdChuTGltaXQpOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdDo6U2V0QWxpYXNDaGFyKEZYX1dDSEFSIHdBbGlhcykgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0VkaXQqPihtX3BJZmFjZSktPlNldEFsaWFzQ2hhcih3QWxpYXMpOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdDo6U2V0Rm9ybWF0U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0VkaXQqPihtX3BJZmFjZSktPlNldEZvcm1hdFN0cmluZyh3c0Zvcm1hdCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0OjpJbnNlcnQoaW50MzJfdCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuKSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfRWRpdCo+KG1fcElmYWNlKS0+SW5zZXJ0KG5TdGFydCwgbHBUZXh0LCBuTGVuKTsNCit9DQorRldMX0VSUiBDRldMX0VkaXQ6OkRlbGV0ZVNlbGVjdGlvbnMoKSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfRWRpdCo+KG1fcElmYWNlKS0+RGVsZXRlU2VsZWN0aW9ucygpOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdDo6RGVsZXRlUmFuZ2UoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50KSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfRWRpdCo+KG1fcElmYWNlKS0+RGVsZXRlUmFuZ2UoblN0YXJ0LCBuQ291bnQpOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdDo6UmVwbGFjZVNlbGVjdGlvbnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1JlcGxhY2UpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9FZGl0Kj4obV9wSWZhY2UpLT5SZXBsYWNlU2VsZWN0aW9ucyh3c1JlcGxhY2UpOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdDo6UmVwbGFjZShpbnQzMl90IG5TdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1JlcGxhY2UpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9FZGl0Kj4obV9wSWZhY2UpLT5SZXBsYWNlKG5TdGFydCwgbkxlbiwgd3NSZXBsYWNlKTsNCit9DQorRldMX0VSUiBDRldMX0VkaXQ6OkRvQ2xpcGJvYXJkKGludDMyX3QgaUNtZCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0VkaXQqPihtX3BJZmFjZSktPkRvQ2xpcGJvYXJkKGlDbWQpOw0KK30NCitGWF9CT09MIENGV0xfRWRpdDo6UmVkbyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVjb3JkKSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9FZGl0Kj4obV9wSWZhY2UpLT5SZWRvKGJzUmVjb3JkKTsNCit9DQorRlhfQk9PTCBDRldMX0VkaXQ6OlVuZG8oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlY29yZCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfRWRpdCo+KG1fcElmYWNlKS0+VW5kbyhic1JlY29yZCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0OjpTZXRUYWJXaWR0aChGWF9GTE9BVCBmVGFiV2lkdGgsIEZYX0JPT0wgYkVxdWlkaXN0YW50KSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfRWRpdCo+KG1fcElmYWNlKQ0KKyAgICAgIC0+U2V0VGFiV2lkdGgoZlRhYldpZHRoLCBiRXF1aWRpc3RhbnQpOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdDo6U2V0TnVtYmVyUmFuZ2UoaW50MzJfdCBpTWluLCBpbnQzMl90IGlNYXgpIHsNCisgIGlmIChpTWluID4gaU1heCkgew0KKyAgICByZXR1cm4gRldMX0VSUl9QYXJhbWV0ZXJfSW52YWxpZDsNCisgIH0NCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0VkaXQqPihtX3BJZmFjZSktPlNldE51bWJlclJhbmdlKGlNaW4sIGlNYXgpOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdDo6U2V0QmFja0NvbG9yKEZYX0RXT1JEIGR3Q29sb3IpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9FZGl0Kj4obV9wSWZhY2UpLT5TZXRCYWNrQ29sb3IoZHdDb2xvcik7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0OjpTZXRGb250KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0ZvbnQsIEZYX0ZMT0FUIGZTaXplKSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfRWRpdCo+KG1fcElmYWNlKS0+U2V0Rm9udCh3c0ZvbnQsIGZTaXplKTsNCit9DQorRlhfQk9PTCBDRldMX0VkaXQ6OkNhblVuZG8oKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9FZGl0Kj4obV9wSWZhY2UpLT5DYW5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0OjpDYW5SZWRvKCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfRWRpdCo+KG1fcElmYWNlKS0+Q2FuUmVkbygpOw0KK30NCitGWF9CT09MIENGV0xfRWRpdDo6VW5kbygpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0VkaXQqPihtX3BJZmFjZSktPlVuZG8oKTsNCit9DQorRlhfQk9PTCBDRldMX0VkaXQ6OlJlZG8oKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9FZGl0Kj4obV9wSWZhY2UpLT5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0OjpDb3B5KENGWF9XaWRlU3RyaW5nJiB3c0NvcHkpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0VkaXQqPihtX3BJZmFjZSktPkNvcHkod3NDb3B5KTsNCit9DQorRlhfQk9PTCBDRldMX0VkaXQ6OkN1dChDRlhfV2lkZVN0cmluZyYgd3NDdXQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0VkaXQqPihtX3BJZmFjZSktPkN1dCh3c0N1dCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0OjpQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXN0ZSkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfRWRpdCo+KG1fcElmYWNlKS0+UGFzdGUod3NQYXN0ZSk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0OjpEZWxldGUoKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9FZGl0Kj4obV9wSWZhY2UpLT5EZWxldGUoKTsNCit9DQordm9pZCBDRldMX0VkaXQ6OlNldFNjcm9sbE9mZnNldChGWF9GTE9BVCBmU2Nyb2xsT2Zmc2V0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9FZGl0Kj4obV9wSWZhY2UpLT5TZXRTY3JvbGxPZmZzZXQoZlNjcm9sbE9mZnNldCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9FZGl0OjpHZXRTdWdnZXN0V29yZHMoQ0ZYX1BvaW50RiBwb2ludGYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0FycmF5JiBzU3VnZ2VzdCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfRWRpdCo+KG1fcElmYWNlKS0+R2V0U3VnZ2VzdFdvcmRzKHBvaW50Ziwgc1N1Z2dlc3QpOw0KK30NCitGWF9CT09MIENGV0xfRWRpdDo6UmVwbGFjZVNwZWxsQ2hlY2tXb3JkKENGWF9Qb2ludEYgcG9pbnRmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1JlcGxhY2UpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0VkaXQqPihtX3BJZmFjZSkNCisgICAgICAtPlJlcGxhY2VTcGVsbENoZWNrV29yZChwb2ludGYsIGJzUmVwbGFjZSk7DQorfQ0KK0NGV0xfRWRpdDo6Q0ZXTF9FZGl0KCkge30NCitDRldMX0VkaXQ6On5DRldMX0VkaXQoKSB7fQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9saXN0Ym94LmNwcCBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9saXN0Ym94LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOThlMWZlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L2xpc3Rib3guY3BwCkBAIC0wLDAgKzEsMzEzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlIDxtZW1vcnk+DQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisNCitDRldMX0xpc3RCb3gqIENGV0xfTGlzdEJveDo6Q3JlYXRlKCkgew0KKyAgcmV0dXJuIG5ldyBDRldMX0xpc3RCb3g7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9MaXN0Qm94OjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyogcFByb3BlcnRpZXMpIHsNCisgIGlmIChtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIGlmIChwUHJvcGVydGllcykgew0KKyAgICAqbV9wUHJvcGVydGllcyA9ICpwUHJvcGVydGllczsNCisgIH0NCisgIHN0ZDo6dW5pcXVlX3B0cjxJRldMX0xpc3RCb3g+IHBMaXN0Qm94KElGV0xfTGlzdEJveDo6Q3JlYXRlKA0KKyAgICAgIG1fcFByb3BlcnRpZXMtPk1ha2VXaWRnZXRJbXBQcm9wZXJ0aWVzKCZtX0xpc3RCb3hEUCksIG51bGxwdHIpKTsNCisgIEZXTF9FUlIgcmV0ID0gcExpc3RCb3gtPkluaXRpYWxpemUoKTsNCisgIGlmIChyZXQgIT0gRldMX0VSUl9TdWNjZWVkZWQpIHsNCisgICAgcmV0dXJuIHJldDsNCisgIH0NCisgIG1fcElmYWNlID0gcExpc3RCb3gucmVsZWFzZSgpOw0KKyAgQ0ZXTF9XaWRnZXQ6OkluaXRpYWxpemUoKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3g6OkFkZERJQml0bWFwKENGWF9ESUJpdG1hcCogcERJQiwgRldMX0hMSVNUSVRFTSBoSXRlbSkgew0KKyAgcmVpbnRlcnByZXRfY2FzdDxDRldMX0xpc3RJdGVtKj4oaEl0ZW0pLT5tX3BESUIgPSBwRElCOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfSExJU1RJVEVNIENGV0xfTGlzdEJveDo6QWRkU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NBZGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZWxlY3QpIHsNCisgIENGV0xfTGlzdEl0ZW0qIHBJdGVtID0gbmV3IENGV0xfTGlzdEl0ZW07DQorICBwSXRlbS0+bV9kd1N0YXRlcyA9IDA7DQorICBwSXRlbS0+bV93c1RleHQgPSB3c0FkZDsNCisgIHBJdGVtLT5tX2R3U3RhdGVzID0gYlNlbGVjdCA/IEZXTF9JVEVNU1RBVEVfTFRCX1NlbGVjdGVkIDogMDsNCisgIG1fTGlzdEJveERQLm1fYXJySXRlbS5BZGQocEl0ZW0pOw0KKyAgcmV0dXJuIChGV0xfSExJU1RJVEVNKXBJdGVtOw0KK30NCitGWF9CT09MIENGV0xfTGlzdEJveDo6RGVsZXRlU3RyaW5nKEZXTF9ITElTVElURU0gaEl0ZW0pIHsNCisgIGludDMyX3QgbkluZGV4ID0gbV9MaXN0Qm94RFAuR2V0SXRlbUluZGV4KEdldFdpZGdldCgpLCBoSXRlbSk7DQorICBpZiAobkluZGV4IDwgMCB8fCBuSW5kZXggPj0gbV9MaXN0Qm94RFAubV9hcnJJdGVtLkdldFNpemUoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRldMX0xpc3RJdGVtKiBwRGVsSXRlbSA9DQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxDRldMX0xpc3RJdGVtKj4obV9MaXN0Qm94RFAuR2V0SXRlbShtX3BJZmFjZSwgbkluZGV4KSk7DQorICBpbnQzMl90IGlDb3VudCA9IG1fTGlzdEJveERQLkNvdW50SXRlbXMobV9wSWZhY2UpOw0KKyAgaW50MzJfdCBpU2VsID0gbkluZGV4ICsgMTsNCisgIGlmIChpU2VsID49IGlDb3VudCkgew0KKyAgICBpU2VsID0gbkluZGV4IC0gMTsNCisgICAgaWYgKGlTZWwgPCAwKSB7DQorICAgICAgaVNlbCA9IC0xOw0KKyAgICB9DQorICB9DQorICBpZiAoaVNlbCA+PSAwKSB7DQorICAgIENGV0xfTGlzdEl0ZW0qIHBTZWwgPQ0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxDRldMX0xpc3RJdGVtKj4obV9MaXN0Qm94RFAuR2V0SXRlbShtX3BJZmFjZSwgaVNlbCkpOw0KKyAgICBwU2VsLT5tX2R3U3RhdGVzIHw9IEZXTF9JVEVNU1RBVEVfTFRCX1NlbGVjdGVkOw0KKyAgfQ0KKyAgbV9MaXN0Qm94RFAubV9hcnJJdGVtLlJlbW92ZUF0KG5JbmRleCk7DQorICBkZWxldGUgcERlbEl0ZW07DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX0xpc3RCb3g6OkRlbGV0ZUFsbCgpIHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9MaXN0Qm94RFAuQ291bnRJdGVtcyhtX3BJZmFjZSk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBDRldMX0xpc3RJdGVtKiBwSXRlbSA9DQorICAgICAgICByZWludGVycHJldF9jYXN0PENGV0xfTGlzdEl0ZW0qPihtX0xpc3RCb3hEUC5HZXRJdGVtKG1fcElmYWNlLCBpKSk7DQorICAgIGRlbGV0ZSBwSXRlbTsNCisgIH0NCisgIG1fTGlzdEJveERQLm1fYXJySXRlbS5SZW1vdmVBbGwoKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitpbnQzMl90IENGV0xfTGlzdEJveDo6Q291bnRTZWxJdGVtcygpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfTGlzdEJveCo+KG1fcElmYWNlKS0+Q291bnRTZWxJdGVtcygpOw0KK30NCitGV0xfSExJU1RJVEVNIENGV0xfTGlzdEJveDo6R2V0U2VsSXRlbShpbnQzMl90IG5JbmRleFNlbCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIE5VTEw7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9MaXN0Qm94Kj4obV9wSWZhY2UpLT5HZXRTZWxJdGVtKG5JbmRleFNlbCk7DQorfQ0KK2ludDMyX3QgQ0ZXTF9MaXN0Qm94OjpHZXRTZWxJbmRleChpbnQzMl90IG5JbmRleCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIDA7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9MaXN0Qm94Kj4obV9wSWZhY2UpLT5HZXRTZWxJbmRleChuSW5kZXgpOw0KK30NCitGV0xfRVJSIENGV0xfTGlzdEJveDo6U2V0U2VsSXRlbShGV0xfSExJU1RJVEVNIGhJdGVtLCBGWF9CT09MIGJTZWxlY3QpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9MaXN0Qm94Kj4obV9wSWZhY2UpLT5TZXRTZWxJdGVtKGhJdGVtLCBiU2VsZWN0KTsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3g6OkdldEl0ZW1UZXh0KEZXTF9ITElTVElURU0gaEl0ZW0sIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9MaXN0Qm94Kj4obV9wSWZhY2UpLT5HZXRJdGVtVGV4dChoSXRlbSwgd3NUZXh0KTsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3g6OkdldFNjcm9sbFBvcyhGWF9GTE9BVCYgZlBvcywgRlhfQk9PTCBiVmVydCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0xpc3RCb3gqPihtX3BJZmFjZSktPkdldFNjcm9sbFBvcyhmUG9zLCBiVmVydCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9MaXN0Qm94OjpTZXRJdGVtSGVpZ2h0KEZYX0ZMT0FUIGZJdGVtSGVpZ2h0KSB7DQorICBtX0xpc3RCb3hEUC5tX2ZJdGVtSGVpZ2h0ID0gZkl0ZW1IZWlnaHQ7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9ITElTVElURU0gQ0ZXTF9MaXN0Qm94OjpHZXRGb2N1c0l0ZW0oKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX0xpc3RCb3hEUC5tX2Fyckl0ZW0uR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgQ0ZXTF9MaXN0SXRlbSogaEl0ZW0gPQ0KKyAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZXTF9MaXN0SXRlbSo+KG1fTGlzdEJveERQLm1fYXJySXRlbVtpXSk7DQorICAgIGlmIChoSXRlbS0+bV9kd1N0YXRlcyAmIEZXTF9JVEVNU1RBVEVfTFRCX0ZvY3VzZWQpIHsNCisgICAgICByZXR1cm4gKEZXTF9ITElTVElURU0paEl0ZW07DQorICAgIH0NCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitGV0xfRVJSIENGV0xfTGlzdEJveDo6U2V0Rm9jdXNJdGVtKEZXTF9ITElTVElURU0gaEl0ZW0pIHsNCisgIGludDMyX3QgbkluZGV4ID0gbV9MaXN0Qm94RFAuR2V0SXRlbUluZGV4KEdldFdpZGdldCgpLCBoSXRlbSk7DQorICBzdGF0aWNfY2FzdDxDRldMX0xpc3RJdGVtKj4obV9MaXN0Qm94RFAubV9hcnJJdGVtW25JbmRleF0pLT5tX2R3U3RhdGVzIHw9DQorICAgICAgRldMX0lURU1TVEFURV9MVEJfRm9jdXNlZDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiogQ0ZXTF9MaXN0Qm94OjpTb3J0KElGV0xfTGlzdEJveENvbXBhcmUqIHBDb20pIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX0xpc3RCb3gqPihtX3BJZmFjZSktPlNvcnQocENvbSk7DQorfQ0KK2ludDMyX3QgQ0ZXTF9MaXN0Qm94OjpDb3VudEl0ZW1zKCkgew0KKyAgcmV0dXJuIG1fTGlzdEJveERQLm1fYXJySXRlbS5HZXRTaXplKCk7DQorfQ0KK0ZXTF9ITElTVElURU0gQ0ZXTF9MaXN0Qm94OjpHZXRJdGVtKGludDMyX3QgbkluZGV4KSB7DQorICBpbnQzMl90IG5Db3VudCA9IG1fTGlzdEJveERQLm1fYXJySXRlbS5HZXRTaXplKCk7DQorICBpZiAobkluZGV4ID4gbkNvdW50IC0gMSAmJiBuSW5kZXggPCAwKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIChGV0xfSExJU1RJVEVNKW1fTGlzdEJveERQLm1fYXJySXRlbVtuSW5kZXhdOw0KK30NCitGV0xfRVJSIENGV0xfTGlzdEJveDo6U2V0SXRlbVN0cmluZyhGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NUZXh0KSB7DQorICBpZiAoIWhJdGVtKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgcmVpbnRlcnByZXRfY2FzdDxDRldMX0xpc3RJdGVtKj4oaEl0ZW0pLT5tX3dzVGV4dCA9IHdzVGV4dDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3g6OkdldEl0ZW1TdHJpbmcoRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7DQorICBpZiAoIWhJdGVtKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgd3NUZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDRldMX0xpc3RJdGVtKj4oaEl0ZW0pLT5tX3dzVGV4dDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3g6OlNldEl0ZW1EYXRhKEZXTF9ITElTVElURU0gaEl0ZW0sIHZvaWQqIHBEYXRhKSB7DQorICBpZiAoIWhJdGVtKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgcmVpbnRlcnByZXRfY2FzdDxDRldMX0xpc3RJdGVtKj4oaEl0ZW0pLT5tX3BEYXRhID0gcERhdGE7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK3ZvaWQqIENGV0xfTGlzdEJveDo6R2V0SXRlbURhdGEoRldMX0hMSVNUSVRFTSBoSXRlbSkgew0KKyAgaWYgKCFoSXRlbSkNCisgICAgcmV0dXJuIE5VTEw7DQorICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxDRldMX0xpc3RJdGVtKj4oaEl0ZW0pLT5tX3BEYXRhOw0KK30NCitGV0xfSExJU1RJVEVNIENGV0xfTGlzdEJveDo6R2V0SXRlbUF0UG9pbnQoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSB7DQorICBDRlhfUmVjdEYgcnRDbGllbnQ7DQorICBtX3BJZmFjZS0+R2V0Q2xpZW50UmVjdChydENsaWVudCk7DQorICBmeCAtPSBydENsaWVudC5sZWZ0Ow0KKyAgZnkgLT0gcnRDbGllbnQudG9wOw0KKyAgRlhfRkxPQVQgZlBvc1ggPSAwOw0KKyAgRlhfRkxPQVQgZlBvc1kgPSAwOw0KKyAgc3RhdGljX2Nhc3Q8SUZXTF9MaXN0Qm94Kj4obV9wSWZhY2UpLT5HZXRTY3JvbGxQb3MoZngpOw0KKyAgc3RhdGljX2Nhc3Q8SUZXTF9MaXN0Qm94Kj4obV9wSWZhY2UpLT5HZXRTY3JvbGxQb3MoZnksIEZBTFNFKTsNCisgIGludDMyX3QgbkNvdW50ID0gbV9MaXN0Qm94RFAuQ291bnRJdGVtcyhOVUxMKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgIEZXTF9ITElTVElURU0gaEl0ZW0gPSBtX0xpc3RCb3hEUC5HZXRJdGVtKE5VTEwsIGkpOw0KKyAgICBpZiAoIWhJdGVtKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgQ0ZYX1JlY3RGIHJ0SXRlbTsNCisgICAgbV9MaXN0Qm94RFAuR2V0SXRlbVJlY3QoTlVMTCwgaEl0ZW0sIHJ0SXRlbSk7DQorICAgIHJ0SXRlbS5PZmZzZXQoLWZQb3NYLCAtZlBvc1kpOw0KKyAgICBpZiAocnRJdGVtLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgICByZXR1cm4gaEl0ZW07DQorICAgIH0NCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitGWF9EV09SRCBDRldMX0xpc3RCb3g6OkdldEl0ZW1TdGF0ZXMoRldMX0hMSVNUSVRFTSBoSXRlbSkgew0KKyAgaWYgKCFoSXRlbSkNCisgICAgcmV0dXJuIDA7DQorICBDRldMX0xpc3RJdGVtKiBwSXRlbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZXTF9MaXN0SXRlbSo+KGhJdGVtKTsNCisgIHJldHVybiBwSXRlbS0+bV9kd1N0YXRlcyB8IHBJdGVtLT5tX2R3Q2hlY2tTdGF0ZTsNCit9DQorQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3goKSB7fQ0KK0NGV0xfTGlzdEJveDo6fkNGV0xfTGlzdEJveCgpIHt9DQorQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6Q0ZXTF9MaXN0Qm94RFAoKSB7fQ0KK0NGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94RFA6On5DRldMX0xpc3RCb3hEUCgpIHsNCisgIGludDMyX3QgbkNvdW50ID0gbV9hcnJJdGVtLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgIGRlbGV0ZSBzdGF0aWNfY2FzdDxDRldMX0xpc3RJdGVtKj4obV9hcnJJdGVtW2ldKTsNCisgIH0NCisgIG1fYXJySXRlbS5SZW1vdmVBbGwoKTsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpHZXRDYXB0aW9uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NDYXB0aW9uKSB7DQorICB3c0NhcHRpb24gPSBtX3dzRGF0YTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQoraW50MzJfdCBDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpDb3VudEl0ZW1zKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gbV9hcnJJdGVtLkdldFNpemUoKTsNCit9DQorRldMX0hMSVNUSVRFTSBDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpHZXRJdGVtKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCkgew0KKyAgaWYgKG5JbmRleCA+PSBtX2Fyckl0ZW0uR2V0U2l6ZSgpIHx8IG5JbmRleCA8IDApIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9IGVsc2Ugew0KKyAgICByZXR1cm4gKEZXTF9ITElTVElURU0pbV9hcnJJdGVtW25JbmRleF07DQorICB9DQorfQ0KK2ludDMyX3QgQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6R2V0SXRlbUluZGV4KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0pIHsNCisgIHJldHVybiBtX2Fyckl0ZW0uRmluZChoSXRlbSk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6U2V0SXRlbUluZGV4KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgpIHsNCisgIHJldHVybiBtX2Fyckl0ZW0uU2V0QXQobkluZGV4LCBoSXRlbSk7DQorfQ0KK0ZYX0RXT1JEIENGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94RFA6OkdldEl0ZW1TdHlsZXMoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtKSB7DQorICBpZiAoIWhJdGVtKQ0KKyAgICByZXR1cm4gLTE7DQorICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxDRldMX0xpc3RJdGVtKj4oaEl0ZW0pLT5tX2R3U3RhdGVzOw0KK30NCitGV0xfRVJSIENGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94RFA6OkdldEl0ZW1UZXh0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIGlmICghaEl0ZW0pDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICB3c1RleHQgPSByZWludGVycHJldF9jYXN0PENGV0xfTGlzdEl0ZW0qPihoSXRlbSktPm1fd3NUZXh0Ow0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94RFA6OkdldEl0ZW1SZWN0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRJdGVtKSB7DQorICBpZiAoIWhJdGVtKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgQ0ZXTF9MaXN0SXRlbSogcEl0ZW0gPSByZWludGVycHJldF9jYXN0PENGV0xfTGlzdEl0ZW0qPihoSXRlbSk7DQorICBydEl0ZW0gPSBwSXRlbS0+bV9ydEl0ZW07DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK3ZvaWQqIENGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94RFA6OkdldEl0ZW1EYXRhKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0pIHsNCisgIGlmICghaEl0ZW0pDQorICAgIHJldHVybiBOVUxMOw0KKyAgQ0ZXTF9MaXN0SXRlbSogcEl0ZW0gPSByZWludGVycHJldF9jYXN0PENGV0xfTGlzdEl0ZW0qPihoSXRlbSk7DQorICByZXR1cm4gcEl0ZW0tPm1fcERhdGE7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6U2V0SXRlbVN0eWxlcyhJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdHlsZSkgew0KKyAgaWYgKCFoSXRlbSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZXTF9MaXN0SXRlbSo+KGhJdGVtKS0+bV9kd1N0YXRlcyA9IGR3U3R5bGU7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6U2V0SXRlbVRleHQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzelRleHQpIHsNCisgIGlmICghaEl0ZW0pDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZWludGVycHJldF9jYXN0PENGV0xfTGlzdEl0ZW0qPihoSXRlbSktPm1fd3NUZXh0ID0gcHN6VGV4dDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX0xpc3RCb3g6OkNGV0xfTGlzdEJveERQOjpTZXRJdGVtUmVjdChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0SXRlbSkgew0KKyAgaWYgKCFoSXRlbSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZXTF9MaXN0SXRlbSo+KGhJdGVtKS0+bV9ydEl0ZW0gPSBydEl0ZW07DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0ZMT0FUIENGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94RFA6OkdldEl0ZW1IZWlnaHQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBtX2ZJdGVtSGVpZ2h0Ow0KK30NCitDRlhfRElCaXRtYXAqIENGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94RFA6OkdldEl0ZW1JY29uKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSkgew0KKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZXTF9MaXN0SXRlbSo+KGhJdGVtKS0+bV9wRElCOw0KK30NCitGV0xfRVJSIENGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94RFA6OkdldEl0ZW1DaGVja1JlY3QoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9ITElTVElURU0gaEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRDaGVjaykgew0KKyAgcnRDaGVjayA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZXTF9MaXN0SXRlbSo+KGhJdGVtKS0+bV9ydENoZWNrQm94Ow0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfTGlzdEJveDo6Q0ZXTF9MaXN0Qm94RFA6OlNldEl0ZW1DaGVja1JlY3QoDQorICAgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICBjb25zdCBDRlhfUmVjdEYmIHJ0Q2hlY2spIHsNCisgIHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZXTF9MaXN0SXRlbSo+KGhJdGVtKS0+bV9ydENoZWNrQm94ID0gcnRDaGVjazsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6R2V0SXRlbUNoZWNrU3RhdGUoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX0hMSVNUSVRFTSBoSXRlbSkgew0KKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZXTF9MaXN0SXRlbSo+KGhJdGVtKS0+bV9kd0NoZWNrU3RhdGU7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9MaXN0Qm94OjpDRldMX0xpc3RCb3hEUDo6U2V0SXRlbUNoZWNrU3RhdGUoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfSExJU1RJVEVNIGhJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDaGVja1N0YXRlKSB7DQorICByZWludGVycHJldF9jYXN0PENGV0xfTGlzdEl0ZW0qPihoSXRlbSktPm1fZHdDaGVja1N0YXRlID0gZHdDaGVja1N0YXRlOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvcGljdHVyZWJveC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvcGljdHVyZWJveC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA1MGI4MAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9waWN0dXJlYm94LmNwcApAQCAtMCwwICsxLDExOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSA8bWVtb3J5Pg0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorDQorQ0ZXTF9QaWN0dXJlQm94KiBDRldMX1BpY3R1cmVCb3g6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBuZXcgQ0ZXTF9QaWN0dXJlQm94Ow0KK30NCitGV0xfRVJSIENGV0xfUGljdHVyZUJveDo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzKSB7DQorICBpZiAobV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBpZiAocFByb3BlcnRpZXMpIHsNCisgICAgKm1fcFByb3BlcnRpZXMgPSAqcFByb3BlcnRpZXM7DQorICB9DQorICBzdGQ6OnVuaXF1ZV9wdHI8SUZXTF9QaWN0dXJlQm94PiBwUGljdHVyZUJveChJRldMX1BpY3R1cmVCb3g6OkNyZWF0ZSgNCisgICAgICBtX3BQcm9wZXJ0aWVzLT5NYWtlV2lkZ2V0SW1wUHJvcGVydGllcygmbV9QaWN0dXJlQm94RFApLCBudWxscHRyKSk7DQorICBGV0xfRVJSIHJldCA9IHBQaWN0dXJlQm94LT5Jbml0aWFsaXplKCk7DQorICBpZiAocmV0ICE9IEZXTF9FUlJfU3VjY2VlZGVkKSB7DQorICAgIHJldHVybiByZXQ7DQorICB9DQorICBtX3BJZmFjZSA9IHBQaWN0dXJlQm94LnJlbGVhc2UoKTsNCisgIENGV0xfV2lkZ2V0OjpJbml0aWFsaXplKCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0NGWF9ESUJpdG1hcCogQ0ZXTF9QaWN0dXJlQm94OjpHZXRQaWN0dXJlKCkgew0KKyAgcmV0dXJuIG1fUGljdHVyZUJveERQLm1fcEJpdG1hcDsNCit9DQorRldMX0VSUiBDRldMX1BpY3R1cmVCb3g6OlNldFBpY3R1cmUoQ0ZYX0RJQml0bWFwKiBwQml0bWFwKSB7DQorICBtX1BpY3R1cmVCb3hEUC5tX3BCaXRtYXAgPSBwQml0bWFwOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9GTE9BVCBDRldMX1BpY3R1cmVCb3g6OkdldFJvdGF0aW9uKCkgew0KKyAgcmV0dXJuIG1fUGljdHVyZUJveERQLm1fZlJvdGF0aW9uOw0KK30NCitGV0xfRVJSIENGV0xfUGljdHVyZUJveDo6U2V0Um90YXRpb24oRlhfRkxPQVQgZlJvdGF0aW9uKSB7DQorICBtX1BpY3R1cmVCb3hEUC5tX2ZSb3RhdGlvbiA9IGZSb3RhdGlvbjsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQoraW50MzJfdCBDRldMX1BpY3R1cmVCb3g6OkdldEZsaXBNb2RlKCkgew0KKyAgcmV0dXJuIG1fUGljdHVyZUJveERQLkdldEZsaXBNb2RlKG1fcElmYWNlKTsNCit9DQorRldMX0VSUiBDRldMX1BpY3R1cmVCb3g6OlNldEZsaXBNb2RlKGludDMyX3QgaUZsaXBNb2RlKSB7DQorICBtX1BpY3R1cmVCb3hEUC5tX2lGbGlwTW9kZSA9IGlGbGlwTW9kZTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQoraW50MzJfdCBDRldMX1BpY3R1cmVCb3g6OkdldE9wYWNpdHkoKSB7DQorICByZXR1cm4gbV9QaWN0dXJlQm94RFAuR2V0T3BhY2l0eShtX3BJZmFjZSk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9QaWN0dXJlQm94OjpTZXRPcGFjaXR5KGludDMyX3QgaU9wYWNpdHkpIHsNCisgIG1fUGljdHVyZUJveERQLm1faU9wYWNpdHkgPSBpT3BhY2l0eTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1BpY3R1cmVCb3g6OkdldFNjYWxlKEZYX0ZMT0FUJiBmU2NhbGVYLCBGWF9GTE9BVCYgZlNjYWxlWSkgew0KKyAgQ0ZYX01hdHJpeCBtYXRyaXg7DQorICBtX1BpY3R1cmVCb3hEUC5HZXRNYXRyaXgobV9wSWZhY2UsIG1hdHJpeCk7DQorICBtYXRyaXguU2NhbGUoZlNjYWxlWCwgZlNjYWxlWSk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9QaWN0dXJlQm94OjpTZXRTY2FsZShGWF9GTE9BVCBmU2NhbGVYLCBGWF9GTE9BVCBmU2NhbGVZKSB7DQorICBtX1BpY3R1cmVCb3hEUC5tX2ZTY2FsZVggPSBmU2NhbGVYOw0KKyAgbV9QaWN0dXJlQm94RFAubV9mU2NhbGVZID0gZlNjYWxlWTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1BpY3R1cmVCb3g6OkdldE9mZnNldChGWF9GTE9BVCYgZngsIEZYX0ZMT0FUJiBmeSkgew0KKyAgQ0ZYX01hdHJpeCBtYXRyaXg7DQorICBtX1BpY3R1cmVCb3hEUC5HZXRNYXRyaXgobV9wSWZhY2UsIG1hdHJpeCk7DQorICBmeCA9IG1hdHJpeC5lOw0KKyAgZnkgPSBtYXRyaXguZjsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1BpY3R1cmVCb3g6OlNldE9mZnNldChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIG1fUGljdHVyZUJveERQLm1fZk9mZlNldFggPSBmeDsNCisgIG1fUGljdHVyZUJveERQLm1fZk9mZlNldFkgPSBmeTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorQ0ZXTF9QaWN0dXJlQm94OjpDRldMX1BpY3R1cmVCb3goKSB7fQ0KK0NGV0xfUGljdHVyZUJveDo6fkNGV0xfUGljdHVyZUJveCgpIHt9DQorRldMX0VSUiBDRldMX1BpY3R1cmVCb3g6OkNGV0xfUGljdHVyZUJveERQOjpHZXRDYXB0aW9uKA0KKyAgICBJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQ2FwdGlvbikgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitDRlhfRElCaXRtYXAqIENGV0xfUGljdHVyZUJveDo6Q0ZXTF9QaWN0dXJlQm94RFA6OkdldFBpY3R1cmUoDQorICAgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gbV9wQml0bWFwOw0KK30NCitDRlhfRElCaXRtYXAqIENGV0xfUGljdHVyZUJveDo6Q0ZXTF9QaWN0dXJlQm94RFA6OkdldEVycm9yUGljdHVyZSgNCisgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBtX3BCaXRtYXA7DQorfQ0KK0NGWF9ESUJpdG1hcCogQ0ZXTF9QaWN0dXJlQm94OjpDRldMX1BpY3R1cmVCb3hEUDo6R2V0SW5pdGlhbFBpY3R1cmUoDQorICAgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gbV9wQml0bWFwOw0KK30NCitpbnQzMl90IENGV0xfUGljdHVyZUJveDo6Q0ZXTF9QaWN0dXJlQm94RFA6OkdldE9wYWNpdHkoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBtX2lPcGFjaXR5Ow0KK30NCitGV0xfRVJSIENGV0xfUGljdHVyZUJveDo6Q0ZXTF9QaWN0dXJlQm94RFA6OkdldE1hdHJpeChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4JiBtYXRyaXgpIHsNCisgIENGWF9SZWN0RiByZWN0Ow0KKyAgcFdpZGdldC0+R2V0Q2xpZW50UmVjdChyZWN0KTsNCisgIEZYX0ZMT0FUIGZMZW4gPSByZWN0LndpZHRoIC8gMjsNCisgIEZYX0ZMT0FUIGZXaWQgPSByZWN0LmhlaWdodCAvIDI7DQorICBtYXRyaXguU2V0SWRlbnRpdHkoKTsNCisgIG1hdHJpeC5UcmFuc2xhdGUoLWZMZW4sIC1mV2lkKTsNCisgIG1hdHJpeC5Sb3RhdGUobV9mUm90YXRpb24pOw0KKyAgbWF0cml4LlRyYW5zbGF0ZShmTGVuLCBmV2lkKTsNCisgIG1hdHJpeC5TY2FsZShtX2ZTY2FsZVgsIG1fZlNjYWxlWSk7DQorICBtYXRyaXguVHJhbnNsYXRlKG1fZk9mZlNldFgsIG1fZk9mZlNldFkpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitpbnQzMl90IENGV0xfUGljdHVyZUJveDo6Q0ZXTF9QaWN0dXJlQm94RFA6OkdldEZsaXBNb2RlKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gbV9pRmxpcE1vZGU7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9wdXNoYnV0dG9uLmNwcCBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC9wdXNoYnV0dG9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmVhZjFjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3B1c2hidXR0b24uY3BwCkBAIC0wLDAgKzEsNTYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgPG1lbW9yeT4NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKw0KK0NGV0xfUHVzaEJ1dHRvbiogQ0ZXTF9QdXNoQnV0dG9uOjpDcmVhdGUoKSB7DQorICByZXR1cm4gbmV3IENGV0xfUHVzaEJ1dHRvbjsNCit9DQorRldMX0VSUiBDRldMX1B1c2hCdXR0b246OkluaXRpYWxpemUoY29uc3QgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzKiBwUHJvcGVydGllcykgew0KKyAgaWYgKG1fcElmYWNlKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgaWYgKHBQcm9wZXJ0aWVzKSB7DQorICAgICptX3BQcm9wZXJ0aWVzID0gKnBQcm9wZXJ0aWVzOw0KKyAgfQ0KKyAgc3RkOjp1bmlxdWVfcHRyPElGV0xfUHVzaEJ1dHRvbj4gcFB1c2hCdXR0b24oSUZXTF9QdXNoQnV0dG9uOjpDcmVhdGUoDQorICAgICAgbV9wUHJvcGVydGllcy0+TWFrZVdpZGdldEltcFByb3BlcnRpZXMoJm1fYnV0dG9uRGF0YSksIG51bGxwdHIpKTsNCisgIEZXTF9FUlIgcmV0ID0gcFB1c2hCdXR0b24tPkluaXRpYWxpemUoKTsNCisgIGlmIChyZXQgIT0gRldMX0VSUl9TdWNjZWVkZWQpIHsNCisgICAgcmV0dXJuIHJldDsNCisgIH0NCisgIG1fcElmYWNlID0gcFB1c2hCdXR0b24ucmVsZWFzZSgpOw0KKyAgQ0ZXTF9XaWRnZXQ6OkluaXRpYWxpemUoKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1B1c2hCdXR0b246OkdldENhcHRpb24oQ0ZYX1dpZGVTdHJpbmcmIHdzQ2FwdGlvbikgew0KKyAgd3NDYXB0aW9uID0gbV9idXR0b25EYXRhLm1fd3NDYXB0aW9uOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfUHVzaEJ1dHRvbjo6U2V0Q2FwdGlvbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2FwdGlvbikgew0KKyAgbV9idXR0b25EYXRhLm1fd3NDYXB0aW9uID0gd3NDYXB0aW9uOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitDRlhfRElCaXRtYXAqIENGV0xfUHVzaEJ1dHRvbjo6R2V0UGljdHVyZSgpIHsNCisgIHJldHVybiBtX2J1dHRvbkRhdGEubV9wQml0bWFwOw0KK30NCitGV0xfRVJSIENGV0xfUHVzaEJ1dHRvbjo6U2V0UGljdHVyZShDRlhfRElCaXRtYXAqIHBCaXRtYXApIHsNCisgIG1fYnV0dG9uRGF0YS5tX3BCaXRtYXAgPSBwQml0bWFwOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitDRldMX1B1c2hCdXR0b246OkNGV0xfUHVzaEJ1dHRvbigpIHt9DQorQ0ZXTF9QdXNoQnV0dG9uOjp+Q0ZXTF9QdXNoQnV0dG9uKCkge30NCitGV0xfRVJSIENGV0xfUHVzaEJ1dHRvbjo6Q0ZXTF9QdXNoQnV0dG9uRFA6OkdldENhcHRpb24oDQorICAgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICBDRlhfV2lkZVN0cmluZyYgd3NDYXB0aW9uKSB7DQorICB3c0NhcHRpb24gPSBtX3dzQ2FwdGlvbjsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorQ0ZYX0RJQml0bWFwKiBDRldMX1B1c2hCdXR0b246OkNGV0xfUHVzaEJ1dHRvbkRQOjpHZXRQaWN0dXJlKA0KKyAgICBJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIG1fcEJpdG1hcDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3Njcm9sbGJhci5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvc2Nyb2xsYmFyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDk5ZTEwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3Njcm9sbGJhci5jcHAKQEAgLTAsMCArMSw5MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSA8bWVtb3J5Pg0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorDQorQ0ZXTF9TY3JvbGxCYXIqIENGV0xfU2Nyb2xsQmFyOjpDcmVhdGUoKSB7DQorICByZXR1cm4gbmV3IENGV0xfU2Nyb2xsQmFyOw0KK30NCitGV0xfRVJSIENGV0xfU2Nyb2xsQmFyOjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyogcFByb3BlcnRpZXMpIHsNCisgIGlmIChtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIGlmIChwUHJvcGVydGllcykgew0KKyAgICAqbV9wUHJvcGVydGllcyA9ICpwUHJvcGVydGllczsNCisgIH0NCisgIHN0ZDo6dW5pcXVlX3B0cjxJRldMX1Njcm9sbEJhcj4gcFNjcm9sbEJhcihJRldMX1Njcm9sbEJhcjo6Q3JlYXRlKA0KKyAgICAgIG1fcFByb3BlcnRpZXMtPk1ha2VXaWRnZXRJbXBQcm9wZXJ0aWVzKG51bGxwdHIpLCBudWxscHRyKSk7DQorICBGV0xfRVJSIHJldCA9IHBTY3JvbGxCYXItPkluaXRpYWxpemUoKTsNCisgIGlmIChyZXQgIT0gRldMX0VSUl9TdWNjZWVkZWQpIHsNCisgICAgcmV0dXJuIHJldDsNCisgIH0NCisgIG1fcElmYWNlID0gcFNjcm9sbEJhci5yZWxlYXNlKCk7DQorICBDRldMX1dpZGdldDo6SW5pdGlhbGl6ZSgpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9CT09MIENGV0xfU2Nyb2xsQmFyOjpJc1ZlcnRpY2FsKCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfU2Nyb2xsQmFyKj4obV9wSWZhY2UpLT5Jc1ZlcnRpY2FsKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TY3JvbGxCYXI6OkdldFJhbmdlKEZYX0ZMT0FUJiBmTWluLCBGWF9GTE9BVCYgZk1heCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX1Njcm9sbEJhcio+KG1fcElmYWNlKS0+R2V0UmFuZ2UoZk1pbiwgZk1heCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9TY3JvbGxCYXI6OlNldFJhbmdlKEZYX0ZMT0FUIGZNaW4sIEZYX0ZMT0FUIGZNYXgpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9TY3JvbGxCYXIqPihtX3BJZmFjZSktPlNldFJhbmdlKGZNaW4sIGZNYXgpOw0KK30NCitGWF9GTE9BVCBDRldMX1Njcm9sbEJhcjo6R2V0UGFnZVNpemUoKSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX1Njcm9sbEJhcio+KG1fcElmYWNlKS0+R2V0UGFnZVNpemUoKTsNCit9DQorRldMX0VSUiBDRldMX1Njcm9sbEJhcjo6U2V0UGFnZVNpemUoRlhfRkxPQVQgZlBhZ2VTaXplKSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfU2Nyb2xsQmFyKj4obV9wSWZhY2UpLT5TZXRQYWdlU2l6ZShmUGFnZVNpemUpOw0KK30NCitGWF9GTE9BVCBDRldMX1Njcm9sbEJhcjo6R2V0U3RlcFNpemUoKSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxJRldMX1Njcm9sbEJhcio+KG1fcElmYWNlKS0+R2V0U3RlcFNpemUoKTsNCit9DQorRldMX0VSUiBDRldMX1Njcm9sbEJhcjo6U2V0U3RlcFNpemUoRlhfRkxPQVQgZlN0ZXBTaXplKSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfU2Nyb2xsQmFyKj4obV9wSWZhY2UpLT5TZXRTdGVwU2l6ZShmU3RlcFNpemUpOw0KK30NCitGWF9GTE9BVCBDRldMX1Njcm9sbEJhcjo6R2V0UG9zKCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIC0xOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfU2Nyb2xsQmFyKj4obV9wSWZhY2UpLT5HZXRQb3MoKTsNCit9DQorRldMX0VSUiBDRldMX1Njcm9sbEJhcjo6U2V0UG9zKEZYX0ZMT0FUIGZQb3MpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9TY3JvbGxCYXIqPihtX3BJZmFjZSktPlNldFBvcyhmUG9zKTsNCit9DQorRlhfRkxPQVQgQ0ZXTF9TY3JvbGxCYXI6OkdldFRyYWNrUG9zKCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIC0xOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfU2Nyb2xsQmFyKj4obV9wSWZhY2UpLT5HZXRUcmFja1BvcygpOw0KK30NCitGV0xfRVJSIENGV0xfU2Nyb2xsQmFyOjpTZXRUcmFja1BvcyhGWF9GTE9BVCBmVHJhY2tQb3MpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9TY3JvbGxCYXIqPihtX3BJZmFjZSktPlNldFRyYWNrUG9zKGZUcmFja1Bvcyk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9TY3JvbGxCYXI6OkRvU2Nyb2xsKEZYX0RXT1JEIGR3Q29kZSwgRlhfRkxPQVQgZlBvcykgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfU2Nyb2xsQmFyKj4obV9wSWZhY2UpLT5Eb1Njcm9sbChkd0NvZGUsIGZQb3MpOw0KK30NCitDRldMX1Njcm9sbEJhcjo6Q0ZXTF9TY3JvbGxCYXIoKSB7fQ0KK0NGV0xfU2Nyb2xsQmFyOjp+Q0ZXTF9TY3JvbGxCYXIoKSB7fQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC90aGVtZS5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvdGhlbWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlOGJmYjUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvdGhlbWUuY3BwCkBAIC0wLDAgKzEsMTQwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorRlhfQk9PTCBDRldMX1RoZW1lOjpJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gISFHZXRUaGVtZShwV2lkZ2V0KTsNCit9DQorRlhfRFdPUkQgQ0ZXTF9UaGVtZTo6R2V0VGhlbWVJRChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIEdldFRoZW1lKHBXaWRnZXQpLT5HZXRUaGVtZUlEKHBXaWRnZXQpOw0KK30NCitGWF9EV09SRCBDRldMX1RoZW1lOjpTZXRUaGVtZUlEKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdUaGVtZUlELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hpbGRyZW4pIHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9hcnJUaGVtZXMuR2V0U2l6ZSgpOw0KKyAgRlhfRFdPUkQgZHdJRDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIENGV0xfV2lkZ2V0VFAqIHBUaGVtZSA9IHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0VFAqPihtX2FyclRoZW1lc1tpXSk7DQorICAgIGR3SUQgPSBwVGhlbWUtPkdldFRoZW1lSUQocFdpZGdldCk7DQorICAgIHBUaGVtZS0+U2V0VGhlbWVJRChwV2lkZ2V0LCBkd1RoZW1lSUQsIEZBTFNFKTsNCisgIH0NCisgIHJldHVybiBkd0lEOw0KK30NCitGV0xfRVJSIENGV0xfVGhlbWU6OkdldFRoZW1lTWF0cml4KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBDRlhfTWF0cml4JiBtYXRyaXgpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1RoZW1lOjpTZXRUaGVtZU1hdHJpeChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9CT09MIENGV0xfVGhlbWU6OkRyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKSB7DQorICBDRldMX1dpZGdldFRQKiBwVGhlbWUgPSBHZXRUaGVtZShwUGFyYW1zLT5tX3BXaWRnZXQpOw0KKyAgRlhTWVNfYXNzZXJ0KHBUaGVtZSk7DQorICByZXR1cm4gcFRoZW1lLT5EcmF3QmFja2dyb3VuZChwUGFyYW1zKTsNCit9DQorRlhfQk9PTCBDRldMX1RoZW1lOjpEcmF3VGV4dChDRldMX1RoZW1lVGV4dCogcFBhcmFtcykgew0KKyAgQ0ZXTF9XaWRnZXRUUCogcFRoZW1lID0gR2V0VGhlbWUocFBhcmFtcy0+bV9wV2lkZ2V0KTsNCisgIEZYU1lTX2Fzc2VydChwVGhlbWUpOw0KKyAgcmV0dXJuIHBUaGVtZS0+RHJhd1RleHQocFBhcmFtcyk7DQorfQ0KK3ZvaWQqIENGV0xfVGhlbWU6OkdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LCBGWF9EV09SRCBkd0NhcGFjaXR5KSB7DQorICBDRldMX1dpZGdldFRQKiBwVGhlbWUgPSBHZXRUaGVtZShwVGhlbWVQYXJ0LT5tX3BXaWRnZXQpOw0KKyAgRlhTWVNfYXNzZXJ0KHBUaGVtZSk7DQorICByZXR1cm4gcFRoZW1lLT5HZXRDYXBhY2l0eShwVGhlbWVQYXJ0LCBkd0NhcGFjaXR5KTsNCit9DQorRlhfQk9PTCBDRldMX1RoZW1lOjpJc0N1c3RvbWl6ZWRMYXlvdXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIENGV0xfV2lkZ2V0VFAqIHBUaGVtZSA9IEdldFRoZW1lKHBXaWRnZXQpOw0KKyAgRlhTWVNfYXNzZXJ0KHBUaGVtZSk7DQorICByZXR1cm4gcFRoZW1lLT5Jc0N1c3RvbWl6ZWRMYXlvdXQocFdpZGdldCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9UaGVtZTo6R2V0UGFydFJlY3QoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQsIENGWF9SZWN0RiYgcnRQYXJ0KSB7DQorICBDRldMX1dpZGdldFRQKiBwVGhlbWUgPSBHZXRUaGVtZShwVGhlbWVQYXJ0LT5tX3BXaWRnZXQpOw0KKyAgRlhTWVNfYXNzZXJ0KHBUaGVtZSk7DQorICByZXR1cm4gcFRoZW1lLT5HZXRQYXJ0UmVjdChwVGhlbWVQYXJ0LCBydFBhcnQpOw0KK30NCitGWF9CT09MIENGV0xfVGhlbWU6OklzSW5QYXJ0KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgQ0ZXTF9XaWRnZXRUUCogcFRoZW1lID0gR2V0VGhlbWUocFRoZW1lUGFydC0+bV9wV2lkZ2V0KTsNCisgIEZYU1lTX2Fzc2VydChwVGhlbWUpOw0KKyAgcmV0dXJuIHBUaGVtZS0+SXNJblBhcnQocFRoZW1lUGFydCwgZngsIGZ5KTsNCit9DQorRlhfQk9PTCBDRldMX1RoZW1lOjpDYWxjVGV4dFJlY3QoQ0ZXTF9UaGVtZVRleHQqIHBQYXJhbXMsIENGWF9SZWN0RiYgcmVjdCkgew0KKyAgQ0ZXTF9XaWRnZXRUUCogcFRoZW1lID0gR2V0VGhlbWUocFBhcmFtcy0+bV9wV2lkZ2V0KTsNCisgIEZYU1lTX2Fzc2VydChwVGhlbWUpOw0KKyAgcmV0dXJuIHBUaGVtZS0+Q2FsY1RleHRSZWN0KHBQYXJhbXMsIHJlY3QpOw0KK30NCitGV0xfRVJSIENGV0xfVGhlbWU6OkluaXRpYWxpemUoKSB7DQorICBpbnQzMl90IGlDb3VudCA9IG1fYXJyVGhlbWVzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIENGV0xfV2lkZ2V0VFAqIHBUaGVtZSA9IHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0VFAqPihtX2FyclRoZW1lc1tpXSk7DQorICAgIHBUaGVtZS0+SW5pdGlhbGl6ZSgpOw0KKyAgfQ0KKyAgRldMVEhFTUVfSW5pdCgpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfVGhlbWU6OkZpbmFsaXplKCkgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX2FyclRoZW1lcy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBDRldMX1dpZGdldFRQKiBwVGhlbWUgPSBzdGF0aWNfY2FzdDxDRldMX1dpZGdldFRQKj4obV9hcnJUaGVtZXNbaV0pOw0KKyAgICBwVGhlbWUtPkZpbmFsaXplKCk7DQorICB9DQorICBGV0xUSEVNRV9SZWxlYXNlKCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0NGV0xfVGhlbWU6OkNGV0xfVGhlbWUoKSB7DQorICBDRldMX0Zvcm1UUCogcEZvcm1UUCA9IG5ldyBDRldMX0Zvcm1UUDsNCisgIENGV0xfUHVzaEJ1dHRvblRQKiBwUHVzaEJ1dHRvblRQID0gbmV3IENGV0xfUHVzaEJ1dHRvblRQOw0KKyAgQ0ZXTF9DaGVja0JveFRQKiBwQ2hlY2tCb3hUUCA9IG5ldyBDRldMX0NoZWNrQm94VFA7DQorICBDRldMX0xpc3RCb3hUUCogcExpc3RCb3hUUCA9IG5ldyBDRldMX0xpc3RCb3hUUDsNCisgIENGV0xfUGljdHVyZUJveFRQKiBwUGljdHVyZUJveFRQID0gbmV3IENGV0xfUGljdHVyZUJveFRQOw0KKyAgQ0ZXTF9TY3JvbGxCYXJUUCogcFNyb2xsQmFyVFAgPSBuZXcgQ0ZXTF9TY3JvbGxCYXJUUDsNCisgIENGV0xfRWRpdFRQKiBwRWRpdFRQID0gbmV3IENGV0xfRWRpdFRQOw0KKyAgQ0ZXTF9Db21ib0JveFRQKiBwQ29tYm9Cb3hUUCA9IG5ldyBDRldMX0NvbWJvQm94VFA7DQorICBDRldMX0JhcmNvZGVUUCogcEJhcmNvZGVUUCA9IG5ldyBDRldMX0JhcmNvZGVUUDsNCisgIENGV0xfRGF0ZVRpbWVQaWNrZXJUUCogcERhdGVUaW1lUGlja2VyVFAgPSBuZXcgQ0ZXTF9EYXRlVGltZVBpY2tlclRQOw0KKyAgQ0ZXTF9Nb250aENhbGVuZGFyVFAqIHBNb250aENhbGVuZGFyVFAgPSBuZXcgQ0ZXTF9Nb250aENhbGVuZGFyVFA7DQorICBDRldMX0NhcmV0VFAqIHBDYXJldFRQID0gbmV3IENGV0xfQ2FyZXRUUDsNCisgIG1fYXJyVGhlbWVzLkFkZChwRm9ybVRQKTsNCisgIG1fYXJyVGhlbWVzLkFkZChwUHVzaEJ1dHRvblRQKTsNCisgIG1fYXJyVGhlbWVzLkFkZChwQ2hlY2tCb3hUUCk7DQorICBtX2FyclRoZW1lcy5BZGQocExpc3RCb3hUUCk7DQorICBtX2FyclRoZW1lcy5BZGQocFBpY3R1cmVCb3hUUCk7DQorICBtX2FyclRoZW1lcy5BZGQocFNyb2xsQmFyVFApOw0KKyAgbV9hcnJUaGVtZXMuQWRkKHBFZGl0VFApOw0KKyAgbV9hcnJUaGVtZXMuQWRkKHBDb21ib0JveFRQKTsNCisgIG1fYXJyVGhlbWVzLkFkZChwQmFyY29kZVRQKTsNCisgIG1fYXJyVGhlbWVzLkFkZChwRGF0ZVRpbWVQaWNrZXJUUCk7DQorICBtX2FyclRoZW1lcy5BZGQocE1vbnRoQ2FsZW5kYXJUUCk7DQorICBtX2FyclRoZW1lcy5BZGQocENhcmV0VFApOw0KK30NCitDRldMX1RoZW1lOjp+Q0ZXTF9UaGVtZSgpIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fYXJyVGhlbWVzLkdldFNpemUoKTsgaSsrKSB7DQorICAgIGRlbGV0ZSBzdGF0aWNfY2FzdDxDRldMX1dpZGdldFRQKj4obV9hcnJUaGVtZXNbaV0pOw0KKyAgfQ0KKyAgbV9hcnJUaGVtZXMuUmVtb3ZlQWxsKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9UaGVtZTo6U2V0Rm9udChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHN0ckZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiByZ2JGb250KSB7DQorICBpbnQzMl90IGlDb3VudCA9IG1fYXJyVGhlbWVzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIENGV0xfV2lkZ2V0VFAqIHBUaGVtZSA9IHN0YXRpY19jYXN0PENGV0xfV2lkZ2V0VFAqPihtX2FyclRoZW1lc1tpXSk7DQorICAgIHBUaGVtZS0+U2V0Rm9udChwV2lkZ2V0LCBzdHJGb250LCBmRm9udFNpemUsIHJnYkZvbnQpOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitDRldMX1dpZGdldFRQKiBDRldMX1RoZW1lOjpHZXRUaGVtZShJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX2FyclRoZW1lcy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBDRldMX1dpZGdldFRQKiBwVGhlbWUgPSBzdGF0aWNfY2FzdDxDRldMX1dpZGdldFRQKj4obV9hcnJUaGVtZXNbaV0pOw0KKyAgICBpZiAocFRoZW1lLT5Jc1ZhbGlkV2lkZ2V0KHBXaWRnZXQpKSB7DQorICAgICAgcmV0dXJuIHBUaGVtZTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC90b29sdGlwY3RybC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvdG9vbHRpcGN0cmwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMmIyMDMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvbGlnaHR3aWRnZXQvdG9vbHRpcGN0cmwuY3BwCkBAIC0wLDAgKzEsMTExIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlIDxtZW1vcnk+DQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX25vdGVpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0aW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3BhbmVsaW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX2Zvcm1pbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGhyZWFkaW1wLmgiDQorDQorQ0ZXTF9Ub29sVGlwKiBDRldMX1Rvb2xUaXA6OkNyZWF0ZSgpIHsNCisgIHJldHVybiBuZXcgQ0ZXTF9Ub29sVGlwOw0KK30NCitGV0xfRVJSIENGV0xfVG9vbFRpcDo6SW5pdGlhbGl6ZShjb25zdCBDRldMX1dpZGdldFByb3BlcnRpZXMqIHBQcm9wZXJ0aWVzKSB7DQorICBpZiAobV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBpZiAocFByb3BlcnRpZXMpIHsNCisgICAgKm1fcFByb3BlcnRpZXMgPSAqcFByb3BlcnRpZXM7DQorICB9DQorICBzdGQ6OnVuaXF1ZV9wdHI8SUZXTF9Ub29sVGlwPiBwVG9vbFRpcChJRldMX1Rvb2xUaXA6OkNyZWF0ZSgNCisgICAgICBtX3BQcm9wZXJ0aWVzLT5NYWtlV2lkZ2V0SW1wUHJvcGVydGllcygmbV90b29sdGlwRGF0YSksIG51bGxwdHIpKTsNCisgIEZXTF9FUlIgcmV0ID0gcFRvb2xUaXAtPkluaXRpYWxpemUoKTsNCisgIGlmIChyZXQgIT0gRldMX0VSUl9TdWNjZWVkZWQpIHsNCisgICAgcmV0dXJuIHJldDsNCisgIH0NCisgIG1fcElmYWNlID0gcFRvb2xUaXAucmVsZWFzZSgpOw0KKyAgQ0ZXTF9XaWRnZXQ6OkluaXRpYWxpemUoKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1Rvb2xUaXA6OkdldENhcHRpb24oQ0ZYX1dpZGVTdHJpbmcmIHdzQ2FwdGlvbikgew0KKyAgd3NDYXB0aW9uID0gbV90b29sdGlwRGF0YS5tX3dzQ2FwdGlvbjsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1Rvb2xUaXA6OlNldENhcHRpb24oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NhcHRpb24pIHsNCisgIG1fdG9vbHRpcERhdGEubV93c0NhcHRpb24gPSB3c0NhcHRpb247DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK2ludDMyX3QgQ0ZXTF9Ub29sVGlwOjpHZXRJbml0aWFsRGVsYXkoKSB7DQorICByZXR1cm4gbV90b29sdGlwRGF0YS5tX25Jbml0RGVsYXlUaW1lOw0KK30NCitpbnQzMl90IENGV0xfVG9vbFRpcDo6U2V0SW5pdGlhbERlbGF5KGludDMyX3QgbkRlbGF5VGltZSkgew0KKyAgbV90b29sdGlwRGF0YS5tX25Jbml0RGVsYXlUaW1lID0gbkRlbGF5VGltZTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQoraW50MzJfdCBDRldMX1Rvb2xUaXA6OkdldEF1dG9Qb3BEZWxheSgpIHsNCisgIHJldHVybiBtX3Rvb2x0aXBEYXRhLm1fbkF1dG9Qb3BEZWxheVRpbWU7DQorfQ0KK2ludDMyX3QgQ0ZXTF9Ub29sVGlwOjpTZXRBdXRvUG9wRGVsYXkoaW50MzJfdCBuRGVsYXlUaW1lKSB7DQorICBtX3Rvb2x0aXBEYXRhLm1fbkF1dG9Qb3BEZWxheVRpbWUgPSBuRGVsYXlUaW1lOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitDRlhfRElCaXRtYXAqIENGV0xfVG9vbFRpcDo6R2V0VG9vbFRpcEljb24oKSB7DQorICByZXR1cm4gbV90b29sdGlwRGF0YS5tX3BCaXRtYXA7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ub29sVGlwOjpTZXRUb29sVGlwSWNvbihDRlhfRElCaXRtYXAqIHBCaXRtYXApIHsNCisgIG1fdG9vbHRpcERhdGEubV9wQml0bWFwID0gcEJpdG1hcDsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorQ0ZYX1NpemVGIENGV0xfVG9vbFRpcDo6R2V0VG9vbFRpcEljb25TaXplKCkgew0KKyAgcmV0dXJuIG1fdG9vbHRpcERhdGEubV9mSWNvblNpemU7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ub29sVGlwOjpTZXRUb29sVGlwSWNvblNpemUoQ0ZYX1NpemVGIGZTaXplKSB7DQorICBtX3Rvb2x0aXBEYXRhLm1fZkljb25TaXplID0gZlNpemU7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ub29sVGlwOjpTZXRBbmNob3IoY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvcikgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfVG9vbFRpcCo+KG1fcElmYWNlKS0+U2V0QW5jaG9yKHJ0QW5jaG9yKTsNCit9DQorRldMX0VSUiBDRldMX1Rvb2xUaXA6OlNob3coKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8SUZXTF9Ub29sVGlwKj4obV9wSWZhY2UpLT5TaG93KCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ub29sVGlwOjpIaWRlKCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PElGV0xfVG9vbFRpcCo+KG1fcElmYWNlKS0+SGlkZSgpOw0KK30NCitDRldMX1Rvb2xUaXA6OkNGV0xfVG9vbFRpcCgpIHt9DQorQ0ZXTF9Ub29sVGlwOjp+Q0ZXTF9Ub29sVGlwKCkge30NCitDRldMX1Rvb2xUaXA6OkNGV0xfVG9vbFRpcERQOjpDRldMX1Rvb2xUaXBEUCgpIDogbV9wQml0bWFwKE5VTEwpIHsNCisgIG1fd3NDYXB0aW9uID0gTCIiOw0KKyAgbV9uSW5pdERlbGF5VGltZSA9IDUwMDsNCisgIG1fbkF1dG9Qb3BEZWxheVRpbWUgPSA1MDAwMDsNCisgIG1fZkljb25TaXplLlNldCgwLjAsIDAuMCk7DQorICBtX2ZBbmNob3IuU2V0KDAuMCwgMC4wLCAwLjAsIDAuMCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9Ub29sVGlwOjpDRldMX1Rvb2xUaXBEUDo6R2V0Q2FwdGlvbihJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQ2FwdGlvbikgew0KKyAgd3NDYXB0aW9uID0gbV93c0NhcHRpb247DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK2ludDMyX3QgQ0ZXTF9Ub29sVGlwOjpDRldMX1Rvb2xUaXBEUDo6R2V0SW5pdGlhbERlbGF5KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gbV9uSW5pdERlbGF5VGltZTsNCit9DQoraW50MzJfdCBDRldMX1Rvb2xUaXA6OkNGV0xfVG9vbFRpcERQOjpHZXRBdXRvUG9wRGVsYXkoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBtX25BdXRvUG9wRGVsYXlUaW1lOw0KK30NCitDRlhfRElCaXRtYXAqIENGV0xfVG9vbFRpcDo6Q0ZXTF9Ub29sVGlwRFA6OkdldFRvb2xUaXBJY29uKA0KKyAgICBJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIG1fcEJpdG1hcDsNCit9DQorQ0ZYX1NpemVGIENGV0xfVG9vbFRpcDo6Q0ZXTF9Ub29sVGlwRFA6OkdldFRvb2xUaXBJY29uU2l6ZSgNCisgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBtX2ZJY29uU2l6ZTsNCit9DQorQ0ZYX1JlY3RGIENGV0xfVG9vbFRpcDo6Q0ZXTF9Ub29sVGlwRFA6OkdldEFuY2hvcigpIHsNCisgIHJldHVybiBtX2ZBbmNob3I7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC93aWRnZXQuY3BwIGIveGZhL3NyYy9md2wvc3JjL2xpZ2h0d2lkZ2V0L3dpZGdldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZhOTBjYwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy9saWdodHdpZGdldC93aWRnZXQuY3BwCkBAIC0wLDAgKzEsMzE3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX25vdGVpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfdGFyZ2V0aW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX25vdGVpbXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9md2wvc3JjL2NvcmUvaW5jbHVkZS9md2xfd2lkZ2V0aW1wLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZndsL3NyYy9jb3JlL2luY2x1ZGUvZndsX3dpZGdldG1ncmltcC5oIg0KKw0KK0NGV0xfV2lkZ2V0SW1wUHJvcGVydGllcyBDRldMX1dpZGdldFByb3BlcnRpZXM6Ok1ha2VXaWRnZXRJbXBQcm9wZXJ0aWVzKA0KKyAgICBJRldMX0RhdGFQcm92aWRlciogcERhdGFQcm92aWRlcikgY29uc3Qgew0KKyAgQ0ZXTF9XaWRnZXRJbXBQcm9wZXJ0aWVzIHJlc3VsdDsNCisgIHJlc3VsdC5tX2N0bU9uUGFyZW50ID0gbV9jdG1PblBhcmVudDsNCisgIHJlc3VsdC5tX3J0V2lkZ2V0ID0gbV9ydFdpZGdldDsNCisgIHJlc3VsdC5tX2R3U3R5bGVzID0gbV9kd1N0eWxlczsNCisgIHJlc3VsdC5tX2R3U3R5bGVFeGVzID0gbV9kd1N0eWxlRXhlczsNCisgIHJlc3VsdC5tX2R3U3RhdGVzID0gbV9kd1N0YXRlczsNCisgIGlmIChtX3BQYXJlbnQpDQorICAgIHJlc3VsdC5tX3BQYXJlbnQgPSBtX3BQYXJlbnQtPkdldFdpZGdldCgpOw0KKyAgaWYgKG1fcE93bmVyKQ0KKyAgICByZXN1bHQubV9wT3duZXIgPSBtX3BPd25lci0+R2V0V2lkZ2V0KCk7DQorICByZXN1bHQubV9wRGF0YVByb3ZpZGVyID0gcERhdGFQcm92aWRlcjsNCisgIHJldHVybiByZXN1bHQ7DQorfQ0KK0lGV0xfV2lkZ2V0KiBDRldMX1dpZGdldDo6R2V0V2lkZ2V0KCkgew0KKyAgcmV0dXJuIG1fcElmYWNlOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2xhc3MpIGNvbnN0IHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZXR1cm4gbV9wSWZhY2UtPkdldENsYXNzTmFtZSh3c0NsYXNzKTsNCit9DQorRlhfRFdPUkQgQ0ZXTF9XaWRnZXQ6OkdldENsYXNzSUQoKSBjb25zdCB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gMDsNCisgIHJldHVybiBtX3BJZmFjZS0+R2V0Q2xhc3NJRCgpOw0KK30NCitGWF9CT09MIENGV0xfV2lkZ2V0OjpJc0luc3RhbmNlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDbGFzcykgY29uc3Qgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgcmV0dXJuIG1fcElmYWNlLT5Jc0luc3RhbmNlKHdzQ2xhc3MpOw0KK30NCitzdGF0aWMgdm9pZCogZ3NfcEZXTFdpZGdldCA9ICh2b2lkKilGWEJTVFJfSUQoJ2wnLCAnaScsICdnJywgJ3QnKTsNCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpJbml0aWFsaXplKGNvbnN0IENGV0xfV2lkZ2V0UHJvcGVydGllcyogcFByb3BlcnRpZXMpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZXR1cm4gbV9wSWZhY2UtPlNldFByaXZhdGVEYXRhKGdzX3BGV0xXaWRnZXQsIHRoaXMsIE5VTEwpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCwgRlhfQk9PTCBiQXV0b1NpemUpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZXR1cm4gbV9wSWZhY2UtPkdldFdpZGdldFJlY3QocmVjdCwgYkF1dG9TaXplKTsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldDo6R2V0R2xvYmFsUmVjdChDRlhfUmVjdEYmIHJlY3QpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZXR1cm4gbV9wSWZhY2UtPkdldEdsb2JhbFJlY3QocmVjdCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXQ6OlNldFdpZGdldFJlY3QoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgcmV0dXJuIG1fcElmYWNlLT5TZXRXaWRnZXRSZWN0KHJlY3QpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpHZXRDbGllbnRSZWN0KENGWF9SZWN0RiYgcmVjdCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHJldHVybiBtX3BJZmFjZS0+R2V0Q2xpZW50UmVjdChyZWN0KTsNCit9DQorQ0ZXTF9XaWRnZXQqIENGV0xfV2lkZ2V0OjpHZXRQYXJlbnQoKSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gTlVMTDsNCisgIElGV0xfV2lkZ2V0KiBwYXJlbnQgPSBtX3BJZmFjZS0+R2V0UGFyZW50KCk7DQorICBpZiAocGFyZW50KSB7DQorICAgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX1dpZGdldCo+KHBhcmVudC0+R2V0UHJpdmF0ZURhdGEoZ3NfcEZXTFdpZGdldCkpOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXQ6OlNldFBhcmVudChDRldMX1dpZGdldCogcFBhcmVudCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHJldHVybiBtX3BJZmFjZS0+U2V0UGFyZW50KHBQYXJlbnQgPyBwUGFyZW50LT5HZXRXaWRnZXQoKSA6IE5VTEwpOw0KK30NCitDRldMX1dpZGdldCogQ0ZXTF9XaWRnZXQ6OkdldE93bmVyKCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIE5VTEw7DQorICByZXR1cm4gTlVMTDsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldDo6U2V0T3duZXIoQ0ZXTF9XaWRnZXQqIHBPd25lcikgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRFdPUkQgQ0ZXTF9XaWRnZXQ6OkdldFN0eWxlcygpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIG1fcElmYWNlLT5HZXRTdHlsZXMoKTsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldDo6TW9kaWZ5U3R5bGVzKEZYX0RXT1JEIGR3U3R5bGVzQWRkZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGVzUmVtb3ZlZCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHJldHVybiBtX3BJZmFjZS0+TW9kaWZ5U3R5bGVzKGR3U3R5bGVzQWRkZWQsIGR3U3R5bGVzUmVtb3ZlZCk7DQorfQ0KK0ZYX0RXT1JEIENGV0xfV2lkZ2V0OjpHZXRTdHlsZXNFeCgpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIG1fcElmYWNlLT5HZXRTdHlsZXNFeCgpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpNb2RpZnlTdHlsZXNFeChGWF9EV09SRCBkd1N0eWxlc0V4QWRkZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdHlsZXNFeFJlbW92ZWQpIHsNCisgIHJldHVybiBtX3BJZmFjZS0+TW9kaWZ5U3R5bGVzRXgoZHdTdHlsZXNFeEFkZGVkLCBkd1N0eWxlc0V4UmVtb3ZlZCk7DQorfQ0KK0ZYX0RXT1JEIENGV0xfV2lkZ2V0OjpHZXRTdGF0ZXMoKSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgcmV0dXJuIG1fcElmYWNlLT5HZXRTdGF0ZXMoKTsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldDo6U2V0U3RhdGVzKEZYX0RXT1JEIGR3U3RhdGVzLCBGWF9CT09MIGJTZXQpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZXR1cm4gbV9wSWZhY2UtPlNldFN0YXRlcyhkd1N0YXRlcywgYlNldCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXQ6OlNldFByaXZhdGVEYXRhKHZvaWQqIG1vZHVsZV9pZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRF9DQUxMQkFDS19GUkVFREFUQSBjYWxsYmFjaykgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHJldHVybiBtX3BJZmFjZS0+U2V0UHJpdmF0ZURhdGEobW9kdWxlX2lkLCBwRGF0YSwgY2FsbGJhY2spOw0KK30NCit2b2lkKiBDRldMX1dpZGdldDo6R2V0UHJpdmF0ZURhdGEodm9pZCogbW9kdWxlX2lkKSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gTlVMTDsNCisgIHJldHVybiBtX3BJZmFjZS0+R2V0UHJpdmF0ZURhdGEobW9kdWxlX2lkKTsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldDo6VXBkYXRlKCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHJldHVybiBtX3BJZmFjZS0+VXBkYXRlKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXQ6OkxvY2tVcGRhdGUoKSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgcmV0dXJuIG1fcElmYWNlLT5Mb2NrVXBkYXRlKCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXQ6OlVubG9ja1VwZGF0ZSgpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZXR1cm4gbV9wSWZhY2UtPlVubG9ja1VwZGF0ZSgpOw0KK30NCitGWF9EV09SRCBDRldMX1dpZGdldDo6SGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiAwOw0KKyAgcmV0dXJuIG1fcElmYWNlLT5IaXRUZXN0KGZ4LCBmeSk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXQ6OlRyYW5zZm9ybVRvKENGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZnkpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZXR1cm4gbV9wSWZhY2UtPlRyYW5zZm9ybVRvKHBXaWRnZXQgPyBwV2lkZ2V0LT5HZXRXaWRnZXQoKSA6IE5VTEwsIGZ4LCBmeSk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXQ6OlRyYW5zZm9ybVRvKENGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBDRlhfUmVjdEYmIHJ0KSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgcmV0dXJuIG1fcElmYWNlLT5UcmFuc2Zvcm1UbyhwV2lkZ2V0ID8gcFdpZGdldC0+R2V0V2lkZ2V0KCkgOiBOVUxMLCBydCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXQ6OkdldE1hdHJpeChDRlhfTWF0cml4JiBtYXRyaXgsIEZYX0JPT0wgYkdsb2JhbCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHJldHVybiBtX3BJZmFjZS0+R2V0TWF0cml4KG1hdHJpeCwgYkdsb2JhbCk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXQ6OlNldE1hdHJpeChjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICByZXR1cm4gbV9wSWZhY2UtPlNldE1hdHJpeChtYXRyaXgpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIHJldHVybiBtX3BJZmFjZS0+RHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KK30NCitJRldMX1dpZGdldERlbGVnYXRlKiBDRldMX1dpZGdldDo6U2V0RGVsZWdhdGUoSUZXTF9XaWRnZXREZWxlZ2F0ZSogcERlbGVnYXRlKSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gTlVMTDsNCisgIG1fcERlbGVnYXRlID0gbV9wSWZhY2UtPlNldERlbGVnYXRlKHBEZWxlZ2F0ZSk7DQorICByZXR1cm4gbV9wRGVsZWdhdGU7DQorfQ0KK0NGV0xfV2lkZ2V0OjpDRldMX1dpZGdldCgpDQorICAgIDogbV9wSWZhY2UoTlVMTCksIG1fcERlbGVnYXRlKE5VTEwpLCBtX3BQcm9wZXJ0aWVzKE5VTEwpIHsNCisgIG1fcFByb3BlcnRpZXMgPSBuZXcgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzOw0KKyAgbV9wV2lkZ2V0TWdyID0gc3RhdGljX2Nhc3Q8Q0ZXTF9XaWRnZXRNZ3IqPihGV0xfR2V0V2lkZ2V0TWdyKCkpOw0KKyAgRlhTWVNfYXNzZXJ0KG1fcFdpZGdldE1nciAhPSBOVUxMKTsNCit9DQorQ0ZXTF9XaWRnZXQ6On5DRldMX1dpZGdldCgpIHsNCisgIGRlbGV0ZSBtX3BQcm9wZXJ0aWVzOw0KKyAgaWYgKG1fcElmYWNlKSB7DQorICAgIG1fcElmYWNlLT5GaW5hbGl6ZSgpOw0KKyAgICBkZWxldGUgbV9wSWZhY2U7DQorICB9DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXQ6OlJlcGFpbnQoY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIENGWF9SZWN0RiByZWN0Ow0KKyAgaWYgKHBSZWN0KSB7DQorICAgIHJlY3QgPSAqcFJlY3Q7DQorICB9IGVsc2Ugew0KKyAgICBtX3BJZmFjZS0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgICAgcmVjdC5sZWZ0ID0gcmVjdC50b3AgPSAwOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcFdpZGdldE1nci0+UmVwYWludFdpZGdldChtX3BJZmFjZSwgJnJlY3QpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0OjpTZXRGb2N1cyhGWF9CT09MIGJGb2N1cykgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIElGV0xfTm90ZVRocmVhZCogcFRocmVhZCA9IG1fcElmYWNlLT5HZXRPd25lclRocmVhZCgpOw0KKyAgaWYgKCFwVGhyZWFkKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgSUZXTF9Ob3RlRHJpdmVyKiBwRHJpdmVyID0gcFRocmVhZC0+R2V0Tm90ZURyaXZlcigpOw0KKyAgaWYgKCFwRHJpdmVyKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgaWYgKGJGb2N1cykgew0KKyAgICBwRHJpdmVyLT5TZXRGb2N1cyhtX3BJZmFjZSk7DQorICB9IGVsc2Ugew0KKyAgICBpZiAocERyaXZlci0+R2V0Rm9jdXMoKSA9PSBtX3BJZmFjZSkgew0KKyAgICAgIHBEcml2ZXItPlNldEZvY3VzKE5VTEwpOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXQ6OlNldEdyYWIoRlhfQk9PTCBiU2V0KSB7DQorICBpZiAoIW1fcElmYWNlKQ0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgSUZXTF9Ob3RlVGhyZWFkKiBwVGhyZWFkID0gbV9wSWZhY2UtPkdldE93bmVyVGhyZWFkKCk7DQorICBpZiAoIXBUaHJlYWQpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBJRldMX05vdGVEcml2ZXIqIHBEcml2ZXIgPSBwVGhyZWFkLT5HZXROb3RlRHJpdmVyKCk7DQorICBpZiAoIXBEcml2ZXIpDQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICBwRHJpdmVyLT5TZXRHcmFiKG1fcElmYWNlLCBiU2V0KTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQordm9pZCBDRldMX1dpZGdldDo6UmVnaXN0ZXJFdmVudFRhcmdldChDRldMX1dpZGdldCogcEV2ZW50U291cmNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGaWx0ZXIpIHsNCisgIGlmICghbV9wSWZhY2UpDQorICAgIHJldHVybjsNCisgIElGV0xfTm90ZVRocmVhZCogcFRocmVhZCA9IG1fcElmYWNlLT5HZXRPd25lclRocmVhZCgpOw0KKyAgaWYgKCFwVGhyZWFkKQ0KKyAgICByZXR1cm47DQorICBJRldMX05vdGVEcml2ZXIqIHBOb3RlRHJpdmVyID0gcFRocmVhZC0+R2V0Tm90ZURyaXZlcigpOw0KKyAgaWYgKCFwTm90ZURyaXZlcikNCisgICAgcmV0dXJuOw0KKyAgSUZXTF9XaWRnZXQqIHBFdmVudFNvdXJjZUltcCA9DQorICAgICAgIXBFdmVudFNvdXJjZSA/IE5VTEwgOiBwRXZlbnRTb3VyY2UtPkdldFdpZGdldCgpOw0KKyAgcE5vdGVEcml2ZXItPlJlZ2lzdGVyRXZlbnRUYXJnZXQoR2V0V2lkZ2V0KCksIHBFdmVudFNvdXJjZUltcCwgZHdGaWx0ZXIpOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0OjpEaXNwYXRjaEV2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkgew0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuOw0KKyAgaWYgKG1fcElmYWNlLT5HZXRPdXRlcigpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElGV0xfTm90ZVRocmVhZCogcFRocmVhZCA9IG1fcElmYWNlLT5HZXRPd25lclRocmVhZCgpOw0KKyAgaWYgKCFwVGhyZWFkKQ0KKyAgICByZXR1cm47DQorICBJRldMX05vdGVEcml2ZXIqIHBOb3RlRHJpdmVyID0gcFRocmVhZC0+R2V0Tm90ZURyaXZlcigpOw0KKyAgaWYgKCFwTm90ZURyaXZlcikNCisgICAgcmV0dXJuOw0KKyAgcE5vdGVEcml2ZXItPlNlbmROb3RlKHBFdmVudCk7DQorfQ0KKyNkZWZpbmUgRldMX1dHVF9DYWxjSGVpZ2h0IDIwNDgNCisjZGVmaW5lIEZXTF9XR1RfQ2FsY1dpZHRoIDIwNDgNCisjZGVmaW5lIEZXTF9XR1RfQ2FsY011bHRpTGluZURlZldpZHRoIDEyMC4wZg0KK0NGWF9TaXplRiBDRldMX1dpZGdldDo6Q2FsY1RleHRTaXplKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTXVsdGlMaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxpbmVXaWR0aCkgew0KKyAgQ0ZYX1NpemVGIHN6Ow0KKyAgc3ouU2V0KDAsIDApOw0KKyAgaWYgKCFtX3BJZmFjZSkNCisgICAgcmV0dXJuIHN6Ow0KKyAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUgPSBtX3BJZmFjZS0+R2V0VGhlbWVQcm92aWRlcigpOw0KKyAgaWYgKCFwVGhlbWUpDQorICAgIHJldHVybiBzejsNCisgIENGV0xfVGhlbWVUZXh0IGNhbFBhcnQ7DQorICBjYWxQYXJ0Lm1fcFdpZGdldCA9IG1fcElmYWNlOw0KKyAgY2FsUGFydC5tX3dzVGV4dCA9IHdzVGV4dDsNCisgIGNhbFBhcnQubV9kd1RUT1N0eWxlcyA9DQorICAgICAgYk11bHRpTGluZSA/IEZERV9UVE9TVFlMRV9MaW5lV3JhcCA6IEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lOw0KKyAgY2FsUGFydC5tX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfVG9wTGVmdDsNCisgIENGWF9SZWN0RiByZWN0Ow0KKyAgRlhfRkxPQVQgZldpZHRoID0gYk11bHRpTGluZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgID8gKGlMaW5lV2lkdGggPiAwID8gKEZYX0ZMT0FUKWlMaW5lV2lkdGgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZXTF9XR1RfQ2FsY011bHRpTGluZURlZldpZHRoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIDogRldMX1dHVF9DYWxjV2lkdGg7DQorICByZWN0LlNldCgwLCAwLCBmV2lkdGgsIEZXTF9XR1RfQ2FsY0hlaWdodCk7DQorICBwVGhlbWUtPkNhbGNUZXh0UmVjdCgmY2FsUGFydCwgcmVjdCk7DQorICBzei54ID0gcmVjdC53aWR0aDsNCisgIHN6LnkgPSByZWN0LmhlaWdodDsNCisgIHJldHVybiBzejsNCit9DQorQ0ZXTF9XaWRnZXREZWxlZ2F0ZTo6Q0ZXTF9XaWRnZXREZWxlZ2F0ZSgpIHt9DQorQ0ZXTF9XaWRnZXREZWxlZ2F0ZTo6fkNGV0xfV2lkZ2V0RGVsZWdhdGUoKSB7fQ0KK2ludDMyX3QgQ0ZXTF9XaWRnZXREZWxlZ2F0ZTo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7DQorICByZXR1cm4gMTsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldERlbGVnYXRlOjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldERlbGVnYXRlOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvYmFyY29kZXRwLmNwcCBiL3hmYS9zcmMvZndsL3NyYy90aGVtZS9iYXJjb2RldHAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMGY5OTMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvYmFyY29kZXRwLmNwcApAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorQ0ZXTF9CYXJjb2RlVFA6OkNGV0xfQmFyY29kZVRQKCkge30NCitDRldMX0JhcmNvZGVUUDo6fkNGV0xfQmFyY29kZVRQKCkge30NCitGWF9CT09MIENGV0xfQmFyY29kZVRQOjpJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBpZiAoIXBXaWRnZXQpDQorICAgIHJldHVybiBGQUxTRTsNCisgIHJldHVybiBwV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9CYXJjb2RlOw0KK30NCitGWF9CT09MIENGV0xfQmFyY29kZVRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcykgew0KKyAgaWYgKCFwUGFyYW1zKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBzd2l0Y2ggKHBQYXJhbXMtPm1faVBhcnQpIHsNCisgICAgY2FzZSBGV0xfUEFSVF9CQ0RfQm9yZGVyOiB7DQorICAgICAgRHJhd0JvcmRlcihwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfQkNEX0VkZ2U6IHsNCisgICAgICBEcmF3RWRnZShwUGFyYW1zLT5tX3BHcmFwaGljcywgcFBhcmFtcy0+bV9wV2lkZ2V0LT5HZXRTdHlsZXMoKSwNCisgICAgICAgICAgICAgICAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9CQ0RfQmFja2dyb3VuZDogew0KKyAgICAgIEZpbGxCYWNrZ3JvdW5kKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsDQorICAgICAgICAgICAgICAgICAgICAgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy90aGVtZS9jYXJldHRwLmNwcCBiL3hmYS9zcmMvZndsL3NyYy90aGVtZS9jYXJldHRwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzdkNzUxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL2NhcmV0dHAuY3BwCkBAIC0wLDAgKzEsNDQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCitDRldMX0NhcmV0VFA6OkNGV0xfQ2FyZXRUUCgpIHt9DQorQ0ZXTF9DYXJldFRQOjp+Q0ZXTF9DYXJldFRQKCkge30NCitGWF9CT09MIENGV0xfQ2FyZXRUUDo6SXNWYWxpZFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgaWYgKCFwV2lkZ2V0KQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICByZXR1cm4gcFdpZGdldC0+R2V0Q2xhc3NJRCgpID09IEZXTF9DTEFTU0hBU0hfQ2FyZXQ7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9DYXJldFRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcykgew0KKyAgaWYgKCFwUGFyYW1zKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBzd2l0Y2ggKHBQYXJhbXMtPm1faVBhcnQpIHsNCisgICAgY2FzZSBGV0xfUEFSVF9DQVRfQmFja2dyb3VuZDogew0KKyAgICAgIGlmICghKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NBVF9IaWdodExpZ2h0KSkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfQ0KKyAgICAgIERyYXdDYXJldEJLKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBwUGFyYW1zLT5tX2R3U3RhdGVzLA0KKyAgICAgICAgICAgICAgICAgICYocFBhcmFtcy0+bV9ydFBhcnQpLCAoQ0ZYX0NvbG9yKilwUGFyYW1zLT5tX3BEYXRhLA0KKyAgICAgICAgICAgICAgICAgICYocFBhcmFtcy0+bV9tYXRyaXgpKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0ZXTF9DYXJldFRQOjpEcmF3Q2FyZXRCSyhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Db2xvciogY3JGaWxsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIENGWF9Db2xvciBjckZpbGx0ZW1wOw0KKyAgY3JGaWxsID8gY3JGaWxsdGVtcCA9ICpjckZpbGwgOiBjckZpbGx0ZW1wID0gQXJnYkVuY29kZSgyNTUsIDAsIDAsIDApOw0KKyAgQ0ZYX1JlY3RGIHJlY3QgPSAqcFJlY3Q7DQorICBwYXRoLkFkZFJlY3RhbmdsZShyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7DQorICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsdGVtcCk7DQorICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy90aGVtZS9jaGVja2JveHRwLmNwcCBiL3hmYS9zcmMvZndsL3NyYy90aGVtZS9jaGVja2JveHRwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjgxYTdmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL2NoZWNrYm94dHAuY3BwCkBAIC0wLDAgKzEsNTQyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2RlZmluZSBDSEVDS0JPWF9TSVpFX1NJR05NQVJHSU4gMw0KKyNkZWZpbmUgQ0hFQ0tCT1hfU0laRV9TSUdOQk9SREVSIDINCisjZGVmaW5lIENIRUNLQk9YX1NJWkVfU0lHTlBBVEggMTAwDQorI2RlZmluZSBDSEVDS0JPWF9DT0xPUl9CT1hMVDEgKEFyZ2JFbmNvZGUoMjU1LCAxNzIsIDE2OCwgMTUzKSkNCisjZGVmaW5lIENIRUNLQk9YX0NPTE9SX0JPWExUMiAoQXJnYkVuY29kZSgyNTUsIDExMywgMTExLCAxMDApKQ0KKyNkZWZpbmUgQ0hFQ0tCT1hfQ09MT1JfQk9YUkIxIChBcmdiRW5jb2RlKDI1NSwgMjQxLCAyMzksIDIyNikpDQorI2RlZmluZSBDSEVDS0JPWF9DT0xPUl9CT1hSQjIgKEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSkNCisjZGVmaW5lIENIRUNLQk9YX0ZYR0VfQ29vcmRpbmF0ZXNBZGp1c3QNCitDRldMX0NoZWNrQm94VFA6OkNGV0xfQ2hlY2tCb3hUUCgpIDogbV9wQ2hlY2tQYXRoKE5VTEwpIHsNCisgIG1fcFRoZW1lRGF0YSA9IG5ldyBDS0JUaGVtZURhdGE7DQorICBTZXRUaGVtZURhdGEoMCk7DQorfQ0KK0NGV0xfQ2hlY2tCb3hUUDo6fkNGV0xfQ2hlY2tCb3hUUCgpIHsNCisgIGlmIChtX3BUaGVtZURhdGEpIHsNCisgICAgZGVsZXRlIG1fcFRoZW1lRGF0YTsNCisgICAgbV9wVGhlbWVEYXRhID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BDaGVja1BhdGgpIHsNCisgICAgbV9wQ2hlY2tQYXRoLT5DbGVhcigpOw0KKyAgICBkZWxldGUgbV9wQ2hlY2tQYXRoOw0KKyAgICBtX3BDaGVja1BhdGggPSBOVUxMOw0KKyAgfQ0KK30NCitGWF9CT09MIENGV0xfQ2hlY2tCb3hUUDo6SXNWYWxpZFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIHBXaWRnZXQgJiYgcFdpZGdldC0+R2V0Q2xhc3NJRCgpID09IEZXTF9DTEFTU0hBU0hfQ2hlY2tCb3g7DQorfQ0KK0ZYX0RXT1JEIENGV0xfQ2hlY2tCb3hUUDo6U2V0VGhlbWVJRChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdUaGVtZUlELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGlsZHJlbikgew0KKyAgaWYgKG1fcFRoZW1lRGF0YSkgew0KKyAgICBTZXRUaGVtZURhdGEoRldMX0dldFRoZW1lQ29sb3IoZHdUaGVtZUlEKSk7DQorICB9DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6U2V0VGhlbWVJRChwV2lkZ2V0LCBkd1RoZW1lSUQsIGJDaGlsZHJlbik7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9DaGVja0JveFRQOjpEcmF3VGV4dChDRldMX1RoZW1lVGV4dCogcFBhcmFtcykgew0KKyAgaWYgKCFtX3BUZXh0T3V0KQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBGWF9CT09MIGJEaXNhYmxlID0gKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMSkgPT0NCisgICAgICAgICAgICAgICAgICAgICBGV0xfUEFSVFNUQVRFX0NLQl9EaXNhYmxlZDsNCisgIEZYX0FSR0IgYXJnVGV4dCA9DQorICAgICAgYkRpc2FibGUgPyBGV0xUSEVNRV9DQVBBQ0lUWV9UZXh0RGlzQ29sb3IgOiBGV0xUSEVNRV9DQVBBQ0lUWV9UZXh0Q29sb3I7DQorICBtX3BUZXh0T3V0LT5TZXRUZXh0Q29sb3IoYXJnVGV4dCk7DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6RHJhd1RleHQocFBhcmFtcyk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9DaGVja0JveFRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcykgew0KKyAgaWYgKCFwUGFyYW1zKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBzd2l0Y2ggKHBQYXJhbXMtPm1faVBhcnQpIHsNCisgICAgY2FzZSBGV0xfUEFSVF9DS0JfQm9yZGVyOiB7DQorICAgICAgRHJhd0JvcmRlcihwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfQ0tCX0VkZ2U6IHsNCisgICAgICBEcmF3RWRnZShwUGFyYW1zLT5tX3BHcmFwaGljcywgcFBhcmFtcy0+bV9wV2lkZ2V0LT5HZXRTdHlsZXMoKSwNCisgICAgICAgICAgICAgICAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9DS0JfQmFja2dyb3VuZDogew0KKyAgICAgIEZpbGxCYWNrZ3JvdW5kKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsDQorICAgICAgICAgICAgICAgICAgICAgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBpZiAocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX0ZvY3VzZWQpIHsNCisgICAgICAgIHBQYXJhbXMtPm1fcnRQYXJ0ID0gKihDRlhfUmVjdEYqKXBQYXJhbXMtPm1fcERhdGE7DQorICAgICAgICBEcmF3Rm9jdXMocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9DS0JfQ2hlY2tCb3g6IHsNCisgICAgICBEcmF3Qm94QmsocFBhcmFtcy0+bV9wV2lkZ2V0LCBwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LA0KKyAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX2R3U3RhdGVzLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGlmICgoKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMikgPT0NCisgICAgICAgICAgIEZXTF9QQVJUU1RBVEVfQ0tCX0NoZWNrZWQpIHwNCisgICAgICAgICAgKChwUGFyYW1zLT5tX2R3U3RhdGVzICYgRldMX1BBUlRTVEFURV9DS0JfTWFzazIpID09DQorICAgICAgICAgICBGV0xfUEFSVFNUQVRFX0NLQl9OZXV0cmFsKSkgew0KKyAgICAgICAgRHJhd1NpZ24ocFBhcmFtcy0+bV9wV2lkZ2V0LCBwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LA0KKyAgICAgICAgICAgICAgICAgcFBhcmFtcy0+bV9kd1N0YXRlcywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICB9DQorICAgICAgRlhfQk9PTCBiRGlzYWJsZSA9IChwUGFyYW1zLT5tX2R3U3RhdGVzICYgRldMX1BBUlRTVEFURV9DS0JfTWFzazEpID09DQorICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9QQVJUU1RBVEVfQ0tCX0Rpc2FibGVkOw0KKyAgICAgIERyYXdTaWduQm9yZGVyKHBQYXJhbXMtPm1fcFdpZGdldCwgcFBhcmFtcy0+bV9wR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgJnBQYXJhbXMtPm1fcnRQYXJ0LCBiRGlzYWJsZSwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGQUxTRTsgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9DaGVja0JveFRQOjpJbml0aWFsaXplKCkgew0KKyAgSW5pdFRUTygpOw0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OkluaXRpYWxpemUoKTsNCit9DQorRldMX0VSUiBDRldMX0NoZWNrQm94VFA6OkZpbmFsaXplKCkgew0KKyAgRmluYWxpemVUVE8oKTsNCisgIHJldHVybiBDRldMX1dpZGdldFRQOjpGaW5hbGl6ZSgpOw0KK30NCit2b2lkIENGV0xfQ2hlY2tCb3hUUDo6RHJhd0JveEJrKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBkd1N0YXRlcyAmPSAweDAzOw0KKyAgaW50MzJfdCBmaWxsTW9kZSA9IEZYRklMTF9XSU5ESU5HOw0KKyAgRlhfRFdPUkQgZHdTdHlsZUV4ID0gcFdpZGdldC0+R2V0U3R5bGVzRXgoKTsNCisgIGR3U3R5bGVFeCAmPSBGV0xfU1RZTEVFWFRfQ0tCX1NoYXBlTWFzazsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgRlhfRkxPQVQgZlJpZ2h0ID0gcFJlY3QtPnJpZ2h0KCk7DQorICBGWF9GTE9BVCBmQm90dG9tID0gcFJlY3QtPmJvdHRvbSgpOw0KKyAgRlhfQk9PTCBiQ2xpcFNpZ24gPQ0KKyAgICAgIChkd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2sxKSA9PSBGV0xfUEFSVFNUQVRFX0NLQl9Ib3ZlcmVkOw0KKyAgaWYgKChkd1N0eWxlRXggPT0gRldMX1NUWUxFRVhUX0NLQl9TaGFwZVNvbGlkU3F1YXJlKSB8fA0KKyAgICAgIChkd1N0eWxlRXggPT0gRldMX1NUWUxFRVhUX0NLQl9TaGFwZVN1bmtlblNxdWFyZSkpIHsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsIHBSZWN0LT53aWR0aCwgcFJlY3QtPmhlaWdodCk7DQorICAgIGlmIChiQ2xpcFNpZ24pIHsNCisgICAgICBmaWxsTW9kZSA9IEZYRklMTF9BTFRFUk5BVEU7DQorICAgICAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQgKyBDSEVDS0JPWF9TSVpFX1NJR05NQVJHSU4sDQorICAgICAgICAgICAgICAgICAgICAgICAgcFJlY3QtPnRvcCArIENIRUNLQk9YX1NJWkVfU0lHTk1BUkdJTiwNCisgICAgICAgICAgICAgICAgICAgICAgICBwUmVjdC0+d2lkdGggLSBDSEVDS0JPWF9TSVpFX1NJR05NQVJHSU4gKiAyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBSZWN0LT5oZWlnaHQgLSBDSEVDS0JPWF9TSVpFX1NJR05NQVJHSU4gKiAyKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisjaWZkZWYgQ0hFQ0tCT1hfRlhHRV9Db29yZGluYXRlc0FkanVzdA0KKyAgICBDRlhfUmVjdEYgcmVjdCgqcFJlY3QpOw0KKyAgICByZWN0LkRlZmxhdGUoMCwgMCwgMSwgMSk7DQorICAgIHBhdGguQWRkRWxsaXBzZShyZWN0KTsNCisjZWxzZQ0KKyAgICBwYXRoLkFkZEVsbGlwc2UoKnBSZWN0KTsNCisjZW5kaWYNCisgICAgaWYgKGJDbGlwU2lnbikgew0KKyAgICAgIGZpbGxNb2RlID0gRlhGSUxMX0FMVEVSTkFURTsNCisjaWZkZWYgQ0hFQ0tCT1hfRlhHRV9Db29yZGluYXRlc0FkanVzdA0KKyAgICAgIENGWF9SZWN0RiBydENsaXAocmVjdCk7DQorI2Vsc2UNCisgICAgICBDRlhfUmVjdEYgcnRDbGlwKCpwUmVjdCk7DQorI2VuZGlmDQorICAgICAgcnRDbGlwLkRlZmxhdGUoQ0hFQ0tCT1hfU0laRV9TSUdOTUFSR0lOIC0gMSwNCisgICAgICAgICAgICAgICAgICAgICBDSEVDS0JPWF9TSVpFX1NJR05NQVJHSU4gLSAxKTsNCisgICAgICBwYXRoLkFkZEVsbGlwc2UocnRDbGlwKTsNCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBpVGhlbWUgPSAxOw0KKyAgaWYgKChkd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2sxKSA9PSBGV0xfUEFSVFNUQVRFX0NLQl9Ib3ZlcmVkKSB7DQorICAgIGlUaGVtZSA9IDI7DQorICB9IGVsc2UgaWYgKChkd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2sxKSA9PQ0KKyAgICAgICAgICAgICBGV0xfUEFSVFNUQVRFX0NLQl9QcmVzc2VkKSB7DQorICAgIGlUaGVtZSA9IDM7DQorICB9IGVsc2UgaWYgKChkd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2sxKSA9PQ0KKyAgICAgICAgICAgICBGV0xfUEFSVFNUQVRFX0NLQl9EaXNhYmxlZCkgew0KKyAgICBpVGhlbWUgPSA0Ow0KKyAgfQ0KKyAgaWYgKChkd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2syKSA9PSBGV0xfUEFSVFNUQVRFX0NLQl9DaGVja2VkKSB7DQorICAgIGlUaGVtZSArPSA0Ow0KKyAgfSBlbHNlIGlmICgoZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMikgPT0NCisgICAgICAgICAgICAgRldMX1BBUlRTVEFURV9DS0JfTmV1dHJhbCkgew0KKyAgICBpVGhlbWUgKz0gODsNCisgIH0NCisgIERyYXdBeGlhbFNoYWRpbmcocEdyYXBoaWNzLCBwUmVjdC0+bGVmdCAtIDEsIHBSZWN0LT50b3AgLSAxLCBmUmlnaHQsIGZCb3R0b20sDQorICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQm94QmtbaVRoZW1lXVswXSwNCisgICAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCb3hCa1tpVGhlbWVdWzFdLCAmcGF0aCwgZmlsbE1vZGUsIHBNYXRyaXgpOw0KK30NCit2b2lkIENGV0xfQ2hlY2tCb3hUUDo6RHJhd1NpZ24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdEJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGWF9SZWN0RiBydFNpZ24oKnBSdEJveCk7DQorICBydFNpZ24uRGVmbGF0ZShDSEVDS0JPWF9TSVpFX1NJR05NQVJHSU4sIENIRUNLQk9YX1NJWkVfU0lHTk1BUkdJTik7DQorICBGWF9EV09SRCBkd0NvbG9yID0gbV9wVGhlbWVEYXRhLT5jbHJTaWduQ2hlY2s7DQorICBGWF9CT09MIGJDaGVjayA9IFRSVUU7DQorICBpZiAoKChkd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2sxKSA9PSBGV0xfUEFSVFNUQVRFX0NLQl9EaXNhYmxlZCkgJiYNCisgICAgICAoKGR3U3RhdGVzICYgRldMX1BBUlRTVEFURV9DS0JfTWFzazIpID09IEZXTF9QQVJUU1RBVEVfQ0tCX0NoZWNrZWQpKSB7DQorICAgIGR3Q29sb3IgPSBtX3BUaGVtZURhdGEtPmNsclNpZ25Cb3JkZXJEaXNhYmxlOw0KKyAgfSBlbHNlIGlmICgoZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0NLQl9NYXNrMikgPT0NCisgICAgICAgICAgICAgRldMX1BBUlRTVEFURV9DS0JfTmV1dHJhbCkgew0KKyAgICBzd2l0Y2ggKGR3U3RhdGVzICYgRldMX1BBUlRTVEFURV9DS0JfTWFzazEpIHsNCisgICAgICBjYXNlIEZXTF9QQVJUU1RBVEVfQ0tCX05vcm1hbDogew0KKyAgICAgICAgYkNoZWNrID0gRkFMU0U7DQorICAgICAgICBkd0NvbG9yID0gbV9wVGhlbWVEYXRhLT5jbHJTaWduTmV1dHJhbE5vcm1hbDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIEZXTF9QQVJUU1RBVEVfQ0tCX0hvdmVyZWQ6IHsNCisgICAgICAgIGJDaGVjayA9IEZBTFNFOw0KKyAgICAgICAgZHdDb2xvciA9IG1fcFRoZW1lRGF0YS0+Y2xyU2lnbk5ldXRyYWxIb3ZlcjsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIEZXTF9QQVJUU1RBVEVfQ0tCX1ByZXNzZWQ6IHsNCisgICAgICAgIGJDaGVjayA9IEZBTFNFLCBkd0NvbG9yID0gbV9wVGhlbWVEYXRhLT5jbHJTaWduTmV1dHJhbFByZXNzZWQ7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0NLQl9EaXNhYmxlZDogew0KKyAgICAgICAgYkNoZWNrID0gRkFMU0UsIGR3Q29sb3IgPSBtX3BUaGVtZURhdGEtPmNsclNpZ25Cb3JkZXJEaXNhYmxlOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAoYkNoZWNrKSB7DQorICAgIEZYX0RXT1JEIGR3U3R5bGUgPSBwV2lkZ2V0LT5HZXRTdHlsZXNFeCgpOw0KKyAgICBzd2l0Y2ggKGR3U3R5bGUgJiBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZU1hc2spIHsNCisgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ2hlY2s6IHsNCisgICAgICAgIERyYXdTaWduQ2hlY2socEdyYXBoaWNzLCAmcnRTaWduLCBkd0NvbG9yLCBwTWF0cml4KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ2lyY2xlOiB7DQorICAgICAgICBydFNpZ24uRGVmbGF0ZSgxLCAxKTsNCisgICAgICAgIERyYXdTaWduQ2lyY2xlKHBHcmFwaGljcywgJnJ0U2lnbiwgZHdDb2xvciwgcE1hdHJpeCk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZUNyb3NzOiB7DQorICAgICAgICBEcmF3U2lnbkNyb3NzKHBHcmFwaGljcywgJnJ0U2lnbiwgZHdDb2xvciwgcE1hdHJpeCk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZURpYW1vbmQ6IHsNCisgICAgICAgIERyYXdTaWduRGlhbW9uZChwR3JhcGhpY3MsICZydFNpZ24sIGR3Q29sb3IsIHBNYXRyaXgpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVTcXVhcmU6IHsNCisgICAgICAgIERyYXdTaWduU3F1YXJlKHBHcmFwaGljcywgJnJ0U2lnbiwgZHdDb2xvciwgcE1hdHJpeCk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZVN0YXI6IHsNCisgICAgICAgIERyYXdTaWduU3RhcihwR3JhcGhpY3MsICZydFNpZ24sIGR3Q29sb3IsIHBNYXRyaXgpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgQXJnYkVuY29kZSgyNTUsIDMzLCAxNjEsIDMzKSwgJnJ0U2lnbiwgcE1hdHJpeCk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9DaGVja0JveFRQOjpEcmF3U2lnbk5ldXRyYWwoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdFNpZ24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICAoKENGWF9SZWN0RiopcFJ0U2lnbiktPkluZmxhdGUoLTMsIC0zKTsNCisgIEZpbGxTb2lsZFJlY3QocEdyYXBoaWNzLCBtX3BUaGVtZURhdGEtPmNsclNpZ25OZXV0cmFsLCBwUnRTaWduLCBwTWF0cml4KTsNCit9DQordm9pZCBDRldMX0NoZWNrQm94VFA6OkRyYXdTaWduQ2hlY2soQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUnRTaWduLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYkZpbGwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgaWYgKCFtX3BDaGVja1BhdGgpIHsNCisgICAgaW5pdENoZWNrUGF0aChwUnRTaWduLT53aWR0aCk7DQorICB9DQorICBDRlhfTWF0cml4IG10Ow0KKyAgbXQuU2V0SWRlbnRpdHkoKTsNCisgIG10LlRyYW5zbGF0ZShwUnRTaWduLT5sZWZ0LCBwUnRTaWduLT50b3ApOw0KKyAgbXQuQ29uY2F0KCpwTWF0cml4KTsNCisgIENGWF9Db2xvciBjckZpbGwoYXJnYkZpbGwpOw0KKyAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICBwR3JhcGhpY3MtPkZpbGxQYXRoKG1fcENoZWNrUGF0aCwgRlhGSUxMX1dJTkRJTkcsICZtdCk7DQorICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9DaGVja0JveFRQOjpEcmF3U2lnbkNpcmNsZShDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUnRTaWduLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGFyZ2JGaWxsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIHBhdGguQWRkRWxsaXBzZSgqcFJ0U2lnbik7DQorICBDRlhfQ29sb3IgY3JGaWxsKGFyZ2JGaWxsKTsNCisgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KKyAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KK30NCit2b2lkIENGV0xfQ2hlY2tCb3hUUDo6RHJhd1NpZ25Dcm9zcyhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdFNpZ24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiRmlsbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIEZYX0ZMT0FUIGZSaWdodCA9IHBSdFNpZ24tPnJpZ2h0KCk7DQorICBGWF9GTE9BVCBmQm90dG9tID0gcFJ0U2lnbi0+Ym90dG9tKCk7DQorICBwYXRoLkFkZExpbmUocFJ0U2lnbi0+bGVmdCwgcFJ0U2lnbi0+dG9wLCBmUmlnaHQsIGZCb3R0b20pOw0KKyAgcGF0aC5BZGRMaW5lKHBSdFNpZ24tPmxlZnQsIGZCb3R0b20sIGZSaWdodCwgcFJ0U2lnbi0+dG9wKTsNCisgIENGWF9Db2xvciBjckZpbGwoYXJnYkZpbGwpOw0KKyAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY3JGaWxsKTsNCisgIHBHcmFwaGljcy0+U2V0TGluZVdpZHRoKDEuMGYpOw0KKyAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCit9DQordm9pZCBDRldMX0NoZWNrQm94VFA6OkRyYXdTaWduRGlhbW9uZChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJ0U2lnbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYkZpbGwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIEZYX0ZMT0FUIGZXaWR0aCA9IHBSdFNpZ24tPndpZHRoOw0KKyAgRlhfRkxPQVQgZkhlaWdodCA9IHBSdFNpZ24tPmhlaWdodDsNCisgIEZYX0ZMT0FUIGZCb3R0b20gPSBwUnRTaWduLT5ib3R0b20oKTsNCisgIHBhdGguTW92ZVRvKHBSdFNpZ24tPmxlZnQgKyBmV2lkdGggLyAyLCBwUnRTaWduLT50b3ApOw0KKyAgcGF0aC5MaW5lVG8ocFJ0U2lnbi0+bGVmdCwgcFJ0U2lnbi0+dG9wICsgZkhlaWdodCAvIDIpOw0KKyAgcGF0aC5MaW5lVG8ocFJ0U2lnbi0+bGVmdCArIGZXaWR0aCAvIDIsIGZCb3R0b20pOw0KKyAgcGF0aC5MaW5lVG8ocFJ0U2lnbi0+cmlnaHQoKSwgcFJ0U2lnbi0+dG9wICsgZkhlaWdodCAvIDIpOw0KKyAgcGF0aC5MaW5lVG8ocFJ0U2lnbi0+bGVmdCArIGZXaWR0aCAvIDIsIHBSdFNpZ24tPnRvcCk7DQorICBDRlhfQ29sb3IgY3JGaWxsKGFyZ2JGaWxsKTsNCisgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KKyAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KK30NCit2b2lkIENGV0xfQ2hlY2tCb3hUUDo6RHJhd1NpZ25TcXVhcmUoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJ0U2lnbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiRmlsbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZYX1BhdGggcGF0aDsNCisgIHBhdGguQ3JlYXRlKCk7DQorICBwYXRoLkFkZFJlY3RhbmdsZShwUnRTaWduLT5sZWZ0LCBwUnRTaWduLT50b3AsIHBSdFNpZ24tPndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgcFJ0U2lnbi0+aGVpZ2h0KTsNCisgIENGWF9Db2xvciBjckZpbGwoYXJnYkZpbGwpOw0KKyAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9DaGVja0JveFRQOjpEcmF3U2lnblN0YXIoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdFNpZ24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGFyZ2JGaWxsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZYX1BhdGggcGF0aDsNCisgIHBhdGguQ3JlYXRlKCk7DQorICBGWF9GTE9BVCBmQm90dG9tID0gcFJ0U2lnbi0+Ym90dG9tKCk7DQorICBGWF9GTE9BVCBmUmFkaXVzID0NCisgICAgICAocFJ0U2lnbi0+dG9wIC0gZkJvdHRvbSkgLyAoMSArIChGWF9GTE9BVCljb3MoRlhfUEkgLyA1LjBmKSk7DQorICBDRlhfUG9pbnRGIHB0Q2VudGVyOw0KKyAgcHRDZW50ZXIuU2V0KChwUnRTaWduLT5sZWZ0ICsgcFJ0U2lnbi0+cmlnaHQoKSkgLyAyLjBmLA0KKyAgICAgICAgICAgICAgIChwUnRTaWduLT50b3AgKyBmQm90dG9tKSAvIDIuMGYpOw0KKyAgRlhfRkxPQVQgcHhbNV0sIHB5WzVdOw0KKyAgRlhfRkxPQVQgZkFuZ2VsID0gRlhfUEkgLyAxMC4wZjsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDU7IGkrKykgew0KKyAgICBweFtpXSA9IHB0Q2VudGVyLnggKyBmUmFkaXVzICogKEZYX0ZMT0FUKWNvcyhmQW5nZWwpOw0KKyAgICBweVtpXSA9IHB0Q2VudGVyLnkgKyBmUmFkaXVzICogKEZYX0ZMT0FUKXNpbihmQW5nZWwpOw0KKyAgICBmQW5nZWwgKz0gRlhfUEkgKiAyIC8gNS4wZjsNCisgIH0NCisgIHBhdGguTW92ZVRvKHB4WzBdLCBweVswXSk7DQorICBpbnQzMl90IG5OZXh0ID0gMDsNCisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IDU7IGorKykgew0KKyAgICBuTmV4dCArPSAyOw0KKyAgICBpZiAobk5leHQgPj0gNSkgew0KKyAgICAgIG5OZXh0IC09IDU7DQorICAgIH0NCisgICAgcGF0aC5MaW5lVG8ocHhbbk5leHRdLCBweVtuTmV4dF0pOw0KKyAgfQ0KKyAgQ0ZYX0NvbG9yIGNyRmlsbChhcmdiRmlsbCk7DQorICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCisgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCit9DQordm9pZCBDRldMX0NoZWNrQm94VFA6OkRyYXdTaWduQm9yZGVyKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUnRCb3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRpc2FibGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIHN3aXRjaCAocFdpZGdldC0+R2V0U3R5bGVzRXgoKSAmIEZXTF9TVFlMRUVYVF9DS0JfU2hhcGVNYXNrKSB7DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9TaGFwZVNvbGlkU3F1YXJlOiB7DQorICAgICAgRHJhd0FubnVsdXNSZWN0KHBHcmFwaGljcywgYkRpc2FibGUgPyBtX3BUaGVtZURhdGEtPmNsclNpZ25Cb3JkZXJEaXNhYmxlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX3BUaGVtZURhdGEtPmNsclNpZ25Cb3JkZXJOb3JtYWwsDQorICAgICAgICAgICAgICAgICAgICAgIHBSdEJveCwgMSwgcE1hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1NoYXBlU3Vua2VuU3F1YXJlOiB7DQorICAgICAgRHJhdzNEUmVjdChwR3JhcGhpY3MsIEZXTFRIRU1FX0VER0VfU3Vua2VuLCBDSEVDS0JPWF9TSVpFX1NJR05CT1JERVIsDQorICAgICAgICAgICAgICAgICBwUnRCb3gsIENIRUNLQk9YX0NPTE9SX0JPWExUMSwgQ0hFQ0tCT1hfQ09MT1JfQk9YTFQyLA0KKyAgICAgICAgICAgICAgICAgQ0hFQ0tCT1hfQ09MT1JfQk9YUkIxLCBDSEVDS0JPWF9DT0xPUl9CT1hSQjIsIHBNYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9TaGFwZVNvbGlkQ2lyY2xlOiB7DQorICAgICAgRHJhd0FubnVsdXNDaXJjbGUocEdyYXBoaWNzLCBiRGlzYWJsZSA/IG1fcFRoZW1lRGF0YS0+Y2xyU2lnbkJvcmRlckRpc2FibGUNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbV9wVGhlbWVEYXRhLT5jbHJTaWduQm9yZGVyTm9ybWFsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBSdEJveCwgMSwgcE1hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1NoYXBlU3Vua2VuQ2lyY2xlOiB7DQorICAgICAgRHJhdzNEQ2lyY2xlKHBHcmFwaGljcywgRldMVEhFTUVfRURHRV9TdW5rZW4sIENIRUNLQk9YX1NJWkVfU0lHTkJPUkRFUiwNCisgICAgICAgICAgICAgICAgICAgcFJ0Qm94LCBDSEVDS0JPWF9DT0xPUl9CT1hMVDEsIENIRUNLQk9YX0NPTE9SX0JPWExUMiwNCisgICAgICAgICAgICAgICAgICAgQ0hFQ0tCT1hfQ09MT1JfQk9YUkIxLCBDSEVDS0JPWF9DT0xPUl9CT1hSQjIsIHBNYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9DaGVja0JveFRQOjpTZXRUaGVtZURhdGEoRlhfRFdPUkQgZHdJRCkgew0KKyAgRlhfRFdPUkQqIHBEYXRhID0gKEZYX0RXT1JEKikmbV9wVGhlbWVEYXRhLT5jbHJCb3hCazsNCisgIGlmIChkd0lEKSB7DQorICAgICpwRGF0YSsrID0gMCwgKnBEYXRhKysgPSAwLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyMjAsIDIyMCwgMjE1KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjQwLCAyMDcpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDgsIDE3OSwgNDgpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAxNzYsIDE3NiwgMTY3KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjQxLCAyMzksIDIzOSksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjIwLCAyMjAsIDIxNSksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI0MCwgMjA3KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjQ4LCAxNzksIDQ4KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMTc2LCAxNzYsIDE2NyksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0MSwgMjM5LCAyMzkpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDIyMCwgMjIwLCAyMTUpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNDAsIDIwNyksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0OCwgMTc5LCA0OCksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDE3NiwgMTc2LCAxNjcpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDEsIDIzOSwgMjM5KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclNpZ25Cb3JkZXJOb3JtYWwgPSBBcmdiRW5jb2RlKDI1NSwgMTU0LCAxNjcsIDExNCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyU2lnbkJvcmRlckRpc2FibGUgPSBBcmdiRW5jb2RlKDI1NSwgMjAyLCAyMDAsIDE4Nyk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyU2lnbkNoZWNrID0gQXJnYkVuY29kZSgyNTUsIDE2NCwgMTgwLCAxMzgpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclNpZ25OZXV0cmFsID0gQXJnYkVuY29kZSgyMjU1LCAyOCwgMTM0LCAyNik7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyU2lnbk5ldXRyYWxOb3JtYWwgPSBBcmdiRW5jb2RlKDI1NSwgMTE0LCAxOTIsIDExMyk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyU2lnbk5ldXRyYWxIb3ZlciA9IEFyZ2JFbmNvZGUoMjU1LCAzMywgMTYxLCAzMyk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyU2lnbk5ldXRyYWxQcmVzc2VkID0gQXJnYkVuY29kZSgyNTUsIDI4LCAxMzQsIDI2KTsNCisgIH0gZWxzZSB7DQorICAgICpwRGF0YSsrID0gMCwgKnBEYXRhKysgPSAwLCAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyMjAsIDIyMCwgMjE1KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjQwLCAyMDcpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDgsIDE3OSwgNDgpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAxNzYsIDE3NiwgMTY3KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjQxLCAyMzksIDIzOSksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjIwLCAyMjAsIDIxNSksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI0MCwgMjA3KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjQ4LCAxNzksIDQ4KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMTc2LCAxNzYsIDE2NyksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0MSwgMjM5LCAyMzkpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDIyMCwgMjIwLCAyMTUpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNDAsIDIwNyksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0OCwgMTc5LCA0OCksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDE3NiwgMTc2LCAxNjcpLA0KKyAgICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNDEsIDIzOSwgMjM5KSwNCisgICAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksDQorICAgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclNpZ25Cb3JkZXJOb3JtYWwgPSBBcmdiRW5jb2RlKDI1NSwgMjgsIDgxLCAxMjgpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclNpZ25Cb3JkZXJEaXNhYmxlID0gQXJnYkVuY29kZSgyNTUsIDIwMiwgMjAwLCAxODcpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclNpZ25DaGVjayA9IEFyZ2JFbmNvZGUoMjU1LCAyOCwgODEsIDEyOCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyU2lnbk5ldXRyYWwgPSBBcmdiRW5jb2RlKDI1NSwgMjgsIDEzNCwgMjYpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclNpZ25OZXV0cmFsTm9ybWFsID0gQXJnYkVuY29kZSgyNTUsIDExNCwgMTkyLCAxMTMpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclNpZ25OZXV0cmFsSG92ZXIgPSBBcmdiRW5jb2RlKDI1NSwgMzMsIDE2MSwgMzMpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclNpZ25OZXV0cmFsUHJlc3NlZCA9IEFyZ2JFbmNvZGUoMjU1LCAyOCwgMTM0LCAyNik7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9DaGVja0JveFRQOjppbml0Q2hlY2tQYXRoKEZYX0ZMT0FUIGZDaGVja0xlbikgew0KKyAgaWYgKCFtX3BDaGVja1BhdGgpIHsNCisgICAgbV9wQ2hlY2tQYXRoID0gbmV3IENGWF9QYXRoOw0KKyAgICBtX3BDaGVja1BhdGgtPkNyZWF0ZSgpOw0KKyAgICBGWF9GTE9BVCBmV2lkdGggPSBDSEVDS0JPWF9TSVpFX1NJR05QQVRIOw0KKyAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gLUNIRUNLQk9YX1NJWkVfU0lHTlBBVEg7DQorICAgIEZYX0ZMT0FUIGZCb3R0b20gPSBDSEVDS0JPWF9TSVpFX1NJR05QQVRIOw0KKyAgICBGWF9GTE9BVCBweDEsIHB5MSwgcHgyLCBweTI7DQorICAgIENGWF9Qb2ludEYgcHQxOw0KKyAgICBwdDEuU2V0KGZXaWR0aCAvIDE1LjBmLCBmQm90dG9tICsgZkhlaWdodCAqIDIgLyA1LjBmKTsNCisgICAgQ0ZYX1BvaW50RiBwdDI7DQorICAgIHB0Mi5TZXQoZldpZHRoIC8gNC41ZiwgZkJvdHRvbSArIGZIZWlnaHQgLyAxNi4wZik7DQorICAgIENGWF9Qb2ludEYgcHQzOw0KKyAgICBwdDMuU2V0KGZXaWR0aCAvIDMuMGYsIGZCb3R0b20pOw0KKyAgICBDRlhfUG9pbnRGIHB0NDsNCisgICAgcHQ0LlNldChmV2lkdGggKiAxNCAvIDE1LjBmLCBmQm90dG9tICsgZkhlaWdodCAqIDE1IC8gMTYuMGYpOw0KKyAgICBDRlhfUG9pbnRGIHB0NTsNCisgICAgcHQ1LlNldChmV2lkdGggLyAzLjZmLCBmQm90dG9tICsgZkhlaWdodCAvIDMuNWYpOw0KKyAgICBDRlhfUG9pbnRGIHB0MTI7DQorICAgIHB0MTIuU2V0KGZXaWR0aCAvIDcuMGYsIGZCb3R0b20gKyBmSGVpZ2h0ICogMiAvIDcuMGYpOw0KKyAgICBDRlhfUG9pbnRGIHB0MjE7DQorICAgIHB0MjEuU2V0KGZXaWR0aCAvIDUuMGYsIGZCb3R0b20gKyBmSGVpZ2h0IC8gNS4wZik7DQorICAgIENGWF9Qb2ludEYgcHQyMzsNCisgICAgcHQyMy5TZXQoZldpZHRoIC8gNC40ZiwgZkJvdHRvbSArIGZIZWlnaHQgKiAwIC8gMTYuMGYpOw0KKyAgICBDRlhfUG9pbnRGIHB0MzI7DQorICAgIHB0MzIuU2V0KGZXaWR0aCAvIDQuMGYsIGZCb3R0b20pOw0KKyAgICBDRlhfUG9pbnRGIHB0MzQ7DQorICAgIHB0MzQuU2V0KGZXaWR0aCAqICgxIC8gNy4wZiArIDcgLyAxNS4wZiksIGZCb3R0b20gKyBmSGVpZ2h0ICogNCAvIDUuMGYpOw0KKyAgICBDRlhfUG9pbnRGIHB0NDM7DQorICAgIHB0NDMuU2V0KGZXaWR0aCAqICgxIC8gNy4wZiArIDcgLyAxNS4wZiksIGZCb3R0b20gKyBmSGVpZ2h0ICogNCAvIDUuMGYpOw0KKyAgICBDRlhfUG9pbnRGIHB0NDU7DQorICAgIHB0NDUuU2V0KGZXaWR0aCAqIDcgLyAxNS4wZiwgZkJvdHRvbSArIGZIZWlnaHQgKiA4IC8gNy4wZik7DQorICAgIENGWF9Qb2ludEYgcHQ1NDsNCisgICAgcHQ1NC5TZXQoZldpZHRoIC8gMy40ZiwgZkJvdHRvbSArIGZIZWlnaHQgLyAzLjVmKTsNCisgICAgQ0ZYX1BvaW50RiBwdDUxOw0KKyAgICBwdDUxLlNldChmV2lkdGggLyAzLjZmLCBmQm90dG9tICsgZkhlaWdodCAvIDQuMGYpOw0KKyAgICBDRlhfUG9pbnRGIHB0MTU7DQorICAgIHB0MTUuU2V0KGZXaWR0aCAvIDMuNWYsIGZCb3R0b20gKyBmSGVpZ2h0ICogMy41ZiAvIDUuMGYpOw0KKyAgICBtX3BDaGVja1BhdGgtPk1vdmVUbyhwdDEueCwgcHQxLnkpOw0KKyAgICBweDEgPSBwdDEyLnggLSBwdDEueDsNCisgICAgcHkxID0gcHQxMi55IC0gcHQxLnk7DQorICAgIHB4MiA9IHB0MjEueCAtIHB0Mi54Ow0KKyAgICBweTIgPSBwdDIxLnkgLSBwdDIueTsNCisgICAgbV9wQ2hlY2tQYXRoLT5CZXppZXJUbyhwdDEueCArIHB4MSAqIEZXTFRIRU1FX0JFWklFUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDEueSArIHB5MSAqIEZXTFRIRU1FX0JFWklFUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDIueCArIHB4MiAqIEZXTFRIRU1FX0JFWklFUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDIueSArIHB5MiAqIEZXTFRIRU1FX0JFWklFUiwgcHQyLngsIHB0Mi55KTsNCisgICAgcHgxID0gcHQyMy54IC0gcHQyLng7DQorICAgIHB5MSA9IHB0MjMueSAtIHB0Mi55Ow0KKyAgICBweDIgPSBwdDMyLnggLSBwdDMueDsNCisgICAgcHkyID0gcHQzMi55IC0gcHQzLnk7DQorICAgIG1fcENoZWNrUGF0aC0+QmV6aWVyVG8ocHQyLnggKyBweDEgKiBGV0xUSEVNRV9CRVpJRVIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQyLnkgKyBweTEgKiBGV0xUSEVNRV9CRVpJRVIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQzLnggKyBweDIgKiBGV0xUSEVNRV9CRVpJRVIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQzLnkgKyBweTIgKiBGV0xUSEVNRV9CRVpJRVIsIHB0My54LCBwdDMueSk7DQorICAgIHB4MSA9IHB0MzQueCAtIHB0My54Ow0KKyAgICBweTEgPSBwdDM0LnkgLSBwdDMueTsNCisgICAgcHgyID0gcHQ0My54IC0gcHQ0Lng7DQorICAgIHB5MiA9IHB0NDMueSAtIHB0NC55Ow0KKyAgICBtX3BDaGVja1BhdGgtPkJlemllclRvKHB0My54ICsgcHgxICogRldMVEhFTUVfQkVaSUVSLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0My55ICsgcHkxICogRldMVEhFTUVfQkVaSUVSLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0NC54ICsgcHgyICogRldMVEhFTUVfQkVaSUVSLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0NC55ICsgcHkyICogRldMVEhFTUVfQkVaSUVSLCBwdDQueCwgcHQ0LnkpOw0KKyAgICBweDEgPSBwdDQ1LnggLSBwdDQueDsNCisgICAgcHkxID0gcHQ0NS55IC0gcHQ0Lnk7DQorICAgIHB4MiA9IHB0NTQueCAtIHB0NS54Ow0KKyAgICBweTIgPSBwdDU0LnkgLSBwdDUueTsNCisgICAgbV9wQ2hlY2tQYXRoLT5CZXppZXJUbyhwdDQueCArIHB4MSAqIEZXTFRIRU1FX0JFWklFUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDQueSArIHB5MSAqIEZXTFRIRU1FX0JFWklFUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDUueCArIHB4MiAqIEZXTFRIRU1FX0JFWklFUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDUueSArIHB5MiAqIEZXTFRIRU1FX0JFWklFUiwgcHQ1LngsIHB0NS55KTsNCisgICAgcHgxID0gcHQ1MS54IC0gcHQ1Lng7DQorICAgIHB5MSA9IHB0NTEueSAtIHB0NS55Ow0KKyAgICBweDIgPSBwdDE1LnggLSBwdDEueDsNCisgICAgcHkyID0gcHQxNS55IC0gcHQxLnk7DQorICAgIG1fcENoZWNrUGF0aC0+QmV6aWVyVG8ocHQ1LnggKyBweDEgKiBGV0xUSEVNRV9CRVpJRVIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQ1LnkgKyBweTEgKiBGV0xUSEVNRV9CRVpJRVIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQxLnggKyBweDIgKiBGV0xUSEVNRV9CRVpJRVIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQxLnkgKyBweTIgKiBGV0xUSEVNRV9CRVpJRVIsIHB0MS54LCBwdDEueSk7DQorICAgIEZYX0ZMT0FUIGZTY2FsZSA9IGZDaGVja0xlbiAvIENIRUNLQk9YX1NJWkVfU0lHTlBBVEg7DQorICAgIENGWF9NYXRyaXggbXQ7DQorICAgIG10LlNldCgxLCAwLCAwLCAxLCAwLCAwKTsNCisgICAgbXQuU2NhbGUoZlNjYWxlLCBmU2NhbGUpOw0KKyAgICBDRlhfUGF0aERhdGEqIHBEYXRhID0gbV9wQ2hlY2tQYXRoLT5HZXRQYXRoRGF0YSgpOw0KKyAgICBwRGF0YS0+VHJhbnNmb3JtKCZtdCk7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy90aGVtZS9jb21ib2JveHRwLmNwcCBiL3hmYS9zcmMvZndsL3NyYy90aGVtZS9jb21ib2JveHRwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmMwMmZhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL2NvbWJvYm94dHAuY3BwCkBAIC0wLDAgKzEsMTUxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2RlZmluZSBGV0xUSEVNRV9DQVBBQ0lUWV9Db21ib0Zvcm1IYW5kbGVyIDguMGYNCitDRldMX0NvbWJvQm94VFA6OkNGV0xfQ29tYm9Cb3hUUCgpIHsNCisgIG1fZHdUaGVtZUlEID0gMDsNCit9DQorQ0ZXTF9Db21ib0JveFRQOjp+Q0ZXTF9Db21ib0JveFRQKCkge30NCitGWF9CT09MIENGV0xfQ29tYm9Cb3hUUDo6SXNWYWxpZFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgaWYgKCFwV2lkZ2V0KQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICByZXR1cm4gcFdpZGdldC0+R2V0Q2xhc3NJRCgpID09IEZXTF9DTEFTU0hBU0hfQ29tYm9Cb3g7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Db21ib0JveFRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcykgew0KKyAgaWYgKCFwUGFyYW1zKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBzd2l0Y2ggKHBQYXJhbXMtPm1faVBhcnQpIHsNCisgICAgY2FzZSBGV0xfUEFSVF9DTUJfQm9yZGVyOiB7DQorICAgICAgRHJhd0JvcmRlcihwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfQ01CX0VkZ2U6IHsNCisgICAgICBEcmF3RWRnZShwUGFyYW1zLT5tX3BHcmFwaGljcywgcFBhcmFtcy0+bV9wV2lkZ2V0LT5HZXRTdHlsZXMoKSwNCisgICAgICAgICAgICAgICAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9DTUJfQmFja2dyb3VuZDogew0KKyAgICAgIENGWF9QYXRoIHBhdGg7DQorICAgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgICBDRlhfUmVjdEYmIHJlY3QgPSBwUGFyYW1zLT5tX3J0UGFydDsNCisgICAgICBwYXRoLkFkZFJlY3RhbmdsZShyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7DQorICAgICAgQ0ZYX0NvbG9yIGNyOw0KKyAgICAgIHN3aXRjaCAocFBhcmFtcy0+bV9kd1N0YXRlcykgew0KKyAgICAgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0NNQl9TZWxlY3RlZDoNCisgICAgICAgICAgY3IgPSBGV0xUSEVNRV9DT0xPUl9CS1NlbGVjdGVkOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgRldMX1BBUlRTVEFURV9DTUJfRGlzYWJsZWQ6DQorICAgICAgICAgIGNyID0gRldMVEhFTUVfQ09MT1JfRURHRVJCMTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBjciA9IDB4RkZGRkZGRkY7DQorICAgICAgfQ0KKyAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyKTsNCisgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfQ01CX0Ryb3BEb3duQnV0dG9uOiB7DQorICAgICAgRHJhd0Ryb3BEb3duQnV0dG9uKHBQYXJhbXMsIHBQYXJhbXMtPm1fZHdTdGF0ZXMsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9DTUJfU3RyZXRjZ0hhbmRsZXI6IHsNCisgICAgICBEcmF3U3RyZXRoSGFuZGxlcihwUGFyYW1zLCAwLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZBTFNFOyB9DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDRldMX0NvbWJvQm94VFA6OkRyYXdTdHJldGhIYW5kbGVyKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZYX1BhdGggcGF0aDsNCisgIHBhdGguQ3JlYXRlKCk7DQorICBwYXRoLkFkZFJlY3RhbmdsZShwUGFyYW1zLT5tX3J0UGFydC5sZWZ0LCBwUGFyYW1zLT5tX3J0UGFydC50b3AsDQorICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX3J0UGFydC53aWR0aCAtIDEsIHBQYXJhbXMtPm1fcnRQYXJ0LmhlaWdodCk7DQorICBDRlhfQ29sb3IgY3IoQXJnYkVuY29kZSgweGZmLCAweGZmLCAwLCAwKSk7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjcik7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KK30NCit2b2lkKiBDRldMX0NvbWJvQm94VFA6OkdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDYXBhY2l0eSkgew0KKyAgaWYgKGR3Q2FwYWNpdHkgPT0gRldMX1dHVENBUEFDSVRZX0NNQl9Db21ib0Zvcm1IYW5kbGVyKSB7DQorICAgIG1fZlZhbHVlID0gRldMVEhFTUVfQ0FQQUNJVFlfQ29tYm9Gb3JtSGFuZGxlcjsNCisgICAgcmV0dXJuICZtX2ZWYWx1ZTsNCisgIH0NCisgIHJldHVybiBDRldMX1dpZGdldFRQOjpHZXRDYXBhY2l0eShwVGhlbWVQYXJ0LCBkd0NhcGFjaXR5KTsNCit9DQorI2lmZGVmIFRIRU1FX1hQU2ltaWxhcg0KK3ZvaWQgQ0ZXTF9Db21ib0JveFRQOjpEcmF3RHJvcERvd25CdXR0b24oQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX05vcm1hbDsNCisgIHN3aXRjaCAoZHdTdGF0ZXMpIHsNCisgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0NNQl9Ob3JtYWw6IHsNCisgICAgICBlU3RhdGUgPSBGV0xUSEVNRV9TVEFURV9Ob3JtYWw7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0NNQl9Ib3ZlcmVkOiB7DQorICAgICAgZVN0YXRlID0gRldMVEhFTUVfU1RBVEVfSG92ZXI7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0NNQl9QcmVzc2VkOiB7DQorICAgICAgZVN0YXRlID0gRldMVEhFTUVfU1RBVEVfUHJlc3NlZDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUU1RBVEVfQ01CX0Rpc2FibGVkOiB7DQorICAgICAgZVN0YXRlID0gRldMVEhFTUVfU1RBVEVfRGlzYWJhbGU7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZGVmYXVsdDoge30NCisgIH0NCisgIERyYXdBcnJvd0J0bihwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LA0KKyAgICAgICAgICAgICAgIEZXTFRIRU1FX0RJUkVDVElPTl9Eb3duLCBlU3RhdGUsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorfQ0KKyNlbHNlDQordm9pZCBDRldMX0NvbWJvQm94VFA6OkRyYXdEcm9wRG93bkJ1dHRvbihDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgRlhfQk9PTCBiUHJlc3NlZCA9ICgocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9DTUJQQVJUU1RBVEVfUHJlc3NlZCkgPT0NCisgICAgICAgICAgICAgICAgICAgICAgRldMX0NNQlBBUlRTVEFURV9QcmVzc2VkKTsNCisgIEZYX0ZMT0FUIGZXaWR0aCA9IGJQcmVzc2VkID8gMS4wZiA6IDIuMGY7DQorICBGV0xUSEVNRV9FREdFIGVUeXBlID0gYlByZXNzZWQgPyBGV0xUSEVNRV9FREdFX0ZsYXQgOiBGV0xUSEVNRV9FREdFX1JhaXNlZDsNCisgIERyYXczRFJlY3QocFBhcmFtcy0+bV9wR3JhcGhpY3MsIGVUeXBlLCBmV2lkdGgsICZwUGFyYW1zLT5tX3J0UGFydCwNCisgICAgICAgICAgICAgRldMVEhFTUVfQ09MT1JfRURHRUxUMSwgRldMVEhFTUVfQ09MT1JfRURHRUxUMiwNCisgICAgICAgICAgICAgRldMVEhFTUVfQ09MT1JfRURHRVJCMSwgRldMVEhFTUVfQ09MT1JfRURHRVJCMiwgcE1hdHJpeCk7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHBQYXJhbXMtPm1fcnRQYXJ0LmxlZnQgKyBmV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX3J0UGFydC50b3AgKyBmV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX3J0UGFydC53aWR0aCAtIDIgKiBmV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX3J0UGFydC5oZWlnaHQgLSAyICogZldpZHRoKTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgQ0ZYX0NvbG9yIGNyRmlsbChGV0xUSEVNRV9DT0xPUl9CYWNrZ3JvdW5kKTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICBGWF9BUkdCIGFyZ2JGaWxsID0gQXJnYkVuY29kZSgyNTUsIDc3LCA5NywgMTMzKTsNCisgIHN3aXRjaCAocFBhcmFtcy0+bV9kd1N0YXRlcyAmIDB4MDMpIHsNCisgICAgY2FzZSBGV0xfQ01CUEFSVFNUQVRFX05vcm1hbDogew0KKyAgICB9DQorICAgIGNhc2UgRldMX0NNQlBBUlRTVEFURV9Ib3ZlcmVkOiB7DQorICAgIH0NCisgICAgY2FzZSBGV0xfQ01CUEFSVFNUQVRFX1ByZXNzZWQ6IHsNCisgICAgICBhcmdiRmlsbCA9IDB4RkYwMDAwMDA7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfQ01CUEFSVFNUQVRFX0Rpc2FibGVkOiB7DQorICAgICAgYXJnYkZpbGwgPSAweEZGRjBGMEYwOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBEcmF3QXJyb3cocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgRldMVEhFTUVfRElSRUNUSU9OX0Rvd24sDQorICAgICAgICAgICAgYXJnYkZpbGwsIGJQcmVzc2VkLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KK30NCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvZGF0ZXRpbWVwaWNrZXJ0cC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvZGF0ZXRpbWVwaWNrZXJ0cC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU3OWVjYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy90aGVtZS9kYXRldGltZXBpY2tlcnRwLmNwcApAQCAtMCwwICsxLDEzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KK0NGV0xfRGF0ZVRpbWVQaWNrZXJUUDo6Q0ZXTF9EYXRlVGltZVBpY2tlclRQKCkgew0KKyAgbV9wVGhlbWVEYXRhID0gbmV3IERUUFRoZW1lRGF0YTsNCisgIGluaXRUaGVtZURhdGEoKTsNCit9DQorQ0ZXTF9EYXRlVGltZVBpY2tlclRQOjp+Q0ZXTF9EYXRlVGltZVBpY2tlclRQKCkgew0KKyAgZGVsZXRlIG1fcFRoZW1lRGF0YTsNCit9DQorRlhfQk9PTCBDRldMX0RhdGVUaW1lUGlja2VyVFA6OklzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIGlmICghcFdpZGdldCkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgcmV0dXJuIHBXaWRnZXQtPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX0RhdGVUaW1lUGlja2VyOw0KK30NCitGWF9CT09MIENGV0xfRGF0ZVRpbWVQaWNrZXJUUDo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMpIHsNCisgIGlmICghcFBhcmFtcykNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgc3dpdGNoIChwUGFyYW1zLT5tX2lQYXJ0KSB7DQorICAgIGNhc2UgRldMX1BBUlRfRFRQX0JvcmRlcjogew0KKyAgICAgIERyYXdCb3JkZXIocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUX0RUUF9FZGdlOiB7DQorICAgICAgRHJhd0VkZ2UocFBhcmFtcy0+bV9wR3JhcGhpY3MsIHBQYXJhbXMtPm1fcFdpZGdldC0+R2V0U3R5bGVzKCksDQorICAgICAgICAgICAgICAgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfRFRQX0Ryb3BEb3duQnV0dG9uOiB7DQorICAgICAgRHJhd0Ryb3BEb3duQnV0dG9uKHBQYXJhbXMsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZGVmYXVsdDoge30NCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCisjaWZkZWYgVEhFTUVfWFBTaW1pbGFyDQordm9pZCBDRldMX0RhdGVUaW1lUGlja2VyVFA6OkRyYXdEcm9wRG93bkJ1dHRvbihDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIEZYX0RXT1JEIGR3U3RhdGVzID0gcFBhcmFtcy0+bV9kd1N0YXRlczsNCisgIGR3U3RhdGVzICY9IDB4MDM7DQorICBGV0xUSEVNRV9TVEFURSBlU3RhdGUgPSBGV0xUSEVNRV9TVEFURV9Ob3JtYWw7DQorICBzd2l0Y2ggKGVTdGF0ZSAmIGR3U3RhdGVzKSB7DQorICAgIGNhc2UgRldMX1BBUlRTVEFURV9EVFBfTm9ybWFsOiB7DQorICAgICAgZVN0YXRlID0gRldMVEhFTUVfU1RBVEVfTm9ybWFsOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRTVEFURV9EVFBfSG92ZXJlZDogew0KKyAgICAgIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX0hvdmVyOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRTVEFURV9EVFBfUHJlc3NlZDogew0KKyAgICAgIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX1ByZXNzZWQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0RUUF9EaXNhYmxlZDogew0KKyAgICAgIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX0Rpc2FiYWxlOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQorICBEcmF3QXJyb3dCdG4ocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwNCisgICAgICAgICAgICAgICBGV0xUSEVNRV9ESVJFQ1RJT05fRG93biwgZVN0YXRlLCBwTWF0cml4KTsNCit9DQorI2Vsc2UNCit2b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXJUUDo6RHJhd0Ryb3BEb3duQnV0dG9uKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgRlhfQk9PTCBiUHJlc3NlZCA9ICgocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfRFRQX1ByZXNzZWQpID09DQorICAgICAgICAgICAgICAgICAgICAgIEZXTF9QQVJUU1RBVEVfRFRQX1ByZXNzZWQpOw0KKyAgRlhfRkxPQVQgZldpZHRoID0gYlByZXNzZWQgPyAxLjBmIDogMi4wZjsNCisgIEZXTFRIRU1FX0VER0UgZVR5cGUgPSBiUHJlc3NlZCA/IEZXTFRIRU1FX0VER0VfRmxhdCA6IEZXTFRIRU1FX0VER0VfUmFpc2VkOw0KKyAgRHJhdzNEUmVjdChwUGFyYW1zLT5tX3BHcmFwaGljcywgZVR5cGUsIGZXaWR0aCwgJnBQYXJhbXMtPm1fcnRQYXJ0LA0KKyAgICAgICAgICAgICBGV0xUSEVNRV9DT0xPUl9FREdFTFQxLCBGV0xUSEVNRV9DT0xPUl9FREdFTFQyLA0KKyAgICAgICAgICAgICBGV0xUSEVNRV9DT0xPUl9FREdFUkIxLCBGV0xUSEVNRV9DT0xPUl9FREdFUkIyLCBwTWF0cml4KTsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocFBhcmFtcy0+bV9ydFBhcnQubGVmdCArIGZXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fcnRQYXJ0LnRvcCArIGZXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fcnRQYXJ0LndpZHRoIC0gMiAqIGZXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fcnRQYXJ0LmhlaWdodCAtIDIgKiBmV2lkdGgpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBDRlhfQ29sb3IgY3JGaWxsKEZXTFRIRU1FX0NPTE9SX0JhY2tncm91bmQpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICBGWF9BUkdCIGFyZ2JGaWxsID0gQXJnYkVuY29kZSgyNTUsIDc3LCA5NywgMTMzKTsNCisgIHN3aXRjaCAocFBhcmFtcy0+bV9kd1N0YXRlcyAmIDB4MDMpIHsNCisgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0RUUF9Ob3JtYWw6IHsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUU1RBVEVfRFRQX0hvdmVyZWQ6IHsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUU1RBVEVfRFRQX1ByZXNzZWQ6IHsNCisgICAgICBhcmdiRmlsbCA9IDB4RkYwMDAwMDA7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVFNUQVRFX0RUUF9EaXNhYmxlZDogew0KKyAgICAgIGFyZ2JGaWxsID0gMHhGRkYwRjBGMDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgRHJhd0Fycm93KHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsIEZXTFRIRU1FX0RJUkVDVElPTl9Eb3duLA0KKyAgICAgICAgICAgIGFyZ2JGaWxsLCBiUHJlc3NlZCwgcE1hdHJpeCk7DQorfQ0KKyNlbmRpZg0KK3ZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlclRQOjppbml0VGhlbWVEYXRhKCkgew0KKyAgRlhfRFdPUkQqIHBEYXRhID0gKEZYX0RXT1JEKikmbV9wVGhlbWVEYXRhLT5Cb3hCa0NvbG9yOw0KKyAgKnBEYXRhKysgPSAwLCAqcERhdGErKyA9IDAsICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDIyMCwgMjIwLCAyMTUpLA0KKyAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksDQorICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI0MCwgMjA3KSwNCisgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0OCwgMTc5LCA0OCksDQorICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAxNzYsIDE3NiwgMTY3KSwNCisgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0MSwgMjM5LCAyMzkpLA0KKyAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksDQorICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwNCisgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDIyMCwgMjIwLCAyMTUpLA0KKyAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksDQorICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI0MCwgMjA3KSwNCisgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0OCwgMTc5LCA0OCksDQorICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAxNzYsIDE3NiwgMTY3KSwNCisgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0MSwgMjM5LCAyMzkpLA0KKyAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksDQorICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwNCisgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDIyMCwgMjIwLCAyMTUpLA0KKyAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksDQorICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI0MCwgMjA3KSwNCisgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0OCwgMTc5LCA0OCksDQorICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAxNzYsIDE3NiwgMTY3KSwNCisgICpwRGF0YSsrID0gQXJnYkVuY29kZSgyNTUsIDI0MSwgMjM5LCAyMzkpLA0KKyAgKnBEYXRhKysgPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksDQorICAqcERhdGErKyA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL3RoZW1lL2VkaXR0cC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvZWRpdHRwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2EzODkyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL2VkaXR0cC5jcHAKQEAgLTAsMCArMSw4NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KK0NGV0xfRWRpdFRQOjpDRldMX0VkaXRUUCgpIHt9DQorQ0ZXTF9FZGl0VFA6On5DRldMX0VkaXRUUCgpIHt9DQorRlhfQk9PTCBDRldMX0VkaXRUUDo6SXNWYWxpZFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgaWYgKCFwV2lkZ2V0KQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICByZXR1cm4gcFdpZGdldC0+R2V0Q2xhc3NJRCgpID09IEZXTF9DTEFTU0hBU0hfRWRpdDsNCit9DQorRlhfQk9PTCBDRldMX0VkaXRUUDo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMpIHsNCisgIHN3aXRjaCAocFBhcmFtcy0+bV9pUGFydCkgew0KKyAgICBjYXNlIEZXTF9QQVJUX0VEVF9Cb3JkZXI6IHsNCisgICAgICBEcmF3Qm9yZGVyKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9FRFRfRWRnZTogew0KKyAgICAgIERyYXdFZGdlKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBwUGFyYW1zLT5tX3BXaWRnZXQtPkdldFN0eWxlcygpLA0KKyAgICAgICAgICAgICAgICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUX0VEVF9CYWNrZ3JvdW5kOiB7DQorICAgICAgaWYgKHBQYXJhbXMtPm1fcFBhdGgpIHsNCisgICAgICAgIENGWF9HcmFwaGljcyogcEdyYXBoaWNzID0gcFBhcmFtcy0+bV9wR3JhcGhpY3M7DQorICAgICAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICAgICAgICBDRlhfQ29sb3IgY3JTZWxlY3RlZChGV0xfR2V0VGhlbWVDb2xvcihtX2R3VGhlbWVJRCkgPT0gMA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gRldMVEhFTUVfQ09MT1JfQktTZWxlY3RlZA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRldMVEhFTUVfQ09MT1JfR3JlZW5fQktTZWxlY3RlZCk7DQorICAgICAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JTZWxlY3RlZCk7DQorICAgICAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKHBQYXJhbXMtPm1fcFBhdGgsIEZYRklMTF9XSU5ESU5HLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBGWF9CT09MIGJTdGF0aWMgPQ0KKyAgICAgICAgICAgIHBQYXJhbXMtPm1fZHdEYXRhID09IEZXTF9QQVJUREFUQV9FRFRfU3RhdGljQmFja2dyb3VuZDsNCisgICAgICAgIENGWF9QYXRoIHBhdGg7DQorICAgICAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICAgICAgcGF0aC5BZGRSZWN0YW5nbGUocFBhcmFtcy0+bV9ydFBhcnQubGVmdCwgcFBhcmFtcy0+bV9ydFBhcnQudG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+bV9ydFBhcnQud2lkdGgsIHBQYXJhbXMtPm1fcnRQYXJ0LmhlaWdodCk7DQorICAgICAgICBDRlhfQ29sb3IgY3IoRldMVEhFTUVfQ09MT1JfQmFja2dyb3VuZCk7DQorICAgICAgICBpZiAoIWJTdGF0aWMpIHsNCisgICAgICAgICAgaWYgKChwUGFyYW1zLT5tX2R3U3RhdGVzICYgRldMX1BBUlRTVEFURV9FRFRfRGlzYWJsZSkgPT0NCisgICAgICAgICAgICAgIEZXTF9QQVJUU1RBVEVfRURUX0Rpc2FibGUpIHsNCisgICAgICAgICAgICBjci5TZXQoRldMVEhFTUVfQ09MT1JfRURHRVJCMSk7DQorICAgICAgICAgIH0gZWxzZSBpZiAoKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX0VEVF9SZWFkT25seSkgPT0NCisgICAgICAgICAgICAgICAgICAgICBGV0xfUEFSVFNUQVRFX0VEVF9SZWFkT25seSkgew0KKyAgICAgICAgICAgIGNyLlNldChBcmdiRW5jb2RlKDI1NSwgMjM2LCAyMzMsIDIxNikpOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGNyLlNldCgweEZGRkZGRkZGKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICAgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjcik7DQorICAgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9FRFRfQ29tYlRleHRMaW5lOiB7DQorICAgICAgRlhfQVJHQiBjciA9IDB4RkYwMDAwMDA7DQorICAgICAgRlhfRkxPQVQgZldpZHRoID0gMS4wZjsNCisgICAgICBDRlhfQ29sb3IgY3JMaW5lKGNyKTsNCisgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNyTGluZSk7DQorICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldExpbmVXaWR0aChmV2lkdGgpOw0KKyAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TdHJva2VQYXRoKHBQYXJhbXMtPm1fcFBhdGgsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZGVmYXVsdDogeyBicmVhazsgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9FZGl0VFA6OkluaXRpYWxpemUoKSB7DQorICBJbml0VFRPKCk7DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6SW5pdGlhbGl6ZSgpOw0KK30NCitGV0xfRVJSIENGV0xfRWRpdFRQOjpGaW5hbGl6ZSgpIHsNCisgIEZpbmFsaXplVFRPKCk7DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6RmluYWxpemUoKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL3RoZW1lL2Zvcm10cC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvZm9ybXRwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzUyNDRkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL2Zvcm10cC5jcHAKQEAgLTAsMCArMSw4ODcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjZGVmaW5lIEZXTFRIRU1FX0NBUEFDSVRZX0NYRm9ybUJvcmRlciAzDQorI2RlZmluZSBGV0xUSEVNRV9DQVBBQ0lUWV9DWUZvcm1Cb3JkZXIgMw0KKyNkZWZpbmUgRldMVEhFTUVfQ0FQQUNJVFlfQ1lOYXJyb3dDYXB0aW9uIDE4DQorI2RlZmluZSBGV0xUSEVNRV9DQVBBQ0lUWV9DWUNhcHRpb24gMjkNCisjZGVmaW5lIEZXTFRIRU1FX0NBUEFDSVRZX0JpZ0ljb25TaXplIDMyDQorI2RlZmluZSBGV0xUSEVNRV9DQVBBQ0lUWV9TbWFsbEljb25TaXplIDE2DQorI2RlZmluZSBGV0xUSEVNRV9DQVBBQ0lUWV9Gb3JtVGV4dENvbG9yIDB4RkZGRkZGRkYNCisjZGVmaW5lIEZXTFRIRU1FX0ZPUk1CVE5fTWFyZ2luIDUNCisjZGVmaW5lIEZXTFRIRU1FX0ZPUk1CVE5fU3BhbiAyDQorI2RlZmluZSBGV0xUSEVNRV9GT1JNQlROX1NpemUgMjENCitDRldMX0Zvcm1UUDo6Q0ZXTF9Gb3JtVFAoKSA6IG1fcEFjdGl2ZUJpdG1hcChOVUxMKSwgbV9wRGVhY3RpdmViaXRtYXAoTlVMTCkgew0KKyAgbV9wVGhlbWVEYXRhID0gbmV3IFNCVGhlbWVEYXRhOw0KKyAgU2V0VGhlbWVEYXRhKDApOw0KKyAgbV9ydERpc0xCb3JkZXIuUmVzZXQoKTsNCisgIG1fcnREaXNSQm9yZGVyLlJlc2V0KCk7DQorICBtX3J0RGlzQkJvcmRlci5SZXNldCgpOw0KKyAgbV9ydERpc0NhcHRpb24uUmVzZXQoKTsNCit9DQorQ0ZXTF9Gb3JtVFA6On5DRldMX0Zvcm1UUCgpIHsNCisgIGlmIChtX3BUaGVtZURhdGEpIHsNCisgICAgZGVsZXRlIG1fcFRoZW1lRGF0YTsNCisgICAgbV9wVGhlbWVEYXRhID0gTlVMTDsNCisgIH0NCit9DQorRldMX0VSUiBDRldMX0Zvcm1UUDo6SW5pdGlhbGl6ZSgpIHsNCisgIEluaXRUVE8oKTsNCisgIEluaXRDYXB0aW9uKFRSVUUpOw0KKyAgSW5pdENhcHRpb24oRkFMU0UpOw0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OkluaXRpYWxpemUoKTsNCit9DQorRldMX0VSUiBDRldMX0Zvcm1UUDo6RmluYWxpemUoKSB7DQorICBGaW5hbGl6ZVRUTygpOw0KKyAgaWYgKG1fcEFjdGl2ZUJpdG1hcCkgew0KKyAgICBkZWxldGUgbV9wQWN0aXZlQml0bWFwOw0KKyAgICBtX3BBY3RpdmVCaXRtYXAgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcERlYWN0aXZlYml0bWFwKSB7DQorICAgIGRlbGV0ZSBtX3BEZWFjdGl2ZWJpdG1hcDsNCisgICAgbV9wRGVhY3RpdmViaXRtYXAgPSBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OkZpbmFsaXplKCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Gb3JtVFA6OklzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIGlmICghcFdpZGdldCkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgRlhfRFdPUkQgZHdIYXNoID0gcFdpZGdldC0+R2V0Q2xhc3NJRCgpOw0KKyAgcmV0dXJuIGR3SGFzaCA9PSBGV0xfQ0xBU1NIQVNIX0Zvcm07DQorfQ0KK0ZYX0RXT1JEIENGV0xfRm9ybVRQOjpTZXRUaGVtZUlEKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3VGhlbWVJRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGlsZHJlbikgew0KKyAgaWYgKG1fcFRoZW1lRGF0YSkgew0KKyAgICBTZXRUaGVtZURhdGEoRldMX0dldFRoZW1lQ29sb3IoZHdUaGVtZUlEKSk7DQorICB9DQorICBJbml0Q2FwdGlvbihUUlVFKTsNCisgIEluaXRDYXB0aW9uKEZBTFNFKTsNCisgIHJldHVybiBDRldMX1dpZGdldFRQOjpTZXRUaGVtZUlEKHBXaWRnZXQsIGR3VGhlbWVJRCwgYkNoaWxkcmVuKTsNCit9DQorRlhfQk9PTCBDRldMX0Zvcm1UUDo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMpIHsNCisgIGlmICghcFBhcmFtcykNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgaW50MzJfdCBpQWN0aXZlID0gMDsNCisgIGlmIChwUGFyYW1zLT5tX2R3U3RhdGVzICYgRldMX1BBUlRTVEFURV9GUk1fSW5hY3RpdmUpIHsNCisgICAgaUFjdGl2ZSA9IDE7DQorICB9DQorICBGV0xUSEVNRV9TVEFURSBlU3RhdGUgPSBGV0xUSEVNRV9TVEFURV9Ob3JtYWw7DQorICBzd2l0Y2ggKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiAweDAzKSB7DQorICAgIGNhc2UgRldMX1BBUlRTVEFURV9GUk1fSG92ZXI6IHsNCisgICAgICBlU3RhdGUgPSBGV0xUSEVNRV9TVEFURV9Ib3ZlcjsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUU1RBVEVfRlJNX1ByZXNzZWQ6IHsNCisgICAgICBlU3RhdGUgPSBGV0xUSEVNRV9TVEFURV9QcmVzc2VkOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRTVEFURV9GUk1fRGlzYWJsZWQ6IHsNCisgICAgICBlU3RhdGUgPSBGV0xUSEVNRV9TVEFURV9EaXNhYmFsZTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KKyAgc3dpdGNoIChwUGFyYW1zLT5tX2lQYXJ0KSB7DQorICAgIGNhc2UgRldMX1BBUlRfRlJNX0JvcmRlcjogew0KKyAgICAgIERyYXdGb3JtQm9yZGVyKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsIGVTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAmcFBhcmFtcy0+bV9tYXRyaXgsIGlBY3RpdmUpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfRlJNX0VkZ2U6IHsNCisgICAgICBEcmF3RWRnZShwUGFyYW1zLT5tX3BHcmFwaGljcywgcFBhcmFtcy0+bV9wV2lkZ2V0LT5HZXRTdHlsZXMoKSwNCisgICAgICAgICAgICAgICAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9GUk1fQmFja2dyb3VuZDogew0KKyAgICAgIEZpbGxCYWNrZ3JvdW5kKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsDQorICAgICAgICAgICAgICAgICAgICAgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUX0ZSTV9DYXB0aW9uOiB7DQorICAgICAgRHJhd0NhcHRpb24ocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICZwUGFyYW1zLT5tX21hdHJpeCwgaUFjdGl2ZSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9GUk1fTmFycm93Q2FwdGlvbjogew0KKyAgICAgIERyYXdOYXJyb3dDYXB0aW9uKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsIGVTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAmcFBhcmFtcy0+bV9tYXRyaXgsIGlBY3RpdmUpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfRlJNX0Nsb3NlQm94OiB7DQorICAgICAgRHJhd0Nsb3NlQm94KHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsIGVTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgJnBQYXJhbXMtPm1fbWF0cml4LCBpQWN0aXZlKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUX0ZSTV9NaW5pbWl6ZUJveDogew0KKyAgICAgIERyYXdNaW5pbWl6ZUJveChwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCBlU3RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICZwUGFyYW1zLT5tX21hdHJpeCwgaUFjdGl2ZSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9GUk1fTWF4aW1pemVCb3g6IHsNCisgICAgICBEcmF3TWF4aW1pemVCb3gocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX2R3RGF0YSwgJnBQYXJhbXMtPm1fbWF0cml4LCBpQWN0aXZlKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUX0ZSTV9JY29uOiB7DQorICAgICAgRHJhd0ljb25JbWFnZShwUGFyYW1zLT5tX3BHcmFwaGljcywgcFBhcmFtcy0+bV9wSW1hZ2UsICZwUGFyYW1zLT5tX3J0UGFydCwNCisgICAgICAgICAgICAgICAgICAgIGVTdGF0ZSwgJnBQYXJhbXMtPm1fbWF0cml4LCBpQWN0aXZlKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Gb3JtVFA6OkRyYXdUZXh0KENGV0xfVGhlbWVUZXh0KiBwUGFyYW1zKSB7DQorICBpZiAoIW1fcFRleHRPdXQpDQorICAgIHJldHVybiBGQUxTRTsNCisgIGlmIChwUGFyYW1zLT5tX2lQYXJ0ID09IEZXTF9QQVJUX0ZSTV9DYXB0aW9uKSB7DQorICAgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcigweEZGRkZGRkZGKTsNCisgIH0gZWxzZSB7DQorICAgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcigweEZGMDAwMDAwKTsNCisgIH0NCisgIHJldHVybiBDRldMX1dpZGdldFRQOjpEcmF3VGV4dChwUGFyYW1zKTsNCit9DQordm9pZCogQ0ZXTF9Gb3JtVFA6OkdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0NhcGFjaXR5KSB7DQorICBGWF9CT09MIGJEZWZQcm8gPSBGQUxTRTsNCisgIEZYX0JPT0wgYkR3b3JkVmFsID0gRkFMU0U7DQorICBzd2l0Y2ggKGR3Q2FwYWNpdHkpIHsNCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfQ1hCb3JkZXI6IHsNCisgICAgICBtX2ZWYWx1ZSA9IEZXTFRIRU1FX0NBUEFDSVRZX0NYRm9ybUJvcmRlcjsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9DWUJvcmRlcjogew0KKyAgICAgIG1fZlZhbHVlID0gRldMVEhFTUVfQ0FQQUNJVFlfQ1lGb3JtQm9yZGVyOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX0ZSTV9DWUNhcHRpb246IHsNCisgICAgICBtX2ZWYWx1ZSA9IEZXTFRIRU1FX0NBUEFDSVRZX0NZQ2FwdGlvbjsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9GUk1fQ1lOYXJyb3dDYXB0aW9uOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9DWUNhcHRpb247DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfVGV4dENvbG9yOiB7DQorICAgICAgYkR3b3JkVmFsID0gVFJVRTsNCisgICAgICBtX2R3VmFsdWUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9Gb3JtVGV4dENvbG9yOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX0ZSTV9CaWdJY29uOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9CaWdJY29uU2l6ZTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9GUk1fU21hbGxJY29uOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9TbWFsbEljb25TaXplOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgYkRlZlBybyA9IFRSVUU7IH0NCisgIH0NCisgIGlmICghYkRlZlBybykgew0KKyAgICBpZiAoYkR3b3JkVmFsKSB7DQorICAgICAgcmV0dXJuICZtX2R3VmFsdWU7DQorICAgIH0NCisgICAgcmV0dXJuICZtX2ZWYWx1ZTsNCisgIH0NCisgIHJldHVybiBDRldMX1dpZGdldFRQOjpHZXRDYXBhY2l0eShwVGhlbWVQYXJ0LCBkd0NhcGFjaXR5KTsNCit9DQorRldMX0VSUiBDRldMX0Zvcm1UUDo6R2V0UGFydFJlY3QoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydFBhcnQpIHsNCisgIHN3aXRjaCAocFRoZW1lUGFydC0+bV9pUGFydCkgew0KKyAgICBjYXNlIEZXTF9QQVJUX0ZSTV9DbG9zZUJveDogew0KKyAgICAgIENhbENsb3NlQm94KHBUaGVtZVBhcnQtPm1fcFdpZGdldCwgcnRQYXJ0KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUX0ZSTV9NYXhpbWl6ZUJveDogew0KKyAgICAgIENhbE1heEJveChwVGhlbWVQYXJ0LT5tX3BXaWRnZXQsIHJ0UGFydCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9GUk1fTWluaW1pemVCb3g6IHsNCisgICAgICBDYWxNaW5Cb3gocFRoZW1lUGFydC0+bV9wV2lkZ2V0LCBydFBhcnQpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfRlJNX0hlYWRUZXh0OiB7DQorICAgICAgQ2FsQ2FwdGlvbihwVGhlbWVQYXJ0LT5tX3BXaWRnZXQsIHJ0UGFydCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9GUk1fSWNvbjogew0KKyAgICAgIENhbEljb24ocFRoZW1lUGFydC0+bV9wV2lkZ2V0LCBydFBhcnQpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtVFA6OkNhbENsb3NlQm94KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBDRlhfUmVjdEYmIHJlY3QpIHsNCisgIEZYX0RXT1JEIGR3U3R5bGVzID0gcFdpZGdldC0+R2V0U3R5bGVzKCk7DQorICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICBwV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0V2lkZ2V0KTsNCisgIHJ0V2lkZ2V0Lk9mZnNldCgtcnRXaWRnZXQubGVmdCwgLXJ0V2lkZ2V0LnRvcCk7DQorICBpZiAoZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfQ2xvc2VCb3gpIHsNCisgICAgcmVjdC5TZXQocnRXaWRnZXQubGVmdCArIEZXTFRIRU1FX0ZPUk1CVE5fTWFyZ2luICsgRldMVEhFTUVfRk9STUJUTl9TcGFuLA0KKyAgICAgICAgICAgICBydFdpZGdldC50b3AgKyBGV0xUSEVNRV9GT1JNQlROX01hcmdpbiwgRldMVEhFTUVfRk9STUJUTl9TaXplLA0KKyAgICAgICAgICAgICBGV0xUSEVNRV9GT1JNQlROX1NpemUpOw0KKyAgfSBlbHNlIHsNCisgICAgcmVjdC5TZXQocnRXaWRnZXQubGVmdCArIEZXTFRIRU1FX0ZPUk1CVE5fTWFyZ2luICsgRldMVEhFTUVfRk9STUJUTl9TcGFuLA0KKyAgICAgICAgICAgICBydFdpZGdldC50b3AgKyBGV0xUSEVNRV9GT1JNQlROX01hcmdpbiwgMCwgMCk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtVFA6OkNhbE1heEJveChJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBGWF9EV09SRCBkd1N0eWxlcyA9IHBXaWRnZXQtPkdldFN0eWxlcygpOw0KKyAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KKyAgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydFdpZGdldCk7DQorICBydFdpZGdldC5PZmZzZXQoLXJ0V2lkZ2V0LmxlZnQsIC1ydFdpZGdldC50b3ApOw0KKyAgaWYgKGR3U3R5bGVzICYgRldMX1dHVFNUWUxFX01heGltaXplQm94KSB7DQorICAgIHJlY3QuU2V0KHJ0V2lkZ2V0LmxlZnQgKyBGV0xUSEVNRV9GT1JNQlROX01hcmdpbiArIEZXTFRIRU1FX0ZPUk1CVE5fU2l6ZSArDQorICAgICAgICAgICAgICAgICBGV0xUSEVNRV9GT1JNQlROX1NwYW4gKiAyLA0KKyAgICAgICAgICAgICBydFdpZGdldC50b3AgKyBGV0xUSEVNRV9GT1JNQlROX01hcmdpbiwgRldMVEhFTUVfRk9STUJUTl9TaXplLA0KKyAgICAgICAgICAgICBGV0xUSEVNRV9GT1JNQlROX1NpemUpOw0KKyAgfSBlbHNlIHsNCisgICAgcmVjdC5TZXQocnRXaWRnZXQubGVmdCArIEZXTFRIRU1FX0ZPUk1CVE5fTWFyZ2luICsgRldMVEhFTUVfRk9STUJUTl9TaXplICsNCisgICAgICAgICAgICAgICAgIEZXTFRIRU1FX0ZPUk1CVE5fU3BhbiAqIDIsDQorICAgICAgICAgICAgIHJ0V2lkZ2V0LnRvcCArIEZXTFRIRU1FX0ZPUk1CVE5fTWFyZ2luLCAwLCAwKTsNCisgIH0NCit9DQordm9pZCBDRldMX0Zvcm1UUDo6Q2FsTWluQm94KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBDRlhfUmVjdEYmIHJlY3QpIHsNCisgIEZYX0RXT1JEIGR3U3R5bGVzID0gcFdpZGdldC0+R2V0U3R5bGVzKCk7DQorICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICBwV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0V2lkZ2V0KTsNCisgIHJ0V2lkZ2V0Lk9mZnNldCgtcnRXaWRnZXQubGVmdCwgLXJ0V2lkZ2V0LnRvcCk7DQorICBpZiAoZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfTWluaW1pemVCb3gpIHsNCisgICAgcmVjdC5TZXQocnRXaWRnZXQubGVmdCArIEZXTFRIRU1FX0ZPUk1CVE5fTWFyZ2luICsNCisgICAgICAgICAgICAgICAgIEZXTFRIRU1FX0ZPUk1CVE5fU2l6ZSAqIDIgKyBGV0xUSEVNRV9GT1JNQlROX1NwYW4gKiAzLA0KKyAgICAgICAgICAgICBydFdpZGdldC50b3AgKyBGV0xUSEVNRV9GT1JNQlROX01hcmdpbiwgRldMVEhFTUVfRk9STUJUTl9TaXplLA0KKyAgICAgICAgICAgICBGV0xUSEVNRV9GT1JNQlROX1NpemUpOw0KKyAgfSBlbHNlIHsNCisgICAgcmVjdC5TZXQocnRXaWRnZXQubGVmdCArIEZXTFRIRU1FX0ZPUk1CVE5fTWFyZ2luICsNCisgICAgICAgICAgICAgICAgIEZXTFRIRU1FX0ZPUk1CVE5fU2l6ZSAqIDIgKyBGV0xUSEVNRV9GT1JNQlROX1NwYW4gKiAzLA0KKyAgICAgICAgICAgICBydFdpZGdldC50b3AgKyBGV0xUSEVNRV9GT1JNQlROX01hcmdpbiwgMCwgMCk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtVFA6OkNhbENhcHRpb24oSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9SZWN0RiYgcmVjdCkgew0KKyAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KKyAgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdChydFdpZGdldCk7DQorICBydFdpZGdldC5PZmZzZXQoLXJ0V2lkZ2V0LmxlZnQsIC1ydFdpZGdldC50b3ApOw0KKyAgcmVjdC5TZXQocnRXaWRnZXQubGVmdCArIEZXTFRIRU1FX0ZPUk1CVE5fTWFyZ2luLA0KKyAgICAgICAgICAgcnRXaWRnZXQudG9wICsgRldMVEhFTUVfRk9STUJUTl9NYXJnaW4gLSAyLA0KKyAgICAgICAgICAgcnRXaWRnZXQud2lkdGggLSBGV0xUSEVNRV9GT1JNQlROX01hcmdpbiAqIDIsDQorICAgICAgICAgICBGV0xUSEVNRV9GT1JNQlROX1NpemUgKyAyICogRldMVEhFTUVfRk9STUJUTl9NYXJnaW4gKyA0KTsNCit9DQordm9pZCBDRldMX0Zvcm1UUDo6Q2FsSWNvbihJRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX1JlY3RGJiByZWN0KSB7fQ0KK3ZvaWQgQ0ZXTF9Gb3JtVFA6OkRyYXdGb3JtQm9yZGVyKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQWN0aXZlKSB7DQorICBDRlhfUmVjdEYgcnQ7DQorICBydC5TZXQocFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsIDEsIHBSZWN0LT5oZWlnaHQpOw0KKyAgRlhfRkxPQVQgZkJvdHRvbSwgZlJpZ2h0Ow0KKyAgZkJvdHRvbSA9IHBSZWN0LT5ib3R0b20oKTsNCisgIGZSaWdodCA9IHBSZWN0LT5yaWdodCgpOw0KKyAgQ0ZYX1BhdGggcGF0aDsNCisgIHBhdGguQ3JlYXRlKCk7DQorICBDRlhfQ29sb3IgY2xyTGluZTsNCisgIHBhdGguQ2xlYXIoKTsNCisgIHBhdGguTW92ZVRvKHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wKTsNCisgIHBhdGguTGluZVRvKHBSZWN0LT5sZWZ0LCBmQm90dG9tIC0gMSk7DQorICBwYXRoLkxpbmVUbyhmUmlnaHQgLSAxLCBmQm90dG9tIC0gMSk7DQorICBwYXRoLkxpbmVUbyhmUmlnaHQgLSAxLCBwUmVjdC0+dG9wKTsNCisgIGNsckxpbmUgPSBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbaUFjdGl2ZV1bMl07DQorICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJMaW5lKTsNCisgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICBwYXRoLkNsZWFyKCk7DQorICBwYXRoLk1vdmVUbyhwUmVjdC0+bGVmdCArIDEsIHBSZWN0LT50b3ApOw0KKyAgcGF0aC5MaW5lVG8ocFJlY3QtPmxlZnQgKyAxLCBmQm90dG9tIC0gMik7DQorICBwYXRoLkxpbmVUbyhmUmlnaHQgLSAyLCBmQm90dG9tIC0gMik7DQorICBwYXRoLkxpbmVUbyhmUmlnaHQgLSAyLCBwUmVjdC0+dG9wKTsNCisgIGNsckxpbmUgPSBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbaUFjdGl2ZV1bMV07DQorICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJMaW5lKTsNCisgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICBwYXRoLkNsZWFyKCk7DQorICBwYXRoLk1vdmVUbyhwUmVjdC0+bGVmdCArIDIsIHBSZWN0LT50b3ApOw0KKyAgcGF0aC5MaW5lVG8ocFJlY3QtPmxlZnQgKyAyLCBmQm90dG9tIC0gMyk7DQorICBwYXRoLkxpbmVUbyhmUmlnaHQgLSAzLCBmQm90dG9tIC0gMyk7DQorICBwYXRoLkxpbmVUbyhmUmlnaHQgLSAzLCBwUmVjdC0+dG9wKTsNCisgIGNsckxpbmUgPSBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbaUFjdGl2ZV1bMF07DQorICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJMaW5lKTsNCisgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICBwYXRoLkNsZWFyKCk7DQorICBwYXRoLk1vdmVUbyhwUmVjdC0+bGVmdCArIDMsIHBSZWN0LT50b3ApOw0KKyAgcGF0aC5MaW5lVG8ocFJlY3QtPmxlZnQgKyAzLCBmQm90dG9tIC0gNCk7DQorICBwYXRoLkxpbmVUbyhmUmlnaHQgLSA0LCBmQm90dG9tIC0gNCk7DQorICBwYXRoLkxpbmVUbyhmUmlnaHQgLSA0LCBwUmVjdC0+dG9wKTsNCisgIGNsckxpbmUgPSBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbaUFjdGl2ZV1bNF07DQorICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJMaW5lKTsNCisgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICBtX3J0RGlzTEJvcmRlci5TZXQocFJlY3QtPmxlZnQsIHBSZWN0LT50b3AgKyAyOSwgNCwgcFJlY3QtPmhlaWdodCAtIDI5KTsNCisgIG1fcnREaXNSQm9yZGVyLlNldChwUmVjdC0+cmlnaHQoKSAtIDQsIHBSZWN0LT50b3AgKyAyOSwgNCwNCisgICAgICAgICAgICAgICAgICAgICBwUmVjdC0+aGVpZ2h0IC0gMjkpOw0KKyAgbV9ydERpc0JCb3JkZXIuU2V0KHBSZWN0LT5sZWZ0LCBwUmVjdC0+Ym90dG9tKCkgLSA0LCBwUmVjdC0+d2lkdGgsIDQpOw0KKyAgbV9ydERpc0NhcHRpb24uU2V0KHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCBwUmVjdC0+d2lkdGgsIDI5KTsNCit9DQordm9pZCBDRldMX0Zvcm1UUDo6RHJhd0NhcHRpb24oQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlBY3RpdmUpIHsNCisgIENGWF9SZWN0RiBydDsNCisgIEZYX0ZMT0FUIGZCb3R0b20sIGZSaWdodDsNCisgIGZCb3R0b20gPSBwUmVjdC0+Ym90dG9tKCk7DQorICBmUmlnaHQgPSBwUmVjdC0+cmlnaHQoKTsNCisgIHJ0LlNldChwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgcFJlY3QtPndpZHRoLCAxKTsNCisgIEZpbGxTb2lsZFJlY3QocEdyYXBoaWNzLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wW2lBY3RpdmVdWzBdLCAmcnQsDQorICAgICAgICAgICAgICAgIHBNYXRyaXgpOw0KKyAgcnQuT2Zmc2V0KDAsIDEpOw0KKyAgRmlsbFNvaWxkUmVjdChwR3JhcGhpY3MsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VUb3BbaUFjdGl2ZV1bMV0sICZydCwNCisgICAgICAgICAgICAgICAgcE1hdHJpeCk7DQorICBydC5PZmZzZXQoMCwgMSk7DQorICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVRvcFtpQWN0aXZlXVsyXSwgJnJ0LA0KKyAgICAgICAgICAgICAgICBwTWF0cml4KTsNCisgIHJ0LlNldChwUmVjdC0+bGVmdCwgcFJlY3QtPmJvdHRvbSgpIC0gMSwgcFJlY3QtPndpZHRoLCAxKTsNCisgIEZpbGxTb2lsZFJlY3QocEdyYXBoaWNzLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tW2lBY3RpdmVdWzJdLCAmcnQsDQorICAgICAgICAgICAgICAgIHBNYXRyaXgpOw0KKyAgcnQuT2Zmc2V0KDAsIC0xKTsNCisgIEZpbGxTb2lsZFJlY3QocEdyYXBoaWNzLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tW2lBY3RpdmVdWzFdLCAmcnQsDQorICAgICAgICAgICAgICAgIHBNYXRyaXgpOw0KKyAgcnQuU2V0KHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCAxLCBwUmVjdC0+aGVpZ2h0KTsNCisgIEZpbGxTb2lsZFJlY3QocEdyYXBoaWNzLCBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFtpQWN0aXZlXVsyXSwgJnJ0LA0KKyAgICAgICAgICAgICAgICBwTWF0cml4KTsNCisgIHJ0LlNldChwUmVjdC0+bGVmdCArIDEsIHBSZWN0LT50b3AgKyAxLCAxLCBmQm90dG9tIC0gMSk7DQorICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbaUFjdGl2ZV1bMV0sICZydCwNCisgICAgICAgICAgICAgICAgcE1hdHJpeCk7DQorICBydC5TZXQocFJlY3QtPmxlZnQgKyAyLCBwUmVjdC0+dG9wICsgMiwgMSwgZkJvdHRvbSAtIDIpOw0KKyAgRmlsbFNvaWxkUmVjdChwR3JhcGhpY3MsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VMZWZ0W2lBY3RpdmVdWzBdLCAmcnQsDQorICAgICAgICAgICAgICAgIHBNYXRyaXgpOw0KKyAgcnQuU2V0KGZSaWdodCAtIDEsIHBSZWN0LT50b3AsIHBSZWN0LT53aWR0aCwgcFJlY3QtPmhlaWdodCk7DQorICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0W2lBY3RpdmVdWzJdLCAmcnQsDQorICAgICAgICAgICAgICAgIHBNYXRyaXgpOw0KKyAgcnQuU2V0KGZSaWdodCAtIDIsIHBSZWN0LT50b3AgKyAxLCAxLCBmQm90dG9tIC0gMSk7DQorICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0W2lBY3RpdmVdWzFdLCAmcnQsDQorICAgICAgICAgICAgICAgIHBNYXRyaXgpOw0KKyAgcnQuU2V0KGZSaWdodCAtIDMsIHBSZWN0LT50b3AgKyAyLCAxLCBmQm90dG9tIC0gMik7DQorICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0W2lBY3RpdmVdWzBdLCAmcnQsDQorICAgICAgICAgICAgICAgIHBNYXRyaXgpOw0KKyAgQ0ZYX1JlY3RGIHJlY3QoKnBSZWN0KTsNCisgIHJlY3QuU2V0KHJlY3QubGVmdCArIDMsIHJlY3QudG9wICsgMywgcmVjdC53aWR0aCAtIDYsIHJlY3QuaGVpZ2h0IC0gNSk7DQorICBpZiAoaUFjdGl2ZSA9PSAwKSB7DQorICAgIHBHcmFwaGljcy0+U3RyZXRjaEltYWdlKG1fcEFjdGl2ZUJpdG1hcCwgcmVjdCwgcE1hdHJpeCk7DQorICB9IGVsc2Ugew0KKyAgICBwR3JhcGhpY3MtPlN0cmV0Y2hJbWFnZShtX3BEZWFjdGl2ZWJpdG1hcCwgcmVjdCwgcE1hdHJpeCk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtVFA6OkRyYXdOYXJyb3dDYXB0aW9uKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQWN0aXZlKSB7fQ0KK3ZvaWQgQ0ZXTF9Gb3JtVFA6OkRyYXdDbG9zZUJveChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlBY3RpdmUpIHsNCisgIEZYX0ZMT0FUIGZSaWdodCA9IHBSZWN0LT5yaWdodCgpOw0KKyAgRlhfRkxPQVQgZkJvdHRvbSA9IHBSZWN0LT5ib3R0b20oKTsNCisgIEZYX0ZMT0FUIGZXaWR0aCA9IHBSZWN0LT53aWR0aDsNCisgIEZYX0ZMT0FUIGZIZWlnaHQgPSBwUmVjdC0+aGVpZ2h0Ow0KKyAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgQ0ZYX1JlY3RGIHJ0KCpwUmVjdCk7DQorICBwR3JhcGhpY3MtPlNldExpbmVXaWR0aCgxLjBmKTsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCArIDEsIHJ0LnRvcCwgZldpZHRoIC0gMiwgMSk7DQorICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0LCBydC50b3AgKyAxLCAxLCBmSGVpZ2h0IC0gMik7DQorICBwYXRoLkFkZFJlY3RhbmdsZShmUmlnaHQgLSAxLCBydC50b3AgKyAxLCAxLCBmSGVpZ2h0IC0gMik7DQorICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0ICsgMSwgZkJvdHRvbSAtIDEsIGZXaWR0aCAtIDIsIDEpOw0KKyAgQ0ZYX0NvbG9yIGNyRmlsbDsNCisgIGNyRmlsbCA9IG1fcFRoZW1lRGF0YS0+Y2xyQnRuRWRnZU91dFtpQWN0aXZlXTsNCisgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KKyAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgcGF0aC5DbGVhcigpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCArIDEsIHJ0LnRvcCArIDEsIDEsIDEpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUoZlJpZ2h0IC0gMiwgcnQudG9wICsgMSwgMSwgMSk7DQorICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0ICsgMSwgZkJvdHRvbSAtIDIsIDEsIDEpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUoZlJpZ2h0IC0gMiwgZkJvdHRvbSAtIDIsIDEsIDEpOw0KKyAgY3JGaWxsID0gbV9wVGhlbWVEYXRhLT5jbHJCdG5Db3JuZXJMaWdodFtpQWN0aXZlXVtlU3RhdGUgLSAxXTsNCisgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KKyAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgcGF0aC5DbGVhcigpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCArIDIsIHJ0LnRvcCArIDEsIGZXaWR0aCAtIDQsIDEpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCArIDEsIHJ0LnRvcCArIDIsIDEsIGZIZWlnaHQgLSA0KTsNCisgIGNyRmlsbCA9IG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VMaWdodFtpQWN0aXZlXVtlU3RhdGUgLSAxXTsNCisgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KKyAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgcGF0aC5DbGVhcigpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUoZlJpZ2h0IC0gMiwgcnQudG9wICsgMiwgMSwgZkhlaWdodCAtIDQpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCArIDIsIGZCb3R0b20gLSAyLCBmV2lkdGggLSA0LCAxKTsNCisgIGNyRmlsbCA9IG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VEYXJrW2lBY3RpdmVdW2VTdGF0ZSAtIDFdOw0KKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICBwYXRoLkNsZWFyKCk7DQorICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCArIDIsIHBSZWN0LT50b3AgKyAyLCBmV2lkdGggLSA0LCBmSGVpZ2h0IC0gNCk7DQorICBEcmF3QXhpYWxTaGFkaW5nKHBHcmFwaGljcywgcFJlY3QtPmxlZnQgKyAyLCBwUmVjdC0+dG9wICsgMiwgZlJpZ2h0IC0gMiwNCisgICAgICAgICAgICAgICAgICAgZkJvdHRvbSAtIDIsDQorICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLU3RhcnRbaUFjdGl2ZV1bZVN0YXRlIC0gMV0sDQorICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLRW5kW2lBY3RpdmVdW2VTdGF0ZSAtIDFdLCAmcGF0aCwNCisgICAgICAgICAgICAgICAgICAgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgQ0ZYX1JlY3RGIHJ0WCgqcFJlY3QpOw0KKyAgcnRYLkluZmxhdGUoLTUsIC01KTsNCisgIHBhdGguQ2xlYXIoKTsNCisgIEZYX0ZMT0FUIGZydFhSaWdodCA9IHJ0WC5yaWdodCgpOw0KKyAgRlhfRkxPQVQgZnJ0WEJvdHRvbSA9IHJ0WC5ib3R0b20oKTsNCisgIHBhdGguQWRkTGluZShydFgubGVmdCwgcnRYLnRvcCArIDEsIGZydFhSaWdodCAtIDEsIGZydFhCb3R0b20pOw0KKyAgcGF0aC5BZGRMaW5lKHJ0WC5sZWZ0LCBydFgudG9wLCBmcnRYUmlnaHQsIGZydFhCb3R0b20pOw0KKyAgcGF0aC5BZGRMaW5lKHJ0WC5sZWZ0ICsgMSwgcnRYLnRvcCwgZnJ0WFJpZ2h0LCBmcnRYQm90dG9tIC0gMSk7DQorICBwYXRoLkFkZExpbmUocnRYLmxlZnQsIGZydFhCb3R0b20gLSAxLCBmcnRYUmlnaHQgLSAxLCBydFgudG9wKTsNCisgIHBhdGguQWRkTGluZShydFgubGVmdCwgZnJ0WEJvdHRvbSwgZnJ0WFJpZ2h0LCBydFgudG9wKTsNCisgIHBhdGguQWRkTGluZShydFgubGVmdCArIDEsIGZydFhCb3R0b20sIGZydFhSaWdodCwgcnRYLnRvcCArIDEpOw0KKyAgQ0ZYX0NvbG9yIGNsckxpbmUoMHhmZmZmZmZmZik7DQorICBwR3JhcGhpY3MtPlNldExpbmVXaWR0aCgxLjBmKTsNCisgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNsckxpbmUpOw0KKyAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCit9DQordm9pZCBDRldMX0Zvcm1UUDo6RHJhd01pbk1heEJveENvbW1vbihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQWN0aXZlKSB7DQorICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBGWF9GTE9BVCBmUmlnaHQgPSBwUmVjdC0+cmlnaHQoKTsNCisgIEZYX0ZMT0FUIGZCb3R0b20gPSBwUmVjdC0+Ym90dG9tKCk7DQorICBGWF9GTE9BVCBmV2lkdGggPSBwUmVjdC0+d2lkdGg7DQorICBGWF9GTE9BVCBmSGVpZ2h0ID0gcFJlY3QtPmhlaWdodDsNCisgIENGWF9SZWN0RiBydCgqcFJlY3QpOw0KKyAgcEdyYXBoaWNzLT5TZXRMaW5lV2lkdGgoMS4wZik7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQgKyAxLCBydC50b3AsIGZXaWR0aCAtIDIsIDEpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCwgcnQudG9wICsgMSwgMSwgZkhlaWdodCAtIDIpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUoZlJpZ2h0IC0gMSwgcnQudG9wICsgMSwgMSwgZkhlaWdodCAtIDIpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCArIDEsIGZCb3R0b20gLSAxLCBmV2lkdGggLSAyLCAxKTsNCisgIENGWF9Db2xvciBjckZpbGw7DQorICBjckZpbGwgPSBtX3BUaGVtZURhdGEtPmNsckJ0bkVkZ2VPdXRbaUFjdGl2ZV07DQorICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCisgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgIHBhdGguQ2xlYXIoKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQgKyAxLCBydC50b3AgKyAxLCAxLCAxKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKGZSaWdodCAtIDIsIHJ0LnRvcCArIDEsIDEsIDEpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCArIDEsIGZCb3R0b20gLSAyLCAxLCAxKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKGZSaWdodCAtIDIsIGZCb3R0b20gLSAyLCAxLCAxKTsNCisgIGNyRmlsbCA9IG1fcFRoZW1lRGF0YS0+Y2xyQnRuQ29ybmVyTGlnaHRbaUFjdGl2ZV1bZVN0YXRlIC0gMV07DQorICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCisgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgIHBhdGguQ2xlYXIoKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQgKyAyLCBydC50b3AgKyAxLCBmV2lkdGggLSA0LCAxKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQgKyAxLCBydC50b3AgKyAyLCAxLCBmSGVpZ2h0IC0gNCk7DQorICBjckZpbGwgPSBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZUxpZ2h0W2lBY3RpdmVdW2VTdGF0ZSAtIDFdOw0KKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICBwYXRoLkNsZWFyKCk7DQorICBwYXRoLkFkZFJlY3RhbmdsZShmUmlnaHQgLSAyLCBydC50b3AgKyAyLCAxLCBmSGVpZ2h0IC0gNCk7DQorICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0ICsgMiwgZkJvdHRvbSAtIDIsIGZXaWR0aCAtIDQsIDEpOw0KKyAgY3JGaWxsID0gbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VEYXJrW2lBY3RpdmVdW2VTdGF0ZSAtIDFdOw0KKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICBwYXRoLkNsZWFyKCk7DQorICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCArIDIsIHBSZWN0LT50b3AgKyAyLCBmV2lkdGggLSA0LCBmSGVpZ2h0IC0gNCk7DQorICBEcmF3QXhpYWxTaGFkaW5nKHBHcmFwaGljcywgcFJlY3QtPmxlZnQgKyAyLCBwUmVjdC0+dG9wICsgMiwgZlJpZ2h0IC0gMiwNCisgICAgICAgICAgICAgICAgICAgZkJvdHRvbSAtIDIsDQorICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS1N0YXJ0W2lBY3RpdmVdW2VTdGF0ZSAtIDFdLA0KKyAgICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktFbmRbaUFjdGl2ZV1bZVN0YXRlIC0gMV0sICZwYXRoLA0KKyAgICAgICAgICAgICAgICAgICBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorfQ0KK3ZvaWQgQ0ZXTF9Gb3JtVFA6OkRyYXdNaW5pbWl6ZUJveChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlBY3RpdmUpIHsNCisgIERyYXdNaW5NYXhCb3hDb21tb24ocEdyYXBoaWNzLCBwUmVjdCwgZVN0YXRlLCBwTWF0cml4KTsNCisgIENGWF9SZWN0RiBydE1pbjsNCisgIHJ0TWluLlNldChwUmVjdC0+bGVmdCArIDUsIHBSZWN0LT50b3AgKyAxMywgcFJlY3QtPndpZHRoIC0gMTQsDQorICAgICAgICAgICAgcFJlY3QtPmhlaWdodCAtIDE4KTsNCisgIEZpbGxTb2lsZFJlY3QocEdyYXBoaWNzLCAweEZGRkZGRkZGLCAmcnRNaW4sIHBNYXRyaXgpOw0KK30NCit2b2lkIENGV0xfRm9ybVRQOjpEcmF3TWF4aW1pemVCb3goQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTWF4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlBY3RpdmUpIHsNCisgIERyYXdNaW5NYXhCb3hDb21tb24ocEdyYXBoaWNzLCBwUmVjdCwgZVN0YXRlLCBwTWF0cml4KTsNCisgIEZYX0ZMT0FUIGZXaWR0aCA9IHBSZWN0LT53aWR0aDsNCisgIEZYX0ZMT0FUIGZIZWlnaHQgPSBwUmVjdC0+aGVpZ2h0Ow0KKyAgaWYgKGJNYXgpIHsNCisgICAgQ0ZYX1BhdGggcGF0aDsNCisgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgcGF0aC5BZGRMaW5lKHBSZWN0LT5sZWZ0ICsgNywgcFJlY3QtPnRvcCArIDYsIHBSZWN0LT5sZWZ0ICsgMTQsDQorICAgICAgICAgICAgICAgICBwUmVjdC0+dG9wICsgNik7DQorICAgIHBhdGguQWRkTGluZShwUmVjdC0+bGVmdCArIDQsIHBSZWN0LT50b3AgKyA5LCBwUmVjdC0+bGVmdCArIDExLA0KKyAgICAgICAgICAgICAgICAgcFJlY3QtPnRvcCArIDkpOw0KKyAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICAgIHBHcmFwaGljcy0+U2V0TGluZVdpZHRoKDIpOw0KKyAgICBDRlhfQ29sb3IgY3JTdHJva2UoMHhGRkZGRkZGRik7DQorICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNyU3Ryb2tlKTsNCisgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgICAgcEdyYXBoaWNzLT5TZXRMaW5lV2lkdGgoMSk7DQorICAgIHBhdGguQ2xlYXIoKTsNCisgICAgcGF0aC5BZGRMaW5lKHBSZWN0LT5sZWZ0ICsgNCwgcFJlY3QtPnRvcCArIDEwLCBwUmVjdC0+bGVmdCArIDQsDQorICAgICAgICAgICAgICAgICBwUmVjdC0+dG9wICsgMTQpOw0KKyAgICBwYXRoLkFkZExpbmUocFJlY3QtPmxlZnQgKyAxMCwgcFJlY3QtPnRvcCArIDEwLCBwUmVjdC0+bGVmdCArIDEwLA0KKyAgICAgICAgICAgICAgICAgcFJlY3QtPnRvcCArIDE0KTsNCisgICAgcGF0aC5BZGRMaW5lKHBSZWN0LT5sZWZ0ICsgMTMsIHBSZWN0LT50b3AgKyA3LCBwUmVjdC0+bGVmdCArIDEzLA0KKyAgICAgICAgICAgICAgICAgcFJlY3QtPnRvcCArIDExKTsNCisgICAgcGF0aC5BZGRMaW5lKHBSZWN0LT5sZWZ0ICsgNCwgcFJlY3QtPnRvcCArIDE0LCBwUmVjdC0+bGVmdCArIDEwLA0KKyAgICAgICAgICAgICAgICAgcFJlY3QtPnRvcCArIDE0KTsNCisgICAgcGF0aC5BZGRMaW5lKHBSZWN0LT5sZWZ0ICsgMTIsIHBSZWN0LT50b3AgKyAxMSwgcFJlY3QtPmxlZnQgKyAxMiwNCisgICAgICAgICAgICAgICAgIHBSZWN0LT50b3AgKyAxMSk7DQorICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgIH0gZWxzZSB7DQorICAgIENGWF9SZWN0RiBydE1heCgqcFJlY3QpOw0KKyAgICBydE1heC5JbmZsYXRlKC01LCAtNSk7DQorICAgIENGWF9QYXRoIHBhdGg7DQorICAgIHBhdGguQ3JlYXRlKCk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0ICsgNSwgcFJlY3QtPnRvcCArIDUsIGZXaWR0aCAtIDEwLA0KKyAgICAgICAgICAgICAgICAgICAgICBmSGVpZ2h0IC0gMTApOw0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCArIDYsIHBSZWN0LT50b3AgKyA4LCBmV2lkdGggLSAxMiwNCisgICAgICAgICAgICAgICAgICAgICAgZkhlaWdodCAtIDE0KTsNCisgICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICBDRlhfQ29sb3IgY3JGaWxsKDB4RkZGRkZGRkYpOw0KKyAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCisgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX0FMVEVSTkFURSwgcE1hdHJpeCk7DQorICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgIH0NCit9DQordm9pZCBDRldMX0Zvcm1UUDo6RHJhd0ljb25JbWFnZShDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcERJQml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlBY3RpdmUpIHsNCisgIHBHcmFwaGljcy0+U3RyZXRjaEltYWdlKHBESUJpdG1hcCwgKnBSZWN0LCBwTWF0cml4KTsNCit9DQordm9pZCBDRldMX0Zvcm1UUDo6U2V0VGhlbWVEYXRhKEZYX0RXT1JEIGR3SUQpIHsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSA9IEFyZ2JFbmNvZGUoMHg2NSwgMjU1LCAyNTUsIDI1NSk7DQorICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS1N0YXJ0WzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAyNDAsIDE2NiwgMTQ4KTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLRW5kWzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAyMjgsIDYxLCA1KTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLU3RhcnRbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDI1NSwgMTg0LCAxNzYpOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktFbmRbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDI1MiwgMTA3LCA3MSk7DQorICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS1N0YXJ0WzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAxNDEsIDQ0LCAyMCk7DQorICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS0VuZFswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjAyLCA3MiwgMzMpOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZUxpZ2h0WzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAyNTUsIDEyMiwgMTA3KTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VEYXJrWzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAyMTgsIDc3LCA1NCk7DQorICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlTGlnaHRbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDI1NSwgOTMsIDc0KTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VEYXJrWzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAyMTgsIDc0LCA1MSk7DQorICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlTGlnaHRbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE5MSwgNjEsIDI4KTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VEYXJrWzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCA5MywgMzAsIDEzKTsNCisgIGlmIChkd0lEKSB7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAxOTQsIDIwNSwgMTQ5KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE3MCwgMTg0LCAxMzEpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1swXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTY4LCAxODIsIDEyOCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzBdWzNdID0gQXJnYkVuY29kZSgweGZmLCAxOTQsIDIwNSwgMTQ5KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDExNywgMTQxLCA5NCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VMZWZ0WzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAxMzksIDE2MSwgMTA1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE3MSwgMTg5LCAxMzMpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE1NSwgMTc1LCAxMjUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDEyOCwgMTQ2LCAxMDMpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDk0LCAxMTgsIDc5KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVRvcFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTM5LCAxNjEsIDEwNSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VUb3BbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIzNCwgMjQ1LCAyMDEpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wWzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAxOTQsIDIwNSwgMTQ5KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUJvdHRvbVswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTc1LCAxODksIDEzMyk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VCb3R0b21bMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE1MywgMTY4LCAxMjEpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tWzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAxNTAsIDE2OCwgMTAzKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLU3RhcnRbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE4MiwgMTk1LCAxNjIpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktFbmRbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDEyOCwgMTQ0LCA4NCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS1N0YXJ0WzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAyMzQsIDI0MSwgMjA4KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLRW5kWzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAxNjksIDE4NiwgMTEyKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLU3RhcnRbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE5OSwgMTk5LCAxOTApOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktFbmRbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDEzMywgMTQ4LCA4OCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlTGlnaHRbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE2MywgMTc2LCAxMzcpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZURhcmtbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDExOCwgMTM1LCA4Myk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlTGlnaHRbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE1NCwgMTc0LCAxMDUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZURhcmtbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE1NCwgMTc0LCAxMDUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZUxpZ2h0WzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAxNzIsIDE5MywgMTIzKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VEYXJrWzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAxNTQsIDE3NCwgMTA1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Db3JuZXJMaWdodFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjIwLCAyMjAsIDIyMCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQ29ybmVyTGlnaHRbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDI1NSwgMjU1LCAyNTUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkNvcm5lckxpZ2h0WzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAyMjUsIDIyNSwgMjI1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5FZGdlT3V0WzBdID0gQXJnYkVuY29kZSgweGZmLCAyNTUsIDI1NSwgMjU1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAxMTcsIDE0MSwgOTQpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDEzOSwgMTYxLCAxMDUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE3MSwgMTg5LCAxMzMpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bM10gPSBBcmdiRW5jb2RlKDB4ZmYsIDE2NCwgMTc4LCAxMjcpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMF1bNF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDI1NSwgMjU1LCAyNTUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJMaWdodFswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTcxLCAxODksIDEzMyk7DQorICB9IGVsc2Ugew0KKyAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1swXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMywgMTE0LCAyNTUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1swXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgODUsIDIyNik7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAwLCA4NSwgMjI2KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMF1bM10gPSBBcmdiRW5jb2RlKDB4ZmYsIDMsIDExNCwgMjU1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDAsIDMyLCAyMDApOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgNjEsIDIyMCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VMZWZ0WzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAwLCA1NCwgMjEwKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0WzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAwLCA1NiwgMjM0KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0WzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAwLCA1MCwgMTkzKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0WzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAwLCAxOSwgMTM5KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVRvcFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgODgsIDIzOCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VUb3BbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDYzLCAxNTEsIDI1NSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VUb3BbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDMsIDExNCwgMjU1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUJvdHRvbVswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgOTYsIDI1Mik7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VCb3R0b21bMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDYzLCAxNTEsIDI1NSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VCb3R0b21bMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDAsIDY3LCAyMDcpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktTdGFydFswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgNDksIDExMik7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS0VuZFswXVsyXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgODcsIDE4OCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS1N0YXJ0WzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAxNTQsIDE4MywgMjUwKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLRW5kWzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAxNywgMTEwLCAyNDgpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktTdGFydFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTY0LCAxOTQsIDI1NSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS0VuZFswXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjksIDE1OCwgMjU1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VMaWdodFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgNjgsIDEyMCwgMjQ1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VEYXJrWzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAyNCwgNzIsIDE4Nyk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlTGlnaHRbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDcyLCAxMjIsIDI0NSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1swXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMzUsIDg3LCAxOTUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZUxpZ2h0WzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCA2MCwgMTE0LCAyNDQpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZURhcmtbMF1bMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIxLCA3MCwgMTg1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Db3JuZXJMaWdodFswXVswXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjIwLCAyMjAsIDIyMCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQ29ybmVyTGlnaHRbMF1bMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDI1NSwgMjU1LCAyNTUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkNvcm5lckxpZ2h0WzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAyMjUsIDIyNSwgMjI1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5FZGdlT3V0WzBdID0gQXJnYkVuY29kZSgweGZmLCAyNTUsIDI1NSwgMjU1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzBdWzBdID0gQXJnYkVuY29kZSgweGZmLCAwLCA3MiwgMjQxKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAwLCA2MSwgMjIwKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzBdWzJdID0gQXJnYkVuY29kZSgweGZmLCAwLCAzMCwgMTYwKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzBdWzNdID0gQXJnYkVuY29kZSgweGZmLCAwLCAxOSwgMTQwKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzBdWzRdID0gQXJnYkVuY29kZSgweGZmLCAyNTUsIDI1NSwgMjU1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyTGlnaHRbMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIyLCAxMDYsIDIzOSk7DQorICB9DQorICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS1N0YXJ0WzFdWzBdID0gbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktTdGFydFswXVswXTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLRW5kWzFdWzBdID0gbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktFbmRbMF1bMF07DQorICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS1N0YXJ0WzFdWzFdID0gbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktTdGFydFswXVsxXTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLRW5kWzFdWzFdID0gbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktFbmRbMF1bMV07DQorICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS1N0YXJ0WzFdWzJdID0gbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktTdGFydFswXVsyXTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLRW5kWzFdWzJdID0gbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktFbmRbMF1bMl07DQorICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlTGlnaHRbMV1bMF0gPQ0KKyAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VMaWdodFswXVswXTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VEYXJrWzFdWzBdID0NCisgICAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlRGFya1swXVswXTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VMaWdodFsxXVsxXSA9DQorICAgICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZUxpZ2h0WzBdWzFdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZURhcmtbMV1bMV0gPQ0KKyAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VEYXJrWzBdWzFdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZUxpZ2h0WzFdWzJdID0NCisgICAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlTGlnaHRbMF1bMl07DQorICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlRGFya1sxXVsyXSA9DQorICAgICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZURhcmtbMF1bMl07DQorICBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1sxXVswXSA9IG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzBdWzBdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMV1bMV0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1swXVsxXTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzFdWzJdID0gbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMF1bMl07DQorICBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1sxXVszXSA9IG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzBdWzNdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbMV1bMl0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFswXVsyXTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VMZWZ0WzFdWzFdID0gbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUxlZnRbMF1bMV07DQorICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlTGVmdFsxXVswXSA9IG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VMZWZ0WzBdWzBdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0WzFdWzBdID0gbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0WzBdWzBdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0WzFdWzFdID0gbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0WzBdWzFdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0WzFdWzJdID0gbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0WzBdWzJdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVRvcFsxXVswXSA9IG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VUb3BbMF1bMF07DQorICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wWzFdWzFdID0gbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVRvcFswXVsxXTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VUb3BbMV1bMl0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wWzBdWzJdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUJvdHRvbVsxXVswXSA9IG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VCb3R0b21bMF1bMF07DQorICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tWzFdWzFdID0gbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUJvdHRvbVswXVsxXTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VCb3R0b21bMV1bMl0gPSBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tWzBdWzJdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLU3RhcnRbMV1bMl0gPQ0KKyAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS1N0YXJ0WzBdWzJdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLRW5kWzFdWzJdID0gbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLRW5kWzBdWzJdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLU3RhcnRbMV1bMF0gPQ0KKyAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS1N0YXJ0WzBdWzBdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLRW5kWzFdWzBdID0gbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLRW5kWzFdWzBdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLU3RhcnRbMV1bMV0gPQ0KKyAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS1N0YXJ0WzBdWzFdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLRW5kWzFdWzFdID0gbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLRW5kWzBdWzFdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VMaWdodFsxXVswXSA9DQorICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VMaWdodFswXVswXTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1sxXVswXSA9DQorICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VEYXJrWzBdWzBdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VMaWdodFsxXVsxXSA9DQorICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VMaWdodFswXVsxXTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1sxXVsxXSA9DQorICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VEYXJrWzBdWzFdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VMaWdodFsxXVsyXSA9DQorICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VMaWdodFswXVsyXTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1sxXVsyXSA9DQorICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VEYXJrWzBdWzJdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Db3JuZXJMaWdodFsxXVswXSA9IG1fcFRoZW1lRGF0YS0+Y2xyQnRuQ29ybmVyTGlnaHRbMF1bMF07DQorICBtX3BUaGVtZURhdGEtPmNsckJ0bkNvcm5lckxpZ2h0WzFdWzFdID0gbV9wVGhlbWVEYXRhLT5jbHJCdG5Db3JuZXJMaWdodFswXVsxXTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQ29ybmVyTGlnaHRbMV1bMl0gPSBtX3BUaGVtZURhdGEtPmNsckJ0bkNvcm5lckxpZ2h0WzBdWzJdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJCdG5FZGdlT3V0WzFdID0gbV9wVGhlbWVEYXRhLT5jbHJCdG5FZGdlT3V0WzBdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzFdWzBdID0gbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzBdWzBdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzFdWzFdID0gbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzBdWzFdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzFdWzJdID0gbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzBdWzJdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzFdWzNdID0gbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzBdWzNdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzFdWzRdID0gbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzBdWzRdOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyTGlnaHRbMV0gPSBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJMaWdodFswXTsNCisgIERlYWN0aXZlRm9ybSgpOw0KK30NCit2b2lkIENGV0xfRm9ybVRQOjpEZWFjdGl2ZUZvcm0oKSB7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzFdWzBdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMV1bMV0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLCBtX3BUaGVtZURhdGEtPmNsckhlYWRCS1sxXVsyXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzFdWzNdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VMZWZ0WzFdWzBdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VMZWZ0WzFdWzFdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VMZWZ0WzFdWzJdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VSaWdodFsxXVswXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlUmlnaHRbMV1bMV0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVJpZ2h0WzFdWzJdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VUb3BbMV1bMF0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZVRvcFsxXVsxXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlVG9wWzFdWzJdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEVkZ2VCb3R0b21bMV1bMF0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkRWRnZUJvdHRvbVsxXVsxXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckhlYWRFZGdlQm90dG9tWzFdWzJdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS1N0YXJ0WzFdWzBdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS1N0YXJ0WzFdWzFdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS1N0YXJ0WzFdWzJdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRCS0VuZFsxXVswXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0QktFbmRbMV1bMV0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEJLRW5kWzFdWzJdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlTGlnaHRbMV1bMF0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VMaWdodFsxXVsxXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZUxpZ2h0WzFdWzJdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyTm9ybWFsQnRFZGdlRGFya1sxXVswXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsck5vcm1hbEJ0RWRnZURhcmtbMV1bMV0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJOb3JtYWxCdEVkZ2VEYXJrWzFdWzJdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQ29ybmVyTGlnaHRbMV1bMF0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Db3JuZXJMaWdodFsxXVsxXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkNvcm5lckxpZ2h0WzFdWzJdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwgbV9wVGhlbWVEYXRhLT5jbHJCdG5FZGdlT3V0WzFdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclsxXVswXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMV1bMV0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyWzFdWzJdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyRm9ybUJvcmRlclsxXVszXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckZvcm1Cb3JkZXJbMV1bNF0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJGb3JtQm9yZGVyTGlnaHRbMV0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktTdGFydFsxXVswXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRCS1N0YXJ0WzFdWzFdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEJLU3RhcnRbMV1bMl0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktFbmRbMV1bMF0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktFbmRbMV1bMV0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0QktFbmRbMV1bMl0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZUxpZ2h0WzFdWzBdKTsNCisgIFRyYW5zTW9kZUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyVHJhbnNXaGl0ZSwNCisgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2xvc2VCdEVkZ2VMaWdodFsxXVsxXSk7DQorICBUcmFuc01vZGVDb2xvcihtX3BUaGVtZURhdGEtPmNsclRyYW5zV2hpdGUsDQorICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckNsb3NlQnRFZGdlTGlnaHRbMV1bMl0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZURhcmtbMV1bMF0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZURhcmtbMV1bMV0pOw0KKyAgVHJhbnNNb2RlQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJUcmFuc1doaXRlLA0KKyAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJDbG9zZUJ0RWRnZURhcmtbMV1bMl0pOw0KK30NCit2b2lkIENGV0xfRm9ybVRQOjpUcmFuc01vZGVDb2xvcihGWF9BUkdCIGNsckZvcmUsIEZYX0FSR0ImIGNsckJhY2spIHsNCisgIGludDMyX3QgaUFsZmFGLCBpUkYsIGlHRiwgaUJGOw0KKyAgaW50MzJfdCBpQWxmYUIsIGlSQiwgaUdCLCBpQkI7DQorICBBcmdiRGVjb2RlKGNsckZvcmUsIGlBbGZhRiwgaVJGLCBpR0YsIGlCRik7DQorICBBcmdiRGVjb2RlKGNsckJhY2ssIGlBbGZhQiwgaVJCLCBpR0IsIGlCQik7DQorICBjbHJCYWNrID0gQXJnYkVuY29kZSgweGZmLCBpUkIgKyAoaVJGIC0gaVJCKSAqIGlBbGZhRiAvIDI1NSwNCisgICAgICAgICAgICAgICAgICAgICAgIGlHQiArIChpR0YgLSBpR0IpICogaUFsZmFGIC8gMjU1LA0KKyAgICAgICAgICAgICAgICAgICAgICAgaUJCICsgKGlCRiAtIGlCQikgKiBpQWxmYUYgLyAyNTUpOw0KK30NCit2b2lkIENGV0xfRm9ybVRQOjpJbml0Q2FwdGlvbihGWF9CT09MIGJBY3RpdmUpIHsNCisgIGlmIChiQWN0aXZlKSB7DQorICAgIENGWF9GeGdlRGV2aWNlIGRldjsNCisgICAgQ0ZYX0dyYXBoaWNzIGdzOw0KKyAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICBpZiAobV9wQWN0aXZlQml0bWFwKSB7DQorICAgICAgZGVsZXRlIG1fcEFjdGl2ZUJpdG1hcDsNCisgICAgICBtX3BBY3RpdmVCaXRtYXAgPSBOVUxMOw0KKyAgICB9DQorICAgIG1fcEFjdGl2ZUJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7DQorICAgIG1fcEFjdGl2ZUJpdG1hcC0+Q3JlYXRlKDEsIEZXTFRIRU1FX0NBUEFDSVRZX0NZQ2FwdGlvbiwgRlhESUJfQXJnYik7DQorICAgIGRldi5BdHRhY2gobV9wQWN0aXZlQml0bWFwKTsNCisgICAgZ3MuQ3JlYXRlKCZkZXYpOw0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZSgwLCAwLCAxLCA1KTsNCisgICAgRHJhd0F4aWFsU2hhZGluZygmZ3MsIDAsIDAsIDAsIDUsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzBdWzBdLA0KKyAgICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzBdWzFdLCAmcGF0aCk7DQorICAgIHBhdGguQ2xlYXIoKTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUoMCwgNSwgMSwgMTUpOw0KKyAgICBEcmF3QXhpYWxTaGFkaW5nKCZncywgMCwgNSwgMCwgMjAsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzBdWzFdLA0KKyAgICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzBdWzJdLCAmcGF0aCk7DQorICAgIHBhdGguQ2xlYXIoKTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUoMCwgMjAsIDEsIEZXTFRIRU1FX0NBUEFDSVRZX0NZQ2FwdGlvbiAtIDE5KTsNCisgICAgRHJhd0F4aWFsU2hhZGluZygmZ3MsIDAsIDIwLCAwLCBGV0xUSEVNRV9DQVBBQ0lUWV9DWUNhcHRpb24sDQorICAgICAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMF1bMl0sDQorICAgICAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMF1bM10sICZwYXRoKTsNCisgIH0gZWxzZSB7DQorICAgIENGWF9GeGdlRGV2aWNlIGRldjsNCisgICAgQ0ZYX0dyYXBoaWNzIGdzOw0KKyAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICBpZiAobV9wRGVhY3RpdmViaXRtYXApIHsNCisgICAgICBkZWxldGUgbV9wRGVhY3RpdmViaXRtYXA7DQorICAgICAgbV9wRGVhY3RpdmViaXRtYXAgPSBOVUxMOw0KKyAgICB9DQorICAgIG1fcERlYWN0aXZlYml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsNCisgICAgbV9wRGVhY3RpdmViaXRtYXAtPkNyZWF0ZSgxLCBGV0xUSEVNRV9DQVBBQ0lUWV9DWUNhcHRpb24sIEZYRElCX0FyZ2IpOw0KKyAgICBkZXYuQXR0YWNoKG1fcERlYWN0aXZlYml0bWFwKTsNCisgICAgZ3MuQ3JlYXRlKCZkZXYpOw0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZSgwLCAwLCAxLCA1KTsNCisgICAgRHJhd0F4aWFsU2hhZGluZygmZ3MsIDAsIDAsIDAsIDUsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzFdWzBdLA0KKyAgICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzFdWzFdLCAmcGF0aCk7DQorICAgIHBhdGguQ2xlYXIoKTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUoMCwgNSwgMSwgMTUpOw0KKyAgICBEcmF3QXhpYWxTaGFkaW5nKCZncywgMCwgNSwgMCwgMjAsIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzFdWzFdLA0KKyAgICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xySGVhZEJLWzFdWzJdLCAmcGF0aCk7DQorICAgIHBhdGguQ2xlYXIoKTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUoMCwgMjAsIDEsIEZXTFRIRU1FX0NBUEFDSVRZX0NZQ2FwdGlvbiAtIDE5KTsNCisgICAgRHJhd0F4aWFsU2hhZGluZygmZ3MsIDAsIDIwLCAwLCBGV0xUSEVNRV9DQVBBQ0lUWV9DWUNhcHRpb24sDQorICAgICAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMV1bMl0sDQorICAgICAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJIZWFkQktbMV1bM10sICZwYXRoKTsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9md2wvc3JjL3RoZW1lL2xpc3Rib3h0cC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvbGlzdGJveHRwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWU3YWU2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL2xpc3Rib3h0cC5jcHAKQEAgLTAsMCArMSw5NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KK0NGV0xfTGlzdEJveFRQOjpDRldMX0xpc3RCb3hUUCgpIHt9DQorQ0ZXTF9MaXN0Qm94VFA6On5DRldMX0xpc3RCb3hUUCgpIHt9DQorRlhfQk9PTCBDRldMX0xpc3RCb3hUUDo6SXNWYWxpZFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgaWYgKCFwV2lkZ2V0KQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICByZXR1cm4gcFdpZGdldC0+R2V0Q2xhc3NJRCgpID09IEZXTF9DTEFTU0hBU0hfTGlzdEJveDsNCit9DQorRlhfQk9PTCBDRldMX0xpc3RCb3hUUDo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMpIHsNCisgIGlmICghcFBhcmFtcykNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgc3dpdGNoIChwUGFyYW1zLT5tX2lQYXJ0KSB7DQorICAgIGNhc2UgRldMX1BBUlRfTFRCX0JvcmRlcjogew0KKyAgICAgIERyYXdCb3JkZXIocFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUX0xUQl9FZGdlOiB7DQorICAgICAgRHJhd0VkZ2UocFBhcmFtcy0+bV9wR3JhcGhpY3MsIHBQYXJhbXMtPm1fcFdpZGdldC0+R2V0U3R5bGVzKCksDQorICAgICAgICAgICAgICAgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfTFRCX0JhY2tncm91bmQ6IHsNCisgICAgICBGaWxsU29pbGRSZWN0KHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSksDQorICAgICAgICAgICAgICAgICAgICAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgaWYgKHBQYXJhbXMtPm1fcERhdGEpIHsNCisgICAgICAgIEZpbGxTb2lsZFJlY3QocFBhcmFtcy0+bV9wR3JhcGhpY3MsIEZXTFRIRU1FX0NPTE9SX0JhY2tncm91bmQsDQorICAgICAgICAgICAgICAgICAgICAgIChDRlhfUmVjdEYqKXBQYXJhbXMtPm1fcERhdGEsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfTFRCX0xpc3RJdGVtOiB7DQorICAgICAgRHJhd0xpc3RCb3hJdGVtKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBwUGFyYW1zLT5tX2R3U3RhdGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAmcFBhcmFtcy0+bV9ydFBhcnQsIHBQYXJhbXMtPm1fcERhdGEsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9MVEJfSWNvbjogew0KKyAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TdHJldGNoSW1hZ2UocFBhcmFtcy0+bV9wSW1hZ2UsIHBQYXJhbXMtPm1fcnRQYXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUX0xUQl9DaGVjazogew0KKyAgICAgIEZYX0RXT1JEIGNvbG9yID0gMHhGRjAwMDAwMDsNCisgICAgICBpZiAocFBhcmFtcy0+bV9kd1N0YXRlcyA9PSBGV0xfUEFSVFNUQVRFX0xUQl9DaGVja2VkKSB7DQorICAgICAgICBjb2xvciA9IDB4RkZGRjAwMDA7DQorICAgICAgfSBlbHNlIGlmIChwUGFyYW1zLT5tX2R3U3RhdGVzID09IEZXTF9QQVJUU1RBVEVfTFRCX1VuQ2hlY2tlZCkgew0KKyAgICAgICAgY29sb3IgPSAweEZGMDAwMEZGOw0KKyAgICAgIH0NCisgICAgICBGaWxsU29pbGRSZWN0KHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBjb2xvciwgJnBQYXJhbXMtPm1fcnRQYXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9MaXN0Qm94VFA6OkluaXRpYWxpemUoKSB7DQorICBJbml0VFRPKCk7DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6SW5pdGlhbGl6ZSgpOw0KK30NCitGV0xfRVJSIENGV0xfTGlzdEJveFRQOjpGaW5hbGl6ZSgpIHsNCisgIEZpbmFsaXplVFRPKCk7DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6RmluYWxpemUoKTsNCit9DQordm9pZCBDRldMX0xpc3RCb3hUUDo6RHJhd0xpc3RCb3hJdGVtKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwcnRJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgaWYgKGR3U3RhdGVzICYgRldMX1BBUlRTVEFURV9MVEJfU2VsZWN0ZWQpIHsNCisgICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICBDRlhfQ29sb3IgY3JGaWxsKEZXTF9HZXRUaGVtZUNvbG9yKG1fZHdUaGVtZUlEKSA9PSAwDQorICAgICAgICAgICAgICAgICAgICAgICAgID8gRldMVEhFTUVfQ09MT1JfQktTZWxlY3RlZA0KKyAgICAgICAgICAgICAgICAgICAgICAgICA6IEZXTFRIRU1FX0NPTE9SX0dyZWVuX0JLU2VsZWN0ZWQpOw0KKyAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCisgICAgQ0ZYX1JlY3RGIHJ0KCpwcnRJdGVtKTsNCisgICAgQ0ZYX1BhdGggcGF0aDsNCisgICAgcGF0aC5DcmVhdGUoKTsNCisjaWYgKF9GWF9PU18gPT0gX0ZYX01BQ09TWF8pDQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQsIHJ0LnRvcCwgcnQud2lkdGggLSAxLCBydC5oZWlnaHQgLSAxKTsNCisjZWxzZQ0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0LCBydC50b3AsIHJ0LndpZHRoLCBydC5oZWlnaHQpOw0KKyNlbmRpZg0KKyAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgIH0NCisgIGlmIChkd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfTFRCX0ZvY3VzZWQpIHsNCisgICAgaWYgKHBEYXRhKSB7DQorICAgICAgRHJhd0ZvY3VzKHBHcmFwaGljcywgKENGWF9SZWN0RiopcERhdGEsIHBNYXRyaXgpOw0KKyAgICB9DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy90aGVtZS9tb250aGNhbGVuZGFydHAuY3BwIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL21vbnRoY2FsZW5kYXJ0cC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVmZjc4NwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy90aGVtZS9tb250aGNhbGVuZGFydHAuY3BwCkBAIC0wLDAgKzEsNTc2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfV0lEVEggMjAwDQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfSEVJR0hUIDMwDQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfQlROX1dJRFRIIDE4DQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfQlROX0hFSUdIVCAxNg0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX0JUTl9ITUFSR0lOIDUNCisjZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9CVE5fVk1BUkdJTiBcDQorICAoRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX0hFSUdIVCAtICAgICAgICAgXA0KKyAgIEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9CVE5fSEVJR0hUKSAvICAgIFwNCisgICAgICAyDQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVFdJREhUIDEwMA0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRIRUlHSFQgMjANCisjZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9URVhUX0hNQVJHSU4gXA0KKyAgKEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9XSURUSCAtICAgICAgICAgICBcDQorICAgRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX1RFWFRXSURIVCkgLyAgICAgIFwNCisgICAgICAyDQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVF9WTUFSR0lOIFwNCisgIChGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfSEVJR0hUIC0gICAgICAgICAgXA0KKyAgIEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9URVhUSEVJR0hUKSAvICAgICBcDQorICAgICAgMg0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfSFNFUF9XSURUSCAoRldMX1RIRU1FQ0FQQUNJVFlfTUNfV0VFS19XSURUSCAtIDEwKQ0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfSFNFUF9IRUlHSFQgMQ0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfVlNFUF9XSURUSCAxDQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19WU0VQX0hFSUdIVCBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19XRUVLTlVNX0hFSUdIVA0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfV0VFS05VTV9XSURUSCAyNg0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfU0VQX0RPRkZTRVQgLTQNCisjZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX1NFUF9YIDMNCisjZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX1NFUF9ZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAoRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX0hFSUdIVCArIEZXTF9USEVNRUNBUEFDSVRZX01DX1dFRUtfSEVJR0hUICsgXA0KKyAgIEZXTF9USEVNRUNBUEFDSVRZX01DX1NFUF9ET0ZGU0VUKQ0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfV0VFS05VTV9IRUlHSFQgXA0KKyAgKDYgKiBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19EQVRFU19DRUxMX0hFSUdIVCkNCisjZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX1dFRUtfV0lEVEggXA0KKyAgKEZXTF9USEVNRUNBUEFDSVRZX01DX0RBVEVTX0NFTExfV0lEVEggKiA3KQ0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfV0VFS19IRUlHSFQgRldMX1RIRU1FQ0FQQUNJVFlfTUNfREFURVNfQ0VMTF9IRUlHSFQNCisjZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX0RBVEVTX0NFTExfV0lEVEggXA0KKyAgKEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9XSURUSCAvIDcpDQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19EQVRFU19DRUxMX0hFSUdIVCAxNg0KKyNkZWZpbmUgRldMX1RIRU1FQ0FQQUNJVFlfTUNfVE9EQVlfV0lESFQgRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX1dJRFRIDQorI2RlZmluZSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19UT0RBWV9IRUlHSFQgRldMX1RIRU1FQ0FQQUNJVFlfTUNfREFURVNfQ0VMTF9IRUlHSFQNCisjZGVmaW5lIEZXTF9USEVNRUNBUEFDSVRZX01DX1RPREFZX0ZMQUdfV0lESFQgXA0KKyAgRldMX1RIRU1FQ0FQQUNJVFlfTUNfREFURVNfQ0VMTF9XSURUSA0KKyNkZWZpbmUgRldMX01DX1dJRFRIIDIwMA0KKyNkZWZpbmUgRldMX01DX0hFSUdIVCAxNjANCitDRldMX01vbnRoQ2FsZW5kYXJUUDo6Q0ZXTF9Nb250aENhbGVuZGFyVFAoKSB7DQorICBtX3BUaGVtZURhdGEgPSBuZXcgTUNUaGVtZURhdGE7DQorICBTZXRUaGVtZURhdGEoMCk7DQorfQ0KK0NGV0xfTW9udGhDYWxlbmRhclRQOjp+Q0ZXTF9Nb250aENhbGVuZGFyVFAoKSB7DQorICBkZWxldGUgbV9wVGhlbWVEYXRhOw0KK30NCitGWF9CT09MIENGV0xfTW9udGhDYWxlbmRhclRQOjpJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBpZiAoIXBXaWRnZXQpDQorICAgIHJldHVybiBGQUxTRTsNCisgIHJldHVybiBwV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9Nb250aENhbGVuZGFyOw0KK30NCitGWF9EV09SRCBDRldMX01vbnRoQ2FsZW5kYXJUUDo6U2V0VGhlbWVJRChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1RoZW1lSUQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hpbGRyZW4pIHsNCisgIGlmIChtX3BUaGVtZURhdGEpIHsNCisgICAgU2V0VGhlbWVEYXRhKEZXTF9HZXRUaGVtZUNvbG9yKGR3VGhlbWVJRCkpOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OlNldFRoZW1lSUQocFdpZGdldCwgZHdUaGVtZUlELCBiQ2hpbGRyZW4pOw0KK30NCitGWF9CT09MIENGV0xfTW9udGhDYWxlbmRhclRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcykgew0KKyAgaWYgKCFwUGFyYW1zKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBzd2l0Y2ggKHBQYXJhbXMtPm1faVBhcnQpIHsNCisgICAgY2FzZSBGV0xfUEFSVF9NQ0RfQm9yZGVyOiB7DQorICAgICAgRHJhd0JvcmRlcihwUGFyYW1zLT5tX3BHcmFwaGljcywgJnBQYXJhbXMtPm1fcnRQYXJ0LCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfTUNEX0VkZ2U6IHsNCisgICAgICBEcmF3RWRnZShwUGFyYW1zLT5tX3BHcmFwaGljcywgcFBhcmFtcy0+bV9wV2lkZ2V0LT5HZXRTdHlsZXMoKSwNCisgICAgICAgICAgICAgICAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9NQ0RfQmFja2dyb3VuZDogew0KKyAgICAgIERyYXdUb3RhbEJLKHBQYXJhbXMsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9NQ0RfSGVhZGVyOiB7DQorICAgICAgRHJhd0hlYWRCayhwUGFyYW1zLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfTUNEX0xCdG46IHsNCisjaWZkZWYgVEhFTUVfWFBTaW1pbGFyDQorICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlID0gR2V0U3RhdGUocFBhcmFtcy0+bV9kd1N0YXRlcyk7DQorICAgICAgRHJhd0Fycm93QnRuKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsDQorICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX0RJUkVDVElPTl9MZWZ0LCBlU3RhdGUsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorI2Vsc2UNCisgICAgICBEcmF3TEJ1dHRvbihwUGFyYW1zLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyNlbmRpZg0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfTUNEX1JCdG46IHsNCisjaWZkZWYgVEhFTUVfWFBTaW1pbGFyDQorICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlID0gR2V0U3RhdGUocFBhcmFtcy0+bV9kd1N0YXRlcyk7DQorICAgICAgRHJhd0Fycm93QnRuKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsDQorICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX0RJUkVDVElPTl9SaWdodCwgZVN0YXRlLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyNlbHNlDQorICAgICAgRHJhd1JCdXR0b24ocFBhcmFtcywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisjZW5kaWYNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUX01DRF9IU2VwYXJhdG9yOiB7DQorICAgICAgRHJhd0hTZXBlcmF0b3IocFBhcmFtcywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUX01DRF9EYXRlc0luOiB7DQorICAgICAgRHJhd0RhdGVzSW5CSyhwUGFyYW1zLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfTUNEX1RvZGF5Q2lyY2xlOiB7DQorICAgICAgRHJhd1RvZGF5Q2lyY2xlKHBQYXJhbXMsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9NQ0RfRGF0ZUluQ2lyY2xlOiB7DQorICAgICAgRHJhd0RhdGVzSW5DaXJjbGUocFBhcmFtcywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUX01DRF9XZWVrTnVtU2VwOiB7DQorICAgICAgRHJhd1dlZWtOdW1TZXAocFBhcmFtcywgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkRyYXdUZXh0KENGV0xfVGhlbWVUZXh0KiBwUGFyYW1zKSB7DQorICBpZiAoIW1fcFRleHRPdXQpDQorICAgIHJldHVybiBGQUxTRTsNCisgIGlmICgocFBhcmFtcy0+bV9pUGFydCA9PSBGV0xfUEFSVF9NQ0RfRGF0ZXNJbikgJiYNCisgICAgICAhKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfSVRFTVNUQVRFX01DRF9GbGFnKSAmJg0KKyAgICAgIChwUGFyYW1zLT5tX2R3U3RhdGVzICYNCisgICAgICAgKEZXTF9QQVJUU1RBVEVfTUNEX0hvdmVyZWQgfCBGV0xfUEFSVFNUQVRFX01DRF9TZWxlY3RlZCkpKSB7DQorICAgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcigweEZGRkZGRkZGKTsNCisgIH0gZWxzZSBpZiAocFBhcmFtcy0+bV9pUGFydCA9PSBGV0xfUEFSVF9NQ0RfQ2FwdGlvbikgew0KKyAgICBtX3BUZXh0T3V0LT5TZXRUZXh0Q29sb3IobV9wVGhlbWVEYXRhLT5jbHJDYXB0aW9uKTsNCisgIH0gZWxzZSB7DQorICAgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcigweEZGMDAwMDAwKTsNCisgIH0NCisgIHJldHVybiBDRldMX1dpZGdldFRQOjpEcmF3VGV4dChwUGFyYW1zKTsNCit9DQordm9pZCogQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0NhcGFjaXR5KSB7DQorICBGWF9CT09MIGJEZWZQcm8gPSBGQUxTRTsNCisgIEZYX0JPT0wgYkR3b3JkVmFsID0gRkFMU0U7DQorICBzd2l0Y2ggKGR3Q2FwYWNpdHkpIHsNCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX1dJRFRIOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfV0lEVEg7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSEVBREVSX0hlaWdodDogew0KKyAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfSEVBREVSX0hFSUdIVDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfQlROX1dJRFRIOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfQlROX1dJRFRIOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9CVE5fSEVJR0hUOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfQlROX0hFSUdIVDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfQlROX0hNQVJHSU46IHsNCisgICAgICBiRHdvcmRWYWwgPSBUUlVFOw0KKyAgICAgIG1fZHdWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9CVE5fSE1BUkdJTjsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfQlROX1ZNQVJHSU46IHsNCisgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9CVE5fVk1BUkdJTjsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVFdJREhUOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVFdJREhUOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9URVhUSEVJR0hUOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVEhFSUdIVDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVF9ITUFSR0lOOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19IRUFERVJfVEVYVF9ITUFSR0lOOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX0hFQURFUl9URVhUX1ZNQVJHSU46IHsNCisgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX0hFQURFUl9URVhUX1ZNQVJHSU47DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfSFNFUF9XSURUSDogew0KKyAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfSFNFUF9XSURUSDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19IU0VQX0hFSUdIVDogew0KKyAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfSFNFUF9IRUlHSFQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfVlNFUF9XSURUSDogew0KKyAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfVlNFUF9XSURUSDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19WU0VQX0hFSUdIVDogew0KKyAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfVlNFUF9IRUlHSFQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfV0VFS05VTV9XSURUSDogew0KKyAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfV0VFS05VTV9XSURUSDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19XRUVLTlVNX0hFSUdIVDogew0KKyAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfV0VFS05VTV9IRUlHSFQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfV0VFS19XSURUSDogew0KKyAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfV0VFS19XSURUSDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19XRUVLX0hFSUdIVDogew0KKyAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfV0VFS19IRUlHSFQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfU0VQX0RPRkZTRVQ6IHsNCisgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX1NFUF9ET0ZGU0VUOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX1NFUF9YOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xfVEhFTUVDQVBBQ0lUWV9NQ19TRVBfWDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19TRVBfWTogew0KKyAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfU0VQX1k7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfREFURVNfQ0VMTF9XSURUSDogew0KKyAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfREFURVNfQ0VMTF9XSURUSDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19EQVRFU19DRUxMX0hFSUdIVDogew0KKyAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfREFURVNfQ0VMTF9IRUlHSFQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfVE9EQVlfV0lESFQ6IHsNCisgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX1RPREFZX1dJREhUOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX1RPREFZX0hFSUdIVDogew0KKyAgICAgIG1fZlZhbHVlID0gRldMX1RIRU1FQ0FQQUNJVFlfTUNfVE9EQVlfSEVJR0hUOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX01DX1RPREFZX0ZMQUdfV0lESFQ6IHsNCisgICAgICBtX2ZWYWx1ZSA9IEZXTF9USEVNRUNBUEFDSVRZX01DX1RPREFZX0ZMQUdfV0lESFQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTUNfV0lEVEg6IHsNCisgICAgICBtX2ZWYWx1ZSA9IEZXTF9NQ19XSURUSDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9NQ19IRUlHSFQ6IHsNCisgICAgICBtX2ZWYWx1ZSA9IEZXTF9NQ19IRUlHSFQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9TdW46IHsNCisgICAgICB3c1Jlc291cmNlID0gTCJTdW4iOw0KKyAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX01vbjogew0KKyAgICAgIHdzUmVzb3VyY2UgPSBMIk1vbiI7DQorICAgICAgcmV0dXJuICZ3c1Jlc291cmNlOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01DQ0FQQUNJVFlfVHVlOiB7DQorICAgICAgd3NSZXNvdXJjZSA9IEwiVHVlIjsNCisgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9XZWQ6IHsNCisgICAgICB3c1Jlc291cmNlID0gTCJXZWQiOw0KKyAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX1RodTogew0KKyAgICAgIHdzUmVzb3VyY2UgPSBMIlRodSI7DQorICAgICAgcmV0dXJuICZ3c1Jlc291cmNlOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01DQ0FQQUNJVFlfRnJpOiB7DQorICAgICAgd3NSZXNvdXJjZSA9IEwiRnJpIjsNCisgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9TYXQ6IHsNCisgICAgICB3c1Jlc291cmNlID0gTCJTYXQiOw0KKyAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX0phbnVhcnk6IHsNCisgICAgICB3c1Jlc291cmNlID0gTCJKYW51YXJ5IjsNCisgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9GZWJydWFyeTogew0KKyAgICAgIHdzUmVzb3VyY2UgPSBMIkZlYnJ1YXJ5IjsNCisgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9NYXJjaDogew0KKyAgICAgIHdzUmVzb3VyY2UgPSBMIk1hcmNoIjsNCisgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9BcHJpbDogew0KKyAgICAgIHdzUmVzb3VyY2UgPSBMIkFwcmlsIjsNCisgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9NYXk6IHsNCisgICAgICB3c1Jlc291cmNlID0gTCJNYXkiOw0KKyAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX0p1bmU6IHsNCisgICAgICB3c1Jlc291cmNlID0gTCJKdW5lIjsNCisgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9KdWx5OiB7DQorICAgICAgd3NSZXNvdXJjZSA9IEwiSnVseSI7DQorICAgICAgcmV0dXJuICZ3c1Jlc291cmNlOw0KKyAgICB9DQorICAgIGNhc2UgRldMX01DQ0FQQUNJVFlfQXVndXN0OiB7DQorICAgICAgd3NSZXNvdXJjZSA9IEwiQXVndXN0IjsNCisgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9TZXB0ZW1iZXI6IHsNCisgICAgICB3c1Jlc291cmNlID0gTCJTZXB0ZW1iZXIiOw0KKyAgICAgIHJldHVybiAmd3NSZXNvdXJjZTsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9NQ0NBUEFDSVRZX09jdG9iZXI6IHsNCisgICAgICB3c1Jlc291cmNlID0gTCJPY3RvYmVyIjsNCisgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9Ob3ZlbWJlcjogew0KKyAgICAgIHdzUmVzb3VyY2UgPSBMIk5vdmVtYmVyIjsNCisgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9EZWNlbWJlcjogew0KKyAgICAgIHdzUmVzb3VyY2UgPSBMIkRlY2VtYmVyIjsNCisgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQorICAgIH0NCisgICAgY2FzZSBGV0xfTUNDQVBBQ0lUWV9Ub2RheTogew0KKyAgICAgIHdzUmVzb3VyY2UgPSBMIlRvZGF5IjsNCisgICAgICByZXR1cm4gJndzUmVzb3VyY2U7DQorICAgIH0NCisgICAgZGVmYXVsdDogeyBiRGVmUHJvID0gVFJVRTsgfQ0KKyAgfQ0KKyAgaWYgKCFiRGVmUHJvKSB7DQorICAgIGlmIChiRHdvcmRWYWwpIHsNCisgICAgICByZXR1cm4gJm1fZHdWYWx1ZTsNCisgICAgfQ0KKyAgICByZXR1cm4gJm1fZlZhbHVlOw0KKyAgfQ0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OkdldENhcGFjaXR5KHBUaGVtZVBhcnQsIGR3Q2FwYWNpdHkpOw0KK30NCitGV0xfRVJSIENGV0xfTW9udGhDYWxlbmRhclRQOjpJbml0aWFsaXplKCkgew0KKyAgSW5pdFRUTygpOw0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OkluaXRpYWxpemUoKTsNCit9DQorRldMX0VSUiBDRldMX01vbnRoQ2FsZW5kYXJUUDo6RmluYWxpemUoKSB7DQorICBGaW5hbGl6ZVRUTygpOw0KKyAgcmV0dXJuIENGV0xfV2lkZ2V0VFA6OkZpbmFsaXplKCk7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkRyYXdUb3RhbEJLKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgQ0ZYX1JlY3RGIHJ0VG90YWwocFBhcmFtcy0+bV9ydFBhcnQpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocnRUb3RhbC5sZWZ0LCBydFRvdGFsLnRvcCwgcnRUb3RhbC53aWR0aCwgcnRUb3RhbC5oZWlnaHQpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBDRlhfQ29sb3IgY2xyQksobV9wVGhlbWVEYXRhLT5jbHJCSyk7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjbHJCSyk7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkRyYXdIZWFkQmsoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIENGWF9SZWN0RiBydEhlYWQgPSBwUGFyYW1zLT5tX3J0UGFydDsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0SGVhZC5sZWZ0LCBydEhlYWQudG9wLCBydEhlYWQud2lkdGgsIHJ0SGVhZC5oZWlnaHQpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBDRlhfQ29sb3IgY2xySGVhZEJLKG1fcFRoZW1lRGF0YS0+Y2xyQkspOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY2xySGVhZEJLKTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX01vbnRoQ2FsZW5kYXJUUDo6RHJhd0xCdXR0b24oQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZYX1BhdGggcGF0aDsNCisgIHBhdGguQ3JlYXRlKCk7DQorICBDRlhfUmVjdEYgcnRMQnRuOw0KKyAgcnRMQnRuID0gcFBhcmFtcy0+bV9ydFBhcnQ7DQorICBwYXRoLkFkZFJlY3RhbmdsZShydExCdG4ubGVmdCwgcnRMQnRuLnRvcCwgcnRMQnRuLndpZHRoLCBydExCdG4uaGVpZ2h0KTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgQ0ZYX0NvbG9yIGNsckxCdG5FZGdlKEFyZ2JFbmNvZGUoMHhmZiwgMjA1LCAyMTksIDI0MykpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJMQnRuRWRnZSk7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICBpZiAoKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX01DRF9QcmVzc2VkKSA9PQ0KKyAgICAgIEZXTF9QQVJUU1RBVEVfTUNEX1ByZXNzZWQpIHsNCisgICAgQ0ZYX0NvbG9yIGNsckxCdG5GaWxsKEFyZ2JFbmNvZGUoMHhmZiwgMTc0LCAxOTgsIDI0MikpOw0KKyAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjbHJMQnRuRmlsbCk7DQorICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX0NvbG9yIGNsckxCdG5GaWxsKEFyZ2JFbmNvZGUoMHhmZiwgMjI3LCAyMzUsIDI0OSkpOw0KKyAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjbHJMQnRuRmlsbCk7DQorICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgcGF0aC5DbGVhcigpOw0KKyAgcGF0aC5Nb3ZlVG8ocnRMQnRuLmxlZnQgKyBydExCdG4uV2lkdGgoKSAvIDMgKiAyLA0KKyAgICAgICAgICAgICAgcnRMQnRuLnRvcCArIHJ0TEJ0bi5oZWlnaHQgLyA0KTsNCisgIHBhdGguTGluZVRvKHJ0TEJ0bi5sZWZ0ICsgcnRMQnRuLldpZHRoKCkgLyAzLCBydExCdG4udG9wICsgcnRMQnRuLmhlaWdodCAvIDIpOw0KKyAgcGF0aC5MaW5lVG8ocnRMQnRuLmxlZnQgKyBydExCdG4uV2lkdGgoKSAvIDMgKiAyLA0KKyAgICAgICAgICAgICAgcnRMQnRuLmJvdHRvbSgpIC0gcnRMQnRuLmhlaWdodCAvIDQpOw0KKyAgQ0ZYX0NvbG9yIGNsckZsYWcoQXJnYkVuY29kZSgweGZmLCA1MCwgMTA0LCAyMDUpKTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xyRmxhZyk7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGV0xfTW9udGhDYWxlbmRhclRQOjpEcmF3UkJ1dHRvbihDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIENGWF9SZWN0RiBydFJCdG47DQorICBydFJCdG4gPSBwUGFyYW1zLT5tX3J0UGFydDsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0UkJ0bi5sZWZ0LCBydFJCdG4udG9wLCBydFJCdG4ud2lkdGgsIHJ0UkJ0bi5oZWlnaHQpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBDRlhfQ29sb3IgY2xyUkJ0bkVkZ2UoQXJnYkVuY29kZSgweGZmLCAyMDUsIDIxOSwgMjQzKSk7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNsclJCdG5FZGdlKTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgIGlmICgocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfTUNEX1ByZXNzZWQpID09DQorICAgICAgRldMX1BBUlRTVEFURV9NQ0RfUHJlc3NlZCkgew0KKyAgICBDRlhfQ29sb3IgY2xyUkJ0bkZpbGwoQXJnYkVuY29kZSgweGZmLCAxNzQsIDE5OCwgMjQyKSk7DQorICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNsclJCdG5GaWxsKTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICB9IGVsc2Ugew0KKyAgICBDRlhfQ29sb3IgY2xyUkJ0bkZpbGwoQXJnYkVuY29kZSgweGZmLCAyMjcsIDIzNSwgMjQ5KSk7DQorICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNsclJCdG5GaWxsKTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICB9DQorICBwYXRoLkNsZWFyKCk7DQorICBwYXRoLk1vdmVUbyhydFJCdG4ubGVmdCArIHJ0UkJ0bi5XaWR0aCgpIC8gMywgcnRSQnRuLnRvcCArIHJ0UkJ0bi5oZWlnaHQgLyA0KTsNCisgIHBhdGguTGluZVRvKHJ0UkJ0bi5sZWZ0ICsgcnRSQnRuLldpZHRoKCkgLyAzICogMiwNCisgICAgICAgICAgICAgIHJ0UkJ0bi50b3AgKyBydFJCdG4uaGVpZ2h0IC8gMik7DQorICBwYXRoLkxpbmVUbyhydFJCdG4ubGVmdCArIHJ0UkJ0bi5XaWR0aCgpIC8gMywNCisgICAgICAgICAgICAgIHJ0UkJ0bi5ib3R0b20oKSAtIHJ0UkJ0bi5oZWlnaHQgLyA0KTsNCisgIENGWF9Db2xvciBjbHJGbGFnKEFyZ2JFbmNvZGUoMHhmZiwgNTAsIDEwNCwgMjA1KSk7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNsckZsYWcpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX01vbnRoQ2FsZW5kYXJUUDo6RHJhd0hTZXBlcmF0b3IoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZYX1BhdGggcGF0aDsNCisgIHBhdGguQ3JlYXRlKCk7DQorICBDRlhfUmVjdEYgcnRIU2VwOw0KKyAgcnRIU2VwID0gcFBhcmFtcy0+bV9ydFBhcnQ7DQorICBwYXRoLk1vdmVUbyhydEhTZXAubGVmdCwgcnRIU2VwLnRvcCArIHJ0SFNlcC5oZWlnaHQgLyAyKTsNCisgIHBhdGguTGluZVRvKHJ0SFNlcC5yaWdodCgpLCBydEhTZXAudG9wICsgcnRIU2VwLmhlaWdodCAvIDIpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBDRlhfQ29sb3IgY2xySFNlcChtX3BUaGVtZURhdGEtPmNsclNlcGVyYXRvcik7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNsckhTZXApOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX01vbnRoQ2FsZW5kYXJUUDo6RHJhd1dlZWtOdW1TZXAoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZYX1BhdGggcGF0aDsNCisgIHBhdGguQ3JlYXRlKCk7DQorICBDRlhfUmVjdEYgcnRXZWVrU2VwOw0KKyAgcnRXZWVrU2VwID0gcFBhcmFtcy0+bV9ydFBhcnQ7DQorICBwYXRoLk1vdmVUbyhydFdlZWtTZXAubGVmdCwgcnRXZWVrU2VwLnRvcCk7DQorICBwYXRoLkxpbmVUbyhydFdlZWtTZXAubGVmdCwgcnRXZWVrU2VwLmJvdHRvbSgpKTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgQ0ZYX0NvbG9yIGNsckhTZXAobV9wVGhlbWVEYXRhLT5jbHJTZXBlcmF0b3IpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJIU2VwKTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkRyYXdEYXRlc0luQksoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgIGlmIChwUGFyYW1zLT5tX2R3U3RhdGVzICYgRldMX1BBUlRTVEFURV9NQ0RfU2VsZWN0ZWQpIHsNCisgICAgQ0ZYX1BhdGggcGF0aDsNCisgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgQ0ZYX1JlY3RGIHJ0U2VsRGF5Ow0KKyAgICBydFNlbERheSA9IHBQYXJhbXMtPm1fcnRQYXJ0Ow0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZShydFNlbERheS5sZWZ0LCBydFNlbERheS50b3AsIHJ0U2VsRGF5LndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICBydFNlbERheS5oZWlnaHQpOw0KKyAgICBDRlhfQ29sb3IgY2xyU2VsRGF5Qks7DQorICAgIGNsclNlbERheUJLID0gbV9wVGhlbWVEYXRhLT5jbHJEYXRlc1NlbGVjdGVkQks7DQorICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNsclNlbERheUJLKTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICB9IGVsc2UgaWYgKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX01DRF9Ib3ZlcmVkKSB7DQorICAgIENGWF9QYXRoIHBhdGg7DQorICAgIHBhdGguQ3JlYXRlKCk7DQorICAgIENGWF9SZWN0RiBydFNlbERheTsNCisgICAgcnRTZWxEYXkgPSBwUGFyYW1zLT5tX3J0UGFydDsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUocnRTZWxEYXkubGVmdCwgcnRTZWxEYXkudG9wLCBydFNlbERheS53aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgcnRTZWxEYXkuaGVpZ2h0KTsNCisgICAgQ0ZYX0NvbG9yIGNsclNlbERheUJLOw0KKyAgICBjbHJTZWxEYXlCSyA9IG1fcFRoZW1lRGF0YS0+Y2xyRGF0ZXNIb3ZlckJLOw0KKyAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjbHJTZWxEYXlCSyk7DQorICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgfQ0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkRyYXdEYXRlc0luQ2lyY2xlKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgQ0ZYX1JlY3RGIHJ0U2VsRGF5Ow0KKyAgcnRTZWxEYXkgPSBwUGFyYW1zLT5tX3J0UGFydDsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0U2VsRGF5LmxlZnQsIHJ0U2VsRGF5LnRvcCwgcnRTZWxEYXkud2lkdGgsDQorICAgICAgICAgICAgICAgICAgICBydFNlbERheS5oZWlnaHQpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBDRlhfQ29sb3IgY2xyU2VsRGF5Qks7DQorICBjbHJTZWxEYXlCSyA9IG1fcFRoZW1lRGF0YS0+Y2xyRGF0ZXNDaXJjbGU7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNsclNlbERheUJLKTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkRyYXdUb2RheUNpcmNsZShDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ0ZYX1BhdGggcGF0aDsNCisgIHBhdGguQ3JlYXRlKCk7DQorICBDRlhfUmVjdEYgcnRUb2RheUNpcmNsZTsNCisgIHJ0VG9kYXlDaXJjbGUgPSBwUGFyYW1zLT5tX3J0UGFydDsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0VG9kYXlDaXJjbGUubGVmdCwgcnRUb2RheUNpcmNsZS50b3AsIHJ0VG9kYXlDaXJjbGUud2lkdGgsDQorICAgICAgICAgICAgICAgICAgICBydFRvZGF5Q2lyY2xlLmhlaWdodCk7DQorICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgIENGWF9Db2xvciBjbHJUb2RheUNpcmNsZTsNCisgIGNsclRvZGF5Q2lyY2xlID0gbV9wVGhlbWVEYXRhLT5jbHJEYXRlc0NpcmNsZTsNCisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xyVG9kYXlDaXJjbGUpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRldMVEhFTUVfU1RBVEUgQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkdldFN0YXRlKEZYX0RXT1JEIGR3RldMU3RhdGVzKSB7DQorICBpZiAoZHdGV0xTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX01DRF9Ib3ZlcmVkKSB7DQorICAgIHJldHVybiBGV0xUSEVNRV9TVEFURV9Ib3ZlcjsNCisgIH0gZWxzZSBpZiAoZHdGV0xTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX01DRF9QcmVzc2VkKSB7DQorICAgIHJldHVybiBGV0xUSEVNRV9TVEFURV9QcmVzc2VkOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTFRIRU1FX1NUQVRFX05vcm1hbDsNCit9DQordm9pZCBDRldMX01vbnRoQ2FsZW5kYXJUUDo6U2V0VGhlbWVEYXRhKEZYX0RXT1JEIGR3VGhlbWVJRCkgew0KKyAgaWYgKGR3VGhlbWVJRCA9PSAwKSB7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQ2FwdGlvbiA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgMTUzLCAyNTUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclNlcGVyYXRvciA9IEFyZ2JFbmNvZGUoMHhmZiwgMTQxLCAxNjEsIDIzOSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRGF0ZXNIb3ZlckJLID0gQXJnYkVuY29kZSgweGZmLCAxOTMsIDIxMSwgMjUxKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJEYXRlc1NlbGVjdGVkQksgPSBBcmdiRW5jb2RlKDB4ZmYsIDE3MywgMTg4LCAyMzkpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckRhdGVzQ2lyY2xlID0gQXJnYkVuY29kZSgweGZmLCAxMDMsIDE0NCwgMjA5KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJUb2RheSA9IEFyZ2JFbmNvZGUoMHhmZiwgMCwgMCwgMCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQksgPSBBcmdiRW5jb2RlKDB4ZmYsIDI1NSwgMjU1LCAyNTUpOw0KKyAgfSBlbHNlIHsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJDYXB0aW9uID0gQXJnYkVuY29kZSgweGZmLCAxMjgsIDEyOCwgMCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyU2VwZXJhdG9yID0gQXJnYkVuY29kZSgweGZmLCAxMjgsIDEyOCwgNjQpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckRhdGVzSG92ZXJCSyA9IEFyZ2JFbmNvZGUoMHhmZiwgMjE3LCAyMjAsIDE5MSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRGF0ZXNTZWxlY3RlZEJLID0gQXJnYkVuY29kZSgweGZmLCAyMDQsIDIwOCwgMTgzKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJEYXRlc0NpcmNsZSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTI4LCAxMjgsIDApOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclRvZGF5ID0gQXJnYkVuY29kZSgweGZmLCAwLCAwLCAwKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCSyA9IEFyZ2JFbmNvZGUoMHhmZiwgMjU1LCAyNTUsIDI1NSk7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy90aGVtZS9waWN0dXJlYm94dHAuY3BwIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL3BpY3R1cmVib3h0cC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJjN2U0NAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy90aGVtZS9waWN0dXJlYm94dHAuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCitDRldMX1BpY3R1cmVCb3hUUDo6Q0ZXTF9QaWN0dXJlQm94VFAoKSB7fQ0KK0NGV0xfUGljdHVyZUJveFRQOjp+Q0ZXTF9QaWN0dXJlQm94VFAoKSB7fQ0KK0ZYX0JPT0wgQ0ZXTF9QaWN0dXJlQm94VFA6OklzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIGlmICghcFdpZGdldCkNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgcmV0dXJuIHBXaWRnZXQtPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX1BpY3R1cmVCb3g7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9QaWN0dXJlQm94VFA6OkRyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKSB7DQorICBpZiAoIXBQYXJhbXMpDQorICAgIHJldHVybiBGQUxTRTsNCisgIHN3aXRjaCAocFBhcmFtcy0+bV9pUGFydCkgew0KKyAgICBjYXNlIEZXTF9QQVJUX1BUQl9Cb3JkZXI6IHsNCisgICAgICBEcmF3Qm9yZGVyKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9QVEJfRWRnZTogew0KKyAgICAgIERyYXdFZGdlKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBwUGFyYW1zLT5tX3BXaWRnZXQtPkdldFN0eWxlcygpLA0KKyAgICAgICAgICAgICAgICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy90aGVtZS9wdXNoYnV0dG9udHAuY3BwIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL3B1c2hidXR0b250cC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY3YzRmZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZndsL3NyYy90aGVtZS9wdXNoYnV0dG9udHAuY3BwCkBAIC0wLDAgKzEsMTUyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2RlZmluZSBQVVNIQlVUVE9OX1NJWkVfQ29ybmVyIDINCitDRldMX1B1c2hCdXR0b25UUDo6Q0ZXTF9QdXNoQnV0dG9uVFAoKSB7DQorICBtX3BUaGVtZURhdGEgPSBuZXcgUEJUaGVtZURhdGE7DQorICBTZXRUaGVtZURhdGEoMCk7DQorfQ0KK0NGV0xfUHVzaEJ1dHRvblRQOjp+Q0ZXTF9QdXNoQnV0dG9uVFAoKSB7DQorICBpZiAobV9wVGhlbWVEYXRhKSB7DQorICAgIGRlbGV0ZSBtX3BUaGVtZURhdGE7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9QdXNoQnV0dG9uVFA6OklzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBwV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9QdXNoQnV0dG9uOw0KK30NCitGWF9EV09SRCBDRldMX1B1c2hCdXR0b25UUDo6U2V0VGhlbWVJRChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1RoZW1lSUQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hpbGRyZW4pIHsNCisgIFNldFRoZW1lRGF0YShGV0xfR2V0VGhlbWVDb2xvcihkd1RoZW1lSUQpKTsNCisgIHJldHVybiBDRldMX1dpZGdldFRQOjpTZXRUaGVtZUlEKHBXaWRnZXQsIGR3VGhlbWVJRCwgYkNoaWxkcmVuKTsNCit9DQorRlhfQk9PTCBDRldMX1B1c2hCdXR0b25UUDo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMpIHsNCisgIHN3aXRjaCAocFBhcmFtcy0+bV9pUGFydCkgew0KKyAgICBjYXNlIEZXTF9QQVJUX1BTQl9Cb3JkZXI6IHsNCisgICAgICBEcmF3Qm9yZGVyKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCAmcFBhcmFtcy0+bV9ydFBhcnQsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9QU0JfRWRnZTogew0KKyAgICAgIERyYXdFZGdlKHBQYXJhbXMtPm1fcEdyYXBoaWNzLCBwUGFyYW1zLT5tX3BXaWRnZXQtPkdldFN0eWxlcygpLA0KKyAgICAgICAgICAgICAgICZwUGFyYW1zLT5tX3J0UGFydCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUX1BTQl9CYWNrZ3JvdW5kOiB7DQorICAgICAgQ0ZYX1JlY3RGJiByZWN0ID0gcFBhcmFtcy0+bV9ydFBhcnQ7DQorICAgICAgRlhfRkxPQVQgZlJpZ2h0ID0gcmVjdC5yaWdodCgpOw0KKyAgICAgIEZYX0ZMT0FUIGZCb3R0b20gPSByZWN0LmJvdHRvbSgpOw0KKyAgICAgIENGWF9QYXRoIHN0cm9rZVBhdGg7DQorICAgICAgc3Ryb2tlUGF0aC5DcmVhdGUoKTsNCisgICAgICBzdHJva2VQYXRoLk1vdmVUbyhyZWN0LmxlZnQgKyBQVVNIQlVUVE9OX1NJWkVfQ29ybmVyLCByZWN0LnRvcCk7DQorICAgICAgc3Ryb2tlUGF0aC5MaW5lVG8oZlJpZ2h0IC0gUFVTSEJVVFRPTl9TSVpFX0Nvcm5lciwgcmVjdC50b3ApOw0KKyAgICAgIHN0cm9rZVBhdGguTGluZVRvKGZSaWdodCwgcmVjdC50b3AgKyBQVVNIQlVUVE9OX1NJWkVfQ29ybmVyKTsNCisgICAgICBzdHJva2VQYXRoLkxpbmVUbyhmUmlnaHQsIGZCb3R0b20gLSBQVVNIQlVUVE9OX1NJWkVfQ29ybmVyKTsNCisgICAgICBzdHJva2VQYXRoLkxpbmVUbyhmUmlnaHQgLSBQVVNIQlVUVE9OX1NJWkVfQ29ybmVyLCBmQm90dG9tKTsNCisgICAgICBzdHJva2VQYXRoLkxpbmVUbyhyZWN0LmxlZnQgKyBQVVNIQlVUVE9OX1NJWkVfQ29ybmVyLCBmQm90dG9tKTsNCisgICAgICBzdHJva2VQYXRoLkxpbmVUbyhyZWN0LmxlZnQsIGZCb3R0b20gLSBQVVNIQlVUVE9OX1NJWkVfQ29ybmVyKTsNCisgICAgICBzdHJva2VQYXRoLkxpbmVUbyhyZWN0LmxlZnQsIHJlY3QudG9wICsgUFVTSEJVVFRPTl9TSVpFX0Nvcm5lcik7DQorICAgICAgc3Ryb2tlUGF0aC5MaW5lVG8ocmVjdC5sZWZ0ICsgUFVTSEJVVFRPTl9TSVpFX0Nvcm5lciwgcmVjdC50b3ApOw0KKyAgICAgIENGWF9QYXRoIGZpbGxQYXRoOw0KKyAgICAgIGZpbGxQYXRoLkNyZWF0ZSgpOw0KKyAgICAgIGZpbGxQYXRoLkFkZFN1YnBhdGgoJnN0cm9rZVBhdGgpOw0KKyAgICAgIENGWF9HcmFwaGljcyogcEdyYXBoaWNzID0gcFBhcmFtcy0+bV9wR3JhcGhpY3M7DQorICAgICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgICAgIENGWF9SZWN0RiBydElubmVyKHJlY3QpOw0KKyAgICAgIHJ0SW5uZXIuRGVmbGF0ZShQVVNIQlVUVE9OX1NJWkVfQ29ybmVyICsgMSwgUFVTSEJVVFRPTl9TSVpFX0Nvcm5lciArIDEsDQorICAgICAgICAgICAgICAgICAgICAgIFBVU0hCVVRUT05fU0laRV9Db3JuZXIsIFBVU0hCVVRUT05fU0laRV9Db3JuZXIpOw0KKyAgICAgIGZpbGxQYXRoLkFkZFJlY3RhbmdsZShydElubmVyLmxlZnQsIHJ0SW5uZXIudG9wLCBydElubmVyLndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBydElubmVyLmhlaWdodCk7DQorICAgICAgaW50MzJfdCBpQ29sb3IgPSBHZXRDb2xvcklEKHBQYXJhbXMtPm1fZHdTdGF0ZXMpOw0KKyAgICAgIERyYXdBeGlhbFNoYWRpbmcocEdyYXBoaWNzLCByZWN0LmxlZnQgKyBQVVNIQlVUVE9OX1NJWkVfQ29ybmVyLCByZWN0LnRvcCwNCisgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubGVmdCArIFBVU0hCVVRUT05fU0laRV9Db3JuZXIsIHJlY3QuYm90dG9tKCksDQorICAgICAgICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsclN0YXJ0W2lDb2xvcl0sDQorICAgICAgICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckVuZFtpQ29sb3JdLCAmZmlsbFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICBGWEZJTExfQUxURVJOQVRFLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIENGWF9Db2xvciBjclN0cm9rZShtX3BUaGVtZURhdGEtPmNsckJvcmRlcltpQ29sb3JdKTsNCisgICAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjclN0cm9rZSk7DQorICAgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZzdHJva2VQYXRoLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGZpbGxQYXRoLkNsZWFyKCk7DQorICAgICAgZmlsbFBhdGguQWRkUmVjdGFuZ2xlKHJ0SW5uZXIubGVmdCwgcnRJbm5lci50b3AsIHJ0SW5uZXIud2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0SW5uZXIuaGVpZ2h0KTsNCisgICAgICBDRlhfQ29sb3IgY3JGaWxsKG1fcFRoZW1lRGF0YS0+Y2xyRmlsbFtpQ29sb3JdKTsNCisgICAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsNCisgICAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZmaWxsUGF0aCwgRlhGSUxMX1dJTkRJTkcsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgaWYgKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfUEFSVFNUQVRFX1BTQl9Gb2N1c2VkKSB7DQorICAgICAgICBydElubmVyLkluZmxhdGUoMSwgMSwgMCwgMCk7DQorICAgICAgICBEcmF3Rm9jdXMocEdyYXBoaWNzLCAmcnRJbm5lciwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICB9DQorICAgICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCogQ0ZXTF9QdXNoQnV0dG9uVFA6OkdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0NhcGFjaXR5KSB7DQorICBpZiAoZHdDYXBhY2l0eSA9PSBGV0xfV0dUQ0FQQUNJVFlfUFNCX01hcmdpbikgew0KKyAgICBtX2ZWYWx1ZSA9IDA7DQorICAgIHJldHVybiAmbV9mVmFsdWU7DQorICB9DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6R2V0Q2FwYWNpdHkocFRoZW1lUGFydCwgZHdDYXBhY2l0eSk7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9QdXNoQnV0dG9uVFA6OkluaXRpYWxpemUoKSB7DQorICBJbml0VFRPKCk7DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6SW5pdGlhbGl6ZSgpOw0KK30NCitGV0xfRVJSIENGV0xfUHVzaEJ1dHRvblRQOjpGaW5hbGl6ZSgpIHsNCisgIEZpbmFsaXplVFRPKCk7DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6RmluYWxpemUoKTsNCit9DQordm9pZCBDRldMX1B1c2hCdXR0b25UUDo6U2V0VGhlbWVEYXRhKEZYX0RXT1JEIGR3SUQpIHsNCisgIGlmIChkd0lEKSB7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQm9yZGVyWzBdID0gQXJnYkVuY29kZSgyNTUsIDU1LCA5OCwgNik7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQm9yZGVyWzFdID0gQXJnYkVuY29kZSgyNTUsIDU1LCA5OCwgNik7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQm9yZGVyWzJdID0gQXJnYkVuY29kZSgyNTUsIDU1LCA5OCwgNik7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQm9yZGVyWzNdID0gQXJnYkVuY29kZSgyNTUsIDU1LCA5OCwgNik7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQm9yZGVyWzRdID0gQXJnYkVuY29kZSgyNTUsIDE3MiwgMTY4LCAxNTMpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclN0YXJ0WzBdID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNDYpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclN0YXJ0WzFdID0gQXJnYkVuY29kZSgyNTUsIDIyMywgMjA1LCAxODApOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclN0YXJ0WzJdID0gQXJnYkVuY29kZSgyNTUsIDI1MiwgMTk3LCAxNDkpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclN0YXJ0WzNdID0gQXJnYkVuY29kZSgyNTUsIDE5NCwgMjA5LCAxNDMpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclN0YXJ0WzRdID0gQXJnYkVuY29kZSgyNTUsIDIxNiwgMjE2LCAyMTYpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckVuZFswXSA9IEFyZ2JFbmNvZGUoMjU1LCAyMjcsIDIwOSwgMTg0KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJFbmRbMV0gPSBBcmdiRW5jb2RlKDI1NSwgMjQ4LCAyNDQsIDIyOCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRW5kWzJdID0gQXJnYkVuY29kZSgyNTUsIDIwNywgMTE0LCAzNyk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRW5kWzNdID0gQXJnYkVuY29kZSgyNTUsIDE0NCwgMTkzLCA4NCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRW5kWzRdID0gQXJnYkVuY29kZSgyNTUsIDE3MiwgMTY4LCAxNTMpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckZpbGxbMF0gPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRmlsbFsxXSA9IEFyZ2JFbmNvZGUoMjU1LCAyMjYsIDIyNSwgMjE4KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJGaWxsWzJdID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckZpbGxbM10gPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRmlsbFs0XSA9IEFyZ2JFbmNvZGUoMjU1LCAyNDUsIDI0NCwgMjM0KTsNCisgIH0gZWxzZSB7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQm9yZGVyWzBdID0gQXJnYkVuY29kZSgyNTUsIDAsIDYwLCAxMTYpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckJvcmRlclsxXSA9IEFyZ2JFbmNvZGUoMjU1LCAwLCA2MCwgMTE2KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCb3JkZXJbMl0gPSBBcmdiRW5jb2RlKDI1NSwgMCwgNjAsIDExNik7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQm9yZGVyWzNdID0gQXJnYkVuY29kZSgyNTUsIDAsIDYwLCAxMTYpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckJvcmRlcls0XSA9IEFyZ2JFbmNvZGUoMjU1LCAyMDEsIDE5OSwgMTg2KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJTdGFydFswXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJTdGFydFsxXSA9IEFyZ2JFbmNvZGUoMjU1LCAyMDksIDIwNCwgMTkzKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJTdGFydFsyXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI0MCwgMjA3KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJTdGFydFszXSA9IEFyZ2JFbmNvZGUoMjU1LCAyMDYsIDIzMSwgMjU1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJTdGFydFs0XSA9IEFyZ2JFbmNvZGUoMjU1LCAyNDUsIDI0NCwgMjM0KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJFbmRbMF0gPSBBcmdiRW5jb2RlKDI1NSwgMjE0LCAyMDgsIDE5Nyk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRW5kWzFdID0gQXJnYkVuY29kZSgyNTUsIDI0MiwgMjQxLCAyMzgpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckVuZFsyXSA9IEFyZ2JFbmNvZGUoMjU1LCAyMjksIDE1MSwgMCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRW5kWzNdID0gQXJnYkVuY29kZSgyNTUsIDEwNSwgMTMwLCAyMzgpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckVuZFs0XSA9IEFyZ2JFbmNvZGUoMjU1LCAyNDUsIDI0NCwgMjM0KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJGaWxsWzBdID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckZpbGxbMV0gPSBBcmdiRW5jb2RlKDI1NSwgMjI2LCAyMjUsIDIxOCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyRmlsbFsyXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJGaWxsWzNdID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckZpbGxbNF0gPSBBcmdiRW5jb2RlKDI1NSwgMjQ1LCAyNDQsIDIzNCk7DQorICB9DQorfQ0KK2ludDMyX3QgQ0ZXTF9QdXNoQnV0dG9uVFA6OkdldENvbG9ySUQoRlhfRFdPUkQgZHdTdGF0ZXMpIHsNCisgIHJldHVybiBkd1N0YXRlcyAmPSBGV0xfUEFSVFNUQVRFX1BTQl9NYXNrOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvc2Nyb2xsYmFydHAuY3BwIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL3Njcm9sbGJhcnRwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTU2MGVhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9md2wvc3JjL3RoZW1lL3Njcm9sbGJhcnRwLmNwcApAQCAtMCwwICsxLDM3MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNkZWZpbmUgRldMX1NDUk9MTF9QYXdMZW4gMTIuNWYNCitDRldMX1Njcm9sbEJhclRQOjpDRldMX1Njcm9sbEJhclRQKCkgew0KKyAgbV9wVGhlbWVEYXRhID0gbmV3IFNCVGhlbWVEYXRhOw0KKyAgU2V0VGhlbWVEYXRhKDApOw0KK30NCitDRldMX1Njcm9sbEJhclRQOjp+Q0ZXTF9TY3JvbGxCYXJUUCgpIHsNCisgIGlmIChtX3BUaGVtZURhdGEpIHsNCisgICAgZGVsZXRlIG1fcFRoZW1lRGF0YTsNCisgICAgbV9wVGhlbWVEYXRhID0gTlVMTDsNCisgIH0NCit9DQorRlhfQk9PTCBDRldMX1Njcm9sbEJhclRQOjpJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBpZiAoIXBXaWRnZXQpDQorICAgIHJldHVybiBGQUxTRTsNCisgIHJldHVybiBwV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX0NMQVNTSEFTSF9TY3JvbGxCYXI7DQorfQ0KK3ZvaWQqIENGV0xfU2Nyb2xsQmFyVFA6OkdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Q2FwYWNpdHkpIHsNCisgIGlmIChkd0NhcGFjaXR5ID09IEZXTF9DQVBBQ0lUWV9TQ0JfU2l6ZSkgew0KKyAgICBtX2ZWYWx1ZSA9IDU7DQorICAgIHJldHVybiAmbV9mVmFsdWU7DQorICB9DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6R2V0Q2FwYWNpdHkocFRoZW1lUGFydCwgZHdDYXBhY2l0eSk7DQorfQ0KK0ZYX0RXT1JEIENGV0xfU2Nyb2xsQmFyVFA6OlNldFRoZW1lSUQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1RoZW1lSUQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGlsZHJlbikgew0KKyAgaWYgKG1fcFRoZW1lRGF0YSkgew0KKyAgICBTZXRUaGVtZURhdGEoRldMX0dldFRoZW1lQ29sb3IoZHdUaGVtZUlEKSk7DQorICB9DQorICByZXR1cm4gQ0ZXTF9XaWRnZXRUUDo6U2V0VGhlbWVJRChwV2lkZ2V0LCBkd1RoZW1lSUQsIGJDaGlsZHJlbik7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9TY3JvbGxCYXJUUDo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMpIHsNCisgIGlmICghcFBhcmFtcykNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgSUZXTF9XaWRnZXQqIHBXaWRnZXQgPSBwUGFyYW1zLT5tX3BXaWRnZXQ7DQorICBGV0xUSEVNRV9TVEFURSBlU3RhdGUgPSBGV0xUSEVNRV9TVEFURV9Ob3JtYWw7DQorICBzd2l0Y2ggKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiAweDAzKSB7DQorICAgIGNhc2UgRldMX1BBUlRTVEFURV9TQ0JfSG92ZXJlZDogew0KKyAgICAgIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX0hvdmVyOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRTVEFURV9TQ0JfUHJlc3NlZDogew0KKyAgICAgIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX1ByZXNzZWQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVFNUQVRFX1NDQl9EaXNhYmxlZDogew0KKyAgICAgIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX0Rpc2FiYWxlOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBDRlhfR3JhcGhpY3MqIHBHcmFwaGljcyA9IHBQYXJhbXMtPm1fcEdyYXBoaWNzOw0KKyAgQ0ZYX1JlY3RGKiBwUmVjdCA9ICZwUGFyYW1zLT5tX3J0UGFydDsNCisgIEZYX0JPT0wgYlZlcnQgPSBwV2lkZ2V0LT5HZXRTdHlsZXNFeCgpOw0KKyAgc3dpdGNoIChwUGFyYW1zLT5tX2lQYXJ0KSB7DQorICAgIGNhc2UgRldMX1BBUlRfU0NCX0ZvcmVBcnJvdzogew0KKyAgICAgIERyYXdNYXhNaW5CdG4ocEdyYXBoaWNzLCBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgIGJWZXJ0ID8gRldMVEhFTUVfRElSRUNUSU9OX1VwIDogRldMVEhFTUVfRElSRUNUSU9OX0xlZnQsDQorICAgICAgICAgICAgICAgICAgICBlU3RhdGUsICZwUGFyYW1zLT5tX21hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfUEFSVF9TQ0JfQmFja0Fycm93OiB7DQorICAgICAgRHJhd01heE1pbkJ0bihwR3JhcGhpY3MsIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgYlZlcnQgPyBGV0xUSEVNRV9ESVJFQ1RJT05fRG93biA6IEZXTFRIRU1FX0RJUkVDVElPTl9SaWdodCwNCisgICAgICAgICAgICAgICAgICAgIGVTdGF0ZSwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUX1NDQl9UaHVtYjogew0KKyAgICAgIERyYXdUaHVtYkJ0bihwR3JhcGhpY3MsIHBSZWN0LCBiVmVydCwgZVN0YXRlLCBUUlVFLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1BBUlRfU0NCX0xvd2VyVHJhY2s6IHsNCisgICAgICBEcmF3VHJhY2socEdyYXBoaWNzLCBwUmVjdCwgYlZlcnQsIGVTdGF0ZSwgVFJVRSwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9QQVJUX1NDQl9VcHBlclRyYWNrOiB7DQorICAgICAgRHJhd1RyYWNrKHBHcmFwaGljcywgcFJlY3QsIGJWZXJ0LCBlU3RhdGUsIEZBTFNFLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorI2lmZGVmIFRIRU1FX1hQU2ltaWxhcg0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJUUDo6RHJhd1RodW1iQnRuKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGF3QnV0dG9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIGlmIChlU3RhdGUgPCBGV0xUSEVNRV9TVEFURV9Ob3JtYWwgfHwgZVN0YXRlID4gRldMVEhFTUVfU1RBVEVfRGlzYWJhbGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1BhdGggcGF0aDsNCisgIHBhdGguQ3JlYXRlKCk7DQorICBDRlhfUmVjdEYgcmVjdCgqcFJlY3QpOw0KKyAgaWYgKGJWZXJ0KSB7DQorICAgIHJlY3QuRGVmbGF0ZSgxLCAwKTsNCisgICAgaWYgKHJlY3QuSXNFbXB0eSgwLjFmKSkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZShyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7DQorICAgIERyYXdBeGlhbFNoYWRpbmcocEdyYXBoaWNzLCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0KCksIHJlY3QudG9wLA0KKyAgICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbZVN0YXRlIC0gMV1bMF0sDQorICAgICAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5CS1tlU3RhdGUgLSAxXVsxXSwgJnBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgICBDRlhfQ29sb3IgcmNTdHJva2U7DQorICAgIHJjU3Ryb2tlLlNldChtX3BUaGVtZURhdGEtPmNsckJ0bkJvcmRlcltlU3RhdGUgLSAxXSk7DQorICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmcmNTdHJva2UpOw0KKyAgICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICB9IGVsc2Ugew0KKyAgICByZWN0LkRlZmxhdGUoMCwgMSk7DQorICAgIGlmIChyZWN0LklzRW1wdHkoMC4xZikpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgcGF0aC5BZGRSZWN0YW5nbGUocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOw0KKyAgICBEcmF3QXhpYWxTaGFkaW5nKHBHcmFwaGljcywgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5sZWZ0LCByZWN0LmJvdHRvbSgpLA0KKyAgICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbZVN0YXRlIC0gMV1bMF0sDQorICAgICAgICAgICAgICAgICAgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5CS1tlU3RhdGUgLSAxXVsxXSwgJnBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgICBDRlhfQ29sb3IgcmNTdHJva2U7DQorICAgIHJjU3Ryb2tlLlNldChtX3BUaGVtZURhdGEtPmNsckJ0bkJvcmRlcltlU3RhdGUgLSAxXSk7DQorICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmcmNTdHJva2UpOw0KKyAgICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJUUDo6RHJhd1BhdyhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIGlmIChiVmVydCkgew0KKyAgICBGWF9GTE9BVCBmUGF3TGVuID0gRldMX1NDUk9MTF9QYXdMZW47DQorICAgIGlmIChwUmVjdC0+d2lkdGggLyAyIDw9IGZQYXdMZW4pIHsNCisgICAgICBmUGF3TGVuID0gKHBSZWN0LT53aWR0aCAtIDYpIC8gMjsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmWCA9IHBSZWN0LT5sZWZ0ICsgcFJlY3QtPndpZHRoIC8gNDsNCisgICAgRlhfRkxPQVQgZlkgPSBwUmVjdC0+dG9wICsgcFJlY3QtPmhlaWdodCAvIDI7DQorICAgIHBhdGguTW92ZVRvKGZYLCBmWSAtIDQpOw0KKyAgICBwYXRoLkxpbmVUbyhmWCArIGZQYXdMZW4sIGZZIC0gNCk7DQorICAgIHBhdGguTW92ZVRvKGZYLCBmWSAtIDIpOw0KKyAgICBwYXRoLkxpbmVUbyhmWCArIGZQYXdMZW4sIGZZIC0gMik7DQorICAgIHBhdGguTW92ZVRvKGZYLCBmWSk7DQorICAgIHBhdGguTGluZVRvKGZYICsgZlBhd0xlbiwgZlkpOw0KKyAgICBwYXRoLk1vdmVUbyhmWCwgZlkgKyAyKTsNCisgICAgcGF0aC5MaW5lVG8oZlggKyBmUGF3TGVuLCBmWSArIDIpOw0KKyAgICBDRlhfQ29sb3IgY2xyTGlnaHQobV9wVGhlbWVEYXRhLT5jbHJQYXdDb2xvckxpZ2h0W2VTdGF0ZSAtIDFdKTsNCisgICAgcEdyYXBoaWNzLT5TZXRMaW5lV2lkdGgoMSk7DQorICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNsckxpZ2h0KTsNCisgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoKTsNCisgICAgZlgrKzsNCisgICAgcGF0aC5DbGVhcigpOw0KKyAgICBwYXRoLk1vdmVUbyhmWCwgZlkgLSAzKTsNCisgICAgcGF0aC5MaW5lVG8oZlggKyBmUGF3TGVuLCBmWSAtIDMpOw0KKyAgICBwYXRoLk1vdmVUbyhmWCwgZlkgLSAxKTsNCisgICAgcGF0aC5MaW5lVG8oZlggKyBmUGF3TGVuLCBmWSAtIDEpOw0KKyAgICBwYXRoLk1vdmVUbyhmWCwgZlkgKyAxKTsNCisgICAgcGF0aC5MaW5lVG8oZlggKyBmUGF3TGVuLCBmWSArIDEpOw0KKyAgICBwYXRoLk1vdmVUbyhmWCwgZlkgKyAzKTsNCisgICAgcGF0aC5MaW5lVG8oZlggKyBmUGF3TGVuLCBmWSArIDMpOw0KKyAgICBDRlhfQ29sb3IgY2xyRGFyayhtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yRGFya1tlU3RhdGUgLSAxXSk7DQorICAgIHBHcmFwaGljcy0+U2V0TGluZVdpZHRoKDEpOw0KKyAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJEYXJrKTsNCisgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgIH0gZWxzZSB7DQorICAgIEZYX0ZMT0FUIGZQYXdMZW4gPSBGV0xfU0NST0xMX1Bhd0xlbjsNCisgICAgaWYgKHBSZWN0LT5oZWlnaHQgLyAyIDw9IGZQYXdMZW4pIHsNCisgICAgICBmUGF3TGVuID0gKHBSZWN0LT5oZWlnaHQgLSA2KSAvIDI7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZlggPSBwUmVjdC0+bGVmdCArIHBSZWN0LT53aWR0aCAvIDI7DQorICAgIEZYX0ZMT0FUIGZZID0gcFJlY3QtPnRvcCArIHBSZWN0LT5oZWlnaHQgLyA0Ow0KKyAgICBwYXRoLk1vdmVUbyhmWCAtIDQsIGZZKTsNCisgICAgcGF0aC5MaW5lVG8oZlggLSA0LCBmWSArIGZQYXdMZW4pOw0KKyAgICBwYXRoLk1vdmVUbyhmWCAtIDIsIGZZKTsNCisgICAgcGF0aC5MaW5lVG8oZlggLSAyLCBmWSArIGZQYXdMZW4pOw0KKyAgICBwYXRoLk1vdmVUbyhmWCwgZlkpOw0KKyAgICBwYXRoLkxpbmVUbyhmWCwgZlkgKyBmUGF3TGVuKTsNCisgICAgcGF0aC5Nb3ZlVG8oZlggKyAyLCBmWSk7DQorICAgIHBhdGguTGluZVRvKGZYICsgMiwgZlkgKyBmUGF3TGVuKTsNCisgICAgQ0ZYX0NvbG9yIGNsckxpZ2h0KG1fcFRoZW1lRGF0YS0+Y2xyUGF3Q29sb3JMaWdodFtlU3RhdGUgLSAxXSk7DQorICAgIHBHcmFwaGljcy0+U2V0TGluZVdpZHRoKDEpOw0KKyAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJMaWdodCk7DQorICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICAgIGZZKys7DQorICAgIHBhdGguQ2xlYXIoKTsNCisgICAgcGF0aC5Nb3ZlVG8oZlggLSAzLCBmWSk7DQorICAgIHBhdGguTGluZVRvKGZYIC0gMywgZlkgKyBmUGF3TGVuKTsNCisgICAgcGF0aC5Nb3ZlVG8oZlggLSAxLCBmWSk7DQorICAgIHBhdGguTGluZVRvKGZYIC0gMSwgZlkgKyBmUGF3TGVuKTsNCisgICAgcGF0aC5Nb3ZlVG8oZlggKyAxLCBmWSk7DQorICAgIHBhdGguTGluZVRvKGZYICsgMSwgZlkgKyBmUGF3TGVuKTsNCisgICAgcGF0aC5Nb3ZlVG8oZlggKyAzLCBmWSk7DQorICAgIHBhdGguTGluZVRvKGZYICsgMywgZlkgKyBmUGF3TGVuKTsNCisgICAgQ0ZYX0NvbG9yIGNsckRhcmsobV9wVGhlbWVEYXRhLT5jbHJQYXdDb2xvckRhcmtbZVN0YXRlIC0gMV0pOw0KKyAgICBwR3JhcGhpY3MtPlNldExpbmVXaWR0aCgxKTsNCisgICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xyRGFyayk7DQorICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJUUDo6RHJhd1RyYWNrKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTG93ZXJUcmFjaywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBpZiAoZVN0YXRlIDwgRldMVEhFTUVfU1RBVEVfTm9ybWFsIHx8IGVTdGF0ZSA+IEZXTFRIRU1FX1NUQVRFX0Rpc2FiYWxlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgIENGWF9Db2xvciBjb2xvckxpbmUoQXJnYkVuY29kZSgyNTUsIDIzOCwgMjM3LCAyMjkpKTsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgRlhfRkxPQVQgZlJpZ2h0ID0gcFJlY3QtPnJpZ2h0KCk7DQorICBGWF9GTE9BVCBmQm90dG9tID0gcFJlY3QtPmJvdHRvbSgpOw0KKyAgaWYgKGJWZXJ0KSB7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCAxLCBwUmVjdC0+aGVpZ2h0KTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUoZlJpZ2h0IC0gMSwgcFJlY3QtPnRvcCwgMSwgcFJlY3QtPmhlaWdodCk7DQorICB9IGVsc2Ugew0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgcFJlY3QtPndpZHRoLCAxKTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQsIGZCb3R0b20gLSAxLCBwUmVjdC0+d2lkdGgsIDEpOw0KKyAgfQ0KKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNvbG9yTGluZSk7DQorICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICBwYXRoLkNsZWFyKCk7DQorICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCArIDEsIHBSZWN0LT50b3AsIHBSZWN0LT53aWR0aCAtIDIsDQorICAgICAgICAgICAgICAgICAgICBwUmVjdC0+aGVpZ2h0KTsNCisgIEZYX0ZMT0FUIHgxID0gYlZlcnQgPyBwUmVjdC0+bGVmdCArIDEgOiBwUmVjdC0+bGVmdDsNCisgIEZYX0ZMT0FUIHkxID0gYlZlcnQgPyBwUmVjdC0+dG9wIDogcFJlY3QtPnRvcCArIDE7DQorICBGWF9GTE9BVCB4MiA9IGJWZXJ0ID8gZlJpZ2h0IC0gMSA6IHBSZWN0LT5sZWZ0Ow0KKyAgRlhfRkxPQVQgeTIgPSBiVmVydCA/IHBSZWN0LT50b3AgOiBmQm90dG9tIC0gMTsNCisgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCisgIERyYXdBeGlhbFNoYWRpbmcocEdyYXBoaWNzLCB4MSwgeTEsIHgyLCB5MiwgbV9wVGhlbWVEYXRhLT5jbHJUcmFja0JLU3RhcnQsDQorICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyVHJhY2tCS0VuZCwgJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCit9DQordm9pZCBDRldMX1Njcm9sbEJhclRQOjpEcmF3TWF4TWluQnRuKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9ESVJFQ1RJT04gZURpY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgRHJhd1RyYWNrKHBHcmFwaGljcywgcFJlY3QsDQorICAgICAgICAgICAgZURpY3QgPT0gRldMVEhFTUVfRElSRUNUSU9OX1VwIHx8IGVEaWN0ID09IEZXTFRIRU1FX0RJUkVDVElPTl9Eb3duLA0KKyAgICAgICAgICAgIGVTdGF0ZSwgVFJVRSwgcE1hdHJpeCk7DQorICBDRlhfUmVjdEYgcnRBcnJvd0J0bigqcFJlY3QpOw0KKyAgcnRBcnJvd0J0bi5EZWZsYXRlKDEsIDEsIDEsIDEpOw0KKyAgRHJhd0Fycm93QnRuKHBHcmFwaGljcywgJnJ0QXJyb3dCdG4sIGVEaWN0LCBlU3RhdGUsIHBNYXRyaXgpOw0KK30NCisjZWxzZQ0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJUUDo6RHJhd1RodW1iQnRuKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUGF3QnV0dG9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIGlmIChwUmVjdC0+SXNFbXB0eSgpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9SZWN0RiBydFRodW1iKCpwUmVjdCk7DQorICBGWF9GTE9BVCBmV2lkdGggPSAyOw0KKyAgRHJhdzNEUmVjdChwR3JhcGhpY3MsIEZXTFRIRU1FX0VER0VfUmFpc2VkLCBmV2lkdGgsIHBSZWN0LA0KKyAgICAgICAgICAgICBGV0xUSEVNRV9DT0xPUl9FREdFTFQxLCBGV0xUSEVNRV9DT0xPUl9FREdFTFQyLA0KKyAgICAgICAgICAgICBGV0xUSEVNRV9DT0xPUl9FREdFUkIxLCBGV0xUSEVNRV9DT0xPUl9FREdFUkIyLCBwTWF0cml4KTsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQgKyBmV2lkdGgsIHBSZWN0LT50b3AgKyBmV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICBwUmVjdC0+d2lkdGggLSAyICogZldpZHRoLCBwUmVjdC0+aGVpZ2h0IC0gMiAqIGZXaWR0aCk7DQorICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBDRlhfQ29sb3IgY3JGaWxsKEZXTFRIRU1FX0NPTE9SX0JhY2tncm91bmQpOw0KKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJUUDo6RHJhd1RyYWNrKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTG93ZXJUcmFjaywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBpZiAocFJlY3QtPklzRW1wdHkoKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCBwUmVjdC0+d2lkdGgsIHBSZWN0LT5oZWlnaHQpOw0KKyAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgQ0ZYX0NvbG9yIGNsckZpbGwoMHhGRkYwRjBGMCk7DQorICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY2xyRmlsbCk7DQorICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJUUDo6RHJhd01heE1pbkJ0bihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfRElSRUNUSU9OIGVEaWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGWF9SZWN0RiBydFRodW1iKCpwUmVjdCk7DQorICBGWF9GTE9BVCBmV2lkdGggPSBlU3RhdGUgPT0gRldMVEhFTUVfU1RBVEVfUHJlc3NlZCA/IDEuMGYgOiAyLjBmOw0KKyAgRldMVEhFTUVfRURHRSBlVHlwZSA9IGVTdGF0ZSA9PSBGV0xUSEVNRV9TVEFURV9QcmVzc2VkID8gRldMVEhFTUVfRURHRV9GbGF0DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGV0xUSEVNRV9FREdFX1JhaXNlZDsNCisgIERyYXczRFJlY3QocEdyYXBoaWNzLCBlVHlwZSwgZldpZHRoLCBwUmVjdCwgRldMVEhFTUVfQ09MT1JfRURHRUxUMSwNCisgICAgICAgICAgICAgRldMVEhFTUVfQ09MT1JfRURHRUxUMiwgRldMVEhFTUVfQ09MT1JfRURHRVJCMSwNCisgICAgICAgICAgICAgRldMVEhFTUVfQ09MT1JfRURHRVJCMiwgcE1hdHJpeCk7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0ICsgZldpZHRoLCBwUmVjdC0+dG9wICsgZldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgcFJlY3QtPndpZHRoIC0gMiAqIGZXaWR0aCwgcFJlY3QtPmhlaWdodCAtIDIgKiBmV2lkdGgpOw0KKyAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgQ0ZYX0NvbG9yIGNyRmlsbChGV0xUSEVNRV9DT0xPUl9CYWNrZ3JvdW5kKTsNCisgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOw0KKyAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KKyAgRHJhd0Fycm93KHBHcmFwaGljcywgcFJlY3QsIGVEaWN0LA0KKyAgICAgICAgICAgIGVTdGF0ZSA9PSBGV0xUSEVNRV9TVEFURV9EaXNhYmFsZSA/IDB4RkZBMEEwQTAgOiAweEZGMDAwMDAwLA0KKyAgICAgICAgICAgIGVTdGF0ZSA9PSBGV0xUSEVNRV9TVEFURV9QcmVzc2VkLCBwTWF0cml4KTsNCit9DQorI2VuZGlmDQordm9pZCBDRldMX1Njcm9sbEJhclRQOjpTZXRUaGVtZURhdGEoRlhfRFdPUkQgZHdJRCkgew0KKyAgbV9wVGhlbWVEYXRhLT5jbHJQYXdDb2xvckxpZ2h0WzNdID0gQXJnYkVuY29kZSgweGZmLCAyMDgsIDIyMywgMTcyKTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyUGF3Q29sb3JEYXJrWzNdID0gQXJnYkVuY29kZSgweGZmLCAxNDAsIDE1NywgMTE1KTsNCisgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbM11bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE2NCwgMTgwLCAxMzkpOw0KKyAgbV9wVGhlbWVEYXRhLT5jbHJCdG5CS1szXVsxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTQxLCAxNTcsIDExNSk7DQorICBtX3BUaGVtZURhdGEtPmNsckJ0bkJvcmRlclszXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMjM2LCAyMzMsIDIxNik7DQorICBpZiAoZHdJRCkgew0KKyAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yTGlnaHRbMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIwOCwgMjIzLCAxNzIpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yRGFya1swXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTQwLCAxNTcsIDExNSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE2MiwgMTc5LCAxNDEpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLWzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAxNDksIDE2NywgMTE3KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Cb3JkZXJbMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE0MiwgMTUzLCAxMjUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yTGlnaHRbMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIzNSwgMjQ1LCAyMTIpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yRGFya1sxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTgyLCAxOTgsIDE0Mik7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbMV1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIwMCwgMjEzLCAxNzApOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLWzFdWzFdID0gQXJnYkVuY29kZSgweGZmLCAxOTUsIDIwOCwgMTUwKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Cb3JkZXJbMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE4OSwgMjAzLCAxNTApOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yTGlnaHRbMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIwOCwgMjIzLCAxNzIpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yRGFya1syXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTQwLCAxNTcsIDExNSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbMl1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE2NCwgMTgwLCAxMzkpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLWzJdWzFdID0gQXJnYkVuY29kZSgweGZmLCAxNDEsIDE1NywgMTE1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Cb3JkZXJbMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDEyOCwgMTQ2LCAxMDIpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclRyYWNrQktTdGFydCA9IEFyZ2JFbmNvZGUoMHhmZiwgMjQzLCAyNDEsIDIzNik7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyVHJhY2tCS0VuZCA9IEFyZ2JFbmNvZGUoMHhmZiwgMjU0LCAyNTQsIDI1MSk7DQorICB9IGVsc2Ugew0KKyAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yTGlnaHRbMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIzOCwgMjQ0LCAyNTQpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yRGFya1swXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTQwLCAxNzYsIDI0OCk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbMF1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE5NywgMjEzLCAyNTIpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLWzBdWzFdID0gQXJnYkVuY29kZSgweGZmLCAxODIsIDIwNSwgMjUxKTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Cb3JkZXJbMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE0OCwgMTc2LCAyMjEpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yTGlnaHRbMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDI1MiwgMjUzLCAyNTUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yRGFya1sxXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTU2LCAxOTcsIDI1NSk7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbMV1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIxNiwgMjMyLCAyNTUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLWzFdWzFdID0gQXJnYkVuY29kZSgweGZmLCAyMDQsIDIyNSwgMjU1KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Cb3JkZXJbMV0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIxOCwgMjMwLCAyNTQpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yTGlnaHRbMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDIwNywgMjIxLCAyNTMpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yRGFya1syXSA9IEFyZ2JFbmNvZGUoMHhmZiwgMTMxLCAxNTgsIDIxNik7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbMl1bMF0gPSBBcmdiRW5jb2RlKDB4ZmYsIDE2NywgMTkwLCAyNDUpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLWzJdWzFdID0gQXJnYkVuY29kZSgweGZmLCAxNDYsIDE3OSwgMjQ5KTsNCisgICAgbV9wVGhlbWVEYXRhLT5jbHJCdG5Cb3JkZXJbMl0gPSBBcmdiRW5jb2RlKDB4ZmYsIDEyNCwgMTU5LCAyMTEpOw0KKyAgICBtX3BUaGVtZURhdGEtPmNsclRyYWNrQktTdGFydCA9IEFyZ2JFbmNvZGUoMHhmZiwgMjQzLCAyNDEsIDIzNik7DQorICAgIG1fcFRoZW1lRGF0YS0+Y2xyVHJhY2tCS0VuZCA9IEFyZ2JFbmNvZGUoMHhmZiwgMjU0LCAyNTQsIDI1MSk7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZndsL3NyYy90aGVtZS93aWRnZXR0cC5jcHAgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvd2lkZ2V0dHAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMzUxYjUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z3bC9zcmMvdGhlbWUvd2lkZ2V0dHAuY3BwCkBAIC0wLDAgKzEsODQ2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlIDxhbGdvcml0aG0+DQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCitzdGF0aWMgdm9pZCBGV0xfU2V0Q2hpbGRUaGVtZUlEKElGV0xfV2lkZ2V0KiBwUGFyZW50LCBGWF9EV09SRCBkd1RoZW1lSUQpIHsNCisgIElGV0xfV2lkZ2V0TWdyKiBwV2lkZ2V0TWdyID0gRldMX0dldFdpZGdldE1ncigpOw0KKyAgSUZXTF9XaWRnZXQqIHBDaGlsZCA9DQorICAgICAgcFdpZGdldE1nci0+R2V0V2lkZ2V0KHBQYXJlbnQsIEZXTF9XR1RSRUxBVElPTl9GaXJzdENoaWxkKTsNCisgIHdoaWxlIChwQ2hpbGQpIHsNCisgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUgPSBwQ2hpbGQtPkdldFRoZW1lUHJvdmlkZXIoKTsNCisgICAgaWYgKHBUaGVtZSkgew0KKyAgICAgIHBUaGVtZS0+U2V0VGhlbWVJRChwQ2hpbGQsIGR3VGhlbWVJRCwgRkFMU0UpOw0KKyAgICB9DQorICAgIEZXTF9TZXRDaGlsZFRoZW1lSUQocENoaWxkLCBkd1RoZW1lSUQpOw0KKyAgICBwQ2hpbGQgPSBwV2lkZ2V0TWdyLT5HZXRXaWRnZXQocENoaWxkLCBGV0xfV0dUUkVMQVRJT05fTmV4dFNpYmxpbmcpOw0KKyAgfQ0KK30NCitGWF9CT09MIENGV0xfV2lkZ2V0VFA6OklzVmFsaWRXaWRnZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfRFdPUkQgQ0ZXTF9XaWRnZXRUUDo6R2V0VGhlbWVJRChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIG1fZHdUaGVtZUlEOw0KK30NCitGWF9EV09SRCBDRldMX1dpZGdldFRQOjpTZXRUaGVtZUlEKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdUaGVtZUlELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hpbGRyZW4pIHsNCisgIEZYX0RXT1JEIGR3T2xkID0gbV9kd1RoZW1lSUQ7DQorICBtX2R3VGhlbWVJRCA9IGR3VGhlbWVJRDsNCisgIGlmIChDRldMX0Fycm93RGF0YTo6SXNJbnN0YW5jZSgpKSB7DQorICAgIENGV0xfQXJyb3dEYXRhOjpHZXRJbnN0YW5jZSgpLT5TZXRDb2xvckRhdGEoRldMX0dldFRoZW1lQ29sb3IoZHdUaGVtZUlEKSk7DQorICB9DQorICBpZiAoYkNoaWxkcmVuKSB7DQorICAgIEZXTF9TZXRDaGlsZFRoZW1lSUQocFdpZGdldCwgZHdUaGVtZUlEKTsNCisgIH0NCisgIHJldHVybiBkd09sZDsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldFRQOjpHZXRUaGVtZU1hdHJpeChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgmIG1hdHJpeCkgew0KKyAgbWF0cml4LlNldChfY3RtLmEsIF9jdG0uYiwgX2N0bS5jLCBfY3RtLmQsIF9jdG0uZSwgX2N0bS5mKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRldMX0VSUiBDRldMX1dpZGdldFRQOjpTZXRUaGVtZU1hdHJpeChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgew0KKyAgX2N0bS5TZXQobWF0cml4LmEsIG1hdHJpeC5iLCBtYXRyaXguYywgbWF0cml4LmQsIG1hdHJpeC5lLCBtYXRyaXguZik7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRUUDo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMpIHsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGV0xfV2lkZ2V0VFA6OkRyYXdUZXh0KENGV0xfVGhlbWVUZXh0KiBwUGFyYW1zKSB7DQorICBpZiAoIW1fcFRleHRPdXQpIHsNCisgICAgSW5pdFRUTygpOw0KKyAgfQ0KKyAgaW50MzJfdCBpTGVuID0gcFBhcmFtcy0+bV93c1RleHQuR2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbiA8PSAwKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBDRlhfR3JhcGhpY3MqIHBHcmFwaGljcyA9IHBQYXJhbXMtPm1fcEdyYXBoaWNzOw0KKyAgbV9wVGV4dE91dC0+U2V0UmVuZGVyRGV2aWNlKHBHcmFwaGljcy0+R2V0UmVuZGVyRGV2aWNlKCkpOw0KKyAgbV9wVGV4dE91dC0+U2V0U3R5bGVzKHBQYXJhbXMtPm1fZHdUVE9TdHlsZXMpOw0KKyAgbV9wVGV4dE91dC0+U2V0QWxpZ25tZW50KHBQYXJhbXMtPm1faVRUT0FsaWduKTsNCisgIENGWF9NYXRyaXgqIHBNYXRyaXggPSAmcFBhcmFtcy0+bV9tYXRyaXg7DQorICBwTWF0cml4LT5Db25jYXQoKnBHcmFwaGljcy0+R2V0TWF0cml4KCkpOw0KKyAgbV9wVGV4dE91dC0+U2V0TWF0cml4KCpwTWF0cml4KTsNCisgIG1fcFRleHRPdXQtPkRyYXdMb2dpY1RleHQocFBhcmFtcy0+bV93c1RleHQsIGlMZW4sIHBQYXJhbXMtPm1fcnRQYXJ0KTsNCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkKiBDRldMX1dpZGdldFRQOjpHZXRDYXBhY2l0eShDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0NhcGFjaXR5KSB7DQorICBzd2l0Y2ggKGR3Q2FwYWNpdHkpIHsNCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfQ1hCb3JkZXI6IHsNCisgICAgICBtX2ZWYWx1ZSA9IEZXTFRIRU1FX0NBUEFDSVRZX0NYQm9yZGVyOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX0NZQm9yZGVyOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9DWUJvcmRlcjsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9FZGdlRmxhdDogew0KKyAgICAgIG1fZlZhbHVlID0gRldMVEhFTUVfQ0FQQUNJVFlfRWRnZUZsYXQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfRWRnZVJhaXNlZDogew0KKyAgICAgIG1fZlZhbHVlID0gRldMVEhFTUVfQ0FQQUNJVFlfRWRnZVJhaXNlZDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9FZGdlU3Vua2VuOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9FZGdlU3Vua2VuOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX0ZvbnRTaXplOiB7DQorICAgICAgbV9mVmFsdWUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9Gb250U2l6ZTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9UZXh0Q29sb3I6IHsNCisgICAgICBtX2R3VmFsdWUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9UZXh0Q29sb3I7DQorICAgICAgcmV0dXJuICZtX2R3VmFsdWU7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGg6IHsNCisgICAgICBtX2ZWYWx1ZSA9IEZXTFRIRU1FX0NBUEFDSVRZX1Njcm9sbEJhcldpZHRoOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX0ZvbnQ6IHsNCisgICAgICByZXR1cm4gbV9wRkRFRm9udDsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RDQVBBQ0lUWV9UZXh0U2VsQ29sb3I6IHsNCisgICAgICBtX2R3VmFsdWUgPSAobV9kd1RoZW1lSUQgPT0gMCkgPyBGV0xUSEVNRV9DQVBBQ0lUWV9UZXh0U2VsQ29sb3INCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGV0xUSEVNRV9DT0xPUl9HcmVlbl9CS1NlbGVjdGVkOw0KKyAgICAgIHJldHVybiAmbV9kd1ZhbHVlOw0KKyAgICB9DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX0xpbmVIZWlnaHQ6IHsNCisgICAgICBtX2ZWYWx1ZSA9IEZXTFRIRU1FX0NBUEFDSVRZX0xpbmVIZWlnaHQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfVUlNYXJnaW46IHsNCisgICAgICBtX3J0TWFyZ2luLlNldCgwLCAwLCAwLCAwKTsNCisgICAgICByZXR1cm4gJm1fcnRNYXJnaW47DQorICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gTlVMTDsgfQ0KKyAgfQ0KKyAgcmV0dXJuICZtX2ZWYWx1ZTsNCit9DQorRlhfQk9PTCBDRldMX1dpZGdldFRQOjpJc0N1c3RvbWl6ZWRMYXlvdXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIHJldHVybiBGV0xfR2V0VGhlbWVMYXlvdXQobV9kd1RoZW1lSUQpOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0VFA6OkdldFBhcnRSZWN0KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9XaWRnZXRUUDo6SXNJblBhcnQoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRldMX1dpZGdldFRQOjpDYWxjVGV4dFJlY3QoQ0ZXTF9UaGVtZVRleHQqIHBQYXJhbXMsIENGWF9SZWN0RiYgcmVjdCkgew0KKyAgaWYgKCFwUGFyYW1zKQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBpZiAoIW1fcFRleHRPdXQpDQorICAgIHJldHVybiBGQUxTRTsNCisgIG1fcFRleHRPdXQtPlNldEFsaWdubWVudChwUGFyYW1zLT5tX2lUVE9BbGlnbik7DQorICBtX3BUZXh0T3V0LT5TZXRTdHlsZXMocFBhcmFtcy0+bV9kd1RUT1N0eWxlcyB8IEZERV9UVE9TVFlMRV9BcmFiaWNDb250ZXh0KTsNCisgIG1fcFRleHRPdXQtPkNhbGNMb2dpY1NpemUocFBhcmFtcy0+bV93c1RleHQsIHBQYXJhbXMtPm1fd3NUZXh0LkdldExlbmd0aCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0KTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0VFA6OkluaXRpYWxpemUoKSB7DQorICBtX2R3VGhlbWVJRCA9IDA7DQorICBfY3RtLlNldElkZW50aXR5KCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRUUDo6RmluYWxpemUoKSB7DQorICBpZiAoIW1fcFRleHRPdXQpIHsNCisgICAgRmluYWxpemVUVE8oKTsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorQ0ZXTF9XaWRnZXRUUDo6fkNGV0xfV2lkZ2V0VFAoKSB7fQ0KK0ZXTF9FUlIgQ0ZXTF9XaWRnZXRUUDo6U2V0Rm9udChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHN0ckZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiByZ2JGb250KSB7DQorICBpZiAoIW1fcFRleHRPdXQpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KKyAgbV9wRkRFRm9udCA9IEZXTF9HZXRGb250TWFuYWdlcigpLT5GaW5kRm9udChzdHJGb250LCAwLCAwKTsNCisgIG1fcFRleHRPdXQtPlNldEZvbnQobV9wRkRFRm9udCk7DQorICBtX3BUZXh0T3V0LT5TZXRGb250U2l6ZShmRm9udFNpemUpOw0KKyAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKHJnYkZvbnQpOw0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENGV0xfV2lkZ2V0VFA6OlNldEZvbnQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Gb250KiBwRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIHJnYkZvbnQpIHsNCisgIGlmICghbV9wVGV4dE91dCkgew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICBtX3BUZXh0T3V0LT5TZXRGb250KHBGb250KTsNCisgIG1fcFRleHRPdXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7DQorICBtX3BUZXh0T3V0LT5TZXRUZXh0Q29sb3IocmdiRm9udCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0lGWF9Gb250KiBDRldMX1dpZGdldFRQOjpHZXRGb250KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gbV9wRkRFRm9udDsNCit9DQorQ0ZXTF9XaWRnZXRUUDo6Q0ZXTF9XaWRnZXRUUCgpDQorICAgIDogbV9kd1JlZkNvdW50KDEpLCBtX3BUZXh0T3V0KE5VTEwpLCBtX3BGREVGb250KE5VTEwpLCBtX2R3VGhlbWVJRCgwKSB7fQ0KK0ZYX0VSUiBDRldMX1dpZGdldFRQOjpJbml0VFRPKCkgew0KKyAgaWYgKG1fcFRleHRPdXQpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KKyAgbV9wRkRFRm9udCA9IEZXTF9HZXRGb250TWFuYWdlcigpLT5GaW5kRm9udChGWF9XU1RSQyhMIkhlbHZldGljYSIpLCAwLCAwKTsNCisgIG1fcFRleHRPdXQgPSBJRkRFX1RleHRPdXQ6OkNyZWF0ZSgpOw0KKyAgbV9wVGV4dE91dC0+U2V0Rm9udChtX3BGREVGb250KTsNCisgIG1fcFRleHRPdXQtPlNldEZvbnRTaXplKEZXTFRIRU1FX0NBUEFDSVRZX0ZvbnRTaXplKTsNCisgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcihGV0xUSEVNRV9DQVBBQ0lUWV9UZXh0Q29sb3IpOw0KKyAgbV9wVGV4dE91dC0+U2V0RWxsaXBzaXNTdHJpbmcoTCIuLi4iKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRVJSIENGV0xfV2lkZ2V0VFA6OkZpbmFsaXplVFRPKCkgew0KKyAgaWYgKG1fcFRleHRPdXQpIHsNCisgICAgbV9wVGV4dE91dC0+UmVsZWFzZSgpOw0KKyAgICBtX3BUZXh0T3V0ID0gTlVMTDsNCisgIH0NCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorI2lmZGVmIFRIRU1FX1hQU2ltaWxhcg0KK3ZvaWQgQ0ZXTF9XaWRnZXRUUDo6RHJhd0VkZ2UoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBpZiAoIXBHcmFwaGljcykNCisgICAgcmV0dXJuOw0KKyAgaWYgKCFwUmVjdCkNCisgICAgcmV0dXJuOw0KKyAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgQ0ZYX0NvbG9yIGNyU3Ryb2tlKEZXTF9HZXRUaGVtZUNvbG9yKG1fZHdUaGVtZUlEKSA9PSAwDQorICAgICAgICAgICAgICAgICAgICAgICAgID8gQXJnYkVuY29kZSgyNTUsIDEyNywgMTU3LCAxODUpDQorICAgICAgICAgICAgICAgICAgICAgICAgIDogRldMVEhFTUVfQ09MT1JfR3JlZW5fQktTZWxlY3RlZCk7DQorICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjclN0cm9rZSk7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCBwUmVjdC0+d2lkdGggLSAxLA0KKyAgICAgICAgICAgICAgICAgICAgcFJlY3QtPmhlaWdodCAtIDEpOw0KKyAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgIHBhdGguQ2xlYXIoKTsNCisgIGNyU3Ryb2tlID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpOw0KKyAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY3JTdHJva2UpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQgKyAxLCBwUmVjdC0+dG9wICsgMSwgcFJlY3QtPndpZHRoIC0gMywNCisgICAgICAgICAgICAgICAgICAgIHBSZWN0LT5oZWlnaHQgLSAzKTsNCisgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KKyNlbHNlDQordm9pZCBDRldMX1dpZGdldFRQOjpEcmF3RWRnZShDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIGlmICghcEdyYXBoaWNzKQ0KKyAgICByZXR1cm47DQorICBpZiAoIXBSZWN0KQ0KKyAgICByZXR1cm47DQorICBGV0xUSEVNRV9FREdFIGVUeXBlOw0KKyAgRlhfRkxPQVQgZldpZHRoOw0KKyAgc3dpdGNoIChkd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9FZGdlTWFzaykgew0KKyAgICBjYXNlIEZXTF9XR1RTVFlMRV9FZGdlUmFpc2VkOiB7DQorICAgICAgZVR5cGUgPSBGV0xUSEVNRV9FREdFX1JhaXNlZCwgZldpZHRoID0gRldMVEhFTUVfQ0FQQUNJVFlfRWRnZVJhaXNlZDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RTVFlMRV9FZGdlU3Vua2VuOiB7DQorICAgICAgZVR5cGUgPSBGV0xUSEVNRV9FREdFX1N1bmtlbiwgZldpZHRoID0gRldMVEhFTUVfQ0FQQUNJVFlfRWRnZVN1bmtlbjsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9XR1RTVFlMRV9FZGdlRmxhdDoNCisgICAgZGVmYXVsdDogeyByZXR1cm47IH0NCisgIH0NCisgIERyYXczRFJlY3QocEdyYXBoaWNzLCBlVHlwZSwgZldpZHRoLCBwUmVjdCwgRldMVEhFTUVfQ09MT1JfRURHRUxUMSwNCisgICAgICAgICAgICAgRldMVEhFTUVfQ09MT1JfRURHRUxUMiwgRldMVEhFTUVfQ09MT1JfRURHRVJCMSwNCisgICAgICAgICAgICAgRldMVEhFTUVfQ09MT1JfRURHRVJCMiwgcE1hdHJpeCk7DQorfQ0KKyNlbmRpZg0KK3ZvaWQgQ0ZXTF9XaWRnZXRUUDo6RHJhdzNEUmVjdChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfRURHRSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGNyMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBjcjIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgY3IzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGNyNCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgaWYgKCFwR3JhcGhpY3MpDQorICAgIHJldHVybjsNCisgIGlmICghcFJlY3QpDQorICAgIHJldHVybjsNCisgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgIGlmIChlVHlwZSA9PSBGV0xUSEVNRV9FREdFX0ZsYXQpIHsNCisgICAgQ0ZYX1BhdGggcGF0aDsNCisgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsIHBSZWN0LT53aWR0aCwgcFJlY3QtPmhlaWdodCk7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0ICsgMSwgcFJlY3QtPnRvcCArIDEsIHBSZWN0LT53aWR0aCAtIDIsDQorICAgICAgICAgICAgICAgICAgICAgIHBSZWN0LT5oZWlnaHQgLSAyKTsNCisgICAgQ0ZYX0NvbG9yIGNyKEFyZ2JFbmNvZGUoMjU1LCAxMDAsIDEwMCwgMTAwKSk7DQorICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjcik7DQorICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgICAgcGF0aC5DbGVhcigpOw0KKyAgICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCArIDEsIHBSZWN0LT50b3AgKyAxLCBwUmVjdC0+d2lkdGggLSAyLA0KKyAgICAgICAgICAgICAgICAgICAgICBwUmVjdC0+aGVpZ2h0IC0gMik7DQorICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0ICsgMiwgcFJlY3QtPnRvcCArIDIsIHBSZWN0LT53aWR0aCAtIDQsDQorICAgICAgICAgICAgICAgICAgICAgIHBSZWN0LT5oZWlnaHQgLSA0KTsNCisgICAgY3IuU2V0KDB4RkZGRkZGRkYpOw0KKyAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3IpOw0KKyAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICB9IGVsc2Ugew0KKyAgICBGWF9GTE9BVCBmTGVmdCA9IHBSZWN0LT5sZWZ0Ow0KKyAgICBGWF9GTE9BVCBmUmlnaHQgPSBwUmVjdC0+cmlnaHQoKTsNCisgICAgRlhfRkxPQVQgZlRvcCA9IHBSZWN0LT50b3A7DQorICAgIEZYX0ZMT0FUIGZCb3R0b20gPSBwUmVjdC0+Ym90dG9tKCk7DQorICAgIEZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmV2lkdGggLyAyLjBmOw0KKyAgICBDRlhfQ29sb3IgY3JMVChlVHlwZSA9PSBGV0xUSEVNRV9FREdFX1JhaXNlZCA/IGNyNCA6IGNyMSk7DQorICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckxUKTsNCisgICAgQ0ZYX1BhdGggcGF0aExUOw0KKyAgICBwYXRoTFQuQ3JlYXRlKCk7DQorICAgIHBhdGhMVC5Nb3ZlVG8oZkxlZnQsIGZCb3R0b20gLSBmSGFsZldpZHRoKTsNCisgICAgcGF0aExULkxpbmVUbyhmTGVmdCwgZlRvcCk7DQorICAgIHBhdGhMVC5MaW5lVG8oZlJpZ2h0IC0gZkhhbGZXaWR0aCwgZlRvcCk7DQorICAgIHBhdGhMVC5MaW5lVG8oZlJpZ2h0IC0gZkhhbGZXaWR0aCwgZlRvcCArIGZIYWxmV2lkdGgpOw0KKyAgICBwYXRoTFQuTGluZVRvKGZMZWZ0ICsgZkhhbGZXaWR0aCwgZlRvcCArIGZIYWxmV2lkdGgpOw0KKyAgICBwYXRoTFQuTGluZVRvKGZMZWZ0ICsgZkhhbGZXaWR0aCwgZkJvdHRvbSAtIGZIYWxmV2lkdGgpOw0KKyAgICBwYXRoTFQuTGluZVRvKGZMZWZ0LCBmQm90dG9tIC0gZkhhbGZXaWR0aCk7DQorICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGhMVCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgICBjckxUID0gQ0ZYX0NvbG9yKGVUeXBlID09IEZXTFRIRU1FX0VER0VfUmFpc2VkID8gY3IzIDogY3IyKTsNCisgICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyTFQpOw0KKyAgICBwYXRoTFQuQ2xlYXIoKTsNCisgICAgcGF0aExULk1vdmVUbyhmTGVmdCArIGZIYWxmV2lkdGgsIGZCb3R0b20gLSBmV2lkdGgpOw0KKyAgICBwYXRoTFQuTGluZVRvKGZMZWZ0ICsgZkhhbGZXaWR0aCwgZlRvcCArIGZIYWxmV2lkdGgpOw0KKyAgICBwYXRoTFQuTGluZVRvKGZSaWdodCAtIGZXaWR0aCwgZlRvcCArIGZIYWxmV2lkdGgpOw0KKyAgICBwYXRoTFQuTGluZVRvKGZSaWdodCAtIGZXaWR0aCwgZlRvcCArIGZXaWR0aCk7DQorICAgIHBhdGhMVC5MaW5lVG8oZkxlZnQgKyBmV2lkdGgsIGZUb3AgKyBmV2lkdGgpOw0KKyAgICBwYXRoTFQuTGluZVRvKGZMZWZ0ICsgZldpZHRoLCBmQm90dG9tIC0gZldpZHRoKTsNCisgICAgcGF0aExULkxpbmVUbyhmTGVmdCArIGZIYWxmV2lkdGgsIGZCb3R0b20gLSBmV2lkdGgpOw0KKyAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoTFQsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgICAgQ0ZYX0NvbG9yIGNyUkIoZVR5cGUgPT0gRldMVEhFTUVfRURHRV9SYWlzZWQgPyBjcjEgOiBjcjMpOw0KKyAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JSQik7DQorICAgIENGWF9QYXRoIHBhdGhSQjsNCisgICAgcGF0aFJCLkNyZWF0ZSgpOw0KKyAgICBwYXRoUkIuTW92ZVRvKGZSaWdodCAtIGZIYWxmV2lkdGgsIGZUb3AgKyBmSGFsZldpZHRoKTsNCisgICAgcGF0aFJCLkxpbmVUbyhmUmlnaHQgLSBmSGFsZldpZHRoLCBmQm90dG9tIC0gZkhhbGZXaWR0aCk7DQorICAgIHBhdGhSQi5MaW5lVG8oZkxlZnQgKyBmSGFsZldpZHRoLCBmQm90dG9tIC0gZkhhbGZXaWR0aCk7DQorICAgIHBhdGhSQi5MaW5lVG8oZkxlZnQgKyBmSGFsZldpZHRoLCBmQm90dG9tIC0gZldpZHRoKTsNCisgICAgcGF0aFJCLkxpbmVUbyhmUmlnaHQgLSBmV2lkdGgsIGZCb3R0b20gLSBmV2lkdGgpOw0KKyAgICBwYXRoUkIuTGluZVRvKGZSaWdodCAtIGZXaWR0aCwgZlRvcCArIGZIYWxmV2lkdGgpOw0KKyAgICBwYXRoUkIuTGluZVRvKGZSaWdodCAtIGZIYWxmV2lkdGgsIGZUb3AgKyBmSGFsZldpZHRoKTsNCisgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aFJCLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICAgIGNyUkIgPSBDRlhfQ29sb3IoZVR5cGUgPT0gRldMVEhFTUVfRURHRV9SYWlzZWQgPyBjcjIgOiBjcjQpOw0KKyAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JSQik7DQorICAgIHBhdGhSQi5DbGVhcigpOw0KKyAgICBwYXRoUkIuTW92ZVRvKGZSaWdodCwgZlRvcCk7DQorICAgIHBhdGhSQi5MaW5lVG8oZlJpZ2h0LCBmQm90dG9tKTsNCisgICAgcGF0aFJCLkxpbmVUbyhmTGVmdCwgZkJvdHRvbSk7DQorICAgIHBhdGhSQi5MaW5lVG8oZkxlZnQsIGZCb3R0b20gLSBmSGFsZldpZHRoKTsNCisgICAgcGF0aFJCLkxpbmVUbyhmUmlnaHQgLSBmSGFsZldpZHRoLCBmQm90dG9tIC0gZkhhbGZXaWR0aCk7DQorICAgIHBhdGhSQi5MaW5lVG8oZlJpZ2h0IC0gZkhhbGZXaWR0aCwgZlRvcCk7DQorICAgIHBhdGhSQi5MaW5lVG8oZlJpZ2h0LCBmVG9wKTsNCisgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aFJCLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICB9DQorICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRUUDo6RHJhdzNEQ2lyY2xlKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX0VER0UgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBjcjEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBjcjIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBjcjMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBjcjQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgaWYgKCFwR3JhcGhpY3MpDQorICAgIHJldHVybjsNCisgIGlmICghcFJlY3QpDQorICAgIHJldHVybjsNCisgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgcGF0aC5BZGRBcmMocFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsIHBSZWN0LT53aWR0aCwgcFJlY3QtPmhlaWdodCwNCisgICAgICAgICAgICAgIEZXTFRIRU1FX1BJICogMyAvIDQsIEZXTFRIRU1FX1BJKTsNCisgIENGWF9Db2xvciBjckZpbGwxKGVUeXBlID09IEZXTFRIRU1FX0VER0VfUmFpc2VkID8gY3I0IDogY3IxKTsNCisgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNyRmlsbDEpOw0KKyAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsNCisgIENGWF9SZWN0RiBydElubmVyKCpwUmVjdCk7DQorICBydElubmVyLkRlZmxhdGUocFJlY3QtPndpZHRoIC8gNCwgcFJlY3QtPmhlaWdodCAvIDQpOw0KKyAgcGF0aC5DbGVhcigpOw0KKyAgcGF0aC5BZGRBcmMocnRJbm5lci5sZWZ0LCBydElubmVyLnRvcCwgcnRJbm5lci53aWR0aCwgcnRJbm5lci5oZWlnaHQsDQorICAgICAgICAgICAgICBGV0xUSEVNRV9QSSAqIDMgLyA0LCBGV0xUSEVNRV9QSSk7DQorICBDRlhfQ29sb3IgY3JGaWxsMihlVHlwZSA9PSBGV0xUSEVNRV9FREdFX1JhaXNlZCA/IGNyMyA6IGNyMik7DQorICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjckZpbGwyKTsNCisgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICBwYXRoLkNsZWFyKCk7DQorICBwYXRoLkFkZEFyYyhwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgcFJlY3QtPndpZHRoLCBwUmVjdC0+aGVpZ2h0LA0KKyAgICAgICAgICAgICAgRldMVEhFTUVfUEkgKiA3IC8gNCwgRldMVEhFTUVfUEkpOw0KKyAgQ0ZYX0NvbG9yIGNyRmlsbDMoZVR5cGUgPT0gRldMVEhFTUVfRURHRV9SYWlzZWQgPyBjcjEgOiBjcjMpOw0KKyAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY3JGaWxsMyk7DQorICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOw0KKyAgcGF0aC5BZGRBcmMocnRJbm5lci5sZWZ0LCBydElubmVyLnRvcCwgcnRJbm5lci53aWR0aCwgcnRJbm5lci5oZWlnaHQsDQorICAgICAgICAgICAgICBGV0xUSEVNRV9QSSAqIDcgLyA0LCBGV0xUSEVNRV9QSSk7DQorICBDRlhfQ29sb3IgY3JGaWxsNChlVHlwZSA9PSBGV0xUSEVNRV9FREdFX1JhaXNlZCA/IGNyMiA6IGNyNCk7DQorICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjckZpbGw0KTsNCisgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRUUDo6RHJhd0JvcmRlcihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgaWYgKCFwR3JhcGhpY3MpDQorICAgIHJldHVybjsNCisgIGlmICghcFJlY3QpDQorICAgIHJldHVybjsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsIHBSZWN0LT53aWR0aCwgcFJlY3QtPmhlaWdodCk7DQorICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCArIDEsIHBSZWN0LT50b3AgKyAxLCBwUmVjdC0+d2lkdGggLSAyLA0KKyAgICAgICAgICAgICAgICAgICAgcFJlY3QtPmhlaWdodCAtIDIpOw0KKyAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgQ0ZYX0NvbG9yIGNyRmlsbChBcmdiRW5jb2RlKDI1NSwgMCwgMCwgMCkpOw0KKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfQUxURVJOQVRFLCBwTWF0cml4KTsNCisgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCit9DQordm9pZCBDRldMX1dpZGdldFRQOjpGaWxsQmFja2dyb3VuZChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBGaWxsU29pbGRSZWN0KHBHcmFwaGljcywgRldMVEhFTUVfQ09MT1JfQmFja2dyb3VuZCwgcFJlY3QsIHBNYXRyaXgpOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0VFA6OkZpbGxTb2lsZFJlY3QoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZmlsbENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBpZiAoIXBHcmFwaGljcykNCisgICAgcmV0dXJuOw0KKyAgaWYgKCFwUmVjdCkNCisgICAgcmV0dXJuOw0KKyAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgQ0ZYX0NvbG9yIGNyRmlsbChmaWxsQ29sb3IpOw0KKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCBwUmVjdC0+d2lkdGgsIHBSZWN0LT5oZWlnaHQpOw0KKyAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0VFA6OkRyYXdBeGlhbFNoYWRpbmcoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBiZWdpbkNvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGVuZENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aCogcGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmaWxsTW9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgaWYgKCFwR3JhcGhpY3MpDQorICAgIHJldHVybjsNCisgIGlmICghcGF0aCkNCisgICAgcmV0dXJuOw0KKyAgQ0ZYX1BvaW50RiBiZWdQb2ludCwgZW5kUG9pbnQ7DQorICBiZWdQb2ludC5TZXQoZngxLCBmeTEpOw0KKyAgZW5kUG9pbnQuU2V0KGZ4MiwgZnkyKTsNCisgIENGWF9TaGFkaW5nIHNoYWRpbmc7DQorICBzaGFkaW5nLkNyZWF0ZUF4aWFsKGJlZ1BvaW50LCBlbmRQb2ludCwgRkFMU0UsIEZBTFNFLCBiZWdpbkNvbG9yLCBlbmRDb2xvcik7DQorICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBDRlhfQ29sb3IgY29sb3IxKCZzaGFkaW5nKTsNCisgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjb2xvcjEpOw0KKyAgcEdyYXBoaWNzLT5GaWxsUGF0aChwYXRoLCBmaWxsTW9kZSwgcE1hdHJpeCk7DQorICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRUUDo6RHJhd0FubnVsdXNSZWN0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZmlsbENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlJpbmdXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBpZiAoIXBHcmFwaGljcykNCisgICAgcmV0dXJuOw0KKyAgaWYgKCFwUmVjdCkNCisgICAgcmV0dXJuOw0KKyAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOw0KKyAgQ0ZYX0NvbG9yIGNyKGZpbGxDb2xvcik7DQorICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3IpOw0KKyAgQ0ZYX1BhdGggcGF0aDsNCisgIHBhdGguQ3JlYXRlKCk7DQorICBDRlhfUmVjdEYgcnRJbm5lcigqcFJlY3QpOw0KKyAgcnRJbm5lci5EZWZsYXRlKGZSaW5nV2lkdGgsIGZSaW5nV2lkdGgpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocnRJbm5lci5sZWZ0LCBydElubmVyLnRvcCwgcnRJbm5lci53aWR0aCwgcnRJbm5lci5oZWlnaHQpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsIHBSZWN0LT53aWR0aCwgcFJlY3QtPmhlaWdodCk7DQorICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfQUxURVJOQVRFLCBwTWF0cml4KTsNCisgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCit9DQordm9pZCBDRldMX1dpZGdldFRQOjpEcmF3QW5udWx1c0NpcmNsZShDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZmlsbENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIGlmICghcEdyYXBoaWNzKQ0KKyAgICByZXR1cm47DQorICBpZiAoIXBSZWN0KQ0KKyAgICByZXR1cm47DQorICBpZiAoZldpZHRoID4gcFJlY3QtPndpZHRoIC8gMikgew0KKyAgICByZXR1cm47DQorICB9DQorICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBDRlhfQ29sb3IgY3IoZmlsbENvbG9yKTsNCisgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjcik7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIHBhdGguQWRkRWxsaXBzZSgqcFJlY3QpOw0KKyAgQ0ZYX1JlY3RGIHJ0SW4oKnBSZWN0KTsNCisgIHJ0SW4uSW5mbGF0ZSgtZldpZHRoLCAtZldpZHRoKTsNCisgIHBhdGguQWRkRWxsaXBzZShydEluKTsNCisgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9BTFRFUk5BVEUsIHBNYXRyaXgpOw0KKyAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KK30NCit2b2lkIENGV0xfV2lkZ2V0VFA6OkRyYXdGb2N1cyhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIGlmICghcEdyYXBoaWNzKQ0KKyAgICByZXR1cm47DQorICBpZiAoIXBSZWN0KQ0KKyAgICByZXR1cm47DQorICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBDRlhfQ29sb3IgY3IoMHhGRjAwMDAwMCk7DQorICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjcik7DQorICBGWF9GTE9BVCBEYXNoUGF0dGVyblsyXSA9IHsxLCAxfTsNCisgIHBHcmFwaGljcy0+U2V0TGluZURhc2goMC4wZiwgRGFzaFBhdHRlcm4sIDIpOw0KKyAgQ0ZYX1BhdGggcGF0aDsNCisgIHBhdGguQ3JlYXRlKCk7DQorICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgcFJlY3QtPndpZHRoLCBwUmVjdC0+aGVpZ2h0KTsNCisgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KKyNkZWZpbmUgRldMVEhFTUVfQVJST1dfRGVub21pbmF0b3IgMw0KK3ZvaWQgQ0ZXTF9XaWRnZXRUUDo6RHJhd0Fycm93KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfRElSRUNUSU9OIGVEaWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYkZpbGwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJlc3NlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfUmVjdEYgcnRBcnJvdygqcFJlY3QpOw0KKyAgQ0ZYX1BhdGggcGF0aDsNCisgIHBhdGguQ3JlYXRlKCk7DQorICBGWF9GTE9BVCBmQnRuID0NCisgICAgICBzdGQ6Om1pbihwUmVjdC0+d2lkdGgsIHBSZWN0LT5oZWlnaHQpIC8gRldMVEhFTUVfQVJST1dfRGVub21pbmF0b3I7DQorICBydEFycm93LmxlZnQgPSBwUmVjdC0+bGVmdCArIChwUmVjdC0+d2lkdGggLSBmQnRuKSAvIDI7DQorICBydEFycm93LnRvcCA9IHBSZWN0LT50b3AgKyAocFJlY3QtPmhlaWdodCAtIGZCdG4pIC8gMjsNCisgIHJ0QXJyb3cud2lkdGggPSBmQnRuOw0KKyAgcnRBcnJvdy5oZWlnaHQgPSBmQnRuOw0KKyAgaWYgKGJQcmVzc2VkKSB7DQorICAgIHJ0QXJyb3cuT2Zmc2V0KDEsIDEpOw0KKyAgfQ0KKyAgc3dpdGNoIChlRGljdCkgew0KKyAgICBjYXNlIEZXTFRIRU1FX0RJUkVDVElPTl9VcDogew0KKyAgICAgIHBhdGguTW92ZVRvKHJ0QXJyb3cubGVmdCwgcnRBcnJvdy5ib3R0b20oKSk7DQorICAgICAgcGF0aC5MaW5lVG8ocnRBcnJvdy5yaWdodCgpLCBydEFycm93LmJvdHRvbSgpKTsNCisgICAgICBwYXRoLkxpbmVUbyhydEFycm93LmxlZnQgKyBmQnRuIC8gMiwgcnRBcnJvdy50b3ApOw0KKyAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cubGVmdCwgcnRBcnJvdy5ib3R0b20oKSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xUSEVNRV9ESVJFQ1RJT05fTGVmdDogew0KKyAgICAgIHBhdGguTW92ZVRvKHJ0QXJyb3cucmlnaHQoKSwgcnRBcnJvdy50b3ApOw0KKyAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cucmlnaHQoKSwgcnRBcnJvdy5ib3R0b20oKSk7DQorICAgICAgcGF0aC5MaW5lVG8ocnRBcnJvdy5sZWZ0LCBydEFycm93LnRvcCArIGZCdG4gLyAyKTsNCisgICAgICBwYXRoLkxpbmVUbyhydEFycm93LnJpZ2h0KCksIHJ0QXJyb3cudG9wKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTFRIRU1FX0RJUkVDVElPTl9SaWdodDogew0KKyAgICAgIHBhdGguTW92ZVRvKHJ0QXJyb3cubGVmdCwgcnRBcnJvdy50b3ApOw0KKyAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cubGVmdCwgcnRBcnJvdy5ib3R0b20oKSk7DQorICAgICAgcGF0aC5MaW5lVG8ocnRBcnJvdy5yaWdodCgpLCBydEFycm93LnRvcCArIGZCdG4gLyAyKTsNCisgICAgICBwYXRoLkxpbmVUbyhydEFycm93LmxlZnQsIHJ0QXJyb3cudG9wKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTFRIRU1FX0RJUkVDVElPTl9Eb3duOg0KKyAgICBkZWZhdWx0OiB7DQorICAgICAgcGF0aC5Nb3ZlVG8ocnRBcnJvdy5sZWZ0LCBydEFycm93LnRvcCk7DQorICAgICAgcGF0aC5MaW5lVG8ocnRBcnJvdy5yaWdodCgpLCBydEFycm93LnRvcCk7DQorICAgICAgcGF0aC5MaW5lVG8ocnRBcnJvdy5sZWZ0ICsgZkJ0biAvIDIsIHJ0QXJyb3cuYm90dG9tKCkpOw0KKyAgICAgIHBhdGguTGluZVRvKHJ0QXJyb3cubGVmdCwgcnRBcnJvdy50b3ApOw0KKyAgICB9DQorICB9DQorICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBDRlhfQ29sb3IgY3IoYXJnYkZpbGwpOw0KKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyKTsNCisgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsNCisgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCit9DQordm9pZCBDRldMX1dpZGdldFRQOjpEcmF3QXJyb3coQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9ESVJFQ1RJT04gZURpY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdTaWduLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIEZYX0JPT0wgYlZlcnQgPQ0KKyAgICAgIChlRGljdCA9PSBGV0xUSEVNRV9ESVJFQ1RJT05fVXAgfHwgZURpY3QgPT0gRldMVEhFTUVfRElSRUNUSU9OX0Rvd24pOw0KKyAgRlhfRkxPQVQgZkxlZnQgPQ0KKyAgICAgIChGWF9GTE9BVCkoKChwUmVjdC0+d2lkdGggLSAoYlZlcnQgPyA5IDogNikpIC8gMiArIHBSZWN0LT5sZWZ0KSArIDAuNSk7DQorICBGWF9GTE9BVCBmVG9wID0NCisgICAgICAoRlhfRkxPQVQpKCgocFJlY3QtPmhlaWdodCAtIChiVmVydCA/IDYgOiA5KSkgLyAyICsgcFJlY3QtPnRvcCkgKyAwLjUpOw0KKyAgQ0ZYX1BhdGggcGF0aDsNCisgIHBhdGguQ3JlYXRlKCk7DQorICBzd2l0Y2ggKGVEaWN0KSB7DQorICAgIGNhc2UgRldMVEhFTUVfRElSRUNUSU9OX0Rvd246IHsNCisgICAgICBwYXRoLk1vdmVUbyhmTGVmdCwgZlRvcCArIDEpOw0KKyAgICAgIHBhdGguTGluZVRvKGZMZWZ0ICsgNCwgZlRvcCArIDUpOw0KKyAgICAgIHBhdGguTGluZVRvKGZMZWZ0ICsgOCwgZlRvcCArIDEpOw0KKyAgICAgIHBhdGguTGluZVRvKGZMZWZ0ICsgNywgZlRvcCk7DQorICAgICAgcGF0aC5MaW5lVG8oZkxlZnQgKyA0LCBmVG9wICsgMyk7DQorICAgICAgcGF0aC5MaW5lVG8oZkxlZnQgKyAxLCBmVG9wKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTFRIRU1FX0RJUkVDVElPTl9VcDogew0KKyAgICAgIHBhdGguTW92ZVRvKGZMZWZ0LCBmVG9wICsgNCk7DQorICAgICAgcGF0aC5MaW5lVG8oZkxlZnQgKyA0LCBmVG9wKTsNCisgICAgICBwYXRoLkxpbmVUbyhmTGVmdCArIDgsIGZUb3AgKyA0KTsNCisgICAgICBwYXRoLkxpbmVUbyhmTGVmdCArIDcsIGZUb3AgKyA1KTsNCisgICAgICBwYXRoLkxpbmVUbyhmTGVmdCArIDQsIGZUb3AgKyAyKTsNCisgICAgICBwYXRoLkxpbmVUbyhmTGVmdCArIDEsIGZUb3AgKyA1KTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTFRIRU1FX0RJUkVDVElPTl9SaWdodDogew0KKyAgICAgIHBhdGguTW92ZVRvKGZMZWZ0ICsgMSwgZlRvcCk7DQorICAgICAgcGF0aC5MaW5lVG8oZkxlZnQgKyA1LCBmVG9wICsgNCk7DQorICAgICAgcGF0aC5MaW5lVG8oZkxlZnQgKyAxLCBmVG9wICsgOCk7DQorICAgICAgcGF0aC5MaW5lVG8oZkxlZnQsIGZUb3AgKyA3KTsNCisgICAgICBwYXRoLkxpbmVUbyhmTGVmdCArIDMsIGZUb3AgKyA0KTsNCisgICAgICBwYXRoLkxpbmVUbyhmTGVmdCwgZlRvcCArIDEpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMVEhFTUVfRElSRUNUSU9OX0xlZnQ6IHsNCisgICAgICBwYXRoLk1vdmVUbyhmTGVmdCwgZlRvcCArIDQpOw0KKyAgICAgIHBhdGguTGluZVRvKGZMZWZ0ICsgNCwgZlRvcCk7DQorICAgICAgcGF0aC5MaW5lVG8oZkxlZnQgKyA1LCBmVG9wICsgMSk7DQorICAgICAgcGF0aC5MaW5lVG8oZkxlZnQgKyAyLCBmVG9wICsgNCk7DQorICAgICAgcGF0aC5MaW5lVG8oZkxlZnQgKyA1LCBmVG9wICsgNyk7DQorICAgICAgcGF0aC5MaW5lVG8oZkxlZnQgKyA0LCBmVG9wICsgOCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIENGWF9Db2xvciBjcihhcmdTaWduKTsNCisgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjcik7DQorICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRUUDo6RHJhd0J0bihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIGlmICghQ0ZXTF9BcnJvd0RhdGE6OklzSW5zdGFuY2UoKSkgew0KKyAgICBDRldMX0Fycm93RGF0YTo6R2V0SW5zdGFuY2UoKS0+U2V0Q29sb3JEYXRhKEZXTF9HZXRUaGVtZUNvbG9yKG1fZHdUaGVtZUlEKSk7DQorICB9DQorICBDRldMX0Fycm93RGF0YTo6Q0NvbG9yRGF0YSogcENvbG9yRGF0YSA9DQorICAgICAgQ0ZXTF9BcnJvd0RhdGE6OkdldEluc3RhbmNlKCktPm1fcENvbG9yRGF0YTsNCisgIEZYX0ZMT0FUIGZSaWdodCA9IHBSZWN0LT5yaWdodCgpOw0KKyAgRlhfRkxPQVQgZkJvdHRvbSA9IHBSZWN0LT5ib3R0b20oKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCBwUmVjdC0+d2lkdGgsIHBSZWN0LT5oZWlnaHQpOw0KKyAgRHJhd0F4aWFsU2hhZGluZyhwR3JhcGhpY3MsIHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCBmUmlnaHQsIGZCb3R0b20sDQorICAgICAgICAgICAgICAgICAgIHBDb2xvckRhdGEtPmNsclN0YXJ0W2VTdGF0ZSAtIDFdLA0KKyAgICAgICAgICAgICAgICAgICBwQ29sb3JEYXRhLT5jbHJFbmRbZVN0YXRlIC0gMV0sICZwYXRoLCBGWEZJTExfV0lORElORywNCisgICAgICAgICAgICAgICAgICAgcE1hdHJpeCk7DQorICBDRlhfQ29sb3IgcmNTdHJva2U7DQorICByY1N0cm9rZS5TZXQocENvbG9yRGF0YS0+Y2xyQm9yZGVyW2VTdGF0ZSAtIDFdKTsNCisgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJnJjU3Ryb2tlKTsNCisgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorfQ0KK3ZvaWQgQ0ZXTF9XaWRnZXRUUDo6RHJhd0Fycm93QnRuKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfRElSRUNUSU9OIGVEaWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBEcmF3QnRuKHBHcmFwaGljcywgcFJlY3QsIGVTdGF0ZSwgcE1hdHJpeCk7DQorICBpZiAoIUNGV0xfQXJyb3dEYXRhOjpJc0luc3RhbmNlKCkpIHsNCisgICAgQ0ZXTF9BcnJvd0RhdGE6OkdldEluc3RhbmNlKCktPlNldENvbG9yRGF0YShGV0xfR2V0VGhlbWVDb2xvcihtX2R3VGhlbWVJRCkpOw0KKyAgfQ0KKyAgQ0ZXTF9BcnJvd0RhdGE6OkNDb2xvckRhdGEqIHBDb2xvckRhdGEgPQ0KKyAgICAgIENGV0xfQXJyb3dEYXRhOjpHZXRJbnN0YW5jZSgpLT5tX3BDb2xvckRhdGE7DQorICBEcmF3QXJyb3cocEdyYXBoaWNzLCBwUmVjdCwgZURpY3QsIHBDb2xvckRhdGEtPmNsclNpZ25bZVN0YXRlIC0gMV0sIHBNYXRyaXgpOw0KK30NCitGV0xDT0xPUiBDRldMX1dpZGdldFRQOjpCbGVuZENvbG9yKEZXTENPTE9SIHNyY0NvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMQ09MT1IgcmVuZGVyQ29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNjYWxlKSB7DQorICBGV0xDT0xPUiBkc3RDb2xvcjsNCisgIHVpbnQ4X3QgbiA9IDI1NSAtIHNjYWxlOw0KKyAgZHN0Q29sb3IuYSA9ICh1aW50OF90KSgNCisgICAgICAoKEZYX1dPUkQpc3JjQ29sb3IuYSAqIG4gKyAoRlhfV09SRClyZW5kZXJDb2xvci5hICogc2NhbGUpID4+IDgpOw0KKyAgZHN0Q29sb3IuciA9ICh1aW50OF90KSgNCisgICAgICAoKEZYX1dPUkQpc3JjQ29sb3IuciAqIG4gKyAoRlhfV09SRClyZW5kZXJDb2xvci5yICogc2NhbGUpID4+IDgpOw0KKyAgZHN0Q29sb3IuZyA9ICh1aW50OF90KSgNCisgICAgICAoKEZYX1dPUkQpc3JjQ29sb3IuZyAqIG4gKyAoRlhfV09SRClyZW5kZXJDb2xvci5nICogc2NhbGUpID4+IDgpOw0KKyAgZHN0Q29sb3IuYiA9ICh1aW50OF90KSgNCisgICAgICAoKEZYX1dPUkQpc3JjQ29sb3IuYiAqIG4gKyAoRlhfV09SRClyZW5kZXJDb2xvci5iICogc2NhbGUpID4+IDgpOw0KKyAgcmV0dXJuIGRzdENvbG9yOw0KK30NCitDRldMX0Fycm93RGF0YTo6Q0ZXTF9BcnJvd0RhdGEoKSA6IG1fcENvbG9yRGF0YShOVUxMKSB7DQorICBTZXRDb2xvckRhdGEoMCk7DQorfQ0KK0NGV0xfRm9udE1hbmFnZXIqIEZXTF9HZXRGb250TWFuYWdlcigpIHsNCisgIHN0YXRpYyBDRldMX0ZvbnRNYW5hZ2VyKiBfZm9udE1hbmFnZXIgPSBOVUxMOw0KKyAgaWYgKF9mb250TWFuYWdlciA9PSBOVUxMKSB7DQorICAgIF9mb250TWFuYWdlciA9IG5ldyBDRldMX0ZvbnRNYW5hZ2VyOw0KKyAgfQ0KKyAgcmV0dXJuIF9mb250TWFuYWdlcjsNCit9DQordm9pZCBGV0xfUmVsZWFzZUZvbnRNYW5hZ2VyKCkgew0KKyAgQ0ZXTF9Gb250TWFuYWdlciogZm9udE1hbmFnZXIgPSBGV0xfR2V0Rm9udE1hbmFnZXIoKTsNCisgIGRlbGV0ZSBmb250TWFuYWdlcjsNCit9DQorQ0ZXTF9Gb250RGF0YTo6Q0ZXTF9Gb250RGF0YSgpDQorICAgIDogbV9kd1N0eWxlcygwKSwNCisgICAgICBtX2R3Q29kZVBhZ2UoMCksDQorICAgICAgbV9wRm9udCgwKSwNCisgICAgICBtX3BGb250TWdyKE5VTEwpDQorI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCisgICAgICAsDQorICAgICAgbV9wRm9udFNvdXJjZShOVUxMKQ0KKyNlbmRpZg0KK3sNCit9DQorQ0ZXTF9Gb250RGF0YTo6fkNGV0xfRm9udERhdGEoKSB7DQorICBpZiAobV9wRm9udCkgew0KKyAgICBtX3BGb250LT5SZWxlYXNlKCk7DQorICB9DQorICBpZiAobV9wRm9udE1ncikgew0KKyAgICBtX3BGb250TWdyLT5SZWxlYXNlKCk7DQorICB9DQorI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCisgIGlmIChtX3BGb250U291cmNlICE9IE5VTEwpIHsNCisgICAgbV9wRm9udFNvdXJjZS0+UmVsZWFzZSgpOw0KKyAgfQ0KKyNlbmRpZg0KK30NCitGWF9CT09MIENGV0xfRm9udERhdGE6OkVxdWFsKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb250RmFtaWx5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UpIHsNCisgIHJldHVybiBtX3dzRmFtaWx5ID09IHdzRm9udEZhbWlseSAmJiBtX2R3U3R5bGVzID09IGR3Rm9udFN0eWxlcyAmJg0KKyAgICAgICAgIG1fZHdDb2RlUGFnZSA9PSB3Q29kZVBhZ2U7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9Gb250RGF0YTo6TG9hZEZvbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZvbnRGYW1pbHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIGR3Q29kZVBhZ2UpIHsNCisgIG1fd3NGYW1pbHkgPSB3c0ZvbnRGYW1pbHk7DQorICBtX2R3U3R5bGVzID0gZHdGb250U3R5bGVzOw0KKyAgbV9kd0NvZGVQYWdlID0gZHdDb2RlUGFnZTsNCisgIGlmICghbV9wRm9udE1ncikgew0KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQorICAgIG1fcEZvbnRNZ3IgPSBJRlhfRm9udE1ncjo6Q3JlYXRlKEZYX0dldERlZkZvbnRFbnVtZXJhdG9yKCkpOw0KKyNlbHNlDQorICAgIG1fcEZvbnRTb3VyY2UgPSBGWF9DcmVhdGVEZWZhdWx0Rm9udFNvdXJjZUVudW0oKTsNCisgICAgbV9wRm9udE1nciA9IElGWF9Gb250TWdyOjpDcmVhdGUobV9wRm9udFNvdXJjZSk7DQorI2VuZGlmDQorICB9DQorICBtX3BGb250ID0gSUZYX0ZvbnQ6OkxvYWRGb250KHdzRm9udEZhbWlseS5HZXRQdHIoKSwgZHdGb250U3R5bGVzLCBkd0NvZGVQYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGb250TWdyKTsNCisgIHJldHVybiBtX3BGb250ICE9IE5VTEw7DQorfQ0KK0NGV0xfRm9udE1hbmFnZXI6OkNGV0xfRm9udE1hbmFnZXIoKSB7fQ0KK0NGV0xfRm9udE1hbmFnZXI6On5DRldMX0ZvbnRNYW5hZ2VyKCkgew0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbV9hcnJGb250cy5HZXRTaXplKCk7IGkrKykgew0KKyAgICBkZWxldGUgc3RhdGljX2Nhc3Q8Q0ZXTF9Gb250RGF0YSo+KG1fYXJyRm9udHNbaV0pOw0KKyAgfQ0KKyAgbV9hcnJGb250cy5SZW1vdmVBbGwoKTsNCit9DQorSUZYX0ZvbnQqIENGV0xfRm9udE1hbmFnZXI6OkZpbmRGb250KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb250RmFtaWx5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX2FyckZvbnRzLkdldFNpemUoKTsgaSsrKSB7DQorICAgIENGV0xfRm9udERhdGEqIGRhdGEgPSBzdGF0aWNfY2FzdDxDRldMX0ZvbnREYXRhKj4obV9hcnJGb250c1tpXSk7DQorICAgIGlmIChkYXRhLT5FcXVhbCh3c0ZvbnRGYW1pbHksIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKSkgew0KKyAgICAgIHJldHVybiBkYXRhLT5HZXRGb250KCk7DQorICAgIH0NCisgIH0NCisgIENGV0xfRm9udERhdGEqIGZvbnREYXRhID0gbmV3IENGV0xfRm9udERhdGE7DQorICBpZiAoIWZvbnREYXRhLT5Mb2FkRm9udCh3c0ZvbnRGYW1pbHksIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKSkgew0KKyAgICBkZWxldGUgZm9udERhdGE7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgbV9hcnJGb250cy5BZGQoZm9udERhdGEpOw0KKyAgcmV0dXJuIGZvbnREYXRhLT5HZXRGb250KCk7DQorfQ0KK0ZYX0JPT0wgRldMVEhFTUVfSW5pdCgpIHsNCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIEZXTFRIRU1FX1JlbGVhc2UoKSB7DQorICBDRldMX0Fycm93RGF0YTo6RGVzdHJveUluc3RhbmNlKCk7DQorICBGV0xfUmVsZWFzZUZvbnRNYW5hZ2VyKCk7DQorfQ0KK0ZYX0RXT1JEIEZXTF9HZXRUaGVtZUxheW91dChGWF9EV09SRCBkd1RoZW1lSUQpIHsNCisgIHJldHVybiAweGZmZmYwMDAwICYgZHdUaGVtZUlEOw0KK30NCitGWF9EV09SRCBGV0xfR2V0VGhlbWVDb2xvcihGWF9EV09SRCBkd1RoZW1lSUQpIHsNCisgIHJldHVybiAweDAwMDBmZmZmICYgZHdUaGVtZUlEOw0KK30NCitGWF9EV09SRCBGV0xfTWFrZVRoZW1lSUQoRlhfRFdPUkQgZHdMYXlvdXQsIEZYX0RXT1JEIGR3Q29sb3IpIHsNCisgIHJldHVybiAoZHdMYXlvdXQgPDwgMTYpIHwgKDB4MDAwMEZGRkYgJiBkd0NvbG9yKTsNCit9DQorQ0ZXTF9BcnJvd0RhdGEqIENGV0xfQXJyb3dEYXRhOjptX3BJbnN0YW5jZSA9IE5VTEw7DQorQ0ZXTF9BcnJvd0RhdGEqIENGV0xfQXJyb3dEYXRhOjpHZXRJbnN0YW5jZSgpIHsNCisgIGlmICghbV9wSW5zdGFuY2UpIHsNCisgICAgbV9wSW5zdGFuY2UgPSBuZXcgQ0ZXTF9BcnJvd0RhdGE7DQorICB9DQorICByZXR1cm4gbV9wSW5zdGFuY2U7DQorfQ0KK0ZYX0JPT0wgQ0ZXTF9BcnJvd0RhdGE6OklzSW5zdGFuY2UoKSB7DQorICByZXR1cm4gKG1fcEluc3RhbmNlICE9IE5VTEwpOw0KK30NCit2b2lkIENGV0xfQXJyb3dEYXRhOjpEZXN0cm95SW5zdGFuY2UoKSB7DQorICBpZiAobV9wSW5zdGFuY2UpIHsNCisgICAgZGVsZXRlIG1fcEluc3RhbmNlOw0KKyAgICBtX3BJbnN0YW5jZSA9IE5VTEw7DQorICB9DQorfQ0KK0NGV0xfQXJyb3dEYXRhOjp+Q0ZXTF9BcnJvd0RhdGEoKSB7DQorICBpZiAobV9wQ29sb3JEYXRhKSB7DQorICAgIGRlbGV0ZSBtX3BDb2xvckRhdGE7DQorICAgIG1fcENvbG9yRGF0YSA9IE5VTEw7DQorICB9DQorfQ0KK3ZvaWQgQ0ZXTF9BcnJvd0RhdGE6OlNldENvbG9yRGF0YShGWF9EV09SRCBkd0lEKSB7DQorICBpZiAoIW1fcENvbG9yRGF0YSkgew0KKyAgICBtX3BDb2xvckRhdGEgPSBuZXcgQ0NvbG9yRGF0YTsNCisgIH0NCisgIGlmIChkd0lEKSB7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyQm9yZGVyWzBdID0gQXJnYkVuY29kZSgyNTUsIDE0MiwgMTUzLCAxMjUpOw0KKyAgICBtX3BDb2xvckRhdGEtPmNsckJvcmRlclsxXSA9IEFyZ2JFbmNvZGUoMjU1LCAxNTcsIDE3MSwgMTE5KTsNCisgICAgbV9wQ29sb3JEYXRhLT5jbHJCb3JkZXJbMl0gPSBBcmdiRW5jb2RlKDI1NSwgMTE4LCAxMzEsIDk3KTsNCisgICAgbV9wQ29sb3JEYXRhLT5jbHJCb3JkZXJbM10gPSBBcmdiRW5jb2RlKDI1NSwgMTcyLCAxNjgsIDE1Myk7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyU3RhcnRbMF0gPSBBcmdiRW5jb2RlKDI1NSwgMjAzLCAyMTUsIDE4Nik7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyU3RhcnRbMV0gPSBBcmdiRW5jb2RlKDI1NSwgMjE4LCAyMzIsIDE4NSk7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyU3RhcnRbMl0gPSBBcmdiRW5jb2RlKDI1NSwgMjAzLCAyMTUsIDE4Nik7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyU3RhcnRbM10gPSBBcmdiRW5jb2RlKDI1NSwgMjU0LCAyNTQsIDI1MSk7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyRW5kWzBdID0gQXJnYkVuY29kZSgyNTUsIDE0OSwgMTY3LCAxMTcpOw0KKyAgICBtX3BDb2xvckRhdGEtPmNsckVuZFsxXSA9IEFyZ2JFbmNvZGUoMjU1LCAxOTgsIDIxMSwgMTU1KTsNCisgICAgbV9wQ29sb3JEYXRhLT5jbHJFbmRbMl0gPSBBcmdiRW5jb2RlKDI1NSwgMTQ5LCAxNjcsIDExNyk7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyRW5kWzNdID0gQXJnYkVuY29kZSgyNTUsIDI0MywgMjQxLCAyMzYpOw0KKyAgICBtX3BDb2xvckRhdGEtPmNsclNpZ25bMF0gPSBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSk7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyU2lnblsxXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsNCisgICAgbV9wQ29sb3JEYXRhLT5jbHJTaWduWzJdID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpOw0KKyAgICBtX3BDb2xvckRhdGEtPmNsclNpZ25bM10gPSBBcmdiRW5jb2RlKDI1NSwgMTI4LCAxMjgsIDEyOCk7DQorICB9IGVsc2Ugew0KKyAgICBtX3BDb2xvckRhdGEtPmNsckJvcmRlclswXSA9IEFyZ2JFbmNvZGUoMjU1LCAyMDIsIDIxNiwgMjQ5KTsNCisgICAgbV9wQ29sb3JEYXRhLT5jbHJCb3JkZXJbMV0gPSBBcmdiRW5jb2RlKDI1NSwgMTcxLCAxOTAsIDIzMyk7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyQm9yZGVyWzJdID0gQXJnYkVuY29kZSgyNTUsIDEzNSwgMTQ3LCAyMTkpOw0KKyAgICBtX3BDb2xvckRhdGEtPmNsckJvcmRlclszXSA9IEFyZ2JFbmNvZGUoMjU1LCAxNzIsIDE2OCwgMTUzKTsNCisgICAgbV9wQ29sb3JEYXRhLT5jbHJTdGFydFswXSA9IEFyZ2JFbmNvZGUoMjU1LCAyMjUsIDIzNCwgMjU0KTsNCisgICAgbV9wQ29sb3JEYXRhLT5jbHJTdGFydFsxXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTMsIDI1NSwgMjU1KTsNCisgICAgbV9wQ29sb3JEYXRhLT5jbHJTdGFydFsyXSA9IEFyZ2JFbmNvZGUoMjU1LCAxMTAsIDE0MiwgMjQxKTsNCisgICAgbV9wQ29sb3JEYXRhLT5jbHJTdGFydFszXSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTQsIDI1NCwgMjUxKTsNCisgICAgbV9wQ29sb3JEYXRhLT5jbHJFbmRbMF0gPSBBcmdiRW5jb2RlKDI1NSwgMTc1LCAyMDQsIDI1MSk7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyRW5kWzFdID0gQXJnYkVuY29kZSgyNTUsIDE4NSwgMjE4LCAyNTEpOw0KKyAgICBtX3BDb2xvckRhdGEtPmNsckVuZFsyXSA9IEFyZ2JFbmNvZGUoMjU1LCAyMTAsIDIyMiwgMjM1KTsNCisgICAgbV9wQ29sb3JEYXRhLT5jbHJFbmRbM10gPSBBcmdiRW5jb2RlKDI1NSwgMjQzLCAyNDEsIDIzNik7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyU2lnblswXSA9IEFyZ2JFbmNvZGUoMjU1LCA3NywgOTcsIDEzMyk7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyU2lnblsxXSA9IEFyZ2JFbmNvZGUoMjU1LCA3NywgOTcsIDEzMyk7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyU2lnblsyXSA9IEFyZ2JFbmNvZGUoMjU1LCA3NywgOTcsIDEzMyk7DQorICAgIG1fcENvbG9yRGF0YS0+Y2xyU2lnblszXSA9IEFyZ2JFbmNvZGUoMjU1LCAxMjgsIDEyOCwgMTI4KTsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvQkNfQmFyQ29kZS5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19CYXJDb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjU3ODdiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfQmFyQ29kZS5jcHAKQEAgLTAsMCArMSw4NzcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMTEgWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19SZWFkZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfV3JpdGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX0RlY29kZXJSZXN1bHQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfTHVtaW5hbmNlU291cmNlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2UuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfQmluYXJpemVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX0JpbmFyeUJpdG1hcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19VdGlsQ29kaW5nQ29udmVydC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19SZXN1bHRQb2ludC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19CaW5hcnlCaXRtYXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfVHdvRGltV3JpdGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0QXJyYXkuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uRGVjb2RlclJlc3VsdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhSZWFkZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4V3JpdGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lRFJlYWRlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVJlYWRlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVdyaXRlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlSZWFkZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTM5V3JpdGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGFCYXJSZWFkZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kYUJhcldyaXRlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMTI4UmVhZGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhXcml0ZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFJlYWRlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU44V3JpdGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjEzUmVhZGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjEzV3JpdGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZFVQQ0FSZWFkZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkVVBDQVdyaXRlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbXBhY3Rpb24uaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxNy5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3V3JpdGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3Rvci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvZGV3b3JkLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb21tb24uaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVWYWx1ZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZU1ldGFkYXRhLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCb3VuZGluZ0JveC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Q29sdW1uLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4uaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdGlvblJlc3VsdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGVjb2RlZEJpdFN0cmVhbVBhcnNlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29kZXdvcmREZWNvZGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ01vZHVsdXNQb2x5LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ01vZHVsdXNHRi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb24uaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3UmVhZGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVSZWFkZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZVdyaXRlci5oIg0KK0NCQ19Db2RlQmFzZTo6Q0JDX0NvZGVCYXNlKCkge30NCitDQkNfQ29kZUJhc2U6On5DQkNfQ29kZUJhc2UoKSB7fQ0KK0ZYX0JPT0wgQ0JDX0NvZGVCYXNlOjpTZXRDaGFyRW5jb2RpbmcoaW50MzJfdCBlbmNvZGluZykgew0KKyAgaWYgKG1fcEJDV3JpdGVyKSB7DQorICAgIHJldHVybiBtX3BCQ1dyaXRlci0+U2V0Q2hhckVuY29kaW5nKGVuY29kaW5nKTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDQkNfQ29kZUJhc2U6OlNldE1vZHVsZUhlaWdodChpbnQzMl90IG1vZHVsZUhlaWdodCkgew0KKyAgaWYgKG1fcEJDV3JpdGVyKSB7DQorICAgIHJldHVybiBtX3BCQ1dyaXRlci0+U2V0TW9kdWxlSGVpZ2h0KG1vZHVsZUhlaWdodCk7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0JDX0NvZGVCYXNlOjpTZXRNb2R1bGVXaWR0aChpbnQzMl90IG1vZHVsZVdpZHRoKSB7DQorICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgcmV0dXJuIG1fcEJDV3JpdGVyLT5TZXRNb2R1bGVXaWR0aChtb2R1bGVXaWR0aCk7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0JDX0NvZGVCYXNlOjpTZXRIZWlnaHQoaW50MzJfdCBoZWlnaHQpIHsNCisgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICByZXR1cm4gbV9wQkNXcml0ZXItPlNldEhlaWdodChoZWlnaHQpOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENCQ19Db2RlQmFzZTo6U2V0V2lkdGgoaW50MzJfdCB3aWR0aCkgew0KKyAgaWYgKG1fcEJDV3JpdGVyKSB7DQorICAgIHJldHVybiBtX3BCQ1dyaXRlci0+U2V0V2lkdGgod2lkdGgpOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkIENCQ19Db2RlQmFzZTo6U2V0QmFja2dyb3VuZENvbG9yKEZYX0FSR0IgYmFja2dyb3VuZENvbG9yKSB7DQorICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgbV9wQkNXcml0ZXItPlNldEJhY2tncm91bmRDb2xvcihiYWNrZ3JvdW5kQ29sb3IpOw0KKyAgfQ0KK30NCit2b2lkIENCQ19Db2RlQmFzZTo6U2V0QmFyY29kZUNvbG9yKEZYX0FSR0IgZm9yZWdyb3VuZENvbG9yKSB7DQorICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgbV9wQkNXcml0ZXItPlNldEJhcmNvZGVDb2xvcihmb3JlZ3JvdW5kQ29sb3IpOw0KKyAgfQ0KK30NCitDQkNfT25lQ29kZTo6Q0JDX09uZUNvZGUoKXt9Ow0KK0NCQ19PbmVDb2RlOjp+Q0JDX09uZUNvZGUoKSB7fQ0KK0ZYX0JPT0wgQ0JDX09uZUNvZGU6OkNoZWNrQ29udGVudFZhbGlkaXR5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIHsNCisgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICByZXR1cm4gKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPkNoZWNrQ29udGVudFZhbGlkaXR5KGNvbnRlbnRzKTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX09uZUNvZGU6OkZpbHRlckNvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIHsNCisgIENGWF9XaWRlU3RyaW5nIHRtcDsNCisgIGlmIChtX3BCQ1dyaXRlciA9PSBOVUxMKSB7DQorICAgIHJldHVybiB0bXA7DQorICB9DQorICByZXR1cm4gKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPkZpbHRlckNvbnRlbnRzKGNvbnRlbnRzKTsNCit9DQordm9pZCBDQkNfT25lQ29kZTo6U2V0UHJpbnRDaGVja3N1bShGWF9CT09MIGNoZWNrc3VtKSB7DQorICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlNldFByaW50Q2hlY2tzdW0oY2hlY2tzdW0pOw0KKyAgfQ0KK30NCit2b2lkIENCQ19PbmVDb2RlOjpTZXREYXRhTGVuZ3RoKGludDMyX3QgbGVuZ3RoKSB7DQorICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlNldERhdGFMZW5ndGgobGVuZ3RoKTsNCisgIH0NCit9DQordm9pZCBDQkNfT25lQ29kZTo6U2V0Q2FsQ2hlY2tzdW0oRlhfQk9PTCBjYWxjKSB7DQorICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlNldENhbGNDaGVja3N1bShjYWxjKTsNCisgIH0NCit9DQorRlhfQk9PTCBDQkNfT25lQ29kZTo6U2V0Rm9udChDRlhfRm9udCogY0ZvbnQpIHsNCisgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICByZXR1cm4gKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlNldEZvbnQoY0ZvbnQpOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkIENCQ19PbmVDb2RlOjpTZXRGb250U2l6ZShGWF9GTE9BVCBzaXplKSB7DQorICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlNldEZvbnRTaXplKHNpemUpOw0KKyAgfQ0KK30NCit2b2lkIENCQ19PbmVDb2RlOjpTZXRGb250U3R5bGUoaW50MzJfdCBzdHlsZSkgew0KKyAgaWYgKG1fcEJDV3JpdGVyKSB7DQorICAgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5TZXRGb250U3R5bGUoc3R5bGUpOw0KKyAgfQ0KK30NCit2b2lkIENCQ19PbmVDb2RlOjpTZXRGb250Q29sb3IoRlhfQVJHQiBjb2xvcikgew0KKyAgaWYgKG1fcEJDV3JpdGVyKSB7DQorICAgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5TZXRGb250Q29sb3IoY29sb3IpOw0KKyAgfQ0KK30NCitDQkNfQ29kZTM5OjpDQkNfQ29kZTM5KCkgew0KKyAgbV9wQkNSZWFkZXIgPSAoQ0JDX1JlYWRlciopbmV3IChDQkNfT25lZENvZGUzOVJlYWRlcik7DQorICBtX3BCQ1dyaXRlciA9IChDQkNfV3JpdGVyKiluZXcgKENCQ19PbmVkQ29kZTM5V3JpdGVyKTsNCit9DQorQ0JDX0NvZGUzOTo6Q0JDX0NvZGUzOShGWF9CT09MIHVzaW5nQ2hlY2tEaWdpdCkgew0KKyAgbV9wQkNSZWFkZXIgPSAoQ0JDX1JlYWRlciopbmV3IENCQ19PbmVkQ29kZTM5UmVhZGVyKHVzaW5nQ2hlY2tEaWdpdCk7DQorICBtX3BCQ1dyaXRlciA9IChDQkNfV3JpdGVyKiluZXcgQ0JDX09uZWRDb2RlMzlXcml0ZXI7DQorfQ0KK0NCQ19Db2RlMzk6OkNCQ19Db2RlMzkoRlhfQk9PTCB1c2luZ0NoZWNrRGlnaXQsIEZYX0JPT0wgZXh0ZW5kZWRNb2RlKSB7DQorICBtX3BCQ1JlYWRlciA9DQorICAgICAgKENCQ19SZWFkZXIqKW5ldyBDQkNfT25lZENvZGUzOVJlYWRlcih1c2luZ0NoZWNrRGlnaXQsIGV4dGVuZGVkTW9kZSk7DQorICBtX3BCQ1dyaXRlciA9IChDQkNfV3JpdGVyKiluZXcgQ0JDX09uZWRDb2RlMzlXcml0ZXIoZXh0ZW5kZWRNb2RlKTsNCit9DQorQ0JDX0NvZGUzOTo6fkNCQ19Db2RlMzkoKSB7DQorICBpZiAobV9wQkNSZWFkZXIpIHsNCisgICAgZGVsZXRlIChtX3BCQ1JlYWRlcik7DQorICAgIG1fcEJDUmVhZGVyID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICBkZWxldGUgKG1fcEJDV3JpdGVyKTsNCisgICAgbV9wQkNXcml0ZXIgPSBOVUxMOw0KKyAgfQ0KK30NCitGWF9CT09MIENCQ19Db2RlMzk6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGNvbnRlbnRzLklzRW1wdHkoKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Ob0NvbnRlbnRzOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBCQ0ZPUk1BVCBmb3JtYXQgPSBCQ0ZPUk1BVF9DT0RFXzM5Ow0KKyAgaW50MzJfdCBvdXRXaWR0aCA9IDA7DQorICBpbnQzMl90IG91dEhlaWdodCA9IDA7DQorICBDRlhfV2lkZVN0cmluZyBmaWx0ZXJjb250ZW50cyA9DQorICAgICAgKChDQkNfT25lZENvZGUzOVdyaXRlciopbV9wQkNXcml0ZXIpLT5GaWx0ZXJDb250ZW50cyhjb250ZW50cyk7DQorICBDRlhfV2lkZVN0cmluZyByZW5kZXJDb250ZW50cyA9DQorICAgICAgKChDQkNfT25lZENvZGUzOVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJUZXh0Q29udGVudHMoY29udGVudHMpOw0KKyAgbV9yZW5kZXJDb250ZW50cyA9IHJlbmRlckNvbnRlbnRzOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IGZpbHRlcmNvbnRlbnRzLlVURjhFbmNvZGUoKTsNCisgIHVpbnQ4X3QqIGRhdGEgPSBzdGF0aWNfY2FzdDxDQkNfT25lZENvZGUzOVdyaXRlcio+KG1fcEJDV3JpdGVyKQ0KKyAgICAgICAgICAgICAgICAgICAgICAtPkVuY29kZShieXRlU3RyaW5nLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpDQorICAgICAgLT5SZW5kZXJSZXN1bHQocmVuZGVyQ29udGVudHMsIGRhdGEsIG91dFdpZHRoLCBpc0RldmljZSwgZSk7DQorICBGWF9GcmVlKGRhdGEpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENCQ19Db2RlMzk6OlJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9XaWRlU3RyaW5nIHJlbmRlckNvbiA9ICgoQ0JDX09uZWRDb2RlMzlXcml0ZXIqKW1fcEJDV3JpdGVyKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ZW5jb2RlZENvbnRlbnRzKG1fcmVuZGVyQ29udGVudHMsIGUpOw0KKyAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlcikNCisgICAgICAtPlJlbmRlckRldmljZVJlc3VsdChkZXZpY2UsIG1hdGlyeCwgcmVuZGVyQ29uLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDQkNfQ29kZTM5OjpSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgcmVuZGVyQ29uID0gKChDQkNfT25lZENvZGUzOVdyaXRlciopbV9wQkNXcml0ZXIpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5lbmNvZGVkQ29udGVudHMobV9yZW5kZXJDb250ZW50cywgZSk7DQorICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKQ0KKyAgICAgIC0+UmVuZGVyQml0bWFwUmVzdWx0KHBPdXRCaXRtYXAsIHJlbmRlckNvbiwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19Db2RlMzk6OkRlY29kZSh1aW50OF90KiBidWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9XaWRlU3RyaW5nIHN0cjsNCisgIHJldHVybiBzdHI7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19Db2RlMzk6OkRlY29kZShDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludDMyX3QmIGUpIHsNCisgIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlIHNvdXJjZShwQml0bWFwKTsNCisgIENCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIgYmluYXJpemVyKCZzb3VyY2UpOw0KKyAgQ0JDX0JpbmFyeUJpdG1hcCBiaXRtYXAoJmJpbmFyaXplcik7DQorICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBtX3BCQ1JlYWRlci0+RGVjb2RlKCZiaXRtYXAsIDAsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZYX1dTVFJDKEwiIikpOw0KKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzdHIsIHN0ci5HZXRMZW5ndGgoKSk7DQorfQ0KK0ZYX0JPT0wgQ0JDX0NvZGUzOTo6U2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKSB7DQorICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgcmV0dXJuICgoQ0JDX09uZWRDb2RlMzlXcml0ZXIqKW1fcEJDV3JpdGVyKS0+U2V0VGV4dExvY2F0aW9uKGxvY2F0aW9uKTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDQkNfQ29kZTM5OjpTZXRXaWRlTmFycm93UmF0aW8oaW50MzJfdCByYXRpbykgew0KKyAgaWYgKG1fcEJDV3JpdGVyKSB7DQorICAgIHJldHVybiAoKENCQ19PbmVkQ29kZTM5V3JpdGVyKiltX3BCQ1dyaXRlciktPlNldFdpZGVOYXJyb3dSYXRpbyhyYXRpbyk7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0NCQ19Db2RhYmFyOjpDQkNfQ29kYWJhcigpIHsNCisgIG1fcEJDUmVhZGVyID0gKENCQ19SZWFkZXIqKW5ldyAoQ0JDX09uZWRDb2RhQmFyUmVhZGVyKTsNCisgIG1fcEJDV3JpdGVyID0gKENCQ19Xcml0ZXIqKW5ldyAoQ0JDX09uZWRDb2RhQmFyV3JpdGVyKTsNCit9DQorQ0JDX0NvZGFiYXI6On5DQkNfQ29kYWJhcigpIHsNCisgIGlmIChtX3BCQ1JlYWRlcikgew0KKyAgICBkZWxldGUgKG1fcEJDUmVhZGVyKTsNCisgICAgbV9wQkNSZWFkZXIgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcEJDV3JpdGVyKSB7DQorICAgIGRlbGV0ZSAobV9wQkNXcml0ZXIpOw0KKyAgICBtX3BCQ1dyaXRlciA9IE5VTEw7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ0JDX0NvZGFiYXI6OlNldFN0YXJ0Q2hhcihGWF9DSEFSIHN0YXJ0KSB7DQorICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgcmV0dXJuICgoQ0JDX09uZWRDb2RhQmFyV3JpdGVyKiltX3BCQ1dyaXRlciktPlNldFN0YXJ0Q2hhcihzdGFydCk7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0JDX0NvZGFiYXI6OlNldEVuZENoYXIoRlhfQ0hBUiBlbmQpIHsNCisgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICByZXR1cm4gKChDQkNfT25lZENvZGFCYXJXcml0ZXIqKW1fcEJDV3JpdGVyKS0+U2V0RW5kQ2hhcihlbmQpOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENCQ19Db2RhYmFyOjpTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pIHsNCisgIHJldHVybiAoKENCQ19PbmVkQ29kYUJhcldyaXRlciopbV9wQkNXcml0ZXIpLT5TZXRUZXh0TG9jYXRpb24obG9jYXRpb24pOw0KK30NCitGWF9CT09MIENCQ19Db2RhYmFyOjpTZXRXaWRlTmFycm93UmF0aW8oaW50MzJfdCByYXRpbykgew0KKyAgaWYgKG1fcEJDV3JpdGVyKSB7DQorICAgIHJldHVybiAoKENCQ19PbmVkQ29kYUJhcldyaXRlciopbV9wQkNXcml0ZXIpLT5TZXRXaWRlTmFycm93UmF0aW8ocmF0aW8pOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENCQ19Db2RhYmFyOjpFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0RldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGNvbnRlbnRzLklzRW1wdHkoKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Ob0NvbnRlbnRzOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBCQ0ZPUk1BVCBmb3JtYXQgPSBCQ0ZPUk1BVF9DT0RBQkFSOw0KKyAgaW50MzJfdCBvdXRXaWR0aCA9IDA7DQorICBpbnQzMl90IG91dEhlaWdodCA9IDA7DQorICBDRlhfV2lkZVN0cmluZyBmaWx0ZXJjb250ZW50cyA9DQorICAgICAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPkZpbHRlckNvbnRlbnRzKGNvbnRlbnRzKTsNCisgIENGWF9CeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBmaWx0ZXJjb250ZW50cy5VVEY4RW5jb2RlKCk7DQorICBtX3JlbmRlckNvbnRlbnRzID0gZmlsdGVyY29udGVudHM7DQorICB1aW50OF90KiBkYXRhID0gc3RhdGljX2Nhc3Q8Q0JDX09uZWRDb2RhQmFyV3JpdGVyKj4obV9wQkNXcml0ZXIpDQorICAgICAgICAgICAgICAgICAgICAgIC0+RW5jb2RlKGJ5dGVTdHJpbmcsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlcikNCisgICAgICAtPlJlbmRlclJlc3VsdChmaWx0ZXJjb250ZW50cywgZGF0YSwgb3V0V2lkdGgsIGlzRGV2aWNlLCBlKTsNCisgIEZYX0ZyZWUoZGF0YSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0JDX0NvZGFiYXI6OlJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgcmVuZGVyQ29uID0NCisgICAgICAoKENCQ19PbmVkQ29kYUJhcldyaXRlciopbV9wQkNXcml0ZXIpLT5lbmNvZGVkQ29udGVudHMobV9yZW5kZXJDb250ZW50cyk7DQorICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKQ0KKyAgICAgIC0+UmVuZGVyRGV2aWNlUmVzdWx0KGRldmljZSwgbWF0aXJ4LCByZW5kZXJDb24sIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENCQ19Db2RhYmFyOjpSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgcmVuZGVyQ29uID0NCisgICAgICAoKENCQ19PbmVkQ29kYUJhcldyaXRlciopbV9wQkNXcml0ZXIpLT5lbmNvZGVkQ29udGVudHMobV9yZW5kZXJDb250ZW50cyk7DQorICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKQ0KKyAgICAgIC0+UmVuZGVyQml0bWFwUmVzdWx0KHBPdXRCaXRtYXAsIHJlbmRlckNvbiwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19Db2RhYmFyOjpEZWNvZGUodWludDhfdCogYnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDRlhfV2lkZVN0cmluZyBzdHI7DQorICByZXR1cm4gc3RyOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfQ29kYWJhcjo6RGVjb2RlKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50MzJfdCYgZSkgew0KKyAgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2Ugc291cmNlKHBCaXRtYXApOw0KKyAgQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplciBiaW5hcml6ZXIoJnNvdXJjZSk7DQorICBDQkNfQmluYXJ5Qml0bWFwIGJpdG1hcCgmYmluYXJpemVyKTsNCisgIENGWF9CeXRlU3RyaW5nIHN0ciA9IG1fcEJDUmVhZGVyLT5EZWNvZGUoJmJpdG1hcCwgMCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRlhfV1NUUkMoTCIiKSk7DQorICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN0ciwgc3RyLkdldExlbmd0aCgpKTsNCit9DQorQ0JDX0NvZGUxMjg6OkNCQ19Db2RlMTI4KEJDX1RZUEUgdHlwZSkgew0KKyAgbV9wQkNSZWFkZXIgPSAoQ0JDX1JlYWRlciopbmV3IChDQkNfT25lZENvZGUxMjhSZWFkZXIpOw0KKyAgbV9wQkNXcml0ZXIgPSAoQ0JDX1dyaXRlciopbmV3IENCQ19PbmVkQ29kZTEyOFdyaXRlcih0eXBlKTsNCit9DQorQ0JDX0NvZGUxMjg6On5DQkNfQ29kZTEyOCgpIHsNCisgIGlmIChtX3BCQ1JlYWRlcikgew0KKyAgICBkZWxldGUgKG1fcEJDUmVhZGVyKTsNCisgICAgbV9wQkNSZWFkZXIgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcEJDV3JpdGVyKSB7DQorICAgIGRlbGV0ZSAobV9wQkNXcml0ZXIpOw0KKyAgICBtX3BCQ1dyaXRlciA9IE5VTEw7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ0JDX0NvZGUxMjg6OlNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbikgew0KKyAgaWYgKG1fcEJDV3JpdGVyKSB7DQorICAgIHJldHVybiAoKENCQ19PbmVkQ29kZTEyOFdyaXRlciopbV9wQkNXcml0ZXIpLT5TZXRUZXh0TG9jYXRpb24obG9jYXRpb24pOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENCQ19Db2RlMTI4OjpFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0RldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGNvbnRlbnRzLklzRW1wdHkoKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Ob0NvbnRlbnRzOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBCQ0ZPUk1BVCBmb3JtYXQgPSBCQ0ZPUk1BVF9DT0RFXzEyODsNCisgIGludDMyX3Qgb3V0V2lkdGggPSAwOw0KKyAgaW50MzJfdCBvdXRIZWlnaHQgPSAwOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgY29udGVudCA9IGNvbnRlbnRzOw0KKyAgaWYgKGNvbnRlbnRzLkdldExlbmd0aCgpICUgMiAmJg0KKyAgICAgICgoQ0JDX09uZWRDb2RlMTI4V3JpdGVyKiltX3BCQ1dyaXRlciktPkdldFR5cGUoKSA9PSBCQ19DT0RFMTI4X0MpIHsNCisgICAgY29udGVudCArPSAnMCc7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyBlbmNvZGVDb250ZW50cyA9DQorICAgICAgKChDQkNfT25lZENvZGUxMjhXcml0ZXIqKW1fcEJDV3JpdGVyKS0+RmlsdGVyQ29udGVudHMoY29udGVudCk7DQorICBtX3JlbmRlckNvbnRlbnRzID0gZW5jb2RlQ29udGVudHM7DQorICBDRlhfQnl0ZVN0cmluZyBieXRlU3RyaW5nID0gZW5jb2RlQ29udGVudHMuVVRGOEVuY29kZSgpOw0KKyAgdWludDhfdCogZGF0YSA9IHN0YXRpY19jYXN0PENCQ19PbmVkQ29kZTEyOFdyaXRlcio+KG1fcEJDV3JpdGVyKQ0KKyAgICAgICAgICAgICAgICAgICAgICAtPkVuY29kZShieXRlU3RyaW5nLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpDQorICAgICAgLT5SZW5kZXJSZXN1bHQoZW5jb2RlQ29udGVudHMsIGRhdGEsIG91dFdpZHRoLCBpc0RldmljZSwgZSk7DQorICBGWF9GcmVlKGRhdGEpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENCQ19Db2RlMTI4OjpSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgICgoQ0JDX09uZURpbVdyaXRlciopbV9wQkNXcml0ZXIpDQorICAgICAgLT5SZW5kZXJEZXZpY2VSZXN1bHQoZGV2aWNlLCBtYXRpcngsIG1fcmVuZGVyQ29udGVudHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENCQ19Db2RlMTI4OjpSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSkgew0KKyAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlcikNCisgICAgICAtPlJlbmRlckJpdG1hcFJlc3VsdChwT3V0Qml0bWFwLCBtX3JlbmRlckNvbnRlbnRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX0NvZGUxMjg6OkRlY29kZSh1aW50OF90KiBidWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9XaWRlU3RyaW5nIHN0cjsNCisgIHJldHVybiBzdHI7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19Db2RlMTI4OjpEZWNvZGUoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQzMl90JiBlKSB7DQorICBDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZSBzb3VyY2UocEJpdG1hcCk7DQorICBDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyIGJpbmFyaXplcigmc291cmNlKTsNCisgIENCQ19CaW5hcnlCaXRtYXAgYml0bWFwKCZiaW5hcml6ZXIpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gbV9wQkNSZWFkZXItPkRlY29kZSgmYml0bWFwLCAwLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGWF9XU1RSQyhMIiIpKTsNCisgIHJldHVybiBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3RyLCBzdHIuR2V0TGVuZ3RoKCkpOw0KK30NCitDQkNfRUFOODo6Q0JDX0VBTjgoKSB7DQorICBtX3BCQ1JlYWRlciA9IChDQkNfUmVhZGVyKiluZXcgKENCQ19PbmVkRUFOOFJlYWRlcik7DQorICBtX3BCQ1dyaXRlciA9IChDQkNfV3JpdGVyKiluZXcgKENCQ19PbmVkRUFOOFdyaXRlcik7DQorfQ0KK0NCQ19FQU44Ojp+Q0JDX0VBTjgoKSB7DQorICBpZiAobV9wQkNSZWFkZXIpIHsNCisgICAgZGVsZXRlIChtX3BCQ1JlYWRlcik7DQorICAgIG1fcEJDUmVhZGVyID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICBkZWxldGUgKG1fcEJDV3JpdGVyKTsNCisgICAgbV9wQkNXcml0ZXIgPSBOVUxMOw0KKyAgfQ0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfRUFOODo6UHJlcHJvY2Vzcyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7DQorICBDRlhfV2lkZVN0cmluZyBlbmNvZGVDb250ZW50cyA9DQorICAgICAgKChDQkNfT25lZEVBTjhXcml0ZXIqKW1fcEJDV3JpdGVyKS0+RmlsdGVyQ29udGVudHMoY29udGVudHMpOw0KKyAgaW50MzJfdCBsZW5ndGggPSBlbmNvZGVDb250ZW50cy5HZXRMZW5ndGgoKTsNCisgIGlmIChsZW5ndGggPD0gNykgew0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA3IC0gbGVuZ3RoOyBpKyspIHsNCisgICAgICBlbmNvZGVDb250ZW50cyA9IEZYX1dDSEFSKCcwJykgKyBlbmNvZGVDb250ZW50czsNCisgICAgfQ0KKyAgICBDRlhfQnl0ZVN0cmluZyBieXRlU3RyaW5nID0gZW5jb2RlQ29udGVudHMuVVRGOEVuY29kZSgpOw0KKyAgICBpbnQzMl90IGNoZWNrc3VtID0NCisgICAgICAgICgoQ0JDX09uZWRFQU44V3JpdGVyKiltX3BCQ1dyaXRlciktPkNhbGNDaGVja3N1bShieXRlU3RyaW5nKTsNCisgICAgZW5jb2RlQ29udGVudHMgKz0gRlhfV0NIQVIoY2hlY2tzdW0gLSAwICsgJzAnKTsNCisgIH0NCisgIGlmIChsZW5ndGggPiA4KSB7DQorICAgIGVuY29kZUNvbnRlbnRzID0gZW5jb2RlQ29udGVudHMuTWlkKDAsIDgpOw0KKyAgfQ0KKyAgcmV0dXJuIGVuY29kZUNvbnRlbnRzOw0KK30NCitGWF9CT09MIENCQ19FQU44OjpFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0RldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGNvbnRlbnRzLklzRW1wdHkoKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Ob0NvbnRlbnRzOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBCQ0ZPUk1BVCBmb3JtYXQgPSBCQ0ZPUk1BVF9FQU5fODsNCisgIGludDMyX3Qgb3V0V2lkdGggPSAwOw0KKyAgaW50MzJfdCBvdXRIZWlnaHQgPSAwOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlQ29udGVudHMgPSBQcmVwcm9jZXNzKGNvbnRlbnRzKTsNCisgIENGWF9CeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBlbmNvZGVDb250ZW50cy5VVEY4RW5jb2RlKCk7DQorICBtX3JlbmRlckNvbnRlbnRzID0gZW5jb2RlQ29udGVudHM7DQorICB1aW50OF90KiBkYXRhID0gc3RhdGljX2Nhc3Q8Q0JDX09uZWRFQU44V3JpdGVyKj4obV9wQkNXcml0ZXIpDQorICAgICAgICAgICAgICAgICAgICAgIC0+RW5jb2RlKGJ5dGVTdHJpbmcsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlcikNCisgICAgICAtPlJlbmRlclJlc3VsdChlbmNvZGVDb250ZW50cywgZGF0YSwgb3V0V2lkdGgsIGlzRGV2aWNlLCBlKTsNCisgIEZYX0ZyZWUoZGF0YSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0JDX0VBTjg6OlJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlcikNCisgICAgICAtPlJlbmRlckRldmljZVJlc3VsdChkZXZpY2UsIG1hdGlyeCwgbV9yZW5kZXJDb250ZW50cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0JDX0VBTjg6OlJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAqJiBwT3V0Qml0bWFwLCBpbnQzMl90JiBlKSB7DQorICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKQ0KKyAgICAgIC0+UmVuZGVyQml0bWFwUmVzdWx0KHBPdXRCaXRtYXAsIG1fcmVuZGVyQ29udGVudHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfRUFOODo6RGVjb2RlKHVpbnQ4X3QqIGJ1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgc3RyOw0KKyAgcmV0dXJuIHN0cjsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX0VBTjg6OkRlY29kZShDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludDMyX3QmIGUpIHsNCisgIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlIHNvdXJjZShwQml0bWFwKTsNCisgIENCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIgYmluYXJpemVyKCZzb3VyY2UpOw0KKyAgQ0JDX0JpbmFyeUJpdG1hcCBiaXRtYXAoJmJpbmFyaXplcik7DQorICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBtX3BCQ1JlYWRlci0+RGVjb2RlKCZiaXRtYXAsIDAsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZYX1dTVFJDKEwiIikpOw0KKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzdHIsIHN0ci5HZXRMZW5ndGgoKSk7DQorfQ0KK0NCQ19FQU4xMzo6Q0JDX0VBTjEzKCkgew0KKyAgbV9wQkNSZWFkZXIgPSAoQ0JDX1JlYWRlciopbmV3IChDQkNfT25lZEVBTjEzUmVhZGVyKTsNCisgIG1fcEJDV3JpdGVyID0gKENCQ19Xcml0ZXIqKW5ldyAoQ0JDX09uZWRFQU4xM1dyaXRlcik7DQorfQ0KK0NCQ19FQU4xMzo6fkNCQ19FQU4xMygpIHsNCisgIGlmIChtX3BCQ1JlYWRlcikgew0KKyAgICBkZWxldGUgKG1fcEJDUmVhZGVyKTsNCisgICAgbV9wQkNSZWFkZXIgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcEJDV3JpdGVyKSB7DQorICAgIGRlbGV0ZSAobV9wQkNXcml0ZXIpOw0KKyAgICBtX3BCQ1dyaXRlciA9IE5VTEw7DQorICB9DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19FQU4xMzo6UHJlcHJvY2Vzcyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7DQorICBDRlhfV2lkZVN0cmluZyBlbmNvZGVDb250ZW50cyA9DQorICAgICAgKChDQkNfT25lZEVBTjhXcml0ZXIqKW1fcEJDV3JpdGVyKS0+RmlsdGVyQ29udGVudHMoY29udGVudHMpOw0KKyAgaW50MzJfdCBsZW5ndGggPSBlbmNvZGVDb250ZW50cy5HZXRMZW5ndGgoKTsNCisgIGlmIChsZW5ndGggPD0gMTIpIHsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMTIgLSBsZW5ndGg7IGkrKykgew0KKyAgICAgIGVuY29kZUNvbnRlbnRzID0gRlhfV0NIQVIoJzAnKSArIGVuY29kZUNvbnRlbnRzOw0KKyAgICB9DQorICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBlbmNvZGVDb250ZW50cy5VVEY4RW5jb2RlKCk7DQorICAgIGludDMyX3QgY2hlY2tzdW0gPQ0KKyAgICAgICAgKChDQkNfT25lZEVBTjEzV3JpdGVyKiltX3BCQ1dyaXRlciktPkNhbGNDaGVja3N1bShieXRlU3RyaW5nKTsNCisgICAgYnl0ZVN0cmluZyArPSBjaGVja3N1bSAtIDAgKyAnMCc7DQorICAgIGVuY29kZUNvbnRlbnRzID0gYnl0ZVN0cmluZy5VVEY4RGVjb2RlKCk7DQorICB9DQorICBpZiAobGVuZ3RoID4gMTMpIHsNCisgICAgZW5jb2RlQ29udGVudHMgPSBlbmNvZGVDb250ZW50cy5NaWQoMCwgMTMpOw0KKyAgfQ0KKyAgcmV0dXJuIGVuY29kZUNvbnRlbnRzOw0KK30NCitGWF9CT09MIENCQ19FQU4xMzo6RW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzRGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGNvbnRlbnRzLklzRW1wdHkoKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Ob0NvbnRlbnRzOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBCQ0ZPUk1BVCBmb3JtYXQgPSBCQ0ZPUk1BVF9FQU5fMTM7DQorICBpbnQzMl90IG91dFdpZHRoID0gMDsNCisgIGludDMyX3Qgb3V0SGVpZ2h0ID0gMDsNCisgIENGWF9XaWRlU3RyaW5nIGVuY29kZUNvbnRlbnRzID0gUHJlcHJvY2Vzcyhjb250ZW50cyk7DQorICBDRlhfQnl0ZVN0cmluZyBieXRlU3RyaW5nID0gZW5jb2RlQ29udGVudHMuVVRGOEVuY29kZSgpOw0KKyAgbV9yZW5kZXJDb250ZW50cyA9IGVuY29kZUNvbnRlbnRzOw0KKyAgdWludDhfdCogZGF0YSA9IHN0YXRpY19jYXN0PENCQ19PbmVkRUFOMTNXcml0ZXIqPihtX3BCQ1dyaXRlcikNCisgICAgICAgICAgICAgICAgICAgICAgLT5FbmNvZGUoYnl0ZVN0cmluZywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKQ0KKyAgICAgIC0+UmVuZGVyUmVzdWx0KGVuY29kZUNvbnRlbnRzLCBkYXRhLCBvdXRXaWR0aCwgaXNEZXZpY2UsIGUpOw0KKyAgRlhfRnJlZShkYXRhKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDQkNfRUFOMTM6OlJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRpcngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKQ0KKyAgICAgIC0+UmVuZGVyRGV2aWNlUmVzdWx0KGRldmljZSwgbWF0aXJ4LCBtX3JlbmRlckNvbnRlbnRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDQkNfRUFOMTM6OlJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAqJiBwT3V0Qml0bWFwLCBpbnQzMl90JiBlKSB7DQorICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKQ0KKyAgICAgIC0+UmVuZGVyQml0bWFwUmVzdWx0KHBPdXRCaXRtYXAsIG1fcmVuZGVyQ29udGVudHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfRUFOMTM6OkRlY29kZSh1aW50OF90KiBidWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9XaWRlU3RyaW5nIHN0cjsNCisgIHJldHVybiBzdHI7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19FQU4xMzo6RGVjb2RlKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50MzJfdCYgZSkgew0KKyAgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2Ugc291cmNlKHBCaXRtYXApOw0KKyAgQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplciBiaW5hcml6ZXIoJnNvdXJjZSk7DQorICBDQkNfQmluYXJ5Qml0bWFwIGJpdG1hcCgmYmluYXJpemVyKTsNCisgIENGWF9CeXRlU3RyaW5nIHN0ciA9IG1fcEJDUmVhZGVyLT5EZWNvZGUoJmJpdG1hcCwgMCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRlhfV1NUUkMoTCIiKSk7DQorICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN0ciwgc3RyLkdldExlbmd0aCgpKTsNCit9DQorQ0JDX1VQQ0E6OkNCQ19VUENBKCkgew0KKyAgbV9wQkNSZWFkZXIgPSAoQ0JDX1JlYWRlciopbmV3IChDQkNfT25lZFVQQ0FSZWFkZXIpOw0KKyAgKChDQkNfT25lZFVQQ0FSZWFkZXIqKW1fcEJDUmVhZGVyKS0+SW5pdCgpOw0KKyAgbV9wQkNXcml0ZXIgPSAoQ0JDX1dyaXRlciopbmV3IChDQkNfT25lZFVQQ0FXcml0ZXIpOw0KK30NCitDQkNfVVBDQTo6fkNCQ19VUENBKCkgew0KKyAgaWYgKG1fcEJDUmVhZGVyKSB7DQorICAgIGRlbGV0ZSAobV9wQkNSZWFkZXIpOw0KKyAgICBtX3BCQ1JlYWRlciA9IE5VTEw7DQorICB9DQorICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgZGVsZXRlIChtX3BCQ1dyaXRlcik7DQorICAgIG1fcEJDV3JpdGVyID0gTlVMTDsNCisgIH0NCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX1VQQ0E6OlByZXByb2Nlc3MoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlQ29udGVudHMgPQ0KKyAgICAgICgoQ0JDX09uZWRFQU44V3JpdGVyKiltX3BCQ1dyaXRlciktPkZpbHRlckNvbnRlbnRzKGNvbnRlbnRzKTsNCisgIGludDMyX3QgbGVuZ3RoID0gZW5jb2RlQ29udGVudHMuR2V0TGVuZ3RoKCk7DQorICBpZiAobGVuZ3RoIDw9IDExKSB7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDExIC0gbGVuZ3RoOyBpKyspIHsNCisgICAgICBlbmNvZGVDb250ZW50cyA9IEZYX1dDSEFSKCcwJykgKyBlbmNvZGVDb250ZW50czsNCisgICAgfQ0KKyAgICBDRlhfQnl0ZVN0cmluZyBieXRlU3RyaW5nID0gZW5jb2RlQ29udGVudHMuVVRGOEVuY29kZSgpOw0KKyAgICBpbnQzMl90IGNoZWNrc3VtID0NCisgICAgICAgICgoQ0JDX09uZWRVUENBV3JpdGVyKiltX3BCQ1dyaXRlciktPkNhbGNDaGVja3N1bShieXRlU3RyaW5nKTsNCisgICAgYnl0ZVN0cmluZyArPSBjaGVja3N1bSAtIDAgKyAnMCc7DQorICAgIGVuY29kZUNvbnRlbnRzID0gYnl0ZVN0cmluZy5VVEY4RGVjb2RlKCk7DQorICB9DQorICBpZiAobGVuZ3RoID4gMTIpIHsNCisgICAgZW5jb2RlQ29udGVudHMgPSBlbmNvZGVDb250ZW50cy5NaWQoMCwgMTIpOw0KKyAgfQ0KKyAgcmV0dXJuIGVuY29kZUNvbnRlbnRzOw0KK30NCitGWF9CT09MIENCQ19VUENBOjpFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0RldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGNvbnRlbnRzLklzRW1wdHkoKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Ob0NvbnRlbnRzOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBCQ0ZPUk1BVCBmb3JtYXQgPSBCQ0ZPUk1BVF9VUENfQTsNCisgIGludDMyX3Qgb3V0V2lkdGggPSAwOw0KKyAgaW50MzJfdCBvdXRIZWlnaHQgPSAwOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlQ29udGVudHMgPSBQcmVwcm9jZXNzKGNvbnRlbnRzKTsNCisgIENGWF9CeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBlbmNvZGVDb250ZW50cy5VVEY4RW5jb2RlKCk7DQorICBtX3JlbmRlckNvbnRlbnRzID0gZW5jb2RlQ29udGVudHM7DQorICAoKENCQ19PbmVkVVBDQVdyaXRlciopbV9wQkNXcml0ZXIpLT5Jbml0KCk7DQorICB1aW50OF90KiBkYXRhID0gc3RhdGljX2Nhc3Q8Q0JDX09uZWRVUENBV3JpdGVyKj4obV9wQkNXcml0ZXIpDQorICAgICAgICAgICAgICAgICAgICAgIC0+RW5jb2RlKGJ5dGVTdHJpbmcsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlcikNCisgICAgICAtPlJlbmRlclJlc3VsdChlbmNvZGVDb250ZW50cywgZGF0YSwgb3V0V2lkdGgsIGlzRGV2aWNlLCBlKTsNCisgIEZYX0ZyZWUoZGF0YSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0JDX1VQQ0E6OlJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdGlyeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgKChDQkNfT25lRGltV3JpdGVyKiltX3BCQ1dyaXRlcikNCisgICAgICAtPlJlbmRlckRldmljZVJlc3VsdChkZXZpY2UsIG1hdGlyeCwgbV9yZW5kZXJDb250ZW50cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0JDX1VQQ0E6OlJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAqJiBwT3V0Qml0bWFwLCBpbnQzMl90JiBlKSB7DQorICAoKENCQ19PbmVEaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKQ0KKyAgICAgIC0+UmVuZGVyQml0bWFwUmVzdWx0KHBPdXRCaXRtYXAsIG1fcmVuZGVyQ29udGVudHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfVVBDQTo6RGVjb2RlKHVpbnQ4X3QqIGJ1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgc3RyOw0KKyAgcmV0dXJuIHN0cjsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX1VQQ0E6OkRlY29kZShDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludDMyX3QmIGUpIHsNCisgIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlIHNvdXJjZShwQml0bWFwKTsNCisgIENCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIgYmluYXJpemVyKCZzb3VyY2UpOw0KKyAgQ0JDX0JpbmFyeUJpdG1hcCBiaXRtYXAoJmJpbmFyaXplcik7DQorICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBtX3BCQ1JlYWRlci0+RGVjb2RlKCZiaXRtYXAsIDAsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZYX1dTVFJDKEwiIikpOw0KKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzdHIsIHN0ci5HZXRMZW5ndGgoKSk7DQorfQ0KK0NCQ19RUkNvZGU6OkNCQ19RUkNvZGUoKSB7DQorICBtX3BCQ1JlYWRlciA9IChDQkNfUmVhZGVyKiluZXcgKENCQ19RUkNvZGVSZWFkZXIpOw0KKyAgKChDQkNfUVJDb2RlUmVhZGVyKiltX3BCQ1JlYWRlciktPkluaXQoKTsNCisgIG1fcEJDV3JpdGVyID0gKENCQ19Xcml0ZXIqKW5ldyAoQ0JDX1FSQ29kZVdyaXRlcik7DQorfQ0KK0NCQ19RUkNvZGU6On5DQkNfUVJDb2RlKCkgew0KKyAgaWYgKG1fcEJDUmVhZGVyKSB7DQorICAgIGRlbGV0ZSAobV9wQkNSZWFkZXIpOw0KKyAgICBtX3BCQ1JlYWRlciA9IE5VTEw7DQorICB9DQorICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgZGVsZXRlIChtX3BCQ1dyaXRlcik7DQorICAgIG1fcEJDV3JpdGVyID0gTlVMTDsNCisgIH0NCit9DQorRlhfQk9PTCBDQkNfUVJDb2RlOjpTZXRWZXJzaW9uKGludDMyX3QgdmVyc2lvbikgew0KKyAgaWYgKHZlcnNpb24gPCAwIHx8IHZlcnNpb24gPiA0MCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAobV9wQkNXcml0ZXIgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gKChDQkNfUVJDb2RlV3JpdGVyKiltX3BCQ1dyaXRlciktPlNldFZlcnNpb24odmVyc2lvbik7DQorfQ0KK0ZYX0JPT0wgQ0JDX1FSQ29kZTo6U2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoaW50MzJfdCBsZXZlbCkgew0KKyAgaWYgKGxldmVsIDwgMCB8fCBsZXZlbCA+IDMpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKG1fcEJDV3JpdGVyID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuICgoQ0JDX1R3b0RpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5TZXRFcnJvckNvcnJlY3Rpb25MZXZlbChsZXZlbCk7DQorfQ0KK0ZYX0JPT0wgQ0JDX1FSQ29kZTo6RW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0RldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IG91dFdpZHRoID0gMDsNCisgIGludDMyX3Qgb3V0SGVpZ2h0ID0gMDsNCisgIHVpbnQ4X3QqIGRhdGEgPSAoKENCQ19RUkNvZGVXcml0ZXIqKW1fcEJDV3JpdGVyKQ0KKyAgICAgICAgICAgICAgICAgICAgICAtPkVuY29kZShjb250ZW50cywgKChDQkNfUVJDb2RlV3JpdGVyKiltX3BCQ1dyaXRlcikNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldEVycm9yQ29ycmVjdGlvbkxldmVsKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFdpZHRoLCBvdXRIZWlnaHQsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgICgoQ0JDX1R3b0RpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJSZXN1bHQoZGF0YSwgb3V0V2lkdGgsIG91dEhlaWdodCwgZSk7DQorICBGWF9GcmVlKGRhdGEpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENCQ19RUkNvZGU6OlJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgICgoQ0JDX1R3b0RpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJEZXZpY2VSZXN1bHQoZGV2aWNlLCBtYXRpcngpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0JDX1FSQ29kZTo6UmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcComIHBPdXRCaXRtYXAsIGludDMyX3QmIGUpIHsNCisgICgoQ0JDX1R3b0RpbVdyaXRlciopbV9wQkNXcml0ZXIpLT5SZW5kZXJCaXRtYXBSZXN1bHQocE91dEJpdG1hcCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRkFMU0UpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19RUkNvZGU6OkRlY29kZSh1aW50OF90KiBidWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9XaWRlU3RyaW5nIHN0cjsNCisgIHJldHVybiBzdHI7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19RUkNvZGU6OkRlY29kZShDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludDMyX3QmIGUpIHsNCisgIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlIHNvdXJjZShwQml0bWFwKTsNCisgIENCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIgYmluYXJpemVyKCZzb3VyY2UpOw0KKyAgQ0JDX0JpbmFyeUJpdG1hcCBiaXRtYXAoJmJpbmFyaXplcik7DQorICBDRlhfQnl0ZVN0cmluZyByZXRTdHIgPSBtX3BCQ1JlYWRlci0+RGVjb2RlKCZiaXRtYXAsIDAsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZYX1dTVFJDKEwiIikpOw0KKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChyZXRTdHIsIHJldFN0ci5HZXRMZW5ndGgoKSk7DQorfQ0KK0NCQ19QREY0MTdJOjpDQkNfUERGNDE3SSgpIHsNCisgIG1fcEJDUmVhZGVyID0gKENCQ19SZWFkZXIqKW5ldyAoQ0JDX1BERjQxN1JlYWRlcik7DQorICBtX3BCQ1dyaXRlciA9IChDQkNfV3JpdGVyKiluZXcgKENCQ19QREY0MTdXcml0ZXIpOw0KK30NCitDQkNfUERGNDE3STo6fkNCQ19QREY0MTdJKCkgew0KKyAgaWYgKG1fcEJDUmVhZGVyKSB7DQorICAgIGRlbGV0ZSAobV9wQkNSZWFkZXIpOw0KKyAgICBtX3BCQ1JlYWRlciA9IE5VTEw7DQorICB9DQorICBpZiAobV9wQkNXcml0ZXIpIHsNCisgICAgZGVsZXRlIChtX3BCQ1dyaXRlcik7DQorICAgIG1fcEJDV3JpdGVyID0gTlVMTDsNCisgIH0NCit9DQorRlhfQk9PTCBDQkNfUERGNDE3STo6U2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoaW50MzJfdCBsZXZlbCkgew0KKyAgKChDQkNfUERGNDE3V3JpdGVyKiltX3BCQ1dyaXRlciktPlNldEVycm9yQ29ycmVjdGlvbkxldmVsKGxldmVsKTsNCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENCQ19QREY0MTdJOjpTZXRUcnVuY2F0ZWQoRlhfQk9PTCB0cnVuY2F0ZWQpIHsNCisgICgoQ0JDX1BERjQxN1dyaXRlciopbV9wQkNXcml0ZXIpLT5TZXRUcnVuY2F0ZWQodHJ1bmNhdGVkKTsNCit9DQorRlhfQk9PTCBDQkNfUERGNDE3STo6RW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3Qgb3V0V2lkdGggPSAwOw0KKyAgaW50MzJfdCBvdXRIZWlnaHQgPSAwOw0KKyAgdWludDhfdCogZGF0YSA9ICgoQ0JDX1BERjQxN1dyaXRlciopbV9wQkNXcml0ZXIpDQorICAgICAgICAgICAgICAgICAgICAgIC0+RW5jb2RlKGNvbnRlbnRzLCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICAoKENCQ19Ud29EaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyUmVzdWx0KGRhdGEsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGUpOw0KKyAgRlhfRnJlZShkYXRhKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDQkNfUERGNDE3STo6UmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICAoKENCQ19Ud29EaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyRGV2aWNlUmVzdWx0KGRldmljZSwgbWF0aXJ4KTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENCQ19QREY0MTdJOjpSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSkgew0KKyAgKChDQkNfVHdvRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlJlbmRlckJpdG1hcFJlc3VsdChwT3V0Qml0bWFwLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX1BERjQxN0k6OkRlY29kZSh1aW50OF90KiBidWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9XaWRlU3RyaW5nIHN0cjsNCisgIHJldHVybiBzdHI7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19QREY0MTdJOjpEZWNvZGUoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQzMl90JiBlKSB7DQorICBDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZSBzb3VyY2UocEJpdG1hcCk7DQorICBDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyIGJpbmFyaXplcigmc291cmNlKTsNCisgIENCQ19CaW5hcnlCaXRtYXAgYml0bWFwKCZiaW5hcml6ZXIpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZXN0cmluZyA9IG1fcEJDUmVhZGVyLT5EZWNvZGUoJmJpdG1hcCwgMCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgRlhfV1NUUkMoTCIiKSk7DQorICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJ5dGVzdHJpbmcsIGJ5dGVzdHJpbmcuR2V0TGVuZ3RoKCkpOw0KK30NCitDQkNfRGF0YU1hdHJpeDo6Q0JDX0RhdGFNYXRyaXgoKSB7DQorICBtX3BCQ1JlYWRlciA9IChDQkNfUmVhZGVyKiluZXcgKENCQ19EYXRhTWF0cml4UmVhZGVyKTsNCisgICgoQ0JDX0RhdGFNYXRyaXhSZWFkZXIqKW1fcEJDUmVhZGVyKS0+SW5pdCgpOw0KKyAgbV9wQkNXcml0ZXIgPSAoQ0JDX1dyaXRlciopbmV3IChDQkNfRGF0YU1hdHJpeFdyaXRlcik7DQorfQ0KK0NCQ19EYXRhTWF0cml4Ojp+Q0JDX0RhdGFNYXRyaXgoKSB7DQorICBpZiAobV9wQkNSZWFkZXIpIHsNCisgICAgZGVsZXRlIChtX3BCQ1JlYWRlcik7DQorICAgIG1fcEJDUmVhZGVyID0gTlVMTDsNCisgIH0NCisgIGlmIChtX3BCQ1dyaXRlcikgew0KKyAgICBkZWxldGUgKG1fcEJDV3JpdGVyKTsNCisgICAgbV9wQkNXcml0ZXIgPSBOVUxMOw0KKyAgfQ0KK30NCitGWF9CT09MIENCQ19EYXRhTWF0cml4OjpFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0RldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBvdXRXaWR0aCA9IDA7DQorICBpbnQzMl90IG91dEhlaWdodCA9IDA7DQorICB1aW50OF90KiBkYXRhID0gKChDQkNfRGF0YU1hdHJpeFdyaXRlciopbV9wQkNXcml0ZXIpDQorICAgICAgICAgICAgICAgICAgICAgIC0+RW5jb2RlKGNvbnRlbnRzLCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICAoKENCQ19Ud29EaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyUmVzdWx0KGRhdGEsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGUpOw0KKyAgRlhfRnJlZShkYXRhKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDQkNfRGF0YU1hdHJpeDo6UmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0aXJ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICAoKENCQ19Ud29EaW1Xcml0ZXIqKW1fcEJDV3JpdGVyKS0+UmVuZGVyRGV2aWNlUmVzdWx0KGRldmljZSwgbWF0aXJ4KTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENCQ19EYXRhTWF0cml4OjpSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSkgew0KKyAgKChDQkNfVHdvRGltV3JpdGVyKiltX3BCQ1dyaXRlciktPlJlbmRlckJpdG1hcFJlc3VsdChwT3V0Qml0bWFwLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX0RhdGFNYXRyaXg6OkRlY29kZSh1aW50OF90KiBidWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9XaWRlU3RyaW5nIHN0cjsNCisgIHJldHVybiBzdHI7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19EYXRhTWF0cml4OjpEZWNvZGUoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQzMl90JiBlKSB7DQorICBDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZSBzb3VyY2UocEJpdG1hcCk7DQorICBDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyIGJpbmFyaXplcigmc291cmNlKTsNCisgIENCQ19CaW5hcnlCaXRtYXAgYml0bWFwKCZiaW5hcml6ZXIpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgcmV0U3RyID0gbV9wQkNSZWFkZXItPkRlY29kZSgmYml0bWFwLCAwLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGWF9XU1RSQyhMIiIpKTsNCisgIHJldHVybiBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgocmV0U3RyLCByZXRTdHIuR2V0TGVuZ3RoKCkpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9CQ19CaW5hcml6ZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfQmluYXJpemVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTRiZjU3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfQmluYXJpemVyLmNwcApAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDA5IFpYaW5nIGF1dGhvcnMNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfTHVtaW5hbmNlU291cmNlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX0JpbmFyaXplci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRBcnJheS5oIg0KK0NCQ19CaW5hcml6ZXI6OkNCQ19CaW5hcml6ZXIoQ0JDX0x1bWluYW5jZVNvdXJjZSogc291cmNlKSB7DQorICBtX3NvdXJjZSA9IHNvdXJjZTsNCit9DQorQ0JDX0JpbmFyaXplcjo6fkNCQ19CaW5hcml6ZXIoKSB7fQ0KK0NCQ19MdW1pbmFuY2VTb3VyY2UqIENCQ19CaW5hcml6ZXI6OkdldEx1bWluYW5jZVNvdXJjZSgpIHsNCisgIHJldHVybiBtX3NvdXJjZTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvQkNfQmluYXJpemVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19CaW5hcml6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTgwNWM4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfQmluYXJpemVyLmgKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19CSU5BUklaRVJfSF8NCisjZGVmaW5lIF9CQ19CSU5BUklaRVJfSF8NCitjbGFzcyBDQkNfTHVtaW5hbmNlU291cmNlOw0KK2NsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQorY2xhc3MgQ0JDX0NvbW1vbkJpdEFycmF5Ow0KK2NsYXNzIENCQ19CaW5hcnlCaXRtYXA7DQorY2xhc3MgQ0JDX0JpbmFyaXplciB7DQorIHB1YmxpYzoNCisgIENCQ19CaW5hcml6ZXIoQ0JDX0x1bWluYW5jZVNvdXJjZSogc291cmNlKTsNCisgIHZpcnR1YWwgfkNCQ19CaW5hcml6ZXIoKTsNCisgIENCQ19MdW1pbmFuY2VTb3VyY2UqIEdldEx1bWluYW5jZVNvdXJjZSgpOw0KKyAgdmlydHVhbCBDQkNfQ29tbW9uQml0TWF0cml4KiBHZXRCbGFja01hdHJpeChpbnQzMl90JiBlKSA9IDA7DQorICB2aXJ0dWFsIENCQ19Db21tb25CaXRBcnJheSogR2V0QmxhY2tSb3coaW50MzJfdCB5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpID0gMDsNCisNCisgcHJpdmF0ZToNCisgIENCQ19MdW1pbmFuY2VTb3VyY2UqIG1fc291cmNlOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvQkNfQmluYXJ5Qml0bWFwLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0JpbmFyeUJpdG1hcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkY2I5OQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0JpbmFyeUJpdG1hcC5jcHAKQEAgLTAsMCArMSw2MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwOSBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX0JpbmFyaXplci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19MdW1pbmFuY2VTb3VyY2UuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfQmluYXJ5Qml0bWFwLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdEFycmF5LmgiDQorQ0JDX0JpbmFyeUJpdG1hcDo6Q0JDX0JpbmFyeUJpdG1hcChDQkNfQmluYXJpemVyKiBiaW5hcml6ZXIpDQorICAgIDogbV9iaW5hcml6ZXIoYmluYXJpemVyKSwgbV9tYXRyaXgoTlVMTCkge30NCitDQkNfQmluYXJ5Qml0bWFwOjp+Q0JDX0JpbmFyeUJpdG1hcCgpIHsNCisgIGlmIChtX21hdHJpeCAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBtX21hdHJpeDsNCisgIH0NCisgIG1fbWF0cml4ID0gTlVMTDsNCit9DQoraW50MzJfdCBDQkNfQmluYXJ5Qml0bWFwOjpHZXRIZWlnaHQoKSB7DQorICByZXR1cm4gbV9iaW5hcml6ZXItPkdldEx1bWluYW5jZVNvdXJjZSgpLT5HZXRIZWlnaHQoKTsNCit9DQoraW50MzJfdCBDQkNfQmluYXJ5Qml0bWFwOjpHZXRXaWR0aCgpIHsNCisgIHJldHVybiBtX2JpbmFyaXplci0+R2V0THVtaW5hbmNlU291cmNlKCktPkdldFdpZHRoKCk7DQorfQ0KK0NCQ19Db21tb25CaXRNYXRyaXgqIENCQ19CaW5hcnlCaXRtYXA6OkdldE1hdHJpeChpbnQzMl90JiBlKSB7DQorICBpZiAobV9tYXRyaXggPT0gTlVMTCkgew0KKyAgICBtX21hdHJpeCA9IG1fYmluYXJpemVyLT5HZXRCbGFja01hdHJpeChlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgfQ0KKyAgcmV0dXJuIG1fbWF0cml4Ow0KK30NCitDQkNfQ29tbW9uQml0QXJyYXkqIENCQ19CaW5hcnlCaXRtYXA6OkdldEJsYWNrUm93KGludDMyX3QgeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0JDX0NvbW1vbkJpdEFycmF5KiB0ZW1wID0gbV9iaW5hcml6ZXItPkdldEJsYWNrUm93KHksIHJvdywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gdGVtcDsNCit9DQorQ0JDX0NvbW1vbkJpdE1hdHJpeCogQ0JDX0JpbmFyeUJpdG1hcDo6R2V0QmxhY2tNYXRyaXgoaW50MzJfdCYgZSkgew0KKyAgaWYgKG1fbWF0cml4ID09IE5VTEwpIHsNCisgICAgbV9tYXRyaXggPSBtX2JpbmFyaXplci0+R2V0QmxhY2tNYXRyaXgoZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIH0NCisgIHJldHVybiBtX21hdHJpeDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvQkNfQmluYXJ5Qml0bWFwLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19CaW5hcnlCaXRtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTdmZWI5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfQmluYXJ5Qml0bWFwLmgKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19CSU5BUllCSVRNQVBfSF8NCisjZGVmaW5lIF9CQ19CSU5BUllCSVRNQVBfSF8NCitjbGFzcyBDQkNfQmluYXJpemVyOw0KK2NsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQorY2xhc3MgQ0JDX0NvbW1vbkJpdEFycmF5Ow0KK2NsYXNzIENCQ19CaW5hcnlCaXRtYXA7DQorY2xhc3MgQ0JDX0JpbmFyeUJpdG1hcCB7DQorIHB1YmxpYzoNCisgIENCQ19CaW5hcnlCaXRtYXAoQ0JDX0JpbmFyaXplciogYmluYXJpemVyKTsNCisgIHZpcnR1YWwgfkNCQ19CaW5hcnlCaXRtYXAoKTsNCisgIGludDMyX3QgR2V0V2lkdGgoKTsNCisgIGludDMyX3QgR2V0SGVpZ2h0KCk7DQorICBDQkNfQ29tbW9uQml0TWF0cml4KiBHZXRNYXRyaXgoaW50MzJfdCYgZSk7DQorICBDQkNfQ29tbW9uQml0QXJyYXkqIEdldEJsYWNrUm93KGludDMyX3QgeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogR2V0QmxhY2tNYXRyaXgoaW50MzJfdCYgZSk7DQorDQorIHByaXZhdGU6DQorICBDQkNfQmluYXJpemVyKiBtX2JpbmFyaXplcjsNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIG1fbWF0cml4Ow0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZS5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmE4M2MyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZS5jcHAKQEAgLTAsMCArMSwxNjkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDkgWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJCQ19MdW1pbmFuY2VTb3VyY2UuaCINCisjaW5jbHVkZSAiQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZS5oIg0KK2NsYXNzIENCQ19QYXVzZSA6IHB1YmxpYyBJRlhfUGF1c2Ugew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIEZYX0JPT0wgTmVlZFRvUGF1c2VOb3coKSB7IHJldHVybiBUUlVFOyB9DQorfTsNCitzdGF0aWMgQ0ZYX0RJQml0bWFwKiBDcmVhdGVESUJTb3VyY2UoSUZYX0ZpbGVSZWFkKiBmaWxlcmVhZCkgew0KKyAgQ0ZYX0RJQml0bWFwKiBiaXRtYXAgPSBOVUxMOw0KKyAgQ0NvZGVjX01vZHVsZU1nciogcENvZGVjTWdyID0gTlVMTDsNCisgIElDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIqIHBJbWFnZUNvZGVjID0gTlVMTDsNCisgIHBDb2RlY01nciA9IG5ldyBDQ29kZWNfTW9kdWxlTWdyKCk7DQorICBwSW1hZ2VDb2RlYyA9IHBDb2RlY01nci0+Q3JlYXRlUHJvZ3Jlc3NpdmVEZWNvZGVyKCk7DQorICBGWENPREVDX1NUQVRVUyBzdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOw0KKyAgc3RhdHVzID0gcEltYWdlQ29kZWMtPkxvYWRJbWFnZUluZm8oZmlsZXJlYWQsIEZYQ09ERUNfSU1BR0VfVU5LTk9XTiwgbnVsbHB0cik7DQorICBpZiAoc3RhdHVzICE9IEZYQ09ERUNfU1RBVFVTX0ZSQU1FX1JFQURZKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgYml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsNCisgIGJpdG1hcC0+Q3JlYXRlKHBJbWFnZUNvZGVjLT5HZXRXaWR0aCgpLCBwSW1hZ2VDb2RlYy0+R2V0SGVpZ2h0KCksIEZYRElCX0FyZ2IpOw0KKyAgYml0bWFwLT5DbGVhcihGWEFSR0JfTUFLRSgweEZGLCAweEZGLCAweEZGLCAweEZGKSk7DQorICBDQkNfUGF1c2UgcGF1c2U7DQorICBpbnQzMl90IGZyYW1lczsNCisgIHN0YXR1cyA9IHBJbWFnZUNvZGVjLT5HZXRGcmFtZXMoZnJhbWVzLCAmcGF1c2UpOw0KKyAgd2hpbGUgKHN0YXR1cyA9PSBGWENPREVDX1NUQVRVU19GUkFNRV9UT0JFQ09OVElOVUUpIHsNCisgICAgc3RhdHVzID0gcEltYWdlQ29kZWMtPkdldEZyYW1lcyhmcmFtZXMsICZwYXVzZSk7DQorICB9DQorICBpZiAoc3RhdHVzICE9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9SRUFEWSkgew0KKyAgICBnb3RvIGV4Y2VwdDsNCisgIH0NCisgIHN0YXR1cyA9IHBJbWFnZUNvZGVjLT5TdGFydERlY29kZShiaXRtYXAsIDAsIDAsIGJpdG1hcC0+R2V0V2lkdGgoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXAtPkdldEhlaWdodCgpLCAwLCBGQUxTRSk7DQorICBpZiAoc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0VSUl9QQVJBTVMpIHsNCisgICAgZ290byBleGNlcHQ7DQorICB9DQorICBpZiAoc3RhdHVzICE9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsNCisgICAgZ290byBleGNlcHQ7DQorICB9DQorICB3aGlsZSAoc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsNCisgICAgc3RhdHVzID0gcEltYWdlQ29kZWMtPkNvbnRpbnVlRGVjb2RlKCZwYXVzZSk7DQorICB9DQorICBpZiAoc3RhdHVzICE9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0gpIHsNCisgICAgZ290byBleGNlcHQ7DQorICB9DQorICBpZiAocEltYWdlQ29kZWMpIHsNCisgICAgZGVsZXRlIHBJbWFnZUNvZGVjOw0KKyAgICBwSW1hZ2VDb2RlYyA9IE5VTEw7DQorICB9DQorICBkZWxldGUgcENvZGVjTWdyOw0KKyAgcENvZGVjTWdyID0gTlVMTDsNCisgIHJldHVybiBiaXRtYXA7DQorZXhjZXB0Og0KKyAgaWYgKHBJbWFnZUNvZGVjKSB7DQorICAgIGRlbGV0ZSBwSW1hZ2VDb2RlYzsNCisgICAgcEltYWdlQ29kZWMgPSBOVUxMOw0KKyAgfQ0KKyAgZGVsZXRlIHBDb2RlY01ncjsNCisgIHBDb2RlY01nciA9IE5VTEw7DQorICBpZiAoYml0bWFwKSB7DQorICAgIGRlbGV0ZSBiaXRtYXA7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2U6OkNCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlKA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgZmlsZW5hbWUpDQorICAgIDogQ0JDX0x1bWluYW5jZVNvdXJjZSgwLCAwKSwgbV9maWxlbmFtZShmaWxlbmFtZSkgew0KKyAgbV9oZWlnaHQgPSAwOw0KKyAgbV93aWR0aCA9IDA7DQorICBtX2J5dGVzUGVyTGluZSA9IDA7DQorICBtX3RvcCA9IDA7DQorICBtX2xlZnQgPSAwOw0KK30NCit2b2lkIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlOjpJbml0KGludDMyX3QmIGUpIHsNCisgIElGWF9GaWxlUmVhZCogZmlsZXJlYWQgPSBGWF9DcmVhdGVGaWxlUmVhZChtX2ZpbGVuYW1lKTsNCisgIG1fcEJpdG1hcCA9IENyZWF0ZURJQlNvdXJjZShmaWxlcmVhZCk7DQorICBpZiAobV9wQml0bWFwID09IE5VTEwpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uTG9hZEZpbGU7DQorICAgIHJldHVybjsNCisgIH0NCisgIG1fcEJpdG1hcC0+Q29udmVydEZvcm1hdChGWERJQl9BcmdiKTsNCisgIG1faGVpZ2h0ID0gbV9wQml0bWFwLT5HZXRIZWlnaHQoKTsNCisgIG1fd2lkdGggPSBtX3BCaXRtYXAtPkdldFdpZHRoKCk7DQorICBtX3JnYkRhdGEuU2V0U2l6ZShtX2hlaWdodCAqIG1fd2lkdGgpOw0KKyAgbV9ieXRlc1BlckxpbmUgPSBtX3dpZHRoICogNDsNCisgIG1fdG9wID0gMDsNCisgIG1fbGVmdCA9IDA7DQorfQ0KK0NCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlOjpDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZSgNCisgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwKQ0KKyAgICA6IENCQ19MdW1pbmFuY2VTb3VyY2UoMCwgMCkgew0KKyAgbV9wQml0bWFwID0gcEJpdG1hcC0+Q2xvbmUoKTsNCisgIG1fcEJpdG1hcC0+Q29udmVydEZvcm1hdChGWERJQl9BcmdiKTsNCisgIG1faGVpZ2h0ID0gbV9wQml0bWFwLT5HZXRIZWlnaHQoKTsNCisgIG1fd2lkdGggPSBtX3BCaXRtYXAtPkdldFdpZHRoKCk7DQorICBtX3JnYkRhdGEuU2V0U2l6ZShtX2hlaWdodCAqIG1fd2lkdGgpOw0KKyAgbV9ieXRlc1BlckxpbmUgPSBtX3dpZHRoICogNDsNCisgIG1fdG9wID0gMDsNCisgIG1fbGVmdCA9IDA7DQorfQ0KK0NCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlOjp+Q0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2UoKSB7DQorICBkZWxldGUgbV9wQml0bWFwOw0KKyAgbV9wQml0bWFwID0gTlVMTDsNCit9DQorQ0ZYX0J5dGVBcnJheSogQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2U6OkdldFJvdyhpbnQzMl90IHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZUFycmF5JiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoeSA8IDAgfHwgeSA+PSBtX2hlaWdodCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25SZXF1ZXN0ZWRSb3dJc091dFNpemVUaGVJbWFnZTsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpbnQzMl90IHdpZHRoID0gbV93aWR0aDsNCisgIGlmIChyb3cuR2V0U2l6ZSgpID09IDAgfHwgcm93LkdldFNpemUoKSA8IHdpZHRoKSB7DQorICAgIHJvdy5TZXRTaXplKHdpZHRoKTsNCisgIH0NCisgIGlmIChtX3JnYkRhdGEuR2V0U2l6ZSgpID09IDAgfHwgbV9yZ2JEYXRhLkdldFNpemUoKSA8IHdpZHRoKSB7DQorICAgIG1fcmdiRGF0YS5TZXRTaXplKHdpZHRoKTsNCisgIH0NCisgIGludDMyX3QqIHJvd0xpbmUgPSAoaW50MzJfdCopbV9wQml0bWFwLT5HZXRTY2FubGluZSh5KTsNCisgIGludDMyX3QgeDsNCisgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7DQorICAgIGludDMyX3QgcGl4ZWwgPSByb3dMaW5lW3hdOw0KKyAgICBpbnQzMl90IGx1bWluYW5jZSA9ICgzMDYgKiAoKHBpeGVsID4+IDE2KSAmIDB4RkYpICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgNjAxICogKChwaXhlbCA+PiA4KSAmIDB4RkYpICsgMTE3ICogKHBpeGVsICYgMHhGRikpID4+DQorICAgICAgICAgICAgICAgICAgICAgICAgMTA7DQorICAgIHJvd1t4XSA9ICh1aW50OF90KWx1bWluYW5jZTsNCisgIH0NCisgIHJldHVybiAmcm93Ow0KK30NCitDRlhfQnl0ZUFycmF5KiBDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZTo6R2V0TWF0cml4KCkgew0KKyAgQ0ZYX0J5dGVBcnJheSogbWF0aXJ4ID0gbmV3IENGWF9CeXRlQXJyYXkoKTsNCisgIG1hdGlyeC0+U2V0U2l6ZShtX2J5dGVzUGVyTGluZSAqIG1faGVpZ2h0KTsNCisgIGludDMyX3QqIHJnYiA9IChpbnQzMl90KiltX3BCaXRtYXAtPkdldEJ1ZmZlcigpOw0KKyAgaW50MzJfdCB5Ow0KKyAgZm9yICh5ID0gMDsgeSA8IG1faGVpZ2h0OyB5KyspIHsNCisgICAgaW50MzJfdCBvZmZzZXQgPSB5ICogbV93aWR0aDsNCisgICAgaW50MzJfdCB4Ow0KKyAgICBmb3IgKHggPSAwOyB4IDwgbV93aWR0aDsgeCsrKSB7DQorICAgICAgaW50MzJfdCBwaXhlbCA9IHJnYltvZmZzZXQgKyB4XTsNCisgICAgICBpbnQzMl90IGx1bWluYW5jZSA9DQorICAgICAgICAgICgzMDYgKiAoKHBpeGVsID4+IDE2KSAmIDB4RkYpICsgNjAxICogKChwaXhlbCA+PiA4KSAmIDB4RkYpICsNCisgICAgICAgICAgIDExNyAqIChwaXhlbCAmIDB4RkYpKSA+Pg0KKyAgICAgICAgICAxMDsNCisgICAgICAoKm1hdGlyeClbb2Zmc2V0ICsgeF0gPSAodWludDhfdClsdW1pbmFuY2U7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBtYXRpcng7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2UuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTlkNWM4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZS5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfQlVGRkVSRURJTUFHRUxVTUlOQU5DRVNPVVJDRV9IXw0KKyNkZWZpbmUgX0JDX0JVRkZFUkVESU1BR0VMVU1JTkFOQ0VTT1VSQ0VfSF8NCitjbGFzcyBDQkNfTHVtaW5hbmNlU291cmNlOw0KK2NsYXNzIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlOw0KK2NsYXNzIENCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlIDogcHVibGljIENCQ19MdW1pbmFuY2VTb3VyY2Ugew0KKyBwdWJsaWM6DQorICBleHBsaWNpdCBDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZShjb25zdCBDRlhfV2lkZVN0cmluZyYgZmlsZW5hbWUpOw0KKyAgZXhwbGljaXQgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2UoQ0ZYX0RJQml0bWFwKiBwQml0bWFwKTsNCisgIHZpcnR1YWwgfkNCQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlKCk7DQorDQorICBDRlhfQnl0ZUFycmF5KiBHZXRSb3coaW50MzJfdCB5LCBDRlhfQnl0ZUFycmF5JiByb3csIGludDMyX3QmIGUpOw0KKyAgQ0ZYX0J5dGVBcnJheSogR2V0TWF0cml4KCk7DQorICB2aXJ0dWFsIHZvaWQgSW5pdChpbnQzMl90JiBlKTsNCisNCisgcHJpdmF0ZToNCisgIGludDMyX3QgbV9ieXRlc1BlckxpbmU7DQorICBpbnQzMl90IG1fbGVmdDsNCisgIGludDMyX3QgbV90b3A7DQorICBDRlhfSW50MzJBcnJheSBtX3JnYkRhdGE7DQorICBDRlhfRElCaXRtYXAqIG1fcEJpdG1hcDsNCisgIGNvbnN0IENGWF9XaWRlU3RyaW5nIG1fZmlsZW5hbWU7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9CQ19EZWNvZGVyUmVzdWx0LmggYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19EZWNvZGVyUmVzdWx0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y1NWI1ZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0RlY29kZXJSZXN1bHQuaApAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0RFQ09ERVJSRVNVTFRfSF8NCisjZGVmaW5lIF9CQ19ERUNPREVSUkVTVUxUX0hfDQorY2xhc3MgQ0JDX0RlY29kZXJSZXN1bHQ7DQorY2xhc3MgQ0JDX0RlY29kZXJSZXN1bHQgew0KKyBwdWJsaWM6DQorICBDQkNfRGVjb2RlclJlc3VsdChDRlhfQnl0ZUFycmF5KiByYXdCeXRlcywNCisgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHRleHQsDQorICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBlY0xldmVsKTsNCisgIHZpcnR1YWwgfkNCQ19EZWNvZGVyUmVzdWx0KCk7DQorICBDRlhfQnl0ZUFycmF5KiBnZXRSYXdCeXRlcygpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgZ2V0VGV4dCgpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgZ2V0RUNMZXZlbCgpOw0KKyAgaW50MzJfdCBnZXRFcnJvcnNDb3JyZWN0ZWQoKTsNCisgIHZvaWQgc2V0RXJyb3JzQ29ycmVjdGVkKGludDMyX3QgZXJyb3JzQ29ycmVjdGVkKTsNCisgIGludDMyX3QgZ2V0RXJhc3VyZXMoKTsNCisgIHZvaWQgc2V0RXJhc3VyZXMoaW50MzJfdCBlcmFzdXJlcyk7DQorICB2b2lkKiBnZXRPdGhlcigpOw0KKyAgdm9pZCBzZXRPdGhlcih2b2lkKiBvdGhlcik7DQorDQorIHByaXZhdGU6DQorICBDRlhfQnl0ZUFycmF5KiBtX3Jhd0J5dGVzOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgbV90ZXh0Ow0KKyAgQ0ZYX0J5dGVTdHJpbmcgbV9lY0xldmVsOw0KKyAgaW50MzJfdCBtX2Vycm9yc0NvcnJlY3RlZDsNCisgIGludDMyX3QgbV9lcmFzdXJlczsNCisgIHZvaWQqIG1fb3RoZXI7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9CQ19EaW1lbnNpb24uY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfRGltZW5zaW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjI4MTAwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfRGltZW5zaW9uLmNwcApAQCAtMCwwICsxLDQ2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDEyIFpYaW5nIGF1dGhvcnMNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfRGltZW5zaW9uLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2Rlci5oIg0KK0NCQ19EaW1lbnNpb246OkNCQ19EaW1lbnNpb24oKSB7fQ0KK0NCQ19EaW1lbnNpb246OkNCQ19EaW1lbnNpb24oaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QmIGUpIHsNCisgIGlmICh3aWR0aCA8IDAgfHwgaGVpZ2h0IDwgMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25IZWlnaHRBbmRXaWR0aE11c3RCZUF0TGVhc3QxOw0KKyAgfQ0KKyAgbV93aWR0aCA9IHdpZHRoOw0KKyAgbV9oZWlnaHQgPSBoZWlnaHQ7DQorfQ0KK0NCQ19EaW1lbnNpb246On5DQkNfRGltZW5zaW9uKCkge30NCitpbnQzMl90IENCQ19EaW1lbnNpb246OmdldFdpZHRoKCkgew0KKyAgcmV0dXJuIG1fd2lkdGg7DQorfQ0KK2ludDMyX3QgQ0JDX0RpbWVuc2lvbjo6Z2V0SGVpZ2h0KCkgew0KKyAgcmV0dXJuIG1faGVpZ2h0Ow0KK30NCitpbnQzMl90IENCQ19EaW1lbnNpb246Omhhc2hDb2RlKCkgew0KKyAgcmV0dXJuIG1fd2lkdGggKiAzMjcxMyArIG1faGVpZ2h0Ow0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfRGltZW5zaW9uOjp0b1N0cmluZygpIHsNCisgIHJldHVybiAoRlhfV0NIQVIpKG1fd2lkdGggKyAoRlhfV0NIQVIpJ3gnICsgbV9oZWlnaHQpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9CQ19EaW1lbnNpb24uaCBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0RpbWVuc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwY2Y5MDkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19EaW1lbnNpb24uaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0RJTUVOU0lPTl9IXw0KKyNkZWZpbmUgX0JDX0RJTUVOU0lPTl9IXw0KK2NsYXNzIENCQ19EaW1lbnNpb247DQorY2xhc3MgQ0JDX0RpbWVuc2lvbiB7DQorIHB1YmxpYzoNCisgIENCQ19EaW1lbnNpb24oKTsNCisgIENCQ19EaW1lbnNpb24oaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCB+Q0JDX0RpbWVuc2lvbigpOw0KKyAgaW50MzJfdCBnZXRXaWR0aCgpOw0KKyAgaW50MzJfdCBnZXRIZWlnaHQoKTsNCisgIGludDMyX3QgaGFzaENvZGUoKTsNCisgIENGWF9XaWRlU3RyaW5nIHRvU3RyaW5nKCk7DQorDQorIHByaXZhdGU6DQorICBpbnQzMl90IG1fd2lkdGg7DQorICBpbnQzMl90IG1faGVpZ2h0Ow0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvQkNfTGlicmFyeS5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19MaWJyYXJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjE0Mjk4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfTGlicmFyeS5jcHAKQEAgLTAsMCArMSwxMjEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfUmVhZGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1V0aWxDb2RpbmdDb252ZXJ0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX0JpbmFyeUJpdG1hcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19MdW1pbmFuY2VTb3VyY2UuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19CaW5hcml6ZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfV3JpdGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX0RpbWVuc2lvbi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19VdGlsQ29kaW5nQ29udmVydC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19SZXN1bHRQb2ludC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19CaW5hcnlCaXRtYXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfRGVjb2RlclJlc3VsdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19Ud29EaW1Xcml0ZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CeXRlTWF0cml4LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdEFycmF5LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkRlY29kZXJSZXN1bHQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4VmVyc2lvbi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhSZWFkZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGVmYXVsdFBsYWNlbWVudC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbFNoYXBlSGludC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbEluZm8uaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Vycm9yQ29ycmVjdGlvbi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXJDb250ZXh0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQzQwRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1RleHRFbmNvZGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfWDEyRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VkaWZhY3RFbmNvZGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQmFzZTI1NkVuY29kZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19BU0NJSUVuY29kZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19IaWdoTGV2ZWxFbmNvZGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFdyaXRlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZURSZWFkZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTEyOFJlYWRlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlSZWFkZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVEaW1SZWFkZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNSZWFkZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFJlYWRlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRVUENBUmVhZGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGFCYXJSZWFkZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVEaW1Xcml0ZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTEyOFdyaXRlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlXcml0ZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNXcml0ZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFdyaXRlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRVUENBV3JpdGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3RvclJlc3VsdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29tcGFjdGlvbi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0b3IuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdG9yUmVzdWx0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb2Rld29yZC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29tbW9uLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlVmFsdWUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVNZXRhZGF0YS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Qm91bmRpbmdCb3guaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdGlvblJlc3VsdENvbHVtbi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3Rpb25SZXN1bHQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGVjb2RlZEJpdFN0cmVhbVBhcnNlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RUNNb2R1bHVzUG9seS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RUNNb2R1bHVzR0YuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdTY2FubmluZ0RlY29kZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1JlYWRlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlUmVhZGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVXcml0ZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1vZGUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJWZXJzaW9uLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRhdGFNYXNrLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCINCit2b2lkIEJDX0xpYnJhcnlfSW5pdCgpIHsNCisgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OkluaXRpYWxpemUoKTsNCisgIENCQ19RUkNvZGVyTW9kZTo6SW5pdGlhbGl6ZSgpOw0KKyAgQ0JDX1FSQ29kZXJWZXJzaW9uOjpJbml0aWFsaXplKCk7DQorICBDQkNfUVJEYXRhTWFzazo6SW5pdGlhbGl6ZSgpOw0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkluaXRpYWxpemUoKTsNCisgIENCQ19EYXRhTWF0cml4VmVyc2lvbjo6SW5pdGlhbGl6ZSgpOw0KKyAgQ0JDX1N5bWJvbEluZm86OkluaXRpYWxpemUoKTsNCisgIENCQ19FcnJvckNvcnJlY3Rpb246OkluaXRpYWxpemUoKTsNCisgIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpJbml0aWFsaXplKCk7DQorICBpbnQzMl90IGUgPSAwOw0KKyAgQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjpJbml0aWFsaXplKGUpOw0KKyAgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6SW5pdGlhbGl6ZSgpOw0KKyAgQ0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlcjo6SW5pdGlhbGl6ZSgpOw0KKyAgQ0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uOjpJbml0aWFsaXplKGUpOw0KKyAgQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6SW5pdGlhbGl6ZSgpOw0KK30NCit2b2lkIEJDX0xpYnJhcnlfRGVzdG9yeSgpIHsNCisgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OkZpbmFsaXplKCk7DQorICBDQkNfUVJDb2Rlck1vZGU6OkZpbmFsaXplKCk7DQorICBDQkNfUVJDb2RlclZlcnNpb246OkZpbmFsaXplKCk7DQorICBDQkNfUVJEYXRhTWFzazo6RmluYWxpemUoKTsNCisgIENCQ19SZWVkU29sb21vbkdGMjU2OjpGaW5hbGl6ZSgpOw0KKyAgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOjpGaW5hbGl6ZSgpOw0KKyAgQ0JDX1N5bWJvbEluZm86OkZpbmFsaXplKCk7DQorICBDQkNfRXJyb3JDb3JyZWN0aW9uOjpGaW5hbGl6ZSgpOw0KKyAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkZpbmFsaXplKCk7DQorICBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjpGaW5hbGl6ZSgpOw0KKyAgQ0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlcjo6RmluYWxpemUoKTsNCisgIENCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbjo6RmluYWxpemUoKTsNCisgIENCQ19QREY0MTdFQ01vZHVsdXNHRjo6RmluYWxpemUoKTsNCisgIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OkZpbmFsaXplKCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0x1bWluYW5jZVNvdXJjZS5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19MdW1pbmFuY2VTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZjVlMDMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19MdW1pbmFuY2VTb3VyY2UuY3BwCkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDkgWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJCQ19MdW1pbmFuY2VTb3VyY2UuaCINCitDQkNfTHVtaW5hbmNlU291cmNlOjpDQkNfTHVtaW5hbmNlU291cmNlKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KQ0KKyAgICA6IG1fd2lkdGgod2lkdGgpLCBtX2hlaWdodChoZWlnaHQpIHt9DQorQ0JDX0x1bWluYW5jZVNvdXJjZTo6fkNCQ19MdW1pbmFuY2VTb3VyY2UoKSB7fQ0KK2ludDMyX3QgQ0JDX0x1bWluYW5jZVNvdXJjZTo6R2V0V2lkdGgoKSB7DQorICByZXR1cm4gbV93aWR0aDsNCit9DQoraW50MzJfdCBDQkNfTHVtaW5hbmNlU291cmNlOjpHZXRIZWlnaHQoKSB7DQorICByZXR1cm4gbV9oZWlnaHQ7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0x1bWluYW5jZVNvdXJjZS5oIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfTHVtaW5hbmNlU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdjN2QzZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX0x1bWluYW5jZVNvdXJjZS5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfTFVNSU5BTkNFU09VUkNFX0gNCisjZGVmaW5lIF9CQ19MVU1JTkFOQ0VTT1VSQ0VfSA0KK2NsYXNzIENCQ19MdW1pbmFuY2VTb3VyY2U7DQorY2xhc3MgQ0JDX0x1bWluYW5jZVNvdXJjZSB7DQorIHB1YmxpYzoNCisgIENCQ19MdW1pbmFuY2VTb3VyY2UoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOw0KKyAgdmlydHVhbCB+Q0JDX0x1bWluYW5jZVNvdXJjZSgpOw0KKyAgaW50MzJfdCBHZXRXaWR0aCgpOw0KKyAgaW50MzJfdCBHZXRIZWlnaHQoKTsNCisNCisgIHZpcnR1YWwgQ0ZYX0J5dGVBcnJheSogR2V0Um93KGludDMyX3QgeSwgQ0ZYX0J5dGVBcnJheSYgcm93LCBpbnQzMl90JiBlKSA9IDA7DQorICB2aXJ0dWFsIENGWF9CeXRlQXJyYXkqIEdldE1hdHJpeCgpID0gMDsNCisNCisgcHJvdGVjdGVkOg0KKyAgaW50MzJfdCBtX3dpZHRoOw0KKyAgaW50MzJfdCBtX2hlaWdodDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1JlYWRlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19SZWFkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OTE2ODcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19SZWFkZXIuY3BwCkBAIC0wLDAgKzEsMTAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiQkNfUmVhZGVyLmgiDQorQ0JDX1JlYWRlcjo6Q0JDX1JlYWRlcigpIHt9DQorQ0JDX1JlYWRlcjo6fkNCQ19SZWFkZXIoKSB7fQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1JlYWRlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfUmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE1ZDUxMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1JlYWRlci5oCkBAIC0wLDAgKzEsMjAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUkVBREVSX0hfDQorI2RlZmluZSBfQkNfUkVBREVSX0hfDQorY2xhc3MgQ0JDX0JpbmFyeUJpdG1hcDsNCitjbGFzcyBDQkNfUmVhZGVyOw0KK2NsYXNzIENCQ19SZWFkZXIgew0KKyBwdWJsaWM6DQorICBDQkNfUmVhZGVyKCk7DQorICB2aXJ0dWFsIH5DQkNfUmVhZGVyKCk7DQorICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIERlY29kZShDQkNfQmluYXJ5Qml0bWFwKiBpbWFnZSwgaW50MzJfdCYgZSkgPSAwOw0KKyAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZyBEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCogaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgPSAwOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvQkNfUmVzdWx0UG9pbnQuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfUmVzdWx0UG9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYjEyN2MKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19SZXN1bHRQb2ludC5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJiYXJjb2RlLmgiDQorI2luY2x1ZGUgIkJDX1Jlc3VsdFBvaW50LmgiDQorQ0JDX1Jlc3VsdFBvaW50OjpDQkNfUmVzdWx0UG9pbnQoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkgOiBtX3goeCksIG1feSh5KSB7fQ0KK0ZYX0ZMT0FUIENCQ19SZXN1bHRQb2ludDo6R2V0WCgpIHsNCisgIHJldHVybiBtX3g7DQorfQ0KK0ZYX0ZMT0FUIENCQ19SZXN1bHRQb2ludDo6R2V0WSgpIHsNCisgIHJldHVybiBtX3k7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1Jlc3VsdFBvaW50LmggYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19SZXN1bHRQb2ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZDFmM2UKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19SZXN1bHRQb2ludC5oCkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUkVTVUxUUE9JTlRfSF8NCisjZGVmaW5lIF9CQ19SRVNVTFRQT0lOVF9IXw0KK2NsYXNzIENCQ19SZXN1bHRQb2ludDsNCitjbGFzcyBDQkNfUmVzdWx0UG9pbnQgew0KKyBwdWJsaWM6DQorICBDQkNfUmVzdWx0UG9pbnQoKTsNCisgIENCQ19SZXN1bHRQb2ludChGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KTsNCisgIHZpcnR1YWwgfkNCQ19SZXN1bHRQb2ludCgpIHt9DQorICB2aXJ0dWFsIEZYX0ZMT0FUIEdldFgoKTsNCisgIHZpcnR1YWwgRlhfRkxPQVQgR2V0WSgpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBGWF9GTE9BVCBtX3g7DQorICBGWF9GTE9BVCBtX3k7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9CQ19Ud29EaW1Xcml0ZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfVHdvRGltV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjcwMzc4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfVHdvRGltV3JpdGVyLmNwcApAQCAtMCwwICsxLDE1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSA8YWxnb3JpdGhtPg0KKw0KKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfbWF0aC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfV3JpdGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1R3b0RpbVdyaXRlci5oIg0KKw0KK0NCQ19Ud29EaW1Xcml0ZXI6OkNCQ19Ud29EaW1Xcml0ZXIoKSB7DQorICBtX2lDb3JyZWN0TGV2ZWwgPSAxOw0KKyAgbV9iRml4ZWRTaXplID0gVFJVRTsNCisgIG1fb3V0cHV0ID0gTlVMTDsNCit9DQorQ0JDX1R3b0RpbVdyaXRlcjo6fkNCQ19Ud29EaW1Xcml0ZXIoKSB7DQorICBpZiAobV9vdXRwdXQgIT0gTlVMTCkgew0KKyAgICBkZWxldGUgbV9vdXRwdXQ7DQorICAgIG1fb3V0cHV0ID0gTlVMTDsNCisgIH0NCit9DQordm9pZCBDQkNfVHdvRGltV3JpdGVyOjpSZW5kZXJEZXZpY2VSZXN1bHQoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCkgew0KKyAgQ0ZYX0dyYXBoU3RhdGVEYXRhIHN0YXRlRGF0YTsNCisgIENGWF9QYXRoRGF0YSBwYXRoOw0KKyAgcGF0aC5BcHBlbmRSZWN0KDAsIDAsIChGWF9GTE9BVCltX1dpZHRoLCAoRlhfRkxPQVQpbV9IZWlnaHQpOw0KKyAgZGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgbWF0cml4LCAmc3RhdGVEYXRhLCBtX2JhY2tncm91bmRDb2xvciwNCisgICAgICAgICAgICAgICAgICAgbV9iYWNrZ3JvdW5kQ29sb3IsIEZYRklMTF9BTFRFUk5BVEUpOw0KKyAgaW50MzJfdCBsZWZ0UG9zID0gMDsNCisgIGludDMyX3QgdG9wUG9zID0gMDsNCisgIGlmIChtX2JGaXhlZFNpemUpIHsNCisgICAgbGVmdFBvcyA9IChtX1dpZHRoIC0gbV9vdXRwdXQtPkdldFdpZHRoKCkpIC8gMjsNCisgICAgdG9wUG9zID0gKG1fSGVpZ2h0IC0gbV9vdXRwdXQtPkdldEhlaWdodCgpKSAvIDI7DQorICB9DQorICBDRlhfTWF0cml4IG1hdHJpID0gKm1hdHJpeDsNCisgIGlmIChtX1dpZHRoIDwgbV9vdXRwdXQtPkdldFdpZHRoKCkgJiYgbV9IZWlnaHQgPCBtX291dHB1dC0+R2V0SGVpZ2h0KCkpIHsNCisgICAgQ0ZYX01hdHJpeCBtYXRyaVNjYWxlKA0KKyAgICAgICAgKEZYX0ZMT0FUKW1fV2lkdGggLyAoRlhfRkxPQVQpbV9vdXRwdXQtPkdldFdpZHRoKCksIDAuMCwgMC4wLA0KKyAgICAgICAgKEZYX0ZMT0FUKW1fSGVpZ2h0IC8gKEZYX0ZMT0FUKW1fb3V0cHV0LT5HZXRIZWlnaHQoKSwgMC4wLCAwLjApOw0KKyAgICBtYXRyaVNjYWxlLkNvbmNhdCgqbWF0cml4KTsNCisgICAgbWF0cmkgPSBtYXRyaVNjYWxlOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgbV9vdXRwdXQtPkdldFdpZHRoKCk7IHgrKykgew0KKyAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBtX291dHB1dC0+R2V0SGVpZ2h0KCk7IHkrKykgew0KKyAgICAgIENGWF9QYXRoRGF0YSByZWN0Ow0KKyAgICAgIHJlY3QuQXBwZW5kUmVjdCgoRlhfRkxPQVQpbGVmdFBvcyArIHgsIChGWF9GTE9BVCl0b3BQb3MgKyB5LA0KKyAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKGxlZnRQb3MgKyB4ICsgMSksIChGWF9GTE9BVCkodG9wUG9zICsgeSArIDEpKTsNCisgICAgICBDRlhfR3JhcGhTdGF0ZURhdGEgc3RhdGVEYXRhOw0KKyAgICAgIGlmIChtX291dHB1dC0+R2V0KHgsIHkpKSB7DQorICAgICAgICBkZXZpY2UtPkRyYXdQYXRoKCZyZWN0LCAmbWF0cmksICZzdGF0ZURhdGEsIG1fYmFyQ29sb3IsIDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYRklMTF9XSU5ESU5HKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDQkNfVHdvRGltV3JpdGVyOjpSZW5kZXJCaXRtYXBSZXN1bHQoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAobV9iRml4ZWRTaXplKSB7DQorICAgIHBPdXRCaXRtYXAgPSBDcmVhdGVESUJpdG1hcChtX1dpZHRoLCBtX0hlaWdodCk7DQorICB9IGVsc2Ugew0KKyAgICBwT3V0Qml0bWFwID0gQ3JlYXRlRElCaXRtYXAobV9vdXRwdXQtPkdldFdpZHRoKCksIG1fb3V0cHV0LT5HZXRIZWlnaHQoKSk7DQorICB9DQorICBpZiAoIXBPdXRCaXRtYXApIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uRmFpbFRvQ3JlYXRlQml0bWFwOw0KKyAgICByZXR1cm47DQorICB9DQorICBwT3V0Qml0bWFwLT5DbGVhcihtX2JhY2tncm91bmRDb2xvcik7DQorICBpbnQzMl90IGxlZnRQb3MgPSAwOw0KKyAgaW50MzJfdCB0b3BQb3MgPSAwOw0KKyAgaWYgKG1fYkZpeGVkU2l6ZSkgew0KKyAgICBsZWZ0UG9zID0gKG1fV2lkdGggLSBtX291dHB1dC0+R2V0V2lkdGgoKSkgLyAyOw0KKyAgICB0b3BQb3MgPSAobV9IZWlnaHQgLSBtX291dHB1dC0+R2V0SGVpZ2h0KCkpIC8gMjsNCisgIH0NCisgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IG1fb3V0cHV0LT5HZXRXaWR0aCgpOyB4KyspIHsNCisgICAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgbV9vdXRwdXQtPkdldEhlaWdodCgpOyB5KyspIHsNCisgICAgICBpZiAobV9vdXRwdXQtPkdldCh4LCB5KSkgew0KKyAgICAgICAgcE91dEJpdG1hcC0+U2V0UGl4ZWwobGVmdFBvcyArIHgsIHRvcFBvcyArIHksIG1fYmFyQ29sb3IpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKCFtX2JGaXhlZFNpemUpIHsNCisgICAgQ0ZYX0RJQml0bWFwKiBwU3RyZXRjaEJpdG1hcCA9IHBPdXRCaXRtYXAtPlN0cmV0Y2hUbyhtX1dpZHRoLCBtX0hlaWdodCk7DQorICAgIGlmIChwT3V0Qml0bWFwKSB7DQorICAgICAgZGVsZXRlIHBPdXRCaXRtYXA7DQorICAgIH0NCisgICAgcE91dEJpdG1hcCA9IHBTdHJldGNoQml0bWFwOw0KKyAgfQ0KK30NCit2b2lkIENCQ19Ud29EaW1Xcml0ZXI6OlJlbmRlclJlc3VsdCh1aW50OF90KiBjb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZVdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZUhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IGlucHV0V2lkdGggPSBjb2RlV2lkdGg7DQorICBpbnQzMl90IGlucHV0SGVpZ2h0ID0gY29kZUhlaWdodDsNCisgIGludDMyX3QgdGVtcFdpZHRoID0gaW5wdXRXaWR0aCArIDI7DQorICBpbnQzMl90IHRlbXBIZWlnaHQgPSBpbnB1dEhlaWdodCArIDI7DQorICBGWF9GTE9BVCBtb2R1bGVIU2l6ZSA9IHN0ZDo6bWluKG1fTW9kdWxlV2lkdGgsIG1fTW9kdWxlSGVpZ2h0KTsNCisgIG1vZHVsZUhTaXplID0gc3RkOjptaW4obW9kdWxlSFNpemUsIDguMGYpOw0KKyAgbW9kdWxlSFNpemUgPSBzdGQ6Om1heChtb2R1bGVIU2l6ZSwgMS4wZik7DQorICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPGludDMyX3Q+IHNjYWxlZFdpZHRoID0gdGVtcFdpZHRoOw0KKyAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxpbnQzMl90PiBzY2FsZWRIZWlnaHQgPSB0ZW1wSGVpZ2h0Ow0KKyAgc2NhbGVkV2lkdGggKj0gbW9kdWxlSFNpemU7DQorICBzY2FsZWRIZWlnaHQgKj0gbW9kdWxlSFNpemU7DQorDQorICBpbnQzMl90IG91dHB1dFdpZHRoID0gc2NhbGVkV2lkdGguVmFsdWVPckRpZSgpOw0KKyAgaW50MzJfdCBvdXRwdXRIZWlnaHQgPSBzY2FsZWRIZWlnaHQuVmFsdWVPckRpZSgpOw0KKyAgaWYgKG1fYkZpeGVkU2l6ZSkgew0KKyAgICBpZiAobV9XaWR0aCA8IG91dHB1dFdpZHRoIHx8IG1fSGVpZ2h0IDwgb3V0cHV0SGVpZ2h0KSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uQml0bWFwU2l6ZUVycm9yOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgaWYgKG1fV2lkdGggPiBvdXRwdXRXaWR0aCB8fCBtX0hlaWdodCA+IG91dHB1dEhlaWdodCkgew0KKyAgICAgIG91dHB1dFdpZHRoID0gKGludDMyX3QpKG91dHB1dFdpZHRoICoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWlsKChGWF9GTE9BVCltX1dpZHRoIC8gKEZYX0ZMT0FUKW91dHB1dFdpZHRoKSk7DQorICAgICAgb3V0cHV0SGVpZ2h0ID0gKGludDMyX3QpKA0KKyAgICAgICAgICBvdXRwdXRIZWlnaHQgKiBjZWlsKChGWF9GTE9BVCltX0hlaWdodCAvIChGWF9GTE9BVClvdXRwdXRIZWlnaHQpKTsNCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBtdWx0aVggPSAoaW50MzJfdCljZWlsKChGWF9GTE9BVClvdXRwdXRXaWR0aCAvIChGWF9GTE9BVCl0ZW1wV2lkdGgpOw0KKyAgaW50MzJfdCBtdWx0aVkgPSAoaW50MzJfdCljZWlsKChGWF9GTE9BVClvdXRwdXRIZWlnaHQgLyAoRlhfRkxPQVQpdGVtcEhlaWdodCk7DQorICBpZiAobV9iRml4ZWRTaXplKSB7DQorICAgIG11bHRpWCA9IHN0ZDo6bWluKG11bHRpWCwgbXVsdGlZKTsNCisgICAgbXVsdGlZID0gbXVsdGlYOw0KKyAgfQ0KKyAgaW50MzJfdCBsZWZ0UGFkZGluZyA9IChvdXRwdXRXaWR0aCAtIChpbnB1dFdpZHRoICogbXVsdGlYKSkgLyAyOw0KKyAgaW50MzJfdCB0b3BQYWRkaW5nID0gKG91dHB1dEhlaWdodCAtIChpbnB1dEhlaWdodCAqIG11bHRpWSkpIC8gMjsNCisgIGlmIChsZWZ0UGFkZGluZyA8IDApIHsNCisgICAgbGVmdFBhZGRpbmcgPSAwOw0KKyAgfQ0KKyAgaWYgKHRvcFBhZGRpbmcgPCAwKSB7DQorICAgIHRvcFBhZGRpbmcgPSAwOw0KKyAgfQ0KKyAgbV9vdXRwdXQgPSBuZXcgQ0JDX0NvbW1vbkJpdE1hdHJpeDsNCisgIG1fb3V0cHV0LT5Jbml0KG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQpOw0KKyAgZm9yIChpbnQzMl90IGlucHV0WSA9IDAsIG91dHB1dFkgPSB0b3BQYWRkaW5nOw0KKyAgICAgICAoaW5wdXRZIDwgaW5wdXRIZWlnaHQpICYmIChvdXRwdXRZIDwgb3V0cHV0SGVpZ2h0IC0gbXVsdGlZKTsNCisgICAgICAgaW5wdXRZKyssIG91dHB1dFkgKz0gbXVsdGlZKSB7DQorICAgIGZvciAoaW50MzJfdCBpbnB1dFggPSAwLCBvdXRwdXRYID0gbGVmdFBhZGRpbmc7DQorICAgICAgICAgKGlucHV0WCA8IGlucHV0V2lkdGgpICYmIChvdXRwdXRYIDwgb3V0cHV0V2lkdGggLSBtdWx0aVgpOw0KKyAgICAgICAgIGlucHV0WCsrLCBvdXRwdXRYICs9IG11bHRpWCkgew0KKyAgICAgIGlmIChjb2RlW2lucHV0WCArIGlucHV0WSAqIGlucHV0V2lkdGhdID09IDEpIHsNCisgICAgICAgIG1fb3V0cHV0LT5TZXRSZWdpb24ob3V0cHV0WCwgb3V0cHV0WSwgbXVsdGlYLCBtdWx0aVksIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1R3b0RpbVdyaXRlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfVHdvRGltV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZiZDk4MAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1R3b0RpbVdyaXRlci5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBYRkFfU1JDX0ZYQkFSQ09ERV9CQ19UV09ESU1XUklURVJfSF8NCisjZGVmaW5lIFhGQV9TUkNfRlhCQVJDT0RFX0JDX1RXT0RJTVdSSVRFUl9IXw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19Xcml0ZXIuaCINCisNCitjbGFzcyBDQkNfQ29tbW9uQml0TWF0cml4Ow0KKw0KK2NsYXNzIENCQ19Ud29EaW1Xcml0ZXIgOiBwdWJsaWMgQ0JDX1dyaXRlciB7DQorIHB1YmxpYzoNCisgIENCQ19Ud29EaW1Xcml0ZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19Ud29EaW1Xcml0ZXIoKTsNCisgIHZpcnR1YWwgdm9pZCBSZW5kZXJSZXN1bHQodWludDhfdCogY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2RlV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZUhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICB2aXJ0dWFsIHZvaWQgUmVuZGVyQml0bWFwUmVzdWx0KENGWF9ESUJpdG1hcComIHBPdXRCaXRtYXAsIGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCB2b2lkIFJlbmRlckRldmljZVJlc3VsdChDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoaW50MzJfdCBsZXZlbCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEVycm9yQ29ycmVjdGlvbkxldmVsKCkgeyByZXR1cm4gbV9pQ29ycmVjdExldmVsOyB9Ow0KKw0KKyBwcm90ZWN0ZWQ6DQorICBpbnQzMl90IG1faUNvcnJlY3RMZXZlbDsNCisgIEZYX0JPT0wgbV9iRml4ZWRTaXplOw0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogbV9vdXRwdXQ7DQorfTsNCisNCisjZW5kaWYgIC8vIFhGQV9TUkNfRlhCQVJDT0RFX0JDX1RXT0RJTVdSSVRFUl9IXw0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1V0aWxDb2RpbmdDb252ZXJ0LmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1V0aWxDb2RpbmdDb252ZXJ0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTRkNDQ4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfVXRpbENvZGluZ0NvbnZlcnQuY3BwCkBAIC0wLDAgKzEsNDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiQkNfVXRpbENvZGluZ0NvbnZlcnQuaCINCitDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OkNCQ19VdGlsQ29kaW5nQ29udmVydCgpIHt9DQorQ0JDX1V0aWxDb2RpbmdDb252ZXJ0Ojp+Q0JDX1V0aWxDb2RpbmdDb252ZXJ0KCkge30NCit2b2lkIENCQ19VdGlsQ29kaW5nQ29udmVydDo6VW5pY29kZVRvTG9jYWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzcmMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgZHN0KSB7DQorICBkc3QuQ29udmVydEZyb20oc3JjKTsNCit9DQordm9pZCBDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OkxvY2FsZVRvVXRmOChjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3JjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGRzdCkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgdW5pY29kZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3JjLCBzcmMuR2V0TGVuZ3RoKCkpOw0KKyAgZHN0ID0gdW5pY29kZS5VVEY4RW5jb2RlKCk7DQorfQ0KK3ZvaWQgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0OjpMb2NhbGVUb1V0ZjgoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNyYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlQXJyYXkmIGRzdCkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgdW5pY29kZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3JjLCBzcmMuR2V0TGVuZ3RoKCkpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgdXRmOCA9IHVuaWNvZGUuVVRGOEVuY29kZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgdXRmOC5HZXRMZW5ndGgoKTsgaSsrKSB7DQorICAgIGRzdC5BZGQodXRmOFtpXSk7DQorICB9DQorfQ0KK3ZvaWQgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0OjpVdGY4VG9Mb2NhbGUoY29uc3QgQ0ZYX0J5dGVBcnJheSYgc3JjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGRzdCkgew0KKyAgQ0ZYX0J5dGVTdHJpbmcgdXRmODsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNyYy5HZXRTaXplKCk7IGkrKykgew0KKyAgICB1dGY4ICs9IHNyY1tpXTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHVuaWNvZGUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgodXRmOCwgdXRmOC5HZXRMZW5ndGgoKSk7DQorICBkc3QuQ29udmVydEZyb20odW5pY29kZSk7DQorfQ0KK3ZvaWQgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0OjpVdGY4VG9Mb2NhbGUoY29uc3QgdWludDhfdCogc3JjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBkc3QpIHsNCisgIENGWF9XaWRlU3RyaW5nIHVuaWNvZGUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoKGNvbnN0IGNoYXIqKXNyYywgY291bnQpOw0KKyAgZHN0LkNvbnZlcnRGcm9tKHVuaWNvZGUpOw0KK30NCit2b2lkIENCQ19VdGlsQ29kaW5nQ29udmVydDo6VW5pY29kZVRvVVRGOChjb25zdCBDRlhfV2lkZVN0cmluZyYgc3JjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBkc3QpIHsNCisgIGRzdCA9IHNyYy5VVEY4RW5jb2RlKCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1V0aWxDb2RpbmdDb252ZXJ0LmggYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19VdGlsQ29kaW5nQ29udmVydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YWQwYjEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19VdGlsQ29kaW5nQ29udmVydC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfVVRJTENPRElOR0NPTlZFUlRfSF8NCisjZGVmaW5lIF9CQ19VVElMQ09ESU5HQ09OVkVSVF9IXw0KK2NsYXNzIENCQ19VdGlsQ29kaW5nQ29udmVydDsNCitjbGFzcyBDQkNfVXRpbENvZGluZ0NvbnZlcnQgew0KKyBwdWJsaWM6DQorICBDQkNfVXRpbENvZGluZ0NvbnZlcnQoKTsNCisgIHZpcnR1YWwgfkNCQ19VdGlsQ29kaW5nQ29udmVydCgpOw0KKyAgc3RhdGljIHZvaWQgVW5pY29kZVRvTG9jYWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzb3VyY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCk7DQorICBzdGF0aWMgdm9pZCBMb2NhbGVUb1V0ZjgoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNvdXJjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0KTsNCisgIHN0YXRpYyB2b2lkIExvY2FsZVRvVXRmOChjb25zdCBDRlhfQnl0ZVN0cmluZyYgc291cmNlLCBDRlhfQnl0ZUFycmF5JiByZXN1bHQpOw0KKyAgc3RhdGljIHZvaWQgVXRmOFRvTG9jYWxlKGNvbnN0IENGWF9CeXRlQXJyYXkmIHNvdXJjZSwgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCk7DQorICBzdGF0aWMgdm9pZCBVdGY4VG9Mb2NhbGUoY29uc3QgdWludDhfdCogc291cmNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCk7DQorICBzdGF0aWMgdm9pZCBVbmljb2RlVG9VVEY4KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzb3VyY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvQkNfVXRpbFJTUy5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19VdGlsUlNTLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzE2Mzc3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfVXRpbFJTUy5jcHAKQEAgLTAsMCArMSwxNjAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDkgWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAiYmFyY29kZS5oIg0KKyNpbmNsdWRlICJCQ19VdGlsUlNTLmgiDQorQ0JDX1V0aWxSU1M6OkNCQ19VdGlsUlNTKCkge30NCitDQkNfVXRpbFJTUzo6fkNCQ19VdGlsUlNTKCkge30NCitDRlhfSW50MzJBcnJheSogQ0JDX1V0aWxSU1M6OkdldFJzc1dpZHRocyhpbnQzMl90IHZhbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlbGVtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgbm9OYXJyb3cpIHsNCisgIENGWF9JbnQzMkFycmF5KiBpVGVtcCA9IG5ldyBDRlhfSW50MzJBcnJheTsNCisgIGlUZW1wLT5TZXRTaXplKGVsZW1lbnRzKTsNCisgIENCQ19BdXRvUHRyPENGWF9JbnQzMkFycmF5PiB3aWR0aHMoaVRlbXApOw0KKyAgaW50MzJfdCBiYXI7DQorICBpbnQzMl90IG5hcnJvd01hc2sgPSAwOw0KKyAgZm9yIChiYXIgPSAwOyBiYXIgPCBlbGVtZW50cyAtIDE7IGJhcisrKSB7DQorICAgIG5hcnJvd01hc2sgfD0gKDEgPDwgYmFyKTsNCisgICAgaW50MzJfdCBlbG1XaWR0aCA9IDE7DQorICAgIGludDMyX3Qgc3ViVmFsOw0KKyAgICB3aGlsZSAoVFJVRSkgew0KKyAgICAgIHN1YlZhbCA9IENvbWJpbnMobiAtIGVsbVdpZHRoIC0gMSwgZWxlbWVudHMgLSBiYXIgLSAyKTsNCisgICAgICBpZiAobm9OYXJyb3cgJiYgKG5hcnJvd01hc2sgPT0gMCkgJiYNCisgICAgICAgICAgKG4gLSBlbG1XaWR0aCAtIChlbGVtZW50cyAtIGJhciAtIDEpID49IGVsZW1lbnRzIC0gYmFyIC0gMSkpIHsNCisgICAgICAgIHN1YlZhbCAtPSBDb21iaW5zKG4gLSBlbG1XaWR0aCAtIChlbGVtZW50cyAtIGJhciksIGVsZW1lbnRzIC0gYmFyIC0gMik7DQorICAgICAgfQ0KKyAgICAgIGlmIChlbGVtZW50cyAtIGJhciAtIDEgPiAxKSB7DQorICAgICAgICBpbnQzMl90IGxlc3NWYWwgPSAwOw0KKyAgICAgICAgZm9yIChpbnQzMl90IG14d0VsZW1lbnQgPSBuIC0gZWxtV2lkdGggLSAoZWxlbWVudHMgLSBiYXIgLSAyKTsNCisgICAgICAgICAgICAgbXh3RWxlbWVudCA+IG1heFdpZHRoOyBteHdFbGVtZW50LS0pIHsNCisgICAgICAgICAgbGVzc1ZhbCArPSBDb21iaW5zKG4gLSBlbG1XaWR0aCAtIG14d0VsZW1lbnQgLSAxLCBlbGVtZW50cyAtIGJhciAtIDMpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc3ViVmFsIC09IGxlc3NWYWwgKiAoZWxlbWVudHMgLSAxIC0gYmFyKTsNCisgICAgICB9IGVsc2UgaWYgKG4gLSBlbG1XaWR0aCA+IG1heFdpZHRoKSB7DQorICAgICAgICBzdWJWYWwtLTsNCisgICAgICB9DQorICAgICAgdmFsIC09IHN1YlZhbDsNCisgICAgICBpZiAodmFsIDwgMCkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGVsbVdpZHRoKys7DQorICAgICAgbmFycm93TWFzayAmPSB+KDEgPDwgYmFyKTsNCisgICAgfQ0KKyAgICB2YWwgKz0gc3ViVmFsOw0KKyAgICBuIC09IGVsbVdpZHRoOw0KKyAgICAoKndpZHRocylbYmFyXSA9IGVsbVdpZHRoOw0KKyAgfQ0KKyAgKCp3aWR0aHMpW2Jhcl0gPSBuOw0KKyAgcmV0dXJuIHdpZHRocy5yZWxlYXNlKCk7DQorfQ0KK2ludDMyX3QgQ0JDX1V0aWxSU1M6OkdldFJTU3ZhbHVlKENGWF9JbnQzMkFycmF5JiB3aWR0aHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIG5vTmFycm93KSB7DQorICBpbnQzMl90IGVsZW1lbnRzID0gd2lkdGhzLkdldFNpemUoKTsNCisgIGludDMyX3QgbiA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBlbGVtZW50czsgaSsrKSB7DQorICAgIG4gKz0gd2lkdGhzW2ldOw0KKyAgfQ0KKyAgaW50MzJfdCB2YWwgPSAwOw0KKyAgaW50MzJfdCBuYXJyb3dNYXNrID0gMDsNCisgIGZvciAoaW50MzJfdCBiYXIgPSAwOyBiYXIgPCBlbGVtZW50cyAtIDE7IGJhcisrKSB7DQorICAgIGludDMyX3QgZWxtV2lkdGg7DQorICAgIGZvciAoZWxtV2lkdGggPSAxLCBuYXJyb3dNYXNrIHw9ICgxIDw8IGJhcik7IGVsbVdpZHRoIDwgd2lkdGhzW2Jhcl07DQorICAgICAgICAgZWxtV2lkdGgrKywgbmFycm93TWFzayAmPSB+KDEgPDwgYmFyKSkgew0KKyAgICAgIGludDMyX3Qgc3ViVmFsID0gQ29tYmlucyhuIC0gZWxtV2lkdGggLSAxLCBlbGVtZW50cyAtIGJhciAtIDIpOw0KKyAgICAgIGlmIChub05hcnJvdyAmJiAobmFycm93TWFzayA9PSAwKSAmJg0KKyAgICAgICAgICAobiAtIGVsbVdpZHRoIC0gKGVsZW1lbnRzIC0gYmFyIC0gMSkgPj0gZWxlbWVudHMgLSBiYXIgLSAxKSkgew0KKyAgICAgICAgc3ViVmFsIC09IENvbWJpbnMobiAtIGVsbVdpZHRoIC0gKGVsZW1lbnRzIC0gYmFyKSwgZWxlbWVudHMgLSBiYXIgLSAyKTsNCisgICAgICB9DQorICAgICAgaWYgKGVsZW1lbnRzIC0gYmFyIC0gMSA+IDEpIHsNCisgICAgICAgIGludDMyX3QgbGVzc1ZhbCA9IDA7DQorICAgICAgICBmb3IgKGludDMyX3QgbXh3RWxlbWVudCA9IG4gLSBlbG1XaWR0aCAtIChlbGVtZW50cyAtIGJhciAtIDIpOw0KKyAgICAgICAgICAgICBteHdFbGVtZW50ID4gbWF4V2lkdGg7IG14d0VsZW1lbnQtLSkgew0KKyAgICAgICAgICBsZXNzVmFsICs9IENvbWJpbnMobiAtIGVsbVdpZHRoIC0gbXh3RWxlbWVudCAtIDEsIGVsZW1lbnRzIC0gYmFyIC0gMyk7DQorICAgICAgICB9DQorICAgICAgICBzdWJWYWwgLT0gbGVzc1ZhbCAqIChlbGVtZW50cyAtIDEgLSBiYXIpOw0KKyAgICAgIH0gZWxzZSBpZiAobiAtIGVsbVdpZHRoID4gbWF4V2lkdGgpIHsNCisgICAgICAgIHN1YlZhbC0tOw0KKyAgICAgIH0NCisgICAgICB2YWwgKz0gc3ViVmFsOw0KKyAgICB9DQorICAgIG4gLT0gZWxtV2lkdGg7DQorICB9DQorICByZXR1cm4gdmFsOw0KK30NCitpbnQzMl90IENCQ19VdGlsUlNTOjpDb21iaW5zKGludDMyX3QgbiwgaW50MzJfdCByKSB7DQorICBpbnQzMl90IG1heERlbm9tOw0KKyAgaW50MzJfdCBtaW5EZW5vbTsNCisgIGlmIChuIC0gciA+IHIpIHsNCisgICAgbWluRGVub20gPSByOw0KKyAgICBtYXhEZW5vbSA9IG4gLSByOw0KKyAgfSBlbHNlIHsNCisgICAgbWluRGVub20gPSBuIC0gcjsNCisgICAgbWF4RGVub20gPSByOw0KKyAgfQ0KKyAgaW50MzJfdCB2YWwgPSAxOw0KKyAgaW50MzJfdCBqID0gMTsNCisgIGZvciAoaW50MzJfdCBpID0gbjsgaSA+IG1heERlbm9tOyBpLS0pIHsNCisgICAgdmFsICo9IGk7DQorICAgIGlmIChqIDw9IG1pbkRlbm9tKSB7DQorICAgICAgdmFsIC89IGo7DQorICAgICAgaisrOw0KKyAgICB9DQorICB9DQorICB3aGlsZSAoaiA8PSBtaW5EZW5vbSkgew0KKyAgICB2YWwgLz0gajsNCisgICAgaisrOw0KKyAgfQ0KKyAgcmV0dXJuIHZhbDsNCit9DQorQ0ZYX0ludDMyQXJyYXkqIENCQ19VdGlsUlNTOjpFbGVtZW50cyhDRlhfSW50MzJBcnJheSYgZURpc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IE4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IEspIHsNCisgIENGWF9JbnQzMkFycmF5KiB3aWR0aHMgPSBuZXcgQ0ZYX0ludDMyQXJyYXk7DQorICB3aWR0aHMtPlNldFNpemUoZURpc3QuR2V0U2l6ZSgpICsgMik7DQorICBpbnQzMl90IHR3b0sgPSBLIDw8IDE7DQorICAoKndpZHRocylbMF0gPSAxOw0KKyAgaW50MzJfdCBpOw0KKyAgaW50MzJfdCBtaW5FdmVuID0gMTA7DQorICBpbnQzMl90IGJhclN1bSA9IDE7DQorICBmb3IgKGkgPSAxOyBpIDwgdHdvSyAtIDI7IGkgKz0gMikgew0KKyAgICAoKndpZHRocylbaV0gPSBlRGlzdFtpIC0gMV0gLSAoKndpZHRocylbaSAtIDFdOw0KKyAgICAoKndpZHRocylbaSArIDFdID0gZURpc3RbaV0gLSAoKndpZHRocylbaV07DQorICAgIGJhclN1bSArPSAoKndpZHRocylbaV0gKyAoKndpZHRocylbaSArIDFdOw0KKyAgICBpZiAoKCp3aWR0aHMpW2ldIDwgbWluRXZlbikgew0KKyAgICAgIG1pbkV2ZW4gPSAoKndpZHRocylbaV07DQorICAgIH0NCisgIH0NCisgICgqd2lkdGhzKVt0d29LIC0gMV0gPSBOIC0gYmFyU3VtOw0KKyAgaWYgKCgqd2lkdGhzKVt0d29LIC0gMV0gPCBtaW5FdmVuKSB7DQorICAgIG1pbkV2ZW4gPSAoKndpZHRocylbdHdvSyAtIDFdOw0KKyAgfQ0KKyAgaWYgKG1pbkV2ZW4gPiAxKSB7DQorICAgIGZvciAoaSA9IDA7IGkgPCB0d29LOyBpICs9IDIpIHsNCisgICAgICAoKndpZHRocylbaV0gKz0gbWluRXZlbiAtIDE7DQorICAgICAgKCp3aWR0aHMpW2kgKyAxXSAtPSBtaW5FdmVuIC0gMTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHdpZHRoczsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvQkNfVXRpbFJTUy5oIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfVXRpbFJTUy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYmVkMDMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19VdGlsUlNTLmgKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19VVElMUkVTU19IXw0KKyNkZWZpbmUgX0JDX1VUSUxSRVNTX0hfDQorY2xhc3MgQ0JDX1Jzc1BhaXI7DQorY2xhc3MgQ0JDX1V0aWxSU1Mgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5DQkNfVXRpbFJTUygpOw0KKyAgc3RhdGljIGludDMyX3QgR2V0UlNTdmFsdWUoQ0ZYX0ludDMyQXJyYXkmIHdpZHRocywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF4V2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIG5vTmFycm93KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgc3RhdGljIENGWF9JbnQzMkFycmF5KiBHZXRSc3NXaWR0aHMoaW50MzJfdCB2YWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVsZW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgbm9OYXJyb3cpOw0KKyAgc3RhdGljIGludDMyX3QgQ29tYmlucyhpbnQzMl90IG4sIGludDMyX3Qgcik7DQorICBzdGF0aWMgQ0ZYX0ludDMyQXJyYXkqIEVsZW1lbnRzKENGWF9JbnQzMkFycmF5JiBlRGlzdCwgaW50MzJfdCBOLCBpbnQzMl90IEspOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0JDX1V0aWxSU1MoKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1V0aWxzLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTdlY2I5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfVXRpbHMuY3BwCkBAIC0wLDAgKzEsNDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCitGWF9CT09MIEJDX0ZYX0J5dGVTdHJpbmdfUmVwbGFjZShDRlhfQnl0ZVN0cmluZyYgZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpcnN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGxhc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DSEFSIGMpIHsNCisgIGlmIChmaXJzdCA+IGxhc3QgfHwgY291bnQgPD0gMCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBkc3QuRGVsZXRlKGZpcnN0LCBsYXN0IC0gZmlyc3QpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgew0KKyAgICBkc3QuSW5zZXJ0KDAsIGMpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQoQ0ZYX0J5dGVTdHJpbmcmIGRzdCwgaW50MzJfdCBjb3VudCwgRlhfQ0hBUiBjKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7DQorICAgIGRzdCArPSBjOw0KKyAgfQ0KK30NCit2b2lkIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKENGWF9CeXRlU3RyaW5nJiBkc3QsIGNvbnN0IENGWF9CeXRlQXJyYXkmIGJhKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBiYS5HZXRTaXplKCk7IGkrKykgew0KKyAgICBkc3QgKz0gYmFbaV07DQorICB9DQorfQ0KK3ZvaWQgQkNfRlhfUHRyQXJyYXlfU29ydChDRlhfUHRyQXJyYXkmIHNyYywgQkNfUHRyQXJyYXlDb21wYXJlQ2FsbGJhY2sgZnVuKSB7DQorICBpbnQzMl90IG5MZW5ndGggPSBzcmMuR2V0U2l6ZSgpOw0KKyAgRlhfQk9PTCBjaGFuZ2VkID0gdHJ1ZTsNCisgIGRvIHsNCisgICAgY2hhbmdlZCA9IGZhbHNlOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuTGVuZ3RoIC0gMTsgaSsrKSB7DQorICAgICAgaWYgKGZ1bihzcmNbaSArIDFdLCBzcmNbaV0pKSB7DQorICAgICAgICB2b2lkKiB0ZW1wID0gc3JjW2ldOw0KKyAgICAgICAgc3JjLlNldEF0KGksIHNyY1tpICsgMV0pOw0KKyAgICAgICAgc3JjLlNldEF0KGkgKyAxLCB0ZW1wKTsNCisgICAgICAgIGNoYW5nZWQgPSB0cnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSB3aGlsZSAoY2hhbmdlZCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL0JDX1dyaXRlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19Xcml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4OWQ2NzIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19Xcml0ZXIuY3BwCkBAIC0wLDAgKzEsNTYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImJhcmNvZGUuaCINCisjaW5jbHVkZSAiQkNfV3JpdGVyLmgiDQorQ0JDX1dyaXRlcjo6Q0JDX1dyaXRlcigpIHsNCisgIG1fQ2hhckVuY29kaW5nID0gMDsNCisgIG1fTW9kdWxlSGVpZ2h0ID0gMTsNCisgIG1fTW9kdWxlV2lkdGggPSAxOw0KKyAgbV9IZWlnaHQgPSAzMjA7DQorICBtX1dpZHRoID0gNjQwOw0KKyAgbV9jb2xvclNwYWNlID0gRlhESUJfQXJnYjsNCisgIG1fYmFyQ29sb3IgPSAweGZmMDAwMDAwOw0KKyAgbV9iYWNrZ3JvdW5kQ29sb3IgPSAweGZmZmZmZmZmOw0KK30NCitDQkNfV3JpdGVyOjp+Q0JDX1dyaXRlcigpIHt9DQorRlhfQk9PTCBDQkNfV3JpdGVyOjpTZXRDaGFyRW5jb2RpbmcoaW50MzJfdCBlbmNvZGluZykgew0KKyAgbV9DaGFyRW5jb2RpbmcgPSBlbmNvZGluZzsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENCQ19Xcml0ZXI6OlNldE1vZHVsZUhlaWdodChpbnQzMl90IG1vZHVsZUhlaWdodCkgew0KKyAgaWYgKG1vZHVsZUhlaWdodCA+IDEwIHx8IG1vZHVsZUhlaWdodCA8IDEpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9Nb2R1bGVIZWlnaHQgPSBtb2R1bGVIZWlnaHQ7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDQkNfV3JpdGVyOjpTZXRNb2R1bGVXaWR0aChpbnQzMl90IG1vZHVsZVdpZHRoKSB7DQorICBpZiAobW9kdWxlV2lkdGggPiAxMCB8fCBtb2R1bGVXaWR0aCA8IDEpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9Nb2R1bGVXaWR0aCA9IG1vZHVsZVdpZHRoOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0JDX1dyaXRlcjo6U2V0SGVpZ2h0KGludDMyX3QgaGVpZ2h0KSB7DQorICBtX0hlaWdodCA9IGhlaWdodDsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENCQ19Xcml0ZXI6OlNldFdpZHRoKGludDMyX3Qgd2lkdGgpIHsNCisgIG1fV2lkdGggPSB3aWR0aDsNCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENCQ19Xcml0ZXI6OlNldEJhY2tncm91bmRDb2xvcihGWF9BUkdCIGJhY2tncm91bmRDb2xvcikgew0KKyAgbV9iYWNrZ3JvdW5kQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7DQorfQ0KK3ZvaWQgQ0JDX1dyaXRlcjo6U2V0QmFyY29kZUNvbG9yKEZYX0FSR0IgZm9yZWdyb3VuZENvbG9yKSB7DQorICBtX2JhckNvbG9yID0gZm9yZWdyb3VuZENvbG9yOw0KK30NCitDRlhfRElCaXRtYXAqIENCQ19Xcml0ZXI6OkNyZWF0ZURJQml0bWFwKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7DQorICBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7DQorICBwRElCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBtX2NvbG9yU3BhY2UpOw0KKyAgcmV0dXJuIHBESUJpdG1hcDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvQkNfV3JpdGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9CQ19Xcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGNiOTc1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvQkNfV3JpdGVyLmgKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIFhGQV9TUkNfRlhCQVJDT0RFX0JDX1dSSVRFUl9IXw0KKyNkZWZpbmUgWEZBX1NSQ19GWEJBUkNPREVfQkNfV1JJVEVSX0hfDQorDQorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zdHJpbmcuaCINCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Z2UvZnhfZGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL3V0aWxzLmgiDQorDQorY2xhc3MgQ0JDX1dyaXRlciB7DQorIHB1YmxpYzoNCisgIENCQ19Xcml0ZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19Xcml0ZXIoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRDaGFyRW5jb2RpbmcoaW50MzJfdCBlbmNvZGluZyk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0TW9kdWxlSGVpZ2h0KGludDMyX3QgbW9kdWxlSGVpZ2h0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRNb2R1bGVXaWR0aChpbnQzMl90IG1vZHVsZVdpZHRoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRIZWlnaHQoaW50MzJfdCBoZWlnaHQpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldFdpZHRoKGludDMyX3Qgd2lkdGgpOw0KKyAgdmlydHVhbCB2b2lkIFNldEJhY2tncm91bmRDb2xvcihGWF9BUkdCIGJhY2tncm91bmRDb2xvcik7DQorICB2aXJ0dWFsIHZvaWQgU2V0QmFyY29kZUNvbG9yKEZYX0FSR0IgZm9yZWdyb3VuZENvbG9yKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX0RJQml0bWFwKiBDcmVhdGVESUJpdG1hcChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7DQorICBpbnQzMl90IG1fQ2hhckVuY29kaW5nOw0KKyAgaW50MzJfdCBtX01vZHVsZUhlaWdodDsNCisgIGludDMyX3QgbV9Nb2R1bGVXaWR0aDsNCisgIGludDMyX3QgbV9IZWlnaHQ7DQorICBpbnQzMl90IG1fV2lkdGg7DQorICBGWERJQl9Gb3JtYXQgbV9jb2xvclNwYWNlOw0KKyAgRlhfQVJHQiBtX2JhckNvbG9yOw0KKyAgRlhfQVJHQiBtX2JhY2tncm91bmRDb2xvcjsNCit9Ow0KKw0KKyNlbmRpZiAgLy8gWEZBX1NSQ19GWEJBUkNPREVfQkNfV1JJVEVSX0hfDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIGIveGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NzhmMmQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgKQEAgLTAsMCArMSwxMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisvLyBUT0RPKHRoZXN0aWcpOiBSZW1vdmUgdGhpcyBmaWxlIGFuZCBkbyBJV1lVLg0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInV0aWxzLmgiDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdEFycmF5LmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRBcnJheS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFiNGNlMwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRBcnJheS5jcHAKQEAgLTAsMCArMSwxMTIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJCQ19Db21tb25CaXRBcnJheS5oIg0KK0NCQ19Db21tb25CaXRBcnJheTo6Q0JDX0NvbW1vbkJpdEFycmF5KENCQ19Db21tb25CaXRBcnJheSogYXJyYXkpIHsNCisgIG1fc2l6ZSA9IGFycmF5LT5HZXRTaXplKCk7DQorICBtX2JpdHMuQ29weShhcnJheS0+R2V0Qml0cygpKTsNCit9DQorQ0JDX0NvbW1vbkJpdEFycmF5OjpDQkNfQ29tbW9uQml0QXJyYXkoKSB7DQorICBtX2JpdHMuU2V0U2l6ZSgxKTsNCisgIG1fc2l6ZSA9IDA7DQorfQ0KK0NCQ19Db21tb25CaXRBcnJheTo6Q0JDX0NvbW1vbkJpdEFycmF5KGludDMyX3Qgc2l6ZSkgew0KKyAgbV9iaXRzLlNldFNpemUoKHNpemUgKyAzMSkgPj4gNSk7DQorICBtX3NpemUgPSBzaXplOw0KK30NCitDQkNfQ29tbW9uQml0QXJyYXk6On5DQkNfQ29tbW9uQml0QXJyYXkoKSB7DQorICBtX3NpemUgPSAwOw0KK30NCitpbnQzMl90IENCQ19Db21tb25CaXRBcnJheTo6R2V0U2l6ZSgpIHsNCisgIHJldHVybiBtX3NpemU7DQorfQ0KK0NGWF9JbnQzMkFycmF5JiBDQkNfQ29tbW9uQml0QXJyYXk6OkdldEJpdHMoKSB7DQorICByZXR1cm4gbV9iaXRzOw0KK30NCitpbnQzMl90IENCQ19Db21tb25CaXRBcnJheTo6R2V0U2l6ZUluQnl0ZXMoKSB7DQorICByZXR1cm4gKG1fc2l6ZSArIDcpID4+IDM7DQorfQ0KK0ZYX0JPT0wgQ0JDX0NvbW1vbkJpdEFycmF5OjpHZXQoaW50MzJfdCBpKSB7DQorICByZXR1cm4gKG1fYml0c1tpID4+IDVdICYgKDEgPDwgKGkgJiAweDFmKSkpICE9IDA7DQorfQ0KK3ZvaWQgQ0JDX0NvbW1vbkJpdEFycmF5OjpTZXQoaW50MzJfdCBpKSB7DQorICBtX2JpdHNbaSA+PiA1XSB8PSAxIDw8IChpICYgMHgxRik7DQorfQ0KK3ZvaWQgQ0JDX0NvbW1vbkJpdEFycmF5OjpGbGlwKGludDMyX3QgaSkgew0KKyAgbV9iaXRzW2kgPj4gNV0gXj0gMSA8PCAoaSAmIDB4MUYpOw0KK30NCit2b2lkIENCQ19Db21tb25CaXRBcnJheTo6U2V0QnVsayhpbnQzMl90IGksIGludDMyX3QgbmV3Qml0cykgew0KKyAgbV9iaXRzW2kgPj4gNV0gPSBuZXdCaXRzOw0KK30NCit2b2lkIENCQ19Db21tb25CaXRBcnJheTo6Q2xlYXIoKSB7DQorICBGWFNZU19tZW1zZXQoJm1fYml0c1swXSwgMHgwMCwgbV9iaXRzLkdldFNpemUoKSAqIHNpemVvZihpbnQzMl90KSk7DQorfQ0KK0ZYX0JPT0wgQ0JDX0NvbW1vbkJpdEFycmF5OjpJc1JhbmdlKGludDMyX3Qgc3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlbmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCB2YWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoZW5kIDwgc3RhcnQpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uRW5kTGVzc1RoYW5TdGFydDsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGVuZCA9PSBzdGFydCkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIGVuZC0tOw0KKyAgaW50MzJfdCBmaXJzdEludCA9IHN0YXJ0ID4+IDU7DQorICBpbnQzMl90IGxhc3RJbnQgPSBlbmQgPj4gNTsNCisgIGludDMyX3QgaTsNCisgIGZvciAoaSA9IGZpcnN0SW50OyBpIDw9IGxhc3RJbnQ7IGkrKykgew0KKyAgICBpbnQzMl90IGZpcnN0Qml0ID0gaSA+IGZpcnN0SW50ID8gMCA6IHN0YXJ0ICYgMHgxRjsNCisgICAgaW50MzJfdCBsYXN0Qml0ID0gaSA8IGxhc3RJbnQgPyAzMSA6IGVuZCAmIDB4MUY7DQorICAgIGludDMyX3QgbWFzazsNCisgICAgaWYgKGZpcnN0Qml0ID09IDAgJiYgbGFzdEJpdCA9PSAzMSkgew0KKyAgICAgIG1hc2sgPSAtMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBtYXNrID0gMDsNCisgICAgICBmb3IgKGludDMyX3QgaiA9IGZpcnN0Qml0OyBqIDw9IGxhc3RCaXQ7IGorKykgew0KKyAgICAgICAgbWFzayB8PSAxIDw8IGo7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmICgobV9iaXRzW2ldICYgbWFzaykgIT0gKHZhbHVlID8gbWFzayA6IDApKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQoraW50MzJfdCogQ0JDX0NvbW1vbkJpdEFycmF5OjpHZXRCaXRBcnJheSgpIHsNCisgIHJldHVybiAmbV9iaXRzWzBdOw0KK30NCit2b2lkIENCQ19Db21tb25CaXRBcnJheTo6UmV2ZXJzZSgpIHsNCisgIGludDMyX3QqIG5ld0JpdHMgPSBGWF9BbGxvYyhpbnQzMl90LCBtX2JpdHMuR2V0U2l6ZSgpKTsNCisgIEZYU1lTX21lbXNldChuZXdCaXRzLCAweDAwLCBtX2JpdHMuR2V0U2l6ZSgpICogc2l6ZW9mKGludDMyX3QpKTsNCisgIGludDMyX3Qgc2l6ZSA9IG1fc2l6ZTsNCisgIGludDMyX3QgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsNCisgICAgaWYgKEdldChzaXplIC0gaSAtIDEpKSB7DQorICAgICAgbmV3Qml0c1tpID4+IDVdIHw9IDEgPDwgKGkgJiAweDFGKTsNCisgICAgfQ0KKyAgfQ0KKyAgRlhTWVNfbWVtY3B5KCZtX2JpdHNbMF0sIG5ld0JpdHMsIG1fYml0cy5HZXRTaXplKCkgKiBzaXplb2YoaW50MzJfdCkpOw0KKyAgRlhfRnJlZShuZXdCaXRzKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdEFycmF5LmggYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0QXJyYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDc1OGY3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdEFycmF5LmgKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19DT01NT05CSVRBUlJBWV9IXw0KKyNkZWZpbmUgX0JDX0NPTU1PTkJJVEFSUkFZX0hfDQorY2xhc3MgQ0JDX0NvbW1vbkJpdEFycmF5IHsNCisgcHVibGljOg0KKyAgQ0JDX0NvbW1vbkJpdEFycmF5KENCQ19Db21tb25CaXRBcnJheSogYXJyYXkpOw0KKyAgQ0JDX0NvbW1vbkJpdEFycmF5KGludDMyX3Qgc2l6ZSk7DQorICBDQkNfQ29tbW9uQml0QXJyYXkoKTsNCisgIHZpcnR1YWwgfkNCQ19Db21tb25CaXRBcnJheSgpOw0KKyAgaW50MzJfdCBHZXRTaXplKCk7DQorICBDRlhfSW50MzJBcnJheSYgR2V0Qml0cygpOw0KKyAgaW50MzJfdCBHZXRTaXplSW5CeXRlcygpOw0KKyAgRlhfQk9PTCBHZXQoaW50MzJfdCBpKTsNCisgIHZvaWQgU2V0KGludDMyX3QgaSk7DQorICB2b2lkIEZsaXAoaW50MzJfdCBpKTsNCisgIHZvaWQgU2V0QnVsayhpbnQzMl90IGksIGludDMyX3QgbmV3Qml0cyk7DQorICBGWF9CT09MIElzUmFuZ2UoaW50MzJfdCBzdGFydCwgaW50MzJfdCBlbmQsIEZYX0JPT0wgdmFsdWUsIGludDMyX3QmIGUpOw0KKyAgaW50MzJfdCogR2V0Qml0QXJyYXkoKTsNCisgIHZvaWQgUmV2ZXJzZSgpOw0KKyAgdm9pZCBDbGVhcigpOw0KKw0KKyBwcml2YXRlOg0KKyAgaW50MzJfdCBtX3NpemU7DQorICBDRlhfSW50MzJBcnJheSBtX2JpdHM7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NWUyOGMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmNwcApAQCAtMCwwICsxLDE0OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgIkJDX0NvbW1vbkJpdEFycmF5LmgiDQorI2luY2x1ZGUgIkJDX0NvbW1vbkJpdE1hdHJpeC5oIg0KK0NCQ19Db21tb25CaXRNYXRyaXg6OkNCQ19Db21tb25CaXRNYXRyaXgoKSB7DQorICBtX3dpZHRoID0gMDsNCisgIG1faGVpZ2h0ID0gMDsNCisgIG1fcm93U2l6ZSA9IDA7DQorICBtX2JpdHMgPSBOVUxMOw0KK30NCit2b2lkIENCQ19Db21tb25CaXRNYXRyaXg6OkluaXQoaW50MzJfdCBkaW1lbnNpb24pIHsNCisgIG1fd2lkdGggPSBkaW1lbnNpb247DQorICBtX2hlaWdodCA9IGRpbWVuc2lvbjsNCisgIGludDMyX3Qgcm93U2l6ZSA9IChtX2hlaWdodCArIDMxKSA+PiA1Ow0KKyAgbV9yb3dTaXplID0gcm93U2l6ZTsNCisgIG1fYml0cyA9IEZYX0FsbG9jMkQoaW50MzJfdCwgbV9yb3dTaXplLCBtX2hlaWdodCk7DQorICBGWFNZU19tZW1zZXQobV9iaXRzLCAwLCBtX3Jvd1NpemUgKiBtX2hlaWdodCAqIHNpemVvZihpbnQzMl90KSk7DQorfQ0KK3ZvaWQgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6SW5pdChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgew0KKyAgbV93aWR0aCA9IHdpZHRoOw0KKyAgbV9oZWlnaHQgPSBoZWlnaHQ7DQorICBpbnQzMl90IHJvd1NpemUgPSAod2lkdGggKyAzMSkgPj4gNTsNCisgIG1fcm93U2l6ZSA9IHJvd1NpemU7DQorICBtX2JpdHMgPSBGWF9BbGxvYzJEKGludDMyX3QsIG1fcm93U2l6ZSwgbV9oZWlnaHQpOw0KKyAgRlhTWVNfbWVtc2V0KG1fYml0cywgMCwgbV9yb3dTaXplICogbV9oZWlnaHQgKiBzaXplb2YoaW50MzJfdCkpOw0KK30NCitDQkNfQ29tbW9uQml0TWF0cml4Ojp+Q0JDX0NvbW1vbkJpdE1hdHJpeCgpIHsNCisgIGlmIChtX2JpdHMgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKG1fYml0cyk7DQorICB9DQorICBtX2JpdHMgPSBOVUxMOw0KKyAgbV9oZWlnaHQgPSBtX3dpZHRoID0gbV9yb3dTaXplID0gMDsNCit9DQorRlhfQk9PTCBDQkNfQ29tbW9uQml0TWF0cml4OjpHZXQoaW50MzJfdCB4LCBpbnQzMl90IHkpIHsNCisgIGludDMyX3Qgb2Zmc2V0ID0geSAqIG1fcm93U2l6ZSArICh4ID4+IDUpOw0KKyAgaWYgKG9mZnNldCA+PSBtX3Jvd1NpemUgKiBtX2hlaWdodCB8fCBvZmZzZXQgPCAwKSB7DQorICAgIHJldHVybiBmYWxzZTsNCisgIH0NCisgIHJldHVybiAoKCgoRlhfRFdPUkQpbV9iaXRzW29mZnNldF0pID4+ICh4ICYgMHgxZikpICYgMSkgIT0gMDsNCit9DQoraW50MzJfdCogQ0JDX0NvbW1vbkJpdE1hdHJpeDo6R2V0Qml0cygpIHsNCisgIHJldHVybiBtX2JpdHM7DQorfQ0KK3ZvaWQgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6U2V0KGludDMyX3QgeCwgaW50MzJfdCB5KSB7DQorICBpbnQzMl90IG9mZnNldCA9IHkgKiBtX3Jvd1NpemUgKyAoeCA+PiA1KTsNCisgIGlmIChvZmZzZXQgPj0gbV9yb3dTaXplICogbV9oZWlnaHQgfHwgb2Zmc2V0IDwgMCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBtX2JpdHNbb2Zmc2V0XSB8PSAxIDw8ICh4ICYgMHgxZik7DQorfQ0KK3ZvaWQgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6RmxpcChpbnQzMl90IHgsIGludDMyX3QgeSkgew0KKyAgaW50MzJfdCBvZmZzZXQgPSB5ICogbV9yb3dTaXplICsgKHggPj4gNSk7DQorICBtX2JpdHNbb2Zmc2V0XSBePSAxIDw8ICh4ICYgMHgxZik7DQorfQ0KK3ZvaWQgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6Q2xlYXIoKSB7DQorICBGWFNZU19tZW1zZXQobV9iaXRzLCAwLCBtX3Jvd1NpemUgKiBtX2hlaWdodCAqIHNpemVvZihpbnQzMl90KSk7DQorfQ0KK3ZvaWQgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6U2V0UmVnaW9uKGludDMyX3QgbGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmICh0b3AgPCAwIHx8IGxlZnQgPCAwKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkxlZnRBbmRUb3BNdXN0QmVOb25uZWdhdGl2ZTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKGhlaWdodCA8IDEgfHwgd2lkdGggPCAxKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkhlaWdodEFuZFdpZHRoTXVzdEJlQXRMZWFzdDE7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgcmlnaHQgPSBsZWZ0ICsgd2lkdGg7DQorICBpbnQzMl90IGJvdHRvbSA9IHRvcCArIGhlaWdodDsNCisgIGlmIChtX2hlaWdodCA8IGJvdHRvbSB8fCBtX3dpZHRoIDwgcmlnaHQpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uUmVnaW9uTXVzdEZpdEluc2lkZU1hdHJpeDsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCB5Ow0KKyAgZm9yICh5ID0gdG9wOyB5IDwgYm90dG9tOyB5KyspIHsNCisgICAgaW50MzJfdCBvZmZzZXQgPSB5ICogbV9yb3dTaXplOw0KKyAgICBpbnQzMl90IHg7DQorICAgIGZvciAoeCA9IGxlZnQ7IHggPCByaWdodDsgeCsrKSB7DQorICAgICAgbV9iaXRzW29mZnNldCArICh4ID4+IDUpXSB8PSAxIDw8ICh4ICYgMHgxZik7DQorICAgIH0NCisgIH0NCit9DQorQ0JDX0NvbW1vbkJpdEFycmF5KiBDQkNfQ29tbW9uQml0TWF0cml4OjpHZXRSb3coaW50MzJfdCB5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CaXRBcnJheSogcm93KSB7DQorICBDQkNfQ29tbW9uQml0QXJyYXkqIHJvd0FycmF5ID0gTlVMTDsNCisgIGlmIChyb3cgPT0gTlVMTCB8fCByb3ctPkdldFNpemUoKSA8IG1fd2lkdGgpIHsNCisgICAgcm93QXJyYXkgPSBuZXcgQ0JDX0NvbW1vbkJpdEFycmF5KG1fd2lkdGgpOw0KKyAgfSBlbHNlIHsNCisgICAgcm93QXJyYXkgPSBuZXcgQ0JDX0NvbW1vbkJpdEFycmF5KHJvdyk7DQorICB9DQorICBpbnQzMl90IG9mZnNldCA9IHkgKiBtX3Jvd1NpemU7DQorICBpbnQzMl90IHg7DQorICBmb3IgKHggPSAwOyB4IDwgbV9yb3dTaXplOyB4KyspIHsNCisgICAgcm93QXJyYXktPlNldEJ1bGsoeCA8PCA1LCBtX2JpdHNbb2Zmc2V0ICsgeF0pOw0KKyAgfQ0KKyAgcmV0dXJuIHJvd0FycmF5Ow0KK30NCit2b2lkIENCQ19Db21tb25CaXRNYXRyaXg6OlNldFJvdyhpbnQzMl90IHksIENCQ19Db21tb25CaXRBcnJheSogcm93KSB7DQorICBpbnQzMl90IGwgPSB5ICogbV9yb3dTaXplOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbV9yb3dTaXplOyBpKyspIHsNCisgICAgbV9iaXRzW2xdID0gcm93LT5HZXRCaXRBcnJheSgpW2ldOw0KKyAgICBsKys7DQorICB9DQorfQ0KK3ZvaWQgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6U2V0Q29sKGludDMyX3QgeSwgQ0JDX0NvbW1vbkJpdEFycmF5KiBjb2wpIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvbC0+R2V0Qml0cygpLkdldFNpemUoKTsgaSsrKSB7DQorICAgIG1fYml0c1tpICogbV9yb3dTaXplICsgeV0gPSBjb2wtPkdldEJpdEFycmF5KClbaV07DQorICB9DQorfQ0KK2ludDMyX3QgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6R2V0V2lkdGgoKSB7DQorICByZXR1cm4gbV93aWR0aDsNCit9DQoraW50MzJfdCBDQkNfQ29tbW9uQml0TWF0cml4OjpHZXRIZWlnaHQoKSB7DQorICByZXR1cm4gbV9oZWlnaHQ7DQorfQ0KK2ludDMyX3QgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6R2V0Um93U2l6ZSgpIHsNCisgIHJldHVybiBtX3Jvd1NpemU7DQorfQ0KK2ludDMyX3QgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6R2V0RGltZW5zaW9uKGludDMyX3QmIGUpIHsNCisgIGlmIChtX3dpZHRoICE9IG1faGVpZ2h0KSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkNhbk5vdENhbGxHZXREaW1lbnNpb25Pbk5vblNxdWFyZU1hdHJpeDsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICByZXR1cm4gbV93aWR0aDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyY2JlZGYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19DT01NT05CSVRNQVRSSVhfSF8NCisjZGVmaW5lIF9CQ19DT01NT05CSVRNQVRSSVhfSF8NCitjbGFzcyBDQkNfQ29tbW9uQml0QXJyYXk7DQorY2xhc3MgQ0JDX0NvbW1vbkJpdE1hdHJpeCB7DQorIHB1YmxpYzoNCisgIENCQ19Db21tb25CaXRNYXRyaXgoKTsNCisgIHZpcnR1YWwgfkNCQ19Db21tb25CaXRNYXRyaXgoKTsNCisgIEZYX0JPT0wgR2V0KGludDMyX3QgeCwgaW50MzJfdCB5KTsNCisgIHZvaWQgU2V0KGludDMyX3QgeCwgaW50MzJfdCB5KTsNCisgIHZvaWQgRmxpcChpbnQzMl90IHgsIGludDMyX3QgeSk7DQorICB2b2lkIENsZWFyKCk7DQorICB2b2lkIFNldFJlZ2lvbihpbnQzMl90IGxlZnQsDQorICAgICAgICAgICAgICAgICBpbnQzMl90IHRvcCwNCisgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsDQorICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwNCisgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgQ0JDX0NvbW1vbkJpdEFycmF5KiBHZXRSb3coaW50MzJfdCB5LCBDQkNfQ29tbW9uQml0QXJyYXkqIHJvdyk7DQorICB2b2lkIFNldFJvdyhpbnQzMl90IHksIENCQ19Db21tb25CaXRBcnJheSogcm93KTsNCisgIENCQ19Db21tb25CaXRBcnJheSogR2V0Q29sKGludDMyX3QgeSwgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3cpOw0KKyAgdm9pZCBTZXRDb2woaW50MzJfdCB5LCBDQkNfQ29tbW9uQml0QXJyYXkqIGNvbCk7DQorICBpbnQzMl90IEdldFdpZHRoKCk7DQorICBpbnQzMl90IEdldEhlaWdodCgpOw0KKyAgaW50MzJfdCBHZXRSb3dTaXplKCk7DQorICBpbnQzMl90IEdldERpbWVuc2lvbihpbnQzMl90JiBlKTsNCisgIHZpcnR1YWwgdm9pZCBJbml0KGludDMyX3QgZGltZW5zaW9uKTsNCisgIHZpcnR1YWwgdm9pZCBJbml0KGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsNCisgIGludDMyX3QqIEdldEJpdHMoKTsNCisNCisgcHJpdmF0ZToNCisgIGludDMyX3QgbV93aWR0aDsNCisgIGludDMyX3QgbV9oZWlnaHQ7DQorICBpbnQzMl90IG1fcm93U2l6ZTsNCisgIGludDMyX3QqIG1fYml0czsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRTb3VyY2UuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdFNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMwODYzOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRTb3VyY2UuY3BwCkBAIC0wLDAgKzEsNzEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJCQ19Db21tb25CaXRTb3VyY2UuaCINCitDQkNfQ29tbW9uQml0U291cmNlOjpDQkNfQ29tbW9uQml0U291cmNlKENGWF9CeXRlQXJyYXkqIGJ5dGVzKSB7DQorICBtX2J5dGVzLkNvcHkoKCpieXRlcykpOw0KKyAgbV9iaXRPZmZzZXQgPSAwOw0KKyAgbV9ieXRlT2Zmc2V0ID0gMDsNCit9DQorQ0JDX0NvbW1vbkJpdFNvdXJjZTo6fkNCQ19Db21tb25CaXRTb3VyY2UoKSB7fQ0KK2ludDMyX3QgQ0JDX0NvbW1vbkJpdFNvdXJjZTo6UmVhZEJpdHMoaW50MzJfdCBudW1CaXRzLCBpbnQzMl90JiBlKSB7DQorICBpZiAobnVtQml0cyA8IDEgfHwgbnVtQml0cyA+IDMyKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpbnQzMl90IHJlc3VsdCA9IDA7DQorICBpZiAobV9iaXRPZmZzZXQgPiAwKSB7DQorICAgIGludDMyX3QgYml0c0xlZnQgPSA4IC0gbV9iaXRPZmZzZXQ7DQorICAgIGludDMyX3QgdG9SZWFkID0gbnVtQml0cyA8IGJpdHNMZWZ0ID8gbnVtQml0cyA6IGJpdHNMZWZ0Ow0KKyAgICBpbnQzMl90IGJpdHNUb05vdFJlYWQgPSBiaXRzTGVmdCAtIHRvUmVhZDsNCisgICAgaW50MzJfdCBtYXNrID0gKDB4ZmYgPj4gKDggLSB0b1JlYWQpKSA8PCBiaXRzVG9Ob3RSZWFkOw0KKyAgICByZXN1bHQgPSAobV9ieXRlc1ttX2J5dGVPZmZzZXRdICYgbWFzaykgPj4gYml0c1RvTm90UmVhZDsNCisgICAgbnVtQml0cyAtPSB0b1JlYWQ7DQorICAgIG1fYml0T2Zmc2V0ICs9IHRvUmVhZDsNCisgICAgaWYgKG1fYml0T2Zmc2V0ID09IDgpIHsNCisgICAgICBtX2JpdE9mZnNldCA9IDA7DQorICAgICAgbV9ieXRlT2Zmc2V0Kys7DQorICAgIH0NCisgIH0NCisgIGlmIChudW1CaXRzID4gMCkgew0KKyAgICB3aGlsZSAobnVtQml0cyA+PSA4KSB7DQorICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8PCA4KSB8IChtX2J5dGVzW21fYnl0ZU9mZnNldF0gJiAweGZmKTsNCisgICAgICBtX2J5dGVPZmZzZXQrKzsNCisgICAgICBudW1CaXRzIC09IDg7DQorICAgIH0NCisgICAgaWYgKG51bUJpdHMgPiAwKSB7DQorICAgICAgaW50MzJfdCBiaXRzVG9Ob3RSZWFkID0gOCAtIG51bUJpdHM7DQorICAgICAgaW50MzJfdCBtYXNrID0gKDB4ZmYgPj4gYml0c1RvTm90UmVhZCkgPDwgYml0c1RvTm90UmVhZDsNCisgICAgICByZXN1bHQgPSAocmVzdWx0IDw8IG51bUJpdHMpIHwNCisgICAgICAgICAgICAgICAoKG1fYnl0ZXNbbV9ieXRlT2Zmc2V0XSAmIG1hc2spID4+IGJpdHNUb05vdFJlYWQpOw0KKyAgICAgIG1fYml0T2Zmc2V0ICs9IG51bUJpdHM7DQorICAgIH0NCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQorfQ0KK2ludDMyX3QgQ0JDX0NvbW1vbkJpdFNvdXJjZTo6QXZhaWxhYmxlKCkgew0KKyAgcmV0dXJuIDggKiAobV9ieXRlcy5HZXRTaXplKCkgLSBtX2J5dGVPZmZzZXQpIC0gbV9iaXRPZmZzZXQ7DQorfQ0KK2ludDMyX3QgQ0JDX0NvbW1vbkJpdFNvdXJjZTo6Z2V0Qnl0ZU9mZnNldCgpIHsNCisgIHJldHVybiBtX2J5dGVPZmZzZXQ7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRTb3VyY2UuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2I2NmJmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdFNvdXJjZS5oCkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfQ09NTU9OQklUU09VUkNFX0hfDQorI2RlZmluZSBfQkNfQ09NTU9OQklUU09VUkNFX0hfDQorY2xhc3MgQ0JDX0NvbW1vbkJpdFNvdXJjZSB7DQorIHB1YmxpYzoNCisgIENCQ19Db21tb25CaXRTb3VyY2UoQ0ZYX0J5dGVBcnJheSogYnl0ZXMpOw0KKyAgdmlydHVhbCB+Q0JDX0NvbW1vbkJpdFNvdXJjZSgpOw0KKyAgaW50MzJfdCBSZWFkQml0cyhpbnQzMl90IG51bUJpdHMsIGludDMyX3QmIGUpOw0KKyAgaW50MzJfdCBBdmFpbGFibGUoKTsNCisgIGludDMyX3QgZ2V0Qnl0ZU9mZnNldCgpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0ZYX0J5dGVBcnJheSBtX2J5dGVzOw0KKyAgaW50MzJfdCBtX2J5dGVPZmZzZXQ7DQorICBpbnQzMl90IG1fYml0T2Zmc2V0Ow0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVBcnJheS5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZUFycmF5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzZmZjM0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVBcnJheS5jcHAKQEAgLTAsMCArMSwxMDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDggWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSA8YWxnb3JpdGhtPg0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgIkJDX0NvbW1vbkJ5dGVBcnJheS5oIg0KK0NCQ19Db21tb25CeXRlQXJyYXk6OkNCQ19Db21tb25CeXRlQXJyYXkoKSB7DQorICBtX2J5dGVzID0gTlVMTDsNCisgIG1fc2l6ZSA9IDA7DQorICBtX2luZGV4ID0gMDsNCit9DQorQ0JDX0NvbW1vbkJ5dGVBcnJheTo6Q0JDX0NvbW1vbkJ5dGVBcnJheShpbnQzMl90IHNpemUpIHsNCisgIG1fc2l6ZSA9IHNpemU7DQorICBtX2J5dGVzID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7DQorICBGWFNZU19tZW1zZXQobV9ieXRlcywgMCwgc2l6ZSk7DQorICBtX2luZGV4ID0gMDsNCit9DQorQ0JDX0NvbW1vbkJ5dGVBcnJheTo6Q0JDX0NvbW1vbkJ5dGVBcnJheSh1aW50OF90KiBieXRlQXJyYXksIGludDMyX3Qgc2l6ZSkgew0KKyAgbV9zaXplID0gc2l6ZTsNCisgIG1fYnl0ZXMgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsNCisgIEZYU1lTX21lbWNweShtX2J5dGVzLCBieXRlQXJyYXksIHNpemUpOw0KKyAgbV9pbmRleCA9IHNpemU7DQorfQ0KK0NCQ19Db21tb25CeXRlQXJyYXk6On5DQkNfQ29tbW9uQnl0ZUFycmF5KCkgew0KKyAgaWYgKG1fYnl0ZXMgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKG1fYnl0ZXMpOw0KKyAgICBtX2J5dGVzID0gTlVMTDsNCisgIH0NCisgIG1faW5kZXggPSAwOw0KKyAgbV9zaXplID0gMDsNCit9DQoraW50MzJfdCBDQkNfQ29tbW9uQnl0ZUFycmF5OjpBdChpbnQzMl90IGluZGV4KSB7DQorICByZXR1cm4gbV9ieXRlc1tpbmRleF0gJiAweGZmOw0KK30NCit2b2lkIENCQ19Db21tb25CeXRlQXJyYXk6OlNldChpbnQzMl90IGluZGV4LCBpbnQzMl90IHZhbHVlKSB7DQorICBtX2J5dGVzW2luZGV4XSA9ICh1aW50OF90KXZhbHVlOw0KK30NCitpbnQzMl90IENCQ19Db21tb25CeXRlQXJyYXk6OlNpemUoKSB7DQorICByZXR1cm4gbV9zaXplOw0KK30NCitGWF9CT09MIENCQ19Db21tb25CeXRlQXJyYXk6OklzRW1wdHkoKSB7DQorICByZXR1cm4gbV9zaXplID09IDA7DQorfQ0KK3ZvaWQgQ0JDX0NvbW1vbkJ5dGVBcnJheTo6QXBwZW5kQnl0ZShpbnQzMl90IHZhbHVlKSB7DQorICBpZiAobV9zaXplID09IDAgfHwgbV9pbmRleCA+PSBtX3NpemUpIHsNCisgICAgaW50MzJfdCBuZXdTaXplID0gc3RkOjptYXgoMzIsIG1fc2l6ZSA8PCAxKTsNCisgICAgUmVzZXJ2ZShuZXdTaXplKTsNCisgIH0NCisgIG1fYnl0ZXNbbV9pbmRleF0gPSAodWludDhfdCl2YWx1ZTsNCisgIG1faW5kZXgrKzsNCit9DQordm9pZCBDQkNfQ29tbW9uQnl0ZUFycmF5OjpSZXNlcnZlKGludDMyX3QgY2FwYWNpdHkpIHsNCisgIGlmIChtX2J5dGVzID09IE5VTEwgfHwgbV9zaXplIDwgY2FwYWNpdHkpIHsNCisgICAgdWludDhfdCogbmV3QXJyYXkgPSBGWF9BbGxvYyh1aW50OF90LCBjYXBhY2l0eSk7DQorICAgIEZYU1lTX21lbXNldChuZXdBcnJheSwgMCwgY2FwYWNpdHkpOw0KKyAgICBpZiAobV9ieXRlcyAhPSBOVUxMKSB7DQorICAgICAgRlhTWVNfbWVtY3B5KG5ld0FycmF5LCBtX2J5dGVzLCBtX3NpemUpOw0KKyAgICAgIEZYX0ZyZWUobV9ieXRlcyk7DQorICAgIH0NCisgICAgbV9ieXRlcyA9IG5ld0FycmF5Ow0KKyAgICBtX3NpemUgPSBjYXBhY2l0eTsNCisgIH0NCit9DQordm9pZCBDQkNfQ29tbW9uQnl0ZUFycmF5OjpTZXQodWludDhfdCogc291cmNlLCBpbnQzMl90IG9mZnNldCwgaW50MzJfdCBjb3VudCkgew0KKyAgaWYgKG1fYnl0ZXMgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKG1fYnl0ZXMpOw0KKyAgfQ0KKyAgbV9ieXRlcyA9IEZYX0FsbG9jKHVpbnQ4X3QsIGNvdW50KTsNCisgIG1fc2l6ZSA9IGNvdW50Ow0KKyAgRlhTWVNfbWVtY3B5KG1fYnl0ZXMsIHNvdXJjZSArIG9mZnNldCwgY291bnQpOw0KKyAgbV9pbmRleCA9IGNvdW50Ow0KK30NCit2b2lkIENCQ19Db21tb25CeXRlQXJyYXk6OlNldChDRlhfQnl0ZUFycmF5KiBzb3VyY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb3VudCkgew0KKyAgaWYgKG1fYnl0ZXMgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKG1fYnl0ZXMpOw0KKyAgfQ0KKyAgbV9ieXRlcyA9IEZYX0FsbG9jKHVpbnQ4X3QsIGNvdW50KTsNCisgIG1fc2l6ZSA9IGNvdW50Ow0KKyAgaW50MzJfdCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsNCisgICAgbV9ieXRlc1tpXSA9IHNvdXJjZS0+b3BlcmF0b3JbXShpICsgb2Zmc2V0KTsNCisgIH0NCisgIG1faW5kZXggPSBtX3NpemU7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CeXRlQXJyYXkuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CeXRlQXJyYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmUyMTRjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVBcnJheS5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfQ09NTU9OQllURUFSUkFZX0hfDQorI2RlZmluZSBfQkNfQ09NTU9OQllURUFSUkFZX0hfDQorY2xhc3MgQ0JDX0NvbW1vbkJ5dGVBcnJheSB7DQorIHByaXZhdGU6DQorICBpbnQzMl90IG1fc2l6ZTsNCisgIGludDMyX3QgbV9pbmRleDsNCisgIHVpbnQ4X3QqIG1fYnl0ZXM7DQorDQorIHB1YmxpYzoNCisgIENCQ19Db21tb25CeXRlQXJyYXkoKTsNCisgIENCQ19Db21tb25CeXRlQXJyYXkoaW50MzJfdCBzaXplKTsNCisgIENCQ19Db21tb25CeXRlQXJyYXkodWludDhfdCogYnl0ZUFycmF5LCBpbnQzMl90IHNpemUpOw0KKyAgdmlydHVhbCB+Q0JDX0NvbW1vbkJ5dGVBcnJheSgpOw0KKyAgaW50MzJfdCBBdChpbnQzMl90IGluZGV4KTsNCisgIHZvaWQgU2V0KGludDMyX3QgaW5kZXgsIGludDMyX3QgdmFsdWUpOw0KKyAgaW50MzJfdCBTaXplKCk7DQorICBGWF9CT09MIElzRW1wdHkoKTsNCisgIHZvaWQgQXBwZW5kQnl0ZShpbnQzMl90IHZhbHVlKTsNCisgIHZvaWQgUmVzZXJ2ZShpbnQzMl90IGNhcGFjaXR5KTsNCisgIHZvaWQgU2V0KHVpbnQ4X3QqIHNvdXJjZSwgaW50MzJfdCBvZmZzZXQsIGludDMyX3QgY291bnQpOw0KKyAgdm9pZCBTZXQoQ0ZYX0J5dGVBcnJheSogc291cmNlLCBpbnQzMl90IG9mZnNldCwgaW50MzJfdCBjb3VudCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZU1hdHJpeC5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZU1hdHJpeC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc1YjgwMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CeXRlTWF0cml4LmNwcApAQCAtMCwwICsxLDY2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDA4IFpYaW5nIGF1dGhvcnMNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAiQkNfQ29tbW9uQnl0ZU1hdHJpeC5oIg0KK0NCQ19Db21tb25CeXRlTWF0cml4OjpDQkNfQ29tbW9uQnl0ZU1hdHJpeChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgew0KKyAgbV9oZWlnaHQgPSBoZWlnaHQ7DQorICBtX3dpZHRoID0gd2lkdGg7DQorICBtX2J5dGVzID0gTlVMTDsNCit9DQordm9pZCBDQkNfQ29tbW9uQnl0ZU1hdHJpeDo6SW5pdCgpIHsNCisgIG1fYnl0ZXMgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIG1faGVpZ2h0LCBtX3dpZHRoKTsNCisgIEZYU1lTX21lbXNldChtX2J5dGVzLCAweGZmLCBtX2hlaWdodCAqIG1fd2lkdGgpOw0KK30NCitDQkNfQ29tbW9uQnl0ZU1hdHJpeDo6fkNCQ19Db21tb25CeXRlTWF0cml4KCkgew0KKyAgaWYgKG1fYnl0ZXMgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKG1fYnl0ZXMpOw0KKyAgICBtX2J5dGVzID0gTlVMTDsNCisgIH0NCit9DQoraW50MzJfdCBDQkNfQ29tbW9uQnl0ZU1hdHJpeDo6R2V0SGVpZ2h0KCkgew0KKyAgcmV0dXJuIG1faGVpZ2h0Ow0KK30NCitpbnQzMl90IENCQ19Db21tb25CeXRlTWF0cml4OjpHZXRXaWR0aCgpIHsNCisgIHJldHVybiBtX3dpZHRoOw0KK30NCit1aW50OF90IENCQ19Db21tb25CeXRlTWF0cml4OjpHZXQoaW50MzJfdCB4LCBpbnQzMl90IHkpIHsNCisgIHJldHVybiBtX2J5dGVzW3kgKiBtX3dpZHRoICsgeF07DQorfQ0KK3ZvaWQgQ0JDX0NvbW1vbkJ5dGVNYXRyaXg6OlNldChpbnQzMl90IHgsIGludDMyX3QgeSwgaW50MzJfdCB2YWx1ZSkgew0KKyAgbV9ieXRlc1t5ICogbV93aWR0aCArIHhdID0gKHVpbnQ4X3QpdmFsdWU7DQorfQ0KK3ZvaWQgQ0JDX0NvbW1vbkJ5dGVNYXRyaXg6OlNldChpbnQzMl90IHgsIGludDMyX3QgeSwgdWludDhfdCB2YWx1ZSkgew0KKyAgbV9ieXRlc1t5ICogbV93aWR0aCArIHhdID0gdmFsdWU7DQorfQ0KK3ZvaWQgQ0JDX0NvbW1vbkJ5dGVNYXRyaXg6OmNsZWFyKHVpbnQ4X3QgdmFsdWUpIHsNCisgIGludDMyX3QgeTsNCisgIGZvciAoeSA9IDA7IHkgPCBtX2hlaWdodDsgeSsrKSB7DQorICAgIGludDMyX3QgeDsNCisgICAgZm9yICh4ID0gMDsgeCA8IG1fd2lkdGg7IHgrKykgew0KKyAgICAgIG1fYnl0ZXNbeSAqIG1fd2lkdGggKyB4XSA9IHZhbHVlOw0KKyAgICB9DQorICB9DQorfQ0KK3VpbnQ4X3QqIENCQ19Db21tb25CeXRlTWF0cml4OjpHZXRBcnJheSgpIHsNCisgIHJldHVybiBtX2J5dGVzOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZU1hdHJpeC5oIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVNYXRyaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTRkYWY4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVNYXRyaXguaApAQCAtMCwwICsxLDI4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0NPTU1PTkJZVEVNQVRSSVhfSF8NCisjZGVmaW5lIF9CQ19DT01NT05CWVRFTUFUUklYX0hfDQorY2xhc3MgQ0JDX0NvbW1vbkJ5dGVNYXRyaXggew0KKyBwdWJsaWM6DQorICBDQkNfQ29tbW9uQnl0ZU1hdHJpeChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7DQorICB2aXJ0dWFsIH5DQkNfQ29tbW9uQnl0ZU1hdHJpeCgpOw0KKyAgaW50MzJfdCBHZXRIZWlnaHQoKTsNCisgIGludDMyX3QgR2V0V2lkdGgoKTsNCisgIHVpbnQ4X3QgR2V0KGludDMyX3QgeCwgaW50MzJfdCB5KTsNCisgIHVpbnQ4X3QqIEdldEFycmF5KCk7DQorDQorICB2b2lkIFNldChpbnQzMl90IHgsIGludDMyX3QgeSwgaW50MzJfdCB2YWx1ZSk7DQorICB2b2lkIFNldChpbnQzMl90IHgsIGludDMyX3QgeSwgdWludDhfdCB2YWx1ZSk7DQorICB2b2lkIGNsZWFyKHVpbnQ4X3QgdmFsdWUpOw0KKyAgdmlydHVhbCB2b2lkIEluaXQoKTsNCisNCisgcHJpdmF0ZToNCisgIHVpbnQ4X3QqIG1fYnl0ZXM7DQorICBpbnQzMl90IG1fd2lkdGg7DQorICBpbnQzMl90IG1faGVpZ2h0Ow0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSS5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmViODUwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSS5jcHAKQEAgLTAsMCArMSw0NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwOCBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgIkJDX0NvbW1vbkVDSS5oIg0KKyNpbmNsdWRlICJCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0kuaCINCit2b2lkIENCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0k6OmluaXRpYWxpemUoKSB7fQ0KK0NCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0k6OkNCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0koDQorICAgIGludDMyX3QgdmFsdWUsDQorICAgIENGWF9CeXRlU3RyaW5nIGVuY29kaW5nTmFtZSkNCisgICAgOiBDQkNfQ29tbW9uRUNJKHZhbHVlKSwgbV9lbmNvZGluZ05hbWUoZW5jb2RpbmdOYW1lKSB7fQ0KK0NCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0k6On5DQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJKCkge30NCitDRlhfQnl0ZVN0cmluZyBDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJOjpHZXRFbmNvZGluZ05hbWUoKSB7DQorICByZXR1cm4gbV9lbmNvZGluZ05hbWU7DQorfQ0KK3ZvaWQgQ0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSTo6QWRkQ2hhcmFjdGVyU2V0KGludDMyX3QgdmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RpbmdOYW1lKSB7fQ0KK0NCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0kqIENCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0k6OkdldENoYXJhY3RlclNldEVDSUJ5VmFsdWUoDQorICAgIGludDMyX3QgdmFsdWUpIHsNCisgIHJldHVybiBOVUxMOw0KK30NCitDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJKiBDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJOjpHZXRDaGFyYWN0ZXJTZXRFQ0lCeU5hbWUoDQorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKSB7DQorICByZXR1cm4gTlVMTDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSS5oIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZGM0ZDYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJLmgKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19DT01NT05DSEFSQUNURVJTRVRFQ0lfSF8NCisjZGVmaW5lIF9CQ19DT01NT05DSEFSQUNURVJTRVRFQ0lfSF8NCitjbGFzcyBDQkNfQ29tbW9uRUNJOw0KK2NsYXNzIENCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0k7DQorY2xhc3MgQ0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSSA6IHB1YmxpYyBDQkNfQ29tbW9uRUNJIHsNCisgcHVibGljOg0KKyAgQ0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSShpbnQzMl90IHZhbHVlLCBDRlhfQnl0ZVN0cmluZyBlbmNvZGluZ05hbWUpOw0KKyAgdmlydHVhbCB+Q0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSSgpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgR2V0RW5jb2RpbmdOYW1lKCk7DQorICBzdGF0aWMgdm9pZCBBZGRDaGFyYWN0ZXJTZXQoaW50MzJfdCB2YWx1ZSwgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RpbmdOYW1lKTsNCisgIGludDMyX3QgR2V0VmFsdWUoKTsNCisgIHN0YXRpYyBDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJKiBHZXRDaGFyYWN0ZXJTZXRFQ0lCeVZhbHVlKGludDMyX3QgdmFsdWUpOw0KKyAgc3RhdGljIENCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0kqIEdldENoYXJhY3RlclNldEVDSUJ5TmFtZSgNCisgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSk7DQorDQorIHByaXZhdGU6DQorICBDRlhfQnl0ZVN0cmluZyBtX2VuY29kaW5nTmFtZTsNCisgIHN0YXRpYyB2b2lkIGluaXRpYWxpemUoKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25EZWNvZGVyUmVzdWx0LmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25EZWNvZGVyUmVzdWx0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmY5ZjU3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkRlY29kZXJSZXN1bHQuY3BwCkBAIC0wLDAgKzEsNzcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdSZXN1bHRNZXRhZGF0YS5oIg0KKyNpbmNsdWRlICJCQ19Db21tb25EZWNvZGVyUmVzdWx0LmgiDQorQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQ6OkNCQ19Db21tb25EZWNvZGVyUmVzdWx0KCkge30NCit2b2lkIENCQ19Db21tb25EZWNvZGVyUmVzdWx0OjpJbml0KGNvbnN0IENGWF9CeXRlQXJyYXkmIHJhd0J5dGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfSW50MzJBcnJheSYgYnl0ZVNlZ21lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmICh0ZXh0LklzRW1wdHkoKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQorICAgIHJldHVybjsNCisgIH0NCisgIG1fcmF3Qnl0ZXMuQ29weShyYXdCeXRlcyk7DQorICBtX3RleHQgPSB0ZXh0Ow0KKyAgbV9ieXRlU2VnbWVudHMuQ29weShieXRlU2VnbWVudHMpOw0KKyAgbV9lY0xldmVsID0gZWNMZXZlbDsNCisgIG1fb3RoZXIgPSBOVUxMOw0KK30NCit2b2lkIENCQ19Db21tb25EZWNvZGVyUmVzdWx0OjpJbml0KGNvbnN0IENGWF9CeXRlQXJyYXkmIHJhd0J5dGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUHRyQXJyYXkmIGJ5dGVTZWdtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKHRleHQuSXNFbXB0eSgpKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV9yYXdCeXRlcy5Db3B5KHJhd0J5dGVzKTsNCisgIG1fdGV4dCA9IHRleHQ7DQorICBtX3BkZjQxN2J5dGVTZWdtZW50cy5Db3B5KGJ5dGVTZWdtZW50cyk7DQorICBtX3BkZjQxN2VjTGV2ZWwgPSBlY0xldmVsOw0KKyAgbV9vdGhlciA9IE5VTEw7DQorfQ0KK3ZvaWQgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQ6OnNldE90aGVyKENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YSogb3RoZXIpIHsNCisgIG1fb3RoZXIgPSBvdGhlcjsNCit9DQorQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQ6On5DQkNfQ29tbW9uRGVjb2RlclJlc3VsdCgpIHsNCisgIGlmIChtX290aGVyICE9IE5VTEwpIHsNCisgICAgZGVsZXRlIG1fb3RoZXI7DQorICB9DQorfQ0KK2NvbnN0IENGWF9CeXRlQXJyYXkmIENCQ19Db21tb25EZWNvZGVyUmVzdWx0OjpHZXRSYXdCeXRlcygpIHsNCisgIHJldHVybiBtX3Jhd0J5dGVzOw0KK30NCitjb25zdCBDRlhfSW50MzJBcnJheSYgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQ6OkdldEJ5dGVTZWdtZW50cygpIHsNCisgIHJldHVybiBtX2J5dGVTZWdtZW50czsNCit9DQorY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIENCQ19Db21tb25EZWNvZGVyUmVzdWx0OjpHZXRUZXh0KCkgew0KKyAgcmV0dXJuIG1fdGV4dDsNCit9DQorQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQ6OkdldEVDTGV2ZWwoKSB7DQorICByZXR1cm4gbV9lY0xldmVsOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uRGVjb2RlclJlc3VsdC5oIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkRlY29kZXJSZXN1bHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGMzYTA5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkRlY29kZXJSZXN1bHQuaApAQCAtMCwwICsxLDQwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0NPTU1PTkRFQ09ERVJSRVNVTFRfSF8NCisjZGVmaW5lIF9CQ19DT01NT05ERUNPREVSUkVTVUxUX0hfDQorY2xhc3MgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDsNCitjbGFzcyBDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGE7DQorY2xhc3MgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQgew0KKyBwdWJsaWM6DQorICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCgpOw0KKyAgdmlydHVhbCB+Q0JDX0NvbW1vbkRlY29kZXJSZXN1bHQoKTsNCisgIGNvbnN0IENGWF9CeXRlQXJyYXkmIEdldFJhd0J5dGVzKCk7DQorICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgR2V0VGV4dCgpOw0KKyAgY29uc3QgQ0ZYX0ludDMyQXJyYXkmIEdldEJ5dGVTZWdtZW50cygpOw0KKyAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogR2V0RUNMZXZlbCgpOw0KKyAgdmlydHVhbCB2b2lkIEluaXQoY29uc3QgQ0ZYX0J5dGVBcnJheSYgcmF3Qnl0ZXMsDQorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgdGV4dCwNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9JbnQzMkFycmF5JiBieXRlU2VnbWVudHMsDQorICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICB2aXJ0dWFsIHZvaWQgSW5pdChjb25zdCBDRlhfQnl0ZUFycmF5JiByYXdCeXRlcywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiB0ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1B0ckFycmF5JiBieXRlU2VnbWVudHMsDQorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgZWNMZXZlbCwNCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdm9pZCBzZXRPdGhlcihDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGEqIG90aGVyKTsNCisNCisgcHJpdmF0ZToNCisgIENGWF9CeXRlQXJyYXkgbV9yYXdCeXRlczsNCisgIENGWF9CeXRlU3RyaW5nIG1fdGV4dDsNCisgIENGWF9JbnQzMkFycmF5IG1fYnl0ZVNlZ21lbnRzOw0KKyAgQ0ZYX1B0ckFycmF5IG1fcGRmNDE3Ynl0ZVNlZ21lbnRzOw0KKyAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogbV9lY0xldmVsOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgbV9wZGY0MTdlY0xldmVsOw0KKyAgQ0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhKiBtX290aGVyOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkVDSS5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uRUNJLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWY5MThiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkVDSS5jcHAKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwOCBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgIkJDX0NvbW1vbkVDSS5oIg0KKyNpbmNsdWRlICJCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0kuaCINCitDQkNfQ29tbW9uRUNJOjpDQkNfQ29tbW9uRUNJKGludDMyX3QgdmFsdWUpIHsNCisgIG1fdmFsdWUgPSB2YWx1ZTsNCit9DQorQ0JDX0NvbW1vbkVDSTo6fkNCQ19Db21tb25FQ0koKSB7fQ0KK2ludDMyX3QgQ0JDX0NvbW1vbkVDSTo6R2V0VmFsdWUoKSB7DQorICByZXR1cm4gbV92YWx1ZTsNCit9DQorQ0JDX0NvbW1vbkVDSSogQ0JDX0NvbW1vbkVDSTo6R2V0RUlDQnlWYWx1ZShpbnQzMl90IHZhbHVlLCBpbnQzMl90JiBlKSB7DQorICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gOTk5OTk5KSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkJhZEVDSTsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpZiAodmFsdWUgPCA5MDApIHsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uRUNJLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uRUNJLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY5MDM4MwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25FQ0kuaApAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0NPTU1PTkVDSV9IXw0KKyNkZWZpbmUgX0JDX0NPTU1PTkVDSV9IXw0KK2NsYXNzIENCQ19Db21tb25FQ0kgew0KKyBwdWJsaWM6DQorICBDQkNfQ29tbW9uRUNJKGludDMyX3QgdmFsdWUpOw0KKyAgdmlydHVhbCB+Q0JDX0NvbW1vbkVDSSgpOw0KKw0KKyAgaW50MzJfdCBHZXRWYWx1ZSgpOw0KKyAgc3RhdGljIENCQ19Db21tb25FQ0kqIEdldEVJQ0J5VmFsdWUoaW50MzJfdCB2YWx1ZSwgaW50MzJfdCYgZSk7DQorDQorIHByaXZhdGU6DQorICBpbnQzMl90IG1fdmFsdWU7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0uY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmQyZTRhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtLmNwcApAQCAtMCwwICsxLDE0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgIkJDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtLmgiDQorQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtOjpDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0oRlhfRkxPQVQgYTExLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGEyMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBhMzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYTEyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGEyMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBhMzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYTEzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGEyMywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBhMzMpDQorICAgIDogbV9hMTEoYTExKSwNCisgICAgICBtX2ExMihhMTIpLA0KKyAgICAgIG1fYTEzKGExMyksDQorICAgICAgbV9hMjEoYTIxKSwNCisgICAgICBtX2EyMihhMjIpLA0KKyAgICAgIG1fYTIzKGEyMyksDQorICAgICAgbV9hMzEoYTMxKSwNCisgICAgICBtX2EzMihhMzIpLA0KKyAgICAgIG1fYTMzKGEzMykgew0KK30NCitDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm06On5DQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0oKSB7fQ0KK0NCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybSoNCitDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm06OlF1YWRyaWxhdGVyYWxUb1F1YWRyaWxhdGVyYWwoRlhfRkxPQVQgeDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MHAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkwcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgycCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTJwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4M3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkzcCkgew0KKyAgQ0JDX0F1dG9QdHI8Q0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtPiBxVG9TKA0KKyAgICAgIFF1YWRyaWxhdGVyYWxUb1NxdWFyZSh4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpKTsNCisgIENCQ19BdXRvUHRyPENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybT4gc1RvUSgNCisgICAgICBTcXVhcmVUb1F1YWRyaWxhdGVyYWwoeDBwLCB5MHAsIHgxcCwgeTFwLCB4MnAsIHkycCwgeDNwLCB5M3ApKTsNCisgIHJldHVybiBzVG9RLT5UaW1lcygqKHFUb1MuZ2V0KCkpKTsNCit9DQordm9pZCBDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm06OlRyYW5zZm9ybVBvaW50cyhDRlhfRmxvYXRBcnJheSogcG9pbnRzKSB7DQorICBpbnQzMl90IG1heCA9IHBvaW50cy0+R2V0U2l6ZSgpOw0KKyAgRlhfRkxPQVQgYTExID0gbV9hMTE7DQorICBGWF9GTE9BVCBhMTIgPSBtX2ExMjsNCisgIEZYX0ZMT0FUIGExMyA9IG1fYTEzOw0KKyAgRlhfRkxPQVQgYTIxID0gbV9hMjE7DQorICBGWF9GTE9BVCBhMjIgPSBtX2EyMjsNCisgIEZYX0ZMT0FUIGEyMyA9IG1fYTIzOw0KKyAgRlhfRkxPQVQgYTMxID0gbV9hMzE7DQorICBGWF9GTE9BVCBhMzIgPSBtX2EzMjsNCisgIEZYX0ZMT0FUIGEzMyA9IG1fYTMzOw0KKyAgaW50MzJfdCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IG1heDsgaSArPSAyKSB7DQorICAgIEZYX0ZMT0FUIHggPSAoKnBvaW50cylbaV07DQorICAgIEZYX0ZMT0FUIHkgPSAoKnBvaW50cylbaSArIDFdOw0KKyAgICBGWF9GTE9BVCBkZW5vbWluYXRvciA9IGExMyAqIHggKyBhMjMgKiB5ICsgYTMzOw0KKyAgICAoKnBvaW50cylbaV0gPSAoYTExICogeCArIGEyMSAqIHkgKyBhMzEpIC8gZGVub21pbmF0b3I7DQorICAgICgqcG9pbnRzKVtpICsgMV0gPSAoYTEyICogeCArIGEyMiAqIHkgKyBhMzIpIC8gZGVub21pbmF0b3I7DQorICB9DQorfQ0KK0NCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybSoNCitDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm06OlNxdWFyZVRvUXVhZHJpbGF0ZXJhbChGWF9GTE9BVCB4MCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5Mykgew0KKyAgRlhfRkxPQVQgZHkyID0geTMgLSB5MjsNCisgIEZYX0ZMT0FUIGR5MyA9IHkwIC0geTEgKyB5MiAtIHkzOw0KKyAgaWYgKChkeTIgPT0gMC4wZikgJiYgKGR5MyA9PSAwLjBmKSkgew0KKyAgICByZXR1cm4gbmV3IENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybSh4MSAtIHgwLCB4MiAtIHgxLCB4MCwgeTEgLSB5MCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTIgLSB5MSwgeTAsIDAuMGYsIDAuMGYsIDEuMGYpOw0KKyAgfSBlbHNlIHsNCisgICAgRlhfRkxPQVQgZHgxID0geDEgLSB4MjsNCisgICAgRlhfRkxPQVQgZHgyID0geDMgLSB4MjsNCisgICAgRlhfRkxPQVQgZHgzID0geDAgLSB4MSArIHgyIC0geDM7DQorICAgIEZYX0ZMT0FUIGR5MSA9IHkxIC0geTI7DQorICAgIEZYX0ZMT0FUIGRlbm9taW5hdG9yID0gZHgxICogZHkyIC0gZHgyICogZHkxOw0KKyAgICBGWF9GTE9BVCBhMTMgPSAoZHgzICogZHkyIC0gZHgyICogZHkzKSAvIGRlbm9taW5hdG9yOw0KKyAgICBGWF9GTE9BVCBhMjMgPSAoZHgxICogZHkzIC0gZHgzICogZHkxKSAvIGRlbm9taW5hdG9yOw0KKyAgICByZXR1cm4gbmV3IENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybSgNCisgICAgICAgIHgxIC0geDAgKyBhMTMgKiB4MSwgeDMgLSB4MCArIGEyMyAqIHgzLCB4MCwgeTEgLSB5MCArIGExMyAqIHkxLA0KKyAgICAgICAgeTMgLSB5MCArIGEyMyAqIHkzLCB5MCwgYTEzLCBhMjMsIDEuMGYpOw0KKyAgfQ0KK30NCitDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0qDQorQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtOjpRdWFkcmlsYXRlcmFsVG9TcXVhcmUoRlhfRkxPQVQgeDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTMpIHsNCisgIENCQ19BdXRvUHRyPENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybT4gdGVtcDEoDQorICAgICAgU3F1YXJlVG9RdWFkcmlsYXRlcmFsKHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MykpOw0KKyAgcmV0dXJuIHRlbXAxLT5CdWlsZEFkam9pbnQoKTsNCit9DQorQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtKiBDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm06OkJ1aWxkQWRqb2ludCgpIHsNCisgIHJldHVybiBuZXcgQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtKA0KKyAgICAgIG1fYTIyICogbV9hMzMgLSBtX2EyMyAqIG1fYTMyLCBtX2EyMyAqIG1fYTMxIC0gbV9hMjEgKiBtX2EzMywNCisgICAgICBtX2EyMSAqIG1fYTMyIC0gbV9hMjIgKiBtX2EzMSwgbV9hMTMgKiBtX2EzMiAtIG1fYTEyICogbV9hMzMsDQorICAgICAgbV9hMTEgKiBtX2EzMyAtIG1fYTEzICogbV9hMzEsIG1fYTEyICogbV9hMzEgLSBtX2ExMSAqIG1fYTMyLA0KKyAgICAgIG1fYTEyICogbV9hMjMgLSBtX2ExMyAqIG1fYTIyLCBtX2ExMyAqIG1fYTIxIC0gbV9hMTEgKiBtX2EyMywNCisgICAgICBtX2ExMSAqIG1fYTIyIC0gbV9hMTIgKiBtX2EyMSk7DQorfQ0KK0NCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybSogQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtOjpUaW1lcygNCisgICAgQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtJiBvdGhlcikgew0KKyAgcmV0dXJuIG5ldyBDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0oDQorICAgICAgbV9hMTEgKiBvdGhlci5tX2ExMSArIG1fYTIxICogb3RoZXIubV9hMTIgKyBtX2EzMSAqIG90aGVyLm1fYTEzLA0KKyAgICAgIG1fYTExICogb3RoZXIubV9hMjEgKyBtX2EyMSAqIG90aGVyLm1fYTIyICsgbV9hMzEgKiBvdGhlci5tX2EyMywNCisgICAgICBtX2ExMSAqIG90aGVyLm1fYTMxICsgbV9hMjEgKiBvdGhlci5tX2EzMiArIG1fYTMxICogb3RoZXIubV9hMzMsDQorICAgICAgbV9hMTIgKiBvdGhlci5tX2ExMSArIG1fYTIyICogb3RoZXIubV9hMTIgKyBtX2EzMiAqIG90aGVyLm1fYTEzLA0KKyAgICAgIG1fYTEyICogb3RoZXIubV9hMjEgKyBtX2EyMiAqIG90aGVyLm1fYTIyICsgbV9hMzIgKiBvdGhlci5tX2EyMywNCisgICAgICBtX2ExMiAqIG90aGVyLm1fYTMxICsgbV9hMjIgKiBvdGhlci5tX2EzMiArIG1fYTMyICogb3RoZXIubV9hMzMsDQorICAgICAgbV9hMTMgKiBvdGhlci5tX2ExMSArIG1fYTIzICogb3RoZXIubV9hMTIgKyBtX2EzMyAqIG90aGVyLm1fYTEzLA0KKyAgICAgIG1fYTEzICogb3RoZXIubV9hMjEgKyBtX2EyMyAqIG90aGVyLm1fYTIyICsgbV9hMzMgKiBvdGhlci5tX2EyMywNCisgICAgICBtX2ExMyAqIG90aGVyLm1fYTMxICsgbV9hMjMgKiBvdGhlci5tX2EzMiArIG1fYTMzICogb3RoZXIubV9hMzMpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0uaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZTkwY2QKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0uaApAQCAtMCwwICsxLDYxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0NPTU1PTlBFUlNQRUNUSVZFVFJBTlNGT1JNX0hfDQorI2RlZmluZSBfQkNfQ09NTU9OUEVSU1BFQ1RJVkVUUkFOU0ZPUk1fSF8NCitjbGFzcyBDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0gew0KKyBwdWJsaWM6DQorICBDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0oRlhfRkxPQVQgYTExLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGEyMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBhMzEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYTEyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGEyMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBhMzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYTEzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGEyMywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBhMzMpOw0KKyAgdmlydHVhbCB+Q0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtKCk7DQorICBzdGF0aWMgQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtKiBRdWFkcmlsYXRlcmFsVG9RdWFkcmlsYXRlcmFsKA0KKyAgICAgIEZYX0ZMT0FUIHgwLA0KKyAgICAgIEZYX0ZMT0FUIHkwLA0KKyAgICAgIEZYX0ZMT0FUIHgxLA0KKyAgICAgIEZYX0ZMT0FUIHkxLA0KKyAgICAgIEZYX0ZMT0FUIHgyLA0KKyAgICAgIEZYX0ZMT0FUIHkyLA0KKyAgICAgIEZYX0ZMT0FUIHgzLA0KKyAgICAgIEZYX0ZMT0FUIHkzLA0KKyAgICAgIEZYX0ZMT0FUIHgwcCwNCisgICAgICBGWF9GTE9BVCB5MHAsDQorICAgICAgRlhfRkxPQVQgeDFwLA0KKyAgICAgIEZYX0ZMT0FUIHkxcCwNCisgICAgICBGWF9GTE9BVCB4MnAsDQorICAgICAgRlhfRkxPQVQgeTJwLA0KKyAgICAgIEZYX0ZMT0FUIHgzcCwNCisgICAgICBGWF9GTE9BVCB5M3ApOw0KKyAgc3RhdGljIENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybSogU3F1YXJlVG9RdWFkcmlsYXRlcmFsKEZYX0ZMT0FUIHgwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkzKTsNCisgIHN0YXRpYyBDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0qIFF1YWRyaWxhdGVyYWxUb1NxdWFyZShGWF9GTE9BVCB4MCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5Myk7DQorICBDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0qIEJ1aWxkQWRqb2ludCgpOw0KKyAgQ0JDX0NvbW1vblBlcnNwZWN0aXZlVHJhbnNmb3JtKiBUaW1lcyhDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0mIG90aGVyKTsNCisgIHZvaWQgVHJhbnNmb3JtUG9pbnRzKENGWF9GbG9hdEFycmF5KiBwb2ludHMpOw0KKw0KKyBwcml2YXRlOg0KKyAgRlhfRkxPQVQgbV9hMTEsIG1fYTEyLCBtX2ExMywgbV9hMjEsIG1fYTIyLCBtX2EyMywgbV9hMzEsIG1fYTMyLCBtX2EzMzsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRjMTc3MQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIuY3BwCkBAIC0wLDAgKzEsMTY5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDA5IFpYaW5nIGF1dGhvcnMNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfQmluYXJpemVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX0x1bWluYW5jZVNvdXJjZS5oIg0KKyNpbmNsdWRlICJCQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAiQkNfQ29tbW9uQml0QXJyYXkuaCINCisjaW5jbHVkZSAiQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyLmgiDQorY29uc3QgaW50MzJfdCBMVU1JTkFOQ0VfQklUUyA9IDU7DQorY29uc3QgaW50MzJfdCBMVU1JTkFOQ0VfU0hJRlQgPSA4IC0gTFVNSU5BTkNFX0JJVFM7DQorY29uc3QgaW50MzJfdCBMVU1JTkFOQ0VfQlVDS0VUUyA9IDEgPDwgTFVNSU5BTkNFX0JJVFM7DQorQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplcjo6Q0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplcigNCisgICAgQ0JDX0x1bWluYW5jZVNvdXJjZSogc291cmNlKQ0KKyAgICA6IENCQ19CaW5hcml6ZXIoc291cmNlKSB7fQ0KK0NCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXI6On5DQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyKCkge30NCitDQkNfQ29tbW9uQml0QXJyYXkqIENCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXI6OkdldEJsYWNrUm93KA0KKyAgICBpbnQzMl90IHksDQorICAgIENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBDQkNfTHVtaW5hbmNlU291cmNlKiBzb3VyY2UgPSBHZXRMdW1pbmFuY2VTb3VyY2UoKTsNCisgIGludDMyX3Qgd2lkdGggPSBzb3VyY2UtPkdldFdpZHRoKCk7DQorICBDQkNfQXV0b1B0cjxDQkNfQ29tbW9uQml0QXJyYXk+IHJlc3VsdChuZXcgQ0JDX0NvbW1vbkJpdEFycmF5KHdpZHRoKSk7DQorICBJbml0QXJyYXlzKHdpZHRoKTsNCisgIENGWF9CeXRlQXJyYXkqIGxvY2FsTHVtaW5hbmNlcyA9IHNvdXJjZS0+R2V0Um93KHksIG1fbHVtaW5hbmNlLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgcmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7DQorICB9DQorICBDRlhfSW50MzJBcnJheSBsb2NhbEJ1Y2tldHM7DQorICBsb2NhbEJ1Y2tldHMuQ29weShtX2J1Y2tldHMpOw0KKyAgaW50MzJfdCB4Ow0KKyAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsNCisgICAgaW50MzJfdCBwaXhlbCA9ICgqbG9jYWxMdW1pbmFuY2VzKVt4XSAmIDB4ZmY7DQorICAgIGxvY2FsQnVja2V0c1twaXhlbCA+PiBMVU1JTkFOQ0VfU0hJRlRdKys7DQorICB9DQorICBpbnQzMl90IGJsYWNrUG9pbnQgPSBFc3RpbWF0ZUJsYWNrUG9pbnQobG9jYWxCdWNrZXRzLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgcmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7DQorICB9DQorICBpbnQzMl90IGxlZnQgPSAoKmxvY2FsTHVtaW5hbmNlcylbMF0gJiAweGZmOw0KKyAgaW50MzJfdCBjZW50ZXIgPSAoKmxvY2FsTHVtaW5hbmNlcylbMV0gJiAweGZmOw0KKyAgZm9yICh4ID0gMTsgeCA8IHdpZHRoIC0gMTsgeCsrKSB7DQorICAgIGludDMyX3QgcmlnaHQgPSAoKmxvY2FsTHVtaW5hbmNlcylbeCArIDFdICYgMHhmZjsNCisgICAgaW50MzJfdCBsdW1pbmFuY2UgPSAoKGNlbnRlciA8PCAyKSAtIGxlZnQgLSByaWdodCkgPj4gMTsNCisgICAgaWYgKGx1bWluYW5jZSA8IGJsYWNrUG9pbnQpIHsNCisgICAgICByZXN1bHQtPlNldCh4KTsNCisgICAgfQ0KKyAgICBsZWZ0ID0gY2VudGVyOw0KKyAgICBjZW50ZXIgPSByaWdodDsNCisgIH0NCisgIHJldHVybiByZXN1bHQucmVsZWFzZSgpOw0KK30NCitDQkNfQ29tbW9uQml0TWF0cml4KiBDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyOjpHZXRCbGFja01hdHJpeChpbnQzMl90JiBlKSB7DQorICBDQkNfTHVtaW5hbmNlU291cmNlKiBzb3VyY2UgPSBHZXRMdW1pbmFuY2VTb3VyY2UoKTsNCisgIGludDMyX3Qgd2lkdGggPSBzb3VyY2UtPkdldFdpZHRoKCk7DQorICBpbnQzMl90IGhlaWdodCA9IHNvdXJjZS0+R2V0SGVpZ2h0KCk7DQorICBDQkNfQ29tbW9uQml0TWF0cml4KiBCaXRNYXRyaXhUZW1wID0gbmV3IENCQ19Db21tb25CaXRNYXRyaXgoKTsNCisgIEJpdE1hdHJpeFRlbXAtPkluaXQod2lkdGgsIGhlaWdodCk7DQorICBDQkNfQXV0b1B0cjxDQkNfQ29tbW9uQml0TWF0cml4PiBtYXRyaXgoQml0TWF0cml4VGVtcCk7DQorICBJbml0QXJyYXlzKHdpZHRoKTsNCisgIENGWF9JbnQzMkFycmF5IGxvY2FsQnVja2V0czsNCisgIGxvY2FsQnVja2V0cy5Db3B5KG1fYnVja2V0cyk7DQorICBpbnQzMl90IHk7DQorICBmb3IgKHkgPSAxOyB5IDwgNTsgeSsrKSB7DQorICAgIGludDMyX3Qgcm93ID0gaGVpZ2h0ICogeSAvIDU7DQorICAgIENGWF9CeXRlQXJyYXkqIGxvY2FsTHVtaW5hbmNlcyA9IHNvdXJjZS0+R2V0Um93KHJvdywgbV9sdW1pbmFuY2UsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIGludDMyX3QgcmlnaHQgPSAod2lkdGggPDwgMikgLyA1Ow0KKyAgICBpbnQzMl90IHg7DQorICAgIGZvciAoeCA9IHdpZHRoIC8gNTsgeCA8IHJpZ2h0OyB4KyspIHsNCisgICAgICBpbnQzMl90IHBpeGVsID0gKCpsb2NhbEx1bWluYW5jZXMpW3hdICYgMHhmZjsNCisgICAgICBsb2NhbEJ1Y2tldHNbcGl4ZWwgPj4gTFVNSU5BTkNFX1NISUZUXSsrOw0KKyAgICB9DQorICB9DQorICBpbnQzMl90IGJsYWNrUG9pbnQgPSBFc3RpbWF0ZUJsYWNrUG9pbnQobG9jYWxCdWNrZXRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19BdXRvUHRyPENGWF9CeXRlQXJyYXk+IGxvY2FsTHVtaW5hbmNlcyhzb3VyY2UtPkdldE1hdHJpeCgpKTsNCisgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgew0KKyAgICBpbnQzMl90IG9mZnNldCA9IHkgKiB3aWR0aDsNCisgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgew0KKyAgICAgIGludDMyX3QgcGl4ZWwgPSAoKmxvY2FsTHVtaW5hbmNlcylbb2Zmc2V0ICsgeF0gJiAweGZmOw0KKyAgICAgIGlmIChwaXhlbCA8IGJsYWNrUG9pbnQpIHsNCisgICAgICAgIG1hdHJpeC0+U2V0KHgsIHkpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIG1hdHJpeC5yZWxlYXNlKCk7DQorfQ0KK3ZvaWQgQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplcjo6SW5pdEFycmF5cyhpbnQzMl90IGx1bWluYW5jZVNpemUpIHsNCisgIGlmIChtX2x1bWluYW5jZS5HZXRTaXplKCkgPCBsdW1pbmFuY2VTaXplKSB7DQorICAgIG1fbHVtaW5hbmNlLlNldFNpemUobHVtaW5hbmNlU2l6ZSk7DQorICB9DQorICBpZiAobV9idWNrZXRzLkdldFNpemUoKSA8PSAwKSB7DQorICAgIG1fYnVja2V0cy5TZXRTaXplKExVTUlOQU5DRV9CVUNLRVRTKTsNCisgIH0gZWxzZSB7DQorICAgIGludDMyX3QgeDsNCisgICAgZm9yICh4ID0gMDsgeCA8IExVTUlOQU5DRV9CVUNLRVRTOyB4KyspIHsNCisgICAgICBtX2J1Y2tldHNbeF0gPSAwOw0KKyAgICB9DQorICB9DQorfQ0KK2ludDMyX3QgQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplcjo6RXN0aW1hdGVCbGFja1BvaW50KA0KKyAgICBDRlhfSW50MzJBcnJheSYgYnVja2V0cywNCisgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBudW1CdWNrZXRzID0gYnVja2V0cy5HZXRTaXplKCk7DQorICBpbnQzMl90IG1heEJ1Y2tldENvdW50ID0gMDsNCisgIGludDMyX3QgZmlyc3RQZWFrID0gMDsNCisgIGludDMyX3QgZmlyc3RQZWFrU2l6ZSA9IDA7DQorICBpbnQzMl90IHg7DQorICBmb3IgKHggPSAwOyB4IDwgbnVtQnVja2V0czsgeCsrKSB7DQorICAgIGlmIChidWNrZXRzW3hdID4gZmlyc3RQZWFrU2l6ZSkgew0KKyAgICAgIGZpcnN0UGVhayA9IHg7DQorICAgICAgZmlyc3RQZWFrU2l6ZSA9IGJ1Y2tldHNbeF07DQorICAgIH0NCisgICAgaWYgKGJ1Y2tldHNbeF0gPiBtYXhCdWNrZXRDb3VudCkgew0KKyAgICAgIG1heEJ1Y2tldENvdW50ID0gYnVja2V0c1t4XTsNCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBzZWNvbmRQZWFrID0gMDsNCisgIGludDMyX3Qgc2Vjb25kUGVha1Njb3JlID0gMDsNCisgIGZvciAoeCA9IDA7IHggPCBudW1CdWNrZXRzOyB4KyspIHsNCisgICAgaW50MzJfdCBkaXN0YW5jZVRvQmlnZ2VzdCA9IHggLSBmaXJzdFBlYWs7DQorICAgIGludDMyX3Qgc2NvcmUgPSBidWNrZXRzW3hdICogZGlzdGFuY2VUb0JpZ2dlc3QgKiBkaXN0YW5jZVRvQmlnZ2VzdDsNCisgICAgaWYgKHNjb3JlID4gc2Vjb25kUGVha1Njb3JlKSB7DQorICAgICAgc2Vjb25kUGVhayA9IHg7DQorICAgICAgc2Vjb25kUGVha1Njb3JlID0gc2NvcmU7DQorICAgIH0NCisgIH0NCisgIGlmIChmaXJzdFBlYWsgPiBzZWNvbmRQZWFrKSB7DQorICAgIGludDMyX3QgdGVtcCA9IGZpcnN0UGVhazsNCisgICAgZmlyc3RQZWFrID0gc2Vjb25kUGVhazsNCisgICAgc2Vjb25kUGVhayA9IHRlbXA7DQorICB9DQorICBpZiAoc2Vjb25kUGVhayAtIGZpcnN0UGVhayA8PSBudW1CdWNrZXRzID4+IDQpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uUmVhZDsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpbnQzMl90IGJlc3RWYWxsZXkgPSBzZWNvbmRQZWFrIC0gMTsNCisgIGludDMyX3QgYmVzdFZhbGxleVNjb3JlID0gLTE7DQorICBmb3IgKHggPSBzZWNvbmRQZWFrIC0gMTsgeCA+IGZpcnN0UGVhazsgeC0tKSB7DQorICAgIGludDMyX3QgZnJvbUZpcnN0ID0geCAtIGZpcnN0UGVhazsNCisgICAgaW50MzJfdCBzY29yZSA9IGZyb21GaXJzdCAqIGZyb21GaXJzdCAqIChzZWNvbmRQZWFrIC0geCkgKg0KKyAgICAgICAgICAgICAgICAgICAgKG1heEJ1Y2tldENvdW50IC0gYnVja2V0c1t4XSk7DQorICAgIGlmIChzY29yZSA+IGJlc3RWYWxsZXlTY29yZSkgew0KKyAgICAgIGJlc3RWYWxsZXkgPSB4Ow0KKyAgICAgIGJlc3RWYWxsZXlTY29yZSA9IHNjb3JlOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gYmVzdFZhbGxleSA8PCBMVU1JTkFOQ0VfU0hJRlQ7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2ZmM2U3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplci5oCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfR0xPQkFMSElTVE9HUkFNQklOQVJJWkVSX0hfDQorI2RlZmluZSBfQkNfR0xPQkFMSElTVE9HUkFNQklOQVJJWkVSX0hfDQorY2xhc3MgQ0JDX0NvbW1vbkJpbmFyaXplcjsNCitjbGFzcyBDQkNfQ29tbW9uQml0QXJyYXk7DQorY2xhc3MgQ0JDX0NvbW1vbkJpdE1hdHJpeDsNCitjbGFzcyBDQkNfTHVtaW5hbmNlU291cmNlOw0KK2NsYXNzIENCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXI7DQorY2xhc3MgQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplciA6IHB1YmxpYyBDQkNfQmluYXJpemVyIHsNCisgcHVibGljOg0KKyAgQ0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplcihDQkNfTHVtaW5hbmNlU291cmNlKiBzb3VyY2UpOw0KKyAgdmlydHVhbCB+Q0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplcigpOw0KKw0KKyAgdm9pZCBJbml0QXJyYXlzKGludDMyX3QgbHVtaW5hbmNlU2l6ZSk7DQorICBDQkNfQ29tbW9uQml0TWF0cml4KiBHZXRCbGFja01hdHJpeChpbnQzMl90JiBlKTsNCisgIENCQ19Db21tb25CaXRBcnJheSogR2V0QmxhY2tSb3coaW50MzJfdCB5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgaW50MzJfdCBFc3RpbWF0ZUJsYWNrUG9pbnQoQ0ZYX0ludDMyQXJyYXkmIGJ1Y2tldHMsIGludDMyX3QmIGUpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0ZYX0J5dGVBcnJheSBtX2x1bWluYW5jZTsNCisgIENGWF9JbnQzMkFycmF5IG1fYnVja2V0czsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDFlYWVlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3IuY3BwCkBAIC0wLDAgKzEsMjYwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDEwIFpYaW5nIGF1dGhvcnMNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3IuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19SZXN1bHRQb2ludC5oIg0KK2NvbnN0IGludDMyX3QgQ0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3I6OklOSVRfU0laRSA9IDMwOw0KK2NvbnN0IGludDMyX3QgQ0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3I6OkNPUlIgPSAxOw0KK0NCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yOjpDQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3RvcigNCisgICAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UpIHsNCisgIG1faW1hZ2UgPSBpbWFnZTsNCisgIG1faGVpZ2h0ID0gaW1hZ2UtPkdldEhlaWdodCgpOw0KKyAgbV93aWR0aCA9IGltYWdlLT5HZXRXaWR0aCgpOw0KKyAgbV9sZWZ0SW5pdCA9IChtX3dpZHRoIC0gSU5JVF9TSVpFKSA+PiAxOw0KKyAgbV9yaWdodEluaXQgPSAobV93aWR0aCArIElOSVRfU0laRSkgPj4gMTsNCisgIG1fdXBJbml0ID0gKG1faGVpZ2h0IC0gSU5JVF9TSVpFKSA+PiAxOw0KKyAgbV9kb3duSW5pdCA9IChtX2hlaWdodCArIElOSVRfU0laRSkgPj4gMTsNCit9DQordm9pZCBDQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3Rvcjo6SW5pdChpbnQzMl90JiBlKSB7DQorICBpZiAobV91cEluaXQgPCAwIHx8IG1fbGVmdEluaXQgPCAwIHx8IG1fZG93bkluaXQgPj0gbV9oZWlnaHQgfHwNCisgICAgICBtX3JpZ2h0SW5pdCA+PSBtX3dpZHRoKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCit9DQorQ0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3I6OkNCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yKA0KKyAgICBDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSwNCisgICAgaW50MzJfdCBpbml0U2l6ZSwNCisgICAgaW50MzJfdCB4LA0KKyAgICBpbnQzMl90IHkpIHsNCisgIG1faW1hZ2UgPSBpbWFnZTsNCisgIG1faGVpZ2h0ID0gaW1hZ2UtPkdldEhlaWdodCgpOw0KKyAgbV93aWR0aCA9IGltYWdlLT5HZXRXaWR0aCgpOw0KKyAgaW50MzJfdCBoYWxmc2l6ZSA9IGluaXRTaXplID4+IDE7DQorICBtX2xlZnRJbml0ID0geCAtIGhhbGZzaXplOw0KKyAgbV9yaWdodEluaXQgPSB4ICsgaGFsZnNpemU7DQorICBtX3VwSW5pdCA9IHkgLSBoYWxmc2l6ZTsNCisgIG1fZG93bkluaXQgPSB5ICsgaGFsZnNpemU7DQorfQ0KK0NCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yOjp+Q0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3IoKSB7fQ0KK0NGWF9QdHJBcnJheSogQ0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3I6OkRldGVjdChpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IGxlZnQgPSBtX2xlZnRJbml0Ow0KKyAgaW50MzJfdCByaWdodCA9IG1fcmlnaHRJbml0Ow0KKyAgaW50MzJfdCB1cCA9IG1fdXBJbml0Ow0KKyAgaW50MzJfdCBkb3duID0gbV9kb3duSW5pdDsNCisgIEZYX0JPT0wgc2l6ZUV4Y2VlZGVkID0gRkFMU0U7DQorICBGWF9CT09MIGFCbGFja1BvaW50Rm91bmRPbkJvcmRlciA9IFRSVUU7DQorICBGWF9CT09MIGF0TGVhc3RPbmVCbGFja1BvaW50Rm91bmRPbkJvcmRlciA9IEZBTFNFOw0KKyAgd2hpbGUgKGFCbGFja1BvaW50Rm91bmRPbkJvcmRlcikgew0KKyAgICBhQmxhY2tQb2ludEZvdW5kT25Cb3JkZXIgPSBGQUxTRTsNCisgICAgRlhfQk9PTCByaWdodEJvcmRlck5vdFdoaXRlID0gVFJVRTsNCisgICAgd2hpbGUgKHJpZ2h0Qm9yZGVyTm90V2hpdGUgJiYgcmlnaHQgPCBtX3dpZHRoKSB7DQorICAgICAgcmlnaHRCb3JkZXJOb3RXaGl0ZSA9IENvbnRhaW5zQmxhY2tQb2ludCh1cCwgZG93biwgcmlnaHQsIEZBTFNFKTsNCisgICAgICBpZiAocmlnaHRCb3JkZXJOb3RXaGl0ZSkgew0KKyAgICAgICAgcmlnaHQrKzsNCisgICAgICAgIGFCbGFja1BvaW50Rm91bmRPbkJvcmRlciA9IFRSVUU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChyaWdodCA+PSBtX3dpZHRoKSB7DQorICAgICAgc2l6ZUV4Y2VlZGVkID0gVFJVRTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJvdHRvbUJvcmRlck5vdFdoaXRlID0gVFJVRTsNCisgICAgd2hpbGUgKGJvdHRvbUJvcmRlck5vdFdoaXRlICYmIGRvd24gPCBtX2hlaWdodCkgew0KKyAgICAgIGJvdHRvbUJvcmRlck5vdFdoaXRlID0gQ29udGFpbnNCbGFja1BvaW50KGxlZnQsIHJpZ2h0LCBkb3duLCBUUlVFKTsNCisgICAgICBpZiAoYm90dG9tQm9yZGVyTm90V2hpdGUpIHsNCisgICAgICAgIGRvd24rKzsNCisgICAgICAgIGFCbGFja1BvaW50Rm91bmRPbkJvcmRlciA9IFRSVUU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChkb3duID49IG1faGVpZ2h0KSB7DQorICAgICAgc2l6ZUV4Y2VlZGVkID0gVFJVRTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBGWF9CT09MIGxlZnRCb3JkZXJOb3RXaGl0ZSA9IFRSVUU7DQorICAgIHdoaWxlIChsZWZ0Qm9yZGVyTm90V2hpdGUgJiYgbGVmdCA+PSAwKSB7DQorICAgICAgbGVmdEJvcmRlck5vdFdoaXRlID0gQ29udGFpbnNCbGFja1BvaW50KHVwLCBkb3duLCBsZWZ0LCBGQUxTRSk7DQorICAgICAgaWYgKGxlZnRCb3JkZXJOb3RXaGl0ZSkgew0KKyAgICAgICAgbGVmdC0tOw0KKyAgICAgICAgYUJsYWNrUG9pbnRGb3VuZE9uQm9yZGVyID0gVFJVRTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGxlZnQgPCAwKSB7DQorICAgICAgc2l6ZUV4Y2VlZGVkID0gVFJVRTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBGWF9CT09MIHRvcEJvcmRlck5vdFdoaXRlID0gVFJVRTsNCisgICAgd2hpbGUgKHRvcEJvcmRlck5vdFdoaXRlICYmIHVwID49IDApIHsNCisgICAgICB0b3BCb3JkZXJOb3RXaGl0ZSA9IENvbnRhaW5zQmxhY2tQb2ludChsZWZ0LCByaWdodCwgdXAsIFRSVUUpOw0KKyAgICAgIGlmICh0b3BCb3JkZXJOb3RXaGl0ZSkgew0KKyAgICAgICAgdXAtLTsNCisgICAgICAgIGFCbGFja1BvaW50Rm91bmRPbkJvcmRlciA9IFRSVUU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmICh1cCA8IDApIHsNCisgICAgICBzaXplRXhjZWVkZWQgPSBUUlVFOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChhQmxhY2tQb2ludEZvdW5kT25Cb3JkZXIpIHsNCisgICAgICBhdExlYXN0T25lQmxhY2tQb2ludEZvdW5kT25Cb3JkZXIgPSBUUlVFOw0KKyAgICB9DQorICB9DQorICBpZiAoIXNpemVFeGNlZWRlZCAmJiBhdExlYXN0T25lQmxhY2tQb2ludEZvdW5kT25Cb3JkZXIpIHsNCisgICAgaW50MzJfdCBtYXhTaXplID0gcmlnaHQgLSBsZWZ0Ow0KKyAgICBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnQ+IHooTlVMTCk7DQorICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IG1heFNpemU7IGkrKykgew0KKyAgICAgIHogPSBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnQ+KA0KKyAgICAgICAgICBHZXRCbGFja1BvaW50T25TZWdtZW50KChGWF9GTE9BVClsZWZ0LCAoRlhfRkxPQVQpKGRvd24gLSBpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKGxlZnQgKyBpKSwgKEZYX0ZMT0FUKShkb3duKSkpOw0KKyAgICAgIGlmICh6LmdldCgpICE9IE5VTEwpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoei5nZXQoKSA9PSBOVUxMKSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICB9DQorICAgIENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludD4gdChOVUxMKTsNCisgICAgZm9yIChpbnQzMl90IGogPSAxOyBqIDwgbWF4U2l6ZTsgaisrKSB7DQorICAgICAgdCA9IENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludD4oDQorICAgICAgICAgIEdldEJsYWNrUG9pbnRPblNlZ21lbnQoKEZYX0ZMT0FUKWxlZnQsIChGWF9GTE9BVCkodXAgKyBqKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKGxlZnQgKyBqKSwgKEZYX0ZMT0FUKXVwKSk7DQorICAgICAgaWYgKHQuZ2V0KCkgIT0gTlVMTCkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmICh0LmdldCgpID09IE5VTEwpIHsNCisgICAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIH0NCisgICAgQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50PiB4KE5VTEwpOw0KKyAgICBmb3IgKGludDMyX3QgayA9IDE7IGsgPCBtYXhTaXplOyBrKyspIHsNCisgICAgICB4ID0gQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50PigNCisgICAgICAgICAgR2V0QmxhY2tQb2ludE9uU2VnbWVudCgoRlhfRkxPQVQpcmlnaHQsIChGWF9GTE9BVCkodXAgKyBrKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKHJpZ2h0IC0gayksIChGWF9GTE9BVCl1cCkpOw0KKyAgICAgIGlmICh4LmdldCgpICE9IE5VTEwpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoeC5nZXQoKSA9PSBOVUxMKSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICB9DQorICAgIENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludD4geShOVUxMKTsNCisgICAgZm9yIChpbnQzMl90IG0gPSAxOyBtIDwgbWF4U2l6ZTsgbSsrKSB7DQorICAgICAgeSA9IENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludD4oDQorICAgICAgICAgIEdldEJsYWNrUG9pbnRPblNlZ21lbnQoKEZYX0ZMT0FUKXJpZ2h0LCAoRlhfRkxPQVQpKGRvd24gLSBtKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKHJpZ2h0IC0gbSksIChGWF9GTE9BVClkb3duKSk7DQorICAgICAgaWYgKHkuZ2V0KCkgIT0gTlVMTCkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmICh5LmdldCgpID09IE5VTEwpIHsNCisgICAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIH0NCisgICAgcmV0dXJuIENlbnRlckVkZ2VzKHkuZ2V0KCksIHouZ2V0KCksIHguZ2V0KCksIHQuZ2V0KCkpOw0KKyAgfSBlbHNlIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitpbnQzMl90IENCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yOjpSb3VuZChGWF9GTE9BVCBkKSB7DQorICByZXR1cm4gKGludDMyX3QpKGQgKyAwLjVmKTsNCit9DQorQ0JDX1Jlc3VsdFBvaW50KiBDQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3Rvcjo6R2V0QmxhY2tQb2ludE9uU2VnbWVudCgNCisgICAgRlhfRkxPQVQgYVgsDQorICAgIEZYX0ZMT0FUIGFZLA0KKyAgICBGWF9GTE9BVCBiWCwNCisgICAgRlhfRkxPQVQgYlkpIHsNCisgIGludDMyX3QgZGlzdCA9IERpc3RhbmNlTDIoYVgsIGFZLCBiWCwgYlkpOw0KKyAgZmxvYXQgeFN0ZXAgPSAoYlggLSBhWCkgLyBkaXN0Ow0KKyAgZmxvYXQgeVN0ZXAgPSAoYlkgLSBhWSkgLyBkaXN0Ow0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZGlzdDsgaSsrKSB7DQorICAgIGludDMyX3QgeCA9IFJvdW5kKGFYICsgaSAqIHhTdGVwKTsNCisgICAgaW50MzJfdCB5ID0gUm91bmQoYVkgKyBpICogeVN0ZXApOw0KKyAgICBpZiAobV9pbWFnZS0+R2V0KHgsIHkpKSB7DQorICAgICAgcmV0dXJuIG5ldyBDQkNfUmVzdWx0UG9pbnQoKEZYX0ZMT0FUKXgsIChGWF9GTE9BVCl5KTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK2ludDMyX3QgQ0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3I6OkRpc3RhbmNlTDIoRlhfRkxPQVQgYVgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBhWSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYlkpIHsNCisgIGZsb2F0IHhEaWZmID0gYVggLSBiWDsNCisgIGZsb2F0IHlEaWZmID0gYVkgLSBiWTsNCisgIHJldHVybiBSb3VuZCgoZmxvYXQpc3FydCh4RGlmZiAqIHhEaWZmICsgeURpZmYgKiB5RGlmZikpOw0KK30NCitDRlhfUHRyQXJyYXkqIENCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yOjpDZW50ZXJFZGdlcyhDQkNfUmVzdWx0UG9pbnQqIHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiB6LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIHQpIHsNCisgIGZsb2F0IHlpID0geS0+R2V0WCgpOw0KKyAgZmxvYXQgeWogPSB5LT5HZXRZKCk7DQorICBmbG9hdCB6aSA9IHotPkdldFgoKTsNCisgIGZsb2F0IHpqID0gei0+R2V0WSgpOw0KKyAgZmxvYXQgeGkgPSB4LT5HZXRYKCk7DQorICBmbG9hdCB4aiA9IHgtPkdldFkoKTsNCisgIGZsb2F0IHRpID0gdC0+R2V0WCgpOw0KKyAgZmxvYXQgdGogPSB0LT5HZXRZKCk7DQorICBpZiAoeWkgPCBtX3dpZHRoIC8gMikgew0KKyAgICBDRlhfUHRyQXJyYXkqIHJlc3VsdCA9IG5ldyBDRlhfUHRyQXJyYXk7DQorICAgIHJlc3VsdC0+U2V0U2l6ZSg0KTsNCisgICAgKCpyZXN1bHQpWzBdID0gbmV3IENCQ19SZXN1bHRQb2ludCh0aSAtIENPUlIsIHRqICsgQ09SUik7DQorICAgICgqcmVzdWx0KVsxXSA9IG5ldyBDQkNfUmVzdWx0UG9pbnQoemkgKyBDT1JSLCB6aiArIENPUlIpOw0KKyAgICAoKnJlc3VsdClbMl0gPSBuZXcgQ0JDX1Jlc3VsdFBvaW50KHhpIC0gQ09SUiwgeGogLSBDT1JSKTsNCisgICAgKCpyZXN1bHQpWzNdID0gbmV3IENCQ19SZXN1bHRQb2ludCh5aSArIENPUlIsIHlqIC0gQ09SUik7DQorICAgIHJldHVybiByZXN1bHQ7DQorICB9IGVsc2Ugew0KKyAgICBDRlhfUHRyQXJyYXkqIHJlc3VsdCA9IG5ldyBDRlhfUHRyQXJyYXk7DQorICAgIHJlc3VsdC0+U2V0U2l6ZSg0KTsNCisgICAgKCpyZXN1bHQpWzBdID0gbmV3IENCQ19SZXN1bHRQb2ludCh0aSArIENPUlIsIHRqICsgQ09SUik7DQorICAgICgqcmVzdWx0KVsxXSA9IG5ldyBDQkNfUmVzdWx0UG9pbnQoemkgKyBDT1JSLCB6aiAtIENPUlIpOw0KKyAgICAoKnJlc3VsdClbMl0gPSBuZXcgQ0JDX1Jlc3VsdFBvaW50KHhpIC0gQ09SUiwgeGogKyBDT1JSKTsNCisgICAgKCpyZXN1bHQpWzNdID0gbmV3IENCQ19SZXN1bHRQb2ludCh5aSAtIENPUlIsIHlqIC0gQ09SUik7DQorICAgIHJldHVybiByZXN1bHQ7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3I6OkNvbnRhaW5zQmxhY2tQb2ludChpbnQzMl90IGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmaXhlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBob3Jpem9udGFsKSB7DQorICBpZiAoaG9yaXpvbnRhbCkgew0KKyAgICBmb3IgKGludDMyX3QgeCA9IGE7IHggPD0gYjsgeCsrKSB7DQorICAgICAgaWYgKG1faW1hZ2UtPkdldCh4LCBmaXhlZCkpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgZm9yIChpbnQzMl90IHkgPSBhOyB5IDw9IGI7IHkrKykgew0KKyAgICAgIGlmIChtX2ltYWdlLT5HZXQoZml4ZWQsIHkpKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3IuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxMTJkMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yLmgKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19XSElURVJFQ1RBTkxFREVURUNUT1JfSF8NCisjZGVmaW5lIF9CQ19XSElURVJFQ1RBTkxFREVURUNUT1JfSF8NCitjbGFzcyBDQkNfQ29tbW9uQml0TWF0cml4Ow0KK2NsYXNzIENCQ19SZXN1bHRQb2ludDsNCitjbGFzcyBDQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3RvciB7DQorIHB1YmxpYzoNCisgIENCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yKENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlKTsNCisgIENCQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yKENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbml0U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeSk7DQorICB2aXJ0dWFsIH5DQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3RvcigpOw0KKyAgQ0ZYX1B0ckFycmF5KiBEZXRlY3QoaW50MzJfdCYgZSk7DQorICB2aXJ0dWFsIHZvaWQgSW5pdChpbnQzMl90JiBlKTsNCisNCisgcHJpdmF0ZToNCisgIGludDMyX3QgUm91bmQoZmxvYXQgZCk7DQorICBDQkNfUmVzdWx0UG9pbnQqIEdldEJsYWNrUG9pbnRPblNlZ21lbnQoRlhfRkxPQVQgYVgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYVksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYlgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYlkpOw0KKyAgaW50MzJfdCBEaXN0YW5jZUwyKEZYX0ZMT0FUIGFYLCBGWF9GTE9BVCBhWSwgRlhfRkxPQVQgYlgsIEZYX0ZMT0FUIGJZKTsNCisgIENGWF9QdHJBcnJheSogQ2VudGVyRWRnZXMoQ0JDX1Jlc3VsdFBvaW50KiB5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIHosDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiB0KTsNCisgIEZYX0JPT0wgQ29udGFpbnNCbGFja1BvaW50KGludDMyX3QgYSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZml4ZWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGhvcml6b250YWwpOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgSU5JVF9TSVpFOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09SUjsNCisNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIG1faW1hZ2U7DQorICBpbnQzMl90IG1faGVpZ2h0Ow0KKyAgaW50MzJfdCBtX3dpZHRoOw0KKyAgaW50MzJfdCBtX2xlZnRJbml0Ow0KKyAgaW50MzJfdCBtX3JpZ2h0SW5pdDsNCisgIGludDMyX3QgbV9kb3duSW5pdDsNCisgIGludDMyX3QgbV91cEluaXQ7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb24uY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTRhMmQ5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uLmNwcApAQCAtMCwwICsxLDEwMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgIkJDX1JlZWRTb2xvbW9uR0YyNTYuaCINCisjaW5jbHVkZSAiQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkuaCINCisjaW5jbHVkZSAiQkNfUmVlZFNvbG9tb24uaCINCitDQkNfUmVlZFNvbG9tb25FbmNvZGVyOjpDQkNfUmVlZFNvbG9tb25FbmNvZGVyKENCQ19SZWVkU29sb21vbkdGMjU2KiBmaWVsZCkgew0KKyAgbV9maWVsZCA9IGZpZWxkOw0KK30NCit2b2lkIENCQ19SZWVkU29sb21vbkVuY29kZXI6OkluaXQoKSB7DQorICBtX2NhY2hlZEdlbmVyYXRvcnMuQWRkKG5ldyBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkobV9maWVsZCwgMSkpOw0KK30NCitDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIENCQ19SZWVkU29sb21vbkVuY29kZXI6OkJ1aWxkR2VuZXJhdG9yKGludDMyX3QgZGVncmVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGRlZ3JlZSA+PSBtX2NhY2hlZEdlbmVyYXRvcnMuR2V0U2l6ZSgpKSB7DQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogbGFzdEdlbmVyYXRvciA9DQorICAgICAgICAoQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KikobV9jYWNoZWRHZW5lcmF0b3JzDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttX2NhY2hlZEdlbmVyYXRvcnMuR2V0U2l6ZSgpIC0gMV0pOw0KKyAgICBmb3IgKGludDMyX3QgZCA9IG1fY2FjaGVkR2VuZXJhdG9ycy5HZXRTaXplKCk7IGQgPD0gZGVncmVlOyBkKyspIHsNCisgICAgICBDRlhfSW50MzJBcnJheSB0ZW1wOw0KKyAgICAgIHRlbXAuQWRkKDEpOw0KKyAgICAgIHRlbXAuQWRkKG1fZmllbGQtPkV4cChkIC0gMSkpOw0KKyAgICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSB0ZW1wX3BvbHk7DQorICAgICAgdGVtcF9wb2x5LkluaXQobV9maWVsZCwgJnRlbXAsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIG5leHRHZW5lcmF0b3IgPQ0KKyAgICAgICAgICBsYXN0R2VuZXJhdG9yLT5NdWx0aXBseSgmdGVtcF9wb2x5LCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgbV9jYWNoZWRHZW5lcmF0b3JzLkFkZChuZXh0R2VuZXJhdG9yKTsNCisgICAgICBsYXN0R2VuZXJhdG9yID0gbmV4dEdlbmVyYXRvcjsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIChDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqKShtX2NhY2hlZEdlbmVyYXRvcnNbZGVncmVlXSk7DQorfQ0KK3ZvaWQgQ0JDX1JlZWRTb2xvbW9uRW5jb2Rlcjo6RW5jb2RlKENGWF9JbnQzMkFycmF5KiB0b0VuY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVjQnl0ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGVjQnl0ZXMgPT0gMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Ob0NvcnJlY3Rpb25CeXRlczsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBpbnQzMl90IGRhdGFCeXRlcyA9IHRvRW5jb2RlLT5HZXRTaXplKCkgLSBlY0J5dGVzOw0KKyAgaWYgKGRhdGFCeXRlcyA8PSAwKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk5vRGF0YUJ5dGVzUHJvdmlkZWQ7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBnZW5lcmF0b3IgPSBCdWlsZEdlbmVyYXRvcihlY0J5dGVzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgQ0ZYX0ludDMyQXJyYXkgaW5mb0NvZWZmaWNpZW50czsNCisgIGluZm9Db2VmZmljaWVudHMuU2V0U2l6ZShkYXRhQnl0ZXMpOw0KKyAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgZGF0YUJ5dGVzOyB4KyspIHsNCisgICAgaW5mb0NvZWZmaWNpZW50c1t4XSA9IHRvRW5jb2RlLT5vcGVyYXRvcltdKHgpOw0KKyAgfQ0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5IGluZm87DQorICBpbmZvLkluaXQobV9maWVsZCwgJmluZm9Db2VmZmljaWVudHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZyA9IGluZm8uTXVsdGlwbHlCeU1vbm9taWFsKGVjQnl0ZXMsIDEsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IGluZm9UZW1wKHJzZyk7DQorICBDRlhfUHRyQXJyYXkqIHBhID0gaW5mb1RlbXAtPkRpdmlkZShnZW5lcmF0b3IsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBDQkNfQXV0b1B0cjxDRlhfUHRyQXJyYXk+IHRlbXAocGEpOw0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByZW1haW5kZXIgPQ0KKyAgICAgIChDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqKSh0ZW1wLT5vcGVyYXRvcltdKDEpKTsNCisgIENGWF9JbnQzMkFycmF5KiBjb2VmZmljaWVudHMgPSByZW1haW5kZXItPkdldENvZWZmaWNpZW50cygpOw0KKyAgaW50MzJfdCBudW1aZXJvQ29lZmZpY2llbnRzID0gZWNCeXRlcyAtIGNvZWZmaWNpZW50cy0+R2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtWmVyb0NvZWZmaWNpZW50czsgaSsrKSB7DQorICAgICgqdG9FbmNvZGUpW2RhdGFCeXRlcyArIGldID0gMDsNCisgIH0NCisgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IGNvZWZmaWNpZW50cy0+R2V0U2l6ZSgpOyB5KyspIHsNCisgICAgKCp0b0VuY29kZSlbZGF0YUJ5dGVzICsgbnVtWmVyb0NvZWZmaWNpZW50cyArIHldID0NCisgICAgICAgIGNvZWZmaWNpZW50cy0+b3BlcmF0b3JbXSh5KTsNCisgIH0NCisgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IHRlbXAtPkdldFNpemUoKTsgaysrKSB7DQorICAgIGRlbGV0ZSAoQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KikoKnRlbXApW2tdOw0KKyAgfQ0KK30NCitDQkNfUmVlZFNvbG9tb25FbmNvZGVyOjp+Q0JDX1JlZWRTb2xvbW9uRW5jb2RlcigpIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fY2FjaGVkR2VuZXJhdG9ycy5HZXRTaXplKCk7IGkrKykgew0KKyAgICBkZWxldGUgKENCQ19SZWVkU29sb21vbkdGMjU2UG9seSopbV9jYWNoZWRHZW5lcmF0b3JzW2ldOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb24uaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MjU2MzYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb24uaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1JFQURTT0xPTU9OX0hfDQorI2RlZmluZSBfQkNfUkVBRFNPTE9NT05fSF8NCitjbGFzcyBDQkNfUmVlZFNvbG9tb25HRjI1NjsNCitjbGFzcyBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk7DQorY2xhc3MgQ0JDX1JlZWRTb2xvbW9uRW5jb2RlciB7DQorIHByaXZhdGU6DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NiogbV9maWVsZDsNCisgIENGWF9QdHJBcnJheSBtX2NhY2hlZEdlbmVyYXRvcnM7DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIEJ1aWxkR2VuZXJhdG9yKGludDMyX3QgZGVncmVlLCBpbnQzMl90JiBlKTsNCisNCisgcHVibGljOg0KKyAgQ0JDX1JlZWRTb2xvbW9uRW5jb2RlcihDQkNfUmVlZFNvbG9tb25HRjI1NiogZmllbGQpOw0KKyAgdmlydHVhbCB+Q0JDX1JlZWRTb2xvbW9uRW5jb2RlcigpOw0KKw0KKyAgdm9pZCBFbmNvZGUoQ0ZYX0ludDMyQXJyYXkqIHRvRW5jb2RlLCBpbnQzMl90IGVjQnl0ZXMsIGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCB2b2lkIEluaXQoKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkRlY29kZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uRGVjb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVlODdhNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkRlY29kZXIuY3BwCkBAIC0wLDAgKzEsMjM5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDA3IFpYaW5nIGF1dGhvcnMNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAiQkNfUmVlZFNvbG9tb25HRjI1Ni5oIg0KKyNpbmNsdWRlICJCQ19SZWVkU29sb21vbkdGMjU2UG9seS5oIg0KKyNpbmNsdWRlICJCQ19SZWVkU29sb21vbkRlY29kZXIuaCINCitDQkNfUmVlZFNvbG9tb25EZWNvZGVyOjpDQkNfUmVlZFNvbG9tb25EZWNvZGVyKENCQ19SZWVkU29sb21vbkdGMjU2KiBmaWVsZCkgew0KKyAgbV9maWVsZCA9IGZpZWxkOw0KK30NCitDQkNfUmVlZFNvbG9tb25EZWNvZGVyOjp+Q0JDX1JlZWRTb2xvbW9uRGVjb2RlcigpIHt9DQordm9pZCBDQkNfUmVlZFNvbG9tb25EZWNvZGVyOjpEZWNvZGUoQ0ZYX0ludDMyQXJyYXkqIHJlY2VpdmVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHdvUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkgcG9seTsNCisgIHBvbHkuSW5pdChtX2ZpZWxkLCByZWNlaXZlZCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIENGWF9JbnQzMkFycmF5IHN5bmRyb21lQ29lZmZpY2llbnRzOw0KKyAgc3luZHJvbWVDb2VmZmljaWVudHMuU2V0U2l6ZSh0d29TKTsNCisgIEZYX0JPT0wgZGF0YU1hdHJpeCA9IEZBTFNFOw0KKyAgRlhfQk9PTCBub0Vycm9yID0gVFJVRTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHR3b1M7IGkrKykgew0KKyAgICBpbnQzMl90IGV2YWwgPSBwb2x5LkV2YWx1YXRlQXQobV9maWVsZC0+RXhwKGRhdGFNYXRyaXggPyBpICsgMSA6IGkpKTsNCisgICAgc3luZHJvbWVDb2VmZmljaWVudHNbdHdvUyAtIDEgLSBpXSA9IGV2YWw7DQorICAgIGlmIChldmFsICE9IDApIHsNCisgICAgICBub0Vycm9yID0gRkFMU0U7DQorICAgIH0NCisgIH0NCisgIGlmIChub0Vycm9yKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSBzeW5kcm9tZTsNCisgIHN5bmRyb21lLkluaXQobV9maWVsZCwgJnN5bmRyb21lQ29lZmZpY2llbnRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2cgPSBtX2ZpZWxkLT5CdWlsZE1vbm9taWFsKHR3b1MsIDEsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHRlbXAocnNnKTsNCisgIENGWF9QdHJBcnJheSogcGEgPSBSdW5FdWNsaWRlYW5BbGdvcml0aG0odGVtcC5nZXQoKSwgJnN5bmRyb21lLCB0d29TLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgQ0JDX0F1dG9QdHI8Q0ZYX1B0ckFycmF5PiBzaWdtYU9tZWdhKHBhKTsNCisgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gc2lnbWEoDQorICAgICAgKENCQ19SZWVkU29sb21vbkdGMjU2UG9seSopKCpzaWdtYU9tZWdhKVswXSk7DQorICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IG9tZWdhKA0KKyAgICAgIChDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqKSgqc2lnbWFPbWVnYSlbMV0pOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIGlhMSA9IEZpbmRFcnJvckxvY2F0aW9ucyhzaWdtYS5nZXQoKSwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIENCQ19BdXRvUHRyPENGWF9JbnQzMkFycmF5PiBlcnJvckxvY2F0aW9ucyhpYTEpOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIGlhMiA9DQorICAgICAgRmluZEVycm9yTWFnbml0dWRlcyhvbWVnYS5nZXQoKSwgZXJyb3JMb2NhdGlvbnMuZ2V0KCksIGRhdGFNYXRyaXgsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBDQkNfQXV0b1B0cjxDRlhfSW50MzJBcnJheT4gZXJyb3JNYWduaXR1ZGVzKGlhMik7DQorICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBlcnJvckxvY2F0aW9ucy0+R2V0U2l6ZSgpOyBrKyspIHsNCisgICAgaW50MzJfdCBwb3NpdGlvbiA9DQorICAgICAgICByZWNlaXZlZC0+R2V0U2l6ZSgpIC0gMSAtIG1fZmllbGQtPkxvZygoKmVycm9yTG9jYXRpb25zKVtrXSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBpZiAocG9zaXRpb24gPCAwKSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uQmFkRXJyb3JMb2NhdGlvbjsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KKyAgICAoKnJlY2VpdmVkKVtwb3NpdGlvbl0gPSBDQkNfUmVlZFNvbG9tb25HRjI1Njo6QWRkT3JTdWJ0cmFjdCgNCisgICAgICAgICgqcmVjZWl2ZWQpW3Bvc2l0aW9uXSwgKCplcnJvck1hZ25pdHVkZXMpW2tdKTsNCisgIH0NCit9DQorQ0ZYX1B0ckFycmF5KiBDQkNfUmVlZFNvbG9tb25EZWNvZGVyOjpSdW5FdWNsaWRlYW5BbGdvcml0aG0oDQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogYSwNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBiLA0KKyAgICBpbnQzMl90IFIsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChhLT5HZXREZWdyZWUoKSA8IGItPkdldERlZ3JlZSgpKSB7DQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogdGVtcCA9IGE7DQorICAgIGEgPSBiOw0KKyAgICBiID0gdGVtcDsNCisgIH0NCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNnMSA9IGEtPkNsb25lKGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiByTGFzdChyc2cxKTsNCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNnMiA9IGItPkNsb25lKGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiByKHJzZzIpOw0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2czID0gbV9maWVsZC0+R2V0T25lKCktPkNsb25lKGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBzTGFzdChyc2czKTsNCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNnNCA9IG1fZmllbGQtPkdldFplcm8oKS0+Q2xvbmUoZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHMocnNnNCk7DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZzUgPSBtX2ZpZWxkLT5HZXRaZXJvKCktPkNsb25lKGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiB0TGFzdChyc2c1KTsNCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNnNiA9IG1fZmllbGQtPkdldE9uZSgpLT5DbG9uZShlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdChyc2c2KTsNCisgIHdoaWxlIChyLT5HZXREZWdyZWUoKSA+PSBSIC8gMikgew0KKyAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHJMYXN0TGFzdCA9IHJMYXN0Ow0KKyAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHNMYXN0TGFzdCA9IHNMYXN0Ow0KKyAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHRMYXN0bGFzdCA9IHRMYXN0Ow0KKyAgICByTGFzdCA9IHI7DQorICAgIHNMYXN0ID0gczsNCisgICAgdExhc3QgPSB0Ow0KKyAgICBpZiAockxhc3QtPklzWmVybygpKSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uUl9JXzFJc1plcm87DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICB9DQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNnNyA9IHJMYXN0TGFzdC0+Q2xvbmUoZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiByVGVtcChyc2c3KTsNCisgICAgciA9IHJUZW1wOw0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZzggPSBtX2ZpZWxkLT5HZXRaZXJvKCktPkNsb25lKGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gcShyc2c4KTsNCisgICAgaW50MzJfdCBkZW5vbWluYXRvckxlYWRpbmdUZXJtID0gckxhc3QtPkdldENvZWZmaWNpZW50cyhyTGFzdC0+R2V0RGVncmVlKCkpOw0KKyAgICBpbnQzMl90IGRsdEludmVyc2UgPSBtX2ZpZWxkLT5JbnZlcnNlKGRlbm9taW5hdG9yTGVhZGluZ1Rlcm0sIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIHdoaWxlIChyLT5HZXREZWdyZWUoKSA+PSByTGFzdC0+R2V0RGVncmVlKCkgJiYgIShyLT5Jc1plcm8oKSkpIHsNCisgICAgICBpbnQzMl90IGRlZ3JlZURpZmYgPSByLT5HZXREZWdyZWUoKSAtIHJMYXN0LT5HZXREZWdyZWUoKTsNCisgICAgICBpbnQzMl90IHNjYWxlID0NCisgICAgICAgICAgbV9maWVsZC0+TXVsdGlwbHkoci0+R2V0Q29lZmZpY2llbnRzKHItPkdldERlZ3JlZSgpKSwgZGx0SW52ZXJzZSk7DQorICAgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2dwMSA9DQorICAgICAgICAgIG1fZmllbGQtPkJ1aWxkTW9ub21pYWwoZGVncmVlRGlmZiwgc2NhbGUsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IGJ1aWxkKHJzZ3AxKTsNCisgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZ3AyID0gcS0+QWRkT3JTdWJ0cmFjdChidWlsZC5nZXQoKSwgZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdGVtcChyc2dwMik7DQorICAgICAgcSA9IHRlbXA7DQorICAgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2dwMyA9DQorICAgICAgICAgIHJMYXN0LT5NdWx0aXBseUJ5TW9ub21pYWwoZGVncmVlRGlmZiwgc2NhbGUsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IG11bHRpcGx5KHJzZ3AzKTsNCisgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZ3A0ID0gci0+QWRkT3JTdWJ0cmFjdChtdWx0aXBseS5nZXQoKSwgZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdGVtcDMocnNncDQpOw0KKyAgICAgIHIgPSB0ZW1wMzsNCisgICAgfQ0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZzkgPSBxLT5NdWx0aXBseShzTGFzdC5nZXQoKSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiB0ZW1wMShyc2c5KTsNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2cxMCA9IHRlbXAxLT5BZGRPclN1YnRyYWN0KHNMYXN0TGFzdC5nZXQoKSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiB0ZW1wMihyc2cxMCk7DQorICAgIHMgPSB0ZW1wMjsNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2cxMSA9IHEtPk11bHRpcGx5KHRMYXN0LmdldCgpLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHRlbXA1KHJzZzExKTsNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2cxMiA9IHRlbXA1LT5BZGRPclN1YnRyYWN0KHRMYXN0bGFzdC5nZXQoKSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiB0ZW1wNihyc2cxMik7DQorICAgIHQgPSB0ZW1wNjsNCisgIH0NCisgIGludDMyX3Qgc2lnbWFUaWxkZUF0WmVybyA9IHQtPkdldENvZWZmaWNpZW50cygwKTsNCisgIGlmIChzaWdtYVRpbGRlQXRaZXJvID09IDApIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uSXNaZXJvOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICB9DQorICBpbnQzMl90IGludmVyc2UgPSBtX2ZpZWxkLT5JbnZlcnNlKHNpZ21hVGlsZGVBdFplcm8sIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2cxMyA9IHQtPk11bHRpcGx5KGludmVyc2UsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgQ0JDX0F1dG9QdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBzaWdtYShyc2cxMyk7DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZzE0ID0gci0+TXVsdGlwbHkoaW52ZXJzZSwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IG9tZWdhKHJzZzE0KTsNCisgIENGWF9QdHJBcnJheSogdGVtcCA9IG5ldyBDRlhfUHRyQXJyYXk7DQorICB0ZW1wLT5BZGQoc2lnbWEucmVsZWFzZSgpKTsNCisgIHRlbXAtPkFkZChvbWVnYS5yZWxlYXNlKCkpOw0KKyAgcmV0dXJuIHRlbXA7DQorfQ0KK0NGWF9JbnQzMkFycmF5KiBDQkNfUmVlZFNvbG9tb25EZWNvZGVyOjpGaW5kRXJyb3JMb2NhdGlvbnMoDQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogZXJyb3JMb2NhdG9yLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IG51bUVycm9ycyA9IGVycm9yTG9jYXRvci0+R2V0RGVncmVlKCk7DQorICBpZiAobnVtRXJyb3JzID09IDEpIHsNCisgICAgQ0JDX0F1dG9QdHI8Q0ZYX0ludDMyQXJyYXk+IHRlbXAobmV3IENGWF9JbnQzMkFycmF5KTsNCisgICAgdGVtcC0+QWRkKGVycm9yTG9jYXRvci0+R2V0Q29lZmZpY2llbnRzKDEpKTsNCisgICAgcmV0dXJuIHRlbXAucmVsZWFzZSgpOw0KKyAgfQ0KKyAgQ0ZYX0ludDMyQXJyYXkqIHRlbXBUID0gbmV3IENGWF9JbnQzMkFycmF5Ow0KKyAgdGVtcFQtPlNldFNpemUobnVtRXJyb3JzKTsNCisgIENCQ19BdXRvUHRyPENGWF9JbnQzMkFycmF5PiByZXN1bHQodGVtcFQpOw0KKyAgaW50MzJfdCBpZSA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCAyNTYgJiYgaWUgPCBudW1FcnJvcnM7IGkrKykgew0KKyAgICBpZiAoZXJyb3JMb2NhdG9yLT5FdmFsdWF0ZUF0KGkpID09IDApIHsNCisgICAgICAoKnJlc3VsdClbaWVdID0gbV9maWVsZC0+SW52ZXJzZShpLCBpZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgIGllKys7DQorICAgIH0NCisgIH0NCisgIGlmIChpZSAhPSBudW1FcnJvcnMpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uRGVncmVlTm90TWF0Y2hSb290czsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgfQ0KKyAgcmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7DQorfQ0KK0NGWF9JbnQzMkFycmF5KiBDQkNfUmVlZFNvbG9tb25EZWNvZGVyOjpGaW5kRXJyb3JNYWduaXR1ZGVzKA0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIGVycm9yRXZhbHVhdG9yLA0KKyAgICBDRlhfSW50MzJBcnJheSogZXJyb3JMb2NhdGlvbnMsDQorICAgIEZYX0JPT0wgZGF0YU1hdHJpeCwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBzID0gZXJyb3JMb2NhdGlvbnMtPkdldFNpemUoKTsNCisgIENGWF9JbnQzMkFycmF5KiB0ZW1wID0gbmV3IENGWF9JbnQzMkFycmF5Ow0KKyAgdGVtcC0+U2V0U2l6ZShzKTsNCisgIENCQ19BdXRvUHRyPENGWF9JbnQzMkFycmF5PiByZXN1bHQodGVtcCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzOyBpKyspIHsNCisgICAgaW50MzJfdCB4aUludmVyc2UgPSBtX2ZpZWxkLT5JbnZlcnNlKGVycm9yTG9jYXRpb25zLT5vcGVyYXRvcltdKGkpLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICBpbnQzMl90IGRlbm9taW5hdG9yID0gMTsNCisgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgczsgaisrKSB7DQorICAgICAgaWYgKGkgIT0gaikgew0KKyAgICAgICAgZGVub21pbmF0b3IgPSBtX2ZpZWxkLT5NdWx0aXBseSgNCisgICAgICAgICAgICBkZW5vbWluYXRvciwgQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkFkZE9yU3VidHJhY3QoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBtX2ZpZWxkLT5NdWx0aXBseShlcnJvckxvY2F0aW9ucy0+b3BlcmF0b3JbXShqKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhpSW52ZXJzZSkpKTsNCisgICAgICB9DQorICAgIH0NCisgICAgaW50MzJfdCB0ZW1wID0gbV9maWVsZC0+SW52ZXJzZShkZW5vbWluYXRvciwgdGVtcCk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgKCpyZXN1bHQpW2ldID0NCisgICAgICAgIG1fZmllbGQtPk11bHRpcGx5KGVycm9yRXZhbHVhdG9yLT5FdmFsdWF0ZUF0KHhpSW52ZXJzZSksIHRlbXApOw0KKyAgfQ0KKyAgcmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkRlY29kZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkRlY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDc3NTVjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uRGVjb2Rlci5oCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUkVFRFNPTE9NT05ERUNPREVSX0hfDQorI2RlZmluZSBfQkNfUkVFRFNPTE9NT05ERUNPREVSX0hfDQorY2xhc3MgQ0JDX1JlZWRTb2xvbW9uR0YyNTY7DQorY2xhc3MgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5Ow0KK2NsYXNzIENCQ19SZWVkU29sb21vbkRlY29kZXIgew0KKyBwcml2YXRlOg0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTYqIG1fZmllbGQ7DQorDQorIHB1YmxpYzoNCisgIENCQ19SZWVkU29sb21vbkRlY29kZXIoQ0JDX1JlZWRTb2xvbW9uR0YyNTYqIGZpZWxkKTsNCisgIHZpcnR1YWwgfkNCQ19SZWVkU29sb21vbkRlY29kZXIoKTsNCisgIHZvaWQgRGVjb2RlKENGWF9JbnQzMkFycmF5KiByZWNlaXZlZCwgaW50MzJfdCB0d29TLCBpbnQzMl90JiBlKTsNCisgIENGWF9QdHJBcnJheSogUnVuRXVjbGlkZWFuQWxnb3JpdGhtKENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogYSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIEZpbmRFcnJvckxvY2F0aW9ucyhDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIGVycm9yTG9jYXRvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBDRlhfSW50MzJBcnJheSogRmluZEVycm9yTWFnbml0dWRlcyhDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIGVycm9yRXZhbHVhdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIGVycm9yTG9jYXRpb25zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBkYXRhTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1Ni5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1Ni5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk1N2NhNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2LmNwcApAQCAtMCwwICsxLDEzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgIkJDX1JlZWRTb2xvbW9uR0YyNTZQb2x5LmgiDQorI2luY2x1ZGUgIkJDX1JlZWRTb2xvbW9uR0YyNTYuaCINCitDQkNfUmVlZFNvbG9tb25HRjI1NiogQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OlFSQ29kZUZpbGQgPSBOVUxMOw0KK0NCQ19SZWVkU29sb21vbkdGMjU2KiBDQkNfUmVlZFNvbG9tb25HRjI1Njo6RGF0YU1hdHJpeEZpZWxkID0gTlVMTDsNCit2b2lkIENCQ19SZWVkU29sb21vbkdGMjU2OjpJbml0aWFsaXplKCkgew0KKyAgUVJDb2RlRmlsZCA9IG5ldyBDQkNfUmVlZFNvbG9tb25HRjI1NigweDAxMUQpOw0KKyAgUVJDb2RlRmlsZC0+SW5pdCgpOw0KKyAgRGF0YU1hdHJpeEZpZWxkID0gbmV3IENCQ19SZWVkU29sb21vbkdGMjU2KDB4MDEyRCk7DQorICBEYXRhTWF0cml4RmllbGQtPkluaXQoKTsNCit9DQordm9pZCBDQkNfUmVlZFNvbG9tb25HRjI1Njo6RmluYWxpemUoKSB7DQorICBpZiAoUVJDb2RlRmlsZCkgew0KKyAgICBkZWxldGUgUVJDb2RlRmlsZDsNCisgIH0NCisgIFFSQ29kZUZpbGQgPSBOVUxMOw0KKyAgaWYgKERhdGFNYXRyaXhGaWVsZCkgew0KKyAgICBkZWxldGUgRGF0YU1hdHJpeEZpZWxkOw0KKyAgfQ0KKyAgRGF0YU1hdHJpeEZpZWxkID0gTlVMTDsNCit9DQorQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkNCQ19SZWVkU29sb21vbkdGMjU2KGludDMyX3QgcHJpbWl0aXZlKSB7DQorICBpbnQzMl90IHggPSAxOw0KKyAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgMjU2OyBqKyspIHsNCisgICAgbV9leHBUYWJsZVtqXSA9IHg7DQorICAgIHggPDw9IDE7DQorICAgIGlmICh4ID49IDB4MTAwKSB7DQorICAgICAgeCBePSBwcmltaXRpdmU7DQorICAgIH0NCisgIH0NCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDI1NTsgaSsrKSB7DQorICAgIG1fbG9nVGFibGVbbV9leHBUYWJsZVtpXV0gPSBpOw0KKyAgfQ0KKyAgbV9sb2dUYWJsZVswXSA9IDA7DQorfQ0KK3ZvaWQgQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkluaXQoKSB7DQorICBtX3plcm8gPSBuZXcgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KHRoaXMsIDApOw0KKyAgbV9vbmUgPSBuZXcgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KHRoaXMsIDEpOw0KK30NCitDQkNfUmVlZFNvbG9tb25HRjI1Njo6fkNCQ19SZWVkU29sb21vbkdGMjU2KCkgew0KKyAgaWYgKG1femVybyAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBtX3plcm87DQorICAgIG1femVybyA9IE5VTEw7DQorICB9DQorICBpZiAobV9vbmUgIT0gTlVMTCkgew0KKyAgICBkZWxldGUgbV9vbmU7DQorICAgIG1fb25lID0gTlVMTDsNCisgIH0NCit9DQorQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBDQkNfUmVlZFNvbG9tb25HRjI1Njo6R2V0WmVybygpIHsNCisgIHJldHVybiBtX3plcm87DQorfQ0KK0NCQ19SZWVkU29sb21vbkdGMjU2UG9seSogQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkdldE9uZSgpIHsNCisgIHJldHVybiBtX29uZTsNCit9DQorQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBDQkNfUmVlZFNvbG9tb25HRjI1Njo6QnVpbGRNb25vbWlhbCgNCisgICAgaW50MzJfdCBkZWdyZWUsDQorICAgIGludDMyX3QgY29lZmZpY2llbnQsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChkZWdyZWUgPCAwKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkRlZ3JlZUlzTmVnYXRpdmU7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIH0NCisgIGlmIChjb2VmZmljaWVudCA9PSAwKSB7DQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogdGVtcCA9IG1femVyby0+Q2xvbmUoZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgcmV0dXJuIHRlbXA7DQorICB9DQorICBDRlhfSW50MzJBcnJheSBjb2VmZmljaWVudHM7DQorICBjb2VmZmljaWVudHMuU2V0U2l6ZShkZWdyZWUgKyAxKTsNCisgIGNvZWZmaWNpZW50c1swXSA9IGNvZWZmaWNpZW50Ow0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiB0ZW1wID0gbmV3IENCQ19SZWVkU29sb21vbkdGMjU2UG9seSgpOw0KKyAgdGVtcC0+SW5pdCh0aGlzLCAmY29lZmZpY2llbnRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiB0ZW1wOw0KK30NCitpbnQzMl90IENCQ19SZWVkU29sb21vbkdGMjU2OjpBZGRPclN1YnRyYWN0KGludDMyX3QgYSwgaW50MzJfdCBiKSB7DQorICByZXR1cm4gYSBeIGI7DQorfQ0KK2ludDMyX3QgQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkV4cChpbnQzMl90IGEpIHsNCisgIHJldHVybiBtX2V4cFRhYmxlW2FdOw0KK30NCitpbnQzMl90IENCQ19SZWVkU29sb21vbkdGMjU2OjpMb2coaW50MzJfdCBhLCBpbnQzMl90JiBlKSB7DQorICBpZiAoYSA9PSAwKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkFJc1plcm87DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCisgIH0NCisgIHJldHVybiBtX2xvZ1RhYmxlW2FdOw0KK30NCitpbnQzMl90IENCQ19SZWVkU29sb21vbkdGMjU2OjpJbnZlcnNlKGludDMyX3QgYSwgaW50MzJfdCYgZSkgew0KKyAgaWYgKGEgPT0gMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25BSXNaZXJvOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICB9DQorICByZXR1cm4gbV9leHBUYWJsZVsyNTUgLSBtX2xvZ1RhYmxlW2FdXTsNCit9DQoraW50MzJfdCBDQkNfUmVlZFNvbG9tb25HRjI1Njo6TXVsdGlwbHkoaW50MzJfdCBhLCBpbnQzMl90IGIpIHsNCisgIGlmIChhID09IDAgfHwgYiA9PSAwKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaWYgKGEgPT0gMSkgew0KKyAgICByZXR1cm4gYjsNCisgIH0NCisgIGlmIChiID09IDEpIHsNCisgICAgcmV0dXJuIGE7DQorICB9DQorICByZXR1cm4gbV9leHBUYWJsZVsobV9sb2dUYWJsZVthXSArIG1fbG9nVGFibGVbYl0pICUgMjU1XTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTYuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThlMmY5ZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2LmgKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19SRUVEU09MT01PTkdGMjU2X0hfDQorI2RlZmluZSBfQkNfUkVFRFNPTE9NT05HRjI1Nl9IXw0KK2NsYXNzIENCQ19SZWVkU29sb21vbkdGMjU2UG9seTsNCitjbGFzcyBDQkNfUmVlZFNvbG9tb25HRjI1NiB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsNCisgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7DQorICBzdGF0aWMgQ0JDX1JlZWRTb2xvbW9uR0YyNTYqIFFSQ29kZUZpbGQ7DQorICBzdGF0aWMgQ0JDX1JlZWRTb2xvbW9uR0YyNTYqIERhdGFNYXRyaXhGaWVsZDsNCisgIENCQ19SZWVkU29sb21vbkdGMjU2KGludDMyX3QgcHJpbWl0aXZlKTsNCisgIHZpcnR1YWwgfkNCQ19SZWVkU29sb21vbkdGMjU2KCk7DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIEdldFplcm8oKTsNCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogR2V0T25lKCk7DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIEJ1aWxkTW9ub21pYWwoaW50MzJfdCBkZWdyZWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2VmZmljaWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBpbnQzMl90IEFkZE9yU3VidHJhY3QoaW50MzJfdCBhLCBpbnQzMl90IGIpOw0KKyAgaW50MzJfdCBFeHAoaW50MzJfdCBhKTsNCisgIGludDMyX3QgTG9nKGludDMyX3QgYSwgaW50MzJfdCYgZSk7DQorICBpbnQzMl90IEludmVyc2UoaW50MzJfdCBhLCBpbnQzMl90JiBlKTsNCisgIGludDMyX3QgTXVsdGlwbHkoaW50MzJfdCBhLCBpbnQzMl90IGIpOw0KKyAgdmlydHVhbCB2b2lkIEluaXQoKTsNCisNCisgcHJpdmF0ZToNCisgIGludDMyX3QgbV9leHBUYWJsZVsyNTZdOw0KKyAgaW50MzJfdCBtX2xvZ1RhYmxlWzI1Nl07DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIG1femVybzsNCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogbV9vbmU7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODdjZDViCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5LmNwcApAQCAtMCwwICsxLDI1OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgIkJDX1JlZWRTb2xvbW9uR0YyNTYuaCINCisjaW5jbHVkZSAiQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkuaCINCitDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkNCQ19SZWVkU29sb21vbkdGMjU2UG9seShDQkNfUmVlZFNvbG9tb25HRjI1NiogZmllbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2VmZmljaWVudHMpIHsNCisgIGlmIChmaWVsZCA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIG1fZmllbGQgPSBmaWVsZDsNCisgIG1fY29lZmZpY2llbnRzLkFkZChjb2VmZmljaWVudHMpOw0KK30NCitDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkNCQ19SZWVkU29sb21vbkdGMjU2UG9seSgpIHsNCisgIG1fZmllbGQgPSBOVUxMOw0KK30NCit2b2lkIENCQ19SZWVkU29sb21vbkdGMjU2UG9seTo6SW5pdChDQkNfUmVlZFNvbG9tb25HRjI1NiogZmllbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIGNvZWZmaWNpZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoY29lZmZpY2llbnRzID09IE5VTEwgfHwgY29lZmZpY2llbnRzLT5HZXRTaXplKCkgPT0gMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Db2VmZmljaWVudHNTaXplSXNOdWxsOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCisgIG1fZmllbGQgPSBmaWVsZDsNCisgIGludDMyX3QgY29lZmZpY2llbnRzTGVuZ3RoID0gY29lZmZpY2llbnRzLT5HZXRTaXplKCk7DQorICBpZiAoKGNvZWZmaWNpZW50c0xlbmd0aCA+IDEgJiYgKCpjb2VmZmljaWVudHMpWzBdID09IDApKSB7DQorICAgIGludDMyX3QgZmlyc3ROb25aZXJvID0gMTsNCisgICAgd2hpbGUgKChmaXJzdE5vblplcm8gPCBjb2VmZmljaWVudHNMZW5ndGgpICYmDQorICAgICAgICAgICAoKCpjb2VmZmljaWVudHMpW2ZpcnN0Tm9uWmVyb10gPT0gMCkpIHsNCisgICAgICBmaXJzdE5vblplcm8rKzsNCisgICAgfQ0KKyAgICBpZiAoZmlyc3ROb25aZXJvID09IGNvZWZmaWNpZW50c0xlbmd0aCkgew0KKyAgICAgIG1fY29lZmZpY2llbnRzLkNvcHkoKihtX2ZpZWxkLT5HZXRaZXJvKCktPkdldENvZWZmaWNpZW50cygpKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgbV9jb2VmZmljaWVudHMuU2V0U2l6ZShjb2VmZmljaWVudHNMZW5ndGggLSBmaXJzdE5vblplcm8pOw0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gZmlyc3ROb25aZXJvLCBqID0gMDsgaSA8IGNvZWZmaWNpZW50c0xlbmd0aDsgaSsrLCBqKyspIHsNCisgICAgICAgIG1fY29lZmZpY2llbnRzW2pdID0gY29lZmZpY2llbnRzLT5vcGVyYXRvcltdKGkpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgbV9jb2VmZmljaWVudHMuQ29weSgqY29lZmZpY2llbnRzKTsNCisgIH0NCit9DQorQ0ZYX0ludDMyQXJyYXkqIENCQ19SZWVkU29sb21vbkdGMjU2UG9seTo6R2V0Q29lZmZpY2llbnRzKCkgew0KKyAgcmV0dXJuICZtX2NvZWZmaWNpZW50czsNCit9DQoraW50MzJfdCBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkdldERlZ3JlZSgpIHsNCisgIHJldHVybiBtX2NvZWZmaWNpZW50cy5HZXRTaXplKCkgLSAxOw0KK30NCitGWF9CT09MIENCQ19SZWVkU29sb21vbkdGMjU2UG9seTo6SXNaZXJvKCkgew0KKyAgcmV0dXJuIG1fY29lZmZpY2llbnRzWzBdID09IDA7DQorfQ0KK2ludDMyX3QgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpHZXRDb2VmZmljaWVudHMoaW50MzJfdCBkZWdyZWUpIHsNCisgIHJldHVybiBtX2NvZWZmaWNpZW50c1ttX2NvZWZmaWNpZW50cy5HZXRTaXplKCkgLSAxIC0gZGVncmVlXTsNCit9DQoraW50MzJfdCBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkV2YWx1YXRlQXQoaW50MzJfdCBhKSB7DQorICBpZiAoYSA9PSAwKSB7DQorICAgIHJldHVybiBHZXRDb2VmZmljaWVudHMoMCk7DQorICB9DQorICBpbnQzMl90IHNpemUgPSBtX2NvZWZmaWNpZW50cy5HZXRTaXplKCk7DQorICBpZiAoYSA9PSAxKSB7DQorICAgIGludDMyX3QgcmVzdWx0ID0gMDsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7DQorICAgICAgcmVzdWx0ID0gQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkFkZE9yU3VidHJhY3QocmVzdWx0LCBtX2NvZWZmaWNpZW50c1tpXSk7DQorICAgIH0NCisgICAgcmV0dXJuIHJlc3VsdDsNCisgIH0NCisgIGludDMyX3QgcmVzdWx0ID0gbV9jb2VmZmljaWVudHNbMF07DQorICBmb3IgKGludDMyX3QgaiA9IDE7IGogPCBzaXplOyBqKyspIHsNCisgICAgcmVzdWx0ID0gQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkFkZE9yU3VidHJhY3QobV9maWVsZC0+TXVsdGlwbHkoYSwgcmVzdWx0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb2VmZmljaWVudHNbal0pOw0KKyAgfQ0KKyAgcmV0dXJuIHJlc3VsdDsNCit9DQorQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkNsb25lKGludDMyX3QmIGUpIHsNCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogdGVtcCA9IG5ldyBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoKTsNCisgIHRlbXAtPkluaXQobV9maWVsZCwgJm1fY29lZmZpY2llbnRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiB0ZW1wOw0KK30NCitDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIENCQ19SZWVkU29sb21vbkdGMjU2UG9seTo6QWRkT3JTdWJ0cmFjdCgNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBvdGhlciwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKElzWmVybygpKSB7DQorICAgIHJldHVybiBvdGhlci0+Q2xvbmUoZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIH0NCisgIGlmIChvdGhlci0+SXNaZXJvKCkpIHsNCisgICAgcmV0dXJuIHRoaXMtPkNsb25lKGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICB9DQorICBDRlhfSW50MzJBcnJheSBzbWFsbGVyQ29lZmZpY2llbnRzOw0KKyAgc21hbGxlckNvZWZmaWNpZW50cy5Db3B5KG1fY29lZmZpY2llbnRzKTsNCisgIENGWF9JbnQzMkFycmF5IGxhcmdlckNvZWZmaWNpZW50czsNCisgIGxhcmdlckNvZWZmaWNpZW50cy5Db3B5KCoob3RoZXItPkdldENvZWZmaWNpZW50cygpKSk7DQorICBpZiAoc21hbGxlckNvZWZmaWNpZW50cy5HZXRTaXplKCkgPiBsYXJnZXJDb2VmZmljaWVudHMuR2V0U2l6ZSgpKSB7DQorICAgIENGWF9JbnQzMkFycmF5IHRlbXA7DQorICAgIHRlbXAuQ29weShzbWFsbGVyQ29lZmZpY2llbnRzKTsNCisgICAgc21hbGxlckNvZWZmaWNpZW50cy5Db3B5KGxhcmdlckNvZWZmaWNpZW50cyk7DQorICAgIGxhcmdlckNvZWZmaWNpZW50cy5Db3B5KHRlbXApOw0KKyAgfQ0KKyAgQ0ZYX0ludDMyQXJyYXkgc3VtRGlmZjsNCisgIHN1bURpZmYuU2V0U2l6ZShsYXJnZXJDb2VmZmljaWVudHMuR2V0U2l6ZSgpKTsNCisgIGludDMyX3QgbGVuZ3RoRGlmZiA9DQorICAgICAgbGFyZ2VyQ29lZmZpY2llbnRzLkdldFNpemUoKSAtIHNtYWxsZXJDb2VmZmljaWVudHMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbGVuZ3RoRGlmZjsgaSsrKSB7DQorICAgIHN1bURpZmZbaV0gPSBsYXJnZXJDb2VmZmljaWVudHNbaV07DQorICB9DQorICBmb3IgKGludDMyX3QgaiA9IGxlbmd0aERpZmY7IGogPCBsYXJnZXJDb2VmZmljaWVudHMuR2V0U2l6ZSgpOyBqKyspIHsNCisgICAgc3VtRGlmZltqXSA9IChDQkNfUmVlZFNvbG9tb25HRjI1Njo6QWRkT3JTdWJ0cmFjdCgNCisgICAgICAgIHNtYWxsZXJDb2VmZmljaWVudHNbaiAtIGxlbmd0aERpZmZdLCBsYXJnZXJDb2VmZmljaWVudHNbal0pKTsNCisgIH0NCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogdGVtcCA9IG5ldyBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoKTsNCisgIHRlbXAtPkluaXQobV9maWVsZCwgJnN1bURpZmYsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIHRlbXA7DQorfQ0KK0NCQ19SZWVkU29sb21vbkdGMjU2UG9seSogQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpNdWx0aXBseSgNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBvdGhlciwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKElzWmVybygpIHx8IG90aGVyLT5Jc1plcm8oKSkgew0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHRlbXAgPSBtX2ZpZWxkLT5HZXRaZXJvKCktPkNsb25lKGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIHJldHVybiB0ZW1wOw0KKyAgfQ0KKyAgQ0ZYX0ludDMyQXJyYXkgYUNvZWZmaWNpZW50czsNCisgIGFDb2VmZmljaWVudHMuQ29weShtX2NvZWZmaWNpZW50cyk7DQorICBpbnQzMl90IGFMZW5ndGggPSBtX2NvZWZmaWNpZW50cy5HZXRTaXplKCk7DQorICBDRlhfSW50MzJBcnJheSBiQ29lZmZpY2llbnRzOw0KKyAgYkNvZWZmaWNpZW50cy5Db3B5KCoob3RoZXItPkdldENvZWZmaWNpZW50cygpKSk7DQorICBpbnQzMl90IGJMZW5ndGggPSBvdGhlci0+R2V0Q29lZmZpY2llbnRzKCktPkdldFNpemUoKTsNCisgIENGWF9JbnQzMkFycmF5IHByb2R1Y3Q7DQorICBwcm9kdWN0LlNldFNpemUoYUxlbmd0aCArIGJMZW5ndGggLSAxKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFMZW5ndGg7IGkrKykgew0KKyAgICBpbnQzMl90IGFDb2VmZiA9IG1fY29lZmZpY2llbnRzW2ldOw0KKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBiTGVuZ3RoOyBqKyspIHsNCisgICAgICBwcm9kdWN0W2kgKyBqXSA9IENCQ19SZWVkU29sb21vbkdGMjU2OjpBZGRPclN1YnRyYWN0KA0KKyAgICAgICAgICBwcm9kdWN0W2kgKyBqXSwNCisgICAgICAgICAgbV9maWVsZC0+TXVsdGlwbHkoYUNvZWZmLCBvdGhlci0+R2V0Q29lZmZpY2llbnRzKCktPm9wZXJhdG9yW10oaikpKTsNCisgICAgfQ0KKyAgfQ0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiB0ZW1wID0gbmV3IENCQ19SZWVkU29sb21vbkdGMjU2UG9seSgpOw0KKyAgdGVtcC0+SW5pdChtX2ZpZWxkLCAmcHJvZHVjdCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gdGVtcDsNCit9DQorQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6Ok11bHRpcGx5KGludDMyX3Qgc2NhbGFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoc2NhbGFyID09IDApIHsNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiB0ZW1wID0gbV9maWVsZC0+R2V0WmVybygpLT5DbG9uZShlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICByZXR1cm4gdGVtcDsNCisgIH0NCisgIGlmIChzY2FsYXIgPT0gMSkgew0KKyAgICByZXR1cm4gdGhpcy0+Q2xvbmUoZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIH0NCisgIGludDMyX3Qgc2l6ZSA9IG1fY29lZmZpY2llbnRzLkdldFNpemUoKTsNCisgIENGWF9JbnQzMkFycmF5IHByb2R1Y3Q7DQorICBwcm9kdWN0LlNldFNpemUoc2l6ZSk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsNCisgICAgcHJvZHVjdFtpXSA9IG1fZmllbGQtPk11bHRpcGx5KG1fY29lZmZpY2llbnRzW2ldLCBzY2FsYXIpOw0KKyAgfQ0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiB0ZW1wID0gbmV3IENCQ19SZWVkU29sb21vbkdGMjU2UG9seSgpOw0KKyAgdGVtcC0+SW5pdChtX2ZpZWxkLCAmcHJvZHVjdCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gdGVtcDsNCit9DQorQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6Ok11bHRpcGx5QnlNb25vbWlhbCgNCisgICAgaW50MzJfdCBkZWdyZWUsDQorICAgIGludDMyX3QgY29lZmZpY2llbnQsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChkZWdyZWUgPCAwKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkRlZ3JlZUlzTmVnYXRpdmU7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIH0NCisgIGlmIChjb2VmZmljaWVudCA9PSAwKSB7DQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogdGVtcCA9IG1fZmllbGQtPkdldFplcm8oKS0+Q2xvbmUoZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgcmV0dXJuIHRlbXA7DQorICB9DQorICBpbnQzMl90IHNpemUgPSBtX2NvZWZmaWNpZW50cy5HZXRTaXplKCk7DQorICBDRlhfSW50MzJBcnJheSBwcm9kdWN0Ow0KKyAgcHJvZHVjdC5TZXRTaXplKHNpemUgKyBkZWdyZWUpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7DQorICAgIHByb2R1Y3RbaV0gPSAobV9maWVsZC0+TXVsdGlwbHkobV9jb2VmZmljaWVudHNbaV0sIGNvZWZmaWNpZW50KSk7DQorICB9DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHRlbXAgPSBuZXcgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KCk7DQorICB0ZW1wLT5Jbml0KG1fZmllbGQsICZwcm9kdWN0LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiB0ZW1wOw0KK30NCitDRlhfUHRyQXJyYXkqIENCQ19SZWVkU29sb21vbkdGMjU2UG9seTo6RGl2aWRlKENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogb3RoZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAob3RoZXItPklzWmVybygpKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkRpdmlkZUJ5WmVybzsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgfQ0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2cxID0gbV9maWVsZC0+R2V0WmVybygpLT5DbG9uZShlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gcXVvdGllbnQocnNnMSk7DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHJzZzIgPSB0aGlzLT5DbG9uZShlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gcmVtYWluZGVyKHJzZzIpOw0KKyAgaW50MzJfdCBkZW5vbWluYXRvckxlYWRpbmdUZXJtID0gb3RoZXItPkdldENvZWZmaWNpZW50cyhvdGhlci0+R2V0RGVncmVlKCkpOw0KKyAgaW50MzJfdCBpbnZlcnNlRGVub21pbmF0b3JMZWFkaW5nVGVhbSA9DQorICAgICAgbV9maWVsZC0+SW52ZXJzZShkZW5vbWluYXRvckxlYWRpbmdUZXJtLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHdoaWxlIChyZW1haW5kZXItPkdldERlZ3JlZSgpID49IG90aGVyLT5HZXREZWdyZWUoKSAmJiAhcmVtYWluZGVyLT5Jc1plcm8oKSkgew0KKyAgICBpbnQzMl90IGRlZ3JlZURpZmZlcmVuY2UgPSByZW1haW5kZXItPkdldERlZ3JlZSgpIC0gb3RoZXItPkdldERlZ3JlZSgpOw0KKyAgICBpbnQzMl90IHNjYWxlID0NCisgICAgICAgIG1fZmllbGQtPk11bHRpcGx5KHJlbWFpbmRlci0+R2V0Q29lZmZpY2llbnRzKChyZW1haW5kZXItPkdldERlZ3JlZSgpKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZlcnNlRGVub21pbmF0b3JMZWFkaW5nVGVhbSk7DQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNnMyA9DQorICAgICAgICBvdGhlci0+TXVsdGlwbHlCeU1vbm9taWFsKGRlZ3JlZURpZmZlcmVuY2UsIHNjYWxlLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHRlcm0ocnNnMyk7DQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNnNCA9DQorICAgICAgICBtX2ZpZWxkLT5CdWlsZE1vbm9taWFsKGRlZ3JlZURpZmZlcmVuY2UsIHNjYWxlLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IGl0ZXJhdG9yUXVvdGllbnQocnNnNCk7DQorICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogcnNnNSA9DQorICAgICAgICBxdW90aWVudC0+QWRkT3JTdWJ0cmFjdChpdGVyYXRvclF1b3RpZW50LmdldCgpLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICBDQkNfQXV0b1B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHRlbXAocnNnNSk7DQorICAgIHF1b3RpZW50ID0gdGVtcDsNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByc2c2ID0gcmVtYWluZGVyLT5BZGRPclN1YnRyYWN0KHRlcm0uZ2V0KCksIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIENCQ19BdXRvUHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdGVtcDEocnNnNik7DQorICAgIHJlbWFpbmRlciA9IHRlbXAxOw0KKyAgfQ0KKyAgQ0ZYX1B0ckFycmF5KiB0ZW1wUHRyQSA9IG5ldyBDRlhfUHRyQXJyYXk7DQorICB0ZW1wUHRyQS0+QWRkKHF1b3RpZW50LnJlbGVhc2UoKSk7DQorICB0ZW1wUHRyQS0+QWRkKHJlbWFpbmRlci5yZWxlYXNlKCkpOw0KKyAgcmV0dXJuIHRlbXBQdHJBOw0KK30NCitDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6On5DQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoKSB7DQorICBtX2NvZWZmaWNpZW50cy5SZW1vdmVBbGwoKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5LmggYi94ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjFhNWRmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5LmgKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19SRUFEU09MT01PTkdGMjU2UE9MWV9IXw0KKyNkZWZpbmUgX0JDX1JFQURTT0xPTU9OR0YyNTZQT0xZX0hfDQorY2xhc3MgQ0JDX1JlZWRTb2xvbW9uR0YyNTY7DQorY2xhc3MgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5IHsNCisgcHVibGljOg0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KENCQ19SZWVkU29sb21vbkdGMjU2KiBmaWVsZCwgaW50MzJfdCBjb2VmZmljaWVudHMpOw0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KCk7DQorICB2aXJ0dWFsIH5DQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoKTsNCisgIGludDMyX3QgR2V0Q29lZmZpY2llbnRzKGludDMyX3QgZGVncmVlKTsNCisgIENGWF9JbnQzMkFycmF5KiBHZXRDb2VmZmljaWVudHMoKTsNCisgIGludDMyX3QgR2V0RGVncmVlKCk7DQorICBGWF9CT09MIElzWmVybygpOw0KKyAgaW50MzJfdCBFdmFsdWF0ZUF0KGludDMyX3QgYSk7DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIEFkZE9yU3VidHJhY3QoQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBvdGhlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogTXVsdGlwbHkoQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBvdGhlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIE11bHRpcGx5KGludDMyX3Qgc2NhbGFyLCBpbnQzMl90JiBlKTsNCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogTXVsdGlwbHlCeU1vbm9taWFsKGludDMyX3QgZGVncmVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2VmZmljaWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgQ0ZYX1B0ckFycmF5KiBEaXZpZGUoQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBvdGhlciwgaW50MzJfdCYgZSk7DQorICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIENsb25lKGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCB2b2lkIEluaXQoQ0JDX1JlZWRTb2xvbW9uR0YyNTYqIGZpZWxkLA0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIGNvZWZmaWNpZW50cywNCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTYqIG1fZmllbGQ7DQorICBDRlhfSW50MzJBcnJheSBtX2NvZWZmaWNpZW50czsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQVNDSUlFbmNvZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQVNDSUlFbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzI1YzdhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19BU0NJSUVuY29kZXIuY3BwCkBAIC0wLDAgKzEsOTggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDYtMjAwNyBKZXJlbWlhcyBNYWVya2kuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX0RpbWVuc2lvbi5oIg0KKyNpbmNsdWRlICJCQ19FbmNvZGVyLmgiDQorI2luY2x1ZGUgIkJDX1N5bWJvbFNoYXBlSGludC5oIg0KKyNpbmNsdWRlICJCQ19TeW1ib2xJbmZvLmgiDQorI2luY2x1ZGUgIkJDX0VuY29kZXJDb250ZXh0LmgiDQorI2luY2x1ZGUgIkJDX0hpZ2hMZXZlbEVuY29kZXIuaCINCisjaW5jbHVkZSAiQkNfQVNDSUlFbmNvZGVyLmgiDQorQ0JDX0FTQ0lJRW5jb2Rlcjo6Q0JDX0FTQ0lJRW5jb2RlcigpIHt9DQorQ0JDX0FTQ0lJRW5jb2Rlcjo6fkNCQ19BU0NJSUVuY29kZXIoKSB7fQ0KK2ludDMyX3QgQ0JDX0FTQ0lJRW5jb2Rlcjo6Z2V0RW5jb2RpbmdNb2RlKCkgew0KKyAgcmV0dXJuIEFTQ0lJX0VOQ09EQVRJT047DQorfQ0KK3ZvaWQgQ0JDX0FTQ0lJRW5jb2Rlcjo6RW5jb2RlKENCQ19FbmNvZGVyQ29udGV4dCYgY29udGV4dCwgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBuID0gQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmRldGVybWluZUNvbnNlY3V0aXZlRGlnaXRDb3VudCgNCisgICAgICBjb250ZXh0Lm1fbXNnLCBjb250ZXh0Lm1fcG9zKTsNCisgIGlmIChuID49IDIpIHsNCisgICAgRlhfV0NIQVIgY29kZSA9DQorICAgICAgICBlbmNvZGVBU0NJSURpZ2l0cyhjb250ZXh0Lm1fbXNnLkdldEF0KGNvbnRleHQubV9wb3MpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5tX21zZy5HZXRBdChjb250ZXh0Lm1fcG9zICsgMSksIGUpOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChjb2RlKTsNCisgICAgY29udGV4dC5tX3BvcyArPSAyOw0KKyAgfSBlbHNlIHsNCisgICAgRlhfV0NIQVIgYyA9IGNvbnRleHQuZ2V0Q3VycmVudENoYXIoKTsNCisgICAgaW50MzJfdCBuZXdNb2RlID0gQ0JDX0hpZ2hMZXZlbEVuY29kZXI6Omxvb2tBaGVhZFRlc3QoDQorICAgICAgICBjb250ZXh0Lm1fbXNnLCBjb250ZXh0Lm1fcG9zLCBnZXRFbmNvZGluZ01vZGUoKSk7DQorICAgIGlmIChuZXdNb2RlICE9IGdldEVuY29kaW5nTW9kZSgpKSB7DQorICAgICAgc3dpdGNoIChuZXdNb2RlKSB7DQorICAgICAgICBjYXNlIEJBU0UyNTZfRU5DT0RBVElPTjoNCisgICAgICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpMQVRDSF9UT19CQVNFMjU2KTsNCisgICAgICAgICAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKEJBU0UyNTZfRU5DT0RBVElPTik7DQorICAgICAgICAgIHJldHVybjsNCisgICAgICAgIGNhc2UgQzQwX0VOQ09EQVRJT046DQorICAgICAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChDQkNfSGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fQzQwKTsNCisgICAgICAgICAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKEM0MF9FTkNPREFUSU9OKTsNCisgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgY2FzZSBYMTJfRU5DT0RBVElPTjoNCisgICAgICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpMQVRDSF9UT19BTlNJWDEyKTsNCisgICAgICAgICAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKFgxMl9FTkNPREFUSU9OKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFRFWFRfRU5DT0RBVElPTjoNCisgICAgICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpMQVRDSF9UT19URVhUKTsNCisgICAgICAgICAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKFRFWFRfRU5DT0RBVElPTik7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBFRElGQUNUX0VOQ09EQVRJT046DQorICAgICAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChDQkNfSGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fRURJRkFDVCk7DQorICAgICAgICAgIGNvbnRleHQuc2lnbmFsRW5jb2RlckNoYW5nZShFRElGQUNUX0VOQ09EQVRJT04pOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxTdGF0ZUlsbGVnYWxNb2RlOw0KKyAgICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc0V4dGVuZGVkQVNDSUkoYykpIHsNCisgICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OlVQUEVSX1NISUZUKTsNCisgICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoKEZYX1dDSEFSKShjIC0gMTI4ICsgMSkpOw0KKyAgICAgIGNvbnRleHQubV9wb3MrKzsNCisgICAgfSBlbHNlIHsNCisgICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoKEZYX1dDSEFSKShjICsgMSkpOw0KKyAgICAgIGNvbnRleHQubV9wb3MrKzsNCisgICAgfQ0KKyAgfQ0KK30NCitGWF9XQ0hBUiBDQkNfQVNDSUlFbmNvZGVyOjplbmNvZGVBU0NJSURpZ2l0cyhGWF9XQ0hBUiBkaWdpdDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgZGlnaXQyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChDQkNfSGlnaExldmVsRW5jb2Rlcjo6aXNEaWdpdChkaWdpdDEpICYmDQorICAgICAgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmlzRGlnaXQoZGlnaXQyKSkgew0KKyAgICBpbnQzMl90IG51bSA9IChkaWdpdDEgLSA0OCkgKiAxMCArIChkaWdpdDIgLSA0OCk7DQorICAgIHJldHVybiAoRlhfV0NIQVIpKG51bSArIDEzMCk7DQorICB9DQorICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnROb3RHaWdpdHM7DQorICByZXR1cm4gMDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19BU0NJSUVuY29kZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQVNDSUlFbmNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmZDMyMwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQVNDSUlFbmNvZGVyLmgKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19BU0NJSUVOQ09ERVJfSF8NCisjZGVmaW5lIF9CQ19BU0NJSUVOQ09ERVJfSF8NCitjbGFzcyBDQkNfRW5jb2RlcjsNCitjbGFzcyBDQkNfRW5jb2RlckNvbnRleHQ7DQorY2xhc3MgQ0JDX0FTQ0lJRW5jb2RlcjsNCitjbGFzcyBDQkNfQVNDSUlFbmNvZGVyIDogcHVibGljIENCQ19FbmNvZGVyIHsNCisgcHVibGljOg0KKyAgQ0JDX0FTQ0lJRW5jb2RlcigpOw0KKyAgdmlydHVhbCB+Q0JDX0FTQ0lJRW5jb2RlcigpOw0KKyAgaW50MzJfdCBnZXRFbmNvZGluZ01vZGUoKTsNCisgIHZvaWQgRW5jb2RlKENCQ19FbmNvZGVyQ29udGV4dCYgY29udGV4dCwgaW50MzJfdCYgZSk7DQorDQorIHByaXZhdGU6DQorICBzdGF0aWMgRlhfV0NIQVIgZW5jb2RlQVNDSUlEaWdpdHMoRlhfV0NIQVIgZGlnaXQxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIGRpZ2l0MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQmFzZTI1NkVuY29kZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19CYXNlMjU2RW5jb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRmMzVhYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQmFzZTI1NkVuY29kZXIuY3BwCkBAIC0wLDAgKzEsOTIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDYtMjAwNyBKZXJlbWlhcyBNYWVya2kuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX0RpbWVuc2lvbi5oIg0KKyNpbmNsdWRlICJCQ19FbmNvZGVyLmgiDQorI2luY2x1ZGUgIkJDX1N5bWJvbFNoYXBlSGludC5oIg0KKyNpbmNsdWRlICJCQ19TeW1ib2xJbmZvLmgiDQorI2luY2x1ZGUgIkJDX0VuY29kZXJDb250ZXh0LmgiDQorI2luY2x1ZGUgIkJDX0hpZ2hMZXZlbEVuY29kZXIuaCINCisjaW5jbHVkZSAiQkNfQmFzZTI1NkVuY29kZXIuaCINCitDQkNfQmFzZTI1NkVuY29kZXI6OkNCQ19CYXNlMjU2RW5jb2RlcigpIHt9DQorQ0JDX0Jhc2UyNTZFbmNvZGVyOjp+Q0JDX0Jhc2UyNTZFbmNvZGVyKCkge30NCitpbnQzMl90IENCQ19CYXNlMjU2RW5jb2Rlcjo6Z2V0RW5jb2RpbmdNb2RlKCkgew0KKyAgcmV0dXJuIEJBU0UyNTZfRU5DT0RBVElPTjsNCit9DQordm9pZCBDQkNfQmFzZTI1NkVuY29kZXI6OkVuY29kZShDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsIGludDMyX3QmIGUpIHsNCisgIENGWF9XaWRlU3RyaW5nIGJ1ZmZlcjsNCisgIGJ1ZmZlciArPSAoRlhfV0NIQVIpJ1wwJzsNCisgIHdoaWxlIChjb250ZXh0Lmhhc01vcmVDaGFyYWN0ZXJzKCkpIHsNCisgICAgRlhfV0NIQVIgYyA9IGNvbnRleHQuZ2V0Q3VycmVudENoYXIoKTsNCisgICAgYnVmZmVyICs9IGM7DQorICAgIGNvbnRleHQubV9wb3MrKzsNCisgICAgaW50MzJfdCBuZXdNb2RlID0gQ0JDX0hpZ2hMZXZlbEVuY29kZXI6Omxvb2tBaGVhZFRlc3QoDQorICAgICAgICBjb250ZXh0Lm1fbXNnLCBjb250ZXh0Lm1fcG9zLCBnZXRFbmNvZGluZ01vZGUoKSk7DQorICAgIGlmIChuZXdNb2RlICE9IGdldEVuY29kaW5nTW9kZSgpKSB7DQorICAgICAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKG5ld01vZGUpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpbnQzMl90IGRhdGFDb3VudCA9IGJ1ZmZlci5HZXRMZW5ndGgoKSAtIDE7DQorICBGWF9DSEFSIGJ1ZlsxMjhdOw0KKyNpZiBkZWZpbmVkKF9GWF9XSU5BUElfUEFSVElUSU9OX0FQUF8pDQorICBtZW1zZXQoYnVmLCAwLCBzaXplb2YoRlhfQ0hBUikgKiAxMjgpOw0KKyAgX2l0b2FfcyhkYXRhQ291bnQsIGJ1ZiwgMTI4LCAxMCk7DQorI2Vsc2UNCisgIEZYU1lTX2l0b2EoZGF0YUNvdW50LCBidWYsIDEwKTsNCisjZW5kaWYNCisgIGJ1ZmZlci5TZXRBdCgwLCBGWF9XQ0hBUigqYnVmKSAtICcwJyk7DQorICBpbnQzMl90IGxlbmd0aEZpZWxkU2l6ZSA9IDE7DQorICBpbnQzMl90IGN1cnJlbnRTaXplID0NCisgICAgICBjb250ZXh0LmdldENvZGV3b3JkQ291bnQoKSArIGRhdGFDb3VudCArIGxlbmd0aEZpZWxkU2l6ZTsNCisgIGNvbnRleHQudXBkYXRlU3ltYm9sSW5mbyhjdXJyZW50U2l6ZSwgZSk7DQorICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0JPT0wgbXVzdFBhZCA9IChjb250ZXh0Lm1fc3ltYm9sSW5mby0+bV9kYXRhQ2FwYWNpdHkgLSBjdXJyZW50U2l6ZSkgPiAwOw0KKyAgaWYgKGNvbnRleHQuaGFzTW9yZUNoYXJhY3RlcnMoKSB8fCBtdXN0UGFkKSB7DQorICAgIGlmIChkYXRhQ291bnQgPD0gMjQ5KSB7DQorICAgICAgYnVmZmVyLlNldEF0KDAsIChGWF9XQ0hBUilkYXRhQ291bnQpOw0KKyAgICB9IGVsc2UgaWYgKGRhdGFDb3VudCA+IDI0OSAmJiBkYXRhQ291bnQgPD0gMTU1NSkgew0KKyAgICAgIGJ1ZmZlci5TZXRBdCgwLCAoRlhfV0NIQVIpKChkYXRhQ291bnQgLyAyNTApICsgMjQ5KSk7DQorICAgICAgYnVmZmVyLkluc2VydCgxLCAoRlhfV0NIQVIpKGRhdGFDb3VudCAlIDI1MCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxTdGF0ZU1lc3NhZ2VMZW5ndGhJbnZhbGlkOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IGkgPSAwLCBjID0gYnVmZmVyLkdldExlbmd0aCgpOyBpIDwgYzsgaSsrKSB7DQorICAgIGNvbnRleHQud3JpdGVDb2Rld29yZCgNCisgICAgICAgIHJhbmRvbWl6ZTI1NVN0YXRlKGJ1ZmZlci5HZXRBdChpKSwgY29udGV4dC5nZXRDb2Rld29yZENvdW50KCkgKyAxKSk7DQorICB9DQorfQ0KK0ZYX1dDSEFSIENCQ19CYXNlMjU2RW5jb2Rlcjo6cmFuZG9taXplMjU1U3RhdGUoRlhfV0NIQVIgY2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGV3b3JkUG9zaXRpb24pIHsNCisgIGludDMyX3QgcHNldWRvUmFuZG9tID0gKCgxNDkgKiBjb2Rld29yZFBvc2l0aW9uKSAlIDI1NSkgKyAxOw0KKyAgaW50MzJfdCB0ZW1wVmFyaWFibGUgPSBjaCArIHBzZXVkb1JhbmRvbTsNCisgIGlmICh0ZW1wVmFyaWFibGUgPD0gMjU1KSB7DQorICAgIHJldHVybiAoRlhfV0NIQVIpdGVtcFZhcmlhYmxlOw0KKyAgfSBlbHNlIHsNCisgICAgcmV0dXJuIChGWF9XQ0hBUikodGVtcFZhcmlhYmxlIC0gMjU2KTsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19CYXNlMjU2RW5jb2Rlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19CYXNlMjU2RW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNDI0MmEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Jhc2UyNTZFbmNvZGVyLmgKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19CQVNFMjU2RU5DT0RFUl9IXw0KKyNkZWZpbmUgX0JDX0JBU0UyNTZFTkNPREVSX0hfDQorY2xhc3MgQ0JDX0VuY29kZXI7DQorY2xhc3MgQ0JDX0Jhc2UyNTZFbmNvZGVyOw0KK2NsYXNzIENCQ19CYXNlMjU2RW5jb2RlciA6IHB1YmxpYyBDQkNfRW5jb2RlciB7DQorIHB1YmxpYzoNCisgIENCQ19CYXNlMjU2RW5jb2RlcigpOw0KKyAgdmlydHVhbCB+Q0JDX0Jhc2UyNTZFbmNvZGVyKCk7DQorICBpbnQzMl90IGdldEVuY29kaW5nTW9kZSgpOw0KKyAgdm9pZCBFbmNvZGUoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LCBpbnQzMl90JiBlKTsNCisNCisgcHJpdmF0ZToNCisgIHN0YXRpYyBGWF9XQ0hBUiByYW5kb21pemUyNTVTdGF0ZShGWF9XQ0hBUiBjaCwgaW50MzJfdCBjb2Rld29yZFBvc2l0aW9uKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQzQwRW5jb2Rlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0M0MEVuY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYjAwMzgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0M0MEVuY29kZXIuY3BwCkBAIC0wLDAgKzEsMTk4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDA2LTIwMDcgSmVyZW1pYXMgTWFlcmtpLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19EaW1lbnNpb24uaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJCQ19FbmNvZGVyLmgiDQorI2luY2x1ZGUgIkJDX1N5bWJvbFNoYXBlSGludC5oIg0KKyNpbmNsdWRlICJCQ19TeW1ib2xJbmZvLmgiDQorI2luY2x1ZGUgIkJDX0VuY29kZXJDb250ZXh0LmgiDQorI2luY2x1ZGUgIkJDX0hpZ2hMZXZlbEVuY29kZXIuaCINCisjaW5jbHVkZSAiQkNfQzQwRW5jb2Rlci5oIg0KK0NCQ19DNDBFbmNvZGVyOjpDQkNfQzQwRW5jb2RlcigpIHt9DQorQ0JDX0M0MEVuY29kZXI6On5DQkNfQzQwRW5jb2RlcigpIHt9DQoraW50MzJfdCBDQkNfQzQwRW5jb2Rlcjo6Z2V0RW5jb2RpbmdNb2RlKCkgew0KKyAgcmV0dXJuIEM0MF9FTkNPREFUSU9OOw0KK30NCit2b2lkIENCQ19DNDBFbmNvZGVyOjpFbmNvZGUoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LCBpbnQzMl90JiBlKSB7DQorICBDRlhfV2lkZVN0cmluZyBidWZmZXI7DQorICB3aGlsZSAoY29udGV4dC5oYXNNb3JlQ2hhcmFjdGVycygpKSB7DQorICAgIEZYX1dDSEFSIGMgPSBjb250ZXh0LmdldEN1cnJlbnRDaGFyKCk7DQorICAgIGNvbnRleHQubV9wb3MrKzsNCisgICAgaW50MzJfdCBsYXN0Q2hhclNpemUgPSBlbmNvZGVDaGFyKGMsIGJ1ZmZlciwgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaW50MzJfdCB1bndyaXR0ZW4gPSAoYnVmZmVyLkdldExlbmd0aCgpIC8gMykgKiAyOw0KKyAgICBpbnQzMl90IGN1ckNvZGV3b3JkQ291bnQgPSBjb250ZXh0LmdldENvZGV3b3JkQ291bnQoKSArIHVud3JpdHRlbjsNCisgICAgY29udGV4dC51cGRhdGVTeW1ib2xJbmZvKGN1ckNvZGV3b3JkQ291bnQsIGUpOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGludDMyX3QgYXZhaWxhYmxlID0gY29udGV4dC5tX3N5bWJvbEluZm8tPm1fZGF0YUNhcGFjaXR5IC0gY3VyQ29kZXdvcmRDb3VudDsNCisgICAgaWYgKCFjb250ZXh0Lmhhc01vcmVDaGFyYWN0ZXJzKCkpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyByZW1vdmVkOw0KKyAgICAgIGlmICgoYnVmZmVyLkdldExlbmd0aCgpICUgMykgPT0gMikgew0KKyAgICAgICAgaWYgKGF2YWlsYWJsZSA8IDIgfHwgYXZhaWxhYmxlID4gMikgew0KKyAgICAgICAgICBsYXN0Q2hhclNpemUgPQ0KKyAgICAgICAgICAgICAgYmFja3RyYWNrT25lQ2hhcmFjdGVyKGNvbnRleHQsIGJ1ZmZlciwgcmVtb3ZlZCwgbGFzdENoYXJTaXplLCBlKTsNCisgICAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICB3aGlsZSAoKGJ1ZmZlci5HZXRMZW5ndGgoKSAlIDMpID09IDEgJiYNCisgICAgICAgICAgICAgKChsYXN0Q2hhclNpemUgPD0gMyAmJiBhdmFpbGFibGUgIT0gMSkgfHwgbGFzdENoYXJTaXplID4gMykpIHsNCisgICAgICAgIGxhc3RDaGFyU2l6ZSA9DQorICAgICAgICAgICAgYmFja3RyYWNrT25lQ2hhcmFjdGVyKGNvbnRleHQsIGJ1ZmZlciwgcmVtb3ZlZCwgbGFzdENoYXJTaXplLCBlKTsNCisgICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpbnQzMl90IGNvdW50ID0gYnVmZmVyLkdldExlbmd0aCgpOw0KKyAgICBpZiAoKGNvdW50ICUgMykgPT0gMCkgew0KKyAgICAgIGludDMyX3QgbmV3TW9kZSA9IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpsb29rQWhlYWRUZXN0KA0KKyAgICAgICAgICBjb250ZXh0Lm1fbXNnLCBjb250ZXh0Lm1fcG9zLCBnZXRFbmNvZGluZ01vZGUoKSk7DQorICAgICAgaWYgKG5ld01vZGUgIT0gZ2V0RW5jb2RpbmdNb2RlKCkpIHsNCisgICAgICAgIGNvbnRleHQuc2lnbmFsRW5jb2RlckNoYW5nZShuZXdNb2RlKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaGFuZGxlRU9EKGNvbnRleHQsIGJ1ZmZlciwgZSk7DQorfQ0KK3ZvaWQgQ0JDX0M0MEVuY29kZXI6OndyaXRlTmV4dFRyaXBsZXQoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGJ1ZmZlcikgew0KKyAgY29udGV4dC53cml0ZUNvZGV3b3JkcyhlbmNvZGVUb0NvZGV3b3JkcyhidWZmZXIsIDApKTsNCisgIGJ1ZmZlci5EZWxldGUoMCwgMyk7DQorfQ0KK3ZvaWQgQ0JDX0M0MEVuY29kZXI6OmhhbmRsZUVPRChDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBidWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3QgdW53cml0dGVuID0gKGJ1ZmZlci5HZXRMZW5ndGgoKSAvIDMpICogMjsNCisgIGludDMyX3QgcmVzdCA9IGJ1ZmZlci5HZXRMZW5ndGgoKSAlIDM7DQorICBpbnQzMl90IGN1ckNvZGV3b3JkQ291bnQgPSBjb250ZXh0LmdldENvZGV3b3JkQ291bnQoKSArIHVud3JpdHRlbjsNCisgIGNvbnRleHQudXBkYXRlU3ltYm9sSW5mbyhjdXJDb2Rld29yZENvdW50LCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBhdmFpbGFibGUgPSBjb250ZXh0Lm1fc3ltYm9sSW5mby0+bV9kYXRhQ2FwYWNpdHkgLSBjdXJDb2Rld29yZENvdW50Ow0KKyAgaWYgKHJlc3QgPT0gMikgew0KKyAgICBidWZmZXIgKz0gKEZYX1dDSEFSKSdcMCc7DQorICAgIHdoaWxlIChidWZmZXIuR2V0TGVuZ3RoKCkgPj0gMykgew0KKyAgICAgIHdyaXRlTmV4dFRyaXBsZXQoY29udGV4dCwgYnVmZmVyKTsNCisgICAgfQ0KKyAgICBpZiAoY29udGV4dC5oYXNNb3JlQ2hhcmFjdGVycygpKSB7DQorICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpDNDBfVU5MQVRDSCk7DQorICAgIH0NCisgIH0gZWxzZSBpZiAoYXZhaWxhYmxlID09IDEgJiYgcmVzdCA9PSAxKSB7DQorICAgIHdoaWxlIChidWZmZXIuR2V0TGVuZ3RoKCkgPj0gMykgew0KKyAgICAgIHdyaXRlTmV4dFRyaXBsZXQoY29udGV4dCwgYnVmZmVyKTsNCisgICAgfQ0KKyAgICBpZiAoY29udGV4dC5oYXNNb3JlQ2hhcmFjdGVycygpKSB7DQorICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpDNDBfVU5MQVRDSCk7DQorICAgIH0NCisgICAgY29udGV4dC5tX3Bvcy0tOw0KKyAgfSBlbHNlIGlmIChyZXN0ID09IDApIHsNCisgICAgd2hpbGUgKGJ1ZmZlci5HZXRMZW5ndGgoKSA+PSAzKSB7DQorICAgICAgd3JpdGVOZXh0VHJpcGxldChjb250ZXh0LCBidWZmZXIpOw0KKyAgICB9DQorICAgIGlmIChhdmFpbGFibGUgPiAwIHx8IGNvbnRleHQuaGFzTW9yZUNoYXJhY3RlcnMoKSkgew0KKyAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChDQkNfSGlnaExldmVsRW5jb2Rlcjo6QzQwX1VOTEFUQ0gpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsU3RhdGVVbmV4cGVjdGVkQ2FzZTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKEFTQ0lJX0VOQ09EQVRJT04pOw0KK30NCitpbnQzMl90IENCQ19DNDBFbmNvZGVyOjplbmNvZGVDaGFyKEZYX1dDSEFSIGMsIENGWF9XaWRlU3RyaW5nJiBzYiwgaW50MzJfdCYgZSkgew0KKyAgaWYgKGMgPT0gJyAnKSB7DQorICAgIHNiICs9IChGWF9XQ0hBUiknXDMnOw0KKyAgICByZXR1cm4gMTsNCisgIH0gZWxzZSBpZiAoKGMgPj0gJzAnKSAmJiAoYyA8PSAnOScpKSB7DQorICAgIHNiICs9IChGWF9XQ0hBUikoYyAtIDQ4ICsgNCk7DQorICAgIHJldHVybiAxOw0KKyAgfSBlbHNlIGlmICgoYyA+PSAnQScpICYmIChjIDw9ICdaJykpIHsNCisgICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gNjUgKyAxNCk7DQorICAgIHJldHVybiAxOw0KKyAgfSBlbHNlIGlmICgoYyA+PSAnXDAnKSAmJiAoYyA8PSAweDFmKSkgew0KKyAgICBzYiArPSAoRlhfV0NIQVIpJ1wwJzsNCisgICAgc2IgKz0gYzsNCisgICAgcmV0dXJuIDI7DQorICB9IGVsc2UgaWYgKChjID49ICchJykgJiYgKGMgPD0gJy8nKSkgew0KKyAgICBzYiArPSAoRlhfV0NIQVIpJ1wxJzsNCisgICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gMzMpOw0KKyAgICByZXR1cm4gMjsNCisgIH0gZWxzZSBpZiAoKGMgPj0gJzonKSAmJiAoYyA8PSAnQCcpKSB7DQorICAgIHNiICs9IChGWF9XQ0hBUiknXDEnOw0KKyAgICBzYiArPSAoRlhfV0NIQVIpKGMgLSA1OCArIDE1KTsNCisgICAgcmV0dXJuIDI7DQorICB9IGVsc2UgaWYgKChjID49ICdbJykgJiYgKGMgPD0gJ18nKSkgew0KKyAgICBzYiArPSAoRlhfV0NIQVIpJ1wxJzsNCisgICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gOTEgKyAyMik7DQorICAgIHJldHVybiAyOw0KKyAgfSBlbHNlIGlmICgoYyA+PSA2MCkgJiYgKGMgPD0gMHg3ZikpIHsNCisgICAgc2IgKz0gKEZYX1dDSEFSKSdcMic7DQorICAgIHNiICs9IChGWF9XQ0hBUikoYyAtIDk2KTsNCisgICAgcmV0dXJuIDI7DQorICB9IGVsc2UgaWYgKGMgPj0gODApIHsNCisgICAgc2IgKz0gKEZYX1dDSEFSKSdcMSc7DQorICAgIHNiICs9IChGWF9XQ0hBUikweDAwMWU7DQorICAgIGludDMyX3QgbGVuID0gMjsNCisgICAgbGVuICs9IGVuY29kZUNoYXIoKGMgLSAxMjgpLCBzYiwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCisgICAgcmV0dXJuIGxlbjsNCisgIH0gZWxzZSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCisgICAgcmV0dXJuIDA7DQorICB9DQorfQ0KK2ludDMyX3QgQ0JDX0M0MEVuY29kZXI6OmJhY2t0cmFja09uZUNoYXJhY3RlcihDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBidWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiByZW1vdmVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxhc3RDaGFyU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBjb3VudCA9IGJ1ZmZlci5HZXRMZW5ndGgoKTsNCisgIGJ1ZmZlci5EZWxldGUoY291bnQgLSBsYXN0Q2hhclNpemUsIGNvdW50KTsNCisgIGNvbnRleHQubV9wb3MtLTsNCisgIEZYX1dDSEFSIGMgPSBjb250ZXh0LmdldEN1cnJlbnRDaGFyKCk7DQorICBsYXN0Q2hhclNpemUgPSBlbmNvZGVDaGFyKGMsIHJlbW92ZWQsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIC0xKTsNCisgIGNvbnRleHQucmVzZXRTeW1ib2xJbmZvKCk7DQorICByZXR1cm4gbGFzdENoYXJTaXplOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfQzQwRW5jb2Rlcjo6ZW5jb2RlVG9Db2Rld29yZHMoQ0ZYX1dpZGVTdHJpbmcgc2IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRQb3MpIHsNCisgIEZYX1dDSEFSIGMxID0gc2IuR2V0QXQoc3RhcnRQb3MpOw0KKyAgRlhfV0NIQVIgYzIgPSBzYi5HZXRBdChzdGFydFBvcyArIDEpOw0KKyAgRlhfV0NIQVIgYzMgPSBzYi5HZXRBdChzdGFydFBvcyArIDIpOw0KKyAgaW50MzJfdCB2ID0gKDE2MDAgKiBjMSkgKyAoNDAgKiBjMikgKyBjMyArIDE7DQorICBGWF9XQ0hBUiBjdzEgPSAoRlhfV0NIQVIpKHYgLyAyNTYpOw0KKyAgRlhfV0NIQVIgY3cyID0gKEZYX1dDSEFSKSh2ICUgMjU2KTsNCisgIENGWF9XaWRlU3RyaW5nIGIxKGN3MSk7DQorICBDRlhfV2lkZVN0cmluZyBiMihjdzIpOw0KKyAgcmV0dXJuIGIxICsgYjI7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQzQwRW5jb2Rlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19DNDBFbmNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE5ODA5NgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQzQwRW5jb2Rlci5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfQzQwRU5DT0RFUl9IXw0KKyNkZWZpbmUgX0JDX0M0MEVOQ09ERVJfSF8NCitjbGFzcyBDQkNfQzQwRW5jb2RlcjsNCitjbGFzcyBDQkNfQzQwRW5jb2RlciA6IHB1YmxpYyBDQkNfRW5jb2RlciB7DQorIHB1YmxpYzoNCisgIENCQ19DNDBFbmNvZGVyKCk7DQorICB2aXJ0dWFsIH5DQkNfQzQwRW5jb2RlcigpOw0KKyAgdmlydHVhbCBpbnQzMl90IGdldEVuY29kaW5nTW9kZSgpOw0KKyAgdmlydHVhbCB2b2lkIEVuY29kZShDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgd3JpdGVOZXh0VHJpcGxldChDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBidWZmZXIpOw0KKyAgdmlydHVhbCB2b2lkIGhhbmRsZUVPRChDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBidWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCBpbnQzMl90IGVuY29kZUNoYXIoRlhfV0NIQVIgYywgQ0ZYX1dpZGVTdHJpbmcmIHNiLCBpbnQzMl90JiBlKTsNCisNCisgcHJpdmF0ZToNCisgIGludDMyX3QgYmFja3RyYWNrT25lQ2hhcmFjdGVyKENCQ19FbmNvZGVyQ29udGV4dCYgY29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBidWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgcmVtb3ZlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbGFzdENoYXJTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlVG9Db2Rld29yZHMoQ0ZYX1dpZGVTdHJpbmcgc2IsIGludDMyX3Qgc3RhcnRQb3MpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk4OWM4ZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlci5jcHAKQEAgLTAsMCArMSwzODAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgiDQorI2luY2x1ZGUgIkJDX0RhdGFNYXRyaXhWZXJzaW9uLmgiDQorI2luY2x1ZGUgIkJDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXIuaCINCitDQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlcjo6Q0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXIoKSB7DQorICBtX21hcHBpbmdCaXRNYXRyaXggPSBOVUxMOw0KKyAgbV92ZXJzaW9uID0gTlVMTDsNCisgIG1fcmVhZE1hcHBpbmdNYXRyaXggPSBOVUxMOw0KK30NCit2b2lkIENCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyOjpJbml0KENCQ19Db21tb25CaXRNYXRyaXgqIGJpdE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3QgZGltZW5zaW9uID0gYml0TWF0cml4LT5HZXRIZWlnaHQoKTsNCisgIGlmIChkaW1lbnNpb24gPCA4IHx8IGRpbWVuc2lvbiA+IDE0NCB8fCAoZGltZW5zaW9uICYgMHgwMSkgIT0gMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgIHJldHVybjsNCisgIH0NCisgIG1fdmVyc2lvbiA9IFJlYWRWZXJzaW9uKGJpdE1hdHJpeCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIG1fbWFwcGluZ0JpdE1hdHJpeCA9IEV4dHJhY3REYXRhUmVnaW9uKGJpdE1hdHJpeCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIG1fcmVhZE1hcHBpbmdNYXRyaXggPSBuZXcgQ0JDX0NvbW1vbkJpdE1hdHJpeCgpOw0KKyAgbV9yZWFkTWFwcGluZ01hdHJpeC0+SW5pdChtX21hcHBpbmdCaXRNYXRyaXgtPkdldFdpZHRoKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbWFwcGluZ0JpdE1hdHJpeC0+R2V0SGVpZ2h0KCkpOw0KK30NCitDQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlcjo6fkNCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyKCkgew0KKyAgaWYgKG1fbWFwcGluZ0JpdE1hdHJpeCAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBtX21hcHBpbmdCaXRNYXRyaXg7DQorICB9DQorICBtX21hcHBpbmdCaXRNYXRyaXggPSBOVUxMOw0KKyAgaWYgKG1fcmVhZE1hcHBpbmdNYXRyaXggIT0gTlVMTCkgew0KKyAgICBkZWxldGUgbV9yZWFkTWFwcGluZ01hdHJpeDsNCisgIH0NCisgIG1fcmVhZE1hcHBpbmdNYXRyaXggPSBOVUxMOw0KK30NCitDQkNfRGF0YU1hdHJpeFZlcnNpb24qIENCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyOjpHZXRWZXJzaW9uKCkgew0KKyAgcmV0dXJuIG1fdmVyc2lvbjsNCit9DQorQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKiBDQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlcjo6UmVhZFZlcnNpb24oDQorICAgIENCQ19Db21tb25CaXRNYXRyaXgqIGJpdE1hdHJpeCwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCByb3dzID0gYml0TWF0cml4LT5HZXRIZWlnaHQoKTsNCisgIGludDMyX3QgY29sdW1ucyA9IGJpdE1hdHJpeC0+R2V0V2lkdGgoKTsNCisgIENCQ19EYXRhTWF0cml4VmVyc2lvbiogdGVtcCA9DQorICAgICAgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOjpHZXRWZXJzaW9uRm9yRGltZW5zaW9ucyhyb3dzLCBjb2x1bW5zLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiB0ZW1wOw0KK30NCitDRlhfQnl0ZUFycmF5KiBDQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlcjo6UmVhZENvZGV3b3JkcyhpbnQzMl90JiBlKSB7DQorICBDQkNfQXV0b1B0cjxDRlhfQnl0ZUFycmF5PiByZXN1bHQobmV3IENGWF9CeXRlQXJyYXkoKSk7DQorICByZXN1bHQtPlNldFNpemUobV92ZXJzaW9uLT5HZXRUb3RhbENvZGV3b3JkcygpKTsNCisgIGludDMyX3QgcmVzdWx0T2Zmc2V0ID0gMDsNCisgIGludDMyX3Qgcm93ID0gNDsNCisgIGludDMyX3QgY29sdW1uID0gMDsNCisgIGludDMyX3QgbnVtUm93cyA9IG1fbWFwcGluZ0JpdE1hdHJpeC0+R2V0SGVpZ2h0KCk7DQorICBpbnQzMl90IG51bUNvbHVtbnMgPSBtX21hcHBpbmdCaXRNYXRyaXgtPkdldFdpZHRoKCk7DQorICBGWF9CT09MIGNvcm5lcjFSZWFkID0gRkFMU0U7DQorICBGWF9CT09MIGNvcm5lcjJSZWFkID0gRkFMU0U7DQorICBGWF9CT09MIGNvcm5lcjNSZWFkID0gRkFMU0U7DQorICBGWF9CT09MIGNvcm5lcjRSZWFkID0gRkFMU0U7DQorICBkbyB7DQorICAgIGlmICgocm93ID09IG51bVJvd3MpICYmIChjb2x1bW4gPT0gMCkgJiYgIWNvcm5lcjFSZWFkKSB7DQorICAgICAgKCpyZXN1bHQpW3Jlc3VsdE9mZnNldCsrXSA9ICh1aW50OF90KVJlYWRDb3JuZXIxKG51bVJvd3MsIG51bUNvbHVtbnMpOw0KKyAgICAgIHJvdyAtPSAyOw0KKyAgICAgIGNvbHVtbiArPSAyOw0KKyAgICAgIGNvcm5lcjFSZWFkID0gVFJVRTsNCisgICAgfSBlbHNlIGlmICgocm93ID09IG51bVJvd3MgLSAyKSAmJiAoY29sdW1uID09IDApICYmDQorICAgICAgICAgICAgICAgKChudW1Db2x1bW5zICYgMHgwMykgIT0gMCkgJiYgIWNvcm5lcjJSZWFkKSB7DQorICAgICAgKCpyZXN1bHQpW3Jlc3VsdE9mZnNldCsrXSA9ICh1aW50OF90KVJlYWRDb3JuZXIyKG51bVJvd3MsIG51bUNvbHVtbnMpOw0KKyAgICAgIHJvdyAtPSAyOw0KKyAgICAgIGNvbHVtbiArPSAyOw0KKyAgICAgIGNvcm5lcjJSZWFkID0gVFJVRTsNCisgICAgfSBlbHNlIGlmICgocm93ID09IG51bVJvd3MgKyA0KSAmJiAoY29sdW1uID09IDIpICYmDQorICAgICAgICAgICAgICAgKChudW1Db2x1bW5zICYgMHgwNykgPT0gMCkgJiYgIWNvcm5lcjNSZWFkKSB7DQorICAgICAgKCpyZXN1bHQpW3Jlc3VsdE9mZnNldCsrXSA9ICh1aW50OF90KVJlYWRDb3JuZXIzKG51bVJvd3MsIG51bUNvbHVtbnMpOw0KKyAgICAgIHJvdyAtPSAyOw0KKyAgICAgIGNvbHVtbiArPSAyOw0KKyAgICAgIGNvcm5lcjNSZWFkID0gVFJVRTsNCisgICAgfSBlbHNlIGlmICgocm93ID09IG51bVJvd3MgLSAyKSAmJiAoY29sdW1uID09IDApICYmDQorICAgICAgICAgICAgICAgKChudW1Db2x1bW5zICYgMHgwNykgPT0gNCkgJiYgIWNvcm5lcjRSZWFkKSB7DQorICAgICAgKCpyZXN1bHQpW3Jlc3VsdE9mZnNldCsrXSA9ICh1aW50OF90KVJlYWRDb3JuZXI0KG51bVJvd3MsIG51bUNvbHVtbnMpOw0KKyAgICAgIHJvdyAtPSAyOw0KKyAgICAgIGNvbHVtbiArPSAyOw0KKyAgICAgIGNvcm5lcjRSZWFkID0gVFJVRTsNCisgICAgfSBlbHNlIHsNCisgICAgICBkbyB7DQorICAgICAgICBpZiAoKHJvdyA8IG51bVJvd3MpICYmIChjb2x1bW4gPj0gMCkgJiYNCisgICAgICAgICAgICAhbV9yZWFkTWFwcGluZ01hdHJpeC0+R2V0KGNvbHVtbiwgcm93KSkgew0KKyAgICAgICAgICBpZiAocmVzdWx0T2Zmc2V0IDwgKCpyZXN1bHQpLkdldFNpemUoKSkgew0KKyAgICAgICAgICAgICgqcmVzdWx0KVtyZXN1bHRPZmZzZXQrK10gPQ0KKyAgICAgICAgICAgICAgICAodWludDhfdClSZWFkVXRhaChyb3csIGNvbHVtbiwgbnVtUm93cywgbnVtQ29sdW1ucyk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJvdyAtPSAyOw0KKyAgICAgICAgY29sdW1uICs9IDI7DQorICAgICAgfSB3aGlsZSAoKHJvdyA+PSAwKSAmJiAoY29sdW1uIDwgbnVtQ29sdW1ucykpOw0KKyAgICAgIHJvdyArPSAxOw0KKyAgICAgIGNvbHVtbiArPSAzOw0KKyAgICAgIGRvIHsNCisgICAgICAgIGlmICgocm93ID49IDApICYmIChjb2x1bW4gPCBudW1Db2x1bW5zKSAmJg0KKyAgICAgICAgICAgICFtX3JlYWRNYXBwaW5nTWF0cml4LT5HZXQoY29sdW1uLCByb3cpKSB7DQorICAgICAgICAgIGlmIChyZXN1bHRPZmZzZXQgPCAoKnJlc3VsdCkuR2V0U2l6ZSgpKSB7DQorICAgICAgICAgICAgKCpyZXN1bHQpW3Jlc3VsdE9mZnNldCsrXSA9DQorICAgICAgICAgICAgICAgICh1aW50OF90KVJlYWRVdGFoKHJvdywgY29sdW1uLCBudW1Sb3dzLCBudW1Db2x1bW5zKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcm93ICs9IDI7DQorICAgICAgICBjb2x1bW4gLT0gMjsNCisgICAgICB9IHdoaWxlICgocm93IDwgbnVtUm93cykgJiYgKGNvbHVtbiA+PSAwKSk7DQorICAgICAgcm93ICs9IDM7DQorICAgICAgY29sdW1uICs9IDE7DQorICAgIH0NCisgIH0gd2hpbGUgKChyb3cgPCBudW1Sb3dzKSB8fCAoY29sdW1uIDwgbnVtQ29sdW1ucykpOw0KKyAgaWYgKHJlc3VsdE9mZnNldCAhPSBtX3ZlcnNpb24tPkdldFRvdGFsQ29kZXdvcmRzKCkpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiByZXN1bHQucmVsZWFzZSgpOw0KK30NCitGWF9CT09MIENCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyOjpSZWFkTW9kdWxlKGludDMyX3Qgcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2x1bW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVJvd3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUNvbHVtbnMpIHsNCisgIGlmIChyb3cgPCAwKSB7DQorICAgIHJvdyArPSBudW1Sb3dzOw0KKyAgICBjb2x1bW4gKz0gNCAtICgobnVtUm93cyArIDQpICYgMHgwNyk7DQorICB9DQorICBpZiAoY29sdW1uIDwgMCkgew0KKyAgICBjb2x1bW4gKz0gbnVtQ29sdW1uczsNCisgICAgcm93ICs9IDQgLSAoKG51bUNvbHVtbnMgKyA0KSAmIDB4MDcpOw0KKyAgfQ0KKyAgbV9yZWFkTWFwcGluZ01hdHJpeC0+U2V0KGNvbHVtbiwgcm93KTsNCisgIHJldHVybiBtX21hcHBpbmdCaXRNYXRyaXgtPkdldChjb2x1bW4sIHJvdyk7DQorfQ0KK2ludDMyX3QgQ0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXI6OlJlYWRVdGFoKGludDMyX3Qgcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29sdW1uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtUm93cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUNvbHVtbnMpIHsNCisgIGludDMyX3QgY3VycmVudEJ5dGUgPSAwOw0KKyAgaWYgKFJlYWRNb2R1bGUocm93IC0gMiwgY29sdW1uIC0gMiwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgaWYgKFJlYWRNb2R1bGUocm93IC0gMiwgY29sdW1uIC0gMSwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgaWYgKFJlYWRNb2R1bGUocm93IC0gMSwgY29sdW1uIC0gMiwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgaWYgKFJlYWRNb2R1bGUocm93IC0gMSwgY29sdW1uIC0gMSwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgaWYgKFJlYWRNb2R1bGUocm93IC0gMSwgY29sdW1uLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgY3VycmVudEJ5dGUgPDw9IDE7DQorICBpZiAoUmVhZE1vZHVsZShyb3csIGNvbHVtbiAtIDIsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICB9DQorICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgIGlmIChSZWFkTW9kdWxlKHJvdywgY29sdW1uIC0gMSwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgaWYgKFJlYWRNb2R1bGUocm93LCBjb2x1bW4sIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICB9DQorICByZXR1cm4gY3VycmVudEJ5dGU7DQorfQ0KK2ludDMyX3QgQ0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXI6OlJlYWRDb3JuZXIxKGludDMyX3QgbnVtUm93cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUNvbHVtbnMpIHsNCisgIGludDMyX3QgY3VycmVudEJ5dGUgPSAwOw0KKyAgaWYgKFJlYWRNb2R1bGUobnVtUm93cyAtIDEsIDAsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICB9DQorICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgIGlmIChSZWFkTW9kdWxlKG51bVJvd3MgLSAxLCAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgY3VycmVudEJ5dGUgPDw9IDE7DQorICBpZiAoUmVhZE1vZHVsZShudW1Sb3dzIC0gMSwgMiwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgaWYgKFJlYWRNb2R1bGUoMCwgbnVtQ29sdW1ucyAtIDIsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICB9DQorICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgIGlmIChSZWFkTW9kdWxlKDAsIG51bUNvbHVtbnMgLSAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgY3VycmVudEJ5dGUgPDw9IDE7DQorICBpZiAoUmVhZE1vZHVsZSgxLCBudW1Db2x1bW5zIC0gMSwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgaWYgKFJlYWRNb2R1bGUoMiwgbnVtQ29sdW1ucyAtIDEsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICB9DQorICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgIGlmIChSZWFkTW9kdWxlKDMsIG51bUNvbHVtbnMgLSAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgcmV0dXJuIGN1cnJlbnRCeXRlOw0KK30NCitpbnQzMl90IENCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyOjpSZWFkQ29ybmVyMihpbnQzMl90IG51bVJvd3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1Db2x1bW5zKSB7DQorICBpbnQzMl90IGN1cnJlbnRCeXRlID0gMDsNCisgIGlmIChSZWFkTW9kdWxlKG51bVJvd3MgLSAzLCAwLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgY3VycmVudEJ5dGUgPDw9IDE7DQorICBpZiAoUmVhZE1vZHVsZShudW1Sb3dzIC0gMiwgMCwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgaWYgKFJlYWRNb2R1bGUobnVtUm93cyAtIDEsIDAsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICB9DQorICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgIGlmIChSZWFkTW9kdWxlKDAsIG51bUNvbHVtbnMgLSA0LCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgY3VycmVudEJ5dGUgPDw9IDE7DQorICBpZiAoUmVhZE1vZHVsZSgwLCBudW1Db2x1bW5zIC0gMywgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgaWYgKFJlYWRNb2R1bGUoMCwgbnVtQ29sdW1ucyAtIDIsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICB9DQorICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgIGlmIChSZWFkTW9kdWxlKDAsIG51bUNvbHVtbnMgLSAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgY3VycmVudEJ5dGUgPDw9IDE7DQorICBpZiAoUmVhZE1vZHVsZSgxLCBudW1Db2x1bW5zIC0gMSwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIHJldHVybiBjdXJyZW50Qnl0ZTsNCit9DQoraW50MzJfdCBDQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlcjo6UmVhZENvcm5lcjMoaW50MzJfdCBudW1Sb3dzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtQ29sdW1ucykgew0KKyAgaW50MzJfdCBjdXJyZW50Qnl0ZSA9IDA7DQorICBpZiAoUmVhZE1vZHVsZShudW1Sb3dzIC0gMSwgMCwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgaWYgKFJlYWRNb2R1bGUobnVtUm93cyAtIDEsIG51bUNvbHVtbnMgLSAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgY3VycmVudEJ5dGUgPDw9IDE7DQorICBpZiAoUmVhZE1vZHVsZSgwLCBudW1Db2x1bW5zIC0gMywgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgaWYgKFJlYWRNb2R1bGUoMCwgbnVtQ29sdW1ucyAtIDIsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICB9DQorICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgIGlmIChSZWFkTW9kdWxlKDAsIG51bUNvbHVtbnMgLSAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgY3VycmVudEJ5dGUgPDw9IDE7DQorICBpZiAoUmVhZE1vZHVsZSgxLCBudW1Db2x1bW5zIC0gMywgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgaWYgKFJlYWRNb2R1bGUoMSwgbnVtQ29sdW1ucyAtIDIsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICB9DQorICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgIGlmIChSZWFkTW9kdWxlKDEsIG51bUNvbHVtbnMgLSAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgcmV0dXJuIGN1cnJlbnRCeXRlOw0KK30NCitpbnQzMl90IENCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyOjpSZWFkQ29ybmVyNChpbnQzMl90IG51bVJvd3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1Db2x1bW5zKSB7DQorICBpbnQzMl90IGN1cnJlbnRCeXRlID0gMDsNCisgIGlmIChSZWFkTW9kdWxlKG51bVJvd3MgLSAzLCAwLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgY3VycmVudEJ5dGUgPDw9IDE7DQorICBpZiAoUmVhZE1vZHVsZShudW1Sb3dzIC0gMiwgMCwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgaWYgKFJlYWRNb2R1bGUobnVtUm93cyAtIDEsIDAsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICB9DQorICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgIGlmIChSZWFkTW9kdWxlKDAsIG51bUNvbHVtbnMgLSAyLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgY3VycmVudEJ5dGUgPDw9IDE7DQorICBpZiAoUmVhZE1vZHVsZSgwLCBudW1Db2x1bW5zIC0gMSwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIGN1cnJlbnRCeXRlIDw8PSAxOw0KKyAgaWYgKFJlYWRNb2R1bGUoMSwgbnVtQ29sdW1ucyAtIDEsIG51bVJvd3MsIG51bUNvbHVtbnMpKSB7DQorICAgIGN1cnJlbnRCeXRlIHw9IDE7DQorICB9DQorICBjdXJyZW50Qnl0ZSA8PD0gMTsNCisgIGlmIChSZWFkTW9kdWxlKDIsIG51bUNvbHVtbnMgLSAxLCBudW1Sb3dzLCBudW1Db2x1bW5zKSkgew0KKyAgICBjdXJyZW50Qnl0ZSB8PSAxOw0KKyAgfQ0KKyAgY3VycmVudEJ5dGUgPDw9IDE7DQorICBpZiAoUmVhZE1vZHVsZSgzLCBudW1Db2x1bW5zIC0gMSwgbnVtUm93cywgbnVtQ29sdW1ucykpIHsNCisgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgIH0NCisgIHJldHVybiBjdXJyZW50Qnl0ZTsNCit9DQorQ0JDX0NvbW1vbkJpdE1hdHJpeCogQ0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXI6OkV4dHJhY3REYXRhUmVnaW9uKA0KKyAgICBDQkNfQ29tbW9uQml0TWF0cml4KiBiaXRNYXRyaXgsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3Qgc3ltYm9sU2l6ZVJvd3MgPSBtX3ZlcnNpb24tPkdldFN5bWJvbFNpemVSb3dzKCk7DQorICBpbnQzMl90IHN5bWJvbFNpemVDb2x1bW5zID0gbV92ZXJzaW9uLT5HZXRTeW1ib2xTaXplQ29sdW1ucygpOw0KKyAgaWYgKGJpdE1hdHJpeC0+R2V0SGVpZ2h0KCkgIT0gc3ltYm9sU2l6ZVJvd3MpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uQ2FuTm90Q2FsbEdldERpbWVuc2lvbk9uTm9uU3F1YXJlTWF0cml4Ow0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGludDMyX3QgZGF0YVJlZ2lvblNpemVSb3dzID0gbV92ZXJzaW9uLT5HZXREYXRhUmVnaW9uU2l6ZVJvd3MoKTsNCisgIGludDMyX3QgZGF0YVJlZ2lvblNpemVDb2x1bW5zID0gbV92ZXJzaW9uLT5HZXREYXRhUmVnaW9uU2l6ZUNvbHVtbnMoKTsNCisgIGludDMyX3QgbnVtRGF0YVJlZ2lvbnNSb3cgPSBzeW1ib2xTaXplUm93cyAvIGRhdGFSZWdpb25TaXplUm93czsNCisgIGludDMyX3QgbnVtRGF0YVJlZ2lvbnNDb2x1bW4gPSBzeW1ib2xTaXplQ29sdW1ucyAvIGRhdGFSZWdpb25TaXplQ29sdW1uczsNCisgIGludDMyX3Qgc2l6ZURhdGFSZWdpb25Sb3cgPSBudW1EYXRhUmVnaW9uc1JvdyAqIGRhdGFSZWdpb25TaXplUm93czsNCisgIGludDMyX3Qgc2l6ZURhdGFSZWdpb25Db2x1bW4gPSBudW1EYXRhUmVnaW9uc0NvbHVtbiAqIGRhdGFSZWdpb25TaXplQ29sdW1uczsNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIGJpdE1hdHJpeFdpdGhvdXRBbGlnbm1lbnQgPSBuZXcgQ0JDX0NvbW1vbkJpdE1hdHJpeCgpOw0KKyAgYml0TWF0cml4V2l0aG91dEFsaWdubWVudC0+SW5pdChzaXplRGF0YVJlZ2lvbkNvbHVtbiwgc2l6ZURhdGFSZWdpb25Sb3cpOw0KKyAgaW50MzJfdCBkYXRhUmVnaW9uUm93Ow0KKyAgZm9yIChkYXRhUmVnaW9uUm93ID0gMDsgZGF0YVJlZ2lvblJvdyA8IG51bURhdGFSZWdpb25zUm93OyArK2RhdGFSZWdpb25Sb3cpIHsNCisgICAgaW50MzJfdCBkYXRhUmVnaW9uUm93T2Zmc2V0ID0gZGF0YVJlZ2lvblJvdyAqIGRhdGFSZWdpb25TaXplUm93czsNCisgICAgaW50MzJfdCBkYXRhUmVnaW9uQ29sdW1uOw0KKyAgICBmb3IgKGRhdGFSZWdpb25Db2x1bW4gPSAwOyBkYXRhUmVnaW9uQ29sdW1uIDwgbnVtRGF0YVJlZ2lvbnNDb2x1bW47DQorICAgICAgICAgKytkYXRhUmVnaW9uQ29sdW1uKSB7DQorICAgICAgaW50MzJfdCBkYXRhUmVnaW9uQ29sdW1uT2Zmc2V0ID0gZGF0YVJlZ2lvbkNvbHVtbiAqIGRhdGFSZWdpb25TaXplQ29sdW1uczsNCisgICAgICBpbnQzMl90IGk7DQorICAgICAgZm9yIChpID0gMDsgaSA8IGRhdGFSZWdpb25TaXplUm93czsgKytpKSB7DQorICAgICAgICBpbnQzMl90IHJlYWRSb3dPZmZzZXQgPQ0KKyAgICAgICAgICAgIGRhdGFSZWdpb25Sb3cgKiAoZGF0YVJlZ2lvblNpemVSb3dzICsgMikgKyAxICsgaTsNCisgICAgICAgIGludDMyX3Qgd3JpdGVSb3dPZmZzZXQgPSBkYXRhUmVnaW9uUm93T2Zmc2V0ICsgaTsNCisgICAgICAgIGludDMyX3QgajsNCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBkYXRhUmVnaW9uU2l6ZUNvbHVtbnM7ICsraikgew0KKyAgICAgICAgICBpbnQzMl90IHJlYWRDb2x1bW5PZmZzZXQgPQ0KKyAgICAgICAgICAgICAgZGF0YVJlZ2lvbkNvbHVtbiAqIChkYXRhUmVnaW9uU2l6ZUNvbHVtbnMgKyAyKSArIDEgKyBqOw0KKyAgICAgICAgICBpZiAoYml0TWF0cml4LT5HZXQocmVhZENvbHVtbk9mZnNldCwgcmVhZFJvd09mZnNldCkpIHsNCisgICAgICAgICAgICBpbnQzMl90IHdyaXRlQ29sdW1uT2Zmc2V0ID0gZGF0YVJlZ2lvbkNvbHVtbk9mZnNldCArIGo7DQorICAgICAgICAgICAgYml0TWF0cml4V2l0aG91dEFsaWdubWVudC0+U2V0KHdyaXRlQ29sdW1uT2Zmc2V0LCB3cml0ZVJvd09mZnNldCk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBiaXRNYXRyaXhXaXRob3V0QWxpZ25tZW50Ow0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MmJjMDUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXIuaApAQCAtMCwwICsxLDQwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0RBVEFNQVRSSVhCSVRNQVRSSVhQQVJTRVJfSF8NCisjZGVmaW5lIF9CQ19EQVRBTUFUUklYQklUTUFUUklYUEFSU0VSX0hfDQorY2xhc3MgQ0JDX0NvbW1vbkJpdE1hdHJpeDsNCitjbGFzcyBDQkNfRGF0YU1hdHJpeFZlcnNpb247DQorY2xhc3MgQ0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXIgew0KKyBwdWJsaWM6DQorICBDQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlcigpOw0KKyAgdmlydHVhbCB+Q0JDX0RhdGFNYXRyaXhCaXRNYXRyaXhQYXJzZXIoKTsNCisgIENCQ19EYXRhTWF0cml4VmVyc2lvbiogR2V0VmVyc2lvbigpOw0KKyAgQ0ZYX0J5dGVBcnJheSogUmVhZENvZGV3b3JkcyhpbnQzMl90JiBlKTsNCisgIEZYX0JPT0wgUmVhZE1vZHVsZShpbnQzMl90IHJvdywNCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbHVtbiwNCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVJvd3MsDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1Db2x1bW5zKTsNCisgIGludDMyX3QgUmVhZFV0YWgoaW50MzJfdCByb3csDQorICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29sdW1uLA0KKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVJvd3MsDQorICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtQ29sdW1ucyk7DQorICBpbnQzMl90IFJlYWRDb3JuZXIxKGludDMyX3QgbnVtUm93cywgaW50MzJfdCBudW1Db2x1bW5zKTsNCisgIGludDMyX3QgUmVhZENvcm5lcjIoaW50MzJfdCBudW1Sb3dzLCBpbnQzMl90IG51bUNvbHVtbnMpOw0KKyAgaW50MzJfdCBSZWFkQ29ybmVyMyhpbnQzMl90IG51bVJvd3MsIGludDMyX3QgbnVtQ29sdW1ucyk7DQorICBpbnQzMl90IFJlYWRDb3JuZXI0KGludDMyX3QgbnVtUm93cywgaW50MzJfdCBudW1Db2x1bW5zKTsNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIEV4dHJhY3REYXRhUmVnaW9uKENCQ19Db21tb25CaXRNYXRyaXgqIGJpdE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCB2b2lkIEluaXQoQ0JDX0NvbW1vbkJpdE1hdHJpeCogYml0TWF0cml4LCBpbnQzMl90JiBlKTsNCisNCisgcHJpdmF0ZToNCisgIHN0YXRpYyBDQkNfRGF0YU1hdHJpeFZlcnNpb24qIFJlYWRWZXJzaW9uKENCQ19Db21tb25CaXRNYXRyaXgqIGJpdE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogbV9tYXBwaW5nQml0TWF0cml4Ow0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogbV9yZWFkTWFwcGluZ01hdHJpeDsNCisgIENCQ19EYXRhTWF0cml4VmVyc2lvbiogbV92ZXJzaW9uOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4RGF0YUJsb2NrLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERhdGFCbG9jay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzMjM5ZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERhdGFCbG9jay5jcHAKQEAgLTAsMCArMSwxMTEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDggWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJCQ19EYXRhTWF0cml4VmVyc2lvbi5oIg0KKyNpbmNsdWRlICJCQ19EYXRhTWF0cml4RGF0YUJsb2NrLmgiDQorQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2s6On5DQkNfRGF0YU1hdHJpeERhdGFCbG9jaygpIHt9DQorQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2s6OkNCQ19EYXRhTWF0cml4RGF0YUJsb2NrKGludDMyX3QgbnVtRGF0YUNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVBcnJheSogY29kZXdvcmRzKSB7DQorICBtX2NvZGV3b3Jkcy5Db3B5KCpjb2Rld29yZHMpOw0KKyAgbV9udW1EYXRhQ29kZXdvcmRzID0gbnVtRGF0YUNvZGV3b3JkczsNCit9DQorQ0ZYX1B0ckFycmF5KiBDQkNfRGF0YU1hdHJpeERhdGFCbG9jazo6R2V0RGF0YUJsb2NrcygNCisgICAgQ0ZYX0J5dGVBcnJheSogcmF3Q29kZXdvcmRzLA0KKyAgICBDQkNfRGF0YU1hdHJpeFZlcnNpb24qIHZlcnNpb24sDQorICAgIGludDMyX3QmIGUpIHsNCisgIEVDQmxvY2tzKiBlY0Jsb2NrcyA9IHZlcnNpb24tPkdldEVDQmxvY2tzKCk7DQorICBpbnQzMl90IHRvdGFsQmxvY2tzID0gMDsNCisgIGNvbnN0IENGWF9QdHJBcnJheSYgZWNCbG9ja0FycmF5ID0gZWNCbG9ja3MtPkdldEVDQmxvY2tzKCk7DQorICBpbnQzMl90IGk7DQorICBmb3IgKGkgPSAwOyBpIDwgZWNCbG9ja0FycmF5LkdldFNpemUoKTsgaSsrKSB7DQorICAgIHRvdGFsQmxvY2tzICs9ICgoRUNCKillY0Jsb2NrQXJyYXlbaV0pLT5HZXRDb3VudCgpOw0KKyAgfQ0KKyAgQ0JDX0F1dG9QdHI8Q0ZYX1B0ckFycmF5PiByZXN1bHQobmV3IENGWF9QdHJBcnJheSgpKTsNCisgIHJlc3VsdC0+U2V0U2l6ZSh0b3RhbEJsb2Nrcyk7DQorICBpbnQzMl90IG51bVJlc3VsdEJsb2NrcyA9IDA7DQorICBpbnQzMl90IGo7DQorICBmb3IgKGogPSAwOyBqIDwgZWNCbG9ja0FycmF5LkdldFNpemUoKTsgaisrKSB7DQorICAgIGZvciAoaSA9IDA7IGkgPCAoKEVDQiopZWNCbG9ja0FycmF5W2pdKS0+R2V0Q291bnQoKTsgaSsrKSB7DQorICAgICAgaW50MzJfdCBudW1EYXRhQ29kZXdvcmRzID0gKChFQ0IqKWVjQmxvY2tBcnJheVtqXSktPkdldERhdGFDb2Rld29yZHMoKTsNCisgICAgICBpbnQzMl90IG51bUJsb2NrQ29kZXdvcmRzID0gZWNCbG9ja3MtPkdldEVDQ29kZXdvcmRzKCkgKyBudW1EYXRhQ29kZXdvcmRzOw0KKyAgICAgIENGWF9CeXRlQXJyYXkgY29kZXdvcmRzOw0KKyAgICAgIGNvZGV3b3Jkcy5TZXRTaXplKG51bUJsb2NrQ29kZXdvcmRzKTsNCisgICAgICAoKnJlc3VsdClbbnVtUmVzdWx0QmxvY2tzKytdID0NCisgICAgICAgICAgbmV3IENCQ19EYXRhTWF0cml4RGF0YUJsb2NrKG51bURhdGFDb2Rld29yZHMsICZjb2Rld29yZHMpOw0KKyAgICAgIGNvZGV3b3Jkcy5TZXRTaXplKDApOw0KKyAgICB9DQorICB9DQorICBpbnQzMl90IGxvbmdlckJsb2Nrc1RvdGFsQ29kZXdvcmRzID0NCisgICAgICAoKENCQ19EYXRhTWF0cml4RGF0YUJsb2NrKikoKnJlc3VsdClbMF0pLT5HZXRDb2Rld29yZHMoKS0+R2V0U2l6ZSgpOw0KKyAgaW50MzJfdCBsb25nZXJCbG9ja3NOdW1EYXRhQ29kZXdvcmRzID0NCisgICAgICBsb25nZXJCbG9ja3NUb3RhbENvZGV3b3JkcyAtIGVjQmxvY2tzLT5HZXRFQ0NvZGV3b3JkcygpOw0KKyAgaW50MzJfdCBzaG9ydGVyQmxvY2tzTnVtRGF0YUNvZGV3b3JkcyA9IGxvbmdlckJsb2Nrc051bURhdGFDb2Rld29yZHMgLSAxOw0KKyAgaW50MzJfdCByYXdDb2Rld29yZHNPZmZzZXQgPSAwOw0KKyAgZm9yIChpID0gMDsgaSA8IHNob3J0ZXJCbG9ja3NOdW1EYXRhQ29kZXdvcmRzOyBpKyspIHsNCisgICAgaW50MzJfdCBqOw0KKyAgICBmb3IgKGogPSAwOyBqIDwgbnVtUmVzdWx0QmxvY2tzOyBqKyspIHsNCisgICAgICBpZiAocmF3Q29kZXdvcmRzT2Zmc2V0IDwgcmF3Q29kZXdvcmRzLT5HZXRTaXplKCkpIHsNCisgICAgICAgICgoQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2sqKSgqcmVzdWx0KVtqXSkNCisgICAgICAgICAgICAtPkdldENvZGV3b3JkcygpDQorICAgICAgICAgICAgLT4NCisgICAgICAgICAgICBvcGVyYXRvcltdKGkpID0gKCpyYXdDb2Rld29yZHMpW3Jhd0NvZGV3b3Jkc09mZnNldCsrXTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIEZYX0JPT0wgc3BlY2lhbFZlcnNpb24gPSB2ZXJzaW9uLT5HZXRWZXJzaW9uTnVtYmVyKCkgPT0gMjQ7DQorICBpbnQzMl90IG51bUxvbmdlckJsb2NrcyA9IHNwZWNpYWxWZXJzaW9uID8gOCA6IG51bVJlc3VsdEJsb2NrczsNCisgIGZvciAoaiA9IDA7IGogPCBudW1Mb25nZXJCbG9ja3M7IGorKykgew0KKyAgICBpZiAocmF3Q29kZXdvcmRzT2Zmc2V0IDwgcmF3Q29kZXdvcmRzLT5HZXRTaXplKCkpIHsNCisgICAgICAoKENCQ19EYXRhTWF0cml4RGF0YUJsb2NrKikoKnJlc3VsdClbal0pDQorICAgICAgICAgIC0+R2V0Q29kZXdvcmRzKCkNCisgICAgICAgICAgLT4NCisgICAgICAgICAgb3BlcmF0b3JbXShsb25nZXJCbG9ja3NOdW1EYXRhQ29kZXdvcmRzIC0gMSkgPQ0KKyAgICAgICAgICAoKnJhd0NvZGV3b3JkcylbcmF3Q29kZXdvcmRzT2Zmc2V0KytdOw0KKyAgICB9DQorICB9DQorICBpbnQzMl90IG1heCA9DQorICAgICAgKChDQkNfRGF0YU1hdHJpeERhdGFCbG9jayopKCpyZXN1bHQpWzBdKS0+R2V0Q29kZXdvcmRzKCktPkdldFNpemUoKTsNCisgIGZvciAoaSA9IGxvbmdlckJsb2Nrc051bURhdGFDb2Rld29yZHM7IGkgPCBtYXg7IGkrKykgew0KKyAgICBpbnQzMl90IGo7DQorICAgIGZvciAoaiA9IDA7IGogPCBudW1SZXN1bHRCbG9ja3M7IGorKykgew0KKyAgICAgIGludDMyX3QgaU9mZnNldCA9IHNwZWNpYWxWZXJzaW9uICYmIGogPiA3ID8gaSAtIDEgOiBpOw0KKyAgICAgIGlmIChyYXdDb2Rld29yZHNPZmZzZXQgPCByYXdDb2Rld29yZHMtPkdldFNpemUoKSkgew0KKyAgICAgICAgKChDQkNfRGF0YU1hdHJpeERhdGFCbG9jayopKCpyZXN1bHQpW2pdKQ0KKyAgICAgICAgICAgIC0+R2V0Q29kZXdvcmRzKCkNCisgICAgICAgICAgICAtPg0KKyAgICAgICAgICAgIG9wZXJhdG9yW10oaU9mZnNldCkgPSAoKnJhd0NvZGV3b3JkcylbcmF3Q29kZXdvcmRzT2Zmc2V0KytdOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHJhd0NvZGV3b3Jkc09mZnNldCAhPSByYXdDb2Rld29yZHMtPkdldFNpemUoKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7DQorfQ0KK2ludDMyX3QgQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2s6OkdldE51bURhdGFDb2Rld29yZHMoKSB7DQorICByZXR1cm4gbV9udW1EYXRhQ29kZXdvcmRzOw0KK30NCitDRlhfQnl0ZUFycmF5KiBDQkNfRGF0YU1hdHJpeERhdGFCbG9jazo6R2V0Q29kZXdvcmRzKCkgew0KKyAgcmV0dXJuICZtX2NvZGV3b3JkczsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4RGF0YUJsb2NrLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhEYXRhQmxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjM0ZTY4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4RGF0YUJsb2NrLmgKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19EQVRBTUFUUklYREFUQUJMT0NLX0hfDQorI2RlZmluZSBfQkNfREFUQU1BVFJJWERBVEFCTE9DS19IXw0KK2NsYXNzIENCQ19EYXRhTWF0cml4VmVyc2lvbjsNCitjbGFzcyBDQkNfRGF0YU1hdHJpeERhdGFCbG9jayB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfkNCQ19EYXRhTWF0cml4RGF0YUJsb2NrKCk7DQorDQorICBpbnQzMl90IEdldE51bURhdGFDb2Rld29yZHMoKTsNCisgIENGWF9CeXRlQXJyYXkqIEdldENvZGV3b3JkcygpOw0KKw0KKyAgc3RhdGljIENGWF9QdHJBcnJheSogR2V0RGF0YUJsb2NrcyhDRlhfQnl0ZUFycmF5KiByYXdDb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19EYXRhTWF0cml4VmVyc2lvbiogdmVyc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorDQorIHByaXZhdGU6DQorICBpbnQzMl90IG1fbnVtRGF0YUNvZGV3b3JkczsNCisgIENGWF9CeXRlQXJyYXkgbV9jb2Rld29yZHM7DQorDQorICBDQkNfRGF0YU1hdHJpeERhdGFCbG9jayhpbnQzMl90IG51bURhdGFDb2Rld29yZHMsIENGWF9CeXRlQXJyYXkqIGNvZGV3b3Jkcyk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MzhmYjQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmNwcApAQCAtMCwwICsxLDQ4NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwOCBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25EZWNvZGVyUmVzdWx0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRTb3VyY2UuaCINCisjaW5jbHVkZSAiQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCINCitjb25zdCBGWF9DSEFSIENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6QzQwX0JBU0lDX1NFVF9DSEFSU1tdID0gew0KKyAgICAnKicsICcqJywgJyonLCAnICcsICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywNCisgICAgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJywgJ0cnLCAnSCcsICdJJywgJ0onLCAnSycsICdMJywgJ00nLCAnTicsDQorICAgICdPJywgJ1AnLCAnUScsICdSJywgJ1MnLCAnVCcsICdVJywgJ1YnLCAnVycsICdYJywgJ1knLCAnWid9Ow0KK2NvbnN0IEZYX0NIQVIgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpDNDBfU0hJRlQyX1NFVF9DSEFSU1tdID0gew0KKyAgICAnIScsICciJywgJyMnLCAnJCcsICclJywgJyYnLCAnXCcnLCAnKCcsICcpJywgJyonLCAgJysnLCAnLCcsICctJywgJy4nLA0KKyAgICAnLycsICc6JywgJzsnLCAnPCcsICc9JywgJz4nLCAnPycsICAnQCcsICdbJywgJ1xcJywgJ10nLCAnXicsICdfJ307DQorY29uc3QgRlhfQ0hBUiBDQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXI6OlRFWFRfQkFTSUNfU0VUX0NIQVJTW10gPSB7DQorICAgICcqJywgJyonLCAnKicsICcgJywgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLA0KKyAgICAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicsICdrJywgJ2wnLCAnbScsICduJywNCisgICAgJ28nLCAncCcsICdxJywgJ3InLCAncycsICd0JywgJ3UnLCAndicsICd3JywgJ3gnLCAneScsICd6J307DQorY29uc3QgRlhfQ0hBUiBDQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXI6OlRFWFRfU0hJRlQzX1NFVF9DSEFSU1tdID0gew0KKyAgICAnXCcnLCAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnLCAnRycsICdIJywgJ0knLCAgICAgICAgICdKJywNCisgICAgJ0snLCAgJ0wnLCAnTScsICdOJywgJ08nLCAnUCcsICdRJywgJ1InLCAnUycsICdUJywgICAgICAgICAnVScsDQorICAgICdWJywgICdXJywgJ1gnLCAnWScsICdaJywgJ3snLCAnfCcsICd9JywgJ34nLCAoRlhfQ0hBUikxMjd9Ow0KK2NvbnN0IGludDMyX3QgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpQQURfRU5DT0RFID0gMDsNCitjb25zdCBpbnQzMl90IENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6QVNDSUlfRU5DT0RFID0gMTsNCitjb25zdCBpbnQzMl90IENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6QzQwX0VOQ09ERSA9IDI7DQorY29uc3QgaW50MzJfdCBDQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXI6OlRFWFRfRU5DT0RFID0gMzsNCitjb25zdCBpbnQzMl90IENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6QU5TSVgxMl9FTkNPREUgPSA0Ow0KK2NvbnN0IGludDMyX3QgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpFRElGQUNUX0VOQ09ERSA9IDU7DQorY29uc3QgaW50MzJfdCBDQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkJBU0UyNTZfRU5DT0RFID0gNjsNCitDQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkNCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcigpIHt9DQorQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjp+Q0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyKCkge30NCitDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpEZWNvZGUoDQorICAgIENGWF9CeXRlQXJyYXkmIGJ5dGVzLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBDQkNfQ29tbW9uQml0U291cmNlIGJpdHMoJmJ5dGVzKTsNCisgIENGWF9CeXRlU3RyaW5nIHJlc3VsdDsNCisgIENGWF9CeXRlU3RyaW5nIHJlc3VsdFRyYWlsZXI7DQorICBDRlhfSW50MzJBcnJheSBieXRlU2VnbWVudHM7DQorICBpbnQzMl90IG1vZGUgPSBBU0NJSV9FTkNPREU7DQorICBkbyB7DQorICAgIGlmIChtb2RlID09IDEpIHsNCisgICAgICBtb2RlID0gRGVjb2RlQXNjaWlTZWdtZW50KCZiaXRzLCByZXN1bHQsIHJlc3VsdFRyYWlsZXIsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBzd2l0Y2ggKG1vZGUpIHsNCisgICAgICAgIGNhc2UgMjoNCisgICAgICAgICAgRGVjb2RlQzQwU2VnbWVudCgmYml0cywgcmVzdWx0LCBlKTsNCisgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMzoNCisgICAgICAgICAgRGVjb2RlVGV4dFNlZ21lbnQoJmJpdHMsIHJlc3VsdCwgZSk7DQorICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIDQ6DQorICAgICAgICAgIERlY29kZUFuc2lYMTJTZWdtZW50KCZiaXRzLCByZXN1bHQsIGUpOw0KKyAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSA1Og0KKyAgICAgICAgICBEZWNvZGVFZGlmYWN0U2VnbWVudCgmYml0cywgcmVzdWx0LCBlKTsNCisgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgNjoNCisgICAgICAgICAgRGVjb2RlQmFzZTI1NlNlZ21lbnQoJmJpdHMsIHJlc3VsdCwgYnl0ZVNlZ21lbnRzLCBlKTsNCisgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgIE5VTEw7DQorICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCisgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgfQ0KKyAgICAgIG1vZGUgPSBBU0NJSV9FTkNPREU7DQorICAgIH0NCisgIH0gd2hpbGUgKG1vZGUgIT0gUEFEX0VOQ09ERSAmJiBiaXRzLkF2YWlsYWJsZSgpID4gMCk7DQorICBpZiAocmVzdWx0VHJhaWxlci5HZXRMZW5ndGgoKSA+IDApIHsNCisgICAgcmVzdWx0ICs9IHJlc3VsdFRyYWlsZXI7DQorICB9DQorICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogdGVtcENwID0gbmV3IENCQ19Db21tb25EZWNvZGVyUmVzdWx0KCk7DQorICB0ZW1wQ3AtPkluaXQoYnl0ZXMsIHJlc3VsdCwNCisgICAgICAgICAgICAgICAoYnl0ZVNlZ21lbnRzLkdldFNpemUoKSA8PSAwKSA/IENGWF9JbnQzMkFycmF5KCkgOiBieXRlU2VnbWVudHMsDQorICAgICAgICAgICAgICAgTlVMTCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gdGVtcENwOw0KK30NCitpbnQzMl90IENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6RGVjb2RlQXNjaWlTZWdtZW50KA0KKyAgICBDQkNfQ29tbW9uQml0U291cmNlKiBiaXRzLA0KKyAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0LA0KKyAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0VHJhaWxlciwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgRlhfQ0hBUiBidWZmZXJbMTI4XTsNCisgIEZYX0JPT0wgdXBwZXJTaGlmdCA9IEZBTFNFOw0KKyAgZG8gew0KKyAgICBpbnQzMl90IG9uZUJ5dGUgPSBiaXRzLT5SZWFkQml0cyg4LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KKyAgICBpZiAob25lQnl0ZSA9PSAwKSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9IGVsc2UgaWYgKG9uZUJ5dGUgPD0gMTI4KSB7DQorICAgICAgb25lQnl0ZSA9IHVwcGVyU2hpZnQgPyBvbmVCeXRlICsgMTI4IDogb25lQnl0ZTsNCisgICAgICB1cHBlclNoaWZ0ID0gRkFMU0U7DQorICAgICAgcmVzdWx0ICs9ICgoRlhfQ0hBUikob25lQnl0ZSAtIDEpKTsNCisgICAgICByZXR1cm4gQVNDSUlfRU5DT0RFOw0KKyAgICB9IGVsc2UgaWYgKG9uZUJ5dGUgPT0gMTI5KSB7DQorICAgICAgcmV0dXJuIFBBRF9FTkNPREU7DQorICAgIH0gZWxzZSBpZiAob25lQnl0ZSA8PSAyMjkpIHsNCisgICAgICBpbnQzMl90IHZhbHVlID0gb25lQnl0ZSAtIDEzMDsNCisjaWYgZGVmaW5lZChfRlhfV0lOQVBJX1BBUlRJVElPTl9BUFBfKQ0KKyAgICAgIG1lbXNldChidWZmZXIsIDAsIHNpemVvZihGWF9DSEFSKSAqIDEyOCk7DQorICAgICAgX2l0b2Ffcyh2YWx1ZSwgYnVmZmVyLCAxMjgsIDEwKTsNCisjZWxzZQ0KKyAgICAgIEZYU1lTX2l0b2EodmFsdWUsIGJ1ZmZlciwgMTApOw0KKyNlbmRpZg0KKyAgICAgIGlmICh2YWx1ZSA8IDEwKSB7DQorICAgICAgICByZXN1bHQgKz0gJzAnOw0KKyAgICAgICAgYnVmZmVyWzFdID0gJ1wwJzsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgYnVmZmVyWzJdID0gJ1wwJzsNCisgICAgICB9DQorICAgICAgcmVzdWx0ICs9IGJ1ZmZlcjsNCisgICAgfSBlbHNlIGlmIChvbmVCeXRlID09IDIzMCkgew0KKyAgICAgIHJldHVybiBDNDBfRU5DT0RFOw0KKyAgICB9IGVsc2UgaWYgKG9uZUJ5dGUgPT0gMjMxKSB7DQorICAgICAgcmV0dXJuIEJBU0UyNTZfRU5DT0RFOw0KKyAgICB9IGVsc2UgaWYgKG9uZUJ5dGUgPT0gMjMyIHx8IG9uZUJ5dGUgPT0gMjMzIHx8IG9uZUJ5dGUgPT0gMjM0KSB7DQorICAgIH0gZWxzZSBpZiAob25lQnl0ZSA9PSAyMzUpIHsNCisgICAgICB1cHBlclNoaWZ0ID0gVFJVRTsNCisgICAgfSBlbHNlIGlmIChvbmVCeXRlID09IDIzNikgew0KKyAgICAgIHJlc3VsdCArPSAiWyk+IjsNCisgICAgICByZXN1bHQgKz0gMHgxRTsNCisgICAgICByZXN1bHQgKz0gIjA1IjsNCisgICAgICByZXN1bHQgKz0gMHgxRDsNCisgICAgICByZXN1bHRUcmFpbGVyLkluc2VydCgwLCAweDFFKTsNCisgICAgICByZXN1bHRUcmFpbGVyLkluc2VydCgwICsgMSwgMHgwNCk7DQorICAgIH0gZWxzZSBpZiAob25lQnl0ZSA9PSAyMzcpIHsNCisgICAgICByZXN1bHQgKz0gIlspPiI7DQorICAgICAgcmVzdWx0ICs9IDB4MUU7DQorICAgICAgcmVzdWx0ICs9ICIwNiI7DQorICAgICAgcmVzdWx0ICs9IDB4MUQ7DQorICAgICAgcmVzdWx0VHJhaWxlci5JbnNlcnQoMCwgMHgxRSk7DQorICAgICAgcmVzdWx0VHJhaWxlci5JbnNlcnQoMCArIDEsIDB4MDQpOw0KKyAgICB9IGVsc2UgaWYgKG9uZUJ5dGUgPT0gMjM4KSB7DQorICAgICAgcmV0dXJuIEFOU0lYMTJfRU5DT0RFOw0KKyAgICB9IGVsc2UgaWYgKG9uZUJ5dGUgPT0gMjM5KSB7DQorICAgICAgcmV0dXJuIFRFWFRfRU5DT0RFOw0KKyAgICB9IGVsc2UgaWYgKG9uZUJ5dGUgPT0gMjQwKSB7DQorICAgICAgcmV0dXJuIEVESUZBQ1RfRU5DT0RFOw0KKyAgICB9IGVsc2UgaWYgKG9uZUJ5dGUgPT0gMjQxKSB7DQorICAgIH0gZWxzZSBpZiAob25lQnl0ZSA+PSAyNDIpIHsNCisgICAgICBpZiAob25lQnl0ZSA9PSAyNTQgJiYgYml0cy0+QXZhaWxhYmxlKCkgPT0gMCkgew0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgICByZXR1cm4gMDsNCisgICAgICB9DQorICAgIH0NCisgIH0gd2hpbGUgKGJpdHMtPkF2YWlsYWJsZSgpID4gMCk7DQorICByZXR1cm4gQVNDSUlfRU5DT0RFOw0KK30NCit2b2lkIENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6RGVjb2RlQzQwU2VnbWVudCgNCisgICAgQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywNCisgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgRlhfQk9PTCB1cHBlclNoaWZ0ID0gRkFMU0U7DQorICBDRlhfSW50MzJBcnJheSBjVmFsdWVzOw0KKyAgY1ZhbHVlcy5TZXRTaXplKDMpOw0KKyAgZG8gew0KKyAgICBpZiAoYml0cy0+QXZhaWxhYmxlKCkgPT0gOCkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpbnQzMl90IGZpcnN0Qnl0ZSA9IGJpdHMtPlJlYWRCaXRzKDgsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgaWYgKGZpcnN0Qnl0ZSA9PSAyNTQpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaW50MzJfdCB0ZW1wcCA9IGJpdHMtPlJlYWRCaXRzKDgsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgUGFyc2VUd29CeXRlcyhmaXJzdEJ5dGUsIHRlbXBwLCBjVmFsdWVzKTsNCisgICAgaW50MzJfdCBzaGlmdCA9IDA7DQorICAgIGludDMyX3QgaTsNCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgew0KKyAgICAgIGludDMyX3QgY1ZhbHVlID0gY1ZhbHVlc1tpXTsNCisgICAgICBzd2l0Y2ggKHNoaWZ0KSB7DQorICAgICAgICBjYXNlIDA6DQorICAgICAgICAgIGlmIChjVmFsdWUgPCAzKSB7DQorICAgICAgICAgICAgc2hpZnQgPSBjVmFsdWUgKyAxOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKGNWYWx1ZSA8IDI3KSB7DQorICAgICAgICAgICAgRlhfQ0hBUiBjNDBjaGFyID0gQzQwX0JBU0lDX1NFVF9DSEFSU1tjVmFsdWVdOw0KKyAgICAgICAgICAgIGlmICh1cHBlclNoaWZ0KSB7DQorICAgICAgICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpKGM0MGNoYXIgKyAxMjgpOw0KKyAgICAgICAgICAgICAgdXBwZXJTaGlmdCA9IEZBTFNFOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICByZXN1bHQgKz0gYzQwY2hhcjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMToNCisgICAgICAgICAgaWYgKHVwcGVyU2hpZnQpIHsNCisgICAgICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpKGNWYWx1ZSArIDEyOCk7DQorICAgICAgICAgICAgdXBwZXJTaGlmdCA9IEZBTFNFOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHJlc3VsdCArPSBjVmFsdWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc2hpZnQgPSAwOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMjoNCisgICAgICAgICAgaWYgKGNWYWx1ZSA8IDI3KSB7DQorICAgICAgICAgICAgRlhfQ0hBUiBjNDBjaGFyID0gQzQwX1NISUZUMl9TRVRfQ0hBUlNbY1ZhbHVlXTsNCisgICAgICAgICAgICBpZiAodXBwZXJTaGlmdCkgew0KKyAgICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKShjNDBjaGFyICsgMTI4KTsNCisgICAgICAgICAgICAgIHVwcGVyU2hpZnQgPSBGQUxTRTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgcmVzdWx0ICs9IGM0MGNoYXI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2UgaWYgKGNWYWx1ZSA9PSAyNykgew0KKyAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgIH0gZWxzZSBpZiAoY1ZhbHVlID09IDMwKSB7DQorICAgICAgICAgICAgdXBwZXJTaGlmdCA9IFRSVUU7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaGlmdCA9IDA7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAzOg0KKyAgICAgICAgICBpZiAodXBwZXJTaGlmdCkgew0KKyAgICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUikoY1ZhbHVlICsgMjI0KTsNCisgICAgICAgICAgICB1cHBlclNoaWZ0ID0gRkFMU0U7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKShjVmFsdWUgKyA5Nik7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc2hpZnQgPSAwOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgIH0NCisgIH0gd2hpbGUgKGJpdHMtPkF2YWlsYWJsZSgpID4gMCk7DQorfQ0KK3ZvaWQgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpEZWNvZGVUZXh0U2VnbWVudCgNCisgICAgQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywNCisgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgRlhfQk9PTCB1cHBlclNoaWZ0ID0gRkFMU0U7DQorICBDRlhfSW50MzJBcnJheSBjVmFsdWVzOw0KKyAgY1ZhbHVlcy5TZXRTaXplKDMpOw0KKyAgaW50MzJfdCBzaGlmdCA9IDA7DQorICBkbyB7DQorICAgIGlmIChiaXRzLT5BdmFpbGFibGUoKSA9PSA4KSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGludDMyX3QgZmlyc3RCeXRlID0gYml0cy0+UmVhZEJpdHMoOCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBpZiAoZmlyc3RCeXRlID09IDI1NCkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpbnQzMl90IGluVHAgPSBiaXRzLT5SZWFkQml0cyg4LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIFBhcnNlVHdvQnl0ZXMoZmlyc3RCeXRlLCBpblRwLCBjVmFsdWVzKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMzsgaSsrKSB7DQorICAgICAgaW50MzJfdCBjVmFsdWUgPSBjVmFsdWVzW2ldOw0KKyAgICAgIHN3aXRjaCAoc2hpZnQpIHsNCisgICAgICAgIGNhc2UgMDoNCisgICAgICAgICAgaWYgKGNWYWx1ZSA8IDMpIHsNCisgICAgICAgICAgICBzaGlmdCA9IGNWYWx1ZSArIDE7DQorICAgICAgICAgIH0gZWxzZSBpZiAoY1ZhbHVlIDwgNDApIHsNCisgICAgICAgICAgICBGWF9DSEFSIHRleHRDaGFyID0gVEVYVF9CQVNJQ19TRVRfQ0hBUlNbY1ZhbHVlXTsNCisgICAgICAgICAgICBpZiAodXBwZXJTaGlmdCkgew0KKyAgICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKSh0ZXh0Q2hhciArIDEyOCk7DQorICAgICAgICAgICAgICB1cHBlclNoaWZ0ID0gRkFMU0U7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHJlc3VsdCArPSB0ZXh0Q2hhcjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMToNCisgICAgICAgICAgaWYgKHVwcGVyU2hpZnQpIHsNCisgICAgICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpKGNWYWx1ZSArIDEyOCk7DQorICAgICAgICAgICAgdXBwZXJTaGlmdCA9IEZBTFNFOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHJlc3VsdCArPSBjVmFsdWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc2hpZnQgPSAwOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMjoNCisgICAgICAgICAgaWYgKGNWYWx1ZSA8IDI3KSB7DQorICAgICAgICAgICAgRlhfQ0hBUiBjNDBjaGFyID0gQzQwX1NISUZUMl9TRVRfQ0hBUlNbY1ZhbHVlXTsNCisgICAgICAgICAgICBpZiAodXBwZXJTaGlmdCkgew0KKyAgICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKShjNDBjaGFyICsgMTI4KTsNCisgICAgICAgICAgICAgIHVwcGVyU2hpZnQgPSBGQUxTRTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgcmVzdWx0ICs9IGM0MGNoYXI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2UgaWYgKGNWYWx1ZSA9PSAyNykgew0KKyAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgIH0gZWxzZSBpZiAoY1ZhbHVlID09IDMwKSB7DQorICAgICAgICAgICAgdXBwZXJTaGlmdCA9IFRSVUU7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzaGlmdCA9IDA7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAzOg0KKyAgICAgICAgICBpZiAoY1ZhbHVlIDwgMTkpIHsNCisgICAgICAgICAgICBGWF9DSEFSIHRleHRDaGFyID0gVEVYVF9TSElGVDNfU0VUX0NIQVJTW2NWYWx1ZV07DQorICAgICAgICAgICAgaWYgKHVwcGVyU2hpZnQpIHsNCisgICAgICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUikodGV4dENoYXIgKyAxMjgpOw0KKyAgICAgICAgICAgICAgdXBwZXJTaGlmdCA9IEZBTFNFOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICByZXN1bHQgKz0gdGV4dENoYXI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHNoaWZ0ID0gMDsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbjsNCisgICAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSB3aGlsZSAoYml0cy0+QXZhaWxhYmxlKCkgPiAwKTsNCit9DQordm9pZCBDQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkRlY29kZUFuc2lYMTJTZWdtZW50KA0KKyAgICBDQkNfQ29tbW9uQml0U291cmNlKiBiaXRzLA0KKyAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0LA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBDRlhfSW50MzJBcnJheSBjVmFsdWVzOw0KKyAgY1ZhbHVlcy5TZXRTaXplKDMpOw0KKyAgZG8gew0KKyAgICBpZiAoYml0cy0+QXZhaWxhYmxlKCkgPT0gOCkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpbnQzMl90IGZpcnN0Qnl0ZSA9IGJpdHMtPlJlYWRCaXRzKDgsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgaWYgKGZpcnN0Qnl0ZSA9PSAyNTQpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaW50MzJfdCBpVGVtcDEgPSBiaXRzLT5SZWFkQml0cyg4LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIFBhcnNlVHdvQnl0ZXMoZmlyc3RCeXRlLCBpVGVtcDEsIGNWYWx1ZXMpOw0KKyAgICBpbnQzMl90IGk7DQorICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsNCisgICAgICBpbnQzMl90IGNWYWx1ZSA9IGNWYWx1ZXNbaV07DQorICAgICAgaWYgKGNWYWx1ZSA9PSAwKSB7DQorICAgICAgICBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChyZXN1bHQsIDEsICdccicpOw0KKyAgICAgIH0gZWxzZSBpZiAoY1ZhbHVlID09IDEpIHsNCisgICAgICAgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgMSwgJyonKTsNCisgICAgICB9IGVsc2UgaWYgKGNWYWx1ZSA9PSAyKSB7DQorICAgICAgICBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChyZXN1bHQsIDEsICc+Jyk7DQorICAgICAgfSBlbHNlIGlmIChjVmFsdWUgPT0gMykgew0KKyAgICAgICAgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQocmVzdWx0LCAxLCAnICcpOw0KKyAgICAgIH0gZWxzZSBpZiAoY1ZhbHVlIDwgMTQpIHsNCisgICAgICAgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgMSwgKEZYX0NIQVIpKGNWYWx1ZSArIDQ0KSk7DQorICAgICAgfSBlbHNlIGlmIChjVmFsdWUgPCA0MCkgew0KKyAgICAgICAgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQocmVzdWx0LCAxLCAoRlhfQ0hBUikoY1ZhbHVlICsgNTEpKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSB3aGlsZSAoYml0cy0+QXZhaWxhYmxlKCkgPiAwKTsNCit9DQordm9pZCBDQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXI6OlBhcnNlVHdvQnl0ZXMoDQorICAgIGludDMyX3QgZmlyc3RCeXRlLA0KKyAgICBpbnQzMl90IHNlY29uZEJ5dGUsDQorICAgIENGWF9JbnQzMkFycmF5JiByZXN1bHQpIHsNCisgIGludDMyX3QgZnVsbEJpdFZhbHVlID0gKGZpcnN0Qnl0ZSA8PCA4KSArIHNlY29uZEJ5dGUgLSAxOw0KKyAgaW50MzJfdCB0ZW1wID0gZnVsbEJpdFZhbHVlIC8gMTYwMDsNCisgIHJlc3VsdFswXSA9IHRlbXA7DQorICBmdWxsQml0VmFsdWUgLT0gdGVtcCAqIDE2MDA7DQorICB0ZW1wID0gZnVsbEJpdFZhbHVlIC8gNDA7DQorICByZXN1bHRbMV0gPSB0ZW1wOw0KKyAgcmVzdWx0WzJdID0gZnVsbEJpdFZhbHVlIC0gdGVtcCAqIDQwOw0KK30NCit2b2lkIENCQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6RGVjb2RlRWRpZmFjdFNlZ21lbnQoDQorICAgIENCQ19Db21tb25CaXRTb3VyY2UqIGJpdHMsDQorICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQsDQorICAgIGludDMyX3QmIGUpIHsNCisgIEZYX0NIQVIgYnVmZmVyWzEyOF07DQorICBGWF9CT09MIHVubGF0Y2ggPSBGQUxTRTsNCisgIGRvIHsNCisgICAgaWYgKGJpdHMtPkF2YWlsYWJsZSgpIDw9IDE2KSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGludDMyX3QgaTsNCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgew0KKyAgICAgIGludDMyX3QgZWRpZmFjdFZhbHVlID0gYml0cy0+UmVhZEJpdHMoNiwgZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgaWYgKGVkaWZhY3RWYWx1ZSA9PSAweDFGKSB7DQorICAgICAgICB1bmxhdGNoID0gVFJVRTsNCisgICAgICB9DQorICAgICAgaWYgKCF1bmxhdGNoKSB7DQorICAgICAgICBpZiAoKGVkaWZhY3RWYWx1ZSAmIDMyKSA9PSAwKSB7DQorICAgICAgICAgIGVkaWZhY3RWYWx1ZSB8PSA2NDsNCisgICAgICAgIH0NCisjaWYgZGVmaW5lZChfRlhfV0lOQVBJX1BBUlRJVElPTl9BUFBfKQ0KKyAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZW9mKEZYX0NIQVIpICogMTI4KTsNCisgICAgICAgIF9pdG9hX3MoZWRpZmFjdFZhbHVlLCBidWZmZXIsIDEyOCwgMTApOw0KKyAgICAgICAgcmVzdWx0ICs9IGJ1ZmZlcjsNCisjZWxzZQ0KKyAgICAgICAgcmVzdWx0ICs9IEZYU1lTX2l0b2EoZWRpZmFjdFZhbHVlLCBidWZmZXIsIDEwKTsNCisjZW5kaWYNCisgICAgICB9DQorICAgIH0NCisgIH0gd2hpbGUgKCF1bmxhdGNoICYmIGJpdHMtPkF2YWlsYWJsZSgpID4gMCk7DQorfQ0KK3ZvaWQgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpEZWNvZGVCYXNlMjU2U2VnbWVudCgNCisgICAgQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywNCisgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCwNCisgICAgQ0ZYX0ludDMyQXJyYXkmIGJ5dGVTZWdtZW50cywNCisgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBjb2Rld29yZFBvc2l0aW9uID0gMSArIGJpdHMtPmdldEJ5dGVPZmZzZXQoKTsNCisgIGludDMyX3QgaVRtcCA9IGJpdHMtPlJlYWRCaXRzKDgsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBpbnQzMl90IGQxID0gVW5yYW5kb21pemUyNTVTdGF0ZShpVG1wLCBjb2Rld29yZFBvc2l0aW9uKyspOw0KKyAgaW50MzJfdCBjb3VudDsNCisgIGlmIChkMSA9PSAwKSB7DQorICAgIGNvdW50ID0gYml0cy0+QXZhaWxhYmxlKCkgLyA4Ow0KKyAgfSBlbHNlIGlmIChkMSA8IDI1MCkgew0KKyAgICBjb3VudCA9IGQxOw0KKyAgfSBlbHNlIHsNCisgICAgaW50MzJfdCBpVG1wMyA9IGJpdHMtPlJlYWRCaXRzKDgsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgY291bnQgPSAyNTAgKiAoZDEgLSAyNDkpICsgVW5yYW5kb21pemUyNTVTdGF0ZShpVG1wMywgY29kZXdvcmRQb3NpdGlvbisrKTsNCisgIH0NCisgIGlmIChjb3VudCA8IDApIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfQnl0ZUFycmF5KiBieXRlcyA9IG5ldyBDRlhfQnl0ZUFycmF5KCk7DQorICBieXRlcy0+U2V0U2l6ZShjb3VudCk7DQorICBpbnQzMl90IGk7DQorICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgew0KKyAgICBpZiAoYml0cy0+QXZhaWxhYmxlKCkgPCA4KSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICAgIGRlbGV0ZSBieXRlczsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaW50MzJfdCBpVGVtcDUgPSBiaXRzLT5SZWFkQml0cyg4LCBlKTsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgIGRlbGV0ZSBieXRlczsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgYnl0ZXMtPlNldEF0KGksIFVucmFuZG9taXplMjU1U3RhdGUoaVRlbXA1LCBjb2Rld29yZFBvc2l0aW9uKyspKTsNCisgIH0NCisgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgKmJ5dGVzKTsNCisgIGRlbGV0ZSBieXRlczsNCit9DQordWludDhfdCBDQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXI6OlVucmFuZG9taXplMjU1U3RhdGUoDQorICAgIGludDMyX3QgcmFuZG9taXplZEJhc2UyNTZDb2Rld29yZCwNCisgICAgaW50MzJfdCBiYXNlMjU2Q29kZXdvcmRQb3NpdGlvbikgew0KKyAgaW50MzJfdCBwc2V1ZG9SYW5kb21OdW1iZXIgPSAoKDE0OSAqIGJhc2UyNTZDb2Rld29yZFBvc2l0aW9uKSAlIDI1NSkgKyAxOw0KKyAgaW50MzJfdCB0ZW1wVmFyaWFibGUgPSByYW5kb21pemVkQmFzZTI1NkNvZGV3b3JkIC0gcHNldWRvUmFuZG9tTnVtYmVyOw0KKyAgcmV0dXJuICh1aW50OF90KSh0ZW1wVmFyaWFibGUgPj0gMCA/IHRlbXBWYXJpYWJsZSA6IHRlbXBWYXJpYWJsZSArIDI1Nik7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGFkMzk2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4RGVjb2RlZEJpdFN0cmVhbVBhcnNlci5oCkBAIC0wLDAgKzEsNTcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfREFUQU1BVFJJWERFQ09ERURCSVRTVFJFQU1QQVJTRVJfSF8NCisjZGVmaW5lIF9CQ19EQVRBTUFUUklYREVDT0RFREJJVFNUUkVBTVBBUlNFUl9IXw0KK2NsYXNzIENCQ19Db21tb25EZWNvZGVyUmVzdWx0Ow0KK2NsYXNzIENCQ19Db21tb25CaXRTb3VyY2U7DQorY2xhc3MgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyIHsNCisgcHVibGljOg0KKyAgQ0JDX0RhdGFNYXRyaXhEZWNvZGVkQml0U3RyZWFtUGFyc2VyKCk7DQorICB2aXJ0dWFsIH5DQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXIoKTsNCisgIHN0YXRpYyBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogRGVjb2RlKENGWF9CeXRlQXJyYXkmIGJ5dGVzLCBpbnQzMl90JiBlKTsNCisNCisgcHJpdmF0ZToNCisgIHN0YXRpYyBpbnQzMl90IERlY29kZUFzY2lpU2VnbWVudChDQkNfQ29tbW9uQml0U291cmNlKiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdFRyYWlsZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCBEZWNvZGVDNDBTZWdtZW50KENCQ19Db21tb25CaXRTb3VyY2UqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgRGVjb2RlVGV4dFNlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIERlY29kZUFuc2lYMTJTZWdtZW50KENCQ19Db21tb25CaXRTb3VyY2UqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCBQYXJzZVR3b0J5dGVzKGludDMyX3QgZmlyc3RCeXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlY29uZEJ5dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5JiByZXN1bHQpOw0KKyAgc3RhdGljIHZvaWQgRGVjb2RlRWRpZmFjdFNlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIERlY29kZUJhc2UyNTZTZWdtZW50KENCQ19Db21tb25CaXRTb3VyY2UqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkmIGJ5dGVTZWdtZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHVpbnQ4X3QgVW5yYW5kb21pemUyNTVTdGF0ZShpbnQzMl90IHJhbmRvbWl6ZWRCYXNlMjU2Q29kZXdvcmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYmFzZTI1NkNvZGV3b3JkUG9zaXRpb24pOw0KKw0KKyAgY29uc3Qgc3RhdGljIEZYX0NIQVIgQzQwX0JBU0lDX1NFVF9DSEFSU1tdOw0KKyAgY29uc3Qgc3RhdGljIEZYX0NIQVIgQzQwX1NISUZUMl9TRVRfQ0hBUlNbXTsNCisNCisgIGNvbnN0IHN0YXRpYyBGWF9DSEFSIFRFWFRfQkFTSUNfU0VUX0NIQVJTW107DQorICBjb25zdCBzdGF0aWMgRlhfQ0hBUiBURVhUX1NISUZUM19TRVRfQ0hBUlNbXTsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IFBBRF9FTkNPREU7DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBBU0NJSV9FTkNPREU7DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBDNDBfRU5DT0RFOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgVEVYVF9FTkNPREU7DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBBTlNJWDEyX0VOQ09ERTsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IEVESUZBQ1RfRU5DT0RFOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgQkFTRTI1Nl9FTkNPREU7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhEZWNvZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeERlY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkODg2MjAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhEZWNvZGVyLmNwcApAQCAtMCwwICsxLDExNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uRGVjb2Rlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1Ni5oIg0KKyNpbmNsdWRlICJCQ19EYXRhTWF0cml4RGVjb2Rlci5oIg0KKyNpbmNsdWRlICJCQ19EYXRhTWF0cml4Qml0TWF0cml4UGFyc2VyLmgiDQorI2luY2x1ZGUgIkJDX0RhdGFNYXRyaXhWZXJzaW9uLmgiDQorI2luY2x1ZGUgIkJDX0RhdGFNYXRyaXhEYXRhQmxvY2suaCINCisjaW5jbHVkZSAiQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCINCitDQkNfRGF0YU1hdHJpeERlY29kZXI6OkNCQ19EYXRhTWF0cml4RGVjb2RlcigpIHsNCisgIG1fcnNEZWNvZGVyID0gTlVMTDsNCit9DQordm9pZCBDQkNfRGF0YU1hdHJpeERlY29kZXI6OkluaXQoKSB7DQorICBtX3JzRGVjb2RlciA9DQorICAgICAgbmV3IENCQ19SZWVkU29sb21vbkRlY29kZXIoQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkRhdGFNYXRyaXhGaWVsZCk7DQorfQ0KK0NCQ19EYXRhTWF0cml4RGVjb2Rlcjo6fkNCQ19EYXRhTWF0cml4RGVjb2RlcigpIHsNCisgIGlmIChtX3JzRGVjb2RlciAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBtX3JzRGVjb2RlcjsNCisgIH0NCisgIG1fcnNEZWNvZGVyID0gTlVMTDsNCit9DQorQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIENCQ19EYXRhTWF0cml4RGVjb2Rlcjo6RGVjb2RlKA0KKyAgICBDQkNfQ29tbW9uQml0TWF0cml4KiBiaXRzLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBDQkNfRGF0YU1hdHJpeEJpdE1hdHJpeFBhcnNlciBwYXJzZXI7DQorICBwYXJzZXIuSW5pdChiaXRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19EYXRhTWF0cml4VmVyc2lvbiogdmVyc2lvbiA9IHBhcnNlci5HZXRWZXJzaW9uKCk7DQorICBDRlhfQnl0ZUFycmF5KiBieXRlVGVtcCA9IHBhcnNlci5SZWFkQ29kZXdvcmRzKGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgQ0JDX0F1dG9QdHI8Q0ZYX0J5dGVBcnJheT4gY29kZXdvcmRzKGJ5dGVUZW1wKTsNCisgIENGWF9QdHJBcnJheSogZGF0YUJsb2NrcyA9DQorICAgICAgQ0JDX0RhdGFNYXRyaXhEYXRhQmxvY2s6OkdldERhdGFCbG9ja3MoY29kZXdvcmRzLmdldCgpLCB2ZXJzaW9uLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIGludDMyX3QgZGF0YUJsb2Nrc0NvdW50ID0gZGF0YUJsb2Nrcy0+R2V0U2l6ZSgpOw0KKyAgaW50MzJfdCB0b3RhbEJ5dGVzID0gMDsNCisgIGludDMyX3QgaSwgajsNCisgIGZvciAoaSA9IDA7IGkgPCBkYXRhQmxvY2tzQ291bnQ7IGkrKykgew0KKyAgICB0b3RhbEJ5dGVzICs9DQorICAgICAgICAoKENCQ19EYXRhTWF0cml4RGF0YUJsb2NrKikoKmRhdGFCbG9ja3MpW2ldKS0+R2V0TnVtRGF0YUNvZGV3b3JkcygpOw0KKyAgfQ0KKyAgQ0ZYX0J5dGVBcnJheSByZXN1bHRCeXRlczsNCisgIHJlc3VsdEJ5dGVzLlNldFNpemUodG90YWxCeXRlcyk7DQorICBmb3IgKGogPSAwOyBqIDwgZGF0YUJsb2Nrc0NvdW50OyBqKyspIHsNCisgICAgQ0ZYX0J5dGVBcnJheSogY29kZXdvcmRCeXRlcyA9DQorICAgICAgICAoKENCQ19EYXRhTWF0cml4RGF0YUJsb2NrKikoKmRhdGFCbG9ja3MpW2pdKS0+R2V0Q29kZXdvcmRzKCk7DQorICAgIGludDMyX3QgbnVtRGF0YUNvZGV3b3JkcyA9DQorICAgICAgICAoKENCQ19EYXRhTWF0cml4RGF0YUJsb2NrKikoKmRhdGFCbG9ja3MpW2pdKS0+R2V0TnVtRGF0YUNvZGV3b3JkcygpOw0KKyAgICBDb3JyZWN0RXJyb3JzKCpjb2Rld29yZEJ5dGVzLCBudW1EYXRhQ29kZXdvcmRzLCBlKTsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGRhdGFCbG9ja3MtPkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICBkZWxldGUgKENCQ19EYXRhTWF0cml4RGF0YUJsb2NrKikoKmRhdGFCbG9ja3MpW2ldOw0KKyAgICAgIH0NCisgICAgICBkZWxldGUgZGF0YUJsb2NrczsNCisgICAgICBkYXRhQmxvY2tzID0gTlVMTDsNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBpbnQzMl90IGk7DQorICAgIGZvciAoaSA9IDA7IGkgPCBudW1EYXRhQ29kZXdvcmRzOyBpKyspIHsNCisgICAgICByZXN1bHRCeXRlc1tpICogZGF0YUJsb2Nrc0NvdW50ICsgal0gPSAoKmNvZGV3b3JkQnl0ZXMpW2ldOw0KKyAgICB9DQorICB9DQorICBmb3IgKGkgPSAwOyBpIDwgKGRhdGFCbG9ja3MtPkdldFNpemUoKSk7IGkrKykgew0KKyAgICBkZWxldGUgKENCQ19EYXRhTWF0cml4RGF0YUJsb2NrKikoKmRhdGFCbG9ja3MpW2ldOw0KKyAgfQ0KKyAgZGVsZXRlIGRhdGFCbG9ja3M7DQorICBkYXRhQmxvY2tzID0gTlVMTDsNCisgIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KiByZXN1bHRSID0NCisgICAgICBDQkNfRGF0YU1hdHJpeERlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkRlY29kZShyZXN1bHRCeXRlcywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gcmVzdWx0UjsNCit9DQordm9pZCBDQkNfRGF0YU1hdHJpeERlY29kZXI6OkNvcnJlY3RFcnJvcnMoQ0ZYX0J5dGVBcnJheSYgY29kZXdvcmRCeXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bURhdGFDb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBudW1Db2Rld29yZHMgPSBjb2Rld29yZEJ5dGVzLkdldFNpemUoKTsNCisgIENGWF9JbnQzMkFycmF5IGNvZGV3b3Jkc0ludHM7DQorICBjb2Rld29yZHNJbnRzLlNldFNpemUobnVtQ29kZXdvcmRzKTsNCisgIGludDMyX3QgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBudW1Db2Rld29yZHM7IGkrKykgew0KKyAgICBjb2Rld29yZHNJbnRzW2ldID0gY29kZXdvcmRCeXRlc1tpXSAmIDB4RkY7DQorICB9DQorICBpbnQzMl90IG51bUVDQ29kZXdvcmRzID0gY29kZXdvcmRCeXRlcy5HZXRTaXplKCkgLSBudW1EYXRhQ29kZXdvcmRzOw0KKyAgbV9yc0RlY29kZXItPkRlY29kZSgmY29kZXdvcmRzSW50cywgbnVtRUNDb2Rld29yZHMsIGUpOw0KKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICBlID0gQkNFeGNlcHRpb25DaGVja3N1bUV4Y2VwdGlvbjsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgZm9yIChpID0gMDsgaSA8IG51bURhdGFDb2Rld29yZHM7IGkrKykgew0KKyAgICBjb2Rld29yZEJ5dGVzW2ldID0gKHVpbnQ4X3QpY29kZXdvcmRzSW50c1tpXTsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4RGVjb2Rlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4RGVjb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMzExYjUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhEZWNvZGVyLmgKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19EQVRBTUFUUklYREVDT0RFUl9IXw0KKyNkZWZpbmUgX0JDX0RBVEFNQVRSSVhERUNPREVSX0hfDQorY2xhc3MgQ0JDX1JlZWRTb2xvbW9uRGVjb2RlcjsNCitjbGFzcyBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdDsNCitjbGFzcyBDQkNfQ29tbW9uQml0TWF0cml4Ow0KK2NsYXNzIENCQ19EYXRhTWF0cml4RGVjb2RlciB7DQorIHB1YmxpYzoNCisgIENCQ19EYXRhTWF0cml4RGVjb2RlcigpOw0KKyAgdmlydHVhbCB+Q0JDX0RhdGFNYXRyaXhEZWNvZGVyKCk7DQorICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogRGVjb2RlKENCQ19Db21tb25CaXRNYXRyaXgqIGJpdHMsIGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCB2b2lkIEluaXQoKTsNCisNCisgcHJpdmF0ZToNCisgIHZvaWQgQ29ycmVjdEVycm9ycyhDRlhfQnl0ZUFycmF5JiBjb2Rld29yZEJ5dGVzLA0KKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRGF0YUNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIENCQ19SZWVkU29sb21vbkRlY29kZXIqIG1fcnNEZWNvZGVyOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4RGV0ZWN0b3IuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4RGV0ZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YzI5YWYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhEZXRlY3Rvci5jcHAKQEAgLTAsMCArMSw0MDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDggWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSA8YWxnb3JpdGhtPg0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1Jlc3VsdFBvaW50LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19XaGl0ZVJlY3RhbmdsZURldGVjdG9yLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRmluZGVyUGF0dGVybkZpbmRlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEZXRlY3RvclJlc3VsdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJHcmlkU2FtcGxlci5oIg0KKyNpbmNsdWRlICJCQ19EYXRhTWF0cml4RGV0ZWN0b3IuaCINCitjb25zdCBpbnQzMl90IENCQ19EYXRhTWF0cml4RGV0ZWN0b3I6OklOVEVHRVJTWzVdID0gezAsIDEsIDIsIDMsIDR9Ow0KK0NCQ19EYXRhTWF0cml4RGV0ZWN0b3I6OkNCQ19EYXRhTWF0cml4RGV0ZWN0b3IoQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UpDQorICAgIDogbV9pbWFnZShpbWFnZSksIG1fcmVjdGFuZ2xlRGV0ZWN0b3IoTlVMTCkge30NCit2b2lkIENCQ19EYXRhTWF0cml4RGV0ZWN0b3I6OkluaXQoaW50MzJfdCYgZSkgew0KKyAgbV9yZWN0YW5nbGVEZXRlY3RvciA9IG5ldyBDQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3RvcihtX2ltYWdlKTsNCisgIG1fcmVjdGFuZ2xlRGV0ZWN0b3ItPkluaXQoZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCit9DQorQ0JDX0RhdGFNYXRyaXhEZXRlY3Rvcjo6fkNCQ19EYXRhTWF0cml4RGV0ZWN0b3IoKSB7DQorICBpZiAobV9yZWN0YW5nbGVEZXRlY3RvciAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBtX3JlY3RhbmdsZURldGVjdG9yOw0KKyAgfQ0KKyAgbV9yZWN0YW5nbGVEZXRlY3RvciA9IE5VTEw7DQorfQ0KK2lubGluZSBGWF9CT09MIFJlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zQ29tcGFyYXRvcih2b2lkKiBhLCB2b2lkKiBiKSB7DQorICByZXR1cm4gKChDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnMqKWIpLT5HZXRUcmFuc2l0aW9ucygpID4NCisgICAgICAgICAoKENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucyopYSktPkdldFRyYW5zaXRpb25zKCk7DQorfQ0KK0NCQ19RUkRldGVjdG9yUmVzdWx0KiBDQkNfRGF0YU1hdHJpeERldGVjdG9yOjpEZXRlY3QoaW50MzJfdCYgZSkgew0KKyAgQ0ZYX1B0ckFycmF5KiBjb3JuZXJQb2ludHMgPSBtX3JlY3RhbmdsZURldGVjdG9yLT5EZXRlY3QoZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBDQkNfUmVzdWx0UG9pbnQqIHBvaW50QSA9IChDQkNfUmVzdWx0UG9pbnQqKSgqY29ybmVyUG9pbnRzKVswXTsNCisgIENCQ19SZXN1bHRQb2ludCogcG9pbnRCID0gKENCQ19SZXN1bHRQb2ludCopKCpjb3JuZXJQb2ludHMpWzFdOw0KKyAgQ0JDX1Jlc3VsdFBvaW50KiBwb2ludEMgPSAoQ0JDX1Jlc3VsdFBvaW50KikoKmNvcm5lclBvaW50cylbMl07DQorICBDQkNfUmVzdWx0UG9pbnQqIHBvaW50RCA9IChDQkNfUmVzdWx0UG9pbnQqKSgqY29ybmVyUG9pbnRzKVszXTsNCisgIGRlbGV0ZSBjb3JuZXJQb2ludHM7DQorICBjb3JuZXJQb2ludHMgPSBOVUxMOw0KKyAgQ0ZYX1B0ckFycmF5IHRyYW5zaXRpb25zOw0KKyAgdHJhbnNpdGlvbnMuQWRkKFRyYW5zaXRpb25zQmV0d2Vlbihwb2ludEEsIHBvaW50QikpOw0KKyAgdHJhbnNpdGlvbnMuQWRkKFRyYW5zaXRpb25zQmV0d2Vlbihwb2ludEEsIHBvaW50QykpOw0KKyAgdHJhbnNpdGlvbnMuQWRkKFRyYW5zaXRpb25zQmV0d2Vlbihwb2ludEIsIHBvaW50RCkpOw0KKyAgdHJhbnNpdGlvbnMuQWRkKFRyYW5zaXRpb25zQmV0d2Vlbihwb2ludEMsIHBvaW50RCkpOw0KKyAgQkNfRlhfUHRyQXJyYXlfU29ydCh0cmFuc2l0aW9ucywgJlJlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zQ29tcGFyYXRvcik7DQorICBkZWxldGUgKChDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnMqKXRyYW5zaXRpb25zWzJdKTsNCisgIGRlbGV0ZSAoKENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucyopdHJhbnNpdGlvbnNbM10pOw0KKyAgQ0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zKiBsU2lkZU9uZSA9DQorICAgICAgKENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucyopdHJhbnNpdGlvbnNbMF07DQorICBDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnMqIGxTaWRlVHdvID0NCisgICAgICAoQ0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zKil0cmFuc2l0aW9uc1sxXTsNCisgIENGWF9NYXBQdHJUZW1wbGF0ZTxDQkNfUmVzdWx0UG9pbnQqLCBpbnQzMl90PiBwb2ludENvdW50Ow0KKyAgSW5jcmVtZW50KHBvaW50Q291bnQsIGxTaWRlT25lLT5HZXRGcm9tKCkpOw0KKyAgSW5jcmVtZW50KHBvaW50Q291bnQsIGxTaWRlT25lLT5HZXRUbygpKTsNCisgIEluY3JlbWVudChwb2ludENvdW50LCBsU2lkZVR3by0+R2V0RnJvbSgpKTsNCisgIEluY3JlbWVudChwb2ludENvdW50LCBsU2lkZVR3by0+R2V0VG8oKSk7DQorICBkZWxldGUgKChDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnMqKXRyYW5zaXRpb25zWzFdKTsNCisgIGRlbGV0ZSAoKENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucyopdHJhbnNpdGlvbnNbMF0pOw0KKyAgdHJhbnNpdGlvbnMuUmVtb3ZlQWxsKCk7DQorICBDQkNfUmVzdWx0UG9pbnQqIG1heWJlVG9wTGVmdCA9IE5VTEw7DQorICBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbUxlZnQgPSBOVUxMOw0KKyAgQ0JDX1Jlc3VsdFBvaW50KiBtYXliZUJvdHRvbVJpZ2h0ID0gTlVMTDsNCisgIEZYX1BPU0lUSU9OIGl0QmVnaW4gPSBwb2ludENvdW50LkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChpdEJlZ2luICE9IE5VTEwpIHsNCisgICAgQ0JDX1Jlc3VsdFBvaW50KiBrZXkgPSAwOw0KKyAgICBpbnQzMl90IHZhbHVlID0gMDsNCisgICAgcG9pbnRDb3VudC5HZXROZXh0QXNzb2MoaXRCZWdpbiwga2V5LCB2YWx1ZSk7DQorICAgIGlmICh2YWx1ZSA9PSAyKSB7DQorICAgICAgYm90dG9tTGVmdCA9IGtleTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAobWF5YmVCb3R0b21SaWdodCA9PSBOVUxMKSB7DQorICAgICAgICBtYXliZUJvdHRvbVJpZ2h0ID0ga2V5Ow0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBtYXliZVRvcExlZnQgPSBrZXk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAobWF5YmVUb3BMZWZ0ID09IE5VTEwgfHwgYm90dG9tTGVmdCA9PSBOVUxMIHx8IG1heWJlQm90dG9tUmlnaHQgPT0gTlVMTCkgew0KKyAgICBkZWxldGUgcG9pbnRBOw0KKyAgICBkZWxldGUgcG9pbnRCOw0KKyAgICBkZWxldGUgcG9pbnRDOw0KKyAgICBkZWxldGUgcG9pbnREOw0KKyAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDRlhfUHRyQXJyYXkgY29ybmVyczsNCisgIGNvcm5lcnMuU2V0U2l6ZSgzKTsNCisgIGNvcm5lcnNbMF0gPSBtYXliZVRvcExlZnQ7DQorICBjb3JuZXJzWzFdID0gYm90dG9tTGVmdDsNCisgIGNvcm5lcnNbMl0gPSBtYXliZUJvdHRvbVJpZ2h0Ow0KKyAgT3JkZXJCZXN0UGF0dGVybnMoJmNvcm5lcnMpOw0KKyAgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21SaWdodCA9IChDQkNfUmVzdWx0UG9pbnQqKWNvcm5lcnNbMF07DQorICBib3R0b21MZWZ0ID0gKENCQ19SZXN1bHRQb2ludCopY29ybmVyc1sxXTsNCisgIENCQ19SZXN1bHRQb2ludCogdG9wTGVmdCA9IChDQkNfUmVzdWx0UG9pbnQqKWNvcm5lcnNbMl07DQorICBDQkNfUmVzdWx0UG9pbnQqIHRvcFJpZ2h0ID0gTlVMTDsNCisgIGludDMyX3QgdmFsdWU7DQorICBpZiAoIXBvaW50Q291bnQuTG9va3VwKHBvaW50QSwgdmFsdWUpKSB7DQorICAgIHRvcFJpZ2h0ID0gcG9pbnRBOw0KKyAgfSBlbHNlIGlmICghcG9pbnRDb3VudC5Mb29rdXAocG9pbnRCLCB2YWx1ZSkpIHsNCisgICAgdG9wUmlnaHQgPSBwb2ludEI7DQorICB9IGVsc2UgaWYgKCFwb2ludENvdW50Lkxvb2t1cChwb2ludEMsIHZhbHVlKSkgew0KKyAgICB0b3BSaWdodCA9IHBvaW50QzsNCisgIH0gZWxzZSB7DQorICAgIHRvcFJpZ2h0ID0gcG9pbnREOw0KKyAgfQ0KKyAgaW50MzJfdCBkaW1lbnNpb25Ub3AgPSBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnM+KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNpdGlvbnNCZXR3ZWVuKHRvcExlZnQsIHRvcFJpZ2h0KSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0VHJhbnNpdGlvbnMoKTsNCisgIGludDMyX3QgZGltZW5zaW9uUmlnaHQgPSBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnM+KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2l0aW9uc0JldHdlZW4oYm90dG9tUmlnaHQsIHRvcFJpZ2h0KSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5HZXRUcmFuc2l0aW9ucygpOw0KKyAgaWYgKChkaW1lbnNpb25Ub3AgJiAweDAxKSA9PSAxKSB7DQorICAgIGRpbWVuc2lvblRvcCsrOw0KKyAgfQ0KKyAgZGltZW5zaW9uVG9wICs9IDI7DQorICBpZiAoKGRpbWVuc2lvblJpZ2h0ICYgMHgwMSkgPT0gMSkgew0KKyAgICBkaW1lbnNpb25SaWdodCsrOw0KKyAgfQ0KKyAgZGltZW5zaW9uUmlnaHQgKz0gMjsNCisgIENCQ19BdXRvUHRyPENCQ19Db21tb25CaXRNYXRyaXg+IGJpdHMoTlVMTCk7DQorICBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnQ+IGNvcnJlY3RlZFRvcFJpZ2h0KE5VTEwpOw0KKyAgaWYgKDQgKiBkaW1lbnNpb25Ub3AgPj0gNyAqIGRpbWVuc2lvblJpZ2h0IHx8DQorICAgICAgNCAqIGRpbWVuc2lvblJpZ2h0ID49IDcgKiBkaW1lbnNpb25Ub3ApIHsNCisgICAgY29ycmVjdGVkVG9wUmlnaHQgPSBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnQ+KA0KKyAgICAgICAgQ29ycmVjdFRvcFJpZ2h0UmVjdGFuZ3VsYXIoYm90dG9tTGVmdCwgYm90dG9tUmlnaHQsIHRvcExlZnQsIHRvcFJpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uVG9wLCBkaW1lbnNpb25SaWdodCkpOw0KKyAgICBpZiAoY29ycmVjdGVkVG9wUmlnaHQuZ2V0KCkgPT0gTlVMTCkgew0KKyAgICAgIGNvcnJlY3RlZFRvcFJpZ2h0ID0gQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50Pih0b3BSaWdodCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgZGVsZXRlIHRvcFJpZ2h0Ow0KKyAgICAgIHRvcFJpZ2h0ID0gTlVMTDsNCisgICAgfQ0KKyAgICBkaW1lbnNpb25Ub3AgPSBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnM+KA0KKyAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNpdGlvbnNCZXR3ZWVuKHRvcExlZnQsIGNvcnJlY3RlZFRvcFJpZ2h0LmdldCgpKSkNCisgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0VHJhbnNpdGlvbnMoKTsNCisgICAgZGltZW5zaW9uUmlnaHQgPQ0KKyAgICAgICAgQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zPigNCisgICAgICAgICAgICBUcmFuc2l0aW9uc0JldHdlZW4oYm90dG9tUmlnaHQsIGNvcnJlY3RlZFRvcFJpZ2h0LmdldCgpKSkNCisgICAgICAgICAgICAtPkdldFRyYW5zaXRpb25zKCk7DQorICAgIGlmICgoZGltZW5zaW9uVG9wICYgMHgwMSkgPT0gMSkgew0KKyAgICAgIGRpbWVuc2lvblRvcCsrOw0KKyAgICB9DQorICAgIGlmICgoZGltZW5zaW9uUmlnaHQgJiAweDAxKSA9PSAxKSB7DQorICAgICAgZGltZW5zaW9uUmlnaHQrKzsNCisgICAgfQ0KKyAgICBiaXRzID0gQ0JDX0F1dG9QdHI8Q0JDX0NvbW1vbkJpdE1hdHJpeD4oDQorICAgICAgICBTYW1wbGVHcmlkKG1faW1hZ2UsIHRvcExlZnQsIGJvdHRvbUxlZnQsIGJvdHRvbVJpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICBjb3JyZWN0ZWRUb3BSaWdodC5nZXQoKSwgZGltZW5zaW9uVG9wLCBkaW1lbnNpb25SaWdodCwgZSkpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICB9IGVsc2Ugew0KKyAgICBpbnQzMl90IGRpbWVuc2lvbiA9IHN0ZDo6bWluKGRpbWVuc2lvblJpZ2h0LCBkaW1lbnNpb25Ub3ApOw0KKyAgICBjb3JyZWN0ZWRUb3BSaWdodCA9IENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludD4oDQorICAgICAgICBDb3JyZWN0VG9wUmlnaHQoYm90dG9tTGVmdCwgYm90dG9tUmlnaHQsIHRvcExlZnQsIHRvcFJpZ2h0LCBkaW1lbnNpb24pKTsNCisgICAgaWYgKGNvcnJlY3RlZFRvcFJpZ2h0LmdldCgpID09IE5VTEwpIHsNCisgICAgICBjb3JyZWN0ZWRUb3BSaWdodCA9IENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludD4odG9wUmlnaHQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGRlbGV0ZSB0b3BSaWdodDsNCisgICAgICB0b3BSaWdodCA9IE5VTEw7DQorICAgIH0NCisgICAgaW50MzJfdCBkaW1lbnNpb25Db3JyZWN0ZWQgPQ0KKyAgICAgICAgc3RkOjptYXgoQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zPigNCisgICAgICAgICAgICAgICAgICAgICBUcmFuc2l0aW9uc0JldHdlZW4odG9wTGVmdCwgY29ycmVjdGVkVG9wUmlnaHQuZ2V0KCkpKQ0KKyAgICAgICAgICAgICAgICAgICAgIC0+R2V0VHJhbnNpdGlvbnMoKSwNCisgICAgICAgICAgICAgICAgIENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucz4oDQorICAgICAgICAgICAgICAgICAgICAgVHJhbnNpdGlvbnNCZXR3ZWVuKGJvdHRvbVJpZ2h0LCBjb3JyZWN0ZWRUb3BSaWdodC5nZXQoKSkpDQorICAgICAgICAgICAgICAgICAgICAgLT5HZXRUcmFuc2l0aW9ucygpKTsNCisgICAgZGltZW5zaW9uQ29ycmVjdGVkKys7DQorICAgIGlmICgoZGltZW5zaW9uQ29ycmVjdGVkICYgMHgwMSkgPT0gMSkgew0KKyAgICAgIGRpbWVuc2lvbkNvcnJlY3RlZCsrOw0KKyAgICB9DQorICAgIGJpdHMgPSBDQkNfQXV0b1B0cjxDQkNfQ29tbW9uQml0TWF0cml4PihTYW1wbGVHcmlkKA0KKyAgICAgICAgbV9pbWFnZSwgdG9wTGVmdCwgYm90dG9tTGVmdCwgYm90dG9tUmlnaHQsIGNvcnJlY3RlZFRvcFJpZ2h0LmdldCgpLA0KKyAgICAgICAgZGltZW5zaW9uQ29ycmVjdGVkLCBkaW1lbnNpb25Db3JyZWN0ZWQsIGUpKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgfQ0KKyAgQ0ZYX1B0ckFycmF5KiByZXN1bHQgPSBuZXcgQ0ZYX1B0ckFycmF5Ow0KKyAgcmVzdWx0LT5TZXRTaXplKDQpOw0KKyAgcmVzdWx0LT5BZGQodG9wTGVmdCk7DQorICByZXN1bHQtPkFkZChib3R0b21MZWZ0KTsNCisgIHJlc3VsdC0+QWRkKGJvdHRvbVJpZ2h0KTsNCisgIHJlc3VsdC0+QWRkKGNvcnJlY3RlZFRvcFJpZ2h0LnJlbGVhc2UoKSk7DQorICByZXR1cm4gbmV3IENCQ19RUkRldGVjdG9yUmVzdWx0KGJpdHMucmVsZWFzZSgpLCByZXN1bHQpOw0KK30NCitDQkNfUmVzdWx0UG9pbnQqIENCQ19EYXRhTWF0cml4RGV0ZWN0b3I6OkNvcnJlY3RUb3BSaWdodFJlY3Rhbmd1bGFyKA0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbUxlZnQsDQorICAgIENCQ19SZXN1bHRQb2ludCogYm90dG9tUmlnaHQsDQorICAgIENCQ19SZXN1bHRQb2ludCogdG9wTGVmdCwNCisgICAgQ0JDX1Jlc3VsdFBvaW50KiB0b3BSaWdodCwNCisgICAgaW50MzJfdCBkaW1lbnNpb25Ub3AsDQorICAgIGludDMyX3QgZGltZW5zaW9uUmlnaHQpIHsNCisgIEZYX0ZMT0FUIGNvcnIgPSBEaXN0YW5jZShib3R0b21MZWZ0LCBib3R0b21SaWdodCkgLyAoRlhfRkxPQVQpZGltZW5zaW9uVG9wOw0KKyAgaW50MzJfdCBub3JtID0gRGlzdGFuY2UodG9wTGVmdCwgdG9wUmlnaHQpOw0KKyAgRlhfRkxPQVQgY29zID0gKHRvcFJpZ2h0LT5HZXRYKCkgLSB0b3BMZWZ0LT5HZXRYKCkpIC8gbm9ybTsNCisgIEZYX0ZMT0FUIHNpbiA9ICh0b3BSaWdodC0+R2V0WSgpIC0gdG9wTGVmdC0+R2V0WSgpKSAvIG5vcm07DQorICBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnQ+IGMxKG5ldyBDQkNfUmVzdWx0UG9pbnQoDQorICAgICAgdG9wUmlnaHQtPkdldFgoKSArIGNvcnIgKiBjb3MsIHRvcFJpZ2h0LT5HZXRZKCkgKyBjb3JyICogc2luKSk7DQorICBjb3JyID0gRGlzdGFuY2UoYm90dG9tTGVmdCwgdG9wTGVmdCkgLyAoRlhfRkxPQVQpZGltZW5zaW9uUmlnaHQ7DQorICBub3JtID0gRGlzdGFuY2UoYm90dG9tUmlnaHQsIHRvcFJpZ2h0KTsNCisgIGNvcyA9ICh0b3BSaWdodC0+R2V0WCgpIC0gYm90dG9tUmlnaHQtPkdldFgoKSkgLyBub3JtOw0KKyAgc2luID0gKHRvcFJpZ2h0LT5HZXRZKCkgLSBib3R0b21SaWdodC0+R2V0WSgpKSAvIG5vcm07DQorICBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnQ+IGMyKG5ldyBDQkNfUmVzdWx0UG9pbnQoDQorICAgICAgdG9wUmlnaHQtPkdldFgoKSArIGNvcnIgKiBjb3MsIHRvcFJpZ2h0LT5HZXRZKCkgKyBjb3JyICogc2luKSk7DQorICBpZiAoIUlzVmFsaWQoYzEuZ2V0KCkpKSB7DQorICAgIGlmIChJc1ZhbGlkKGMyLmdldCgpKSkgew0KKyAgICAgIHJldHVybiBjMi5yZWxlYXNlKCk7DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorICB9IGVsc2UgaWYgKCFJc1ZhbGlkKGMyLmdldCgpKSkgew0KKyAgICByZXR1cm4gYzEucmVsZWFzZSgpOw0KKyAgfQ0KKyAgaW50MzJfdCBsMSA9IEZYU1lTX2FicyhkaW1lbnNpb25Ub3AgLQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnM+KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNpdGlvbnNCZXR3ZWVuKHRvcExlZnQsIGMxLmdldCgpKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0VHJhbnNpdGlvbnMoKSkgKw0KKyAgICAgICAgICAgICAgIEZYU1lTX2FicyhkaW1lbnNpb25SaWdodCAtDQorICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucz4oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2l0aW9uc0JldHdlZW4oYm90dG9tUmlnaHQsIGMxLmdldCgpKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0VHJhbnNpdGlvbnMoKSk7DQorICBpbnQzMl90IGwyID0gRlhTWVNfYWJzKGRpbWVuc2lvblRvcCAtDQorICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucz4oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2l0aW9uc0JldHdlZW4odG9wTGVmdCwgYzIuZ2V0KCkpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5HZXRUcmFuc2l0aW9ucygpKSArDQorICAgICAgICAgICAgICAgRlhTWVNfYWJzKGRpbWVuc2lvblJpZ2h0IC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zPigNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zaXRpb25zQmV0d2Vlbihib3R0b21SaWdodCwgYzIuZ2V0KCkpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5HZXRUcmFuc2l0aW9ucygpKTsNCisgIGlmIChsMSA8PSBsMikgew0KKyAgICByZXR1cm4gYzEucmVsZWFzZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIGMyLnJlbGVhc2UoKTsNCit9DQorQ0JDX1Jlc3VsdFBvaW50KiBDQkNfRGF0YU1hdHJpeERldGVjdG9yOjpDb3JyZWN0VG9wUmlnaHQoDQorICAgIENCQ19SZXN1bHRQb2ludCogYm90dG9tTGVmdCwNCisgICAgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21SaWdodCwNCisgICAgQ0JDX1Jlc3VsdFBvaW50KiB0b3BMZWZ0LA0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIHRvcFJpZ2h0LA0KKyAgICBpbnQzMl90IGRpbWVuc2lvbikgew0KKyAgRlhfRkxPQVQgY29yciA9IERpc3RhbmNlKGJvdHRvbUxlZnQsIGJvdHRvbVJpZ2h0KSAvIChGWF9GTE9BVClkaW1lbnNpb247DQorICBpbnQzMl90IG5vcm0gPSBEaXN0YW5jZSh0b3BMZWZ0LCB0b3BSaWdodCk7DQorICBGWF9GTE9BVCBjb3MgPSAodG9wUmlnaHQtPkdldFgoKSAtIHRvcExlZnQtPkdldFgoKSkgLyBub3JtOw0KKyAgRlhfRkxPQVQgc2luID0gKHRvcFJpZ2h0LT5HZXRZKCkgLSB0b3BMZWZ0LT5HZXRZKCkpIC8gbm9ybTsNCisgIENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludD4gYzEobmV3IENCQ19SZXN1bHRQb2ludCgNCisgICAgICB0b3BSaWdodC0+R2V0WCgpICsgY29yciAqIGNvcywgdG9wUmlnaHQtPkdldFkoKSArIGNvcnIgKiBzaW4pKTsNCisgIGNvcnIgPSBEaXN0YW5jZShib3R0b21MZWZ0LCBib3R0b21SaWdodCkgLyAoRlhfRkxPQVQpZGltZW5zaW9uOw0KKyAgbm9ybSA9IERpc3RhbmNlKGJvdHRvbVJpZ2h0LCB0b3BSaWdodCk7DQorICBjb3MgPSAodG9wUmlnaHQtPkdldFgoKSAtIGJvdHRvbVJpZ2h0LT5HZXRYKCkpIC8gbm9ybTsNCisgIHNpbiA9ICh0b3BSaWdodC0+R2V0WSgpIC0gYm90dG9tUmlnaHQtPkdldFkoKSkgLyBub3JtOw0KKyAgQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50PiBjMihuZXcgQ0JDX1Jlc3VsdFBvaW50KA0KKyAgICAgIHRvcFJpZ2h0LT5HZXRYKCkgKyBjb3JyICogY29zLCB0b3BSaWdodC0+R2V0WSgpICsgY29yciAqIHNpbikpOw0KKyAgaWYgKCFJc1ZhbGlkKGMxLmdldCgpKSkgew0KKyAgICBpZiAoSXNWYWxpZChjMi5nZXQoKSkpIHsNCisgICAgICByZXR1cm4gYzIucmVsZWFzZSgpOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KKyAgfSBlbHNlIGlmICghSXNWYWxpZChjMi5nZXQoKSkpIHsNCisgICAgcmV0dXJuIGMxLnJlbGVhc2UoKTsNCisgIH0NCisgIGludDMyX3QgbDEgPSBGWFNZU19hYnMoQ0JDX0F1dG9QdHI8Q0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zPigNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zaXRpb25zQmV0d2Vlbih0b3BMZWZ0LCBjMS5nZXQoKSkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldFRyYW5zaXRpb25zKCkgLQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnM+KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNpdGlvbnNCZXR3ZWVuKGJvdHRvbVJpZ2h0LCBjMS5nZXQoKSkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldFRyYW5zaXRpb25zKCkpOw0KKyAgaW50MzJfdCBsMiA9IEZYU1lTX2FicyhDQkNfQXV0b1B0cjxDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnM+KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNpdGlvbnNCZXR3ZWVuKHRvcExlZnQsIGMyLmdldCgpKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0VHJhbnNpdGlvbnMoKSAtDQorICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19BdXRvUHRyPENCQ19SZXN1bHRQb2ludHNBbmRUcmFuc2l0aW9ucz4oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2l0aW9uc0JldHdlZW4oYm90dG9tUmlnaHQsIGMyLmdldCgpKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0VHJhbnNpdGlvbnMoKSk7DQorICByZXR1cm4gbDEgPD0gbDIgPyBjMS5yZWxlYXNlKCkgOiBjMi5yZWxlYXNlKCk7DQorfQ0KK0ZYX0JPT0wgQ0JDX0RhdGFNYXRyaXhEZXRlY3Rvcjo6SXNWYWxpZChDQkNfUmVzdWx0UG9pbnQqIHApIHsNCisgIHJldHVybiBwLT5HZXRYKCkgPj0gMCAmJiBwLT5HZXRYKCkgPCBtX2ltYWdlLT5HZXRXaWR0aCgpICYmIHAtPkdldFkoKSA+IDAgJiYNCisgICAgICAgICBwLT5HZXRZKCkgPCBtX2ltYWdlLT5HZXRIZWlnaHQoKTsNCit9DQoraW50MzJfdCBDQkNfRGF0YU1hdHJpeERldGVjdG9yOjpSb3VuZChGWF9GTE9BVCBkKSB7DQorICByZXR1cm4gKGludDMyX3QpKGQgKyAwLjVmKTsNCit9DQoraW50MzJfdCBDQkNfRGF0YU1hdHJpeERldGVjdG9yOjpEaXN0YW5jZShDQkNfUmVzdWx0UG9pbnQqIGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIGIpIHsNCisgIHJldHVybiBSb3VuZCgNCisgICAgICAoRlhfRkxPQVQpc3FydCgoYS0+R2V0WCgpIC0gYi0+R2V0WCgpKSAqIChhLT5HZXRYKCkgLSBiLT5HZXRYKCkpICsNCisgICAgICAgICAgICAgICAgICAgICAoYS0+R2V0WSgpIC0gYi0+R2V0WSgpKSAqIChhLT5HZXRZKCkgLSBiLT5HZXRZKCkpKSk7DQorfQ0KK3ZvaWQgQ0JDX0RhdGFNYXRyaXhEZXRlY3Rvcjo6SW5jcmVtZW50KA0KKyAgICBDRlhfTWFwUHRyVGVtcGxhdGU8Q0JDX1Jlc3VsdFBvaW50KiwgaW50MzJfdD4mIHRhYmxlLA0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIGtleSkgew0KKyAgaW50MzJfdCB2YWx1ZTsNCisgIGlmICh0YWJsZS5Mb29rdXAoa2V5LCB2YWx1ZSkpIHsNCisgICAgdGFibGUuU2V0QXQoa2V5LCBJTlRFR0VSU1t2YWx1ZSArIDFdKTsNCisgIH0gZWxzZSB7DQorICAgIHRhYmxlLlNldEF0KGtleSwgSU5URUdFUlNbMV0pOw0KKyAgfQ0KK30NCitDQkNfQ29tbW9uQml0TWF0cml4KiBDQkNfRGF0YU1hdHJpeERldGVjdG9yOjpTYW1wbGVHcmlkKA0KKyAgICBDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSwNCisgICAgQ0JDX1Jlc3VsdFBvaW50KiB0b3BMZWZ0LA0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbUxlZnQsDQorICAgIENCQ19SZXN1bHRQb2ludCogYm90dG9tUmlnaHQsDQorICAgIENCQ19SZXN1bHRQb2ludCogdG9wUmlnaHQsDQorICAgIGludDMyX3QgZGltZW5zaW9uWCwNCisgICAgaW50MzJfdCBkaW1lbnNpb25ZLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBDQkNfUVJHcmlkU2FtcGxlciYgc2FtcGxlciA9IENCQ19RUkdyaWRTYW1wbGVyOjpHZXRJbnN0YW5jZSgpOw0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogY2JtID0gc2FtcGxlci5TYW1wbGVHcmlkKA0KKyAgICAgIGltYWdlLCBkaW1lbnNpb25YLCBkaW1lbnNpb25ZLCAwLjVmLCAwLjVmLCBkaW1lbnNpb25YIC0gMC41ZiwgMC41ZiwNCisgICAgICBkaW1lbnNpb25YIC0gMC41ZiwgZGltZW5zaW9uWSAtIDAuNWYsIDAuNWYsIGRpbWVuc2lvblkgLSAwLjVmLA0KKyAgICAgIHRvcExlZnQtPkdldFgoKSwgdG9wTGVmdC0+R2V0WSgpLCB0b3BSaWdodC0+R2V0WCgpLCB0b3BSaWdodC0+R2V0WSgpLA0KKyAgICAgIGJvdHRvbVJpZ2h0LT5HZXRYKCksIGJvdHRvbVJpZ2h0LT5HZXRZKCksIGJvdHRvbUxlZnQtPkdldFgoKSwNCisgICAgICBib3R0b21MZWZ0LT5HZXRZKCksIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIGNibTsNCit9DQorQ0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zKiBDQkNfRGF0YU1hdHJpeERldGVjdG9yOjpUcmFuc2l0aW9uc0JldHdlZW4oDQorICAgIENCQ19SZXN1bHRQb2ludCogZnJvbSwNCisgICAgQ0JDX1Jlc3VsdFBvaW50KiB0bykgew0KKyAgaW50MzJfdCBmcm9tWCA9IChpbnQzMl90KWZyb20tPkdldFgoKTsNCisgIGludDMyX3QgZnJvbVkgPSAoaW50MzJfdClmcm9tLT5HZXRZKCk7DQorICBpbnQzMl90IHRvWCA9IChpbnQzMl90KXRvLT5HZXRYKCk7DQorICBpbnQzMl90IHRvWSA9IChpbnQzMl90KXRvLT5HZXRZKCk7DQorICBGWF9CT09MIHN0ZWVwID0gRlhTWVNfYWJzKHRvWSAtIGZyb21ZKSA+IEZYU1lTX2Ficyh0b1ggLSBmcm9tWCk7DQorICBpZiAoc3RlZXApIHsNCisgICAgaW50MzJfdCB0ZW1wID0gZnJvbVg7DQorICAgIGZyb21YID0gZnJvbVk7DQorICAgIGZyb21ZID0gdGVtcDsNCisgICAgdGVtcCA9IHRvWDsNCisgICAgdG9YID0gdG9ZOw0KKyAgICB0b1kgPSB0ZW1wOw0KKyAgfQ0KKyAgaW50MzJfdCBkeCA9IEZYU1lTX2Ficyh0b1ggLSBmcm9tWCk7DQorICBpbnQzMl90IGR5ID0gRlhTWVNfYWJzKHRvWSAtIGZyb21ZKTsNCisgIGludDMyX3QgZXJyb3IgPSAtZHggPj4gMTsNCisgIGludDMyX3QgeXN0ZXAgPSBmcm9tWSA8IHRvWSA/IDEgOiAtMTsNCisgIGludDMyX3QgeHN0ZXAgPSBmcm9tWCA8IHRvWCA/IDEgOiAtMTsNCisgIGludDMyX3QgdHJhbnNpdGlvbnMgPSAwOw0KKyAgRlhfQk9PTCBpbkJsYWNrID0gbV9pbWFnZS0+R2V0KHN0ZWVwID8gZnJvbVkgOiBmcm9tWCwgc3RlZXAgPyBmcm9tWCA6IGZyb21ZKTsNCisgIGZvciAoaW50MzJfdCB4ID0gZnJvbVgsIHkgPSBmcm9tWTsgeCAhPSB0b1g7IHggKz0geHN0ZXApIHsNCisgICAgRlhfQk9PTCBpc0JsYWNrID0gbV9pbWFnZS0+R2V0KHN0ZWVwID8geSA6IHgsIHN0ZWVwID8geCA6IHkpOw0KKyAgICBpZiAoaXNCbGFjayAhPSBpbkJsYWNrKSB7DQorICAgICAgdHJhbnNpdGlvbnMrKzsNCisgICAgICBpbkJsYWNrID0gaXNCbGFjazsNCisgICAgfQ0KKyAgICBlcnJvciArPSBkeTsNCisgICAgaWYgKGVycm9yID4gMCkgew0KKyAgICAgIGlmICh5ID09IHRvWSkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIHkgKz0geXN0ZXA7DQorICAgICAgZXJyb3IgLT0gZHg7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBuZXcgQ0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zKGZyb20sIHRvLCB0cmFuc2l0aW9ucyk7DQorfQ0KK3ZvaWQgQ0JDX0RhdGFNYXRyaXhEZXRlY3Rvcjo6T3JkZXJCZXN0UGF0dGVybnMoQ0ZYX1B0ckFycmF5KiBwYXR0ZXJucykgew0KKyAgRlhfRkxPQVQgYWJEaXN0YW5jZSA9IChGWF9GTE9BVClEaXN0YW5jZSgoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVswXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMV0pOw0KKyAgRlhfRkxPQVQgYmNEaXN0YW5jZSA9IChGWF9GTE9BVClEaXN0YW5jZSgoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVsxXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMl0pOw0KKyAgRlhfRkxPQVQgYWNEaXN0YW5jZSA9IChGWF9GTE9BVClEaXN0YW5jZSgoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVswXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMl0pOw0KKyAgQ0JDX1Jlc3VsdFBvaW50ICp0b3BMZWZ0LCAqdG9wUmlnaHQsICpib3R0b21MZWZ0Ow0KKyAgaWYgKGJjRGlzdGFuY2UgPj0gYWJEaXN0YW5jZSAmJiBiY0Rpc3RhbmNlID49IGFjRGlzdGFuY2UpIHsNCisgICAgdG9wTGVmdCA9IChDQkNfUmVzdWx0UG9pbnQqKSgqcGF0dGVybnMpWzBdOw0KKyAgICB0b3BSaWdodCA9IChDQkNfUmVzdWx0UG9pbnQqKSgqcGF0dGVybnMpWzFdOw0KKyAgICBib3R0b21MZWZ0ID0gKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMl07DQorICB9IGVsc2UgaWYgKGFjRGlzdGFuY2UgPj0gYmNEaXN0YW5jZSAmJiBhY0Rpc3RhbmNlID49IGFiRGlzdGFuY2UpIHsNCisgICAgdG9wTGVmdCA9IChDQkNfUmVzdWx0UG9pbnQqKSgqcGF0dGVybnMpWzFdOw0KKyAgICB0b3BSaWdodCA9IChDQkNfUmVzdWx0UG9pbnQqKSgqcGF0dGVybnMpWzBdOw0KKyAgICBib3R0b21MZWZ0ID0gKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMl07DQorICB9IGVsc2Ugew0KKyAgICB0b3BMZWZ0ID0gKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMl07DQorICAgIHRvcFJpZ2h0ID0gKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMF07DQorICAgIGJvdHRvbUxlZnQgPSAoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVsxXTsNCisgIH0NCisgIGlmICgoYm90dG9tTGVmdC0+R2V0WSgpIC0gdG9wTGVmdC0+R2V0WSgpKSAqDQorICAgICAgICAgICh0b3BSaWdodC0+R2V0WCgpIC0gdG9wTGVmdC0+R2V0WCgpKSA8DQorICAgICAgKGJvdHRvbUxlZnQtPkdldFgoKSAtIHRvcExlZnQtPkdldFgoKSkgKg0KKyAgICAgICAgICAodG9wUmlnaHQtPkdldFkoKSAtIHRvcExlZnQtPkdldFkoKSkpIHsNCisgICAgQ0JDX1Jlc3VsdFBvaW50KiB0ZW1wID0gdG9wUmlnaHQ7DQorICAgIHRvcFJpZ2h0ID0gYm90dG9tTGVmdDsNCisgICAgYm90dG9tTGVmdCA9IHRlbXA7DQorICB9DQorICAoKnBhdHRlcm5zKVswXSA9IGJvdHRvbUxlZnQ7DQorICAoKnBhdHRlcm5zKVsxXSA9IHRvcExlZnQ7DQorICAoKnBhdHRlcm5zKVsyXSA9IHRvcFJpZ2h0Ow0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhEZXRlY3Rvci5oIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4RGV0ZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2YzMmRhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4RGV0ZWN0b3IuaApAQCAtMCwwICsxLDczIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0RBVEFNQVRSSVhERVRFQ1RPUl9IXw0KKyNkZWZpbmUgX0JDX0RBVEFNQVRSSVhERVRFQ1RPUl9IXw0KK2NsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQorY2xhc3MgQ0JDX1doaXRlUmVjdGFuZ2xlRGV0ZWN0b3I7DQorY2xhc3MgQ0JDX1Jlc3VsdFBvaW50Ow0KK2NsYXNzIENCQ19RUkRldGVjdG9yUmVzdWx0Ow0KK2NsYXNzIENCQ19EYXRhTWF0cml4RGV0ZWN0b3I7DQorY2xhc3MgUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnM7DQorY2xhc3MgQ0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zIHsNCisgcHVibGljOg0KKyAgQ0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zKENCQ19SZXN1bHRQb2ludCogZnJvbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIHRvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHJhbnNpdGlvbnMpIHsNCisgICAgbV9mcm9tID0gZnJvbTsNCisgICAgbV90byA9IHRvOw0KKyAgICBtX3RyYW5zaXRpb25zID0gdHJhbnNpdGlvbnM7DQorICB9DQorICB+Q0JDX1Jlc3VsdFBvaW50c0FuZFRyYW5zaXRpb25zKCkge30NCisgIENCQ19SZXN1bHRQb2ludCogR2V0RnJvbSgpIHsgcmV0dXJuIG1fZnJvbTsgfQ0KKyAgQ0JDX1Jlc3VsdFBvaW50KiBHZXRUbygpIHsgcmV0dXJuIG1fdG87IH0NCisgIGludDMyX3QgR2V0VHJhbnNpdGlvbnMoKSB7IHJldHVybiBtX3RyYW5zaXRpb25zOyB9DQorDQorIHByaXZhdGU6DQorICBDQkNfUmVzdWx0UG9pbnQqIG1fZnJvbTsNCisgIENCQ19SZXN1bHRQb2ludCogbV90bzsNCisgIGludDMyX3QgbV90cmFuc2l0aW9uczsNCit9Ow0KK2NsYXNzIENCQ19EYXRhTWF0cml4RGV0ZWN0b3Igew0KKyBwdWJsaWM6DQorICBDQkNfRGF0YU1hdHJpeERldGVjdG9yKENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlKTsNCisgIHZpcnR1YWwgfkNCQ19EYXRhTWF0cml4RGV0ZWN0b3IoKTsNCisgIENCQ19RUkRldGVjdG9yUmVzdWx0KiBEZXRlY3QoaW50MzJfdCYgZSk7DQorICBDQkNfUmVzdWx0UG9pbnQqIENvcnJlY3RUb3BSaWdodFJlY3Rhbmd1bGFyKENCQ19SZXN1bHRQb2ludCogYm90dG9tTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21SaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiB0b3BMZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIHRvcFJpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRpbWVuc2lvblRvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkaW1lbnNpb25SaWdodCk7DQorICBDQkNfUmVzdWx0UG9pbnQqIENvcnJlY3RUb3BSaWdodChDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbUxlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbVJpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiB0b3BMZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiB0b3BSaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGltZW5zaW9uKTsNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIFNhbXBsZUdyaWQoQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogdG9wTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21MZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbVJpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIHRvcFJpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRpbWVuc2lvblgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGltZW5zaW9uWSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBDQkNfUmVzdWx0UG9pbnRzQW5kVHJhbnNpdGlvbnMqIFRyYW5zaXRpb25zQmV0d2VlbihDQkNfUmVzdWx0UG9pbnQqIGZyb20sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIHRvKTsNCisgIEZYX0JPT0wgSXNWYWxpZChDQkNfUmVzdWx0UG9pbnQqIHApOw0KKyAgaW50MzJfdCBEaXN0YW5jZShDQkNfUmVzdWx0UG9pbnQqIGEsIENCQ19SZXN1bHRQb2ludCogYik7DQorICB2b2lkIEluY3JlbWVudChDRlhfTWFwUHRyVGVtcGxhdGU8Q0JDX1Jlc3VsdFBvaW50KiwgaW50MzJfdD4mIHRhYmxlLA0KKyAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiBrZXkpOw0KKyAgaW50MzJfdCBSb3VuZChGWF9GTE9BVCBkKTsNCisgIHZvaWQgT3JkZXJCZXN0UGF0dGVybnMoQ0ZYX1B0ckFycmF5KiBwYXR0ZXJucyk7DQorICB2aXJ0dWFsIHZvaWQgSW5pdChpbnQzMl90JiBlKTsNCisNCisgcHJpdmF0ZToNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIG1faW1hZ2U7DQorICBDQkNfV2hpdGVSZWN0YW5nbGVEZXRlY3RvciogbV9yZWN0YW5nbGVEZXRlY3RvcjsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IElOVEVHRVJTWzVdOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4UmVhZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFJlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwYzM2NwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFJlYWRlci5jcHAKQEAgLTAsMCArMSw2NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX0JpbmFyeUJpdG1hcC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19SZWFkZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGV0ZWN0b3JSZXN1bHQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkRlY29kZXJSZXN1bHQuaCINCisjaW5jbHVkZSAiQkNfRGF0YU1hdHJpeERlY29kZXIuaCINCisjaW5jbHVkZSAiQkNfRGF0YU1hdHJpeERldGVjdG9yLmgiDQorI2luY2x1ZGUgIkJDX0RhdGFNYXRyaXhSZWFkZXIuaCINCitDQkNfRGF0YU1hdHJpeFJlYWRlcjo6Q0JDX0RhdGFNYXRyaXhSZWFkZXIoKSB7DQorICBtX2RlY29kZXIgPSBOVUxMOw0KK30NCit2b2lkIENCQ19EYXRhTWF0cml4UmVhZGVyOjpJbml0KCkgew0KKyAgbV9kZWNvZGVyID0gbmV3IENCQ19EYXRhTWF0cml4RGVjb2RlcjsNCisgIG1fZGVjb2Rlci0+SW5pdCgpOw0KK30NCitDQkNfRGF0YU1hdHJpeFJlYWRlcjo6fkNCQ19EYXRhTWF0cml4UmVhZGVyKCkgew0KKyAgaWYgKG1fZGVjb2RlciAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBtX2RlY29kZXI7DQorICB9DQorICBtX2RlY29kZXIgPSBOVUxMOw0KK30NCitDRlhfQnl0ZVN0cmluZyBDQkNfRGF0YU1hdHJpeFJlYWRlcjo6RGVjb2RlKENCQ19CaW5hcnlCaXRtYXAqIGltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIGNkciA9IGltYWdlLT5HZXRCbGFja01hdHJpeChlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICBDQkNfRGF0YU1hdHJpeERldGVjdG9yIGRldGVjdG9yKGNkcik7DQorICBkZXRlY3Rvci5Jbml0KGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgIENCQ19RUkRldGVjdG9yUmVzdWx0KiBkZHIgPSBkZXRlY3Rvci5EZXRlY3QoZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgQ0JDX0F1dG9QdHI8Q0JDX1FSRGV0ZWN0b3JSZXN1bHQ+IGRldGVjdG9yUmVzdWx0KGRkcik7DQorICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogUmVzdWx0VGVtcCA9DQorICAgICAgbV9kZWNvZGVyLT5EZWNvZGUoZGV0ZWN0b3JSZXN1bHQtPkdldEJpdHMoKSwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgQ0JDX0F1dG9QdHI8Q0JDX0NvbW1vbkRlY29kZXJSZXN1bHQ+IGRlY29kZVJlc3VsdChSZXN1bHRUZW1wKTsNCisgIHJldHVybiBkZWNvZGVSZXN1bHQtPkdldFRleHQoKTsNCit9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX0RhdGFNYXRyaXhSZWFkZXI6OkRlY29kZShDQkNfQmluYXJ5Qml0bWFwKiBpbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9CeXRlU3RyaW5nIGJzID0gRGVjb2RlKGltYWdlLCAwLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICByZXR1cm4gYnM7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFJlYWRlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4UmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk1ODIyMwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFJlYWRlci5oCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfREFUQU1BVFJJWFJFQURFUl9IXw0KKyNkZWZpbmUgX0JDX0RBVEFNQVRSSVhSRUFERVJfSF8NCitjbGFzcyBDQkNfQmluYXJ5Qml0bWFwOw0KK2NsYXNzIENCQ19EYXRhTWF0cml4RGVjb2RlcjsNCitjbGFzcyBDQkNfUmVhZGVyOw0KK2NsYXNzIENCQ19EYXRhTWF0cml4UmVhZGVyOw0KK2NsYXNzIENCQ19EYXRhTWF0cml4UmVhZGVyIDogcHVibGljIENCQ19SZWFkZXIgew0KKyBwdWJsaWM6DQorICBDQkNfRGF0YU1hdHJpeFJlYWRlcigpOw0KKyAgdmlydHVhbCB+Q0JDX0RhdGFNYXRyaXhSZWFkZXIoKTsNCisgIENGWF9CeXRlU3RyaW5nIERlY29kZShDQkNfQmluYXJ5Qml0bWFwKiBpbWFnZSwgaW50MzJfdCYgZSk7DQorICBDRlhfQnl0ZVN0cmluZyBEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCogaW1hZ2UsIGludCBoaW50cywgaW50MzJfdCYgZSk7DQorDQorICB2aXJ0dWFsIHZvaWQgSW5pdCgpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0JDX0RhdGFNYXRyaXhEZWNvZGVyKiBtX2RlY29kZXI7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0LmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzY2I1NDEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0LmNwcApAQCAtMCwwICsxLDQwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDA2IEplcmVtaWFzIE1hZXJraQ0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJCQ19FbmNvZGVyLmgiDQorI2luY2x1ZGUgIkJDX1N5bWJvbFNoYXBlSGludC5oIg0KKyNpbmNsdWRlICJCQ19TeW1ib2xJbmZvLmgiDQorI2luY2x1ZGUgIkJDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0LmgiDQorQ0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0OjpDQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQoKQ0KKyAgICA6IENCQ19TeW1ib2xJbmZvKEZBTFNFLCAxNTU4LCA2MjAsIDIyLCAyMiwgMzYpIHsNCisgIG1fcnNCbG9ja0RhdGEgPSAtMTsNCisgIG1fcnNCbG9ja0Vycm9yID0gNjI7DQorfQ0KK0NCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NDo6fkNCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NCgpIHt9DQoraW50MzJfdCBDQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQ6OmdldEludGVybGVhdmVkQmxvY2tDb3VudCgpIHsNCisgIHJldHVybiAxMDsNCit9DQoraW50MzJfdCBDQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDRnZXREYXRhTGVuZ3RoRm9ySW50ZXJsZWF2ZWRCbG9jaygNCisgICAgaW50MzJfdCBpbmRleCkgew0KKyAgcmV0dXJuIChpbmRleCA8PSA4KSA/IDE1NiA6IDE1NTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NC5oIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMzI1YTQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19EQVRBTUFUUklYU1lNQk9MSU5GTzE0NF9IXw0KKyNkZWZpbmUgX0JDX0RBVEFNQVRSSVhTWU1CT0xJTkZPMTQ0X0hfDQorY2xhc3MgQ0JDX1N5bWJvbEluZm87DQorY2xhc3MgQ0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0Ow0KK2NsYXNzIENCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NCA6IHB1YmxpYyBDQkNfU3ltYm9sSW5mbyB7DQorIHB1YmxpYzoNCisgIENCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NCgpOw0KKyAgdmlydHVhbCB+Q0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0KCk7DQorICBpbnQzMl90IGdldEludGVybGVhdmVkQmxvY2tDb3VudCgpOw0KKyAgaW50MzJfdCBnZXREYXRhTGVuZ3RoRm9ySW50ZXJsZWF2ZWRCbG9jayhpbnQzMl90IGluZGV4KTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFZlcnNpb24uY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4VmVyc2lvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRhZjljNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFZlcnNpb24uY3BwCkBAIC0wLDAgKzEsMTcyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDA3IFpYaW5nIGF1dGhvcnMNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAiQkNfRGF0YU1hdHJpeFZlcnNpb24uaCINCitDRlhfUHRyQXJyYXkqIENCQ19EYXRhTWF0cml4VmVyc2lvbjo6VkVSU0lPTlMgPSBOVUxMOw0KK3ZvaWQgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOjpJbml0aWFsaXplKCkgew0KKyAgVkVSU0lPTlMgPSBuZXcgQ0ZYX1B0ckFycmF5KCk7DQorfQ0KK3ZvaWQgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOjpGaW5hbGl6ZSgpIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IFZFUlNJT05TLT5HZXRTaXplKCk7IGkrKykgew0KKyAgICBkZWxldGUgKChDQkNfRGF0YU1hdHJpeFZlcnNpb24qKShWRVJTSU9OUy0+R2V0QXQoaSkpKTsNCisgIH0NCisgIFZFUlNJT05TLT5SZW1vdmVBbGwoKTsNCisgIGRlbGV0ZSBWRVJTSU9OUzsNCit9DQorQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOjpDQkNfRGF0YU1hdHJpeFZlcnNpb24oaW50MzJfdCB2ZXJzaW9uTnVtYmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3ltYm9sU2l6ZVJvd3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzeW1ib2xTaXplQ29sdW1ucywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRhdGFSZWdpb25TaXplUm93cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRhdGFSZWdpb25TaXplQ29sdW1ucywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQ0Jsb2NrcyogZWNCbG9ja3MpIHsNCisgIG1fdmVyc2lvbk51bWJlciA9IHZlcnNpb25OdW1iZXI7DQorICBtX3N5bWJvbFNpemVSb3dzID0gc3ltYm9sU2l6ZVJvd3M7DQorICBtX3N5bWJvbFNpemVDb2x1bW5zID0gc3ltYm9sU2l6ZUNvbHVtbnM7DQorICBtX2RhdGFSZWdpb25TaXplUm93cyA9IGRhdGFSZWdpb25TaXplUm93czsNCisgIG1fZGF0YVJlZ2lvblNpemVDb2x1bW5zID0gZGF0YVJlZ2lvblNpemVDb2x1bW5zOw0KKyAgbV9lY0Jsb2NrcyA9IGVjQmxvY2tzOw0KKyAgaW50MzJfdCB0b3RhbCA9IDA7DQorICBpbnQzMl90IGVjQ29kZXdvcmRzID0gZWNCbG9ja3MtPkdldEVDQ29kZXdvcmRzKCk7DQorICBjb25zdCBDRlhfUHRyQXJyYXkmIGVjYkFycmF5ID0gZWNCbG9ja3MtPkdldEVDQmxvY2tzKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBlY2JBcnJheS5HZXRTaXplKCk7IGkrKykgew0KKyAgICB0b3RhbCArPSAoKEVDQiopZWNiQXJyYXlbaV0pLT5HZXRDb3VudCgpICoNCisgICAgICAgICAgICAgKCgoRUNCKillY2JBcnJheVtpXSktPkdldERhdGFDb2Rld29yZHMoKSArIGVjQ29kZXdvcmRzKTsNCisgIH0NCisgIG1fdG90YWxDb2Rld29yZHMgPSB0b3RhbDsNCit9DQorQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOjp+Q0JDX0RhdGFNYXRyaXhWZXJzaW9uKCkgew0KKyAgaWYgKG1fZWNCbG9ja3MgIT0gTlVMTCkgew0KKyAgICBkZWxldGUgbV9lY0Jsb2NrczsNCisgIH0NCisgIG1fZWNCbG9ja3MgPSBOVUxMOw0KK30NCitpbnQzMl90IENCQ19EYXRhTWF0cml4VmVyc2lvbjo6R2V0VmVyc2lvbk51bWJlcigpIHsNCisgIHJldHVybiBtX3ZlcnNpb25OdW1iZXI7DQorfQ0KK2ludDMyX3QgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOjpHZXRTeW1ib2xTaXplUm93cygpIHsNCisgIHJldHVybiBtX3N5bWJvbFNpemVSb3dzOw0KK30NCitpbnQzMl90IENCQ19EYXRhTWF0cml4VmVyc2lvbjo6R2V0U3ltYm9sU2l6ZUNvbHVtbnMoKSB7DQorICByZXR1cm4gbV9zeW1ib2xTaXplQ29sdW1uczsNCit9DQoraW50MzJfdCBDQkNfRGF0YU1hdHJpeFZlcnNpb246OkdldERhdGFSZWdpb25TaXplUm93cygpIHsNCisgIHJldHVybiBtX2RhdGFSZWdpb25TaXplUm93czsNCit9DQoraW50MzJfdCBDQkNfRGF0YU1hdHJpeFZlcnNpb246OkdldERhdGFSZWdpb25TaXplQ29sdW1ucygpIHsNCisgIHJldHVybiBtX2RhdGFSZWdpb25TaXplQ29sdW1uczsNCit9DQoraW50MzJfdCBDQkNfRGF0YU1hdHJpeFZlcnNpb246OkdldFRvdGFsQ29kZXdvcmRzKCkgew0KKyAgcmV0dXJuIG1fdG90YWxDb2Rld29yZHM7DQorfQ0KK0VDQmxvY2tzKiBDQkNfRGF0YU1hdHJpeFZlcnNpb246OkdldEVDQmxvY2tzKCkgew0KKyAgcmV0dXJuIG1fZWNCbG9ja3M7DQorfQ0KK3ZvaWQgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOjpSZWxlYXNlQWxsKCkgew0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgVkVSU0lPTlMtPkdldFNpemUoKTsgaSsrKSB7DQorICAgIGRlbGV0ZSAoQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKilWRVJTSU9OUy0+R2V0QXQoaSk7DQorICB9DQorICBWRVJTSU9OUy0+UmVtb3ZlQWxsKCk7DQorfQ0KK0NCQ19EYXRhTWF0cml4VmVyc2lvbiogQ0JDX0RhdGFNYXRyaXhWZXJzaW9uOjpHZXRWZXJzaW9uRm9yRGltZW5zaW9ucygNCisgICAgaW50MzJfdCBudW1Sb3dzLA0KKyAgICBpbnQzMl90IG51bUNvbHVtbnMsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGlmICgobnVtUm93cyAmIDB4MDEpICE9IDAgfHwgKG51bUNvbHVtbnMgJiAweDAxKSAhPSAwKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGlmIChWRVJTSU9OUy0+R2V0U2l6ZSgpID09IDApIHsNCisgICAgVkVSU0lPTlMtPkFkZChuZXcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKDEsIDEwLCAxMCwgOCwgOCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFQ0Jsb2Nrcyg1LCBuZXcgRUNCKDEsIDMpKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKG5ldyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMiwgMTIsIDEyLCAxMCwgMTAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRUNCbG9ja3MoNywgbmV3IEVDQigxLCA1KSkpKTsNCisgICAgVkVSU0lPTlMtPkFkZChuZXcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKDMsIDE0LCAxNCwgMTIsIDEyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVDQmxvY2tzKDEwLCBuZXcgRUNCKDEsIDgpKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKG5ldyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oNCwgMTYsIDE2LCAxNCwgMTQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRUNCbG9ja3MoMTIsIG5ldyBFQ0IoMSwgMTIpKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKG5ldyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oNSwgMTgsIDE4LCAxNiwgMTYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRUNCbG9ja3MoMTQsIG5ldyBFQ0IoMSwgMTgpKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKG5ldyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oNiwgMjAsIDIwLCAxOCwgMTgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRUNCbG9ja3MoMTgsIG5ldyBFQ0IoMSwgMjIpKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKG5ldyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oNywgMjIsIDIyLCAyMCwgMjAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRUNCbG9ja3MoMjAsIG5ldyBFQ0IoMSwgMzApKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKG5ldyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oOCwgMjQsIDI0LCAyMiwgMjIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRUNCbG9ja3MoMjQsIG5ldyBFQ0IoMSwgMzYpKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKG5ldyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oOSwgMjYsIDI2LCAyNCwgMjQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRUNCbG9ja3MoMjgsIG5ldyBFQ0IoMSwgNDQpKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKG5ldyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMTAsIDMyLCAzMiwgMTQsIDE0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVDQmxvY2tzKDM2LCBuZXcgRUNCKDEsIDYyKSkpKTsNCisgICAgVkVSU0lPTlMtPkFkZChuZXcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKDExLCAzNiwgMzYsIDE2LCAxNiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFQ0Jsb2Nrcyg0MiwgbmV3IEVDQigxLCA4NikpKSk7DQorICAgIFZFUlNJT05TLT5BZGQobmV3IENCQ19EYXRhTWF0cml4VmVyc2lvbigxMiwgNDAsIDQwLCAxOCwgMTgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRUNCbG9ja3MoNDgsIG5ldyBFQ0IoMSwgMTE0KSkpKTsNCisgICAgVkVSU0lPTlMtPkFkZChuZXcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKDEzLCA0NCwgNDQsIDIwLCAyMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFQ0Jsb2Nrcyg1NiwgbmV3IEVDQigxLCAxNDQpKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKG5ldyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMTQsIDQ4LCA0OCwgMjIsIDIyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVDQmxvY2tzKDY4LCBuZXcgRUNCKDEsIDE3NCkpKSk7DQorICAgIFZFUlNJT05TLT5BZGQobmV3IENCQ19EYXRhTWF0cml4VmVyc2lvbigxNSwgNTIsIDUyLCAyNCwgMjQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRUNCbG9ja3MoNDIsIG5ldyBFQ0IoMiwgMTAyKSkpKTsNCisgICAgVkVSU0lPTlMtPkFkZChuZXcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKDE2LCA2NCwgNjQsIDE0LCAxNCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFQ0Jsb2Nrcyg1NiwgbmV3IEVDQigyLCAxNDApKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKG5ldyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMTcsIDcyLCA3MiwgMTYsIDE2LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVDQmxvY2tzKDM2LCBuZXcgRUNCKDQsIDkyKSkpKTsNCisgICAgVkVSU0lPTlMtPkFkZChuZXcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKDE4LCA4MCwgODAsIDE4LCAxOCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFQ0Jsb2Nrcyg0OCwgbmV3IEVDQig0LCAxMTQpKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKG5ldyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMTksIDg4LCA4OCwgMjAsIDIwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVDQmxvY2tzKDU2LCBuZXcgRUNCKDQsIDE0NCkpKSk7DQorICAgIFZFUlNJT05TLT5BZGQobmV3IENCQ19EYXRhTWF0cml4VmVyc2lvbigyMCwgOTYsIDk2LCAyMiwgMjIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRUNCbG9ja3MoNjgsIG5ldyBFQ0IoNCwgMTc0KSkpKTsNCisgICAgVkVSU0lPTlMtPkFkZChuZXcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKDIxLCAxMDQsIDEwNCwgMjQsIDI0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVDQmxvY2tzKDU2LCBuZXcgRUNCKDYsIDEzNikpKSk7DQorICAgIFZFUlNJT05TLT5BZGQobmV3IENCQ19EYXRhTWF0cml4VmVyc2lvbigyMiwgMTIwLCAxMjAsIDE4LCAxOCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFQ0Jsb2Nrcyg2OCwgbmV3IEVDQig2LCAxNzUpKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKG5ldyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMjMsIDEzMiwgMTMyLCAyMCwgMjAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRUNCbG9ja3MoNjIsIG5ldyBFQ0IoOCwgMTYzKSkpKTsNCisgICAgVkVSU0lPTlMtPkFkZChuZXcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKA0KKyAgICAgICAgMjQsIDE0NCwgMTQ0LCAyMiwgMjIsDQorICAgICAgICBuZXcgRUNCbG9ja3MoNjIsIG5ldyBFQ0IoOCwgMTU2KSwgbmV3IEVDQigyLCAxNTUpKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKG5ldyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMjUsIDgsIDE4LCA2LCAxNiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFQ0Jsb2Nrcyg3LCBuZXcgRUNCKDEsIDUpKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKG5ldyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMjYsIDgsIDMyLCA2LCAxNCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFQ0Jsb2NrcygxMSwgbmV3IEVDQigxLCAxMCkpKSk7DQorICAgIFZFUlNJT05TLT5BZGQobmV3IENCQ19EYXRhTWF0cml4VmVyc2lvbigyNywgMTIsIDI2LCAxMCwgMjQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRUNCbG9ja3MoMTQsIG5ldyBFQ0IoMSwgMTYpKSkpOw0KKyAgICBWRVJTSU9OUy0+QWRkKG5ldyBDQkNfRGF0YU1hdHJpeFZlcnNpb24oMjgsIDEyLCAzNiwgMTAsIDE2LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVDQmxvY2tzKDE4LCBuZXcgRUNCKDEsIDIyKSkpKTsNCisgICAgVkVSU0lPTlMtPkFkZChuZXcgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKDI5LCAxNiwgMzYsIDE0LCAxNiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFQ0Jsb2NrcygyNCwgbmV3IEVDQigxLCAzMikpKSk7DQorICAgIFZFUlNJT05TLT5BZGQobmV3IENCQ19EYXRhTWF0cml4VmVyc2lvbigzMCwgMTYsIDQ4LCAxNCwgMjIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRUNCbG9ja3MoMjgsIG5ldyBFQ0IoMSwgNDkpKSkpOw0KKyAgfQ0KKyAgaW50MzJfdCBudW1WZXJzaW9ucyA9IFZFUlNJT05TLT5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1WZXJzaW9uczsgKytpKSB7DQorICAgIGlmICgoKENCQ19EYXRhTWF0cml4VmVyc2lvbiopKCgqVkVSU0lPTlMpW2ldKSktPm1fc3ltYm9sU2l6ZVJvd3MgPT0NCisgICAgICAgICAgICBudW1Sb3dzICYmDQorICAgICAgICAoKENCQ19EYXRhTWF0cml4VmVyc2lvbiopKCgqVkVSU0lPTlMpW2ldKSktPm1fc3ltYm9sU2l6ZUNvbHVtbnMgPT0NCisgICAgICAgICAgICBudW1Db2x1bW5zKSB7DQorICAgICAgcmV0dXJuIChDQkNfRGF0YU1hdHJpeFZlcnNpb24qKSgqVkVSU0lPTlMpW2ldOw0KKyAgICB9DQorICB9DQorICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgIHJldHVybiBOVUxMOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhWZXJzaW9uLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhWZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUxOTdiMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFZlcnNpb24uaApAQCAtMCwwICsxLDg2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0RBVEFNQVRSSVhWRVJTSU9OX0hfDQorI2RlZmluZSBfQkNfREFUQU1BVFJJWFZFUlNJT05fSF8NCitjbGFzcyBFQ0Jsb2NrczsNCitjbGFzcyBDQkNfRGF0YU1hdHJpeFZlcnNpb247DQorY2xhc3MgRUNCIHsNCisgcHVibGljOg0KKyAgRUNCKGludDMyX3QgY291bnQsIGludDMyX3QgZGF0YUNvZGV3b3Jkcykgew0KKyAgICBtX2NvdW50ID0gY291bnQ7DQorICAgIG1fZGF0YUNvZGV3b3JkcyA9IGRhdGFDb2Rld29yZHM7DQorICB9DQorDQorICBpbnQzMl90IEdldENvdW50KCkgeyByZXR1cm4gbV9jb3VudDsgfQ0KKw0KKyAgaW50MzJfdCBHZXREYXRhQ29kZXdvcmRzKCkgeyByZXR1cm4gbV9kYXRhQ29kZXdvcmRzOyB9DQorDQorIHByaXZhdGU6DQorICBpbnQzMl90IG1fY291bnQ7DQorICBpbnQzMl90IG1fZGF0YUNvZGV3b3JkczsNCit9Ow0KK2NsYXNzIEVDQmxvY2tzIHsNCisgcHVibGljOg0KKyAgRUNCbG9ja3MoaW50MzJfdCBlY0NvZGV3b3JkcywgRUNCKiBlY0Jsb2Nrcykgew0KKyAgICBtX2VjQ29kZXdvcmRzID0gZWNDb2Rld29yZHM7DQorICAgIG1fZWNCbG9ja3MuQWRkKGVjQmxvY2tzKTsNCisgIH0NCisNCisgIEVDQmxvY2tzKGludDMyX3QgZWNDb2Rld29yZHMsIEVDQiogZWNCbG9ja3MxLCBFQ0IqIGVjQmxvY2tzMikgew0KKyAgICBtX2VjQ29kZXdvcmRzID0gZWNDb2Rld29yZHM7DQorICAgIG1fZWNCbG9ja3MuQWRkKGVjQmxvY2tzMSk7DQorICAgIG1fZWNCbG9ja3MuQWRkKGVjQmxvY2tzMik7DQorICB9DQorICB+RUNCbG9ja3MoKSB7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fZWNCbG9ja3MuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICBkZWxldGUgKEVDQiopbV9lY0Jsb2Nrc1tpXTsNCisgICAgfQ0KKyAgICBtX2VjQmxvY2tzLlJlbW92ZUFsbCgpOw0KKyAgfQ0KKw0KKyAgaW50MzJfdCBHZXRFQ0NvZGV3b3JkcygpIHsgcmV0dXJuIG1fZWNDb2Rld29yZHM7IH0NCisNCisgIGNvbnN0IENGWF9QdHJBcnJheSYgR2V0RUNCbG9ja3MoKSB7IHJldHVybiBtX2VjQmxvY2tzOyB9DQorDQorIHByaXZhdGU6DQorICBpbnQzMl90IG1fZWNDb2Rld29yZHM7DQorICBDRlhfUHRyQXJyYXkgbV9lY0Jsb2NrczsNCit9Ow0KK2NsYXNzIENCQ19EYXRhTWF0cml4VmVyc2lvbiB7DQorIHB1YmxpYzoNCisgIENCQ19EYXRhTWF0cml4VmVyc2lvbihpbnQzMl90IHZlcnNpb25OdW1iZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzeW1ib2xTaXplUm93cywNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN5bWJvbFNpemVDb2x1bW5zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGF0YVJlZ2lvblNpemVSb3dzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGF0YVJlZ2lvblNpemVDb2x1bW5zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEVDQmxvY2tzKiBlY0Jsb2Nrcyk7DQorICB2aXJ0dWFsIH5DQkNfRGF0YU1hdHJpeFZlcnNpb24oKTsNCisgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsNCisgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7DQorICBpbnQzMl90IEdldFZlcnNpb25OdW1iZXIoKTsNCisgIGludDMyX3QgR2V0U3ltYm9sU2l6ZVJvd3MoKTsNCisgIGludDMyX3QgR2V0U3ltYm9sU2l6ZUNvbHVtbnMoKTsNCisgIGludDMyX3QgR2V0RGF0YVJlZ2lvblNpemVSb3dzKCk7DQorICBpbnQzMl90IEdldERhdGFSZWdpb25TaXplQ29sdW1ucygpOw0KKyAgaW50MzJfdCBHZXRUb3RhbENvZGV3b3JkcygpOw0KKyAgRUNCbG9ja3MqIEdldEVDQmxvY2tzKCk7DQorICBzdGF0aWMgQ0JDX0RhdGFNYXRyaXhWZXJzaW9uKiBHZXRWZXJzaW9uRm9yRGltZW5zaW9ucyhpbnQzMl90IG51bVJvd3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUNvbHVtbnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIFJlbGVhc2VBbGwoKTsNCisNCisgcHJpdmF0ZToNCisgIGludDMyX3QgbV92ZXJzaW9uTnVtYmVyOw0KKyAgaW50MzJfdCBtX3N5bWJvbFNpemVSb3dzOw0KKyAgaW50MzJfdCBtX3N5bWJvbFNpemVDb2x1bW5zOw0KKyAgaW50MzJfdCBtX2RhdGFSZWdpb25TaXplUm93czsNCisgIGludDMyX3QgbV9kYXRhUmVnaW9uU2l6ZUNvbHVtbnM7DQorICBFQ0Jsb2NrcyogbV9lY0Jsb2NrczsNCisgIGludDMyX3QgbV90b3RhbENvZGV3b3JkczsNCisgIHN0YXRpYyBDRlhfUHRyQXJyYXkqIFZFUlNJT05TOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4V3JpdGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFdyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhMDRiMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFdyaXRlci5jcHAKQEAgLTAsMCArMSwxMzYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDggWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19Xcml0ZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfVHdvRGltV3JpdGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX0RpbWVuc2lvbi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19CaW5hcnlCaXRtYXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfVXRpbENvZGluZ0NvbnZlcnQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZU1hdHJpeC5oIg0KKyNpbmNsdWRlICJCQ19FbmNvZGVyLmgiDQorI2luY2x1ZGUgIkJDX0RlZmF1bHRQbGFjZW1lbnQuaCINCisjaW5jbHVkZSAiQkNfU3ltYm9sU2hhcGVIaW50LmgiDQorI2luY2x1ZGUgIkJDX1N5bWJvbEluZm8uaCINCisjaW5jbHVkZSAiQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQuaCINCisjaW5jbHVkZSAiQkNfRXJyb3JDb3JyZWN0aW9uLmgiDQorI2luY2x1ZGUgIkJDX0VuY29kZXJDb250ZXh0LmgiDQorI2luY2x1ZGUgIkJDX0M0MEVuY29kZXIuaCINCisjaW5jbHVkZSAiQkNfVGV4dEVuY29kZXIuaCINCisjaW5jbHVkZSAiQkNfWDEyRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJCQ19FZGlmYWN0RW5jb2Rlci5oIg0KKyNpbmNsdWRlICJCQ19CYXNlMjU2RW5jb2Rlci5oIg0KKyNpbmNsdWRlICJCQ19BU0NJSUVuY29kZXIuaCINCisjaW5jbHVkZSAiQkNfSGlnaExldmVsRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJCQ19EYXRhTWF0cml4V3JpdGVyLmgiDQorQ0JDX0RhdGFNYXRyaXhXcml0ZXI6OkNCQ19EYXRhTWF0cml4V3JpdGVyKCkge30NCitDQkNfRGF0YU1hdHJpeFdyaXRlcjo6fkNCQ19EYXRhTWF0cml4V3JpdGVyKCkge30NCitGWF9CT09MIENCQ19EYXRhTWF0cml4V3JpdGVyOjpTZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IGxldmVsKSB7DQorICBtX2lDb3JyZWN0TGV2ZWwgPSBsZXZlbDsNCisgIHJldHVybiBUUlVFOw0KK30NCit1aW50OF90KiBDQkNfRGF0YU1hdHJpeFdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKG91dFdpZHRoIDwgMCB8fCBvdXRIZWlnaHQgPCAwKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkhlaWdodEFuZFdpZHRoTXVzdEJlQXRMZWFzdDE7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIH0NCisgIENCQ19TeW1ib2xTaGFwZUhpbnQ6OlN5bWJvbFNoYXBlSGludCBzaGFwZSA9DQorICAgICAgQ0JDX1N5bWJvbFNoYXBlSGludDo6Rk9SQ0VfU1FVQVJFOw0KKyAgQ0JDX0RpbWVuc2lvbiogbWluU2l6ZSA9IE5VTEw7DQorICBDQkNfRGltZW5zaW9uKiBtYXhTaXplID0gTlVMTDsNCisgIENGWF9XaWRlU3RyaW5nIGVjTGV2ZWw7DQorICBDRlhfV2lkZVN0cmluZyBlbmNvZGVkID0gQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmVuY29kZUhpZ2hMZXZlbCgNCisgICAgICBjb250ZW50cywgZWNMZXZlbCwgc2hhcGUsIG1pblNpemUsIG1heFNpemUsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgQ0JDX1N5bWJvbEluZm8qIHN5bWJvbEluZm8gPSBDQkNfU3ltYm9sSW5mbzo6bG9va3VwKA0KKyAgICAgIGVuY29kZWQuR2V0TGVuZ3RoKCksIHNoYXBlLCBtaW5TaXplLCBtYXhTaXplLCBUUlVFLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENGWF9XaWRlU3RyaW5nIGNvZGV3b3JkcyA9DQorICAgICAgQ0JDX0Vycm9yQ29ycmVjdGlvbjo6ZW5jb2RlRUNDMjAwKGVuY29kZWQsIHN5bWJvbEluZm8sIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgQ0JDX0RlZmF1bHRQbGFjZW1lbnQqIHBsYWNlbWVudCA9DQorICAgICAgbmV3IENCQ19EZWZhdWx0UGxhY2VtZW50KGNvZGV3b3Jkcywgc3ltYm9sSW5mby0+Z2V0U3ltYm9sRGF0YVdpZHRoKGUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xJbmZvLT5nZXRTeW1ib2xEYXRhSGVpZ2h0KGUpKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHBsYWNlbWVudC0+cGxhY2UoKTsNCisgIENCQ19Db21tb25CeXRlTWF0cml4KiBieXRlbWF0cml4ID0gZW5jb2RlTG93TGV2ZWwocGxhY2VtZW50LCBzeW1ib2xJbmZvLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIG91dFdpZHRoID0gYnl0ZW1hdHJpeC0+R2V0V2lkdGgoKTsNCisgIG91dEhlaWdodCA9IGJ5dGVtYXRyaXgtPkdldEhlaWdodCgpOw0KKyAgdWludDhfdCogcmVzdWx0ID0gRlhfQWxsb2MyRCh1aW50OF90LCBvdXRXaWR0aCwgb3V0SGVpZ2h0KTsNCisgIEZYU1lTX21lbWNweShyZXN1bHQsIGJ5dGVtYXRyaXgtPkdldEFycmF5KCksIG91dFdpZHRoICogb3V0SGVpZ2h0KTsNCisgIGRlbGV0ZSBieXRlbWF0cml4Ow0KKyAgZGVsZXRlIHBsYWNlbWVudDsNCisgIHJldHVybiByZXN1bHQ7DQorfQ0KK0NCQ19Db21tb25CeXRlTWF0cml4KiBDQkNfRGF0YU1hdHJpeFdyaXRlcjo6ZW5jb2RlTG93TGV2ZWwoDQorICAgIENCQ19EZWZhdWx0UGxhY2VtZW50KiBwbGFjZW1lbnQsDQorICAgIENCQ19TeW1ib2xJbmZvKiBzeW1ib2xJbmZvLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IHN5bWJvbFdpZHRoID0gc3ltYm9sSW5mby0+Z2V0U3ltYm9sRGF0YVdpZHRoKGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgaW50MzJfdCBzeW1ib2xIZWlnaHQgPSBzeW1ib2xJbmZvLT5nZXRTeW1ib2xEYXRhSGVpZ2h0KGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCA9IG5ldyBDQkNfQ29tbW9uQnl0ZU1hdHJpeCgNCisgICAgICBzeW1ib2xJbmZvLT5nZXRTeW1ib2xXaWR0aChlKSwgc3ltYm9sSW5mby0+Z2V0U3ltYm9sSGVpZ2h0KGUpKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIG1hdHJpeC0+SW5pdCgpOw0KKyAgaW50MzJfdCBtYXRyaXhZID0gMDsNCisgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IHN5bWJvbEhlaWdodDsgeSsrKSB7DQorICAgIGludDMyX3QgbWF0cml4WDsNCisgICAgaWYgKCh5ICUgc3ltYm9sSW5mby0+bV9tYXRyaXhIZWlnaHQpID09IDApIHsNCisgICAgICBtYXRyaXhYID0gMDsNCisgICAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBzeW1ib2xJbmZvLT5nZXRTeW1ib2xXaWR0aChlKTsgeCsrKSB7DQorICAgICAgICBtYXRyaXgtPlNldChtYXRyaXhYLCBtYXRyaXhZLCAoeCAlIDIpID09IDApOw0KKyAgICAgICAgbWF0cml4WCsrOw0KKyAgICAgIH0NCisgICAgICBtYXRyaXhZKys7DQorICAgIH0NCisgICAgbWF0cml4WCA9IDA7DQorICAgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IHN5bWJvbFdpZHRoOyB4KyspIHsNCisgICAgICBpZiAoKHggJSBzeW1ib2xJbmZvLT5tX21hdHJpeFdpZHRoKSA9PSAwKSB7DQorICAgICAgICBtYXRyaXgtPlNldChtYXRyaXhYLCBtYXRyaXhZLCBUUlVFKTsNCisgICAgICAgIG1hdHJpeFgrKzsNCisgICAgICB9DQorICAgICAgbWF0cml4LT5TZXQobWF0cml4WCwgbWF0cml4WSwgcGxhY2VtZW50LT5nZXRCaXQoeCwgeSkpOw0KKyAgICAgIG1hdHJpeFgrKzsNCisgICAgICBpZiAoKHggJSBzeW1ib2xJbmZvLT5tX21hdHJpeFdpZHRoKSA9PSBzeW1ib2xJbmZvLT5tX21hdHJpeFdpZHRoIC0gMSkgew0KKyAgICAgICAgbWF0cml4LT5TZXQobWF0cml4WCwgbWF0cml4WSwgKHkgJSAyKSA9PSAwKTsNCisgICAgICAgIG1hdHJpeFgrKzsNCisgICAgICB9DQorICAgIH0NCisgICAgbWF0cml4WSsrOw0KKyAgICBpZiAoKHkgJSBzeW1ib2xJbmZvLT5tX21hdHJpeEhlaWdodCkgPT0gc3ltYm9sSW5mby0+bV9tYXRyaXhIZWlnaHQgLSAxKSB7DQorICAgICAgbWF0cml4WCA9IDA7DQorICAgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgc3ltYm9sSW5mby0+Z2V0U3ltYm9sV2lkdGgoZSk7IHgrKykgew0KKyAgICAgICAgbWF0cml4LT5TZXQobWF0cml4WCwgbWF0cml4WSwgVFJVRSk7DQorICAgICAgICBtYXRyaXhYKys7DQorICAgICAgfQ0KKyAgICAgIG1hdHJpeFkrKzsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIG1hdHJpeDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4V3JpdGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yzc0MjA1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4V3JpdGVyLmgKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIFhGQV9TUkNfRlhCQVJDT0RFX0RBVEFNQVRSSVhfQkNfREFUQU1BVFJJWFdSSVRFUl9IXw0KKyNkZWZpbmUgWEZBX1NSQ19GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19EQVRBTUFUUklYV1JJVEVSX0hfDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1R3b0RpbVdyaXRlci5oIg0KKw0KK2NsYXNzIENCQ19Db21tb25CeXRlTWF0cml4Ow0KK2NsYXNzIENCQ19EZWZhdWx0UGxhY2VtZW50Ow0KK2NsYXNzIENCQ19TeW1ib2xJbmZvOw0KKw0KK2NsYXNzIENCQ19EYXRhTWF0cml4V3JpdGVyIDogcHVibGljIENCQ19Ud29EaW1Xcml0ZXIgew0KKyBwdWJsaWM6DQorICBDQkNfRGF0YU1hdHJpeFdyaXRlcigpOw0KKyAgdmlydHVhbCB+Q0JDX0RhdGFNYXRyaXhXcml0ZXIoKTsNCisgIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgRlhfQk9PTCBTZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IGxldmVsKTsNCisNCisgcHJpdmF0ZToNCisgIHN0YXRpYyBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogZW5jb2RlTG93TGV2ZWwoQ0JDX0RlZmF1bHRQbGFjZW1lbnQqIHBsYWNlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1N5bWJvbEluZm8qIHN5bWJvbEluZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgaW50MzJfdCBtX2lDb3JyZWN0TGV2ZWw7DQorfTsNCisNCisjZW5kaWYgIC8vIFhGQV9TUkNfRlhCQVJDT0RFX0RBVEFNQVRSSVhfQkNfREFUQU1BVFJJWFdSSVRFUl9IXw0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGVmYXVsdFBsYWNlbWVudC5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RlZmF1bHRQbGFjZW1lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NjY1N2IKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RlZmF1bHRQbGFjZW1lbnQuY3BwCkBAIC0wLDAgKzEsMTY0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDA2IEplcmVtaWFzIE1hZXJraS4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAiQkNfRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJCQ19EZWZhdWx0UGxhY2VtZW50LmgiDQorQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6OkNCQ19EZWZhdWx0UGxhY2VtZW50KENGWF9XaWRlU3RyaW5nIGNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1jb2xzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bXJvd3MpIHsNCisgIG1fY29kZXdvcmRzID0gY29kZXdvcmRzOw0KKyAgbV9udW1jb2xzID0gbnVtY29sczsNCisgIG1fbnVtcm93cyA9IG51bXJvd3M7DQorICBtX2JpdHMuU2V0U2l6ZShudW1jb2xzICogbnVtcm93cyk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1jb2xzICogbnVtcm93czsgaSsrKSB7DQorICAgIG1fYml0c1tpXSA9ICh1aW50OF90KTI7DQorICB9DQorfQ0KK0NCQ19EZWZhdWx0UGxhY2VtZW50Ojp+Q0JDX0RlZmF1bHRQbGFjZW1lbnQoKSB7DQorICBtX2JpdHMuUmVtb3ZlQWxsKCk7DQorfQ0KK2ludDMyX3QgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6OmdldE51bXJvd3MoKSB7DQorICByZXR1cm4gbV9udW1yb3dzOw0KK30NCitpbnQzMl90IENCQ19EZWZhdWx0UGxhY2VtZW50OjpnZXROdW1jb2xzKCkgew0KKyAgcmV0dXJuIG1fbnVtY29sczsNCit9DQorQ0ZYX0J5dGVBcnJheSYgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6OmdldEJpdHMoKSB7DQorICByZXR1cm4gbV9iaXRzOw0KK30NCitGWF9CT09MIENCQ19EZWZhdWx0UGxhY2VtZW50OjpnZXRCaXQoaW50MzJfdCBjb2wsIGludDMyX3Qgcm93KSB7DQorICByZXR1cm4gbV9iaXRzW3JvdyAqIG1fbnVtY29scyArIGNvbF0gPT0gMTsNCit9DQordm9pZCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6c2V0Qml0KGludDMyX3QgY29sLCBpbnQzMl90IHJvdywgRlhfQk9PTCBiaXQpIHsNCisgIG1fYml0c1tyb3cgKiBtX251bWNvbHMgKyBjb2xdID0gYml0ID8gKHVpbnQ4X3QpMSA6ICh1aW50OF90KTA7DQorfQ0KK0ZYX0JPT0wgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6Omhhc0JpdChpbnQzMl90IGNvbCwgaW50MzJfdCByb3cpIHsNCisgIHJldHVybiBtX2JpdHNbcm93ICogbV9udW1jb2xzICsgY29sXSAhPSAyOw0KK30NCit2b2lkIENCQ19EZWZhdWx0UGxhY2VtZW50OjpwbGFjZSgpIHsNCisgIGludDMyX3QgcG9zID0gMDsNCisgIGludDMyX3Qgcm93ID0gNDsNCisgIGludDMyX3QgY29sID0gMDsNCisgIGRvIHsNCisgICAgaWYgKChyb3cgPT0gbV9udW1yb3dzKSAmJiAoY29sID09IDApKSB7DQorICAgICAgY29ybmVyMShwb3MrKyk7DQorICAgIH0NCisgICAgaWYgKChyb3cgPT0gbV9udW1yb3dzIC0gMikgJiYgKGNvbCA9PSAwKSAmJiAoKG1fbnVtY29scyAlIDQpICE9IDApKSB7DQorICAgICAgY29ybmVyMihwb3MrKyk7DQorICAgIH0NCisgICAgaWYgKChyb3cgPT0gbV9udW1yb3dzIC0gMikgJiYgKGNvbCA9PSAwKSAmJiAobV9udW1jb2xzICUgOCA9PSA0KSkgew0KKyAgICAgIGNvcm5lcjMocG9zKyspOw0KKyAgICB9DQorICAgIGlmICgocm93ID09IG1fbnVtcm93cyArIDQpICYmIChjb2wgPT0gMikgJiYgKChtX251bWNvbHMgJSA4KSA9PSAwKSkgew0KKyAgICAgIGNvcm5lcjQocG9zKyspOw0KKyAgICB9DQorICAgIGRvIHsNCisgICAgICBpZiAoKHJvdyA8IG1fbnVtcm93cykgJiYgKGNvbCA+PSAwKSAmJiAhaGFzQml0KGNvbCwgcm93KSkgew0KKyAgICAgICAgdXRhaChyb3csIGNvbCwgcG9zKyspOw0KKyAgICAgIH0NCisgICAgICByb3cgLT0gMjsNCisgICAgICBjb2wgKz0gMjsNCisgICAgfSB3aGlsZSAocm93ID49IDAgJiYgKGNvbCA8IG1fbnVtY29scykpOw0KKyAgICByb3crKzsNCisgICAgY29sICs9IDM7DQorICAgIGRvIHsNCisgICAgICBpZiAoKHJvdyA+PSAwKSAmJiAoY29sIDwgbV9udW1jb2xzKSAmJiAhaGFzQml0KGNvbCwgcm93KSkgew0KKyAgICAgICAgdXRhaChyb3csIGNvbCwgcG9zKyspOw0KKyAgICAgIH0NCisgICAgICByb3cgKz0gMjsNCisgICAgICBjb2wgLT0gMjsNCisgICAgfSB3aGlsZSAoKHJvdyA8IG1fbnVtcm93cykgJiYgKGNvbCA+PSAwKSk7DQorICAgIHJvdyArPSAzOw0KKyAgICBjb2wrKzsNCisgIH0gd2hpbGUgKChyb3cgPCBtX251bXJvd3MpIHx8IChjb2wgPCBtX251bWNvbHMpKTsNCisgIGlmICghaGFzQml0KG1fbnVtY29scyAtIDEsIG1fbnVtcm93cyAtIDEpKSB7DQorICAgIHNldEJpdChtX251bWNvbHMgLSAxLCBtX251bXJvd3MgLSAxLCBUUlVFKTsNCisgICAgc2V0Qml0KG1fbnVtY29scyAtIDIsIG1fbnVtcm93cyAtIDIsIFRSVUUpOw0KKyAgfQ0KK30NCit2b2lkIENCQ19EZWZhdWx0UGxhY2VtZW50Ojptb2R1bGUoaW50MzJfdCByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29sLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBiaXQpIHsNCisgIGlmIChyb3cgPCAwKSB7DQorICAgIHJvdyArPSBtX251bXJvd3M7DQorICAgIGNvbCArPSA0IC0gKChtX251bXJvd3MgKyA0KSAlIDgpOw0KKyAgfQ0KKyAgaWYgKGNvbCA8IDApIHsNCisgICAgY29sICs9IG1fbnVtY29sczsNCisgICAgcm93ICs9IDQgLSAoKG1fbnVtY29scyArIDQpICUgOCk7DQorICB9DQorICBpbnQzMl90IHYgPSBtX2NvZGV3b3Jkcy5HZXRBdChwb3MpOw0KKyAgdiAmPSAxIDw8ICg4IC0gYml0KTsNCisgIHNldEJpdChjb2wsIHJvdywgdiAhPSAwKTsNCit9DQordm9pZCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6dXRhaChpbnQzMl90IHJvdywgaW50MzJfdCBjb2wsIGludDMyX3QgcG9zKSB7DQorICBtb2R1bGUocm93IC0gMiwgY29sIC0gMiwgcG9zLCAxKTsNCisgIG1vZHVsZShyb3cgLSAyLCBjb2wgLSAxLCBwb3MsIDIpOw0KKyAgbW9kdWxlKHJvdyAtIDEsIGNvbCAtIDIsIHBvcywgMyk7DQorICBtb2R1bGUocm93IC0gMSwgY29sIC0gMSwgcG9zLCA0KTsNCisgIG1vZHVsZShyb3cgLSAxLCBjb2wsIHBvcywgNSk7DQorICBtb2R1bGUocm93LCBjb2wgLSAyLCBwb3MsIDYpOw0KKyAgbW9kdWxlKHJvdywgY29sIC0gMSwgcG9zLCA3KTsNCisgIG1vZHVsZShyb3csIGNvbCwgcG9zLCA4KTsNCit9DQordm9pZCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6Y29ybmVyMShpbnQzMl90IHBvcykgew0KKyAgbW9kdWxlKG1fbnVtcm93cyAtIDEsIDAsIHBvcywgMSk7DQorICBtb2R1bGUobV9udW1yb3dzIC0gMSwgMSwgcG9zLCAyKTsNCisgIG1vZHVsZShtX251bXJvd3MgLSAxLCAyLCBwb3MsIDMpOw0KKyAgbW9kdWxlKDAsIG1fbnVtY29scyAtIDIsIHBvcywgNCk7DQorICBtb2R1bGUoMCwgbV9udW1jb2xzIC0gMSwgcG9zLCA1KTsNCisgIG1vZHVsZSgxLCBtX251bWNvbHMgLSAxLCBwb3MsIDYpOw0KKyAgbW9kdWxlKDIsIG1fbnVtY29scyAtIDEsIHBvcywgNyk7DQorICBtb2R1bGUoMywgbV9udW1jb2xzIC0gMSwgcG9zLCA4KTsNCit9DQordm9pZCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6Y29ybmVyMihpbnQzMl90IHBvcykgew0KKyAgbW9kdWxlKG1fbnVtcm93cyAtIDMsIDAsIHBvcywgMSk7DQorICBtb2R1bGUobV9udW1yb3dzIC0gMiwgMCwgcG9zLCAyKTsNCisgIG1vZHVsZShtX251bXJvd3MgLSAxLCAwLCBwb3MsIDMpOw0KKyAgbW9kdWxlKDAsIG1fbnVtY29scyAtIDQsIHBvcywgNCk7DQorICBtb2R1bGUoMCwgbV9udW1jb2xzIC0gMywgcG9zLCA1KTsNCisgIG1vZHVsZSgwLCBtX251bWNvbHMgLSAyLCBwb3MsIDYpOw0KKyAgbW9kdWxlKDAsIG1fbnVtY29scyAtIDEsIHBvcywgNyk7DQorICBtb2R1bGUoMSwgbV9udW1jb2xzIC0gMSwgcG9zLCA4KTsNCit9DQordm9pZCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6Y29ybmVyMyhpbnQzMl90IHBvcykgew0KKyAgbW9kdWxlKG1fbnVtcm93cyAtIDMsIDAsIHBvcywgMSk7DQorICBtb2R1bGUobV9udW1yb3dzIC0gMiwgMCwgcG9zLCAyKTsNCisgIG1vZHVsZShtX251bXJvd3MgLSAxLCAwLCBwb3MsIDMpOw0KKyAgbW9kdWxlKDAsIG1fbnVtY29scyAtIDIsIHBvcywgNCk7DQorICBtb2R1bGUoMCwgbV9udW1jb2xzIC0gMSwgcG9zLCA1KTsNCisgIG1vZHVsZSgxLCBtX251bWNvbHMgLSAxLCBwb3MsIDYpOw0KKyAgbW9kdWxlKDIsIG1fbnVtY29scyAtIDEsIHBvcywgNyk7DQorICBtb2R1bGUoMywgbV9udW1jb2xzIC0gMSwgcG9zLCA4KTsNCit9DQordm9pZCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6Y29ybmVyNChpbnQzMl90IHBvcykgew0KKyAgbW9kdWxlKG1fbnVtcm93cyAtIDEsIDAsIHBvcywgMSk7DQorICBtb2R1bGUobV9udW1yb3dzIC0gMSwgbV9udW1jb2xzIC0gMSwgcG9zLCAyKTsNCisgIG1vZHVsZSgwLCBtX251bWNvbHMgLSAzLCBwb3MsIDMpOw0KKyAgbW9kdWxlKDAsIG1fbnVtY29scyAtIDIsIHBvcywgNCk7DQorICBtb2R1bGUoMCwgbV9udW1jb2xzIC0gMSwgcG9zLCA1KTsNCisgIG1vZHVsZSgxLCBtX251bWNvbHMgLSAzLCBwb3MsIDYpOw0KKyAgbW9kdWxlKDEsIG1fbnVtY29scyAtIDIsIHBvcywgNyk7DQorICBtb2R1bGUoMSwgbV9udW1jb2xzIC0gMSwgcG9zLCA4KTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EZWZhdWx0UGxhY2VtZW50LmggYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RlZmF1bHRQbGFjZW1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2JmN2Q5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EZWZhdWx0UGxhY2VtZW50LmgKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19ERUZBVUxUUExBQ0VNRU5UX0hfDQorI2RlZmluZSBfQkNfREVGQVVMVFBMQUNFTUVOVF9IXw0KK2NsYXNzIENCQ19EZWZhdWx0UGxhY2VtZW50IHsNCisgcHVibGljOg0KKyAgQ0JDX0RlZmF1bHRQbGFjZW1lbnQoQ0ZYX1dpZGVTdHJpbmcgY29kZXdvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1jb2xzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1yb3dzKTsNCisgIHZpcnR1YWwgfkNCQ19EZWZhdWx0UGxhY2VtZW50KCk7DQorDQorICBpbnQzMl90IGdldE51bXJvd3MoKTsNCisgIGludDMyX3QgZ2V0TnVtY29scygpOw0KKyAgQ0ZYX0J5dGVBcnJheSYgZ2V0Qml0cygpOw0KKyAgRlhfQk9PTCBnZXRCaXQoaW50MzJfdCBjb2wsIGludDMyX3Qgcm93KTsNCisgIHZvaWQgc2V0Qml0KGludDMyX3QgY29sLCBpbnQzMl90IHJvdywgRlhfQk9PTCBiaXQpOw0KKyAgRlhfQk9PTCBoYXNCaXQoaW50MzJfdCBjb2wsIGludDMyX3Qgcm93KTsNCisgIHZvaWQgcGxhY2UoKTsNCisNCisgcHJpdmF0ZToNCisgIENGWF9XaWRlU3RyaW5nIG1fY29kZXdvcmRzOw0KKyAgaW50MzJfdCBtX251bXJvd3M7DQorICBpbnQzMl90IG1fbnVtY29sczsNCisgIENGWF9CeXRlQXJyYXkgbV9iaXRzOw0KKyAgdm9pZCBtb2R1bGUoaW50MzJfdCByb3csIGludDMyX3QgY29sLCBpbnQzMl90IHBvcywgaW50MzJfdCBiaXQpOw0KKyAgdm9pZCB1dGFoKGludDMyX3Qgcm93LCBpbnQzMl90IGNvbCwgaW50MzJfdCBwb3MpOw0KKyAgdm9pZCBjb3JuZXIxKGludDMyX3QgcG9zKTsNCisgIHZvaWQgY29ybmVyMihpbnQzMl90IHBvcyk7DQorICB2b2lkIGNvcm5lcjMoaW50MzJfdCBwb3MpOw0KKyAgdm9pZCBjb3JuZXI0KGludDMyX3QgcG9zKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRWRpZmFjdEVuY29kZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FZGlmYWN0RW5jb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBhOTk5ZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRWRpZmFjdEVuY29kZXIuY3BwCkBAIC0wLDAgKzEsMTU0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDA2LTIwMDcgSmVyZW1pYXMgTWFlcmtpLg0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX0RpbWVuc2lvbi5oIg0KKyNpbmNsdWRlICJCQ19FbmNvZGVyLmgiDQorI2luY2x1ZGUgIkJDX1N5bWJvbFNoYXBlSGludC5oIg0KKyNpbmNsdWRlICJCQ19TeW1ib2xJbmZvLmgiDQorI2luY2x1ZGUgIkJDX0VuY29kZXJDb250ZXh0LmgiDQorI2luY2x1ZGUgIkJDX0hpZ2hMZXZlbEVuY29kZXIuaCINCisjaW5jbHVkZSAiQkNfRWRpZmFjdEVuY29kZXIuaCINCitDQkNfRWRpZmFjdEVuY29kZXI6OkNCQ19FZGlmYWN0RW5jb2RlcigpIHt9DQorQ0JDX0VkaWZhY3RFbmNvZGVyOjp+Q0JDX0VkaWZhY3RFbmNvZGVyKCkge30NCitpbnQzMl90IENCQ19FZGlmYWN0RW5jb2Rlcjo6Z2V0RW5jb2RpbmdNb2RlKCkgew0KKyAgcmV0dXJuIEVESUZBQ1RfRU5DT0RBVElPTjsNCit9DQordm9pZCBDQkNfRWRpZmFjdEVuY29kZXI6OkVuY29kZShDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsIGludDMyX3QmIGUpIHsNCisgIENGWF9XaWRlU3RyaW5nIGJ1ZmZlcjsNCisgIHdoaWxlIChjb250ZXh0Lmhhc01vcmVDaGFyYWN0ZXJzKCkpIHsNCisgICAgRlhfV0NIQVIgYyA9IGNvbnRleHQuZ2V0Q3VycmVudENoYXIoKTsNCisgICAgZW5jb2RlQ2hhcihjLCBidWZmZXIsIGUpOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGNvbnRleHQubV9wb3MrKzsNCisgICAgaW50MzJfdCBjb3VudCA9IGJ1ZmZlci5HZXRMZW5ndGgoKTsNCisgICAgaWYgKGNvdW50ID49IDQpIHsNCisgICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmRzKGVuY29kZVRvQ29kZXdvcmRzKGJ1ZmZlciwgMCwgZSkpOw0KKyAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgICAgYnVmZmVyLkRlbGV0ZSgwLCA0KTsNCisgICAgICBpbnQzMl90IG5ld01vZGUgPSBDQkNfSGlnaExldmVsRW5jb2Rlcjo6bG9va0FoZWFkVGVzdCgNCisgICAgICAgICAgY29udGV4dC5tX21zZywgY29udGV4dC5tX3BvcywgZ2V0RW5jb2RpbmdNb2RlKCkpOw0KKyAgICAgIGlmIChuZXdNb2RlICE9IGdldEVuY29kaW5nTW9kZSgpKSB7DQorICAgICAgICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UoQVNDSUlfRU5DT0RBVElPTik7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGJ1ZmZlciArPSAoRlhfV0NIQVIpMzE7DQorICBoYW5kbGVFT0QoY29udGV4dCwgYnVmZmVyLCBlKTsNCit9DQordm9pZCBDQkNfRWRpZmFjdEVuY29kZXI6OmhhbmRsZUVPRChDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBidWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IGNvdW50ID0gYnVmZmVyLkdldExlbmd0aCgpOw0KKyAgaWYgKGNvdW50ID09IDApIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKGNvdW50ID09IDEpIHsNCisgICAgY29udGV4dC51cGRhdGVTeW1ib2xJbmZvKGUpOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGludDMyX3QgYXZhaWxhYmxlID0NCisgICAgICAgIGNvbnRleHQubV9zeW1ib2xJbmZvLT5tX2RhdGFDYXBhY2l0eSAtIGNvbnRleHQuZ2V0Q29kZXdvcmRDb3VudCgpOw0KKyAgICBpbnQzMl90IHJlbWFpbmluZyA9IGNvbnRleHQuZ2V0UmVtYWluaW5nQ2hhcmFjdGVycygpOw0KKyAgICBpZiAocmVtYWluaW5nID09IDAgJiYgYXZhaWxhYmxlIDw9IDIpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgIH0NCisgIGlmIChjb3VudCA+IDQpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbFN0YXRlQ291bnRNdXN0Tm90RXhjZWVkNDsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCByZXN0Q2hhcnMgPSBjb3VudCAtIDE7DQorICBDRlhfV2lkZVN0cmluZyBlbmNvZGVkID0gZW5jb2RlVG9Db2Rld29yZHMoYnVmZmVyLCAwLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfQk9PTCBlbmRPZlN5bWJvbFJlYWNoZWQgPSAhY29udGV4dC5oYXNNb3JlQ2hhcmFjdGVycygpOw0KKyAgRlhfQk9PTCByZXN0SW5Bc2NpaSA9IGVuZE9mU3ltYm9sUmVhY2hlZCAmJiByZXN0Q2hhcnMgPD0gMjsNCisgIGlmIChyZXN0Q2hhcnMgPD0gMikgew0KKyAgICBjb250ZXh0LnVwZGF0ZVN5bWJvbEluZm8oY29udGV4dC5nZXRDb2Rld29yZENvdW50KCkgKyByZXN0Q2hhcnMsIGUpOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGludDMyX3QgYXZhaWxhYmxlID0NCisgICAgICAgIGNvbnRleHQubV9zeW1ib2xJbmZvLT5tX2RhdGFDYXBhY2l0eSAtIGNvbnRleHQuZ2V0Q29kZXdvcmRDb3VudCgpOw0KKyAgICBpZiAoYXZhaWxhYmxlID49IDMpIHsNCisgICAgICByZXN0SW5Bc2NpaSA9IEZBTFNFOw0KKyAgICAgIGNvbnRleHQudXBkYXRlU3ltYm9sSW5mbyhjb250ZXh0LmdldENvZGV3b3JkQ291bnQoKSArIGVuY29kZWQuR2V0TGVuZ3RoKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOw0KKyAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmIChyZXN0SW5Bc2NpaSkgew0KKyAgICBjb250ZXh0LnJlc2V0U3ltYm9sSW5mbygpOw0KKyAgICBjb250ZXh0Lm1fcG9zIC09IHJlc3RDaGFyczsNCisgIH0gZWxzZSB7DQorICAgIGNvbnRleHQud3JpdGVDb2Rld29yZHMoZW5jb2RlZCk7DQorICB9DQorICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UoQVNDSUlfRU5DT0RBVElPTik7DQorfQ0KK3ZvaWQgQ0JDX0VkaWZhY3RFbmNvZGVyOjplbmNvZGVDaGFyKEZYX1dDSEFSIGMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChjID49ICcgJyAmJiBjIDw9ICc/Jykgew0KKyAgICBzYiArPSBjOw0KKyAgfSBlbHNlIGlmIChjID49ICdAJyAmJiBjIDw9ICdeJykgew0KKyAgICBzYiArPSAoRlhfV0NIQVIpKGMgLSA2NCk7DQorICB9IGVsc2Ugew0KKyAgICBDQkNfSGlnaExldmVsRW5jb2Rlcjo6aWxsZWdhbENoYXJhY3RlcihjLCBlKTsNCisgIH0NCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX0VkaWZhY3RFbmNvZGVyOjplbmNvZGVUb0NvZGV3b3JkcyhDRlhfV2lkZVN0cmluZyBzYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IGxlbiA9IHNiLkdldExlbmd0aCgpIC0gc3RhcnRQb3M7DQorICBpZiAobGVuID09IDApIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uTm9Db250ZW50czsNCisgICAgcmV0dXJuIChGWF9XQ0hBUiopIiI7DQorICB9DQorICBGWF9XQ0hBUiBjMSA9IHNiLkdldEF0KHN0YXJ0UG9zKTsNCisgIEZYX1dDSEFSIGMyID0gbGVuID49IDIgPyBzYi5HZXRBdChzdGFydFBvcyArIDEpIDogMDsNCisgIEZYX1dDSEFSIGMzID0gbGVuID49IDMgPyBzYi5HZXRBdChzdGFydFBvcyArIDIpIDogMDsNCisgIEZYX1dDSEFSIGM0ID0gbGVuID49IDQgPyBzYi5HZXRBdChzdGFydFBvcyArIDMpIDogMDsNCisgIGludDMyX3QgdiA9IChjMSA8PCAxOCkgKyAoYzIgPDwgMTIpICsgKGMzIDw8IDYpICsgYzQ7DQorICBGWF9XQ0hBUiBjdzEgPSAoRlhfV0NIQVIpKCh2ID4+IDE2KSAmIDI1NSk7DQorICBGWF9XQ0hBUiBjdzIgPSAoRlhfV0NIQVIpKCh2ID4+IDgpICYgMjU1KTsNCisgIEZYX1dDSEFSIGN3MyA9IChGWF9XQ0hBUikodiAmIDI1NSk7DQorICBDRlhfV2lkZVN0cmluZyByZXM7DQorICByZXMgKz0gY3cxOw0KKyAgaWYgKGxlbiA+PSAyKSB7DQorICAgIHJlcyArPSBjdzI7DQorICB9DQorICBpZiAobGVuID49IDMpIHsNCisgICAgcmVzICs9IGN3MzsNCisgIH0NCisgIHJldHVybiByZXM7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRWRpZmFjdEVuY29kZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRWRpZmFjdEVuY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzA5YzA3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FZGlmYWN0RW5jb2Rlci5oCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfRURJRkFDVEVOQ09ERVJfSF8NCisjZGVmaW5lIF9CQ19FRElGQUNURU5DT0RFUl9IXw0KK2NsYXNzIENCQ19FbmNvZGVyQ29udGV4dDsNCitjbGFzcyBDQkNfRWRpZmFjdEVuY29kZXI7DQorY2xhc3MgQ0JDX0VkaWZhY3RFbmNvZGVyIDogcHVibGljIENCQ19FbmNvZGVyIHsNCisgcHVibGljOg0KKyAgQ0JDX0VkaWZhY3RFbmNvZGVyKCk7DQorICB2aXJ0dWFsIH5DQkNfRWRpZmFjdEVuY29kZXIoKTsNCisgIGludDMyX3QgZ2V0RW5jb2RpbmdNb2RlKCk7DQorICB2b2lkIEVuY29kZShDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsIGludDMyX3QmIGUpOw0KKw0KKyBwcml2YXRlOg0KKyAgc3RhdGljIHZvaWQgaGFuZGxlRU9EKENCQ19FbmNvZGVyQ29udGV4dCYgY29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBidWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCBlbmNvZGVDaGFyKEZYX1dDSEFSIGMsIENGWF9XaWRlU3RyaW5nJiBzYiwgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlVG9Db2Rld29yZHMoQ0ZYX1dpZGVTdHJpbmcgc2IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydFBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2Rlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YmViNmMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuY3BwCkBAIC0wLDAgKzEsMTAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAiQkNfRW5jb2Rlci5oIg0KK0NCQ19FbmNvZGVyOjpDQkNfRW5jb2RlcigpIHt9DQorQ0JDX0VuY29kZXI6On5DQkNfRW5jb2RlcigpIHt9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmIwMjM1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmgKQEAgLTAsMCArMSwxNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19FTkNPREVSX0hfDQorI2RlZmluZSBfQkNfRU5DT0RFUl9IXw0KK2NsYXNzIENCQ19FbmNvZGVyQ29udGV4dDsNCitjbGFzcyBDQkNfRW5jb2RlciB7DQorIHB1YmxpYzoNCisgIENCQ19FbmNvZGVyKCk7DQorICB2aXJ0dWFsIH5DQkNfRW5jb2RlcigpOw0KKyAgdmlydHVhbCBpbnQzMl90IGdldEVuY29kaW5nTW9kZSgpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBFbmNvZGUoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LCBpbnQzMl90JiBlKSA9IDA7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXJDb250ZXh0LmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2RlckNvbnRleHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MjM2NDIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXJDb250ZXh0LmNwcApAQCAtMCwwICsxLDExMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwNi0yMDA3IEplcmVtaWFzIE1hZXJraS4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfRGltZW5zaW9uLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1V0aWxDb2RpbmdDb252ZXJ0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAiQkNfRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJCQ19TeW1ib2xTaGFwZUhpbnQuaCINCisjaW5jbHVkZSAiQkNfU3ltYm9sSW5mby5oIg0KKyNpbmNsdWRlICJCQ19FbmNvZGVyQ29udGV4dC5oIg0KK0NCQ19FbmNvZGVyQ29udGV4dDo6Q0JDX0VuY29kZXJDb250ZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nIG1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9CeXRlU3RyaW5nIGRzdHN0cjsNCisgIENCQ19VdGlsQ29kaW5nQ29udmVydDo6VW5pY29kZVRvVVRGOChtc2csIGRzdHN0cik7DQorICBDRlhfV2lkZVN0cmluZyBzYjsNCisgIGludDMyX3QgYyA9IGRzdHN0ci5HZXRMZW5ndGgoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGM7IGkrKykgew0KKyAgICBGWF9XQ0hBUiBjaCA9IChGWF9XQ0hBUikoZHN0c3RyLkdldEF0KGkpICYgMHhmZik7DQorICAgIGlmIChjaCA9PSAnPycgJiYgZHN0c3RyLkdldEF0KGkpICE9ICc/Jykgew0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbkNoYXJhY3RlcnNPdXRzaWRlSVNPODg1OTFFbmNvZGluZzsNCisgICAgfQ0KKyAgICBzYiArPSBjaDsNCisgIH0NCisgIG1fbXNnID0gc2I7DQorICBtX3NoYXBlID0gRk9SQ0VfTk9ORTsNCisgIG1fbmV3RW5jb2RpbmcgPSAtMTsNCisgIG1fcG9zID0gMDsNCisgIG1fc3ltYm9sSW5mbyA9IE5VTEw7DQorICBtX3NraXBBdEVuZCA9IDA7DQorICBtX21heFNpemUgPSBOVUxMOw0KKyAgbV9taW5TaXplID0gTlVMTDsNCit9DQorQ0JDX0VuY29kZXJDb250ZXh0Ojp+Q0JDX0VuY29kZXJDb250ZXh0KCkge30NCit2b2lkIENCQ19FbmNvZGVyQ29udGV4dDo6c2V0U3ltYm9sU2hhcGUoU3ltYm9sU2hhcGVIaW50IHNoYXBlKSB7DQorICBtX3NoYXBlID0gc2hhcGU7DQorfQ0KK3ZvaWQgQ0JDX0VuY29kZXJDb250ZXh0OjpzZXRTaXplQ29uc3RyYWludHMoQ0JDX0RpbWVuc2lvbiogbWluU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19EaW1lbnNpb24qIG1heFNpemUpIHsNCisgIG1fbWF4U2l6ZSA9IG1heFNpemU7DQorICBtX21pblNpemUgPSBtaW5TaXplOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfRW5jb2RlckNvbnRleHQ6OmdldE1lc3NhZ2UoKSB7DQorICByZXR1cm4gbV9tc2c7DQorfQ0KK3ZvaWQgQ0JDX0VuY29kZXJDb250ZXh0OjpzZXRTa2lwQXRFbmQoaW50MzJfdCBjb3VudCkgew0KKyAgbV9za2lwQXRFbmQgPSBjb3VudDsNCit9DQorRlhfV0NIQVIgQ0JDX0VuY29kZXJDb250ZXh0OjpnZXRDdXJyZW50Q2hhcigpIHsNCisgIHJldHVybiBtX21zZy5HZXRBdChtX3Bvcyk7DQorfQ0KK0ZYX1dDSEFSIENCQ19FbmNvZGVyQ29udGV4dDo6Z2V0Q3VycmVudCgpIHsNCisgIHJldHVybiBtX21zZy5HZXRBdChtX3Bvcyk7DQorfQ0KK3ZvaWQgQ0JDX0VuY29kZXJDb250ZXh0Ojp3cml0ZUNvZGV3b3JkcyhDRlhfV2lkZVN0cmluZyBjb2Rld29yZHMpIHsNCisgIG1fY29kZXdvcmRzICs9IGNvZGV3b3JkczsNCit9DQordm9pZCBDQkNfRW5jb2RlckNvbnRleHQ6OndyaXRlQ29kZXdvcmQoRlhfV0NIQVIgY29kZXdvcmQpIHsNCisgIG1fY29kZXdvcmRzICs9IGNvZGV3b3JkOw0KK30NCitpbnQzMl90IENCQ19FbmNvZGVyQ29udGV4dDo6Z2V0Q29kZXdvcmRDb3VudCgpIHsNCisgIHJldHVybiBtX2NvZGV3b3Jkcy5HZXRMZW5ndGgoKTsNCit9DQordm9pZCBDQkNfRW5jb2RlckNvbnRleHQ6OnNpZ25hbEVuY29kZXJDaGFuZ2UoaW50MzJfdCBlbmNvZGluZykgew0KKyAgbV9uZXdFbmNvZGluZyA9IGVuY29kaW5nOw0KK30NCit2b2lkIENCQ19FbmNvZGVyQ29udGV4dDo6cmVzZXRFbmNvZGVyU2lnbmFsKCkgew0KKyAgbV9uZXdFbmNvZGluZyA9IC0xOw0KK30NCitGWF9CT09MIENCQ19FbmNvZGVyQ29udGV4dDo6aGFzTW9yZUNoYXJhY3RlcnMoKSB7DQorICByZXR1cm4gbV9wb3MgPCBnZXRUb3RhbE1lc3NhZ2VDaGFyQ291bnQoKTsNCit9DQoraW50MzJfdCBDQkNfRW5jb2RlckNvbnRleHQ6OmdldFJlbWFpbmluZ0NoYXJhY3RlcnMoKSB7DQorICByZXR1cm4gZ2V0VG90YWxNZXNzYWdlQ2hhckNvdW50KCkgLSBtX3BvczsNCit9DQordm9pZCBDQkNfRW5jb2RlckNvbnRleHQ6OnVwZGF0ZVN5bWJvbEluZm8oaW50MzJfdCYgZSkgew0KKyAgdXBkYXRlU3ltYm9sSW5mbyhnZXRDb2Rld29yZENvdW50KCksIGUpOw0KK30NCit2b2lkIENCQ19FbmNvZGVyQ29udGV4dDo6dXBkYXRlU3ltYm9sSW5mbyhpbnQzMl90IGxlbiwgaW50MzJfdCYgZSkgew0KKyAgaWYgKG1fc3ltYm9sSW5mbyA9PSBOVUxMIHx8IGxlbiA+IG1fc3ltYm9sSW5mby0+bV9kYXRhQ2FwYWNpdHkpIHsNCisgICAgbV9zeW1ib2xJbmZvID0NCisgICAgICAgIENCQ19TeW1ib2xJbmZvOjpsb29rdXAobGVuLCBtX3NoYXBlLCBtX21pblNpemUsIG1fbWF4U2l6ZSwgdHJ1ZSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KK30NCit2b2lkIENCQ19FbmNvZGVyQ29udGV4dDo6cmVzZXRTeW1ib2xJbmZvKCkgew0KKyAgbV9zaGFwZSA9IEZPUkNFX05PTkU7DQorfQ0KK2ludDMyX3QgQ0JDX0VuY29kZXJDb250ZXh0OjpnZXRUb3RhbE1lc3NhZ2VDaGFyQ291bnQoKSB7DQorICByZXR1cm4gbV9tc2cuR2V0TGVuZ3RoKCkgLSBtX3NraXBBdEVuZDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyQ29udGV4dC5oIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyQ29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YTIzMjgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXJDb250ZXh0LmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19FTkNPREVSQ09OVEVYVF9IXw0KKyNkZWZpbmUgX0JDX0VOQ09ERVJDT05URVhUX0hfDQorY2xhc3MgQ0JDX1N5bWJvbFNoYXBlSGludDsNCitjbGFzcyBDQkNfU3ltYm9sSW5mbzsNCitjbGFzcyBDQkNfRGltZW5zaW9uOw0KK2NsYXNzIENCQ19FbmNvZGVyQ29udGV4dDsNCitjbGFzcyBDQkNfRW5jb2RlckNvbnRleHQgOiBwdWJsaWMgQ0JDX1N5bWJvbFNoYXBlSGludCB7DQorIHB1YmxpYzoNCisgIENCQ19FbmNvZGVyQ29udGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyBtc2csDQorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgZWNMZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHZpcnR1YWwgfkNCQ19FbmNvZGVyQ29udGV4dCgpOw0KKyAgdm9pZCBzZXRTeW1ib2xTaGFwZShTeW1ib2xTaGFwZUhpbnQgc2hhcGUpOw0KKyAgdm9pZCBzZXRTaXplQ29uc3RyYWludHMoQ0JDX0RpbWVuc2lvbiogbWluU2l6ZSwgQ0JDX0RpbWVuc2lvbiogbWF4U2l6ZSk7DQorICBDRlhfV2lkZVN0cmluZyBnZXRNZXNzYWdlKCk7DQorICB2b2lkIHNldFNraXBBdEVuZChpbnQzMl90IGNvdW50KTsNCisgIEZYX1dDSEFSIGdldEN1cnJlbnRDaGFyKCk7DQorICBGWF9XQ0hBUiBnZXRDdXJyZW50KCk7DQorICB2b2lkIHdyaXRlQ29kZXdvcmRzKENGWF9XaWRlU3RyaW5nIGNvZGV3b3Jkcyk7DQorICB2b2lkIHdyaXRlQ29kZXdvcmQoRlhfV0NIQVIgY29kZXdvcmQpOw0KKyAgaW50MzJfdCBnZXRDb2Rld29yZENvdW50KCk7DQorICB2b2lkIHNpZ25hbEVuY29kZXJDaGFuZ2UoaW50MzJfdCBlbmNvZGluZyk7DQorICB2b2lkIHJlc2V0RW5jb2RlclNpZ25hbCgpOw0KKyAgRlhfQk9PTCBoYXNNb3JlQ2hhcmFjdGVycygpOw0KKyAgaW50MzJfdCBnZXRSZW1haW5pbmdDaGFyYWN0ZXJzKCk7DQorICB2b2lkIHVwZGF0ZVN5bWJvbEluZm8oaW50MzJfdCYgZSk7DQorICB2b2lkIHVwZGF0ZVN5bWJvbEluZm8oaW50MzJfdCBsZW4sIGludDMyX3QmIGUpOw0KKyAgdm9pZCByZXNldFN5bWJvbEluZm8oKTsNCisNCisgcHVibGljOg0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV9tc2c7DQorICBDRlhfV2lkZVN0cmluZyBtX2NvZGV3b3JkczsNCisgIGludDMyX3QgbV9wb3M7DQorICBpbnQzMl90IG1fbmV3RW5jb2Rpbmc7DQorICBDQkNfU3ltYm9sSW5mbyogbV9zeW1ib2xJbmZvOw0KKw0KKyBwcml2YXRlOg0KKyAgaW50MzJfdCBnZXRUb3RhbE1lc3NhZ2VDaGFyQ291bnQoKTsNCisNCisgcHJpdmF0ZToNCisgIFN5bWJvbFNoYXBlSGludCBtX3NoYXBlOw0KKyAgQ0JDX0RpbWVuc2lvbiogbV9taW5TaXplOw0KKyAgQ0JDX0RpbWVuc2lvbiogbV9tYXhTaXplOw0KKyAgaW50MzJfdCBtX3NraXBBdEVuZDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRXJyb3JDb3JyZWN0aW9uLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRXJyb3JDb3JyZWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmYwN2RiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FcnJvckNvcnJlY3Rpb24uY3BwCkBAIC0wLDAgKzEsMTc1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDA2IEplcmVtaWFzIE1hZXJraS4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAiQkNfRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJCQ19TeW1ib2xTaGFwZUhpbnQuaCINCisjaW5jbHVkZSAiQkNfU3ltYm9sSW5mby5oIg0KKyNpbmNsdWRlICJCQ19FcnJvckNvcnJlY3Rpb24uaCINCitpbnQzMl90IENCQ19FcnJvckNvcnJlY3Rpb246OkZBQ1RPUl9TRVRTW10gPSB7NSwgIDcsICAxMCwgMTEsIDEyLCAxNCwgMTgsIDIwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCwgMjgsIDM2LCA0MiwgNDgsIDU2LCA2MiwgNjh9Ow0KK2ludDMyX3QgQ0JDX0Vycm9yQ29ycmVjdGlvbjo6RkFDVE9SU1tdWzEwMF0gPSB7DQorICAgIHsyMjgsIDQ4LCAxNSwgMTExLCA2Mn0sDQorICAgIHsyMywgNjgsIDE0NCwgMTM0LCAyNDAsIDkyLCAyNTR9LA0KKyAgICB7MjgsIDI0LCAxODUsIDE2NiwgMjIzLCAyNDgsIDExNiwgMjU1LCAxMTAsIDYxfSwNCisgICAgezE3NSwgMTM4LCAyMDUsIDEyLCAxOTQsIDE2OCwgMzksIDI0NSwgNjAsIDk3LCAxMjB9LA0KKyAgICB7NDEsIDE1MywgMTU4LCA5MSwgNjEsIDQyLCAxNDIsIDIxMywgOTcsIDE3OCwgMTAwLCAyNDJ9LA0KKyAgICB7MTU2LCA5NywgMTkyLCAyNTIsIDk1LCA5LCAxNTcsIDExOSwgMTM4LCA0NSwgMTgsIDE4NiwgODMsIDE4NX0sDQorICAgIHs4MywgMTk1LCAxMDAsIDM5LCAxODgsIDc1LCA2NiwgNjEsIDI0MSwgMjEzLCAxMDksIDEyOSwgOTQsIDI1NCwgMjI1LCA0OCwNCisgICAgIDkwLCAxODh9LA0KKyAgICB7MTUsIDE5NSwgMjQ0LCA5LCAyMzMsIDcxLCAxNjgsIDIsIDE4OCwgMTYwLCAxNTMsIDE0NSwgMjUzLCA3OSwgMTA4LCA4MiwgMjcsDQorICAgICAxNzQsIDE4NiwgMTcyfSwNCisgICAgezUyLCAxOTAsIDg4LCAyMDUsIDEwOSwgMzksIDE3NiwgMjEsIDE1NSwgMTk3LCAyNTEsIDIyMywgMTU1LCAyMSwgNSwgMTcyLA0KKyAgICAgMjU0LCAxMjQsIDEyLCAxODEsIDE4NCwgOTYsIDUwLCAxOTN9LA0KKyAgICB7MjExLCAyMzEsIDQzLCA5NywgNzEsIDk2LCAxMDMsIDE3NCwgMzcsIDE1MSwgMTcwLCA1MywgNzUsIDM0LCAyNDksIDEyMSwgMTcsDQorICAgICAxMzgsIDExMCwgMjEzLCAxNDEsIDEzNiwgMTIwLCAxNTEsIDIzMywgMTY4LCA5MywgMjU1fSwNCisgICAgezI0NSwgMTI3LCAyNDIsIDIxOCwgMTMwLCAyNTAsIDE2MiwgMTgxLCAxMDIsIDEyMCwgODQsIDE3OSwgMjIwLCAyNTEsIDgwLA0KKyAgICAgMTgyLCAyMjksIDE4LCAyLCA0LCA2OCwgMzMsIDEwMSwgMTM3LCA5NSwgMTE5LCAxMTUsIDQ0LCAxNzUsIDE4NCwgNTksIDI1LA0KKyAgICAgMjI1LCA5OCwgODEsIDExMn0sDQorICAgIHs3NywgMTkzLCAxMzcsIDMxLCAxOSwgMzgsIDIyLCAxNTMsIDI0NywgMTA1LCAxMjIsIDIsIDI0NSwgMTMzLCAyNDIsIDgsIDE3NSwNCisgICAgIDk1LCAxMDAsIDksIDE2NywgMTA1LCAyMTQsIDExMSwgNTcsIDEyMSwgMjEsIDEsIDI1MywgNTcsIDU0LCAxMDEsIDI0OCwgMjAyLA0KKyAgICAgNjksIDUwLCAxNTAsIDE3NywgMjI2LCA1LCA5LCA1fSwNCisgICAgezI0NSwgMTMyLCAxNzIsIDIyMywgOTYsIDMyLCAxMTcsIDIyLCAyMzgsIDEzMywgMjM4LCAyMzEsIDIwNSwgMTg4LCAyMzcsIDg3LA0KKyAgICAgMTkxLCAxMDYsIDE2LCAxNDcsIDExOCwgMjMsIDM3LCA5MCwgMTcwLCAyMDUsIDEzMSwgODgsIDEyMCwgMTAwLCA2NiwgMTM4LA0KKyAgICAgMTg2LCAyNDAsIDgyLCA0NCwgMTc2LCA4NywgMTg3LCAxNDcsIDE2MCwgMTc1LCA2OSwgMjEzLCA5MiwgMjUzLCAyMjUsIDE5fSwNCisgICAgezE3NSwgOSwgMjIzLCAyMzgsIDEyLCAxNywgMjIwLCAyMDgsIDEwMCwgMjksIDE3NSwgMTcwLCAyMzAsIDE5MiwgMjE1LCAyMzUsDQorICAgICAxNTAsIDE1OSwgMzYsIDIyMywgMzgsIDIwMCwgMTMyLCA1NCwgMjI4LCAxNDYsIDIxOCwgMjM0LCAxMTcsIDIwMywgMjksIDIzMiwNCisgICAgIDE0NCwgMjM4LCAyMiwgMTUwLCAyMDEsIDExNywgNjIsIDIwNywgMTY0LCAxMywgMTM3LCAyNDUsIDEyNywgNjcsIDI0NywgMjgsDQorICAgICAxNTUsIDQzLCAyMDMsIDEwNywgMjMzLCA1MywgMTQzLCA0Nn0sDQorICAgIHsyNDIsIDkzLCAxNjksIDUwLCAxNDQsIDIxMCwgMzksIDExOCwgMjAyLCAxODgsIDIwMSwgMTg5LCAxNDMsIDEwOCwgMTk2LCAzNywNCisgICAgIDE4NSwgMTEyLCAxMzQsIDIzMCwgMjQ1LCA2MywgMTk3LCAxOTAsIDI1MCwgMTA2LCAxODUsIDIyMSwgMTc1LCA2NCwgMTE0LA0KKyAgICAgNzEsIDE2MSwgNDQsIDE0NywgNiwgMjcsIDIxOCwgNTEsIDYzLCA4NywgMTAsIDQwLCAxMzAsIDE4OCwgMTcsIDE2MywgMzEsDQorICAgICAxNzYsIDE3MCwgNCwgMTA3LCAyMzIsIDcsIDk0LCAxNjYsIDIyNCwgMTI0LCA4NiwgNDcsIDExLCAyMDR9LA0KKyAgICB7MjIwLCAyMjgsIDE3MywgODksIDI1MSwgMTQ5LCAxNTksIDU2LCA4OSwgMzMsIDE0NywgMjQ0LCAxNTQsIDM2LCA3MywgMTI3LA0KKyAgICAgMjEzLCAxMzYsIDI0OCwgMTgwLCAyMzQsIDE5NywgMTU4LCAxNzcsIDY4LCAxMjIsIDkzLCAyMTMsIDE1LCAxNjAsIDIyNywNCisgICAgIDIzNiwgNjYsIDEzOSwgMTUzLCAxODUsIDIwMiwgMTY3LCAxNzksIDI1LCAyMjAsIDIzMiwgOTYsIDIxMCwgMjMxLCAxMzYsDQorICAgICAyMjMsIDIzOSwgMTgxLCAyNDEsIDU5LCA1MiwgMTcyLCAyNSwgNDksIDIzMiwgMjExLCAxODksIDY0LCA1NCwgMTA4LCAxNTMsDQorICAgICAxMzIsIDYzLCA5NiwgMTAzLCA4MiwgMTg2fX07DQoraW50MzJfdCBDQkNfRXJyb3JDb3JyZWN0aW9uOjpNT0RVTE9fVkFMVUUgPSAweDEyRDsNCitpbnQzMl90IENCQ19FcnJvckNvcnJlY3Rpb246OkxPR1syNTZdID0gezB9Ow0KK2ludDMyX3QgQ0JDX0Vycm9yQ29ycmVjdGlvbjo6QUxPR1syNTZdID0gezB9Ow0KK3ZvaWQgQ0JDX0Vycm9yQ29ycmVjdGlvbjo6SW5pdGlhbGl6ZSgpIHsNCisgIGludDMyX3QgcCA9IDE7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAyNTU7IGkrKykgew0KKyAgICBBTE9HW2ldID0gcDsNCisgICAgTE9HW3BdID0gaTsNCisgICAgcCA8PD0gMTsNCisgICAgaWYgKHAgPj0gMjU2KSB7DQorICAgICAgcCBePSBNT0RVTE9fVkFMVUU7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDQkNfRXJyb3JDb3JyZWN0aW9uOjpGaW5hbGl6ZSgpIHt9DQorQ0JDX0Vycm9yQ29ycmVjdGlvbjo6Q0JDX0Vycm9yQ29ycmVjdGlvbigpIHt9DQorQ0JDX0Vycm9yQ29ycmVjdGlvbjo6fkNCQ19FcnJvckNvcnJlY3Rpb24oKSB7fQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19FcnJvckNvcnJlY3Rpb246OmVuY29kZUVDQzIwMChDRlhfV2lkZVN0cmluZyBjb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19TeW1ib2xJbmZvKiBzeW1ib2xJbmZvLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoY29kZXdvcmRzLkdldExlbmd0aCgpICE9IHN5bWJvbEluZm8tPm1fZGF0YUNhcGFjaXR5KSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCisgICAgcmV0dXJuIChGWF9XQ0hBUiopIiI7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyBzYjsNCisgIHNiICs9IGNvZGV3b3JkczsNCisgIGludDMyX3QgYmxvY2tDb3VudCA9IHN5bWJvbEluZm8tPmdldEludGVybGVhdmVkQmxvY2tDb3VudCgpOw0KKyAgaWYgKGJsb2NrQ291bnQgPT0gMSkgew0KKyAgICBDRlhfV2lkZVN0cmluZyBlY2MgPQ0KKyAgICAgICAgY3JlYXRlRUNDQmxvY2soY29kZXdvcmRzLCBzeW1ib2xJbmZvLT5tX2Vycm9yQ29kZXdvcmRzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIChGWF9XQ0hBUiopIiIpOw0KKyAgICBzYiArPSBlY2M7DQorICB9IGVsc2Ugew0KKyAgICBDRlhfSW50MzJBcnJheSBkYXRhU2l6ZXM7DQorICAgIGRhdGFTaXplcy5TZXRTaXplKGJsb2NrQ291bnQpOw0KKyAgICBDRlhfSW50MzJBcnJheSBlcnJvclNpemVzOw0KKyAgICBlcnJvclNpemVzLlNldFNpemUoYmxvY2tDb3VudCk7DQorICAgIENGWF9JbnQzMkFycmF5IHN0YXJ0UG9zOw0KKyAgICBzdGFydFBvcy5TZXRTaXplKGJsb2NrQ291bnQpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBibG9ja0NvdW50OyBpKyspIHsNCisgICAgICBkYXRhU2l6ZXNbaV0gPSBzeW1ib2xJbmZvLT5nZXREYXRhTGVuZ3RoRm9ySW50ZXJsZWF2ZWRCbG9jayhpICsgMSk7DQorICAgICAgZXJyb3JTaXplc1tpXSA9IHN5bWJvbEluZm8tPmdldEVycm9yTGVuZ3RoRm9ySW50ZXJsZWF2ZWRCbG9jayhpICsgMSk7DQorICAgICAgc3RhcnRQb3NbaV0gPSAwOw0KKyAgICAgIGlmIChpID4gMCkgew0KKyAgICAgICAgc3RhcnRQb3NbaV0gPSBzdGFydFBvc1tpIC0gMV0gKyBkYXRhU2l6ZXNbaV07DQorICAgICAgfQ0KKyAgICB9DQorICAgIGZvciAoaW50MzJfdCBibG9jayA9IDA7IGJsb2NrIDwgYmxvY2tDb3VudDsgYmxvY2srKykgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHRlbXA7DQorICAgICAgZm9yIChpbnQzMl90IGQgPSBibG9jazsgZCA8IHN5bWJvbEluZm8tPm1fZGF0YUNhcGFjaXR5OyBkICs9IGJsb2NrQ291bnQpIHsNCisgICAgICAgIHRlbXAgKz0gKEZYX1dDSEFSKWNvZGV3b3Jkcy5HZXRBdChkKTsNCisgICAgICB9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgZWNjID0gY3JlYXRlRUNDQmxvY2sodGVtcCwgZXJyb3JTaXplc1tibG9ja10sIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAoRlhfV0NIQVIqKSIiKTsNCisgICAgICBpbnQzMl90IHBvcyA9IDA7DQorICAgICAgZm9yIChpbnQzMl90IGwgPSBibG9jazsgbCA8IGVycm9yU2l6ZXNbYmxvY2tdICogYmxvY2tDb3VudDsNCisgICAgICAgICAgIGwgKz0gYmxvY2tDb3VudCkgew0KKyAgICAgICAgc2IuU2V0QXQoc3ltYm9sSW5mby0+bV9kYXRhQ2FwYWNpdHkgKyBsLCBlY2MuR2V0QXQocG9zKyspKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBzYjsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX0Vycm9yQ29ycmVjdGlvbjo6Y3JlYXRlRUNDQmxvY2soQ0ZYX1dpZGVTdHJpbmcgY29kZXdvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRUNXb3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICByZXR1cm4gY3JlYXRlRUNDQmxvY2soY29kZXdvcmRzLCAwLCBjb2Rld29yZHMuR2V0TGVuZ3RoKCksIG51bUVDV29yZHMsIGUpOw0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfRXJyb3JDb3JyZWN0aW9uOjpjcmVhdGVFQ0NCbG9jayhDRlhfV2lkZVN0cmluZyBjb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUVDV29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCB0YWJsZSA9IC0xOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZW9mKEZBQ1RPUl9TRVRTKSAvIHNpemVvZihpbnQzMl90KTsgaSsrKSB7DQorICAgIGlmIChGQUNUT1JfU0VUU1tpXSA9PSBudW1FQ1dvcmRzKSB7DQorICAgICAgdGFibGUgPSBpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpZiAodGFibGUgPCAwKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCisgICAgcmV0dXJuIChGWF9XQ0hBUiopIiI7DQorICB9DQorICBGWF9XT1JEKiBlY2MgPSBGWF9BbGxvYyhGWF9XT1JELCBudW1FQ1dvcmRzKTsNCisgIEZYU1lTX21lbXNldChlY2MsIDAsIG51bUVDV29yZHMgKiBzaXplb2YoRlhfV09SRCkpOw0KKyAgZm9yIChpbnQzMl90IGwgPSBzdGFydDsgbCA8IHN0YXJ0ICsgbGVuOyBsKyspIHsNCisgICAgRlhfV09SRCBtID0gZWNjW251bUVDV29yZHMgLSAxXSBeIGNvZGV3b3Jkcy5HZXRBdChsKTsNCisgICAgZm9yIChpbnQzMl90IGsgPSBudW1FQ1dvcmRzIC0gMTsgayA+IDA7IGstLSkgew0KKyAgICAgIGlmIChtICE9IDAgJiYgRkFDVE9SU1t0YWJsZV1ba10gIT0gMCkgew0KKyAgICAgICAgZWNjW2tdID0gKEZYX1dPUkQpKGVjY1trIC0gMV0gXg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dbKExPR1ttXSArIExPR1tGQUNUT1JTW3RhYmxlXVtrXV0pICUgMjU1XSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGVjY1trXSA9IGVjY1trIC0gMV07DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChtICE9IDAgJiYgRkFDVE9SU1t0YWJsZV1bMF0gIT0gMCkgew0KKyAgICAgIGVjY1swXSA9IChGWF9XT1JEKUFMT0dbKExPR1ttXSArIExPR1tGQUNUT1JTW3RhYmxlXVswXV0pICUgMjU1XTsNCisgICAgfSBlbHNlIHsNCisgICAgICBlY2NbMF0gPSAwOw0KKyAgICB9DQorICB9DQorICBDRlhfV2lkZVN0cmluZyBzdHJlY2M7DQorICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBudW1FQ1dvcmRzOyBqKyspIHsNCisgICAgc3RyZWNjICs9IChGWF9XQ0hBUillY2NbbnVtRUNXb3JkcyAtIGogLSAxXTsNCisgIH0NCisgIEZYX0ZyZWUoZWNjKTsNCisgIHJldHVybiBzdHJlY2M7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRXJyb3JDb3JyZWN0aW9uLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Vycm9yQ29ycmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOGFjYzEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Vycm9yQ29ycmVjdGlvbi5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfRVJST1JDT1JSRUNUSU9OX0hfDQorI2RlZmluZSBfQkNfRVJST1JDT1JSRUNUSU9OX0hfDQorY2xhc3MgQ0JDX1N5bWJvbEluZm87DQorY2xhc3MgQ0JDX0Vycm9yQ29ycmVjdGlvbiB7DQorIHB1YmxpYzoNCisgIENCQ19FcnJvckNvcnJlY3Rpb24oKTsNCisgIHZpcnR1YWwgfkNCQ19FcnJvckNvcnJlY3Rpb24oKTsNCisgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsNCisgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7DQorICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlRUNDMjAwKENGWF9XaWRlU3RyaW5nIGNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1N5bWJvbEluZm8qIHN5bWJvbEluZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKw0KKyBwcml2YXRlOg0KKyAgc3RhdGljIGludDMyX3QgRkFDVE9SX1NFVFNbXTsNCisgIHN0YXRpYyBpbnQzMl90IEZBQ1RPUlNbXVsxMDBdOw0KKyAgc3RhdGljIGludDMyX3QgTU9EVUxPX1ZBTFVFOw0KKyAgc3RhdGljIGludDMyX3QgTE9HWzI1Nl07DQorICBzdGF0aWMgaW50MzJfdCBBTE9HWzI1Nl07DQorDQorIHByaXZhdGU6DQorICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgY3JlYXRlRUNDQmxvY2soQ0ZYX1dpZGVTdHJpbmcgY29kZXdvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRUNXb3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBDRlhfV2lkZVN0cmluZyBjcmVhdGVFQ0NCbG9jayhDRlhfV2lkZVN0cmluZyBjb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUVDV29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0hpZ2hMZXZlbEVuY29kZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19IaWdoTGV2ZWxFbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjE0ZWYzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19IaWdoTGV2ZWxFbmNvZGVyLmNwcApAQCAtMCwwICsxLDM3MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwNi0yMDA3IEplcmVtaWFzIE1hZXJraS4NCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfRGltZW5zaW9uLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1V0aWxDb2RpbmdDb252ZXJ0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAiQkNfRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJCQ19TeW1ib2xTaGFwZUhpbnQuaCINCisjaW5jbHVkZSAiQkNfU3ltYm9sSW5mby5oIg0KKyNpbmNsdWRlICJCQ19FbmNvZGVyQ29udGV4dC5oIg0KKyNpbmNsdWRlICJCQ19DNDBFbmNvZGVyLmgiDQorI2luY2x1ZGUgIkJDX1RleHRFbmNvZGVyLmgiDQorI2luY2x1ZGUgIkJDX1gxMkVuY29kZXIuaCINCisjaW5jbHVkZSAiQkNfRWRpZmFjdEVuY29kZXIuaCINCisjaW5jbHVkZSAiQkNfQmFzZTI1NkVuY29kZXIuaCINCisjaW5jbHVkZSAiQkNfQVNDSUlFbmNvZGVyLmgiDQorI2luY2x1ZGUgIkJDX0hpZ2hMZXZlbEVuY29kZXIuaCINCisjZGVmaW5lIEludGVnZXJfTUFYX1ZBTFVFIDIxNDc0ODM2NDcNCitGWF9XQ0hBUiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fQzQwID0gMjMwOw0KK0ZYX1dDSEFSIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpMQVRDSF9UT19CQVNFMjU2ID0gMjMxOw0KK0ZYX1dDSEFSIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpVUFBFUl9TSElGVCA9IDIzNTsNCitGWF9XQ0hBUiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fQU5TSVgxMiA9IDIzODsNCitGWF9XQ0hBUiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fVEVYVCA9IDIzOTsNCitGWF9XQ0hBUiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fRURJRkFDVCA9IDI0MDsNCitGWF9XQ0hBUiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6QzQwX1VOTEFUQ0ggPSAyNTQ7DQorRlhfV0NIQVIgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OlgxMl9VTkxBVENIID0gMjU0Ow0KK0ZYX1dDSEFSIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpQQUQgPSAxMjk7DQorRlhfV0NIQVIgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6Ok1BQ1JPXzA1ID0gMjM2Ow0KK0ZYX1dDSEFSIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpNQUNST18wNiA9IDIzNzsNCitjb25zdCB3Y2hhcl90KiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6TUFDUk9fMDVfSEVBREVSID0gTCJbKT4eMDUiOw0KK2NvbnN0IHdjaGFyX3QqIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpNQUNST18wNl9IRUFERVIgPSBMIlspPh4wNiI7DQorY29uc3Qgd2NoYXJfdCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6TUFDUk9fVFJBSUxFUiA9IDB4MDAwNDsNCitDQkNfSGlnaExldmVsRW5jb2Rlcjo6Q0JDX0hpZ2hMZXZlbEVuY29kZXIoKSB7fQ0KK0NCQ19IaWdoTGV2ZWxFbmNvZGVyOjp+Q0JDX0hpZ2hMZXZlbEVuY29kZXIoKSB7fQ0KK0NGWF9CeXRlQXJyYXkmIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpnZXRCeXRlc0Zvck1lc3NhZ2UoQ0ZYX1dpZGVTdHJpbmcgbXNnKSB7DQorICBDRlhfQnl0ZVN0cmluZyBieXRlc3RyOw0KKyAgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0OjpVbmljb2RlVG9VVEY4KG1zZywgYnl0ZXN0cik7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBieXRlc3RyLkdldExlbmd0aCgpOyBpKyspIHsNCisgICAgbV9ieXRlYXJyYXkuQWRkKGJ5dGVzdHIuR2V0QXQoaSkpOw0KKyAgfQ0KKyAgcmV0dXJuIG1fYnl0ZWFycmF5Ow0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfSGlnaExldmVsRW5jb2Rlcjo6ZW5jb2RlSGlnaExldmVsKENGWF9XaWRlU3RyaW5nIG1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGVjTGV2ZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICByZXR1cm4gZW5jb2RlSGlnaExldmVsKG1zZywgZWNMZXZlbCwgRk9SQ0VfTk9ORSwgTlVMTCwgTlVMTCwgZSk7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjplbmNvZGVIaWdoTGV2ZWwoQ0ZYX1dpZGVTdHJpbmcgbXNnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgZWNMZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbFNoYXBlSGludCBzaGFwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19EaW1lbnNpb24qIG1pblNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfRGltZW5zaW9uKiBtYXhTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0JDX0VuY29kZXJDb250ZXh0IGNvbnRleHQobXNnLCBlY0xldmVsLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAoRlhfV0NIQVIqKSIiKTsNCisgIGNvbnRleHQuc2V0U3ltYm9sU2hhcGUoc2hhcGUpOw0KKyAgY29udGV4dC5zZXRTaXplQ29uc3RyYWludHMobWluU2l6ZSwgbWF4U2l6ZSk7DQorICBpZiAoKG1zZy5NaWQoMCwgNikgPT0gTUFDUk9fMDVfSEVBREVSKSAmJg0KKyAgICAgIChtc2cuTWlkKG1zZy5HZXRMZW5ndGgoKSAtIDEsIDEpID09IE1BQ1JPX1RSQUlMRVIpKSB7DQorICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChNQUNST18wNSk7DQorICAgIGNvbnRleHQuc2V0U2tpcEF0RW5kKDIpOw0KKyAgICBjb250ZXh0Lm1fcG9zICs9IDY7DQorICB9IGVsc2UgaWYgKChtc2cuTWlkKDAsIDYpID09IE1BQ1JPXzA2X0hFQURFUikgJiYNCisgICAgICAgICAgICAgKG1zZy5NaWQobXNnLkdldExlbmd0aCgpIC0gMSwgMSkgPT0gTUFDUk9fVFJBSUxFUikpIHsNCisgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKE1BQ1JPXzA2KTsNCisgICAgY29udGV4dC5zZXRTa2lwQXRFbmQoMik7DQorICAgIGNvbnRleHQubV9wb3MgKz0gNjsNCisgIH0NCisgIENGWF9QdHJBcnJheSBlbmNvZGVyczsNCisgIGVuY29kZXJzLkFkZChuZXcgQ0JDX0FTQ0lJRW5jb2RlcigpKTsNCisgIGVuY29kZXJzLkFkZChuZXcgQ0JDX0M0MEVuY29kZXIoKSk7DQorICBlbmNvZGVycy5BZGQobmV3IENCQ19UZXh0RW5jb2RlcigpKTsNCisgIGVuY29kZXJzLkFkZChuZXcgQ0JDX1gxMkVuY29kZXIoKSk7DQorICBlbmNvZGVycy5BZGQobmV3IENCQ19FZGlmYWN0RW5jb2RlcigpKTsNCisgIGVuY29kZXJzLkFkZChuZXcgQ0JDX0Jhc2UyNTZFbmNvZGVyKCkpOw0KKyAgaW50MzJfdCBlbmNvZGluZ01vZGUgPSBBU0NJSV9FTkNPREFUSU9OOw0KKyAgd2hpbGUgKGNvbnRleHQuaGFzTW9yZUNoYXJhY3RlcnMoKSkgew0KKyAgICAoKENCQ19FbmNvZGVyKillbmNvZGVycy5HZXRBdChlbmNvZGluZ01vZGUpKS0+RW5jb2RlKGNvbnRleHQsIGUpOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZW5jb2RlcnMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIGRlbGV0ZSAoQ0JDX0VuY29kZXIqKWVuY29kZXJzLkdldEF0KGkpOw0KKyAgICAgIH0NCisgICAgICBlbmNvZGVycy5SZW1vdmVBbGwoKTsNCisgICAgICByZXR1cm4gKEZYX1dDSEFSKikiIjsNCisgICAgfQ0KKyAgICBpZiAoY29udGV4dC5tX25ld0VuY29kaW5nID49IDApIHsNCisgICAgICBlbmNvZGluZ01vZGUgPSBjb250ZXh0Lm1fbmV3RW5jb2Rpbmc7DQorICAgICAgY29udGV4dC5yZXNldEVuY29kZXJTaWduYWwoKTsNCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBsZW4gPSBjb250ZXh0Lm1fY29kZXdvcmRzLkdldExlbmd0aCgpOw0KKyAgY29udGV4dC51cGRhdGVTeW1ib2xJbmZvKGUpOw0KKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBlbmNvZGVycy5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgIGRlbGV0ZSAoQ0JDX0VuY29kZXIqKWVuY29kZXJzLkdldEF0KGkpOw0KKyAgICB9DQorICAgIGVuY29kZXJzLlJlbW92ZUFsbCgpOw0KKyAgICByZXR1cm4gKEZYX1dDSEFSKikiIjsNCisgIH0NCisgIGludDMyX3QgY2FwYWNpdHkgPSBjb250ZXh0Lm1fc3ltYm9sSW5mby0+bV9kYXRhQ2FwYWNpdHk7DQorICBpZiAobGVuIDwgY2FwYWNpdHkpIHsNCisgICAgaWYgKGVuY29kaW5nTW9kZSAhPSBBU0NJSV9FTkNPREFUSU9OICYmDQorICAgICAgICBlbmNvZGluZ01vZGUgIT0gQkFTRTI1Nl9FTkNPREFUSU9OKSB7DQorICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKDB4MDBmZSk7DQorICAgIH0NCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIGNvZGV3b3JkcyA9IGNvbnRleHQubV9jb2Rld29yZHM7DQorICBpZiAoY29kZXdvcmRzLkdldExlbmd0aCgpIDwgY2FwYWNpdHkpIHsNCisgICAgY29kZXdvcmRzICs9IFBBRDsNCisgIH0NCisgIHdoaWxlIChjb2Rld29yZHMuR2V0TGVuZ3RoKCkgPCBjYXBhY2l0eSkgew0KKyAgICBjb2Rld29yZHMgKz0gKHJhbmRvbWl6ZTI1M1N0YXRlKFBBRCwgY29kZXdvcmRzLkdldExlbmd0aCgpICsgMSkpOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZW5jb2RlcnMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgZGVsZXRlIChDQkNfRW5jb2RlciopZW5jb2RlcnMuR2V0QXQoaSk7DQorICB9DQorICBlbmNvZGVycy5SZW1vdmVBbGwoKTsNCisgIHJldHVybiBjb2Rld29yZHM7DQorfQ0KK2ludDMyX3QgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6Omxvb2tBaGVhZFRlc3QoQ0ZYX1dpZGVTdHJpbmcgbXNnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY3VycmVudE1vZGUpIHsNCisgIGlmIChzdGFydHBvcyA+PSBtc2cuR2V0TGVuZ3RoKCkpIHsNCisgICAgcmV0dXJuIGN1cnJlbnRNb2RlOw0KKyAgfQ0KKyAgQ0ZYX0Zsb2F0QXJyYXkgY2hhckNvdW50czsNCisgIGlmIChjdXJyZW50TW9kZSA9PSBBU0NJSV9FTkNPREFUSU9OKSB7DQorICAgIGNoYXJDb3VudHMuQWRkKDApOw0KKyAgICBjaGFyQ291bnRzLkFkZCgxKTsNCisgICAgY2hhckNvdW50cy5BZGQoMSk7DQorICAgIGNoYXJDb3VudHMuQWRkKDEpOw0KKyAgICBjaGFyQ291bnRzLkFkZCgxKTsNCisgICAgY2hhckNvdW50cy5BZGQoMS4yNWYpOw0KKyAgfSBlbHNlIHsNCisgICAgY2hhckNvdW50cy5BZGQoMSk7DQorICAgIGNoYXJDb3VudHMuQWRkKDIpOw0KKyAgICBjaGFyQ291bnRzLkFkZCgyKTsNCisgICAgY2hhckNvdW50cy5BZGQoMik7DQorICAgIGNoYXJDb3VudHMuQWRkKDIpOw0KKyAgICBjaGFyQ291bnRzLkFkZCgyLjI1Zik7DQorICAgIGNoYXJDb3VudHNbY3VycmVudE1vZGVdID0gMDsNCisgIH0NCisgIGludDMyX3QgY2hhcnNQcm9jZXNzZWQgPSAwOw0KKyAgd2hpbGUgKFRSVUUpIHsNCisgICAgaWYgKChzdGFydHBvcyArIGNoYXJzUHJvY2Vzc2VkKSA9PSBtc2cuR2V0TGVuZ3RoKCkpIHsNCisgICAgICBGWF9EV09SRCBtaW4gPSBJbnRlZ2VyX01BWF9WQUxVRTsNCisgICAgICBDRlhfQnl0ZUFycmF5IG1pbnM7DQorICAgICAgbWlucy5TZXRTaXplKDYpOw0KKyAgICAgIENGWF9JbnQzMkFycmF5IGludENoYXJDb3VudHM7DQorICAgICAgaW50Q2hhckNvdW50cy5TZXRTaXplKDYpOw0KKyAgICAgIG1pbiA9IGZpbmRNaW5pbXVtcyhjaGFyQ291bnRzLCBpbnRDaGFyQ291bnRzLCBtaW4sIG1pbnMpOw0KKyAgICAgIGludDMyX3QgbWluQ291bnQgPSBnZXRNaW5pbXVtQ291bnQobWlucyk7DQorICAgICAgaWYgKGludENoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gPT0gbWluKSB7DQorICAgICAgICByZXR1cm4gQVNDSUlfRU5DT0RBVElPTjsNCisgICAgICB9DQorICAgICAgaWYgKG1pbkNvdW50ID09IDEgJiYgbWluc1tCQVNFMjU2X0VOQ09EQVRJT05dID4gMCkgew0KKyAgICAgICAgcmV0dXJuIEJBU0UyNTZfRU5DT0RBVElPTjsNCisgICAgICB9DQorICAgICAgaWYgKG1pbkNvdW50ID09IDEgJiYgbWluc1tFRElGQUNUX0VOQ09EQVRJT05dID4gMCkgew0KKyAgICAgICAgcmV0dXJuIEVESUZBQ1RfRU5DT0RBVElPTjsNCisgICAgICB9DQorICAgICAgaWYgKG1pbkNvdW50ID09IDEgJiYgbWluc1tURVhUX0VOQ09EQVRJT05dID4gMCkgew0KKyAgICAgICAgcmV0dXJuIFRFWFRfRU5DT0RBVElPTjsNCisgICAgICB9DQorICAgICAgaWYgKG1pbkNvdW50ID09IDEgJiYgbWluc1tYMTJfRU5DT0RBVElPTl0gPiAwKSB7DQorICAgICAgICByZXR1cm4gWDEyX0VOQ09EQVRJT047DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBDNDBfRU5DT0RBVElPTjsNCisgICAgfQ0KKyAgICBGWF9XQ0hBUiBjID0gbXNnLkdldEF0KHN0YXJ0cG9zICsgY2hhcnNQcm9jZXNzZWQpOw0KKyAgICBjaGFyc1Byb2Nlc3NlZCsrOw0KKyAgICBpZiAoaXNEaWdpdChjKSkgew0KKyAgICAgIGNoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gKz0gMC41Ow0KKyAgICB9IGVsc2UgaWYgKGlzRXh0ZW5kZWRBU0NJSShjKSkgew0KKyAgICAgIGNoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gPQ0KKyAgICAgICAgICAoRlhfRkxPQVQpY2VpbChjaGFyQ291bnRzW0FTQ0lJX0VOQ09EQVRJT05dKTsNCisgICAgICBjaGFyQ291bnRzW0FTQ0lJX0VOQ09EQVRJT05dICs9IDI7DQorICAgIH0gZWxzZSB7DQorICAgICAgY2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSA9DQorICAgICAgICAgIChGWF9GTE9BVCljZWlsKGNoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0pOw0KKyAgICAgIGNoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0rKzsNCisgICAgfQ0KKyAgICBpZiAoaXNOYXRpdmVDNDAoYykpIHsNCisgICAgICBjaGFyQ291bnRzW0M0MF9FTkNPREFUSU9OXSArPSAyLjBmIC8gMy4wZjsNCisgICAgfSBlbHNlIGlmIChpc0V4dGVuZGVkQVNDSUkoYykpIHsNCisgICAgICBjaGFyQ291bnRzW0M0MF9FTkNPREFUSU9OXSArPSA4LjBmIC8gMy4wZjsNCisgICAgfSBlbHNlIHsNCisgICAgICBjaGFyQ291bnRzW0M0MF9FTkNPREFUSU9OXSArPSA0LjBmIC8gMy4wZjsNCisgICAgfQ0KKyAgICBpZiAoaXNOYXRpdmVUZXh0KGMpKSB7DQorICAgICAgY2hhckNvdW50c1tURVhUX0VOQ09EQVRJT05dICs9IDIuMGYgLyAzLjBmOw0KKyAgICB9IGVsc2UgaWYgKGlzRXh0ZW5kZWRBU0NJSShjKSkgew0KKyAgICAgIGNoYXJDb3VudHNbVEVYVF9FTkNPREFUSU9OXSArPSA4LjBmIC8gMy4wZjsNCisgICAgfSBlbHNlIHsNCisgICAgICBjaGFyQ291bnRzW1RFWFRfRU5DT0RBVElPTl0gKz0gNC4wZiAvIDMuMGY7DQorICAgIH0NCisgICAgaWYgKGlzTmF0aXZlWDEyKGMpKSB7DQorICAgICAgY2hhckNvdW50c1tYMTJfRU5DT0RBVElPTl0gKz0gMi4wZiAvIDMuMGY7DQorICAgIH0gZWxzZSBpZiAoaXNFeHRlbmRlZEFTQ0lJKGMpKSB7DQorICAgICAgY2hhckNvdW50c1tYMTJfRU5DT0RBVElPTl0gKz0gMTMuMGYgLyAzLjBmOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGNoYXJDb3VudHNbWDEyX0VOQ09EQVRJT05dICs9IDEwLjBmIC8gMy4wZjsNCisgICAgfQ0KKyAgICBpZiAoaXNOYXRpdmVFRElGQUNUKGMpKSB7DQorICAgICAgY2hhckNvdW50c1tFRElGQUNUX0VOQ09EQVRJT05dICs9IDMuMGYgLyA0LjBmOw0KKyAgICB9IGVsc2UgaWYgKGlzRXh0ZW5kZWRBU0NJSShjKSkgew0KKyAgICAgIGNoYXJDb3VudHNbRURJRkFDVF9FTkNPREFUSU9OXSArPSAxNy4wZiAvIDQuMGY7DQorICAgIH0gZWxzZSB7DQorICAgICAgY2hhckNvdW50c1tFRElGQUNUX0VOQ09EQVRJT05dICs9IDEzLjBmIC8gNC4wZjsNCisgICAgfQ0KKyAgICBpZiAoaXNTcGVjaWFsQjI1NihjKSkgew0KKyAgICAgIGNoYXJDb3VudHNbQkFTRTI1Nl9FTkNPREFUSU9OXSArPSA0Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGNoYXJDb3VudHNbQkFTRTI1Nl9FTkNPREFUSU9OXSsrOw0KKyAgICB9DQorICAgIGlmIChjaGFyc1Byb2Nlc3NlZCA+PSA0KSB7DQorICAgICAgQ0ZYX0ludDMyQXJyYXkgaW50Q2hhckNvdW50czsNCisgICAgICBpbnRDaGFyQ291bnRzLlNldFNpemUoNik7DQorICAgICAgQ0ZYX0J5dGVBcnJheSBtaW5zOw0KKyAgICAgIG1pbnMuU2V0U2l6ZSg2KTsNCisgICAgICBmaW5kTWluaW11bXMoY2hhckNvdW50cywgaW50Q2hhckNvdW50cywgSW50ZWdlcl9NQVhfVkFMVUUsIG1pbnMpOw0KKyAgICAgIGludDMyX3QgbWluQ291bnQgPSBnZXRNaW5pbXVtQ291bnQobWlucyk7DQorICAgICAgaWYgKGludENoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gPCBpbnRDaGFyQ291bnRzW0JBU0UyNTZfRU5DT0RBVElPTl0gJiYNCisgICAgICAgICAgaW50Q2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSA8IGludENoYXJDb3VudHNbQzQwX0VOQ09EQVRJT05dICYmDQorICAgICAgICAgIGludENoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gPCBpbnRDaGFyQ291bnRzW1RFWFRfRU5DT0RBVElPTl0gJiYNCisgICAgICAgICAgaW50Q2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSA8IGludENoYXJDb3VudHNbWDEyX0VOQ09EQVRJT05dICYmDQorICAgICAgICAgIGludENoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gPCBpbnRDaGFyQ291bnRzW0VESUZBQ1RfRU5DT0RBVElPTl0pIHsNCisgICAgICAgIHJldHVybiBBU0NJSV9FTkNPREFUSU9OOw0KKyAgICAgIH0NCisgICAgICBpZiAoaW50Q2hhckNvdW50c1tCQVNFMjU2X0VOQ09EQVRJT05dIDwgaW50Q2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSB8fA0KKyAgICAgICAgICAobWluc1tDNDBfRU5DT0RBVElPTl0gKyBtaW5zW1RFWFRfRU5DT0RBVElPTl0gKyBtaW5zW1gxMl9FTkNPREFUSU9OXSArDQorICAgICAgICAgICBtaW5zW0VESUZBQ1RfRU5DT0RBVElPTl0pID09IDApIHsNCisgICAgICAgIHJldHVybiBCQVNFMjU2X0VOQ09EQVRJT047DQorICAgICAgfQ0KKyAgICAgIGlmIChtaW5Db3VudCA9PSAxICYmIG1pbnNbRURJRkFDVF9FTkNPREFUSU9OXSA+IDApIHsNCisgICAgICAgIHJldHVybiBFRElGQUNUX0VOQ09EQVRJT047DQorICAgICAgfQ0KKyAgICAgIGlmIChtaW5Db3VudCA9PSAxICYmIG1pbnNbVEVYVF9FTkNPREFUSU9OXSA+IDApIHsNCisgICAgICAgIHJldHVybiBURVhUX0VOQ09EQVRJT047DQorICAgICAgfQ0KKyAgICAgIGlmIChtaW5Db3VudCA9PSAxICYmIG1pbnNbWDEyX0VOQ09EQVRJT05dID4gMCkgew0KKyAgICAgICAgcmV0dXJuIFgxMl9FTkNPREFUSU9OOw0KKyAgICAgIH0NCisgICAgICBpZiAoaW50Q2hhckNvdW50c1tDNDBfRU5DT0RBVElPTl0gKyAxIDwgaW50Q2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSAmJg0KKyAgICAgICAgICBpbnRDaGFyQ291bnRzW0M0MF9FTkNPREFUSU9OXSArIDEgPA0KKyAgICAgICAgICAgICAgaW50Q2hhckNvdW50c1tCQVNFMjU2X0VOQ09EQVRJT05dICYmDQorICAgICAgICAgIGludENoYXJDb3VudHNbQzQwX0VOQ09EQVRJT05dICsgMSA8DQorICAgICAgICAgICAgICBpbnRDaGFyQ291bnRzW0VESUZBQ1RfRU5DT0RBVElPTl0gJiYNCisgICAgICAgICAgaW50Q2hhckNvdW50c1tDNDBfRU5DT0RBVElPTl0gKyAxIDwgaW50Q2hhckNvdW50c1tURVhUX0VOQ09EQVRJT05dKSB7DQorICAgICAgICBpZiAoaW50Q2hhckNvdW50c1tDNDBfRU5DT0RBVElPTl0gPCBpbnRDaGFyQ291bnRzW1gxMl9FTkNPREFUSU9OXSkgew0KKyAgICAgICAgICByZXR1cm4gQzQwX0VOQ09EQVRJT047DQorICAgICAgICB9DQorICAgICAgICBpZiAoaW50Q2hhckNvdW50c1tDNDBfRU5DT0RBVElPTl0gPT0gaW50Q2hhckNvdW50c1tYMTJfRU5DT0RBVElPTl0pIHsNCisgICAgICAgICAgaW50MzJfdCBwID0gc3RhcnRwb3MgKyBjaGFyc1Byb2Nlc3NlZCArIDE7DQorICAgICAgICAgIHdoaWxlIChwIDwgbXNnLkdldExlbmd0aCgpKSB7DQorICAgICAgICAgICAgRlhfV0NIQVIgdGMgPSBtc2cuR2V0QXQocCk7DQorICAgICAgICAgICAgaWYgKGlzWDEyVGVybVNlcCh0YykpIHsNCisgICAgICAgICAgICAgIHJldHVybiBYMTJfRU5DT0RBVElPTjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKCFpc05hdGl2ZVgxMih0YykpIHsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwKys7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcmV0dXJuIEM0MF9FTkNPREFUSU9OOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KK30NCitGWF9CT09MIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc0RpZ2l0KEZYX1dDSEFSIGNoKSB7DQorICByZXR1cm4gY2ggPj0gJzAnICYmIGNoIDw9ICc5JzsNCit9DQorRlhfQk9PTCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6aXNFeHRlbmRlZEFTQ0lJKEZYX1dDSEFSIGNoKSB7DQorICByZXR1cm4gY2ggPj0gMTI4ICYmIGNoIDw9IDI1NTsNCit9DQoraW50MzJfdCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6ZGV0ZXJtaW5lQ29uc2VjdXRpdmVEaWdpdENvdW50KENGWF9XaWRlU3RyaW5nIG1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydHBvcykgew0KKyAgaW50MzJfdCBjb3VudCA9IDA7DQorICBpbnQzMl90IGxlbiA9IG1zZy5HZXRMZW5ndGgoKTsNCisgIGludDMyX3QgaWR4ID0gc3RhcnRwb3M7DQorICBpZiAoaWR4IDwgbGVuKSB7DQorICAgIEZYX1dDSEFSIGNoID0gbXNnLkdldEF0KGlkeCk7DQorICAgIHdoaWxlIChpc0RpZ2l0KGNoKSAmJiBpZHggPCBsZW4pIHsNCisgICAgICBjb3VudCsrOw0KKyAgICAgIGlkeCsrOw0KKyAgICAgIGlmIChpZHggPCBsZW4pIHsNCisgICAgICAgIGNoID0gbXNnLkdldEF0KGlkeCk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gY291bnQ7DQorfQ0KK3ZvaWQgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmlsbGVnYWxDaGFyYWN0ZXIoRlhfV0NIQVIgYywgaW50MzJfdCYgZSkgew0KKyAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50Ow0KK30NCitGWF9XQ0hBUiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6cmFuZG9taXplMjUzU3RhdGUoRlhfV0NIQVIgY2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZXdvcmRQb3NpdGlvbikgew0KKyAgaW50MzJfdCBwc2V1ZG9SYW5kb20gPSAoKDE0OSAqIGNvZGV3b3JkUG9zaXRpb24pICUgMjUzKSArIDE7DQorICBpbnQzMl90IHRlbXBWYXJpYWJsZSA9IGNoICsgcHNldWRvUmFuZG9tOw0KKyAgcmV0dXJuIHRlbXBWYXJpYWJsZSA8PSAyNTQgPyAoRlhfV0NIQVIpdGVtcFZhcmlhYmxlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChGWF9XQ0hBUikodGVtcFZhcmlhYmxlIC0gMjU0KTsNCit9DQoraW50MzJfdCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6ZmluZE1pbmltdW1zKENGWF9GbG9hdEFycmF5JiBjaGFyQ291bnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSYgaW50Q2hhckNvdW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtaW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlQXJyYXkmIG1pbnMpIHsNCisgIGZvciAoaW50MzJfdCBsID0gMDsgbCA8IG1pbnMuR2V0U2l6ZSgpOyBsKyspIHsNCisgICAgbWluc1tsXSA9ICh1aW50OF90KTA7DQorICB9DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA2OyBpKyspIHsNCisgICAgaW50Q2hhckNvdW50c1tpXSA9IChpbnQzMl90KWNlaWwoY2hhckNvdW50c1tpXSk7DQorICAgIGludDMyX3QgY3VycmVudCA9IGludENoYXJDb3VudHNbaV07DQorICAgIGlmIChtaW4gPiBjdXJyZW50KSB7DQorICAgICAgbWluID0gY3VycmVudDsNCisgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBtaW5zLkdldFNpemUoKTsgaisrKSB7DQorICAgICAgICBtaW5zW2pdID0gKHVpbnQ4X3QpMDsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKG1pbiA9PSBjdXJyZW50KSB7DQorICAgICAgbWluc1tpXSsrOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gbWluOw0KK30NCitpbnQzMl90IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpnZXRNaW5pbXVtQ291bnQoQ0ZYX0J5dGVBcnJheSYgbWlucykgew0KKyAgaW50MzJfdCBtaW5Db3VudCA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA2OyBpKyspIHsNCisgICAgbWluQ291bnQgKz0gbWluc1tpXTsNCisgIH0NCisgIHJldHVybiBtaW5Db3VudDsNCit9DQorRlhfQk9PTCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6aXNOYXRpdmVDNDAoRlhfV0NIQVIgY2gpIHsNCisgIHJldHVybiAoY2ggPT0gJyAnKSB8fCAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgfHwgKGNoID49ICdBJyAmJiBjaCA8PSAnWicpOw0KK30NCitGWF9CT09MIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc05hdGl2ZVRleHQoRlhfV0NIQVIgY2gpIHsNCisgIHJldHVybiAoY2ggPT0gJyAnKSB8fCAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgfHwgKGNoID49ICdhJyAmJiBjaCA8PSAneicpOw0KK30NCitGWF9CT09MIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc05hdGl2ZVgxMihGWF9XQ0hBUiBjaCkgew0KKyAgcmV0dXJuIGlzWDEyVGVybVNlcChjaCkgfHwgKGNoID09ICcgJykgfHwgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHx8DQorICAgICAgICAgKGNoID49ICdBJyAmJiBjaCA8PSAnWicpOw0KK30NCitGWF9CT09MIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc1gxMlRlcm1TZXAoRlhfV0NIQVIgY2gpIHsNCisgIHJldHVybiAoY2ggPT0gJ1xyJykgfHwgKGNoID09ICcqJykgfHwgKGNoID09ICc+Jyk7DQorfQ0KK0ZYX0JPT0wgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmlzTmF0aXZlRURJRkFDVChGWF9XQ0hBUiBjaCkgew0KKyAgcmV0dXJuIGNoID49ICcgJyAmJiBjaCA8PSAnXic7DQorfQ0KK0ZYX0JPT0wgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmlzU3BlY2lhbEIyNTYoRlhfV0NIQVIgY2gpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19IaWdoTGV2ZWxFbmNvZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0hpZ2hMZXZlbEVuY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjJmYTJjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19IaWdoTGV2ZWxFbmNvZGVyLmgKQEAgLTAsMCArMSw3MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19ISUdITEVWQUxFTkNPREVSX0hfDQorI2RlZmluZSBfQkNfSElHSExFVkFMRU5DT0RFUl9IXw0KK2NsYXNzIENCQ19TeW1ib2xTaGFwZUhpbnQ7DQorY2xhc3MgQ0JDX0hpZ2hMZXZlbEVuY29kZXI7DQorI2RlZmluZSBBU0NJSV9FTkNPREFUSU9OIDANCisjZGVmaW5lIEM0MF9FTkNPREFUSU9OIDENCisjZGVmaW5lIFRFWFRfRU5DT0RBVElPTiAyDQorI2RlZmluZSBYMTJfRU5DT0RBVElPTiAzDQorI2RlZmluZSBFRElGQUNUX0VOQ09EQVRJT04gNA0KKyNkZWZpbmUgQkFTRTI1Nl9FTkNPREFUSU9OIDUNCitjbGFzcyBDQkNfSGlnaExldmVsRW5jb2RlciA6IHB1YmxpYyBDQkNfU3ltYm9sU2hhcGVIaW50IHsNCisgcHVibGljOg0KKyAgQ0JDX0hpZ2hMZXZlbEVuY29kZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19IaWdoTGV2ZWxFbmNvZGVyKCk7DQorICBDRlhfQnl0ZUFycmF5JiBnZXRCeXRlc0Zvck1lc3NhZ2UoQ0ZYX1dpZGVTdHJpbmcgbXNnKTsNCisgIHN0YXRpYyBDRlhfV2lkZVN0cmluZyBlbmNvZGVIaWdoTGV2ZWwoQ0ZYX1dpZGVTdHJpbmcgbXNnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBDRlhfV2lkZVN0cmluZyBlbmNvZGVIaWdoTGV2ZWwoQ0ZYX1dpZGVTdHJpbmcgbXNnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xTaGFwZUhpbnQgc2hhcGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19EaW1lbnNpb24qIG1pblNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19EaW1lbnNpb24qIG1heFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIGludDMyX3QgbG9va0FoZWFkVGVzdChDRlhfV2lkZVN0cmluZyBtc2csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRwb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY3VycmVudE1vZGUpOw0KKyAgc3RhdGljIEZYX0JPT0wgaXNEaWdpdChGWF9XQ0hBUiBjaCk7DQorICBzdGF0aWMgRlhfQk9PTCBpc0V4dGVuZGVkQVNDSUkoRlhfV0NIQVIgY2gpOw0KKyAgc3RhdGljIGludDMyX3QgZGV0ZXJtaW5lQ29uc2VjdXRpdmVEaWdpdENvdW50KENGWF9XaWRlU3RyaW5nIG1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0cG9zKTsNCisgIHN0YXRpYyB2b2lkIGlsbGVnYWxDaGFyYWN0ZXIoRlhfV0NIQVIgYywgaW50MzJfdCYgZSk7DQorDQorIHB1YmxpYzoNCisgIHN0YXRpYyBGWF9XQ0hBUiBMQVRDSF9UT19DNDA7DQorICBzdGF0aWMgRlhfV0NIQVIgTEFUQ0hfVE9fQkFTRTI1NjsNCisgIHN0YXRpYyBGWF9XQ0hBUiBVUFBFUl9TSElGVDsNCisgIHN0YXRpYyBGWF9XQ0hBUiBMQVRDSF9UT19BTlNJWDEyOw0KKyAgc3RhdGljIEZYX1dDSEFSIExBVENIX1RPX1RFWFQ7DQorICBzdGF0aWMgRlhfV0NIQVIgTEFUQ0hfVE9fRURJRkFDVDsNCisgIHN0YXRpYyBGWF9XQ0hBUiBDNDBfVU5MQVRDSDsNCisgIHN0YXRpYyBGWF9XQ0hBUiBYMTJfVU5MQVRDSDsNCisNCisgcHJpdmF0ZToNCisgIHN0YXRpYyBGWF9XQ0hBUiBQQUQ7DQorICBzdGF0aWMgRlhfV0NIQVIgTUFDUk9fMDU7DQorICBzdGF0aWMgRlhfV0NIQVIgTUFDUk9fMDY7DQorICBzdGF0aWMgY29uc3Qgd2NoYXJfdCogTUFDUk9fMDVfSEVBREVSOw0KKyAgc3RhdGljIGNvbnN0IHdjaGFyX3QqIE1BQ1JPXzA2X0hFQURFUjsNCisgIHN0YXRpYyBjb25zdCB3Y2hhcl90IE1BQ1JPX1RSQUlMRVI7DQorICBDRlhfQnl0ZUFycmF5IG1fYnl0ZWFycmF5Ow0KKw0KKyBwcml2YXRlOg0KKyAgc3RhdGljIEZYX1dDSEFSIHJhbmRvbWl6ZTI1M1N0YXRlKEZYX1dDSEFSIGNoLCBpbnQzMl90IGNvZGV3b3JkUG9zaXRpb24pOw0KKyAgc3RhdGljIGludDMyX3QgZmluZE1pbmltdW1zKENGWF9GbG9hdEFycmF5JiBjaGFyQ291bnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5JiBpbnRDaGFyQ291bnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWluLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlQXJyYXkmIG1pbnMpOw0KKyAgc3RhdGljIGludDMyX3QgZ2V0TWluaW11bUNvdW50KENGWF9CeXRlQXJyYXkmIG1pbnMpOw0KKyAgc3RhdGljIEZYX0JPT0wgaXNOYXRpdmVDNDAoRlhfV0NIQVIgY2gpOw0KKyAgc3RhdGljIEZYX0JPT0wgaXNOYXRpdmVUZXh0KEZYX1dDSEFSIGNoKTsNCisgIHN0YXRpYyBGWF9CT09MIGlzTmF0aXZlWDEyKEZYX1dDSEFSIGNoKTsNCisgIHN0YXRpYyBGWF9CT09MIGlzWDEyVGVybVNlcChGWF9XQ0hBUiBjaCk7DQorICBzdGF0aWMgRlhfQk9PTCBpc05hdGl2ZUVESUZBQ1QoRlhfV0NIQVIgY2gpOw0KKyAgc3RhdGljIEZYX0JPT0wgaXNTcGVjaWFsQjI1NihGWF9XQ0hBUiBjaCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbEluZm8uY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODVlYjdiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xJbmZvLmNwcApAQCAtMCwwICsxLDI1NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwNiBKZXJlbWlhcyBNYWVya2kNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfRGltZW5zaW9uLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAiQkNfRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJCQ19TeW1ib2xTaGFwZUhpbnQuaCINCisjaW5jbHVkZSAiQkNfU3ltYm9sSW5mby5oIg0KKyNpbmNsdWRlICJCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NC5oIg0KKyNkZWZpbmUgU1lNQk9MU19DT1VOVCAzMA0KK0NCQ19TeW1ib2xJbmZvKiBDQkNfU3ltYm9sSW5mbzo6bV9QUk9EX1NZTUJPTFNbMzBdID0gew0KKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLA0KKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLA0KKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfTsNCitDQkNfU3ltYm9sSW5mbyogQ0JDX1N5bWJvbEluZm86Om1fc3ltYm9sc1szMF0gPSB7DQorICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsDQorICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsDQorICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEx9Ow0KK3ZvaWQgQ0JDX1N5bWJvbEluZm86OkluaXRpYWxpemUoKSB7DQorICBtX1BST0RfU1lNQk9MU1swXSA9IG5ldyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgMywgNSwgOCwgOCwgMSk7DQorICBtX1BST0RfU1lNQk9MU1sxXSA9IG5ldyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgNSwgNywgMTAsIDEwLCAxKTsNCisgIG1fUFJPRF9TWU1CT0xTWzJdID0gbmV3IENCQ19TeW1ib2xJbmZvKFRSVUUsIDUsIDcsIDE2LCA2LCAxKTsNCisgIG1fUFJPRF9TWU1CT0xTWzNdID0gbmV3IENCQ19TeW1ib2xJbmZvKEZBTFNFLCA4LCAxMCwgMTIsIDEyLCAxKTsNCisgIG1fUFJPRF9TWU1CT0xTWzRdID0gbmV3IENCQ19TeW1ib2xJbmZvKFRSVUUsIDEwLCAxMSwgMTQsIDYsIDIpOw0KKyAgbV9QUk9EX1NZTUJPTFNbNV0gPSBuZXcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDEyLCAxMiwgMTQsIDE0LCAxKTsNCisgIG1fUFJPRF9TWU1CT0xTWzZdID0gbmV3IENCQ19TeW1ib2xJbmZvKFRSVUUsIDE2LCAxNCwgMjQsIDEwLCAxKTsNCisgIG1fUFJPRF9TWU1CT0xTWzddID0gbmV3IENCQ19TeW1ib2xJbmZvKEZBTFNFLCAxOCwgMTQsIDE2LCAxNiwgMSk7DQorICBtX1BST0RfU1lNQk9MU1s4XSA9IG5ldyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgMjIsIDE4LCAxOCwgMTgsIDEpOw0KKyAgbV9QUk9EX1NZTUJPTFNbOV0gPSBuZXcgQ0JDX1N5bWJvbEluZm8oVFJVRSwgMjIsIDE4LCAxNiwgMTAsIDIpOw0KKyAgbV9QUk9EX1NZTUJPTFNbMTBdID0gbmV3IENCQ19TeW1ib2xJbmZvKEZBTFNFLCAzMCwgMjAsIDIwLCAyMCwgMSk7DQorICBtX1BST0RfU1lNQk9MU1sxMV0gPSBuZXcgQ0JDX1N5bWJvbEluZm8oVFJVRSwgMzIsIDI0LCAxNiwgMTQsIDIpOw0KKyAgbV9QUk9EX1NZTUJPTFNbMTJdID0gbmV3IENCQ19TeW1ib2xJbmZvKEZBTFNFLCAzNiwgMjQsIDIyLCAyMiwgMSk7DQorICBtX1BST0RfU1lNQk9MU1sxM10gPSBuZXcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDQ0LCAyOCwgMjQsIDI0LCAxKTsNCisgIG1fUFJPRF9TWU1CT0xTWzE0XSA9IG5ldyBDQkNfU3ltYm9sSW5mbyhUUlVFLCA0OSwgMjgsIDIyLCAxNCwgMik7DQorICBtX1BST0RfU1lNQk9MU1sxNV0gPSBuZXcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDYyLCAzNiwgMTQsIDE0LCA0KTsNCisgIG1fUFJPRF9TWU1CT0xTWzE2XSA9IG5ldyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgODYsIDQyLCAxNiwgMTYsIDQpOw0KKyAgbV9QUk9EX1NZTUJPTFNbMTddID0gbmV3IENCQ19TeW1ib2xJbmZvKEZBTFNFLCAxMTQsIDQ4LCAxOCwgMTgsIDQpOw0KKyAgbV9QUk9EX1NZTUJPTFNbMThdID0gbmV3IENCQ19TeW1ib2xJbmZvKEZBTFNFLCAxNDQsIDU2LCAyMCwgMjAsIDQpOw0KKyAgbV9QUk9EX1NZTUJPTFNbMTldID0gbmV3IENCQ19TeW1ib2xJbmZvKEZBTFNFLCAxNzQsIDY4LCAyMiwgMjIsIDQpOw0KKyAgbV9QUk9EX1NZTUJPTFNbMjBdID0gbmV3IENCQ19TeW1ib2xJbmZvKEZBTFNFLCAyMDQsIDg0LCAyNCwgMjQsIDQsIDEwMiwgNDIpOw0KKyAgbV9QUk9EX1NZTUJPTFNbMjFdID0gbmV3IENCQ19TeW1ib2xJbmZvKEZBTFNFLCAyODAsIDExMiwgMTQsIDE0LCAxNiwgMTQwLCA1Nik7DQorICBtX1BST0RfU1lNQk9MU1syMl0gPSBuZXcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDM2OCwgMTQ0LCAxNiwgMTYsIDE2LCA5MiwgMzYpOw0KKyAgbV9QUk9EX1NZTUJPTFNbMjNdID0gbmV3IENCQ19TeW1ib2xJbmZvKEZBTFNFLCA0NTYsIDE5MiwgMTgsIDE4LCAxNiwgMTE0LCA0OCk7DQorICBtX1BST0RfU1lNQk9MU1syNF0gPSBuZXcgQ0JDX1N5bWJvbEluZm8oRkFMU0UsIDU3NiwgMjI0LCAyMCwgMjAsIDE2LCAxNDQsIDU2KTsNCisgIG1fUFJPRF9TWU1CT0xTWzI1XSA9IG5ldyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgNjk2LCAyNzIsIDIyLCAyMiwgMTYsIDE3NCwgNjgpOw0KKyAgbV9QUk9EX1NZTUJPTFNbMjZdID0gbmV3IENCQ19TeW1ib2xJbmZvKEZBTFNFLCA4MTYsIDMzNiwgMjQsIDI0LCAxNiwgMTM2LCA1Nik7DQorICBtX1BST0RfU1lNQk9MU1syN10gPQ0KKyAgICAgIG5ldyBDQkNfU3ltYm9sSW5mbyhGQUxTRSwgMTA1MCwgNDA4LCAxOCwgMTgsIDM2LCAxNzUsIDY4KTsNCisgIG1fUFJPRF9TWU1CT0xTWzI4XSA9DQorICAgICAgbmV3IENCQ19TeW1ib2xJbmZvKEZBTFNFLCAxMzA0LCA0OTYsIDIwLCAyMCwgMzYsIDE2MywgNjIpOw0KKyAgbV9QUk9EX1NZTUJPTFNbMjldID0gbmV3IENCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NCgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgU1lNQk9MU19DT1VOVDsgaSsrKSB7DQorICAgIG1fc3ltYm9sc1tpXSA9IG1fUFJPRF9TWU1CT0xTW2ldOw0KKyAgfQ0KK30NCit2b2lkIENCQ19TeW1ib2xJbmZvOjpGaW5hbGl6ZSgpIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IFNZTUJPTFNfQ09VTlQ7IGkrKykgew0KKyAgICBkZWxldGUgbV9QUk9EX1NZTUJPTFNbaV07DQorICAgIG1fUFJPRF9TWU1CT0xTW2ldID0gTlVMTDsNCisgICAgbV9zeW1ib2xzW2ldID0gTlVMTDsNCisgIH0NCit9DQorQ0JDX1N5bWJvbEluZm86OkNCQ19TeW1ib2xJbmZvKEZYX0JPT0wgcmVjdGFuZ3VsYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGF0YUNhcGFjaXR5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVycm9yQ29kZXdvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1hdHJpeFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1hdHJpeEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXRhUmVnaW9ucykgew0KKyAgbV9yZWN0YW5ndWxhciA9IHJlY3Rhbmd1bGFyOw0KKyAgbV9kYXRhQ2FwYWNpdHkgPSBkYXRhQ2FwYWNpdHk7DQorICBtX2Vycm9yQ29kZXdvcmRzID0gZXJyb3JDb2Rld29yZHM7DQorICBtX21hdHJpeFdpZHRoID0gbWF0cml4V2lkdGg7DQorICBtX21hdHJpeEhlaWdodCA9IG1hdHJpeEhlaWdodDsNCisgIG1fZGF0YVJlZ2lvbnMgPSBkYXRhUmVnaW9uczsNCisgIG1fcnNCbG9ja0RhdGEgPSBkYXRhQ2FwYWNpdHk7DQorICBtX3JzQmxvY2tFcnJvciA9IGVycm9yQ29kZXdvcmRzOw0KK30NCitDQkNfU3ltYm9sSW5mbzo6Q0JDX1N5bWJvbEluZm8oRlhfQk9PTCByZWN0YW5ndWxhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXRhQ2FwYWNpdHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXJyb3JDb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF0cml4V2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF0cml4SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRhdGFSZWdpb25zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJzQmxvY2tEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJzQmxvY2tFcnJvcikgew0KKyAgbV9yZWN0YW5ndWxhciA9IHJlY3Rhbmd1bGFyOw0KKyAgbV9kYXRhQ2FwYWNpdHkgPSBkYXRhQ2FwYWNpdHk7DQorICBtX2Vycm9yQ29kZXdvcmRzID0gZXJyb3JDb2Rld29yZHM7DQorICBtX21hdHJpeFdpZHRoID0gbWF0cml4V2lkdGg7DQorICBtX21hdHJpeEhlaWdodCA9IG1hdHJpeEhlaWdodDsNCisgIG1fZGF0YVJlZ2lvbnMgPSBkYXRhUmVnaW9uczsNCisgIG1fcnNCbG9ja0RhdGEgPSByc0Jsb2NrRGF0YTsNCisgIG1fcnNCbG9ja0Vycm9yID0gcnNCbG9ja0Vycm9yOw0KK30NCitDQkNfU3ltYm9sSW5mbzo6fkNCQ19TeW1ib2xJbmZvKCkge30NCisNCitDQkNfU3ltYm9sSW5mbyogQ0JDX1N5bWJvbEluZm86Omxvb2t1cChpbnQzMl90IGRhdGFDb2Rld29yZHMsIGludDMyX3QmIGUpIHsNCisgIHJldHVybiBsb29rdXAoZGF0YUNvZGV3b3JkcywgRk9SQ0VfTk9ORSwgVFJVRSwgZSk7DQorfQ0KK0NCQ19TeW1ib2xJbmZvKiBDQkNfU3ltYm9sSW5mbzo6bG9va3VwKGludDMyX3QgZGF0YUNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xTaGFwZUhpbnQgc2hhcGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgcmV0dXJuIGxvb2t1cChkYXRhQ29kZXdvcmRzLCBzaGFwZSwgVFJVRSwgZSk7DQorfQ0KK0NCQ19TeW1ib2xJbmZvKiBDQkNfU3ltYm9sSW5mbzo6bG9va3VwKGludDMyX3QgZGF0YUNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGFsbG93UmVjdGFuZ3VsYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBmYWlsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIFN5bWJvbFNoYXBlSGludCBzaGFwZSA9IGFsbG93UmVjdGFuZ3VsYXIgPyBGT1JDRV9OT05FIDogRk9SQ0VfU1FVQVJFOw0KKyAgcmV0dXJuIGxvb2t1cChkYXRhQ29kZXdvcmRzLCBzaGFwZSwgZmFpbCwgZSk7DQorfQ0KK0NCQ19TeW1ib2xJbmZvKiBDQkNfU3ltYm9sSW5mbzo6bG9va3VwKGludDMyX3QgZGF0YUNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xTaGFwZUhpbnQgc2hhcGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBmYWlsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIHJldHVybiBsb29rdXAoZGF0YUNvZGV3b3Jkcywgc2hhcGUsIE5VTEwsIE5VTEwsIGZhaWwsIGUpOw0KK30NCitDQkNfU3ltYm9sSW5mbyogQ0JDX1N5bWJvbEluZm86Omxvb2t1cChpbnQzMl90IGRhdGFDb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sU2hhcGVIaW50IHNoYXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19EaW1lbnNpb24qIG1pblNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0RpbWVuc2lvbiogbWF4U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGZhaWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgU1lNQk9MU19DT1VOVDsgaSsrKSB7DQorICAgIENCQ19TeW1ib2xJbmZvKiBzeW1ib2wgPSBtX3N5bWJvbHNbaV07DQorICAgIGlmIChzaGFwZSA9PSBGT1JDRV9TUVVBUkUgJiYgc3ltYm9sLT5tX3JlY3Rhbmd1bGFyKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKHNoYXBlID09IEZPUkNFX1JFQ1RBTkdMRSAmJiAhc3ltYm9sLT5tX3JlY3Rhbmd1bGFyKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKG1pblNpemUgIT0gTlVMTCAmJg0KKyAgICAgICAgKHN5bWJvbC0+Z2V0U3ltYm9sV2lkdGgoZSkgPCBtaW5TaXplLT5nZXRXaWR0aCgpIHx8DQorICAgICAgICAgc3ltYm9sLT5nZXRTeW1ib2xIZWlnaHQoZSkgPCBtaW5TaXplLT5nZXRIZWlnaHQoKSkpIHsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKG1heFNpemUgIT0gTlVMTCAmJg0KKyAgICAgICAgKHN5bWJvbC0+Z2V0U3ltYm9sV2lkdGgoZSkgPiBtYXhTaXplLT5nZXRXaWR0aCgpIHx8DQorICAgICAgICAgc3ltYm9sLT5nZXRTeW1ib2xIZWlnaHQoZSkgPiBtYXhTaXplLT5nZXRIZWlnaHQoKSkpIHsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKGRhdGFDb2Rld29yZHMgPD0gc3ltYm9sLT5tX2RhdGFDYXBhY2l0eSkgew0KKyAgICAgIHJldHVybiBzeW1ib2w7DQorICAgIH0NCisgIH0NCisgIGlmIChmYWlsKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxEYXRhQ29kZXdvcmRzOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitpbnQzMl90IENCQ19TeW1ib2xJbmZvOjpnZXRIb3Jpem9udGFsRGF0YVJlZ2lvbnMoaW50MzJfdCYgZSkgew0KKyAgc3dpdGNoIChtX2RhdGFSZWdpb25zKSB7DQorICAgIGNhc2UgMToNCisgICAgICByZXR1cm4gMTsNCisgICAgY2FzZSAyOg0KKyAgICAgIHJldHVybiAyOw0KKyAgICBjYXNlIDQ6DQorICAgICAgcmV0dXJuIDI7DQorICAgIGNhc2UgMTY6DQorICAgICAgcmV0dXJuIDQ7DQorICAgIGNhc2UgMzY6DQorICAgICAgcmV0dXJuIDY7DQorICAgIGRlZmF1bHQ6DQorICAgICAgZSA9IEJDRXhjZXB0aW9uQ2Fubm90SGFuZGxlVGhpc051bWJlck9mRGF0YVJlZ2lvbnM7DQorICAgICAgcmV0dXJuIDA7DQorICB9DQorfQ0KK2ludDMyX3QgQ0JDX1N5bWJvbEluZm86OmdldFZlcnRpY2FsRGF0YVJlZ2lvbnMoaW50MzJfdCYgZSkgew0KKyAgc3dpdGNoIChtX2RhdGFSZWdpb25zKSB7DQorICAgIGNhc2UgMToNCisgICAgICByZXR1cm4gMTsNCisgICAgY2FzZSAyOg0KKyAgICAgIHJldHVybiAxOw0KKyAgICBjYXNlIDQ6DQorICAgICAgcmV0dXJuIDI7DQorICAgIGNhc2UgMTY6DQorICAgICAgcmV0dXJuIDQ7DQorICAgIGNhc2UgMzY6DQorICAgICAgcmV0dXJuIDY7DQorICAgIGRlZmF1bHQ6DQorICAgICAgZSA9IEJDRXhjZXB0aW9uQ2Fubm90SGFuZGxlVGhpc051bWJlck9mRGF0YVJlZ2lvbnM7DQorICAgICAgcmV0dXJuIDA7DQorICB9DQorfQ0KK2ludDMyX3QgQ0JDX1N5bWJvbEluZm86OmdldFN5bWJvbERhdGFXaWR0aChpbnQzMl90JiBlKSB7DQorICByZXR1cm4gZ2V0SG9yaXpvbnRhbERhdGFSZWdpb25zKGUpICogbV9tYXRyaXhXaWR0aDsNCit9DQoraW50MzJfdCBDQkNfU3ltYm9sSW5mbzo6Z2V0U3ltYm9sRGF0YUhlaWdodChpbnQzMl90JiBlKSB7DQorICByZXR1cm4gZ2V0VmVydGljYWxEYXRhUmVnaW9ucyhlKSAqIG1fbWF0cml4SGVpZ2h0Ow0KK30NCitpbnQzMl90IENCQ19TeW1ib2xJbmZvOjpnZXRTeW1ib2xXaWR0aChpbnQzMl90JiBlKSB7DQorICByZXR1cm4gZ2V0U3ltYm9sRGF0YVdpZHRoKGUpICsgKGdldEhvcml6b250YWxEYXRhUmVnaW9ucyhlKSAqIDIpOw0KK30NCitpbnQzMl90IENCQ19TeW1ib2xJbmZvOjpnZXRTeW1ib2xIZWlnaHQoaW50MzJfdCYgZSkgew0KKyAgcmV0dXJuIGdldFN5bWJvbERhdGFIZWlnaHQoZSkgKyAoZ2V0VmVydGljYWxEYXRhUmVnaW9ucyhlKSAqIDIpOw0KK30NCitpbnQzMl90IENCQ19TeW1ib2xJbmZvOjpnZXRDb2Rld29yZENvdW50KCkgew0KKyAgcmV0dXJuIG1fZGF0YUNhcGFjaXR5ICsgbV9lcnJvckNvZGV3b3JkczsNCit9DQoraW50MzJfdCBDQkNfU3ltYm9sSW5mbzo6Z2V0SW50ZXJsZWF2ZWRCbG9ja0NvdW50KCkgew0KKyAgcmV0dXJuIG1fZGF0YUNhcGFjaXR5IC8gbV9yc0Jsb2NrRGF0YTsNCit9DQoraW50MzJfdCBDQkNfU3ltYm9sSW5mbzo6Z2V0RGF0YUxlbmd0aEZvckludGVybGVhdmVkQmxvY2soaW50MzJfdCBpbmRleCkgew0KKyAgcmV0dXJuIG1fcnNCbG9ja0RhdGE7DQorfQ0KK2ludDMyX3QgQ0JDX1N5bWJvbEluZm86OmdldEVycm9yTGVuZ3RoRm9ySW50ZXJsZWF2ZWRCbG9jayhpbnQzMl90IGluZGV4KSB7DQorICByZXR1cm4gbV9yc0Jsb2NrRXJyb3I7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19TeW1ib2xJbmZvOjp0b1N0cmluZyhpbnQzMl90JiBlKSB7DQorICBDRlhfV2lkZVN0cmluZyBzYjsNCisgIHNiICs9IChGWF9XQ0hBUiopKG1fcmVjdGFuZ3VsYXIgPyAiUmVjdGFuZ3VsYXIgU3ltYm9sOiIgOiAiU3F1YXJlIFN5bWJvbDoiKTsNCisgIHNiICs9IChGWF9XQ0hBUiopIiBkYXRhIHJlZ2lvbiAiOw0KKyAgc2IgKz0gbV9tYXRyaXhXaWR0aDsNCisgIHNiICs9IChGWF9XQ0hBUikneCc7DQorICBzYiArPSBtX21hdHJpeEhlaWdodDsNCisgIHNiICs9IChGWF9XQ0hBUiopIiwgc3ltYm9sIHNpemUgIjsNCisgIHNiICs9IGdldFN5bWJvbFdpZHRoKGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIChGWF9XQ0hBUiopIiIpOw0KKyAgc2IgKz0gKEZYX1dDSEFSKSd4JzsNCisgIHNiICs9IGdldFN5bWJvbEhlaWdodChlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAoRlhfV0NIQVIqKSIiKTsNCisgIHNiICs9IChGWF9XQ0hBUiopIiwgc3ltYm9sIGRhdGEgc2l6ZSAiOw0KKyAgc2IgKz0gZ2V0U3ltYm9sRGF0YVdpZHRoKGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIChGWF9XQ0hBUiopIiIpOw0KKyAgc2IgKz0gKEZYX1dDSEFSKSd4JzsNCisgIHNiICs9IGdldFN5bWJvbERhdGFIZWlnaHQoZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgKEZYX1dDSEFSKikiIik7DQorICBzYiArPSAoRlhfV0NIQVIqKSIsIGNvZGV3b3JkcyAiOw0KKyAgc2IgKz0gbV9kYXRhQ2FwYWNpdHk7DQorICBzYiArPSAoRlhfV0NIQVIpJysnOw0KKyAgc2IgKz0gbV9lcnJvckNvZGV3b3JkczsNCisgIHJldHVybiBzYjsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xJbmZvLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbEluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2I4MTBiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xJbmZvLmgKQEAgLTAsMCArMSw3OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19TWU1CT0xJTkZPX0hfDQorI2RlZmluZSBfQkNfU1lNQk9MSU5GT19IXw0KK2NsYXNzIENCQ19TeW1ib2xTaGFwZUhpbnQ7DQorY2xhc3MgQ0JDX0RpbWVuc2lvbjsNCitjbGFzcyBDQkNfU3ltYm9sSW5mbzsNCitjbGFzcyBDQkNfU3ltYm9sSW5mbyA6IHB1YmxpYyBDQkNfU3ltYm9sU2hhcGVIaW50IHsNCisgcHVibGljOg0KKyAgQ0JDX1N5bWJvbEluZm8oRlhfQk9PTCByZWN0YW5ndWxhciwNCisgICAgICAgICAgICAgICAgIGludDMyX3QgZGF0YUNhcGFjaXR5LA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCBlcnJvckNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgIGludDMyX3QgbWF0cml4V2lkdGgsDQorICAgICAgICAgICAgICAgICBpbnQzMl90IG1hdHJpeEhlaWdodCwNCisgICAgICAgICAgICAgICAgIGludDMyX3QgZGF0YVJlZ2lvbnMpOw0KKyAgdmlydHVhbCB+Q0JDX1N5bWJvbEluZm8oKTsNCisgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsNCisgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7DQorICBzdGF0aWMgdm9pZCBvdmVycmlkZVN5bWJvbFNldChDQkNfU3ltYm9sSW5mbyogb3ZlcnJpZGUpOw0KKyAgc3RhdGljIENCQ19TeW1ib2xJbmZvKiBsb29rdXAoaW50MzJfdCBkYXRhQ29kZXdvcmRzLCBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBDQkNfU3ltYm9sSW5mbyogbG9va3VwKGludDMyX3QgZGF0YUNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbFNoYXBlSGludCBzaGFwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIENCQ19TeW1ib2xJbmZvKiBsb29rdXAoaW50MzJfdCBkYXRhQ29kZXdvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBhbGxvd1JlY3Rhbmd1bGFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBmYWlsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgQ0JDX1N5bWJvbEluZm8qIGxvb2t1cChpbnQzMl90IGRhdGFDb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xTaGFwZUhpbnQgc2hhcGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGZhaWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBDQkNfU3ltYm9sSW5mbyogbG9va3VwKGludDMyX3QgZGF0YUNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbFNoYXBlSGludCBzaGFwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19EaW1lbnNpb24qIG1pblNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfRGltZW5zaW9uKiBtYXhTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBmYWlsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBpbnQzMl90IGdldEhvcml6b250YWxEYXRhUmVnaW9ucyhpbnQzMl90JiBlKTsNCisgIGludDMyX3QgZ2V0VmVydGljYWxEYXRhUmVnaW9ucyhpbnQzMl90JiBlKTsNCisgIGludDMyX3QgZ2V0U3ltYm9sRGF0YVdpZHRoKGludDMyX3QmIGUpOw0KKyAgaW50MzJfdCBnZXRTeW1ib2xEYXRhSGVpZ2h0KGludDMyX3QmIGUpOw0KKyAgaW50MzJfdCBnZXRTeW1ib2xXaWR0aChpbnQzMl90JiBlKTsNCisgIGludDMyX3QgZ2V0U3ltYm9sSGVpZ2h0KGludDMyX3QmIGUpOw0KKyAgaW50MzJfdCBnZXRDb2Rld29yZENvdW50KCk7DQorICBpbnQzMl90IGdldEludGVybGVhdmVkQmxvY2tDb3VudCgpOw0KKyAgaW50MzJfdCBnZXREYXRhTGVuZ3RoRm9ySW50ZXJsZWF2ZWRCbG9jayhpbnQzMl90IGluZGV4KTsNCisgIGludDMyX3QgZ2V0RXJyb3JMZW5ndGhGb3JJbnRlcmxlYXZlZEJsb2NrKGludDMyX3QgaW5kZXgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgdG9TdHJpbmcoaW50MzJfdCYgZSk7DQorDQorIHB1YmxpYzoNCisgIGludDMyX3QgbV9kYXRhQ2FwYWNpdHk7DQorICBpbnQzMl90IG1fZXJyb3JDb2Rld29yZHM7DQorICBpbnQzMl90IG1fbWF0cml4V2lkdGg7DQorICBpbnQzMl90IG1fbWF0cml4SGVpZ2h0Ow0KKyAgaW50MzJfdCBtX3JzQmxvY2tEYXRhOw0KKyAgaW50MzJfdCBtX3JzQmxvY2tFcnJvcjsNCisgIHN0YXRpYyBDQkNfU3ltYm9sSW5mbyogbV9QUk9EX1NZTUJPTFNbMzBdOw0KKw0KKyBwcml2YXRlOg0KKyAgc3RhdGljIENCQ19TeW1ib2xJbmZvKiBtX3N5bWJvbHNbMzBdOw0KKyAgRlhfQk9PTCBtX3JlY3Rhbmd1bGFyOw0KKyAgaW50MzJfdCBtX2RhdGFSZWdpb25zOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0JDX1N5bWJvbEluZm8oRlhfQk9PTCByZWN0YW5ndWxhciwNCisgICAgICAgICAgICAgICAgIGludDMyX3QgZGF0YUNhcGFjaXR5LA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCBlcnJvckNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgIGludDMyX3QgbWF0cml4V2lkdGgsDQorICAgICAgICAgICAgICAgICBpbnQzMl90IG1hdHJpeEhlaWdodCwNCisgICAgICAgICAgICAgICAgIGludDMyX3QgZGF0YVJlZ2lvbnMsDQorICAgICAgICAgICAgICAgICBpbnQzMl90IHJzQmxvY2tEYXRhLA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCByc0Jsb2NrRXJyb3IpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xTaGFwZUhpbnQuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xTaGFwZUhpbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYzNkMWQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbFNoYXBlSGludC5jcHAKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyBKZXJlbWlhcyBNYWVya2kuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgIkJDX1N5bWJvbFNoYXBlSGludC5oIg0KK0NCQ19TeW1ib2xTaGFwZUhpbnQ6OkNCQ19TeW1ib2xTaGFwZUhpbnQoKSB7fQ0KK0NCQ19TeW1ib2xTaGFwZUhpbnQ6On5DQkNfU3ltYm9sU2hhcGVIaW50KCkge30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbFNoYXBlSGludC5oIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xTaGFwZUhpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDZiNmMyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xTaGFwZUhpbnQuaApAQCAtMCwwICsxLDE5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1NZTUJPTFNIQVBFSElOVF9IXw0KKyNkZWZpbmUgX0JDX1NZTUJPTFNIQVBFSElOVF9IXw0KK2NsYXNzIENCQ19TeW1ib2xTaGFwZUhpbnQgew0KKyBwdWJsaWM6DQorICBDQkNfU3ltYm9sU2hhcGVIaW50KCk7DQorICB2aXJ0dWFsIH5DQkNfU3ltYm9sU2hhcGVIaW50KCk7DQorICBlbnVtIFN5bWJvbFNoYXBlSGludCB7DQorICAgIEZPUkNFX05PTkUsDQorICAgIEZPUkNFX1NRVUFSRSwNCisgICAgRk9SQ0VfUkVDVEFOR0xFLA0KKyAgfTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfVGV4dEVuY29kZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19UZXh0RW5jb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE2YjM4MQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfVGV4dEVuY29kZXIuY3BwCkBAIC0wLDAgKzEsOTggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDYtMjAwNyBKZXJlbWlhcyBNYWVya2kuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfRGltZW5zaW9uLmgiDQorI2luY2x1ZGUgIkJDX0VuY29kZXIuaCINCisjaW5jbHVkZSAiQkNfU3ltYm9sU2hhcGVIaW50LmgiDQorI2luY2x1ZGUgIkJDX1N5bWJvbEluZm8uaCINCisjaW5jbHVkZSAiQkNfRW5jb2RlckNvbnRleHQuaCINCisjaW5jbHVkZSAiQkNfSGlnaExldmVsRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJCQ19DNDBFbmNvZGVyLmgiDQorI2luY2x1ZGUgIkJDX1RleHRFbmNvZGVyLmgiDQorQ0JDX1RleHRFbmNvZGVyOjpDQkNfVGV4dEVuY29kZXIoKSB7fQ0KK0NCQ19UZXh0RW5jb2Rlcjo6fkNCQ19UZXh0RW5jb2RlcigpIHt9DQoraW50MzJfdCBDQkNfVGV4dEVuY29kZXI6OmdldEVuY29kaW5nTW9kZSgpIHsNCisgIHJldHVybiBURVhUX0VOQ09EQVRJT047DQorfQ0KK2ludDMyX3QgQ0JDX1RleHRFbmNvZGVyOjplbmNvZGVDaGFyKEZYX1dDSEFSIGMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChjID09ICcgJykgew0KKyAgICBzYiArPSAoRlhfV0NIQVIpJ1wzJzsNCisgICAgcmV0dXJuIDE7DQorICB9DQorICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsNCisgICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gNDggKyA0KTsNCisgICAgcmV0dXJuIDE7DQorICB9DQorICBpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpIHsNCisgICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gOTcgKyAxNCk7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgaWYgKGMgPj0gJ1wwJyAmJiBjIDw9IDB4MWYpIHsNCisgICAgc2IgKz0gKEZYX1dDSEFSKSdcMCc7DQorICAgIHNiICs9IGM7DQorICAgIHJldHVybiAyOw0KKyAgfQ0KKyAgaWYgKGMgPj0gJyEnICYmIGMgPD0gJy8nKSB7DQorICAgIHNiICs9IChGWF9XQ0hBUiknXDEnOw0KKyAgICBzYiArPSAoRlhfV0NIQVIpKGMgLSAzMyk7DQorICAgIHJldHVybiAyOw0KKyAgfQ0KKyAgaWYgKGMgPj0gJzonICYmIGMgPD0gJ0AnKSB7DQorICAgIHNiICs9IChGWF9XQ0hBUiknXDEnOw0KKyAgICBzYiArPSAoRlhfV0NIQVIpKGMgLSA1OCArIDE1KTsNCisgICAgcmV0dXJuIDI7DQorICB9DQorICBpZiAoYyA+PSAnWycgJiYgYyA8PSAnXycpIHsNCisgICAgc2IgKz0gKEZYX1dDSEFSKSdcMSc7DQorICAgIHNiICs9IChGWF9XQ0hBUikoYyAtIDkxICsgMjIpOw0KKyAgICByZXR1cm4gMjsNCisgIH0NCisgIGlmIChjID09IDB4MDA2MCkgew0KKyAgICBzYiArPSAoRlhfV0NIQVIpJ1wyJzsNCisgICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gOTYpOw0KKyAgICByZXR1cm4gMjsNCisgIH0NCisgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgew0KKyAgICBzYiArPSAoRlhfV0NIQVIpJ1wyJzsNCisgICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gNjUgKyAxKTsNCisgICAgcmV0dXJuIDI7DQorICB9DQorICBpZiAoYyA+PSAneycgJiYgYyA8PSAweDAwN2YpIHsNCisgICAgc2IgKz0gKEZYX1dDSEFSKSdcMic7DQorICAgIHNiICs9IChGWF9XQ0hBUikoYyAtIDEyMyArIDI3KTsNCisgICAgcmV0dXJuIDI7DQorICB9DQorICBpZiAoYyA+PSAweDAwODApIHsNCisgICAgc2IgKz0gKEZYX1dDSEFSKSdcMSc7DQorICAgIHNiICs9IChGWF9XQ0hBUikweDAwMWU7DQorICAgIGludDMyX3QgbGVuID0gMjsNCisgICAgbGVuICs9IGVuY29kZUNoYXIoKEZYX1dDSEFSKShjIC0gMTI4KSwgc2IsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgLTEpOw0KKyAgICByZXR1cm4gbGVuOw0KKyAgfQ0KKyAgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmlsbGVnYWxDaGFyYWN0ZXIoYywgZSk7DQorICByZXR1cm4gLTE7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfVGV4dEVuY29kZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfVGV4dEVuY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTNiMGRhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19UZXh0RW5jb2Rlci5oCkBAIC0wLDAgKzEsMTcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfVEVYVEVOQ09ERVJfSF8NCisjZGVmaW5lIF9CQ19URVhURU5DT0RFUl9IXw0KK2NsYXNzIENCQ19UZXh0RW5jb2RlcjsNCitjbGFzcyBDQkNfVGV4dEVuY29kZXIgOiBwdWJsaWMgQ0JDX0M0MEVuY29kZXIgew0KKyBwdWJsaWM6DQorICBDQkNfVGV4dEVuY29kZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19UZXh0RW5jb2RlcigpOw0KKyAgaW50MzJfdCBnZXRFbmNvZGluZ01vZGUoKTsNCisgIGludDMyX3QgZW5jb2RlQ2hhcihGWF9XQ0hBUiBjLCBDRlhfV2lkZVN0cmluZyYgc2IsIGludDMyX3QmIGUpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19YMTJFbmNvZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfWDEyRW5jb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkwYTMyNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfWDEyRW5jb2Rlci5jcHAKQEAgLTAsMCArMSwxMDAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDYtMjAwNyBKZXJlbWlhcyBNYWVya2kuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfRGltZW5zaW9uLmgiDQorI2luY2x1ZGUgIkJDX0VuY29kZXIuaCINCisjaW5jbHVkZSAiQkNfU3ltYm9sU2hhcGVIaW50LmgiDQorI2luY2x1ZGUgIkJDX1N5bWJvbEluZm8uaCINCisjaW5jbHVkZSAiQkNfRW5jb2RlckNvbnRleHQuaCINCisjaW5jbHVkZSAiQkNfSGlnaExldmVsRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJCQ19DNDBFbmNvZGVyLmgiDQorI2luY2x1ZGUgIkJDX1gxMkVuY29kZXIuaCINCitDQkNfWDEyRW5jb2Rlcjo6Q0JDX1gxMkVuY29kZXIoKSB7fQ0KK0NCQ19YMTJFbmNvZGVyOjp+Q0JDX1gxMkVuY29kZXIoKSB7fQ0KK2ludDMyX3QgQ0JDX1gxMkVuY29kZXI6OmdldEVuY29kaW5nTW9kZSgpIHsNCisgIHJldHVybiBYMTJfRU5DT0RBVElPTjsNCit9DQordm9pZCBDQkNfWDEyRW5jb2Rlcjo6RW5jb2RlKENCQ19FbmNvZGVyQ29udGV4dCYgY29udGV4dCwgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgYnVmZmVyOw0KKyAgd2hpbGUgKGNvbnRleHQuaGFzTW9yZUNoYXJhY3RlcnMoKSkgew0KKyAgICBGWF9XQ0hBUiBjID0gY29udGV4dC5nZXRDdXJyZW50Q2hhcigpOw0KKyAgICBjb250ZXh0Lm1fcG9zKys7DQorICAgIGVuY29kZUNoYXIoYywgYnVmZmVyLCBlKTsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpbnQzMl90IGNvdW50ID0gYnVmZmVyLkdldExlbmd0aCgpOw0KKyAgICBpZiAoKGNvdW50ICUgMykgPT0gMCkgew0KKyAgICAgIHdyaXRlTmV4dFRyaXBsZXQoY29udGV4dCwgYnVmZmVyKTsNCisgICAgICBpbnQzMl90IG5ld01vZGUgPSBDQkNfSGlnaExldmVsRW5jb2Rlcjo6bG9va0FoZWFkVGVzdCgNCisgICAgICAgICAgY29udGV4dC5tX21zZywgY29udGV4dC5tX3BvcywgZ2V0RW5jb2RpbmdNb2RlKCkpOw0KKyAgICAgIGlmIChuZXdNb2RlICE9IGdldEVuY29kaW5nTW9kZSgpKSB7DQorICAgICAgICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UobmV3TW9kZSk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGhhbmRsZUVPRChjb250ZXh0LCBidWZmZXIsIGUpOw0KK30NCit2b2lkIENCQ19YMTJFbmNvZGVyOjpoYW5kbGVFT0QoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgYnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBjb250ZXh0LnVwZGF0ZVN5bWJvbEluZm8oZSk7DQorICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgYXZhaWxhYmxlID0NCisgICAgICBjb250ZXh0Lm1fc3ltYm9sSW5mby0+bV9kYXRhQ2FwYWNpdHkgLSBjb250ZXh0LmdldENvZGV3b3JkQ291bnQoKTsNCisgIGludDMyX3QgY291bnQgPSBidWZmZXIuR2V0TGVuZ3RoKCk7DQorICBpZiAoY291bnQgPT0gMikgew0KKyAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OlgxMl9VTkxBVENIKTsNCisgICAgY29udGV4dC5tX3BvcyAtPSAyOw0KKyAgICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UoQVNDSUlfRU5DT0RBVElPTik7DQorICB9IGVsc2UgaWYgKGNvdW50ID09IDEpIHsNCisgICAgY29udGV4dC5tX3Bvcy0tOw0KKyAgICBpZiAoYXZhaWxhYmxlID4gMSkgew0KKyAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChDQkNfSGlnaExldmVsRW5jb2Rlcjo6WDEyX1VOTEFUQ0gpOw0KKyAgICB9DQorICAgIGNvbnRleHQuc2lnbmFsRW5jb2RlckNoYW5nZShBU0NJSV9FTkNPREFUSU9OKTsNCisgIH0NCit9DQoraW50MzJfdCBDQkNfWDEyRW5jb2Rlcjo6ZW5jb2RlQ2hhcihGWF9XQ0hBUiBjLCBDRlhfV2lkZVN0cmluZyYgc2IsIGludDMyX3QmIGUpIHsNCisgIGlmIChjID09ICdccicpIHsNCisgICAgc2IgKz0gKEZYX1dDSEFSKSdcMCc7DQorICB9IGVsc2UgaWYgKGMgPT0gJyonKSB7DQorICAgIHNiICs9IChGWF9XQ0hBUiknXDEnOw0KKyAgfSBlbHNlIGlmIChjID09ICc+Jykgew0KKyAgICBzYiArPSAoRlhfV0NIQVIpJ1wyJzsNCisgIH0gZWxzZSBpZiAoYyA9PSAnICcpIHsNCisgICAgc2IgKz0gKEZYX1dDSEFSKSdcMyc7DQorICB9IGVsc2UgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB7DQorICAgIHNiICs9IChGWF9XQ0hBUikoYyAtIDQ4ICsgNCk7DQorICB9IGVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB7DQorICAgIHNiICs9IChGWF9XQ0hBUikoYyAtIDY1ICsgMTQpOw0KKyAgfSBlbHNlIHsNCisgICAgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmlsbGVnYWxDaGFyYWN0ZXIoYywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAtMSk7DQorICB9DQorICByZXR1cm4gMTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19YMTJFbmNvZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1gxMkVuY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTNmZDkyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19YMTJFbmNvZGVyLmgKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19YMTJFTkNPREVSX0hfDQorI2RlZmluZSBfQkNfWDEyRU5DT0RFUl9IXw0KK2NsYXNzIENCQ19DNDBFbmNvZGVyOw0KK2NsYXNzIENCQ19YMTJFbmNvZGVyOw0KK2NsYXNzIENCQ19YMTJFbmNvZGVyIDogcHVibGljIENCQ19DNDBFbmNvZGVyIHsNCisgcHVibGljOg0KKyAgQ0JDX1gxMkVuY29kZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19YMTJFbmNvZGVyKCk7DQorICBpbnQzMl90IGdldEVuY29kaW5nTW9kZSgpOw0KKyAgdm9pZCBFbmNvZGUoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LCBpbnQzMl90JiBlKTsNCisgIHZvaWQgaGFuZGxlRU9EKENCQ19FbmNvZGVyQ29udGV4dCYgY29udGV4dCwNCisgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBidWZmZXIsDQorICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIGludDMyX3QgZW5jb2RlQ2hhcihGWF9XQ0hBUiBjLCBDRlhfV2lkZVN0cmluZyYgc2IsIGludDMyX3QmIGUpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVEUmVhZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lRFJlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg5Zjc2NAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lRFJlYWRlci5jcHAKQEAgLTAsMCArMSwxODcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDggWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSA8YWxnb3JpdGhtPg0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1JlYWRlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19CaW5hcnlCaXRtYXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdEFycmF5LmgiDQorI2luY2x1ZGUgIkJDX09uZURSZWFkZXIuaCINCitjb25zdCBpbnQzMl90IENCQ19PbmVEUmVhZGVyOjpJTlRFR0VSX01BVEhfU0hJRlQgPSA4Ow0KK2NvbnN0IGludDMyX3QgQ0JDX09uZURSZWFkZXI6OlBBVFRFUk5fTUFUQ0hfUkVTVUxUX1NDQUxFX0ZBQ1RPUiA9IDEgPDwgODsNCitDQkNfT25lRFJlYWRlcjo6Q0JDX09uZURSZWFkZXIoKSB7fQ0KK0NCQ19PbmVEUmVhZGVyOjp+Q0JDX09uZURSZWFkZXIoKSB7fQ0KK0NGWF9CeXRlU3RyaW5nIENCQ19PbmVEUmVhZGVyOjpEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCogaW1hZ2UsIGludDMyX3QmIGUpIHsNCisgIENGWF9CeXRlU3RyaW5nIHN0cnRlbXAgPSBEZWNvZGUoaW1hZ2UsIDAsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgIHJldHVybiBzdHJ0ZW1wOw0KK30NCitDRlhfQnl0ZVN0cmluZyBDQkNfT25lRFJlYWRlcjo6RGVjb2RlKENCQ19CaW5hcnlCaXRtYXAqIGltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9CeXRlU3RyaW5nIHN0cnRlbXAgPSBEZURlY29kZShpbWFnZSwgaGludHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgIHJldHVybiBzdHJ0ZW1wOw0KK30NCitDRlhfQnl0ZVN0cmluZyBDQkNfT25lRFJlYWRlcjo6RGVEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCogaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3QgaGVpZ2h0ID0gaW1hZ2UtPkdldEhlaWdodCgpOw0KKyAgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3cgPSBOVUxMOw0KKyAgaW50MzJfdCBtaWRkbGUgPSBoZWlnaHQgPj4gMTsNCisgIEZYX0JPT0wgdHJ5SGFyZGVyID0gRkFMU0U7DQorICBpbnQzMl90IHJvd1N0ZXAgPSBzdGQ6Om1heCgxLCBoZWlnaHQgPj4gKHRyeUhhcmRlciA/IDggOiA1KSk7DQorICBpbnQzMl90IG1heExpbmVzOw0KKyAgaWYgKHRyeUhhcmRlcikgew0KKyAgICBtYXhMaW5lcyA9IGhlaWdodDsNCisgIH0gZWxzZSB7DQorICAgIG1heExpbmVzID0gMTU7DQorICB9DQorICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBtYXhMaW5lczsgeCsrKSB7DQorICAgIGludDMyX3Qgcm93U3RlcHNBYm92ZU9yQmVsb3cgPSAoeCArIDEpID4+IDE7DQorICAgIEZYX0JPT0wgaXNBYm92ZSA9ICh4ICYgMHgwMSkgPT0gMDsNCisgICAgaW50MzJfdCByb3dOdW1iZXIgPQ0KKyAgICAgICAgbWlkZGxlICsNCisgICAgICAgIHJvd1N0ZXAgKiAoaXNBYm92ZSA/IHJvd1N0ZXBzQWJvdmVPckJlbG93IDogLXJvd1N0ZXBzQWJvdmVPckJlbG93KTsNCisgICAgaWYgKHJvd051bWJlciA8IDAgfHwgcm93TnVtYmVyID49IGhlaWdodCkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJvdyA9IGltYWdlLT5HZXRCbGFja1Jvdyhyb3dOdW1iZXIsIE5VTEwsIGUpOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uTk87DQorICAgICAgaWYgKHJvdyAhPSBOVUxMKSB7DQorICAgICAgICBkZWxldGUgcm93Ow0KKyAgICAgICAgcm93ID0gTlVMTDsNCisgICAgICB9DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgZm9yIChpbnQzMl90IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgMjsgYXR0ZW1wdCsrKSB7DQorICAgICAgaWYgKGF0dGVtcHQgPT0gMSkgew0KKyAgICAgICAgcm93LT5SZXZlcnNlKCk7DQorICAgICAgfQ0KKyAgICAgIENGWF9CeXRlU3RyaW5nIHJlc3VsdCA9IERlY29kZVJvdyhyb3dOdW1iZXIsIHJvdywgaGludHMsIGUpOw0KKyAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5POw0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmIChyb3cgIT0gTlVMTCkgew0KKyAgICAgICAgZGVsZXRlIHJvdzsNCisgICAgICAgIHJvdyA9IE5VTEw7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiByZXN1bHQ7DQorICAgIH0NCisgICAgaWYgKHJvdyAhPSBOVUxMKSB7DQorICAgICAgZGVsZXRlIHJvdzsNCisgICAgICByb3cgPSBOVUxMOw0KKyAgICB9DQorICB9DQorICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgIHJldHVybiAiIjsNCit9DQordm9pZCBDQkNfT25lRFJlYWRlcjo6UmVjb3JkUGF0dGVybihDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSogY291bnRlcnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IG51bUNvdW50ZXJzID0gY291bnRlcnMtPkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bUNvdW50ZXJzOyBpKyspIHsNCisgICAgKCpjb3VudGVycylbaV0gPSAwOw0KKyAgfQ0KKyAgaW50MzJfdCBlbmQgPSByb3ctPkdldFNpemUoKTsNCisgIGlmIChzdGFydCA+PSBlbmQpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0JPT0wgaXNXaGl0ZSA9ICFyb3ctPkdldChzdGFydCk7DQorICBpbnQzMl90IGNvdW50ZXJQb3NpdGlvbiA9IDA7DQorICBpbnQzMl90IGogPSBzdGFydDsNCisgIHdoaWxlIChqIDwgZW5kKSB7DQorICAgIEZYX0JPT0wgcGl4ZWwgPSByb3ctPkdldChqKTsNCisgICAgaWYgKHBpeGVsIF4gaXNXaGl0ZSkgew0KKyAgICAgICgqY291bnRlcnMpW2NvdW50ZXJQb3NpdGlvbl0rKzsNCisgICAgfSBlbHNlIHsNCisgICAgICBjb3VudGVyUG9zaXRpb24rKzsNCisgICAgICBpZiAoY291bnRlclBvc2l0aW9uID09IG51bUNvdW50ZXJzKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgKCpjb3VudGVycylbY291bnRlclBvc2l0aW9uXSA9IDE7DQorICAgICAgICBpc1doaXRlID0gIWlzV2hpdGU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGorKzsNCisgIH0NCisgIGlmICghKGNvdW50ZXJQb3NpdGlvbiA9PSBudW1Db3VudGVycyB8fA0KKyAgICAgICAgKGNvdW50ZXJQb3NpdGlvbiA9PSBudW1Db3VudGVycyAtIDEgJiYgaiA9PSBlbmQpKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgcmV0dXJuOw0KKyAgfQ0KK30NCit2b2lkIENCQ19PbmVEUmVhZGVyOjpSZWNvcmRQYXR0ZXJuSW5SZXZlcnNlKENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5KiBjb3VudGVycywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3QgbnVtVHJhbnNpdGlvbnNMZWZ0ID0gY291bnRlcnMtPkdldFNpemUoKTsNCisgIEZYX0JPT0wgbGFzdCA9IHJvdy0+R2V0KHN0YXJ0KTsNCisgIHdoaWxlIChzdGFydCA+IDAgJiYgbnVtVHJhbnNpdGlvbnNMZWZ0ID49IDApIHsNCisgICAgaWYgKHJvdy0+R2V0KC0tc3RhcnQpICE9IGxhc3QpIHsNCisgICAgICBudW1UcmFuc2l0aW9uc0xlZnQtLTsNCisgICAgICBsYXN0ID0gIWxhc3Q7DQorICAgIH0NCisgIH0NCisgIGlmIChudW1UcmFuc2l0aW9uc0xlZnQgPj0gMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgUmVjb3JkUGF0dGVybihyb3csIHN0YXJ0ICsgMSwgY291bnRlcnMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorfQ0KK2ludDMyX3QgQ0JDX09uZURSZWFkZXI6OlBhdHRlcm5NYXRjaFZhcmlhbmNlKENGWF9JbnQzMkFycmF5KiBjb3VudGVycywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90KiBwYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF4SW5kaXZpZHVhbFZhcmlhbmNlKSB7DQorICBpbnQzMl90IG51bUNvdW50ZXJzID0gY291bnRlcnMtPkdldFNpemUoKTsNCisgIGludDMyX3QgdG90YWwgPSAwOw0KKyAgaW50MzJfdCBwYXR0ZXJuTGVuZ3RoID0gMDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bUNvdW50ZXJzOyBpKyspIHsNCisgICAgdG90YWwgKz0gKCpjb3VudGVycylbaV07DQorICAgIHBhdHRlcm5MZW5ndGggKz0gcGF0dGVybltpXTsNCisgIH0NCisgIGlmICh0b3RhbCA8IHBhdHRlcm5MZW5ndGgpIHsNCisjdW5kZWYgbWF4DQorICAgIHJldHVybiBGWFNZU19JbnRNYXg7DQorICB9DQorICBpbnQzMl90IHVuaXRCYXJXaWR0aCA9ICh0b3RhbCA8PCBJTlRFR0VSX01BVEhfU0hJRlQpIC8gcGF0dGVybkxlbmd0aDsNCisgIG1heEluZGl2aWR1YWxWYXJpYW5jZSA9DQorICAgICAgKG1heEluZGl2aWR1YWxWYXJpYW5jZSAqIHVuaXRCYXJXaWR0aCkgPj4gSU5URUdFUl9NQVRIX1NISUZUOw0KKyAgaW50MzJfdCB0b3RhbFZhcmlhbmNlID0gMDsNCisgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IG51bUNvdW50ZXJzOyB4KyspIHsNCisgICAgaW50MzJfdCBjb3VudGVyID0gKCpjb3VudGVycylbeF0gPDwgSU5URUdFUl9NQVRIX1NISUZUOw0KKyAgICBpbnQzMl90IHNjYWxlZFBhdHRlcm4gPSBwYXR0ZXJuW3hdICogdW5pdEJhcldpZHRoOw0KKyAgICBpbnQzMl90IHZhcmlhbmNlID0gY291bnRlciA+IHNjYWxlZFBhdHRlcm4gPyBjb3VudGVyIC0gc2NhbGVkUGF0dGVybg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzY2FsZWRQYXR0ZXJuIC0gY291bnRlcjsNCisgICAgaWYgKHZhcmlhbmNlID4gbWF4SW5kaXZpZHVhbFZhcmlhbmNlKSB7DQorI3VuZGVmIG1heA0KKyAgICAgIHJldHVybiBGWFNZU19JbnRNYXg7DQorICAgIH0NCisgICAgdG90YWxWYXJpYW5jZSArPSB2YXJpYW5jZTsNCisgIH0NCisgIHJldHVybiB0b3RhbFZhcmlhbmNlIC8gdG90YWw7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lRFJlYWRlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVEUmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNmZWExZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lRFJlYWRlci5oCkBAIC0wLDAgKzEsNDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfT05FRFJFQURFUl9IXw0KKyNkZWZpbmUgX0JDX09ORURSRUFERVJfSF8NCitjbGFzcyBDQkNfUmVhZGVyOw0KK2NsYXNzIENCQ19CaW5hcnlCaXRtYXA7DQorY2xhc3MgQ0JDX0NvbW1vbkJpdEFycmF5Ow0KK2NsYXNzIENCQ19PbmVEUmVhZGVyOw0KK2NsYXNzIENCQ19PbmVEUmVhZGVyIDogcHVibGljIENCQ19SZWFkZXIgew0KKyBwdWJsaWM6DQorICBDQkNfT25lRFJlYWRlcigpOw0KKyAgdmlydHVhbCB+Q0JDX09uZURSZWFkZXIoKTsNCisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlKENCQ19CaW5hcnlCaXRtYXAqIGltYWdlLCBpbnQzMl90JiBlKTsNCisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlKENCQ19CaW5hcnlCaXRtYXAqIGltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZyBEZWNvZGVSb3coaW50MzJfdCByb3dOdW1iZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICAgIHJldHVybiAiIjsNCisgIH0NCisNCisgcHJpdmF0ZToNCisgIENGWF9CeXRlU3RyaW5nIERlRGVjb2RlKENCQ19CaW5hcnlCaXRtYXAqIGltYWdlLCBpbnQzMl90IGhpbnRzLCBpbnQzMl90JiBlKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgSU5URUdFUl9NQVRIX1NISUZUOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgUEFUVEVSTl9NQVRDSF9SRVNVTFRfU0NBTEVfRkFDVE9SOw0KKyAgdm9pZCBSZWNvcmRQYXR0ZXJuKENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIGNvdW50ZXJzLA0KKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdm9pZCBSZWNvcmRQYXR0ZXJuSW5SZXZlcnNlKENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIGNvdW50ZXJzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgaW50MzJfdCBQYXR0ZXJuTWF0Y2hWYXJpYW5jZShDRlhfSW50MzJBcnJheSogY291bnRlcnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QqIHBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF4SW5kaXZpZHVhbFZhcmlhbmNlKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lRGltUmVhZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lRGltUmVhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmVmNjc0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVEaW1SZWFkZXIuY3BwCkBAIC0wLDAgKzEsMjIwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDA4IFpYaW5nIGF1dGhvcnMNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfUmVhZGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRBcnJheS5oIg0KKyNpbmNsdWRlICJCQ19PbmVEUmVhZGVyLmgiDQorI2luY2x1ZGUgIkJDX09uZURpbVJlYWRlci5oIg0KK2NvbnN0IGludDMyX3QgQ0JDX09uZURpbVJlYWRlcjo6TUFYX0FWR19WQVJJQU5DRSA9IChpbnQzMl90KSgyNTYgKiAwLjQ4Zik7DQorY29uc3QgaW50MzJfdCBDQkNfT25lRGltUmVhZGVyOjpNQVhfSU5ESVZJRFVBTF9WQVJJQU5DRSA9IChpbnQzMl90KSgyNTYgKiAwLjdmKTsNCitjb25zdCBpbnQzMl90IENCQ19PbmVEaW1SZWFkZXI6OlNUQVJUX0VORF9QQVRURVJOWzNdID0gezEsIDEsIDF9Ow0KK2NvbnN0IGludDMyX3QgQ0JDX09uZURpbVJlYWRlcjo6TUlERExFX1BBVFRFUk5bNV0gPSB7MSwgMSwgMSwgMSwgMX07DQorY29uc3QgaW50MzJfdCBDQkNfT25lRGltUmVhZGVyOjpMX1BBVFRFUk5TWzEwXVs0XSA9IHsNCisgICAgezMsIDIsIDEsIDF9LCB7MiwgMiwgMiwgMX0sIHsyLCAxLCAyLCAyfSwgezEsIDQsIDEsIDF9LCB7MSwgMSwgMywgMn0sDQorICAgIHsxLCAyLCAzLCAxfSwgezEsIDEsIDEsIDR9LCB7MSwgMywgMSwgMn0sIHsxLCAyLCAxLCAzfSwgezMsIDEsIDEsIDJ9fTsNCitjb25zdCBpbnQzMl90IENCQ19PbmVEaW1SZWFkZXI6OkxfQU5EX0dfUEFUVEVSTlNbMjBdWzRdID0gew0KKyAgICB7MywgMiwgMSwgMX0sIHsyLCAyLCAyLCAxfSwgezIsIDEsIDIsIDJ9LCB7MSwgNCwgMSwgMX0sIHsxLCAxLCAzLCAyfSwNCisgICAgezEsIDIsIDMsIDF9LCB7MSwgMSwgMSwgNH0sIHsxLCAzLCAxLCAyfSwgezEsIDIsIDEsIDN9LCB7MywgMSwgMSwgMn0sDQorICAgIHsxLCAxLCAyLCAzfSwgezEsIDIsIDIsIDJ9LCB7MiwgMiwgMSwgMn0sIHsxLCAxLCA0LCAxfSwgezIsIDMsIDEsIDF9LA0KKyAgICB7MSwgMywgMiwgMX0sIHs0LCAxLCAxLCAxfSwgezIsIDEsIDMsIDF9LCB7MywgMSwgMiwgMX0sIHsyLCAxLCAxLCAzfX07DQorQ0JDX09uZURpbVJlYWRlcjo6Q0JDX09uZURpbVJlYWRlcigpIHt9DQorQ0JDX09uZURpbVJlYWRlcjo6fkNCQ19PbmVEaW1SZWFkZXIoKSB7fQ0KK0NGWF9JbnQzMkFycmF5KiBDQkNfT25lRGltUmVhZGVyOjpGaW5kU3RhcnRHdWFyZFBhdHRlcm4oQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBGWF9CT09MIGZvdW5kU3RhcnQgPSBGQUxTRTsNCisgIENGWF9JbnQzMkFycmF5KiBzdGFydFJhbmdlID0gTlVMTDsNCisgIENGWF9JbnQzMkFycmF5IHN0YXJ0RW5kUGF0dGVybjsNCisgIHN0YXJ0RW5kUGF0dGVybi5TZXRTaXplKDMpOw0KKyAgc3RhcnRFbmRQYXR0ZXJuWzBdID0gU1RBUlRfRU5EX1BBVFRFUk5bMF07DQorICBzdGFydEVuZFBhdHRlcm5bMV0gPSBTVEFSVF9FTkRfUEFUVEVSTlsxXTsNCisgIHN0YXJ0RW5kUGF0dGVyblsyXSA9IFNUQVJUX0VORF9QQVRURVJOWzJdOw0KKyAgaW50MzJfdCBuZXh0U3RhcnQgPSAwOw0KKyAgd2hpbGUgKCFmb3VuZFN0YXJ0KSB7DQorICAgIGlmIChzdGFydFJhbmdlICE9IE5VTEwpIHsNCisgICAgICBkZWxldGUgc3RhcnRSYW5nZTsNCisgICAgICBzdGFydFJhbmdlID0gTlVMTDsNCisgICAgfQ0KKyAgICBzdGFydFJhbmdlID0gRmluZEd1YXJkUGF0dGVybihyb3csIG5leHRTdGFydCwgRkFMU0UsICZzdGFydEVuZFBhdHRlcm4sIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIGludDMyX3Qgc3RhcnQgPSAoKnN0YXJ0UmFuZ2UpWzBdOw0KKyAgICBuZXh0U3RhcnQgPSAoKnN0YXJ0UmFuZ2UpWzFdOw0KKyAgICBpZiAoc3RhcnQgPD0gMSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGludDMyX3QgcXVpZXRTdGFydCA9IHN0YXJ0IC0gKG5leHRTdGFydCAtIHN0YXJ0KTsNCisgICAgaWYgKHF1aWV0U3RhcnQgPj0gMCkgew0KKyAgICAgIEZYX0JPT0wgYm9vVCA9IHJvdy0+SXNSYW5nZShxdWlldFN0YXJ0LCBzdGFydCwgRkFMU0UsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICBmb3VuZFN0YXJ0ID0gYm9vVDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHN0YXJ0UmFuZ2U7DQorfQ0KK0NGWF9CeXRlU3RyaW5nIENCQ19PbmVEaW1SZWFkZXI6OkRlY29kZVJvdyhpbnQzMl90IHJvd051bWJlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9JbnQzMkFycmF5KiBTdGFydFBhdHRlcm4gPSBGaW5kU3RhcnRHdWFyZFBhdHRlcm4ocm93LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICBDQkNfQXV0b1B0cjxDRlhfSW50MzJBcnJheT4gcmVzdWx0KFN0YXJ0UGF0dGVybik7DQorICBDRlhfQnl0ZVN0cmluZyB0ZW1wID0gRGVjb2RlUm93KHJvd051bWJlciwgcm93LCByZXN1bHQuZ2V0KCksIGhpbnRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICByZXR1cm4gdGVtcDsNCit9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX09uZURpbVJlYWRlcjo6RGVjb2RlUm93KGludDMyX3Qgcm93TnVtYmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIHN0YXJ0R3VhcmRSYW5nZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0Ow0KKyAgRGVjb2RlTWlkZGxlKHJvdywgc3RhcnRHdWFyZFJhbmdlLCByZXN1bHQsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgIEZYX0JPT0wgYiA9IENoZWNrQ2hlY2tzdW0ocmVzdWx0LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICBpZiAoIWIpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uQ2hlY2tzdW1FeGNlcHRpb247DQorICAgIHJldHVybiAiIjsNCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQorfQ0KK0ZYX0JPT0wgQ0JDX09uZURpbVJlYWRlcjo6Q2hlY2tDaGVja3N1bShDRlhfQnl0ZVN0cmluZyYgcywgaW50MzJfdCYgZSkgew0KKyAgRlhfQk9PTCB0ZW1wID0gQ2hlY2tTdGFuZGFyZFVQQ0VBTkNoZWNrc3VtKHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgIHJldHVybiB0ZW1wOw0KK30NCitGWF9CT09MIENCQ19PbmVEaW1SZWFkZXI6OkNoZWNrU3RhbmRhcmRVUENFQU5DaGVja3N1bShDRlhfQnl0ZVN0cmluZyYgcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IGxlbmd0aCA9IHMuR2V0TGVuZ3RoKCk7DQorICBpZiAobGVuZ3RoID09IDApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaW50MzJfdCBzdW0gPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSBsZW5ndGggLSAyOyBpID49IDA7IGkgLT0gMikgew0KKyAgICBpbnQzMl90IGRpZ2l0ID0gKGludDMyX3Qpc1tpXSAtIChpbnQzMl90KScwJzsNCisgICAgaWYgKGRpZ2l0IDwgMCB8fCBkaWdpdCA+IDkpIHsNCisgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHN1bSArPSBkaWdpdDsNCisgIH0NCisgIHN1bSAqPSAzOw0KKyAgZm9yIChpbnQzMl90IGogPSBsZW5ndGggLSAxOyBqID49IDA7IGogLT0gMikgew0KKyAgICBpbnQzMl90IGRpZ2l0ID0gKGludDMyX3Qpc1tqXSAtIChpbnQzMl90KScwJzsNCisgICAgaWYgKGRpZ2l0IDwgMCB8fCBkaWdpdCA+IDkpIHsNCisgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHN1bSArPSBkaWdpdDsNCisgIH0NCisgIHJldHVybiBzdW0gJSAxMCA9PSAwOw0KK30NCitDRlhfSW50MzJBcnJheSogQ0JDX09uZURpbVJlYWRlcjo6RGVjb2RlRW5kKENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlbmRTdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9JbnQzMkFycmF5IHN0YXJ0RW5kUGF0dGVybjsNCisgIHN0YXJ0RW5kUGF0dGVybi5BZGQoU1RBUlRfRU5EX1BBVFRFUk5bMF0pOw0KKyAgc3RhcnRFbmRQYXR0ZXJuLkFkZChTVEFSVF9FTkRfUEFUVEVSTlsxXSk7DQorICBzdGFydEVuZFBhdHRlcm4uQWRkKFNUQVJUX0VORF9QQVRURVJOWzJdKTsNCisgIENGWF9JbnQzMkFycmF5KiBGaW5kR3VhcmQgPQ0KKyAgICAgIEZpbmRHdWFyZFBhdHRlcm4ocm93LCBlbmRTdGFydCwgRkFMU0UsICZzdGFydEVuZFBhdHRlcm4sIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIEZpbmRHdWFyZDsNCit9DQorQ0ZYX0ludDMyQXJyYXkqIENCQ19PbmVEaW1SZWFkZXI6OkZpbmRHdWFyZFBhdHRlcm4oQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByb3dPZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCB3aGl0ZUZpcnN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5KiBwYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3QgcGF0dGVybkxlbmd0aCA9IHBhdHRlcm4tPkdldFNpemUoKTsNCisgIENGWF9JbnQzMkFycmF5IGNvdW50ZXJzOw0KKyAgY291bnRlcnMuU2V0U2l6ZShwYXR0ZXJuTGVuZ3RoKTsNCisgIGludDMyX3Qgd2lkdGggPSByb3ctPkdldFNpemUoKTsNCisgIEZYX0JPT0wgaXNXaGl0ZSA9IEZBTFNFOw0KKyAgd2hpbGUgKHJvd09mZnNldCA8IHdpZHRoKSB7DQorICAgIGlzV2hpdGUgPSAhcm93LT5HZXQocm93T2Zmc2V0KTsNCisgICAgaWYgKHdoaXRlRmlyc3QgPT0gaXNXaGl0ZSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJvd09mZnNldCsrOw0KKyAgfQ0KKyAgaW50MzJfdCBjb3VudGVyUG9zaXRpb24gPSAwOw0KKyAgaW50MzJfdCBwYXR0ZXJuU3RhcnQgPSByb3dPZmZzZXQ7DQorICBmb3IgKGludDMyX3QgeCA9IHJvd09mZnNldDsgeCA8IHdpZHRoOyB4KyspIHsNCisgICAgRlhfQk9PTCBwaXhlbCA9IHJvdy0+R2V0KHgpOw0KKyAgICBpZiAocGl4ZWwgXiBpc1doaXRlKSB7DQorICAgICAgY291bnRlcnNbY291bnRlclBvc2l0aW9uXSsrOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChjb3VudGVyUG9zaXRpb24gPT0gcGF0dGVybkxlbmd0aCAtIDEpIHsNCisgICAgICAgIGlmIChQYXR0ZXJuTWF0Y2hWYXJpYW5jZSgmY291bnRlcnMsICYoKnBhdHRlcm4pWzBdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9JTkRJVklEVUFMX1ZBUklBTkNFKSA8IE1BWF9BVkdfVkFSSUFOQ0UpIHsNCisgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIHJlc3VsdCA9IG5ldyBDRlhfSW50MzJBcnJheSgpOw0KKyAgICAgICAgICByZXN1bHQtPlNldFNpemUoMik7DQorICAgICAgICAgICgqcmVzdWx0KVswXSA9IHBhdHRlcm5TdGFydDsNCisgICAgICAgICAgKCpyZXN1bHQpWzFdID0geDsNCisgICAgICAgICAgcmV0dXJuIHJlc3VsdDsNCisgICAgICAgIH0NCisgICAgICAgIHBhdHRlcm5TdGFydCArPSBjb3VudGVyc1swXSArIGNvdW50ZXJzWzFdOw0KKyAgICAgICAgZm9yIChpbnQzMl90IHkgPSAyOyB5IDwgcGF0dGVybkxlbmd0aDsgeSsrKSB7DQorICAgICAgICAgIGNvdW50ZXJzW3kgLSAyXSA9IGNvdW50ZXJzW3ldOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY291bnRlcnNbcGF0dGVybkxlbmd0aCAtIDJdID0gMDsNCisgICAgICAgIGNvdW50ZXJzW3BhdHRlcm5MZW5ndGggLSAxXSA9IDA7DQorICAgICAgICBjb3VudGVyUG9zaXRpb24tLTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgY291bnRlclBvc2l0aW9uKys7DQorICAgICAgfQ0KKyAgICAgIGNvdW50ZXJzW2NvdW50ZXJQb3NpdGlvbl0gPSAxOw0KKyAgICAgIGlzV2hpdGUgPSAhaXNXaGl0ZTsNCisgICAgfQ0KKyAgfQ0KKyAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gTlVMTDsNCit9DQoraW50MzJfdCBDQkNfT25lRGltUmVhZGVyOjpEZWNvZGVEaWdpdChDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5KiBjb3VudGVycywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm93T2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCogcGF0dGVybnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBhdHRlcm5MZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBSZWNvcmRQYXR0ZXJuKHJvdywgcm93T2Zmc2V0LCBjb3VudGVycywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICBpbnQzMl90IGJlc3RWYXJpYW5jZSA9IE1BWF9BVkdfVkFSSUFOQ0U7DQorICBpbnQzMl90IGJlc3RNYXRjaCA9IC0xOw0KKyAgaW50MzJfdCBtYXggPSBwYXR0ZXJuTGVuZ3RoOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsNCisgICAgaW50MzJfdCB2YXJpYW5jZSA9IFBhdHRlcm5NYXRjaFZhcmlhbmNlKGNvdW50ZXJzLCAmcGF0dGVybnNbaSAqIDRdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0lORElWSURVQUxfVkFSSUFOQ0UpOw0KKyAgICBpZiAodmFyaWFuY2UgPCBiZXN0VmFyaWFuY2UpIHsNCisgICAgICBiZXN0VmFyaWFuY2UgPSB2YXJpYW5jZTsNCisgICAgICBiZXN0TWF0Y2ggPSBpOw0KKyAgICB9DQorICB9DQorICBpZiAoYmVzdE1hdGNoID49IDApIHsNCisgICAgcmV0dXJuIGJlc3RNYXRjaDsNCisgIH0gZWxzZSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVJlYWRlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVEaW1SZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTZkZThkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVEaW1SZWFkZXIuaApAQCAtMCwwICsxLDYwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX09ORURVUENFQU5SRUFERVJfSF8NCisjZGVmaW5lIF9CQ19PTkVEVVBDRUFOUkVBREVSX0hfDQorY2xhc3MgQ0JDX09uZURSZWFkZXI7DQorY2xhc3MgQ0JDX0NvbW1vbkJpdEFycmF5Ow0KK2NsYXNzIENCQ19PbmVEaW1SZWFkZXI7DQorY2xhc3MgQ0JDX09uZURpbVJlYWRlciA6IHB1YmxpYyBDQkNfT25lRFJlYWRlciB7DQorIHByaXZhdGU6DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBNQVhfQVZHX1ZBUklBTkNFOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgTUFYX0lORElWSURVQUxfVkFSSUFOQ0U7DQorDQorICBGWF9CT09MIENoZWNrU3RhbmRhcmRVUENFQU5DaGVja3N1bShDRlhfQnl0ZVN0cmluZyYgcywgaW50MzJfdCYgZSk7DQorDQorIHB1YmxpYzoNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IFNUQVJUX0VORF9QQVRURVJOWzNdOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgTUlERExFX1BBVFRFUk5bNV07DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBMX1BBVFRFUk5TWzEwXVs0XTsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IExfQU5EX0dfUEFUVEVSTlNbMjBdWzRdOw0KKyAgQ0JDX09uZURpbVJlYWRlcigpOw0KKyAgdmlydHVhbCB+Q0JDX09uZURpbVJlYWRlcigpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlUm93KGludDMyX3Qgcm93TnVtYmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBDRlhfQnl0ZVN0cmluZyBEZWNvZGVSb3coaW50MzJfdCByb3dOdW1iZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIHN0YXJ0R3VhcmRSYW5nZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRlhfSW50MzJBcnJheSogRmluZFN0YXJ0R3VhcmRQYXR0ZXJuKENCQ19Db21tb25CaXRBcnJheSogcm93LCBpbnQzMl90JiBlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDaGVja0NoZWNrc3VtKENGWF9CeXRlU3RyaW5nJiBzLCBpbnQzMl90JiBlKTsNCisgIENGWF9JbnQzMkFycmF5KiBGaW5kR3VhcmRQYXR0ZXJuKENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByb3dPZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIHdoaXRlRmlyc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSogcGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgaW50MzJfdCBEZWNvZGVEaWdpdChDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywNCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIGNvdW50ZXJzLA0KKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJvd09mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCogcGF0dGVybnMsDQorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGF0dGVybkxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICB2aXJ0dWFsIGludDMyX3QgRGVjb2RlTWlkZGxlKENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSogc3RhcnRSYW5nZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdFJlc3VsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHZpcnR1YWwgQ0ZYX0ludDMyQXJyYXkqIERlY29kZUVuZChDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVuZFN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVEaW1Xcml0ZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVEaW1Xcml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1OWYyN2YKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVdyaXRlci5jcHAKQEAgLTAsMCArMSw0NDIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMTEgWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAiQkNfT25lRGltV3JpdGVyLmgiDQorDQorI2luY2x1ZGUgPGFsZ29yaXRobT4NCisjaW5jbHVkZSA8bWVtb3J5Pg0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19Xcml0ZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgiDQorDQorQ0JDX09uZURpbVdyaXRlcjo6Q0JDX09uZURpbVdyaXRlcigpIHsNCisgIG1fbG9jVGV4dExvYyA9IEJDX1RFWFRfTE9DX0JFTE9XRU1CRUQ7DQorICBtX2JQcmludENoZWNrc3VtID0gVFJVRTsNCisgIG1faURhdGFMZW50aCA9IDA7DQorICBtX2JDYWxjQ2hlY2tzdW0gPSBGQUxTRTsNCisgIG1fcEZvbnQgPSBOVUxMOw0KKyAgbV9mRm9udFNpemUgPSAxMDsNCisgIDsNCisgIG1faUZvbnRTdHlsZSA9IDA7DQorICBtX2ZvbnRDb2xvciA9IDB4ZmYwMDAwMDA7DQorICBtX2lDb250ZW50TGVuID0gMDsNCisgIG1fYkxlZnRQYWRkaW5nID0gRkFMU0U7DQorICBtX2JSaWdodFBhZGRpbmcgPSBGQUxTRTsNCisgIG1fb3V0cHV0ID0gTlVMTDsNCit9DQorQ0JDX09uZURpbVdyaXRlcjo6fkNCQ19PbmVEaW1Xcml0ZXIoKSB7DQorICBpZiAobV9vdXRwdXQgIT0gTlVMTCkgew0KKyAgICBkZWxldGUgbV9vdXRwdXQ7DQorICAgIG1fb3V0cHV0ID0gTlVMTDsNCisgIH0NCit9DQordm9pZCBDQkNfT25lRGltV3JpdGVyOjpTZXRQcmludENoZWNrc3VtKEZYX0JPT0wgY2hlY2tzdW0pIHsNCisgIG1fYlByaW50Q2hlY2tzdW0gPSBjaGVja3N1bTsNCit9DQordm9pZCBDQkNfT25lRGltV3JpdGVyOjpTZXREYXRhTGVuZ3RoKGludDMyX3QgbGVuZ3RoKSB7DQorICBtX2lEYXRhTGVudGggPSBsZW5ndGg7DQorfQ0KK3ZvaWQgQ0JDX09uZURpbVdyaXRlcjo6U2V0Q2FsY0NoZWNrc3VtKGludDMyX3Qgc3RhdGUpIHsNCisgIG1fYkNhbGNDaGVja3N1bSA9IHN0YXRlOw0KK30NCitGWF9CT09MIENCQ19PbmVEaW1Xcml0ZXI6OlNldEZvbnQoQ0ZYX0ZvbnQqIGNGb250KSB7DQorICBpZiAoY0ZvbnQgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX3BGb250ID0gY0ZvbnQ7DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDQkNfT25lRGltV3JpdGVyOjpTZXRGb250U2l6ZShGWF9GTE9BVCBzaXplKSB7DQorICBtX2ZGb250U2l6ZSA9IHNpemU7DQorfQ0KK3ZvaWQgQ0JDX09uZURpbVdyaXRlcjo6U2V0Rm9udFN0eWxlKGludDMyX3Qgc3R5bGUpIHsNCisgIG1faUZvbnRTdHlsZSA9IHN0eWxlOw0KK30NCit2b2lkIENCQ19PbmVEaW1Xcml0ZXI6OlNldEZvbnRDb2xvcihGWF9BUkdCIGNvbG9yKSB7DQorICBtX2ZvbnRDb2xvciA9IGNvbG9yOw0KK30NCitGWF9XQ0hBUiBDQkNfT25lRGltV3JpdGVyOjpVcHBlcihGWF9XQ0hBUiBjaCkgew0KKyAgaWYgKGNoID49ICdhJyAmJiBjaCA8PSAneicpIHsNCisgICAgY2ggPSBjaCAtICgnYScgLSAnQScpOw0KKyAgfQ0KKyAgcmV0dXJuIGNoOw0KK30NCit1aW50OF90KiBDQkNfT25lRGltV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIHVpbnQ4X3QqIHJldCA9IE5VTEw7DQorICBvdXRIZWlnaHQgPSAxOw0KKyAgaWYgKG1fV2lkdGggPj0gMjApIHsNCisgICAgcmV0ID0gRW5jb2RlKGNvbnRlbnRzLCBvdXRXaWR0aCwgZSk7DQorICB9IGVsc2Ugew0KKyAgICByZXQgPSBFbmNvZGUoY29udGVudHMsIG91dFdpZHRoLCBlKTsNCisgIH0NCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiByZXQ7DQorfQ0KK3VpbnQ4X3QqIENCQ19PbmVEaW1Xcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgdWludDhfdCogcmV0ID0gRW5jb2RlKGNvbnRlbnRzLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIDAsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIHJldDsNCit9DQoraW50MzJfdCBDQkNfT25lRGltV3JpdGVyOjpBcHBlbmRQYXR0ZXJuKHVpbnQ4X3QqIHRhcmdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QqIHBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGF0dGVybkxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoc3RhcnRDb2xvciAhPSAwICYmIHN0YXJ0Q29sb3IgIT0gMSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25WYWx1ZU11c3RCZUVpdGhlcjBvcjE7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgdWludDhfdCBjb2xvciA9ICh1aW50OF90KXN0YXJ0Q29sb3I7DQorICBpbnQzMl90IG51bUFkZGVkID0gMDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHBhdHRlcm5MZW5ndGg7IGkrKykgew0KKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBwYXR0ZXJuW2ldOyBqKyspIHsNCisgICAgICB0YXJnZXRbcG9zXSA9IGNvbG9yOw0KKyAgICAgIHBvcyArPSAxOw0KKyAgICAgIG51bUFkZGVkICs9IDE7DQorICAgIH0NCisgICAgY29sb3IgXj0gMTsNCisgIH0NCisgIHJldHVybiBudW1BZGRlZDsNCit9DQordm9pZCBDQkNfT25lRGltV3JpdGVyOjpDYWxjVGV4dEluZm8oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIGNoYXJQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIGNGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGdlV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmb250U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgY2hhcnNMZW4pIHsNCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfVW5pY29kZUVuY29kaW5nRXg+IGVuY29kaW5nKA0KKyAgICAgIEZYX0NyZWF0ZUZvbnRFbmNvZGluZ0V4KGNGb250KSk7DQorDQorICBpbnQzMl90IGxlbmd0aCA9IHRleHQuR2V0TGVuZ3RoKCk7DQorICBGWF9EV09SRCogcENoYXJDb2RlID0gRlhfQWxsb2MoRlhfRFdPUkQsIHRleHQuR2V0TGVuZ3RoKCkpOw0KKyAgRlhfRkxPQVQgY2hhcldpZHRoID0gMDsNCisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IHRleHQuR2V0TGVuZ3RoKCk7IGorKykgew0KKyAgICBwQ2hhckNvZGVbal0gPSBlbmNvZGluZy0+Q2hhckNvZGVGcm9tVW5pY29kZSh0ZXh0W2pdKTsNCisgICAgaW50MzJfdCBnbHlwX2NvZGUgPSBlbmNvZGluZy0+R2x5cGhGcm9tQ2hhckNvZGUocENoYXJDb2RlW2pdKTsNCisgICAgaW50MzJfdCBnbHlwX3ZhbHVlID0gY0ZvbnQtPkdldEdseXBoV2lkdGgoZ2x5cF9jb2RlKTsNCisgICAgRlhfRkxPQVQgdGVtcCA9IChGWF9GTE9BVCkoKGdseXBfdmFsdWUpKmZvbnRTaXplIC8gMTAwMC4wKTsNCisgICAgY2hhcldpZHRoICs9IHRlbXA7DQorICB9DQorICBjaGFyc0xlbiA9IGNoYXJXaWR0aDsNCisgIEZYX0ZMT0FUIGxlZnRQb3NpdG9uID0gKEZYX0ZMT0FUKShnZVdpZHRoIC0gY2hhcnNMZW4pIC8gMi4wZjsNCisgIGlmIChsZWZ0UG9zaXRvbiA8IDAgJiYgZ2VXaWR0aCA9PSAwKSB7DQorICAgIGxlZnRQb3NpdG9uID0gMDsNCisgIH0NCisgIEZYX0ZMT0FUIHBlblggPSAwLjA7DQorICBGWF9GTE9BVCBwZW5ZID0NCisgICAgICAoRlhfRkxPQVQpRlhTWVNfYWJzKGNGb250LT5HZXREZXNjZW50KCkpICogKEZYX0ZMT0FUKWZvbnRTaXplIC8gMTAwMC4wZjsNCisgIEZYX0ZMT0FUIGxlZnQgPSBsZWZ0UG9zaXRvbjsNCisgIEZYX0ZMT0FUIHRvcCA9IDAuMDsNCisgIGNoYXJQb3NbMF0ubV9PcmlnaW5YID0gcGVuWCArIGxlZnQ7DQorICBjaGFyUG9zWzBdLm1fT3JpZ2luWSA9IHBlblkgKyB0b3A7DQorICBjaGFyUG9zWzBdLm1fR2x5cGhJbmRleCA9IGVuY29kaW5nLT5HbHlwaEZyb21DaGFyQ29kZShwQ2hhckNvZGVbMF0pOw0KKyAgY2hhclBvc1swXS5tX0ZvbnRDaGFyV2lkdGggPSBjRm9udC0+R2V0R2x5cGhXaWR0aChjaGFyUG9zWzBdLm1fR2x5cGhJbmRleCk7DQorI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfDQorICBjaGFyUG9zWzBdLm1fRXh0R0lEID0gY2hhclBvc1swXS5tX0dseXBoSW5kZXg7DQorI2VuZGlmDQorICBwZW5YICs9IChGWF9GTE9BVCkoY2hhclBvc1swXS5tX0ZvbnRDaGFyV2lkdGgpICogKEZYX0ZMT0FUKWZvbnRTaXplIC8gMTAwMC4wZjsNCisgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7DQorICAgIGNoYXJQb3NbaV0ubV9PcmlnaW5YID0gcGVuWCArIGxlZnQ7DQorICAgIGNoYXJQb3NbaV0ubV9PcmlnaW5ZID0gcGVuWSArIHRvcDsNCisgICAgY2hhclBvc1tpXS5tX0dseXBoSW5kZXggPSBlbmNvZGluZy0+R2x5cGhGcm9tQ2hhckNvZGUocENoYXJDb2RlW2ldKTsNCisgICAgY2hhclBvc1tpXS5tX0ZvbnRDaGFyV2lkdGggPSBjRm9udC0+R2V0R2x5cGhXaWR0aChjaGFyUG9zW2ldLm1fR2x5cGhJbmRleCk7DQorI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfDQorICAgIGNoYXJQb3NbaV0ubV9FeHRHSUQgPSBjaGFyUG9zW2ldLm1fR2x5cGhJbmRleDsNCisjZW5kaWYNCisgICAgcGVuWCArPQ0KKyAgICAgICAgKEZYX0ZMT0FUKShjaGFyUG9zW2ldLm1fRm9udENoYXJXaWR0aCkgKiAoRlhfRkxPQVQpZm9udFNpemUgLyAxMDAwLjBmOw0KKyAgfQ0KKyAgRlhfRnJlZShwQ2hhckNvZGUpOw0KK30NCit2b2lkIENCQ19PbmVEaW1Xcml0ZXI6OlNob3dEZXZpY2VDaGFycyhDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nIHN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBnZVdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBsb2NYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGxvY1ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBiYXJXaWR0aCkgew0KKyAgaW50MzJfdCBpRm9udFNpemUgPSAoaW50MzJfdClmYWJzKG1fZkZvbnRTaXplKTsNCisgIGludDMyX3QgaVRleHRIZWlnaHQgPSBpRm9udFNpemUgKyAxOw0KKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0KChGWF9GTE9BVClsb2NYLCAoRlhfRkxPQVQpbG9jWSwgKEZYX0ZMT0FUKShsb2NYICsgZ2VXaWR0aCksDQorICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShsb2NZICsgaVRleHRIZWlnaHQpKTsNCisgIGlmIChnZVdpZHRoICE9IG1fV2lkdGgpIHsNCisgICAgcmVjdC5yaWdodCAtPSAxOw0KKyAgfQ0KKyAgbWF0cml4LT5UcmFuc2Zvcm1SZWN0KHJlY3QpOw0KKyAgRlhfUkVDVCByZSA9IHJlY3QuR2V0T3V0dGVyUmVjdCgpOw0KKyAgZGV2aWNlLT5GaWxsUmVjdCgmcmUsIG1fYmFja2dyb3VuZENvbG9yKTsNCisgIENGWF9NYXRyaXggYWZmaW5lX21hdHJpeCgxLjAsIDAuMCwgMC4wLCAtMS4wLCAoRlhfRkxPQVQpbG9jWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKGxvY1kgKyBpRm9udFNpemUpKTsNCisgIGlmIChtYXRyaXggIT0gTlVMTCkgew0KKyAgICBhZmZpbmVfbWF0cml4LkNvbmNhdCgqbWF0cml4KTsNCisgIH0NCisgIGRldmljZS0+RHJhd05vcm1hbFRleHQoc3RyLkdldExlbmd0aCgpLCBwQ2hhclBvcywgbV9wRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClpRm9udFNpemUsIChDRlhfTWF0cml4KikmYWZmaW5lX21hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KK30NCit2b2lkIENCQ19PbmVEaW1Xcml0ZXI6OlNob3dCaXRtYXBDaGFycyhDRlhfRElCaXRtYXAqIHBPdXRCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcgc3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGdlV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGxvY1gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbG9jWSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJhcldpZHRoKSB7DQorICBpbnQzMl90IGlGb250U2l6ZSA9IChpbnQzMl90KWZhYnMobV9mRm9udFNpemUpOw0KKyAgaW50MzJfdCBpVGV4dEhlaWdodCA9IGlGb250U2l6ZSArIDE7DQorICBDRlhfRnhnZURldmljZSBnZTsNCisgIGdlLkNyZWF0ZSgoaW50KWdlV2lkdGgsIGlUZXh0SGVpZ2h0LCBtX2NvbG9yU3BhY2UpOw0KKyAgRlhfUkVDVCBnZVJlY3QoMCwgMCwgKGludClnZVdpZHRoLCBpVGV4dEhlaWdodCk7DQorICBnZS5GaWxsUmVjdCgmZ2VSZWN0LCBtX2JhY2tncm91bmRDb2xvcik7DQorICBDRlhfTWF0cml4IGFmZmluZV9tYXRyaXgoMS4wLCAwLjAsIDAuMCwgLTEuMCwgMC4wLCAoRlhfRkxPQVQpaUZvbnRTaXplKTsNCisgIGdlLkRyYXdOb3JtYWxUZXh0KHN0ci5HZXRMZW5ndGgoKSwgcENoYXJQb3MsIG1fcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKSwgKEZYX0ZMT0FUKWlGb250U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgIChDRlhfTWF0cml4KikmYWZmaW5lX21hdHJpeCwgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgQ0ZYX0Z4Z2VEZXZpY2UgZ2VCaXRtYXA7DQorICBnZUJpdG1hcC5BdHRhY2gocE91dEJpdG1hcCk7DQorICBnZUJpdG1hcC5TZXRESUJpdHMoZ2UuR2V0Qml0bWFwKCksIChpbnQpbG9jWCwgKGludClsb2NZKTsNCit9DQordm9pZCBDQkNfT25lRGltV3JpdGVyOjpTaG93Q2hhcnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBPdXRCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJhcldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbXVsdGlwbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGRldmljZSA9PSBOVUxMICYmIHBPdXRCaXRtYXAgPT0gTlVMTCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChtX3BGb250ID09IE5VTEwpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9CeXRlU3RyaW5nIHN0ciA9IEZYX1VURjhFbmNvZGUoY29udGVudHMpOw0KKyAgaW50MzJfdCBpTGVuID0gc3RyLkdldExlbmd0aCgpOw0KKyAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zID0gRlhfQWxsb2MoRlhURVhUX0NIQVJQT1MsIGlMZW4pOw0KKyAgRlhTWVNfbWVtc2V0KHBDaGFyUG9zLCAwLCBzaXplb2YoRlhURVhUX0NIQVJQT1MpICogaUxlbik7DQorICBGWF9GTE9BVCBjaGFyc0xlbiA9IDA7DQorICBGWF9GTE9BVCBnZVdpZHRoID0gMDsNCisgIGlmIChtX2xvY1RleHRMb2MgPT0gQkNfVEVYVF9MT0NfQUJPVkVFTUJFRCB8fA0KKyAgICAgIG1fbG9jVGV4dExvYyA9PSBCQ19URVhUX0xPQ19CRUxPV0VNQkVEKSB7DQorICAgIGdlV2lkdGggPSAwOw0KKyAgfSBlbHNlIGlmIChtX2xvY1RleHRMb2MgPT0gQkNfVEVYVF9MT0NfQUJPVkUgfHwNCisgICAgICAgICAgICAgbV9sb2NUZXh0TG9jID09IEJDX1RFWFRfTE9DX0JFTE9XKSB7DQorICAgIGdlV2lkdGggPSAoRlhfRkxPQVQpYmFyV2lkdGg7DQorICB9DQorICBpbnQzMl90IGlGb250U2l6ZSA9IChpbnQzMl90KWZhYnMobV9mRm9udFNpemUpOw0KKyAgaW50MzJfdCBpVGV4dEhlaWdodCA9IGlGb250U2l6ZSArIDE7DQorICBDYWxjVGV4dEluZm8oc3RyLCBwQ2hhclBvcywgbV9wRm9udCwgZ2VXaWR0aCwgaUZvbnRTaXplLCBjaGFyc0xlbik7DQorICBpZiAoY2hhcnNMZW4gPCAxKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgbG9jWCA9IDA7DQorICBpbnQzMl90IGxvY1kgPSAwOw0KKyAgc3dpdGNoIChtX2xvY1RleHRMb2MpIHsNCisgICAgY2FzZSBCQ19URVhUX0xPQ19BQk9WRUVNQkVEOg0KKyAgICAgIGxvY1ggPSAoaW50MzJfdCkoYmFyV2lkdGggLSBjaGFyc0xlbikgLyAyOw0KKyAgICAgIGxvY1kgPSAwOw0KKyAgICAgIGdlV2lkdGggPSBjaGFyc0xlbjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBCQ19URVhUX0xPQ19BQk9WRToNCisgICAgICBsb2NYID0gMDsNCisgICAgICBsb2NZID0gMDsNCisgICAgICBnZVdpZHRoID0gKEZYX0ZMT0FUKWJhcldpZHRoOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEJDX1RFWFRfTE9DX0JFTE9XRU1CRUQ6DQorICAgICAgbG9jWCA9IChpbnQzMl90KShiYXJXaWR0aCAtIGNoYXJzTGVuKSAvIDI7DQorICAgICAgbG9jWSA9IG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQ7DQorICAgICAgZ2VXaWR0aCA9IGNoYXJzTGVuOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEJDX1RFWFRfTE9DX0JFTE9XOg0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGxvY1ggPSAwOw0KKyAgICAgIGxvY1kgPSBtX0hlaWdodCAtIGlUZXh0SGVpZ2h0Ow0KKyAgICAgIGdlV2lkdGggPSAoRlhfRkxPQVQpYmFyV2lkdGg7DQorICAgICAgYnJlYWs7DQorICB9DQorICBpZiAoZGV2aWNlICE9IE5VTEwpIHsNCisgICAgU2hvd0RldmljZUNoYXJzKGRldmljZSwgbWF0cml4LCBzdHIsIGdlV2lkdGgsIHBDaGFyUG9zLCAoRlhfRkxPQVQpbG9jWCwNCisgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClsb2NZLCBiYXJXaWR0aCk7DQorICB9IGVsc2Ugew0KKyAgICBTaG93Qml0bWFwQ2hhcnMocE91dEJpdG1hcCwgc3RyLCBnZVdpZHRoLCBwQ2hhclBvcywgKEZYX0ZMT0FUKWxvY1gsDQorICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpbG9jWSwgYmFyV2lkdGgpOw0KKyAgfQ0KKyAgRlhfRnJlZShwQ2hhclBvcyk7DQorfQ0KK3ZvaWQgQ0JDX09uZURpbVdyaXRlcjo6UmVuZGVyQml0bWFwUmVzdWx0KENGWF9ESUJpdG1hcComIHBPdXRCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAobV9vdXRwdXQgPT0gTlVMTCkgew0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCisgIHBPdXRCaXRtYXAgPSBDcmVhdGVESUJpdG1hcChtX291dHB1dC0+R2V0V2lkdGgoKSwgbV9vdXRwdXQtPkdldEhlaWdodCgpKTsNCisgIHBPdXRCaXRtYXAtPkNsZWFyKG1fYmFja2dyb3VuZENvbG9yKTsNCisgIGlmICghcE91dEJpdG1hcCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25GYWlsVG9DcmVhdGVCaXRtYXA7DQorICAgIHJldHVybjsNCisgIH0NCisgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IG1fb3V0cHV0LT5HZXRXaWR0aCgpOyB4KyspIHsNCisgICAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgbV9vdXRwdXQtPkdldEhlaWdodCgpOyB5KyspIHsNCisgICAgICBpZiAobV9vdXRwdXQtPkdldCh4LCB5KSkgew0KKyAgICAgICAgcE91dEJpdG1hcC0+U2V0UGl4ZWwoeCwgeSwgbV9iYXJDb2xvcik7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpbnQzMl90IGkgPSAwOw0KKyAgZm9yICg7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKQ0KKyAgICBpZiAoY29udGVudHMuR2V0QXQoaSkgIT0gJyAnKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIGlmIChtX2xvY1RleHRMb2MgIT0gQkNfVEVYVF9MT0NfTk9ORSAmJiBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCkpIHsNCisgICAgU2hvd0NoYXJzKGNvbnRlbnRzLCBwT3V0Qml0bWFwLCBOVUxMLCBOVUxMLCBtX2JhcldpZHRoLCBtX211bHRpcGxlLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBDRlhfRElCaXRtYXAqIHBTdHJldGNoQml0bWFwID0gcE91dEJpdG1hcC0+U3RyZXRjaFRvKG1fV2lkdGgsIG1fSGVpZ2h0KTsNCisgIGlmIChwT3V0Qml0bWFwKSB7DQorICAgIGRlbGV0ZSBwT3V0Qml0bWFwOw0KKyAgfQ0KKyAgcE91dEJpdG1hcCA9IHBTdHJldGNoQml0bWFwOw0KK30NCit2b2lkIENCQ19PbmVEaW1Xcml0ZXI6OlJlbmRlckRldmljZVJlc3VsdChDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKG1fb3V0cHV0ID09IE5VTEwpIHsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBDRlhfR3JhcGhTdGF0ZURhdGEgc3RhdGVEYXRhOw0KKyAgQ0ZYX1BhdGhEYXRhIHBhdGg7DQorICBwYXRoLkFwcGVuZFJlY3QoMCwgMCwgKEZYX0ZMT0FUKW1fV2lkdGgsIChGWF9GTE9BVCltX0hlaWdodCk7DQorICBkZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBtYXRyaXgsICZzdGF0ZURhdGEsIG1fYmFja2dyb3VuZENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICBtX2JhY2tncm91bmRDb2xvciwgRlhGSUxMX0FMVEVSTkFURSk7DQorICBDRlhfTWF0cml4IG1hdHJpKG1fb3V0cHV0SFNjYWxlLCAwLjAsIDAuMCwgKEZYX0ZMT0FUKW1fSGVpZ2h0LCAwLjAsIDAuMCk7DQorICBtYXRyaS5Db25jYXQoKm1hdHJpeCk7DQorICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBtX291dHB1dC0+R2V0V2lkdGgoKTsgeCsrKSB7DQorICAgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IG1fb3V0cHV0LT5HZXRIZWlnaHQoKTsgeSsrKSB7DQorICAgICAgQ0ZYX1BhdGhEYXRhIHJlY3Q7DQorICAgICAgcmVjdC5BcHBlbmRSZWN0KChGWF9GTE9BVCl4LCAoRlhfRkxPQVQpeSwgKEZYX0ZMT0FUKSh4ICsgMSksDQorICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCkoeSArIDEpKTsNCisgICAgICBDRlhfR3JhcGhTdGF0ZURhdGEgc3RhdGVEYXRhOw0KKyAgICAgIGlmIChtX291dHB1dC0+R2V0KHgsIHkpKSB7DQorICAgICAgICBkZXZpY2UtPkRyYXdQYXRoKCZyZWN0LCAmbWF0cmksICZzdGF0ZURhdGEsIG1fYmFyQ29sb3IsIDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYRklMTF9XSU5ESU5HKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGludDMyX3QgaSA9IDA7DQorICBmb3IgKDsgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpOyBpKyspDQorICAgIGlmIChjb250ZW50cy5HZXRBdChpKSAhPSAnICcpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgaWYgKG1fbG9jVGV4dExvYyAhPSBCQ19URVhUX0xPQ19OT05FICYmIGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKSkgew0KKyAgICBTaG93Q2hhcnMoY29udGVudHMsIE5VTEwsIGRldmljZSwgbWF0cml4LCBtX2JhcldpZHRoLCBtX211bHRpcGxlLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0JDX09uZURpbVdyaXRlcjo6UmVuZGVyUmVzdWx0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0RldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoY29kZUxlbmd0aCA8IDEpIHsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBpZiAobV9Nb2R1bGVIZWlnaHQgPCAyMC4wKSB7DQorICAgIG1fTW9kdWxlSGVpZ2h0ID0gMjA7DQorICB9DQorICBpbnQzMl90IGNvZGVPbGRMZW5ndGggPSBjb2RlTGVuZ3RoOw0KKyAgaW50MzJfdCBsZWZ0UGFkZGluZyA9IDA7DQorICBpbnQzMl90IHJpZ2h0UGFkZGluZyA9IDA7DQorICBpZiAobV9iTGVmdFBhZGRpbmcpIHsNCisgICAgbGVmdFBhZGRpbmcgPSA3Ow0KKyAgfQ0KKyAgaWYgKG1fYlJpZ2h0UGFkZGluZykgew0KKyAgICByaWdodFBhZGRpbmcgPSA3Ow0KKyAgfQ0KKyAgY29kZUxlbmd0aCArPSBsZWZ0UGFkZGluZzsNCisgIGNvZGVMZW5ndGggKz0gcmlnaHRQYWRkaW5nOw0KKyAgbV9vdXRwdXRIU2NhbGUgPSAxLjA7DQorICBpZiAobV9XaWR0aCA+IDApIHsNCisgICAgbV9vdXRwdXRIU2NhbGUgPSAoRlhfRkxPQVQpbV9XaWR0aCAvIChGWF9GTE9BVCljb2RlTGVuZ3RoOw0KKyAgfQ0KKyAgaWYgKCFpc0RldmljZSkgew0KKyAgICBtX291dHB1dEhTY2FsZSA9DQorICAgICAgICBzdGQ6Om1heChtX291dHB1dEhTY2FsZSwgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KG1fTW9kdWxlV2lkdGgpKTsNCisgIH0NCisgIEZYX0ZMT0FUIGRhdGFMZW5ndGhTY2FsZSA9IDEuMDsNCisgIGlmIChtX2lEYXRhTGVudGggPiAwICYmIGNvbnRlbnRzLkdldExlbmd0aCgpICE9IDApIHsNCisgICAgZGF0YUxlbmd0aFNjYWxlID0gRlhfRkxPQVQoY29udGVudHMuR2V0TGVuZ3RoKCkpIC8gRlhfRkxPQVQobV9pRGF0YUxlbnRoKTsNCisgIH0NCisgIGlmIChtX2lEYXRhTGVudGggPiAwICYmIGNvbnRlbnRzLkdldExlbmd0aCgpID09IDApIHsNCisgICAgZGF0YUxlbmd0aFNjYWxlID0gRlhfRkxPQVQoMSkgLyBGWF9GTE9BVChtX2lEYXRhTGVudGgpOw0KKyAgfQ0KKyAgbV9tdWx0aXBsZSA9IDE7DQorICBpZiAoIWlzRGV2aWNlKSB7DQorICAgIG1fbXVsdGlwbGUgPSAoaW50MzJfdCljZWlsKG1fb3V0cHV0SFNjYWxlICogZGF0YUxlbmd0aFNjYWxlKTsNCisgIH0NCisgIGludDMyX3Qgb3V0cHV0SGVpZ2h0ID0gMTsNCisgIGlmICghaXNEZXZpY2UpIHsNCisgICAgaWYgKG1fSGVpZ2h0ID09IDApIHsNCisgICAgICBvdXRwdXRIZWlnaHQgPSBzdGQ6Om1heCgyMCwgbV9Nb2R1bGVIZWlnaHQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG91dHB1dEhlaWdodCA9IG1fSGVpZ2h0Ow0KKyAgICB9DQorICB9DQorICBpbnQzMl90IG91dHB1dFdpZHRoID0gY29kZUxlbmd0aDsNCisgIGlmICghaXNEZXZpY2UpIHsNCisgICAgb3V0cHV0V2lkdGggPSAoaW50MzJfdCkoY29kZUxlbmd0aCAqIG1fbXVsdGlwbGUgLyBkYXRhTGVuZ3RoU2NhbGUpOw0KKyAgfQ0KKyAgbV9iYXJXaWR0aCA9IG1fV2lkdGg7DQorICBpZiAoIWlzRGV2aWNlKSB7DQorICAgIG1fYmFyV2lkdGggPSBjb2RlTGVuZ3RoICogbV9tdWx0aXBsZTsNCisgIH0NCisgIG1fb3V0cHV0ID0gbmV3IENCQ19Db21tb25CaXRNYXRyaXg7DQorICBtX291dHB1dC0+SW5pdChvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0KTsNCisgIGludDMyX3Qgb3V0cHV0WCA9IGxlZnRQYWRkaW5nICogbV9tdWx0aXBsZTsNCisgIGZvciAoaW50MzJfdCBpbnB1dFggPSAwOyBpbnB1dFggPCBjb2RlT2xkTGVuZ3RoOyBpbnB1dFgrKykgew0KKyAgICBpZiAoY29kZVtpbnB1dFhdID09IDEpIHsNCisgICAgICBpZiAob3V0cHV0WCA+PSBvdXRwdXRXaWR0aCkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlmIChvdXRwdXRYICsgbV9tdWx0aXBsZSA+IG91dHB1dFdpZHRoICYmIG91dHB1dFdpZHRoIC0gb3V0cHV0WCA+IDApIHsNCisgICAgICAgIG1fb3V0cHV0LT5TZXRSZWdpb24ob3V0cHV0WCwgMCwgb3V0cHV0V2lkdGggLSBvdXRwdXRYLCBvdXRwdXRIZWlnaHQsIGUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIG1fb3V0cHV0LT5TZXRSZWdpb24ob3V0cHV0WCwgMCwgbV9tdWx0aXBsZSwgb3V0cHV0SGVpZ2h0LCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KKyAgICBvdXRwdXRYICs9IG1fbXVsdGlwbGU7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lRGltV3JpdGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMjIwMjEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVdyaXRlci5oCkBAIC0wLDAgKzEsMTIwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgWEZBX1NSQ19GWEJBUkNPREVfT05FRF9CQ19PTkVESU1XUklURVJfSF8NCisjZGVmaW5lIFhGQV9TUkNfRlhCQVJDT0RFX09ORURfQkNfT05FRElNV1JJVEVSX0hfDQorDQorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGdlL2Z4X2dlLmgiDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z4YmFyY29kZS9CQ19CYXJDb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1dyaXRlci5oIg0KKw0KK2NsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQorY2xhc3MgQ0ZYX0ZvbnQ7DQorY2xhc3MgQ0ZYX1JlbmRlckRldmljZTsNCisNCitjbGFzcyBDQkNfT25lRGltV3JpdGVyIDogcHVibGljIENCQ19Xcml0ZXIgew0KKyBwdWJsaWM6DQorICBDQkNfT25lRGltV3JpdGVyKCk7DQorICB2aXJ0dWFsIH5DQkNfT25lRGltV3JpdGVyKCk7DQorICB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHZpcnR1YWwgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dExlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9Ow0KKyAgdmlydHVhbCB2b2lkIFJlbmRlclJlc3VsdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCB2b2lkIFJlbmRlckJpdG1hcFJlc3VsdChDRlhfRElCaXRtYXAqJiBwT3V0Qml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHZpcnR1YWwgdm9pZCBSZW5kZXJEZXZpY2VSZXN1bHQoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCBGWF9CT09MIENoZWNrQ29udGVudFZhbGlkaXR5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9Ow0KKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBGaWx0ZXJDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7DQorICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOw0KKyAgfQ0KKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBSZW5kZXJUZXh0Q29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgew0KKyAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsNCisgIH0NCisgIHZpcnR1YWwgdm9pZCBTZXRQcmludENoZWNrc3VtKEZYX0JPT0wgY2hlY2tzdW0pOw0KKyAgdmlydHVhbCB2b2lkIFNldERhdGFMZW5ndGgoaW50MzJfdCBsZW5ndGgpOw0KKyAgdmlydHVhbCB2b2lkIFNldENhbGNDaGVja3N1bShpbnQzMl90IHN0YXRlKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRGb250U2l6ZShGWF9GTE9BVCBzaXplKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRGb250U3R5bGUoaW50MzJfdCBzdHlsZSk7DQorICB2aXJ0dWFsIHZvaWQgU2V0Rm9udENvbG9yKEZYX0FSR0IgY29sb3IpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldEZvbnQoQ0ZYX0ZvbnQqIGNGb250KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgRlhfQk9PTCBtX2JQcmludENoZWNrc3VtOw0KKyAgaW50MzJfdCBtX2lEYXRhTGVudGg7DQorICBGWF9CT09MIG1fYkNhbGNDaGVja3N1bTsNCisgIENGWF9Gb250KiBtX3BGb250Ow0KKyAgRlhfRkxPQVQgbV9mRm9udFNpemU7DQorICBpbnQzMl90IG1faUZvbnRTdHlsZTsNCisgIEZYX0RXT1JEIG1fZm9udENvbG9yOw0KKyAgQkNfVEVYVF9MT0MgbV9sb2NUZXh0TG9jOw0KKyAgaW50MzJfdCBtX2lDb250ZW50TGVuOw0KKyAgRlhfQk9PTCBtX2JMZWZ0UGFkZGluZzsNCisgIEZYX0JPT0wgbV9iUmlnaHRQYWRkaW5nOw0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogbV9vdXRwdXQ7DQorICBpbnQzMl90IG1fYmFyV2lkdGg7DQorICBpbnQzMl90IG1fbXVsdGlwbGU7DQorICBGWF9GTE9BVCBtX291dHB1dEhTY2FsZTsNCisgIHZvaWQgQ2FsY1RleHRJbmZvKGNvbnN0IENGWF9CeXRlU3RyaW5nJiB0ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIGNoYXJQb3MsDQorICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogY0ZvbnQsDQorICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBnZVdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmb250U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBjaGFyc0xlbik7DQorICB2aXJ0dWFsIHZvaWQgU2hvd0NoYXJzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE91dEJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYmFyV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbXVsdGlwbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCB2b2lkIFNob3dCaXRtYXBDaGFycyhDRlhfRElCaXRtYXAqIHBPdXRCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nIHN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZ2VXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBsb2NYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBsb2NZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJhcldpZHRoKTsNCisgIHZpcnR1YWwgdm9pZCBTaG93RGV2aWNlQ2hhcnMoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nIHN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZ2VXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBsb2NYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBsb2NZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJhcldpZHRoKTsNCisgIGludDMyX3QgQXBwZW5kUGF0dGVybih1aW50OF90KiB0YXJnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCogcGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBhdHRlcm5MZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgRlhfV0NIQVIgVXBwZXIoRlhfV0NIQVIgY2gpOw0KK307DQorDQorI2VuZGlmICAvLyBYRkFfU1JDX0ZYQkFSQ09ERV9PTkVEX0JDX09ORURJTVdSSVRFUl9IXw0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGFCYXJSZWFkZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kYUJhclJlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc1ZGRkNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGFCYXJSZWFkZXIuY3BwCkBAIC0wLDAgKzEsMjA5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDA4IFpYaW5nIGF1dGhvcnMNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgPGFsZ29yaXRobT4NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19SZWFkZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdEFycmF5LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lRFJlYWRlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlSZWFkZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kYUJhclJlYWRlci5oIg0KK2NvbnN0IEZYX0NIQVIqIENCQ19PbmVkQ29kYUJhclJlYWRlcjo6QUxQSEFCRVRfU1RSSU5HID0NCisgICAgIjAxMjM0NTY3ODktJDovLitBQkNEVE4iOw0KK2NvbnN0IGludDMyX3QgQ0JDX09uZWRDb2RhQmFyUmVhZGVyOjpDSEFSQUNURVJfRU5DT0RJTkdTWzIyXSA9IHsNCisgICAgMHgwMDMsIDB4MDA2LCAweDAwOSwgMHgwNjAsIDB4MDEyLCAweDA0MiwgMHgwMjEsIDB4MDI0LA0KKyAgICAweDAzMCwgMHgwNDgsIDB4MDBjLCAweDAxOCwgMHgwNDUsIDB4MDUxLCAweDA1NCwgMHgwMTUsDQorICAgIDB4MDFBLCAweDAyOSwgMHgwMEIsIDB4MDBFLCAweDAxQSwgMHgwMjl9Ow0KK2NvbnN0IGludDMyX3QgQ0JDX09uZWRDb2RhQmFyUmVhZGVyOjptaW5DaGFyYWN0ZXJMZW5ndGggPSAzOw0KK2NvbnN0IEZYX0NIQVIgQ0JDX09uZWRDb2RhQmFyUmVhZGVyOjpTVEFSVEVORF9FTkNPRElOR1s4XSA9IHsNCisgICAgJ0UnLCAnKicsICdBJywgJ0InLCAnQycsICdEJywgJ1QnLCAnTid9Ow0KK0NCQ19PbmVkQ29kYUJhclJlYWRlcjo6Q0JDX09uZWRDb2RhQmFyUmVhZGVyKCkge30NCitDQkNfT25lZENvZGFCYXJSZWFkZXI6On5DQkNfT25lZENvZGFCYXJSZWFkZXIoKSB7fQ0KK0NGWF9CeXRlU3RyaW5nIENCQ19PbmVkQ29kYUJhclJlYWRlcjo6RGVjb2RlUm93KGludDMyX3Qgcm93TnVtYmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX0ludDMyQXJyYXkqIGludDMyUHRyID0gRmluZEFzdGVyaXNrUGF0dGVybihyb3csIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgIENCQ19BdXRvUHRyPENGWF9JbnQzMkFycmF5PiBzdGFydChpbnQzMlB0cik7DQorICAoKnN0YXJ0KVsxXSA9IDA7DQorICBpbnQzMl90IG5leHRTdGFydCA9ICgqc3RhcnQpWzFdOw0KKyAgaW50MzJfdCBlbmQgPSByb3ctPkdldFNpemUoKTsNCisgIHdoaWxlIChuZXh0U3RhcnQgPCBlbmQgJiYgIXJvdy0+R2V0KG5leHRTdGFydCkpIHsNCisgICAgbmV4dFN0YXJ0Kys7DQorICB9DQorICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7DQorICBDRlhfSW50MzJBcnJheSBjb3VudGVyczsNCisgIGNvdW50ZXJzLlNldFNpemUoNyk7DQorICBGWF9DSEFSIGRlY29kZWRDaGFyOw0KKyAgaW50MzJfdCBsYXN0U3RhcnQ7DQorICBkbyB7DQorICAgIFJlY29yZFBhdHRlcm4ocm93LCBuZXh0U3RhcnQsICZjb3VudGVycywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICAgIGRlY29kZWRDaGFyID0gVG9OYXJyb3dXaWRlUGF0dGVybigmY291bnRlcnMpOw0KKyAgICBpZiAoZGVjb2RlZENoYXIgPT0gJyEnKSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICAgICAgcmV0dXJuICIiOw0KKyAgICB9DQorICAgIHJlc3VsdCArPSBkZWNvZGVkQ2hhcjsNCisgICAgbGFzdFN0YXJ0ID0gbmV4dFN0YXJ0Ow0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb3VudGVycy5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgIG5leHRTdGFydCArPSBjb3VudGVyc1tpXTsNCisgICAgfQ0KKyAgICB3aGlsZSAobmV4dFN0YXJ0IDwgZW5kICYmICFyb3ctPkdldChuZXh0U3RhcnQpKSB7DQorICAgICAgbmV4dFN0YXJ0Kys7DQorICAgIH0NCisgIH0gd2hpbGUgKG5leHRTdGFydCA8IGVuZCk7DQorICBpbnQzMl90IGxhc3RQYXR0ZXJuU2l6ZSA9IDA7DQorICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBjb3VudGVycy5HZXRTaXplKCk7IGorKykgew0KKyAgICBsYXN0UGF0dGVyblNpemUgKz0gY291bnRlcnNbal07DQorICB9DQorICBpbnQzMl90IHdoaXRlU3BhY2VBZnRlckVuZCA9IG5leHRTdGFydCAtIGxhc3RTdGFydCAtIGxhc3RQYXR0ZXJuU2l6ZTsNCisgIGlmIChuZXh0U3RhcnQgIT0gZW5kICYmICh3aGl0ZVNwYWNlQWZ0ZXJFbmQgLyAyIDwgbGFzdFBhdHRlcm5TaXplKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgcmV0dXJuICIiOw0KKyAgfQ0KKyAgaWYgKHJlc3VsdC5HZXRMZW5ndGgoKSA8IDIpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICAgIHJldHVybiAiIjsNCisgIH0NCisgIEZYX0NIQVIgc3RhcnRjaGFyID0gcmVzdWx0WzBdOw0KKyAgaWYgKCFBcnJheUNvbnRhaW5zKFNUQVJURU5EX0VOQ09ESU5HLCBzdGFydGNoYXIpKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgICByZXR1cm4gIiI7DQorICB9DQorICBpbnQzMl90IGxlbiA9IHJlc3VsdC5HZXRMZW5ndGgoKTsNCisgIENGWF9CeXRlU3RyaW5nIHRlbXAgPSByZXN1bHQ7DQorICBmb3IgKGludDMyX3QgayA9IDE7IGsgPCByZXN1bHQuR2V0TGVuZ3RoKCk7IGsrKykgew0KKyAgICBpZiAoQXJyYXlDb250YWlucyhTVEFSVEVORF9FTkNPRElORywgcmVzdWx0W2tdKSkgew0KKyAgICAgIGlmICgoayArIDEpICE9IHJlc3VsdC5HZXRMZW5ndGgoKSkgew0KKyAgICAgICAgcmVzdWx0LkRlbGV0ZSgxLCBrKTsNCisgICAgICAgIGsgPSAxOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHJlc3VsdC5HZXRMZW5ndGgoKSA8IDUpIHsNCisgICAgaW50MzJfdCBpbmRleCA9IHRlbXAuRmluZChyZXN1bHQuTWlkKDEsIHJlc3VsdC5HZXRMZW5ndGgoKSAtIDEpKTsNCisgICAgaWYgKGluZGV4ID09IGxlbiAtIChyZXN1bHQuR2V0TGVuZ3RoKCkgLSAxKSkgew0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgICAgIHJldHVybiAiIjsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHJlc3VsdC5HZXRMZW5ndGgoKSA+IG1pbkNoYXJhY3Rlckxlbmd0aCkgew0KKyAgICByZXN1bHQgPSByZXN1bHQuTWlkKDEsIHJlc3VsdC5HZXRMZW5ndGgoKSAtIDIpOw0KKyAgfSBlbHNlIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICAgIHJldHVybiAiIjsNCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQorfQ0KK0NGWF9JbnQzMkFycmF5KiBDQkNfT25lZENvZGFCYXJSZWFkZXI6OkZpbmRBc3Rlcmlza1BhdHRlcm4oDQorICAgIENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IHdpZHRoID0gcm93LT5HZXRTaXplKCk7DQorICBpbnQzMl90IHJvd09mZnNldCA9IDA7DQorICB3aGlsZSAocm93T2Zmc2V0IDwgd2lkdGgpIHsNCisgICAgaWYgKHJvdy0+R2V0KHJvd09mZnNldCkpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICByb3dPZmZzZXQrKzsNCisgIH0NCisgIGludDMyX3QgY291bnRlclBvc2l0aW9uID0gMDsNCisgIENGWF9JbnQzMkFycmF5IGNvdW50ZXJzOw0KKyAgY291bnRlcnMuU2V0U2l6ZSg3KTsNCisgIGludDMyX3QgcGF0dGVyblN0YXJ0ID0gcm93T2Zmc2V0Ow0KKyAgRlhfQk9PTCBpc1doaXRlID0gRkFMU0U7DQorICBpbnQzMl90IHBhdHRlcm5MZW5ndGggPSBjb3VudGVycy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IHJvd09mZnNldDsgaSA8IHdpZHRoOyBpKyspIHsNCisgICAgRlhfQk9PTCBwaXhlbCA9IHJvdy0+R2V0KGkpOw0KKyAgICBpZiAocGl4ZWwgXiBpc1doaXRlKSB7DQorICAgICAgY291bnRlcnNbY291bnRlclBvc2l0aW9uXSsrOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChjb3VudGVyUG9zaXRpb24gPT0gcGF0dGVybkxlbmd0aCAtIDEpIHsNCisgICAgICAgIGlmIChBcnJheUNvbnRhaW5zKFNUQVJURU5EX0VOQ09ESU5HLCBUb05hcnJvd1dpZGVQYXR0ZXJuKCZjb3VudGVycykpKSB7DQorICAgICAgICAgIEZYX0JPT0wgYnRlbXAzID0NCisgICAgICAgICAgICAgIHJvdy0+SXNSYW5nZShzdGQ6Om1heCgwLCBwYXR0ZXJuU3RhcnQgLSAoaSAtIHBhdHRlcm5TdGFydCkgLyAyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuU3RhcnQsIEZBTFNFLCBlKTsNCisgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgICBpZiAoYnRlbXAzKSB7DQorICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIHJlc3VsdCA9IG5ldyBDRlhfSW50MzJBcnJheSgpOw0KKyAgICAgICAgICAgIHJlc3VsdC0+U2V0U2l6ZSgyKTsNCisgICAgICAgICAgICAoKnJlc3VsdClbMF0gPSBwYXR0ZXJuU3RhcnQ7DQorICAgICAgICAgICAgKCpyZXN1bHQpWzFdID0gaTsNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBwYXR0ZXJuU3RhcnQgKz0gY291bnRlcnNbMF0gKyBjb3VudGVyc1sxXTsNCisgICAgICAgIGZvciAoaW50MzJfdCB5ID0gMjsgeSA8IHBhdHRlcm5MZW5ndGg7IHkrKykgew0KKyAgICAgICAgICBjb3VudGVyc1t5IC0gMl0gPSBjb3VudGVyc1t5XTsNCisgICAgICAgIH0NCisgICAgICAgIGNvdW50ZXJzW3BhdHRlcm5MZW5ndGggLSAyXSA9IDA7DQorICAgICAgICBjb3VudGVyc1twYXR0ZXJuTGVuZ3RoIC0gMV0gPSAwOw0KKyAgICAgICAgY291bnRlclBvc2l0aW9uLS07DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGNvdW50ZXJQb3NpdGlvbisrOw0KKyAgICAgIH0NCisgICAgICBjb3VudGVyc1tjb3VudGVyUG9zaXRpb25dID0gMTsNCisgICAgICBpc1doaXRlID0gIWlzV2hpdGU7DQorICAgIH0NCisgIH0NCisgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX0JPT0wgQ0JDX09uZWRDb2RhQmFyUmVhZGVyOjpBcnJheUNvbnRhaW5zKGNvbnN0IEZYX0NIQVIgYXJyYXlbXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DSEFSIGtleSkgew0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgODsgaSsrKSB7DQorICAgIGlmIChhcnJheVtpXSA9PSBrZXkpIHsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9DSEFSIENCQ19PbmVkQ29kYUJhclJlYWRlcjo6VG9OYXJyb3dXaWRlUGF0dGVybihDRlhfSW50MzJBcnJheSogY291bnRlcikgew0KKyAgaW50MzJfdCBudW1Db3VudGVycyA9IGNvdW50ZXItPkdldFNpemUoKTsNCisgIGlmIChudW1Db3VudGVycyA8IDEpIHsNCisgICAgcmV0dXJuICchJzsNCisgIH0NCisgIGludDMyX3QgYXZlcmFnZUNvdW50ZXIgPSAwOw0KKyAgaW50MzJfdCB0b3RhbENvdW50ZXJzID0gMDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bUNvdW50ZXJzOyBpKyspIHsNCisgICAgdG90YWxDb3VudGVycyArPSAoKmNvdW50ZXIpW2ldOw0KKyAgfQ0KKyAgYXZlcmFnZUNvdW50ZXIgPSB0b3RhbENvdW50ZXJzIC8gbnVtQ291bnRlcnM7DQorICBpbnQzMl90IHBhdHRlcm4gPSAwOw0KKyAgaW50MzJfdCB3aWRlQ291bnRlcnMgPSAwOw0KKyAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgbnVtQ291bnRlcnM7IGorKykgew0KKyAgICBpZiAoKCpjb3VudGVyKVtqXSA+IGF2ZXJhZ2VDb3VudGVyKSB7DQorICAgICAgcGF0dGVybiB8PSAxIDw8IChudW1Db3VudGVycyAtIDEgLSBqKTsNCisgICAgICB3aWRlQ291bnRlcnMrKzsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKCh3aWRlQ291bnRlcnMgPT0gMikgfHwgKHdpZGVDb3VudGVycyA9PSAzKSkgew0KKyAgICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCAyMjsgaysrKSB7DQorICAgICAgaWYgKENIQVJBQ1RFUl9FTkNPRElOR1Nba10gPT0gcGF0dGVybikgew0KKyAgICAgICAgcmV0dXJuIChBTFBIQUJFVF9TVFJJTkcpW2tdOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuICchJzsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kYUJhclJlYWRlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kYUJhclJlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYWQzMDYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyUmVhZGVyLmgKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19PTkVEQ09EQUJBUlJFQURFUl9IXw0KKyNkZWZpbmUgX0JDX09ORURDT0RBQkFSUkVBREVSX0hfDQorY2xhc3MgQ0JDX0NvbW1vbkJpdEFycmF5Ow0KK2NsYXNzIENCQ19PbmVEUmVhZGVyOw0KK2NsYXNzIENCQ19PbmVkQ29kYUJhclJlYWRlcjsNCitjbGFzcyBDQkNfT25lZENvZGFCYXJSZWFkZXIgOiBwdWJsaWMgQ0JDX09uZURSZWFkZXIgew0KKyBwdWJsaWM6DQorICBDQkNfT25lZENvZGFCYXJSZWFkZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19PbmVkQ29kYUJhclJlYWRlcigpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlUm93KGludDMyX3Qgcm93TnVtYmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBDRlhfSW50MzJBcnJheSogRmluZEFzdGVyaXNrUGF0dGVybihDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywgaW50MzJfdCYgZSk7DQorICBGWF9CT09MIEFycmF5Q29udGFpbnMoY29uc3QgRlhfQ0hBUiBhcnJheVtdLCBGWF9DSEFSIGtleSk7DQorICBGWF9DSEFSIFRvTmFycm93V2lkZVBhdHRlcm4oQ0ZYX0ludDMyQXJyYXkqIGNvdW50ZXIpOw0KKyAgc3RhdGljIGNvbnN0IEZYX0NIQVIqIEFMUEhBQkVUX1NUUklORzsNCisNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IENIQVJBQ1RFUl9FTkNPRElOR1NbMjJdOw0KKw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgbWluQ2hhcmFjdGVyTGVuZ3RoOw0KKw0KKyAgY29uc3Qgc3RhdGljIEZYX0NIQVIgU1RBUlRFTkRfRU5DT0RJTkdbOF07DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyV3JpdGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGFCYXJXcml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNzZjYTcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyV3JpdGVyLmNwcApAQCAtMCwwICsxLDIyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAxMSBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1dyaXRlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19SZWFkZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0QXJyYXkuaCINCisjaW5jbHVkZSAiQkNfT25lRFJlYWRlci5oIg0KKyNpbmNsdWRlICJCQ19PbmVEaW1Xcml0ZXIuaCINCisjaW5jbHVkZSAiQkNfT25lZENvZGFCYXJSZWFkZXIuaCINCisjaW5jbHVkZSAiQkNfT25lZENvZGFCYXJXcml0ZXIuaCINCitjb25zdCBGWF9DSEFSIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6U1RBUlRfRU5EX0NIQVJTW10gPSB7DQorICAgICdBJywgJ0InLCAnQycsICdEJywgJ1QnLCAnTicsICcqJywgJ0UnLCAnYScsICdiJywgJ2MnLCAnZCcsICd0JywgJ24nLCAnZSd9Ow0KK2NvbnN0IEZYX0NIQVIgQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpDT05URU5UX0NIQVJTW10gPSB7DQorICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLA0KKyAgICAnOCcsICc5JywgJy0nLCAnJCcsICcvJywgJzonLCAnKycsICcuJ307DQorQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpDQkNfT25lZENvZGFCYXJXcml0ZXIoKSB7DQorICBtX2NoU3RhcnQgPSAnQSc7DQorICBtX2NoRW5kID0gJ0InOw0KKyAgbV9pV2lkZU5hcnJSYXRpbyA9IDI7DQorfQ0KK0NCQ19PbmVkQ29kYUJhcldyaXRlcjo6fkNCQ19PbmVkQ29kYUJhcldyaXRlcigpIHt9DQorRlhfQk9PTCBDQkNfT25lZENvZGFCYXJXcml0ZXI6OlNldFN0YXJ0Q2hhcihGWF9DSEFSIHN0YXJ0KSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplb2YoU1RBUlRfRU5EX0NIQVJTKSAvIHNpemVvZihGWF9DSEFSKTsgaSsrKSB7DQorICAgIGlmIChTVEFSVF9FTkRfQ0hBUlNbaV0gPT0gc3RhcnQpIHsNCisgICAgICBtX2NoU3RhcnQgPSBzdGFydDsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6U2V0RW5kQ2hhcihGWF9DSEFSIGVuZCkgew0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZW9mKFNUQVJUX0VORF9DSEFSUykgLyBzaXplb2YoRlhfQ0hBUik7IGkrKykgew0KKyAgICBpZiAoU1RBUlRfRU5EX0NIQVJTW2ldID09IGVuZCkgew0KKyAgICAgIG1fY2hFbmQgPSBlbmQ7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDQkNfT25lZENvZGFCYXJXcml0ZXI6OlNldERhdGFMZW5ndGgoaW50MzJfdCBsZW5ndGgpIHsNCisgIG1faURhdGFMZW50aCA9IGxlbmd0aCArIDI7DQorfQ0KK0ZYX0JPT0wgQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pIHsNCisgIGlmIChsb2NhdGlvbiA8IEJDX1RFWFRfTE9DX05PTkUgfHwgbG9jYXRpb24gPiBCQ19URVhUX0xPQ19CRUxPV0VNQkVEKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIG1fbG9jVGV4dExvYyA9IGxvY2F0aW9uOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpTZXRXaWRlTmFycm93UmF0aW8oaW50MzJfdCByYXRpbykgew0KKyAgaWYgKHJhdGlvIDwgMiB8fCByYXRpbyA+IDMpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9pV2lkZU5hcnJSYXRpbyA9IHJhdGlvOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpGaW5kQ2hhcihGWF9XQ0hBUiBjaCwgRlhfQk9PTCBpc0NvbnRlbnQpIHsNCisgIGlmIChpc0NvbnRlbnQpIHsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZW9mKENPTlRFTlRfQ0hBUlMpIC8gc2l6ZW9mKEZYX0NIQVIpOyBpKyspIHsNCisgICAgICBpZiAoY2ggPT0gKEZYX1dDSEFSKUNPTlRFTlRfQ0hBUlNbaV0pIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBzaXplb2YoU1RBUlRfRU5EX0NIQVJTKSAvIHNpemVvZihGWF9DSEFSKTsgaisrKSB7DQorICAgICAgaWYgKGNoID09IChGWF9XQ0hBUilTVEFSVF9FTkRfQ0hBUlNbal0pIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9IGVsc2Ugew0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplb2YoQ09OVEVOVF9DSEFSUykgLyBzaXplb2YoRlhfQ0hBUik7IGkrKykgew0KKyAgICAgIGlmIChjaCA9PSAoRlhfV0NIQVIpQ09OVEVOVF9DSEFSU1tpXSkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCit9DQorRlhfQk9PTCBDQkNfT25lZENvZGFCYXJXcml0ZXI6OkNoZWNrQ29udGVudFZhbGlkaXR5KA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7DQorICBGWF9XQ0hBUiBjaDsNCisgIGludDMyX3QgaW5kZXggPSAwOw0KKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGluZGV4KyspIHsNCisgICAgY2ggPSBjb250ZW50cy5HZXRBdChpbmRleCk7DQorICAgIGlmIChGaW5kQ2hhcihjaCwgRkFMU0UpKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0gZWxzZSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpGaWx0ZXJDb250ZW50cygNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgZmlsdGVyY29udGVudHM7DQorICBGWF9XQ0hBUiBjaDsNCisgIGZvciAoaW50MzJfdCBpbmRleCA9IDA7IGluZGV4IDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGluZGV4KyspIHsNCisgICAgY2ggPSBjb250ZW50cy5HZXRBdChpbmRleCk7DQorICAgIGlmIChjaCA+IDE3NSkgew0KKyAgICAgIGluZGV4Kys7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKEZpbmRDaGFyKGNoLCBUUlVFKSkgew0KKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gZmlsdGVyY29udGVudHM7DQorfQ0KK3VpbnQ4X3QqIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIHVpbnQ4X3QqIHJldCA9IEVuY29kZShjb250ZW50cywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCAwLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiByZXQ7DQorfQ0KK3VpbnQ4X3QqIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGZvcm1hdCAhPSBCQ0ZPUk1BVF9DT0RBQkFSKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk9ubHlFbmNvZGVDT0RFQkFSOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHVpbnQ4X3QqIHJldCA9DQorICAgICAgQ0JDX09uZURpbVdyaXRlcjo6RW5jb2RlKGNvbnRlbnRzLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGhpbnRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiByZXQ7DQorfQ0KK3VpbnQ4X3QqIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0JDX09uZWRDb2RhQmFyUmVhZGVyIENvZGFCYXJSOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgZGF0YSA9IG1fY2hTdGFydCArIGNvbnRlbnRzICsgbV9jaEVuZDsNCisgIG1faUNvbnRlbnRMZW4gPSBkYXRhLkdldExlbmd0aCgpOw0KKyAgdWludDhfdCogcmVzdWx0ID0gRlhfQWxsb2MyRCh1aW50OF90LCBtX2lXaWRlTmFyclJhdGlvICogNywgZGF0YS5HZXRMZW5ndGgoKSk7DQorICBGWF9DSEFSIGNoOw0KKyAgaW50MzJfdCBwb3NpdGlvbiA9IDA7DQorICBmb3IgKGludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8IGRhdGEuR2V0TGVuZ3RoKCk7IGluZGV4KyspIHsNCisgICAgY2ggPSBkYXRhLkdldEF0KGluZGV4KTsNCisgICAgaWYgKCgoY2ggPj0gJ2EnKSAmJiAoY2ggPD0gJ3onKSkpIHsNCisgICAgICBjaCA9IGNoIC0gMzI7DQorICAgIH0NCisgICAgc3dpdGNoIChjaCkgew0KKyAgICAgIGNhc2UgJ1QnOg0KKyAgICAgICAgY2ggPSAnQSc7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICdOJzoNCisgICAgICAgIGNoID0gJ0InOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnKic6DQorICAgICAgICBjaCA9ICdDJzsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ0UnOg0KKyAgICAgICAgY2ggPSAnRCc7DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaW50MzJfdCBjb2RlID0gMDsNCisgICAgaW50MzJfdCBsZW4gPSAoaW50MzJfdClzdHJsZW4oQ29kYUJhclIuQUxQSEFCRVRfU1RSSU5HKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsNCisgICAgICBpZiAoY2ggPT0gQ29kYUJhclIuQUxQSEFCRVRfU1RSSU5HW2ldKSB7DQorICAgICAgICBjb2RlID0gQ29kYUJhclIuQ0hBUkFDVEVSX0VOQ09ESU5HU1tpXTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICB1aW50OF90IGNvbG9yID0gMTsNCisgICAgaW50MzJfdCBjb3VudGVyID0gMDsNCisgICAgaW50MzJfdCBiaXQgPSAwOw0KKyAgICB3aGlsZSAoYml0IDwgNykgew0KKyAgICAgIHJlc3VsdFtwb3NpdGlvbl0gPSBjb2xvcjsNCisgICAgICBwb3NpdGlvbisrOw0KKyAgICAgIGlmICgoKGNvZGUgPj4gKDYgLSBiaXQpKSAmIDEpID09IDAgfHwgY291bnRlciA9PSBtX2lXaWRlTmFyclJhdGlvIC0gMSkgew0KKyAgICAgICAgY29sb3IgPSAhY29sb3I7DQorICAgICAgICBiaXQrKzsNCisgICAgICAgIGNvdW50ZXIgPSAwOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBjb3VudGVyKys7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChpbmRleCA8IGRhdGEuR2V0TGVuZ3RoKCkgLSAxKSB7DQorICAgICAgcmVzdWx0W3Bvc2l0aW9uXSA9IDA7DQorICAgICAgcG9zaXRpb24rKzsNCisgICAgfQ0KKyAgfQ0KKyAgb3V0TGVuZ3RoID0gcG9zaXRpb247DQorICByZXR1cm4gcmVzdWx0Ow0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfT25lZENvZGFCYXJXcml0ZXI6OmVuY29kZWRDb250ZW50cygNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgc3RyU3RhcnQobV9jaFN0YXJ0KTsNCisgIENGWF9XaWRlU3RyaW5nIHN0ckVuZChtX2NoRW5kKTsNCisgIHJldHVybiBzdHJTdGFydCArIGNvbnRlbnRzICsgc3RyRW5kOw0KK30NCit2b2lkIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6UmVuZGVyUmVzdWx0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2RlTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0RldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENCQ19PbmVEaW1Xcml0ZXI6OlJlbmRlclJlc3VsdChlbmNvZGVkQ29udGVudHMoY29udGVudHMpLCBjb2RlLCBjb2RlTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGV2aWNlLCBlKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kYUJhcldyaXRlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kYUJhcldyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NjBjMGIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyV3JpdGVyLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19PTkVEQ09EQUJBUldSSVRFUl9IXw0KKyNkZWZpbmUgX0JDX09ORURDT0RBQkFSV1JJVEVSX0hfDQorZW51bSBCQ19URVhUX0xPQzsNCitjbGFzcyBDQkNfT25lRGltV3JpdGVyOw0KK2NsYXNzIENCQ19PbmVkQ29kYUJhcldyaXRlcjsNCitjbGFzcyBDQkNfT25lZENvZGFCYXJXcml0ZXIgOiBwdWJsaWMgQ0JDX09uZURpbVdyaXRlciB7DQorIHB1YmxpYzoNCisgIENCQ19PbmVkQ29kYUJhcldyaXRlcigpOw0KKyAgdmlydHVhbCB+Q0JDX09uZWRDb2RhQmFyV3JpdGVyKCk7DQorICB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dExlbmd0aCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlZENvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpOw0KKyAgRlhfQk9PTCBDaGVja0NvbnRlbnRWYWxpZGl0eShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsNCisgIENGWF9XaWRlU3RyaW5nIEZpbHRlckNvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpOw0KKyAgRlhfQk9PTCBTZXRTdGFydENoYXIoRlhfQ0hBUiBzdGFydCk7DQorICBGWF9CT09MIFNldEVuZENoYXIoRlhfQ0hBUiBlbmQpOw0KKyAgdm9pZCBTZXREYXRhTGVuZ3RoKGludDMyX3QgbGVuZ3RoKTsNCisgIEZYX0JPT0wgU2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKTsNCisgIEZYX0JPT0wgU2V0V2lkZU5hcnJvd1JhdGlvKGludDMyX3QgcmF0aW8pOw0KKyAgRlhfQk9PTCBGaW5kQ2hhcihGWF9XQ0hBUiBjaCwgRlhfQk9PTCBpc0NvbnRlbnQpOw0KKw0KKyBwcml2YXRlOg0KKyAgdm9pZCBSZW5kZXJSZXN1bHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvZGUsDQorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzRGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBjb25zdCBzdGF0aWMgRlhfQ0hBUiBTVEFSVF9FTkRfQ0hBUlNbXTsNCisgIGNvbnN0IHN0YXRpYyBGWF9DSEFSIENPTlRFTlRfQ0hBUlNbXTsNCisgIEZYX0NIQVIgbV9jaFN0YXJ0Ow0KKyAgRlhfQ0hBUiBtX2NoRW5kOw0KKyAgaW50MzJfdCBtX2lXaWRlTmFyclJhdGlvOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTEyOFJlYWRlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMTI4UmVhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmM3YTVhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTEyOFJlYWRlci5jcHAKQEAgLTAsMCArMSwzNjggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDggWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSA8YWxnb3JpdGhtPg0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1JlYWRlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0QXJyYXkuaCINCisjaW5jbHVkZSAiQkNfT25lRFJlYWRlci5oIg0KKyNpbmNsdWRlICJCQ19PbmVkQ29kZTEyOFJlYWRlci5oIg0KK2NvbnN0IGludDMyX3QgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX1BBVFRFUk5TWzEwN11bN10gPSB7DQorICAgIHsyLCAxLCAyLCAyLCAyLCAyLCAwfSwgezIsIDIsIDIsIDEsIDIsIDIsIDB9LCB7MiwgMiwgMiwgMiwgMiwgMSwgMH0sDQorICAgIHsxLCAyLCAxLCAyLCAyLCAzLCAwfSwgezEsIDIsIDEsIDMsIDIsIDIsIDB9LCB7MSwgMywgMSwgMiwgMiwgMiwgMH0sDQorICAgIHsxLCAyLCAyLCAyLCAxLCAzLCAwfSwgezEsIDIsIDIsIDMsIDEsIDIsIDB9LCB7MSwgMywgMiwgMiwgMSwgMiwgMH0sDQorICAgIHsyLCAyLCAxLCAyLCAxLCAzLCAwfSwgezIsIDIsIDEsIDMsIDEsIDIsIDB9LCB7MiwgMywgMSwgMiwgMSwgMiwgMH0sDQorICAgIHsxLCAxLCAyLCAyLCAzLCAyLCAwfSwgezEsIDIsIDIsIDEsIDMsIDIsIDB9LCB7MSwgMiwgMiwgMiwgMywgMSwgMH0sDQorICAgIHsxLCAxLCAzLCAyLCAyLCAyLCAwfSwgezEsIDIsIDMsIDEsIDIsIDIsIDB9LCB7MSwgMiwgMywgMiwgMiwgMSwgMH0sDQorICAgIHsyLCAyLCAzLCAyLCAxLCAxLCAwfSwgezIsIDIsIDEsIDEsIDMsIDIsIDB9LCB7MiwgMiwgMSwgMiwgMywgMSwgMH0sDQorICAgIHsyLCAxLCAzLCAyLCAxLCAyLCAwfSwgezIsIDIsIDMsIDEsIDEsIDIsIDB9LCB7MywgMSwgMiwgMSwgMywgMSwgMH0sDQorICAgIHszLCAxLCAxLCAyLCAyLCAyLCAwfSwgezMsIDIsIDEsIDEsIDIsIDIsIDB9LCB7MywgMiwgMSwgMiwgMiwgMSwgMH0sDQorICAgIHszLCAxLCAyLCAyLCAxLCAyLCAwfSwgezMsIDIsIDIsIDEsIDEsIDIsIDB9LCB7MywgMiwgMiwgMiwgMSwgMSwgMH0sDQorICAgIHsyLCAxLCAyLCAxLCAyLCAzLCAwfSwgezIsIDEsIDIsIDMsIDIsIDEsIDB9LCB7MiwgMywgMiwgMSwgMiwgMSwgMH0sDQorICAgIHsxLCAxLCAxLCAzLCAyLCAzLCAwfSwgezEsIDMsIDEsIDEsIDIsIDMsIDB9LCB7MSwgMywgMSwgMywgMiwgMSwgMH0sDQorICAgIHsxLCAxLCAyLCAzLCAxLCAzLCAwfSwgezEsIDMsIDIsIDEsIDEsIDMsIDB9LCB7MSwgMywgMiwgMywgMSwgMSwgMH0sDQorICAgIHsyLCAxLCAxLCAzLCAxLCAzLCAwfSwgezIsIDMsIDEsIDEsIDEsIDMsIDB9LCB7MiwgMywgMSwgMywgMSwgMSwgMH0sDQorICAgIHsxLCAxLCAyLCAxLCAzLCAzLCAwfSwgezEsIDEsIDIsIDMsIDMsIDEsIDB9LCB7MSwgMywgMiwgMSwgMywgMSwgMH0sDQorICAgIHsxLCAxLCAzLCAxLCAyLCAzLCAwfSwgezEsIDEsIDMsIDMsIDIsIDEsIDB9LCB7MSwgMywgMywgMSwgMiwgMSwgMH0sDQorICAgIHszLCAxLCAzLCAxLCAyLCAxLCAwfSwgezIsIDEsIDEsIDMsIDMsIDEsIDB9LCB7MiwgMywgMSwgMSwgMywgMSwgMH0sDQorICAgIHsyLCAxLCAzLCAxLCAxLCAzLCAwfSwgezIsIDEsIDMsIDMsIDEsIDEsIDB9LCB7MiwgMSwgMywgMSwgMywgMSwgMH0sDQorICAgIHszLCAxLCAxLCAxLCAyLCAzLCAwfSwgezMsIDEsIDEsIDMsIDIsIDEsIDB9LCB7MywgMywgMSwgMSwgMiwgMSwgMH0sDQorICAgIHszLCAxLCAyLCAxLCAxLCAzLCAwfSwgezMsIDEsIDIsIDMsIDEsIDEsIDB9LCB7MywgMywgMiwgMSwgMSwgMSwgMH0sDQorICAgIHszLCAxLCA0LCAxLCAxLCAxLCAwfSwgezIsIDIsIDEsIDQsIDEsIDEsIDB9LCB7NCwgMywgMSwgMSwgMSwgMSwgMH0sDQorICAgIHsxLCAxLCAxLCAyLCAyLCA0LCAwfSwgezEsIDEsIDEsIDQsIDIsIDIsIDB9LCB7MSwgMiwgMSwgMSwgMiwgNCwgMH0sDQorICAgIHsxLCAyLCAxLCA0LCAyLCAxLCAwfSwgezEsIDQsIDEsIDEsIDIsIDIsIDB9LCB7MSwgNCwgMSwgMiwgMiwgMSwgMH0sDQorICAgIHsxLCAxLCAyLCAyLCAxLCA0LCAwfSwgezEsIDEsIDIsIDQsIDEsIDIsIDB9LCB7MSwgMiwgMiwgMSwgMSwgNCwgMH0sDQorICAgIHsxLCAyLCAyLCA0LCAxLCAxLCAwfSwgezEsIDQsIDIsIDEsIDEsIDIsIDB9LCB7MSwgNCwgMiwgMiwgMSwgMSwgMH0sDQorICAgIHsyLCA0LCAxLCAyLCAxLCAxLCAwfSwgezIsIDIsIDEsIDEsIDEsIDQsIDB9LCB7NCwgMSwgMywgMSwgMSwgMSwgMH0sDQorICAgIHsyLCA0LCAxLCAxLCAxLCAyLCAwfSwgezEsIDMsIDQsIDEsIDEsIDEsIDB9LCB7MSwgMSwgMSwgMiwgNCwgMiwgMH0sDQorICAgIHsxLCAyLCAxLCAxLCA0LCAyLCAwfSwgezEsIDIsIDEsIDIsIDQsIDEsIDB9LCB7MSwgMSwgNCwgMiwgMSwgMiwgMH0sDQorICAgIHsxLCAyLCA0LCAxLCAxLCAyLCAwfSwgezEsIDIsIDQsIDIsIDEsIDEsIDB9LCB7NCwgMSwgMSwgMiwgMSwgMiwgMH0sDQorICAgIHs0LCAyLCAxLCAxLCAxLCAyLCAwfSwgezQsIDIsIDEsIDIsIDEsIDEsIDB9LCB7MiwgMSwgMiwgMSwgNCwgMSwgMH0sDQorICAgIHsyLCAxLCA0LCAxLCAyLCAxLCAwfSwgezQsIDEsIDIsIDEsIDIsIDEsIDB9LCB7MSwgMSwgMSwgMSwgNCwgMywgMH0sDQorICAgIHsxLCAxLCAxLCAzLCA0LCAxLCAwfSwgezEsIDMsIDEsIDEsIDQsIDEsIDB9LCB7MSwgMSwgNCwgMSwgMSwgMywgMH0sDQorICAgIHsxLCAxLCA0LCAzLCAxLCAxLCAwfSwgezQsIDEsIDEsIDEsIDEsIDMsIDB9LCB7NCwgMSwgMSwgMywgMSwgMSwgMH0sDQorICAgIHsxLCAxLCAzLCAxLCA0LCAxLCAwfSwgezEsIDEsIDQsIDEsIDMsIDEsIDB9LCB7MywgMSwgMSwgMSwgNCwgMSwgMH0sDQorICAgIHs0LCAxLCAxLCAxLCAzLCAxLCAwfSwgezIsIDEsIDEsIDQsIDEsIDIsIDB9LCB7MiwgMSwgMSwgMiwgMSwgNCwgMH0sDQorICAgIHsyLCAxLCAxLCAyLCAzLCAyLCAwfSwgezIsIDMsIDMsIDEsIDEsIDEsIDJ9fTsNCitjb25zdCBpbnQzMl90IENCQ19PbmVkQ29kZTEyOFJlYWRlcjo6TUFYX0FWR19WQVJJQU5DRSA9IChpbnQzMl90KSgyNTYgKiAwLjI1Zik7DQorY29uc3QgaW50MzJfdCBDQkNfT25lZENvZGUxMjhSZWFkZXI6Ok1BWF9JTkRJVklEVUFMX1ZBUklBTkNFID0NCisgICAgKGludDMyX3QpKDI1NiAqIDAuN2YpOw0KK2NvbnN0IGludDMyX3QgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX1NISUZUID0gOTg7DQorY29uc3QgaW50MzJfdCBDQkNfT25lZENvZGUxMjhSZWFkZXI6OkNPREVfQ09ERV9DID0gOTk7DQorY29uc3QgaW50MzJfdCBDQkNfT25lZENvZGUxMjhSZWFkZXI6OkNPREVfQ09ERV9CID0gMTAwOw0KK2NvbnN0IGludDMyX3QgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX0NPREVfQSA9IDEwMTsNCitjb25zdCBpbnQzMl90IENCQ19PbmVkQ29kZTEyOFJlYWRlcjo6Q09ERV9GTkNfMSA9IDEwMjsNCitjb25zdCBpbnQzMl90IENCQ19PbmVkQ29kZTEyOFJlYWRlcjo6Q09ERV9GTkNfMiA9IDk3Ow0KK2NvbnN0IGludDMyX3QgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX0ZOQ18zID0gOTY7DQorY29uc3QgaW50MzJfdCBDQkNfT25lZENvZGUxMjhSZWFkZXI6OkNPREVfRk5DXzRfQSA9IDEwMTsNCitjb25zdCBpbnQzMl90IENCQ19PbmVkQ29kZTEyOFJlYWRlcjo6Q09ERV9GTkNfNF9CID0gMTAwOw0KK2NvbnN0IGludDMyX3QgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX1NUQVJUX0EgPSAxMDM7DQorY29uc3QgaW50MzJfdCBDQkNfT25lZENvZGUxMjhSZWFkZXI6OkNPREVfU1RBUlRfQiA9IDEwNDsNCitjb25zdCBpbnQzMl90IENCQ19PbmVkQ29kZTEyOFJlYWRlcjo6Q09ERV9TVEFSVF9DID0gMTA1Ow0KK2NvbnN0IGludDMyX3QgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX1NUT1AgPSAxMDY7DQorQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDQkNfT25lZENvZGUxMjhSZWFkZXIoKSB7fQ0KK0NCQ19PbmVkQ29kZTEyOFJlYWRlcjo6fkNCQ19PbmVkQ29kZTEyOFJlYWRlcigpIHt9DQorQ0ZYX0ludDMyQXJyYXkqIENCQ19PbmVkQ29kZTEyOFJlYWRlcjo6RmluZFN0YXJ0UGF0dGVybihDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3Qgd2lkdGggPSByb3ctPkdldFNpemUoKTsNCisgIGludDMyX3Qgcm93T2Zmc2V0ID0gMDsNCisgIHdoaWxlIChyb3dPZmZzZXQgPCB3aWR0aCkgew0KKyAgICBpZiAocm93LT5HZXQocm93T2Zmc2V0KSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJvd09mZnNldCsrOw0KKyAgfQ0KKyAgaW50MzJfdCBjb3VudGVyUG9zaXRpb24gPSAwOw0KKyAgQ0ZYX0ludDMyQXJyYXkgY291bnRlcnM7DQorICBjb3VudGVycy5TZXRTaXplKDYpOw0KKyAgaW50MzJfdCBwYXR0ZXJuU3RhcnQgPSByb3dPZmZzZXQ7DQorICBGWF9CT09MIGlzV2hpdGUgPSBGQUxTRTsNCisgIGludDMyX3QgcGF0dGVybkxlbmd0aCA9IGNvdW50ZXJzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gcm93T2Zmc2V0OyBpIDwgd2lkdGg7IGkrKykgew0KKyAgICBGWF9CT09MIHBpeGVsID0gcm93LT5HZXQoaSk7DQorICAgIGlmIChwaXhlbCBeIGlzV2hpdGUpIHsNCisgICAgICBjb3VudGVyc1tjb3VudGVyUG9zaXRpb25dKys7DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKGNvdW50ZXJQb3NpdGlvbiA9PSBwYXR0ZXJuTGVuZ3RoIC0gMSkgew0KKyAgICAgICAgaW50MzJfdCBiZXN0VmFyaWFuY2UgPSBNQVhfQVZHX1ZBUklBTkNFOw0KKyAgICAgICAgaW50MzJfdCBiZXN0TWF0Y2ggPSAtMTsNCisgICAgICAgIGZvciAoaW50MzJfdCBzdGFydENvZGUgPSBDT0RFX1NUQVJUX0E7IHN0YXJ0Q29kZSA8PSBDT0RFX1NUQVJUX0M7DQorICAgICAgICAgICAgIHN0YXJ0Q29kZSsrKSB7DQorICAgICAgICAgIGludDMyX3QgdmFyaWFuY2UgPSBQYXR0ZXJuTWF0Y2hWYXJpYW5jZSgNCisgICAgICAgICAgICAgICZjb3VudGVycywgJkNPREVfUEFUVEVSTlNbc3RhcnRDb2RlXVswXSwgTUFYX0lORElWSURVQUxfVkFSSUFOQ0UpOw0KKyAgICAgICAgICBpZiAodmFyaWFuY2UgPCBiZXN0VmFyaWFuY2UpIHsNCisgICAgICAgICAgICBiZXN0VmFyaWFuY2UgPSB2YXJpYW5jZTsNCisgICAgICAgICAgICBiZXN0TWF0Y2ggPSBzdGFydENvZGU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChiZXN0TWF0Y2ggPj0gMCkgew0KKyAgICAgICAgICBGWF9CT09MIGJ0ZW1wMiA9DQorICAgICAgICAgICAgICByb3ctPklzUmFuZ2Uoc3RkOjptYXgoMCwgcGF0dGVyblN0YXJ0IC0gKGkgLSBwYXR0ZXJuU3RhcnQpIC8gMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVyblN0YXJ0LCBGQUxTRSwgZSk7DQorICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgICAgaWYgKGJ0ZW1wMikgew0KKyAgICAgICAgICAgIENGWF9JbnQzMkFycmF5KiByZXN1bHQgPSBuZXcgQ0ZYX0ludDMyQXJyYXk7DQorICAgICAgICAgICAgcmVzdWx0LT5TZXRTaXplKDMpOw0KKyAgICAgICAgICAgICgqcmVzdWx0KVswXSA9IHBhdHRlcm5TdGFydDsNCisgICAgICAgICAgICAoKnJlc3VsdClbMV0gPSBpOw0KKyAgICAgICAgICAgICgqcmVzdWx0KVsyXSA9IGJlc3RNYXRjaDsNCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBwYXR0ZXJuU3RhcnQgKz0gY291bnRlcnNbMF0gKyBjb3VudGVyc1sxXTsNCisgICAgICAgIGZvciAoaW50MzJfdCB5ID0gMjsgeSA8IHBhdHRlcm5MZW5ndGg7IHkrKykgew0KKyAgICAgICAgICBjb3VudGVyc1t5IC0gMl0gPSBjb3VudGVyc1t5XTsNCisgICAgICAgIH0NCisgICAgICAgIGNvdW50ZXJzW3BhdHRlcm5MZW5ndGggLSAyXSA9IDA7DQorICAgICAgICBjb3VudGVyc1twYXR0ZXJuTGVuZ3RoIC0gMV0gPSAwOw0KKyAgICAgICAgY291bnRlclBvc2l0aW9uLS07DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGNvdW50ZXJQb3NpdGlvbisrOw0KKyAgICAgIH0NCisgICAgICBjb3VudGVyc1tjb3VudGVyUG9zaXRpb25dID0gMTsNCisgICAgICBpc1doaXRlID0gIWlzV2hpdGU7DQorICAgIH0NCisgIH0NCisgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK2ludDMyX3QgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpEZWNvZGVDb2RlKENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5KiBjb3VudGVycywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJvd09mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBSZWNvcmRQYXR0ZXJuKHJvdywgcm93T2Zmc2V0LCBjb3VudGVycywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICBpbnQzMl90IGJlc3RWYXJpYW5jZSA9IE1BWF9BVkdfVkFSSUFOQ0U7DQorICBpbnQzMl90IGJlc3RNYXRjaCA9IC0xOw0KKyAgZm9yIChpbnQzMl90IGQgPSAwOyBkIDwgMTA3OyBkKyspIHsNCisgICAgaW50MzJfdCB2YXJpYW5jZSA9IFBhdHRlcm5NYXRjaFZhcmlhbmNlKGNvdW50ZXJzLCAmQ09ERV9QQVRURVJOU1tkXVswXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9JTkRJVklEVUFMX1ZBUklBTkNFKTsNCisgICAgaWYgKHZhcmlhbmNlIDwgYmVzdFZhcmlhbmNlKSB7DQorICAgICAgYmVzdFZhcmlhbmNlID0gdmFyaWFuY2U7DQorICAgICAgYmVzdE1hdGNoID0gZDsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGJlc3RNYXRjaCA+PSAwKSB7DQorICAgIHJldHVybiBiZXN0TWF0Y2g7DQorICB9IGVsc2Ugew0KKyAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpEZWNvZGVSb3coaW50MzJfdCByb3dOdW1iZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDRlhfSW50MzJBcnJheSogc3RhcnRQYXR0ZXJuSW5mbyA9IEZpbmRTdGFydFBhdHRlcm4ocm93LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICBpbnQzMl90IHN0YXJ0Q29kZSA9ICgqc3RhcnRQYXR0ZXJuSW5mbylbMl07DQorICBpbnQzMl90IGNvZGVTZXQ7DQorICBzd2l0Y2ggKHN0YXJ0Q29kZSkgew0KKyAgICBjYXNlIDEwMzoNCisgICAgICBjb2RlU2V0ID0gQ09ERV9DT0RFX0E7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMTA0Og0KKyAgICAgIGNvZGVTZXQgPSBDT0RFX0NPREVfQjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAxMDU6DQorICAgICAgY29kZVNldCA9IENPREVfQ09ERV9DOw0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGlmIChzdGFydFBhdHRlcm5JbmZvICE9IE5VTEwpIHsNCisgICAgICAgIHN0YXJ0UGF0dGVybkluZm8tPlJlbW92ZUFsbCgpOw0KKyAgICAgICAgZGVsZXRlIHN0YXJ0UGF0dGVybkluZm87DQorICAgICAgICBzdGFydFBhdHRlcm5JbmZvID0gTlVMTDsNCisgICAgICB9DQorICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICAgIHJldHVybiAiIjsNCisgIH0NCisgIEZYX0JPT0wgZG9uZSA9IEZBTFNFOw0KKyAgRlhfQk9PTCBpc05leHRTaGlmdGVkID0gRkFMU0U7DQorICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7DQorICBpbnQzMl90IGxhc3RTdGFydCA9ICgqc3RhcnRQYXR0ZXJuSW5mbylbMF07DQorICBpbnQzMl90IG5leHRTdGFydCA9ICgqc3RhcnRQYXR0ZXJuSW5mbylbMV07DQorICBpZiAoc3RhcnRQYXR0ZXJuSW5mbyAhPSBOVUxMKSB7DQorICAgIHN0YXJ0UGF0dGVybkluZm8tPlJlbW92ZUFsbCgpOw0KKyAgICBkZWxldGUgc3RhcnRQYXR0ZXJuSW5mbzsNCisgICAgc3RhcnRQYXR0ZXJuSW5mbyA9IE5VTEw7DQorICB9DQorICBDRlhfSW50MzJBcnJheSBjb3VudGVyczsNCisgIGNvdW50ZXJzLlNldFNpemUoNik7DQorICBpbnQzMl90IGxhc3RDb2RlID0gMDsNCisgIGludDMyX3QgY29kZSA9IDA7DQorICBpbnQzMl90IGNoZWNrc3VtVG90YWwgPSBzdGFydENvZGU7DQorICBpbnQzMl90IG11bHRpcGxpZXIgPSAwOw0KKyAgRlhfQk9PTCBsYXN0Q2hhcmFjdGVyV2FzUHJpbnRhYmxlID0gVFJVRTsNCisgIHdoaWxlICghZG9uZSkgew0KKyAgICBGWF9CT09MIHVuc2hpZnQgPSBpc05leHRTaGlmdGVkOw0KKyAgICBpc05leHRTaGlmdGVkID0gRkFMU0U7DQorICAgIGxhc3RDb2RlID0gY29kZTsNCisgICAgY29kZSA9IERlY29kZUNvZGUocm93LCAmY291bnRlcnMsIG5leHRTdGFydCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICAgIGlmIChjb2RlICE9IENPREVfU1RPUCkgew0KKyAgICAgIGxhc3RDaGFyYWN0ZXJXYXNQcmludGFibGUgPSBUUlVFOw0KKyAgICB9DQorICAgIGlmIChjb2RlICE9IENPREVfU1RPUCkgew0KKyAgICAgIG11bHRpcGxpZXIrKzsNCisgICAgICBjaGVja3N1bVRvdGFsICs9IG11bHRpcGxpZXIgKiBjb2RlOw0KKyAgICB9DQorICAgIGxhc3RTdGFydCA9IG5leHRTdGFydDsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY291bnRlcnMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICBuZXh0U3RhcnQgKz0gY291bnRlcnNbaV07DQorICAgIH0NCisgICAgc3dpdGNoIChjb2RlKSB7DQorICAgICAgY2FzZSAxMDM6DQorICAgICAgY2FzZSAxMDQ6DQorICAgICAgY2FzZSAxMDU6DQorICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgICByZXR1cm4gIiI7DQorICAgIH0NCisgICAgc3dpdGNoIChjb2RlU2V0KSB7DQorICAgICAgY2FzZSAxMDE6DQorICAgICAgICBpZiAoY29kZSA8IDY0KSB7DQorICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUikoJyAnICsgY29kZSk7DQorICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPCA5Nikgew0KKyAgICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpKGNvZGUgLSA2NCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBpZiAoY29kZSAhPSBDT0RFX1NUT1ApIHsNCisgICAgICAgICAgICBsYXN0Q2hhcmFjdGVyV2FzUHJpbnRhYmxlID0gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3dpdGNoIChjb2RlKSB7DQorICAgICAgICAgICAgY2FzZSAxMDI6DQorICAgICAgICAgICAgY2FzZSA5NzoNCisgICAgICAgICAgICBjYXNlIDk2Og0KKyAgICAgICAgICAgIGNhc2UgMTAxOg0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSA5ODoNCisgICAgICAgICAgICAgIGlzTmV4dFNoaWZ0ZWQgPSBUUlVFOw0KKyAgICAgICAgICAgICAgY29kZVNldCA9IENPREVfQ09ERV9COw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAxMDA6DQorICAgICAgICAgICAgICBjb2RlU2V0ID0gQ09ERV9DT0RFX0I7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDk5Og0KKyAgICAgICAgICAgICAgY29kZVNldCA9IENPREVfQ09ERV9DOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAxMDY6DQorICAgICAgICAgICAgICBkb25lID0gVFJVRTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIDEwMDoNCisgICAgICAgIGlmIChjb2RlIDwgOTYpIHsNCisgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKSgnICcgKyBjb2RlKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGlmIChjb2RlICE9IENPREVfU1RPUCkgew0KKyAgICAgICAgICAgIGxhc3RDaGFyYWN0ZXJXYXNQcmludGFibGUgPSBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHsNCisgICAgICAgICAgICBjYXNlIDEwMjoNCisgICAgICAgICAgICBjYXNlIDk3Og0KKyAgICAgICAgICAgIGNhc2UgOTY6DQorICAgICAgICAgICAgY2FzZSAxMDA6DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDk4Og0KKyAgICAgICAgICAgICAgaXNOZXh0U2hpZnRlZCA9IFRSVUU7DQorICAgICAgICAgICAgICBjb2RlU2V0ID0gQ09ERV9DT0RFX0E7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDEwMToNCisgICAgICAgICAgICAgIGNvZGVTZXQgPSBDT0RFX0NPREVfQTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgOTk6DQorICAgICAgICAgICAgICBjb2RlU2V0ID0gQ09ERV9DT0RFX0M7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDEwNjoNCisgICAgICAgICAgICAgIGRvbmUgPSBUUlVFOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgOTk6DQorICAgICAgICBpZiAoY29kZSA8IDEwMCkgew0KKyAgICAgICAgICBpZiAoY29kZSA8IDEwKSB7DQorICAgICAgICAgICAgcmVzdWx0ICs9ICcwJzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBGWF9DSEFSIHRlbXBbMTI4XTsNCisjaWYgZGVmaW5lZChfRlhfV0lOQVBJX1BBUlRJVElPTl9BUFBfKQ0KKyAgICAgICAgICBzcHJpbnRmX3ModGVtcCwgMTI4LCAiJWQiLCBjb2RlKTsNCisjZWxzZQ0KKyAgICAgICAgICBzcHJpbnRmKHRlbXAsICIlZCIsIGNvZGUpOw0KKyNlbmRpZg0KKyAgICAgICAgICByZXN1bHQgKz0gdGVtcDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGlmIChjb2RlICE9IENPREVfU1RPUCkgew0KKyAgICAgICAgICAgIGxhc3RDaGFyYWN0ZXJXYXNQcmludGFibGUgPSBGQUxTRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHsNCisgICAgICAgICAgICBjYXNlIDEwMjoNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgMTAxOg0KKyAgICAgICAgICAgICAgY29kZVNldCA9IENPREVfQ09ERV9BOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgY2FzZSAxMDA6DQorICAgICAgICAgICAgICBjb2RlU2V0ID0gQ09ERV9DT0RFX0I7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBjYXNlIDEwNjoNCisgICAgICAgICAgICAgIGRvbmUgPSBUUlVFOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmICh1bnNoaWZ0KSB7DQorICAgICAgY29kZVNldCA9IGNvZGVTZXQgPT0gQ09ERV9DT0RFX0EgPyBDT0RFX0NPREVfQiA6IENPREVfQ09ERV9BOw0KKyAgICB9DQorICB9DQorICBpbnQzMl90IHdpZHRoID0gcm93LT5HZXRTaXplKCk7DQorICB3aGlsZSAobmV4dFN0YXJ0IDwgd2lkdGggJiYgcm93LT5HZXQobmV4dFN0YXJ0KSkgew0KKyAgICBuZXh0U3RhcnQrKzsNCisgIH0NCisgIEZYX0JPT0wgYm9vbFQxID0gcm93LT5Jc1JhbmdlKA0KKyAgICAgIG5leHRTdGFydCwgc3RkOjptaW4od2lkdGgsIG5leHRTdGFydCArIChuZXh0U3RhcnQgLSBsYXN0U3RhcnQpIC8gMiksDQorICAgICAgRkFMU0UsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgIGlmICghYm9vbFQxKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgICByZXR1cm4gIiI7DQorICB9DQorICBjaGVja3N1bVRvdGFsIC09IG11bHRpcGxpZXIgKiBsYXN0Q29kZTsNCisgIGlmIChjaGVja3N1bVRvdGFsICUgMTAzICE9IGxhc3RDb2RlKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkNoZWNrc3VtRXhjZXB0aW9uOw0KKyAgICByZXR1cm4gIiI7DQorICB9DQorICBpbnQzMl90IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5HZXRMZW5ndGgoKTsNCisgIGlmIChyZXN1bHRMZW5ndGggPiAwICYmIGxhc3RDaGFyYWN0ZXJXYXNQcmludGFibGUpIHsNCisgICAgaWYgKGNvZGVTZXQgPT0gQ09ERV9DT0RFX0MpIHsNCisgICAgICByZXN1bHQgPSByZXN1bHQuTWlkKDAsIHJlc3VsdC5HZXRMZW5ndGgoKSAtIDIpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJlc3VsdCA9IHJlc3VsdC5NaWQoMCwgcmVzdWx0LkdldExlbmd0aCgpIC0gMSk7DQorICAgIH0NCisgIH0NCisgIGlmIChyZXN1bHQuR2V0TGVuZ3RoKCkgPT0gMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgIHJldHVybiAiIjsNCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhSZWFkZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhSZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTQ2YzBhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTEyOFJlYWRlci5oCkBAIC0wLDAgKzEsNDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfT05FRENPREExMjhSRUFERVJfSF8NCisjZGVmaW5lIF9CQ19PTkVEQ09EQTEyOFJFQURFUl9IXw0KK2NsYXNzIENCQ19PbmVEUmVhZGVyOw0KK2NsYXNzIENCQ19Db21tb25CaXRBcnJheTsNCitjbGFzcyBDQkNfT25lZENvZGExMjhSZWFkZXI7DQorY2xhc3MgQ0JDX09uZWRDb2RlMTI4UmVhZGVyIDogcHVibGljIENCQ19PbmVEUmVhZGVyIHsNCisgcHVibGljOg0KKyAgQ0JDX09uZWRDb2RlMTI4UmVhZGVyKCk7DQorICB2aXJ0dWFsIH5DQkNfT25lZENvZGUxMjhSZWFkZXIoKTsNCisgIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlUm93KGludDMyX3Qgcm93TnVtYmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBDT0RFX1BBVFRFUk5TWzEwN11bN107DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBNQVhfQVZHX1ZBUklBTkNFOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgTUFYX0lORElWSURVQUxfVkFSSUFOQ0U7DQorDQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBDT0RFX1NISUZUOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09ERV9DT0RFX0M7DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBDT0RFX0NPREVfQjsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IENPREVfQ09ERV9BOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09ERV9GTkNfMTsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IENPREVfRk5DXzI7DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBDT0RFX0ZOQ18zOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09ERV9GTkNfNF9BOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09ERV9GTkNfNF9COw0KKw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09ERV9TVEFSVF9BOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09ERV9TVEFSVF9COw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09ERV9TVEFSVF9DOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09ERV9TVE9QOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0ZYX0ludDMyQXJyYXkqIEZpbmRTdGFydFBhdHRlcm4oQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csIGludDMyX3QmIGUpOw0KKyAgaW50MzJfdCBEZWNvZGVDb2RlKENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5KiBjb3VudGVycywNCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJvd09mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhXcml0ZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTEyOFdyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4ZDQyNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhXcml0ZXIuY3BwCkBAIC0wLDAgKzEsMjM0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDEwIFpYaW5nIGF1dGhvcnMNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfV3JpdGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1JlYWRlci5oIg0KKyNpbmNsdWRlICJCQ19PbmVEUmVhZGVyLmgiDQorI2luY2x1ZGUgIkJDX09uZURpbVdyaXRlci5oIg0KKyNpbmNsdWRlICJCQ19PbmVkQ29kZTEyOFJlYWRlci5oIg0KKyNpbmNsdWRlICJCQ19PbmVkQ29kZTEyOFdyaXRlci5oIg0KK2NvbnN0IGludDMyX3QgQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpDT0RFX0NPREVfQiA9IDEwMDsNCitjb25zdCBpbnQzMl90IENCQ19PbmVkQ29kZTEyOFdyaXRlcjo6Q09ERV9DT0RFX0MgPSA5OTsNCitjb25zdCBpbnQzMl90IENCQ19PbmVkQ29kZTEyOFdyaXRlcjo6Q09ERV9TVEFSVF9CID0gMTA0Ow0KK2NvbnN0IGludDMyX3QgQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpDT0RFX1NUQVJUX0MgPSAxMDU7DQorY29uc3QgaW50MzJfdCBDQkNfT25lZENvZGUxMjhXcml0ZXI6OkNPREVfU1RPUCA9IDEwNjsNCitDQkNfT25lZENvZGUxMjhXcml0ZXI6OkNCQ19PbmVkQ29kZTEyOFdyaXRlcigpIHsNCisgIG1fY29kZUZvcm1hdCA9IEJDX0NPREUxMjhfQjsNCit9DQorQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpDQkNfT25lZENvZGUxMjhXcml0ZXIoQkNfVFlQRSB0eXBlKSB7DQorICBtX2NvZGVGb3JtYXQgPSB0eXBlOw0KK30NCitDQkNfT25lZENvZGUxMjhXcml0ZXI6On5DQkNfT25lZENvZGUxMjhXcml0ZXIoKSB7fQ0KK0JDX1RZUEUgQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpHZXRUeXBlKCkgew0KKyAgcmV0dXJuIG1fY29kZUZvcm1hdDsNCit9DQorRlhfQk9PTCBDQkNfT25lZENvZGUxMjhXcml0ZXI6OkNoZWNrQ29udGVudFZhbGlkaXR5KA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7DQorICBGWF9CT09MIHJldCA9IFRSVUU7DQorICBpbnQzMl90IHBvc2l0aW9uID0gMDsNCisgIGludDMyX3QgcGF0dGVybkluZGV4ID0gLTE7DQorICBpZiAobV9jb2RlRm9ybWF0ID09IEJDX0NPREUxMjhfQiB8fCBtX2NvZGVGb3JtYXQgPT0gQkNfQ09ERTEyOF9DKSB7DQorICAgIHdoaWxlIChwb3NpdGlvbiA8IGNvbnRlbnRzLkdldExlbmd0aCgpKSB7DQorICAgICAgcGF0dGVybkluZGV4ID0gKGludDMyX3QpY29udGVudHMuR2V0QXQocG9zaXRpb24pOw0KKyAgICAgIGlmIChwYXR0ZXJuSW5kZXggPj0gMzIgJiYgcGF0dGVybkluZGV4IDw9IDEyNiAmJiBwYXR0ZXJuSW5kZXggIT0gMzQpIHsNCisgICAgICAgIHBvc2l0aW9uKys7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcmV0ID0gRkFMU0U7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgcG9zaXRpb24rKzsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgcmV0ID0gRkFMU0U7DQorICB9DQorICByZXR1cm4gcmV0Ow0KK30NCitDRlhfV2lkZVN0cmluZyBDQkNfT25lZENvZGUxMjhXcml0ZXI6OkZpbHRlckNvbnRlbnRzKA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7DQorICBDRlhfV2lkZVN0cmluZyBmaWx0ZXJDaGluZXNlQ2hhcjsNCisgIEZYX1dDSEFSIGNoOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGkrKykgew0KKyAgICBjaCA9IGNvbnRlbnRzLkdldEF0KGkpOw0KKyAgICBpZiAoY2ggPiAxNzUpIHsNCisgICAgICBpKys7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgZmlsdGVyQ2hpbmVzZUNoYXIgKz0gY2g7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyBmaWx0ZXJjb250ZW50czsNCisgIGlmIChtX2NvZGVGb3JtYXQgPT0gQkNfQ09ERTEyOF9CKSB7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGZpbHRlckNoaW5lc2VDaGFyLkdldExlbmd0aCgpOyBpKyspIHsNCisgICAgICBjaCA9IGZpbHRlckNoaW5lc2VDaGFyLkdldEF0KGkpOw0KKyAgICAgIGlmIChjaCA+PSAzMiAmJiBjaCA8PSAxMjYpIHsNCisgICAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSBpZiAobV9jb2RlRm9ybWF0ID09IEJDX0NPREUxMjhfQykgew0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBmaWx0ZXJDaGluZXNlQ2hhci5HZXRMZW5ndGgoKTsgaSsrKSB7DQorICAgICAgY2ggPSBmaWx0ZXJDaGluZXNlQ2hhci5HZXRBdChpKTsNCisgICAgICBpZiAoY2ggPj0gMzIgJiYgY2ggPD0gMTA2KSB7DQorICAgICAgICBmaWx0ZXJjb250ZW50cyArPSBjaDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBmaWx0ZXJjb250ZW50cyA9IGNvbnRlbnRzOw0KKyAgfQ0KKyAgcmV0dXJuIGZpbHRlcmNvbnRlbnRzOw0KK30NCitGWF9CT09MIENCQ19PbmVkQ29kZTEyOFdyaXRlcjo6U2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKSB7DQorICBpZiAobG9jYXRpb24gPCBCQ19URVhUX0xPQ19OT05FIHx8IGxvY2F0aW9uID4gQkNfVEVYVF9MT0NfQkVMT1dFTUJFRCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX2xvY1RleHRMb2MgPSBsb2NhdGlvbjsNCisgIHJldHVybiBUUlVFOw0KK30NCit1aW50OF90KiBDQkNfT25lZENvZGUxMjhXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChmb3JtYXQgIT0gQkNGT1JNQVRfQ09ERV8xMjgpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uT25seUVuY29kZUNPREVfMTI4Ow0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHVpbnQ4X3QqIHJldCA9DQorICAgICAgQ0JDX09uZURpbVdyaXRlcjo6RW5jb2RlKGNvbnRlbnRzLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGhpbnRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiByZXQ7DQorfQ0KK3VpbnQ4X3QqIENCQ19PbmVkQ29kZTEyOFdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIHVpbnQ4X3QqIHJldCA9IEVuY29kZShjb250ZW50cywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCAwLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiByZXQ7DQorfQ0KK0ZYX0JPT0wgQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpJc0RpZ2l0cyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbGVuZ3RoKSB7DQorICBpbnQzMl90IGVuZCA9IHN0YXJ0ICsgbGVuZ3RoOw0KKyAgZm9yIChpbnQzMl90IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7DQorICAgIGlmIChjb250ZW50c1tpXSA8ICcwJyB8fCBjb250ZW50c1tpXSA+ICc5Jykgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3VpbnQ4X3QqIENCQ19PbmVkQ29kZTEyOFdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGNvbnRlbnRzLkdldExlbmd0aCgpIDwgMSB8fCBjb250ZW50cy5HZXRMZW5ndGgoKSA+IDgwKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkNvbnRlbnRzTGVuZ3RoU2hvdWxkQmV0d2VlbjFhbmQ4MDsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDRlhfUHRyQXJyYXkgcGF0dGVybnM7DQorICBpbnQzMl90IGNoZWNrU3VtID0gMDsNCisgIGlmIChtX2NvZGVGb3JtYXQgPT0gQkNfQ09ERTEyOF9CKSB7DQorICAgIGNoZWNrU3VtID0gRW5jb2RlMTI4Qihjb250ZW50cywgcGF0dGVybnMpOw0KKyAgfSBlbHNlIGlmIChtX2NvZGVGb3JtYXQgPT0gQkNfQ09ERTEyOF9DKSB7DQorICAgIGNoZWNrU3VtID0gRW5jb2RlMTI4Qyhjb250ZW50cywgcGF0dGVybnMpOw0KKyAgfSBlbHNlIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGNoZWNrU3VtICU9IDEwMzsNCisgIHBhdHRlcm5zLkFkZCgoaW50MzJfdCopQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX1BBVFRFUk5TW2NoZWNrU3VtXSk7DQorICBwYXR0ZXJucy5BZGQoKGludDMyX3QqKUNCQ19PbmVkQ29kZTEyOFJlYWRlcjo6Q09ERV9QQVRURVJOU1tDT0RFX1NUT1BdKTsNCisgIG1faUNvbnRlbnRMZW4gPSBjb250ZW50cy5HZXRMZW5ndGgoKSArIDM7DQorICBpbnQzMl90IGNvZGVXaWR0aCA9IDA7DQorICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBwYXR0ZXJucy5HZXRTaXplKCk7IGsrKykgew0KKyAgICBpbnQzMl90KiBwYXR0ZXJuID0gKGludDMyX3QqKXBhdHRlcm5zW2tdOw0KKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCA3OyBqKyspIHsNCisgICAgICBjb2RlV2lkdGggKz0gcGF0dGVybltqXTsNCisgICAgfQ0KKyAgfQ0KKyAgb3V0TGVuZ3RoID0gY29kZVdpZHRoOw0KKyAgdWludDhfdCogcmVzdWx0ID0gRlhfQWxsb2ModWludDhfdCwgb3V0TGVuZ3RoKTsNCisgIGludDMyX3QgcG9zID0gMDsNCisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IHBhdHRlcm5zLkdldFNpemUoKTsgaisrKSB7DQorICAgIGludDMyX3QqIHBhdHRlcm4gPSAoaW50MzJfdCopcGF0dGVybnNbal07DQorICAgIHBvcyArPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdCwgcG9zLCBwYXR0ZXJuLCA3LCAxLCBlKTsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgIEZYX0ZyZWUocmVzdWx0KTsNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHJlc3VsdDsNCit9DQoraW50MzJfdCBDQkNfT25lZENvZGUxMjhXcml0ZXI6OkVuY29kZTEyOEIoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJBcnJheSYgcGF0dGVybnMpIHsNCisgIGludDMyX3QgY2hlY2tTdW0gPSAwOw0KKyAgaW50MzJfdCBjaGVja1dlaWdodCA9IDE7DQorICBpbnQzMl90IHBvc2l0aW9uID0gMDsNCisgIHBhdHRlcm5zLkFkZCgoaW50MzJfdCopQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX1BBVFRFUk5TW0NPREVfU1RBUlRfQl0pOw0KKyAgY2hlY2tTdW0gKz0gQ09ERV9TVEFSVF9CICogY2hlY2tXZWlnaHQ7DQorICB3aGlsZSAocG9zaXRpb24gPCBjb250ZW50cy5HZXRMZW5ndGgoKSkgew0KKyAgICBpbnQzMl90IHBhdHRlcm5JbmRleCA9IDA7DQorICAgIHBhdHRlcm5JbmRleCA9IGNvbnRlbnRzW3Bvc2l0aW9uXSAtICcgJzsNCisgICAgcG9zaXRpb24gKz0gMTsNCisgICAgcGF0dGVybnMuQWRkKChpbnQzMl90KilDQkNfT25lZENvZGUxMjhSZWFkZXI6OkNPREVfUEFUVEVSTlNbcGF0dGVybkluZGV4XSk7DQorICAgIGNoZWNrU3VtICs9IHBhdHRlcm5JbmRleCAqIGNoZWNrV2VpZ2h0Ow0KKyAgICBpZiAocG9zaXRpb24gIT0gMCkgew0KKyAgICAgIGNoZWNrV2VpZ2h0Kys7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBjaGVja1N1bTsNCit9DQoraW50MzJfdCBDQkNfT25lZENvZGUxMjhXcml0ZXI6OkVuY29kZTEyOEMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJBcnJheSYgcGF0dGVybnMpIHsNCisgIGludDMyX3QgY2hlY2tTdW0gPSAwOw0KKyAgaW50MzJfdCBjaGVja1dlaWdodCA9IDE7DQorICBpbnQzMl90IHBvc2l0aW9uID0gMDsNCisgIHBhdHRlcm5zLkFkZCgoaW50MzJfdCopQ0JDX09uZWRDb2RlMTI4UmVhZGVyOjpDT0RFX1BBVFRFUk5TW0NPREVfU1RBUlRfQ10pOw0KKyAgY2hlY2tTdW0gKz0gQ09ERV9TVEFSVF9DICogY2hlY2tXZWlnaHQ7DQorICB3aGlsZSAocG9zaXRpb24gPCBjb250ZW50cy5HZXRMZW5ndGgoKSkgew0KKyAgICBpbnQzMl90IHBhdHRlcm5JbmRleCA9IDA7DQorICAgIEZYX0NIQVIgY2ggPSBjb250ZW50cy5HZXRBdChwb3NpdGlvbik7DQorICAgIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5Jykgew0KKyAgICAgIHBhdHRlcm5JbmRleCA9IChpbnQzMl90KWNoOw0KKyAgICAgIHBvc2l0aW9uKys7DQorICAgIH0gZWxzZSB7DQorICAgICAgcGF0dGVybkluZGV4ID0gRlhTWVNfYXRvaShjb250ZW50cy5NaWQocG9zaXRpb24sIDIpKTsNCisgICAgICBpZiAoY29udGVudHMuR2V0QXQocG9zaXRpb24gKyAxKSA8ICcwJyB8fA0KKyAgICAgICAgICBjb250ZW50cy5HZXRBdChwb3NpdGlvbiArIDEpID4gJzknKSB7DQorICAgICAgICBwb3NpdGlvbiArPSAxOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBwb3NpdGlvbiArPSAyOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBwYXR0ZXJucy5BZGQoKGludDMyX3QqKUNCQ19PbmVkQ29kZTEyOFJlYWRlcjo6Q09ERV9QQVRURVJOU1twYXR0ZXJuSW5kZXhdKTsNCisgICAgY2hlY2tTdW0gKz0gcGF0dGVybkluZGV4ICogY2hlY2tXZWlnaHQ7DQorICAgIGlmIChwb3NpdGlvbiAhPSAwKSB7DQorICAgICAgY2hlY2tXZWlnaHQrKzsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGNoZWNrU3VtOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMTI4V3JpdGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMTI4V3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRmNzgyYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhXcml0ZXIuaApAQCAtMCwwICsxLDQ4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX09ORURDT0RBMTI4V1JJVEVSX0hfDQorI2RlZmluZSBfQkNfT05FRENPREExMjhXUklURVJfSF8NCitjbGFzcyBDQkNfT25lRGltV3JpdGVyOw0KK2NsYXNzIENCQ19PbmVkQ29kYTEyOFdyaXRlcjsNCitjbGFzcyBDQkNfT25lZENvZGUxMjhXcml0ZXIgOiBwdWJsaWMgQ0JDX09uZURpbVdyaXRlciB7DQorIHB1YmxpYzoNCisgIENCQ19PbmVkQ29kZTEyOFdyaXRlcigpOw0KKyAgQ0JDX09uZWRDb2RlMTI4V3JpdGVyKEJDX1RZUEUgdHlwZSk7DQorICB2aXJ0dWFsIH5DQkNfT25lZENvZGUxMjhXcml0ZXIoKTsNCisgIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBGWF9CT09MIENoZWNrQ29udGVudFZhbGlkaXR5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgRmlsdGVyQ29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7DQorICBGWF9CT09MIFNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbik7DQorICBCQ19UWVBFIEdldFR5cGUoKTsNCisNCisgcHJpdmF0ZToNCisgIEZYX0JPT0wgSXNEaWdpdHMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlbmd0aCk7DQorICBpbnQzMl90IEVuY29kZTEyOEIoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLCBDRlhfUHRyQXJyYXkmIHBhdHRlcm5zKTsNCisgIGludDMyX3QgRW5jb2RlMTI4Qyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsIENGWF9QdHJBcnJheSYgcGF0dGVybnMpOw0KKyAgQkNfVFlQRSBtX2NvZGVGb3JtYXQ7DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBDT0RFX1NUQVJUX0I7DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBDT0RFX1NUQVJUX0M7DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBDT0RFX0NPREVfQjsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IENPREVfQ09ERV9DOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgQ09ERV9TVE9QOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTM5UmVhZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUzOVJlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThkMWU5NgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUzOVJlYWRlci5jcHAKQEAgLTAsMCArMSwyOTMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDggWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSA8YWxnb3JpdGhtPg0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1JlYWRlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0QXJyYXkuaCINCisjaW5jbHVkZSAiQkNfT25lRFJlYWRlci5oIg0KKyNpbmNsdWRlICJCQ19PbmVkQ29kZTM5UmVhZGVyLmgiDQorY29uc3QgRlhfQ0hBUiogQ0JDX09uZWRDb2RlMzlSZWFkZXI6OkFMUEhBQkVUX1NUUklORyA9DQorICAgICIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVotLiAqJC8rJSI7DQorY29uc3QgRlhfQ0hBUiogQ0JDX09uZWRDb2RlMzlSZWFkZXI6OkNIRUNLU1VNX1NUUklORyA9DQorICAgICIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVotLiAkLyslIjsNCitjb25zdCBpbnQzMl90IENCQ19PbmVkQ29kZTM5UmVhZGVyOjpDSEFSQUNURVJfRU5DT0RJTkdTWzQ0XSA9IHsNCisgICAgMHgwMzQsIDB4MTIxLCAweDA2MSwgMHgxNjAsIDB4MDMxLCAweDEzMCwgMHgwNzAsIDB4MDI1LCAweDEyNCwNCisgICAgMHgwNjQsIDB4MTA5LCAweDA0OSwgMHgxNDgsIDB4MDE5LCAweDExOCwgMHgwNTgsIDB4MDBELCAweDEwQywNCisgICAgMHgwNEMsIDB4MDFDLCAweDEwMywgMHgwNDMsIDB4MTQyLCAweDAxMywgMHgxMTIsIDB4MDUyLCAweDAwNywNCisgICAgMHgxMDYsIDB4MDQ2LCAweDAxNiwgMHgxODEsIDB4MEMxLCAweDFDMCwgMHgwOTEsIDB4MTkwLCAweDBEMCwNCisgICAgMHgwODUsIDB4MTg0LCAweDBDNCwgMHgwOTQsIDB4MEE4LCAweDBBMiwgMHgwOEEsIDB4MDJBfTsNCitjb25zdCBpbnQzMl90IENCQ19PbmVkQ29kZTM5UmVhZGVyOjpBU1RFUklTS19FTkNPRElORyA9IDB4MDk0Ow0KK0NCQ19PbmVkQ29kZTM5UmVhZGVyOjpDQkNfT25lZENvZGUzOVJlYWRlcigpDQorICAgIDogbV91c2luZ0NoZWNrRGlnaXQoRkFMU0UpLCBtX2V4dGVuZGVkTW9kZShGQUxTRSkgew0KK30NCitDQkNfT25lZENvZGUzOVJlYWRlcjo6Q0JDX09uZWRDb2RlMzlSZWFkZXIoRlhfQk9PTCB1c2luZ0NoZWNrRGlnaXQpDQorICAgIDogbV91c2luZ0NoZWNrRGlnaXQodXNpbmdDaGVja0RpZ2l0KSwgbV9leHRlbmRlZE1vZGUoRkFMU0UpIHsNCit9DQorQ0JDX09uZWRDb2RlMzlSZWFkZXI6OkNCQ19PbmVkQ29kZTM5UmVhZGVyKEZYX0JPT0wgdXNpbmdDaGVja0RpZ2l0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGV4dGVuZGVkTW9kZSkNCisgICAgOiBtX3VzaW5nQ2hlY2tEaWdpdCh1c2luZ0NoZWNrRGlnaXQpLCBtX2V4dGVuZGVkTW9kZShleHRlbmRlZE1vZGUpIHsNCit9DQorQ0JDX09uZWRDb2RlMzlSZWFkZXI6On5DQkNfT25lZENvZGUzOVJlYWRlcigpIHt9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX09uZWRDb2RlMzlSZWFkZXI6OkRlY29kZVJvdyhpbnQzMl90IHJvd051bWJlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9JbnQzMkFycmF5KiBzdGFydCA9IEZpbmRBc3Rlcmlza1BhdHRlcm4ocm93LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICBpbnQzMl90IG5leHRTdGFydCA9ICgqc3RhcnQpWzFdOw0KKyAgaWYgKHN0YXJ0ICE9IE5VTEwpIHsNCisgICAgZGVsZXRlIHN0YXJ0Ow0KKyAgICBzdGFydCA9IE5VTEw7DQorICB9DQorICBpbnQzMl90IGVuZCA9IHJvdy0+R2V0U2l6ZSgpOw0KKyAgd2hpbGUgKG5leHRTdGFydCA8IGVuZCAmJiAhcm93LT5HZXQobmV4dFN0YXJ0KSkgew0KKyAgICBuZXh0U3RhcnQrKzsNCisgIH0NCisgIENGWF9CeXRlU3RyaW5nIHJlc3VsdDsNCisgIENGWF9JbnQzMkFycmF5IGNvdW50ZXJzOw0KKyAgY291bnRlcnMuU2V0U2l6ZSg5KTsNCisgIEZYX0NIQVIgZGVjb2RlZENoYXI7DQorICBpbnQzMl90IGxhc3RTdGFydDsNCisgIGRvIHsNCisgICAgUmVjb3JkUGF0dGVybihyb3csIG5leHRTdGFydCwgJmNvdW50ZXJzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgICAgaW50MzJfdCBwYXR0ZXJuID0gVG9OYXJyb3dXaWRlUGF0dGVybigmY291bnRlcnMpOw0KKyAgICBpZiAocGF0dGVybiA8IDApIHsNCisgICAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgICByZXR1cm4gIiI7DQorICAgIH0NCisgICAgZGVjb2RlZENoYXIgPSBQYXR0ZXJuVG9DaGFyKHBhdHRlcm4sIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgICByZXN1bHQgKz0gZGVjb2RlZENoYXI7DQorICAgIGxhc3RTdGFydCA9IG5leHRTdGFydDsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY291bnRlcnMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICBuZXh0U3RhcnQgKz0gY291bnRlcnNbaV07DQorICAgIH0NCisgICAgd2hpbGUgKG5leHRTdGFydCA8IGVuZCAmJiAhcm93LT5HZXQobmV4dFN0YXJ0KSkgew0KKyAgICAgIG5leHRTdGFydCsrOw0KKyAgICB9DQorICB9IHdoaWxlIChkZWNvZGVkQ2hhciAhPSAnKicpOw0KKyAgcmVzdWx0ID0gcmVzdWx0Lk1pZCgwLCByZXN1bHQuR2V0TGVuZ3RoKCkgLSAxKTsNCisgIGludDMyX3QgbGFzdFBhdHRlcm5TaXplID0gMDsNCisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGNvdW50ZXJzLkdldFNpemUoKTsgaisrKSB7DQorICAgIGxhc3RQYXR0ZXJuU2l6ZSArPSBjb3VudGVyc1tqXTsNCisgIH0NCisgIGlmIChtX3VzaW5nQ2hlY2tEaWdpdCkgew0KKyAgICBpbnQzMl90IG1heCA9IHJlc3VsdC5HZXRMZW5ndGgoKSAtIDE7DQorICAgIGludDMyX3QgdG90YWwgPSAwOw0KKyAgICBpbnQzMl90IGxlbiA9IChpbnQzMl90KXN0cmxlbihBTFBIQUJFVF9TVFJJTkcpOw0KKyAgICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBtYXg7IGsrKykgew0KKyAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGxlbjsgaisrKQ0KKyAgICAgICAgaWYgKEFMUEhBQkVUX1NUUklOR1tqXSA9PSByZXN1bHRba10pIHsNCisgICAgICAgICAgdG90YWwgKz0gajsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAocmVzdWx0W21heF0gIT0gKEFMUEhBQkVUX1NUUklORylbdG90YWwgJSA0M10pIHsNCisgICAgICBlID0gQkNFeGNlcHRpb25DaGVja3N1bUV4Y2VwdGlvbjsNCisgICAgICByZXR1cm4gIiI7DQorICAgIH0NCisgICAgcmVzdWx0ID0gcmVzdWx0Lk1pZCgwLCByZXN1bHQuR2V0TGVuZ3RoKCkgLSAxKTsNCisgIH0NCisgIGlmIChyZXN1bHQuR2V0TGVuZ3RoKCkgPT0gMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgcmV0dXJuICIiOw0KKyAgfQ0KKyAgaWYgKG1fZXh0ZW5kZWRNb2RlKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVzdHIgPSBEZWNvZGVFeHRlbmRlZChyZXN1bHQsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgICByZXR1cm4gYnl0ZXN0cjsNCisgIH0gZWxzZSB7DQorICAgIHJldHVybiByZXN1bHQ7DQorICB9DQorfQ0KK0NGWF9JbnQzMkFycmF5KiBDQkNfT25lZENvZGUzOVJlYWRlcjo6RmluZEFzdGVyaXNrUGF0dGVybigNCisgICAgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3Qgd2lkdGggPSByb3ctPkdldFNpemUoKTsNCisgIGludDMyX3Qgcm93T2Zmc2V0ID0gMDsNCisgIHdoaWxlIChyb3dPZmZzZXQgPCB3aWR0aCkgew0KKyAgICBpZiAocm93LT5HZXQocm93T2Zmc2V0KSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHJvd09mZnNldCsrOw0KKyAgfQ0KKyAgaW50MzJfdCBjb3VudGVyUG9zaXRpb24gPSAwOw0KKyAgQ0ZYX0ludDMyQXJyYXkgY291bnRlcnM7DQorICBjb3VudGVycy5TZXRTaXplKDkpOw0KKyAgaW50MzJfdCBwYXR0ZXJuU3RhcnQgPSByb3dPZmZzZXQ7DQorICBGWF9CT09MIGlzV2hpdGUgPSBGQUxTRTsNCisgIGludDMyX3QgcGF0dGVybkxlbmd0aCA9IGNvdW50ZXJzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gcm93T2Zmc2V0OyBpIDwgd2lkdGg7IGkrKykgew0KKyAgICBGWF9CT09MIHBpeGVsID0gcm93LT5HZXQoaSk7DQorICAgIGlmIChwaXhlbCBeIGlzV2hpdGUpIHsNCisgICAgICBjb3VudGVyc1tjb3VudGVyUG9zaXRpb25dKys7DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKGNvdW50ZXJQb3NpdGlvbiA9PSBwYXR0ZXJuTGVuZ3RoIC0gMSkgew0KKyAgICAgICAgaWYgKFRvTmFycm93V2lkZVBhdHRlcm4oJmNvdW50ZXJzKSA9PSBBU1RFUklTS19FTkNPRElORykgew0KKyAgICAgICAgICBGWF9CT09MIGJUMSA9DQorICAgICAgICAgICAgICByb3ctPklzUmFuZ2Uoc3RkOjptYXgoMCwgcGF0dGVyblN0YXJ0IC0gKGkgLSBwYXR0ZXJuU3RhcnQpIC8gMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVyblN0YXJ0LCBGQUxTRSwgZSk7DQorICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgICAgaWYgKGJUMSkgew0KKyAgICAgICAgICAgIENGWF9JbnQzMkFycmF5KiByZXN1bHQgPSBuZXcgQ0ZYX0ludDMyQXJyYXk7DQorICAgICAgICAgICAgcmVzdWx0LT5TZXRTaXplKDIpOw0KKyAgICAgICAgICAgICgqcmVzdWx0KVswXSA9IHBhdHRlcm5TdGFydDsNCisgICAgICAgICAgICAoKnJlc3VsdClbMV0gPSBpOw0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHBhdHRlcm5TdGFydCArPSBjb3VudGVyc1swXSArIGNvdW50ZXJzWzFdOw0KKyAgICAgICAgZm9yIChpbnQzMl90IHkgPSAyOyB5IDwgcGF0dGVybkxlbmd0aDsgeSsrKSB7DQorICAgICAgICAgIGNvdW50ZXJzW3kgLSAyXSA9IGNvdW50ZXJzW3ldOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY291bnRlcnNbcGF0dGVybkxlbmd0aCAtIDJdID0gMDsNCisgICAgICAgIGNvdW50ZXJzW3BhdHRlcm5MZW5ndGggLSAxXSA9IDA7DQorICAgICAgICBjb3VudGVyUG9zaXRpb24tLTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgY291bnRlclBvc2l0aW9uKys7DQorICAgICAgfQ0KKyAgICAgIGNvdW50ZXJzW2NvdW50ZXJQb3NpdGlvbl0gPSAxOw0KKyAgICAgIGlzV2hpdGUgPSAhaXNXaGl0ZTsNCisgICAgfQ0KKyAgfQ0KKyAgZSA9IEJDRXhjZXB0aW9uTm90Rm91bmQ7DQorICByZXR1cm4gTlVMTDsNCit9DQoraW50MzJfdCBDQkNfT25lZENvZGUzOVJlYWRlcjo6VG9OYXJyb3dXaWRlUGF0dGVybihDRlhfSW50MzJBcnJheSogY291bnRlcnMpIHsNCisgIGludDMyX3QgbnVtQ291bnRlcnMgPSBjb3VudGVycy0+R2V0U2l6ZSgpOw0KKyAgaW50MzJfdCBtYXhOYXJyb3dDb3VudGVyID0gMDsNCisgIGludDMyX3Qgd2lkZUNvdW50ZXJzOw0KKyAgZG8gew0KKyN1bmRlZiBtYXgNCisgICAgaW50MzJfdCBtaW5Db3VudGVyID0gRlhTWVNfSW50TWF4Ow0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1Db3VudGVyczsgaSsrKSB7DQorICAgICAgaW50MzJfdCBjb3VudGVyID0gKCpjb3VudGVycylbaV07DQorICAgICAgaWYgKGNvdW50ZXIgPCBtaW5Db3VudGVyICYmIGNvdW50ZXIgPiBtYXhOYXJyb3dDb3VudGVyKSB7DQorICAgICAgICBtaW5Db3VudGVyID0gY291bnRlcjsNCisgICAgICB9DQorICAgIH0NCisgICAgbWF4TmFycm93Q291bnRlciA9IG1pbkNvdW50ZXI7DQorICAgIHdpZGVDb3VudGVycyA9IDA7DQorICAgIGludDMyX3QgdG90YWxXaWRlQ291bnRlcnNXaWR0aCA9IDA7DQorICAgIGludDMyX3QgcGF0dGVybiA9IDA7DQorICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IG51bUNvdW50ZXJzOyBqKyspIHsNCisgICAgICBpbnQzMl90IGNvdW50ZXIgPSAoKmNvdW50ZXJzKVtqXTsNCisgICAgICBpZiAoKCpjb3VudGVycylbal0gPiBtYXhOYXJyb3dDb3VudGVyKSB7DQorICAgICAgICBwYXR0ZXJuIHw9IDEgPDwgKG51bUNvdW50ZXJzIC0gMSAtIGopOw0KKyAgICAgICAgd2lkZUNvdW50ZXJzKys7DQorICAgICAgICB0b3RhbFdpZGVDb3VudGVyc1dpZHRoICs9IGNvdW50ZXI7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmICh3aWRlQ291bnRlcnMgPT0gMykgew0KKyAgICAgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IG51bUNvdW50ZXJzICYmIHdpZGVDb3VudGVycyA+IDA7IGsrKykgew0KKyAgICAgICAgaW50MzJfdCBjb3VudGVyID0gKCpjb3VudGVycylba107DQorICAgICAgICBpZiAoKCpjb3VudGVycylba10gPiBtYXhOYXJyb3dDb3VudGVyKSB7DQorICAgICAgICAgIHdpZGVDb3VudGVycy0tOw0KKyAgICAgICAgICBpZiAoKGNvdW50ZXIgPDwgMSkgPj0gdG90YWxXaWRlQ291bnRlcnNXaWR0aCkgew0KKyAgICAgICAgICAgIHJldHVybiAtMTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICByZXR1cm4gcGF0dGVybjsNCisgICAgfQ0KKyAgfSB3aGlsZSAod2lkZUNvdW50ZXJzID4gMyk7DQorICByZXR1cm4gLTE7DQorfQ0KK0ZYX0NIQVIgQ0JDX09uZWRDb2RlMzlSZWFkZXI6OlBhdHRlcm5Ub0NoYXIoaW50MzJfdCBwYXR0ZXJuLCBpbnQzMl90JiBlKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA0NDsgaSsrKSB7DQorICAgIGlmIChDSEFSQUNURVJfRU5DT0RJTkdTW2ldID09IHBhdHRlcm4pIHsNCisgICAgICByZXR1cm4gKEFMUEhBQkVUX1NUUklORylbaV07DQorICAgIH0NCisgIH0NCisgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgcmV0dXJuIDA7DQorfQ0KK0NGWF9CeXRlU3RyaW5nIENCQ19PbmVkQ29kZTM5UmVhZGVyOjpEZWNvZGVFeHRlbmRlZChDRlhfQnl0ZVN0cmluZyYgZW5jb2RlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBsZW5ndGggPSBlbmNvZGVkLkdldExlbmd0aCgpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgZGVjb2RlZDsNCisgIEZYX0NIQVIgYywgbmV4dDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQorICAgIGMgPSBlbmNvZGVkW2ldOw0KKyAgICBpZiAoYyA9PSAnKycgfHwgYyA9PSAnJCcgfHwgYyA9PSAnJScgfHwgYyA9PSAnLycpIHsNCisgICAgICBuZXh0ID0gZW5jb2RlZFtpICsgMV07DQorICAgICAgRlhfQ0hBUiBkZWNvZGVkQ2hhciA9ICdcMCc7DQorICAgICAgc3dpdGNoIChjKSB7DQorICAgICAgICBjYXNlICcrJzoNCisgICAgICAgICAgaWYgKG5leHQgPj0gJ0EnICYmIG5leHQgPD0gJ1onKSB7DQorICAgICAgICAgICAgZGVjb2RlZENoYXIgPSAoRlhfQ0hBUikobmV4dCArIDMyKTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgICAgICAgcmV0dXJuICIiOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAnJCc6DQorICAgICAgICAgIGlmIChuZXh0ID49ICdBJyAmJiBuZXh0IDw9ICdaJykgew0KKyAgICAgICAgICAgIGRlY29kZWRDaGFyID0gKEZYX0NIQVIpKG5leHQgLSA2NCk7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICAgICAgICAgIHJldHVybiAiIjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgJyUnOg0KKyAgICAgICAgICBpZiAobmV4dCA+PSAnQScgJiYgbmV4dCA8PSAnRScpIHsNCisgICAgICAgICAgICBkZWNvZGVkQ2hhciA9IChGWF9DSEFSKShuZXh0IC0gMzgpOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKG5leHQgPj0gJ0YnICYmIG5leHQgPD0gJ0onKSB7DQorICAgICAgICAgICAgZGVjb2RlZENoYXIgPSAoRlhfQ0hBUikobmV4dCAtIDExKTsNCisgICAgICAgICAgfSBlbHNlIGlmIChuZXh0ID49ICdLJyAmJiBuZXh0IDw9ICdPJyAmJiBuZXh0ICE9ICdNJyAmJiBuZXh0ICE9ICdOJykgew0KKyAgICAgICAgICAgIGRlY29kZWRDaGFyID0gKEZYX0NIQVIpKG5leHQgKyAxNik7DQorICAgICAgICAgIH0gZWxzZSBpZiAobmV4dCA+PSAnUCcgJiYgbmV4dCA8PSAnUycpIHsNCisgICAgICAgICAgICBkZWNvZGVkQ2hhciA9IChGWF9DSEFSKShuZXh0ICsgNDMpOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKG5leHQgPT0gJ1UnKSB7DQorICAgICAgICAgICAgZGVjb2RlZENoYXIgPSAoRlhfQ0hBUikwOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKG5leHQgPT0gJ1YnKSB7DQorICAgICAgICAgICAgZGVjb2RlZENoYXIgPSAoRlhfQ0hBUik2NDsNCisgICAgICAgICAgfSBlbHNlIGlmIChuZXh0ID09ICdXJykgew0KKyAgICAgICAgICAgIGRlY29kZWRDaGFyID0gKEZYX0NIQVIpOTY7DQorICAgICAgICAgIH0gZWxzZSBpZiAobmV4dCA9PSAnVCcgfHwgbmV4dCA9PSAnWCcgfHwgbmV4dCA9PSAnWScgfHwgbmV4dCA9PSAnWicpIHsNCisgICAgICAgICAgICBkZWNvZGVkQ2hhciA9IChGWF9DSEFSKTEyNzsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgICAgICAgcmV0dXJuICIiOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAnLyc6DQorICAgICAgICAgIGlmIChuZXh0ID49ICdBJyAmJiBuZXh0IDw9ICdPJykgew0KKyAgICAgICAgICAgIGRlY29kZWRDaGFyID0gKEZYX0NIQVIpKG5leHQgLSAzMik7DQorICAgICAgICAgIH0gZWxzZSBpZiAobmV4dCA9PSAnWicpIHsNCisgICAgICAgICAgICBkZWNvZGVkQ2hhciA9ICc6JzsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247DQorICAgICAgICAgICAgcmV0dXJuICIiOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBkZWNvZGVkICs9IGRlY29kZWRDaGFyOw0KKyAgICAgIGkrKzsNCisgICAgfSBlbHNlIHsNCisgICAgICBkZWNvZGVkICs9IGM7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBkZWNvZGVkOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlSZWFkZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUzOVJlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YmM2M2QKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlSZWFkZXIuaApAQCAtMCwwICsxLDM1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX09ORURDT0RBMzlSRUFERVJfSF8NCisjZGVmaW5lIF9CQ19PTkVEQ09EQTM5UkVBREVSX0hfDQorY2xhc3MgQ0JDX09uZURSZWFkZXI7DQorY2xhc3MgQ0JDX0NvbW1vbkJpdEFycmF5Ow0KK2NsYXNzIENCQ19PbmVkQ29kYTM5UmVhZGVyOw0KK2NsYXNzIENCQ19PbmVkQ29kZTM5UmVhZGVyIDogcHVibGljIENCQ19PbmVEUmVhZGVyIHsNCisgcHVibGljOg0KKyAgc3RhdGljIGNvbnN0IEZYX0NIQVIqIEFMUEhBQkVUX1NUUklORzsNCisgIHN0YXRpYyBjb25zdCBGWF9DSEFSKiBDSEVDS1NVTV9TVFJJTkc7DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBDSEFSQUNURVJfRU5DT0RJTkdTWzQ0XTsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IEFTVEVSSVNLX0VOQ09ESU5HOw0KKyAgQ0JDX09uZWRDb2RlMzlSZWFkZXIoKTsNCisgIENCQ19PbmVkQ29kZTM5UmVhZGVyKEZYX0JPT0wgdXNpbmdDaGVja0RpZ2l0KTsNCisgIENCQ19PbmVkQ29kZTM5UmVhZGVyKEZYX0JPT0wgdXNpbmdDaGVja0RpZ2l0LCBGWF9CT09MIGV4dGVuZGVkTW9kZSk7DQorICB2aXJ0dWFsIH5DQkNfT25lZENvZGUzOVJlYWRlcigpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlUm93KGludDMyX3Qgcm93TnVtYmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorDQorIHByaXZhdGU6DQorICBGWF9CT09MIG1fdXNpbmdDaGVja0RpZ2l0Ow0KKyAgRlhfQk9PTCBtX2V4dGVuZGVkTW9kZTsNCisgIENGWF9JbnQzMkFycmF5KiBGaW5kQXN0ZXJpc2tQYXR0ZXJuKENCQ19Db21tb25CaXRBcnJheSogcm93LCBpbnQzMl90JiBlKTsNCisgIGludDMyX3QgVG9OYXJyb3dXaWRlUGF0dGVybihDRlhfSW50MzJBcnJheSogY291bnRlcnMpOw0KKyAgRlhfQ0hBUiBQYXR0ZXJuVG9DaGFyKGludDMyX3QgcGF0dGVybiwgaW50MzJfdCYgZSk7DQorICBDRlhfQnl0ZVN0cmluZyBEZWNvZGVFeHRlbmRlZChDRlhfQnl0ZVN0cmluZyYgZW5jb2RlZCwgaW50MzJfdCYgZSk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlXcml0ZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTM5V3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTBjZGUxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTM5V3JpdGVyLmNwcApAQCAtMCwwICsxLDM2NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAxMCBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1dyaXRlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19SZWFkZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJCQ19PbmVEUmVhZGVyLmgiDQorI2luY2x1ZGUgIkJDX09uZURpbVdyaXRlci5oIg0KKyNpbmNsdWRlICJCQ19PbmVkQ29kZTM5UmVhZGVyLmgiDQorI2luY2x1ZGUgIkJDX09uZWRDb2RlMzlXcml0ZXIuaCINCitDQkNfT25lZENvZGUzOVdyaXRlcjo6Q0JDX09uZWRDb2RlMzlXcml0ZXIoKSB7DQorICBtX2V4dGVuZGVkTW9kZSA9IEZBTFNFOw0KKyAgbV9pV2lkZU5hcnJSYXRpbyA9IDM7DQorfQ0KK0NCQ19PbmVkQ29kZTM5V3JpdGVyOjpDQkNfT25lZENvZGUzOVdyaXRlcihGWF9CT09MIGV4dGVuZGVkTW9kZSkgew0KKyAgbV9pV2lkZU5hcnJSYXRpbyA9IDM7DQorICBtX2V4dGVuZGVkTW9kZSA9IGV4dGVuZGVkTW9kZTsNCit9DQorQ0JDX09uZWRDb2RlMzlXcml0ZXI6On5DQkNfT25lZENvZGUzOVdyaXRlcigpIHt9DQorRlhfQk9PTCBDQkNfT25lZENvZGUzOVdyaXRlcjo6Q2hlY2tDb250ZW50VmFsaWRpdHkoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIHsNCisgIGlmIChtX2V4dGVuZGVkTW9kZSkgew0KKyAgICByZXR1cm4gQ2hlY2tFeHRlbmRlZENvbnRlbnRWYWxpZGl0eShjb250ZW50cyk7DQorICB9DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7DQorICAgIEZYX1dDSEFSIGNoID0gY29udGVudHMuR2V0QXQoaSk7DQorICAgIGlmICgoY2ggPj0gKEZYX1dDSEFSKScwJyAmJiBjaCA8PSAoRlhfV0NIQVIpJzknKSB8fA0KKyAgICAgICAgKGNoID49IChGWF9XQ0hBUiknQScgJiYgY2ggPD0gKEZYX1dDSEFSKSdaJykgfHwgY2ggPT0gKEZYX1dDSEFSKSctJyB8fA0KKyAgICAgICAgY2ggPT0gKEZYX1dDSEFSKScuJyB8fCBjaCA9PSAoRlhfV0NIQVIpJyAnIHx8IGNoID09IChGWF9XQ0hBUiknKicgfHwNCisgICAgICAgIGNoID09IChGWF9XQ0hBUiknJCcgfHwgY2ggPT0gKEZYX1dDSEFSKScvJyB8fCBjaCA9PSAoRlhfV0NIQVIpJysnIHx8DQorICAgICAgICBjaCA9PSAoRlhfV0NIQVIpJyUnKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ0JDX09uZWRDb2RlMzlXcml0ZXI6OkNoZWNrRXh0ZW5kZWRDb250ZW50VmFsaWRpdHkoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpOyBpKyspIHsNCisgICAgRlhfV0NIQVIgY2ggPSBjb250ZW50cy5HZXRBdChpKTsNCisgICAgaWYgKGNoID4gMTI3KSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX09uZWRDb2RlMzlXcml0ZXI6OkZpbHRlckNvbnRlbnRzKA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7DQorICBpZiAobV9leHRlbmRlZE1vZGUpIHsNCisgICAgcmV0dXJuIEZpbHRlckV4dGVuZGVkQ29udGVudHMoY29udGVudHMpOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgZmlsdGVyY29udGVudHM7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7DQorICAgIEZYX1dDSEFSIGNoID0gY29udGVudHMuR2V0QXQoaSk7DQorICAgIGlmIChjaCA9PSAoRlhfV0NIQVIpJyonICYmIChpID09IDAgfHwgaSA9PSBjb250ZW50cy5HZXRMZW5ndGgoKSAtIDEpKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKGNoID4gMTc1KSB7DQorICAgICAgaSsrOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGNoID0gVXBwZXIoY2gpOw0KKyAgICB9DQorICAgIGlmICgoY2ggPj0gKEZYX1dDSEFSKScwJyAmJiBjaCA8PSAoRlhfV0NIQVIpJzknKSB8fA0KKyAgICAgICAgKGNoID49IChGWF9XQ0hBUiknQScgJiYgY2ggPD0gKEZYX1dDSEFSKSdaJykgfHwgY2ggPT0gKEZYX1dDSEFSKSctJyB8fA0KKyAgICAgICAgY2ggPT0gKEZYX1dDSEFSKScuJyB8fCBjaCA9PSAoRlhfV0NIQVIpJyAnIHx8IGNoID09IChGWF9XQ0hBUiknKicgfHwNCisgICAgICAgIGNoID09IChGWF9XQ0hBUiknJCcgfHwgY2ggPT0gKEZYX1dDSEFSKScvJyB8fCBjaCA9PSAoRlhfV0NIQVIpJysnIHx8DQorICAgICAgICBjaCA9PSAoRlhfV0NIQVIpJyUnKSB7DQorICAgICAgZmlsdGVyY29udGVudHMgKz0gY2g7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBmaWx0ZXJjb250ZW50czsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX09uZWRDb2RlMzlXcml0ZXI6OkZpbHRlckV4dGVuZGVkQ29udGVudHMoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIHsNCisgIENGWF9XaWRlU3RyaW5nIGZpbHRlcmNvbnRlbnRzOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGkrKykgew0KKyAgICBGWF9XQ0hBUiBjaCA9IGNvbnRlbnRzLkdldEF0KGkpOw0KKyAgICBpZiAoY2ggPT0gKEZYX1dDSEFSKScqJyAmJiAoaSA9PSAwIHx8IGkgPT0gY29udGVudHMuR2V0TGVuZ3RoKCkgLSAxKSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChjaCA+IDE3NSkgew0KKyAgICAgIGkrKzsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAoY2ggPiAxMjcgJiYgY2ggPCAxNzYpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAoY2ggPT0gMCkgew0KKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICclJzsNCisgICAgICBmaWx0ZXJjb250ZW50cyArPSAnVSc7DQorICAgIH0gZWxzZSBpZiAoY2ggPj0gMSAmJiBjaCA8PSAyNikgew0KKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICckJzsNCisgICAgICBmaWx0ZXJjb250ZW50cyArPSAoY2ggKyA2NCk7DQorICAgIH0gZWxzZSBpZiAoY2ggPj0gMjcgJiYgY2ggPD0gMzEpIHsNCisgICAgICBmaWx0ZXJjb250ZW50cyArPSAnJSc7DQorICAgICAgZmlsdGVyY29udGVudHMgKz0gKGNoICsgMzgpOw0KKyAgICB9IGVsc2UgaWYgKGNoID49IDMzICYmIGNoIDw9IDQ3ICYmIGNoICE9IDQ1ICYmIGNoICE9IDQ2KSB7DQorICAgICAgZmlsdGVyY29udGVudHMgKz0gJy8nOw0KKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9IChjaCArIDMyKTsNCisgICAgfSBlbHNlIGlmIChjaCA9PSA1OCkgew0KKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICcvJzsNCisgICAgICBmaWx0ZXJjb250ZW50cyArPSAnWic7DQorICAgIH0gZWxzZSBpZiAoY2ggPj0gNTkgJiYgY2ggPD0gNjMpIHsNCisgICAgICBmaWx0ZXJjb250ZW50cyArPSAnJSc7DQorICAgICAgZmlsdGVyY29udGVudHMgKz0gY2ggKyAxMTsNCisgICAgfSBlbHNlIGlmIChjaCA9PSA2NCkgew0KKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICclJzsNCisgICAgICBmaWx0ZXJjb250ZW50cyArPSAnVic7DQorICAgIH0gZWxzZSBpZiAoY2ggPj0gOTEgJiYgY2ggPD0gOTUpIHsNCisgICAgICBmaWx0ZXJjb250ZW50cyArPSAnJSc7DQorICAgICAgZmlsdGVyY29udGVudHMgKz0gY2ggLSAxNjsNCisgICAgfSBlbHNlIGlmIChjaCA9PSA5Nikgew0KKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICclJzsNCisgICAgICBmaWx0ZXJjb250ZW50cyArPSAnVyc7DQorICAgIH0gZWxzZSBpZiAoY2ggPj0gOTcgJiYgY2ggPD0gMTIyKSB7DQorICAgICAgZmlsdGVyY29udGVudHMgKz0gJysnOw0KKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoIC0gMzI7DQorICAgIH0gZWxzZSBpZiAoY2ggPj0gMTIzICYmIGNoIDw9IDEyNikgew0KKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICclJzsNCisgICAgICBmaWx0ZXJjb250ZW50cyArPSBjaCAtIDQzOw0KKyAgICB9IGVsc2UgaWYgKGNoID09IDEyNykgew0KKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9ICclJzsNCisgICAgICBmaWx0ZXJjb250ZW50cyArPSAnVCc7DQorICAgIH0gZWxzZSB7DQorICAgICAgZmlsdGVyY29udGVudHMgKz0gY2g7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBmaWx0ZXJjb250ZW50czsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX09uZWRDb2RlMzlXcml0ZXI6OlJlbmRlclRleHRDb250ZW50cygNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgew0KKyAgaWYgKG1fZXh0ZW5kZWRNb2RlKSB7DQorICAgIHJldHVybiBSZW5kZXJFeHRlbmRlZFRleHRDb250ZW50cyhjb250ZW50cyk7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyByZW5kZXJDb250ZW50czsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpOyBpKyspIHsNCisgICAgRlhfV0NIQVIgY2ggPSBjb250ZW50cy5HZXRBdChpKTsNCisgICAgaWYgKGNoID09IChGWF9XQ0hBUiknKicgJiYgKGkgPT0gMCB8fCBpID09IGNvbnRlbnRzLkdldExlbmd0aCgpIC0gMSkpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAoY2ggPiAxNzUpIHsNCisgICAgICBpKys7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKChjaCA+PSAoRlhfV0NIQVIpJzAnICYmIGNoIDw9IChGWF9XQ0hBUiknOScpIHx8DQorICAgICAgICAoY2ggPj0gKEZYX1dDSEFSKSdBJyAmJiBjaCA8PSAoRlhfV0NIQVIpJ1onKSB8fA0KKyAgICAgICAgKGNoID49IChGWF9XQ0hBUiknYScgJiYgY2ggPD0gKEZYX1dDSEFSKSd6JykgfHwgY2ggPT0gKEZYX1dDSEFSKSctJyB8fA0KKyAgICAgICAgY2ggPT0gKEZYX1dDSEFSKScuJyB8fCBjaCA9PSAoRlhfV0NIQVIpJyAnIHx8IGNoID09IChGWF9XQ0hBUiknKicgfHwNCisgICAgICAgIGNoID09IChGWF9XQ0hBUiknJCcgfHwgY2ggPT0gKEZYX1dDSEFSKScvJyB8fCBjaCA9PSAoRlhfV0NIQVIpJysnIHx8DQorICAgICAgICBjaCA9PSAoRlhfV0NIQVIpJyUnKSB7DQorICAgICAgcmVuZGVyQ29udGVudHMgKz0gY2g7DQorICAgIH0NCisgIH0NCisgIHJldHVybiByZW5kZXJDb250ZW50czsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX09uZWRDb2RlMzlXcml0ZXI6OlJlbmRlckV4dGVuZGVkVGV4dENvbnRlbnRzKA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7DQorICBDRlhfV2lkZVN0cmluZyByZW5kZXJDb250ZW50czsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpOyBpKyspIHsNCisgICAgRlhfV0NIQVIgY2ggPSBjb250ZW50cy5HZXRBdChpKTsNCisgICAgaWYgKGNoID09IChGWF9XQ0hBUiknKicgJiYgKGkgPT0gMCB8fCBpID09IGNvbnRlbnRzLkdldExlbmd0aCgpIC0gMSkpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAoY2ggPiAxNzUpIHsNCisgICAgICBpKys7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKGNoID4gMTI3ICYmIGNoIDwgMTc2KSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgcmVuZGVyQ29udGVudHMgKz0gY2g7DQorICB9DQorICByZXR1cm4gcmVuZGVyQ29udGVudHM7DQorfQ0KK0ZYX0JPT0wgQ0JDX09uZWRDb2RlMzlXcml0ZXI6OlNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbikgew0KKyAgaWYgKGxvY2F0aW9uIDwgQkNfVEVYVF9MT0NfTk9ORSB8fCBsb2NhdGlvbiA+IEJDX1RFWFRfTE9DX0JFTE9XRU1CRUQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9sb2NUZXh0TG9jID0gbG9jYXRpb247DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDQkNfT25lZENvZGUzOVdyaXRlcjo6U2V0V2lkZU5hcnJvd1JhdGlvKGludDMyX3QgcmF0aW8pIHsNCisgIGlmIChyYXRpbyA8IDIgfHwgcmF0aW8gPiAzKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIG1faVdpZGVOYXJyUmF0aW8gPSByYXRpbzsNCisgIHJldHVybiBUUlVFOw0KK30NCit1aW50OF90KiBDQkNfT25lZENvZGUzOVdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgdWludDhfdCogcmV0ID0gRW5jb2RlKGNvbnRlbnRzLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIDAsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIHJldDsNCit9DQordWludDhfdCogQ0JDX09uZWRDb2RlMzlXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoZm9ybWF0ICE9IEJDRk9STUFUX0NPREVfMzkpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uT25seUVuY29kZUNPREVfMzk7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgdWludDhfdCogcmV0ID0NCisgICAgICBDQkNfT25lRGltV3JpdGVyOjpFbmNvZGUoY29udGVudHMsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgaGludHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIHJldDsNCit9DQordm9pZCBDQkNfT25lZENvZGUzOVdyaXRlcjo6VG9JbnRBcnJheShpbnQzMl90IGEsIGludDMyX3QqIHRvUmV0dXJuKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA5OyBpKyspIHsNCisgICAgdG9SZXR1cm5baV0gPSAoYSAmICgxIDw8IGkpKSA9PSAwID8gMSA6IG1faVdpZGVOYXJyUmF0aW87DQorICB9DQorfQ0KK0ZYX0NIQVIgQ0JDX09uZWRDb2RlMzlXcml0ZXI6OkNhbGNDaGVja1N1bShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3QgbGVuZ3RoID0gY29udGVudHMuR2V0TGVuZ3RoKCk7DQorICBpZiAobGVuZ3RoID4gODApIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uQ29udGVudHNMZW5ndGhTaG91bGRCZXR3ZWVuMWFuZDgwOw0KKyAgICByZXR1cm4gJyonOw0KKyAgfQ0KKyAgaW50MzJfdCBjaGVja3N1bSA9IDA7DQorICBpbnQzMl90IGxlbiA9IChpbnQzMl90KXN0cmxlbihDQkNfT25lZENvZGUzOVJlYWRlcjo6QUxQSEFCRVRfU1RSSU5HKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpOyBpKyspIHsNCisgICAgaW50MzJfdCBqID0gMDsNCisgICAgZm9yICg7IGogPCBsZW47IGorKykgew0KKyAgICAgIGlmIChDQkNfT25lZENvZGUzOVJlYWRlcjo6QUxQSEFCRVRfU1RSSU5HW2pdID09IGNvbnRlbnRzW2ldKSB7DQorICAgICAgICBpZiAoY29udGVudHNbaV0gIT0gJyonKSB7DQorICAgICAgICAgIGNoZWNrc3VtICs9IGo7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChqID49IGxlbikgew0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvblVuU3VwcG9ydGVkU3RyaW5nOw0KKyAgICAgIHJldHVybiAnKic7DQorICAgIH0NCisgIH0NCisgIGNoZWNrc3VtID0gY2hlY2tzdW0gJSA0MzsNCisgIHJldHVybiBDQkNfT25lZENvZGUzOVJlYWRlcjo6Q0hFQ0tTVU1fU1RSSU5HW2NoZWNrc3VtXTsNCit9DQordWludDhfdCogQ0JDX09uZWRDb2RlMzlXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRsZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBGWF9DSEFSIGNoZWNrc3VtID0gQ2FsY0NoZWNrU3VtKGNvbnRlbnRzLCBlKTsNCisgIGlmIChjaGVja3N1bSA9PSAnKicpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpbnQzMl90IHdpZHRoc1s5XSA9IHswfTsNCisgIGludDMyX3Qgd2lkZVN0cmlkZU51bSA9IDM7DQorICBpbnQzMl90IG5hcnJTdHJpZGVOdW0gPSA5IC0gd2lkZVN0cmlkZU51bTsNCisgIENGWF9CeXRlU3RyaW5nIGVuY29kZWRDb250ZW50cyA9IGNvbnRlbnRzOw0KKyAgaWYgKG1fYkNhbGNDaGVja3N1bSkgew0KKyAgICBlbmNvZGVkQ29udGVudHMgKz0gY2hlY2tzdW07DQorICB9DQorICBtX2lDb250ZW50TGVuID0gZW5jb2RlZENvbnRlbnRzLkdldExlbmd0aCgpOw0KKyAgaW50MzJfdCBjb2RlV2lkdGggPSAod2lkZVN0cmlkZU51bSAqIG1faVdpZGVOYXJyUmF0aW8gKyBuYXJyU3RyaWRlTnVtKSAqIDIgKw0KKyAgICAgICAgICAgICAgICAgICAgICAxICsgbV9pQ29udGVudExlbjsNCisgIGludDMyX3QgbGVuID0gKGludDMyX3Qpc3RybGVuKENCQ19PbmVkQ29kZTM5UmVhZGVyOjpBTFBIQUJFVF9TVFJJTkcpOw0KKyAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgbV9pQ29udGVudExlbjsgaisrKSB7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7DQorICAgICAgaWYgKENCQ19PbmVkQ29kZTM5UmVhZGVyOjpBTFBIQUJFVF9TVFJJTkdbaV0gPT0gZW5jb2RlZENvbnRlbnRzW2pdKSB7DQorICAgICAgICBUb0ludEFycmF5KENCQ19PbmVkQ29kZTM5UmVhZGVyOjpDSEFSQUNURVJfRU5DT0RJTkdTW2ldLCB3aWR0aHMpOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgOTsgaysrKSB7DQorICAgICAgICAgIGNvZGVXaWR0aCArPSB3aWR0aHNba107DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBvdXRsZW5ndGggPSBjb2RlV2lkdGg7DQorICB1aW50OF90KiByZXN1bHQgPSBGWF9BbGxvYyh1aW50OF90LCBjb2RlV2lkdGgpOw0KKyAgVG9JbnRBcnJheShDQkNfT25lZENvZGUzOVJlYWRlcjo6Q0hBUkFDVEVSX0VOQ09ESU5HU1szOV0sIHdpZHRocyk7DQorICBpbnQzMl90IHBvcyA9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCAwLCB3aWR0aHMsIDksIDEsIGUpOw0KKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICBGWF9GcmVlKHJlc3VsdCk7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaW50MzJfdCBuYXJyb3dXaGl0ZVtdID0gezF9Ow0KKyAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIG5hcnJvd1doaXRlLCAxLCAwLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgRlhfRnJlZShyZXN1bHQpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGZvciAoaW50MzJfdCBsID0gbV9pQ29udGVudExlbiAtIDE7IGwgPj0gMDsgbC0tKSB7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7DQorICAgICAgaWYgKENCQ19PbmVkQ29kZTM5UmVhZGVyOjpBTFBIQUJFVF9TVFJJTkdbaV0gPT0gZW5jb2RlZENvbnRlbnRzW2xdKSB7DQorICAgICAgICBUb0ludEFycmF5KENCQ19PbmVkQ29kZTM5UmVhZGVyOjpDSEFSQUNURVJfRU5DT0RJTkdTW2ldLCB3aWR0aHMpOw0KKyAgICAgICAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIHdpZHRocywgOSwgMSwgZSk7DQorICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICAgIEZYX0ZyZWUocmVzdWx0KTsNCisgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIHBvcyArPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdCwgcG9zLCBuYXJyb3dXaGl0ZSwgMSwgMCwgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICBGWF9GcmVlKHJlc3VsdCk7DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgIH0NCisgIFRvSW50QXJyYXkoQ0JDX09uZWRDb2RlMzlSZWFkZXI6OkNIQVJBQ1RFUl9FTkNPRElOR1NbMzldLCB3aWR0aHMpOw0KKyAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIHdpZHRocywgOSwgMSwgZSk7DQorICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgIEZYX0ZyZWUocmVzdWx0KTsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb2RlV2lkdGggLyAyOyBpKyspIHsNCisgICAgcmVzdWx0W2ldIF49IHJlc3VsdFtjb2RlV2lkdGggLSAxIC0gaV07DQorICAgIHJlc3VsdFtjb2RlV2lkdGggLSAxIC0gaV0gXj0gcmVzdWx0W2ldOw0KKyAgICByZXN1bHRbaV0gXj0gcmVzdWx0W2NvZGVXaWR0aCAtIDEgLSBpXTsNCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19PbmVkQ29kZTM5V3JpdGVyOjplbmNvZGVkQ29udGVudHMoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9XaWRlU3RyaW5nIGVuY29kZWRDb250ZW50cyA9IGNvbnRlbnRzOw0KKyAgaWYgKG1fYkNhbGNDaGVja3N1bSAmJiBtX2JQcmludENoZWNrc3VtKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIGNoZWNrc3VtQ29udGVudCA9IEZpbHRlckNvbnRlbnRzKGNvbnRlbnRzKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gY2hlY2tzdW1Db250ZW50LlVURjhFbmNvZGUoKTsNCisgICAgRlhfQ0hBUiBjaGVja3N1bTsNCisgICAgY2hlY2tzdW0gPSBDYWxjQ2hlY2tTdW0oc3RyLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZYX1dTVFJDKEwiIikpOw0KKyAgICBzdHIgKz0gY2hlY2tzdW07DQorICAgIGVuY29kZWRDb250ZW50cyArPSBjaGVja3N1bTsNCisgIH0NCisgIHJldHVybiBlbmNvZGVkQ29udGVudHM7DQorfQ0KK3ZvaWQgQ0JDX09uZWRDb2RlMzlXcml0ZXI6OlJlbmRlclJlc3VsdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9XaWRlU3RyaW5nIGVuY29kZWRDb24gPSBlbmNvZGVkQ29udGVudHMoY29udGVudHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBDQkNfT25lRGltV3JpdGVyOjpSZW5kZXJSZXN1bHQoZW5jb2RlZENvbiwgY29kZSwgY29kZUxlbmd0aCwgaXNEZXZpY2UsIGUpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlXcml0ZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUzOVdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MDhlYzgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlXcml0ZXIuaApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX09ORURDT0RBMzlXUklURVJfSF8NCisjZGVmaW5lIF9CQ19PTkVEQ09EQTM5V1JJVEVSX0hfDQorZW51bSBCQ19URVhUX0xPQzsNCitjbGFzcyBDQkNfT25lRGltV3JpdGVyOw0KK2NsYXNzIENCQ19PbmVkQ29kYTM5V3JpdGVyOw0KK2NsYXNzIENCQ19PbmVkQ29kZTM5V3JpdGVyIDogcHVibGljIENCQ19PbmVEaW1Xcml0ZXIgew0KKyBwdWJsaWM6DQorICBDQkNfT25lZENvZGUzOVdyaXRlcigpOw0KKyAgQ0JDX09uZWRDb2RlMzlXcml0ZXIoRlhfQk9PTCBleHRlbmRlZE1vZGUpOw0KKyAgdmlydHVhbCB+Q0JDX09uZWRDb2RlMzlXcml0ZXIoKTsNCisgIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICB2b2lkIFJlbmRlclJlc3VsdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29kZSwNCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIENGWF9XaWRlU3RyaW5nIGVuY29kZWRDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLCBpbnQzMl90JiBlKTsNCisgIEZYX0JPT0wgQ2hlY2tDb250ZW50VmFsaWRpdHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7DQorICBGWF9CT09MIENoZWNrRXh0ZW5kZWRDb250ZW50VmFsaWRpdHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7DQorICBDRlhfV2lkZVN0cmluZyBGaWx0ZXJDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsNCisgIENGWF9XaWRlU3RyaW5nIEZpbHRlckV4dGVuZGVkQ29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7DQorICBDRlhfV2lkZVN0cmluZyBSZW5kZXJUZXh0Q29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7DQorICBDRlhfV2lkZVN0cmluZyBSZW5kZXJFeHRlbmRlZFRleHRDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsNCisgIEZYX0JPT0wgU2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY3Rpb24pOw0KKyAgRlhfQk9PTCBTZXRXaWRlTmFycm93UmF0aW8oaW50MzJfdCByYXRpbyk7DQorDQorIHByaXZhdGU6DQorICB2b2lkIFRvSW50QXJyYXkoaW50MzJfdCBhLCBpbnQzMl90KiB0b1JldHVybik7DQorICBGWF9DSEFSIENhbGNDaGVja1N1bShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsIGludDMyX3QmIGUpOw0KKyAgaW50MzJfdCBtX2lXaWRlTmFyclJhdGlvOw0KKyAgRlhfQk9PTCBtX2V4dGVuZGVkTW9kZTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjEzUmVhZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjEzUmVhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODIyYzNjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNSZWFkZXIuY3BwCkBAIC0wLDAgKzEsOTcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDggWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19SZWFkZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdEFycmF5LmgiDQorI2luY2x1ZGUgIkJDX09uZURSZWFkZXIuaCINCisjaW5jbHVkZSAiQkNfT25lRGltUmVhZGVyLmgiDQorI2luY2x1ZGUgIkJDX09uZWRFQU4xM1JlYWRlci5oIg0KK2NvbnN0IGludDMyX3QgQ0JDX09uZWRFQU4xM1JlYWRlcjo6RklSU1RfRElHSVRfRU5DT0RJTkdTWzEwXSA9IHsNCisgICAgMHgwMCwgMHgwQiwgMHgwRCwgMHhFLCAweDEzLCAweDE5LCAweDFDLCAweDE1LCAweDE2LCAweDFBfTsNCitDQkNfT25lZEVBTjEzUmVhZGVyOjpDQkNfT25lZEVBTjEzUmVhZGVyKCkge30NCitDQkNfT25lZEVBTjEzUmVhZGVyOjp+Q0JDX09uZWRFQU4xM1JlYWRlcigpIHt9DQordm9pZCBDQkNfT25lZEVBTjEzUmVhZGVyOjpEZXRlcm1pbmVGaXJzdERpZ2l0KENGWF9CeXRlU3RyaW5nJiByZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbGdQYXR0ZXJuRm91bmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGZvciAoaW50MzJfdCBkID0gMDsgZCA8IDEwOyBkKyspIHsNCisgICAgaWYgKGxnUGF0dGVybkZvdW5kID09IEZJUlNUX0RJR0lUX0VOQ09ESU5HU1tkXSkgew0KKyAgICAgIHJlc3VsdC5JbnNlcnQoMCwgKEZYX0NIQVIpKCcwJyArIGQpKTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgIH0NCisgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorfQ0KK2ludDMyX3QgQ0JDX09uZWRFQU4xM1JlYWRlcjo6RGVjb2RlTWlkZGxlKENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5KiBzdGFydFJhbmdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHRTdHJpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX0ludDMyQXJyYXkgY291bnRlcnM7DQorICBjb3VudGVycy5BZGQoMCk7DQorICBjb3VudGVycy5BZGQoMCk7DQorICBjb3VudGVycy5BZGQoMCk7DQorICBjb3VudGVycy5BZGQoMCk7DQorICBpbnQzMl90IGVuZCA9IHJvdy0+R2V0U2l6ZSgpOw0KKyAgaW50MzJfdCByb3dPZmZzZXQgPSAoKnN0YXJ0UmFuZ2UpWzFdOw0KKyAgaW50MzJfdCBsZ1BhdHRlcm5Gb3VuZCA9IDA7DQorICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCA2ICYmIHJvd09mZnNldCA8IGVuZDsgeCsrKSB7DQorICAgIGludDMyX3QgYmVzdE1hdGNoID0NCisgICAgICAgIERlY29kZURpZ2l0KHJvdywgJmNvdW50ZXJzLCByb3dPZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAmKENCQ19PbmVEaW1SZWFkZXI6OkxfQU5EX0dfUEFUVEVSTlNbMF1bMF0pLCAyMCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCisgICAgcmVzdWx0U3RyaW5nICs9IChGWF9DSEFSKSgnMCcgKyBiZXN0TWF0Y2ggJSAxMCk7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvdW50ZXJzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgcm93T2Zmc2V0ICs9IGNvdW50ZXJzW2ldOw0KKyAgICB9DQorICAgIGlmIChiZXN0TWF0Y2ggPj0gMTApIHsNCisgICAgICBsZ1BhdHRlcm5Gb3VuZCB8PSAxIDw8ICg1IC0geCk7DQorICAgIH0NCisgIH0NCisgIERldGVybWluZUZpcnN0RGlnaXQocmVzdWx0U3RyaW5nLCBsZ1BhdHRlcm5Gb3VuZCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICBDRlhfSW50MzJBcnJheSByZXN1bHQ7DQorICByZXN1bHQuQWRkKENCQ19PbmVEaW1SZWFkZXI6Ok1JRERMRV9QQVRURVJOWzBdKTsNCisgIHJlc3VsdC5BZGQoQ0JDX09uZURpbVJlYWRlcjo6TUlERExFX1BBVFRFUk5bMV0pOw0KKyAgcmVzdWx0LkFkZChDQkNfT25lRGltUmVhZGVyOjpNSURETEVfUEFUVEVSTlsyXSk7DQorICByZXN1bHQuQWRkKENCQ19PbmVEaW1SZWFkZXI6Ok1JRERMRV9QQVRURVJOWzNdKTsNCisgIHJlc3VsdC5BZGQoQ0JDX09uZURpbVJlYWRlcjo6TUlERExFX1BBVFRFUk5bNF0pOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIG1pZGRsZVJhbmdlID0NCisgICAgICBGaW5kR3VhcmRQYXR0ZXJuKHJvdywgcm93T2Zmc2V0LCBUUlVFLCAmcmVzdWx0LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCisgIHJvd09mZnNldCA9ICgqbWlkZGxlUmFuZ2UpWzFdOw0KKyAgaWYgKG1pZGRsZVJhbmdlICE9IE5VTEwpIHsNCisgICAgZGVsZXRlIG1pZGRsZVJhbmdlOw0KKyAgICBtaWRkbGVSYW5nZSA9IE5VTEw7DQorICB9DQorICBmb3IgKGludDMyX3QgWSA9IDA7IFkgPCA2ICYmIHJvd09mZnNldCA8IGVuZDsgWSsrKSB7DQorICAgIGludDMyX3QgYmVzdE1hdGNoID0NCisgICAgICAgIERlY29kZURpZ2l0KHJvdywgJmNvdW50ZXJzLCByb3dPZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAmKENCQ19PbmVEaW1SZWFkZXI6OkxfUEFUVEVSTlNbMF1bMF0pLCAxMCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCisgICAgcmVzdWx0U3RyaW5nICs9IChGWF9DSEFSKSgnMCcgKyBiZXN0TWF0Y2gpOw0KKyAgICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBjb3VudGVycy5HZXRTaXplKCk7IGsrKykgew0KKyAgICAgIHJvd09mZnNldCArPSBjb3VudGVyc1trXTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHJvd09mZnNldDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNSZWFkZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjEzUmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI0MGE2OAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjEzUmVhZGVyLmgKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19PTkVERUFOMTNSRUFERVJfSF8NCisjZGVmaW5lIF9CQ19PTkVERUFOMTNSRUFERVJfSF8NCitjbGFzcyBDQkNfT25lRGltUmVhZGVyOw0KK2NsYXNzIENCQ19Db21tb25CaXRBcnJheTsNCitjbGFzcyBDQkNfT25lZEVBTjEzUmVhZGVyOw0KK2NsYXNzIENCQ19PbmVkRUFOMTNSZWFkZXIgOiBwdWJsaWMgQ0JDX09uZURpbVJlYWRlciB7DQorIHB1YmxpYzoNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IEZJUlNUX0RJR0lUX0VOQ09ESU5HU1sxMF07DQorICBDQkNfT25lZEVBTjEzUmVhZGVyKCk7DQorICB2aXJ0dWFsIH5DQkNfT25lZEVBTjEzUmVhZGVyKCk7DQorDQorIHByaXZhdGU6DQorICB2b2lkIERldGVybWluZUZpcnN0RGlnaXQoQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxnUGF0dGVybkZvdW5kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBpbnQzMl90IERlY29kZU1pZGRsZShDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywNCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5KiBzdGFydFJhbmdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdFN0cmluZywNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgZnJpZW5kIGNsYXNzIENCQ19PbmVkVVBDQVJlYWRlcjsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjEzV3JpdGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjEzV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTVlOWRkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNXcml0ZXIuY3BwCkBAIC0wLDAgKzEsMzAzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDA5IFpYaW5nIGF1dGhvcnMNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfV3JpdGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1JlYWRlci5oIg0KKyNpbmNsdWRlICJCQ19PbmVEUmVhZGVyLmgiDQorI2luY2x1ZGUgIkJDX09uZURpbVJlYWRlci5oIg0KKyNpbmNsdWRlICJCQ19PbmVEaW1Xcml0ZXIuaCINCisjaW5jbHVkZSAiQkNfT25lZEVBTjEzUmVhZGVyLmgiDQorI2luY2x1ZGUgIkJDX09uZWRFQU4xM1dyaXRlci5oIg0KK0NCQ19PbmVkRUFOMTNXcml0ZXI6OkNCQ19PbmVkRUFOMTNXcml0ZXIoKSB7DQorICBtX2JMZWZ0UGFkZGluZyA9IFRSVUU7DQorICBtX2NvZGVXaWR0aCA9IDMgKyAoNyAqIDYpICsgNSArICg3ICogNikgKyAzOw0KK30NCitDQkNfT25lZEVBTjEzV3JpdGVyOjp+Q0JDX09uZWRFQU4xM1dyaXRlcigpIHt9DQorRlhfQk9PTCBDQkNfT25lZEVBTjEzV3JpdGVyOjpDaGVja0NvbnRlbnRWYWxpZGl0eSgNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgew0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGkrKykgew0KKyAgICBpZiAoY29udGVudHMuR2V0QXQoaSkgPj0gJzAnICYmIGNvbnRlbnRzLkdldEF0KGkpIDw9ICc5Jykgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19PbmVkRUFOMTNXcml0ZXI6OkZpbHRlckNvbnRlbnRzKA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7DQorICBDRlhfV2lkZVN0cmluZyBmaWx0ZXJjb250ZW50czsNCisgIEZYX1dDSEFSIGNoOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGkrKykgew0KKyAgICBjaCA9IGNvbnRlbnRzLkdldEF0KGkpOw0KKyAgICBpZiAoY2ggPiAxNzUpIHsNCisgICAgICBpKys7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsNCisgICAgICBmaWx0ZXJjb250ZW50cyArPSBjaDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGZpbHRlcmNvbnRlbnRzOw0KK30NCitpbnQzMl90IENCQ19PbmVkRUFOMTNXcml0ZXI6OkNhbGNDaGVja3N1bShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMpIHsNCisgIGludDMyX3Qgb2RkID0gMDsNCisgIGludDMyX3QgZXZlbiA9IDA7DQorICBpbnQzMl90IGogPSAxOw0KKyAgZm9yIChpbnQzMl90IGkgPSBjb250ZW50cy5HZXRMZW5ndGgoKSAtIDE7IGkgPj0gMDsgaS0tKSB7DQorICAgIGlmIChqICUgMikgew0KKyAgICAgIG9kZCArPSBGWFNZU19hdG9pKGNvbnRlbnRzLk1pZChpLCAxKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgZXZlbiArPSBGWFNZU19hdG9pKGNvbnRlbnRzLk1pZChpLCAxKSk7DQorICAgIH0NCisgICAgaisrOw0KKyAgfQ0KKyAgaW50MzJfdCBjaGVja3N1bSA9IChvZGQgKiAzICsgZXZlbikgJSAxMDsNCisgIGNoZWNrc3VtID0gKDEwIC0gY2hlY2tzdW0pICUgMTA7DQorICByZXR1cm4gKGNoZWNrc3VtKTsNCit9DQordWludDhfdCogQ0JDX09uZWRFQU4xM1dyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICB1aW50OF90KiByZXQgPSBFbmNvZGUoY29udGVudHMsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgMCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gcmV0Ow0KK30NCit1aW50OF90KiBDQkNfT25lZEVBTjEzV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChmb3JtYXQgIT0gQkNGT1JNQVRfRUFOXzEzKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk9ubHlFbmNvZGVFQU5fMTM7DQorICB9DQorICB1aW50OF90KiByZXQgPQ0KKyAgICAgIENCQ19PbmVEaW1Xcml0ZXI6OkVuY29kZShjb250ZW50cywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBoaW50cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gcmV0Ow0KK30NCit1aW50OF90KiBDQkNfT25lZEVBTjEzV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChjb250ZW50cy5HZXRMZW5ndGgoKSAhPSAxMykgew0KKyAgICBlID0gQkNFeGNlcHRpb25EaWdpdExlbmd0aFNob3VsZDEzOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIG1faURhdGFMZW50aCA9IDEzOw0KKyAgaW50MzJfdCBmaXJzdERpZ2l0ID0gRlhTWVNfYXRvaShjb250ZW50cy5NaWQoMCwgMSkpOw0KKyAgaW50MzJfdCBwYXJpdGllcyA9IENCQ19PbmVkRUFOMTNSZWFkZXI6OkZJUlNUX0RJR0lUX0VOQ09ESU5HU1tmaXJzdERpZ2l0XTsNCisgIG91dExlbmd0aCA9IG1fY29kZVdpZHRoOw0KKyAgdWludDhfdCogcmVzdWx0ID0gRlhfQWxsb2ModWludDhfdCwgbV9jb2RlV2lkdGgpOw0KKyAgaW50MzJfdCBwb3MgPSAwOw0KKyAgcG9zICs9DQorICAgICAgQXBwZW5kUGF0dGVybihyZXN1bHQsIHBvcywgQ0JDX09uZURpbVJlYWRlcjo6U1RBUlRfRU5EX1BBVFRFUk4sIDMsIDEsIGUpOw0KKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICBGWF9GcmVlKHJlc3VsdCk7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaW50MzJfdCBpID0gMDsNCisgIGZvciAoaSA9IDE7IGkgPD0gNjsgaSsrKSB7DQorICAgIGludDMyX3QgZGlnaXQgPSBGWFNZU19hdG9pKGNvbnRlbnRzLk1pZChpLCAxKSk7DQorICAgIGlmICgocGFyaXRpZXMgPj4gKDYgLSBpKSAmIDEpID09IDEpIHsNCisgICAgICBkaWdpdCArPSAxMDsNCisgICAgfQ0KKyAgICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQsIHBvcywgQ0JDX09uZURpbVJlYWRlcjo6TF9BTkRfR19QQVRURVJOU1tkaWdpdF0sDQorICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDAsIGUpOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgRlhfRnJlZShyZXN1bHQpOw0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICB9DQorICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQsIHBvcywgQ0JDX09uZURpbVJlYWRlcjo6TUlERExFX1BBVFRFUk4sIDUsIDAsIGUpOw0KKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICBGWF9GcmVlKHJlc3VsdCk7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgZm9yIChpID0gNzsgaSA8PSAxMjsgaSsrKSB7DQorICAgIGludDMyX3QgZGlnaXQgPSBGWFNZU19hdG9pKGNvbnRlbnRzLk1pZChpLCAxKSk7DQorICAgIHBvcyArPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdCwgcG9zLCBDQkNfT25lRGltUmVhZGVyOjpMX1BBVFRFUk5TW2RpZ2l0XSwgNCwgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICBGWF9GcmVlKHJlc3VsdCk7DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgIH0NCisgIHBvcyArPQ0KKyAgICAgIEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIENCQ19PbmVEaW1SZWFkZXI6OlNUQVJUX0VORF9QQVRURVJOLCAzLCAxLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgRlhfRnJlZShyZXN1bHQpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQorfQ0KK3ZvaWQgQ0JDX09uZWRFQU4xM1dyaXRlcjo6U2hvd0NoYXJzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwT3V0Qml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBiYXJXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG11bHRpcGxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChkZXZpY2UgPT0gTlVMTCAmJiBwT3V0Qml0bWFwID09IE5VTEwpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50Ow0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGxlZnRQYWRkaW5nID0gNyAqIG11bHRpcGxlOw0KKyAgaW50MzJfdCBsZWZ0UG9zaXRpb24gPSAzICogbXVsdGlwbGUgKyBsZWZ0UGFkZGluZzsNCisgIENGWF9CeXRlU3RyaW5nIHN0ciA9IEZYX1VURjhFbmNvZGUoY29udGVudHMpOw0KKyAgaW50MzJfdCBpTGVuID0gc3RyLkdldExlbmd0aCgpOw0KKyAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zID0gRlhfQWxsb2MoRlhURVhUX0NIQVJQT1MsIGlMZW4pOw0KKyAgRlhTWVNfbWVtc2V0KHBDaGFyUG9zLCAwLCBzaXplb2YoRlhURVhUX0NIQVJQT1MpICogaUxlbik7DQorICBDRlhfRnhnZURldmljZSBnZUJpdG1hcDsNCisgIGlmIChwT3V0Qml0bWFwICE9IE5VTEwpIHsNCisgICAgZ2VCaXRtYXAuQXR0YWNoKHBPdXRCaXRtYXApOw0KKyAgfQ0KKyAgaW50MzJfdCBpRm9udFNpemUgPSAoaW50MzJfdClmYWJzKG1fZkZvbnRTaXplKTsNCisgIGludDMyX3QgaVRleHRIZWlnaHQgPSBpRm9udFNpemUgKyAxOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgdGVtcFN0ciA9IHN0ci5NaWQoMSwgNik7DQorICBpbnQzMl90IHN0cldpZHRoID0gbXVsdGlwbGUgKiA0MjsNCisgIGlmIChwT3V0Qml0bWFwID09IE5VTEwpIHsNCisgICAgQ0ZYX01hdHJpeCBtYXRyKG1fb3V0cHV0SFNjYWxlLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCk7DQorICAgIENGWF9GbG9hdFJlY3QgcmVjdCgNCisgICAgICAgIChGWF9GTE9BVClsZWZ0UG9zaXRpb24sIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCksDQorICAgICAgICAoRlhfRkxPQVQpKGxlZnRQb3NpdGlvbiArIHN0cldpZHRoIC0gMC41KSwgKEZYX0ZMT0FUKW1fSGVpZ2h0KTsNCisgICAgbWF0ci5Db25jYXQoKm1hdHJpeCk7DQorICAgIG1hdHIuVHJhbnNmb3JtUmVjdChyZWN0KTsNCisgICAgRlhfUkVDVCByZSA9IHJlY3QuR2V0T3V0dGVyUmVjdCgpOw0KKyAgICBkZXZpY2UtPkZpbGxSZWN0KCZyZSwgbV9iYWNrZ3JvdW5kQ29sb3IpOw0KKyAgICBDRlhfRmxvYXRSZWN0IHJlY3QxKA0KKyAgICAgICAgKEZYX0ZMT0FUKShsZWZ0UG9zaXRpb24gKyA0NyAqIG11bHRpcGxlKSwNCisgICAgICAgIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCksDQorICAgICAgICAoRlhfRkxPQVQpKGxlZnRQb3NpdGlvbiArIDQ3ICogbXVsdGlwbGUgKyBzdHJXaWR0aCAtIDAuNSksDQorICAgICAgICAoRlhfRkxPQVQpbV9IZWlnaHQpOw0KKyAgICBDRlhfTWF0cml4IG1hdHIxKG1fb3V0cHV0SFNjYWxlLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCk7DQorICAgIG1hdHIxLkNvbmNhdCgqbWF0cml4KTsNCisgICAgbWF0cjEuVHJhbnNmb3JtUmVjdChyZWN0MSk7DQorICAgIHJlID0gcmVjdDEuR2V0T3V0dGVyUmVjdCgpOw0KKyAgICBkZXZpY2UtPkZpbGxSZWN0KCZyZSwgbV9iYWNrZ3JvdW5kQ29sb3IpOw0KKyAgICBpbnQzMl90IHN0cldpZHRoMSA9IG11bHRpcGxlICogNzsNCisgICAgQ0ZYX01hdHJpeCBtYXRyMihtX291dHB1dEhTY2FsZSwgMC4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMC4wZik7DQorICAgIENGWF9GbG9hdFJlY3QgcmVjdDIoMC4wZiwgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpc3RyV2lkdGgxIC0gMC41ZiwgKEZYX0ZMT0FUKW1fSGVpZ2h0KTsNCisgICAgbWF0cjIuQ29uY2F0KCptYXRyaXgpOw0KKyAgICBtYXRyMi5UcmFuc2Zvcm1SZWN0KHJlY3QyKTsNCisgICAgcmUgPSByZWN0Mi5HZXRPdXR0ZXJSZWN0KCk7DQorICAgIGRldmljZS0+RmlsbFJlY3QoJnJlLCBtX2JhY2tncm91bmRDb2xvcik7DQorICB9DQorICBGWF9GTE9BVCBibGFuayA9IDAuMDsNCisgIEZYX0ZMT0FUIGNoYXJzV2lkdGggPSAwOw0KKyAgaUxlbiA9IHRlbXBTdHIuR2V0TGVuZ3RoKCk7DQorICBpZiAocE91dEJpdG1hcCA9PSBOVUxMKSB7DQorICAgIHN0cldpZHRoID0gKGludDMyX3QpKHN0cldpZHRoICogbV9vdXRwdXRIU2NhbGUpOw0KKyAgfQ0KKyAgQ2FsY1RleHRJbmZvKHRlbXBTdHIsIHBDaGFyUG9zICsgMSwgbV9wRm9udCwgKEZYX0ZMT0FUKXN0cldpZHRoLCBpRm9udFNpemUsDQorICAgICAgICAgICAgICAgYmxhbmspOw0KKyAgQ0ZYX01hdHJpeCBhZmZpbmVfbWF0cml4KDEuMCwgMC4wLCAwLjAsIC0xLjAsIDAuMCwgKEZYX0ZMT0FUKWlGb250U2l6ZSk7DQorICBDRlhfRnhnZURldmljZSBnZTsNCisgIGlmIChwT3V0Qml0bWFwICE9IE5VTEwpIHsNCisgICAgZ2UuQ3JlYXRlKHN0cldpZHRoLCBpVGV4dEhlaWdodCwgRlhESUJfQXJnYik7DQorICAgIEZYX1JFQ1QgcmVjdCgwLCAwLCBzdHJXaWR0aCwgaVRleHRIZWlnaHQpOw0KKyAgICBnZS5GaWxsUmVjdCgmcmVjdCwgbV9iYWNrZ3JvdW5kQ29sb3IpOw0KKyAgICBnZS5EcmF3Tm9ybWFsVGV4dChpTGVuLCBwQ2hhclBvcyArIDEsIG1fcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLCAoRlhfRkxPQVQpaUZvbnRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX01hdHJpeCopJmFmZmluZV9tYXRyaXgsIG1fZm9udENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0xFQVJUWVBFKTsNCisgICAgZ2VCaXRtYXAuU2V0RElCaXRzKGdlLkdldEJpdG1hcCgpLCBsZWZ0UG9zaXRpb24sIG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpOw0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX01hdHJpeCBhZmZpbmVfbWF0cml4MSgxLjAsIDAuMCwgMC4wLCAtMS4wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClsZWZ0UG9zaXRpb24gKiBtX291dHB1dEhTY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpICsgaUZvbnRTaXplKTsNCisgICAgaWYgKG1hdHJpeCAhPSBOVUxMKSB7DQorICAgICAgYWZmaW5lX21hdHJpeDEuQ29uY2F0KCptYXRyaXgpOw0KKyAgICB9DQorICAgIGRldmljZS0+RHJhd05vcm1hbFRleHQoaUxlbiwgcENoYXJQb3MgKyAxLCBtX3BGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClpRm9udFNpemUsIChDRlhfTWF0cml4KikmYWZmaW5lX21hdHJpeDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgfQ0KKyAgdGVtcFN0ciA9IHN0ci5NaWQoNywgNik7DQorICBpTGVuID0gdGVtcFN0ci5HZXRMZW5ndGgoKTsNCisgIGNoYXJzV2lkdGggPSAwLjBmOw0KKyAgQ2FsY1RleHRJbmZvKHRlbXBTdHIsIHBDaGFyUG9zICsgNywgbV9wRm9udCwgKEZYX0ZMT0FUKXN0cldpZHRoLCBpRm9udFNpemUsDQorICAgICAgICAgICAgICAgYmxhbmspOw0KKyAgaWYgKHBPdXRCaXRtYXAgIT0gTlVMTCkgew0KKyAgICBGWF9SRUNUIHJlY3QxKDAsIDAsIHN0cldpZHRoLCBpVGV4dEhlaWdodCk7DQorICAgIGdlLkZpbGxSZWN0KCZyZWN0MSwgbV9iYWNrZ3JvdW5kQ29sb3IpOw0KKyAgICBnZS5EcmF3Tm9ybWFsVGV4dChpTGVuLCBwQ2hhclBvcyArIDcsIG1fcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLCAoRlhfRkxPQVQpaUZvbnRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX01hdHJpeCopJmFmZmluZV9tYXRyaXgsIG1fZm9udENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0xFQVJUWVBFKTsNCisgICAgZ2VCaXRtYXAuU2V0RElCaXRzKGdlLkdldEJpdG1hcCgpLCBsZWZ0UG9zaXRpb24gKyA0NyAqIG11bHRpcGxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgbV9IZWlnaHQgLSBpVGV4dEhlaWdodCk7DQorICB9IGVsc2Ugew0KKyAgICBDRlhfTWF0cml4IGFmZmluZV9tYXRyaXgxKA0KKyAgICAgICAgMS4wLCAwLjAsIDAuMCwgLTEuMCwNCisgICAgICAgIChGWF9GTE9BVCkobGVmdFBvc2l0aW9uICsgNDcgKiBtdWx0aXBsZSkgKiBtX291dHB1dEhTY2FsZSwNCisgICAgICAgIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCArIGlGb250U2l6ZSkpOw0KKyAgICBpZiAobWF0cml4ICE9IE5VTEwpIHsNCisgICAgICBhZmZpbmVfbWF0cml4MS5Db25jYXQoKm1hdHJpeCk7DQorICAgIH0NCisgICAgZGV2aWNlLT5EcmF3Tm9ybWFsVGV4dChpTGVuLCBwQ2hhclBvcyArIDcsIG1fcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWlGb250U2l6ZSwgKENGWF9NYXRyaXgqKSZhZmZpbmVfbWF0cml4MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZvbnRDb2xvciwgRlhURVhUX0NMRUFSVFlQRSk7DQorICB9DQorICB0ZW1wU3RyID0gc3RyLk1pZCgwLCAxKTsNCisgIGlMZW4gPSB0ZW1wU3RyLkdldExlbmd0aCgpOw0KKyAgc3RyV2lkdGggPSBtdWx0aXBsZSAqIDc7DQorICBpZiAocE91dEJpdG1hcCA9PSBOVUxMKSB7DQorICAgIHN0cldpZHRoID0gKGludDMyX3QpKHN0cldpZHRoICogbV9vdXRwdXRIU2NhbGUpOw0KKyAgfQ0KKyAgQ2FsY1RleHRJbmZvKHRlbXBTdHIsIHBDaGFyUG9zLCBtX3BGb250LCAoRlhfRkxPQVQpc3RyV2lkdGgsIGlGb250U2l6ZSwNCisgICAgICAgICAgICAgICBibGFuayk7DQorICBpZiAocE91dEJpdG1hcCAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBnZS5HZXRCaXRtYXAoKTsNCisgICAgZ2UuQ3JlYXRlKHN0cldpZHRoLCBpVGV4dEhlaWdodCwgRlhESUJfQXJnYik7DQorICAgIGdlLkdldEJpdG1hcCgpLT5DbGVhcihtX2JhY2tncm91bmRDb2xvcik7DQorICAgIGdlLkRyYXdOb3JtYWxUZXh0KGlMZW4sIHBDaGFyUG9zLCBtX3BGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKSwgKEZYX0ZMT0FUKWlGb250U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgKENGWF9NYXRyaXgqKSZhZmZpbmVfbWF0cml4LCBtX2ZvbnRDb2xvciwNCisgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NMRUFSVFlQRSk7DQorICAgIGdlQml0bWFwLlNldERJQml0cyhnZS5HZXRCaXRtYXAoKSwgMCwgbV9IZWlnaHQgLSBpVGV4dEhlaWdodCk7DQorICB9IGVsc2Ugew0KKyAgICBDRlhfTWF0cml4IGFmZmluZV9tYXRyaXgxKDEuMCwgMC4wLCAwLjAsIC0xLjAsIDAuMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQgKyBpRm9udFNpemUpKTsNCisgICAgaWYgKG1hdHJpeCAhPSBOVUxMKSB7DQorICAgICAgYWZmaW5lX21hdHJpeDEuQ29uY2F0KCptYXRyaXgpOw0KKyAgICB9DQorICAgIGRldmljZS0+RHJhd05vcm1hbFRleHQoaUxlbiwgcENoYXJQb3MsIG1fcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWlGb250U2l6ZSwgKENGWF9NYXRyaXgqKSZhZmZpbmVfbWF0cml4MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZvbnRDb2xvciwgRlhURVhUX0NMRUFSVFlQRSk7DQorICB9DQorICBGWF9GcmVlKHBDaGFyUG9zKTsNCit9DQordm9pZCBDQkNfT25lZEVBTjEzV3JpdGVyOjpSZW5kZXJSZXN1bHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzRGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENCQ19PbmVEaW1Xcml0ZXI6OlJlbmRlclJlc3VsdChjb250ZW50cywgY29kZSwgY29kZUxlbmd0aCwgaXNEZXZpY2UsIGUpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU4xM1dyaXRlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTA4NjJkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNXcml0ZXIuaApAQCAtMCwwICsxLDUxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX09ORURFQU4xM1dSSVRFUl9IXw0KKyNkZWZpbmUgX0JDX09ORURFQU4xM1dSSVRFUl9IXw0KK2NsYXNzIENCQ19PbmVEaW1Xcml0ZXI7DQorY2xhc3MgQ0JDX09uZWRFQU4xM1dyaXRlcjsNCitjbGFzcyBDQkNfT25lZEVBTjEzV3JpdGVyIDogcHVibGljIENCQ19PbmVEaW1Xcml0ZXIgew0KKyBwcml2YXRlOg0KKyAgaW50MzJfdCBtX2NvZGVXaWR0aDsNCisNCisgcHVibGljOg0KKyAgQ0JDX09uZWRFQU4xM1dyaXRlcigpOw0KKyAgdmlydHVhbCB+Q0JDX09uZWRFQU4xM1dyaXRlcigpOw0KKw0KKyAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dExlbmd0aCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHZvaWQgUmVuZGVyUmVzdWx0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2RlTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0RldmljZSwNCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgRlhfQk9PTCBDaGVja0NvbnRlbnRWYWxpZGl0eShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsNCisgIENGWF9XaWRlU3RyaW5nIEZpbHRlckNvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpOw0KKyAgaW50MzJfdCBDYWxjQ2hlY2tzdW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBTaG93Q2hhcnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE91dEJpdG1hcCwNCisgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwNCisgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgIGludDMyX3QgYmFyV2lkdGgsDQorICAgICAgICAgICAgICAgICBpbnQzMl90IG11bHRpcGxlLA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU44UmVhZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjhSZWFkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYmUwNDYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU44UmVhZGVyLmNwcApAQCAtMCwwICsxLDg0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDA4IFpYaW5nIGF1dGhvcnMNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfUmVhZGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRBcnJheS5oIg0KKyNpbmNsdWRlICJCQ19PbmVEUmVhZGVyLmgiDQorI2luY2x1ZGUgIkJDX09uZURpbVJlYWRlci5oIg0KKyNpbmNsdWRlICJCQ19PbmVkRUFOOFJlYWRlci5oIg0KK0NCQ19PbmVkRUFOOFJlYWRlcjo6Q0JDX09uZWRFQU44UmVhZGVyKCkge30NCitDQkNfT25lZEVBTjhSZWFkZXI6On5DQkNfT25lZEVBTjhSZWFkZXIoKSB7fQ0KK2ludDMyX3QgQ0JDX09uZWRFQU44UmVhZGVyOjpEZWNvZGVNaWRkbGUoQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSogc3RhcnRSYW5nZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHRSZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDRlhfSW50MzJBcnJheSBjb3VudGVyczsNCisgIGNvdW50ZXJzLkFkZCgwKTsNCisgIGNvdW50ZXJzLkFkZCgwKTsNCisgIGNvdW50ZXJzLkFkZCgwKTsNCisgIGNvdW50ZXJzLkFkZCgwKTsNCisgIGludDMyX3QgZW5kID0gcm93LT5HZXRTaXplKCk7DQorICBpbnQzMl90IHJvd09mZnNldCA9ICgqc3RhcnRSYW5nZSlbMV07DQorICBpbnQzMl90IHJvd09mZnNldExlZnQgPSByb3dPZmZzZXQ7DQorICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCA0ICYmIHJvd09mZnNldCA8IGVuZDsgeCsrKSB7DQorICAgIGludDMyX3QgYmVzdE1hdGNoID0NCisgICAgICAgIERlY29kZURpZ2l0KHJvdywgJmNvdW50ZXJzLCByb3dPZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAmKENCQ19PbmVEaW1SZWFkZXI6OkxfUEFUVEVSTlNbMF1bMF0pLCAxMCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCisgICAgcmVzdWx0UmVzdWx0ICs9IChGWF9DSEFSKSgnMCcgKyBiZXN0TWF0Y2gpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb3VudGVycy5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgIHJvd09mZnNldCArPSBjb3VudGVyc1tpXTsNCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBSb3dPZmZzZXRMZW4gPSAocm93T2Zmc2V0IC0gcm93T2Zmc2V0TGVmdCkgLyA0Ow0KKyAgQ0ZYX0ludDMyQXJyYXkgcmVzdWx0Ow0KKyAgcmVzdWx0LkFkZChDQkNfT25lRGltUmVhZGVyOjpNSURETEVfUEFUVEVSTlswXSk7DQorICByZXN1bHQuQWRkKENCQ19PbmVEaW1SZWFkZXI6Ok1JRERMRV9QQVRURVJOWzFdKTsNCisgIHJlc3VsdC5BZGQoQ0JDX09uZURpbVJlYWRlcjo6TUlERExFX1BBVFRFUk5bMl0pOw0KKyAgcmVzdWx0LkFkZChDQkNfT25lRGltUmVhZGVyOjpNSURETEVfUEFUVEVSTlszXSk7DQorICByZXN1bHQuQWRkKENCQ19PbmVEaW1SZWFkZXI6Ok1JRERMRV9QQVRURVJOWzRdKTsNCisgIENGWF9JbnQzMkFycmF5KiBtaWRkbGVSYW5nZSA9DQorICAgICAgRmluZEd1YXJkUGF0dGVybihyb3csIHJvd09mZnNldCwgVFJVRSwgJnJlc3VsdCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICBpbnQzMl90IHJvd09mZnNldE1pZCA9IHJvd09mZnNldDsNCisgIHJvd09mZnNldCA9ICgqbWlkZGxlUmFuZ2UpWzFdOw0KKyAgaWYgKChyb3dPZmZzZXQgLSByb3dPZmZzZXRNaWQpID4gUm93T2Zmc2V0TGVuKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICB9DQorICBpZiAobWlkZGxlUmFuZ2UgIT0gTlVMTCkgew0KKyAgICBkZWxldGUgbWlkZGxlUmFuZ2U7DQorICAgIG1pZGRsZVJhbmdlID0gTlVMTDsNCisgIH0NCisgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IDQgJiYgcm93T2Zmc2V0IDwgZW5kOyB5KyspIHsNCisgICAgaW50MzJfdCBiZXN0TWF0Y2ggPQ0KKyAgICAgICAgRGVjb2RlRGlnaXQocm93LCAmY291bnRlcnMsIHJvd09mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICYoQ0JDX09uZURpbVJlYWRlcjo6TF9QQVRURVJOU1swXVswXSksIDEwLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KKyAgICByZXN1bHRSZXN1bHQgKz0gKEZYX0NIQVIpKCcwJyArIGJlc3RNYXRjaCk7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvdW50ZXJzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgcm93T2Zmc2V0ICs9IGNvdW50ZXJzW2ldOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gcm93T2Zmc2V0Ow0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU44UmVhZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU44UmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZkNjEwOQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjhSZWFkZXIuaApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX09ORURFQU44UkVBREVSX0hfDQorI2RlZmluZSBfQkNfT05FREVBTjhSRUFERVJfSF8NCitjbGFzcyBDQkNfT25lRGltUmVhZGVyOw0KK2NsYXNzIENCQ19Db21tb25CaXRBcnJheTsNCitjbGFzcyBDQkNfT25lZEVBTjhSZWFkZXI7DQorY2xhc3MgQ0JDX09uZWRFQU44UmVhZGVyIDogcHVibGljIENCQ19PbmVEaW1SZWFkZXIgew0KKyBwdWJsaWM6DQorICBDQkNfT25lZEVBTjhSZWFkZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19PbmVkRUFOOFJlYWRlcigpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBpbnQzMl90IERlY29kZU1pZGRsZShDQkNfQ29tbW9uQml0QXJyYXkqLA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIHN0YXJ0UmFuZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU44V3JpdGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjhXcml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNjQ4NmQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU44V3JpdGVyLmNwcApAQCAtMCwwICsxLDI3MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwOSBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1dyaXRlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19SZWFkZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJCQ19PbmVEUmVhZGVyLmgiDQorI2luY2x1ZGUgIkJDX09uZURpbVdyaXRlci5oIg0KKyNpbmNsdWRlICJCQ19PbmVEaW1SZWFkZXIuaCINCisjaW5jbHVkZSAiQkNfT25lZEVBTjhXcml0ZXIuaCINCitDQkNfT25lZEVBTjhXcml0ZXI6OkNCQ19PbmVkRUFOOFdyaXRlcigpIHsNCisgIG1faURhdGFMZW50aCA9IDg7DQorICBtX2NvZGVXaWR0aCA9IDMgKyAoNyAqIDQpICsgNSArICg3ICogNCkgKyAzOw0KK30NCitDQkNfT25lZEVBTjhXcml0ZXI6On5DQkNfT25lZEVBTjhXcml0ZXIoKSB7fQ0KK3ZvaWQgQ0JDX09uZWRFQU44V3JpdGVyOjpTZXREYXRhTGVuZ3RoKGludDMyX3QgbGVuZ3RoKSB7DQorICBtX2lEYXRhTGVudGggPSA4Ow0KK30NCitGWF9CT09MIENCQ19PbmVkRUFOOFdyaXRlcjo6U2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKSB7DQorICBpZiAobG9jYXRpb24gPT0gQkNfVEVYVF9MT0NfQkVMT1dFTUJFRCkgew0KKyAgICBtX2xvY1RleHRMb2MgPSBsb2NhdGlvbjsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ0JDX09uZWRFQU44V3JpdGVyOjpDaGVja0NvbnRlbnRWYWxpZGl0eSgNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgew0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGkrKykgew0KKyAgICBpZiAoY29udGVudHMuR2V0QXQoaSkgPj0gJzAnICYmIGNvbnRlbnRzLkdldEF0KGkpIDw9ICc5Jykgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENCQ19PbmVkRUFOOFdyaXRlcjo6RmlsdGVyQ29udGVudHMoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIHsNCisgIENGWF9XaWRlU3RyaW5nIGZpbHRlcmNvbnRlbnRzOw0KKyAgRlhfV0NIQVIgY2g7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7DQorICAgIGNoID0gY29udGVudHMuR2V0QXQoaSk7DQorICAgIGlmIChjaCA+IDE3NSkgew0KKyAgICAgIGkrKzsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jykgew0KKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gZmlsdGVyY29udGVudHM7DQorfQ0KK2ludDMyX3QgQ0JDX09uZWRFQU44V3JpdGVyOjpDYWxjQ2hlY2tzdW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzKSB7DQorICBpbnQzMl90IG9kZCA9IDA7DQorICBpbnQzMl90IGV2ZW4gPSAwOw0KKyAgaW50MzJfdCBqID0gMTsNCisgIGZvciAoaW50MzJfdCBpID0gY29udGVudHMuR2V0TGVuZ3RoKCkgLSAxOyBpID49IDA7IGktLSkgew0KKyAgICBpZiAoaiAlIDIpIHsNCisgICAgICBvZGQgKz0gRlhTWVNfYXRvaShjb250ZW50cy5NaWQoaSwgMSkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGV2ZW4gKz0gRlhTWVNfYXRvaShjb250ZW50cy5NaWQoaSwgMSkpOw0KKyAgICB9DQorICAgIGorKzsNCisgIH0NCisgIGludDMyX3QgY2hlY2tzdW0gPSAob2RkICogMyArIGV2ZW4pICUgMTA7DQorICBjaGVja3N1bSA9ICgxMCAtIGNoZWNrc3VtKSAlIDEwOw0KKyAgcmV0dXJuIChjaGVja3N1bSk7DQorfQ0KK3VpbnQ4X3QqIENCQ19PbmVkRUFOOFdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIHVpbnQ4X3QqIHJldCA9IEVuY29kZShjb250ZW50cywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCAwLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiByZXQ7DQorfQ0KK3VpbnQ4X3QqIENCQ19PbmVkRUFOOFdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGZvcm1hdCAhPSBCQ0ZPUk1BVF9FQU5fOCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Pbmx5RW5jb2RlRUFOXzg7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgdWludDhfdCogcmV0ID0NCisgICAgICBDQkNfT25lRGltV3JpdGVyOjpFbmNvZGUoY29udGVudHMsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgaGludHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIHJldDsNCit9DQordWludDhfdCogQ0JDX09uZWRFQU44V3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dExlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoY29udGVudHMuR2V0TGVuZ3RoKCkgIT0gOCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25EaWdpdExlbmd0aE11c3RCZTg7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgb3V0TGVuZ3RoID0gbV9jb2RlV2lkdGg7DQorICB1aW50OF90KiByZXN1bHQgPSBGWF9BbGxvYyh1aW50OF90LCBtX2NvZGVXaWR0aCk7DQorICBpbnQzMl90IHBvcyA9IDA7DQorICBwb3MgKz0NCisgICAgICBBcHBlbmRQYXR0ZXJuKHJlc3VsdCwgcG9zLCBDQkNfT25lRGltUmVhZGVyOjpTVEFSVF9FTkRfUEFUVEVSTiwgMywgMSwgZSk7DQorICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgIEZYX0ZyZWUocmVzdWx0KTsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpbnQzMl90IGkgPSAwOw0KKyAgZm9yIChpID0gMDsgaSA8PSAzOyBpKyspIHsNCisgICAgaW50MzJfdCBkaWdpdCA9IEZYU1lTX2F0b2koY29udGVudHMuTWlkKGksIDEpKTsNCisgICAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIENCQ19PbmVEaW1SZWFkZXI6OkxfUEFUVEVSTlNbZGlnaXRdLCA0LCAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBlKTsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgIEZYX0ZyZWUocmVzdWx0KTsNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgfQ0KKyAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIENCQ19PbmVEaW1SZWFkZXI6Ok1JRERMRV9QQVRURVJOLCA1LCAwLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgRlhfRnJlZShyZXN1bHQpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGZvciAoaSA9IDQ7IGkgPD0gNzsgaSsrKSB7DQorICAgIGludDMyX3QgZGlnaXQgPSBGWFNZU19hdG9pKGNvbnRlbnRzLk1pZChpLCAxKSk7DQorICAgIHBvcyArPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdCwgcG9zLCBDQkNfT25lRGltUmVhZGVyOjpMX1BBVFRFUk5TW2RpZ2l0XSwgNCwgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICBGWF9GcmVlKHJlc3VsdCk7DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgIH0NCisgIHBvcyArPQ0KKyAgICAgIEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIENCQ19PbmVEaW1SZWFkZXI6OlNUQVJUX0VORF9QQVRURVJOLCAzLCAxLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgRlhfRnJlZShyZXN1bHQpOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQorfQ0KK3ZvaWQgQ0JDX09uZWRFQU44V3JpdGVyOjpTaG93Q2hhcnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE91dEJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYmFyV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG11bHRpcGxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGRldmljZSA9PSBOVUxMICYmIHBPdXRCaXRtYXAgPT0gTlVMTCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgbGVmdFBvc2l0aW9uID0gMyAqIG11bHRpcGxlOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gRlhfVVRGOEVuY29kZShjb250ZW50cyk7DQorICBpbnQzMl90IGlMZW5ndGggPSBzdHIuR2V0TGVuZ3RoKCk7DQorICBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MgPSBGWF9BbGxvYyhGWFRFWFRfQ0hBUlBPUywgaUxlbmd0aCk7DQorICBGWFNZU19tZW1zZXQocENoYXJQb3MsIDAsIHNpemVvZihGWFRFWFRfQ0hBUlBPUykgKiBpTGVuZ3RoKTsNCisgIENGWF9CeXRlU3RyaW5nIHRlbXBTdHIgPSBzdHIuTWlkKDAsIDQpOw0KKyAgaW50MzJfdCBpTGVuID0gdGVtcFN0ci5HZXRMZW5ndGgoKTsNCisgIGludDMyX3Qgc3RyV2lkdGggPSA3ICogbXVsdGlwbGUgKiA0Ow0KKyAgRlhfRkxPQVQgYmxhbmsgPSAwLjA7DQorICBDRlhfRnhnZURldmljZSBnZUJpdG1hcDsNCisgIGlmIChwT3V0Qml0bWFwICE9IE5VTEwpIHsNCisgICAgZ2VCaXRtYXAuQXR0YWNoKHBPdXRCaXRtYXApOw0KKyAgfQ0KKyAgRlhfRkxPQVQgY2hhcnNXaWR0aCA9IDA7DQorICBpbnQzMl90IGlGb250U2l6ZSA9IChpbnQzMl90KWZhYnMobV9mRm9udFNpemUpOw0KKyAgaW50MzJfdCBpVGV4dEhlaWdodCA9IGlGb250U2l6ZSArIDE7DQorICBpZiAocE91dEJpdG1hcCA9PSBOVUxMKSB7DQorICAgIENGWF9NYXRyaXggbWF0cihtX291dHB1dEhTY2FsZSwgMC4wLCAwLjAsIDEuMCwgMC4wLCAwLjApOw0KKyAgICBDRlhfRmxvYXRSZWN0IHJlY3QoDQorICAgICAgICAoRlhfRkxPQVQpbGVmdFBvc2l0aW9uLCAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpLA0KKyAgICAgICAgKEZYX0ZMT0FUKShsZWZ0UG9zaXRpb24gKyBzdHJXaWR0aCAtIDAuNSksIChGWF9GTE9BVCltX0hlaWdodCk7DQorICAgIG1hdHIuQ29uY2F0KCptYXRyaXgpOw0KKyAgICBtYXRyLlRyYW5zZm9ybVJlY3QocmVjdCk7DQorICAgIEZYX1JFQ1QgcmUgPSByZWN0LkdldE91dHRlclJlY3QoKTsNCisgICAgZGV2aWNlLT5GaWxsUmVjdCgmcmUsIG1fYmFja2dyb3VuZENvbG9yKTsNCisgICAgQ0ZYX01hdHJpeCBtYXRyMShtX291dHB1dEhTY2FsZSwgMC4wLCAwLjAsIDEuMCwgMC4wLCAwLjApOw0KKyAgICBDRlhfRmxvYXRSZWN0IHJlY3QxKA0KKyAgICAgICAgKEZYX0ZMT0FUKShsZWZ0UG9zaXRpb24gKyAzMyAqIG11bHRpcGxlKSwNCisgICAgICAgIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCksDQorICAgICAgICAoRlhfRkxPQVQpKGxlZnRQb3NpdGlvbiArIDMzICogbXVsdGlwbGUgKyBzdHJXaWR0aCAtIDAuNSksDQorICAgICAgICAoRlhfRkxPQVQpbV9IZWlnaHQpOw0KKyAgICBtYXRyMS5Db25jYXQoKm1hdHJpeCk7DQorICAgIG1hdHIxLlRyYW5zZm9ybVJlY3QocmVjdDEpOw0KKyAgICByZSA9IHJlY3QxLkdldE91dHRlclJlY3QoKTsNCisgICAgZGV2aWNlLT5GaWxsUmVjdCgmcmUsIG1fYmFja2dyb3VuZENvbG9yKTsNCisgIH0NCisgIGlmIChwT3V0Qml0bWFwID09IE5VTEwpIHsNCisgICAgc3RyV2lkdGggPSAoaW50MzJfdCkoc3RyV2lkdGggKiBtX291dHB1dEhTY2FsZSk7DQorICB9DQorICBDYWxjVGV4dEluZm8odGVtcFN0ciwgcENoYXJQb3MsIG1fcEZvbnQsIChGWF9GTE9BVClzdHJXaWR0aCwgaUZvbnRTaXplLA0KKyAgICAgICAgICAgICAgIGJsYW5rKTsNCisgIENGWF9NYXRyaXggYWZmaW5lX21hdHJpeCgxLjAsIDAuMCwgMC4wLCAtMS4wLCAwLjAsIChGWF9GTE9BVClpRm9udFNpemUpOw0KKyAgQ0ZYX0Z4Z2VEZXZpY2UgZ2U7DQorICBpZiAocE91dEJpdG1hcCAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBnZS5HZXRCaXRtYXAoKTsNCisgICAgZ2UuQ3JlYXRlKHN0cldpZHRoLCBpVGV4dEhlaWdodCwgRlhESUJfQXJnYik7DQorICAgIGdlLkdldEJpdG1hcCgpLT5DbGVhcihtX2JhY2tncm91bmRDb2xvcik7DQorICAgIGdlLkRyYXdOb3JtYWxUZXh0KGlMZW4sIHBDaGFyUG9zLCBtX3BGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKSwgKEZYX0ZMT0FUKWlGb250U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgKENGWF9NYXRyaXgqKSZhZmZpbmVfbWF0cml4LCBtX2ZvbnRDb2xvciwNCisgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NMRUFSVFlQRSk7DQorICAgIGdlQml0bWFwLlNldERJQml0cyhnZS5HZXRCaXRtYXAoKSwgbGVmdFBvc2l0aW9uLCBtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KTsNCisgIH0gZWxzZSB7DQorICAgIENGWF9NYXRyaXggYWZmaW5lX21hdHJpeDEoMS4wLCAwLjAsIDAuMCwgLTEuMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpbGVmdFBvc2l0aW9uICogbV9vdXRwdXRIU2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0ICsgaUZvbnRTaXplKSk7DQorICAgIGFmZmluZV9tYXRyaXgxLkNvbmNhdCgqbWF0cml4KTsNCisgICAgZGV2aWNlLT5EcmF3Tm9ybWFsVGV4dChpTGVuLCBwQ2hhclBvcywgbV9wRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpaUZvbnRTaXplLCAoQ0ZYX01hdHJpeCopJmFmZmluZV9tYXRyaXgxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCisgIH0NCisgIHRlbXBTdHIgPSBzdHIuTWlkKDQsIDQpOw0KKyAgaUxlbiA9IHRlbXBTdHIuR2V0TGVuZ3RoKCk7DQorICBjaGFyc1dpZHRoID0gMC4wZjsNCisgIENhbGNUZXh0SW5mbyh0ZW1wU3RyLCBwQ2hhclBvcyArIDQsIG1fcEZvbnQsIChGWF9GTE9BVClzdHJXaWR0aCwgaUZvbnRTaXplLA0KKyAgICAgICAgICAgICAgIGJsYW5rKTsNCisgIGlmIChwT3V0Qml0bWFwICE9IE5VTEwpIHsNCisgICAgZGVsZXRlIGdlLkdldEJpdG1hcCgpOw0KKyAgICBnZS5DcmVhdGUoc3RyV2lkdGgsIGlUZXh0SGVpZ2h0LCBGWERJQl9BcmdiKTsNCisgICAgZ2UuR2V0Qml0bWFwKCktPkNsZWFyKG1fYmFja2dyb3VuZENvbG9yKTsNCisgICAgZ2UuRHJhd05vcm1hbFRleHQoaUxlbiwgcENoYXJQb3MgKyA0LCBtX3BGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKSwgKEZYX0ZMT0FUKWlGb250U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgKENGWF9NYXRyaXgqKSZhZmZpbmVfbWF0cml4LCBtX2ZvbnRDb2xvciwNCisgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NMRUFSVFlQRSk7DQorICAgIGdlQml0bWFwLlNldERJQml0cyhnZS5HZXRCaXRtYXAoKSwgbGVmdFBvc2l0aW9uICsgMzMgKiBtdWx0aXBsZSwNCisgICAgICAgICAgICAgICAgICAgICAgIG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpOw0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX01hdHJpeCBhZmZpbmVfbWF0cml4MSgNCisgICAgICAgIDEuMCwgMC4wLCAwLjAsIC0xLjAsDQorICAgICAgICAoRlhfRkxPQVQpKGxlZnRQb3NpdGlvbiArIDMzICogbXVsdGlwbGUpICogbV9vdXRwdXRIU2NhbGUsDQorICAgICAgICAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQgKyBpRm9udFNpemUpKTsNCisgICAgaWYgKG1hdHJpeCAhPSBOVUxMKSB7DQorICAgICAgYWZmaW5lX21hdHJpeDEuQ29uY2F0KCptYXRyaXgpOw0KKyAgICB9DQorICAgIGRldmljZS0+RHJhd05vcm1hbFRleHQoaUxlbiwgcENoYXJQb3MgKyA0LCBtX3BGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClpRm9udFNpemUsIChDRlhfTWF0cml4KikmYWZmaW5lX21hdHJpeDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgfQ0KKyAgRlhfRnJlZShwQ2hhclBvcyk7DQorfQ0KK3ZvaWQgQ0JDX09uZWRFQU44V3JpdGVyOjpSZW5kZXJSZXN1bHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzRGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0JDX09uZURpbVdyaXRlcjo6UmVuZGVyUmVzdWx0KGNvbnRlbnRzLCBjb2RlLCBjb2RlTGVuZ3RoLCBpc0RldmljZSwgZSk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjhXcml0ZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjhXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2QxYzhhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFdyaXRlci5oCkBAIC0wLDAgKzEsNTMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfT05FREVBTjhXUklURVJfSF8NCisjZGVmaW5lIF9CQ19PTkVERUFOOFdSSVRFUl9IXw0KK2VudW0gQkNfVEVYVF9MT0M7DQorY2xhc3MgQ0JDX09uZURpbVdyaXRlcjsNCitjbGFzcyBDQkNfT25lZEVBTjhXcml0ZXI7DQorY2xhc3MgQ0JDX09uZWRFQU44V3JpdGVyIDogcHVibGljIENCQ19PbmVEaW1Xcml0ZXIgew0KKyBwcml2YXRlOg0KKyAgaW50MzJfdCBtX2NvZGVXaWR0aDsNCisNCisgcHVibGljOg0KKyAgQ0JDX09uZWRFQU44V3JpdGVyKCk7DQorICB2aXJ0dWFsIH5DQkNfT25lZEVBTjhXcml0ZXIoKTsNCisgIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICB2b2lkIFJlbmRlclJlc3VsdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29kZSwNCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIEZYX0JPT0wgQ2hlY2tDb250ZW50VmFsaWRpdHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7DQorICBDRlhfV2lkZVN0cmluZyBGaWx0ZXJDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsNCisgIHZvaWQgU2V0RGF0YUxlbmd0aChpbnQzMl90IGxlbmd0aCk7DQorICBGWF9CT09MIFNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbik7DQorICBpbnQzMl90IENhbGNDaGVja3N1bShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIFNob3dDaGFycyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwT3V0Qml0bWFwLA0KKyAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCBiYXJXaWR0aCwNCisgICAgICAgICAgICAgICAgIGludDMyX3QgbXVsdGlwbGUsDQorICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZFVQQ0FSZWFkZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkVVBDQVJlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FjYjBhZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZFVQQ0FSZWFkZXIuY3BwCkBAIC0wLDAgKzEsOTggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDggWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19SZWFkZXIuaCINCisjaW5jbHVkZSAiQkNfT25lRFJlYWRlci5oIg0KKyNpbmNsdWRlICJCQ19PbmVEaW1SZWFkZXIuaCINCisjaW5jbHVkZSAiQkNfT25lZEVBTjEzUmVhZGVyLmgiDQorI2luY2x1ZGUgIkJDX09uZWRVUENBUmVhZGVyLmgiDQorQ0JDX09uZWRVUENBUmVhZGVyOjpDQkNfT25lZFVQQ0FSZWFkZXIoKSB7DQorICBtX2VhbjEzUmVhZGVyID0gTlVMTDsNCit9DQordm9pZCBDQkNfT25lZFVQQ0FSZWFkZXI6OkluaXQoKSB7DQorICBtX2VhbjEzUmVhZGVyID0gbmV3IENCQ19PbmVkRUFOMTNSZWFkZXI7DQorfQ0KK0NCQ19PbmVkVVBDQVJlYWRlcjo6fkNCQ19PbmVkVVBDQVJlYWRlcigpIHsNCisgIGlmIChtX2VhbjEzUmVhZGVyICE9IE5VTEwpIHsNCisgICAgZGVsZXRlIG1fZWFuMTNSZWFkZXI7DQorICB9DQorICBtX2VhbjEzUmVhZGVyID0gTlVMTDsNCit9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX09uZWRVUENBUmVhZGVyOjpEZWNvZGVSb3coaW50MzJfdCByb3dOdW1iZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDRlhfQnl0ZVN0cmluZyBieXRlc3RyaW5nID0NCisgICAgICBtX2VhbjEzUmVhZGVyLT5EZWNvZGVSb3cocm93TnVtYmVyLCByb3csIGhpbnRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICBDRlhfQnl0ZVN0cmluZyB0ZW1wID0gTWF5YmVSZXR1cm5SZXN1bHQoYnl0ZXN0cmluZywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgcmV0dXJuIHRlbXA7DQorfQ0KK0NGWF9CeXRlU3RyaW5nIENCQ19PbmVkVVBDQVJlYWRlcjo6RGVjb2RlUm93KGludDMyX3Qgcm93TnVtYmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5KiBzdGFydEd1YXJkUmFuZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDRlhfQnl0ZVN0cmluZyBieXRlc3RyaW5nID0NCisgICAgICBtX2VhbjEzUmVhZGVyLT5EZWNvZGVSb3cocm93TnVtYmVyLCByb3csIHN0YXJ0R3VhcmRSYW5nZSwgaGludHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgIENGWF9CeXRlU3RyaW5nIHRlbXAgPSBNYXliZVJldHVyblJlc3VsdChieXRlc3RyaW5nLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICByZXR1cm4gdGVtcDsNCit9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX09uZWRVUENBUmVhZGVyOjpEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCogaW1hZ2UsIGludDMyX3QmIGUpIHsNCisgIENGWF9CeXRlU3RyaW5nIGJ5dGVzdHJpbmcgPSBtX2VhbjEzUmVhZGVyLT5EZWNvZGUoaW1hZ2UsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgIENGWF9CeXRlU3RyaW5nIHRlbXAgPSBNYXliZVJldHVyblJlc3VsdChieXRlc3RyaW5nLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAiIik7DQorICByZXR1cm4gdGVtcDsNCit9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX09uZWRVUENBUmVhZGVyOjpEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCogaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDRlhfQnl0ZVN0cmluZyBieXRlc3RyaW5nID0gbV9lYW4xM1JlYWRlci0+RGVjb2RlKGltYWdlLCBoaW50cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgdGVtcCA9IE1heWJlUmV0dXJuUmVzdWx0KGJ5dGVzdHJpbmcsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgIHJldHVybiB0ZW1wOw0KK30NCitpbnQzMl90IENCQ19PbmVkVVBDQVJlYWRlcjo6RGVjb2RlTWlkZGxlKENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIHN0YXJ0UmFuZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0U3RyaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCB0ZW1wID0gbV9lYW4xM1JlYWRlci0+RGVjb2RlTWlkZGxlKHJvdywgc3RhcnRSYW5nZSwgcmVzdWx0U3RyaW5nLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCisgIHJldHVybiB0ZW1wOw0KK30NCitDRlhfQnl0ZVN0cmluZyBDQkNfT25lZFVQQ0FSZWFkZXI6Ok1heWJlUmV0dXJuUmVzdWx0KENGWF9CeXRlU3RyaW5nJiByZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAocmVzdWx0WzBdID09ICcwJykgew0KKyAgICByZXN1bHQuRGVsZXRlKDApOw0KKyAgICByZXR1cm4gcmVzdWx0Ow0KKyAgfSBlbHNlIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0RXhjZXB0aW9uOw0KKyAgICByZXR1cm4gIiI7DQorICB9DQorICByZXR1cm4gIiI7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZFVQQ0FSZWFkZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZFVQQ0FSZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDliODIwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkVVBDQVJlYWRlci5oCkBAIC0wLDAgKzEsNDEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfT05FRFVQQ0FSRUFERVJfSF8NCisjZGVmaW5lIF9CQ19PTkVEVVBDQVJFQURFUl9IXw0KK2NsYXNzIENCQ19CaW5hcnlCaXRtYXA7DQorY2xhc3MgQ0JDX0NvbW1vbkJpdEFycmF5Ow0KK2NsYXNzIENCQ19PbmVEaW1SZWFkZXI7DQorY2xhc3MgQ0JDX09uZWRFQU4xM1JlYWRlcjsNCitjbGFzcyBDQkNfT25lZFVQQ0FSZWFkZXI7DQorY2xhc3MgQ0JDX09uZWRVUENBUmVhZGVyIDogcHVibGljIENCQ19PbmVEaW1SZWFkZXIgew0KKyBwcml2YXRlOg0KKyAgQ0JDX09uZWRFQU4xM1JlYWRlciogbV9lYW4xM1JlYWRlcjsNCisNCisgcHVibGljOg0KKyAgQ0JDX09uZWRVUENBUmVhZGVyKCk7DQorICB2aXJ0dWFsIH5DQkNfT25lZFVQQ0FSZWFkZXIoKTsNCisgIENGWF9CeXRlU3RyaW5nIERlY29kZVJvdyhpbnQzMl90IHJvd051bWJlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQml0QXJyYXkqIHJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlUm93KGludDMyX3Qgcm93TnVtYmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CaXRBcnJheSogcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5KiBzdGFydEd1YXJkUmFuZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIENGWF9CeXRlU3RyaW5nIERlY29kZShDQkNfQmluYXJ5Qml0bWFwKiBpbWFnZSwgaW50MzJfdCYgZSk7DQorICBDRlhfQnl0ZVN0cmluZyBEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCogaW1hZ2UsIGludDMyX3QgaGludHMsIGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCB2b2lkIEluaXQoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgaW50MzJfdCBEZWNvZGVNaWRkbGUoQ0JDX0NvbW1vbkJpdEFycmF5KiByb3csDQorICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSogc3RhcnRSYW5nZSwNCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHRTdHJpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIENGWF9CeXRlU3RyaW5nIE1heWJlUmV0dXJuUmVzdWx0KENGWF9CeXRlU3RyaW5nJiByZXN1bHQsIGludDMyX3QmIGUpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkVVBDQVdyaXRlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRVUENBV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTM0ZWQ5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkVVBDQVdyaXRlci5jcHAKQEAgLTAsMCArMSwyOTEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMTAgWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19Xcml0ZXIuaCINCisjaW5jbHVkZSAiQkNfT25lRGltV3JpdGVyLmgiDQorI2luY2x1ZGUgIkJDX09uZWRFQU4xM1dyaXRlci5oIg0KKyNpbmNsdWRlICJCQ19PbmVkVVBDQVdyaXRlci5oIg0KK0NCQ19PbmVkVVBDQVdyaXRlcjo6Q0JDX09uZWRVUENBV3JpdGVyKCkgew0KKyAgbV9zdWJXcml0ZXIgPSBOVUxMOw0KKyAgbV9iTGVmdFBhZGRpbmcgPSBUUlVFOw0KKyAgbV9iUmlnaHRQYWRkaW5nID0gVFJVRTsNCit9DQordm9pZCBDQkNfT25lZFVQQ0FXcml0ZXI6OkluaXQoKSB7DQorICBtX3N1YldyaXRlciA9IG5ldyBDQkNfT25lZEVBTjEzV3JpdGVyOw0KK30NCitDQkNfT25lZFVQQ0FXcml0ZXI6On5DQkNfT25lZFVQQ0FXcml0ZXIoKSB7DQorICBpZiAobV9zdWJXcml0ZXIgIT0gTlVMTCkgew0KKyAgICBkZWxldGUgbV9zdWJXcml0ZXI7DQorICB9DQorICBtX3N1YldyaXRlciA9IE5VTEw7DQorfQ0KK0ZYX0JPT0wgQ0JDX09uZWRVUENBV3JpdGVyOjpDaGVja0NvbnRlbnRWYWxpZGl0eSgNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgew0KKyAgaW50MzJfdCBpID0gMDsNCisgIGZvciAoaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7DQorICAgIGlmIChjb250ZW50cy5HZXRBdChpKSA+PSAnMCcgJiYgY29udGVudHMuR2V0QXQoaSkgPD0gJzknKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0gZWxzZSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX09uZWRVUENBV3JpdGVyOjpGaWx0ZXJDb250ZW50cygNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgZmlsdGVyY29udGVudHM7DQorICBGWF9XQ0hBUiBjaDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpOyBpKyspIHsNCisgICAgY2ggPSBjb250ZW50cy5HZXRBdChpKTsNCisgICAgaWYgKGNoID4gMTc1KSB7DQorICAgICAgaSsrOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7DQorICAgICAgZmlsdGVyY29udGVudHMgKz0gY2g7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBmaWx0ZXJjb250ZW50czsNCit9DQoraW50MzJfdCBDQkNfT25lZFVQQ0FXcml0ZXI6OkNhbGNDaGVja3N1bShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMpIHsNCisgIGludDMyX3Qgb2RkID0gMDsNCisgIGludDMyX3QgZXZlbiA9IDA7DQorICBpbnQzMl90IGogPSAxOw0KKyAgZm9yIChpbnQzMl90IGkgPSBjb250ZW50cy5HZXRMZW5ndGgoKSAtIDE7IGkgPj0gMDsgaS0tKSB7DQorICAgIGlmIChqICUgMikgew0KKyAgICAgIG9kZCArPSBGWFNZU19hdG9pKGNvbnRlbnRzLk1pZChpLCAxKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgZXZlbiArPSBGWFNZU19hdG9pKGNvbnRlbnRzLk1pZChpLCAxKSk7DQorICAgIH0NCisgICAgaisrOw0KKyAgfQ0KKyAgaW50MzJfdCBjaGVja3N1bSA9IChvZGQgKiAzICsgZXZlbikgJSAxMDsNCisgIGNoZWNrc3VtID0gKDEwIC0gY2hlY2tzdW0pICUgMTA7DQorICByZXR1cm4gKGNoZWNrc3VtKTsNCit9DQordWludDhfdCogQ0JDX09uZWRVUENBV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgdWludDhfdCogcmV0ID0gRW5jb2RlKGNvbnRlbnRzLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIDAsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIHJldDsNCit9DQordWludDhfdCogQ0JDX09uZWRVUENBV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoZm9ybWF0ICE9IEJDRk9STUFUX1VQQ19BKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk9ubHlFbmNvZGVVUENfQTsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDRlhfQnl0ZVN0cmluZyB0b0VBTjEzU3RyaW5nID0gJzAnICsgY29udGVudHM7DQorICBtX2lEYXRhTGVudGggPSAxMzsNCisgIHVpbnQ4X3QqIHJldCA9IG1fc3ViV3JpdGVyLT5FbmNvZGUodG9FQU4xM1N0cmluZywgQkNGT1JNQVRfRUFOXzEzLCBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SGVpZ2h0LCBoaW50cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gcmV0Ow0KK30NCit2b2lkIENCQ19PbmVkVVBDQVdyaXRlcjo6U2hvd0NoYXJzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBPdXRCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJhcldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtdWx0aXBsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChkZXZpY2UgPT0gTlVMTCAmJiBwT3V0Qml0bWFwID09IE5VTEwpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50Ow0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGxlZnRQYWRkaW5nID0gNyAqIG11bHRpcGxlOw0KKyAgaW50MzJfdCBsZWZ0UG9zaXRpb24gPSAxMCAqIG11bHRpcGxlICsgbGVmdFBhZGRpbmc7DQorICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBGWF9VVEY4RW5jb2RlKGNvbnRlbnRzKTsNCisgIGludDMyX3QgaUxlbiA9IHN0ci5HZXRMZW5ndGgoKTsNCisgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcyA9IEZYX0FsbG9jKEZYVEVYVF9DSEFSUE9TLCBpTGVuKTsNCisgIEZYU1lTX21lbXNldChwQ2hhclBvcywgMCwgc2l6ZW9mKEZYVEVYVF9DSEFSUE9TKSAqIGlMZW4pOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgdGVtcFN0ciA9IHN0ci5NaWQoMSwgNSk7DQorICBGWF9GTE9BVCBzdHJXaWR0aCA9IChGWF9GTE9BVCkzNSAqIG11bHRpcGxlOw0KKyAgRlhfRkxPQVQgYmxhbmsgPSAwLjA7DQorICBDRlhfRnhnZURldmljZSBnZUJpdG1hcDsNCisgIGlmIChwT3V0Qml0bWFwICE9IE5VTEwpIHsNCisgICAgZ2VCaXRtYXAuQXR0YWNoKHBPdXRCaXRtYXApOw0KKyAgfQ0KKyAgRlhfRkxPQVQgY2hhcnNXaWR0aCA9IDA7DQorICBpTGVuID0gdGVtcFN0ci5HZXRMZW5ndGgoKTsNCisgIGludDMyX3QgaUZvbnRTaXplID0gKGludDMyX3QpZmFicyhtX2ZGb250U2l6ZSk7DQorICBpbnQzMl90IGlUZXh0SGVpZ2h0ID0gaUZvbnRTaXplICsgMTsNCisgIGlmIChwT3V0Qml0bWFwID09IE5VTEwpIHsNCisgICAgQ0ZYX01hdHJpeCBtYXRyKG1fb3V0cHV0SFNjYWxlLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCk7DQorICAgIENGWF9GbG9hdFJlY3QgcmVjdCgNCisgICAgICAgIChGWF9GTE9BVClsZWZ0UG9zaXRpb24sIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCksDQorICAgICAgICAoRlhfRkxPQVQpKGxlZnRQb3NpdGlvbiArIHN0cldpZHRoIC0gMC41KSwgKEZYX0ZMT0FUKW1fSGVpZ2h0KTsNCisgICAgbWF0ci5Db25jYXQoKm1hdHJpeCk7DQorICAgIG1hdHIuVHJhbnNmb3JtUmVjdChyZWN0KTsNCisgICAgRlhfUkVDVCByZSA9IHJlY3QuR2V0T3V0dGVyUmVjdCgpOw0KKyAgICBkZXZpY2UtPkZpbGxSZWN0KCZyZSwgbV9iYWNrZ3JvdW5kQ29sb3IpOw0KKyAgICBDRlhfTWF0cml4IG1hdHIxKG1fb3V0cHV0SFNjYWxlLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCk7DQorICAgIENGWF9GbG9hdFJlY3QgcmVjdDEoDQorICAgICAgICAoRlhfRkxPQVQpKGxlZnRQb3NpdGlvbiArIDQwICogbXVsdGlwbGUpLA0KKyAgICAgICAgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KSwNCisgICAgICAgIChGWF9GTE9BVCkoKGxlZnRQb3NpdGlvbiArIDQwICogbXVsdGlwbGUpICsgc3RyV2lkdGggLSAwLjUpLA0KKyAgICAgICAgKEZYX0ZMT0FUKW1fSGVpZ2h0KTsNCisgICAgbWF0cjEuQ29uY2F0KCptYXRyaXgpOw0KKyAgICBtYXRyMS5UcmFuc2Zvcm1SZWN0KHJlY3QxKTsNCisgICAgcmUgPSByZWN0MS5HZXRPdXR0ZXJSZWN0KCk7DQorICAgIGRldmljZS0+RmlsbFJlY3QoJnJlLCBtX2JhY2tncm91bmRDb2xvcik7DQorICAgIEZYX0ZMT0FUIHN0cldpZHRoMSA9IChGWF9GTE9BVCltdWx0aXBsZSAqIDc7DQorICAgIENGWF9NYXRyaXggbWF0cjIobV9vdXRwdXRIU2NhbGUsIDAuMCwgMC4wLCAxLjAsIDAuMCwgMC4wKTsNCisgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0MigwLjAsIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCksDQorICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKXN0cldpZHRoMSAtIDEsIChGWF9GTE9BVCltX0hlaWdodCk7DQorICAgIG1hdHIyLkNvbmNhdCgqbWF0cml4KTsNCisgICAgbWF0cjIuVHJhbnNmb3JtUmVjdChyZWN0Mik7DQorICAgIHJlID0gcmVjdDIuR2V0T3V0dGVyUmVjdCgpOw0KKyAgICBkZXZpY2UtPkZpbGxSZWN0KCZyZSwgbV9iYWNrZ3JvdW5kQ29sb3IpOw0KKyAgICBDRlhfTWF0cml4IG1hdHIzKG1fb3V0cHV0SFNjYWxlLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCk7DQorICAgIENGWF9GbG9hdFJlY3QgcmVjdDMoDQorICAgICAgICAoRlhfRkxPQVQpKGxlZnRQb3NpdGlvbiArIDg1ICogbXVsdGlwbGUpLA0KKyAgICAgICAgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KSwNCisgICAgICAgIChGWF9GTE9BVCkoKGxlZnRQb3NpdGlvbiArIDg1ICogbXVsdGlwbGUpICsgc3RyV2lkdGgxIC0gMC41KSwNCisgICAgICAgIChGWF9GTE9BVCltX0hlaWdodCk7DQorICAgIG1hdHIzLkNvbmNhdCgqbWF0cml4KTsNCisgICAgbWF0cjMuVHJhbnNmb3JtUmVjdChyZWN0Myk7DQorICAgIHJlID0gcmVjdDMuR2V0T3V0dGVyUmVjdCgpOw0KKyAgICBkZXZpY2UtPkZpbGxSZWN0KCZyZSwgbV9iYWNrZ3JvdW5kQ29sb3IpOw0KKyAgfQ0KKyAgaWYgKHBPdXRCaXRtYXAgPT0gTlVMTCkgew0KKyAgICBzdHJXaWR0aCA9IHN0cldpZHRoICogbV9vdXRwdXRIU2NhbGU7DQorICB9DQorICBDYWxjVGV4dEluZm8odGVtcFN0ciwgcENoYXJQb3MgKyAxLCBtX3BGb250LCBzdHJXaWR0aCwgaUZvbnRTaXplLCBibGFuayk7DQorICBDRlhfTWF0cml4IGFmZmluZV9tYXRyaXgoMS4wLCAwLjAsIDAuMCwgLTEuMCwgMC4wLCAoRlhfRkxPQVQpaUZvbnRTaXplKTsNCisgIENGWF9GeGdlRGV2aWNlIGdlOw0KKyAgaWYgKHBPdXRCaXRtYXAgIT0gTlVMTCkgew0KKyAgICBnZS5DcmVhdGUoKGludClzdHJXaWR0aCwgaVRleHRIZWlnaHQsIEZYRElCX0FyZ2IpOw0KKyAgICBnZS5HZXRCaXRtYXAoKS0+Q2xlYXIobV9iYWNrZ3JvdW5kQ29sb3IpOw0KKyAgICBnZS5EcmF3Tm9ybWFsVGV4dChpTGVuLCBwQ2hhclBvcyArIDEsIG1fcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLCAoRlhfRkxPQVQpaUZvbnRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX01hdHJpeCopJmFmZmluZV9tYXRyaXgsIG1fZm9udENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0xFQVJUWVBFKTsNCisgICAgZ2VCaXRtYXAuU2V0RElCaXRzKGdlLkdldEJpdG1hcCgpLCBsZWZ0UG9zaXRpb24sIG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpOw0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX01hdHJpeCBhZmZpbmVfbWF0cml4MSgxLjAsIDAuMCwgMC4wLCAtMS4wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClsZWZ0UG9zaXRpb24gKiBtX291dHB1dEhTY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQgKyBpRm9udFNpemUpKTsNCisgICAgaWYgKG1hdHJpeCAhPSBOVUxMKSB7DQorICAgICAgYWZmaW5lX21hdHJpeDEuQ29uY2F0KCptYXRyaXgpOw0KKyAgICB9DQorICAgIGRldmljZS0+RHJhd05vcm1hbFRleHQoaUxlbiwgcENoYXJQb3MgKyAxLCBtX3BGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClpRm9udFNpemUsIChDRlhfTWF0cml4KikmYWZmaW5lX21hdHJpeDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgfQ0KKyAgdGVtcFN0ciA9IHN0ci5NaWQoNiwgNSk7DQorICBpTGVuID0gdGVtcFN0ci5HZXRMZW5ndGgoKTsNCisgIGNoYXJzV2lkdGggPSAwLjBmOw0KKyAgQ2FsY1RleHRJbmZvKHRlbXBTdHIsIHBDaGFyUG9zICsgNiwgbV9wRm9udCwgc3RyV2lkdGgsIGlGb250U2l6ZSwgYmxhbmspOw0KKyAgaWYgKHBPdXRCaXRtYXAgIT0gTlVMTCkgew0KKyAgICBGWF9SRUNUIHJlY3QyKDAsIDAsIChpbnQpc3RyV2lkdGgsIGlUZXh0SGVpZ2h0KTsNCisgICAgZ2UuRmlsbFJlY3QoJnJlY3QyLCBtX2JhY2tncm91bmRDb2xvcik7DQorICAgIGdlLkRyYXdOb3JtYWxUZXh0KGlMZW4sIHBDaGFyUG9zICsgNiwgbV9wRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCksIChGWF9GTE9BVClpRm9udFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgIChDRlhfTWF0cml4KikmYWZmaW5lX21hdHJpeCwgbV9mb250Q29sb3IsDQorICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgICBnZUJpdG1hcC5TZXRESUJpdHMoZ2UuR2V0Qml0bWFwKCksIGxlZnRQb3NpdGlvbiArIDQwICogbXVsdGlwbGUsDQorICAgICAgICAgICAgICAgICAgICAgICBtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KTsNCisgIH0gZWxzZSB7DQorICAgIENGWF9NYXRyaXggYWZmaW5lX21hdHJpeDEoDQorICAgICAgICAxLjAsIDAuMCwgMC4wLCAtMS4wLA0KKyAgICAgICAgKEZYX0ZMT0FUKShsZWZ0UG9zaXRpb24gKyA0MCAqIG11bHRpcGxlKSAqIG1fb3V0cHV0SFNjYWxlLA0KKyAgICAgICAgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0ICsgaUZvbnRTaXplKSk7DQorICAgIGlmIChtYXRyaXggIT0gTlVMTCkgew0KKyAgICAgIGFmZmluZV9tYXRyaXgxLkNvbmNhdCgqbWF0cml4KTsNCisgICAgfQ0KKyAgICBkZXZpY2UtPkRyYXdOb3JtYWxUZXh0KGlMZW4sIHBDaGFyUG9zICsgNiwgbV9wRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpaUZvbnRTaXplLCAoQ0ZYX01hdHJpeCopJmFmZmluZV9tYXRyaXgxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsNCisgIH0NCisgIHRlbXBTdHIgPSBzdHIuTWlkKDAsIDEpOw0KKyAgaUxlbiA9IHRlbXBTdHIuR2V0TGVuZ3RoKCk7DQorICBzdHJXaWR0aCA9IChGWF9GTE9BVCltdWx0aXBsZSAqIDc7DQorICBpZiAocE91dEJpdG1hcCA9PSBOVUxMKSB7DQorICAgIHN0cldpZHRoID0gc3RyV2lkdGggKiBtX291dHB1dEhTY2FsZTsNCisgIH0NCisgIENhbGNUZXh0SW5mbyh0ZW1wU3RyLCBwQ2hhclBvcywgbV9wRm9udCwgc3RyV2lkdGgsIGlGb250U2l6ZSwgYmxhbmspOw0KKyAgaWYgKHBPdXRCaXRtYXAgIT0gTlVMTCkgew0KKyAgICBkZWxldGUgZ2UuR2V0Qml0bWFwKCk7DQorICAgIGdlLkNyZWF0ZSgoaW50KXN0cldpZHRoLCBpVGV4dEhlaWdodCwgRlhESUJfQXJnYik7DQorICAgIGdlLkdldEJpdG1hcCgpLT5DbGVhcihtX2JhY2tncm91bmRDb2xvcik7DQorICAgIGdlLkRyYXdOb3JtYWxUZXh0KGlMZW4sIHBDaGFyUG9zLCBtX3BGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKSwgKEZYX0ZMT0FUKWlGb250U2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgKENGWF9NYXRyaXgqKSZhZmZpbmVfbWF0cml4LCBtX2ZvbnRDb2xvciwNCisgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NMRUFSVFlQRSk7DQorICAgIGdlQml0bWFwLlNldERJQml0cyhnZS5HZXRCaXRtYXAoKSwgMCwgbV9IZWlnaHQgLSBpVGV4dEhlaWdodCk7DQorICB9IGVsc2Ugew0KKyAgICBDRlhfTWF0cml4IGFmZmluZV9tYXRyaXgxKDEuMCwgMC4wLCAwLjAsIC0xLjAsIDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0ICsgaUZvbnRTaXplKSk7DQorICAgIGlmIChtYXRyaXggIT0gTlVMTCkgew0KKyAgICAgIGFmZmluZV9tYXRyaXgxLkNvbmNhdCgqbWF0cml4KTsNCisgICAgfQ0KKyAgICBkZXZpY2UtPkRyYXdOb3JtYWxUZXh0KGlMZW4sIHBDaGFyUG9zLCBtX3BGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClpRm9udFNpemUsIChDRlhfTWF0cml4KikmYWZmaW5lX21hdHJpeDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgfQ0KKyAgdGVtcFN0ciA9IHN0ci5NaWQoMTEsIDEpOw0KKyAgaUxlbiA9IHRlbXBTdHIuR2V0TGVuZ3RoKCk7DQorICBDYWxjVGV4dEluZm8odGVtcFN0ciwgcENoYXJQb3MgKyAxMSwgbV9wRm9udCwgc3RyV2lkdGgsIGlGb250U2l6ZSwgYmxhbmspOw0KKyAgaWYgKHBPdXRCaXRtYXAgIT0gTlVMTCkgew0KKyAgICBkZWxldGUgZ2UuR2V0Qml0bWFwKCk7DQorICAgIGdlLkNyZWF0ZSgoaW50KXN0cldpZHRoLCBpVGV4dEhlaWdodCwgRlhESUJfQXJnYik7DQorICAgIGdlLkdldEJpdG1hcCgpLT5DbGVhcihtX2JhY2tncm91bmRDb2xvcik7DQorICAgIGdlLkRyYXdOb3JtYWxUZXh0KGlMZW4sIHBDaGFyUG9zICsgMTEsIG1fcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLCAoRlhfRkxPQVQpaUZvbnRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAoQ0ZYX01hdHJpeCopJmFmZmluZV9tYXRyaXgsIG1fZm9udENvbG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0xFQVJUWVBFKTsNCisgICAgZ2VCaXRtYXAuU2V0RElCaXRzKGdlLkdldEJpdG1hcCgpLCBsZWZ0UG9zaXRpb24gKyA4NSAqIG11bHRpcGxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgbV9IZWlnaHQgLSBpVGV4dEhlaWdodCk7DQorICB9IGVsc2Ugew0KKyAgICBDRlhfTWF0cml4IGFmZmluZV9tYXRyaXgxKA0KKyAgICAgICAgMS4wLCAwLjAsIDAuMCwgLTEuMCwNCisgICAgICAgIChGWF9GTE9BVCkobGVmdFBvc2l0aW9uICsgODUgKiBtdWx0aXBsZSkgKiBtX291dHB1dEhTY2FsZSwNCisgICAgICAgIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCArIGlGb250U2l6ZSkpOw0KKyAgICBpZiAobWF0cml4ICE9IE5VTEwpIHsNCisgICAgICBhZmZpbmVfbWF0cml4MS5Db25jYXQoKm1hdHJpeCk7DQorICAgIH0NCisgICAgZGV2aWNlLT5EcmF3Tm9ybWFsVGV4dChpTGVuLCBwQ2hhclBvcyArIDExLCBtX3BGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClpRm9udFNpemUsIChDRlhfTWF0cml4KikmYWZmaW5lX21hdHJpeDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOw0KKyAgfQ0KKyAgRlhfRnJlZShwQ2hhclBvcyk7DQorfQ0KK3ZvaWQgQ0JDX09uZWRVUENBV3JpdGVyOjpSZW5kZXJSZXN1bHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzRGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0JDX09uZURpbVdyaXRlcjo6UmVuZGVyUmVzdWx0KGNvbnRlbnRzLCBjb2RlLCBjb2RlTGVuZ3RoLCBpc0RldmljZSwgZSk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZFVQQ0FXcml0ZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL29uZWQvQkNfT25lZFVQQ0FXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjg5OTcyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvb25lZC9CQ19PbmVkVVBDQVdyaXRlci5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfT05FRFVQQ0FXUklURVJfSF8NCisjZGVmaW5lIF9CQ19PTkVEVVBDQVdSSVRFUl9IXw0KK2NsYXNzIENCQ19Xcml0ZXI7DQorY2xhc3MgQ0JDX09uZWRFQU4xM1dyaXRlcjsNCitjbGFzcyBDQkNfT25lZFVQQ0FXcml0ZXI7DQorY2xhc3MgQ0JDX09uZWRVUENBV3JpdGVyIDogcHVibGljIENCQ19PbmVEaW1Xcml0ZXIgew0KKyBwcml2YXRlOg0KKyAgQ0JDX09uZWRFQU4xM1dyaXRlciogbV9zdWJXcml0ZXI7DQorDQorIHB1YmxpYzoNCisgIENCQ19PbmVkVVBDQVdyaXRlcigpOw0KKyAgdmlydHVhbCB+Q0JDX09uZWRVUENBV3JpdGVyKCk7DQorICB2aXJ0dWFsIHZvaWQgSW5pdCgpOw0KKyAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dExlbmd0aCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICAgIHJldHVybiBudWxscHRyOw0KKyAgfQ0KKyAgdm9pZCBSZW5kZXJSZXN1bHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvZGUsDQorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzRGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBGWF9CT09MIENoZWNrQ29udGVudFZhbGlkaXR5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgRmlsdGVyQ29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7DQorICBpbnQzMl90IENhbGNDaGVja3N1bShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIFNob3dDaGFycyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLA0KKyAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwT3V0Qml0bWFwLA0KKyAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCBiYXJXaWR0aCwNCisgICAgICAgICAgICAgICAgIGludDMyX3QgbXVsdGlwbGUsDQorICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTcuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxNy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwNjg2MgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTcuY3BwCkBAIC0wLDAgKzEsNTg1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDA2IEplcmVtaWFzIE1hZXJraSBpbiBwYXJ0LCBhbmQgWlhpbmcgQXV0aG9ycyBpbiBwYXJ0DQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdDb21wYWN0aW9uLmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0JhcmNvZGVSb3cuaCINCisjaW5jbHVkZSAiQkNfUERGNDE3QmFyY29kZU1hdHJpeC5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdFcnJvckNvcnJlY3Rpb24uaCINCisjaW5jbHVkZSAiQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTcuaCINCitpbnQzMl90IENCQ19QREY0MTc6OlNUQVJUX1BBVFRFUk4gPSAweDFmZWE4Ow0KK2ludDMyX3QgQ0JDX1BERjQxNzo6U1RPUF9QQVRURVJOID0gMHgzZmEyOTsNCitpbnQzMl90IENCQ19QREY0MTc6OkNPREVXT1JEX1RBQkxFW11bMTAwMF0gPSB7DQorICAgIHsweDFkNWMwLCAweDFlYWYwLCAweDFmNTdjLCAweDFkNGUwLCAweDFlYTc4LCAweDFmNTNlLCAweDFhOGMwLCAweDFkNDcwLA0KKyAgICAgMHgxYTg2MCwgMHgxNTA0MCwgMHgxYTgzMCwgMHgxNTAyMCwgMHgxYWRjMCwgMHgxZDZmMCwgMHgxZWI3YywgMHgxYWNlMCwNCisgICAgIDB4MWQ2NzgsIDB4MWViM2UsIDB4MTU4YzAsIDB4MWFjNzAsIDB4MTU4NjAsIDB4MTVkYzAsIDB4MWFlZjAsIDB4MWQ3N2MsDQorICAgICAweDE1Y2UwLCAweDFhZTc4LCAweDFkNzNlLCAweDE1YzcwLCAweDFhZTNjLCAweDE1ZWYwLCAweDFhZjdjLCAweDE1ZTc4LA0KKyAgICAgMHgxYWYzZSwgMHgxNWY3YywgMHgxZjVmYSwgMHgxZDJlMCwgMHgxZTk3OCwgMHgxZjRiZSwgMHgxYTRjMCwgMHgxZDI3MCwNCisgICAgIDB4MWU5M2MsIDB4MWE0NjAsIDB4MWQyMzgsIDB4MTQ4NDAsIDB4MWE0MzAsIDB4MWQyMWMsIDB4MTQ4MjAsIDB4MWE0MTgsDQorICAgICAweDE0ODEwLCAweDFhNmUwLCAweDFkMzc4LCAweDFlOWJlLCAweDE0Y2MwLCAweDFhNjcwLCAweDFkMzNjLCAweDE0YzYwLA0KKyAgICAgMHgxYTYzOCwgMHgxZDMxZSwgMHgxNGMzMCwgMHgxYTYxYywgMHgxNGVlMCwgMHgxYTc3OCwgMHgxZDNiZSwgMHgxNGU3MCwNCisgICAgIDB4MWE3M2MsIDB4MTRlMzgsIDB4MWE3MWUsIDB4MTRmNzgsIDB4MWE3YmUsIDB4MTRmM2MsIDB4MTRmMWUsIDB4MWEyYzAsDQorICAgICAweDFkMTcwLCAweDFlOGJjLCAweDFhMjYwLCAweDFkMTM4LCAweDFlODllLCAweDE0NDQwLCAweDFhMjMwLCAweDFkMTFjLA0KKyAgICAgMHgxNDQyMCwgMHgxYTIxOCwgMHgxNDQxMCwgMHgxNDQwOCwgMHgxNDZjMCwgMHgxYTM3MCwgMHgxZDFiYywgMHgxNDY2MCwNCisgICAgIDB4MWEzMzgsIDB4MWQxOWUsIDB4MTQ2MzAsIDB4MWEzMWMsIDB4MTQ2MTgsIDB4MTQ2MGMsIDB4MTQ3NzAsIDB4MWEzYmMsDQorICAgICAweDE0NzM4LCAweDFhMzllLCAweDE0NzFjLCAweDE0N2JjLCAweDFhMTYwLCAweDFkMGI4LCAweDFlODVlLCAweDE0MjQwLA0KKyAgICAgMHgxYTEzMCwgMHgxZDA5YywgMHgxNDIyMCwgMHgxYTExOCwgMHgxZDA4ZSwgMHgxNDIxMCwgMHgxYTEwYywgMHgxNDIwOCwNCisgICAgIDB4MWExMDYsIDB4MTQzNjAsIDB4MWExYjgsIDB4MWQwZGUsIDB4MTQzMzAsIDB4MWExOWMsIDB4MTQzMTgsIDB4MWExOGUsDQorICAgICAweDE0MzBjLCAweDE0MzA2LCAweDFhMWRlLCAweDE0MzhlLCAweDE0MTQwLCAweDFhMGIwLCAweDFkMDVjLCAweDE0MTIwLA0KKyAgICAgMHgxYTA5OCwgMHgxZDA0ZSwgMHgxNDExMCwgMHgxYTA4YywgMHgxNDEwOCwgMHgxYTA4NiwgMHgxNDEwNCwgMHgxNDFiMCwNCisgICAgIDB4MTQxOTgsIDB4MTQxOGMsIDB4MTQwYTAsIDB4MWQwMmUsIDB4MWEwNGMsIDB4MWEwNDYsIDB4MTQwODIsIDB4MWNhZTAsDQorICAgICAweDFlNTc4LCAweDFmMmJlLCAweDE5NGMwLCAweDFjYTcwLCAweDFlNTNjLCAweDE5NDYwLCAweDFjYTM4LCAweDFlNTFlLA0KKyAgICAgMHgxMjg0MCwgMHgxOTQzMCwgMHgxMjgyMCwgMHgxOTZlMCwgMHgxY2I3OCwgMHgxZTViZSwgMHgxMmNjMCwgMHgxOTY3MCwNCisgICAgIDB4MWNiM2MsIDB4MTJjNjAsIDB4MTk2MzgsIDB4MTJjMzAsIDB4MTJjMTgsIDB4MTJlZTAsIDB4MTk3NzgsIDB4MWNiYmUsDQorICAgICAweDEyZTcwLCAweDE5NzNjLCAweDEyZTM4LCAweDEyZTFjLCAweDEyZjc4LCAweDE5N2JlLCAweDEyZjNjLCAweDEyZmJlLA0KKyAgICAgMHgxZGFjMCwgMHgxZWQ3MCwgMHgxZjZiYywgMHgxZGE2MCwgMHgxZWQzOCwgMHgxZjY5ZSwgMHgxYjQ0MCwgMHgxZGEzMCwNCisgICAgIDB4MWVkMWMsIDB4MWI0MjAsIDB4MWRhMTgsIDB4MWVkMGUsIDB4MWI0MTAsIDB4MWRhMGMsIDB4MTkyYzAsIDB4MWM5NzAsDQorICAgICAweDFlNGJjLCAweDFiNmMwLCAweDE5MjYwLCAweDFjOTM4LCAweDFlNDllLCAweDFiNjYwLCAweDFkYjM4LCAweDFlZDllLA0KKyAgICAgMHgxNmM0MCwgMHgxMjQyMCwgMHgxOTIxOCwgMHgxYzkwZSwgMHgxNmMyMCwgMHgxYjYxOCwgMHgxNmMxMCwgMHgxMjZjMCwNCisgICAgIDB4MTkzNzAsIDB4MWM5YmMsIDB4MTZlYzAsIDB4MTI2NjAsIDB4MTkzMzgsIDB4MWM5OWUsIDB4MTZlNjAsIDB4MWI3MzgsDQorICAgICAweDFkYjllLCAweDE2ZTMwLCAweDEyNjE4LCAweDE2ZTE4LCAweDEyNzcwLCAweDE5M2JjLCAweDE2ZjcwLCAweDEyNzM4LA0KKyAgICAgMHgxOTM5ZSwgMHgxNmYzOCwgMHgxYjc5ZSwgMHgxNmYxYywgMHgxMjdiYywgMHgxNmZiYywgMHgxMjc5ZSwgMHgxNmY5ZSwNCisgICAgIDB4MWQ5NjAsIDB4MWVjYjgsIDB4MWY2NWUsIDB4MWIyNDAsIDB4MWQ5MzAsIDB4MWVjOWMsIDB4MWIyMjAsIDB4MWQ5MTgsDQorICAgICAweDFlYzhlLCAweDFiMjEwLCAweDFkOTBjLCAweDFiMjA4LCAweDFiMjA0LCAweDE5MTYwLCAweDFjOGI4LCAweDFlNDVlLA0KKyAgICAgMHgxYjM2MCwgMHgxOTEzMCwgMHgxYzg5YywgMHgxNjY0MCwgMHgxMjIyMCwgMHgxZDk5YywgMHgxYzg4ZSwgMHgxNjYyMCwNCisgICAgIDB4MTIyMTAsIDB4MTkxMGMsIDB4MTY2MTAsIDB4MWIzMGMsIDB4MTkxMDYsIDB4MTIyMDQsIDB4MTIzNjAsIDB4MTkxYjgsDQorICAgICAweDFjOGRlLCAweDE2NzYwLCAweDEyMzMwLCAweDE5MTljLCAweDE2NzMwLCAweDFiMzljLCAweDE5MThlLCAweDE2NzE4LA0KKyAgICAgMHgxMjMwYywgMHgxMjMwNiwgMHgxMjNiOCwgMHgxOTFkZSwgMHgxNjdiOCwgMHgxMjM5YywgMHgxNjc5YywgMHgxMjM4ZSwNCisgICAgIDB4MTY3OGUsIDB4MTY3ZGUsIDB4MWIxNDAsIDB4MWQ4YjAsIDB4MWVjNWMsIDB4MWIxMjAsIDB4MWQ4OTgsIDB4MWVjNGUsDQorICAgICAweDFiMTEwLCAweDFkODhjLCAweDFiMTA4LCAweDFkODg2LCAweDFiMTA0LCAweDFiMTAyLCAweDEyMTQwLCAweDE5MGIwLA0KKyAgICAgMHgxYzg1YywgMHgxNjM0MCwgMHgxMjEyMCwgMHgxOTA5OCwgMHgxYzg0ZSwgMHgxNjMyMCwgMHgxYjE5OCwgMHgxZDhjZSwNCisgICAgIDB4MTYzMTAsIDB4MTIxMDgsIDB4MTkwODYsIDB4MTYzMDgsIDB4MWIxODYsIDB4MTYzMDQsIDB4MTIxYjAsIDB4MTkwZGMsDQorICAgICAweDE2M2IwLCAweDEyMTk4LCAweDE5MGNlLCAweDE2Mzk4LCAweDFiMWNlLCAweDE2MzhjLCAweDEyMTg2LCAweDE2Mzg2LA0KKyAgICAgMHgxNjNkYywgMHgxNjNjZSwgMHgxYjBhMCwgMHgxZDg1OCwgMHgxZWMyZSwgMHgxYjA5MCwgMHgxZDg0YywgMHgxYjA4OCwNCisgICAgIDB4MWQ4NDYsIDB4MWIwODQsIDB4MWIwODIsIDB4MTIwYTAsIDB4MTkwNTgsIDB4MWM4MmUsIDB4MTYxYTAsIDB4MTIwOTAsDQorICAgICAweDE5MDRjLCAweDE2MTkwLCAweDFiMGNjLCAweDE5MDQ2LCAweDE2MTg4LCAweDEyMDg0LCAweDE2MTg0LCAweDEyMDgyLA0KKyAgICAgMHgxMjBkOCwgMHgxNjFkOCwgMHgxNjFjYywgMHgxNjFjNiwgMHgxZDgyYywgMHgxZDgyNiwgMHgxYjA0MiwgMHgxOTAyYywNCisgICAgIDB4MTIwNDgsIDB4MTYwYzgsIDB4MTYwYzQsIDB4MTYwYzIsIDB4MThhYzAsIDB4MWM1NzAsIDB4MWUyYmMsIDB4MThhNjAsDQorICAgICAweDFjNTM4LCAweDExNDQwLCAweDE4YTMwLCAweDFjNTFjLCAweDExNDIwLCAweDE4YTE4LCAweDExNDEwLCAweDExNDA4LA0KKyAgICAgMHgxMTZjMCwgMHgxOGI3MCwgMHgxYzViYywgMHgxMTY2MCwgMHgxOGIzOCwgMHgxYzU5ZSwgMHgxMTYzMCwgMHgxOGIxYywNCisgICAgIDB4MTE2MTgsIDB4MTE2MGMsIDB4MTE3NzAsIDB4MThiYmMsIDB4MTE3MzgsIDB4MThiOWUsIDB4MTE3MWMsIDB4MTE3YmMsDQorICAgICAweDExNzllLCAweDFjZDYwLCAweDFlNmI4LCAweDFmMzVlLCAweDE5YTQwLCAweDFjZDMwLCAweDFlNjljLCAweDE5YTIwLA0KKyAgICAgMHgxY2QxOCwgMHgxZTY4ZSwgMHgxOWExMCwgMHgxY2QwYywgMHgxOWEwOCwgMHgxY2QwNiwgMHgxODk2MCwgMHgxYzRiOCwNCisgICAgIDB4MWUyNWUsIDB4MTliNjAsIDB4MTg5MzAsIDB4MWM0OWMsIDB4MTM2NDAsIDB4MTEyMjAsIDB4MWNkOWMsIDB4MWM0OGUsDQorICAgICAweDEzNjIwLCAweDE5YjE4LCAweDE4OTBjLCAweDEzNjEwLCAweDExMjA4LCAweDEzNjA4LCAweDExMzYwLCAweDE4OWI4LA0KKyAgICAgMHgxYzRkZSwgMHgxMzc2MCwgMHgxMTMzMCwgMHgxY2RkZSwgMHgxMzczMCwgMHgxOWI5YywgMHgxODk4ZSwgMHgxMzcxOCwNCisgICAgIDB4MTEzMGMsIDB4MTM3MGMsIDB4MTEzYjgsIDB4MTg5ZGUsIDB4MTM3YjgsIDB4MTEzOWMsIDB4MTM3OWMsIDB4MTEzOGUsDQorICAgICAweDExM2RlLCAweDEzN2RlLCAweDFkZDQwLCAweDFlZWIwLCAweDFmNzVjLCAweDFkZDIwLCAweDFlZTk4LCAweDFmNzRlLA0KKyAgICAgMHgxZGQxMCwgMHgxZWU4YywgMHgxZGQwOCwgMHgxZWU4NiwgMHgxZGQwNCwgMHgxOTk0MCwgMHgxY2NiMCwgMHgxZTY1YywNCisgICAgIDB4MWJiNDAsIDB4MTk5MjAsIDB4MWVlZGMsIDB4MWU2NGUsIDB4MWJiMjAsIDB4MWRkOTgsIDB4MWVlY2UsIDB4MWJiMTAsDQorICAgICAweDE5OTA4LCAweDFjYzg2LCAweDFiYjA4LCAweDFkZDg2LCAweDE5OTAyLCAweDExMTQwLCAweDE4OGIwLCAweDFjNDVjLA0KKyAgICAgMHgxMzM0MCwgMHgxMTEyMCwgMHgxODg5OCwgMHgxYzQ0ZSwgMHgxNzc0MCwgMHgxMzMyMCwgMHgxOTk5OCwgMHgxY2NjZSwNCisgICAgIDB4MTc3MjAsIDB4MWJiOTgsIDB4MWRkY2UsIDB4MTg4ODYsIDB4MTc3MTAsIDB4MTMzMDgsIDB4MTk5ODYsIDB4MTc3MDgsDQorICAgICAweDExMTAyLCAweDExMWIwLCAweDE4OGRjLCAweDEzM2IwLCAweDExMTk4LCAweDE4OGNlLCAweDE3N2IwLCAweDEzMzk4LA0KKyAgICAgMHgxOTljZSwgMHgxNzc5OCwgMHgxYmJjZSwgMHgxMTE4NiwgMHgxMzM4NiwgMHgxMTFkYywgMHgxMzNkYywgMHgxMTFjZSwNCisgICAgIDB4MTc3ZGMsIDB4MTMzY2UsIDB4MWRjYTAsIDB4MWVlNTgsIDB4MWY3MmUsIDB4MWRjOTAsIDB4MWVlNGMsIDB4MWRjODgsDQorICAgICAweDFlZTQ2LCAweDFkYzg0LCAweDFkYzgyLCAweDE5OGEwLCAweDFjYzU4LCAweDFlNjJlLCAweDFiOWEwLCAweDE5ODkwLA0KKyAgICAgMHgxZWU2ZSwgMHgxYjk5MCwgMHgxZGNjYywgMHgxY2M0NiwgMHgxYjk4OCwgMHgxOTg4NCwgMHgxYjk4NCwgMHgxOTg4MiwNCisgICAgIDB4MWI5ODIsIDB4MTEwYTAsIDB4MTg4NTgsIDB4MWM0MmUsIDB4MTMxYTAsIDB4MTEwOTAsIDB4MTg4NGMsIDB4MTczYTAsDQorICAgICAweDEzMTkwLCAweDE5OGNjLCAweDE4ODQ2LCAweDE3MzkwLCAweDFiOWNjLCAweDExMDg0LCAweDE3Mzg4LCAweDEzMTg0LA0KKyAgICAgMHgxMTA4MiwgMHgxMzE4MiwgMHgxMTBkOCwgMHgxODg2ZSwgMHgxMzFkOCwgMHgxMTBjYywgMHgxNzNkOCwgMHgxMzFjYywNCisgICAgIDB4MTEwYzYsIDB4MTczY2MsIDB4MTMxYzYsIDB4MTEwZWUsIDB4MTczZWUsIDB4MWRjNTAsIDB4MWVlMmMsIDB4MWRjNDgsDQorICAgICAweDFlZTI2LCAweDFkYzQ0LCAweDFkYzQyLCAweDE5ODUwLCAweDFjYzJjLCAweDFiOGQwLCAweDE5ODQ4LCAweDFjYzI2LA0KKyAgICAgMHgxYjhjOCwgMHgxZGM2NiwgMHgxYjhjNCwgMHgxOTg0MiwgMHgxYjhjMiwgMHgxMTA1MCwgMHgxODgyYywgMHgxMzBkMCwNCisgICAgIDB4MTEwNDgsIDB4MTg4MjYsIDB4MTcxZDAsIDB4MTMwYzgsIDB4MTk4NjYsIDB4MTcxYzgsIDB4MWI4ZTYsIDB4MTEwNDIsDQorICAgICAweDE3MWM0LCAweDEzMGMyLCAweDE3MWMyLCAweDEzMGVjLCAweDE3MWVjLCAweDE3MWU2LCAweDFlZTE2LCAweDFkYzIyLA0KKyAgICAgMHgxY2MxNiwgMHgxOTgyNCwgMHgxOTgyMiwgMHgxMTAyOCwgMHgxMzA2OCwgMHgxNzBlOCwgMHgxMTAyMiwgMHgxMzA2MiwNCisgICAgIDB4MTg1NjAsIDB4MTBhNDAsIDB4MTg1MzAsIDB4MTBhMjAsIDB4MTg1MTgsIDB4MWMyOGUsIDB4MTBhMTAsIDB4MTg1MGMsDQorICAgICAweDEwYTA4LCAweDE4NTA2LCAweDEwYjYwLCAweDE4NWI4LCAweDFjMmRlLCAweDEwYjMwLCAweDE4NTljLCAweDEwYjE4LA0KKyAgICAgMHgxODU4ZSwgMHgxMGIwYywgMHgxMGIwNiwgMHgxMGJiOCwgMHgxODVkZSwgMHgxMGI5YywgMHgxMGI4ZSwgMHgxMGJkZSwNCisgICAgIDB4MThkNDAsIDB4MWM2YjAsIDB4MWUzNWMsIDB4MThkMjAsIDB4MWM2OTgsIDB4MThkMTAsIDB4MWM2OGMsIDB4MThkMDgsDQorICAgICAweDFjNjg2LCAweDE4ZDA0LCAweDEwOTQwLCAweDE4NGIwLCAweDFjMjVjLCAweDExYjQwLCAweDEwOTIwLCAweDFjNmRjLA0KKyAgICAgMHgxYzI0ZSwgMHgxMWIyMCwgMHgxOGQ5OCwgMHgxYzZjZSwgMHgxMWIxMCwgMHgxMDkwOCwgMHgxODQ4NiwgMHgxMWIwOCwNCisgICAgIDB4MThkODYsIDB4MTA5MDIsIDB4MTA5YjAsIDB4MTg0ZGMsIDB4MTFiYjAsIDB4MTA5OTgsIDB4MTg0Y2UsIDB4MTFiOTgsDQorICAgICAweDE4ZGNlLCAweDExYjhjLCAweDEwOTg2LCAweDEwOWRjLCAweDExYmRjLCAweDEwOWNlLCAweDExYmNlLCAweDFjZWEwLA0KKyAgICAgMHgxZTc1OCwgMHgxZjNhZSwgMHgxY2U5MCwgMHgxZTc0YywgMHgxY2U4OCwgMHgxZTc0NiwgMHgxY2U4NCwgMHgxY2U4MiwNCisgICAgIDB4MThjYTAsIDB4MWM2NTgsIDB4MTlkYTAsIDB4MThjOTAsIDB4MWM2NGMsIDB4MTlkOTAsIDB4MWNlY2MsIDB4MWM2NDYsDQorICAgICAweDE5ZDg4LCAweDE4Yzg0LCAweDE5ZDg0LCAweDE4YzgyLCAweDE5ZDgyLCAweDEwOGEwLCAweDE4NDU4LCAweDExOWEwLA0KKyAgICAgMHgxMDg5MCwgMHgxYzY2ZSwgMHgxM2JhMCwgMHgxMTk5MCwgMHgxOGNjYywgMHgxODQ0NiwgMHgxM2I5MCwgMHgxOWRjYywNCisgICAgIDB4MTA4ODQsIDB4MTNiODgsIDB4MTE5ODQsIDB4MTA4ODIsIDB4MTE5ODIsIDB4MTA4ZDgsIDB4MTg0NmUsIDB4MTE5ZDgsDQorICAgICAweDEwOGNjLCAweDEzYmQ4LCAweDExOWNjLCAweDEwOGM2LCAweDEzYmNjLCAweDExOWM2LCAweDEwOGVlLCAweDExOWVlLA0KKyAgICAgMHgxM2JlZSwgMHgxZWY1MCwgMHgxZjdhYywgMHgxZWY0OCwgMHgxZjdhNiwgMHgxZWY0NCwgMHgxZWY0MiwgMHgxY2U1MCwNCisgICAgIDB4MWU3MmMsIDB4MWRlZDAsIDB4MWVmNmMsIDB4MWU3MjYsIDB4MWRlYzgsIDB4MWVmNjYsIDB4MWRlYzQsIDB4MWNlNDIsDQorICAgICAweDFkZWMyLCAweDE4YzUwLCAweDFjNjJjLCAweDE5Y2QwLCAweDE4YzQ4LCAweDFjNjI2LCAweDFiZGQwLCAweDE5Y2M4LA0KKyAgICAgMHgxY2U2NiwgMHgxYmRjOCwgMHgxZGVlNiwgMHgxOGM0MiwgMHgxYmRjNCwgMHgxOWNjMiwgMHgxYmRjMiwgMHgxMDg1MCwNCisgICAgIDB4MTg0MmMsIDB4MTE4ZDAsIDB4MTA4NDgsIDB4MTg0MjYsIDB4MTM5ZDAsIDB4MTE4YzgsIDB4MThjNjYsIDB4MTdiZDAsDQorICAgICAweDEzOWM4LCAweDE5Y2U2LCAweDEwODQyLCAweDE3YmM4LCAweDFiZGU2LCAweDExOGMyLCAweDE3YmM0LCAweDEwODZjLA0KKyAgICAgMHgxMThlYywgMHgxMDg2NiwgMHgxMzllYywgMHgxMThlNiwgMHgxN2JlYywgMHgxMzllNiwgMHgxN2JlNiwgMHgxZWYyOCwNCisgICAgIDB4MWY3OTYsIDB4MWVmMjQsIDB4MWVmMjIsIDB4MWNlMjgsIDB4MWU3MTYsIDB4MWRlNjgsIDB4MWVmMzYsIDB4MWRlNjQsDQorICAgICAweDFjZTIyLCAweDFkZTYyLCAweDE4YzI4LCAweDFjNjE2LCAweDE5YzY4LCAweDE4YzI0LCAweDFiY2U4LCAweDE5YzY0LA0KKyAgICAgMHgxOGMyMiwgMHgxYmNlNCwgMHgxOWM2MiwgMHgxYmNlMiwgMHgxMDgyOCwgMHgxODQxNiwgMHgxMTg2OCwgMHgxOGMzNiwNCisgICAgIDB4MTM4ZTgsIDB4MTE4NjQsIDB4MTA4MjIsIDB4MTc5ZTgsIDB4MTM4ZTQsIDB4MTE4NjIsIDB4MTc5ZTQsIDB4MTM4ZTIsDQorICAgICAweDE3OWUyLCAweDExODc2LCAweDE3OWY2LCAweDFlZjEyLCAweDFkZTM0LCAweDFkZTMyLCAweDE5YzM0LCAweDFiYzc0LA0KKyAgICAgMHgxYmM3MiwgMHgxMTgzNCwgMHgxMzg3NCwgMHgxNzhmNCwgMHgxNzhmMiwgMHgxMDU0MCwgMHgxMDUyMCwgMHgxODI5OCwNCisgICAgIDB4MTA1MTAsIDB4MTA1MDgsIDB4MTA1MDQsIDB4MTA1YjAsIDB4MTA1OTgsIDB4MTA1OGMsIDB4MTA1ODYsIDB4MTA1ZGMsDQorICAgICAweDEwNWNlLCAweDE4NmEwLCAweDE4NjkwLCAweDFjMzRjLCAweDE4Njg4LCAweDFjMzQ2LCAweDE4Njg0LCAweDE4NjgyLA0KKyAgICAgMHgxMDRhMCwgMHgxODI1OCwgMHgxMGRhMCwgMHgxODZkOCwgMHgxODI0YywgMHgxMGQ5MCwgMHgxODZjYywgMHgxMGQ4OCwNCisgICAgIDB4MTg2YzYsIDB4MTBkODQsIDB4MTA0ODIsIDB4MTBkODIsIDB4MTA0ZDgsIDB4MTgyNmUsIDB4MTBkZDgsIDB4MTg2ZWUsDQorICAgICAweDEwZGNjLCAweDEwNGM2LCAweDEwZGM2LCAweDEwNGVlLCAweDEwZGVlLCAweDFjNzUwLCAweDFjNzQ4LCAweDFjNzQ0LA0KKyAgICAgMHgxYzc0MiwgMHgxODY1MCwgMHgxOGVkMCwgMHgxYzc2YywgMHgxYzMyNiwgMHgxOGVjOCwgMHgxYzc2NiwgMHgxOGVjNCwNCisgICAgIDB4MTg2NDIsIDB4MThlYzIsIDB4MTA0NTAsIDB4MTBjZDAsIDB4MTA0NDgsIDB4MTgyMjYsIDB4MTFkZDAsIDB4MTBjYzgsDQorICAgICAweDEwNDQ0LCAweDExZGM4LCAweDEwY2M0LCAweDEwNDQyLCAweDExZGM0LCAweDEwY2MyLCAweDEwNDZjLCAweDEwY2VjLA0KKyAgICAgMHgxMDQ2NiwgMHgxMWRlYywgMHgxMGNlNiwgMHgxMWRlNiwgMHgxZTdhOCwgMHgxZTdhNCwgMHgxZTdhMiwgMHgxYzcyOCwNCisgICAgIDB4MWNmNjgsIDB4MWU3YjYsIDB4MWNmNjQsIDB4MWM3MjIsIDB4MWNmNjIsIDB4MTg2MjgsIDB4MWMzMTYsIDB4MThlNjgsDQorICAgICAweDFjNzM2LCAweDE5ZWU4LCAweDE4ZTY0LCAweDE4NjIyLCAweDE5ZWU0LCAweDE4ZTYyLCAweDE5ZWUyLCAweDEwNDI4LA0KKyAgICAgMHgxODIxNiwgMHgxMGM2OCwgMHgxODYzNiwgMHgxMWNlOCwgMHgxMGM2NCwgMHgxMDQyMiwgMHgxM2RlOCwgMHgxMWNlNCwNCisgICAgIDB4MTBjNjIsIDB4MTNkZTQsIDB4MTFjZTIsIDB4MTA0MzYsIDB4MTBjNzYsIDB4MTFjZjYsIDB4MTNkZjYsIDB4MWY3ZDQsDQorICAgICAweDFmN2QyLCAweDFlNzk0LCAweDFlZmI0LCAweDFlNzkyLCAweDFlZmIyLCAweDFjNzE0LCAweDFjZjM0LCAweDFjNzEyLA0KKyAgICAgMHgxZGY3NCwgMHgxY2YzMiwgMHgxZGY3MiwgMHgxODYxNCwgMHgxOGUzNCwgMHgxODYxMiwgMHgxOWU3NCwgMHgxOGUzMiwNCisgICAgIDB4MWJlZjR9LA0KKyAgICB7MHgxZjU2MCwgMHgxZmFiOCwgMHgxZWE0MCwgMHgxZjUzMCwgMHgxZmE5YywgMHgxZWEyMCwgMHgxZjUxOCwgMHgxZmE4ZSwNCisgICAgIDB4MWVhMTAsIDB4MWY1MGMsIDB4MWVhMDgsIDB4MWY1MDYsIDB4MWVhMDQsIDB4MWViNjAsIDB4MWY1YjgsIDB4MWZhZGUsDQorICAgICAweDFkNjQwLCAweDFlYjMwLCAweDFmNTljLCAweDFkNjIwLCAweDFlYjE4LCAweDFmNThlLCAweDFkNjEwLCAweDFlYjBjLA0KKyAgICAgMHgxZDYwOCwgMHgxZWIwNiwgMHgxZDYwNCwgMHgxZDc2MCwgMHgxZWJiOCwgMHgxZjVkZSwgMHgxYWU0MCwgMHgxZDczMCwNCisgICAgIDB4MWViOWMsIDB4MWFlMjAsIDB4MWQ3MTgsIDB4MWViOGUsIDB4MWFlMTAsIDB4MWQ3MGMsIDB4MWFlMDgsIDB4MWQ3MDYsDQorICAgICAweDFhZTA0LCAweDFhZjYwLCAweDFkN2I4LCAweDFlYmRlLCAweDE1ZTQwLCAweDFhZjMwLCAweDFkNzljLCAweDE1ZTIwLA0KKyAgICAgMHgxYWYxOCwgMHgxZDc4ZSwgMHgxNWUxMCwgMHgxYWYwYywgMHgxNWUwOCwgMHgxYWYwNiwgMHgxNWY2MCwgMHgxYWZiOCwNCisgICAgIDB4MWQ3ZGUsIDB4MTVmMzAsIDB4MWFmOWMsIDB4MTVmMTgsIDB4MWFmOGUsIDB4MTVmMGMsIDB4MTVmYjgsIDB4MWFmZGUsDQorICAgICAweDE1ZjljLCAweDE1ZjhlLCAweDFlOTQwLCAweDFmNGIwLCAweDFmYTVjLCAweDFlOTIwLCAweDFmNDk4LCAweDFmYTRlLA0KKyAgICAgMHgxZTkxMCwgMHgxZjQ4YywgMHgxZTkwOCwgMHgxZjQ4NiwgMHgxZTkwNCwgMHgxZTkwMiwgMHgxZDM0MCwgMHgxZTliMCwNCisgICAgIDB4MWY0ZGMsIDB4MWQzMjAsIDB4MWU5OTgsIDB4MWY0Y2UsIDB4MWQzMTAsIDB4MWU5OGMsIDB4MWQzMDgsIDB4MWU5ODYsDQorICAgICAweDFkMzA0LCAweDFkMzAyLCAweDFhNzQwLCAweDFkM2IwLCAweDFlOWRjLCAweDFhNzIwLCAweDFkMzk4LCAweDFlOWNlLA0KKyAgICAgMHgxYTcxMCwgMHgxZDM4YywgMHgxYTcwOCwgMHgxZDM4NiwgMHgxYTcwNCwgMHgxYTcwMiwgMHgxNGY0MCwgMHgxYTdiMCwNCisgICAgIDB4MWQzZGMsIDB4MTRmMjAsIDB4MWE3OTgsIDB4MWQzY2UsIDB4MTRmMTAsIDB4MWE3OGMsIDB4MTRmMDgsIDB4MWE3ODYsDQorICAgICAweDE0ZjA0LCAweDE0ZmIwLCAweDFhN2RjLCAweDE0Zjk4LCAweDFhN2NlLCAweDE0ZjhjLCAweDE0Zjg2LCAweDE0ZmRjLA0KKyAgICAgMHgxNGZjZSwgMHgxZThhMCwgMHgxZjQ1OCwgMHgxZmEyZSwgMHgxZTg5MCwgMHgxZjQ0YywgMHgxZTg4OCwgMHgxZjQ0NiwNCisgICAgIDB4MWU4ODQsIDB4MWU4ODIsIDB4MWQxYTAsIDB4MWU4ZDgsIDB4MWY0NmUsIDB4MWQxOTAsIDB4MWU4Y2MsIDB4MWQxODgsDQorICAgICAweDFlOGM2LCAweDFkMTg0LCAweDFkMTgyLCAweDFhM2EwLCAweDFkMWQ4LCAweDFlOGVlLCAweDFhMzkwLCAweDFkMWNjLA0KKyAgICAgMHgxYTM4OCwgMHgxZDFjNiwgMHgxYTM4NCwgMHgxYTM4MiwgMHgxNDdhMCwgMHgxYTNkOCwgMHgxZDFlZSwgMHgxNDc5MCwNCisgICAgIDB4MWEzY2MsIDB4MTQ3ODgsIDB4MWEzYzYsIDB4MTQ3ODQsIDB4MTQ3ODIsIDB4MTQ3ZDgsIDB4MWEzZWUsIDB4MTQ3Y2MsDQorICAgICAweDE0N2M2LCAweDE0N2VlLCAweDFlODUwLCAweDFmNDJjLCAweDFlODQ4LCAweDFmNDI2LCAweDFlODQ0LCAweDFlODQyLA0KKyAgICAgMHgxZDBkMCwgMHgxZTg2YywgMHgxZDBjOCwgMHgxZTg2NiwgMHgxZDBjNCwgMHgxZDBjMiwgMHgxYTFkMCwgMHgxZDBlYywNCisgICAgIDB4MWExYzgsIDB4MWQwZTYsIDB4MWExYzQsIDB4MWExYzIsIDB4MTQzZDAsIDB4MWExZWMsIDB4MTQzYzgsIDB4MWExZTYsDQorICAgICAweDE0M2M0LCAweDE0M2MyLCAweDE0M2VjLCAweDE0M2U2LCAweDFlODI4LCAweDFmNDE2LCAweDFlODI0LCAweDFlODIyLA0KKyAgICAgMHgxZDA2OCwgMHgxZTgzNiwgMHgxZDA2NCwgMHgxZDA2MiwgMHgxYTBlOCwgMHgxZDA3NiwgMHgxYTBlNCwgMHgxYTBlMiwNCisgICAgIDB4MTQxZTgsIDB4MWEwZjYsIDB4MTQxZTQsIDB4MTQxZTIsIDB4MWU4MTQsIDB4MWU4MTIsIDB4MWQwMzQsIDB4MWQwMzIsDQorICAgICAweDFhMDc0LCAweDFhMDcyLCAweDFlNTQwLCAweDFmMmIwLCAweDFmOTVjLCAweDFlNTIwLCAweDFmMjk4LCAweDFmOTRlLA0KKyAgICAgMHgxZTUxMCwgMHgxZjI4YywgMHgxZTUwOCwgMHgxZjI4NiwgMHgxZTUwNCwgMHgxZTUwMiwgMHgxY2I0MCwgMHgxZTViMCwNCisgICAgIDB4MWYyZGMsIDB4MWNiMjAsIDB4MWU1OTgsIDB4MWYyY2UsIDB4MWNiMTAsIDB4MWU1OGMsIDB4MWNiMDgsIDB4MWU1ODYsDQorICAgICAweDFjYjA0LCAweDFjYjAyLCAweDE5NzQwLCAweDFjYmIwLCAweDFlNWRjLCAweDE5NzIwLCAweDFjYjk4LCAweDFlNWNlLA0KKyAgICAgMHgxOTcxMCwgMHgxY2I4YywgMHgxOTcwOCwgMHgxY2I4NiwgMHgxOTcwNCwgMHgxOTcwMiwgMHgxMmY0MCwgMHgxOTdiMCwNCisgICAgIDB4MWNiZGMsIDB4MTJmMjAsIDB4MTk3OTgsIDB4MWNiY2UsIDB4MTJmMTAsIDB4MTk3OGMsIDB4MTJmMDgsIDB4MTk3ODYsDQorICAgICAweDEyZjA0LCAweDEyZmIwLCAweDE5N2RjLCAweDEyZjk4LCAweDE5N2NlLCAweDEyZjhjLCAweDEyZjg2LCAweDEyZmRjLA0KKyAgICAgMHgxMmZjZSwgMHgxZjZhMCwgMHgxZmI1OCwgMHgxNmJmMCwgMHgxZjY5MCwgMHgxZmI0YywgMHgxNjlmOCwgMHgxZjY4OCwNCisgICAgIDB4MWZiNDYsIDB4MTY4ZmMsIDB4MWY2ODQsIDB4MWY2ODIsIDB4MWU0YTAsIDB4MWYyNTgsIDB4MWY5MmUsIDB4MWVkYTAsDQorICAgICAweDFlNDkwLCAweDFmYjZlLCAweDFlZDkwLCAweDFmNmNjLCAweDFmMjQ2LCAweDFlZDg4LCAweDFlNDg0LCAweDFlZDg0LA0KKyAgICAgMHgxZTQ4MiwgMHgxZWQ4MiwgMHgxYzlhMCwgMHgxZTRkOCwgMHgxZjI2ZSwgMHgxZGJhMCwgMHgxYzk5MCwgMHgxZTRjYywNCisgICAgIDB4MWRiOTAsIDB4MWVkY2MsIDB4MWU0YzYsIDB4MWRiODgsIDB4MWM5ODQsIDB4MWRiODQsIDB4MWM5ODIsIDB4MWRiODIsDQorICAgICAweDE5M2EwLCAweDFjOWQ4LCAweDFlNGVlLCAweDFiN2EwLCAweDE5MzkwLCAweDFjOWNjLCAweDFiNzkwLCAweDFkYmNjLA0KKyAgICAgMHgxYzljNiwgMHgxYjc4OCwgMHgxOTM4NCwgMHgxYjc4NCwgMHgxOTM4MiwgMHgxYjc4MiwgMHgxMjdhMCwgMHgxOTNkOCwNCisgICAgIDB4MWM5ZWUsIDB4MTZmYTAsIDB4MTI3OTAsIDB4MTkzY2MsIDB4MTZmOTAsIDB4MWI3Y2MsIDB4MTkzYzYsIDB4MTZmODgsDQorICAgICAweDEyNzg0LCAweDE2Zjg0LCAweDEyNzgyLCAweDEyN2Q4LCAweDE5M2VlLCAweDE2ZmQ4LCAweDEyN2NjLCAweDE2ZmNjLA0KKyAgICAgMHgxMjdjNiwgMHgxNmZjNiwgMHgxMjdlZSwgMHgxZjY1MCwgMHgxZmIyYywgMHgxNjVmOCwgMHgxZjY0OCwgMHgxZmIyNiwNCisgICAgIDB4MTY0ZmMsIDB4MWY2NDQsIDB4MTY0N2UsIDB4MWY2NDIsIDB4MWU0NTAsIDB4MWYyMmMsIDB4MWVjZDAsIDB4MWU0NDgsDQorICAgICAweDFmMjI2LCAweDFlY2M4LCAweDFmNjY2LCAweDFlY2M0LCAweDFlNDQyLCAweDFlY2MyLCAweDFjOGQwLCAweDFlNDZjLA0KKyAgICAgMHgxZDlkMCwgMHgxYzhjOCwgMHgxZTQ2NiwgMHgxZDljOCwgMHgxZWNlNiwgMHgxZDljNCwgMHgxYzhjMiwgMHgxZDljMiwNCisgICAgIDB4MTkxZDAsIDB4MWM4ZWMsIDB4MWIzZDAsIDB4MTkxYzgsIDB4MWM4ZTYsIDB4MWIzYzgsIDB4MWQ5ZTYsIDB4MWIzYzQsDQorICAgICAweDE5MWMyLCAweDFiM2MyLCAweDEyM2QwLCAweDE5MWVjLCAweDE2N2QwLCAweDEyM2M4LCAweDE5MWU2LCAweDE2N2M4LA0KKyAgICAgMHgxYjNlNiwgMHgxNjdjNCwgMHgxMjNjMiwgMHgxNjdjMiwgMHgxMjNlYywgMHgxNjdlYywgMHgxMjNlNiwgMHgxNjdlNiwNCisgICAgIDB4MWY2MjgsIDB4MWZiMTYsIDB4MTYyZmMsIDB4MWY2MjQsIDB4MTYyN2UsIDB4MWY2MjIsIDB4MWU0MjgsIDB4MWYyMTYsDQorICAgICAweDFlYzY4LCAweDFmNjM2LCAweDFlYzY0LCAweDFlNDIyLCAweDFlYzYyLCAweDFjODY4LCAweDFlNDM2LCAweDFkOGU4LA0KKyAgICAgMHgxYzg2NCwgMHgxZDhlNCwgMHgxYzg2MiwgMHgxZDhlMiwgMHgxOTBlOCwgMHgxYzg3NiwgMHgxYjFlOCwgMHgxZDhmNiwNCisgICAgIDB4MWIxZTQsIDB4MTkwZTIsIDB4MWIxZTIsIDB4MTIxZTgsIDB4MTkwZjYsIDB4MTYzZTgsIDB4MTIxZTQsIDB4MTYzZTQsDQorICAgICAweDEyMWUyLCAweDE2M2UyLCAweDEyMWY2LCAweDE2M2Y2LCAweDFmNjE0LCAweDE2MTdlLCAweDFmNjEyLCAweDFlNDE0LA0KKyAgICAgMHgxZWMzNCwgMHgxZTQxMiwgMHgxZWMzMiwgMHgxYzgzNCwgMHgxZDg3NCwgMHgxYzgzMiwgMHgxZDg3MiwgMHgxOTA3NCwNCisgICAgIDB4MWIwZjQsIDB4MTkwNzIsIDB4MWIwZjIsIDB4MTIwZjQsIDB4MTYxZjQsIDB4MTIwZjIsIDB4MTYxZjIsIDB4MWY2MGEsDQorICAgICAweDFlNDBhLCAweDFlYzFhLCAweDFjODFhLCAweDFkODNhLCAweDE5MDNhLCAweDFiMDdhLCAweDFlMmEwLCAweDFmMTU4LA0KKyAgICAgMHgxZjhhZSwgMHgxZTI5MCwgMHgxZjE0YywgMHgxZTI4OCwgMHgxZjE0NiwgMHgxZTI4NCwgMHgxZTI4MiwgMHgxYzVhMCwNCisgICAgIDB4MWUyZDgsIDB4MWYxNmUsIDB4MWM1OTAsIDB4MWUyY2MsIDB4MWM1ODgsIDB4MWUyYzYsIDB4MWM1ODQsIDB4MWM1ODIsDQorICAgICAweDE4YmEwLCAweDFjNWQ4LCAweDFlMmVlLCAweDE4YjkwLCAweDFjNWNjLCAweDE4Yjg4LCAweDFjNWM2LCAweDE4Yjg0LA0KKyAgICAgMHgxOGI4MiwgMHgxMTdhMCwgMHgxOGJkOCwgMHgxYzVlZSwgMHgxMTc5MCwgMHgxOGJjYywgMHgxMTc4OCwgMHgxOGJjNiwNCisgICAgIDB4MTE3ODQsIDB4MTE3ODIsIDB4MTE3ZDgsIDB4MThiZWUsIDB4MTE3Y2MsIDB4MTE3YzYsIDB4MTE3ZWUsIDB4MWYzNTAsDQorICAgICAweDFmOWFjLCAweDEzNWY4LCAweDFmMzQ4LCAweDFmOWE2LCAweDEzNGZjLCAweDFmMzQ0LCAweDEzNDdlLCAweDFmMzQyLA0KKyAgICAgMHgxZTI1MCwgMHgxZjEyYywgMHgxZTZkMCwgMHgxZTI0OCwgMHgxZjEyNiwgMHgxZTZjOCwgMHgxZjM2NiwgMHgxZTZjNCwNCisgICAgIDB4MWUyNDIsIDB4MWU2YzIsIDB4MWM0ZDAsIDB4MWUyNmMsIDB4MWNkZDAsIDB4MWM0YzgsIDB4MWUyNjYsIDB4MWNkYzgsDQorICAgICAweDFlNmU2LCAweDFjZGM0LCAweDFjNGMyLCAweDFjZGMyLCAweDE4OWQwLCAweDFjNGVjLCAweDE5YmQwLCAweDE4OWM4LA0KKyAgICAgMHgxYzRlNiwgMHgxOWJjOCwgMHgxY2RlNiwgMHgxOWJjNCwgMHgxODljMiwgMHgxOWJjMiwgMHgxMTNkMCwgMHgxODllYywNCisgICAgIDB4MTM3ZDAsIDB4MTEzYzgsIDB4MTg5ZTYsIDB4MTM3YzgsIDB4MTliZTYsIDB4MTM3YzQsIDB4MTEzYzIsIDB4MTM3YzIsDQorICAgICAweDExM2VjLCAweDEzN2VjLCAweDExM2U2LCAweDEzN2U2LCAweDFmYmE4LCAweDE3NWYwLCAweDFiYWZjLCAweDFmYmE0LA0KKyAgICAgMHgxNzRmOCwgMHgxYmE3ZSwgMHgxZmJhMiwgMHgxNzQ3YywgMHgxNzQzZSwgMHgxZjMyOCwgMHgxZjk5NiwgMHgxMzJmYywNCisgICAgIDB4MWY3NjgsIDB4MWZiYjYsIDB4MTc2ZmMsIDB4MTMyN2UsIDB4MWY3NjQsIDB4MWYzMjIsIDB4MTc2N2UsIDB4MWY3NjIsDQorICAgICAweDFlMjI4LCAweDFmMTE2LCAweDFlNjY4LCAweDFlMjI0LCAweDFlZWU4LCAweDFmNzc2LCAweDFlMjIyLCAweDFlZWU0LA0KKyAgICAgMHgxZTY2MiwgMHgxZWVlMiwgMHgxYzQ2OCwgMHgxZTIzNiwgMHgxY2NlOCwgMHgxYzQ2NCwgMHgxZGRlOCwgMHgxY2NlNCwNCisgICAgIDB4MWM0NjIsIDB4MWRkZTQsIDB4MWNjZTIsIDB4MWRkZTIsIDB4MTg4ZTgsIDB4MWM0NzYsIDB4MTk5ZTgsIDB4MTg4ZTQsDQorICAgICAweDFiYmU4LCAweDE5OWU0LCAweDE4OGUyLCAweDFiYmU0LCAweDE5OWUyLCAweDFiYmUyLCAweDExMWU4LCAweDE4OGY2LA0KKyAgICAgMHgxMzNlOCwgMHgxMTFlNCwgMHgxNzdlOCwgMHgxMzNlNCwgMHgxMTFlMiwgMHgxNzdlNCwgMHgxMzNlMiwgMHgxNzdlMiwNCisgICAgIDB4MTExZjYsIDB4MTMzZjYsIDB4MWZiOTQsIDB4MTcyZjgsIDB4MWI5N2UsIDB4MWZiOTIsIDB4MTcyN2MsIDB4MTcyM2UsDQorICAgICAweDFmMzE0LCAweDEzMTdlLCAweDFmNzM0LCAweDFmMzEyLCAweDE3MzdlLCAweDFmNzMyLCAweDFlMjE0LCAweDFlNjM0LA0KKyAgICAgMHgxZTIxMiwgMHgxZWU3NCwgMHgxZTYzMiwgMHgxZWU3MiwgMHgxYzQzNCwgMHgxY2M3NCwgMHgxYzQzMiwgMHgxZGNmNCwNCisgICAgIDB4MWNjNzIsIDB4MWRjZjIsIDB4MTg4NzQsIDB4MTk4ZjQsIDB4MTg4NzIsIDB4MWI5ZjQsIDB4MTk4ZjIsIDB4MWI5ZjIsDQorICAgICAweDExMGY0LCAweDEzMWY0LCAweDExMGYyLCAweDE3M2Y0LCAweDEzMWYyLCAweDE3M2YyLCAweDFmYjhhLCAweDE3MTdjLA0KKyAgICAgMHgxNzEzZSwgMHgxZjMwYSwgMHgxZjcxYSwgMHgxZTIwYSwgMHgxZTYxYSwgMHgxZWUzYSwgMHgxYzQxYSwgMHgxY2MzYSwNCisgICAgIDB4MWRjN2EsIDB4MTg4M2EsIDB4MTk4N2EsIDB4MWI4ZmEsIDB4MTEwN2EsIDB4MTMwZmEsIDB4MTcxZmEsIDB4MTcwYmUsDQorICAgICAweDFlMTUwLCAweDFmMGFjLCAweDFlMTQ4LCAweDFmMGE2LCAweDFlMTQ0LCAweDFlMTQyLCAweDFjMmQwLCAweDFlMTZjLA0KKyAgICAgMHgxYzJjOCwgMHgxZTE2NiwgMHgxYzJjNCwgMHgxYzJjMiwgMHgxODVkMCwgMHgxYzJlYywgMHgxODVjOCwgMHgxYzJlNiwNCisgICAgIDB4MTg1YzQsIDB4MTg1YzIsIDB4MTBiZDAsIDB4MTg1ZWMsIDB4MTBiYzgsIDB4MTg1ZTYsIDB4MTBiYzQsIDB4MTBiYzIsDQorICAgICAweDEwYmVjLCAweDEwYmU2LCAweDFmMWE4LCAweDFmOGQ2LCAweDExYWZjLCAweDFmMWE0LCAweDExYTdlLCAweDFmMWEyLA0KKyAgICAgMHgxZTEyOCwgMHgxZjA5NiwgMHgxZTM2OCwgMHgxZTEyNCwgMHgxZTM2NCwgMHgxZTEyMiwgMHgxZTM2MiwgMHgxYzI2OCwNCisgICAgIDB4MWUxMzYsIDB4MWM2ZTgsIDB4MWMyNjQsIDB4MWM2ZTQsIDB4MWMyNjIsIDB4MWM2ZTIsIDB4MTg0ZTgsIDB4MWMyNzYsDQorICAgICAweDE4ZGU4LCAweDE4NGU0LCAweDE4ZGU0LCAweDE4NGUyLCAweDE4ZGUyLCAweDEwOWU4LCAweDE4NGY2LCAweDExYmU4LA0KKyAgICAgMHgxMDllNCwgMHgxMWJlNCwgMHgxMDllMiwgMHgxMWJlMiwgMHgxMDlmNiwgMHgxMWJmNiwgMHgxZjlkNCwgMHgxM2FmOCwNCisgICAgIDB4MTlkN2UsIDB4MWY5ZDIsIDB4MTNhN2MsIDB4MTNhM2UsIDB4MWYxOTQsIDB4MTE5N2UsIDB4MWYzYjQsIDB4MWYxOTIsDQorICAgICAweDEzYjdlLCAweDFmM2IyLCAweDFlMTE0LCAweDFlMzM0LCAweDFlMTEyLCAweDFlNzc0LCAweDFlMzMyLCAweDFlNzcyLA0KKyAgICAgMHgxYzIzNCwgMHgxYzY3NCwgMHgxYzIzMiwgMHgxY2VmNCwgMHgxYzY3MiwgMHgxY2VmMiwgMHgxODQ3NCwgMHgxOGNmNCwNCisgICAgIDB4MTg0NzIsIDB4MTlkZjQsIDB4MThjZjIsIDB4MTlkZjIsIDB4MTA4ZjQsIDB4MTE5ZjQsIDB4MTA4ZjIsIDB4MTNiZjQsDQorICAgICAweDExOWYyLCAweDEzYmYyLCAweDE3YWYwLCAweDFiZDdjLCAweDE3YTc4LCAweDFiZDNlLCAweDE3YTNjLCAweDE3YTFlLA0KKyAgICAgMHgxZjljYSwgMHgxMzk3YywgMHgxZmJkYSwgMHgxN2I3YywgMHgxMzkzZSwgMHgxN2IzZSwgMHgxZjE4YSwgMHgxZjM5YSwNCisgICAgIDB4MWY3YmEsIDB4MWUxMGEsIDB4MWUzMWEsIDB4MWU3M2EsIDB4MWVmN2EsIDB4MWMyMWEsIDB4MWM2M2EsIDB4MWNlN2EsDQorICAgICAweDFkZWZhLCAweDE4NDNhLCAweDE4YzdhLCAweDE5Y2ZhLCAweDFiZGZhLCAweDEwODdhLCAweDExOGZhLCAweDEzOWZhLA0KKyAgICAgMHgxNzk3OCwgMHgxYmNiZSwgMHgxNzkzYywgMHgxNzkxZSwgMHgxMzhiZSwgMHgxNzliZSwgMHgxNzhiYywgMHgxNzg5ZSwNCisgICAgIDB4MTc4NWUsIDB4MWUwYTgsIDB4MWUwYTQsIDB4MWUwYTIsIDB4MWMxNjgsIDB4MWUwYjYsIDB4MWMxNjQsIDB4MWMxNjIsDQorICAgICAweDE4MmU4LCAweDFjMTc2LCAweDE4MmU0LCAweDE4MmUyLCAweDEwNWU4LCAweDE4MmY2LCAweDEwNWU0LCAweDEwNWUyLA0KKyAgICAgMHgxMDVmNiwgMHgxZjBkNCwgMHgxMGQ3ZSwgMHgxZjBkMiwgMHgxZTA5NCwgMHgxZTFiNCwgMHgxZTA5MiwgMHgxZTFiMiwNCisgICAgIDB4MWMxMzQsIDB4MWMzNzQsIDB4MWMxMzIsIDB4MWMzNzIsIDB4MTgyNzQsIDB4MTg2ZjQsIDB4MTgyNzIsIDB4MTg2ZjIsDQorICAgICAweDEwNGY0LCAweDEwZGY0LCAweDEwNGYyLCAweDEwZGYyLCAweDFmOGVhLCAweDExZDdjLCAweDExZDNlLCAweDFmMGNhLA0KKyAgICAgMHgxZjFkYSwgMHgxZTA4YSwgMHgxZTE5YSwgMHgxZTNiYSwgMHgxYzExYSwgMHgxYzMzYSwgMHgxYzc3YSwgMHgxODIzYSwNCisgICAgIDB4MTg2N2EsIDB4MThlZmEsIDB4MTA0N2EsIDB4MTBjZmEsIDB4MTFkZmEsIDB4MTNkNzgsIDB4MTllYmUsIDB4MTNkM2MsDQorICAgICAweDEzZDFlLCAweDExY2JlLCAweDEzZGJlLCAweDE3ZDcwLCAweDFiZWJjLCAweDE3ZDM4LCAweDFiZTllLCAweDE3ZDFjLA0KKyAgICAgMHgxN2QwZSwgMHgxM2NiYywgMHgxN2RiYywgMHgxM2M5ZSwgMHgxN2Q5ZSwgMHgxN2NiOCwgMHgxYmU1ZSwgMHgxN2M5YywNCisgICAgIDB4MTdjOGUsIDB4MTNjNWUsIDB4MTdjZGUsIDB4MTdjNWMsIDB4MTdjNGUsIDB4MTdjMmUsIDB4MWMwYjQsIDB4MWMwYjIsDQorICAgICAweDE4MTc0LCAweDE4MTcyLCAweDEwMmY0LCAweDEwMmYyLCAweDFlMGRhLCAweDFjMDlhLCAweDFjMWJhLCAweDE4MTNhLA0KKyAgICAgMHgxODM3YSwgMHgxMDI3YSwgMHgxMDZmYSwgMHgxMGViZSwgMHgxMWViYywgMHgxMWU5ZSwgMHgxM2ViOCwgMHgxOWY1ZSwNCisgICAgIDB4MTNlOWMsIDB4MTNlOGUsIDB4MTFlNWUsIDB4MTNlZGUsIDB4MTdlYjAsIDB4MWJmNWMsIDB4MTdlOTgsIDB4MWJmNGUsDQorICAgICAweDE3ZThjLCAweDE3ZTg2LCAweDEzZTVjLCAweDE3ZWRjLCAweDEzZTRlLCAweDE3ZWNlLCAweDE3ZTU4LCAweDFiZjJlLA0KKyAgICAgMHgxN2U0YywgMHgxN2U0NiwgMHgxM2UyZSwgMHgxN2U2ZSwgMHgxN2UyYywgMHgxN2UyNiwgMHgxMGY1ZSwgMHgxMWY1YywNCisgICAgIDB4MTFmNGUsIDB4MTNmNTgsIDB4MTlmYWUsIDB4MTNmNGMsIDB4MTNmNDYsIDB4MTFmMmUsIDB4MTNmNmUsIDB4MTNmMmMsDQorICAgICAweDEzZjI2fSwNCisgICAgezB4MWFiZTAsIDB4MWQ1ZjgsIDB4MTUzYzAsIDB4MWE5ZjAsIDB4MWQ0ZmMsIDB4MTUxZTAsIDB4MWE4ZjgsIDB4MWQ0N2UsDQorICAgICAweDE1MGYwLCAweDFhODdjLCAweDE1MDc4LCAweDFmYWQwLCAweDE1YmUwLCAweDFhZGY4LCAweDFmYWM4LCAweDE1OWYwLA0KKyAgICAgMHgxYWNmYywgMHgxZmFjNCwgMHgxNThmOCwgMHgxYWM3ZSwgMHgxZmFjMiwgMHgxNTg3YywgMHgxZjVkMCwgMHgxZmFlYywNCisgICAgIDB4MTVkZjgsIDB4MWY1YzgsIDB4MWZhZTYsIDB4MTVjZmMsIDB4MWY1YzQsIDB4MTVjN2UsIDB4MWY1YzIsIDB4MWViZDAsDQorICAgICAweDFmNWVjLCAweDFlYmM4LCAweDFmNWU2LCAweDFlYmM0LCAweDFlYmMyLCAweDFkN2QwLCAweDFlYmVjLCAweDFkN2M4LA0KKyAgICAgMHgxZWJlNiwgMHgxZDdjNCwgMHgxZDdjMiwgMHgxYWZkMCwgMHgxZDdlYywgMHgxYWZjOCwgMHgxZDdlNiwgMHgxYWZjNCwNCisgICAgIDB4MTRiYzAsIDB4MWE1ZjAsIDB4MWQyZmMsIDB4MTQ5ZTAsIDB4MWE0ZjgsIDB4MWQyN2UsIDB4MTQ4ZjAsIDB4MWE0N2MsDQorICAgICAweDE0ODc4LCAweDFhNDNlLCAweDE0ODNjLCAweDFmYTY4LCAweDE0ZGYwLCAweDFhNmZjLCAweDFmYTY0LCAweDE0Y2Y4LA0KKyAgICAgMHgxYTY3ZSwgMHgxZmE2MiwgMHgxNGM3YywgMHgxNGMzZSwgMHgxZjRlOCwgMHgxZmE3NiwgMHgxNGVmYywgMHgxZjRlNCwNCisgICAgIDB4MTRlN2UsIDB4MWY0ZTIsIDB4MWU5ZTgsIDB4MWY0ZjYsIDB4MWU5ZTQsIDB4MWU5ZTIsIDB4MWQzZTgsIDB4MWU5ZjYsDQorICAgICAweDFkM2U0LCAweDFkM2UyLCAweDFhN2U4LCAweDFkM2Y2LCAweDFhN2U0LCAweDFhN2UyLCAweDE0NWUwLCAweDFhMmY4LA0KKyAgICAgMHgxZDE3ZSwgMHgxNDRmMCwgMHgxYTI3YywgMHgxNDQ3OCwgMHgxYTIzZSwgMHgxNDQzYywgMHgxNDQxZSwgMHgxZmEzNCwNCisgICAgIDB4MTQ2ZjgsIDB4MWEzN2UsIDB4MWZhMzIsIDB4MTQ2N2MsIDB4MTQ2M2UsIDB4MWY0NzQsIDB4MTQ3N2UsIDB4MWY0NzIsDQorICAgICAweDFlOGY0LCAweDFlOGYyLCAweDFkMWY0LCAweDFkMWYyLCAweDFhM2Y0LCAweDFhM2YyLCAweDE0MmYwLCAweDFhMTdjLA0KKyAgICAgMHgxNDI3OCwgMHgxYTEzZSwgMHgxNDIzYywgMHgxNDIxZSwgMHgxZmExYSwgMHgxNDM3YywgMHgxNDMzZSwgMHgxZjQzYSwNCisgICAgIDB4MWU4N2EsIDB4MWQwZmEsIDB4MTQxNzgsIDB4MWEwYmUsIDB4MTQxM2MsIDB4MTQxMWUsIDB4MTQxYmUsIDB4MTQwYmMsDQorICAgICAweDE0MDllLCAweDEyYmMwLCAweDE5NWYwLCAweDFjYWZjLCAweDEyOWUwLCAweDE5NGY4LCAweDFjYTdlLCAweDEyOGYwLA0KKyAgICAgMHgxOTQ3YywgMHgxMjg3OCwgMHgxOTQzZSwgMHgxMjgzYywgMHgxZjk2OCwgMHgxMmRmMCwgMHgxOTZmYywgMHgxZjk2NCwNCisgICAgIDB4MTJjZjgsIDB4MTk2N2UsIDB4MWY5NjIsIDB4MTJjN2MsIDB4MTJjM2UsIDB4MWYyZTgsIDB4MWY5NzYsIDB4MTJlZmMsDQorICAgICAweDFmMmU0LCAweDEyZTdlLCAweDFmMmUyLCAweDFlNWU4LCAweDFmMmY2LCAweDFlNWU0LCAweDFlNWUyLCAweDFjYmU4LA0KKyAgICAgMHgxZTVmNiwgMHgxY2JlNCwgMHgxY2JlMiwgMHgxOTdlOCwgMHgxY2JmNiwgMHgxOTdlNCwgMHgxOTdlMiwgMHgxYjVlMCwNCisgICAgIDB4MWRhZjgsIDB4MWVkN2UsIDB4MTY5YzAsIDB4MWI0ZjAsIDB4MWRhN2MsIDB4MTY4ZTAsIDB4MWI0NzgsIDB4MWRhM2UsDQorICAgICAweDE2ODcwLCAweDFiNDNjLCAweDE2ODM4LCAweDFiNDFlLCAweDE2ODFjLCAweDEyNWUwLCAweDE5MmY4LCAweDFjOTdlLA0KKyAgICAgMHgxNmRlMCwgMHgxMjRmMCwgMHgxOTI3YywgMHgxNmNmMCwgMHgxYjY3YywgMHgxOTIzZSwgMHgxNmM3OCwgMHgxMjQzYywNCisgICAgIDB4MTZjM2MsIDB4MTI0MWUsIDB4MTZjMWUsIDB4MWY5MzQsIDB4MTI2ZjgsIDB4MTkzN2UsIDB4MWZiNzQsIDB4MWY5MzIsDQorICAgICAweDE2ZWY4LCAweDEyNjdjLCAweDFmYjcyLCAweDE2ZTdjLCAweDEyNjNlLCAweDE2ZTNlLCAweDFmMjc0LCAweDEyNzdlLA0KKyAgICAgMHgxZjZmNCwgMHgxZjI3MiwgMHgxNmY3ZSwgMHgxZjZmMiwgMHgxZTRmNCwgMHgxZWRmNCwgMHgxZTRmMiwgMHgxZWRmMiwNCisgICAgIDB4MWM5ZjQsIDB4MWRiZjQsIDB4MWM5ZjIsIDB4MWRiZjIsIDB4MTkzZjQsIDB4MTkzZjIsIDB4MTY1YzAsIDB4MWIyZjAsDQorICAgICAweDFkOTdjLCAweDE2NGUwLCAweDFiMjc4LCAweDFkOTNlLCAweDE2NDcwLCAweDFiMjNjLCAweDE2NDM4LCAweDFiMjFlLA0KKyAgICAgMHgxNjQxYywgMHgxNjQwZSwgMHgxMjJmMCwgMHgxOTE3YywgMHgxNjZmMCwgMHgxMjI3OCwgMHgxOTEzZSwgMHgxNjY3OCwNCisgICAgIDB4MWIzM2UsIDB4MTY2M2MsIDB4MTIyMWUsIDB4MTY2MWUsIDB4MWY5MWEsIDB4MTIzN2MsIDB4MWZiM2EsIDB4MTY3N2MsDQorICAgICAweDEyMzNlLCAweDE2NzNlLCAweDFmMjNhLCAweDFmNjdhLCAweDFlNDdhLCAweDFlY2ZhLCAweDFjOGZhLCAweDFkOWZhLA0KKyAgICAgMHgxOTFmYSwgMHgxNjJlMCwgMHgxYjE3OCwgMHgxZDhiZSwgMHgxNjI3MCwgMHgxYjEzYywgMHgxNjIzOCwgMHgxYjExZSwNCisgICAgIDB4MTYyMWMsIDB4MTYyMGUsIDB4MTIxNzgsIDB4MTkwYmUsIDB4MTYzNzgsIDB4MTIxM2MsIDB4MTYzM2MsIDB4MTIxMWUsDQorICAgICAweDE2MzFlLCAweDEyMWJlLCAweDE2M2JlLCAweDE2MTcwLCAweDFiMGJjLCAweDE2MTM4LCAweDFiMDllLCAweDE2MTFjLA0KKyAgICAgMHgxNjEwZSwgMHgxMjBiYywgMHgxNjFiYywgMHgxMjA5ZSwgMHgxNjE5ZSwgMHgxNjBiOCwgMHgxYjA1ZSwgMHgxNjA5YywNCisgICAgIDB4MTYwOGUsIDB4MTIwNWUsIDB4MTYwZGUsIDB4MTYwNWMsIDB4MTYwNGUsIDB4MTE1ZTAsIDB4MThhZjgsIDB4MWM1N2UsDQorICAgICAweDExNGYwLCAweDE4YTdjLCAweDExNDc4LCAweDE4YTNlLCAweDExNDNjLCAweDExNDFlLCAweDFmOGI0LCAweDExNmY4LA0KKyAgICAgMHgxOGI3ZSwgMHgxZjhiMiwgMHgxMTY3YywgMHgxMTYzZSwgMHgxZjE3NCwgMHgxMTc3ZSwgMHgxZjE3MiwgMHgxZTJmNCwNCisgICAgIDB4MWUyZjIsIDB4MWM1ZjQsIDB4MWM1ZjIsIDB4MThiZjQsIDB4MThiZjIsIDB4MTM1YzAsIDB4MTlhZjAsIDB4MWNkN2MsDQorICAgICAweDEzNGUwLCAweDE5YTc4LCAweDFjZDNlLCAweDEzNDcwLCAweDE5YTNjLCAweDEzNDM4LCAweDE5YTFlLCAweDEzNDFjLA0KKyAgICAgMHgxMzQwZSwgMHgxMTJmMCwgMHgxODk3YywgMHgxMzZmMCwgMHgxMTI3OCwgMHgxODkzZSwgMHgxMzY3OCwgMHgxOWIzZSwNCisgICAgIDB4MTM2M2MsIDB4MTEyMWUsIDB4MTM2MWUsIDB4MWY4OWEsIDB4MTEzN2MsIDB4MWY5YmEsIDB4MTM3N2MsIDB4MTEzM2UsDQorICAgICAweDEzNzNlLCAweDFmMTNhLCAweDFmMzdhLCAweDFlMjdhLCAweDFlNmZhLCAweDFjNGZhLCAweDFjZGZhLCAweDE4OWZhLA0KKyAgICAgMHgxYmFlMCwgMHgxZGQ3OCwgMHgxZWViZSwgMHgxNzRjMCwgMHgxYmE3MCwgMHgxZGQzYywgMHgxNzQ2MCwgMHgxYmEzOCwNCisgICAgIDB4MWRkMWUsIDB4MTc0MzAsIDB4MWJhMWMsIDB4MTc0MTgsIDB4MWJhMGUsIDB4MTc0MGMsIDB4MTMyZTAsIDB4MTk5NzgsDQorICAgICAweDFjY2JlLCAweDE3NmUwLCAweDEzMjcwLCAweDE5OTNjLCAweDE3NjcwLCAweDFiYjNjLCAweDE5OTFlLCAweDE3NjM4LA0KKyAgICAgMHgxMzIxYywgMHgxNzYxYywgMHgxMzIwZSwgMHgxNzYwZSwgMHgxMTE3OCwgMHgxODhiZSwgMHgxMzM3OCwgMHgxMTEzYywNCisgICAgIDB4MTc3NzgsIDB4MTMzM2MsIDB4MTExMWUsIDB4MTc3M2MsIDB4MTMzMWUsIDB4MTc3MWUsIDB4MTExYmUsIDB4MTMzYmUsDQorICAgICAweDE3N2JlLCAweDE3MmMwLCAweDFiOTcwLCAweDFkY2JjLCAweDE3MjYwLCAweDFiOTM4LCAweDFkYzllLCAweDE3MjMwLA0KKyAgICAgMHgxYjkxYywgMHgxNzIxOCwgMHgxYjkwZSwgMHgxNzIwYywgMHgxNzIwNiwgMHgxMzE3MCwgMHgxOThiYywgMHgxNzM3MCwNCisgICAgIDB4MTMxMzgsIDB4MTk4OWUsIDB4MTczMzgsIDB4MWI5OWUsIDB4MTczMWMsIDB4MTMxMGUsIDB4MTczMGUsIDB4MTEwYmMsDQorICAgICAweDEzMWJjLCAweDExMDllLCAweDE3M2JjLCAweDEzMTllLCAweDE3MzllLCAweDE3MTYwLCAweDFiOGI4LCAweDFkYzVlLA0KKyAgICAgMHgxNzEzMCwgMHgxYjg5YywgMHgxNzExOCwgMHgxYjg4ZSwgMHgxNzEwYywgMHgxNzEwNiwgMHgxMzBiOCwgMHgxOTg1ZSwNCisgICAgIDB4MTcxYjgsIDB4MTMwOWMsIDB4MTcxOWMsIDB4MTMwOGUsIDB4MTcxOGUsIDB4MTEwNWUsIDB4MTMwZGUsIDB4MTcxZGUsDQorICAgICAweDE3MGIwLCAweDFiODVjLCAweDE3MDk4LCAweDFiODRlLCAweDE3MDhjLCAweDE3MDg2LCAweDEzMDVjLCAweDE3MGRjLA0KKyAgICAgMHgxMzA0ZSwgMHgxNzBjZSwgMHgxNzA1OCwgMHgxYjgyZSwgMHgxNzA0YywgMHgxNzA0NiwgMHgxMzAyZSwgMHgxNzA2ZSwNCisgICAgIDB4MTcwMmMsIDB4MTcwMjYsIDB4MTBhZjAsIDB4MTg1N2MsIDB4MTBhNzgsIDB4MTg1M2UsIDB4MTBhM2MsIDB4MTBhMWUsDQorICAgICAweDEwYjdjLCAweDEwYjNlLCAweDFmMGJhLCAweDFlMTdhLCAweDFjMmZhLCAweDE4NWZhLCAweDExYWUwLCAweDE4ZDc4LA0KKyAgICAgMHgxYzZiZSwgMHgxMWE3MCwgMHgxOGQzYywgMHgxMWEzOCwgMHgxOGQxZSwgMHgxMWExYywgMHgxMWEwZSwgMHgxMDk3OCwNCisgICAgIDB4MTg0YmUsIDB4MTFiNzgsIDB4MTA5M2MsIDB4MTFiM2MsIDB4MTA5MWUsIDB4MTFiMWUsIDB4MTA5YmUsIDB4MTFiYmUsDQorICAgICAweDEzYWMwLCAweDE5ZDcwLCAweDFjZWJjLCAweDEzYTYwLCAweDE5ZDM4LCAweDFjZTllLCAweDEzYTMwLCAweDE5ZDFjLA0KKyAgICAgMHgxM2ExOCwgMHgxOWQwZSwgMHgxM2EwYywgMHgxM2EwNiwgMHgxMTk3MCwgMHgxOGNiYywgMHgxM2I3MCwgMHgxMTkzOCwNCisgICAgIDB4MThjOWUsIDB4MTNiMzgsIDB4MTE5MWMsIDB4MTNiMWMsIDB4MTE5MGUsIDB4MTNiMGUsIDB4MTA4YmMsIDB4MTE5YmMsDQorICAgICAweDEwODllLCAweDEzYmJjLCAweDExOTllLCAweDEzYjllLCAweDFiZDYwLCAweDFkZWI4LCAweDFlZjVlLCAweDE3YTQwLA0KKyAgICAgMHgxYmQzMCwgMHgxZGU5YywgMHgxN2EyMCwgMHgxYmQxOCwgMHgxZGU4ZSwgMHgxN2ExMCwgMHgxYmQwYywgMHgxN2EwOCwNCisgICAgIDB4MWJkMDYsIDB4MTdhMDQsIDB4MTM5NjAsIDB4MTljYjgsIDB4MWNlNWUsIDB4MTdiNjAsIDB4MTM5MzAsIDB4MTljOWMsDQorICAgICAweDE3YjMwLCAweDFiZDljLCAweDE5YzhlLCAweDE3YjE4LCAweDEzOTBjLCAweDE3YjBjLCAweDEzOTA2LCAweDE3YjA2LA0KKyAgICAgMHgxMThiOCwgMHgxOGM1ZSwgMHgxMzliOCwgMHgxMTg5YywgMHgxN2JiOCwgMHgxMzk5YywgMHgxMTg4ZSwgMHgxN2I5YywNCisgICAgIDB4MTM5OGUsIDB4MTdiOGUsIDB4MTA4NWUsIDB4MTE4ZGUsIDB4MTM5ZGUsIDB4MTdiZGUsIDB4MTc5NDAsIDB4MWJjYjAsDQorICAgICAweDFkZTVjLCAweDE3OTIwLCAweDFiYzk4LCAweDFkZTRlLCAweDE3OTEwLCAweDFiYzhjLCAweDE3OTA4LCAweDFiYzg2LA0KKyAgICAgMHgxNzkwNCwgMHgxNzkwMiwgMHgxMzhiMCwgMHgxOWM1YywgMHgxNzliMCwgMHgxMzg5OCwgMHgxOWM0ZSwgMHgxNzk5OCwNCisgICAgIDB4MWJjY2UsIDB4MTc5OGMsIDB4MTM4ODYsIDB4MTc5ODYsIDB4MTE4NWMsIDB4MTM4ZGMsIDB4MTE4NGUsIDB4MTc5ZGMsDQorICAgICAweDEzOGNlLCAweDE3OWNlLCAweDE3OGEwLCAweDFiYzU4LCAweDFkZTJlLCAweDE3ODkwLCAweDFiYzRjLCAweDE3ODg4LA0KKyAgICAgMHgxYmM0NiwgMHgxNzg4NCwgMHgxNzg4MiwgMHgxMzg1OCwgMHgxOWMyZSwgMHgxNzhkOCwgMHgxMzg0YywgMHgxNzhjYywNCisgICAgIDB4MTM4NDYsIDB4MTc4YzYsIDB4MTE4MmUsIDB4MTM4NmUsIDB4MTc4ZWUsIDB4MTc4NTAsIDB4MWJjMmMsIDB4MTc4NDgsDQorICAgICAweDFiYzI2LCAweDE3ODQ0LCAweDE3ODQyLCAweDEzODJjLCAweDE3ODZjLCAweDEzODI2LCAweDE3ODY2LCAweDE3ODI4LA0KKyAgICAgMHgxYmMxNiwgMHgxNzgyNCwgMHgxNzgyMiwgMHgxMzgxNiwgMHgxNzgzNiwgMHgxMDU3OCwgMHgxODJiZSwgMHgxMDUzYywNCisgICAgIDB4MTA1MWUsIDB4MTA1YmUsIDB4MTBkNzAsIDB4MTg2YmMsIDB4MTBkMzgsIDB4MTg2OWUsIDB4MTBkMWMsIDB4MTBkMGUsDQorICAgICAweDEwNGJjLCAweDEwZGJjLCAweDEwNDllLCAweDEwZDllLCAweDExZDYwLCAweDE4ZWI4LCAweDFjNzVlLCAweDExZDMwLA0KKyAgICAgMHgxOGU5YywgMHgxMWQxOCwgMHgxOGU4ZSwgMHgxMWQwYywgMHgxMWQwNiwgMHgxMGNiOCwgMHgxODY1ZSwgMHgxMWRiOCwNCisgICAgIDB4MTBjOWMsIDB4MTFkOWMsIDB4MTBjOGUsIDB4MTFkOGUsIDB4MTA0NWUsIDB4MTBjZGUsIDB4MTFkZGUsIDB4MTNkNDAsDQorICAgICAweDE5ZWIwLCAweDFjZjVjLCAweDEzZDIwLCAweDE5ZTk4LCAweDFjZjRlLCAweDEzZDEwLCAweDE5ZThjLCAweDEzZDA4LA0KKyAgICAgMHgxOWU4NiwgMHgxM2QwNCwgMHgxM2QwMiwgMHgxMWNiMCwgMHgxOGU1YywgMHgxM2RiMCwgMHgxMWM5OCwgMHgxOGU0ZSwNCisgICAgIDB4MTNkOTgsIDB4MTllY2UsIDB4MTNkOGMsIDB4MTFjODYsIDB4MTNkODYsIDB4MTBjNWMsIDB4MTFjZGMsIDB4MTBjNGUsDQorICAgICAweDEzZGRjLCAweDExY2NlLCAweDEzZGNlLCAweDFiZWEwLCAweDFkZjU4LCAweDFlZmFlLCAweDFiZTkwLCAweDFkZjRjLA0KKyAgICAgMHgxYmU4OCwgMHgxZGY0NiwgMHgxYmU4NCwgMHgxYmU4MiwgMHgxM2NhMCwgMHgxOWU1OCwgMHgxY2YyZSwgMHgxN2RhMCwNCisgICAgIDB4MTNjOTAsIDB4MTllNGMsIDB4MTdkOTAsIDB4MWJlY2MsIDB4MTllNDYsIDB4MTdkODgsIDB4MTNjODQsIDB4MTdkODQsDQorICAgICAweDEzYzgyLCAweDE3ZDgyLCAweDExYzU4LCAweDE4ZTJlLCAweDEzY2Q4LCAweDExYzRjLCAweDE3ZGQ4LCAweDEzY2NjLA0KKyAgICAgMHgxMWM0NiwgMHgxN2RjYywgMHgxM2NjNiwgMHgxN2RjNiwgMHgxMGMyZSwgMHgxMWM2ZSwgMHgxM2NlZSwgMHgxN2RlZSwNCisgICAgIDB4MWJlNTAsIDB4MWRmMmMsIDB4MWJlNDgsIDB4MWRmMjYsIDB4MWJlNDQsIDB4MWJlNDIsIDB4MTNjNTAsIDB4MTllMmMsDQorICAgICAweDE3Y2QwLCAweDEzYzQ4LCAweDE5ZTI2LCAweDE3Y2M4LCAweDFiZTY2LCAweDE3Y2M0LCAweDEzYzQyLCAweDE3Y2MyLA0KKyAgICAgMHgxMWMyYywgMHgxM2M2YywgMHgxMWMyNiwgMHgxN2NlYywgMHgxM2M2NiwgMHgxN2NlNiwgMHgxYmUyOCwgMHgxZGYxNiwNCisgICAgIDB4MWJlMjQsIDB4MWJlMjIsIDB4MTNjMjgsIDB4MTllMTYsIDB4MTdjNjgsIDB4MTNjMjQsIDB4MTdjNjQsIDB4MTNjMjIsDQorICAgICAweDE3YzYyLCAweDExYzE2LCAweDEzYzM2LCAweDE3Yzc2LCAweDFiZTE0LCAweDFiZTEyLCAweDEzYzE0LCAweDE3YzM0LA0KKyAgICAgMHgxM2MxMiwgMHgxN2MzMiwgMHgxMDJiYywgMHgxMDI5ZSwgMHgxMDZiOCwgMHgxODM1ZSwgMHgxMDY5YywgMHgxMDY4ZSwNCisgICAgIDB4MTAyNWUsIDB4MTA2ZGUsIDB4MTBlYjAsIDB4MTg3NWMsIDB4MTBlOTgsIDB4MTg3NGUsIDB4MTBlOGMsIDB4MTBlODYsDQorICAgICAweDEwNjVjLCAweDEwZWRjLCAweDEwNjRlLCAweDEwZWNlLCAweDExZWEwLCAweDE4ZjU4LCAweDFjN2FlLCAweDExZTkwLA0KKyAgICAgMHgxOGY0YywgMHgxMWU4OCwgMHgxOGY0NiwgMHgxMWU4NCwgMHgxMWU4MiwgMHgxMGU1OCwgMHgxODcyZSwgMHgxMWVkOCwNCisgICAgIDB4MThmNmUsIDB4MTFlY2MsIDB4MTBlNDYsIDB4MTFlYzYsIDB4MTA2MmUsIDB4MTBlNmUsIDB4MTFlZWUsIDB4MTlmNTAsDQorICAgICAweDFjZmFjLCAweDE5ZjQ4LCAweDFjZmE2LCAweDE5ZjQ0LCAweDE5ZjQyLCAweDExZTUwLCAweDE4ZjJjLCAweDEzZWQwLA0KKyAgICAgMHgxOWY2YywgMHgxOGYyNiwgMHgxM2VjOCwgMHgxMWU0NCwgMHgxM2VjNCwgMHgxMWU0MiwgMHgxM2VjMiwgMHgxMGUyYywNCisgICAgIDB4MTFlNmMsIDB4MTBlMjYsIDB4MTNlZWMsIDB4MTFlNjYsIDB4MTNlZTYsIDB4MWRmYTgsIDB4MWVmZDYsIDB4MWRmYTQsDQorICAgICAweDFkZmEyLCAweDE5ZjI4LCAweDFjZjk2LCAweDFiZjY4LCAweDE5ZjI0LCAweDFiZjY0LCAweDE5ZjIyLCAweDFiZjYyLA0KKyAgICAgMHgxMWUyOCwgMHgxOGYxNiwgMHgxM2U2OCwgMHgxMWUyNCwgMHgxN2VlOCwgMHgxM2U2NCwgMHgxMWUyMiwgMHgxN2VlNCwNCisgICAgIDB4MTNlNjIsIDB4MTdlZTIsIDB4MTBlMTYsIDB4MTFlMzYsIDB4MTNlNzYsIDB4MTdlZjYsIDB4MWRmOTQsIDB4MWRmOTIsDQorICAgICAweDE5ZjE0LCAweDFiZjM0LCAweDE5ZjEyLCAweDFiZjMyLCAweDExZTE0LCAweDEzZTM0LCAweDExZTEyLCAweDE3ZTc0LA0KKyAgICAgMHgxM2UzMiwgMHgxN2U3MiwgMHgxZGY4YSwgMHgxOWYwYSwgMHgxYmYxYSwgMHgxMWUwYSwgMHgxM2UxYSwgMHgxN2UzYSwNCisgICAgIDB4MTAzNWMsIDB4MTAzNGUsIDB4MTA3NTgsIDB4MTgzYWUsIDB4MTA3NGMsIDB4MTA3NDYsIDB4MTAzMmUsIDB4MTA3NmUsDQorICAgICAweDEwZjUwLCAweDE4N2FjLCAweDEwZjQ4LCAweDE4N2E2LCAweDEwZjQ0LCAweDEwZjQyLCAweDEwNzJjLCAweDEwZjZjLA0KKyAgICAgMHgxMDcyNiwgMHgxMGY2NiwgMHgxOGZhOCwgMHgxYzdkNiwgMHgxOGZhNCwgMHgxOGZhMiwgMHgxMGYyOCwgMHgxODc5NiwNCisgICAgIDB4MTFmNjgsIDB4MThmYjYsIDB4MTFmNjQsIDB4MTBmMjIsIDB4MTFmNjIsIDB4MTA3MTYsIDB4MTBmMzYsIDB4MTFmNzYsDQorICAgICAweDFjZmQ0LCAweDFjZmQyLCAweDE4Zjk0LCAweDE5ZmI0LCAweDE4ZjkyLCAweDE5ZmIyLCAweDEwZjE0LCAweDExZjM0LA0KKyAgICAgMHgxMGYxMiwgMHgxM2Y3NCwgMHgxMWYzMiwgMHgxM2Y3MiwgMHgxY2ZjYSwgMHgxOGY4YSwgMHgxOWY5YSwgMHgxMGYwYSwNCisgICAgIDB4MTFmMWEsIDB4MTNmM2EsIDB4MTAzYWMsIDB4MTAzYTYsIDB4MTA3YTgsIDB4MTgzZDYsIDB4MTA3YTQsIDB4MTA3YTIsDQorICAgICAweDEwMzk2LCAweDEwN2I2LCAweDE4N2Q0LCAweDE4N2QyLCAweDEwNzk0LCAweDEwZmI0LCAweDEwNzkyLCAweDEwZmIyLA0KKyAgICAgMHgxYzdlYX19Ow0KK0ZYX0ZMT0FUIENCQ19QREY0MTc6OlBSRUZFUlJFRF9SQVRJTyA9IDMuMGY7DQorRlhfRkxPQVQgQ0JDX1BERjQxNzo6REVGQVVMVF9NT0RVTEVfV0lEVEggPSAwLjM1N2Y7DQorRlhfRkxPQVQgQ0JDX1BERjQxNzo6SEVJR0hUID0gMi4wZjsNCitDQkNfUERGNDE3OjpDQkNfUERGNDE3KCkgew0KKyAgbV9jb21wYWN0ID0gRkFMU0U7DQorICBtX2NvbXBhY3Rpb24gPSBBVVRPOw0KKyAgbV9taW5Db2xzID0gMTsNCisgIG1fbWF4Q29scyA9IDMwOw0KKyAgbV9tYXhSb3dzID0gOTA7DQorICBtX21pblJvd3MgPSAzOw0KKyAgbV9iYXJjb2RlTWF0cml4ID0gTlVMTDsNCit9DQorQ0JDX1BERjQxNzo6Q0JDX1BERjQxNyhGWF9CT09MIGNvbXBhY3QpIHsNCisgIG1fY29tcGFjdCA9IGNvbXBhY3Q7DQorICBtX2NvbXBhY3Rpb24gPSBBVVRPOw0KKyAgbV9taW5Db2xzID0gMTsNCisgIG1fbWF4Q29scyA9IDMwOw0KKyAgbV9tYXhSb3dzID0gOTA7DQorICBtX21pblJvd3MgPSAzOw0KKyAgbV9iYXJjb2RlTWF0cml4ID0gTlVMTDsNCit9DQorQ0JDX1BERjQxNzo6fkNCQ19QREY0MTcoKSB7DQorICBpZiAobV9iYXJjb2RlTWF0cml4KSB7DQorICAgIGRlbGV0ZSBtX2JhcmNvZGVNYXRyaXg7DQorICB9DQorfQ0KK0NCQ19CYXJjb2RlTWF0cml4KiBDQkNfUERGNDE3OjpnZXRCYXJjb2RlTWF0cml4KCkgew0KKyAgcmV0dXJuIG1fYmFyY29kZU1hdHJpeDsNCit9DQordm9pZCBDQkNfUERGNDE3OjpnZW5lcmF0ZUJhcmNvZGVMb2dpYyhDRlhfV2lkZVN0cmluZyBtc2csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVycm9yQ29ycmVjdGlvbkxldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBlcnJvckNvcnJlY3Rpb25Db2RlV29yZHMgPQ0KKyAgICAgIENCQ19QREY0MTdFcnJvckNvcnJlY3Rpb246OmdldEVycm9yQ29ycmVjdGlvbkNvZGV3b3JkQ291bnQoDQorICAgICAgICAgIGVycm9yQ29ycmVjdGlvbkxldmVsLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgaGlnaExldmVsID0NCisgICAgICBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6ZW5jb2RlSGlnaExldmVsKG1zZywgbV9jb21wYWN0aW9uLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgaW50MzJfdCBzb3VyY2VDb2RlV29yZHMgPSBoaWdoTGV2ZWwuR2V0TGVuZ3RoKCk7DQorICBDRlhfSW50MzJBcnJheSogZGltZW5zaW9uID0NCisgICAgICBkZXRlcm1pbmVEaW1lbnNpb25zKHNvdXJjZUNvZGVXb3JkcywgZXJyb3JDb3JyZWN0aW9uQ29kZVdvcmRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgaW50MzJfdCBjb2xzID0gZGltZW5zaW9uLT5HZXRBdCgwKTsNCisgIGludDMyX3Qgcm93cyA9IGRpbWVuc2lvbi0+R2V0QXQoMSk7DQorICBkZWxldGUgZGltZW5zaW9uOw0KKyAgaW50MzJfdCBwYWQgPSBnZXROdW1iZXJPZlBhZENvZGV3b3Jkcyhzb3VyY2VDb2RlV29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29ycmVjdGlvbkNvZGVXb3JkcywgY29scywgcm93cyk7DQorICBpZiAoc291cmNlQ29kZVdvcmRzICsgZXJyb3JDb3JyZWN0aW9uQ29kZVdvcmRzICsgMSA+IDkyOSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25FbmNvZGVkTWVzc2FnZUNvbnRhaW5zVG9vTWFueUNvZGVXb3JkczsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBuID0gc291cmNlQ29kZVdvcmRzICsgcGFkICsgMTsNCisgIENGWF9XaWRlU3RyaW5nIHNiOw0KKyAgc2IgKz0gKEZYX1dDSEFSKW47DQorICBzYiArPSBoaWdoTGV2ZWw7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwYWQ7IGkrKykgew0KKyAgICBzYiArPSAoRlhfV0NIQVIpOTAwOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgZGF0YUNvZGV3b3JkcyhzYik7DQorICBDRlhfV2lkZVN0cmluZyBlYyA9IENCQ19QREY0MTdFcnJvckNvcnJlY3Rpb246OmdlbmVyYXRlRXJyb3JDb3JyZWN0aW9uKA0KKyAgICAgIGRhdGFDb2Rld29yZHMsIGVycm9yQ29ycmVjdGlvbkxldmVsLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgZnVsbENvZGV3b3JkcyA9IGRhdGFDb2Rld29yZHMgKyBlYzsNCisgIG1fYmFyY29kZU1hdHJpeCA9IG5ldyBDQkNfQmFyY29kZU1hdHJpeChyb3dzLCBjb2xzKTsNCisgIGVuY29kZUxvd0xldmVsKGZ1bGxDb2Rld29yZHMsIGNvbHMsIHJvd3MsIGVycm9yQ29ycmVjdGlvbkxldmVsLA0KKyAgICAgICAgICAgICAgICAgbV9iYXJjb2RlTWF0cml4KTsNCit9DQordm9pZCBDQkNfUERGNDE3OjpzZXREaW1lbnNpb25zKGludDMyX3QgbWF4Q29scywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtaW5Db2xzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heFJvd3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWluUm93cykgew0KKyAgbV9tYXhDb2xzID0gbWF4Q29sczsNCisgIG1fbWluQ29scyA9IG1pbkNvbHM7DQorICBtX21heFJvd3MgPSBtYXhSb3dzOw0KKyAgbV9taW5Sb3dzID0gbWluUm93czsNCit9DQordm9pZCBDQkNfUERGNDE3OjpzZXRDb21wYWN0aW9uKENvbXBhY3Rpb24gY29tcGFjdGlvbikgew0KKyAgbV9jb21wYWN0aW9uID0gY29tcGFjdGlvbjsNCit9DQordm9pZCBDQkNfUERGNDE3OjpzZXRDb21wYWN0KEZYX0JPT0wgY29tcGFjdCkgew0KKyAgbV9jb21wYWN0ID0gY29tcGFjdDsNCit9DQoraW50MzJfdCBDQkNfUERGNDE3OjpjYWxjdWxhdGVOdW1iZXJPZlJvd3MoaW50MzJfdCBtLCBpbnQzMl90IGssIGludDMyX3QgYykgew0KKyAgaW50MzJfdCByID0gKChtICsgMSArIGspIC8gYykgKyAxOw0KKyAgaWYgKGMgKiByID49IChtICsgMSArIGsgKyBjKSkgew0KKyAgICByLS07DQorICB9DQorICByZXR1cm4gcjsNCit9DQoraW50MzJfdCBDQkNfUERGNDE3OjpnZXROdW1iZXJPZlBhZENvZGV3b3JkcyhpbnQzMl90IG0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGssDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHIpIHsNCisgIGludDMyX3QgbiA9IGMgKiByIC0gazsNCisgIHJldHVybiBuID4gbSArIDEgPyBuIC0gbSAtIDEgOiAwOw0KK30NCit2b2lkIENCQ19QREY0MTc6OmVuY29kZUNoYXIoaW50MzJfdCBwYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0JhcmNvZGVSb3cqIGxvZ2ljKSB7DQorICBpbnQzMl90IG1hcCA9IDEgPDwgKGxlbiAtIDEpOw0KKyAgRlhfQk9PTCBsYXN0ID0gKChwYXR0ZXJuICYgbWFwKSAhPSAwKTsNCisgIGludDMyX3Qgd2lkdGggPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsNCisgICAgRlhfQk9PTCBibGFjayA9ICgocGF0dGVybiAmIG1hcCkgIT0gMCk7DQorICAgIGlmIChsYXN0ID09IGJsYWNrKSB7DQorICAgICAgd2lkdGgrKzsNCisgICAgfSBlbHNlIHsNCisgICAgICBsb2dpYy0+YWRkQmFyKGxhc3QsIHdpZHRoKTsNCisgICAgICBsYXN0ID0gYmxhY2s7DQorICAgICAgd2lkdGggPSAxOw0KKyAgICB9DQorICAgIG1hcCA+Pj0gMTsNCisgIH0NCisgIGxvZ2ljLT5hZGRCYXIobGFzdCwgd2lkdGgpOw0KK30NCit2b2lkIENCQ19QREY0MTc6OmVuY29kZUxvd0xldmVsKENGWF9XaWRlU3RyaW5nIGZ1bGxDb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVycm9yQ29ycmVjdGlvbkxldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0JhcmNvZGVNYXRyaXgqIGxvZ2ljKSB7DQorICBpbnQzMl90IGlkeCA9IDA7DQorICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCByOyB5KyspIHsNCisgICAgaW50MzJfdCBjbHVzdGVyID0geSAlIDM7DQorICAgIGxvZ2ljLT5zdGFydFJvdygpOw0KKyAgICBlbmNvZGVDaGFyKFNUQVJUX1BBVFRFUk4sIDE3LCBsb2dpYy0+Z2V0Q3VycmVudFJvdygpKTsNCisgICAgaW50MzJfdCBsZWZ0Ow0KKyAgICBpbnQzMl90IHJpZ2h0Ow0KKyAgICBpZiAoY2x1c3RlciA9PSAwKSB7DQorICAgICAgbGVmdCA9ICgzMCAqICh5IC8gMykpICsgKChyIC0gMSkgLyAzKTsNCisgICAgICByaWdodCA9ICgzMCAqICh5IC8gMykpICsgKGMgLSAxKTsNCisgICAgfSBlbHNlIGlmIChjbHVzdGVyID09IDEpIHsNCisgICAgICBsZWZ0ID0gKDMwICogKHkgLyAzKSkgKyAoZXJyb3JDb3JyZWN0aW9uTGV2ZWwgKiAzKSArICgociAtIDEpICUgMyk7DQorICAgICAgcmlnaHQgPSAoMzAgKiAoeSAvIDMpKSArICgociAtIDEpIC8gMyk7DQorICAgIH0gZWxzZSB7DQorICAgICAgbGVmdCA9ICgzMCAqICh5IC8gMykpICsgKGMgLSAxKTsNCisgICAgICByaWdodCA9ICgzMCAqICh5IC8gMykpICsgKGVycm9yQ29ycmVjdGlvbkxldmVsICogMykgKyAoKHIgLSAxKSAlIDMpOw0KKyAgICB9DQorICAgIGludDMyX3QgcGF0dGVybiA9IENPREVXT1JEX1RBQkxFW2NsdXN0ZXJdW2xlZnRdOw0KKyAgICBlbmNvZGVDaGFyKHBhdHRlcm4sIDE3LCBsb2dpYy0+Z2V0Q3VycmVudFJvdygpKTsNCisgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgYzsgeCsrKSB7DQorICAgICAgcGF0dGVybiA9IENPREVXT1JEX1RBQkxFW2NsdXN0ZXJdW2Z1bGxDb2Rld29yZHMuR2V0QXQoaWR4KV07DQorICAgICAgZW5jb2RlQ2hhcihwYXR0ZXJuLCAxNywgbG9naWMtPmdldEN1cnJlbnRSb3coKSk7DQorICAgICAgaWR4Kys7DQorICAgIH0NCisgICAgaWYgKG1fY29tcGFjdCkgew0KKyAgICAgIGVuY29kZUNoYXIoU1RPUF9QQVRURVJOLCAxLCBsb2dpYy0+Z2V0Q3VycmVudFJvdygpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBwYXR0ZXJuID0gQ09ERVdPUkRfVEFCTEVbY2x1c3Rlcl1bcmlnaHRdOw0KKyAgICAgIGVuY29kZUNoYXIocGF0dGVybiwgMTcsIGxvZ2ljLT5nZXRDdXJyZW50Um93KCkpOw0KKyAgICAgIGVuY29kZUNoYXIoU1RPUF9QQVRURVJOLCAxOCwgbG9naWMtPmdldEN1cnJlbnRSb3coKSk7DQorICAgIH0NCisgIH0NCit9DQorQ0ZYX0ludDMyQXJyYXkqIENCQ19QREY0MTc6OmRldGVybWluZURpbWVuc2lvbnMoDQorICAgIGludDMyX3Qgc291cmNlQ29kZVdvcmRzLA0KKyAgICBpbnQzMl90IGVycm9yQ29ycmVjdGlvbkNvZGVXb3JkcywNCisgICAgaW50MzJfdCYgZSkgew0KKyAgRlhfRkxPQVQgcmF0aW8gPSAwLjBmOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIGRpbWVuc2lvbiA9IE5VTEw7DQorICBmb3IgKGludDMyX3QgY29scyA9IG1fbWluQ29sczsgY29scyA8PSBtX21heENvbHM7IGNvbHMrKykgew0KKyAgICBpbnQzMl90IHJvd3MgPQ0KKyAgICAgICAgY2FsY3VsYXRlTnVtYmVyT2ZSb3dzKHNvdXJjZUNvZGVXb3JkcywgZXJyb3JDb3JyZWN0aW9uQ29kZVdvcmRzLCBjb2xzKTsNCisgICAgaWYgKHJvd3MgPCBtX21pblJvd3MpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAocm93cyA+IG1fbWF4Um93cykgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIEZYX0ZMT0FUIG5ld1JhdGlvID0NCisgICAgICAgICgoMTcgKiBjb2xzICsgNjkpICogREVGQVVMVF9NT0RVTEVfV0lEVEgpIC8gKHJvd3MgKiBIRUlHSFQpOw0KKyAgICBpZiAoZGltZW5zaW9uICE9IE5VTEwgJiYNCisgICAgICAgIGZhYnNmKG5ld1JhdGlvIC0gUFJFRkVSUkVEX1JBVElPKSA+IGZhYnNmKHJhdGlvIC0gUFJFRkVSUkVEX1JBVElPKSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIHJhdGlvID0gbmV3UmF0aW87DQorICAgIGlmIChkaW1lbnNpb24pIHsNCisgICAgICBkZWxldGUgZGltZW5zaW9uOw0KKyAgICB9DQorICAgIGRpbWVuc2lvbiA9IG5ldyBDRlhfSW50MzJBcnJheTsNCisgICAgZGltZW5zaW9uLT5BZGQoY29scyk7DQorICAgIGRpbWVuc2lvbi0+QWRkKHJvd3MpOw0KKyAgfQ0KKyAgaWYgKGRpbWVuc2lvbiA9PSBOVUxMKSB7DQorICAgIGludDMyX3Qgcm93cyA9IGNhbGN1bGF0ZU51bWJlck9mUm93cyhzb3VyY2VDb2RlV29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvcnJlY3Rpb25Db2RlV29yZHMsIG1fbWluQ29scyk7DQorICAgIGlmIChyb3dzIDwgbV9taW5Sb3dzKSB7DQorICAgICAgZGltZW5zaW9uID0gbmV3IENGWF9JbnQzMkFycmF5Ow0KKyAgICAgIGRpbWVuc2lvbi0+QWRkKG1fbWluQ29scyk7DQorICAgICAgZGltZW5zaW9uLT5BZGQobV9taW5Sb3dzKTsNCisgICAgfSBlbHNlIGlmIChyb3dzID49IDMgJiYgcm93cyA8PSA5MCkgew0KKyAgICAgIGRpbWVuc2lvbiA9IG5ldyBDRlhfSW50MzJBcnJheTsNCisgICAgICBkaW1lbnNpb24tPkFkZChtX21pbkNvbHMpOw0KKyAgICAgIGRpbWVuc2lvbi0+QWRkKHJvd3MpOw0KKyAgICB9DQorICB9DQorICBpZiAoZGltZW5zaW9uID09IE5VTEwpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uVW5hYmxlVG9GaXRNZXNzYWdlSW5Db2x1bW5zOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBkaW1lbnNpb247DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTcuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzIwYTY5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxNy5oCkBAIC0wLDAgKzEsNTkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUERGNDE3X0hfDQorI2RlZmluZSBfQkNfUERGNDE3X0hfDQorY2xhc3MgQ0JDX0NvbXBhY3Rpb247DQorY2xhc3MgQ0JDX0JhcmNvZGVSb3c7DQorY2xhc3MgQ0JDX0JhcmNvZGVNYXRyaXg7DQorY2xhc3MgQ0JDX1BERjQxNyB7DQorIHB1YmxpYzoNCisgIENCQ19QREY0MTcoKTsNCisgIENCQ19QREY0MTcoRlhfQk9PTCBjb21wYWN0KTsNCisgIHZpcnR1YWwgfkNCQ19QREY0MTcoKTsNCisgIENCQ19CYXJjb2RlTWF0cml4KiBnZXRCYXJjb2RlTWF0cml4KCk7DQorICB2b2lkIGdlbmVyYXRlQmFyY29kZUxvZ2ljKENGWF9XaWRlU3RyaW5nIG1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlcnJvckNvcnJlY3Rpb25MZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICB2b2lkIHNldERpbWVuc2lvbnMoaW50MzJfdCBtYXhDb2xzLA0KKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWluQ29scywNCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heFJvd3MsDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtaW5Sb3dzKTsNCisgIHZvaWQgc2V0Q29tcGFjdGlvbihDb21wYWN0aW9uIGNvbXBhY3Rpb24pOw0KKyAgdm9pZCBzZXRDb21wYWN0KEZYX0JPT0wgY29tcGFjdCk7DQorDQorIHByaXZhdGU6DQorICBzdGF0aWMgaW50MzJfdCBTVEFSVF9QQVRURVJOOw0KKyAgc3RhdGljIGludDMyX3QgU1RPUF9QQVRURVJOOw0KKyAgc3RhdGljIGludDMyX3QgQ09ERVdPUkRfVEFCTEVbXVsxMDAwXTsNCisgIHN0YXRpYyBGWF9GTE9BVCBQUkVGRVJSRURfUkFUSU87DQorICBzdGF0aWMgRlhfRkxPQVQgREVGQVVMVF9NT0RVTEVfV0lEVEg7DQorICBzdGF0aWMgRlhfRkxPQVQgSEVJR0hUOw0KKyAgQ0JDX0JhcmNvZGVNYXRyaXgqIG1fYmFyY29kZU1hdHJpeDsNCisgIEZYX0JPT0wgbV9jb21wYWN0Ow0KKyAgQ29tcGFjdGlvbiBtX2NvbXBhY3Rpb247DQorICBpbnQzMl90IG1fbWluQ29sczsNCisgIGludDMyX3QgbV9tYXhDb2xzOw0KKyAgaW50MzJfdCBtX21heFJvd3M7DQorICBpbnQzMl90IG1fbWluUm93czsNCisNCisgcHJpdmF0ZToNCisgIHN0YXRpYyBpbnQzMl90IGNhbGN1bGF0ZU51bWJlck9mUm93cyhpbnQzMl90IG0sIGludDMyX3QgaywgaW50MzJfdCBjKTsNCisgIHN0YXRpYyBpbnQzMl90IGdldE51bWJlck9mUGFkQ29kZXdvcmRzKGludDMyX3QgbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcik7DQorICBzdGF0aWMgdm9pZCBlbmNvZGVDaGFyKGludDMyX3QgcGF0dGVybiwgaW50MzJfdCBsZW4sIENCQ19CYXJjb2RlUm93KiBsb2dpYyk7DQorICB2b2lkIGVuY29kZUxvd0xldmVsKENGWF9XaWRlU3RyaW5nIGZ1bGxDb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYywNCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByLA0KKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVycm9yQ29ycmVjdGlvbkxldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICBDQkNfQmFyY29kZU1hdHJpeCogbG9naWMpOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIGRldGVybWluZURpbWVuc2lvbnMoaW50MzJfdCBzb3VyY2VDb2RlV29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVycm9yQ29ycmVjdGlvbkNvZGVXb3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVNYXRyaXguY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVNYXRyaXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZGZiYjIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZU1hdHJpeC5jcHAKQEAgLTAsMCArMSw5MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAxMSBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0JhcmNvZGVSb3cuaCINCisjaW5jbHVkZSAiQkNfUERGNDE3QmFyY29kZU1hdHJpeC5oIg0KK0NCQ19CYXJjb2RlTWF0cml4OjpDQkNfQmFyY29kZU1hdHJpeChpbnQzMl90IGhlaWdodCwgaW50MzJfdCB3aWR0aCkgew0KKyAgbV9tYXRyaXguU2V0U2l6ZShoZWlnaHQgKyAyKTsNCisgIGZvciAoaW50MzJfdCBpID0gMCwgbWF0cml4TGVuZ3RoID0gbV9tYXRyaXguR2V0U2l6ZSgpOyBpIDwgbWF0cml4TGVuZ3RoOw0KKyAgICAgICBpKyspIHsNCisgICAgbV9tYXRyaXhbaV0gPSBuZXcgQ0JDX0JhcmNvZGVSb3coKHdpZHRoICsgNCkgKiAxNyArIDEpOw0KKyAgfQ0KKyAgbV93aWR0aCA9IHdpZHRoICogMTc7DQorICBtX2hlaWdodCA9IGhlaWdodCArIDI7DQorICBtX2N1cnJlbnRSb3cgPSAwOw0KKyAgbV9vdXRIZWlnaHQgPSAwOw0KKyAgbV9vdXRXaWR0aCA9IDA7DQorfQ0KK0NCQ19CYXJjb2RlTWF0cml4Ojp+Q0JDX0JhcmNvZGVNYXRyaXgoKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX21hdHJpeC5HZXRTaXplKCk7IGkrKykgew0KKyAgICBkZWxldGUgKENCQ19CYXJjb2RlUm93KiltX21hdHJpeC5HZXRBdChpKTsNCisgIH0NCisgIG1fbWF0cml4LlJlbW92ZUFsbCgpOw0KKyAgbV9tYXRyaXhPdXQuUmVtb3ZlQWxsKCk7DQorfQ0KK3ZvaWQgQ0JDX0JhcmNvZGVNYXRyaXg6OnNldChpbnQzMl90IHgsIGludDMyX3QgeSwgdWludDhfdCB2YWx1ZSkgew0KKyAgKChDQkNfQmFyY29kZVJvdyopbV9tYXRyaXhbeV0pLT5zZXQoeCwgdmFsdWUpOw0KK30NCit2b2lkIENCQ19CYXJjb2RlTWF0cml4OjpzZXRNYXRyaXgoaW50MzJfdCB4LCBpbnQzMl90IHksIEZYX0JPT0wgYmxhY2spIHsNCisgIHNldCh4LCB5LCAodWludDhfdCkoYmxhY2sgPyAxIDogMCkpOw0KK30NCit2b2lkIENCQ19CYXJjb2RlTWF0cml4OjpzdGFydFJvdygpIHsNCisgICsrbV9jdXJyZW50Um93Ow0KK30NCitDQkNfQmFyY29kZVJvdyogQ0JDX0JhcmNvZGVNYXRyaXg6OmdldEN1cnJlbnRSb3coKSB7DQorICByZXR1cm4gKENCQ19CYXJjb2RlUm93KiltX21hdHJpeFttX2N1cnJlbnRSb3ddOw0KK30NCitpbnQzMl90IENCQ19CYXJjb2RlTWF0cml4OjpnZXRXaWR0aCgpIHsNCisgIHJldHVybiBtX291dFdpZHRoOw0KK30NCitpbnQzMl90IENCQ19CYXJjb2RlTWF0cml4OjpnZXRIZWlnaHQoKSB7DQorICByZXR1cm4gbV9vdXRIZWlnaHQ7DQorfQ0KK0NGWF9CeXRlQXJyYXkmIENCQ19CYXJjb2RlTWF0cml4OjpnZXRNYXRyaXgoKSB7DQorICByZXR1cm4gZ2V0U2NhbGVkTWF0cml4KDEsIDEpOw0KK30NCitDRlhfQnl0ZUFycmF5JiBDQkNfQmFyY29kZU1hdHJpeDo6Z2V0U2NhbGVkTWF0cml4KGludDMyX3Qgc2NhbGUpIHsNCisgIHJldHVybiBnZXRTY2FsZWRNYXRyaXgoc2NhbGUsIHNjYWxlKTsNCit9DQorQ0ZYX0J5dGVBcnJheSYgQ0JDX0JhcmNvZGVNYXRyaXg6OmdldFNjYWxlZE1hdHJpeChpbnQzMl90IHhTY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeVNjYWxlKSB7DQorICBpbnQzMl90IHlNYXggPSBtX2hlaWdodCAqIHlTY2FsZTsNCisgIENGWF9CeXRlQXJyYXkgYnl0ZWFycmF5Ow0KKyAgYnl0ZWFycmF5LkNvcHkoKChDQkNfQmFyY29kZVJvdyopbV9tYXRyaXhbMF0pLT5nZXRTY2FsZWRSb3coeFNjYWxlKSk7DQorICBpbnQzMl90IHhNYXggPSBieXRlYXJyYXkuR2V0U2l6ZSgpOw0KKyAgbV9tYXRyaXhPdXQuU2V0U2l6ZSh4TWF4ICogeU1heCk7DQorICBtX291dFdpZHRoID0geE1heDsNCisgIG1fb3V0SGVpZ2h0ID0geU1heDsNCisgIGludDMyX3QgayA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCB5TWF4OyBpKyspIHsNCisgICAgaWYgKGkgIT0gMCkgew0KKyAgICAgIGJ5dGVhcnJheS5Db3B5KA0KKyAgICAgICAgICAoKENCQ19CYXJjb2RlUm93KiltX21hdHJpeFtpIC8geVNjYWxlXSktPmdldFNjYWxlZFJvdyh4U2NhbGUpKTsNCisgICAgfQ0KKyAgICBrID0gaSAqIHhNYXg7DQorICAgIGZvciAoaW50MzJfdCBsID0gMDsgbCA8IHhNYXg7IGwrKykgew0KKyAgICAgIG1fbWF0cml4T3V0W2sgKyBsXSA9IGJ5dGVhcnJheS5HZXRBdChsKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIG1fbWF0cml4T3V0Ow0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZU1hdHJpeC5oIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVNYXRyaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGU4YzQzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVNYXRyaXguaApAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0JBUkNPREVNQVRSSVhfSF8NCisjZGVmaW5lIF9CQ19CQVJDT0RFTUFUUklYX0hfDQorY2xhc3MgQ0JDX0JhcmNvZGVSb3c7DQorY2xhc3MgQ0JDX0JhcmNvZGVNYXRyaXggew0KKyBwdWJsaWM6DQorICBDQkNfQmFyY29kZU1hdHJpeCgpOw0KKyAgQ0JDX0JhcmNvZGVNYXRyaXgoaW50MzJfdCBoZWlnaHQsIGludDMyX3Qgd2lkdGgpOw0KKyAgdmlydHVhbCB+Q0JDX0JhcmNvZGVNYXRyaXgoKTsNCisgIHZvaWQgc2V0KGludDMyX3QgeCwgaW50MzJfdCB5LCB1aW50OF90IHZhbHVlKTsNCisgIHZvaWQgc2V0TWF0cml4KGludDMyX3QgeCwgaW50MzJfdCB5LCBGWF9CT09MIGJsYWNrKTsNCisgIHZvaWQgc3RhcnRSb3coKTsNCisgIENCQ19CYXJjb2RlUm93KiBnZXRDdXJyZW50Um93KCk7DQorICBDRlhfQnl0ZUFycmF5JiBnZXRNYXRyaXgoKTsNCisgIENGWF9CeXRlQXJyYXkmIGdldFNjYWxlZE1hdHJpeChpbnQzMl90IHNjYWxlKTsNCisgIENGWF9CeXRlQXJyYXkmIGdldFNjYWxlZE1hdHJpeChpbnQzMl90IHhTY2FsZSwgaW50MzJfdCB5U2NhbGUpOw0KKyAgaW50MzJfdCBnZXRXaWR0aCgpOw0KKyAgaW50MzJfdCBnZXRIZWlnaHQoKTsNCisNCisgcHJpdmF0ZToNCisgIENGWF9QdHJBcnJheSBtX21hdHJpeDsNCisgIENGWF9CeXRlQXJyYXkgbV9tYXRyaXhPdXQ7DQorICBpbnQzMl90IG1fY3VycmVudFJvdzsNCisgIGludDMyX3QgbV9oZWlnaHQ7DQorICBpbnQzMl90IG1fd2lkdGg7DQorICBpbnQzMl90IG1fb3V0V2lkdGg7DQorICBpbnQzMl90IG1fb3V0SGVpZ2h0Ow0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVNZXRhZGF0YS5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZU1ldGFkYXRhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDAxMzZlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVNZXRhZGF0YS5jcHAKQEAgLTAsMCArMSw1MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAxMyBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0JhcmNvZGVNZXRhZGF0YS5oIg0KK0NCQ19CYXJjb2RlTWV0YWRhdGE6OkNCQ19CYXJjb2RlTWV0YWRhdGEoaW50MzJfdCBjb2x1bW5Db3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm93Q291bnRVcHBlclBhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJvd0NvdW50TG93ZXJQYXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlcnJvckNvcnJlY3Rpb25MZXZlbCkgew0KKyAgbV9jb2x1bW5Db3VudCA9IGNvbHVtbkNvdW50Ow0KKyAgbV9yb3dDb3VudFVwcGVyUGFydCA9IHJvd0NvdW50VXBwZXJQYXJ0Ow0KKyAgbV9yb3dDb3VudExvd2VyUGFydCA9IHJvd0NvdW50TG93ZXJQYXJ0Ow0KKyAgbV9lcnJvckNvcnJlY3Rpb25MZXZlbCA9IGVycm9yQ29ycmVjdGlvbkxldmVsOw0KKyAgbV9yb3dDb3VudCA9IG1fcm93Q291bnRVcHBlclBhcnQgKyBtX3Jvd0NvdW50TG93ZXJQYXJ0Ow0KK30NCitDQkNfQmFyY29kZU1ldGFkYXRhOjp+Q0JDX0JhcmNvZGVNZXRhZGF0YSgpIHt9DQoraW50MzJfdCBDQkNfQmFyY29kZU1ldGFkYXRhOjpnZXRDb2x1bW5Db3VudCgpIHsNCisgIHJldHVybiBtX2NvbHVtbkNvdW50Ow0KK30NCitpbnQzMl90IENCQ19CYXJjb2RlTWV0YWRhdGE6OmdldEVycm9yQ29ycmVjdGlvbkxldmVsKCkgew0KKyAgcmV0dXJuIG1fZXJyb3JDb3JyZWN0aW9uTGV2ZWw7DQorfQ0KK2ludDMyX3QgQ0JDX0JhcmNvZGVNZXRhZGF0YTo6Z2V0Um93Q291bnQoKSB7DQorICByZXR1cm4gbV9yb3dDb3VudDsNCit9DQoraW50MzJfdCBDQkNfQmFyY29kZU1ldGFkYXRhOjpnZXRSb3dDb3VudFVwcGVyUGFydCgpIHsNCisgIHJldHVybiBtX3Jvd0NvdW50VXBwZXJQYXJ0Ow0KK30NCitpbnQzMl90IENCQ19CYXJjb2RlTWV0YWRhdGE6OmdldFJvd0NvdW50TG93ZXJQYXJ0KCkgew0KKyAgcmV0dXJuIG1fcm93Q291bnRMb3dlclBhcnQ7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlTWV0YWRhdGEuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlTWV0YWRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2QyNjE3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVNZXRhZGF0YS5oCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfQkFSQ09ERU1FVEFEQVRBX0hfDQorI2RlZmluZSBfQkNfQkFSQ09ERU1FVEFEQVRBX0hfDQorY2xhc3MgQ0JDX0JhcmNvZGVNZXRhZGF0YTsNCitjbGFzcyBDQkNfQmFyY29kZU1ldGFkYXRhIHsNCisgcHVibGljOg0KKyAgQ0JDX0JhcmNvZGVNZXRhZGF0YShpbnQzMl90IGNvbHVtbkNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJvd0NvdW50VXBwZXJQYXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJvd0NvdW50TG93ZXJQYXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVycm9yQ29ycmVjdGlvbkxldmVsKTsNCisgIHZpcnR1YWwgfkNCQ19CYXJjb2RlTWV0YWRhdGEoKTsNCisgIGludDMyX3QgZ2V0Q29sdW1uQ291bnQoKTsNCisgIGludDMyX3QgZ2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoKTsNCisgIGludDMyX3QgZ2V0Um93Q291bnQoKTsNCisgIGludDMyX3QgZ2V0Um93Q291bnRVcHBlclBhcnQoKTsNCisgIGludDMyX3QgZ2V0Um93Q291bnRMb3dlclBhcnQoKTsNCisNCisgcHJpdmF0ZToNCisgIGludDMyX3QgbV9jb2x1bW5Db3VudDsNCisgIGludDMyX3QgbV9lcnJvckNvcnJlY3Rpb25MZXZlbDsNCisgIGludDMyX3QgbV9yb3dDb3VudFVwcGVyUGFydDsNCisgIGludDMyX3QgbV9yb3dDb3VudExvd2VyUGFydDsNCisgIGludDMyX3QgbV9yb3dDb3VudDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlUm93LmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlUm93LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDcyZjBlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVSb3cuY3BwCkBAIC0wLDAgKzEsNTMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMTEgWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdCYXJjb2RlUm93LmgiDQorQ0JDX0JhcmNvZGVSb3c6OkNCQ19CYXJjb2RlUm93KGludDMyX3Qgd2lkdGgpIHsNCisgIG1fcm93LlNldFNpemUod2lkdGgpOw0KKyAgbV9jdXJyZW50TG9jYXRpb24gPSAwOw0KK30NCitDQkNfQmFyY29kZVJvdzo6fkNCQ19CYXJjb2RlUm93KCkgew0KKyAgbV9vdXRwdXQuUmVtb3ZlQWxsKCk7DQorICBtX3Jvdy5SZW1vdmVBbGwoKTsNCit9DQordm9pZCBDQkNfQmFyY29kZVJvdzo6c2V0KGludDMyX3QgeCwgdWludDhfdCB2YWx1ZSkgew0KKyAgbV9yb3cuU2V0QXQoeCwgdmFsdWUpOw0KK30NCit2b2lkIENCQ19CYXJjb2RlUm93OjpzZXQoaW50MzJfdCB4LCBGWF9CT09MIGJsYWNrKSB7DQorICBtX3Jvdy5TZXRBdCh4LCAodWludDhfdCkoYmxhY2sgPyAxIDogMCkpOw0KK30NCit2b2lkIENCQ19CYXJjb2RlUm93OjphZGRCYXIoRlhfQk9PTCBibGFjaywgaW50MzJfdCB3aWR0aCkgew0KKyAgZm9yIChpbnQzMl90IGlpID0gMDsgaWkgPCB3aWR0aDsgaWkrKykgew0KKyAgICBzZXQobV9jdXJyZW50TG9jYXRpb24rKywgYmxhY2spOw0KKyAgfQ0KK30NCitDRlhfQnl0ZUFycmF5JiBDQkNfQmFyY29kZVJvdzo6Z2V0Um93KCkgew0KKyAgcmV0dXJuIG1fcm93Ow0KK30NCitDRlhfQnl0ZUFycmF5JiBDQkNfQmFyY29kZVJvdzo6Z2V0U2NhbGVkUm93KGludDMyX3Qgc2NhbGUpIHsNCisgIG1fb3V0cHV0LlNldFNpemUobV9yb3cuR2V0U2l6ZSgpICogc2NhbGUpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbV9vdXRwdXQuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgbV9vdXRwdXRbaV0gPSAobV9yb3dbaSAvIHNjYWxlXSk7DQorICB9DQorICByZXR1cm4gbV9vdXRwdXQ7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlUm93LmggYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZVJvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMDkwNWEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZVJvdy5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfQkFSQ09ERVJPV19IXw0KKyNkZWZpbmUgX0JDX0JBUkNPREVST1dfSF8NCitjbGFzcyBDQkNfQmFyY29kZVJvdyB7DQorIHB1YmxpYzoNCisgIENCQ19CYXJjb2RlUm93KGludDMyX3Qgd2lkdGgpOw0KKyAgdmlydHVhbCB+Q0JDX0JhcmNvZGVSb3coKTsNCisgIHZvaWQgc2V0KGludDMyX3QgeCwgdWludDhfdCB2YWx1ZSk7DQorICB2b2lkIHNldChpbnQzMl90IHgsIEZYX0JPT0wgYmxhY2spOw0KKyAgdm9pZCBhZGRCYXIoRlhfQk9PTCBibGFjaywgaW50MzJfdCB3aWR0aCk7DQorICBDRlhfQnl0ZUFycmF5JiBnZXRSb3coKTsNCisgIENGWF9CeXRlQXJyYXkmIGdldFNjYWxlZFJvdyhpbnQzMl90IHNjYWxlKTsNCisNCisgcHJpdmF0ZToNCisgIENGWF9CeXRlQXJyYXkgbV9yb3c7DQorICBDRlhfQnl0ZUFycmF5IG1fb3V0cHV0Ow0KKyAgaW50MzJfdCBtX2N1cnJlbnRMb2NhdGlvbjsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlVmFsdWUuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVWYWx1ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMzMTkzMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlVmFsdWUuY3BwCkBAIC0wLDAgKzEsNjEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMTMgWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdDb21tb24uaCINCisjaW5jbHVkZSAiQkNfUERGNDE3QmFyY29kZVZhbHVlLmgiDQorQ0JDX0JhcmNvZGVWYWx1ZTo6Q0JDX0JhcmNvZGVWYWx1ZSgpIHt9DQorQ0JDX0JhcmNvZGVWYWx1ZTo6fkNCQ19CYXJjb2RlVmFsdWUoKSB7fQ0KK3ZvaWQgQ0JDX0JhcmNvZGVWYWx1ZTo6c2V0VmFsdWUoaW50MzJfdCB2YWx1ZSkgew0KKyAgaW50MzJfdCBjb25maWRlbmNlID0gMDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fa2V5cy5HZXRTaXplKCk7IGkrKykgew0KKyAgICBpZiAobV9rZXlzLkdldEF0KGkpID09IHZhbHVlKSB7DQorICAgICAgY29uZmlkZW5jZSA9IG1fdmFsdWVzLkdldEF0KGkpOw0KKyAgICAgIG1fdmFsdWVzLlNldEF0KGksIGNvbmZpZGVuY2UgKyAxKTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgIH0NCisgIGNvbmZpZGVuY2UgPSAxOw0KKyAgbV9rZXlzLkFkZCh2YWx1ZSk7DQorICBtX3ZhbHVlcy5BZGQoY29uZmlkZW5jZSk7DQorfQ0KK0NGWF9JbnQzMkFycmF5KiBDQkNfQmFyY29kZVZhbHVlOjpnZXRWYWx1ZSgpIHsNCisgIGludDMyX3QgbWF4Q29uZmlkZW5jZSA9IC0xOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIHJlc3VsdCA9IG5ldyBDRlhfSW50MzJBcnJheTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fa2V5cy5HZXRTaXplKCk7IGkrKykgew0KKyAgICBpZiAobV92YWx1ZXMuR2V0QXQoaSkgPiBtYXhDb25maWRlbmNlKSB7DQorICAgICAgbWF4Q29uZmlkZW5jZSA9IG1fdmFsdWVzLkdldEF0KGkpOw0KKyAgICAgIHJlc3VsdC0+UmVtb3ZlQWxsKCk7DQorICAgICAgcmVzdWx0LT5BZGQobV9rZXlzLkdldEF0KGkpKTsNCisgICAgfSBlbHNlIGlmIChtX3ZhbHVlcy5HZXRBdChpKSA9PSBtYXhDb25maWRlbmNlKSB7DQorICAgICAgcmVzdWx0LT5BZGQobV9rZXlzLkdldEF0KGkpKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHJlc3VsdDsNCit9DQoraW50MzJfdCBDQkNfQmFyY29kZVZhbHVlOjpnZXRDb25maWRlbmNlKGludDMyX3QgdmFsdWUpIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fa2V5cy5HZXRTaXplKCk7IGkrKykNCisgICAgaWYgKG1fa2V5cy5HZXRBdChpKSA9PSB2YWx1ZSkgew0KKyAgICAgIHJldHVybiBtX3ZhbHVlcy5HZXRBdChpKTsNCisgICAgfQ0KKyAgcmV0dXJuIC0xOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZVZhbHVlLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZVZhbHVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA4YzU0ZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlVmFsdWUuaApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0JBUkNPREVWQUxVRV9IXw0KKyNkZWZpbmUgX0JDX0JBUkNPREVWQUxVRV9IXw0KK2NsYXNzIENCQ19CYXJjb2RlVmFsdWUgew0KKyBwdWJsaWM6DQorICBDQkNfQmFyY29kZVZhbHVlKCk7DQorICB2aXJ0dWFsIH5DQkNfQmFyY29kZVZhbHVlKCk7DQorICB2b2lkIHNldFZhbHVlKGludDMyX3QgdmFsdWUpOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIGdldFZhbHVlKCk7DQorICBpbnQzMl90IGdldENvbmZpZGVuY2UoaW50MzJfdCB2YWx1ZSk7DQorDQorIHByaXZhdGU6DQorICBDRlhfSW50MzJBcnJheSBtX2tleXM7DQorICBDRlhfSW50MzJBcnJheSBtX3ZhbHVlczsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCb3VuZGluZ0JveC5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Qm91bmRpbmdCb3guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZDkzMTYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Qm91bmRpbmdCb3guY3BwCkBAIC0wLDAgKzEsMjA3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDEzIFpYaW5nIGF1dGhvcnMNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfUmVzdWx0UG9pbnQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdCb3VuZGluZ0JveC5oIg0KK0NCQ19Cb3VuZGluZ0JveDo6Q0JDX0JvdW5kaW5nQm94KENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogdG9wTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbUxlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiB0b3BSaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbVJpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmICgodG9wTGVmdCA9PSBOVUxMICYmIHRvcFJpZ2h0ID09IE5VTEwpIHx8DQorICAgICAgKGJvdHRvbUxlZnQgPT0gTlVMTCAmJiBib3R0b21SaWdodCA9PSBOVUxMKSB8fA0KKyAgICAgICh0b3BMZWZ0ICE9IE5VTEwgJiYgYm90dG9tTGVmdCA9PSBOVUxMKSB8fA0KKyAgICAgICh0b3BSaWdodCAhPSBOVUxMICYmIGJvdHRvbVJpZ2h0ID09IE5VTEwpKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk5vdEZvdW5kSW5zdGFuY2U7DQorICB9DQorICBpbml0KGltYWdlLCB0b3BMZWZ0LCBib3R0b21MZWZ0LCB0b3BSaWdodCwgYm90dG9tUmlnaHQpOw0KK30NCitDQkNfQm91bmRpbmdCb3g6OkNCQ19Cb3VuZGluZ0JveChDQkNfQm91bmRpbmdCb3gqIGJvdW5kaW5nQm94KSB7DQorICBpbml0KGJvdW5kaW5nQm94LT5tX2ltYWdlLCBib3VuZGluZ0JveC0+bV90b3BMZWZ0LCBib3VuZGluZ0JveC0+bV9ib3R0b21MZWZ0LA0KKyAgICAgICBib3VuZGluZ0JveC0+bV90b3BSaWdodCwgYm91bmRpbmdCb3gtPm1fYm90dG9tUmlnaHQpOw0KK30NCitDQkNfQm91bmRpbmdCb3g6On5DQkNfQm91bmRpbmdCb3goKSB7DQorICBpZiAobV90b3BMZWZ0KSB7DQorICAgIGRlbGV0ZSBtX3RvcExlZnQ7DQorICB9DQorICBpZiAobV9ib3R0b21MZWZ0KSB7DQorICAgIGRlbGV0ZSBtX2JvdHRvbUxlZnQ7DQorICB9DQorICBpZiAobV90b3BSaWdodCkgew0KKyAgICBkZWxldGUgbV90b3BSaWdodDsNCisgIH0NCisgIGlmIChtX2JvdHRvbVJpZ2h0KSB7DQorICAgIGRlbGV0ZSBtX2JvdHRvbVJpZ2h0Ow0KKyAgfQ0KK30NCitDQkNfQm91bmRpbmdCb3gqIENCQ19Cb3VuZGluZ0JveDo6bWVyZ2UoQ0JDX0JvdW5kaW5nQm94KiBsZWZ0Qm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQm91bmRpbmdCb3gqIHJpZ2h0Qm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDQkNfQm91bmRpbmdCb3gqIGJvdW5kaW5nQm94ID0gTlVMTDsNCisgIGlmIChsZWZ0Qm94ID09IE5VTEwpIHsNCisgICAgYm91bmRpbmdCb3ggPSBuZXcgQ0JDX0JvdW5kaW5nQm94KHJpZ2h0Qm94KTsNCisgICAgcmV0dXJuIGJvdW5kaW5nQm94Ow0KKyAgfQ0KKyAgaWYgKHJpZ2h0Qm94ID09IE5VTEwpIHsNCisgICAgYm91bmRpbmdCb3ggPSBuZXcgQ0JDX0JvdW5kaW5nQm94KGxlZnRCb3gpOw0KKyAgICByZXR1cm4gYm91bmRpbmdCb3g7DQorICB9DQorICBib3VuZGluZ0JveCA9IG5ldyBDQkNfQm91bmRpbmdCb3gobGVmdEJveC0+bV9pbWFnZSwgbGVmdEJveC0+bV90b3BMZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRCb3gtPm1fYm90dG9tTGVmdCwgcmlnaHRCb3gtPm1fdG9wUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRCb3gtPm1fYm90dG9tUmlnaHQsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIGJvdW5kaW5nQm94Ow0KK30NCitDQkNfQm91bmRpbmdCb3gqIENCQ19Cb3VuZGluZ0JveDo6YWRkTWlzc2luZ1Jvd3MoaW50MzJfdCBtaXNzaW5nU3RhcnRSb3dzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1pc3NpbmdFbmRSb3dzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0JDX1Jlc3VsdFBvaW50KiBuZXdUb3BMZWZ0ID0gbV90b3BMZWZ0Ow0KKyAgQ0JDX1Jlc3VsdFBvaW50KiBuZXdCb3R0b21MZWZ0ID0gbV9ib3R0b21MZWZ0Ow0KKyAgQ0JDX1Jlc3VsdFBvaW50KiBuZXdUb3BSaWdodCA9IG1fdG9wUmlnaHQ7DQorICBDQkNfUmVzdWx0UG9pbnQqIG5ld0JvdHRvbVJpZ2h0ID0gbV9ib3R0b21SaWdodDsNCisgIENCQ19SZXN1bHRQb2ludCogbmV3VG9wID0gTlVMTDsNCisgIENCQ19SZXN1bHRQb2ludCogbmV3Qm90dG9tID0gTlVMTDsNCisgIGlmIChtaXNzaW5nU3RhcnRSb3dzID4gMCkgew0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIHRvcCA9IGlzTGVmdCA/IG1fdG9wTGVmdCA6IG1fdG9wUmlnaHQ7DQorICAgIGludDMyX3QgbmV3TWluWSA9IChpbnQzMl90KXRvcC0+R2V0WSgpIC0gbWlzc2luZ1N0YXJ0Um93czsNCisgICAgaWYgKG5ld01pblkgPCAwKSB7DQorICAgICAgbmV3TWluWSA9IDA7DQorICAgIH0NCisgICAgbmV3VG9wID0gbmV3IENCQ19SZXN1bHRQb2ludCgoRlhfRkxPQVQpdG9wLT5HZXRYKCksIChGWF9GTE9BVCluZXdNaW5ZKTsNCisgICAgaWYgKGlzTGVmdCkgew0KKyAgICAgIG5ld1RvcExlZnQgPSBuZXdUb3A7DQorICAgIH0gZWxzZSB7DQorICAgICAgbmV3VG9wUmlnaHQgPSBuZXdUb3A7DQorICAgIH0NCisgIH0NCisgIGlmIChtaXNzaW5nRW5kUm93cyA+IDApIHsNCisgICAgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b20gPSBpc0xlZnQgPyBtX2JvdHRvbUxlZnQgOiBtX2JvdHRvbVJpZ2h0Ow0KKyAgICBpbnQzMl90IG5ld01heFkgPSAoaW50MzJfdClib3R0b20tPkdldFkoKSArIG1pc3NpbmdFbmRSb3dzOw0KKyAgICBpZiAobmV3TWF4WSA+PSBtX2ltYWdlLT5HZXRIZWlnaHQoKSkgew0KKyAgICAgIG5ld01heFkgPSBtX2ltYWdlLT5HZXRIZWlnaHQoKSAtIDE7DQorICAgIH0NCisgICAgbmV3Qm90dG9tID0NCisgICAgICAgIG5ldyBDQkNfUmVzdWx0UG9pbnQoKEZYX0ZMT0FUKWJvdHRvbS0+R2V0WCgpLCAoRlhfRkxPQVQpbmV3TWF4WSk7DQorICAgIGlmIChpc0xlZnQpIHsNCisgICAgICBuZXdCb3R0b21MZWZ0ID0gbmV3Qm90dG9tOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG5ld0JvdHRvbVJpZ2h0ID0gbmV3Qm90dG9tOw0KKyAgICB9DQorICB9DQorICBjYWxjdWxhdGVNaW5NYXhWYWx1ZXMoKTsNCisgIENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3ggPSBuZXcgQ0JDX0JvdW5kaW5nQm94KA0KKyAgICAgIG1faW1hZ2UsIG5ld1RvcExlZnQsIG5ld0JvdHRvbUxlZnQsIG5ld1RvcFJpZ2h0LCBuZXdCb3R0b21SaWdodCwgZSk7DQorICBkZWxldGUgbmV3VG9wOw0KKyAgZGVsZXRlIG5ld0JvdHRvbTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiBib3VuZGluZ0JveDsNCit9DQordm9pZCBDQkNfQm91bmRpbmdCb3g6OnNldFRvcFJpZ2h0KENCQ19SZXN1bHRQb2ludCB0b3BSaWdodCkgew0KKyAgaWYgKG1fdG9wUmlnaHQpIHsNCisgICAgZGVsZXRlIG1fdG9wUmlnaHQ7DQorICB9DQorICBtX3RvcFJpZ2h0ID0gbmV3IENCQ19SZXN1bHRQb2ludCh0b3BSaWdodC5HZXRYKCksIHRvcFJpZ2h0LkdldFkoKSk7DQorICBjYWxjdWxhdGVNaW5NYXhWYWx1ZXMoKTsNCit9DQordm9pZCBDQkNfQm91bmRpbmdCb3g6OnNldEJvdHRvbVJpZ2h0KENCQ19SZXN1bHRQb2ludCBib3R0b21SaWdodCkgew0KKyAgaWYgKG1fYm90dG9tUmlnaHQpIHsNCisgICAgZGVsZXRlIG1fYm90dG9tUmlnaHQ7DQorICB9DQorICBtX2JvdHRvbVJpZ2h0ID0gbmV3IENCQ19SZXN1bHRQb2ludChib3R0b21SaWdodC5HZXRYKCksIGJvdHRvbVJpZ2h0LkdldFkoKSk7DQorICBjYWxjdWxhdGVNaW5NYXhWYWx1ZXMoKTsNCit9DQoraW50MzJfdCBDQkNfQm91bmRpbmdCb3g6OmdldE1pblgoKSB7DQorICByZXR1cm4gbV9taW5YOw0KK30NCitpbnQzMl90IENCQ19Cb3VuZGluZ0JveDo6Z2V0TWF4WCgpIHsNCisgIHJldHVybiBtX21heFg7DQorfQ0KK2ludDMyX3QgQ0JDX0JvdW5kaW5nQm94OjpnZXRNaW5ZKCkgew0KKyAgcmV0dXJuIG1fbWluWTsNCit9DQoraW50MzJfdCBDQkNfQm91bmRpbmdCb3g6OmdldE1heFkoKSB7DQorICByZXR1cm4gbV9tYXhZOw0KK30NCitDQkNfUmVzdWx0UG9pbnQqIENCQ19Cb3VuZGluZ0JveDo6Z2V0VG9wTGVmdCgpIHsNCisgIHJldHVybiBtX3RvcExlZnQ7DQorfQ0KK0NCQ19SZXN1bHRQb2ludCogQ0JDX0JvdW5kaW5nQm94OjpnZXRUb3BSaWdodCgpIHsNCisgIHJldHVybiBtX3RvcFJpZ2h0Ow0KK30NCitDQkNfUmVzdWx0UG9pbnQqIENCQ19Cb3VuZGluZ0JveDo6Z2V0Qm90dG9tTGVmdCgpIHsNCisgIHJldHVybiBtX2JvdHRvbUxlZnQ7DQorfQ0KK0NCQ19SZXN1bHRQb2ludCogQ0JDX0JvdW5kaW5nQm94OjpnZXRCb3R0b21SaWdodCgpIHsNCisgIHJldHVybiBtX2JvdHRvbVJpZ2h0Ow0KK30NCit2b2lkIENCQ19Cb3VuZGluZ0JveDo6aW5pdChDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIHRvcExlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21MZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogdG9wUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21SaWdodCkgew0KKyAgbV90b3BMZWZ0ID0gTlVMTDsNCisgIG1fYm90dG9tTGVmdCA9IE5VTEw7DQorICBtX3RvcFJpZ2h0ID0gTlVMTDsNCisgIG1fYm90dG9tUmlnaHQgPSBOVUxMOw0KKyAgbV9pbWFnZSA9IGltYWdlOw0KKyAgaWYgKHRvcExlZnQpIHsNCisgICAgbV90b3BMZWZ0ID0gbmV3IENCQ19SZXN1bHRQb2ludCh0b3BMZWZ0LT5HZXRYKCksIHRvcExlZnQtPkdldFkoKSk7DQorICB9DQorICBpZiAoYm90dG9tTGVmdCkgew0KKyAgICBtX2JvdHRvbUxlZnQgPSBuZXcgQ0JDX1Jlc3VsdFBvaW50KGJvdHRvbUxlZnQtPkdldFgoKSwgYm90dG9tTGVmdC0+R2V0WSgpKTsNCisgIH0NCisgIGlmICh0b3BSaWdodCkgew0KKyAgICBtX3RvcFJpZ2h0ID0gbmV3IENCQ19SZXN1bHRQb2ludCh0b3BSaWdodC0+R2V0WCgpLCB0b3BSaWdodC0+R2V0WSgpKTsNCisgIH0NCisgIGlmIChib3R0b21SaWdodCkgew0KKyAgICBtX2JvdHRvbVJpZ2h0ID0NCisgICAgICAgIG5ldyBDQkNfUmVzdWx0UG9pbnQoYm90dG9tUmlnaHQtPkdldFgoKSwgYm90dG9tUmlnaHQtPkdldFkoKSk7DQorICB9DQorICBjYWxjdWxhdGVNaW5NYXhWYWx1ZXMoKTsNCit9DQordm9pZCBDQkNfQm91bmRpbmdCb3g6OmNhbGN1bGF0ZU1pbk1heFZhbHVlcygpIHsNCisgIGlmIChtX3RvcExlZnQgPT0gTlVMTCkgew0KKyAgICBtX3RvcExlZnQgPSBuZXcgQ0JDX1Jlc3VsdFBvaW50KDAsIG1fdG9wUmlnaHQtPkdldFkoKSk7DQorICAgIG1fYm90dG9tTGVmdCA9IG5ldyBDQkNfUmVzdWx0UG9pbnQoMCwgbV9ib3R0b21SaWdodC0+R2V0WSgpKTsNCisgIH0gZWxzZSBpZiAobV90b3BSaWdodCA9PSBOVUxMKSB7DQorICAgIG1fdG9wUmlnaHQgPSBuZXcgQ0JDX1Jlc3VsdFBvaW50KChGWF9GTE9BVCltX2ltYWdlLT5HZXRXaWR0aCgpIC0gMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKW1fdG9wTGVmdC0+R2V0WSgpKTsNCisgICAgbV9ib3R0b21SaWdodCA9IG5ldyBDQkNfUmVzdWx0UG9pbnQoKEZYX0ZMT0FUKW1faW1hZ2UtPkdldFdpZHRoKCkgLSAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpbV9ib3R0b21MZWZ0LT5HZXRZKCkpOw0KKyAgfQ0KKyAgbV9taW5YID0gKGludDMyX3QpKG1fdG9wTGVmdC0+R2V0WCgpIDwgbV9ib3R0b21MZWZ0LT5HZXRYKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgPyBtX3RvcExlZnQtPkdldFgoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICA6IG1fYm90dG9tTGVmdC0+R2V0WCgpKTsNCisgIG1fbWF4WCA9IChpbnQzMl90KShtX3RvcFJpZ2h0LT5HZXRYKCkgPiBtX2JvdHRvbVJpZ2h0LT5HZXRYKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgPyBtX3RvcFJpZ2h0LT5HZXRYKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX2JvdHRvbVJpZ2h0LT5HZXRYKCkpOw0KKyAgbV9taW5ZID0NCisgICAgICAoaW50MzJfdCkobV90b3BMZWZ0LT5HZXRZKCkgPCBtX3RvcFJpZ2h0LT5HZXRZKCkgPyBtX3RvcExlZnQtPkdldFkoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1fdG9wUmlnaHQtPkdldFkoKSk7DQorICBtX21heFkgPSAoaW50MzJfdCkobV9ib3R0b21MZWZ0LT5HZXRZKCkgPiBtX2JvdHRvbVJpZ2h0LT5HZXRZKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgPyBtX2JvdHRvbUxlZnQtPkdldFkoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICA6IG1fYm90dG9tUmlnaHQtPkdldFkoKSk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCb3VuZGluZ0JveC5oIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JvdW5kaW5nQm94LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFlYThhMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCb3VuZGluZ0JveC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfQk9VTkRJTkdCT1hfSF8NCisjZGVmaW5lIF9CQ19CT1VORElOR0JPWF9IXw0KK2NsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQorY2xhc3MgQ0JDX1Jlc3VsdFBvaW50Ow0KK2NsYXNzIENCQ19Cb3VuZGluZ0JveCB7DQorIHB1YmxpYzoNCisgIENCQ19Cb3VuZGluZ0JveChDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSwNCisgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIHRvcExlZnQsDQorICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21MZWZ0LA0KKyAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogdG9wUmlnaHQsDQorICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21SaWdodCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIENCQ19Cb3VuZGluZ0JveChDQkNfQm91bmRpbmdCb3gqIGJvdW5kaW5nQm94KTsNCisgIHZpcnR1YWwgfkNCQ19Cb3VuZGluZ0JveCgpOw0KKyAgc3RhdGljIENCQ19Cb3VuZGluZ0JveCogbWVyZ2UoQ0JDX0JvdW5kaW5nQm94KiBsZWZ0Qm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0JvdW5kaW5nQm94KiByaWdodEJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgQ0JDX0JvdW5kaW5nQm94KiBhZGRNaXNzaW5nUm93cyhpbnQzMl90IG1pc3NpbmdTdGFydFJvd3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWlzc2luZ0VuZFJvd3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNMZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHZvaWQgc2V0VG9wUmlnaHQoQ0JDX1Jlc3VsdFBvaW50IHRvcFJpZ2h0KTsNCisgIHZvaWQgc2V0Qm90dG9tUmlnaHQoQ0JDX1Jlc3VsdFBvaW50IGJvdHRvbVJpZ2h0KTsNCisgIGludDMyX3QgZ2V0TWluWCgpOw0KKyAgaW50MzJfdCBnZXRNYXhYKCk7DQorICBpbnQzMl90IGdldE1pblkoKTsNCisgIGludDMyX3QgZ2V0TWF4WSgpOw0KKyAgQ0JDX1Jlc3VsdFBvaW50KiBnZXRUb3BMZWZ0KCk7DQorICBDQkNfUmVzdWx0UG9pbnQqIGdldFRvcFJpZ2h0KCk7DQorICBDQkNfUmVzdWx0UG9pbnQqIGdldEJvdHRvbUxlZnQoKTsNCisgIENCQ19SZXN1bHRQb2ludCogZ2V0Qm90dG9tUmlnaHQoKTsNCisNCisgcHJpdmF0ZToNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIG1faW1hZ2U7DQorICBDQkNfUmVzdWx0UG9pbnQqIG1fdG9wTGVmdDsNCisgIENCQ19SZXN1bHRQb2ludCogbV9ib3R0b21MZWZ0Ow0KKyAgQ0JDX1Jlc3VsdFBvaW50KiBtX3RvcFJpZ2h0Ow0KKyAgQ0JDX1Jlc3VsdFBvaW50KiBtX2JvdHRvbVJpZ2h0Ow0KKyAgaW50MzJfdCBtX21pblg7DQorICBpbnQzMl90IG1fbWF4WDsNCisgIGludDMyX3QgbV9taW5ZOw0KKyAgaW50MzJfdCBtX21heFk7DQorICB2b2lkIGluaXQoQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsDQorICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiB0b3BMZWZ0LA0KKyAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogYm90dG9tTGVmdCwNCisgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIHRvcFJpZ2h0LA0KKyAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogYm90dG9tUmlnaHQpOw0KKyAgdm9pZCBjYWxjdWxhdGVNaW5NYXhWYWx1ZXMoKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb2Rld29yZC5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29kZXdvcmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MzU5MWIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29kZXdvcmQuY3BwCkBAIC0wLDAgKzEsNzAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMTMgWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdDb2Rld29yZC5oIg0KK2ludDMyX3QgQ0JDX0NvZGV3b3JkOjpCQVJDT0RFX1JPV19VTktOT1dOID0gLTE7DQorQ0JDX0NvZGV3b3JkOjpDQkNfQ29kZXdvcmQoaW50MzJfdCBzdGFydFgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlbmRYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYnVja2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY3ZhbHVlKSB7DQorICBtX3N0YXJ0WCA9IHN0YXJ0WDsNCisgIG1fZW5kWCA9IGVuZFg7DQorICBtX2J1Y2tldCA9IGJ1Y2tldDsNCisgIG1fdmFsdWUgPSBjdmFsdWU7DQorICBtX3Jvd051bWJlciA9IEJBUkNPREVfUk9XX1VOS05PV047DQorfQ0KK0NCQ19Db2Rld29yZDo6fkNCQ19Db2Rld29yZCgpIHt9DQorRlhfQk9PTCBDQkNfQ29kZXdvcmQ6Omhhc1ZhbGlkUm93TnVtYmVyKCkgew0KKyAgcmV0dXJuIGlzVmFsaWRSb3dOdW1iZXIobV9yb3dOdW1iZXIpOw0KK30NCitGWF9CT09MIENCQ19Db2Rld29yZDo6aXNWYWxpZFJvd051bWJlcihpbnQzMl90IHJvd051bWJlcikgew0KKyAgcmV0dXJuIG1fcm93TnVtYmVyICE9IEJBUkNPREVfUk9XX1VOS05PV04gJiYNCisgICAgICAgICBtX2J1Y2tldCA9PSAobV9yb3dOdW1iZXIgJSAzKSAqIDM7DQorfQ0KK3ZvaWQgQ0JDX0NvZGV3b3JkOjpzZXRSb3dOdW1iZXJBc1Jvd0luZGljYXRvckNvbHVtbigpIHsNCisgIG1fcm93TnVtYmVyID0gKG1fdmFsdWUgLyAzMCkgKiAzICsgbV9idWNrZXQgLyAzOw0KK30NCitpbnQzMl90IENCQ19Db2Rld29yZDo6Z2V0V2lkdGgoKSB7DQorICByZXR1cm4gbV9lbmRYIC0gbV9zdGFydFg7DQorfQ0KK2ludDMyX3QgQ0JDX0NvZGV3b3JkOjpnZXRTdGFydFgoKSB7DQorICByZXR1cm4gbV9zdGFydFg7DQorfQ0KK2ludDMyX3QgQ0JDX0NvZGV3b3JkOjpnZXRFbmRYKCkgew0KKyAgcmV0dXJuIG1fZW5kWDsNCit9DQoraW50MzJfdCBDQkNfQ29kZXdvcmQ6OmdldEJ1Y2tldCgpIHsNCisgIHJldHVybiBtX2J1Y2tldDsNCit9DQoraW50MzJfdCBDQkNfQ29kZXdvcmQ6OmdldFZhbHVlKCkgew0KKyAgcmV0dXJuIG1fdmFsdWU7DQorfQ0KK2ludDMyX3QgQ0JDX0NvZGV3b3JkOjpnZXRSb3dOdW1iZXIoKSB7DQorICByZXR1cm4gbV9yb3dOdW1iZXI7DQorfQ0KK3ZvaWQgQ0JDX0NvZGV3b3JkOjpzZXRSb3dOdW1iZXIoaW50MzJfdCByb3dOdW1iZXIpIHsNCisgIG1fcm93TnVtYmVyID0gcm93TnVtYmVyOw0KK30NCitDRlhfQnl0ZVN0cmluZyBDQkNfQ29kZXdvcmQ6OnRvU3RyaW5nKCkgew0KKyAgcmV0dXJuIG1fcm93TnVtYmVyICsgKEZYX0NIQVIpJ3wnICsgbV92YWx1ZTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvZGV3b3JkLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29kZXdvcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzJkMDhiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvZGV3b3JkLmgKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19DT0RFV09SRF9IXw0KKyNkZWZpbmUgX0JDX0NPREVXT1JEX0hfDQorY2xhc3MgQ0JDX0NvZGV3b3JkIHsNCisgcHVibGljOg0KKyAgQ0JDX0NvZGV3b3JkKGludDMyX3Qgc3RhcnRYLCBpbnQzMl90IGVuZFgsIGludDMyX3QgYnVja2V0LCBpbnQzMl90IHZhbHVlKTsNCisgIHZpcnR1YWwgfkNCQ19Db2Rld29yZCgpOw0KKyAgRlhfQk9PTCBoYXNWYWxpZFJvd051bWJlcigpOw0KKyAgRlhfQk9PTCBpc1ZhbGlkUm93TnVtYmVyKGludDMyX3Qgcm93TnVtYmVyKTsNCisgIHZvaWQgc2V0Um93TnVtYmVyQXNSb3dJbmRpY2F0b3JDb2x1bW4oKTsNCisgIGludDMyX3QgZ2V0V2lkdGgoKTsNCisgIGludDMyX3QgZ2V0U3RhcnRYKCk7DQorICBpbnQzMl90IGdldEVuZFgoKTsNCisgIGludDMyX3QgZ2V0QnVja2V0KCk7DQorICBpbnQzMl90IGdldFZhbHVlKCk7DQorICBpbnQzMl90IGdldFJvd051bWJlcigpOw0KKyAgdm9pZCBzZXRSb3dOdW1iZXIoaW50MzJfdCByb3dOdW1iZXIpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgdG9TdHJpbmcoKTsNCisNCisgcHJpdmF0ZToNCisgIHN0YXRpYyBpbnQzMl90IEJBUkNPREVfUk9XX1VOS05PV047DQorICBpbnQzMl90IG1fc3RhcnRYOw0KKyAgaW50MzJfdCBtX2VuZFg7DQorICBpbnQzMl90IG1fYnVja2V0Ow0KKyAgaW50MzJfdCBtX3ZhbHVlOw0KKyAgaW50MzJfdCBtX3Jvd051bWJlcjsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb2Rld29yZERlY29kZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc4NDBiZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb2Rld29yZERlY29kZXIuY3BwCkBAIC0wLDAgKzEsMTE0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDEzIFpYaW5nIGF1dGhvcnMNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAiQkNfUERGNDE3Q29tbW9uLmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0NvZGV3b3JkRGVjb2Rlci5oIg0KKyNkZWZpbmUgU1lNQk9MX1RBQkxFX0xlbmd0aCAyNzg3DQorI2RlZmluZSBGbG9hdF9NQVhfVkFMVUUgMjE0NzQ4MzY0Nw0KK0ZYX0ZMT0FUIENCQ19QREY0MTdDb2Rld29yZERlY29kZXI6OlJBVElPU19UQUJMRVsyNzg3XVs4XSA9IHt7MH19Ow0KK0NCQ19QREY0MTdDb2Rld29yZERlY29kZXI6OkNCQ19QREY0MTdDb2Rld29yZERlY29kZXIoKSB7fQ0KK0NCQ19QREY0MTdDb2Rld29yZERlY29kZXI6On5DQkNfUERGNDE3Q29kZXdvcmREZWNvZGVyKCkge30NCit2b2lkIENCQ19QREY0MTdDb2Rld29yZERlY29kZXI6OkluaXRpYWxpemUoKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBTWU1CT0xfVEFCTEVfTGVuZ3RoOyBpKyspIHsNCisgICAgaW50MzJfdCBjdXJyZW50U3ltYm9sID0gQ0JDX1BERjQxN0NvbW1vbjo6U1lNQk9MX1RBQkxFW2ldOw0KKyAgICBpbnQzMl90IGN1cnJlbnRCaXQgPSBjdXJyZW50U3ltYm9sICYgMHgxOw0KKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBDQkNfUERGNDE3Q29tbW9uOjpCQVJTX0lOX01PRFVMRTsgaisrKSB7DQorICAgICAgRlhfRkxPQVQgc2l6ZSA9IDAuMGY7DQorICAgICAgd2hpbGUgKChjdXJyZW50U3ltYm9sICYgMHgxKSA9PSBjdXJyZW50Qml0KSB7DQorICAgICAgICBzaXplICs9IDEuMGY7DQorICAgICAgICBjdXJyZW50U3ltYm9sID4+PSAxOw0KKyAgICAgIH0NCisgICAgICBjdXJyZW50Qml0ID0gY3VycmVudFN5bWJvbCAmIDB4MTsNCisgICAgICBSQVRJT1NfVEFCTEVbaV1bQ0JDX1BERjQxN0NvbW1vbjo6QkFSU19JTl9NT0RVTEUgLSBqIC0gMV0gPQ0KKyAgICAgICAgICBzaXplIC8gQ0JDX1BERjQxN0NvbW1vbjo6TU9EVUxFU19JTl9DT0RFV09SRDsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENCQ19QREY0MTdDb2Rld29yZERlY29kZXI6OkZpbmFsaXplKCkge30NCitpbnQzMl90IENCQ19QREY0MTdDb2Rld29yZERlY29kZXI6OmdldERlY29kZWRWYWx1ZSgNCisgICAgQ0ZYX0ludDMyQXJyYXkmIG1vZHVsZUJpdENvdW50KSB7DQorICBDRlhfSW50MzJBcnJheSogYXJyYXkgPSBzYW1wbGVCaXRDb3VudHMobW9kdWxlQml0Q291bnQpOw0KKyAgaW50MzJfdCBkZWNvZGVkVmFsdWUgPSBnZXREZWNvZGVkQ29kZXdvcmRWYWx1ZSgqYXJyYXkpOw0KKyAgZGVsZXRlIGFycmF5Ow0KKyAgaWYgKGRlY29kZWRWYWx1ZSAhPSAtMSkgew0KKyAgICByZXR1cm4gZGVjb2RlZFZhbHVlOw0KKyAgfQ0KKyAgcmV0dXJuIGdldENsb3Nlc3REZWNvZGVkVmFsdWUobW9kdWxlQml0Q291bnQpOw0KK30NCitDRlhfSW50MzJBcnJheSogQ0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlcjo6c2FtcGxlQml0Q291bnRzKA0KKyAgICBDRlhfSW50MzJBcnJheSYgbW9kdWxlQml0Q291bnQpIHsNCisgIEZYX0ZMT0FUIGJpdENvdW50U3VtID0NCisgICAgICAoRlhfRkxPQVQpQ0JDX1BERjQxN0NvbW1vbjo6Z2V0Qml0Q291bnRTdW0obW9kdWxlQml0Q291bnQpOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIGJpdENvdW50ID0gbmV3IENGWF9JbnQzMkFycmF5KCk7DQorICBiaXRDb3VudC0+U2V0U2l6ZShDQkNfUERGNDE3Q29tbW9uOjpCQVJTX0lOX01PRFVMRSk7DQorICBpbnQzMl90IGJpdENvdW50SW5kZXggPSAwOw0KKyAgaW50MzJfdCBzdW1QcmV2aW91c0JpdHMgPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgQ0JDX1BERjQxN0NvbW1vbjo6TU9EVUxFU19JTl9DT0RFV09SRDsgaSsrKSB7DQorICAgIEZYX0ZMT0FUIHNhbXBsZUluZGV4ID0NCisgICAgICAgIGJpdENvdW50U3VtIC8gKDIgKiBDQkNfUERGNDE3Q29tbW9uOjpNT0RVTEVTX0lOX0NPREVXT1JEKSArDQorICAgICAgICAoaSAqIGJpdENvdW50U3VtKSAvIENCQ19QREY0MTdDb21tb246Ok1PRFVMRVNfSU5fQ09ERVdPUkQ7DQorICAgIGlmIChzdW1QcmV2aW91c0JpdHMgKyBtb2R1bGVCaXRDb3VudC5HZXRBdChiaXRDb3VudEluZGV4KSA8PSBzYW1wbGVJbmRleCkgew0KKyAgICAgIHN1bVByZXZpb3VzQml0cyArPSBtb2R1bGVCaXRDb3VudC5HZXRBdChiaXRDb3VudEluZGV4KTsNCisgICAgICBiaXRDb3VudEluZGV4Kys7DQorICAgIH0NCisgICAgYml0Q291bnQtPlNldEF0KGJpdENvdW50SW5kZXgsIGJpdENvdW50LT5HZXRBdChiaXRDb3VudEluZGV4KSArIDEpOw0KKyAgfQ0KKyAgcmV0dXJuIGJpdENvdW50Ow0KK30NCitpbnQzMl90IENCQ19QREY0MTdDb2Rld29yZERlY29kZXI6OmdldERlY29kZWRDb2Rld29yZFZhbHVlKA0KKyAgICBDRlhfSW50MzJBcnJheSYgbW9kdWxlQml0Q291bnQpIHsNCisgIGludDMyX3QgZGVjb2RlZFZhbHVlID0gZ2V0Qml0VmFsdWUobW9kdWxlQml0Q291bnQpOw0KKyAgcmV0dXJuIENCQ19QREY0MTdDb21tb246OmdldENvZGV3b3JkKGRlY29kZWRWYWx1ZSkgPT0gLTEgPyAtMSA6IGRlY29kZWRWYWx1ZTsNCit9DQoraW50MzJfdCBDQkNfUERGNDE3Q29kZXdvcmREZWNvZGVyOjpnZXRCaXRWYWx1ZShDRlhfSW50MzJBcnJheSYgbW9kdWxlQml0Q291bnQpIHsNCisgIGludDY0X3QgcmVzdWx0ID0gMDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1vZHVsZUJpdENvdW50LkdldFNpemUoKTsgaSsrKSB7DQorICAgIGZvciAoaW50MzJfdCBiaXQgPSAwOyBiaXQgPCBtb2R1bGVCaXRDb3VudC5HZXRBdChpKTsgYml0KyspIHsNCisgICAgICByZXN1bHQgPSAocmVzdWx0IDw8IDEpIHwgKGkgJSAyID09IDAgPyAxIDogMCk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiAoaW50MzJfdClyZXN1bHQ7DQorfQ0KK2ludDMyX3QgQ0JDX1BERjQxN0NvZGV3b3JkRGVjb2Rlcjo6Z2V0Q2xvc2VzdERlY29kZWRWYWx1ZSgNCisgICAgQ0ZYX0ludDMyQXJyYXkmIG1vZHVsZUJpdENvdW50KSB7DQorICBpbnQzMl90IGJpdENvdW50U3VtID0gQ0JDX1BERjQxN0NvbW1vbjo6Z2V0Qml0Q291bnRTdW0obW9kdWxlQml0Q291bnQpOw0KKyAgQ0ZYX0Zsb2F0QXJyYXkgYml0Q291bnRSYXRpb3M7DQorICBiaXRDb3VudFJhdGlvcy5TZXRTaXplKENCQ19QREY0MTdDb21tb246OkJBUlNfSU5fTU9EVUxFKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGJpdENvdW50UmF0aW9zLkdldFNpemUoKTsgaSsrKSB7DQorICAgIGJpdENvdW50UmF0aW9zW2ldID0gbW9kdWxlQml0Q291bnQuR2V0QXQoaSkgLyAoRlhfRkxPQVQpYml0Q291bnRTdW07DQorICB9DQorICBGWF9GTE9BVCBiZXN0TWF0Y2hFcnJvciA9IChGWF9GTE9BVClGbG9hdF9NQVhfVkFMVUU7DQorICBpbnQzMl90IGJlc3RNYXRjaCA9IC0xOw0KKyAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgU1lNQk9MX1RBQkxFX0xlbmd0aDsgaisrKSB7DQorICAgIEZYX0ZMT0FUIGVycm9yID0gMC4wZjsNCisgICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgQ0JDX1BERjQxN0NvbW1vbjo6QkFSU19JTl9NT0RVTEU7IGsrKykgew0KKyAgICAgIEZYX0ZMT0FUIGRpZmYgPSBSQVRJT1NfVEFCTEVbal1ba10gLSBiaXRDb3VudFJhdGlvc1trXTsNCisgICAgICBlcnJvciArPSBkaWZmICogZGlmZjsNCisgICAgfQ0KKyAgICBpZiAoZXJyb3IgPCBiZXN0TWF0Y2hFcnJvcikgew0KKyAgICAgIGJlc3RNYXRjaEVycm9yID0gZXJyb3I7DQorICAgICAgYmVzdE1hdGNoID0gQ0JDX1BERjQxN0NvbW1vbjo6U1lNQk9MX1RBQkxFW2pdOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gYmVzdE1hdGNoOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29kZXdvcmREZWNvZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29kZXdvcmREZWNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzMWY5MQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb2Rld29yZERlY29kZXIuaApAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1BERjQxN0NPREVXT1JEREVDT0RFUl9IXw0KKyNkZWZpbmUgX0JDX1BERjQxN0NPREVXT1JEREVDT0RFUl9IXw0KK2NsYXNzIENCQ19QREY0MTdDb2Rld29yZERlY29kZXI7DQorI2RlZmluZSBjb2x1bW4gOA0KK2NsYXNzIENCQ19QREY0MTdDb21tb247DQorY2xhc3MgQ0JDX1BERjQxN0NvZGV3b3JkRGVjb2RlciB7DQorIHB1YmxpYzoNCisgIENCQ19QREY0MTdDb2Rld29yZERlY29kZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19QREY0MTdDb2Rld29yZERlY29kZXIoKTsNCisgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsNCisgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7DQorICBzdGF0aWMgaW50MzJfdCBnZXREZWNvZGVkVmFsdWUoQ0ZYX0ludDMyQXJyYXkmIG1vZHVsZUJpdENvdW50KTsNCisNCisgcHJpdmF0ZToNCisgIHN0YXRpYyBGWF9GTE9BVCBSQVRJT1NfVEFCTEVbXVs4XTsNCisgIHN0YXRpYyBDRlhfSW50MzJBcnJheSogc2FtcGxlQml0Q291bnRzKENGWF9JbnQzMkFycmF5JiBtb2R1bGVCaXRDb3VudCk7DQorICBzdGF0aWMgaW50MzJfdCBnZXREZWNvZGVkQ29kZXdvcmRWYWx1ZShDRlhfSW50MzJBcnJheSYgbW9kdWxlQml0Q291bnQpOw0KKyAgc3RhdGljIGludDMyX3QgZ2V0Qml0VmFsdWUoQ0ZYX0ludDMyQXJyYXkmIG1vZHVsZUJpdENvdW50KTsNCisgIHN0YXRpYyBpbnQzMl90IGdldENsb3Nlc3REZWNvZGVkVmFsdWUoQ0ZYX0ludDMyQXJyYXkmIG1vZHVsZUJpdENvdW50KTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb21tb24uY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbW1vbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU5MjI5YQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb21tb24uY3BwCkBAIC0wLDAgKzEsNjUwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDA5IFpYaW5nIGF1dGhvcnMNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAiQkNfUERGNDE3Q29tbW9uLmgiDQoraW50MzJfdCBDQkNfUERGNDE3Q29tbW9uOjpOVU1CRVJfT0ZfQ09ERVdPUkRTID0gOTI5Ow0KK2ludDMyX3QgQ0JDX1BERjQxN0NvbW1vbjo6TUFYX0NPREVXT1JEU19JTl9CQVJDT0RFID0gTlVNQkVSX09GX0NPREVXT1JEUyAtIDE7DQoraW50MzJfdCBDQkNfUERGNDE3Q29tbW9uOjpNSU5fUk9XU19JTl9CQVJDT0RFID0gMzsNCitpbnQzMl90IENCQ19QREY0MTdDb21tb246Ok1BWF9ST1dTX0lOX0JBUkNPREUgPSA5MDsNCitpbnQzMl90IENCQ19QREY0MTdDb21tb246Ok1BWF9DT0RFV09SRFNfSU5fUk9XID0gMzI7DQoraW50MzJfdCBDQkNfUERGNDE3Q29tbW9uOjpNT0RVTEVTX0lOX0NPREVXT1JEID0gMTc7DQoraW50MzJfdCBDQkNfUERGNDE3Q29tbW9uOjpNT0RVTEVTX0lOX1NUT1BfUEFUVEVSTiA9IDE4Ow0KK2ludDMyX3QgQ0JDX1BERjQxN0NvbW1vbjo6QkFSU19JTl9NT0RVTEUgPSA4Ow0KK0NGWF9JbnQzMkFycmF5KiBDQkNfUERGNDE3Q29tbW9uOjpFTVBUWV9JTlRfQVJSQVkgPSBOVUxMOw0KK2ludDMyX3QgQ0JDX1BERjQxN0NvbW1vbjo6U1lNQk9MX1RBQkxFW10gPSB7DQorICAgIDB4MTAyNWUsIDB4MTAyN2EsIDB4MTAyOWUsIDB4MTAyYmMsIDB4MTAyZjIsIDB4MTAyZjQsIDB4MTAzMmUsIDB4MTAzNGUsDQorICAgIDB4MTAzNWMsIDB4MTAzOTYsIDB4MTAzYTYsIDB4MTAzYWMsIDB4MTA0MjIsIDB4MTA0MjgsIDB4MTA0MzYsIDB4MTA0NDIsDQorICAgIDB4MTA0NDQsIDB4MTA0NDgsIDB4MTA0NTAsIDB4MTA0NWUsIDB4MTA0NjYsIDB4MTA0NmMsIDB4MTA0N2EsIDB4MTA0ODIsDQorICAgIDB4MTA0OWUsIDB4MTA0YTAsIDB4MTA0YmMsIDB4MTA0YzYsIDB4MTA0ZDgsIDB4MTA0ZWUsIDB4MTA0ZjIsIDB4MTA0ZjQsDQorICAgIDB4MTA1MDQsIDB4MTA1MDgsIDB4MTA1MTAsIDB4MTA1MWUsIDB4MTA1MjAsIDB4MTA1M2MsIDB4MTA1NDAsIDB4MTA1NzgsDQorICAgIDB4MTA1ODYsIDB4MTA1OGMsIDB4MTA1OTgsIDB4MTA1YjAsIDB4MTA1YmUsIDB4MTA1Y2UsIDB4MTA1ZGMsIDB4MTA1ZTIsDQorICAgIDB4MTA1ZTQsIDB4MTA1ZTgsIDB4MTA1ZjYsIDB4MTA2MmUsIDB4MTA2NGUsIDB4MTA2NWMsIDB4MTA2OGUsIDB4MTA2OWMsDQorICAgIDB4MTA2YjgsIDB4MTA2ZGUsIDB4MTA2ZmEsIDB4MTA3MTYsIDB4MTA3MjYsIDB4MTA3MmMsIDB4MTA3NDYsIDB4MTA3NGMsDQorICAgIDB4MTA3NTgsIDB4MTA3NmUsIDB4MTA3OTIsIDB4MTA3OTQsIDB4MTA3YTIsIDB4MTA3YTQsIDB4MTA3YTgsIDB4MTA3YjYsDQorICAgIDB4MTA4MjIsIDB4MTA4MjgsIDB4MTA4NDIsIDB4MTA4NDgsIDB4MTA4NTAsIDB4MTA4NWUsIDB4MTA4NjYsIDB4MTA4NmMsDQorICAgIDB4MTA4N2EsIDB4MTA4ODIsIDB4MTA4ODQsIDB4MTA4OTAsIDB4MTA4OWUsIDB4MTA4YTAsIDB4MTA4YmMsIDB4MTA4YzYsDQorICAgIDB4MTA4Y2MsIDB4MTA4ZDgsIDB4MTA4ZWUsIDB4MTA4ZjIsIDB4MTA4ZjQsIDB4MTA5MDIsIDB4MTA5MDgsIDB4MTA5MWUsDQorICAgIDB4MTA5MjAsIDB4MTA5M2MsIDB4MTA5NDAsIDB4MTA5NzgsIDB4MTA5ODYsIDB4MTA5OTgsIDB4MTA5YjAsIDB4MTA5YmUsDQorICAgIDB4MTA5Y2UsIDB4MTA5ZGMsIDB4MTA5ZTIsIDB4MTA5ZTQsIDB4MTA5ZTgsIDB4MTA5ZjYsIDB4MTBhMDgsIDB4MTBhMTAsDQorICAgIDB4MTBhMWUsIDB4MTBhMjAsIDB4MTBhM2MsIDB4MTBhNDAsIDB4MTBhNzgsIDB4MTBhZjAsIDB4MTBiMDYsIDB4MTBiMGMsDQorICAgIDB4MTBiMTgsIDB4MTBiMzAsIDB4MTBiM2UsIDB4MTBiNjAsIDB4MTBiN2MsIDB4MTBiOGUsIDB4MTBiOWMsIDB4MTBiYjgsDQorICAgIDB4MTBiYzIsIDB4MTBiYzQsIDB4MTBiYzgsIDB4MTBiZDAsIDB4MTBiZGUsIDB4MTBiZTYsIDB4MTBiZWMsIDB4MTBjMmUsDQorICAgIDB4MTBjNGUsIDB4MTBjNWMsIDB4MTBjNjIsIDB4MTBjNjQsIDB4MTBjNjgsIDB4MTBjNzYsIDB4MTBjOGUsIDB4MTBjOWMsDQorICAgIDB4MTBjYjgsIDB4MTBjYzIsIDB4MTBjYzQsIDB4MTBjYzgsIDB4MTBjZDAsIDB4MTBjZGUsIDB4MTBjZTYsIDB4MTBjZWMsDQorICAgIDB4MTBjZmEsIDB4MTBkMGUsIDB4MTBkMWMsIDB4MTBkMzgsIDB4MTBkNzAsIDB4MTBkN2UsIDB4MTBkODIsIDB4MTBkODQsDQorICAgIDB4MTBkODgsIDB4MTBkOTAsIDB4MTBkOWUsIDB4MTBkYTAsIDB4MTBkYmMsIDB4MTBkYzYsIDB4MTBkY2MsIDB4MTBkZDgsDQorICAgIDB4MTBkZWUsIDB4MTBkZjIsIDB4MTBkZjQsIDB4MTBlMTYsIDB4MTBlMjYsIDB4MTBlMmMsIDB4MTBlNDYsIDB4MTBlNTgsDQorICAgIDB4MTBlNmUsIDB4MTBlODYsIDB4MTBlOGMsIDB4MTBlOTgsIDB4MTBlYjAsIDB4MTBlYmUsIDB4MTBlY2UsIDB4MTBlZGMsDQorICAgIDB4MTBmMGEsIDB4MTBmMTIsIDB4MTBmMTQsIDB4MTBmMjIsIDB4MTBmMjgsIDB4MTBmMzYsIDB4MTBmNDIsIDB4MTBmNDQsDQorICAgIDB4MTBmNDgsIDB4MTBmNTAsIDB4MTBmNWUsIDB4MTBmNjYsIDB4MTBmNmMsIDB4MTBmYjIsIDB4MTBmYjQsIDB4MTEwMjIsDQorICAgIDB4MTEwMjgsIDB4MTEwNDIsIDB4MTEwNDgsIDB4MTEwNTAsIDB4MTEwNWUsIDB4MTEwN2EsIDB4MTEwODIsIDB4MTEwODQsDQorICAgIDB4MTEwOTAsIDB4MTEwOWUsIDB4MTEwYTAsIDB4MTEwYmMsIDB4MTEwYzYsIDB4MTEwY2MsIDB4MTEwZDgsIDB4MTEwZWUsDQorICAgIDB4MTEwZjIsIDB4MTEwZjQsIDB4MTExMDIsIDB4MTExMWUsIDB4MTExMjAsIDB4MTExM2MsIDB4MTExNDAsIDB4MTExNzgsDQorICAgIDB4MTExODYsIDB4MTExOTgsIDB4MTExYjAsIDB4MTExYmUsIDB4MTExY2UsIDB4MTExZGMsIDB4MTExZTIsIDB4MTExZTQsDQorICAgIDB4MTExZTgsIDB4MTExZjYsIDB4MTEyMDgsIDB4MTEyMWUsIDB4MTEyMjAsIDB4MTEyNzgsIDB4MTEyZjAsIDB4MTEzMGMsDQorICAgIDB4MTEzMzAsIDB4MTEzM2UsIDB4MTEzNjAsIDB4MTEzN2MsIDB4MTEzOGUsIDB4MTEzOWMsIDB4MTEzYjgsIDB4MTEzYzIsDQorICAgIDB4MTEzYzgsIDB4MTEzZDAsIDB4MTEzZGUsIDB4MTEzZTYsIDB4MTEzZWMsIDB4MTE0MDgsIDB4MTE0MTAsIDB4MTE0MWUsDQorICAgIDB4MTE0MjAsIDB4MTE0M2MsIDB4MTE0NDAsIDB4MTE0NzgsIDB4MTE0ZjAsIDB4MTE1ZTAsIDB4MTE2MGMsIDB4MTE2MTgsDQorICAgIDB4MTE2MzAsIDB4MTE2M2UsIDB4MTE2NjAsIDB4MTE2N2MsIDB4MTE2YzAsIDB4MTE2ZjgsIDB4MTE3MWMsIDB4MTE3MzgsDQorICAgIDB4MTE3NzAsIDB4MTE3N2UsIDB4MTE3ODIsIDB4MTE3ODQsIDB4MTE3ODgsIDB4MTE3OTAsIDB4MTE3OWUsIDB4MTE3YTAsDQorICAgIDB4MTE3YmMsIDB4MTE3YzYsIDB4MTE3Y2MsIDB4MTE3ZDgsIDB4MTE3ZWUsIDB4MTE4MmUsIDB4MTE4MzQsIDB4MTE4NGUsDQorICAgIDB4MTE4NWMsIDB4MTE4NjIsIDB4MTE4NjQsIDB4MTE4NjgsIDB4MTE4NzYsIDB4MTE4OGUsIDB4MTE4OWMsIDB4MTE4YjgsDQorICAgIDB4MTE4YzIsIDB4MTE4YzgsIDB4MTE4ZDAsIDB4MTE4ZGUsIDB4MTE4ZTYsIDB4MTE4ZWMsIDB4MTE4ZmEsIDB4MTE5MGUsDQorICAgIDB4MTE5MWMsIDB4MTE5MzgsIDB4MTE5NzAsIDB4MTE5N2UsIDB4MTE5ODIsIDB4MTE5ODQsIDB4MTE5OTAsIDB4MTE5OWUsDQorICAgIDB4MTE5YTAsIDB4MTE5YmMsIDB4MTE5YzYsIDB4MTE5Y2MsIDB4MTE5ZDgsIDB4MTE5ZWUsIDB4MTE5ZjIsIDB4MTE5ZjQsDQorICAgIDB4MTFhMGUsIDB4MTFhMWMsIDB4MTFhMzgsIDB4MTFhNzAsIDB4MTFhN2UsIDB4MTFhZTAsIDB4MTFhZmMsIDB4MTFiMDgsDQorICAgIDB4MTFiMTAsIDB4MTFiMWUsIDB4MTFiMjAsIDB4MTFiM2MsIDB4MTFiNDAsIDB4MTFiNzgsIDB4MTFiOGMsIDB4MTFiOTgsDQorICAgIDB4MTFiYjAsIDB4MTFiYmUsIDB4MTFiY2UsIDB4MTFiZGMsIDB4MTFiZTIsIDB4MTFiZTQsIDB4MTFiZTgsIDB4MTFiZjYsDQorICAgIDB4MTFjMTYsIDB4MTFjMjYsIDB4MTFjMmMsIDB4MTFjNDYsIDB4MTFjNGMsIDB4MTFjNTgsIDB4MTFjNmUsIDB4MTFjODYsDQorICAgIDB4MTFjOTgsIDB4MTFjYjAsIDB4MTFjYmUsIDB4MTFjY2UsIDB4MTFjZGMsIDB4MTFjZTIsIDB4MTFjZTQsIDB4MTFjZTgsDQorICAgIDB4MTFjZjYsIDB4MTFkMDYsIDB4MTFkMGMsIDB4MTFkMTgsIDB4MTFkMzAsIDB4MTFkM2UsIDB4MTFkNjAsIDB4MTFkN2MsDQorICAgIDB4MTFkOGUsIDB4MTFkOWMsIDB4MTFkYjgsIDB4MTFkYzQsIDB4MTFkYzgsIDB4MTFkZDAsIDB4MTFkZGUsIDB4MTFkZTYsDQorICAgIDB4MTFkZWMsIDB4MTFkZmEsIDB4MTFlMGEsIDB4MTFlMTIsIDB4MTFlMTQsIDB4MTFlMjIsIDB4MTFlMjQsIDB4MTFlMjgsDQorICAgIDB4MTFlMzYsIDB4MTFlNDIsIDB4MTFlNDQsIDB4MTFlNTAsIDB4MTFlNWUsIDB4MTFlNjYsIDB4MTFlNmMsIDB4MTFlODIsDQorICAgIDB4MTFlODQsIDB4MTFlODgsIDB4MTFlOTAsIDB4MTFlOWUsIDB4MTFlYTAsIDB4MTFlYmMsIDB4MTFlYzYsIDB4MTFlY2MsDQorICAgIDB4MTFlZDgsIDB4MTFlZWUsIDB4MTFmMWEsIDB4MTFmMmUsIDB4MTFmMzIsIDB4MTFmMzQsIDB4MTFmNGUsIDB4MTFmNWMsDQorICAgIDB4MTFmNjIsIDB4MTFmNjQsIDB4MTFmNjgsIDB4MTFmNzYsIDB4MTIwNDgsIDB4MTIwNWUsIDB4MTIwODIsIDB4MTIwODQsDQorICAgIDB4MTIwOTAsIDB4MTIwOWUsIDB4MTIwYTAsIDB4MTIwYmMsIDB4MTIwZDgsIDB4MTIwZjIsIDB4MTIwZjQsIDB4MTIxMDgsDQorICAgIDB4MTIxMWUsIDB4MTIxMjAsIDB4MTIxM2MsIDB4MTIxNDAsIDB4MTIxNzgsIDB4MTIxODYsIDB4MTIxOTgsIDB4MTIxYjAsDQorICAgIDB4MTIxYmUsIDB4MTIxZTIsIDB4MTIxZTQsIDB4MTIxZTgsIDB4MTIxZjYsIDB4MTIyMDQsIDB4MTIyMTAsIDB4MTIyMWUsDQorICAgIDB4MTIyMjAsIDB4MTIyNzgsIDB4MTIyZjAsIDB4MTIzMDYsIDB4MTIzMGMsIDB4MTIzMzAsIDB4MTIzM2UsIDB4MTIzNjAsDQorICAgIDB4MTIzN2MsIDB4MTIzOGUsIDB4MTIzOWMsIDB4MTIzYjgsIDB4MTIzYzIsIDB4MTIzYzgsIDB4MTIzZDAsIDB4MTIzZTYsDQorICAgIDB4MTIzZWMsIDB4MTI0MWUsIDB4MTI0MjAsIDB4MTI0M2MsIDB4MTI0ZjAsIDB4MTI1ZTAsIDB4MTI2MTgsIDB4MTI2M2UsDQorICAgIDB4MTI2NjAsIDB4MTI2N2MsIDB4MTI2YzAsIDB4MTI2ZjgsIDB4MTI3MzgsIDB4MTI3NzAsIDB4MTI3N2UsIDB4MTI3ODIsDQorICAgIDB4MTI3ODQsIDB4MTI3OTAsIDB4MTI3OWUsIDB4MTI3YTAsIDB4MTI3YmMsIDB4MTI3YzYsIDB4MTI3Y2MsIDB4MTI3ZDgsDQorICAgIDB4MTI3ZWUsIDB4MTI4MjAsIDB4MTI4M2MsIDB4MTI4NDAsIDB4MTI4NzgsIDB4MTI4ZjAsIDB4MTI5ZTAsIDB4MTJiYzAsDQorICAgIDB4MTJjMTgsIDB4MTJjMzAsIDB4MTJjM2UsIDB4MTJjNjAsIDB4MTJjN2MsIDB4MTJjYzAsIDB4MTJjZjgsIDB4MTJkZjAsDQorICAgIDB4MTJlMWMsIDB4MTJlMzgsIDB4MTJlNzAsIDB4MTJlN2UsIDB4MTJlZTAsIDB4MTJlZmMsIDB4MTJmMDQsIDB4MTJmMDgsDQorICAgIDB4MTJmMTAsIDB4MTJmMjAsIDB4MTJmM2MsIDB4MTJmNDAsIDB4MTJmNzgsIDB4MTJmODYsIDB4MTJmOGMsIDB4MTJmOTgsDQorICAgIDB4MTJmYjAsIDB4MTJmYmUsIDB4MTJmY2UsIDB4MTJmZGMsIDB4MTMwMmUsIDB4MTMwNGUsIDB4MTMwNWMsIDB4MTMwNjIsDQorICAgIDB4MTMwNjgsIDB4MTMwOGUsIDB4MTMwOWMsIDB4MTMwYjgsIDB4MTMwYzIsIDB4MTMwYzgsIDB4MTMwZDAsIDB4MTMwZGUsDQorICAgIDB4MTMwZWMsIDB4MTMwZmEsIDB4MTMxMGUsIDB4MTMxMzgsIDB4MTMxNzAsIDB4MTMxN2UsIDB4MTMxODIsIDB4MTMxODQsDQorICAgIDB4MTMxOTAsIDB4MTMxOWUsIDB4MTMxYTAsIDB4MTMxYmMsIDB4MTMxYzYsIDB4MTMxY2MsIDB4MTMxZDgsIDB4MTMxZjIsDQorICAgIDB4MTMxZjQsIDB4MTMyMGUsIDB4MTMyMWMsIDB4MTMyNzAsIDB4MTMyN2UsIDB4MTMyZTAsIDB4MTMyZmMsIDB4MTMzMDgsDQorICAgIDB4MTMzMWUsIDB4MTMzMjAsIDB4MTMzM2MsIDB4MTMzNDAsIDB4MTMzNzgsIDB4MTMzODYsIDB4MTMzOTgsIDB4MTMzYjAsDQorICAgIDB4MTMzYmUsIDB4MTMzY2UsIDB4MTMzZGMsIDB4MTMzZTIsIDB4MTMzZTQsIDB4MTMzZTgsIDB4MTMzZjYsIDB4MTM0MGUsDQorICAgIDB4MTM0MWMsIDB4MTM0MzgsIDB4MTM0NzAsIDB4MTM0N2UsIDB4MTM0ZTAsIDB4MTM0ZmMsIDB4MTM1YzAsIDB4MTM1ZjgsDQorICAgIDB4MTM2MDgsIDB4MTM2MTAsIDB4MTM2MWUsIDB4MTM2MjAsIDB4MTM2M2MsIDB4MTM2NDAsIDB4MTM2NzgsIDB4MTM2ZjAsDQorICAgIDB4MTM3MGMsIDB4MTM3MTgsIDB4MTM3MzAsIDB4MTM3M2UsIDB4MTM3NjAsIDB4MTM3N2MsIDB4MTM3OWMsIDB4MTM3YjgsDQorICAgIDB4MTM3YzIsIDB4MTM3YzQsIDB4MTM3YzgsIDB4MTM3ZDAsIDB4MTM3ZGUsIDB4MTM3ZTYsIDB4MTM3ZWMsIDB4MTM4MTYsDQorICAgIDB4MTM4MjYsIDB4MTM4MmMsIDB4MTM4NDYsIDB4MTM4NGMsIDB4MTM4NTgsIDB4MTM4NmUsIDB4MTM4NzQsIDB4MTM4ODYsDQorICAgIDB4MTM4OTgsIDB4MTM4YjAsIDB4MTM4YmUsIDB4MTM4Y2UsIDB4MTM4ZGMsIDB4MTM4ZTIsIDB4MTM4ZTQsIDB4MTM4ZTgsDQorICAgIDB4MTM5MDYsIDB4MTM5MGMsIDB4MTM5MzAsIDB4MTM5M2UsIDB4MTM5NjAsIDB4MTM5N2MsIDB4MTM5OGUsIDB4MTM5OWMsDQorICAgIDB4MTM5YjgsIDB4MTM5YzgsIDB4MTM5ZDAsIDB4MTM5ZGUsIDB4MTM5ZTYsIDB4MTM5ZWMsIDB4MTM5ZmEsIDB4MTNhMDYsDQorICAgIDB4MTNhMGMsIDB4MTNhMTgsIDB4MTNhMzAsIDB4MTNhM2UsIDB4MTNhNjAsIDB4MTNhN2MsIDB4MTNhYzAsIDB4MTNhZjgsDQorICAgIDB4MTNiMGUsIDB4MTNiMWMsIDB4MTNiMzgsIDB4MTNiNzAsIDB4MTNiN2UsIDB4MTNiODgsIDB4MTNiOTAsIDB4MTNiOWUsDQorICAgIDB4MTNiYTAsIDB4MTNiYmMsIDB4MTNiY2MsIDB4MTNiZDgsIDB4MTNiZWUsIDB4MTNiZjIsIDB4MTNiZjQsIDB4MTNjMTIsDQorICAgIDB4MTNjMTQsIDB4MTNjMjIsIDB4MTNjMjQsIDB4MTNjMjgsIDB4MTNjMzYsIDB4MTNjNDIsIDB4MTNjNDgsIDB4MTNjNTAsDQorICAgIDB4MTNjNWUsIDB4MTNjNjYsIDB4MTNjNmMsIDB4MTNjODIsIDB4MTNjODQsIDB4MTNjOTAsIDB4MTNjOWUsIDB4MTNjYTAsDQorICAgIDB4MTNjYmMsIDB4MTNjYzYsIDB4MTNjY2MsIDB4MTNjZDgsIDB4MTNjZWUsIDB4MTNkMDIsIDB4MTNkMDQsIDB4MTNkMDgsDQorICAgIDB4MTNkMTAsIDB4MTNkMWUsIDB4MTNkMjAsIDB4MTNkM2MsIDB4MTNkNDAsIDB4MTNkNzgsIDB4MTNkODYsIDB4MTNkOGMsDQorICAgIDB4MTNkOTgsIDB4MTNkYjAsIDB4MTNkYmUsIDB4MTNkY2UsIDB4MTNkZGMsIDB4MTNkZTQsIDB4MTNkZTgsIDB4MTNkZjYsDQorICAgIDB4MTNlMWEsIDB4MTNlMmUsIDB4MTNlMzIsIDB4MTNlMzQsIDB4MTNlNGUsIDB4MTNlNWMsIDB4MTNlNjIsIDB4MTNlNjQsDQorICAgIDB4MTNlNjgsIDB4MTNlNzYsIDB4MTNlOGUsIDB4MTNlOWMsIDB4MTNlYjgsIDB4MTNlYzIsIDB4MTNlYzQsIDB4MTNlYzgsDQorICAgIDB4MTNlZDAsIDB4MTNlZGUsIDB4MTNlZTYsIDB4MTNlZWMsIDB4MTNmMjYsIDB4MTNmMmMsIDB4MTNmM2EsIDB4MTNmNDYsDQorICAgIDB4MTNmNGMsIDB4MTNmNTgsIDB4MTNmNmUsIDB4MTNmNzIsIDB4MTNmNzQsIDB4MTQwODIsIDB4MTQwOWUsIDB4MTQwYTAsDQorICAgIDB4MTQwYmMsIDB4MTQxMDQsIDB4MTQxMDgsIDB4MTQxMTAsIDB4MTQxMWUsIDB4MTQxMjAsIDB4MTQxM2MsIDB4MTQxNDAsDQorICAgIDB4MTQxNzgsIDB4MTQxOGMsIDB4MTQxOTgsIDB4MTQxYjAsIDB4MTQxYmUsIDB4MTQxZTIsIDB4MTQxZTQsIDB4MTQxZTgsDQorICAgIDB4MTQyMDgsIDB4MTQyMTAsIDB4MTQyMWUsIDB4MTQyMjAsIDB4MTQyM2MsIDB4MTQyNDAsIDB4MTQyNzgsIDB4MTQyZjAsDQorICAgIDB4MTQzMDYsIDB4MTQzMGMsIDB4MTQzMTgsIDB4MTQzMzAsIDB4MTQzM2UsIDB4MTQzNjAsIDB4MTQzN2MsIDB4MTQzOGUsDQorICAgIDB4MTQzYzIsIDB4MTQzYzQsIDB4MTQzYzgsIDB4MTQzZDAsIDB4MTQzZTYsIDB4MTQzZWMsIDB4MTQ0MDgsIDB4MTQ0MTAsDQorICAgIDB4MTQ0MWUsIDB4MTQ0MjAsIDB4MTQ0M2MsIDB4MTQ0NDAsIDB4MTQ0NzgsIDB4MTQ0ZjAsIDB4MTQ1ZTAsIDB4MTQ2MGMsDQorICAgIDB4MTQ2MTgsIDB4MTQ2MzAsIDB4MTQ2M2UsIDB4MTQ2NjAsIDB4MTQ2N2MsIDB4MTQ2YzAsIDB4MTQ2ZjgsIDB4MTQ3MWMsDQorICAgIDB4MTQ3MzgsIDB4MTQ3NzAsIDB4MTQ3N2UsIDB4MTQ3ODIsIDB4MTQ3ODQsIDB4MTQ3ODgsIDB4MTQ3OTAsIDB4MTQ3YTAsDQorICAgIDB4MTQ3YmMsIDB4MTQ3YzYsIDB4MTQ3Y2MsIDB4MTQ3ZDgsIDB4MTQ3ZWUsIDB4MTQ4MTAsIDB4MTQ4MjAsIDB4MTQ4M2MsDQorICAgIDB4MTQ4NDAsIDB4MTQ4NzgsIDB4MTQ4ZjAsIDB4MTQ5ZTAsIDB4MTRiYzAsIDB4MTRjMzAsIDB4MTRjM2UsIDB4MTRjNjAsDQorICAgIDB4MTRjN2MsIDB4MTRjYzAsIDB4MTRjZjgsIDB4MTRkZjAsIDB4MTRlMzgsIDB4MTRlNzAsIDB4MTRlN2UsIDB4MTRlZTAsDQorICAgIDB4MTRlZmMsIDB4MTRmMDQsIDB4MTRmMDgsIDB4MTRmMTAsIDB4MTRmMWUsIDB4MTRmMjAsIDB4MTRmM2MsIDB4MTRmNDAsDQorICAgIDB4MTRmNzgsIDB4MTRmODYsIDB4MTRmOGMsIDB4MTRmOTgsIDB4MTRmYjAsIDB4MTRmY2UsIDB4MTRmZGMsIDB4MTUwMjAsDQorICAgIDB4MTUwNDAsIDB4MTUwNzgsIDB4MTUwZjAsIDB4MTUxZTAsIDB4MTUzYzAsIDB4MTU4NjAsIDB4MTU4N2MsIDB4MTU4YzAsDQorICAgIDB4MTU4ZjgsIDB4MTU5ZjAsIDB4MTViZTAsIDB4MTVjNzAsIDB4MTVjN2UsIDB4MTVjZTAsIDB4MTVjZmMsIDB4MTVkYzAsDQorICAgIDB4MTVkZjgsIDB4MTVlMDgsIDB4MTVlMTAsIDB4MTVlMjAsIDB4MTVlNDAsIDB4MTVlNzgsIDB4MTVlZjAsIDB4MTVmMGMsDQorICAgIDB4MTVmMTgsIDB4MTVmMzAsIDB4MTVmNjAsIDB4MTVmN2MsIDB4MTVmOGUsIDB4MTVmOWMsIDB4MTVmYjgsIDB4MTYwNGUsDQorICAgIDB4MTYwNWMsIDB4MTYwOGUsIDB4MTYwOWMsIDB4MTYwYjgsIDB4MTYwYzIsIDB4MTYwYzQsIDB4MTYwYzgsIDB4MTYwZGUsDQorICAgIDB4MTYxMGUsIDB4MTYxMWMsIDB4MTYxMzgsIDB4MTYxNzAsIDB4MTYxN2UsIDB4MTYxODQsIDB4MTYxODgsIDB4MTYxOTAsDQorICAgIDB4MTYxOWUsIDB4MTYxYTAsIDB4MTYxYmMsIDB4MTYxYzYsIDB4MTYxY2MsIDB4MTYxZDgsIDB4MTYxZjIsIDB4MTYxZjQsDQorICAgIDB4MTYyMGUsIDB4MTYyMWMsIDB4MTYyMzgsIDB4MTYyNzAsIDB4MTYyN2UsIDB4MTYyZTAsIDB4MTYyZmMsIDB4MTYzMDQsDQorICAgIDB4MTYzMDgsIDB4MTYzMTAsIDB4MTYzMWUsIDB4MTYzMjAsIDB4MTYzM2MsIDB4MTYzNDAsIDB4MTYzNzgsIDB4MTYzODYsDQorICAgIDB4MTYzOGMsIDB4MTYzOTgsIDB4MTYzYjAsIDB4MTYzYmUsIDB4MTYzY2UsIDB4MTYzZGMsIDB4MTYzZTIsIDB4MTYzZTQsDQorICAgIDB4MTYzZTgsIDB4MTYzZjYsIDB4MTY0MGUsIDB4MTY0MWMsIDB4MTY0MzgsIDB4MTY0NzAsIDB4MTY0N2UsIDB4MTY0ZTAsDQorICAgIDB4MTY0ZmMsIDB4MTY1YzAsIDB4MTY1ZjgsIDB4MTY2MTAsIDB4MTY2MWUsIDB4MTY2MjAsIDB4MTY2M2MsIDB4MTY2NDAsDQorICAgIDB4MTY2NzgsIDB4MTY2ZjAsIDB4MTY3MTgsIDB4MTY3MzAsIDB4MTY3M2UsIDB4MTY3NjAsIDB4MTY3N2MsIDB4MTY3OGUsDQorICAgIDB4MTY3OWMsIDB4MTY3YjgsIDB4MTY3YzIsIDB4MTY3YzQsIDB4MTY3YzgsIDB4MTY3ZDAsIDB4MTY3ZGUsIDB4MTY3ZTYsDQorICAgIDB4MTY3ZWMsIDB4MTY4MWMsIDB4MTY4MzgsIDB4MTY4NzAsIDB4MTY4ZTAsIDB4MTY4ZmMsIDB4MTY5YzAsIDB4MTY5ZjgsDQorICAgIDB4MTZiZjAsIDB4MTZjMTAsIDB4MTZjMWUsIDB4MTZjMjAsIDB4MTZjM2MsIDB4MTZjNDAsIDB4MTZjNzgsIDB4MTZjZjAsDQorICAgIDB4MTZkZTAsIDB4MTZlMTgsIDB4MTZlMzAsIDB4MTZlM2UsIDB4MTZlNjAsIDB4MTZlN2MsIDB4MTZlYzAsIDB4MTZlZjgsDQorICAgIDB4MTZmMWMsIDB4MTZmMzgsIDB4MTZmNzAsIDB4MTZmN2UsIDB4MTZmODQsIDB4MTZmODgsIDB4MTZmOTAsIDB4MTZmOWUsDQorICAgIDB4MTZmYTAsIDB4MTZmYmMsIDB4MTZmYzYsIDB4MTZmY2MsIDB4MTZmZDgsIDB4MTcwMjYsIDB4MTcwMmMsIDB4MTcwNDYsDQorICAgIDB4MTcwNGMsIDB4MTcwNTgsIDB4MTcwNmUsIDB4MTcwODYsIDB4MTcwOGMsIDB4MTcwOTgsIDB4MTcwYjAsIDB4MTcwYmUsDQorICAgIDB4MTcwY2UsIDB4MTcwZGMsIDB4MTcwZTgsIDB4MTcxMDYsIDB4MTcxMGMsIDB4MTcxMTgsIDB4MTcxMzAsIDB4MTcxM2UsDQorICAgIDB4MTcxNjAsIDB4MTcxN2MsIDB4MTcxOGUsIDB4MTcxOWMsIDB4MTcxYjgsIDB4MTcxYzIsIDB4MTcxYzQsIDB4MTcxYzgsDQorICAgIDB4MTcxZDAsIDB4MTcxZGUsIDB4MTcxZTYsIDB4MTcxZWMsIDB4MTcxZmEsIDB4MTcyMDYsIDB4MTcyMGMsIDB4MTcyMTgsDQorICAgIDB4MTcyMzAsIDB4MTcyM2UsIDB4MTcyNjAsIDB4MTcyN2MsIDB4MTcyYzAsIDB4MTcyZjgsIDB4MTczMGUsIDB4MTczMWMsDQorICAgIDB4MTczMzgsIDB4MTczNzAsIDB4MTczN2UsIDB4MTczODgsIDB4MTczOTAsIDB4MTczOWUsIDB4MTczYTAsIDB4MTczYmMsDQorICAgIDB4MTczY2MsIDB4MTczZDgsIDB4MTczZWUsIDB4MTczZjIsIDB4MTczZjQsIDB4MTc0MGMsIDB4MTc0MTgsIDB4MTc0MzAsDQorICAgIDB4MTc0M2UsIDB4MTc0NjAsIDB4MTc0N2MsIDB4MTc0YzAsIDB4MTc0ZjgsIDB4MTc1ZjAsIDB4MTc2MGUsIDB4MTc2MWMsDQorICAgIDB4MTc2MzgsIDB4MTc2NzAsIDB4MTc2N2UsIDB4MTc2ZTAsIDB4MTc2ZmMsIDB4MTc3MDgsIDB4MTc3MTAsIDB4MTc3MWUsDQorICAgIDB4MTc3MjAsIDB4MTc3M2MsIDB4MTc3NDAsIDB4MTc3NzgsIDB4MTc3OTgsIDB4MTc3YjAsIDB4MTc3YmUsIDB4MTc3ZGMsDQorICAgIDB4MTc3ZTIsIDB4MTc3ZTQsIDB4MTc3ZTgsIDB4MTc4MjIsIDB4MTc4MjQsIDB4MTc4MjgsIDB4MTc4MzYsIDB4MTc4NDIsDQorICAgIDB4MTc4NDQsIDB4MTc4NDgsIDB4MTc4NTAsIDB4MTc4NWUsIDB4MTc4NjYsIDB4MTc4NmMsIDB4MTc4ODIsIDB4MTc4ODQsDQorICAgIDB4MTc4ODgsIDB4MTc4OTAsIDB4MTc4OWUsIDB4MTc4YTAsIDB4MTc4YmMsIDB4MTc4YzYsIDB4MTc4Y2MsIDB4MTc4ZDgsDQorICAgIDB4MTc4ZWUsIDB4MTc4ZjIsIDB4MTc4ZjQsIDB4MTc5MDIsIDB4MTc5MDQsIDB4MTc5MDgsIDB4MTc5MTAsIDB4MTc5MWUsDQorICAgIDB4MTc5MjAsIDB4MTc5M2MsIDB4MTc5NDAsIDB4MTc5NzgsIDB4MTc5ODYsIDB4MTc5OGMsIDB4MTc5OTgsIDB4MTc5YjAsDQorICAgIDB4MTc5YmUsIDB4MTc5Y2UsIDB4MTc5ZGMsIDB4MTc5ZTIsIDB4MTc5ZTQsIDB4MTc5ZTgsIDB4MTc5ZjYsIDB4MTdhMDQsDQorICAgIDB4MTdhMDgsIDB4MTdhMTAsIDB4MTdhMWUsIDB4MTdhMjAsIDB4MTdhM2MsIDB4MTdhNDAsIDB4MTdhNzgsIDB4MTdhZjAsDQorICAgIDB4MTdiMDYsIDB4MTdiMGMsIDB4MTdiMTgsIDB4MTdiMzAsIDB4MTdiM2UsIDB4MTdiNjAsIDB4MTdiN2MsIDB4MTdiOGUsDQorICAgIDB4MTdiOWMsIDB4MTdiYjgsIDB4MTdiYzQsIDB4MTdiYzgsIDB4MTdiZDAsIDB4MTdiZGUsIDB4MTdiZTYsIDB4MTdiZWMsDQorICAgIDB4MTdjMmUsIDB4MTdjMzIsIDB4MTdjMzQsIDB4MTdjNGUsIDB4MTdjNWMsIDB4MTdjNjIsIDB4MTdjNjQsIDB4MTdjNjgsDQorICAgIDB4MTdjNzYsIDB4MTdjOGUsIDB4MTdjOWMsIDB4MTdjYjgsIDB4MTdjYzIsIDB4MTdjYzQsIDB4MTdjYzgsIDB4MTdjZDAsDQorICAgIDB4MTdjZGUsIDB4MTdjZTYsIDB4MTdjZWMsIDB4MTdkMGUsIDB4MTdkMWMsIDB4MTdkMzgsIDB4MTdkNzAsIDB4MTdkODIsDQorICAgIDB4MTdkODQsIDB4MTdkODgsIDB4MTdkOTAsIDB4MTdkOWUsIDB4MTdkYTAsIDB4MTdkYmMsIDB4MTdkYzYsIDB4MTdkY2MsDQorICAgIDB4MTdkZDgsIDB4MTdkZWUsIDB4MTdlMjYsIDB4MTdlMmMsIDB4MTdlM2EsIDB4MTdlNDYsIDB4MTdlNGMsIDB4MTdlNTgsDQorICAgIDB4MTdlNmUsIDB4MTdlNzIsIDB4MTdlNzQsIDB4MTdlODYsIDB4MTdlOGMsIDB4MTdlOTgsIDB4MTdlYjAsIDB4MTdlY2UsDQorICAgIDB4MTdlZGMsIDB4MTdlZTIsIDB4MTdlZTQsIDB4MTdlZTgsIDB4MTdlZjYsIDB4MTgxM2EsIDB4MTgxNzIsIDB4MTgxNzQsDQorICAgIDB4MTgyMTYsIDB4MTgyMjYsIDB4MTgyM2EsIDB4MTgyNGMsIDB4MTgyNTgsIDB4MTgyNmUsIDB4MTgyNzIsIDB4MTgyNzQsDQorICAgIDB4MTgyOTgsIDB4MTgyYmUsIDB4MTgyZTIsIDB4MTgyZTQsIDB4MTgyZTgsIDB4MTgyZjYsIDB4MTgzNWUsIDB4MTgzN2EsDQorICAgIDB4MTgzYWUsIDB4MTgzZDYsIDB4MTg0MTYsIDB4MTg0MjYsIDB4MTg0MmMsIDB4MTg0M2EsIDB4MTg0NDYsIDB4MTg0NTgsDQorICAgIDB4MTg0NmUsIDB4MTg0NzIsIDB4MTg0NzQsIDB4MTg0ODYsIDB4MTg0YjAsIDB4MTg0YmUsIDB4MTg0Y2UsIDB4MTg0ZGMsDQorICAgIDB4MTg0ZTIsIDB4MTg0ZTQsIDB4MTg0ZTgsIDB4MTg0ZjYsIDB4MTg1MDYsIDB4MTg1MGMsIDB4MTg1MTgsIDB4MTg1MzAsDQorICAgIDB4MTg1M2UsIDB4MTg1NjAsIDB4MTg1N2MsIDB4MTg1OGUsIDB4MTg1OWMsIDB4MTg1YjgsIDB4MTg1YzIsIDB4MTg1YzQsDQorICAgIDB4MTg1YzgsIDB4MTg1ZDAsIDB4MTg1ZGUsIDB4MTg1ZTYsIDB4MTg1ZWMsIDB4MTg1ZmEsIDB4MTg2MTIsIDB4MTg2MTQsDQorICAgIDB4MTg2MjIsIDB4MTg2MjgsIDB4MTg2MzYsIDB4MTg2NDIsIDB4MTg2NTAsIDB4MTg2NWUsIDB4MTg2N2EsIDB4MTg2ODIsDQorICAgIDB4MTg2ODQsIDB4MTg2ODgsIDB4MTg2OTAsIDB4MTg2OWUsIDB4MTg2YTAsIDB4MTg2YmMsIDB4MTg2YzYsIDB4MTg2Y2MsDQorICAgIDB4MTg2ZDgsIDB4MTg2ZWUsIDB4MTg2ZjIsIDB4MTg2ZjQsIDB4MTg3MmUsIDB4MTg3NGUsIDB4MTg3NWMsIDB4MTg3OTYsDQorICAgIDB4MTg3YTYsIDB4MTg3YWMsIDB4MTg3ZDIsIDB4MTg3ZDQsIDB4MTg4MjYsIDB4MTg4MmMsIDB4MTg4M2EsIDB4MTg4NDYsDQorICAgIDB4MTg4NGMsIDB4MTg4NTgsIDB4MTg4NmUsIDB4MTg4NzIsIDB4MTg4NzQsIDB4MTg4ODYsIDB4MTg4OTgsIDB4MTg4YjAsDQorICAgIDB4MTg4YmUsIDB4MTg4Y2UsIDB4MTg4ZGMsIDB4MTg4ZTIsIDB4MTg4ZTQsIDB4MTg4ZTgsIDB4MTg4ZjYsIDB4MTg5MGMsDQorICAgIDB4MTg5MzAsIDB4MTg5M2UsIDB4MTg5NjAsIDB4MTg5N2MsIDB4MTg5OGUsIDB4MTg5YjgsIDB4MTg5YzIsIDB4MTg5YzgsDQorICAgIDB4MTg5ZDAsIDB4MTg5ZGUsIDB4MTg5ZTYsIDB4MTg5ZWMsIDB4MTg5ZmEsIDB4MThhMTgsIDB4MThhMzAsIDB4MThhM2UsDQorICAgIDB4MThhNjAsIDB4MThhN2MsIDB4MThhYzAsIDB4MThhZjgsIDB4MThiMWMsIDB4MThiMzgsIDB4MThiNzAsIDB4MThiN2UsDQorICAgIDB4MThiODIsIDB4MThiODQsIDB4MThiODgsIDB4MThiOTAsIDB4MThiOWUsIDB4MThiYTAsIDB4MThiYmMsIDB4MThiYzYsDQorICAgIDB4MThiY2MsIDB4MThiZDgsIDB4MThiZWUsIDB4MThiZjIsIDB4MThiZjQsIDB4MThjMjIsIDB4MThjMjQsIDB4MThjMjgsDQorICAgIDB4MThjMzYsIDB4MThjNDIsIDB4MThjNDgsIDB4MThjNTAsIDB4MThjNWUsIDB4MThjNjYsIDB4MThjN2EsIDB4MThjODIsDQorICAgIDB4MThjODQsIDB4MThjOTAsIDB4MThjOWUsIDB4MThjYTAsIDB4MThjYmMsIDB4MThjY2MsIDB4MThjZjIsIDB4MThjZjQsDQorICAgIDB4MThkMDQsIDB4MThkMDgsIDB4MThkMTAsIDB4MThkMWUsIDB4MThkMjAsIDB4MThkM2MsIDB4MThkNDAsIDB4MThkNzgsDQorICAgIDB4MThkODYsIDB4MThkOTgsIDB4MThkY2UsIDB4MThkZTIsIDB4MThkZTQsIDB4MThkZTgsIDB4MThlMmUsIDB4MThlMzIsDQorICAgIDB4MThlMzQsIDB4MThlNGUsIDB4MThlNWMsIDB4MThlNjIsIDB4MThlNjQsIDB4MThlNjgsIDB4MThlOGUsIDB4MThlOWMsDQorICAgIDB4MThlYjgsIDB4MThlYzIsIDB4MThlYzQsIDB4MThlYzgsIDB4MThlZDAsIDB4MThlZmEsIDB4MThmMTYsIDB4MThmMjYsDQorICAgIDB4MThmMmMsIDB4MThmNDYsIDB4MThmNGMsIDB4MThmNTgsIDB4MThmNmUsIDB4MThmOGEsIDB4MThmOTIsIDB4MThmOTQsDQorICAgIDB4MThmYTIsIDB4MThmYTQsIDB4MThmYTgsIDB4MThmYjYsIDB4MTkwMmMsIDB4MTkwM2EsIDB4MTkwNDYsIDB4MTkwNGMsDQorICAgIDB4MTkwNTgsIDB4MTkwNzIsIDB4MTkwNzQsIDB4MTkwODYsIDB4MTkwOTgsIDB4MTkwYjAsIDB4MTkwYmUsIDB4MTkwY2UsDQorICAgIDB4MTkwZGMsIDB4MTkwZTIsIDB4MTkwZTgsIDB4MTkwZjYsIDB4MTkxMDYsIDB4MTkxMGMsIDB4MTkxMzAsIDB4MTkxM2UsDQorICAgIDB4MTkxNjAsIDB4MTkxN2MsIDB4MTkxOGUsIDB4MTkxOWMsIDB4MTkxYjgsIDB4MTkxYzIsIDB4MTkxYzgsIDB4MTkxZDAsDQorICAgIDB4MTkxZGUsIDB4MTkxZTYsIDB4MTkxZWMsIDB4MTkxZmEsIDB4MTkyMTgsIDB4MTkyM2UsIDB4MTkyNjAsIDB4MTkyN2MsDQorICAgIDB4MTkyYzAsIDB4MTkyZjgsIDB4MTkzMzgsIDB4MTkzNzAsIDB4MTkzN2UsIDB4MTkzODIsIDB4MTkzODQsIDB4MTkzOTAsDQorICAgIDB4MTkzOWUsIDB4MTkzYTAsIDB4MTkzYmMsIDB4MTkzYzYsIDB4MTkzY2MsIDB4MTkzZDgsIDB4MTkzZWUsIDB4MTkzZjIsDQorICAgIDB4MTkzZjQsIDB4MTk0MzAsIDB4MTk0M2UsIDB4MTk0NjAsIDB4MTk0N2MsIDB4MTk0YzAsIDB4MTk0ZjgsIDB4MTk1ZjAsDQorICAgIDB4MTk2MzgsIDB4MTk2NzAsIDB4MTk2N2UsIDB4MTk2ZTAsIDB4MTk2ZmMsIDB4MTk3MDIsIDB4MTk3MDQsIDB4MTk3MDgsDQorICAgIDB4MTk3MTAsIDB4MTk3MjAsIDB4MTk3M2MsIDB4MTk3NDAsIDB4MTk3NzgsIDB4MTk3ODYsIDB4MTk3OGMsIDB4MTk3OTgsDQorICAgIDB4MTk3YjAsIDB4MTk3YmUsIDB4MTk3Y2UsIDB4MTk3ZGMsIDB4MTk3ZTIsIDB4MTk3ZTQsIDB4MTk3ZTgsIDB4MTk4MjIsDQorICAgIDB4MTk4MjQsIDB4MTk4NDIsIDB4MTk4NDgsIDB4MTk4NTAsIDB4MTk4NWUsIDB4MTk4NjYsIDB4MTk4N2EsIDB4MTk4ODIsDQorICAgIDB4MTk4ODQsIDB4MTk4OTAsIDB4MTk4OWUsIDB4MTk4YTAsIDB4MTk4YmMsIDB4MTk4Y2MsIDB4MTk4ZjIsIDB4MTk4ZjQsDQorICAgIDB4MTk5MDIsIDB4MTk5MDgsIDB4MTk5MWUsIDB4MTk5MjAsIDB4MTk5M2MsIDB4MTk5NDAsIDB4MTk5NzgsIDB4MTk5ODYsDQorICAgIDB4MTk5OTgsIDB4MTk5Y2UsIDB4MTk5ZTIsIDB4MTk5ZTQsIDB4MTk5ZTgsIDB4MTlhMDgsIDB4MTlhMTAsIDB4MTlhMWUsDQorICAgIDB4MTlhMjAsIDB4MTlhM2MsIDB4MTlhNDAsIDB4MTlhNzgsIDB4MTlhZjAsIDB4MTliMTgsIDB4MTliM2UsIDB4MTliNjAsDQorICAgIDB4MTliOWMsIDB4MTliYzIsIDB4MTliYzQsIDB4MTliYzgsIDB4MTliZDAsIDB4MTliZTYsIDB4MTljMmUsIDB4MTljMzQsDQorICAgIDB4MTljNGUsIDB4MTljNWMsIDB4MTljNjIsIDB4MTljNjQsIDB4MTljNjgsIDB4MTljOGUsIDB4MTljOWMsIDB4MTljYjgsDQorICAgIDB4MTljYzIsIDB4MTljYzgsIDB4MTljZDAsIDB4MTljZTYsIDB4MTljZmEsIDB4MTlkMGUsIDB4MTlkMWMsIDB4MTlkMzgsDQorICAgIDB4MTlkNzAsIDB4MTlkN2UsIDB4MTlkODIsIDB4MTlkODQsIDB4MTlkODgsIDB4MTlkOTAsIDB4MTlkYTAsIDB4MTlkY2MsDQorICAgIDB4MTlkZjIsIDB4MTlkZjQsIDB4MTllMTYsIDB4MTllMjYsIDB4MTllMmMsIDB4MTllNDYsIDB4MTllNGMsIDB4MTllNTgsDQorICAgIDB4MTllNzQsIDB4MTllODYsIDB4MTllOGMsIDB4MTllOTgsIDB4MTllYjAsIDB4MTllYmUsIDB4MTllY2UsIDB4MTllZTIsDQorICAgIDB4MTllZTQsIDB4MTllZTgsIDB4MTlmMGEsIDB4MTlmMTIsIDB4MTlmMTQsIDB4MTlmMjIsIDB4MTlmMjQsIDB4MTlmMjgsDQorICAgIDB4MTlmNDIsIDB4MTlmNDQsIDB4MTlmNDgsIDB4MTlmNTAsIDB4MTlmNWUsIDB4MTlmNmMsIDB4MTlmOWEsIDB4MTlmYWUsDQorICAgIDB4MTlmYjIsIDB4MTlmYjQsIDB4MWEwNDYsIDB4MWEwNGMsIDB4MWEwNzIsIDB4MWEwNzQsIDB4MWEwODYsIDB4MWEwOGMsDQorICAgIDB4MWEwOTgsIDB4MWEwYjAsIDB4MWEwYmUsIDB4MWEwZTIsIDB4MWEwZTQsIDB4MWEwZTgsIDB4MWEwZjYsIDB4MWExMDYsDQorICAgIDB4MWExMGMsIDB4MWExMTgsIDB4MWExMzAsIDB4MWExM2UsIDB4MWExNjAsIDB4MWExN2MsIDB4MWExOGUsIDB4MWExOWMsDQorICAgIDB4MWExYjgsIDB4MWExYzIsIDB4MWExYzQsIDB4MWExYzgsIDB4MWExZDAsIDB4MWExZGUsIDB4MWExZTYsIDB4MWExZWMsDQorICAgIDB4MWEyMTgsIDB4MWEyMzAsIDB4MWEyM2UsIDB4MWEyNjAsIDB4MWEyN2MsIDB4MWEyYzAsIDB4MWEyZjgsIDB4MWEzMWMsDQorICAgIDB4MWEzMzgsIDB4MWEzNzAsIDB4MWEzN2UsIDB4MWEzODIsIDB4MWEzODQsIDB4MWEzODgsIDB4MWEzOTAsIDB4MWEzOWUsDQorICAgIDB4MWEzYTAsIDB4MWEzYmMsIDB4MWEzYzYsIDB4MWEzY2MsIDB4MWEzZDgsIDB4MWEzZWUsIDB4MWEzZjIsIDB4MWEzZjQsDQorICAgIDB4MWE0MTgsIDB4MWE0MzAsIDB4MWE0M2UsIDB4MWE0NjAsIDB4MWE0N2MsIDB4MWE0YzAsIDB4MWE0ZjgsIDB4MWE1ZjAsDQorICAgIDB4MWE2MWMsIDB4MWE2MzgsIDB4MWE2NzAsIDB4MWE2N2UsIDB4MWE2ZTAsIDB4MWE2ZmMsIDB4MWE3MDIsIDB4MWE3MDQsDQorICAgIDB4MWE3MDgsIDB4MWE3MTAsIDB4MWE3MWUsIDB4MWE3MjAsIDB4MWE3M2MsIDB4MWE3NDAsIDB4MWE3NzgsIDB4MWE3ODYsDQorICAgIDB4MWE3OGMsIDB4MWE3OTgsIDB4MWE3YjAsIDB4MWE3YmUsIDB4MWE3Y2UsIDB4MWE3ZGMsIDB4MWE3ZTIsIDB4MWE3ZTQsDQorICAgIDB4MWE3ZTgsIDB4MWE4MzAsIDB4MWE4NjAsIDB4MWE4N2MsIDB4MWE4YzAsIDB4MWE4ZjgsIDB4MWE5ZjAsIDB4MWFiZTAsDQorICAgIDB4MWFjNzAsIDB4MWFjN2UsIDB4MWFjZTAsIDB4MWFjZmMsIDB4MWFkYzAsIDB4MWFkZjgsIDB4MWFlMDQsIDB4MWFlMDgsDQorICAgIDB4MWFlMTAsIDB4MWFlMjAsIDB4MWFlM2MsIDB4MWFlNDAsIDB4MWFlNzgsIDB4MWFlZjAsIDB4MWFmMDYsIDB4MWFmMGMsDQorICAgIDB4MWFmMTgsIDB4MWFmMzAsIDB4MWFmM2UsIDB4MWFmNjAsIDB4MWFmN2MsIDB4MWFmOGUsIDB4MWFmOWMsIDB4MWFmYjgsDQorICAgIDB4MWFmYzQsIDB4MWFmYzgsIDB4MWFmZDAsIDB4MWFmZGUsIDB4MWIwNDIsIDB4MWIwNWUsIDB4MWIwN2EsIDB4MWIwODIsDQorICAgIDB4MWIwODQsIDB4MWIwODgsIDB4MWIwOTAsIDB4MWIwOWUsIDB4MWIwYTAsIDB4MWIwYmMsIDB4MWIwY2MsIDB4MWIwZjIsDQorICAgIDB4MWIwZjQsIDB4MWIxMDIsIDB4MWIxMDQsIDB4MWIxMDgsIDB4MWIxMTAsIDB4MWIxMWUsIDB4MWIxMjAsIDB4MWIxM2MsDQorICAgIDB4MWIxNDAsIDB4MWIxNzgsIDB4MWIxODYsIDB4MWIxOTgsIDB4MWIxY2UsIDB4MWIxZTIsIDB4MWIxZTQsIDB4MWIxZTgsDQorICAgIDB4MWIyMDQsIDB4MWIyMDgsIDB4MWIyMTAsIDB4MWIyMWUsIDB4MWIyMjAsIDB4MWIyM2MsIDB4MWIyNDAsIDB4MWIyNzgsDQorICAgIDB4MWIyZjAsIDB4MWIzMGMsIDB4MWIzM2UsIDB4MWIzNjAsIDB4MWIzOWMsIDB4MWIzYzIsIDB4MWIzYzQsIDB4MWIzYzgsDQorICAgIDB4MWIzZDAsIDB4MWIzZTYsIDB4MWI0MTAsIDB4MWI0MWUsIDB4MWI0MjAsIDB4MWI0M2MsIDB4MWI0NDAsIDB4MWI0NzgsDQorICAgIDB4MWI0ZjAsIDB4MWI1ZTAsIDB4MWI2MTgsIDB4MWI2NjAsIDB4MWI2N2MsIDB4MWI2YzAsIDB4MWI3MzgsIDB4MWI3ODIsDQorICAgIDB4MWI3ODQsIDB4MWI3ODgsIDB4MWI3OTAsIDB4MWI3OWUsIDB4MWI3YTAsIDB4MWI3Y2MsIDB4MWI4MmUsIDB4MWI4NGUsDQorICAgIDB4MWI4NWMsIDB4MWI4OGUsIDB4MWI4OWMsIDB4MWI4YjgsIDB4MWI4YzIsIDB4MWI4YzQsIDB4MWI4YzgsIDB4MWI4ZDAsDQorICAgIDB4MWI4ZTYsIDB4MWI4ZmEsIDB4MWI5MGUsIDB4MWI5MWMsIDB4MWI5MzgsIDB4MWI5NzAsIDB4MWI5N2UsIDB4MWI5ODIsDQorICAgIDB4MWI5ODQsIDB4MWI5ODgsIDB4MWI5OTAsIDB4MWI5OWUsIDB4MWI5YTAsIDB4MWI5Y2MsIDB4MWI5ZjIsIDB4MWI5ZjQsDQorICAgIDB4MWJhMGUsIDB4MWJhMWMsIDB4MWJhMzgsIDB4MWJhNzAsIDB4MWJhN2UsIDB4MWJhZTAsIDB4MWJhZmMsIDB4MWJiMDgsDQorICAgIDB4MWJiMTAsIDB4MWJiMjAsIDB4MWJiM2MsIDB4MWJiNDAsIDB4MWJiOTgsIDB4MWJiY2UsIDB4MWJiZTIsIDB4MWJiZTQsDQorICAgIDB4MWJiZTgsIDB4MWJjMTYsIDB4MWJjMjYsIDB4MWJjMmMsIDB4MWJjNDYsIDB4MWJjNGMsIDB4MWJjNTgsIDB4MWJjNzIsDQorICAgIDB4MWJjNzQsIDB4MWJjODYsIDB4MWJjOGMsIDB4MWJjOTgsIDB4MWJjYjAsIDB4MWJjYmUsIDB4MWJjY2UsIDB4MWJjZTIsDQorICAgIDB4MWJjZTQsIDB4MWJjZTgsIDB4MWJkMDYsIDB4MWJkMGMsIDB4MWJkMTgsIDB4MWJkMzAsIDB4MWJkM2UsIDB4MWJkNjAsDQorICAgIDB4MWJkN2MsIDB4MWJkOWMsIDB4MWJkYzIsIDB4MWJkYzQsIDB4MWJkYzgsIDB4MWJkZDAsIDB4MWJkZTYsIDB4MWJkZmEsDQorICAgIDB4MWJlMTIsIDB4MWJlMTQsIDB4MWJlMjIsIDB4MWJlMjQsIDB4MWJlMjgsIDB4MWJlNDIsIDB4MWJlNDQsIDB4MWJlNDgsDQorICAgIDB4MWJlNTAsIDB4MWJlNWUsIDB4MWJlNjYsIDB4MWJlODIsIDB4MWJlODQsIDB4MWJlODgsIDB4MWJlOTAsIDB4MWJlOWUsDQorICAgIDB4MWJlYTAsIDB4MWJlYmMsIDB4MWJlY2MsIDB4MWJlZjQsIDB4MWJmMWEsIDB4MWJmMmUsIDB4MWJmMzIsIDB4MWJmMzQsDQorICAgIDB4MWJmNGUsIDB4MWJmNWMsIDB4MWJmNjIsIDB4MWJmNjQsIDB4MWJmNjgsIDB4MWMwOWEsIDB4MWMwYjIsIDB4MWMwYjQsDQorICAgIDB4MWMxMWEsIDB4MWMxMzIsIDB4MWMxMzQsIDB4MWMxNjIsIDB4MWMxNjQsIDB4MWMxNjgsIDB4MWMxNzYsIDB4MWMxYmEsDQorICAgIDB4MWMyMWEsIDB4MWMyMzIsIDB4MWMyMzQsIDB4MWMyNGUsIDB4MWMyNWMsIDB4MWMyNjIsIDB4MWMyNjQsIDB4MWMyNjgsDQorICAgIDB4MWMyNzYsIDB4MWMyOGUsIDB4MWMyYzIsIDB4MWMyYzQsIDB4MWMyYzgsIDB4MWMyZDAsIDB4MWMyZGUsIDB4MWMyZTYsDQorICAgIDB4MWMyZWMsIDB4MWMyZmEsIDB4MWMzMTYsIDB4MWMzMjYsIDB4MWMzM2EsIDB4MWMzNDYsIDB4MWMzNGMsIDB4MWMzNzIsDQorICAgIDB4MWMzNzQsIDB4MWM0MWEsIDB4MWM0MmUsIDB4MWM0MzIsIDB4MWM0MzQsIDB4MWM0NGUsIDB4MWM0NWMsIDB4MWM0NjIsDQorICAgIDB4MWM0NjQsIDB4MWM0NjgsIDB4MWM0NzYsIDB4MWM0OGUsIDB4MWM0OWMsIDB4MWM0YjgsIDB4MWM0YzIsIDB4MWM0YzgsDQorICAgIDB4MWM0ZDAsIDB4MWM0ZGUsIDB4MWM0ZTYsIDB4MWM0ZWMsIDB4MWM0ZmEsIDB4MWM1MWMsIDB4MWM1MzgsIDB4MWM1NzAsDQorICAgIDB4MWM1N2UsIDB4MWM1ODIsIDB4MWM1ODQsIDB4MWM1ODgsIDB4MWM1OTAsIDB4MWM1OWUsIDB4MWM1YTAsIDB4MWM1YmMsDQorICAgIDB4MWM1YzYsIDB4MWM1Y2MsIDB4MWM1ZDgsIDB4MWM1ZWUsIDB4MWM1ZjIsIDB4MWM1ZjQsIDB4MWM2MTYsIDB4MWM2MjYsDQorICAgIDB4MWM2MmMsIDB4MWM2M2EsIDB4MWM2NDYsIDB4MWM2NGMsIDB4MWM2NTgsIDB4MWM2NmUsIDB4MWM2NzIsIDB4MWM2NzQsDQorICAgIDB4MWM2ODYsIDB4MWM2OGMsIDB4MWM2OTgsIDB4MWM2YjAsIDB4MWM2YmUsIDB4MWM2Y2UsIDB4MWM2ZGMsIDB4MWM2ZTIsDQorICAgIDB4MWM2ZTQsIDB4MWM2ZTgsIDB4MWM3MTIsIDB4MWM3MTQsIDB4MWM3MjIsIDB4MWM3MjgsIDB4MWM3MzYsIDB4MWM3NDIsDQorICAgIDB4MWM3NDQsIDB4MWM3NDgsIDB4MWM3NTAsIDB4MWM3NWUsIDB4MWM3NjYsIDB4MWM3NmMsIDB4MWM3N2EsIDB4MWM3YWUsDQorICAgIDB4MWM3ZDYsIDB4MWM3ZWEsIDB4MWM4MWEsIDB4MWM4MmUsIDB4MWM4MzIsIDB4MWM4MzQsIDB4MWM4NGUsIDB4MWM4NWMsDQorICAgIDB4MWM4NjIsIDB4MWM4NjQsIDB4MWM4NjgsIDB4MWM4NzYsIDB4MWM4OGUsIDB4MWM4OWMsIDB4MWM4YjgsIDB4MWM4YzIsDQorICAgIDB4MWM4YzgsIDB4MWM4ZDAsIDB4MWM4ZGUsIDB4MWM4ZTYsIDB4MWM4ZWMsIDB4MWM4ZmEsIDB4MWM5MGUsIDB4MWM5MzgsDQorICAgIDB4MWM5NzAsIDB4MWM5N2UsIDB4MWM5ODIsIDB4MWM5ODQsIDB4MWM5OTAsIDB4MWM5OWUsIDB4MWM5YTAsIDB4MWM5YmMsDQorICAgIDB4MWM5YzYsIDB4MWM5Y2MsIDB4MWM5ZDgsIDB4MWM5ZWUsIDB4MWM5ZjIsIDB4MWM5ZjQsIDB4MWNhMzgsIDB4MWNhNzAsDQorICAgIDB4MWNhN2UsIDB4MWNhZTAsIDB4MWNhZmMsIDB4MWNiMDIsIDB4MWNiMDQsIDB4MWNiMDgsIDB4MWNiMTAsIDB4MWNiMjAsDQorICAgIDB4MWNiM2MsIDB4MWNiNDAsIDB4MWNiNzgsIDB4MWNiODYsIDB4MWNiOGMsIDB4MWNiOTgsIDB4MWNiYjAsIDB4MWNiYmUsDQorICAgIDB4MWNiY2UsIDB4MWNiZGMsIDB4MWNiZTIsIDB4MWNiZTQsIDB4MWNiZTgsIDB4MWNiZjYsIDB4MWNjMTYsIDB4MWNjMjYsDQorICAgIDB4MWNjMmMsIDB4MWNjM2EsIDB4MWNjNDYsIDB4MWNjNTgsIDB4MWNjNzIsIDB4MWNjNzQsIDB4MWNjODYsIDB4MWNjYjAsDQorICAgIDB4MWNjYmUsIDB4MWNjY2UsIDB4MWNjZTIsIDB4MWNjZTQsIDB4MWNjZTgsIDB4MWNkMDYsIDB4MWNkMGMsIDB4MWNkMTgsDQorICAgIDB4MWNkMzAsIDB4MWNkM2UsIDB4MWNkNjAsIDB4MWNkN2MsIDB4MWNkOWMsIDB4MWNkYzIsIDB4MWNkYzQsIDB4MWNkYzgsDQorICAgIDB4MWNkZDAsIDB4MWNkZGUsIDB4MWNkZTYsIDB4MWNkZmEsIDB4MWNlMjIsIDB4MWNlMjgsIDB4MWNlNDIsIDB4MWNlNTAsDQorICAgIDB4MWNlNWUsIDB4MWNlNjYsIDB4MWNlN2EsIDB4MWNlODIsIDB4MWNlODQsIDB4MWNlODgsIDB4MWNlOTAsIDB4MWNlOWUsDQorICAgIDB4MWNlYTAsIDB4MWNlYmMsIDB4MWNlY2MsIDB4MWNlZjIsIDB4MWNlZjQsIDB4MWNmMmUsIDB4MWNmMzIsIDB4MWNmMzQsDQorICAgIDB4MWNmNGUsIDB4MWNmNWMsIDB4MWNmNjIsIDB4MWNmNjQsIDB4MWNmNjgsIDB4MWNmOTYsIDB4MWNmYTYsIDB4MWNmYWMsDQorICAgIDB4MWNmY2EsIDB4MWNmZDIsIDB4MWNmZDQsIDB4MWQwMmUsIDB4MWQwMzIsIDB4MWQwMzQsIDB4MWQwNGUsIDB4MWQwNWMsDQorICAgIDB4MWQwNjIsIDB4MWQwNjQsIDB4MWQwNjgsIDB4MWQwNzYsIDB4MWQwOGUsIDB4MWQwOWMsIDB4MWQwYjgsIDB4MWQwYzIsDQorICAgIDB4MWQwYzQsIDB4MWQwYzgsIDB4MWQwZDAsIDB4MWQwZGUsIDB4MWQwZTYsIDB4MWQwZWMsIDB4MWQwZmEsIDB4MWQxMWMsDQorICAgIDB4MWQxMzgsIDB4MWQxNzAsIDB4MWQxN2UsIDB4MWQxODIsIDB4MWQxODQsIDB4MWQxODgsIDB4MWQxOTAsIDB4MWQxOWUsDQorICAgIDB4MWQxYTAsIDB4MWQxYmMsIDB4MWQxYzYsIDB4MWQxY2MsIDB4MWQxZDgsIDB4MWQxZWUsIDB4MWQxZjIsIDB4MWQxZjQsDQorICAgIDB4MWQyMWMsIDB4MWQyMzgsIDB4MWQyNzAsIDB4MWQyN2UsIDB4MWQyZTAsIDB4MWQyZmMsIDB4MWQzMDIsIDB4MWQzMDQsDQorICAgIDB4MWQzMDgsIDB4MWQzMTAsIDB4MWQzMWUsIDB4MWQzMjAsIDB4MWQzM2MsIDB4MWQzNDAsIDB4MWQzNzgsIDB4MWQzODYsDQorICAgIDB4MWQzOGMsIDB4MWQzOTgsIDB4MWQzYjAsIDB4MWQzYmUsIDB4MWQzY2UsIDB4MWQzZGMsIDB4MWQzZTIsIDB4MWQzZTQsDQorICAgIDB4MWQzZTgsIDB4MWQzZjYsIDB4MWQ0NzAsIDB4MWQ0N2UsIDB4MWQ0ZTAsIDB4MWQ0ZmMsIDB4MWQ1YzAsIDB4MWQ1ZjgsDQorICAgIDB4MWQ2MDQsIDB4MWQ2MDgsIDB4MWQ2MTAsIDB4MWQ2MjAsIDB4MWQ2NDAsIDB4MWQ2NzgsIDB4MWQ2ZjAsIDB4MWQ3MDYsDQorICAgIDB4MWQ3MGMsIDB4MWQ3MTgsIDB4MWQ3MzAsIDB4MWQ3M2UsIDB4MWQ3NjAsIDB4MWQ3N2MsIDB4MWQ3OGUsIDB4MWQ3OWMsDQorICAgIDB4MWQ3YjgsIDB4MWQ3YzIsIDB4MWQ3YzQsIDB4MWQ3YzgsIDB4MWQ3ZDAsIDB4MWQ3ZGUsIDB4MWQ3ZTYsIDB4MWQ3ZWMsDQorICAgIDB4MWQ4MjYsIDB4MWQ4MmMsIDB4MWQ4M2EsIDB4MWQ4NDYsIDB4MWQ4NGMsIDB4MWQ4NTgsIDB4MWQ4NzIsIDB4MWQ4NzQsDQorICAgIDB4MWQ4ODYsIDB4MWQ4OGMsIDB4MWQ4OTgsIDB4MWQ4YjAsIDB4MWQ4YmUsIDB4MWQ4Y2UsIDB4MWQ4ZTIsIDB4MWQ4ZTQsDQorICAgIDB4MWQ4ZTgsIDB4MWQ4ZjYsIDB4MWQ5MGMsIDB4MWQ5MTgsIDB4MWQ5MzAsIDB4MWQ5M2UsIDB4MWQ5NjAsIDB4MWQ5N2MsDQorICAgIDB4MWQ5OWMsIDB4MWQ5YzIsIDB4MWQ5YzQsIDB4MWQ5YzgsIDB4MWQ5ZDAsIDB4MWQ5ZTYsIDB4MWQ5ZmEsIDB4MWRhMGMsDQorICAgIDB4MWRhMTgsIDB4MWRhMzAsIDB4MWRhM2UsIDB4MWRhNjAsIDB4MWRhN2MsIDB4MWRhYzAsIDB4MWRhZjgsIDB4MWRiMzgsDQorICAgIDB4MWRiODIsIDB4MWRiODQsIDB4MWRiODgsIDB4MWRiOTAsIDB4MWRiOWUsIDB4MWRiYTAsIDB4MWRiY2MsIDB4MWRiZjIsDQorICAgIDB4MWRiZjQsIDB4MWRjMjIsIDB4MWRjNDIsIDB4MWRjNDQsIDB4MWRjNDgsIDB4MWRjNTAsIDB4MWRjNWUsIDB4MWRjNjYsDQorICAgIDB4MWRjN2EsIDB4MWRjODIsIDB4MWRjODQsIDB4MWRjODgsIDB4MWRjOTAsIDB4MWRjOWUsIDB4MWRjYTAsIDB4MWRjYmMsDQorICAgIDB4MWRjY2MsIDB4MWRjZjIsIDB4MWRjZjQsIDB4MWRkMDQsIDB4MWRkMDgsIDB4MWRkMTAsIDB4MWRkMWUsIDB4MWRkMjAsDQorICAgIDB4MWRkM2MsIDB4MWRkNDAsIDB4MWRkNzgsIDB4MWRkODYsIDB4MWRkOTgsIDB4MWRkY2UsIDB4MWRkZTIsIDB4MWRkZTQsDQorICAgIDB4MWRkZTgsIDB4MWRlMmUsIDB4MWRlMzIsIDB4MWRlMzQsIDB4MWRlNGUsIDB4MWRlNWMsIDB4MWRlNjIsIDB4MWRlNjQsDQorICAgIDB4MWRlNjgsIDB4MWRlOGUsIDB4MWRlOWMsIDB4MWRlYjgsIDB4MWRlYzIsIDB4MWRlYzQsIDB4MWRlYzgsIDB4MWRlZDAsDQorICAgIDB4MWRlZTYsIDB4MWRlZmEsIDB4MWRmMTYsIDB4MWRmMjYsIDB4MWRmMmMsIDB4MWRmNDYsIDB4MWRmNGMsIDB4MWRmNTgsDQorICAgIDB4MWRmNzIsIDB4MWRmNzQsIDB4MWRmOGEsIDB4MWRmOTIsIDB4MWRmOTQsIDB4MWRmYTIsIDB4MWRmYTQsIDB4MWRmYTgsDQorICAgIDB4MWUwOGEsIDB4MWUwOTIsIDB4MWUwOTQsIDB4MWUwYTIsIDB4MWUwYTQsIDB4MWUwYTgsIDB4MWUwYjYsIDB4MWUwZGEsDQorICAgIDB4MWUxMGEsIDB4MWUxMTIsIDB4MWUxMTQsIDB4MWUxMjIsIDB4MWUxMjQsIDB4MWUxMjgsIDB4MWUxMzYsIDB4MWUxNDIsDQorICAgIDB4MWUxNDQsIDB4MWUxNDgsIDB4MWUxNTAsIDB4MWUxNjYsIDB4MWUxNmMsIDB4MWUxN2EsIDB4MWUxOWEsIDB4MWUxYjIsDQorICAgIDB4MWUxYjQsIDB4MWUyMGEsIDB4MWUyMTIsIDB4MWUyMTQsIDB4MWUyMjIsIDB4MWUyMjQsIDB4MWUyMjgsIDB4MWUyMzYsDQorICAgIDB4MWUyNDIsIDB4MWUyNDgsIDB4MWUyNTAsIDB4MWUyNWUsIDB4MWUyNjYsIDB4MWUyNmMsIDB4MWUyN2EsIDB4MWUyODIsDQorICAgIDB4MWUyODQsIDB4MWUyODgsIDB4MWUyOTAsIDB4MWUyYTAsIDB4MWUyYmMsIDB4MWUyYzYsIDB4MWUyY2MsIDB4MWUyZDgsDQorICAgIDB4MWUyZWUsIDB4MWUyZjIsIDB4MWUyZjQsIDB4MWUzMWEsIDB4MWUzMzIsIDB4MWUzMzQsIDB4MWUzNWMsIDB4MWUzNjIsDQorICAgIDB4MWUzNjQsIDB4MWUzNjgsIDB4MWUzYmEsIDB4MWU0MGEsIDB4MWU0MTIsIDB4MWU0MTQsIDB4MWU0MjIsIDB4MWU0MjgsDQorICAgIDB4MWU0MzYsIDB4MWU0NDIsIDB4MWU0NDgsIDB4MWU0NTAsIDB4MWU0NWUsIDB4MWU0NjYsIDB4MWU0NmMsIDB4MWU0N2EsDQorICAgIDB4MWU0ODIsIDB4MWU0ODQsIDB4MWU0OTAsIDB4MWU0OWUsIDB4MWU0YTAsIDB4MWU0YmMsIDB4MWU0YzYsIDB4MWU0Y2MsDQorICAgIDB4MWU0ZDgsIDB4MWU0ZWUsIDB4MWU0ZjIsIDB4MWU0ZjQsIDB4MWU1MDIsIDB4MWU1MDQsIDB4MWU1MDgsIDB4MWU1MTAsDQorICAgIDB4MWU1MWUsIDB4MWU1MjAsIDB4MWU1M2MsIDB4MWU1NDAsIDB4MWU1NzgsIDB4MWU1ODYsIDB4MWU1OGMsIDB4MWU1OTgsDQorICAgIDB4MWU1YjAsIDB4MWU1YmUsIDB4MWU1Y2UsIDB4MWU1ZGMsIDB4MWU1ZTIsIDB4MWU1ZTQsIDB4MWU1ZTgsIDB4MWU1ZjYsDQorICAgIDB4MWU2MWEsIDB4MWU2MmUsIDB4MWU2MzIsIDB4MWU2MzQsIDB4MWU2NGUsIDB4MWU2NWMsIDB4MWU2NjIsIDB4MWU2NjgsDQorICAgIDB4MWU2OGUsIDB4MWU2OWMsIDB4MWU2YjgsIDB4MWU2YzIsIDB4MWU2YzQsIDB4MWU2YzgsIDB4MWU2ZDAsIDB4MWU2ZTYsDQorICAgIDB4MWU2ZmEsIDB4MWU3MTYsIDB4MWU3MjYsIDB4MWU3MmMsIDB4MWU3M2EsIDB4MWU3NDYsIDB4MWU3NGMsIDB4MWU3NTgsDQorICAgIDB4MWU3NzIsIDB4MWU3NzQsIDB4MWU3OTIsIDB4MWU3OTQsIDB4MWU3YTIsIDB4MWU3YTQsIDB4MWU3YTgsIDB4MWU3YjYsDQorICAgIDB4MWU4MTIsIDB4MWU4MTQsIDB4MWU4MjIsIDB4MWU4MjQsIDB4MWU4MjgsIDB4MWU4MzYsIDB4MWU4NDIsIDB4MWU4NDQsDQorICAgIDB4MWU4NDgsIDB4MWU4NTAsIDB4MWU4NWUsIDB4MWU4NjYsIDB4MWU4NmMsIDB4MWU4N2EsIDB4MWU4ODIsIDB4MWU4ODQsDQorICAgIDB4MWU4ODgsIDB4MWU4OTAsIDB4MWU4OWUsIDB4MWU4YTAsIDB4MWU4YmMsIDB4MWU4YzYsIDB4MWU4Y2MsIDB4MWU4ZDgsDQorICAgIDB4MWU4ZWUsIDB4MWU4ZjIsIDB4MWU4ZjQsIDB4MWU5MDIsIDB4MWU5MDQsIDB4MWU5MDgsIDB4MWU5MTAsIDB4MWU5MjAsDQorICAgIDB4MWU5M2MsIDB4MWU5NDAsIDB4MWU5NzgsIDB4MWU5ODYsIDB4MWU5OGMsIDB4MWU5OTgsIDB4MWU5YjAsIDB4MWU5YmUsDQorICAgIDB4MWU5Y2UsIDB4MWU5ZGMsIDB4MWU5ZTIsIDB4MWU5ZTQsIDB4MWU5ZTgsIDB4MWU5ZjYsIDB4MWVhMDQsIDB4MWVhMDgsDQorICAgIDB4MWVhMTAsIDB4MWVhMjAsIDB4MWVhNDAsIDB4MWVhNzgsIDB4MWVhZjAsIDB4MWViMDYsIDB4MWViMGMsIDB4MWViMTgsDQorICAgIDB4MWViMzAsIDB4MWViM2UsIDB4MWViNjAsIDB4MWViN2MsIDB4MWViOGUsIDB4MWViOWMsIDB4MWViYjgsIDB4MWViYzIsDQorICAgIDB4MWViYzQsIDB4MWViYzgsIDB4MWViZDAsIDB4MWViZGUsIDB4MWViZTYsIDB4MWViZWMsIDB4MWVjMWEsIDB4MWVjMmUsDQorICAgIDB4MWVjMzIsIDB4MWVjMzQsIDB4MWVjNGUsIDB4MWVjNWMsIDB4MWVjNjIsIDB4MWVjNjQsIDB4MWVjNjgsIDB4MWVjOGUsDQorICAgIDB4MWVjOWMsIDB4MWVjYjgsIDB4MWVjYzIsIDB4MWVjYzQsIDB4MWVjYzgsIDB4MWVjZDAsIDB4MWVjZTYsIDB4MWVjZmEsDQorICAgIDB4MWVkMGUsIDB4MWVkMWMsIDB4MWVkMzgsIDB4MWVkNzAsIDB4MWVkN2UsIDB4MWVkODIsIDB4MWVkODQsIDB4MWVkODgsDQorICAgIDB4MWVkOTAsIDB4MWVkOWUsIDB4MWVkYTAsIDB4MWVkY2MsIDB4MWVkZjIsIDB4MWVkZjQsIDB4MWVlMTYsIDB4MWVlMjYsDQorICAgIDB4MWVlMmMsIDB4MWVlM2EsIDB4MWVlNDYsIDB4MWVlNGMsIDB4MWVlNTgsIDB4MWVlNmUsIDB4MWVlNzIsIDB4MWVlNzQsDQorICAgIDB4MWVlODYsIDB4MWVlOGMsIDB4MWVlOTgsIDB4MWVlYjAsIDB4MWVlYmUsIDB4MWVlY2UsIDB4MWVlZGMsIDB4MWVlZTIsDQorICAgIDB4MWVlZTQsIDB4MWVlZTgsIDB4MWVmMTIsIDB4MWVmMjIsIDB4MWVmMjQsIDB4MWVmMjgsIDB4MWVmMzYsIDB4MWVmNDIsDQorICAgIDB4MWVmNDQsIDB4MWVmNDgsIDB4MWVmNTAsIDB4MWVmNWUsIDB4MWVmNjYsIDB4MWVmNmMsIDB4MWVmN2EsIDB4MWVmYWUsDQorICAgIDB4MWVmYjIsIDB4MWVmYjQsIDB4MWVmZDYsIDB4MWYwOTYsIDB4MWYwYTYsIDB4MWYwYWMsIDB4MWYwYmEsIDB4MWYwY2EsDQorICAgIDB4MWYwZDIsIDB4MWYwZDQsIDB4MWYxMTYsIDB4MWYxMjYsIDB4MWYxMmMsIDB4MWYxM2EsIDB4MWYxNDYsIDB4MWYxNGMsDQorICAgIDB4MWYxNTgsIDB4MWYxNmUsIDB4MWYxNzIsIDB4MWYxNzQsIDB4MWYxOGEsIDB4MWYxOTIsIDB4MWYxOTQsIDB4MWYxYTIsDQorICAgIDB4MWYxYTQsIDB4MWYxYTgsIDB4MWYxZGEsIDB4MWYyMTYsIDB4MWYyMjYsIDB4MWYyMmMsIDB4MWYyM2EsIDB4MWYyNDYsDQorICAgIDB4MWYyNTgsIDB4MWYyNmUsIDB4MWYyNzIsIDB4MWYyNzQsIDB4MWYyODYsIDB4MWYyOGMsIDB4MWYyOTgsIDB4MWYyYjAsDQorICAgIDB4MWYyYmUsIDB4MWYyY2UsIDB4MWYyZGMsIDB4MWYyZTIsIDB4MWYyZTQsIDB4MWYyZTgsIDB4MWYyZjYsIDB4MWYzMGEsDQorICAgIDB4MWYzMTIsIDB4MWYzMTQsIDB4MWYzMjIsIDB4MWYzMjgsIDB4MWYzNDIsIDB4MWYzNDQsIDB4MWYzNDgsIDB4MWYzNTAsDQorICAgIDB4MWYzNWUsIDB4MWYzNjYsIDB4MWYzN2EsIDB4MWYzOWEsIDB4MWYzYWUsIDB4MWYzYjIsIDB4MWYzYjQsIDB4MWY0MTYsDQorICAgIDB4MWY0MjYsIDB4MWY0MmMsIDB4MWY0M2EsIDB4MWY0NDYsIDB4MWY0NGMsIDB4MWY0NTgsIDB4MWY0NmUsIDB4MWY0NzIsDQorICAgIDB4MWY0NzQsIDB4MWY0ODYsIDB4MWY0OGMsIDB4MWY0OTgsIDB4MWY0YjAsIDB4MWY0YmUsIDB4MWY0Y2UsIDB4MWY0ZGMsDQorICAgIDB4MWY0ZTIsIDB4MWY0ZTQsIDB4MWY0ZTgsIDB4MWY0ZjYsIDB4MWY1MDYsIDB4MWY1MGMsIDB4MWY1MTgsIDB4MWY1MzAsDQorICAgIDB4MWY1M2UsIDB4MWY1NjAsIDB4MWY1N2MsIDB4MWY1OGUsIDB4MWY1OWMsIDB4MWY1YjgsIDB4MWY1YzIsIDB4MWY1YzQsDQorICAgIDB4MWY1YzgsIDB4MWY1ZDAsIDB4MWY1ZGUsIDB4MWY1ZTYsIDB4MWY1ZWMsIDB4MWY1ZmEsIDB4MWY2MGEsIDB4MWY2MTIsDQorICAgIDB4MWY2MTQsIDB4MWY2MjIsIDB4MWY2MjQsIDB4MWY2MjgsIDB4MWY2MzYsIDB4MWY2NDIsIDB4MWY2NDQsIDB4MWY2NDgsDQorICAgIDB4MWY2NTAsIDB4MWY2NWUsIDB4MWY2NjYsIDB4MWY2N2EsIDB4MWY2ODIsIDB4MWY2ODQsIDB4MWY2ODgsIDB4MWY2OTAsDQorICAgIDB4MWY2OWUsIDB4MWY2YTAsIDB4MWY2YmMsIDB4MWY2Y2MsIDB4MWY2ZjIsIDB4MWY2ZjQsIDB4MWY3MWEsIDB4MWY3MmUsDQorICAgIDB4MWY3MzIsIDB4MWY3MzQsIDB4MWY3NGUsIDB4MWY3NWMsIDB4MWY3NjIsIDB4MWY3NjQsIDB4MWY3NjgsIDB4MWY3NzYsDQorICAgIDB4MWY3OTYsIDB4MWY3YTYsIDB4MWY3YWMsIDB4MWY3YmEsIDB4MWY3ZDIsIDB4MWY3ZDQsIDB4MWY4OWEsIDB4MWY4YWUsDQorICAgIDB4MWY4YjIsIDB4MWY4YjQsIDB4MWY4ZDYsIDB4MWY4ZWEsIDB4MWY5MWEsIDB4MWY5MmUsIDB4MWY5MzIsIDB4MWY5MzQsDQorICAgIDB4MWY5NGUsIDB4MWY5NWMsIDB4MWY5NjIsIDB4MWY5NjQsIDB4MWY5NjgsIDB4MWY5NzYsIDB4MWY5OTYsIDB4MWY5YTYsDQorICAgIDB4MWY5YWMsIDB4MWY5YmEsIDB4MWY5Y2EsIDB4MWY5ZDIsIDB4MWY5ZDQsIDB4MWZhMWEsIDB4MWZhMmUsIDB4MWZhMzIsDQorICAgIDB4MWZhMzQsIDB4MWZhNGUsIDB4MWZhNWMsIDB4MWZhNjIsIDB4MWZhNjQsIDB4MWZhNjgsIDB4MWZhNzYsIDB4MWZhOGUsDQorICAgIDB4MWZhOWMsIDB4MWZhYjgsIDB4MWZhYzIsIDB4MWZhYzQsIDB4MWZhYzgsIDB4MWZhZDAsIDB4MWZhZGUsIDB4MWZhZTYsDQorICAgIDB4MWZhZWMsIDB4MWZiMTYsIDB4MWZiMjYsIDB4MWZiMmMsIDB4MWZiM2EsIDB4MWZiNDYsIDB4MWZiNGMsIDB4MWZiNTgsDQorICAgIDB4MWZiNmUsIDB4MWZiNzIsIDB4MWZiNzQsIDB4MWZiOGEsIDB4MWZiOTIsIDB4MWZiOTQsIDB4MWZiYTIsIDB4MWZiYTQsDQorICAgIDB4MWZiYTgsIDB4MWZiYjYsIDB4MWZiZGF9Ow0KK2ludDMyX3QgQ0JDX1BERjQxN0NvbW1vbjo6Q09ERVdPUkRfVEFCTEVbXSA9IHsNCisgICAgMjYyNywgMTgxOSwgMjYyMiwgMjYyMSwgMTgxMywgMTgxMiwgMjcyOSwgMjcyNCwgMjcyMywgMjc3OSwgMjc3NCwgMjc3MywNCisgICAgOTAyLCAgODk2LCAgOTA4LCAgODY4LCAgODY1LCAgODYxLCAgODU5LCAgMjUxMSwgODczLCAgODcxLCAgMTc4MCwgODM1LA0KKyAgICAyNDkzLCA4MjUsICAyNDkxLCA4NDIsICA4MzcsICA4NDQsICAxNzY0LCAxNzYyLCA4MTEsICA4MTAsICA4MDksICAyNDgzLA0KKyAgICA4MDcsICAyNDgyLCA4MDYsICAyNDgwLCA4MTUsICA4MTQsICA4MTMsICA4MTIsICAyNDg0LCA4MTcsICA4MTYsICAxNzQ1LA0KKyAgICAxNzQ0LCAxNzQyLCAxNzQ2LCAyNjU1LCAyNjM3LCAyNjM1LCAyNjI2LCAyNjI1LCAyNjIzLCAyNjI4LCAxODIwLCAyNzUyLA0KKyAgICAyNzM5LCAyNzM3LCAyNzI4LCAyNzI3LCAyNzI1LCAyNzMwLCAyNzg1LCAyNzgzLCAyNzc4LCAyNzc3LCAyNzc1LCAyNzgwLA0KKyAgICA3ODcsICA3ODEsICA3NDcsICA3MzksICA3MzYsICAyNDEzLCA3NTQsICA3NTIsICAxNzE5LCA2OTIsICA2ODksICA2ODEsDQorICAgIDIzNzEsIDY3OCwgIDIzNjksIDcwMCwgIDY5NywgIDY5NCwgIDcwMywgIDE2ODgsIDE2ODYsIDY0MiwgIDYzOCwgIDIzNDMsDQorICAgIDYzMSwgIDIzNDEsIDYyNywgIDIzMzgsIDY1MSwgIDY0NiwgIDY0MywgIDIzNDUsIDY1NCwgIDY1MiwgIDE2NTIsIDE2NTAsDQorICAgIDE2NDcsIDE2NTQsIDYwMSwgIDU5OSwgIDIzMjIsIDU5NiwgIDIzMjEsIDU5NCwgIDIzMTksIDIzMTcsIDYxMSwgIDYxMCwNCisgICAgNjA4LCAgNjA2LCAgMjMyNCwgNjAzLCAgMjMyMywgNjE1LCAgNjE0LCAgNjEyLCAgMTYxNywgMTYxNiwgMTYxNCwgMTYxMiwNCisgICAgNjE2LCAgMTYxOSwgMTYxOCwgMjU3NSwgMjUzOCwgMjUzNiwgOTA1LCAgOTAxLCAgODk4LCAgOTA5LCAgMjUwOSwgMjUwNywNCisgICAgMjUwNCwgODcwLCAgODY3LCAgODY0LCAgODYwLCAgMjUxMiwgODc1LCAgODcyLCAgMTc4MSwgMjQ5MCwgMjQ4OSwgMjQ4NywNCisgICAgMjQ4NSwgMTc0OCwgODM2LCAgODM0LCAgODMyLCAgODMwLCAgMjQ5NCwgODI3LCAgMjQ5MiwgODQzLCAgODQxLCAgODM5LA0KKyAgICA4NDUsICAxNzY1LCAxNzYzLCAyNzAxLCAyNjc2LCAyNjc0LCAyNjUzLCAyNjQ4LCAyNjU2LCAyNjM0LCAyNjMzLCAyNjMxLA0KKyAgICAyNjI5LCAxODIxLCAyNjM4LCAyNjM2LCAyNzcwLCAyNzYzLCAyNzYxLCAyNzUwLCAyNzQ1LCAyNzUzLCAyNzM2LCAyNzM1LA0KKyAgICAyNzMzLCAyNzMxLCAxODQ4LCAyNzQwLCAyNzM4LCAyNzg2LCAyNzg0LCA1OTEsICA1ODgsICA1NzYsICA1NjksICA1NjYsDQorICAgIDIyOTYsIDE1OTAsIDUzNywgIDUzNCwgIDUyNiwgIDIyNzYsIDUyMiwgIDIyNzQsIDU0NSwgIDU0MiwgIDUzOSwgIDU0OCwNCisgICAgMTU3MiwgMTU3MCwgNDgxLCAgMjI0NSwgNDY2LCAgMjI0MiwgNDYyLCAgMjIzOSwgNDkyLCAgNDg1LCAgNDgyLCAgMjI0OSwNCisgICAgNDk2LCAgNDk0LCAgMTUzNCwgMTUzMSwgMTUyOCwgMTUzOCwgNDEzLCAgMjE5NiwgNDA2LCAgMjE5MSwgMjE4OCwgNDI1LA0KKyAgICA0MTksICAyMjAyLCA0MTUsICAyMTk5LCA0MzIsICA0MzAsICA0MjcsICAxNDcyLCAxNDY3LCAxNDY0LCA0MzMsICAxNDc2LA0KKyAgICAxNDc0LCAzNjgsICAzNjcsICAyMTYwLCAzNjUsICAyMTU5LCAzNjIsICAyMTU3LCAyMTU1LCAyMTUyLCAzNzgsICAzNzcsDQorICAgIDM3NSwgIDIxNjYsIDM3MiwgIDIxNjUsIDM2OSwgIDIxNjIsIDM4MywgIDM4MSwgIDM3OSwgIDIxNjgsIDE0MTksIDE0MTgsDQorICAgIDE0MTYsIDE0MTQsIDM4NSwgIDE0MTEsIDM4NCwgIDE0MjMsIDE0MjIsIDE0MjAsIDE0MjQsIDI0NjEsIDgwMiwgIDI0NDEsDQorICAgIDI0MzksIDc5MCwgIDc4NiwgIDc4MywgIDc5NCwgIDI0MDksIDI0MDYsIDI0MDMsIDc1MCwgIDc0MiwgIDczOCwgIDI0MTQsDQorICAgIDc1NiwgIDc1MywgIDE3MjAsIDIzNjcsIDIzNjUsIDIzNjIsIDIzNTksIDE2NjMsIDY5MywgIDY5MSwgIDY4NCwgIDIzNzMsDQorICAgIDY4MCwgIDIzNzAsIDcwMiwgIDY5OSwgIDY5NiwgIDcwNCwgIDE2OTAsIDE2ODcsIDIzMzcsIDIzMzYsIDIzMzQsIDIzMzIsDQorICAgIDE2MjQsIDIzMjksIDE2MjIsIDY0MCwgIDYzNywgIDIzNDQsIDYzNCwgIDIzNDIsIDYzMCwgIDIzNDAsIDY1MCwgIDY0OCwNCisgICAgNjQ1LCAgMjM0NiwgNjU1LCAgNjUzLCAgMTY1MywgMTY1MSwgMTY0OSwgMTY1NSwgMjYxMiwgMjU5NywgMjU5NSwgMjU3MSwNCisgICAgMjU2OCwgMjU2NSwgMjU3NiwgMjUzNCwgMjUyOSwgMjUyNiwgMTc4NywgMjU0MCwgMjUzNywgOTA3LCAgOTA0LCAgOTAwLA0KKyAgICA5MTAsICAyNTAzLCAyNTAyLCAyNTAwLCAyNDk4LCAxNzY4LCAyNDk1LCAxNzY3LCAyNTEwLCAyNTA4LCAyNTA2LCA4NjksDQorICAgIDg2NiwgIDg2MywgIDI1MTMsIDg3NiwgIDg3NCwgIDE3ODIsIDI3MjAsIDI3MTMsIDI3MTEsIDI2OTcsIDI2OTQsIDI2OTEsDQorICAgIDI3MDIsIDI2NzIsIDI2NzAsIDI2NjQsIDE4MjgsIDI2NzgsIDI2NzUsIDI2NDcsIDI2NDYsIDI2NDQsIDI2NDIsIDE4MjMsDQorICAgIDI2MzksIDE4MjIsIDI2NTQsIDI2NTIsIDI2NTAsIDI2NTcsIDI3NzEsIDE4NTUsIDI3NjUsIDI3NjIsIDE4NTAsIDE4NDksDQorICAgIDI3NTEsIDI3NDksIDI3NDcsIDI3NTQsIDM1MywgIDIxNDgsIDM0NCwgIDM0MiwgIDMzNiwgIDIxNDIsIDMzMiwgIDIxNDAsDQorICAgIDM0NSwgIDEzNzUsIDEzNzMsIDMwNiwgIDIxMzAsIDI5OSwgIDIxMjgsIDI5NSwgIDIxMjUsIDMxOSwgIDMxNCwgIDMxMSwNCisgICAgMjEzMiwgMTM1NCwgMTM1MiwgMTM0OSwgMTM1NiwgMjYyLCAgMjU3LCAgMjEwMSwgMjUzLCAgMjA5NiwgMjA5MywgMjc0LA0KKyAgICAyNzMsICAyNjcsICAyMTA3LCAyNjMsICAyMTA0LCAyODAsICAyNzgsICAyNzUsICAxMzE2LCAxMzExLCAxMzA4LCAxMzIwLA0KKyAgICAxMzE4LCAyMDUyLCAyMDIsICAyMDUwLCAyMDQ0LCAyMDQwLCAyMTksICAyMDYzLCAyMTIsICAyMDYwLCAyMDgsICAyMDU1LA0KKyAgICAyMjQsICAyMjEsICAyMDY2LCAxMjYwLCAxMjU4LCAxMjUyLCAyMzEsICAxMjQ4LCAyMjksICAxMjY2LCAxMjY0LCAxMjYxLA0KKyAgICAxMjY4LCAxNTUsICAxOTk4LCAxNTMsICAxOTk2LCAxOTk0LCAxOTkxLCAxOTg4LCAxNjUsICAxNjQsICAyMDA3LCAxNjIsDQorICAgIDIwMDYsIDE1OSwgIDIwMDMsIDIwMDAsIDE3MiwgIDE3MSwgIDE2OSwgIDIwMTIsIDE2NiwgIDIwMTAsIDExODYsIDExODQsDQorICAgIDExODIsIDExNzksIDE3NSwgIDExNzYsIDE3MywgIDExOTIsIDExOTEsIDExODksIDExODcsIDE3NiwgIDExOTQsIDExOTMsDQorICAgIDIzMTMsIDIzMDcsIDIzMDUsIDU5MiwgIDU4OSwgIDIyOTQsIDIyOTIsIDIyODksIDU3OCwgIDU3MiwgIDU2OCwgIDIyOTcsDQorICAgIDU4MCwgIDE1OTEsIDIyNzIsIDIyNjcsIDIyNjQsIDE1NDcsIDUzOCwgIDUzNiwgIDUyOSwgIDIyNzgsIDUyNSwgIDIyNzUsDQorICAgIDU0NywgIDU0NCwgIDU0MSwgIDE1NzQsIDE1NzEsIDIyMzcsIDIyMzUsIDIyMjksIDE0OTMsIDIyMjUsIDE0ODksIDQ3OCwNCisgICAgMjI0NywgNDcwLCAgMjI0NCwgNDY1LCAgMjI0MSwgNDkzLCAgNDg4LCAgNDg0LCAgMjI1MCwgNDk4LCAgNDk1LCAgMTUzNiwNCisgICAgMTUzMywgMTUzMCwgMTUzOSwgMjE4NywgMjE4NiwgMjE4NCwgMjE4MiwgMTQzMiwgMjE3OSwgMTQzMCwgMjE3NiwgMTQyNywNCisgICAgNDE0LCAgNDEyLCAgMjE5NywgNDA5LCAgMjE5NSwgNDA1LCAgMjE5MywgMjE5MCwgNDI2LCAgNDI0LCAgNDIxLCAgMjIwMywNCisgICAgNDE4LCAgMjIwMSwgNDMxLCAgNDI5LCAgMTQ3MywgMTQ3MSwgMTQ2OSwgMTQ2NiwgNDM0LCAgMTQ3NywgMTQ3NSwgMjQ3OCwNCisgICAgMjQ3MiwgMjQ3MCwgMjQ1OSwgMjQ1NywgMjQ1NCwgMjQ2MiwgODAzLCAgMjQzNywgMjQzMiwgMjQyOSwgMTcyNiwgMjQ0MywNCisgICAgMjQ0MCwgNzkyLCAgNzg5LCAgNzg1LCAgMjQwMSwgMjM5OSwgMjM5MywgMTcwMiwgMjM4OSwgMTY5OSwgMjQxMSwgMjQwOCwNCisgICAgMjQwNSwgNzQ1LCAgNzQxLCAgMjQxNSwgNzU4LCAgNzU1LCAgMTcyMSwgMjM1OCwgMjM1NywgMjM1NSwgMjM1MywgMTY2MSwNCisgICAgMjM1MCwgMTY2MCwgMjM0NywgMTY1NywgMjM2OCwgMjM2NiwgMjM2NCwgMjM2MSwgMTY2NiwgNjkwLCAgNjg3LCAgMjM3NCwNCisgICAgNjgzLCAgMjM3MiwgNzAxLCAgNjk4LCAgNzA1LCAgMTY5MSwgMTY4OSwgMjYxOSwgMjYxNywgMjYxMCwgMjYwOCwgMjYwNSwNCisgICAgMjYxMywgMjU5MywgMjU4OCwgMjU4NSwgMTgwMywgMjU5OSwgMjU5NiwgMjU2MywgMjU2MSwgMjU1NSwgMTc5NywgMjU1MSwNCisgICAgMTc5NSwgMjU3MywgMjU3MCwgMjU2NywgMjU3NywgMjUyNSwgMjUyNCwgMjUyMiwgMjUyMCwgMTc4NiwgMjUxNywgMTc4NSwNCisgICAgMjUxNCwgMTc4MywgMjUzNSwgMjUzMywgMjUzMSwgMjUyOCwgMTc4OCwgMjU0MSwgMjUzOSwgOTA2LCAgOTAzLCAgOTExLA0KKyAgICAyNzIxLCAxODQ0LCAyNzE1LCAyNzEyLCAxODM4LCAxODM2LCAyNjk5LCAyNjk2LCAyNjkzLCAyNzAzLCAxODI3LCAxODI2LA0KKyAgICAxODI0LCAyNjczLCAyNjcxLCAyNjY5LCAyNjY2LCAxODI5LCAyNjc5LCAyNjc3LCAxODU4LCAxODU3LCAyNzcyLCAxODU0LA0KKyAgICAxODUzLCAxODUxLCAxODU2LCAyNzY2LCAyNzY0LCAxNDMsICAxOTg3LCAxMzksICAxOTg2LCAxMzUsICAxMzMsICAxMzEsDQorICAgIDE5ODQsIDEyOCwgIDE5ODMsIDEyNSwgIDE5ODEsIDEzOCwgIDEzNywgIDEzNiwgIDE5ODUsIDExMzMsIDExMzIsIDExMzAsDQorICAgIDExMiwgIDExMCwgIDE5NzQsIDEwNywgIDE5NzMsIDEwNCwgIDE5NzEsIDE5NjksIDEyMiwgIDEyMSwgIDExOSwgIDExNywNCisgICAgMTk3NywgMTE0LCAgMTk3NiwgMTI0LCAgMTExNSwgMTExNCwgMTExMiwgMTExMCwgMTExNywgMTExNiwgODQsICAgODMsDQorICAgIDE5NTMsIDgxLCAgIDE5NTIsIDc4LCAgIDE5NTAsIDE5NDgsIDE5NDUsIDk0LCAgIDkzLCAgIDkxLCAgIDE5NTksIDg4LA0KKyAgICAxOTU4LCA4NSwgICAxOTU1LCA5OSwgICA5NywgICA5NSwgICAxOTYxLCAxMDg2LCAxMDg1LCAxMDgzLCAxMDgxLCAxMDc4LA0KKyAgICAxMDAsICAxMDkwLCAxMDg5LCAxMDg3LCAxMDkxLCA0OSwgICA0NywgICAxOTE3LCA0NCwgICAxOTE1LCAxOTEzLCAxOTEwLA0KKyAgICAxOTA3LCA1OSwgICAxOTI2LCA1NiwgICAxOTI1LCA1MywgICAxOTIyLCAxOTE5LCA2NiwgICA2NCwgICAxOTMxLCA2MSwNCisgICAgMTkyOSwgMTA0MiwgMTA0MCwgMTAzOCwgNzEsICAgMTAzNSwgNzAsICAgMTAzMiwgNjgsICAgMTA0OCwgMTA0NywgMTA0NSwNCisgICAgMTA0MywgMTA1MCwgMTA0OSwgMTIsICAgMTAsICAgMTg2OSwgMTg2NywgMTg2NCwgMTg2MSwgMjEsICAgMTg4MCwgMTksDQorICAgIDE4NzcsIDE4NzQsIDE4NzEsIDI4LCAgIDE4ODgsIDI1LCAgIDE4ODYsIDIyLCAgIDE4ODMsIDk4MiwgIDk4MCwgIDk3NywNCisgICAgOTc0LCAgMzIsICAgMzAsICAgOTkxLCAgOTg5LCAgOTg3LCAgOTg0LCAgMzQsICAgOTk1LCAgOTk0LCAgOTkyLCAgMjE1MSwNCisgICAgMjE1MCwgMjE0NywgMjE0NiwgMjE0NCwgMzU2LCAgMzU1LCAgMzU0LCAgMjE0OSwgMjEzOSwgMjEzOCwgMjEzNiwgMjEzNCwNCisgICAgMTM1OSwgMzQzLCAgMzQxLCAgMzM4LCAgMjE0MywgMzM1LCAgMjE0MSwgMzQ4LCAgMzQ3LCAgMzQ2LCAgMTM3NiwgMTM3NCwNCisgICAgMjEyNCwgMjEyMywgMjEyMSwgMjExOSwgMTMyNiwgMjExNiwgMTMyNCwgMzEwLCAgMzA4LCAgMzA1LCAgMjEzMSwgMzAyLA0KKyAgICAyMTI5LCAyOTgsICAyMTI3LCAzMjAsICAzMTgsICAzMTYsICAzMTMsICAyMTMzLCAzMjIsICAzMjEsICAxMzU1LCAxMzUzLA0KKyAgICAxMzUxLCAxMzU3LCAyMDkyLCAyMDkxLCAyMDg5LCAyMDg3LCAxMjc2LCAyMDg0LCAxMjc0LCAyMDgxLCAxMjcxLCAyNTksDQorICAgIDIxMDIsIDI1NiwgIDIxMDAsIDI1MiwgIDIwOTgsIDIwOTUsIDI3MiwgIDI2OSwgIDIxMDgsIDI2NiwgIDIxMDYsIDI4MSwNCisgICAgMjc5LCAgMjc3LCAgMTMxNywgMTMxNSwgMTMxMywgMTMxMCwgMjgyLCAgMTMyMSwgMTMxOSwgMjAzOSwgMjAzNywgMjAzNSwNCisgICAgMjAzMiwgMTIwMywgMjAyOSwgMTIwMCwgMTE5NywgMjA3LCAgMjA1MywgMjA1LCAgMjA1MSwgMjAxLCAgMjA0OSwgMjA0NiwNCisgICAgMjA0MywgMjIwLCAgMjE4LCAgMjA2NCwgMjE1LCAgMjA2MiwgMjExLCAgMjA1OSwgMjI4LCAgMjI2LCAgMjIzLCAgMjA2OSwNCisgICAgMTI1OSwgMTI1NywgMTI1NCwgMjMyLCAgMTI1MSwgMjMwLCAgMTI2NywgMTI2NSwgMTI2MywgMjMxNiwgMjMxNSwgMjMxMiwNCisgICAgMjMxMSwgMjMwOSwgMjMxNCwgMjMwNCwgMjMwMywgMjMwMSwgMjI5OSwgMTU5MywgMjMwOCwgMjMwNiwgNTkwLCAgMjI4OCwNCisgICAgMjI4NywgMjI4NSwgMjI4MywgMTU3OCwgMjI4MCwgMTU3NywgMjI5NSwgMjI5MywgMjI5MSwgNTc5LCAgNTc3LCAgNTc0LA0KKyAgICA1NzEsICAyMjk4LCA1ODIsICA1ODEsICAxNTkyLCAyMjYzLCAyMjYyLCAyMjYwLCAyMjU4LCAxNTQ1LCAyMjU1LCAxNTQ0LA0KKyAgICAyMjUyLCAxNTQxLCAyMjczLCAyMjcxLCAyMjY5LCAyMjY2LCAxNTUwLCA1MzUsICA1MzIsICAyMjc5LCA1MjgsICAyMjc3LA0KKyAgICA1NDYsICA1NDMsICA1NDksICAxNTc1LCAxNTczLCAyMjI0LCAyMjIyLCAyMjIwLCAxNDg2LCAyMjE3LCAxNDg1LCAyMjE0LA0KKyAgICAxNDgyLCAxNDc5LCAyMjM4LCAyMjM2LCAyMjM0LCAyMjMxLCAxNDk2LCAyMjI4LCAxNDkyLCA0ODAsICA0NzcsICAyMjQ4LA0KKyAgICA0NzMsICAyMjQ2LCA0NjksICAyMjQzLCA0OTAsICA0ODcsICAyMjUxLCA0OTcsICAxNTM3LCAxNTM1LCAxNTMyLCAyNDc3LA0KKyAgICAyNDc2LCAyNDc0LCAyNDc5LCAyNDY5LCAyNDY4LCAyNDY2LCAyNDY0LCAxNzMwLCAyNDczLCAyNDcxLCAyNDUzLCAyNDUyLA0KKyAgICAyNDUwLCAyNDQ4LCAxNzI5LCAyNDQ1LCAxNzI4LCAyNDYwLCAyNDU4LCAyNDU2LCAyNDYzLCA4MDUsICA4MDQsICAyNDI4LA0KKyAgICAyNDI3LCAyNDI1LCAyNDIzLCAxNzI1LCAyNDIwLCAxNzI0LCAyNDE3LCAxNzIyLCAyNDM4LCAyNDM2LCAyNDM0LCAyNDMxLA0KKyAgICAxNzI3LCAyNDQ0LCAyNDQyLCA3OTMsICA3OTEsICA3ODgsICA3OTUsICAyMzg4LCAyMzg2LCAyMzg0LCAxNjk3LCAyMzgxLA0KKyAgICAxNjk2LCAyMzc4LCAxNjk0LCAxNjkyLCAyNDAyLCAyNDAwLCAyMzk4LCAyMzk1LCAxNzAzLCAyMzkyLCAxNzAxLCAyNDEyLA0KKyAgICAyNDEwLCAyNDA3LCA3NTEsICA3NDgsICA3NDQsICAyNDE2LCA3NTksICA3NTcsICAxODA3LCAyNjIwLCAyNjE4LCAxODA2LA0KKyAgICAxODA1LCAyNjExLCAyNjA5LCAyNjA3LCAyNjE0LCAxODAyLCAxODAxLCAxNzk5LCAyNTk0LCAyNTkyLCAyNTkwLCAyNTg3LA0KKyAgICAxODA0LCAyNjAwLCAyNTk4LCAxNzk0LCAxNzkzLCAxNzkxLCAxNzg5LCAyNTY0LCAyNTYyLCAyNTYwLCAyNTU3LCAxNzk4LA0KKyAgICAyNTU0LCAxNzk2LCAyNTc0LCAyNTcyLCAyNTY5LCAyNTc4LCAxODQ3LCAxODQ2LCAyNzIyLCAxODQzLCAxODQyLCAxODQwLA0KKyAgICAxODQ1LCAyNzE2LCAyNzE0LCAxODM1LCAxODM0LCAxODMyLCAxODMwLCAxODM5LCAxODM3LCAyNzAwLCAyNjk4LCAyNjk1LA0KKyAgICAyNzA0LCAxODE3LCAxODExLCAxODEwLCA4OTcsICA4NjIsICAxNzc3LCA4MjksICA4MjYsICA4MzgsICAxNzYwLCAxNzU4LA0KKyAgICA4MDgsICAyNDgxLCAxNzQxLCAxNzQwLCAxNzM4LCAxNzQzLCAyNjI0LCAxODE4LCAyNzI2LCAyNzc2LCA3ODIsICA3NDAsDQorICAgIDczNywgIDE3MTUsIDY4NiwgIDY3OSwgIDY5NSwgIDE2ODIsIDE2ODAsIDYzOSwgIDYyOCwgIDIzMzksIDY0NywgIDY0NCwNCisgICAgMTY0NSwgMTY0MywgMTY0MCwgMTY0OCwgNjAyLCAgNjAwLCAgNTk3LCAgNTk1LCAgMjMyMCwgNTkzLCAgMjMxOCwgNjA5LA0KKyAgICA2MDcsICA2MDQsICAxNjExLCAxNjEwLCAxNjA4LCAxNjA2LCA2MTMsICAxNjE1LCAxNjEzLCAyMzI4LCA5MjYsICA5MjQsDQorICAgIDg5MiwgIDg4NiwgIDg5OSwgIDg1NywgIDg1MCwgIDI1MDUsIDE3NzgsIDgyNCwgIDgyMywgIDgyMSwgIDgxOSwgIDI0ODgsDQorICAgIDgxOCwgIDI0ODYsIDgzMywgIDgzMSwgIDgyOCwgIDg0MCwgIDE3NjEsIDE3NTksIDI2NDksIDI2MzIsIDI2MzAsIDI3NDYsDQorICAgIDI3MzQsIDI3MzIsIDI3ODIsIDI3ODEsIDU3MCwgIDU2NywgIDE1ODcsIDUzMSwgIDUyNywgIDUyMywgIDU0MCwgIDE1NjYsDQorICAgIDE1NjQsIDQ3NiwgIDQ2NywgIDQ2MywgIDIyNDAsIDQ4NiwgIDQ4MywgIDE1MjQsIDE1MjEsIDE1MTgsIDE1MjksIDQxMSwNCisgICAgNDAzLCAgMjE5MiwgMzk5LCAgMjE4OSwgNDIzLCAgNDE2LCAgMTQ2MiwgMTQ1NywgMTQ1NCwgNDI4LCAgMTQ2OCwgMTQ2NSwNCisgICAgMjIxMCwgMzY2LCAgMzYzLCAgMjE1OCwgMzYwLCAgMjE1NiwgMzU3LCAgMjE1MywgMzc2LCAgMzczLCAgMzcwLCAgMjE2MywNCisgICAgMTQxMCwgMTQwOSwgMTQwNywgMTQwNSwgMzgyLCAgMTQwMiwgMzgwLCAgMTQxNywgMTQxNSwgMTQxMiwgMTQyMSwgMjE3NSwNCisgICAgMjE3NCwgNzc3LCAgNzc0LCAgNzcxLCAgNzg0LCAgNzMyLCAgNzI1LCAgNzIyLCAgMjQwNCwgNzQzLCAgMTcxNiwgNjc2LA0KKyAgICA2NzQsICA2NjgsICAyMzYzLCA2NjUsICAyMzYwLCA2ODUsICAxNjg0LCAxNjgxLCA2MjYsICA2MjQsICA2MjIsICAyMzM1LA0KKyAgICA2MjAsICAyMzMzLCA2MTcsICAyMzMwLCA2NDEsICA2MzUsICA2NDksICAxNjQ2LCAxNjQ0LCAxNjQyLCAyNTY2LCA5MjgsDQorICAgIDkyNSwgIDI1MzAsIDI1MjcsIDg5NCwgIDg5MSwgIDg4OCwgIDI1MDEsIDI0OTksIDI0OTYsIDg1OCwgIDg1NiwgIDg1NCwNCisgICAgODUxLCAgMTc3OSwgMjY5MiwgMjY2OCwgMjY2NSwgMjY0NSwgMjY0MywgMjY0MCwgMjY1MSwgMjc2OCwgMjc1OSwgMjc1NywNCisgICAgMjc0NCwgMjc0MywgMjc0MSwgMjc0OCwgMzUyLCAgMTM4MiwgMzQwLCAgMzM3LCAgMzMzLCAgMTM3MSwgMTM2OSwgMzA3LA0KKyAgICAzMDAsICAyOTYsICAyMTI2LCAzMTUsICAzMTIsICAxMzQ3LCAxMzQyLCAxMzUwLCAyNjEsICAyNTgsICAyNTAsICAyMDk3LA0KKyAgICAyNDYsICAyMDk0LCAyNzEsICAyNjgsICAyNjQsICAxMzA2LCAxMzAxLCAxMjk4LCAyNzYsICAxMzEyLCAxMzA5LCAyMTE1LA0KKyAgICAyMDMsICAyMDQ4LCAxOTUsICAyMDQ1LCAxOTEsICAyMDQxLCAyMTMsICAyMDksICAyMDU2LCAxMjQ2LCAxMjQ0LCAxMjM4LA0KKyAgICAyMjUsICAxMjM0LCAyMjIsICAxMjU2LCAxMjUzLCAxMjQ5LCAxMjYyLCAyMDgwLCAyMDc5LCAxNTQsICAxOTk3LCAxNTAsDQorICAgIDE5OTUsIDE0NywgIDE5OTIsIDE5ODksIDE2MywgIDE2MCwgIDIwMDQsIDE1NiwgIDIwMDEsIDExNzUsIDExNzQsIDExNzIsDQorICAgIDExNzAsIDExNjcsIDE3MCwgIDExNjQsIDE2NywgIDExODUsIDExODMsIDExODAsIDExNzcsIDE3NCwgIDExOTAsIDExODgsDQorICAgIDIwMjUsIDIwMjQsIDIwMjIsIDU4NywgIDU4NiwgIDU2NCwgIDU1OSwgIDU1NiwgIDIyOTAsIDU3MywgIDE1ODgsIDUyMCwNCisgICAgNTE4LCAgNTEyLCAgMjI2OCwgNTA4LCAgMjI2NSwgNTMwLCAgMTU2OCwgMTU2NSwgNDYxLCAgNDU3LCAgMjIzMywgNDUwLA0KKyAgICAyMjMwLCA0NDYsICAyMjI2LCA0NzksICA0NzEsICA0ODksICAxNTI2LCAxNTIzLCAxNTIwLCAzOTcsICAzOTUsICAyMTg1LA0KKyAgICAzOTIsICAyMTgzLCAzODksICAyMTgwLCAyMTc3LCA0MTAsICAyMTk0LCA0MDIsICA0MjIsICAxNDYzLCAxNDYxLCAxNDU5LA0KKyAgICAxNDU2LCAxNDcwLCAyNDU1LCA3OTksICAyNDMzLCAyNDMwLCA3NzksICA3NzYsICA3NzMsICAyMzk3LCAyMzk0LCAyMzkwLA0KKyAgICA3MzQsICA3MjgsICA3MjQsICA3NDYsICAxNzE3LCAyMzU2LCAyMzU0LCAyMzUxLCAyMzQ4LCAxNjU4LCA2NzcsICA2NzUsDQorICAgIDY3MywgIDY3MCwgIDY2NywgIDY4OCwgIDE2ODUsIDE2ODMsIDI2MDYsIDI1ODksIDI1ODYsIDI1NTksIDI1NTYsIDI1NTIsDQorICAgIDkyNywgIDI1MjMsIDI1MjEsIDI1MTgsIDI1MTUsIDE3ODQsIDI1MzIsIDg5NSwgIDg5MywgIDg5MCwgIDI3MTgsIDI3MDksDQorICAgIDI3MDcsIDI2ODksIDI2ODcsIDI2ODQsIDI2NjMsIDI2NjIsIDI2NjAsIDI2NTgsIDE4MjUsIDI2NjcsIDI3NjksIDE4NTIsDQorICAgIDI3NjAsIDI3NTgsIDE0MiwgIDE0MSwgIDExMzksIDExMzgsIDEzNCwgIDEzMiwgIDEyOSwgIDEyNiwgIDE5ODIsIDExMjksDQorICAgIDExMjgsIDExMjYsIDExMzEsIDExMywgIDExMSwgIDEwOCwgIDEwNSwgIDE5NzIsIDEwMSwgIDE5NzAsIDEyMCwgIDExOCwNCisgICAgMTE1LCAgMTEwOSwgMTEwOCwgMTEwNiwgMTEwNCwgMTIzLCAgMTExMywgMTExMSwgODIsICAgNzksICAgMTk1MSwgNzUsDQorICAgIDE5NDksIDcyLCAgIDE5NDYsIDkyLCAgIDg5LCAgIDg2LCAgIDE5NTYsIDEwNzcsIDEwNzYsIDEwNzQsIDEwNzIsIDk4LA0KKyAgICAxMDY5LCA5NiwgICAxMDg0LCAxMDgyLCAxMDc5LCAxMDg4LCAxOTY4LCAxOTY3LCA0OCwgICA0NSwgICAxOTE2LCA0MiwNCisgICAgMTkxNCwgMzksICAgMTkxMSwgMTkwOCwgNjAsICAgNTcsICAgNTQsICAgMTkyMywgNTAsICAgMTkyMCwgMTAzMSwgMTAzMCwNCisgICAgMTAyOCwgMTAyNiwgNjcsICAgMTAyMywgNjUsICAgMTAyMCwgNjIsICAgMTA0MSwgMTAzOSwgMTAzNiwgMTAzMywgNjksDQorICAgIDEwNDYsIDEwNDQsIDE5NDQsIDE5NDMsIDE5NDEsIDExLCAgIDksICAgIDE4NjgsIDcsICAgIDE4NjUsIDE4NjIsIDE4NTksDQorICAgIDIwLCAgIDE4NzgsIDE2LCAgIDE4NzUsIDEzLCAgIDE4NzIsIDk3MCwgIDk2OCwgIDk2NiwgIDk2MywgIDI5LCAgIDk2MCwNCisgICAgMjYsICAgMjMsICAgOTgzLCAgOTgxLCAgOTc4LCAgOTc1LCAgMzMsICAgOTcxLCAgMzEsICAgOTkwLCAgOTg4LCAgOTg1LA0KKyAgICAxOTA2LCAxOTA0LCAxOTAyLCA5OTMsICAzNTEsICAyMTQ1LCAxMzgzLCAzMzEsICAzMzAsICAzMjgsICAzMjYsICAyMTM3LA0KKyAgICAzMjMsICAyMTM1LCAzMzksICAxMzcyLCAxMzcwLCAyOTQsICAyOTMsICAyOTEsICAyODksICAyMTIyLCAyODYsICAyMTIwLA0KKyAgICAyODMsICAyMTE3LCAzMDksICAzMDMsICAzMTcsICAxMzQ4LCAxMzQ2LCAxMzQ0LCAyNDUsICAyNDQsICAyNDIsICAyMDkwLA0KKyAgICAyMzksICAyMDg4LCAyMzYsICAyMDg1LCAyMDgyLCAyNjAsICAyMDk5LCAyNDksICAyNzAsICAxMzA3LCAxMzA1LCAxMzAzLA0KKyAgICAxMzAwLCAxMzE0LCAxODksICAyMDM4LCAxODYsICAyMDM2LCAxODMsICAyMDMzLCAyMDMwLCAyMDI2LCAyMDYsICAxOTgsDQorICAgIDIwNDcsIDE5NCwgIDIxNiwgIDEyNDcsIDEyNDUsIDEyNDMsIDEyNDAsIDIyNywgIDEyMzcsIDEyNTUsIDIzMTAsIDIzMDIsDQorICAgIDIzMDAsIDIyODYsIDIyODQsIDIyODEsIDU2NSwgIDU2MywgIDU2MSwgIDU1OCwgIDU3NSwgIDE1ODksIDIyNjEsIDIyNTksDQorICAgIDIyNTYsIDIyNTMsIDE1NDIsIDUyMSwgIDUxOSwgIDUxNywgIDUxNCwgIDIyNzAsIDUxMSwgIDUzMywgIDE1NjksIDE1NjcsDQorICAgIDIyMjMsIDIyMjEsIDIyMTgsIDIyMTUsIDE0ODMsIDIyMTEsIDE0ODAsIDQ1OSwgIDQ1NiwgIDQ1MywgIDIyMzIsIDQ0OSwNCisgICAgNDc0LCAgNDkxLCAgMTUyNywgMTUyNSwgMTUyMiwgMjQ3NSwgMjQ2NywgMjQ2NSwgMjQ1MSwgMjQ0OSwgMjQ0NiwgODAxLA0KKyAgICA4MDAsICAyNDI2LCAyNDI0LCAyNDIxLCAyNDE4LCAxNzIzLCAyNDM1LCA3ODAsICA3NzgsICA3NzUsICAyMzg3LCAyMzg1LA0KKyAgICAyMzgyLCAyMzc5LCAxNjk1LCAyMzc1LCAxNjkzLCAyMzk2LCA3MzUsICA3MzMsICA3MzAsICA3MjcsICA3NDksICAxNzE4LA0KKyAgICAyNjE2LCAyNjE1LCAyNjA0LCAyNjAzLCAyNjAxLCAyNTg0LCAyNTgzLCAyNTgxLCAyNTc5LCAxODAwLCAyNTkxLCAyNTUwLA0KKyAgICAyNTQ5LCAyNTQ3LCAyNTQ1LCAxNzkyLCAyNTQyLCAxNzkwLCAyNTU4LCA5MjksICAyNzE5LCAxODQxLCAyNzEwLCAyNzA4LA0KKyAgICAxODMzLCAxODMxLCAyNjkwLCAyNjg4LCAyNjg2LCAxODE1LCAxODA5LCAxODA4LCAxNzc0LCAxNzU2LCAxNzU0LCAxNzM3LA0KKyAgICAxNzM2LCAxNzM0LCAxNzM5LCAxODE2LCAxNzExLCAxNjc2LCAxNjc0LCA2MzMsICA2MjksICAxNjM4LCAxNjM2LCAxNjMzLA0KKyAgICAxNjQxLCA1OTgsICAxNjA1LCAxNjA0LCAxNjAyLCAxNjAwLCA2MDUsICAxNjA5LCAxNjA3LCAyMzI3LCA4ODcsICA4NTMsDQorICAgIDE3NzUsIDgyMiwgIDgyMCwgIDE3NTcsIDE3NTUsIDE1ODQsIDUyNCwgIDE1NjAsIDE1NTgsIDQ2OCwgIDQ2NCwgIDE1MTQsDQorICAgIDE1MTEsIDE1MDgsIDE1MTksIDQwOCwgIDQwNCwgIDQwMCwgIDE0NTIsIDE0NDcsIDE0NDQsIDQxNywgIDE0NTgsIDE0NTUsDQorICAgIDIyMDgsIDM2NCwgIDM2MSwgIDM1OCwgIDIxNTQsIDE0MDEsIDE0MDAsIDEzOTgsIDEzOTYsIDM3NCwgIDEzOTMsIDM3MSwNCisgICAgMTQwOCwgMTQwNiwgMTQwMywgMTQxMywgMjE3MywgMjE3MiwgNzcyLCAgNzI2LCAgNzIzLCAgMTcxMiwgNjcyLCAgNjY5LA0KKyAgICA2NjYsICA2ODIsICAxNjc4LCAxNjc1LCA2MjUsICA2MjMsICA2MjEsICA2MTgsICAyMzMxLCA2MzYsICA2MzIsICAxNjM5LA0KKyAgICAxNjM3LCAxNjM1LCA5MjAsICA5MTgsICA4ODQsICA4ODAsICA4ODksICA4NDksICA4NDgsICA4NDcsICA4NDYsICAyNDk3LA0KKyAgICA4NTUsICA4NTIsICAxNzc2LCAyNjQxLCAyNzQyLCAyNzg3LCAxMzgwLCAzMzQsICAxMzY3LCAxMzY1LCAzMDEsICAyOTcsDQorICAgIDEzNDAsIDEzMzgsIDEzMzUsIDEzNDMsIDI1NSwgIDI1MSwgIDI0NywgIDEyOTYsIDEyOTEsIDEyODgsIDI2NSwgIDEzMDIsDQorICAgIDEyOTksIDIxMTMsIDIwNCwgIDE5NiwgIDE5MiwgIDIwNDIsIDEyMzIsIDEyMzAsIDEyMjQsIDIxNCwgIDEyMjAsIDIxMCwNCisgICAgMTI0MiwgMTIzOSwgMTIzNSwgMTI1MCwgMjA3NywgMjA3NSwgMTUxLCAgMTQ4LCAgMTk5MywgMTQ0LCAgMTk5MCwgMTE2MywNCisgICAgMTE2MiwgMTE2MCwgMTE1OCwgMTE1NSwgMTYxLCAgMTE1MiwgMTU3LCAgMTE3MywgMTE3MSwgMTE2OCwgMTE2NSwgMTY4LA0KKyAgICAxMTgxLCAxMTc4LCAyMDIxLCAyMDIwLCAyMDE4LCAyMDIzLCA1ODUsICA1NjAsICA1NTcsICAxNTg1LCA1MTYsICA1MDksDQorICAgIDE1NjIsIDE1NTksIDQ1OCwgIDQ0NywgIDIyMjcsIDQ3MiwgIDE1MTYsIDE1MTMsIDE1MTAsIDM5OCwgIDM5NiwgIDM5MywNCisgICAgMzkwLCAgMjE4MSwgMzg2LCAgMjE3OCwgNDA3LCAgMTQ1MywgMTQ1MSwgMTQ0OSwgMTQ0NiwgNDIwLCAgMTQ2MCwgMjIwOSwNCisgICAgNzY5LCAgNzY0LCAgNzIwLCAgNzEyLCAgMjM5MSwgNzI5LCAgMTcxMywgNjY0LCAgNjYzLCAgNjYxLCAgNjU5LCAgMjM1MiwNCisgICAgNjU2LCAgMjM0OSwgNjcxLCAgMTY3OSwgMTY3NywgMjU1MywgOTIyLCAgOTE5LCAgMjUxOSwgMjUxNiwgODg1LCAgODgzLA0KKyAgICA4ODEsICAyNjg1LCAyNjYxLCAyNjU5LCAyNzY3LCAyNzU2LCAyNzU1LCAxNDAsICAxMTM3LCAxMTM2LCAxMzAsICAxMjcsDQorICAgIDExMjUsIDExMjQsIDExMjIsIDExMjcsIDEwOSwgIDEwNiwgIDEwMiwgIDExMDMsIDExMDIsIDExMDAsIDEwOTgsIDExNiwNCisgICAgMTEwNywgMTEwNSwgMTk4MCwgODAsICAgNzYsICAgNzMsICAgMTk0NywgMTA2OCwgMTA2NywgMTA2NSwgMTA2MywgOTAsDQorICAgIDEwNjAsIDg3LCAgIDEwNzUsIDEwNzMsIDEwNzAsIDEwODAsIDE5NjYsIDE5NjUsIDQ2LCAgIDQzLCAgIDQwLCAgIDE5MTIsDQorICAgIDM2LCAgIDE5MDksIDEwMTksIDEwMTgsIDEwMTYsIDEwMTQsIDU4LCAgIDEwMTEsIDU1LCAgIDEwMDgsIDUxLCAgIDEwMjksDQorICAgIDEwMjcsIDEwMjQsIDEwMjEsIDYzLCAgIDEwMzcsIDEwMzQsIDE5NDAsIDE5MzksIDE5MzcsIDE5NDIsIDgsICAgIDE4NjYsDQorICAgIDQsICAgIDE4NjMsIDEsICAgIDE4NjAsIDk1NiwgIDk1NCwgIDk1MiwgIDk0OSwgIDk0NiwgIDE3LCAgIDE0LCAgIDk2OSwNCisgICAgOTY3LCAgOTY0LCAgOTYxLCAgMjcsICAgOTU3LCAgMjQsICAgOTc5LCAgOTc2LCAgOTcyLCAgMTkwMSwgMTkwMCwgMTg5OCwNCisgICAgMTg5NiwgOTg2LCAgMTkwNSwgMTkwMywgMzUwLCAgMzQ5LCAgMTM4MSwgMzI5LCAgMzI3LCAgMzI0LCAgMTM2OCwgMTM2NiwNCisgICAgMjkyLCAgMjkwLCAgMjg3LCAgMjg0LCAgMjExOCwgMzA0LCAgMTM0MSwgMTMzOSwgMTMzNywgMTM0NSwgMjQzLCAgMjQwLA0KKyAgICAyMzcsICAyMDg2LCAyMzMsICAyMDgzLCAyNTQsICAxMjk3LCAxMjk1LCAxMjkzLCAxMjkwLCAxMzA0LCAyMTE0LCAxOTAsDQorICAgIDE4NywgIDE4NCwgIDIwMzQsIDE4MCwgIDIwMzEsIDE3NywgIDIwMjcsIDE5OSwgIDEyMzMsIDEyMzEsIDEyMjksIDEyMjYsDQorICAgIDIxNywgIDEyMjMsIDEyNDEsIDIwNzgsIDIwNzYsIDU4NCwgIDU1NSwgIDU1NCwgIDU1MiwgIDU1MCwgIDIyODIsIDU2MiwNCisgICAgMTU4NiwgNTA3LCAgNTA2LCAgNTA0LCAgNTAyLCAgMjI1NywgNDk5LCAgMjI1NCwgNTE1LCAgMTU2MywgMTU2MSwgNDQ1LA0KKyAgICA0NDMsICA0NDEsICAyMjE5LCA0MzgsICAyMjE2LCA0MzUsICAyMjEyLCA0NjAsICA0NTQsICA0NzUsICAxNTE3LCAxNTE1LA0KKyAgICAxNTEyLCAyNDQ3LCA3OTgsICA3OTcsICAyNDIyLCAyNDE5LCA3NzAsICA3NjgsICA3NjYsICAyMzgzLCAyMzgwLCAyMzc2LA0KKyAgICA3MjEsICA3MTksICA3MTcsICA3MTQsICA3MzEsICAxNzE0LCAyNjAyLCAyNTgyLCAyNTgwLCAyNTQ4LCAyNTQ2LCAyNTQzLA0KKyAgICA5MjMsICA5MjEsICAyNzE3LCAyNzA2LCAyNzA1LCAyNjgzLCAyNjgyLCAyNjgwLCAxNzcxLCAxNzUyLCAxNzUwLCAxNzMzLA0KKyAgICAxNzMyLCAxNzMxLCAxNzM1LCAxODE0LCAxNzA3LCAxNjcwLCAxNjY4LCAxNjMxLCAxNjI5LCAxNjI2LCAxNjM0LCAxNTk5LA0KKyAgICAxNTk4LCAxNTk2LCAxNTk0LCAxNjAzLCAxNjAxLCAyMzI2LCAxNzcyLCAxNzUzLCAxNzUxLCAxNTgxLCAxNTU0LCAxNTUyLA0KKyAgICAxNTA0LCAxNTAxLCAxNDk4LCAxNTA5LCAxNDQyLCAxNDM3LCAxNDM0LCA0MDEsICAxNDQ4LCAxNDQ1LCAyMjA2LCAxMzkyLA0KKyAgICAxMzkxLCAxMzg5LCAxMzg3LCAxMzg0LCAzNTksICAxMzk5LCAxMzk3LCAxMzk0LCAxNDA0LCAyMTcxLCAyMTcwLCAxNzA4LA0KKyAgICAxNjcyLCAxNjY5LCA2MTksICAxNjMyLCAxNjMwLCAxNjI4LCAxNzczLCAxMzc4LCAxMzYzLCAxMzYxLCAxMzMzLCAxMzI4LA0KKyAgICAxMzM2LCAxMjg2LCAxMjgxLCAxMjc4LCAyNDgsICAxMjkyLCAxMjg5LCAyMTExLCAxMjE4LCAxMjE2LCAxMjEwLCAxOTcsDQorICAgIDEyMDYsIDE5MywgIDEyMjgsIDEyMjUsIDEyMjEsIDEyMzYsIDIwNzMsIDIwNzEsIDExNTEsIDExNTAsIDExNDgsIDExNDYsDQorICAgIDE1MiwgIDExNDMsIDE0OSwgIDExNDAsIDE0NSwgIDExNjEsIDExNTksIDExNTYsIDExNTMsIDE1OCwgIDExNjksIDExNjYsDQorICAgIDIwMTcsIDIwMTYsIDIwMTQsIDIwMTksIDE1ODIsIDUxMCwgIDE1NTYsIDE1NTMsIDQ1MiwgIDQ0OCwgIDE1MDYsIDE1MDAsDQorICAgIDM5NCwgIDM5MSwgIDM4NywgIDE0NDMsIDE0NDEsIDE0MzksIDE0MzYsIDE0NTAsIDIyMDcsIDc2NSwgIDcxNiwgIDcxMywNCisgICAgMTcwOSwgNjYyLCAgNjYwLCAgNjU3LCAgMTY3MywgMTY3MSwgOTE2LCAgOTE0LCAgODc5LCAgODc4LCAgODc3LCAgODgyLA0KKyAgICAxMTM1LCAxMTM0LCAxMTIxLCAxMTIwLCAxMTE4LCAxMTIzLCAxMDk3LCAxMDk2LCAxMDk0LCAxMDkyLCAxMDMsICAxMTAxLA0KKyAgICAxMDk5LCAxOTc5LCAxMDU5LCAxMDU4LCAxMDU2LCAxMDU0LCA3NywgICAxMDUxLCA3NCwgICAxMDY2LCAxMDY0LCAxMDYxLA0KKyAgICAxMDcxLCAxOTY0LCAxOTYzLCAxMDA3LCAxMDA2LCAxMDA0LCAxMDAyLCA5OTksICA0MSwgICA5OTYsICAzNywgICAxMDE3LA0KKyAgICAxMDE1LCAxMDEyLCAxMDA5LCA1MiwgICAxMDI1LCAxMDIyLCAxOTM2LCAxOTM1LCAxOTMzLCAxOTM4LCA5NDIsICA5NDAsDQorICAgIDkzOCwgIDkzNSwgIDkzMiwgIDUsICAgIDIsICAgIDk1NSwgIDk1MywgIDk1MCwgIDk0NywgIDE4LCAgIDk0MywgIDE1LA0KKyAgICA5NjUsICA5NjIsICA5NTgsICAxODk1LCAxODk0LCAxODkyLCAxODkwLCA5NzMsICAxODk5LCAxODk3LCAxMzc5LCAzMjUsDQorICAgIDEzNjQsIDEzNjIsIDI4OCwgIDI4NSwgIDEzMzQsIDEzMzIsIDEzMzAsIDI0MSwgIDIzOCwgIDIzNCwgIDEyODcsIDEyODUsDQorICAgIDEyODMsIDEyODAsIDEyOTQsIDIxMTIsIDE4OCwgIDE4NSwgIDE4MSwgIDE3OCwgIDIwMjgsIDEyMTksIDEyMTcsIDEyMTUsDQorICAgIDEyMTIsIDIwMCwgIDEyMDksIDEyMjcsIDIwNzQsIDIwNzIsIDU4MywgIDU1MywgIDU1MSwgIDE1ODMsIDUwNSwgIDUwMywNCisgICAgNTAwLCAgNTEzLCAgMTU1NywgMTU1NSwgNDQ0LCAgNDQyLCAgNDM5LCAgNDM2LCAgMjIxMywgNDU1LCAgNDUxLCAgMTUwNywNCisgICAgMTUwNSwgMTUwMiwgNzk2LCAgNzYzLCAgNzYyLCAgNzYwLCAgNzY3LCAgNzExLCAgNzEwLCAgNzA4LCAgNzA2LCAgMjM3NywNCisgICAgNzE4LCAgNzE1LCAgMTcxMCwgMjU0NCwgOTE3LCAgOTE1LCAgMjY4MSwgMTYyNywgMTU5NywgMTU5NSwgMjMyNSwgMTc2OSwNCisgICAgMTc0OSwgMTc0NywgMTQ5OSwgMTQzOCwgMTQzNSwgMjIwNCwgMTM5MCwgMTM4OCwgMTM4NSwgMTM5NSwgMjE2OSwgMjE2NywNCisgICAgMTcwNCwgMTY2NSwgMTY2MiwgMTYyNSwgMTYyMywgMTYyMCwgMTc3MCwgMTMyOSwgMTI4MiwgMTI3OSwgMjEwOSwgMTIxNCwNCisgICAgMTIwNywgMTIyMiwgMjA2OCwgMjA2NSwgMTE0OSwgMTE0NywgMTE0NCwgMTE0MSwgMTQ2LCAgMTE1NywgMTE1NCwgMjAxMywNCisgICAgMjAxMSwgMjAwOCwgMjAxNSwgMTU3OSwgMTU0OSwgMTU0NiwgMTQ5NSwgMTQ4NywgMTQzMywgMTQzMSwgMTQyOCwgMTQyNSwNCisgICAgMzg4LCAgMTQ0MCwgMjIwNSwgMTcwNSwgNjU4LCAgMTY2NywgMTY2NCwgMTExOSwgMTA5NSwgMTA5MywgMTk3OCwgMTA1NywNCisgICAgMTA1NSwgMTA1MiwgMTA2MiwgMTk2MiwgMTk2MCwgMTAwNSwgMTAwMywgMTAwMCwgOTk3LCAgMzgsICAgMTAxMywgMTAxMCwNCisgICAgMTkzMiwgMTkzMCwgMTkyNywgMTkzNCwgOTQxLCAgOTM5LCAgOTM2LCAgOTMzLCAgNiwgICAgOTMwLCAgMywgICAgOTUxLA0KKyAgICA5NDgsICA5NDQsICAxODg5LCAxODg3LCAxODg0LCAxODgxLCA5NTksICAxODkzLCAxODkxLCAzNSwgICAxMzc3LCAxMzYwLA0KKyAgICAxMzU4LCAxMzI3LCAxMzI1LCAxMzIyLCAxMzMxLCAxMjc3LCAxMjc1LCAxMjcyLCAxMjY5LCAyMzUsICAxMjg0LCAyMTEwLA0KKyAgICAxMjA1LCAxMjA0LCAxMjAxLCAxMTk4LCAxODIsICAxMTk1LCAxNzksICAxMjEzLCAyMDcwLCAyMDY3LCAxNTgwLCA1MDEsDQorICAgIDE1NTEsIDE1NDgsIDQ0MCwgIDQzNywgIDE0OTcsIDE0OTQsIDE0OTAsIDE1MDMsIDc2MSwgIDcwOSwgIDcwNywgIDE3MDYsDQorICAgIDkxMywgIDkxMiwgIDIxOTgsIDEzODYsIDIxNjQsIDIxNjEsIDE2MjEsIDE3NjYsIDIxMDMsIDEyMDgsIDIwNTgsIDIwNTQsDQorICAgIDExNDUsIDExNDIsIDIwMDUsIDIwMDIsIDE5OTksIDIwMDksIDE0ODgsIDE0MjksIDE0MjYsIDIyMDAsIDE2OTgsIDE2NTksDQorICAgIDE2NTYsIDE5NzUsIDEwNTMsIDE5NTcsIDE5NTQsIDEwMDEsIDk5OCwgIDE5MjQsIDE5MjEsIDE5MTgsIDE5MjgsIDkzNywNCisgICAgOTM0LCAgOTMxLCAgMTg3OSwgMTg3NiwgMTg3MywgMTg3MCwgOTQ1LCAgMTg4NSwgMTg4MiwgMTMyMywgMTI3MywgMTI3MCwNCisgICAgMjEwNSwgMTIwMiwgMTE5OSwgMTE5NiwgMTIxMSwgMjA2MSwgMjA1NywgMTU3NiwgMTU0MywgMTU0MCwgMTQ4NCwgMTQ4MSwNCisgICAgMTQ3OCwgMTQ5MSwgMTcwMH07DQorQ0JDX1BERjQxN0NvbW1vbjo6Q0JDX1BERjQxN0NvbW1vbigpIHt9DQorQ0JDX1BERjQxN0NvbW1vbjo6fkNCQ19QREY0MTdDb21tb24oKSB7fQ0KK2ludDMyX3QgQ0JDX1BERjQxN0NvbW1vbjo6Z2V0Qml0Q291bnRTdW0oQ0ZYX0ludDMyQXJyYXkmIG1vZHVsZUJpdENvdW50KSB7DQorICBpbnQzMl90IGJpdENvdW50U3VtID0gMDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1vZHVsZUJpdENvdW50LkdldFNpemUoKTsgaSsrKSB7DQorICAgIGludDMyX3QgY291bnQgPSBtb2R1bGVCaXRDb3VudC5HZXRBdChpKTsNCisgICAgYml0Q291bnRTdW0gKz0gY291bnQ7DQorICB9DQorICByZXR1cm4gYml0Q291bnRTdW07DQorfQ0KK2ludDMyX3QgQ0JDX1BERjQxN0NvbW1vbjo6Z2V0Q29kZXdvcmQoRlhfRFdPUkQgc3ltYm9sKSB7DQorICBGWF9EV09SRCBzeW0gPSBzeW1ib2wgJiAweDNGRkZGOw0KKyAgaW50MzJfdCBpID0gZmluZENvZGV3b3JkSW5kZXgoc3ltKTsNCisgIGlmIChpID09IC0xKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIHJldHVybiAoQ09ERVdPUkRfVEFCTEVbaV0gLSAxKSAlIE5VTUJFUl9PRl9DT0RFV09SRFM7DQorfQ0KK2ludDMyX3QgQ0JDX1BERjQxN0NvbW1vbjo6ZmluZENvZGV3b3JkSW5kZXgoRlhfRFdPUkQgc3ltYm9sKSB7DQorICBpbnQzMl90IGZpcnN0ID0gMDsNCisgIGludDMyX3QgdXB0byA9IHNpemVvZihTWU1CT0xfVEFCTEUpIC8gc2l6ZW9mKFNZTUJPTF9UQUJMRVswXSk7DQorICB3aGlsZSAoZmlyc3QgPCB1cHRvKSB7DQorICAgIGludDMyX3QgbWlkID0gKChGWF9EV09SRCkoZmlyc3QgKyB1cHRvKSkgPj4gMTsNCisgICAgaWYgKHN5bWJvbCA8IChGWF9EV09SRClTWU1CT0xfVEFCTEVbbWlkXSkgew0KKyAgICAgIHVwdG8gPSBtaWQ7DQorICAgIH0gZWxzZSBpZiAoc3ltYm9sID4gKEZYX0RXT1JEKVNZTUJPTF9UQUJMRVttaWRdKSB7DQorICAgICAgZmlyc3QgPSBtaWQgKyAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJldHVybiBtaWQ7DQorICAgIH0NCisgIH0NCisgIHJldHVybiAtMTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbW1vbi5oIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExM2VkZTMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29tbW9uLmgKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19QREY0MTdDT01NT05fSF8NCisjZGVmaW5lIF9CQ19QREY0MTdDT01NT05fSF8NCitjbGFzcyBDQkNfUERGNDE3Q29tbW9uIHsNCisgcHVibGljOg0KKyAgQ0JDX1BERjQxN0NvbW1vbigpOw0KKyAgdmlydHVhbCB+Q0JDX1BERjQxN0NvbW1vbigpOw0KKyAgc3RhdGljIGludDMyX3QgZ2V0Qml0Q291bnRTdW0oQ0ZYX0ludDMyQXJyYXkmIG1vZHVsZUJpdENvdW50KTsNCisgIHN0YXRpYyBpbnQzMl90IGdldENvZGV3b3JkKEZYX0RXT1JEIHN5bWJvbCk7DQorICBzdGF0aWMgaW50MzJfdCBOVU1CRVJfT0ZfQ09ERVdPUkRTOw0KKyAgc3RhdGljIGludDMyX3QgTUFYX0NPREVXT1JEU19JTl9CQVJDT0RFOw0KKyAgc3RhdGljIGludDMyX3QgTUlOX1JPV1NfSU5fQkFSQ09ERTsNCisgIHN0YXRpYyBpbnQzMl90IE1BWF9ST1dTX0lOX0JBUkNPREU7DQorICBzdGF0aWMgaW50MzJfdCBNQVhfQ09ERVdPUkRTX0lOX1JPVzsNCisgIHN0YXRpYyBpbnQzMl90IE1PRFVMRVNfSU5fQ09ERVdPUkQ7DQorICBzdGF0aWMgaW50MzJfdCBNT0RVTEVTX0lOX1NUT1BfUEFUVEVSTjsNCisgIHN0YXRpYyBpbnQzMl90IEJBUlNfSU5fTU9EVUxFOw0KKyAgc3RhdGljIGludDMyX3QgU1lNQk9MX1RBQkxFW107DQorICBzdGF0aWMgaW50MzJfdCBDT0RFV09SRF9UQUJMRVtdOw0KKw0KKyBwcml2YXRlOg0KKyAgc3RhdGljIENGWF9JbnQzMkFycmF5KiBFTVBUWV9JTlRfQVJSQVk7DQorICBzdGF0aWMgaW50MzJfdCBmaW5kQ29kZXdvcmRJbmRleChGWF9EV09SRCBzeW1ib2wpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbXBhY3Rpb24uY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbXBhY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YzBhZmQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29tcGFjdGlvbi5jcHAKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAxMSBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0NvbXBhY3Rpb24uaCINCitDQkNfQ29tcGFjdGlvbjo6Q0JDX0NvbXBhY3Rpb24oKSB7fQ0KK0NCQ19Db21wYWN0aW9uOjp+Q0JDX0NvbXBhY3Rpb24oKSB7fQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb21wYWN0aW9uLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29tcGFjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OTA5ODMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29tcGFjdGlvbi5oCkBAIC0wLDAgKzEsMTYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfQ09NUEFDVElPTl9IXw0KKyNkZWZpbmUgX0JDX0NPTVBBQ1RJT05fSF8NCitjbGFzcyBDQkNfQ29tcGFjdGlvbjsNCitlbnVtIENvbXBhY3Rpb24geyBBVVRPLCBURVhULCBCWVRFUywgTlVNRVJJQyB9Ow0KK2NsYXNzIENCQ19Db21wYWN0aW9uIHsNCisgcHVibGljOg0KKyAgQ0JDX0NvbXBhY3Rpb24oKTsNCisgIHZpcnR1YWwgfkNCQ19Db21wYWN0aW9uKCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGVjb2RlZEJpdFN0cmVhbVBhcnNlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGVjb2RlZEJpdFN0cmVhbVBhcnNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYyOGY2OAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmNwcApAQCAtMCwwICsxLDQ5MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwOSBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJCQ19QREY0MTdEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmgiDQorDQorI2luY2x1ZGUgPHN0ZGxpYi5oPg0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19EZWNvZGVyUmVzdWx0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkRlY29kZXJSZXN1bHQuaCINCisjaW5jbHVkZSAiQkNfUERGNDE3UmVzdWx0TWV0YWRhdGEuaCINCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmlnaW50L0JpZ0ludGVnZXJMaWJyYXJ5LmhoIg0KKw0KKyNkZWZpbmUgVEVYVF9DT01QQUNUSU9OX01PREVfTEFUQ0ggOTAwDQorI2RlZmluZSBCWVRFX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCA5MDENCisjZGVmaW5lIE5VTUVSSUNfQ09NUEFDVElPTl9NT0RFX0xBVENIIDkwMg0KKyNkZWZpbmUgQllURV9DT01QQUNUSU9OX01PREVfTEFUQ0hfNiA5MjQNCisjZGVmaW5lIEJFR0lOX01BQ1JPX1BERjQxN19DT05UUk9MX0JMT0NLIDkyOA0KKyNkZWZpbmUgQkVHSU5fTUFDUk9fUERGNDE3X09QVElPTkFMX0ZJRUxEIDkyMw0KKyNkZWZpbmUgTUFDUk9fUERGNDE3X1RFUk1JTkFUT1IgOTIyDQorI2RlZmluZSBNT0RFX1NISUZUX1RPX0JZVEVfQ09NUEFDVElPTl9NT0RFIDkxMw0KKw0KK2ludDMyX3QgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6TUFYX05VTUVSSUNfQ09ERVdPUkRTID0gMTU7DQoraW50MzJfdCBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjpOVU1CRVJfT0ZfU0VRVUVOQ0VfQ09ERVdPUkRTID0gMjsNCitpbnQzMl90IENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6OlBMID0gMjU7DQoraW50MzJfdCBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjpMTCA9IDI3Ow0KK2ludDMyX3QgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6QVMgPSAyNzsNCitpbnQzMl90IENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6Ok1MID0gMjg7DQoraW50MzJfdCBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjpBTCA9IDI4Ow0KK2ludDMyX3QgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6UFMgPSAyOTsNCitpbnQzMl90IENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6OlBBTCA9IDI5Ow0KK0ZYX0NIQVIgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6UFVOQ1RfQ0hBUlNbMjldID0gew0KKyAgICAnOycsICc8JywgICc+JywgICdAJywgJ1snLCAnXFwnLCAnfScsICdfJywgJ2AnLCAnficsDQorICAgICchJywgJ1xyJywgJ1x0JywgJywnLCAnOicsICdcbicsICctJywgJy4nLCAnJCcsICcvJywNCisgICAgJyInLCAnfCcsICAnKicsICAnKCcsICcpJywgJz8nLCAgJ3snLCAnfScsICdcJyd9Ow0KK0ZYX0NIQVIgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6TUlYRURfQ0hBUlNbMzBdID0gew0KKyAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICcmJywgJ1xyJywgJ1x0JywNCisgICAgJywnLCAnOicsICcjJywgJy0nLCAnLicsICckJywgJy8nLCAnKycsICclJywgJyonLCAnPScsICdeJ307DQordm9pZCBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjpJbml0aWFsaXplKCkge30NCit2b2lkIENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6OkZpbmFsaXplKCkge30NCitDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjpDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyKCkge30NCitDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjp+Q0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcigpIHt9DQorQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6OmRlY29kZSgNCisgICAgQ0ZYX0ludDMyQXJyYXkmIGNvZGV3b3JkcywNCisgICAgQ0ZYX0J5dGVTdHJpbmcgZWNMZXZlbCwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0Ow0KKyAgaW50MzJfdCBjb2RlSW5kZXggPSAxOw0KKyAgaW50MzJfdCBjb2RlID0gY29kZXdvcmRzLkdldEF0KGNvZGVJbmRleCk7DQorICBjb2RlSW5kZXgrKzsNCisgIENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YSogcmVzdWx0TWV0YWRhdGEgPSBuZXcgQ0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhOw0KKyAgd2hpbGUgKGNvZGVJbmRleCA8IGNvZGV3b3Jkc1swXSkgew0KKyAgICBzd2l0Y2ggKGNvZGUpIHsNCisgICAgICBjYXNlIFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIOg0KKyAgICAgICAgY29kZUluZGV4ID0gdGV4dENvbXBhY3Rpb24oY29kZXdvcmRzLCBjb2RlSW5kZXgsIHJlc3VsdCk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEJZVEVfQ09NUEFDVElPTl9NT0RFX0xBVENIOg0KKyAgICAgICAgY29kZUluZGV4ID0gYnl0ZUNvbXBhY3Rpb24oY29kZSwgY29kZXdvcmRzLCBjb2RlSW5kZXgsIHJlc3VsdCk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIE5VTUVSSUNfQ09NUEFDVElPTl9NT0RFX0xBVENIOg0KKyAgICAgICAgY29kZUluZGV4ID0gbnVtZXJpY0NvbXBhY3Rpb24oY29kZXdvcmRzLCBjb2RlSW5kZXgsIHJlc3VsdCwgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIE1PREVfU0hJRlRfVE9fQllURV9DT01QQUNUSU9OX01PREU6DQorICAgICAgICBjb2RlSW5kZXggPSBieXRlQ29tcGFjdGlvbihjb2RlLCBjb2Rld29yZHMsIGNvZGVJbmRleCwgcmVzdWx0KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgQllURV9DT01QQUNUSU9OX01PREVfTEFUQ0hfNjoNCisgICAgICAgIGNvZGVJbmRleCA9IGJ5dGVDb21wYWN0aW9uKGNvZGUsIGNvZGV3b3JkcywgY29kZUluZGV4LCByZXN1bHQpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBCRUdJTl9NQUNST19QREY0MTdfQ09OVFJPTF9CTE9DSzoNCisgICAgICAgIGNvZGVJbmRleCA9IGRlY29kZU1hY3JvQmxvY2soY29kZXdvcmRzLCBjb2RlSW5kZXgsIHJlc3VsdE1ldGFkYXRhLCBlKTsNCisgICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgICAgZGVsZXRlIHJlc3VsdE1ldGFkYXRhOw0KKyAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBjb2RlSW5kZXgtLTsNCisgICAgICAgIGNvZGVJbmRleCA9IHRleHRDb21wYWN0aW9uKGNvZGV3b3JkcywgY29kZUluZGV4LCByZXN1bHQpOw0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKGNvZGVJbmRleCA8IGNvZGV3b3Jkcy5HZXRTaXplKCkpIHsNCisgICAgICBjb2RlID0gY29kZXdvcmRzW2NvZGVJbmRleCsrXTsNCisgICAgfSBlbHNlIHsNCisgICAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRJbnN0YW5jZTsNCisgICAgICBkZWxldGUgcmVzdWx0TWV0YWRhdGE7DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgIH0NCisgIGlmIChyZXN1bHQuR2V0TGVuZ3RoKCkgPT0gMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRJbnN0YW5jZTsNCisgICAgZGVsZXRlIHJlc3VsdE1ldGFkYXRhOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENGWF9CeXRlQXJyYXkgcmF3Qnl0ZXM7DQorICBDRlhfUHRyQXJyYXkgYnl0ZVNlZ21lbnRzOw0KKyAgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIHRlbXBDZCA9IG5ldyBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCgpOw0KKyAgdGVtcENkLT5Jbml0KHJhd0J5dGVzLCByZXN1bHQsIGJ5dGVTZWdtZW50cywgZWNMZXZlbCwgZSk7DQorICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgIGRlbGV0ZSByZXN1bHRNZXRhZGF0YTsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICB0ZW1wQ2QtPnNldE90aGVyKHJlc3VsdE1ldGFkYXRhKTsNCisgIHJldHVybiB0ZW1wQ2Q7DQorfQ0KK2ludDMyX3QgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6ZGVjb2RlTWFjcm9CbG9jaygNCisgICAgQ0ZYX0ludDMyQXJyYXkmIGNvZGV3b3JkcywNCisgICAgaW50MzJfdCBjb2RlSW5kZXgsDQorICAgIENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YSogcmVzdWx0TWV0YWRhdGEsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChjb2RlSW5kZXggKyBOVU1CRVJfT0ZfU0VRVUVOQ0VfQ09ERVdPUkRTID4gY29kZXdvcmRzWzBdKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEluc3RhbmNlOw0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBDRlhfSW50MzJBcnJheSBzZWdtZW50SW5kZXhBcnJheTsNCisgIHNlZ21lbnRJbmRleEFycmF5LlNldFNpemUoTlVNQkVSX09GX1NFUVVFTkNFX0NPREVXT1JEUyk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBOVU1CRVJfT0ZfU0VRVUVOQ0VfQ09ERVdPUkRTOyBpKyssIGNvZGVJbmRleCsrKSB7DQorICAgIHNlZ21lbnRJbmRleEFycmF5LlNldEF0KGksIGNvZGV3b3Jkc1tjb2RlSW5kZXhdKTsNCisgIH0NCisgIENGWF9CeXRlU3RyaW5nIHN0ciA9DQorICAgICAgZGVjb2RlQmFzZTkwMHRvQmFzZTEwKHNlZ21lbnRJbmRleEFycmF5LCBOVU1CRVJfT0ZfU0VRVUVOQ0VfQ09ERVdPUkRTLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAtMSk7DQorICByZXN1bHRNZXRhZGF0YS0+c2V0U2VnbWVudEluZGV4KGF0b2koc3RyLkdldEJ1ZmZlcihzdHIuR2V0TGVuZ3RoKCkpKSk7DQorICBDRlhfQnl0ZVN0cmluZyBmaWxlSWQ7DQorICBjb2RlSW5kZXggPSB0ZXh0Q29tcGFjdGlvbihjb2Rld29yZHMsIGNvZGVJbmRleCwgZmlsZUlkKTsNCisgIHJlc3VsdE1ldGFkYXRhLT5zZXRGaWxlSWQoZmlsZUlkKTsNCisgIGlmIChjb2Rld29yZHNbY29kZUluZGV4XSA9PSBCRUdJTl9NQUNST19QREY0MTdfT1BUSU9OQUxfRklFTEQpIHsNCisgICAgY29kZUluZGV4Kys7DQorICAgIENGWF9JbnQzMkFycmF5IGFkZGl0aW9uYWxPcHRpb25Db2RlV29yZHM7DQorICAgIGFkZGl0aW9uYWxPcHRpb25Db2RlV29yZHMuU2V0U2l6ZShjb2Rld29yZHNbMF0gLSBjb2RlSW5kZXgpOw0KKyAgICBpbnQzMl90IGFkZGl0aW9uYWxPcHRpb25Db2RlV29yZHNJbmRleCA9IDA7DQorICAgIEZYX0JPT0wgZW5kID0gRkFMU0U7DQorICAgIHdoaWxlICgoY29kZUluZGV4IDwgY29kZXdvcmRzWzBdKSAmJiAhZW5kKSB7DQorICAgICAgaW50MzJfdCBjb2RlID0gY29kZXdvcmRzW2NvZGVJbmRleCsrXTsNCisgICAgICBpZiAoY29kZSA8IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIKSB7DQorICAgICAgICBhZGRpdGlvbmFsT3B0aW9uQ29kZVdvcmRzW2FkZGl0aW9uYWxPcHRpb25Db2RlV29yZHNJbmRleCsrXSA9IGNvZGU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHN3aXRjaCAoY29kZSkgew0KKyAgICAgICAgICBjYXNlIE1BQ1JPX1BERjQxN19URVJNSU5BVE9SOg0KKyAgICAgICAgICAgIHJlc3VsdE1ldGFkYXRhLT5zZXRMYXN0U2VnbWVudChUUlVFKTsNCisgICAgICAgICAgICBjb2RlSW5kZXgrKzsNCisgICAgICAgICAgICBlbmQgPSBUUlVFOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEluc3RhbmNlOw0KKyAgICAgICAgICAgIHJldHVybiAtMTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgQ0ZYX0ludDMyQXJyYXkgYXJyYXk7DQorICAgIGFycmF5LlNldFNpemUoYWRkaXRpb25hbE9wdGlvbkNvZGVXb3Jkc0luZGV4KTsNCisgICAgYXJyYXkuQ29weShhZGRpdGlvbmFsT3B0aW9uQ29kZVdvcmRzKTsNCisgICAgcmVzdWx0TWV0YWRhdGEtPnNldE9wdGlvbmFsRGF0YShhcnJheSk7DQorICB9IGVsc2UgaWYgKGNvZGV3b3Jkc1tjb2RlSW5kZXhdID09IE1BQ1JPX1BERjQxN19URVJNSU5BVE9SKSB7DQorICAgIHJlc3VsdE1ldGFkYXRhLT5zZXRMYXN0U2VnbWVudChUUlVFKTsNCisgICAgY29kZUluZGV4Kys7DQorICB9DQorICByZXR1cm4gY29kZUluZGV4Ow0KK30NCitpbnQzMl90IENCQ19EZWNvZGVkQml0U3RyZWFtUGFzZXI6OnRleHRDb21wYWN0aW9uKENGWF9JbnQzMkFycmF5JiBjb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQpIHsNCisgIENGWF9JbnQzMkFycmF5IHRleHRDb21wYWN0aW9uRGF0YTsNCisgIHRleHRDb21wYWN0aW9uRGF0YS5TZXRTaXplKChjb2Rld29yZHNbMF0gLSBjb2RlSW5kZXgpIDw8IDEpOw0KKyAgQ0ZYX0ludDMyQXJyYXkgYnl0ZUNvbXBhY3Rpb25EYXRhOw0KKyAgYnl0ZUNvbXBhY3Rpb25EYXRhLlNldFNpemUoKGNvZGV3b3Jkc1swXSAtIGNvZGVJbmRleCkgPDwgMSk7DQorICBpbnQzMl90IGluZGV4ID0gMDsNCisgIEZYX0JPT0wgZW5kID0gRkFMU0U7DQorICB3aGlsZSAoKGNvZGVJbmRleCA8IGNvZGV3b3Jkc1swXSkgJiYgIWVuZCkgew0KKyAgICBpbnQzMl90IGNvZGUgPSBjb2Rld29yZHNbY29kZUluZGV4KytdOw0KKyAgICBpZiAoY29kZSA8IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIKSB7DQorICAgICAgdGV4dENvbXBhY3Rpb25EYXRhW2luZGV4XSA9IGNvZGUgLyAzMDsNCisgICAgICB0ZXh0Q29tcGFjdGlvbkRhdGFbaW5kZXggKyAxXSA9IGNvZGUgJSAzMDsNCisgICAgICBpbmRleCArPSAyOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHN3aXRjaCAoY29kZSkgew0KKyAgICAgICAgY2FzZSBURVhUX0NPTVBBQ1RJT05fTU9ERV9MQVRDSDoNCisgICAgICAgICAgdGV4dENvbXBhY3Rpb25EYXRhW2luZGV4KytdID0gVEVYVF9DT01QQUNUSU9OX01PREVfTEFUQ0g7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBCWVRFX0NPTVBBQ1RJT05fTU9ERV9MQVRDSDoNCisgICAgICAgICAgY29kZUluZGV4LS07DQorICAgICAgICAgIGVuZCA9IFRSVUU7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBOVU1FUklDX0NPTVBBQ1RJT05fTU9ERV9MQVRDSDoNCisgICAgICAgICAgY29kZUluZGV4LS07DQorICAgICAgICAgIGVuZCA9IFRSVUU7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBCRUdJTl9NQUNST19QREY0MTdfQ09OVFJPTF9CTE9DSzoNCisgICAgICAgICAgY29kZUluZGV4LS07DQorICAgICAgICAgIGVuZCA9IFRSVUU7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBCRUdJTl9NQUNST19QREY0MTdfT1BUSU9OQUxfRklFTEQ6DQorICAgICAgICAgIGNvZGVJbmRleC0tOw0KKyAgICAgICAgICBlbmQgPSBUUlVFOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgTUFDUk9fUERGNDE3X1RFUk1JTkFUT1I6DQorICAgICAgICAgIGNvZGVJbmRleC0tOw0KKyAgICAgICAgICBlbmQgPSBUUlVFOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgTU9ERV9TSElGVF9UT19CWVRFX0NPTVBBQ1RJT05fTU9ERToNCisgICAgICAgICAgdGV4dENvbXBhY3Rpb25EYXRhW2luZGV4XSA9IE1PREVfU0hJRlRfVE9fQllURV9DT01QQUNUSU9OX01PREU7DQorICAgICAgICAgIGNvZGUgPSBjb2Rld29yZHNbY29kZUluZGV4KytdOw0KKyAgICAgICAgICBieXRlQ29tcGFjdGlvbkRhdGFbaW5kZXhdID0gY29kZTsNCisgICAgICAgICAgaW5kZXgrKzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEJZVEVfQ09NUEFDVElPTl9NT0RFX0xBVENIXzY6DQorICAgICAgICAgIGNvZGVJbmRleC0tOw0KKyAgICAgICAgICBlbmQgPSBUUlVFOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGRlY29kZVRleHRDb21wYWN0aW9uKHRleHRDb21wYWN0aW9uRGF0YSwgYnl0ZUNvbXBhY3Rpb25EYXRhLCBpbmRleCwgcmVzdWx0KTsNCisgIHJldHVybiBjb2RlSW5kZXg7DQorfQ0KK3ZvaWQgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6ZGVjb2RlVGV4dENvbXBhY3Rpb24oDQorICAgIENGWF9JbnQzMkFycmF5JiB0ZXh0Q29tcGFjdGlvbkRhdGEsDQorICAgIENGWF9JbnQzMkFycmF5JiBieXRlQ29tcGFjdGlvbkRhdGEsDQorICAgIGludDMyX3QgbGVuZ3RoLA0KKyAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0KSB7DQorICBNb2RlIHN1Yk1vZGUgPSBBTFBIQTsNCisgIE1vZGUgcHJpb3JUb1NoaWZ0TW9kZSA9IEFMUEhBOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIHdoaWxlIChpIDwgbGVuZ3RoKSB7DQorICAgIGludDMyX3Qgc3ViTW9kZUNoID0gdGV4dENvbXBhY3Rpb25EYXRhW2ldOw0KKyAgICBGWF9DSEFSIGNoID0gMDsNCisgICAgc3dpdGNoIChzdWJNb2RlKSB7DQorICAgICAgY2FzZSBBTFBIQToNCisgICAgICAgIGlmIChzdWJNb2RlQ2ggPCAyNikgew0KKyAgICAgICAgICBjaCA9IChGWF9DSEFSKSgnQScgKyBzdWJNb2RlQ2gpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgaWYgKHN1Yk1vZGVDaCA9PSAyNikgew0KKyAgICAgICAgICAgIGNoID0gJyAnOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBMTCkgew0KKyAgICAgICAgICAgIHN1Yk1vZGUgPSBMT1dFUjsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gTUwpIHsNCisgICAgICAgICAgICBzdWJNb2RlID0gTUlYRUQ7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IFBTKSB7DQorICAgICAgICAgICAgcHJpb3JUb1NoaWZ0TW9kZSA9IHN1Yk1vZGU7DQorICAgICAgICAgICAgc3ViTW9kZSA9IFBVTkNUX1NISUZUOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBNT0RFX1NISUZUX1RPX0JZVEVfQ09NUEFDVElPTl9NT0RFKSB7DQorICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKWJ5dGVDb21wYWN0aW9uRGF0YVtpXTsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gVEVYVF9DT01QQUNUSU9OX01PREVfTEFUQ0gpIHsNCisgICAgICAgICAgICBzdWJNb2RlID0gQUxQSEE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgTE9XRVI6DQorICAgICAgICBpZiAoc3ViTW9kZUNoIDwgMjYpIHsNCisgICAgICAgICAgY2ggPSAoRlhfQ0hBUikoJ2EnICsgc3ViTW9kZUNoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGlmIChzdWJNb2RlQ2ggPT0gMjYpIHsNCisgICAgICAgICAgICBjaCA9ICcgJzsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gQVMpIHsNCisgICAgICAgICAgICBwcmlvclRvU2hpZnRNb2RlID0gc3ViTW9kZTsNCisgICAgICAgICAgICBzdWJNb2RlID0gQUxQSEFfU0hJRlQ7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IE1MKSB7DQorICAgICAgICAgICAgc3ViTW9kZSA9IE1JWEVEOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBQUykgew0KKyAgICAgICAgICAgIHByaW9yVG9TaGlmdE1vZGUgPSBzdWJNb2RlOw0KKyAgICAgICAgICAgIHN1Yk1vZGUgPSBQVU5DVF9TSElGVDsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gTU9ERV9TSElGVF9UT19CWVRFX0NPTVBBQ1RJT05fTU9ERSkgew0KKyAgICAgICAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUilieXRlQ29tcGFjdGlvbkRhdGFbaV07DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIKSB7DQorICAgICAgICAgICAgc3ViTW9kZSA9IEFMUEhBOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIE1JWEVEOg0KKyAgICAgICAgaWYgKHN1Yk1vZGVDaCA8IFBMKSB7DQorICAgICAgICAgIGNoID0gTUlYRURfQ0hBUlNbc3ViTW9kZUNoXTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGlmIChzdWJNb2RlQ2ggPT0gUEwpIHsNCisgICAgICAgICAgICBzdWJNb2RlID0gUFVOQ1Q7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IDI2KSB7DQorICAgICAgICAgICAgY2ggPSAnICc7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IExMKSB7DQorICAgICAgICAgICAgc3ViTW9kZSA9IExPV0VSOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBBTCkgew0KKyAgICAgICAgICAgIHN1Yk1vZGUgPSBBTFBIQTsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gUFMpIHsNCisgICAgICAgICAgICBwcmlvclRvU2hpZnRNb2RlID0gc3ViTW9kZTsNCisgICAgICAgICAgICBzdWJNb2RlID0gUFVOQ1RfU0hJRlQ7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IE1PREVfU0hJRlRfVE9fQllURV9DT01QQUNUSU9OX01PREUpIHsNCisgICAgICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpYnl0ZUNvbXBhY3Rpb25EYXRhW2ldOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBURVhUX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCkgew0KKyAgICAgICAgICAgIHN1Yk1vZGUgPSBBTFBIQTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBQVU5DVDoNCisgICAgICAgIGlmIChzdWJNb2RlQ2ggPCBQQUwpIHsNCisgICAgICAgICAgY2ggPSBQVU5DVF9DSEFSU1tzdWJNb2RlQ2hdOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgaWYgKHN1Yk1vZGVDaCA9PSBQQUwpIHsNCisgICAgICAgICAgICBzdWJNb2RlID0gQUxQSEE7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IE1PREVfU0hJRlRfVE9fQllURV9DT01QQUNUSU9OX01PREUpIHsNCisgICAgICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpYnl0ZUNvbXBhY3Rpb25EYXRhW2ldOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBURVhUX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCkgew0KKyAgICAgICAgICAgIHN1Yk1vZGUgPSBBTFBIQTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBBTFBIQV9TSElGVDoNCisgICAgICAgIHN1Yk1vZGUgPSBwcmlvclRvU2hpZnRNb2RlOw0KKyAgICAgICAgaWYgKHN1Yk1vZGVDaCA8IDI2KSB7DQorICAgICAgICAgIGNoID0gKEZYX0NIQVIpKCdBJyArIHN1Yk1vZGVDaCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBpZiAoc3ViTW9kZUNoID09IDI2KSB7DQorICAgICAgICAgICAgY2ggPSAnICc7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3ViTW9kZUNoID09IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIKSB7DQorICAgICAgICAgICAgc3ViTW9kZSA9IEFMUEhBOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFBVTkNUX1NISUZUOg0KKyAgICAgICAgc3ViTW9kZSA9IHByaW9yVG9TaGlmdE1vZGU7DQorICAgICAgICBpZiAoc3ViTW9kZUNoIDwgUEFMKSB7DQorICAgICAgICAgIGNoID0gUFVOQ1RfQ0hBUlNbc3ViTW9kZUNoXTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGlmIChzdWJNb2RlQ2ggPT0gUEFMKSB7DQorICAgICAgICAgICAgc3ViTW9kZSA9IEFMUEhBOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN1Yk1vZGVDaCA9PSBNT0RFX1NISUZUX1RPX0JZVEVfQ09NUEFDVElPTl9NT0RFKSB7DQorICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKWJ5dGVDb21wYWN0aW9uRGF0YVtpXTsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdWJNb2RlQ2ggPT0gVEVYVF9DT01QQUNUSU9OX01PREVfTEFUQ0gpIHsNCisgICAgICAgICAgICBzdWJNb2RlID0gQUxQSEE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChjaCAhPSAwKSB7DQorICAgICAgcmVzdWx0ICs9IGNoOw0KKyAgICB9DQorICAgIGkrKzsNCisgIH0NCit9DQoraW50MzJfdCBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjpieXRlQ29tcGFjdGlvbihpbnQzMl90IG1vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSYgY29kZXdvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2RlSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0KSB7DQorICBpZiAobW9kZSA9PSBCWVRFX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCkgew0KKyAgICBpbnQzMl90IGNvdW50ID0gMDsNCisgICAgaW50NjRfdCB2YWx1ZSA9IDA7DQorICAgIEZYX1dPUkQqIGRlY29kZWREYXRhID0gRlhfQWxsb2MoRlhfV09SRCwgNik7DQorICAgIENGWF9JbnQzMkFycmF5IGJ5dGVDb21wYWN0ZWRDb2Rld29yZHM7DQorICAgIGJ5dGVDb21wYWN0ZWRDb2Rld29yZHMuU2V0U2l6ZSg2KTsNCisgICAgRlhfQk9PTCBlbmQgPSBGQUxTRTsNCisgICAgaW50MzJfdCBuZXh0Q29kZSA9IGNvZGV3b3Jkc1tjb2RlSW5kZXgrK107DQorICAgIHdoaWxlICgoY29kZUluZGV4IDwgY29kZXdvcmRzWzBdKSAmJiAhZW5kKSB7DQorICAgICAgYnl0ZUNvbXBhY3RlZENvZGV3b3Jkc1tjb3VudCsrXSA9IG5leHRDb2RlOw0KKyAgICAgIHZhbHVlID0gOTAwICogdmFsdWUgKyBuZXh0Q29kZTsNCisgICAgICBuZXh0Q29kZSA9IGNvZGV3b3Jkc1tjb2RlSW5kZXgrK107DQorICAgICAgaWYgKG5leHRDb2RlID09IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIIHx8DQorICAgICAgICAgIG5leHRDb2RlID09IEJZVEVfQ09NUEFDVElPTl9NT0RFX0xBVENIIHx8DQorICAgICAgICAgIG5leHRDb2RlID09IE5VTUVSSUNfQ09NUEFDVElPTl9NT0RFX0xBVENIIHx8DQorICAgICAgICAgIG5leHRDb2RlID09IEJZVEVfQ09NUEFDVElPTl9NT0RFX0xBVENIXzYgfHwNCisgICAgICAgICAgbmV4dENvZGUgPT0gQkVHSU5fTUFDUk9fUERGNDE3X0NPTlRST0xfQkxPQ0sgfHwNCisgICAgICAgICAgbmV4dENvZGUgPT0gQkVHSU5fTUFDUk9fUERGNDE3X09QVElPTkFMX0ZJRUxEIHx8DQorICAgICAgICAgIG5leHRDb2RlID09IE1BQ1JPX1BERjQxN19URVJNSU5BVE9SKSB7DQorICAgICAgICBjb2RlSW5kZXgtLTsNCisgICAgICAgIGVuZCA9IFRSVUU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmICgoY291bnQgJSA1ID09IDApICYmIChjb3VudCA+IDApKSB7DQorICAgICAgICAgIGludDMyX3QgaiA9IDA7DQorICAgICAgICAgIGZvciAoOyBqIDwgNjsgKytqKSB7DQorICAgICAgICAgICAgZGVjb2RlZERhdGFbNSAtIGpdID0gKEZYX1dPUkQpKHZhbHVlICUgMjU2KTsNCisgICAgICAgICAgICB2YWx1ZSA+Pj0gODsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjsgKytqKSB7DQorICAgICAgICAgICAgcmVzdWx0ICs9IChGWF9DSEFSKWRlY29kZWREYXRhW2pdOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGNvdW50ID0gMDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgRlhfRnJlZShkZWNvZGVkRGF0YSk7DQorICAgIGlmIChjb2RlSW5kZXggPT0gY29kZXdvcmRzWzBdICYmIG5leHRDb2RlIDwgVEVYVF9DT01QQUNUSU9OX01PREVfTEFUQ0gpIHsNCisgICAgICBieXRlQ29tcGFjdGVkQ29kZXdvcmRzW2NvdW50KytdID0gbmV4dENvZGU7DQorICAgIH0NCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgew0KKyAgICAgIHJlc3VsdCArPSAoRlhfQ0hBUikoRlhfV09SRClieXRlQ29tcGFjdGVkQ29kZXdvcmRzW2ldOw0KKyAgICB9DQorICB9IGVsc2UgaWYgKG1vZGUgPT0gQllURV9DT01QQUNUSU9OX01PREVfTEFUQ0hfNikgew0KKyAgICBpbnQzMl90IGNvdW50ID0gMDsNCisgICAgaW50NjRfdCB2YWx1ZSA9IDA7DQorICAgIEZYX0JPT0wgZW5kID0gRkFMU0U7DQorICAgIHdoaWxlIChjb2RlSW5kZXggPCBjb2Rld29yZHNbMF0gJiYgIWVuZCkgew0KKyAgICAgIGludDMyX3QgY29kZSA9IGNvZGV3b3Jkc1tjb2RlSW5kZXgrK107DQorICAgICAgaWYgKGNvZGUgPCBURVhUX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCkgew0KKyAgICAgICAgY291bnQrKzsNCisgICAgICAgIHZhbHVlID0gOTAwICogdmFsdWUgKyBjb2RlOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAoY29kZSA9PSBURVhUX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCB8fA0KKyAgICAgICAgICAgIGNvZGUgPT0gQllURV9DT01QQUNUSU9OX01PREVfTEFUQ0ggfHwNCisgICAgICAgICAgICBjb2RlID09IE5VTUVSSUNfQ09NUEFDVElPTl9NT0RFX0xBVENIIHx8DQorICAgICAgICAgICAgY29kZSA9PSBCWVRFX0NPTVBBQ1RJT05fTU9ERV9MQVRDSF82IHx8DQorICAgICAgICAgICAgY29kZSA9PSBCRUdJTl9NQUNST19QREY0MTdfQ09OVFJPTF9CTE9DSyB8fA0KKyAgICAgICAgICAgIGNvZGUgPT0gQkVHSU5fTUFDUk9fUERGNDE3X09QVElPTkFMX0ZJRUxEIHx8DQorICAgICAgICAgICAgY29kZSA9PSBNQUNST19QREY0MTdfVEVSTUlOQVRPUikgew0KKyAgICAgICAgICBjb2RlSW5kZXgtLTsNCisgICAgICAgICAgZW5kID0gVFJVRTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgaWYgKChjb3VudCAlIDUgPT0gMCkgJiYgKGNvdW50ID4gMCkpIHsNCisgICAgICAgIEZYX1dPUkQqIGRlY29kZWREYXRhID0gRlhfQWxsb2MoRlhfV09SRCwgNik7DQorICAgICAgICBpbnQzMl90IGogPSAwOw0KKyAgICAgICAgZm9yICg7IGogPCA2OyArK2opIHsNCisgICAgICAgICAgZGVjb2RlZERhdGFbNSAtIGpdID0gKEZYX1dPUkQpKHZhbHVlICYgMHhGRik7DQorICAgICAgICAgIHZhbHVlID4+PSA4Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDY7ICsraikgew0KKyAgICAgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpZGVjb2RlZERhdGFbal07DQorICAgICAgICB9DQorICAgICAgICBjb3VudCA9IDA7DQorICAgICAgICBGWF9GcmVlKGRlY29kZWREYXRhKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBjb2RlSW5kZXg7DQorfQ0KK2ludDMyX3QgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6bnVtZXJpY0NvbXBhY3Rpb24oQ0ZYX0ludDMyQXJyYXkmIGNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZUluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3QgY291bnQgPSAwOw0KKyAgRlhfQk9PTCBlbmQgPSBGQUxTRTsNCisgIENGWF9JbnQzMkFycmF5IG51bWVyaWNDb2Rld29yZHM7DQorICBudW1lcmljQ29kZXdvcmRzLlNldFNpemUoTUFYX05VTUVSSUNfQ09ERVdPUkRTKTsNCisgIHdoaWxlIChjb2RlSW5kZXggPCBjb2Rld29yZHNbMF0gJiYgIWVuZCkgew0KKyAgICBpbnQzMl90IGNvZGUgPSBjb2Rld29yZHNbY29kZUluZGV4KytdOw0KKyAgICBpZiAoY29kZUluZGV4ID09IGNvZGV3b3Jkc1swXSkgew0KKyAgICAgIGVuZCA9IFRSVUU7DQorICAgIH0NCisgICAgaWYgKGNvZGUgPCBURVhUX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCkgew0KKyAgICAgIG51bWVyaWNDb2Rld29yZHNbY291bnRdID0gY29kZTsNCisgICAgICBjb3VudCsrOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChjb2RlID09IFRFWFRfQ09NUEFDVElPTl9NT0RFX0xBVENIIHx8DQorICAgICAgICAgIGNvZGUgPT0gQllURV9DT01QQUNUSU9OX01PREVfTEFUQ0ggfHwNCisgICAgICAgICAgY29kZSA9PSBCWVRFX0NPTVBBQ1RJT05fTU9ERV9MQVRDSF82IHx8DQorICAgICAgICAgIGNvZGUgPT0gQkVHSU5fTUFDUk9fUERGNDE3X0NPTlRST0xfQkxPQ0sgfHwNCisgICAgICAgICAgY29kZSA9PSBCRUdJTl9NQUNST19QREY0MTdfT1BUSU9OQUxfRklFTEQgfHwNCisgICAgICAgICAgY29kZSA9PSBNQUNST19QREY0MTdfVEVSTUlOQVRPUikgew0KKyAgICAgICAgY29kZUluZGV4LS07DQorICAgICAgICBlbmQgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoY291bnQgJSBNQVhfTlVNRVJJQ19DT0RFV09SRFMgPT0gMCB8fA0KKyAgICAgICAgY29kZSA9PSBOVU1FUklDX0NPTVBBQ1RJT05fTU9ERV9MQVRDSCB8fCBlbmQpIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBzID0gZGVjb2RlQmFzZTkwMHRvQmFzZTEwKG51bWVyaWNDb2Rld29yZHMsIGNvdW50LCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgLTEpOw0KKyAgICAgIHJlc3VsdCArPSBzOw0KKyAgICAgIGNvdW50ID0gMDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGNvZGVJbmRleDsNCit9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcjo6ZGVjb2RlQmFzZTkwMHRvQmFzZTEwKA0KKyAgICBDRlhfSW50MzJBcnJheSYgY29kZXdvcmRzLA0KKyAgICBpbnQzMl90IGNvdW50LA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBCaWdJbnRlZ2VyIHJlc3VsdCA9IDA7DQorICBCaWdJbnRlZ2VyIG5pbmVIdW5kcmVkKDkwMCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7DQorICAgIHJlc3VsdCA9IHJlc3VsdCAqIG5pbmVIdW5kcmVkICsgQmlnSW50ZWdlcihjb2Rld29yZHNbaV0pOw0KKyAgfQ0KKyAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0U3RyaW5nKGJpZ0ludGVnZXJUb1N0cmluZyhyZXN1bHQpLmNfc3RyKCkpOw0KKyAgaWYgKHJlc3VsdFN0cmluZy5HZXRBdCgwKSAhPSAnMScpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0SW5zdGFuY2U7DQorICAgIHJldHVybiAnICc7DQorICB9DQorICByZXR1cm4gcmVzdWx0U3RyaW5nLk1pZCgxLCByZXN1bHRTdHJpbmcuR2V0TGVuZ3RoKCkgLSAxKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc3OWY5MwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmgKQEAgLTAsMCArMSw2MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIFhGQV9TUkNfRlhCQVJDT0RFX1BERjQxN19CQ19QREY0MTdERUNPREVEQklUU1RSRUFNUEFSU0VSX0hfDQorI2RlZmluZSBYRkFfU1JDX0ZYQkFSQ09ERV9QREY0MTdfQkNfUERGNDE3REVDT0RFREJJVFNUUkVBTVBBUlNFUl9IXw0KKw0KKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfYmFzaWMuaCINCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3N0cmluZy5oIg0KKw0KK2NsYXNzIENCQ19Db21tb25EZWNvZGVyUmVzdWx0Ow0KK2NsYXNzIENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YTsNCisNCitjbGFzcyBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyIHsNCisgcHVibGljOg0KKyAgQ0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcigpOw0KKyAgdmlydHVhbCB+Q0JDX0RlY29kZWRCaXRTdHJlYW1QYXNlcigpOw0KKyAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZSgpOw0KKyAgc3RhdGljIHZvaWQgRmluYWxpemUoKTsNCisgIHN0YXRpYyBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogZGVjb2RlKENGWF9JbnQzMkFycmF5JiBjb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorDQorIHByaXZhdGU6DQorICBlbnVtIE1vZGUgeyBBTFBIQSwgTE9XRVIsIE1JWEVELCBQVU5DVCwgQUxQSEFfU0hJRlQsIFBVTkNUX1NISUZUIH07DQorICBzdGF0aWMgaW50MzJfdCBNQVhfTlVNRVJJQ19DT0RFV09SRFM7DQorICBzdGF0aWMgaW50MzJfdCBQTDsNCisgIHN0YXRpYyBpbnQzMl90IExMOw0KKyAgc3RhdGljIGludDMyX3QgQVM7DQorICBzdGF0aWMgaW50MzJfdCBNTDsNCisgIHN0YXRpYyBpbnQzMl90IEFMOw0KKyAgc3RhdGljIGludDMyX3QgUFM7DQorICBzdGF0aWMgaW50MzJfdCBQQUw7DQorICBzdGF0aWMgRlhfQ0hBUiBQVU5DVF9DSEFSU1syOV07DQorICBzdGF0aWMgRlhfQ0hBUiBNSVhFRF9DSEFSU1szMF07DQorICBzdGF0aWMgaW50MzJfdCBOVU1CRVJfT0ZfU0VRVUVOQ0VfQ09ERVdPUkRTOw0KKyAgc3RhdGljIGludDMyX3QgZGVjb2RlTWFjcm9CbG9jayhDRlhfSW50MzJBcnJheSYgY29kZXdvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhKiByZXN1bHRNZXRhZGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgaW50MzJfdCB0ZXh0Q29tcGFjdGlvbihDRlhfSW50MzJBcnJheSYgY29kZXdvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2RlSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0KTsNCisgIHN0YXRpYyB2b2lkIGRlY29kZVRleHRDb21wYWN0aW9uKENGWF9JbnQzMkFycmF5JiB0ZXh0Q29tcGFjdGlvbkRhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSYgYnl0ZUNvbXBhY3Rpb25EYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0KTsNCisgIHN0YXRpYyBpbnQzMl90IGJ5dGVDb21wYWN0aW9uKGludDMyX3QgbW9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5JiBjb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVJbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQpOw0KKyAgc3RhdGljIGludDMyX3QgbnVtZXJpY0NvbXBhY3Rpb24oQ0ZYX0ludDMyQXJyYXkmIGNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZUluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIENGWF9CeXRlU3RyaW5nIGRlY29kZUJhc2U5MDB0b0Jhc2UxMChDRlhfSW50MzJBcnJheSYgY29kZXdvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCit9Ow0KKyNlbmRpZiAgLy8gWEZBX1NSQ19GWEJBUkNPREVfUERGNDE3X0JDX1BERjQxN0RFQ09ERURCSVRTVFJFQU1QQVJTRVJfSF8NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0LmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3Rpb25SZXN1bHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYzJhYWMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0LmNwcApAQCAtMCwwICsxLDMzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAxMyBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0NvZGV3b3JkLmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0JhcmNvZGVNZXRhZGF0YS5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdCb3VuZGluZ0JveC5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdEZXRlY3Rpb25SZXN1bHRDb2x1bW4uaCINCisjaW5jbHVkZSAiQkNfUERGNDE3Q29tbW9uLmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbi5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdEZXRlY3Rpb25SZXN1bHQuaCINCitpbnQzMl90IENCQ19EZXRlY3Rpb25SZXN1bHQ6OkFESlVTVF9ST1dfTlVNQkVSX1NLSVAgPSAyOw0KK0NCQ19EZXRlY3Rpb25SZXN1bHQ6OkNCQ19EZXRlY3Rpb25SZXN1bHQoQ0JDX0JhcmNvZGVNZXRhZGF0YSogYmFyY29kZU1ldGFkYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCkgew0KKyAgbV9iYXJjb2RlTWV0YWRhdGEgPSBiYXJjb2RlTWV0YWRhdGE7DQorICBtX2JhcmNvZGVDb2x1bW5Db3VudCA9IGJhcmNvZGVNZXRhZGF0YS0+Z2V0Q29sdW1uQ291bnQoKTsNCisgIG1fYm91bmRpbmdCb3ggPSBib3VuZGluZ0JveDsNCisgIG1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1ucy5TZXRTaXplKG1fYmFyY29kZUNvbHVtbkNvdW50ICsgMik7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX2JhcmNvZGVDb2x1bW5Db3VudCArIDI7IGkrKykgew0KKyAgICBtX2RldGVjdGlvblJlc3VsdENvbHVtbnNbaV0gPSBOVUxMOw0KKyAgfQ0KK30NCitDQkNfRGV0ZWN0aW9uUmVzdWx0Ojp+Q0JDX0RldGVjdGlvblJlc3VsdCgpIHsNCisgIGRlbGV0ZSBtX2JvdW5kaW5nQm94Ow0KKyAgZGVsZXRlIG1fYmFyY29kZU1ldGFkYXRhOw0KKyAgbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zLlJlbW92ZUFsbCgpOw0KK30NCitDRlhfUHRyQXJyYXkmIENCQ19EZXRlY3Rpb25SZXN1bHQ6OmdldERldGVjdGlvblJlc3VsdENvbHVtbnMoKSB7DQorICBhZGp1c3RJbmRpY2F0b3JDb2x1bW5Sb3dOdW1iZXJzKA0KKyAgICAgIChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiltX2RldGVjdGlvblJlc3VsdENvbHVtbnMuR2V0QXQoMCkpOw0KKyAgYWRqdXN0SW5kaWNhdG9yQ29sdW1uUm93TnVtYmVycygNCisgICAgICAoQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiopbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zLkdldEF0KA0KKyAgICAgICAgICBtX2JhcmNvZGVDb2x1bW5Db3VudCArIDEpKTsNCisgIGludDMyX3QgdW5hZGp1c3RlZENvZGV3b3JkQ291bnQgPSBDQkNfUERGNDE3Q29tbW9uOjpNQVhfQ09ERVdPUkRTX0lOX0JBUkNPREU7DQorICBpbnQzMl90IHByZXZpb3VzVW5hZGp1c3RlZENvdW50Ow0KKyAgZG8gew0KKyAgICBwcmV2aW91c1VuYWRqdXN0ZWRDb3VudCA9IHVuYWRqdXN0ZWRDb2Rld29yZENvdW50Ow0KKyAgICB1bmFkanVzdGVkQ29kZXdvcmRDb3VudCA9IGFkanVzdFJvd051bWJlcnMoKTsNCisgIH0gd2hpbGUgKHVuYWRqdXN0ZWRDb2Rld29yZENvdW50ID4gMCAmJg0KKyAgICAgICAgICAgdW5hZGp1c3RlZENvZGV3b3JkQ291bnQgPCBwcmV2aW91c1VuYWRqdXN0ZWRDb3VudCk7DQorICByZXR1cm4gbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zOw0KK30NCit2b2lkIENCQ19EZXRlY3Rpb25SZXN1bHQ6OnNldEJvdW5kaW5nQm94KENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3gpIHsNCisgIG1fYm91bmRpbmdCb3ggPSBib3VuZGluZ0JveDsNCit9DQorQ0JDX0JvdW5kaW5nQm94KiBDQkNfRGV0ZWN0aW9uUmVzdWx0OjpnZXRCb3VuZGluZ0JveCgpIHsNCisgIHJldHVybiBtX2JvdW5kaW5nQm94Ow0KK30NCit2b2lkIENCQ19EZXRlY3Rpb25SZXN1bHQ6OnNldERldGVjdGlvblJlc3VsdENvbHVtbigNCisgICAgaW50MzJfdCBiYXJjb2RlQ29sdW1uLA0KKyAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiBkZXRlY3Rpb25SZXN1bHRDb2x1bW4pIHsNCisgIG1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1uc1tiYXJjb2RlQ29sdW1uXSA9IGRldGVjdGlvblJlc3VsdENvbHVtbjsNCit9DQorQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiogQ0JDX0RldGVjdGlvblJlc3VsdDo6Z2V0RGV0ZWN0aW9uUmVzdWx0Q29sdW1uKA0KKyAgICBpbnQzMl90IGJhcmNvZGVDb2x1bW4pIHsNCisgIHJldHVybiAoQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiopbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zW2JhcmNvZGVDb2x1bW5dOw0KK30NCitDRlhfQnl0ZVN0cmluZyBDQkNfRGV0ZWN0aW9uUmVzdWx0Ojp0b1N0cmluZygpIHsNCisgIENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qIHJvd0luZGljYXRvckNvbHVtbiA9DQorICAgICAgKENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qKW1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1uc1swXTsNCisgIGlmIChyb3dJbmRpY2F0b3JDb2x1bW4gPT0gTlVMTCkgew0KKyAgICByb3dJbmRpY2F0b3JDb2x1bW4gPSAoQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiopDQorICAgICAgICBtX2RldGVjdGlvblJlc3VsdENvbHVtbnNbbV9iYXJjb2RlQ29sdW1uQ291bnQgKyAxXTsNCisgIH0NCisgIENGWF9CeXRlU3RyaW5nIHJlc3VsdDsNCisgIGZvciAoaW50MzJfdCBjb2Rld29yZHNSb3cgPSAwOw0KKyAgICAgICBjb2Rld29yZHNSb3cgPCByb3dJbmRpY2F0b3JDb2x1bW4tPmdldENvZGV3b3JkcygpLT5HZXRTaXplKCk7DQorICAgICAgIGNvZGV3b3Jkc1JvdysrKSB7DQorICAgIHJlc3VsdCArPSAoRlhfQ0hBUiljb2Rld29yZHNSb3c7DQorICAgIGZvciAoaW50MzJfdCBiYXJjb2RlQ29sdW1uID0gMDsgYmFyY29kZUNvbHVtbiA8IG1fYmFyY29kZUNvbHVtbkNvdW50ICsgMjsNCisgICAgICAgICBiYXJjb2RlQ29sdW1uKyspIHsNCisgICAgICBpZiAobV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zW2JhcmNvZGVDb2x1bW5dID09IE5VTEwpIHsNCisgICAgICAgIHJlc3VsdCArPSAiICAgIHwgICAiOw0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIENCQ19Db2Rld29yZCogY29kZXdvcmQgPQ0KKyAgICAgICAgICAoQ0JDX0NvZGV3b3JkKikoKENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1uc1tiYXJjb2RlQ29sdW1uXSkNCisgICAgICAgICAgICAgIC0+Z2V0Q29kZXdvcmRzKCkNCisgICAgICAgICAgICAgIC0+R2V0QXQoY29kZXdvcmRzUm93KTsNCisgICAgICBpZiAoY29kZXdvcmQgPT0gTlVMTCkgew0KKyAgICAgICAgcmVzdWx0ICs9ICIgICAgfCAgICI7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgcmVzdWx0ICs9IGNvZGV3b3JkLT5nZXRSb3dOdW1iZXIoKTsNCisgICAgICByZXN1bHQgKz0gY29kZXdvcmQtPmdldFZhbHVlKCk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQorfQ0KK3ZvaWQgQ0JDX0RldGVjdGlvblJlc3VsdDo6YWRqdXN0SW5kaWNhdG9yQ29sdW1uUm93TnVtYmVycygNCisgICAgQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiogZGV0ZWN0aW9uUmVzdWx0Q29sdW1uKSB7DQorICBpZiAoZGV0ZWN0aW9uUmVzdWx0Q29sdW1uICE9IE5VTEwpIHsNCisgICAgKChDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKilkZXRlY3Rpb25SZXN1bHRDb2x1bW4pDQorICAgICAgICAtPmFkanVzdENvbXBsZXRlSW5kaWNhdG9yQ29sdW1uUm93TnVtYmVycygqbV9iYXJjb2RlTWV0YWRhdGEpOw0KKyAgfQ0KK30NCitpbnQzMl90IENCQ19EZXRlY3Rpb25SZXN1bHQ6OmFkanVzdFJvd051bWJlcnMoKSB7DQorICBpbnQzMl90IHVuYWRqdXN0ZWRDb3VudCA9IGFkanVzdFJvd051bWJlcnNCeVJvdygpOw0KKyAgaWYgKHVuYWRqdXN0ZWRDb3VudCA9PSAwKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IGJhcmNvZGVDb2x1bW4gPSAxOyBiYXJjb2RlQ29sdW1uIDwgbV9iYXJjb2RlQ29sdW1uQ291bnQgKyAxOw0KKyAgICAgICBiYXJjb2RlQ29sdW1uKyspIHsNCisgICAgQ0ZYX1B0ckFycmF5KiBjb2Rld29yZHMgPQ0KKyAgICAgICAgKChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiltX2RldGVjdGlvblJlc3VsdENvbHVtbnNbYmFyY29kZUNvbHVtbl0pDQorICAgICAgICAgICAgLT5nZXRDb2Rld29yZHMoKTsNCisgICAgZm9yIChpbnQzMl90IGNvZGV3b3Jkc1JvdyA9IDA7IGNvZGV3b3Jkc1JvdyA8IGNvZGV3b3Jkcy0+R2V0U2l6ZSgpOw0KKyAgICAgICAgIGNvZGV3b3Jkc1JvdysrKSB7DQorICAgICAgaWYgKGNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93KSA9PSBOVUxMKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgaWYgKCEoKENCQ19Db2Rld29yZCopY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cpKQ0KKyAgICAgICAgICAgICAgIC0+aGFzVmFsaWRSb3dOdW1iZXIoKSkgew0KKyAgICAgICAgYWRqdXN0Um93TnVtYmVycyhiYXJjb2RlQ29sdW1uLCBjb2Rld29yZHNSb3csIGNvZGV3b3Jkcyk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gdW5hZGp1c3RlZENvdW50Ow0KK30NCitpbnQzMl90IENCQ19EZXRlY3Rpb25SZXN1bHQ6OmFkanVzdFJvd051bWJlcnNCeVJvdygpIHsNCisgIGFkanVzdFJvd051bWJlcnNGcm9tQm90aFJJKCk7DQorICBpbnQzMl90IHVuYWRqdXN0ZWRDb3VudCA9IGFkanVzdFJvd051bWJlcnNGcm9tTFJJKCk7DQorICByZXR1cm4gdW5hZGp1c3RlZENvdW50ICsgYWRqdXN0Um93TnVtYmVyc0Zyb21SUkkoKTsNCit9DQoraW50MzJfdCBDQkNfRGV0ZWN0aW9uUmVzdWx0OjphZGp1c3RSb3dOdW1iZXJzRnJvbUJvdGhSSSgpIHsNCisgIGlmIChtX2RldGVjdGlvblJlc3VsdENvbHVtbnNbMF0gPT0gTlVMTCB8fA0KKyAgICAgIG1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1uc1ttX2JhcmNvZGVDb2x1bW5Db3VudCArIDFdID09IE5VTEwpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBDRlhfUHRyQXJyYXkqIExSSWNvZGV3b3JkcyA9DQorICAgICAgKChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiltX2RldGVjdGlvblJlc3VsdENvbHVtbnNbMF0pLT5nZXRDb2Rld29yZHMoKTsNCisgIENGWF9QdHJBcnJheSogUlJJY29kZXdvcmRzID0NCisgICAgICAoKENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qKQ0KKyAgICAgICAgICAgbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zW21fYmFyY29kZUNvbHVtbkNvdW50ICsgMV0pDQorICAgICAgICAgIC0+Z2V0Q29kZXdvcmRzKCk7DQorICBmb3IgKGludDMyX3QgY29kZXdvcmRzUm93ID0gMDsgY29kZXdvcmRzUm93IDwgTFJJY29kZXdvcmRzLT5HZXRTaXplKCk7DQorICAgICAgIGNvZGV3b3Jkc1JvdysrKSB7DQorICAgIGlmIChMUkljb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdykgIT0gTlVMTCAmJg0KKyAgICAgICAgUlJJY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cpICE9IE5VTEwgJiYNCisgICAgICAgICgoQ0JDX0NvZGV3b3JkKilMUkljb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdykpLT5nZXRSb3dOdW1iZXIoKSA9PQ0KKyAgICAgICAgICAgICgoQ0JDX0NvZGV3b3JkKilSUkljb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdykpDQorICAgICAgICAgICAgICAgIC0+Z2V0Um93TnVtYmVyKCkpIHsNCisgICAgICBmb3IgKGludDMyX3QgYmFyY29kZUNvbHVtbiA9IDE7IGJhcmNvZGVDb2x1bW4gPD0gbV9iYXJjb2RlQ29sdW1uQ291bnQ7DQorICAgICAgICAgICBiYXJjb2RlQ29sdW1uKyspIHsNCisgICAgICAgIENCQ19Db2Rld29yZCogY29kZXdvcmQgPQ0KKyAgICAgICAgICAgIChDQkNfQ29kZXdvcmQqKSgoQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiopDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2RldGVjdGlvblJlc3VsdENvbHVtbnNbYmFyY29kZUNvbHVtbl0pDQorICAgICAgICAgICAgICAgIC0+Z2V0Q29kZXdvcmRzKCkNCisgICAgICAgICAgICAgICAgLT5HZXRBdChjb2Rld29yZHNSb3cpOw0KKyAgICAgICAgaWYgKGNvZGV3b3JkID09IE5VTEwpIHsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBjb2Rld29yZC0+c2V0Um93TnVtYmVyKA0KKyAgICAgICAgICAgICgoQ0JDX0NvZGV3b3JkKilMUkljb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdykpLT5nZXRSb3dOdW1iZXIoKSk7DQorICAgICAgICBpZiAoIWNvZGV3b3JkLT5oYXNWYWxpZFJvd051bWJlcigpKSB7DQorICAgICAgICAgICgoQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiopbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zW2JhcmNvZGVDb2x1bW5dKQ0KKyAgICAgICAgICAgICAgLT5nZXRDb2Rld29yZHMoKQ0KKyAgICAgICAgICAgICAgLT5TZXRBdChjb2Rld29yZHNSb3csIE5VTEwpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KK2ludDMyX3QgQ0JDX0RldGVjdGlvblJlc3VsdDo6YWRqdXN0Um93TnVtYmVyc0Zyb21SUkkoKSB7DQorICBpZiAobV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zW21fYmFyY29kZUNvbHVtbkNvdW50ICsgMV0gPT0gTlVMTCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGludDMyX3QgdW5hZGp1c3RlZENvdW50ID0gMDsNCisgIENGWF9QdHJBcnJheSogY29kZXdvcmRzID0NCisgICAgICAoKENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qKW1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1ucy5HZXRBdCgNCisgICAgICAgICAgIG1fYmFyY29kZUNvbHVtbkNvdW50ICsgMSkpDQorICAgICAgICAgIC0+Z2V0Q29kZXdvcmRzKCk7DQorICBmb3IgKGludDMyX3QgY29kZXdvcmRzUm93ID0gMDsgY29kZXdvcmRzUm93IDwgY29kZXdvcmRzLT5HZXRTaXplKCk7DQorICAgICAgIGNvZGV3b3Jkc1JvdysrKSB7DQorICAgIGlmIChjb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdykgPT0gTlVMTCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGludDMyX3Qgcm93SW5kaWNhdG9yUm93TnVtYmVyID0NCisgICAgICAgICgoQ0JDX0NvZGV3b3JkKiljb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdykpLT5nZXRSb3dOdW1iZXIoKTsNCisgICAgaW50MzJfdCBpbnZhbGlkUm93Q291bnRzID0gMDsNCisgICAgZm9yIChpbnQzMl90IGJhcmNvZGVDb2x1bW4gPSBtX2JhcmNvZGVDb2x1bW5Db3VudCArIDE7DQorICAgICAgICAgYmFyY29kZUNvbHVtbiA+IDAgJiYgaW52YWxpZFJvd0NvdW50cyA8IEFESlVTVF9ST1dfTlVNQkVSX1NLSVA7DQorICAgICAgICAgYmFyY29kZUNvbHVtbi0tKSB7DQorICAgICAgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCA9DQorICAgICAgICAgIChDQkNfQ29kZXdvcmQqKSgoQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiopDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zLkdldEF0KGJhcmNvZGVDb2x1bW4pKQ0KKyAgICAgICAgICAgICAgLT5nZXRDb2Rld29yZHMoKQ0KKyAgICAgICAgICAgICAgLT5HZXRBdChjb2Rld29yZHNSb3cpOw0KKyAgICAgIGlmIChjb2Rld29yZCAhPSBOVUxMKSB7DQorICAgICAgICBpbnZhbGlkUm93Q291bnRzID0gYWRqdXN0Um93TnVtYmVySWZWYWxpZChyb3dJbmRpY2F0b3JSb3dOdW1iZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkUm93Q291bnRzLCBjb2Rld29yZCk7DQorICAgICAgICBpZiAoIWNvZGV3b3JkLT5oYXNWYWxpZFJvd051bWJlcigpKSB7DQorICAgICAgICAgIHVuYWRqdXN0ZWRDb3VudCsrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHVuYWRqdXN0ZWRDb3VudDsNCit9DQoraW50MzJfdCBDQkNfRGV0ZWN0aW9uUmVzdWx0OjphZGp1c3RSb3dOdW1iZXJzRnJvbUxSSSgpIHsNCisgIGlmIChtX2RldGVjdGlvblJlc3VsdENvbHVtbnNbMF0gPT0gTlVMTCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGludDMyX3QgdW5hZGp1c3RlZENvdW50ID0gMDsNCisgIENGWF9QdHJBcnJheSogY29kZXdvcmRzID0NCisgICAgICAoKENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qKW1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1ucy5HZXRBdCgwKSkNCisgICAgICAgICAgLT5nZXRDb2Rld29yZHMoKTsNCisgIGZvciAoaW50MzJfdCBjb2Rld29yZHNSb3cgPSAwOyBjb2Rld29yZHNSb3cgPCBjb2Rld29yZHMtPkdldFNpemUoKTsNCisgICAgICAgY29kZXdvcmRzUm93KyspIHsNCisgICAgaWYgKGNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93KSA9PSBOVUxMKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaW50MzJfdCByb3dJbmRpY2F0b3JSb3dOdW1iZXIgPQ0KKyAgICAgICAgKChDQkNfQ29kZXdvcmQqKWNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93KSktPmdldFJvd051bWJlcigpOw0KKyAgICBpbnQzMl90IGludmFsaWRSb3dDb3VudHMgPSAwOw0KKyAgICBmb3IgKGludDMyX3QgYmFyY29kZUNvbHVtbiA9IDE7IGJhcmNvZGVDb2x1bW4gPCBtX2JhcmNvZGVDb2x1bW5Db3VudCArIDEgJiYNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkUm93Q291bnRzIDwgQURKVVNUX1JPV19OVU1CRVJfU0tJUDsNCisgICAgICAgICBiYXJjb2RlQ29sdW1uKyspIHsNCisgICAgICBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkID0NCisgICAgICAgICAgKENCQ19Db2Rld29yZCopKChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKikNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2RldGVjdGlvblJlc3VsdENvbHVtbnNbYmFyY29kZUNvbHVtbl0pDQorICAgICAgICAgICAgICAtPmdldENvZGV3b3JkcygpDQorICAgICAgICAgICAgICAtPkdldEF0KGNvZGV3b3Jkc1Jvdyk7DQorICAgICAgaWYgKGNvZGV3b3JkICE9IE5VTEwpIHsNCisgICAgICAgIGludmFsaWRSb3dDb3VudHMgPSBhZGp1c3RSb3dOdW1iZXJJZlZhbGlkKHJvd0luZGljYXRvclJvd051bWJlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRSb3dDb3VudHMsIGNvZGV3b3JkKTsNCisgICAgICAgIGlmICghY29kZXdvcmQtPmhhc1ZhbGlkUm93TnVtYmVyKCkpIHsNCisgICAgICAgICAgdW5hZGp1c3RlZENvdW50Kys7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gdW5hZGp1c3RlZENvdW50Ow0KK30NCitpbnQzMl90IENCQ19EZXRlY3Rpb25SZXN1bHQ6OmFkanVzdFJvd051bWJlcklmVmFsaWQoDQorICAgIGludDMyX3Qgcm93SW5kaWNhdG9yUm93TnVtYmVyLA0KKyAgICBpbnQzMl90IGludmFsaWRSb3dDb3VudHMsDQorICAgIENCQ19Db2Rld29yZCogY29kZXdvcmQpIHsNCisgIGlmIChjb2Rld29yZCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBpbnZhbGlkUm93Q291bnRzOw0KKyAgfQ0KKyAgaWYgKCFjb2Rld29yZC0+aGFzVmFsaWRSb3dOdW1iZXIoKSkgew0KKyAgICBpZiAoY29kZXdvcmQtPmlzVmFsaWRSb3dOdW1iZXIocm93SW5kaWNhdG9yUm93TnVtYmVyKSkgew0KKyAgICAgIGNvZGV3b3JkLT5zZXRSb3dOdW1iZXIocm93SW5kaWNhdG9yUm93TnVtYmVyKTsNCisgICAgICBpbnZhbGlkUm93Q291bnRzID0gMDsNCisgICAgfSBlbHNlIHsNCisgICAgICArK2ludmFsaWRSb3dDb3VudHM7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBpbnZhbGlkUm93Q291bnRzOw0KK30NCit2b2lkIENCQ19EZXRlY3Rpb25SZXN1bHQ6OmFkanVzdFJvd051bWJlcnMoaW50MzJfdCBiYXJjb2RlQ29sdW1uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGV3b3Jkc1JvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckFycmF5KiBjb2Rld29yZHMpIHsNCisgIENCQ19Db2Rld29yZCogY29kZXdvcmQgPSAoQ0JDX0NvZGV3b3JkKiljb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1Jvdyk7DQorICBDRlhfUHRyQXJyYXkqIHByZXZpb3VzQ29sdW1uQ29kZXdvcmRzID0NCisgICAgICAoKENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qKW1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1ucy5HZXRBdCgNCisgICAgICAgICAgIGJhcmNvZGVDb2x1bW4gLSAxKSkNCisgICAgICAgICAgLT5nZXRDb2Rld29yZHMoKTsNCisgIENGWF9QdHJBcnJheSogbmV4dENvbHVtbkNvZGV3b3JkcyA9IHByZXZpb3VzQ29sdW1uQ29kZXdvcmRzOw0KKyAgaWYgKG1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1uc1tiYXJjb2RlQ29sdW1uICsgMV0gIT0gTlVMTCkgew0KKyAgICBuZXh0Q29sdW1uQ29kZXdvcmRzID0gKChDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKikNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kZXRlY3Rpb25SZXN1bHRDb2x1bW5zW2JhcmNvZGVDb2x1bW4gKyAxXSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmdldENvZGV3b3JkcygpOw0KKyAgfQ0KKyAgQ0ZYX1B0ckFycmF5IG90aGVyQ29kZXdvcmRzOw0KKyAgb3RoZXJDb2Rld29yZHMuU2V0U2l6ZSgxNCk7DQorICBvdGhlckNvZGV3b3Jkc1syXSA9IHByZXZpb3VzQ29sdW1uQ29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cpOw0KKyAgb3RoZXJDb2Rld29yZHNbM10gPSBuZXh0Q29sdW1uQ29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cpOw0KKyAgaWYgKGNvZGV3b3Jkc1JvdyA+IDApIHsNCisgICAgb3RoZXJDb2Rld29yZHNbMF0gPSBjb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdyAtIDEpOw0KKyAgICBvdGhlckNvZGV3b3Jkc1s0XSA9IHByZXZpb3VzQ29sdW1uQ29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cgLSAxKTsNCisgICAgb3RoZXJDb2Rld29yZHNbNV0gPSBuZXh0Q29sdW1uQ29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cgLSAxKTsNCisgIH0NCisgIGlmIChjb2Rld29yZHNSb3cgPiAxKSB7DQorICAgIG90aGVyQ29kZXdvcmRzWzhdID0gY29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cgLSAyKTsNCisgICAgb3RoZXJDb2Rld29yZHNbMTBdID0gcHJldmlvdXNDb2x1bW5Db2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdyAtIDIpOw0KKyAgICBvdGhlckNvZGV3b3Jkc1sxMV0gPSBuZXh0Q29sdW1uQ29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cgLSAyKTsNCisgIH0NCisgIGlmIChjb2Rld29yZHNSb3cgPCBjb2Rld29yZHMtPkdldFNpemUoKSAtIDEpIHsNCisgICAgb3RoZXJDb2Rld29yZHNbMV0gPSBjb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdyArIDEpOw0KKyAgICBvdGhlckNvZGV3b3Jkc1s2XSA9IHByZXZpb3VzQ29sdW1uQ29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cgKyAxKTsNCisgICAgb3RoZXJDb2Rld29yZHNbN10gPSBuZXh0Q29sdW1uQ29kZXdvcmRzLT5HZXRBdChjb2Rld29yZHNSb3cgKyAxKTsNCisgIH0NCisgIGlmIChjb2Rld29yZHNSb3cgPCBjb2Rld29yZHMtPkdldFNpemUoKSAtIDIpIHsNCisgICAgb3RoZXJDb2Rld29yZHNbOV0gPSBjb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdyArIDIpOw0KKyAgICBvdGhlckNvZGV3b3Jkc1sxMl0gPSBwcmV2aW91c0NvbHVtbkNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93ICsgMik7DQorICAgIG90aGVyQ29kZXdvcmRzWzEzXSA9IG5leHRDb2x1bW5Db2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdyArIDIpOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgb3RoZXJDb2Rld29yZHMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgQ0JDX0NvZGV3b3JkKiBvdGhlckNvZGV3b3JkID0gKENCQ19Db2Rld29yZCopb3RoZXJDb2Rld29yZHMuR2V0QXQoaSk7DQorICAgIGlmIChhZGp1c3RSb3dOdW1iZXIoY29kZXdvcmQsIG90aGVyQ29kZXdvcmQpKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICB9DQorfQ0KK0ZYX0JPT0wgQ0JDX0RldGVjdGlvblJlc3VsdDo6YWRqdXN0Um93TnVtYmVyKENCQ19Db2Rld29yZCogY29kZXdvcmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvZGV3b3JkKiBvdGhlckNvZGV3b3JkKSB7DQorICBpZiAob3RoZXJDb2Rld29yZCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChvdGhlckNvZGV3b3JkLT5oYXNWYWxpZFJvd051bWJlcigpICYmDQorICAgICAgb3RoZXJDb2Rld29yZC0+Z2V0QnVja2V0KCkgPT0gY29kZXdvcmQtPmdldEJ1Y2tldCgpKSB7DQorICAgIGNvZGV3b3JkLT5zZXRSb3dOdW1iZXIob3RoZXJDb2Rld29yZC0+Z2V0Um93TnVtYmVyKCkpOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQoraW50MzJfdCBDQkNfRGV0ZWN0aW9uUmVzdWx0OjpnZXRCYXJjb2RlQ29sdW1uQ291bnQoKSB7DQorICByZXR1cm4gbV9iYXJjb2RlQ29sdW1uQ291bnQ7DQorfQ0KK2ludDMyX3QgQ0JDX0RldGVjdGlvblJlc3VsdDo6Z2V0QmFyY29kZVJvd0NvdW50KCkgew0KKyAgcmV0dXJuIG1fYmFyY29kZU1ldGFkYXRhLT5nZXRSb3dDb3VudCgpOw0KK30NCitpbnQzMl90IENCQ19EZXRlY3Rpb25SZXN1bHQ6OmdldEJhcmNvZGVFQ0xldmVsKCkgew0KKyAgcmV0dXJuIG1fYmFyY29kZU1ldGFkYXRhLT5nZXRFcnJvckNvcnJlY3Rpb25MZXZlbCgpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0LmggYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwNjVlYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3Rpb25SZXN1bHQuaApAQCAtMCwwICsxLDU1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0VEVEVDVElPTlJFU1VMVF9IXw0KKyNkZWZpbmUgX0JDX0VEVEVDVElPTlJFU1VMVF9IXw0KK2NsYXNzIENCQ19CYXJjb2RlTWV0YWRhdGE7DQorY2xhc3MgQ0JDX0JvdW5kaW5nQm94Ow0KK2NsYXNzIENCQ19Db2Rld29yZDsNCitjbGFzcyBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uOw0KK2NsYXNzIENCQ19EZXRlY3Rpb25SZXN1bHQgew0KKyBwdWJsaWM6DQorICBDQkNfRGV0ZWN0aW9uUmVzdWx0KENCQ19CYXJjb2RlTWV0YWRhdGEqIGJhcmNvZGVNZXRhZGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCk7DQorICB2aXJ0dWFsIH5DQkNfRGV0ZWN0aW9uUmVzdWx0KCk7DQorICBDRlhfUHRyQXJyYXkmIGdldERldGVjdGlvblJlc3VsdENvbHVtbnMoKTsNCisgIHZvaWQgc2V0Qm91bmRpbmdCb3goQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCk7DQorICBDQkNfQm91bmRpbmdCb3gqIGdldEJvdW5kaW5nQm94KCk7DQorICB2b2lkIHNldERldGVjdGlvblJlc3VsdENvbHVtbigNCisgICAgICBpbnQzMl90IGJhcmNvZGVDb2x1bW4sDQorICAgICAgQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiogZGV0ZWN0aW9uUmVzdWx0Q29sdW1uKTsNCisgIENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qIGdldERldGVjdGlvblJlc3VsdENvbHVtbihpbnQzMl90IGJhcmNvZGVDb2x1bW4pOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgdG9TdHJpbmcoKTsNCisNCisgIGludDMyX3QgZ2V0QmFyY29kZUNvbHVtbkNvdW50KCk7DQorICBpbnQzMl90IGdldEJhcmNvZGVSb3dDb3VudCgpOw0KKyAgaW50MzJfdCBnZXRCYXJjb2RlRUNMZXZlbCgpOw0KKw0KKyBwcml2YXRlOg0KKyAgc3RhdGljIGludDMyX3QgQURKVVNUX1JPV19OVU1CRVJfU0tJUDsNCisgIENCQ19CYXJjb2RlTWV0YWRhdGEqIG1fYmFyY29kZU1ldGFkYXRhOw0KKyAgQ0ZYX1B0ckFycmF5IG1fZGV0ZWN0aW9uUmVzdWx0Q29sdW1uczsNCisgIENCQ19Cb3VuZGluZ0JveCogbV9ib3VuZGluZ0JveDsNCisgIGludDMyX3QgbV9iYXJjb2RlQ29sdW1uQ291bnQ7DQorDQorIHByaXZhdGU6DQorICB2b2lkIGFkanVzdEluZGljYXRvckNvbHVtblJvd051bWJlcnMoDQorICAgICAgQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiogZGV0ZWN0aW9uUmVzdWx0Q29sdW1uKTsNCisgIGludDMyX3QgYWRqdXN0Um93TnVtYmVycygpOw0KKyAgaW50MzJfdCBhZGp1c3RSb3dOdW1iZXJzQnlSb3coKTsNCisgIGludDMyX3QgYWRqdXN0Um93TnVtYmVyc0Zyb21Cb3RoUkkoKTsNCisgIGludDMyX3QgYWRqdXN0Um93TnVtYmVyc0Zyb21SUkkoKTsNCisgIGludDMyX3QgYWRqdXN0Um93TnVtYmVyc0Zyb21MUkkoKTsNCisgIHN0YXRpYyBpbnQzMl90IGFkanVzdFJvd051bWJlcklmVmFsaWQoaW50MzJfdCByb3dJbmRpY2F0b3JSb3dOdW1iZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW52YWxpZFJvd0NvdW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCk7DQorICB2b2lkIGFkanVzdFJvd051bWJlcnMoaW50MzJfdCBiYXJjb2RlQ29sdW1uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZXdvcmRzUm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJBcnJheSogY29kZXdvcmRzKTsNCisgIHN0YXRpYyBGWF9CT09MIGFkanVzdFJvd051bWJlcihDQkNfQ29kZXdvcmQqIGNvZGV3b3JkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db2Rld29yZCogb3RoZXJDb2Rld29yZCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Q29sdW1uLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3Rpb25SZXN1bHRDb2x1bW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMWFiZDIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Q29sdW1uLmNwcApAQCAtMCwwICsxLDEwMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAxMyBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0NvZGV3b3JkLmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0JvdW5kaW5nQm94LmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0RldGVjdGlvblJlc3VsdENvbHVtbi5oIg0KK2ludDMyX3QgQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbjo6TUFYX05FQVJCWV9ESVNUQU5DRSA9IDU7DQorQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbjo6Q0JDX0RldGVjdGlvblJlc3VsdENvbHVtbigNCisgICAgQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCkgew0KKyAgbV9ib3VuZGluZ0JveCA9IGJvdW5kaW5nQm94Ow0KKyAgbV9jb2Rld29yZHMgPSBuZXcgQ0ZYX1B0ckFycmF5Ow0KKyAgbV9jb2Rld29yZHMtPlNldFNpemUoYm91bmRpbmdCb3gtPmdldE1heFkoKSAtIGJvdW5kaW5nQm94LT5nZXRNaW5ZKCkgKyAxKTsNCit9DQorQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbjo6fkNCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4oKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX2NvZGV3b3Jkcy0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgZGVsZXRlIChDQkNfQ29kZXdvcmQqKW1fY29kZXdvcmRzLT5HZXRBdChpKTsNCisgIH0NCisgIG1fY29kZXdvcmRzLT5SZW1vdmVBbGwoKTsNCisgIGRlbGV0ZSBtX2NvZGV3b3JkczsNCit9DQorQ0JDX0NvZGV3b3JkKiBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uOjpnZXRDb2Rld29yZE5lYXJieShpbnQzMl90IGltYWdlUm93KSB7DQorICBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkID0gZ2V0Q29kZXdvcmQoaW1hZ2VSb3cpOw0KKyAgaWYgKGNvZGV3b3JkICE9IE5VTEwpIHsNCisgICAgcmV0dXJuIGNvZGV3b3JkOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgTUFYX05FQVJCWV9ESVNUQU5DRTsgaSsrKSB7DQorICAgIGludDMyX3QgbmVhckltYWdlUm93ID0gaW1hZ2VSb3dUb0NvZGV3b3JkSW5kZXgoaW1hZ2VSb3cpIC0gaTsNCisgICAgaWYgKG5lYXJJbWFnZVJvdyA+PSAwKSB7DQorICAgICAgY29kZXdvcmQgPSAoQ0JDX0NvZGV3b3JkKiltX2NvZGV3b3Jkcy0+R2V0QXQobmVhckltYWdlUm93KTsNCisgICAgICBpZiAoY29kZXdvcmQgIT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIGNvZGV3b3JkOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBuZWFySW1hZ2VSb3cgPSBpbWFnZVJvd1RvQ29kZXdvcmRJbmRleChpbWFnZVJvdykgKyBpOw0KKyAgICBpZiAobmVhckltYWdlUm93IDwgbV9jb2Rld29yZHMtPkdldFNpemUoKSkgew0KKyAgICAgIGNvZGV3b3JkID0gKENCQ19Db2Rld29yZCopbV9jb2Rld29yZHMtPkdldEF0KG5lYXJJbWFnZVJvdyk7DQorICAgICAgaWYgKGNvZGV3b3JkICE9IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBjb2Rld29yZDsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitpbnQzMl90IENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW46OmltYWdlUm93VG9Db2Rld29yZEluZGV4KGludDMyX3QgaW1hZ2VSb3cpIHsNCisgIHJldHVybiBpbWFnZVJvdyAtIG1fYm91bmRpbmdCb3gtPmdldE1pblkoKTsNCit9DQoraW50MzJfdCBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uOjpjb2Rld29yZEluZGV4VG9JbWFnZVJvdygNCisgICAgaW50MzJfdCBjb2Rld29yZEluZGV4KSB7DQorICByZXR1cm4gbV9ib3VuZGluZ0JveC0+Z2V0TWluWSgpICsgY29kZXdvcmRJbmRleDsNCit9DQordm9pZCBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uOjpzZXRDb2Rld29yZChpbnQzMl90IGltYWdlUm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCkgew0KKyAgbV9jb2Rld29yZHMtPlNldEF0KGltYWdlUm93VG9Db2Rld29yZEluZGV4KGltYWdlUm93KSwgY29kZXdvcmQpOw0KK30NCitDQkNfQ29kZXdvcmQqIENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW46OmdldENvZGV3b3JkKGludDMyX3QgaW1hZ2VSb3cpIHsNCisgIHJldHVybiAoQ0JDX0NvZGV3b3JkKiltX2NvZGV3b3Jkcy0+R2V0QXQoaW1hZ2VSb3dUb0NvZGV3b3JkSW5kZXgoaW1hZ2VSb3cpKTsNCit9DQorQ0JDX0JvdW5kaW5nQm94KiBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uOjpnZXRCb3VuZGluZ0JveCgpIHsNCisgIHJldHVybiBtX2JvdW5kaW5nQm94Ow0KK30NCitDRlhfUHRyQXJyYXkqIENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW46OmdldENvZGV3b3JkcygpIHsNCisgIHJldHVybiBtX2NvZGV3b3JkczsNCit9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbjo6dG9TdHJpbmcoKSB7DQorICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7DQorICBpbnQzMl90IHJvdyA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX2NvZGV3b3Jkcy0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCA9IChDQkNfQ29kZXdvcmQqKW1fY29kZXdvcmRzLT5HZXRBdChpKTsNCisgICAgaWYgKGNvZGV3b3JkID09IE5VTEwpIHsNCisgICAgICByZXN1bHQgKz0gKEZYX0NIQVIpcm93Ow0KKyAgICAgIHJvdysrOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIHJlc3VsdCArPSAoRlhfQ0hBUilyb3c7DQorICAgIHJlc3VsdCArPSBjb2Rld29yZC0+Z2V0Um93TnVtYmVyKCk7DQorICAgIHJlc3VsdCArPSBjb2Rld29yZC0+Z2V0VmFsdWUoKTsNCisgICAgcm93Kys7DQorICB9DQorICByZXR1cm4gcmVzdWx0Ow0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Q29sdW1uLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Q29sdW1uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU4YTFlOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3Rpb25SZXN1bHRDb2x1bW4uaApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX0RFVEVDVElPTlJFU1VMVENPTFVNTl9IXw0KKyNkZWZpbmUgX0JDX0RFVEVDVElPTlJFU1VMVENPTFVNTl9IXw0KK2NsYXNzIENCQ19Db2Rld29yZDsNCitjbGFzcyBDQkNfQm91bmRpbmdCb3g7DQorY2xhc3MgQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiB7DQorIHB1YmxpYzoNCisgIENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4oQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCk7DQorICB2aXJ0dWFsIH5DQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKCk7DQorICBDQkNfQ29kZXdvcmQqIGdldENvZGV3b3JkTmVhcmJ5KGludDMyX3QgaW1hZ2VSb3cpOw0KKyAgaW50MzJfdCBpbWFnZVJvd1RvQ29kZXdvcmRJbmRleChpbnQzMl90IGltYWdlUm93KTsNCisgIGludDMyX3QgY29kZXdvcmRJbmRleFRvSW1hZ2VSb3coaW50MzJfdCBjb2Rld29yZEluZGV4KTsNCisgIHZvaWQgc2V0Q29kZXdvcmQoaW50MzJfdCBpbWFnZVJvdywgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCk7DQorICBDQkNfQ29kZXdvcmQqIGdldENvZGV3b3JkKGludDMyX3QgaW1hZ2VSb3cpOw0KKyAgQ0JDX0JvdW5kaW5nQm94KiBnZXRCb3VuZGluZ0JveCgpOw0KKyAgQ0ZYX1B0ckFycmF5KiBnZXRDb2Rld29yZHMoKTsNCisgIENGWF9CeXRlU3RyaW5nIHRvU3RyaW5nKCk7DQorDQorIHB1YmxpYzoNCisgIENCQ19Cb3VuZGluZ0JveCogbV9ib3VuZGluZ0JveDsNCisgIENGWF9QdHJBcnJheSogbV9jb2Rld29yZHM7DQorDQorIHByaXZhdGU6DQorICBzdGF0aWMgaW50MzJfdCBNQVhfTkVBUkJZX0RJU1RBTkNFOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbi5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDkxZDRlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbi5jcHAKQEAgLTAsMCArMSwyNjUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMTMgWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19SZXN1bHRQb2ludC5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdCYXJjb2RlTWV0YWRhdGEuaCINCisjaW5jbHVkZSAiQkNfUERGNDE3Qm91bmRpbmdCb3guaCINCisjaW5jbHVkZSAiQkNfUERGNDE3Q29kZXdvcmQuaCINCisjaW5jbHVkZSAiQkNfUERGNDE3QmFyY29kZVZhbHVlLmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0NvbW1vbi5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdEZXRlY3Rpb25SZXN1bHRDb2x1bW4uaCINCisjaW5jbHVkZSAiQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uLmgiDQorQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbjo6Q0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbigNCisgICAgQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCwNCisgICAgRlhfQk9PTCBpc0xlZnQpDQorICAgIDogQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbihib3VuZGluZ0JveCkgew0KKyAgbV9pc0xlZnQgPSBpc0xlZnQ7DQorfQ0KK0NCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW46Og0KKyAgICB+Q0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbigpIHt9DQordm9pZCBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uOjpzZXRSb3dOdW1iZXJzKCkgew0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbV9jb2Rld29yZHMtPkdldFNpemUoKTsgaSsrKSB7DQorICAgIENCQ19Db2Rld29yZCogY29kZXdvcmQgPSAoQ0JDX0NvZGV3b3JkKiltX2NvZGV3b3Jkcy0+R2V0QXQoaSk7DQorICAgIGlmIChjb2Rld29yZCAhPSBOVUxMKSB7DQorICAgICAgY29kZXdvcmQtPnNldFJvd051bWJlckFzUm93SW5kaWNhdG9yQ29sdW1uKCk7DQorICAgIH0NCisgIH0NCit9DQoraW50MzJfdA0KK0NCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW46OmFkanVzdENvbXBsZXRlSW5kaWNhdG9yQ29sdW1uUm93TnVtYmVycygNCisgICAgQ0JDX0JhcmNvZGVNZXRhZGF0YSBiYXJjb2RlTWV0YWRhdGEpIHsNCisgIENGWF9QdHJBcnJheSogY29kZXdvcmRzID0gZ2V0Q29kZXdvcmRzKCk7DQorICBzZXRSb3dOdW1iZXJzKCk7DQorICByZW1vdmVJbmNvcnJlY3RDb2Rld29yZHMoY29kZXdvcmRzLCBiYXJjb2RlTWV0YWRhdGEpOw0KKyAgQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCA9IGdldEJvdW5kaW5nQm94KCk7DQorICBDQkNfUmVzdWx0UG9pbnQqIHRvcCA9DQorICAgICAgbV9pc0xlZnQgPyBib3VuZGluZ0JveC0+Z2V0VG9wTGVmdCgpIDogYm91bmRpbmdCb3gtPmdldFRvcFJpZ2h0KCk7DQorICBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbSA9DQorICAgICAgbV9pc0xlZnQgPyBib3VuZGluZ0JveC0+Z2V0Qm90dG9tTGVmdCgpIDogYm91bmRpbmdCb3gtPmdldEJvdHRvbVJpZ2h0KCk7DQorICBpbnQzMl90IGZpcnN0Um93ID0gaW1hZ2VSb3dUb0NvZGV3b3JkSW5kZXgoKGludDMyX3QpdG9wLT5HZXRZKCkpOw0KKyAgaW50MzJfdCBsYXN0Um93ID0gaW1hZ2VSb3dUb0NvZGV3b3JkSW5kZXgoKGludDMyX3QpYm90dG9tLT5HZXRZKCkpOw0KKyAgRlhfRkxPQVQgYXZlcmFnZVJvd0hlaWdodCA9DQorICAgICAgKGxhc3RSb3cgLSBmaXJzdFJvdykgLyAoRlhfRkxPQVQpYmFyY29kZU1ldGFkYXRhLmdldFJvd0NvdW50KCk7DQorICBpbnQzMl90IGJhcmNvZGVSb3cgPSAtMTsNCisgIGludDMyX3QgbWF4Um93SGVpZ2h0ID0gMTsNCisgIGludDMyX3QgY3VycmVudFJvd0hlaWdodCA9IDA7DQorICBmb3IgKGludDMyX3QgY29kZXdvcmRzUm93ID0gZmlyc3RSb3c7IGNvZGV3b3Jkc1JvdyA8IGxhc3RSb3c7DQorICAgICAgIGNvZGV3b3Jkc1JvdysrKSB7DQorICAgIGlmIChjb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1JvdykgPT0gTlVMTCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIENCQ19Db2Rld29yZCogY29kZXdvcmQgPSAoQ0JDX0NvZGV3b3JkKiljb2Rld29yZHMtPkdldEF0KGNvZGV3b3Jkc1Jvdyk7DQorICAgIGludDMyX3Qgcm93RGlmZmVyZW5jZSA9IGNvZGV3b3JkLT5nZXRSb3dOdW1iZXIoKSAtIGJhcmNvZGVSb3c7DQorICAgIGlmIChyb3dEaWZmZXJlbmNlID09IDApIHsNCisgICAgICBjdXJyZW50Um93SGVpZ2h0Kys7DQorICAgIH0gZWxzZSBpZiAocm93RGlmZmVyZW5jZSA9PSAxKSB7DQorICAgICAgbWF4Um93SGVpZ2h0ID0NCisgICAgICAgICAgbWF4Um93SGVpZ2h0ID4gY3VycmVudFJvd0hlaWdodCA/IG1heFJvd0hlaWdodCA6IGN1cnJlbnRSb3dIZWlnaHQ7DQorICAgICAgY3VycmVudFJvd0hlaWdodCA9IDE7DQorICAgICAgYmFyY29kZVJvdyA9IGNvZGV3b3JkLT5nZXRSb3dOdW1iZXIoKTsNCisgICAgfSBlbHNlIGlmIChyb3dEaWZmZXJlbmNlIDwgMCkgew0KKyAgICAgIGNvZGV3b3Jkcy0+U2V0QXQoY29kZXdvcmRzUm93LCBOVUxMKTsNCisgICAgfSBlbHNlIGlmIChjb2Rld29yZC0+Z2V0Um93TnVtYmVyKCkgPj0gYmFyY29kZU1ldGFkYXRhLmdldFJvd0NvdW50KCkpIHsNCisgICAgICBjb2Rld29yZHMtPlNldEF0KGNvZGV3b3Jkc1JvdywgTlVMTCk7DQorICAgIH0gZWxzZSBpZiAocm93RGlmZmVyZW5jZSA+IGNvZGV3b3Jkc1Jvdykgew0KKyAgICAgIGNvZGV3b3Jkcy0+U2V0QXQoY29kZXdvcmRzUm93LCBOVUxMKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpbnQzMl90IGNoZWNrZWRSb3dzOw0KKyAgICAgIGlmIChtYXhSb3dIZWlnaHQgPiAyKSB7DQorICAgICAgICBjaGVja2VkUm93cyA9IChtYXhSb3dIZWlnaHQgLSAyKSAqIHJvd0RpZmZlcmVuY2U7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGNoZWNrZWRSb3dzID0gcm93RGlmZmVyZW5jZTsNCisgICAgICB9DQorICAgICAgRlhfQk9PTCBjbG9zZVByZXZpb3VzQ29kZXdvcmRGb3VuZCA9IGNoZWNrZWRSb3dzID49IGNvZGV3b3Jkc1JvdzsNCisgICAgICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPD0gY2hlY2tlZFJvd3MgJiYgIWNsb3NlUHJldmlvdXNDb2Rld29yZEZvdW5kOw0KKyAgICAgICAgICAgaSsrKSB7DQorICAgICAgICBjbG9zZVByZXZpb3VzQ29kZXdvcmRGb3VuZCA9IGNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93IC0gaSkgIT0gTlVMTDsNCisgICAgICB9DQorICAgICAgaWYgKGNsb3NlUHJldmlvdXNDb2Rld29yZEZvdW5kKSB7DQorICAgICAgICBjb2Rld29yZHMtPlNldEF0KGNvZGV3b3Jkc1JvdywgTlVMTCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGJhcmNvZGVSb3cgPSBjb2Rld29yZC0+Z2V0Um93TnVtYmVyKCk7DQorICAgICAgICBjdXJyZW50Um93SGVpZ2h0ID0gMTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiAoaW50MzJfdCkoYXZlcmFnZVJvd0hlaWdodCArIDAuNSk7DQorfQ0KK0NGWF9JbnQzMkFycmF5KiBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uOjpnZXRSb3dIZWlnaHRzKA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBDQkNfQmFyY29kZU1ldGFkYXRhKiBiYXJjb2RlTWV0YWRhdGEgPSBnZXRCYXJjb2RlTWV0YWRhdGEoKTsNCisgIGlmIChiYXJjb2RlTWV0YWRhdGEgPT0gTlVMTCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25DYW5ub3RNZXRhZGF0YTsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBhZGp1c3RJbmNvbXBsZXRlSW5kaWNhdG9yQ29sdW1uUm93TnVtYmVycygqYmFyY29kZU1ldGFkYXRhKTsNCisgIENGWF9JbnQzMkFycmF5KiByZXN1bHQgPSBuZXcgQ0ZYX0ludDMyQXJyYXk7DQorICByZXN1bHQtPlNldFNpemUoYmFyY29kZU1ldGFkYXRhLT5nZXRSb3dDb3VudCgpKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGdldENvZGV3b3JkcygpLT5HZXRTaXplKCk7IGkrKykgew0KKyAgICBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkID0gKENCQ19Db2Rld29yZCopZ2V0Q29kZXdvcmRzKCktPkdldEF0KGkpOw0KKyAgICBpZiAoY29kZXdvcmQgIT0gTlVMTCkgew0KKyAgICAgIHJlc3VsdC0+U2V0QXQoY29kZXdvcmQtPmdldFJvd051bWJlcigpLA0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5HZXRBdChjb2Rld29yZC0+Z2V0Um93TnVtYmVyKCkpICsgMSk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQorfQ0KK2ludDMyX3QgQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbjo6DQorICAgIGFkanVzdEluY29tcGxldGVJbmRpY2F0b3JDb2x1bW5Sb3dOdW1iZXJzKA0KKyAgICAgICAgQ0JDX0JhcmNvZGVNZXRhZGF0YSBiYXJjb2RlTWV0YWRhdGEpIHsNCisgIENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3ggPSBnZXRCb3VuZGluZ0JveCgpOw0KKyAgQ0JDX1Jlc3VsdFBvaW50KiB0b3AgPQ0KKyAgICAgIG1faXNMZWZ0ID8gYm91bmRpbmdCb3gtPmdldFRvcExlZnQoKSA6IGJvdW5kaW5nQm94LT5nZXRUb3BSaWdodCgpOw0KKyAgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b20gPQ0KKyAgICAgIG1faXNMZWZ0ID8gYm91bmRpbmdCb3gtPmdldEJvdHRvbUxlZnQoKSA6IGJvdW5kaW5nQm94LT5nZXRCb3R0b21SaWdodCgpOw0KKyAgaW50MzJfdCBmaXJzdFJvdyA9IGltYWdlUm93VG9Db2Rld29yZEluZGV4KChpbnQzMl90KXRvcC0+R2V0WSgpKTsNCisgIGludDMyX3QgbGFzdFJvdyA9IGltYWdlUm93VG9Db2Rld29yZEluZGV4KChpbnQzMl90KWJvdHRvbS0+R2V0WSgpKTsNCisgIEZYX0ZMT0FUIGF2ZXJhZ2VSb3dIZWlnaHQgPQ0KKyAgICAgIChsYXN0Um93IC0gZmlyc3RSb3cpIC8gKEZYX0ZMT0FUKWJhcmNvZGVNZXRhZGF0YS5nZXRSb3dDb3VudCgpOw0KKyAgQ0ZYX1B0ckFycmF5KiBjb2Rld29yZHMgPSBnZXRDb2Rld29yZHMoKTsNCisgIGludDMyX3QgYmFyY29kZVJvdyA9IC0xOw0KKyAgaW50MzJfdCBtYXhSb3dIZWlnaHQgPSAxOw0KKyAgaW50MzJfdCBjdXJyZW50Um93SGVpZ2h0ID0gMDsNCisgIGZvciAoaW50MzJfdCBjb2Rld29yZHNSb3cgPSBmaXJzdFJvdzsgY29kZXdvcmRzUm93IDwgbGFzdFJvdzsNCisgICAgICAgY29kZXdvcmRzUm93KyspIHsNCisgICAgaWYgKGNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93KSA9PSBOVUxMKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCA9IChDQkNfQ29kZXdvcmQqKWNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRzUm93KTsNCisgICAgY29kZXdvcmQtPnNldFJvd051bWJlckFzUm93SW5kaWNhdG9yQ29sdW1uKCk7DQorICAgIGludDMyX3Qgcm93RGlmZmVyZW5jZSA9IGNvZGV3b3JkLT5nZXRSb3dOdW1iZXIoKSAtIGJhcmNvZGVSb3c7DQorICAgIGlmIChyb3dEaWZmZXJlbmNlID09IDApIHsNCisgICAgICBjdXJyZW50Um93SGVpZ2h0Kys7DQorICAgIH0gZWxzZSBpZiAocm93RGlmZmVyZW5jZSA9PSAxKSB7DQorICAgICAgbWF4Um93SGVpZ2h0ID0NCisgICAgICAgICAgbWF4Um93SGVpZ2h0ID4gY3VycmVudFJvd0hlaWdodCA/IG1heFJvd0hlaWdodCA6IGN1cnJlbnRSb3dIZWlnaHQ7DQorICAgICAgY3VycmVudFJvd0hlaWdodCA9IDE7DQorICAgICAgYmFyY29kZVJvdyA9IGNvZGV3b3JkLT5nZXRSb3dOdW1iZXIoKTsNCisgICAgfSBlbHNlIGlmIChjb2Rld29yZC0+Z2V0Um93TnVtYmVyKCkgPj0gYmFyY29kZU1ldGFkYXRhLmdldFJvd0NvdW50KCkpIHsNCisgICAgICBjb2Rld29yZHMtPlNldEF0KGNvZGV3b3Jkc1JvdywgTlVMTCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgYmFyY29kZVJvdyA9IGNvZGV3b3JkLT5nZXRSb3dOdW1iZXIoKTsNCisgICAgICBjdXJyZW50Um93SGVpZ2h0ID0gMTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIChpbnQzMl90KShhdmVyYWdlUm93SGVpZ2h0ICsgMC41KTsNCit9DQorQ0JDX0JhcmNvZGVNZXRhZGF0YSoNCitDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uOjpnZXRCYXJjb2RlTWV0YWRhdGEoKSB7DQorICBDRlhfUHRyQXJyYXkqIGNvZGV3b3JkcyA9IGdldENvZGV3b3JkcygpOw0KKyAgQ0JDX0JhcmNvZGVWYWx1ZSBiYXJjb2RlQ29sdW1uQ291bnQ7DQorICBDQkNfQmFyY29kZVZhbHVlIGJhcmNvZGVSb3dDb3VudFVwcGVyUGFydDsNCisgIENCQ19CYXJjb2RlVmFsdWUgYmFyY29kZVJvd0NvdW50TG93ZXJQYXJ0Ow0KKyAgQ0JDX0JhcmNvZGVWYWx1ZSBiYXJjb2RlRUNMZXZlbDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvZGV3b3Jkcy0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCA9IChDQkNfQ29kZXdvcmQqKWNvZGV3b3Jkcy0+R2V0QXQoaSk7DQorICAgIGlmIChjb2Rld29yZCA9PSBOVUxMKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgY29kZXdvcmQtPnNldFJvd051bWJlckFzUm93SW5kaWNhdG9yQ29sdW1uKCk7DQorICAgIGludDMyX3Qgcm93SW5kaWNhdG9yVmFsdWUgPSBjb2Rld29yZC0+Z2V0VmFsdWUoKSAlIDMwOw0KKyAgICBpbnQzMl90IGNvZGV3b3JkUm93TnVtYmVyID0gY29kZXdvcmQtPmdldFJvd051bWJlcigpOw0KKyAgICBpZiAoIW1faXNMZWZ0KSB7DQorICAgICAgY29kZXdvcmRSb3dOdW1iZXIgKz0gMjsNCisgICAgfQ0KKyAgICBzd2l0Y2ggKGNvZGV3b3JkUm93TnVtYmVyICUgMykgew0KKyAgICAgIGNhc2UgMDoNCisgICAgICAgIGJhcmNvZGVSb3dDb3VudFVwcGVyUGFydC5zZXRWYWx1ZShyb3dJbmRpY2F0b3JWYWx1ZSAqIDMgKyAxKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgMToNCisgICAgICAgIGJhcmNvZGVFQ0xldmVsLnNldFZhbHVlKHJvd0luZGljYXRvclZhbHVlIC8gMyk7DQorICAgICAgICBiYXJjb2RlUm93Q291bnRMb3dlclBhcnQuc2V0VmFsdWUocm93SW5kaWNhdG9yVmFsdWUgJSAzKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgMjoNCisgICAgICAgIGJhcmNvZGVDb2x1bW5Db3VudC5zZXRWYWx1ZShyb3dJbmRpY2F0b3JWYWx1ZSArIDEpOw0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGlmICgoYmFyY29kZUNvbHVtbkNvdW50LmdldFZhbHVlKCktPkdldFNpemUoKSA9PSAwKSB8fA0KKyAgICAgIChiYXJjb2RlUm93Q291bnRVcHBlclBhcnQuZ2V0VmFsdWUoKS0+R2V0U2l6ZSgpID09IDApIHx8DQorICAgICAgKGJhcmNvZGVSb3dDb3VudExvd2VyUGFydC5nZXRWYWx1ZSgpLT5HZXRTaXplKCkgPT0gMCkgfHwNCisgICAgICAoYmFyY29kZUVDTGV2ZWwuZ2V0VmFsdWUoKS0+R2V0U2l6ZSgpID09IDApIHx8DQorICAgICAgYmFyY29kZUNvbHVtbkNvdW50LmdldFZhbHVlKCktPkdldEF0KDApIDwgMSB8fA0KKyAgICAgIGJhcmNvZGVSb3dDb3VudFVwcGVyUGFydC5nZXRWYWx1ZSgpLT5HZXRBdCgwKSArDQorICAgICAgICAgICAgICBiYXJjb2RlUm93Q291bnRMb3dlclBhcnQuZ2V0VmFsdWUoKS0+R2V0QXQoMCkgPA0KKyAgICAgICAgICBDQkNfUERGNDE3Q29tbW9uOjpNSU5fUk9XU19JTl9CQVJDT0RFIHx8DQorICAgICAgYmFyY29kZVJvd0NvdW50VXBwZXJQYXJ0LmdldFZhbHVlKCktPkdldEF0KDApICsNCisgICAgICAgICAgICAgIGJhcmNvZGVSb3dDb3VudExvd2VyUGFydC5nZXRWYWx1ZSgpLT5HZXRBdCgwKSA+DQorICAgICAgICAgIENCQ19QREY0MTdDb21tb246Ok1BWF9ST1dTX0lOX0JBUkNPREUpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDQkNfQmFyY29kZU1ldGFkYXRhKiBiYXJjb2RlTWV0YWRhdGEgPQ0KKyAgICAgIG5ldyBDQkNfQmFyY29kZU1ldGFkYXRhKGJhcmNvZGVDb2x1bW5Db3VudC5nZXRWYWx1ZSgpLT5HZXRBdCgwKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJjb2RlUm93Q291bnRVcHBlclBhcnQuZ2V0VmFsdWUoKS0+R2V0QXQoMCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFyY29kZVJvd0NvdW50TG93ZXJQYXJ0LmdldFZhbHVlKCktPkdldEF0KDApLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcmNvZGVFQ0xldmVsLmdldFZhbHVlKCktPkdldEF0KDApKTsNCisgIHJlbW92ZUluY29ycmVjdENvZGV3b3Jkcyhjb2Rld29yZHMsICpiYXJjb2RlTWV0YWRhdGEpOw0KKyAgcmV0dXJuIGJhcmNvZGVNZXRhZGF0YTsNCit9DQorRlhfQk9PTCBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uOjppc0xlZnQoKSB7DQorICByZXR1cm4gbV9pc0xlZnQ7DQorfQ0KK0NGWF9CeXRlU3RyaW5nIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW46OnRvU3RyaW5nKCkgew0KKyAgcmV0dXJuIChDRlhfQnl0ZVN0cmluZykgIklzTGVmdDogIiArIChDRlhfQnl0ZVN0cmluZyltX2lzTGVmdCArICdcbicgKw0KKyAgICAgICAgIENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW46OnRvU3RyaW5nKCk7DQorfQ0KK3ZvaWQgQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbjo6cmVtb3ZlSW5jb3JyZWN0Q29kZXdvcmRzKA0KKyAgICBDRlhfUHRyQXJyYXkqIGNvZGV3b3JkcywNCisgICAgQ0JDX0JhcmNvZGVNZXRhZGF0YSBiYXJjb2RlTWV0YWRhdGEpIHsNCisgIGZvciAoaW50MzJfdCBjb2Rld29yZFJvdyA9IDA7IGNvZGV3b3JkUm93IDwgY29kZXdvcmRzLT5HZXRTaXplKCk7DQorICAgICAgIGNvZGV3b3JkUm93KyspIHsNCisgICAgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCA9IChDQkNfQ29kZXdvcmQqKWNvZGV3b3Jkcy0+R2V0QXQoY29kZXdvcmRSb3cpOw0KKyAgICBpZiAoY29kZXdvcmQgPT0gTlVMTCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGludDMyX3Qgcm93SW5kaWNhdG9yVmFsdWUgPSBjb2Rld29yZC0+Z2V0VmFsdWUoKSAlIDMwOw0KKyAgICBpbnQzMl90IGNvZGV3b3JkUm93TnVtYmVyID0gY29kZXdvcmQtPmdldFJvd051bWJlcigpOw0KKyAgICBpZiAoY29kZXdvcmRSb3dOdW1iZXIgPiBiYXJjb2RlTWV0YWRhdGEuZ2V0Um93Q291bnQoKSkgew0KKyAgICAgIGNvZGV3b3Jkcy0+U2V0QXQoY29kZXdvcmRSb3csIE5VTEwpOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmICghbV9pc0xlZnQpIHsNCisgICAgICBjb2Rld29yZFJvd051bWJlciArPSAyOw0KKyAgICB9DQorICAgIHN3aXRjaCAoY29kZXdvcmRSb3dOdW1iZXIgJSAzKSB7DQorICAgICAgY2FzZSAwOg0KKyAgICAgICAgaWYgKHJvd0luZGljYXRvclZhbHVlICogMyArIDEgIT0NCisgICAgICAgICAgICBiYXJjb2RlTWV0YWRhdGEuZ2V0Um93Q291bnRVcHBlclBhcnQoKSkgew0KKyAgICAgICAgICBjb2Rld29yZHMtPlNldEF0KGNvZGV3b3JkUm93LCBOVUxMKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgMToNCisgICAgICAgIGlmIChyb3dJbmRpY2F0b3JWYWx1ZSAvIDMgIT0NCisgICAgICAgICAgICAgICAgYmFyY29kZU1ldGFkYXRhLmdldEVycm9yQ29ycmVjdGlvbkxldmVsKCkgfHwNCisgICAgICAgICAgICByb3dJbmRpY2F0b3JWYWx1ZSAlIDMgIT0gYmFyY29kZU1ldGFkYXRhLmdldFJvd0NvdW50TG93ZXJQYXJ0KCkpIHsNCisgICAgICAgICAgY29kZXdvcmRzLT5TZXRBdChjb2Rld29yZFJvdywgTlVMTCk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIDI6DQorICAgICAgICBpZiAocm93SW5kaWNhdG9yVmFsdWUgKyAxICE9IGJhcmNvZGVNZXRhZGF0YS5nZXRDb2x1bW5Db3VudCgpKSB7DQorICAgICAgICAgIGNvZGV3b3Jkcy0+U2V0QXQoY29kZXdvcmRSb3csIE5VTEwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbi5oIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYWUwZTgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uLmgKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19ERVRFQ1RJT05SRVNVTFRST1dJTkRJQ0FUT1JDT0xVTU5fSF8NCisjZGVmaW5lIF9CQ19ERVRFQ1RJT05SRVNVTFRST1dJTkRJQ0FUT1JDT0xVTU5fSF8NCitjbGFzcyBDQkNfQmFyY29kZU1ldGFkYXRhOw0KK2NsYXNzIENCQ19Cb3VuZGluZ0JveDsNCitjbGFzcyBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uOw0KK2NsYXNzIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4gOiBwdWJsaWMgQ0JDX0RldGVjdGlvblJlc3VsdENvbHVtbiB7DQorIHB1YmxpYzoNCisgIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4oQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0xlZnQpOw0KKyAgdmlydHVhbCB+Q0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbigpOw0KKyAgdm9pZCBzZXRSb3dOdW1iZXJzKCk7DQorICBpbnQzMl90IGFkanVzdENvbXBsZXRlSW5kaWNhdG9yQ29sdW1uUm93TnVtYmVycygNCisgICAgICBDQkNfQmFyY29kZU1ldGFkYXRhIGJhcmNvZGVNZXRhZGF0YSk7DQorICBDRlhfSW50MzJBcnJheSogZ2V0Um93SGVpZ2h0cyhpbnQzMl90JiBlKTsNCisgIGludDMyX3QgYWRqdXN0SW5jb21wbGV0ZUluZGljYXRvckNvbHVtblJvd051bWJlcnMoDQorICAgICAgQ0JDX0JhcmNvZGVNZXRhZGF0YSBiYXJjb2RlTWV0YWRhdGEpOw0KKyAgQ0JDX0JhcmNvZGVNZXRhZGF0YSogZ2V0QmFyY29kZU1ldGFkYXRhKCk7DQorICBGWF9CT09MIGlzTGVmdCgpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgdG9TdHJpbmcoKTsNCisNCisgcHJpdmF0ZToNCisgIEZYX0JPT0wgbV9pc0xlZnQ7DQorICB2b2lkIHJlbW92ZUluY29ycmVjdENvZGV3b3JkcyhDRlhfUHRyQXJyYXkqIGNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19CYXJjb2RlTWV0YWRhdGEgYmFyY29kZU1ldGFkYXRhKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3Rvci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MzJhNzUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0b3IuY3BwCkBAIC0wLDAgKzEsMzUwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDA5IFpYaW5nIGF1dGhvcnMNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfUmVzdWx0UG9pbnQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfQmluYXJ5Qml0bWFwLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdEFycmF5LmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0RldGVjdG9yUmVzdWx0LmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0RldGVjdG9yLmgiDQorI2RlZmluZSBJTlRFUkdFUl9NQVggMjE0NzQ4MzY0Nw0KK2ludDMyX3QgQ0JDX0RldGVjdG9yOjpJTkRFWEVTX1NUQVJUX1BBVFRFUk5bXSA9IHswLCA0LCAxLCA1fTsNCitpbnQzMl90IENCQ19EZXRlY3Rvcjo6SU5ERVhFU19TVE9QX1BBVFRFUk5bXSA9IHs2LCAyLCA3LCAzfTsNCitpbnQzMl90IENCQ19EZXRlY3Rvcjo6SU5URUdFUl9NQVRIX1NISUZUID0gODsNCitpbnQzMl90IENCQ19EZXRlY3Rvcjo6UEFUVEVSTl9NQVRDSF9SRVNVTFRfU0NBTEVfRkFDVE9SID0gMQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBJTlRFR0VSX01BVEhfU0hJRlQ7DQoraW50MzJfdCBDQkNfRGV0ZWN0b3I6Ok1BWF9BVkdfVkFSSUFOQ0UgPQ0KKyAgICAoaW50MzJfdCkoUEFUVEVSTl9NQVRDSF9SRVNVTFRfU0NBTEVfRkFDVE9SICogMC40MmYpOw0KK2ludDMyX3QgQ0JDX0RldGVjdG9yOjpNQVhfSU5ESVZJRFVBTF9WQVJJQU5DRSA9DQorICAgIChpbnQzMl90KShQQVRURVJOX01BVENIX1JFU1VMVF9TQ0FMRV9GQUNUT1IgKiAwLjhmKTsNCitpbnQzMl90IENCQ19EZXRlY3Rvcjo6U1RBUlRfUEFUVEVSTltdID0gezgsIDEsIDEsIDEsIDEsIDEsIDEsIDN9Ow0KK2ludDMyX3QgQ0JDX0RldGVjdG9yOjpTVE9QX1BBVFRFUk5bXSA9IHs3LCAxLCAxLCAzLCAxLCAxLCAxLCAyLCAxfTsNCitpbnQzMl90IENCQ19EZXRlY3Rvcjo6TUFYX1BJWEVMX0RSSUZUID0gMzsNCitpbnQzMl90IENCQ19EZXRlY3Rvcjo6TUFYX1BBVFRFUk5fRFJJRlQgPSA1Ow0KK2ludDMyX3QgQ0JDX0RldGVjdG9yOjpTS0lQUEVEX1JPV19DT1VOVF9NQVggPSAyNTsNCitpbnQzMl90IENCQ19EZXRlY3Rvcjo6Uk9XX1NURVAgPSA1Ow0KK2ludDMyX3QgQ0JDX0RldGVjdG9yOjpCQVJDT0RFX01JTl9IRUlHSFQgPSAxMDsNCitDQkNfRGV0ZWN0b3I6OkNCQ19EZXRlY3RvcigpIHt9DQorQ0JDX0RldGVjdG9yOjp+Q0JDX0RldGVjdG9yKCkge30NCitDQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQqIENCQ19EZXRlY3Rvcjo6ZGV0ZWN0KENCQ19CaW5hcnlCaXRtYXAqIGltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgbXVsdGlwbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDQkNfQ29tbW9uQml0TWF0cml4KiBiaXRNYXRyaXggPSBpbWFnZS0+R2V0QmxhY2tNYXRyaXgoZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBDRlhfUHRyQXJyYXkqIGJhcmNvZGVDb29yZGluYXRlcyA9IGRldGVjdChtdWx0aXBsZSwgYml0TWF0cml4KTsNCisgIGlmIChiYXJjb2RlQ29vcmRpbmF0ZXMtPkdldFNpemUoKSA9PSAwKSB7DQorICAgIHJvdGF0ZTE4MChiaXRNYXRyaXgpOw0KKyAgICBiYXJjb2RlQ29vcmRpbmF0ZXMgPSBkZXRlY3QobXVsdGlwbGUsIGJpdE1hdHJpeCk7DQorICB9DQorICBpZiAoYmFyY29kZUNvb3JkaW5hdGVzLT5HZXRTaXplKCkgPT0gMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25VblN1cHBvcnRlZEJhcmNvZGU7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIH0NCisgIENCQ19QREY0MTdEZXRlY3RvclJlc3VsdCogZGV0ZWN0b3JSZXN1bHQgPQ0KKyAgICAgIG5ldyBDQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQoYml0TWF0cml4LCBiYXJjb2RlQ29vcmRpbmF0ZXMpOw0KKyAgcmV0dXJuIGRldGVjdG9yUmVzdWx0Ow0KK30NCit2b2lkIENCQ19EZXRlY3Rvcjo6cm90YXRlMTgwKENCQ19Db21tb25CaXRNYXRyaXgqIGJpdE1hdHJpeCkgew0KKyAgaW50MzJfdCB3aWR0aCA9IGJpdE1hdHJpeC0+R2V0V2lkdGgoKTsNCisgIGludDMyX3QgaGVpZ2h0ID0gYml0TWF0cml4LT5HZXRIZWlnaHQoKTsNCisgIENCQ19Db21tb25CaXRBcnJheSogZmlyc3RSb3dCaXRBcnJheSA9IG5ldyBDQkNfQ29tbW9uQml0QXJyYXkod2lkdGgpOw0KKyAgQ0JDX0NvbW1vbkJpdEFycmF5KiBzZWNvbmRSb3dCaXRBcnJheSA9IG5ldyBDQkNfQ29tbW9uQml0QXJyYXkod2lkdGgpOw0KKyAgQ0JDX0NvbW1vbkJpdEFycmF5KiB0bXBCaXRBcnJheSA9IG5ldyBDQkNfQ29tbW9uQml0QXJyYXkod2lkdGgpOw0KKyAgZm9yIChpbnQzMl90IHkgPSAwOyB5PChoZWlnaHQgKyAxKT4+IDE7IHkrKykgew0KKyAgICBDQkNfQ29tbW9uQml0QXJyYXkqIHRlbXAgPQ0KKyAgICAgICAgYml0TWF0cml4LT5HZXRSb3coaGVpZ2h0IC0gMSAtIHksIHNlY29uZFJvd0JpdEFycmF5KTsNCisgICAgQ0JDX0NvbW1vbkJpdEFycmF5KiB0ZW1wZmlyc3RSb3cgPSBmaXJzdFJvd0JpdEFycmF5Ow0KKyAgICBmaXJzdFJvd0JpdEFycmF5ID0gYml0TWF0cml4LT5HZXRSb3coeSwgdGVtcGZpcnN0Um93KTsNCisgICAgZGVsZXRlIHRlbXBmaXJzdFJvdzsNCisgICAgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3cgPSBtaXJyb3IodGVtcCwgdG1wQml0QXJyYXkpOw0KKyAgICBkZWxldGUgdGVtcDsNCisgICAgYml0TWF0cml4LT5TZXRSb3coeSwgcm93KTsNCisgICAgZGVsZXRlIHJvdzsNCisgICAgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3dmaXJzdFJvdyA9IG1pcnJvcihmaXJzdFJvd0JpdEFycmF5LCB0bXBCaXRBcnJheSk7DQorICAgIGJpdE1hdHJpeC0+U2V0Um93KGhlaWdodCAtIDEgLSB5LCByb3dmaXJzdFJvdyk7DQorICAgIGRlbGV0ZSByb3dmaXJzdFJvdzsNCisgIH0NCisgIGRlbGV0ZSB0bXBCaXRBcnJheTsNCisgIGRlbGV0ZSBmaXJzdFJvd0JpdEFycmF5Ow0KKyAgZGVsZXRlIHNlY29uZFJvd0JpdEFycmF5Ow0KK30NCitDQkNfQ29tbW9uQml0QXJyYXkqIENCQ19EZXRlY3Rvcjo6bWlycm9yKENCQ19Db21tb25CaXRBcnJheSogaW5wdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQml0QXJyYXkqIHJlc3VsdCkgew0KKyAgQ0JDX0NvbW1vbkJpdEFycmF5KiBhcnJheSA9IG5ldyBDQkNfQ29tbW9uQml0QXJyYXkocmVzdWx0LT5HZXRTaXplKCkpOw0KKyAgYXJyYXktPkNsZWFyKCk7DQorICBpbnQzMl90IHNpemUgPSBpbnB1dC0+R2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7DQorICAgIGlmIChpbnB1dC0+R2V0KGkpKSB7DQorICAgICAgYXJyYXktPlNldChzaXplIC0gMSAtIGkpOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gYXJyYXk7DQorfQ0KK0NGWF9QdHJBcnJheSogQ0JDX0RldGVjdG9yOjpkZXRlY3QoRlhfQk9PTCBtdWx0aXBsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CaXRNYXRyaXgqIGJpdE1hdHJpeCkgew0KKyAgQ0ZYX1B0ckFycmF5KiBiYXJjb2RlQ29vcmRpbmF0ZXMgPSBuZXcgQ0ZYX1B0ckFycmF5Ow0KKyAgaW50MzJfdCByb3cgPSAwOw0KKyAgaW50MzJfdCBjb2x1bW4gPSAwOw0KKyAgRlhfQk9PTCBmb3VuZEJhcmNvZGVJblJvdyA9IEZBTFNFOw0KKyAgd2hpbGUgKHJvdyA8IGJpdE1hdHJpeC0+R2V0SGVpZ2h0KCkpIHsNCisgICAgQ0ZYX1B0ckFycmF5KiB2ZXJ0aWNlcyA9IGZpbmRWZXJ0aWNlcyhiaXRNYXRyaXgsIHJvdywgY29sdW1uKTsNCisgICAgaWYgKHZlcnRpY2VzLT5HZXRBdCgwKSA9PSBOVUxMICYmIHZlcnRpY2VzLT5HZXRBdCgzKSA9PSBOVUxMKSB7DQorICAgICAgaWYgKCFmb3VuZEJhcmNvZGVJblJvdykgew0KKyAgICAgICAgaWYgKHZlcnRpY2VzKSB7DQorICAgICAgICAgIGRlbGV0ZSAodmVydGljZXMpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGZvdW5kQmFyY29kZUluUm93ID0gRkFMU0U7DQorICAgICAgY29sdW1uID0gMDsNCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBiYXJjb2RlQ29vcmRpbmF0ZXMtPkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICBDRlhfUHRyQXJyYXkqIGJhcmNvZGVDb29yZGluYXRlID0NCisgICAgICAgICAgICAoQ0ZYX1B0ckFycmF5KiliYXJjb2RlQ29vcmRpbmF0ZXMtPkdldEF0KGkpOw0KKyAgICAgICAgaWYgKGJhcmNvZGVDb29yZGluYXRlLT5HZXRBdCgxKSAhPSBOVUxMKSB7DQorICAgICAgICAgIHJvdyA9IHJvdyA+ICgoQ0JDX1Jlc3VsdFBvaW50KiliYXJjb2RlQ29vcmRpbmF0ZS0+R2V0QXQoMSkpLT5HZXRZKCk7DQorICAgICAgICB9DQorICAgICAgICBpZiAoYmFyY29kZUNvb3JkaW5hdGUtPkdldEF0KDMpICE9IE5VTEwpIHsNCisgICAgICAgICAgcm93ID0gcm93ID4gKChDQkNfUmVzdWx0UG9pbnQqKWJhcmNvZGVDb29yZGluYXRlLT5HZXRBdCgzKSktPkdldFkoKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcm93ICs9IFJPV19TVEVQOw0KKyAgICAgIGlmICh2ZXJ0aWNlcykgew0KKyAgICAgICAgZGVsZXRlICh2ZXJ0aWNlcyk7DQorICAgICAgfQ0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGZvdW5kQmFyY29kZUluUm93ID0gVFJVRTsNCisgICAgYmFyY29kZUNvb3JkaW5hdGVzLT5BZGQodmVydGljZXMpOw0KKyAgICBpZiAoIW11bHRpcGxlKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKHZlcnRpY2VzLT5HZXRBdCgyKSAhPSBOVUxMKSB7DQorICAgICAgY29sdW1uID0gKGludDMyX3QpKChDQkNfUmVzdWx0UG9pbnQqKXZlcnRpY2VzLT5HZXRBdCgyKSktPkdldFgoKTsNCisgICAgICByb3cgPSAoaW50MzJfdCkoKENCQ19SZXN1bHRQb2ludCopdmVydGljZXMtPkdldEF0KDIpKS0+R2V0WSgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGNvbHVtbiA9IChpbnQzMl90KSgoQ0JDX1Jlc3VsdFBvaW50Kil2ZXJ0aWNlcy0+R2V0QXQoNCkpLT5HZXRYKCk7DQorICAgICAgcm93ID0gKGludDMyX3QpKChDQkNfUmVzdWx0UG9pbnQqKXZlcnRpY2VzLT5HZXRBdCg0KSktPkdldFkoKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGJhcmNvZGVDb29yZGluYXRlczsNCit9DQorQ0ZYX1B0ckFycmF5KiBDQkNfRGV0ZWN0b3I6OmZpbmRWZXJ0aWNlcyhDQkNfQ29tbW9uQml0TWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0Um93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydENvbHVtbikgew0KKyAgaW50MzJfdCBoZWlnaHQgPSBtYXRyaXgtPkdldEhlaWdodCgpOw0KKyAgaW50MzJfdCB3aWR0aCA9IG1hdHJpeC0+R2V0V2lkdGgoKTsNCisgIENGWF9QdHJBcnJheSogcmVzdWx0ID0gbmV3IENGWF9QdHJBcnJheTsNCisgIHJlc3VsdC0+U2V0U2l6ZSg4KTsNCisgIENGWF9QdHJBcnJheSogc3RhcnRwdHIgPSBmaW5kUm93c1dpdGhQYXR0ZXJuKA0KKyAgICAgIG1hdHJpeCwgaGVpZ2h0LCB3aWR0aCwgc3RhcnRSb3csIHN0YXJ0Q29sdW1uLCBTVEFSVF9QQVRURVJOLA0KKyAgICAgIHNpemVvZihTVEFSVF9QQVRURVJOKSAvIHNpemVvZihTVEFSVF9QQVRURVJOWzBdKSk7DQorICBjb3B5VG9SZXN1bHQoDQorICAgICAgcmVzdWx0LCBzdGFydHB0ciwgSU5ERVhFU19TVEFSVF9QQVRURVJOLA0KKyAgICAgIHNpemVvZihJTkRFWEVTX1NUQVJUX1BBVFRFUk4pIC8gc2l6ZW9mKElOREVYRVNfU1RBUlRfUEFUVEVSTlswXSkpOw0KKyAgc3RhcnRwdHItPlJlbW92ZUFsbCgpOw0KKyAgZGVsZXRlIHN0YXJ0cHRyOw0KKyAgaWYgKHJlc3VsdC0+R2V0QXQoNCkgIT0gTlVMTCkgew0KKyAgICBzdGFydENvbHVtbiA9IChpbnQzMl90KSgoQ0JDX1Jlc3VsdFBvaW50KilyZXN1bHQtPkdldEF0KDQpKS0+R2V0WCgpOw0KKyAgICBzdGFydFJvdyA9IChpbnQzMl90KSgoQ0JDX1Jlc3VsdFBvaW50KilyZXN1bHQtPkdldEF0KDQpKS0+R2V0WSgpOw0KKyAgfQ0KKyAgQ0ZYX1B0ckFycmF5KiBzdG9wcHRyID0gZmluZFJvd3NXaXRoUGF0dGVybigNCisgICAgICBtYXRyaXgsIGhlaWdodCwgd2lkdGgsIHN0YXJ0Um93LCBzdGFydENvbHVtbiwgU1RPUF9QQVRURVJOLA0KKyAgICAgIHNpemVvZihTVE9QX1BBVFRFUk4pIC8gc2l6ZW9mKFNUT1BfUEFUVEVSTlswXSkpOw0KKyAgY29weVRvUmVzdWx0KHJlc3VsdCwgc3RvcHB0ciwgSU5ERVhFU19TVE9QX1BBVFRFUk4sDQorICAgICAgICAgICAgICAgc2l6ZW9mKElOREVYRVNfU1RPUF9QQVRURVJOKSAvIHNpemVvZihJTkRFWEVTX1NUT1BfUEFUVEVSTlswXSkpOw0KKyAgc3RvcHB0ci0+UmVtb3ZlQWxsKCk7DQorICBkZWxldGUgc3RvcHB0cjsNCisgIHJldHVybiByZXN1bHQ7DQorfQ0KK3ZvaWQgQ0JDX0RldGVjdG9yOjpjb3B5VG9SZXN1bHQoQ0ZYX1B0ckFycmF5KiByZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkqIHRtcFJlc3VsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGRlc3RpbmF0aW9uSW5kZXhlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGVzdGluYXRpb25MZW5ndGgpIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGRlc3RpbmF0aW9uTGVuZ3RoOyBpKyspIHsNCisgICAgcmVzdWx0LT5TZXRBdChkZXN0aW5hdGlvbkluZGV4ZXNbaV0sIHRtcFJlc3VsdC0+R2V0QXQoaSkpOw0KKyAgfQ0KK30NCitDRlhfUHRyQXJyYXkqIENCQ19EZXRlY3Rvcjo6ZmluZFJvd3NXaXRoUGF0dGVybihDQkNfQ29tbW9uQml0TWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0Um93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRDb2x1bW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBhdHRlcm5MZW5ndGgpIHsNCisgIENGWF9QdHJBcnJheSogcmVzdWx0ID0gbmV3IENGWF9QdHJBcnJheTsNCisgIHJlc3VsdC0+U2V0U2l6ZSg0KTsNCisgIEZYX0JPT0wgZm91bmQgPSBGQUxTRTsNCisgIENGWF9JbnQzMkFycmF5IGNvdW50ZXJzOw0KKyAgY291bnRlcnMuU2V0U2l6ZShwYXR0ZXJuTGVuZ3RoKTsNCisgIGZvciAoOyBzdGFydFJvdyA8IGhlaWdodDsgc3RhcnRSb3cgKz0gUk9XX1NURVApIHsNCisgICAgQ0ZYX0ludDMyQXJyYXkqIGxvYyA9DQorICAgICAgICBmaW5kR3VhcmRQYXR0ZXJuKG1hdHJpeCwgc3RhcnRDb2x1bW4sIHN0YXJ0Um93LCB3aWR0aCwgRkFMU0UsIHBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5MZW5ndGgsIGNvdW50ZXJzKTsNCisgICAgaWYgKGxvYyAhPSBOVUxMKSB7DQorICAgICAgd2hpbGUgKHN0YXJ0Um93ID4gMCkgew0KKyAgICAgICAgQ0ZYX0ludDMyQXJyYXkqIHByZXZpb3VzUm93TG9jID0NCisgICAgICAgICAgICBmaW5kR3VhcmRQYXR0ZXJuKG1hdHJpeCwgc3RhcnRDb2x1bW4sIC0tc3RhcnRSb3csIHdpZHRoLCBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4sIHBhdHRlcm5MZW5ndGgsIGNvdW50ZXJzKTsNCisgICAgICAgIGlmIChwcmV2aW91c1Jvd0xvYyAhPSBOVUxMKSB7DQorICAgICAgICAgIGRlbGV0ZSBsb2M7DQorICAgICAgICAgIGxvYyA9IHByZXZpb3VzUm93TG9jOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgc3RhcnRSb3crKzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHJlc3VsdC0+U2V0QXQoDQorICAgICAgICAgIDAsIG5ldyBDQkNfUmVzdWx0UG9pbnQoKEZYX0ZMT0FUKWxvYy0+R2V0QXQoMCksIChGWF9GTE9BVClzdGFydFJvdykpOw0KKyAgICAgIHJlc3VsdC0+U2V0QXQoDQorICAgICAgICAgIDEsIG5ldyBDQkNfUmVzdWx0UG9pbnQoKEZYX0ZMT0FUKWxvYy0+R2V0QXQoMSksIChGWF9GTE9BVClzdGFydFJvdykpOw0KKyAgICAgIGZvdW5kID0gVFJVRTsNCisgICAgICBkZWxldGUgbG9jOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpbnQzMl90IHN0b3BSb3cgPSBzdGFydFJvdyArIDE7DQorICBpZiAoZm91bmQpIHsNCisgICAgaW50MzJfdCBza2lwcGVkUm93Q291bnQgPSAwOw0KKyAgICBDRlhfSW50MzJBcnJheSBwcmV2aW91c1Jvd0xvYzsNCisgICAgcHJldmlvdXNSb3dMb2MuQWRkKChpbnQzMl90KSgoQ0JDX1Jlc3VsdFBvaW50KilyZXN1bHQtPkdldEF0KDApKS0+R2V0WCgpKTsNCisgICAgcHJldmlvdXNSb3dMb2MuQWRkKChpbnQzMl90KSgoQ0JDX1Jlc3VsdFBvaW50KilyZXN1bHQtPkdldEF0KDEpKS0+R2V0WCgpKTsNCisgICAgZm9yICg7IHN0b3BSb3cgPCBoZWlnaHQ7IHN0b3BSb3crKykgew0KKyAgICAgIENGWF9JbnQzMkFycmF5KiBsb2MgPQ0KKyAgICAgICAgICBmaW5kR3VhcmRQYXR0ZXJuKG1hdHJpeCwgcHJldmlvdXNSb3dMb2NbMF0sIHN0b3BSb3csIHdpZHRoLCBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLCBwYXR0ZXJuTGVuZ3RoLCBjb3VudGVycyk7DQorICAgICAgaWYgKGxvYyAhPSBOVUxMICYmDQorICAgICAgICAgIGFicyhwcmV2aW91c1Jvd0xvY1swXSAtIGxvYy0+R2V0QXQoMCkpIDwgTUFYX1BBVFRFUk5fRFJJRlQgJiYNCisgICAgICAgICAgYWJzKHByZXZpb3VzUm93TG9jWzFdIC0gbG9jLT5HZXRBdCgxKSkgPCBNQVhfUEFUVEVSTl9EUklGVCkgew0KKyAgICAgICAgcHJldmlvdXNSb3dMb2MuQ29weSgqbG9jKTsNCisgICAgICAgIHNraXBwZWRSb3dDb3VudCA9IDA7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChza2lwcGVkUm93Q291bnQgPiBTS0lQUEVEX1JPV19DT1VOVF9NQVgpIHsNCisgICAgICAgICAgZGVsZXRlIGxvYzsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBza2lwcGVkUm93Q291bnQrKzsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgZGVsZXRlIGxvYzsNCisgICAgfQ0KKyAgICBzdG9wUm93IC09IHNraXBwZWRSb3dDb3VudCArIDE7DQorICAgIHJlc3VsdC0+U2V0QXQoMiwgbmV3IENCQ19SZXN1bHRQb2ludCgoRlhfRkxPQVQpcHJldmlvdXNSb3dMb2MuR2V0QXQoMCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpc3RvcFJvdykpOw0KKyAgICByZXN1bHQtPlNldEF0KDMsIG5ldyBDQkNfUmVzdWx0UG9pbnQoKEZYX0ZMT0FUKXByZXZpb3VzUm93TG9jLkdldEF0KDEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKXN0b3BSb3cpKTsNCisgIH0NCisgIGlmIChzdG9wUm93IC0gc3RhcnRSb3cgPCBCQVJDT0RFX01JTl9IRUlHSFQpIHsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcmVzdWx0LT5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgIHJlc3VsdC0+U2V0QXQoaSwgTlVMTCk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQorfQ0KK0NGWF9JbnQzMkFycmF5KiBDQkNfRGV0ZWN0b3I6OmZpbmRHdWFyZFBhdHRlcm4oQ0JDX0NvbW1vbkJpdE1hdHJpeCogbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2x1bW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIHdoaXRlRmlyc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBwYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwYXR0ZXJuTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkmIGNvdW50ZXJzKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb3VudGVycy5HZXRTaXplKCk7IGkrKykgew0KKyAgICBjb3VudGVycy5TZXRBdChpLCAwKTsNCisgIH0NCisgIEZYX0JPT0wgaXNXaGl0ZSA9IHdoaXRlRmlyc3Q7DQorICBpbnQzMl90IHBhdHRlcm5TdGFydCA9IGNvbHVtbjsNCisgIGludDMyX3QgcGl4ZWxEcmlmdCA9IDA7DQorICBDRlhfSW50MzJBcnJheSogaW50YXJyYXkgPSBuZXcgQ0ZYX0ludDMyQXJyYXk7DQorICB3aGlsZSAobWF0cml4LT5HZXQocGF0dGVyblN0YXJ0LCByb3cpICYmIHBhdHRlcm5TdGFydCA+IDAgJiYNCisgICAgICAgICBwaXhlbERyaWZ0KysgPCBNQVhfUElYRUxfRFJJRlQpIHsNCisgICAgcGF0dGVyblN0YXJ0LS07DQorICB9DQorICBpbnQzMl90IHggPSBwYXR0ZXJuU3RhcnQ7DQorICBpbnQzMl90IGNvdW50ZXJQb3NpdGlvbiA9IDA7DQorICBmb3IgKDsgeCA8IHdpZHRoOyB4KyspIHsNCisgICAgRlhfQk9PTCBwaXhlbCA9IG1hdHJpeC0+R2V0KHgsIHJvdyk7DQorICAgIGlmIChwaXhlbCBeIGlzV2hpdGUpIHsNCisgICAgICBjb3VudGVyc1tjb3VudGVyUG9zaXRpb25dKys7DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKGNvdW50ZXJQb3NpdGlvbiA9PSBwYXR0ZXJuTGVuZ3RoIC0gMSkgew0KKyAgICAgICAgaWYgKHBhdHRlcm5NYXRjaFZhcmlhbmNlKGNvdW50ZXJzLCBwYXR0ZXJuLCBNQVhfSU5ESVZJRFVBTF9WQVJJQU5DRSkgPA0KKyAgICAgICAgICAgIE1BWF9BVkdfVkFSSUFOQ0UpIHsNCisgICAgICAgICAgaW50YXJyYXktPkFkZChwYXR0ZXJuU3RhcnQpOw0KKyAgICAgICAgICBpbnRhcnJheS0+QWRkKHgpOw0KKyAgICAgICAgICByZXR1cm4gaW50YXJyYXk7DQorICAgICAgICB9DQorICAgICAgICBwYXR0ZXJuU3RhcnQgKz0gY291bnRlcnNbMF0gKyBjb3VudGVyc1sxXTsNCisgICAgICAgIGZvciAoaW50MzJfdCBsID0gMiwgayA9IDA7IGwgPCBwYXR0ZXJuTGVuZ3RoOyBsKyssIGsrKykgew0KKyAgICAgICAgICBjb3VudGVycy5TZXRBdChrLCBjb3VudGVycy5HZXRBdChsKSk7DQorICAgICAgICB9DQorICAgICAgICBjb3VudGVycy5TZXRBdChwYXR0ZXJuTGVuZ3RoIC0gMiwgMCk7DQorICAgICAgICBjb3VudGVycy5TZXRBdChwYXR0ZXJuTGVuZ3RoIC0gMSwgMCk7DQorICAgICAgICBjb3VudGVyUG9zaXRpb24tLTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgY291bnRlclBvc2l0aW9uKys7DQorICAgICAgfQ0KKyAgICAgIGNvdW50ZXJzW2NvdW50ZXJQb3NpdGlvbl0gPSAxOw0KKyAgICAgIGlzV2hpdGUgPSAhaXNXaGl0ZTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGNvdW50ZXJQb3NpdGlvbiA9PSBwYXR0ZXJuTGVuZ3RoIC0gMSkgew0KKyAgICBpZiAocGF0dGVybk1hdGNoVmFyaWFuY2UoY291bnRlcnMsIHBhdHRlcm4sIE1BWF9JTkRJVklEVUFMX1ZBUklBTkNFKSA8DQorICAgICAgICBNQVhfQVZHX1ZBUklBTkNFKSB7DQorICAgICAgaW50YXJyYXktPkFkZChwYXR0ZXJuU3RhcnQpOw0KKyAgICAgIGludGFycmF5LT5BZGQoeCAtIDEpOw0KKyAgICAgIHJldHVybiBpbnRhcnJheTsNCisgICAgfQ0KKyAgfQ0KKyAgZGVsZXRlIGludGFycmF5Ow0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK2ludDMyX3QgQ0JDX0RldGVjdG9yOjpwYXR0ZXJuTWF0Y2hWYXJpYW5jZShDRlhfSW50MzJBcnJheSYgY291bnRlcnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF4SW5kaXZpZHVhbFZhcmlhbmNlKSB7DQorICBpbnQzMl90IG51bUNvdW50ZXJzID0gY291bnRlcnMuR2V0U2l6ZSgpOw0KKyAgaW50MzJfdCB0b3RhbCA9IDA7DQorICBpbnQzMl90IHBhdHRlcm5MZW5ndGggPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtQ291bnRlcnM7IGkrKykgew0KKyAgICB0b3RhbCArPSBjb3VudGVyc1tpXTsNCisgICAgcGF0dGVybkxlbmd0aCArPSBwYXR0ZXJuW2ldOw0KKyAgfQ0KKyAgaWYgKHRvdGFsIDwgcGF0dGVybkxlbmd0aCkgew0KKyAgICByZXR1cm4gSU5URVJHRVJfTUFYOw0KKyAgfQ0KKyAgaW50MzJfdCB1bml0QmFyV2lkdGggPSAodG90YWwgPDwgSU5URUdFUl9NQVRIX1NISUZUKSAvIHBhdHRlcm5MZW5ndGg7DQorICBtYXhJbmRpdmlkdWFsVmFyaWFuY2UgPQ0KKyAgICAgIChtYXhJbmRpdmlkdWFsVmFyaWFuY2UgKiB1bml0QmFyV2lkdGgpID4+IElOVEVHRVJfTUFUSF9TSElGVDsNCisgIGludDMyX3QgdG90YWxWYXJpYW5jZSA9IDA7DQorICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBudW1Db3VudGVyczsgeCsrKSB7DQorICAgIGludDMyX3QgY291bnRlciA9IGNvdW50ZXJzW3hdIDw8IElOVEVHRVJfTUFUSF9TSElGVDsNCisgICAgaW50MzJfdCBzY2FsZWRQYXR0ZXJuID0gcGF0dGVyblt4XSAqIHVuaXRCYXJXaWR0aDsNCisgICAgaW50MzJfdCB2YXJpYW5jZSA9IGNvdW50ZXIgPiBzY2FsZWRQYXR0ZXJuID8gY291bnRlciAtIHNjYWxlZFBhdHRlcm4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2NhbGVkUGF0dGVybiAtIGNvdW50ZXI7DQorICAgIGlmICh2YXJpYW5jZSA+IG1heEluZGl2aWR1YWxWYXJpYW5jZSkgew0KKyAgICAgIHJldHVybiBJTlRFUkdFUl9NQVg7DQorICAgIH0NCisgICAgdG90YWxWYXJpYW5jZSArPSB2YXJpYW5jZTsNCisgIH0NCisgIHJldHVybiB0b3RhbFZhcmlhbmNlIC8gdG90YWw7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3Rvci5oIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMzZGQwMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3Rvci5oCkBAIC0wLDAgKzEsNjYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfREVURUNUT1JfSF8NCisjZGVmaW5lIF9CQ19ERVRFQ1RPUl9IXw0KK2NsYXNzIENCQ19QREY0MTdEZXRlY3RvclJlc3VsdDsNCitjbGFzcyBDQkNfQmluYXJ5Qml0bWFwOw0KK2NsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQorY2xhc3MgQ0JDX0NvbW1vbkJpdEFycmF5Ow0KK2NsYXNzIENCQ19EZXRlY3RvciB7DQorIHB1YmxpYzoNCisgIENCQ19EZXRlY3RvcigpOw0KKyAgdmlydHVhbCB+Q0JDX0RldGVjdG9yKCk7DQorICBzdGF0aWMgQ0JDX1BERjQxN0RldGVjdG9yUmVzdWx0KiBkZXRlY3QoQ0JDX0JpbmFyeUJpdG1hcCogaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIG11bHRpcGxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgcm90YXRlMTgwKENCQ19Db21tb25CaXRNYXRyaXgqIGJpdE1hdHJpeCk7DQorICBzdGF0aWMgQ0JDX0NvbW1vbkJpdEFycmF5KiBtaXJyb3IoQ0JDX0NvbW1vbkJpdEFycmF5KiBpbnB1dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQml0QXJyYXkqIHJlc3VsdCk7DQorDQorIHByaXZhdGU6DQorICBzdGF0aWMgaW50MzJfdCBJTkRFWEVTX1NUQVJUX1BBVFRFUk5bXTsNCisgIHN0YXRpYyBpbnQzMl90IElOREVYRVNfU1RPUF9QQVRURVJOW107DQorICBzdGF0aWMgaW50MzJfdCBJTlRFR0VSX01BVEhfU0hJRlQ7DQorICBzdGF0aWMgaW50MzJfdCBQQVRURVJOX01BVENIX1JFU1VMVF9TQ0FMRV9GQUNUT1I7DQorICBzdGF0aWMgaW50MzJfdCBNQVhfQVZHX1ZBUklBTkNFOw0KKyAgc3RhdGljIGludDMyX3QgTUFYX0lORElWSURVQUxfVkFSSUFOQ0U7DQorICBzdGF0aWMgaW50MzJfdCBTVEFSVF9QQVRURVJOW107DQorICBzdGF0aWMgaW50MzJfdCBTVE9QX1BBVFRFUk5bXTsNCisgIHN0YXRpYyBpbnQzMl90IE1BWF9QSVhFTF9EUklGVDsNCisgIHN0YXRpYyBpbnQzMl90IE1BWF9QQVRURVJOX0RSSUZUOw0KKyAgc3RhdGljIGludDMyX3QgU0tJUFBFRF9ST1dfQ09VTlRfTUFYOw0KKyAgc3RhdGljIGludDMyX3QgUk9XX1NURVA7DQorICBzdGF0aWMgaW50MzJfdCBCQVJDT0RFX01JTl9IRUlHSFQ7DQorICBzdGF0aWMgQ0ZYX1B0ckFycmF5KiBkZXRlY3QoRlhfQk9PTCBtdWx0aXBsZSwgQ0JDX0NvbW1vbkJpdE1hdHJpeCogYml0TWF0cml4KTsNCisgIHN0YXRpYyBDRlhfUHRyQXJyYXkqIGZpbmRWZXJ0aWNlcyhDQkNfQ29tbW9uQml0TWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydFJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0Q29sdW1uKTsNCisgIHN0YXRpYyB2b2lkIGNvcHlUb1Jlc3VsdChDRlhfUHRyQXJyYXkqIHJlc3VsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkqIHRtcFJlc3VsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBkZXN0aW5hdGlvbkluZGV4ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZXN0aW5hdGlvbkxlbmd0aCk7DQorICBzdGF0aWMgQ0ZYX1B0ckFycmF5KiBmaW5kUm93c1dpdGhQYXR0ZXJuKENCQ19Db21tb25CaXRNYXRyaXgqIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRSb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRDb2x1bW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGF0dGVybkxlbmd0aCk7DQorICBzdGF0aWMgQ0ZYX0ludDMyQXJyYXkqIGZpbmRHdWFyZFBhdHRlcm4oQ0JDX0NvbW1vbkJpdE1hdHJpeCogbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29sdW1uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm93LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCB3aGl0ZUZpcnN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwYXR0ZXJuTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5JiBjb3VudGVycyk7DQorICBzdGF0aWMgaW50MzJfdCBwYXR0ZXJuTWF0Y2hWYXJpYW5jZShDRlhfSW50MzJBcnJheSYgY291bnRlcnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBwYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhJbmRpdmlkdWFsVmFyaWFuY2UpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdG9yUmVzdWx0LmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3RvclJlc3VsdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBmZWFmMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEZXRlY3RvclJlc3VsdC5jcHAKQEAgLTAsMCArMSw1MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfUmVzdWx0UG9pbnQuaCINCisjaW5jbHVkZSAiQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQuaCINCitDQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQ6OkNCQ19QREY0MTdEZXRlY3RvclJlc3VsdChDQkNfQ29tbW9uQml0TWF0cml4KiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJBcnJheSogcG9pbnRzKSB7DQorICBtX2JpdHMgPSBiaXRzOw0KKyAgbV9wb2ludHMgPSBwb2ludHM7DQorfQ0KK0NCQ19QREY0MTdEZXRlY3RvclJlc3VsdDo6fkNCQ19QREY0MTdEZXRlY3RvclJlc3VsdCgpIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fcG9pbnRzLT5HZXRTaXplKCk7IGkrKykgew0KKyAgICBDRlhfUHRyQXJyYXkqIHRlbXAgPSAoQ0ZYX1B0ckFycmF5KiltX3BvaW50cy0+R2V0QXQoaSk7DQorICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IHRlbXAtPkdldFNpemUoKTsgaisrKSB7DQorICAgICAgZGVsZXRlIChDQkNfUmVzdWx0UG9pbnQqKXRlbXAtPkdldEF0KGopOw0KKyAgICB9DQorICAgIHRlbXAtPlJlbW92ZUFsbCgpOw0KKyAgICBkZWxldGUgdGVtcDsNCisgIH0NCisgIG1fcG9pbnRzLT5SZW1vdmVBbGwoKTsNCisgIGRlbGV0ZSBtX3BvaW50czsNCit9DQorQ0JDX0NvbW1vbkJpdE1hdHJpeCogQ0JDX1BERjQxN0RldGVjdG9yUmVzdWx0OjpnZXRCaXRzKCkgew0KKyAgcmV0dXJuIG1fYml0czsNCit9DQorDQorQ0ZYX1B0ckFycmF5KiBDQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQ6OmdldFBvaW50cygpIHsNCisgIHJldHVybiBtX3BvaW50czsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdG9yUmVzdWx0LmggYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGUzMzg4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RldGVjdG9yUmVzdWx0LmgKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19QREY0MTdERVRFQ1RPUlJFU1VMVF9IXw0KKyNkZWZpbmUgX0JDX1BERjQxN0RFVEVDVE9SUkVTVUxUX0hfDQorY2xhc3MgQ0JDX0NvbW1vbkJpdE1hdHJpeDsNCitjbGFzcyBDQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQgew0KKyBwdWJsaWM6DQorICBDQkNfUERGNDE3RGV0ZWN0b3JSZXN1bHQoQ0JDX0NvbW1vbkJpdE1hdHJpeCogYml0cywgQ0ZYX1B0ckFycmF5KiBwb2ludHMpOw0KKyAgdmlydHVhbCB+Q0JDX1BERjQxN0RldGVjdG9yUmVzdWx0KCk7DQorICBDQkNfQ29tbW9uQml0TWF0cml4KiBnZXRCaXRzKCk7DQorICBDRlhfUHRyQXJyYXkqIGdldFBvaW50cygpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogbV9iaXRzOw0KKyAgQ0ZYX1B0ckFycmF5KiBtX3BvaW50czsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEaW1lbnNpb25zLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEaW1lbnNpb25zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjBmNWZkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0RpbWVuc2lvbnMuY3BwCkBAIC0wLDAgKzEsNDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMTIgWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdEaW1lbnNpb25zLmgiDQorQ0JDX0RpbWVuc2lvbnM6OkNCQ19EaW1lbnNpb25zKGludDMyX3QgbWluQ29scywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhDb2xzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1pblJvd3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF4Um93cykgew0KKyAgbV9taW5Db2xzID0gbWluQ29sczsNCisgIG1fbWF4Q29scyA9IG1heENvbHM7DQorICBtX21pblJvd3MgPSBtaW5Sb3dzOw0KKyAgbV9tYXhSb3dzID0gbWF4Um93czsNCit9DQorQ0JDX0RpbWVuc2lvbnM6On5DQkNfRGltZW5zaW9ucygpIHt9DQoraW50MzJfdCBDQkNfRGltZW5zaW9uczo6Z2V0TWluQ29scygpIHsNCisgIHJldHVybiBtX21pbkNvbHM7DQorfQ0KK2ludDMyX3QgQ0JDX0RpbWVuc2lvbnM6OmdldE1heENvbHMoKSB7DQorICByZXR1cm4gbV9tYXhDb2xzOw0KK30NCitpbnQzMl90IENCQ19EaW1lbnNpb25zOjpnZXRNaW5Sb3dzKCkgew0KKyAgcmV0dXJuIG1fbWluUm93czsNCit9DQoraW50MzJfdCBDQkNfRGltZW5zaW9uczo6Z2V0TWF4Um93cygpIHsNCisgIHJldHVybiBtX21heFJvd3M7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdEaW1lbnNpb25zLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGltZW5zaW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZDQ2ZGMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RGltZW5zaW9ucy5oCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfRElNRU5TSU9OU19IXw0KKyNkZWZpbmUgX0JDX0RJTUVOU0lPTlNfSF8NCitjbGFzcyBDQkNfRGltZW5zaW9ucyB7DQorIHB1YmxpYzoNCisgIENCQ19EaW1lbnNpb25zKGludDMyX3QgbWluQ29scywNCisgICAgICAgICAgICAgICAgIGludDMyX3QgbWF4Q29scywNCisgICAgICAgICAgICAgICAgIGludDMyX3QgbWluUm93cywNCisgICAgICAgICAgICAgICAgIGludDMyX3QgbWF4Um93cyk7DQorICB2aXJ0dWFsIH5DQkNfRGltZW5zaW9ucygpOw0KKyAgaW50MzJfdCBnZXRNaW5Db2xzKCk7DQorICBpbnQzMl90IGdldE1heENvbHMoKTsNCisgIGludDMyX3QgZ2V0TWluUm93cygpOw0KKyAgaW50MzJfdCBnZXRNYXhSb3dzKCk7DQorDQorIHByaXZhdGU6DQorICBpbnQzMl90IG1fbWluQ29sczsNCisgIGludDMyX3QgbV9tYXhDb2xzOw0KKyAgaW50MzJfdCBtX21pblJvd3M7DQorICBpbnQzMl90IG1fbWF4Um93czsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbi5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YjkwNDQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb24uY3BwCkBAIC0wLDAgKzEsMzg3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDEyIFpYaW5nIGF1dGhvcnMNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAiQkNfUERGNDE3Q29tbW9uLmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0VDTW9kdWx1c1BvbHkuaCINCisjaW5jbHVkZSAiQkNfUERGNDE3RUNNb2R1bHVzR0YuaCINCisjaW5jbHVkZSAiQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb24uaCINCitDQkNfUERGNDE3RUNNb2R1bHVzR0YqIENCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbjo6bV9maWVsZCA9IE5VTEw7DQordm9pZCBDQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb246OkluaXRpYWxpemUoaW50MzJfdCYgZSkgew0KKyAgbV9maWVsZCA9DQorICAgICAgbmV3IENCQ19QREY0MTdFQ01vZHVsdXNHRihDQkNfUERGNDE3Q29tbW9uOjpOVU1CRVJfT0ZfQ09ERVdPUkRTLCAzLCBlKTsNCit9DQordm9pZCBDQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb246OkZpbmFsaXplKCkgew0KKyAgZGVsZXRlIG1fZmllbGQ7DQorfQ0KK0NCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbjo6Q0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uKCkge30NCitDQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb246On5DQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb24oKSB7fQ0KK2ludDMyX3QgQ0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uOjpkZWNvZGUoQ0ZYX0ludDMyQXJyYXkmIHJlY2VpdmVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1FQ0NvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9JbnQzMkFycmF5JiBlcmFzdXJlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5IHBvbHkobV9maWVsZCwgcmVjZWl2ZWQsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIC0xKTsNCisgIENGWF9JbnQzMkFycmF5IFM7DQorICBTLlNldFNpemUobnVtRUNDb2Rld29yZHMpOw0KKyAgRlhfQk9PTCBlcnJvciA9IEZBTFNFOw0KKyAgZm9yIChpbnQzMl90IGwgPSBudW1FQ0NvZGV3b3JkczsgbCA+IDA7IGwtLSkgew0KKyAgICBpbnQzMl90IGV2YWwgPSBwb2x5LmV2YWx1YXRlQXQobV9maWVsZC0+ZXhwKGwpKTsNCisgICAgU1tudW1FQ0NvZGV3b3JkcyAtIGxdID0gZXZhbDsNCisgICAgaWYgKGV2YWwgIT0gMCkgew0KKyAgICAgIGVycm9yID0gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKCFlcnJvcikgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBzeW5kcm9tZSA9DQorICAgICAgbmV3IENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG1fZmllbGQsIFMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIC0xKTsNCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBidWlsZG1vbm9taWFsID0NCisgICAgICBtX2ZpZWxkLT5idWlsZE1vbm9taWFsKG51bUVDQ29kZXdvcmRzLCAxLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgZGVsZXRlIHN5bmRyb21lOw0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBDRlhfUHRyQXJyYXkqIHNpZ21hT21lZ2EgPQ0KKyAgICAgIHJ1bkV1Y2xpZGVhbkFsZ29yaXRobShidWlsZG1vbm9taWFsLCBzeW5kcm9tZSwgbnVtRUNDb2Rld29yZHMsIGUpOw0KKyAgZGVsZXRlIGJ1aWxkbW9ub21pYWw7DQorICBkZWxldGUgc3luZHJvbWU7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgLTEpOw0KKyAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHNpZ21hID0NCisgICAgICAoQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqKXNpZ21hT21lZ2EtPkdldEF0KDApOw0KKyAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG9tZWdhID0NCisgICAgICAoQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqKXNpZ21hT21lZ2EtPkdldEF0KDEpOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIGVycm9yTG9jYXRpb25zID0gZmluZEVycm9yTG9jYXRpb25zKHNpZ21hLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2lnbWFPbWVnYS0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICBkZWxldGUgKENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KilzaWdtYU9tZWdhLT5HZXRBdChpKTsNCisgICAgfQ0KKyAgICBzaWdtYU9tZWdhLT5SZW1vdmVBbGwoKTsNCisgICAgZGVsZXRlIHNpZ21hT21lZ2E7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIENGWF9JbnQzMkFycmF5KiBlcnJvck1hZ25pdHVkZXMgPQ0KKyAgICAgIGZpbmRFcnJvck1hZ25pdHVkZXMob21lZ2EsIHNpZ21hLCAqZXJyb3JMb2NhdGlvbnMsIGUpOw0KKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICBkZWxldGUgZXJyb3JMb2NhdGlvbnM7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNpZ21hT21lZ2EtPkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgZGVsZXRlIChDQkNfUERGNDE3RUNNb2R1bHVzUG9seSopc2lnbWFPbWVnYS0+R2V0QXQoaSk7DQorICAgIH0NCisgICAgc2lnbWFPbWVnYS0+UmVtb3ZlQWxsKCk7DQorICAgIGRlbGV0ZSBzaWdtYU9tZWdhOw0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBlcnJvckxvY2F0aW9ucy0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgaW50MzJfdCBsb2cgPSBtX2ZpZWxkLT5sb2coZXJyb3JMb2NhdGlvbnMtPkdldEF0KGkpLCBlKTsNCisgICAgOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgLTEpOw0KKyAgICBpbnQzMl90IHBvc2l0aW9uID0gcmVjZWl2ZWQuR2V0U2l6ZSgpIC0gMSAtIGxvZzsNCisgICAgaWYgKHBvc2l0aW9uIDwgMCkgew0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbkNoZWNrc3VtRXhjZXB0aW9uOw0KKyAgICAgIGRlbGV0ZSBlcnJvckxvY2F0aW9uczsNCisgICAgICBkZWxldGUgZXJyb3JNYWduaXR1ZGVzOw0KKyAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IHNpZ21hT21lZ2EtPkdldFNpemUoKTsgaisrKSB7DQorICAgICAgICBkZWxldGUgKENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KilzaWdtYU9tZWdhLT5HZXRBdChqKTsNCisgICAgICB9DQorICAgICAgc2lnbWFPbWVnYS0+UmVtb3ZlQWxsKCk7DQorICAgICAgZGVsZXRlIHNpZ21hT21lZ2E7DQorICAgICAgcmV0dXJuIC0xOw0KKyAgICB9DQorICAgIHJlY2VpdmVkW3Bvc2l0aW9uXSA9DQorICAgICAgICBtX2ZpZWxkLT5zdWJ0cmFjdChyZWNlaXZlZFtwb3NpdGlvbl0sIGVycm9yTWFnbml0dWRlcy0+R2V0QXQoaSkpOw0KKyAgfQ0KKyAgaW50MzJfdCByZXN1bHQgPSBlcnJvckxvY2F0aW9ucy0+R2V0U2l6ZSgpOw0KKyAgZGVsZXRlIGVycm9yTG9jYXRpb25zOw0KKyAgZGVsZXRlIGVycm9yTWFnbml0dWRlczsNCisgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IHNpZ21hT21lZ2EtPkdldFNpemUoKTsgaysrKSB7DQorICAgIGRlbGV0ZSAoQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqKXNpZ21hT21lZ2EtPkdldEF0KGspOw0KKyAgfQ0KKyAgc2lnbWFPbWVnYS0+UmVtb3ZlQWxsKCk7DQorICBkZWxldGUgc2lnbWFPbWVnYTsNCisgIHJldHVybiByZXN1bHQ7DQorfQ0KK0NGWF9QdHJBcnJheSogQ0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uOjpydW5FdWNsaWRlYW5BbGdvcml0aG0oDQorICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBhLA0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogYiwNCisgICAgaW50MzJfdCBSLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoYS0+Z2V0RGVncmVlKCkgPCBiLT5nZXREZWdyZWUoKSkgew0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogdGVtcCA9IGE7DQorICAgIGEgPSBiOw0KKyAgICBiID0gdGVtcDsNCisgIH0NCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiByTGFzdCA9IGE7DQorICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogciA9IGI7DQorICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogdExhc3QgPSBtX2ZpZWxkLT5nZXRaZXJvKCk7DQorICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogdCA9IG1fZmllbGQtPmdldE9uZSgpOw0KKyAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHF0ZW1wID0gTlVMTDsNCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBydGVtcCA9IE5VTEw7DQorICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogdHRlbXAgPSBOVUxMOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIGludDMyX3QgaiA9IDA7DQorICBpbnQzMl90IG0gPSAwOw0KKyAgaW50MzJfdCBuID0gMDsNCisgIHdoaWxlIChyLT5nZXREZWdyZWUoKSA+PSBSIC8gMikgew0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogckxhc3RMYXN0ID0gckxhc3Q7DQorICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiB0TGFzdExhc3QgPSB0TGFzdDsNCisgICAgckxhc3QgPSByOw0KKyAgICB0TGFzdCA9IHQ7DQorICAgIG0gPSBpOw0KKyAgICBuID0gajsNCisgICAgaWYgKHJMYXN0LT5pc1plcm8oKSkgew0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbkNoZWNrc3VtRXhjZXB0aW9uOw0KKyAgICAgIGlmIChxdGVtcCkgew0KKyAgICAgICAgZGVsZXRlIHF0ZW1wOw0KKyAgICAgIH0NCisgICAgICBpZiAocnRlbXApIHsNCisgICAgICAgIGRlbGV0ZSBydGVtcDsNCisgICAgICB9DQorICAgICAgaWYgKHR0ZW1wKSB7DQorICAgICAgICBkZWxldGUgdHRlbXA7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHIgPSByTGFzdExhc3Q7DQorICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBxID0gbV9maWVsZC0+Z2V0WmVybygpOw0KKyAgICBpbnQzMl90IGRlbm9taW5hdG9yTGVhZGluZ1Rlcm0gPSByTGFzdC0+Z2V0Q29lZmZpY2llbnQockxhc3QtPmdldERlZ3JlZSgpKTsNCisgICAgaW50MzJfdCBkbHRJbnZlcnNlID0gbV9maWVsZC0+aW52ZXJzZShkZW5vbWluYXRvckxlYWRpbmdUZXJtLCBlKTsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgIGlmIChxdGVtcCkgew0KKyAgICAgICAgZGVsZXRlIHF0ZW1wOw0KKyAgICAgIH0NCisgICAgICBpZiAocnRlbXApIHsNCisgICAgICAgIGRlbGV0ZSBydGVtcDsNCisgICAgICB9DQorICAgICAgaWYgKHR0ZW1wKSB7DQorICAgICAgICBkZWxldGUgdHRlbXA7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHdoaWxlIChyLT5nZXREZWdyZWUoKSA+PSByTGFzdC0+Z2V0RGVncmVlKCkgJiYgIXItPmlzWmVybygpKSB7DQorICAgICAgaW50MzJfdCBkZWdyZWVEaWZmID0gci0+Z2V0RGVncmVlKCkgLSByTGFzdC0+Z2V0RGVncmVlKCk7DQorICAgICAgaW50MzJfdCBzY2FsZSA9DQorICAgICAgICAgIG1fZmllbGQtPm11bHRpcGx5KHItPmdldENvZWZmaWNpZW50KHItPmdldERlZ3JlZSgpKSwgZGx0SW52ZXJzZSk7DQorICAgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIGJ1aWxkbW9ub21pYWwgPQ0KKyAgICAgICAgICBtX2ZpZWxkLT5idWlsZE1vbm9taWFsKGRlZ3JlZURpZmYsIHNjYWxlLCBlKTsNCisgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICBpZiAocXRlbXApIHsNCisgICAgICAgICAgZGVsZXRlIHF0ZW1wOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHJ0ZW1wKSB7DQorICAgICAgICAgIGRlbGV0ZSBydGVtcDsNCisgICAgICAgIH0NCisgICAgICAgIGlmICh0dGVtcCkgew0KKyAgICAgICAgICBkZWxldGUgdHRlbXA7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICB9DQorICAgICAgcSA9IHEtPmFkZChidWlsZG1vbm9taWFsLCBlKTsNCisgICAgICBkZWxldGUgYnVpbGRtb25vbWlhbDsNCisgICAgICBpZiAocXRlbXApIHsNCisgICAgICAgIGRlbGV0ZSBxdGVtcDsNCisgICAgICB9DQorICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgaWYgKHJ0ZW1wKSB7DQorICAgICAgICAgIGRlbGV0ZSBydGVtcDsNCisgICAgICAgIH0NCisgICAgICAgIGlmICh0dGVtcCkgew0KKyAgICAgICAgICBkZWxldGUgdHRlbXA7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICB9DQorICAgICAgcXRlbXAgPSBxOw0KKyAgICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBtdWx0aXBseSA9DQorICAgICAgICAgIHJMYXN0LT5tdWx0aXBseUJ5TW9ub21pYWwoZGVncmVlRGlmZiwgc2NhbGUsIGUpOw0KKyAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICAgIGlmIChxdGVtcCkgew0KKyAgICAgICAgICBkZWxldGUgcXRlbXA7DQorICAgICAgICB9DQorICAgICAgICBpZiAocnRlbXApIHsNCisgICAgICAgICAgZGVsZXRlIHJ0ZW1wOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHR0ZW1wKSB7DQorICAgICAgICAgIGRlbGV0ZSB0dGVtcDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0NCisgICAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogdGVtcCA9IHI7DQorICAgICAgciA9IHRlbXAtPnN1YnRyYWN0KG11bHRpcGx5LCBlKTsNCisgICAgICBkZWxldGUgbXVsdGlwbHk7DQorICAgICAgaWYgKG0gPiAxICYmIGkgPiBtKSB7DQorICAgICAgICBkZWxldGUgdGVtcDsNCisgICAgICAgIHRlbXAgPSBOVUxMOw0KKyAgICAgIH0NCisgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgICBpZiAocXRlbXApIHsNCisgICAgICAgICAgZGVsZXRlIHF0ZW1wOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHJ0ZW1wKSB7DQorICAgICAgICAgIGRlbGV0ZSBydGVtcDsNCisgICAgICAgIH0NCisgICAgICAgIGlmICh0dGVtcCkgew0KKyAgICAgICAgICBkZWxldGUgdHRlbXA7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICB9DQorICAgICAgcnRlbXAgPSByOw0KKyAgICAgIGkgPSBtICsgMTsNCisgICAgfQ0KKyAgICB0dGVtcCA9IHEtPm11bHRpcGx5KHRMYXN0LCBlKTsNCisgICAgaWYgKHF0ZW1wKSB7DQorICAgICAgZGVsZXRlIHF0ZW1wOw0KKyAgICAgIHF0ZW1wID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgaWYgKHJ0ZW1wKSB7DQorICAgICAgICBkZWxldGUgcnRlbXA7DQorICAgICAgfQ0KKyAgICAgIGlmICh0dGVtcCkgew0KKyAgICAgICAgZGVsZXRlIHR0ZW1wOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICB0ID0gdHRlbXAtPnN1YnRyYWN0KHRMYXN0TGFzdCwgZSk7DQorICAgIGlmIChuID4gMSAmJiBqID4gbikgew0KKyAgICAgIGRlbGV0ZSB0TGFzdExhc3Q7DQorICAgIH0NCisgICAgZGVsZXRlIHR0ZW1wOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgaWYgKHJ0ZW1wKSB7DQorICAgICAgICBkZWxldGUgcnRlbXA7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHR0ZW1wID0gdDsNCisgICAgdCA9IHR0ZW1wLT5uZWdhdGl2ZShlKTsNCisgICAgZGVsZXRlIHR0ZW1wOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgaWYgKHJ0ZW1wKSB7DQorICAgICAgICBkZWxldGUgcnRlbXA7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHR0ZW1wID0gdDsNCisgICAgaisrOw0KKyAgfQ0KKyAgaW50MzJfdCBzaWdtYVRpbGRlQXRaZXJvID0gdC0+Z2V0Q29lZmZpY2llbnQoMCk7DQorICBpZiAoc2lnbWFUaWxkZUF0WmVybyA9PSAwKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkNoZWNrc3VtRXhjZXB0aW9uOw0KKyAgICBpZiAocnRlbXApIHsNCisgICAgICBkZWxldGUgcnRlbXA7DQorICAgIH0NCisgICAgaWYgKHR0ZW1wKSB7DQorICAgICAgZGVsZXRlIHR0ZW1wOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaW50MzJfdCBpbnZlcnNlID0gbV9maWVsZC0+aW52ZXJzZShzaWdtYVRpbGRlQXRaZXJvLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgaWYgKHJ0ZW1wKSB7DQorICAgICAgZGVsZXRlIHJ0ZW1wOw0KKyAgICB9DQorICAgIGlmICh0dGVtcCkgew0KKyAgICAgIGRlbGV0ZSB0dGVtcDsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBzaWdtYSA9IHQtPm11bHRpcGx5KGludmVyc2UsIGUpOw0KKyAgaWYgKHR0ZW1wKSB7DQorICAgIGRlbGV0ZSB0dGVtcDsNCisgIH0NCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgaWYgKHJ0ZW1wKSB7DQorICAgICAgZGVsZXRlIHJ0ZW1wOw0KKyAgICB9DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG9tZWdhID0gci0+bXVsdGlwbHkoaW52ZXJzZSwgZSk7DQorICBpZiAocnRlbXApIHsNCisgICAgZGVsZXRlIHJ0ZW1wOw0KKyAgfQ0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgQ0ZYX1B0ckFycmF5KiBtb2R1bHVzUG9seSA9IG5ldyBDRlhfUHRyQXJyYXk7DQorICBtb2R1bHVzUG9seS0+QWRkKHNpZ21hKTsNCisgIG1vZHVsdXNQb2x5LT5BZGQob21lZ2EpOw0KKyAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KK30NCitDRlhfSW50MzJBcnJheSogQ0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uOjpmaW5kRXJyb3JMb2NhdGlvbnMoDQorICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBlcnJvckxvY2F0b3IsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3QgbnVtRXJyb3JzID0gZXJyb3JMb2NhdG9yLT5nZXREZWdyZWUoKTsNCisgIENGWF9JbnQzMkFycmF5KiByZXN1bHQgPSBuZXcgQ0ZYX0ludDMyQXJyYXk7DQorICByZXN1bHQtPlNldFNpemUobnVtRXJyb3JzKTsNCisgIGludDMyX3QgZWUgPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgbV9maWVsZC0+Z2V0U2l6ZSgpICYmIGVlIDwgbnVtRXJyb3JzOyBpKyspIHsNCisgICAgaWYgKGVycm9yTG9jYXRvci0+ZXZhbHVhdGVBdChpKSA9PSAwKSB7DQorICAgICAgcmVzdWx0LT5TZXRBdChlZSwgbV9maWVsZC0+aW52ZXJzZShpLCBlKSk7DQorICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgICAgZGVsZXRlIHJlc3VsdDsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0NCisgICAgICBlZSsrOw0KKyAgICB9DQorICB9DQorICBpZiAoZWUgIT0gbnVtRXJyb3JzKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkNoZWNrc3VtRXhjZXB0aW9uOw0KKyAgICBkZWxldGUgcmVzdWx0Ow0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQorfQ0KK0NGWF9JbnQzMkFycmF5KiBDQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb246OmZpbmRFcnJvck1hZ25pdHVkZXMoDQorICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBlcnJvckV2YWx1YXRvciwNCisgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIGVycm9yTG9jYXRvciwNCisgICAgQ0ZYX0ludDMyQXJyYXkmIGVycm9yTG9jYXRpb25zLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IGVycm9yTG9jYXRvckRlZ3JlZSA9IGVycm9yTG9jYXRvci0+Z2V0RGVncmVlKCk7DQorICBDRlhfSW50MzJBcnJheSBmb3JtYWxEZXJpdmF0aXZlQ29lZmZpY2llbnRzOw0KKyAgZm9ybWFsRGVyaXZhdGl2ZUNvZWZmaWNpZW50cy5TZXRTaXplKGVycm9yTG9jYXRvckRlZ3JlZSk7DQorICBmb3IgKGludDMyX3QgbCA9IDE7IGwgPD0gZXJyb3JMb2NhdG9yRGVncmVlOyBsKyspIHsNCisgICAgZm9ybWFsRGVyaXZhdGl2ZUNvZWZmaWNpZW50c1tlcnJvckxvY2F0b3JEZWdyZWUgLSBsXSA9DQorICAgICAgICBtX2ZpZWxkLT5tdWx0aXBseShsLCBlcnJvckxvY2F0b3ItPmdldENvZWZmaWNpZW50KGwpKTsNCisgIH0NCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5IGZvcm1hbERlcml2YXRpdmUobV9maWVsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWFsRGVyaXZhdGl2ZUNvZWZmaWNpZW50cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBpbnQzMl90IHMgPSBlcnJvckxvY2F0aW9ucy5HZXRTaXplKCk7DQorICBDRlhfSW50MzJBcnJheSogcmVzdWx0ID0gbmV3IENGWF9JbnQzMkFycmF5Ow0KKyAgcmVzdWx0LT5TZXRTaXplKHMpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgczsgaSsrKSB7DQorICAgIGludDMyX3QgeGlJbnZlcnNlID0gbV9maWVsZC0+aW52ZXJzZShlcnJvckxvY2F0aW9uc1tpXSwgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICBkZWxldGUgcmVzdWx0Ow0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIGludDMyX3QgbnVtZXJhdG9yID0NCisgICAgICAgIG1fZmllbGQtPnN1YnRyYWN0KDAsIGVycm9yRXZhbHVhdG9yLT5ldmFsdWF0ZUF0KHhpSW52ZXJzZSkpOw0KKyAgICBpbnQzMl90IGRlbm9taW5hdG9yID0NCisgICAgICAgIG1fZmllbGQtPmludmVyc2UoZm9ybWFsRGVyaXZhdGl2ZS5ldmFsdWF0ZUF0KHhpSW52ZXJzZSksIGUpOw0KKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgZGVsZXRlIHJlc3VsdDsNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICByZXN1bHQtPlNldEF0KGksIG1fZmllbGQtPm11bHRpcGx5KG51bWVyYXRvciwgZGVub21pbmF0b3IpKTsNCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbi5oIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4NjA3NwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbi5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUERGNDE3RUNFUlJPUkNPUlJFQ1RJT05fSF8NCisjZGVmaW5lIF9CQ19QREY0MTdFQ0VSUk9SQ09SUkVDVElPTl9IXw0KK2NsYXNzIENCQ19QREY0MTdFQ01vZHVsdXNHRjsNCitjbGFzcyBDQkNfUERGNDE3RUNNb2R1bHVzUG9seTsNCitjbGFzcyBDQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb24gew0KKyBwdWJsaWM6DQorICBDQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb24oKTsNCisgIHZpcnR1YWwgfkNCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbigpOw0KKyAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZShpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7DQorICBzdGF0aWMgaW50MzJfdCBkZWNvZGUoQ0ZYX0ludDMyQXJyYXkmIHJlY2VpdmVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRUNDb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkmIGVyYXN1cmVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKw0KKyBwcml2YXRlOg0KKyAgc3RhdGljIENCQ19QREY0MTdFQ01vZHVsdXNHRiogbV9maWVsZDsNCisgIHN0YXRpYyBDRlhfUHRyQXJyYXkqIHJ1bkV1Y2xpZGVhbkFsZ29yaXRobShDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogYSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IFIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgQ0ZYX0ludDMyQXJyYXkqIGZpbmRFcnJvckxvY2F0aW9ucygNCisgICAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogZXJyb3JMb2NhdG9yLA0KKyAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIENGWF9JbnQzMkFycmF5KiBmaW5kRXJyb3JNYWduaXR1ZGVzKA0KKyAgICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBlcnJvckV2YWx1YXRvciwNCisgICAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogZXJyb3JMb2NhdG9yLA0KKyAgICAgIENGWF9JbnQzMkFycmF5JiBlcnJvckxvY2F0aW9ucywNCisgICAgICBpbnQzMl90JiBlKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ01vZHVsdXNHRi5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RUNNb2R1bHVzR0YuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMzE5NDQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RUNNb2R1bHVzR0YuY3BwCkBAIC0wLDAgKzEsMTE5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDEyIFpYaW5nIGF1dGhvcnMNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAiQkNfUERGNDE3Q29tbW9uLmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0VDTW9kdWx1c1BvbHkuaCINCisjaW5jbHVkZSAiQkNfUERGNDE3RUNNb2R1bHVzR0YuaCINCitDQkNfUERGNDE3RUNNb2R1bHVzR0YqIENCQ19QREY0MTdFQ01vZHVsdXNHRjo6UERGNDE3X0dGID0gTlVMTDsNCit2b2lkIENCQ19QREY0MTdFQ01vZHVsdXNHRjo6SW5pdGlhbGl6ZShpbnQzMl90JiBlKSB7DQorICBQREY0MTdfR0YgPQ0KKyAgICAgIG5ldyBDQkNfUERGNDE3RUNNb2R1bHVzR0YoQ0JDX1BERjQxN0NvbW1vbjo6TlVNQkVSX09GX0NPREVXT1JEUywgMywgZSk7DQorfQ0KK3ZvaWQgQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjpGaW5hbGl6ZSgpIHsNCisgIGRlbGV0ZSBQREY0MTdfR0Y7DQorfQ0KK0NCQ19QREY0MTdFQ01vZHVsdXNHRjo6Q0JDX1BERjQxN0VDTW9kdWx1c0dGKGludDMyX3QgbW9kdWx1cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBtX21vZHVsdXMgPSBtb2R1bHVzOw0KKyAgbV9leHBUYWJsZS5TZXRTaXplKG1vZHVsdXMpOw0KKyAgbV9sb2dUYWJsZS5TZXRTaXplKG1vZHVsdXMpOw0KKyAgaW50MzJfdCB4ID0gMTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1vZHVsdXM7IGkrKykgew0KKyAgICBtX2V4cFRhYmxlW2ldID0geDsNCisgICAgeCA9ICh4ICogZ2VuZXJhdG9yKSAlIG1vZHVsdXM7DQorICB9DQorICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBtb2R1bHVzIC0gMTsgaisrKSB7DQorICAgIG1fbG9nVGFibGVbbV9leHBUYWJsZVtqXV0gPSBqOw0KKyAgfQ0KKyAgQ0ZYX0ludDMyQXJyYXkgemVybzsNCisgIHplcm8uQWRkKDApOw0KKyAgbV96ZXJvID0gbmV3IENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KHRoaXMsIHplcm8sIGUpOw0KKyAgQ0ZYX0ludDMyQXJyYXkgb25lOw0KKyAgb25lLkFkZCgxKTsNCisgIG1fb25lID0gbmV3IENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KHRoaXMsIG9uZSwgZSk7DQorfQ0KK0NCQ19QREY0MTdFQ01vZHVsdXNHRjo6fkNCQ19QREY0MTdFQ01vZHVsdXNHRigpIHsNCisgIGRlbGV0ZSBtX3plcm87DQorICBkZWxldGUgbV9vbmU7DQorfQ0KK0NCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBDQkNfUERGNDE3RUNNb2R1bHVzR0Y6OmdldFplcm8oKSB7DQorICByZXR1cm4gbV96ZXJvOw0KK30NCitDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjpnZXRPbmUoKSB7DQorICByZXR1cm4gbV9vbmU7DQorfQ0KK0NCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBDQkNfUERGNDE3RUNNb2R1bHVzR0Y6OmJ1aWxkTW9ub21pYWwoDQorICAgIGludDMyX3QgZGVncmVlLA0KKyAgICBpbnQzMl90IGNvZWZmaWNpZW50LA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoZGVncmVlIDwgMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG1vZHVsdXNQb2x5ID0gTlVMTDsNCisgIGlmIChjb2VmZmljaWVudCA9PSAwKSB7DQorICAgIG1vZHVsdXNQb2x5ID0gbmV3IENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG1femVyby0+Z2V0RmllbGQoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV96ZXJvLT5nZXRDb2VmZmljaWVudHMoKSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KKyAgfQ0KKyAgQ0ZYX0ludDMyQXJyYXkgY29lZmZpY2llbnRzOw0KKyAgY29lZmZpY2llbnRzLlNldFNpemUoZGVncmVlICsgMSk7DQorICBjb2VmZmljaWVudHNbMF0gPSBjb2VmZmljaWVudDsNCisgIG1vZHVsdXNQb2x5ID0gbmV3IENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KHRoaXMsIGNvZWZmaWNpZW50cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gbW9kdWx1c1BvbHk7DQorfQ0KK2ludDMyX3QgQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjphZGQoaW50MzJfdCBhLCBpbnQzMl90IGIpIHsNCisgIHJldHVybiAoYSArIGIpICUgbV9tb2R1bHVzOw0KK30NCitpbnQzMl90IENCQ19QREY0MTdFQ01vZHVsdXNHRjo6c3VidHJhY3QoaW50MzJfdCBhLCBpbnQzMl90IGIpIHsNCisgIHJldHVybiAobV9tb2R1bHVzICsgYSAtIGIpICUgbV9tb2R1bHVzOw0KK30NCitpbnQzMl90IENCQ19QREY0MTdFQ01vZHVsdXNHRjo6ZXhwKGludDMyX3QgYSkgew0KKyAgcmV0dXJuIG1fZXhwVGFibGVbYV07DQorfQ0KK2ludDMyX3QgQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjpsb2coaW50MzJfdCBhLCBpbnQzMl90JiBlKSB7DQorICBpZiAoYSA9PSAwKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgcmV0dXJuIG1fbG9nVGFibGVbYV07DQorfQ0KK2ludDMyX3QgQ0JDX1BERjQxN0VDTW9kdWx1c0dGOjppbnZlcnNlKGludDMyX3QgYSwgaW50MzJfdCYgZSkgew0KKyAgaWYgKGEgPT0gMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIHJldHVybiBtX2V4cFRhYmxlW21fbW9kdWx1cyAtIG1fbG9nVGFibGVbYV0gLSAxXTsNCit9DQoraW50MzJfdCBDQkNfUERGNDE3RUNNb2R1bHVzR0Y6Om11bHRpcGx5KGludDMyX3QgYSwgaW50MzJfdCBiKSB7DQorICBpZiAoYSA9PSAwIHx8IGIgPT0gMCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHJldHVybiBtX2V4cFRhYmxlWyhtX2xvZ1RhYmxlW2FdICsgbV9sb2dUYWJsZVtiXSkgJSAobV9tb2R1bHVzIC0gMSldOw0KK30NCitpbnQzMl90IENCQ19QREY0MTdFQ01vZHVsdXNHRjo6Z2V0U2l6ZSgpIHsNCisgIHJldHVybiBtX21vZHVsdXM7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ01vZHVsdXNHRi5oIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0VDTW9kdWx1c0dGLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJmZjc1MwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ01vZHVsdXNHRi5oCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUERGNDE3RUNNT0RVTFVTR0ZfSF8NCisjZGVmaW5lIF9CQ19QREY0MTdFQ01PRFVMVVNHRl9IXw0KK2NsYXNzIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5Ow0KK2NsYXNzIENCQ19QREY0MTdDb21tb247DQorY2xhc3MgQ0JDX1BERjQxN0VDTW9kdWx1c0dGIHsNCisgcHVibGljOg0KKyAgQ0JDX1BERjQxN0VDTW9kdWx1c0dGKGludDMyX3QgbW9kdWx1cywgaW50MzJfdCBnZW5lcmF0b3IsIGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCB+Q0JDX1BERjQxN0VDTW9kdWx1c0dGKCk7DQorICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgRmluYWxpemUoKTsNCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBnZXRaZXJvKCk7DQorICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogZ2V0T25lKCk7DQorICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogYnVpbGRNb25vbWlhbChpbnQzMl90IGRlZ3JlZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29lZmZpY2llbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIGludDMyX3QgYWRkKGludDMyX3QgYSwgaW50MzJfdCBiKTsNCisgIGludDMyX3Qgc3VidHJhY3QoaW50MzJfdCBhLCBpbnQzMl90IGIpOw0KKyAgaW50MzJfdCBleHAoaW50MzJfdCBhKTsNCisgIGludDMyX3QgbG9nKGludDMyX3QgYSwgaW50MzJfdCYgZSk7DQorICBpbnQzMl90IGludmVyc2UoaW50MzJfdCBhLCBpbnQzMl90JiBlKTsNCisgIGludDMyX3QgbXVsdGlwbHkoaW50MzJfdCBhLCBpbnQzMl90IGIpOw0KKyAgaW50MzJfdCBnZXRTaXplKCk7DQorICBzdGF0aWMgQ0JDX1BERjQxN0VDTW9kdWx1c0dGKiBQREY0MTdfR0Y7DQorDQorIHByaXZhdGU6DQorICBDRlhfSW50MzJBcnJheSBtX2V4cFRhYmxlOw0KKyAgQ0ZYX0ludDMyQXJyYXkgbV9sb2dUYWJsZTsNCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBtX3plcm87DQorICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogbV9vbmU7DQorICBpbnQzMl90IG1fbW9kdWx1czsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ01vZHVsdXNQb2x5LmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ01vZHVsdXNQb2x5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzQ5NzZkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0VDTW9kdWx1c1BvbHkuY3BwCkBAIC0wLDAgKzEsMzMxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDEyIFpYaW5nIGF1dGhvcnMNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAiQkNfUERGNDE3Q29tbW9uLmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0VDTW9kdWx1c0dGLmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0VDTW9kdWx1c1BvbHkuaCINCitDQkNfUERGNDE3RUNNb2R1bHVzUG9seTo6Q0JDX1BERjQxN0VDTW9kdWx1c1BvbHkoQ0JDX1BERjQxN0VDTW9kdWx1c0dGKiBmaWVsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkmIGNvZWZmaWNpZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGNvZWZmaWNpZW50cy5HZXRTaXplKCkgPT0gMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQorICB9DQorICBtX2ZpZWxkID0gZmllbGQ7DQorICBpbnQzMl90IGNvZWZmaWNpZW50c0xlbmd0aCA9IGNvZWZmaWNpZW50cy5HZXRTaXplKCk7DQorICBpZiAoY29lZmZpY2llbnRzTGVuZ3RoID4gMSAmJiBjb2VmZmljaWVudHNbMF0gPT0gMCkgew0KKyAgICBpbnQzMl90IGZpcnN0Tm9uWmVybyA9IDE7DQorICAgIHdoaWxlIChmaXJzdE5vblplcm8gPCBjb2VmZmljaWVudHNMZW5ndGggJiYNCisgICAgICAgICAgIGNvZWZmaWNpZW50c1tmaXJzdE5vblplcm9dID09IDApIHsNCisgICAgICBmaXJzdE5vblplcm8rKzsNCisgICAgfQ0KKyAgICBpZiAoZmlyc3ROb25aZXJvID09IGNvZWZmaWNpZW50c0xlbmd0aCkgew0KKyAgICAgIG1fY29lZmZpY2llbnRzID0gZmllbGQtPmdldFplcm8oKS0+bV9jb2VmZmljaWVudHM7DQorICAgIH0gZWxzZSB7DQorICAgICAgbV9jb2VmZmljaWVudHMuU2V0U2l6ZShjb2VmZmljaWVudHNMZW5ndGggLSBmaXJzdE5vblplcm8pOw0KKyAgICAgIGludDMyX3QgbCA9IDA7DQorICAgICAgZm9yIChpbnQzMl90IGkgPSBmaXJzdE5vblplcm87DQorICAgICAgICAgICBpIDwgZmlyc3ROb25aZXJvICsgbV9jb2VmZmljaWVudHMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIG1fY29lZmZpY2llbnRzLlNldEF0KGwsIGNvZWZmaWNpZW50cy5HZXRBdChpKSk7DQorICAgICAgICBsKys7DQorICAgICAgfQ0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBtX2NvZWZmaWNpZW50cy5Db3B5KGNvZWZmaWNpZW50cyk7DQorICB9DQorfQ0KK0NCQ19QREY0MTdFQ01vZHVsdXNQb2x5Ojp+Q0JDX1BERjQxN0VDTW9kdWx1c1BvbHkoKSB7fQ0KK0NGWF9JbnQzMkFycmF5JiBDQkNfUERGNDE3RUNNb2R1bHVzUG9seTo6Z2V0Q29lZmZpY2llbnRzKCkgew0KKyAgcmV0dXJuIG1fY29lZmZpY2llbnRzOw0KK30NCitDQkNfUERGNDE3RUNNb2R1bHVzR0YqIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5OjpnZXRGaWVsZCgpIHsNCisgIHJldHVybiBtX2ZpZWxkOw0KK30NCitpbnQzMl90IENCQ19QREY0MTdFQ01vZHVsdXNQb2x5OjpnZXREZWdyZWUoKSB7DQorICByZXR1cm4gbV9jb2VmZmljaWVudHMuR2V0U2l6ZSgpIC0gMTsNCit9DQorRlhfQk9PTCBDQkNfUERGNDE3RUNNb2R1bHVzUG9seTo6aXNaZXJvKCkgew0KKyAgcmV0dXJuIG1fY29lZmZpY2llbnRzWzBdID09IDA7DQorfQ0KK2ludDMyX3QgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHk6OmdldENvZWZmaWNpZW50KGludDMyX3QgZGVncmVlKSB7DQorICByZXR1cm4gbV9jb2VmZmljaWVudHNbbV9jb2VmZmljaWVudHMuR2V0U2l6ZSgpIC0gMSAtIGRlZ3JlZV07DQorfQ0KK2ludDMyX3QgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHk6OmV2YWx1YXRlQXQoaW50MzJfdCBhKSB7DQorICBpZiAoYSA9PSAwKSB7DQorICAgIHJldHVybiBnZXRDb2VmZmljaWVudCgwKTsNCisgIH0NCisgIGludDMyX3Qgc2l6ZSA9IG1fY29lZmZpY2llbnRzLkdldFNpemUoKTsNCisgIGlmIChhID09IDEpIHsNCisgICAgaW50MzJfdCByZXN1bHQgPSAwOw0KKyAgICBmb3IgKGludDMyX3QgbCA9IDA7IGwgPCBtX2NvZWZmaWNpZW50cy5HZXRTaXplKCk7IGwrKykgew0KKyAgICAgIGludDMyX3QgY29lZmZpY2llbnQgPSBtX2NvZWZmaWNpZW50cy5HZXRBdChsKTsNCisgICAgICByZXN1bHQgPSBtX2ZpZWxkLT5hZGQocmVzdWx0LCBjb2VmZmljaWVudCk7DQorICAgIH0NCisgICAgcmV0dXJuIHJlc3VsdDsNCisgIH0NCisgIGludDMyX3QgcmVzdWx0ID0gbV9jb2VmZmljaWVudHNbMF07DQorICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBzaXplOyBpKyspIHsNCisgICAgcmVzdWx0ID0gbV9maWVsZC0+YWRkKG1fZmllbGQtPm11bHRpcGx5KGEsIHJlc3VsdCksIG1fY29lZmZpY2llbnRzW2ldKTsNCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQorfQ0KK0NCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBDQkNfUERGNDE3RUNNb2R1bHVzUG9seTo6YWRkKA0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogb3RoZXIsDQorICAgIGludDMyX3QmIGUpIHsNCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBtb2R1bHVzUG9seSA9IE5VTEw7DQorICBpZiAoaXNaZXJvKCkpIHsNCisgICAgbW9kdWx1c1BvbHkgPSBuZXcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkob3RoZXItPmdldEZpZWxkKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLT5nZXRDb2VmZmljaWVudHMoKSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KKyAgfQ0KKyAgaWYgKG90aGVyLT5pc1plcm8oKSkgew0KKyAgICBtb2R1bHVzUG9seSA9IG5ldyBDQkNfUERGNDE3RUNNb2R1bHVzUG9seShtX2ZpZWxkLCBtX2NvZWZmaWNpZW50cywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KKyAgfQ0KKyAgQ0ZYX0ludDMyQXJyYXkgc21hbGxlckNvZWZmaWNpZW50czsNCisgIHNtYWxsZXJDb2VmZmljaWVudHMuQ29weShtX2NvZWZmaWNpZW50cyk7DQorICBDRlhfSW50MzJBcnJheSBsYXJnZXJDb2VmZmljaWVudHM7DQorICBsYXJnZXJDb2VmZmljaWVudHMuQ29weShvdGhlci0+bV9jb2VmZmljaWVudHMpOw0KKyAgaWYgKHNtYWxsZXJDb2VmZmljaWVudHMuR2V0U2l6ZSgpID4gbGFyZ2VyQ29lZmZpY2llbnRzLkdldFNpemUoKSkgew0KKyAgICBDRlhfSW50MzJBcnJheSB0ZW1wOw0KKyAgICB0ZW1wLkNvcHkoc21hbGxlckNvZWZmaWNpZW50cyk7DQorICAgIHNtYWxsZXJDb2VmZmljaWVudHMuQ29weShsYXJnZXJDb2VmZmljaWVudHMpOw0KKyAgICBsYXJnZXJDb2VmZmljaWVudHMuQ29weSh0ZW1wKTsNCisgIH0NCisgIENGWF9JbnQzMkFycmF5IHN1bURpZmY7DQorICBzdW1EaWZmLlNldFNpemUobGFyZ2VyQ29lZmZpY2llbnRzLkdldFNpemUoKSk7DQorICBpbnQzMl90IGxlbmd0aERpZmYgPQ0KKyAgICAgIGxhcmdlckNvZWZmaWNpZW50cy5HZXRTaXplKCkgLSBzbWFsbGVyQ29lZmZpY2llbnRzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBsID0gMDsgbCA8IGxlbmd0aERpZmY7IGwrKykgew0KKyAgICBzdW1EaWZmLlNldEF0KGwsIGxhcmdlckNvZWZmaWNpZW50cy5HZXRBdChsKSk7DQorICB9DQorICBmb3IgKGludDMyX3QgaSA9IGxlbmd0aERpZmY7IGkgPCBsYXJnZXJDb2VmZmljaWVudHMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgc3VtRGlmZltpXSA9IG1fZmllbGQtPmFkZChzbWFsbGVyQ29lZmZpY2llbnRzW2kgLSBsZW5ndGhEaWZmXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXJnZXJDb2VmZmljaWVudHNbaV0pOw0KKyAgfQ0KKyAgbW9kdWx1c1BvbHkgPSBuZXcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkobV9maWVsZCwgc3VtRGlmZiwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gbW9kdWx1c1BvbHk7DQorfQ0KK0NCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBDQkNfUERGNDE3RUNNb2R1bHVzUG9seTo6c3VidHJhY3QoDQorICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBvdGhlciwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG1vZHVsdXNQb2x5ID0gTlVMTDsNCisgIGlmIChvdGhlci0+aXNaZXJvKCkpIHsNCisgICAgbW9kdWx1c1BvbHkgPSBuZXcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkobV9maWVsZCwgbV9jb2VmZmljaWVudHMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIHJldHVybiBtb2R1bHVzUG9seTsNCisgIH0NCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBwb2x5ID0gb3RoZXItPm5lZ2F0aXZlKGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgbW9kdWx1c1BvbHkgPSBhZGQocG9seSwgZSk7DQorICBkZWxldGUgcG9seTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiBtb2R1bHVzUG9seTsNCit9DQorQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5OjptdWx0aXBseSgNCisgICAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG90aGVyLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogbW9kdWx1c1BvbHkgPSBOVUxMOw0KKyAgaWYgKGlzWmVybygpIHx8IG90aGVyLT5pc1plcm8oKSkgew0KKyAgICBtb2R1bHVzUG9seSA9DQorICAgICAgICBuZXcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkobV9maWVsZC0+Z2V0WmVybygpLT5nZXRGaWVsZCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZmllbGQtPmdldFplcm8oKS0+Z2V0Q29lZmZpY2llbnRzKCksIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIHJldHVybiBtb2R1bHVzUG9seTsNCisgIH0NCisgIENGWF9JbnQzMkFycmF5IGFDb2VmZmljaWVudHM7DQorICBhQ29lZmZpY2llbnRzLkNvcHkobV9jb2VmZmljaWVudHMpOw0KKyAgaW50MzJfdCBhTGVuZ3RoID0gYUNvZWZmaWNpZW50cy5HZXRTaXplKCk7DQorICBDRlhfSW50MzJBcnJheSBiQ29lZmZpY2llbnRzOw0KKyAgYkNvZWZmaWNpZW50cy5Db3B5KG90aGVyLT5tX2NvZWZmaWNpZW50cyk7DQorICBpbnQzMl90IGJMZW5ndGggPSBiQ29lZmZpY2llbnRzLkdldFNpemUoKTsNCisgIENGWF9JbnQzMkFycmF5IHByb2R1Y3Q7DQorICBwcm9kdWN0LlNldFNpemUoYUxlbmd0aCArIGJMZW5ndGggLSAxKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFMZW5ndGg7IGkrKykgew0KKyAgICBpbnQzMl90IGFDb2VmZiA9IGFDb2VmZmljaWVudHNbaV07DQorICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGJMZW5ndGg7IGorKykgew0KKyAgICAgIHByb2R1Y3RbaSArIGpdID0gbV9maWVsZC0+YWRkKA0KKyAgICAgICAgICBwcm9kdWN0W2kgKyBqXSwgbV9maWVsZC0+bXVsdGlwbHkoYUNvZWZmLCBiQ29lZmZpY2llbnRzW2pdKSk7DQorICAgIH0NCisgIH0NCisgIG1vZHVsdXNQb2x5ID0gbmV3IENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG1fZmllbGQsIHByb2R1Y3QsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KK30NCitDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHk6Om5lZ2F0aXZlKGludDMyX3QmIGUpIHsNCisgIGludDMyX3Qgc2l6ZSA9IG1fY29lZmZpY2llbnRzLkdldFNpemUoKTsNCisgIENGWF9JbnQzMkFycmF5IG5lZ2F0aXZlQ29lZmZpY2llbnRzOw0KKyAgbmVnYXRpdmVDb2VmZmljaWVudHMuU2V0U2l6ZShzaXplKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgew0KKyAgICBuZWdhdGl2ZUNvZWZmaWNpZW50c1tpXSA9IG1fZmllbGQtPnN1YnRyYWN0KDAsIG1fY29lZmZpY2llbnRzW2ldKTsNCisgIH0NCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBtb2R1bHVzUG9seSA9DQorICAgICAgbmV3IENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG1fZmllbGQsIG5lZ2F0aXZlQ29lZmZpY2llbnRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiBtb2R1bHVzUG9seTsNCit9DQorQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5OjptdWx0aXBseShpbnQzMl90IHNjYWxhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBtb2R1bHVzUG9seSA9IE5VTEw7DQorICBpZiAoc2NhbGFyID09IDApIHsNCisgICAgbW9kdWx1c1BvbHkgPQ0KKyAgICAgICAgbmV3IENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG1fZmllbGQtPmdldFplcm8oKS0+Z2V0RmllbGQoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZpZWxkLT5nZXRaZXJvKCktPmdldENvZWZmaWNpZW50cygpLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICByZXR1cm4gbW9kdWx1c1BvbHk7DQorICB9DQorICBpZiAoc2NhbGFyID09IDEpIHsNCisgICAgbW9kdWx1c1BvbHkgPSBuZXcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkobV9maWVsZCwgbV9jb2VmZmljaWVudHMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIHJldHVybiBtb2R1bHVzUG9seTsNCisgIH0NCisgIGludDMyX3Qgc2l6ZSA9IG1fY29lZmZpY2llbnRzLkdldFNpemUoKTsNCisgIENGWF9JbnQzMkFycmF5IHByb2R1Y3Q7DQorICBwcm9kdWN0LlNldFNpemUoc2l6ZSk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsNCisgICAgcHJvZHVjdFtpXSA9IG1fZmllbGQtPm11bHRpcGx5KG1fY29lZmZpY2llbnRzW2ldLCBzY2FsYXIpOw0KKyAgfQ0KKyAgbW9kdWx1c1BvbHkgPSBuZXcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkobV9maWVsZCwgcHJvZHVjdCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gbW9kdWx1c1BvbHk7DQorfQ0KK0NCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBDQkNfUERGNDE3RUNNb2R1bHVzUG9seTo6bXVsdGlwbHlCeU1vbm9taWFsKA0KKyAgICBpbnQzMl90IGRlZ3JlZSwNCisgICAgaW50MzJfdCBjb2VmZmljaWVudCwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGRlZ3JlZSA8IDApIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50Ow0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBtb2R1bHVzUG9seSA9IE5VTEw7DQorICBpZiAoY29lZmZpY2llbnQgPT0gMCkgew0KKyAgICBtb2R1bHVzUG9seSA9IG5ldyBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSgNCisgICAgICAgIG1fZmllbGQtPmdldFplcm8oKS0+bV9maWVsZCwgbV9maWVsZC0+Z2V0WmVybygpLT5tX2NvZWZmaWNpZW50cywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KKyAgfQ0KKyAgaW50MzJfdCBzaXplID0gbV9jb2VmZmljaWVudHMuR2V0U2l6ZSgpOw0KKyAgQ0ZYX0ludDMyQXJyYXkgcHJvZHVjdDsNCisgIHByb2R1Y3QuU2V0U2l6ZShzaXplICsgZGVncmVlKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgew0KKyAgICBwcm9kdWN0W2ldID0gbV9maWVsZC0+bXVsdGlwbHkobV9jb2VmZmljaWVudHNbaV0sIGNvZWZmaWNpZW50KTsNCisgIH0NCisgIG1vZHVsdXNQb2x5ID0gbmV3IENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KG1fZmllbGQsIHByb2R1Y3QsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIG1vZHVsdXNQb2x5Ow0KK30NCitDRlhfUHRyQXJyYXkqIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5OjpkaXZpZGUoQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG90aGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAob3RoZXItPmlzWmVybygpKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkRpdmlkZUJ5WmVybzsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogcXVvdGllbnQgPSBuZXcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkoDQorICAgICAgbV9maWVsZC0+Z2V0WmVybygpLT5tX2ZpZWxkLCBtX2ZpZWxkLT5nZXRaZXJvKCktPm1fY29lZmZpY2llbnRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiByZW1haW5kZXIgPQ0KKyAgICAgIG5ldyBDQkNfUERGNDE3RUNNb2R1bHVzUG9seShtX2ZpZWxkLCBtX2NvZWZmaWNpZW50cywgZSk7DQorICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgIGRlbGV0ZSBxdW90aWVudDsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpbnQzMl90IGRlbm9taW5hdG9yTGVhZGluZ1Rlcm0gPSBvdGhlci0+Z2V0Q29lZmZpY2llbnQob3RoZXItPmdldERlZ3JlZSgpKTsNCisgIGludDMyX3QgaW52ZXJzZURlbm9taW5hdG9yTGVhZGluZ1Rlcm0gPQ0KKyAgICAgIG1fZmllbGQtPmludmVyc2UoZGVub21pbmF0b3JMZWFkaW5nVGVybSwgZSk7DQorICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgIGRlbGV0ZSBxdW90aWVudDsNCisgICAgZGVsZXRlIHJlbWFpbmRlcjsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICB3aGlsZSAocmVtYWluZGVyLT5nZXREZWdyZWUoKSA+PSBvdGhlci0+Z2V0RGVncmVlKCkgJiYgIXJlbWFpbmRlci0+aXNaZXJvKCkpIHsNCisgICAgaW50MzJfdCBkZWdyZWVEaWZmZXJlbmNlID0gcmVtYWluZGVyLT5nZXREZWdyZWUoKSAtIG90aGVyLT5nZXREZWdyZWUoKTsNCisgICAgaW50MzJfdCBzY2FsZSA9DQorICAgICAgICBtX2ZpZWxkLT5tdWx0aXBseShyZW1haW5kZXItPmdldENvZWZmaWNpZW50KHJlbWFpbmRlci0+Z2V0RGVncmVlKCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW52ZXJzZURlbm9taW5hdG9yTGVhZGluZ1Rlcm0pOw0KKyAgICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogdGVybSA9DQorICAgICAgICBvdGhlci0+bXVsdGlwbHlCeU1vbm9taWFsKGRlZ3JlZURpZmZlcmVuY2UsIHNjYWxlLCBlKTsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgIGRlbGV0ZSBxdW90aWVudDsNCisgICAgICBkZWxldGUgcmVtYWluZGVyOw0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBpdGVyYXRpb25RdW90aWVudCA9DQorICAgICAgICBtX2ZpZWxkLT5idWlsZE1vbm9taWFsKGRlZ3JlZURpZmZlcmVuY2UsIHNjYWxlLCBlKTsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgIGRlbGV0ZSBxdW90aWVudDsNCisgICAgICBkZWxldGUgcmVtYWluZGVyOw0KKyAgICAgIGRlbGV0ZSB0ZXJtOw0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiB0ZW1wID0gcXVvdGllbnQ7DQorICAgIHF1b3RpZW50ID0gdGVtcC0+YWRkKGl0ZXJhdGlvblF1b3RpZW50LCBlKTsNCisgICAgZGVsZXRlIGl0ZXJhdGlvblF1b3RpZW50Ow0KKyAgICBkZWxldGUgdGVtcDsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgIGRlbGV0ZSByZW1haW5kZXI7DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgdGVtcCA9IHJlbWFpbmRlcjsNCisgICAgcmVtYWluZGVyID0gdGVtcC0+c3VidHJhY3QodGVybSwgZSk7DQorICAgIGRlbGV0ZSB0ZXJtOw0KKyAgICBkZWxldGUgdGVtcDsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgIGRlbGV0ZSBxdW90aWVudDsNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgfQ0KKyAgQ0ZYX1B0ckFycmF5KiBtb2R1bHVzUG9seSA9IG5ldyBDRlhfUHRyQXJyYXk7DQorICBtb2R1bHVzUG9seS0+QWRkKHF1b3RpZW50KTsNCisgIG1vZHVsdXNQb2x5LT5BZGQocmVtYWluZGVyKTsNCisgIHJldHVybiBtb2R1bHVzUG9seTsNCit9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHk6OnRvU3RyaW5nKCkgew0KKyAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0Ow0KKyAgZm9yIChpbnQzMl90IGRlZ3JlZSA9IGdldERlZ3JlZSgpOyBkZWdyZWUgPj0gMDsgZGVncmVlLS0pIHsNCisgICAgaW50MzJfdCBjb2VmZmljaWVudCA9IGdldENvZWZmaWNpZW50KGRlZ3JlZSk7DQorICAgIGlmIChjb2VmZmljaWVudCAhPSAwKSB7DQorICAgICAgaWYgKGNvZWZmaWNpZW50IDwgMCkgew0KKyAgICAgICAgcmVzdWx0ICs9ICIgLSAiOw0KKyAgICAgICAgY29lZmZpY2llbnQgPSAtY29lZmZpY2llbnQ7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChyZXN1bHQuR2V0TGVuZ3RoKCkgPiAwKSB7DQorICAgICAgICAgIHJlc3VsdCArPSAiICsgIjsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgaWYgKGRlZ3JlZSA9PSAwIHx8IGNvZWZmaWNpZW50ICE9IDEpIHsNCisgICAgICAgIHJlc3VsdCArPSBjb2VmZmljaWVudDsNCisgICAgICB9DQorICAgICAgaWYgKGRlZ3JlZSAhPSAwKSB7DQorICAgICAgICBpZiAoZGVncmVlID09IDEpIHsNCisgICAgICAgICAgcmVzdWx0ICs9ICd4JzsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHJlc3VsdCArPSAieF4iOw0KKyAgICAgICAgICByZXN1bHQgKz0gZGVncmVlOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHJlc3VsdDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0VDTW9kdWx1c1BvbHkuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ01vZHVsdXNQb2x5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyMjVhOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFQ01vZHVsdXNQb2x5LmgKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19QREY0MTdFQ01PRFVMVVNQT0xZX0hfDQorI2RlZmluZSBfQkNfUERGNDE3RUNNT0RVTFVTUE9MWV9IXw0KK2NsYXNzIENCQ19QREY0MTdFQ01vZHVsdXNHRjsNCitjbGFzcyBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSB7DQorIHB1YmxpYzoNCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KENCQ19QREY0MTdFQ01vZHVsdXNHRiogZmllbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSYgY29lZmZpY2llbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICB2aXJ0dWFsIH5DQkNfUERGNDE3RUNNb2R1bHVzUG9seSgpOw0KKyAgQ0ZYX0ludDMyQXJyYXkmIGdldENvZWZmaWNpZW50cygpOw0KKyAgQ0JDX1BERjQxN0VDTW9kdWx1c0dGKiBnZXRGaWVsZCgpOw0KKyAgaW50MzJfdCBnZXREZWdyZWUoKTsNCisgIEZYX0JPT0wgaXNaZXJvKCk7DQorICBpbnQzMl90IGdldENvZWZmaWNpZW50KGludDMyX3QgZGVncmVlKTsNCisgIGludDMyX3QgZXZhbHVhdGVBdChpbnQzMl90IGEpOw0KKyAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIGFkZChDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogb3RoZXIsIGludDMyX3QmIGUpOw0KKyAgQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIHN1YnRyYWN0KENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBvdGhlciwgaW50MzJfdCYgZSk7DQorICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogbXVsdGlwbHkoQ0JDX1BERjQxN0VDTW9kdWx1c1BvbHkqIG90aGVyLCBpbnQzMl90JiBlKTsNCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBuZWdhdGl2ZShpbnQzMl90JiBlKTsNCisgIENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBtdWx0aXBseShpbnQzMl90IHNjYWxhciwgaW50MzJfdCYgZSk7DQorICBDQkNfUERGNDE3RUNNb2R1bHVzUG9seSogbXVsdGlwbHlCeU1vbm9taWFsKGludDMyX3QgZGVncmVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZWZmaWNpZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIENGWF9QdHJBcnJheSogZGl2aWRlKENCQ19QREY0MTdFQ01vZHVsdXNQb2x5KiBvdGhlciwgaW50MzJfdCYgZSk7DQorICBDRlhfQnl0ZVN0cmluZyB0b1N0cmluZygpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ0JDX1BERjQxN0VDTW9kdWx1c0dGKiBtX2ZpZWxkOw0KKyAgQ0ZYX0ludDMyQXJyYXkgbV9jb2VmZmljaWVudHM7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFcnJvckNvcnJlY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YTA3M2YKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uLmNwcApAQCAtMCwwICsxLDE2MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwNiBKZXJlbWlhcyBNYWVya2kgaW4gcGFydCwgYW5kIFpYaW5nIEF1dGhvcnMgaW4gcGFydA0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAiQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uLmgiDQoraW50MzJfdCBDQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uOjpFQ19DT0VGRklDSUVOVFNbXVsyNTAwXSA9IHsNCisgICAgezI3LCA5MTd9LA0KKyAgICB7NTIyLCA1NjgsIDcyMywgODA5fSwNCisgICAgezIzNywgMzA4LCA0MzYsIDI4NCwgNjQ2LCA2NTMsIDQyOCwgMzc5fSwNCisgICAgezI3NCwgNTYyLCAyMzIsIDc1NSwgNTk5LCA1MjQsIDgwMSwgMTMyLCAyOTUsIDExNiwgNDQyLCA0MjgsIDI5NSwgNDIsIDE3NiwNCisgICAgIDY1fSwNCisgICAgezM2MSwgNTc1LCA5MjIsIDUyNSwgMTc2LCA1ODYsIDY0MCwgMzIxLCA1MzYsIDc0MiwgNjc3LCA3NDIsIDY4NywgMjg0LCAxOTMsDQorICAgICA1MTcsIDI3MywgNDk0LCAyNjMsIDE0NywgNTkzLCA4MDAsIDU3MSwgMzIwLCA4MDMsIDEzMywgMjMxLCAzOTAsIDY4NSwgMzMwLA0KKyAgICAgNjMsIDQxMH0sDQorICAgIHs1MzksIDQyMiwgNiwgOTMsIDg2MiwgNzcxLCA0NTMsIDEwNiwgNjEwLCAyODcsIDEwNywgNTA1LCA3MzMsIDg3NywgMzgxLA0KKyAgICAgNjEyLCA3MjMsIDQ3NiwgNDYyLCAxNzIsIDQzMCwgNjA5LCA4NTgsIDgyMiwgNTQzLCAzNzYsIDUxMSwgNDAwLCA2NzIsIDc2MiwNCisgICAgIDI4MywgMTg0LCA0NDAsIDM1LCA1MTksIDMxLCA0NjAsIDU5NCwgMjI1LCA1MzUsIDUxNywgMzUyLCA2MDUsIDE1OCwgNjUxLA0KKyAgICAgMjAxLCA0ODgsIDUwMiwgNjQ4LCA3MzMsIDcxNywgODMsIDQwNCwgOTcsIDI4MCwgNzcxLCA4NDAsIDYyOSwgNCwgMzgxLCA4NDMsDQorICAgICA2MjMsIDI2NCwgNTQzfSwNCisgICAgezUyMSwgMzEwLCA4NjQsIDU0NywgODU4LCA1ODAsIDI5NiwgMzc5LCA1MywgNzc5LCA4OTcsIDQ0NCwgNDAwLCA5MjUsIDc0OSwNCisgICAgIDQxNSwgODIyLCA5MywgMjE3LCAyMDgsIDkyOCwgMjQ0LCA1ODMsIDYyMCwgMjQ2LCAxNDgsIDQ0NywgNjMxLCAyOTIsIDkwOCwNCisgICAgIDQ5MCwgNzA0LCA1MTYsIDI1OCwgNDU3LCA5MDcsIDU5NCwgNzIzLCA2NzQsIDI5MiwgMjcyLCA5NiwgNjg0LCA0MzIsIDY4NiwNCisgICAgIDYwNiwgODYwLCA1NjksIDE5MywgMjE5LCAxMjksIDE4NiwgMjM2LCAyODcsIDE5MiwgNzc1LCAyNzgsIDE3MywgNDAsIDM3OSwNCisgICAgIDcxMiwgNDYzLCA2NDYsIDc3NiwgMTcxLCA0OTEsIDI5NywgNzYzLCAxNTYsIDczMiwgOTUsIDI3MCwgNDQ3LCA5MCwgNTA3LA0KKyAgICAgNDgsIDIyOCwgODIxLCA4MDgsIDg5OCwgNzg0LCA2NjMsIDYyNywgMzc4LCAzODIsIDI2MiwgMzgwLCA2MDIsIDc1NCwgMzM2LA0KKyAgICAgODksIDYxNCwgODcsIDQzMiwgNjcwLCA2MTYsIDE1NywgMzc0LCAyNDIsIDcyNiwgNjAwLCAyNjksIDM3NSwgODk4LCA4NDUsDQorICAgICA0NTQsIDM1NCwgMTMwLCA4MTQsIDU4NywgODA0LCAzNCwgMjExLCAzMzAsIDUzOSwgMjk3LCA4MjcsIDg2NSwgMzcsIDUxNywNCisgICAgIDgzNCwgMzE1LCA1NTAsIDg2LCA4MDEsIDQsIDEwOCwgNTM5fSwNCisgICAgezUyNCwgODk0LCA3NSwgNzY2LCA4ODIsIDg1NywgNzQsIDIwNCwgODIsIDU4NiwgNzA4LCAyNTAsIDkwNSwgNzg2LCAxMzgsDQorICAgICA3MjAsIDg1OCwgMTk0LCAzMTEsIDkxMywgMjc1LCAxOTAsIDM3NSwgODUwLCA0MzgsIDczMywgMTk0LCAyODAsIDIwMSwgMjgwLA0KKyAgICAgODI4LCA3NTcsIDcxMCwgODE0LCA5MTksIDg5LCA2OCwgNTY5LCAxMSwgMjA0LCA3OTYsIDYwNSwgNTQwLCA5MTMsIDgwMSwNCisgICAgIDcwMCwgNzk5LCAxMzcsIDQzOSwgNDE4LCA1OTIsIDY2OCwgMzUzLCA4NTksIDM3MCwgNjk0LCAzMjUsIDI0MCwgMjE2LCAyNTcsDQorICAgICAyODQsIDU0OSwgMjA5LCA4ODQsIDMxNSwgNzAsIDMyOSwgNzkzLCA0OTAsIDI3NCwgODc3LCAxNjIsIDc0OSwgODEyLCA2ODQsDQorICAgICA0NjEsIDMzNCwgMzc2LCA4NDksIDUyMSwgMzA3LCAyOTEsIDgwMywgNzEyLCAxOSwgMzU4LCAzOTksIDkwOCwgMTAzLCA1MTEsDQorICAgICA1MSwgOCwgNTE3LCAyMjUsIDI4OSwgNDcwLCA2MzcsIDczMSwgNjYsIDI1NSwgOTE3LCAyNjksIDQ2MywgODMwLCA3MzAsIDQzMywNCisgICAgIDg0OCwgNTg1LCAxMzYsIDUzOCwgOTA2LCA5MCwgMiwgMjkwLCA3NDMsIDE5OSwgNjU1LCA5MDMsIDMyOSwgNDksIDgwMiwgNTgwLA0KKyAgICAgMzU1LCA1ODgsIDE4OCwgNDYyLCAxMCwgMTM0LCA2MjgsIDMyMCwgNDc5LCAxMzAsIDczOSwgNzEsIDI2MywgMzE4LCAzNzQsDQorICAgICA2MDEsIDE5MiwgNjA1LCAxNDIsIDY3MywgNjg3LCAyMzQsIDcyMiwgMzg0LCAxNzcsIDc1MiwgNjA3LCA2NDAsIDQ1NSwgMTkzLA0KKyAgICAgNjg5LCA3MDcsIDgwNSwgNjQxLCA0OCwgNjAsIDczMiwgNjIxLCA4OTUsIDU0NCwgMjYxLCA4NTIsIDY1NSwgMzA5LCA2OTcsDQorICAgICA3NTUsIDc1NiwgNjAsIDIzMSwgNzczLCA0MzQsIDQyMSwgNzI2LCA1MjgsIDUwMywgMTE4LCA0OSwgNzk1LCAzMiwgMTQ0LA0KKyAgICAgNTAwLCAyMzgsIDgzNiwgMzk0LCAyODAsIDU2NiwgMzE5LCA5LCA2NDcsIDU1MCwgNzMsIDkxNCwgMzQyLCAxMjYsIDMyLCA2ODEsDQorICAgICAzMzEsIDc5MiwgNjIwLCA2MCwgNjA5LCA0NDEsIDE4MCwgNzkxLCA4OTMsIDc1NCwgNjA1LCAzODMsIDIyOCwgNzQ5LCA3NjAsDQorICAgICAyMTMsIDU0LCAyOTcsIDEzNCwgNTQsIDgzNCwgMjk5LCA5MjIsIDE5MSwgOTEwLCA1MzIsIDYwOSwgODI5LCAxODksIDIwLA0KKyAgICAgMTY3LCAyOSwgODcyLCA0NDksIDgzLCA0MDIsIDQxLCA2NTYsIDUwNSwgNTc5LCA0ODEsIDE3MywgNDA0LCAyNTEsIDY4OCwgOTUsDQorICAgICA0OTcsIDU1NSwgNjQyLCA1NDMsIDMwNywgMTU5LCA5MjQsIDU1OCwgNjQ4LCA1NSwgNDk3LCAxMH0sDQorICAgIHszNTIsIDc3LCAzNzMsIDUwNCwgMzUsIDU5OSwgNDI4LCAyMDcsIDQwOSwgNTc0LCAxMTgsIDQ5OCwgMjg1LCAzODAsIDM1MCwNCisgICAgIDQ5MiwgMTk3LCAyNjUsIDkyMCwgMTU1LCA5MTQsIDI5OSwgMjI5LCA2NDMsIDI5NCwgODcxLCAzMDYsIDg4LCA4NywgMTkzLA0KKyAgICAgMzUyLCA3ODEsIDg0NiwgNzUsIDMyNywgNTIwLCA0MzUsIDU0MywgMjAzLCA2NjYsIDI0OSwgMzQ2LCA3ODEsIDYyMSwgNjQwLA0KKyAgICAgMjY4LCA3OTQsIDUzNCwgNTM5LCA3ODEsIDQwOCwgMzkwLCA2NDQsIDEwMiwgNDc2LCA0OTksIDI5MCwgNjMyLCA1NDUsIDM3LA0KKyAgICAgODU4LCA5MTYsIDU1MiwgNDEsIDU0MiwgMjg5LCAxMjIsIDI3MiwgMzgzLCA4MDAsIDQ4NSwgOTgsIDc1MiwgNDcyLCA3NjEsDQorICAgICAxMDcsIDc4NCwgODYwLCA2NTgsIDc0MSwgMjkwLCAyMDQsIDY4MSwgNDA3LCA4NTUsIDg1LCA5OSwgNjIsIDQ4MiwgMTgwLCAyMCwNCisgICAgIDI5NywgNDUxLCA1OTMsIDkxMywgMTQyLCA4MDgsIDY4NCwgMjg3LCA1MzYsIDU2MSwgNzYsIDY1MywgODk5LCA3MjksIDU2NywNCisgICAgIDc0NCwgMzkwLCA1MTMsIDE5MiwgNTE2LCAyNTgsIDI0MCwgNTE4LCA3OTQsIDM5NSwgNzY4LCA4NDgsIDUxLCA2MTAsIDM4NCwNCisgICAgIDE2OCwgMTkwLCA4MjYsIDMyOCwgNTk2LCA3ODYsIDMwMywgNTcwLCAzODEsIDQxNSwgNjQxLCAxNTYsIDIzNywgMTUxLCA0MjksDQorICAgICA1MzEsIDIwNywgNjc2LCA3MTAsIDg5LCAxNjgsIDMwNCwgNDAyLCA0MCwgNzA4LCA1NzUsIDE2MiwgODY0LCAyMjksIDY1LA0KKyAgICAgODYxLCA4NDEsIDUxMiwgMTY0LCA0NzcsIDIyMSwgOTIsIDM1OCwgNzg1LCAyODgsIDM1NywgODUwLCA4MzYsIDgyNywgNzM2LA0KKyAgICAgNzA3LCA5NCwgOCwgNDk0LCAxMTQsIDUyMSwgMiwgNDk5LCA4NTEsIDU0MywgMTUyLCA3MjksIDc3MSwgOTUsIDI0OCwgMzYxLA0KKyAgICAgNTc4LCAzMjMsIDg1NiwgNzk3LCAyODksIDUxLCA2ODQsIDQ2NiwgNTMzLCA4MjAsIDY2OSwgNDUsIDkwMiwgNDUyLCAxNjcsDQorICAgICAzNDIsIDI0NCwgMTczLCAzNSwgNDYzLCA2NTEsIDUxLCA2OTksIDU5MSwgNDUyLCA1NzgsIDM3LCAxMjQsIDI5OCwgMzMyLA0KKyAgICAgNTUyLCA0MywgNDI3LCAxMTksIDY2MiwgNzc3LCA0NzUsIDg1MCwgNzY0LCAzNjQsIDU3OCwgOTExLCAyODMsIDcxMSwgNDcyLA0KKyAgICAgNDIwLCAyNDUsIDI4OCwgNTk0LCAzOTQsIDUxMSwgMzI3LCA1ODksIDc3NywgNjk5LCA2ODgsIDQzLCA0MDgsIDg0MiwgMzgzLA0KKyAgICAgNzIxLCA1MjEsIDU2MCwgNjQ0LCA3MTQsIDU1OSwgNjIsIDE0NSwgODczLCA2NjMsIDcxMywgMTU5LCA2NzIsIDcyOSwgNjI0LA0KKyAgICAgNTksIDE5MywgNDE3LCAxNTgsIDIwOSwgNTYzLCA1NjQsIDM0MywgNjkzLCAxMDksIDYwOCwgNTYzLCAzNjUsIDE4MSwgNzcyLA0KKyAgICAgNjc3LCAzMTAsIDI0OCwgMzUzLCA3MDgsIDQxMCwgNTc5LCA4NzAsIDYxNywgODQxLCA2MzIsIDg2MCwgMjg5LCA1MzYsIDM1LA0KKyAgICAgNzc3LCA2MTgsIDU4NiwgNDI0LCA4MzMsIDc3LCA1OTcsIDM0NiwgMjY5LCA3NTcsIDYzMiwgNjk1LCA3NTEsIDMzMSwgMjQ3LA0KKyAgICAgMTg0LCA0NSwgNzg3LCA2ODAsIDE4LCA2NiwgNDA3LCAzNjksIDU0LCA0OTIsIDIyOCwgNjEzLCA4MzAsIDkyMiwgNDM3LCA1MTksDQorICAgICA2NDQsIDkwNSwgNzg5LCA0MjAsIDMwNSwgNDQxLCAyMDcsIDMwMCwgODkyLCA4MjcsIDE0MSwgNTM3LCAzODEsIDY2MiwgNTEzLA0KKyAgICAgNTYsIDI1MiwgMzQxLCAyNDIsIDc5NywgODM4LCA4MzcsIDcyMCwgMjI0LCAzMDcsIDYzMSwgNjEsIDg3LCA1NjAsIDMxMCwNCisgICAgIDc1NiwgNjY1LCAzOTcsIDgwOCwgODUxLCAzMDksIDQ3MywgNzk1LCAzNzgsIDMxLCA2NDcsIDkxNSwgNDU5LCA4MDYsIDU5MCwNCisgICAgIDczMSwgNDI1LCAyMTYsIDU0OCwgMjQ5LCAzMjEsIDg4MSwgNjk5LCA1MzUsIDY3MywgNzgyLCAyMTAsIDgxNSwgOTA1LCAzMDMsDQorICAgICA4NDMsIDkyMiwgMjgxLCA3MywgNDY5LCA3OTEsIDY2MCwgMTYyLCA0OTgsIDMwOCwgMTU1LCA0MjIsIDkwNywgODE3LCAxODcsDQorICAgICA2MiwgMTYsIDQyNSwgNTM1LCAzMzYsIDI4NiwgNDM3LCAzNzUsIDI3MywgNjEwLCAyOTYsIDE4MywgOTIzLCAxMTYsIDY2NywNCisgICAgIDc1MSwgMzUzLCA2MiwgMzY2LCA2OTEsIDM3OSwgNjg3LCA4NDIsIDM3LCAzNTcsIDcyMCwgNzQyLCAzMzAsIDUsIDM5LCA5MjMsDQorICAgICAzMTEsIDQyNCwgMjQyLCA3NDksIDMyMSwgNTQsIDY2OSwgMzE2LCAzNDIsIDI5OSwgNTM0LCAxMDUsIDY2NywgNDg4LCA2NDAsDQorICAgICA2NzIsIDU3NiwgNTQwLCAzMTYsIDQ4NiwgNzIxLCA2MTAsIDQ2LCA2NTYsIDQ0NywgMTcxLCA2MTYsIDQ2NCwgMTkwLCA1MzEsDQorICAgICAyOTcsIDMyMSwgNzYyLCA3NTIsIDUzMywgMTc1LCAxMzQsIDE0LCAzODEsIDQzMywgNzE3LCA0NSwgMTExLCAyMCwgNTk2LA0KKyAgICAgMjg0LCA3MzYsIDEzOCwgNjQ2LCA0MTEsIDg3NywgNjY5LCAxNDEsIDkxOSwgNDUsIDc4MCwgNDA3LCAxNjQsIDMzMiwgODk5LA0KKyAgICAgMTY1LCA3MjYsIDYwMCwgMzI1LCA0OTgsIDY1NSwgMzU3LCA3NTIsIDc2OCwgMjIzLCA4NDksIDY0NywgNjMsIDMxMCwgODYzLA0KKyAgICAgMjUxLCAzNjYsIDMwNCwgMjgyLCA3MzgsIDY3NSwgNDEwLCAzODksIDI0NCwgMzEsIDEyMSwgMzAzLCAyNjN9fTsNCitDQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uOjpDQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uKCkge30NCitDQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uOjp+Q0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbigpIHt9DQoraW50MzJfdCBDQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uOjpnZXRFcnJvckNvcnJlY3Rpb25Db2Rld29yZENvdW50KA0KKyAgICBpbnQzMl90IGVycm9yQ29ycmVjdGlvbkxldmVsLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoZXJyb3JDb3JyZWN0aW9uTGV2ZWwgPCAwIHx8IGVycm9yQ29ycmVjdGlvbkxldmVsID4gOCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25FcnJvckNvcnJlY3Rpb25MZXZlbE11c3RCZUJldHdlZW4wQW5kODsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgcmV0dXJuIDEgPDwgKGVycm9yQ29ycmVjdGlvbkxldmVsICsgMSk7DQorfQ0KK2ludDMyX3QgQ0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbjo6Z2V0UmVjb21tZW5kZWRNaW5pbXVtRXJyb3JDb3JyZWN0aW9uTGV2ZWwoDQorICAgIGludDMyX3QgbiwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKG4gPD0gMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnRuTXVzdEJlQWJvdmUwOw0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBpZiAobiA8PSA0MCkgew0KKyAgICByZXR1cm4gMjsNCisgIH0NCisgIGlmIChuIDw9IDE2MCkgew0KKyAgICByZXR1cm4gMzsNCisgIH0NCisgIGlmIChuIDw9IDMyMCkgew0KKyAgICByZXR1cm4gNDsNCisgIH0NCisgIGlmIChuIDw9IDg2Mykgew0KKyAgICByZXR1cm4gNTsNCisgIH0NCisgIGUgPSBCQ0V4Y2VwdGlvbk5vUmVjb21tZW5kYXRpb25Qb3NzaWJsZTsNCisgIHJldHVybiAtMTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbjo6Z2VuZXJhdGVFcnJvckNvcnJlY3Rpb24oDQorICAgIENGWF9XaWRlU3RyaW5nIGRhdGFDb2Rld29yZHMsDQorICAgIGludDMyX3QgZXJyb3JDb3JyZWN0aW9uTGV2ZWwsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3QgayA9IGdldEVycm9yQ29ycmVjdGlvbkNvZGV3b3JkQ291bnQoZXJyb3JDb3JyZWN0aW9uTGV2ZWwsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIChGWF9XQ0hBUiknICcpOw0KKyAgRlhfV0NIQVIqIGVjaCA9IEZYX0FsbG9jKEZYX1dDSEFSLCBrKTsNCisgIEZYU1lTX21lbXNldChlY2gsIDAsIGsgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgIGludDMyX3Qgc2xkID0gZGF0YUNvZGV3b3Jkcy5HZXRMZW5ndGgoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNsZDsgaSsrKSB7DQorICAgIGludDMyX3QgdDEgPSAoZGF0YUNvZGV3b3Jkcy5HZXRBdChpKSArIGVjaFtrIC0gMV0pICUgOTI5Ow0KKyAgICBpbnQzMl90IHQyOw0KKyAgICBpbnQzMl90IHQzOw0KKyAgICBmb3IgKGludDMyX3QgaiA9IGsgLSAxOyBqID49IDE7IGotLSkgew0KKyAgICAgIHQyID0gKHQxICogRUNfQ09FRkZJQ0lFTlRTW2Vycm9yQ29ycmVjdGlvbkxldmVsXVtqXSkgJSA5Mjk7DQorICAgICAgdDMgPSA5MjkgLSB0MjsNCisgICAgICBlY2hbal0gPSAoRlhfV0NIQVIpKChlY2hbaiAtIDFdICsgdDMpICUgOTI5KTsNCisgICAgfQ0KKyAgICB0MiA9ICh0MSAqIEVDX0NPRUZGSUNJRU5UU1tlcnJvckNvcnJlY3Rpb25MZXZlbF1bMF0pICUgOTI5Ow0KKyAgICB0MyA9IDkyOSAtIHQyOw0KKyAgICBlY2hbMF0gPSAoRlhfV0NIQVIpKHQzICUgOTI5KTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHNiOw0KKyAgZm9yIChpbnQzMl90IGogPSBrIC0gMTsgaiA+PSAwOyBqLS0pIHsNCisgICAgaWYgKGVjaFtqXSAhPSAwKSB7DQorICAgICAgZWNoW2pdID0gKEZYX1dDSEFSKSg5MjkgLSBlY2hbal0pOw0KKyAgICB9DQorICAgIHNiICs9IChGWF9XQ0hBUillY2hbal07DQorICB9DQorICBGWF9GcmVlKGVjaCk7DQorICByZXR1cm4gc2I7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFcnJvckNvcnJlY3Rpb24uaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFcnJvckNvcnJlY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDU5NGQ2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbi5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUERGNDE3RVJST1JDT1JSRUNUSU9OX0hfDQorI2RlZmluZSBfQkNfUERGNDE3RVJST1JDT1JSRUNUSU9OX0hfDQorY2xhc3MgQ0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbiB7DQorIHB1YmxpYzoNCisgIENCQ19QREY0MTdFcnJvckNvcnJlY3Rpb24oKTsNCisgIHZpcnR1YWwgfkNCQ19QREY0MTdFcnJvckNvcnJlY3Rpb24oKTsNCisgIHN0YXRpYyBpbnQzMl90IGdldEVycm9yQ29ycmVjdGlvbkNvZGV3b3JkQ291bnQoaW50MzJfdCBlcnJvckNvcnJlY3Rpb25MZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgaW50MzJfdCBnZXRSZWNvbW1lbmRlZE1pbmltdW1FcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IG4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBDRlhfV2lkZVN0cmluZyBnZW5lcmF0ZUVycm9yQ29ycmVjdGlvbihDRlhfV2lkZVN0cmluZyBkYXRhQ29kZXdvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXJyb3JDb3JyZWN0aW9uTGV2ZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorDQorIHByaXZhdGU6DQorICBzdGF0aWMgaW50MzJfdCBFQ19DT0VGRklDSUVOVFNbXVsyNTAwXTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmNlZTZmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXIuY3BwCkBAIC0wLDAgKzEsNDI4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDA2IEplcmVtaWFzIE1hZXJraSBpbiBwYXJ0LCBhbmQgWlhpbmcgQXV0aG9ycyBpbiBwYXJ0DQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAiQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlci5oIg0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19VdGlsQ29kaW5nQ29udmVydC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0NvbXBhY3Rpb24uaCINCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmlnaW50L0JpZ0ludGVnZXJMaWJyYXJ5LmhoIg0KKw0KKyNkZWZpbmUgU1VCTU9ERV9BTFBIQSAwDQorI2RlZmluZSBTVUJNT0RFX0xPV0VSIDENCisjZGVmaW5lIFNVQk1PREVfTUlYRUQgMg0KK2ludDMyX3QgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OlRFWFRfQ09NUEFDVElPTiA9IDA7DQoraW50MzJfdCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6QllURV9DT01QQUNUSU9OID0gMTsNCitpbnQzMl90IENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpOVU1FUklDX0NPTVBBQ1RJT04gPSAyOw0KK2ludDMyX3QgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OlNVQk1PREVfUFVOQ1RVQVRJT04gPSAzOw0KK2ludDMyX3QgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkxBVENIX1RPX1RFWFQgPSA5MDA7DQoraW50MzJfdCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fQllURV9QQURERUQgPSA5MDE7DQoraW50MzJfdCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fTlVNRVJJQyA9IDkwMjsNCitpbnQzMl90IENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpTSElGVF9UT19CWVRFID0gOTEzOw0KK2ludDMyX3QgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkxBVENIX1RPX0JZVEUgPSA5MjQ7DQordWludDhfdCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6VEVYVF9NSVhFRF9SQVdbXSA9IHsNCisgICAgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDM4LCAxMywgOSwgNDQsIDU4LA0KKyAgICAzNSwgNDUsIDQ2LCAzNiwgNDcsIDQzLCAzNywgNDIsIDYxLCA5NCwgMCwgIDMyLCAwLCAwLCAgMH07DQordWludDhfdCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6VEVYVF9QVU5DVFVBVElPTl9SQVdbXSA9IHsNCisgICAgNTksIDYwLCA2MiwgNjQsIDkxLCA5MiwgOTMsICA5NSwgOTYsIDEyNiwgMzMsIDEzLCAgOSwgICA0NCwgNTgsDQorICAgIDEwLCA0NSwgNDYsIDM2LCA0NywgMzQsIDEyNCwgNDIsIDQwLCA0MSwgIDYzLCAxMjMsIDEyNSwgMzksIDB9Ow0KK2ludDMyX3QgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6Ok1JWEVEWzEyOF0gPSB7MH07DQoraW50MzJfdCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6UFVOQ1RVQVRJT05bMTI4XSA9IHswfTsNCit2b2lkIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpJbml0aWFsaXplKCkgew0KKyAgSW52ZXJzZSgpOw0KK30NCit2b2lkIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpGaW5hbGl6ZSgpIHt9DQorQ0ZYX1dpZGVTdHJpbmcgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmVuY29kZUhpZ2hMZXZlbCgNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd2lkZU1zZywNCisgICAgQ29tcGFjdGlvbiBjb21wYWN0aW9uLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBDRlhfQnl0ZVN0cmluZyBieXRlczsNCisgIENCQ19VdGlsQ29kaW5nQ29udmVydDo6VW5pY29kZVRvVVRGOCh3aWRlTXNnLCBieXRlcyk7DQorICBDRlhfV2lkZVN0cmluZyBtc2c7DQorICBpbnQzMl90IGxlbiA9IGJ5dGVzLkdldExlbmd0aCgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsNCisgICAgRlhfV0NIQVIgY2ggPSAoRlhfV0NIQVIpKGJ5dGVzLkdldEF0KGkpICYgMHhmZik7DQorICAgIGlmIChjaCA9PSAnPycgJiYgYnl0ZXMuR2V0QXQoaSkgIT0gJz8nKSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uQ2hhcmFjdGVyc091dHNpZGVJU084ODU5MUVuY29kaW5nOw0KKyAgICAgIHJldHVybiAoRlhfV0NIQVIqKSIiOw0KKyAgICB9DQorICAgIG1zZyArPSBjaDsNCisgIH0NCisgIENGWF9CeXRlQXJyYXkgYnl0ZUFycjsNCisgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IGJ5dGVzLkdldExlbmd0aCgpOyBrKyspIHsNCisgICAgYnl0ZUFyci5BZGQoYnl0ZXMuR2V0QXQoaykpOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgc2I7DQorICBsZW4gPSBtc2cuR2V0TGVuZ3RoKCk7DQorICBpbnQzMl90IHAgPSAwOw0KKyAgaW50MzJfdCB0ZXh0U3ViTW9kZSA9IFNVQk1PREVfQUxQSEE7DQorICBpZiAoY29tcGFjdGlvbiA9PSBURVhUKSB7DQorICAgIGVuY29kZVRleHQobXNnLCBwLCBsZW4sIHNiLCB0ZXh0U3ViTW9kZSk7DQorICB9IGVsc2UgaWYgKGNvbXBhY3Rpb24gPT0gQllURVMpIHsNCisgICAgZW5jb2RlQmluYXJ5KCZieXRlQXJyLCBwLCBieXRlQXJyLkdldFNpemUoKSwgQllURV9DT01QQUNUSU9OLCBzYik7DQorICB9IGVsc2UgaWYgKGNvbXBhY3Rpb24gPT0gTlVNRVJJQykgew0KKyAgICBzYiArPSAoRlhfV0NIQVIpTEFUQ0hfVE9fTlVNRVJJQzsNCisgICAgZW5jb2RlTnVtZXJpYyhtc2csIHAsIGxlbiwgc2IpOw0KKyAgfSBlbHNlIHsNCisgICAgaW50MzJfdCBlbmNvZGluZ01vZGUgPSBMQVRDSF9UT19URVhUOw0KKyAgICB3aGlsZSAocCA8IGxlbikgew0KKyAgICAgIGludDMyX3QgbiA9IGRldGVybWluZUNvbnNlY3V0aXZlRGlnaXRDb3VudChtc2csIHApOw0KKyAgICAgIGlmIChuID49IDEzKSB7DQorICAgICAgICBzYiArPSAoRlhfV0NIQVIpTEFUQ0hfVE9fTlVNRVJJQzsNCisgICAgICAgIGVuY29kaW5nTW9kZSA9IE5VTUVSSUNfQ09NUEFDVElPTjsNCisgICAgICAgIHRleHRTdWJNb2RlID0gU1VCTU9ERV9BTFBIQTsNCisgICAgICAgIGVuY29kZU51bWVyaWMobXNnLCBwLCBuLCBzYik7DQorICAgICAgICBwICs9IG47DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGludDMyX3QgdCA9IGRldGVybWluZUNvbnNlY3V0aXZlVGV4dENvdW50KG1zZywgcCk7DQorICAgICAgICBpZiAodCA+PSA1IHx8IG4gPT0gbGVuKSB7DQorICAgICAgICAgIGlmIChlbmNvZGluZ01vZGUgIT0gVEVYVF9DT01QQUNUSU9OKSB7DQorICAgICAgICAgICAgc2IgKz0gKEZYX1dDSEFSKUxBVENIX1RPX1RFWFQ7DQorICAgICAgICAgICAgZW5jb2RpbmdNb2RlID0gVEVYVF9DT01QQUNUSU9OOw0KKyAgICAgICAgICAgIHRleHRTdWJNb2RlID0gU1VCTU9ERV9BTFBIQTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICB0ZXh0U3ViTW9kZSA9IGVuY29kZVRleHQobXNnLCBwLCB0LCBzYiwgdGV4dFN1Yk1vZGUpOw0KKyAgICAgICAgICBwICs9IHQ7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBpbnQzMl90IGIgPSBkZXRlcm1pbmVDb25zZWN1dGl2ZUJpbmFyeUNvdW50KG1zZywgJmJ5dGVBcnIsIHAsIGUpOw0KKyAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgKEZYX1dDSEFSKScgJyk7DQorICAgICAgICAgIGlmIChiID09IDApIHsNCisgICAgICAgICAgICBiID0gMTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoYiA9PSAxICYmIGVuY29kaW5nTW9kZSA9PSBURVhUX0NPTVBBQ1RJT04pIHsNCisgICAgICAgICAgICBlbmNvZGVCaW5hcnkoJmJ5dGVBcnIsIHAsIDEsIFRFWFRfQ09NUEFDVElPTiwgc2IpOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGVuY29kZUJpbmFyeSgmYnl0ZUFyciwgcCwgYiwgZW5jb2RpbmdNb2RlLCBzYik7DQorICAgICAgICAgICAgZW5jb2RpbmdNb2RlID0gQllURV9DT01QQUNUSU9OOw0KKyAgICAgICAgICAgIHRleHRTdWJNb2RlID0gU1VCTU9ERV9BTFBIQTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwICs9IGI7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gc2I7DQorfQ0KK3ZvaWQgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkludmVyc2UoKSB7DQorICB1aW50OF90IGkgPSAwOw0KKyAgaW50MzJfdCBsID0gMDsNCisgIGZvciAobCA9IDA7IGwgPCBzaXplb2YoTUlYRUQpIC8gc2l6ZW9mKE1JWEVEWzBdKTsgbCsrKSB7DQorICAgIE1JWEVEW2xdID0gLTE7DQorICB9DQorICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKFRFWFRfTUlYRURfUkFXKSAvIHNpemVvZihURVhUX01JWEVEX1JBV1swXSk7IGkrKykgew0KKyAgICB1aW50OF90IGIgPSBURVhUX01JWEVEX1JBV1tpXTsNCisgICAgaWYgKGIgPiAwKSB7DQorICAgICAgTUlYRURbYl0gPSBpOw0KKyAgICB9DQorICB9DQorICBmb3IgKGwgPSAwOyBsIDwgc2l6ZW9mKFBVTkNUVUFUSU9OKSAvIHNpemVvZihQVU5DVFVBVElPTlswXSk7IGwrKykgew0KKyAgICBQVU5DVFVBVElPTltsXSA9IC0xOw0KKyAgfQ0KKyAgZm9yIChpID0gMDsNCisgICAgICAgaSA8IHNpemVvZihURVhUX1BVTkNUVUFUSU9OX1JBVykgLyBzaXplb2YoVEVYVF9QVU5DVFVBVElPTl9SQVdbMF0pOw0KKyAgICAgICBpKyspIHsNCisgICAgdWludDhfdCBiID0gVEVYVF9QVU5DVFVBVElPTl9SQVdbaV07DQorICAgIGlmIChiID4gMCkgew0KKyAgICAgIFBVTkNUVUFUSU9OW2JdID0gaTsNCisgICAgfQ0KKyAgfQ0KK30NCitpbnQzMl90IENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjplbmNvZGVUZXh0KENGWF9XaWRlU3RyaW5nIG1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRwb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbml0aWFsU3VibW9kZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgdG1wOw0KKyAgaW50MzJfdCBzdWJtb2RlID0gaW5pdGlhbFN1Ym1vZGU7DQorICBpbnQzMl90IGlkeCA9IDA7DQorICB3aGlsZSAoVFJVRSkgew0KKyAgICBGWF9XQ0hBUiBjaCA9IG1zZy5HZXRBdChzdGFydHBvcyArIGlkeCk7DQorICAgIHN3aXRjaCAoc3VibW9kZSkgew0KKyAgICAgIGNhc2UgU1VCTU9ERV9BTFBIQToNCisgICAgICAgIGlmIChpc0FscGhhVXBwZXIoY2gpKSB7DQorICAgICAgICAgIGlmIChjaCA9PSAnICcpIHsNCisgICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKTI2Ow0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpKGNoIC0gNjUpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBpZiAoaXNBbHBoYUxvd2VyKGNoKSkgew0KKyAgICAgICAgICAgIHN1Ym1vZGUgPSBTVUJNT0RFX0xPV0VSOw0KKyAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpMjc7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIH0gZWxzZSBpZiAoaXNNaXhlZChjaCkpIHsNCisgICAgICAgICAgICBzdWJtb2RlID0gU1VCTU9ERV9NSVhFRDsNCisgICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKTI4Ow0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpMjk7DQorICAgICAgICAgICAgdG1wICs9IFBVTkNUVUFUSU9OW2NoXTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBTVUJNT0RFX0xPV0VSOg0KKyAgICAgICAgaWYgKGlzQWxwaGFMb3dlcihjaCkpIHsNCisgICAgICAgICAgaWYgKGNoID09ICcgJykgew0KKyAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpMjY7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgdG1wICs9IChGWF9XQ0hBUikoY2ggLSA5Nyk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGlmIChpc0FscGhhVXBwZXIoY2gpKSB7DQorICAgICAgICAgICAgdG1wICs9IChGWF9XQ0hBUikyNzsNCisgICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKShjaCAtIDY1KTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfSBlbHNlIGlmIChpc01peGVkKGNoKSkgew0KKyAgICAgICAgICAgIHN1Ym1vZGUgPSBTVUJNT0RFX01JWEVEOw0KKyAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpMjg7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgdG1wICs9IChGWF9XQ0hBUikyOTsNCisgICAgICAgICAgICB0bXAgKz0gUFVOQ1RVQVRJT05bY2hdOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFNVQk1PREVfTUlYRUQ6DQorICAgICAgICBpZiAoaXNNaXhlZChjaCkpIHsNCisgICAgICAgICAgdG1wICs9IE1JWEVEW2NoXTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGlmIChpc0FscGhhVXBwZXIoY2gpKSB7DQorICAgICAgICAgICAgc3VibW9kZSA9IFNVQk1PREVfQUxQSEE7DQorICAgICAgICAgICAgdG1wICs9IChGWF9XQ0hBUikyODsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgfSBlbHNlIGlmIChpc0FscGhhTG93ZXIoY2gpKSB7DQorICAgICAgICAgICAgc3VibW9kZSA9IFNVQk1PREVfTE9XRVI7DQorICAgICAgICAgICAgdG1wICs9IChGWF9XQ0hBUikyNzsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAoc3RhcnRwb3MgKyBpZHggKyAxIDwgY291bnQpIHsNCisgICAgICAgICAgICAgIEZYX1dDSEFSIG5leHQgPSBtc2cuR2V0QXQoc3RhcnRwb3MgKyBpZHggKyAxKTsNCisgICAgICAgICAgICAgIGlmIChpc1B1bmN0dWF0aW9uKG5leHQpKSB7DQorICAgICAgICAgICAgICAgIHN1Ym1vZGUgPSBTVUJNT0RFX1BVTkNUVUFUSU9OOw0KKyAgICAgICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKTI1Ow0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdG1wICs9IChGWF9XQ0hBUikyOTsNCisgICAgICAgICAgICB0bXAgKz0gUFVOQ1RVQVRJT05bY2hdOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgaWYgKGlzUHVuY3R1YXRpb24oY2gpKSB7DQorICAgICAgICAgIHRtcCArPSBQVU5DVFVBVElPTltjaF07DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBzdWJtb2RlID0gU1VCTU9ERV9BTFBIQTsNCisgICAgICAgICAgdG1wICs9IChGWF9XQ0hBUikyOTsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgaWR4Kys7DQorICAgIGlmIChpZHggPj0gY291bnQpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgRlhfV0NIQVIgaCA9IDA7DQorICBpbnQzMl90IGxlbiA9IHRtcC5HZXRMZW5ndGgoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7DQorICAgIEZYX0JPT0wgb2RkID0gKGkgJSAyKSAhPSAwOw0KKyAgICBpZiAob2RkKSB7DQorICAgICAgaCA9IChGWF9XQ0hBUikoKGggKiAzMCkgKyB0bXAuR2V0QXQoaSkpOw0KKyAgICAgIHNiICs9IGg7DQorICAgIH0gZWxzZSB7DQorICAgICAgaCA9IHRtcC5HZXRBdChpKTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKChsZW4gJSAyKSAhPSAwKSB7DQorICAgIHNiICs9IChGWF9XQ0hBUikoKGggKiAzMCkgKyAyOSk7DQorICB9DQorICByZXR1cm4gc3VibW9kZTsNCit9DQordm9pZCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6ZW5jb2RlQmluYXJ5KENGWF9CeXRlQXJyYXkqIGJ5dGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0cG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0bW9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNiKSB7DQorICBpZiAoY291bnQgPT0gMSAmJiBzdGFydG1vZGUgPT0gVEVYVF9DT01QQUNUSU9OKSB7DQorICAgIHNiICs9IChGWF9XQ0hBUilTSElGVF9UT19CWVRFOw0KKyAgfQ0KKyAgaW50MzJfdCBpZHggPSBzdGFydHBvczsNCisgIGludDMyX3QgaSA9IDA7DQorICBpZiAoY291bnQgPj0gNikgew0KKyAgICBzYiArPSAoRlhfV0NIQVIpTEFUQ0hfVE9fQllURTsNCisgICAgRlhfV0NIQVIgY2hhcnNbNV07DQorICAgIHdoaWxlICgoc3RhcnRwb3MgKyBjb3VudCAtIGlkeCkgPj0gNikgew0KKyAgICAgIGludDY0X3QgdCA9IDA7DQorICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgew0KKyAgICAgICAgdCA8PD0gODsNCisgICAgICAgIHQgKz0gYnl0ZXMtPkdldEF0KGlkeCArIGkpICYgMHhmZjsNCisgICAgICB9DQorICAgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgew0KKyAgICAgICAgY2hhcnNbaV0gPSAoRlhfV0NIQVIpKHQgJSA5MDApOw0KKyAgICAgICAgdCAvPSA5MDA7DQorICAgICAgfQ0KKyAgICAgIGZvciAoaSA9IDQ7IGkgPj0gMDsgaS0tKSB7DQorICAgICAgICBzYiArPSAoY2hhcnNbaV0pOw0KKyAgICAgIH0NCisgICAgICBpZHggKz0gNjsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGlkeCA8IHN0YXJ0cG9zICsgY291bnQpIHsNCisgICAgc2IgKz0gKEZYX1dDSEFSKUxBVENIX1RPX0JZVEVfUEFEREVEOw0KKyAgfQ0KKyAgZm9yIChpID0gaWR4OyBpIDwgc3RhcnRwb3MgKyBjb3VudDsgaSsrKSB7DQorICAgIGludDMyX3QgY2ggPSBieXRlcy0+R2V0QXQoaSkgJiAweGZmOw0KKyAgICBzYiArPSAoRlhfV0NIQVIpY2g7DQorICB9DQorfQ0KK3ZvaWQgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmVuY29kZU51bWVyaWMoQ0ZYX1dpZGVTdHJpbmcgbXNnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc2IpIHsNCisgIGludDMyX3QgaWR4ID0gMDsNCisgIEJpZ0ludGVnZXIgbnVtOTAwID0gOTAwOw0KKyAgd2hpbGUgKGlkeCA8IGNvdW50KSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHRtcDsNCisgICAgaW50MzJfdCBsZW4gPSA0NCA8IGNvdW50IC0gaWR4ID8gNDQgOiBjb3VudCAtIGlkeDsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgcGFydCA9DQorICAgICAgICAoKEZYX1dDSEFSKScxJyArIG1zZy5NaWQoc3RhcnRwb3MgKyBpZHgsIGxlbikpLlVURjhFbmNvZGUoKTsNCisgICAgQmlnSW50ZWdlciBiaWdpbnQgPSBzdHJpbmdUb0JpZ0ludGVnZXIocGFydC5jX3N0cigpKTsNCisgICAgZG8gew0KKyAgICAgIGludDMyX3QgYyA9IChiaWdpbnQgJSBudW05MDApLnRvSW50KCk7DQorICAgICAgdG1wICs9IChGWF9XQ0hBUikoYyk7DQorICAgICAgYmlnaW50ID0gYmlnaW50IC8gbnVtOTAwOw0KKyAgICB9IHdoaWxlICghYmlnaW50LmlzWmVybygpKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSB0bXAuR2V0TGVuZ3RoKCkgLSAxOyBpID49IDA7IGktLSkgew0KKyAgICAgIHNiICs9IHRtcC5HZXRBdChpKTsNCisgICAgfQ0KKyAgICBpZHggKz0gbGVuOw0KKyAgfQ0KK30NCitGWF9CT09MIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjppc0RpZ2l0KEZYX1dDSEFSIGNoKSB7DQorICByZXR1cm4gY2ggPj0gJzAnICYmIGNoIDw9ICc5JzsNCit9DQorRlhfQk9PTCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6aXNBbHBoYVVwcGVyKEZYX1dDSEFSIGNoKSB7DQorICByZXR1cm4gY2ggPT0gJyAnIHx8IChjaCA+PSAnQScgJiYgY2ggPD0gJ1onKTsNCit9DQorRlhfQk9PTCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6aXNBbHBoYUxvd2VyKEZYX1dDSEFSIGNoKSB7DQorICByZXR1cm4gY2ggPT0gJyAnIHx8IChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKTsNCit9DQorRlhfQk9PTCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6aXNNaXhlZChGWF9XQ0hBUiBjaCkgew0KKyAgcmV0dXJuIE1JWEVEW2NoXSAhPSAtMTsNCit9DQorRlhfQk9PTCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6aXNQdW5jdHVhdGlvbihGWF9XQ0hBUiBjaCkgew0KKyAgcmV0dXJuIFBVTkNUVUFUSU9OW2NoXSAhPSAtMTsNCit9DQorRlhfQk9PTCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6aXNUZXh0KEZYX1dDSEFSIGNoKSB7DQorICByZXR1cm4gY2ggPT0gJ1x0JyB8fCBjaCA9PSAnXG4nIHx8IGNoID09ICdccicgfHwgKGNoID49IDMyICYmIGNoIDw9IDEyNik7DQorfQ0KK2ludDMyX3QgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmRldGVybWluZUNvbnNlY3V0aXZlRGlnaXRDb3VudCgNCisgICAgQ0ZYX1dpZGVTdHJpbmcgbXNnLA0KKyAgICBpbnQzMl90IHN0YXJ0cG9zKSB7DQorICBpbnQzMl90IGNvdW50ID0gMDsNCisgIGludDMyX3QgbGVuID0gbXNnLkdldExlbmd0aCgpOw0KKyAgaW50MzJfdCBpZHggPSBzdGFydHBvczsNCisgIGlmIChpZHggPCBsZW4pIHsNCisgICAgRlhfV0NIQVIgY2ggPSBtc2cuR2V0QXQoaWR4KTsNCisgICAgd2hpbGUgKGlzRGlnaXQoY2gpICYmIGlkeCA8IGxlbikgew0KKyAgICAgIGNvdW50Kys7DQorICAgICAgaWR4Kys7DQorICAgICAgaWYgKGlkeCA8IGxlbikgew0KKyAgICAgICAgY2ggPSBtc2cuR2V0QXQoaWR4KTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBjb3VudDsNCit9DQoraW50MzJfdCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6ZGV0ZXJtaW5lQ29uc2VjdXRpdmVUZXh0Q291bnQoDQorICAgIENGWF9XaWRlU3RyaW5nIG1zZywNCisgICAgaW50MzJfdCBzdGFydHBvcykgew0KKyAgaW50MzJfdCBsZW4gPSBtc2cuR2V0TGVuZ3RoKCk7DQorICBpbnQzMl90IGlkeCA9IHN0YXJ0cG9zOw0KKyAgd2hpbGUgKGlkeCA8IGxlbikgew0KKyAgICBGWF9XQ0hBUiBjaCA9IG1zZy5HZXRBdChpZHgpOw0KKyAgICBpbnQzMl90IG51bWVyaWNDb3VudCA9IDA7DQorICAgIHdoaWxlIChudW1lcmljQ291bnQgPCAxMyAmJiBpc0RpZ2l0KGNoKSAmJiBpZHggPCBsZW4pIHsNCisgICAgICBudW1lcmljQ291bnQrKzsNCisgICAgICBpZHgrKzsNCisgICAgICBpZiAoaWR4IDwgbGVuKSB7DQorICAgICAgICBjaCA9IG1zZy5HZXRBdChpZHgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAobnVtZXJpY0NvdW50ID49IDEzKSB7DQorICAgICAgcmV0dXJuIGlkeCAtIHN0YXJ0cG9zIC0gbnVtZXJpY0NvdW50Ow0KKyAgICB9DQorICAgIGlmIChudW1lcmljQ291bnQgPiAwKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgY2ggPSBtc2cuR2V0QXQoaWR4KTsNCisgICAgaWYgKCFpc1RleHQoY2gpKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWR4Kys7DQorICB9DQorICByZXR1cm4gaWR4IC0gc3RhcnRwb3M7DQorfQ0KK2ludDMyX3QgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmRldGVybWluZUNvbnNlY3V0aXZlQmluYXJ5Q291bnQoDQorICAgIENGWF9XaWRlU3RyaW5nIG1zZywNCisgICAgQ0ZYX0J5dGVBcnJheSogYnl0ZXMsDQorICAgIGludDMyX3Qgc3RhcnRwb3MsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3QgbGVuID0gbXNnLkdldExlbmd0aCgpOw0KKyAgaW50MzJfdCBpZHggPSBzdGFydHBvczsNCisgIHdoaWxlIChpZHggPCBsZW4pIHsNCisgICAgRlhfV0NIQVIgY2ggPSBtc2cuR2V0QXQoaWR4KTsNCisgICAgaW50MzJfdCBudW1lcmljQ291bnQgPSAwOw0KKyAgICB3aGlsZSAobnVtZXJpY0NvdW50IDwgMTMgJiYgaXNEaWdpdChjaCkpIHsNCisgICAgICBudW1lcmljQ291bnQrKzsNCisgICAgICBpbnQzMl90IGkgPSBpZHggKyBudW1lcmljQ291bnQ7DQorICAgICAgaWYgKGkgPj0gbGVuKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2ggPSBtc2cuR2V0QXQoaSk7DQorICAgIH0NCisgICAgaWYgKG51bWVyaWNDb3VudCA+PSAxMykgew0KKyAgICAgIHJldHVybiBpZHggLSBzdGFydHBvczsNCisgICAgfQ0KKyAgICBpbnQzMl90IHRleHRDb3VudCA9IDA7DQorICAgIHdoaWxlICh0ZXh0Q291bnQgPCA1ICYmIGlzVGV4dChjaCkpIHsNCisgICAgICB0ZXh0Q291bnQrKzsNCisgICAgICBpbnQzMl90IGkgPSBpZHggKyB0ZXh0Q291bnQ7DQorICAgICAgaWYgKGkgPj0gbGVuKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2ggPSBtc2cuR2V0QXQoaSk7DQorICAgIH0NCisgICAgaWYgKHRleHRDb3VudCA+PSA1KSB7DQorICAgICAgcmV0dXJuIGlkeCAtIHN0YXJ0cG9zOw0KKyAgICB9DQorICAgIGNoID0gbXNnLkdldEF0KGlkeCk7DQorICAgIGlmIChieXRlcy0+R2V0QXQoaWR4KSA9PSA2MyAmJiBjaCAhPSAnPycpIHsNCisgICAgICBlID0gQkNFeGNlcHRpb25Ob25FbmNvZGFibGVDaGFyYWN0ZXJEZXRlY3RlZDsNCisgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisgICAgaWR4Kys7DQorICB9DQorICByZXR1cm4gaWR4IC0gc3RhcnRwb3M7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZTFjNzIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlci5oCkBAIC0wLDAgKzEsNzQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBYRkFfU1JDX0ZYQkFSQ09ERV9QREY0MTdfQkNfUERGNDE3SElHSExFVkVMRU5DT0RFUl9IXw0KKyNkZWZpbmUgWEZBX1NSQ19GWEJBUkNPREVfUERGNDE3X0JDX1BERjQxN0hJR0hMRVZFTEVOQ09ERVJfSF8NCisNCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiDQorI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zdHJpbmcuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbXBhY3Rpb24uaCINCisNCitjbGFzcyBDQkNfUERGNDE3SGlnaExldmVsRW5jb2RlciB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBDRlhfV2lkZVN0cmluZyBlbmNvZGVIaWdoTGV2ZWwoQ0ZYX1dpZGVTdHJpbmcgbXNnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wYWN0aW9uIGNvbXBhY3Rpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgSW52ZXJzZSgpOw0KKyAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZSgpOw0KKyAgc3RhdGljIHZvaWQgRmluYWxpemUoKTsNCisNCisgcHJpdmF0ZToNCisgIHN0YXRpYyBpbnQzMl90IFRFWFRfQ09NUEFDVElPTjsNCisgIHN0YXRpYyBpbnQzMl90IEJZVEVfQ09NUEFDVElPTjsNCisgIHN0YXRpYyBpbnQzMl90IE5VTUVSSUNfQ09NUEFDVElPTjsNCisgIHN0YXRpYyBpbnQzMl90IFNVQk1PREVfUFVOQ1RVQVRJT047DQorICBzdGF0aWMgaW50MzJfdCBMQVRDSF9UT19URVhUOw0KKyAgc3RhdGljIGludDMyX3QgTEFUQ0hfVE9fQllURV9QQURERUQ7DQorICBzdGF0aWMgaW50MzJfdCBMQVRDSF9UT19OVU1FUklDOw0KKyAgc3RhdGljIGludDMyX3QgU0hJRlRfVE9fQllURTsNCisgIHN0YXRpYyBpbnQzMl90IExBVENIX1RPX0JZVEU7DQorICBzdGF0aWMgdWludDhfdCBURVhUX01JWEVEX1JBV1tdOw0KKyAgc3RhdGljIHVpbnQ4X3QgVEVYVF9QVU5DVFVBVElPTl9SQVdbXTsNCisgIHN0YXRpYyBpbnQzMl90IE1JWEVEWzEyOF07DQorICBzdGF0aWMgaW50MzJfdCBQVU5DVFVBVElPTlsxMjhdOw0KKyAgc3RhdGljIGludDMyX3QgZW5jb2RlVGV4dChDRlhfV2lkZVN0cmluZyBtc2csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRwb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbml0aWFsU3VibW9kZSk7DQorICBzdGF0aWMgdm9pZCBlbmNvZGVCaW5hcnkoQ0ZYX0J5dGVBcnJheSogYnl0ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRtb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzYik7DQorICBzdGF0aWMgdm9pZCBlbmNvZGVOdW1lcmljKENGWF9XaWRlU3RyaW5nIG1zZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNiKTsNCisgIHN0YXRpYyBGWF9CT09MIGlzRGlnaXQoRlhfV0NIQVIgY2gpOw0KKyAgc3RhdGljIEZYX0JPT0wgaXNBbHBoYVVwcGVyKEZYX1dDSEFSIGNoKTsNCisgIHN0YXRpYyBGWF9CT09MIGlzQWxwaGFMb3dlcihGWF9XQ0hBUiBjaCk7DQorICBzdGF0aWMgRlhfQk9PTCBpc01peGVkKEZYX1dDSEFSIGNoKTsNCisgIHN0YXRpYyBGWF9CT09MIGlzUHVuY3R1YXRpb24oRlhfV0NIQVIgY2gpOw0KKyAgc3RhdGljIEZYX0JPT0wgaXNUZXh0KEZYX1dDSEFSIGNoKTsNCisgIHN0YXRpYyBpbnQzMl90IGRldGVybWluZUNvbnNlY3V0aXZlRGlnaXRDb3VudChDRlhfV2lkZVN0cmluZyBtc2csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydHBvcyk7DQorICBzdGF0aWMgaW50MzJfdCBkZXRlcm1pbmVDb25zZWN1dGl2ZVRleHRDb3VudChDRlhfV2lkZVN0cmluZyBtc2csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0cG9zKTsNCisgIHN0YXRpYyBpbnQzMl90IGRldGVybWluZUNvbnNlY3V0aXZlQmluYXJ5Q291bnQoQ0ZYX1dpZGVTdHJpbmcgbXNnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZUFycmF5KiBieXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorDQorICBmcmllbmQgY2xhc3MgUERGNDE3SGlnaExldmVsRW5jb2Rlcl9FbmNvZGVOdW1lcmljX1Rlc3Q7DQorICBmcmllbmQgY2xhc3MgUERGNDE3SGlnaExldmVsRW5jb2Rlcl9FbmNvZGVCaW5hcnlfVGVzdDsNCisgIGZyaWVuZCBjbGFzcyBQREY0MTdIaWdoTGV2ZWxFbmNvZGVyX0VuY29kZVRleHRfVGVzdDsNCisgIGZyaWVuZCBjbGFzcyBQREY0MTdIaWdoTGV2ZWxFbmNvZGVyX0NvbnNlY3V0aXZlRGlnaXRDb3VudF9UZXN0Ow0KKyAgZnJpZW5kIGNsYXNzIFBERjQxN0hpZ2hMZXZlbEVuY29kZXJfQ29uc2VjdXRpdmVUZXh0Q291bnRfVGVzdDsNCisgIGZyaWVuZCBjbGFzcyBQREY0MTdIaWdoTGV2ZWxFbmNvZGVyX0NvbnNlY3V0aXZlQmluYXJ5Q291bnRfVGVzdDsNCit9Ow0KKw0KKyNlbmRpZiAgLy8gWEZBX1NSQ19GWEJBUkNPREVfUERGNDE3X0JDX1BERjQxN0hJR0hMRVZFTEVOQ09ERVJfSF8NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcl91bml0dGVzdC5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcl91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUwZjNjOQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDIzOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCisjaW5jbHVkZSAidGVzdGluZy9meF9zdHJpbmdfdGVzdGhlbHBlcnMuaCIKKyNpbmNsdWRlICJCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyLmgiCisKK1RFU1QoUERGNDE3SGlnaExldmVsRW5jb2RlciwgRW5jb2RlSGlnaExldmVsKSB7CisgIC8vIFRPRE8odHNlcGV6KTogaW1wbGVtZW50IHRlc3QgY2FzZXMuCit9CisKK1RFU1QoUERGNDE3SGlnaExldmVsRW5jb2RlciwgRW5jb2RlVGV4dCkgeworICAvLyBUT0RPKHRzZXBleik6IGltcGxlbWVudCB0ZXN0IGNhc2VzLgorfQorCitURVNUKFBERjQxN0hpZ2hMZXZlbEVuY29kZXIsIEVuY29kZUJpbmFyeSkgeworICBzdHJ1Y3QgRW5jb2RlQmluYXJ5Q2FzZSB7CisgICAgY29uc3QgY2hhciogaW5wdXQ7CisgICAgaW50IG9mZnNldDsKKyAgICBpbnQgY291bnQ7CisgICAgaW50IHN0YXJ0bW9kZTsKKyAgICBjb25zdCB3Y2hhcl90KiBleHBlY3RlZDsKKyAgICBpbnQgZXhwZWN0ZWRfbGVuZ3RoOworICB9IGVuY29kZV9iaW5hcnlfY2FzZXNbXSA9IHsKKyAgICAgIC8vIEVtcHR5IHN0cmluZyBlbmNvZGVzIGFzIGVtcHR5IHN0cmluZy4KKyAgICAgIHsiIiwgMCwgMCwgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OlRFWFRfQ09NUEFDVElPTiwgTCIiLCAwfSwKKworICAgICAgLy8gRmV3ZXIgdGhhbiA2IGNoYXJhY3RlcnMgZW5jb2RlcyBhcyBwcmVmaXggd2l0aG91dCBjb21wYWN0aW9uLgorICAgICAgeyJ4eHh4eCIsIDAsIDUsIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpURVhUX0NPTVBBQ1RJT04sCisgICAgICAgTCJceDAzODV4eHh4eCIsIDZ9LAorCisgICAgICAvLyA2IGNoYXJjdGVycyB0cmlnZ2Vyc3QgdGV4dCBlbmNvZGluZyBjb21wYWN0aW9uLgorICAgICAgeyJ4eHh4eHgiLCAwLCA2LCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6VEVYVF9DT01QQUNUSU9OLAorICAgICAgIEwiXHUwMzljXHUwMGM5XHUwMzFmXHUwMTJhXHUwMGQyXHUwMmQwIiwgNn0sCisKKyAgICAgIC8vIFNhbWUgcmVzdWx0IGlmIGluaXRpYWxseSBpbiBudW1lcmljIGNvbXBhY3Rpb24gbW9kZS4KKyAgICAgIHsieHh4eHh4IiwgMCwgNiwgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6Ok5VTUVSSUNfQ09NUEFDVElPTiwKKyAgICAgICBMIlx1MDM5Y1x1MDBjOVx1MDMxZlx1MDEyYVx1MDBkMlx1MDJkMCIsIDZ9LAorICB9OworCisgIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpJbml0aWFsaXplKCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGVuY29kZV9iaW5hcnlfY2FzZXMpOyArK2kpIHsKKyAgICBFbmNvZGVCaW5hcnlDYXNlKiBwdHIgPSAmZW5jb2RlX2JpbmFyeV9jYXNlc1tpXTsKKyAgICBDRlhfQnl0ZUFycmF5IGlucHV0X2FycmF5OworICAgIHNpemVfdCBpbnB1dF9sZW5ndGggPSBzdHJsZW4ocHRyLT5pbnB1dCk7CisgICAgaW5wdXRfYXJyYXkuU2V0U2l6ZShpbnB1dF9sZW5ndGgpOworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaW5wdXRfbGVuZ3RoOyArK2opIHsKKyAgICAgIGlucHV0X2FycmF5LlNldEF0KGosIHB0ci0+aW5wdXRbal0pOworICAgIH0KKyAgICBDRlhfV2lkZVN0cmluZyBleHBlY3RlZChwdHItPmV4cGVjdGVkLCBwdHItPmV4cGVjdGVkX2xlbmd0aCk7CisgICAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0OworICAgIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjplbmNvZGVCaW5hcnkoCisgICAgICAgICZpbnB1dF9hcnJheSwgcHRyLT5vZmZzZXQsIHB0ci0+Y291bnQsIHB0ci0+c3RhcnRtb2RlLCByZXN1bHQpOworICAgIEVYUEVDVF9FUShleHBlY3RlZCwgcmVzdWx0KSA8PCAiIGZvciBjYXNlIG51bWJlciAiIDw8IGk7CisgIH0KKyAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkZpbmFsaXplKCk7Cit9CisKK1RFU1QoUERGNDE3SGlnaExldmVsRW5jb2RlciwgRW5jb2RlTnVtZXJpYykgeworICBzdHJ1Y3QgRW5jb2RlTnVtZXJpY0Nhc2UgeworICAgIGNvbnN0IHdjaGFyX3QqIGlucHV0OworICAgIGludCBvZmZzZXQ7CisgICAgaW50IGNvdW50OworICAgIGNvbnN0IHdjaGFyX3QqIGV4cGVjdGVkOworICAgIGludCBleHBlY3RlZF9sZW5ndGg7CisgIH0gZW5jb2RlX251bWVyaWNfY2FzZXNbXSA9IHsKKyAgICAgIC8vIEVtcHR5IHN0cmluZyBlbmNvZGVzIGFzIGVtcHR5IHN0cmluZy4KKyAgICAgIHtMIiIsIDAsIDAsIEwiIiwgMH0sCisKKyAgICAgIC8vIFNpbmdsZSAwIHNob3VsZCBlbmNvZGUgYXMgMTAgYmFzZS05MDAgPT0gYS4KKyAgICAgIHtMIjAiLCAwLCAxLCBMIlx4MDAwYSIsIDF9LAorCisgICAgICAvLyA4MDAgc2hvdWxkIGVuY29kZSBhcyAxODAwIGJhc2UtOTAwID09IDIsMC4KKyAgICAgIHtMIjgwMCIsIDAsIDMsIEwiXHgwMDAyXHgwMDAwIiwgMn0sCisKKyAgICAgIC8vIFRlc3QgbG9uZ2VyIHN0cmluZ3MgYW5kIHN1Yi1zdHJpbmdzLgorICAgICAge0wiMTIzNDU2IiwgMCwgNiwgTCJceDAwMDFceDAxNWNceDAxMDAiLCAzfSwKKyAgICAgIHtMIjEyMzQ1NiIsIDAsIDUsIEwiXHgwMDdjXHgwMmU5IiwgMn0sCisgICAgICB7TCIxMjM0NTYiLCAxLCA1LCBMIlx4MDA4OVx4MDA5YyIsIDJ9LAorICAgICAge0wiMTIzNDU2IiwgMiwgMiwgTCJceDAwODYiLCAxfSwKKworICAgICAgLy8gVXAgdG8gNDQgY2hhcmFjdGVycyBlbmNvZGVzIGFzIDE1IGJhc2UtOTAwIHdvcmRzLgorICAgICAge0wiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLAorICAgICAgIDAsCisgICAgICAgNDQsCisgICAgICAgTCJceDAxYjVceDAwNmZceDAyY2NceDAwODRceDAxYmNceDAwNzZceDAwYjNceDAwNWNceDAxZjBceDAzNGZceDAxZTYiCisgICAgICAgTCJceDAwOTBceDAyMGJceDAxOWJceDAwNjQiLAorICAgICAgIDE1fSwKKworICAgICAgLy8gNDUgY2hhcmFjdGVycyBzaG91bGQgZW5jb2RlIGFzIHNhbWUgMTUgd29yZHMgZm9sbG93ZWQgYnkgb25lIGFkZGl0aW9uYWwKKyAgICAgIC8vIHdvcmQuCisgICAgICB7TCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLAorICAgICAgIDAsCisgICAgICAgNDUsCisgICAgICAgTCJceDAxYjVceDAwNmZceDAyY2NceDAwODRceDAxYmNceDAwNzZceDAwYjNceDAwNWNceDAxZjBceDAzNGZceDAxZTYiCisgICAgICAgTCJceDAwOTBceDAyMGJceDAxOWJceDAwNjRceDAwMGEiLAorICAgICAgIDE2fSwKKworICAgICAgLy8gNDQgY2hhcmFjdGVycyBmb2xsb3dlZCBieSA4MDAgc2hvdWxkIGVuY29kZSBhcyAxNSB3b3JkcyBmb2xsb3dlZCBieQorICAgICAgLy8gMTgwMCBiYXNlLTkwMCA9PSAyLDAuCisgICAgICB7TCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgwMCIsCisgICAgICAgMCwKKyAgICAgICA0NywKKyAgICAgICBMIlx4MDFiNVx4MDA2Zlx4MDJjY1x4MDA4NFx4MDFiY1x4MDA3Nlx4MDBiM1x4MDA1Y1x4MDFmMFx4MDM0Zlx4MDFlNiIKKyAgICAgICBMIlx4MDA5MFx4MDIwYlx4MDE5Ylx4MDA2NFx4MDAwMlx4MDAwMCIsCisgICAgICAgMTd9LAorCisgICAgICAvLyBFdmVuIGxvbmdlciBpbnB1dC4KKyAgICAgIHtMIjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwKKyAgICAgICAwLAorICAgICAgIDUwLAorICAgICAgIEwiXHgwMWUwXHgwMmYwXHgwMzZkXHgwMmFkXHgwMjljXHgwMWVhXHgwMDExXHgwMDBiXHgwMmQ2XHgwMjNjXHgwMTA4IgorICAgICAgIEwiXHgwMmJiXHgwMDIzXHgwMmQyXHgwMGM4XHgwMDAxXHgwMGQzXHgwMDY0IiwKKyAgICAgICAxOH0sCisgIH07CisKKyAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkluaXRpYWxpemUoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoZW5jb2RlX251bWVyaWNfY2FzZXMpOyArK2kpIHsKKyAgICBFbmNvZGVOdW1lcmljQ2FzZSogcHRyID0gJmVuY29kZV9udW1lcmljX2Nhc2VzW2ldOworICAgIENGWF9XaWRlU3RyaW5nIGlucHV0KHB0ci0+aW5wdXQpOworICAgIENGWF9XaWRlU3RyaW5nIGV4cGVjdGVkKHB0ci0+ZXhwZWN0ZWQsIHB0ci0+ZXhwZWN0ZWRfbGVuZ3RoKTsKKyAgICBDRlhfV2lkZVN0cmluZyByZXN1bHQ7CisgICAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmVuY29kZU51bWVyaWMoaW5wdXQsIHB0ci0+b2Zmc2V0LCBwdHItPmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLCByZXN1bHQpIDw8ICIgZm9yIGNhc2UgbnVtYmVyICIgPDwgaTsKKyAgfQorICBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6RmluYWxpemUoKTsKK30KKworVEVTVChQREY0MTdIaWdoTGV2ZWxFbmNvZGVyLCBDb25zZWN1dGl2ZURpZ2l0Q291bnQpIHsKKyAgc3RydWN0IENvbnNlY3V0aXZlRGlnaXRDYXNlIHsKKyAgICBjb25zdCB3Y2hhcl90KiBpbnB1dDsKKyAgICBpbnQgb2Zmc2V0OworICAgIGludCBleHBlY3RlZF9jb3VudDsKKyAgfSBjb25zZWN1dGl2ZV9kaWdpdF9jYXNlc1tdID0geworICAgICAgLy8gRW1wdHkgc3RyaW5nIGNvbnRhaW5zIDAgY29uc2VjdWl0dmUgZGlnaXRzLgorICAgICAge0wiIiwgMCwgMH0sCisKKyAgICAgIC8vIFNpbmdsZSBub24tZGlnaXQgY2hhcmFjdGVyIGNvbnRhaW5zIDAgY29uc2VjdXRpdmUgZGlnaXRzLgorICAgICAge0wiWCIsIDAsIDB9LAorCisgICAgICAvLyBMZWFkaW5nIG5vbi1kaWdpdCBmb2xsb3dlZCBieSBkaWdpdHMgY29udGFpbnMgMCBjb25zZWN1dGl2ZS4KKyAgICAgIHtMIlgxMjMiLCAwLCAwfSwKKworICAgICAgLy8gU2luZ2xlIGRpZ2l0IGNvbnRhaW5zIDEgY29uc2VjdXRpdmUgZGlnaXQuCisgICAgICB7TCIxIiwgMCwgMX0sCisKKyAgICAgIC8vIFNpbmdsZSBkaWdpdCBmb2xsb3dlIGJ5IG5vbi1kaWdpdCBjb250YWlucyAxIGNvbnNlY3V0aXZlIGRpZ2l0LgorICAgICAge0wiMVoiLCAwLCAxfSwKKworICAgICAgLy8gVGVzdCBsb25nZXIgc3RyaW5ncy4KKyAgICAgIHtMIjEyM0ZPTzQ1Njc4IiwgMCwgM30sCisKKyAgICAgIC8vIFRlc3Qgc3VidHJpbmcgc3RhcnRpbmcgaW4gZGlnaXRzIGZpZWxkLgorICAgICAge0wiMTIzRk9PNDU2NzgiLCAzLCAwfSwKKworICAgICAgLy8gVGVzdCBzdWJ0cmluZyBzdGFydGluZyBpbiBub24tZGlnaXRzIGZpZWxkLgorICAgICAge0wiMTIzRk9PNDU2NzgiLCAzLCAwfSwKKworICAgICAgLy8gVGVzdCBzdWJzdHJpbmcgc3RhcnRpbmcgaW4gZGlnaXRzIGZpZWxkIGZvbGxvd2luZyBub24tZGlnaXQgZmllbGQuCisgICAgICB7TCIxMjNGT080NTY3OCIsIDYsIDV9LAorICB9OworCisgIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpJbml0aWFsaXplKCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGNvbnNlY3V0aXZlX2RpZ2l0X2Nhc2VzKTsgKytpKSB7CisgICAgQ29uc2VjdXRpdmVEaWdpdENhc2UqIHB0ciA9ICZjb25zZWN1dGl2ZV9kaWdpdF9jYXNlc1tpXTsKKyAgICBDRlhfV2lkZVN0cmluZyBpbnB1dChwdHItPmlucHV0KTsKKyAgICBpbnQgYWN0dWFsX2NvdW50ID0KKyAgICAgICAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmRldGVybWluZUNvbnNlY3V0aXZlRGlnaXRDb3VudChpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHItPm9mZnNldCk7CisgICAgRVhQRUNUX0VRKHB0ci0+ZXhwZWN0ZWRfY291bnQsIGFjdHVhbF9jb3VudCkgPDwgIiBmb3IgY2FzZSBudW1iZXIgIiA8PCBpOworICB9CisgIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpGaW5hbGl6ZSgpOworfQorCitURVNUKFBERjQxN0hpZ2hMZXZlbEVuY29kZXIsIENvbnNlY3V0aXZlVGV4dENvdW50KSB7CisgIHN0cnVjdCBDb25zZWN1dGl2ZVRleHRDYXNlIHsKKyAgICBjb25zdCB3Y2hhcl90KiBpbnB1dDsKKyAgICBpbnQgb2Zmc2V0OworICAgIGludCBleHBlY3RlZF9jb3VudDsKKyAgfSBjb25zZWN1dGl2ZV90ZXh0X2Nhc2VzW10gPSB7CisgICAgICAvLyBFbXB0eSBzdHJpbmcgY29udGFpbnMgMCBjb25zZWN1dGl2ZSB0ZXh0IGNoYXJhY3RlcnMuCisgICAgICB7TCIiLCAwLCAwfSwKKworICAgICAgLy8gU2luZ2xlIHRleHQgY2hhcmFjdGVyIGlzIDEgY29uc2VjdXRpdmUgdGV4dCBjaGFyYWN0ZXJzLgorICAgICAge0wiWCIsIDAsIDF9LAorCisgICAgICAvLyBUcmFpbGluZyBudW1iZXJzIGNvdW50IGFzIHRleHQgY2hhcmFjdGVycy4KKyAgICAgIHtMIlgxMjMiLCAwLCA0fSwKKworICAgICAgLy8gTGVhZGluZyBudW1iZXJzIGNvdW50IGFzIHRleHQgY2hhcmFjdGVycy4KKyAgICAgIHtMIjEyM1giLCAwLCA0fSwKKworICAgICAgLy8gRW1iZWRkZWQgbG8tdmFsdWUgYmluYXJ5IGNoYXJhY3RlcnMgdGVybWluYXRlIHRleHQgcnVucy4KKyAgICAgIHtMIkFCQ1x4MDAwMVhYWFgiLCAwLCAzfSwKKworICAgICAgLy8gRW1iZWRkZWQgaGktdmFsdWUgYmluYXJ5IGNoYXJhY3RlcnMgdGVybWluYXRlIHRleHQgcnVucy4KKyAgICAgIHtMIkFCQ1x4MDEwMFhYWFgiLCAwLCAzfSwKKworICAgICAgLy8gVGV4dCBydW4gc3RpbGwgZm91bmQgYWZ0ZXIgaW5kZXhpbmcgcGFzdCBsby12YWx1ZSBjaGFyYWN0ZXIuCisgICAgICB7TCJBQkNceDAwMDFYWFhYIiwgNCwgNH0sCisKKyAgICAgIC8vIFRleHQgcnVuIHN0aWxsIGZvdW5kIGFmdGVyIGluZGV4aW5nIHBhc3QgaGktdmFsdWUgY2hhcmFjdGVyLgorICAgICAge0wiQUJDXHgwMTAwWFhYWCIsIDQsIDR9LAorCisgICAgICAvLyBMZWFkaW5nIGhpLXZhbHVlIGNoYXJhY3RlciByZXN1bHRzIGluIDAgY29uc2VjdXRpdmUgY2hhcmFjdGVycy4KKyAgICAgIHtMIlx4MDEwMFhYWCIsIDAsIDB9LAorCisgICAgICAvLyBVcCB0byAxMiBudW1iZXJzIGNvdW50IGFzIHRleHQuCisgICAgICB7TCIxMjM0NTY3ODkwMTIiLCAwLCAxMn0sCisKKyAgICAgIC8vIDEzIG9yIG1vcmUgbnVtYmVycyBhcmUgY29tcHJlc3NzZWQgdXNpbmcgbnVtZXJpYyBjb21wcmVzc2lvbiwgbm90IHRleHQuCisgICAgICB7TCIxMjM0NTY3ODkwMTIzIiwgMCwgMH0sCisKKyAgICAgIC8vIExlYWRpbmcgVGV4dCBjaGFyYWN0ZXIgZG9lc24ndCBhZmZlY3QgdGhlIDEyIGNoYXJhY3RlciBjYXNlLgorICAgICAge0wiWDEyMzQ1Njc4OTAxMiIsIDAsIDEzfSwKKworICAgICAgLy8gTGVhZGluZyBUZXh0IGNoYXJhY3RlciBkb2Vzbid0IGFmZmVjdCB0aGUgMTMgY2hhcmFjdGVyIGNhc2UuCisgICAgICB7TCJYMTIzNDU2Nzg5MDEyMyIsIDAsIDF9LAorCisgICAgICAvLyBKdW1waW5nIGJldHdlZW4gbnVtYmVycyBhbmQgbGV0dGVycyB3b3JrcyBwcm9wZXJseS4KKyAgICAgIHtMIlhYWDEyMVhYWDEyMzQ1Njc4OTAxMjM0IiwgMCwgOX0sCisgIH07CisKKyAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkluaXRpYWxpemUoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoY29uc2VjdXRpdmVfdGV4dF9jYXNlcyk7ICsraSkgeworICAgIENvbnNlY3V0aXZlVGV4dENhc2UqIHB0ciA9ICZjb25zZWN1dGl2ZV90ZXh0X2Nhc2VzW2ldOworICAgIENGWF9XaWRlU3RyaW5nIGlucHV0KHB0ci0+aW5wdXQpOworICAgIGludCBhY3R1YWxfY291bnQgPQorICAgICAgICBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6ZGV0ZXJtaW5lQ29uc2VjdXRpdmVUZXh0Q291bnQoaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHItPm9mZnNldCk7CisgICAgRVhQRUNUX0VRKHB0ci0+ZXhwZWN0ZWRfY291bnQsIGFjdHVhbF9jb3VudCkgPDwgIiBmb3IgY2FzZSBudW1iZXIgIiA8PCBpOworICB9CisgIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpGaW5hbGl6ZSgpOworfQorCitURVNUKFBERjQxN0hpZ2hMZXZlbEVuY29kZXIsIENvbnNlY3V0aXZlQmluYXJ5Q291bnQpIHt9CmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3UmVhZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdSZWFkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NjY0ZTQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3UmVhZGVyLmNwcApAQCAtMCwwICsxLDE0NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwOSBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1JlYWRlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19CaW5hcnlCaXRtYXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfUmVzdWx0UG9pbnQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfQmluYXJ5Qml0bWFwLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX0RlY29kZXJSZXN1bHQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0QXJyYXkuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkRlY29kZXJSZXN1bHQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdEZXRlY3RvclJlc3VsdC5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdEZXRlY3Rvci5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdEZXRlY3RvclJlc3VsdC5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdDb2Rld29yZC5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdDb21tb24uaCINCisjaW5jbHVkZSAiQkNfUERGNDE3QmFyY29kZVZhbHVlLmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0JhcmNvZGVNZXRhZGF0YS5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdCb3VuZGluZ0JveC5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdEZXRlY3Rpb25SZXN1bHRDb2x1bW4uaCINCisjaW5jbHVkZSAiQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uLmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0RldGVjdGlvblJlc3VsdC5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0NvZGV3b3JkRGVjb2Rlci5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0VDTW9kdWx1c1BvbHkuaCINCisjaW5jbHVkZSAiQkNfUERGNDE3RUNNb2R1bHVzR0YuaCINCisjaW5jbHVkZSAiQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb24uaCINCisjaW5jbHVkZSAiQkNfUERGNDE3RGVjb2RlZEJpdFN0cmVhbVBhcnNlci5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdTY2FubmluZ0RlY29kZXIuaCINCisjaW5jbHVkZSAiQkNfUERGNDE3UmVhZGVyLmgiDQorI2RlZmluZSBJbnRlZ2VyX01BWF9WQUxVRSAyMTQ3NDgzNjQ3DQorQ0JDX1BERjQxN1JlYWRlcjo6Q0JDX1BERjQxN1JlYWRlcigpIHt9DQorQ0JDX1BERjQxN1JlYWRlcjo6fkNCQ19QREY0MTdSZWFkZXIoKSB7fQ0KK0NGWF9CeXRlU3RyaW5nIENCQ19QREY0MTdSZWFkZXI6OkRlY29kZShDQkNfQmluYXJ5Qml0bWFwKiBpbWFnZSwgaW50MzJfdCYgZSkgew0KKyAgcmV0dXJuIERlY29kZShpbWFnZSwgMCwgZSk7DQorfQ0KK0NGWF9CeXRlU3RyaW5nIENCQ19QREY0MTdSZWFkZXI6OkRlY29kZShDQkNfQmluYXJ5Qml0bWFwKiBpbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBtdWx0aXBsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0czsNCisgIENCQ19QREY0MTdEZXRlY3RvclJlc3VsdCogZGV0ZWN0b3JSZXN1bHQgPQ0KKyAgICAgIENCQ19EZXRlY3Rvcjo6ZGV0ZWN0KGltYWdlLCBoaW50cywgbXVsdGlwbGUsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGRldGVjdG9yUmVzdWx0LT5nZXRQb2ludHMoKS0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgQ0ZYX1B0ckFycmF5KiBwb2ludHMgPSAoQ0ZYX1B0ckFycmF5KilkZXRlY3RvclJlc3VsdC0+Z2V0UG9pbnRzKCktPkdldEF0KGkpOw0KKyAgICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogUmVzdWx0VGVtcCA9IENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmRlY29kZSgNCisgICAgICAgIGRldGVjdG9yUmVzdWx0LT5nZXRCaXRzKCksIChDQkNfUmVzdWx0UG9pbnQqKXBvaW50cy0+R2V0QXQoNCksDQorICAgICAgICAoQ0JDX1Jlc3VsdFBvaW50Kilwb2ludHMtPkdldEF0KDUpLCAoQ0JDX1Jlc3VsdFBvaW50Kilwb2ludHMtPkdldEF0KDYpLA0KKyAgICAgICAgKENCQ19SZXN1bHRQb2ludCopcG9pbnRzLT5HZXRBdCg3KSwgZ2V0TWluQ29kZXdvcmRXaWR0aCgqcG9pbnRzKSwNCisgICAgICAgIGdldE1heENvZGV3b3JkV2lkdGgoKnBvaW50cyksIGUpOw0KKyAgICBpZiAoUmVzdWx0VGVtcCA9PSBOVUxMKSB7DQorICAgICAgZGVsZXRlIGRldGVjdG9yUmVzdWx0Ow0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbnROb3RGb3VuZEluc3RhbmNlOw0KKyAgICAgIHJldHVybiAiIjsNCisgICAgfQ0KKyAgICByZXN1bHRzICs9IFJlc3VsdFRlbXAtPkdldFRleHQoKTsNCisgICAgZGVsZXRlIFJlc3VsdFRlbXA7DQorICB9DQorICBkZWxldGUgZGV0ZWN0b3JSZXN1bHQ7DQorICByZXR1cm4gcmVzdWx0czsNCit9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX1BERjQxN1JlYWRlcjo6RGVjb2RlKENCQ19CaW5hcnlCaXRtYXAqIGltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDRlhfQnl0ZVN0cmluZyBicyA9IERlY29kZShpbWFnZSwgRkFMU0UsIDAsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgIHJldHVybiBiczsNCit9DQoraW50MzJfdCBDQkNfUERGNDE3UmVhZGVyOjpnZXRNYXhXaWR0aChDQkNfUmVzdWx0UG9pbnQqIHAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiBwMikgew0KKyAgaWYgKHAxID09IE5VTEwgfHwgcDIgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHJldHVybiAoaW50MzJfdClGWFNZU19mYWJzKHAxLT5HZXRYKCkgLSBwMi0+R2V0WCgpKTsNCit9DQoraW50MzJfdCBDQkNfUERGNDE3UmVhZGVyOjpnZXRNaW5XaWR0aChDQkNfUmVzdWx0UG9pbnQqIHAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiBwMikgew0KKyAgaWYgKHAxID09IE5VTEwgfHwgcDIgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gSW50ZWdlcl9NQVhfVkFMVUU7DQorICB9DQorICByZXR1cm4gKGludDMyX3QpRlhTWVNfZmFicyhwMS0+R2V0WCgpIC0gcDItPkdldFgoKSk7DQorfQ0KK2ludDMyX3QgQ0JDX1BERjQxN1JlYWRlcjo6Z2V0TWF4Q29kZXdvcmRXaWR0aChDRlhfUHRyQXJyYXkmIHApIHsNCisgIGludDMyX3QgYSA9DQorICAgICAgZ2V0TWF4V2lkdGgoKENCQ19SZXN1bHRQb2ludCopcC5HZXRBdCg2KSwgKENCQ19SZXN1bHRQb2ludCopcC5HZXRBdCgyKSkgKg0KKyAgICAgIENCQ19QREY0MTdDb21tb246Ok1PRFVMRVNfSU5fQ09ERVdPUkQgLw0KKyAgICAgIENCQ19QREY0MTdDb21tb246Ok1PRFVMRVNfSU5fU1RPUF9QQVRURVJOOw0KKyAgaW50MzJfdCBiID0NCisgICAgICBnZXRNYXhXaWR0aCgoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDcpLCAoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDMpKSAqDQorICAgICAgQ0JDX1BERjQxN0NvbW1vbjo6TU9EVUxFU19JTl9DT0RFV09SRCAvDQorICAgICAgQ0JDX1BERjQxN0NvbW1vbjo6TU9EVUxFU19JTl9TVE9QX1BBVFRFUk47DQorICBpbnQzMl90IGMgPSBnZXRNYXhXaWR0aCgoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDApLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKENCQ19SZXN1bHRQb2ludCopcC5HZXRBdCg0KSkgPCBhDQorICAgICAgICAgICAgICAgICAgPyBnZXRNYXhXaWR0aCgoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDApLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENCQ19SZXN1bHRQb2ludCopcC5HZXRBdCg0KSkNCisgICAgICAgICAgICAgICAgICA6IGE7DQorICBpbnQzMl90IGQgPSBnZXRNYXhXaWR0aCgoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKENCQ19SZXN1bHRQb2ludCopcC5HZXRBdCg1KSkgPCBiDQorICAgICAgICAgICAgICAgICAgPyBnZXRNYXhXaWR0aCgoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENCQ19SZXN1bHRQb2ludCopcC5HZXRBdCg1KSkNCisgICAgICAgICAgICAgICAgICA6IGI7DQorICByZXR1cm4gYyA8IGQgPyBjIDogZDsNCit9DQoraW50MzJfdCBDQkNfUERGNDE3UmVhZGVyOjpnZXRNaW5Db2Rld29yZFdpZHRoKENGWF9QdHJBcnJheSYgcCkgew0KKyAgaW50MzJfdCBhID0NCisgICAgICBnZXRNaW5XaWR0aCgoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDYpLCAoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDIpKSAqDQorICAgICAgQ0JDX1BERjQxN0NvbW1vbjo6TU9EVUxFU19JTl9DT0RFV09SRCAvDQorICAgICAgQ0JDX1BERjQxN0NvbW1vbjo6TU9EVUxFU19JTl9TVE9QX1BBVFRFUk47DQorICBpbnQzMl90IGIgPQ0KKyAgICAgIGdldE1pbldpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoNyksIChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMykpICoNCisgICAgICBDQkNfUERGNDE3Q29tbW9uOjpNT0RVTEVTX0lOX0NPREVXT1JEIC8NCisgICAgICBDQkNfUERGNDE3Q29tbW9uOjpNT0RVTEVTX0lOX1NUT1BfUEFUVEVSTjsNCisgIGludDMyX3QgYyA9IGdldE1pbldpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDQpKSA8IGENCisgICAgICAgICAgICAgICAgICA/IGdldE1pbldpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDQpKQ0KKyAgICAgICAgICAgICAgICAgIDogYTsNCisgIGludDMyX3QgZCA9IGdldE1pbldpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDUpKSA8IGINCisgICAgICAgICAgICAgICAgICA/IGdldE1pbldpZHRoKChDQkNfUmVzdWx0UG9pbnQqKXAuR2V0QXQoMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0JDX1Jlc3VsdFBvaW50KilwLkdldEF0KDUpKQ0KKyAgICAgICAgICAgICAgICAgIDogYjsNCisgIHJldHVybiBjIDwgZCA/IGMgOiBkOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3UmVhZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3UmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk5YjkzNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdSZWFkZXIuaApAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1BERjQxN1JFQURFUl9IXw0KKyNkZWZpbmUgX0JDX1BERjQxN1JFQURFUl9IXw0KK2NsYXNzIENCQ19CaW5hcnlCaXRtYXA7DQorY2xhc3MgQ0JDX1Jlc3VsdFBvaW50Ow0KK2NsYXNzIENCQ19QREY0MTdSZWFkZXI7DQorY2xhc3MgQ0JDX1BERjQxN1JlYWRlciA6IHB1YmxpYyBDQkNfUmVhZGVyIHsNCisgcHVibGljOg0KKyAgQ0JDX1BERjQxN1JlYWRlcigpOw0KKyAgdmlydHVhbCB+Q0JDX1BERjQxN1JlYWRlcigpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlKENCQ19CaW5hcnlCaXRtYXAqIGltYWdlLCBpbnQzMl90JiBlKTsNCisgIENGWF9CeXRlU3RyaW5nIERlY29kZShDQkNfQmluYXJ5Qml0bWFwKiBpbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIG11bHRpcGxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBDRlhfQnl0ZVN0cmluZyBEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCogaW1hZ2UsIGludDMyX3QgaGludHMsIGludDMyX3QmIGUpOw0KKw0KKyBwcml2YXRlOg0KKyAgc3RhdGljIGludDMyX3QgZ2V0TWF4V2lkdGgoQ0JDX1Jlc3VsdFBvaW50KiBwMSwgQ0JDX1Jlc3VsdFBvaW50KiBwMik7DQorICBzdGF0aWMgaW50MzJfdCBnZXRNaW5XaWR0aChDQkNfUmVzdWx0UG9pbnQqIHAxLCBDQkNfUmVzdWx0UG9pbnQqIHAyKTsNCisgIHN0YXRpYyBpbnQzMl90IGdldE1heENvZGV3b3JkV2lkdGgoQ0ZYX1B0ckFycmF5JiBwKTsNCisgIHN0YXRpYyBpbnQzMl90IGdldE1pbkNvZGV3b3JkV2lkdGgoQ0ZYX1B0ckFycmF5JiBwKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdSZXN1bHRNZXRhZGF0YS5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3UmVzdWx0TWV0YWRhdGEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOGFlNTEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3UmVzdWx0TWV0YWRhdGEuY3BwCkBAIC0wLDAgKzEsNTAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMTMgWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdSZXN1bHRNZXRhZGF0YS5oIg0KK0NCQ19QREY0MTdSZXN1bHRNZXRhZGF0YTo6Q0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhKCkge30NCitDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGE6On5DQkNfUERGNDE3UmVzdWx0TWV0YWRhdGEoKSB7fQ0KK2ludDMyX3QgQ0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhOjpnZXRTZWdtZW50SW5kZXgoKSB7DQorICByZXR1cm4gbV9zZWdtZW50SW5kZXg7DQorfQ0KK3ZvaWQgQ0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhOjpzZXRTZWdtZW50SW5kZXgoaW50MzJfdCBzZWdtZW50SW5kZXgpIHsNCisgIG1fc2VnbWVudEluZGV4ID0gc2VnbWVudEluZGV4Ow0KK30NCitDRlhfQnl0ZVN0cmluZyBDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGE6OmdldEZpbGVJZCgpIHsNCisgIHJldHVybiBtX2ZpbGVJZDsNCit9DQordm9pZCBDQkNfUERGNDE3UmVzdWx0TWV0YWRhdGE6OnNldEZpbGVJZChDRlhfQnl0ZVN0cmluZyBmaWxlSWQpIHsNCisgIG1fZmlsZUlkID0gZmlsZUlkOw0KK30NCitDRlhfSW50MzJBcnJheSYgQ0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhOjpnZXRPcHRpb25hbERhdGEoKSB7DQorICByZXR1cm4gbV9vcHRpb25hbERhdGE7DQorfQ0KK3ZvaWQgQ0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhOjpzZXRPcHRpb25hbERhdGEoQ0ZYX0ludDMyQXJyYXkmIG9wdGlvbmFsRGF0YSkgew0KKyAgbV9vcHRpb25hbERhdGEuQ29weShvcHRpb25hbERhdGEpOw0KK30NCitGWF9CT09MIENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YTo6aXNMYXN0U2VnbWVudCgpIHsNCisgIHJldHVybiBtX2xhc3RTZWdtZW50Ow0KK30NCit2b2lkIENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YTo6c2V0TGFzdFNlZ21lbnQoRlhfQk9PTCBsYXN0U2VnbWVudCkgew0KKyAgbV9sYXN0U2VnbWVudCA9IGxhc3RTZWdtZW50Ow0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3UmVzdWx0TWV0YWRhdGEuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdSZXN1bHRNZXRhZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNDUzMDYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3UmVzdWx0TWV0YWRhdGEuaApAQCAtMCwwICsxLDI4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1BERjQxN1JFQURFUl9IXw0KKyNkZWZpbmUgX0JDX1BERjQxN1JFQURFUl9IXw0KK2NsYXNzIENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YSB7DQorIHB1YmxpYzoNCisgIENCQ19QREY0MTdSZXN1bHRNZXRhZGF0YSgpOw0KKyAgdmlydHVhbCB+Q0JDX1BERjQxN1Jlc3VsdE1ldGFkYXRhKCk7DQorICBpbnQzMl90IGdldFNlZ21lbnRJbmRleCgpOw0KKyAgdm9pZCBzZXRTZWdtZW50SW5kZXgoaW50MzJfdCBzZWdtZW50SW5kZXgpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgZ2V0RmlsZUlkKCk7DQorICB2b2lkIHNldEZpbGVJZChDRlhfQnl0ZVN0cmluZyBmaWxlSWQpOw0KKyAgQ0ZYX0ludDMyQXJyYXkmIGdldE9wdGlvbmFsRGF0YSgpOw0KKyAgdm9pZCBzZXRPcHRpb25hbERhdGEoQ0ZYX0ludDMyQXJyYXkmIG9wdGlvbmFsRGF0YSk7DQorICBGWF9CT09MIGlzTGFzdFNlZ21lbnQoKTsNCisgIHZvaWQgc2V0TGFzdFNlZ21lbnQoRlhfQk9PTCBsYXN0U2VnbWVudCk7DQorDQorIHByaXZhdGU6DQorICBpbnQzMl90IG1fc2VnbWVudEluZGV4Ow0KKyAgQ0ZYX0J5dGVTdHJpbmcgbV9maWxlSWQ7DQorICBDRlhfSW50MzJBcnJheSBtX29wdGlvbmFsRGF0YTsNCisgIEZYX0JPT0wgbV9sYXN0U2VnbWVudDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdTY2FubmluZ0RlY29kZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQyZWE4ZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdTY2FubmluZ0RlY29kZXIuY3BwCkBAIC0wLDAgKzEsNzUwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDEzIFpYaW5nIGF1dGhvcnMNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfRGVjb2RlclJlc3VsdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19SZXN1bHRQb2ludC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0NvZGV3b3JkLmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0NvbW1vbi5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdCYXJjb2RlVmFsdWUuaCINCisjaW5jbHVkZSAiQkNfUERGNDE3QmFyY29kZU1ldGFkYXRhLmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0JvdW5kaW5nQm94LmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0RldGVjdGlvblJlc3VsdENvbHVtbi5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdEZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4uaCINCisjaW5jbHVkZSAiQkNfUERGNDE3RGV0ZWN0aW9uUmVzdWx0LmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0RlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCINCisjaW5jbHVkZSAiQkNfUERGNDE3Q29kZXdvcmREZWNvZGVyLmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN0RlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCINCisjaW5jbHVkZSAiQkNfUERGNDE3RUNNb2R1bHVzUG9seS5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdFQ01vZHVsdXNHRi5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdFQ0Vycm9yQ29ycmVjdGlvbi5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN1NjYW5uaW5nRGVjb2Rlci5oIg0KK2ludDMyX3QgQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6Q09ERVdPUkRfU0tFV19TSVpFID0gMjsNCitpbnQzMl90IENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6Ok1BWF9FUlJPUlMgPSAzOw0KK2ludDMyX3QgQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6TUFYX0VDX0NPREVXT1JEUyA9IDUxMjsNCitDQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb24qIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmVycm9yQ29ycmVjdGlvbiA9IE5VTEw7DQorQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6Q0JDX1BERjQxN1NjYW5uaW5nRGVjb2RlcigpIHt9DQorQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6fkNCQ19QREY0MTdTY2FubmluZ0RlY29kZXIoKSB7fQ0KK3ZvaWQgQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6SW5pdGlhbGl6ZSgpIHsNCisgIGVycm9yQ29ycmVjdGlvbiA9IG5ldyBDQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb247DQorfQ0KK3ZvaWQgQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6RmluYWxpemUoKSB7DQorICBkZWxldGUgZXJyb3JDb3JyZWN0aW9uOw0KK30NCitDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6ZGVjb2RlKA0KKyAgICBDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSwNCisgICAgQ0JDX1Jlc3VsdFBvaW50KiBpbWFnZVRvcExlZnQsDQorICAgIENCQ19SZXN1bHRQb2ludCogaW1hZ2VCb3R0b21MZWZ0LA0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIGltYWdlVG9wUmlnaHQsDQorICAgIENCQ19SZXN1bHRQb2ludCogaW1hZ2VCb3R0b21SaWdodCwNCisgICAgaW50MzJfdCBtaW5Db2Rld29yZFdpZHRoLA0KKyAgICBpbnQzMl90IG1heENvZGV3b3JkV2lkdGgsDQorICAgIGludDMyX3QmIGUpIHsNCisgIENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3ggPSBuZXcgQ0JDX0JvdW5kaW5nQm94KA0KKyAgICAgIGltYWdlLCBpbWFnZVRvcExlZnQsIGltYWdlQm90dG9tTGVmdCwgaW1hZ2VUb3BSaWdodCwgaW1hZ2VCb3R0b21SaWdodCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKiBsZWZ0Um93SW5kaWNhdG9yQ29sdW1uID0gTlVMTDsNCisgIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4qIHJpZ2h0Um93SW5kaWNhdG9yQ29sdW1uID0gTlVMTDsNCisgIENCQ19EZXRlY3Rpb25SZXN1bHQqIGRldGVjdGlvblJlc3VsdCA9IE5VTEw7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAyOyBpKyspIHsNCisgICAgaWYgKGltYWdlVG9wTGVmdCAhPSBOVUxMKSB7DQorICAgICAgbGVmdFJvd0luZGljYXRvckNvbHVtbiA9DQorICAgICAgICAgIGdldFJvd0luZGljYXRvckNvbHVtbihpbWFnZSwgYm91bmRpbmdCb3gsICppbWFnZVRvcExlZnQsIFRSVUUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5Db2Rld29yZFdpZHRoLCBtYXhDb2Rld29yZFdpZHRoKTsNCisgICAgfQ0KKyAgICBpZiAoaW1hZ2VUb3BSaWdodCAhPSBOVUxMKSB7DQorICAgICAgcmlnaHRSb3dJbmRpY2F0b3JDb2x1bW4gPQ0KKyAgICAgICAgICBnZXRSb3dJbmRpY2F0b3JDb2x1bW4oaW1hZ2UsIGJvdW5kaW5nQm94LCAqaW1hZ2VUb3BSaWdodCwgRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5Db2Rld29yZFdpZHRoLCBtYXhDb2Rld29yZFdpZHRoKTsNCisgICAgfQ0KKyAgICBkZXRlY3Rpb25SZXN1bHQgPSBtZXJnZShsZWZ0Um93SW5kaWNhdG9yQ29sdW1uLCByaWdodFJvd0luZGljYXRvckNvbHVtbiwgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICBlID0gQkNFeGNlcHRpb250Tm90Rm91bmRJbnN0YW5jZTsNCisgICAgICBkZWxldGUgbGVmdFJvd0luZGljYXRvckNvbHVtbjsNCisgICAgICBkZWxldGUgcmlnaHRSb3dJbmRpY2F0b3JDb2x1bW47DQorICAgICAgZGVsZXRlIGJvdW5kaW5nQm94Ow0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIGlmIChpID09IDAgJiYgKGRldGVjdGlvblJlc3VsdC0+Z2V0Qm91bmRpbmdCb3goKS0+Z2V0TWluWSgpIDwNCisgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kaW5nQm94LT5nZXRNaW5ZKCkgfHwNCisgICAgICAgICAgICAgICAgICAgZGV0ZWN0aW9uUmVzdWx0LT5nZXRCb3VuZGluZ0JveCgpLT5nZXRNYXhZKCkgPg0KKyAgICAgICAgICAgICAgICAgICAgICAgYm91bmRpbmdCb3gtPmdldE1heFkoKSkpIHsNCisgICAgICBkZWxldGUgYm91bmRpbmdCb3g7DQorICAgICAgYm91bmRpbmdCb3ggPSBkZXRlY3Rpb25SZXN1bHQtPmdldEJvdW5kaW5nQm94KCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgZGV0ZWN0aW9uUmVzdWx0LT5zZXRCb3VuZGluZ0JveChib3VuZGluZ0JveCk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGludDMyX3QgbWF4QmFyY29kZUNvbHVtbiA9IGRldGVjdGlvblJlc3VsdC0+Z2V0QmFyY29kZUNvbHVtbkNvdW50KCkgKyAxOw0KKyAgZGV0ZWN0aW9uUmVzdWx0LT5zZXREZXRlY3Rpb25SZXN1bHRDb2x1bW4oMCwgbGVmdFJvd0luZGljYXRvckNvbHVtbik7DQorICBkZXRlY3Rpb25SZXN1bHQtPnNldERldGVjdGlvblJlc3VsdENvbHVtbihtYXhCYXJjb2RlQ29sdW1uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRSb3dJbmRpY2F0b3JDb2x1bW4pOw0KKyAgRlhfQk9PTCBsZWZ0VG9SaWdodCA9IGxlZnRSb3dJbmRpY2F0b3JDb2x1bW4gIT0gTlVMTDsNCisgIGZvciAoaW50MzJfdCBiYXJjb2RlQ29sdW1uQ291bnQgPSAxOyBiYXJjb2RlQ29sdW1uQ291bnQgPD0gbWF4QmFyY29kZUNvbHVtbjsNCisgICAgICAgYmFyY29kZUNvbHVtbkNvdW50KyspIHsNCisgICAgaW50MzJfdCBiYXJjb2RlQ29sdW1uID0gbGVmdFRvUmlnaHQgPyBiYXJjb2RlQ29sdW1uQ291bnQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtYXhCYXJjb2RlQ29sdW1uIC0gYmFyY29kZUNvbHVtbkNvdW50Ow0KKyAgICBpZiAoZGV0ZWN0aW9uUmVzdWx0LT5nZXREZXRlY3Rpb25SZXN1bHRDb2x1bW4oYmFyY29kZUNvbHVtbikgIT0gTlVMTCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qIGRldGVjdGlvblJlc3VsdENvbHVtbiA9IE5VTEw7DQorICAgIGlmIChiYXJjb2RlQ29sdW1uID09IDAgfHwgYmFyY29kZUNvbHVtbiA9PSBtYXhCYXJjb2RlQ29sdW1uKSB7DQorICAgICAgZGV0ZWN0aW9uUmVzdWx0Q29sdW1uID0gbmV3IENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4oDQorICAgICAgICAgIGJvdW5kaW5nQm94LCBiYXJjb2RlQ29sdW1uID09IDApOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGRldGVjdGlvblJlc3VsdENvbHVtbiA9IG5ldyBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKGJvdW5kaW5nQm94KTsNCisgICAgfQ0KKyAgICBkZXRlY3Rpb25SZXN1bHQtPnNldERldGVjdGlvblJlc3VsdENvbHVtbihiYXJjb2RlQ29sdW1uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3Rpb25SZXN1bHRDb2x1bW4pOw0KKyAgICBpbnQzMl90IHN0YXJ0Q29sdW1uID0gLTE7DQorICAgIGludDMyX3QgcHJldmlvdXNTdGFydENvbHVtbiA9IHN0YXJ0Q29sdW1uOw0KKyAgICBmb3IgKGludDMyX3QgaW1hZ2VSb3cgPSBib3VuZGluZ0JveC0+Z2V0TWluWSgpOw0KKyAgICAgICAgIGltYWdlUm93IDw9IGJvdW5kaW5nQm94LT5nZXRNYXhZKCk7IGltYWdlUm93KyspIHsNCisgICAgICBzdGFydENvbHVtbiA9DQorICAgICAgICAgIGdldFN0YXJ0Q29sdW1uKGRldGVjdGlvblJlc3VsdCwgYmFyY29kZUNvbHVtbiwgaW1hZ2VSb3csIGxlZnRUb1JpZ2h0KTsNCisgICAgICBpZiAoc3RhcnRDb2x1bW4gPCAwIHx8IHN0YXJ0Q29sdW1uID4gYm91bmRpbmdCb3gtPmdldE1heFgoKSkgew0KKyAgICAgICAgaWYgKHByZXZpb3VzU3RhcnRDb2x1bW4gPT0gLTEpIHsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBzdGFydENvbHVtbiA9IHByZXZpb3VzU3RhcnRDb2x1bW47DQorICAgICAgfQ0KKyAgICAgIENCQ19Db2Rld29yZCogY29kZXdvcmQgPSBkZXRlY3RDb2Rld29yZCgNCisgICAgICAgICAgaW1hZ2UsIGJvdW5kaW5nQm94LT5nZXRNaW5YKCksIGJvdW5kaW5nQm94LT5nZXRNYXhYKCksIGxlZnRUb1JpZ2h0LA0KKyAgICAgICAgICBzdGFydENvbHVtbiwgaW1hZ2VSb3csIG1pbkNvZGV3b3JkV2lkdGgsIG1heENvZGV3b3JkV2lkdGgpOw0KKyAgICAgIGlmIChjb2Rld29yZCAhPSBOVUxMKSB7DQorICAgICAgICBkZXRlY3Rpb25SZXN1bHRDb2x1bW4tPnNldENvZGV3b3JkKGltYWdlUm93LCBjb2Rld29yZCk7DQorICAgICAgICBwcmV2aW91c1N0YXJ0Q29sdW1uID0gc3RhcnRDb2x1bW47DQorICAgICAgICBtaW5Db2Rld29yZFdpZHRoID0gbWluQ29kZXdvcmRXaWR0aCA8IGNvZGV3b3JkLT5nZXRXaWR0aCgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbWluQ29kZXdvcmRXaWR0aA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvZGV3b3JkLT5nZXRXaWR0aCgpOw0KKyAgICAgICAgbWF4Q29kZXdvcmRXaWR0aCA9IG1heENvZGV3b3JkV2lkdGggPiBjb2Rld29yZC0+Z2V0V2lkdGgoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1heENvZGV3b3JkV2lkdGgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb2Rld29yZC0+Z2V0V2lkdGgoKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBkZWNvZGVycmVzdWx0ID0NCisgICAgICBjcmVhdGVEZWNvZGVyUmVzdWx0KGRldGVjdGlvblJlc3VsdCwgZSk7DQorICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgIGRlbGV0ZSBkZXRlY3Rpb25SZXN1bHQ7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIGRlY29kZXJyZXN1bHQ7DQorfQ0KK0NGWF9CeXRlU3RyaW5nIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OnRvU3RyaW5nKA0KKyAgICBDRlhfUHRyQXJyYXkqIGJhcmNvZGVNYXRyaXgpIHsNCisgIENGWF9CeXRlU3RyaW5nIHJlc3VsdDsNCisgIGZvciAoaW50MzJfdCByb3cgPSAwOyByb3cgPCBiYXJjb2RlTWF0cml4LT5HZXRTaXplKCk7IHJvdysrKSB7DQorICAgIHJlc3VsdCArPSByb3c7DQorICAgIGludDMyX3QgbCA9IDA7DQorICAgIGZvciAoOyBsIDwgKChDRlhfUHRyQXJyYXkqKWJhcmNvZGVNYXRyaXgtPkdldEF0KHJvdykpLT5HZXRTaXplKCk7IGwrKykgew0KKyAgICAgIENCQ19CYXJjb2RlVmFsdWUqIGJhcmNvZGVWYWx1ZSA9DQorICAgICAgICAgIChDQkNfQmFyY29kZVZhbHVlKikoKENGWF9QdHJBcnJheSopYmFyY29kZU1hdHJpeC0+R2V0QXQocm93KSkNCisgICAgICAgICAgICAgIC0+R2V0QXQobCk7DQorICAgICAgaWYgKGJhcmNvZGVWYWx1ZS0+Z2V0VmFsdWUoKS0+R2V0U2l6ZSgpID09IDApIHsNCisgICAgICAgIHJlc3VsdCArPSAiIjsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcmVzdWx0ICs9IGJhcmNvZGVWYWx1ZS0+Z2V0VmFsdWUoKS0+R2V0QXQoMCk7DQorICAgICAgICByZXN1bHQgKz0NCisgICAgICAgICAgICBiYXJjb2RlVmFsdWUtPmdldENvbmZpZGVuY2UoYmFyY29kZVZhbHVlLT5nZXRWYWx1ZSgpLT5HZXRBdCgwKSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gcmVzdWx0Ow0KK30NCitDQkNfRGV0ZWN0aW9uUmVzdWx0KiBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjptZXJnZSgNCisgICAgQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiogbGVmdFJvd0luZGljYXRvckNvbHVtbiwNCisgICAgQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiogcmlnaHRSb3dJbmRpY2F0b3JDb2x1bW4sDQorICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChsZWZ0Um93SW5kaWNhdG9yQ29sdW1uID09IE5VTEwgJiYgcmlnaHRSb3dJbmRpY2F0b3JDb2x1bW4gPT0gTlVMTCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0JDX0JhcmNvZGVNZXRhZGF0YSogYmFyY29kZU1ldGFkYXRhID0NCisgICAgICBnZXRCYXJjb2RlTWV0YWRhdGEobGVmdFJvd0luZGljYXRvckNvbHVtbiwgcmlnaHRSb3dJbmRpY2F0b3JDb2x1bW4pOw0KKyAgaWYgKGJhcmNvZGVNZXRhZGF0YSA9PSBOVUxMKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkNhbm5vdE1ldGFkYXRhOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENCQ19Cb3VuZGluZ0JveCogbGVmdGJvdW5kaW5nQm94ID0NCisgICAgICBhZGp1c3RCb3VuZGluZ0JveChsZWZ0Um93SW5kaWNhdG9yQ29sdW1uLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgZGVsZXRlIGJhcmNvZGVNZXRhZGF0YTsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDQkNfQm91bmRpbmdCb3gqIHJpZ2h0Ym91bmRpbmdCb3ggPQ0KKyAgICAgIGFkanVzdEJvdW5kaW5nQm94KHJpZ2h0Um93SW5kaWNhdG9yQ29sdW1uLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgZGVsZXRlIGJhcmNvZGVNZXRhZGF0YTsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDQkNfQm91bmRpbmdCb3gqIGJvdW5kaW5nQm94ID0NCisgICAgICBDQkNfQm91bmRpbmdCb3g6Om1lcmdlKGxlZnRib3VuZGluZ0JveCwgcmlnaHRib3VuZGluZ0JveCwgZSk7DQorICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgIGRlbGV0ZSBiYXJjb2RlTWV0YWRhdGE7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0JDX0RldGVjdGlvblJlc3VsdCogZGV0ZWN0aW9ucmVzdWx0ID0NCisgICAgICBuZXcgQ0JDX0RldGVjdGlvblJlc3VsdChiYXJjb2RlTWV0YWRhdGEsIGJvdW5kaW5nQm94KTsNCisgIHJldHVybiBkZXRlY3Rpb25yZXN1bHQ7DQorfQ0KK0NCQ19Cb3VuZGluZ0JveCogQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6YWRqdXN0Qm91bmRpbmdCb3goDQorICAgIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4qIHJvd0luZGljYXRvckNvbHVtbiwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKHJvd0luZGljYXRvckNvbHVtbiA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0ZYX0ludDMyQXJyYXkqIHJvd0hlaWdodHMgPSByb3dJbmRpY2F0b3JDb2x1bW4tPmdldFJvd0hlaWdodHMoZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBpbnQzMl90IG1heFJvd0hlaWdodCA9IGdldE1heCgqcm93SGVpZ2h0cyk7DQorICBpbnQzMl90IG1pc3NpbmdTdGFydFJvd3MgPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcm93SGVpZ2h0cy0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgaW50MzJfdCByb3dIZWlnaHQgPSByb3dIZWlnaHRzLT5HZXRBdChpKTsNCisgICAgbWlzc2luZ1N0YXJ0Um93cyArPSBtYXhSb3dIZWlnaHQgLSByb3dIZWlnaHQ7DQorICAgIGlmIChyb3dIZWlnaHQgPiAwKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIENGWF9QdHJBcnJheSogY29kZXdvcmRzID0gcm93SW5kaWNhdG9yQ29sdW1uLT5nZXRDb2Rld29yZHMoKTsNCisgIGZvciAoaW50MzJfdCByb3cgPSAwOyBtaXNzaW5nU3RhcnRSb3dzID4gMCAmJiBjb2Rld29yZHMtPkdldEF0KHJvdykgPT0gTlVMTDsNCisgICAgICAgcm93KyspIHsNCisgICAgbWlzc2luZ1N0YXJ0Um93cy0tOw0KKyAgfQ0KKyAgaW50MzJfdCBtaXNzaW5nRW5kUm93cyA9IDA7DQorICBmb3IgKGludDMyX3Qgcm93MSA9IHJvd0hlaWdodHMtPkdldFNpemUoKSAtIDE7IHJvdzEgPj0gMDsgcm93MS0tKSB7DQorICAgIG1pc3NpbmdFbmRSb3dzICs9IG1heFJvd0hlaWdodCAtIHJvd0hlaWdodHMtPkdldEF0KHJvdzEpOw0KKyAgICBpZiAocm93SGVpZ2h0cy0+R2V0QXQocm93MSkgPiAwKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGZvciAoaW50MzJfdCByb3cyID0gY29kZXdvcmRzLT5HZXRTaXplKCkgLSAxOw0KKyAgICAgICBtaXNzaW5nRW5kUm93cyA+IDAgJiYgY29kZXdvcmRzLT5HZXRBdChyb3cyKSA9PSBOVUxMOyByb3cyLS0pIHsNCisgICAgbWlzc2luZ0VuZFJvd3MtLTsNCisgIH0NCisgIENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3ggPQ0KKyAgICAgIHJvd0luZGljYXRvckNvbHVtbi0+Z2V0Qm91bmRpbmdCb3goKS0+YWRkTWlzc2luZ1Jvd3MoDQorICAgICAgICAgIG1pc3NpbmdTdGFydFJvd3MsIG1pc3NpbmdFbmRSb3dzLCByb3dJbmRpY2F0b3JDb2x1bW4tPmlzTGVmdCgpLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiBib3VuZGluZ0JveDsNCit9DQoraW50MzJfdCBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpnZXRNYXgoQ0ZYX0ludDMyQXJyYXkmIHZhbHVlcykgew0KKyAgaW50MzJfdCBtYXhWYWx1ZSA9IC0xOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgdmFsdWVzLkdldFNpemUoKTsgaSsrKSB7DQorICAgIGludDMyX3QgdmFsdWUgPSB2YWx1ZXMuR2V0QXQoaSk7DQorICAgIG1heFZhbHVlID0gbWF4VmFsdWUgPiB2YWx1ZSA/IG1heFZhbHVlIDogdmFsdWU7DQorICB9DQorICByZXR1cm4gbWF4VmFsdWU7DQorfQ0KK0NCQ19CYXJjb2RlTWV0YWRhdGEqIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmdldEJhcmNvZGVNZXRhZGF0YSgNCisgICAgQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiogbGVmdFJvd0luZGljYXRvckNvbHVtbiwNCisgICAgQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiogcmlnaHRSb3dJbmRpY2F0b3JDb2x1bW4pIHsNCisgIENCQ19CYXJjb2RlTWV0YWRhdGEqIGxlZnRCYXJjb2RlTWV0YWRhdGEgPSBOVUxMOw0KKyAgQ0JDX0JhcmNvZGVNZXRhZGF0YSogcmlnaHRCYXJjb2RlTWV0YWRhdGEgPSBOVUxMOw0KKyAgaWYgKGxlZnRSb3dJbmRpY2F0b3JDb2x1bW4gPT0gTlVMTCB8fA0KKyAgICAgIChsZWZ0QmFyY29kZU1ldGFkYXRhID0gbGVmdFJvd0luZGljYXRvckNvbHVtbi0+Z2V0QmFyY29kZU1ldGFkYXRhKCkpID09DQorICAgICAgICAgIE5VTEwpIHsNCisgICAgcmV0dXJuIHJpZ2h0Um93SW5kaWNhdG9yQ29sdW1uID09IE5VTEwNCisgICAgICAgICAgICAgICA/IE5VTEwNCisgICAgICAgICAgICAgICA6IHJpZ2h0Um93SW5kaWNhdG9yQ29sdW1uLT5nZXRCYXJjb2RlTWV0YWRhdGEoKTsNCisgIH0NCisgIGlmIChyaWdodFJvd0luZGljYXRvckNvbHVtbiA9PSBOVUxMIHx8DQorICAgICAgKHJpZ2h0QmFyY29kZU1ldGFkYXRhID0gcmlnaHRSb3dJbmRpY2F0b3JDb2x1bW4tPmdldEJhcmNvZGVNZXRhZGF0YSgpKSA9PQ0KKyAgICAgICAgICBOVUxMKSB7DQorICAgIHJldHVybiBsZWZ0Um93SW5kaWNhdG9yQ29sdW1uID09IE5VTEwNCisgICAgICAgICAgICAgICA/IE5VTEwNCisgICAgICAgICAgICAgICA6IGxlZnRSb3dJbmRpY2F0b3JDb2x1bW4tPmdldEJhcmNvZGVNZXRhZGF0YSgpOw0KKyAgfQ0KKyAgaWYgKGxlZnRCYXJjb2RlTWV0YWRhdGEtPmdldENvbHVtbkNvdW50KCkgIT0NCisgICAgICAgICAgcmlnaHRCYXJjb2RlTWV0YWRhdGEtPmdldENvbHVtbkNvdW50KCkgJiYNCisgICAgICBsZWZ0QmFyY29kZU1ldGFkYXRhLT5nZXRFcnJvckNvcnJlY3Rpb25MZXZlbCgpICE9DQorICAgICAgICAgIHJpZ2h0QmFyY29kZU1ldGFkYXRhLT5nZXRFcnJvckNvcnJlY3Rpb25MZXZlbCgpICYmDQorICAgICAgbGVmdEJhcmNvZGVNZXRhZGF0YS0+Z2V0Um93Q291bnQoKSAhPQ0KKyAgICAgICAgICByaWdodEJhcmNvZGVNZXRhZGF0YS0+Z2V0Um93Q291bnQoKSkgew0KKyAgICBkZWxldGUgbGVmdEJhcmNvZGVNZXRhZGF0YTsNCisgICAgZGVsZXRlIHJpZ2h0QmFyY29kZU1ldGFkYXRhOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGRlbGV0ZSByaWdodEJhcmNvZGVNZXRhZGF0YTsNCisgIHJldHVybiBsZWZ0QmFyY29kZU1ldGFkYXRhOw0KK30NCitDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKg0KK0NCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmdldFJvd0luZGljYXRvckNvbHVtbihDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0JvdW5kaW5nQm94KiBib3VuZGluZ0JveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50IHN0YXJ0UG9pbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgbGVmdFRvUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWluQ29kZXdvcmRXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhDb2Rld29yZFdpZHRoKSB7DQorICBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKiByb3dJbmRpY2F0b3JDb2x1bW4gPQ0KKyAgICAgIG5ldyBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKGJvdW5kaW5nQm94LCBsZWZ0VG9SaWdodCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAyOyBpKyspIHsNCisgICAgaW50MzJfdCBpbmNyZW1lbnQgPSBpID09IDAgPyAxIDogLTE7DQorICAgIGludDMyX3Qgc3RhcnRDb2x1bW4gPSAoaW50MzJfdClzdGFydFBvaW50LkdldFgoKTsNCisgICAgZm9yIChpbnQzMl90IGltYWdlUm93ID0gKGludDMyX3Qpc3RhcnRQb2ludC5HZXRZKCk7DQorICAgICAgICAgaW1hZ2VSb3cgPD0gYm91bmRpbmdCb3gtPmdldE1heFkoKSAmJg0KKyAgICAgICAgIGltYWdlUm93ID49IGJvdW5kaW5nQm94LT5nZXRNaW5ZKCk7DQorICAgICAgICAgaW1hZ2VSb3cgKz0gaW5jcmVtZW50KSB7DQorICAgICAgQ0JDX0NvZGV3b3JkKiBjb2Rld29yZCA9DQorICAgICAgICAgIGRldGVjdENvZGV3b3JkKGltYWdlLCAwLCBpbWFnZS0+R2V0V2lkdGgoKSwgbGVmdFRvUmlnaHQsIHN0YXJ0Q29sdW1uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVJvdywgbWluQ29kZXdvcmRXaWR0aCwgbWF4Q29kZXdvcmRXaWR0aCk7DQorICAgICAgaWYgKGNvZGV3b3JkICE9IE5VTEwpIHsNCisgICAgICAgIHJvd0luZGljYXRvckNvbHVtbi0+c2V0Q29kZXdvcmQoaW1hZ2VSb3csIGNvZGV3b3JkKTsNCisgICAgICAgIGlmIChsZWZ0VG9SaWdodCkgew0KKyAgICAgICAgICBzdGFydENvbHVtbiA9IGNvZGV3b3JkLT5nZXRTdGFydFgoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHN0YXJ0Q29sdW1uID0gY29kZXdvcmQtPmdldEVuZFgoKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiByb3dJbmRpY2F0b3JDb2x1bW47DQorfQ0KK3ZvaWQgQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6YWRqdXN0Q29kZXdvcmRDb3VudCgNCisgICAgQ0JDX0RldGVjdGlvblJlc3VsdCogZGV0ZWN0aW9uUmVzdWx0LA0KKyAgICBDRlhfUHRyQXJyYXkqIGJhcmNvZGVNYXRyaXgsDQorICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9JbnQzMkFycmF5KiBudW1iZXJPZkNvZGV3b3JkcyA9DQorICAgICAgKChDQkNfQmFyY29kZVZhbHVlKikoKENGWF9QdHJBcnJheSopYmFyY29kZU1hdHJpeC0+R2V0QXQoMCkpLT5HZXRBdCgxKSkNCisgICAgICAgICAgLT5nZXRWYWx1ZSgpOw0KKyAgaW50MzJfdCBjYWxjdWxhdGVkTnVtYmVyT2ZDb2Rld29yZHMgPQ0KKyAgICAgIGRldGVjdGlvblJlc3VsdC0+Z2V0QmFyY29kZUNvbHVtbkNvdW50KCkgKg0KKyAgICAgICAgICBkZXRlY3Rpb25SZXN1bHQtPmdldEJhcmNvZGVSb3dDb3VudCgpIC0NCisgICAgICBnZXROdW1iZXJPZkVDQ29kZVdvcmRzKGRldGVjdGlvblJlc3VsdC0+Z2V0QmFyY29kZUVDTGV2ZWwoKSk7DQorICBpZiAobnVtYmVyT2ZDb2Rld29yZHMtPkdldFNpemUoKSA9PSAwKSB7DQorICAgIGlmIChjYWxjdWxhdGVkTnVtYmVyT2ZDb2Rld29yZHMgPCAxIHx8DQorICAgICAgICBjYWxjdWxhdGVkTnVtYmVyT2ZDb2Rld29yZHMgPg0KKyAgICAgICAgICAgIENCQ19QREY0MTdDb21tb246Ok1BWF9DT0RFV09SRFNfSU5fQkFSQ09ERSkgew0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbnROb3RGb3VuZEluc3RhbmNlOw0KKyAgICAgIGRlbGV0ZSBudW1iZXJPZkNvZGV3b3JkczsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KKyAgICAoKENCQ19CYXJjb2RlVmFsdWUqKSgoQ0ZYX1B0ckFycmF5KiliYXJjb2RlTWF0cml4LT5HZXRBdCgwKSktPkdldEF0KDEpKQ0KKyAgICAgICAgLT5zZXRWYWx1ZShjYWxjdWxhdGVkTnVtYmVyT2ZDb2Rld29yZHMpOw0KKyAgfSBlbHNlIGlmIChudW1iZXJPZkNvZGV3b3Jkcy0+R2V0QXQoMCkgIT0gY2FsY3VsYXRlZE51bWJlck9mQ29kZXdvcmRzKSB7DQorICAgICgoQ0JDX0JhcmNvZGVWYWx1ZSopKChDRlhfUHRyQXJyYXkqKWJhcmNvZGVNYXRyaXgtPkdldEF0KDApKS0+R2V0QXQoMSkpDQorICAgICAgICAtPnNldFZhbHVlKGNhbGN1bGF0ZWROdW1iZXJPZkNvZGV3b3Jkcyk7DQorICB9DQorICBkZWxldGUgbnVtYmVyT2ZDb2Rld29yZHM7DQorfQ0KK0NCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpjcmVhdGVEZWNvZGVyUmVzdWx0KA0KKyAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0KiBkZXRlY3Rpb25SZXN1bHQsDQorICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9QdHJBcnJheSogYmFyY29kZU1hdHJpeCA9IGNyZWF0ZUJhcmNvZGVNYXRyaXgoZGV0ZWN0aW9uUmVzdWx0KTsNCisgIGFkanVzdENvZGV3b3JkQ291bnQoZGV0ZWN0aW9uUmVzdWx0LCBiYXJjb2RlTWF0cml4LCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYmFyY29kZU1hdHJpeC0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICBDRlhfUHRyQXJyYXkqIHRlbXAgPSAoQ0ZYX1B0ckFycmF5KiliYXJjb2RlTWF0cml4LT5HZXRBdChpKTsNCisgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCB0ZW1wLT5HZXRTaXplKCk7IGorKykgew0KKyAgICAgICAgZGVsZXRlIChDQkNfQmFyY29kZVZhbHVlKil0ZW1wLT5HZXRBdChqKTsNCisgICAgICB9DQorICAgICAgdGVtcC0+UmVtb3ZlQWxsKCk7DQorICAgICAgZGVsZXRlIHRlbXA7DQorICAgIH0NCisgICAgYmFyY29kZU1hdHJpeC0+UmVtb3ZlQWxsKCk7DQorICAgIGRlbGV0ZSBiYXJjb2RlTWF0cml4Ow0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENGWF9JbnQzMkFycmF5IGVyYXN1cmVzOw0KKyAgQ0ZYX0ludDMyQXJyYXkgY29kZXdvcmRzOw0KKyAgY29kZXdvcmRzLlNldFNpemUoZGV0ZWN0aW9uUmVzdWx0LT5nZXRCYXJjb2RlUm93Q291bnQoKSAqDQorICAgICAgICAgICAgICAgICAgICBkZXRlY3Rpb25SZXN1bHQtPmdldEJhcmNvZGVDb2x1bW5Db3VudCgpKTsNCisgIENGWF9QdHJBcnJheSBhbWJpZ3VvdXNJbmRleFZhbHVlc0xpc3Q7DQorICBDRlhfSW50MzJBcnJheSBhbWJpZ3VvdXNJbmRleGVzTGlzdDsNCisgIGZvciAoaW50MzJfdCByb3cgPSAwOyByb3cgPCBkZXRlY3Rpb25SZXN1bHQtPmdldEJhcmNvZGVSb3dDb3VudCgpOyByb3crKykgew0KKyAgICBmb3IgKGludDMyX3QgbCA9IDA7IGwgPCBkZXRlY3Rpb25SZXN1bHQtPmdldEJhcmNvZGVDb2x1bW5Db3VudCgpOyBsKyspIHsNCisgICAgICBDRlhfSW50MzJBcnJheSogdmFsdWVzID0NCisgICAgICAgICAgKChDQkNfQmFyY29kZVZhbHVlKikoKENGWF9QdHJBcnJheSopYmFyY29kZU1hdHJpeC0+R2V0QXQocm93KSkNCisgICAgICAgICAgICAgICAtPkdldEF0KGwgKyAxKSkNCisgICAgICAgICAgICAgIC0+Z2V0VmFsdWUoKTsNCisgICAgICBpbnQzMl90IGNvZGV3b3JkSW5kZXggPQ0KKyAgICAgICAgICByb3cgKiBkZXRlY3Rpb25SZXN1bHQtPmdldEJhcmNvZGVDb2x1bW5Db3VudCgpICsgbDsNCisgICAgICBpZiAodmFsdWVzLT5HZXRTaXplKCkgPT0gMCkgew0KKyAgICAgICAgZXJhc3VyZXMuQWRkKGNvZGV3b3JkSW5kZXgpOw0KKyAgICAgIH0gZWxzZSBpZiAodmFsdWVzLT5HZXRTaXplKCkgPT0gMSkgew0KKyAgICAgICAgY29kZXdvcmRzW2NvZGV3b3JkSW5kZXhdID0gdmFsdWVzLT5HZXRBdCgwKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgYW1iaWd1b3VzSW5kZXhlc0xpc3QuQWRkKGNvZGV3b3JkSW5kZXgpOw0KKyAgICAgICAgYW1iaWd1b3VzSW5kZXhWYWx1ZXNMaXN0LkFkZCh2YWx1ZXMpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgQ0ZYX1B0ckFycmF5IGFtYmlndW91c0luZGV4VmFsdWVzOw0KKyAgYW1iaWd1b3VzSW5kZXhWYWx1ZXMuU2V0U2l6ZShhbWJpZ3VvdXNJbmRleFZhbHVlc0xpc3QuR2V0U2l6ZSgpKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFtYmlndW91c0luZGV4VmFsdWVzLkdldFNpemUoKTsgaSsrKSB7DQorICAgIGFtYmlndW91c0luZGV4VmFsdWVzLlNldEF0KGksIGFtYmlndW91c0luZGV4VmFsdWVzTGlzdC5HZXRBdChpKSk7DQorICB9DQorICBmb3IgKGludDMyX3QgbCA9IDA7IGwgPCBiYXJjb2RlTWF0cml4LT5HZXRTaXplKCk7IGwrKykgew0KKyAgICBDRlhfUHRyQXJyYXkqIHRlbXAgPSAoQ0ZYX1B0ckFycmF5KiliYXJjb2RlTWF0cml4LT5HZXRBdChsKTsNCisgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgdGVtcC0+R2V0U2l6ZSgpOyBqKyspIHsNCisgICAgICBkZWxldGUgKENCQ19CYXJjb2RlVmFsdWUqKXRlbXAtPkdldEF0KGopOw0KKyAgICB9DQorICAgIHRlbXAtPlJlbW92ZUFsbCgpOw0KKyAgICBkZWxldGUgdGVtcDsNCisgIH0NCisgIGJhcmNvZGVNYXRyaXgtPlJlbW92ZUFsbCgpOw0KKyAgZGVsZXRlIGJhcmNvZGVNYXRyaXg7DQorICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogZGVjb2RlclJlc3VsdCA9DQorICAgICAgY3JlYXRlRGVjb2RlclJlc3VsdEZyb21BbWJpZ3VvdXNWYWx1ZXMoDQorICAgICAgICAgIGRldGVjdGlvblJlc3VsdC0+Z2V0QmFyY29kZUVDTGV2ZWwoKSwgY29kZXdvcmRzLCBlcmFzdXJlcywNCisgICAgICAgICAgYW1iaWd1b3VzSW5kZXhlc0xpc3QsIGFtYmlndW91c0luZGV4VmFsdWVzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiBkZWNvZGVyUmVzdWx0Ow0KK30NCitDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCoNCitDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpjcmVhdGVEZWNvZGVyUmVzdWx0RnJvbUFtYmlndW91c1ZhbHVlcygNCisgICAgaW50MzJfdCBlY0xldmVsLA0KKyAgICBDRlhfSW50MzJBcnJheSYgY29kZXdvcmRzLA0KKyAgICBDRlhfSW50MzJBcnJheSYgZXJhc3VyZUFycmF5LA0KKyAgICBDRlhfSW50MzJBcnJheSYgYW1iaWd1b3VzSW5kZXhlcywNCisgICAgQ0ZYX1B0ckFycmF5JiBhbWJpZ3VvdXNJbmRleFZhbHVlcywNCisgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX0ludDMyQXJyYXkgYW1iaWd1b3VzSW5kZXhDb3VudDsNCisgIGFtYmlndW91c0luZGV4Q291bnQuU2V0U2l6ZShhbWJpZ3VvdXNJbmRleGVzLkdldFNpemUoKSk7DQorICBpbnQzMl90IHRyaWVzID0gMTAwOw0KKyAgd2hpbGUgKHRyaWVzLS0gPiAwKSB7DQorICAgIGZvciAoaW50MzJfdCBsID0gMDsgbCA8IGFtYmlndW91c0luZGV4Q291bnQuR2V0U2l6ZSgpOyBsKyspIHsNCisgICAgICBjb2Rld29yZHNbYW1iaWd1b3VzSW5kZXhlc1tsXV0gPQ0KKyAgICAgICAgICAoKENGWF9JbnQzMkFycmF5KilhbWJpZ3VvdXNJbmRleFZhbHVlcy5HZXRBdChsKSkNCisgICAgICAgICAgICAgIC0+R2V0QXQoYW1iaWd1b3VzSW5kZXhDb3VudFtsXSk7DQorICAgIH0NCisgICAgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIGRlY29kZXJSZXN1bHQgPQ0KKyAgICAgICAgZGVjb2RlQ29kZXdvcmRzKGNvZGV3b3JkcywgZWNMZXZlbCwgZXJhc3VyZUFycmF5LCBlKTsNCisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgew0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5POw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJldHVybiBkZWNvZGVyUmVzdWx0Ow0KKyAgICB9DQorICAgIGlmIChhbWJpZ3VvdXNJbmRleENvdW50LkdldFNpemUoKSA9PSAwKSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uQ2hlY2tzdW1JbnN0YW5jZTsNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhbWJpZ3VvdXNJbmRleENvdW50LkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgaWYgKGFtYmlndW91c0luZGV4Q291bnRbaV0gPA0KKyAgICAgICAgICAoKENGWF9JbnQzMkFycmF5KikoYW1iaWd1b3VzSW5kZXhWYWx1ZXMuR2V0QXQoaSkpKS0+R2V0U2l6ZSgpIC0gMSkgew0KKyAgICAgICAgYW1iaWd1b3VzSW5kZXhDb3VudFtpXSsrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGFtYmlndW91c0luZGV4Q291bnRbaV0gPSAwOw0KKyAgICAgICAgaWYgKGkgPT0gYW1iaWd1b3VzSW5kZXhDb3VudC5HZXRTaXplKCkgLSAxKSB7DQorICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkNoZWNrc3VtSW5zdGFuY2U7DQorICAgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgZSA9IEJDRXhjZXB0aW9uQ2hlY2tzdW1JbnN0YW5jZTsNCisgIHJldHVybiBOVUxMOw0KK30NCitDRlhfUHRyQXJyYXkqIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmNyZWF0ZUJhcmNvZGVNYXRyaXgoDQorICAgIENCQ19EZXRlY3Rpb25SZXN1bHQqIGRldGVjdGlvblJlc3VsdCkgew0KKyAgQ0ZYX1B0ckFycmF5KiBiYXJjb2RlTWF0cml4ID0gbmV3IENGWF9QdHJBcnJheTsNCisgIGJhcmNvZGVNYXRyaXgtPlNldFNpemUoZGV0ZWN0aW9uUmVzdWx0LT5nZXRCYXJjb2RlUm93Q291bnQoKSk7DQorICBDRlhfUHRyQXJyYXkqIHRlbXAgPSBOVUxMOw0KKyAgaW50MzJfdCBjb2x1bWUgPSAwOw0KKyAgZm9yIChpbnQzMl90IHJvdyA9IDA7IHJvdyA8IGJhcmNvZGVNYXRyaXgtPkdldFNpemUoKTsgcm93KyspIHsNCisgICAgdGVtcCA9IG5ldyBDRlhfUHRyQXJyYXk7DQorICAgIHRlbXAtPlNldFNpemUoZGV0ZWN0aW9uUmVzdWx0LT5nZXRCYXJjb2RlQ29sdW1uQ291bnQoKSArIDIpOw0KKyAgICBmb3IgKGNvbHVtZSA9IDA7IGNvbHVtZSA8IGRldGVjdGlvblJlc3VsdC0+Z2V0QmFyY29kZUNvbHVtbkNvdW50KCkgKyAyOw0KKyAgICAgICAgIGNvbHVtZSsrKSB7DQorICAgICAgdGVtcC0+U2V0QXQoY29sdW1lLCBuZXcgQ0JDX0JhcmNvZGVWYWx1ZSgpKTsNCisgICAgfQ0KKyAgICBiYXJjb2RlTWF0cml4LT5TZXRBdChyb3csIHRlbXApOw0KKyAgfQ0KKyAgY29sdW1lID0gLTE7DQorICBmb3IgKGludDMyX3QgaSA9IDA7DQorICAgICAgIGkgPCBkZXRlY3Rpb25SZXN1bHQtPmdldERldGVjdGlvblJlc3VsdENvbHVtbnMoKS5HZXRTaXplKCk7IGkrKykgew0KKyAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0Q29sdW1uKiBkZXRlY3Rpb25SZXN1bHRDb2x1bW4gPQ0KKyAgICAgICAgKENCQ19EZXRlY3Rpb25SZXN1bHRDb2x1bW4qKWRldGVjdGlvblJlc3VsdC0+Z2V0RGV0ZWN0aW9uUmVzdWx0Q29sdW1ucygpDQorICAgICAgICAgICAgLkdldEF0KGkpOw0KKyAgICBjb2x1bWUrKzsNCisgICAgaWYgKGRldGVjdGlvblJlc3VsdENvbHVtbiA9PSBOVUxMKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgQ0ZYX1B0ckFycmF5KiB0ZW1wID0gZGV0ZWN0aW9uUmVzdWx0Q29sdW1uLT5nZXRDb2Rld29yZHMoKTsNCisgICAgZm9yIChpbnQzMl90IGwgPSAwOyBsIDwgdGVtcC0+R2V0U2l6ZSgpOyBsKyspIHsNCisgICAgICBDQkNfQ29kZXdvcmQqIGNvZGV3b3JkID0gKENCQ19Db2Rld29yZCopdGVtcC0+R2V0QXQobCk7DQorICAgICAgaWYgKGNvZGV3b3JkID09IE5VTEwgfHwgY29kZXdvcmQtPmdldFJvd051bWJlcigpID09IC0xKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgKChDQkNfQmFyY29kZVZhbHVlKikoKENGWF9QdHJBcnJheSopYmFyY29kZU1hdHJpeC0+R2V0QXQoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGV3b3JkLT5nZXRSb3dOdW1iZXIoKSkpDQorICAgICAgICAgICAtPkdldEF0KGNvbHVtZSkpDQorICAgICAgICAgIC0+c2V0VmFsdWUoY29kZXdvcmQtPmdldFZhbHVlKCkpOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gYmFyY29kZU1hdHJpeDsNCit9DQorRlhfQk9PTCBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjppc1ZhbGlkQmFyY29kZUNvbHVtbigNCisgICAgQ0JDX0RldGVjdGlvblJlc3VsdCogZGV0ZWN0aW9uUmVzdWx0LA0KKyAgICBpbnQzMl90IGJhcmNvZGVDb2x1bW4pIHsNCisgIHJldHVybiBiYXJjb2RlQ29sdW1uID49IDAgJiYNCisgICAgICAgICBiYXJjb2RlQ29sdW1uIDw9IGRldGVjdGlvblJlc3VsdC0+Z2V0QmFyY29kZUNvbHVtbkNvdW50KCkgKyAxOw0KK30NCitpbnQzMl90IENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmdldFN0YXJ0Q29sdW1uKA0KKyAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0KiBkZXRlY3Rpb25SZXN1bHQsDQorICAgIGludDMyX3QgYmFyY29kZUNvbHVtbiwNCisgICAgaW50MzJfdCBpbWFnZVJvdywNCisgICAgRlhfQk9PTCBsZWZ0VG9SaWdodCkgew0KKyAgaW50MzJfdCBvZmZzZXQgPSBsZWZ0VG9SaWdodCA/IDEgOiAtMTsNCisgIENCQ19Db2Rld29yZCogY29kZXdvcmQgPSBOVUxMOw0KKyAgaWYgKGlzVmFsaWRCYXJjb2RlQ29sdW1uKGRldGVjdGlvblJlc3VsdCwgYmFyY29kZUNvbHVtbiAtIG9mZnNldCkpIHsNCisgICAgY29kZXdvcmQgPSBkZXRlY3Rpb25SZXN1bHQtPmdldERldGVjdGlvblJlc3VsdENvbHVtbihiYXJjb2RlQ29sdW1uIC0gb2Zmc2V0KQ0KKyAgICAgICAgICAgICAgICAgICAtPmdldENvZGV3b3JkKGltYWdlUm93KTsNCisgIH0NCisgIGlmIChjb2Rld29yZCAhPSBOVUxMKSB7DQorICAgIHJldHVybiBsZWZ0VG9SaWdodCA/IGNvZGV3b3JkLT5nZXRFbmRYKCkgOiBjb2Rld29yZC0+Z2V0U3RhcnRYKCk7DQorICB9DQorICBjb2Rld29yZCA9IGRldGVjdGlvblJlc3VsdC0+Z2V0RGV0ZWN0aW9uUmVzdWx0Q29sdW1uKGJhcmNvZGVDb2x1bW4pDQorICAgICAgICAgICAgICAgICAtPmdldENvZGV3b3JkTmVhcmJ5KGltYWdlUm93KTsNCisgIGlmIChjb2Rld29yZCAhPSBOVUxMKSB7DQorICAgIHJldHVybiBsZWZ0VG9SaWdodCA/IGNvZGV3b3JkLT5nZXRTdGFydFgoKSA6IGNvZGV3b3JkLT5nZXRFbmRYKCk7DQorICB9DQorICBpZiAoaXNWYWxpZEJhcmNvZGVDb2x1bW4oZGV0ZWN0aW9uUmVzdWx0LCBiYXJjb2RlQ29sdW1uIC0gb2Zmc2V0KSkgew0KKyAgICBjb2Rld29yZCA9IGRldGVjdGlvblJlc3VsdC0+Z2V0RGV0ZWN0aW9uUmVzdWx0Q29sdW1uKGJhcmNvZGVDb2x1bW4gLSBvZmZzZXQpDQorICAgICAgICAgICAgICAgICAgIC0+Z2V0Q29kZXdvcmROZWFyYnkoaW1hZ2VSb3cpOw0KKyAgfQ0KKyAgaWYgKGNvZGV3b3JkICE9IE5VTEwpIHsNCisgICAgcmV0dXJuIGxlZnRUb1JpZ2h0ID8gY29kZXdvcmQtPmdldEVuZFgoKSA6IGNvZGV3b3JkLT5nZXRTdGFydFgoKTsNCisgIH0NCisgIGludDMyX3Qgc2tpcHBlZENvbHVtbnMgPSAwOw0KKyAgd2hpbGUgKGlzVmFsaWRCYXJjb2RlQ29sdW1uKGRldGVjdGlvblJlc3VsdCwgYmFyY29kZUNvbHVtbiAtIG9mZnNldCkpIHsNCisgICAgYmFyY29kZUNvbHVtbiAtPSBvZmZzZXQ7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsNCisgICAgICAgICBpIDwgZGV0ZWN0aW9uUmVzdWx0LT5nZXREZXRlY3Rpb25SZXN1bHRDb2x1bW4oYmFyY29kZUNvbHVtbikNCisgICAgICAgICAgICAgICAgIC0+Z2V0Q29kZXdvcmRzKCkNCisgICAgICAgICAgICAgICAgIC0+R2V0U2l6ZSgpOw0KKyAgICAgICAgIGkrKykgew0KKyAgICAgIENCQ19Db2Rld29yZCogcHJldmlvdXNSb3dDb2Rld29yZCA9DQorICAgICAgICAgIChDQkNfQ29kZXdvcmQqKWRldGVjdGlvblJlc3VsdC0+Z2V0RGV0ZWN0aW9uUmVzdWx0Q29sdW1uKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFyY29kZUNvbHVtbikNCisgICAgICAgICAgICAgIC0+Z2V0Q29kZXdvcmRzKCkNCisgICAgICAgICAgICAgIC0+R2V0QXQoaSk7DQorICAgICAgaWYgKHByZXZpb3VzUm93Q29kZXdvcmQgIT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuIChsZWZ0VG9SaWdodCA/IHByZXZpb3VzUm93Q29kZXdvcmQtPmdldEVuZFgoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHByZXZpb3VzUm93Q29kZXdvcmQtPmdldFN0YXJ0WCgpKSArDQorICAgICAgICAgICAgICAgb2Zmc2V0ICogc2tpcHBlZENvbHVtbnMgKiAocHJldmlvdXNSb3dDb2Rld29yZC0+Z2V0RW5kWCgpIC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1Jvd0NvZGV3b3JkLT5nZXRTdGFydFgoKSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHNraXBwZWRDb2x1bW5zKys7DQorICB9DQorICByZXR1cm4gbGVmdFRvUmlnaHQgPyBkZXRlY3Rpb25SZXN1bHQtPmdldEJvdW5kaW5nQm94KCktPmdldE1pblgoKQ0KKyAgICAgICAgICAgICAgICAgICAgIDogZGV0ZWN0aW9uUmVzdWx0LT5nZXRCb3VuZGluZ0JveCgpLT5nZXRNYXhYKCk7DQorfQ0KK0NCQ19Db2Rld29yZCogQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6ZGV0ZWN0Q29kZXdvcmQoDQorICAgIENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLA0KKyAgICBpbnQzMl90IG1pbkNvbHVtbiwNCisgICAgaW50MzJfdCBtYXhDb2x1bW4sDQorICAgIEZYX0JPT0wgbGVmdFRvUmlnaHQsDQorICAgIGludDMyX3Qgc3RhcnRDb2x1bW4sDQorICAgIGludDMyX3QgaW1hZ2VSb3csDQorICAgIGludDMyX3QgbWluQ29kZXdvcmRXaWR0aCwNCisgICAgaW50MzJfdCBtYXhDb2Rld29yZFdpZHRoKSB7DQorICBzdGFydENvbHVtbiA9IGFkanVzdENvZGV3b3JkU3RhcnRDb2x1bW4oaW1hZ2UsIG1pbkNvbHVtbiwgbWF4Q29sdW1uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRUb1JpZ2h0LCBzdGFydENvbHVtbiwgaW1hZ2VSb3cpOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIG1vZHVsZUJpdENvdW50ID0gZ2V0TW9kdWxlQml0Q291bnQoDQorICAgICAgaW1hZ2UsIG1pbkNvbHVtbiwgbWF4Q29sdW1uLCBsZWZ0VG9SaWdodCwgc3RhcnRDb2x1bW4sIGltYWdlUm93KTsNCisgIGlmIChtb2R1bGVCaXRDb3VudCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaW50MzJfdCBlbmRDb2x1bW47DQorICBpbnQzMl90IGNvZGV3b3JkQml0Q291bnQgPSBDQkNfUERGNDE3Q29tbW9uOjpnZXRCaXRDb3VudFN1bSgqbW9kdWxlQml0Q291bnQpOw0KKyAgaWYgKGxlZnRUb1JpZ2h0KSB7DQorICAgIGVuZENvbHVtbiA9IHN0YXJ0Q29sdW1uICsgY29kZXdvcmRCaXRDb3VudDsNCisgIH0gZWxzZSB7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaTxtb2R1bGVCaXRDb3VudC0+R2V0U2l6ZSgpPj4gMTsgaSsrKSB7DQorICAgICAgaW50MzJfdCB0bXBDb3VudCA9IG1vZHVsZUJpdENvdW50LT5HZXRBdChpKTsNCisgICAgICBtb2R1bGVCaXRDb3VudC0+U2V0QXQoDQorICAgICAgICAgIGksIG1vZHVsZUJpdENvdW50LT5HZXRBdChtb2R1bGVCaXRDb3VudC0+R2V0U2l6ZSgpIC0gMSAtIGkpKTsNCisgICAgICBtb2R1bGVCaXRDb3VudC0+U2V0QXQobW9kdWxlQml0Q291bnQtPkdldFNpemUoKSAtIDEgLSBpLCB0bXBDb3VudCk7DQorICAgIH0NCisgICAgZW5kQ29sdW1uID0gc3RhcnRDb2x1bW47DQorICAgIHN0YXJ0Q29sdW1uID0gZW5kQ29sdW1uIC0gY29kZXdvcmRCaXRDb3VudDsNCisgIH0NCisgIGludDMyX3QgZGVjb2RlZFZhbHVlID0NCisgICAgICBDQkNfUERGNDE3Q29kZXdvcmREZWNvZGVyOjpnZXREZWNvZGVkVmFsdWUoKm1vZHVsZUJpdENvdW50KTsNCisgIGludDMyX3QgY29kZXdvcmQgPSBDQkNfUERGNDE3Q29tbW9uOjpnZXRDb2Rld29yZChkZWNvZGVkVmFsdWUpOw0KKyAgZGVsZXRlIG1vZHVsZUJpdENvdW50Ow0KKyAgaWYgKGNvZGV3b3JkID09IC0xKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIG5ldyBDQkNfQ29kZXdvcmQoc3RhcnRDb2x1bW4sIGVuZENvbHVtbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvZGV3b3JkQnVja2V0TnVtYmVyKGRlY29kZWRWYWx1ZSksIGNvZGV3b3JkKTsNCit9DQorQ0ZYX0ludDMyQXJyYXkqIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmdldE1vZHVsZUJpdENvdW50KA0KKyAgICBDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSwNCisgICAgaW50MzJfdCBtaW5Db2x1bW4sDQorICAgIGludDMyX3QgbWF4Q29sdW1uLA0KKyAgICBGWF9CT09MIGxlZnRUb1JpZ2h0LA0KKyAgICBpbnQzMl90IHN0YXJ0Q29sdW1uLA0KKyAgICBpbnQzMl90IGltYWdlUm93KSB7DQorICBpbnQzMl90IGltYWdlQ29sdW1uID0gc3RhcnRDb2x1bW47DQorICBDRlhfSW50MzJBcnJheSogbW9kdWxlQml0Q291bnQgPSBuZXcgQ0ZYX0ludDMyQXJyYXk7DQorICBtb2R1bGVCaXRDb3VudC0+U2V0U2l6ZSg4KTsNCisgIGludDMyX3QgbW9kdWxlTnVtYmVyID0gMDsNCisgIGludDMyX3QgaW5jcmVtZW50ID0gbGVmdFRvUmlnaHQgPyAxIDogLTE7DQorICBGWF9CT09MIHByZXZpb3VzUGl4ZWxWYWx1ZSA9IGxlZnRUb1JpZ2h0Ow0KKyAgd2hpbGUgKCgobGVmdFRvUmlnaHQgJiYgaW1hZ2VDb2x1bW4gPCBtYXhDb2x1bW4pIHx8DQorICAgICAgICAgICghbGVmdFRvUmlnaHQgJiYgaW1hZ2VDb2x1bW4gPj0gbWluQ29sdW1uKSkgJiYNCisgICAgICAgICBtb2R1bGVOdW1iZXIgPCBtb2R1bGVCaXRDb3VudC0+R2V0U2l6ZSgpKSB7DQorICAgIGlmIChpbWFnZS0+R2V0KGltYWdlQ29sdW1uLCBpbWFnZVJvdykgPT0gcHJldmlvdXNQaXhlbFZhbHVlKSB7DQorICAgICAgbW9kdWxlQml0Q291bnQtPlNldEF0KG1vZHVsZU51bWJlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlQml0Q291bnQtPkdldEF0KG1vZHVsZU51bWJlcikgKyAxKTsNCisgICAgICBpbWFnZUNvbHVtbiArPSBpbmNyZW1lbnQ7DQorICAgIH0gZWxzZSB7DQorICAgICAgbW9kdWxlTnVtYmVyKys7DQorICAgICAgcHJldmlvdXNQaXhlbFZhbHVlID0gIXByZXZpb3VzUGl4ZWxWYWx1ZTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKG1vZHVsZU51bWJlciA9PSBtb2R1bGVCaXRDb3VudC0+R2V0U2l6ZSgpIHx8DQorICAgICAgKCgobGVmdFRvUmlnaHQgJiYgaW1hZ2VDb2x1bW4gPT0gbWF4Q29sdW1uKSB8fA0KKyAgICAgICAgKCFsZWZ0VG9SaWdodCAmJiBpbWFnZUNvbHVtbiA9PSBtaW5Db2x1bW4pKSAmJg0KKyAgICAgICBtb2R1bGVOdW1iZXIgPT0gbW9kdWxlQml0Q291bnQtPkdldFNpemUoKSAtIDEpKSB7DQorICAgIHJldHVybiBtb2R1bGVCaXRDb3VudDsNCisgIH0NCisgIGRlbGV0ZSBtb2R1bGVCaXRDb3VudDsNCisgIHJldHVybiBOVUxMOw0KK30NCitpbnQzMl90IENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmdldE51bWJlck9mRUNDb2RlV29yZHMoDQorICAgIGludDMyX3QgYmFyY29kZUVDTGV2ZWwpIHsNCisgIHJldHVybiAyIDw8IGJhcmNvZGVFQ0xldmVsOw0KK30NCitpbnQzMl90IENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmFkanVzdENvZGV3b3JkU3RhcnRDb2x1bW4oDQorICAgIENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLA0KKyAgICBpbnQzMl90IG1pbkNvbHVtbiwNCisgICAgaW50MzJfdCBtYXhDb2x1bW4sDQorICAgIEZYX0JPT0wgbGVmdFRvUmlnaHQsDQorICAgIGludDMyX3QgY29kZXdvcmRTdGFydENvbHVtbiwNCisgICAgaW50MzJfdCBpbWFnZVJvdykgew0KKyAgaW50MzJfdCBjb3JyZWN0ZWRTdGFydENvbHVtbiA9IGNvZGV3b3JkU3RhcnRDb2x1bW47DQorICBpbnQzMl90IGluY3JlbWVudCA9IGxlZnRUb1JpZ2h0ID8gLTEgOiAxOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMjsgaSsrKSB7DQorICAgIHdoaWxlICgoKGxlZnRUb1JpZ2h0ICYmIGNvcnJlY3RlZFN0YXJ0Q29sdW1uID49IG1pbkNvbHVtbikgfHwNCisgICAgICAgICAgICAoIWxlZnRUb1JpZ2h0ICYmIGNvcnJlY3RlZFN0YXJ0Q29sdW1uIDwgbWF4Q29sdW1uKSkgJiYNCisgICAgICAgICAgIGxlZnRUb1JpZ2h0ID09IGltYWdlLT5HZXQoY29ycmVjdGVkU3RhcnRDb2x1bW4sIGltYWdlUm93KSkgew0KKyAgICAgIGlmIChhYnMoY29kZXdvcmRTdGFydENvbHVtbiAtIGNvcnJlY3RlZFN0YXJ0Q29sdW1uKSA+DQorICAgICAgICAgIENPREVXT1JEX1NLRVdfU0laRSkgew0KKyAgICAgICAgcmV0dXJuIGNvZGV3b3JkU3RhcnRDb2x1bW47DQorICAgICAgfQ0KKyAgICAgIGNvcnJlY3RlZFN0YXJ0Q29sdW1uICs9IGluY3JlbWVudDsNCisgICAgfQ0KKyAgICBpbmNyZW1lbnQgPSAtaW5jcmVtZW50Ow0KKyAgICBsZWZ0VG9SaWdodCA9ICFsZWZ0VG9SaWdodDsNCisgIH0NCisgIHJldHVybiBjb3JyZWN0ZWRTdGFydENvbHVtbjsNCit9DQorRlhfQk9PTCBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpjaGVja0NvZGV3b3JkU2tldyhpbnQzMl90IGNvZGV3b3JkU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWluQ29kZXdvcmRXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF4Q29kZXdvcmRXaWR0aCkgew0KKyAgcmV0dXJuIG1pbkNvZGV3b3JkV2lkdGggLSBDT0RFV09SRF9TS0VXX1NJWkUgPD0gY29kZXdvcmRTaXplICYmDQorICAgICAgICAgY29kZXdvcmRTaXplIDw9IG1heENvZGV3b3JkV2lkdGggKyBDT0RFV09SRF9TS0VXX1NJWkU7DQorfQ0KK0NCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpkZWNvZGVDb2Rld29yZHMoDQorICAgIENGWF9JbnQzMkFycmF5JiBjb2Rld29yZHMsDQorICAgIGludDMyX3QgZWNMZXZlbCwNCisgICAgQ0ZYX0ludDMyQXJyYXkmIGVyYXN1cmVzLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoY29kZXdvcmRzLkdldFNpemUoKSA9PSAwKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkZvcm1hdEluc3RhbmNlOw0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGludDMyX3QgbnVtRUNDb2Rld29yZHMgPSAxIDw8IChlY0xldmVsICsgMSk7DQorICBjb3JyZWN0RXJyb3JzKGNvZGV3b3JkcywgZXJhc3VyZXMsIG51bUVDQ29kZXdvcmRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHZlcmlmeUNvZGV3b3JkQ291bnQoY29kZXdvcmRzLCBudW1FQ0NvZGV3b3JkcywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBDRlhfQnl0ZVN0cmluZyBieXRlc3RyaW5nOw0KKyAgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIGRlY29kZXJSZXN1bHQgPSBDQkNfRGVjb2RlZEJpdFN0cmVhbVBhc2VyOjpkZWNvZGUoDQorICAgICAgY29kZXdvcmRzLCBieXRlc3RyaW5nLkZvcm1hdEludGVnZXIoZWNMZXZlbCksIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIGRlY29kZXJSZXN1bHQ7DQorfQ0KK2ludDMyX3QgQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6Y29ycmVjdEVycm9ycyhDRlhfSW50MzJBcnJheSYgY29kZXdvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSYgZXJhc3VyZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRUNDb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmICgoZXJhc3VyZXMuR2V0U2l6ZSgpICE9IDAgJiYNCisgICAgICAgZXJhc3VyZXMuR2V0U2l6ZSgpID4gKG51bUVDQ29kZXdvcmRzIC8gMiArIE1BWF9FUlJPUlMpKSB8fA0KKyAgICAgIG51bUVDQ29kZXdvcmRzIDwgMCB8fCBudW1FQ0NvZGV3b3JkcyA+IE1BWF9FQ19DT0RFV09SRFMpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uQ2hlY2tzdW1JbnN0YW5jZTsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgaW50MzJfdCByZXN1bHQgPSBDQkNfUERGNDE3RUNFcnJvckNvcnJlY3Rpb246OmRlY29kZSgNCisgICAgICBjb2Rld29yZHMsIG51bUVDQ29kZXdvcmRzLCBlcmFzdXJlcywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgLTEpOw0KKyAgcmV0dXJuIHJlc3VsdDsNCit9DQordm9pZCBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjp2ZXJpZnlDb2Rld29yZENvdW50KENGWF9JbnQzMkFycmF5JiBjb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRUNDb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChjb2Rld29yZHMuR2V0U2l6ZSgpIDwgNCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRJbnN0YW5jZTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBudW1iZXJPZkNvZGV3b3JkcyA9IGNvZGV3b3Jkcy5HZXRBdCgwKTsNCisgIGlmIChudW1iZXJPZkNvZGV3b3JkcyA+IGNvZGV3b3Jkcy5HZXRTaXplKCkpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0SW5zdGFuY2U7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChudW1iZXJPZkNvZGV3b3JkcyA9PSAwKSB7DQorICAgIGlmIChudW1FQ0NvZGV3b3JkcyA8IGNvZGV3b3Jkcy5HZXRTaXplKCkpIHsNCisgICAgICBjb2Rld29yZHNbMF0gPSBjb2Rld29yZHMuR2V0U2l6ZSgpIC0gbnVtRUNDb2Rld29yZHM7DQorICAgIH0gZWxzZSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uRm9ybWF0SW5zdGFuY2U7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICB9DQorfQ0KK0NGWF9JbnQzMkFycmF5KiBDQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyOjpnZXRCaXRDb3VudEZvckNvZGV3b3JkKA0KKyAgICBpbnQzMl90IGNvZGV3b3JkKSB7DQorICBDRlhfSW50MzJBcnJheSogcmVzdWx0ID0gbmV3IENGWF9JbnQzMkFycmF5Ow0KKyAgcmVzdWx0LT5TZXRTaXplKDgpOw0KKyAgaW50MzJfdCBwcmV2aW91c1ZhbHVlID0gMDsNCisgIGludDMyX3QgaSA9IHJlc3VsdC0+R2V0U2l6ZSgpIC0gMTsNCisgIHdoaWxlIChUUlVFKSB7DQorICAgIGlmICgoY29kZXdvcmQgJiAweDEpICE9IHByZXZpb3VzVmFsdWUpIHsNCisgICAgICBwcmV2aW91c1ZhbHVlID0gY29kZXdvcmQgJiAweDE7DQorICAgICAgaS0tOw0KKyAgICAgIGlmIChpIDwgMCkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHJlc3VsdC0+U2V0QXQoaSwgcmVzdWx0LT5HZXRBdChpKSArIDEpOw0KKyAgICBjb2Rld29yZCA+Pj0gMTsNCisgIH0NCisgIHJldHVybiByZXN1bHQ7DQorfQ0KK2ludDMyX3QgQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlcjo6Z2V0Q29kZXdvcmRCdWNrZXROdW1iZXIoaW50MzJfdCBjb2Rld29yZCkgew0KKyAgQ0ZYX0ludDMyQXJyYXkqIGFycmF5ID0gZ2V0Qml0Q291bnRGb3JDb2Rld29yZChjb2Rld29yZCk7DQorICBpbnQzMl90IHJlc3VsdCA9IGdldENvZGV3b3JkQnVja2V0TnVtYmVyKCphcnJheSk7DQorICBkZWxldGUgYXJyYXk7DQorICByZXR1cm4gcmVzdWx0Ow0KK30NCitpbnQzMl90IENCQ19QREY0MTdTY2FubmluZ0RlY29kZXI6OmdldENvZGV3b3JkQnVja2V0TnVtYmVyKA0KKyAgICBDRlhfSW50MzJBcnJheSYgbW9kdWxlQml0Q291bnQpIHsNCisgIHJldHVybiAobW9kdWxlQml0Q291bnQuR2V0QXQoMCkgLSBtb2R1bGVCaXRDb3VudC5HZXRBdCgyKSArDQorICAgICAgICAgIG1vZHVsZUJpdENvdW50LkdldEF0KDQpIC0gbW9kdWxlQml0Q291bnQuR2V0QXQoNikgKyA5KSAlDQorICAgICAgICAgOTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1NjYW5uaW5nRGVjb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YWMyYjQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3U2Nhbm5pbmdEZWNvZGVyLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUERGNDE3U0NBTk5JTkdERUNPREVSX0hfDQorI2RlZmluZSBfQkNfUERGNDE3U0NBTk5JTkdERUNPREVSX0hfDQorY2xhc3MgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQ7DQorY2xhc3MgQ0JDX0NvbW1vbkJpdE1hdHJpeDsNCitjbGFzcyBDQkNfRXJyb3JDb3JyZWN0aW9uOw0KK2NsYXNzIENCQ19Db2Rld29yZDsNCitjbGFzcyBDQkNfQm91bmRpbmdCb3g7DQorY2xhc3MgQ0JDX1Jlc3VsdFBvaW50Ow0KK2NsYXNzIENCQ19CYXJjb2RlTWV0YWRhdGE7DQorY2xhc3MgQ0JDX0JhcmNvZGVWYWx1ZTsNCitjbGFzcyBDQkNfRGV0ZWN0aW9uUmVzdWx0Ow0KK2NsYXNzIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW47DQorDQorY2xhc3MgQ0JDX1BERjQxN1NjYW5uaW5nRGVjb2RlciB7DQorIHB1YmxpYzoNCisgIENCQ19QREY0MTdTY2FubmluZ0RlY29kZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19QREY0MTdTY2FubmluZ0RlY29kZXIoKTsNCisgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsNCisgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7DQorICBzdGF0aWMgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIGRlY29kZShDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogaW1hZ2VUb3BMZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiBpbWFnZUJvdHRvbUxlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIGltYWdlVG9wUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIGltYWdlQm90dG9tUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1pbkNvZGV3b3JkV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heENvZGV3b3JkV2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyB0b1N0cmluZyhDRlhfUHRyQXJyYXkqIGJhcmNvZGVNYXRyaXgpOw0KKw0KKyBwcml2YXRlOg0KKyAgc3RhdGljIGludDMyX3QgQ09ERVdPUkRfU0tFV19TSVpFOw0KKyAgc3RhdGljIGludDMyX3QgTUFYX0VSUk9SUzsNCisgIHN0YXRpYyBpbnQzMl90IE1BWF9FQ19DT0RFV09SRFM7DQorICBzdGF0aWMgQ0JDX1BERjQxN0VDRXJyb3JDb3JyZWN0aW9uKiBlcnJvckNvcnJlY3Rpb247DQorICBzdGF0aWMgQ0JDX0RldGVjdGlvblJlc3VsdCogbWVyZ2UoDQorICAgICAgQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiogbGVmdFJvd0luZGljYXRvckNvbHVtbiwNCisgICAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKiByaWdodFJvd0luZGljYXRvckNvbHVtbiwNCisgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBDQkNfQm91bmRpbmdCb3gqIGFkanVzdEJvdW5kaW5nQm94KA0KKyAgICAgIENCQ19EZXRlY3Rpb25SZXN1bHRSb3dJbmRpY2F0b3JDb2x1bW4qIHJvd0luZGljYXRvckNvbHVtbiwNCisgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBpbnQzMl90IGdldE1heChDRlhfSW50MzJBcnJheSYgdmFsdWVzKTsNCisgIHN0YXRpYyBDQkNfQmFyY29kZU1ldGFkYXRhKiBnZXRCYXJjb2RlTWV0YWRhdGEoDQorICAgICAgQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiogbGVmdFJvd0luZGljYXRvckNvbHVtbiwNCisgICAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0Um93SW5kaWNhdG9yQ29sdW1uKiByaWdodFJvd0luZGljYXRvckNvbHVtbik7DQorICBzdGF0aWMgQ0JDX0RldGVjdGlvblJlc3VsdFJvd0luZGljYXRvckNvbHVtbiogZ2V0Um93SW5kaWNhdG9yQ29sdW1uKA0KKyAgICAgIENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLA0KKyAgICAgIENCQ19Cb3VuZGluZ0JveCogYm91bmRpbmdCb3gsDQorICAgICAgQ0JDX1Jlc3VsdFBvaW50IHN0YXJ0UG9pbnQsDQorICAgICAgRlhfQk9PTCBsZWZ0VG9SaWdodCwNCisgICAgICBpbnQzMl90IG1pbkNvZGV3b3JkV2lkdGgsDQorICAgICAgaW50MzJfdCBtYXhDb2Rld29yZFdpZHRoKTsNCisgIHN0YXRpYyB2b2lkIGFkanVzdENvZGV3b3JkQ291bnQoQ0JDX0RldGVjdGlvblJlc3VsdCogZGV0ZWN0aW9uUmVzdWx0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkqIGJhcmNvZGVNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBjcmVhdGVEZWNvZGVyUmVzdWx0KA0KKyAgICAgIENCQ19EZXRlY3Rpb25SZXN1bHQqIGRldGVjdGlvblJlc3VsdCwNCisgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogY3JlYXRlRGVjb2RlclJlc3VsdEZyb21BbWJpZ3VvdXNWYWx1ZXMoDQorICAgICAgaW50MzJfdCBlY0xldmVsLA0KKyAgICAgIENGWF9JbnQzMkFycmF5JiBjb2Rld29yZHMsDQorICAgICAgQ0ZYX0ludDMyQXJyYXkmIGVyYXN1cmVBcnJheSwNCisgICAgICBDRlhfSW50MzJBcnJheSYgYW1iaWd1b3VzSW5kZXhlcywNCisgICAgICBDRlhfUHRyQXJyYXkmIGFtYmlndW91c0luZGV4VmFsdWVzLA0KKyAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIENGWF9QdHJBcnJheSogY3JlYXRlQmFyY29kZU1hdHJpeCgNCisgICAgICBDQkNfRGV0ZWN0aW9uUmVzdWx0KiBkZXRlY3Rpb25SZXN1bHQpOw0KKyAgc3RhdGljIEZYX0JPT0wgaXNWYWxpZEJhcmNvZGVDb2x1bW4oQ0JDX0RldGVjdGlvblJlc3VsdCogZGV0ZWN0aW9uUmVzdWx0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBiYXJjb2RlQ29sdW1uKTsNCisgIHN0YXRpYyBpbnQzMl90IGdldFN0YXJ0Q29sdW1uKENCQ19EZXRlY3Rpb25SZXN1bHQqIGRldGVjdGlvblJlc3VsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYmFyY29kZUNvbHVtbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW1hZ2VSb3csDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGxlZnRUb1JpZ2h0KTsNCisgIHN0YXRpYyBDQkNfQ29kZXdvcmQqIGRldGVjdENvZGV3b3JkKENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtaW5Db2x1bW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heENvbHVtbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgbGVmdFRvUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0Q29sdW1uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbWFnZVJvdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWluQ29kZXdvcmRXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF4Q29kZXdvcmRXaWR0aCk7DQorICBzdGF0aWMgQ0ZYX0ludDMyQXJyYXkqIGdldE1vZHVsZUJpdENvdW50KENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1pbkNvbHVtbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhDb2x1bW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgbGVmdFRvUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRDb2x1bW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW1hZ2VSb3cpOw0KKyAgc3RhdGljIGludDMyX3QgZ2V0TnVtYmVyT2ZFQ0NvZGVXb3JkcyhpbnQzMl90IGJhcmNvZGVFQ0xldmVsKTsNCisgIHN0YXRpYyBpbnQzMl90IGFkanVzdENvZGV3b3JkU3RhcnRDb2x1bW4oQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWluQ29sdW1uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heENvbHVtbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBsZWZ0VG9SaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2Rld29yZFN0YXJ0Q29sdW1uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGltYWdlUm93KTsNCisgIHN0YXRpYyBGWF9CT09MIGNoZWNrQ29kZXdvcmRTa2V3KGludDMyX3QgY29kZXdvcmRTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtaW5Db2Rld29yZFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhDb2Rld29yZFdpZHRoKTsNCisgIHN0YXRpYyBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogZGVjb2RlQ29kZXdvcmRzKENGWF9JbnQzMkFycmF5JiBjb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVjTGV2ZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfSW50MzJBcnJheSYgZXJhc3VyZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBpbnQzMl90IGNvcnJlY3RFcnJvcnMoQ0ZYX0ludDMyQXJyYXkmIGNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ludDMyQXJyYXkmIGVyYXN1cmVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUVDQ29kZXdvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIHZlcmlmeUNvZGV3b3JkQ291bnQoQ0ZYX0ludDMyQXJyYXkmIGNvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1FQ0NvZGV3b3JkcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgQ0ZYX0ludDMyQXJyYXkqIGdldEJpdENvdW50Rm9yQ29kZXdvcmQoaW50MzJfdCBjb2Rld29yZCk7DQorICBzdGF0aWMgaW50MzJfdCBnZXRDb2Rld29yZEJ1Y2tldE51bWJlcihpbnQzMl90IGNvZGV3b3JkKTsNCisgIHN0YXRpYyBpbnQzMl90IGdldENvZGV3b3JkQnVja2V0TnVtYmVyKENGWF9JbnQzMkFycmF5JiBtb2R1bGVCaXRDb3VudCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3V3JpdGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdXcml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MWJhMTAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3V3JpdGVyLmNwcApAQCAtMCwwICsxLDExNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAxMiBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1R3b0RpbVdyaXRlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0QXJyYXkuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdDb21wYWN0aW9uLmgiDQorI2luY2x1ZGUgIkJDX1BERjQxNy5oIg0KKyNpbmNsdWRlICJCQ19QREY0MTdCYXJjb2RlTWF0cml4LmgiDQorI2luY2x1ZGUgIkJDX1BERjQxN1dyaXRlci5oIg0KK0NCQ19QREY0MTdXcml0ZXI6OkNCQ19QREY0MTdXcml0ZXIoKSB7DQorICBtX2JGaXhlZFNpemUgPSBGQUxTRTsNCit9DQorQ0JDX1BERjQxN1dyaXRlcjo6fkNCQ19QREY0MTdXcml0ZXIoKSB7DQorICBtX2JUcnVuY2F0ZWQgPSBUUlVFOw0KK30NCitGWF9CT09MIENCQ19QREY0MTdXcml0ZXI6OlNldEVycm9yQ29ycmVjdGlvbkxldmVsKGludDMyX3QgbGV2ZWwpIHsNCisgIGlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPiA4KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIG1faUNvcnJlY3RMZXZlbCA9IGxldmVsOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ0JDX1BERjQxN1dyaXRlcjo6U2V0VHJ1bmNhdGVkKEZYX0JPT0wgdHJ1bmNhdGVkKSB7DQorICBtX2JUcnVuY2F0ZWQgPSB0cnVuY2F0ZWQ7DQorfQ0KK3VpbnQ4X3QqIENCQ19QREY0MTdXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENCQ19QREY0MTcgZW5jb2RlcjsNCisgIGludDMyX3QgY29sID0gKG1fV2lkdGggLyBtX01vZHVsZVdpZHRoIC0gNjkpIC8gMTc7DQorICBpbnQzMl90IHJvdyA9IG1fSGVpZ2h0IC8gKG1fTW9kdWxlV2lkdGggKiAyMCk7DQorICBpZiAocm93ID49IDMgJiYgcm93IDw9IDkwICYmIGNvbCA+PSAxICYmIGNvbCA8PSAzMCkgew0KKyAgICBlbmNvZGVyLnNldERpbWVuc2lvbnMoY29sLCBjb2wsIHJvdywgcm93KTsNCisgIH0gZWxzZSBpZiAoY29sID49IDEgJiYgY29sIDw9IDMwKSB7DQorICAgIGVuY29kZXIuc2V0RGltZW5zaW9ucyhjb2wsIGNvbCwgOTAsIDMpOw0KKyAgfSBlbHNlIGlmIChyb3cgPj0gMyAmJiByb3cgPD0gOTApIHsNCisgICAgZW5jb2Rlci5zZXREaW1lbnNpb25zKDMwLCAxLCByb3csIHJvdyk7DQorICB9DQorICBlbmNvZGVyLmdlbmVyYXRlQmFyY29kZUxvZ2ljKGNvbnRlbnRzLCBtX2lDb3JyZWN0TGV2ZWwsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgaW50MzJfdCBsaW5lVGhpY2tuZXNzID0gMjsNCisgIGludDMyX3QgYXNwZWN0UmF0aW8gPSA0Ow0KKyAgQ0JDX0JhcmNvZGVNYXRyaXgqIGJhcmNvZGVNYXRyaXggPSBlbmNvZGVyLmdldEJhcmNvZGVNYXRyaXgoKTsNCisgIENGWF9CeXRlQXJyYXkgb3JpZ2luYWxTY2FsZTsNCisgIG9yaWdpbmFsU2NhbGUuQ29weShiYXJjb2RlTWF0cml4LT5nZXRTY2FsZWRNYXRyaXgoDQorICAgICAgbGluZVRoaWNrbmVzcywgYXNwZWN0UmF0aW8gKiBsaW5lVGhpY2tuZXNzKSk7DQorICBpbnQzMl90IHdpZHRoID0gb3V0V2lkdGg7DQorICBpbnQzMl90IGhlaWdodCA9IG91dEhlaWdodDsNCisgIG91dFdpZHRoID0gYmFyY29kZU1hdHJpeC0+Z2V0V2lkdGgoKTsNCisgIG91dEhlaWdodCA9IGJhcmNvZGVNYXRyaXgtPmdldEhlaWdodCgpOw0KKyAgRlhfQk9PTCByb3RhdGVkID0gRkFMU0U7DQorICBpZiAoKGhlaWdodCA+IHdpZHRoKSBeIChvdXRXaWR0aCA8IG91dEhlaWdodCkpIHsNCisgICAgcm90YXRlQXJyYXkob3JpZ2luYWxTY2FsZSwgb3V0SGVpZ2h0LCBvdXRXaWR0aCk7DQorICAgIHJvdGF0ZWQgPSBUUlVFOw0KKyAgICBpbnQzMl90IHRlbXAgPSBvdXRIZWlnaHQ7DQorICAgIG91dEhlaWdodCA9IG91dFdpZHRoOw0KKyAgICBvdXRXaWR0aCA9IHRlbXA7DQorICB9DQorICBpbnQzMl90IHNjYWxlWCA9IHdpZHRoIC8gb3V0V2lkdGg7DQorICBpbnQzMl90IHNjYWxlWSA9IGhlaWdodCAvIG91dEhlaWdodDsNCisgIGludDMyX3Qgc2NhbGU7DQorICBpZiAoc2NhbGVYIDwgc2NhbGVZKSB7DQorICAgIHNjYWxlID0gc2NhbGVYOw0KKyAgfSBlbHNlIHsNCisgICAgc2NhbGUgPSBzY2FsZVk7DQorICB9DQorICBpZiAoc2NhbGUgPiAxKSB7DQorICAgIG9yaWdpbmFsU2NhbGUuUmVtb3ZlQWxsKCk7DQorICAgIG9yaWdpbmFsU2NhbGUuQ29weShiYXJjb2RlTWF0cml4LT5nZXRTY2FsZWRNYXRyaXgoDQorICAgICAgICBzY2FsZSAqIGxpbmVUaGlja25lc3MsIHNjYWxlICogYXNwZWN0UmF0aW8gKiBsaW5lVGhpY2tuZXNzKSk7DQorICAgIGlmIChyb3RhdGVkKSB7DQorICAgICAgcm90YXRlQXJyYXkob3JpZ2luYWxTY2FsZSwgb3V0SGVpZ2h0LCBvdXRXaWR0aCk7DQorICAgICAgaW50MzJfdCB0ZW1wID0gb3V0SGVpZ2h0Ow0KKyAgICAgIG91dEhlaWdodCA9IG91dFdpZHRoOw0KKyAgICAgIG91dFdpZHRoID0gdGVtcDsNCisgICAgfQ0KKyAgfQ0KKyAgdWludDhfdCogcmVzdWx0ID0gRlhfQWxsb2MyRCh1aW50OF90LCBvdXRIZWlnaHQsIG91dFdpZHRoKTsNCisgIEZYU1lTX21lbWNweShyZXN1bHQsIG9yaWdpbmFsU2NhbGUuR2V0RGF0YSgpLCBvdXRIZWlnaHQgKiBvdXRXaWR0aCk7DQorICByZXR1cm4gcmVzdWx0Ow0KK30NCit2b2lkIENCQ19QREY0MTdXcml0ZXI6OnJvdGF0ZUFycmF5KENGWF9CeXRlQXJyYXkmIGJpdGFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoKSB7DQorICBDRlhfQnl0ZUFycmF5IHRlbXA7DQorICB0ZW1wLkNvcHkoYml0YXJyYXkpOw0KKyAgZm9yIChpbnQzMl90IGlpID0gMDsgaWkgPCBoZWlnaHQ7IGlpKyspIHsNCisgICAgaW50MzJfdCBpbnZlcnNlaWkgPSBoZWlnaHQgLSBpaSAtIDE7DQorICAgIGZvciAoaW50MzJfdCBqaiA9IDA7IGpqIDwgd2lkdGg7IGpqKyspIHsNCisgICAgICBiaXRhcnJheVtqaiAqIGhlaWdodCArIGludmVyc2VpaV0gPSB0ZW1wW2lpICogd2lkdGggKyBqal07DQorICAgIH0NCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1dyaXRlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1dyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNWNiNDMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3V3JpdGVyLmgKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19QREY0MTdXUklURVJfSF8NCisjZGVmaW5lIF9CQ19QREY0MTdXUklURVJfSF8NCitjbGFzcyBDQkNfVHdvRGltV3JpdGVyOw0KK2NsYXNzIENCQ19QREY0MTdXcml0ZXI7DQorY2xhc3MgQ0JDX1BERjQxN1dyaXRlciA6IHB1YmxpYyBDQkNfVHdvRGltV3JpdGVyIHsNCisgcHVibGljOg0KKyAgQ0JDX1BERjQxN1dyaXRlcigpOw0KKyAgdmlydHVhbCB+Q0JDX1BERjQxN1dyaXRlcigpOw0KKyAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBGWF9CT09MIFNldEVycm9yQ29ycmVjdGlvbkxldmVsKGludDMyX3QgbGV2ZWwpOw0KKyAgdm9pZCBTZXRUcnVuY2F0ZWQoRlhfQk9PTCB0cnVuY2F0ZWQpOw0KKw0KKyBwcml2YXRlOg0KKyAgdm9pZCByb3RhdGVBcnJheShDRlhfQnl0ZUFycmF5JiBiaXRhcnJheSwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOw0KKyAgRlhfQk9PTCBtX2JUcnVuY2F0ZWQ7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfRmluZGVyUGF0dGVybkluZm8uY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX0ZpbmRlclBhdHRlcm5JbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmM2MTQ4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX0ZpbmRlclBhdHRlcm5JbmZvLmNwcApAQCAtMCwwICsxLDQxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDA3IFpYaW5nIGF1dGhvcnMNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfUmVzdWx0UG9pbnQuaCINCisjaW5jbHVkZSAiQkNfUVJGaW5kZXJQYXR0ZXJuLmgiDQorI2luY2x1ZGUgIkJDX0ZpbmRlclBhdHRlcm5JbmZvLmgiDQorQ0JDX1FSRmluZGVyUGF0dGVybkluZm86OkNCQ19RUkZpbmRlclBhdHRlcm5JbmZvKENGWF9QdHJBcnJheSogcGF0dGVybkNlbnRlcnMpIHsNCisgIG1fYm90dG9tTGVmdCA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuKikoKnBhdHRlcm5DZW50ZXJzKVswXTsNCisgIG1fdG9wTGVmdCA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuKikoKnBhdHRlcm5DZW50ZXJzKVsxXTsNCisgIG1fdG9wUmlnaHQgPSAoQ0JDX1FSRmluZGVyUGF0dGVybiopKCpwYXR0ZXJuQ2VudGVycylbMl07DQorfQ0KK0NCQ19RUkZpbmRlclBhdHRlcm5JbmZvOjp+Q0JDX1FSRmluZGVyUGF0dGVybkluZm8oKSB7fQ0KK0NCQ19RUkZpbmRlclBhdHRlcm4qIENCQ19RUkZpbmRlclBhdHRlcm5JbmZvOjpHZXRCb3R0b21MZWZ0KCkgew0KKyAgcmV0dXJuIG1fYm90dG9tTGVmdDsNCit9DQorQ0JDX1FSRmluZGVyUGF0dGVybiogQ0JDX1FSRmluZGVyUGF0dGVybkluZm86OkdldFRvcExlZnQoKSB7DQorICByZXR1cm4gbV90b3BMZWZ0Ow0KK30NCitDQkNfUVJGaW5kZXJQYXR0ZXJuKiBDQkNfUVJGaW5kZXJQYXR0ZXJuSW5mbzo6R2V0VG9wUmlnaHQoKSB7DQorICByZXR1cm4gbV90b3BSaWdodDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX0ZpbmRlclBhdHRlcm5JbmZvLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfRmluZGVyUGF0dGVybkluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODhhN2FmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX0ZpbmRlclBhdHRlcm5JbmZvLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19GSU5ERVJQQVRURVJOSU5GT19IXw0KKyNkZWZpbmUgX0JDX0ZJTkRFUlBBVFRFUk5JTkZPX0hfDQorY2xhc3MgQ0JDX1FSRmluZGVyUGF0dGVybjsNCitjbGFzcyBDQkNfUVJGaW5kZXJQYXR0ZXJuSW5mbyB7DQorIHByaXZhdGU6DQorICBDQkNfUVJGaW5kZXJQYXR0ZXJuKiBtX2JvdHRvbUxlZnQ7DQorICBDQkNfUVJGaW5kZXJQYXR0ZXJuKiBtX3RvcExlZnQ7DQorICBDQkNfUVJGaW5kZXJQYXR0ZXJuKiBtX3RvcFJpZ2h0Ow0KKw0KKyBwdWJsaWM6DQorICBDQkNfUVJGaW5kZXJQYXR0ZXJuSW5mbyhDRlhfUHRyQXJyYXkqIHBhdHRlcm5DZW50ZXJzKTsNCisgIHZpcnR1YWwgfkNCQ19RUkZpbmRlclBhdHRlcm5JbmZvKCk7DQorICBDQkNfUVJGaW5kZXJQYXR0ZXJuKiBHZXRCb3R0b21MZWZ0KCk7DQorICBDQkNfUVJGaW5kZXJQYXR0ZXJuKiBHZXRUb3BMZWZ0KCk7DQorICBDQkNfUVJGaW5kZXJQYXR0ZXJuKiBHZXRUb3BSaWdodCgpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQWxpZ25tZW50UGF0dGVybi5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJBbGlnbm1lbnRQYXR0ZXJuLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWJiYjdkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQWxpZ25tZW50UGF0dGVybi5jcHAKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1Jlc3VsdFBvaW50LmgiDQorI2luY2x1ZGUgIkJDX1FSQWxpZ25tZW50UGF0dGVybi5oIg0KK0NCQ19RUkFsaWdubWVudFBhdHRlcm46OkNCQ19RUkFsaWdubWVudFBhdHRlcm4oRlhfRkxPQVQgcG9zWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHBvc1ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBlc3RpbWF0ZU1vZHVsZVNpemUpDQorICAgIDogQ0JDX1Jlc3VsdFBvaW50KHBvc1gsIHBvc1kpLCBtX21vZHVsZVNpemUoZXN0aW1hdGVNb2R1bGVTaXplKSB7fQ0KK0NCQ19RUkFsaWdubWVudFBhdHRlcm46On5DQkNfUVJBbGlnbm1lbnRQYXR0ZXJuKCkge30NCitGWF9GTE9BVCBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuOjpHZXRYKCkgew0KKyAgcmV0dXJuIG1feDsNCit9DQorRlhfRkxPQVQgQ0JDX1FSQWxpZ25tZW50UGF0dGVybjo6R2V0WSgpIHsNCisgIHJldHVybiBtX3k7DQorfQ0KK0ZYX0JPT0wgQ0JDX1FSQWxpZ25tZW50UGF0dGVybjo6QWJvdXRFcXVhbHMoRlhfRkxPQVQgbW9kdWxlU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBqKSB7DQorICBpZiAoKEZYU1lTX2ZhYnMoaSAtIEdldFkoKSkgPD0gbW9kdWxlU2l6ZSkgJiYNCisgICAgICAoRlhTWVNfZmFicyhqIC0gR2V0WCgpKSA8PSBtb2R1bGVTaXplKSkgew0KKyAgICBGWF9GTE9BVCBtb2R1bGVTaXplRGlmZiA9IEZYU1lTX2ZhYnMobW9kdWxlU2l6ZSAtIG1fbW9kdWxlU2l6ZSk7DQorICAgIHJldHVybiAobW9kdWxlU2l6ZURpZmYgPD0gMS4wZikgfHwgKG1vZHVsZVNpemVEaWZmIC8gbV9tb2R1bGVTaXplIDw9IDEuMGYpOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuKiBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuOjpDbG9uZSgpIHsNCisgIHJldHVybiBuZXcgQ0JDX1FSQWxpZ25tZW50UGF0dGVybihtX3gsIG1feSwgbV9tb2R1bGVTaXplKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQWxpZ25tZW50UGF0dGVybi5oIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQWxpZ25tZW50UGF0dGVybi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmODVjYTUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJBbGlnbm1lbnRQYXR0ZXJuLmgKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19RUkFMSUdOTUVOVFBBVFRFUk5fSF8NCisjZGVmaW5lIF9CQ19RUkFMSUdOTUVOVFBBVFRFUk5fSF8NCitjbGFzcyBDQkNfQ29tbW9uQml0QXJyYXk7DQorY2xhc3MgQ0JDX1Jlc3VsdFBvaW50Ow0KK2NsYXNzIENCQ19SRUFJMDEzeDB4MXhEZWNvZGVyOw0KK2NsYXNzIENCQ19RUkFsaWdubWVudFBhdHRlcm4gOiBwdWJsaWMgQ0JDX1Jlc3VsdFBvaW50IHsNCisgcHJpdmF0ZToNCisgIEZYX0ZMT0FUIG1fbW9kdWxlU2l6ZTsNCisNCisgcHVibGljOg0KKyAgQ0JDX1FSQWxpZ25tZW50UGF0dGVybihGWF9GTE9BVCBwb3NYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwb3NZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBlc3RpbWF0ZU1vZHVsZVNpemUpOw0KKyAgdmlydHVhbCB+Q0JDX1FSQWxpZ25tZW50UGF0dGVybigpOw0KKyAgRlhfQk9PTCBBYm91dEVxdWFscyhGWF9GTE9BVCBtb2R1bGVTaXplLCBGWF9GTE9BVCBpLCBGWF9GTE9BVCBqKTsNCisgIEZYX0ZMT0FUIEdldFgoKTsNCisgIEZYX0ZMT0FUIEdldFkoKTsNCisgIENCQ19RUkFsaWdubWVudFBhdHRlcm4qIENsb25lKCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYzAxYzIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyLmNwcApAQCAtMCwwICsxLDIwMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1Jlc3VsdFBvaW50LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAiQkNfUVJBbGlnbm1lbnRQYXR0ZXJuLmgiDQorI2luY2x1ZGUgIkJDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlci5oIg0KK0NCQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXI6OkNCQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXIoDQorICAgIENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLA0KKyAgICBpbnQzMl90IHN0YXJ0WCwNCisgICAgaW50MzJfdCBzdGFydFksDQorICAgIGludDMyX3Qgd2lkdGgsDQorICAgIGludDMyX3QgaGVpZ2h0LA0KKyAgICBGWF9GTE9BVCBtb2R1bGVTaXplKQ0KKyAgICA6IG1faW1hZ2UoaW1hZ2UpLA0KKyAgICAgIG1fc3RhcnRYKHN0YXJ0WCksDQorICAgICAgbV9zdGFydFkoc3RhcnRZKSwNCisgICAgICBtX3dpZHRoKHdpZHRoKSwNCisgICAgICBtX2hlaWdodChoZWlnaHQpLA0KKyAgICAgIG1fbW9kdWxlU2l6ZShtb2R1bGVTaXplKQ0KKw0KK3sNCisgIG1fY3Jvc3NDaGVja1N0YXRlQ291bnQuU2V0U2l6ZSgzKTsNCit9DQorQ0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlcjo6fkNCQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXIoKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX3Bvc3NpYmxlQ2VudGVycy5HZXRTaXplKCk7IGkrKykgew0KKyAgICBkZWxldGUgKENCQ19RUkFsaWdubWVudFBhdHRlcm4qKW1fcG9zc2libGVDZW50ZXJzW2ldOw0KKyAgfQ0KKyAgbV9wb3NzaWJsZUNlbnRlcnMuUmVtb3ZlQWxsKCk7DQorfQ0KK0NCQ19RUkFsaWdubWVudFBhdHRlcm4qIENCQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXI6OkZpbmQoaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBzdGFydFggPSBtX3N0YXJ0WDsNCisgIGludDMyX3QgaGVpZ2h0ID0gbV9oZWlnaHQ7DQorICBpbnQzMl90IG1heEogPSBzdGFydFggKyBtX3dpZHRoOw0KKyAgaW50MzJfdCBtaWRkbGVJID0gbV9zdGFydFkgKyAoaGVpZ2h0ID4+IDEpOw0KKyAgQ0ZYX0ludDMyQXJyYXkgc3RhdGVDb3VudDsNCisgIHN0YXRlQ291bnQuU2V0U2l6ZSgzKTsNCisgIGZvciAoaW50MzJfdCBpR2VuID0gMDsgaUdlbiA8IGhlaWdodDsgaUdlbisrKSB7DQorICAgIGludDMyX3QgaSA9DQorICAgICAgICBtaWRkbGVJICsgKChpR2VuICYgMHgwMSkgPT0gMCA/ICgoaUdlbiArIDEpID4+IDEpIDogLSgoaUdlbiArIDEpID4+IDEpKTsNCisgICAgc3RhdGVDb3VudFswXSA9IDA7DQorICAgIHN0YXRlQ291bnRbMV0gPSAwOw0KKyAgICBzdGF0ZUNvdW50WzJdID0gMDsNCisgICAgaW50MzJfdCBqID0gc3RhcnRYOw0KKyAgICB3aGlsZSAoaiA8IG1heEogJiYgIW1faW1hZ2UtPkdldChqLCBpKSkgew0KKyAgICAgIGorKzsNCisgICAgfQ0KKyAgICBpbnQzMl90IGN1cnJlbnRTdGF0ZSA9IDA7DQorICAgIHdoaWxlIChqIDwgbWF4Sikgew0KKyAgICAgIGlmIChtX2ltYWdlLT5HZXQoaiwgaSkpIHsNCisgICAgICAgIGlmIChjdXJyZW50U3RhdGUgPT0gMSkgew0KKyAgICAgICAgICBzdGF0ZUNvdW50W2N1cnJlbnRTdGF0ZV0rKzsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGlmIChjdXJyZW50U3RhdGUgPT0gMikgew0KKyAgICAgICAgICAgIGlmIChGb3VuZFBhdHRlcm5Dcm9zcyhzdGF0ZUNvdW50KSkgew0KKyAgICAgICAgICAgICAgQ0JDX1FSQWxpZ25tZW50UGF0dGVybiogY29uZmlybWVkID0NCisgICAgICAgICAgICAgICAgICBIYW5kbGVQb3NzaWJsZUNlbnRlcihzdGF0ZUNvdW50LCBpLCBqKTsNCisgICAgICAgICAgICAgIGlmIChjb25maXJtZWQgIT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlybWVkOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzdGF0ZUNvdW50WzBdID0gc3RhdGVDb3VudFsyXTsNCisgICAgICAgICAgICBzdGF0ZUNvdW50WzFdID0gMTsNCisgICAgICAgICAgICBzdGF0ZUNvdW50WzJdID0gMDsNCisgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSAxOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHN0YXRlQ291bnRbKytjdXJyZW50U3RhdGVdKys7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZSA9PSAxKSB7DQorICAgICAgICAgIGN1cnJlbnRTdGF0ZSsrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc3RhdGVDb3VudFtjdXJyZW50U3RhdGVdKys7DQorICAgICAgfQ0KKyAgICAgIGorKzsNCisgICAgfQ0KKyAgICBpZiAoRm91bmRQYXR0ZXJuQ3Jvc3Moc3RhdGVDb3VudCkpIHsNCisgICAgICBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuKiBjb25maXJtZWQgPQ0KKyAgICAgICAgICBIYW5kbGVQb3NzaWJsZUNlbnRlcihzdGF0ZUNvdW50LCBpLCBtYXhKKTsNCisgICAgICBpZiAoY29uZmlybWVkICE9IE5VTEwpIHsNCisgICAgICAgIHJldHVybiBjb25maXJtZWQ7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAobV9wb3NzaWJsZUNlbnRlcnMuR2V0U2l6ZSgpICE9IDApIHsNCisgICAgcmV0dXJuICgoQ0JDX1FSQWxpZ25tZW50UGF0dGVybiopKG1fcG9zc2libGVDZW50ZXJzWzBdKSktPkNsb25lKCk7DQorICB9DQorICBlID0gQkNFeGNlcHRpb25SZWFkOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX0ZMT0FUIENCQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXI6OkNlbnRlckZyb21FbmQoDQorICAgIGNvbnN0IENGWF9JbnQzMkFycmF5JiBzdGF0ZUNvdW50LA0KKyAgICBpbnQzMl90IGVuZCkgew0KKyAgcmV0dXJuIChGWF9GTE9BVCkoZW5kIC0gc3RhdGVDb3VudFsyXSkgLSBzdGF0ZUNvdW50WzFdIC8gMi4wZjsNCit9DQorRlhfQk9PTCBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyOjpGb3VuZFBhdHRlcm5Dcm9zcygNCisgICAgY29uc3QgQ0ZYX0ludDMyQXJyYXkmIHN0YXRlQ291bnQpIHsNCisgIEZYX0ZMT0FUIG1vZHVsZVNpemUgPSBtX21vZHVsZVNpemU7DQorICBGWF9GTE9BVCBtYXhWYXJpYW5jZSA9IG1vZHVsZVNpemUgLyAyLjBmOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMzsgaSsrKSB7DQorICAgIGlmIChmYWJzKG1vZHVsZVNpemUgLSBzdGF0ZUNvdW50W2ldKSA+PSBtYXhWYXJpYW5jZSkgew0KKyAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0ZMT0FUIENCQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXI6OkNyb3NzQ2hlY2tWZXJ0aWNhbCgNCisgICAgaW50MzJfdCBzdGFydEksDQorICAgIGludDMyX3QgY2VudGVySiwNCisgICAgaW50MzJfdCBtYXhDb3VudCwNCisgICAgaW50MzJfdCBvcmlnaW5hbFN0YXRlQ291bnRUb3RhbCkgew0KKyAgaW50MzJfdCBtYXhJID0gbV9pbWFnZS0+R2V0SGVpZ2h0KCk7DQorICBDRlhfSW50MzJBcnJheSBzdGF0ZUNvdW50Ow0KKyAgc3RhdGVDb3VudC5Db3B5KG1fY3Jvc3NDaGVja1N0YXRlQ291bnQpOw0KKyAgc3RhdGVDb3VudFswXSA9IDA7DQorICBzdGF0ZUNvdW50WzFdID0gMDsNCisgIHN0YXRlQ291bnRbMl0gPSAwOw0KKyAgaW50MzJfdCBpID0gc3RhcnRJOw0KKyAgd2hpbGUgKGkgPj0gMCAmJiBtX2ltYWdlLT5HZXQoY2VudGVySiwgaSkgJiYgc3RhdGVDb3VudFsxXSA8PSBtYXhDb3VudCkgew0KKyAgICBzdGF0ZUNvdW50WzFdKys7DQorICAgIGktLTsNCisgIH0NCisgIGlmIChpIDwgMCB8fCBzdGF0ZUNvdW50WzFdID4gbWF4Q291bnQpIHsNCisgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KKyAgfQ0KKyAgd2hpbGUgKGkgPj0gMCAmJiAhbV9pbWFnZS0+R2V0KGNlbnRlckosIGkpICYmIHN0YXRlQ291bnRbMF0gPD0gbWF4Q291bnQpIHsNCisgICAgc3RhdGVDb3VudFswXSsrOw0KKyAgICBpLS07DQorICB9DQorICBpZiAoc3RhdGVDb3VudFswXSA+IG1heENvdW50KSB7DQorICAgIHJldHVybiBGWFNZU19uYW4oKTsNCisgIH0NCisgIGkgPSBzdGFydEkgKyAxOw0KKyAgd2hpbGUgKGkgPCBtYXhJICYmIG1faW1hZ2UtPkdldChjZW50ZXJKLCBpKSAmJiBzdGF0ZUNvdW50WzFdIDw9IG1heENvdW50KSB7DQorICAgIHN0YXRlQ291bnRbMV0rKzsNCisgICAgaSsrOw0KKyAgfQ0KKyAgaWYgKGkgPT0gbWF4SSB8fCBzdGF0ZUNvdW50WzFdID4gbWF4Q291bnQpIHsNCisgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KKyAgfQ0KKyAgd2hpbGUgKGkgPCBtYXhJICYmICFtX2ltYWdlLT5HZXQoY2VudGVySiwgaSkgJiYgc3RhdGVDb3VudFsyXSA8PSBtYXhDb3VudCkgew0KKyAgICBzdGF0ZUNvdW50WzJdKys7DQorICAgIGkrKzsNCisgIH0NCisgIGlmIChzdGF0ZUNvdW50WzJdID4gbWF4Q291bnQpIHsNCisgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KKyAgfQ0KKyAgaW50MzJfdCBzdGF0ZUNvdW50VG90YWwgPSBzdGF0ZUNvdW50WzBdICsgc3RhdGVDb3VudFsxXSArIHN0YXRlQ291bnRbMl07DQorICBpZiAoNSAqIGFicyhzdGF0ZUNvdW50VG90YWwgLSBvcmlnaW5hbFN0YXRlQ291bnRUb3RhbCkgPj0NCisgICAgICBvcmlnaW5hbFN0YXRlQ291bnRUb3RhbCkgew0KKyAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQorICB9DQorICByZXR1cm4gRm91bmRQYXR0ZXJuQ3Jvc3Moc3RhdGVDb3VudCkgPyBDZW50ZXJGcm9tRW5kKHN0YXRlQ291bnQsIGkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGWFNZU19uYW4oKTsNCit9DQorQ0JDX1FSQWxpZ25tZW50UGF0dGVybiogQ0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlcjo6SGFuZGxlUG9zc2libGVDZW50ZXIoDQorICAgIGNvbnN0IENGWF9JbnQzMkFycmF5JiBzdGF0ZUNvdW50LA0KKyAgICBpbnQzMl90IGksDQorICAgIGludDMyX3Qgaikgew0KKyAgaW50MzJfdCBzdGF0ZUNvdW50VG90YWwgPSBzdGF0ZUNvdW50WzBdICsgc3RhdGVDb3VudFsxXSArIHN0YXRlQ291bnRbMl07DQorICBGWF9GTE9BVCBjZW50ZXJKID0gQ2VudGVyRnJvbUVuZChzdGF0ZUNvdW50LCBqKTsNCisgIEZYX0ZMT0FUIGNlbnRlckkgPSBDcm9zc0NoZWNrVmVydGljYWwoaSwgKGludDMyX3QpY2VudGVySiwgMiAqIHN0YXRlQ291bnRbMV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRUb3RhbCk7DQorICBpZiAoIUZYU1lTX2lzbmFuKGNlbnRlckkpKSB7DQorICAgIEZYX0ZMT0FUIGVzdGltYXRlZE1vZHVsZVNpemUgPQ0KKyAgICAgICAgKEZYX0ZMT0FUKShzdGF0ZUNvdW50WzBdICsgc3RhdGVDb3VudFsxXSArIHN0YXRlQ291bnRbMl0pIC8gMy4wZjsNCisgICAgaW50MzJfdCBtYXggPSBtX3Bvc3NpYmxlQ2VudGVycy5HZXRTaXplKCk7DQorICAgIGZvciAoaW50MzJfdCBpbmRleCA9IDA7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7DQorICAgICAgQ0JDX1FSQWxpZ25tZW50UGF0dGVybiogY2VudGVyID0NCisgICAgICAgICAgKENCQ19RUkFsaWdubWVudFBhdHRlcm4qKShtX3Bvc3NpYmxlQ2VudGVyc1tpbmRleF0pOw0KKyAgICAgIGlmIChjZW50ZXItPkFib3V0RXF1YWxzKGVzdGltYXRlZE1vZHVsZVNpemUsIGNlbnRlckksIGNlbnRlckopKSB7DQorICAgICAgICByZXR1cm4gbmV3IENCQ19RUkFsaWdubWVudFBhdHRlcm4oY2VudGVySiwgY2VudGVySSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZWRNb2R1bGVTaXplKTsNCisgICAgICB9DQorICAgIH0NCisgICAgbV9wb3NzaWJsZUNlbnRlcnMuQWRkKA0KKyAgICAgICAgbmV3IENCQ19RUkFsaWdubWVudFBhdHRlcm4oY2VudGVySiwgY2VudGVySSwgZXN0aW1hdGVkTW9kdWxlU2l6ZSkpOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjBmYWJhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlci5oCkBAIC0wLDAgKzEsNDEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUVJBTElHTk1FTlRQQVRURVJORklOREVSX0hfDQorI2RlZmluZSBfQkNfUVJBTElHTk1FTlRQQVRURVJORklOREVSX0hfDQorY2xhc3MgQ0JDX0NvbW1vbkJpdE1hdHJpeDsNCitjbGFzcyBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuOw0KK2NsYXNzIENCQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXIgew0KKyBwcml2YXRlOg0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogbV9pbWFnZTsNCisgIENGWF9QdHJBcnJheSBtX3Bvc3NpYmxlQ2VudGVyczsNCisgIGludDMyX3QgbV9zdGFydFg7DQorICBpbnQzMl90IG1fc3RhcnRZOw0KKyAgaW50MzJfdCBtX3dpZHRoOw0KKyAgaW50MzJfdCBtX2hlaWdodDsNCisgIEZYX0ZMT0FUIG1fbW9kdWxlU2l6ZTsNCisgIENGWF9JbnQzMkFycmF5IG1fY3Jvc3NDaGVja1N0YXRlQ291bnQ7DQorDQorIHB1YmxpYzoNCisgIENCQ19RUkFsaWdubWVudFBhdHRlcm5GaW5kZXIoQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0WSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG1vZHVsZVNpemUpOw0KKyAgdmlydHVhbCB+Q0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlcigpOw0KKyAgRlhfQk9PTCBGb3VuZFBhdHRlcm5Dcm9zcyhjb25zdCBDRlhfSW50MzJBcnJheSYgc3RhdGVDb3VudCk7DQorICBGWF9GTE9BVCBDcm9zc0NoZWNrVmVydGljYWwoaW50MzJfdCBzdGFydEksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydEosDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhDb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9yaWdpbmFsU3RhdGVDb3VudFRvdGFsKTsNCisgIENCQ19RUkFsaWdubWVudFBhdHRlcm4qIEZpbmQoaW50MzJfdCYgZSk7DQorICBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuKiBIYW5kbGVQb3NzaWJsZUNlbnRlcihjb25zdCBDRlhfSW50MzJBcnJheSYgc3RhdGVDb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgaik7DQorICBzdGF0aWMgRlhfRkxPQVQgQ2VudGVyRnJvbUVuZChjb25zdCBDRlhfSW50MzJBcnJheSYgc3RhdGVDb3VudCwgaW50MzJfdCBlbmQpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQml0TWF0cml4UGFyc2VyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkJpdE1hdHJpeFBhcnNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQyODkwMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkJpdE1hdHJpeFBhcnNlci5jcHAKQEAgLTAsMCArMSwxODQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgiDQorI2luY2x1ZGUgIkJDX1FSQ29kZXJWZXJzaW9uLmgiDQorI2luY2x1ZGUgIkJDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbi5oIg0KKyNpbmNsdWRlICJCQ19RUkRhdGFNYXNrLmgiDQorI2luY2x1ZGUgIkJDX1FSQml0TWF0cml4UGFyc2VyLmgiDQorQ0JDX1FSQml0TWF0cml4UGFyc2VyOjpDQkNfUVJCaXRNYXRyaXhQYXJzZXIoKSB7fQ0KK3ZvaWQgQ0JDX1FSQml0TWF0cml4UGFyc2VyOjpJbml0KENCQ19Db21tb25CaXRNYXRyaXgqIGJpdE1hdHJpeCwgaW50MzJfdCYgZSkgew0KKyAgbV9kaW1lbnNpb24gPSBiaXRNYXRyaXgtPkdldERpbWVuc2lvbihlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgbV90ZW1wQml0TWF0cml4ID0gYml0TWF0cml4Ow0KKyAgaWYgKG1fZGltZW5zaW9uIDwgMjEgfHwgKG1fZGltZW5zaW9uICYgMHgwMykgIT0gMSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25SZWFkOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCisgIG1fYml0TWF0cml4ID0gbV90ZW1wQml0TWF0cml4Ow0KKyAgbV9wYXJzZWRGb3JtYXRJbmZvID0gTlVMTDsNCisgIG1fdmVyc2lvbiA9IE5VTEw7DQorfQ0KK0NCQ19RUkJpdE1hdHJpeFBhcnNlcjo6fkNCQ19RUkJpdE1hdHJpeFBhcnNlcigpIHsNCisgIGlmIChtX3BhcnNlZEZvcm1hdEluZm8gIT0gTlVMTCkgew0KKyAgICBkZWxldGUgbV9wYXJzZWRGb3JtYXRJbmZvOw0KKyAgICBtX3BhcnNlZEZvcm1hdEluZm8gPSBOVUxMOw0KKyAgfQ0KKyAgbV92ZXJzaW9uID0gTlVMTDsNCit9DQorQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbiogQ0JDX1FSQml0TWF0cml4UGFyc2VyOjpSZWFkRm9ybWF0SW5mb3JtYXRpb24oDQorICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChtX3BhcnNlZEZvcm1hdEluZm8gIT0gTlVMTCkgew0KKyAgICByZXR1cm4gbV9wYXJzZWRGb3JtYXRJbmZvOw0KKyAgfQ0KKyAgaW50MzJfdCBmb3JtYXRJbmZvQml0cyA9IDA7DQorICBpbnQzMl90IGo7DQorICBmb3IgKGogPSAwOyBqIDwgNjsgaisrKSB7DQorICAgIGZvcm1hdEluZm9CaXRzID0gQ29weUJpdCg4LCBqLCBmb3JtYXRJbmZvQml0cyk7DQorICB9DQorICBmb3JtYXRJbmZvQml0cyA9IENvcHlCaXQoOCwgNywgZm9ybWF0SW5mb0JpdHMpOw0KKyAgZm9ybWF0SW5mb0JpdHMgPSBDb3B5Qml0KDgsIDgsIGZvcm1hdEluZm9CaXRzKTsNCisgIGZvcm1hdEluZm9CaXRzID0gQ29weUJpdCg3LCA4LCBmb3JtYXRJbmZvQml0cyk7DQorICBmb3IgKGludDMyX3QgaSA9IDU7IGkgPj0gMDsgaS0tKSB7DQorICAgIGZvcm1hdEluZm9CaXRzID0gQ29weUJpdChpLCA4LCBmb3JtYXRJbmZvQml0cyk7DQorICB9DQorICBtX3BhcnNlZEZvcm1hdEluZm8gPQ0KKyAgICAgIENCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb246OkRlY29kZUZvcm1hdEluZm9ybWF0aW9uKGZvcm1hdEluZm9CaXRzKTsNCisgIGlmIChtX3BhcnNlZEZvcm1hdEluZm8gIT0gTlVMTCkgew0KKyAgICByZXR1cm4gbV9wYXJzZWRGb3JtYXRJbmZvOw0KKyAgfQ0KKyAgaW50MzJfdCBkaW1lbnNpb24gPSBtX2JpdE1hdHJpeC0+R2V0RGltZW5zaW9uKGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgZm9ybWF0SW5mb0JpdHMgPSAwOw0KKyAgaW50MzJfdCBpTWluID0gZGltZW5zaW9uIC0gODsNCisgIGZvciAoaiA9IGRpbWVuc2lvbiAtIDE7IGogPj0gaU1pbjsgai0tKSB7DQorICAgIGZvcm1hdEluZm9CaXRzID0gQ29weUJpdChqLCA4LCBmb3JtYXRJbmZvQml0cyk7DQorICB9DQorICBmb3IgKGludDMyX3QgayA9IGRpbWVuc2lvbiAtIDc7IGsgPCBkaW1lbnNpb247IGsrKykgew0KKyAgICBmb3JtYXRJbmZvQml0cyA9IENvcHlCaXQoOCwgaywgZm9ybWF0SW5mb0JpdHMpOw0KKyAgfQ0KKyAgbV9wYXJzZWRGb3JtYXRJbmZvID0NCisgICAgICBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uOjpEZWNvZGVGb3JtYXRJbmZvcm1hdGlvbihmb3JtYXRJbmZvQml0cyk7DQorICBpZiAobV9wYXJzZWRGb3JtYXRJbmZvICE9IE5VTEwpIHsNCisgICAgcmV0dXJuIG1fcGFyc2VkRm9ybWF0SW5mbzsNCisgIH0NCisgIGUgPSBCQ0V4Y2VwdGlvblJlYWQ7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gTlVMTDsNCit9DQorQ0JDX1FSQ29kZXJWZXJzaW9uKiBDQkNfUVJCaXRNYXRyaXhQYXJzZXI6OlJlYWRWZXJzaW9uKGludDMyX3QmIGUpIHsNCisgIGlmIChtX3ZlcnNpb24gIT0gTlVMTCkgew0KKyAgICByZXR1cm4gbV92ZXJzaW9uOw0KKyAgfQ0KKyAgaW50MzJfdCBkaW1lbnNpb24gPSBtX2JpdE1hdHJpeC0+R2V0RGltZW5zaW9uKGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgaW50MzJfdCBwcm92aXNpb25WZXJzaW9uID0gKGRpbWVuc2lvbiAtIDE3KSA+PiAyOw0KKyAgaWYgKHByb3Zpc2lvblZlcnNpb24gPD0gNikgew0KKyAgICBDQkNfUVJDb2RlclZlcnNpb24qIHFydiA9DQorICAgICAgICBDQkNfUVJDb2RlclZlcnNpb246OkdldFZlcnNpb25Gb3JOdW1iZXIocHJvdmlzaW9uVmVyc2lvbiwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgcmV0dXJuIHFydjsNCisgIH0NCisgIGludDMyX3QgdmVyc2lvbkJpdHMgPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSA1OyBpID49IDA7IGktLSkgew0KKyAgICBpbnQzMl90IGpNaW4gPSBkaW1lbnNpb24gLSAxMTsNCisgICAgZm9yIChpbnQzMl90IGogPSBkaW1lbnNpb24gLSA5OyBqID49IGpNaW47IGotLSkgew0KKyAgICAgIHZlcnNpb25CaXRzID0gQ29weUJpdChpLCBqLCB2ZXJzaW9uQml0cyk7DQorICAgIH0NCisgIH0NCisgIG1fdmVyc2lvbiA9IENCQ19RUkNvZGVyVmVyc2lvbjo6RGVjb2RlVmVyc2lvbkluZm9ybWF0aW9uKHZlcnNpb25CaXRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIGlmIChtX3ZlcnNpb24gIT0gTlVMTCAmJiBtX3ZlcnNpb24tPkdldERpbWVuc2lvbkZvclZlcnNpb24oKSA9PSBkaW1lbnNpb24pIHsNCisgICAgcmV0dXJuIG1fdmVyc2lvbjsNCisgIH0NCisgIHZlcnNpb25CaXRzID0gMDsNCisgIGZvciAoaW50MzJfdCBqID0gNTsgaiA+PSAwOyBqLS0pIHsNCisgICAgaW50MzJfdCBpTWluID0gZGltZW5zaW9uIC0gMTE7DQorICAgIGZvciAoaW50MzJfdCBpID0gZGltZW5zaW9uIC0gOTsgaSA+PSBpTWluOyBpLS0pIHsNCisgICAgICB2ZXJzaW9uQml0cyA9IENvcHlCaXQoaSwgaiwgdmVyc2lvbkJpdHMpOw0KKyAgICB9DQorICB9DQorICBtX3ZlcnNpb24gPSBDQkNfUVJDb2RlclZlcnNpb246OkRlY29kZVZlcnNpb25JbmZvcm1hdGlvbih2ZXJzaW9uQml0cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBpZiAobV92ZXJzaW9uICE9IE5VTEwgJiYgbV92ZXJzaW9uLT5HZXREaW1lbnNpb25Gb3JWZXJzaW9uKCkgPT0gZGltZW5zaW9uKSB7DQorICAgIHJldHVybiBtX3ZlcnNpb247DQorICB9DQorICBlID0gQkNFeGNlcHRpb25SZWFkOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK2ludDMyX3QgQ0JDX1FSQml0TWF0cml4UGFyc2VyOjpDb3B5Qml0KGludDMyX3QgaSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGosDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2ZXJzaW9uQml0cykgew0KKyAgcmV0dXJuIG1fYml0TWF0cml4LT5HZXQoaiwgaSkgPyAodmVyc2lvbkJpdHMgPDwgMSkgfCAweDEgOiB2ZXJzaW9uQml0cyA8PCAxOw0KK30NCitDRlhfQnl0ZUFycmF5KiBDQkNfUVJCaXRNYXRyaXhQYXJzZXI6OlJlYWRDb2Rld29yZHMoaW50MzJfdCYgZSkgew0KKyAgQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbiogZm9ybWF0SW5mbyA9IFJlYWRGb3JtYXRJbmZvcm1hdGlvbihlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKSBDQkNfUVJDb2RlclZlcnNpb24qIHZlcnNpb24gPQ0KKyAgICAgIFJlYWRWZXJzaW9uKGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgQ0JDX1FSRGF0YU1hc2sqIGRhdGFNYXNrID0NCisgICAgICBDQkNfUVJEYXRhTWFzazo6Rm9yUmVmZXJlbmNlKChpbnQzMl90KShmb3JtYXRJbmZvLT5HZXREYXRhTWFzaygpKSwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBpbnQzMl90IGRpbWVuc2lvbiA9IG1fYml0TWF0cml4LT5HZXREaW1lbnNpb24oZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBkYXRhTWFzay0+VW5tYXNrQml0TWF0aXJ4KG1fYml0TWF0cml4LCBkaW1lbnNpb24pOw0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogY2JtID0gdmVyc2lvbi0+QnVpbGRGdW5jdGlvblBhdHRlcm4oZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBDQkNfQXV0b1B0cjxDQkNfQ29tbW9uQml0TWF0cml4PiBmdW5jdGlvblBhdHRlcm4oY2JtKTsNCisgIEZYX0JPT0wgcmVhZGluZ1VwID0gVFJVRTsNCisgIENGWF9CeXRlQXJyYXkqIHRlbXAgPSBuZXcgQ0ZYX0J5dGVBcnJheTsNCisgIHRlbXAtPlNldFNpemUodmVyc2lvbi0+R2V0VG90YWxDb2RlV29yZHMoKSk7DQorICBDQkNfQXV0b1B0cjxDRlhfQnl0ZUFycmF5PiByZXN1bHQodGVtcCk7DQorICBpbnQzMl90IHJlc3VsdE9mZnNldCA9IDA7DQorICBpbnQzMl90IGN1cnJlbnRCeXRlID0gMDsNCisgIGludDMyX3QgYml0c1JlYWQgPSAwOw0KKyAgZm9yIChpbnQzMl90IGogPSBkaW1lbnNpb24gLSAxOyBqID4gMDsgaiAtPSAyKSB7DQorICAgIGlmIChqID09IDYpIHsNCisgICAgICBqLS07DQorICAgIH0NCisgICAgZm9yIChpbnQzMl90IGNvdW50ID0gMDsgY291bnQgPCBkaW1lbnNpb247IGNvdW50KyspIHsNCisgICAgICBpbnQzMl90IGkgPSByZWFkaW5nVXAgPyBkaW1lbnNpb24gLSAxIC0gY291bnQgOiBjb3VudDsNCisgICAgICBmb3IgKGludDMyX3QgY29sID0gMDsgY29sIDwgMjsgY29sKyspIHsNCisgICAgICAgIGlmICghZnVuY3Rpb25QYXR0ZXJuLT5HZXQoaiAtIGNvbCwgaSkpIHsNCisgICAgICAgICAgYml0c1JlYWQrKzsNCisgICAgICAgICAgY3VycmVudEJ5dGUgPDw9IDE7DQorICAgICAgICAgIGlmIChtX2JpdE1hdHJpeC0+R2V0KGogLSBjb2wsIGkpKSB7DQorICAgICAgICAgICAgY3VycmVudEJ5dGUgfD0gMTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoYml0c1JlYWQgPT0gOCkgew0KKyAgICAgICAgICAgICgqcmVzdWx0KVtyZXN1bHRPZmZzZXQrK10gPSAodWludDhfdCljdXJyZW50Qnl0ZTsNCisgICAgICAgICAgICBiaXRzUmVhZCA9IDA7DQorICAgICAgICAgICAgY3VycmVudEJ5dGUgPSAwOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIHJlYWRpbmdVcCBePSBUUlVFOw0KKyAgfQ0KKyAgaWYgKHJlc3VsdE9mZnNldCAhPSB2ZXJzaW9uLT5HZXRUb3RhbENvZGVXb3JkcygpKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvblJlYWQ7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIH0NCisgIHJldHVybiByZXN1bHQucmVsZWFzZSgpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJCaXRNYXRyaXhQYXJzZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkJpdE1hdHJpeFBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNjk4NmYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJCaXRNYXRyaXhQYXJzZXIuaApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1FSQUJJVE1BVFJJWFBBUlNFUl9IXw0KKyNkZWZpbmUgX0JDX1FSQUJJVE1BVFJJWFBBUlNFUl9IXw0KK2NsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQorY2xhc3MgQ0JDX1FSQ29kZXJWZXJzaW9uOw0KK2NsYXNzIENCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb247DQorY2xhc3MgQ0JDX1FSRGF0YU1hc2s7DQorY2xhc3MgQ0JDX1FSQml0TWF0cml4UGFyc2VyIHsNCisgcHJpdmF0ZToNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIG1fYml0TWF0cml4Ow0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogbV90ZW1wQml0TWF0cml4Ow0KKyAgQ0JDX1FSQ29kZXJWZXJzaW9uKiBtX3ZlcnNpb247DQorICBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uKiBtX3BhcnNlZEZvcm1hdEluZm87DQorICBpbnQzMl90IG1fZGltZW5zaW9uOw0KKw0KKyBwdWJsaWM6DQorICBDQkNfUVJCaXRNYXRyaXhQYXJzZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19RUkJpdE1hdHJpeFBhcnNlcigpOw0KKyAgQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbiogUmVhZEZvcm1hdEluZm9ybWF0aW9uKGludDMyX3QmIGUpOw0KKyAgQ0JDX1FSQ29kZXJWZXJzaW9uKiBSZWFkVmVyc2lvbihpbnQzMl90JiBlKTsNCisgIGludDMyX3QgQ29weUJpdChpbnQzMl90IGksIGludDMyX3QgaiwgaW50MzJfdCB2ZXJzaW9uQml0cyk7DQorICBDRlhfQnl0ZUFycmF5KiBSZWFkQ29kZXdvcmRzKGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCB2b2lkIEluaXQoQ0JDX0NvbW1vbkJpdE1hdHJpeCogYml0TWF0cml4LCBpbnQzMl90JiBlKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVSZWFkZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZVJlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlOWVmNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVSZWFkZXIuY3BwCkBAIC0wLDAgKzEsMTExIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDA3IFpYaW5nIGF1dGhvcnMNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfUmVhZGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX0x1bWluYW5jZVNvdXJjZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19CdWZmZXJlZEltYWdlTHVtaW5hbmNlU291cmNlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX0JpbmFyaXplci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19CaW5hcnlCaXRtYXAuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfUmVzdWx0UG9pbnQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0dsb2JhbEhpc3RvZ3JhbUJpbmFyaXplci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uRGVjb2RlclJlc3VsdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1Ni5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVSZWFkZXIuaCINCisjaW5jbHVkZSAiQkNfUVJDb2RlUmVhZGVyLmgiDQorI2luY2x1ZGUgIkJDX1FSQ29kZXJNb2RlLmgiDQorI2luY2x1ZGUgIkJDX1FSQ29kZXJEZWNvZGVyLmgiDQorI2luY2x1ZGUgIkJDX1FSRGV0ZWN0b3IuaCINCisjaW5jbHVkZSAiQkNfUVJEZXRlY3RvclJlc3VsdC5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaCINCisjaW5jbHVkZSAiQkNfUVJEYXRhTWFzay5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVSZWFkZXIuaCINCisjaW5jbHVkZSAiQkNfUVJDb2RlclZlcnNpb24uaCINCitDQkNfUVJDb2RlUmVhZGVyOjpDQkNfUVJDb2RlUmVhZGVyKCkgOiBtX2RlY29kZXIoTlVMTCkge30NCit2b2lkIENCQ19RUkNvZGVSZWFkZXI6OkluaXQoKSB7DQorICBtX2RlY29kZXIgPSBuZXcgQ0JDX1FSQ29kZXJEZWNvZGVyOw0KKyAgbV9kZWNvZGVyLT5Jbml0KCk7DQorfQ0KK0NCQ19RUkNvZGVSZWFkZXI6On5DQkNfUVJDb2RlUmVhZGVyKCkgew0KKyAgaWYgKG1fZGVjb2RlciAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBtX2RlY29kZXI7DQorICB9DQorICBtX2RlY29kZXIgPSBOVUxMOw0KK30NCitDRlhfQnl0ZVN0cmluZyBDQkNfUVJDb2RlUmVhZGVyOjpEZWNvZGUoQ0JDX0JpbmFyeUJpdG1hcCogaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIG1hdHJpeCA9IGltYWdlLT5HZXRNYXRyaXgoZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgQ0JDX1FSRGV0ZWN0b3IgZGV0ZWN0b3IobWF0cml4KTsNCisgIENCQ19RUkRldGVjdG9yUmVzdWx0KiBxZHIgPSBkZXRlY3Rvci5EZXRlY3QoaGludHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgIENCQ19BdXRvUHRyPENCQ19RUkRldGVjdG9yUmVzdWx0PiBkZXRlY3RvclJlc3VsdChxZHIpOw0KKyAgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIHFkcjIgPQ0KKyAgICAgIG1fZGVjb2Rlci0+RGVjb2RlKGRldGVjdG9yUmVzdWx0LT5HZXRCaXRzKCksIDAsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgIENCQ19BdXRvUHRyPENCQ19Db21tb25EZWNvZGVyUmVzdWx0PiBkZWNvZGVSZXN1bHQocWRyMik7DQorICByZXR1cm4gKGRlY29kZVJlc3VsdC0+R2V0VGV4dCgpKTsNCit9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX1FSQ29kZVJlYWRlcjo6RGVjb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmaWxlbmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBieXRlTW9kZURlY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0JDX0J1ZmZlcmVkSW1hZ2VMdW1pbmFuY2VTb3VyY2Ugc291cmNlKGZpbGVuYW1lKTsNCisgIHNvdXJjZS5Jbml0KGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgIENCQ19HbG9iYWxIaXN0b2dyYW1CaW5hcml6ZXIgYmluYXJpemVyKCZzb3VyY2UpOw0KKyAgQ0JDX0JpbmFyeUJpdG1hcCBiaXRtYXAoJmJpbmFyaXplcik7DQorICBDRlhfQnl0ZVN0cmluZyBicyA9IERlY29kZSgmYml0bWFwLCBoaW50cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgcmV0dXJuIGJzOw0KK30NCitDRlhfQnl0ZVN0cmluZyBDQkNfUVJDb2RlUmVhZGVyOjpEZWNvZGUoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJ5dGVNb2RlRGVjb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDQkNfQnVmZmVyZWRJbWFnZUx1bWluYW5jZVNvdXJjZSBzb3VyY2UocEJpdG1hcCk7DQorICBDQkNfR2xvYmFsSGlzdG9ncmFtQmluYXJpemVyIGJpbmFyaXplcigmc291cmNlKTsNCisgIENCQ19CaW5hcnlCaXRtYXAgYml0bWFwKCZiaW5hcml6ZXIpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnMgPSBEZWNvZGUoJmJpdG1hcCwgaGludHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsICIiKTsNCisgIHJldHVybiBiczsNCit9DQorQ0ZYX0J5dGVTdHJpbmcgQ0JDX1FSQ29kZVJlYWRlcjo6RGVjb2RlKENCQ19CaW5hcnlCaXRtYXAqIGltYWdlLCBpbnQzMl90JiBlKSB7DQorICBDRlhfQnl0ZVN0cmluZyBicyA9IERlY29kZShpbWFnZSwgMCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgIiIpOw0KKyAgcmV0dXJuIGJzOw0KK30NCit2b2lkIENCQ19RUkNvZGVSZWFkZXI6OlJlbGVhc2VBbGwoKSB7DQorICBpZiAoQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OlFSQ29kZUZpbGQpIHsNCisgICAgZGVsZXRlIENCQ19SZWVkU29sb21vbkdGMjU2OjpRUkNvZGVGaWxkOw0KKyAgICBDQkNfUmVlZFNvbG9tb25HRjI1Njo6UVJDb2RlRmlsZCA9IE5VTEw7DQorICB9DQorICBpZiAoQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkRhdGFNYXRyaXhGaWVsZCkgew0KKyAgICBkZWxldGUgQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkRhdGFNYXRyaXhGaWVsZDsNCisgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkRhdGFNYXRyaXhGaWVsZCA9IE5VTEw7DQorICB9DQorICBDQkNfUVJDb2Rlck1vZGU6OkRlc3Ryb3koKTsNCisgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OkRlc3Ryb3koKTsNCisgIENCQ19RUkRhdGFNYXNrOjpEZXN0cm95KCk7DQorICBDQkNfUVJDb2RlclZlcnNpb246OkRlc3Ryb3koKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZVJlYWRlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZVJlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YmQ2NzEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlUmVhZGVyLmgKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19RUkNPREVSRUFERVJfSF8NCisjZGVmaW5lIF9CQ19RUkNPREVSRUFERVJfSF8NCitjbGFzcyBDQkNfUVJEZXRlY3RvcjsNCitjbGFzcyBDQkNfQmluYXJ5Qml0bWFwOw0KK2NsYXNzIENCQ19RUkNvZGVyRGVjb2RlcjsNCitjbGFzcyBDQkNfUmVzdWx0UG9pbnQ7DQorY2xhc3MgQ0JDX1JlZWRTb2xvbW9uR0YyNTY7DQorY2xhc3MgQ0JDX1FSQ29kZXJWZXJzaW9uOw0KK2NsYXNzIENCQ19RUkRldGVjdG9yOw0KK2NsYXNzIENCQ19RUkRldGVjdG9yUmVzdWx0Ow0KK2NsYXNzIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw7DQorY2xhc3MgQ0JDX1FSQ29kZXJNb2RlOw0KK2NsYXNzIENCQ19RUkRhdGFNYXNrOw0KK2NsYXNzIENCQ19RUkNvZGVSZWFkZXI7DQorY2xhc3MgQ0JDX1FSQ29kZVJlYWRlciA6IHB1YmxpYyBDQkNfUmVhZGVyIHsNCisgcHJpdmF0ZToNCisgIENCQ19RUkNvZGVyRGVjb2RlciogbV9kZWNvZGVyOw0KKw0KKyBwdWJsaWM6DQorICBDQkNfUVJDb2RlUmVhZGVyKCk7DQorICB2aXJ0dWFsIH5DQkNfUVJDb2RlUmVhZGVyKCk7DQorICBDRlhfQnl0ZVN0cmluZyBEZWNvZGUoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBieXRlTW9kZURlY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIENGWF9CeXRlU3RyaW5nIERlY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgZmlsZW5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJ5dGVNb2RlRGVjb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgUmVsZWFzZUFsbCgpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgRGVjb2RlKENCQ19CaW5hcnlCaXRtYXAqIGltYWdlLCBpbnQzMl90IGhpbnRzLCBpbnQzMl90JiBlKTsNCisgIENGWF9CeXRlU3RyaW5nIERlY29kZShDQkNfQmluYXJ5Qml0bWFwKiBpbWFnZSwgaW50MzJfdCYgZSk7DQorICB2aXJ0dWFsIHZvaWQgSW5pdCgpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZVdyaXRlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDMwOTZjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZVdyaXRlci5jcHAKQEAgLTAsMCArMSwxMDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDggWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19Ud29EaW1Xcml0ZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfUmVhZGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CeXRlTWF0cml4LmgiDQorI2luY2x1ZGUgIkJDX1FSQ29kZVdyaXRlci5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVyRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVyLmgiDQorI2luY2x1ZGUgIkJDX1FSQ29kZVJlYWRlci5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaCINCitDQkNfUVJDb2RlV3JpdGVyOjpDQkNfUVJDb2RlV3JpdGVyKCkgew0KKyAgbV9iRml4ZWRTaXplID0gVFJVRTsNCisgIG1faUNvcnJlY3RMZXZlbCA9IDE7DQorICBtX2lWZXJzaW9uID0gMDsNCit9DQorQ0JDX1FSQ29kZVdyaXRlcjo6fkNCQ19RUkNvZGVXcml0ZXIoKSB7fQ0KK3ZvaWQgQ0JDX1FSQ29kZVdyaXRlcjo6UmVsZWFzZUFsbCgpIHsNCisgIENCQ19RUkNvZGVSZWFkZXI6OlJlbGVhc2VBbGwoKTsNCit9DQorRlhfQk9PTCBDQkNfUVJDb2RlV3JpdGVyOjpTZXRWZXJzaW9uKGludDMyX3QgdmVyc2lvbikgew0KKyAgaWYgKHZlcnNpb24gPCAwIHx8IHZlcnNpb24gPiA0MCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX2lWZXJzaW9uID0gdmVyc2lvbjsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENCQ19RUkNvZGVXcml0ZXI6OlNldEVycm9yQ29ycmVjdGlvbkxldmVsKGludDMyX3QgbGV2ZWwpIHsNCisgIGlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPiAzKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIG1faUNvcnJlY3RMZXZlbCA9IGxldmVsOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3VpbnQ4X3QqIENCQ19RUkNvZGVXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZWNMZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWMgPSBOVUxMOw0KKyAgc3dpdGNoIChlY0xldmVsKSB7DQorICAgIGNhc2UgMDoNCisgICAgICBlYyA9IENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6Okw7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMToNCisgICAgICBlYyA9IENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6Ok07DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMjoNCisgICAgICBlYyA9IENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OlE7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMzoNCisgICAgICBlYyA9IENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6Okg7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6IHsNCisgICAgICBlID0gQkNFeGNlcHRpb25VblN1cHBvcnRFY2xldmVsOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgfQ0KKyAgfQ0KKyAgQ0JDX1FSQ29kZXIgcXI7DQorICBpZiAobV9pVmVyc2lvbiA+IDAgJiYgbV9pVmVyc2lvbiA8IDQxKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVTdHIgPSBjb250ZW50cy5VVEY4RW5jb2RlKCk7DQorICAgIENCQ19RUkNvZGVyRW5jb2Rlcjo6RW5jb2RlKGJ5dGVTdHIsIGVjLCAmcXIsIGUsIG1faVZlcnNpb24pOw0KKyAgfSBlbHNlIHsNCisgICAgQ0JDX1FSQ29kZXJFbmNvZGVyOjpFbmNvZGUoY29udGVudHMsIGVjLCAmcXIsIGUpOw0KKyAgfQ0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgb3V0V2lkdGggPSBxci5HZXRNYXRyaXhXaWR0aCgpOw0KKyAgb3V0SGVpZ2h0ID0gcXIuR2V0TWF0cml4V2lkdGgoKTsNCisgIHVpbnQ4X3QqIHJlc3VsdCA9IEZYX0FsbG9jMkQodWludDhfdCwgb3V0V2lkdGgsIG91dEhlaWdodCk7DQorICBGWFNZU19tZW1jcHkocmVzdWx0LCBxci5HZXRNYXRyaXgoKS0+R2V0QXJyYXkoKSwgb3V0V2lkdGggKiBvdXRIZWlnaHQpOw0KKyAgcmV0dXJuIHJlc3VsdDsNCit9DQordWludDhfdCogQ0JDX1FSQ29kZVdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICByZXR1cm4gTlVMTDsNCit9DQordWludDhfdCogQ0JDX1FSQ29kZVdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICByZXR1cm4gTlVMTDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZVdyaXRlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZVdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZGQxZTkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlV3JpdGVyLmgKQEAgLTAsMCArMSw0MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19RUkNPREVSV1JJVEVSX0hfDQorI2RlZmluZSBfQkNfUVJDT0RFUldSSVRFUl9IXw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19Ud29EaW1Xcml0ZXIuaCINCitjbGFzcyBDQkNfVHdvRGltV3JpdGVyOw0KK2NsYXNzIENCQ19NdWx0aUJhckNvZGVzOw0KK2NsYXNzIENCQ19RUkNvZGVyV3JpdGVyOw0KK2NsYXNzIENCQ19RUkNvZGVXcml0ZXIgOiBwdWJsaWMgQ0JDX1R3b0RpbVdyaXRlciB7DQorIHB1YmxpYzoNCisgIENCQ19RUkNvZGVXcml0ZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19RUkNvZGVXcml0ZXIoKTsNCisgIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsDQorICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwNCisgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywNCisgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgRlhfQk9PTCBTZXRWZXJzaW9uKGludDMyX3QgdmVyc2lvbik7DQorICBGWF9CT09MIFNldEVycm9yQ29ycmVjdGlvbkxldmVsKGludDMyX3QgbGV2ZWwpOw0KKyAgc3RhdGljIHZvaWQgUmVsZWFzZUFsbCgpOw0KKw0KKyBwcml2YXRlOg0KKyAgaW50MzJfdCBtX2lWZXJzaW9uOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMjU1M2QKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlci5jcHAKQEAgLTAsMCArMSwxMzUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDggWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZU1hdHJpeC5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaCINCisjaW5jbHVkZSAiQkNfUVJDb2Rlck1vZGUuaCINCisjaW5jbHVkZSAiQkNfUVJDb2Rlci5oIg0KK0NCQ19RUkNvZGVyOjpDQkNfUVJDb2RlcigpIHsNCisgIG1fbW9kZSA9IE5VTEw7DQorICBtX2VjTGV2ZWwgPSBOVUxMOw0KKyAgbV92ZXJzaW9uID0gLTE7DQorICBtX21hdHJpeFdpZHRoID0gLTE7DQorICBtX21hc2tQYXR0ZXJuID0gLTE7DQorICBtX251bVRvdGFsQnl0ZXMgPSAtMTsNCisgIG1fbnVtRGF0YUJ5dGVzID0gLTE7DQorICBtX251bUVDQnl0ZXMgPSAtMTsNCisgIG1fbnVtUlNCbG9ja3MgPSAtMTsNCisgIG1fbWF0cml4ID0gTlVMTDsNCit9DQorQ0JDX1FSQ29kZXI6On5DQkNfUVJDb2RlcigpIHsNCisgIGlmIChtX21hdHJpeCAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBtX21hdHJpeDsNCisgICAgbV9tYXRyaXggPSBOVUxMOw0KKyAgfQ0KKyAgbV9tb2RlID0gTlVMTDsNCisgIG1fZWNMZXZlbCA9IE5VTEw7DQorICBtX3ZlcnNpb24gPSAtMTsNCisgIG1fbWF0cml4V2lkdGggPSAtMTsNCisgIG1fbWFza1BhdHRlcm4gPSAtMTsNCisgIG1fbnVtVG90YWxCeXRlcyA9IC0xOw0KKyAgbV9udW1EYXRhQnl0ZXMgPSAtMTsNCisgIG1fbnVtRUNCeXRlcyA9IC0xOw0KKyAgbV9udW1SU0Jsb2NrcyA9IC0xOw0KK30NCitDQkNfUVJDb2Rlck1vZGUqIENCQ19RUkNvZGVyOjpHZXRNb2RlKCkgew0KKyAgcmV0dXJuIG1fbW9kZTsNCit9DQorQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogQ0JDX1FSQ29kZXI6OkdldEVDTGV2ZWwoKSB7DQorICByZXR1cm4gbV9lY0xldmVsOw0KK30NCitpbnQzMl90IENCQ19RUkNvZGVyOjpHZXRWZXJzaW9uKCkgew0KKyAgcmV0dXJuIG1fdmVyc2lvbjsNCit9DQoraW50MzJfdCBDQkNfUVJDb2Rlcjo6R2V0TWF0cml4V2lkdGgoKSB7DQorICByZXR1cm4gbV9tYXRyaXhXaWR0aDsNCit9DQoraW50MzJfdCBDQkNfUVJDb2Rlcjo6R2V0TWFza1BhdHRlcm4oKSB7DQorICByZXR1cm4gbV9tYXNrUGF0dGVybjsNCit9DQoraW50MzJfdCBDQkNfUVJDb2Rlcjo6R2V0TnVtVG90YWxCeXRlcygpIHsNCisgIHJldHVybiBtX251bVRvdGFsQnl0ZXM7DQorfQ0KK2ludDMyX3QgQ0JDX1FSQ29kZXI6OkdldE51bURhdGFCeXRlcygpIHsNCisgIHJldHVybiBtX251bURhdGFCeXRlczsNCit9DQoraW50MzJfdCBDQkNfUVJDb2Rlcjo6R2V0TnVtRUNCeXRlcygpIHsNCisgIHJldHVybiBtX251bUVDQnl0ZXM7DQorfQ0KK2ludDMyX3QgQ0JDX1FSQ29kZXI6OkdldE51bVJTQmxvY2tzKCkgew0KKyAgcmV0dXJuIG1fbnVtUlNCbG9ja3M7DQorfQ0KK0NCQ19Db21tb25CeXRlTWF0cml4KiBDQkNfUVJDb2Rlcjo6R2V0TWF0cml4KCkgew0KKyAgcmV0dXJuIG1fbWF0cml4Ow0KK30NCitpbnQzMl90IENCQ19RUkNvZGVyOjpBdChpbnQzMl90IHgsIGludDMyX3QgeSwgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCB2YWx1ZSA9IG1fbWF0cml4LT5HZXQoeCwgeSk7DQorICBpZiAoISh2YWx1ZSA9PSAwIHx8IHZhbHVlID09IDEpKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvblZhbHVlTXVzdEJlRWl0aGVyMG9yMTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KKyAgfQ0KKyAgcmV0dXJuIHZhbHVlOw0KK30NCitGWF9CT09MIENCQ19RUkNvZGVyOjpJc1ZhbGlkKCkgew0KKyAgcmV0dXJuIG1fbW9kZSAhPSBOVUxMICYmIG1fZWNMZXZlbCAhPSBOVUxMICYmIG1fdmVyc2lvbiAhPSAtMSAmJg0KKyAgICAgICAgIG1fbWF0cml4V2lkdGggIT0gLTEgJiYgbV9tYXNrUGF0dGVybiAhPSAtMSAmJiBtX251bVRvdGFsQnl0ZXMgIT0gLTEgJiYNCisgICAgICAgICBtX251bURhdGFCeXRlcyAhPSAtMSAmJiBtX251bUVDQnl0ZXMgIT0gLTEgJiYgbV9udW1SU0Jsb2NrcyAhPSAtMSAmJg0KKyAgICAgICAgIElzVmFsaWRNYXNrUGF0dGVybihtX21hc2tQYXR0ZXJuKSAmJg0KKyAgICAgICAgIG1fbnVtVG90YWxCeXRlcyA9PSBtX251bURhdGFCeXRlcyArIG1fbnVtRUNCeXRlcyAmJiBtX21hdHJpeCAhPSBOVUxMICYmDQorICAgICAgICAgbV9tYXRyaXhXaWR0aCA9PSBtX21hdHJpeC0+R2V0V2lkdGgoKSAmJg0KKyAgICAgICAgIG1fbWF0cml4LT5HZXRXaWR0aCgpID09IG1fbWF0cml4LT5HZXRIZWlnaHQoKTsNCit9DQordm9pZCBDQkNfUVJDb2Rlcjo6U2V0TW9kZShDQkNfUVJDb2Rlck1vZGUqIHZhbHVlKSB7DQorICBtX21vZGUgPSB2YWx1ZTsNCit9DQordm9pZCBDQkNfUVJDb2Rlcjo6U2V0RUNMZXZlbChDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsKSB7DQorICBtX2VjTGV2ZWwgPSBlY0xldmVsOw0KK30NCit2b2lkIENCQ19RUkNvZGVyOjpTZXRWZXJzaW9uKGludDMyX3QgdmVyc2lvbikgew0KKyAgbV92ZXJzaW9uID0gdmVyc2lvbjsNCit9DQordm9pZCBDQkNfUVJDb2Rlcjo6U2V0TWF0cml4V2lkdGgoaW50MzJfdCB3aWR0aCkgew0KKyAgbV9tYXRyaXhXaWR0aCA9IHdpZHRoOw0KK30NCit2b2lkIENCQ19RUkNvZGVyOjpTZXRNYXNrUGF0dGVybihpbnQzMl90IHBhdHRlcm4pIHsNCisgIG1fbWFza1BhdHRlcm4gPSBwYXR0ZXJuOw0KK30NCit2b2lkIENCQ19RUkNvZGVyOjpTZXROdW1EYXRhQnl0ZXMoaW50MzJfdCBieXRlcykgew0KKyAgbV9udW1EYXRhQnl0ZXMgPSBieXRlczsNCit9DQordm9pZCBDQkNfUVJDb2Rlcjo6U2V0TnVtVG90YWxCeXRlcyhpbnQzMl90IHZhbHVlKSB7DQorICBtX251bVRvdGFsQnl0ZXMgPSB2YWx1ZTsNCit9DQordm9pZCBDQkNfUVJDb2Rlcjo6U2V0TnVtUlNCbG9ja3MoaW50MzJfdCBibG9jaykgew0KKyAgbV9udW1SU0Jsb2NrcyA9IGJsb2NrOw0KK30NCit2b2lkIENCQ19RUkNvZGVyOjpTZXROdW1FQ0J5dGVzKGludDMyX3QgdmFsdWUpIHsNCisgIG1fbnVtRUNCeXRlcyA9IHZhbHVlOw0KK30NCitGWF9CT09MIENCQ19RUkNvZGVyOjpJc1ZhbGlkTWFza1BhdHRlcm4oaW50MzJfdCBtYXNrUGF0dGVybikgew0KKyAgcmV0dXJuIG1hc2tQYXR0ZXJuID49IDAgJiYgbWFza1BhdHRlcm4gPCBOVU1fTUFTS19QQVRURVJOUzsNCit9DQordm9pZCBDQkNfUVJDb2Rlcjo6U2V0TWF0cml4KENCQ19Db21tb25CeXRlTWF0cml4KiB2YWx1ZSkgew0KKyAgbV9tYXRyaXggPSB2YWx1ZTsNCit9DQorY29uc3QgaW50MzJfdCBDQkNfUVJDb2Rlcjo6TlVNX01BU0tfUEFUVEVSTlMgPSA4Ow0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OGM0ODAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlci5oCkBAIC0wLDAgKzEsNTUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUVJDT0RFUl9IXw0KKyNkZWZpbmUgX0JDX1FSQ09ERVJfSF8NCitjbGFzcyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOw0KK2NsYXNzIENCQ19RUkNvZGVyTW9kZTsNCitjbGFzcyBDQkNfQ29tbW9uQnl0ZU1hdHJpeDsNCisNCitjbGFzcyBDQkNfUVJDb2RlciB7DQorIHByaXZhdGU6DQorICBDQkNfUVJDb2Rlck1vZGUqIG1fbW9kZTsNCisgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIG1fZWNMZXZlbDsNCisgIGludDMyX3QgbV92ZXJzaW9uOw0KKyAgaW50MzJfdCBtX21hdHJpeFdpZHRoOw0KKyAgaW50MzJfdCBtX21hc2tQYXR0ZXJuOw0KKyAgaW50MzJfdCBtX251bVRvdGFsQnl0ZXM7DQorICBpbnQzMl90IG1fbnVtRGF0YUJ5dGVzOw0KKyAgaW50MzJfdCBtX251bUVDQnl0ZXM7DQorICBpbnQzMl90IG1fbnVtUlNCbG9ja3M7DQorICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbV9tYXRyaXg7DQorDQorIHB1YmxpYzoNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IE5VTV9NQVNLX1BBVFRFUk5TOw0KKyAgQ0JDX1FSQ29kZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19RUkNvZGVyKCk7DQorICBDQkNfUVJDb2Rlck1vZGUqIEdldE1vZGUoKTsNCisgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIEdldEVDTGV2ZWwoKTsNCisgIGludDMyX3QgR2V0VmVyc2lvbigpOw0KKyAgaW50MzJfdCBHZXRNYXRyaXhXaWR0aCgpOw0KKyAgaW50MzJfdCBHZXRNYXNrUGF0dGVybigpOw0KKyAgaW50MzJfdCBHZXROdW1Ub3RhbEJ5dGVzKCk7DQorICBpbnQzMl90IEdldE51bURhdGFCeXRlcygpOw0KKyAgaW50MzJfdCBHZXROdW1FQ0J5dGVzKCk7DQorICBpbnQzMl90IEdldE51bVJTQmxvY2tzKCk7DQorICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogR2V0TWF0cml4KCk7DQorICBpbnQzMl90IEF0KGludDMyX3QgeCwgaW50MzJfdCB5LCBpbnQzMl90JiBlKTsNCisgIEZYX0JPT0wgSXNWYWxpZCgpOw0KKw0KKyAgdm9pZCBTZXRNb2RlKENCQ19RUkNvZGVyTW9kZSogdmFsdWUpOw0KKyAgdm9pZCBTZXRFQ0xldmVsKENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwpOw0KKyAgdm9pZCBTZXRWZXJzaW9uKGludDMyX3QgdmVyc2lvbik7DQorICB2b2lkIFNldE1hdHJpeFdpZHRoKGludDMyX3Qgd2lkdGgpOw0KKyAgdm9pZCBTZXRNYXNrUGF0dGVybihpbnQzMl90IHBhdHRlcm4pOw0KKyAgdm9pZCBTZXROdW1EYXRhQnl0ZXMoaW50MzJfdCBieXRlcyk7DQorICB2b2lkIFNldE51bVRvdGFsQnl0ZXMoaW50MzJfdCB2YWx1ZSk7DQorICB2b2lkIFNldE51bUVDQnl0ZXMoaW50MzJfdCB2YWx1ZSk7DQorICB2b2lkIFNldE51bVJTQmxvY2tzKGludDMyX3QgYmxvY2spOw0KKyAgdm9pZCBTZXRNYXRyaXgoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIHZhbHVlKTsNCisgIHN0YXRpYyBGWF9CT09MIElzVmFsaWRNYXNrUGF0dGVybihpbnQzMl90IG1hc2tQYXR0ZXJuKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyQml0VmVjdG9yLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyQml0VmVjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjVkNTI3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCaXRWZWN0b3IuY3BwCkBAIC0wLDAgKzEsMTMxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDA3IFpYaW5nIGF1dGhvcnMNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAiQkNfUVJDb2RlckJpdFZlY3Rvci5oIg0KK0NCQ19RUkNvZGVyQml0VmVjdG9yOjpDQkNfUVJDb2RlckJpdFZlY3RvcigpIHsNCisgIG1fc2l6ZUluQml0cyA9IDA7DQorICBtX3NpemUgPSAzMjsNCit9DQordm9pZCBDQkNfUVJDb2RlckJpdFZlY3Rvcjo6SW5pdCgpIHsNCisgIG1fYXJyYXkgPSBGWF9BbGxvYyh1aW50OF90LCBtX3NpemUpOw0KK30NCitDQkNfUVJDb2RlckJpdFZlY3Rvcjo6fkNCQ19RUkNvZGVyQml0VmVjdG9yKCkgew0KKyAgaWYgKG1fYXJyYXkgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKG1fYXJyYXkpOw0KKyAgfQ0KKyAgbV9zaXplID0gMDsNCisgIG1fc2l6ZUluQml0cyA9IDA7DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJCaXRWZWN0b3I6OkNsZWFyKCkgew0KKyAgaWYgKG1fYXJyYXkgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKG1fYXJyYXkpOw0KKyAgICBtX2FycmF5ID0gTlVMTDsNCisgIH0NCisgIG1fc2l6ZUluQml0cyA9IDA7DQorICBtX3NpemUgPSAzMjsNCisgIG1fYXJyYXkgPSBGWF9BbGxvYyh1aW50OF90LCBtX3NpemUpOw0KK30NCitpbnQzMl90IENCQ19RUkNvZGVyQml0VmVjdG9yOjpBdChpbnQzMl90IGluZGV4LCBpbnQzMl90JiBlKSB7DQorICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG1fc2l6ZUluQml0cykgew0KKyAgICBlID0gQkNFeGNlcHRpb25CYWRJbmRleEV4Y2VwdGlvbjsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KKyAgfQ0KKyAgaW50MzJfdCB2YWx1ZSA9IG1fYXJyYXlbaW5kZXggPj4gM10gJiAweGZmOw0KKyAgcmV0dXJuICh2YWx1ZSA+PiAoNyAtIChpbmRleCAmIDB4NykpKSAmIDE7DQorfQ0KK2ludDMyX3QgQ0JDX1FSQ29kZXJCaXRWZWN0b3I6OnNpemVJbkJ5dGVzKCkgew0KKyAgcmV0dXJuIChtX3NpemVJbkJpdHMgKyA3KSA+PiAzOw0KK30NCitpbnQzMl90IENCQ19RUkNvZGVyQml0VmVjdG9yOjpTaXplKCkgew0KKyAgcmV0dXJuIG1fc2l6ZUluQml0czsNCit9DQordm9pZCBDQkNfUVJDb2RlckJpdFZlY3Rvcjo6QXBwZW5kQml0KGludDMyX3QgYml0LCBpbnQzMl90JiBlKSB7DQorICBpZiAoIShiaXQgPT0gMCB8fCBiaXQgPT0gMSkpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uQmFkVmFsdWVFeGNlcHRpb247DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KKyAgaW50MzJfdCBudW1CaXRzSW5MYXN0Qnl0ZSA9IG1fc2l6ZUluQml0cyAmIDB4NzsNCisgIGlmIChudW1CaXRzSW5MYXN0Qnl0ZSA9PSAwKSB7DQorICAgIEFwcGVuZEJ5dGUoMCk7DQorICAgIG1fc2l6ZUluQml0cyAtPSA4Ow0KKyAgfQ0KKyAgbV9hcnJheVttX3NpemVJbkJpdHMgPj4gM10gfD0gKGJpdCA8PCAoNyAtIG51bUJpdHNJbkxhc3RCeXRlKSk7DQorICArK21fc2l6ZUluQml0czsNCit9DQordm9pZCBDQkNfUVJDb2RlckJpdFZlY3Rvcjo6QXBwZW5kQml0cyhpbnQzMl90IHZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1CaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKG51bUJpdHMgPCAwIHx8IG51bUJpdHMgPiAzMikgew0KKyAgICBlID0gQkNFeGNlcHRpb25CYWROdW1CaXRzRXhjZXB0aW9uOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCisgIGludDMyX3QgbnVtQml0c0xlZnQgPSBudW1CaXRzOw0KKyAgd2hpbGUgKG51bUJpdHNMZWZ0ID4gMCkgew0KKyAgICBpZiAoKG1fc2l6ZUluQml0cyAmIDB4NykgPT0gMCAmJiBudW1CaXRzTGVmdCA+PSA4KSB7DQorICAgICAgaW50MzJfdCBuZXdCeXRlID0gKHZhbHVlID4+IChudW1CaXRzTGVmdCAtIDgpKSAmIDB4ZmY7DQorICAgICAgQXBwZW5kQnl0ZShuZXdCeXRlKTsNCisgICAgICBudW1CaXRzTGVmdCAtPSA4Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGludDMyX3QgYml0ID0gKHZhbHVlID4+IChudW1CaXRzTGVmdCAtIDEpKSAmIDE7DQorICAgICAgQXBwZW5kQml0KGJpdCwgZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgLS1udW1CaXRzTGVmdDsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENCQ19RUkNvZGVyQml0VmVjdG9yOjpBcHBlbmRCaXRWZWN0b3IoQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3Qgc2l6ZSA9IGJpdHMtPlNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgew0KKyAgICBpbnQzMl90IG51bSA9IGJpdHMtPkF0KGksIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgQXBwZW5kQml0KG51bSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpDQorICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJCaXRWZWN0b3I6OlhPUihDQkNfUVJDb2RlckJpdFZlY3Rvciogb3RoZXIsIGludDMyX3QmIGUpIHsNCisgIGlmIChtX3NpemVJbkJpdHMgIT0gb3RoZXItPlNpemUoKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25jYW5Ob3RPcGVyYXRleG9yT3BlcmF0b3I7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KKyAgaW50MzJfdCBzaXplSW5CeXRlcyA9IChtX3NpemVJbkJpdHMgKyA3KSA+PiAzOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZUluQnl0ZXM7ICsraSkgew0KKyAgICBtX2FycmF5W2ldIF49IChvdGhlci0+R2V0QXJyYXkoKSlbaV07DQorICB9DQorfQ0KK3VpbnQ4X3QqIENCQ19RUkNvZGVyQml0VmVjdG9yOjpHZXRBcnJheSgpIHsNCisgIHJldHVybiBtX2FycmF5Ow0KK30NCit2b2lkIENCQ19RUkNvZGVyQml0VmVjdG9yOjpBcHBlbmRCeXRlKGludDMyX3QgdmFsdWUpIHsNCisgIGlmICgobV9zaXplSW5CaXRzID4+IDMpID09IG1fc2l6ZSkgew0KKyAgICB1aW50OF90KiBuZXdBcnJheSA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fc2l6ZSA8PCAxKTsNCisgICAgRlhTWVNfbWVtY3B5KG5ld0FycmF5LCBtX2FycmF5LCBtX3NpemUpOw0KKyAgICBpZiAobV9hcnJheSAhPSBOVUxMKSB7DQorICAgICAgRlhfRnJlZShtX2FycmF5KTsNCisgICAgfQ0KKyAgICBtX2FycmF5ID0gbmV3QXJyYXk7DQorICAgIG1fc2l6ZSA9IG1fc2l6ZSA8PCAxOw0KKyAgfQ0KKyAgbV9hcnJheVttX3NpemVJbkJpdHMgPj4gM10gPSAodWludDhfdCl2YWx1ZTsNCisgIG1fc2l6ZUluQml0cyArPSA4Ow0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckJpdFZlY3Rvci5oIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCaXRWZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTk5YzZiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCaXRWZWN0b3IuaApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1FSRUNPREVSQklUVkVDVE9SX0hfDQorI2RlZmluZSBfQkNfUVJFQ09ERVJCSVRWRUNUT1JfSF8NCitjbGFzcyBDQkNfUVJDb2RlckJpdFZlY3RvciB7DQorIHByaXZhdGU6DQorICBpbnQzMl90IG1fc2l6ZUluQml0czsNCisgIHVpbnQ4X3QqIG1fYXJyYXk7DQorICBpbnQzMl90IG1fc2l6ZTsNCisNCisgIHZvaWQgQXBwZW5kQnl0ZShpbnQzMl90IHZhbHVlKTsNCisNCisgcHVibGljOg0KKyAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IoKTsNCisgIHZpcnR1YWwgfkNCQ19RUkNvZGVyQml0VmVjdG9yKCk7DQorICBpbnQzMl90IEF0KGludDMyX3QgaW5kZXgsIGludDMyX3QmIGUpOw0KKyAgaW50MzJfdCBTaXplKCk7DQorICBpbnQzMl90IHNpemVJbkJ5dGVzKCk7DQorICB2b2lkIEFwcGVuZEJpdChpbnQzMl90IGJpdCwgaW50MzJfdCYgZSk7DQorICB2b2lkIEFwcGVuZEJpdHMoaW50MzJfdCB2YWx1ZSwgaW50MzJfdCBudW1CaXRzLCBpbnQzMl90JiBlKTsNCisgIHZvaWQgQXBwZW5kQml0VmVjdG9yKENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLCBpbnQzMl90JiBlKTsNCisgIHZvaWQgWE9SKENCQ19RUkNvZGVyQml0VmVjdG9yKiBvdGhlciwgaW50MzJfdCYgZSk7DQorICB1aW50OF90KiBHZXRBcnJheSgpOw0KKyAgdm9pZCBDbGVhcigpOw0KKyAgdmlydHVhbCB2b2lkIEluaXQoKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyQmxvY2tQYWlyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyQmxvY2tQYWlyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTkwYTE1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCbG9ja1BhaXIuY3BwCkBAIC0wLDAgKzEsNDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDggWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZUFycmF5LmgiDQorI2luY2x1ZGUgIkJDX1FSQ29kZXJCbG9ja1BhaXIuaCINCitDQkNfUVJDb2RlckJsb2NrUGFpcjo6Q0JDX1FSQ29kZXJCbG9ja1BhaXIoDQorICAgIENCQ19Db21tb25CeXRlQXJyYXkqIGRhdGEsDQorICAgIENCQ19Db21tb25CeXRlQXJyYXkqIGVycm9yQ29ycmVjdGlvbikgew0KKyAgbV9kYXRhQnl0ZXMgPSBkYXRhOw0KKyAgbV9lcnJvckNvcnJlY3Rpb25CeXRlcyA9IGVycm9yQ29ycmVjdGlvbjsNCit9DQorQ0JDX1FSQ29kZXJCbG9ja1BhaXI6On5DQkNfUVJDb2RlckJsb2NrUGFpcigpIHsNCisgIGlmIChtX2RhdGFCeXRlcyAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBtX2RhdGFCeXRlczsNCisgICAgbV9kYXRhQnl0ZXMgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fZXJyb3JDb3JyZWN0aW9uQnl0ZXMgIT0gTlVMTCkgew0KKyAgICBkZWxldGUgbV9lcnJvckNvcnJlY3Rpb25CeXRlczsNCisgICAgbV9lcnJvckNvcnJlY3Rpb25CeXRlcyA9IE5VTEw7DQorICB9DQorfQ0KK0NCQ19Db21tb25CeXRlQXJyYXkqIENCQ19RUkNvZGVyQmxvY2tQYWlyOjpHZXREYXRhQnl0ZXMoKSB7DQorICByZXR1cm4gbV9kYXRhQnl0ZXM7DQorfQ0KK0NCQ19Db21tb25CeXRlQXJyYXkqIENCQ19RUkNvZGVyQmxvY2tQYWlyOjpHZXRFcnJvckNvcnJlY3Rpb25CeXRlcygpIHsNCisgIHJldHVybiBtX2Vycm9yQ29ycmVjdGlvbkJ5dGVzOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckJsb2NrUGFpci5oIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCbG9ja1BhaXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTEwZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCbG9ja1BhaXIuaApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1FSQ09ERVJCTE9DS1BBSVJfSF8NCisjZGVmaW5lIF9CQ19RUkNPREVSQkxPQ0tQQUlSX0hfDQorY2xhc3MgQ0JDX0NvbW1vbkJ5dGVBcnJheTsNCitjbGFzcyBDQkNfUVJDb2RlckJsb2NrUGFpciB7DQorIHByaXZhdGU6DQorICBDQkNfQ29tbW9uQnl0ZUFycmF5KiBtX2RhdGFCeXRlczsNCisgIENCQ19Db21tb25CeXRlQXJyYXkqIG1fZXJyb3JDb3JyZWN0aW9uQnl0ZXM7DQorDQorIHB1YmxpYzoNCisgIENCQ19RUkNvZGVyQmxvY2tQYWlyKENCQ19Db21tb25CeXRlQXJyYXkqIGRhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQnl0ZUFycmF5KiBlcnJvckNvcnJlY3Rpb24pOw0KKyAgdmlydHVhbCB+Q0JDX1FSQ29kZXJCbG9ja1BhaXIoKTsNCisNCisgIENCQ19Db21tb25CeXRlQXJyYXkqIEdldERhdGFCeXRlcygpOw0KKyAgQ0JDX0NvbW1vbkJ5dGVBcnJheSogR2V0RXJyb3JDb3JyZWN0aW9uQnl0ZXMoKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRGVjb2Rlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckRlY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MTVjOTkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckRlY29kZXIuY3BwCkBAIC0wLDAgKzEsMTMwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDA4IFpYaW5nIGF1dGhvcnMNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uRGVjb2RlclJlc3VsdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25EZWNvZGVyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2LmgiDQorI2luY2x1ZGUgIkJDX1FSQml0TWF0cml4UGFyc2VyLmgiDQorI2luY2x1ZGUgIkJDX1FSRGF0YUJsb2NrLmgiDQorI2luY2x1ZGUgIkJDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlci5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVyVmVyc2lvbi5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24uaCINCisjaW5jbHVkZSAiQkNfUVJDb2RlckRlY29kZXIuaCINCitDQkNfUVJDb2RlckRlY29kZXI6OkNCQ19RUkNvZGVyRGVjb2RlcigpIHsNCisgIG1fcnNEZWNvZGVyID0gTlVMTDsNCit9DQorDQordm9pZCBDQkNfUVJDb2RlckRlY29kZXI6OkluaXQoKSB7DQorICBtX3JzRGVjb2RlciA9IG5ldyBDQkNfUmVlZFNvbG9tb25EZWNvZGVyKENCQ19SZWVkU29sb21vbkdGMjU2OjpRUkNvZGVGaWxkKTsNCit9DQorQ0JDX1FSQ29kZXJEZWNvZGVyOjp+Q0JDX1FSQ29kZXJEZWNvZGVyKCkgew0KKyAgaWYgKG1fcnNEZWNvZGVyICE9IE5VTEwpIHsNCisgICAgZGVsZXRlIG1fcnNEZWNvZGVyOw0KKyAgfQ0KKyAgbV9yc0RlY29kZXIgPSBOVUxMOw0KK30NCitDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogQ0JDX1FSQ29kZXJEZWNvZGVyOjpEZWNvZGUoRlhfQk9PTCogaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDQkNfQ29tbW9uQml0TWF0cml4IGJpdHM7DQorICBiaXRzLkluaXQod2lkdGgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgew0KKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBoZWlnaHQ7IGorKykgew0KKyAgICAgIGlmIChpbWFnZVtpICogd2lkdGggKyBqXSkgew0KKyAgICAgICAgYml0cy5TZXQoaiwgaSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogY2RyID0gRGVjb2RlKCZiaXRzLCBoZWlnaHQsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIGNkcjsNCit9DQorQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQqIENCQ19RUkNvZGVyRGVjb2Rlcjo6RGVjb2RlKENCQ19Db21tb25CaXRNYXRyaXgqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYnl0ZU1vZGVEZWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENCQ19RUkJpdE1hdHJpeFBhcnNlciBwYXJzZXI7DQorICBwYXJzZXIuSW5pdChiaXRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19RUkNvZGVyVmVyc2lvbiogdmVyc2lvbiA9IHBhcnNlci5SZWFkVmVyc2lvbihlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24qIHRlbXAgPSBwYXJzZXIuUmVhZEZvcm1hdEluZm9ybWF0aW9uKGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCA9IHRlbXAtPkdldEVycm9yQ29ycmVjdGlvbkxldmVsKCk7DQorICBDRlhfQnl0ZUFycmF5KiBiYSA9IHBhcnNlci5SZWFkQ29kZXdvcmRzKGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgQ0JDX0F1dG9QdHI8Q0ZYX0J5dGVBcnJheT4gY29kZXdvcmRzKGJhKTsNCisgIENGWF9QdHJBcnJheSogZGF0YUJsb2NrcyA9DQorICAgICAgQ0JDX1FSRGF0YUJsb2NrOjpHZXREYXRhQmxvY2tzKGNvZGV3b3Jkcy5nZXQoKSwgdmVyc2lvbiwgZWNMZXZlbCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBpbnQzMl90IHRvdGFsQnl0ZXMgPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZGF0YUJsb2Nrcy0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgdG90YWxCeXRlcyArPSAoKENCQ19RUkRhdGFCbG9jayopKCgqZGF0YUJsb2NrcylbaV0pKS0+R2V0TnVtRGF0YUNvZGV3b3JkcygpOw0KKyAgfQ0KKyAgQ0ZYX0J5dGVBcnJheSByZXN1bHRCeXRlczsNCisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGRhdGFCbG9ja3MtPkdldFNpemUoKTsgaisrKSB7DQorICAgIENCQ19RUkRhdGFCbG9jayogZGF0YUJsb2NrID0gKENCQ19RUkRhdGFCbG9jayopKCgqZGF0YUJsb2Nrcylbal0pOw0KKyAgICBDRlhfQnl0ZUFycmF5KiBjb2Rld29yZEJ5dGVzID0gZGF0YUJsb2NrLT5HZXRDb2Rld29yZHMoKTsNCisgICAgaW50MzJfdCBudW1EYXRhQ29kZXdvcmRzID0gZGF0YUJsb2NrLT5HZXROdW1EYXRhQ29kZXdvcmRzKCk7DQorICAgIENvcnJlY3RFcnJvcnMoY29kZXdvcmRCeXRlcywgbnVtRGF0YUNvZGV3b3JkcywgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBkYXRhQmxvY2tzLT5HZXRTaXplKCk7IGsrKykgew0KKyAgICAgICAgZGVsZXRlIChDQkNfUVJEYXRhQmxvY2sqKSgqZGF0YUJsb2Nrcylba107DQorICAgICAgfQ0KKyAgICAgIGRhdGFCbG9ja3MtPlJlbW92ZUFsbCgpOw0KKyAgICAgIGRlbGV0ZSBkYXRhQmxvY2tzOw0KKyAgICAgIGRhdGFCbG9ja3MgPSBOVUxMOw0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bURhdGFDb2Rld29yZHM7IGkrKykgew0KKyAgICAgIHJlc3VsdEJ5dGVzLkFkZCgoKmNvZGV3b3JkQnl0ZXMpW2ldKTsNCisgICAgfQ0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgZGF0YUJsb2Nrcy0+R2V0U2l6ZSgpOyBrKyspIHsNCisgICAgZGVsZXRlIChDQkNfUVJEYXRhQmxvY2sqKSgqZGF0YUJsb2Nrcylba107DQorICB9DQorICBkYXRhQmxvY2tzLT5SZW1vdmVBbGwoKTsNCisgIGRlbGV0ZSBkYXRhQmxvY2tzOw0KKyAgZGF0YUJsb2NrcyA9IE5VTEw7DQorICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogY2RyID0gQ0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6RGVjb2RlKA0KKyAgICAgICZyZXN1bHRCeXRlcywgdmVyc2lvbiwgZWNMZXZlbCwgYnl0ZU1vZGVEZWNvZGUsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIGNkcjsNCit9DQordm9pZCBDQkNfUVJDb2RlckRlY29kZXI6OkNvcnJlY3RFcnJvcnMoQ0ZYX0J5dGVBcnJheSogY29kZXdvcmRCeXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bURhdGFDb2Rld29yZHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBudW1Db2Rld29yZHMgPSBjb2Rld29yZEJ5dGVzLT5HZXRTaXplKCk7DQorICBDRlhfSW50MzJBcnJheSBjb2Rld29yZHNJbnRzOw0KKyAgY29kZXdvcmRzSW50cy5TZXRTaXplKG51bUNvZGV3b3Jkcyk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1Db2Rld29yZHM7IGkrKykgew0KKyAgICBjb2Rld29yZHNJbnRzW2ldID0gKGludDMyX3QpKCgqY29kZXdvcmRCeXRlcylbaV0gJiAweGZmKTsNCisgIH0NCisgIGludDMyX3QgbnVtRUNDb2Rld29yZHMgPSBjb2Rld29yZEJ5dGVzLT5HZXRTaXplKCkgLSBudW1EYXRhQ29kZXdvcmRzOw0KKyAgbV9yc0RlY29kZXItPkRlY29kZSgmY29kZXdvcmRzSW50cywgbnVtRUNDb2Rld29yZHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBudW1EYXRhQ29kZXdvcmRzOyBrKyspIHsNCisgICAgKCpjb2Rld29yZEJ5dGVzKVtrXSA9ICh1aW50OF90KWNvZGV3b3Jkc0ludHNba107DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRGVjb2Rlci5oIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJEZWNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjZTI0NQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRGVjb2Rlci5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUVJDT0RFUkRFQ09ERVJfSF8NCisjZGVmaW5lIF9CQ19RUkNPREVSREVDT0RFUl9IXw0KK2NsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQorY2xhc3MgQ0JDX1JlZWRTb2xvbW9uRGVjb2RlcjsNCitjbGFzcyBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdDsNCitjbGFzcyBDQkNfUVJCaXRNYXRyaXhQYXJzZXI7DQorY2xhc3MgQ0JDX1FSQ29kZXJWZXJzaW9uOw0KK2NsYXNzIENCQ19RUkRhdGFCbG9jazsNCitjbGFzcyBDQkNfUVJDb2RlckRlY29kZXIgew0KKyBwcml2YXRlOg0KKyAgQ0JDX1JlZWRTb2xvbW9uRGVjb2RlciogbV9yc0RlY29kZXI7DQorDQorIHB1YmxpYzoNCisgIENCQ19RUkNvZGVyRGVjb2RlcigpOw0KKyAgdmlydHVhbCB+Q0JDX1FSQ29kZXJEZWNvZGVyKCk7DQorDQorICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogRGVjb2RlKEZYX0JPT0wqIGltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogRGVjb2RlKENCQ19Db21tb25CaXRNYXRyaXgqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYnl0ZU1vZGVEZWNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdm9pZCBDb3JyZWN0RXJyb3JzKENGWF9CeXRlQXJyYXkqIGNvZGV3b3JkQnl0ZXMsDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1EYXRhQ29kZXdvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgdmlydHVhbCB2b2lkIEluaXQoKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRUNCLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRUNCLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmIxYzY0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0IuY3BwCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVyRUNCLmgiDQorQ0JDX1FSQ29kZXJFQ0I6OkNCQ19RUkNvZGVyRUNCKGludDMyX3QgY291bnQsIGludDMyX3QgZGF0YUNvZGVXb3Jkcykgew0KKyAgbV9kYXRhQ29kZVdvcmRzID0gZGF0YUNvZGVXb3JkczsNCisgIG1fY291bnQgPSBjb3VudDsNCit9DQorQ0JDX1FSQ29kZXJFQ0I6On5DQkNfUVJDb2RlckVDQigpIHt9DQoraW50MzJfdCBDQkNfUVJDb2RlckVDQjo6R2V0Q291bnQoKSB7DQorICByZXR1cm4gbV9jb3VudDsNCit9DQoraW50MzJfdCBDQkNfUVJDb2RlckVDQjo6R2V0RGF0YUNvZGVXb3JkcygpIHsNCisgIHJldHVybiBtX2RhdGFDb2RlV29yZHM7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRUNCLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNDdmNzgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQi5oCkBAIC0wLDAgKzEsMjAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUVJDT0RFUkVDQl9IXw0KKyNkZWZpbmUgX0JDX1FSQ09ERVJFQ0JfSF8NCitjbGFzcyBDQkNfUVJDb2RlckVDQiB7DQorIHByaXZhdGU6DQorICBpbnQzMl90IG1fY291bnQ7DQorICBpbnQzMl90IG1fZGF0YUNvZGVXb3JkczsNCisNCisgcHVibGljOg0KKyAgQ0JDX1FSQ29kZXJFQ0IoaW50MzJfdCBjb3VudCwgaW50MzJfdCBkYXRhQ29kZVdvcmRzKTsNCisgIHZpcnR1YWwgfkNCQ19RUkNvZGVyRUNCKCk7DQorICBpbnQzMl90IEdldENvdW50KCk7DQorICBpbnQzMl90IEdldERhdGFDb2RlV29yZHMoKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRUNCbG9ja3MuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0Jsb2Nrcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVjMzIyMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRUNCbG9ja3MuY3BwCkBAIC0wLDAgKzEsNTkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVyRUNCLmgiDQorI2luY2x1ZGUgIkJDX1FSQ29kZXJFQ0Jsb2Nrcy5oIg0KK0NCQ19RUkNvZGVyRUNCbG9ja3M6OkNCQ19RUkNvZGVyRUNCbG9ja3MoaW50MzJfdCBlY0NvZGVXb3Jkc1BlckJsb2NrLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFQ0IqIGVjQmxvY2tzKSB7DQorICBtX2VjQ29kZVdvcmRzUGVyQmxvY2sgPSBlY0NvZGVXb3Jkc1BlckJsb2NrOw0KKyAgbV9lY0Jsb2Nrcy5BZGQoZWNCbG9ja3MpOw0KK30NCitDQkNfUVJDb2RlckVDQmxvY2tzOjpDQkNfUVJDb2RlckVDQmxvY2tzKGludDMyX3QgZWNDb2RlV29yZHNQZXJCbG9jaywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRUNCKiBlY0Jsb2NrczEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVDQiogZWNCbG9ja3MyKSB7DQorICBtX2VjQ29kZVdvcmRzUGVyQmxvY2sgPSBlY0NvZGVXb3Jkc1BlckJsb2NrOw0KKyAgbV9lY0Jsb2Nrcy5BZGQoZWNCbG9ja3MxKTsNCisgIG1fZWNCbG9ja3MuQWRkKGVjQmxvY2tzMik7DQorfQ0KK0NCQ19RUkNvZGVyRUNCbG9ja3M6On5DQkNfUVJDb2RlckVDQmxvY2tzKCkgew0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbV9lY0Jsb2Nrcy5HZXRTaXplKCk7IGkrKykgew0KKyAgICBkZWxldGUgKChDQkNfUVJDb2RlckVDQiopKG1fZWNCbG9ja3NbaV0pKTsNCisgIH0NCisgIG1fZWNCbG9ja3MuUmVtb3ZlQWxsKCk7DQorfQ0KK2ludDMyX3QgQ0JDX1FSQ29kZXJFQ0Jsb2Nrczo6R2V0RUNDb2RlV29yZHNQZXJCbG9jaygpIHsNCisgIHJldHVybiBtX2VjQ29kZVdvcmRzUGVyQmxvY2s7DQorfQ0KK2ludDMyX3QgQ0JDX1FSQ29kZXJFQ0Jsb2Nrczo6R2V0TnVtQmxvY2tzKCkgew0KKyAgaW50MzJfdCB0b3RhbCA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX2VjQmxvY2tzLkdldFNpemUoKTsgaSsrKSB7DQorICAgIHRvdGFsICs9ICgoQ0JDX1FSQ29kZXJFQ0IqKShtX2VjQmxvY2tzW2ldKSktPkdldENvdW50KCk7DQorICB9DQorICByZXR1cm4gdG90YWw7DQorfQ0KK2ludDMyX3QgQ0JDX1FSQ29kZXJFQ0Jsb2Nrczo6R2V0VG90YWxFQ0NvZGVXb3JkcygpIHsNCisgIHJldHVybiBtX2VjQ29kZVdvcmRzUGVyQmxvY2sgKiBHZXROdW1CbG9ja3MoKTsNCit9DQorQ0ZYX1B0ckFycmF5KiBDQkNfUVJDb2RlckVDQmxvY2tzOjpHZXRFQ0Jsb2NrcygpIHsNCisgIHJldHVybiAmbV9lY0Jsb2NrczsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0Jsb2Nrcy5oIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0Jsb2Nrcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMjZmYjcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQmxvY2tzLmgKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19RUkNPREVSRUNCTE9DS1NfSF8NCisjZGVmaW5lIF9CQ19RUkNPREVSRUNCTE9DS1NfSF8NCitjbGFzcyBDQkNfUVJDb2RlckVDQjsNCitjbGFzcyBDQkNfUVJDb2RlckVDQmxvY2tzIHsNCisgcHJpdmF0ZToNCisgIGludDMyX3QgbV9lY0NvZGVXb3Jkc1BlckJsb2NrOw0KKyAgQ0ZYX1B0ckFycmF5IG1fZWNCbG9ja3M7DQorDQorIHB1YmxpYzoNCisgIENCQ19RUkNvZGVyRUNCbG9ja3MoaW50MzJfdCBlY0NvZGVXb3Jkc1BlckJsb2NrLCBDQkNfUVJDb2RlckVDQiogZWNCbG9ja3MpOw0KKyAgQ0JDX1FSQ29kZXJFQ0Jsb2NrcyhpbnQzMl90IGVjQ29kZVdvcmRzUGVyQmxvY2ssDQorICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRUNCKiBlY0Jsb2NrczEsDQorICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRUNCKiBlY0Jsb2NrczIpOw0KKyAgdmlydHVhbCB+Q0JDX1FSQ29kZXJFQ0Jsb2NrcygpOw0KKyAgaW50MzJfdCBHZXRFQ0NvZGVXb3Jkc1BlckJsb2NrKCk7DQorICBpbnQzMl90IEdldE51bUJsb2NrcygpOw0KKyAgaW50MzJfdCBHZXRUb3RhbEVDQ29kZVdvcmRzKCk7DQorICBDRlhfUHRyQXJyYXkqIEdldEVDQmxvY2tzKCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVuY29kZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTE2YzAzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFbmNvZGVyLmNwcApAQCAtMCwwICsxLDk2MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwOCBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlIDxhbGdvcml0aG0+DQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfVXRpbENvZGluZ0NvbnZlcnQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVBcnJheS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZU1hdHJpeC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb24uaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTYuaCINCisjaW5jbHVkZSAiQkNfUVJDb2Rlci5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVyRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVyTW9kZS5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVyRW5jb2Rlci5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVyRUNCbG9ja3MuaCINCisjaW5jbHVkZSAiQkNfUVJDb2RlclZlcnNpb24uaCINCisjaW5jbHVkZSAiQkNfUVJDb2RlckJsb2NrUGFpci5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVyTWFza1V0aWwuaCINCisjaW5jbHVkZSAiQkNfUVJDb2Rlck1hdHJpeFV0aWwuaCINCisjaW5jbHVkZSAiQkNfUVJDb2RlckJpdFZlY3Rvci5oIg0KK2NvbnN0IGludDMyX3QgQ0JDX1FSQ29kZXJFbmNvZGVyOjptX2FscGhhTnVtYmVyaWNUYWJsZVtdID0gew0KKyAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwNCisgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsDQorICAgIDM2LCAtMSwgLTEsIC0xLCAzNywgMzgsIC0xLCAtMSwgLTEsIC0xLCAzOSwgNDAsIC0xLCA0MSwgNDIsIDQzLA0KKyAgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAgNDQsIC0xLCAtMSwgLTEsIC0xLCAtMSwNCisgICAgLTEsIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsDQorICAgIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsNCitDQkNfUVJDb2RlckVuY29kZXI6OkNCQ19RUkNvZGVyRW5jb2RlcigpIHt9DQorQ0JDX1FSQ29kZXJFbmNvZGVyOjp+Q0JDX1FSQ29kZXJFbmNvZGVyKCkge30NCitjbGFzcyBNYWtlX1BhaXIgew0KKyBwdWJsaWM6DQorICBDQkNfUVJDb2Rlck1vZGUqIG1fbW9kZTsNCisgIENGWF9CeXRlU3RyaW5nIG1fc3RyaW5nOw0KKw0KKyBwcml2YXRlOg0KKyAgTWFrZV9QYWlyKGNvbnN0IE1ha2VfUGFpciYgbW9kZV9zdHJpbmcpIHt9DQorICBNYWtlX1BhaXImIG9wZXJhdG9yPShNYWtlX1BhaXImIG1vZGVfc3RyaW5nKSB7DQorICAgIGlmICh0aGlzID09ICZtb2RlX3N0cmluZykgew0KKyAgICAgIHJldHVybiAqdGhpczsNCisgICAgfQ0KKyAgICBtX21vZGUgPSBtb2RlX3N0cmluZy5tX21vZGU7DQorICAgIG1fc3RyaW5nID0gbW9kZV9zdHJpbmcubV9zdHJpbmc7DQorICAgIHJldHVybiAqdGhpczsNCisgIH0NCisNCisgcHVibGljOg0KKyAgTWFrZV9QYWlyKENCQ19RUkNvZGVyTW9kZSogbW9kZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cikNCisgICAgICA6IG1fbW9kZShtb2RlKSwgbV9zdHJpbmcoc3RyKSB7fQ0KKyAgfk1ha2VfUGFpcigpIHt9DQorfTsNCit2b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyKiBxckNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2ZXJzaW9uU3BlY2lmeSkgew0KKyAgaWYgKHZlcnNpb25TcGVjaWZ5ID09IDApIHsNCisgICAgRW5jb2RlV2l0aEF1dG9WZXJzaW9uKGNvbnRlbnQsIGVjTGV2ZWwsIHFyQ29kZSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpDQorICB9IGVsc2UgaWYgKHZlcnNpb25TcGVjaWZ5ID4gMCAmJiB2ZXJzaW9uU3BlY2lmeSA8PSA0MCkgew0KKyAgICBFbmNvZGVXaXRoU3BlY2lmeVZlcnNpb24oY29udGVudCwgZWNMZXZlbCwgcXJDb2RlLCB2ZXJzaW9uU3BlY2lmeSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfSBlbHNlIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uVmVyc2lvbk11c3QxXzQwOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCit9DQordm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkFwcGVuZEVDSShDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cykge30NCit2b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6QXBwZW5kRGF0YU1vZGVMZW5naEluZm8oDQorICAgIENGWF9QdHJBcnJheSYgc3BsaXRSZXN1bHQsDQorICAgIENCQ19RUkNvZGVyQml0VmVjdG9yJiBoZWFkZXJBbmREYXRhQml0cywNCisgICAgQ0JDX1FSQ29kZXJNb2RlKiB0ZW1wTW9kZSwNCisgICAgQ0JDX1FSQ29kZXIqIHFyQ29kZSwNCisgICAgQ0ZYX0J5dGVTdHJpbmcmIGVuY29kaW5nLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzcGxpdFJlc3VsdC5HZXRTaXplKCk7IGkrKykgew0KKyAgICB0ZW1wTW9kZSA9ICgoTWFrZV9QYWlyKilzcGxpdFJlc3VsdFtpXSktPm1fbW9kZTsNCisgICAgaWYgKHRlbXBNb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0dCSykgew0KKyAgICAgIEFwcGVuZE1vZGVJbmZvKHRlbXBNb2RlLCAmaGVhZGVyQW5kRGF0YUJpdHMsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgIEFwcGVuZExlbmd0aEluZm8oKChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2ldKS0+bV9zdHJpbmcuR2V0TGVuZ3RoKCksDQorICAgICAgICAgICAgICAgICAgICAgICBxckNvZGUtPkdldFZlcnNpb24oKSwgdGVtcE1vZGUsICZoZWFkZXJBbmREYXRhQml0cywgZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgQXBwZW5kQnl0ZXMoKChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2ldKS0+bV9zdHJpbmcsIHRlbXBNb2RlLA0KKyAgICAgICAgICAgICAgICAgICZoZWFkZXJBbmREYXRhQml0cywgZW5jb2RpbmcsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9IGVsc2UgaWYgKHRlbXBNb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0JZVEUpIHsNCisgICAgICBDRlhfQnl0ZUFycmF5IGJ5dGVzOw0KKyAgICAgIENCQ19VdGlsQ29kaW5nQ29udmVydDo6TG9jYWxlVG9VdGY4KA0KKyAgICAgICAgICAoKE1ha2VfUGFpciopc3BsaXRSZXN1bHRbaV0pLT5tX3N0cmluZywgYnl0ZXMpOw0KKyAgICAgIEFwcGVuZE1vZGVJbmZvKHRlbXBNb2RlLCAmaGVhZGVyQW5kRGF0YUJpdHMsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgIEFwcGVuZExlbmd0aEluZm8oYnl0ZXMuR2V0U2l6ZSgpLCBxckNvZGUtPkdldFZlcnNpb24oKSwgdGVtcE1vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAmaGVhZGVyQW5kRGF0YUJpdHMsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgIEFwcGVuZDhCaXRCeXRlcyhieXRlcywgJmhlYWRlckFuZERhdGFCaXRzLCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfSBlbHNlIGlmICh0ZW1wTW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNBTFBIQU5VTUVSSUMpIHsNCisgICAgICBBcHBlbmRNb2RlSW5mbyh0ZW1wTW9kZSwgJmhlYWRlckFuZERhdGFCaXRzLCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICBBcHBlbmRMZW5ndGhJbmZvKCgoTWFrZV9QYWlyKilzcGxpdFJlc3VsdFtpXSktPm1fc3RyaW5nLkdldExlbmd0aCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgcXJDb2RlLT5HZXRWZXJzaW9uKCksIHRlbXBNb2RlLCAmaGVhZGVyQW5kRGF0YUJpdHMsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgIEFwcGVuZEJ5dGVzKCgoTWFrZV9QYWlyKilzcGxpdFJlc3VsdFtpXSktPm1fc3RyaW5nLCB0ZW1wTW9kZSwNCisgICAgICAgICAgICAgICAgICAmaGVhZGVyQW5kRGF0YUJpdHMsIGVuY29kaW5nLCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfSBlbHNlIGlmICh0ZW1wTW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNOVU1FUklDKSB7DQorICAgICAgQXBwZW5kTW9kZUluZm8odGVtcE1vZGUsICZoZWFkZXJBbmREYXRhQml0cywgZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgQXBwZW5kTGVuZ3RoSW5mbygoKE1ha2VfUGFpciopc3BsaXRSZXN1bHRbaV0pLT5tX3N0cmluZy5HZXRMZW5ndGgoKSwNCisgICAgICAgICAgICAgICAgICAgICAgIHFyQ29kZS0+R2V0VmVyc2lvbigpLCB0ZW1wTW9kZSwgJmhlYWRlckFuZERhdGFCaXRzLCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICBBcHBlbmRCeXRlcygoKE1ha2VfUGFpciopc3BsaXRSZXN1bHRbaV0pLT5tX3N0cmluZywgdGVtcE1vZGUsDQorICAgICAgICAgICAgICAgICAgJmhlYWRlckFuZERhdGFCaXRzLCBlbmNvZGluZywgZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uVW5rbm93bjsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6U3BsaXRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJBcnJheSYgcmVzdWx0KSB7DQorICBpbnQzMl90IGluZGV4ID0gMCwgZmxhZyA9IDA7DQorICB3aGlsZSAoDQorICAgICAgKCgodWludDhfdCljb250ZW50W2luZGV4XSA+PSAweEExICYmICh1aW50OF90KWNvbnRlbnRbaW5kZXhdIDw9IDB4QUEpIHx8DQorICAgICAgICgodWludDhfdCljb250ZW50W2luZGV4XSA+PSAweEIwICYmICh1aW50OF90KWNvbnRlbnRbaW5kZXhdIDw9IDB4RkEpKSAmJg0KKyAgICAgIChpbmRleCA8IGNvbnRlbnQuR2V0TGVuZ3RoKCkpKSB7DQorICAgIGluZGV4ICs9IDI7DQorICB9DQorICBpZiAoaW5kZXggIT0gZmxhZykgew0KKyAgICByZXN1bHQuQWRkKA0KKyAgICAgICAgbmV3IE1ha2VfUGFpcihDQkNfUVJDb2Rlck1vZGU6OnNHQkssIGNvbnRlbnQuTWlkKGZsYWcsIGluZGV4IC0gZmxhZykpKTsNCisgIH0NCisgIGZsYWcgPSBpbmRleDsNCisgIGlmIChpbmRleCA+PSBjb250ZW50LkdldExlbmd0aCgpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHdoaWxlICgNCisgICAgICBHZXRBbHBoYU51bWVyaWNDb2RlKCh1aW50OF90KWNvbnRlbnRbaW5kZXhdKSA9PSAtMSAmJg0KKyAgICAgICEoKCh1aW50OF90KWNvbnRlbnRbaW5kZXhdID49IDB4QTEgJiYgKHVpbnQ4X3QpY29udGVudFtpbmRleF0gPD0gMHhBQSkgfHwNCisgICAgICAgICgodWludDhfdCljb250ZW50W2luZGV4XSA+PSAweEIwICYmICh1aW50OF90KWNvbnRlbnRbaW5kZXhdIDw9IDB4RkEpKSAmJg0KKyAgICAgIChpbmRleCA8IGNvbnRlbnQuR2V0TGVuZ3RoKCkpKSB7DQorI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18NCisgICAgaWYgKElzREJDU0xlYWRCeXRlKCh1aW50OF90KWNvbnRlbnRbaW5kZXhdKSkNCisjZWxzZQ0KKyAgICBpZiAoKHVpbnQ4X3QpY29udGVudFtpbmRleF0gPiAxMjcpDQorI2VuZGlmDQorICAgIHsNCisgICAgICBpbmRleCArPSAyOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGluZGV4Kys7DQorICAgIH0NCisgIH0NCisgIGlmIChpbmRleCAhPSBmbGFnKSB7DQorICAgIHJlc3VsdC5BZGQoDQorICAgICAgICBuZXcgTWFrZV9QYWlyKENCQ19RUkNvZGVyTW9kZTo6c0JZVEUsIGNvbnRlbnQuTWlkKGZsYWcsIGluZGV4IC0gZmxhZykpKTsNCisgIH0NCisgIGZsYWcgPSBpbmRleDsNCisgIGlmIChpbmRleCA+PSBjb250ZW50LkdldExlbmd0aCgpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHdoaWxlIChGWFNZU19Jc2RpZ2l0KCh1aW50OF90KWNvbnRlbnRbaW5kZXhdKSAmJg0KKyAgICAgICAgIChpbmRleCA8IGNvbnRlbnQuR2V0TGVuZ3RoKCkpKSB7DQorICAgIGluZGV4Kys7DQorICB9DQorICBpZiAoaW5kZXggIT0gZmxhZykgew0KKyAgICByZXN1bHQuQWRkKG5ldyBNYWtlX1BhaXIoQ0JDX1FSQ29kZXJNb2RlOjpzTlVNRVJJQywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuTWlkKGZsYWcsIGluZGV4IC0gZmxhZykpKTsNCisgIH0NCisgIGZsYWcgPSBpbmRleDsNCisgIGlmIChpbmRleCA+PSBjb250ZW50LkdldExlbmd0aCgpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHdoaWxlIChHZXRBbHBoYU51bWVyaWNDb2RlKCh1aW50OF90KWNvbnRlbnRbaW5kZXhdKSAhPSAtMSAmJg0KKyAgICAgICAgIChpbmRleCA8IGNvbnRlbnQuR2V0TGVuZ3RoKCkpKSB7DQorICAgIGluZGV4Kys7DQorICB9DQorICBpZiAoaW5kZXggIT0gZmxhZykgew0KKyAgICByZXN1bHQuQWRkKG5ldyBNYWtlX1BhaXIoQ0JDX1FSQ29kZXJNb2RlOjpzQUxQSEFOVU1FUklDLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5NaWQoZmxhZywgaW5kZXggLSBmbGFnKSkpOw0KKyAgfQ0KKyAgZmxhZyA9IGluZGV4Ow0KKyAgaWYgKGluZGV4ID49IGNvbnRlbnQuR2V0TGVuZ3RoKCkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgU3BsaXRTdHJpbmcoY29udGVudC5NaWQoaW5kZXgsIGNvbnRlbnQuR2V0TGVuZ3RoKCkgLSBpbmRleCksIHJlc3VsdCk7DQorfQ0KK2ludDMyX3QgQ0JDX1FSQ29kZXJFbmNvZGVyOjpHZXRTcGFuQnlWZXJzaW9uKENCQ19RUkNvZGVyTW9kZSogbW9kZUZpcnN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyTW9kZSogbW9kZVNlY29uZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZlcnNpb25OdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKHZlcnNpb25OdW0gPT0gMCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGlmICgobW9kZUZpcnN0ID09IENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQykgJiYNCisgICAgICAobW9kZVNlY29uZCA9PSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFKSkgew0KKyAgICBpZiAodmVyc2lvbk51bSA+PSAxICYmIHZlcnNpb25OdW0gPD0gOSkgew0KKyAgICAgIHJldHVybiAxMTsNCisgICAgfSBlbHNlIGlmICh2ZXJzaW9uTnVtID49IDEwICYmIHZlcnNpb25OdW0gPD0gMjYpIHsNCisgICAgICByZXR1cm4gMTU7DQorICAgIH0gZWxzZSBpZiAodmVyc2lvbk51bSA+PSAyNyAmJiB2ZXJzaW9uTnVtIDw9IDQwKSB7DQorICAgICAgcmV0dXJuIDE2Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vU3VjaFZlcnNpb247DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KKyAgICB9DQorICB9IGVsc2UgaWYgKChtb2RlU2Vjb25kID09IENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQykgJiYNCisgICAgICAgICAgICAgKG1vZGVGaXJzdCA9PSBDQkNfUVJDb2Rlck1vZGU6OnNOVU1FUklDKSkgew0KKyAgICBpZiAodmVyc2lvbk51bSA+PSAxICYmIHZlcnNpb25OdW0gPD0gOSkgew0KKyAgICAgIHJldHVybiAxMzsNCisgICAgfSBlbHNlIGlmICh2ZXJzaW9uTnVtID49IDEwICYmIHZlcnNpb25OdW0gPD0gMjYpIHsNCisgICAgICByZXR1cm4gMTU7DQorICAgIH0gZWxzZSBpZiAodmVyc2lvbk51bSA+PSAyNyAmJiB2ZXJzaW9uTnVtIDw9IDQwKSB7DQorICAgICAgcmV0dXJuIDE3Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbk5vU3VjaFZlcnNpb247DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KKyAgICB9DQorICB9IGVsc2UgaWYgKChtb2RlU2Vjb25kID09IENCQ19RUkNvZGVyTW9kZTo6c0JZVEUpICYmDQorICAgICAgICAgICAgIChtb2RlRmlyc3QgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzTlVNRVJJQykpIHsNCisgICAgaWYgKHZlcnNpb25OdW0gPj0gMSAmJiB2ZXJzaW9uTnVtIDw9IDkpIHsNCisgICAgICByZXR1cm4gNjsNCisgICAgfSBlbHNlIGlmICh2ZXJzaW9uTnVtID49IDEwICYmIHZlcnNpb25OdW0gPD0gMjYpIHsNCisgICAgICByZXR1cm4gODsNCisgICAgfSBlbHNlIGlmICh2ZXJzaW9uTnVtID49IDI3ICYmIHZlcnNpb25OdW0gPD0gNDApIHsNCisgICAgICByZXR1cm4gOTsNCisgICAgfSBlbHNlIHsNCisgICAgICBlID0gQkNFeGNlcHRpb25Ob1N1Y2hWZXJzaW9uOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIC0xOw0KK30NCit2b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6TWVyZ2VTdHJpbmcoQ0ZYX1B0ckFycmF5JiByZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmVyc2lvbk51bSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgTWFrZV9QYWlyKiBmaXJzdCA9IE5VTEw7DQorICBNYWtlX1BhaXIqIHNlY29uZCA9IE5VTEw7DQorICBzaXplX3QgbWVyZ2VOdW0gPSAwOw0KKyAgaW50MzJfdCBpOw0KKyAgZm9yIChpID0gMDsgKChpIDwgcmVzdWx0LkdldFNpemUoKSkgJiYgKGkgKyAxIDwgcmVzdWx0LkdldFNpemUoKSkpOyBpKyspIHsNCisgICAgZmlyc3QgPSAoTWFrZV9QYWlyKilyZXN1bHRbaV07DQorICAgIHNlY29uZCA9IChNYWtlX1BhaXIqKXJlc3VsdFtpICsgMV07DQorICAgIGlmIChmaXJzdC0+bV9tb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQykgew0KKyAgICAgIGludDMyX3QgdG1wID0gR2V0U3BhbkJ5VmVyc2lvbihDQkNfUVJDb2Rlck1vZGU6OnNBTFBIQU5VTUVSSUMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyTW9kZTo6c0JZVEUsIHZlcnNpb25OdW0sIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgIGlmICgoc2Vjb25kLT5tX21vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQllURSkgJiYNCisgICAgICAgICAgKGZpcnN0LT5tX3N0cmluZy5HZXRMZW5ndGgoKSA8IHRtcCkpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IGZpcnN0LT5tX3N0cmluZyArIHNlY29uZC0+bV9zdHJpbmc7DQorICAgICAgICBzZWNvbmQtPm1fc3RyaW5nID0gc3RyOw0KKyAgICAgICAgZGVsZXRlIGZpcnN0Ow0KKyAgICAgICAgcmVzdWx0LlJlbW92ZUF0KGkpOw0KKyAgICAgICAgaS0tOw0KKyAgICAgICAgbWVyZ2VOdW0rKzsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoZmlyc3QtPm1fbW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFKSB7DQorICAgICAgaWYgKHNlY29uZC0+bV9tb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0JZVEUpIHsNCisgICAgICAgIGZpcnN0LT5tX3N0cmluZyArPSBzZWNvbmQtPm1fc3RyaW5nOw0KKyAgICAgICAgZGVsZXRlIHNlY29uZDsNCisgICAgICAgIHJlc3VsdC5SZW1vdmVBdChpICsgMSk7DQorICAgICAgICBpLS07DQorICAgICAgICBtZXJnZU51bSsrOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChmaXJzdC0+bV9tb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c05VTUVSSUMpIHsNCisgICAgICBpbnQzMl90IHRtcCA9IEdldFNwYW5CeVZlcnNpb24oQ0JDX1FSQ29kZXJNb2RlOjpzTlVNRVJJQywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJNb2RlOjpzQllURSwgdmVyc2lvbk51bSwgZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgaWYgKChzZWNvbmQtPm1fbW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFKSAmJg0KKyAgICAgICAgICAoZmlyc3QtPm1fc3RyaW5nLkdldExlbmd0aCgpIDwgdG1wKSkgew0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gZmlyc3QtPm1fc3RyaW5nICsgc2Vjb25kLT5tX3N0cmluZzsNCisgICAgICAgIHNlY29uZC0+bV9zdHJpbmcgPSBzdHI7DQorICAgICAgICBkZWxldGUgZmlyc3Q7DQorICAgICAgICByZXN1bHQuUmVtb3ZlQXQoaSk7DQorICAgICAgICBpLS07DQorICAgICAgICBtZXJnZU51bSsrOw0KKyAgICAgIH0NCisgICAgICB0bXAgPSBHZXRTcGFuQnlWZXJzaW9uKENCQ19RUkNvZGVyTW9kZTo6c05VTUVSSUMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2Rlck1vZGU6OnNBTFBIQU5VTUVSSUMsIHZlcnNpb25OdW0sIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgIGlmICgoc2Vjb25kLT5tX21vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQUxQSEFOVU1FUklDKSAmJg0KKyAgICAgICAgICAoZmlyc3QtPm1fc3RyaW5nLkdldExlbmd0aCgpIDwgdG1wKSkgew0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gZmlyc3QtPm1fc3RyaW5nICsgc2Vjb25kLT5tX3N0cmluZzsNCisgICAgICAgIHNlY29uZC0+bV9zdHJpbmcgPSBzdHI7DQorICAgICAgICBkZWxldGUgZmlyc3Q7DQorICAgICAgICByZXN1bHQuUmVtb3ZlQXQoaSk7DQorICAgICAgICBpLS07DQorICAgICAgICBtZXJnZU51bSsrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKG1lcmdlTnVtID09IDApIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgTWVyZ2VTdHJpbmcocmVzdWx0LCB2ZXJzaW9uTnVtLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KK30NCit2b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6SW5pdFFSQ29kZShpbnQzMl90IG51bUlucHV0Qnl0ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2ZXJzaW9uTnVtYmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJNb2RlKiBtb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyKiBxckNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgcXJDb2RlLT5TZXRFQ0xldmVsKGVjTGV2ZWwpOw0KKyAgcXJDb2RlLT5TZXRNb2RlKG1vZGUpOw0KKyAgQ0JDX1FSQ29kZXJWZXJzaW9uKiB2ZXJzaW9uID0NCisgICAgICBDQkNfUVJDb2RlclZlcnNpb246OkdldFZlcnNpb25Gb3JOdW1iZXIodmVyc2lvbk51bWJlciwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIGludDMyX3QgbnVtQnl0ZXMgPSB2ZXJzaW9uLT5HZXRUb3RhbENvZGVXb3JkcygpOw0KKyAgQ0JDX1FSQ29kZXJFQ0Jsb2NrcyogZWNCbG9ja3MgPSB2ZXJzaW9uLT5HZXRFQ0Jsb2Nrc0ZvckxldmVsKGVjTGV2ZWwpOw0KKyAgaW50MzJfdCBudW1FY0J5dGVzID0gZWNCbG9ja3MtPkdldFRvdGFsRUNDb2RlV29yZHMoKTsNCisgIGludDMyX3QgbnVtUlNCbG9ja3MgPSBlY0Jsb2Nrcy0+R2V0TnVtQmxvY2tzKCk7DQorICBpbnQzMl90IG51bURhdGFCeXRlcyA9IG51bUJ5dGVzIC0gbnVtRWNCeXRlczsNCisgIGlmIChudW1EYXRhQnl0ZXMgPj0gbnVtSW5wdXRCeXRlcyArIDMpIHsNCisgICAgcXJDb2RlLT5TZXRWZXJzaW9uKHZlcnNpb25OdW1iZXIpOw0KKyAgICBxckNvZGUtPlNldE51bVRvdGFsQnl0ZXMobnVtQnl0ZXMpOw0KKyAgICBxckNvZGUtPlNldE51bURhdGFCeXRlcyhudW1EYXRhQnl0ZXMpOw0KKyAgICBxckNvZGUtPlNldE51bVJTQmxvY2tzKG51bVJTQmxvY2tzKTsNCisgICAgcXJDb2RlLT5TZXROdW1FQ0J5dGVzKG51bUVjQnl0ZXMpOw0KKyAgICBxckNvZGUtPlNldE1hdHJpeFdpZHRoKHZlcnNpb24tPkdldERpbWVuc2lvbkZvclZlcnNpb24oKSk7DQorICAgIHJldHVybjsNCisgIH0NCisgIGUgPSBCQ0V4Y2VwdGlvbkNhbm5vdEZpbmRCbG9ja0luZm87DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCit9DQordm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkVuY29kZVdpdGhTcGVjaWZ5VmVyc2lvbigNCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnQsDQorICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsDQorICAgIENCQ19RUkNvZGVyKiBxckNvZGUsDQorICAgIGludDMyX3QgdmVyc2lvblNwZWNpZnksDQorICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9CeXRlU3RyaW5nIGVuY29kaW5nID0gInV0ZjgiOw0KKyAgQ0JDX1FSQ29kZXJNb2RlKiBtb2RlID0gQ0JDX1FSQ29kZXJNb2RlOjpzQllURTsNCisgIENGWF9QdHJBcnJheSBzcGxpdFJlc3VsdDsNCisgIENCQ19RUkNvZGVyQml0VmVjdG9yIGRhdGFCaXRzOw0KKyAgZGF0YUJpdHMuSW5pdCgpOw0KKyAgU3BsaXRTdHJpbmcoY29udGVudCwgc3BsaXRSZXN1bHQpOw0KKyAgTWVyZ2VTdHJpbmcoc3BsaXRSZXN1bHQsIHZlcnNpb25TcGVjaWZ5LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpIENCQ19RUkNvZGVyTW9kZSogdGVtcE1vZGUgPSBOVUxMOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc3BsaXRSZXN1bHQuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgQXBwZW5kQnl0ZXMoKChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2ldKS0+bV9zdHJpbmcsDQorICAgICAgICAgICAgICAgICgoTWFrZV9QYWlyKilzcGxpdFJlc3VsdFtpXSktPm1fbW9kZSwgJmRhdGFCaXRzLCBlbmNvZGluZywgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBzcGxpdFJlc3VsdC5HZXRTaXplKCk7IHkrKykgew0KKyAgICAgICAgZGVsZXRlIChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W3ldOw0KKyAgICAgIH0NCisgICAgICBzcGxpdFJlc3VsdC5SZW1vdmVBbGwoKTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgIH0NCisgIGludDMyX3QgbnVtSW5wdXRCeXRlcyA9IGRhdGFCaXRzLnNpemVJbkJ5dGVzKCk7DQorICBDQkNfUVJDb2RlckJpdFZlY3RvciBoZWFkZXJBbmREYXRhQml0czsNCisgIGhlYWRlckFuZERhdGFCaXRzLkluaXQoKTsNCisgIEluaXRRUkNvZGUobnVtSW5wdXRCeXRlcywgdmVyc2lvblNwZWNpZnksIGVjTGV2ZWwsIG1vZGUsIHFyQ29kZSwgZSk7DQorICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IHNwbGl0UmVzdWx0LkdldFNpemUoKTsgaysrKSB7DQorICAgICAgZGVsZXRlIChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2tdOw0KKyAgICB9DQorICAgIHNwbGl0UmVzdWx0LlJlbW92ZUFsbCgpOw0KKyAgICByZXR1cm47DQorICB9DQorICBBcHBlbmREYXRhTW9kZUxlbmdoSW5mbyhzcGxpdFJlc3VsdCwgaGVhZGVyQW5kRGF0YUJpdHMsIHRlbXBNb2RlLCBxckNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywgZSk7DQorICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IHNwbGl0UmVzdWx0LkdldFNpemUoKTsgaysrKSB7DQorICAgICAgZGVsZXRlIChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2tdOw0KKyAgICB9DQorICAgIHNwbGl0UmVzdWx0LlJlbW92ZUFsbCgpOw0KKyAgICByZXR1cm47DQorICB9DQorICBudW1JbnB1dEJ5dGVzID0gaGVhZGVyQW5kRGF0YUJpdHMuc2l6ZUluQnl0ZXMoKTsNCisgIFRlcm1pbmF0ZUJpdHMocXJDb2RlLT5HZXROdW1EYXRhQnl0ZXMoKSwgJmhlYWRlckFuZERhdGFCaXRzLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgc3BsaXRSZXN1bHQuR2V0U2l6ZSgpOyBrKyspIHsNCisgICAgICBkZWxldGUgKE1ha2VfUGFpciopc3BsaXRSZXN1bHRba107DQorICAgIH0NCisgICAgc3BsaXRSZXN1bHQuUmVtb3ZlQWxsKCk7DQorICAgIHJldHVybjsNCisgIH0NCisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IHNwbGl0UmVzdWx0LkdldFNpemUoKTsgaisrKSB7DQorICAgIGRlbGV0ZSAoTWFrZV9QYWlyKilzcGxpdFJlc3VsdFtqXTsNCisgIH0NCisgIHNwbGl0UmVzdWx0LlJlbW92ZUFsbCgpOw0KKyAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgZmluYWxCaXRzOw0KKyAgZmluYWxCaXRzLkluaXQoKTsNCisgIEludGVybGVhdmVXaXRoRUNCeXRlcygmaGVhZGVyQW5kRGF0YUJpdHMsIHFyQ29kZS0+R2V0TnVtVG90YWxCeXRlcygpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHFyQ29kZS0+R2V0TnVtRGF0YUJ5dGVzKCksIHFyQ29kZS0+R2V0TnVtUlNCbG9ja3MoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAmZmluYWxCaXRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIHBEZWNvZGVyID0gbmV3IENCQ19Db21tb25CeXRlTWF0cml4KA0KKyAgICAgIHFyQ29kZS0+R2V0TWF0cml4V2lkdGgoKSwgcXJDb2RlLT5HZXRNYXRyaXhXaWR0aCgpKTsNCisgIHBEZWNvZGVyLT5Jbml0KCk7DQorICBDQkNfQXV0b1B0cjxDQkNfQ29tbW9uQnl0ZU1hdHJpeD4gbWF0cml4KHBEZWNvZGVyKTsNCisgIGludDMyX3QgbWFza1BhdHRlcm4gPSBDaG9vc2VNYXNrUGF0dGVybigNCisgICAgICAmZmluYWxCaXRzLCBxckNvZGUtPkdldEVDTGV2ZWwoKSwgcXJDb2RlLT5HZXRWZXJzaW9uKCksIG1hdHJpeC5nZXQoKSwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIHFyQ29kZS0+U2V0TWFza1BhdHRlcm4obWFza1BhdHRlcm4pOw0KKyAgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpCdWlsZE1hdHJpeCgmZmluYWxCaXRzLCBxckNvZGUtPkdldEVDTGV2ZWwoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXJDb2RlLT5HZXRWZXJzaW9uKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFyQ29kZS0+R2V0TWFza1BhdHRlcm4oKSwgbWF0cml4LmdldCgpLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgcXJDb2RlLT5TZXRNYXRyaXgobWF0cml4LnJlbGVhc2UoKSk7DQorICBpZiAoIXFyQ29kZS0+SXNWYWxpZCgpKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkludmFsaWRRUkNvZGU7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KK30NCit2b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6RW5jb2RlV2l0aEF1dG9WZXJzaW9uKA0KKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudCwNCisgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCisgICAgQ0JDX1FSQ29kZXIqIHFyQ29kZSwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RpbmcgPSAidXRmOCI7DQorICBDQkNfUVJDb2Rlck1vZGUqIG1vZGUgPSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFOw0KKyAgQ0ZYX1B0ckFycmF5IHNwbGl0UmVzdWx0Ow0KKyAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgZGF0YUJpdHM7DQorICBkYXRhQml0cy5Jbml0KCk7DQorICBTcGxpdFN0cmluZyhjb250ZW50LCBzcGxpdFJlc3VsdCk7DQorICBNZXJnZVN0cmluZyhzcGxpdFJlc3VsdCwgOCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIENCQ19RUkNvZGVyTW9kZSogdGVtcE1vZGUgPSBOVUxMOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc3BsaXRSZXN1bHQuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgQXBwZW5kQnl0ZXMoKChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2ldKS0+bV9zdHJpbmcsDQorICAgICAgICAgICAgICAgICgoTWFrZV9QYWlyKilzcGxpdFJlc3VsdFtpXSktPm1fbW9kZSwgJmRhdGFCaXRzLCBlbmNvZGluZywgZSk7DQorICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgICBmb3IgKGludDMyX3QgbCA9IDA7IGwgPCBzcGxpdFJlc3VsdC5HZXRTaXplKCk7IGwrKykgew0KKyAgICAgICAgZGVsZXRlIChNYWtlX1BhaXIqKXNwbGl0UmVzdWx0W2xdOw0KKyAgICAgIH0NCisgICAgICBzcGxpdFJlc3VsdC5SZW1vdmVBbGwoKTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgIH0NCisgIGludDMyX3QgbnVtSW5wdXRCeXRlcyA9IGRhdGFCaXRzLnNpemVJbkJ5dGVzKCk7DQorICBJbml0UVJDb2RlKG51bUlucHV0Qnl0ZXMsIGVjTGV2ZWwsIG1vZGUsIHFyQ29kZSwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKSBDQkNfUVJDb2RlckJpdFZlY3RvciBoZWFkZXJBbmREYXRhQml0czsNCisgIGhlYWRlckFuZERhdGFCaXRzLkluaXQoKTsNCisgIHRlbXBNb2RlID0gTlVMTDsNCisgIGludDMyX3QgdmVyc2lvbk51bSA9IHFyQ29kZS0+R2V0VmVyc2lvbigpOw0KK3NpZ246DQorICBBcHBlbmREYXRhTW9kZUxlbmdoSW5mbyhzcGxpdFJlc3VsdCwgaGVhZGVyQW5kRGF0YUJpdHMsIHRlbXBNb2RlLCBxckNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywgZSk7DQorICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgIGdvdG8gY2F0Y2hFeGNlcHRpb247DQorICB9DQorICBudW1JbnB1dEJ5dGVzID0gaGVhZGVyQW5kRGF0YUJpdHMuc2l6ZUluQnl0ZXMoKTsNCisgIFRlcm1pbmF0ZUJpdHMocXJDb2RlLT5HZXROdW1EYXRhQnl0ZXMoKSwgJmhlYWRlckFuZERhdGFCaXRzLCBlKTsNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgZ290byBjYXRjaEV4Y2VwdGlvbjsNCisgIH0NCitjYXRjaEV4Y2VwdGlvbjoNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsNCisgICAgaW50MzJfdCBlMSA9IEJDRXhjZXB0aW9uTk87DQorICAgIEluaXRRUkNvZGUobnVtSW5wdXRCeXRlcywgZWNMZXZlbCwgbW9kZSwgcXJDb2RlLCBlMSk7DQorICAgIGlmIChlMSAhPSBCQ0V4Y2VwdGlvbk5PKSB7DQorICAgICAgZSA9IGUxOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICB2ZXJzaW9uTnVtKys7DQorICAgIGlmICh2ZXJzaW9uTnVtIDw9IDQwKSB7DQorICAgICAgaGVhZGVyQW5kRGF0YUJpdHMuQ2xlYXIoKTsNCisgICAgICBlID0gQkNFeGNlcHRpb25OTzsNCisgICAgICBnb3RvIHNpZ247DQorICAgIH0gZWxzZSB7DQorICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgc3BsaXRSZXN1bHQuR2V0U2l6ZSgpOyBqKyspIHsNCisgICAgICAgIGRlbGV0ZSAoTWFrZV9QYWlyKilzcGxpdFJlc3VsdFtqXTsNCisgICAgICB9DQorICAgICAgc3BsaXRSZXN1bHQuUmVtb3ZlQWxsKCk7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICB9DQorICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBzcGxpdFJlc3VsdC5HZXRTaXplKCk7IGsrKykgew0KKyAgICBkZWxldGUgKE1ha2VfUGFpciopc3BsaXRSZXN1bHRba107DQorICB9DQorICBzcGxpdFJlc3VsdC5SZW1vdmVBbGwoKTsNCisgIENCQ19RUkNvZGVyQml0VmVjdG9yIGZpbmFsQml0czsNCisgIGZpbmFsQml0cy5Jbml0KCk7DQorICBJbnRlcmxlYXZlV2l0aEVDQnl0ZXMoJmhlYWRlckFuZERhdGFCaXRzLCBxckNvZGUtPkdldE51bVRvdGFsQnl0ZXMoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICBxckNvZGUtPkdldE51bURhdGFCeXRlcygpLCBxckNvZGUtPkdldE51bVJTQmxvY2tzKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgJmZpbmFsQml0cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIENCQ19Db21tb25CeXRlTWF0cml4KiBwRGVjb2RlciA9IG5ldyBDQkNfQ29tbW9uQnl0ZU1hdHJpeCgNCisgICAgICBxckNvZGUtPkdldE1hdHJpeFdpZHRoKCksIHFyQ29kZS0+R2V0TWF0cml4V2lkdGgoKSk7DQorICBwRGVjb2Rlci0+SW5pdCgpOw0KKyAgQ0JDX0F1dG9QdHI8Q0JDX0NvbW1vbkJ5dGVNYXRyaXg+IG1hdHJpeChwRGVjb2Rlcik7DQorICBpbnQzMl90IG1hc2tQYXR0ZXJuID0gQ2hvb3NlTWFza1BhdHRlcm4oDQorICAgICAgJmZpbmFsQml0cywgcXJDb2RlLT5HZXRFQ0xldmVsKCksIHFyQ29kZS0+R2V0VmVyc2lvbigpLCBtYXRyaXguZ2V0KCksIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBxckNvZGUtPlNldE1hc2tQYXR0ZXJuKG1hc2tQYXR0ZXJuKTsNCisgIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6QnVpbGRNYXRyaXgoJmZpbmFsQml0cywgcXJDb2RlLT5HZXRFQ0xldmVsKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFyQ29kZS0+R2V0VmVyc2lvbigpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxckNvZGUtPkdldE1hc2tQYXR0ZXJuKCksIG1hdHJpeC5nZXQoKSwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKSBxckNvZGUtPlNldE1hdHJpeChtYXRyaXgucmVsZWFzZSgpKTsNCisgIGlmICghcXJDb2RlLT5Jc1ZhbGlkKCkpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZFFSQ29kZTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNvbnRlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXIqIHFyQ29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9CeXRlU3RyaW5nIGVuY29kaW5nID0gInV0ZjgiOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgdXRmOERhdGE7DQorICBDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OlVuaWNvZGVUb1VURjgoY29udGVudCwgdXRmOERhdGEpOw0KKyAgQ0JDX1FSQ29kZXJNb2RlKiBtb2RlID0gQ2hvb3NlTW9kZSh1dGY4RGF0YSwgZW5jb2RpbmcpOw0KKyAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgZGF0YUJpdHM7DQorICBkYXRhQml0cy5Jbml0KCk7DQorICBBcHBlbmRCeXRlcyh1dGY4RGF0YSwgbW9kZSwgJmRhdGFCaXRzLCBlbmNvZGluZywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIGludDMyX3QgbnVtSW5wdXRCeXRlcyA9IGRhdGFCaXRzLnNpemVJbkJ5dGVzKCk7DQorICBJbml0UVJDb2RlKG51bUlucHV0Qnl0ZXMsIGVjTGV2ZWwsIG1vZGUsIHFyQ29kZSwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIENCQ19RUkNvZGVyQml0VmVjdG9yIGhlYWRlckFuZERhdGFCaXRzOw0KKyAgaGVhZGVyQW5kRGF0YUJpdHMuSW5pdCgpOw0KKyAgQXBwZW5kTW9kZUluZm8obW9kZSwgJmhlYWRlckFuZERhdGFCaXRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgaW50MzJfdCBudW1MZXR0ZXJzID0gbW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFID8gZGF0YUJpdHMuc2l6ZUluQnl0ZXMoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29udGVudC5HZXRMZW5ndGgoKTsNCisgIEFwcGVuZExlbmd0aEluZm8obnVtTGV0dGVycywgcXJDb2RlLT5HZXRWZXJzaW9uKCksIG1vZGUsICZoZWFkZXJBbmREYXRhQml0cywNCisgICAgICAgICAgICAgICAgICAgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIGhlYWRlckFuZERhdGFCaXRzLkFwcGVuZEJpdFZlY3RvcigmZGF0YUJpdHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSkNCisgICAgICBUZXJtaW5hdGVCaXRzKHFyQ29kZS0+R2V0TnVtRGF0YUJ5dGVzKCksICZoZWFkZXJBbmREYXRhQml0cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIENCQ19RUkNvZGVyQml0VmVjdG9yIGZpbmFsQml0czsNCisgIGZpbmFsQml0cy5Jbml0KCk7DQorICBJbnRlcmxlYXZlV2l0aEVDQnl0ZXMoJmhlYWRlckFuZERhdGFCaXRzLCBxckNvZGUtPkdldE51bVRvdGFsQnl0ZXMoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICBxckNvZGUtPkdldE51bURhdGFCeXRlcygpLCBxckNvZGUtPkdldE51bVJTQmxvY2tzKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgJmZpbmFsQml0cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIENCQ19Db21tb25CeXRlTWF0cml4KiBwRGVjb2RlciA9IG5ldyBDQkNfQ29tbW9uQnl0ZU1hdHJpeCgNCisgICAgICBxckNvZGUtPkdldE1hdHJpeFdpZHRoKCksIHFyQ29kZS0+R2V0TWF0cml4V2lkdGgoKSk7DQorICBwRGVjb2Rlci0+SW5pdCgpOw0KKyAgQ0JDX0F1dG9QdHI8Q0JDX0NvbW1vbkJ5dGVNYXRyaXg+IG1hdHJpeChwRGVjb2Rlcik7DQorICBpbnQzMl90IG1hc2tQYXR0ZXJuID0gQ2hvb3NlTWFza1BhdHRlcm4oDQorICAgICAgJmZpbmFsQml0cywgcXJDb2RlLT5HZXRFQ0xldmVsKCksIHFyQ29kZS0+R2V0VmVyc2lvbigpLCBtYXRyaXguZ2V0KCksIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBxckNvZGUtPlNldE1hc2tQYXR0ZXJuKG1hc2tQYXR0ZXJuKTsNCisgIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6QnVpbGRNYXRyaXgoJmZpbmFsQml0cywgcXJDb2RlLT5HZXRFQ0xldmVsKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFyQ29kZS0+R2V0VmVyc2lvbigpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxckNvZGUtPkdldE1hc2tQYXR0ZXJuKCksIG1hdHJpeC5nZXQoKSwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKSBxckNvZGUtPlNldE1hdHJpeChtYXRyaXgucmVsZWFzZSgpKTsNCisgIGlmICghcXJDb2RlLT5Jc1ZhbGlkKCkpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZFFSQ29kZTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpUZXJtaW5hdGVCaXRzKGludDMyX3QgbnVtRGF0YUJ5dGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3QgY2FwYWNpdHkgPSBudW1EYXRhQnl0ZXMgPDwgMzsNCisgIGlmIChiaXRzLT5TaXplKCkgPiBjYXBhY2l0eSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25EYXRhVG9vTWFueTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA0ICYmIGJpdHMtPlNpemUoKSA8IGNhcGFjaXR5OyArK2kpIHsNCisgICAgYml0cy0+QXBwZW5kQml0KDAsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCisgIGludDMyX3QgbnVtQml0c0luTGFzdEJ5dGUgPSBiaXRzLT5TaXplKCkgJSA4Ow0KKyAgaWYgKG51bUJpdHNJbkxhc3RCeXRlID4gMCkgew0KKyAgICBpbnQzMl90IG51bVBhZGRpbmdCaXRzID0gOCAtIG51bUJpdHNJbkxhc3RCeXRlOw0KKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBudW1QYWRkaW5nQml0czsgKytqKSB7DQorICAgICAgYml0cy0+QXBwZW5kQml0KDAsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpDQorICAgIH0NCisgIH0NCisgIGlmIChiaXRzLT5TaXplKCkgJSA4ICE9IDApIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uRGlnaXRMZW5ndGhNdXN0QmU4Ow0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCisgIGludDMyX3QgbnVtUGFkZGluZ0J5dGVzID0gbnVtRGF0YUJ5dGVzIC0gYml0cy0+c2l6ZUluQnl0ZXMoKTsNCisgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IG51bVBhZGRpbmdCeXRlczsgKytrKSB7DQorICAgIGlmIChrICUgMiA9PSAwKSB7DQorICAgICAgYml0cy0+QXBwZW5kQml0cygweGVjLCA4LCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBiaXRzLT5BcHBlbmRCaXRzKDB4MTEsIDgsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorICB9DQorICBpZiAoYml0cy0+U2l6ZSgpICE9IGNhcGFjaXR5KSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkJpdHNOb3RFcXVhbENhY2l0eTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorfQ0KK2ludDMyX3QgQ0JDX1FSQ29kZXJFbmNvZGVyOjpDaG9vc2VNYXNrUGF0dGVybigNCisgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsDQorICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsDQorICAgIGludDMyX3QgdmVyc2lvbiwNCisgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBtaW5QZW5hbHR5ID0gNjU1MzU7DQorICBpbnQzMl90IGJlc3RNYXNrUGF0dGVybiA9IC0xOw0KKyAgZm9yIChpbnQzMl90IG1hc2tQYXR0ZXJuID0gMDsgbWFza1BhdHRlcm4gPCBDQkNfUVJDb2Rlcjo6TlVNX01BU0tfUEFUVEVSTlM7DQorICAgICAgIG1hc2tQYXR0ZXJuKyspIHsNCisgICAgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpCdWlsZE1hdHJpeChiaXRzLCBlY0xldmVsLCB2ZXJzaW9uLCBtYXNrUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICAgIGludDMyX3QgcGVuYWx0eSA9IENhbGN1bGF0ZU1hc2tQZW5hbHR5KG1hdHJpeCk7DQorICAgIGlmIChwZW5hbHR5IDwgbWluUGVuYWx0eSkgew0KKyAgICAgIG1pblBlbmFsdHkgPSBwZW5hbHR5Ow0KKyAgICAgIGJlc3RNYXNrUGF0dGVybiA9IG1hc2tQYXR0ZXJuOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gYmVzdE1hc2tQYXR0ZXJuOw0KK30NCitpbnQzMl90IENCQ19RUkNvZGVyRW5jb2Rlcjo6Q2FsY3VsYXRlTWFza1BlbmFsdHkoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCkgew0KKyAgaW50MzJfdCBwZW5hbHR5ID0gMDsNCisgIHBlbmFsdHkgKz0gQ0JDX1FSQ29kZXJNYXNrVXRpbDo6QXBwbHlNYXNrUGVuYWx0eVJ1bGUxKG1hdHJpeCk7DQorICBwZW5hbHR5ICs9IENCQ19RUkNvZGVyTWFza1V0aWw6OkFwcGx5TWFza1BlbmFsdHlSdWxlMihtYXRyaXgpOw0KKyAgcGVuYWx0eSArPSBDQkNfUVJDb2Rlck1hc2tVdGlsOjpBcHBseU1hc2tQZW5hbHR5UnVsZTMobWF0cml4KTsNCisgIHBlbmFsdHkgKz0gQ0JDX1FSQ29kZXJNYXNrVXRpbDo6QXBwbHlNYXNrUGVuYWx0eVJ1bGU0KG1hdHJpeCk7DQorICByZXR1cm4gcGVuYWx0eTsNCit9DQorQ0JDX1FSQ29kZXJNb2RlKiBDQkNfUVJDb2RlckVuY29kZXI6OkNob29zZU1vZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RpbmcpIHsNCisgIGlmIChlbmNvZGluZy5Db21wYXJlKCJTSElGVF9KSVMiKSA9PSAwKSB7DQorICAgIHJldHVybiBDQkNfUVJDb2Rlck1vZGU6OnNLQU5KSTsNCisgIH0NCisgIEZYX0JPT0wgaGFzTnVtZXJpYyA9IEZBTFNFOw0KKyAgRlhfQk9PTCBoYXNBbHBoYU51bWVyaWMgPSBGQUxTRTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvbnRlbnQuR2V0TGVuZ3RoKCk7IGkrKykgew0KKyAgICBpZiAoaXNkaWdpdCgodWludDhfdCljb250ZW50W2ldKSkgew0KKyAgICAgIGhhc051bWVyaWMgPSBUUlVFOw0KKyAgICB9IGVsc2UgaWYgKEdldEFscGhhTnVtZXJpY0NvZGUoKHVpbnQ4X3QpY29udGVudFtpXSkgIT0gLTEpIHsNCisgICAgICBoYXNBbHBoYU51bWVyaWMgPSBUUlVFOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJldHVybiBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFOw0KKyAgICB9DQorICB9DQorICBpZiAoaGFzQWxwaGFOdW1lcmljKSB7DQorICAgIHJldHVybiBDQkNfUVJDb2Rlck1vZGU6OnNBTFBIQU5VTUVSSUM7DQorICB9IGVsc2UgaWYgKGhhc051bWVyaWMpIHsNCisgICAgcmV0dXJuIENCQ19RUkNvZGVyTW9kZTo6c05VTUVSSUM7DQorICB9DQorICByZXR1cm4gQ0JDX1FSQ29kZXJNb2RlOjpzQllURTsNCit9DQoraW50MzJfdCBDQkNfUVJDb2RlckVuY29kZXI6OkdldEFscGhhTnVtZXJpY0NvZGUoaW50MzJfdCBjb2RlKSB7DQorICBpZiAoY29kZSA8IDk2ICYmIGNvZGUgPj0gMCkgew0KKyAgICByZXR1cm4gbV9hbHBoYU51bWJlcmljVGFibGVbY29kZV07DQorICB9DQorICByZXR1cm4gLTE7DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpBcHBlbmRCeXRlcyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJNb2RlKiBtb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c05VTUVSSUMpIHsNCisgICAgQXBwZW5kTnVtZXJpY0J5dGVzKGNvbnRlbnQsIGJpdHMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0gZWxzZSBpZiAobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNBTFBIQU5VTUVSSUMpIHsNCisgICAgQXBwZW5kQWxwaGFOdW1lcmljQnl0ZXMoY29udGVudCwgYml0cywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfSBlbHNlIGlmIChtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0JZVEUpIHsNCisgICAgQXBwZW5kOEJpdEJ5dGVzKGNvbnRlbnQsIGJpdHMsIGVuY29kaW5nLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9IGVsc2UgaWYgKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzS0FOSkkpIHsNCisgICAgQXBwZW5kS2FuamlCeXRlcyhjb250ZW50LCBiaXRzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9IGVsc2UgaWYgKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzR0JLKSB7DQorICAgIEFwcGVuZEdCS0J5dGVzKGNvbnRlbnQsIGJpdHMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0gZWxzZSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvblVuc3VwcG9ydGVkTW9kZTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpBcHBlbmROdW1lcmljQnl0ZXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3QgbGVuZ3RoID0gY29udGVudC5HZXRMZW5ndGgoKTsNCisgIGludDMyX3QgaSA9IDA7DQorICB3aGlsZSAoaSA8IGxlbmd0aCkgew0KKyAgICBpbnQzMl90IG51bTEgPSBjb250ZW50W2ldIC0gJzAnOw0KKyAgICBpZiAoaSArIDIgPCBsZW5ndGgpIHsNCisgICAgICBpbnQzMl90IG51bTIgPSBjb250ZW50W2kgKyAxXSAtICcwJzsNCisgICAgICBpbnQzMl90IG51bTMgPSBjb250ZW50W2kgKyAyXSAtICcwJzsNCisgICAgICBiaXRzLT5BcHBlbmRCaXRzKG51bTEgKiAxMDAgKyBudW0yICogMTAgKyBudW0zLCAxMCwgZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSkgaSArPSAzOw0KKyAgICB9IGVsc2UgaWYgKGkgKyAxIDwgbGVuZ3RoKSB7DQorICAgICAgaW50MzJfdCBudW0yID0gY29udGVudFtpICsgMV0gLSAnMCc7DQorICAgICAgYml0cy0+QXBwZW5kQml0cyhudW0xICogMTAgKyBudW0yLCA3LCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKSBpICs9IDI7DQorICAgIH0gZWxzZSB7DQorICAgICAgYml0cy0+QXBwZW5kQml0cyhudW0xLCA0LCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICBpKys7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkFwcGVuZEFscGhhTnVtZXJpY0J5dGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCBsZW5ndGggPSBjb250ZW50LkdldExlbmd0aCgpOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIHdoaWxlIChpIDwgbGVuZ3RoKSB7DQorICAgIGludDMyX3QgY29kZTEgPSBHZXRBbHBoYU51bWVyaWNDb2RlKGNvbnRlbnRbaV0pOw0KKyAgICBpZiAoY29kZTEgPT0gLTEpIHsNCisgICAgICBlID0gQkNFeGNlcHRpb25JbnZhbGlkYXRlQ2hhcmFjdGVyOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorICAgIGlmIChpICsgMSA8IGxlbmd0aCkgew0KKyAgICAgIGludDMyX3QgY29kZTIgPSBHZXRBbHBoYU51bWVyaWNDb2RlKGNvbnRlbnRbaSArIDFdKTsNCisgICAgICBpZiAoY29kZTIgPT0gLTEpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVDaGFyYWN0ZXI7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICB9DQorICAgICAgYml0cy0+QXBwZW5kQml0cyhjb2RlMSAqIDQ1ICsgY29kZTIsIDExLCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICBpICs9IDI7DQorICAgIH0gZWxzZSB7DQorICAgICAgYml0cy0+QXBwZW5kQml0cyhjb2RlMSwgNiwgZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSkgaSsrOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpBcHBlbmRHQktCeXRlcyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3QgbGVuZ3RoID0gY29udGVudC5HZXRMZW5ndGgoKTsNCisgIEZYX0RXT1JEIHZhbHVlID0gMDsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAyKSB7DQorICAgIHZhbHVlID0gKEZYX0RXT1JEKSgodWludDhfdCljb250ZW50W2ldIDw8IDggfCAodWludDhfdCljb250ZW50W2kgKyAxXSk7DQorICAgIGlmICh2YWx1ZSA8PSAweEFBRkUgJiYgdmFsdWUgPj0gMHhBMUExKSB7DQorICAgICAgdmFsdWUgLT0gMHhBMUExOw0KKyAgICB9IGVsc2UgaWYgKHZhbHVlIDw9IDB4RkFGRSAmJiB2YWx1ZSA+PSAweEIwQTEpIHsNCisgICAgICB2YWx1ZSAtPSAweEE2QTE7DQorICAgIH0gZWxzZSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZGF0ZUNoYXJhY3RlcjsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KKyAgICB2YWx1ZSA9IChGWF9EV09SRCkoKHZhbHVlID4+IDgpICogMHg2MCkgKyAoRlhfRFdPUkQpKHZhbHVlICYgMHhmZik7DQorICAgIGJpdHMtPkFwcGVuZEJpdHModmFsdWUsIDEzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpBcHBlbmQ4Qml0Qnl0ZXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGVuY29kaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29udGVudC5HZXRMZW5ndGgoKTsgaSsrKSB7DQorICAgIGJpdHMtPkFwcGVuZEJpdHMoY29udGVudFtpXSwgOCwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KK30NCit2b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6QXBwZW5kOEJpdEJ5dGVzKENGWF9CeXRlQXJyYXkmIGJ5dGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBieXRlcy5HZXRTaXplKCk7IGkrKykgew0KKyAgICBiaXRzLT5BcHBlbmRCaXRzKGJ5dGVzW2ldLCA4LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpBcHBlbmRLYW5qaUJ5dGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIENGWF9CeXRlQXJyYXkgYnl0ZXM7DQorICBGWF9EV09SRCB2YWx1ZSA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBieXRlcy5HZXRTaXplKCk7IGkgKz0gMikgew0KKyAgICB2YWx1ZSA9IChGWF9EV09SRCkoKHVpbnQ4X3QpKGNvbnRlbnRbaV0gPDwgOCkgfCAodWludDhfdCljb250ZW50W2kgKyAxXSk7DQorICAgIGlmICh2YWx1ZSA8PSAweDlmZmMgJiYgdmFsdWUgPj0gMHg4MTQwKSB7DQorICAgICAgdmFsdWUgLT0gMHg4MTQwOw0KKyAgICB9IGVsc2UgaWYgKHZhbHVlIDw9IDB4ZWJiZiAmJiB2YWx1ZSA+PSAweGUwNDApIHsNCisgICAgICB2YWx1ZSAtPSAweGMxNDA7DQorICAgIH0gZWxzZSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZGF0ZUNoYXJhY3RlcjsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KKyAgICB2YWx1ZSA9IChGWF9EV09SRCkoKHZhbHVlID4+IDgpICogMHhjMCkgKyAoRlhfRFdPUkQpKHZhbHVlICYgMHhmZik7DQorICAgIGJpdHMtPkFwcGVuZEJpdHModmFsdWUsIDEzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpJbml0UVJDb2RlKGludDMyX3QgbnVtSW5wdXRCeXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyTW9kZSogbW9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlciogcXJDb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIHFyQ29kZS0+U2V0RUNMZXZlbChlY0xldmVsKTsNCisgIHFyQ29kZS0+U2V0TW9kZShtb2RlKTsNCisgIGZvciAoaW50MzJfdCB2ZXJzaW9uTnVtID0gMTsgdmVyc2lvbk51bSA8PSA0MDsgdmVyc2lvbk51bSsrKSB7DQorICAgIENCQ19RUkNvZGVyVmVyc2lvbiogdmVyc2lvbiA9DQorICAgICAgICBDQkNfUVJDb2RlclZlcnNpb246OkdldFZlcnNpb25Gb3JOdW1iZXIodmVyc2lvbk51bSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBpbnQzMl90IG51bUJ5dGVzID0gdmVyc2lvbi0+R2V0VG90YWxDb2RlV29yZHMoKTsNCisgICAgQ0JDX1FSQ29kZXJFQ0Jsb2NrcyogZWNCbG9ja3MgPSB2ZXJzaW9uLT5HZXRFQ0Jsb2Nrc0ZvckxldmVsKGVjTGV2ZWwpOw0KKyAgICBpbnQzMl90IG51bUVjQnl0ZXMgPSBlY0Jsb2Nrcy0+R2V0VG90YWxFQ0NvZGVXb3JkcygpOw0KKyAgICBpbnQzMl90IG51bVJTQmxvY2tzID0gZWNCbG9ja3MtPkdldE51bUJsb2NrcygpOw0KKyAgICBpbnQzMl90IG51bURhdGFCeXRlcyA9IG51bUJ5dGVzIC0gbnVtRWNCeXRlczsNCisgICAgaWYgKG51bURhdGFCeXRlcyA+PSBudW1JbnB1dEJ5dGVzICsgMykgew0KKyAgICAgIHFyQ29kZS0+U2V0VmVyc2lvbih2ZXJzaW9uTnVtKTsNCisgICAgICBxckNvZGUtPlNldE51bVRvdGFsQnl0ZXMobnVtQnl0ZXMpOw0KKyAgICAgIHFyQ29kZS0+U2V0TnVtRGF0YUJ5dGVzKG51bURhdGFCeXRlcyk7DQorICAgICAgcXJDb2RlLT5TZXROdW1SU0Jsb2NrcyhudW1SU0Jsb2Nrcyk7DQorICAgICAgcXJDb2RlLT5TZXROdW1FQ0J5dGVzKG51bUVjQnl0ZXMpOw0KKyAgICAgIHFyQ29kZS0+U2V0TWF0cml4V2lkdGgodmVyc2lvbi0+R2V0RGltZW5zaW9uRm9yVmVyc2lvbigpKTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgIH0NCisgIGUgPSBCQ0V4Y2VwdGlvbkNhbm5vdEZpbmRCbG9ja0luZm87DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCit9DQordm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkFwcGVuZE1vZGVJbmZvKENCQ19RUkNvZGVyTW9kZSogbW9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGJpdHMtPkFwcGVuZEJpdHMobW9kZS0+R2V0Qml0cygpLCA0LCBlKTsNCisgIGlmIChtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0dCSykgew0KKyAgICBiaXRzLT5BcHBlbmRCaXRzKDEsIDQsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCit9DQordm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkFwcGVuZExlbmd0aEluZm8oaW50MzJfdCBudW1MZXR0ZXJzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmVyc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2Rlck1vZGUqIG1vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0JDX1FSQ29kZXJWZXJzaW9uKiBxY3YgPSBDQkNfUVJDb2RlclZlcnNpb246OkdldFZlcnNpb25Gb3JOdW1iZXIodmVyc2lvbiwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIGludDMyX3QgbnVtQml0cyA9IG1vZGUtPkdldENoYXJhY3RlckNvdW50Qml0cyhxY3YsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBpZiAobnVtQml0cyA+ICgoMSA8PCBudW1CaXRzKSAtIDEpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0dCSykgew0KKyAgICBiaXRzLT5BcHBlbmRCaXRzKG51bUxldHRlcnMgLyAyLCBudW1CaXRzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBiaXRzLT5BcHBlbmRCaXRzKG51bUxldHRlcnMsIG51bUJpdHMsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpJbnRlcmxlYXZlV2l0aEVDQnl0ZXMoQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVRvdGFsQnl0ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bURhdGFCeXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtUlNCbG9ja3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogcmVzdWx0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGJpdHMtPnNpemVJbkJ5dGVzKCkgIT0gbnVtRGF0YUJ5dGVzKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkJpdHNCeXRlc05vdE1hdGNoOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCisgIGludDMyX3QgZGF0YUJ5dGVzT2Zmc2V0ID0gMDsNCisgIGludDMyX3QgbWF4TnVtRGF0YUJ5dGVzID0gMDsNCisgIGludDMyX3QgbWF4TnVtRWNCeXRlcyA9IDA7DQorICBDRlhfUHRyQXJyYXkgYmxvY2tzOw0KKyAgaW50MzJfdCBpOw0KKyAgZm9yIChpID0gMDsgaSA8IG51bVJTQmxvY2tzOyBpKyspIHsNCisgICAgaW50MzJfdCBudW1EYXRhQnl0ZXNJbkJsb2NrOw0KKyAgICBpbnQzMl90IG51bUVjQnl0ZXNJbkJsb3NrOw0KKyAgICBHZXROdW1EYXRhQnl0ZXNBbmROdW1FQ0J5dGVzRm9yQmxvY2tJRChudW1Ub3RhbEJ5dGVzLCBudW1EYXRhQnl0ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVJTQmxvY2tzLCBpLCBudW1EYXRhQnl0ZXNJbkJsb2NrLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1FY0J5dGVzSW5CbG9zayk7DQorICAgIENCQ19Db21tb25CeXRlQXJyYXkqIGRhdGFCeXRlcyA9IG5ldyBDQkNfQ29tbW9uQnl0ZUFycmF5Ow0KKyAgICBkYXRhQnl0ZXMtPlNldChiaXRzLT5HZXRBcnJheSgpLCBkYXRhQnl0ZXNPZmZzZXQsIG51bURhdGFCeXRlc0luQmxvY2spOw0KKyAgICBDQkNfQ29tbW9uQnl0ZUFycmF5KiBlY0J5dGVzID0NCisgICAgICAgIEdlbmVyYXRlRUNCeXRlcyhkYXRhQnl0ZXMsIG51bUVjQnl0ZXNJbkJsb3NrLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIGJsb2Nrcy5BZGQobmV3IENCQ19RUkNvZGVyQmxvY2tQYWlyKGRhdGFCeXRlcywgZWNCeXRlcykpOw0KKyAgICBtYXhOdW1EYXRhQnl0ZXMgPSBzdGQ6Om1heChtYXhOdW1EYXRhQnl0ZXMsIGRhdGFCeXRlcy0+U2l6ZSgpKTsNCisgICAgbWF4TnVtRWNCeXRlcyA9IHN0ZDo6bWF4KG1heE51bUVjQnl0ZXMsIGVjQnl0ZXMtPlNpemUoKSk7DQorICAgIGRhdGFCeXRlc09mZnNldCArPSBudW1EYXRhQnl0ZXNJbkJsb2NrOw0KKyAgfQ0KKyAgaWYgKG51bURhdGFCeXRlcyAhPSBkYXRhQnl0ZXNPZmZzZXQpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uQnl0ZXNOb3RNYXRjaE9mZnNldDsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBtYXhOdW1EYXRhQnl0ZXM7IHgrKykgew0KKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBibG9ja3MuR2V0U2l6ZSgpOyBqKyspIHsNCisgICAgICBDQkNfQ29tbW9uQnl0ZUFycmF5KiBkYXRhQnl0ZXMgPQ0KKyAgICAgICAgICAoKENCQ19RUkNvZGVyQmxvY2tQYWlyKilibG9ja3Nbal0pLT5HZXREYXRhQnl0ZXMoKTsNCisgICAgICBpZiAoeCA8IGRhdGFCeXRlcy0+U2l6ZSgpKSB7DQorICAgICAgICByZXN1bHQtPkFwcGVuZEJpdHMoZGF0YUJ5dGVzLT5BdCh4KSwgOCwgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IG1heE51bUVjQnl0ZXM7IHkrKykgew0KKyAgICBmb3IgKGludDMyX3QgbCA9IDA7IGwgPCBibG9ja3MuR2V0U2l6ZSgpOyBsKyspIHsNCisgICAgICBDQkNfQ29tbW9uQnl0ZUFycmF5KiBlY0J5dGVzID0NCisgICAgICAgICAgKChDQkNfUVJDb2RlckJsb2NrUGFpciopYmxvY2tzW2xdKS0+R2V0RXJyb3JDb3JyZWN0aW9uQnl0ZXMoKTsNCisgICAgICBpZiAoeSA8IGVjQnl0ZXMtPlNpemUoKSkgew0KKyAgICAgICAgcmVzdWx0LT5BcHBlbmRCaXRzKGVjQnl0ZXMtPkF0KHkpLCA4LCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgYmxvY2tzLkdldFNpemUoKTsgaysrKSB7DQorICAgIGRlbGV0ZSAoQ0JDX1FSQ29kZXJCbG9ja1BhaXIqKWJsb2Nrc1trXTsNCisgIH0NCisgIGlmIChudW1Ub3RhbEJ5dGVzICE9IHJlc3VsdC0+c2l6ZUluQnl0ZXMoKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25TaXplSW5CeXRlc0RpZmZlcjsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpHZXROdW1EYXRhQnl0ZXNBbmROdW1FQ0J5dGVzRm9yQmxvY2tJRCgNCisgICAgaW50MzJfdCBudW1Ub3RhbEJ5dGVzLA0KKyAgICBpbnQzMl90IG51bURhdGFCeXRlcywNCisgICAgaW50MzJfdCBudW1SU0Jsb2NrcywNCisgICAgaW50MzJfdCBibG9ja0lELA0KKyAgICBpbnQzMl90JiBudW1EYXRhQnl0ZXNJbkJsb2NrLA0KKyAgICBpbnQzMl90JiBudW1FQ0J5dGVzSW5CbG9jaykgew0KKyAgaWYgKGJsb2NrSUQgPj0gbnVtUlNCbG9ja3MpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBudW1Sc0Jsb2Nrc0luR3JvdXAyID0gbnVtVG90YWxCeXRlcyAlIG51bVJTQmxvY2tzOw0KKyAgaW50MzJfdCBudW1Sc0Jsb2Nrc0luR3JvdXAxID0gbnVtUlNCbG9ja3MgLSBudW1Sc0Jsb2Nrc0luR3JvdXAyOw0KKyAgaW50MzJfdCBudW1Ub3RhbEJ5dGVzSW5Hcm91cDEgPSBudW1Ub3RhbEJ5dGVzIC8gbnVtUlNCbG9ja3M7DQorICBpbnQzMl90IG51bVRvdGFsQnl0ZXNJbkdyb3VwMiA9IG51bVRvdGFsQnl0ZXNJbkdyb3VwMSArIDE7DQorICBpbnQzMl90IG51bURhdGFCeXRlc0luR3JvdXAxID0gbnVtRGF0YUJ5dGVzIC8gbnVtUlNCbG9ja3M7DQorICBpbnQzMl90IG51bURhdGFCeXRlc0luR3JvdXAyID0gbnVtRGF0YUJ5dGVzSW5Hcm91cDEgKyAxOw0KKyAgaW50MzJfdCBudW1FY0J5dGVzSW5Hcm91cDEgPSBudW1Ub3RhbEJ5dGVzSW5Hcm91cDEgLSBudW1EYXRhQnl0ZXNJbkdyb3VwMTsNCisgIGludDMyX3QgbnVtRWNCeXRlc0luR3JvdXAyID0gbnVtVG90YWxCeXRlc0luR3JvdXAyIC0gbnVtRGF0YUJ5dGVzSW5Hcm91cDI7DQorICBpZiAoYmxvY2tJRCA8IG51bVJzQmxvY2tzSW5Hcm91cDEpIHsNCisgICAgbnVtRGF0YUJ5dGVzSW5CbG9jayA9IG51bURhdGFCeXRlc0luR3JvdXAxOw0KKyAgICBudW1FQ0J5dGVzSW5CbG9jayA9IG51bUVjQnl0ZXNJbkdyb3VwMTsNCisgIH0gZWxzZSB7DQorICAgIG51bURhdGFCeXRlc0luQmxvY2sgPSBudW1EYXRhQnl0ZXNJbkdyb3VwMjsNCisgICAgbnVtRUNCeXRlc0luQmxvY2sgPSBudW1FY0J5dGVzSW5Hcm91cDI7DQorICB9DQorfQ0KK0NCQ19Db21tb25CeXRlQXJyYXkqIENCQ19RUkNvZGVyRW5jb2Rlcjo6R2VuZXJhdGVFQ0J5dGVzKA0KKyAgICBDQkNfQ29tbW9uQnl0ZUFycmF5KiBkYXRhQnl0ZXMsDQorICAgIGludDMyX3QgbnVtRWNCeXRlc0luQmxvY2ssDQorICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3QgbnVtRGF0YUJ5dGVzID0gZGF0YUJ5dGVzLT5TaXplKCk7DQorICBDRlhfSW50MzJBcnJheSB0b0VuY29kZTsNCisgIHRvRW5jb2RlLlNldFNpemUobnVtRGF0YUJ5dGVzICsgbnVtRWNCeXRlc0luQmxvY2spOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtRGF0YUJ5dGVzOyBpKyspIHsNCisgICAgdG9FbmNvZGVbaV0gPSAoZGF0YUJ5dGVzLT5BdChpKSk7DQorICB9DQorICBDQkNfUmVlZFNvbG9tb25FbmNvZGVyIGVuY29kZShDQkNfUmVlZFNvbG9tb25HRjI1Njo6UVJDb2RlRmlsZCk7DQorICBlbmNvZGUuSW5pdCgpOw0KKyAgZW5jb2RlLkVuY29kZSgmdG9FbmNvZGUsIG51bUVjQnl0ZXNJbkJsb2NrLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIENCQ19Db21tb25CeXRlQXJyYXkqIGVjQnl0ZXMgPSBuZXcgQ0JDX0NvbW1vbkJ5dGVBcnJheShudW1FY0J5dGVzSW5CbG9jayk7DQorICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBudW1FY0J5dGVzSW5CbG9jazsgaisrKSB7DQorICAgIGVjQnl0ZXMtPlNldChqLCB0b0VuY29kZVtudW1EYXRhQnl0ZXMgKyBqXSk7DQorICB9DQorICByZXR1cm4gZWNCeXRlczsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFbmNvZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVuY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjAyMmY1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFbmNvZGVyLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUVJDT0RFUkVOQ09ERVJfSF8NCisjZGVmaW5lIF9CQ19RUkNPREVSRU5DT0RFUl9IXw0KK2NsYXNzIE1ha2VfUGFpcjsNCitjbGFzcyBDQkNfUVJDb2RlcjsNCitjbGFzcyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOw0KK2NsYXNzIENCQ19RUkNvZGVyTW9kZTsNCitjbGFzcyBDQkNfUVJDb2RlckJpdFZlY3RvcjsNCitjbGFzcyBDQkNfQ29tbW9uQnl0ZUFycmF5Ow0KK2NsYXNzIENCQ19Db21tb25CeXRlTWF0cml4Ow0KK2NsYXNzIENCQ19RUkNvZGVyRW5jb2RlcjsNCitjbGFzcyBDQkNfUVJDb2RlckVuY29kZXIgew0KKyBwcml2YXRlOg0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgbV9hbHBoYU51bWJlcmljVGFibGVbOTZdOw0KKw0KKyBwdWJsaWM6DQorICBDQkNfUVJDb2RlckVuY29kZXIoKTsNCisgIHZpcnR1YWwgfkNCQ19RUkNvZGVyRW5jb2RlcigpOw0KKw0KKyAgc3RhdGljIHZvaWQgRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsDQorICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXIqIHFyQ29kZSwNCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlLA0KKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmVyc2lvblNwZWNpZnkgPSAwKTsNCisgIHN0YXRpYyB2b2lkIEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY29udGVudCwNCisgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyKiBxckNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCBFbmNvZGVXaXRoU3BlY2lmeVZlcnNpb24oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlciogcXJDb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmVyc2lvblNwZWNpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCBFbmNvZGVXaXRoQXV0b1ZlcnNpb24oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlciogcXJDb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogQ2hvb3NlTW9kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RpbmcpOw0KKyAgc3RhdGljIGludDMyX3QgR2V0QWxwaGFOdW1lcmljQ29kZShpbnQzMl90IGNvZGUpOw0KKyAgc3RhdGljIHZvaWQgQXBwZW5kRUNJKENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzKTsNCisgIHN0YXRpYyB2b2lkIEFwcGVuZEJ5dGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJNb2RlKiBtb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBlbmNvZGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgQXBwZW5kTnVtZXJpY0J5dGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgQXBwZW5kQWxwaGFOdW1lcmljQnl0ZXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgQXBwZW5kOEJpdEJ5dGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGVuY29kaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgQXBwZW5kOEJpdEJ5dGVzKENGWF9CeXRlQXJyYXkmIGJ5dGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgQXBwZW5kS2FuamlCeXRlcyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgQXBwZW5kR0JLQnl0ZXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgSW5pdFFSQ29kZShpbnQzMl90IG51bUlucHV0Qnl0ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmVyc2lvbk51bWJlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJNb2RlKiBtb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlciogcXJDb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIEluaXRRUkNvZGUoaW50MzJfdCBudW1JbnB1dEJ5dGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2Rlck1vZGUqIG1vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyKiBxckNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgQXBwZW5kTW9kZUluZm8oQ0JDX1FSQ29kZXJNb2RlKiBtb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIEFwcGVuZExlbmd0aEluZm8oaW50MzJfdCBudW1MZXR0ZXJzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZlcnNpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyTW9kZSogbW9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKw0KKyAgc3RhdGljIHZvaWQgSW50ZXJsZWF2ZVdpdGhFQ0J5dGVzKENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtVG90YWxCeXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bURhdGFCeXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVJTQmxvY2tzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiByZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCBHZXROdW1EYXRhQnl0ZXNBbmROdW1FQ0J5dGVzRm9yQmxvY2tJRCgNCisgICAgICBpbnQzMl90IG51bVRvdGFsQnl0ZXMsDQorICAgICAgaW50MzJfdCBudW1EYXRhQnl0ZXMsDQorICAgICAgaW50MzJfdCBudW1SU0Jsb2NrcywNCisgICAgICBpbnQzMl90IGJsb2NrSUQsDQorICAgICAgaW50MzJfdCYgbnVtRGF0YUJ5dGVzSW5CbG9jaywNCisgICAgICBpbnQzMl90JiBudW1FQ0J5dGVzSW5CbG9ja3MpOw0KKyAgc3RhdGljIENCQ19Db21tb25CeXRlQXJyYXkqIEdlbmVyYXRlRUNCeXRlcyhDQkNfQ29tbW9uQnl0ZUFycmF5KiBkYXRhQnl0ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRWNCeXRlc0luQmxvY2ssDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIGludDMyX3QgQ2hvb3NlTWFza1BhdHRlcm4oQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2ZXJzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIGludDMyX3QgQ2FsY3VsYXRlTWFza1BlbmFsdHkoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCk7DQorICBzdGF0aWMgdm9pZCBUZXJtaW5hdGVCaXRzKGludDMyX3QgbnVtRGF0YUJ5dGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgaW50MzJfdCBHZXRTcGFuQnlWZXJzaW9uKENCQ19RUkNvZGVyTW9kZSogbW9kZUZpcnN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2Rlck1vZGUqIG1vZGVTZWNvbmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmVyc2lvbk51bSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCBNZXJnZVN0cmluZyhDRlhfUHRyQXJyYXkmIHJlc3VsdCwgaW50MzJfdCB2ZXJzaW9uTnVtLCBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIFNwbGl0U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50LCBDRlhfUHRyQXJyYXkmIHJlc3VsdCk7DQorICBzdGF0aWMgdm9pZCBBcHBlbmREYXRhTW9kZUxlbmdoSW5mbyhDRlhfUHRyQXJyYXkmIHNwbGl0UmVzdWx0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3ImIGhlYWRlckFuZERhdGFCaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJNb2RlKiB0ZW1wTW9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyKiBxckNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgZW5jb2RpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMwYTk5MgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuY3BwCkBAIC0wLDAgKzEsOTEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaCINCitDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpMID0gTlVMTDsNCitDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpNID0gTlVMTDsNCitDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpRID0gTlVMTDsNCitDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpIID0gTlVMTDsNCitDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKA0KKyAgICBpbnQzMl90IG9yZGluYWwsDQorICAgIGludDMyX3QgYml0cywNCisgICAgRlhfQ0hBUiogbmFtZSkgew0KKyAgbV9uYW1lICs9IG5hbWU7DQorICBtX29yZGluYWwgPSBvcmRpbmFsOw0KKyAgbV9iaXRzID0gYml0czsNCit9DQorQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6fkNCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwoKSB7fQ0KK3ZvaWQgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6SW5pdGlhbGl6ZSgpIHsNCisgIEwgPSBuZXcgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCgwLCAweDAxLCAoRlhfQ0hBUiopIkwiKTsNCisgIE0gPSBuZXcgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCgxLCAweDAwLCAoRlhfQ0hBUiopIk0iKTsNCisgIFEgPSBuZXcgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCgyLCAweDAzLCAoRlhfQ0hBUiopIlEiKTsNCisgIEggPSBuZXcgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCgzLCAweDAyLCAoRlhfQ0hBUiopIkgiKTsNCit9DQordm9pZCBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpGaW5hbGl6ZSgpIHsNCisgIGRlbGV0ZSBMOw0KKyAgZGVsZXRlIE07DQorICBkZWxldGUgUTsNCisgIGRlbGV0ZSBIOw0KK30NCitpbnQzMl90IENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6Ok9yZGluYWwoKSB7DQorICByZXR1cm4gbV9vcmRpbmFsOw0KK30NCitpbnQzMl90IENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OkdldEJpdHMoKSB7DQorICByZXR1cm4gbV9iaXRzOw0KK30NCitDRlhfQnl0ZVN0cmluZyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpHZXROYW1lKCkgew0KKyAgcmV0dXJuIG1fbmFtZTsNCit9DQorQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6Rm9yQml0cygNCisgICAgaW50MzJfdCBiaXRzKSB7DQorICBzd2l0Y2ggKGJpdHMpIHsNCisgICAgY2FzZSAweDAwOg0KKyAgICAgIHJldHVybiBNOw0KKyAgICBjYXNlIDB4MDE6DQorICAgICAgcmV0dXJuIEw7DQorICAgIGNhc2UgMHgwMjoNCisgICAgICByZXR1cm4gSDsNCisgICAgY2FzZSAweDAzOg0KKyAgICAgIHJldHVybiBROw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KK30NCit2b2lkIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OkRlc3Ryb3koKSB7DQorICBpZiAoTCkgew0KKyAgICBkZWxldGUgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6TDsNCisgICAgTCA9IE5VTEw7DQorICB9DQorICBpZiAoTSkgew0KKyAgICBkZWxldGUgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6TTsNCisgICAgTSA9IE5VTEw7DQorICB9DQorICBpZiAoSCkgew0KKyAgICBkZWxldGUgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6SDsNCisgICAgSCA9IE5VTEw7DQorICB9DQorICBpZiAoUSkgew0KKyAgICBkZWxldGUgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6UTsNCisgICAgUSA9IE5VTEw7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDgwMTBjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbC5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUVJDT0RFUkVSUk9SQ09SUkVDVElPTkxFVkVMX0hfDQorI2RlZmluZSBfQkNfUVJDT0RFUkVSUk9SQ09SUkVDVElPTkxFVkVMX0hfDQorY2xhc3MgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCB7DQorIHByaXZhdGU6DQorICBpbnQzMl90IG1fb3JkaW5hbDsNCisgIGludDMyX3QgbV9iaXRzOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgbV9uYW1lOw0KKyAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IG9yZGluYWwsIGludDMyX3QgYml0cywgRlhfQ0hBUiogbmFtZSk7DQorICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKCk7DQorDQorIHB1YmxpYzoNCisgIHN0YXRpYyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBMOw0KKyAgc3RhdGljIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIE07DQorICBzdGF0aWMgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogUTsNCisgIHN0YXRpYyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBIOw0KKyAgdmlydHVhbCB+Q0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCgpOw0KKyAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZSgpOw0KKyAgc3RhdGljIHZvaWQgRmluYWxpemUoKTsNCisgIGludDMyX3QgT3JkaW5hbCgpOw0KKyAgaW50MzJfdCBHZXRCaXRzKCk7DQorICBDRlhfQnl0ZVN0cmluZyBHZXROYW1lKCk7DQorICBzdGF0aWMgdm9pZCBEZXN0cm95KCk7DQorICBzdGF0aWMgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogRm9yQml0cyhpbnQzMl90IGJpdHMpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbi5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmZlNTEyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbi5jcHAKQEAgLTAsMCArMSw5NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgIkJDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbC5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24uaCINCitjb25zdCBpbnQzMl90IENCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb246OkZPUk1BVF9JTkZPX01BU0tfUVIgPSAwWDU0MTI7DQorY29uc3QgaW50MzJfdCBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uOjpGT1JNQVRfSU5GT19ERUNPREVfTE9PS1VQWzMyXVsyXSA9IHsNCisgICAgezB4NTQxMiwgMHgwMH0sIHsweDUxMjUsIDB4MDF9LCB7MHg1RTdDLCAweDAyfSwgezB4NUI0QiwgMHgwM30sDQorICAgIHsweDQ1RjksIDB4MDR9LCB7MHg0MENFLCAweDA1fSwgezB4NEY5NywgMHgwNn0sIHsweDRBQTAsIDB4MDd9LA0KKyAgICB7MHg3N0M0LCAweDA4fSwgezB4NzJGMywgMHgwOX0sIHsweDdEQUEsIDB4MEF9LCB7MHg3ODlELCAweDBCfSwNCisgICAgezB4NjYyRiwgMHgwQ30sIHsweDYzMTgsIDB4MER9LCB7MHg2QzQxLCAweDBFfSwgezB4Njk3NiwgMHgwRn0sDQorICAgIHsweDE2ODksIDB4MTB9LCB7MHgxM0JFLCAweDExfSwgezB4MUNFNywgMHgxMn0sIHsweDE5RDAsIDB4MTN9LA0KKyAgICB7MHgwNzYyLCAweDE0fSwgezB4MDI1NSwgMHgxNX0sIHsweDBEMEMsIDB4MTZ9LCB7MHgwODNCLCAweDE3fSwNCisgICAgezB4MzU1RiwgMHgxOH0sIHsweDMwNjgsIDB4MTl9LCB7MHgzRjMxLCAweDFBfSwgezB4M0EwNiwgMHgxQn0sDQorICAgIHsweDI0QjQsIDB4MUN9LCB7MHgyMTgzLCAweDFEfSwgezB4MkVEQSwgMHgxRX0sIHsweDJCRUQsIDB4MUZ9LA0KK307DQorY29uc3QgaW50MzJfdCBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uOjpCSVRTX1NFVF9JTl9IQUxGX0JZVEVbXSA9IHsNCisgICAgMCwgMSwgMSwgMiwgMSwgMiwgMiwgMywgMSwgMiwgMiwgMywgMiwgMywgMywgNH07DQorQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbjo6Q0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbihpbnQzMl90IGZvcm1hdEluZm8pIHsNCisgIG1fZXJyb3JDb3JyZWN0TGV2bCA9DQorICAgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6Rm9yQml0cygoZm9ybWF0SW5mbyA+PiAzKSAmIDB4MDMpOw0KKyAgbV9kYXRhTWFzayA9ICh1aW50OF90KShmb3JtYXRJbmZvICYgMHgwNyk7DQorfQ0KK0NCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb246On5DQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uKCkge30NCitpbnQzMl90IENCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb246Ok51bUJpdHNEaWZmZXJpbmcoaW50MzJfdCBhLCBpbnQzMl90IGIpIHsNCisgIGEgXj0gYjsNCisgIHJldHVybiBCSVRTX1NFVF9JTl9IQUxGX0JZVEVbYSAmIDB4MEZdICsNCisgICAgICAgICBCSVRTX1NFVF9JTl9IQUxGX0JZVEVbKGEgPj4gNCkgJiAweDBGXSArDQorICAgICAgICAgQklUU19TRVRfSU5fSEFMRl9CWVRFWyhhID4+IDgpICYgMHgwRl0gKw0KKyAgICAgICAgIEJJVFNfU0VUX0lOX0hBTEZfQllURVsoYSA+PiAxMikgJiAweDBGXSArDQorICAgICAgICAgQklUU19TRVRfSU5fSEFMRl9CWVRFWyhhID4+IDE2KSAmIDB4MEZdICsNCisgICAgICAgICBCSVRTX1NFVF9JTl9IQUxGX0JZVEVbKGEgPj4gMjApICYgMHgwRl0gKw0KKyAgICAgICAgIEJJVFNfU0VUX0lOX0hBTEZfQllURVsoYSA+PiAyNCkgJiAweDBGXSArDQorICAgICAgICAgQklUU19TRVRfSU5fSEFMRl9CWVRFWyhhID4+IDI4KSAmIDB4MEZdOw0KK30NCit1aW50OF90IENCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb246OkdldERhdGFNYXNrKCkgew0KKyAgcmV0dXJuIG1fZGF0YU1hc2s7DQorfQ0KK0NCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqDQorQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbjo6R2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoKSB7DQorICByZXR1cm4gbV9lcnJvckNvcnJlY3RMZXZsOw0KK30NCitDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uKg0KK0NCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb246OkRlY29kZUZvcm1hdEluZm9ybWF0aW9uKA0KKyAgICBpbnQzMl90IG1hc2tlZEZvcm1hdEluZm8pIHsNCisgIENCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24qIGZvcm1hdEluZm8gPQ0KKyAgICAgIERvRGVjb2RlRm9ybWF0SW5mb3JtYXRpb24obWFza2VkRm9ybWF0SW5mbyk7DQorICBpZiAoZm9ybWF0SW5mbyAhPSBOVUxMKSB7DQorICAgIHJldHVybiBmb3JtYXRJbmZvOw0KKyAgfQ0KKyAgcmV0dXJuIERvRGVjb2RlRm9ybWF0SW5mb3JtYXRpb24obWFza2VkRm9ybWF0SW5mbyBeIEZPUk1BVF9JTkZPX01BU0tfUVIpOw0KK30NCitDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uKg0KK0NCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb246OkRvRGVjb2RlRm9ybWF0SW5mb3JtYXRpb24oDQorICAgIGludDMyX3QgbWFza2VkRm9ybWF0SW5mbykgew0KKyAgaW50MzJfdCBiZXN0RGlmZmVyZW5jZSA9IChpbnQzMl90KUZYU1lTX25hbigpOw0KKyAgaW50MzJfdCBiZXN0Rm9ybWF0SW5mbyA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAzMjsgaSsrKSB7DQorICAgIGludDMyX3QgY29uc3QqIGRlY29kZUluZm8gPSAmRk9STUFUX0lORk9fREVDT0RFX0xPT0tVUFtpXVswXTsNCisgICAgaW50MzJfdCB0YXJnZXRJbmZvID0gZGVjb2RlSW5mb1swXTsNCisgICAgaWYgKHRhcmdldEluZm8gPT0gbWFza2VkRm9ybWF0SW5mbykgew0KKyAgICAgIHJldHVybiBuZXcgQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbihkZWNvZGVJbmZvWzFdKTsNCisgICAgfQ0KKyAgICBpbnQzMl90IGJpdHNEaWZmZXJlbmNlID0gTnVtQml0c0RpZmZlcmluZyhtYXNrZWRGb3JtYXRJbmZvLCB0YXJnZXRJbmZvKTsNCisgICAgaWYgKGJpdHNEaWZmZXJlbmNlIDwgYmVzdERpZmZlcmVuY2UpIHsNCisgICAgICBiZXN0Rm9ybWF0SW5mbyA9IGRlY29kZUluZm9bMV07DQorICAgICAgYmVzdERpZmZlcmVuY2UgPSBiaXRzRGlmZmVyZW5jZTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGJlc3REaWZmZXJlbmNlIDw9IDMpIHsNCisgICAgcmV0dXJuIG5ldyBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uKGJlc3RGb3JtYXRJbmZvKTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q1ZmQyYwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24uaApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1FSQ09ERVJGT1JNQVRJTkZPUk1BVElPTl9IXw0KKyNkZWZpbmUgX0JDX1FSQ09ERVJGT1JNQVRJTkZPUk1BVElPTl9IXw0KK2NsYXNzIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw7DQorY2xhc3MgQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbiB7DQorIHByaXZhdGU6DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBGT1JNQVRfSU5GT19NQVNLX1FSOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgRk9STUFUX0lORk9fREVDT0RFX0xPT0tVUFszMl1bMl07DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBCSVRTX1NFVF9JTl9IQUxGX0JZVEVbMTZdOw0KKyAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogbV9lcnJvckNvcnJlY3RMZXZsOw0KKyAgdWludDhfdCBtX2RhdGFNYXNrOw0KKw0KKyBwdWJsaWM6DQorICBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uKGludDMyX3QgZm9ybWF0SW5mbyk7DQorICB2aXJ0dWFsIH5DQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uKCk7DQorICB1aW50OF90IEdldERhdGFNYXNrKCk7DQorICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBHZXRFcnJvckNvcnJlY3Rpb25MZXZlbCgpOw0KKw0KKyAgc3RhdGljIGludDMyX3QgTnVtQml0c0RpZmZlcmluZyhpbnQzMl90IGEsIGludDMyX3QgYik7DQorICBzdGF0aWMgQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbiogRGVjb2RlRm9ybWF0SW5mb3JtYXRpb24oDQorICAgICAgaW50MzJfdCBtYXNrZWRGb3JtYXRJbmZvKTsNCisgIHN0YXRpYyBDQkNfUVJDb2RlckZvcm1hdEluZm9ybWF0aW9uKiBEb0RlY29kZUZvcm1hdEluZm9ybWF0aW9uKA0KKyAgICAgIGludDMyX3QgbWFza2VkRm9ybWF0SW5mbyk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hc2tVdGlsLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWFza1V0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMWI3NGIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hc2tVdGlsLmNwcApAQCAtMCwwICsxLDE5NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwOCBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CeXRlTWF0cml4LmgiDQorI2luY2x1ZGUgIkJDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbC5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVyLmgiDQorI2luY2x1ZGUgIkJDX1FSQ29kZXJNYXNrVXRpbC5oIg0KK0NCQ19RUkNvZGVyTWFza1V0aWw6OkNCQ19RUkNvZGVyTWFza1V0aWwoKSB7fQ0KK0NCQ19RUkNvZGVyTWFza1V0aWw6On5DQkNfUVJDb2Rlck1hc2tVdGlsKCkge30NCitpbnQzMl90IENCQ19RUkNvZGVyTWFza1V0aWw6OkFwcGx5TWFza1BlbmFsdHlSdWxlMSgNCisgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCkgew0KKyAgcmV0dXJuIEFwcGx5TWFza1BlbmFsdHlSdWxlMUludGVybmFsKG1hdHJpeCwgVFJVRSkgKw0KKyAgICAgICAgIEFwcGx5TWFza1BlbmFsdHlSdWxlMUludGVybmFsKG1hdHJpeCwgRkFMU0UpOw0KK30NCitpbnQzMl90IENCQ19RUkNvZGVyTWFza1V0aWw6OkFwcGx5TWFza1BlbmFsdHlSdWxlMigNCisgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCkgew0KKyAgaW50MzJfdCBwZW5hbHR5ID0gMDsNCisgIHVpbnQ4X3QqIGFycmF5ID0gbWF0cml4LT5HZXRBcnJheSgpOw0KKyAgaW50MzJfdCB3aWR0aCA9IG1hdHJpeC0+R2V0V2lkdGgoKTsNCisgIGludDMyX3QgaGVpZ2h0ID0gbWF0cml4LT5HZXRIZWlnaHQoKTsNCisgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IGhlaWdodCAtIDE7IHkrKykgew0KKyAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCB3aWR0aCAtIDE7IHgrKykgew0KKyAgICAgIGludDMyX3QgdmFsdWUgPSBhcnJheVt5ICogd2lkdGggKyB4XTsNCisgICAgICBpZiAodmFsdWUgPT0gYXJyYXlbeSAqIHdpZHRoICsgeCArIDFdICYmDQorICAgICAgICAgIHZhbHVlID09IGFycmF5Wyh5ICsgMSkgKiB3aWR0aCArIHhdICYmDQorICAgICAgICAgIHZhbHVlID09IGFycmF5Wyh5ICsgMSkgKiB3aWR0aCArIHggKyAxXSkgew0KKyAgICAgICAgcGVuYWx0eSsrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIDMgKiBwZW5hbHR5Ow0KK30NCitpbnQzMl90IENCQ19RUkNvZGVyTWFza1V0aWw6OkFwcGx5TWFza1BlbmFsdHlSdWxlMygNCisgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCkgew0KKyAgaW50MzJfdCBwZW5hbHR5ID0gMDsNCisgIHVpbnQ4X3QqIGFycmF5ID0gbWF0cml4LT5HZXRBcnJheSgpOw0KKyAgaW50MzJfdCB3aWR0aCA9IG1hdHJpeC0+R2V0V2lkdGgoKTsNCisgIGludDMyX3QgaGVpZ2h0ID0gbWF0cml4LT5HZXRIZWlnaHQoKTsNCisgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7DQorICAgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsNCisgICAgICBpZiAoeCA9PSAwICYmDQorICAgICAgICAgICgoeSA+PSAwICYmIHkgPD0gNikgfHwgKHkgPj0gaGVpZ2h0IC0gNyAmJiB5IDw9IGhlaWdodCAtIDEpKSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmICh4ID09IHdpZHRoIC0gNyAmJiAoeSA+PSAwICYmIHkgPD0gNikpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBpZiAoeSA9PSAwICYmDQorICAgICAgICAgICgoeCA+PSAwICYmIHggPD0gNikgfHwgKHggPj0gd2lkdGggLSA3ICYmIHggPD0gd2lkdGggLSAxKSkpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBpZiAoeSA9PSBoZWlnaHQgLSA3ICYmICh4ID49IDAgJiYgeCA8PSA2KSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmICh4ICsgNiA8IHdpZHRoICYmIGFycmF5W3kgKiB3aWR0aCArIHhdID09IDEgJiYNCisgICAgICAgICAgYXJyYXlbeSAqIHdpZHRoICsgeCArIDFdID09IDAgJiYgYXJyYXlbeSAqIHdpZHRoICsgeCArIDJdID09IDEgJiYNCisgICAgICAgICAgYXJyYXlbeSAqIHdpZHRoICsgeCArIDNdID09IDEgJiYgYXJyYXlbeSAqIHdpZHRoICsgeCArIDRdID09IDEgJiYNCisgICAgICAgICAgYXJyYXlbeSAqIHdpZHRoICsgeCArIDVdID09IDAgJiYgYXJyYXlbeSAqIHdpZHRoICsgeCArIDZdID09IDEgJiYNCisgICAgICAgICAgKCh4ICsgMTAgPCB3aWR0aCAmJiBhcnJheVt5ICogd2lkdGggKyB4ICsgN10gPT0gMCAmJg0KKyAgICAgICAgICAgIGFycmF5W3kgKiB3aWR0aCArIHggKyA4XSA9PSAwICYmIGFycmF5W3kgKiB3aWR0aCArIHggKyA5XSA9PSAwICYmDQorICAgICAgICAgICAgYXJyYXlbeSAqIHdpZHRoICsgeCArIDEwXSA9PSAwKSB8fA0KKyAgICAgICAgICAgKHggLSA0ID49IDAgJiYgYXJyYXlbeSAqIHdpZHRoICsgeCAtIDFdID09IDAgJiYNCisgICAgICAgICAgICBhcnJheVt5ICogd2lkdGggKyB4IC0gMl0gPT0gMCAmJiBhcnJheVt5ICogd2lkdGggKyB4IC0gM10gPT0gMCAmJg0KKyAgICAgICAgICAgIGFycmF5W3kgKiB3aWR0aCArIHggLSA0XSA9PSAwKSkpIHsNCisgICAgICAgIHBlbmFsdHkgKz0gNDA7DQorICAgICAgfQ0KKyAgICAgIGlmICh5ICsgNiA8IGhlaWdodCAmJiBhcnJheVt5ICogd2lkdGggKyB4XSA9PSAxICYmDQorICAgICAgICAgIGFycmF5Wyh5ICsgMSkgKiB3aWR0aCArIHhdID09IDAgJiYgYXJyYXlbKHkgKyAyKSAqIHdpZHRoICsgeF0gPT0gMSAmJg0KKyAgICAgICAgICBhcnJheVsoeSArIDMpICogd2lkdGggKyB4XSA9PSAxICYmIGFycmF5Wyh5ICsgNCkgKiB3aWR0aCArIHhdID09IDEgJiYNCisgICAgICAgICAgYXJyYXlbKHkgKyA1KSAqIHdpZHRoICsgeF0gPT0gMCAmJiBhcnJheVsoeSArIDYpICogd2lkdGggKyB4XSA9PSAxICYmDQorICAgICAgICAgICgoeSArIDEwIDwgaGVpZ2h0ICYmIGFycmF5Wyh5ICsgNykgKiB3aWR0aCArIHhdID09IDAgJiYNCisgICAgICAgICAgICBhcnJheVsoeSArIDgpICogd2lkdGggKyB4XSA9PSAwICYmDQorICAgICAgICAgICAgYXJyYXlbKHkgKyA5KSAqIHdpZHRoICsgeF0gPT0gMCAmJg0KKyAgICAgICAgICAgIGFycmF5Wyh5ICsgMTApICogd2lkdGggKyB4XSA9PSAwKSB8fA0KKyAgICAgICAgICAgKHkgLSA0ID49IDAgJiYgYXJyYXlbKHkgLSAxKSAqIHdpZHRoICsgeF0gPT0gMCAmJg0KKyAgICAgICAgICAgIGFycmF5Wyh5IC0gMikgKiB3aWR0aCArIHhdID09IDAgJiYNCisgICAgICAgICAgICBhcnJheVsoeSAtIDMpICogd2lkdGggKyB4XSA9PSAwICYmDQorICAgICAgICAgICAgYXJyYXlbKHkgLSA0KSAqIHdpZHRoICsgeF0gPT0gMCkpKSB7DQorICAgICAgICBwZW5hbHR5ICs9IDQwOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHBlbmFsdHk7DQorfQ0KK2ludDMyX3QgQ0JDX1FSQ29kZXJNYXNrVXRpbDo6QXBwbHlNYXNrUGVuYWx0eVJ1bGU0KA0KKyAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4KSB7DQorICBpbnQzMl90IG51bURhcmtDZWxscyA9IDA7DQorICB1aW50OF90KiBhcnJheSA9IG1hdHJpeC0+R2V0QXJyYXkoKTsNCisgIGludDMyX3Qgd2lkdGggPSBtYXRyaXgtPkdldFdpZHRoKCk7DQorICBpbnQzMl90IGhlaWdodCA9IG1hdHJpeC0+R2V0SGVpZ2h0KCk7DQorICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgew0KKyAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7DQorICAgICAgaWYgKGFycmF5W3kgKiB3aWR0aCArIHhdID09IDEpIHsNCisgICAgICAgIG51bURhcmtDZWxscyArPSAxOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBudW1Ub3RhbENlbGxzID0gbWF0cml4LT5HZXRIZWlnaHQoKSAqIG1hdHJpeC0+R2V0V2lkdGgoKTsNCisgIGRvdWJsZSBkYXJrUmF0aW8gPSAoZG91YmxlKW51bURhcmtDZWxscyAvIG51bVRvdGFsQ2VsbHM7DQorICByZXR1cm4gYWJzKChpbnQzMl90KShkYXJrUmF0aW8gKiAxMDAgLSA1MCkgLyA1KSAqIDUgKiAxMDsNCit9DQorRlhfQk9PTCBDQkNfUVJDb2Rlck1hc2tVdGlsOjpHZXREYXRhTWFza0JpdChpbnQzMl90IG1hc2tQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKCFDQkNfUVJDb2Rlcjo6SXNWYWxpZE1hc2tQYXR0ZXJuKG1hc2tQYXR0ZXJuKSkgew0KKyAgICBlID0gKEJDRXhjZXB0aW9uSW52YWxpZGF0ZU1hc2tQYXR0ZXJuKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIEZBTFNFKTsNCisgIH0NCisgIGludDMyX3QgaW50ZXJtZWRpYXRlID0gMCwgdGVtcCA9IDA7DQorICBzd2l0Y2ggKG1hc2tQYXR0ZXJuKSB7DQorICAgIGNhc2UgMDoNCisgICAgICBpbnRlcm1lZGlhdGUgPSAoeSArIHgpICYgMHgxOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDE6DQorICAgICAgaW50ZXJtZWRpYXRlID0geSAmIDB4MTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAyOg0KKyAgICAgIGludGVybWVkaWF0ZSA9IHggJSAzOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDM6DQorICAgICAgaW50ZXJtZWRpYXRlID0gKHkgKyB4KSAlIDM7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgNDoNCisgICAgICBpbnRlcm1lZGlhdGUgPSAoKHkgPj4gMSkgKyAoeCAvIDMpKSAmIDB4MTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSA1Og0KKyAgICAgIHRlbXAgPSB5ICogeDsNCisgICAgICBpbnRlcm1lZGlhdGUgPSAodGVtcCAmIDB4MSkgKyAodGVtcCAlIDMpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDY6DQorICAgICAgdGVtcCA9IHkgKiB4Ow0KKyAgICAgIGludGVybWVkaWF0ZSA9ICgoKHRlbXAgJiAweDEpICsgKHRlbXAgJSAzKSkgJiAweDEpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDc6DQorICAgICAgdGVtcCA9IHkgKiB4Ow0KKyAgICAgIGludGVybWVkaWF0ZSA9ICgoKHRlbXAgJSAzKSArICgoeSArIHgpICYgMHgxKSkgJiAweDEpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0OiB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZGF0ZU1hc2tQYXR0ZXJuOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBGQUxTRSk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBpbnRlcm1lZGlhdGUgPT0gMDsNCit9DQoraW50MzJfdCBDQkNfUVJDb2Rlck1hc2tVdGlsOjpBcHBseU1hc2tQZW5hbHR5UnVsZTFJbnRlcm5hbCgNCisgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwNCisgICAgRlhfQk9PTCBpc0hvcml6b250YWwpIHsNCisgIGludDMyX3QgcGVuYWx0eSA9IDA7DQorICBpbnQzMl90IG51bVNhbWVCaXRDZWxscyA9IDA7DQorICBpbnQzMl90IHByZXZCaXQgPSAtMTsNCisgIGludDMyX3Qgd2lkdGggPSBtYXRyaXgtPkdldFdpZHRoKCk7DQorICBpbnQzMl90IGhlaWdodCA9IG1hdHJpeC0+R2V0SGVpZ2h0KCk7DQorICBpbnQzMl90IGlMaW1pdCA9IGlzSG9yaXpvbnRhbCA/IGhlaWdodCA6IHdpZHRoOw0KKyAgaW50MzJfdCBqTGltaXQgPSBpc0hvcml6b250YWwgPyB3aWR0aCA6IGhlaWdodDsNCisgIHVpbnQ4X3QqIGFycmF5ID0gbWF0cml4LT5HZXRBcnJheSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUxpbWl0OyArK2kpIHsNCisgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgakxpbWl0OyArK2opIHsNCisgICAgICBpbnQzMl90IGJpdCA9IGlzSG9yaXpvbnRhbCA/IGFycmF5W2kgKiB3aWR0aCArIGpdIDogYXJyYXlbaiAqIHdpZHRoICsgaV07DQorICAgICAgaWYgKGJpdCA9PSBwcmV2Qml0KSB7DQorICAgICAgICBudW1TYW1lQml0Q2VsbHMgKz0gMTsNCisgICAgICAgIGlmIChudW1TYW1lQml0Q2VsbHMgPT0gNSkgew0KKyAgICAgICAgICBwZW5hbHR5ICs9IDM7DQorICAgICAgICB9IGVsc2UgaWYgKG51bVNhbWVCaXRDZWxscyA+IDUpIHsNCisgICAgICAgICAgcGVuYWx0eSArPSAxOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBudW1TYW1lQml0Q2VsbHMgPSAxOw0KKyAgICAgICAgcHJldkJpdCA9IGJpdDsNCisgICAgICB9DQorICAgIH0NCisgICAgbnVtU2FtZUJpdENlbGxzID0gMDsNCisgIH0NCisgIHJldHVybiBwZW5hbHR5Ow0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hc2tVdGlsLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hc2tVdGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZiMjk4ZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWFza1V0aWwuaApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1FSQ09ERVJNQVNLVVRJTF9IXw0KKyNkZWZpbmUgX0JDX1FSQ09ERVJNQVNLVVRJTF9IXw0KK2NsYXNzIENCQ19Db21tb25CeXRlTWF0cml4Ow0KK2NsYXNzIENCQ19RUkNvZGVyTWFza1V0aWwgew0KKyBwdWJsaWM6DQorICBDQkNfUVJDb2Rlck1hc2tVdGlsKCk7DQorICB2aXJ0dWFsIH5DQkNfUVJDb2Rlck1hc2tVdGlsKCk7DQorICBzdGF0aWMgRlhfQk9PTCBHZXREYXRhTWFza0JpdChpbnQzMl90IG1hc2tQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorDQorICBzdGF0aWMgaW50MzJfdCBBcHBseU1hc2tQZW5hbHR5UnVsZTEoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCk7DQorICBzdGF0aWMgaW50MzJfdCBBcHBseU1hc2tQZW5hbHR5UnVsZTIoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCk7DQorICBzdGF0aWMgaW50MzJfdCBBcHBseU1hc2tQZW5hbHR5UnVsZTMoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCk7DQorICBzdGF0aWMgaW50MzJfdCBBcHBseU1hc2tQZW5hbHR5UnVsZTQoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCk7DQorICBzdGF0aWMgaW50MzJfdCBBcHBseU1hc2tQZW5hbHR5UnVsZTFJbnRlcm5hbChDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0hvcml6b250YWwpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNYXRyaXhVdGlsLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWF0cml4VXRpbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM2NjcxNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWF0cml4VXRpbC5jcHAKQEAgLTAsMCArMSw0NzUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDggWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZU1hdHJpeC5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaCINCisjaW5jbHVkZSAiQkNfUVJDb2Rlci5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVyTWFza1V0aWwuaCINCisjaW5jbHVkZSAiQkNfUVJDb2Rlck1hdHJpeFV0aWwuaCINCisjaW5jbHVkZSAiQkNfUVJDb2RlckJpdFZlY3Rvci5oIg0KK2NvbnN0IGludDMyX3QgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpQT1NJVElPTl9ERVRFQ1RJT05fUEFUVEVSTls3XVs3XSA9IHsNCisgICAgezEsIDEsIDEsIDEsIDEsIDEsIDF9LA0KKyAgICB7MSwgMCwgMCwgMCwgMCwgMCwgMX0sDQorICAgIHsxLCAwLCAxLCAxLCAxLCAwLCAxfSwNCisgICAgezEsIDAsIDEsIDEsIDEsIDAsIDF9LA0KKyAgICB7MSwgMCwgMSwgMSwgMSwgMCwgMX0sDQorICAgIHsxLCAwLCAwLCAwLCAwLCAwLCAxfSwNCisgICAgezEsIDEsIDEsIDEsIDEsIDEsIDF9fTsNCitjb25zdCBpbnQzMl90IENCQ19RUkNvZGVyTWF0cml4VXRpbDo6SE9SSVpPTlRBTF9TRVBBUkFUSU9OX1BBVFRFUk5bMV1bOF0gPSB7DQorICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwfX07DQorY29uc3QgaW50MzJfdCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OlZFUlRJQ0FMX1NFUEFSQVRJT05fUEFUVEVSTls3XVsxXSA9DQorICAgIHt7MH0sIHswfSwgezB9LCB7MH0sIHswfSwgezB9LCB7MH19Ow0KK2NvbnN0IGludDMyX3QgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpQT1NJVElPTl9BREpVU1RNRU5UX1BBVFRFUk5bNV1bNV0gPSB7DQorICAgIHsxLCAxLCAxLCAxLCAxfSwNCisgICAgezEsIDAsIDAsIDAsIDF9LA0KKyAgICB7MSwgMCwgMSwgMCwgMX0sDQorICAgIHsxLCAwLCAwLCAwLCAxfSwNCisgICAgezEsIDEsIDEsIDEsIDF9fTsNCitjb25zdCBpbnQzMl90DQorICAgIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6UE9TSVRJT05fQURKVVNUTUVOVF9QQVRURVJOX0NPT1JESU5BVEVfVEFCTEVbNDBdWzddID0NCisgICAgICAgIHsNCisgICAgICAgICAgICB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCAgIHs2LCAxOCwgLTEsIC0xLCAtMSwgLTEsIC0xfSwNCisgICAgICAgICAgICB7NiwgMjIsIC0xLCAtMSwgLTEsIC0xLCAtMX0sICAgIHs2LCAyNiwgLTEsIC0xLCAtMSwgLTEsIC0xfSwNCisgICAgICAgICAgICB7NiwgMzAsIC0xLCAtMSwgLTEsIC0xLCAtMX0sICAgIHs2LCAzNCwgLTEsIC0xLCAtMSwgLTEsIC0xfSwNCisgICAgICAgICAgICB7NiwgMjIsIDM4LCAtMSwgLTEsIC0xLCAtMX0sICAgIHs2LCAyNCwgNDIsIC0xLCAtMSwgLTEsIC0xfSwNCisgICAgICAgICAgICB7NiwgMjYsIDQ2LCAtMSwgLTEsIC0xLCAtMX0sICAgIHs2LCAyOCwgNTAsIC0xLCAtMSwgLTEsIC0xfSwNCisgICAgICAgICAgICB7NiwgMzAsIDU0LCAtMSwgLTEsIC0xLCAtMX0sICAgIHs2LCAzMiwgNTgsIC0xLCAtMSwgLTEsIC0xfSwNCisgICAgICAgICAgICB7NiwgMzQsIDYyLCAtMSwgLTEsIC0xLCAtMX0sICAgIHs2LCAyNiwgNDYsIDY2LCAtMSwgLTEsIC0xfSwNCisgICAgICAgICAgICB7NiwgMjYsIDQ4LCA3MCwgLTEsIC0xLCAtMX0sICAgIHs2LCAyNiwgNTAsIDc0LCAtMSwgLTEsIC0xfSwNCisgICAgICAgICAgICB7NiwgMzAsIDU0LCA3OCwgLTEsIC0xLCAtMX0sICAgIHs2LCAzMCwgNTYsIDgyLCAtMSwgLTEsIC0xfSwNCisgICAgICAgICAgICB7NiwgMzAsIDU4LCA4NiwgLTEsIC0xLCAtMX0sICAgIHs2LCAzNCwgNjIsIDkwLCAtMSwgLTEsIC0xfSwNCisgICAgICAgICAgICB7NiwgMjgsIDUwLCA3MiwgOTQsIC0xLCAtMX0sICAgIHs2LCAyNiwgNTAsIDc0LCA5OCwgLTEsIC0xfSwNCisgICAgICAgICAgICB7NiwgMzAsIDU0LCA3OCwgMTAyLCAtMSwgLTF9LCAgIHs2LCAyOCwgNTQsIDgwLCAxMDYsIC0xLCAtMX0sDQorICAgICAgICAgICAgezYsIDMyLCA1OCwgODQsIDExMCwgLTEsIC0xfSwgICB7NiwgMzAsIDU4LCA4NiwgMTE0LCAtMSwgLTF9LA0KKyAgICAgICAgICAgIHs2LCAzNCwgNjIsIDkwLCAxMTgsIC0xLCAtMX0sICAgezYsIDI2LCA1MCwgNzQsIDk4LCAxMjIsIC0xfSwNCisgICAgICAgICAgICB7NiwgMzAsIDU0LCA3OCwgMTAyLCAxMjYsIC0xfSwgIHs2LCAyNiwgNTIsIDc4LCAxMDQsIDEzMCwgLTF9LA0KKyAgICAgICAgICAgIHs2LCAzMCwgNTYsIDgyLCAxMDgsIDEzNCwgLTF9LCAgezYsIDM0LCA2MCwgODYsIDExMiwgMTM4LCAtMX0sDQorICAgICAgICAgICAgezYsIDMwLCA1OCwgODYsIDExNCwgMTQyLCAtMX0sICB7NiwgMzQsIDYyLCA5MCwgMTE4LCAxNDYsIC0xfSwNCisgICAgICAgICAgICB7NiwgMzAsIDU0LCA3OCwgMTAyLCAxMjYsIDE1MH0sIHs2LCAyNCwgNTAsIDc2LCAxMDIsIDEyOCwgMTU0fSwNCisgICAgICAgICAgICB7NiwgMjgsIDU0LCA4MCwgMTA2LCAxMzIsIDE1OH0sIHs2LCAzMiwgNTgsIDg0LCAxMTAsIDEzNiwgMTYyfSwNCisgICAgICAgICAgICB7NiwgMjYsIDU0LCA4MiwgMTEwLCAxMzgsIDE2Nn0sIHs2LCAzMCwgNTgsIDg2LCAxMTQsIDE0MiwgMTcwfSwNCit9Ow0KK2NvbnN0IGludDMyX3QgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpUWVBFX0lORk9fQ09PUkRJTkFURVNbMTVdWzJdID0gew0KKyAgICB7OCwgMH0sIHs4LCAxfSwgezgsIDJ9LCB7OCwgM30sIHs4LCA0fSwgezgsIDV9LCB7OCwgN30sIHs4LCA4fSwNCisgICAgezcsIDh9LCB7NSwgOH0sIHs0LCA4fSwgezMsIDh9LCB7MiwgOH0sIHsxLCA4fSwgezAsIDh9LA0KK307DQorY29uc3QgaW50MzJfdCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OlZFUlNJT05fSU5GT19QT0xZID0gMHgxZjI1Ow0KK2NvbnN0IGludDMyX3QgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpUWVBFX0lORk9fUE9MWSA9IDB4MDUzNzsNCitjb25zdCBpbnQzMl90IENCQ19RUkNvZGVyTWF0cml4VXRpbDo6VFlQRV9JTkZPX01BU0tfUEFUVEVSTiA9IDB4NTQxMjsNCit2b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6Q2xlYXJNYXRyaXgoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKG1hdHJpeCA9PSBOVUxMKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCisgIG1hdHJpeC0+Y2xlYXIoKHVpbnQ4X3QpLTEpOw0KK30NCit2b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6QnVpbGRNYXRyaXgoDQorICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBkYXRhQml0cywNCisgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCisgICAgaW50MzJfdCB2ZXJzaW9uLA0KKyAgICBpbnQzMl90IG1hc2tQYXR0ZXJuLA0KKyAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAobWF0cml4ID09IE5VTEwpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KKyAgQ2xlYXJNYXRyaXgobWF0cml4LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgRW1iZWRCYXNpY1BhdHRlcm5zKHZlcnNpb24sIG1hdHJpeCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIEVtYmVkVHlwZUluZm8oZWNMZXZlbCwgbWFza1BhdHRlcm4sIG1hdHJpeCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIE1heWJlRW1iZWRWZXJzaW9uSW5mbyh2ZXJzaW9uLCBtYXRyaXgsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBFbWJlZERhdGFCaXRzKGRhdGFCaXRzLCBtYXNrUGF0dGVybiwgbWF0cml4LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KK30NCit2b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6RW1iZWRCYXNpY1BhdHRlcm5zKGludDMyX3QgdmVyc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAobWF0cml4ID09IE5VTEwpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KKyAgRW1iZWRQb3NpdGlvbkRldGVjdGlvblBhdHRlcm5zQW5kU2VwYXJhdG9ycyhtYXRyaXgsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBFbWJlZERhcmtEb3RBdExlZnRCb3R0b21Db3JuZXIobWF0cml4LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgTWF5YmVFbWJlZFBvc2l0aW9uQWRqdXN0bWVudFBhdHRlcm5zKHZlcnNpb24sIG1hdHJpeCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIEVtYmVkVGltaW5nUGF0dGVybnMobWF0cml4LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KK30NCit2b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6RW1iZWRUeXBlSW5mbygNCisgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCisgICAgaW50MzJfdCBtYXNrUGF0dGVybiwNCisgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKG1hdHJpeCA9PSBOVUxMKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCisgIENCQ19RUkNvZGVyQml0VmVjdG9yIHR5cGVJbmZvQml0czsNCisgIHR5cGVJbmZvQml0cy5Jbml0KCk7DQorICBNYWtlVHlwZUluZm9CaXRzKGVjTGV2ZWwsIG1hc2tQYXR0ZXJuLCAmdHlwZUluZm9CaXRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgdHlwZUluZm9CaXRzLlNpemUoKTsgaSsrKSB7DQorICAgIGludDMyX3QgYml0ID0gdHlwZUluZm9CaXRzLkF0KHR5cGVJbmZvQml0cy5TaXplKCkgLSAxIC0gaSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBpbnQzMl90IHgxID0gVFlQRV9JTkZPX0NPT1JESU5BVEVTW2ldWzBdOw0KKyAgICBpbnQzMl90IHkxID0gVFlQRV9JTkZPX0NPT1JESU5BVEVTW2ldWzFdOw0KKyAgICBtYXRyaXgtPlNldCh4MSwgeTEsIGJpdCk7DQorICAgIGlmIChpIDwgOCkgew0KKyAgICAgIGludDMyX3QgeDIgPSBtYXRyaXgtPkdldFdpZHRoKCkgLSBpIC0gMTsNCisgICAgICBpbnQzMl90IHkyID0gODsNCisgICAgICBtYXRyaXgtPlNldCh4MiwgeTIsIGJpdCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgaW50MzJfdCB4MiA9IDg7DQorICAgICAgaW50MzJfdCB5MiA9IG1hdHJpeC0+R2V0SGVpZ2h0KCkgLSA3ICsgKGkgLSA4KTsNCisgICAgICBtYXRyaXgtPlNldCh4MiwgeTIsIGJpdCk7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6Ok1heWJlRW1iZWRWZXJzaW9uSW5mbyhpbnQzMl90IHZlcnNpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKG1hdHJpeCA9PSBOVUxMKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCisgIGlmICh2ZXJzaW9uIDwgNykgew0KKyAgICByZXR1cm47DQorICB9DQorICBDQkNfUVJDb2RlckJpdFZlY3RvciB2ZXJzaW9uSW5mb0JpdHM7DQorICB2ZXJzaW9uSW5mb0JpdHMuSW5pdCgpOw0KKyAgTWFrZVZlcnNpb25JbmZvQml0cyh2ZXJzaW9uLCAmdmVyc2lvbkluZm9CaXRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgaW50MzJfdCBiaXRJbmRleCA9IDYgKiAzIC0gMTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDY7IGkrKykgew0KKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCAzOyBqKyspIHsNCisgICAgICBpbnQzMl90IGJpdCA9IHZlcnNpb25JbmZvQml0cy5BdChiaXRJbmRleCwgZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgYml0SW5kZXgtLTsNCisgICAgICBtYXRyaXgtPlNldChpLCBtYXRyaXgtPkdldEhlaWdodCgpIC0gMTEgKyBqLCBiaXQpOw0KKyAgICAgIG1hdHJpeC0+U2V0KG1hdHJpeC0+R2V0SGVpZ2h0KCkgLSAxMSArIGosIGksIGJpdCk7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkVtYmVkRGF0YUJpdHMoQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGRhdGFCaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWFza1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpZiAobWF0cml4ID09IE5VTEwgfHwgZGF0YUJpdHMgPT0gTlVMTCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBpbnQzMl90IGJpdEluZGV4ID0gMDsNCisgIGludDMyX3QgZGlyZWN0aW9uID0gLTE7DQorICBpbnQzMl90IHggPSBtYXRyaXgtPkdldFdpZHRoKCkgLSAxOw0KKyAgaW50MzJfdCB5ID0gbWF0cml4LT5HZXRIZWlnaHQoKSAtIDE7DQorICB3aGlsZSAoeCA+IDApIHsNCisgICAgaWYgKHggPT0gNikgew0KKyAgICAgIHggLT0gMTsNCisgICAgfQ0KKyAgICB3aGlsZSAoeSA+PSAwICYmIHkgPCBtYXRyaXgtPkdldEhlaWdodCgpKSB7DQorICAgICAgaWYgKHkgPT0gNikgew0KKyAgICAgICAgeSArPSBkaXJlY3Rpb247DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMjsgaSsrKSB7DQorICAgICAgICBpbnQzMl90IHh4ID0geCAtIGk7DQorICAgICAgICBpZiAoIUlzRW1wdHkobWF0cml4LT5HZXQoeHgsIHkpKSkgew0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGludDMyX3QgYml0Ow0KKyAgICAgICAgaWYgKGJpdEluZGV4IDwgZGF0YUJpdHMtPlNpemUoKSkgew0KKyAgICAgICAgICBiaXQgPSBkYXRhQml0cy0+QXQoYml0SW5kZXgsIGUpOw0KKyAgICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICAgICAgYml0SW5kZXgrKzsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJpdCA9IDA7DQorICAgICAgICB9DQorICAgICAgICBpZiAobWFza1BhdHRlcm4gIT0gLTEpIHsNCisgICAgICAgICAgRlhfQk9PTCBib2wgPQ0KKyAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJNYXNrVXRpbDo6R2V0RGF0YU1hc2tCaXQobWFza1BhdHRlcm4sIHh4LCB5LCBlKTsNCisgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgICAgIGlmIChib2wpIHsNCisgICAgICAgICAgICBiaXQgXj0gMHgwMTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgbWF0cml4LT5TZXQoeHgsIHksIGJpdCk7DQorICAgICAgfQ0KKyAgICAgIHkgKz0gZGlyZWN0aW9uOw0KKyAgICB9DQorICAgIGRpcmVjdGlvbiA9IC1kaXJlY3Rpb247DQorICAgIHkgKz0gZGlyZWN0aW9uOw0KKyAgICB4IC09IDI7DQorICB9DQorICBpZiAoYml0SW5kZXggIT0gZGF0YUJpdHMtPlNpemUoKSkgew0KKyAgICByZXR1cm47DQorICB9DQorfQ0KK2ludDMyX3QgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpDYWxjdWxhdGVCQ0hDb2RlKGludDMyX3QgdmFsdWUsIGludDMyX3QgcG9seSkgew0KKyAgaW50MzJfdCBtc2JTZXRJblBvbHkgPSBGaW5kTVNCU2V0KHBvbHkpOw0KKyAgdmFsdWUgPDw9IG1zYlNldEluUG9seSAtIDE7DQorICB3aGlsZSAoRmluZE1TQlNldCh2YWx1ZSkgPj0gbXNiU2V0SW5Qb2x5KSB7DQorICAgIHZhbHVlIF49IHBvbHkgPDwgKEZpbmRNU0JTZXQodmFsdWUpIC0gbXNiU2V0SW5Qb2x5KTsNCisgIH0NCisgIHJldHVybiB2YWx1ZTsNCit9DQordm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6Ok1ha2VUeXBlSW5mb0JpdHMoDQorICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsDQorICAgIGludDMyX3QgbWFza1BhdHRlcm4sDQorICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoYml0cyA9PSBOVUxMKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCisgIGlmICghQ0JDX1FSQ29kZXI6OklzVmFsaWRNYXNrUGF0dGVybihtYXNrUGF0dGVybikpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uQmFkTWFzazsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBpbnQzMl90IHR5cGVJbmZvID0gKGVjTGV2ZWwtPkdldEJpdHMoKSA8PCAzKSB8IG1hc2tQYXR0ZXJuOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBiaXRzLT5BcHBlbmRCaXRzKHR5cGVJbmZvLCA1LCBlKTsNCisgIGludDMyX3QgYmNoQ29kZSA9IENhbGN1bGF0ZUJDSENvZGUodHlwZUluZm8sIFRZUEVfSU5GT19QT0xZKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgYml0cy0+QXBwZW5kQml0cyhiY2hDb2RlLCAxMCwgZSk7DQorICBDQkNfUVJDb2RlckJpdFZlY3RvciBtYXNrQml0czsNCisgIG1hc2tCaXRzLkluaXQoKTsNCisgIG1hc2tCaXRzLkFwcGVuZEJpdHMoVFlQRV9JTkZPX01BU0tfUEFUVEVSTiwgMTUsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBiaXRzLT5YT1IoJm1hc2tCaXRzLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgaWYgKGJpdHMtPlNpemUoKSAhPSAxNSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25CaXRTaXplTm90MTU7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KK30NCit2b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6TWFrZVZlcnNpb25JbmZvQml0cyhpbnQzMl90IHZlcnNpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGJpdHMgPT0gTlVMTCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBiaXRzLT5BcHBlbmRCaXRzKHZlcnNpb24sIDYsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBpbnQzMl90IGJjaENvZGUgPSBDYWxjdWxhdGVCQ0hDb2RlKHZlcnNpb24sIFZFUlNJT05fSU5GT19QT0xZKTsNCisgIGJpdHMtPkFwcGVuZEJpdHMoYmNoQ29kZSwgMTIsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBpZiAoYml0cy0+U2l6ZSgpICE9IDE4KSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkJpdFNpemVOb3QxODsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpJc0VtcHR5KGludDMyX3QgdmFsdWUpIHsNCisgIHJldHVybiAodWludDhfdCl2YWx1ZSA9PSAweGZmOw0KK30NCitGWF9CT09MIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6SXNWYWxpZFZhbHVlKGludDMyX3QgdmFsdWUpIHsNCisgIHJldHVybiAoKHVpbnQ4X3QpdmFsdWUgPT0gMHhmZiB8fCAodWludDhfdCl2YWx1ZSA9PSAweDAwIHx8DQorICAgICAgICAgICh1aW50OF90KXZhbHVlID09IDB4MDEpOw0KK30NCit2b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6RW1iZWRUaW1pbmdQYXR0ZXJucyhDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChtYXRyaXggPT0gTlVMTCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBmb3IgKGludDMyX3QgaSA9IDg7IGkgPCBtYXRyaXgtPkdldFdpZHRoKCkgLSA4OyBpKyspIHsNCisgICAgaW50MzJfdCBiaXQgPSAoaSArIDEpICUgMjsNCisgICAgaWYgKCFJc1ZhbGlkVmFsdWUobWF0cml4LT5HZXQoaSwgNikpKSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZGF0ZUltYWdlRGF0YTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KKyAgICBpZiAoSXNFbXB0eShtYXRyaXgtPkdldChpLCA2KSkpIHsNCisgICAgICBtYXRyaXgtPlNldChpLCA2LCBiaXQpOw0KKyAgICB9DQorICAgIGlmICghSXNWYWxpZFZhbHVlKG1hdHJpeC0+R2V0KDYsIGkpKSkgew0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVJbWFnZURhdGE7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCisgICAgaWYgKElzRW1wdHkobWF0cml4LT5HZXQoNiwgaSkpKSB7DQorICAgICAgbWF0cml4LT5TZXQoNiwgaSwgYml0KTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6RW1iZWREYXJrRG90QXRMZWZ0Qm90dG9tQ29ybmVyKA0KKyAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAobWF0cml4ID09IE5VTEwpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KKyAgaWYgKG1hdHJpeC0+R2V0KDgsIG1hdHJpeC0+R2V0SGVpZ2h0KCkgLSA4KSA9PSAwKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbkhlaWdodF84QmVaZXJvOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCisgIG1hdHJpeC0+U2V0KDgsIG1hdHJpeC0+R2V0SGVpZ2h0KCkgLSA4LCAxKTsNCit9DQordm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkVtYmVkSG9yaXpvbnRhbFNlcGFyYXRpb25QYXR0ZXJuKA0KKyAgICBpbnQzMl90IHhTdGFydCwNCisgICAgaW50MzJfdCB5U3RhcnQsDQorICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChtYXRyaXggPT0gTlVMTCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCA4OyB4KyspIHsNCisgICAgaWYgKCFJc0VtcHR5KG1hdHJpeC0+R2V0KHhTdGFydCArIHgsIHlTdGFydCkpKSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZGF0ZURhdGE7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSkNCisgICAgfQ0KKyAgICBtYXRyaXgtPlNldCh4U3RhcnQgKyB4LCB5U3RhcnQsIEhPUklaT05UQUxfU0VQQVJBVElPTl9QQVRURVJOWzBdW3hdKTsNCisgIH0NCit9DQordm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkVtYmVkVmVydGljYWxTZXBhcmF0aW9uUGF0dGVybigNCisgICAgaW50MzJfdCB4U3RhcnQsDQorICAgIGludDMyX3QgeVN0YXJ0LA0KKyAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAobWF0cml4ID09IE5VTEwpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgNzsgeSsrKSB7DQorICAgIGlmICghSXNFbXB0eShtYXRyaXgtPkdldCh4U3RhcnQsIHlTdGFydCArIHkpKSkgew0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVEYXRhOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorICAgIG1hdHJpeC0+U2V0KHhTdGFydCwgeVN0YXJ0ICsgeSwgVkVSVElDQUxfU0VQQVJBVElPTl9QQVRURVJOW3ldWzBdKTsNCisgIH0NCit9DQordm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkVtYmVkUG9zaXRpb25BZGp1c3RtZW50UGF0dGVybigNCisgICAgaW50MzJfdCB4U3RhcnQsDQorICAgIGludDMyX3QgeVN0YXJ0LA0KKyAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAobWF0cml4ID09IE5VTEwpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgNTsgeSsrKSB7DQorICAgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IDU7IHgrKykgew0KKyAgICAgIGlmICghSXNFbXB0eShtYXRyaXgtPkdldCh4U3RhcnQgKyB4LCB5ICsgeVN0YXJ0KSkpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVEYXRhOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgICAgfQ0KKyAgICAgIG1hdHJpeC0+U2V0KHhTdGFydCArIHgsIHlTdGFydCArIHksIFBPU0lUSU9OX0FESlVTVE1FTlRfUEFUVEVSTlt5XVt4XSk7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkVtYmVkUG9zaXRpb25EZXRlY3Rpb25QYXR0ZXJuKA0KKyAgICBpbnQzMl90IHhTdGFydCwNCisgICAgaW50MzJfdCB5U3RhcnQsDQorICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChtYXRyaXggPT0gTlVMTCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCA3OyB5KyspIHsNCisgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgNzsgeCsrKSB7DQorICAgICAgaWYgKCFJc0VtcHR5KG1hdHJpeC0+R2V0KHhTdGFydCArIHgsIHlTdGFydCArIHkpKSkgew0KKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZGF0ZURhdGE7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgICB9DQorICAgICAgbWF0cml4LT5TZXQoeFN0YXJ0ICsgeCwgeVN0YXJ0ICsgeSwgUE9TSVRJT05fREVURUNUSU9OX1BBVFRFUk5beV1beF0pOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpFbWJlZFBvc2l0aW9uRGV0ZWN0aW9uUGF0dGVybnNBbmRTZXBhcmF0b3JzKA0KKyAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAobWF0cml4ID09IE5VTEwpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgfQ0KKyAgaW50MzJfdCBwZHBXaWR0aCA9IDc7DQorICBFbWJlZFBvc2l0aW9uRGV0ZWN0aW9uUGF0dGVybigwLCAwLCBtYXRyaXgsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBFbWJlZFBvc2l0aW9uRGV0ZWN0aW9uUGF0dGVybihtYXRyaXgtPkdldFdpZHRoKCkgLSBwZHBXaWR0aCwgMCwgbWF0cml4LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgRW1iZWRQb3NpdGlvbkRldGVjdGlvblBhdHRlcm4oMCwgbWF0cml4LT5HZXRXaWR0aCgpIC0gcGRwV2lkdGgsIG1hdHJpeCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIGludDMyX3QgaHNwV2lkdGggPSA4Ow0KKyAgRW1iZWRIb3Jpem9udGFsU2VwYXJhdGlvblBhdHRlcm4oMCwgaHNwV2lkdGggLSAxLCBtYXRyaXgsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBFbWJlZEhvcml6b250YWxTZXBhcmF0aW9uUGF0dGVybihtYXRyaXgtPkdldFdpZHRoKCkgLSBoc3BXaWR0aCwgaHNwV2lkdGggLSAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgRW1iZWRIb3Jpem9udGFsU2VwYXJhdGlvblBhdHRlcm4oMCwgbWF0cml4LT5HZXRXaWR0aCgpIC0gaHNwV2lkdGgsIG1hdHJpeCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIGludDMyX3QgdnNwU2l6ZSA9IDc7DQorICBFbWJlZFZlcnRpY2FsU2VwYXJhdGlvblBhdHRlcm4odnNwU2l6ZSwgMCwgbWF0cml4LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgRW1iZWRWZXJ0aWNhbFNlcGFyYXRpb25QYXR0ZXJuKG1hdHJpeC0+R2V0SGVpZ2h0KCkgLSB2c3BTaXplIC0gMSwgMCwgbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICBFbWJlZFZlcnRpY2FsU2VwYXJhdGlvblBhdHRlcm4odnNwU2l6ZSwgbWF0cml4LT5HZXRIZWlnaHQoKSAtIHZzcFNpemUsIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KK30NCit2b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6TWF5YmVFbWJlZFBvc2l0aW9uQWRqdXN0bWVudFBhdHRlcm5zKA0KKyAgICBpbnQzMl90IHZlcnNpb24sDQorICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsDQorICAgIGludDMyX3QmIGUpIHsNCisgIGlmIChtYXRyaXggPT0gTlVMTCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBpZiAodmVyc2lvbiA8IDIpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpbmRleCA9IHZlcnNpb24gLSAxOw0KKyAgaW50MzJfdCBjb25zdCogY29vcmRpbmF0ZXMgPQ0KKyAgICAgICYoUE9TSVRJT05fQURKVVNUTUVOVF9QQVRURVJOX0NPT1JESU5BVEVfVEFCTEVbaW5kZXhdWzBdKTsNCisgIGludDMyX3QgbnVtQ29vcmRpbmF0ZSA9IDc7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1Db29yZGluYXRlOyBpKyspIHsNCisgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgbnVtQ29vcmRpbmF0ZTsgaisrKSB7DQorICAgICAgaW50MzJfdCB5ID0gY29vcmRpbmF0ZXNbaV07DQorICAgICAgaW50MzJfdCB4ID0gY29vcmRpbmF0ZXNbal07DQorICAgICAgaWYgKHggPT0gLTEgfHwgeSA9PSAtMSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmIChJc0VtcHR5KG1hdHJpeC0+R2V0KHgsIHkpKSkgew0KKyAgICAgICAgRW1iZWRQb3NpdGlvbkFkanVzdG1lbnRQYXR0ZXJuKHggLSAyLCB5IC0gMiwgbWF0cml4LCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KK30NCitpbnQzMl90IENCQ19RUkNvZGVyTWF0cml4VXRpbDo6RmluZE1TQlNldChpbnQzMl90IHZhbHVlKSB7DQorICBpbnQzMl90IG51bURpZ2l0cyA9IDA7DQorICB3aGlsZSAodmFsdWUgIT0gMCkgew0KKyAgICB2YWx1ZSA+Pj0gMTsNCisgICAgKytudW1EaWdpdHM7DQorICB9DQorICByZXR1cm4gbnVtRGlnaXRzOw0KK30NCitDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkNCQ19RUkNvZGVyTWF0cml4VXRpbCgpIHt9DQorQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjp+Q0JDX1FSQ29kZXJNYXRyaXhVdGlsKCkge30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hdHJpeFV0aWwuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWF0cml4VXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZmNjYWQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hdHJpeFV0aWwuaApAQCAtMCwwICsxLDg1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1FSQ09ERVJNQVRSSVhVVElMX0hfDQorI2RlZmluZSBfQkNfUVJDT0RFUk1BVFJJWFVUSUxfSF8NCitjbGFzcyBDQkNfQ29tbW9uQnl0ZU1hdHJpeDsNCitjbGFzcyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOw0KK2NsYXNzIENCQ19RUkNvZGVyQml0VmVjdG9yOw0KK2NsYXNzIENCQ19RUkNvZGVyTWF0cml4VXRpbCB7DQorIHByaXZhdGU6DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBQT1NJVElPTl9ERVRFQ1RJT05fUEFUVEVSTls3XVs3XTsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IFZFUlRJQ0FMX1NFUEFSQVRJT05fUEFUVEVSTls3XVsxXTsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IEhPUklaT05UQUxfU0VQQVJBVElPTl9QQVRURVJOWzFdWzhdOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgUE9TSVRJT05fQURKVVNUTUVOVF9QQVRURVJOWzVdWzVdOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgUE9TSVRJT05fQURKVVNUTUVOVF9QQVRURVJOX0NPT1JESU5BVEVfVEFCTEVbNDBdWzddOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgVFlQRV9JTkZPX0NPT1JESU5BVEVTWzE1XVsyXTsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IFZFUlNJT05fSU5GT19QT0xZOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgVFlQRV9JTkZPX1BPTFk7DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBUWVBFX0lORk9fTUFTS19QQVRURVJOOw0KKw0KKyBwdWJsaWM6DQorICBDQkNfUVJDb2Rlck1hdHJpeFV0aWwoKTsNCisgIHZpcnR1YWwgfkNCQ19RUkNvZGVyTWF0cml4VXRpbCgpOw0KKyAgc3RhdGljIHZvaWQgQ2xlYXJNYXRyaXgoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCBCdWlsZE1hdHJpeChDQkNfUVJDb2RlckJpdFZlY3RvciogZGF0YUJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2ZXJzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXNrUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIEVtYmVkQmFzaWNQYXR0ZXJucyhpbnQzMl90IHZlcnNpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIEVtYmVkVHlwZUluZm8oQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXNrUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCBFbWJlZERhdGFCaXRzKENCQ19RUkNvZGVyQml0VmVjdG9yKiBkYXRhQml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXNrUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCBNYXliZUVtYmVkVmVyc2lvbkluZm8oaW50MzJfdCB2ZXJzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgaW50MzJfdCBGaW5kTVNCU2V0KGludDMyX3QgdmFsdWUpOw0KKyAgc3RhdGljIGludDMyX3QgQ2FsY3VsYXRlQkNIQ29kZShpbnQzMl90IGNvZGUsIGludDMyX3QgcG9seSk7DQorICBzdGF0aWMgdm9pZCBNYWtlVHlwZUluZm9CaXRzKENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWFza1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIE1ha2VWZXJzaW9uSW5mb0JpdHMoaW50MzJfdCB2ZXJzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgRlhfQk9PTCBJc0VtcHR5KGludDMyX3QgdmFsdWUpOw0KKyAgc3RhdGljIEZYX0JPT0wgSXNWYWxpZFZhbHVlKGludDMyX3QgdmFsdWUpOw0KKyAgc3RhdGljIHZvaWQgRW1iZWRUaW1pbmdQYXR0ZXJucyhDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LCBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIEVtYmVkRGFya0RvdEF0TGVmdEJvdHRvbUNvcm5lcihDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgRW1iZWRIb3Jpem9udGFsU2VwYXJhdGlvblBhdHRlcm4oaW50MzJfdCB4U3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHlTdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIEVtYmVkVmVydGljYWxTZXBhcmF0aW9uUGF0dGVybihpbnQzMl90IHhTdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHlTdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgRW1iZWRQb3NpdGlvbkFkanVzdG1lbnRQYXR0ZXJuKGludDMyX3QgeFN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeVN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCBFbWJlZFBvc2l0aW9uRGV0ZWN0aW9uUGF0dGVybihpbnQzMl90IHhTdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeVN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgRW1iZWRQb3NpdGlvbkRldGVjdGlvblBhdHRlcm5zQW5kU2VwYXJhdG9ycygNCisgICAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LA0KKyAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgTWF5YmVFbWJlZFBvc2l0aW9uQWRqdXN0bWVudFBhdHRlcm5zKGludDMyX3QgdmVyc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNb2RlLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTW9kZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEyMjYyNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTW9kZS5jcHAKQEAgLTAsMCArMSwxNzkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVyVmVyc2lvbi5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVyTW9kZS5oIg0KK0NCQ19RUkNvZGVyTW9kZSogQ0JDX1FSQ29kZXJNb2RlOjpzQllURSA9IE5VTEw7DQorQ0JDX1FSQ29kZXJNb2RlKiBDQkNfUVJDb2Rlck1vZGU6OnNOVU1FUklDID0gTlVMTDsNCitDQkNfUVJDb2Rlck1vZGUqIENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQyA9IE5VTEw7DQorQ0JDX1FSQ29kZXJNb2RlKiBDQkNfUVJDb2Rlck1vZGU6OnNLQU5KSSA9IE5VTEw7DQorQ0JDX1FSQ29kZXJNb2RlKiBDQkNfUVJDb2Rlck1vZGU6OnNFQ0kgPSBOVUxMOw0KK0NCQ19RUkNvZGVyTW9kZSogQ0JDX1FSQ29kZXJNb2RlOjpzR0JLID0gTlVMTDsNCitDQkNfUVJDb2Rlck1vZGUqIENCQ19RUkNvZGVyTW9kZTo6c1RFUk1JTkFUT1IgPSBOVUxMOw0KK0NCQ19RUkNvZGVyTW9kZSogQ0JDX1FSQ29kZXJNb2RlOjpzRk5DMV9GSVJTVF9QT1NJVElPTiA9IE5VTEw7DQorQ0JDX1FSQ29kZXJNb2RlKiBDQkNfUVJDb2Rlck1vZGU6OnNGTkMxX1NFQ09ORF9QT1NJVElPTiA9IE5VTEw7DQorQ0JDX1FSQ29kZXJNb2RlKiBDQkNfUVJDb2Rlck1vZGU6OnNTVFJVQ1RVUkVEX0FQUEVORCA9IE5VTEw7DQorQ0JDX1FSQ29kZXJNb2RlOjpDQkNfUVJDb2Rlck1vZGUoaW50MzJfdCogY2hhcmFjdGVyQ291bnRCaXRzRm9yVmVyc2lvbnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB4MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHgyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeDMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBiaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIG5hbWUpIHsNCisgIG1fY2hhcmFjdGVyQ291bnRCaXRzRm9yVmVyc2lvbnMgPSBjaGFyYWN0ZXJDb3VudEJpdHNGb3JWZXJzaW9uczsNCisgIGlmIChtX2NoYXJhY3RlckNvdW50Qml0c0ZvclZlcnNpb25zICE9IE5VTEwpIHsNCisgICAgbV9jaGFyYWN0ZXJDb3VudEJpdHNGb3JWZXJzaW9uc1swXSA9IHgxOw0KKyAgICBtX2NoYXJhY3RlckNvdW50Qml0c0ZvclZlcnNpb25zWzFdID0geDI7DQorICAgIG1fY2hhcmFjdGVyQ291bnRCaXRzRm9yVmVyc2lvbnNbMl0gPSB4MzsNCisgIH0NCisgIG1fbmFtZSArPSBuYW1lOw0KKyAgbV9iaXRzID0gYml0czsNCit9DQorQ0JDX1FSQ29kZXJNb2RlOjp+Q0JDX1FSQ29kZXJNb2RlKCkgew0KKyAgaWYgKG1fY2hhcmFjdGVyQ291bnRCaXRzRm9yVmVyc2lvbnMgIT0gTlVMTCkgew0KKyAgICBGWF9GcmVlKG1fY2hhcmFjdGVyQ291bnRCaXRzRm9yVmVyc2lvbnMpOw0KKyAgfQ0KK30NCit2b2lkIENCQ19RUkNvZGVyTW9kZTo6SW5pdGlhbGl6ZSgpIHsNCisgIHNCWVRFID0gbmV3IENCQ19RUkNvZGVyTW9kZShGWF9BbGxvYyhpbnQzMl90LCAzKSwgOCwgMTYsIDE2LCAweDQsICJCWVRFIik7DQorICBzQUxQSEFOVU1FUklDID0NCisgICAgICBuZXcgQ0JDX1FSQ29kZXJNb2RlKEZYX0FsbG9jKGludDMyX3QsIDMpLCA5LCAxMSwgMTMsIDB4MiwgIkFMUEhBTlVNRVJJQyIpOw0KKyAgc0VDSSA9IG5ldyBDQkNfUVJDb2Rlck1vZGUoTlVMTCwgMCwgMCwgMCwgMHg3LCAiRUNJIik7DQorICBzS0FOSkkgPSBuZXcgQ0JDX1FSQ29kZXJNb2RlKEZYX0FsbG9jKGludDMyX3QsIDMpLCA4LCAxMCwgMTIsIDB4OCwgIktBTkpJIik7DQorICBzTlVNRVJJQyA9DQorICAgICAgbmV3IENCQ19RUkNvZGVyTW9kZShGWF9BbGxvYyhpbnQzMl90LCAzKSwgMTAsIDEyLCAxNCwgMHgxLCAiTlVNRVJJQyIpOw0KKyAgc0dCSyA9IG5ldyBDQkNfUVJDb2Rlck1vZGUoRlhfQWxsb2MoaW50MzJfdCwgMyksIDgsIDEwLCAxMiwgMHgwRCwgIkdCSyIpOw0KKyAgc1RFUk1JTkFUT1IgPQ0KKyAgICAgIG5ldyBDQkNfUVJDb2Rlck1vZGUoRlhfQWxsb2MoaW50MzJfdCwgMyksIDAsIDAsIDAsIDB4MDAsICJURVJNSU5BVE9SIik7DQorICBzRk5DMV9GSVJTVF9QT1NJVElPTiA9DQorICAgICAgbmV3IENCQ19RUkNvZGVyTW9kZShOVUxMLCAwLCAwLCAwLCAweDA1LCAiRk5DMV9GSVJTVF9QT1NJVElPTiIpOw0KKyAgc0ZOQzFfU0VDT05EX1BPU0lUSU9OID0NCisgICAgICBuZXcgQ0JDX1FSQ29kZXJNb2RlKE5VTEwsIDAsIDAsIDAsIDB4MDksICJGTkMxX1NFQ09ORF9QT1NJVElPTiIpOw0KKyAgc1NUUlVDVFVSRURfQVBQRU5EID0gbmV3IENCQ19RUkNvZGVyTW9kZShGWF9BbGxvYyhpbnQzMl90LCAzKSwgMCwgMCwgMCwgMHgwMywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNUUlVDVFVSRURfQVBQRU5EIik7DQorfQ0KK3ZvaWQgQ0JDX1FSQ29kZXJNb2RlOjpGaW5hbGl6ZSgpIHsNCisgIGRlbGV0ZSBzQllURTsNCisgIGRlbGV0ZSBzQUxQSEFOVU1FUklDOw0KKyAgZGVsZXRlIHNFQ0k7DQorICBkZWxldGUgc0tBTkpJOw0KKyAgZGVsZXRlIHNOVU1FUklDOw0KKyAgZGVsZXRlIHNHQks7DQorICBkZWxldGUgc1RFUk1JTkFUT1I7DQorICBkZWxldGUgc0ZOQzFfRklSU1RfUE9TSVRJT047DQorICBkZWxldGUgc0ZOQzFfU0VDT05EX1BPU0lUSU9OOw0KKyAgZGVsZXRlIHNTVFJVQ1RVUkVEX0FQUEVORDsNCit9DQorQ0JDX1FSQ29kZXJNb2RlKiBDQkNfUVJDb2Rlck1vZGU6OkZvckJpdHMoaW50MzJfdCBiaXRzLCBpbnQzMl90JiBlKSB7DQorICBzd2l0Y2ggKGJpdHMpIHsNCisgICAgY2FzZSAweDA6DQorICAgICAgcmV0dXJuIHNURVJNSU5BVE9SOw0KKyAgICBjYXNlIDB4MToNCisgICAgICByZXR1cm4gc05VTUVSSUM7DQorICAgIGNhc2UgMHgyOg0KKyAgICAgIHJldHVybiBzQUxQSEFOVU1FUklDOw0KKyAgICBjYXNlIDB4MzoNCisgICAgICByZXR1cm4gc1NUUlVDVFVSRURfQVBQRU5EOw0KKyAgICBjYXNlIDB4NDoNCisgICAgICByZXR1cm4gc0JZVEU7DQorICAgIGNhc2UgMHg1Og0KKyAgICAgIHJldHVybiBzRk5DMV9GSVJTVF9QT1NJVElPTjsNCisgICAgY2FzZSAweDc6DQorICAgICAgcmV0dXJuIHNFQ0k7DQorICAgIGNhc2UgMHg4Og0KKyAgICAgIHJldHVybiBzS0FOSkk7DQorICAgIGNhc2UgMHg5Og0KKyAgICAgIHJldHVybiBzRk5DMV9TRUNPTkRfUE9TSVRJT047DQorICAgIGNhc2UgMHgwRDoNCisgICAgICByZXR1cm4gc0dCSzsNCisgICAgZGVmYXVsdDogew0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvblVuc3VwcG9ydGVkTW9kZTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitpbnQzMl90IENCQ19RUkNvZGVyTW9kZTo6R2V0Qml0cygpIHsNCisgIHJldHVybiBtX2JpdHM7DQorfQ0KK0NGWF9CeXRlU3RyaW5nIENCQ19RUkNvZGVyTW9kZTo6R2V0TmFtZSgpIHsNCisgIHJldHVybiBtX25hbWU7DQorfQ0KK2ludDMyX3QgQ0JDX1FSQ29kZXJNb2RlOjpHZXRDaGFyYWN0ZXJDb3VudEJpdHMoQ0JDX1FSQ29kZXJWZXJzaW9uKiB2ZXJzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKG1fY2hhcmFjdGVyQ291bnRCaXRzRm9yVmVyc2lvbnMgPT0gTlVMTCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25DaGFyYWN0ZXJOb3RUaGlzTW9kZTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KKyAgfQ0KKyAgaW50MzJfdCBudW1iZXIgPSB2ZXJzaW9uLT5HZXRWZXJzaW9uTnVtYmVyKCk7DQorICBpbnQzMl90IG9mZnNldDsNCisgIGlmIChudW1iZXIgPD0gOSkgew0KKyAgICBvZmZzZXQgPSAwOw0KKyAgfSBlbHNlIGlmIChudW1iZXIgPD0gMjYpIHsNCisgICAgb2Zmc2V0ID0gMTsNCisgIH0gZWxzZSB7DQorICAgIG9mZnNldCA9IDI7DQorICB9DQorICByZXR1cm4gbV9jaGFyYWN0ZXJDb3VudEJpdHNGb3JWZXJzaW9uc1tvZmZzZXRdOw0KK30NCit2b2lkIENCQ19RUkNvZGVyTW9kZTo6RGVzdHJveSgpIHsNCisgIGlmIChzQllURSkgew0KKyAgICBkZWxldGUgQ0JDX1FSQ29kZXJNb2RlOjpzQllURTsNCisgICAgc0JZVEUgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKHNOVU1FUklDKSB7DQorICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNOVU1FUklDOw0KKyAgICBzTlVNRVJJQyA9IE5VTEw7DQorICB9DQorICBpZiAoc0FMUEhBTlVNRVJJQykgew0KKyAgICBkZWxldGUgQ0JDX1FSQ29kZXJNb2RlOjpzQUxQSEFOVU1FUklDOw0KKyAgICBzQUxQSEFOVU1FUklDID0gTlVMTDsNCisgIH0NCisgIGlmIChzS0FOSkkpIHsNCisgICAgZGVsZXRlIENCQ19RUkNvZGVyTW9kZTo6c0tBTkpJOw0KKyAgICBzS0FOSkkgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKHNFQ0kpIHsNCisgICAgZGVsZXRlIENCQ19RUkNvZGVyTW9kZTo6c0VDSTsNCisgICAgc0VDSSA9IE5VTEw7DQorICB9DQorICBpZiAoc0dCSykgew0KKyAgICBkZWxldGUgQ0JDX1FSQ29kZXJNb2RlOjpzR0JLOw0KKyAgICBzR0JLID0gTlVMTDsNCisgIH0NCisgIGlmIChzVEVSTUlOQVRPUikgew0KKyAgICBkZWxldGUgQ0JDX1FSQ29kZXJNb2RlOjpzVEVSTUlOQVRPUjsNCisgICAgc1RFUk1JTkFUT1IgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKHNGTkMxX0ZJUlNUX1BPU0lUSU9OKSB7DQorICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNGTkMxX0ZJUlNUX1BPU0lUSU9OOw0KKyAgICBzRk5DMV9GSVJTVF9QT1NJVElPTiA9IE5VTEw7DQorICB9DQorICBpZiAoc0ZOQzFfU0VDT05EX1BPU0lUSU9OKSB7DQorICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNGTkMxX1NFQ09ORF9QT1NJVElPTjsNCisgICAgc0ZOQzFfU0VDT05EX1BPU0lUSU9OID0gTlVMTDsNCisgIH0NCisgIGlmIChzU1RSVUNUVVJFRF9BUFBFTkQpIHsNCisgICAgZGVsZXRlIENCQ19RUkNvZGVyTW9kZTo6c1NUUlVDVFVSRURfQVBQRU5EOw0KKyAgICBzU1RSVUNUVVJFRF9BUFBFTkQgPSBOVUxMOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1vZGUuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTW9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZjRjNDUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1vZGUuaApAQCAtMCwwICsxLDQ0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1FSQ09ERVJNT0RFX0hfDQorI2RlZmluZSBfQkNfUVJDT0RFUk1PREVfSF8NCitjbGFzcyBDQkNfUVJDb2RlclZlcnNpb247DQorY2xhc3MgQ0JDX1FSQ29kZXJNb2RlIHsNCisgcHJpdmF0ZToNCisgIGludDMyX3QqIG1fY2hhcmFjdGVyQ291bnRCaXRzRm9yVmVyc2lvbnM7DQorICBpbnQzMl90IG1fYml0czsNCisgIENGWF9CeXRlU3RyaW5nIG1fbmFtZTsNCisgIENCQ19RUkNvZGVyTW9kZShpbnQzMl90KiBjaGFyYWN0ZXJDb3VudEJpdHNGb3JWZXJzaW9ucywNCisgICAgICAgICAgICAgICAgICBpbnQzMl90IHgxLA0KKyAgICAgICAgICAgICAgICAgIGludDMyX3QgeDIsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCB4MywNCisgICAgICAgICAgICAgICAgICBpbnQzMl90IGJpdHMsDQorICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSk7DQorICBDQkNfUVJDb2Rlck1vZGUoKTsNCisNCisgcHVibGljOg0KKyAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogc0JZVEU7DQorICBzdGF0aWMgQ0JDX1FSQ29kZXJNb2RlKiBzTlVNRVJJQzsNCisgIHN0YXRpYyBDQkNfUVJDb2Rlck1vZGUqIHNBTFBIQU5VTUVSSUM7DQorICBzdGF0aWMgQ0JDX1FSQ29kZXJNb2RlKiBzS0FOSkk7DQorICBzdGF0aWMgQ0JDX1FSQ29kZXJNb2RlKiBzRUNJOw0KKyAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogc0dCSzsNCisgIHN0YXRpYyBDQkNfUVJDb2Rlck1vZGUqIHNURVJNSU5BVE9SOw0KKyAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogc0ZOQzFfRklSU1RfUE9TSVRJT047DQorICBzdGF0aWMgQ0JDX1FSQ29kZXJNb2RlKiBzRk5DMV9TRUNPTkRfUE9TSVRJT047DQorICBzdGF0aWMgQ0JDX1FSQ29kZXJNb2RlKiBzU1RSVUNUVVJFRF9BUFBFTkQ7DQorICB2aXJ0dWFsIH5DQkNfUVJDb2Rlck1vZGUoKTsNCisNCisgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsNCisgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7DQorICBzdGF0aWMgQ0JDX1FSQ29kZXJNb2RlKiBGb3JCaXRzKGludDMyX3QgYml0cywgaW50MzJfdCYgZSk7DQorICBpbnQzMl90IEdldENoYXJhY3RlckNvdW50Qml0cyhDQkNfUVJDb2RlclZlcnNpb24qIHZlcnNpb24sIGludDMyX3QmIGUpOw0KKyAgaW50MzJfdCBHZXRCaXRzKCk7DQorICBDRlhfQnl0ZVN0cmluZyBHZXROYW1lKCk7DQorICBzdGF0aWMgdm9pZCBEZXN0cm95KCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlclZlcnNpb24uY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJWZXJzaW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWI5OWZiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJWZXJzaW9uLmNwcApAQCAtMCwwICsxLDc2OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL3V0aWxzLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAiQkNfUVJDb2RlckVDQi5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVyRm9ybWF0SW5mb3JtYXRpb24uaCINCisjaW5jbHVkZSAiQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsLmgiDQorI2luY2x1ZGUgIkJDX1FSQ29kZXJCaXRWZWN0b3IuaCINCisjaW5jbHVkZSAiQkNfUVJDb2RlckVDQmxvY2tzLmgiDQorI2luY2x1ZGUgIkJDX1FSQ29kZXJWZXJzaW9uLmgiDQorY29uc3QgaW50MzJfdCBDQkNfUVJDb2RlclZlcnNpb246OlZFUlNJT05fREVDT0RFX0lORk9bXSA9IHsNCisgICAgMHgwN0M5NCwgMHgwODVCQywgMHgwOUE5OSwgMHgwQTREMywgMHgwQkJGNiwgMHgwQzc2MiwgMHgwRDg0NywNCisgICAgMHgwRTYwRCwgMHgwRjkyOCwgMHgxMEI3OCwgMHgxMTQ1RCwgMHgxMkExNywgMHgxMzUzMiwgMHgxNDlBNiwNCisgICAgMHgxNTY4MywgMHgxNjhDOSwgMHgxNzdFQywgMHgxOEVDNCwgMHgxOTFFMSwgMHgxQUZBQiwgMHgxQjA4RSwNCisgICAgMHgxQ0MxQSwgMHgxRDMzRiwgMHgxRUQ3NSwgMHgxRjI1MCwgMHgyMDlENSwgMHgyMTZGMCwgMHgyMjhCQSwNCisgICAgMHgyMzc5RiwgMHgyNEIwQiwgMHgyNTQyRSwgMHgyNkE2NCwgMHgyNzU0MSwgMHgyOEM2OX07DQorQ0ZYX1B0ckFycmF5KiBDQkNfUVJDb2RlclZlcnNpb246OlZFUlNJT04gPSBOVUxMOw0KK3ZvaWQgQ0JDX1FSQ29kZXJWZXJzaW9uOjpJbml0aWFsaXplKCkgew0KKyAgVkVSU0lPTiA9IG5ldyBDRlhfUHRyQXJyYXkoKTsNCit9DQordm9pZCBDQkNfUVJDb2RlclZlcnNpb246OkZpbmFsaXplKCkgew0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgVkVSU0lPTi0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgQ0JDX1FSQ29kZXJWZXJzaW9uKiB2ID0gKENCQ19RUkNvZGVyVmVyc2lvbiopKFZFUlNJT04tPkdldEF0KGkpKTsNCisgICAgZGVsZXRlIHY7DQorICB9DQorICBkZWxldGUgVkVSU0lPTjsNCit9DQorQ0JDX1FSQ29kZXJWZXJzaW9uOjpDQkNfUVJDb2RlclZlcnNpb24oaW50MzJfdCB2ZXJzaW9uTnVtYmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRUNCbG9ja3MqIGVjQmxvY2tzMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVDQmxvY2tzKiBlY0Jsb2NrczIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFQ0Jsb2NrcyogZWNCbG9ja3MzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRUNCbG9ja3MqIGVjQmxvY2tzNCkgew0KKyAgbV92ZXJzaW9uTnVtYmVyID0gdmVyc2lvbk51bWJlcjsNCisgIG1fZWNCbG9ja3MuQWRkKGVjQmxvY2tzMSk7DQorICBtX2VjQmxvY2tzLkFkZChlY0Jsb2NrczIpOw0KKyAgbV9lY0Jsb2Nrcy5BZGQoZWNCbG9ja3MzKTsNCisgIG1fZWNCbG9ja3MuQWRkKGVjQmxvY2tzNCk7DQorICBpbnQzMl90IHRvdGFsID0gMDsNCisgIGludDMyX3QgZWNDb2RlV29yZHMgPSBlY0Jsb2NrczEtPkdldEVDQ29kZVdvcmRzUGVyQmxvY2soKTsNCisgIENGWF9QdHJBcnJheSogZWNiQXJyYXkgPSBlY0Jsb2NrczEtPkdldEVDQmxvY2tzKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBlY2JBcnJheS0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgQ0JDX1FSQ29kZXJFQ0IqIGVjQmxvY2sgPSAoQ0JDX1FSQ29kZXJFQ0IqKSgoKmVjYkFycmF5KVtpXSk7DQorICAgIHRvdGFsICs9IGVjQmxvY2stPkdldENvdW50KCkgKiAoZWNCbG9jay0+R2V0RGF0YUNvZGVXb3JkcygpICsgZWNDb2RlV29yZHMpOw0KKyAgfQ0KKyAgbV90b3RhbENvZGVXb3JkcyA9IHRvdGFsOw0KKyAgc3dpdGNoICh2ZXJzaW9uTnVtYmVyKSB7DQorICAgIGNhc2UgMToNCisgICAgICBicmVhazsNCisgICAgY2FzZSAyOg0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDE4KTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAzOg0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDIyKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSA0Og0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI2KTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSA1Og0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSA2Og0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDM0KTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSA3Og0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDIyKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgzOCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgODoNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgyNCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNDIpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDk6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDQ2KTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAxMDoNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgyOCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNTApOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDExOg0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1NCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMTI6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzIpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU4KTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAxMzoNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgzNCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNjIpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDE0Og0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg0Nik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNjYpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDE1Og0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg0OCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNzApOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDE2Og0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1MCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNzQpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDE3Og0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1NCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNzgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDE4Og0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1Nik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoODIpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDE5Og0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1OCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoODYpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDIwOg0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDM0KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2Mik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoOTApOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDIxOg0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI4KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1MCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNzIpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDk0KTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAyMjoNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgyNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNTApOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDc0KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg5OCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMjM6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzApOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU0KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg3NCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTAyKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAyNDoNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgyOCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNTQpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDgwKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMDYpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDI1Og0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMyKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1OCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoODQpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDExMCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMjY6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzApOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU4KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4Nik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTE0KTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAyNzoNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgzNCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNjIpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDkwKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMTgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDI4Og0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1MCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNzQpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDk4KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMjIpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDI5Og0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1NCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNzgpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEwMik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTI2KTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAzMDoNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgyNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNTIpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDc4KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMDQpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEzMCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMzE6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzApOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4Mik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTA4KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMzQpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDMyOg0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDM0KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2MCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoODYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDExMik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTM4KTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAzMzoNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgzMCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNTgpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDg2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMTQpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDE0Mik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMzQ6DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzQpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYyKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg5MCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTE4KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxNDYpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDM1Og0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1NCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNzgpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEwMik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTI2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxNTApOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDM2Og0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI0KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1MCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNzYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEwMik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTI4KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxNTQpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDM3Og0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI4KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1NCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoODApOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEwNik7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTMyKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxNTgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDM4Og0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMyKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1OCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoODQpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDExMCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTM2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxNjIpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDM5Og0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI2KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1NCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoODIpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDExMCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTM4KTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxNjYpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDQwOg0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1OCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoODYpOw0KKyAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDExNCk7DQorICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTQyKTsNCisgICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxNzApOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KK30NCitDQkNfUVJDb2RlclZlcnNpb246On5DQkNfUVJDb2RlclZlcnNpb24oKSB7DQorICBpZiAobV9lY0Jsb2Nrcy5HZXRTaXplKCkgIT0gMCkgew0KKyAgICBpbnQzMl90IGl0QmVnID0gMDsNCisgICAgaW50MzJfdCBpdEVuZCA9IG1fZWNCbG9ja3MuR2V0U2l6ZSgpOw0KKyAgICB3aGlsZSAoaXRCZWcgIT0gaXRFbmQpIHsNCisgICAgICBkZWxldGUgKChDQkNfUVJDb2RlckVDQmxvY2tzKikobV9lY0Jsb2Nrc1tpdEJlZ10pKTsNCisgICAgICBpdEJlZysrOw0KKyAgICB9DQorICB9DQorfQ0KK2ludDMyX3QgQ0JDX1FSQ29kZXJWZXJzaW9uOjpHZXRWZXJzaW9uTnVtYmVyKCkgew0KKyAgcmV0dXJuIG1fdmVyc2lvbk51bWJlcjsNCit9DQorQ0ZYX0ludDMyQXJyYXkqIENCQ19RUkNvZGVyVmVyc2lvbjo6R2V0QWxpZ25tZW50UGF0dGVybkNlbnRlcnMoKSB7DQorICByZXR1cm4gJm1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnM7DQorfQ0KK2ludDMyX3QgQ0JDX1FSQ29kZXJWZXJzaW9uOjpHZXRUb3RhbENvZGVXb3JkcygpIHsNCisgIHJldHVybiBtX3RvdGFsQ29kZVdvcmRzOw0KK30NCitpbnQzMl90IENCQ19RUkNvZGVyVmVyc2lvbjo6R2V0RGltZW5zaW9uRm9yVmVyc2lvbigpIHsNCisgIHJldHVybiAxNyArIDQgKiBtX3ZlcnNpb25OdW1iZXI7DQorfQ0KK0NCQ19RUkNvZGVyRUNCbG9ja3MqIENCQ19RUkNvZGVyVmVyc2lvbjo6R2V0RUNCbG9ja3NGb3JMZXZlbCgNCisgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCkgew0KKyAgcmV0dXJuIChDQkNfUVJDb2RlckVDQmxvY2tzKiltX2VjQmxvY2tzW2VjTGV2ZWwtPk9yZGluYWwoKV07DQorfQ0KK0NCQ19RUkNvZGVyVmVyc2lvbiogQ0JDX1FSQ29kZXJWZXJzaW9uOjpHZXRQcm92aXNpb25hbFZlcnNpb25Gb3JEaW1lbnNpb24oDQorICAgIGludDMyX3QgZGltZW5zaW9uLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAoKGRpbWVuc2lvbiAlIDQpICE9IDEpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uUmVhZDsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgfQ0KKyAgQ0JDX1FSQ29kZXJWZXJzaW9uKiBxY3YgPSBHZXRWZXJzaW9uRm9yTnVtYmVyKChkaW1lbnNpb24gLSAxNykgPj4gMiwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gcWN2Ow0KK30NCitDQkNfUVJDb2RlclZlcnNpb24qIENCQ19RUkNvZGVyVmVyc2lvbjo6RGVjb2RlVmVyc2lvbkluZm9ybWF0aW9uKA0KKyAgICBpbnQzMl90IHZlcnNpb25CaXRzLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IGJlc3REaWZmZXJlbmNlID0gRlhTWVNfSW50TWF4Ow0KKyAgaW50MzJfdCBiZXN0VmVyc2lvbiA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAzNDsgaSsrKSB7DQorICAgIGludDMyX3QgdGFyZ2V0VmVyc2lvbiA9IFZFUlNJT05fREVDT0RFX0lORk9baV07DQorICAgIGlmICh0YXJnZXRWZXJzaW9uID09IHZlcnNpb25CaXRzKSB7DQorICAgICAgQ0JDX1FSQ29kZXJWZXJzaW9uKiBxY3YgPSBHZXRWZXJzaW9uRm9yTnVtYmVyKGkgKyA3LCBlKTsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgcmV0dXJuIHFjdjsNCisgICAgfQ0KKyAgICBpbnQzMl90IGJpdHNEaWZmZXJlbmNlID0gQ0JDX1FSQ29kZXJGb3JtYXRJbmZvcm1hdGlvbjo6TnVtQml0c0RpZmZlcmluZygNCisgICAgICAgIHZlcnNpb25CaXRzLCB0YXJnZXRWZXJzaW9uKTsNCisgICAgaWYgKGJpdHNEaWZmZXJlbmNlIDwgYmVzdERpZmZlcmVuY2UpIHsNCisgICAgICBiZXN0VmVyc2lvbiA9IGkgKyA3Ow0KKyAgICAgIGJlc3REaWZmZXJlbmNlID0gYml0c0RpZmZlcmVuY2U7DQorICAgIH0NCisgIH0NCisgIGlmIChiZXN0RGlmZmVyZW5jZSA8PSAzKSB7DQorICAgIENCQ19RUkNvZGVyVmVyc2lvbiogcWN2ID0gR2V0VmVyc2lvbkZvck51bWJlcihiZXN0VmVyc2lvbiwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgcmV0dXJuIHFjdjsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitDQkNfQ29tbW9uQml0TWF0cml4KiBDQkNfUVJDb2RlclZlcnNpb246OkJ1aWxkRnVuY3Rpb25QYXR0ZXJuKGludDMyX3QmIGUpIHsNCisgIGludDMyX3QgZGltZW5zaW9uID0gR2V0RGltZW5zaW9uRm9yVmVyc2lvbigpOw0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogYml0TWF0cml4ID0gbmV3IENCQ19Db21tb25CaXRNYXRyaXgoKTsNCisgIGJpdE1hdHJpeC0+SW5pdChkaW1lbnNpb24pOw0KKyAgYml0TWF0cml4LT5TZXRSZWdpb24oMCwgMCwgOSwgOSwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBiaXRNYXRyaXgtPlNldFJlZ2lvbihkaW1lbnNpb24gLSA4LCAwLCA4LCA5LCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIGJpdE1hdHJpeC0+U2V0UmVnaW9uKDAsIGRpbWVuc2lvbiAtIDgsIDksIDgsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgaW50MzJfdCBtYXggPSBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IG1heDsgeCsrKSB7DQorICAgIGludDMyX3QgaSA9IG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnNbeF0gLSAyOw0KKyAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBtYXg7IHkrKykgew0KKyAgICAgIGlmICgoeCA9PSAwICYmICh5ID09IDAgfHwgeSA9PSBtYXggLSAxKSkgfHwgKHggPT0gbWF4IC0gMSAmJiB5ID09IDApKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgYml0TWF0cml4LT5TZXRSZWdpb24obV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVyc1t5XSAtIDIsIGksIDUsIDUsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgfQ0KKyAgfQ0KKyAgYml0TWF0cml4LT5TZXRSZWdpb24oNiwgOSwgMSwgZGltZW5zaW9uIC0gMTcsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgYml0TWF0cml4LT5TZXRSZWdpb24oOSwgNiwgZGltZW5zaW9uIC0gMTcsIDEsIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgaWYgKG1fdmVyc2lvbk51bWJlciA+IDYpIHsNCisgICAgYml0TWF0cml4LT5TZXRSZWdpb24oZGltZW5zaW9uIC0gMTEsIDAsIDMsIDYsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgIGJpdE1hdHJpeC0+U2V0UmVnaW9uKDAsIGRpbWVuc2lvbiAtIDExLCA2LCAzLCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgfQ0KKyAgcmV0dXJuIGJpdE1hdHJpeDsNCit9DQorQ0JDX1FSQ29kZXJWZXJzaW9uKiBDQkNfUVJDb2RlclZlcnNpb246OkdldFZlcnNpb25Gb3JOdW1iZXIoDQorICAgIGludDMyX3QgdmVyc2lvbk51bWJlciwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKFZFUlNJT04tPkdldFNpemUoKSA9PSAwKSB7DQorICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgMSwgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoNywgbmV3IENCQ19RUkNvZGVyRUNCKDEsIDE5KSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygxMCwgbmV3IENCQ19RUkNvZGVyRUNCKDEsIDE2KSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygxMywgbmV3IENCQ19RUkNvZGVyRUNCKDEsIDEzKSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygxNywgbmV3IENCQ19RUkNvZGVyRUNCKDEsIDkpKSkpOw0KKyAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigNCisgICAgICAgIDIsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDEwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMSwgMzQpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDE2LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMSwgMjgpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDIyLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMSwgMjIpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMSwgMTYpKSkpOw0KKyAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigNCisgICAgICAgIDMsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDE1LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMSwgNTUpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMSwgNDQpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDE4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTcpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDIyLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTMpKSkpOw0KKyAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigNCisgICAgICAgIDQsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDIwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMSwgODApKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDE4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMiwgMzIpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMiwgMjQpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDE2LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNCwgOSkpKSk7DQorICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgNSwgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIG5ldyBDQkNfUVJDb2RlckVDQigxLCAxMDgpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMiwgNDMpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDE4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDIsIDE2KSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyMiwgbmV3IENCQ19RUkNvZGVyRUNCKDIsIDExKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigyLCAxMikpKSk7DQorICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgNiwgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMTgsIG5ldyBDQkNfUVJDb2RlckVDQigyLCA2OCkpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMTYsIG5ldyBDQkNfUVJDb2RlckVDQig0LCAyNykpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjQsIG5ldyBDQkNfUVJDb2RlckVDQig0LCAxOSkpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQig0LCAxNSkpKSk7DQorICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgNywgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjAsIG5ldyBDQkNfUVJDb2RlckVDQigyLCA3OCkpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMTgsIG5ldyBDQkNfUVJDb2RlckVDQig0LCAzMSkpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMTgsIG5ldyBDQkNfUVJDb2RlckVDQigyLCAxNCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTUpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDEsIDE0KSkpKTsNCisgICAgVkVSU0lPTi0+QWRkKG5ldyBDQkNfUVJDb2RlclZlcnNpb24oDQorICAgICAgICA4LCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNCwgbmV3IENCQ19RUkNvZGVyRUNCKDIsIDk3KSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyMiwgbmV3IENCQ19RUkNvZGVyRUNCKDIsIDM4KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigyLCAzOSkpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjIsIG5ldyBDQkNfUVJDb2RlckVDQig0LCAxOCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTkpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDIsIDE1KSkpKTsNCisgICAgVkVSU0lPTi0+QWRkKG5ldyBDQkNfUVJDb2RlclZlcnNpb24oDQorICAgICAgICA5LCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDIsIDExNikpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjIsIG5ldyBDQkNfUVJDb2RlckVDQigzLCAzNiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMiwgMzcpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDIwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTYpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDQsIDE3KSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNCwgbmV3IENCQ19RUkNvZGVyRUNCKDQsIDEyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig0LCAxMykpKSk7DQorICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgMTAsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDE4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMiwgNjgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigyLCA2OSkpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIG5ldyBDQkNfUVJDb2RlckVDQig0LCA0MyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMSwgNDQpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNiwgMTkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDIsIDIwKSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgbmV3IENCQ19RUkNvZGVyRUNCKDYsIDE1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigyLCAxNikpKSk7DQorICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgMTEsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDIwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNCwgODEpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMSwgNTApLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDQsIDUxKSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgbmV3IENCQ19RUkNvZGVyRUNCKDQsIDIyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig0LCAyMykpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjQsIG5ldyBDQkNfUVJDb2RlckVDQigzLCAxMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoOCwgMTMpKSkpOw0KKyAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigNCisgICAgICAgIDEyLCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNCwgbmV3IENCQ19RUkNvZGVyRUNCKDIsIDkyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMiwgOTMpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDIyLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNiwgMzYpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDIsIDM3KSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNiwgbmV3IENCQ19RUkNvZGVyRUNCKDQsIDIwKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig2LCAyMSkpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQig3LCAxNCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTUpKSkpOw0KKyAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigNCisgICAgICAgIDEzLCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNiwgbmV3IENCQ19RUkNvZGVyRUNCKDQsIDEwNykpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjIsIG5ldyBDQkNfUVJDb2RlckVDQig4LCAzNyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMSwgMzgpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoOCwgMjApLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDQsIDIxKSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyMiwgbmV3IENCQ19RUkNvZGVyRUNCKDEyLCAxMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTIpKSkpOw0KKyAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigNCisgICAgICAgIDE0LCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDMsIDExNSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDEsIDExNikpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjQsIG5ldyBDQkNfUVJDb2RlckVDQig0LCA0MCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNSwgNDEpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDIwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTEsIDE2KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig1LCAxNykpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjQsIG5ldyBDQkNfUVJDb2RlckVDQigxMSwgMTIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDUsIDEzKSkpKTsNCisgICAgVkVSU0lPTi0+QWRkKG5ldyBDQkNfUVJDb2RlclZlcnNpb24oDQorICAgICAgICAxNSwgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjIsIG5ldyBDQkNfUVJDb2RlckVDQig1LCA4NyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDEsIDg4KSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNCwgbmV3IENCQ19RUkNvZGVyRUNCKDUsIDQxKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig1LCA0MikpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQig1LCAyNCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNywgMjUpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTEsIDEyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig3LCAxMykpKSk7DQorICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgMTYsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNSwgOTgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxLCA5OSkpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQig3LCA0NSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMywgNDYpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTUsIDE5KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigyLCAyMCkpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigzLCAxNSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTMsIDE2KSkpKTsNCisgICAgVkVSU0lPTi0+QWRkKG5ldyBDQkNfUVJDb2RlclZlcnNpb24oDQorICAgICAgICAxNywgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQigxLCAxMDcpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig1LCAxMDgpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTAsIDQ2KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxLCA0NykpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQigxLCAyMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTUsIDIzKSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgbmV3IENCQ19RUkNvZGVyRUNCKDIsIDE0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxNywgMTUpKSkpOw0KKyAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigNCisgICAgICAgIDE4LCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDUsIDEyMCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDEsIDEyMSkpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIG5ldyBDQkNfUVJDb2RlckVDQig5LCA0MyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNCwgNDQpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTcsIDIyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxLCAyMykpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQigyLCAxNCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTksIDE1KSkpKTsNCisgICAgVkVSU0lPTi0+QWRkKG5ldyBDQkNfUVJDb2RlclZlcnNpb24oDQorICAgICAgICAxOSwgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQigzLCAxMTMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig0LCAxMTQpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMywgNDQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDExLCA0NSkpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIG5ldyBDQkNfUVJDb2RlckVDQigxNywgMjEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDQsIDIyKSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNiwgbmV3IENCQ19RUkNvZGVyRUNCKDksIDEzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxNiwgMTQpKSkpOw0KKyAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigNCisgICAgICAgIDIwLCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgbmV3IENCQ19RUkNvZGVyRUNCKDMsIDEwNyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDUsIDEwOCkpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIG5ldyBDQkNfUVJDb2RlckVDQigzLCA0MSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTMsIDQyKSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDE1LCAyNCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNSwgMjUpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTUsIDE1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxMCwgMTYpKSkpOw0KKyAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigNCisgICAgICAgIDIxLCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgbmV3IENCQ19RUkNvZGVyRUNCKDQsIDExNiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDQsIDExNykpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIG5ldyBDQkNfUVJDb2RlckVDQigxNywgNDIpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTcsIDIyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig2LCAyMykpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigxOSwgMTYpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDYsIDE3KSkpKTsNCisgICAgVkVSU0lPTi0+QWRkKG5ldyBDQkNfUVJDb2RlclZlcnNpb24oDQorICAgICAgICAyMiwgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQigyLCAxMTEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig3LCAxMTIpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTcsIDQ2KSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDcsIDI0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxNiwgMjUpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMzQsIDEzKSkpKTsNCisgICAgVkVSU0lPTi0+QWRkKG5ldyBDQkNfUVJDb2RlclZlcnNpb24oDQorICAgICAgICAyMywgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQig0LCAxMjEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig1LCAxMjIpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNCwgNDcpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDE0LCA0OCkpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigxMSwgMjQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDE0LCAyNSkpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigxNiwgMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDE0LCAxNikpKSk7DQorICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgMjQsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNiwgMTE3KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTE4KSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgbmV3IENCQ19RUkNvZGVyRUNCKDYsIDQ1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxNCwgNDYpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTEsIDI0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxNiwgMjUpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMzAsIDE2KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigyLCAxNykpKSk7DQorICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgMjUsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoOCwgMTA2KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTA3KSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgbmV3IENCQ19RUkNvZGVyRUNCKDgsIDQ3KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxMywgNDgpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNywgMjQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDIyLCAyNSkpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigyMiwgMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDEzLCAxNikpKSk7DQorICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgMjYsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTAsIDExNCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDIsIDExNSkpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQigxOSwgNDYpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDQsIDQ3KSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgbmV3IENCQ19RUkNvZGVyRUNCKDI4LCAyMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNiwgMjMpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMzMsIDE2KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig0LCAxNykpKSk7DQorICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgMjcsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoOCwgMTIyKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTIzKSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgbmV3IENCQ19RUkNvZGVyRUNCKDIyLCA0NSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMywgNDYpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoOCwgMjMpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDI2LCAyNCkpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigxMiwgMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDI4LCAxNikpKSk7DQorICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgMjgsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMywgMTE3KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTAsIDExOCkpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQigzLCA0NSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMjMsIDQ2KSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDQsIDI0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigzMSwgMjUpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTEsIDE1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigzMSwgMTYpKSkpOw0KKyAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigNCisgICAgICAgIDI5LCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDcsIDExNiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDcsIDExNykpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQigyMSwgNDUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDcsIDQ2KSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDEsIDIzKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigzNywgMjQpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTksIDE1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigyNiwgMTYpKSkpOw0KKyAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigNCisgICAgICAgIDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDUsIDExNSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDEwLCAxMTYpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTksIDQ3KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxMCwgNDgpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTUsIDI0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigyNSwgMjUpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMjMsIDE1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigyNSwgMTYpKSkpOw0KKyAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigNCisgICAgICAgIDMxLCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDEzLCAxMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigzLCAxMTYpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMiwgNDYpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDI5LCA0NykpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQig0MiwgMjQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDEsIDI1KSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDIzLCAxNSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMjgsIDE2KSkpKTsNCisgICAgVkVSU0lPTi0+QWRkKG5ldyBDQkNfUVJDb2RlclZlcnNpb24oDQorICAgICAgICAzMiwgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigxNywgMTE1KSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgbmV3IENCQ19RUkNvZGVyRUNCKDEwLCA0NiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMjMsIDQ3KSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDEwLCAyNCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMzUsIDI1KSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDE5LCAxNSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMzUsIDE2KSkpKTsNCisgICAgVkVSU0lPTi0+QWRkKG5ldyBDQkNfUVJDb2RlclZlcnNpb24oDQorICAgICAgICAzMywgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigxNywgMTE1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMSwgMTE2KSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgbmV3IENCQ19RUkNvZGVyRUNCKDE0LCA0NiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMjEsIDQ3KSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDI5LCAyNCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTksIDI1KSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDExLCAxNSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNDYsIDE2KSkpKTsNCisgICAgVkVSU0lPTi0+QWRkKG5ldyBDQkNfUVJDb2RlclZlcnNpb24oDQorICAgICAgICAzNCwgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigxMywgMTE1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNiwgMTE2KSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgbmV3IENCQ19RUkNvZGVyRUNCKDE0LCA0NiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMjMsIDQ3KSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDQ0LCAyNCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNywgMjUpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNTksIDE2KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxLCAxNykpKSk7DQorICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgMzUsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTIsIDEyMSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDcsIDEyMikpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQigxMiwgNDcpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDI2LCA0OCkpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigzOSwgMjQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDE0LCAyNSkpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigyMiwgMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDQxLCAxNikpKSk7DQorICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgMzYsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNiwgMTIxKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTQsIDEyMikpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQig2LCA0NyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMzQsIDQ4KSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDQ2LCAyNCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTAsIDI1KSksDQorICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDIsIDE1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig2NCwgMTYpKSkpOw0KKyAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigNCisgICAgICAgIDM3LCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDE3LCAxMjIpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig0LCAxMjMpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMjksIDQ2KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxNCwgNDcpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNDksIDI0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxMCwgMjUpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMjQsIDE1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig0NiwgMTYpKSkpOw0KKyAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigNCisgICAgICAgIDM4LCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDQsIDEyMiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDE4LCAxMjMpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTMsIDQ2KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigzMiwgNDcpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNDgsIDI0KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxNCwgMjUpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNDIsIDE1KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigzMiwgMTYpKSkpOw0KKyAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigNCisgICAgICAgIDM5LCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDIwLCAxMTcpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig0LCAxMTgpKSwNCisgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNDAsIDQ3KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig3LCA0OCkpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQig0MywgMjQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDIyLCAyNSkpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigxMCwgMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDY3LCAxNikpKSk7DQorICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKA0KKyAgICAgICAgNDAsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTksIDExOCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDYsIDExOSkpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQigxOCwgNDcpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDMxLCA0OCkpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigzNCwgMjQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDM0LCAyNSkpLA0KKyAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigyMCwgMTUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDYxLCAxNikpKSk7DQorICB9DQorICBpZiAodmVyc2lvbk51bWJlciA8IDEgfHwgdmVyc2lvbk51bWJlciA+IDQwKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgfQ0KKyAgcmV0dXJuIChDQkNfUVJDb2RlclZlcnNpb24qKSgqVkVSU0lPTilbdmVyc2lvbk51bWJlciAtIDFdOw0KK30NCit2b2lkIENCQ19RUkNvZGVyVmVyc2lvbjo6RGVzdHJveSgpIHsNCisgIGludDMyX3QgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBWRVJTSU9OLT5HZXRTaXplKCk7IGkrKykgew0KKyAgICBkZWxldGUgKChDQkNfUVJDb2RlclZlcnNpb24qKSgqVkVSU0lPTilbaV0pOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlclZlcnNpb24uaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyVmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZjUxZTEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlclZlcnNpb24uaApAQCAtMCwwICsxLDQ5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1FSQ09ERVJWRVJTSU9OX0hfDQorI2RlZmluZSBfQkNfUVJDT0RFUlZFUlNJT05fSF8NCitjbGFzcyBDQkNfUVJDb2RlckVDQmxvY2tzOw0KK2NsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQorY2xhc3MgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDsNCitjbGFzcyBDQkNfUVJDb2RlclZlcnNpb24gew0KKyBwcml2YXRlOg0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgVkVSU0lPTl9ERUNPREVfSU5GT1szNF07DQorICBzdGF0aWMgQ0ZYX1B0ckFycmF5KiBWRVJTSU9OOw0KKyAgaW50MzJfdCBtX3ZlcnNpb25OdW1iZXI7DQorICBpbnQzMl90IG1fdG90YWxDb2RlV29yZHM7DQorICBDRlhfSW50MzJBcnJheSBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzOw0KKyAgQ0ZYX1B0ckFycmF5IG1fZWNCbG9ja3M7DQorDQorICBDQkNfUVJDb2RlclZlcnNpb24oKTsNCisgIENCQ19RUkNvZGVyVmVyc2lvbihpbnQzMl90IHZlcnNpb25OdW1iZXIsDQorICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFQ0Jsb2NrcyogZWNCbG9ja3MxLA0KKyAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRUNCbG9ja3MqIGVjQmxvY2tzMiwNCisgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVDQmxvY2tzKiBlY0Jsb2NrczMsDQorICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFQ0Jsb2NrcyogZWNCbG9ja3M0KTsNCisNCisgcHVibGljOg0KKyAgdmlydHVhbCB+Q0JDX1FSQ29kZXJWZXJzaW9uKCk7DQorICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKCk7DQorICBzdGF0aWMgdm9pZCBGaW5hbGl6ZSgpOw0KKw0KKyAgaW50MzJfdCBHZXRWZXJzaW9uTnVtYmVyKCk7DQorICBpbnQzMl90IEdldFRvdGFsQ29kZVdvcmRzKCk7DQorICBpbnQzMl90IEdldERpbWVuc2lvbkZvclZlcnNpb24oKTsNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIEJ1aWxkRnVuY3Rpb25QYXR0ZXJuKGludDMyX3QmIGUpOw0KKyAgQ0ZYX0ludDMyQXJyYXkqIEdldEFsaWdubWVudFBhdHRlcm5DZW50ZXJzKCk7DQorICBDQkNfUVJDb2RlckVDQmxvY2tzKiBHZXRFQ0Jsb2Nrc0ZvckxldmVsKA0KKyAgICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwpOw0KKyAgc3RhdGljIENCQ19RUkNvZGVyVmVyc2lvbiogR2V0VmVyc2lvbkZvck51bWJlcihpbnQzMl90IHZlcnNpb25OdW1iZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIENCQ19RUkNvZGVyVmVyc2lvbiogR2V0UHJvdmlzaW9uYWxWZXJzaW9uRm9yRGltZW5zaW9uKA0KKyAgICAgIGludDMyX3QgZGltZW5zaW9uLA0KKyAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIENCQ19RUkNvZGVyVmVyc2lvbiogRGVjb2RlVmVyc2lvbkluZm9ybWF0aW9uKGludDMyX3QgdmVyc2lvbkJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCBEZXN0cm95KCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEYXRhQmxvY2suY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGF0YUJsb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGE3YjUzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGF0YUJsb2NrLmNwcApAQCAtMCwwICsxLDExMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgIkJDX1FSQ29kZXJFQ0Jsb2Nrcy5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVyRUNCLmgiDQorI2luY2x1ZGUgIkJDX1FSRGF0YUJsb2NrLmgiDQorI2luY2x1ZGUgIkJDX1FSQ29kZXJWZXJzaW9uLmgiDQorQ0JDX1FSRGF0YUJsb2NrOjpDQkNfUVJEYXRhQmxvY2soaW50MzJfdCBudW1EYXRhQ29kZXdvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlQXJyYXkqIGNvZGV3b3JkcykNCisgICAgOiBtX251bURhdGFDb2Rld29yZHMobnVtRGF0YUNvZGV3b3JkcyksIG1fY29kZXdvcmRzKGNvZGV3b3Jkcykge30NCitDQkNfUVJEYXRhQmxvY2s6On5DQkNfUVJEYXRhQmxvY2soKSB7DQorICBpZiAobV9jb2Rld29yZHMgIT0gTlVMTCkgew0KKyAgICBkZWxldGUgbV9jb2Rld29yZHM7DQorICAgIG1fY29kZXdvcmRzID0gTlVMTDsNCisgIH0NCit9DQoraW50MzJfdCBDQkNfUVJEYXRhQmxvY2s6OkdldE51bURhdGFDb2Rld29yZHMoKSB7DQorICByZXR1cm4gbV9udW1EYXRhQ29kZXdvcmRzOw0KK30NCitDRlhfQnl0ZUFycmF5KiBDQkNfUVJEYXRhQmxvY2s6OkdldENvZGV3b3JkcygpIHsNCisgIHJldHVybiBtX2NvZGV3b3JkczsNCit9DQorQ0ZYX1B0ckFycmF5KiBDQkNfUVJEYXRhQmxvY2s6OkdldERhdGFCbG9ja3MoDQorICAgIENGWF9CeXRlQXJyYXkqIHJhd0NvZGV3b3JkcywNCisgICAgQ0JDX1FSQ29kZXJWZXJzaW9uKiB2ZXJzaW9uLA0KKyAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpZiAocmF3Q29kZXdvcmRzLT5HZXRTaXplKCkgIT0gdmVyc2lvbi0+R2V0VG90YWxDb2RlV29yZHMoKSkgew0KKyAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIH0NCisgIENCQ19RUkNvZGVyRUNCbG9ja3MqIGVjQmxvY2tzID0gdmVyc2lvbi0+R2V0RUNCbG9ja3NGb3JMZXZlbChlY0xldmVsKTsNCisgIGludDMyX3QgdG90YWxCbG9ja3MgPSAwOw0KKyAgQ0ZYX1B0ckFycmF5KiBlY0Jsb2NrQXJyYXkgPSBlY0Jsb2Nrcy0+R2V0RUNCbG9ja3MoKTsNCisgIGludDMyX3QgaSA9IDA7DQorICBmb3IgKGkgPSAwOyBpIDwgZWNCbG9ja0FycmF5LT5HZXRTaXplKCk7IGkrKykgew0KKyAgICB0b3RhbEJsb2NrcyArPSAoKENCQ19RUkNvZGVyRUNCKikoKmVjQmxvY2tBcnJheSlbaV0pLT5HZXRDb3VudCgpOw0KKyAgfQ0KKyAgQ0ZYX1B0ckFycmF5KiBkYXRhYmxvY2sgPSBuZXcgQ0ZYX1B0ckFycmF5KCk7DQorICBkYXRhYmxvY2stPlNldFNpemUodG90YWxCbG9ja3MpOw0KKyAgQ0JDX0F1dG9QdHI8Q0ZYX1B0ckFycmF5PiByZXN1bHQoZGF0YWJsb2NrKTsNCisgIGludDMyX3QgbnVtUmVzdWx0QmxvY2tzID0gMDsNCisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGVjQmxvY2tBcnJheS0+R2V0U2l6ZSgpOyBqKyspIHsNCisgICAgQ0JDX1FSQ29kZXJFQ0IqIGVjQmxvY2sgPSAoQ0JDX1FSQ29kZXJFQ0IqKSgqZWNCbG9ja0FycmF5KVtqXTsNCisgICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgZWNCbG9jay0+R2V0Q291bnQoKTsgaysrKSB7DQorICAgICAgaW50MzJfdCBudW1EYXRhQ29kZXdvcmRzID0gZWNCbG9jay0+R2V0RGF0YUNvZGVXb3JkcygpOw0KKyAgICAgIGludDMyX3QgbnVtQmxvY2tDb2Rld29yZHMgPQ0KKyAgICAgICAgICBlY0Jsb2Nrcy0+R2V0RUNDb2RlV29yZHNQZXJCbG9jaygpICsgbnVtRGF0YUNvZGV3b3JkczsNCisgICAgICBDRlhfQnl0ZUFycmF5KiBieXRlYXJyYXkgPSBuZXcgQ0ZYX0J5dGVBcnJheSgpOw0KKyAgICAgIGJ5dGVhcnJheS0+U2V0U2l6ZShudW1CbG9ja0NvZGV3b3Jkcyk7DQorICAgICAgKCpyZXN1bHQpW251bVJlc3VsdEJsb2NrcysrXSA9DQorICAgICAgICAgIG5ldyBDQkNfUVJEYXRhQmxvY2sobnVtRGF0YUNvZGV3b3JkcywgYnl0ZWFycmF5KTsNCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBzaG9ydGVyQmxvY2tzVG90YWxDb2Rld29yZHMgPQ0KKyAgICAgICgoQ0JDX1FSRGF0YUJsb2NrKikoKnJlc3VsdClbMF0pLT5tX2NvZGV3b3Jkcy0+R2V0U2l6ZSgpOw0KKyAgaW50MzJfdCBsb25nZXJCbG9ja3NTdGFydEF0ID0gcmVzdWx0LT5HZXRTaXplKCkgLSAxOw0KKyAgd2hpbGUgKGxvbmdlckJsb2Nrc1N0YXJ0QXQgPj0gMCkgew0KKyAgICBpbnQzMl90IG51bUNvZGV3b3JkcyA9ICgoQ0JDX1FSRGF0YUJsb2NrKikoKnJlc3VsdClbbG9uZ2VyQmxvY2tzU3RhcnRBdF0pDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+bV9jb2Rld29yZHMtPkdldFNpemUoKTsNCisgICAgaWYgKG51bUNvZGV3b3JkcyA9PSBzaG9ydGVyQmxvY2tzVG90YWxDb2Rld29yZHMpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBsb25nZXJCbG9ja3NTdGFydEF0LS07DQorICB9DQorICBsb25nZXJCbG9ja3NTdGFydEF0Kys7DQorICBpbnQzMl90IHNob3J0ZXJCbG9ja3NOdW1EYXRhQ29kZXdvcmRzID0NCisgICAgICBzaG9ydGVyQmxvY2tzVG90YWxDb2Rld29yZHMgLSBlY0Jsb2Nrcy0+R2V0RUNDb2RlV29yZHNQZXJCbG9jaygpOw0KKyAgaW50MzJfdCByYXdDb2Rld29yZHNPZmZzZXQgPSAwOw0KKyAgaW50MzJfdCB4ID0gMDsNCisgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IHNob3J0ZXJCbG9ja3NOdW1EYXRhQ29kZXdvcmRzOyBrKyspIHsNCisgICAgZm9yICh4ID0gMDsgeCA8IG51bVJlc3VsdEJsb2NrczsgeCsrKSB7DQorICAgICAgKCooKChDQkNfUVJEYXRhQmxvY2sqKSgqcmVzdWx0KVt4XSktPm1fY29kZXdvcmRzKSlba10gPQ0KKyAgICAgICAgICAoKnJhd0NvZGV3b3JkcylbcmF3Q29kZXdvcmRzT2Zmc2V0KytdOw0KKyAgICB9DQorICB9DQorICBmb3IgKHggPSBsb25nZXJCbG9ja3NTdGFydEF0OyB4IDwgbnVtUmVzdWx0QmxvY2tzOyB4KyspIHsNCisgICAgKCooKChDQkNfUVJEYXRhQmxvY2sqKSgqcmVzdWx0KVt4XSkNCisgICAgICAgICAgIC0+bV9jb2Rld29yZHMpKVtzaG9ydGVyQmxvY2tzTnVtRGF0YUNvZGV3b3Jkc10gPQ0KKyAgICAgICAgKCpyYXdDb2Rld29yZHMpW3Jhd0NvZGV3b3Jkc09mZnNldCsrXTsNCisgIH0NCisgIGludDMyX3QgbWF4ID0gKChDQkNfUVJEYXRhQmxvY2sqKSgqcmVzdWx0KVswXSktPm1fY29kZXdvcmRzLT5HZXRTaXplKCk7DQorICBmb3IgKGkgPSBzaG9ydGVyQmxvY2tzTnVtRGF0YUNvZGV3b3JkczsgaSA8IG1heDsgaSsrKSB7DQorICAgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IG51bVJlc3VsdEJsb2NrczsgeSsrKSB7DQorICAgICAgaW50MzJfdCBpT2Zmc2V0ID0geSA8IGxvbmdlckJsb2Nrc1N0YXJ0QXQgPyBpIDogaSArIDE7DQorICAgICAgKCooKChDQkNfUVJEYXRhQmxvY2sqKSgqcmVzdWx0KVt5XSktPm1fY29kZXdvcmRzKSlbaU9mZnNldF0gPQ0KKyAgICAgICAgICAoKnJhd0NvZGV3b3JkcylbcmF3Q29kZXdvcmRzT2Zmc2V0KytdOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gcmVzdWx0LnJlbGVhc2UoKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGF0YUJsb2NrLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEYXRhQmxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGYxYWRhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGF0YUJsb2NrLmgKQEAgLTAsMCArMSwyOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19RUkRBVEFCTE9DS19IXw0KKyNkZWZpbmUgX0JDX1FSREFUQUJMT0NLX0hfDQorY2xhc3MgQ0JDX1FSQ29kZXJWZXJzaW9uOw0KK2NsYXNzIENCQ19RUkNvZGVyRUNCbG9ja3M7DQorY2xhc3MgQ0JDX1FSQ29kZXJFQ0I7DQorY2xhc3MgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDsNCitjbGFzcyBDQkNfUVJEYXRhQmxvY2sgew0KKyBwcml2YXRlOg0KKyAgaW50MzJfdCBtX251bURhdGFDb2Rld29yZHM7DQorICBDRlhfQnl0ZUFycmF5KiBtX2NvZGV3b3JkczsNCisgIENCQ19RUkRhdGFCbG9jayhpbnQzMl90IG51bURhdGFDb2Rld29yZHMsIENGWF9CeXRlQXJyYXkqIGNvZGV3b3Jkcyk7DQorDQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfkNCQ19RUkRhdGFCbG9jaygpOw0KKyAgaW50MzJfdCBHZXROdW1EYXRhQ29kZXdvcmRzKCk7DQorICBDRlhfQnl0ZUFycmF5KiBHZXRDb2Rld29yZHMoKTsNCisgIHN0YXRpYyBDRlhfUHRyQXJyYXkqIEdldERhdGFCbG9ja3MoQ0ZYX0J5dGVBcnJheSogcmF3Q29kZXdvcmRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlclZlcnNpb24qIHZlcnNpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGF0YU1hc2suY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGF0YU1hc2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjVjZTQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEYXRhTWFzay5jcHAKQEAgLTAsMCArMSwxMTYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgiDQorI2luY2x1ZGUgIkJDX1FSRGF0YU1hc2suaCINCitzdGF0aWMgaW50MzJfdCBOX0RBVEFfTUFTS1MgPSAwOw0KK0NGWF9QdHJBcnJheSogQ0JDX1FSRGF0YU1hc2s6OkRBVEFfTUFTS1MgPSBOVUxMOw0KK3ZvaWQgQ0JDX1FSRGF0YU1hc2s6OkluaXRpYWxpemUoKSB7DQorICBEQVRBX01BU0tTID0gbmV3IENGWF9QdHJBcnJheSgpOw0KKyAgTl9EQVRBX01BU0tTID0gQnVpbGREYXRhTWFza3MoKTsNCit9DQordm9pZCBDQkNfUVJEYXRhTWFzazo6RmluYWxpemUoKSB7DQorICBEZXN0cm95KCk7DQorICBkZWxldGUgREFUQV9NQVNLUzsNCit9DQordm9pZCBDQkNfUVJEYXRhTWFzazo6RGVzdHJveSgpIHsNCisgIGludDMyX3QgaTsNCisgIGZvciAoaSA9IDA7IGkgPCBOX0RBVEFfTUFTS1M7IGkrKykgew0KKyAgICBDQkNfUVJEYXRhTWFzayogcCA9IChDQkNfUVJEYXRhTWFzayopKCpEQVRBX01BU0tTKVtpXTsNCisgICAgaWYgKHApIHsNCisgICAgICBkZWxldGUgcDsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENCQ19RUkRhdGFNYXNrOjpVbm1hc2tCaXRNYXRpcngoQ0JDX0NvbW1vbkJpdE1hdHJpeCogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkaW1lbnNpb24pIHsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGRpbWVuc2lvbjsgaSsrKSB7DQorICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGRpbWVuc2lvbjsgaisrKSB7DQorICAgICAgaWYgKElzTWFza2VkKGksIGopKSB7DQorICAgICAgICBiaXRzLT5GbGlwKGosIGkpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KK30NCitDQkNfUVJEYXRhTWFzayogQ0JDX1FSRGF0YU1hc2s6OkZvclJlZmVyZW5jZShpbnQzMl90IHJlZmVyZW5jZSwgaW50MzJfdCYgZSkgew0KKyAgaWYgKHJlZmVyZW5jZSA8IDAgfHwgcmVmZXJlbmNlID4gNykgew0KKyAgICBlID0gQkNFeGNlcHRpb25SZWZlcmVuY2VNdXN0QmVCZXR3ZWVuMEFuZDc7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIH0NCisgIHJldHVybiAoQ0JDX1FSRGF0YU1hc2sqKSgqREFUQV9NQVNLUylbcmVmZXJlbmNlXTsNCit9DQorY2xhc3MgRGF0YU1hc2swMDAgOiBwdWJsaWMgQ0JDX1FSRGF0YU1hc2sgew0KKyBwdWJsaWM6DQorICBGWF9CT09MIElzTWFza2VkKGludDMyX3QgeCwgaW50MzJfdCB5KSB7IHJldHVybiAoKHggKyB5KSAlIDIpID09IDA7IH0NCit9Ow0KK2NsYXNzIERhdGFNYXNrMDAxIDogcHVibGljIENCQ19RUkRhdGFNYXNrIHsNCisgcHVibGljOg0KKyAgRlhfQk9PTCBJc01hc2tlZChpbnQzMl90IHgsIGludDMyX3QgeSkgeyByZXR1cm4gKHggJSAyKSA9PSAwOyB9DQorfTsNCitjbGFzcyBEYXRhTWFzazAxMCA6IHB1YmxpYyBDQkNfUVJEYXRhTWFzayB7DQorIHB1YmxpYzoNCisgIEZYX0JPT0wgSXNNYXNrZWQoaW50MzJfdCB4LCBpbnQzMl90IHkpIHsgcmV0dXJuIHkgJSAzID09IDA7IH0NCit9Ow0KK2NsYXNzIERhdGFNYXNrMDExIDogcHVibGljIENCQ19RUkRhdGFNYXNrIHsNCisgcHVibGljOg0KKyAgRlhfQk9PTCBJc01hc2tlZChpbnQzMl90IHgsIGludDMyX3QgeSkgeyByZXR1cm4gKHggKyB5KSAlIDMgPT0gMDsgfQ0KK307DQorY2xhc3MgRGF0YU1hc2sxMDAgOiBwdWJsaWMgQ0JDX1FSRGF0YU1hc2sgew0KKyBwdWJsaWM6DQorICBGWF9CT09MIElzTWFza2VkKGludDMyX3QgeCwgaW50MzJfdCB5KSB7DQorICAgIHJldHVybiAoKCh4ID4+IDEpICsgKHkgLyAzKSkgJSAyKSA9PSAwOw0KKyAgfQ0KK307DQorY2xhc3MgRGF0YU1hc2sxMDEgOiBwdWJsaWMgQ0JDX1FSRGF0YU1hc2sgew0KKyBwdWJsaWM6DQorICBGWF9CT09MIElzTWFza2VkKGludDMyX3QgeCwgaW50MzJfdCB5KSB7DQorICAgIHNpemVfdCB0ZW1wID0geCAqIHk7DQorICAgIHJldHVybiAodGVtcCAlIDIpICsgKHRlbXAgJSAzKSA9PSAwOw0KKyAgfQ0KK307DQorY2xhc3MgRGF0YU1hc2sxMTAgOiBwdWJsaWMgQ0JDX1FSRGF0YU1hc2sgew0KKyBwdWJsaWM6DQorICBGWF9CT09MIElzTWFza2VkKGludDMyX3QgeCwgaW50MzJfdCB5KSB7DQorICAgIHNpemVfdCB0ZW1wID0geCAqIHk7DQorICAgIHJldHVybiAoKCh0ZW1wICUgMikgKyAodGVtcCAlIDMpKSAlIDIpID09IDA7DQorICB9DQorfTsNCitjbGFzcyBEYXRhTWFzazExMSA6IHB1YmxpYyBDQkNfUVJEYXRhTWFzayB7DQorIHB1YmxpYzoNCisgIEZYX0JPT0wgSXNNYXNrZWQoaW50MzJfdCB4LCBpbnQzMl90IHkpIHsNCisgICAgcmV0dXJuICgoKCh4ICsgeSkgJSAyKSArICgoeCAqIHkpICUgMykpICUgMikgPT0gMDsNCisgIH0NCit9Ow0KK2ludDMyX3QgQ0JDX1FSRGF0YU1hc2s6OkJ1aWxkRGF0YU1hc2tzKCkgew0KKyAgREFUQV9NQVNLUy0+QWRkKG5ldyBEYXRhTWFzazAwMCk7DQorICBEQVRBX01BU0tTLT5BZGQobmV3IERhdGFNYXNrMDAxKTsNCisgIERBVEFfTUFTS1MtPkFkZChuZXcgRGF0YU1hc2swMTApOw0KKyAgREFUQV9NQVNLUy0+QWRkKG5ldyBEYXRhTWFzazAxMSk7DQorICBEQVRBX01BU0tTLT5BZGQobmV3IERhdGFNYXNrMTAwKTsNCisgIERBVEFfTUFTS1MtPkFkZChuZXcgRGF0YU1hc2sxMDEpOw0KKyAgREFUQV9NQVNLUy0+QWRkKG5ldyBEYXRhTWFzazExMCk7DQorICBEQVRBX01BU0tTLT5BZGQobmV3IERhdGFNYXNrMTExKTsNCisgIHJldHVybiBEQVRBX01BU0tTLT5HZXRTaXplKCk7DQorfQ0KK0NCQ19RUkRhdGFNYXNrOjpDQkNfUVJEYXRhTWFzaygpIHt9DQorQ0JDX1FSRGF0YU1hc2s6On5DQkNfUVJEYXRhTWFzaygpIHt9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGF0YU1hc2suaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRhdGFNYXNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhlMDMyNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRhdGFNYXNrLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19RUkRBVEFNQVNLX0hfDQorI2RlZmluZSBfQkNfUVJEQVRBTUFTS19IXw0KK2NsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQorY2xhc3MgQ0JDX1FSRGF0YU1hc2sgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgQ0ZYX1B0ckFycmF5KiBEQVRBX01BU0tTOw0KKyAgQ0JDX1FSRGF0YU1hc2soKTsNCisgIHZpcnR1YWwgfkNCQ19RUkRhdGFNYXNrKCk7DQorICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKCk7DQorICBzdGF0aWMgdm9pZCBGaW5hbGl6ZSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzTWFza2VkKGludDMyX3QgaSwgaW50MzJfdCBqKSA9IDA7DQorICB2b2lkIFVubWFza0JpdE1hdGlyeChDQkNfQ29tbW9uQml0TWF0cml4KiBiaXRzLCBpbnQzMl90IGRpbWVuc2lvbik7DQorICBzdGF0aWMgQ0JDX1FSRGF0YU1hc2sqIEZvclJlZmVyZW5jZShpbnQzMl90IHJlZmVyZW5jZSwgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgaW50MzJfdCBCdWlsZERhdGFNYXNrcygpOw0KKyAgc3RhdGljIHZvaWQgRGVzdHJveSgpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlci5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEZWNvZGVkQml0U3RyZWFtUGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWE5MjIyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlci5jcHAKQEAgLTAsMCArMSwyNzIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9CQ19VdGlsQ29kaW5nQ29udmVydC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0U291cmNlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25FQ0kuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uRGVjb2RlclJlc3VsdC5oIg0KKyNpbmNsdWRlICJCQ19RUkNvZGVyTW9kZS5oIg0KKyNpbmNsdWRlICJCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCINCitjb25zdCBGWF9DSEFSKiBDQkNfUVJEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpVVEZfOCA9ICJ1dGY4IjsNCitjb25zdCBGWF9DSEFSIENCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkFMUEhBTlVNRVJJQ19DSEFSU1s0NV0gPSB7DQorICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsDQorICAgICdGJywgJ0cnLCAnSCcsICdJJywgJ0onLCAnSycsICdMJywgJ00nLCAnTicsICdPJywgJ1AnLCAnUScsICdSJywgJ1MnLCAnVCcsDQorICAgICdVJywgJ1YnLCAnVycsICdYJywgJ1knLCAnWicsICcgJywgJyQnLCAnJScsICcqJywgJysnLCAnLScsICcuJywgJy8nLCAnOid9Ow0KK0NCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkNCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXIoKSB7fQ0KK0NCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXI6On5DQkNfUVJEZWNvZGVkQml0U3RyZWFtUGFyc2VyKCkge30NCitDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogQ0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6RGVjb2RlKA0KKyAgICBDRlhfQnl0ZUFycmF5KiBieXRlcywNCisgICAgQ0JDX1FSQ29kZXJWZXJzaW9uKiB2ZXJzaW9uLA0KKyAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLA0KKyAgICBpbnQzMl90IGJ5dGVNb2RlRGVjb2RlLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBDQkNfQ29tbW9uQml0U291cmNlIGJpdHMoYnl0ZXMpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0Ow0KKyAgQ0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSSogY3VycmVudENoYXJhY3RlclNldEVDSSA9IE5VTEw7DQorICBGWF9CT09MIGZjMUluZmFjdCA9IEZBTFNFOw0KKyAgQ0ZYX0ludDMyQXJyYXkgYnl0ZVNlZ21lbnRzOw0KKyAgQ0JDX1FSQ29kZXJNb2RlKiBtb2RlID0gTlVMTDsNCisgIGRvIHsNCisgICAgaWYgKGJpdHMuQXZhaWxhYmxlKCkgPCA0KSB7DQorICAgICAgbW9kZSA9IENCQ19RUkNvZGVyTW9kZTo6c1RFUk1JTkFUT1I7DQorICAgIH0gZWxzZSB7DQorICAgICAgaW50MzJfdCBpVGVtcDEgPSBiaXRzLlJlYWRCaXRzKDQsIGUpOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICBtb2RlID0gQ0JDX1FSQ29kZXJNb2RlOjpGb3JCaXRzKGlUZW1wMSwgZSk7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgIGlmIChtb2RlID09IE5VTEwpIHsNCisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvblVuU3VwcG9ydE1vZGU7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmICghKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzVEVSTUlOQVRPUikpIHsNCisgICAgICBpZiAobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNGTkMxX0ZJUlNUX1BPU0lUSU9OIHx8DQorICAgICAgICAgIG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzRk5DMV9TRUNPTkRfUE9TSVRJT04pIHsNCisgICAgICAgIGZjMUluZmFjdCA9IFRSVUU7DQorICAgICAgfSBlbHNlIGlmIChtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c1NUUlVDVFVSRURfQVBQRU5EKSB7DQorICAgICAgICBiaXRzLlJlYWRCaXRzKDE2LCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzRUNJKSB7DQorICAgICAgICBpbnQzMl90IHZhbHVlID0gUGFyc2VFQ0lWYWx1ZSgmYml0cywgZSk7DQorICAgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICAgICAgICBjdXJyZW50Q2hhcmFjdGVyU2V0RUNJID0NCisgICAgICAgICAgICBDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJOjpHZXRDaGFyYWN0ZXJTZXRFQ0lCeVZhbHVlKHZhbHVlKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzR0JLKSB7DQorICAgICAgICAgIGJpdHMuUmVhZEJpdHMoNCwgZSk7DQorICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgIH0NCisgICAgICAgIGludDMyX3QgbnVtQml0cyA9IG1vZGUtPkdldENoYXJhY3RlckNvdW50Qml0cyh2ZXJzaW9uLCBlKTsNCisgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgIGludDMyX3QgY291bnQgPSBiaXRzLlJlYWRCaXRzKG51bUJpdHMsIGUpOw0KKyAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgaWYgKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzTlVNRVJJQykgew0KKyAgICAgICAgICBEZWNvZGVOdW1lcmljU2VnbWVudCgmYml0cywgcmVzdWx0LCBjb3VudCwgZSk7DQorICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNBTFBIQU5VTUVSSUMpIHsNCisgICAgICAgICAgRGVjb2RlQWxwaGFudW1lcmljU2VnbWVudCgmYml0cywgcmVzdWx0LCBjb3VudCwgZmMxSW5mYWN0LCBlKTsNCisgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0JZVEUpIHsNCisgICAgICAgICAgRGVjb2RlQnl0ZVNlZ21lbnQoJmJpdHMsIHJlc3VsdCwgY291bnQsIGN1cnJlbnRDaGFyYWN0ZXJTZXRFQ0ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlU2VnbWVudHMsIGJ5dGVNb2RlRGVjb2RlLCBlKTsNCisgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0dCSykgew0KKyAgICAgICAgICBEZWNvZGVHQktTZWdtZW50KCZiaXRzLCByZXN1bHQsIGNvdW50LCBlKTsNCisgICAgICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0tBTkpJKSB7DQorICAgICAgICAgIERlY29kZUthbmppU2VnbWVudCgmYml0cywgcmVzdWx0LCBjb3VudCwgZSk7DQorICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvblVuU3VwcG9ydE1vZGU7DQorICAgICAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0gd2hpbGUgKCEobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNURVJNSU5BVE9SKSk7DQorICBDQkNfQ29tbW9uRGVjb2RlclJlc3VsdCogdGVtcENkID0gbmV3IENCQ19Db21tb25EZWNvZGVyUmVzdWx0KCk7DQorICB0ZW1wQ2QtPkluaXQoKmJ5dGVzLCByZXN1bHQsIGJ5dGVTZWdtZW50cywgZWNMZXZlbCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gdGVtcENkOw0KK30NCit2b2lkIENCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkRlY29kZUdCS1NlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnVmZmVyOw0KKyAgd2hpbGUgKGNvdW50ID4gMCkgew0KKyAgICBpbnQzMl90IHR3b0J5dGVzID0gYml0cy0+UmVhZEJpdHMoMTMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgaW50MzJfdCBhc3NlbWJsZWRUd29CeXRlcyA9ICgodHdvQnl0ZXMgLyAweDA2MCkgPDwgOCkgfCAodHdvQnl0ZXMgJSAweDA2MCk7DQorICAgIGlmIChhc3NlbWJsZWRUd29CeXRlcyA8PSAweDAwOTVkKSB7DQorICAgICAgYXNzZW1ibGVkVHdvQnl0ZXMgKz0gMHgwYTFhMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBhc3NlbWJsZWRUd29CeXRlcyArPSAweDBhNmExOw0KKyAgICB9DQorICAgIGJ1ZmZlciArPSAodWludDhfdCkoYXNzZW1ibGVkVHdvQnl0ZXMgPj4gOCk7DQorICAgIGJ1ZmZlciArPSAodWludDhfdClhc3NlbWJsZWRUd29CeXRlczsNCisgICAgY291bnQtLTsNCisgIH0NCisgIENCQ19VdGlsQ29kaW5nQ29udmVydDo6TG9jYWxlVG9VdGY4KGJ1ZmZlciwgcmVzdWx0KTsNCit9DQordm9pZCBDQkNfUVJEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpEZWNvZGVLYW5qaVNlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnVmZmVyOw0KKyAgd2hpbGUgKGNvdW50ID4gMCkgew0KKyAgICBpbnQzMl90IHR3b0J5dGVzID0gYml0cy0+UmVhZEJpdHMoMTMsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgaW50MzJfdCBhc3NlbWJsZWRUd29CeXRlcyA9ICgodHdvQnl0ZXMgLyAweDBjMCkgPDwgOCkgfCAodHdvQnl0ZXMgJSAweDBjMCk7DQorICAgIGlmIChhc3NlbWJsZWRUd29CeXRlcyA8PSAweDAxZjAwKSB7DQorICAgICAgYXNzZW1ibGVkVHdvQnl0ZXMgKz0gMHgwODE0MDsNCisgICAgfSBlbHNlIHsNCisgICAgICBhc3NlbWJsZWRUd29CeXRlcyArPSAweDBjMTQwOw0KKyAgICB9DQorICAgIGJ1ZmZlciArPSAodWludDhfdCkoYXNzZW1ibGVkVHdvQnl0ZXMgPj4gOCk7DQorICAgIGJ1ZmZlciArPSAodWludDhfdClhc3NlbWJsZWRUd29CeXRlczsNCisgICAgY291bnQtLTsNCisgIH0NCisgIENCQ19VdGlsQ29kaW5nQ29udmVydDo6TG9jYWxlVG9VdGY4KGJ1ZmZlciwgcmVzdWx0KTsNCit9DQordm9pZCBDQkNfUVJEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpEZWNvZGVCeXRlU2VnbWVudCgNCisgICAgQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywNCisgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCwNCisgICAgaW50MzJfdCBjb3VudCwNCisgICAgQ0JDX0NvbW1vbkNoYXJhY3RlclNldEVDSSogY3VycmVudENoYXJhY3RlclNldEVDSSwNCisgICAgQ0ZYX0ludDMyQXJyYXkqIGJ5dGVTZWdtZW50cywNCisgICAgaW50MzJfdCBieXRlTW9kZURlY29kZSwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgaWYgKGNvdW50IDwgMCkgew0KKyAgICBlID0gQkNFeGNlcHRpb25Ob3RGb3VuZDsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICBpZiAoKGNvdW50IDw8IDMpID4gYml0cy0+QXZhaWxhYmxlKCkpIHsNCisgICAgZSA9IEJDRXhjZXB0aW9uUmVhZDsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICB9DQorICB1aW50OF90KiByZWFkQnl0ZXMgPSBGWF9BbGxvYyh1aW50OF90LCBjb3VudCk7DQorICBGWFNZU19tZW1zZXQocmVhZEJ5dGVzLCAweDAwLCBjb3VudCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7DQorICAgIHJlYWRCeXRlc1tpXSA9ICh1aW50OF90KWJpdHMtPlJlYWRCaXRzKDgsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgIH0NCisgIENGWF9CeXRlU3RyaW5nIGJzKHJlYWRCeXRlcywgY291bnQpOw0KKyAgcmVzdWx0ICs9IGJzOw0KKyAgRlhfRnJlZShyZWFkQnl0ZXMpOw0KK30NCit2b2lkIENCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXI6OkRlY29kZUFscGhhbnVtZXJpY1NlZ21lbnQoDQorICAgIENCQ19Db21tb25CaXRTb3VyY2UqIGJpdHMsDQorICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQsDQorICAgIGludDMyX3QgY291bnQsDQorICAgIEZYX0JPT0wgZmFjMUluRWZmZWN0LA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IHN0YXJ0ID0gcmVzdWx0LkdldExlbmd0aCgpOw0KKyAgd2hpbGUgKGNvdW50ID4gMSkgew0KKyAgICBpbnQzMl90IG5leHRUd29DaGFyc0JpdHMgPSBiaXRzLT5SZWFkQml0cygxMSwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChyZXN1bHQsIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBTlVNRVJJQ19DSEFSU1tuZXh0VHdvQ2hhcnNCaXRzIC8gNDVdKTsNCisgICAgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQocmVzdWx0LCAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQU5VTUVSSUNfQ0hBUlNbbmV4dFR3b0NoYXJzQml0cyAlIDQ1XSk7DQorICAgIGNvdW50IC09IDI7DQorICB9DQorICBpZiAoY291bnQgPT0gMSkgew0KKyAgICBpbnQzMl90IGl0ZW1wID0gYml0cy0+UmVhZEJpdHMoNiwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChyZXN1bHQsIDEsIEFMUEhBTlVNRVJJQ19DSEFSU1tpdGVtcF0pOw0KKyAgfQ0KKyAgaWYgKGZhYzFJbkVmZmVjdCkgew0KKyAgICBmb3IgKGludDMyX3QgaSA9IHN0YXJ0OyBpIDwgcmVzdWx0LkdldExlbmd0aCgpOyBpKyspIHsNCisgICAgICBpZiAocmVzdWx0W2ldID09ICclJykgew0KKyAgICAgICAgaWYgKChpIDwgcmVzdWx0LkdldExlbmd0aCgpIC0gMSkgJiYgcmVzdWx0W2kgKyAxXSA9PSAnJScpIHsNCisgICAgICAgICAgcmVzdWx0LkRlbGV0ZShpICsgMSwgMSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByZXN1bHQuU2V0QXQoaSwgKEZYX0NIQVIpMHgxZCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlcjo6RGVjb2RlTnVtZXJpY1NlZ21lbnQoDQorICAgIENCQ19Db21tb25CaXRTb3VyY2UqIGJpdHMsDQorICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQsDQorICAgIGludDMyX3QgY291bnQsDQorICAgIGludDMyX3QmIGUpIHsNCisgIHdoaWxlIChjb3VudCA+PSAzKSB7DQorICAgIGludDMyX3QgdGhyZWVEaWdpdHNCaXRzID0gYml0cy0+UmVhZEJpdHMoMTAsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgaWYgKHRocmVlRGlnaXRzQml0cyA+PSAxMDAwKSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uUmVhZDsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KKyAgICBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChyZXN1bHQsIDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBTlVNRVJJQ19DSEFSU1t0aHJlZURpZ2l0c0JpdHMgLyAxMDBdKTsNCisgICAgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQocmVzdWx0LCAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQU5VTUVSSUNfQ0hBUlNbKHRocmVlRGlnaXRzQml0cyAvIDEwKSAlIDEwXSk7DQorICAgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFOVU1FUklDX0NIQVJTW3RocmVlRGlnaXRzQml0cyAlIDEwXSk7DQorICAgIGNvdW50IC09IDM7DQorICB9DQorICBpZiAoY291bnQgPT0gMikgew0KKyAgICBpbnQzMl90IHR3b0RpZ2l0Qml0cyA9IGJpdHMtPlJlYWRCaXRzKDcsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgaWYgKHR3b0RpZ2l0Qml0cyA+PSAxMDApIHsNCisgICAgICBlID0gQkNFeGNlcHRpb25SZWFkOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorICAgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgMSwgQUxQSEFOVU1FUklDX0NIQVJTW3R3b0RpZ2l0Qml0cyAvIDEwXSk7DQorICAgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgMSwgQUxQSEFOVU1FUklDX0NIQVJTW3R3b0RpZ2l0Qml0cyAlIDEwXSk7DQorICB9IGVsc2UgaWYgKGNvdW50ID09IDEpIHsNCisgICAgaW50MzJfdCBkaWdpdEJpdHMgPSBiaXRzLT5SZWFkQml0cyg0LCBlKTsNCisgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIGlmIChkaWdpdEJpdHMgPj0gMTApIHsNCisgICAgICBlID0gQkNFeGNlcHRpb25SZWFkOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpOw0KKyAgICB9DQorICAgIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKHJlc3VsdCwgMSwgQUxQSEFOVU1FUklDX0NIQVJTW2RpZ2l0Qml0c10pOw0KKyAgfQ0KK30NCitjb25zdCBDRlhfQnl0ZVN0cmluZyBDQkNfUVJEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpHdWVzc0VuY29kaW5nKA0KKyAgICBDRlhfQnl0ZUFycmF5KiBieXRlcykgew0KKyAgcmV0dXJuICpVVEZfODsNCit9DQoraW50MzJfdCBDQkNfUVJEZWNvZGVkQml0U3RyZWFtUGFyc2VyOjpQYXJzZUVDSVZhbHVlKENCQ19Db21tb25CaXRTb3VyY2UqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsNCisgIGludDMyX3QgZmlyc3RCeXRlID0gYml0cy0+UmVhZEJpdHMoOCwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICBpZiAoKGZpcnN0Qnl0ZSAmIDB4ODApID09IDApIHsNCisgICAgcmV0dXJuIGZpcnN0Qnl0ZSAmIDB4N2Y7DQorICB9IGVsc2UgaWYgKChmaXJzdEJ5dGUgJiAweGMwKSA9PSAweDgwKSB7DQorICAgIGludDMyX3Qgc2Vjb25kQnl0ZSA9IGJpdHMtPlJlYWRCaXRzKDgsIGUpOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgMCk7DQorICAgIHJldHVybiAoKGZpcnN0Qnl0ZSAmIDB4M2YpIDw8IDgpIHwgc2Vjb25kQnl0ZTsNCisgIH0gZWxzZSBpZiAoKGZpcnN0Qnl0ZSAmIDB4ZTApID09IDB4YzApIHsNCisgICAgaW50MzJfdCBzZWNvbmRUaGlyZEJ5dGUgPSBiaXRzLT5SZWFkQml0cygxNiwgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCisgICAgcmV0dXJuICgoZmlyc3RCeXRlICYgMHgxZikgPDwgMTYpIHwgc2Vjb25kVGhpcmRCeXRlOw0KKyAgfQ0KKyAgZSA9IEJDRXhjZXB0aW9uQmFkRUNJOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIDApOw0KKyAgcmV0dXJuIDA7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXIuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDkxNmZhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlci5oCkBAIC0wLDAgKzEsNTcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUVJERUNPREVEQklUU1RSRUFNUEFSU0VSX0hfDQorI2RlZmluZSBfQkNfUVJERUNPREVEQklUU1RSRUFNUEFSU0VSX0hfDQorY2xhc3MgQ0JDX0NvbW1vbkRlY29kZXJSZXN1bHQ7DQorY2xhc3MgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDsNCitjbGFzcyBDQkNfQ29tbW9uQml0U291cmNlOw0KK2NsYXNzIENCQ19RUkNvZGVyVmVyc2lvbjsNCitjbGFzcyBDQkNfQ29tbW9uQ2hhcmFjdGVyU2V0RUNJOw0KK2NsYXNzIENCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXIgew0KKyBwcml2YXRlOg0KKyAgY29uc3Qgc3RhdGljIEZYX0NIQVIgQUxQSEFOVU1FUklDX0NIQVJTWzQ1XTsNCisgIHN0YXRpYyBjb25zdCBGWF9DSEFSKiBVVEZfODsNCisgIENCQ19RUkRlY29kZWRCaXRTdHJlYW1QYXJzZXIoKTsNCisNCisgcHVibGljOg0KKyAgdmlydHVhbCB+Q0JDX1FSRGVjb2RlZEJpdFN0cmVhbVBhcnNlcigpOw0KKyAgc3RhdGljIENCQ19Db21tb25EZWNvZGVyUmVzdWx0KiBEZWNvZGUoDQorICAgICAgQ0ZYX0J5dGVBcnJheSogYnl0ZXMsDQorICAgICAgQ0JDX1FSQ29kZXJWZXJzaW9uKiB2ZXJzaW9uLA0KKyAgICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsDQorICAgICAgaW50MzJfdCBieXRlTW9kZURlY29kZSwNCisgICAgICBpbnQzMl90JiBlKTsNCisNCisgIHN0YXRpYyBjb25zdCBDRlhfQnl0ZVN0cmluZyBHdWVzc0VuY29kaW5nKENGWF9CeXRlQXJyYXkqIGJ5dGVzKTsNCisgIHN0YXRpYyBpbnQzMl90IFBhcnNlRUNJVmFsdWUoQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCBEZWNvZGVHQktTZWdtZW50KENCQ19Db21tb25CaXRTb3VyY2UqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgRGVjb2RlS2FuamlTZWdtZW50KENCQ19Db21tb25CaXRTb3VyY2UqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIHZvaWQgRGVjb2RlTnVtZXJpY1NlZ21lbnQoQ0JDX0NvbW1vbkJpdFNvdXJjZSogYml0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorICBzdGF0aWMgdm9pZCBEZWNvZGVBbHBoYW51bWVyaWNTZWdtZW50KENCQ19Db21tb25CaXRTb3VyY2UqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgZmFjMUluRWZmZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyB2b2lkIERlY29kZUJ5dGVTZWdtZW50KA0KKyAgICAgIENCQ19Db21tb25CaXRTb3VyY2UqIGJpdHMsDQorICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHJlc3VsdCwNCisgICAgICBpbnQzMl90IGNvdW50LA0KKyAgICAgIENCQ19Db21tb25DaGFyYWN0ZXJTZXRFQ0kqIGN1cnJlbnRDaGFyYWN0ZXJTZXRFQ0ksDQorICAgICAgQ0ZYX0ludDMyQXJyYXkqIGJ5dGVTZWdtZW50cywNCisgICAgICBpbnQzMl90IGJ5dGVNb2RlRGVjb2RlLA0KKyAgICAgIGludDMyX3QmIGUpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGV0ZWN0b3IuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGV0ZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyODBlOWEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEZXRlY3Rvci5jcHAKQEAgLTAsMCArMSwyNzcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSA8YWxnb3JpdGhtPg0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfUmVzdWx0UG9pbnQuaCINCisjaW5jbHVkZSAiQkNfUVJGaW5kZXJQYXR0ZXJuLmgiDQorI2luY2x1ZGUgIkJDX1FSQ29kZXJWZXJzaW9uLmgiDQorI2luY2x1ZGUgIkJDX0ZpbmRlclBhdHRlcm5JbmZvLmgiDQorI2luY2x1ZGUgIkJDX1FSR3JpZFNhbXBsZXIuaCINCisjaW5jbHVkZSAiQkNfUVJBbGlnbm1lbnRQYXR0ZXJuRmluZGVyLmgiDQorI2luY2x1ZGUgIkJDX1FSRmluZGVyUGF0dGVybkZpbmRlci5oIg0KKyNpbmNsdWRlICJCQ19RUkRldGVjdG9yUmVzdWx0LmgiDQorI2luY2x1ZGUgIkJDX1FSRGV0ZWN0b3IuaCINCitDQkNfUVJEZXRlY3Rvcjo6Q0JDX1FSRGV0ZWN0b3IoQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UpIDogbV9pbWFnZShpbWFnZSkge30NCitDQkNfUVJEZXRlY3Rvcjo6fkNCQ19RUkRldGVjdG9yKCkge30NCitDQkNfUVJEZXRlY3RvclJlc3VsdCogQ0JDX1FSRGV0ZWN0b3I6OkRldGVjdChpbnQzMl90IGhpbnRzLCBpbnQzMl90JiBlKSB7DQorICBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyIGZpbmRlcihtX2ltYWdlKTsNCisgIENCQ19RUkZpbmRlclBhdHRlcm5JbmZvKiBxcGkgPSBmaW5kZXIuRmluZChoaW50cywgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBDQkNfQXV0b1B0cjxDQkNfUVJGaW5kZXJQYXR0ZXJuSW5mbz4gaW5mbyhxcGkpOw0KKyAgQ0JDX1FSRGV0ZWN0b3JSZXN1bHQqIHFkciA9IFByb2Nlc3NGaW5kZXJQYXR0ZXJuSW5mbyhpbmZvLmdldCgpLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIHJldHVybiBxZHI7DQorfQ0KK0NCQ19RUkRldGVjdG9yUmVzdWx0KiBDQkNfUVJEZXRlY3Rvcjo6UHJvY2Vzc0ZpbmRlclBhdHRlcm5JbmZvKA0KKyAgICBDQkNfUVJGaW5kZXJQYXR0ZXJuSW5mbyogaW5mbywNCisgICAgaW50MzJfdCYgZSkgew0KKyAgQ0JDX0F1dG9QdHI8Q0JDX1FSRmluZGVyUGF0dGVybj4gdG9wTGVmdChpbmZvLT5HZXRUb3BMZWZ0KCkpOw0KKyAgQ0JDX0F1dG9QdHI8Q0JDX1FSRmluZGVyUGF0dGVybj4gdG9wUmlnaHQoaW5mby0+R2V0VG9wUmlnaHQoKSk7DQorICBDQkNfQXV0b1B0cjxDQkNfUVJGaW5kZXJQYXR0ZXJuPiBib3R0b21MZWZ0KGluZm8tPkdldEJvdHRvbUxlZnQoKSk7DQorICBGWF9GTE9BVCBtb2R1bGVTaXplID0NCisgICAgICBDYWxjdWxhdGVNb2R1bGVTaXplKHRvcExlZnQuZ2V0KCksIHRvcFJpZ2h0LmdldCgpLCBib3R0b21MZWZ0LmdldCgpKTsNCisgIGlmIChtb2R1bGVTaXplIDwgMS4wZikgew0KKyAgICBlID0gQkNFeGNlcHRpb25SZWFkOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICB9DQorICBpbnQzMl90IGRpbWVuc2lvbiA9IENvbXB1dGVEaW1lbnNpb24odG9wTGVmdC5nZXQoKSwgdG9wUmlnaHQuZ2V0KCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tTGVmdC5nZXQoKSwgbW9kdWxlU2l6ZSwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBDQkNfUVJDb2RlclZlcnNpb24qIHByb3Zpc2lvbmFsVmVyc2lvbiA9DQorICAgICAgQ0JDX1FSQ29kZXJWZXJzaW9uOjpHZXRQcm92aXNpb25hbFZlcnNpb25Gb3JEaW1lbnNpb24oZGltZW5zaW9uLCBlKTsNCisgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIGludDMyX3QgbW9kdWxlc0JldHdlZW5GUENlbnRlcnMgPQ0KKyAgICAgIHByb3Zpc2lvbmFsVmVyc2lvbi0+R2V0RGltZW5zaW9uRm9yVmVyc2lvbigpIC0gNzsNCisgIENCQ19RUkFsaWdubWVudFBhdHRlcm4qIGFsaWdubWVudFBhdHRlcm4gPSBOVUxMOw0KKyAgaWYgKHByb3Zpc2lvbmFsVmVyc2lvbi0+R2V0QWxpZ25tZW50UGF0dGVybkNlbnRlcnMoKS0+R2V0U2l6ZSgpID4gMCkgew0KKyAgICBGWF9GTE9BVCBib3R0b21SaWdodFggPQ0KKyAgICAgICAgdG9wUmlnaHQtPkdldFgoKSAtIHRvcExlZnQtPkdldFgoKSArIGJvdHRvbUxlZnQtPkdldFgoKTsNCisgICAgRlhfRkxPQVQgYm90dG9tUmlnaHRZID0NCisgICAgICAgIHRvcFJpZ2h0LT5HZXRZKCkgLSB0b3BMZWZ0LT5HZXRZKCkgKyBib3R0b21MZWZ0LT5HZXRZKCk7DQorICAgIEZYX0ZMT0FUIGNvcnJlY3Rpb25Ub1RvcExlZnQgPQ0KKyAgICAgICAgMS4wZiAtIDMuMGYgLyAoRlhfRkxPQVQpbW9kdWxlc0JldHdlZW5GUENlbnRlcnM7DQorICAgIEZYX0ZMT0FUIHh0ZW1wID0gKHRvcExlZnQtPkdldFgoKSArDQorICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3Rpb25Ub1RvcExlZnQgKiAoYm90dG9tUmlnaHRYIC0gdG9wTGVmdC0+R2V0WCgpKSk7DQorICAgIGludDMyX3QgZXN0QWxpZ25tZW50WCA9IChpbnQzMl90KXh0ZW1wOw0KKyAgICBGWF9GTE9BVCB5dGVtcCA9ICh0b3BMZWZ0LT5HZXRZKCkgKw0KKyAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0aW9uVG9Ub3BMZWZ0ICogKGJvdHRvbVJpZ2h0WSAtIHRvcExlZnQtPkdldFkoKSkpOw0KKyAgICBpbnQzMl90IGVzdEFsaWdubWVudFkgPSAoaW50MzJfdCl5dGVtcDsNCisgICAgZm9yIChpbnQzMl90IGkgPSA0OyBpIDw9IDE2OyBpIDw8PSAxKSB7DQorICAgICAgQ0JDX1FSQWxpZ25tZW50UGF0dGVybiogdGVtcCA9IEZpbmRBbGlnbm1lbnRJblJlZ2lvbigNCisgICAgICAgICAgbW9kdWxlU2l6ZSwgZXN0QWxpZ25tZW50WCwgZXN0QWxpZ25tZW50WSwgKEZYX0ZMT0FUKWksIGUpOw0KKyAgICAgIGFsaWdubWVudFBhdHRlcm4gPSB0ZW1wOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBDQkNfQ29tbW9uQml0TWF0cml4KiBiaXRzID0NCisgICAgICBTYW1wbGVHcmlkKG1faW1hZ2UsIHRvcExlZnQuZ2V0KCksIHRvcFJpZ2h0LmdldCgpLCBib3R0b21MZWZ0LmdldCgpLA0KKyAgICAgICAgICAgICAgICAgKENCQ19SZXN1bHRQb2ludCopKGFsaWdubWVudFBhdHRlcm4pLCBkaW1lbnNpb24sIGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgQ0ZYX1B0ckFycmF5KiBwb2ludHMgPSBuZXcgQ0ZYX1B0ckFycmF5Ow0KKyAgaWYgKGFsaWdubWVudFBhdHRlcm4gPT0gTlVMTCkgew0KKyAgICBwb2ludHMtPkFkZChib3R0b21MZWZ0LnJlbGVhc2UoKSk7DQorICAgIHBvaW50cy0+QWRkKHRvcExlZnQucmVsZWFzZSgpKTsNCisgICAgcG9pbnRzLT5BZGQodG9wUmlnaHQucmVsZWFzZSgpKTsNCisgIH0gZWxzZSB7DQorICAgIHBvaW50cy0+QWRkKGJvdHRvbUxlZnQucmVsZWFzZSgpKTsNCisgICAgcG9pbnRzLT5BZGQodG9wTGVmdC5yZWxlYXNlKCkpOw0KKyAgICBwb2ludHMtPkFkZCh0b3BSaWdodC5yZWxlYXNlKCkpOw0KKyAgICBwb2ludHMtPkFkZChhbGlnbm1lbnRQYXR0ZXJuKTsNCisgIH0NCisgIHJldHVybiBuZXcgQ0JDX1FSRGV0ZWN0b3JSZXN1bHQoYml0cywgcG9pbnRzKTsNCit9DQorQ0JDX0NvbW1vbkJpdE1hdHJpeCogQ0JDX1FSRGV0ZWN0b3I6OlNhbXBsZUdyaWQoDQorICAgIENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLA0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIHRvcExlZnQsDQorICAgIENCQ19SZXN1bHRQb2ludCogdG9wUmlnaHQsDQorICAgIENCQ19SZXN1bHRQb2ludCogYm90dG9tTGVmdCwNCisgICAgQ0JDX1Jlc3VsdFBvaW50KiBhbGlnbm1lbnRQYXR0ZXJuLA0KKyAgICBpbnQzMl90IGRpbWVuc2lvbiwNCisgICAgaW50MzJfdCYgZSkgew0KKyAgRlhfRkxPQVQgZGltTWludXNUaHJlZSA9IChGWF9GTE9BVClkaW1lbnNpb24gLSAzLjVmOw0KKyAgRlhfRkxPQVQgYm90dG9tUmlnaHRYOw0KKyAgRlhfRkxPQVQgYm90dG9tUmlnaHRZOw0KKyAgRlhfRkxPQVQgc291cmNlQm90dG9tUmlnaHRYOw0KKyAgRlhfRkxPQVQgc291cmNlQm90dG9tUmlnaHRZOw0KKyAgaWYgKGFsaWdubWVudFBhdHRlcm4gIT0gTlVMTCkgew0KKyAgICBib3R0b21SaWdodFggPSBhbGlnbm1lbnRQYXR0ZXJuLT5HZXRYKCk7DQorICAgIGJvdHRvbVJpZ2h0WSA9IGFsaWdubWVudFBhdHRlcm4tPkdldFkoKTsNCisgICAgc291cmNlQm90dG9tUmlnaHRYID0gc291cmNlQm90dG9tUmlnaHRZID0gZGltTWludXNUaHJlZSAtIDMuMGY7DQorICB9IGVsc2Ugew0KKyAgICBib3R0b21SaWdodFggPSAodG9wUmlnaHQtPkdldFgoKSAtIHRvcExlZnQtPkdldFgoKSkgKyBib3R0b21MZWZ0LT5HZXRYKCk7DQorICAgIGJvdHRvbVJpZ2h0WSA9ICh0b3BSaWdodC0+R2V0WSgpIC0gdG9wTGVmdC0+R2V0WSgpKSArIGJvdHRvbUxlZnQtPkdldFkoKTsNCisgICAgc291cmNlQm90dG9tUmlnaHRYID0gc291cmNlQm90dG9tUmlnaHRZID0gZGltTWludXNUaHJlZTsNCisgIH0NCisgIENCQ19RUkdyaWRTYW1wbGVyJiBzYW1wbGVyID0gQ0JDX1FSR3JpZFNhbXBsZXI6OkdldEluc3RhbmNlKCk7DQorICBDQkNfQ29tbW9uQml0TWF0cml4KiBjYm0gPSBzYW1wbGVyLlNhbXBsZUdyaWQoDQorICAgICAgaW1hZ2UsIGRpbWVuc2lvbiwgZGltZW5zaW9uLCAzLjVmLCAzLjVmLCBkaW1NaW51c1RocmVlLCAzLjVmLA0KKyAgICAgIHNvdXJjZUJvdHRvbVJpZ2h0WCwgc291cmNlQm90dG9tUmlnaHRZLCAzLjVmLCBkaW1NaW51c1RocmVlLA0KKyAgICAgIHRvcExlZnQtPkdldFgoKSwgdG9wTGVmdC0+R2V0WSgpLCB0b3BSaWdodC0+R2V0WCgpLCB0b3BSaWdodC0+R2V0WSgpLA0KKyAgICAgIGJvdHRvbVJpZ2h0WCwgYm90dG9tUmlnaHRZLCBib3R0b21MZWZ0LT5HZXRYKCksIGJvdHRvbUxlZnQtPkdldFkoKSwgZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICByZXR1cm4gY2JtOw0KK30NCitpbnQzMl90IENCQ19RUkRldGVjdG9yOjpDb21wdXRlRGltZW5zaW9uKENCQ19SZXN1bHRQb2ludCogdG9wTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogdG9wUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUmVzdWx0UG9pbnQqIGJvdHRvbUxlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBtb2R1bGVTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCB0bHRyQ2VudGVyc0RpbWVuc2lvbiA9IFJvdW5kKA0KKyAgICAgIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OkRpc3RhbmNlKHRvcExlZnQsIHRvcFJpZ2h0KSAvIG1vZHVsZVNpemUpOw0KKyAgaW50MzJfdCB0bGJsQ2VudGVyc0RpbWVuc2lvbiA9IFJvdW5kKA0KKyAgICAgIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OkRpc3RhbmNlKHRvcExlZnQsIGJvdHRvbUxlZnQpIC8gbW9kdWxlU2l6ZSk7DQorICBpbnQzMl90IGRpbWVuc2lvbiA9ICgodGx0ckNlbnRlcnNEaW1lbnNpb24gKyB0bGJsQ2VudGVyc0RpbWVuc2lvbikgPj4gMSkgKyA3Ow0KKyAgc3dpdGNoIChkaW1lbnNpb24gJiAweDAzKSB7DQorICAgIGNhc2UgMDoNCisgICAgICBkaW1lbnNpb24rKzsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAyOg0KKyAgICAgIGRpbWVuc2lvbi0tOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDM6IHsNCisgICAgICBlID0gQkNFeGNlcHRpb25SZWFkOw0KKyAgICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCAwKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGRpbWVuc2lvbjsNCit9DQorRlhfRkxPQVQgQ0JDX1FSRGV0ZWN0b3I6OkNhbGN1bGF0ZU1vZHVsZVNpemUoQ0JDX1Jlc3VsdFBvaW50KiB0b3BMZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogdG9wUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21MZWZ0KSB7DQorICByZXR1cm4gKENhbGN1bGF0ZU1vZHVsZVNpemVPbmVXYXkodG9wTGVmdCwgdG9wUmlnaHQpICsNCisgICAgICAgICAgQ2FsY3VsYXRlTW9kdWxlU2l6ZU9uZVdheSh0b3BMZWZ0LCBib3R0b21MZWZ0KSkgLw0KKyAgICAgICAgIDIuMGY7DQorfQ0KK0ZYX0ZMT0FUIENCQ19RUkRldGVjdG9yOjpDYWxjdWxhdGVNb2R1bGVTaXplT25lV2F5KA0KKyAgICBDQkNfUmVzdWx0UG9pbnQqIHBhdHRlcm4sDQorICAgIENCQ19SZXN1bHRQb2ludCogb3RoZXJQYXR0ZXJuKSB7DQorICBGWF9GTE9BVCBtb2R1bGVTaXplRXN0MSA9IFNpemVPZkJsYWNrV2hpdGVCbGFja1J1bkJvdGhXYXlzKA0KKyAgICAgIChpbnQzMl90KXBhdHRlcm4tPkdldFgoKSwgKGludDMyX3QpcGF0dGVybi0+R2V0WSgpLA0KKyAgICAgIChpbnQzMl90KW90aGVyUGF0dGVybi0+R2V0WCgpLCAoaW50MzJfdClvdGhlclBhdHRlcm4tPkdldFkoKSk7DQorICBGWF9GTE9BVCBtb2R1bGVTaXplRXN0MiA9IFNpemVPZkJsYWNrV2hpdGVCbGFja1J1bkJvdGhXYXlzKA0KKyAgICAgIChpbnQzMl90KW90aGVyUGF0dGVybi0+R2V0WCgpLCAoaW50MzJfdClvdGhlclBhdHRlcm4tPkdldFkoKSwNCisgICAgICAoaW50MzJfdClwYXR0ZXJuLT5HZXRYKCksIChpbnQzMl90KXBhdHRlcm4tPkdldFkoKSk7DQorICBpZiAoRlhTWVNfaXNuYW4obW9kdWxlU2l6ZUVzdDEpKSB7DQorICAgIHJldHVybiBtb2R1bGVTaXplRXN0MjsNCisgIH0NCisgIGlmIChGWFNZU19pc25hbihtb2R1bGVTaXplRXN0MikpIHsNCisgICAgcmV0dXJuIG1vZHVsZVNpemVFc3QxOw0KKyAgfQ0KKyAgcmV0dXJuIChtb2R1bGVTaXplRXN0MSArIG1vZHVsZVNpemVFc3QyKSAvIDE0LjBmOw0KK30NCitpbnQzMl90IENCQ19RUkRldGVjdG9yOjpSb3VuZChGWF9GTE9BVCBkKSB7DQorICByZXR1cm4gKGludDMyX3QpKGQgKyAwLjVmKTsNCit9DQorRlhfRkxPQVQgQ0JDX1FSRGV0ZWN0b3I6OlNpemVPZkJsYWNrV2hpdGVCbGFja1J1bkJvdGhXYXlzKGludDMyX3QgZnJvbVgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJvbVksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdG9YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRvWSkgew0KKyAgRlhfRkxPQVQgcmVzdWx0ID0gU2l6ZU9mQmxhY2tXaGl0ZUJsYWNrUnVuKGZyb21YLCBmcm9tWSwgdG9YLCB0b1kpOw0KKyAgaW50MzJfdCBvdGhlclRvWCA9IGZyb21YIC0gKHRvWCAtIGZyb21YKTsNCisgIGlmIChvdGhlclRvWCA8IDApIHsNCisgICAgb3RoZXJUb1ggPSAtMTsNCisgIH0gZWxzZSBpZiAob3RoZXJUb1ggPj0gbV9pbWFnZS0+R2V0V2lkdGgoKSkgew0KKyAgICBvdGhlclRvWCA9IG1faW1hZ2UtPkdldFdpZHRoKCk7DQorICB9DQorICBpbnQzMl90IG90aGVyVG9ZID0gZnJvbVkgLSAodG9ZIC0gZnJvbVkpOw0KKyAgaWYgKG90aGVyVG9ZIDwgMCkgew0KKyAgICBvdGhlclRvWSA9IC0xOw0KKyAgfSBlbHNlIGlmIChvdGhlclRvWSA+PSBtX2ltYWdlLT5HZXRIZWlnaHQoKSkgew0KKyAgICBvdGhlclRvWSA9IG1faW1hZ2UtPkdldEhlaWdodCgpOw0KKyAgfQ0KKyAgcmVzdWx0ICs9IFNpemVPZkJsYWNrV2hpdGVCbGFja1J1bihmcm9tWCwgZnJvbVksIG90aGVyVG9YLCBvdGhlclRvWSk7DQorICByZXR1cm4gcmVzdWx0IC0gMS4wZjsNCit9DQorRlhfRkxPQVQgQ0JDX1FSRGV0ZWN0b3I6OlNpemVPZkJsYWNrV2hpdGVCbGFja1J1bihpbnQzMl90IGZyb21YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcm9tWSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdG9YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0b1kpIHsNCisgIEZYX0JPT0wgc3RlZXAgPSBGWFNZU19hYnModG9ZIC0gZnJvbVkpID4gRlhTWVNfYWJzKHRvWCAtIGZyb21YKTsNCisgIGlmIChzdGVlcCkgew0KKyAgICBpbnQzMl90IHRlbXAgPSBmcm9tWDsNCisgICAgZnJvbVggPSBmcm9tWTsNCisgICAgZnJvbVkgPSB0ZW1wOw0KKyAgICB0ZW1wID0gdG9YOw0KKyAgICB0b1ggPSB0b1k7DQorICAgIHRvWSA9IHRlbXA7DQorICB9DQorICBpbnQzMl90IGR4ID0gRlhTWVNfYWJzKHRvWCAtIGZyb21YKTsNCisgIGludDMyX3QgZHkgPSBGWFNZU19hYnModG9ZIC0gZnJvbVkpOw0KKyAgaW50MzJfdCBlcnJvciA9IC1keCA+PiAxOw0KKyAgaW50MzJfdCB5c3RlcCA9IGZyb21ZIDwgdG9ZID8gMSA6IC0xOw0KKyAgaW50MzJfdCB4c3RlcCA9IGZyb21YIDwgdG9YID8gMSA6IC0xOw0KKyAgaW50MzJfdCBzdGF0ZSA9IDA7DQorICBmb3IgKGludDMyX3QgeCA9IGZyb21YLCB5ID0gZnJvbVk7IHggIT0gdG9YOyB4ICs9IHhzdGVwKSB7DQorICAgIGludDMyX3QgcmVhbFggPSBzdGVlcCA/IHkgOiB4Ow0KKyAgICBpbnQzMl90IHJlYWxZID0gc3RlZXAgPyB4IDogeTsNCisgICAgaWYgKHN0YXRlID09IDEpIHsNCisgICAgICBpZiAobV9pbWFnZS0+R2V0KHJlYWxYLCByZWFsWSkpIHsNCisgICAgICAgIHN0YXRlKys7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmICghbV9pbWFnZS0+R2V0KHJlYWxYLCByZWFsWSkpIHsNCisgICAgICAgIHN0YXRlKys7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChzdGF0ZSA9PSAzKSB7DQorICAgICAgaW50MzJfdCBkaWZmWCA9IHggLSBmcm9tWDsNCisgICAgICBpbnQzMl90IGRpZmZZID0geSAtIGZyb21ZOw0KKyAgICAgIHJldHVybiAoRlhfRkxPQVQpc3FydCgoZG91YmxlKShkaWZmWCAqIGRpZmZYICsgZGlmZlkgKiBkaWZmWSkpOw0KKyAgICB9DQorICAgIGVycm9yICs9IGR5Ow0KKyAgICBpZiAoZXJyb3IgPiAwKSB7DQorICAgICAgeSArPSB5c3RlcDsNCisgICAgICBlcnJvciAtPSBkeDsNCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBkaWZmWCA9IHRvWCAtIGZyb21YOw0KKyAgaW50MzJfdCBkaWZmWSA9IHRvWSAtIGZyb21ZOw0KKyAgcmV0dXJuIChGWF9GTE9BVClzcXJ0KChkb3VibGUpKGRpZmZYICogZGlmZlggKyBkaWZmWSAqIGRpZmZZKSk7DQorfQ0KK0NCQ19RUkFsaWdubWVudFBhdHRlcm4qIENCQ19RUkRldGVjdG9yOjpGaW5kQWxpZ25tZW50SW5SZWdpb24oDQorICAgIEZYX0ZMT0FUIG92ZXJhbGxFc3RNb2R1bGVTaXplLA0KKyAgICBpbnQzMl90IGVzdEFsaWdubWVudFgsDQorICAgIGludDMyX3QgZXN0QWxpZ25tZW50WSwNCisgICAgRlhfRkxPQVQgYWxsb3dhbmNlRmFjdG9yLA0KKyAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IGFsbG93YW5jZSA9IChpbnQzMl90KShhbGxvd2FuY2VGYWN0b3IgKiBvdmVyYWxsRXN0TW9kdWxlU2l6ZSk7DQorICBpbnQzMl90IGFsaWdubWVudEFyZWFMZWZ0WCA9IHN0ZDo6bWF4KDAsIGVzdEFsaWdubWVudFggLSBhbGxvd2FuY2UpOw0KKyAgaW50MzJfdCBhbGlnbm1lbnRBcmVhUmlnaHRYID0NCisgICAgICBzdGQ6Om1pbihtX2ltYWdlLT5HZXRXaWR0aCgpIC0gMSwgZXN0QWxpZ25tZW50WCArIGFsbG93YW5jZSk7DQorICBpZiAoYWxpZ25tZW50QXJlYVJpZ2h0WCAtIGFsaWdubWVudEFyZWFMZWZ0WCA8IG92ZXJhbGxFc3RNb2R1bGVTaXplICogMykgew0KKyAgICBlID0gQkNFeGNlcHRpb25SZWFkOw0KKyAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICB9DQorICBpbnQzMl90IGFsaWdubWVudEFyZWFUb3BZID0gc3RkOjptYXgoMCwgZXN0QWxpZ25tZW50WSAtIGFsbG93YW5jZSk7DQorICBpbnQzMl90IGFsaWdubWVudEFyZWFCb3R0b21ZID0NCisgICAgICBzdGQ6Om1pbihtX2ltYWdlLT5HZXRIZWlnaHQoKSAtIDEsIGVzdEFsaWdubWVudFkgKyBhbGxvd2FuY2UpOw0KKyAgQ0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlciBhbGlnbm1lbnRGaW5kZXIoDQorICAgICAgbV9pbWFnZSwgYWxpZ25tZW50QXJlYUxlZnRYLCBhbGlnbm1lbnRBcmVhVG9wWSwNCisgICAgICBhbGlnbm1lbnRBcmVhUmlnaHRYIC0gYWxpZ25tZW50QXJlYUxlZnRYLA0KKyAgICAgIGFsaWdubWVudEFyZWFCb3R0b21ZIC0gYWxpZ25tZW50QXJlYVRvcFksIG92ZXJhbGxFc3RNb2R1bGVTaXplKTsNCisgIENCQ19RUkFsaWdubWVudFBhdHRlcm4qIHFhcCA9IGFsaWdubWVudEZpbmRlci5GaW5kKGUpOw0KKyAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIE5VTEwpOw0KKyAgcmV0dXJuIHFhcDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGV0ZWN0b3IuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRldGVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA1OTQ4MgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRldGVjdG9yLmgKQEAgLTAsMCArMSw2NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19RUkRFVEVDVE9SX0hfDQorI2RlZmluZSBfQkNfUVJERVRFQ1RPUl9IXw0KK2NsYXNzIENCQ19SZXN1bHRQb2ludDsNCitjbGFzcyBDQkNfQ29tbW9uQml0TWF0cml4Ow0KK2NsYXNzIENCQ19RUkRldGVjdG9yUmVzdWx0Ow0KK2NsYXNzIENCQ19RUkZpbmRlclBhdHRlcm5JbmZvOw0KK2NsYXNzIENCQ19RUkFsaWdubWVudFBhdHRlcm47DQorY2xhc3MgQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcjsNCitjbGFzcyBDQkNfUVJDb2RlclZlcnNpb247DQorY2xhc3MgQ0JDX1FSR3JpZFNhbXBsZXI7DQorY2xhc3MgQ0JDX1FSQWxpZ25tZW50UGF0dGVybkZpbmRlcjsNCitjbGFzcyBDQkNfUVJBbGlnbm1lbnRQYXR0ZXJuOw0KK2NsYXNzIENCQ19RUkRldGVjdG9yOw0KK2NsYXNzIENCQ19RUkRldGVjdG9yIHsNCisgcHJpdmF0ZToNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIG1faW1hZ2U7DQorDQorIHB1YmxpYzoNCisgIENCQ19RUkRldGVjdG9yKENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlKTsNCisgIHZpcnR1YWwgfkNCQ19RUkRldGVjdG9yKCk7DQorDQorICBDQkNfQ29tbW9uQml0TWF0cml4KiBHZXRJbWFnZSgpOw0KKyAgQ0JDX1FSRGV0ZWN0b3JSZXN1bHQqIERldGVjdChpbnQzMl90IGhpbnRzLCBpbnQzMl90JiBlKTsNCisgIENCQ19RUkRldGVjdG9yUmVzdWx0KiBQcm9jZXNzRmluZGVyUGF0dGVybkluZm8oQ0JDX1FSRmluZGVyUGF0dGVybkluZm8qIGluZm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgRlhfRkxPQVQgQ2FsY3VsYXRlTW9kdWxlU2l6ZShDQkNfUmVzdWx0UG9pbnQqIHRvcExlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogdG9wUmlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogYm90dG9tTGVmdCk7DQorICBGWF9GTE9BVCBDYWxjdWxhdGVNb2R1bGVTaXplT25lV2F5KENCQ19SZXN1bHRQb2ludCogcGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiBvdGhlclBhdHRlcm4pOw0KKyAgRlhfRkxPQVQgU2l6ZU9mQmxhY2tXaGl0ZUJsYWNrUnVuQm90aFdheXMoaW50MzJfdCBmcm9tWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJvbVksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRvWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdG9ZKTsNCisgIEZYX0ZMT0FUIFNpemVPZkJsYWNrV2hpdGVCbGFja1J1bihpbnQzMl90IGZyb21YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJvbVksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0b1gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0b1kpOw0KKyAgQ0JDX1FSQWxpZ25tZW50UGF0dGVybiogRmluZEFsaWdubWVudEluUmVnaW9uKEZYX0ZMT0FUIG92ZXJhbGxFc3RNb2R1bGVTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXN0QWxpZ25tZW50WCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVzdEFsaWdubWVudFksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYWxsb3dhbmNlRmFjdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KKyAgc3RhdGljIGludDMyX3QgUm91bmQoRlhfRkxPQVQgZCk7DQorICBzdGF0aWMgaW50MzJfdCBDb21wdXRlRGltZW5zaW9uKENCQ19SZXN1bHRQb2ludCogdG9wTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiB0b3BSaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiBib3R0b21MZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBtb2R1bGVTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisgIHN0YXRpYyBDQkNfQ29tbW9uQml0TWF0cml4KiBTYW1wbGVHcmlkKENCQ19Db21tb25CaXRNYXRyaXgqIGltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiB0b3BMZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiB0b3BSaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogYm90dG9tTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19SZXN1bHRQb2ludCogYWxpZ25tZW50UGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGltZW5zaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEZXRlY3RvclJlc3VsdC5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJEZXRlY3RvclJlc3VsdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU2NTZjNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRldGVjdG9yUmVzdWx0LmNwcApAQCAtMCwwICsxLDQ3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoNCisvKg0KKyAqIENvcHlyaWdodCAyMDA3IFpYaW5nIGF1dGhvcnMNCisgKg0KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2JhcmNvZGUuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvQkNfUmVzdWx0UG9pbnQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJCQ19RUkRldGVjdG9yUmVzdWx0LmgiDQorQ0JDX1FSRGV0ZWN0b3JSZXN1bHQ6OkNCQ19RUkRldGVjdG9yUmVzdWx0KENCQ19Db21tb25CaXRNYXRyaXgqIGJpdHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJBcnJheSogcG9pbnRzKQ0KKyAgICA6IG1fYml0cyhiaXRzKSwgbV9wb2ludHMocG9pbnRzKSB7fQ0KK0NCQ19RUkRldGVjdG9yUmVzdWx0Ojp+Q0JDX1FSRGV0ZWN0b3JSZXN1bHQoKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX3BvaW50cy0+R2V0U2l6ZSgpOyBpKyspIHsNCisgICAgZGVsZXRlIChDQkNfUmVzdWx0UG9pbnQqKSgqbV9wb2ludHMpW2ldOw0KKyAgfQ0KKyAgbV9wb2ludHMtPlJlbW92ZUFsbCgpOw0KKyAgZGVsZXRlIG1fcG9pbnRzOw0KKyAgbV9wb2ludHMgPSBOVUxMOw0KKyAgaWYgKG1fYml0cyAhPSBOVUxMKSB7DQorICAgIGRlbGV0ZSBtX2JpdHM7DQorICB9DQorICBtX2JpdHMgPSBOVUxMOw0KK30NCitDQkNfQ29tbW9uQml0TWF0cml4KiBDQkNfUVJEZXRlY3RvclJlc3VsdDo6R2V0Qml0cygpIHsNCisgIHJldHVybiBtX2JpdHM7DQorfQ0KK0NGWF9QdHJBcnJheSogQ0JDX1FSRGV0ZWN0b3JSZXN1bHQ6OkdldFBvaW50cygpIHsNCisgIHJldHVybiBtX3BvaW50czsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRGV0ZWN0b3JSZXN1bHQuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRldGVjdG9yUmVzdWx0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ0MGJkOQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkRldGVjdG9yUmVzdWx0LmgKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9CQ19RUkRFVEVDVE9SUkVTVUxUX0hfDQorI2RlZmluZSBfQkNfUVJERVRFQ1RPUlJFU1VMVF9IXw0KK2NsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQorY2xhc3MgQ0JDX1Jlc3VsdFBvaW50Ow0KK2NsYXNzIENCQ19RUkRldGVjdG9yUmVzdWx0IHsNCisgcHJpdmF0ZToNCisgIENCQ19Db21tb25CaXRNYXRyaXgqIG1fYml0czsNCisgIENGWF9QdHJBcnJheSogbV9wb2ludHM7DQorDQorIHB1YmxpYzoNCisgIENCQ19RUkRldGVjdG9yUmVzdWx0KENCQ19Db21tb25CaXRNYXRyaXgqIGJpdHMsIENGWF9QdHJBcnJheSogcG9pbnRzKTsNCisgIHZpcnR1YWwgfkNCQ19RUkRldGVjdG9yUmVzdWx0KCk7DQorICBDQkNfQ29tbW9uQml0TWF0cml4KiBHZXRCaXRzKCk7DQorICBDRlhfUHRyQXJyYXkqIEdldFBvaW50cygpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRmluZGVyUGF0dGVybi5jcHAgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJGaW5kZXJQYXR0ZXJuLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmY5N2UyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRmluZGVyUGF0dGVybi5jcHAKQEAgLTAsMCArMSw2OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1Jlc3VsdFBvaW50LmgiDQorI2luY2x1ZGUgIkJDX1FSRmluZGVyUGF0dGVybi5oIg0KK0NCQ19RUkZpbmRlclBhdHRlcm46OkNCQ19RUkZpbmRlclBhdHRlcm4oRlhfRkxPQVQgeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHBvc1ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBlc3RpbWF0ZWRNb2R1bGVTaXplKQ0KKyAgICA6IENCQ19SZXN1bHRQb2ludCh4LCBwb3NZKSwNCisgICAgICBtX2VzdGltYXRlZE1vZHVsZVNpemUoZXN0aW1hdGVkTW9kdWxlU2l6ZSksDQorICAgICAgbV9jb3VudCgxKSB7fQ0KK0NCQ19RUkZpbmRlclBhdHRlcm46On5DQkNfUVJGaW5kZXJQYXR0ZXJuKCkgew0KKyAgbV9jb3VudCA9IDA7DQorICBtX3ggPSAwLjBmOw0KKyAgbV95ID0gMC4wZjsNCisgIG1fZXN0aW1hdGVkTW9kdWxlU2l6ZSA9IDAuMGY7DQorfQ0KK0NCQ19RUkZpbmRlclBhdHRlcm4qIENCQ19RUkZpbmRlclBhdHRlcm46OkNsb25lKCkgew0KKyAgQ0JDX1FSRmluZGVyUGF0dGVybiogdGVtcCA9DQorICAgICAgbmV3IENCQ19RUkZpbmRlclBhdHRlcm4obV94LCBtX3ksIG1fZXN0aW1hdGVkTW9kdWxlU2l6ZSk7DQorICB0ZW1wLT5tX2NvdW50ID0gbV9jb3VudDsNCisgIHJldHVybiB0ZW1wOw0KK30NCitGWF9GTE9BVCBDQkNfUVJGaW5kZXJQYXR0ZXJuOjpHZXRFc3RpbWF0ZWRNb2R1bGVTaXplKCkgew0KKyAgcmV0dXJuIG1fZXN0aW1hdGVkTW9kdWxlU2l6ZTsNCit9DQoraW50MzJfdCBDQkNfUVJGaW5kZXJQYXR0ZXJuOjpHZXRDb3VudCgpIHsNCisgIHJldHVybiBtX2NvdW50Ow0KK30NCit2b2lkIENCQ19RUkZpbmRlclBhdHRlcm46OkluY3JlbWVudENvdW50KCkgew0KKyAgbV9jb3VudCsrOw0KK30NCitGWF9CT09MIENCQ19RUkZpbmRlclBhdHRlcm46OkFib3V0RXF1YWxzKEZYX0ZMT0FUIG1vZHVsZVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaikgew0KKyAgaWYgKChmYWJzKGkgLSBHZXRZKCkpIDw9IG1vZHVsZVNpemUpICYmIChmYWJzKGogLSBHZXRYKCkpIDw9IG1vZHVsZVNpemUpKSB7DQorICAgIEZYX0ZMT0FUIG1vZHVsZVNpemVEaWZmID0gZmFicyhtb2R1bGVTaXplIC0gbV9lc3RpbWF0ZWRNb2R1bGVTaXplKTsNCisgICAgcmV0dXJuIChtb2R1bGVTaXplRGlmZiA8PSAxLjBmKSB8fA0KKyAgICAgICAgICAgKG1vZHVsZVNpemVEaWZmIC8gbV9lc3RpbWF0ZWRNb2R1bGVTaXplIDw9IDEuMGYpOw0KKyAgfQ0KKyAgcmV0dXJuIGZhbHNlOw0KK30NCitGWF9GTE9BVCBDQkNfUVJGaW5kZXJQYXR0ZXJuOjpHZXRYKCkgew0KKyAgcmV0dXJuIG1feDsNCit9DQorRlhfRkxPQVQgQ0JDX1FSRmluZGVyUGF0dGVybjo6R2V0WSgpIHsNCisgIHJldHVybiBtX3k7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkZpbmRlclBhdHRlcm4uaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkZpbmRlclBhdHRlcm4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDViZjdiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSRmluZGVyUGF0dGVybi5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUVJGSU5ERVJQQVRURVJOX0hfDQorI2RlZmluZSBfQkNfUVJGSU5ERVJQQVRURVJOX0hfDQorY2xhc3MgQ0JDX1Jlc3VsdFBvaW50Ow0KK2NsYXNzIENCQ19RUkZpbmRlclBhdHRlcm47DQorY2xhc3MgQ0JDX1FSRmluZGVyUGF0dGVybiA6IHB1YmxpYyBDQkNfUmVzdWx0UG9pbnQgew0KKyBwcml2YXRlOg0KKyAgRlhfRkxPQVQgbV9lc3RpbWF0ZWRNb2R1bGVTaXplOw0KKyAgaW50MzJfdCBtX2NvdW50Ow0KKw0KKyBwdWJsaWM6DQorICBDQkNfUVJGaW5kZXJQYXR0ZXJuKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHBvc1ksIEZYX0ZMT0FUIGVzdGltYXRlZE1vZHVsZVNpemUpOw0KKyAgdmlydHVhbCB+Q0JDX1FSRmluZGVyUGF0dGVybigpOw0KKw0KKyAgaW50MzJfdCBHZXRDb3VudCgpOw0KKyAgRlhfRkxPQVQgR2V0WCgpOw0KKyAgRlhfRkxPQVQgR2V0WSgpOw0KKyAgRlhfRkxPQVQgR2V0RXN0aW1hdGVkTW9kdWxlU2l6ZSgpOw0KKyAgdm9pZCBJbmNyZW1lbnRDb3VudCgpOw0KKyAgRlhfQk9PTCBBYm91dEVxdWFscyhGWF9GTE9BVCBtb2R1bGVTaXplLCBGWF9GTE9BVCBpLCBGWF9GTE9BVCBqKTsNCisgIENCQ19RUkZpbmRlclBhdHRlcm4qIENsb25lKCk7DQorfTsNCit0eXBlZGVmIENCQ19RUkZpbmRlclBhdHRlcm4gRmluZGVyUGF0dGVybjsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyLmNwcCBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkZpbmRlclBhdHRlcm5GaW5kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NjE0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyLmNwcApAQCAtMCwwICsxLDQ3MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6DQorLyoNCisgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9iYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL0JDX1Jlc3VsdFBvaW50LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCINCisjaW5jbHVkZSAiQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyLmgiDQorI2luY2x1ZGUgIkJDX0ZpbmRlclBhdHRlcm5JbmZvLmgiDQorI2luY2x1ZGUgIkJDX1FSRmluZGVyUGF0dGVybi5oIg0KK2NvbnN0IGludDMyX3QgQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcjo6Q0VOVEVSX1FVT1JVTSA9IDI7DQorY29uc3QgaW50MzJfdCBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpNSU5fU0tJUCA9IDM7DQorY29uc3QgaW50MzJfdCBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpNQVhfTU9EVUxFUyA9IDU3Ow0KK2NvbnN0IGludDMyX3QgQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcjo6SU5URUdFUl9NQVRIX1NISUZUID0gODsNCitDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyKA0KKyAgICBDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSkgew0KKyAgbV9pbWFnZSA9IGltYWdlOw0KKyAgbV9jcm9zc0NoZWNrU3RhdGVDb3VudC5TZXRTaXplKDUpOw0KKyAgbV9oYXNTa2lwcGVkID0gRkFMU0U7DQorfQ0KK0NCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6On5DQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyKCkgew0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbV9wb3NzaWJsZUNlbnRlcnMuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgZGVsZXRlIChDQkNfUVJGaW5kZXJQYXR0ZXJuKiltX3Bvc3NpYmxlQ2VudGVyc1tpXTsNCisgIH0NCisgIG1fcG9zc2libGVDZW50ZXJzLlJlbW92ZUFsbCgpOw0KK30NCitjbGFzcyBDbG9zZXN0VG9BdmVyYWdlQ29tcGFyYXRvciB7DQorIHByaXZhdGU6DQorICBGWF9GTE9BVCBtX2F2ZXJhZ2VNb2R1bGVTaXplOw0KKw0KKyBwdWJsaWM6DQorICBDbG9zZXN0VG9BdmVyYWdlQ29tcGFyYXRvcihGWF9GTE9BVCBhdmVyYWdlTW9kdWxlU2l6ZSkNCisgICAgICA6IG1fYXZlcmFnZU1vZHVsZVNpemUoYXZlcmFnZU1vZHVsZVNpemUpIHt9DQorICBpbnQzMl90IG9wZXJhdG9yKCkoRmluZGVyUGF0dGVybiogYSwgRmluZGVyUGF0dGVybiogYikgew0KKyAgICBGWF9GTE9BVCBkQSA9DQorICAgICAgICAoRlhfRkxPQVQpZmFicyhhLT5HZXRFc3RpbWF0ZWRNb2R1bGVTaXplKCkgLSBtX2F2ZXJhZ2VNb2R1bGVTaXplKTsNCisgICAgRlhfRkxPQVQgZEIgPQ0KKyAgICAgICAgKEZYX0ZMT0FUKWZhYnMoYi0+R2V0RXN0aW1hdGVkTW9kdWxlU2l6ZSgpIC0gbV9hdmVyYWdlTW9kdWxlU2l6ZSk7DQorICAgIHJldHVybiBkQSA8IGRCID8gLTEgOiBkQSA+IGRCID8gMSA6IDA7DQorICB9DQorfTsNCitjbGFzcyBDZW50ZXJDb21wYXJhdG9yIHsNCisgcHVibGljOg0KKyAgaW50MzJfdCBvcGVyYXRvcigpKEZpbmRlclBhdHRlcm4qIGEsIEZpbmRlclBhdHRlcm4qIGIpIHsNCisgICAgcmV0dXJuIGItPkdldENvdW50KCkgLSBhLT5HZXRDb3VudCgpOw0KKyAgfQ0KK307DQorQ0JDX0NvbW1vbkJpdE1hdHJpeCogQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcjo6R2V0SW1hZ2UoKSB7DQorICByZXR1cm4gbV9pbWFnZTsNCit9DQorQ0ZYX0ludDMyQXJyYXkmIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OkdldENyb3NzQ2hlY2tTdGF0ZUNvdW50KCkgew0KKyAgbV9jcm9zc0NoZWNrU3RhdGVDb3VudFswXSA9IDA7DQorICBtX2Nyb3NzQ2hlY2tTdGF0ZUNvdW50WzFdID0gMDsNCisgIG1fY3Jvc3NDaGVja1N0YXRlQ291bnRbMl0gPSAwOw0KKyAgbV9jcm9zc0NoZWNrU3RhdGVDb3VudFszXSA9IDA7DQorICBtX2Nyb3NzQ2hlY2tTdGF0ZUNvdW50WzRdID0gMDsNCisgIHJldHVybiBtX2Nyb3NzQ2hlY2tTdGF0ZUNvdW50Ow0KK30NCitDRlhfUHRyQXJyYXkqIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OkdldFBvc3NpYmxlQ2VudGVycygpIHsNCisgIHJldHVybiAmbV9wb3NzaWJsZUNlbnRlcnM7DQorfQ0KK0NCQ19RUkZpbmRlclBhdHRlcm5JbmZvKiBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpGaW5kKGludDMyX3QgaGludCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IG1heEkgPSBtX2ltYWdlLT5HZXRIZWlnaHQoKTsNCisgIGludDMyX3QgbWF4SiA9IG1faW1hZ2UtPkdldFdpZHRoKCk7DQorICBpbnQzMl90IGlTa2lwID0gKDMgKiBtYXhJKSAvICg0ICogTUFYX01PRFVMRVMpOw0KKyAgaWYgKGlTa2lwIDwgTUlOX1NLSVAgfHwgMCkgew0KKyAgICBpU2tpcCA9IE1JTl9TS0lQOw0KKyAgfQ0KKyAgRlhfQk9PTCBkb25lID0gRkFMU0U7DQorICBDRlhfSW50MzJBcnJheSBzdGF0ZUNvdW50Ow0KKyAgc3RhdGVDb3VudC5TZXRTaXplKDUpOw0KKyAgZm9yIChpbnQzMl90IGkgPSBpU2tpcCAtIDE7IGkgPCBtYXhJICYmICFkb25lOyBpICs9IGlTa2lwKSB7DQorICAgIHN0YXRlQ291bnRbMF0gPSAwOw0KKyAgICBzdGF0ZUNvdW50WzFdID0gMDsNCisgICAgc3RhdGVDb3VudFsyXSA9IDA7DQorICAgIHN0YXRlQ291bnRbM10gPSAwOw0KKyAgICBzdGF0ZUNvdW50WzRdID0gMDsNCisgICAgaW50MzJfdCBjdXJyZW50U3RhdGUgPSAwOw0KKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBtYXhKOyBqKyspIHsNCisgICAgICBpZiAobV9pbWFnZS0+R2V0KGosIGkpKSB7DQorICAgICAgICBpZiAoKGN1cnJlbnRTdGF0ZSAmIDEpID09IDEpIHsNCisgICAgICAgICAgY3VycmVudFN0YXRlKys7DQorICAgICAgICB9DQorICAgICAgICBzdGF0ZUNvdW50W2N1cnJlbnRTdGF0ZV0rKzsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKChjdXJyZW50U3RhdGUgJiAxKSA9PSAwKSB7DQorICAgICAgICAgIGlmIChjdXJyZW50U3RhdGUgPT0gNCkgew0KKyAgICAgICAgICAgIGlmIChGb3VuZFBhdHRlcm5Dcm9zcyhzdGF0ZUNvdW50KSkgew0KKyAgICAgICAgICAgICAgRlhfQk9PTCBjb25maXJtZWQgPSBIYW5kbGVQb3NzaWJsZUNlbnRlcihzdGF0ZUNvdW50LCBpLCBqKTsNCisgICAgICAgICAgICAgIGlmIChjb25maXJtZWQpIHsNCisgICAgICAgICAgICAgICAgaVNraXAgPSAyOw0KKyAgICAgICAgICAgICAgICBpZiAobV9oYXNTa2lwcGVkKSB7DQorICAgICAgICAgICAgICAgICAgZG9uZSA9IEhhdmVNdWx0aXBseUNvbmZpcm1lZENlbnRlcnMoKTsNCisgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICBpbnQzMl90IHJvd1NraXAgPSBGaW5kUm93U2tpcCgpOw0KKyAgICAgICAgICAgICAgICAgIGlmIChyb3dTa2lwID4gc3RhdGVDb3VudFsyXSkgew0KKyAgICAgICAgICAgICAgICAgICAgaSArPSByb3dTa2lwIC0gc3RhdGVDb3VudFsyXSAtIGlTa2lwOw0KKyAgICAgICAgICAgICAgICAgICAgaiA9IG1heEogLSAxOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgZG8gew0KKyAgICAgICAgICAgICAgICAgIGorKzsNCisgICAgICAgICAgICAgICAgfSB3aGlsZSAoaiA8IG1heEogJiYgIW1faW1hZ2UtPkdldChqLCBpKSk7DQorICAgICAgICAgICAgICAgIGotLTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IDA7DQorICAgICAgICAgICAgICBzdGF0ZUNvdW50WzBdID0gMDsNCisgICAgICAgICAgICAgIHN0YXRlQ291bnRbMV0gPSAwOw0KKyAgICAgICAgICAgICAgc3RhdGVDb3VudFsyXSA9IDA7DQorICAgICAgICAgICAgICBzdGF0ZUNvdW50WzNdID0gMDsNCisgICAgICAgICAgICAgIHN0YXRlQ291bnRbNF0gPSAwOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBzdGF0ZUNvdW50WzBdID0gc3RhdGVDb3VudFsyXTsNCisgICAgICAgICAgICAgIHN0YXRlQ291bnRbMV0gPSBzdGF0ZUNvdW50WzNdOw0KKyAgICAgICAgICAgICAgc3RhdGVDb3VudFsyXSA9IHN0YXRlQ291bnRbNF07DQorICAgICAgICAgICAgICBzdGF0ZUNvdW50WzNdID0gMTsNCisgICAgICAgICAgICAgIHN0YXRlQ291bnRbNF0gPSAwOw0KKyAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gMzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgc3RhdGVDb3VudFsrK2N1cnJlbnRTdGF0ZV0rKzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgc3RhdGVDb3VudFtjdXJyZW50U3RhdGVdKys7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChGb3VuZFBhdHRlcm5Dcm9zcyhzdGF0ZUNvdW50KSkgew0KKyAgICAgIEZYX0JPT0wgY29uZmlybWVkID0gSGFuZGxlUG9zc2libGVDZW50ZXIoc3RhdGVDb3VudCwgaSwgbWF4Sik7DQorICAgICAgaWYgKGNvbmZpcm1lZCkgew0KKyAgICAgICAgaVNraXAgPSBzdGF0ZUNvdW50WzBdOw0KKyAgICAgICAgaWYgKG1faGFzU2tpcHBlZCkgew0KKyAgICAgICAgICBkb25lID0gSGF2ZU11bHRpcGx5Q29uZmlybWVkQ2VudGVycygpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgQ0ZYX1B0ckFycmF5KiBwdHIgPSBTZWxlY3RCZXN0cGF0dGVybnMoZSk7DQorICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVmFsdWUoZSwgTlVMTCk7DQorICBDQkNfQXV0b1B0cjxDRlhfUHRyQXJyYXk+IHBhdHRlcm5JbmZvKHB0cik7DQorICBPcmRlckJlc3RQYXR0ZXJucyhwYXR0ZXJuSW5mby5nZXQoKSk7DQorICByZXR1cm4gbmV3IENCQ19RUkZpbmRlclBhdHRlcm5JbmZvKHBhdHRlcm5JbmZvLmdldCgpKTsNCit9DQordm9pZCBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpPcmRlckJlc3RQYXR0ZXJucyhDRlhfUHRyQXJyYXkqIHBhdHRlcm5zKSB7DQorICBGWF9GTE9BVCBhYkRpc3RhbmNlID0gRGlzdGFuY2UoKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMF0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENCQ19SZXN1bHRQb2ludCopKCpwYXR0ZXJucylbMV0pOw0KKyAgRlhfRkxPQVQgYmNEaXN0YW5jZSA9IERpc3RhbmNlKChDQkNfUmVzdWx0UG9pbnQqKSgqcGF0dGVybnMpWzFdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDQkNfUmVzdWx0UG9pbnQqKSgqcGF0dGVybnMpWzJdKTsNCisgIEZYX0ZMT0FUIGFjRGlzdGFuY2UgPSBEaXN0YW5jZSgoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVswXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0JDX1Jlc3VsdFBvaW50KikoKnBhdHRlcm5zKVsyXSk7DQorICBDQkNfUVJGaW5kZXJQYXR0ZXJuICp0b3BMZWZ0LCAqdG9wUmlnaHQsICpib3R0b21MZWZ0Ow0KKyAgaWYgKGJjRGlzdGFuY2UgPj0gYWJEaXN0YW5jZSAmJiBiY0Rpc3RhbmNlID49IGFjRGlzdGFuY2UpIHsNCisgICAgdG9wTGVmdCA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuKikoKnBhdHRlcm5zKVswXTsNCisgICAgdG9wUmlnaHQgPSAoQ0JDX1FSRmluZGVyUGF0dGVybiopKCpwYXR0ZXJucylbMV07DQorICAgIGJvdHRvbUxlZnQgPSAoQ0JDX1FSRmluZGVyUGF0dGVybiopKCpwYXR0ZXJucylbMl07DQorICB9IGVsc2UgaWYgKGFjRGlzdGFuY2UgPj0gYmNEaXN0YW5jZSAmJiBhY0Rpc3RhbmNlID49IGFiRGlzdGFuY2UpIHsNCisgICAgdG9wTGVmdCA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuKikoKnBhdHRlcm5zKVsxXTsNCisgICAgdG9wUmlnaHQgPSAoQ0JDX1FSRmluZGVyUGF0dGVybiopKCpwYXR0ZXJucylbMF07DQorICAgIGJvdHRvbUxlZnQgPSAoQ0JDX1FSRmluZGVyUGF0dGVybiopKCpwYXR0ZXJucylbMl07DQorICB9IGVsc2Ugew0KKyAgICB0b3BMZWZ0ID0gKENCQ19RUkZpbmRlclBhdHRlcm4qKSgqcGF0dGVybnMpWzJdOw0KKyAgICB0b3BSaWdodCA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuKikoKnBhdHRlcm5zKVswXTsNCisgICAgYm90dG9tTGVmdCA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuKikoKnBhdHRlcm5zKVsxXTsNCisgIH0NCisgIGlmICgoYm90dG9tTGVmdC0+R2V0WSgpIC0gdG9wTGVmdC0+R2V0WSgpKSAqDQorICAgICAgICAgICh0b3BSaWdodC0+R2V0WCgpIC0gdG9wTGVmdC0+R2V0WCgpKSA8DQorICAgICAgKGJvdHRvbUxlZnQtPkdldFgoKSAtIHRvcExlZnQtPkdldFgoKSkgKg0KKyAgICAgICAgICAodG9wUmlnaHQtPkdldFkoKSAtIHRvcExlZnQtPkdldFkoKSkpIHsNCisgICAgQ0JDX1FSRmluZGVyUGF0dGVybiogdGVtcCA9IHRvcFJpZ2h0Ow0KKyAgICB0b3BSaWdodCA9IGJvdHRvbUxlZnQ7DQorICAgIGJvdHRvbUxlZnQgPSB0ZW1wOw0KKyAgfQ0KKyAgKCpwYXR0ZXJucylbMF0gPSBib3R0b21MZWZ0Ow0KKyAgKCpwYXR0ZXJucylbMV0gPSB0b3BMZWZ0Ow0KKyAgKCpwYXR0ZXJucylbMl0gPSB0b3BSaWdodDsNCit9DQorRlhfRkxPQVQgQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcjo6RGlzdGFuY2UoQ0JDX1Jlc3VsdFBvaW50KiBwb2ludDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1Jlc3VsdFBvaW50KiBwb2ludDIpIHsNCisgIEZYX0ZMT0FUIGR4ID0gcG9pbnQxLT5HZXRYKCkgLSBwb2ludDItPkdldFgoKTsNCisgIEZYX0ZMT0FUIGR5ID0gcG9pbnQxLT5HZXRZKCkgLSBwb2ludDItPkdldFkoKTsNCisgIHJldHVybiAoRlhfRkxPQVQpRlhTWVNfc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7DQorfQ0KK0ZYX0ZMT0FUIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OkNlbnRlckZyb21FbmQoDQorICAgIGNvbnN0IENGWF9JbnQzMkFycmF5JiBzdGF0ZUNvdW50LA0KKyAgICBpbnQzMl90IGVuZCkgew0KKyAgcmV0dXJuIChGWF9GTE9BVCkoZW5kIC0gc3RhdGVDb3VudFs0XSAtIHN0YXRlQ291bnRbM10pIC0gc3RhdGVDb3VudFsyXSAvIDIuMGY7DQorfQ0KK0ZYX0JPT0wgQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcjo6Rm91bmRQYXR0ZXJuQ3Jvc3MoDQorICAgIGNvbnN0IENGWF9JbnQzMkFycmF5JiBzdGF0ZUNvdW50KSB7DQorICBpbnQzMl90IHRvdGFsTW9kdWxlU2l6ZSA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA1OyBpKyspIHsNCisgICAgaW50MzJfdCBjb3VudCA9IHN0YXRlQ291bnRbaV07DQorICAgIGlmIChjb3VudCA9PSAwKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHRvdGFsTW9kdWxlU2l6ZSArPSBjb3VudDsNCisgIH0NCisgIGlmICh0b3RhbE1vZHVsZVNpemUgPCA3KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGludDMyX3QgbW9kdWxlU2l6ZSA9ICh0b3RhbE1vZHVsZVNpemUgPDwgSU5URUdFUl9NQVRIX1NISUZUKSAvIDc7DQorICBpbnQzMl90IG1heFZhcmlhbmNlID0gbW9kdWxlU2l6ZSAvIDI7DQorICByZXR1cm4gRlhTWVNfYWJzKG1vZHVsZVNpemUgLSAoc3RhdGVDb3VudFswXSA8PCBJTlRFR0VSX01BVEhfU0hJRlQpKSA8DQorICAgICAgICAgICAgIG1heFZhcmlhbmNlICYmDQorICAgICAgICAgRlhTWVNfYWJzKG1vZHVsZVNpemUgLSAoc3RhdGVDb3VudFsxXSA8PCBJTlRFR0VSX01BVEhfU0hJRlQpKSA8DQorICAgICAgICAgICAgIG1heFZhcmlhbmNlICYmDQorICAgICAgICAgRlhTWVNfYWJzKDMgKiBtb2R1bGVTaXplIC0gKHN0YXRlQ291bnRbMl0gPDwgSU5URUdFUl9NQVRIX1NISUZUKSkgPA0KKyAgICAgICAgICAgICAzICogbWF4VmFyaWFuY2UgJiYNCisgICAgICAgICBGWFNZU19hYnMobW9kdWxlU2l6ZSAtIChzdGF0ZUNvdW50WzNdIDw8IElOVEVHRVJfTUFUSF9TSElGVCkpIDwNCisgICAgICAgICAgICAgbWF4VmFyaWFuY2UgJiYNCisgICAgICAgICBGWFNZU19hYnMobW9kdWxlU2l6ZSAtIChzdGF0ZUNvdW50WzRdIDw8IElOVEVHRVJfTUFUSF9TSElGVCkpIDwNCisgICAgICAgICAgICAgbWF4VmFyaWFuY2U7DQorfQ0KK0ZYX0ZMT0FUIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OkNyb3NzQ2hlY2tWZXJ0aWNhbCgNCisgICAgaW50MzJfdCBzdGFydEksDQorICAgIGludDMyX3QgY2VudGVySiwNCisgICAgaW50MzJfdCBtYXhDb3VudCwNCisgICAgaW50MzJfdCBvcmlnaW5hbFN0YXRlQ291bnRUb3RhbCkgew0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UgPSBtX2ltYWdlOw0KKyAgaW50MzJfdCBtYXhJID0gaW1hZ2UtPkdldEhlaWdodCgpOw0KKyAgQ0ZYX0ludDMyQXJyYXkmIHN0YXRlQ291bnQgPSBHZXRDcm9zc0NoZWNrU3RhdGVDb3VudCgpOw0KKyAgaW50MzJfdCBpID0gc3RhcnRJOw0KKyAgd2hpbGUgKGkgPj0gMCAmJiBpbWFnZS0+R2V0KGNlbnRlckosIGkpKSB7DQorICAgIHN0YXRlQ291bnRbMl0rKzsNCisgICAgaS0tOw0KKyAgfQ0KKyAgaWYgKGkgPCAwKSB7DQorICAgIHJldHVybiBGWFNZU19uYW4oKTsNCisgIH0NCisgIHdoaWxlIChpID49IDAgJiYgIWltYWdlLT5HZXQoY2VudGVySiwgaSkgJiYgc3RhdGVDb3VudFsxXSA8PSBtYXhDb3VudCkgew0KKyAgICBzdGF0ZUNvdW50WzFdKys7DQorICAgIGktLTsNCisgIH0NCisgIGlmIChpIDwgMCB8fCBzdGF0ZUNvdW50WzFdID4gbWF4Q291bnQpIHsNCisgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KKyAgfQ0KKyAgd2hpbGUgKGkgPj0gMCAmJiBpbWFnZS0+R2V0KGNlbnRlckosIGkpICYmIHN0YXRlQ291bnRbMF0gPD0gbWF4Q291bnQpIHsNCisgICAgc3RhdGVDb3VudFswXSsrOw0KKyAgICBpLS07DQorICB9DQorICBpZiAoc3RhdGVDb3VudFswXSA+IG1heENvdW50KSB7DQorICAgIHJldHVybiBGWFNZU19uYW4oKTsNCisgIH0NCisgIGkgPSBzdGFydEkgKyAxOw0KKyAgd2hpbGUgKGkgPCBtYXhJICYmIGltYWdlLT5HZXQoY2VudGVySiwgaSkpIHsNCisgICAgc3RhdGVDb3VudFsyXSsrOw0KKyAgICBpKys7DQorICB9DQorICBpZiAoaSA9PSBtYXhJKSB7DQorICAgIHJldHVybiBGWFNZU19uYW4oKTsNCisgIH0NCisgIHdoaWxlIChpIDwgbWF4SSAmJiAhaW1hZ2UtPkdldChjZW50ZXJKLCBpKSAmJiBzdGF0ZUNvdW50WzNdIDwgbWF4Q291bnQpIHsNCisgICAgc3RhdGVDb3VudFszXSsrOw0KKyAgICBpKys7DQorICB9DQorICBpZiAoaSA9PSBtYXhJIHx8IHN0YXRlQ291bnRbM10gPj0gbWF4Q291bnQpIHsNCisgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KKyAgfQ0KKyAgd2hpbGUgKGkgPCBtYXhJICYmIGltYWdlLT5HZXQoY2VudGVySiwgaSkgJiYgc3RhdGVDb3VudFs0XSA8IG1heENvdW50KSB7DQorICAgIHN0YXRlQ291bnRbNF0rKzsNCisgICAgaSsrOw0KKyAgfQ0KKyAgaWYgKHN0YXRlQ291bnRbNF0gPj0gbWF4Q291bnQpIHsNCisgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KKyAgfQ0KKyAgaW50MzJfdCBzdGF0ZUNvdW50VG90YWwgPSBzdGF0ZUNvdW50WzBdICsgc3RhdGVDb3VudFsxXSArIHN0YXRlQ291bnRbMl0gKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZUNvdW50WzNdICsgc3RhdGVDb3VudFs0XTsNCisgIGlmICg1ICogRlhTWVNfYWJzKHN0YXRlQ291bnRUb3RhbCAtIG9yaWdpbmFsU3RhdGVDb3VudFRvdGFsKSA+PQ0KKyAgICAgIG9yaWdpbmFsU3RhdGVDb3VudFRvdGFsKSB7DQorICAgIHJldHVybiBGWFNZU19uYW4oKTsNCisgIH0NCisgIHJldHVybiBGb3VuZFBhdHRlcm5Dcm9zcyhzdGF0ZUNvdW50KSA/IENlbnRlckZyb21FbmQoc3RhdGVDb3VudCwgaSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZYU1lTX25hbigpOw0KK30NCitGWF9GTE9BVCBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpDcm9zc0NoZWNrSG9yaXpvbnRhbCgNCisgICAgaW50MzJfdCBzdGFydEosDQorICAgIGludDMyX3QgY2VudGVySSwNCisgICAgaW50MzJfdCBtYXhDb3VudCwNCisgICAgaW50MzJfdCBvcmlnaW5hbFN0YXRlQ291bnRUb3RhbCkgew0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UgPSBtX2ltYWdlOw0KKyAgaW50MzJfdCBtYXhKID0gaW1hZ2UtPkdldFdpZHRoKCk7DQorICBDRlhfSW50MzJBcnJheSYgc3RhdGVDb3VudCA9IEdldENyb3NzQ2hlY2tTdGF0ZUNvdW50KCk7DQorICBpbnQzMl90IGogPSBzdGFydEo7DQorICB3aGlsZSAoaiA+PSAwICYmIGltYWdlLT5HZXQoaiwgY2VudGVySSkpIHsNCisgICAgc3RhdGVDb3VudFsyXSsrOw0KKyAgICBqLS07DQorICB9DQorICBpZiAoaiA8IDApIHsNCisgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KKyAgfQ0KKyAgd2hpbGUgKGogPj0gMCAmJiAhaW1hZ2UtPkdldChqLCBjZW50ZXJJKSAmJiBzdGF0ZUNvdW50WzFdIDw9IG1heENvdW50KSB7DQorICAgIHN0YXRlQ291bnRbMV0rKzsNCisgICAgai0tOw0KKyAgfQ0KKyAgaWYgKGogPCAwIHx8IHN0YXRlQ291bnRbMV0gPiBtYXhDb3VudCkgew0KKyAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQorICB9DQorICB3aGlsZSAoaiA+PSAwICYmIGltYWdlLT5HZXQoaiwgY2VudGVySSkgJiYgc3RhdGVDb3VudFswXSA8PSBtYXhDb3VudCkgew0KKyAgICBzdGF0ZUNvdW50WzBdKys7DQorICAgIGotLTsNCisgIH0NCisgIGlmIChzdGF0ZUNvdW50WzBdID4gbWF4Q291bnQpIHsNCisgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KKyAgfQ0KKyAgaiA9IHN0YXJ0SiArIDE7DQorICB3aGlsZSAoaiA8IG1heEogJiYgaW1hZ2UtPkdldChqLCBjZW50ZXJJKSkgew0KKyAgICBzdGF0ZUNvdW50WzJdKys7DQorICAgIGorKzsNCisgIH0NCisgIGlmIChqID09IG1heEopIHsNCisgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KKyAgfQ0KKyAgd2hpbGUgKGogPCBtYXhKICYmICFpbWFnZS0+R2V0KGosIGNlbnRlckkpICYmIHN0YXRlQ291bnRbM10gPCBtYXhDb3VudCkgew0KKyAgICBzdGF0ZUNvdW50WzNdKys7DQorICAgIGorKzsNCisgIH0NCisgIGlmIChqID09IG1heEogfHwgc3RhdGVDb3VudFszXSA+PSBtYXhDb3VudCkgew0KKyAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQorICB9DQorICB3aGlsZSAoaiA8IG1heEogJiYgaW1hZ2UtPkdldChqLCBjZW50ZXJJKSAmJiBzdGF0ZUNvdW50WzRdIDwgbWF4Q291bnQpIHsNCisgICAgc3RhdGVDb3VudFs0XSsrOw0KKyAgICBqKys7DQorICB9DQorICBpZiAoc3RhdGVDb3VudFs0XSA+PSBtYXhDb3VudCkgew0KKyAgICByZXR1cm4gRlhTWVNfbmFuKCk7DQorICB9DQorICBpbnQzMl90IHN0YXRlQ291bnRUb3RhbCA9IHN0YXRlQ291bnRbMF0gKyBzdGF0ZUNvdW50WzFdICsgc3RhdGVDb3VudFsyXSArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlQ291bnRbM10gKyBzdGF0ZUNvdW50WzRdOw0KKyAgaWYgKDUgKiBGWFNZU19hYnMoc3RhdGVDb3VudFRvdGFsIC0gb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpID49DQorICAgICAgb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpIHsNCisgICAgcmV0dXJuIEZYU1lTX25hbigpOw0KKyAgfQ0KKyAgcmV0dXJuIEZvdW5kUGF0dGVybkNyb3NzKHN0YXRlQ291bnQpID8gQ2VudGVyRnJvbUVuZChzdGF0ZUNvdW50LCBqKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhTWVNfbmFuKCk7DQorfQ0KK0ZYX0JPT0wgQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcjo6SGFuZGxlUG9zc2libGVDZW50ZXIoDQorICAgIGNvbnN0IENGWF9JbnQzMkFycmF5JiBzdGF0ZUNvdW50LA0KKyAgICBpbnQzMl90IGksDQorICAgIGludDMyX3Qgaikgew0KKyAgaW50MzJfdCBzdGF0ZUNvdW50VG90YWwgPSBzdGF0ZUNvdW50WzBdICsgc3RhdGVDb3VudFsxXSArIHN0YXRlQ291bnRbMl0gKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZUNvdW50WzNdICsgc3RhdGVDb3VudFs0XTsNCisgIEZYX0ZMT0FUIGNlbnRlckogPSBDZW50ZXJGcm9tRW5kKHN0YXRlQ291bnQsIGopOw0KKyAgRlhfRkxPQVQgY2VudGVySSA9DQorICAgICAgQ3Jvc3NDaGVja1ZlcnRpY2FsKGksIChpbnQzMl90KWNlbnRlckosIHN0YXRlQ291bnRbMl0sIHN0YXRlQ291bnRUb3RhbCk7DQorICBpZiAoIUZYU1lTX2lzbmFuKGNlbnRlckkpKSB7DQorICAgIGNlbnRlckogPSBDcm9zc0NoZWNrSG9yaXpvbnRhbCgoaW50MzJfdCljZW50ZXJKLCAoaW50MzJfdCljZW50ZXJJLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVDb3VudFsyXSwgc3RhdGVDb3VudFRvdGFsKTsNCisgICAgaWYgKCFGWFNZU19pc25hbihjZW50ZXJKKSkgew0KKyAgICAgIEZYX0ZMT0FUIGVzdGltYXRlZE1vZHVsZVNpemUgPSAoRlhfRkxPQVQpc3RhdGVDb3VudFRvdGFsIC8gNy4wZjsNCisgICAgICBGWF9CT09MIGZvdW5kID0gRkFMU0U7DQorICAgICAgaW50MzJfdCBtYXggPSBtX3Bvc3NpYmxlQ2VudGVycy5HZXRTaXplKCk7DQorICAgICAgZm9yIChpbnQzMl90IGluZGV4ID0gMDsgaW5kZXggPCBtYXg7IGluZGV4KyspIHsNCisgICAgICAgIENCQ19RUkZpbmRlclBhdHRlcm4qIGNlbnRlciA9DQorICAgICAgICAgICAgKENCQ19RUkZpbmRlclBhdHRlcm4qKShtX3Bvc3NpYmxlQ2VudGVyc1tpbmRleF0pOw0KKyAgICAgICAgaWYgKGNlbnRlci0+QWJvdXRFcXVhbHMoZXN0aW1hdGVkTW9kdWxlU2l6ZSwgY2VudGVySSwgY2VudGVySikpIHsNCisgICAgICAgICAgY2VudGVyLT5JbmNyZW1lbnRDb3VudCgpOw0KKyAgICAgICAgICBmb3VuZCA9IFRSVUU7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoIWZvdW5kKSB7DQorICAgICAgICBtX3Bvc3NpYmxlQ2VudGVycy5BZGQoDQorICAgICAgICAgICAgbmV3IENCQ19RUkZpbmRlclBhdHRlcm4oY2VudGVySiwgY2VudGVySSwgZXN0aW1hdGVkTW9kdWxlU2l6ZSkpOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitpbnQzMl90IENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OkZpbmRSb3dTa2lwKCkgew0KKyAgaW50MzJfdCBtYXggPSBtX3Bvc3NpYmxlQ2VudGVycy5HZXRTaXplKCk7DQorICBpZiAobWF4IDw9IDEpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBGaW5kZXJQYXR0ZXJuKiBmaXJzdENvbmZpcm1lZENlbnRlciA9IE5VTEw7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtYXg7IGkrKykgew0KKyAgICBDQkNfUVJGaW5kZXJQYXR0ZXJuKiBjZW50ZXIgPSAoQ0JDX1FSRmluZGVyUGF0dGVybiopbV9wb3NzaWJsZUNlbnRlcnNbaV07DQorICAgIGlmIChjZW50ZXItPkdldENvdW50KCkgPj0gQ0VOVEVSX1FVT1JVTSkgew0KKyAgICAgIGlmIChmaXJzdENvbmZpcm1lZENlbnRlciA9PSBOVUxMKSB7DQorICAgICAgICBmaXJzdENvbmZpcm1lZENlbnRlciA9IGNlbnRlcjsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9oYXNTa2lwcGVkID0gVFJVRTsNCisgICAgICAgIHJldHVybiAoaW50MzJfdCkoKGZhYnMoZmlyc3RDb25maXJtZWRDZW50ZXItPkdldFgoKSAtIGNlbnRlci0+R2V0WCgpKSAtDQorICAgICAgICAgICAgICAgICAgICAgICAgICBmYWJzKGZpcnN0Q29uZmlybWVkQ2VudGVyLT5HZXRZKCkgLSBjZW50ZXItPkdldFkoKSkpIC8NCisgICAgICAgICAgICAgICAgICAgICAgICAgMik7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gMDsNCit9DQorRlhfQk9PTCBDQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyOjpIYXZlTXVsdGlwbHlDb25maXJtZWRDZW50ZXJzKCkgew0KKyAgaW50MzJfdCBjb25maXJtZWRDb3VudCA9IDA7DQorICBGWF9GTE9BVCB0b3RhbE1vZHVsZVNpemUgPSAwLjBmOw0KKyAgaW50MzJfdCBtYXggPSBtX3Bvc3NpYmxlQ2VudGVycy5HZXRTaXplKCk7DQorICBpbnQzMl90IGk7DQorICBmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsNCisgICAgQ0JDX1FSRmluZGVyUGF0dGVybiogcGF0dGVybiA9IChDQkNfUVJGaW5kZXJQYXR0ZXJuKiltX3Bvc3NpYmxlQ2VudGVyc1tpXTsNCisgICAgaWYgKHBhdHRlcm4tPkdldENvdW50KCkgPj0gQ0VOVEVSX1FVT1JVTSkgew0KKyAgICAgIGNvbmZpcm1lZENvdW50Kys7DQorICAgICAgdG90YWxNb2R1bGVTaXplICs9IHBhdHRlcm4tPkdldEVzdGltYXRlZE1vZHVsZVNpemUoKTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGNvbmZpcm1lZENvdW50IDwgMykgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWF9GTE9BVCBhdmVyYWdlID0gdG90YWxNb2R1bGVTaXplIC8gKEZYX0ZMT0FUKW1heDsNCisgIEZYX0ZMT0FUIHRvdGFsRGV2aWF0aW9uID0gMC4wZjsNCisgIGZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykgew0KKyAgICBDQkNfUVJGaW5kZXJQYXR0ZXJuKiBwYXR0ZXJuID0gKENCQ19RUkZpbmRlclBhdHRlcm4qKW1fcG9zc2libGVDZW50ZXJzW2ldOw0KKyAgICB0b3RhbERldmlhdGlvbiArPSBmYWJzKHBhdHRlcm4tPkdldEVzdGltYXRlZE1vZHVsZVNpemUoKSAtIGF2ZXJhZ2UpOw0KKyAgfQ0KKyAgcmV0dXJuIHRvdGFsRGV2aWF0aW9uIDw9IDAuMDVmICogdG90YWxNb2R1bGVTaXplOw0KK30NCitpbmxpbmUgRlhfQk9PTCBjZW50ZXJDb21wYXJhdG9yKHZvaWQqIGEsIHZvaWQqIGIpIHsNCisgIHJldHVybiAoKENCQ19RUkZpbmRlclBhdHRlcm4qKWIpLT5HZXRDb3VudCgpIDwNCisgICAgICAgICAoKENCQ19RUkZpbmRlclBhdHRlcm4qKWEpLT5HZXRDb3VudCgpOw0KK30NCitDRlhfUHRyQXJyYXkqIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXI6OlNlbGVjdEJlc3RwYXR0ZXJucyhpbnQzMl90JiBlKSB7DQorICBpbnQzMl90IHN0YXJ0U2l6ZSA9IG1fcG9zc2libGVDZW50ZXJzLkdldFNpemUoKTsNCisgIGlmIChtX3Bvc3NpYmxlQ2VudGVycy5HZXRTaXplKCkgPCAzKSB7DQorICAgIGUgPSBCQ0V4Y2VwdGlvblJlYWQ7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgIH0NCisgIEZYX0ZMT0FUIGF2ZXJhZ2UgPSAwLjBmOw0KKyAgaWYgKHN0YXJ0U2l6ZSA+IDMpIHsNCisgICAgRlhfRkxPQVQgdG90YWxNb2R1bGVTaXplID0gMC4wZjsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc3RhcnRTaXplOyBpKyspIHsNCisgICAgICB0b3RhbE1vZHVsZVNpemUgKz0gKChDQkNfUVJGaW5kZXJQYXR0ZXJuKiltX3Bvc3NpYmxlQ2VudGVyc1tpXSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0RXN0aW1hdGVkTW9kdWxlU2l6ZSgpOw0KKyAgICB9DQorICAgIGF2ZXJhZ2UgPSB0b3RhbE1vZHVsZVNpemUgLyAoRlhfRkxPQVQpc3RhcnRTaXplOw0KKyAgICBmb3IgKGludDMyX3QgaiA9IDA7DQorICAgICAgICAgaiA8IG1fcG9zc2libGVDZW50ZXJzLkdldFNpemUoKSAmJiBtX3Bvc3NpYmxlQ2VudGVycy5HZXRTaXplKCkgPiAzOw0KKyAgICAgICAgIGorKykgew0KKyAgICAgIENCQ19RUkZpbmRlclBhdHRlcm4qIHBhdHRlcm4gPSAoQ0JDX1FSRmluZGVyUGF0dGVybiopbV9wb3NzaWJsZUNlbnRlcnNbal07DQorICAgICAgaWYgKGZhYnMocGF0dGVybi0+R2V0RXN0aW1hdGVkTW9kdWxlU2l6ZSgpIC0gYXZlcmFnZSkgPiAwLjJmICogYXZlcmFnZSkgew0KKyAgICAgICAgZGVsZXRlIHBhdHRlcm47DQorICAgICAgICBtX3Bvc3NpYmxlQ2VudGVycy5SZW1vdmVBdChqKTsNCisgICAgICAgIGotLTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmIChtX3Bvc3NpYmxlQ2VudGVycy5HZXRTaXplKCkgPiAzKSB7DQorICAgIEJDX0ZYX1B0ckFycmF5X1NvcnQobV9wb3NzaWJsZUNlbnRlcnMsIGNlbnRlckNvbXBhcmF0b3IpOw0KKyAgfQ0KKyAgQ0ZYX1B0ckFycmF5KiB2ZWMgPSBuZXcgQ0ZYX1B0ckFycmF5KCk7DQorICB2ZWMtPlNldFNpemUoMyk7DQorICAoKnZlYylbMF0gPSAoKENCQ19RUkZpbmRlclBhdHRlcm4qKW1fcG9zc2libGVDZW50ZXJzWzBdKS0+Q2xvbmUoKTsNCisgICgqdmVjKVsxXSA9ICgoQ0JDX1FSRmluZGVyUGF0dGVybiopbV9wb3NzaWJsZUNlbnRlcnNbMV0pLT5DbG9uZSgpOw0KKyAgKCp2ZWMpWzJdID0gKChDQkNfUVJGaW5kZXJQYXR0ZXJuKiltX3Bvc3NpYmxlQ2VudGVyc1syXSktPkNsb25lKCk7DQorICByZXR1cm4gdmVjOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJGaW5kZXJQYXR0ZXJuRmluZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM2YTk0MQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkZpbmRlclBhdHRlcm5GaW5kZXIuaApAQCAtMCwwICsxLDUzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0JDX1FSRklOREVSUEFUVEVSTkZJTkRFUl9IXw0KKyNkZWZpbmUgX0JDX1FSRklOREVSUEFUVEVSTkZJTkRFUl9IXw0KK2NsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7DQorY2xhc3MgQ0JDX1FSRmluZGVyUGF0dGVybjsNCitjbGFzcyBDQkNfUmVzdWx0UG9pbnQ7DQorY2xhc3MgQ0JDX1FSRmluZGVyUGF0dGVybkluZm87DQorDQorY2xhc3MgQ0JDX1FSRmluZGVyUGF0dGVybkZpbmRlciB7DQorIHByaXZhdGU6DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBDRU5URVJfUVVPUlVNOw0KKyAgY29uc3Qgc3RhdGljIGludDMyX3QgTUlOX1NLSVA7DQorICBjb25zdCBzdGF0aWMgaW50MzJfdCBNQVhfTU9EVUxFUzsNCisgIGNvbnN0IHN0YXRpYyBpbnQzMl90IElOVEVHRVJfTUFUSF9TSElGVDsNCisgIEZYX0JPT0wgbV9oYXNTa2lwcGVkOw0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogbV9pbWFnZTsNCisgIENGWF9JbnQzMkFycmF5IG1fY3Jvc3NDaGVja1N0YXRlQ291bnQ7DQorICBDRlhfUHRyQXJyYXkgbV9wb3NzaWJsZUNlbnRlcnM7DQorDQorIHB1YmxpYzoNCisgIENCQ19RUkZpbmRlclBhdHRlcm5GaW5kZXIoQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UpOw0KKyAgdmlydHVhbCB+Q0JDX1FSRmluZGVyUGF0dGVybkZpbmRlcigpOw0KKyAgaW50MzJfdCBGaW5kUm93U2tpcCgpOw0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogR2V0SW1hZ2UoKTsNCisgIENCQ19RUkZpbmRlclBhdHRlcm5JbmZvKiBGaW5kKGludDMyX3QgaGludCwgaW50MzJfdCYgZSk7DQorDQorICBDRlhfSW50MzJBcnJheSYgR2V0Q3Jvc3NDaGVja1N0YXRlQ291bnQoKTsNCisgIENGWF9QdHJBcnJheSogR2V0UG9zc2libGVDZW50ZXJzKCk7DQorICBDRlhfUHRyQXJyYXkqIFNlbGVjdEJlc3RwYXR0ZXJucyhpbnQzMl90JiBlKTsNCisNCisgIEZYX0JPT0wgSGFuZGxlUG9zc2libGVDZW50ZXIoY29uc3QgQ0ZYX0ludDMyQXJyYXkmIHN0YXRlQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBqKTsNCisgIEZYX0JPT0wgSGF2ZU11bHRpcGx5Q29uZmlybWVkQ2VudGVycygpOw0KKyAgRlhfRkxPQVQgQ2VudGVyRnJvbUVuZChjb25zdCBDRlhfSW50MzJBcnJheSYgc3RhdGVDb3VudCwgaW50MzJfdCBlbmQpOw0KKyAgRlhfRkxPQVQgQ3Jvc3NDaGVja1ZlcnRpY2FsKGludDMyX3Qgc3RhcnRJLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2VudGVySiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heENvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb3JpZ2luYWxTdGF0ZUNvdW50VG90YWwpOw0KKyAgRlhfRkxPQVQgQ3Jvc3NDaGVja0hvcml6b250YWwoaW50MzJfdCBzdGFydEosDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IENlbnRlckksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heENPdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvcmlnaW5hbFN0YXRlQ291bnRUb3RhbCk7DQorICBzdGF0aWMgdm9pZCBPcmRlckJlc3RQYXR0ZXJucyhDRlhfUHRyQXJyYXkqIHBhdHRlcm5zKTsNCisgIHN0YXRpYyBGWF9CT09MIEZvdW5kUGF0dGVybkNyb3NzKGNvbnN0IENGWF9JbnQzMkFycmF5JiBzdGF0ZUNvdW50KTsNCisgIHN0YXRpYyBGWF9GTE9BVCBEaXN0YW5jZShDQkNfUmVzdWx0UG9pbnQqIHBvaW50MSwgQ0JDX1Jlc3VsdFBvaW50KiBwb2ludDIpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSR3JpZFNhbXBsZXIuY3BwIGIveGZhL3NyYy9meGJhcmNvZGUvcXJjb2RlL0JDX1FSR3JpZFNhbXBsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNmJlNTUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJHcmlkU2FtcGxlci5jcHAKQEAgLTAsMCArMSwxMzUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOg0KKy8qDQorICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycw0KKyAqDQorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvYmFyY29kZS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0uaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIg0KKyNpbmNsdWRlICJCQ19RUkdyaWRTYW1wbGVyLmgiDQorQ0JDX1FSR3JpZFNhbXBsZXIgQ0JDX1FSR3JpZFNhbXBsZXI6Om1fZ3JpZFNhbXBsZXI7DQorQ0JDX1FSR3JpZFNhbXBsZXI6OkNCQ19RUkdyaWRTYW1wbGVyKCkge30NCitDQkNfUVJHcmlkU2FtcGxlcjo6fkNCQ19RUkdyaWRTYW1wbGVyKCkge30NCitDQkNfUVJHcmlkU2FtcGxlciYgQ0JDX1FSR3JpZFNhbXBsZXI6OkdldEluc3RhbmNlKCkgew0KKyAgcmV0dXJuIG1fZ3JpZFNhbXBsZXI7DQorfQ0KK3ZvaWQgQ0JDX1FSR3JpZFNhbXBsZXI6OkNoZWNrQW5kTnVkZ2VQb2ludHMoQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRmxvYXRBcnJheSogcG9pbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgew0KKyAgaW50MzJfdCB3aWR0aCA9IGltYWdlLT5HZXRXaWR0aCgpOw0KKyAgaW50MzJfdCBoZWlnaHQgPSBpbWFnZS0+R2V0SGVpZ2h0KCk7DQorICBGWF9CT09MIG51ZGdlZCA9IFRSVUU7DQorICBpbnQzMl90IG9mZnNldDsNCisgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgcG9pbnRzLT5HZXRTaXplKCkgJiYgbnVkZ2VkOyBvZmZzZXQgKz0gMikgew0KKyAgICBpbnQzMl90IHggPSAoaW50MzJfdCkoKnBvaW50cylbb2Zmc2V0XTsNCisgICAgaW50MzJfdCB5ID0gKGludDMyX3QpKCpwb2ludHMpW29mZnNldCArIDFdOw0KKyAgICBpZiAoeCA8IC0xIHx8IHggPiB3aWR0aCB8fCB5IDwgLTEgfHwgeSA+IGhlaWdodCkgew0KKyAgICAgIGUgPSBCQ0V4Y2VwdGlvblJlYWQ7DQorICAgICAgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZvaWQoZSk7DQorICAgIH0NCisgICAgbnVkZ2VkID0gRkFMU0U7DQorICAgIGlmICh4ID09IC0xKSB7DQorICAgICAgKCpwb2ludHMpW29mZnNldF0gPSAwLjBmOw0KKyAgICAgIG51ZGdlZCA9IFRSVUU7DQorICAgIH0gZWxzZSBpZiAoeCA9PSB3aWR0aCkgew0KKyAgICAgICgqcG9pbnRzKVtvZmZzZXRdID0gKEZYX0ZMT0FUKSh3aWR0aCAtIDEpOw0KKyAgICAgIG51ZGdlZCA9IFRSVUU7DQorICAgIH0NCisgICAgaWYgKHkgPT0gLTEpIHsNCisgICAgICAoKnBvaW50cylbb2Zmc2V0ICsgMV0gPSAwLjBmOw0KKyAgICAgIG51ZGdlZCA9IFRSVUU7DQorICAgIH0gZWxzZSBpZiAoeSA9PSBoZWlnaHQpIHsNCisgICAgICAoKnBvaW50cylbb2Zmc2V0ICsgMV0gPSAoRlhfRkxPQVQpKGhlaWdodCAtIDEpOw0KKyAgICAgIG51ZGdlZCA9IFRSVUU7DQorICAgIH0NCisgIH0NCisgIG51ZGdlZCA9IFRSVUU7DQorICBmb3IgKG9mZnNldCA9ICgqcG9pbnRzKS5HZXRTaXplKCkgLSAyOyBvZmZzZXQgPj0gMCAmJiBudWRnZWQ7IG9mZnNldCAtPSAyKSB7DQorICAgIGludDMyX3QgeCA9IChpbnQzMl90KSgqcG9pbnRzKVtvZmZzZXRdOw0KKyAgICBpbnQzMl90IHkgPSAoaW50MzJfdCkoKnBvaW50cylbb2Zmc2V0ICsgMV07DQorICAgIGlmICh4IDwgLTEgfHwgeCA+IHdpZHRoIHx8IHkgPCAtMSB8fCB5ID4gaGVpZ2h0KSB7DQorICAgICAgZSA9IEJDRXhjZXB0aW9uUmVhZDsNCisgICAgICBCQ19FWENFUFRJT05fQ0hFQ0tfUmV0dXJuVm9pZChlKTsNCisgICAgfQ0KKyAgICBudWRnZWQgPSBGQUxTRTsNCisgICAgaWYgKHggPT0gLTEpIHsNCisgICAgICAoKnBvaW50cylbb2Zmc2V0XSA9IDAuMGY7DQorICAgICAgbnVkZ2VkID0gVFJVRTsNCisgICAgfSBlbHNlIGlmICh4ID09IHdpZHRoKSB7DQorICAgICAgKCpwb2ludHMpW29mZnNldF0gPSAoRlhfRkxPQVQpKHdpZHRoIC0gMSk7DQorICAgICAgbnVkZ2VkID0gVFJVRTsNCisgICAgfQ0KKyAgICBpZiAoeSA9PSAtMSkgew0KKyAgICAgICgqcG9pbnRzKVtvZmZzZXQgKyAxXSA9IDAuMGY7DQorICAgICAgbnVkZ2VkID0gVFJVRTsNCisgICAgfSBlbHNlIGlmICh5ID09IGhlaWdodCkgew0KKyAgICAgICgqcG9pbnRzKVtvZmZzZXQgKyAxXSA9IChGWF9GTE9BVCkoaGVpZ2h0IC0gMSk7DQorICAgICAgbnVkZ2VkID0gVFJVRTsNCisgICAgfQ0KKyAgfQ0KK30NCitDQkNfQ29tbW9uQml0TWF0cml4KiBDQkNfUVJHcmlkU2FtcGxlcjo6U2FtcGxlR3JpZChDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRpbWVuc2lvblgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkaW1lbnNpb25ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAxVG9YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAxVG9ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAyVG9YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAyVG9ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAzVG9YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAzVG9ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHA0VG9YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHA0VG9ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAxRnJvbVgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcDFGcm9tWSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwMkZyb21YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAyRnJvbVksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcDNGcm9tWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwM0Zyb21ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHA0RnJvbVgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcDRGcm9tWSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7DQorICBDQkNfQXV0b1B0cjxDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm0+IHRyYW5zZm9ybSgNCisgICAgICBDQkNfQ29tbW9uUGVyc3BlY3RpdmVUcmFuc2Zvcm06OlF1YWRyaWxhdGVyYWxUb1F1YWRyaWxhdGVyYWwoDQorICAgICAgICAgIHAxVG9YLCBwMVRvWSwgcDJUb1gsIHAyVG9ZLCBwM1RvWCwgcDNUb1ksIHA0VG9YLCBwNFRvWSwgcDFGcm9tWCwNCisgICAgICAgICAgcDFGcm9tWSwgcDJGcm9tWCwgcDJGcm9tWSwgcDNGcm9tWCwgcDNGcm9tWSwgcDRGcm9tWCwgcDRGcm9tWSkpOw0KKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCogdGVtcEJpdE0gPSBuZXcgQ0JDX0NvbW1vbkJpdE1hdHJpeCgpOw0KKyAgdGVtcEJpdE0tPkluaXQoZGltZW5zaW9uWCwgZGltZW5zaW9uWSk7DQorICBDQkNfQXV0b1B0cjxDQkNfQ29tbW9uQml0TWF0cml4PiBiaXRzKHRlbXBCaXRNKTsNCisgIENGWF9GbG9hdEFycmF5IHBvaW50czsNCisgIHBvaW50cy5TZXRTaXplKGRpbWVuc2lvblggPDwgMSk7DQorICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBkaW1lbnNpb25ZOyB5KyspIHsNCisgICAgaW50MzJfdCBtYXggPSBwb2ludHMuR2V0U2l6ZSgpOw0KKyAgICBGWF9GTE9BVCBpVmFsdWUgPSAoRlhfRkxPQVQpKHkgKyAwLjVmKTsNCisgICAgaW50MzJfdCB4Ow0KKyAgICBmb3IgKHggPSAwOyB4IDwgbWF4OyB4ICs9IDIpIHsNCisgICAgICBwb2ludHNbeF0gPSAoRlhfRkxPQVQpKCh4ID4+IDEpICsgMC41Zik7DQorICAgICAgcG9pbnRzW3ggKyAxXSA9IGlWYWx1ZTsNCisgICAgfQ0KKyAgICB0cmFuc2Zvcm0tPlRyYW5zZm9ybVBvaW50cygmcG9pbnRzKTsNCisgICAgQ2hlY2tBbmROdWRnZVBvaW50cyhpbWFnZSwgJnBvaW50cywgZSk7DQorICAgIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5WYWx1ZShlLCBOVUxMKTsNCisgICAgZm9yICh4ID0gMDsgeCA8IG1heDsgeCArPSAyKSB7DQorICAgICAgaWYgKGltYWdlLT5HZXQoKGludDMyX3QpcG9pbnRzW3hdLCAoaW50MzJfdClwb2ludHNbeCArIDFdKSkgew0KKyAgICAgICAgYml0cy0+U2V0KHggPj4gMSwgeSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gYml0cy5yZWxlYXNlKCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkdyaWRTYW1wbGVyLmggYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJHcmlkU2FtcGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NWUyNWQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJHcmlkU2FtcGxlci5oCkBAIC0wLDAgKzEsNDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfUVJHUklEU0FNUExFUl9IXw0KKyNkZWZpbmUgX0JDX1FSR1JJRFNBTVBMRVJfSF8NCitjbGFzcyBDQkNfQ29tbW9uQml0TWF0cml4Ow0KK2NsYXNzIENCQ19Db21tb25QZXJzcGVjdGl2ZVRyYW5zZm9ybTsNCitjbGFzcyBDQkNfQ29tbW9uRGVmYXVsdEdyaWRTYW1wbGVyOw0KK2NsYXNzIENCQ19RUkdyaWRTYW1wbGVyOw0KK2NsYXNzIENCQ19RUkdyaWRTYW1wbGVyIHsNCisgcHJpdmF0ZToNCisgIHN0YXRpYyBDQkNfUVJHcmlkU2FtcGxlciBtX2dyaWRTYW1wbGVyOw0KKw0KKyBwdWJsaWM6DQorICBDQkNfUVJHcmlkU2FtcGxlcigpOw0KKyAgdmlydHVhbCB+Q0JDX1FSR3JpZFNhbXBsZXIoKTsNCisgIHZpcnR1YWwgQ0JDX0NvbW1vbkJpdE1hdHJpeCogU2FtcGxlR3JpZChDQkNfQ29tbW9uQml0TWF0cml4KiBpbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRpbWVuc2lvblgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkaW1lbnNpb25ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAxVG9YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAxVG9ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAyVG9YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAyVG9ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAzVG9YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAzVG9ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHA0VG9YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHA0VG9ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAxRnJvbVgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcDFGcm9tWSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwMkZyb21YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHAyRnJvbVksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcDNGcm9tWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwM0Zyb21ZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHA0RnJvbVgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcDRGcm9tWSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsNCisNCisgIHN0YXRpYyBDQkNfUVJHcmlkU2FtcGxlciYgR2V0SW5zdGFuY2UoKTsNCisgIHN0YXRpYyB2b2lkIENoZWNrQW5kTnVkZ2VQb2ludHMoQ0JDX0NvbW1vbkJpdE1hdHJpeCogaW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9GbG9hdEFycmF5KiBwb2ludHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGJhcmNvZGUvdXRpbHMuaCBiL3hmYS9zcmMvZnhiYXJjb2RlL3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA1ZjJmMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhiYXJjb2RlL3V0aWxzLmgKQEAgLTAsMCArMSwyMTYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfQkNfVVRJTFNfSF8NCisjZGVmaW5lIF9CQ19VVElMU19IXw0KK3R5cGVkZWYgQ0ZYX01hcFB0clRlbXBsYXRlPHZvaWQqLCBpbnQzMl90PiBDRlhfUHRyVG9JbnQzMjsNCitGWF9CT09MIEJDX0ZYX0J5dGVTdHJpbmdfUmVwbGFjZShDRlhfQnl0ZVN0cmluZyYgZHN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGZpcnN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGxhc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DSEFSIGMpOw0KK3ZvaWQgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQoQ0ZYX0J5dGVTdHJpbmcmIGRzdCwgaW50MzJfdCBjb3VudCwgRlhfQ0hBUiBjKTsNCit2b2lkIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKENGWF9CeXRlU3RyaW5nJiBkc3QsIGNvbnN0IENGWF9CeXRlQXJyYXkmIGJhKTsNCit0eXBlZGVmIEZYX0JPT0wgKCpCQ19QdHJBcnJheUNvbXBhcmVDYWxsYmFjaykodm9pZCogbCwgdm9pZCogcik7DQordm9pZCBCQ19GWF9QdHJBcnJheV9Tb3J0KENGWF9QdHJBcnJheSYgc3JjLCBCQ19QdHJBcnJheUNvbXBhcmVDYWxsYmFjayBmdW4pOw0KK3RlbXBsYXRlIDxjbGFzcyBfVHk+DQorY2xhc3MgQ0JDX0F1dG9QdHIgew0KKyBwdWJsaWM6DQorICB0eXBlZGVmIF9UeSBlbGVtZW50X3R5cGU7DQorICBleHBsaWNpdCBDQkNfQXV0b1B0cihfVHkqIF9QID0gMCkgOiBfT3ducyhfUCAhPSAwKSwgX1B0cihfUCkge30NCisgIENCQ19BdXRvUHRyKGNvbnN0IENCQ19BdXRvUHRyPF9UeT4mIF9ZKQ0KKyAgICAgIDogX093bnMoX1kuX093bnMpLCBfUHRyKF9ZLnJlbGVhc2UoKSkge30NCisgIENCQ19BdXRvUHRyPF9UeT4mIG9wZXJhdG9yPShjb25zdCBDQkNfQXV0b1B0cjxfVHk+JiBfWSkgew0KKyAgICBpZiAodGhpcyAhPSAmX1kpIHsNCisgICAgICBpZiAoX1B0ciAhPSBfWS5nZXQoKSkgew0KKyAgICAgICAgaWYgKF9Pd25zKSB7DQorICAgICAgICAgIGRlbGV0ZSBfUHRyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgX093bnMgPSBfWS5fT3duczsNCisgICAgICB9IGVsc2UgaWYgKF9ZLl9Pd25zKSB7DQorICAgICAgICBfT3ducyA9IFRSVUU7DQorICAgICAgfQ0KKyAgICAgIF9QdHIgPSBfWS5yZWxlYXNlKCk7DQorICAgIH0NCisgICAgcmV0dXJuICgqdGhpcyk7DQorICB9DQorICB+Q0JDX0F1dG9QdHIoKSB7DQorICAgIGlmIChfT3ducykgew0KKyAgICAgIGRlbGV0ZSBfUHRyOw0KKyAgICB9DQorICB9DQorICBfVHkmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICgqZ2V0KCkpOyB9DQorICBfVHkqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAoZ2V0KCkpOyB9DQorICBfVHkqIGdldCgpIGNvbnN0IHsgcmV0dXJuIChfUHRyKTsgfQ0KKyAgX1R5KiByZWxlYXNlKCkgY29uc3Qgew0KKyAgICAoKENCQ19BdXRvUHRyPF9UeT4qKXRoaXMpLT5fT3ducyA9IEZBTFNFOw0KKyAgICByZXR1cm4gKF9QdHIpOw0KKyAgfQ0KKw0KKyBwcml2YXRlOg0KKyAgRlhfQk9PTCBfT3duczsNCisgIF9UeSogX1B0cjsNCit9Ow0KKyNpZiAoX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lONjRfKQ0KKyNpbmNsdWRlIDxsaW1pdHM+DQorI2VsaWYoX0ZYX09TXyA9PSBfRlhfTUFDT1NYXyB8fCBfRlhfT1NfID09IF9GWF9MSU5VWF9ERVNLVE9QXyB8fCBcDQorICAgICAgX0ZYX09TXyA9PSBfRlhfSU9TXykNCisjaW5jbHVkZSA8bGltaXRzLmg+DQorI2VuZGlmDQorI2lmIChfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU42NF8pDQorI2RlZmluZSBGWFNZU19pc25hbih4KSBfaXNuYW4oeCkNCisjZWxpZihfRlhfT1NfID09IF9GWF9NQUNPU1hfIHx8IF9GWF9PU18gPT0gX0ZYX0lPU18pDQorI2luY2x1ZGUgPGNtYXRoPg0KKyNkZWZpbmUgRlhTWVNfaXNuYW4oeCkgc3RkOjppc25hbih4KQ0KKyNlbGlmKF9GWF9PU18gPT0gX0ZYX0xJTlVYX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX0FORFJPSURfKQ0KKyNpbmNsdWRlIDxtYXRoLmg+DQorI2RlZmluZSBGWFNZU19pc25hbih4KSBpc25hbih4KQ0KKyNlbmRpZg0KKyNpZiAoX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lONjRfKQ0KKyNkZWZpbmUgRlhTWVNfbmFuKCkgKHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjpxdWlldF9OYU4oKSkNCisjZWxpZihfRlhfT1NfID09IF9GWF9NQUNPU1hfIHx8IF9GWF9PU18gPT0gX0ZYX0xJTlVYX0RFU0tUT1BfIHx8IFwNCisgICAgICBfRlhfT1NfID09IF9GWF9JT1NfIHx8IF9GWF9PU18gPT0gX0ZYX0FORFJPSURfKQ0KKyNkZWZpbmUgRlhTWVNfbmFuKCkgTkFODQorI2VuZGlmDQorZW51bSBCQ0ZPUk1BVCB7DQorICBCQ0ZPUk1BVF9VTlNQRUNJRlkgPSAtMSwNCisgIEJDRk9STUFUX0NPREFCQVIsDQorICBCQ0ZPUk1BVF9DT0RFXzM5LA0KKyAgQkNGT1JNQVRfQ09ERV8xMjgsDQorICBCQ0ZPUk1BVF9DT0RFXzEyOEIsDQorICBCQ0ZPUk1BVF9DT0RFXzEyOEMsDQorICBCQ0ZPUk1BVF9FQU5fOCwNCisgIEJDRk9STUFUX1VQQ19BLA0KKyAgQkNGT1JNQVRfRUFOXzEzLA0KKyAgQkNGT1JNQVRfUERGXzQxNywNCisgIEJDRk9STUFUX0RBVEFNQVRSSVgsDQorICBCQ0ZPUk1BVF9RUl9DT0RFDQorfTsNCisjZGVmaW5lIEJDRk9STUFUX0VDTEVWRUxfTCAwDQorI2RlZmluZSBCQ0ZPUk1BVF9FQ0xFVkVMX00gMQ0KKyNkZWZpbmUgQkNGT1JNQVRfRUNMRVZFTF9RIDINCisjZGVmaW5lIEJDRk9STUFUX0VDTEVWRUxfSCAzDQorI2luY2x1ZGUgPGN0eXBlLmg+DQorI2RlZmluZSBGWFNZU19JbnRNYXggSU5UX01BWA0KKyNkZWZpbmUgRlhTWVNfSXNkaWdpdCBpc2RpZ2l0DQorI2RlZmluZSBCQ0V4Y2VwdGlvbk5PIDANCisjZGVmaW5lIEJDRXhjZXB0aW9uTm90Rm91bmQgMQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25FbmRMZXNzVGhhblN0YXJ0IDINCisjZGVmaW5lIEJDRXhjZXB0aW9uVW5rbm93bkRlY29kZXIgMw0KKyNkZWZpbmUgQkNFeGNlcHRpb25Sb3RhdGVOb3RTdXBwb3J0ZWQgNA0KKyNkZWZpbmUgQkNFeGNlcHRpb25IZWlnaHRBbmRXaWR0aE11c3RCZUF0TGVhc3QxIDUNCisjZGVmaW5lIEJDRXhjZXB0aW9uUmVnaW9uTXVzdEZpdEluc2lkZU1hdHJpeCA2DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkNhbk5vdENhbGxHZXREaW1lbnNpb25Pbk5vblNxdWFyZU1hdHJpeCA3DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkZvcm1hdEV4Y2VwdGlvbiA4DQorI2RlZmluZSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudE11c3RNYXRjaFZlcnNpb25TaXplIDkNCisjZGVmaW5lIEJDRXhjZXB0aW9uQ2hlY2tzdW1FeGNlcHRpb24gMTANCisjZGVmaW5lIEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50SW52YWxpZEZpcnN0RGlnaXQgMTENCisjZGVmaW5lIEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50SW52YWxpZFNlY29uZERpZ2l0IDEyDQorI2RlZmluZSBCQ0V4Y2VwdGlvblJ1bnRpbWVEZWNvZGluZ0ludmFsaWRJU09fSUVDIDEzDQorI2RlZmluZSBCQ0V4Y2VwdGlvblJ1bnRpbWVEZWNvZGluZ0ludmFsaWRBbHBoYW51bWVyaWMgMTQNCisjZGVmaW5lIEJDRXhjZXB0aW9uTGVmdEFuZFRvcE11c3RCZU5vbm5lZ2F0aXZlIDE1DQorI2RlZmluZSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudCAxNg0KKyNkZWZpbmUgQkNFeGNlcHRpb25CYWRFQ0kgMTcNCisjZGVmaW5lIEJDRXhjZXB0aW9uVW5TdXBwb3J0ZWRCYXJjb2RlIDE4DQorI2RlZmluZSBCQ0V4Y2VwdGlvblVuU3VwcG9ydGVkU3RyaW5nIDE5DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkRpZ2l0TGVuZ3RoTXVzdEJlOCAyMA0KKyNkZWZpbmUgQkNFeGNlcHRpb25EYXRhQ2hlY2tFeGNlcHRpb24gMjENCisjZGVmaW5lIEJDRXhjZXB0aW9uRXh0cmFjdE51bWJlclZhbHVlRnJvbUJpdEFycmF5IDIyDQorI2RlZmluZSBCQ0V4Y2VwdGlvblJlYWQgMjMNCisjZGVmaW5lIEJDRXhjZXB0aW9uUmVxdWVzdGVkUm93SXNPdXRTaXplVGhlSW1hZ2UgMjQNCisjZGVmaW5lIEJDRXhjZXB0aW9uTm9Db250ZW50cyAyNg0KKyNkZWZpbmUgQkNFeGNlcHRpb25VblN1cHBvcnRFY2xldmVsIDI3DQorI2RlZmluZSBCQ0V4Y2VwdGlvblVuU3VwcG9ydE1vZGUgMjgNCisjZGVmaW5lIEJDRXhjZXB0aW9uUmVmZXJlbmNlTXVzdEJlQmV0d2VlbjBBbmQ3IDI5DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkJhZEVycm9yTG9jYXRpb24gMzANCisjZGVmaW5lIEJDRXhjZXB0aW9uRGVncmVlSXNOZWdhdGl2ZSAzMQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25EaXZpZGVCeVplcm8gMzINCisjZGVmaW5lIEJDRXhjZXB0aW9uQ29lZmZpY2llbnRzU2l6ZUlzTnVsbCAzMw0KKyNkZWZpbmUgQkNFeGNlcHRpb25Ob0NvcnJlY3Rpb25CeXRlcyAzNA0KKyNkZWZpbmUgQkNFeGNlcHRpb25Ob0RhdGFCeXRlc1Byb3ZpZGVkIDM1DQorI2RlZmluZSBCQ0V4Y2VwdGlvblJfSV8xSXNaZXJvIDM2DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkFJc1plcm8gMzcNCisjZGVmaW5lIEJDRXhjZXB0aW9uSXNaZXJvIDM4DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkRlZ3JlZU5vdE1hdGNoUm9vdHMgMzkNCisjZGVmaW5lIEJDRXhjZXB0aW9uQ29udGVudHNMZW5ndGhTaG91bGRCZXR3ZWVuMWFuZDgwIDQwDQorI2RlZmluZSBCQ0V4Y2VwdGlvbk9ubHlFbmNvZGVDT0RFXzEyOCA0MQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25Pbmx5RW5jb2RlQ09ERV8zOSA0Mg0KKyNkZWZpbmUgQkNFeGNlcHRpb25Pbmx5RW5jb2RlRUFOXzEzIDQzDQorI2RlZmluZSBCQ0V4Y2VwdGlvbk9ubHlFbmNvZGVFQU5fOCA0NA0KKyNkZWZpbmUgQkNFeGNlcHRpb25Pbmx5RW5jb2RlSVRGIDQ1DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkRpZ2l0TGVuZ3RoU2hvdWxkMTMgNDYNCisjZGVmaW5lIEJDRXhjZXB0aW9uRGlnaXRMZW5ndGhNdXN0QmU2b3I4b3IxMG9yMTJvcjE0b3IxNm9yMjBvcjI0b3I0NCA0Nw0KKyNkZWZpbmUgQkNFeGNlcHRpb25Pbmx5RW5jb2RlVVBDX0EgNDgNCisjZGVmaW5lIEJDRXhjZXB0aW9uRGlnaXRMZW5ndGhTaG91bGRCZTEyIDQ5DQorI2RlZmluZSBCQ0V4Y2VwdGlvblZhbHVlTXVzdEJlRWl0aGVyMG9yMSA1MA0KKyNkZWZpbmUgQkNFeGNlcHRpb25SZWVkc29sb21uRGVjb2RlRXhjZXB0aW9uIDUxDQorI2RlZmluZSBCQ0V4Y2VwdGlvbkJhZEluZGV4RXhjZXB0aW9uIDUyDQorI2RlZmluZSBCQ0V4Y2VwdGlvbkJhZFZhbHVlRXhjZXB0aW9uIDUzDQorI2RlZmluZSBCQ0V4Y2VwdGlvbkJhZE51bUJpdHNFeGNlcHRpb24gNTQNCisjZGVmaW5lIEJDRXhjZXB0aW9uY2FuTm90T3BlcmF0ZXhvck9wZXJhdG9yIDU1DQorI2RlZmluZSBCQ0V4Y2VwdGlvblZlcnNpb25NdXN0MV80MCA1Ng0KKyNkZWZpbmUgQkNFeGNlcHRpb25Vbmtub3duIDU3DQorI2RlZmluZSBCQ0V4Y2VwdGlvbk5vU3VjaFZlcnNpb24gNTgNCisjZGVmaW5lIEJDRXhjZXB0aW9uQ2Fubm90RmluZEJsb2NrSW5mbyA1OQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25EYXRhVG9vQmlnIDYwDQorI2RlZmluZSBCQ0V4Y2VwdGlvbkludmFsaWRRUkNvZGUgNjENCisjZGVmaW5lIEJDRXhjZXB0aW9uRGF0YVRvb01hbnkgNjINCisjZGVmaW5lIEJDRXhjZXB0aW9uQml0c05vdEVxdWFsQ2FjaXR5IDYzDQorI2RlZmluZSBCQ0V4Y2VwdGlvblVuc3VwcG9ydGVkTW9kZSA2NA0KKyNkZWZpbmUgQkNFeGNlcHRpb25JbnZhbGlkYXRlQ2hhcmFjdGVyIDY1DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkJ5dGVzTm90TWF0Y2hPZmZzZXQgNjYNCisjZGVmaW5lIEJDRXhjZXB0aW9uU2l6ZUluQnl0ZXNEaWZmZXIgNjcNCisjZGVmaW5lIEJDRXhjZXB0aW9uSW52YWxpZGF0ZU1hc2tQYXR0ZXJuIDY4DQorI2RlZmluZSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyIDY5DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkJhZE1hc2sgNzANCisjZGVmaW5lIEJDRXhjZXB0aW9uQml0U2l6ZU5vdDE1IDcxDQorI2RlZmluZSBCQ0V4Y2VwdGlvbkJpdFNpemVOb3QxOCA3Mg0KKyNkZWZpbmUgQkNFeGNlcHRpb25JbnZhbGlkYXRlSW1hZ2VEYXRhIDczDQorI2RlZmluZSBCQ0V4Y2VwdGlvbkhlaWdodF84QmVaZXJvIDc0DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkNoYXJhY3Rlck5vdFRoaXNNb2RlIDc1DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkJpdHNCeXRlc05vdE1hdGNoIDc2DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVEYXRhIDc3DQorI2RlZmluZSBCQ0V4Y2VwdGlvbkxvYWRGaWxlIDc4DQorI2RlZmluZSBCQ0V4Y2VwdGlvblBERjQxN0VuY29kZUZhaWwgNzkNCisjZGVmaW5lIEJDRXhjZXB0aW9uRmFpbFRvQ3JlYXRlQml0bWFwIDgwDQorI2RlZmluZSBCQ0V4Y2VwdGlvbkxvYWRGb250RmFpbCA4MQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25Pbmx5RW5jb2RlQ09ERUJBUiA4Mg0KKyNkZWZpbmUgQkNFeGNlcHRpb25Db2RhYmFyU2hvdWxkU3RhcnRXaXRoT25lT2ZBQkNEIDgzDQorI2RlZmluZSBCQ0V4Y2VwdGlvbkNvZGFiYXJTaG91bGRFbmRXaXRoT25lT2ZUTkUgODQNCisjZGVmaW5lIEJDRXhjZXB0aW9uQ29kYWJhckVuY29kZUNoYXJzSW52YWxpZCA4NQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25Pbmx5RW5jb2RlREFUQU1BVFJJWCA4Ng0KKyNkZWZpbmUgQkNFeGNlcHRpb25DaGFyYWN0ZXJzT3V0c2lkZUlTTzg4NTkxRW5jb2RpbmcgODcNCisjZGVmaW5lIEJDRXhjZXB0aW9uSWxsZWdhbERhdGFDb2Rld29yZHMgODgNCisjZGVmaW5lIEJDRXhjZXB0aW9uQ2Fubm90SGFuZGxlVGhpc051bWJlck9mRGF0YVJlZ2lvbnMgODkNCisjZGVmaW5lIEJDRXhjZXB0aW9uSWxsZWdhbFN0YXRlVW5leHBlY3RlZENhc2UgOTANCisjZGVmaW5lIEJDRXhjZXB0aW9uSWxsZWdhbFN0YXRlQ291bnRNdXN0Tm90RXhjZWVkNCA5MQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25JbGxlZ2FsU3RhdGVNZXNzYWdlTGVuZ3RoSW52YWxpZCA5Mg0KKyNkZWZpbmUgQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnROb3RHaWdpdHMgOTMNCisjZGVmaW5lIEJDRXhjZXB0aW9uSWxsZWdhbFN0YXRlSWxsZWdhbE1vZGUgOTQNCisjZGVmaW5lIEJDRXhjZXB0aW9uT25seUVuY29kZVBERjQxNyA5NQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25Ob25FbmNvZGFibGVDaGFyYWN0ZXJEZXRlY3RlZCA5Ng0KKyNkZWZpbmUgQkNFeGNlcHRpb25FcnJvckNvcnJlY3Rpb25MZXZlbE11c3RCZUJldHdlZW4wQW5kOCA5Nw0KKyNkZWZpbmUgQkNFeGNlcHRpb25Ob1JlY29tbWVuZGF0aW9uUG9zc2libGUgOTgNCisjZGVmaW5lIEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50bk11c3RCZUFib3ZlMCA5OQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25VbmFibGVUb0ZpdE1lc3NhZ2VJbkNvbHVtbnMgMTAwDQorI2RlZmluZSBCQ0V4Y2VwdGlvbkVuY29kZWRNZXNzYWdlQ29udGFpbnNUb29NYW55Q29kZVdvcmRzIDEwMQ0KKyNkZWZpbmUgQkNFeGNlcHRpb25CaXRtYXBTaXplRXJyb3IgMTAyDQorI2RlZmluZSBCQ0V4Y2VwdGlvbkZvcm1hdEluc3RhbmNlIDEwMg0KKyNkZWZpbmUgQkNFeGNlcHRpb25DaGVja3N1bUluc3RhbmNlIDEwMw0KKyNkZWZpbmUgQkNFeGNlcHRpb250Tm90Rm91bmRJbnN0YW5jZSAxMDQNCisjZGVmaW5lIEJDRXhjZXB0aW9uTm90Rm91bmRJbnN0YW5jZSAxMDUNCisjZGVmaW5lIEJDRXhjZXB0aW9uQ2Fubm90TWV0YWRhdGEgMTA2DQorI2RlZmluZSBUV09fRElHSVRfREFUQV9MRU5HVEhfU0laRSAyNA0KKyNkZWZpbmUgVEhSRUVfRElHSVRfREFUQV9MRU5HVEhfU0laRSAyMw0KKyNkZWZpbmUgVEhSRUVfRElHSVRfUExVU19ESUdJVF9EQVRBX0xFTkdUSF9TSVpFIDU3DQorI2RlZmluZSBGT1VSX0RJR0lUX0RBVEFfTEVOR1RIX1NJWkUgMTcNCisjZGVmaW5lIEJDX0VYQ0VQVElPTl9DSEVDS19SZXR1cm5Wb2lkKGUpIFwNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pICAgICAgICAgICAgICAgIFwNCisgICAgcmV0dXJuOw0KKyNkZWZpbmUgQkNfRVhDRVBUSU9OX0NIRUNLX1JldHVyblZhbHVlKGUsIHYpIFwNCisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pICAgICAgICAgICAgICAgICAgICBcDQorICAgIHJldHVybiB2Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9jaGVja3N1bS5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfY2hlY2tzdW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YzNjZGIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfY2hlY2tzdW0uY3BwCkBAIC0wLDAgKzEsMTg4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9jb21tb24uaCINCisjaW5jbHVkZSAieGZhX2NoZWNrc3VtLmgiDQorQ1hGQV9TQVhSZWFkZXJIYW5kbGVyOjpDWEZBX1NBWFJlYWRlckhhbmRsZXIoQ1hGQV9DaGVja3N1bUNvbnRleHQqIHBDb250ZXh0KQ0KKyAgICA6IG1fcENvbnRleHQocENvbnRleHQpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BDb250ZXh0KTsNCit9DQorQ1hGQV9TQVhSZWFkZXJIYW5kbGVyOjp+Q1hGQV9TQVhSZWFkZXJIYW5kbGVyKCkge30NCit2b2lkKiBDWEZBX1NBWFJlYWRlckhhbmRsZXI6Ok9uVGFnRW50ZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1RhZ05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1NBWE5PREUgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhcnRQb3MpIHsNCisgIFVwZGF0ZUNoZWNrc3VtKFRSVUUpOw0KKyAgaWYgKGVUeXBlICE9IEZYX1NBWE5PREVfVGFnICYmIGVUeXBlICE9IEZYX1NBWE5PREVfSW5zdHJ1Y3Rpb24pIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBtX1NBWENvbnRleHQubV9lTm9kZSA9IGVUeXBlOw0KKyAgQ0ZYX0J5dGVUZXh0QnVmJiB0ZXh0QnVmID0gbV9TQVhDb250ZXh0Lm1fVGV4dEJ1ZjsNCisgIHRleHRCdWYgPDwgIjwiOw0KKyAgaWYgKGVUeXBlID09IEZYX1NBWE5PREVfSW5zdHJ1Y3Rpb24pIHsNCisgICAgdGV4dEJ1ZiA8PCAiPyI7DQorICB9DQorICB0ZXh0QnVmIDw8IGJzVGFnTmFtZTsNCisgIG1fU0FYQ29udGV4dC5tX2JzVGFnTmFtZSA9IGJzVGFnTmFtZTsNCisgIHJldHVybiAmbV9TQVhDb250ZXh0Ow0KK30NCit2b2lkIENYRkFfU0FYUmVhZGVySGFuZGxlcjo6T25UYWdBdHRyaWJ1dGUodm9pZCogcFRhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0F0dHJpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzVmFsdWUpIHsNCisgIGlmIChwVGFnID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX0J5dGVUZXh0QnVmJiB0ZXh0QnVmID0gKChDWEZBX1NBWENvbnRleHQqKXBUYWcpLT5tX1RleHRCdWY7DQorICB0ZXh0QnVmIDw8ICIgIiA8PCBic0F0dHJpIDw8ICI9XCIiIDw8IGJzVmFsdWUgPDwgIlwiIjsNCit9DQordm9pZCBDWEZBX1NBWFJlYWRlckhhbmRsZXI6Ok9uVGFnQnJlYWsodm9pZCogcFRhZykgew0KKyAgaWYgKHBUYWcgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfQnl0ZVRleHRCdWYmIHRleHRCdWYgPSAoKENYRkFfU0FYQ29udGV4dCopcFRhZyktPm1fVGV4dEJ1ZjsNCisgIHRleHRCdWYgPDwgIj4iOw0KKyAgVXBkYXRlQ2hlY2tzdW0oRkFMU0UpOw0KK30NCit2b2lkIENYRkFfU0FYUmVhZGVySGFuZGxlcjo6T25UYWdEYXRhKHZvaWQqIHBUYWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TQVhOT0RFIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXJ0UG9zKSB7DQorICBpZiAocFRhZyA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9CeXRlVGV4dEJ1ZiYgdGV4dEJ1ZiA9ICgoQ1hGQV9TQVhDb250ZXh0KilwVGFnKS0+bV9UZXh0QnVmOw0KKyAgaWYgKGVUeXBlID09IEZYX1NBWE5PREVfQ2hhckRhdGEpIHsNCisgICAgdGV4dEJ1ZiA8PCAiPCFbQ0RBVEFbIjsNCisgIH0NCisgIHRleHRCdWYgPDwgYnNEYXRhOw0KKyAgaWYgKGVUeXBlID09IEZYX1NBWE5PREVfQ2hhckRhdGEpIHsNCisgICAgdGV4dEJ1ZiA8PCAiXV0+IjsNCisgIH0NCit9DQordm9pZCBDWEZBX1NBWFJlYWRlckhhbmRsZXI6Ok9uVGFnQ2xvc2Uodm9pZCogcFRhZywgRlhfRFdPUkQgZHdFbmRQb3MpIHsNCisgIGlmIChwVGFnID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9TQVhDb250ZXh0KiBwU0FYQ29udGV4dCA9IChDWEZBX1NBWENvbnRleHQqKXBUYWc7DQorICBDRlhfQnl0ZVRleHRCdWYmIHRleHRCdWYgPSBwU0FYQ29udGV4dC0+bV9UZXh0QnVmOw0KKyAgaWYgKHBTQVhDb250ZXh0LT5tX2VOb2RlID09IEZYX1NBWE5PREVfSW5zdHJ1Y3Rpb24pIHsNCisgICAgdGV4dEJ1ZiA8PCAiPz4iOw0KKyAgfSBlbHNlIGlmIChwU0FYQ29udGV4dC0+bV9lTm9kZSA9PSBGWF9TQVhOT0RFX1RhZykgew0KKyAgICB0ZXh0QnVmIDw8ICI+PC8iIDw8IHBTQVhDb250ZXh0LT5tX2JzVGFnTmFtZSA8PCAiPiI7DQorICB9DQorICBVcGRhdGVDaGVja3N1bShGQUxTRSk7DQorfQ0KK3ZvaWQgQ1hGQV9TQVhSZWFkZXJIYW5kbGVyOjpPblRhZ0VuZCh2b2lkKiBwVGFnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzVGFnTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdFbmRQb3MpIHsNCisgIGlmIChwVGFnID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX0J5dGVUZXh0QnVmJiB0ZXh0QnVmID0gKChDWEZBX1NBWENvbnRleHQqKXBUYWcpLT5tX1RleHRCdWY7DQorICB0ZXh0QnVmIDw8ICI8LyIgPDwgYnNUYWdOYW1lIDw8ICI+IjsNCisgIFVwZGF0ZUNoZWNrc3VtKEZBTFNFKTsNCit9DQordm9pZCBDWEZBX1NBWFJlYWRlckhhbmRsZXI6Ok9uVGFyZ2V0RGF0YSh2b2lkKiBwVGFnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfU0FYTk9ERSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGFydFBvcykgew0KKyAgaWYgKHBUYWcgPT0gTlVMTCAmJiBlVHlwZSAhPSBGWF9TQVhOT0RFX0NvbW1lbnQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKGVUeXBlID09IEZYX1NBWE5PREVfQ29tbWVudCkgew0KKyAgICBDRlhfQnl0ZVRleHRCdWYmIHRleHRCdWYgPSBtX1NBWENvbnRleHQubV9UZXh0QnVmOw0KKyAgICB0ZXh0QnVmIDw8ICI8IS0tIiA8PCBic0RhdGEgPDwgIi0tPiI7DQorICAgIFVwZGF0ZUNoZWNrc3VtKEZBTFNFKTsNCisgIH0gZWxzZSB7DQorICAgIENGWF9CeXRlVGV4dEJ1ZiYgdGV4dEJ1ZiA9ICgoQ1hGQV9TQVhDb250ZXh0KilwVGFnKS0+bV9UZXh0QnVmOw0KKyAgICB0ZXh0QnVmIDw8ICIgIiA8PCBic0RhdGE7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9TQVhSZWFkZXJIYW5kbGVyOjpVcGRhdGVDaGVja3N1bShGWF9CT09MIGJDaGVja1NwYWNlKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBtX1NBWENvbnRleHQubV9UZXh0QnVmLkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggPCAxKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHVpbnQ4X3QqIHBCdWZmZXIgPSBtX1NBWENvbnRleHQubV9UZXh0QnVmLkdldEJ1ZmZlcigpOw0KKyAgRlhfQk9PTCBiVXBkYXRhID0gVFJVRTsNCisgIGlmIChiQ2hlY2tTcGFjZSkgew0KKyAgICBiVXBkYXRhID0gRkFMU0U7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMZW5ndGg7IGkrKykgew0KKyAgICAgIGJVcGRhdGEgPSAocEJ1ZmZlcltpXSA+IDB4MjApOw0KKyAgICAgIGlmIChiVXBkYXRhKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmIChiVXBkYXRhKSB7DQorICAgIG1fcENvbnRleHQtPlVwZGF0ZShDRlhfQnl0ZVN0cmluZ0MocEJ1ZmZlciwgaUxlbmd0aCkpOw0KKyAgfQ0KKyAgbV9TQVhDb250ZXh0Lm1fVGV4dEJ1Zi5DbGVhcigpOw0KK30NCitJWEZBX0NoZWNrc3VtQ29udGV4dCogWEZBX0NoZWNrc3VtX0NyZWF0ZSgpIHsNCisgIHJldHVybiBuZXcgQ1hGQV9DaGVja3N1bUNvbnRleHQ7DQorfQ0KK0NYRkFfQ2hlY2tzdW1Db250ZXh0OjpDWEZBX0NoZWNrc3VtQ29udGV4dCgpDQorICAgIDogbV9wU0FYUmVhZGVyKE5VTEwpLCBtX3BCeXRlQ29udGV4dChOVUxMKSB7fQ0KK0NYRkFfQ2hlY2tzdW1Db250ZXh0Ojp+Q1hGQV9DaGVja3N1bUNvbnRleHQoKSB7DQorICBGaW5pc2hDaGVja3N1bSgpOw0KK30NCitGWF9CT09MIENYRkFfQ2hlY2tzdW1Db250ZXh0OjpTdGFydENoZWNrc3VtKCkgew0KKyAgRmluaXNoQ2hlY2tzdW0oKTsNCisgIG1fcEJ5dGVDb250ZXh0ID0gRlhfQWxsb2ModWludDhfdCwgMTI4KTsNCisgIENSWVBUX1NIQTFTdGFydChtX3BCeXRlQ29udGV4dCk7DQorICBtX2JzQ2hlY2tzdW0uRW1wdHkoKTsNCisgIG1fcFNBWFJlYWRlciA9IEZYX1NBWFJlYWRlcl9DcmVhdGUoKTsNCisgIHJldHVybiBtX3BTQVhSZWFkZXIgIT0gTlVMTDsNCit9DQorRlhfQk9PTCBDWEZBX0NoZWNrc3VtQ29udGV4dDo6VXBkYXRlQ2hlY2tzdW0oSUZYX0ZpbGVSZWFkKiBwU3JjRmlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIHsNCisgIGlmIChtX3BTQVhSZWFkZXIgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAocFNyY0ZpbGUgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoc2l6ZSA8IDEpIHsNCisgICAgc2l6ZSA9IHBTcmNGaWxlLT5HZXRTaXplKCk7DQorICB9DQorICBDWEZBX1NBWFJlYWRlckhhbmRsZXIgaGFuZGxlcih0aGlzKTsNCisgIG1fcFNBWFJlYWRlci0+U2V0SGFuZGxlcigmaGFuZGxlcik7DQorICBpZiAobV9wU0FYUmVhZGVyLT5TdGFydFBhcnNlKA0KKyAgICAgICAgICBwU3JjRmlsZSwgKEZYX0RXT1JEKW9mZnNldCwgKEZYX0RXT1JEKXNpemUsDQorICAgICAgICAgIEZYX1NBWFBBUlNFTU9ERV9Ob3RTa2lwU3BhY2UgfCBGWF9TQVhQQVJTRU1PREVfTm90Q29udmVydF9hbXAgfA0KKyAgICAgICAgICAgICAgRlhfU0FYUEFSU0VNT0RFX05vdENvbnZlcnRfbHQgfCBGWF9TQVhQQVJTRU1PREVfTm90Q29udmVydF9ndCB8DQorICAgICAgICAgICAgICBGWF9TQVhQQVJTRU1PREVfTm90Q29udmVydF9zaGFycCkgPCAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBtX3BTQVhSZWFkZXItPkNvbnRpbnVlUGFyc2UoTlVMTCkgPiA5OTsNCit9DQordm9pZCBDWEZBX0NoZWNrc3VtQ29udGV4dDo6RmluaXNoQ2hlY2tzdW0oKSB7DQorICBpZiAobV9wU0FYUmVhZGVyICE9IE5VTEwpIHsNCisgICAgbV9wU0FYUmVhZGVyLT5SZWxlYXNlKCk7DQorICAgIG1fcFNBWFJlYWRlciA9IE5VTEw7DQorICB9DQorICBpZiAobV9wQnl0ZUNvbnRleHQpIHsNCisgICAgdWludDhfdCBkaWdlc3RbMjBdOw0KKyAgICBGWFNZU19tZW1zZXQoZGlnZXN0LCAwLCAyMCk7DQorICAgIENSWVBUX1NIQTFGaW5pc2gobV9wQnl0ZUNvbnRleHQsIGRpZ2VzdCk7DQorICAgIGludDMyX3QgbkxlbiA9IEZYX0Jhc2U2NEVuY29kZUEoZGlnZXN0LCAyMCwgTlVMTCk7DQorICAgIEZYX0NIQVIqIHBCdWZmZXIgPSBtX2JzQ2hlY2tzdW0uR2V0QnVmZmVyKG5MZW4pOw0KKyAgICBGWF9CYXNlNjRFbmNvZGVBKGRpZ2VzdCwgMjAsIHBCdWZmZXIpOw0KKyAgICBtX2JzQ2hlY2tzdW0uUmVsZWFzZUJ1ZmZlcihuTGVuKTsNCisgICAgRlhfRnJlZShtX3BCeXRlQ29udGV4dCk7DQorICAgIG1fcEJ5dGVDb250ZXh0ID0gTlVMTDsNCisgIH0NCit9DQordm9pZCBDWEZBX0NoZWNrc3VtQ29udGV4dDo6R2V0Q2hlY2tzdW0oQ0ZYX0J5dGVTdHJpbmcmIGJzQ2hlY2tzdW0pIHsNCisgIGJzQ2hlY2tzdW0gPSBtX2JzQ2hlY2tzdW07DQorfQ0KK3ZvaWQgQ1hGQV9DaGVja3N1bUNvbnRleHQ6OlVwZGF0ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzVGV4dCkgew0KKyAgaWYgKG1fcEJ5dGVDb250ZXh0ICE9IE5VTEwpIHsNCisgICAgQ1JZUFRfU0hBMVVwZGF0ZShtX3BCeXRlQ29udGV4dCwgYnNUZXh0LkdldFB0cigpLCBic1RleHQuR2V0TGVuZ3RoKCkpOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfY2hlY2tzdW0uaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9jaGVja3N1bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNGQ5NDMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfY2hlY2tzdW0uaApAQCAtMCwwICsxLDY2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYRkFfRk9STUZJTExFUl9DSEVDS1NVTV9JTVBfSA0KKyNkZWZpbmUgX0ZYRkFfRk9STUZJTExFUl9DSEVDS1NVTV9JTVBfSA0KK2NsYXNzIENYRkFfU0FYUmVhZGVySGFuZGxlcjsNCitjbGFzcyBDWEZBX0NoZWNrc3VtQ29udGV4dDsNCitjbGFzcyBDWEZBX1NBWENvbnRleHQgew0KKyBwdWJsaWM6DQorICBDWEZBX1NBWENvbnRleHQoKSA6IG1fZU5vZGUoRlhfU0FYTk9ERV9Vbmtub3duKSB7fQ0KKyAgQ0ZYX0J5dGVUZXh0QnVmIG1fVGV4dEJ1ZjsNCisgIENGWF9CeXRlU3RyaW5nIG1fYnNUYWdOYW1lOw0KKyAgRlhfU0FYTk9ERSBtX2VOb2RlOw0KK307DQorY2xhc3MgQ1hGQV9TQVhSZWFkZXJIYW5kbGVyIDogcHVibGljIElGWF9TQVhSZWFkZXJIYW5kbGVyIHsNCisgcHVibGljOg0KKyAgQ1hGQV9TQVhSZWFkZXJIYW5kbGVyKENYRkFfQ2hlY2tzdW1Db250ZXh0KiBwQ29udGV4dCk7DQorICB2aXJ0dWFsIH5DWEZBX1NBWFJlYWRlckhhbmRsZXIoKTsNCisgIHZpcnR1YWwgdm9pZCogT25UYWdFbnRlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzVGFnTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TQVhOT0RFIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhcnRQb3MpOw0KKyAgdmlydHVhbCB2b2lkIE9uVGFnQXR0cmlidXRlKHZvaWQqIHBUYWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0F0dHJpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNWYWx1ZSk7DQorICB2aXJ0dWFsIHZvaWQgT25UYWdCcmVhayh2b2lkKiBwVGFnKTsNCisgIHZpcnR1YWwgdm9pZCBPblRhZ0RhdGEodm9pZCogcFRhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfU0FYTk9ERSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhcnRQb3MpOw0KKyAgdmlydHVhbCB2b2lkIE9uVGFnQ2xvc2Uodm9pZCogcFRhZywgRlhfRFdPUkQgZHdFbmRQb3MpOw0KKyAgdmlydHVhbCB2b2lkIE9uVGFnRW5kKHZvaWQqIHBUYWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1RhZ05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdFbmRQb3MpOw0KKw0KKyAgdmlydHVhbCB2b2lkIE9uVGFyZ2V0RGF0YSh2b2lkKiBwVGFnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TQVhOT0RFIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGFydFBvcyk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgVXBkYXRlQ2hlY2tzdW0oRlhfQk9PTCBiQ2hlY2tTcGFjZSk7DQorICBDWEZBX0NoZWNrc3VtQ29udGV4dCogbV9wQ29udGV4dDsNCisgIENYRkFfU0FYQ29udGV4dCBtX1NBWENvbnRleHQ7DQorfTsNCitjbGFzcyBDWEZBX0NoZWNrc3VtQ29udGV4dCA6IHB1YmxpYyBJWEZBX0NoZWNrc3VtQ29udGV4dCB7DQorIHB1YmxpYzoNCisgIENYRkFfQ2hlY2tzdW1Db250ZXh0KCk7DQorICB2aXJ0dWFsIH5DWEZBX0NoZWNrc3VtQ29udGV4dCgpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgU3RhcnRDaGVja3N1bSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIFVwZGF0ZUNoZWNrc3VtKElGWF9GaWxlUmVhZCogcFNyY0ZpbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0gMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IDApOw0KKyAgdmlydHVhbCB2b2lkIEZpbmlzaENoZWNrc3VtKCk7DQorICB2aXJ0dWFsIHZvaWQgR2V0Q2hlY2tzdW0oQ0ZYX0J5dGVTdHJpbmcmIGJzQ2hlY2tzdW0pOw0KKyAgdm9pZCBVcGRhdGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1RleHQpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRlhfU0FYUmVhZGVyKiBtX3BTQVhSZWFkZXI7DQorICB1aW50OF90KiBtX3BCeXRlQ29udGV4dDsNCisgIENGWF9CeXRlU3RyaW5nIG1fYnNDaGVja3N1bTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZkNvbmZpZ0FjYy5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZDb25maWdBY2MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YjdlODcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZDb25maWdBY2MuY3BwCkBAIC0wLDAgKzEsNjEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2NvbW1vbi5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZDb25maWdBY2MuaCINCitDWEZBX0ZGQ29uZmlnQWNjOjpDWEZBX0ZGQ29uZmlnQWNjKENYRkFfTm9kZSogcE5vZGUpDQorICAgIDogbV9wTm9kZShwTm9kZSksIG1fcFBzTWFwTm9kZShOVUxMKSB7fQ0KK0NYRkFfRkZDb25maWdBY2M6On5DWEZBX0ZGQ29uZmlnQWNjKCkge30NCitpbnQzMl90IENYRkFfRkZDb25maWdBY2M6OkNvdW50Q2hpbGRyZW4oKSB7DQorICBHZXRQc01hcE5vZGUoKTsNCisgIGlmIChtX3BQc01hcE5vZGUgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGludDMyX3QgaUNvdW50ID0gMDsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BQc01hcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIGZvciAoOyBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBpQ291bnQrKzsNCisgIH0NCisgIHJldHVybiBpQ291bnQ7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNvbmZpZ0FjYzo6R2V0Rm9udEluZm8oaW50MzJfdCBpbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0ZvbnRGYW1pbHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQc05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJCb2xkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXRhbGljKSB7DQorICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IENvdW50Q2hpbGRyZW4oKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDWEZBX05vZGUqIHBGb250Tm9kZSA9IG1fcFBzTWFwTm9kZS0+R2V0Q2hpbGQoaW5kZXgsIFhGQV9FTEVNRU5UX0ZvbnQpOw0KKyAgaWYgKHBGb250Tm9kZSA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHdzRm9udEZhbWlseS5FbXB0eSgpOw0KKyAgd3NQc05hbWUuRW1wdHkoKTsNCisgIGJCb2xkID0gRkFMU0U7DQorICBiSXRhbGljID0gRkFMU0U7DQorICBwRm9udE5vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX1R5cGVmYWNlLCB3c0ZvbnRGYW1pbHkpOw0KKyAgcEZvbnROb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9Qc05hbWUsIHdzUHNOYW1lKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICBwRm9udE5vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX1dlaWdodCwgd3NWYWx1ZSk7DQorICB3c1ZhbHVlLk1ha2VMb3dlcigpOw0KKyAgaWYgKHdzVmFsdWUgPT0gRlhfV1NUUkMoTCJib2xkIikpIHsNCisgICAgYkJvbGQgPSBUUlVFOw0KKyAgfQ0KKyAgcEZvbnROb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9Qb3N0dXJlLCB3c1ZhbHVlKTsNCisgIHdzVmFsdWUuTWFrZUxvd2VyKCk7DQorICBpZiAod3NWYWx1ZSA9PSBGWF9XU1RSQyhMIml0YWxpYyIpKSB7DQorICAgIGJJdGFsaWMgPSBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIHdzRm9udEZhbWlseS5HZXRMZW5ndGgoKSA+IDA7DQorfQ0KK3ZvaWQgQ1hGQV9GRkNvbmZpZ0FjYzo6R2V0UHNNYXBOb2RlKCkgew0KKyAgaWYgKG1fcE5vZGUgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBtX3BQc01hcE5vZGUgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9Qc01hcCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZkNvbmZpZ0FjYy5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmQ29uZmlnQWNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBjN2NiNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZkNvbmZpZ0FjYy5oCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhGQV9GT1JNRklMTEVSQ09ORklHQUNDX0lNUF9IDQorI2RlZmluZSBfRlhGQV9GT1JNRklMTEVSQ09ORklHQUNDX0lNUF9IDQorY2xhc3MgQ1hGQV9GRkNvbmZpZ0FjYyB7DQorIHB1YmxpYzoNCisgIENYRkFfRkZDb25maWdBY2MoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICB+Q1hGQV9GRkNvbmZpZ0FjYygpOw0KKyAgaW50MzJfdCBDb3VudENoaWxkcmVuKCk7DQorICBGWF9CT09MIEdldEZvbnRJbmZvKGludDMyX3QgaW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0ZvbnRGYW1pbHksDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BzTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQm9sZCwNCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXRhbGljKTsNCisNCisgcHJpdmF0ZToNCisgIHZvaWQgR2V0UHNNYXBOb2RlKCk7DQorICBDWEZBX05vZGUqIG1fcE5vZGU7DQorICBDWEZBX05vZGUqIG1fcFBzTWFwTm9kZTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmFwcC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZhcHAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYjYxNGIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZhcHAuY3BwCkBAIC0wLDAgKzEsMjE1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlIDxhbGdvcml0aG0+DQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2NvbW1vbi5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2NoYW5kbGVyLmgiDQorI2luY2x1ZGUgInhmYV9md2xhZGFwdGVyLmgiDQorI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZhcHAuaCINCisjaW5jbHVkZSAieGZhX2Z3bHRoZW1lLmgiDQorI2luY2x1ZGUgInhmYV9mb250bWdyLmgiDQorI2luY2x1ZGUgInhmYV9mZndpZGdldGhhbmRsZXIuaCINCisNCitDWEZBX0ZpbGVSZWFkOjpDWEZBX0ZpbGVSZWFkKGNvbnN0IENGWF9BcnJheVRlbXBsYXRlPENQREZfU3RyZWFtKj4mIHN0cmVhbXMpIHsNCisgIGludDMyX3QgaUNvdW50ID0gc3RyZWFtcy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBDUERGX1N0cmVhbUFjYyYgYWNjID0gbV9EYXRhLkFkZCgpOw0KKyAgICBhY2MuTG9hZEFsbERhdGEoc3RyZWFtc1tpXSk7DQorICB9DQorfQ0KK0ZYX0ZJTEVTSVpFIENYRkFfRmlsZVJlYWQ6OkdldFNpemUoKSB7DQorICBGWF9EV09SRCBkd1NpemUgPSAwOw0KKyAgaW50MzJfdCBpQ291bnQgPSBtX0RhdGEuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgQ1BERl9TdHJlYW1BY2MmIGFjYyA9IG1fRGF0YVtpXTsNCisgICAgZHdTaXplICs9IGFjYy5HZXRTaXplKCk7DQorICB9DQorICByZXR1cm4gZHdTaXplOw0KK30NCitGWF9CT09MIENYRkFfRmlsZVJlYWQ6OlJlYWRCbG9jayh2b2lkKiBidWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSB7DQorICBpbnQzMl90IGlDb3VudCA9IG1fRGF0YS5HZXRTaXplKCk7DQorICBpbnQzMl90IGluZGV4ID0gMDsNCisgIHdoaWxlIChpbmRleCA8IGlDb3VudCkgew0KKyAgICBDUERGX1N0cmVhbUFjYyYgYWNjID0gbV9EYXRhW2luZGV4XTsNCisgICAgRlhfRklMRVNJWkUgZHdTaXplID0gYWNjLkdldFNpemUoKTsNCisgICAgaWYgKG9mZnNldCA8IGR3U2l6ZSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIG9mZnNldCAtPSBkd1NpemU7DQorICAgIGluZGV4Kys7DQorICB9DQorICB3aGlsZSAoaW5kZXggPCBpQ291bnQpIHsNCisgICAgQ1BERl9TdHJlYW1BY2MmIGFjYyA9IG1fRGF0YVtpbmRleF07DQorICAgIEZYX0RXT1JEIGR3U2l6ZSA9IGFjYy5HZXRTaXplKCk7DQorICAgIHNpemVfdCBkd1JlYWQgPSBzdGQ6Om1pbihzaXplLCBzdGF0aWNfY2FzdDxzaXplX3Q+KGR3U2l6ZSAtIG9mZnNldCkpOw0KKyAgICBGWFNZU19tZW1jcHkoYnVmZmVyLCBhY2MuR2V0RGF0YSgpICsgb2Zmc2V0LCBkd1JlYWQpOw0KKyAgICBzaXplIC09IGR3UmVhZDsNCisgICAgaWYgKHNpemUgPT0gMCkgew0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGJ1ZmZlciA9ICh1aW50OF90KilidWZmZXIgKyBkd1JlYWQ7DQorICAgIG9mZnNldCA9IDA7DQorICAgIGluZGV4Kys7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KKy8vIHN0YXRpYw0KK0lYRkFfQXBwKiBJWEZBX0FwcDo6Q3JlYXRlKElYRkFfQXBwUHJvdmlkZXIqIHBQcm92aWRlcikgew0KKyAgcmV0dXJuIG5ldyBDWEZBX0ZGQXBwKHBQcm92aWRlcik7DQorfQ0KKy8vIHZpcnR1YWwNCitJWEZBX0FwcDo6fklYRkFfQXBwKCkge30NCitDWEZBX0ZGQXBwOjpDWEZBX0ZGQXBwKElYRkFfQXBwUHJvdmlkZXIqIHBQcm92aWRlcikNCisgICAgOiBtX3BEb2NIYW5kbGVyKG51bGxwdHIpLA0KKyAgICAgIG1fcEZXTFRoZW1lKG51bGxwdHIpLA0KKyAgICAgIG1fcFByb3ZpZGVyKHBQcm92aWRlciksDQorICAgICAgbV9wRm9udE1ncihudWxscHRyKSwNCisjaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KKyAgICAgIG1fcEZvbnRTb3VyY2UobnVsbHB0ciksDQorI2VuZGlmDQorICAgICAgbV9wQWRhcHRlcldpZGdldE1ncihudWxscHRyKSwNCisgICAgICBtX3BXaWRnZXRNZ3JEZWxlZ2F0ZShudWxscHRyKSwNCisgICAgICBtX3BGREVGb250TWdyKG51bGxwdHIpLA0KKyAgICAgIG1fcE1lbnVIYW5kbGVyKG51bGxwdHIpLA0KKyAgICAgIG1fcEFkYXB0ZXJUaHJlYWRNZ3IobnVsbHB0cikgew0KKyAgbV9wRldMQXBwID0gSUZXTF9BcHA6OkNyZWF0ZSh0aGlzKTsNCisgIEZXTF9TZXRBcHAobV9wRldMQXBwKTsNCisgIG1fcEZXTEFwcC0+SW5pdGlhbGl6ZSgpOw0KKyAgSVhGQV9UaW1lWm9uZVByb3ZpZGVyOjpDcmVhdGUoKTsNCit9DQorQ1hGQV9GRkFwcDo6fkNYRkFfRkZBcHAoKSB7DQorICBpZiAobV9wRG9jSGFuZGxlcikgew0KKyAgICBkZWxldGUgbV9wRG9jSGFuZGxlcjsNCisgIH0NCisgIGlmIChtX3BGV0xBcHApIHsNCisgICAgbV9wRldMQXBwLT5GaW5hbGl6ZSgpOw0KKyAgICBtX3BGV0xBcHAtPlJlbGVhc2UoKTsNCisgICAgZGVsZXRlIG1fcEZXTEFwcDsNCisgIH0NCisgIGlmIChtX3BGV0xUaGVtZSkgew0KKyAgICBtX3BGV0xUaGVtZS0+UmVsZWFzZSgpOw0KKyAgfQ0KKyAgaWYgKG1fcEFkYXB0ZXJXaWRnZXRNZ3IpIHsNCisgICAgZGVsZXRlIG1fcEFkYXB0ZXJXaWRnZXRNZ3I7DQorICB9DQorICBpZiAobV9wQWRhcHRlclRocmVhZE1ncikgew0KKyAgICBkZWxldGUgbV9wQWRhcHRlclRocmVhZE1ncjsNCisgICAgbV9wQWRhcHRlclRocmVhZE1nciA9IE5VTEw7DQorICB9DQorICBpZiAobV9wTWVudUhhbmRsZXIpIHsNCisgICAgZGVsZXRlIG1fcE1lbnVIYW5kbGVyOw0KKyAgICBtX3BNZW51SGFuZGxlciA9IE5VTEw7DQorICB9DQorICBJWEZBX1RpbWVab25lUHJvdmlkZXI6OkRlc3Ryb3koKTsNCisgIGlmIChtX3BGb250TWdyICE9IE5VTEwpIHsNCisgICAgZGVsZXRlIG1fcEZvbnRNZ3I7DQorICAgIG1fcEZvbnRNZ3IgPSBOVUxMOw0KKyAgfQ0KKyNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQorICBpZiAobV9wRm9udFNvdXJjZSAhPSBOVUxMKSB7DQorICAgIG1fcEZvbnRTb3VyY2UtPlJlbGVhc2UoKTsNCisgIH0NCisjZW5kaWYNCisgIGlmIChtX3BGREVGb250TWdyKSB7DQorICAgIG1fcEZERUZvbnRNZ3ItPlJlbGVhc2UoKTsNCisgIH0NCit9DQorSVhGQV9NZW51SGFuZGxlciogQ1hGQV9GRkFwcDo6R2V0TWVudUhhbmRsZXIoKSB7DQorICBpZiAoIW1fcE1lbnVIYW5kbGVyKSB7DQorICAgIG1fcE1lbnVIYW5kbGVyID0gbmV3IENYRkFfRkZNZW51SGFuZGxlcjsNCisgIH0NCisgIHJldHVybiBtX3BNZW51SGFuZGxlcjsNCit9DQorSVhGQV9Eb2NIYW5kbGVyKiBDWEZBX0ZGQXBwOjpHZXREb2NIYW5kbGVyKCkgew0KKyAgaWYgKCFtX3BEb2NIYW5kbGVyKSB7DQorICAgIG1fcERvY0hhbmRsZXIgPSBuZXcgQ1hGQV9GRkRvY0hhbmRsZXI7DQorICB9DQorICByZXR1cm4gbV9wRG9jSGFuZGxlcjsNCit9DQorSVhGQV9Eb2MqIENYRkFfRkZBcHA6OkNyZWF0ZURvYyhJWEZBX0RvY1Byb3ZpZGVyKiBwUHJvdmlkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRmlsZVJlYWQqIHBTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUYWtlT3ZlckZpbGUpIHsNCisgIENYRkFfRkZEb2MqIHBEb2MgPSBuZXcgQ1hGQV9GRkRvYyh0aGlzLCBwUHJvdmlkZXIpOw0KKyAgRlhfQk9PTCBiU3VjY2VzcyA9IHBEb2MtPk9wZW5Eb2MocFN0cmVhbSwgYlRha2VPdmVyRmlsZSk7DQorICBpZiAoIWJTdWNjZXNzKSB7DQorICAgIGRlbGV0ZSBwRG9jOw0KKyAgICBwRG9jID0gTlVMTDsNCisgIH0NCisgIHJldHVybiBwRG9jOw0KK30NCitJWEZBX0RvYyogQ1hGQV9GRkFwcDo6Q3JlYXRlRG9jKElYRkFfRG9jUHJvdmlkZXIqIHBQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBQREZEb2MpIHsNCisgIGlmIChwUERGRG9jID09IE5VTEwpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDWEZBX0ZGRG9jKiBwRG9jID0gbmV3IENYRkFfRkZEb2ModGhpcywgcFByb3ZpZGVyKTsNCisgIEZYX0JPT0wgYlN1Y2Nlc3MgPSBwRG9jLT5PcGVuRG9jKHBQREZEb2MpOw0KKyAgaWYgKCFiU3VjY2Vzcykgew0KKyAgICBkZWxldGUgcERvYzsNCisgICAgcERvYyA9IE5VTEw7DQorICB9DQorICByZXR1cm4gcERvYzsNCit9DQorDQordm9pZCBDWEZBX0ZGQXBwOjpTZXREZWZhdWx0Rm9udE1ncihJWEZBX0ZvbnRNZ3IqIHBGb250TWdyKSB7DQorICBpZiAoIW1fcEZvbnRNZ3IpIHsNCisgICAgbV9wRm9udE1nciA9IG5ldyBDWEZBX0ZvbnRNZ3IoKTsNCisgIH0NCisgIG1fcEZvbnRNZ3ItPlNldERlZkZvbnRNZ3IocEZvbnRNZ3IpOw0KK30NCitDWEZBX0ZvbnRNZ3IqIENYRkFfRkZBcHA6OkdldFhGQUZvbnRNZ3IoKSB7DQorICByZXR1cm4gbV9wRm9udE1ncjsNCit9DQorSUZYX0ZvbnRNZ3IqIENYRkFfRkZBcHA6OkdldEZERUZvbnRNZ3IoKSB7DQorICBpZiAoIW1fcEZERUZvbnRNZ3IpIHsNCisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KKyAgICBtX3BGREVGb250TWdyID0gSUZYX0ZvbnRNZ3I6OkNyZWF0ZShGWF9HZXREZWZGb250RW51bWVyYXRvcigpKTsNCisjZWxzZQ0KKyAgICBtX3BGb250U291cmNlID0gRlhfQ3JlYXRlRGVmYXVsdEZvbnRTb3VyY2VFbnVtKCk7DQorICAgIG1fcEZERUZvbnRNZ3IgPSBJRlhfRm9udE1ncjo6Q3JlYXRlKG1fcEZvbnRTb3VyY2UpOw0KKyNlbmRpZg0KKyAgfQ0KKyAgcmV0dXJuIG1fcEZERUZvbnRNZ3I7DQorfQ0KK0NYRkFfRldMVGhlbWUqIENYRkFfRkZBcHA6OkdldEZXTFRoZW1lKCkgew0KKyAgaWYgKCFtX3BGV0xUaGVtZSkgew0KKyAgICBtX3BGV0xUaGVtZSA9IG5ldyBDWEZBX0ZXTFRoZW1lKHRoaXMpOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcEZXTFRoZW1lOw0KK30NCitJRldMX0FkYXB0ZXJXaWRnZXRNZ3IqIENYRkFfRkZBcHA6OkdldFdpZGdldE1ncigNCisgICAgSUZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZSogcERlbGVnYXRlKSB7DQorICBpZiAoIW1fcEFkYXB0ZXJXaWRnZXRNZ3IpIHsNCisgICAgbV9wQWRhcHRlcldpZGdldE1nciA9IG5ldyBDWEZBX0ZXTEFkYXB0ZXJXaWRnZXRNZ3I7DQorICAgIHBEZWxlZ2F0ZS0+T25TZXRDYXBhYmlsaXR5KEZXTF9XR1RNR1JfRGlzYWJsZVRocmVhZCB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9XR1RNR1JfRGlzYWJsZUZvcm0pOw0KKyAgICBtX3BXaWRnZXRNZ3JEZWxlZ2F0ZSA9IHBEZWxlZ2F0ZTsNCisgIH0NCisgIHJldHVybiBtX3BBZGFwdGVyV2lkZ2V0TWdyOw0KK30NCitJRldMX0FkYXB0ZXJUaHJlYWRNZ3IqIENYRkFfRkZBcHA6OkdldFRocmVhZE1ncigpIHsNCisgIGlmICghbV9wQWRhcHRlclRocmVhZE1ncikgew0KKyAgICBtX3BBZGFwdGVyVGhyZWFkTWdyID0gbmV3IENGV0xfU0RBZGFwdGVyVGhyZWFkTWdyOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcEFkYXB0ZXJUaHJlYWRNZ3I7DQorfQ0KK0lGV0xfQWRhcHRlclRpbWVyTWdyKiBDWEZBX0ZGQXBwOjpHZXRUaW1lck1ncigpIHsNCisgIHJldHVybiBtX3BQcm92aWRlci0+R2V0VGltZXJNZ3IoKTsNCit9DQorSUZXTF9BZGFwdGVyQ3Vyc29yTWdyKiBDWEZBX0ZGQXBwOjpHZXRDdXJzb3JNZ3IoKSB7DQorICByZXR1cm4gTlVMTDsNCit9DQorSUZXTF9BZGFwdGVyTW9uaXRvck1nciogQ1hGQV9GRkFwcDo6R2V0TW9uaXRvck1ncigpIHsNCisgIHJldHVybiBOVUxMOw0KK30NCitJRldMX0FkYXB0ZXJDbGlwYm9hcmRNZ3IqIENYRkFfRkZBcHA6OkdldENsaXBib2FyZE1ncigpIHsNCisgIHJldHVybiBOVUxMOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZhcHAuaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmFwcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOTM1MzgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZhcHAuaApAQCAtMCwwICsxLDc1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgWEZBX0ZGQVBQX0hfDQorI2RlZmluZSBYRkFfRkZBUFBfSF8NCisNCitjbGFzcyBDWEZBX0ZpbGVSZWFkIDogcHVibGljIElGWF9GaWxlUmVhZCB7DQorIHB1YmxpYzoNCisgIGV4cGxpY2l0IENYRkFfRmlsZVJlYWQoY29uc3QgQ0ZYX0FycmF5VGVtcGxhdGU8Q1BERl9TdHJlYW0qPiYgc3RyZWFtcyk7DQorDQorICB2aXJ0dWFsIEZYX0ZJTEVTSVpFIEdldFNpemUoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKTsNCisNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRlhfT2JqZWN0QXJyYXk8Q1BERl9TdHJlYW1BY2M+IG1fRGF0YTsNCit9Ow0KK2NsYXNzIENYRkFfRldMQWRhcHRlcldpZGdldE1ncjsNCitjbGFzcyBDWEZBX0ZXTFRoZW1lOw0KK2NsYXNzIENYRkFfRkZEb2NIYW5kbGVyOw0KK2NsYXNzIENYRkFfRkZNZW51SGFuZGxlcjsNCitjbGFzcyBDWEZBX0ZvbnRNZ3I7DQorY2xhc3MgQ1hGQV9GRkFwcCA6IHB1YmxpYyBJWEZBX0FwcCwgcHVibGljIElGV0xfQWRhcHRlck5hdGl2ZSB7DQorIHB1YmxpYzoNCisgIENYRkFfRkZBcHAoSVhGQV9BcHBQcm92aWRlciogcFByb3ZpZGVyKTsNCisgIH5DWEZBX0ZGQXBwKCkgb3ZlcnJpZGU7DQorDQorICAvLyBJRlhGQV9BcHA6DQorICBJWEZBX0RvY0hhbmRsZXIqIEdldERvY0hhbmRsZXIoKSBvdmVycmlkZTsNCisgIElYRkFfRG9jKiBDcmVhdGVEb2MoSVhGQV9Eb2NQcm92aWRlciogcFByb3ZpZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICBJRlhfRmlsZVJlYWQqIHBTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRha2VPdmVyRmlsZSkgb3ZlcnJpZGU7DQorICBJWEZBX0RvYyogQ3JlYXRlRG9jKElYRkFfRG9jUHJvdmlkZXIqIHBQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcFBERkRvYykgb3ZlcnJpZGU7DQorICBJWEZBX0FwcFByb3ZpZGVyKiBHZXRBcHBQcm92aWRlcigpIG92ZXJyaWRlIHsgcmV0dXJuIG1fcFByb3ZpZGVyOyB9DQorICB2b2lkIFNldERlZmF1bHRGb250TWdyKElYRkFfRm9udE1nciogcEZvbnRNZ3IpIG92ZXJyaWRlOw0KKyAgSVhGQV9NZW51SGFuZGxlciogR2V0TWVudUhhbmRsZXIoKSBvdmVycmlkZTsNCisNCisgIC8vIElGV0xfQWRhcHRlck5hdGl2ZToNCisgIElGV0xfQWRhcHRlcldpZGdldE1nciogR2V0V2lkZ2V0TWdyKA0KKyAgICAgIElGV0xfV2lkZ2V0TWdyRGVsZWdhdGUqIHBEZWxlZ2F0ZSkgb3ZlcnJpZGU7DQorICBJRldMX0FkYXB0ZXJUaHJlYWRNZ3IqIEdldFRocmVhZE1ncigpIG92ZXJyaWRlOw0KKyAgSUZXTF9BZGFwdGVyVGltZXJNZ3IqIEdldFRpbWVyTWdyKCkgb3ZlcnJpZGU7DQorICBJRldMX0FkYXB0ZXJDdXJzb3JNZ3IqIEdldEN1cnNvck1ncigpIG92ZXJyaWRlOw0KKyAgSUZXTF9BZGFwdGVyTW9uaXRvck1nciogR2V0TW9uaXRvck1ncigpIG92ZXJyaWRlOw0KKyAgSUZXTF9BZGFwdGVyQ2xpcGJvYXJkTWdyKiBHZXRDbGlwYm9hcmRNZ3IoKSBvdmVycmlkZTsNCisNCisgIENYRkFfRm9udE1nciogR2V0WEZBRm9udE1ncigpOw0KKyAgSUZYX0ZvbnRNZ3IqIEdldEZERUZvbnRNZ3IoKTsNCisgIENYRkFfRldMVGhlbWUqIEdldEZXTFRoZW1lKCk7DQorICBJRldMX1dpZGdldE1nckRlbGVnYXRlKiBHZXRXaWRnZXRNZ3JEZWxlZ2F0ZSgpIHsNCisgICAgcmV0dXJuIG1fcFdpZGdldE1nckRlbGVnYXRlOw0KKyAgfQ0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDWEZBX0ZGRG9jSGFuZGxlciogbV9wRG9jSGFuZGxlcjsNCisgIElGV0xfQXBwKiBtX3BGV0xBcHA7DQorICBDWEZBX0ZXTFRoZW1lKiBtX3BGV0xUaGVtZTsNCisgIElYRkFfQXBwUHJvdmlkZXIqIG1fcFByb3ZpZGVyOw0KKyAgQ1hGQV9Gb250TWdyKiBtX3BGb250TWdyOw0KKyNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQorICBJRlhfRm9udFNvdXJjZUVudW0qIG1fcEZvbnRTb3VyY2U7DQorI2VuZGlmDQorICBDWEZBX0ZXTEFkYXB0ZXJXaWRnZXRNZ3IqIG1fcEFkYXB0ZXJXaWRnZXRNZ3I7DQorICBJRldMX1dpZGdldE1nckRlbGVnYXRlKiBtX3BXaWRnZXRNZ3JEZWxlZ2F0ZTsNCisgIElGWF9Gb250TWdyKiBtX3BGREVGb250TWdyOw0KKyAgQ1hGQV9GRk1lbnVIYW5kbGVyKiBtX3BNZW51SGFuZGxlcjsNCisgIENGV0xfU0RBZGFwdGVyVGhyZWFkTWdyKiBtX3BBZGFwdGVyVGhyZWFkTWdyOw0KK307DQorDQorI2VuZGlmICAvLyBYRkFfRkZBUFBfSF8NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZiYXJjb2RlLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmJhcmNvZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZTg0MjYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZiYXJjb2RlLmNwcApAQCAtMCwwICsxLDIzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfY29tbW9uLmgiDQorI2luY2x1ZGUgInhmYV9md2xhZGFwdGVyLmgiDQorI2luY2x1ZGUgInhmYV9mZndpZGdldC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZmaWVsZC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZwYWdldmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ0ZXh0ZWRpdC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZiYXJjb2RlLmgiDQorc3RhdGljIFhGQV9MUENCQVJDT0RFVFlQRUVOVU1JTkZPIFhGQV9HZXRCYXJjb2RlVHlwZUJ5TmFtZSgNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpOw0KK0NYRkFfRkZCYXJjb2RlOjpDWEZBX0ZGQmFyY29kZShDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQ0KKyAgICA6IENYRkFfRkZUZXh0RWRpdChwUGFnZVZpZXcsIHBEYXRhQWNjKSB7fQ0KK0NYRkFfRkZCYXJjb2RlOjp+Q1hGQV9GRkJhcmNvZGUoKSB7fQ0KK0ZYX0JPT0wgQ1hGQV9GRkJhcmNvZGU6OkxvYWRXaWRnZXQoKSB7DQorICBDRldMX0JhcmNvZGUqIHBGV0xCYXJjb2RlID0gQ0ZXTF9CYXJjb2RlOjpDcmVhdGUoKTsNCisgIGlmIChwRldMQmFyY29kZSkgew0KKyAgICBwRldMQmFyY29kZS0+SW5pdGlhbGl6ZSgpOw0KKyAgfQ0KKyAgbV9wTm9ybWFsV2lkZ2V0ID0gcEZXTEJhcmNvZGU7DQorICBJRldMX1dpZGdldCogcFdpZGdldCA9IG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCk7DQorICBtX3BOb3JtYWxXaWRnZXQtPlNldFByaXZhdGVEYXRhKHBXaWRnZXQsIHRoaXMsIE5VTEwpOw0KKyAgSUZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9IEZXTF9HZXRBcHAoKS0+R2V0Tm90ZURyaXZlcigpOw0KKyAgcE5vdGVEcml2ZXItPlJlZ2lzdGVyRXZlbnRUYXJnZXQocFdpZGdldCwgcFdpZGdldCk7DQorICBtX3BPbGREZWxlZ2F0ZSA9IG1fcE5vcm1hbFdpZGdldC0+U2V0RGVsZWdhdGUodGhpcyk7DQorICBtX3BOb3JtYWxXaWRnZXQtPkxvY2tVcGRhdGUoKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgIG1fcERhdGFBY2MtPkdldFZhbHVlKHdzVGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsNCisgIHBGV0xCYXJjb2RlLT5TZXRUZXh0KHdzVGV4dCk7DQorICBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5VbmxvY2tVcGRhdGUoKTsNCisgIHJldHVybiBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKTsNCit9DQordm9pZCBDWEZBX0ZGQmFyY29kZTo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXR1cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlKSB7DQorICBpZiAoIUlzTWF0Y2hWaXNpYmxlU3RhdHVzKGR3U3RhdHVzKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfTWF0cml4IG10Um90YXRlOw0KKyAgR2V0Um90YXRlTWF0cml4KG10Um90YXRlKTsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIG10Um90YXRlLkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzKTsNCisgIENYRkFfQm9yZGVyIGJvcmRlclVJID0gbV9wRGF0YUFjYy0+R2V0VUlCb3JkZXIoKTsNCisgIERyYXdCb3JkZXIocEdTLCBib3JkZXJVSSwgbV9ydFVJLCAmbXRSb3RhdGUpOw0KKyAgUmVuZGVyQ2FwdGlvbihwR1MsICZtdFJvdGF0ZSk7DQorICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldFJlY3QocnRXaWRnZXQpOw0KKyAgQ0ZYX01hdHJpeCBtdDsNCisgIG10LlNldCgxLCAwLCAwLCAxLCBydFdpZGdldC5sZWZ0LCBydFdpZGdldC50b3ApOw0KKyAgbXQuQ29uY2F0KG10Um90YXRlKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+RHJhd1dpZGdldChwR1MsICZtdCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkJhcmNvZGU6OlVwZGF0ZVdpZGdldFByb3BlcnR5KCkgew0KKyAgQ1hGQV9GRlRleHRFZGl0OjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOw0KKyAgQ0ZXTF9CYXJjb2RlKiBwQmFyQ29kZVdpZGdldCA9IChDRldMX0JhcmNvZGUqKW1fcE5vcm1hbFdpZGdldDsNCisgIENGWF9XaWRlU3RyaW5nIHdzVHlwZSA9IEdldERhdGFBY2MoKS0+R2V0QmFyY29kZVR5cGUoKTsNCisgIFhGQV9MUENCQVJDT0RFVFlQRUVOVU1JTkZPIHBCYXJjb2RlVHlwZUluZm8gPQ0KKyAgICAgIFhGQV9HZXRCYXJjb2RlVHlwZUJ5TmFtZSh3c1R5cGUpOw0KKyAgcEJhckNvZGVXaWRnZXQtPlNldFR5cGUocEJhcmNvZGVUeXBlSW5mby0+ZUJDVHlwZSk7DQorICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IEdldERhdGFBY2MoKTsNCisgIGludDMyX3QgaW50VmFsOw0KKyAgRlhfQ0hBUiBjaGFyVmFsOw0KKyAgRlhfQk9PTCBib29sVmFsOw0KKyAgRlhfRkxPQVQgZmxvYXRWYWw7DQorICBpZiAocEFjYy0+R2V0QmFyY29kZUF0dHJpYnV0ZV9DaGFyRW5jb2RpbmcoaW50VmFsKSkgew0KKyAgICBwQmFyQ29kZVdpZGdldC0+U2V0Q2hhckVuY29kaW5nKChCQ19DSEFSX0VOQ09ESU5HKWludFZhbCk7DQorICB9DQorICBpZiAocEFjYy0+R2V0QmFyY29kZUF0dHJpYnV0ZV9DaGVja3N1bShpbnRWYWwpKSB7DQorICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXRDYWxDaGVja3N1bShpbnRWYWwpOw0KKyAgfQ0KKyAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfRGF0YUxlbmd0aChpbnRWYWwpKSB7DQorICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXREYXRhTGVuZ3RoKGludFZhbCk7DQorICB9DQorICBpZiAocEFjYy0+R2V0QmFyY29kZUF0dHJpYnV0ZV9TdGFydENoYXIoY2hhclZhbCkpIHsNCisgICAgcEJhckNvZGVXaWRnZXQtPlNldFN0YXJ0Q2hhcihjaGFyVmFsKTsNCisgIH0NCisgIGlmIChwQWNjLT5HZXRCYXJjb2RlQXR0cmlidXRlX0VuZENoYXIoY2hhclZhbCkpIHsNCisgICAgcEJhckNvZGVXaWRnZXQtPlNldEVuZENoYXIoY2hhclZhbCk7DQorICB9DQorICBpZiAocEFjYy0+R2V0QmFyY29kZUF0dHJpYnV0ZV9FQ0xldmVsKGludFZhbCkpIHsNCisgICAgcEJhckNvZGVXaWRnZXQtPlNldEVycm9yQ29ycmVjdGlvbkxldmVsKGludFZhbCk7DQorICB9DQorICBpZiAocEFjYy0+R2V0QmFyY29kZUF0dHJpYnV0ZV9Nb2R1bGVXaWR0aChpbnRWYWwpKSB7DQorICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXRNb2R1bGVXaWR0aChpbnRWYWwpOw0KKyAgfQ0KKyAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfTW9kdWxlSGVpZ2h0KGludFZhbCkpIHsNCisgICAgcEJhckNvZGVXaWRnZXQtPlNldE1vZHVsZUhlaWdodChpbnRWYWwpOw0KKyAgfQ0KKyAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfUHJpbnRDaGVja3N1bShib29sVmFsKSkgew0KKyAgICBwQmFyQ29kZVdpZGdldC0+U2V0UHJpbnRDaGVja3N1bShib29sVmFsKTsNCisgIH0NCisgIGlmIChwQWNjLT5HZXRCYXJjb2RlQXR0cmlidXRlX1RleHRMb2NhdGlvbihpbnRWYWwpKSB7DQorICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXRUZXh0TG9jYXRpb24oKEJDX1RFWFRfTE9DKWludFZhbCk7DQorICB9DQorICBpZiAocEFjYy0+R2V0QmFyY29kZUF0dHJpYnV0ZV9UcnVuY2F0ZShib29sVmFsKSkgew0KKyAgICBwQmFyQ29kZVdpZGdldC0+U2V0VHJ1bmNhdGVkKGJvb2xWYWwpOw0KKyAgfQ0KKyAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfV2lkZU5hcnJvd1JhdGlvKGZsb2F0VmFsKSkgew0KKyAgICBwQmFyQ29kZVdpZGdldC0+U2V0V2lkZU5hcnJvd1JhdGlvKChpbnQzMl90KWZsb2F0VmFsKTsNCisgIH0NCisgIGlmIChwQmFyY29kZVR5cGVJbmZvLT5lTmFtZSA9PSBYRkFfQkFSQ09ERVRZUEVfY29kZTNPZjkgfHwNCisgICAgICBwQmFyY29kZVR5cGVJbmZvLT5lTmFtZSA9PSBYRkFfQkFSQ09ERVRZUEVfZWFuOCB8fA0KKyAgICAgIHBCYXJjb2RlVHlwZUluZm8tPmVOYW1lID09IFhGQV9CQVJDT0RFVFlQRV9lYW4xMyB8fA0KKyAgICAgIHBCYXJjb2RlVHlwZUluZm8tPmVOYW1lID09IFhGQV9CQVJDT0RFVFlQRV91cGNBKSB7DQorICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXRQcmludENoZWNrc3VtKFRSVUUpOw0KKyAgfQ0KK30NCitGWF9CT09MIENYRkFfRkZCYXJjb2RlOjpPbkxCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICBDRldMX0JhcmNvZGUqIHBCYXJDb2RlV2lkZ2V0ID0gKENGV0xfQmFyY29kZSopbV9wTm9ybWFsV2lkZ2V0Ow0KKyAgaWYgKCFwQmFyQ29kZVdpZGdldCB8fCBwQmFyQ29kZVdpZGdldC0+SXNQcm90ZWN0ZWRUeXBlKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4pIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIENYRkFfRkZUZXh0RWRpdDo6T25MQnV0dG9uRG93bihkd0ZsYWdzLCBmeCwgZnkpOw0KK30NCitGWF9CT09MIENYRkFfRkZCYXJjb2RlOjpPblJCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICBDRldMX0JhcmNvZGUqIHBCYXJDb2RlV2lkZ2V0ID0gKENGV0xfQmFyY29kZSopbV9wTm9ybWFsV2lkZ2V0Ow0KKyAgaWYgKCFwQmFyQ29kZVdpZGdldCB8fCBwQmFyQ29kZVdpZGdldC0+SXNQcm90ZWN0ZWRUeXBlKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIENYRkFfRkZUZXh0RWRpdDo6T25SQnV0dG9uRG93bihkd0ZsYWdzLCBmeCwgZnkpOw0KK30NCitleHRlcm4gY29uc3QgWEZBX0JBUkNPREVUWVBFRU5VTUlORk8gZ19YRkFCYXJDb2RlVHlwZUVudW1EYXRhW10gPSB7DQorICAgIHsweDdmYjRhMTgsIEwiZWFuMTMiLCBYRkFfQkFSQ09ERVRZUEVfZWFuMTMsIEJDX0VBTjEzfSwNCisgICAgezB4OGQxM2EzZCwgTCJjb2RlMTEiLCBYRkFfQkFSQ09ERVRZUEVfY29kZTExLCBCQ19VTktOT1dOfSwNCisgICAgezB4OGQxNDlhOCwgTCJjb2RlNDkiLCBYRkFfQkFSQ09ERVRZUEVfY29kZTQ5LCBCQ19VTktOT1dOfSwNCisgICAgezB4OGQxNjM0NywgTCJjb2RlOTMiLCBYRkFfQkFSQ09ERVRZUEVfY29kZTkzLCBCQ19VTktOT1dOfSwNCisgICAgezB4OTFhOTJlMiwgTCJ1cHNNYXhpY29kZSIsIFhGQV9CQVJDT0RFVFlQRV91cHNNYXhpY29kZSwgQkNfVU5LTk9XTn0sDQorICAgIHsweGE3ZDQ4ZGMsIEwiZmltIiwgWEZBX0JBUkNPREVUWVBFX2ZpbSwgQkNfVU5LTk9XTn0sDQorICAgIHsweGIzNTlmZTksIEwibXNpIiwgWEZBX0JBUkNPREVUWVBFX21zaSwgQkNfVU5LTk9XTn0sDQorICAgIHsweDEyMWY3MzhjLCBMImNvZGUyT2Y1TWF0cml4IiwgWEZBX0JBUkNPREVUWVBFX2NvZGUyT2Y1TWF0cml4LCBCQ19VTktOT1dOfSwNCisgICAgezB4MTUzNTg2MTYsIEwidWNjMTI4IiwgWEZBX0JBUkNPREVUWVBFX3VjYzEyOCwgQkNfVU5LTk9XTn0sDQorICAgIHsweDFmNGJmYTA1LCBMInJmaWQiLCBYRkFfQkFSQ09ERVRZUEVfcmZpZCwgQkNfVU5LTk9XTn0sDQorICAgIHsweDFmZGE3MWJjLCBMInJzczE0U3RhY2tlZCIsIFhGQV9CQVJDT0RFVFlQRV9yc3MxNFN0YWNrZWQsIEJDX1VOS05PV059LA0KKyAgICB7MHgyMjA2NTA4NywgTCJlYW44YWRkMiIsIFhGQV9CQVJDT0RFVFlQRV9lYW44YWRkMiwgQkNfVU5LTk9XTn0sDQorICAgIHsweDIyMDY1MDhhLCBMImVhbjhhZGQ1IiwgWEZBX0JBUkNPREVUWVBFX2VhbjhhZGQ1LCBCQ19VTktOT1dOfSwNCisgICAgezB4MjI3ODM2NmMsIEwiY29kYWJhciIsIFhGQV9CQVJDT0RFVFlQRV9jb2RhYmFyLCBCQ19DT0RBQkFSfSwNCisgICAgezB4MmEwMzlhOGQsIEwidGVsZXBlbiIsIFhGQV9CQVJDT0RFVFlQRV90ZWxlcGVuLCBCQ19VTktOT1dOfSwNCisgICAgezB4MzIzZWQzMzcsIEwidXBjQXB3Y2QiLCBYRkFfQkFSQ09ERVRZUEVfdXBjQXB3Y2QsIEJDX1VOS05PV059LA0KKyAgICB7MHgzNDdhMTg0NiwgTCJwb3N0VVNJTUIiLCBYRkFfQkFSQ09ERVRZUEVfcG9zdFVTSU1CLCBCQ19VTktOT1dOfSwNCisgICAgezB4MzkxYmI4MzYsIEwiY29kZTEyOCIsIFhGQV9CQVJDT0RFVFlQRV9jb2RlMTI4LCBCQ19DT0RFMTI4fSwNCisgICAgezB4Mzk4ZWRkYWYsIEwiZGF0YU1hdHJpeCIsIFhGQV9CQVJDT0RFVFlQRV9kYXRhTWF0cml4LCBCQ19EQVRBTUFUUklYfSwNCisgICAgezB4M2NmZjYwYTgsIEwidXBjRWFkZDIiLCBYRkFfQkFSQ09ERVRZUEVfdXBjRWFkZDIsIEJDX1VOS05PV059LA0KKyAgICB7MHgzY2ZmNjBhYiwgTCJ1cGNFYWRkNSIsIFhGQV9CQVJDT0RFVFlQRV91cGNFYWRkNSwgQkNfVU5LTk9XTn0sDQorICAgIHsweDQwMmNiMTg4LCBMImNvZGUyT2Y1U3RhbmRhcmQiLCBYRkFfQkFSQ09ERVRZUEVfY29kZTJPZjVTdGFuZGFyZCwNCisgICAgIEJDX1VOS05PV059LA0KKyAgICB7MHg0MTE3NjRmNywgTCJhenRlYyIsIFhGQV9CQVJDT0RFVFlQRV9henRlYywgQkNfVU5LTk9XTn0sDQorICAgIHsweDQ0ZDRlODRjLCBMImVhbjgiLCBYRkFfQkFSQ09ERVRZUEVfZWFuOCwgQkNfRUFOOH0sDQorICAgIHsweDQ4NDY4OTAyLCBMInVjYzEyOHNzY2MiLCBYRkFfQkFSQ09ERVRZUEVfdWNjMTI4c3NjYywgQkNfVU5LTk9XTn0sDQorICAgIHsweDQ4ODBhZWE0LCBMInVwY0FhZGQyIiwgWEZBX0JBUkNPREVUWVBFX3VwY0FhZGQyLCBCQ19VTktOT1dOfSwNCisgICAgezB4NDg4MGFlYTcsIEwidXBjQWFkZDUiLCBYRkFfQkFSQ09ERVRZUEVfdXBjQWFkZDUsIEJDX1VOS05PV059LA0KKyAgICB7MHg1NGYxODI1NiwgTCJjb2RlMk9mNUluZHVzdHJpYWwiLCBYRkFfQkFSQ09ERVRZUEVfY29kZTJPZjVJbmR1c3RyaWFsLA0KKyAgICAgQkNfVU5LTk9XTn0sDQorICAgIHsweDU4ZTE1ZjI1LCBMInJzczE0TGltaXRlZCIsIFhGQV9CQVJDT0RFVFlQRV9yc3MxNExpbWl0ZWQsIEJDX1VOS05PV059LA0KKyAgICB7MHg1YzA4ZDFiOSwgTCJwb3N0QVVTUmVwbHlQYWlkIiwgWEZBX0JBUkNPREVUWVBFX3Bvc3RBVVNSZXBseVBhaWQsDQorICAgICBCQ19VTktOT1dOfSwNCisgICAgezB4NWZhNzAwYmQsIEwicnNzMTQiLCBYRkFfQkFSQ09ERVRZUEVfcnNzMTQsIEJDX1VOS05PV059LA0KKyAgICB7MHg2MzFhN2UzNSwgTCJsb2dtYXJzIiwgWEZBX0JBUkNPREVUWVBFX2xvZ21hcnMsIEJDX1VOS05PV059LA0KKyAgICB7MHg2YTIzNjIzNiwgTCJwZGY0MTciLCBYRkFfQkFSQ09ERVRZUEVfcGRmNDE3LCBCQ19QREY0MTd9LA0KKyAgICB7MHg2ZDA5OGVjZSwgTCJ1cGNlYW4yIiwgWEZBX0JBUkNPREVUWVBFX3VwY2VhbjIsIEJDX1VOS05PV059LA0KKyAgICB7MHg2ZDA5OGVkMSwgTCJ1cGNlYW41IiwgWEZBX0JBUkNPREVUWVBFX3VwY2VhbjUsIEJDX1VOS05PV059LA0KKyAgICB7MHg3NmIwNGVlZCwgTCJjb2RlM09mOWV4dGVuZGVkIiwgWEZBX0JBUkNPREVUWVBFX2NvZGUzT2Y5ZXh0ZW5kZWQsDQorICAgICBCQ19VTktOT1dOfSwNCisgICAgezB4N2M3ZGI4NGEsIEwibWF4aWNvZGUiLCBYRkFfQkFSQ09ERVRZUEVfbWF4aWNvZGUsIEJDX1VOS05PV059LA0KKyAgICB7MHg4MjY2ZjdmNywgTCJ1Y2MxMjhyYW5kb20iLCBYRkFfQkFSQ09ERVRZUEVfdWNjMTI4cmFuZG9tLCBCQ19VTktOT1dOfSwNCisgICAgezB4ODNlY2ExNDcsIEwicG9zdFVTRFBCQyIsIFhGQV9CQVJDT0RFVFlQRV9wb3N0VVNEUEJDLCBCQ19VTktOT1dOfSwNCisgICAgezB4OGRkNzFkZTAsIEwicG9zdEFVU1N0YW5kYXJkIiwgWEZBX0JBUkNPREVUWVBFX3Bvc3RBVVNTdGFuZGFyZCwNCisgICAgIEJDX1VOS05PV059LA0KKyAgICB7MHg5OGFkYWQ4NSwgTCJwbGVzc2V5IiwgWEZBX0JBUkNPREVUWVBFX3BsZXNzZXksIEJDX1VOS05PV059LA0KKyAgICB7MHg5Zjg0Y2NlNiwgTCJlYW4xM3B3Y2QiLCBYRkFfQkFSQ09ERVRZUEVfZWFuMTNwd2NkLCBCQ19VTktOT1dOfSwNCisgICAgezB4YjUxNGZiZTksIEwidXBjQSIsIFhGQV9CQVJDT0RFVFlQRV91cGNBLCBCQ19VUENBfSwNCisgICAgezB4YjUxNGZiZWQsIEwidXBjRSIsIFhGQV9CQVJDT0RFVFlQRV91cGNFLCBCQ19VTktOT1dOfSwNCisgICAgezB4YjVjNmE4NTMsIEwiZWFuMTNhZGQyIiwgWEZBX0JBUkNPREVUWVBFX2VhbjEzYWRkMiwgQkNfVU5LTk9XTn0sDQorICAgIHsweGI1YzZhODU2LCBMImVhbjEzYWRkNSIsIFhGQV9CQVJDT0RFVFlQRV9lYW4xM2FkZDUsIEJDX1VOS05PV059LA0KKyAgICB7MHhiODFmYzUxMiwgTCJwb3N0VUtSTTRTQ0MiLCBYRkFfQkFSQ09ERVRZUEVfcG9zdFVLUk00U0NDLCBCQ19VTktOT1dOfSwNCisgICAgezB4YmFkMzRiMjIsIEwiY29kZTEyOFNTQ0MiLCBYRkFfQkFSQ09ERVRZUEVfY29kZTEyOFNTQ0MsIEJDX1VOS05PV059LA0KKyAgICB7MHhiZmJlMGNmNiwgTCJwb3N0VVM1WmlwIiwgWEZBX0JBUkNPREVUWVBFX3Bvc3RVUzVaaXAsIEJDX1VOS05PV059LA0KKyAgICB7MHhjNTY2MThlOCwgTCJwZGY0MTdtYWNybyIsIFhGQV9CQVJDT0RFVFlQRV9wZGY0MTdtYWNybywgQkNfVU5LTk9XTn0sDQorICAgIHsweGNhNzMwZjhhLCBMImNvZGUyT2Y1SW50ZXJsZWF2ZWQiLCBYRkFfQkFSQ09ERVRZUEVfY29kZTJPZjVJbnRlcmxlYXZlZCwNCisgICAgIEJDX1VOS05PV059LA0KKyAgICB7MHhkMDA5N2FjNiwgTCJyc3MxNEV4cGFuZGVkIiwgWEZBX0JBUkNPREVUWVBFX3JzczE0RXhwYW5kZWQsIEJDX1VOS05PV059LA0KKyAgICB7MHhkMjVhMDI0MCwgTCJwb3N0QVVTQ3VzdDIiLCBYRkFfQkFSQ09ERVRZUEVfcG9zdEFVU0N1c3QyLCBCQ19VTktOT1dOfSwNCisgICAgezB4ZDI1YTAyNDEsIEwicG9zdEFVU0N1c3QzIiwgWEZBX0JBUkNPREVUWVBFX3Bvc3RBVVNDdXN0MywgQkNfVU5LTk9XTn0sDQorICAgIHsweGQ1M2VkM2U3LCBMInJzczE0VHJ1bmNhdGVkIiwgWEZBX0JBUkNPREVUWVBFX3JzczE0VHJ1bmNhdGVkLCBCQ19VTktOT1dOfSwNCisgICAgezB4ZTcyYmNkNTcsIEwiY29kZTEyOEEiLCBYRkFfQkFSQ09ERVRZUEVfY29kZTEyOEEsIEJDX1VOS05PV059LA0KKyAgICB7MHhlNzJiY2Q1OCwgTCJjb2RlMTI4QiIsIFhGQV9CQVJDT0RFVFlQRV9jb2RlMTI4QiwgQkNfQ09ERTEyOF9CfSwNCisgICAgezB4ZTcyYmNkNTksIEwiY29kZTEyOEMiLCBYRkFfQkFSQ09ERVRZUEVfY29kZTEyOEMsIEJDX0NPREUxMjhfQ30sDQorICAgIHsweGVlODNjNTBmLCBMInJzczE0U3RhY2tlZE9tbmkiLCBYRkFfQkFSQ09ERVRZUEVfcnNzMTRTdGFja2VkT21uaSwNCisgICAgIEJDX1VOS05PV059LA0KKyAgICB7MHhmMmExOGY3ZSwgTCJRUkNvZGUiLCBYRkFfQkFSQ09ERVRZUEVfUVJDb2RlLCBCQ19RUl9DT0RFfSwNCisgICAgezB4ZmFlYWYzN2YsIEwicG9zdFVTU3RhbmRhcmQiLCBYRkFfQkFSQ09ERVRZUEVfcG9zdFVTU3RhbmRhcmQsIEJDX1VOS05PV059LA0KKyAgICB7MHhmYjQ4MTU1YywgTCJjb2RlM09mOSIsIFhGQV9CQVJDT0RFVFlQRV9jb2RlM09mOSwgQkNfQ09ERTM5fSwNCit9Ow0KK2V4dGVybiBjb25zdCBpbnQzMl90IGdfaVhGQUJhcmNvZGVUeXBlQ291bnQgPQ0KKyAgICBzaXplb2YoZ19YRkFCYXJDb2RlVHlwZUVudW1EYXRhKSAvIHNpemVvZihYRkFfQkFSQ09ERVRZUEVFTlVNSU5GTyk7DQorc3RhdGljIFhGQV9MUENCQVJDT0RFVFlQRUVOVU1JTkZPIFhGQV9HZXRCYXJjb2RlVHlwZUJ5TmFtZSgNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHdzTmFtZS5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoID09IDApIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICB1aW50MzJfdCB1SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTmFtZS5HZXRQdHIoKSwgaUxlbmd0aCwgVFJVRSk7DQorICBpbnQzMl90IGlTdGFydCA9IDAsIGlFbmQgPSBnX2lYRkFCYXJjb2RlVHlwZUNvdW50IC0gMTsNCisgIGRvIHsNCisgICAgaW50MzJfdCBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgWEZBX0xQQ0JBUkNPREVUWVBFRU5VTUlORk8gcEluZm8gPSBnX1hGQUJhckNvZGVUeXBlRW51bURhdGEgKyBpTWlkOw0KKyAgICBpZiAodUhhc2ggPT0gcEluZm8tPnVIYXNoKSB7DQorICAgICAgcmV0dXJuIHBJbmZvOw0KKyAgICB9IGVsc2UgaWYgKHVIYXNoIDwgcEluZm8tPnVIYXNoKSB7DQorICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICB9DQorICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICByZXR1cm4gTlVMTDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmYmFyY29kZS5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmYmFyY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMzgzNDMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZiYXJjb2RlLmgKQEAgLTAsMCArMSw5NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWEZBX0ZPUk1GSUxMRVJfQkFSQ09ERV9JTVBfSA0KKyNkZWZpbmUgX0ZYRkFfRk9STUZJTExFUl9CQVJDT0RFX0lNUF9IDQorY2xhc3MgQ1hGQV9GRlRleHRFZGl0Ow0KK2NsYXNzIENYRkFfRkZCYXJjb2RlIDogcHVibGljIENYRkFfRkZUZXh0RWRpdCB7DQorIHB1YmxpYzoNCisgIENYRkFfRkZCYXJjb2RlKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgdmlydHVhbCB+Q1hGQV9GRkJhcmNvZGUoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBMb2FkV2lkZ2V0KCk7DQorICB2aXJ0dWFsIHZvaWQgUmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMgPSAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSb3RhdGUgPSAwKTsNCisgIHZpcnR1YWwgdm9pZCBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPblJCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorfTsNCitlbnVtIFhGQV9CQVJDT0RFVFlQRUVOVU0gew0KKyAgWEZBX0JBUkNPREVUWVBFX2F6dGVjLA0KKyAgWEZBX0JBUkNPREVUWVBFX2NvZGFiYXIsDQorICBYRkFfQkFSQ09ERVRZUEVfY29kZTExLA0KKyAgWEZBX0JBUkNPREVUWVBFX2NvZGUxMjgsDQorICBYRkFfQkFSQ09ERVRZUEVfY29kZTEyOEEsDQorICBYRkFfQkFSQ09ERVRZUEVfY29kZTEyOEIsDQorICBYRkFfQkFSQ09ERVRZUEVfY29kZTEyOEMsDQorICBYRkFfQkFSQ09ERVRZUEVfY29kZTEyOFNTQ0MsDQorICBYRkFfQkFSQ09ERVRZUEVfY29kZTJPZjVJbmR1c3RyaWFsLA0KKyAgWEZBX0JBUkNPREVUWVBFX2NvZGUyT2Y1SW50ZXJsZWF2ZWQsDQorICBYRkFfQkFSQ09ERVRZUEVfY29kZTJPZjVNYXRyaXgsDQorICBYRkFfQkFSQ09ERVRZUEVfY29kZTJPZjVTdGFuZGFyZCwNCisgIFhGQV9CQVJDT0RFVFlQRV9jb2RlM09mOSwNCisgIFhGQV9CQVJDT0RFVFlQRV9jb2RlM09mOWV4dGVuZGVkLA0KKyAgWEZBX0JBUkNPREVUWVBFX2NvZGU0OSwNCisgIFhGQV9CQVJDT0RFVFlQRV9jb2RlOTMsDQorICBYRkFfQkFSQ09ERVRZUEVfZGF0YU1hdHJpeCwNCisgIFhGQV9CQVJDT0RFVFlQRV9lYW4xMywNCisgIFhGQV9CQVJDT0RFVFlQRV9lYW4xM2FkZDIsDQorICBYRkFfQkFSQ09ERVRZUEVfZWFuMTNhZGQ1LA0KKyAgWEZBX0JBUkNPREVUWVBFX2VhbjEzcHdjZCwNCisgIFhGQV9CQVJDT0RFVFlQRV9lYW44LA0KKyAgWEZBX0JBUkNPREVUWVBFX2VhbjhhZGQyLA0KKyAgWEZBX0JBUkNPREVUWVBFX2VhbjhhZGQ1LA0KKyAgWEZBX0JBUkNPREVUWVBFX2ZpbSwNCisgIFhGQV9CQVJDT0RFVFlQRV9sb2dtYXJzLA0KKyAgWEZBX0JBUkNPREVUWVBFX21heGljb2RlLA0KKyAgWEZBX0JBUkNPREVUWVBFX21zaSwNCisgIFhGQV9CQVJDT0RFVFlQRV9wZGY0MTcsDQorICBYRkFfQkFSQ09ERVRZUEVfcGRmNDE3bWFjcm8sDQorICBYRkFfQkFSQ09ERVRZUEVfcGxlc3NleSwNCisgIFhGQV9CQVJDT0RFVFlQRV9wb3N0QVVTQ3VzdDIsDQorICBYRkFfQkFSQ09ERVRZUEVfcG9zdEFVU0N1c3QzLA0KKyAgWEZBX0JBUkNPREVUWVBFX3Bvc3RBVVNSZXBseVBhaWQsDQorICBYRkFfQkFSQ09ERVRZUEVfcG9zdEFVU1N0YW5kYXJkLA0KKyAgWEZBX0JBUkNPREVUWVBFX3Bvc3RVS1JNNFNDQywNCisgIFhGQV9CQVJDT0RFVFlQRV9wb3N0VVM1WmlwLA0KKyAgWEZBX0JBUkNPREVUWVBFX3Bvc3RVU0RQQkMsDQorICBYRkFfQkFSQ09ERVRZUEVfcG9zdFVTSU1CLA0KKyAgWEZBX0JBUkNPREVUWVBFX3Bvc3RVU1N0YW5kYXJkLA0KKyAgWEZBX0JBUkNPREVUWVBFX1FSQ29kZSwNCisgIFhGQV9CQVJDT0RFVFlQRV9yZmlkLA0KKyAgWEZBX0JBUkNPREVUWVBFX3JzczE0LA0KKyAgWEZBX0JBUkNPREVUWVBFX3JzczE0RXhwYW5kZWQsDQorICBYRkFfQkFSQ09ERVRZUEVfcnNzMTRMaW1pdGVkLA0KKyAgWEZBX0JBUkNPREVUWVBFX3JzczE0U3RhY2tlZCwNCisgIFhGQV9CQVJDT0RFVFlQRV9yc3MxNFN0YWNrZWRPbW5pLA0KKyAgWEZBX0JBUkNPREVUWVBFX3JzczE0VHJ1bmNhdGVkLA0KKyAgWEZBX0JBUkNPREVUWVBFX3RlbGVwZW4sDQorICBYRkFfQkFSQ09ERVRZUEVfdWNjMTI4LA0KKyAgWEZBX0JBUkNPREVUWVBFX3VjYzEyOHJhbmRvbSwNCisgIFhGQV9CQVJDT0RFVFlQRV91Y2MxMjhzc2NjLA0KKyAgWEZBX0JBUkNPREVUWVBFX3VwY0EsDQorICBYRkFfQkFSQ09ERVRZUEVfdXBjQWFkZDIsDQorICBYRkFfQkFSQ09ERVRZUEVfdXBjQWFkZDUsDQorICBYRkFfQkFSQ09ERVRZUEVfdXBjQXB3Y2QsDQorICBYRkFfQkFSQ09ERVRZUEVfdXBjRSwNCisgIFhGQV9CQVJDT0RFVFlQRV91cGNFYWRkMiwNCisgIFhGQV9CQVJDT0RFVFlQRV91cGNFYWRkNSwNCisgIFhGQV9CQVJDT0RFVFlQRV91cGNlYW4yLA0KKyAgWEZBX0JBUkNPREVUWVBFX3VwY2VhbjUsDQorICBYRkFfQkFSQ09ERVRZUEVfdXBzTWF4aWNvZGUNCit9Ow0KK3N0cnVjdCBYRkFfQkFSQ09ERVRZUEVFTlVNSU5GTyB7DQorICB1aW50MzJfdCB1SGFzaDsNCisgIGNvbnN0IEZYX1dDSEFSKiBwTmFtZTsNCisgIFhGQV9CQVJDT0RFVFlQRUVOVU0gZU5hbWU7DQorICBCQ19UWVBFIGVCQ1R5cGU7DQorfTsNCit0eXBlZGVmIFhGQV9CQVJDT0RFVFlQRUVOVU1JTkZPIGNvbnN0KiBYRkFfTFBDQkFSQ09ERVRZUEVFTlVNSU5GTzsNCitleHRlcm4gY29uc3QgWEZBX0JBUkNPREVUWVBFRU5VTUlORk8gZ19YRkFCYXJDb2RlVHlwZUVudW1EYXRhW107DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmY2hlY2tidXR0b24uY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmY2hlY2tidXR0b24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ODc3NWYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZjaGVja2J1dHRvbi5jcHAKQEAgLTAsMCArMSwzMzMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2NvbW1vbi5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXQuaCINCisjaW5jbHVkZSAieGZhX2ZmZmllbGQuaCINCisjaW5jbHVkZSAieGZhX2ZmcGFnZXZpZXcuaCINCisjaW5jbHVkZSAieGZhX2ZmY2hlY2tidXR0b24uaCINCisjaW5jbHVkZSAieGZhX2ZmZXhjbGdyb3VwLmgiDQorI2luY2x1ZGUgInhmYV9mZmRvY3ZpZXcuaCINCisjaW5jbHVkZSAieGZhX2ZmYXBwLmgiDQorI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KK0NYRkFfRkZDaGVja0J1dHRvbjo6Q1hGQV9GRkNoZWNrQnV0dG9uKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCisgICAgOiBDWEZBX0ZGRmllbGQocFBhZ2VWaWV3LCBwRGF0YUFjYyksIG1fcE9sZERlbGVnYXRlKE5VTEwpIHsNCisgIG1fcnRDaGVja0JveC5TZXQoMCwgMCwgMCwgMCk7DQorfQ0KK0NYRkFfRkZDaGVja0J1dHRvbjo6fkNYRkFfRkZDaGVja0J1dHRvbigpIHt9DQorRlhfQk9PTCBDWEZBX0ZGQ2hlY2tCdXR0b246OkxvYWRXaWRnZXQoKSB7DQorICBDRldMX0NoZWNrQm94KiBwQ2hlY2tCb3ggPSBDRldMX0NoZWNrQm94OjpDcmVhdGUoKTsNCisgIHBDaGVja0JveC0+SW5pdGlhbGl6ZSgpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0ID0gcENoZWNrQm94Ow0KKyAgSUZXTF9XaWRnZXQqIHBXaWRnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRQcml2YXRlRGF0YShwV2lkZ2V0LCB0aGlzLCBOVUxMKTsNCisgIElGV0xfTm90ZURyaXZlciogcE5vdGVEcml2ZXIgPSBGV0xfR2V0QXBwKCktPkdldE5vdGVEcml2ZXIoKTsNCisgIHBOb3RlRHJpdmVyLT5SZWdpc3RlckV2ZW50VGFyZ2V0KHBXaWRnZXQsIHBXaWRnZXQpOw0KKyAgbV9wT2xkRGVsZWdhdGUgPSBtX3BOb3JtYWxXaWRnZXQtPlNldERlbGVnYXRlKHRoaXMpOw0KKyAgaWYgKG1fcERhdGFBY2MtPklzUmFkaW9CdXR0b24oKSkgew0KKyAgICBwQ2hlY2tCb3gtPk1vZGlmeVN0eWxlc0V4KEZXTF9TVFlMRUVYVF9DS0JfUmFkaW9CdXR0b24sIDB4RkZGRkZGRkYpOw0KKyAgfQ0KKyAgbV9wTm9ybWFsV2lkZ2V0ID0gKENGV0xfV2lkZ2V0KilwQ2hlY2tCb3g7DQorICBtX3BOb3JtYWxXaWRnZXQtPlNldFByaXZhdGVEYXRhKG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCksIHRoaXMsIE5VTEwpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5Mb2NrVXBkYXRlKCk7DQorICBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOw0KKyAgWEZBX0NIRUNLU1RBVEUgZVN0YXRlID0gbV9wRGF0YUFjYy0+R2V0Q2hlY2tTdGF0ZSgpOw0KKyAgU2V0RldMQ2hlY2tTdGF0ZShlU3RhdGUpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5VbmxvY2tVcGRhdGUoKTsNCisgIHJldHVybiBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKTsNCit9DQordm9pZCBDWEZBX0ZGQ2hlY2tCdXR0b246OlVwZGF0ZVdpZGdldFByb3BlcnR5KCkgew0KKyAgQ0ZXTF9DaGVja0JveCogcENoZWNrQm94ID0gKENGV0xfQ2hlY2tCb3gqKW1fcE5vcm1hbFdpZGdldDsNCisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0ZMT0FUIGZTaXplID0gbV9wRGF0YUFjYy0+R2V0Q2hlY2tCdXR0b25TaXplKCk7DQorICBwQ2hlY2tCb3gtPlNldEJveFNpemUoZlNpemUpOw0KKyAgRlhfRFdPUkQgZHdTdHlsZUV4ID0gRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVDcm9zczsNCisgIGludDMyX3QgaUNoZWNrTWFyayA9IG1fcERhdGFBY2MtPkdldENoZWNrQnV0dG9uTWFyaygpOw0KKyAgc3dpdGNoIChpQ2hlY2tNYXJrKSB7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQ2hlY2s6DQorICAgICAgZHdTdHlsZUV4ID0gRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVDaGVjazsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DaXJjbGU6DQorICAgICAgZHdTdHlsZUV4ID0gRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVDaXJjbGU7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQ3Jvc3M6DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRGlhbW9uZDoNCisgICAgICBkd1N0eWxlRXggPSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZURpYW1vbmQ7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fU3F1YXJlOg0KKyAgICAgIGR3U3R5bGVFeCA9IEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlU3F1YXJlOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1N0YXI6DQorICAgICAgZHdTdHlsZUV4ID0gRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVTdGFyOw0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0OiB7DQorICAgICAgaW50MzJfdCBpU2hhcGUgPSBtX3BEYXRhQWNjLT5HZXRDaGVja0J1dHRvblNoYXBlKCk7DQorICAgICAgaWYgKGlTaGFwZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Sb3VuZCkgew0KKyAgICAgICAgZHdTdHlsZUV4ID0gRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVDaXJjbGU7DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgfQ0KKyAgaWYgKG1fcERhdGFBY2MtPklzQWxsb3dOZXV0cmFsKCkpIHsNCisgICAgZHdTdHlsZUV4IHw9IEZXTF9TVFlMRUVYVF9DS0JfM1N0YXRlOw0KKyAgfQ0KKyAgcENoZWNrQm94LT5Nb2RpZnlTdHlsZXNFeCgNCisgICAgICBkd1N0eWxlRXgsIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlTWFzayB8IEZXTF9TVFlMRUVYVF9DS0JfM1N0YXRlKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGQ2hlY2tCdXR0b246OlBlcmZvcm1MYXlvdXQoKSB7DQorICBDWEZBX0ZGV2lkZ2V0OjpQZXJmb3JtTGF5b3V0KCk7DQorICBGWF9GTE9BVCBmQ2hlY2tTaXplID0gbV9wRGF0YUFjYy0+R2V0Q2hlY2tCdXR0b25TaXplKCk7DQorICBDWEZBX01hcmdpbiBtZ1dpZGdldCA9IG1fcERhdGFBY2MtPkdldE1hcmdpbigpOw0KKyAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KKyAgR2V0UmVjdFdpdGhvdXRSb3RhdGUocnRXaWRnZXQpOw0KKyAgaWYgKG1nV2lkZ2V0LklzRXhpc3RJblhNTCgpKSB7DQorICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4ocnRXaWRnZXQsIG1nV2lkZ2V0KTsNCisgIH0NCisgIGludDMyX3QgaUNhcFBsYWNlbWVudCA9IC0xOw0KKyAgRlhfRkxPQVQgZkNhcFJlc2VydmUgPSAwOw0KKyAgQ1hGQV9DYXB0aW9uIGNhcHRpb24gPSBtX3BEYXRhQWNjLT5HZXRDYXB0aW9uKCk7DQorICBpZiAoY2FwdGlvbi5Jc0V4aXN0SW5YTUwoKSAmJiBjYXB0aW9uLkdldFByZXNlbmNlKCkpIHsNCisgICAgbV9ydENhcHRpb24uU2V0KHJ0V2lkZ2V0LmxlZnQsIHJ0V2lkZ2V0LnRvcCwgcnRXaWRnZXQud2lkdGgsDQorICAgICAgICAgICAgICAgICAgICBydFdpZGdldC5oZWlnaHQpOw0KKyAgICBpQ2FwUGxhY2VtZW50ID0gY2FwdGlvbi5HZXRQbGFjZW1lbnRUeXBlKCk7DQorICAgIGZDYXBSZXNlcnZlID0gY2FwdGlvbi5HZXRSZXNlcnZlKCk7DQorICAgIGlmIChmQ2FwUmVzZXJ2ZSA8PSAwKSB7DQorICAgICAgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fVG9wIHx8DQorICAgICAgICAgIGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tKSB7DQorICAgICAgICBmQ2FwUmVzZXJ2ZSA9IHJ0V2lkZ2V0LmhlaWdodCAtIGZDaGVja1NpemU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGZDYXBSZXNlcnZlID0gcnRXaWRnZXQud2lkdGggLSBmQ2hlY2tTaXplOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBpSG9yekFsaWduID0gWEZBX0FUVFJJQlVURUVOVU1fTGVmdDsNCisgIGludDMyX3QgaVZlcnRBbGlnbiA9IFhGQV9BVFRSSUJVVEVFTlVNX1RvcDsNCisgIGlmIChDWEZBX1BhcmEgcGFyYSA9IG1fcERhdGFBY2MtPkdldFBhcmEoKSkgew0KKyAgICBpSG9yekFsaWduID0gcGFyYS5HZXRIb3Jpem9udGFsQWxpZ24oKTsNCisgICAgaVZlcnRBbGlnbiA9IHBhcmEuR2V0VmVydGljYWxBbGlnbigpOw0KKyAgfQ0KKyAgbV9ydFVJID0gcnRXaWRnZXQ7DQorICBDWEZBX01hcmdpbiBtZ0NhcCA9IGNhcHRpb24uR2V0TWFyZ2luKCk7DQorICBzd2l0Y2ggKGlDYXBQbGFjZW1lbnQpIHsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0OiB7DQorICAgICAgbV9ydENhcHRpb24ud2lkdGggPSBmQ2FwUmVzZXJ2ZTsNCisgICAgICBDYXBMZWZ0UmlnaHRQbGFjZW1lbnQobWdDYXApOw0KKyAgICAgIG1fcnRVSS53aWR0aCAtPSBmQ2FwUmVzZXJ2ZTsNCisgICAgICBtX3J0VUkubGVmdCArPSBmQ2FwUmVzZXJ2ZTsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub3A6IHsNCisgICAgICBtX3J0Q2FwdGlvbi5oZWlnaHQgPSBmQ2FwUmVzZXJ2ZTsNCisgICAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKG1fcnRDYXB0aW9uLCBtZ0NhcCk7DQorICAgICAgbV9ydFVJLmhlaWdodCAtPSBmQ2FwUmVzZXJ2ZTsNCisgICAgICBtX3J0VUkudG9wICs9IGZDYXBSZXNlcnZlOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0OiB7DQorICAgICAgbV9ydENhcHRpb24ubGVmdCA9IG1fcnRDYXB0aW9uLnJpZ2h0KCkgLSBmQ2FwUmVzZXJ2ZTsNCisgICAgICBtX3J0Q2FwdGlvbi53aWR0aCA9IGZDYXBSZXNlcnZlOw0KKyAgICAgIENhcExlZnRSaWdodFBsYWNlbWVudChtZ0NhcCk7DQorICAgICAgbV9ydFVJLndpZHRoIC09IGZDYXBSZXNlcnZlOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbTogew0KKyAgICAgIG1fcnRDYXB0aW9uLnRvcCA9IG1fcnRDYXB0aW9uLmJvdHRvbSgpIC0gZkNhcFJlc2VydmU7DQorICAgICAgbV9ydENhcHRpb24uaGVpZ2h0ID0gZkNhcFJlc2VydmU7DQorICAgICAgWEZBX1JlY3RXaWR0aG91dE1hcmdpbihtX3J0Q2FwdGlvbiwgbWdDYXApOw0KKyAgICAgIG1fcnRVSS5oZWlnaHQgLT0gZkNhcFJlc2VydmU7DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSW5saW5lOg0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGlIb3J6QWxpZ24gPSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDsNCisgICAgICBicmVhazsNCisgIH0NCisgIGlmIChpSG9yekFsaWduID09IFhGQV9BVFRSSUJVVEVFTlVNX0NlbnRlcikgew0KKyAgICBtX3J0VUkubGVmdCArPSAobV9ydFVJLndpZHRoIC0gZkNoZWNrU2l6ZSkgLyAyOw0KKyAgfSBlbHNlIGlmIChpSG9yekFsaWduID09IFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0KSB7DQorICAgIG1fcnRVSS5sZWZ0ID0gbV9ydFVJLnJpZ2h0KCkgLSBmQ2hlY2tTaXplOw0KKyAgfQ0KKyAgaWYgKGlWZXJ0QWxpZ24gPT0gWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlKSB7DQorICAgIG1fcnRVSS50b3AgKz0gKG1fcnRVSS5oZWlnaHQgLSBmQ2hlY2tTaXplKSAvIDI7DQorICB9IGVsc2UgaWYgKGlWZXJ0QWxpZ24gPT0gWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tKSB7DQorICAgIG1fcnRVSS50b3AgPSBtX3J0VUkuYm90dG9tKCkgLSBmQ2hlY2tTaXplOw0KKyAgfQ0KKyAgbV9ydFVJLndpZHRoID0gZkNoZWNrU2l6ZTsNCisgIG1fcnRVSS5oZWlnaHQgPSBmQ2hlY2tTaXplOw0KKyAgQWRkVUlNYXJnaW4oaUNhcFBsYWNlbWVudCk7DQorICBtX3J0Q2hlY2tCb3ggPSBtX3J0VUk7DQorICBDWEZBX0JvcmRlciBib3JkZXJVSSA9IG1fcERhdGFBY2MtPkdldFVJQm9yZGVyKCk7DQorICBpZiAoYm9yZGVyVUkpIHsNCisgICAgQ1hGQV9NYXJnaW4gbWFyZ2luID0gYm9yZGVyVUkuR2V0TWFyZ2luKCk7DQorICAgIGlmIChtYXJnaW4uSXNFeGlzdEluWE1MKCkpIHsNCisgICAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKG1fcnRVSSwgbWFyZ2luKTsNCisgICAgfQ0KKyAgfQ0KKyAgbV9ydFVJLk5vcm1hbGl6ZSgpOw0KKyAgTGF5b3V0Q2FwdGlvbigpOw0KKyAgU2V0RldMUmVjdCgpOw0KKyAgaWYgKG1fcE5vcm1hbFdpZGdldCkgew0KKyAgICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ1hGQV9GRkNoZWNrQnV0dG9uOjpDYXBMZWZ0UmlnaHRQbGFjZW1lbnQoQ1hGQV9NYXJnaW4gbWdDYXApIHsNCisgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4obV9ydENhcHRpb24sIG1nQ2FwKTsNCisgIGlmIChtX3J0Q2FwdGlvbi5oZWlnaHQgPCAwKSB7DQorICAgIG1fcnRDYXB0aW9uLnRvcCArPSBtX3J0Q2FwdGlvbi5oZWlnaHQ7DQorICB9DQorICBpZiAobV9ydENhcHRpb24ud2lkdGggPCAwKSB7DQorICAgIG1fcnRDYXB0aW9uLmxlZnQgKz0gbV9ydENhcHRpb24ud2lkdGg7DQorICAgIG1fcnRDYXB0aW9uLndpZHRoID0gLW1fcnRDYXB0aW9uLndpZHRoOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRkZDaGVja0J1dHRvbjo6QWRkVUlNYXJnaW4oaW50MzJfdCBpQ2FwUGxhY2VtZW50KSB7DQorICBDRlhfUmVjdEYgcnRVSU1hcmdpbjsNCisgIG1fcERhdGFBY2MtPkdldFVJTWFyZ2luKHJ0VUlNYXJnaW4pOw0KKyAgbV9ydFVJLnRvcCAtPSBydFVJTWFyZ2luLnRvcCAvIDIgLSBydFVJTWFyZ2luLmhlaWdodCAvIDI7DQorICBGWF9GTE9BVCBmTGVmdEFkZFJpZ2h0ID0gcnRVSU1hcmdpbi5sZWZ0ICsgcnRVSU1hcmdpbi53aWR0aDsNCisgIEZYX0ZMT0FUIGZUb3BBZGRCb3R0b20gPSBydFVJTWFyZ2luLnRvcCArIHJ0VUlNYXJnaW4uaGVpZ2h0Ow0KKyAgaWYgKG1fcnRVSS53aWR0aCA8IGZMZWZ0QWRkUmlnaHQpIHsNCisgICAgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQgfHwNCisgICAgICAgIGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fTGVmdCkgew0KKyAgICAgIG1fcnRVSS5sZWZ0IC09IGZMZWZ0QWRkUmlnaHQgLSBtX3J0VUkud2lkdGg7DQorICAgIH0gZWxzZSB7DQorICAgICAgbV9ydFVJLmxlZnQgLT0gMiAqIChmTGVmdEFkZFJpZ2h0IC0gbV9ydFVJLndpZHRoKTsNCisgICAgfQ0KKyAgICBtX3J0VUkud2lkdGggKz0gMiAqIChmTGVmdEFkZFJpZ2h0IC0gbV9ydFVJLndpZHRoKTsNCisgIH0NCisgIGlmIChtX3J0VUkuaGVpZ2h0IDwgZlRvcEFkZEJvdHRvbSkgew0KKyAgICBpZiAoaUNhcFBsYWNlbWVudCA9PSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodCkgew0KKyAgICAgIG1fcnRVSS5sZWZ0IC09IGZUb3BBZGRCb3R0b20gLSBtX3J0VUkuaGVpZ2h0Ow0KKyAgICB9DQorICAgIG1fcnRVSS50b3AgLT0gZlRvcEFkZEJvdHRvbSAtIG1fcnRVSS5oZWlnaHQ7DQorICAgIG1fcnRVSS5oZWlnaHQgKz0gMiAqIChmVG9wQWRkQm90dG9tIC0gbV9ydFVJLmhlaWdodCk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRkNoZWNrQnV0dG9uOjpSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSb3RhdGUpIHsNCisgIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9NYXRyaXggbXRSb3RhdGU7DQorICBHZXRSb3RhdGVNYXRyaXgobXRSb3RhdGUpOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgbXRSb3RhdGUuQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIENYRkFfRkZXaWRnZXQ6OlJlbmRlcldpZGdldChwR1MsICZtdFJvdGF0ZSwgZHdTdGF0dXMpOw0KKyAgQ1hGQV9Cb3JkZXIgYm9yZGVyVUkgPSBtX3BEYXRhQWNjLT5HZXRVSUJvcmRlcigpOw0KKyAgRHJhd0JvcmRlcihwR1MsIGJvcmRlclVJLCBtX3J0VUksICZtdFJvdGF0ZSwNCisgICAgICAgICAgICAgbV9wRGF0YUFjYy0+R2V0Q2hlY2tCdXR0b25TaGFwZSgpID09IFhGQV9BVFRSSUJVVEVFTlVNX1JvdW5kDQorICAgICAgICAgICAgICAgICA/IFhGQV9EUkFXQk9YX0ZvcmNlUm91bmQNCisgICAgICAgICAgICAgICAgIDogMCk7DQorICBSZW5kZXJDYXB0aW9uKHBHUywgJm10Um90YXRlKTsNCisgIERyYXdIaWdobGlnaHQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzLA0KKyAgICAgICAgICAgICAgICBtX3BEYXRhQWNjLT5HZXRDaGVja0J1dHRvblNoYXBlKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fUm91bmQpOw0KKyAgQ0ZYX01hdHJpeCBtdDsNCisgIG10LlNldCgxLCAwLCAwLCAxLCBtX3J0Q2hlY2tCb3gubGVmdCwgbV9ydENoZWNrQm94LnRvcCk7DQorICBtdC5Db25jYXQobXRSb3RhdGUpOw0KKyAgR2V0QXBwKCktPkdldFdpZGdldE1nckRlbGVnYXRlKCktPk9uRHJhd1dpZGdldChtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwR1MsICZtdCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNoZWNrQnV0dG9uOjpPbkxCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICghSXNCdXR0b25Eb3duKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgU2V0QnV0dG9uRG93bihGQUxTRSk7DQorICBDRldMX01zZ01vdXNlIG1zOw0KKyAgbXMubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uVXA7DQorICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOw0KKyAgbXMubV9meCA9IGZ4Ow0KKyAgbXMubV9meSA9IGZ5Ow0KKyAgRldMVG9DbGllbnQobXMubV9meCwgbXMubV9meSk7DQorICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcElmYWNlOw0KKyAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK1hGQV9DSEVDS1NUQVRFIENYRkFfRkZDaGVja0J1dHRvbjo6RldMU3RhdGUyWEZBU3RhdGUoKSB7DQorICBYRkFfQ0hFQ0tTVEFURSBlQ2hlY2tTdGF0ZSA9IFhGQV9DSEVDS1NUQVRFX09mZjsNCisgIEZYX0RXT1JEIGR3U3RhdGUgPSBtX3BOb3JtYWxXaWRnZXQtPkdldFN0YXRlcygpOw0KKyAgaWYgKGR3U3RhdGUgJiBGV0xfU1RBVEVfQ0tCX0NoZWNrZWQpIHsNCisgICAgZUNoZWNrU3RhdGUgPSBYRkFfQ0hFQ0tTVEFURV9PbjsNCisgIH0gZWxzZSBpZiAoZHdTdGF0ZSAmIEZXTF9TVEFURV9DS0JfTmV1dHJhbCkgew0KKyAgICBlQ2hlY2tTdGF0ZSA9IFhGQV9DSEVDS1NUQVRFX05ldXRyYWw7DQorICB9DQorICByZXR1cm4gZUNoZWNrU3RhdGU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNoZWNrQnV0dG9uOjpDb21taXREYXRhKCkgew0KKyAgWEZBX0NIRUNLU1RBVEUgZUNoZWNrU3RhdGUgPSBGV0xTdGF0ZTJYRkFTdGF0ZSgpOw0KKyAgbV9wRGF0YUFjYy0+U2V0Q2hlY2tTdGF0ZShlQ2hlY2tTdGF0ZSwgVFJVRSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGQ2hlY2tCdXR0b246OklzRGF0YUNoYW5nZWQoKSB7DQorICBYRkFfQ0hFQ0tTVEFURSBlQ2hlY2tTdGF0ZSA9IEZXTFN0YXRlMlhGQVN0YXRlKCk7DQorICByZXR1cm4gbV9wRGF0YUFjYy0+R2V0Q2hlY2tTdGF0ZSgpICE9IGVDaGVja1N0YXRlOw0KK30NCit2b2lkIENYRkFfRkZDaGVja0J1dHRvbjo6U2V0RldMQ2hlY2tTdGF0ZShYRkFfQ0hFQ0tTVEFURSBlQ2hlY2tTdGF0ZSkgew0KKyAgaWYgKGVDaGVja1N0YXRlID09IFhGQV9DSEVDS1NUQVRFX05ldXRyYWwpIHsNCisgICAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRTdGF0ZXMoRldMX1NUQVRFX0NLQl9OZXV0cmFsLCBUUlVFKTsNCisgIH0gZWxzZSB7DQorICAgIG1fcE5vcm1hbFdpZGdldC0+U2V0U3RhdGVzKEZXTF9TVEFURV9DS0JfQ2hlY2tlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNoZWNrU3RhdGUgPT0gWEZBX0NIRUNLU1RBVEVfT24pOw0KKyAgfQ0KK30NCitGWF9CT09MIENYRkFfRkZDaGVja0J1dHRvbjo6VXBkYXRlRldMRGF0YSgpIHsNCisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIFhGQV9DSEVDS1NUQVRFIGVTdGF0ZSA9IG1fcERhdGFBY2MtPkdldENoZWNrU3RhdGUoKTsNCisgIFNldEZXTENoZWNrU3RhdGUoZVN0YXRlKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7DQorICByZXR1cm4gVFJVRTsNCit9DQoraW50MzJfdCBDWEZBX0ZGQ2hlY2tCdXR0b246Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgcmV0dXJuIG1fcE9sZERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCit9DQorRldMX0VSUiBDWEZBX0ZGQ2hlY2tCdXR0b246Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkgew0KKyAgQ1hGQV9GRkZpZWxkOjpPblByb2Nlc3NFdmVudChwRXZlbnQpOw0KKyAgRlhfRFdPUkQgZHdFdmVudElEID0gcEV2ZW50LT5HZXRDbGFzc0lEKCk7DQorICBzd2l0Y2ggKGR3RXZlbnRJRCkgew0KKyAgICBjYXNlIEZXTF9FVlRIQVNIX0NLQl9DaGVja1N0YXRlQ2hhbmdlZDogew0KKyAgICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQorICAgICAgZVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfQ2hhbmdlOw0KKyAgICAgIG1fcERhdGFBY2MtPkdldFZhbHVlKGVQYXJhbS5tX3dzTmV3VGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9SYXcpOw0KKyAgICAgIENYRkFfV2lkZ2V0QWNjKiBwRkZFeGNsR3JvdXAgPSBtX3BEYXRhQWNjLT5HZXRFeGNsR3JvdXAoKTsNCisgICAgICBpZiAoUHJvY2Vzc0NvbW1pdHRlZERhdGEoKSkgew0KKyAgICAgICAgZVBhcmFtLm1fcFRhcmdldCA9IHBGRkV4Y2xHcm91cDsNCisgICAgICAgIGlmIChwRkZFeGNsR3JvdXApIHsNCisgICAgICAgICAgbV9wRG9jVmlldy0+QWRkVmFsaWRhdGVXaWRnZXQocEZGRXhjbEdyb3VwKTsNCisgICAgICAgICAgbV9wRG9jVmlldy0+QWRkQ2FsY3VsYXRlV2lkZ2V0QWNjKHBGRkV4Y2xHcm91cCk7DQorICAgICAgICAgIHBGRkV4Y2xHcm91cC0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX0NoYW5nZSwgJmVQYXJhbSk7DQorICAgICAgICB9DQorICAgICAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsNCisgICAgICAgIG1fcERhdGFBY2MtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9DaGFuZ2UsICZlUGFyYW0pOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBTZXRGV0xDaGVja1N0YXRlKG1fcERhdGFBY2MtPkdldENoZWNrU3RhdGUoKSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwRkZFeGNsR3JvdXApIHsNCisgICAgICAgIGVQYXJhbS5tX3BUYXJnZXQgPSBwRkZFeGNsR3JvdXA7DQorICAgICAgICBwRkZFeGNsR3JvdXAtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9DbGljaywgJmVQYXJhbSk7DQorICAgICAgfQ0KKyAgICAgIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BEYXRhQWNjOw0KKyAgICAgIG1fcERhdGFBY2MtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9DbGljaywgJmVQYXJhbSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgZGVmYXVsdDoge30NCisgIH0NCisgIHJldHVybiBtX3BPbGREZWxlZ2F0ZS0+T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCit9DQorRldMX0VSUiBDWEZBX0ZGQ2hlY2tCdXR0b246Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIHJldHVybiBtX3BPbGREZWxlZ2F0ZS0+T25EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmNoZWNrYnV0dG9uLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZjaGVja2J1dHRvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYjAyYTYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZjaGVja2J1dHRvbi5oCkBAIC0wLDAgKzEsMzkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhGQV9GT1JNRklMTEVSX0NIRUNLQlVUVE9OX0lNUF9IDQorI2RlZmluZSBfRlhGQV9GT1JNRklMTEVSX0NIRUNLQlVUVE9OX0lNUF9IDQorY2xhc3MgQ1hGQV9GRkV4Y2xHcm91cDsNCitjbGFzcyBDWEZBX0ZGQ2hlY2tCdXR0b24gOiBwdWJsaWMgQ1hGQV9GRkZpZWxkIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GRkNoZWNrQnV0dG9uKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgdmlydHVhbCB+Q1hGQV9GRkNoZWNrQnV0dG9uKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMgPSAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSb3RhdGUgPSAwKTsNCisNCisgIHZpcnR1YWwgRlhfQk9PTCBMb2FkV2lkZ2V0KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUGVyZm9ybUxheW91dCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIFVwZGF0ZUZXTERhdGEoKTsNCisgIHZpcnR1YWwgdm9pZCBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2b2lkIFNldEZXTENoZWNrU3RhdGUoWEZBX0NIRUNLU1RBVEUgZUNoZWNrU3RhdGUpOw0KKyAgdmlydHVhbCBpbnQzMl90IE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KTsNCisgIHZpcnR1YWwgRldMX0VSUiBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdmlydHVhbCBGWF9CT09MIENvbW1pdERhdGEoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0RhdGFDaGFuZ2VkKCk7DQorICB2b2lkIENhcExlZnRSaWdodFBsYWNlbWVudChDWEZBX01hcmdpbiBtZ0NhcCk7DQorICB2b2lkIEFkZFVJTWFyZ2luKGludDMyX3QgaUNhcFBsYWNlbWVudCk7DQorICBYRkFfQ0hFQ0tTVEFURSBGV0xTdGF0ZTJYRkFTdGF0ZSgpOw0KKyAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogbV9wT2xkRGVsZWdhdGU7DQorICBDRlhfUmVjdEYgbV9ydENoZWNrQm94Ow0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmY2hvaWNlbGlzdC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZjaG9pY2VsaXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmE0ZDRiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmY2hvaWNlbGlzdC5jcHAKQEAgLTAsMCArMSw1NDAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2NvbW1vbi5oIg0KKyNpbmNsdWRlICJ4ZmFfZndsYWRhcHRlci5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXQuaCINCisjaW5jbHVkZSAieGZhX2ZmZmllbGQuaCINCisjaW5jbHVkZSAieGZhX2ZmcGFnZXZpZXcuaCINCisjaW5jbHVkZSAieGZhX2ZmZG9jdmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZjaG9pY2VsaXN0LmgiDQorI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KK0NYRkFfRkZMaXN0Qm94OjpDWEZBX0ZGTGlzdEJveChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQ0KKyAgICA6IENYRkFfRkZGaWVsZChwUGFnZVZpZXcsIHBEYXRhQWNjKSwgbV9wT2xkRGVsZWdhdGUoTlVMTCkge30NCitDWEZBX0ZGTGlzdEJveDo6fkNYRkFfRkZMaXN0Qm94KCkgew0KKyAgaWYgKG1fcE5vcm1hbFdpZGdldCkgew0KKyAgICBJRldMX1dpZGdldCogcFdpZGdldCA9IG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCk7DQorICAgIElGV0xfTm90ZURyaXZlciogcE5vdGVEcml2ZXIgPSBGV0xfR2V0QXBwKCktPkdldE5vdGVEcml2ZXIoKTsNCisgICAgcE5vdGVEcml2ZXItPlVucmVnaXN0ZXJFdmVudFRhcmdldChwV2lkZ2V0KTsNCisgIH0NCit9DQorRlhfQk9PTCBDWEZBX0ZGTGlzdEJveDo6TG9hZFdpZGdldCgpIHsNCisgIENGV0xfTGlzdEJveCogcExpc3RCb3ggPSBDRldMX0xpc3RCb3g6OkNyZWF0ZSgpOw0KKyAgcExpc3RCb3gtPkluaXRpYWxpemUoKTsNCisgIHBMaXN0Qm94LT5Nb2RpZnlTdHlsZXMoRldMX1dHVFNUWUxFX1ZTY3JvbGwgfCBGV0xfV0dUU1RZTEVfTm9CYWNrZ3JvdW5kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGKTsNCisgIG1fcE5vcm1hbFdpZGdldCA9IChDRldMX1dpZGdldCopcExpc3RCb3g7DQorICBJRldMX1dpZGdldCogcFdpZGdldCA9IG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCk7DQorICBtX3BOb3JtYWxXaWRnZXQtPlNldFByaXZhdGVEYXRhKHBXaWRnZXQsIHRoaXMsIE5VTEwpOw0KKyAgSUZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9IEZXTF9HZXRBcHAoKS0+R2V0Tm90ZURyaXZlcigpOw0KKyAgcE5vdGVEcml2ZXItPlJlZ2lzdGVyRXZlbnRUYXJnZXQocFdpZGdldCwgcFdpZGdldCk7DQorICBtX3BPbGREZWxlZ2F0ZSA9IG1fcE5vcm1hbFdpZGdldC0+U2V0RGVsZWdhdGUodGhpcyk7DQorICBtX3BOb3JtYWxXaWRnZXQtPkxvY2tVcGRhdGUoKTsNCisgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NMYWJlbEFycmF5Ow0KKyAgbV9wRGF0YUFjYy0+R2V0Q2hvaWNlTGlzdEl0ZW1zKHdzTGFiZWxBcnJheSwgRkFMU0UpOw0KKyAgaW50MzJfdCBpSXRlbXMgPSB3c0xhYmVsQXJyYXkuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUl0ZW1zOyBpKyspIHsNCisgICAgcExpc3RCb3gtPkFkZFN0cmluZyh3c0xhYmVsQXJyYXlbaV0pOw0KKyAgfQ0KKyAgRlhfRFdPUkQgZHdFeHRlbmRlZFN0eWxlID0gRldMX1NUWUxFRVhUX0xUQl9TaG93U2Nyb2xsQmFyRm9jdXM7DQorICBpZiAobV9wRGF0YUFjYy0+R2V0Q2hvaWNlTGlzdE9wZW4oKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9NdWx0aVNlbGVjdCkgew0KKyAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0xUQl9NdWx0aVNlbGVjdGlvbjsNCisgIH0NCisgIGR3RXh0ZW5kZWRTdHlsZSB8PSBHZXRBbGlnbm1lbnQoKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+TW9kaWZ5U3R5bGVzRXgoZHdFeHRlbmRlZFN0eWxlLCAweEZGRkZGRkZGKTsNCisgIENGWF9JbnQzMkFycmF5IGlTZWxBcnJheTsNCisgIG1fcERhdGFBY2MtPkdldFNlbGVjdGVkSXRlbXMoaVNlbEFycmF5KTsNCisgIGludDMyX3QgaVNlbENvdW50ID0gaVNlbEFycmF5LkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlTZWxDb3VudDsgaisrKSB7DQorICAgIEZXTF9ITElTVElURU0gaXRlbSA9IHBMaXN0Qm94LT5HZXRJdGVtKGlTZWxBcnJheVtqXSk7DQorICAgIHBMaXN0Qm94LT5TZXRTZWxJdGVtKGl0ZW0sIFRSVUUpOw0KKyAgfQ0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5VbmxvY2tVcGRhdGUoKTsNCisgIHJldHVybiBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGTGlzdEJveDo6T25LaWxsRm9jdXMoQ1hGQV9GRldpZGdldCogcE5ld0ZvY3VzKSB7DQorICBGWF9CT09MIGZsYWcgPSBQcm9jZXNzQ29tbWl0dGVkRGF0YSgpOw0KKyAgaWYgKCFmbGFnKSB7DQorICAgIFVwZGF0ZUZXTERhdGEoKTsNCisgIH0NCisgIENYRkFfRkZGaWVsZDo6T25LaWxsRm9jdXMocE5ld0ZvY3VzKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRkZMaXN0Qm94OjpDb21taXREYXRhKCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcE5vcm1hbFdpZGdldCAhPSBOVUxMKTsNCisgIENGV0xfTGlzdEJveCogcExpc3RCb3ggPSAoQ0ZXTF9MaXN0Qm94KiltX3BOb3JtYWxXaWRnZXQ7DQorICBpbnQzMl90IGlTZWxzID0gcExpc3RCb3gtPkNvdW50U2VsSXRlbXMoKTsNCisgIENGWF9JbnQzMkFycmF5IGlTZWxBcnJheTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTZWxzOyBpKyspIHsNCisgICAgaVNlbEFycmF5LkFkZChwTGlzdEJveC0+R2V0U2VsSW5kZXgoaSkpOw0KKyAgfQ0KKyAgbV9wRGF0YUFjYy0+U2V0U2VsZWN0ZEl0ZW1zKGlTZWxBcnJheSwgVFJVRSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGTGlzdEJveDo6SXNEYXRhQ2hhbmdlZCgpIHsNCisgIENGWF9JbnQzMkFycmF5IGlTZWxBcnJheTsNCisgIG1fcERhdGFBY2MtPkdldFNlbGVjdGVkSXRlbXMoaVNlbEFycmF5KTsNCisgIGludDMyX3QgaU9sZFNlbHMgPSBpU2VsQXJyYXkuR2V0U2l6ZSgpOw0KKyAgQ0ZXTF9MaXN0Qm94KiBwTGlzdEJveCA9IChDRldMX0xpc3RCb3gqKW1fcE5vcm1hbFdpZGdldDsNCisgIGludDMyX3QgaVNlbHMgPSBwTGlzdEJveC0+Q291bnRTZWxJdGVtcygpOw0KKyAgaWYgKGlPbGRTZWxzID09IGlTZWxzKSB7DQorICAgIGludDMyX3QgaUluZGV4ID0gMDsNCisgICAgZm9yICg7IGlJbmRleCA8IGlTZWxzOyBpSW5kZXgrKykgew0KKyAgICAgIEZXTF9ITElTVElURU0gaGxpc3RJdGVtID0gcExpc3RCb3gtPkdldEl0ZW0oaVNlbEFycmF5W2lJbmRleF0pOw0KKyAgICAgIGlmICghKHBMaXN0Qm94LT5HZXRJdGVtU3RhdGVzKGhsaXN0SXRlbSkgJiYgRldMX0lURU1TVEFURV9MVEJfU2VsZWN0ZWQpKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGlJbmRleCA9PSBpU2Vscykgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0RXT1JEIENYRkFfRkZMaXN0Qm94OjpHZXRBbGlnbm1lbnQoKSB7DQorICBGWF9EV09SRCBkd0V4dGVuZGVkU3R5bGUgPSAwOw0KKyAgaWYgKENYRkFfUGFyYSBwYXJhID0gbV9wRGF0YUFjYy0+R2V0UGFyYSgpKSB7DQorICAgIGludDMyX3QgaUhvcnogPSBwYXJhLkdldEhvcml6b250YWxBbGlnbigpOw0KKyAgICBzd2l0Y2ggKGlIb3J6KSB7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXI6DQorICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0xUQl9DZW50ZXJBbGlnbjsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSnVzdGlmeToNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSnVzdGlmeUFsbDoNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmFkaXg6DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KKyAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9MVEJfUmlnaHRBbGlnbjsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0xUQl9MZWZ0QWxpZ247DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGR3RXh0ZW5kZWRTdHlsZTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGTGlzdEJveDo6VXBkYXRlRldMRGF0YSgpIHsNCisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGV0xfTGlzdEJveCogcExpc3RCb3ggPSAoKENGV0xfTGlzdEJveCopbV9wTm9ybWFsV2lkZ2V0KTsNCisgIENGWF9BcnJheVRlbXBsYXRlPEZXTF9ITElTVElURU0+IHNlbEl0ZW1BcnJheTsNCisgIENGWF9JbnQzMkFycmF5IGlTZWxBcnJheTsNCisgIG1fcERhdGFBY2MtPkdldFNlbGVjdGVkSXRlbXMoaVNlbEFycmF5KTsNCisgIGludDMyX3QgaVNlbENvdW50ID0gaVNlbEFycmF5LkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlTZWxDb3VudDsgaisrKSB7DQorICAgIEZXTF9ITElTVElURU0gbHBJdGVtU2VsID0gcExpc3RCb3gtPkdldFNlbEl0ZW0oaVNlbEFycmF5W2pdKTsNCisgICAgc2VsSXRlbUFycmF5LkFkZChscEl0ZW1TZWwpOw0KKyAgfQ0KKyAgcExpc3RCb3gtPlNldFNlbEl0ZW0ocExpc3RCb3gtPkdldFNlbEl0ZW0oLTEpLCBGQUxTRSk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2VsQ291bnQ7IGkrKykgew0KKyAgICAoKENGV0xfTGlzdEJveCopbV9wTm9ybWFsV2lkZ2V0KS0+U2V0U2VsSXRlbShzZWxJdGVtQXJyYXlbaV0sIFRSVUUpOw0KKyAgfQ0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsNCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENYRkFfRkZMaXN0Qm94OjpPblNlbGVjdENoYW5nZWQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9JbnQzMkFycmF5JiBhcnJTZWxzKSB7DQorICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KKyAgZVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfQ2hhbmdlOw0KKyAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7DQorICBtX3BEYXRhQWNjLT5HZXRWYWx1ZShlUGFyYW0ubV93c1ByZXZUZXh0LCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7DQorICBDRldMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKENGV0xfTGlzdEJveCopbV9wTm9ybWFsV2lkZ2V0Ow0KKyAgaW50MzJfdCBpU2VscyA9IHBMaXN0Qm94LT5Db3VudFNlbEl0ZW1zKCk7DQorICBpZiAoaVNlbHMgPiAwKSB7DQorICAgIHBMaXN0Qm94LT5HZXRJdGVtVGV4dChwTGlzdEJveC0+R2V0U2VsSXRlbSgwKSwgZVBhcmFtLm1fd3NOZXdUZXh0KTsNCisgIH0NCisgIG1fcERhdGFBY2MtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9DaGFuZ2UsICZlUGFyYW0pOw0KK30NCit2b2lkIENYRkFfRkZMaXN0Qm94OjpTZXRJdGVtU3RhdGUoaW50MzJfdCBuSW5kZXgsIEZYX0JPT0wgYlNlbGVjdGVkKSB7DQorICBGV0xfSExJU1RJVEVNIGl0ZW0gPSAoKENGV0xfTGlzdEJveCopbV9wTm9ybWFsV2lkZ2V0KS0+R2V0U2VsSXRlbShuSW5kZXgpOw0KKyAgKChDRldMX0xpc3RCb3gqKW1fcE5vcm1hbFdpZGdldCktPlNldFNlbEl0ZW0oaXRlbSwgYlNlbGVjdGVkKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7DQorICBBZGRJbnZhbGlkYXRlUmVjdCgpOw0KK30NCit2b2lkIENYRkFfRkZMaXN0Qm94OjpJbnNlcnRJdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMYWJlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4KSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1RlbXAod3NMYWJlbCk7DQorICAoKENGV0xfTGlzdEJveCopbV9wTm9ybWFsV2lkZ2V0KS0+QWRkU3RyaW5nKHdzVGVtcCk7DQorICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOw0KKyAgQWRkSW52YWxpZGF0ZVJlY3QoKTsNCit9DQordm9pZCBDWEZBX0ZGTGlzdEJveDo6RGVsZXRlSXRlbShpbnQzMl90IG5JbmRleCkgew0KKyAgaWYgKG5JbmRleCA8IDApIHsNCisgICAgKChDRldMX0xpc3RCb3gqKW1fcE5vcm1hbFdpZGdldCktPkRlbGV0ZUFsbCgpOw0KKyAgfSBlbHNlIHsNCisgICAgKChDRldMX0xpc3RCb3gqKW1fcE5vcm1hbFdpZGdldCkNCisgICAgICAgIC0+RGVsZXRlU3RyaW5nKCgoQ0ZXTF9MaXN0Qm94KiltX3BOb3JtYWxXaWRnZXQpLT5HZXRJdGVtKG5JbmRleCkpOw0KKyAgfQ0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsNCisgIEFkZEludmFsaWRhdGVSZWN0KCk7DQorfQ0KK2ludDMyX3QgQ1hGQV9GRkxpc3RCb3g6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgcmV0dXJuIG1fcE9sZERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCit9DQorRldMX0VSUiBDWEZBX0ZGTGlzdEJveDo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSB7DQorICBDWEZBX0ZGRmllbGQ6Ok9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7DQorICBGWF9EV09SRCBkd0V2ZW50SUQgPSBwRXZlbnQtPkdldENsYXNzSUQoKTsNCisgIHN3aXRjaCAoZHdFdmVudElEKSB7DQorICAgIGNhc2UgRldMX0VWVEhBU0hfTFRCX1NlbENoYW5nZWQ6IHsNCisgICAgICBDRlhfSW50MzJBcnJheSBhcnJTZWxzOw0KKyAgICAgIE9uU2VsZWN0Q2hhbmdlZChtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpLCBhcnJTZWxzKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KKyAgcmV0dXJuIG1fcE9sZERlbGVnYXRlLT5PblByb2Nlc3NFdmVudChwRXZlbnQpOw0KK30NCitGV0xfRVJSIENYRkFfRkZMaXN0Qm94OjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIHJldHVybiBtX3BPbGREZWxlZ2F0ZS0+T25EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7DQorfQ0KK0NYRkFfRkZDb21ib0JveDo6Q1hGQV9GRkNvbWJvQm94KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCisgICAgOiBDWEZBX0ZGRmllbGQocFBhZ2VWaWV3LCBwRGF0YUFjYyksIG1fcE9sZERlbGVnYXRlKE5VTEwpIHt9DQorQ1hGQV9GRkNvbWJvQm94Ojp+Q1hGQV9GRkNvbWJvQm94KCkge30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6R2V0QkJveChDRlhfUmVjdEYmIHJ0Qm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRyYXdGb2N1cykgew0KKyAgaWYgKGJEcmF3Rm9jdXMpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyNpZm5kZWYgX1hGQV9FTUINCisgIHJldHVybiBDWEZBX0ZGV2lkZ2V0OjpHZXRCQm94KHJ0Qm94LCBkd1N0YXR1cyk7DQorI2VuZGlmDQorICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydEJveCk7DQorICBpZiAobV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgIENGWF9SZWN0RiBydFdpZGdldDsNCisgICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5HZXRCQm94KHJ0V2lkZ2V0KTsNCisgICAgcnRCb3guVW5pb24ocnRXaWRnZXQpOw0KKyAgfQ0KKyAgQ0ZYX01hdHJpeCBtdDsNCisgIEdldFJvdGF0ZU1hdHJpeChtdCk7DQorICBtdC5UcmFuc2Zvcm1SZWN0KHJ0Qm94KTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6UHRJbkFjdGl2ZVJlY3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSB7DQorICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPkdldEJCb3gocnRXaWRnZXQpOw0KKyAgaWYgKHJ0V2lkZ2V0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpMb2FkV2lkZ2V0KCkgew0KKyAgQ0ZXTF9Db21ib0JveCogcENvbWJvQm94ID0gQ0ZXTF9Db21ib0JveDo6Q3JlYXRlKCk7DQorICBwQ29tYm9Cb3gtPkluaXRpYWxpemUoKTsNCisgIG1fcE5vcm1hbFdpZGdldCA9IChDRldMX1dpZGdldCopcENvbWJvQm94Ow0KKyAgSUZXTF9XaWRnZXQqIHBXaWRnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRQcml2YXRlRGF0YShwV2lkZ2V0LCB0aGlzLCBOVUxMKTsNCisgIElGV0xfTm90ZURyaXZlciogcE5vdGVEcml2ZXIgPSBGV0xfR2V0QXBwKCktPkdldE5vdGVEcml2ZXIoKTsNCisgIHBOb3RlRHJpdmVyLT5SZWdpc3RlckV2ZW50VGFyZ2V0KHBXaWRnZXQsIHBXaWRnZXQpOw0KKyAgbV9wT2xkRGVsZWdhdGUgPSBtX3BOb3JtYWxXaWRnZXQtPlNldERlbGVnYXRlKHRoaXMpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5Mb2NrVXBkYXRlKCk7DQorICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzTGFiZWxBcnJheTsNCisgIG1fcERhdGFBY2MtPkdldENob2ljZUxpc3RJdGVtcyh3c0xhYmVsQXJyYXksIEZBTFNFKTsNCisgIGludDMyX3QgaUl0ZW1zID0gd3NMYWJlbEFycmF5LkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlJdGVtczsgaSsrKSB7DQorICAgIHBDb21ib0JveC0+QWRkU3RyaW5nKHdzTGFiZWxBcnJheVtpXSk7DQorICB9DQorICBDRlhfSW50MzJBcnJheSBpU2VsQXJyYXk7DQorICBtX3BEYXRhQWNjLT5HZXRTZWxlY3RlZEl0ZW1zKGlTZWxBcnJheSk7DQorICBpbnQzMl90IGlTZWxDb3VudCA9IGlTZWxBcnJheS5HZXRTaXplKCk7DQorICBpZiAoaVNlbENvdW50ID4gMCkgew0KKyAgICBwQ29tYm9Cb3gtPlNldEN1clNlbChpU2VsQXJyYXlbMF0pOw0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICBtX3BEYXRhQWNjLT5HZXRWYWx1ZSh3c1RleHQsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsNCisgICAgcENvbWJvQm94LT5TZXRFZGl0VGV4dCh3c1RleHQpOw0KKyAgfQ0KKyAgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+VW5sb2NrVXBkYXRlKCk7DQorICByZXR1cm4gQ1hGQV9GRkZpZWxkOjpMb2FkV2lkZ2V0KCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkNvbWJvQm94OjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpIHsNCisgIENGV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9IChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQ7DQorICBpZiAoIXBDb21ib0JveCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9EV09SRCBkd0V4dGVuZGVkU3R5bGUgPSAwOw0KKyAgRlhfRFdPUkQgZHdFZGl0U3R5bGVzID0NCisgICAgICBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5IHwgRldMX1NUWUxFRVhUX0VEVF9MYXN0TGluZUhlaWdodDsNCisgIGR3RXh0ZW5kZWRTdHlsZSB8PSBVcGRhdGVVSVByb3BlcnR5KCk7DQorICBpZiAobV9wRGF0YUFjYy0+SXNDaG9pY2VMaXN0QWxsb3dUZXh0RW50cnkoKSkgew0KKyAgICBkd0VkaXRTdHlsZXMgJj0gfkZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHk7DQorICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfQ01CX0Ryb3BEb3duOw0KKyAgfQ0KKyAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4gfHwNCisgICAgICAhbV9wRGF0YUFjYy0+R2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpIHsNCisgICAgZHdFZGl0U3R5bGVzIHw9IEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHk7DQorICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfQ01CX1JlYWRPbmx5Ow0KKyAgfQ0KKyAgZHdFeHRlbmRlZFN0eWxlIHw9IEdldEFsaWdubWVudCgpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5Nb2RpZnlTdHlsZXNFeChkd0V4dGVuZGVkU3R5bGUsIDB4RkZGRkZGRkYpOw0KKyAgaWYgKG1fcERhdGFBY2MtPkdldEhvcml6b250YWxTY3JvbGxQb2xpY3koKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PZmYpIHsNCisgICAgZHdFZGl0U3R5bGVzIHw9IEZXTF9TVFlMRUVYVF9FRFRfQXV0b0hTY3JvbGw7DQorICB9DQorICBwQ29tYm9Cb3gtPkVkaXRNb2RpZnlTdHlsZXNFeChkd0VkaXRTdHlsZXMsIDB4RkZGRkZGRkYpOw0KK30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6T25SQnV0dG9uVXAoRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICBpZiAoIUNYRkFfRkZGaWVsZDo6T25SQnV0dG9uVXAoZHdGbGFncywgZngsIGZ5KSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfUG9pbnRGIHB0Ow0KKyAgcHQuU2V0KGZ4LCBmeSk7DQorICBHZXREb2MoKS0+R2V0RG9jUHJvdmlkZXIoKS0+UG9wdXBNZW51KHRoaXMsIHB0LCBOVUxMKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6T25LaWxsRm9jdXMoQ1hGQV9GRldpZGdldCogcE5ld1dpZGdldCkgew0KKyAgRlhfQk9PTCBmbGFnID0gUHJvY2Vzc0NvbW1pdHRlZERhdGEoKTsNCisgIGlmICghZmxhZykgew0KKyAgICBVcGRhdGVGV0xEYXRhKCk7DQorICB9DQorICBDWEZBX0ZGRmllbGQ6Ok9uS2lsbEZvY3VzKHBOZXdXaWRnZXQpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ1hGQV9GRkNvbWJvQm94OjpPcGVuRHJvcERvd25MaXN0KCkgew0KKyAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5PcGVuRHJvcERvd25MaXN0KFRSVUUpOw0KK30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6Q29tbWl0RGF0YSgpIHsNCisgIHJldHVybiBtX3BEYXRhQWNjLT5TZXRWYWx1ZShtX3dzTmV3VmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGQ29tYm9Cb3g6OklzRGF0YUNoYW5nZWQoKSB7DQorICBDRldMX0NvbWJvQm94KiBwRldMY29tYm9ib3ggPSAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCk7DQorICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICBwRldMY29tYm9ib3gtPkdldEVkaXRUZXh0KHdzVGV4dCk7DQorICBpbnQzMl90IGlDdXJzZWwgPSBwRldMY29tYm9ib3gtPkdldEN1clNlbCgpOw0KKyAgaWYgKGlDdXJzZWwgPj0gMCkgew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1NlbDsNCisgICAgcEZXTGNvbWJvYm94LT5HZXRUZXh0QnlJbmRleChpQ3Vyc2VsLCB3c1NlbCk7DQorICAgIGlmICh3c1NlbCA9PSB3c1RleHQpIHsNCisgICAgICBtX3BEYXRhQWNjLT5HZXRDaG9pY2VMaXN0SXRlbSh3c1RleHQsIGlDdXJzZWwsIFRSVUUpOw0KKyAgICB9DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c09sZFZhbHVlOw0KKyAgbV9wRGF0YUFjYy0+R2V0VmFsdWUod3NPbGRWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRV9SYXcpOw0KKyAgaWYgKHdzT2xkVmFsdWUgIT0gd3NUZXh0KSB7DQorICAgIG1fd3NOZXdWYWx1ZSA9IHdzVGV4dDsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ1hGQV9GRkNvbWJvQm94OjpGV0xFdmVudFNlbENoYW5nZShDWEZBX0V2ZW50UGFyYW0qIHBQYXJhbSkgew0KKyAgcFBhcmFtLT5tX2VUeXBlID0gWEZBX0VWRU5UX0NoYW5nZTsNCisgIHBQYXJhbS0+bV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsNCisgIENGV0xfQ29tYm9Cb3gqIHBGV0xjb21ib2JveCA9ICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KTsNCisgIHBGV0xjb21ib2JveC0+R2V0RWRpdFRleHQocFBhcmFtLT5tX3dzTmV3VGV4dCk7DQorICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fQ2hhbmdlLCBwUGFyYW0pOw0KK30NCitGWF9EV09SRCBDWEZBX0ZGQ29tYm9Cb3g6OkdldEFsaWdubWVudCgpIHsNCisgIEZYX0RXT1JEIGR3RXh0ZW5kZWRTdHlsZSA9IDA7DQorICBpZiAoQ1hGQV9QYXJhIHBhcmEgPSBtX3BEYXRhQWNjLT5HZXRQYXJhKCkpIHsNCisgICAgaW50MzJfdCBpSG9yeiA9IHBhcmEuR2V0SG9yaXpvbnRhbEFsaWduKCk7DQorICAgIHN3aXRjaCAoaUhvcnopIHsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0NlbnRlcjoNCisgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PQ0KKyAgICAgICAgICAgIEZXTF9TVFlMRUVYVF9DTUJfRWRpdEhDZW50ZXIgfCBGV0xfU1RZTEVFWFRfQ01CX0xpc3RJdGVtQ2VudGVyQWxpZ247DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnk6DQorICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0NNQl9FZGl0SnVzdGlmaWVkOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5QWxsOg0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SYWRpeDoNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQ6DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9DQorICAgICAgICAgICAgRldMX1NUWUxFRVhUX0NNQl9FZGl0SE5lYXIgfCBGV0xfU1RZTEVFWFRfQ01CX0xpc3RJdGVtTGVmdEFsaWduOw0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaW50MzJfdCBpVmVydCA9IHBhcmEuR2V0VmVydGljYWxBbGlnbigpOw0KKyAgICBzd2l0Y2ggKGlWZXJ0KSB7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGU6DQorICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0NNQl9FZGl0VkNlbnRlcjsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tOg0KKyAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9DTUJfRWRpdFZGYXI7DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9DTUJfRWRpdFZOZWFyOw0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBkd0V4dGVuZGVkU3R5bGU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpVcGRhdGVGV0xEYXRhKCkgew0KKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX0ludDMyQXJyYXkgaVNlbEFycmF5Ow0KKyAgbV9wRGF0YUFjYy0+R2V0U2VsZWN0ZWRJdGVtcyhpU2VsQXJyYXkpOw0KKyAgaW50MzJfdCBpU2VsQ291bnQgPSBpU2VsQXJyYXkuR2V0U2l6ZSgpOw0KKyAgaWYgKGlTZWxDb3VudCA+IDApIHsNCisgICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5TZXRDdXJTZWwoaVNlbEFycmF5WzBdKTsNCisgIH0gZWxzZSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5TZXRDdXJTZWwoLTEpOw0KKyAgICBtX3BEYXRhQWNjLT5HZXRWYWx1ZSh3c1RleHQsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsNCisgICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5TZXRFZGl0VGV4dCh3c1RleHQpOw0KKyAgfQ0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6Q2FuVW5kbygpIHsNCisgIHJldHVybiBtX3BEYXRhQWNjLT5Jc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpICYmDQorICAgICAgICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5FZGl0Q2FuVW5kbygpOw0KK30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6Q2FuUmVkbygpIHsNCisgIHJldHVybiBtX3BEYXRhQWNjLT5Jc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpICYmDQorICAgICAgICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5FZGl0Q2FuUmVkbygpOw0KK30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6VW5kbygpIHsNCisgIHJldHVybiBtX3BEYXRhQWNjLT5Jc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpICYmDQorICAgICAgICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5FZGl0VW5kbygpOw0KK30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6UmVkbygpIHsNCisgIHJldHVybiBtX3BEYXRhQWNjLT5Jc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpICYmDQorICAgICAgICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5FZGl0UmVkbygpOw0KK30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6Q2FuQ29weSgpIHsNCisgIHJldHVybiAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPkVkaXRDYW5Db3B5KCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkNvbWJvQm94OjpDYW5DdXQoKSB7DQorICBpZiAobV9wRGF0YUFjYy0+R2V0QWNjZXNzKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT3Blbikgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gbV9wRGF0YUFjYy0+SXNDaG9pY2VMaXN0QWxsb3dUZXh0RW50cnkoKSAmJg0KKyAgICAgICAgICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+RWRpdENhbkN1dCgpOw0KK30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6Q2FuUGFzdGUoKSB7DQorICByZXR1cm4gbV9wRGF0YUFjYy0+SXNDaG9pY2VMaXN0QWxsb3dUZXh0RW50cnkoKSAmJg0KKyAgICAgICAgIChtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGQ29tYm9Cb3g6OkNhblNlbGVjdEFsbCgpIHsNCisgIHJldHVybiAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPkVkaXRDYW5TZWxlY3RBbGwoKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGQ29tYm9Cb3g6OkNvcHkoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29weSkgew0KKyAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+RWRpdENvcHkod3NDb3B5KTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGQ29tYm9Cb3g6OkN1dChDRlhfV2lkZVN0cmluZyYgd3NDdXQpIHsNCisgIHJldHVybiBtX3BEYXRhQWNjLT5Jc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpICYmDQorICAgICAgICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5FZGl0Q3V0KHdzQ3V0KTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGQ29tYm9Cb3g6OlBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1Bhc3RlKSB7DQorICByZXR1cm4gbV9wRGF0YUFjYy0+SXNDaG9pY2VMaXN0QWxsb3dUZXh0RW50cnkoKSAmJg0KKyAgICAgICAgICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+RWRpdFBhc3RlKHdzUGFzdGUpOw0KK30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6U2VsZWN0QWxsKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+RWRpdFNlbGVjdEFsbCgpOw0KK30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6RGVsZXRlKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+RWRpdERlbGV0ZSgpOw0KK30NCitGWF9CT09MIENYRkFfRkZDb21ib0JveDo6RGVTZWxlY3QoKSB7DQorICByZXR1cm4gKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5FZGl0RGVTZWxlY3QoKTsNCit9DQordm9pZCBDWEZBX0ZGQ29tYm9Cb3g6OlNldEl0ZW1TdGF0ZShpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiU2VsZWN0ZWQpIHsNCisgIGlmIChiU2VsZWN0ZWQpIHsNCisgICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5TZXRDdXJTZWwobkluZGV4KTsNCisgIH0gZWxzZSB7DQorICAgICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+U2V0Q3VyU2VsKC0xKTsNCisgIH0NCisgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7DQorICBBZGRJbnZhbGlkYXRlUmVjdCgpOw0KK30NCit2b2lkIENYRkFfRkZDb21ib0JveDo6SW5zZXJ0SXRlbShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTGFiZWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgpIHsNCisgICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+QWRkU3RyaW5nKHdzTGFiZWwpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsNCisgIEFkZEludmFsaWRhdGVSZWN0KCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkNvbWJvQm94OjpEZWxldGVJdGVtKGludDMyX3QgbkluZGV4KSB7DQorICBpZiAobkluZGV4IDwgMCkgew0KKyAgICAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPlJlbW92ZUFsbCgpOw0KKyAgfSBlbHNlIHsNCisgICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5SZW1vdmVBdChuSW5kZXgpOw0KKyAgfQ0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsNCisgIEFkZEludmFsaWRhdGVSZWN0KCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkNvbWJvQm94OjpPblRleHRDaGFuZ2VkKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0NoYW5nZWQpIHsNCisgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQorICBtX3BEYXRhQWNjLT5HZXRWYWx1ZShlUGFyYW0ubV93c1ByZXZUZXh0LCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7DQorICBlUGFyYW0ubV93c0NoYW5nZSA9IHdzQ2hhbmdlZDsNCisgIEZXTEV2ZW50U2VsQ2hhbmdlKCZlUGFyYW0pOw0KK30NCit2b2lkIENYRkFfRkZDb21ib0JveDo6T25TZWxlY3RDaGFuZ2VkKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0ludDMyQXJyYXkmIGFyclNlbHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJMQnV0dG9uVXApIHsNCisgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQorICBtX3BEYXRhQWNjLT5HZXRWYWx1ZShlUGFyYW0ubV93c1ByZXZUZXh0LCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7DQorICBGV0xFdmVudFNlbENoYW5nZSgmZVBhcmFtKTsNCisgIGlmIChtX3BEYXRhQWNjLT5HZXRDaG9pY2VMaXN0Q29tbWl0T24oKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9TZWxlY3QgJiYNCisgICAgICBiTEJ1dHRvblVwKSB7DQorICAgIG1fcERvY1ZpZXctPlNldEZvY3VzV2lkZ2V0QWNjKE5VTEwpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRkZDb21ib0JveDo6T25QcmVPcGVuKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KKyAgZVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfUHJlT3BlbjsNCisgIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BEYXRhQWNjOw0KKyAgbV9wRGF0YUFjYy0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX1ByZU9wZW4sICZlUGFyYW0pOw0KK30NCit2b2lkIENYRkFfRkZDb21ib0JveDo6T25Qb3N0T3BlbihJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsNCisgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX1Bvc3RPcGVuOw0KKyAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7DQorICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fUG9zdE9wZW4sICZlUGFyYW0pOw0KK30NCit2b2lkIENYRkFfRkZDb21ib0JveDo6T25BZGREb1JlY29yZChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgR2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCktPkFkZERvUmVjb3JkKHRoaXMpOw0KK30NCitpbnQzMl90IENYRkFfRkZDb21ib0JveDo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7DQorICByZXR1cm4gbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOw0KK30NCitGV0xfRVJSIENYRkFfRkZDb21ib0JveDo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSB7DQorICBDWEZBX0ZGRmllbGQ6Ok9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7DQorICBGWF9EV09SRCBkd0V2ZW50SUQgPSBwRXZlbnQtPkdldENsYXNzSUQoKTsNCisgIHN3aXRjaCAoZHdFdmVudElEKSB7DQorICAgIGNhc2UgRldMX0VWVEhBU0hfQ01CX1NlbENoYW5nZWQ6IHsNCisgICAgICBDRldMX0V2dENtYlNlbENoYW5nZWQqIHBvc3RFdmVudCA9IChDRldMX0V2dENtYlNlbENoYW5nZWQqKXBFdmVudDsNCisgICAgICBPblNlbGVjdENoYW5nZWQobV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKSwgcG9zdEV2ZW50LT5pQXJyYXlTZWxzLA0KKyAgICAgICAgICAgICAgICAgICAgICBwb3N0RXZlbnQtPmJMQnV0dG9uVXApOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX0VWVEhBU0hfQ01CX0VkaXRDaGFuZ2VkOiB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDaGFuZ2VkOw0KKyAgICAgIE9uVGV4dENoYW5nZWQobV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKSwgd3NDaGFuZ2VkKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9FVlRIQVNIX0NNQl9QcmVEcm9wRG93bjogew0KKyAgICAgIE9uUHJlT3BlbihtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9FVlRIQVNIX0NNQl9Qb3N0RHJvcERvd246IHsNCisgICAgICBPblBvc3RPcGVuKG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCkpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHt9DQorICB9DQorICByZXR1cm4gbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7DQorfQ0KK0ZXTF9FUlIgQ1hGQV9GRkNvbWJvQm94OjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICByZXR1cm4gbV9wT2xkRGVsZWdhdGUtPk9uRHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZjaG9pY2VsaXN0LmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZjaG9pY2VsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFkYzc4MwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmNob2ljZWxpc3QuaApAQCAtMCwwICsxLDkyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYRkFfRk9STUZJTExFUl9DSE9JQ0VMSVNUX0lNUF9IDQorI2RlZmluZSBfRlhGQV9GT1JNRklMTEVSX0NIT0lDRUxJU1RfSU1QX0gNCitjbGFzcyBDWEZBX0ZGTGlzdEJveCA6IHB1YmxpYyBDWEZBX0ZGRmllbGQgew0KKyBwdWJsaWM6DQorICBDWEZBX0ZGTGlzdEJveChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsNCisgIHZpcnR1YWwgfkNYRkFfRkZMaXN0Qm94KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgTG9hZFdpZGdldCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uS2lsbEZvY3VzKENYRkFfRkZXaWRnZXQqIHBOZXdXaWRnZXQpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2aXJ0dWFsIEZYX0JPT0wgQ29tbWl0RGF0YSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIFVwZGF0ZUZXTERhdGEoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0RhdGFDaGFuZ2VkKCk7DQorICBGWF9EV09SRCBHZXRBbGlnbm1lbnQoKTsNCisNCisgcHVibGljOg0KKyAgdm9pZCBPblNlbGVjdENoYW5nZWQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsIGNvbnN0IENGWF9JbnQzMkFycmF5JiBhcnJTZWxzKTsNCisgIHZvaWQgU2V0SXRlbVN0YXRlKGludDMyX3QgbkluZGV4LCBGWF9CT09MIGJTZWxlY3RlZCk7DQorICB2b2lkIEluc2VydEl0ZW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0xhYmVsLCBpbnQzMl90IG5JbmRleCA9IC0xKTsNCisgIHZvaWQgRGVsZXRlSXRlbShpbnQzMl90IG5JbmRleCk7DQorICB2aXJ0dWFsIGludDMyX3QgT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKTsNCisgIHZpcnR1YWwgRldMX0VSUiBPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIE9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRldMX1dpZGdldERlbGVnYXRlKiBtX3BPbGREZWxlZ2F0ZTsNCit9Ow0KK2NsYXNzIENYRkFfRkZDb21ib0JveCA6IHB1YmxpYyBDWEZBX0ZGRmllbGQgew0KKyBwdWJsaWM6DQorICBDWEZBX0ZGQ29tYm9Cb3goQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQorICB2aXJ0dWFsIH5DWEZBX0ZGQ29tYm9Cb3goKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRCQm94KENGWF9SZWN0RiYgcnRCb3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXR1cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRyYXdGb2N1cyA9IEZBTFNFKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBMb2FkV2lkZ2V0KCk7DQorICB2aXJ0dWFsIHZvaWQgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPblJCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uS2lsbEZvY3VzKENYRkFfRkZXaWRnZXQqIHBOZXdXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIENhblVuZG8oKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5SZWRvKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgVW5kbygpOw0KKyAgdmlydHVhbCBGWF9CT09MIFJlZG8oKTsNCisNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5Db3B5KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuQ3V0KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuUGFzdGUoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5TZWxlY3RBbGwoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDb3B5KENGWF9XaWRlU3RyaW5nJiB3c0NvcHkpOw0KKyAgdmlydHVhbCBGWF9CT09MIEN1dChDRlhfV2lkZVN0cmluZyYgd3NDdXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIFBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1Bhc3RlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZWxlY3RBbGwoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEZWxldGUoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEZVNlbGVjdCgpOw0KKyAgdm9pZCBPcGVuRHJvcERvd25MaXN0KCk7DQorDQorIHByb3RlY3RlZDoNCisgIHZpcnR1YWwgRlhfQk9PTCBQdEluQWN0aXZlUmVjdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIENvbW1pdERhdGEoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBVcGRhdGVGV0xEYXRhKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNEYXRhQ2hhbmdlZCgpOw0KKyAgRlhfRFdPUkQgR2V0QWxpZ25tZW50KCk7DQorICB2b2lkIEZXTEV2ZW50U2VsQ2hhbmdlKENYRkFfRXZlbnRQYXJhbSogcFBhcmFtKTsNCisNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NOZXdWYWx1ZTsNCisNCisgcHVibGljOg0KKyAgdm9pZCBPblRleHRDaGFuZ2VkKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDaGFuZ2VkKTsNCisgIHZvaWQgT25TZWxlY3RDaGFuZ2VkKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0ludDMyQXJyYXkmIGFyclNlbHMsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJMQnV0dG9uVXApOw0KKyAgdm9pZCBPblByZU9wZW4oSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdm9pZCBPblBvc3RPcGVuKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIHZvaWQgT25BZGREb1JlY29yZChJRldMX1dpZGdldCogcFdpZGdldCk7DQorICB2b2lkIFNldEl0ZW1TdGF0ZShpbnQzMl90IG5JbmRleCwgRlhfQk9PTCBiU2VsZWN0ZWQpOw0KKyAgdm9pZCBJbnNlcnRJdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMYWJlbCwgaW50MzJfdCBuSW5kZXggPSAtMSk7DQorICB2b2lkIERlbGV0ZUl0ZW0oaW50MzJfdCBuSW5kZXgpOw0KKyAgdmlydHVhbCBpbnQzMl90IE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KTsNCisgIHZpcnR1YWwgRldMX0VSUiBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogbV9wT2xkRGVsZWdhdGU7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2MuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZG9jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDhlNGNmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZG9jLmNwcApAQCAtMCwwICsxLDQ0OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfY29tbW9uLmgiDQorI2luY2x1ZGUgInhmYV9mZmFwcC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2MuaCINCisjaW5jbHVkZSAieGZhX2ZmZG9jdmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXQuaCINCisjaW5jbHVkZSAieGZhX2Zmbm90aWZ5LmgiDQorI2luY2x1ZGUgInhmYV9mb250bWdyLmgiDQorQ1hGQV9GRkRvYzo6Q1hGQV9GRkRvYyhDWEZBX0ZGQXBwKiBwQXBwLCBJWEZBX0RvY1Byb3ZpZGVyKiBwRG9jUHJvdmlkZXIpDQorICAgIDogbV9wRG9jUHJvdmlkZXIocERvY1Byb3ZpZGVyKSwNCisgICAgICBtX3BEb2N1bWVudChudWxscHRyKSwNCisgICAgICBtX3BTdHJlYW0obnVsbHB0ciksDQorICAgICAgbV9wQXBwKHBBcHApLA0KKyAgICAgIG1fcE5vdGlmeShudWxscHRyKSwNCisgICAgICBtX3BQREZEb2MobnVsbHB0ciksDQorICAgICAgbV9kd0RvY1R5cGUoWEZBX0RPQ1RZUEVfU3RhdGljKSwNCisgICAgICBtX2JPd25TdHJlYW0oVFJVRSkgew0KK30NCitDWEZBX0ZGRG9jOjp+Q1hGQV9GRkRvYygpIHsNCisgIENsb3NlRG9jKCk7DQorfQ0KK0ZYX0RXT1JEIENYRkFfRkZEb2M6OkdldERvY1R5cGUoKSB7DQorICByZXR1cm4gbV9kd0RvY1R5cGU7DQorfQ0KK2ludDMyX3QgQ1hGQV9GRkRvYzo6U3RhcnRMb2FkKCkgew0KKyAgbV9wTm90aWZ5ID0gbmV3IENYRkFfRkZOb3RpZnkodGhpcyk7DQorICBJWEZBX0RvY1BhcnNlciogcERvY1BhcnNlciA9IElYRkFfRG9jUGFyc2VyOjpDcmVhdGUobV9wTm90aWZ5KTsNCisgIGludDMyX3QgaVN0YXR1cyA9IHBEb2NQYXJzZXItPlN0YXJ0UGFyc2UobV9wU3RyZWFtKTsNCisgIG1fcERvY3VtZW50ID0gcERvY1BhcnNlci0+R2V0RG9jdW1lbnQoKTsNCisgIHJldHVybiBpU3RhdHVzOw0KK30NCitGWF9CT09MIFhGQV9HZXRQREZDb250ZW50c0Zyb21QREZYTUwoSUZERV9YTUxOb2RlKiBwUERGRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIHBCeXRlQnVmZmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpQnVmZmVyU2l6ZSkgew0KKyAgSUZERV9YTUxFbGVtZW50KiBwRG9jdW1lbnRFbGVtZW50ID0gTlVMTDsNCisgIGZvciAoSUZERV9YTUxOb2RlKiBwWE1MTm9kZSA9DQorICAgICAgICAgICBwUERGRWxlbWVudC0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsNCisgICAgICAgcFhNTE5vZGU7IHBYTUxOb2RlID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQorICAgIGlmIChwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1RhZ05hbWU7DQorICAgICAgSUZERV9YTUxFbGVtZW50KiBwWE1MRWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQqKXBYTUxOb2RlOw0KKyAgICAgIHBYTUxFbGVtZW50LT5HZXRUYWdOYW1lKHdzVGFnTmFtZSk7DQorICAgICAgaWYgKHdzVGFnTmFtZS5FcXVhbChGWF9XU1RSQyhMImRvY3VtZW50IikpKSB7DQorICAgICAgICBwRG9jdW1lbnRFbGVtZW50ID0gcFhNTEVsZW1lbnQ7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmICghcERvY3VtZW50RWxlbWVudCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBJRkRFX1hNTEVsZW1lbnQqIHBDaHVua0VsZW1lbnQgPSBOVUxMOw0KKyAgZm9yIChJRkRFX1hNTE5vZGUqIHBYTUxOb2RlID0NCisgICAgICAgICAgIHBEb2N1bWVudEVsZW1lbnQtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7DQorICAgICAgIHBYTUxOb2RlOyBwWE1MTm9kZSA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgew0KKyAgICBpZiAocFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUYWdOYW1lOw0KKyAgICAgIElGREVfWE1MRWxlbWVudCogcFhNTEVsZW1lbnQgPSAoSUZERV9YTUxFbGVtZW50KilwWE1MTm9kZTsNCisgICAgICBwWE1MRWxlbWVudC0+R2V0VGFnTmFtZSh3c1RhZ05hbWUpOw0KKyAgICAgIGlmICh3c1RhZ05hbWUuRXF1YWwoRlhfV1NUUkMoTCJjaHVuayIpKSkgew0KKyAgICAgICAgcENodW5rRWxlbWVudCA9IHBYTUxFbGVtZW50Ow0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAoIXBDaHVua0VsZW1lbnQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NQREZDb250ZW50Ow0KKyAgcENodW5rRWxlbWVudC0+R2V0VGV4dERhdGEod3NQREZDb250ZW50KTsNCisgIGlCdWZmZXJTaXplID0gRlhfQmFzZTY0RGVjb2RlVyh3c1BERkNvbnRlbnQsIHdzUERGQ29udGVudC5HZXRMZW5ndGgoKSwgTlVMTCk7DQorICBwQnl0ZUJ1ZmZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIGlCdWZmZXJTaXplICsgMSk7DQorICBwQnl0ZUJ1ZmZlcltpQnVmZmVyU2l6ZV0gPSAnMCc7ICAvLyBGSVhNRTogSSBiZXQgdGhpcyBpcyB3cm9uZy4NCisgIEZYX0Jhc2U2NERlY29kZVcod3NQREZDb250ZW50LCB3c1BERkNvbnRlbnQuR2V0TGVuZ3RoKCksIHBCeXRlQnVmZmVyKTsNCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIFhGQV9YUERQYWNrZXRfTWVyZ2VSb290Tm9kZShDWEZBX05vZGUqIHBPcmlnaW5Sb290LCBDWEZBX05vZGUqIHBOZXdSb290KSB7DQorICBDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwTmV3Um9vdC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgd2hpbGUgKHBDaGlsZE5vZGUpIHsNCisgICAgQ1hGQV9Ob2RlKiBwT3JpZ2luQ2hpbGQgPQ0KKyAgICAgICAgcE9yaWdpblJvb3QtPkdldEZpcnN0Q2hpbGRCeU5hbWUocENoaWxkTm9kZS0+R2V0TmFtZUhhc2goKSk7DQorICAgIGlmIChwT3JpZ2luQ2hpbGQpIHsNCisgICAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBDWEZBX05vZGUqIHBOZXh0U2libGluZyA9DQorICAgICAgICAgIHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgcE5ld1Jvb3QtPlJlbW92ZUNoaWxkKHBDaGlsZE5vZGUpOw0KKyAgICAgIHBPcmlnaW5Sb290LT5JbnNlcnRDaGlsZChwQ2hpbGROb2RlKTsNCisgICAgICBwQ2hpbGROb2RlID0gcE5leHRTaWJsaW5nOw0KKyAgICAgIHBOZXh0U2libGluZyA9IE5VTEw7DQorICAgIH0NCisgIH0NCit9DQoraW50MzJfdCBDWEZBX0ZGRG9jOjpEb0xvYWQoSUZYX1BhdXNlKiBwUGF1c2UpIHsNCisgIGludDMyX3QgaVN0YXR1cyA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+RG9QYXJzZShwUGF1c2UpOw0KKyAgaWYgKGlTdGF0dXMgPT0gWEZBX1BBUlNFU1RBVFVTX0RvbmUgJiYgIW1fcFBERkRvYykgew0KKyAgICBDWEZBX05vZGUqIHBQREZOb2RlID0gKENYRkFfTm9kZSopbV9wRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX1BkZik7DQorICAgIGlmICghcFBERk5vZGUpIHsNCisgICAgICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX1N5bnRheEVycjsNCisgICAgfQ0KKyAgICBJRkRFX1hNTE5vZGUqIHBQREZYTUwgPSBwUERGTm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCisgICAgaWYgKHBQREZYTUwtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TeW50YXhFcnI7DQorICAgIH0NCisgICAgaW50MzJfdCBpQnVmZmVyU2l6ZSA9IDA7DQorICAgIHVpbnQ4X3QqIHBCeXRlQnVmZmVyID0gTlVMTDsNCisgICAgSUZYX0ZpbGVSZWFkKiBwWEZBUmVhZGVyID0gTlVMTDsNCisgICAgaWYgKFhGQV9HZXRQREZDb250ZW50c0Zyb21QREZYTUwocFBERlhNTCwgcEJ5dGVCdWZmZXIsIGlCdWZmZXJTaXplKSkgew0KKyAgICAgIHBYRkFSZWFkZXIgPSBGWF9DcmVhdGVNZW1vcnlTdHJlYW0ocEJ5dGVCdWZmZXIsIGlCdWZmZXJTaXplLCBUUlVFKTsNCisgICAgICBpZiAoIXBYRkFSZWFkZXIpIHsNCisgICAgICAgIGlmIChwQnl0ZUJ1ZmZlcikgew0KKyAgICAgICAgICBGWF9GcmVlKHBCeXRlQnVmZmVyKTsNCisgICAgICAgICAgcEJ5dGVCdWZmZXIgPSBOVUxMOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TeW50YXhFcnI7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzSHJlZjsNCisgICAgICAoKElGREVfWE1MRWxlbWVudCopcFBERlhNTCktPkdldFN0cmluZyhMImhyZWYiLCB3c0hyZWYpOw0KKyAgICAgIGlmICghd3NIcmVmLklzRW1wdHkoKSkgew0KKyAgICAgICAgcFhGQVJlYWRlciA9IEdldERvY1Byb3ZpZGVyKCktPk9wZW5MaW5rZWRGaWxlKHRoaXMsIHdzSHJlZik7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmICghcFhGQVJlYWRlcikgew0KKyAgICAgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfU3ludGF4RXJyOw0KKyAgICB9DQorICAgIENQREZfRG9jdW1lbnQqIHBQREZEb2N1bWVudCA9DQorICAgICAgICBHZXREb2NQcm92aWRlcigpLT5PcGVuUERGKHRoaXMsIHBYRkFSZWFkZXIsIFRSVUUpOw0KKyAgICBGWFNZU19hc3NlcnQoIW1fcFBERkRvYyk7DQorICAgIGlmICghT3BlbkRvYyhwUERGRG9jdW1lbnQpKSB7DQorICAgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TeW50YXhFcnI7DQorICAgIH0NCisgICAgSVhGQV9QYXJzZXIqIHBQYXJzZXIgPSBJWEZBX1BhcnNlcjo6Q3JlYXRlKG1fcERvY3VtZW50LCBUUlVFKTsNCisgICAgaWYgKCFwUGFyc2VyKSB7DQorICAgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TeW50YXhFcnI7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwUm9vdE5vZGUgPSBOVUxMOw0KKyAgICBpZiAocFBhcnNlci0+U3RhcnRQYXJzZShtX3BTdHJlYW0pID09IFhGQV9QQVJTRVNUQVRVU19SZWFkeSAmJg0KKyAgICAgICAgcFBhcnNlci0+RG9QYXJzZShOVUxMKSA9PSBYRkFfUEFSU0VTVEFUVVNfRG9uZSkgew0KKyAgICAgIHBSb290Tm9kZSA9IHBQYXJzZXItPkdldFJvb3ROb2RlKCk7DQorICAgIH0NCisgICAgaWYgKHBSb290Tm9kZSAmJiBtX3BEb2N1bWVudC0+R2V0Um9vdCgpKSB7DQorICAgICAgWEZBX1hQRFBhY2tldF9NZXJnZVJvb3ROb2RlKG1fcERvY3VtZW50LT5HZXRSb290KCksIHBSb290Tm9kZSk7DQorICAgICAgaVN0YXR1cyA9IFhGQV9QQVJTRVNUQVRVU19Eb25lOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlTdGF0dXMgPSBYRkFfUEFSU0VTVEFUVVNfU3RhdHVzRXJyOw0KKyAgICB9DQorICAgIHBQYXJzZXItPlJlbGVhc2UoKTsNCisgICAgcFBhcnNlciA9IE5VTEw7DQorICB9DQorICByZXR1cm4gaVN0YXR1czsNCit9DQordm9pZCBDWEZBX0ZGRG9jOjpTdG9wTG9hZCgpIHsNCisgIG1fcEFwcC0+R2V0WEZBRm9udE1ncigpLT5Mb2FkRG9jRm9udHModGhpcyk7DQorICBtX2R3RG9jVHlwZSA9IFhGQV9ET0NUWVBFX1N0YXRpYzsNCisgIENYRkFfTm9kZSogcENvbmZpZyA9IChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Db25maWcpOw0KKyAgaWYgKCFwQ29uZmlnKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfTm9kZSogcEFjcm9iYXQgPSBwQ29uZmlnLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9BY3JvYmF0KTsNCisgIGlmICghcEFjcm9iYXQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwQWNyb2JhdDcgPSBwQWNyb2JhdC0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfQWNyb2JhdDcpOw0KKyAgaWYgKCFwQWNyb2JhdDcpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwRHluYW1pY1JlbmRlciA9DQorICAgICAgcEFjcm9iYXQ3LT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9EeW5hbWljUmVuZGVyKTsNCisgIGlmICghcER5bmFtaWNSZW5kZXIpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUeXBlOw0KKyAgaWYgKHBEeW5hbWljUmVuZGVyLT5UcnlDb250ZW50KHdzVHlwZSkgJiYgd3NUeXBlID09IEZYX1dTVFJDKEwicmVxdWlyZWQiKSkgew0KKyAgICBtX2R3RG9jVHlwZSA9IFhGQV9ET0NUWVBFX0R5bmFtaWM7DQorICB9DQorfQ0KK0lYRkFfRG9jVmlldyogQ1hGQV9GRkRvYzo6Q3JlYXRlRG9jVmlldyhGWF9EV09SRCBkd1ZpZXcpIHsNCisgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9DQorICAgICAgKENYRkFfRkZEb2NWaWV3KiltX21hcFR5cGVUb0RvY1ZpZXcuR2V0VmFsdWVBdCgodm9pZCopKHVpbnRwdHJfdClkd1ZpZXcpOw0KKyAgaWYgKCFwRG9jVmlldykgew0KKyAgICBwRG9jVmlldyA9IG5ldyBDWEZBX0ZGRG9jVmlldyh0aGlzKTsNCisgICAgbV9tYXBUeXBlVG9Eb2NWaWV3LlNldEF0KCh2b2lkKikodWludHB0cl90KWR3VmlldywgcERvY1ZpZXcpOw0KKyAgfQ0KKyAgcmV0dXJuIHBEb2NWaWV3Ow0KK30NCitDWEZBX0ZGRG9jVmlldyogQ1hGQV9GRkRvYzo6R2V0RG9jVmlldyhJWEZBX0RvY0xheW91dCogcExheW91dCkgew0KKyAgRlhfUE9TSVRJT04gcHMgPSBtX21hcFR5cGVUb0RvY1ZpZXcuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBzKSB7DQorICAgIHZvaWQqIHBUeXBlOw0KKyAgICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXc7DQorICAgIG1fbWFwVHlwZVRvRG9jVmlldy5HZXROZXh0QXNzb2MocHMsIHBUeXBlLCAodm9pZComKXBEb2NWaWV3KTsNCisgICAgaWYgKHBEb2NWaWV3LT5HZXRYRkFMYXlvdXQoKSA9PSBwTGF5b3V0KSB7DQorICAgICAgcmV0dXJuIHBEb2NWaWV3Ow0KKyAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorQ1hGQV9GRkRvY1ZpZXcqIENYRkFfRkZEb2M6OkdldERvY1ZpZXcoKSB7DQorICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwVHlwZVRvRG9jVmlldy5HZXRTdGFydFBvc2l0aW9uKCk7DQorICBpZiAocHMpIHsNCisgICAgdm9pZCogcFR5cGU7DQorICAgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldzsNCisgICAgbV9tYXBUeXBlVG9Eb2NWaWV3LkdldE5leHRBc3NvYyhwcywgcFR5cGUsICh2b2lkKiYpcERvY1ZpZXcpOw0KKyAgICByZXR1cm4gcERvY1ZpZXc7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRG9jOjpPcGVuRG9jKElGWF9GaWxlUmVhZCogcFN0cmVhbSwgRlhfQk9PTCBiVGFrZU92ZXJGaWxlKSB7DQorICBtX2JPd25TdHJlYW0gPSBiVGFrZU92ZXJGaWxlOw0KKyAgbV9wU3RyZWFtID0gcFN0cmVhbTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRkZEb2M6Ok9wZW5Eb2MoQ1BERl9Eb2N1bWVudCogcFBERkRvYykgew0KKyAgaWYgKHBQREZEb2MgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gcFBERkRvYy0+R2V0Um9vdCgpOw0KKyAgaWYgKHBSb290ID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQWNyb0Zvcm0gPSBwUm9vdC0+R2V0RGljdCgiQWNyb0Zvcm0iKTsNCisgIGlmIChwQWNyb0Zvcm0gPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDUERGX09iamVjdCogcEVsZW1lbnRYRkEgPSBwQWNyb0Zvcm0tPkdldEVsZW1lbnRWYWx1ZSgiWEZBIik7DQorICBpZiAocEVsZW1lbnRYRkEgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpbnQzMl90IGlPYmpUeXBlID0gcEVsZW1lbnRYRkEtPkdldFR5cGUoKTsNCisgIENGWF9BcnJheVRlbXBsYXRlPENQREZfU3RyZWFtKj4geGZhU3RyZWFtczsNCisgIGlmIChpT2JqVHlwZSA9PSBQREZPQkpfQVJSQVkpIHsNCisgICAgQ1BERl9BcnJheSogcFhGQUFycmF5ID0gKENQREZfQXJyYXkqKXBFbGVtZW50WEZBOw0KKyAgICBGWF9EV09SRCBjb3VudCA9IHBYRkFBcnJheS0+R2V0Q291bnQoKSAvIDI7DQorICAgIGZvciAoRlhfRFdPUkQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7DQorICAgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwWEZBQXJyYXktPkdldFN0cmVhbShpICogMiArIDEpOw0KKyAgICAgIGlmIChwU3RyZWFtICE9IE5VTEwpIHsNCisgICAgICAgIHhmYVN0cmVhbXMuQWRkKHBTdHJlYW0pOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIGlmIChpT2JqVHlwZSA9PSBQREZPQkpfU1RSRUFNKSB7DQorICAgIHhmYVN0cmVhbXMuQWRkKChDUERGX1N0cmVhbSopcEVsZW1lbnRYRkEpOw0KKyAgfQ0KKyAgaWYgKHhmYVN0cmVhbXMuR2V0U2l6ZSgpIDwgMSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBJRlhfRmlsZVJlYWQqIHBGaWxlUmVhZCA9IG5ldyBDWEZBX0ZpbGVSZWFkKHhmYVN0cmVhbXMpOw0KKyAgbV9wUERGRG9jID0gcFBERkRvYzsNCisgIGlmIChtX3BTdHJlYW0pIHsNCisgICAgbV9wU3RyZWFtLT5SZWxlYXNlKCk7DQorICAgIG1fcFN0cmVhbSA9IE5VTEw7DQorICB9DQorICBtX3BTdHJlYW0gPSBwRmlsZVJlYWQ7DQorICBtX2JPd25TdHJlYW0gPSBUUlVFOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRvYzo6Q2xvc2VEb2MoKSB7DQorICBGWF9QT1NJVElPTiBwc0Nsb3NlID0gbV9tYXBUeXBlVG9Eb2NWaWV3LkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChwc0Nsb3NlKSB7DQorICAgIHZvaWQqIHBUeXBlOw0KKyAgICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXc7DQorICAgIG1fbWFwVHlwZVRvRG9jVmlldy5HZXROZXh0QXNzb2MocHNDbG9zZSwgcFR5cGUsICh2b2lkKiYpcERvY1ZpZXcpOw0KKyAgICBwRG9jVmlldy0+UnVuRG9jQ2xvc2UoKTsNCisgIH0NCisgIGlmIChtX3BEb2N1bWVudCkgew0KKyAgICBtX3BEb2N1bWVudC0+Q2xlYXJMYXlvdXREYXRhKCk7DQorICB9DQorICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwVHlwZVRvRG9jVmlldy5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocHMpIHsNCisgICAgdm9pZCogcFR5cGU7DQorICAgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldzsNCisgICAgbV9tYXBUeXBlVG9Eb2NWaWV3LkdldE5leHRBc3NvYyhwcywgcFR5cGUsICh2b2lkKiYpcERvY1ZpZXcpOw0KKyAgICBkZWxldGUgcERvY1ZpZXc7DQorICB9DQorICBtX21hcFR5cGVUb0RvY1ZpZXcuUmVtb3ZlQWxsKCk7DQorICBpZiAobV9wRG9jdW1lbnQpIHsNCisgICAgSVhGQV9QYXJzZXIqIHBQYXJzZXIgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCk7DQorICAgIHBQYXJzZXItPlJlbGVhc2UoKTsNCisgICAgbV9wRG9jdW1lbnQgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcE5vdGlmeSkgew0KKyAgICBkZWxldGUgbV9wTm90aWZ5Ow0KKyAgICBtX3BOb3RpZnkgPSBOVUxMOw0KKyAgfQ0KKyAgbV9wQXBwLT5HZXRYRkFGb250TWdyKCktPlJlbGVhc2VEb2NGb250cyh0aGlzKTsNCisgIGlmIChtX2R3RG9jVHlwZSAhPSBYRkFfRE9DVFlQRV9YRFAgJiYgbV9wU3RyZWFtICYmIG1fYk93blN0cmVhbSkgew0KKyAgICBtX3BTdHJlYW0tPlJlbGVhc2UoKTsNCisgICAgbV9wU3RyZWFtID0gTlVMTDsNCisgIH0NCisgIHBzID0gbV9tYXBOYW1lZEltYWdlcy5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocHMpIHsNCisgICAgdm9pZCogcE5hbWU7DQorICAgIEZYX0lNQUdFRElCX0FORF9EUEkqIHBJbWFnZSA9IE5VTEw7DQorICAgIG1fbWFwTmFtZWRJbWFnZXMuR2V0TmV4dEFzc29jKHBzLCBwTmFtZSwgKHZvaWQqJilwSW1hZ2UpOw0KKyAgICBpZiAocEltYWdlKSB7DQorICAgICAgZGVsZXRlIHBJbWFnZS0+cERpYlNvdXJjZTsNCisgICAgICBwSW1hZ2UtPnBEaWJTb3VyY2UgPSBOVUxMOw0KKyAgICAgIEZYX0ZyZWUocEltYWdlKTsNCisgICAgICBwSW1hZ2UgPSBOVUxMOw0KKyAgICB9DQorICB9DQorICBtX21hcE5hbWVkSW1hZ2VzLlJlbW92ZUFsbCgpOw0KKyAgSUZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9IEZXTF9HZXRBcHAoKS0+R2V0Tm90ZURyaXZlcigpOw0KKyAgcE5vdGVEcml2ZXItPkNsZWFyRXZlbnRUYXJnZXRzKEZBTFNFKTsNCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENYRkFfRkZEb2M6OlNldERvY1R5cGUoRlhfRFdPUkQgZHdUeXBlKSB7DQorICBtX2R3RG9jVHlwZSA9IGR3VHlwZTsNCit9DQorQ1BERl9Eb2N1bWVudCogQ1hGQV9GRkRvYzo6R2V0UERGRG9jKCkgew0KKyAgcmV0dXJuIG1fcFBERkRvYzsNCit9DQorI2RlZmluZSBfRlhMSUJfTkVXX1ZFUlNJT05fDQorQ0ZYX0RJQml0bWFwKiBDWEZBX0ZGRG9jOjpHZXRQREZOYW1lZEltYWdlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSW1hZ2VYRHBpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSW1hZ2VZRHBpKSB7DQorICBpZiAoIW1fcFBERkRvYykgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIEZYX0RXT1JEIGR3SGFzaCA9DQorICAgICAgRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NOYW1lLkdldFB0cigpLCB3c05hbWUuR2V0TGVuZ3RoKCksIEZBTFNFKTsNCisgIEZYX0lNQUdFRElCX0FORF9EUEkqIGltYWdlRElCRHBpID0gTlVMTDsNCisgIGlmIChtX21hcE5hbWVkSW1hZ2VzLkxvb2t1cCgodm9pZCopKHVpbnRwdHJfdClkd0hhc2gsICh2b2lkKiYpaW1hZ2VESUJEcGkpKSB7DQorICAgIGlJbWFnZVhEcGkgPSBpbWFnZURJQkRwaS0+aUltYWdlWERwaTsNCisgICAgaUltYWdlWURwaSA9IGltYWdlRElCRHBpLT5pSW1hZ2VZRHBpOw0KKyAgICByZXR1cm4gKENGWF9ESUJpdG1hcCopaW1hZ2VESUJEcGktPnBEaWJTb3VyY2U7DQorICB9DQorICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gbV9wUERGRG9jLT5HZXRSb290KCk7DQorICBpZiAocFJvb3QgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENQREZfRGljdGlvbmFyeSogcE5hbWVzID0gcFJvb3QtPkdldERpY3QoIk5hbWVzIik7DQorICBpZiAoIXBOYW1lcykgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENQREZfRGljdGlvbmFyeSogcFhGQUltYWdlcyA9IHBOYW1lcy0+R2V0RGljdCgiWEZBSW1hZ2VzIik7DQorICBpZiAoIXBYRkFJbWFnZXMpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDUERGX05hbWVUcmVlIG5hbWV0cmVlKHBYRkFJbWFnZXMpOw0KKyNpZmRlZiBfRlhMSUJfTkVXX1ZFUlNJT05fDQorICBDRlhfQnl0ZVN0cmluZyBic05hbWUgPSBQREZfRW5jb2RlVGV4dCh3c05hbWUuR2V0UHRyKCksIHdzTmFtZS5HZXRMZW5ndGgoKSk7DQorICBDUERGX09iamVjdCogcE9iamVjdCA9IG5hbWV0cmVlLkxvb2t1cFZhbHVlKGJzTmFtZSk7DQorICBpZiAoIXBPYmplY3QpIHsNCisgICAgaW50MzJfdCBpQ291bnQgPSBuYW1ldHJlZS5HZXRDb3VudCgpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgIENGWF9CeXRlU3RyaW5nIGJzVGVtcDsNCisgICAgICBDUERGX09iamVjdCogcFRlbXBPYmplY3QgPSBuYW1ldHJlZS5Mb29rdXBWYWx1ZShpLCBic1RlbXApOw0KKyAgICAgIGlmIChic1RlbXAgPT0gYnNOYW1lKSB7DQorICAgICAgICBwT2JqZWN0ID0gcFRlbXBPYmplY3Q7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisjZWxzZQ0KKyAgQ1BERl9PYmplY3QqIHBPYmplY3QgPSBuYW1ldHJlZS5Mb29rdXBWYWx1ZSh3c05hbWUpOw0KKyAgaWYgKCFwT2JqZWN0KSB7DQorICAgIGludDMyX3QgaUNvdW50ID0gbmFtZXRyZWUuR2V0Q291bnQoKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7DQorICAgICAgQ1BERl9PYmplY3QqIHBUZW1wT2JqZWN0ID0gbmFtZXRyZWUuTG9va3VwVmFsdWUoaSwgd3NUZW1wKTsNCisgICAgICBpZiAod3NUZW1wID09IHdzTmFtZSkgew0KKyAgICAgICAgcE9iamVjdCA9IHBUZW1wT2JqZWN0Ow0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorI2VuZGlmDQorICBpZiAoIXBPYmplY3QgfHwgcE9iamVjdC0+R2V0VHlwZSgpICE9IFBERk9CSl9TVFJFQU0pIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpZiAoIWltYWdlRElCRHBpKSB7DQorICAgIGltYWdlRElCRHBpID0gRlhfQWxsb2MoRlhfSU1BR0VESUJfQU5EX0RQSSwgMSk7DQorICAgIGltYWdlRElCRHBpLT5wRGliU291cmNlID0gTlVMTDsNCisgICAgaW1hZ2VESUJEcGktPmlJbWFnZVhEcGkgPSAwOw0KKyAgICBpbWFnZURJQkRwaS0+aUltYWdlWURwaSA9IDA7DQorICAgIENQREZfU3RyZWFtQWNjIHN0cmVhbUFjYzsNCisgICAgc3RyZWFtQWNjLkxvYWRBbGxEYXRhKChDUERGX1N0cmVhbSopcE9iamVjdCk7DQorICAgIElGWF9GaWxlUmVhZCogcEltYWdlRmlsZVJlYWQgPSBGWF9DcmVhdGVNZW1vcnlTdHJlYW0oDQorICAgICAgICAodWludDhfdCopc3RyZWFtQWNjLkdldERhdGEoKSwgc3RyZWFtQWNjLkdldFNpemUoKSk7DQorICAgIGltYWdlRElCRHBpLT5wRGliU291cmNlID0gWEZBX0xvYWRJbWFnZUZyb21CdWZmZXIoDQorICAgICAgICBwSW1hZ2VGaWxlUmVhZCwgRlhDT0RFQ19JTUFHRV9VTktOT1dOLCBpSW1hZ2VYRHBpLCBpSW1hZ2VZRHBpKTsNCisgICAgaW1hZ2VESUJEcGktPmlJbWFnZVhEcGkgPSBpSW1hZ2VYRHBpOw0KKyAgICBpbWFnZURJQkRwaS0+aUltYWdlWURwaSA9IGlJbWFnZVlEcGk7DQorICAgIHBJbWFnZUZpbGVSZWFkLT5SZWxlYXNlKCk7DQorICB9DQorICBtX21hcE5hbWVkSW1hZ2VzLlNldEF0KCh2b2lkKikodWludHB0cl90KWR3SGFzaCwgaW1hZ2VESUJEcGkpOw0KKyAgcmV0dXJuIChDRlhfRElCaXRtYXAqKWltYWdlRElCRHBpLT5wRGliU291cmNlOw0KK30NCitJRkRFX1hNTEVsZW1lbnQqIENYRkFfRkZEb2M6OkdldFBhY2thZ2VEYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NQYWNrYWdlKSB7DQorICBGWF9EV09SRCBwYWNrZXRIYXNoID0NCisgICAgICBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c1BhY2thZ2UuR2V0UHRyKCksIHdzUGFja2FnZS5HZXRMZW5ndGgoKSk7DQorICBDWEZBX09iamVjdCogcE9iamVjdCA9IG1fcERvY3VtZW50LT5HZXRYRkFOb2RlKHBhY2tldEhhc2gpOw0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9DQorICAgICAgKHBPYmplY3QgJiYgcE9iamVjdC0+SXNOb2RlKCkpID8gKENYRkFfTm9kZSopcE9iamVjdCA6IE5VTEw7DQorICBpZiAoIXBOb2RlKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSA9IHBOb2RlLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgcmV0dXJuIChwWE1MTm9kZSAmJiBwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpDQorICAgICAgICAgICAgID8gKElGREVfWE1MRWxlbWVudCopcFhNTE5vZGUNCisgICAgICAgICAgICAgOiBOVUxMOw0KK30NCitGWF9CT09MIENYRkFfRkZEb2M6OlNhdmVQYWNrYWdlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NQYWNrYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZpbGVXcml0ZSogcEZpbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEZBX0NoZWNrc3VtQ29udGV4dCogcENTQ29udGV4dCkgew0KKyAgSVhGQV9QYWNrZXRFeHBvcnQqIHBFeHBvcnQgPSBJWEZBX1BhY2tldEV4cG9ydDo6Q3JlYXRlKG1fcERvY3VtZW50KTsNCisgIGlmICghcEV4cG9ydCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWF9EV09SRCBwYWNrZXRIYXNoID0NCisgICAgICBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c1BhY2thZ2UuR2V0UHRyKCksIHdzUGFja2FnZS5HZXRMZW5ndGgoKSk7DQorICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCisgIGlmIChwYWNrZXRIYXNoID09IFhGQV9IQVNIQ09ERV9YZmEpIHsNCisgICAgcE5vZGUgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9PYmplY3QqIHBPYmplY3QgPSBtX3BEb2N1bWVudC0+R2V0WEZBTm9kZShwYWNrZXRIYXNoKTsNCisgICAgcE5vZGUgPSAocE9iamVjdCAmJiBwT2JqZWN0LT5Jc05vZGUoKSkgPyAoQ1hGQV9Ob2RlKilwT2JqZWN0IDogTlVMTDsNCisgIH0NCisgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICBpZiAocE5vZGUpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNDaGVja3N1bTsNCisgICAgaWYgKHBDU0NvbnRleHQpIHsNCisgICAgICBwQ1NDb250ZXh0LT5HZXRDaGVja3N1bShic0NoZWNrc3VtKTsNCisgICAgfQ0KKyAgICBiRmxhZ3MgPSBwRXhwb3J0LT5FeHBvcnQocEZpbGUsIHBOb2RlLCAwLCBic0NoZWNrc3VtLkdldExlbmd0aCgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChjb25zdCBGWF9DSEFSKilic0NoZWNrc3VtDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEwpOw0KKyAgfSBlbHNlIHsNCisgICAgYkZsYWdzID0gcEV4cG9ydC0+RXhwb3J0KHBGaWxlKTsNCisgIH0NCisgIHBFeHBvcnQtPlJlbGVhc2UoKTsNCisgIHJldHVybiBiRmxhZ3M7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRvYzo6SW1wb3J0RGF0YShJRlhfRmlsZVJlYWQqIHBTdHJlYW0sIEZYX0JPT0wgYlhEUCkgew0KKyAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7DQorICBJWEZBX1BhY2tldEltcG9ydCogcEltcG9ydCA9IElYRkFfUGFja2V0SW1wb3J0OjpDcmVhdGUobV9wRG9jdW1lbnQpOw0KKyAgaWYgKHBJbXBvcnQpIHsNCisgICAgYlJldCA9IHBJbXBvcnQtPkltcG9ydERhdGEocFN0cmVhbSk7DQorICAgIHBJbXBvcnQtPlJlbGVhc2UoKTsNCisgIH0NCisgIHJldHVybiBiUmV0Ow0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2MuaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkY2JkNDEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2MuaApAQCAtMCwwICsxLDY0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgRlhGQV9TUkNfQVBQX1hGQV9GRkRPQ19IXw0KKyNkZWZpbmUgRlhGQV9TUkNfQVBQX1hGQV9GRkRPQ19IXw0KKw0KKyNpbmNsdWRlICJ4ZmEvaW5jbHVkZS9meGZhL2Z4ZmEuaCINCisNCitjbGFzcyBDWEZBX0ZGQXBwOw0KK2NsYXNzIENYRkFfRkZOb3RpZnk7DQorY2xhc3MgQ1hGQV9GRkRvY1ZpZXc7DQorY2xhc3MgSVhGQV9Mb2NhbGU7DQorDQordHlwZWRlZiBzdHJ1Y3QgX0ZYX0lNQUdFRElCX0FORF9EUEkgew0KKyAgQ0ZYX0RJQlNvdXJjZSogcERpYlNvdXJjZTsNCisgIGludDMyX3QgaUltYWdlWERwaTsNCisgIGludDMyX3QgaUltYWdlWURwaTsNCit9IEZYX0lNQUdFRElCX0FORF9EUEk7DQorDQorY2xhc3MgQ1hGQV9GRkRvYyA6IHB1YmxpYyBJWEZBX0RvYyB7DQorIHB1YmxpYzoNCisgIENYRkFfRkZEb2MoQ1hGQV9GRkFwcCogcEFwcCwgSVhGQV9Eb2NQcm92aWRlciogcERvY1Byb3ZpZGVyKTsNCisgIH5DWEZBX0ZGRG9jKCk7DQorICBJWEZBX0RvY1Byb3ZpZGVyKiBHZXREb2NQcm92aWRlcigpIHsgcmV0dXJuIG1fcERvY1Byb3ZpZGVyOyB9DQorICBGWF9EV09SRCBHZXREb2NUeXBlKCk7DQorICBpbnQzMl90IFN0YXJ0TG9hZCgpOw0KKyAgaW50MzJfdCBEb0xvYWQoSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKTsNCisgIHZvaWQgU3RvcExvYWQoKTsNCisgIElYRkFfRG9jVmlldyogQ3JlYXRlRG9jVmlldyhGWF9EV09SRCBkd1ZpZXcgPSAwKTsNCisgIEZYX0JPT0wgT3BlbkRvYyhJRlhfRmlsZVJlYWQqIHBTdHJlYW0sIEZYX0JPT0wgYlRha2VPdmVyRmlsZSk7DQorICBGWF9CT09MIE9wZW5Eb2MoQ1BERl9Eb2N1bWVudCogcFBERkRvYyk7DQorICBGWF9CT09MIENsb3NlRG9jKCk7DQorICB2b2lkIFNldERvY1R5cGUoRlhfRFdPUkQgZHdUeXBlKTsNCisgIENYRkFfRG9jdW1lbnQqIEdldFhGQURvYygpIHsgcmV0dXJuIG1fcERvY3VtZW50OyB9DQorICBDWEZBX0ZGQXBwKiBHZXRBcHAoKSB7IHJldHVybiBtX3BBcHA7IH0NCisgIENYRkFfRkZEb2NWaWV3KiBHZXREb2NWaWV3KElYRkFfRG9jTGF5b3V0KiBwTGF5b3V0KTsNCisgIENYRkFfRkZEb2NWaWV3KiBHZXREb2NWaWV3KCk7DQorICBDUERGX0RvY3VtZW50KiBHZXRQREZEb2MoKTsNCisgIENGWF9ESUJpdG1hcCogR2V0UERGTmFtZWRJbWFnZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSW1hZ2VYRHBpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlJbWFnZVlEcGkpOw0KKyAgSUZERV9YTUxFbGVtZW50KiBHZXRQYWNrYWdlRGF0YShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzUGFja2FnZSk7DQorICBGWF9CT09MIFNhdmVQYWNrYWdlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NQYWNrYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICBJRlhfRmlsZVdyaXRlKiBwRmlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgSVhGQV9DaGVja3N1bUNvbnRleHQqIHBDU0NvbnRleHQgPSBOVUxMKTsNCisgIEZYX0JPT0wgSW1wb3J0RGF0YShJRlhfRmlsZVJlYWQqIHBTdHJlYW0sIEZYX0JPT0wgYlhEUCA9IFRSVUUpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJWEZBX0RvY1Byb3ZpZGVyKiBtX3BEb2NQcm92aWRlcjsNCisgIENYRkFfRG9jdW1lbnQqIG1fcERvY3VtZW50Ow0KKyAgSUZYX0ZpbGVSZWFkKiBtX3BTdHJlYW07DQorICBDWEZBX0ZGQXBwKiBtX3BBcHA7DQorICBDWEZBX0ZGTm90aWZ5KiBtX3BOb3RpZnk7DQorICBDUERGX0RvY3VtZW50KiBtX3BQREZEb2M7DQorICBDRlhfTWFwUHRyVG9QdHIgbV9tYXBOYW1lZEltYWdlczsNCisgIENGWF9NYXBQdHJUb1B0ciBtX21hcFR5cGVUb0RvY1ZpZXc7DQorICBGWF9EV09SRCBtX2R3RG9jVHlwZTsNCisgIEZYX0JPT0wgbV9iT3duU3RyZWFtOw0KK307DQorDQorI2VuZGlmICAvLyBGWEZBX1NSQ19BUFBfWEZBX0ZGRE9DX0hfDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZG9jaGFuZGxlci5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2NoYW5kbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDJkYTZkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZG9jaGFuZGxlci5jcHAKQEAgLTAsMCArMSwxMDkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2NvbW1vbi5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2NoYW5kbGVyLmgiDQorI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KK0NYRkFfRkZEb2NIYW5kbGVyOjpDWEZBX0ZGRG9jSGFuZGxlcigpIHt9DQorQ1hGQV9GRkRvY0hhbmRsZXI6On5DWEZBX0ZGRG9jSGFuZGxlcigpIHt9DQordm9pZCBDWEZBX0ZGRG9jSGFuZGxlcjo6UmVsZWFzZURvYyhJWEZBX0RvYyogaERvYykgew0KKyAgZGVsZXRlIGhEb2M7ICAvLyB2aXJ0dWFsIGR0b3IuDQorfQ0KK0lYRkFfRG9jUHJvdmlkZXIqIENYRkFfRkZEb2NIYW5kbGVyOjpHZXREb2NQcm92aWRlcihJWEZBX0RvYyogaERvYykgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZEb2MqPihoRG9jKS0+R2V0RG9jUHJvdmlkZXIoKTsNCit9DQorRlhfRFdPUkQgQ1hGQV9GRkRvY0hhbmRsZXI6OkdldERvY1R5cGUoSVhGQV9Eb2MqIGhEb2MpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGRG9jKj4oaERvYyktPkdldERvY1R5cGUoKTsNCit9DQoraW50MzJfdCBDWEZBX0ZGRG9jSGFuZGxlcjo6U3RhcnRMb2FkKElYRkFfRG9jKiBoRG9jKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRkRvYyo+KGhEb2MpLT5TdGFydExvYWQoKTsNCit9DQoraW50MzJfdCBDWEZBX0ZGRG9jSGFuZGxlcjo6RG9Mb2FkKElYRkFfRG9jKiBoRG9jLCBJRlhfUGF1c2UqIHBQYXVzZSkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZEb2MqPihoRG9jKS0+RG9Mb2FkKHBQYXVzZSk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY0hhbmRsZXI6OlN0b3BMb2FkKElYRkFfRG9jKiBoRG9jKSB7DQorICBzdGF0aWNfY2FzdDxDWEZBX0ZGRG9jKj4oaERvYyktPlN0b3BMb2FkKCk7DQorfQ0KKw0KK0lYRkFfRG9jVmlldyogQ1hGQV9GRkRvY0hhbmRsZXI6OkNyZWF0ZURvY1ZpZXcoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1ZpZXcpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGRG9jKj4oaERvYyktPkNyZWF0ZURvY1ZpZXcoZHdWaWV3KTsNCit9DQoraW50MzJfdCBDWEZBX0ZGRG9jSGFuZGxlcjo6Q291bnRQYWNrYWdlcyhJWEZBX0RvYyogaERvYykgew0KKyAgcmV0dXJuIDA7DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY0hhbmRsZXI6OkdldFBhY2thZ2VOYW1lKElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVBhY2thZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDJiB3c1BhY2thZ2UpIHt9DQorSUZERV9YTUxFbGVtZW50KiBDWEZBX0ZGRG9jSGFuZGxlcjo6R2V0UGFja2FnZURhdGEoDQorICAgIElYRkFfRG9jKiBoRG9jLA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzUGFja2FnZSkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZEb2MqPihoRG9jKS0+R2V0UGFja2FnZURhdGEod3NQYWNrYWdlKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRG9jSGFuZGxlcjo6U2F2ZVBhY2thZ2UoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1BhY2thZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0ZpbGVXcml0ZSogcEZpbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhGQV9DaGVja3N1bUNvbnRleHQqIHBDU0NvbnRleHQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGRG9jKj4oaERvYykNCisgICAgICAtPlNhdmVQYWNrYWdlKHdzUGFja2FnZSwgcEZpbGUsIHBDU0NvbnRleHQpOw0KK30NCitGWF9CT09MIENYRkFfRkZEb2NIYW5kbGVyOjpDbG9zZURvYyhJWEZBX0RvYyogaERvYykgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZEb2MqPihoRG9jKS0+Q2xvc2VEb2MoKTsNCit9DQorDQorRlhfQk9PTCBDWEZBX0ZGRG9jSGFuZGxlcjo6SW1wb3J0RGF0YShJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9GaWxlUmVhZCogcFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlhEUCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZEb2MqPihoRG9jKS0+SW1wb3J0RGF0YShwU3RyZWFtLCBiWERQKTsNCit9DQordm9pZCBDWEZBX0ZGRG9jSGFuZGxlcjo6U2V0SlNFUnVudGltZShJWEZBX0RvYyogaERvYywgRlhKU0VfSFJVTlRJTUUgaFJ1bnRpbWUpIHsNCisgIHN0YXRpY19jYXN0PENYRkFfRkZEb2MqPihoRG9jKS0+R2V0WEZBRG9jKCktPkluaXRTY3JpcHRDb250ZXh0KGhSdW50aW1lKTsNCit9DQorRlhKU0VfSFZBTFVFIENYRkFfRkZEb2NIYW5kbGVyOjpHZXRYRkFTY3JpcHRPYmplY3QoSVhGQV9Eb2MqIGhEb2MpIHsNCisgIENYRkFfRG9jdW1lbnQqIHBYRkFEb2MgPSBzdGF0aWNfY2FzdDxDWEZBX0ZGRG9jKj4oaERvYyktPkdldFhGQURvYygpOw0KKyAgaWYgKCFwWEZBRG9jKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IHBYRkFEb2MtPkdldFNjcmlwdENvbnRleHQoKTsNCisgIGlmICghcFNjcmlwdENvbnRleHQpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gcFNjcmlwdENvbnRleHQtPkdldEpTVmFsdWVGcm9tTWFwKHBYRkFEb2MtPkdldFJvb3QoKSk7DQorfQ0KK1hGQV9BVFRSSUJVVEVFTlVNIENYRkFfRkZEb2NIYW5kbGVyOjpHZXRSZXN0b3JlU3RhdGUoSVhGQV9Eb2MqIGhEb2MpIHsNCisgIENYRkFfRG9jdW1lbnQqIHBYRkFEb2MgPSBzdGF0aWNfY2FzdDxDWEZBX0ZGRG9jKj4oaERvYyktPkdldFhGQURvYygpOw0KKyAgaWYgKCFwWEZBRG9jKSB7DQorICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwRm9ybSA9IChDWEZBX05vZGUqKXBYRkFEb2MtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0Zvcm0pOw0KKyAgaWYgKCFwRm9ybSkgew0KKyAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fVW5rbm93bjsNCisgIH0NCisgIENYRkFfTm9kZSogcFN1YkZvcm0gPSBwRm9ybS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfU3ViZm9ybSk7DQorICBpZiAoIXBTdWJGb3JtKSB7DQorICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duOw0KKyAgfQ0KKyAgcmV0dXJuIHBTdWJGb3JtLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfUmVzdG9yZVN0YXRlKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRG9jSGFuZGxlcjo6UnVuRG9jU2NyaXB0KElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfU0NSSVBUVFlQRSBlU2NyaXB0VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1NjcmlwdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhSZXRWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhUaGlzT2JqZWN0KSB7DQorICBDWEZBX0RvY3VtZW50KiBwWEZBRG9jID0gc3RhdGljX2Nhc3Q8Q1hGQV9GRkRvYyo+KGhEb2MpLT5HZXRYRkFEb2MoKTsNCisgIGlmICghcFhGQURvYykgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBJWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gcFhGQURvYy0+R2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgaWYgKCFwU2NyaXB0Q29udGV4dCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gcFNjcmlwdENvbnRleHQtPlJ1blNjcmlwdCgNCisgICAgICAoWEZBX1NDUklQVExBTkdUWVBFKWVTY3JpcHRUeXBlLCB3c1NjcmlwdCwgaFJldFZhbHVlLA0KKyAgICAgIGhUaGlzT2JqZWN0ID8gKENYRkFfT2JqZWN0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpc09iamVjdCwgTlVMTCkNCisgICAgICAgICAgICAgICAgICA6IE5VTEwpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2NoYW5kbGVyLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkb2NoYW5kbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY5YWI3OAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvY2hhbmRsZXIuaApAQCAtMCwwICsxLDQ4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgWEZBX0ZGRE9DSEFORExFUl9IXw0KKyNkZWZpbmUgWEZBX0ZGRE9DSEFORExFUl9IXw0KKw0KK2NsYXNzIENYRkFfRkZEb2NIYW5kbGVyIDogcHVibGljIElYRkFfRG9jSGFuZGxlciB7DQorIHB1YmxpYzoNCisgIENYRkFfRkZEb2NIYW5kbGVyKCk7DQorICB+Q1hGQV9GRkRvY0hhbmRsZXIoKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlRG9jKElYRkFfRG9jKiBoRG9jKTsNCisgIHZpcnR1YWwgSVhGQV9Eb2NQcm92aWRlciogR2V0RG9jUHJvdmlkZXIoSVhGQV9Eb2MqIGhEb2MpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXREb2NUeXBlKElYRkFfRG9jKiBoRG9jKTsNCisgIHZpcnR1YWwgaW50MzJfdCBTdGFydExvYWQoSVhGQV9Eb2MqIGhEb2MpOw0KKyAgdmlydHVhbCBpbnQzMl90IERvTG9hZChJWEZBX0RvYyogaERvYywgSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKTsNCisgIHZpcnR1YWwgdm9pZCBTdG9wTG9hZChJWEZBX0RvYyogaERvYyk7DQorDQorICB2aXJ0dWFsIElYRkFfRG9jVmlldyogQ3JlYXRlRG9jVmlldyhJWEZBX0RvYyogaERvYywgRlhfRFdPUkQgZHdWaWV3ID0gMCk7DQorICB2aXJ0dWFsIGludDMyX3QgQ291bnRQYWNrYWdlcyhJWEZBX0RvYyogaERvYyk7DQorICB2aXJ0dWFsIHZvaWQgR2V0UGFja2FnZU5hbWUoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUGFja2FnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0MmIHdzUGFja2FnZSk7DQorICB2aXJ0dWFsIElGREVfWE1MRWxlbWVudCogR2V0UGFja2FnZURhdGEoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1BhY2thZ2UpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNhdmVQYWNrYWdlKElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NQYWNrYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9GaWxlV3JpdGUqIHBGaWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYRkFfQ2hlY2tzdW1Db250ZXh0KiBwQ1NDb250ZXh0ID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2xvc2VEb2MoSVhGQV9Eb2MqIGhEb2MpOw0KKyAgdmlydHVhbCBGWF9CT09MIEltcG9ydERhdGEoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfRmlsZVJlYWQqIHBTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJYRFAgPSBUUlVFKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRKU0VSdW50aW1lKElYRkFfRG9jKiBoRG9jLCBGWEpTRV9IUlVOVElNRSBoUnVudGltZSk7DQorICB2aXJ0dWFsIEZYSlNFX0hWQUxVRSBHZXRYRkFTY3JpcHRPYmplY3QoSVhGQV9Eb2MqIGhEb2MpOw0KKyAgdmlydHVhbCBYRkFfQVRUUklCVVRFRU5VTSBHZXRSZXN0b3JlU3RhdGUoSVhGQV9Eb2MqIGhEb2MpOw0KKyAgdmlydHVhbCBGWF9CT09MIFJ1bkRvY1NjcmlwdChJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1NDUklQVFRZUEUgZVNjcmlwdFR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NTY3JpcHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoUmV0VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVGhpc09iamVjdCk7DQorDQorIHByb3RlY3RlZDoNCit9Ow0KKw0KKyNlbmRpZiAgLy8gWEZBX0ZGRE9DSEFORExFUl9IXw0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvY3ZpZXcuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZG9jdmlldy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg1YmE2NQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvY3ZpZXcuY3BwCkBAIC0wLDAgKzEsOTM2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9jb21tb24uaCINCisjaW5jbHVkZSAieGZhX2Z3bGFkYXB0ZXIuaCINCisjaW5jbHVkZSAieGZhX2ZmZG9jdmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZwYWdldmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXRoYW5kbGVyLmgiDQorI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXQuaCINCisjaW5jbHVkZSAieGZhX2ZmZmllbGQuaCINCisjaW5jbHVkZSAieGZhX2ZmcHVzaGJ1dHRvbi5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZjaGVja2J1dHRvbi5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZjaG9pY2VsaXN0LmgiDQorI2luY2x1ZGUgInhmYV9mZmltYWdlZWRpdC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ0ZXh0ZWRpdC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZiYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYV9mZmRyYXcuaCINCisjaW5jbHVkZSAieGZhX2ZmdGV4dC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZwYXRoLmgiDQorI2luY2x1ZGUgInhmYV9mZmltYWdlLmgiDQorI2luY2x1ZGUgInhmYV9mZmV4Y2xncm91cC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZzdWJmb3JtLmgiDQorI2luY2x1ZGUgInhmYV9mZnNpZ25hdHVyZS5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZhcHAuaCINCisjaW5jbHVkZSAieGZhX3RleHRsYXlvdXQuaCINCisjaW5jbHVkZSAieGZhX2Zmd2lkZ2V0YWNjLmgiDQorZXh0ZXJuIGNvbnN0IFhGQV9BVFRSSUJVVEVFTlVNIGdzX0V2ZW50QWN0aXZpdHlbXSA9IHsNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fQ2xpY2ssICAgICAgWEZBX0FUVFJJQlVURUVOVU1fQ2hhbmdlLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9Eb2NDbG9zZSwgICBYRkFfQVRUUklCVVRFRU5VTV9Eb2NSZWFkeSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fRW50ZXIsICAgICAgWEZBX0FUVFJJQlVURUVOVU1fRXhpdCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fRnVsbCwgICAgICAgWEZBX0FUVFJJQlVURUVOVU1fSW5kZXhDaGFuZ2UsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX0luaXRpYWxpemUsIFhGQV9BVFRSSUJVVEVFTlVNX01vdXNlRG93biwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fTW91c2VFbnRlciwgWEZBX0FUVFJJQlVURUVOVU1fTW91c2VFeGl0LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZVVwLCAgICBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0RXhlY3V0ZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fUG9zdE9wZW4sICAgWEZBX0FUVFJJQlVURUVOVU1fUG9zdFByaW50LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0U2F2ZSwgICBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0U2lnbiwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fUG9zdFN1Ym1pdCwgWEZBX0FUVFJJQlVURUVOVU1fUHJlRXhlY3V0ZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU1fUHJlT3BlbiwgICAgWEZBX0FUVFJJQlVURUVOVU1fUHJlUHJpbnQsDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1ByZVNhdmUsICAgIFhGQV9BVFRSSUJVVEVFTlVNX1ByZVNpZ24sDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNX1ByZVN1Ym1pdCwgIFhGQV9BVFRSSUJVVEVFTlVNX1JlYWR5LA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duLA0KK307DQorQ1hGQV9GRkRvY1ZpZXc6OkNYRkFfRkZEb2NWaWV3KENYRkFfRkZEb2MqIHBEb2MpDQorICAgIDogbV9iTGF5b3V0RXZlbnQoRkFMU0UpLA0KKyAgICAgIG1fcExpc3RGb2N1c1dpZGdldChudWxscHRyKSwNCisgICAgICBtX2JJbkxheW91dFN0YXR1cyhGQUxTRSksDQorICAgICAgbV9wRG9jKHBEb2MpLA0KKyAgICAgIG1fcFdpZGdldEhhbmRsZXIobnVsbHB0ciksDQorICAgICAgbV9wWEZBRG9jTGF5b3V0KG51bGxwdHIpLA0KKyAgICAgIG1fcEZvY3VzQWNjKG51bGxwdHIpLA0KKyAgICAgIG1fcEZvY3VzV2lkZ2V0KG51bGxwdHIpLA0KKyAgICAgIG1fcE9sZEZvY3VzV2lkZ2V0KG51bGxwdHIpLA0KKyAgICAgIG1faVN0YXR1cyhYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfTm9uZSksDQorICAgICAgbV9pTG9jaygwKSB7DQorfQ0KK0NYRkFfRkZEb2NWaWV3Ojp+Q1hGQV9GRkRvY1ZpZXcoKSB7DQorICBEZXN0cm95RG9jVmlldygpOw0KKyAgaWYgKG1fcFdpZGdldEhhbmRsZXIpIHsNCisgICAgZGVsZXRlIG1fcFdpZGdldEhhbmRsZXI7DQorICB9DQorICBtX3BXaWRnZXRIYW5kbGVyID0gTlVMTDsNCit9DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6SW5pdExheW91dChDWEZBX05vZGUqIHBOb2RlKSB7DQorICBSdW5CaW5kSXRlbXMoKTsNCisgIEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocE5vZGUsIFhGQV9FVkVOVF9Jbml0aWFsaXplKTsNCisgIEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocE5vZGUsIFhGQV9FVkVOVF9JbmRleENoYW5nZSk7DQorfQ0KK2ludDMyX3QgQ1hGQV9GRkRvY1ZpZXc6OlN0YXJ0TGF5b3V0KGludDMyX3QgaVN0YXJ0UGFnZSkgew0KKyAgbV9pU3RhdHVzID0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX1N0YXJ0Ow0KKyAgbV9wRG9jLT5HZXRYRkFEb2MoKS0+RG9Qcm90b01lcmdlKCk7DQorICBtX3BEb2MtPkdldFhGQURvYygpLT5Eb0RhdGFNZXJnZSgpOw0KKyAgbV9wWEZBRG9jTGF5b3V0ID0gR2V0WEZBTGF5b3V0KCk7DQorICBpbnQzMl90IGlTdGF0dXMgPSBtX3BYRkFEb2NMYXlvdXQtPlN0YXJ0TGF5b3V0KCk7DQorICBpZiAoaVN0YXR1cyA8IDApIHsNCisgICAgcmV0dXJuIGlTdGF0dXM7DQorICB9DQorICBDWEZBX05vZGUqIHBSb290SXRlbSA9DQorICAgICAgKENYRkFfTm9kZSopbV9wRG9jLT5HZXRYRkFEb2MoKS0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRm9ybSk7DQorICBpZiAoIXBSb290SXRlbSkgew0KKyAgICByZXR1cm4gaVN0YXR1czsNCisgIH0NCisgIEluaXRMYXlvdXQocFJvb3RJdGVtKTsNCisgIEluaXRDYWxjdWxhdGUocFJvb3RJdGVtKTsNCisgIEluaXRWYWxpZGF0ZShwUm9vdEl0ZW0pOw0KKyAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwUm9vdEl0ZW0sIFhGQV9FVkVOVF9SZWFkeSwgVFJVRSk7DQorICBtX2lTdGF0dXMgPSBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfU3RhcnQ7DQorICByZXR1cm4gaVN0YXR1czsNCit9DQoraW50MzJfdCBDWEZBX0ZGRG9jVmlldzo6RG9MYXlvdXQoSUZYX1BhdXNlKiBwUGF1c2UpIHsNCisgIGludDMyX3QgaVN0YXR1cyA9IDEwMDsNCisgIGlTdGF0dXMgPSBtX3BYRkFEb2NMYXlvdXQtPkRvTGF5b3V0KHBQYXVzZSk7DQorICBpZiAoaVN0YXR1cyAhPSAxMDApIHsNCisgICAgcmV0dXJuIGlTdGF0dXM7DQorICB9DQorICBtX2lTdGF0dXMgPSBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRG9pbmc7DQorICByZXR1cm4gaVN0YXR1czsNCit9DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6U3RvcExheW91dCgpIHsNCisgIENYRkFfTm9kZSogcFJvb3RJdGVtID0NCisgICAgICAoQ1hGQV9Ob2RlKiltX3BEb2MtPkdldFhGQURvYygpLT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKTsNCisgIGlmICghcFJvb3RJdGVtKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfTm9kZSogcFN1YmZvcm1Ob2RlID0gcFJvb3RJdGVtLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9TdWJmb3JtKTsNCisgIGlmICghcFN1YmZvcm1Ob2RlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfTm9kZSogcFBhZ2VTZXROb2RlID0NCisgICAgICBwU3ViZm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1BhZ2VTZXQpOw0KKyAgaWYgKCFwUGFnZVNldE5vZGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgUnVuQ2FsY3VsYXRlV2lkZ2V0cygpOw0KKyAgUnVuVmFsaWRhdGUoKTsNCisgIEluaXRMYXlvdXQocFBhZ2VTZXROb2RlKTsNCisgIEluaXRDYWxjdWxhdGUocFBhZ2VTZXROb2RlKTsNCisgIEluaXRWYWxpZGF0ZShwUGFnZVNldE5vZGUpOw0KKyAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwUGFnZVNldE5vZGUsIFhGQV9FVkVOVF9SZWFkeSwgVFJVRSk7DQorICBFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KHBSb290SXRlbSwgWEZBX0VWRU5UX1JlYWR5KTsNCisgIEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocFJvb3RJdGVtLCBYRkFfRVZFTlRfRG9jUmVhZHkpOw0KKyAgUnVuQ2FsY3VsYXRlV2lkZ2V0cygpOw0KKyAgUnVuVmFsaWRhdGUoKTsNCisgIGlmIChSdW5MYXlvdXQoKSkgew0KKyAgICBFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KHBSb290SXRlbSwgWEZBX0VWRU5UX1JlYWR5KTsNCisgIH0NCisgIG1fQ2FsY3VsYXRlQWNjcy5SZW1vdmVBbGwoKTsNCisgIGlmIChtX3BGb2N1c0FjYyAmJiAhbV9wRm9jdXNXaWRnZXQpIHsNCisgICAgU2V0Rm9jdXNXaWRnZXRBY2MobV9wRm9jdXNBY2MpOw0KKyAgfQ0KKyAgbV9pU3RhdHVzID0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0VuZDsNCit9DQoraW50MzJfdCBDWEZBX0ZGRG9jVmlldzo6R2V0TGF5b3V0U3RhdHVzKCkgew0KKyAgcmV0dXJuIG1faVN0YXR1czsNCit9DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6U2hvd051bGxUZXN0TXNnKCkgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX2Fyck51bGxUZXN0TXNnLkdldFNpemUoKTsNCisgIENYRkFfRkZBcHAqIHBBcHAgPSBtX3BEb2MtPkdldEFwcCgpOw0KKyAgSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyID0gcEFwcC0+R2V0QXBwUHJvdmlkZXIoKTsNCisgIGlmIChwQXBwUHJvdmlkZXIgJiYgaUNvdW50KSB7DQorICAgIGludDMyX3QgaVJlbWFpbiA9IGlDb3VudCA+IDcgPyBpQ291bnQgLSA3IDogMDsNCisgICAgaUNvdW50IC09IGlSZW1haW47DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTXNnOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgIHdzTXNnICs9IG1fYXJyTnVsbFRlc3RNc2dbaV0gKyBGWF9XU1RSQyhMIlxuIik7DQorICAgIH0NCisgICAgaWYgKGlSZW1haW4gPiAwKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMaW1pdDsNCisgICAgICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoWEZBX0lEU19WYWxpZGF0ZUxpbWl0LCB3c0xpbWl0KTsNCisgICAgICBpZiAoIXdzTGltaXQuSXNFbXB0eSgpKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7DQorICAgICAgICB3c1RlbXAuRm9ybWF0KChjb25zdCBGWF9XQ0hBUiopd3NMaW1pdCwgaVJlbWFpbik7DQorICAgICAgICB3c01zZyArPSBGWF9XU1RSQyhMIlxuIikgKyB3c1RlbXA7DQorICAgICAgfQ0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGl0bGU7DQorICAgIHBBcHBQcm92aWRlci0+TG9hZFN0cmluZyhYRkFfSURTX0FwcE5hbWUsIHdzVGl0bGUpOw0KKyAgICBwQXBwUHJvdmlkZXItPk1zZ0JveCh3c01zZywgd3NUaXRsZSwgWEZBX01CSUNPTl9TdGF0dXMsIFhGQV9NQl9PSyk7DQorICB9DQorICBtX2Fyck51bGxUZXN0TXNnLlJlbW92ZUFsbCgpOw0KK30NCit2b2lkIENYRkFfRkZEb2NWaWV3OjpVcGRhdGVEb2NWaWV3KCkgew0KKyAgaWYgKElzVXBkYXRlTG9ja2VkKCkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgTG9ja1VwZGF0ZSgpOw0KKyAgaW50MzJfdCBpTmV3QWRkcyA9IG1fTmV3QWRkZWROb2Rlcy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTmV3QWRkczsgaSsrKSB7DQorICAgIENYRkFfTm9kZSogcE5vZGUgPSAoQ1hGQV9Ob2RlKiltX05ld0FkZGVkTm9kZXNbaV07DQorICAgIEluaXRDYWxjdWxhdGUocE5vZGUpOw0KKyAgICBJbml0VmFsaWRhdGUocE5vZGUpOw0KKyAgICBFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KHBOb2RlLCBYRkFfRVZFTlRfUmVhZHksIFRSVUUpOw0KKyAgfQ0KKyAgbV9OZXdBZGRlZE5vZGVzLlJlbW92ZUFsbCgpOw0KKyAgdGhpcy0+UnVuU3ViZm9ybUluZGV4Q2hhbmdlKCk7DQorICB0aGlzLT5SdW5DYWxjdWxhdGVXaWRnZXRzKCk7DQorICB0aGlzLT5SdW5WYWxpZGF0ZSgpOw0KKyAgU2hvd051bGxUZXN0TXNnKCk7DQorICBtX2lTdGF0dXMgPSBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfTmV4dDsNCisgIGlmIChSdW5MYXlvdXQoKSAmJiBtX2JMYXlvdXRFdmVudCkgew0KKyAgICBSdW5FdmVudExheW91dFJlYWR5KCk7DQorICB9DQorICBtX2JMYXlvdXRFdmVudCA9IEZBTFNFOw0KKyAgbV9DYWxjdWxhdGVBY2NzLlJlbW92ZUFsbCgpOw0KKyAgdGhpcy0+UnVuSW52YWxpZGF0ZSgpOw0KKyAgVW5sb2NrVXBkYXRlKCk7DQorfQ0KK2ludDMyX3QgQ1hGQV9GRkRvY1ZpZXc6OkNvdW50UGFnZVZpZXdzKCkgew0KKyAgaWYgKCFtX3BYRkFEb2NMYXlvdXQpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICByZXR1cm4gbV9wWEZBRG9jTGF5b3V0LT5Db3VudFBhZ2VzKCk7DQorfQ0KK0lYRkFfUGFnZVZpZXcqIENYRkFfRkZEb2NWaWV3OjpHZXRQYWdlVmlldyhpbnQzMl90IG5JbmRleCkgew0KKyAgaWYgKCFtX3BYRkFEb2NMYXlvdXQpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRlBhZ2VWaWV3Kj4obV9wWEZBRG9jTGF5b3V0LT5HZXRQYWdlKG5JbmRleCkpOw0KK30NCitJWEZBX1dpZGdldCogQ1hGQV9GRkRvY1ZpZXc6OkdldFdpZGdldEJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSkgew0KKyAgcmV0dXJuIEdldFdpZGdldEJ5TmFtZSh3c05hbWUsIE5VTEwpOw0KK30NCitDWEZBX1dpZGdldEFjYyogQ1hGQV9GRkRvY1ZpZXc6OkdldFdpZGdldEFjY0J5TmFtZSgNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpIHsNCisgIHJldHVybiBHZXRXaWRnZXRBY2NCeU5hbWUod3NOYW1lLCBOVUxMKTsNCit9DQorSVhGQV9Eb2NMYXlvdXQqIENYRkFfRkZEb2NWaWV3OjpHZXRYRkFMYXlvdXQoKSBjb25zdCB7DQorICByZXR1cm4gbV9wRG9jLT5HZXRYRkFEb2MoKS0+R2V0RG9jTGF5b3V0KCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRvY1ZpZXc6OlJlc2V0U2luZ2xlV2lkZ2V0QWNjRGF0YShDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYykgew0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBXaWRnZXRBY2MtPkdldE5vZGUoKTsNCisgIFhGQV9FTEVNRU5UIGVUeXBlID0gcE5vZGUtPkdldENsYXNzSUQoKTsNCisgIGlmIChlVHlwZSAhPSBYRkFfRUxFTUVOVF9GaWVsZCAmJiBlVHlwZSAhPSBYRkFfRUxFTUVOVF9FeGNsR3JvdXApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRlhfQk9PTCBiTm90aWZ5ID0gSXNTdGF0aWNOb3RpZnkoKTsNCisgIHBXaWRnZXRBY2MtPlJlc2V0RGF0YSgpOw0KKyAgcFdpZGdldEFjYy0+VXBkYXRlVUlEaXNwbGF5KCk7DQorICBpZiAoYk5vdGlmeSkgew0KKyAgICBwV2lkZ2V0QWNjLT5Ob3RpZnlFdmVudChYRkFfV0lER0VURVZFTlRfUG9zdENvbnRlbnRDaGFuZ2VkLCBOVUxMLCBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsNCisgIH0NCisgIGlmIChDWEZBX1ZhbGlkYXRlIHZhbGlkYXRlID0gcFdpZGdldEFjYy0+R2V0VmFsaWRhdGUoKSkgew0KKyAgICBBZGRWYWxpZGF0ZVdpZGdldChwV2lkZ2V0QWNjKTsNCisgICAgKChDWEZBX05vZGUqKXZhbGlkYXRlKS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfTmVlZHNJbml0QXBwLCBUUlVFLCBGQUxTRSk7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6UmVzZXRXaWRnZXREYXRhKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjKSB7DQorICBtX2JMYXlvdXRFdmVudCA9IFRSVUU7DQorICBGWF9CT09MIGJDaGFuZ2VkID0gRkFMU0U7DQorICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IE5VTEw7DQorICBpZiAocFdpZGdldEFjYykgew0KKyAgICBiQ2hhbmdlZCA9IFJlc2V0U2luZ2xlV2lkZ2V0QWNjRGF0YShwV2lkZ2V0QWNjKTsNCisgICAgcEZvcm1Ob2RlID0gcFdpZGdldEFjYy0+R2V0Tm9kZSgpOw0KKyAgfSBlbHNlIHsNCisgICAgcEZvcm1Ob2RlID0gR2V0Um9vdFN1YmZvcm0oKTsNCisgIH0NCisgIGlmICghcEZvcm1Ob2RlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChwRm9ybU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9GaWVsZCAmJg0KKyAgICAgIHBGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0V4Y2xHcm91cCkgew0KKyAgICBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yIEl0ZXJhdG9yKHRoaXMsIHBGb3JtTm9kZSk7DQorICAgIHdoaWxlIChDWEZBX1dpZGdldEFjYyogcEFjYyA9IEl0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICAgIGJDaGFuZ2VkIHw9IFJlc2V0U2luZ2xlV2lkZ2V0QWNjRGF0YShwQWNjKTsNCisgICAgICBpZiAocEFjYy0+R2V0Tm9kZSgpLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwKSB7DQorICAgICAgICBJdGVyYXRvci5Ta2lwVHJlZSgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGJDaGFuZ2VkKSB7DQorICAgIG1fcERvYy0+R2V0RG9jUHJvdmlkZXIoKS0+U2V0Q2hhbmdlTWFyayhtX3BEb2MpOw0KKyAgfQ0KK30NCitpbnQzMl90IENYRkFfRkZEb2NWaWV3OjpQcm9jZXNzV2lkZ2V0RXZlbnQoQ1hGQV9FdmVudFBhcmFtKiBwUGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjKSB7DQorICBpZiAocFBhcmFtID09IE5VTEwpIHsNCisgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX0Vycm9yOw0KKyAgfQ0KKyAgaWYgKHBQYXJhbS0+bV9lVHlwZSA9PSBYRkFfRVZFTlRfVmFsaWRhdGUpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWxpZGF0ZVN0ciA9IEZYX1dTVFJDKEwicHJlU3VibWl0Iik7DQorICAgIENYRkFfTm9kZSogcENvbmZpZ0l0ZW0gPQ0KKyAgICAgICAgKENYRkFfTm9kZSopbV9wRG9jLT5HZXRYRkFEb2MoKS0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfQ29uZmlnKTsNCisgICAgaWYgKHBDb25maWdJdGVtKSB7DQorICAgICAgQ1hGQV9Ob2RlKiBwVmFsaWRhdGVOb2RlID0gTlVMTDsNCisgICAgICBDWEZBX05vZGUqIHBBY3JvYmF0Tm9kZSA9IHBDb25maWdJdGVtLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9BY3JvYmF0KTsNCisgICAgICBwVmFsaWRhdGVOb2RlID0NCisgICAgICAgICAgcEFjcm9iYXROb2RlID8gcEFjcm9iYXROb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9WYWxpZGF0ZSkgOiBOVUxMOw0KKyAgICAgIGlmICghcFZhbGlkYXRlTm9kZSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwUHJlc2VudE5vZGUgPSBwQ29uZmlnSXRlbS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfUHJlc2VudCk7DQorICAgICAgICBwVmFsaWRhdGVOb2RlID0gcFByZXNlbnROb2RlDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcFByZXNlbnROb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9WYWxpZGF0ZSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOw0KKyAgICAgIH0NCisgICAgICBpZiAocFZhbGlkYXRlTm9kZSkgew0KKyAgICAgICAgd3NWYWxpZGF0ZVN0ciA9IHBWYWxpZGF0ZU5vZGUtPkdldENvbnRlbnQoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgRlhfQk9PTCBiVmFsaWRhdGUgPSBGQUxTRTsNCisgICAgc3dpdGNoIChwUGFyYW0tPm1faVZhbGlkYXRlQWN0aXZpdGllcykgew0KKyAgICAgIGNhc2UgWEZBX1ZBTElEQVRFX3ByZVN1Ym1pdDoNCisgICAgICAgIGJWYWxpZGF0ZSA9IHdzVmFsaWRhdGVTdHIuRmluZChMInByZVN1Ym1pdCIpICE9IC0xOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfVkFMSURBVEVfcHJlUHJpbnQ6DQorICAgICAgICBiVmFsaWRhdGUgPSB3c1ZhbGlkYXRlU3RyLkZpbmQoTCJwcmVQcmludCIpICE9IC0xOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfVkFMSURBVEVfcHJlRXhlY3V0ZToNCisgICAgICAgIGJWYWxpZGF0ZSA9IHdzVmFsaWRhdGVTdHIuRmluZChMInByZUV4ZWN1dGUiKSAhPSAtMTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX1ZBTElEQVRFX3ByZVNhdmU6DQorICAgICAgICBiVmFsaWRhdGUgPSB3c1ZhbGlkYXRlU3RyLkZpbmQoTCJwcmVTYXZlIikgIT0gLTE7DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoIWJWYWxpZGF0ZSkgew0KKyAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQorICAgIH0NCisgIH0NCisgIENYRkFfTm9kZSogcE5vZGUgPSBwV2lkZ2V0QWNjID8gcFdpZGdldEFjYy0+R2V0Tm9kZSgpIDogTlVMTDsNCisgIGlmICghcE5vZGUpIHsNCisgICAgQ1hGQV9Ob2RlKiBwUm9vdEl0ZW0gPQ0KKyAgICAgICAgKENYRkFfTm9kZSopbV9wRG9jLT5HZXRYRkFEb2MoKS0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRm9ybSk7DQorICAgIGlmICghcFJvb3RJdGVtKSB7DQorICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX0Vycm9yOw0KKyAgICB9DQorICAgIHBOb2RlID0gcFJvb3RJdGVtLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9TdWJmb3JtKTsNCisgIH0NCisgIEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocE5vZGUsIHBQYXJhbS0+bV9lVHlwZSwgcFBhcmFtLT5tX2JJc0Zvcm1SZWFkeSk7DQorICByZXR1cm4gWEZBX0VWRU5URVJST1JfU3VjZXNzOw0KK30NCitJWEZBX1dpZGdldEhhbmRsZXIqIENYRkFfRkZEb2NWaWV3OjpHZXRXaWRnZXRIYW5kbGVyKCkgew0KKyAgaWYgKCFtX3BXaWRnZXRIYW5kbGVyKSB7DQorICAgIG1fcFdpZGdldEhhbmRsZXIgPSBuZXcgQ1hGQV9GRldpZGdldEhhbmRsZXIodGhpcyk7DQorICB9DQorICByZXR1cm4gbV9wV2lkZ2V0SGFuZGxlcjsNCit9DQorSVhGQV9XaWRnZXRJdGVyYXRvciogQ1hGQV9GRkRvY1ZpZXc6OkNyZWF0ZVdpZGdldEl0ZXJhdG9yKCkgew0KKyAgQ1hGQV9Ob2RlKiBwRm9ybVJvb3QgPSBHZXRSb290U3ViZm9ybSgpOw0KKyAgaWYgKCFwRm9ybVJvb3QpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gbmV3IENYRkFfRkZEb2NXaWRnZXRJdGVyYXRvcih0aGlzLCBwRm9ybVJvb3QpOw0KK30NCitJWEZBX1dpZGdldEFjY0l0ZXJhdG9yKiBDWEZBX0ZGRG9jVmlldzo6Q3JlYXRlV2lkZ2V0QWNjSXRlcmF0b3IoDQorICAgIFhGQV9XSURHRVRPUkRFUiBlT3JkZXIpIHsNCisgIENYRkFfTm9kZSogcEZvcm1Sb290ID0gR2V0Um9vdFN1YmZvcm0oKTsNCisgIGlmICghcEZvcm1Sb290KSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIG5ldyBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yKHRoaXMsIHBGb3JtUm9vdCk7DQorfQ0KK0lYRkFfV2lkZ2V0KiBDWEZBX0ZGRG9jVmlldzo6R2V0Rm9jdXNXaWRnZXQoKSB7DQorICByZXR1cm4gbV9wRm9jdXNXaWRnZXQ7DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OktpbGxGb2N1cygpIHsNCisgIGlmIChtX3BGb2N1c1dpZGdldCAmJg0KKyAgICAgIChtX3BGb2N1c1dpZGdldC0+R2V0U3RhdHVzKCkgJiBYRkFfV0lER0VUU1RBVFVTX0ZvY3VzZWQpKSB7DQorICAgIChtX3BGb2N1c1dpZGdldCktPk9uS2lsbEZvY3VzKE5VTEwpOw0KKyAgfQ0KKyAgbV9wRm9jdXNBY2MgPSBOVUxMOw0KKyAgbV9wRm9jdXNXaWRnZXQgPSBOVUxMOw0KKyAgbV9wT2xkRm9jdXNXaWRnZXQgPSBOVUxMOw0KK30NCitGWF9CT09MIENYRkFfRkZEb2NWaWV3OjpTZXRGb2N1cyhJWEZBX1dpZGdldCogaFdpZGdldCkgew0KKyAgQ1hGQV9GRldpZGdldCogcE5ld0ZvY3VzID0gKENYRkFfRkZXaWRnZXQqKWhXaWRnZXQ7DQorICBpZiAobV9wT2xkRm9jdXNXaWRnZXQgPT0gcE5ld0ZvY3VzKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENYRkFfRkZXaWRnZXQqIHBPbGRGb2N1cyA9IG1fcE9sZEZvY3VzV2lkZ2V0Ow0KKyAgbV9wT2xkRm9jdXNXaWRnZXQgPSBwTmV3Rm9jdXM7DQorICBpZiAocE9sZEZvY3VzKSB7DQorICAgIGlmIChtX3BGb2N1c1dpZGdldCAhPSBtX3BPbGRGb2N1c1dpZGdldCAmJg0KKyAgICAgICAgKHBPbGRGb2N1cy0+R2V0U3RhdHVzKCkgJiBYRkFfV0lER0VUU1RBVFVTX0ZvY3VzZWQpKSB7DQorICAgICAgbV9wRm9jdXNXaWRnZXQgPSBwT2xkRm9jdXM7DQorICAgICAgcE9sZEZvY3VzLT5PbktpbGxGb2N1cyhwTmV3Rm9jdXMpOw0KKyAgICB9IGVsc2UgaWYgKChwT2xkRm9jdXMtPkdldFN0YXR1cygpICYgWEZBX1dJREdFVFNUQVRVU19WaXNpYmxlKSkgew0KKyAgICAgIGlmICghcE9sZEZvY3VzLT5Jc0xvYWRlZCgpKSB7DQorICAgICAgICBwT2xkRm9jdXMtPkxvYWRXaWRnZXQoKTsNCisgICAgICB9DQorICAgICAgcE9sZEZvY3VzLT5PblNldEZvY3VzKG1fcEZvY3VzV2lkZ2V0KTsNCisgICAgICBtX3BGb2N1c1dpZGdldCA9IHBPbGRGb2N1czsNCisgICAgICBwT2xkRm9jdXMtPk9uS2lsbEZvY3VzKHBOZXdGb2N1cyk7DQorICAgIH0NCisgIH0NCisgIGlmIChtX3BGb2N1c1dpZGdldCA9PSBtX3BPbGRGb2N1c1dpZGdldCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBwTmV3Rm9jdXMgPSBtX3BPbGRGb2N1c1dpZGdldDsNCisgIGlmIChtX3BMaXN0Rm9jdXNXaWRnZXQgJiYgcE5ld0ZvY3VzID09IG1fcExpc3RGb2N1c1dpZGdldCkgew0KKyAgICBtX3BGb2N1c0FjYyA9IE5VTEw7DQorICAgIG1fcEZvY3VzV2lkZ2V0ID0gTlVMTDsNCisgICAgbV9wTGlzdEZvY3VzV2lkZ2V0ID0gTlVMTDsNCisgICAgbV9wT2xkRm9jdXNXaWRnZXQgPSBOVUxMOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAocE5ld0ZvY3VzICYmIChwTmV3Rm9jdXMtPkdldFN0YXR1cygpICYgWEZBX1dJREdFVFNUQVRVU19WaXNpYmxlKSkgew0KKyAgICBpZiAoIXBOZXdGb2N1cy0+SXNMb2FkZWQoKSkgew0KKyAgICAgIHBOZXdGb2N1cy0+TG9hZFdpZGdldCgpOw0KKyAgICB9DQorICAgIHBOZXdGb2N1cy0+T25TZXRGb2N1cyhtX3BGb2N1c1dpZGdldCk7DQorICB9DQorICBtX3BGb2N1c0FjYyA9IHBOZXdGb2N1cyA/IHBOZXdGb2N1cy0+R2V0RGF0YUFjYygpIDogTlVMTDsNCisgIG1fcEZvY3VzV2lkZ2V0ID0gcE5ld0ZvY3VzOw0KKyAgbV9wT2xkRm9jdXNXaWRnZXQgPSBtX3BGb2N1c1dpZGdldDsNCisgIHJldHVybiBUUlVFOw0KK30NCitDWEZBX1dpZGdldEFjYyogQ1hGQV9GRkRvY1ZpZXc6OkdldEZvY3VzV2lkZ2V0QWNjKCkgew0KKyAgcmV0dXJuIG1fcEZvY3VzQWNjOw0KK30NCit2b2lkIENYRkFfRkZEb2NWaWV3OjpTZXRGb2N1c1dpZGdldEFjYyhDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYykgew0KKyAgQ1hGQV9GRldpZGdldCogcE5ld0ZvY3VzID0NCisgICAgICBwV2lkZ2V0QWNjID8gcFdpZGdldEFjYy0+R2V0TmV4dFdpZGdldChOVUxMKSA6IE5VTEw7DQorICBpZiAoU2V0Rm9jdXMocE5ld0ZvY3VzKSkgew0KKyAgICBtX3BGb2N1c0FjYyA9IHBXaWRnZXRBY2M7DQorICAgIGlmIChtX2lTdGF0dXMgPj0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0VuZCkgew0KKyAgICAgIG1fcERvYy0+R2V0RG9jUHJvdmlkZXIoKS0+U2V0Rm9jdXNXaWRnZXQobV9wRG9jLCBtX3BGb2N1c1dpZGdldCk7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6RGVsZXRlTGF5b3V0SXRlbShDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBpZiAobV9wRm9jdXNBY2MgPT0gcFdpZGdldC0+R2V0RGF0YUFjYygpKSB7DQorICAgIG1fcEZvY3VzQWNjID0gTlVMTDsNCisgICAgbV9wRm9jdXNXaWRnZXQgPSBOVUxMOw0KKyAgICBtX3BPbGRGb2N1c1dpZGdldCA9IE5VTEw7DQorICB9DQorfQ0KK3N0YXRpYyBpbnQzMl90IFhGQV9Qcm9jZXNzRXZlbnQoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0V2ZW50UGFyYW0qIHBQYXJhbSkgew0KKyAgaWYgKCFwUGFyYW0gfHwgcFBhcmFtLT5tX2VUeXBlID09IFhGQV9FVkVOVF9Vbmtub3duKSB7DQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgIH0NCisgIGlmICghcFdpZGdldEFjYyB8fCBwV2lkZ2V0QWNjLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRHJhdykgew0KKyAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7DQorICB9DQorICBzd2l0Y2ggKHBQYXJhbS0+bV9lVHlwZSkgew0KKyAgICBjYXNlIFhGQV9FVkVOVF9DYWxjdWxhdGU6DQorICAgICAgcmV0dXJuIHBXaWRnZXRBY2MtPlByb2Nlc3NDYWxjdWxhdGUoKTsNCisgICAgY2FzZSBYRkFfRVZFTlRfVmFsaWRhdGU6DQorICAgICAgaWYgKCgoQ1hGQV9GRkRvYyopcERvY1ZpZXctPkdldERvYygpKQ0KKyAgICAgICAgICAgICAgLT5HZXREb2NQcm92aWRlcigpDQorICAgICAgICAgICAgICAtPklzVmFsaWRhdGlvbnNFbmFibGVkKHBEb2NWaWV3LT5HZXREb2MoKSkpIHsNCisgICAgICAgIHJldHVybiBwV2lkZ2V0QWNjLT5Qcm9jZXNzVmFsaWRhdGUoMHgwMSk7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9EaXNhYmxlZDsNCisgICAgY2FzZSBYRkFfRVZFTlRfSW5pdENhbGN1bGF0ZTogew0KKyAgICAgIENYRkFfQ2FsY3VsYXRlIGNhbGMgPSBwV2lkZ2V0QWNjLT5HZXRDYWxjdWxhdGUoKTsNCisgICAgICBpZiAoIWNhbGMpIHsNCisgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgICAgICB9DQorICAgICAgaWYgKHBXaWRnZXRBY2MtPkdldE5vZGUoKS0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfVXNlckludGVyYWN0aXZlKSkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX0Rpc2FibGVkOw0KKyAgICAgIH0NCisgICAgICBDWEZBX1NjcmlwdCBzY3JpcHQgPSBjYWxjLkdldFNjcmlwdCgpOw0KKyAgICAgIHJldHVybiBwV2lkZ2V0QWNjLT5FeGVjdXRlU2NyaXB0KHNjcmlwdCwgcFBhcmFtKTsNCisgICAgfQ0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgaW50MzJfdCBpUmV0ID0NCisgICAgICBwV2lkZ2V0QWNjLT5Qcm9jZXNzRXZlbnQoZ3NfRXZlbnRBY3Rpdml0eVtwUGFyYW0tPm1fZVR5cGVdLCBwUGFyYW0pOw0KKyAgcmV0dXJuIGlSZXQ7DQorfQ0KK2ludDMyX3QgQ1hGQV9GRkRvY1ZpZXc6OkV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRVZFTlRUWVBFIGVFdmVudFR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJc0Zvcm1SZWFkeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlY3Vyc2l2ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEV4Y2x1ZGUpIHsNCisgIGludDMyX3QgaVJldCA9IFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KKyAgaWYgKHBGb3JtTm9kZSA9PSBwRXhjbHVkZSkgew0KKyAgICByZXR1cm4gaVJldDsNCisgIH0NCisgIFhGQV9FTEVNRU5UIGVsZW1lbnRUeXBlID0gcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCk7DQorICBpZiAoZWxlbWVudFR5cGUgPT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCisgICAgaWYgKGVFdmVudFR5cGUgPT0gWEZBX0VWRU5UX0luZGV4Q2hhbmdlKSB7DQorICAgICAgcmV0dXJuIGlSZXQ7DQorICAgIH0NCisgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXBGb3JtTm9kZS0+R2V0V2lkZ2V0RGF0YSgpOw0KKyAgICBpZiAocFdpZGdldEFjYyA9PSBOVUxMKSB7DQorICAgICAgcmV0dXJuIGlSZXQ7DQorICAgIH0NCisgICAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsNCisgICAgZVBhcmFtLm1fZVR5cGUgPSBlRXZlbnRUeXBlOw0KKyAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gcFdpZGdldEFjYzsNCisgICAgZVBhcmFtLm1fYklzRm9ybVJlYWR5ID0gYklzRm9ybVJlYWR5Ow0KKyAgICByZXR1cm4gWEZBX1Byb2Nlc3NFdmVudCh0aGlzLCBwV2lkZ2V0QWNjLCAmZVBhcmFtKTsNCisgIH0NCisgIGlmIChiUmVjdXJzaXZlKSB7DQorICAgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHBGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oDQorICAgICAgICAgICAgIFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkLCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKTsNCisgICAgICAgICBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKSkgew0KKyAgICAgIGVsZW1lbnRUeXBlID0gcE5vZGUtPkdldENsYXNzSUQoKTsNCisgICAgICBpZiAoZWxlbWVudFR5cGUgIT0gWEZBX0VMRU1FTlRfVmFyaWFibGVzICYmDQorICAgICAgICAgIGVsZW1lbnRUeXBlICE9IFhGQV9FTEVNRU5UX0RyYXcpIHsNCisgICAgICAgIGlSZXQgfD0gRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwTm9kZSwgZUV2ZW50VHlwZSwgYklzRm9ybVJlYWR5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZWN1cnNpdmUsIHBFeGNsdWRlKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gKENYRkFfV2lkZ2V0QWNjKilwRm9ybU5vZGUtPkdldFdpZGdldERhdGEoKTsNCisgIGlmIChwV2lkZ2V0QWNjID09IE5VTEwpIHsNCisgICAgcmV0dXJuIGlSZXQ7DQorICB9DQorICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KKyAgZVBhcmFtLm1fZVR5cGUgPSBlRXZlbnRUeXBlOw0KKyAgZVBhcmFtLm1fcFRhcmdldCA9IHBXaWRnZXRBY2M7DQorICBlUGFyYW0ubV9iSXNGb3JtUmVhZHkgPSBiSXNGb3JtUmVhZHk7DQorICBpUmV0IHw9IFhGQV9Qcm9jZXNzRXZlbnQodGhpcywgcFdpZGdldEFjYywgJmVQYXJhbSk7DQorICByZXR1cm4gaVJldDsNCit9DQorQ1hGQV9GRldpZGdldCogQ1hGQV9GRkRvY1ZpZXc6OkdldFdpZGdldEJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRkZXaWRnZXQqIHBSZWZXaWRnZXQpIHsNCisgIENYRkFfV2lkZ2V0QWNjKiBwUmVmQWNjID0gcFJlZldpZGdldCA/IHBSZWZXaWRnZXQtPkdldERhdGFBY2MoKSA6IE5VTEw7DQorICBpZiAoQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBHZXRXaWRnZXRBY2NCeU5hbWUod3NOYW1lLCBwUmVmQWNjKSkgew0KKyAgICByZXR1cm4gcEFjYy0+R2V0TmV4dFdpZGdldChOVUxMKTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitDWEZBX1dpZGdldEFjYyogQ1hGQV9GRkRvY1ZpZXc6OkdldFdpZGdldEFjY0J5TmFtZSgNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsDQorICAgIENYRkFfV2lkZ2V0QWNjKiBwUmVmV2lkZ2V0QWNjKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb247DQorICBGWF9EV09SRCBkd1N0eWxlID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMgfA0KKyAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQ7DQorICBJWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gbV9wRG9jLT5HZXRYRkFEb2MoKS0+R2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgaWYgKCFwU2NyaXB0Q29udGV4dCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENYRkFfTm9kZSogcmVmTm9kZSA9IE5VTEw7DQorICBpZiAocFJlZldpZGdldEFjYyAhPSBOVUxMKSB7DQorICAgIHJlZk5vZGUgPSBwUmVmV2lkZ2V0QWNjLT5HZXROb2RlKCk7DQorICAgIHdzRXhwcmVzc2lvbiA9IHdzTmFtZTsNCisgIH0gZWxzZSB7DQorICAgIHdzRXhwcmVzc2lvbiA9IEwiJGZvcm0uIiArIHdzTmFtZTsNCisgIH0NCisgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvdmVOb2RlUlM7DQorICBpbnQzMl90IGlSZXQgPSBwU2NyaXB0Q29udGV4dC0+UmVzb2x2ZU9iamVjdHMocmVmTm9kZSwgd3NFeHByZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc292ZU5vZGVSUywgZHdTdHlsZSk7DQorICBpZiAoaVJldCA8IDEpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpZiAocmVzb3ZlTm9kZVJTLmR3RmxhZ3MgPT0gWEZBX1JFU09WRU5PREVfUlNUWVBFX05vZGVzKSB7DQorICAgIENYRkFfT2JqZWN0KiBwTm9kZSA9IHJlc292ZU5vZGVSUy5ub2Rlc1swXTsNCisgICAgaWYgKHBOb2RlLT5Jc05vZGUoKSkgew0KKyAgICAgIHJldHVybiAoQ1hGQV9XaWRnZXRBY2MqKSgoQ1hGQV9Ob2RlKilwTm9kZSktPkdldFdpZGdldERhdGEoKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6Ok9uUGFnZUV2ZW50KElYRkFfTGF5b3V0UGFnZSogcFNlbmRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUEFHRUVWRU5UIGVFdmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQYWdlSW5kZXgpIHsNCisgIEZYX0JPT0wgYk5vZmlmeSA9IG1faVN0YXR1cyA+PSBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRW5kOw0KKyAgQ1hGQV9GRlBhZ2VWaWV3KiBwRkZQYWdlVmlldyA9IHN0YXRpY19jYXN0PENYRkFfRkZQYWdlVmlldyo+KHBTZW5kZXIpOw0KKyAgaWYgKGVFdmVudCA9PSBYRkFfUEFHRUVWRU5UX1BhZ2VSZW1vdmVkKSB7DQorICAgIGlmIChiTm9maWZ5KSB7DQorICAgICAgbV9wRG9jLT5HZXREb2NQcm92aWRlcigpLT5QYWdlVmlld0V2ZW50KHBGRlBhZ2VWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUEFHRVZJRVdFVkVOVF9Qb3N0UmVtb3ZlZCk7DQorICAgIH0NCisgIH0gZWxzZSBpZiAoZUV2ZW50ID09IFhGQV9QQUdFRVZFTlRfUGFnZUFkZGVkKSB7DQorICAgIGlmIChiTm9maWZ5KSB7DQorICAgICAgbV9wRG9jLT5HZXREb2NQcm92aWRlcigpLT5QYWdlVmlld0V2ZW50KHBGRlBhZ2VWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUEFHRVZJRVdFVkVOVF9Qb3N0QWRkZWQpOw0KKyAgICAgIHBGRlBhZ2VWaWV3LT5Mb2FkUGFnZVZpZXcoKTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENYRkFfRkZEb2NWaWV3OjpMb2NrVXBkYXRlKCkgew0KKyAgbV9pTG9jaysrOw0KK30NCit2b2lkIENYRkFfRkZEb2NWaWV3OjpVbmxvY2tVcGRhdGUoKSB7DQorICBtX2lMb2NrLS07DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRvY1ZpZXc6OklzVXBkYXRlTG9ja2VkKCkgew0KKyAgcmV0dXJuIG1faUxvY2s7DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkNsZWFySW52YWxpZGF0ZUxpc3QoKSB7DQorICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwUGFnZUludmFsaWRhdGUuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBzKSB7DQorICAgIHZvaWQqIHBQYWdlVmlldyA9IE5VTEw7DQorICAgIENGWF9SZWN0RiogcFJlY3QgPSBOVUxMOw0KKyAgICBtX21hcFBhZ2VJbnZhbGlkYXRlLkdldE5leHRBc3NvYyhwcywgcFBhZ2VWaWV3LCAodm9pZComKXBSZWN0KTsNCisgICAgZGVsZXRlIHBSZWN0Ow0KKyAgfQ0KKyAgbV9tYXBQYWdlSW52YWxpZGF0ZS5SZW1vdmVBbGwoKTsNCit9DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6QWRkSW52YWxpZGF0ZVJlY3QoQ1hGQV9GRldpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0SW52YWxpZGF0ZSkgew0KKyAgQWRkSW52YWxpZGF0ZVJlY3QocFdpZGdldC0+R2V0UGFnZVZpZXcoKSwgcnRJbnZhbGlkYXRlKTsNCit9DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6QWRkSW52YWxpZGF0ZVJlY3QoSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRJbnZhbGlkYXRlKSB7DQorICBDRlhfUmVjdEYqIHBSZWN0ID0gKENGWF9SZWN0RiopbV9tYXBQYWdlSW52YWxpZGF0ZS5HZXRWYWx1ZUF0KHBQYWdlVmlldyk7DQorICBpZiAoIXBSZWN0KSB7DQorICAgIHBSZWN0ID0gbmV3IENGWF9SZWN0RjsNCisgICAgcFJlY3QtPlNldChydEludmFsaWRhdGUubGVmdCwgcnRJbnZhbGlkYXRlLnRvcCwgcnRJbnZhbGlkYXRlLndpZHRoLA0KKyAgICAgICAgICAgICAgIHJ0SW52YWxpZGF0ZS5oZWlnaHQpOw0KKyAgICBtX21hcFBhZ2VJbnZhbGlkYXRlLlNldEF0KHBQYWdlVmlldywgcFJlY3QpOw0KKyAgfSBlbHNlIHsNCisgICAgcFJlY3QtPlVuaW9uKHJ0SW52YWxpZGF0ZSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OlJ1bkludmFsaWRhdGUoKSB7DQorICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwUGFnZUludmFsaWRhdGUuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBzKSB7DQorICAgIElYRkFfUGFnZVZpZXcqIHBQYWdlVmlldyA9IE5VTEw7DQorICAgIENGWF9SZWN0RiogcFJlY3QgPSBOVUxMOw0KKyAgICBtX21hcFBhZ2VJbnZhbGlkYXRlLkdldE5leHRBc3NvYyhwcywgKHZvaWQqJilwUGFnZVZpZXcsICh2b2lkKiYpcFJlY3QpOw0KKyAgICBtX3BEb2MtPkdldERvY1Byb3ZpZGVyKCktPkludmFsaWRhdGVSZWN0KHBQYWdlVmlldywgKnBSZWN0KTsNCisgICAgZGVsZXRlIHBSZWN0Ow0KKyAgfQ0KKyAgbV9tYXBQYWdlSW52YWxpZGF0ZS5SZW1vdmVBbGwoKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRG9jVmlldzo6UnVuTGF5b3V0KCkgew0KKyAgTG9ja1VwZGF0ZSgpOw0KKyAgbV9iSW5MYXlvdXRTdGF0dXMgPSBUUlVFOw0KKyAgaWYgKCFtX3BYRkFEb2NMYXlvdXQtPkluY3JlbWVudExheW91dCgpICYmDQorICAgICAgbV9wWEZBRG9jTGF5b3V0LT5TdGFydExheW91dCgpIDwgMTAwKSB7DQorICAgIG1fcFhGQURvY0xheW91dC0+RG9MYXlvdXQoKTsNCisgICAgVW5sb2NrVXBkYXRlKCk7DQorICAgIG1fYkluTGF5b3V0U3RhdHVzID0gRkFMU0U7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgbV9iSW5MYXlvdXRTdGF0dXMgPSBGQUxTRTsNCisgIFVubG9ja1VwZGF0ZSgpOw0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkIENYRkFfRkZEb2NWaWV3OjpSdW5TdWJmb3JtSW5kZXhDaGFuZ2UoKSB7DQorICBpbnQzMl90IGlTdWJmb3JtcyA9IG1fSW5kZXhDaGFuZ2VkU3ViZm9ybXMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVN1YmZvcm1zOyBpKyspIHsNCisgICAgQ1hGQV9Ob2RlKiBwU3ViZm9ybU5vZGUgPSAoQ1hGQV9Ob2RlKiltX0luZGV4Q2hhbmdlZFN1YmZvcm1zW2ldOw0KKyAgICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IChDWEZBX1dpZGdldEFjYyopcFN1YmZvcm1Ob2RlLT5HZXRXaWRnZXREYXRhKCk7DQorICAgIGlmICghcFdpZGdldEFjYykgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQorICAgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX0luZGV4Q2hhbmdlOw0KKyAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gcFdpZGdldEFjYzsNCisgICAgcFdpZGdldEFjYy0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX0luZGV4Q2hhbmdlLCAmZVBhcmFtKTsNCisgIH0NCisgIG1fSW5kZXhDaGFuZ2VkU3ViZm9ybXMuUmVtb3ZlQWxsKCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkFkZE5ld0Zvcm1Ob2RlKENYRkFfTm9kZSogcE5vZGUpIHsNCisgIG1fTmV3QWRkZWROb2Rlcy5BZGQocE5vZGUpOw0KKyAgdGhpcy0+SW5pdExheW91dChwTm9kZSk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkFkZEluZGV4Q2hhbmdlZFN1YmZvcm0oQ1hGQV9Ob2RlKiBwTm9kZSkgew0KKyAgRlhTWVNfYXNzZXJ0KHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSk7DQorICBtX0luZGV4Q2hhbmdlZFN1YmZvcm1zLkFkZChwTm9kZSk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OlJ1bkRvY0Nsb3NlKCkgew0KKyAgQ1hGQV9Ob2RlKiBwUm9vdEl0ZW0gPQ0KKyAgICAgIChDWEZBX05vZGUqKW1fcERvYy0+R2V0WEZBRG9jKCktPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0Zvcm0pOw0KKyAgaWYgKCFwUm9vdEl0ZW0pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwUm9vdEl0ZW0sIFhGQV9FVkVOVF9Eb2NDbG9zZSk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkRlc3Ryb3lEb2NWaWV3KCkgew0KKyAgQ2xlYXJJbnZhbGlkYXRlTGlzdCgpOw0KKyAgbV9pU3RhdHVzID0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX05vbmU7DQorICBtX2lMb2NrID0gMDsNCisgIG1fVmFsaWRhdGVBY2NzLlJlbW92ZUFsbCgpOw0KKyAgbV9iaW5kSXRlbXMuUmVtb3ZlQWxsKCk7DQorICBtX0NhbGN1bGF0ZUFjY3MuUmVtb3ZlQWxsKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRvY1ZpZXc6OklzU3RhdGljTm90aWZ5KCkgew0KKyAgcmV0dXJuIG1fcERvYy0+R2V0RG9jVHlwZSgpID09IFhGQV9ET0NUWVBFX1N0YXRpYzsNCit9DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6QWRkQ2FsY3VsYXRlV2lkZ2V0QWNjKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjKSB7DQorICBpbnQzMl90IGlBY2NzID0gbV9DYWxjdWxhdGVBY2NzLkdldFNpemUoKTsNCisgIENYRkFfV2lkZ2V0QWNjKiBwQ3VycmVudEFjYyA9DQorICAgICAgKGlBY2NzIDwgMSkgPyAoQ1hGQV9XaWRnZXRBY2MqKU5VTEwNCisgICAgICAgICAgICAgICAgICA6IChDWEZBX1dpZGdldEFjYyopbV9DYWxjdWxhdGVBY2NzW2lBY2NzIC0gMV07DQorICBpZiAocEN1cnJlbnRBY2MgIT0gcFdpZGdldEFjYykgew0KKyAgICBtX0NhbGN1bGF0ZUFjY3MuQWRkKHBXaWRnZXRBY2MpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRkZEb2NWaWV3OjpBZGRDYWxjdWxhdGVOb2RlTm90aWZ5KENYRkFfTm9kZSogcE5vZGVDaGFuZ2UpIHsNCisgIENYRkFfQ2FsY0RhdGEqIHBHbG9iYWxEYXRhID0NCisgICAgICAoQ1hGQV9DYWxjRGF0YSopcE5vZGVDaGFuZ2UtPkdldFVzZXJEYXRhKFhGQV9DYWxjRGF0YSk7DQorICBpbnQzMl90IGlDb3VudCA9IHBHbG9iYWxEYXRhID8gcEdsb2JhbERhdGEtPm1fR2xvYmFscy5HZXRTaXplKCkgOiAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgQ1hGQV9XaWRnZXRBY2MqIHBSZXN1bHRBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXBHbG9iYWxEYXRhLT5tX0dsb2JhbHNbaV07DQorICAgIGlmIChwUmVzdWx0QWNjLT5HZXROb2RlKCktPkhhc0ZsYWcoWEZBX05PREVGTEFHX0hhc1JlbW92ZWQpKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaW50MzJfdCBpQWNjcyA9IG1fQ2FsY3VsYXRlQWNjcy5HZXRTaXplKCk7DQorICAgIENYRkFfV2lkZ2V0QWNjKiBwQ3VycmVudEFjYyA9DQorICAgICAgICAoaUFjY3MgPCAxKSA/IChDWEZBX1dpZGdldEFjYyopTlVMTA0KKyAgICAgICAgICAgICAgICAgICAgOiAoQ1hGQV9XaWRnZXRBY2MqKW1fQ2FsY3VsYXRlQWNjc1tpQWNjcyAtIDFdOw0KKyAgICBpZiAocEN1cnJlbnRBY2MgIT0gcFJlc3VsdEFjYykgew0KKyAgICAgIG1fQ2FsY3VsYXRlQWNjcy5BZGQocFJlc3VsdEFjYyk7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6UnVuQ2FsY3VsYXRlUmVjdXJzaXZlKGludDMyX3QmIGlJbmRleCkgew0KKyAgd2hpbGUgKGlJbmRleCA8IG1fQ2FsY3VsYXRlQWNjcy5HZXRTaXplKCkpIHsNCisgICAgQ1hGQV9XaWRnZXRBY2MqIHBDdXJBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKW1fQ2FsY3VsYXRlQWNjc1tpSW5kZXhdOw0KKyAgICBBZGRDYWxjdWxhdGVOb2RlTm90aWZ5KHBDdXJBY2MtPkdldE5vZGUoKSk7DQorICAgIGludDMyX3QgaVJlZkNvdW50ID0NCisgICAgICAgIChpbnQzMl90KSh1aW50cHRyX3QpcEN1ckFjYy0+R2V0Tm9kZSgpLT5HZXRVc2VyRGF0YShYRkFfQ2FsY1JlZkNvdW50KTsNCisgICAgaVJlZkNvdW50Kys7DQorICAgIHBDdXJBY2MtPkdldE5vZGUoKS0+U2V0VXNlckRhdGEoWEZBX0NhbGNSZWZDb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopKHVpbnRwdHJfdClpUmVmQ291bnQpOw0KKyAgICBpZiAoaVJlZkNvdW50ID4gMTEpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoKHBDdXJBY2MtPlByb2Nlc3NDYWxjdWxhdGUoKSkgPT0gWEZBX0VWRU5URVJST1JfU3VjZXNzKSB7DQorICAgICAgQWRkVmFsaWRhdGVXaWRnZXQocEN1ckFjYyk7DQorICAgIH0NCisgICAgaUluZGV4Kys7DQorICAgIFJ1bkNhbGN1bGF0ZVJlY3Vyc2l2ZShpSW5kZXgpOw0KKyAgfQ0KK30NCitpbnQzMl90IENYRkFfRkZEb2NWaWV3OjpSdW5DYWxjdWxhdGVXaWRnZXRzKCkgew0KKyAgaWYgKCFtX3BEb2MtPkdldERvY1Byb3ZpZGVyKCktPklzQ2FsY3VsYXRpb25zRW5hYmxlZChtX3BEb2MpKSB7DQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9EaXNhYmxlZDsNCisgIH0NCisgIGludDMyX3QgaUNvdW50cyA9IG1fQ2FsY3VsYXRlQWNjcy5HZXRTaXplKCk7DQorICBpbnQzMl90IGlJbmRleCA9IDA7DQorICBpZiAoaUNvdW50cyA+IDApIHsNCisgICAgUnVuQ2FsY3VsYXRlUmVjdXJzaXZlKGlJbmRleCk7DQorICB9DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX0NhbGN1bGF0ZUFjY3MuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgQ1hGQV9XaWRnZXRBY2MqIHBDdXJBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKW1fQ2FsY3VsYXRlQWNjc1tpXTsNCisgICAgcEN1ckFjYy0+R2V0Tm9kZSgpLT5TZXRVc2VyRGF0YShYRkFfQ2FsY1JlZkNvdW50LCAodm9pZCopKHVpbnRwdHJfdCkwKTsNCisgIH0NCisgIG1fQ2FsY3VsYXRlQWNjcy5SZW1vdmVBbGwoKTsNCisgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkFkZFZhbGlkYXRlV2lkZ2V0KENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0KSB7DQorICBpZiAobV9WYWxpZGF0ZUFjY3MuRmluZChwV2lkZ2V0KSA8IDApIHsNCisgICAgbV9WYWxpZGF0ZUFjY3MuQWRkKHBXaWRnZXQpOw0KKyAgfQ0KK30NCitGWF9CT09MIENYRkFfRkZEb2NWaWV3OjpJbml0Q2FsY3VsYXRlKENYRkFfTm9kZSogcE5vZGUpIHsNCisgIEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocE5vZGUsIFhGQV9FVkVOVF9Jbml0Q2FsY3VsYXRlKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRkZEb2NWaWV3OjpJbml0VmFsaWRhdGUoQ1hGQV9Ob2RlKiBwTm9kZSkgew0KKyAgaWYgKCFtX3BEb2MtPkdldERvY1Byb3ZpZGVyKCktPklzVmFsaWRhdGlvbnNFbmFibGVkKG1fcERvYykpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwTm9kZSwgWEZBX0VWRU5UX1ZhbGlkYXRlKTsNCisgIG1fVmFsaWRhdGVBY2NzLlJlbW92ZUFsbCgpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRvY1ZpZXc6OlJ1blZhbGlkYXRlKCkgew0KKyAgaWYgKCFtX3BEb2MtPkdldERvY1Byb3ZpZGVyKCktPklzVmFsaWRhdGlvbnNFbmFibGVkKG1fcERvYykpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaW50MzJfdCBpQ291bnRzID0gbV9WYWxpZGF0ZUFjY3MuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50czsgaSsrKSB7DQorICAgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gKENYRkFfV2lkZ2V0QWNjKiltX1ZhbGlkYXRlQWNjc1tpXTsNCisgICAgaWYgKHBBY2MtPkdldE5vZGUoKS0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfSGFzUmVtb3ZlZCkpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBwQWNjLT5Qcm9jZXNzVmFsaWRhdGUoKTsNCisgIH0NCisgIG1fVmFsaWRhdGVBY2NzLlJlbW92ZUFsbCgpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRvY1ZpZXc6OlJ1bkV2ZW50TGF5b3V0UmVhZHkoKSB7DQorICBDWEZBX05vZGUqIHBSb290SXRlbSA9DQorICAgICAgKENYRkFfTm9kZSopbV9wRG9jLT5HZXRYRkFEb2MoKS0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRm9ybSk7DQorICBpZiAoIXBSb290SXRlbSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KHBSb290SXRlbSwgWEZBX0VWRU5UX1JlYWR5KTsNCisgIFJ1bkxheW91dCgpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OlJ1bkJpbmRJdGVtcygpIHsNCisgIGludDMyX3QgaUNvdW50ID0gbV9iaW5kSXRlbXMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgaWYgKCgoQ1hGQV9Ob2RlKiltX2JpbmRJdGVtc1tpXSktPkhhc0ZsYWcoWEZBX05PREVGTEFHX0hhc1JlbW92ZWQpKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwV2lkZ2V0Tm9kZSA9DQorICAgICAgICAoKENYRkFfTm9kZSopbV9iaW5kSXRlbXNbaV0pLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXBXaWRnZXROb2RlLT5HZXRXaWRnZXREYXRhKCk7DQorICAgIGlmICghcEFjYykgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIENYRkFfQmluZEl0ZW1zIGJpbmRpdGVtcygoQ1hGQV9Ob2RlKiltX2JpbmRJdGVtc1tpXSk7DQorICAgIElYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPQ0KKyAgICAgICAgcFdpZGdldE5vZGUtPkdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzUmVmOw0KKyAgICBiaW5kaXRlbXMuR2V0UmVmKHdzUmVmKTsNCisgICAgRlhfRFdPUkQgZHdTdHlsZSA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzIHwNCisgICAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX0FMTDsNCisgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJzOw0KKyAgICBwU2NyaXB0Q29udGV4dC0+UmVzb2x2ZU9iamVjdHMocFdpZGdldE5vZGUsIHdzUmVmLCBycywgZHdTdHlsZSk7DQorICAgIGludDMyX3QgaUNvdW50ID0gcnMubm9kZXMuR2V0U2l6ZSgpOw0KKyAgICBwQWNjLT5EZWxldGVJdGVtKC0xKTsNCisgICAgaWYgKHJzLmR3RmxhZ3MgIT0gWEZBX1JFU09WRU5PREVfUlNUWVBFX05vZGVzIHx8IGlDb3VudCA8IDEpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZ0Mgd3NWYWx1ZVJlZiwgd3NMYWJlbFJlZjsNCisgICAgYmluZGl0ZW1zLkdldFZhbHVlUmVmKHdzVmFsdWVSZWYpOw0KKyAgICBiaW5kaXRlbXMuR2V0TGFiZWxSZWYod3NMYWJlbFJlZik7DQorICAgIEZYX0JPT0wgYlVzZVZhbHVlID0gd3NMYWJlbFJlZi5Jc0VtcHR5KCkgfHwgd3NMYWJlbFJlZiA9PSB3c1ZhbHVlUmVmOw0KKyAgICBGWF9CT09MIGJMYWJlbFVzZUNvbnRlbnQgPQ0KKyAgICAgICAgd3NMYWJlbFJlZi5Jc0VtcHR5KCkgfHwgd3NMYWJlbFJlZiA9PSBGWF9XU1RSQyhMIiQiKTsNCisgICAgRlhfQk9PTCBiVmFsdWVVc2VDb250ZW50ID0NCisgICAgICAgIHdzVmFsdWVSZWYuSXNFbXB0eSgpIHx8IHdzVmFsdWVSZWYgPT0gRlhfV1NUUkMoTCIkIik7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUsIHdzTGFiZWw7DQorICAgIEZYX0RXT1JEIHVWYWx1ZUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VyhDRlhfV2lkZVN0cmluZyh3c1ZhbHVlUmVmKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzVmFsdWVSZWYuR2V0TGVuZ3RoKCkpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgIENYRkFfT2JqZWN0KiByZWZPYmogPSBycy5ub2Rlc1tpXTsNCisgICAgICBpZiAoIXJlZk9iai0+SXNOb2RlKCkpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBDWEZBX05vZGUqIHJlZk5vZGUgPSAoQ1hGQV9Ob2RlKilyZWZPYmo7DQorICAgICAgaWYgKGJWYWx1ZVVzZUNvbnRlbnQpIHsNCisgICAgICAgIHdzVmFsdWUgPSByZWZOb2RlLT5HZXRDb250ZW50KCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfTm9kZSogbm9kZVZhbHVlID0gcmVmTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5TmFtZSh1VmFsdWVIYXNoKTsNCisgICAgICAgIGlmIChub2RlVmFsdWUgPT0gTlVMTCkgew0KKyAgICAgICAgICB3c1ZhbHVlID0gcmVmTm9kZS0+R2V0Q29udGVudCgpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgd3NWYWx1ZSA9IG5vZGVWYWx1ZS0+R2V0Q29udGVudCgpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoIWJVc2VWYWx1ZSkgew0KKyAgICAgICAgaWYgKGJMYWJlbFVzZUNvbnRlbnQpIHsNCisgICAgICAgICAgd3NMYWJlbCA9IHJlZk5vZGUtPkdldENvbnRlbnQoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIENYRkFfTm9kZSogbm9kZUxhYmVsID0gcmVmTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5TmFtZSh3c0xhYmVsUmVmKTsNCisgICAgICAgICAgaWYgKG5vZGVMYWJlbCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgd3NMYWJlbCA9IG5vZGVMYWJlbC0+R2V0Q29udGVudCgpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHdzTGFiZWwgPSB3c1ZhbHVlOw0KKyAgICAgIH0NCisgICAgICBwQWNjLT5JbnNlcnRJdGVtKHdzTGFiZWwsIHdzVmFsdWUpOw0KKyAgICB9DQorICB9DQorICBtX2JpbmRJdGVtcy5SZW1vdmVBbGwoKTsNCit9DQordm9pZCBDWEZBX0ZGRG9jVmlldzo6U2V0Q2hhbmdlTWFyaygpIHsNCisgIGlmIChtX2lTdGF0dXMgPCBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRW5kKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIG1fcERvYy0+R2V0RG9jUHJvdmlkZXIoKS0+U2V0Q2hhbmdlTWFyayhtX3BEb2MpOw0KK30NCitDWEZBX05vZGUqIENYRkFfRkZEb2NWaWV3OjpHZXRSb290U3ViZm9ybSgpIHsNCisgIENYRkFfTm9kZSogcEZvcm1QYWNrZXROb2RlID0NCisgICAgICAoQ1hGQV9Ob2RlKiltX3BEb2MtPkdldFhGQURvYygpLT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKTsNCisgIGlmICghcEZvcm1QYWNrZXROb2RlKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIHBGb3JtUGFja2V0Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfU3ViZm9ybSk7DQorfQ0KK0NYRkFfRkZEb2NXaWRnZXRJdGVyYXRvcjo6Q1hGQV9GRkRvY1dpZGdldEl0ZXJhdG9yKENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBUcmF2ZWxSb290KQ0KKyAgICA6IG1fQ29udGVudEl0ZXJhdG9yKHBUcmF2ZWxSb290KSB7DQorICBtX3BEb2NWaWV3ID0gcERvY1ZpZXc7DQorICBtX3BDdXJXaWRnZXQgPSBOVUxMOw0KK30NCitDWEZBX0ZGRG9jV2lkZ2V0SXRlcmF0b3I6On5DWEZBX0ZGRG9jV2lkZ2V0SXRlcmF0b3IoKSB7fQ0KK3ZvaWQgQ1hGQV9GRkRvY1dpZGdldEl0ZXJhdG9yOjpSZXNldCgpIHsNCisgIG1fQ29udGVudEl0ZXJhdG9yLlJlc2V0KCk7DQorICBtX3BDdXJXaWRnZXQgPSBOVUxMOw0KK30NCitJWEZBX1dpZGdldCogQ1hGQV9GRkRvY1dpZGdldEl0ZXJhdG9yOjpNb3ZlVG9GaXJzdCgpIHsNCisgIHJldHVybiBOVUxMOw0KK30NCitJWEZBX1dpZGdldCogQ1hGQV9GRkRvY1dpZGdldEl0ZXJhdG9yOjpNb3ZlVG9MYXN0KCkgew0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0lYRkFfV2lkZ2V0KiBDWEZBX0ZGRG9jV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb05leHQoKSB7DQorICBDWEZBX05vZGUqIHBJdGVtID0gbV9wQ3VyV2lkZ2V0ID8gbV9Db250ZW50SXRlcmF0b3IuTW92ZVRvTmV4dCgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbV9Db250ZW50SXRlcmF0b3IuR2V0Q3VycmVudCgpOw0KKyAgd2hpbGUgKHBJdGVtKSB7DQorICAgIGlmIChDWEZBX1dpZGdldEFjYyogcEFjYyA9IChDWEZBX1dpZGdldEFjYyopcEl0ZW0tPkdldFdpZGdldERhdGEoKSkgew0KKyAgICAgIHdoaWxlICgobV9wQ3VyV2lkZ2V0ID0gcEFjYy0+R2V0TmV4dFdpZGdldChOVUxMKSkgIT0gTlVMTCkgew0KKyAgICAgICAgaWYgKCFtX3BDdXJXaWRnZXQtPklzTG9hZGVkKCkgJiYNCisgICAgICAgICAgICAobV9wQ3VyV2lkZ2V0LT5HZXRTdGF0dXMoKSAmIFhGQV9XSURHRVRTVEFUVVNfVmlzaWJsZSkpIHsNCisgICAgICAgICAgbV9wQ3VyV2lkZ2V0LT5Mb2FkV2lkZ2V0KCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gbV9wQ3VyV2lkZ2V0Ow0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBwSXRlbSA9IG1fQ29udGVudEl0ZXJhdG9yLk1vdmVUb05leHQoKTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitJWEZBX1dpZGdldCogQ1hGQV9GRkRvY1dpZGdldEl0ZXJhdG9yOjpNb3ZlVG9QcmV2aW91cygpIHsNCisgIHJldHVybiBOVUxMOw0KK30NCitJWEZBX1dpZGdldCogQ1hGQV9GRkRvY1dpZGdldEl0ZXJhdG9yOjpHZXRDdXJyZW50V2lkZ2V0KCkgew0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRvY1dpZGdldEl0ZXJhdG9yOjpTZXRDdXJyZW50V2lkZ2V0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0lYRkFfV2lkZ2V0QWNjSXRlcmF0b3IqIFhGQV9XaWRnZXRBY2NJdGVyYXRvcl9DcmVhdGUoDQorICAgIENYRkFfV2lkZ2V0QWNjKiBwVHJhdmVsUm9vdCwNCisgICAgWEZBX1dJREdFVE9SREVSIGVPcmRlcikgew0KKyAgaWYgKCFwVHJhdmVsUm9vdCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBuZXcgQ1hGQV9XaWRnZXRBY2NJdGVyYXRvcihwVHJhdmVsUm9vdC0+R2V0RG9jVmlldygpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmF2ZWxSb290LT5HZXROb2RlKCkpOw0KK30NCitDWEZBX1dpZGdldEFjY0l0ZXJhdG9yOjpDWEZBX1dpZGdldEFjY0l0ZXJhdG9yKENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFRyYXZlbFJvb3QpDQorICAgIDogbV9Db250ZW50SXRlcmF0b3IocFRyYXZlbFJvb3QpIHsNCisgIG1fcERvY1ZpZXcgPSBwRG9jVmlldzsNCisgIG1fcEN1cldpZGdldEFjYyA9IE5VTEw7DQorfQ0KK0NYRkFfV2lkZ2V0QWNjSXRlcmF0b3I6On5DWEZBX1dpZGdldEFjY0l0ZXJhdG9yKCkge30NCit2b2lkIENYRkFfV2lkZ2V0QWNjSXRlcmF0b3I6OlJlc2V0KCkgew0KKyAgbV9wQ3VyV2lkZ2V0QWNjID0gTlVMTDsNCisgIG1fQ29udGVudEl0ZXJhdG9yLlJlc2V0KCk7DQorfQ0KK0NYRkFfV2lkZ2V0QWNjKiBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yOjpNb3ZlVG9GaXJzdCgpIHsNCisgIHJldHVybiBOVUxMOw0KK30NCitDWEZBX1dpZGdldEFjYyogQ1hGQV9XaWRnZXRBY2NJdGVyYXRvcjo6TW92ZVRvTGFzdCgpIHsNCisgIHJldHVybiBOVUxMOw0KK30NCitDWEZBX1dpZGdldEFjYyogQ1hGQV9XaWRnZXRBY2NJdGVyYXRvcjo6TW92ZVRvTmV4dCgpIHsNCisgIENYRkFfTm9kZSogcEl0ZW0gPSBtX3BDdXJXaWRnZXRBY2MgPyBtX0NvbnRlbnRJdGVyYXRvci5Nb3ZlVG9OZXh0KCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX0NvbnRlbnRJdGVyYXRvci5HZXRDdXJyZW50KCk7DQorICB3aGlsZSAocEl0ZW0pIHsNCisgICAgaWYgKChtX3BDdXJXaWRnZXRBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXBJdGVtLT5HZXRXaWRnZXREYXRhKCkpICE9IE5VTEwpIHsNCisgICAgICByZXR1cm4gbV9wQ3VyV2lkZ2V0QWNjOw0KKyAgICB9DQorICAgIHBJdGVtID0gbV9Db250ZW50SXRlcmF0b3IuTW92ZVRvTmV4dCgpOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0NYRkFfV2lkZ2V0QWNjKiBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yOjpNb3ZlVG9QcmV2aW91cygpIHsNCisgIHJldHVybiBOVUxMOw0KK30NCitDWEZBX1dpZGdldEFjYyogQ1hGQV9XaWRnZXRBY2NJdGVyYXRvcjo6R2V0Q3VycmVudFdpZGdldEFjYygpIHsNCisgIHJldHVybiBOVUxMOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0QWNjSXRlcmF0b3I6OlNldEN1cnJlbnRXaWRnZXRBY2MoQ1hGQV9XaWRnZXRBY2MqIGhXaWRnZXQpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yOjpTa2lwVHJlZSgpIHsNCisgIG1fQ29udGVudEl0ZXJhdG9yLlNraXBDaGlsZHJlbkFuZE1vdmVUb05leHQoKTsNCisgIG1fcEN1cldpZGdldEFjYyA9IE5VTEw7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvY3ZpZXcuaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmRvY3ZpZXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTAxMDRkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZG9jdmlldy5oCkBAIC0wLDAgKzEsMTcyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgRlhGQV9TUkNfQVBQX1hGQV9GRkRPQ1ZJRVdfSF8NCisjZGVmaW5lIEZYRkFfU1JDX0FQUF9YRkFfRkZET0NWSUVXX0hfDQorDQorI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KKw0KK2NsYXNzIENYRkFfRkZQYWdlVmlldzsNCitjbGFzcyBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjsNCitjbGFzcyBDWEZBX0ZGRG9jOw0KK2NsYXNzIENYRkFfRkZXaWRnZXQ7DQorZXh0ZXJuIGNvbnN0IFhGQV9BVFRSSUJVVEVFTlVNIGdzX0V2ZW50QWN0aXZpdHlbXTsNCitlbnVtIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVUyB7DQorICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfTm9uZSwNCisgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19TdGFydCwNCisgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19Gb3JtSW5pdGlhbGl6ZSwNCisgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19Gb3JtSW5pdENhbGN1bGF0ZSwNCisgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19Gb3JtSW5pdFZhbGlkYXRlLA0KKyAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0Zvcm1Gb3JtUmVhZHksDQorICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRG9pbmcsDQorICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfUGFnZXNldEluaXRpYWxpemUsDQorICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfUGFnZXNldEluaXRDYWxjdWxhdGUsDQorICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfUGFnZXNldEluaXRWYWxpZGF0ZSwNCisgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19QYWdlc2V0Rm9ybVJlYWR5LA0KKyAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0xheW91dFJlYWR5LA0KKyAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0RvY1JlYWR5LA0KKyAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0VuZCwNCisgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19OZXh0LA0KK307DQorY2xhc3MgQ1hGQV9GRkRvY1ZpZXcgOiBwdWJsaWMgSVhGQV9Eb2NWaWV3IHsNCisgcHVibGljOg0KKyAgQ1hGQV9GRkRvY1ZpZXcoQ1hGQV9GRkRvYyogcERvYyk7DQorICB+Q1hGQV9GRkRvY1ZpZXcoKTsNCisNCisgIHZpcnR1YWwgSVhGQV9Eb2MqIEdldERvYygpIHsgcmV0dXJuIG1fcERvYzsgfQ0KKyAgdmlydHVhbCBpbnQzMl90IFN0YXJ0TGF5b3V0KGludDMyX3QgaVN0YXJ0UGFnZSA9IDApOw0KKyAgdmlydHVhbCBpbnQzMl90IERvTGF5b3V0KElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCk7DQorICB2aXJ0dWFsIHZvaWQgU3RvcExheW91dCgpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldExheW91dFN0YXR1cygpOw0KKyAgdmlydHVhbCB2b2lkIFVwZGF0ZURvY1ZpZXcoKTsNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudFBhZ2VWaWV3cygpOw0KKyAgdmlydHVhbCBJWEZBX1BhZ2VWaWV3KiBHZXRQYWdlVmlldyhpbnQzMl90IG5JbmRleCk7DQorICB2aXJ0dWFsIElYRkFfV2lkZ2V0KiBHZXRXaWRnZXRCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpOw0KKyAgdmlydHVhbCBDWEZBX1dpZGdldEFjYyogR2V0V2lkZ2V0QWNjQnlOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKTsNCisgIHZpcnR1YWwgdm9pZCBSZXNldFdpZGdldERhdGEoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBOVUxMKTsNCisgIHZpcnR1YWwgaW50MzJfdCBQcm9jZXNzV2lkZ2V0RXZlbnQoQ1hGQV9FdmVudFBhcmFtKiBwUGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gTlVMTCk7DQorICB2aXJ0dWFsIElYRkFfV2lkZ2V0SGFuZGxlciogR2V0V2lkZ2V0SGFuZGxlcigpOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldEl0ZXJhdG9yKiBDcmVhdGVXaWRnZXRJdGVyYXRvcigpOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldEFjY0l0ZXJhdG9yKiBDcmVhdGVXaWRnZXRBY2NJdGVyYXRvcigNCisgICAgICBYRkFfV0lER0VUT1JERVIgZU9yZGVyID0gWEZBX1dJREdFVE9SREVSX1ByZU9yZGVyKTsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIEdldEZvY3VzV2lkZ2V0KCk7DQorICB2aXJ0dWFsIHZvaWQgS2lsbEZvY3VzKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Rm9jdXMoSVhGQV9XaWRnZXQqIGhXaWRnZXQpOw0KKyAgQ1hGQV9GRldpZGdldCogR2V0V2lkZ2V0QnlOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRkZXaWRnZXQqIHBSZWZXaWRnZXQgPSBOVUxMKTsNCisgIENYRkFfV2lkZ2V0QWNjKiBHZXRXaWRnZXRBY2NCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwUmVmV2lkZ2V0QWNjID0gTlVMTCk7DQorICBJWEZBX0RvY0xheW91dCogR2V0WEZBTGF5b3V0KCkgY29uc3Q7DQorICB2b2lkIE9uUGFnZUV2ZW50KElYRkFfTGF5b3V0UGFnZSogcFNlbmRlciwNCisgICAgICAgICAgICAgICAgICAgWEZBX1BBR0VFVkVOVCBlRXZlbnQsDQorICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVBhZ2VJbmRleCk7DQorICB2b2lkIExvY2tVcGRhdGUoKTsNCisgIHZvaWQgVW5sb2NrVXBkYXRlKCk7DQorICBGWF9CT09MIElzVXBkYXRlTG9ja2VkKCk7DQorICB2b2lkIENsZWFySW52YWxpZGF0ZUxpc3QoKTsNCisgIHZvaWQgQWRkSW52YWxpZGF0ZVJlY3QoQ1hGQV9GRldpZGdldCogcFdpZGdldCwgY29uc3QgQ0ZYX1JlY3RGJiBydEludmFsaWRhdGUpOw0KKyAgdm9pZCBBZGRJbnZhbGlkYXRlUmVjdChJWEZBX1BhZ2VWaWV3KiBwUGFnZVZpZXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRJbnZhbGlkYXRlKTsNCisgIHZvaWQgUnVuSW52YWxpZGF0ZSgpOw0KKyAgdm9pZCBSdW5Eb2NDbG9zZSgpOw0KKyAgdm9pZCBEZXN0cm95RG9jVmlldygpOw0KKw0KKyAgRlhfQk9PTCBJbml0VmFsaWRhdGUoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICBGWF9CT09MIFJ1blZhbGlkYXRlKCk7DQorDQorICB2b2lkIFNldENoYW5nZU1hcmsoKTsNCisNCisgIHZvaWQgQWRkVmFsaWRhdGVXaWRnZXQoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXQpOw0KKyAgdm9pZCBBZGRDYWxjdWxhdGVOb2RlTm90aWZ5KENYRkFfTm9kZSogcE5vZGVDaGFuZ2UpOw0KKyAgdm9pZCBBZGRDYWxjdWxhdGVXaWRnZXRBY2MoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MpOw0KKyAgaW50MzJfdCBSdW5DYWxjdWxhdGVXaWRnZXRzKCk7DQorICBGWF9CT09MIElzU3RhdGljTm90aWZ5KCk7DQorICBGWF9CT09MIFJ1bkxheW91dCgpOw0KKyAgdm9pZCBSdW5TdWJmb3JtSW5kZXhDaGFuZ2UoKTsNCisgIHZvaWQgQWRkTmV3Rm9ybU5vZGUoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICB2b2lkIEFkZEluZGV4Q2hhbmdlZFN1YmZvcm0oQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICBDWEZBX1dpZGdldEFjYyogR2V0Rm9jdXNXaWRnZXRBY2MoKTsNCisgIHZvaWQgU2V0Rm9jdXNXaWRnZXRBY2MoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MpOw0KKyAgdm9pZCBEZWxldGVMYXlvdXRJdGVtKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQpOw0KKyAgaW50MzJfdCBFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KENYRkFfTm9kZSogcEZvcm1Ob2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FVkVOVFRZUEUgZUV2ZW50VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJc0Zvcm1SZWFkeSA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlY3Vyc2l2ZSA9IFRSVUUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRXhjbHVkZSA9IE5VTEwpOw0KKyAgRlhfQk9PTCBtX2JMYXlvdXRFdmVudDsNCisgIENGWF9XaWRlU3RyaW5nQXJyYXkgbV9hcnJOdWxsVGVzdE1zZzsNCisgIENYRkFfRkZXaWRnZXQqIG1fcExpc3RGb2N1c1dpZGdldDsNCisgIEZYX0JPT0wgbV9iSW5MYXlvdXRTdGF0dXM7DQorDQorIHByb3RlY3RlZDoNCisgIEZYX0JPT0wgUnVuRXZlbnRMYXlvdXRSZWFkeSgpOw0KKyAgdm9pZCBSdW5CaW5kSXRlbXMoKTsNCisgIEZYX0JPT0wgSW5pdENhbGN1bGF0ZShDWEZBX05vZGUqIHBOb2RlKTsNCisgIHZvaWQgSW5pdExheW91dChDWEZBX05vZGUqIHBOb2RlKTsNCisgIHZvaWQgUnVuQ2FsY3VsYXRlUmVjdXJzaXZlKGludDMyX3QmIGlJbmRleCk7DQorICB2b2lkIFNob3dOdWxsVGVzdE1zZygpOw0KKyAgRlhfQk9PTCBSZXNldFNpbmdsZVdpZGdldEFjY0RhdGEoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MpOw0KKyAgQ1hGQV9Ob2RlKiBHZXRSb290U3ViZm9ybSgpOw0KKw0KKyAgQ1hGQV9GRkRvYyogbV9wRG9jOw0KKyAgQ1hGQV9GRldpZGdldEhhbmRsZXIqIG1fcFdpZGdldEhhbmRsZXI7DQorICBJWEZBX0RvY0xheW91dCogbV9wWEZBRG9jTGF5b3V0Ow0KKyAgQ1hGQV9XaWRnZXRBY2MqIG1fcEZvY3VzQWNjOw0KKyAgQ1hGQV9GRldpZGdldCogbV9wRm9jdXNXaWRnZXQ7DQorICBDWEZBX0ZGV2lkZ2V0KiBtX3BPbGRGb2N1c1dpZGdldDsNCisgIENGWF9NYXBQdHJUb1B0ciBtX21hcFBhZ2VJbnZhbGlkYXRlOw0KKyAgQ0ZYX1B0ckFycmF5IG1fVmFsaWRhdGVBY2NzOw0KKyAgQ0ZYX1B0ckFycmF5IG1fYmluZEl0ZW1zOw0KKyAgQ0ZYX1B0ckFycmF5IG1fQ2FsY3VsYXRlQWNjczsNCisNCisgIENGWF9QdHJBcnJheSBtX05ld0FkZGVkTm9kZXM7DQorICBDRlhfUHRyQXJyYXkgbV9JbmRleENoYW5nZWRTdWJmb3JtczsNCisgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVUyBtX2lTdGF0dXM7DQorICBpbnQzMl90IG1faUxvY2s7DQorICBmcmllbmQgY2xhc3MgQ1hGQV9GRk5vdGlmeTsNCit9Ow0KK2NsYXNzIENYRkFfRkZEb2NXaWRnZXRJdGVyYXRvciA6IHB1YmxpYyBJWEZBX1dpZGdldEl0ZXJhdG9yIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GRkRvY1dpZGdldEl0ZXJhdG9yKENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldywgQ1hGQV9Ob2RlKiBwVHJhdmVsUm9vdCk7DQorICB2aXJ0dWFsIH5DWEZBX0ZGRG9jV2lkZ2V0SXRlcmF0b3IoKTsNCisNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKw0KKyAgdmlydHVhbCB2b2lkIFJlc2V0KCk7DQorICB2aXJ0dWFsIElYRkFfV2lkZ2V0KiBNb3ZlVG9GaXJzdCgpOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldCogTW92ZVRvTGFzdCgpOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldCogTW92ZVRvTmV4dCgpOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldCogTW92ZVRvUHJldmlvdXMoKTsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIEdldEN1cnJlbnRXaWRnZXQoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBTZXRDdXJyZW50V2lkZ2V0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ1hGQV9Db250YWluZXJJdGVyYXRvciBtX0NvbnRlbnRJdGVyYXRvcjsNCisgIENYRkFfRkZEb2NWaWV3KiBtX3BEb2NWaWV3Ow0KKyAgQ1hGQV9GRldpZGdldCogbV9wQ3VyV2lkZ2V0Ow0KK307DQorY2xhc3MgQ1hGQV9XaWRnZXRBY2NJdGVyYXRvciA6IHB1YmxpYyBJWEZBX1dpZGdldEFjY0l0ZXJhdG9yIHsNCisgcHVibGljOg0KKyAgQ1hGQV9XaWRnZXRBY2NJdGVyYXRvcihDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcsIENYRkFfTm9kZSogcFRyYXZlbFJvb3QpOw0KKyAgdmlydHVhbCB+Q1hGQV9XaWRnZXRBY2NJdGVyYXRvcigpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICB2aXJ0dWFsIHZvaWQgUmVzZXQoKTsNCisgIHZpcnR1YWwgQ1hGQV9XaWRnZXRBY2MqIE1vdmVUb0ZpcnN0KCk7DQorICB2aXJ0dWFsIENYRkFfV2lkZ2V0QWNjKiBNb3ZlVG9MYXN0KCk7DQorICB2aXJ0dWFsIENYRkFfV2lkZ2V0QWNjKiBNb3ZlVG9OZXh0KCk7DQorICB2aXJ0dWFsIENYRkFfV2lkZ2V0QWNjKiBNb3ZlVG9QcmV2aW91cygpOw0KKyAgdmlydHVhbCBDWEZBX1dpZGdldEFjYyogR2V0Q3VycmVudFdpZGdldEFjYygpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNldEN1cnJlbnRXaWRnZXRBY2MoQ1hGQV9XaWRnZXRBY2MqIGhXaWRnZXQpOw0KKyAgdmlydHVhbCB2b2lkIFNraXBUcmVlKCk7DQorDQorIHByb3RlY3RlZDoNCisgIENYRkFfQ29udGFpbmVySXRlcmF0b3IgbV9Db250ZW50SXRlcmF0b3I7DQorICBDWEZBX0ZGRG9jVmlldyogbV9wRG9jVmlldzsNCisgIENYRkFfV2lkZ2V0QWNjKiBtX3BDdXJXaWRnZXRBY2M7DQorfTsNCisNCisjZW5kaWYgIC8vIEZYRkFfU1JDX0FQUF9YRkFfRkZET0NWSUVXX0hfDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZHJhdy5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkcmF3LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjQxYjE4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZHJhdy5jcHAKQEAgLTAsMCArMSwxNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfY29tbW9uLmgiDQorI2luY2x1ZGUgInhmYV9mZndpZGdldC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkcmF3LmgiDQorI2luY2x1ZGUgInhmYV9mZnBhZ2V2aWV3LmgiDQorI2luY2x1ZGUgInhmYV9mZmFwcC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2MuaCINCitDWEZBX0ZGRHJhdzo6Q1hGQV9GRkRyYXcoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCisgICAgOiBDWEZBX0ZGV2lkZ2V0KHBQYWdlVmlldywgcERhdGFBY2MpIHt9DQorQ1hGQV9GRkRyYXc6On5DWEZBX0ZGRHJhdygpIHt9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZHJhdy5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZHJhdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMzQ5NDgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZkcmF3LmgKQEAgLTAsMCArMSwxNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWEZBX0ZPUk1GSUxMRVJfRFJBV19JTVBfSA0KKyNkZWZpbmUgX0ZYRkFfRk9STUZJTExFUl9EUkFXX0lNUF9IDQorY2xhc3MgQ1hGQV9GRkRyYXcgOiBwdWJsaWMgQ1hGQV9GRldpZGdldCB7DQorIHB1YmxpYzoNCisgIENYRkFfRkZEcmF3KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgdmlydHVhbCB+Q1hGQV9GRkRyYXcoKTsNCisNCisgcHJvdGVjdGVkOg0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZXhjbGdyb3VwLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmV4Y2xncm91cC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ1N2U0YQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmV4Y2xncm91cC5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfY29tbW9uLmgiDQorI2luY2x1ZGUgInhmYV9mZndpZGdldC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZleGNsZ3JvdXAuaCINCisjaW5jbHVkZSAieGZhX2ZmcGFnZXZpZXcuaCINCisjaW5jbHVkZSAieGZhX2ZmYXBwLmgiDQorI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KK0NYRkFfRkZFeGNsR3JvdXA6OkNYRkFfRkZFeGNsR3JvdXAoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpDQorICAgIDogQ1hGQV9GRldpZGdldChwUGFnZVZpZXcsIHBEYXRhQWNjKSB7fQ0KK0NYRkFfRkZFeGNsR3JvdXA6On5DWEZBX0ZGRXhjbEdyb3VwKCkge30NCit2b2lkIENYRkFfRkZFeGNsR3JvdXA6OlJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0ZSkgew0KKyAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX01hdHJpeCBtdFJvdGF0ZTsNCisgIEdldFJvdGF0ZU1hdHJpeChtdFJvdGF0ZSk7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBtdFJvdGF0ZS5Db25jYXQoKnBNYXRyaXgpOw0KKyAgfQ0KKyAgQ1hGQV9GRldpZGdldDo6UmVuZGVyV2lkZ2V0KHBHUywgJm10Um90YXRlLCBkd1N0YXR1cyk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmV4Y2xncm91cC5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZXhjbGdyb3VwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJhYTE4NwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmV4Y2xncm91cC5oCkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhGQV9GT1JNRklMTEVSX0VYQ0xHUk9VUF9JTVBfSA0KKyNkZWZpbmUgX0ZYRkFfRk9STUZJTExFUl9FWENMR1JPVVBfSU1QX0gNCitjbGFzcyBDWEZBX0ZGRXhjbEdyb3VwIDogcHVibGljIENYRkFfRkZXaWRnZXQgew0KKyBwdWJsaWM6DQorICBDWEZBX0ZGRXhjbEdyb3VwKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgdmlydHVhbCB+Q1hGQV9GRkV4Y2xHcm91cCgpOw0KKw0KKyAgdmlydHVhbCB2b2lkIFJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzID0gMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlID0gMCk7DQorDQorIHByb3RlY3RlZDoNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmZpZWxkLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmZpZWxkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWM3ZjdhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZmllbGQuY3BwCkBAIC0wLDAgKzEsODUwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9jb21tb24uaCINCisjaW5jbHVkZSAieGZhX2Zmd2lkZ2V0LmgiDQorI2luY2x1ZGUgInhmYV9mZmZpZWxkLmgiDQorI2luY2x1ZGUgInhmYV9mZnBhZ2V2aWV3LmgiDQorI2luY2x1ZGUgInhmYV9mZmFwcC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2MuaCINCisjaW5jbHVkZSAieGZhX2Z3bHRoZW1lLmgiDQorI2luY2x1ZGUgInhmYV90ZXh0bGF5b3V0LmgiDQorI2luY2x1ZGUgInhmYV9mZmRvY3ZpZXcuaCINCitDWEZBX0ZGRmllbGQ6OkNYRkFfRkZGaWVsZChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQ0KKyAgICA6IENYRkFfRkZXaWRnZXQocFBhZ2VWaWV3LCBwRGF0YUFjYyksIG1fcE5vcm1hbFdpZGdldChOVUxMKSB7DQorICBtX3J0VUkuU2V0KDAsIDAsIDAsIDApOw0KKyAgbV9ydENhcHRpb24uU2V0KDAsIDAsIDAsIDApOw0KK30NCitDWEZBX0ZGRmllbGQ6On5DWEZBX0ZGRmllbGQoKSB7DQorICBDWEZBX0ZGRmllbGQ6OlVubG9hZFdpZGdldCgpOw0KK30NCitGWF9CT09MIENYRkFfRkZGaWVsZDo6R2V0QkJveChDRlhfUmVjdEYmIHJ0Qm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRyYXdGb2N1cykgew0KKyAgaWYgKGJEcmF3Rm9jdXMpIHsNCisgICAgWEZBX0VMRU1FTlQgdHlwZSA9IChYRkFfRUxFTUVOVCltX3BEYXRhQWNjLT5HZXRVSVR5cGUoKTsNCisgICAgaWYgKHR5cGUgPT0gWEZBX0VMRU1FTlRfQnV0dG9uIHx8IHR5cGUgPT0gWEZBX0VMRU1FTlRfQ2hlY2tCdXR0b24gfHwNCisgICAgICAgIHR5cGUgPT0gWEZBX0VMRU1FTlRfSW1hZ2VFZGl0IHx8IHR5cGUgPT0gWEZBX0VMRU1FTlRfU2lnbmF0dXJlIHx8DQorICAgICAgICB0eXBlID09IFhGQV9FTEVNRU5UX0Nob2ljZUxpc3QpIHsNCisgICAgICBydEJveCA9IG1fcnRVSTsNCisgICAgICBDRlhfTWF0cml4IG10Ow0KKyAgICAgIEdldFJvdGF0ZU1hdHJpeChtdCk7DQorICAgICAgbXQuVHJhbnNmb3JtUmVjdChydEJveCk7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyNpZm5kZWYgX1hGQV9FTUINCisgIHJldHVybiBDWEZBX0ZGV2lkZ2V0OjpHZXRCQm94KHJ0Qm94LCBkd1N0YXR1cyk7DQorI2VuZGlmDQorICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydEJveCk7DQorICBpZiAobV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgIENGWF9SZWN0RiBydFdpZGdldDsNCisgICAgbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0V2lkZ2V0KTsNCisgICAgcnRCb3guVW5pb24ocnRXaWRnZXQpOw0KKyAgfQ0KKyAgQ0ZYX01hdHJpeCBtdDsNCisgIEdldFJvdGF0ZU1hdHJpeChtdCk7DQorICBtdC5UcmFuc2Zvcm1SZWN0KHJ0Qm94KTsNCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENYRkFfRkZGaWVsZDo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlKSB7DQorICBpZiAoIUlzTWF0Y2hWaXNpYmxlU3RhdHVzKGR3U3RhdHVzKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfTWF0cml4IG10Um90YXRlOw0KKyAgR2V0Um90YXRlTWF0cml4KG10Um90YXRlKTsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIG10Um90YXRlLkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzKTsNCisgIENYRkFfQm9yZGVyIGJvcmRlclVJID0gbV9wRGF0YUFjYy0+R2V0VUlCb3JkZXIoKTsNCisgIERyYXdCb3JkZXIocEdTLCBib3JkZXJVSSwgbV9ydFVJLCAmbXRSb3RhdGUpOw0KKyAgUmVuZGVyQ2FwdGlvbihwR1MsICZtdFJvdGF0ZSk7DQorICBEcmF3SGlnaGxpZ2h0KHBHUywgJm10Um90YXRlLCBkd1N0YXR1cywgRkFMU0UpOw0KKyAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0V2lkZ2V0KTsNCisgIENGWF9NYXRyaXggbXQ7DQorICBtdC5TZXQoMSwgMCwgMCwgMSwgcnRXaWRnZXQubGVmdCwgcnRXaWRnZXQudG9wKTsNCisgIG10LkNvbmNhdChtdFJvdGF0ZSk7DQorICBHZXRBcHAoKS0+R2V0V2lkZ2V0TWdyRGVsZWdhdGUoKS0+T25EcmF3V2lkZ2V0KG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBHUywgJm10KTsNCit9DQordm9pZCBDWEZBX0ZGRmllbGQ6OkRyYXdIaWdobGlnaHQoQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXR1cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJFbGxpcHNlKSB7DQorICBpZiAobV9ydFVJLklzRW1wdHkoKSB8fCAhbV9wRGF0YUFjYy0+R2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKChkd1N0YXR1cyAmIFhGQV9XSURHRVRTVEFUVVNfSGlnaGxpZ2h0KSAmJg0KKyAgICAgIG1fcERhdGFBY2MtPkdldEFjY2VzcygpID09IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4pIHsNCisgICAgQ1hGQV9GRkRvYyogcERvYyA9IEdldERvYygpOw0KKyAgICBDRlhfQ29sb3IgY3JIaWdobGlnaHQocERvYy0+R2V0RG9jUHJvdmlkZXIoKS0+R2V0SGlnaGxpZ2h0Q29sb3IocERvYykpOw0KKyAgICBwR1MtPlNldEZpbGxDb2xvcigmY3JIaWdobGlnaHQpOw0KKyAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICBpZiAoYkVsbGlwc2UpIHsNCisgICAgICBwYXRoLkFkZEVsbGlwc2UobV9ydFVJKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBwYXRoLkFkZFJlY3RhbmdsZShtX3J0VUkubGVmdCwgbV9ydFVJLnRvcCwgbV9ydFVJLndpZHRoLCBtX3J0VUkuaGVpZ2h0KTsNCisgICAgfQ0KKyAgICBwR1MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRkZpZWxkOjpEcmF3Rm9jdXMoQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIGlmIChtX2R3U3RhdHVzICYgWEZBX1dJREdFVFNUQVRVU19Gb2N1c2VkKSB7DQorICAgIENGWF9Db2xvciBjcigweEZGMDAwMDAwKTsNCisgICAgcEdTLT5TZXRTdHJva2VDb2xvcigmY3IpOw0KKyAgICBGWF9GTE9BVCBEYXNoUGF0dGVyblsyXSA9IHsxLCAxfTsNCisgICAgcEdTLT5TZXRMaW5lRGFzaCgwLjBmLCBEYXNoUGF0dGVybiwgMik7DQorICAgIHBHUy0+U2V0TGluZVdpZHRoKDAsIEZBTFNFKTsNCisgICAgQ0ZYX1BhdGggcGF0aDsNCisgICAgcGF0aC5DcmVhdGUoKTsNCisgICAgcGF0aC5BZGRSZWN0YW5nbGUobV9ydFVJLmxlZnQsIG1fcnRVSS50b3AsIG1fcnRVSS53aWR0aCwgbV9ydFVJLmhlaWdodCk7DQorICAgIHBHUy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRkZpZWxkOjpTZXRGV0xUaGVtZVByb3ZpZGVyKCkgew0KKyAgaWYgKG1fcE5vcm1hbFdpZGdldCkgew0KKyAgICBtX3BOb3JtYWxXaWRnZXQtPm1fcElmYWNlLT5TZXRUaGVtZVByb3ZpZGVyKEdldEFwcCgpLT5HZXRGV0xUaGVtZSgpKTsNCisgIH0NCit9DQorRlhfQk9PTCBDWEZBX0ZGRmllbGQ6OklzTG9hZGVkKCkgew0KKyAgcmV0dXJuIG1fcE5vcm1hbFdpZGdldCAhPSBOVUxMICYmIENYRkFfRkZXaWRnZXQ6OklzTG9hZGVkKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkZpZWxkOjpMb2FkV2lkZ2V0KCkgew0KKyAgU2V0RldMVGhlbWVQcm92aWRlcigpOw0KKyAgbV9wRGF0YUFjYy0+TG9hZENhcHRpb24oKTsNCisgIFBlcmZvcm1MYXlvdXQoKTsNCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENYRkFfRkZGaWVsZDo6VW5sb2FkV2lkZ2V0KCkgew0KKyAgZGVsZXRlIG1fcE5vcm1hbFdpZGdldDsNCisgIG1fcE5vcm1hbFdpZGdldCA9IG51bGxwdHI7DQorfQ0KK3ZvaWQgQ1hGQV9GRkZpZWxkOjpTZXRFZGl0U2Nyb2xsT2Zmc2V0KCkgew0KKyAgWEZBX0VMRU1FTlQgZVR5cGUgPSBtX3BEYXRhQWNjLT5HZXRVSVR5cGUoKTsNCisgIGlmIChlVHlwZSA9PSBYRkFfRUxFTUVOVF9UZXh0RWRpdCB8fCBlVHlwZSA9PSBYRkFfRUxFTUVOVF9OdW1lcmljRWRpdCB8fA0KKyAgICAgIGVUeXBlID09IFhGQV9FTEVNRU5UX1Bhc3N3b3JkRWRpdCkgew0KKyAgICBGWF9GTE9BVCBmU2Nyb2xsT2Zmc2V0ID0gMDsNCisgICAgQ1hGQV9GRkZpZWxkKiBwUHJldiA9IHN0YXRpY19jYXN0PENYRkFfRkZGaWVsZCo+KEdldFByZXYoKSk7DQorICAgIGlmIChwUHJldikgew0KKyAgICAgIENGWF9SZWN0RiBydE1hcmdpbjsNCisgICAgICBtX3BEYXRhQWNjLT5HZXRVSU1hcmdpbihydE1hcmdpbik7DQorICAgICAgZlNjcm9sbE9mZnNldCA9IC1ydE1hcmdpbi50b3A7DQorICAgIH0NCisgICAgd2hpbGUgKHBQcmV2KSB7DQorICAgICAgZlNjcm9sbE9mZnNldCArPSBwUHJldi0+bV9ydFVJLmhlaWdodDsNCisgICAgICBwUHJldiA9IHN0YXRpY19jYXN0PENYRkFfRkZGaWVsZCo+KHBQcmV2LT5HZXRQcmV2KCkpOw0KKyAgICB9DQorICAgICgoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQpLT5TZXRTY3JvbGxPZmZzZXQoZlNjcm9sbE9mZnNldCk7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkZpZWxkOjpQZXJmb3JtTGF5b3V0KCkgew0KKyAgQ1hGQV9GRldpZGdldDo6UGVyZm9ybUxheW91dCgpOw0KKyAgQ2FwUGxhY2VtZW50KCk7DQorICBMYXlvdXRDYXB0aW9uKCk7DQorICBTZXRGV0xSZWN0KCk7DQorICBTZXRFZGl0U2Nyb2xsT2Zmc2V0KCk7DQorICBpZiAobV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDWEZBX0ZGRmllbGQ6OkNhcFBsYWNlbWVudCgpIHsNCisgIENGWF9SZWN0RiBydFdpZGdldDsNCisgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0V2lkZ2V0KTsNCisgIENYRkFfTWFyZ2luIG1nV2lkZ2V0ID0gbV9wRGF0YUFjYy0+R2V0TWFyZ2luKCk7DQorICBpZiAobWdXaWRnZXQpIHsNCisgICAgQ1hGQV9MYXlvdXRJdGVtKiBwSXRlbSA9IHRoaXM7DQorICAgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQgPSAwLCBmUmlnaHRJbnNldCA9IDAsIGZUb3BJbnNldCA9IDAsIGZCb3R0b21JbnNldCA9IDA7DQorICAgIG1nV2lkZ2V0LkdldExlZnRJbnNldChmTGVmdEluc2V0KTsNCisgICAgbWdXaWRnZXQuR2V0UmlnaHRJbnNldChmUmlnaHRJbnNldCk7DQorICAgIG1nV2lkZ2V0LkdldFRvcEluc2V0KGZUb3BJbnNldCk7DQorICAgIG1nV2lkZ2V0LkdldEJvdHRvbUluc2V0KGZCb3R0b21JbnNldCk7DQorICAgIGlmIChwSXRlbS0+R2V0UHJldigpID09IE5VTEwgJiYgcEl0ZW0tPkdldE5leHQoKSA9PSBOVUxMKSB7DQorICAgICAgcnRXaWRnZXQuRGVmbGF0ZShmTGVmdEluc2V0LCBmVG9wSW5zZXQsIGZSaWdodEluc2V0LCBmQm90dG9tSW5zZXQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChwSXRlbS0+R2V0UHJldigpID09IE5VTEwpIHsNCisgICAgICAgIHJ0V2lkZ2V0LkRlZmxhdGUoZkxlZnRJbnNldCwgZlRvcEluc2V0LCBmUmlnaHRJbnNldCwgMCk7DQorICAgICAgfSBlbHNlIGlmIChwSXRlbS0+R2V0TmV4dCgpID09IE5VTEwpIHsNCisgICAgICAgIHJ0V2lkZ2V0LkRlZmxhdGUoZkxlZnRJbnNldCwgMCwgZlJpZ2h0SW5zZXQsIGZCb3R0b21JbnNldCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJ0V2lkZ2V0LkRlZmxhdGUoZkxlZnRJbnNldCwgMCwgZlJpZ2h0SW5zZXQsIDApOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgWEZBX0FUVFJJQlVURUVOVU0gaUNhcFBsYWNlbWVudCA9IFhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd247DQorICBGWF9GTE9BVCBmQ2FwUmVzZXJ2ZSA9IDA7DQorICBDWEZBX0NhcHRpb24gY2FwdGlvbiA9IG1fcERhdGFBY2MtPkdldENhcHRpb24oKTsNCisgIGlmIChjYXB0aW9uLklzRXhpc3RJblhNTCgpICYmDQorICAgICAgY2FwdGlvbi5HZXRQcmVzZW5jZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX0hpZGRlbikgew0KKyAgICBpQ2FwUGxhY2VtZW50ID0gKFhGQV9BVFRSSUJVVEVFTlVNKWNhcHRpb24uR2V0UGxhY2VtZW50VHlwZSgpOw0KKyAgICBpZiAoaUNhcFBsYWNlbWVudCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Ub3AgJiYgR2V0UHJldigpKSB7DQorICAgICAgbV9ydENhcHRpb24uU2V0KDAsIDAsIDAsIDApOw0KKyAgICB9IGVsc2UgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tICYmIEdldE5leHQoKSkgew0KKyAgICAgIG1fcnRDYXB0aW9uLlNldCgwLCAwLCAwLCAwKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBmQ2FwUmVzZXJ2ZSA9IGNhcHRpb24uR2V0UmVzZXJ2ZSgpOw0KKyAgICAgIENYRkFfTGF5b3V0SXRlbSogcEl0ZW0gPSB0aGlzOw0KKyAgICAgIGlmIChwSXRlbS0+R2V0UHJldigpID09IE5VTEwgJiYgcEl0ZW0tPkdldE5leHQoKSA9PSBOVUxMKSB7DQorICAgICAgICBtX3J0Q2FwdGlvbi5TZXQocnRXaWRnZXQubGVmdCwgcnRXaWRnZXQudG9wLCBydFdpZGdldC53aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICBydFdpZGdldC5oZWlnaHQpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBwSXRlbSA9IHBJdGVtLT5HZXRGaXJzdCgpOw0KKyAgICAgICAgcEl0ZW0tPkdldFJlY3QobV9ydENhcHRpb24pOw0KKyAgICAgICAgcEl0ZW0gPSBwSXRlbS0+R2V0TmV4dCgpOw0KKyAgICAgICAgd2hpbGUgKHBJdGVtKSB7DQorICAgICAgICAgIENGWF9SZWN0RiBydFJlY3Q7DQorICAgICAgICAgIHBJdGVtLT5HZXRSZWN0KHJ0UmVjdCk7DQorICAgICAgICAgIG1fcnRDYXB0aW9uLmhlaWdodCArPSBydFJlY3QuSGVpZ2h0KCk7DQorICAgICAgICAgIHBJdGVtID0gcEl0ZW0tPkdldE5leHQoKTsNCisgICAgICAgIH0NCisgICAgICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4obV9ydENhcHRpb24sIG1nV2lkZ2V0KTsNCisgICAgICB9DQorICAgICAgQ1hGQV9UZXh0TGF5b3V0KiBwQ2FwVGV4dExheW91dCA9IG1fcERhdGFBY2MtPkdldENhcHRpb25UZXh0TGF5b3V0KCk7DQorICAgICAgaWYgKGZDYXBSZXNlcnZlIDw9IDAgJiYgcENhcFRleHRMYXlvdXQpIHsNCisgICAgICAgIENGWF9TaXplRiBzaXplOw0KKyAgICAgICAgc2l6ZS5TZXQoMCwgMCk7DQorICAgICAgICBDRlhfU2l6ZUYgbWluU2l6ZTsNCisgICAgICAgIG1pblNpemUuU2V0KDAsIDApOw0KKyAgICAgICAgQ0ZYX1NpemVGIG1heFNpemU7DQorICAgICAgICBtYXhTaXplLlNldCgwLCAwKTsNCisgICAgICAgIHBDYXBUZXh0TGF5b3V0LT5DYWxjU2l6ZShtaW5TaXplLCBtYXhTaXplLCBzaXplKTsNCisgICAgICAgIGlmIChpQ2FwUGxhY2VtZW50ID09IFhGQV9BVFRSSUJVVEVFTlVNX1RvcCB8fA0KKyAgICAgICAgICAgIGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tKSB7DQorICAgICAgICAgIGZDYXBSZXNlcnZlID0gc2l6ZS55Ow0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgZkNhcFJlc2VydmUgPSBzaXplLng7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBtX3J0VUkgPSBydFdpZGdldDsNCisgIHN3aXRjaCAoaUNhcFBsYWNlbWVudCkgew0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ6IHsNCisgICAgICBtX3J0Q2FwdGlvbi53aWR0aCA9IGZDYXBSZXNlcnZlOw0KKyAgICAgIENhcExlZnRSaWdodFBsYWNlbWVudChjYXB0aW9uLCBydFdpZGdldCwgaUNhcFBsYWNlbWVudCk7DQorICAgICAgbV9ydFVJLndpZHRoIC09IGZDYXBSZXNlcnZlOw0KKyAgICAgIG1fcnRVSS5sZWZ0ICs9IGZDYXBSZXNlcnZlOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvcDogew0KKyAgICAgIG1fcnRDYXB0aW9uLmhlaWdodCA9IGZDYXBSZXNlcnZlOw0KKyAgICAgIENhcFRvcEJvdHRvbVBsYWNlbWVudChjYXB0aW9uLCBydFdpZGdldCwgaUNhcFBsYWNlbWVudCk7DQorICAgICAgbV9ydFVJLnRvcCArPSBmQ2FwUmVzZXJ2ZTsNCisgICAgICBtX3J0VUkuaGVpZ2h0IC09IGZDYXBSZXNlcnZlOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0OiB7DQorICAgICAgbV9ydENhcHRpb24ubGVmdCA9IG1fcnRDYXB0aW9uLnJpZ2h0KCkgLSBmQ2FwUmVzZXJ2ZTsNCisgICAgICBtX3J0Q2FwdGlvbi53aWR0aCA9IGZDYXBSZXNlcnZlOw0KKyAgICAgIENhcExlZnRSaWdodFBsYWNlbWVudChjYXB0aW9uLCBydFdpZGdldCwgaUNhcFBsYWNlbWVudCk7DQorICAgICAgbV9ydFVJLndpZHRoIC09IGZDYXBSZXNlcnZlOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbTogew0KKyAgICAgIG1fcnRDYXB0aW9uLnRvcCA9IG1fcnRDYXB0aW9uLmJvdHRvbSgpIC0gZkNhcFJlc2VydmU7DQorICAgICAgbV9ydENhcHRpb24uaGVpZ2h0ID0gZkNhcFJlc2VydmU7DQorICAgICAgQ2FwVG9wQm90dG9tUGxhY2VtZW50KGNhcHRpb24sIHJ0V2lkZ2V0LCBpQ2FwUGxhY2VtZW50KTsNCisgICAgICBtX3J0VUkuaGVpZ2h0IC09IGZDYXBSZXNlcnZlOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0lubGluZToNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIENYRkFfQm9yZGVyIGJvcmRlclVJID0gbV9wRGF0YUFjYy0+R2V0VUlCb3JkZXIoKTsNCisgIGlmIChib3JkZXJVSSkgew0KKyAgICBDWEZBX01hcmdpbiBtYXJnaW4gPSBib3JkZXJVSS5HZXRNYXJnaW4oKTsNCisgICAgaWYgKG1hcmdpbi5Jc0V4aXN0SW5YTUwoKSkgew0KKyAgICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4obV9ydFVJLCBtYXJnaW4pOw0KKyAgICB9DQorICB9DQorICBtX3J0VUkuTm9ybWFsaXplKCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkZpZWxkOjpDYXBUb3BCb3R0b21QbGFjZW1lbnQoQ1hGQV9DYXB0aW9uIGNhcHRpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0V2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ2FwUGxhY2VtZW50KSB7DQorICBDRlhfUmVjdEYgcnRVSU1hcmdpbjsNCisgIG1fcERhdGFBY2MtPkdldFVJTWFyZ2luKHJ0VUlNYXJnaW4pOw0KKyAgbV9ydENhcHRpb24ubGVmdCArPSBydFVJTWFyZ2luLmxlZnQ7DQorICBpZiAoQ1hGQV9NYXJnaW4gbWdDYXAgPSBjYXB0aW9uLkdldE1hcmdpbigpKSB7DQorICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4obV9ydENhcHRpb24sIG1nQ2FwKTsNCisgICAgaWYgKG1fcnRDYXB0aW9uLmhlaWdodCA8IDApIHsNCisgICAgICBtX3J0Q2FwdGlvbi50b3AgKz0gbV9ydENhcHRpb24uaGVpZ2h0Ow0KKyAgICB9DQorICB9DQorICBGWF9GTE9BVCBmV2lkdGggPSBydFVJTWFyZ2luLmxlZnQgKyBydFVJTWFyZ2luLndpZHRoOw0KKyAgRlhfRkxPQVQgZkhlaWdodCA9IG1fcnRDYXB0aW9uLmhlaWdodCArIHJ0VUlNYXJnaW4udG9wICsgcnRVSU1hcmdpbi5oZWlnaHQ7DQorICBpZiAoZldpZHRoID4gcnRXaWRnZXQud2lkdGgpIHsNCisgICAgbV9ydFVJLndpZHRoICs9IGZXaWR0aCAtIHJ0V2lkZ2V0LndpZHRoOw0KKyAgfQ0KKyAgaWYgKGZIZWlnaHQgPT0gWEZBX0RFRkFVTFRVSV9IRUlHSFQgJiYgbV9ydFVJLmhlaWdodCA8IFhGQV9NSU5VSV9IRUlHSFQpIHsNCisgICAgbV9ydFVJLmhlaWdodCA9IFhGQV9NSU5VSV9IRUlHSFQ7DQorICAgIG1fcnRDYXB0aW9uLnRvcCArPSBydFVJTWFyZ2luLnRvcCArIHJ0VUlNYXJnaW4uaGVpZ2h0Ow0KKyAgfSBlbHNlIGlmIChmSGVpZ2h0ID4gcnRXaWRnZXQuaGVpZ2h0KSB7DQorICAgIG1fcnRVSS5oZWlnaHQgKz0gZkhlaWdodCAtIHJ0V2lkZ2V0LmhlaWdodDsNCisgICAgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tKSB7DQorICAgICAgbV9ydENhcHRpb24udG9wICs9IGZIZWlnaHQgLSBydFdpZGdldC5oZWlnaHQ7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDWEZBX0ZGRmllbGQ6OkNhcExlZnRSaWdodFBsYWNlbWVudChDWEZBX0NhcHRpb24gY2FwdGlvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDYXBQbGFjZW1lbnQpIHsNCisgIENGWF9SZWN0RiBydFVJTWFyZ2luOw0KKyAgbV9wRGF0YUFjYy0+R2V0VUlNYXJnaW4ocnRVSU1hcmdpbik7DQorICBtX3J0Q2FwdGlvbi50b3AgKz0gcnRVSU1hcmdpbi50b3A7DQorICBtX3J0Q2FwdGlvbi5oZWlnaHQgLT0gcnRVSU1hcmdpbi50b3A7DQorICBpZiAoQ1hGQV9NYXJnaW4gbWdDYXAgPSBjYXB0aW9uLkdldE1hcmdpbigpKSB7DQorICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4obV9ydENhcHRpb24sIG1nQ2FwKTsNCisgICAgaWYgKG1fcnRDYXB0aW9uLmhlaWdodCA8IDApIHsNCisgICAgICBtX3J0Q2FwdGlvbi50b3AgKz0gbV9ydENhcHRpb24uaGVpZ2h0Ow0KKyAgICB9DQorICB9DQorICBGWF9GTE9BVCBmV2lkdGggPSBtX3J0Q2FwdGlvbi53aWR0aCArIHJ0VUlNYXJnaW4ubGVmdCArIHJ0VUlNYXJnaW4ud2lkdGg7DQorICBGWF9GTE9BVCBmSGVpZ2h0ID0gcnRVSU1hcmdpbi50b3AgKyBydFVJTWFyZ2luLmhlaWdodDsNCisgIGlmIChmV2lkdGggPiBydFdpZGdldC53aWR0aCkgew0KKyAgICBtX3J0VUkud2lkdGggKz0gZldpZHRoIC0gcnRXaWRnZXQud2lkdGg7DQorICAgIGlmIChpQ2FwUGxhY2VtZW50ID09IFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0KSB7DQorICAgICAgbV9ydENhcHRpb24ubGVmdCArPSBmV2lkdGggLSBydFdpZGdldC53aWR0aDsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGZIZWlnaHQgPT0gWEZBX0RFRkFVTFRVSV9IRUlHSFQgJiYgbV9ydFVJLmhlaWdodCA8IFhGQV9NSU5VSV9IRUlHSFQpIHsNCisgICAgbV9ydFVJLmhlaWdodCA9IFhGQV9NSU5VSV9IRUlHSFQ7DQorICAgIG1fcnRDYXB0aW9uLnRvcCArPSBydFVJTWFyZ2luLnRvcCArIHJ0VUlNYXJnaW4uaGVpZ2h0Ow0KKyAgfSBlbHNlIGlmIChmSGVpZ2h0ID4gcnRXaWRnZXQuaGVpZ2h0KSB7DQorICAgIG1fcnRVSS5oZWlnaHQgKz0gZkhlaWdodCAtIHJ0V2lkZ2V0LmhlaWdodDsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZGRmllbGQ6OlVwZGF0ZUZXTCgpIHsNCisgIGlmIChtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsNCisgIH0NCit9DQorRlhfRFdPUkQgQ1hGQV9GRkZpZWxkOjpVcGRhdGVVSVByb3BlcnR5KCkgew0KKyAgQ1hGQV9Ob2RlKiBwVWlOb2RlID0gbV9wRGF0YUFjYy0+R2V0VUlDaGlsZCgpOw0KKyAgRlhfRFdPUkQgZHdTdHlsZSA9IDA7DQorICBpZiAocFVpTm9kZSAmJiBwVWlOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRGVmYXVsdFVpKSB7DQorICAgIGR3U3R5bGUgPSBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5Ow0KKyAgfQ0KKyAgcmV0dXJuIGR3U3R5bGU7DQorfQ0KK3ZvaWQgQ1hGQV9GRkZpZWxkOjpTZXRGV0xSZWN0KCkgew0KKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1JlY3RGIHJ0VWkgPSBtX3J0VUk7DQorICBpZiAocnRVaS53aWR0aCA8IDEuMCkgew0KKyAgICBGWFNZU19hc3NlcnQocnRVaS53aWR0aCA8IDEuMCk7DQorICAgIHJ0VWkud2lkdGggPSAxLjA7DQorICB9DQorICBpZiAoIW1fcERhdGFBY2MtPkdldERvYygpLT5HZXRYRkFEb2MoKS0+SXNJbnRlcmFjdGl2ZSgpKSB7DQorICAgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IG1fcERhdGFBY2MtPkdldEZvbnRTaXplKCk7DQorICAgIGlmIChydFVpLmhlaWdodCA8IGZGb250U2l6ZSkgew0KKyAgICAgIHJ0VWkuaGVpZ2h0ID0gZkZvbnRTaXplOw0KKyAgICB9DQorICB9DQorICBtX3BOb3JtYWxXaWRnZXQtPlNldFdpZGdldFJlY3QocnRVaSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkZpZWxkOjpPbk1vdXNlRW50ZXIoKSB7DQorICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRldMX01zZ01vdXNlIG1zOw0KKyAgbXMubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9Nb3VzZUVudGVyOw0KKyAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJZmFjZTsNCisgIG1zLm1fcFNyY1RhcmdldCA9IE5VTEw7DQorICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRmllbGQ6Ok9uTW91c2VFeGl0KCkgew0KKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZXTF9Nc2dNb3VzZSBtczsNCisgIG1zLm1fZHdDbWQgPSBGV0xfTVNHTU9VU0VDTURfTW91c2VMZWF2ZTsNCisgIG1zLm1fcERzdFRhcmdldCA9IG1fcE5vcm1hbFdpZGdldC0+bV9wSWZhY2U7DQorICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDWEZBX0ZGRmllbGQ6OkZXTFRvQ2xpZW50KEZYX0ZMT0FUJiBmeCwgRlhfRkxPQVQmIGZ5KSB7DQorICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldFJlY3QocnRXaWRnZXQpOw0KKyAgZnggLT0gcnRXaWRnZXQubGVmdDsNCisgIGZ5IC09IHJ0V2lkZ2V0LnRvcDsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRmllbGQ6Ok9uTEJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4gfHwNCisgICAgICAhbV9wRGF0YUFjYy0+R2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKCFQdEluQWN0aXZlUmVjdChmeCwgZnkpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIFNldEJ1dHRvbkRvd24oVFJVRSk7DQorICBDRldMX01zZ01vdXNlIG1zOw0KKyAgbXMubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjsNCisgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7DQorICBtcy5tX2Z4ID0gZng7DQorICBtcy5tX2Z5ID0gZnk7DQorICBGV0xUb0NsaWVudChtcy5tX2Z4LCBtcy5tX2Z5KTsNCisgIG1zLm1fcERzdFRhcmdldCA9IG1fcE5vcm1hbFdpZGdldC0+bV9wSWZhY2U7DQorICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRmllbGQ6Ok9uTEJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKCFJc0J1dHRvbkRvd24oKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBTZXRCdXR0b25Eb3duKEZBTFNFKTsNCisgIENGV0xfTXNnTW91c2UgbXM7DQorICBtcy5tX2R3Q21kID0gRldMX01TR01PVVNFQ01EX0xCdXR0b25VcDsNCisgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7DQorICBtcy5tX2Z4ID0gZng7DQorICBtcy5tX2Z5ID0gZnk7DQorICBGV0xUb0NsaWVudChtcy5tX2Z4LCBtcy5tX2Z5KTsNCisgIG1zLm1fcERzdFRhcmdldCA9IG1fcE5vcm1hbFdpZGdldC0+bV9wSWZhY2U7DQorICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRmllbGQ6Ok9uTEJ1dHRvbkRibENsayhGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZXTF9Nc2dNb3VzZSBtczsNCisgIG1zLm1fZHdDbWQgPSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRibENsazsNCisgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7DQorICBtcy5tX2Z4ID0gZng7DQorICBtcy5tX2Z5ID0gZnk7DQorICBGV0xUb0NsaWVudChtcy5tX2Z4LCBtcy5tX2Z5KTsNCisgIG1zLm1fcERzdFRhcmdldCA9IG1fcE5vcm1hbFdpZGdldC0+bV9wSWZhY2U7DQorICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRmllbGQ6Ok9uTW91c2VNb3ZlKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZXTF9Nc2dNb3VzZSBtczsNCisgIG1zLm1fZHdDbWQgPSBGV0xfTVNHTU9VU0VDTURfTW91c2VNb3ZlOw0KKyAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsNCisgIG1zLm1fZnggPSBmeDsNCisgIG1zLm1fZnkgPSBmeTsNCisgIEZXTFRvQ2xpZW50KG1zLm1fZngsIG1zLm1fZnkpOw0KKyAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJZmFjZTsNCisgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRkZGaWVsZDo6T25Nb3VzZVdoZWVsKEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IHpEZWx0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIHJldHVybiBGQUxTRTsNCisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGV0xfTXNnTW91c2VXaGVlbCBtczsNCisgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7DQorICBtcy5tX2Z4ID0gZng7DQorICBtcy5tX2Z5ID0gZnk7DQorICBGV0xUb0NsaWVudChtcy5tX2Z4LCBtcy5tX2Z5KTsNCisgIG1zLm1fZkRlbHRhWCA9IHpEZWx0YTsNCisgIG1zLm1fZkRlbHRhWSA9IDA7DQorICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcElmYWNlOw0KKyAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkZpZWxkOjpPblJCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuIHx8DQorICAgICAgIW1fcERhdGFBY2MtPkdldERvYygpLT5HZXRYRkFEb2MoKS0+SXNJbnRlcmFjdGl2ZSgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICghUHRJbkFjdGl2ZVJlY3QoZngsIGZ5KSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBTZXRCdXR0b25Eb3duKFRSVUUpOw0KKyAgQ0ZXTF9Nc2dNb3VzZSBtczsNCisgIG1zLm1fZHdDbWQgPSBGV0xfTVNHTU9VU0VDTURfUkJ1dHRvbkRvd247DQorICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOw0KKyAgbXMubV9meCA9IGZ4Ow0KKyAgbXMubV9meSA9IGZ5Ow0KKyAgRldMVG9DbGllbnQobXMubV9meCwgbXMubV9meSk7DQorICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcElmYWNlOw0KKyAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkZpZWxkOjpPblJCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICghSXNCdXR0b25Eb3duKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgU2V0QnV0dG9uRG93bihGQUxTRSk7DQorICBDRldMX01zZ01vdXNlIG1zOw0KKyAgbXMubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9SQnV0dG9uVXA7DQorICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOw0KKyAgbXMubV9meCA9IGZ4Ow0KKyAgbXMubV9meSA9IGZ5Ow0KKyAgRldMVG9DbGllbnQobXMubV9meCwgbXMubV9meSk7DQorICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcElmYWNlOw0KKyAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkZpZWxkOjpPblJCdXR0b25EYmxDbGsoRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGV0xfTXNnTW91c2UgbXM7DQorICBtcy5tX2R3Q21kID0gRldMX01TR01PVVNFQ01EX1JCdXR0b25EYmxDbGs7DQorICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOw0KKyAgbXMubV9meCA9IGZ4Ow0KKyAgbXMubV9meSA9IGZ5Ow0KKyAgRldMVG9DbGllbnQobXMubV9meCwgbXMubV9meSk7DQorICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcElmYWNlOw0KKyAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KKw0KK0ZYX0JPT0wgQ1hGQV9GRkZpZWxkOjpPblNldEZvY3VzKENYRkFfRkZXaWRnZXQqIHBPbGRXaWRnZXQpIHsNCisgIENYRkFfRkZXaWRnZXQ6Ok9uU2V0Rm9jdXMocE9sZFdpZGdldCk7DQorICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRldMX01zZ1NldEZvY3VzIG1zOw0KKyAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJZmFjZTsNCisgIG1zLm1fcFNyY1RhcmdldCA9IE5VTEw7DQorICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQorICBtX2R3U3RhdHVzIHw9IFhGQV9XSURHRVRTVEFUVVNfRm9jdXNlZDsNCisgIEFkZEludmFsaWRhdGVSZWN0KCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRmllbGQ6Ok9uS2lsbEZvY3VzKENYRkFfRkZXaWRnZXQqIHBOZXdXaWRnZXQpIHsNCisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgIHJldHVybiBDWEZBX0ZGV2lkZ2V0OjpPbktpbGxGb2N1cyhwTmV3V2lkZ2V0KTsNCisgIH0NCisgIENGV0xfTXNnS2lsbEZvY3VzIG1zOw0KKyAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJZmFjZTsNCisgIG1zLm1fcFNyY1RhcmdldCA9IE5VTEw7DQorICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQorICBtX2R3U3RhdHVzICY9IH5YRkFfV0lER0VUU1RBVFVTX0ZvY3VzZWQ7DQorICBBZGRJbnZhbGlkYXRlUmVjdCgpOw0KKyAgQ1hGQV9GRldpZGdldDo6T25LaWxsRm9jdXMocE5ld1dpZGdldCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRmllbGQ6Ok9uS2V5RG93bihGWF9EV09SRCBkd0tleUNvZGUsIEZYX0RXT1JEIGR3RmxhZ3MpIHsNCisgIGlmICghbV9wTm9ybWFsV2lkZ2V0IHx8ICFtX3BEYXRhQWNjLT5HZXREb2MoKS0+R2V0WEZBRG9jKCktPklzSW50ZXJhY3RpdmUoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRldMX01zZ0tleSBtczsNCisgIG1zLm1fZHdDbWQgPSBGV0xfTVNHS0VZQ01EX0tleURvd247DQorICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOw0KKyAgbXMubV9kd0tleUNvZGUgPSBkd0tleUNvZGU7DQorICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcElmYWNlOw0KKyAgbXMubV9wU3JjVGFyZ2V0ID0gTlVMTDsNCisgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRkZGaWVsZDo6T25LZXlVcChGWF9EV09SRCBkd0tleUNvZGUsIEZYX0RXT1JEIGR3RmxhZ3MpIHsNCisgIGlmICghbV9wTm9ybWFsV2lkZ2V0IHx8ICFtX3BEYXRhQWNjLT5HZXREb2MoKS0+R2V0WEZBRG9jKCktPklzSW50ZXJhY3RpdmUoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRldMX01zZ0tleSBtczsNCisgIG1zLm1fZHdDbWQgPSBGV0xfTVNHS0VZQ01EX0tleVVwOw0KKyAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsNCisgIG1zLm1fZHdLZXlDb2RlID0gZHdLZXlDb2RlOw0KKyAgbXMubV9wRHN0VGFyZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5tX3BJZmFjZTsNCisgIG1zLm1fcFNyY1RhcmdldCA9IE5VTEw7DQorICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRmllbGQ6Ok9uQ2hhcihGWF9EV09SRCBkd0NoYXIsIEZYX0RXT1JEIGR3RmxhZ3MpIHsNCisgIGlmICghbV9wRGF0YUFjYy0+R2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGR3Q2hhciA9PSBGV0xfVktFWV9UYWIpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAobV9wRGF0YUFjYy0+R2V0QWNjZXNzKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT3Blbikgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRldMX01zZ0tleSBtczsNCisgIG1zLm1fZHdDbWQgPSBGV0xfTVNHS0VZQ01EX0NoYXI7DQorICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOw0KKyAgbXMubV9kd0tleUNvZGUgPSBkd0NoYXI7DQorICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcElmYWNlOw0KKyAgbXMubV9wU3JjVGFyZ2V0ID0gTlVMTDsNCisgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9EV09SRCBDWEZBX0ZGRmllbGQ6Ok9uSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIGlmIChtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgRlhfRkxPQVQgZmZ4ID0gZngsIGZmeSA9IGZ5Ow0KKyAgICBGV0xUb0NsaWVudChmZngsIGZmeSk7DQorICAgIEZYX0RXT1JEIGR3V2lkZ2V0SGl0ID0gbV9wTm9ybWFsV2lkZ2V0LT5IaXRUZXN0KGZmeCwgZmZ5KTsNCisgICAgaWYgKGR3V2lkZ2V0SGl0ICE9IEZXTF9XR1RISVRURVNUX1Vua25vd24pIHsNCisgICAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQ2xpZW50Ow0KKyAgICB9DQorICB9DQorICBDRlhfUmVjdEYgcnRCb3g7DQorICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydEJveCk7DQorICBpZiAoIXJ0Qm94LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1Vua25vd247DQorICB9DQorICBpZiAobV9ydENhcHRpb24uQ29udGFpbnMoZngsIGZ5KSkgew0KKyAgICByZXR1cm4gRldMX1dHVEhJVFRFU1RfVGl0bGViYXI7DQorICB9DQorICByZXR1cm4gRldMX1dHVEhJVFRFU1RfQm9yZGVyOw0KK30NCitGWF9CT09MIENYRkFfRkZGaWVsZDo6T25TZXRDdXJzb3IoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSB7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRmllbGQ6OlB0SW5BY3RpdmVSZWN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0V2lkZ2V0KTsNCisgIGlmIChydFdpZGdldC5Db250YWlucyhmeCwgZnkpKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkIENYRkFfRkZGaWVsZDo6TGF5b3V0Q2FwdGlvbigpIHsNCisgIENYRkFfVGV4dExheW91dCogcENhcFRleHRMYXlvdXQgPSBtX3BEYXRhQWNjLT5HZXRDYXB0aW9uVGV4dExheW91dCgpOw0KKyAgaWYgKCFwQ2FwVGV4dExheW91dCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfU2l6ZUYgc2l6ZTsNCisgIHNpemUuU2V0KG1fcnRDYXB0aW9uLndpZHRoLCBtX3J0Q2FwdGlvbi5oZWlnaHQpOw0KKyAgRlhfRkxPQVQgZkhlaWdodCA9IDA7DQorICBwQ2FwVGV4dExheW91dC0+TGF5b3V0KHNpemUsICZmSGVpZ2h0KTsNCisgIGlmIChtX3J0Q2FwdGlvbi5oZWlnaHQgPCBmSGVpZ2h0KSB7DQorICAgIG1fcnRDYXB0aW9uLmhlaWdodCA9IGZIZWlnaHQ7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRkZpZWxkOjpSZW5kZXJDYXB0aW9uKENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDWEZBX1RleHRMYXlvdXQqIHBDYXBUZXh0TGF5b3V0ID0gbV9wRGF0YUFjYy0+R2V0Q2FwdGlvblRleHRMYXlvdXQoKTsNCisgIGlmICghcENhcFRleHRMYXlvdXQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9DYXB0aW9uIGNhcHRpb24gPSBtX3BEYXRhQWNjLT5HZXRDYXB0aW9uKCk7DQorICBpZiAoY2FwdGlvbi5Jc0V4aXN0SW5YTUwoKSAmJg0KKyAgICAgIGNhcHRpb24uR2V0UHJlc2VuY2UoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlKSB7DQorICAgIGlmICghcENhcFRleHRMYXlvdXQtPklzTG9hZGVkKCkpIHsNCisgICAgICBDRlhfU2l6ZUYgc2l6ZTsNCisgICAgICBzaXplLlNldChtX3J0Q2FwdGlvbi53aWR0aCwgbV9ydENhcHRpb24uaGVpZ2h0KTsNCisgICAgICBwQ2FwVGV4dExheW91dC0+TGF5b3V0KHNpemUpOw0KKyAgICB9DQorICAgIENGWF9SZWN0RiBydFdpZGdldDsNCisgICAgR2V0UmVjdFdpdGhvdXRSb3RhdGUocnRXaWRnZXQpOw0KKyAgICBDRlhfUmVjdEYgcnRDbGlwID0gbV9ydENhcHRpb247DQorICAgIHJ0Q2xpcC5JbnRlcnNlY3QocnRXaWRnZXQpOw0KKyAgICBDRlhfUmVuZGVyRGV2aWNlKiBwUmVuZGVyRGV2aWNlID0gcEdTLT5HZXRSZW5kZXJEZXZpY2UoKTsNCisgICAgQ0ZYX01hdHJpeCBtdDsNCisgICAgbXQuU2V0KDEsIDAsIDAsIDEsIG1fcnRDYXB0aW9uLmxlZnQsIG1fcnRDYXB0aW9uLnRvcCk7DQorICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgcE1hdHJpeC0+VHJhbnNmb3JtUmVjdChydENsaXApOw0KKyAgICAgIG10LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIH0NCisgICAgcENhcFRleHRMYXlvdXQtPkRyYXdTdHJpbmcocFJlbmRlckRldmljZSwgbXQsIHJ0Q2xpcCk7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkZpZWxkOjpQcm9jZXNzQ29tbWl0dGVkRGF0YSgpIHsNCisgIGlmIChtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICghSXNEYXRhQ2hhbmdlZCgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChDYWxjdWxhdGVPdmVycmlkZSgpICE9IDEpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKCFDb21taXREYXRhKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9wRG9jVmlldy0+U2V0Q2hhbmdlTWFyaygpOw0KKyAgbV9wRG9jVmlldy0+QWRkVmFsaWRhdGVXaWRnZXQobV9wRGF0YUFjYyk7DQorICByZXR1cm4gVFJVRTsNCit9DQoraW50MzJfdCBDWEZBX0ZGRmllbGQ6OkNhbGN1bGF0ZU92ZXJyaWRlKCkgew0KKyAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBtX3BEYXRhQWNjLT5HZXRFeGNsR3JvdXAoKTsNCisgIGlmICghcEFjYykgew0KKyAgICByZXR1cm4gQ2FsY3VsYXRlV2lkZ2V0QWNjKG1fcERhdGFBY2MpOw0KKyAgfQ0KKyAgaWYgKENhbGN1bGF0ZVdpZGdldEFjYyhwQWNjKSA9PSAwKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBBY2MtPkdldEV4Y2xHcm91cEZpcnN0TWVtYmVyKCk7DQorICBpZiAoIXBOb2RlKSB7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBOVUxMOw0KKyAgd2hpbGUgKHBOb2RlKSB7DQorICAgIHBXaWRnZXRBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXBOb2RlLT5HZXRXaWRnZXREYXRhKCk7DQorICAgIGlmICghcFdpZGdldEFjYykgew0KKyAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICAgIGlmIChDYWxjdWxhdGVXaWRnZXRBY2MocFdpZGdldEFjYykgPT0gMCkgew0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIHBOb2RlID0gcFdpZGdldEFjYy0+R2V0RXhjbEdyb3VwTmV4dE1lbWJlcihwTm9kZSk7DQorICB9DQorICByZXR1cm4gMTsNCit9DQoraW50MzJfdCBDWEZBX0ZGRmllbGQ6OkNhbGN1bGF0ZVdpZGdldEFjYyhDWEZBX1dpZGdldEFjYyogcEFjYykgew0KKyAgQ1hGQV9DYWxjdWxhdGUgY2FsYyA9IHBBY2MtPkdldENhbGN1bGF0ZSgpOw0KKyAgaWYgKCFjYWxjKSB7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgWEZBX1ZFUlNJT04gdmVyc2lvbiA9IHBBY2MtPkdldERvYygpLT5HZXRYRkFEb2MoKS0+R2V0Q3VyVmVyc2lvbk1vZGUoKTsNCisgIGlmIChjYWxjKSB7DQorICAgIGludDMyX3QgaU92ZXJyaWRlID0gY2FsYy5HZXRPdmVycmlkZSgpOw0KKyAgICBzd2l0Y2ggKGlPdmVycmlkZSkgew0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRXJyb3I6IHsNCisgICAgICAgIGlmICh2ZXJzaW9uIDw9IFhGQV9WRVJTSU9OXzIwNCkgew0KKyAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgIH0NCisgICAgICAgIElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciA9IEdldEFwcCgpLT5HZXRBcHBQcm92aWRlcigpOw0KKyAgICAgICAgaWYgKHBBcHBQcm92aWRlcikgew0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2U7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzV2FybmluZzsNCisgICAgICAgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfTm90TW9kaWZ5RmllbGQsIHdzV2FybmluZyk7DQorICAgICAgICAgIHdzTWVzc2FnZSArPSB3c1dhcm5pbmc7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGl0bGU7DQorICAgICAgICAgIHBBcHBQcm92aWRlci0+TG9hZFN0cmluZyhYRkFfSURTX0NhbGNPdmVycmlkZSwgd3NUaXRsZSk7DQorICAgICAgICAgIHBBcHBQcm92aWRlci0+TXNnQm94KHdzTWVzc2FnZSwgd3NUaXRsZSwgWEZBX01CSUNPTl9XYXJuaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTUJfT0spOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICAgIHJldHVybiAwOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fV2FybmluZzogew0KKyAgICAgICAgaWYgKHZlcnNpb24gPD0gWEZBX1ZFUlNJT05fMjA0KSB7DQorICAgICAgICAgIENYRkFfU2NyaXB0IHNjcmlwdCA9IGNhbGMuR2V0U2NyaXB0KCk7DQorICAgICAgICAgIGlmICghc2NyaXB0KSB7DQorICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICAgIH0NCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uOw0KKyAgICAgICAgICBzY3JpcHQuR2V0RXhwcmVzc2lvbih3c0V4cHJlc3Npb24pOw0KKyAgICAgICAgICBpZiAod3NFeHByZXNzaW9uLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAocEFjYy0+R2V0Tm9kZSgpLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19Vc2VySW50ZXJhY3RpdmUpKSB7DQorICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyID0gR2V0QXBwKCktPkdldEFwcFByb3ZpZGVyKCk7DQorICAgICAgICBpZiAocEFwcFByb3ZpZGVyKSB7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZTsNCisgICAgICAgICAgY2FsYy5HZXRNZXNzYWdlVGV4dCh3c01lc3NhZ2UpOw0KKyAgICAgICAgICBpZiAoIXdzTWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICB3c01lc3NhZ2UgKz0gTCJcclxuIjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1dhcm5pbmc7DQorICAgICAgICAgIHBBcHBQcm92aWRlci0+TG9hZFN0cmluZyhYRkFfSURTX01vZGlmeUZpZWxkLCB3c1dhcm5pbmcpOw0KKyAgICAgICAgICB3c01lc3NhZ2UgKz0gd3NXYXJuaW5nOw0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RpdGxlOw0KKyAgICAgICAgICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoWEZBX0lEU19DYWxjT3ZlcnJpZGUsIHdzVGl0bGUpOw0KKyAgICAgICAgICBpZiAocEFwcFByb3ZpZGVyLT5Nc2dCb3god3NNZXNzYWdlLCB3c1RpdGxlLCBYRkFfTUJJQ09OX1dhcm5pbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTUJfWWVzTm8pID09IFhGQV9JRFllcykgew0KKyAgICAgICAgICAgIHBBY2MtPkdldE5vZGUoKS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVXNlckludGVyYWN0aXZlLCBUUlVFLCBGQUxTRSk7DQorICAgICAgICAgICAgcmV0dXJuIDE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiAwOw0KKyAgICAgIH0NCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0lnbm9yZToNCisgICAgICAgIHJldHVybiAwOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRGlzYWJsZWQ6DQorICAgICAgICBwQWNjLT5HZXROb2RlKCktPlNldEZsYWcoWEZBX05PREVGTEFHX1VzZXJJbnRlcmFjdGl2ZSwgVFJVRSwgRkFMU0UpOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIDE7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkZpZWxkOjpDb21taXREYXRhKCkgew0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfRkZGaWVsZDo6SXNEYXRhQ2hhbmdlZCgpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDWEZBX0ZGRmllbGQ6OlRyYW5zbGF0ZUZXTE1lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgR2V0QXBwKCktPkdldFdpZGdldE1nckRlbGVnYXRlKCktPk9uUHJvY2Vzc01lc3NhZ2VUb0Zvcm0ocE1lc3NhZ2UpOw0KK30NCitpbnQzMl90IENYRkFfRkZGaWVsZDo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ1hGQV9GRkZpZWxkOjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsNCisgIEZYX0RXT1JEIGR3RXZlbnRJRCA9IHBFdmVudC0+R2V0Q2xhc3NJRCgpOw0KKyAgc3dpdGNoIChkd0V2ZW50SUQpIHsNCisgICAgY2FzZSBGV0xfRVZUSEFTSF9Nb3VzZTogew0KKyAgICAgIENGV0xfRXZ0TW91c2UqIGV2ZW50ID0gKENGV0xfRXZ0TW91c2UqKXBFdmVudDsNCisgICAgICBpZiAoZXZlbnQtPm1fZHdDbWQgPT0gRldMX01TR01PVVNFQ01EX01vdXNlRW50ZXIpIHsNCisgICAgICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQorICAgICAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9Nb3VzZUVudGVyOw0KKyAgICAgICAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7DQorICAgICAgICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fTW91c2VFbnRlciwgJmVQYXJhbSk7DQorICAgICAgfSBlbHNlIGlmIChldmVudC0+bV9kd0NtZCA9PSBGV0xfTVNHTU9VU0VDTURfTW91c2VMZWF2ZSkgew0KKyAgICAgICAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsNCisgICAgICAgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX01vdXNlRXhpdDsNCisgICAgICAgIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BEYXRhQWNjOw0KKyAgICAgICAgbV9wRGF0YUFjYy0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX01vdXNlRXhpdCwgJmVQYXJhbSk7DQorICAgICAgfSBlbHNlIGlmIChldmVudC0+bV9kd0NtZCA9PSBGV0xfTVNHTU9VU0VDTURfTEJ1dHRvbkRvd24pIHsNCisgICAgICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQorICAgICAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9Nb3VzZURvd247DQorICAgICAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsNCisgICAgICAgIG1fcERhdGFBY2MtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZURvd24sICZlUGFyYW0pOw0KKyAgICAgIH0gZWxzZSBpZiAoZXZlbnQtPm1fZHdDbWQgPT0gRldMX01TR01PVVNFQ01EX0xCdXR0b25VcCkgew0KKyAgICAgICAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsNCisgICAgICAgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX01vdXNlVXA7DQorICAgICAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsNCisgICAgICAgIG1fcERhdGFBY2MtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZVVwLCAmZVBhcmFtKTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfRVZUSEFTSF9DbGljazogew0KKyAgICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQorICAgICAgZVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfQ2xpY2s7DQorICAgICAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7DQorICAgICAgbV9wRGF0YUFjYy0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX0NsaWNrLCAmZVBhcmFtKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGV0xfRVJSIENYRkFfRkZGaWVsZDo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZmaWVsZC5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZmllbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjdiNTk1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmZmllbGQuaApAQCAtMCwwICsxLDkyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYRkFfRk9STUZJTExFUl9GSUVMRF9JTVBfSA0KKyNkZWZpbmUgX0ZYRkFfRk9STUZJTExFUl9GSUVMRF9JTVBfSA0KKyNkZWZpbmUgWEZBX01JTlVJX0hFSUdIVCA0LjMyZg0KKyNkZWZpbmUgWEZBX0RFRkFVTFRVSV9IRUlHSFQgMi4wZg0KK2NsYXNzIENYRkFfVGV4dExheW91dDsNCitjbGFzcyBDWEZBX0ZGRmllbGQgOiBwdWJsaWMgQ1hGQV9GRldpZGdldCwgcHVibGljIElGV0xfV2lkZ2V0RGVsZWdhdGUgew0KKyBwdWJsaWM6DQorICBDWEZBX0ZGRmllbGQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQorICB2aXJ0dWFsIH5DWEZBX0ZGRmllbGQoKTsNCisNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRCQm94KENGWF9SZWN0RiYgcnRCb3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXR1cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRyYXdGb2N1cyA9IEZBTFNFKTsNCisgIHZpcnR1YWwgdm9pZCBSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXR1cyA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0ZSA9IDApOw0KKyAgdmlydHVhbCBGWF9CT09MIElzTG9hZGVkKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgTG9hZFdpZGdldCgpOw0KKyAgdmlydHVhbCB2b2lkIFVubG9hZFdpZGdldCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIFBlcmZvcm1MYXlvdXQoKTsNCisgIHZpcnR1YWwgdm9pZCBVcGRhdGVGV0woKTsNCisgIEZYX0RXT1JEIFVwZGF0ZVVJUHJvcGVydHkoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlRW50ZXIoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlRXhpdCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRibENsayhGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VNb3ZlKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25Nb3VzZVdoZWVsKEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgekRlbHRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPblJCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvbkRibENsayhGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKw0KKyAgdmlydHVhbCBGWF9CT09MIE9uU2V0Rm9jdXMoQ1hGQV9GRldpZGdldCogcE9sZFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25LaWxsRm9jdXMoQ1hGQV9GRldpZGdldCogcE5ld1dpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25LZXlEb3duKEZYX0RXT1JEIGR3S2V5Q29kZSwgRlhfRFdPUkQgZHdGbGFncyk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25LZXlVcChGWF9EV09SRCBkd0tleUNvZGUsIEZYX0RXT1JEIGR3RmxhZ3MpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uQ2hhcihGWF9EV09SRCBkd0NoYXIsIEZYX0RXT1JEIGR3RmxhZ3MpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBPbkhpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPblNldEN1cnNvcihGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2aXJ0dWFsIEZYX0JPT0wgUHRJbkFjdGl2ZVJlY3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgdm9pZCBTZXRGV0xSZWN0KCk7DQorICB2b2lkIFNldEZXTFRoZW1lUHJvdmlkZXIoKTsNCisgIENGV0xfV2lkZ2V0KiBHZXROb3JtYWxXaWRnZXQoKSB7IHJldHVybiBtX3BOb3JtYWxXaWRnZXQ7IH0NCisgIHZvaWQgRldMVG9DbGllbnQoRlhfRkxPQVQmIGZ4LCBGWF9GTE9BVCYgZnkpOw0KKyAgdm9pZCBMYXlvdXRDYXB0aW9uKCk7DQorICB2b2lkIFJlbmRlckNhcHRpb24oQ0ZYX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCisNCisgIGludDMyX3QgQ2FsY3VsYXRlT3ZlcnJpZGUoKTsNCisgIGludDMyX3QgQ2FsY3VsYXRlV2lkZ2V0QWNjKENYRkFfV2lkZ2V0QWNjKiBwQWNjKTsNCisgIEZYX0JPT0wgUHJvY2Vzc0NvbW1pdHRlZERhdGEoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDb21taXREYXRhKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNEYXRhQ2hhbmdlZCgpOw0KKyAgdm9pZCBEcmF3SGlnaGxpZ2h0KENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMsDQorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRWxsaXBzZSA9IEZBTFNFKTsNCisgIHZvaWQgRHJhd0ZvY3VzKENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4KTsNCisgIHZvaWQgVHJhbnNsYXRlRldMTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKTsNCisgIHZvaWQgQ2FwUGxhY2VtZW50KCk7DQorICB2b2lkIENhcFRvcEJvdHRvbVBsYWNlbWVudChDWEZBX0NhcHRpb24gY2FwdGlvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDYXBQbGFjZW1lbnQpOw0KKyAgdm9pZCBDYXBMZWZ0UmlnaHRQbGFjZW1lbnQoQ1hGQV9DYXB0aW9uIGNhcHRpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0V2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ2FwUGxhY2VtZW50KTsNCisgIHZvaWQgU2V0RWRpdFNjcm9sbE9mZnNldCgpOw0KKw0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIGludDMyX3QgT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKTsNCisgIHZpcnR1YWwgRldMX0VSUiBPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIE9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRldMX1dpZGdldCogbV9wTm9ybWFsV2lkZ2V0Ow0KKyAgQ0ZYX1JlY3RGIG1fcnRVSTsNCisgIENGWF9SZWN0RiBtX3J0Q2FwdGlvbjsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmltYWdlLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmltYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjYzOTZiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmaW1hZ2UuY3BwCkBAIC0wLDAgKzEsNjcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2NvbW1vbi5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXQuaCINCisjaW5jbHVkZSAieGZhX2ZmZHJhdy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZpbWFnZS5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZwYWdldmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2MuaCINCisjaW5jbHVkZSAieGZhX2ZmYXBwLmgiDQorQ1hGQV9GRkltYWdlOjpDWEZBX0ZGSW1hZ2UoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCisgICAgOiBDWEZBX0ZGRHJhdyhwUGFnZVZpZXcsIHBEYXRhQWNjKSB7fQ0KK0NYRkFfRkZJbWFnZTo6fkNYRkFfRkZJbWFnZSgpIHsNCisgIENYRkFfRkZJbWFnZTo6VW5sb2FkV2lkZ2V0KCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkltYWdlOjpJc0xvYWRlZCgpIHsNCisgIHJldHVybiBHZXREYXRhQWNjKCktPkdldEltYWdlSW1hZ2UoKSAhPSBOVUxMOw0KK30NCitGWF9CT09MIENYRkFfRkZJbWFnZTo6TG9hZFdpZGdldCgpIHsNCisgIGlmIChHZXREYXRhQWNjKCktPkdldEltYWdlSW1hZ2UoKSkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIEdldERhdGFBY2MoKS0+TG9hZEltYWdlSW1hZ2UoKTsNCisgIHJldHVybiBDWEZBX0ZGRHJhdzo6TG9hZFdpZGdldCgpOw0KK30NCit2b2lkIENYRkFfRkZJbWFnZTo6VW5sb2FkV2lkZ2V0KCkgew0KKyAgR2V0RGF0YUFjYygpLT5TZXRJbWFnZUltYWdlKE5VTEwpOw0KK30NCit2b2lkIENYRkFfRkZJbWFnZTo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlKSB7DQorICBpZiAoIUlzTWF0Y2hWaXNpYmxlU3RhdHVzKGR3U3RhdHVzKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfTWF0cml4IG10Um90YXRlOw0KKyAgR2V0Um90YXRlTWF0cml4KG10Um90YXRlKTsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIG10Um90YXRlLkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzKTsNCisgIGlmIChDRlhfRElCaXRtYXAqIHBESUJpdG1hcCA9IEdldERhdGFBY2MoKS0+R2V0SW1hZ2VJbWFnZSgpKSB7DQorICAgIENGWF9SZWN0RiBydEltYWdlOw0KKyAgICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydEltYWdlKTsNCisgICAgaWYgKENYRkFfTWFyZ2luIG1nV2lkZ2V0ID0gbV9wRGF0YUFjYy0+R2V0TWFyZ2luKCkpIHsNCisgICAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKHJ0SW1hZ2UsIG1nV2lkZ2V0KTsNCisgICAgfQ0KKyAgICBpbnQzMl90IGlIb3J6QWxpZ24gPSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0Ow0KKyAgICBpbnQzMl90IGlWZXJ0QWxpZ24gPSBYRkFfQVRUUklCVVRFRU5VTV9Ub3A7DQorICAgIGlmIChDWEZBX1BhcmEgcGFyYSA9IG1fcERhdGFBY2MtPkdldFBhcmEoKSkgew0KKyAgICAgIGlIb3J6QWxpZ24gPSBwYXJhLkdldEhvcml6b250YWxBbGlnbigpOw0KKyAgICAgIGlWZXJ0QWxpZ24gPSBwYXJhLkdldFZlcnRpY2FsQWxpZ24oKTsNCisgICAgfQ0KKyAgICBDWEZBX1ZhbHVlIHZhbHVlID0gbV9wRGF0YUFjYy0+R2V0Rm9ybVZhbHVlKCk7DQorICAgIENYRkFfSW1hZ2UgaW1hZ2VPYmogPSB2YWx1ZS5HZXRJbWFnZSgpOw0KKyAgICBpbnQzMl90IGlBc3BlY3QgPSBpbWFnZU9iai5HZXRBc3BlY3QoKTsNCisgICAgaW50MzJfdCBpSW1hZ2VYRHBpID0gMDsNCisgICAgaW50MzJfdCBpSW1hZ2VZRHBpID0gMDsNCisgICAgbV9wRGF0YUFjYy0+R2V0SW1hZ2VEcGkoaUltYWdlWERwaSwgaUltYWdlWURwaSk7DQorICAgIFhGQV9EcmF3SW1hZ2UocEdTLCBydEltYWdlLCAmbXRSb3RhdGUsIHBESUJpdG1hcCwgaUFzcGVjdCwgaUltYWdlWERwaSwNCisgICAgICAgICAgICAgICAgICBpSW1hZ2VZRHBpLCBpSG9yekFsaWduLCBpVmVydEFsaWduKTsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmaW1hZ2UuaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThiYzYzZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmltYWdlLmgKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfRFJBV19JTUFHRV9JTVBfSA0KKyNkZWZpbmUgX1hGQV9EUkFXX0lNQUdFX0lNUF9IDQorY2xhc3MgQ1hGQV9GRkltYWdlIDogcHVibGljIENYRkFfRkZEcmF3IHsNCisgcHVibGljOg0KKyAgQ1hGQV9GRkltYWdlKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgdmlydHVhbCB+Q1hGQV9GRkltYWdlKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMgPSAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSb3RhdGUgPSAwKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0xvYWRlZCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIExvYWRXaWRnZXQoKTsNCisgIHZpcnR1YWwgdm9pZCBVbmxvYWRXaWRnZXQoKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZmltYWdlZWRpdC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZpbWFnZWVkaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMDg4MzUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZpbWFnZWVkaXQuY3BwCkBAIC0wLDAgKzEsMTgzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9jb21tb24uaCINCisjaW5jbHVkZSAieGZhX2Zmd2lkZ2V0LmgiDQorI2luY2x1ZGUgInhmYV9mZmZpZWxkLmgiDQorI2luY2x1ZGUgInhmYV9mZnBhZ2V2aWV3LmgiDQorI2luY2x1ZGUgInhmYV9mZmltYWdlZWRpdC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2N2aWV3LmgiDQorI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KK0NYRkFfRkZJbWFnZUVkaXQ6OkNYRkFfRkZJbWFnZUVkaXQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpDQorICAgIDogQ1hGQV9GRkZpZWxkKHBQYWdlVmlldywgcERhdGFBY2MpLCBtX3BPbGREZWxlZ2F0ZShOVUxMKSB7fQ0KK0NYRkFfRkZJbWFnZUVkaXQ6On5DWEZBX0ZGSW1hZ2VFZGl0KCkgew0KKyAgQ1hGQV9GRkltYWdlRWRpdDo6VW5sb2FkV2lkZ2V0KCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkltYWdlRWRpdDo6TG9hZFdpZGdldCgpIHsNCisgIENGV0xfUGljdHVyZUJveCogcFBpY3R1cmVCb3ggPSBuZXcgQ0ZXTF9QaWN0dXJlQm94Ow0KKyAgaWYgKHBQaWN0dXJlQm94KSB7DQorICAgIHBQaWN0dXJlQm94LT5Jbml0aWFsaXplKCk7DQorICB9DQorICBtX3BOb3JtYWxXaWRnZXQgPSAoQ0ZXTF9XaWRnZXQqKXBQaWN0dXJlQm94Ow0KKyAgSUZXTF9XaWRnZXQqIHBXaWRnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRQcml2YXRlRGF0YShwV2lkZ2V0LCB0aGlzLCBOVUxMKTsNCisgIElGV0xfTm90ZURyaXZlciogcE5vdGVEcml2ZXIgPSBGV0xfR2V0QXBwKCktPkdldE5vdGVEcml2ZXIoKTsNCisgIHBOb3RlRHJpdmVyLT5SZWdpc3RlckV2ZW50VGFyZ2V0KHBXaWRnZXQsIHBXaWRnZXQpOw0KKyAgbV9wT2xkRGVsZWdhdGUgPSBwUGljdHVyZUJveC0+U2V0RGVsZWdhdGUodGhpcyk7DQorICBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKTsNCisgIGlmIChtX3BEYXRhQWNjLT5HZXRJbWFnZUVkaXRJbWFnZSgpICE9IE5VTEwpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBVcGRhdGVGV0xEYXRhKCk7DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDWEZBX0ZGSW1hZ2VFZGl0OjpVbmxvYWRXaWRnZXQoKSB7DQorICBtX3BEYXRhQWNjLT5TZXRJbWFnZUVkaXRJbWFnZShOVUxMKTsNCisgIENYRkFfRkZGaWVsZDo6VW5sb2FkV2lkZ2V0KCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRkltYWdlRWRpdDo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlKSB7DQorICBpZiAoIUlzTWF0Y2hWaXNpYmxlU3RhdHVzKGR3U3RhdHVzKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfTWF0cml4IG10Um90YXRlOw0KKyAgR2V0Um90YXRlTWF0cml4KG10Um90YXRlKTsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIG10Um90YXRlLkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzKTsNCisgIENYRkFfQm9yZGVyIGJvcmRlclVJID0gbV9wRGF0YUFjYy0+R2V0VUlCb3JkZXIoKTsNCisgIERyYXdCb3JkZXIocEdTLCBib3JkZXJVSSwgbV9ydFVJLCAmbXRSb3RhdGUpOw0KKyAgUmVuZGVyQ2FwdGlvbihwR1MsICZtdFJvdGF0ZSk7DQorICBpZiAoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAgPSBtX3BEYXRhQWNjLT5HZXRJbWFnZUVkaXRJbWFnZSgpKSB7DQorICAgIENGWF9SZWN0RiBydEltYWdlOw0KKyAgICBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldFJlY3QocnRJbWFnZSk7DQorICAgIGludDMyX3QgaUhvcnpBbGlnbiA9IFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ7DQorICAgIGludDMyX3QgaVZlcnRBbGlnbiA9IFhGQV9BVFRSSUJVVEVFTlVNX1RvcDsNCisgICAgaWYgKENYRkFfUGFyYSBwYXJhID0gbV9wRGF0YUFjYy0+R2V0UGFyYSgpKSB7DQorICAgICAgaUhvcnpBbGlnbiA9IHBhcmEuR2V0SG9yaXpvbnRhbEFsaWduKCk7DQorICAgICAgaVZlcnRBbGlnbiA9IHBhcmEuR2V0VmVydGljYWxBbGlnbigpOw0KKyAgICB9DQorICAgIGludDMyX3QgaUFzcGVjdCA9IFhGQV9BVFRSSUJVVEVFTlVNX0ZpdDsNCisgICAgaWYgKENYRkFfVmFsdWUgdmFsdWUgPSBtX3BEYXRhQWNjLT5HZXRGb3JtVmFsdWUoKSkgew0KKyAgICAgIGlmIChDWEZBX0ltYWdlIGltYWdlT2JqID0gdmFsdWUuR2V0SW1hZ2UoKSkgew0KKyAgICAgICAgaUFzcGVjdCA9IGltYWdlT2JqLkdldEFzcGVjdCgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpbnQzMl90IGlJbWFnZVhEcGkgPSAwOw0KKyAgICBpbnQzMl90IGlJbWFnZVlEcGkgPSAwOw0KKyAgICBtX3BEYXRhQWNjLT5HZXRJbWFnZUVkaXREcGkoaUltYWdlWERwaSwgaUltYWdlWURwaSk7DQorICAgIFhGQV9EcmF3SW1hZ2UocEdTLCBydEltYWdlLCAmbXRSb3RhdGUsIHBESUJpdG1hcCwgaUFzcGVjdCwgaUltYWdlWERwaSwNCisgICAgICAgICAgICAgICAgICBpSW1hZ2VZRHBpLCBpSG9yekFsaWduLCBpVmVydEFsaWduKTsNCisgIH0NCit9DQorRlhfQk9PTCBDWEZBX0ZGSW1hZ2VFZGl0OjpPbkxCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4pIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKCFQdEluQWN0aXZlUmVjdChmeCwgZnkpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIFNldEJ1dHRvbkRvd24oVFJVRSk7DQorICBDRldMX01zZ01vdXNlIG1zOw0KKyAgbXMubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjsNCisgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7DQorICBtcy5tX2Z4ID0gZng7DQorICBtcy5tX2Z5ID0gZnk7DQorICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcElmYWNlOw0KKyAgRldMVG9DbGllbnQobXMubV9meCwgbXMubV9meSk7DQorICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQorICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBHZXRBcHBQcm92aWRlcigpOw0KKyAgaWYgKCFwQXBwUHJvdmlkZXIpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1RpdGxlOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWx0ZXI7DQorICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoWEZBX0lEU19JbWFnZUZpbHRlciwgd3NGaWx0ZXIpOw0KKyAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c1BhdGhBcnJheTsNCisgIHBBcHBQcm92aWRlci0+U2hvd0ZpbGVEaWFsb2cod3NUaXRsZSwgd3NGaWx0ZXIsIHdzUGF0aEFycmF5KTsNCisgIGludDMyX3QgaVNpemUgPSB3c1BhdGhBcnJheS5HZXRTaXplKCk7DQorICBpZiAoaVNpemUgPCAxKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWxlUGF0aCA9IHdzUGF0aEFycmF5WzBdOw0KKyAgRlhfU1RSU0laRSBuTGVuID0gd3NGaWxlUGF0aC5HZXRMZW5ndGgoKTsNCisgIEZYX1NUUlNJWkUgbkluZGV4ID0gbkxlbiAtIDE7DQorICB3aGlsZSAobkluZGV4ID4gMCAmJiB3c0ZpbGVQYXRoW25JbmRleF0gIT0gJy4nKSB7DQorICAgIG5JbmRleC0tOw0KKyAgfQ0KKyAgaWYgKG5JbmRleCA8PSAwKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZShMImltYWdlLyIpOw0KKyAgd3NDb250ZW50VHlwZSArPSB3c0ZpbGVQYXRoLlJpZ2h0KG5MZW4gLSBuSW5kZXggLSAxKTsNCisgIHdzQ29udGVudFR5cGUuTWFrZUxvd2VyKCk7DQorICBGWENPREVDX0lNQUdFX1RZUEUgZUltYWdlVHlwZSA9IFhGQV9HZXRJbWFnZVR5cGUod3NDb250ZW50VHlwZSk7DQorICBpZiAoZUltYWdlVHlwZSA9PSBGWENPREVDX0lNQUdFX1VOS05PV04pIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0ltYWdlOw0KKyAgSUZYX0ZpbGVSZWFkKiBwRmlsZVJlYWQgPSBGWF9DcmVhdGVGaWxlUmVhZCh3c0ZpbGVQYXRoKTsNCisgIGlmIChwRmlsZVJlYWQgIT0gTlVMTCkgew0KKyAgICBpbnQzMl90IG5EYXRhU2l6ZSA9IHBGaWxlUmVhZC0+R2V0U2l6ZSgpOw0KKyAgICBpZiAobkRhdGFTaXplID4gMCkgew0KKyAgICAgIENGWF9CeXRlU3RyaW5nIGJzQnVmOw0KKyAgICAgIEZYX0NIQVIqIHBJbWFnZUJ1ZmZlciA9IGJzQnVmLkdldEJ1ZmZlcihuRGF0YVNpemUpOw0KKyAgICAgIHBGaWxlUmVhZC0+UmVhZEJsb2NrKHBJbWFnZUJ1ZmZlciwgMCwgbkRhdGFTaXplKTsNCisgICAgICBic0J1Zi5SZWxlYXNlQnVmZmVyKCk7DQorICAgICAgaWYgKCFic0J1Zi5Jc0VtcHR5KCkpIHsNCisgICAgICAgIEZYX0NIQVIqIHBEYXRhID0gWEZBX0Jhc2U2NEVuY29kZShic0J1ZiwgbkRhdGFTaXplKTsNCisgICAgICAgIHdzSW1hZ2UgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBEYXRhKTsNCisgICAgICAgIGlmIChwRGF0YSAhPSBOVUxMKSB7DQorICAgICAgICAgIEZYX0ZyZWUocERhdGEpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBtX3BEYXRhQWNjLT5TZXRJbWFnZUVkaXRJbWFnZShOVUxMKTsNCisgICAgcEZpbGVSZWFkLT5SZWxlYXNlKCk7DQorICB9DQorICBtX3BEYXRhQWNjLT5TZXRJbWFnZUVkaXQod3NDb250ZW50VHlwZSwgQ0ZYX1dpZGVTdHJpbmdDKCksIHdzSW1hZ2UpOw0KKyAgbV9wRGF0YUFjYy0+TG9hZEltYWdlRWRpdEltYWdlKCk7DQorICBBZGRJbnZhbGlkYXRlUmVjdCgpOw0KKyAgbV9wRG9jVmlldy0+U2V0Q2hhbmdlTWFyaygpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ1hGQV9GRkltYWdlRWRpdDo6U2V0RldMUmVjdCgpIHsNCisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9SZWN0RiBydFVJTWFyZ2luOw0KKyAgbV9wRGF0YUFjYy0+R2V0VUlNYXJnaW4ocnRVSU1hcmdpbik7DQorICBDRlhfUmVjdEYgcnRJbWFnZShtX3J0VUkpOw0KKyAgcnRJbWFnZS5EZWZsYXRlKHJ0VUlNYXJnaW4ubGVmdCwgcnRVSU1hcmdpbi50b3AsIHJ0VUlNYXJnaW4ud2lkdGgsDQorICAgICAgICAgICAgICAgICAgcnRVSU1hcmdpbi5oZWlnaHQpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRXaWRnZXRSZWN0KHJ0SW1hZ2UpOw0KK30NCitGWF9CT09MIENYRkFfRkZJbWFnZUVkaXQ6OkNvbW1pdERhdGEoKSB7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGSW1hZ2VFZGl0OjpVcGRhdGVGV0xEYXRhKCkgew0KKyAgbV9wRGF0YUFjYy0+U2V0SW1hZ2VFZGl0SW1hZ2UoTlVMTCk7DQorICBtX3BEYXRhQWNjLT5Mb2FkSW1hZ2VFZGl0SW1hZ2UoKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitpbnQzMl90IENYRkFfRkZJbWFnZUVkaXQ6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgcmV0dXJuIG1fcE9sZERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCit9DQorRldMX0VSUiBDWEZBX0ZGSW1hZ2VFZGl0OjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsNCisgIENYRkFfRkZGaWVsZDo6T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCisgIHJldHVybiBtX3BPbGREZWxlZ2F0ZS0+T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCit9DQorRldMX0VSUiBDWEZBX0ZGSW1hZ2VFZGl0OjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgcmV0dXJuIG1fcE9sZERlbGVnYXRlLT5PbkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmaW1hZ2VlZGl0LmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZpbWFnZWVkaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmIwMzFkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmaW1hZ2VlZGl0LmgKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWEZBX0ZPUk1GSUxMRVJfSU1BR0VFRElUX0lNUF9IDQorI2RlZmluZSBfRlhGQV9GT1JNRklMTEVSX0lNQUdFRURJVF9JTVBfSA0KK2NsYXNzIENYRkFfRkZJbWFnZUVkaXQgOiBwdWJsaWMgQ1hGQV9GRkZpZWxkIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GRkltYWdlRWRpdChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsNCisgIHZpcnR1YWwgfkNYRkFfRkZJbWFnZUVkaXQoKTsNCisNCisgIHZpcnR1YWwgdm9pZCBSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXR1cyA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0ZSA9IDApOw0KKyAgdmlydHVhbCBGWF9CT09MIExvYWRXaWRnZXQoKTsNCisgIHZpcnR1YWwgdm9pZCBVbmxvYWRXaWRnZXQoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIGludDMyX3QgT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKTsNCisgIHZpcnR1YWwgRldMX0VSUiBPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIE9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2aXJ0dWFsIHZvaWQgU2V0RldMUmVjdCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIFVwZGF0ZUZXTERhdGEoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDb21taXREYXRhKCk7DQorICBJRldMX1dpZGdldERlbGVnYXRlKiBtX3BPbGREZWxlZ2F0ZTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZm5vdGlmeS5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZub3RpZnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNzg3NWMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZub3RpZnkuY3BwCkBAIC0wLDAgKzEsNjU3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9jb21tb24uaCINCisjaW5jbHVkZSAieGZhX2Z3bGFkYXB0ZXIuaCINCisjaW5jbHVkZSAieGZhX2ZmZG9jdmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZwYWdldmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXRoYW5kbGVyLmgiDQorI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXQuaCINCisjaW5jbHVkZSAieGZhX2ZmZmllbGQuaCINCisjaW5jbHVkZSAieGZhX2ZmcHVzaGJ1dHRvbi5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZjaGVja2J1dHRvbi5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZjaG9pY2VsaXN0LmgiDQorI2luY2x1ZGUgInhmYV9mZmltYWdlZWRpdC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ0ZXh0ZWRpdC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZiYXJjb2RlLmgiDQorI2luY2x1ZGUgInhmYV9mZmRyYXcuaCINCisjaW5jbHVkZSAieGZhX2ZmdGV4dC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZwYXRoLmgiDQorI2luY2x1ZGUgInhmYV9mZmltYWdlLmgiDQorI2luY2x1ZGUgInhmYV9mZmV4Y2xncm91cC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZzdWJmb3JtLmgiDQorI2luY2x1ZGUgInhmYV9mZnNpZ25hdHVyZS5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZhcHAuaCINCisjaW5jbHVkZSAieGZhX3RleHRsYXlvdXQuaCINCisjaW5jbHVkZSAieGZhX2Zmd2lkZ2V0YWNjLmgiDQorI2luY2x1ZGUgInhmYV9mZm5vdGlmeS5oIg0KKw0KK3N0YXRpYyB2b2lkIFhGQV9GRkRlbGV0ZVdpZGdldEFjYyh2b2lkKiBwRGF0YSkgew0KKyAgZGVsZXRlIHN0YXRpY19jYXN0PENYRkFfV2lkZ2V0QWNjKj4ocERhdGEpOw0KK30NCitzdGF0aWMgWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTyBnc19YRkFEZWxldGVXaWRnZXRBY2MgPSB7DQorICAgIFhGQV9GRkRlbGV0ZVdpZGdldEFjYywgTlVMTH07DQorQ1hGQV9GRk5vdGlmeTo6Q1hGQV9GRk5vdGlmeShDWEZBX0ZGRG9jKiBwRG9jKSA6IG1fcERvYyhwRG9jKSB7fQ0KK0NYRkFfRkZOb3RpZnk6On5DWEZBX0ZGTm90aWZ5KCkge30NCit2b2lkIENYRkFfRkZOb3RpZnk6Ok9uUGFnZUV2ZW50KElYRkFfTGF5b3V0UGFnZSogcFNlbmRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9QQUdFRVZFTlQgZUV2ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtKSB7DQorICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcocFNlbmRlci0+R2V0TGF5b3V0KCkpOw0KKyAgaWYgKCFwRG9jVmlldykgew0KKyAgICByZXR1cm47DQorICB9DQorICBwRG9jVmlldy0+T25QYWdlRXZlbnQocFNlbmRlciwgZUV2ZW50LCAoaW50MzJfdCkodWludHB0cl90KXBQYXJhbSk7DQorfQ0KK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6T25Ob2RlRXZlbnQoQ1hGQV9Ob2RlKiBwU2VuZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX05PREVFVkVOVCBlRXZlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtMywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbTQpIHsNCisgIHN3aXRjaCAoZUV2ZW50KSB7DQorICAgIGNhc2UgWEZBX05PREVFVkVOVF9SZWFkeToNCisgICAgICBPbk5vZGVSZWFkeShwU2VuZGVyKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdpbmc6DQorICAgICAgT25WYWx1ZUNoYW5naW5nKHBTZW5kZXIsIHBQYXJhbSwgcFBhcmFtMik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX05PREVFVkVOVF9WYWx1ZUNoYW5nZWQ6DQorICAgICAgT25WYWx1ZUNoYW5nZWQocFNlbmRlciwgcFBhcmFtLCBwUGFyYW0yLCBwUGFyYW0zLCBwUGFyYW00KTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfTk9ERUVWRU5UX0NoaWxkQWRkZWQ6DQorICAgICAgT25DaGlsZEFkZGVkKHBTZW5kZXIsIHBQYXJhbSwgcFBhcmFtMik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX05PREVFVkVOVF9DaGlsZFJlbW92ZWQ6DQorICAgICAgT25DaGlsZFJlbW92ZWQocFNlbmRlciwgcFBhcmFtLCBwUGFyYW0yKTsNCisgICAgICBicmVhazsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZGTm90aWZ5OjpPbldpZGdldERhdGFFdmVudChDWEZBX1dpZGdldERhdGEqIHBTZW5kZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0V2ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEFkZGl0aW9uYWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwQWRkaXRpb25hbDIpIHsNCisgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gc3RhdGljX2Nhc3Q8Q1hGQV9XaWRnZXRBY2MqPihwU2VuZGVyKTsNCisgIHN3aXRjaCAoZHdFdmVudCkgew0KKyAgICBjYXNlIFhGQV9XSURHRVRFVkVOVF9MaXN0SXRlbUFkZGVkOiB7DQorICAgICAgaWYgKHBXaWRnZXRBY2MtPkdldFVJVHlwZSgpICE9IFhGQV9FTEVNRU5UX0Nob2ljZUxpc3QpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgICAgRlhfQk9PTCBiU3RhdGljTm90aWZ5ID0gcFdpZGdldEFjYy0+R2V0RG9jVmlldygpLT5Jc1N0YXRpY05vdGlmeSgpOw0KKyAgICAgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBwV2lkZ2V0QWNjLT5HZXROZXh0V2lkZ2V0KE5VTEwpOw0KKyAgICAgIGlmICghcFdpZGdldCkgew0KKyAgICAgICAgaWYgKGJTdGF0aWNOb3RpZnkpIHsNCisgICAgICAgICAgcFdpZGdldEFjYy0+R2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCktPldpZGdldEV2ZW50KA0KKyAgICAgICAgICAgICAgcFdpZGdldCwgcFdpZGdldEFjYywgWEZBX1dJREdFVEVWRU5UX0xpc3RJdGVtQWRkZWQsIHBQYXJhbSwNCisgICAgICAgICAgICAgIHBBZGRpdGlvbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgICAgd2hpbGUgKHBXaWRnZXQpIHsNCisgICAgICAgIGlmIChwV2lkZ2V0LT5Jc0xvYWRlZCgpKSB7DQorICAgICAgICAgIGlmIChwV2lkZ2V0QWNjLT5Jc0xpc3RCb3goKSkgew0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PENYRkFfRkZMaXN0Qm94Kj4ocFdpZGdldCkNCisgICAgICAgICAgICAgICAgLT5JbnNlcnRJdGVtKChjb25zdCBDRlhfV2lkZVN0cmluZ0MmKShjb25zdCBGWF9XQ0hBUiopcFBhcmFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpKHVpbnRwdHJfdClwQWRkaXRpb25hbDIpOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PENYRkFfRkZDb21ib0JveCo+KHBXaWRnZXQpDQorICAgICAgICAgICAgICAgIC0+SW5zZXJ0SXRlbSgoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJikoY29uc3QgRlhfV0NIQVIqKXBQYXJhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KSh1aW50cHRyX3QpcEFkZGl0aW9uYWwyKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGJTdGF0aWNOb3RpZnkpIHsNCisgICAgICAgICAgcFdpZGdldEFjYy0+R2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCktPldpZGdldEV2ZW50KA0KKyAgICAgICAgICAgICAgcFdpZGdldCwgcFdpZGdldEFjYywgWEZBX1dJREdFVEVWRU5UX0xpc3RJdGVtQWRkZWQsIHBQYXJhbSwNCisgICAgICAgICAgICAgIHBBZGRpdGlvbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHBXaWRnZXQgPSBwV2lkZ2V0QWNjLT5HZXROZXh0V2lkZ2V0KHBXaWRnZXQpOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBYRkFfV0lER0VURVZFTlRfTGlzdEl0ZW1SZW1vdmVkOiB7DQorICAgICAgaWYgKHBXaWRnZXRBY2MtPkdldFVJVHlwZSgpICE9IFhGQV9FTEVNRU5UX0Nob2ljZUxpc3QpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgICAgRlhfQk9PTCBiU3RhdGljTm90aWZ5ID0gcFdpZGdldEFjYy0+R2V0RG9jVmlldygpLT5Jc1N0YXRpY05vdGlmeSgpOw0KKyAgICAgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBwV2lkZ2V0QWNjLT5HZXROZXh0V2lkZ2V0KE5VTEwpOw0KKyAgICAgIGlmICghcFdpZGdldCkgew0KKyAgICAgICAgaWYgKGJTdGF0aWNOb3RpZnkpIHsNCisgICAgICAgICAgcFdpZGdldEFjYy0+R2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCktPldpZGdldEV2ZW50KA0KKyAgICAgICAgICAgICAgcFdpZGdldCwgcFdpZGdldEFjYywgWEZBX1dJREdFVEVWRU5UX0xpc3RJdGVtUmVtb3ZlZCwgcFBhcmFtLA0KKyAgICAgICAgICAgICAgcEFkZGl0aW9uYWwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgICB3aGlsZSAocFdpZGdldCkgew0KKyAgICAgICAgaWYgKHBXaWRnZXQtPklzTG9hZGVkKCkpIHsNCisgICAgICAgICAgaWYgKHBXaWRnZXRBY2MtPklzTGlzdEJveCgpKSB7DQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1hGQV9GRkxpc3RCb3gqPihwV2lkZ2V0KQ0KKyAgICAgICAgICAgICAgICAtPkRlbGV0ZUl0ZW0oKGludDMyX3QpKHVpbnRwdHJfdClwUGFyYW0pOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PENYRkFfRkZDb21ib0JveCo+KHBXaWRnZXQpDQorICAgICAgICAgICAgICAgIC0+RGVsZXRlSXRlbSgoaW50MzJfdCkodWludHB0cl90KXBQYXJhbSk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChiU3RhdGljTm90aWZ5KSB7DQorICAgICAgICAgIHBXaWRnZXRBY2MtPkdldERvYygpLT5HZXREb2NQcm92aWRlcigpLT5XaWRnZXRFdmVudCgNCisgICAgICAgICAgICAgIHBXaWRnZXQsIHBXaWRnZXRBY2MsIFhGQV9XSURHRVRFVkVOVF9MaXN0SXRlbVJlbW92ZWQsIHBQYXJhbSwNCisgICAgICAgICAgICAgIHBBZGRpdGlvbmFsKTsNCisgICAgICAgIH0NCisgICAgICAgIHBXaWRnZXQgPSBwV2lkZ2V0QWNjLT5HZXROZXh0V2lkZ2V0KHBXaWRnZXQpOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgIH0NCit9DQorQ1hGQV9MYXlvdXRJdGVtKiBDWEZBX0ZGTm90aWZ5OjpPbkNyZWF0ZUxheW91dEl0ZW0oQ1hGQV9Ob2RlKiBwTm9kZSkgew0KKyAgSVhGQV9Eb2NMYXlvdXQqIHBMYXlvdXQgPSBtX3BEb2MtPkdldFhGQURvYygpLT5HZXREb2NMYXlvdXQoKTsNCisgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldyhwTGF5b3V0KTsNCisgIFhGQV9FTEVNRU5UIGVUeXBlID0gcE5vZGUtPkdldENsYXNzSUQoKTsNCisgIGlmIChlVHlwZSA9PSBYRkFfRUxFTUVOVF9QYWdlQXJlYSkgew0KKyAgICByZXR1cm4gbmV3IENYRkFfRkZQYWdlVmlldyhwRG9jVmlldywgcE5vZGUpOw0KKyAgfQ0KKyAgaWYgKGVUeXBlID09IFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSB7DQorICAgIHJldHVybiBuZXcgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKHBOb2RlKTsNCisgIH0NCisgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gc3RhdGljX2Nhc3Q8Q1hGQV9XaWRnZXRBY2MqPihwTm9kZS0+R2V0V2lkZ2V0RGF0YSgpKTsNCisgIGlmICghcEFjYykgew0KKyAgICByZXR1cm4gbmV3IENYRkFfQ29udGVudExheW91dEl0ZW0ocE5vZGUpOw0KKyAgfQ0KKyAgQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcgPSBOVUxMOw0KKyAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IE5VTEw7DQorICBzd2l0Y2ggKHBBY2MtPkdldFVJVHlwZSgpKSB7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfQmFyY29kZToNCisgICAgICBwV2lkZ2V0ID0gbmV3IENYRkFfRkZCYXJjb2RlKHBQYWdlVmlldywgcEFjYyk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfQnV0dG9uOg0KKyAgICAgIHBXaWRnZXQgPSBuZXcgQ1hGQV9GRlB1c2hCdXR0b24ocFBhZ2VWaWV3LCBwQWNjKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9DaGVja0J1dHRvbjoNCisgICAgICBwV2lkZ2V0ID0gbmV3IENYRkFfRkZDaGVja0J1dHRvbihwUGFnZVZpZXcsIHBBY2MpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0Nob2ljZUxpc3Q6IHsNCisgICAgICBpZiAocEFjYy0+SXNMaXN0Qm94KCkpIHsNCisgICAgICAgIHBXaWRnZXQgPSBuZXcgQ1hGQV9GRkxpc3RCb3gocFBhZ2VWaWV3LCBwQWNjKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcFdpZGdldCA9IG5ldyBDWEZBX0ZGQ29tYm9Cb3gocFBhZ2VWaWV3LCBwQWNjKTsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfRGF0ZVRpbWVFZGl0Og0KKyAgICAgIHBXaWRnZXQgPSBuZXcgQ1hGQV9GRkRhdGVUaW1lRWRpdChwUGFnZVZpZXcsIHBBY2MpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0ltYWdlRWRpdDoNCisgICAgICBwV2lkZ2V0ID0gbmV3IENYRkFfRkZJbWFnZUVkaXQocFBhZ2VWaWV3LCBwQWNjKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9OdW1lcmljRWRpdDoNCisgICAgICBwV2lkZ2V0ID0gbmV3IENYRkFfRkZOdW1lcmljRWRpdChwUGFnZVZpZXcsIHBBY2MpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX1Bhc3N3b3JkRWRpdDoNCisgICAgICBwV2lkZ2V0ID0gbmV3IENYRkFfRkZQYXNzd29yZEVkaXQocFBhZ2VWaWV3LCBwQWNjKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9TaWduYXR1cmU6DQorICAgICAgcFdpZGdldCA9IG5ldyBDWEZBX0ZGU2lnbmF0dXJlKHBQYWdlVmlldywgcEFjYyk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfVGV4dEVkaXQ6DQorICAgICAgcFdpZGdldCA9IG5ldyBDWEZBX0ZGVGV4dEVkaXQocFBhZ2VWaWV3LCBwQWNjKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9BcmM6DQorICAgICAgcFdpZGdldCA9IG5ldyBDWEZBX0ZGQXJjKHBQYWdlVmlldywgcEFjYyk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfTGluZToNCisgICAgICBwV2lkZ2V0ID0gbmV3IENYRkFfRkZMaW5lKHBQYWdlVmlldywgcEFjYyk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfUmVjdGFuZ2xlOg0KKyAgICAgIHBXaWRnZXQgPSBuZXcgQ1hGQV9GRlJlY3RhbmdsZShwUGFnZVZpZXcsIHBBY2MpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX1RleHQ6DQorICAgICAgcFdpZGdldCA9IG5ldyBDWEZBX0ZGVGV4dChwUGFnZVZpZXcsIHBBY2MpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0ltYWdlOg0KKyAgICAgIHBXaWRnZXQgPSBuZXcgQ1hGQV9GRkltYWdlKHBQYWdlVmlldywgcEFjYyk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfRHJhdzoNCisgICAgICBwV2lkZ2V0ID0gbmV3IENYRkFfRkZEcmF3KHBQYWdlVmlldywgcEFjYyk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfU3ViZm9ybToNCisgICAgICBwV2lkZ2V0ID0gbmV3IENYRkFfRkZTdWJGb3JtKHBQYWdlVmlldywgcEFjYyk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfRXhjbEdyb3VwOg0KKyAgICAgIHBXaWRnZXQgPSBuZXcgQ1hGQV9GRkV4Y2xHcm91cChwUGFnZVZpZXcsIHBBY2MpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0RlZmF1bHRVaToNCisgICAgZGVmYXVsdDoNCisgICAgICBwV2lkZ2V0ID0gTlVMTDsNCisgICAgICBicmVhazsNCisgIH0NCisgIGlmICghcFdpZGdldCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHBXaWRnZXQtPlNldERvY1ZpZXcocERvY1ZpZXcpOw0KKyAgcmV0dXJuIHBXaWRnZXQ7DQorfQ0KK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6T25MYXlvdXRFdmVudChJWEZBX0RvY0xheW91dCogcExheW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9MYXlvdXRJdGVtKiBwU2VuZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTEFZT1VURVZFTlQgZUV2ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbTIpIHsNCisgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldyhwTGF5b3V0KTsNCisgIGlmICghcERvY1ZpZXcgfHwgIVhGQV9HZXRXaWRnZXRGcm9tTGF5b3V0SXRlbShwU2VuZGVyKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBzd2l0Y2ggKGVFdmVudCkgew0KKyAgICBjYXNlIFhGQV9MQVlPVVRFVkVOVF9JdGVtQWRkZWQ6DQorICAgICAgT25MYXlvdXRJdGVtQWRkKHBEb2NWaWV3LCBwTGF5b3V0LCBwU2VuZGVyLCBwUGFyYW0sIHBQYXJhbTIpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9MQVlPVVRFVkVOVF9JdGVtUmVtb3Zpbmc6DQorICAgICAgT25MYXlvdXRJdGVtUmVtb3ZpbmcocERvY1ZpZXcsIHBMYXlvdXQsIHBTZW5kZXIsIHBQYXJhbSwgcFBhcmFtMik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0xBWU9VVEVWRU5UX1JlY3RDaGFuZ2VkOg0KKyAgICAgIE9uTGF5b3V0SXRlbVJlY3RDaGFuZ2VkKHBEb2NWaWV3LCBwTGF5b3V0LCBwU2VuZGVyLCBwUGFyYW0sIHBQYXJhbTIpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9MQVlPVVRFVkVOVF9TdGF0dXNDaGFuZ2VkOg0KKyAgICAgIE9uTGF5b3V0SXRlbVN0YXR1c3RDaGFuZ2VkKHBEb2NWaWV3LCBwTGF5b3V0LCBwU2VuZGVyLCBwUGFyYW0sIHBQYXJhbTIpOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRkZOb3RpZnk6OlN0YXJ0RmllbGREcmF3TGF5b3V0KENYRkFfTm9kZSogcEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkNhbGNXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmQ2FsY0hlaWdodCkgew0KKyAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBzdGF0aWNfY2FzdDxDWEZBX1dpZGdldEFjYyo+KHBJdGVtLT5HZXRXaWRnZXREYXRhKCkpOw0KKyAgaWYgKCFwQWNjKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBBY2MtPlN0YXJ0V2lkZ2V0TGF5b3V0KGZDYWxjV2lkdGgsIGZDYWxjSGVpZ2h0KTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGTm90aWZ5OjpGaW5kU3BsaXRQb3MoQ1hGQV9Ob2RlKiBwSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCbG9ja0luZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmQ2FsY0hlaWdodFBvcykgew0KKyAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBzdGF0aWNfY2FzdDxDWEZBX1dpZGdldEFjYyo+KHBJdGVtLT5HZXRXaWRnZXREYXRhKCkpOw0KKyAgaWYgKCFwQWNjKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiAoWEZBX0xBWU9VVFJFU1VMVClwQWNjLT5GaW5kU3BsaXRQb3MoaUJsb2NrSW5kZXgsIGZDYWxjSGVpZ2h0UG9zKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGTm90aWZ5OjpSdW5TY3JpcHQoQ1hGQV9Ob2RlKiBwU2NyaXB0LCBDWEZBX05vZGUqIHBGb3JtSXRlbSkgew0KKyAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7DQorICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsNCisgIGlmICghcERvY1ZpZXcpIHsNCisgICAgcmV0dXJuIGJSZXQ7DQorICB9DQorICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9DQorICAgICAgc3RhdGljX2Nhc3Q8Q1hGQV9XaWRnZXRBY2MqPihwRm9ybUl0ZW0tPkdldFdpZGdldERhdGEoKSk7DQorICBpZiAoIXBXaWRnZXRBY2MpIHsNCisgICAgcmV0dXJuIGJSZXQ7DQorICB9DQorICBDWEZBX0V2ZW50UGFyYW0gRXZlbnRQYXJhbTsNCisgIEV2ZW50UGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9Vbmtub3duOw0KKyAgRlhKU0VfSFZBTFVFIHBSZXRWYWx1ZSA9IE5VTEw7DQorICBpbnQzMl90IGlSZXQgPQ0KKyAgICAgIHBXaWRnZXRBY2MtPkV4ZWN1dGVTY3JpcHQoQ1hGQV9TY3JpcHQocFNjcmlwdCksICZFdmVudFBhcmFtLCAmcFJldFZhbHVlKTsNCisgIGlmIChpUmV0ID09IFhGQV9FVkVOVEVSUk9SX1N1Y2VzcyAmJiBwUmV0VmFsdWUpIHsNCisgICAgYlJldCA9IEZYSlNFX1ZhbHVlX1RvQm9vbGVhbihwUmV0VmFsdWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHBSZXRWYWx1ZSk7DQorICB9DQorICByZXR1cm4gYlJldDsNCit9DQoraW50MzJfdCBDWEZBX0ZGTm90aWZ5OjpFeGVjRXZlbnRCeURlZXBGaXJzdChDWEZBX05vZGUqIHBGb3JtTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FVkVOVFRZUEUgZUV2ZW50VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYklzRm9ybVJlYWR5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmVjdXJzaXZlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBFeGNsdWRlKSB7DQorICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsNCisgIGlmICghcERvY1ZpZXcpIHsNCisgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KKyAgfQ0KKyAgcmV0dXJuIHBEb2NWaWV3LT5FeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KA0KKyAgICAgIHBGb3JtTm9kZSwgZUV2ZW50VHlwZSwgYklzRm9ybVJlYWR5LCBiUmVjdXJzaXZlLA0KKyAgICAgIHBFeGNsdWRlID8gcEV4Y2x1ZGUtPkdldE5vZGUoKSA6IE5VTEwpOw0KK30NCit2b2lkIENYRkFfRkZOb3RpZnk6OkFkZENhbGNWYWxpZGF0ZShDWEZBX05vZGUqIHBOb2RlKSB7DQorICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsNCisgIGlmICghcERvY1ZpZXcpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPQ0KKyAgICAgIHN0YXRpY19jYXN0PENYRkFfV2lkZ2V0QWNjKj4ocE5vZGUtPkdldFdpZGdldERhdGEoKSk7DQorICBpZiAoIXBXaWRnZXRBY2MpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgcERvY1ZpZXctPkFkZENhbGN1bGF0ZVdpZGdldEFjYyhwV2lkZ2V0QWNjKTsNCisgIHBEb2NWaWV3LT5BZGRWYWxpZGF0ZVdpZGdldChwV2lkZ2V0QWNjKTsNCit9DQorSVhGQV9Eb2MqIENYRkFfRkZOb3RpZnk6OkdldEhET0MoKSB7DQorICByZXR1cm4gbV9wRG9jOw0KK30NCitJWEZBX0RvY1Byb3ZpZGVyKiBDWEZBX0ZGTm90aWZ5OjpHZXREb2NQcm92aWRlcigpIHsNCisgIHJldHVybiBtX3BEb2MtPkdldERvY1Byb3ZpZGVyKCk7DQorfQ0KK0lYRkFfQXBwUHJvdmlkZXIqIENYRkFfRkZOb3RpZnk6OkdldEFwcFByb3ZpZGVyKCkgew0KKyAgcmV0dXJuIG1fcERvYy0+R2V0QXBwKCktPkdldEFwcFByb3ZpZGVyKCk7DQorfQ0KK0lYRkFfV2lkZ2V0SGFuZGxlciogQ1hGQV9GRk5vdGlmeTo6R2V0V2lkZ2V0SGFuZGxlcigpIHsNCisgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOw0KKyAgcmV0dXJuIHBEb2NWaWV3ID8gcERvY1ZpZXctPkdldFdpZGdldEhhbmRsZXIoKSA6IE5VTEw7DQorfQ0KK0lYRkFfV2lkZ2V0KiBDWEZBX0ZGTm90aWZ5OjpHZXRIV2lkZ2V0KENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0pIHsNCisgIHJldHVybiBYRkFfR2V0V2lkZ2V0RnJvbUxheW91dEl0ZW0ocExheW91dEl0ZW0pOw0KK30NCit2b2lkIENYRkFfRkZOb3RpZnk6Ok9wZW5Ecm9wRG93bkxpc3QoSVhGQV9XaWRnZXQqIGhXaWRnZXQpIHsNCisgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCk7DQorICBpZiAocFdpZGdldC0+R2V0RGF0YUFjYygpLT5HZXRVSVR5cGUoKSAhPSBYRkFfRUxFTUVOVF9DaG9pY2VMaXN0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOw0KKyAgcERvY1ZpZXctPkxvY2tVcGRhdGUoKTsNCisgIHN0YXRpY19jYXN0PENYRkFfRkZDb21ib0JveCo+KHBXaWRnZXQpLT5PcGVuRHJvcERvd25MaXN0KCk7DQorICBwRG9jVmlldy0+VW5sb2NrVXBkYXRlKCk7DQorICBwRG9jVmlldy0+VXBkYXRlRG9jVmlldygpOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX0ZGTm90aWZ5OjpHZXRDdXJyZW50RGF0ZVRpbWUoKSB7DQorICBDRlhfVW5pdGltZSBkYXRhVGltZTsNCisgIGRhdGFUaW1lLk5vdygpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlVGltZTsNCisgIHdzRGF0ZVRpbWUuRm9ybWF0KEwiJWQlMDJkJTAyZFQlMDJkJTAyZCUwMmQiLCBkYXRhVGltZS5HZXRZZWFyKCksDQorICAgICAgICAgICAgICAgICAgICBkYXRhVGltZS5HZXRNb250aCgpLCBkYXRhVGltZS5HZXREYXkoKSwgZGF0YVRpbWUuR2V0SG91cigpLA0KKyAgICAgICAgICAgICAgICAgICAgZGF0YVRpbWUuR2V0TWludXRlKCksIGRhdGFUaW1lLkdldFNlY29uZCgpKTsNCisgIHJldHVybiB3c0RhdGVUaW1lOw0KK30NCit2b2lkIENYRkFfRkZOb3RpZnk6OlJlc2V0RGF0YShDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhKSB7DQorICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsNCisgIGlmICghcERvY1ZpZXcpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgcERvY1ZpZXctPlJlc2V0V2lkZ2V0RGF0YShzdGF0aWNfY2FzdDxDWEZBX1dpZGdldEFjYyo+KHBXaWRnZXREYXRhKSk7DQorfQ0KK2ludDMyX3QgQ1hGQV9GRk5vdGlmeTo6R2V0TGF5b3V0U3RhdHVzKCkgew0KKyAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7DQorICByZXR1cm4gcERvY1ZpZXcgPyBwRG9jVmlldy0+R2V0TGF5b3V0U3RhdHVzKCkgOiAwOw0KK30NCit2b2lkIENYRkFfRkZOb3RpZnk6OlJ1bk5vZGVJbml0aWFsaXplKENYRkFfTm9kZSogcE5vZGUpIHsNCisgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOw0KKyAgaWYgKCFwRG9jVmlldykgew0KKyAgICByZXR1cm47DQorICB9DQorICBwRG9jVmlldy0+QWRkTmV3Rm9ybU5vZGUocE5vZGUpOw0KK30NCit2b2lkIENYRkFfRkZOb3RpZnk6OlJ1blN1YmZvcm1JbmRleENoYW5nZShDWEZBX05vZGUqIHBTdWJmb3JtTm9kZSkgew0KKyAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7DQorICBpZiAoIXBEb2NWaWV3KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBEb2NWaWV3LT5BZGRJbmRleENoYW5nZWRTdWJmb3JtKHBTdWJmb3JtTm9kZSk7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9GRk5vdGlmeTo6R2V0Rm9jdXNXaWRnZXROb2RlKCkgew0KKyAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7DQorICBpZiAoIXBEb2NWaWV3KSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBwRG9jVmlldy0+R2V0Rm9jdXNXaWRnZXRBY2MoKTsNCisgIHJldHVybiBwQWNjID8gcEFjYy0+R2V0Tm9kZSgpIDogTlVMTDsNCit9DQordm9pZCBDWEZBX0ZGTm90aWZ5OjpTZXRGb2N1c1dpZGdldE5vZGUoQ1hGQV9Ob2RlKiBwTm9kZSkgew0KKyAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7DQorICBpZiAoIXBEb2NWaWV3KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0NCisgICAgICBwTm9kZSA/IHN0YXRpY19jYXN0PENYRkFfV2lkZ2V0QWNjKj4ocE5vZGUtPkdldFdpZGdldERhdGEoKSkgOiBudWxscHRyOw0KKyAgcERvY1ZpZXctPlNldEZvY3VzV2lkZ2V0QWNjKHBBY2MpOw0KK30NCit2b2lkIENYRkFfRkZOb3RpZnk6Ok9uTm9kZVJlYWR5KENYRkFfTm9kZSogcE5vZGUpIHsNCisgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOw0KKyAgaWYgKCFwRG9jVmlldykgew0KKyAgICByZXR1cm47DQorICB9DQorICBYRkFfRUxFTUVOVCBpVHlwZSA9IHBOb2RlLT5HZXRDbGFzc0lEKCk7DQorICBpZiAoWEZBX0lzQ3JlYXRlV2lkZ2V0KGlUeXBlKSkgew0KKyAgICBDWEZBX1dpZGdldEFjYyogcEFjYyA9DQorICAgICAgICBuZXcgQ1hGQV9XaWRnZXRBY2MocERvY1ZpZXcsIHN0YXRpY19jYXN0PENYRkFfTm9kZSo+KHBOb2RlKSk7DQorICAgIHBOb2RlLT5TZXRPYmplY3QoWEZBX0FUVFJJQlVURV9XaWRnZXREYXRhLCBwQWNjLCAmZ3NfWEZBRGVsZXRlV2lkZ2V0QWNjKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgc3dpdGNoIChpVHlwZSkgew0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0JpbmRJdGVtczoNCisgICAgICBwRG9jVmlldy0+bV9iaW5kSXRlbXMuQWRkKHBOb2RlKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9WYWxpZGF0ZTogew0KKyAgICAgIHBOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19OZWVkc0luaXRBcHAsIFRSVUUsIEZBTFNFKTsNCisgICAgfSBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZGTm90aWZ5OjpPblZhbHVlQ2hhbmdpbmcoQ1hGQV9Ob2RlKiBwU2VuZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0yKSB7DQorICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsNCisgIGlmICghcERvY1ZpZXcpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKHBEb2NWaWV3LT5HZXRMYXlvdXRTdGF0dXMoKSA8IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19FbmQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfRFdPUkQgZHdQYWNrZXQgPSBwU2VuZGVyLT5HZXRQYWNrZXRJRCgpOw0KKyAgaWYgKGR3UGFja2V0ICYgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cykgew0KKyAgfSBlbHNlIGlmIChwU2VuZGVyLT5Jc0Zvcm1Db250YWluZXIoKSkgew0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyID0gKFhGQV9BVFRSSUJVVEUpKHVpbnRwdHJfdClwUGFyYW07DQorICAgIGlmIChlQXR0ciA9PSBYRkFfQVRUUklCVVRFX1ByZXNlbmNlKSB7DQorICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPQ0KKyAgICAgICAgICBzdGF0aWNfY2FzdDxDWEZBX1dpZGdldEFjYyo+KHBTZW5kZXItPkdldFdpZGdldERhdGEoKSk7DQorICAgICAgaWYgKCFwV2lkZ2V0QWNjKSB7DQorICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICAgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBOVUxMOw0KKyAgICAgIHdoaWxlICgocFdpZGdldCA9IHBXaWRnZXRBY2MtPkdldE5leHRXaWRnZXQocFdpZGdldCkpICE9IE5VTEwpIHsNCisgICAgICAgIGlmIChwV2lkZ2V0LT5Jc0xvYWRlZCgpKSB7DQorICAgICAgICAgIHBXaWRnZXQtPkFkZEludmFsaWRhdGVSZWN0KCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6T25WYWx1ZUNoYW5nZWQoQ1hGQV9Ob2RlKiBwU2VuZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbTMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW00KSB7DQorICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsNCisgIGlmICghcERvY1ZpZXcpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfRFdPUkQgZHdQYWNrZXQgPSBwU2VuZGVyLT5HZXRQYWNrZXRJRCgpOw0KKyAgWEZBX0FUVFJJQlVURSBlQXR0ciA9IChYRkFfQVRUUklCVVRFKSh1aW50cHRyX3QpcFBhcmFtOw0KKyAgaWYgKGR3UGFja2V0ICYgWEZBX1hEUFBBQ0tFVF9Gb3JtKSB7DQorICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBzdGF0aWNfY2FzdDxDWEZBX05vZGUqPihwUGFyYW0zKTsNCisgICAgQ1hGQV9Ob2RlKiBwV2lkZ2V0Tm9kZSA9IHN0YXRpY19jYXN0PENYRkFfTm9kZSo+KHBQYXJhbTQpOw0KKyAgICBYRkFfRUxFTUVOVCBlUFR5cGUgPSBwUGFyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICBGWF9CT09MIGJJc0NvbnRhaW5lck5vZGUgPSBwUGFyZW50Tm9kZS0+SXNDb250YWluZXJOb2RlKCk7DQorICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0NCisgICAgICAgIHN0YXRpY19jYXN0PENYRkFfV2lkZ2V0QWNjKj4ocFdpZGdldE5vZGUtPkdldFdpZGdldERhdGEoKSk7DQorICAgIGlmICghcFdpZGdldEFjYykgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJVcGRhdGVQcm9wZXJ0eSA9IEZBTFNFOw0KKyAgICBwRG9jVmlldy0+U2V0Q2hhbmdlTWFyaygpOw0KKyAgICBzd2l0Y2ggKGVQVHlwZSkgew0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQ2FwdGlvbjogew0KKyAgICAgICAgQ1hGQV9UZXh0TGF5b3V0KiBwQ2FwT3V0ID0gcFdpZGdldEFjYy0+R2V0Q2FwdGlvblRleHRMYXlvdXQoKTsNCisgICAgICAgIGlmICghcENhcE91dCkgew0KKyAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBwQ2FwT3V0LT5VbmxvYWQoKTsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfVWk6DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9QYXJhOg0KKyAgICAgICAgYlVwZGF0ZVByb3BlcnR5ID0gVFJVRTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRm9udDoNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX01hcmdpbjoNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX1ZhbHVlOg0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfSXRlbXM6DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKGJJc0NvbnRhaW5lck5vZGUgJiYgZUF0dHIgPT0gWEZBX0FUVFJJQlVURV9BY2Nlc3MpIHsNCisgICAgICBiVXBkYXRlUHJvcGVydHkgPSBUUlVFOw0KKyAgICAgIEZYX0JPT0wgYk5vdGlmeSA9IHBEb2NWaWV3LT5Jc1N0YXRpY05vdGlmeSgpOw0KKyAgICAgIGlmIChiTm90aWZ5KSB7DQorICAgICAgICBwV2lkZ2V0QWNjLT5Ob3RpZnlFdmVudChYRkFfV0lER0VURVZFTlRfQWNjZXNzQ2hhbmdlZCwgTlVMTCwgcFBhcmFtMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoZUF0dHIgPT0gWEZBX0FUVFJJQlVURV9WYWx1ZSkgew0KKyAgICAgIHBEb2NWaWV3LT5BZGRDYWxjdWxhdGVOb2RlTm90aWZ5KHBTZW5kZXIpOw0KKyAgICAgIGlmIChlUFR5cGUgPT0gWEZBX0VMRU1FTlRfVmFsdWUgfHwgYklzQ29udGFpbmVyTm9kZSkgew0KKyAgICAgICAgRlhfQk9PTCBiTm90aWZ5ID0gcERvY1ZpZXctPklzU3RhdGljTm90aWZ5KCk7DQorICAgICAgICBpZiAoYklzQ29udGFpbmVyTm9kZSkgew0KKyAgICAgICAgICBwV2lkZ2V0QWNjLT5VcGRhdGVVSURpc3BsYXkoKTsNCisgICAgICAgICAgcERvY1ZpZXctPkFkZENhbGN1bGF0ZVdpZGdldEFjYyhwV2lkZ2V0QWNjKTsNCisgICAgICAgICAgcERvY1ZpZXctPkFkZFZhbGlkYXRlV2lkZ2V0KHBXaWRnZXRBY2MpOw0KKyAgICAgICAgfSBlbHNlIGlmIChwV2lkZ2V0Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkNCisgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cCkgew0KKyAgICAgICAgICBwV2lkZ2V0QWNjLT5VcGRhdGVVSURpc3BsYXkoKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChiTm90aWZ5KSB7DQorICAgICAgICAgIHBXaWRnZXRBY2MtPk5vdGlmeUV2ZW50KFhGQV9XSURHRVRFVkVOVF9Qb3N0Q29udGVudENoYW5nZWQsIE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gTlVMTDsNCisgICAgd2hpbGUgKChwV2lkZ2V0ID0gcFdpZGdldEFjYy0+R2V0TmV4dFdpZGdldChwV2lkZ2V0KSkgIT0gTlVMTCkgew0KKyAgICAgIGlmICghcFdpZGdldC0+SXNMb2FkZWQoKSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmIChiVXBkYXRlUHJvcGVydHkpIHsNCisgICAgICAgIHBXaWRnZXQtPlVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQorICAgICAgfQ0KKyAgICAgIHBXaWRnZXQtPlBlcmZvcm1MYXlvdXQoKTsNCisgICAgICBwV2lkZ2V0LT5BZGRJbnZhbGlkYXRlUmVjdCgpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBpZiAoZUF0dHIgPT0gWEZBX0FUVFJJQlVURV9WYWx1ZSkgew0KKyAgICAgIHBEb2NWaWV3LT5BZGRDYWxjdWxhdGVOb2RlTm90aWZ5KHBTZW5kZXIpOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6T25DaGlsZEFkZGVkKENYRkFfTm9kZSogcFNlbmRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtMikgew0KKyAgaWYgKCFwU2VuZGVyLT5Jc0Zvcm1Db250YWluZXIoKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsNCisgIGlmICghcERvY1ZpZXcpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfQk9PTCBiTGF5b3V0UmVhZHkgPQ0KKyAgICAgICEocERvY1ZpZXctPm1fYkluTGF5b3V0U3RhdHVzKSAmJg0KKyAgICAgIChwRG9jVmlldy0+R2V0TGF5b3V0U3RhdHVzKCkgPj0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0VuZCk7DQorICBpZiAoYkxheW91dFJlYWR5KSB7DQorICAgIG1fcERvYy0+R2V0RG9jUHJvdmlkZXIoKS0+U2V0Q2hhbmdlTWFyayhtX3BEb2MpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRkZOb3RpZnk6Ok9uQ2hpbGRSZW1vdmVkKENYRkFfTm9kZSogcFNlbmRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbTIpIHsNCisgIGlmIChDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKSkgew0KKyAgICBGWF9CT09MIGJMYXlvdXRSZWFkeSA9DQorICAgICAgICAhKHBEb2NWaWV3LT5tX2JJbkxheW91dFN0YXR1cykgJiYNCisgICAgICAgIChwRG9jVmlldy0+R2V0TGF5b3V0U3RhdHVzKCkgPj0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0VuZCk7DQorICAgIGlmIChiTGF5b3V0UmVhZHkpIHsNCisgICAgICBtX3BEb2MtPkdldERvY1Byb3ZpZGVyKCktPlNldENoYW5nZU1hcmsobV9wRG9jKTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENYRkFfRkZOb3RpZnk6Ok9uTGF5b3V0SXRlbUFkZChDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhGQV9Eb2NMYXlvdXQqIHBMYXlvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9MYXlvdXRJdGVtKiBwU2VuZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0yKSB7DQorICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KHBTZW5kZXIpOw0KKyAgaW50MzJfdCBpUGFnZUlkeCA9IChpbnQzMl90KSh1aW50cHRyX3QpcFBhcmFtOw0KKyAgSVhGQV9QYWdlVmlldyogcE5ld1BhZ2VWaWV3ID0gcERvY1ZpZXctPkdldFBhZ2VWaWV3KGlQYWdlSWR4KTsNCisgIEZYX0RXT1JEIGR3U3RhdHVzID0gKEZYX0RXT1JEKSh1aW50cHRyX3QpcFBhcmFtMjsNCisgIEZYX0RXT1JEIGR3RmlsdGVyID0gWEZBX1dJREdFVFNUQVRVU19WaXNpYmxlIHwgWEZBX1dJREdFVFNUQVRVU19WaWV3YWJsZSB8DQorICAgICAgICAgICAgICAgICAgICAgIFhGQV9XSURHRVRTVEFUVVNfUHJpbnRhYmxlOw0KKyAgcFdpZGdldC0+TW9kaWZ5U3RhdHVzKGR3U3RhdHVzLCBkd0ZpbHRlcik7DQorICBpZiAocERvY1ZpZXctPkdldExheW91dFN0YXR1cygpID49IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19FbmQpIHsNCisgICAgSVhGQV9QYWdlVmlldyogcFByZVBhZ2VWaWV3ID0gcFdpZGdldC0+R2V0UGFnZVZpZXcoKTsNCisgICAgaWYgKHBQcmVQYWdlVmlldyAhPSBwTmV3UGFnZVZpZXcgfHwNCisgICAgICAgIChkd1N0YXR1cyAmIChYRkFfV0lER0VUU1RBVFVTX1Zpc2libGUgfCBYRkFfV0lER0VUU1RBVFVTX1ZpZXdhYmxlKSkgPT0NCisgICAgICAgICAgICAoWEZBX1dJREdFVFNUQVRVU19WaXNpYmxlIHwgWEZBX1dJREdFVFNUQVRVU19WaWV3YWJsZSkpIHsNCisgICAgICBwV2lkZ2V0LT5TZXRQYWdlVmlldyhwTmV3UGFnZVZpZXcpOw0KKyAgICAgIG1fcERvYy0+R2V0RG9jUHJvdmlkZXIoKS0+V2lkZ2V0RXZlbnQocFdpZGdldCwgcFdpZGdldC0+R2V0RGF0YUFjYygpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1dJREdFVEVWRU5UX1Bvc3RBZGRlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXdQYWdlVmlldywgcFByZVBhZ2VWaWV3KTsNCisgICAgfQ0KKyAgICBpZiAoKGR3U3RhdHVzICYgWEZBX1dJREdFVFNUQVRVU19WaXNpYmxlKSA9PSAwKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChwV2lkZ2V0LT5Jc0xvYWRlZCgpKSB7DQorICAgICAgQ0ZYX1JlY3RGIHJ0T2xkOw0KKyAgICAgIHBXaWRnZXQtPkdldFdpZGdldFJlY3QocnRPbGQpOw0KKyAgICAgIENGWF9SZWN0RiBydE5ldyA9IHBXaWRnZXQtPlJlQ2FjaGVXaWRnZXRSZWN0KCk7DQorICAgICAgaWYgKHJ0T2xkICE9IHJ0TmV3KSB7DQorICAgICAgICBwV2lkZ2V0LT5QZXJmb3JtTGF5b3V0KCk7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHBXaWRnZXQtPkxvYWRXaWRnZXQoKTsNCisgICAgfQ0KKyAgICBwV2lkZ2V0LT5BZGRJbnZhbGlkYXRlUmVjdChOVUxMKTsNCisgIH0gZWxzZSB7DQorICAgIHBXaWRnZXQtPlNldFBhZ2VWaWV3KHBOZXdQYWdlVmlldyk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6T25MYXlvdXRJdGVtUmVtb3ZpbmcoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhGQV9Eb2NMYXlvdXQqIHBMYXlvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dEl0ZW0qIHBTZW5kZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0yKSB7DQorICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KHBTZW5kZXIpOw0KKyAgcERvY1ZpZXctPkRlbGV0ZUxheW91dEl0ZW0ocFdpZGdldCk7DQorICBpZiAocERvY1ZpZXctPkdldExheW91dFN0YXR1cygpIDwgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0VuZCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBtX3BEb2MtPkdldERvY1Byb3ZpZGVyKCktPldpZGdldEV2ZW50KHBXaWRnZXQsIHBXaWRnZXQtPkdldERhdGFBY2MoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1dJREdFVEVWRU5UX1ByZVJlbW92ZWQsIE5VTEwsIE5VTEwpOw0KKyAgcFdpZGdldC0+QWRkSW52YWxpZGF0ZVJlY3QoTlVMTCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6T25MYXlvdXRJdGVtUmVjdENoYW5nZWQoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhGQV9Eb2NMYXlvdXQqIHBMYXlvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dEl0ZW0qIHBTZW5kZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0yKSB7DQorfQ0KK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6T25MYXlvdXRJdGVtU3RhdHVzdENoYW5nZWQoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhGQV9Eb2NMYXlvdXQqIHBMYXlvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dEl0ZW0qIHBTZW5kZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0yKSB7DQorICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KHBTZW5kZXIpOw0KKyAgaWYgKCFwV2lkZ2V0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0RXT1JEIGR3U3RhdHVzID0gKEZYX0RXT1JEKSh1aW50cHRyX3QpcFBhcmFtOw0KKyAgaWYgKGR3U3RhdHVzID09IDApIHsNCisgICAgQ1hGQV9MYXlvdXRJdGVtKiBwUHJlSXRlbSA9IHBTZW5kZXItPkdldFByZXYoKTsNCisgICAgaWYgKHBQcmVJdGVtKSB7DQorICAgICAgQ1hGQV9GRldpZGdldCogcFByZVdpZGdldCA9IHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihwUHJlSXRlbSk7DQorICAgICAgaWYgKHBQcmVXaWRnZXQpIHsNCisgICAgICAgIGR3U3RhdHVzID0gcFByZVdpZGdldC0+R2V0U3RhdHVzKCk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBGWF9EV09SRCBkd09sZFN0YXR1cyA9IHBXaWRnZXQtPkdldFN0YXR1cygpOw0KKyAgRlhfRFdPUkQgZHdGaWx0ZXIgPSBYRkFfV0lER0VUU1RBVFVTX1Zpc2libGUgfCBYRkFfV0lER0VUU1RBVFVTX1ZpZXdhYmxlIHwNCisgICAgICAgICAgICAgICAgICAgICAgWEZBX1dJREdFVFNUQVRVU19QcmludGFibGU7DQorICBpZiAoKGR3T2xkU3RhdHVzICYgZHdGaWx0ZXIpID09IGR3U3RhdHVzKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBXaWRnZXQtPk1vZGlmeVN0YXR1cyhkd1N0YXR1cywgZHdGaWx0ZXIpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZub3RpZnkuaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZm5vdGlmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NDFiMGQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZub3RpZnkuaApAQCAtMCwwICsxLDk1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYRkFfRkZOT1RJRllfSF8NCisjZGVmaW5lIF9GWEZBX0ZGTk9USUZZX0hfDQorY2xhc3MgQ1hGQV9GRk5vdGlmeSA6IHB1YmxpYyBJWEZBX05vdGlmeSB7DQorIHB1YmxpYzoNCisgIENYRkFfRkZOb3RpZnkoQ1hGQV9GRkRvYyogcERvYyk7DQorICB+Q1hGQV9GRk5vdGlmeSgpOw0KKw0KKyAgdmlydHVhbCB2b2lkIE9uUGFnZUV2ZW50KElYRkFfTGF5b3V0UGFnZSogcFNlbmRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUEFHRUVWRU5UIGVFdmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0gPSBOVUxMKTsNCisNCisgIHZpcnR1YWwgdm9pZCBPbk5vZGVFdmVudChDWEZBX05vZGUqIHBTZW5kZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX05PREVFVkVOVCBlRXZlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0yID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0zID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW00ID0gTlVMTCk7DQorICB2aXJ0dWFsIHZvaWQgT25XaWRnZXREYXRhRXZlbnQoQ1hGQV9XaWRnZXREYXRhKiBwU2VuZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RXZlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwQWRkaXRpb25hbCA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEFkZGl0aW9uYWwyID0gTlVMTCk7DQorICB2aXJ0dWFsIENYRkFfTGF5b3V0SXRlbSogT25DcmVhdGVMYXlvdXRJdGVtKENYRkFfTm9kZSogcE5vZGUpOw0KKyAgdmlydHVhbCB2b2lkIE9uTGF5b3V0RXZlbnQoSVhGQV9Eb2NMYXlvdXQqIHBMYXlvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dEl0ZW0qIHBTZW5kZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTEFZT1VURVZFTlQgZUV2ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbTIgPSBOVUxMKTsNCisNCisgIHZpcnR1YWwgdm9pZCBTdGFydEZpZWxkRHJhd0xheW91dChDWEZBX05vZGUqIHBJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmQ2FsY1dpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmQ2FsY0hlaWdodCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRmluZFNwbGl0UG9zKENYRkFfTm9kZSogcEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJsb2NrSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmQ2FsY0hlaWdodFBvcyk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUnVuU2NyaXB0KENYRkFfTm9kZSogcFNjcmlwdCwgQ1hGQV9Ob2RlKiBwRm9ybUl0ZW0pOw0KKyAgdmlydHVhbCBpbnQzMl90IEV4ZWNFdmVudEJ5RGVlcEZpcnN0KENYRkFfTm9kZSogcEZvcm1Ob2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FVkVOVFRZUEUgZUV2ZW50VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJc0Zvcm1SZWFkeSA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlY3Vyc2l2ZSA9IFRSVUUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBFeGNsdWRlID0gTlVMTCk7DQorICB2aXJ0dWFsIHZvaWQgQWRkQ2FsY1ZhbGlkYXRlKENYRkFfTm9kZSogcE5vZGUpOw0KKyAgdmlydHVhbCBJWEZBX0RvYyogR2V0SERPQygpOw0KKyAgdmlydHVhbCBJWEZBX0RvY1Byb3ZpZGVyKiBHZXREb2NQcm92aWRlcigpOw0KKyAgdmlydHVhbCBJWEZBX0FwcFByb3ZpZGVyKiBHZXRBcHBQcm92aWRlcigpOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldEhhbmRsZXIqIEdldFdpZGdldEhhbmRsZXIoKTsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIEdldEhXaWRnZXQoQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSk7DQorICB2aXJ0dWFsIHZvaWQgT3BlbkRyb3BEb3duTGlzdChJWEZBX1dpZGdldCogaFdpZGdldCk7DQorICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIEdldEN1cnJlbnREYXRlVGltZSgpOw0KKyAgdmlydHVhbCB2b2lkIFJlc2V0RGF0YShDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gTlVMTCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0TGF5b3V0U3RhdHVzKCk7DQorICB2aXJ0dWFsIHZvaWQgUnVuTm9kZUluaXRpYWxpemUoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICB2aXJ0dWFsIHZvaWQgUnVuU3ViZm9ybUluZGV4Q2hhbmdlKENYRkFfTm9kZSogcFN1YmZvcm1Ob2RlKTsNCisgIHZpcnR1YWwgQ1hGQV9Ob2RlKiBHZXRGb2N1c1dpZGdldE5vZGUoKTsNCisgIHZpcnR1YWwgdm9pZCBTZXRGb2N1c1dpZGdldE5vZGUoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgT25Ob2RlUmVhZHkoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICB2b2lkIE9uVmFsdWVDaGFuZ2luZyhDWEZBX05vZGUqIHBTZW5kZXIsIHZvaWQqIHBQYXJhbSwgdm9pZCogcFBhcmFtMik7DQorICB2b2lkIE9uVmFsdWVDaGFuZ2VkKENYRkFfTm9kZSogcFNlbmRlciwNCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtLA0KKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0yLA0KKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0zLA0KKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW00KTsNCisgIHZvaWQgT25DaGlsZEFkZGVkKENYRkFfTm9kZSogcFNlbmRlciwgdm9pZCogcFBhcmFtLCB2b2lkKiBwUGFyYW0yKTsNCisgIHZvaWQgT25DaGlsZFJlbW92ZWQoQ1hGQV9Ob2RlKiBwU2VuZGVyLCB2b2lkKiBwUGFyYW0sIHZvaWQqIHBQYXJhbTIpOw0KKyAgdm9pZCBPbkxheW91dEl0ZW1BZGQoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgSVhGQV9Eb2NMYXlvdXQqIHBMYXlvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dEl0ZW0qIHBTZW5kZXIsDQorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0yKTsNCisgIHZvaWQgT25MYXlvdXRJdGVtUmVtb3ZpbmcoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEZBX0RvY0xheW91dCogcExheW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9MYXlvdXRJdGVtKiBwU2VuZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbTIpOw0KKyAgdm9pZCBPbkxheW91dEl0ZW1SZWN0Q2hhbmdlZChDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElYRkFfRG9jTGF5b3V0KiBwTGF5b3V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dEl0ZW0qIHBTZW5kZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtMik7DQorICB2b2lkIE9uTGF5b3V0SXRlbVN0YXR1c3RDaGFuZ2VkKENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhGQV9Eb2NMYXlvdXQqIHBMYXlvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbSogcFNlbmRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0yKTsNCisgIENYRkFfRkZEb2MqIG1fcERvYzsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnBhZ2V2aWV3LmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnBhZ2V2aWV3LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2ZlNWNkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmcGFnZXZpZXcuY3BwCkBAIC0wLDAgKzEsNDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9jb21tb24uaCINCisjaW5jbHVkZSAieGZhX2Z3bGFkYXB0ZXIuaCINCisjaW5jbHVkZSAieGZhX2ZmcGFnZXZpZXcuaCINCisjaW5jbHVkZSAieGZhX2Zmd2lkZ2V0LmgiDQorI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2N2aWV3LmgiDQorI2luY2x1ZGUgInhmYV9mZmZpZWxkLmgiDQorI2luY2x1ZGUgInhmYV9mZnB1c2hidXR0b24uaCINCisjaW5jbHVkZSAieGZhX2ZmY2hlY2tidXR0b24uaCINCisjaW5jbHVkZSAieGZhX2ZmY2hvaWNlbGlzdC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZpbWFnZWVkaXQuaCINCisjaW5jbHVkZSAieGZhX2ZmdGV4dGVkaXQuaCINCitDWEZBX0ZGUGFnZVZpZXc6OkNYRkFfRkZQYWdlVmlldyhDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcsIENYRkFfTm9kZSogcFBhZ2VBcmVhKQ0KKyAgICA6IENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbShwUGFnZUFyZWEpLA0KKyAgICAgIG1fcERvY1ZpZXcocERvY1ZpZXcpLA0KKyAgICAgIG1fYkxvYWRlZChGQUxTRSkge30NCitDWEZBX0ZGUGFnZVZpZXc6On5DWEZBX0ZGUGFnZVZpZXcoKSB7fQ0KK0lYRkFfRG9jVmlldyogQ1hGQV9GRlBhZ2VWaWV3OjpHZXREb2NWaWV3KCkgew0KKyAgcmV0dXJuIG1fcERvY1ZpZXc7DQorfQ0KK2ludDMyX3QgQ1hGQV9GRlBhZ2VWaWV3OjpHZXRQYWdlVmlld0luZGV4KCkgew0KKyAgcmV0dXJuIEdldFBhZ2VJbmRleCgpOw0KK30NCit2b2lkIENYRkFfRkZQYWdlVmlldzo6R2V0UGFnZVZpZXdSZWN0KENGWF9SZWN0RiYgcnRQYWdlKSB7DQorICBDRlhfU2l6ZUYgc3o7DQorICBHZXRQYWdlU2l6ZShzeik7DQorICBydFBhZ2UuU2V0KDAsIDAsIHN6KTsNCit9DQordm9pZCBDWEZBX0ZGUGFnZVZpZXc6OkdldERpc3BsYXlNYXRyaXgoQ0ZYX01hdHJpeCYgbXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3QmIHJ0RGlzcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSb3RhdGUpIHsNCisgIENGWF9TaXplRiBzejsNCisgIEdldFBhZ2VTaXplKHN6KTsNCisgIENGWF9SZWN0RiBmZGVQYWdlOw0KKyAgZmRlUGFnZS5TZXQoMCwgMCwgc3oueCwgc3oueSk7DQorICBGREVfR2V0UGFnZU1hdHJpeChtdCwgZmRlUGFnZSwgcnREaXNwLCBpUm90YXRlLCAwKTsNCit9DQoraW50MzJfdCBDWEZBX0ZGUGFnZVZpZXc6OkxvYWRQYWdlVmlldyhJRlhfUGF1c2UqIHBQYXVzZSkgew0KKyAgaWYgKG1fYkxvYWRlZCkgew0KKyAgICByZXR1cm4gMTAwOw0KKyAgfQ0KKyAgbV9iTG9hZGVkID0gVFJVRTsNCisgIHJldHVybiAxMDA7DQorfQ0KK3ZvaWQgQ1hGQV9GRlBhZ2VWaWV3OjpVbmxvYWRQYWdlVmlldygpIHsNCisgIGlmICghbV9iTG9hZGVkKSB7DQorICAgIHJldHVybjsNCisgIH0NCit9DQorRlhfQk9PTCBDWEZBX0ZGUGFnZVZpZXc6OklzUGFnZVZpZXdMb2FkZWQoKSB7DQorICByZXR1cm4gbV9iTG9hZGVkOw0KK30NCitJWEZBX1dpZGdldCogQ1hGQV9GRlBhZ2VWaWV3OjpHZXRXaWRnZXRCeVBvcyhGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIGlmICghbV9iTG9hZGVkKSB7DQorICAgIHJldHVybiBudWxscHRyOw0KKyAgfQ0KKyAgSVhGQV9XaWRnZXRJdGVyYXRvciogcEl0ZXJhdG9yID0gQ3JlYXRlV2lkZ2V0SXRlcmF0b3IoKTsNCisgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBudWxscHRyOw0KKyAgd2hpbGUgKChwV2lkZ2V0ID0gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KHBJdGVyYXRvci0+TW92ZVRvTmV4dCgpKSkpIHsNCisgICAgaWYgKCEocFdpZGdldC0+R2V0U3RhdHVzKCkgJiBYRkFfV0lER0VUU1RBVFVTX1Zpc2libGUpKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBwV2lkZ2V0LT5HZXREYXRhQWNjKCk7DQorICAgIGludDMyX3QgdHlwZSA9IHBBY2MtPkdldENsYXNzSUQoKTsNCisgICAgaWYgKHR5cGUgIT0gWEZBX0VMRU1FTlRfRmllbGQgJiYgdHlwZSAhPSBYRkFfRUxFTUVOVF9EcmF3KSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZldpZGdldHggPSBmeDsNCisgICAgRlhfRkxPQVQgZldpZGdldHkgPSBmeTsNCisgICAgcFdpZGdldC0+Um90YXRlMk5vcm1hbChmV2lkZ2V0eCwgZldpZGdldHkpOw0KKyAgICBGWF9EV09SRCBkd0ZsYWcgPSBwV2lkZ2V0LT5PbkhpdFRlc3QoZldpZGdldHgsIGZXaWRnZXR5KTsNCisgICAgaWYgKChGV0xfV0dUSElUVEVTVF9DbGllbnQgPT0gZHdGbGFnIHx8DQorICAgICAgICAgRldMX1dHVEhJVFRFU1RfSHlwZXJMaW5rID09IGR3RmxhZykpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgcEl0ZXJhdG9yLT5SZWxlYXNlKCk7DQorICByZXR1cm4gcFdpZGdldDsNCit9DQorSVhGQV9XaWRnZXRJdGVyYXRvciogQ1hGQV9GRlBhZ2VWaWV3OjpDcmVhdGVXaWRnZXRJdGVyYXRvcigNCisgICAgRlhfRFdPUkQgZHdUcmF2ZXJzZVdheSwNCisgICAgRlhfRFdPUkQgZHdXaWRnZXRGaWx0ZXIpIHsNCisgIHN3aXRjaCAoZHdUcmF2ZXJzZVdheSkgew0KKyAgICBjYXNlIFhGQV9UUkFWRVJTRVdBWV9UcmFudmFsc2U6DQorICAgICAgcmV0dXJuIG5ldyBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3IodGhpcywgZHdXaWRnZXRGaWx0ZXIpOw0KKyAgICBjYXNlIFhGQV9UUkFWRVJTRVdBWV9Gb3JtOg0KKyAgICAgIHJldHVybiBuZXcgQ1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcih0aGlzLCBkd1dpZGdldEZpbHRlcik7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorc3RhdGljIEZYX0JPT0wgWEZBX1BhZ2VXaWRnZXRGaWx0ZXIoQ1hGQV9GRldpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZpbHRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJUcmF2ZXJzYWwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSWdub3JlcmVsZXZhbnQpIHsNCisgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gcFdpZGdldC0+R2V0RGF0YUFjYygpOw0KKyAgRlhfRFdPUkQgZHdUeXBlID0gZHdGaWx0ZXIgJiBYRkFfV0lER0VURklMVEVSX0FsbFR5cGU7DQorICBpZiAoKGR3VHlwZSA9PSBYRkFfV0lER0VURklMVEVSX0ZpZWxkKSAmJg0KKyAgICAgIChwV2lkZ2V0QWNjLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfRmllbGQpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZYX0RXT1JEIGR3U3RhdHVzID0gcFdpZGdldC0+R2V0U3RhdHVzKCk7DQorICBpZiAoYlRyYXZlcnNhbCAmJiAoZHdTdGF0dXMgJiBYRkFfV0lER0VUU1RBVFVTX0Rpc2FibGVkKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoYklnbm9yZXJlbGV2YW50KSB7DQorICAgIHJldHVybiAoZHdTdGF0dXMgJiBYRkFfV0lER0VURklMVEVSX1Zpc2libGUpICE9IDA7DQorICB9DQorICBkd0ZpbHRlciAmPSAoWEZBX1dJREdFVEZJTFRFUl9WaXNpYmxlIHwgWEZBX1dJREdFVEZJTFRFUl9WaWV3YWJsZSB8DQorICAgICAgICAgICAgICAgWEZBX1dJREdFVEZJTFRFUl9QcmludGFibGUpOw0KKyAgcmV0dXJuIChkd0ZpbHRlciAmIGR3U3RhdHVzKSA9PSBkd0ZpbHRlcjsNCit9DQorQ1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcjo6Q1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcihDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmlsdGVyKSB7DQorICBtX3BQYWdlVmlldyA9IHBQYWdlVmlldzsNCisgIG1fZHdGaWx0ZXIgPSBkd0ZpbHRlcjsNCisgIG1fc0l0ZXJhdG9yLkluaXQocFBhZ2VWaWV3KTsNCisgIG1fYklnbm9yZXJlbGV2YW50ID0gKChDWEZBX0ZGRG9jKiltX3BQYWdlVmlldy0+R2V0RG9jVmlldygpLT5HZXREb2MoKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0WEZBRG9jKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0Q3VyVmVyc2lvbk1vZGUoKSA8IFhGQV9WRVJTSU9OXzIwNTsNCit9DQorQ1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcjo6fkNYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3IoKSB7fQ0KK3ZvaWQgQ1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcjo6UmVzZXQoKSB7DQorICBtX3NJdGVyYXRvci5SZXNldCgpOw0KK30NCitJWEZBX1dpZGdldCogQ1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcjo6TW92ZVRvRmlyc3QoKSB7DQorICBtX3NJdGVyYXRvci5SZXNldCgpOw0KKyAgZm9yIChDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gbV9zSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwTGF5b3V0SXRlbTsNCisgICAgICAgcExheW91dEl0ZW0gPSBtX3NJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgaWYgKElYRkFfV2lkZ2V0KiBoV2lkZ2V0ID0gR2V0V2lkZ2V0KHBMYXlvdXRJdGVtKSkgew0KKyAgICAgIHJldHVybiBoV2lkZ2V0Ow0KKyAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorSVhGQV9XaWRnZXQqIENYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb0xhc3QoKSB7DQorICBtX3NJdGVyYXRvci5TZXRDdXJyZW50KE5VTEwpOw0KKyAgcmV0dXJuIE1vdmVUb1ByZXZpb3VzKCk7DQorfQ0KK0lYRkFfV2lkZ2V0KiBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yOjpNb3ZlVG9OZXh0KCkgew0KKyAgZm9yIChDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gbV9zSXRlcmF0b3IuTW92ZVRvTmV4dCgpOyBwTGF5b3V0SXRlbTsNCisgICAgICAgcExheW91dEl0ZW0gPSBtX3NJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgaWYgKElYRkFfV2lkZ2V0KiBoV2lkZ2V0ID0gR2V0V2lkZ2V0KHBMYXlvdXRJdGVtKSkgew0KKyAgICAgIHJldHVybiBoV2lkZ2V0Ow0KKyAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorSVhGQV9XaWRnZXQqIENYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb1ByZXZpb3VzKCkgew0KKyAgZm9yIChDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gbV9zSXRlcmF0b3IuTW92ZVRvUHJldigpOyBwTGF5b3V0SXRlbTsNCisgICAgICAgcExheW91dEl0ZW0gPSBtX3NJdGVyYXRvci5Nb3ZlVG9QcmV2KCkpIHsNCisgICAgaWYgKElYRkFfV2lkZ2V0KiBoV2lkZ2V0ID0gR2V0V2lkZ2V0KHBMYXlvdXRJdGVtKSkgew0KKyAgICAgIHJldHVybiBoV2lkZ2V0Ow0KKyAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorSVhGQV9XaWRnZXQqIENYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3I6OkdldEN1cnJlbnRXaWRnZXQoKSB7DQorICBDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gbV9zSXRlcmF0b3IuR2V0Q3VycmVudCgpOw0KKyAgcmV0dXJuIHBMYXlvdXRJdGVtID8gWEZBX0dldFdpZGdldEZyb21MYXlvdXRJdGVtKHBMYXlvdXRJdGVtKSA6IE5VTEw7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcjo6U2V0Q3VycmVudFdpZGdldChJWEZBX1dpZGdldCogaFdpZGdldCkgew0KKyAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KTsNCisgIHJldHVybiBwV2lkZ2V0ICYmIG1fc0l0ZXJhdG9yLlNldEN1cnJlbnQocFdpZGdldCk7DQorfQ0KK0lYRkFfV2lkZ2V0KiBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yOjpHZXRXaWRnZXQoDQorICAgIENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0pIHsNCisgIGlmIChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gWEZBX0dldFdpZGdldEZyb21MYXlvdXRJdGVtKHBMYXlvdXRJdGVtKSkgew0KKyAgICBpZiAoIVhGQV9QYWdlV2lkZ2V0RmlsdGVyKHBXaWRnZXQsIG1fZHdGaWx0ZXIsIEZBTFNFLCBtX2JJZ25vcmVyZWxldmFudCkpIHsNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAoIXBXaWRnZXQtPklzTG9hZGVkKCkgJiYNCisgICAgICAgIChwV2lkZ2V0LT5HZXRTdGF0dXMoKSAmIFhGQV9XSURHRVRTVEFUVVNfVmlzaWJsZSkgIT0gMCkgew0KKyAgICAgIHBXaWRnZXQtPkxvYWRXaWRnZXQoKTsNCisgICAgfQ0KKyAgICByZXR1cm4gcFdpZGdldDsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6OkNYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcigNCisgICAgQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsDQorICAgIEZYX0RXT1JEIGR3RmlsdGVyKQ0KKyAgICA6IG1fcFBhZ2VWaWV3KHBQYWdlVmlldyksIG1fZHdGaWx0ZXIoZHdGaWx0ZXIpLCBtX2lDdXJXaWRnZXQoLTEpIHsNCisgIG1fYklnbm9yZXJlbGV2YW50ID0gKChDWEZBX0ZGRG9jKiltX3BQYWdlVmlldy0+R2V0RG9jVmlldygpLT5HZXREb2MoKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0WEZBRG9jKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0Q3VyVmVyc2lvbk1vZGUoKSA8IFhGQV9WRVJTSU9OXzIwNTsNCisgIFJlc2V0KCk7DQorfQ0KK0NYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6fkNYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcigpIHt9DQordm9pZCBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6OlJlbGVhc2UoKSB7DQorICBkZWxldGUgdGhpczsNCit9DQordm9pZCBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6OlJlc2V0KCkgew0KKyAgQ3JlYXRlVGFiT3JkZXJXaWRnZXRBcnJheSgpOw0KKyAgbV9pQ3VyV2lkZ2V0ID0gLTE7DQorfQ0KK0lYRkFfV2lkZ2V0KiBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb0ZpcnN0KCkgew0KKyAgaWYgKG1fVGFiT3JkZXJXaWRnZXRBcnJheS5HZXRTaXplKCkgPiAwKSB7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fVGFiT3JkZXJXaWRnZXRBcnJheS5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgIGlmIChYRkFfUGFnZVdpZGdldEZpbHRlcihtX1RhYk9yZGVyV2lkZ2V0QXJyYXlbaV0sIG1fZHdGaWx0ZXIsIFRSVUUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYklnbm9yZXJlbGV2YW50KSkgew0KKyAgICAgICAgbV9pQ3VyV2lkZ2V0ID0gaTsNCisgICAgICAgIHJldHVybiBtX1RhYk9yZGVyV2lkZ2V0QXJyYXlbbV9pQ3VyV2lkZ2V0XTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitJWEZBX1dpZGdldCogQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpNb3ZlVG9MYXN0KCkgew0KKyAgaWYgKG1fVGFiT3JkZXJXaWRnZXRBcnJheS5HZXRTaXplKCkgPiAwKSB7DQorICAgIGZvciAoaW50MzJfdCBpID0gbV9UYWJPcmRlcldpZGdldEFycmF5LkdldFNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7DQorICAgICAgaWYgKFhGQV9QYWdlV2lkZ2V0RmlsdGVyKG1fVGFiT3JkZXJXaWRnZXRBcnJheVtpXSwgbV9kd0ZpbHRlciwgVFJVRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iSWdub3JlcmVsZXZhbnQpKSB7DQorICAgICAgICBtX2lDdXJXaWRnZXQgPSBpOw0KKyAgICAgICAgcmV0dXJuIG1fVGFiT3JkZXJXaWRnZXRBcnJheVttX2lDdXJXaWRnZXRdOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0lYRkFfV2lkZ2V0KiBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb05leHQoKSB7DQorICBmb3IgKGludDMyX3QgaSA9IG1faUN1cldpZGdldCArIDE7IGkgPCBtX1RhYk9yZGVyV2lkZ2V0QXJyYXkuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgaWYgKFhGQV9QYWdlV2lkZ2V0RmlsdGVyKG1fVGFiT3JkZXJXaWRnZXRBcnJheVtpXSwgbV9kd0ZpbHRlciwgVFJVRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYklnbm9yZXJlbGV2YW50KSkgew0KKyAgICAgIG1faUN1cldpZGdldCA9IGk7DQorICAgICAgcmV0dXJuIG1fVGFiT3JkZXJXaWRnZXRBcnJheVttX2lDdXJXaWRnZXRdOw0KKyAgICB9DQorICB9DQorICBtX2lDdXJXaWRnZXQgPSAtMTsNCisgIHJldHVybiBOVUxMOw0KK30NCitJWEZBX1dpZGdldCogQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpNb3ZlVG9QcmV2aW91cygpIHsNCisgIGZvciAoaW50MzJfdCBpID0gbV9pQ3VyV2lkZ2V0IC0gMTsgaSA+PSAwOyBpLS0pIHsNCisgICAgaWYgKFhGQV9QYWdlV2lkZ2V0RmlsdGVyKG1fVGFiT3JkZXJXaWRnZXRBcnJheVtpXSwgbV9kd0ZpbHRlciwgVFJVRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYklnbm9yZXJlbGV2YW50KSkgew0KKyAgICAgIG1faUN1cldpZGdldCA9IGk7DQorICAgICAgcmV0dXJuIG1fVGFiT3JkZXJXaWRnZXRBcnJheVttX2lDdXJXaWRnZXRdOw0KKyAgICB9DQorICB9DQorICBtX2lDdXJXaWRnZXQgPSAtMTsNCisgIHJldHVybiBOVUxMOw0KK30NCitJWEZBX1dpZGdldCogQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpHZXRDdXJyZW50V2lkZ2V0KCkgew0KKyAgaWYgKG1faUN1cldpZGdldCA+PSAwKSB7DQorICAgIHJldHVybiBtX1RhYk9yZGVyV2lkZ2V0QXJyYXlbbV9pQ3VyV2lkZ2V0XTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitGWF9CT09MIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6U2V0Q3VycmVudFdpZGdldCgNCisgICAgSVhGQV9XaWRnZXQqIGhXaWRnZXQpIHsNCisgIGludDMyX3QgaVdpZGdldEluZGV4ID0NCisgICAgICBtX1RhYk9yZGVyV2lkZ2V0QXJyYXkuRmluZChzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCkpOw0KKyAgaWYgKGlXaWRnZXRJbmRleCA+PSAwKSB7DQorICAgIG1faUN1cldpZGdldCA9IGlXaWRnZXRJbmRleDsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0NYRkFfRkZXaWRnZXQqIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6R2V0VHJhdmVyc2VXaWRnZXQoDQorICAgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQpIHsNCisgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gcFdpZGdldC0+R2V0RGF0YUFjYygpOw0KKyAgQ1hGQV9Ob2RlKiBwVHJhdmVyc2FsID0gcEFjYy0+R2V0Tm9kZSgpLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9UcmF2ZXJzYWwpOw0KKyAgaWYgKHBUcmF2ZXJzYWwgIT0gTlVMTCkgew0KKyAgICBDWEZBX05vZGUqIHBUcmF2ZXJzZSA9IHBUcmF2ZXJzYWwtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1RyYXZlcnNlKTsNCisgICAgaWYgKHBUcmF2ZXJzZSAhPSBOVUxMKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUcmF2ZXJzZVdpZGdldE5hbWU7DQorICAgICAgaWYgKHBUcmF2ZXJzZS0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfUmVmLCB3c1RyYXZlcnNlV2lkZ2V0TmFtZSkpIHsNCisgICAgICAgIHJldHVybiBGaW5kV2lkZ2V0QnlOYW1lKHdzVHJhdmVyc2VXaWRnZXROYW1lLCBwV2lkZ2V0KTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitDWEZBX0ZGV2lkZ2V0KiBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6OkZpbmRXaWRnZXRCeU5hbWUoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NXaWRnZXROYW1lLA0KKyAgICBDWEZBX0ZGV2lkZ2V0KiBwUmVmV2lkZ2V0KSB7DQorICByZXR1cm4gcFJlZldpZGdldC0+R2V0RG9jVmlldygpLT5HZXRXaWRnZXRCeU5hbWUod3NXaWRnZXROYW1lLCBwUmVmV2lkZ2V0KTsNCit9DQordm9pZCBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6OkNyZWF0ZVRhYk9yZGVyV2lkZ2V0QXJyYXkoKSB7DQorICBtX1RhYk9yZGVyV2lkZ2V0QXJyYXkuUmVtb3ZlQWxsKCk7DQorICBDWEZBX1dpZGdldEFycmF5IFNwYWNlT3JkZXJXaWRnZXRBcnJheTsNCisgIENyZWF0ZVNwYWNlT3JkZXJXaWRnZXRBcnJheShTcGFjZU9yZGVyV2lkZ2V0QXJyYXkpOw0KKyAgaW50MzJfdCBuV2lkZ2V0Q291bnQgPSBTcGFjZU9yZGVyV2lkZ2V0QXJyYXkuR2V0U2l6ZSgpOw0KKyAgaWYgKG5XaWRnZXRDb3VudCA8IDEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9GRldpZGdldCogaFdpZGdldCA9IFNwYWNlT3JkZXJXaWRnZXRBcnJheVswXTsNCisgIGZvciAoOyBtX1RhYk9yZGVyV2lkZ2V0QXJyYXkuR2V0U2l6ZSgpIDwgbldpZGdldENvdW50Oykgew0KKyAgICBpZiAobV9UYWJPcmRlcldpZGdldEFycmF5LkZpbmQoaFdpZGdldCkgPCAwKSB7DQorICAgICAgbV9UYWJPcmRlcldpZGdldEFycmF5LkFkZChoV2lkZ2V0KTsNCisgICAgICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IGhXaWRnZXQtPkdldERhdGFBY2MoKTsNCisgICAgICBpZiAocFdpZGdldEFjYy0+R2V0VUlUeXBlKCkgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwKSB7DQorICAgICAgICBpbnQzMl90IGlXaWRnZXRJbmRleCA9IFNwYWNlT3JkZXJXaWRnZXRBcnJheS5GaW5kKGhXaWRnZXQpICsgMTsNCisgICAgICAgIHdoaWxlIChUUlVFKSB7DQorICAgICAgICAgIENYRkFfRkZXaWRnZXQqIHBSYWRpbyA9DQorICAgICAgICAgICAgICBTcGFjZU9yZGVyV2lkZ2V0QXJyYXlbKGlXaWRnZXRJbmRleCkgJSBuV2lkZ2V0Q291bnRdOw0KKyAgICAgICAgICBpZiAocFJhZGlvLT5HZXREYXRhQWNjKCktPkdldEV4Y2xHcm91cCgpICE9IHBXaWRnZXRBY2MpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAobV9UYWJPcmRlcldpZGdldEFycmF5LkZpbmQoaFdpZGdldCkgPCAwKSB7DQorICAgICAgICAgICAgbV9UYWJPcmRlcldpZGdldEFycmF5LkFkZChwUmFkaW8pOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlXaWRnZXRJbmRleCsrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoQ1hGQV9GRldpZGdldCogaFRyYXZlcnNlV2lkZ2V0ID0gR2V0VHJhdmVyc2VXaWRnZXQoaFdpZGdldCkpIHsNCisgICAgICAgIGhXaWRnZXQgPSBoVHJhdmVyc2VXaWRnZXQ7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgaW50MzJfdCBpV2lkZ2V0SW5kZXggPSBTcGFjZU9yZGVyV2lkZ2V0QXJyYXkuRmluZChoV2lkZ2V0KTsNCisgICAgaFdpZGdldCA9IFNwYWNlT3JkZXJXaWRnZXRBcnJheVsoaVdpZGdldEluZGV4ICsgMSkgJSBuV2lkZ2V0Q291bnRdOw0KKyAgfQ0KK30NCitzdGF0aWMgaW50MzJfdCBYRkFfVGFiT3JkZXJXaWRnZXRDb21wYXJhdG9yKGNvbnN0IHZvaWQqIHBoV2lkZ2V0MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHBoV2lkZ2V0Mikgew0KKyAgQ1hGQV9GRldpZGdldCogcFdpZGdldDEgPSAoKihDWEZBX1RhYlBhcmFtKiopcGhXaWRnZXQxKS0+bV9wV2lkZ2V0Ow0KKyAgQ1hGQV9GRldpZGdldCogcFdpZGdldDIgPSAoKihDWEZBX1RhYlBhcmFtKiopcGhXaWRnZXQyKS0+bV9wV2lkZ2V0Ow0KKyAgQ0ZYX1JlY3RGIHJ0MSwgcnQyOw0KKyAgcFdpZGdldDEtPkdldFdpZGdldFJlY3QocnQxKTsNCisgIHBXaWRnZXQyLT5HZXRXaWRnZXRSZWN0KHJ0Mik7DQorICBGWF9GTE9BVCB4MSA9IHJ0MS5sZWZ0LCB5MSA9IHJ0MS50b3AsIHgyID0gcnQyLmxlZnQsIHkyID0gcnQyLnRvcDsNCisgIGlmICh5MSA8IHkyIHx8ICh5MSAtIHkyIDwgWEZBX0ZMT0FUX1BFUkNJU0lPTiAmJiB4MSA8IHgyKSkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICByZXR1cm4gMTsNCit9DQordm9pZCBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6Ok9yZGVyQ29udGFpbmVyKA0KKyAgICBDWEZBX0xheW91dEl0ZW1JdGVyYXRvciogc0l0ZXJhdG9yLA0KKyAgICBDWEZBX0xheW91dEl0ZW0qIHBDb250YWluZXJJdGVtLA0KKyAgICBDWEZBX1RhYlBhcmFtKiBwQ29udGFpbmVyLA0KKyAgICBGWF9CT09MJiBiQ3VycmVudEl0ZW0sDQorICAgIEZYX0JPT0wmIGJDb250ZW50QXJlYSwNCisgICAgRlhfQk9PTCBiTWFyc3RlclBhZ2UpIHsNCisgIENGWF9QdHJBcnJheSB0YWJQYXJhbXM7DQorICBDWEZBX0xheW91dEl0ZW0qIHBTZWFyY2hJdGVtID0gc0l0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7DQorICB3aGlsZSAocFNlYXJjaEl0ZW0pIHsNCisgICAgaWYgKCFwU2VhcmNoSXRlbS0+SXNDb250ZW50TGF5b3V0SXRlbSgpKSB7DQorICAgICAgYkNvbnRlbnRBcmVhID0gVFJVRTsNCisgICAgICBwU2VhcmNoSXRlbSA9IHNJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChiTWFyc3RlclBhZ2UgJiYgYkNvbnRlbnRBcmVhKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKGJNYXJzdGVyUGFnZSB8fCBiQ29udGVudEFyZWEpIHsNCisgICAgICBDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0ID0gR2V0V2lkZ2V0KHBTZWFyY2hJdGVtKTsNCisgICAgICBpZiAoIWhXaWRnZXQpIHsNCisgICAgICAgIHBTZWFyY2hJdGVtID0gc0l0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgaWYgKHBDb250YWluZXJJdGVtICYmIChwU2VhcmNoSXRlbS0+R2V0UGFyZW50KCkgIT0gcENvbnRhaW5lckl0ZW0pKSB7DQorICAgICAgICBiQ3VycmVudEl0ZW0gPSBUUlVFOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIENYRkFfVGFiUGFyYW0qIHBQYXJhbSA9IG5ldyBDWEZBX1RhYlBhcmFtOw0KKyAgICAgIHBQYXJhbS0+bV9wV2lkZ2V0ID0gaFdpZGdldDsNCisgICAgICB0YWJQYXJhbXMuQWRkKHBQYXJhbSk7DQorICAgICAgaWYgKFhGQV9Jc0xheW91dEVsZW1lbnQocFNlYXJjaEl0ZW0tPkdldEZvcm1Ob2RlKCktPkdldENsYXNzSUQoKSwgVFJVRSkpIHsNCisgICAgICAgIE9yZGVyQ29udGFpbmVyKHNJdGVyYXRvciwgcFNlYXJjaEl0ZW0sIHBQYXJhbSwgYkN1cnJlbnRJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgYkNvbnRlbnRBcmVhLCBiTWFyc3RlclBhZ2UpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoYkN1cnJlbnRJdGVtKSB7DQorICAgICAgcFNlYXJjaEl0ZW0gPSBzSXRlcmF0b3ItPkdldEN1cnJlbnQoKTsNCisgICAgICBiQ3VycmVudEl0ZW0gPSBGQUxTRTsNCisgICAgfSBlbHNlIHsNCisgICAgICBwU2VhcmNoSXRlbSA9IHNJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KKyAgICB9DQorICB9DQorICBpbnQzMl90IGlDaGlsZHJlbiA9IHRhYlBhcmFtcy5HZXRTaXplKCk7DQorICBpZiAoaUNoaWxkcmVuID4gMSkgew0KKyAgICBGWFNZU19xc29ydCh0YWJQYXJhbXMuR2V0RGF0YSgpLCBpQ2hpbGRyZW4sIHNpemVvZih2b2lkKiksDQorICAgICAgICAgICAgICAgIFhGQV9UYWJPcmRlcldpZGdldENvbXBhcmF0b3IpOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IGlTdGFydCA9IDA7IGlTdGFydCA8IGlDaGlsZHJlbjsgaVN0YXJ0KyspIHsNCisgICAgQ1hGQV9UYWJQYXJhbSogcFBhcmFtID0gKENYRkFfVGFiUGFyYW0qKXRhYlBhcmFtc1tpU3RhcnRdOw0KKyAgICBwQ29udGFpbmVyLT5tX0NoaWxkcmVuLkFkZChwUGFyYW0tPm1fcFdpZGdldCk7DQorICAgIGlmIChwUGFyYW0tPm1fQ2hpbGRyZW4uR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgIHBDb250YWluZXItPm1fQ2hpbGRyZW4uQXBwZW5kKHBQYXJhbS0+bV9DaGlsZHJlbik7DQorICAgIH0NCisgICAgZGVsZXRlIHBQYXJhbTsNCisgIH0NCisgIHRhYlBhcmFtcy5SZW1vdmVBbGwoKTsNCit9DQordm9pZCBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6OkNyZWF0ZVNwYWNlT3JkZXJXaWRnZXRBcnJheSgNCisgICAgQ1hGQV9XaWRnZXRBcnJheSYgV2lkZ2V0QXJyYXkpIHsNCisgIENYRkFfTGF5b3V0SXRlbUl0ZXJhdG9yIHNJdGVyYXRvcjsNCisgIHNJdGVyYXRvci5Jbml0KG1fcFBhZ2VWaWV3KTsNCisgIENYRkFfVGFiUGFyYW0qIHBQYXJhbSA9IG5ldyBDWEZBX1RhYlBhcmFtOw0KKyAgRlhfQk9PTCBiQ3VycmVudEl0ZW0gPSBGQUxTRTsNCisgIEZYX0JPT0wgYkNvbnRlbnRBcmVhID0gRkFMU0U7DQorICBPcmRlckNvbnRhaW5lcigmc0l0ZXJhdG9yLCBOVUxMLCBwUGFyYW0sIGJDdXJyZW50SXRlbSwgYkNvbnRlbnRBcmVhKTsNCisgIGlmIChwUGFyYW0tPm1fQ2hpbGRyZW4uR2V0U2l6ZSgpID4gMCkgew0KKyAgICBXaWRnZXRBcnJheS5BcHBlbmQocFBhcmFtLT5tX0NoaWxkcmVuKTsNCisgIH0NCisgIHNJdGVyYXRvci5SZXNldCgpOw0KKyAgYkN1cnJlbnRJdGVtID0gRkFMU0U7DQorICBiQ29udGVudEFyZWEgPSBGQUxTRTsNCisgIHBQYXJhbS0+bV9DaGlsZHJlbi5SZW1vdmVBbGwoKTsNCisgIE9yZGVyQ29udGFpbmVyKCZzSXRlcmF0b3IsIE5VTEwsIHBQYXJhbSwgYkN1cnJlbnRJdGVtLCBiQ29udGVudEFyZWEsIFRSVUUpOw0KKyAgaWYgKHBQYXJhbS0+bV9DaGlsZHJlbi5HZXRTaXplKCkgPiAwKSB7DQorICAgIFdpZGdldEFycmF5LkFwcGVuZChwUGFyYW0tPm1fQ2hpbGRyZW4pOw0KKyAgfQ0KKyAgZGVsZXRlIHBQYXJhbTsNCit9DQorQ1hGQV9GRldpZGdldCogQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpHZXRXaWRnZXQoDQorICAgIENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0pIHsNCisgIGlmIChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gWEZBX0dldFdpZGdldEZyb21MYXlvdXRJdGVtKHBMYXlvdXRJdGVtKSkgew0KKyAgICBpZiAoIXBXaWRnZXQtPklzTG9hZGVkKCkgJiYNCisgICAgICAgIChwV2lkZ2V0LT5HZXRTdGF0dXMoKSAmIFhGQV9XSURHRVRTVEFUVVNfVmlzaWJsZSkpIHsNCisgICAgICBwV2lkZ2V0LT5Mb2FkV2lkZ2V0KCk7DQorICAgIH0NCisgICAgcmV0dXJuIHBXaWRnZXQ7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmcGFnZXZpZXcuaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnBhZ2V2aWV3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ0M2M3MwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnBhZ2V2aWV3LmgKQEAgLTAsMCArMSwxMDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhGQV9GT1JNRklMTEVSX1BBR0VWSUVXX0lNUF9IDQorI2RlZmluZSBfRlhGQV9GT1JNRklMTEVSX1BBR0VWSUVXX0lNUF9IDQorY2xhc3MgQ1hGQV9GRldpZGdldDsNCitjbGFzcyBDWEZBX0ZGRG9jVmlldzsNCitjbGFzcyBDWEZBX0ZGUGFnZVZpZXcgOiBwdWJsaWMgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtLCBwdWJsaWMgSVhGQV9QYWdlVmlldyB7DQorIHB1YmxpYzoNCisgIENYRkFfRkZQYWdlVmlldyhDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcsIENYRkFfTm9kZSogcFBhZ2VBcmVhKTsNCisgIH5DWEZBX0ZGUGFnZVZpZXcoKSBvdmVycmlkZTsNCisNCisgIC8vIElGWEFfUGFnZVZpZXc6DQorICBJWEZBX0RvY1ZpZXcqIEdldERvY1ZpZXcoKSBvdmVycmlkZTsNCisgIGludDMyX3QgR2V0UGFnZVZpZXdJbmRleCgpIG92ZXJyaWRlOw0KKyAgdm9pZCBHZXRQYWdlVmlld1JlY3QoQ0ZYX1JlY3RGJiBydFBhZ2UpIG92ZXJyaWRlOw0KKyAgdm9pZCBHZXREaXNwbGF5TWF0cml4KENGWF9NYXRyaXgmIG10LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0JiBydERpc3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlKSBvdmVycmlkZTsNCisgIGludDMyX3QgTG9hZFBhZ2VWaWV3KElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCkgb3ZlcnJpZGU7DQorICB2b2lkIFVubG9hZFBhZ2VWaWV3KCkgb3ZlcnJpZGU7DQorICBJWEZBX1dpZGdldCogR2V0V2lkZ2V0QnlQb3MoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSBvdmVycmlkZTsNCisgIElYRkFfV2lkZ2V0SXRlcmF0b3IqIENyZWF0ZVdpZGdldEl0ZXJhdG9yKA0KKyAgICAgIEZYX0RXT1JEIGR3VHJhdmVyc2VXYXkgPSBYRkFfVFJBVkVSU0VXQVlfRm9ybSwNCisgICAgICBGWF9EV09SRCBkd1dpZGdldEZpbHRlciA9IFhGQV9XSURHRVRGSUxURVJfVmlzaWJsZSB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfV0lER0VURklMVEVSX1ZpZXdhYmxlIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9XSURHRVRGSUxURVJfQWxsVHlwZSkgb3ZlcnJpZGU7DQorDQorICBGWF9CT09MIElzUGFnZVZpZXdMb2FkZWQoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ1hGQV9GRkRvY1ZpZXcqIG1fcERvY1ZpZXc7DQorICBGWF9CT09MIG1fYkxvYWRlZDsNCit9Ow0KK3R5cGVkZWYgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX0xheW91dEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfVHJhdmVyc2VTdHJhdGVneV9MYXlvdXRJdGVtPg0KKyAgICBDWEZBX0xheW91dEl0ZW1JdGVyYXRvcjsNCitjbGFzcyBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yIDogcHVibGljIElYRkFfV2lkZ2V0SXRlcmF0b3Igew0KKyBwdWJsaWM6DQorICBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBGWF9EV09SRCBkd0ZpbHRlcik7DQorICB2aXJ0dWFsIH5DWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisNCisgIHZpcnR1YWwgdm9pZCBSZXNldCgpOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldCogTW92ZVRvRmlyc3QoKTsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIE1vdmVUb0xhc3QoKTsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIE1vdmVUb05leHQoKTsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIE1vdmVUb1ByZXZpb3VzKCk7DQorICB2aXJ0dWFsIElYRkFfV2lkZ2V0KiBHZXRDdXJyZW50V2lkZ2V0KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Q3VycmVudFdpZGdldChJWEZBX1dpZGdldCogaFdpZGdldCk7DQorDQorIHByb3RlY3RlZDoNCisgIElYRkFfV2lkZ2V0KiBHZXRXaWRnZXQoQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSk7DQorICBDWEZBX0ZGUGFnZVZpZXcqIG1fcFBhZ2VWaWV3Ow0KKyAgSVhGQV9XaWRnZXQqIG1faEN1cldpZGdldDsNCisgIEZYX0RXT1JEIG1fZHdGaWx0ZXI7DQorICBGWF9CT09MIG1fYklnbm9yZXJlbGV2YW50Ow0KKyAgQ1hGQV9MYXlvdXRJdGVtSXRlcmF0b3IgbV9zSXRlcmF0b3I7DQorfTsNCit0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPENYRkFfRkZXaWRnZXQqPiBDWEZBX1dpZGdldEFycmF5Ow0KK2NsYXNzIENYRkFfVGFiUGFyYW0gew0KKyBwdWJsaWM6DQorICBDWEZBX1RhYlBhcmFtKCkgOiBtX3BXaWRnZXQoTlVMTCkge30NCisgIH5DWEZBX1RhYlBhcmFtKCkge30NCisNCisgIENYRkFfRkZXaWRnZXQqIG1fcFdpZGdldDsNCisgIENYRkFfV2lkZ2V0QXJyYXkgbV9DaGlsZHJlbjsNCit9Ow0KK2NsYXNzIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvciA6IHB1YmxpYyBJWEZBX1dpZGdldEl0ZXJhdG9yIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmlsdGVyKTsNCisgIHZpcnR1YWwgfkNYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcigpOw0KKw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKTsNCisNCisgIHZpcnR1YWwgdm9pZCBSZXNldCgpOw0KKyAgdmlydHVhbCBJWEZBX1dpZGdldCogTW92ZVRvRmlyc3QoKTsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIE1vdmVUb0xhc3QoKTsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIE1vdmVUb05leHQoKTsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIE1vdmVUb1ByZXZpb3VzKCk7DQorICB2aXJ0dWFsIElYRkFfV2lkZ2V0KiBHZXRDdXJyZW50V2lkZ2V0KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2V0Q3VycmVudFdpZGdldChJWEZBX1dpZGdldCogaFdpZGdldCk7DQorDQorIHByb3RlY3RlZDoNCisgIENYRkFfV2lkZ2V0QXJyYXkgbV9UYWJPcmRlcldpZGdldEFycmF5Ow0KKyAgQ1hGQV9GRlBhZ2VWaWV3KiBtX3BQYWdlVmlldzsNCisgIEZYX0RXT1JEIG1fZHdGaWx0ZXI7DQorICBpbnQzMl90IG1faUN1cldpZGdldDsNCisgIEZYX0JPT0wgbV9iSWdub3JlcmVsZXZhbnQ7DQorICBDWEZBX0ZGV2lkZ2V0KiBHZXRUcmF2ZXJzZVdpZGdldChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0KTsNCisgIENYRkFfRkZXaWRnZXQqIEZpbmRXaWRnZXRCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1dpZGdldE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRkZXaWRnZXQqIHBSZWZXaWRnZXQpOw0KKyAgdm9pZCBDcmVhdGVUYWJPcmRlcldpZGdldEFycmF5KCk7DQorICB2b2lkIENyZWF0ZVNwYWNlT3JkZXJXaWRnZXRBcnJheShDWEZBX1dpZGdldEFycmF5JiBXaWRnZXRBcnJheSk7DQorICBDWEZBX0ZGV2lkZ2V0KiBHZXRXaWRnZXQoQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSk7DQorICB2b2lkIE9yZGVyQ29udGFpbmVyKENYRkFfTGF5b3V0SXRlbUl0ZXJhdG9yKiBzSXRlcmF0b3IsDQorICAgICAgICAgICAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbSogcENvbnRhaW5lckl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgIENYRkFfVGFiUGFyYW0qIHBDb250YWluZXIsDQorICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJDdXJyZW50SXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkNvbnRlbnRBcmVhLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJNYXJzdGVyUGFnZSA9IEZBTFNFKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnBhdGguY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmcGF0aC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY1ZjljYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnBhdGguY3BwCkBAIC0wLDAgKzEsMTU4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9jb21tb24uaCINCisjaW5jbHVkZSAieGZhX2Zmd2lkZ2V0LmgiDQorI2luY2x1ZGUgInhmYV9mZmRyYXcuaCINCisjaW5jbHVkZSAieGZhX2ZmcGF0aC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZwYWdldmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2MuaCINCisjaW5jbHVkZSAieGZhX2ZmYXBwLmgiDQorQ1hGQV9GRkxpbmU6OkNYRkFfRkZMaW5lKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpDQorICAgIDogQ1hGQV9GRkRyYXcocFBhZ2VWaWV3LCBwRGF0YUFjYykge30NCitDWEZBX0ZGTGluZTo6fkNYRkFfRkZMaW5lKCkge30NCit2b2lkIENYRkFfRkZMaW5lOjpHZXRSZWN0RnJvbUhhbmQoQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlIYW5kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTGluZVdpZHRoKSB7DQorICBGWF9GTE9BVCBmSGFsZldpZHRoID0gZkxpbmVXaWR0aCAvIDIuMGY7DQorICBpZiAocmVjdC5oZWlnaHQgPCAxLjBmKSB7DQorICAgIHN3aXRjaCAoaUhhbmQpIHsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ6DQorICAgICAgICByZWN0LnRvcCAtPSBmSGFsZldpZHRoOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoNCisgICAgICAgIHJlY3QudG9wICs9IGZIYWxmV2lkdGg7DQorICAgIH0NCisgIH0gZWxzZSBpZiAocmVjdC53aWR0aCA8IDEuMGYpIHsNCisgICAgc3dpdGNoIChpSGFuZCkgew0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTGVmdDoNCisgICAgICAgIHJlY3QubGVmdCArPSBmSGFsZldpZHRoOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoNCisgICAgICAgIHJlY3QubGVmdCArPSBmSGFsZldpZHRoOw0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIHN3aXRjaCAoaUhhbmQpIHsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ6DQorICAgICAgICByZWN0LkluZmxhdGUoZkhhbGZXaWR0aCwgZkhhbGZXaWR0aCk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KKyAgICAgICAgcmVjdC5EZWZsYXRlKGZIYWxmV2lkdGgsIGZIYWxmV2lkdGgpOw0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDWEZBX0ZGTGluZTo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXR1cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlKSB7DQorICBpZiAoIUlzTWF0Y2hWaXNpYmxlU3RhdHVzKGR3U3RhdHVzKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX1ZhbHVlIHZhbHVlID0gbV9wRGF0YUFjYy0+R2V0Rm9ybVZhbHVlKCk7DQorICBpZiAoIXZhbHVlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfTGluZSBsaW5lT2JqID0gdmFsdWUuR2V0TGluZSgpOw0KKyAgRlhfQVJHQiBsaW5lQ29sb3IgPSAweEZGMDAwMDAwOw0KKyAgaW50MzJfdCBpU3Ryb2tlVHlwZSA9IDA7DQorICBGWF9GTE9BVCBmTGluZVdpZHRoID0gMS4wZjsNCisgIEZYX0JPT0wgYlNsb3BlID0gbGluZU9iai5HZXRTbG9wKCk7DQorICBpbnQzMl90IGlDYXAgPSAwOw0KKyAgQ1hGQV9FZGdlIGVkZ2UgPSBsaW5lT2JqLkdldEVkZ2UoKTsNCisgIGlmIChlZGdlLklzRXhpc3RJblhNTCgpKSB7DQorICAgIGlmIChlZGdlLkdldFByZXNlbmNlKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZSkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBsaW5lQ29sb3IgPSBlZGdlLkdldENvbG9yKCk7DQorICAgIGlTdHJva2VUeXBlID0gZWRnZS5HZXRTdHJva2VUeXBlKCk7DQorICAgIGZMaW5lV2lkdGggPSBlZGdlLkdldFRoaWNrbmVzcygpOw0KKyAgICBpQ2FwID0gZWRnZS5HZXRDYXBUeXBlKCk7DQorICB9DQorICBDRlhfTWF0cml4IG10Um90YXRlOw0KKyAgR2V0Um90YXRlTWF0cml4KG10Um90YXRlKTsNCisgIGlmIChwTWF0cml4KSB7DQorICAgIG10Um90YXRlLkNvbmNhdCgqcE1hdHJpeCk7DQorICB9DQorICBDRlhfUmVjdEYgcnRMaW5lOw0KKyAgR2V0UmVjdFdpdGhvdXRSb3RhdGUocnRMaW5lKTsNCisgIGlmIChDWEZBX01hcmdpbiBtZ1dpZGdldCA9IG1fcERhdGFBY2MtPkdldE1hcmdpbigpKSB7DQorICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4ocnRMaW5lLCBtZ1dpZGdldCk7DQorICB9DQorICBHZXRSZWN0RnJvbUhhbmQocnRMaW5lLCBsaW5lT2JqLkdldEhhbmQoKSwgZkxpbmVXaWR0aCk7DQorICBDRlhfUGF0aCBsaW5lUGF0aDsNCisgIGxpbmVQYXRoLkNyZWF0ZSgpOw0KKyAgaWYgKGJTbG9wZSAmJiBydExpbmUucmlnaHQoKSA+IDAuMGYgJiYgcnRMaW5lLmJvdHRvbSgpID4gMC4wZikgew0KKyAgICBsaW5lUGF0aC5BZGRMaW5lKHJ0TGluZS5yaWdodCgpLCBydExpbmUudG9wLCBydExpbmUubGVmdCwgcnRMaW5lLmJvdHRvbSgpKTsNCisgIH0gZWxzZSB7DQorICAgIGxpbmVQYXRoLkFkZExpbmUocnRMaW5lLmxlZnQsIHJ0TGluZS50b3AsIHJ0TGluZS5yaWdodCgpLCBydExpbmUuYm90dG9tKCkpOw0KKyAgfQ0KKyAgQ0ZYX0NvbG9yIGNvbG9yKGxpbmVDb2xvcik7DQorICBwR1MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBwR1MtPlNldExpbmVXaWR0aChmTGluZVdpZHRoLCBUUlVFKTsNCisgIFhGQV9TdHJva2VUeXBlU2V0TGluZURhc2gocEdTLCBpU3Ryb2tlVHlwZSwgaUNhcCk7DQorICBwR1MtPlNldFN0cm9rZUNvbG9yKCZjb2xvcik7DQorICBwR1MtPlNldExpbmVDYXAoWEZBX0xpbmVDYXBUb0ZYR0UoaUNhcCkpOw0KKyAgcEdTLT5TdHJva2VQYXRoKCZsaW5lUGF0aCwgJm10Um90YXRlKTsNCisgIHBHUy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCit9DQorQ1hGQV9GRkFyYzo6Q1hGQV9GRkFyYyhDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQ0KKyAgICA6IENYRkFfRkZEcmF3KHBQYWdlVmlldywgcERhdGFBY2MpIHt9DQorQ1hGQV9GRkFyYzo6fkNYRkFfRkZBcmMoKSB7fQ0KK3ZvaWQgQ1hGQV9GRkFyYzo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlKSB7DQorICBpZiAoIUlzTWF0Y2hWaXNpYmxlU3RhdHVzKGR3U3RhdHVzKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX1ZhbHVlIHZhbHVlID0gbV9wRGF0YUFjYy0+R2V0Rm9ybVZhbHVlKCk7DQorICBpZiAoIXZhbHVlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfQXJjIGFyY09iaiA9IHZhbHVlLkdldEFyYygpOw0KKyAgQ0ZYX01hdHJpeCBtdFJvdGF0ZTsNCisgIEdldFJvdGF0ZU1hdHJpeChtdFJvdGF0ZSk7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBtdFJvdGF0ZS5Db25jYXQoKnBNYXRyaXgpOw0KKyAgfQ0KKyAgQ0ZYX1JlY3RGIHJ0QXJjOw0KKyAgR2V0UmVjdFdpdGhvdXRSb3RhdGUocnRBcmMpOw0KKyAgaWYgKENYRkFfTWFyZ2luIG1nV2lkZ2V0ID0gbV9wRGF0YUFjYy0+R2V0TWFyZ2luKCkpIHsNCisgICAgWEZBX1JlY3RXaWR0aG91dE1hcmdpbihydEFyYywgbWdXaWRnZXQpOw0KKyAgfQ0KKyAgRHJhd0JvcmRlcihwR1MsIGFyY09iaiwgcnRBcmMsICZtdFJvdGF0ZSk7DQorfQ0KK0NYRkFfRkZSZWN0YW5nbGU6OkNYRkFfRkZSZWN0YW5nbGUoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpDQorICAgIDogQ1hGQV9GRkRyYXcocFBhZ2VWaWV3LCBwRGF0YUFjYykge30NCitDWEZBX0ZGUmVjdGFuZ2xlOjp+Q1hGQV9GRlJlY3RhbmdsZSgpIHt9DQordm9pZCBDWEZBX0ZGUmVjdGFuZ2xlOjpSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXR1cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSb3RhdGUpIHsNCisgIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfVmFsdWUgdmFsdWUgPSBtX3BEYXRhQWNjLT5HZXRGb3JtVmFsdWUoKTsNCisgIGlmICghdmFsdWUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9SZWN0YW5nbGUgcnRPYmogPSB2YWx1ZS5HZXRSZWN0YW5nbGUoKTsNCisgIENGWF9SZWN0RiByZWN0Ow0KKyAgR2V0UmVjdFdpdGhvdXRSb3RhdGUocmVjdCk7DQorICBpZiAoQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSBtX3BEYXRhQWNjLT5HZXRNYXJnaW4oKSkgew0KKyAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKHJlY3QsIG1nV2lkZ2V0KTsNCisgIH0NCisgIENGWF9NYXRyaXggbXRSb3RhdGU7DQorICBHZXRSb3RhdGVNYXRyaXgobXRSb3RhdGUpOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgbXRSb3RhdGUuQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIERyYXdCb3JkZXIocEdTLCBydE9iaiwgcmVjdCwgJm10Um90YXRlKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmcGF0aC5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmcGF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwODMzM2QKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwYXRoLmgKQEAgLTAsMCArMSwzOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfRFJBV19QQVRIX0lNUF9IDQorI2RlZmluZSBfWEZBX0RSQVdfUEFUSF9JTVBfSA0KK2NsYXNzIENYRkFfRkZMaW5lIDogcHVibGljIENYRkFfRkZEcmF3IHsNCisgcHVibGljOg0KKyAgQ1hGQV9GRkxpbmUoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQorICB2aXJ0dWFsIH5DWEZBX0ZGTGluZSgpOw0KKyAgdmlydHVhbCB2b2lkIFJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzID0gMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlID0gMCk7DQorDQorIHByaXZhdGU6DQorICB2b2lkIEdldFJlY3RGcm9tSGFuZChDRlhfUmVjdEYmIHJlY3QsIGludDMyX3QgaUhhbmQsIEZYX0ZMT0FUIGZMaW5lV2lkdGgpOw0KK307DQorY2xhc3MgQ1hGQV9GRkFyYyA6IHB1YmxpYyBDWEZBX0ZGRHJhdyB7DQorIHB1YmxpYzoNCisgIENYRkFfRkZBcmMoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQorICB2aXJ0dWFsIH5DWEZBX0ZGQXJjKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMgPSAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSb3RhdGUgPSAwKTsNCit9Ow0KK2NsYXNzIENYRkFfRkZSZWN0YW5nbGUgOiBwdWJsaWMgQ1hGQV9GRkRyYXcgew0KKyBwdWJsaWM6DQorICBDWEZBX0ZGUmVjdGFuZ2xlKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgdmlydHVhbCB+Q1hGQV9GRlJlY3RhbmdsZSgpOw0KKyAgdmlydHVhbCB2b2lkIFJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzID0gMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlID0gMCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwdXNoYnV0dG9uLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnB1c2hidXR0b24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YWQ4MDMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZwdXNoYnV0dG9uLmNwcApAQCAtMCwwICsxLDI1MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfY29tbW9uLmgiDQorI2luY2x1ZGUgInhmYV9mZndpZGdldC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXRhY2MuaCINCisjaW5jbHVkZSAieGZhX2ZmZmllbGQuaCINCisjaW5jbHVkZSAieGZhX2ZmcGFnZXZpZXcuaCINCisjaW5jbHVkZSAieGZhX2ZmcHVzaGJ1dHRvbi5oIg0KKyNpbmNsdWRlICJ4ZmFfdGV4dGxheW91dC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZhcHAuaCINCitDWEZBX0ZGUHVzaEJ1dHRvbjo6Q1hGQV9GRlB1c2hCdXR0b24oQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCisgICAgOiBDWEZBX0ZGRmllbGQocFBhZ2VWaWV3LCBwRGF0YUFjYyksDQorICAgICAgbV9wUm9sbG92ZXJUZXh0TGF5b3V0KE5VTEwpLA0KKyAgICAgIG1fcERvd25UZXh0TGF5b3V0KE5VTEwpLA0KKyAgICAgIG1fcERvd25Qcm92aWRlcihOVUxMKSwNCisgICAgICBtX3BSb2xsUHJvdmlkZXIoTlVMTCksDQorICAgICAgbV9wT2xkRGVsZWdhdGUoTlVMTCkge30NCitDWEZBX0ZGUHVzaEJ1dHRvbjo6fkNYRkFfRkZQdXNoQnV0dG9uKCkgew0KKyAgQ1hGQV9GRlB1c2hCdXR0b246OlVubG9hZFdpZGdldCgpOw0KK30NCit2b2lkIENYRkFfRkZQdXNoQnV0dG9uOjpSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSb3RhdGUpIHsNCisgIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9NYXRyaXggbXRSb3RhdGU7DQorICBHZXRSb3RhdGVNYXRyaXgobXRSb3RhdGUpOw0KKyAgaWYgKHBNYXRyaXgpIHsNCisgICAgbXRSb3RhdGUuQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIENYRkFfRkZXaWRnZXQ6OlJlbmRlcldpZGdldChwR1MsICZtdFJvdGF0ZSwgZHdTdGF0dXMpOw0KKyAgUmVuZGVySGlnaGxpZ2h0Q2FwdGlvbihwR1MsICZtdFJvdGF0ZSk7DQorICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydFdpZGdldCk7DQorICBDRlhfTWF0cml4IG10Ow0KKyAgbXQuU2V0KDEsIDAsIDAsIDEsIHJ0V2lkZ2V0LmxlZnQsIHJ0V2lkZ2V0LnRvcCk7DQorICBtdC5Db25jYXQobXRSb3RhdGUpOw0KKyAgR2V0QXBwKCktPkdldFdpZGdldE1nckRlbGVnYXRlKCktPk9uRHJhd1dpZGdldChtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwR1MsICZtdCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlB1c2hCdXR0b246OkxvYWRXaWRnZXQoKSB7DQorICBGWFNZU19hc3NlcnQobV9wTm9ybWFsV2lkZ2V0ID09IE5VTEwpOw0KKyAgQ0ZXTF9QdXNoQnV0dG9uKiBwUHVzaEJ1dHRvbiA9IENGV0xfUHVzaEJ1dHRvbjo6Q3JlYXRlKCk7DQorICBpZiAocFB1c2hCdXR0b24pIHsNCisgICAgcFB1c2hCdXR0b24tPkluaXRpYWxpemUoKTsNCisgIH0NCisgIG1fcE9sZERlbGVnYXRlID0gcFB1c2hCdXR0b24tPlNldERlbGVnYXRlKHRoaXMpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0ID0gKENGV0xfV2lkZ2V0KilwUHVzaEJ1dHRvbjsNCisgIElGV0xfV2lkZ2V0KiBwV2lkZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+U2V0UHJpdmF0ZURhdGEocFdpZGdldCwgdGhpcywgTlVMTCk7DQorICBJRldMX05vdGVEcml2ZXIqIHBOb3RlRHJpdmVyID0gRldMX0dldEFwcCgpLT5HZXROb3RlRHJpdmVyKCk7DQorICBwTm90ZURyaXZlci0+UmVnaXN0ZXJFdmVudFRhcmdldChwV2lkZ2V0LCBwV2lkZ2V0KTsNCisgIG1fcE5vcm1hbFdpZGdldC0+TG9ja1VwZGF0ZSgpOw0KKyAgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCisgIExvYWRIaWdobGlnaHRDYXB0aW9uKCk7DQorICBtX3BOb3JtYWxXaWRnZXQtPlVubG9ja1VwZGF0ZSgpOw0KKyAgcmV0dXJuIENYRkFfRkZGaWVsZDo6TG9hZFdpZGdldCgpOw0KK30NCit2b2lkIENYRkFfRkZQdXNoQnV0dG9uOjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpIHsNCisgIEZYX0RXT1JEIGR3U3R5bGVFeCA9IDA7DQorICBzd2l0Y2ggKG1fcERhdGFBY2MtPkdldEJ1dHRvbkhpZ2hsaWdodCgpKSB7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSW52ZXJ0ZWQ6DQorICAgICAgZHdTdHlsZUV4ID0gWEZBX0ZXTF9QU0JTVFlMRUVYVF9IaWxpdGVJbnZlcnRlZDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9PdXRsaW5lOg0KKyAgICAgIGR3U3R5bGVFeCA9IFhGQV9GV0xfUFNCU1RZTEVFWFRfSGlsaXRlT3V0TGluZTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9QdXNoOg0KKyAgICAgIGR3U3R5bGVFeCA9IFhGQV9GV0xfUFNCU1RZTEVFWFRfSGlsaXRlUHVzaDsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIG1fcE5vcm1hbFdpZGdldC0+TW9kaWZ5U3R5bGVzRXgoZHdTdHlsZUV4LCAweEZGRkZGRkZGKTsNCit9DQordm9pZCBDWEZBX0ZGUHVzaEJ1dHRvbjo6VW5sb2FkV2lkZ2V0KCkgew0KKyAgaWYgKG1fcFJvbGxvdmVyVGV4dExheW91dCkgew0KKyAgICBkZWxldGUgbV9wUm9sbG92ZXJUZXh0TGF5b3V0Ow0KKyAgICBtX3BSb2xsb3ZlclRleHRMYXlvdXQgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcERvd25UZXh0TGF5b3V0KSB7DQorICAgIGRlbGV0ZSBtX3BEb3duVGV4dExheW91dDsNCisgICAgbV9wRG93blRleHRMYXlvdXQgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcERvd25Qcm92aWRlcikgew0KKyAgICBkZWxldGUgbV9wRG93blByb3ZpZGVyOw0KKyAgICBtX3BEb3duUHJvdmlkZXIgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcFJvbGxQcm92aWRlcikgew0KKyAgICBkZWxldGUgbV9wUm9sbFByb3ZpZGVyOw0KKyAgICBtX3BSb2xsUHJvdmlkZXIgPSBOVUxMOw0KKyAgfQ0KKyAgQ1hGQV9GRkZpZWxkOjpVbmxvYWRXaWRnZXQoKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGUHVzaEJ1dHRvbjo6UGVyZm9ybUxheW91dCgpIHsNCisgIENYRkFfRkZXaWRnZXQ6OlBlcmZvcm1MYXlvdXQoKTsNCisgIENGWF9SZWN0RiBydFdpZGdldDsNCisgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0V2lkZ2V0KTsNCisgIG1fcnRVSSA9IHJ0V2lkZ2V0Ow0KKyAgaWYgKENYRkFfTWFyZ2luIG1nV2lkZ2V0ID0gbV9wRGF0YUFjYy0+R2V0TWFyZ2luKCkpIHsNCisgICAgWEZBX1JlY3RXaWR0aG91dE1hcmdpbihydFdpZGdldCwgbWdXaWRnZXQpOw0KKyAgfQ0KKyAgQ1hGQV9DYXB0aW9uIGNhcHRpb24gPSBtX3BEYXRhQWNjLT5HZXRDYXB0aW9uKCk7DQorICBtX3J0Q2FwdGlvbi5TZXQocnRXaWRnZXQubGVmdCwgcnRXaWRnZXQudG9wLCBydFdpZGdldC53aWR0aCwgcnRXaWRnZXQuaGVpZ2h0KTsNCisgIGlmIChDWEZBX01hcmdpbiBtZ0NhcCA9IGNhcHRpb24uR2V0TWFyZ2luKCkpIHsNCisgICAgWEZBX1JlY3RXaWR0aG91dE1hcmdpbihtX3J0Q2FwdGlvbiwgbWdDYXApOw0KKyAgfQ0KKyAgTGF5b3V0SGlnaGxpZ2h0Q2FwdGlvbigpOw0KKyAgU2V0RldMUmVjdCgpOw0KKyAgaWYgKG1fcE5vcm1hbFdpZGdldCkgew0KKyAgICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0ZMT0FUIENYRkFfRkZQdXNoQnV0dG9uOjpHZXRMaW5lV2lkdGgoKSB7DQorICBDWEZBX0JvcmRlciBib3JkZXIgPSBtX3BEYXRhQWNjLT5HZXRCb3JkZXIoKTsNCisgIGlmIChib3JkZXIuSXNFeGlzdEluWE1MKCkgJiYNCisgICAgICAoYm9yZGVyLkdldFByZXNlbmNlKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZSkpIHsNCisgICAgQ1hGQV9FZGdlIGVkZ2UgPSBib3JkZXIuR2V0RWRnZSgwKTsNCisgICAgcmV0dXJuIGVkZ2UuR2V0VGhpY2tuZXNzKCk7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorRlhfQVJHQiBDWEZBX0ZGUHVzaEJ1dHRvbjo6R2V0TGluZUNvbG9yKCkgew0KKyAgcmV0dXJuIDB4RkYwMDAwMDA7DQorfQ0KK0ZYX0FSR0IgQ1hGQV9GRlB1c2hCdXR0b246OkdldEZpbGxDb2xvcigpIHsNCisgIHJldHVybiAweEZGRkZGRkZGOw0KK30NCit2b2lkIENYRkFfRkZQdXNoQnV0dG9uOjpMb2FkSGlnaGxpZ2h0Q2FwdGlvbigpIHsNCisgIENYRkFfQ2FwdGlvbiBjYXB0aW9uID0gbV9wRGF0YUFjYy0+R2V0Q2FwdGlvbigpOw0KKyAgaWYgKGNhcHRpb24uSXNFeGlzdEluWE1MKCkgJiYNCisgICAgICBjYXB0aW9uLkdldFByZXNlbmNlKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fSGlkZGVuKSB7DQorICAgIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1JvbGxvdmVyOw0KKyAgICAgIEZYX0JPT0wgYlJpY2hUZXh0Ow0KKyAgICAgIGlmIChtX3BEYXRhQWNjLT5HZXRCdXR0b25Sb2xsb3Zlcih3c1JvbGxvdmVyLCBiUmljaFRleHQpKSB7DQorICAgICAgICBpZiAobV9wUm9sbFByb3ZpZGVyID09IE5VTEwpIHsNCisgICAgICAgICAgbV9wUm9sbFByb3ZpZGVyID0NCisgICAgICAgICAgICAgIG5ldyBDWEZBX1RleHRQcm92aWRlcihtX3BEYXRhQWNjLCBYRkFfVEVYVFBST1ZJREVSVFlQRV9Sb2xsb3Zlcik7DQorICAgICAgICB9DQorICAgICAgICBtX3BSb2xsb3ZlclRleHRMYXlvdXQgPSBuZXcgQ1hGQV9UZXh0TGF5b3V0KG1fcFJvbGxQcm92aWRlcik7DQorICAgICAgfQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzRG93bjsNCisgICAgICBpZiAobV9wRGF0YUFjYy0+R2V0QnV0dG9uRG93bih3c0Rvd24sIGJSaWNoVGV4dCkpIHsNCisgICAgICAgIGlmIChtX3BEb3duUHJvdmlkZXIgPT0gTlVMTCkgew0KKyAgICAgICAgICBtX3BEb3duUHJvdmlkZXIgPQ0KKyAgICAgICAgICAgICAgbmV3IENYRkFfVGV4dFByb3ZpZGVyKG1fcERhdGFBY2MsIFhGQV9URVhUUFJPVklERVJUWVBFX0Rvd24pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wRG93blRleHRMYXlvdXQgPSBuZXcgQ1hGQV9UZXh0TGF5b3V0KG1fcERvd25Qcm92aWRlcik7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRlB1c2hCdXR0b246OkxheW91dEhpZ2hsaWdodENhcHRpb24oKSB7DQorICBDRlhfU2l6ZUYgc3o7DQorICBzei5TZXQobV9ydENhcHRpb24ud2lkdGgsIG1fcnRDYXB0aW9uLmhlaWdodCk7DQorICBMYXlvdXRDYXB0aW9uKCk7DQorICBpZiAobV9wUm9sbG92ZXJUZXh0TGF5b3V0KSB7DQorICAgIG1fcFJvbGxvdmVyVGV4dExheW91dC0+TGF5b3V0KHN6KTsNCisgIH0NCisgIGlmIChtX3BEb3duVGV4dExheW91dCkgew0KKyAgICBtX3BEb3duVGV4dExheW91dC0+TGF5b3V0KHN6KTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZGUHVzaEJ1dHRvbjo6UmVuZGVySGlnaGxpZ2h0Q2FwdGlvbihDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENYRkFfVGV4dExheW91dCogcENhcFRleHRMYXlvdXQgPSBtX3BEYXRhQWNjLT5HZXRDYXB0aW9uVGV4dExheW91dCgpOw0KKyAgQ1hGQV9DYXB0aW9uIGNhcHRpb24gPSBtX3BEYXRhQWNjLT5HZXRDYXB0aW9uKCk7DQorICBpZiAoY2FwdGlvbi5Jc0V4aXN0SW5YTUwoKSAmJg0KKyAgICAgIGNhcHRpb24uR2V0UHJlc2VuY2UoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlKSB7DQorICAgIENGWF9SZW5kZXJEZXZpY2UqIHBSZW5kZXJEZXZpY2UgPSBwR1MtPkdldFJlbmRlckRldmljZSgpOw0KKyAgICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICAgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0V2lkZ2V0KTsNCisgICAgQ0ZYX1JlY3RGIHJ0Q2xpcCA9IG1fcnRDYXB0aW9uOw0KKyAgICBydENsaXAuSW50ZXJzZWN0KHJ0V2lkZ2V0KTsNCisgICAgQ0ZYX01hdHJpeCBtdDsNCisgICAgbXQuU2V0KDEsIDAsIDAsIDEsIG1fcnRDYXB0aW9uLmxlZnQsIG1fcnRDYXB0aW9uLnRvcCk7DQorICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgcE1hdHJpeC0+VHJhbnNmb3JtUmVjdChydENsaXApOw0KKyAgICAgIG10LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIH0NCisgICAgew0KKyAgICAgIEZYX0RXT1JEIGR3U3RhdGUgPSBtX3BOb3JtYWxXaWRnZXQtPkdldFN0YXRlcygpOw0KKyAgICAgIGlmIChtX3BEb3duVGV4dExheW91dCAmJiAoZHdTdGF0ZSAmIEZXTF9TVEFURV9QU0JfUHJlc3NlZCkgJiYNCisgICAgICAgICAgKGR3U3RhdGUgJiBGV0xfU1RBVEVfUFNCX0hvdmVyZWQpKSB7DQorICAgICAgICBpZiAobV9wRG93blRleHRMYXlvdXQtPkRyYXdTdHJpbmcocFJlbmRlckRldmljZSwgbXQsIHJ0Q2xpcCkpIHsNCisgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSBpZiAobV9wUm9sbG92ZXJUZXh0TGF5b3V0ICYmIChkd1N0YXRlICYgRldMX1NUQVRFX1BTQl9Ib3ZlcmVkKSkgew0KKyAgICAgICAgaWYgKG1fcFJvbGxvdmVyVGV4dExheW91dC0+RHJhd1N0cmluZyhwUmVuZGVyRGV2aWNlLCBtdCwgcnRDbGlwKSkgew0KKyAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChwQ2FwVGV4dExheW91dCkgew0KKyAgICAgIHBDYXBUZXh0TGF5b3V0LT5EcmF3U3RyaW5nKHBSZW5kZXJEZXZpY2UsIG10LCBydENsaXApOw0KKyAgICB9DQorICB9DQorfQ0KK2ludDMyX3QgQ1hGQV9GRlB1c2hCdXR0b246Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgew0KKyAgcmV0dXJuIG1fcE9sZERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsNCit9DQorRldMX0VSUiBDWEZBX0ZGUHVzaEJ1dHRvbjo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSB7DQorICBtX3BPbGREZWxlZ2F0ZS0+T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCisgIHJldHVybiBDWEZBX0ZGRmllbGQ6Ok9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7DQorfQ0KK0ZXTF9FUlIgQ1hGQV9GRlB1c2hCdXR0b246Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgaWYgKG1fcE5vcm1hbFdpZGdldC0+R2V0U3R5bGVzRXgoKSAmIFhGQV9GV0xfUFNCU1RZTEVFWFRfSGlsaXRlSW52ZXJ0ZWQpIHsNCisgICAgaWYgKChtX3BOb3JtYWxXaWRnZXQtPkdldFN0YXRlcygpICYgRldMX1NUQVRFX1BTQl9QcmVzc2VkKSAmJg0KKyAgICAgICAgKG1fcE5vcm1hbFdpZGdldC0+R2V0U3RhdGVzKCkgJiBGV0xfU1RBVEVfUFNCX0hvdmVyZWQpKSB7DQorICAgICAgQ0ZYX1JlY3RGIHJ0RmlsbDsNCisgICAgICBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldFJlY3QocnRGaWxsKTsNCisgICAgICBydEZpbGwubGVmdCA9IHJ0RmlsbC50b3AgPSAwOw0KKyAgICAgIEZYX0ZMT0FUIGZMaW5lV2l0aCA9IEdldExpbmVXaWR0aCgpOw0KKyAgICAgIHJ0RmlsbC5EZWZsYXRlKGZMaW5lV2l0aCwgZkxpbmVXaXRoKTsNCisgICAgICBDRlhfQ29sb3IgY3IoRlhBUkdCX01BS0UoMTI4LCAxMjgsIDI1NSwgMjU1KSk7DQorICAgICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyKTsNCisgICAgICBDRlhfUGF0aCBwYXRoOw0KKyAgICAgIHBhdGguQ3JlYXRlKCk7DQorICAgICAgcGF0aC5BZGRSZWN0YW5nbGUocnRGaWxsLmxlZnQsIHJ0RmlsbC50b3AsIHJ0RmlsbC53aWR0aCwgcnRGaWxsLmhlaWdodCk7DQorICAgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIChDRlhfTWF0cml4KilwTWF0cml4KTsNCisgICAgfQ0KKyAgfSBlbHNlIGlmIChtX3BOb3JtYWxXaWRnZXQtPkdldFN0eWxlc0V4KCkgJg0KKyAgICAgICAgICAgICBYRkFfRldMX1BTQlNUWUxFRVhUX0hpbGl0ZU91dExpbmUpIHsNCisgICAgaWYgKChtX3BOb3JtYWxXaWRnZXQtPkdldFN0YXRlcygpICYgRldMX1NUQVRFX1BTQl9QcmVzc2VkKSAmJg0KKyAgICAgICAgKG1fcE5vcm1hbFdpZGdldC0+R2V0U3RhdGVzKCkgJiBGV0xfU1RBVEVfUFNCX0hvdmVyZWQpKSB7DQorICAgICAgRlhfRkxPQVQgZkxpbmVXaWR0aCA9IEdldExpbmVXaWR0aCgpOw0KKyAgICAgIENGWF9Db2xvciBjcihGWEFSR0JfTUFLRSgyNTUsIDEyOCwgMjU1LCAyNTUpKTsNCisgICAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjcik7DQorICAgICAgcEdyYXBoaWNzLT5TZXRMaW5lV2lkdGgoZkxpbmVXaWR0aCk7DQorICAgICAgQ0ZYX1BhdGggcGF0aDsNCisgICAgICBwYXRoLkNyZWF0ZSgpOw0KKyAgICAgIENGWF9SZWN0RiByZWN0Ow0KKyAgICAgIG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0UmVjdChyZWN0KTsNCisgICAgICBwYXRoLkFkZFJlY3RhbmdsZSgwLCAwLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7DQorICAgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCAoQ0ZYX01hdHJpeCopcE1hdHJpeCk7DQorICAgIH0NCisgIH0gZWxzZSBpZiAobV9wTm9ybWFsV2lkZ2V0LT5HZXRTdHlsZXNFeCgpICYgWEZBX0ZXTF9QU0JTVFlMRUVYVF9IaWxpdGVQdXNoKSB7DQorICB9DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnB1c2hidXR0b24uaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnB1c2hidXR0b24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTljNDMyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmcHVzaGJ1dHRvbi5oCkBAIC0wLDAgKzEsNDMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhGQV9GT1JNRklMTEVSX1BVU0hCVVRUT05fSU1QX0gNCisjZGVmaW5lIF9GWEZBX0ZPUk1GSUxMRVJfUFVTSEJVVFRPTl9JTVBfSA0KKyNkZWZpbmUgWEZBX0ZXTF9QU0JTVFlMRUVYVF9IaWxpdGVOb25lICgwTCA8PCAwKQ0KKyNkZWZpbmUgWEZBX0ZXTF9QU0JTVFlMRUVYVF9IaWxpdGVJbnZlcnRlZCAoMUwgPDwgMCkNCisjZGVmaW5lIFhGQV9GV0xfUFNCU1RZTEVFWFRfSGlsaXRlUHVzaCAoMkwgPDwgMCkNCisjZGVmaW5lIFhGQV9GV0xfUFNCU1RZTEVFWFRfSGlsaXRlT3V0TGluZSAoNEwgPDwgMCkNCitjbGFzcyBDWEZBX0ZGUHVzaEJ1dHRvbiA6IHB1YmxpYyBDWEZBX0ZGRmllbGQgew0KKyBwdWJsaWM6DQorICBDWEZBX0ZGUHVzaEJ1dHRvbihDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsNCisgIHZpcnR1YWwgfkNYRkFfRkZQdXNoQnV0dG9uKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMgPSAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSb3RhdGUgPSAwKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBMb2FkV2lkZ2V0KCk7DQorICB2aXJ0dWFsIHZvaWQgVW5sb2FkV2lkZ2V0KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUGVyZm9ybUxheW91dCgpOw0KKyAgdmlydHVhbCB2b2lkIFVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQorICB2aXJ0dWFsIGludDMyX3QgT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKTsNCisgIHZpcnR1YWwgRldMX0VSUiBPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIE9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIExvYWRIaWdobGlnaHRDYXB0aW9uKCk7DQorICB2b2lkIExheW91dEhpZ2hsaWdodENhcHRpb24oKTsNCisgIHZvaWQgUmVuZGVySGlnaGxpZ2h0Q2FwdGlvbihDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwpOw0KKyAgRlhfRkxPQVQgR2V0TGluZVdpZHRoKCk7DQorICBGWF9BUkdCIEdldExpbmVDb2xvcigpOw0KKyAgRlhfQVJHQiBHZXRGaWxsQ29sb3IoKTsNCisgIENYRkFfVGV4dExheW91dCogbV9wUm9sbG92ZXJUZXh0TGF5b3V0Ow0KKyAgQ1hGQV9UZXh0TGF5b3V0KiBtX3BEb3duVGV4dExheW91dDsNCisgIENYRkFfVGV4dFByb3ZpZGVyKiBtX3BEb3duUHJvdmlkZXI7DQorICBDWEZBX1RleHRQcm92aWRlciogbV9wUm9sbFByb3ZpZGVyOw0KKyAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogbV9wT2xkRGVsZWdhdGU7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZzaWduYXR1cmUuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmc2lnbmF0dXJlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODEwMjkyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmc2lnbmF0dXJlLmNwcApAQCAtMCwwICsxLDEyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfY29tbW9uLmgiDQorI2luY2x1ZGUgInhmYV9mZndpZGdldC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZmaWVsZC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZwYWdldmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZzaWduYXR1cmUuaCINCisjaW5jbHVkZSAieGZhX2ZmZG9jLmgiDQorQ1hGQV9GRlNpZ25hdHVyZTo6Q1hGQV9GRlNpZ25hdHVyZShDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCisgICAgOiBDWEZBX0ZGRmllbGQocFBhZ2VWaWV3LCBwRGF0YUFjYykge30NCitDWEZBX0ZGU2lnbmF0dXJlOjp+Q1hGQV9GRlNpZ25hdHVyZSgpIHt9DQorRlhfQk9PTCBDWEZBX0ZGU2lnbmF0dXJlOjpMb2FkV2lkZ2V0KCkgew0KKyAgcmV0dXJuIENYRkFfRkZGaWVsZDo6TG9hZFdpZGdldCgpOw0KK30NCit2b2lkIENYRkFfRkZTaWduYXR1cmU6OlJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0ZSkgew0KKyAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX01hdHJpeCBtdFJvdGF0ZTsNCisgIEdldFJvdGF0ZU1hdHJpeChtdFJvdGF0ZSk7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBtdFJvdGF0ZS5Db25jYXQoKnBNYXRyaXgpOw0KKyAgfQ0KKyAgQ1hGQV9GRldpZGdldDo6UmVuZGVyV2lkZ2V0KHBHUywgJm10Um90YXRlLCBkd1N0YXR1cyk7DQorICBDWEZBX0JvcmRlciBib3JkZXJVSSA9IG1fcERhdGFBY2MtPkdldFVJQm9yZGVyKCk7DQorICBEcmF3Qm9yZGVyKHBHUywgYm9yZGVyVUksIG1fcnRVSSwgJm10Um90YXRlKTsNCisgIFJlbmRlckNhcHRpb24ocEdTLCAmbXRSb3RhdGUpOw0KKyAgRHJhd0hpZ2hsaWdodChwR1MsICZtdFJvdGF0ZSwgZHdTdGF0dXMsIEZBTFNFKTsNCisgIENGWF9SZWN0RiBydFdpZGdldCA9IG1fcnRVSTsNCisgIElYRkFfRG9jUHJvdmlkZXIqIHBEb2NQcm92aWRlciA9IG1fcERhdGFBY2MtPkdldERvYygpLT5HZXREb2NQcm92aWRlcigpOw0KKyAgRlhTWVNfYXNzZXJ0KHBEb2NQcm92aWRlcik7DQorICBwRG9jUHJvdmlkZXItPlJlbmRlckN1c3RvbVdpZGdldCh0aGlzLCBwR1MsICZtdFJvdGF0ZSwgcnRXaWRnZXQpOw0KK30NCitGWF9CT09MIENYRkFfRkZTaWduYXR1cmU6Ok9uTW91c2VFbnRlcigpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGU2lnbmF0dXJlOjpPbk1vdXNlRXhpdCgpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGU2lnbmF0dXJlOjpPbkxCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfRkZTaWduYXR1cmU6Ok9uTEJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlNpZ25hdHVyZTo6T25MQnV0dG9uRGJsQ2xrKEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGU2lnbmF0dXJlOjpPbk1vdXNlTW92ZShGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfRkZTaWduYXR1cmU6Ok9uTW91c2VXaGVlbChGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgekRlbHRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlNpZ25hdHVyZTo6T25SQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGU2lnbmF0dXJlOjpPblJCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfRkZTaWduYXR1cmU6Ok9uUkJ1dHRvbkRibENsayhGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlNpZ25hdHVyZTo6T25LZXlEb3duKEZYX0RXT1JEIGR3S2V5Q29kZSwgRlhfRFdPUkQgZHdGbGFncykgew0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfRkZTaWduYXR1cmU6Ok9uS2V5VXAoRlhfRFdPUkQgZHdLZXlDb2RlLCBGWF9EV09SRCBkd0ZsYWdzKSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlNpZ25hdHVyZTo6T25DaGFyKEZYX0RXT1JEIGR3Q2hhciwgRlhfRFdPUkQgZHdGbGFncykgew0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9EV09SRCBDWEZBX0ZGU2lnbmF0dXJlOjpPbkhpdFRlc3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSB7DQorICBpZiAobV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgIEZYX0ZMT0FUIGZmeCA9IGZ4LCBmZnkgPSBmeTsNCisgICAgRldMVG9DbGllbnQoZmZ4LCBmZnkpOw0KKyAgICBGWF9EV09SRCBkd1dpZGdldEhpdCA9IG1fcE5vcm1hbFdpZGdldC0+SGl0VGVzdChmZngsIGZmeSk7DQorICAgIGlmIChkd1dpZGdldEhpdCAhPSBGV0xfV0dUSElUVEVTVF9Vbmtub3duKSB7DQorICAgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0NsaWVudDsNCisgICAgfQ0KKyAgfQ0KKyAgQ0ZYX1JlY3RGIHJ0Qm94Ow0KKyAgR2V0UmVjdFdpdGhvdXRSb3RhdGUocnRCb3gpOw0KKyAgaWYgKCFydEJveC5Db250YWlucyhmeCwgZnkpKSB7DQorICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Vbmtub3duOw0KKyAgfQ0KKyAgaWYgKG1fcnRDYXB0aW9uLkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1RpdGxlYmFyOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0NsaWVudDsNCit9DQorRlhfQk9PTCBDWEZBX0ZGU2lnbmF0dXJlOjpPblNldEN1cnNvcihGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmc2lnbmF0dXJlLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZzaWduYXR1cmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWQxNWZkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmc2lnbmF0dXJlLmgKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWEZBX0ZPUk1GSUxMRVJfU0lHTkFUVVJFX0lNUF9IDQorI2RlZmluZSBfRlhGQV9GT1JNRklMTEVSX1NJR05BVFVSRV9JTVBfSA0KK2NsYXNzIENYRkFfRkZTaWduYXR1cmUgZmluYWwgOiBwdWJsaWMgQ1hGQV9GRkZpZWxkIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GRlNpZ25hdHVyZShDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsNCisgIHZpcnR1YWwgfkNYRkFfRkZTaWduYXR1cmUoKTsNCisNCisgIHZpcnR1YWwgdm9pZCBSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXR1cyA9IDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0ZSA9IDApOw0KKyAgdmlydHVhbCBGWF9CT09MIExvYWRXaWRnZXQoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlRW50ZXIoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlRXhpdCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRibENsayhGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VNb3ZlKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25Nb3VzZVdoZWVsKEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgekRlbHRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPblJCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvbkRibENsayhGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKw0KKyAgdmlydHVhbCBGWF9CT09MIE9uS2V5RG93bihGWF9EV09SRCBkd0tleUNvZGUsIEZYX0RXT1JEIGR3RmxhZ3MpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uS2V5VXAoRlhfRFdPUkQgZHdLZXlDb2RlLCBGWF9EV09SRCBkd0ZsYWdzKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbkNoYXIoRlhfRFdPUkQgZHdDaGFyLCBGWF9EV09SRCBkd0ZsYWdzKTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgT25IaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25TZXRDdXJzb3IoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisNCisgcHJvdGVjdGVkOg0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmc3ViZm9ybS5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZzdWJmb3JtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGMyZTA2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmc3ViZm9ybS5jcHAKQEAgLTAsMCArMSwxNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfY29tbW9uLmgiDQorI2luY2x1ZGUgInhmYV9mZndpZGdldC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZzdWJmb3JtLmgiDQorI2luY2x1ZGUgInhmYV9mZnBhZ2V2aWV3LmgiDQorI2luY2x1ZGUgInhmYV9mZmFwcC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2MuaCINCitDWEZBX0ZGU3ViRm9ybTo6Q1hGQV9GRlN1YkZvcm0oQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCisgICAgOiBDWEZBX0ZGV2lkZ2V0KHBQYWdlVmlldywgcERhdGFBY2MpIHt9DQorQ1hGQV9GRlN1YkZvcm06On5DWEZBX0ZGU3ViRm9ybSgpIHt9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmc3ViZm9ybS5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmc3ViZm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NmYxZjQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZzdWJmb3JtLmgKQEAgLTAsMCArMSwxNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWEZBX0ZPUk1GSUxMRVJfU1VCRk9STV9JTVBfSA0KKyNkZWZpbmUgX0ZYRkFfRk9STUZJTExFUl9TVUJGT1JNX0lNUF9IDQorY2xhc3MgQ1hGQV9GRlN1YkZvcm0gOiBwdWJsaWMgQ1hGQV9GRldpZGdldCB7DQorIHB1YmxpYzoNCisgIENYRkFfRkZTdWJGb3JtKENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgdmlydHVhbCB+Q1hGQV9GRlN1YkZvcm0oKTsNCisNCisgcHJvdGVjdGVkOg0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmdGV4dC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ0ZXh0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGRjNzhlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmdGV4dC5jcHAKQEAgLTAsMCArMSwxNzcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2NvbW1vbi5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXQuaCINCisjaW5jbHVkZSAieGZhX2ZmZHJhdy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ0ZXh0LmgiDQorI2luY2x1ZGUgInhmYV90ZXh0bGF5b3V0LmgiDQorI2luY2x1ZGUgInhmYV9mZnBhZ2V2aWV3LmgiDQorI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZhcHAuaCINCitDWEZBX0ZGVGV4dDo6Q1hGQV9GRlRleHQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykNCisgICAgOiBDWEZBX0ZGRHJhdyhwUGFnZVZpZXcsIHBEYXRhQWNjKSB7fQ0KK0NYRkFfRkZUZXh0Ojp+Q1hGQV9GRlRleHQoKSB7fQ0KK3ZvaWQgQ1hGQV9GRlRleHQ6OlJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0ZSkgew0KKyAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgew0KKyAgICBDRlhfTWF0cml4IG10Um90YXRlOw0KKyAgICBHZXRSb3RhdGVNYXRyaXgobXRSb3RhdGUpOw0KKyAgICBpZiAocE1hdHJpeCkgew0KKyAgICAgIG10Um90YXRlLkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIH0NCisgICAgQ1hGQV9GRldpZGdldDo6UmVuZGVyV2lkZ2V0KHBHUywgJm10Um90YXRlLCBkd1N0YXR1cyk7DQorICAgIENYRkFfVGV4dExheW91dCogcFRleHRMYXlvdXQgPSBtX3BEYXRhQWNjLT5HZXRUZXh0TGF5b3V0KCk7DQorICAgIGlmIChwVGV4dExheW91dCkgew0KKyAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBSZW5kZXJEZXZpY2UgPSBwR1MtPkdldFJlbmRlckRldmljZSgpOw0KKyAgICAgIENGWF9SZWN0RiBydFRleHQ7DQorICAgICAgR2V0UmVjdFdpdGhvdXRSb3RhdGUocnRUZXh0KTsNCisgICAgICBpZiAoQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSBtX3BEYXRhQWNjLT5HZXRNYXJnaW4oKSkgew0KKyAgICAgICAgQ1hGQV9MYXlvdXRJdGVtKiBwSXRlbSA9IHRoaXM7DQorICAgICAgICBpZiAocEl0ZW0tPkdldFByZXYoKSA9PSBOVUxMICYmIHBJdGVtLT5HZXROZXh0KCkgPT0gTlVMTCkgew0KKyAgICAgICAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKHJ0VGV4dCwgbWdXaWRnZXQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgRlhfRkxPQVQgZkxlZnRJbnNldCwgZlJpZ2h0SW5zZXQsIGZUb3BJbnNldCA9IDAsIGZCb3R0b21JbnNldCA9IDA7DQorICAgICAgICAgIG1nV2lkZ2V0LkdldExlZnRJbnNldChmTGVmdEluc2V0KTsNCisgICAgICAgICAgbWdXaWRnZXQuR2V0UmlnaHRJbnNldChmUmlnaHRJbnNldCk7DQorICAgICAgICAgIGlmIChwSXRlbS0+R2V0UHJldigpID09IE5VTEwpIHsNCisgICAgICAgICAgICBtZ1dpZGdldC5HZXRUb3BJbnNldChmVG9wSW5zZXQpOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHBJdGVtLT5HZXROZXh0KCkgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIG1nV2lkZ2V0LkdldEJvdHRvbUluc2V0KGZCb3R0b21JbnNldCk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcnRUZXh0LkRlZmxhdGUoZkxlZnRJbnNldCwgZlRvcEluc2V0LCBmUmlnaHRJbnNldCwgZkJvdHRvbUluc2V0KTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgQ0ZYX01hdHJpeCBtdDsNCisgICAgICBtdC5TZXQoMSwgMCwgMCwgMSwgcnRUZXh0LmxlZnQsIHJ0VGV4dC50b3ApOw0KKyAgICAgIENGWF9SZWN0RiBydENsaXAgPSBydFRleHQ7DQorICAgICAgbXRSb3RhdGUuVHJhbnNmb3JtUmVjdChydENsaXApOw0KKyAgICAgIG10LkNvbmNhdChtdFJvdGF0ZSk7DQorICAgICAgcFRleHRMYXlvdXQtPkRyYXdTdHJpbmcocFJlbmRlckRldmljZSwgbXQsIHJ0Q2xpcCwgR2V0SW5kZXgoKSk7DQorICAgIH0NCisgIH0NCit9DQorRlhfQk9PTCBDWEZBX0ZGVGV4dDo6SXNMb2FkZWQoKSB7DQorICBDWEZBX1RleHRMYXlvdXQqIHBUZXh0TGF5b3V0ID0gbV9wRGF0YUFjYy0+R2V0VGV4dExheW91dCgpOw0KKyAgcmV0dXJuIHBUZXh0TGF5b3V0ICE9IE5VTEwgJiYgIXBUZXh0TGF5b3V0LT5tX2JIYXNCbG9jazsNCit9DQorRlhfQk9PTCBDWEZBX0ZGVGV4dDo6UGVyZm9ybUxheW91dCgpIHsNCisgIENYRkFfRkZEcmF3OjpQZXJmb3JtTGF5b3V0KCk7DQorICBDWEZBX1RleHRMYXlvdXQqIHBUZXh0TGF5b3V0ID0gbV9wRGF0YUFjYy0+R2V0VGV4dExheW91dCgpOw0KKyAgaWYgKCFwVGV4dExheW91dCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoIXBUZXh0TGF5b3V0LT5tX2JIYXNCbG9jaykgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHBUZXh0TGF5b3V0LT5tX0Jsb2Nrcy5SZW1vdmVBbGwoKTsNCisgIENYRkFfTGF5b3V0SXRlbSogcEl0ZW0gPSB0aGlzOw0KKyAgaWYgKHBJdGVtLT5HZXRQcmV2KCkgPT0gTlVMTCAmJiBwSXRlbS0+R2V0TmV4dCgpID09IE5VTEwpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBwSXRlbSA9IHBJdGVtLT5HZXRGaXJzdCgpOw0KKyAgd2hpbGUgKHBJdGVtKSB7DQorICAgIENGWF9SZWN0RiBydFRleHQ7DQorICAgIHBJdGVtLT5HZXRSZWN0KHJ0VGV4dCk7DQorICAgIGlmIChDWEZBX01hcmdpbiBtZ1dpZGdldCA9IG1fcERhdGFBY2MtPkdldE1hcmdpbigpKSB7DQorICAgICAgaWYgKHBJdGVtLT5HZXRQcmV2KCkgPT0gTlVMTCkgew0KKyAgICAgICAgRlhfRkxPQVQgZlRvcEluc2V0Ow0KKyAgICAgICAgbWdXaWRnZXQuR2V0VG9wSW5zZXQoZlRvcEluc2V0KTsNCisgICAgICAgIHJ0VGV4dC5oZWlnaHQgLT0gZlRvcEluc2V0Ow0KKyAgICAgIH0gZWxzZSBpZiAocEl0ZW0tPkdldE5leHQoKSA9PSBOVUxMKSB7DQorICAgICAgICBGWF9GTE9BVCBmQm90dG9tSW5zZXQ7DQorICAgICAgICBtZ1dpZGdldC5HZXRCb3R0b21JbnNldChmQm90dG9tSW5zZXQpOw0KKyAgICAgICAgcnRUZXh0LmhlaWdodCAtPSBmQm90dG9tSW5zZXQ7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHBUZXh0TGF5b3V0LT5JdGVtQmxvY2tzKHJ0VGV4dCwgcEl0ZW0tPkdldEluZGV4KCkpOw0KKyAgICBwSXRlbSA9IHBJdGVtLT5HZXROZXh0KCk7DQorICB9DQorICBwVGV4dExheW91dC0+bV9iSGFzQmxvY2sgPSBGQUxTRTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRkZUZXh0OjpPbkxCdXR0b25Eb3duKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgQ0ZYX1JlY3RGIHJ0Qm94Ow0KKyAgR2V0UmVjdFdpdGhvdXRSb3RhdGUocnRCb3gpOw0KKyAgaWYgKCFydEJveC5Db250YWlucyhmeCwgZnkpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGNvbnN0IEZYX1dDSEFSKiB3c1VSTENvbnRlbnQgPSBHZXRMaW5rVVJMQXRQb2ludChmeCwgZnkpOw0KKyAgaWYgKE5VTEwgPT0gd3NVUkxDb250ZW50KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIFNldEJ1dHRvbkRvd24oVFJVRSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGVGV4dDo6T25Nb3VzZU1vdmUoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSB7DQorICBDRlhfUmVjdEYgcnRCb3g7DQorICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydEJveCk7DQorICBpZiAoIXJ0Qm94LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgY29uc3QgRlhfV0NIQVIqIHdzVVJMQ29udGVudCA9IEdldExpbmtVUkxBdFBvaW50KGZ4LCBmeSk7DQorICBpZiAoTlVMTCA9PSB3c1VSTENvbnRlbnQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHQ6Ok9uTEJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKCFJc0J1dHRvbkRvd24oKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBTZXRCdXR0b25Eb3duKEZBTFNFKTsNCisgIGNvbnN0IEZYX1dDSEFSKiB3c1VSTENvbnRlbnQgPSBHZXRMaW5rVVJMQXRQb2ludChmeCwgZnkpOw0KKyAgaWYgKE5VTEwgPT0gd3NVUkxDb250ZW50KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENYRkFfRkZEb2MqIHBEb2MgPSBHZXREb2MoKTsNCisgIHBEb2MtPkdldERvY1Byb3ZpZGVyKCktPkdvdG9VUkwocERvYywgQ0ZYX1dpZGVTdHJpbmdDKHdzVVJMQ29udGVudCksIEZBTFNFKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9EV09SRCBDWEZBX0ZGVGV4dDo6T25IaXRUZXN0KEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSkgew0KKyAgQ0ZYX1JlY3RGIHJ0Qm94Ow0KKyAgR2V0UmVjdFdpdGhvdXRSb3RhdGUocnRCb3gpOw0KKyAgaWYgKCFydEJveC5Db250YWlucyhmeCwgZnkpKSB7DQorICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Vbmtub3duOw0KKyAgfQ0KKyAgaWYgKCFHZXRMaW5rVVJMQXRQb2ludChmeCwgZnkpKSB7DQorICAgIHJldHVybiBGV0xfV0dUSElUVEVTVF9Vbmtub3duOw0KKyAgfQ0KKyAgcmV0dXJuIEZXTF9XR1RISVRURVNUX0h5cGVyTGluazsNCit9DQorY29uc3QgRlhfV0NIQVIqIENYRkFfRkZUZXh0OjpHZXRMaW5rVVJMQXRQb2ludChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIENYRkFfVGV4dExheW91dCogcFRleHRMYXlvdXQgPSBtX3BEYXRhQWNjLT5HZXRUZXh0TGF5b3V0KCk7DQorICBpZiAoTlVMTCA9PSBwVGV4dExheW91dCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIEZYX0ZMT0FUIHgoZngpLCB5KGZ5KTsNCisgIEZXTFRvQ2xpZW50KHgsIHkpOw0KKyAgY29uc3QgQ1hGQV9QaWVjZUxpbmVBcnJheSogcFBpZWNlTGluZXMgPSBwVGV4dExheW91dC0+R2V0UGllY2VMaW5lcygpOw0KKyAgaW50MzJfdCBpQ291bnQgPSBwUGllY2VMaW5lcy0+R2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgQ1hGQV9QaWVjZUxpbmUqIHBQaWVjZUxpbmUgPSBwUGllY2VMaW5lcy0+R2V0QXQoaSk7DQorICAgIGludDMyX3QgaVBpZWNlcyA9IHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlcy5HZXRTaXplKCk7DQorICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlQaWVjZXM7IGorKykgew0KKyAgICAgIFhGQV9MUFRFWFRQSUVDRSBwUGllY2UgPSBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXMuR2V0QXQoaik7DQorICAgICAgaWYgKHBQaWVjZS0+cExpbmtEYXRhICYmIHBQaWVjZS0+cnRQaWVjZS5Db250YWlucyh4LCB5KSkgew0KKyAgICAgICAgcmV0dXJuIHBQaWVjZS0+cExpbmtEYXRhLT5HZXRMaW5rVVJMKCk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQordm9pZCBDWEZBX0ZGVGV4dDo6RldMVG9DbGllbnQoRlhfRkxPQVQmIGZ4LCBGWF9GTE9BVCYgZnkpIHsNCisgIENGWF9SZWN0RiBydFdpZGdldDsNCisgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0V2lkZ2V0KTsNCisgIGZ4IC09IHJ0V2lkZ2V0LmxlZnQ7DQorICBmeSAtPSBydFdpZGdldC50b3A7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnRleHQuaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmU0YTZlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmdGV4dC5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhGQV9GT1JNRklMTEVSX0RSQVdURVhUX0lNUF9IDQorI2RlZmluZSBfRlhGQV9GT1JNRklMTEVSX0RSQVdURVhUX0lNUF9IDQorY2xhc3MgQ1hGQV9UZXh0TGF5b3V0Ow0KK2NsYXNzIENYRkFfRkZUZXh0IDogcHVibGljIENYRkFfRkZEcmF3IHsNCisgcHVibGljOg0KKyAgQ1hGQV9GRlRleHQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQorICB2aXJ0dWFsIH5DWEZBX0ZGVGV4dCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VNb3ZlKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0RXT1JEIE9uSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCB2b2lkIFJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzID0gMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlID0gMCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNMb2FkZWQoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBQZXJmb3JtTGF5b3V0KCk7DQorDQorIHByaXZhdGU6DQorICB2aXJ0dWFsIGNvbnN0IEZYX1dDSEFSKiBHZXRMaW5rVVJMQXRQb2ludChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdm9pZCBGV0xUb0NsaWVudChGWF9GTE9BVCYgZngsIEZYX0ZMT0FUJiBmeSk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ0ZXh0ZWRpdC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ0ZXh0ZWRpdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkwYTJjYwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZnRleHRlZGl0LmNwcApAQCAtMCwwICsxLDgwNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfY29tbW9uLmgiDQorI2luY2x1ZGUgInhmYV9md2xhZGFwdGVyLmgiDQorI2luY2x1ZGUgInhmYV9mZndpZGdldC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZmaWVsZC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZwYWdldmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ0ZXh0ZWRpdC5oIg0KKyNpbmNsdWRlICJ4ZmFfdGV4dGxheW91dC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZhcHAuaCINCisjaW5jbHVkZSAieGZhX2ZmZG9jdmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2MuaCINCitDWEZBX0ZGVGV4dEVkaXQ6OkNYRkFfRkZUZXh0RWRpdChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpDQorICAgIDogQ1hGQV9GRkZpZWxkKHBQYWdlVmlldywgcERhdGFBY2MpLCBtX3BPbGREZWxlZ2F0ZShOVUxMKSB7fQ0KK0NYRkFfRkZUZXh0RWRpdDo6fkNYRkFfRkZUZXh0RWRpdCgpIHsNCisgIGlmIChtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgSUZXTF9XaWRnZXQqIHBXaWRnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpOw0KKyAgICBJRldMX05vdGVEcml2ZXIqIHBOb3RlRHJpdmVyID0gRldMX0dldEFwcCgpLT5HZXROb3RlRHJpdmVyKCk7DQorICAgIHBOb3RlRHJpdmVyLT5VbnJlZ2lzdGVyRXZlbnRUYXJnZXQocFdpZGdldCk7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpMb2FkV2lkZ2V0KCkgew0KKyAgQ0ZXTF9FZGl0KiBwRldMRWRpdCA9IENGV0xfRWRpdDo6Q3JlYXRlKCk7DQorICBwRldMRWRpdC0+SW5pdGlhbGl6ZSgpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0ID0gcEZXTEVkaXQ7DQorICBJRldMX1dpZGdldCogcFdpZGdldCA9IG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCk7DQorICBtX3BOb3JtYWxXaWRnZXQtPlNldFByaXZhdGVEYXRhKHBXaWRnZXQsIHRoaXMsIE5VTEwpOw0KKyAgSUZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9IEZXTF9HZXRBcHAoKS0+R2V0Tm90ZURyaXZlcigpOw0KKyAgcE5vdGVEcml2ZXItPlJlZ2lzdGVyRXZlbnRUYXJnZXQocFdpZGdldCwgcFdpZGdldCk7DQorICBtX3BPbGREZWxlZ2F0ZSA9IG1fcE5vcm1hbFdpZGdldC0+U2V0RGVsZWdhdGUodGhpcyk7DQorICBtX3BOb3JtYWxXaWRnZXQtPkxvY2tVcGRhdGUoKTsNCisgIFVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQorICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICBtX3BEYXRhQWNjLT5HZXRWYWx1ZSh3c1RleHQsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7DQorICBwRldMRWRpdC0+U2V0VGV4dCh3c1RleHQpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5VbmxvY2tVcGRhdGUoKTsNCisgIHJldHVybiBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKTsNCit9DQordm9pZCBDWEZBX0ZGVGV4dEVkaXQ6OlVwZGF0ZVdpZGdldFByb3BlcnR5KCkgew0KKyAgQ0ZXTF9FZGl0KiBwV2lkZ2V0ID0gKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0Ow0KKyAgaWYgKCFwV2lkZ2V0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0RXT1JEIGR3U3R5bGUgPSAwOw0KKyAgRlhfRFdPUkQgZHdFeHRlbmRlZFN0eWxlID0gRldMX1NUWUxFRVhUX0VEVF9TaG93U2Nyb2xsYmFyRm9jdXMgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1NUWUxFRVhUX0VEVF9PdXRlclNjcm9sbGJhciB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfU1RZTEVFWFRfRURUX0xhc3RMaW5lSGVpZ2h0Ow0KKyAgZHdFeHRlbmRlZFN0eWxlIHw9IFVwZGF0ZVVJUHJvcGVydHkoKTsNCisgIGlmIChtX3BEYXRhQWNjLT5Jc011bHRpTGluZSgpKSB7DQorICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX011bHRpTGluZSB8IEZXTF9TVFlMRUVYVF9FRFRfV2FudFJldHVybjsNCisgICAgaWYgKG1fcERhdGFBY2MtPkdldFZlcnRpY2FsU2Nyb2xsUG9saWN5KCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT2ZmKSB7DQorICAgICAgZHdTdHlsZSB8PSBGV0xfV0dUU1RZTEVfVlNjcm9sbDsNCisgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9BdXRvVlNjcm9sbDsNCisgICAgfQ0KKyAgfSBlbHNlIGlmIChtX3BEYXRhQWNjLT5HZXRIb3Jpem9udGFsU2Nyb2xsUG9saWN5KCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT2ZmKSB7DQorICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX0F1dG9IU2Nyb2xsOw0KKyAgfQ0KKyAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4gfHwNCisgICAgICAhbV9wRGF0YUFjYy0+R2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpIHsNCisgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHk7DQorICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX011bHRpTGluZTsNCisgIH0NCisgIFhGQV9FTEVNRU5UIGVUeXBlID0gWEZBX0VMRU1FTlRfVU5LTk9XTjsNCisgIGludDMyX3QgaU1heENoYXJzID0gbV9wRGF0YUFjYy0+R2V0TWF4Q2hhcnMoZVR5cGUpOw0KKyAgaWYgKGVUeXBlID09IFhGQV9FTEVNRU5UX0V4RGF0YSkgew0KKyAgICBpTWF4Q2hhcnMgPSAwOw0KKyAgfQ0KKyAgaW50MzJfdCBpTnVtQ2VsbHMgPSBtX3BEYXRhQWNjLT5HZXROdW1iZXJPZkNlbGxzKCk7DQorICBpZiAoaU51bUNlbGxzID09IDApIHsNCisgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfQ29tYlRleHQ7DQorICAgIHBXaWRnZXQtPlNldExpbWl0KGlNYXhDaGFycyA+IDAgPyBpTWF4Q2hhcnMgOiAxKTsNCisgIH0gZWxzZSBpZiAoaU51bUNlbGxzID4gMCkgew0KKyAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9Db21iVGV4dDsNCisgICAgcFdpZGdldC0+U2V0TGltaXQoaU51bUNlbGxzKTsNCisgIH0gZWxzZSB7DQorICAgIHBXaWRnZXQtPlNldExpbWl0KGlNYXhDaGFycyk7DQorICB9DQorICBkd0V4dGVuZGVkU3R5bGUgfD0gR2V0QWxpZ25tZW50KCk7DQorICBtX3BOb3JtYWxXaWRnZXQtPk1vZGlmeVN0eWxlcyhkd1N0eWxlLCAweEZGRkZGRkZGKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+TW9kaWZ5U3R5bGVzRXgoZHdFeHRlbmRlZFN0eWxlLCAweEZGRkZGRkZGKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6Ok9uTEJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKCFQdEluQWN0aXZlUmVjdChmeCwgZnkpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICghSXNGb2N1c2VkKCkpIHsNCisgICAgbV9kd1N0YXR1cyB8PSBYRkFfV0lER0VUU1RBVFVTX0ZvY3VzZWQ7DQorICAgIFVwZGF0ZUZXTERhdGEoKTsNCisgICAgQWRkSW52YWxpZGF0ZVJlY3QoKTsNCisgIH0NCisgIFNldEJ1dHRvbkRvd24oVFJVRSk7DQorICBDRldMX01zZ01vdXNlIG1zOw0KKyAgbXMubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9MQnV0dG9uRG93bjsNCisgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7DQorICBtcy5tX2Z4ID0gZng7DQorICBtcy5tX2Z5ID0gZnk7DQorICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcElmYWNlOw0KKyAgRldMVG9DbGllbnQobXMubV9meCwgbXMubV9meSk7DQorICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6Ok9uUkJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4pIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKCFQdEluQWN0aXZlUmVjdChmeCwgZnkpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICghSXNGb2N1c2VkKCkpIHsNCisgICAgbV9kd1N0YXR1cyB8PSBYRkFfV0lER0VUU1RBVFVTX0ZvY3VzZWQ7DQorICAgIFVwZGF0ZUZXTERhdGEoKTsNCisgICAgQWRkSW52YWxpZGF0ZVJlY3QoKTsNCisgIH0NCisgIFNldEJ1dHRvbkRvd24oVFJVRSk7DQorICBDRldMX01zZ01vdXNlIG1zOw0KKyAgbXMubV9kd0NtZCA9IEZXTF9NU0dNT1VTRUNNRF9SQnV0dG9uRG93bjsNCisgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7DQorICBtcy5tX2Z4ID0gZng7DQorICBtcy5tX2Z5ID0gZnk7DQorICBGV0xUb0NsaWVudChtcy5tX2Z4LCBtcy5tX2Z5KTsNCisgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRkZUZXh0RWRpdDo6T25SQnV0dG9uVXAoRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICBpZiAoIUNYRkFfRkZGaWVsZDo6T25SQnV0dG9uVXAoZHdGbGFncywgZngsIGZ5KSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfUG9pbnRGIHB0Ow0KKyAgcHQuU2V0KGZ4LCBmeSk7DQorICBHZXREb2MoKS0+R2V0RG9jUHJvdmlkZXIoKS0+UG9wdXBNZW51KHRoaXMsIHB0LCBOVUxMKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRkZUZXh0RWRpdDo6T25TZXRGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwT2xkV2lkZ2V0KSB7DQorICBtX2R3U3RhdHVzICY9IH5YRkFfV0lER0VUU1RBVFVTX1RleHRFZGl0VmFsdWVDaGFuZ2VkOw0KKyAgaWYgKCFJc0ZvY3VzZWQoKSkgew0KKyAgICBtX2R3U3RhdHVzIHw9IFhGQV9XSURHRVRTVEFUVVNfRm9jdXNlZDsNCisgICAgVXBkYXRlRldMRGF0YSgpOw0KKyAgICBBZGRJbnZhbGlkYXRlUmVjdCgpOw0KKyAgfQ0KKyAgQ1hGQV9GRldpZGdldDo6T25TZXRGb2N1cyhwT2xkV2lkZ2V0KTsNCisgIENGV0xfTXNnU2V0Rm9jdXMgbXM7DQorICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcElmYWNlOw0KKyAgbXMubV9wU3JjVGFyZ2V0ID0gTlVMTDsNCisgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRkZUZXh0RWRpdDo6T25LaWxsRm9jdXMoQ1hGQV9GRldpZGdldCogcE5ld1dpZGdldCkgew0KKyAgQ0ZXTF9Nc2dLaWxsRm9jdXMgbXM7DQorICBtcy5tX3BEc3RUYXJnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPm1fcElmYWNlOw0KKyAgbXMubV9wU3JjVGFyZ2V0ID0gTlVMTDsNCisgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsNCisgIG1fZHdTdGF0dXMgJj0gflhGQV9XSURHRVRTVEFUVVNfRm9jdXNlZDsNCisgIFNldEVkaXRTY3JvbGxPZmZzZXQoKTsNCisgIFByb2Nlc3NDb21taXR0ZWREYXRhKCk7DQorICBVcGRhdGVGV0xEYXRhKCk7DQorICBBZGRJbnZhbGlkYXRlUmVjdCgpOw0KKyAgQ1hGQV9GRldpZGdldDo6T25LaWxsRm9jdXMocE5ld1dpZGdldCk7DQorICBtX2R3U3RhdHVzICY9IH5YRkFfV0lER0VUU1RBVFVTX1RleHRFZGl0VmFsdWVDaGFuZ2VkOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpDb21taXREYXRhKCkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPkdldFRleHQod3NUZXh0KTsNCisgIGlmIChtX3BEYXRhQWNjLT5TZXRWYWx1ZSh3c1RleHQsIFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCkpIHsNCisgICAgbV9wRGF0YUFjYy0+VXBkYXRlVUlEaXNwbGF5KHRoaXMpOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIFZhbGlkYXRlTnVtYmVyRmllbGQod3NUZXh0KTsNCisgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDWEZBX0ZGVGV4dEVkaXQ6OlZhbGlkYXRlTnVtYmVyRmllbGQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSB0aGlzLT5HZXREYXRhQWNjKCk7DQorICBpZiAocEFjYyAmJiBwQWNjLT5HZXRVSVR5cGUoKSA9PSBYRkFfRUxFTUVOVF9OdW1lcmljRWRpdCkgew0KKyAgICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBHZXRBcHAoKS0+R2V0QXBwUHJvdmlkZXIoKTsNCisgICAgaWYgKHBBcHBQcm92aWRlcikgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGl0bGU7DQorICAgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfQXBwTmFtZSwgd3NUaXRsZSk7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNZXNzYWdlOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzRXJyb3I7DQorICAgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfVmFsaWRhdGVOdW1iZXJFcnJvciwgd3NFcnJvcik7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTb21GaWVsZDsNCisgICAgICBwQWNjLT5HZXROb2RlKCktPkdldFNPTUV4cHJlc3Npb24od3NTb21GaWVsZCk7DQorICAgICAgd3NNZXNzYWdlLkZvcm1hdCh3c0Vycm9yLCAoY29uc3QgRlhfV0NIQVIqKXdzVGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBGWF9XQ0hBUiopd3NTb21GaWVsZCk7DQorICAgICAgcEFwcFByb3ZpZGVyLT5Nc2dCb3god3NNZXNzYWdlLCB3c1RpdGxlLCBYRkFfTUJJQ09OX0Vycm9yLCBYRkFfTUJfT0spOw0KKyAgICB9DQorICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpJc0RhdGFDaGFuZ2VkKCkgew0KKyAgcmV0dXJuIChtX2R3U3RhdHVzICYgWEZBX1dJREdFVFNUQVRVU19UZXh0RWRpdFZhbHVlQ2hhbmdlZCkgIT0gMDsNCit9DQorRlhfRFdPUkQgQ1hGQV9GRlRleHRFZGl0OjpHZXRBbGlnbm1lbnQoKSB7DQorICBGWF9EV09SRCBkd0V4dGVuZGVkU3R5bGUgPSAwOw0KKyAgaWYgKENYRkFfUGFyYSBwYXJhID0gbV9wRGF0YUFjYy0+R2V0UGFyYSgpKSB7DQorICAgIGludDMyX3QgaUhvcnogPSBwYXJhLkdldEhvcml6b250YWxBbGlnbigpOw0KKyAgICBzd2l0Y2ggKGlIb3J6KSB7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXI6DQorICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9IQ2VudGVyOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5Og0KKyAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfSnVzdGlmaWVkOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5QWxsOg0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SYWRpeDoNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQ6DQorICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9IRmFyOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX0hOZWFyOw0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaW50MzJfdCBpVmVydCA9IHBhcmEuR2V0VmVydGljYWxBbGlnbigpOw0KKyAgICBzd2l0Y2ggKGlWZXJ0KSB7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGU6DQorICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9WQ2VudGVyOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b206DQorICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9WRmFyOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX1ZOZWFyOw0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBkd0V4dGVuZGVkU3R5bGU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpVcGRhdGVGV0xEYXRhKCkgew0KKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgWEZBX1ZBTFVFUElDVFVSRSBlVHlwZSA9IFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheTsNCisgIGlmIChJc0ZvY3VzZWQoKSkgew0KKyAgICBlVHlwZSA9IFhGQV9WQUxVRVBJQ1RVUkVfRWRpdDsNCisgIH0NCisgIEZYX0JPT0wgYlVwZGF0ZSA9IEZBTFNFOw0KKyAgaWYgKG1fcERhdGFBY2MtPkdldFVJVHlwZSgpID09IFhGQV9FTEVNRU5UX1RleHRFZGl0ICYmDQorICAgICAgbV9wRGF0YUFjYy0+R2V0TnVtYmVyT2ZDZWxscygpIDwgMCkgew0KKyAgICBYRkFfRUxFTUVOVCBlbGVtZW50VHlwZSA9IFhGQV9FTEVNRU5UX1VOS05PV047DQorICAgIGludDMyX3QgaU1heENoYXJzID0gbV9wRGF0YUFjYy0+R2V0TWF4Q2hhcnMoZWxlbWVudFR5cGUpOw0KKyAgICBpZiAoZWxlbWVudFR5cGUgPT0gWEZBX0VMRU1FTlRfRXhEYXRhKSB7DQorICAgICAgaU1heENoYXJzID0gZVR5cGUgPT0gWEZBX1ZBTFVFUElDVFVSRV9FZGl0ID8gaU1heENoYXJzIDogMDsNCisgICAgfQ0KKyAgICBpZiAoKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPkdldExpbWl0KCkgIT0gaU1heENoYXJzKSB7DQorICAgICAgKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPlNldExpbWl0KGlNYXhDaGFycyk7DQorICAgICAgYlVwZGF0ZSA9IFRSVUU7DQorICAgIH0NCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgIG1fcERhdGFBY2MtPkdldFZhbHVlKHdzVGV4dCwgZVR5cGUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NPbGRUZXh0Ow0KKyAgKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPkdldFRleHQod3NPbGRUZXh0KTsNCisgIGlmICh3c1RleHQgIT0gd3NPbGRUZXh0IHx8IChlVHlwZSA9PSBYRkFfVkFMVUVQSUNUVVJFX0VkaXQgJiYgYlVwZGF0ZSkpIHsNCisgICAgKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPlNldFRleHQod3NUZXh0KTsNCisgICAgYlVwZGF0ZSA9IFRSVUU7DQorICB9DQorICBpZiAoYlVwZGF0ZSkgew0KKyAgICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpDYW5VbmRvKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQpLT5DYW5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpDYW5SZWRvKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQpLT5DYW5SZWRvKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpVbmRvKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQpLT5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpSZWRvKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQpLT5SZWRvKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpDYW5Db3B5KCkgew0KKyAgaW50MzJfdCBuQ291bnQgPSAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+Q291bnRTZWxSYW5nZXMoKTsNCisgIHJldHVybiBuQ291bnQgPiAwOw0KK30NCitGWF9CT09MIENYRkFfRkZUZXh0RWRpdDo6Q2FuQ3V0KCkgew0KKyAgaWYgKG1fcE5vcm1hbFdpZGdldC0+R2V0U3R5bGVzRXgoKSAmIEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaW50MzJfdCBuQ291bnQgPSAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+Q291bnRTZWxSYW5nZXMoKTsNCisgIHJldHVybiBuQ291bnQgPiAwOw0KK30NCitGWF9CT09MIENYRkFfRkZUZXh0RWRpdDo6Q2FuUGFzdGUoKSB7DQorICByZXR1cm4gbV9wRGF0YUFjYy0+R2V0QWNjZXNzKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fT3BlbjsNCit9DQorRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6OkNhblNlbGVjdEFsbCgpIHsNCisgIHJldHVybiAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+R2V0VGV4dExlbmd0aCgpID4gMDsNCit9DQorRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6OkNvcHkoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29weSkgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQpLT5Db3B5KHdzQ29weSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpDdXQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ3V0KSB7DQorICByZXR1cm4gKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPkN1dCh3c0N1dCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXN0ZSkgew0KKyAgcmV0dXJuICgoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQpLT5QYXN0ZSh3c1Bhc3RlKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6OlNlbGVjdEFsbCgpIHsNCisgIGludDMyX3QgbkNvdW50ID0gKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPkdldFRleHRMZW5ndGgoKTsNCisgIHJldHVybiAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+QWRkU2VsUmFuZ2UoMCwgbkNvdW50KTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6OkRlbGV0ZSgpIHsNCisgIHJldHVybiAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+RGVsZXRlKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpEZVNlbGVjdCgpIHsNCisgIHJldHVybiAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+Q2xlYXJTZWxlY3Rpb25zKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpHZXRTdWdnZXN0V29yZHMoQ0ZYX1BvaW50RiBwb2ludGYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0FycmF5JiBzU3VnZ2VzdCkgew0KKyAgaWYgKG1fcERhdGFBY2MtPkdldFVJVHlwZSgpICE9IFhGQV9FTEVNRU5UX1RleHRFZGl0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZXTFRvQ2xpZW50KHBvaW50Zi54LCBwb2ludGYueSk7DQorICByZXR1cm4gKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPkdldFN1Z2dlc3RXb3Jkcyhwb2ludGYsIHNTdWdnZXN0KTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGVGV4dEVkaXQ6OlJlcGxhY2VTcGVsbENoZWNrV29yZCgNCisgICAgQ0ZYX1BvaW50RiBwb2ludGYsDQorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZXBsYWNlKSB7DQorICBpZiAobV9wRGF0YUFjYy0+R2V0VUlUeXBlKCkgIT0gWEZBX0VMRU1FTlRfVGV4dEVkaXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRldMVG9DbGllbnQocG9pbnRmLngsIHBvaW50Zi55KTsNCisgIHJldHVybiAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KQ0KKyAgICAgIC0+UmVwbGFjZVNwZWxsQ2hlY2tXb3JkKHBvaW50ZiwgYnNSZXBsYWNlKTsNCit9DQordm9pZCBDWEZBX0ZGVGV4dEVkaXQ6Ok9uVGV4dENoYW5nZWQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ2hhbmdlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQcmV2VGV4dCkgew0KKyAgbV9kd1N0YXR1cyB8PSBYRkFfV0lER0VUU1RBVFVTX1RleHRFZGl0VmFsdWVDaGFuZ2VkOw0KKyAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsNCisgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX0NoYW5nZTsNCisgIGVQYXJhbS5tX3dzQ2hhbmdlID0gd3NDaGFuZ2VkOw0KKyAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7DQorICBlUGFyYW0ubV93c1ByZXZUZXh0ID0gd3NQcmV2VGV4dDsNCisgIENGV0xfRWRpdCogcEVkaXQgPSAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KTsNCisgIGlmIChtX3BEYXRhQWNjLT5HZXRVSVR5cGUoKSA9PSBYRkFfRUxFTUVOVF9EYXRlVGltZUVkaXQpIHsNCisgICAgQ0ZXTF9EYXRlVGltZVBpY2tlciogcERhdGVUaW1lID0gKENGV0xfRGF0ZVRpbWVQaWNrZXIqKXBFZGl0Ow0KKyAgICBwRGF0ZVRpbWUtPkdldEVkaXRUZXh0KGVQYXJhbS5tX3dzTmV3VGV4dCk7DQorICAgIGludDMyX3QgaVNlbHMgPSBwRGF0ZVRpbWUtPkNvdW50U2VsUmFuZ2VzKCk7DQorICAgIGlmIChpU2Vscykgew0KKyAgICAgIGVQYXJhbS5tX2lTZWxFbmQgPSBwRGF0ZVRpbWUtPkdldFNlbFJhbmdlKDAsIGVQYXJhbS5tX2lTZWxTdGFydCk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIHBFZGl0LT5HZXRUZXh0KGVQYXJhbS5tX3dzTmV3VGV4dCk7DQorICAgIGludDMyX3QgaVNlbHMgPSBwRWRpdC0+Q291bnRTZWxSYW5nZXMoKTsNCisgICAgaWYgKGlTZWxzKSB7DQorICAgICAgZVBhcmFtLm1faVNlbEVuZCA9IHBFZGl0LT5HZXRTZWxSYW5nZSgwLCBlUGFyYW0ubV9pU2VsU3RhcnQpOw0KKyAgICB9DQorICB9DQorICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fQ2hhbmdlLCAmZVBhcmFtKTsNCit9DQordm9pZCBDWEZBX0ZGVGV4dEVkaXQ6Ok9uVGV4dEZ1bGwoSUZXTF9XaWRnZXQqIHBXaWRnZXQpIHsNCisgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQorICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9GdWxsOw0KKyAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7DQorICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fRnVsbCwgJmVQYXJhbSk7DQorfQ0KK3ZvaWQgQ1hGQV9GRlRleHRFZGl0OjpPbkFkZERvUmVjb3JkKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBHZXREb2MoKS0+R2V0RG9jUHJvdmlkZXIoKS0+QWRkRG9SZWNvcmQodGhpcyk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpDaGVja1dvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzV29yZCkgew0KKyAgaWYgKHNXb3JkLklzRW1wdHkoKSB8fCBtX3BEYXRhQWNjLT5HZXRVSVR5cGUoKSAhPSBYRkFfRUxFTUVOVF9UZXh0RWRpdCkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBHZXREb2MoKS0+R2V0RG9jUHJvdmlkZXIoKS0+Q2hlY2tXb3JkKEdldERvYygpLCBzV29yZCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRlRleHRFZGl0OjpHZXRTdWdnZXN0V29yZHMoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzV29yZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQXJyYXkmIHNTdWdnZXN0KSB7DQorICBpZiAobV9wRGF0YUFjYy0+R2V0VUlUeXBlKCkgIT0gWEZBX0VMRU1FTlRfVGV4dEVkaXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIEdldERvYygpLT5HZXREb2NQcm92aWRlcigpLT5HZXRTdWdnZXN0V29yZHMoR2V0RG9jKCksIHNXb3JkLCBzU3VnZ2VzdCk7DQorfQ0KK2ludDMyX3QgQ1hGQV9GRlRleHRFZGl0OjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsNCisgIHJldHVybiBtX3BPbGREZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7DQorfQ0KK0ZXTF9FUlIgQ1hGQV9GRlRleHRFZGl0OjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsNCisgIENYRkFfRkZGaWVsZDo6T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsNCisgIEZYX0RXT1JEIGR3RXZlbnRJRCA9IHBFdmVudC0+R2V0Q2xhc3NJRCgpOw0KKyAgc3dpdGNoIChkd0V2ZW50SUQpIHsNCisgICAgY2FzZSBGV0xfRVZUSEFTSF9FRFRfVGV4dENoYW5nZWQ6IHsNCisgICAgICBDRldMX0V2dEVkdFRleHRDaGFuZ2VkKiBldmVudCA9IChDRldMX0V2dEVkdFRleHRDaGFuZ2VkKilwRXZlbnQ7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDaGFuZ2U7DQorICAgICAgT25UZXh0Q2hhbmdlZChtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpLCB3c0NoYW5nZSwgZXZlbnQtPndzUHJldlRleHQpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX0VWVEhBU0hfRURUX0FkZERvUmVjb3JkOiB7DQorICAgICAgT25BZGREb1JlY29yZChtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldCgpKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZXTF9FVlRIQVNIX0VEVF9UZXh0RnVsbDogew0KKyAgICAgIE9uVGV4dEZ1bGwobV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKSk7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBGV0xfRVZUSEFTSF9FRFRfQ2hlY2tXb3JkOiB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3N0cihMIkZXTF9FVkVOVF9EVFBfU2VsZWN0Q2hhbmdlZCIpOw0KKyAgICAgIENGV0xfRXZ0RWR0Q2hlY2tXb3JkKiBldmVudCA9IChDRldMX0V2dEVkdENoZWNrV29yZCopcEV2ZW50Ow0KKyAgICAgIGV2ZW50LT5iQ2hlY2tXb3JkID0gQ2hlY2tXb3JkKGV2ZW50LT5ic1dvcmQpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGNhc2UgRldMX0VWVEhBU0hfRURUX0dldFN1Z2dlc3RXb3Jkczogew0KKyAgICAgIENGV0xfRXZ0RWR0R2V0U3VnZ2VzdFdvcmRzKiBldmVudCA9IChDRldMX0V2dEVkdEdldFN1Z2dlc3RXb3JkcyopcEV2ZW50Ow0KKyAgICAgIGV2ZW50LT5iU3VnZ2VzdFdvcmRzID0NCisgICAgICAgICAgR2V0U3VnZ2VzdFdvcmRzKGV2ZW50LT5ic1dvcmQsIGV2ZW50LT5ic0FycmF5U3VnZ2VzdFdvcmRzKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7fQ0KKyAgfQ0KKyAgcmV0dXJuIG1fcE9sZERlbGVnYXRlLT5PblByb2Nlc3NFdmVudChwRXZlbnQpOw0KK30NCitGV0xfRVJSIENYRkFfRkZUZXh0RWRpdDo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgcmV0dXJuIG1fcE9sZERlbGVnYXRlLT5PbkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsNCit9DQorQ1hGQV9GRk51bWVyaWNFZGl0OjpDWEZBX0ZGTnVtZXJpY0VkaXQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQ0KKyAgICA6IENYRkFfRkZUZXh0RWRpdChwUGFnZVZpZXcsIHBEYXRhQWNjKSB7fQ0KK0NYRkFfRkZOdW1lcmljRWRpdDo6fkNYRkFfRkZOdW1lcmljRWRpdCgpIHt9DQorRlhfQk9PTCBDWEZBX0ZGTnVtZXJpY0VkaXQ6OkxvYWRXaWRnZXQoKSB7DQorICBDRldMX0VkaXQqIHBXaWRnZXQgPSBDRldMX0VkaXQ6OkNyZWF0ZSgpOw0KKyAgcFdpZGdldC0+SW5pdGlhbGl6ZSgpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0ID0gKENGV0xfV2lkZ2V0KilwV2lkZ2V0Ow0KKyAgSUZXTF9XaWRnZXQqIHBJV2lkZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+U2V0UHJpdmF0ZURhdGEocElXaWRnZXQsIHRoaXMsIE5VTEwpOw0KKyAgSUZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9IEZXTF9HZXRBcHAoKS0+R2V0Tm90ZURyaXZlcigpOw0KKyAgcE5vdGVEcml2ZXItPlJlZ2lzdGVyRXZlbnRUYXJnZXQocElXaWRnZXQsIHBJV2lkZ2V0KTsNCisgIG1fcE9sZERlbGVnYXRlID0gbV9wTm9ybWFsV2lkZ2V0LT5TZXREZWxlZ2F0ZSh0aGlzKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+TG9ja1VwZGF0ZSgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgbV9wRGF0YUFjYy0+R2V0VmFsdWUod3NUZXh0LCBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpOw0KKyAgcFdpZGdldC0+U2V0VGV4dCh3c1RleHQpOw0KKyAgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+VW5sb2NrVXBkYXRlKCk7DQorICByZXR1cm4gQ1hGQV9GRkZpZWxkOjpMb2FkV2lkZ2V0KCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRk51bWVyaWNFZGl0OjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpIHsNCisgIENGV0xfRWRpdCogcFdpZGdldCA9IChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldDsNCisgIGlmICghcFdpZGdldCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9EV09SRCBkd0V4dGVuZGVkU3R5bGUgPQ0KKyAgICAgIEZXTF9TVFlMRUVYVF9FRFRfU2hvd1Njcm9sbGJhckZvY3VzIHwgRldMX1NUWUxFRVhUX0VEVF9PdXRlclNjcm9sbGJhciB8DQorICAgICAgRldMX1NUWUxFRVhUX0VEVF9WYWxpZGF0ZSB8IEZXTF9TVFlMRUVYVF9FRFRfTnVtYmVyIHwNCisgICAgICBGV0xfU1RZTEVFWFRfRURUX0xhc3RMaW5lSGVpZ2h0Ow0KKyAgZHdFeHRlbmRlZFN0eWxlIHw9IFVwZGF0ZVVJUHJvcGVydHkoKTsNCisgIGlmIChtX3BEYXRhQWNjLT5HZXRIb3Jpem9udGFsU2Nyb2xsUG9saWN5KCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT2ZmKSB7DQorICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX0F1dG9IU2Nyb2xsOw0KKyAgfQ0KKyAgaW50MzJfdCBpTnVtQ2VsbHMgPSBtX3BEYXRhQWNjLT5HZXROdW1iZXJPZkNlbGxzKCk7DQorICBpZiAoaU51bUNlbGxzID4gMCkgew0KKyAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9Db21iVGV4dDsNCisgICAgcFdpZGdldC0+U2V0TGltaXQoaU51bUNlbGxzKTsNCisgIH0NCisgIGR3RXh0ZW5kZWRTdHlsZSB8PSBHZXRBbGlnbm1lbnQoKTsNCisgIGlmIChtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuIHx8DQorICAgICAgIW1fcERhdGFBY2MtPkdldERvYygpLT5HZXRYRkFEb2MoKS0+SXNJbnRlcmFjdGl2ZSgpKSB7DQorICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5Ow0KKyAgfQ0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5Nb2RpZnlTdHlsZXNFeChkd0V4dGVuZGVkU3R5bGUsIDB4RkZGRkZGRkYpOw0KK30NCitGV0xfRVJSIENYRkFfRkZOdW1lcmljRWRpdDo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSB7DQorICBGWF9EV09SRCBkd0V2ZW50SUQgPSBwRXZlbnQtPkdldENsYXNzSUQoKTsNCisgIGlmIChkd0V2ZW50SUQgPT0gRldMX0VWVEhBU0hfRURUX1ZhbGlkYXRlKSB7DQorICAgIENGV0xfRXZ0RWR0VmFsaWRhdGUqIGV2ZW50ID0gKENGV0xfRXZ0RWR0VmFsaWRhdGUqKXBFdmVudDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDaGFuZ2UgPSBldmVudC0+d3NJbnNlcnQ7DQorICAgIGV2ZW50LT5iVmFsaWRhdGUgPSBPblZhbGlkYXRlKG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCksIHdzQ2hhbmdlKTsNCisgICAgcmV0dXJuIGV2ZW50LT5iVmFsaWRhdGU7DQorICB9IGVsc2Ugew0KKyAgICByZXR1cm4gQ1hGQV9GRlRleHRFZGl0OjpPblByb2Nlc3NFdmVudChwRXZlbnQpOw0KKyAgfQ0KK30NCitGWF9CT09MIENYRkFfRkZOdW1lcmljRWRpdDo6T25WYWxpZGF0ZShJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1BhdHRlcm47DQorICBtX3BEYXRhQWNjLT5HZXRQaWN0dXJlQ29udGVudCh3c1BhdHRlcm4sIFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCk7DQorICBpZiAoIXdzUGF0dGVybi5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBpbnQzMl90IGlMZWFkcyA9IDA7DQorICBtX3BEYXRhQWNjLT5HZXRMZWFkRGlnaXRzKGlMZWFkcyk7DQorICBpbnQzMl90IGlGcmFjcyA9IDA7DQorICBtX3BEYXRhQWNjLT5HZXRGcmFjRGlnaXRzKGlGcmFjcyk7DQorICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdDsNCisgIENYRkFfTG9jYWxlVmFsdWUgd2lkZ2V0VmFsdWUgPSBYRkFfR2V0TG9jYWxlVmFsdWUobV9wRGF0YUFjYyk7DQorICB3aWRnZXRWYWx1ZS5HZXROdW1iZXJpY0Zvcm1hdCh3c0Zvcm1hdCwgaUxlYWRzLCBpRnJhY3MpOw0KKyAgcmV0dXJuIHdpZGdldFZhbHVlLlZhbGlkYXRlTnVtZXJpY1RlbXAod3NUZXh0LCB3c0Zvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcERhdGFBY2MtPkdldExvY2FsKCkpOw0KK30NCitDWEZBX0ZGUGFzc3dvcmRFZGl0OjpDWEZBX0ZGUGFzc3dvcmRFZGl0KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQ0KKyAgICA6IENYRkFfRkZUZXh0RWRpdChwUGFnZVZpZXcsIHBEYXRhQWNjKSB7fQ0KK0NYRkFfRkZQYXNzd29yZEVkaXQ6On5DWEZBX0ZGUGFzc3dvcmRFZGl0KCkge30NCitGWF9CT09MIENYRkFfRkZQYXNzd29yZEVkaXQ6OkxvYWRXaWRnZXQoKSB7DQorICBDRldMX0VkaXQqIHBXaWRnZXQgPSBDRldMX0VkaXQ6OkNyZWF0ZSgpOw0KKyAgcFdpZGdldC0+SW5pdGlhbGl6ZSgpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0ID0gKENGV0xfV2lkZ2V0KilwV2lkZ2V0Ow0KKyAgSUZXTF9XaWRnZXQqIHBJV2lkZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXQoKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+U2V0UHJpdmF0ZURhdGEocElXaWRnZXQsIHRoaXMsIE5VTEwpOw0KKyAgSUZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9IEZXTF9HZXRBcHAoKS0+R2V0Tm90ZURyaXZlcigpOw0KKyAgcE5vdGVEcml2ZXItPlJlZ2lzdGVyRXZlbnRUYXJnZXQocElXaWRnZXQsIHBJV2lkZ2V0KTsNCisgIG1fcE9sZERlbGVnYXRlID0gbV9wTm9ybWFsV2lkZ2V0LT5TZXREZWxlZ2F0ZSh0aGlzKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+TG9ja1VwZGF0ZSgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgbV9wRGF0YUFjYy0+R2V0VmFsdWUod3NUZXh0LCBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpOw0KKyAgcFdpZGdldC0+U2V0VGV4dCh3c1RleHQpOw0KKyAgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCisgIG1fcE5vcm1hbFdpZGdldC0+VW5sb2NrVXBkYXRlKCk7DQorICByZXR1cm4gQ1hGQV9GRkZpZWxkOjpMb2FkV2lkZ2V0KCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRlBhc3N3b3JkRWRpdDo6VXBkYXRlV2lkZ2V0UHJvcGVydHkoKSB7DQorICBDRldMX0VkaXQqIHBXaWRnZXQgPSAoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQ7DQorICBpZiAoIXBXaWRnZXQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfRFdPUkQgZHdFeHRlbmRlZFN0eWxlID0NCisgICAgICBGV0xfU1RZTEVFWFRfRURUX1Nob3dTY3JvbGxiYXJGb2N1cyB8IEZXTF9TVFlMRUVYVF9FRFRfT3V0ZXJTY3JvbGxiYXIgfA0KKyAgICAgIEZXTF9TVFlMRUVYVF9FRFRfUGFzc3dvcmQgfCBGV0xfU1RZTEVFWFRfRURUX0xhc3RMaW5lSGVpZ2h0Ow0KKyAgZHdFeHRlbmRlZFN0eWxlIHw9IFVwZGF0ZVVJUHJvcGVydHkoKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzUGFzc1dvcmQ7DQorICBtX3BEYXRhQWNjLT5HZXRQYXNzd29yZENoYXIod3NQYXNzV29yZCk7DQorICBpZiAoIXdzUGFzc1dvcmQuSXNFbXB0eSgpKSB7DQorICAgIHBXaWRnZXQtPlNldEFsaWFzQ2hhcih3c1Bhc3NXb3JkLkdldEF0KDApKTsNCisgIH0NCisgIGlmIChtX3BEYXRhQWNjLT5HZXRIb3Jpem9udGFsU2Nyb2xsUG9saWN5KCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT2ZmKSB7DQorICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX0F1dG9IU2Nyb2xsOw0KKyAgfQ0KKyAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4gfHwNCisgICAgICAhbV9wRGF0YUFjYy0+R2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpIHsNCisgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHk7DQorICB9DQorICBkd0V4dGVuZGVkU3R5bGUgfD0gR2V0QWxpZ25tZW50KCk7DQorICBtX3BOb3JtYWxXaWRnZXQtPk1vZGlmeVN0eWxlc0V4KGR3RXh0ZW5kZWRTdHlsZSwgMHhGRkZGRkZGRik7DQorfQ0KK0NYRkFfRkZEYXRlVGltZUVkaXQ6OkNYRkFfRkZEYXRlVGltZUVkaXQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpDQorICAgIDogQ1hGQV9GRlRleHRFZGl0KHBQYWdlVmlldywgcERhdGFBY2MpIHt9DQorQ1hGQV9GRkRhdGVUaW1lRWRpdDo6fkNYRkFfRkZEYXRlVGltZUVkaXQoKSB7fQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6R2V0QkJveChDRlhfUmVjdEYmIHJ0Qm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXR1cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRHJhd0ZvY3VzKSB7DQorICBpZiAoYkRyYXdGb2N1cykgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorI2lmbmRlZiBfWEZBX0VNQg0KKyAgcmV0dXJuIENYRkFfRkZXaWRnZXQ6OkdldEJCb3gocnRCb3gsIGR3U3RhdHVzKTsNCisjZW5kaWYNCisgIEdldFJlY3RXaXRob3V0Um90YXRlKHJ0Qm94KTsNCisgIGlmIChtX3BOb3JtYWxXaWRnZXQpIHsNCisgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KKyAgICAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPkdldEJCb3gocnRXaWRnZXQpOw0KKyAgICBydEJveC5VbmlvbihydFdpZGdldCk7DQorICB9DQorICBDRlhfTWF0cml4IG10Ow0KKyAgR2V0Um90YXRlTWF0cml4KG10KTsNCisgIG10LlRyYW5zZm9ybVJlY3QocnRCb3gpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6UHRJbkFjdGl2ZVJlY3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSB7DQorICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfUmVjdEYgcnRXaWRnZXQ7DQorICAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPkdldEJCb3gocnRXaWRnZXQpOw0KKyAgaWYgKHJ0V2lkZ2V0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6TG9hZFdpZGdldCgpIHsNCisgIENGV0xfRGF0ZVRpbWVQaWNrZXIqIHBXaWRnZXQgPSBDRldMX0RhdGVUaW1lUGlja2VyOjpDcmVhdGUoKTsNCisgIHBXaWRnZXQtPkluaXRpYWxpemUoKTsNCisgIG1fcE5vcm1hbFdpZGdldCA9IChDRldMX1dpZGdldCopcFdpZGdldDsNCisgIElGV0xfV2lkZ2V0KiBwSVdpZGdldCA9IG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCk7DQorICBtX3BOb3JtYWxXaWRnZXQtPlNldFByaXZhdGVEYXRhKHBJV2lkZ2V0LCB0aGlzLCBOVUxMKTsNCisgIElGV0xfTm90ZURyaXZlciogcE5vdGVEcml2ZXIgPSBGV0xfR2V0QXBwKCktPkdldE5vdGVEcml2ZXIoKTsNCisgIHBOb3RlRHJpdmVyLT5SZWdpc3RlckV2ZW50VGFyZ2V0KHBJV2lkZ2V0LCBwSVdpZGdldCk7DQorICBtX3BPbGREZWxlZ2F0ZSA9IG1fcE5vcm1hbFdpZGdldC0+U2V0RGVsZWdhdGUodGhpcyk7DQorICBtX3BOb3JtYWxXaWRnZXQtPkxvY2tVcGRhdGUoKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgIG1fcERhdGFBY2MtPkdldFZhbHVlKHdzVGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsNCisgIHBXaWRnZXQtPlNldEVkaXRUZXh0KHdzVGV4dCk7DQorICBYRkFfREFURVRJTUVUWVBFIGVUeXBlID0gWEZBX0RBVEVUSU1FVFlQRV9EYXRlQW5kVGltZTsNCisgIGlmIChDWEZBX1ZhbHVlIHZhbHVlID0gbV9wRGF0YUFjYy0+R2V0Rm9ybVZhbHVlKCkpIHsNCisgICAgc3dpdGNoICh2YWx1ZS5HZXRDaGlsZFZhbHVlQ2xhc3NJRCgpKSB7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9EYXRlOiB7DQorICAgICAgICBlVHlwZSA9IFhGQV9EQVRFVElNRVRZUEVfRGF0ZTsNCisgICAgICAgIGlmICghd3NUZXh0LklzRW1wdHkoKSkgew0KKyAgICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIGxjVmFsdWUgPSBYRkFfR2V0TG9jYWxlVmFsdWUobV9wRGF0YUFjYyk7DQorICAgICAgICAgIENGWF9Vbml0aW1lIGRhdGUgPSBsY1ZhbHVlLkdldERhdGUoKTsNCisgICAgICAgICAgaWYgKChGWF9VTklUSU1FKWRhdGUgIT0gMCkgew0KKyAgICAgICAgICAgIHBXaWRnZXQtPlNldEN1clNlbChkYXRlLkdldFllYXIoKSwgZGF0ZS5HZXRNb250aCgpLCBkYXRlLkdldERheSgpKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9UaW1lOg0KKyAgICAgICAgZVR5cGUgPSBYRkFfREFURVRJTUVUWVBFX1RpbWU7DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgZVR5cGUgPSBYRkFfREFURVRJTUVUWVBFX0RhdGVBbmRUaW1lOw0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIFVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQorICBtX3BOb3JtYWxXaWRnZXQtPlVubG9ja1VwZGF0ZSgpOw0KKyAgcmV0dXJuIENYRkFfRkZGaWVsZDo6TG9hZFdpZGdldCgpOw0KK30NCit2b2lkIENYRkFfRkZEYXRlVGltZUVkaXQ6OlVwZGF0ZVdpZGdldFByb3BlcnR5KCkgew0KKyAgQ0ZXTF9EYXRlVGltZVBpY2tlciogcFdpZGdldCA9IChDRldMX0RhdGVUaW1lUGlja2VyKiltX3BOb3JtYWxXaWRnZXQ7DQorICBpZiAoIXBXaWRnZXQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfRFdPUkQgZHdFeHRlbmRlZFN0eWxlID0gRldMX1NUWUxFRVhUX0RUUF9TaG9ydERhdGVGb3JtYXQ7DQorICBkd0V4dGVuZGVkU3R5bGUgfD0gVXBkYXRlVUlQcm9wZXJ0eSgpOw0KKyAgZHdFeHRlbmRlZFN0eWxlIHw9IEdldEFsaWdubWVudCgpOw0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5Nb2RpZnlTdHlsZXNFeChkd0V4dGVuZGVkU3R5bGUsIDB4RkZGRkZGRkYpOw0KKyAgRlhfRFdPUkQgZHdFZGl0U3R5bGVzID0gRldMX1NUWUxFRVhUX0VEVF9MYXN0TGluZUhlaWdodDsNCisgIGludDMyX3QgaU51bUNlbGxzID0gbV9wRGF0YUFjYy0+R2V0TnVtYmVyT2ZDZWxscygpOw0KKyAgaWYgKGlOdW1DZWxscyA+IDApIHsNCisgICAgZHdFZGl0U3R5bGVzIHw9IEZXTF9TVFlMRUVYVF9FRFRfQ29tYlRleHQ7DQorICAgIHBXaWRnZXQtPlNldEVkaXRMaW1pdChpTnVtQ2VsbHMpOw0KKyAgfQ0KKyAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4gfHwNCisgICAgICAhbV9wRGF0YUFjYy0+R2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpIHsNCisgICAgZHdFZGl0U3R5bGVzIHw9IEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHk7DQorICB9DQorICBpZiAobV9wRGF0YUFjYy0+R2V0SG9yaXpvbnRhbFNjcm9sbFBvbGljeSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09mZikgew0KKyAgICBkd0VkaXRTdHlsZXMgfD0gRldMX1NUWUxFRVhUX0VEVF9BdXRvSFNjcm9sbDsNCisgIH0NCisgIHBXaWRnZXQtPk1vZGlmeUVkaXRTdHlsZXNFeChkd0VkaXRTdHlsZXMsIDB4RkZGRkZGRkYpOw0KK30NCitGWF9EV09SRCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpHZXRBbGlnbm1lbnQoKSB7DQorICBGWF9EV09SRCBkd0V4dGVuZGVkU3R5bGUgPSAwOw0KKyAgaWYgKENYRkFfUGFyYSBwYXJhID0gbV9wRGF0YUFjYy0+R2V0UGFyYSgpKSB7DQorICAgIGludDMyX3QgaUhvcnogPSBwYXJhLkdldEhvcml6b250YWxBbGlnbigpOw0KKyAgICBzd2l0Y2ggKGlIb3J6KSB7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXI6DQorICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0RUUF9FZGl0SENlbnRlcjsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSnVzdGlmeToNCisgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRKdXN0aWZpZWQ7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnlBbGw6DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JhZGl4Og0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoNCisgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRIRmFyOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRITmVhcjsNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGludDMyX3QgaVZlcnQgPSBwYXJhLkdldFZlcnRpY2FsQWxpZ24oKTsNCisgICAgc3dpdGNoIChpVmVydCkgew0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlOg0KKyAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9EVFBfRWRpdFZDZW50ZXI7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbToNCisgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRWRmFyOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRWTmVhcjsNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gZHdFeHRlbmRlZFN0eWxlOw0KK30NCitGWF9CT09MIENYRkFfRkZEYXRlVGltZUVkaXQ6OkNvbW1pdERhdGEoKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPkdldEVkaXRUZXh0KHdzVGV4dCk7DQorICBpZiAobV9wRGF0YUFjYy0+U2V0VmFsdWUod3NUZXh0LCBYRkFfVkFMVUVQSUNUVVJFX0VkaXQpKSB7DQorICAgIG1fcERhdGFBY2MtPlVwZGF0ZVVJRGlzcGxheSh0aGlzKTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6VXBkYXRlRldMRGF0YSgpIHsNCisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIFhGQV9WQUxVRVBJQ1RVUkUgZVR5cGUgPSBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXk7DQorICBpZiAoSXNGb2N1c2VkKCkpIHsNCisgICAgZVR5cGUgPSBYRkFfVkFMVUVQSUNUVVJFX0VkaXQ7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICBtX3BEYXRhQWNjLT5HZXRWYWx1ZSh3c1RleHQsIGVUeXBlKTsNCisgICgoQ0ZXTF9EYXRlVGltZVBpY2tlciopbV9wTm9ybWFsV2lkZ2V0KS0+U2V0RWRpdFRleHQod3NUZXh0KTsNCisgIGlmIChJc0ZvY3VzZWQoKSAmJiAhd3NUZXh0LklzRW1wdHkoKSkgew0KKyAgICBDWEZBX0xvY2FsZVZhbHVlIGxjVmFsdWUgPSBYRkFfR2V0TG9jYWxlVmFsdWUobV9wRGF0YUFjYyk7DQorICAgIENGWF9Vbml0aW1lIGRhdGUgPSBsY1ZhbHVlLkdldERhdGUoKTsNCisgICAgaWYgKGxjVmFsdWUuSXNWYWxpZCgpKSB7DQorICAgICAgaWYgKChGWF9VTklUSU1FKWRhdGUgIT0gMCkgew0KKyAgICAgICAgKChDRldMX0RhdGVUaW1lUGlja2VyKiltX3BOb3JtYWxXaWRnZXQpDQorICAgICAgICAgICAgLT5TZXRDdXJTZWwoZGF0ZS5HZXRZZWFyKCksIGRhdGUuR2V0TW9udGgoKSwgZGF0ZS5HZXREYXkoKSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6SXNEYXRhQ2hhbmdlZCgpIHsNCisgIGlmIChtX2R3U3RhdHVzICYgWEZBX1dJREdFVFNUQVRVU19UZXh0RWRpdFZhbHVlQ2hhbmdlZCkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICgoQ0ZXTF9EYXRlVGltZVBpY2tlciopbV9wTm9ybWFsV2lkZ2V0KS0+R2V0RWRpdFRleHQod3NUZXh0KTsNCisgIENGWF9XaWRlU3RyaW5nIHdzT2xkVmFsdWU7DQorICBtX3BEYXRhQWNjLT5HZXRWYWx1ZSh3c09sZFZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFX0VkaXQpOw0KKyAgcmV0dXJuIHdzT2xkVmFsdWUgIT0gd3NUZXh0Ow0KK30NCitGWF9CT09MIENYRkFfRkZEYXRlVGltZUVkaXQ6OkNhblVuZG8oKSB7DQorICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VyKiltX3BOb3JtYWxXaWRnZXQpLT5DYW5VbmRvKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6Q2FuUmVkbygpIHsNCisgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPkNhblJlZG8oKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpVbmRvKCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlciopbV9wTm9ybWFsV2lkZ2V0KS0+VW5kbygpOw0KK30NCitGWF9CT09MIENYRkFfRkZEYXRlVGltZUVkaXQ6OlJlZG8oKSB7DQorICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VyKiltX3BOb3JtYWxXaWRnZXQpLT5SZWRvKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6Q2FuQ29weSgpIHsNCisgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPkNhbkNvcHkoKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpDYW5DdXQoKSB7DQorICBpZiAobV9wRGF0YUFjYy0+R2V0QWNjZXNzKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT3Blbikgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gKChDRldMX0RhdGVUaW1lUGlja2VyKiltX3BOb3JtYWxXaWRnZXQpLT5DYW5DdXQoKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpDYW5QYXN0ZSgpIHsNCisgIHJldHVybiBtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuOw0KK30NCitGWF9CT09MIENYRkFfRkZEYXRlVGltZUVkaXQ6OkNhblNlbGVjdEFsbCgpIHsNCisgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPkNhblNlbGVjdEFsbCgpOw0KK30NCitGWF9CT09MIENYRkFfRkZEYXRlVGltZUVkaXQ6OkNvcHkoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29weSkgew0KKyAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlciopbV9wTm9ybWFsV2lkZ2V0KS0+Q29weSh3c0NvcHkpOw0KK30NCitGWF9CT09MIENYRkFfRkZEYXRlVGltZUVkaXQ6OkN1dChDRlhfV2lkZVN0cmluZyYgd3NDdXQpIHsNCisgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPkN1dCh3c0N1dCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6UGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGFzdGUpIHsNCisgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPlBhc3RlKHdzUGFzdGUpOw0KK30NCitGWF9CT09MIENYRkFfRkZEYXRlVGltZUVkaXQ6OlNlbGVjdEFsbCgpIHsNCisgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPlNlbGVjdEFsbCgpOw0KK30NCitGWF9CT09MIENYRkFfRkZEYXRlVGltZUVkaXQ6OkRlbGV0ZSgpIHsNCisgIHJldHVybiAoKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldCktPkRlbGV0ZSgpOw0KK30NCitGWF9CT09MIENYRkFfRkZEYXRlVGltZUVkaXQ6OkRlU2VsZWN0KCkgew0KKyAgcmV0dXJuICgoQ0ZXTF9EYXRlVGltZVBpY2tlciopbV9wTm9ybWFsV2lkZ2V0KS0+RGVTZWxlY3QoKTsNCit9DQordm9pZCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpPblNlbGVjdENoYW5nZWQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpWWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEYXkpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzUGljdHVyZTsNCisgIG1fcERhdGFBY2MtPkdldFBpY3R1cmVDb250ZW50KHdzUGljdHVyZSwgWEZBX1ZBTFVFUElDVFVSRV9FZGl0KTsNCisgIENYRkFfTG9jYWxlVmFsdWUgZGF0ZShYRkFfVlRfREFURSwNCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5HZXREb2MoKS0+R2V0WEZBRG9jKCktPkdldExvY2FsTWdyKCkpOw0KKyAgQ0ZYX1VuaXRpbWUgZHQ7DQorICBkdC5TZXQoaVllYXIsIGlNb250aCwgaURheSk7DQorICBkYXRlLlNldERhdGUoZHQpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlOw0KKyAgZGF0ZS5Gb3JtYXRQYXR0ZXJucyh3c0RhdGUsIHdzUGljdHVyZSwgbV9wRGF0YUFjYy0+R2V0TG9jYWwoKSwNCisgICAgICAgICAgICAgICAgICAgICAgWEZBX1ZBTFVFUElDVFVSRV9FZGl0KTsNCisgIENGV0xfRGF0ZVRpbWVQaWNrZXIqIHBEYXRlVGltZSA9IChDRldMX0RhdGVUaW1lUGlja2VyKiltX3BOb3JtYWxXaWRnZXQ7DQorICBwRGF0ZVRpbWUtPlNldEVkaXRUZXh0KHdzRGF0ZSk7DQorICBwRGF0ZVRpbWUtPlVwZGF0ZSgpOw0KKyAgR2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCktPlNldEZvY3VzV2lkZ2V0KEdldERvYygpLCBOVUxMKTsNCisgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07DQorICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9DaGFuZ2U7DQorICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsNCisgIG1fcERhdGFBY2MtPkdldFZhbHVlKGVQYXJhbS5tX3dzTmV3VGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9SYXcpOw0KKyAgbV9wRGF0YUFjYy0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX0NoYW5nZSwgJmVQYXJhbSk7DQorfQ0KK0ZXTF9FUlIgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSB7DQorICBGWF9EV09SRCBkd0V2ZW50SUQgPSBwRXZlbnQtPkdldENsYXNzSUQoKTsNCisgIGlmIChkd0V2ZW50SUQgPT0gRldMX0VWVEhBU0hfRFRQX1NlbGVjdENoYW5nZWQpIHsNCisgICAgQ0ZXTF9FdmVudF9EdHBTZWxlY3RDaGFuZ2VkKiBldmVudCA9IChDRldMX0V2ZW50X0R0cFNlbGVjdENoYW5nZWQqKXBFdmVudDsNCisgICAgT25TZWxlY3RDaGFuZ2VkKG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0KCksIGV2ZW50LT5pWWVhciwgZXZlbnQtPmlNb250aCwNCisgICAgICAgICAgICAgICAgICAgIGV2ZW50LT5pRGF5KTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9IGVsc2Ugew0KKyAgICByZXR1cm4gQ1hGQV9GRlRleHRFZGl0OjpPblByb2Nlc3NFdmVudChwRXZlbnQpOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ0ZXh0ZWRpdC5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmdGV4dGVkaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWZhODE2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZmdGV4dGVkaXQuaApAQCAtMCwwICsxLDEyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWEZBX0ZPUk1GSUxMRVJfVEVYVEVESVRfSU1QX0gNCisjZGVmaW5lIF9GWEZBX0ZPUk1GSUxMRVJfVEVYVEVESVRfSU1QX0gNCitjbGFzcyBDWEZBX0ZGVGV4dEVkaXQgOiBwdWJsaWMgQ1hGQV9GRkZpZWxkIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GRlRleHRFZGl0KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgdmlydHVhbCB+Q1hGQV9GRlRleHRFZGl0KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgTG9hZFdpZGdldCgpOw0KKyAgdmlydHVhbCB2b2lkIFVwZGF0ZVdpZGdldFByb3BlcnR5KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPblJCdXR0b25VcChGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uU2V0Rm9jdXMoQ1hGQV9GRldpZGdldCogcE9sZFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25LaWxsRm9jdXMoQ1hGQV9GRldpZGdldCogcE5ld1dpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuVW5kbygpOw0KKyAgdmlydHVhbCBGWF9CT09MIENhblJlZG8oKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBVbmRvKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUmVkbygpOw0KKyAgdmlydHVhbCBGWF9CT09MIENhbkNvcHkoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5DdXQoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5QYXN0ZSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIENhblNlbGVjdEFsbCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIENvcHkoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29weSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ3V0KENGWF9XaWRlU3RyaW5nJiB3c0N1dCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGFzdGUpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNlbGVjdEFsbCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIERlbGV0ZSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIERlU2VsZWN0KCk7DQorICBGWF9CT09MIEdldFN1Z2dlc3RXb3JkcyhDRlhfUG9pbnRGIHBvaW50ZiwgQ0ZYX0J5dGVTdHJpbmdBcnJheSYgc1N1Z2dlc3QpOw0KKyAgRlhfQk9PTCBSZXBsYWNlU3BlbGxDaGVja1dvcmQoQ0ZYX1BvaW50RiBwb2ludGYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVwbGFjZSk7DQorDQorIHByb3RlY3RlZDoNCisgIEZYX0RXT1JEIEdldEFsaWdubWVudCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIENvbW1pdERhdGEoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBVcGRhdGVGV0xEYXRhKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNEYXRhQ2hhbmdlZCgpOw0KKyAgdm9pZCBWYWxpZGF0ZU51bWJlckZpZWxkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogbV9wT2xkRGVsZWdhdGU7DQorDQorIHB1YmxpYzoNCisgIHZvaWQgT25UZXh0Q2hhbmdlZChJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDaGFuZ2VkLA0KKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ByZXZUZXh0KTsNCisgIHZvaWQgT25UZXh0RnVsbChJRldMX1dpZGdldCogcFdpZGdldCk7DQorICB2b2lkIE9uQWRkRG9SZWNvcmQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgRlhfQk9PTCBDaGVja1dvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzV29yZCk7DQorICBGWF9CT09MIEdldFN1Z2dlc3RXb3Jkcyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNXb3JkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdBcnJheSYgc1N1Z2dlc3QpOw0KKyAgdmlydHVhbCBpbnQzMl90IE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSk7DQorICB2aXJ0dWFsIEZXTF9FUlIgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KTsNCisgIHZpcnR1YWwgRldMX0VSUiBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMKTsNCit9Ow0KK2NsYXNzIENYRkFfRkZOdW1lcmljRWRpdCA6IHB1YmxpYyBDWEZBX0ZGVGV4dEVkaXQgew0KKyBwdWJsaWM6DQorICBDWEZBX0ZGTnVtZXJpY0VkaXQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQorICB2aXJ0dWFsIH5DWEZBX0ZGTnVtZXJpY0VkaXQoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBMb2FkV2lkZ2V0KCk7DQorICB2aXJ0dWFsIHZvaWQgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCisgIHZpcnR1YWwgRldMX0VSUiBPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpOw0KKw0KKyBwdWJsaWM6DQorICBGWF9CT09MIE9uVmFsaWRhdGUoSUZXTF9XaWRnZXQqIHBXaWRnZXQsIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KK307DQorY2xhc3MgQ1hGQV9GRlBhc3N3b3JkRWRpdCA6IHB1YmxpYyBDWEZBX0ZGVGV4dEVkaXQgew0KKyBwdWJsaWM6DQorICBDWEZBX0ZGUGFzc3dvcmRFZGl0KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOw0KKyAgdmlydHVhbCB+Q1hGQV9GRlBhc3N3b3JkRWRpdCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIExvYWRXaWRnZXQoKTsNCisgIHZpcnR1YWwgdm9pZCBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorfTsNCitlbnVtIFhGQV9EQVRFVElNRVRZUEUgew0KKyAgWEZBX0RBVEVUSU1FVFlQRV9EYXRlID0gMCwNCisgIFhGQV9EQVRFVElNRVRZUEVfVGltZSwNCisgIFhGQV9EQVRFVElNRVRZUEVfRGF0ZUFuZFRpbWUNCit9Ow0KK2NsYXNzIENYRkFfRkZEYXRlVGltZUVkaXQgOiBwdWJsaWMgQ1hGQV9GRlRleHRFZGl0IHsNCisgcHVibGljOg0KKyAgQ1hGQV9GRkRhdGVUaW1lRWRpdChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsNCisgIHZpcnR1YWwgfkNYRkFfRkZEYXRlVGltZUVkaXQoKTsNCisNCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRCQm94KENGWF9SZWN0RiYgcnRCb3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXR1cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRyYXdGb2N1cyA9IEZBTFNFKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBMb2FkV2lkZ2V0KCk7DQorICB2aXJ0dWFsIHZvaWQgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsNCisNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5VbmRvKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuUmVkbygpOw0KKyAgdmlydHVhbCBGWF9CT09MIFVuZG8oKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBSZWRvKCk7DQorDQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuQ29weSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIENhbkN1dCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIENhblBhc3RlKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuU2VsZWN0QWxsKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ29weShDRlhfV2lkZVN0cmluZyYgd3NDb3B5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDdXQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ3V0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXN0ZSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgU2VsZWN0QWxsKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRGVsZXRlKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRGVTZWxlY3QoKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgRlhfRFdPUkQgR2V0QWxpZ25tZW50KCk7DQorDQorICB2aXJ0dWFsIEZYX0JPT0wgUHRJbkFjdGl2ZVJlY3QoRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDb21taXREYXRhKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgVXBkYXRlRldMRGF0YSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIElzRGF0YUNoYW5nZWQoKTsNCisNCisgcHVibGljOg0KKyAgdm9pZCBPblNlbGVjdENoYW5nZWQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEYXkpOw0KKyAgdmlydHVhbCBGV0xfRVJSIE9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXQuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODE5NGJhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0LmNwcApAQCAtMCwwICsxLDE5NTkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgPGFsZ29yaXRobT4NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfY29tbW9uLmgiDQorI2luY2x1ZGUgInhmYV9mZmFwcC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2MuaCINCisjaW5jbHVkZSAieGZhX2ZmZG9jdmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXQuaCINCisjaW5jbHVkZSAieGZhX2ZmcGFnZXZpZXcuaCINCisjaW5jbHVkZSAieGZhX3RleHRsYXlvdXQuaCINCitDWEZBX0ZGV2lkZ2V0OjpDWEZBX0ZGV2lkZ2V0KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQ0KKyAgICA6IENYRkFfQ29udGVudExheW91dEl0ZW0ocERhdGFBY2MtPkdldE5vZGUoKSksDQorICAgICAgbV9wUGFnZVZpZXcocFBhZ2VWaWV3KSwNCisgICAgICBtX3BEYXRhQWNjKHBEYXRhQWNjKSB7DQorICBtX3J0V2lkZ2V0LlNldCgwLCAwLCAwLCAwKTsNCit9DQorQ1hGQV9GRldpZGdldDo6fkNYRkFfRkZXaWRnZXQoKSB7fQ0KK0lYRkFfUGFnZVZpZXcqIENYRkFfRkZXaWRnZXQ6OkdldFBhZ2VWaWV3KCkgew0KKyAgcmV0dXJuIG1fcFBhZ2VWaWV3Ow0KK30NCit2b2lkIENYRkFfRkZXaWRnZXQ6OlNldFBhZ2VWaWV3KElYRkFfUGFnZVZpZXcqIHBQYWdlVmlldykgew0KKyAgbV9wUGFnZVZpZXcgPSBzdGF0aWNfY2FzdDxDWEZBX0ZGUGFnZVZpZXcqPihwUGFnZVZpZXcpOw0KK30NCit2b2lkIENYRkFfRkZXaWRnZXQ6OkdldFdpZGdldFJlY3QoQ0ZYX1JlY3RGJiBydFdpZGdldCkgew0KKyAgaWYgKChtX2R3U3RhdHVzICYgWEZBX1dJREdFVFNUQVRVU19SZWN0Q2FjaGVkKSA9PSAwKSB7DQorICAgIG1fZHdTdGF0dXMgfD0gWEZBX1dJREdFVFNUQVRVU19SZWN0Q2FjaGVkOw0KKyAgICBHZXRSZWN0KG1fcnRXaWRnZXQpOw0KKyAgfQ0KKyAgcnRXaWRnZXQgPSBtX3J0V2lkZ2V0Ow0KK30NCitDRlhfUmVjdEYgQ1hGQV9GRldpZGdldDo6UmVDYWNoZVdpZGdldFJlY3QoKSB7DQorICBtX2R3U3RhdHVzIHw9IFhGQV9XSURHRVRTVEFUVVNfUmVjdENhY2hlZDsNCisgIEdldFJlY3QobV9ydFdpZGdldCk7DQorICByZXR1cm4gbV9ydFdpZGdldDsNCit9DQordm9pZCBDWEZBX0ZGV2lkZ2V0OjpHZXRSZWN0V2l0aG91dFJvdGF0ZShDRlhfUmVjdEYmIHJ0V2lkZ2V0KSB7DQorICBHZXRXaWRnZXRSZWN0KHJ0V2lkZ2V0KTsNCisgIEZYX0ZMT0FUIGZWYWx1ZSA9IDA7DQorICBzd2l0Y2ggKG1fcERhdGFBY2MtPkdldFJvdGF0ZSgpKSB7DQorICAgIGNhc2UgOTA6DQorICAgICAgcnRXaWRnZXQudG9wID0gcnRXaWRnZXQuYm90dG9tKCk7DQorICAgICAgZlZhbHVlID0gcnRXaWRnZXQud2lkdGg7DQorICAgICAgcnRXaWRnZXQud2lkdGggPSBydFdpZGdldC5oZWlnaHQ7DQorICAgICAgcnRXaWRnZXQuaGVpZ2h0ID0gZlZhbHVlOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDE4MDoNCisgICAgICBydFdpZGdldC5sZWZ0ID0gcnRXaWRnZXQucmlnaHQoKTsNCisgICAgICBydFdpZGdldC50b3AgPSBydFdpZGdldC5ib3R0b20oKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAyNzA6DQorICAgICAgcnRXaWRnZXQubGVmdCA9IHJ0V2lkZ2V0LnJpZ2h0KCk7DQorICAgICAgZlZhbHVlID0gcnRXaWRnZXQud2lkdGg7DQorICAgICAgcnRXaWRnZXQud2lkdGggPSBydFdpZGdldC5oZWlnaHQ7DQorICAgICAgcnRXaWRnZXQuaGVpZ2h0ID0gZlZhbHVlOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KK30NCitGWF9EV09SRCBDWEZBX0ZGV2lkZ2V0OjpHZXRTdGF0dXMoKSB7DQorICByZXR1cm4gbV9kd1N0YXR1czsNCit9DQordm9pZCBDWEZBX0ZGV2lkZ2V0OjpNb2RpZnlTdGF0dXMoRlhfRFdPUkQgZHdBZGRlZCwgRlhfRFdPUkQgZHdSZW1vdmVkKSB7DQorICBtX2R3U3RhdHVzID0gKG1fZHdTdGF0dXMgJiB+ZHdSZW1vdmVkKSB8IGR3QWRkZWQ7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6R2V0QkJveChDRlhfUmVjdEYmIHJ0Qm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0YXR1cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRHJhd0ZvY3VzKSB7DQorICBpZiAoYkRyYXdGb2N1cykgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorI2lmbmRlZiBfWEZBX0VNQg0KKyAgaWYgKG1fcFBhZ2VWaWV3KSB7DQorICAgIG1fcFBhZ2VWaWV3LT5HZXRQYWdlVmlld1JlY3QocnRCb3gpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorI2VuZGlmDQorICBHZXRXaWRnZXRSZWN0KHJ0Qm94KTsNCisgIHJldHVybiBUUlVFOw0KK30NCitDWEZBX1dpZGdldEFjYyogQ1hGQV9GRldpZGdldDo6R2V0RGF0YUFjYygpIHsNCisgIHJldHVybiBtX3BEYXRhQWNjOw0KK30NCitGWF9CT09MIENYRkFfRkZXaWRnZXQ6OkdldFRvb2xUaXAoQ0ZYX1dpZGVTdHJpbmcmIHdzVG9vbFRpcCkgew0KKyAgaWYgKENYRkFfQXNzaXN0IGFzc2lzdCA9IG1fcERhdGFBY2MtPkdldEFzc2lzdCgpKSB7DQorICAgIGlmIChDWEZBX1Rvb2xUaXAgdG9vbFRpcCA9IGFzc2lzdC5HZXRUb29sVGlwKCkpIHsNCisgICAgICByZXR1cm4gdG9vbFRpcC5HZXRUaXAod3NUb29sVGlwKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEdldENhcHRpb25UZXh0KHdzVG9vbFRpcCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRldpZGdldDo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlKSB7DQorICBpZiAoIUlzTWF0Y2hWaXNpYmxlU3RhdHVzKGR3U3RhdHVzKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX0JvcmRlciBib3JkZXIgPSBtX3BEYXRhQWNjLT5HZXRCb3JkZXIoKTsNCisgIGlmIChib3JkZXIpIHsNCisgICAgQ0ZYX1JlY3RGIHJ0Qm9yZGVyOw0KKyAgICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydEJvcmRlcik7DQorICAgIENYRkFfTWFyZ2luIG1hcmdpbiA9IGJvcmRlci5HZXRNYXJnaW4oKTsNCisgICAgaWYgKG1hcmdpbi5Jc0V4aXN0SW5YTUwoKSkgew0KKyAgICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4ocnRCb3JkZXIsIG1hcmdpbik7DQorICAgIH0NCisgICAgcnRCb3JkZXIuTm9ybWFsaXplKCk7DQorICAgIERyYXdCb3JkZXIocEdTLCBib3JkZXIsIHJ0Qm9yZGVyLCBwTWF0cml4KTsNCisgIH0NCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpJc0xvYWRlZCgpIHsNCisgIHJldHVybiBtX3BQYWdlVmlldyAhPSBOVUxMOw0KK30NCitGWF9CT09MIENYRkFfRkZXaWRnZXQ6OkxvYWRXaWRnZXQoKSB7DQorICBQZXJmb3JtTGF5b3V0KCk7DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDWEZBX0ZGV2lkZ2V0OjpVbmxvYWRXaWRnZXQoKSB7fQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6UGVyZm9ybUxheW91dCgpIHsNCisgIFJlQ2FjaGVXaWRnZXRSZWN0KCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpVcGRhdGVGV0xEYXRhKCkgew0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkIENYRkFfRkZXaWRnZXQ6OlVwZGF0ZVdpZGdldFByb3BlcnR5KCkge30NCit2b2lkIENYRkFfRkZXaWRnZXQ6OkRyYXdCb3JkZXIoQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfQm94IGJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEJvcmRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncykgew0KKyAgWEZBX0RyYXdCb3goYm94LCBwR1MsIHJ0Qm9yZGVyLCBwTWF0cml4LCBkd0ZsYWdzKTsNCit9DQordm9pZCBDWEZBX0ZGV2lkZ2V0OjpJbnZhbGlkYXRlV2lkZ2V0KGNvbnN0IENGWF9SZWN0RiogcFJlY3QpIHsNCisgIGlmICghcFJlY3QpIHsNCisgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KKyAgICBHZXRCQm94KHJ0V2lkZ2V0LCBYRkFfV0lER0VUU1RBVFVTX0ZvY3VzZWQpOw0KKyAgICBydFdpZGdldC5JbmZsYXRlKDIsIDIpOw0KKyAgICBHZXREb2MoKS0+R2V0RG9jUHJvdmlkZXIoKS0+SW52YWxpZGF0ZVJlY3QobV9wUGFnZVZpZXcsIHJ0V2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0lOVkFMSURBVEVfQ3VycmVudFBhZ2UpOw0KKyAgfSBlbHNlIHsNCisgICAgR2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCktPkludmFsaWRhdGVSZWN0KG1fcFBhZ2VWaWV3LCAqcFJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfSU5WQUxJREFURV9DdXJyZW50UGFnZSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRldpZGdldDo6QWRkSW52YWxpZGF0ZVJlY3QoY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCkgew0KKyAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0Ow0KKyAgaWYgKHBSZWN0KSB7DQorICAgIHJ0V2lkZ2V0ID0gKnBSZWN0Ow0KKyAgfSBlbHNlIHsNCisgICAgR2V0QkJveChydFdpZGdldCwgWEZBX1dJREdFVFNUQVRVU19Gb2N1c2VkKTsNCisgICAgcnRXaWRnZXQuSW5mbGF0ZSgyLCAyKTsNCisgIH0NCisgIG1fcERvY1ZpZXctPkFkZEludmFsaWRhdGVSZWN0KG1fcFBhZ2VWaWV3LCBydFdpZGdldCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6R2V0Q2FwdGlvblRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2FwKSB7DQorICBDWEZBX1RleHRMYXlvdXQqIHBDYXBUZXh0bGF5b3V0ID0gbV9wRGF0YUFjYy0+R2V0Q2FwdGlvblRleHRMYXlvdXQoKTsNCisgIGlmICghcENhcFRleHRsYXlvdXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcENhcFRleHRsYXlvdXQtPkdldFRleHQod3NDYXApOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6SXNGb2N1c2VkKCkgew0KKyAgcmV0dXJuIG1fZHdTdGF0dXMgJiBYRkFfV0lER0VUU1RBVFVTX0ZvY3VzZWQ7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6T25Nb3VzZUVudGVyKCkgew0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfRkZXaWRnZXQ6Ok9uTW91c2VFeGl0KCkgew0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfRkZXaWRnZXQ6Ok9uTEJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6T25MQnV0dG9uVXAoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6T25MQnV0dG9uRGJsQ2xrKEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpPbk1vdXNlTW92ZShGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpPbk1vdXNlV2hlZWwoRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IHpEZWx0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfRkZXaWRnZXQ6Ok9uUkJ1dHRvbkRvd24oRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6T25SQnV0dG9uVXAoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6T25SQnV0dG9uRGJsQ2xrKEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQorDQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpPblNldEZvY3VzKENYRkFfRkZXaWRnZXQqIHBPbGRXaWRnZXQpIHsNCisgIENYRkFfRkZXaWRnZXQqIHBQYXJlbnQgPSBHZXRQYXJlbnQoKTsNCisgIGlmIChwUGFyZW50ICE9IE5VTEwgJiYgIXBQYXJlbnQtPklzQW5jZXN0b3JPZihwT2xkV2lkZ2V0KSkgew0KKyAgICBwUGFyZW50LT5PblNldEZvY3VzKHBPbGRXaWRnZXQpOw0KKyAgfQ0KKyAgbV9kd1N0YXR1cyB8PSBYRkFfV0lER0VUU1RBVFVTX0ZvY3VzZWQ7DQorICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KKyAgZVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfRW50ZXI7DQorICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsNCisgIG1fcERhdGFBY2MtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9FbnRlciwgJmVQYXJhbSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpPbktpbGxGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwTmV3V2lkZ2V0KSB7DQorICBtX2R3U3RhdHVzICY9IH5YRkFfV0lER0VUU1RBVFVTX0ZvY3VzZWQ7DQorICBFdmVudEtpbGxGb2N1cygpOw0KKyAgaWYgKHBOZXdXaWRnZXQgIT0gTlVMTCkgew0KKyAgICBDWEZBX0ZGV2lkZ2V0KiBwUGFyZW50ID0gR2V0UGFyZW50KCk7DQorICAgIGlmIChwUGFyZW50ICE9IE5VTEwgJiYgIXBQYXJlbnQtPklzQW5jZXN0b3JPZihwTmV3V2lkZ2V0KSkgew0KKyAgICAgIHBQYXJlbnQtPk9uS2lsbEZvY3VzKHBOZXdXaWRnZXQpOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpPbktleURvd24oRlhfRFdPUkQgZHdLZXlDb2RlLCBGWF9EV09SRCBkd0ZsYWdzKSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6T25LZXlVcChGWF9EV09SRCBkd0tleUNvZGUsIEZYX0RXT1JEIGR3RmxhZ3MpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpPbkNoYXIoRlhfRFdPUkQgZHdDaGFyLCBGWF9EV09SRCBkd0ZsYWdzKSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0RXT1JEIENYRkFfRkZXaWRnZXQ6Ok9uSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpPblNldEN1cnNvcihGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDWEZBX0ZGV2lkZ2V0OjpSb3RhdGUyTm9ybWFsKEZYX0ZMT0FUJiBmeCwgRlhfRkxPQVQmIGZ5KSB7DQorICBDRlhfTWF0cml4IG10Ow0KKyAgR2V0Um90YXRlTWF0cml4KG10KTsNCisgIGlmIChtdC5Jc0lkZW50aXR5KCkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX01hdHJpeCBtdFJldmVyc2U7DQorICBtdFJldmVyc2UuU2V0UmV2ZXJzZShtdCk7DQorICBtdFJldmVyc2UuVHJhbnNmb3JtUG9pbnQoZngsIGZ5KTsNCit9DQorc3RhdGljIHZvaWQgWEZBX0dldE1hdHJpeChDRlhfTWF0cml4JiBtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnQpIHsNCisgIGlmICghaVJvdGF0ZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9GTE9BVCBmQW5jaG9yWCwgZkFuY2hvclk7DQorICBzd2l0Y2ggKGF0KSB7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9wTGVmdDoNCisgICAgICBmQW5jaG9yWCA9IHJ0LmxlZnQsIGZBbmNob3JZID0gcnQudG9wOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvcENlbnRlcjoNCisgICAgICBmQW5jaG9yWCA9IChydC5sZWZ0ICsgcnQucmlnaHQoKSkgLyAyLCBmQW5jaG9yWSA9IHJ0LnRvcDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub3BSaWdodDoNCisgICAgICBmQW5jaG9yWCA9IHJ0LnJpZ2h0KCksIGZBbmNob3JZID0gcnQudG9wOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZUxlZnQ6DQorICAgICAgZkFuY2hvclggPSBydC5sZWZ0LCBmQW5jaG9yWSA9IChydC50b3AgKyBydC5ib3R0b20oKSkgLyAyOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZUNlbnRlcjoNCisgICAgICBmQW5jaG9yWCA9IChydC5sZWZ0ICsgcnQucmlnaHQoKSkgLyAyLA0KKyAgICAgIGZBbmNob3JZID0gKHJ0LnRvcCArIHJ0LmJvdHRvbSgpKSAvIDI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlUmlnaHQ6DQorICAgICAgZkFuY2hvclggPSBydC5yaWdodCgpLCBmQW5jaG9yWSA9IChydC50b3AgKyBydC5ib3R0b20oKSkgLyAyOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbUxlZnQ6DQorICAgICAgZkFuY2hvclggPSBydC5sZWZ0LCBmQW5jaG9yWSA9IHJ0LmJvdHRvbSgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbUNlbnRlcjoNCisgICAgICBmQW5jaG9yWCA9IChydC5sZWZ0ICsgcnQucmlnaHQoKSkgLyAyLCBmQW5jaG9yWSA9IHJ0LmJvdHRvbSgpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbVJpZ2h0Og0KKyAgICAgIGZBbmNob3JYID0gcnQucmlnaHQoKSwgZkFuY2hvclkgPSBydC5ib3R0b20oKTsNCisgICAgICBicmVhazsNCisgIH0NCisgIHN3aXRjaCAoaVJvdGF0ZSkgew0KKyAgICBjYXNlIDkwOg0KKyAgICAgIG0uYSA9IDAsIG0uYiA9IC0xLCBtLmMgPSAxLCBtLmQgPSAwLCBtLmUgPSBmQW5jaG9yWCAtIGZBbmNob3JZLA0KKyAgICAgIG0uZiA9IGZBbmNob3JYICsgZkFuY2hvclk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMTgwOg0KKyAgICAgIG0uYSA9IC0xLCBtLmIgPSAwLCBtLmMgPSAwLCBtLmQgPSAtMSwgbS5lID0gZkFuY2hvclggKiAyLA0KKyAgICAgIG0uZiA9IGZBbmNob3JZICogMjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAyNzA6DQorICAgICAgbS5hID0gMCwgbS5iID0gMSwgbS5jID0gLTEsIG0uZCA9IDAsIG0uZSA9IGZBbmNob3JYICsgZkFuY2hvclksDQorICAgICAgbS5mID0gZkFuY2hvclkgLSBmQW5jaG9yWDsNCisgICAgICBicmVhazsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZGV2lkZ2V0OjpHZXRSb3RhdGVNYXRyaXgoQ0ZYX01hdHJpeCYgbXQpIHsNCisgIG10LlNldCgxLCAwLCAwLCAxLCAwLCAwKTsNCisgIGludDMyX3QgaVJvdGF0ZSA9IG1fcERhdGFBY2MtPkdldFJvdGF0ZSgpOw0KKyAgaWYgKCFpUm90YXRlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9SZWN0RiByY1dpZGdldDsNCisgIEdldFJlY3RXaXRob3V0Um90YXRlKHJjV2lkZ2V0KTsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGF0ID0gWEZBX0FUVFJJQlVURUVOVU1fVG9wTGVmdDsNCisgIFhGQV9HZXRNYXRyaXgobXQsIGlSb3RhdGUsIGF0LCByY1dpZGdldCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6SXNMYXlvdXRSZWN0RW1wdHkoKSB7DQorICBDRlhfUmVjdEYgcnRMYXlvdXQ7DQorICBHZXRSZWN0V2l0aG91dFJvdGF0ZShydExheW91dCk7DQorICByZXR1cm4gcnRMYXlvdXQud2lkdGggPCAwLjFmICYmIHJ0TGF5b3V0LmhlaWdodCA8IDAuMWY7DQorfQ0KK0NYRkFfRkZXaWRnZXQqIENYRkFfRkZXaWRnZXQ6OkdldFBhcmVudCgpIHsNCisgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPQ0KKyAgICAgIG1fcERhdGFBY2MtPkdldE5vZGUoKS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICBpZiAocFBhcmVudE5vZGUgIT0gTlVMTCkgew0KKyAgICBDWEZBX1dpZGdldEFjYyogcFBhcmVudFdpZGdldEFjYyA9DQorICAgICAgICAoQ1hGQV9XaWRnZXRBY2MqKXBQYXJlbnROb2RlLT5HZXRXaWRnZXREYXRhKCk7DQorICAgIGlmIChwUGFyZW50V2lkZ2V0QWNjICE9IE5VTEwpIHsNCisgICAgICByZXR1cm4gcFBhcmVudFdpZGdldEFjYy0+R2V0TmV4dFdpZGdldChOVUxMKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldDo6SXNBbmNlc3Rvck9mKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQpIHsNCisgIGlmICghcFdpZGdldCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDWEZBX05vZGUqIHBOb2RlID0gbV9wRGF0YUFjYy0+R2V0Tm9kZSgpOw0KKyAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcFdpZGdldC0+R2V0RGF0YUFjYygpLT5HZXROb2RlKCk7DQorICB3aGlsZSAocENoaWxkTm9kZSkgew0KKyAgICBpZiAocENoaWxkTm9kZSA9PSBwTm9kZSkgew0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHBDaGlsZE5vZGUgPSBwQ2hpbGROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpQdEluQWN0aXZlUmVjdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpIHsNCisgIENGWF9SZWN0RiBydFdpZGdldDsNCisgIEdldFdpZGdldFJlY3QocnRXaWRnZXQpOw0KKyAgaWYgKHJ0V2lkZ2V0LkNvbnRhaW5zKGZ4LCBmeSkpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0NYRkFfRkZEb2NWaWV3KiBDWEZBX0ZGV2lkZ2V0OjpHZXREb2NWaWV3KCkgew0KKyAgcmV0dXJuIG1fcERvY1ZpZXc7DQorfQ0KK0NYRkFfRkZEb2MqIENYRkFfRkZXaWRnZXQ6OkdldERvYygpIHsNCisgIHJldHVybiAoQ1hGQV9GRkRvYyopbV9wRG9jVmlldy0+R2V0RG9jKCk7DQorfQ0KK0NYRkFfRkZBcHAqIENYRkFfRkZXaWRnZXQ6OkdldEFwcCgpIHsNCisgIHJldHVybiBHZXREb2MoKS0+R2V0QXBwKCk7DQorfQ0KK0lYRkFfQXBwUHJvdmlkZXIqIENYRkFfRkZXaWRnZXQ6OkdldEFwcFByb3ZpZGVyKCkgew0KKyAgcmV0dXJuIEdldEFwcCgpLT5HZXRBcHBQcm92aWRlcigpOw0KK30NCit2b2lkIENYRkFfRkZXaWRnZXQ6OkdldE1pbk1heFdpZHRoKEZYX0ZMT0FUIGZNaW5XaWR0aCwgRlhfRkxPQVQgZk1heFdpZHRoKSB7DQorICBmTWluV2lkdGggPSBmTWF4V2lkdGggPSAwOw0KKyAgRlhfRkxPQVQgZldpZHRoID0gMDsNCisgIGlmIChtX3BEYXRhQWNjLT5HZXRXaWR0aChmV2lkdGgpKSB7DQorICAgIGZNaW5XaWR0aCA9IGZNYXhXaWR0aCA9IGZXaWR0aDsNCisgIH0gZWxzZSB7DQorICAgIG1fcERhdGFBY2MtPkdldE1pbldpZHRoKGZNaW5XaWR0aCk7DQorICAgIG1fcERhdGFBY2MtPkdldE1heFdpZHRoKGZNYXhXaWR0aCk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GRldpZGdldDo6R2V0TWluTWF4SGVpZ2h0KEZYX0ZMT0FUIGZNaW5IZWlnaHQsIEZYX0ZMT0FUIGZNYXhIZWlnaHQpIHsNCisgIGZNaW5IZWlnaHQgPSBmTWF4SGVpZ2h0ID0gMDsNCisgIEZYX0ZMT0FUIGZIZWlnaHQgPSAwOw0KKyAgaWYgKG1fcERhdGFBY2MtPkdldEhlaWdodChmSGVpZ2h0KSkgew0KKyAgICBmTWluSGVpZ2h0ID0gZk1heEhlaWdodCA9IGZIZWlnaHQ7DQorICB9IGVsc2Ugew0KKyAgICBtX3BEYXRhQWNjLT5HZXRNaW5IZWlnaHQoZk1pbkhlaWdodCk7DQorICAgIG1fcERhdGFBY2MtPkdldE1heEhlaWdodChmTWF4SGVpZ2h0KTsNCisgIH0NCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0OjpJc01hdGNoVmlzaWJsZVN0YXR1cyhGWF9EV09SRCBkd1N0YXR1cykgew0KKyAgcmV0dXJuIG1fZHdTdGF0dXMgJiBYRkFfV0lER0VUU1RBVFVTX1Zpc2libGU7DQorfQ0KK3ZvaWQgQ1hGQV9GRldpZGdldDo6RXZlbnRLaWxsRm9jdXMoKSB7DQorICBpZiAobV9kd1N0YXR1cyAmIFhGQV9XSURHRVRTVEFUVVNfQWNjZXNzKSB7DQorICAgIG1fZHdTdGF0dXMgJj0gflhGQV9XSURHRVRTVEFUVVNfQWNjZXNzOw0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KKyAgZVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfRXhpdDsNCisgIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BEYXRhQWNjOw0KKyAgbV9wRGF0YUFjYy0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX0V4aXQsICZlUGFyYW0pOw0KK30NCitGWF9CT09MIENYRkFfRkZXaWRnZXQ6OklzQnV0dG9uRG93bigpIHsNCisgIHJldHVybiAobV9kd1N0YXR1cyAmIFhGQV9XSURHRVRTVEFUVVNfQnV0dG9uRG93bikgIT0gMDsNCit9DQordm9pZCBDWEZBX0ZGV2lkZ2V0OjpTZXRCdXR0b25Eb3duKEZYX0JPT0wgYlNldCkgew0KKyAgYlNldCA/IG1fZHdTdGF0dXMgfD0gWEZBX1dJREdFVFNUQVRVU19CdXR0b25Eb3duDQorICAgICAgIDogbV9kd1N0YXR1cyAmPSB+WEZBX1dJREdFVFNUQVRVU19CdXR0b25Eb3duOw0KK30NCitpbnQzMl90IFhGQV9TdHJva2VUeXBlU2V0TGluZURhc2goQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0cm9rZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNhcFR5cGUpIHsNCisgIHN3aXRjaCAoaVN0cm9rZVR5cGUpIHsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9EYXNoRG90OiB7DQorICAgICAgRlhfRkxPQVQgZGFzaEFycmF5W10gPSB7NCwgMSwgMiwgMX07DQorICAgICAgaWYgKGlDYXBUeXBlICE9IFhGQV9BVFRSSUJVVEVFTlVNX0J1dHQpIHsNCisgICAgICAgIGRhc2hBcnJheVsxXSA9IDI7DQorICAgICAgICBkYXNoQXJyYXlbM10gPSAyOw0KKyAgICAgIH0NCisgICAgICBwR3JhcGhpY3MtPlNldExpbmVEYXNoKDAsIGRhc2hBcnJheSwgNCk7DQorICAgICAgcmV0dXJuIEZYX0RBU0hTVFlMRV9EYXNoRG90Ow0KKyAgICB9DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRGFzaERvdERvdDogew0KKyAgICAgIEZYX0ZMT0FUIGRhc2hBcnJheVtdID0gezQsIDEsIDIsIDEsIDIsIDF9Ow0KKyAgICAgIGlmIChpQ2FwVHlwZSAhPSBYRkFfQVRUUklCVVRFRU5VTV9CdXR0KSB7DQorICAgICAgICBkYXNoQXJyYXlbMV0gPSAyOw0KKyAgICAgICAgZGFzaEFycmF5WzNdID0gMjsNCisgICAgICAgIGRhc2hBcnJheVs1XSA9IDI7DQorICAgICAgfQ0KKyAgICAgIHBHcmFwaGljcy0+U2V0TGluZURhc2goMCwgZGFzaEFycmF5LCA2KTsNCisgICAgICByZXR1cm4gRlhfREFTSFNUWUxFX0Rhc2hEb3REb3Q7DQorICAgIH0NCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9EYXNoZWQ6IHsNCisgICAgICBGWF9GTE9BVCBkYXNoQXJyYXlbXSA9IHs1LCAxfTsNCisgICAgICBpZiAoaUNhcFR5cGUgIT0gWEZBX0FUVFJJQlVURUVOVU1fQnV0dCkgew0KKyAgICAgICAgZGFzaEFycmF5WzFdID0gMjsNCisgICAgICB9DQorICAgICAgcEdyYXBoaWNzLT5TZXRMaW5lRGFzaCgwLCBkYXNoQXJyYXksIDIpOw0KKyAgICAgIHJldHVybiBGWF9EQVNIU1RZTEVfRGFzaDsNCisgICAgfQ0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0RvdHRlZDogew0KKyAgICAgIEZYX0ZMT0FUIGRhc2hBcnJheVtdID0gezIsIDF9Ow0KKyAgICAgIGlmIChpQ2FwVHlwZSAhPSBYRkFfQVRUUklCVVRFRU5VTV9CdXR0KSB7DQorICAgICAgICBkYXNoQXJyYXlbMV0gPSAyOw0KKyAgICAgIH0NCisgICAgICBwR3JhcGhpY3MtPlNldExpbmVEYXNoKDAsIGRhc2hBcnJheSwgMik7DQorICAgICAgcmV0dXJuIEZYX0RBU0hTVFlMRV9Eb3Q7DQorICAgIH0NCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIHBHcmFwaGljcy0+U2V0TGluZURhc2goRlhfREFTSFNUWUxFX1NvbGlkKTsNCisgIHJldHVybiBGWF9EQVNIU1RZTEVfU29saWQ7DQorfQ0KK0NGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcCBYRkFfTGluZUNhcFRvRlhHRShpbnQzMl90IGlMaW5lQ2FwKSB7DQorICBzd2l0Y2ggKGlMaW5lQ2FwKSB7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUm91bmQ6DQorICAgICAgcmV0dXJuIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcFJvdW5kOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0J1dHQ6DQorICAgICAgcmV0dXJuIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcEJ1dHQ7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwU3F1YXJlOw0KK30NCitjbGFzcyBDWEZBX0ltYWdlUmVuZGVyZXIgew0KKyBwdWJsaWM6DQorICBDWEZBX0ltYWdlUmVuZGVyZXIoKTsNCisgIH5DWEZBX0ltYWdlUmVuZGVyZXIoKTsNCisgIEZYX0JPT0wgU3RhcnQoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwNCisgICAgICAgICAgICAgICAgQ0ZYX0RJQlNvdXJjZSogcERJQlNvdXJjZSwNCisgICAgICAgICAgICAgICAgRlhfQVJHQiBiaXRtYXBfYXJnYiwNCisgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwNCisgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcEltYWdlMkRldmljZSwNCisgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsDQorICAgICAgICAgICAgICAgIGludCBibGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUwpOw0KKyAgRlhfQk9PTCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7DQorDQorIHByb3RlY3RlZDoNCisgIENGWF9SZW5kZXJEZXZpY2UqIG1fcERldmljZTsNCisgIGludCBtX1N0YXR1czsNCisgIENGWF9NYXRyaXggbV9JbWFnZU1hdHJpeDsNCisgIENGWF9ESUJTb3VyY2UqIG1fcERJQlNvdXJjZTsNCisgIENGWF9ESUJpdG1hcCogbV9wQ2xvbmVDb252ZXJ0Ow0KKyAgaW50IG1fQml0bWFwQWxwaGE7DQorICBGWF9BUkdCIG1fRmlsbEFyZ2I7DQorICBGWF9EV09SRCBtX0ZsYWdzOw0KKyAgQ0ZYX0ltYWdlVHJhbnNmb3JtZXIqIG1fcFRyYW5zZm9ybWVyOw0KKyAgdm9pZCogbV9EZXZpY2VIYW5kbGU7DQorICBpbnQzMl90IG1fQmxlbmRUeXBlOw0KKyAgRlhfQk9PTCBtX1Jlc3VsdDsNCisgIEZYX0JPT0wgbV9iUHJpbnQ7DQorICBGWF9CT09MIFN0YXJ0RElCU291cmNlKCk7DQorICB2b2lkIENvbXBvc2l0ZURJQml0bWFwKENGWF9ESUJpdG1hcCogcERJQml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBtYXNrX2FyZ2IsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF9tb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgVHJhbnNwYXJlbmN5KTsNCit9Ow0KK0NYRkFfSW1hZ2VSZW5kZXJlcjo6Q1hGQV9JbWFnZVJlbmRlcmVyKCkgew0KKyAgbV9wRGV2aWNlID0gTlVMTDsNCisgIG1fU3RhdHVzID0gMDsNCisgIG1fcERJQlNvdXJjZSA9IE5VTEw7DQorICBtX3BDbG9uZUNvbnZlcnQgPSBOVUxMOw0KKyAgbV9CaXRtYXBBbHBoYSA9IDI1NTsNCisgIG1fRmlsbEFyZ2IgPSAwOw0KKyAgbV9GbGFncyA9IDA7DQorICBtX3BUcmFuc2Zvcm1lciA9IE5VTEw7DQorICBtX0RldmljZUhhbmRsZSA9IE5VTEw7DQorICBtX0JsZW5kVHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTDsNCisgIG1fUmVzdWx0ID0gVFJVRTsNCisgIG1fYlByaW50ID0gRkFMU0U7DQorfQ0KK0NYRkFfSW1hZ2VSZW5kZXJlcjo6fkNYRkFfSW1hZ2VSZW5kZXJlcigpIHsNCisgIGlmIChtX3BDbG9uZUNvbnZlcnQpIHsNCisgICAgZGVsZXRlIG1fcENsb25lQ29udmVydDsNCisgIH0NCisgIGlmIChtX3BUcmFuc2Zvcm1lcikgew0KKyAgICBkZWxldGUgbV9wVHJhbnNmb3JtZXI7DQorICB9DQorICBpZiAobV9EZXZpY2VIYW5kbGUpIHsNCisgICAgbV9wRGV2aWNlLT5DYW5jZWxESUJpdHMobV9EZXZpY2VIYW5kbGUpOw0KKyAgfQ0KK30NCitGWF9CT09MIENYRkFfSW1hZ2VSZW5kZXJlcjo6U3RhcnQoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQlNvdXJjZSogcERJQlNvdXJjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBiaXRtYXBfYXJnYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcEltYWdlMkRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZFR5cGUpIHsNCisgIG1fcERldmljZSA9IHBEZXZpY2U7DQorICBtX3BESUJTb3VyY2UgPSBwRElCU291cmNlOw0KKyAgbV9GaWxsQXJnYiA9IGJpdG1hcF9hcmdiOw0KKyAgbV9CaXRtYXBBbHBoYSA9IGJpdG1hcF9hbHBoYTsNCisgIG1fSW1hZ2VNYXRyaXggPSAqcEltYWdlMkRldmljZTsNCisgIG1fRmxhZ3MgPSBmbGFnczsNCisgIG1fQmxlbmRUeXBlID0gYmxlbmRUeXBlOw0KKyAgcmV0dXJuIFN0YXJ0RElCU291cmNlKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9JbWFnZVJlbmRlcmVyOjpTdGFydERJQlNvdXJjZSgpIHsNCisgIGlmIChtX3BEZXZpY2UtPlN0YXJ0RElCaXRzKG1fcERJQlNvdXJjZSwgbV9CaXRtYXBBbHBoYSwgbV9GaWxsQXJnYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX0ltYWdlTWF0cml4LCBtX0ZsYWdzLCBtX0RldmljZUhhbmRsZSwgMCwgTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxlbmRUeXBlKSkgew0KKyAgICBpZiAobV9EZXZpY2VIYW5kbGUgIT0gTlVMTCkgew0KKyAgICAgIG1fU3RhdHVzID0gMzsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfRmxvYXRSZWN0IGltYWdlX3JlY3RfZiA9IG1fSW1hZ2VNYXRyaXguR2V0VW5pdFJlY3QoKTsNCisgIEZYX1JFQ1QgaW1hZ2VfcmVjdCA9IGltYWdlX3JlY3RfZi5HZXRPdXR0ZXJSZWN0KCk7DQorICBpbnQgZGVzdF93aWR0aCA9IGltYWdlX3JlY3QuV2lkdGgoKTsNCisgIGludCBkZXN0X2hlaWdodCA9IGltYWdlX3JlY3QuSGVpZ2h0KCk7DQorICBpZiAoKEZYU1lTX2ZhYnMobV9JbWFnZU1hdHJpeC5iKSA+PSAwLjVmIHx8IG1fSW1hZ2VNYXRyaXguYSA9PSAwKSB8fA0KKyAgICAgIChGWFNZU19mYWJzKG1fSW1hZ2VNYXRyaXguYykgPj0gMC41ZiB8fCBtX0ltYWdlTWF0cml4LmQgPT0gMCkpIHsNCisgICAgaWYgKG1fYlByaW50ICYmICEobV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0JMRU5EX01PREUpKSB7DQorICAgICAgbV9SZXN1bHQgPSBGQUxTRTsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZYX0RJQlNvdXJjZSogcERpYiA9IG1fcERJQlNvdXJjZTsNCisgICAgaWYgKG1fcERJQlNvdXJjZS0+SGFzQWxwaGEoKSAmJg0KKyAgICAgICAgIShtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQUxQSEFfSU1BR0UpICYmDQorICAgICAgICAhKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19HRVRfQklUUykpIHsNCisgICAgICBtX3BDbG9uZUNvbnZlcnQgPSBtX3BESUJTb3VyY2UtPkNsb25lQ29udmVydChGWERJQl9SZ2IpOw0KKyAgICAgIGlmICghbV9wQ2xvbmVDb252ZXJ0KSB7DQorICAgICAgICBtX1Jlc3VsdCA9IEZBTFNFOw0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBwRGliID0gbV9wQ2xvbmVDb252ZXJ0Ow0KKyAgICB9DQorICAgIEZYX1JFQ1QgY2xpcF9ib3ggPSBtX3BEZXZpY2UtPkdldENsaXBCb3goKTsNCisgICAgY2xpcF9ib3guSW50ZXJzZWN0KGltYWdlX3JlY3QpOw0KKyAgICBtX1N0YXR1cyA9IDI7DQorICAgIG1fcFRyYW5zZm9ybWVyID0gbmV3IENGWF9JbWFnZVRyYW5zZm9ybWVyOw0KKyAgICBtX3BUcmFuc2Zvcm1lci0+U3RhcnQocERpYiwgJm1fSW1hZ2VNYXRyaXgsIG1fRmxhZ3MsICZjbGlwX2JveCk7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaWYgKG1fSW1hZ2VNYXRyaXguYSA8IDApIHsNCisgICAgZGVzdF93aWR0aCA9IC1kZXN0X3dpZHRoOw0KKyAgfQ0KKyAgaWYgKG1fSW1hZ2VNYXRyaXguZCA+IDApIHsNCisgICAgZGVzdF9oZWlnaHQgPSAtZGVzdF9oZWlnaHQ7DQorICB9DQorICBpbnQgZGVzdF9sZWZ0LCBkZXN0X3RvcDsNCisgIGRlc3RfbGVmdCA9IGRlc3Rfd2lkdGggPiAwID8gaW1hZ2VfcmVjdC5sZWZ0IDogaW1hZ2VfcmVjdC5yaWdodDsNCisgIGRlc3RfdG9wID0gZGVzdF9oZWlnaHQgPiAwID8gaW1hZ2VfcmVjdC50b3AgOiBpbWFnZV9yZWN0LmJvdHRvbTsNCisgIGlmIChtX3BESUJTb3VyY2UtPklzT3BhcXVlSW1hZ2UoKSAmJiBtX0JpdG1hcEFscGhhID09IDI1NSkgew0KKyAgICBpZiAobV9wRGV2aWNlLT5TdHJldGNoRElCaXRzKG1fcERJQlNvdXJjZSwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2hlaWdodCwgbV9GbGFncywgTlVMTCwgbV9CbGVuZFR5cGUpKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICB9DQorICBpZiAobV9wRElCU291cmNlLT5Jc0FscGhhTWFzaygpKSB7DQorICAgIGlmIChtX0JpdG1hcEFscGhhICE9IDI1NSkgew0KKyAgICAgIG1fRmlsbEFyZ2IgPSBGWEFSR0JfTVVMX0FMUEhBKG1fRmlsbEFyZ2IsIG1fQml0bWFwQWxwaGEpOw0KKyAgICB9DQorICAgIGlmIChtX3BEZXZpY2UtPlN0cmV0Y2hCaXRNYXNrKG1fcERJQlNvdXJjZSwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9oZWlnaHQsIG1fRmlsbEFyZ2IsIG1fRmxhZ3MpKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICB9DQorICBpZiAobV9iUHJpbnQgJiYgIShtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQkxFTkRfTU9ERSkpIHsNCisgICAgbV9SZXN1bHQgPSBGQUxTRTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBGWF9SRUNUIGNsaXBfYm94ID0gbV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7DQorICBGWF9SRUNUIGRlc3RfcmVjdCA9IGNsaXBfYm94Ow0KKyAgZGVzdF9yZWN0LkludGVyc2VjdChpbWFnZV9yZWN0KTsNCisgIEZYX1JFQ1QgZGVzdF9jbGlwKA0KKyAgICAgIGRlc3RfcmVjdC5sZWZ0IC0gaW1hZ2VfcmVjdC5sZWZ0LCBkZXN0X3JlY3QudG9wIC0gaW1hZ2VfcmVjdC50b3AsDQorICAgICAgZGVzdF9yZWN0LnJpZ2h0IC0gaW1hZ2VfcmVjdC5sZWZ0LCBkZXN0X3JlY3QuYm90dG9tIC0gaW1hZ2VfcmVjdC50b3ApOw0KKyAgQ0ZYX0RJQml0bWFwKiBwU3RyZXRjaGVkID0NCisgICAgICBtX3BESUJTb3VyY2UtPlN0cmV0Y2hUbyhkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgbV9GbGFncywgJmRlc3RfY2xpcCk7DQorICBpZiAocFN0cmV0Y2hlZCkgew0KKyAgICBDb21wb3NpdGVESUJpdG1hcChwU3RyZXRjaGVkLCBkZXN0X3JlY3QubGVmdCwgZGVzdF9yZWN0LnRvcCwgbV9GaWxsQXJnYiwNCisgICAgICAgICAgICAgICAgICAgICAgbV9CaXRtYXBBbHBoYSwgbV9CbGVuZFR5cGUsIEZBTFNFKTsNCisgICAgZGVsZXRlIHBTdHJldGNoZWQ7DQorICAgIHBTdHJldGNoZWQgPSBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfSW1hZ2VSZW5kZXJlcjo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpIHsNCisgIGlmIChtX1N0YXR1cyA9PSAyKSB7DQorICAgIGlmIChtX3BUcmFuc2Zvcm1lci0+Q29udGludWUocFBhdXNlKSkgew0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IG1fcFRyYW5zZm9ybWVyLT5tX1N0b3Jlci5EZXRhY2goKTsNCisgICAgaWYgKHBCaXRtYXAgPT0gTlVMTCkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAocEJpdG1hcC0+SXNBbHBoYU1hc2soKSkgew0KKyAgICAgIGlmIChtX0JpdG1hcEFscGhhICE9IDI1NSkgew0KKyAgICAgICAgbV9GaWxsQXJnYiA9IEZYQVJHQl9NVUxfQUxQSEEobV9GaWxsQXJnYiwgbV9CaXRtYXBBbHBoYSk7DQorICAgICAgfQ0KKyAgICAgIG1fUmVzdWx0ID0gbV9wRGV2aWNlLT5TZXRCaXRNYXNrKHBCaXRtYXAsIG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdExlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wVHJhbnNmb3JtZXItPm1fUmVzdWx0VG9wLCBtX0ZpbGxBcmdiKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAobV9CaXRtYXBBbHBoYSAhPSAyNTUpIHsNCisgICAgICAgIHBCaXRtYXAtPk11bHRpcGx5QWxwaGEobV9CaXRtYXBBbHBoYSk7DQorICAgICAgfQ0KKyAgICAgIG1fUmVzdWx0ID0gbV9wRGV2aWNlLT5TZXRESUJpdHMocEJpdG1hcCwgbV9wVHJhbnNmb3JtZXItPm1fUmVzdWx0TGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFRyYW5zZm9ybWVyLT5tX1Jlc3VsdFRvcCwgbV9CbGVuZFR5cGUpOw0KKyAgICB9DQorICAgIGRlbGV0ZSBwQml0bWFwOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9IGVsc2UgaWYgKG1fU3RhdHVzID09IDMpIHsNCisgICAgcmV0dXJuIG1fcERldmljZS0+Q29udGludWVESUJpdHMobV9EZXZpY2VIYW5kbGUsIHBQYXVzZSk7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ1hGQV9JbWFnZVJlbmRlcmVyOjpDb21wb3NpdGVESUJpdG1hcChDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgbWFza19hcmdiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfbW9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFRyYW5zcGFyZW5jeSkgew0KKyAgaWYgKHBESUJpdG1hcCA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0JPT0wgYklzb2xhdGVkID0gVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQ7DQorICBGWF9CT09MIGJHcm91cCA9IFRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0dST1VQOw0KKyAgaWYgKGJsZW5kX21vZGUgPT0gRlhESUJfQkxFTkRfTk9STUFMKSB7DQorICAgIGlmICghcERJQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7DQorICAgICAgaWYgKGJpdG1hcF9hbHBoYSA8IDI1NSkgew0KKyAgICAgICAgcERJQml0bWFwLT5NdWx0aXBseUFscGhhKGJpdG1hcF9hbHBoYSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChtX3BEZXZpY2UtPlNldERJQml0cyhwRElCaXRtYXAsIGxlZnQsIHRvcCkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhfRFdPUkQgZmlsbF9hcmdiID0gKG1hc2tfYXJnYik7DQorICAgICAgaWYgKGJpdG1hcF9hbHBoYSA8IDI1NSkgew0KKyAgICAgICAgKCh1aW50OF90KikmZmlsbF9hcmdiKVszXSA9DQorICAgICAgICAgICAgKCh1aW50OF90KikmZmlsbF9hcmdiKVszXSAqIGJpdG1hcF9hbHBoYSAvIDI1NTsNCisgICAgICB9DQorICAgICAgaWYgKG1fcERldmljZS0+U2V0Qml0TWFzayhwRElCaXRtYXAsIGxlZnQsIHRvcCwgZmlsbF9hcmdiKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgRlhfQk9PTCBiQmFja0FscGhhUmVxdWlyZWQgPSBibGVuZF9tb2RlICYmIGJJc29sYXRlZDsNCisgIEZYX0JPT0wgYkdldEJhY2tHcm91bmQgPQ0KKyAgICAgICgobV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0FMUEhBX09VVFBVVCkpIHx8DQorICAgICAgKCEobV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0FMUEhBX09VVFBVVCkgJiYNCisgICAgICAgKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19HRVRfQklUUykgJiYgIWJCYWNrQWxwaGFSZXF1aXJlZCk7DQorICBpZiAoYkdldEJhY2tHcm91bmQpIHsNCisgICAgaWYgKGJJc29sYXRlZCB8fCAhYkdyb3VwKSB7DQorICAgICAgaWYgKHBESUJpdG1hcC0+SXNBbHBoYU1hc2soKSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgICBtX3BEZXZpY2UtPlNldERJQml0cyhwRElCaXRtYXAsIGxlZnQsIHRvcCwgYmxlbmRfbW9kZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhfUkVDVCByZWN0KGxlZnQsIHRvcCwgbGVmdCArIHBESUJpdG1hcC0+R2V0V2lkdGgoKSwNCisgICAgICAgICAgICAgICAgICAgdG9wICsgcERJQml0bWFwLT5HZXRIZWlnaHQoKSk7DQorICAgICAgcmVjdC5JbnRlcnNlY3QobV9wRGV2aWNlLT5HZXRDbGlwQm94KCkpOw0KKyAgICAgIENGWF9ESUJpdG1hcCogcENsb25lID0gTlVMTDsNCisgICAgICBGWF9CT09MIGJDbG9uZSA9IEZBTFNFOw0KKyAgICAgIGlmIChtX3BEZXZpY2UtPkdldEJhY2tEcm9wKCkgJiYgbV9wRGV2aWNlLT5HZXRCaXRtYXAoKSkgew0KKyAgICAgICAgYkNsb25lID0gVFJVRTsNCisgICAgICAgIHBDbG9uZSA9IG1fcERldmljZS0+R2V0QmFja0Ryb3AoKS0+Q2xvbmUoJnJlY3QpOw0KKyAgICAgICAgQ0ZYX0RJQml0bWFwKiBwRm9yZUJpdG1hcCA9IG1fcERldmljZS0+R2V0Qml0bWFwKCk7DQorICAgICAgICBwQ2xvbmUtPkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCBwQ2xvbmUtPkdldFdpZHRoKCksIHBDbG9uZS0+R2V0SGVpZ2h0KCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9yZUJpdG1hcCwgcmVjdC5sZWZ0LCByZWN0LnRvcCk7DQorICAgICAgICBsZWZ0ID0gbGVmdCA+PSAwID8gMCA6IGxlZnQ7DQorICAgICAgICB0b3AgPSB0b3AgPj0gMCA/IDAgOiB0b3A7DQorICAgICAgICBpZiAoIXBESUJpdG1hcC0+SXNBbHBoYU1hc2soKSkNCisgICAgICAgICAgcENsb25lLT5Db21wb3NpdGVCaXRtYXAoMCwgMCwgcENsb25lLT5HZXRXaWR0aCgpLCBwQ2xvbmUtPkdldEhlaWdodCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRElCaXRtYXAsIGxlZnQsIHRvcCwgYmxlbmRfbW9kZSk7DQorICAgICAgICBlbHNlDQorICAgICAgICAgIHBDbG9uZS0+Q29tcG9zaXRlTWFzaygwLCAwLCBwQ2xvbmUtPkdldFdpZHRoKCksIHBDbG9uZS0+R2V0SGVpZ2h0KCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRElCaXRtYXAsIG1hc2tfYXJnYiwgbGVmdCwgdG9wLCBibGVuZF9tb2RlKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcENsb25lID0gcERJQml0bWFwOw0KKyAgICAgIH0NCisgICAgICBpZiAobV9wRGV2aWNlLT5HZXRCYWNrRHJvcCgpKSB7DQorICAgICAgICBtX3BEZXZpY2UtPlNldERJQml0cyhwQ2xvbmUsIHJlY3QubGVmdCwgcmVjdC50b3ApOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAocERJQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7DQorICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIG1fcERldmljZS0+U2V0RElCaXRzKHBESUJpdG1hcCwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgYmxlbmRfbW9kZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChiQ2xvbmUpIHsNCisgICAgICAgIGRlbGV0ZSBwQ2xvbmU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChwRElCaXRtYXAtPkhhc0FscGhhKCkgJiYNCisgICAgICAhKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19BTFBIQV9JTUFHRSkpIHsNCisgICAgQ0ZYX0RJQml0bWFwKiBwQ2xvbmVDb252ZXJ0ID0gcERJQml0bWFwLT5DbG9uZUNvbnZlcnQoRlhESUJfUmdiKTsNCisgICAgaWYgKCFwQ2xvbmVDb252ZXJ0KSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENYRkFfSW1hZ2VSZW5kZXJlciBpbWFnZVJlbmRlcjsNCisgICAgRlhfQk9PTCBiUmV0ID0gaW1hZ2VSZW5kZXIuU3RhcnQobV9wRGV2aWNlLCBwQ2xvbmVDb252ZXJ0LCBtX0ZpbGxBcmdiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0JpdG1hcEFscGhhLCAmbV9JbWFnZU1hdHJpeCwgbV9GbGFncyk7DQorICAgIHdoaWxlIChiUmV0KSB7DQorICAgICAgYlJldCA9IGltYWdlUmVuZGVyLkNvbnRpbnVlKE5VTEwpOw0KKyAgICB9DQorICAgIGRlbGV0ZSBwQ2xvbmVDb252ZXJ0Ow0KKyAgICByZXR1cm47DQorICB9DQorfQ0KK3ZvaWQgWEZBX0RyYXdJbWFnZShDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEltYWdlLA0KKyAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQXNwZWN0LA0KKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlJbWFnZVhEcGksDQorICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUltYWdlWURwaSwNCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpSG9yekFsaWduLA0KKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWZXJ0QWxpZ24pIHsNCisgIGlmIChydEltYWdlLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoIXBESUJpdG1hcCB8fCAhcERJQml0bWFwLT5HZXRCdWZmZXIoKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9GTE9BVCBmV2lkdGggPQ0KKyAgICAgIFhGQV9Vbml0UHgyUHQoKEZYX0ZMT0FUKXBESUJpdG1hcC0+R2V0V2lkdGgoKSwgKEZYX0ZMT0FUKWlJbWFnZVhEcGkpOw0KKyAgRlhfRkxPQVQgZkhlaWdodCA9DQorICAgICAgWEZBX1VuaXRQeDJQdCgoRlhfRkxPQVQpcERJQml0bWFwLT5HZXRIZWlnaHQoKSwgKEZYX0ZMT0FUKWlJbWFnZVlEcGkpOw0KKyAgQ0ZYX1JlY3RGIHJ0Rml0Ow0KKyAgcnRGaXQuU2V0KHJ0SW1hZ2UubGVmdCwgcnRJbWFnZS50b3AsIGZXaWR0aCwgZkhlaWdodCk7DQorICBzd2l0Y2ggKGlBc3BlY3QpIHsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9GaXQ6IHsNCisgICAgICBGWF9GTE9BVCBmMSA9IHJ0SW1hZ2UuaGVpZ2h0IC8gcnRGaXQuaGVpZ2h0Ow0KKyAgICAgIEZYX0ZMT0FUIGYyID0gcnRJbWFnZS53aWR0aCAvIHJ0Rml0LndpZHRoOw0KKyAgICAgIGYxID0gc3RkOjptaW4oZjEsIGYyKTsNCisgICAgICBydEZpdC5oZWlnaHQgPSBydEZpdC5oZWlnaHQgKiBmMTsNCisgICAgICBydEZpdC53aWR0aCA9IHJ0Rml0LndpZHRoICogZjE7DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQWN0dWFsOg0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0hlaWdodDogew0KKyAgICAgIEZYX0ZMT0FUIGYxID0gcnRJbWFnZS5oZWlnaHQgLyBydEZpdC5oZWlnaHQ7DQorICAgICAgcnRGaXQuaGVpZ2h0ID0gcnRJbWFnZS5oZWlnaHQ7DQorICAgICAgcnRGaXQud2lkdGggPSBmMSAqIHJ0Rml0LndpZHRoOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX05vbmU6DQorICAgICAgcnRGaXQuaGVpZ2h0ID0gcnRJbWFnZS5oZWlnaHQ7DQorICAgICAgcnRGaXQud2lkdGggPSBydEltYWdlLndpZHRoOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1dpZHRoOiB7DQorICAgICAgRlhfRkxPQVQgZjEgPSBydEltYWdlLndpZHRoIC8gcnRGaXQud2lkdGg7DQorICAgICAgcnRGaXQud2lkdGggPSBydEltYWdlLndpZHRoOw0KKyAgICAgIHJ0Rml0LmhlaWdodCA9IHJ0Rml0LmhlaWdodCAqIGYxOw0KKyAgICB9IGJyZWFrOw0KKyAgfQ0KKyAgaWYgKGlIb3J6QWxpZ24gPT0gWEZBX0FUVFJJQlVURUVOVU1fQ2VudGVyKSB7DQorICAgIHJ0Rml0LmxlZnQgKz0gKHJ0SW1hZ2Uud2lkdGggLSBydEZpdC53aWR0aCkgLyAyOw0KKyAgfSBlbHNlIGlmIChpSG9yekFsaWduID09IFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0KSB7DQorICAgIHJ0Rml0LmxlZnQgPSBydEltYWdlLnJpZ2h0KCkgLSBydEZpdC53aWR0aDsNCisgIH0NCisgIGlmIChpVmVydEFsaWduID09IFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZSkgew0KKyAgICBydEZpdC50b3AgKz0gKHJ0SW1hZ2UuaGVpZ2h0IC0gcnRGaXQuaGVpZ2h0KSAvIDI7DQorICB9IGVsc2UgaWYgKGlWZXJ0QWxpZ24gPT0gWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tKSB7DQorICAgIHJ0Rml0LnRvcCA9IHJ0SW1hZ2UuYm90dG9tKCkgLSBydEltYWdlLmhlaWdodDsNCisgIH0NCisgIENGWF9SZW5kZXJEZXZpY2UqIHBSZW5kZXJEZXZpY2UgPSBwR1MtPkdldFJlbmRlckRldmljZSgpOw0KKyAgcFJlbmRlckRldmljZS0+U2F2ZVN0YXRlKCk7DQorICBDRlhfUGF0aERhdGEgcGF0aDsNCisgIHBhdGguQXBwZW5kUmVjdChydEltYWdlLmxlZnQsIHJ0SW1hZ2UuYm90dG9tKCksIHJ0SW1hZ2UucmlnaHQoKSwgcnRJbWFnZS50b3ApOw0KKyAgcFJlbmRlckRldmljZS0+U2V0Q2xpcF9QYXRoRmlsbCgmcGF0aCwgcE1hdHJpeCwgRlhGSUxMX1dJTkRJTkcpOw0KKyAgQ0ZYX01hdHJpeCBtdEltYWdlKDEsIDAsIDAsIC0xLCAwLCAxKTsNCisgIG10SW1hZ2UuQ29uY2F0KHJ0Rml0LndpZHRoLCAwLCAwLCBydEZpdC5oZWlnaHQsIHJ0Rml0LmxlZnQsIHJ0Rml0LnRvcCk7DQorICBtdEltYWdlLkNvbmNhdCgqcE1hdHJpeCk7DQorICBDWEZBX0ltYWdlUmVuZGVyZXIgaW1hZ2VSZW5kZXI7DQorICBGWF9CT09MIGJSZXQgPSBpbWFnZVJlbmRlci5TdGFydChwUmVuZGVyRGV2aWNlLCBwRElCaXRtYXAsIDAsIDI1NSwgJm10SW1hZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9JTlRFUlBPTCk7DQorICB3aGlsZSAoYlJldCkgew0KKyAgICBiUmV0ID0gaW1hZ2VSZW5kZXIuQ29udGludWUoTlVMTCk7DQorICB9DQorICBwUmVuZGVyRGV2aWNlLT5SZXN0b3JlU3RhdGUoKTsNCit9DQorY29uc3Qgc3RhdGljIHVpbnQ4X3QgZ19pbnZfYmFzZTY0WzEyOF0gPSB7DQorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsDQorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsDQorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgNjIsICAyNTUsDQorICAgIDI1NSwgMjU1LCA2MywgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgMjU1LCAyNTUsDQorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LA0KKyAgICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsICAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsDQorICAgIDI1LCAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLCAgMzIsICAzMywNCisgICAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywgIDQ4LA0KKyAgICA0OSwgIDUwLCAgNTEsICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwNCit9Ow0KK3N0YXRpYyB1aW50OF90KiBYRkFfUmVtb3ZlQmFzZTY0V2hpdGVzcGFjZShjb25zdCB1aW50OF90KiBwU3RyLCBpbnQzMl90IGlMZW4pIHsNCisgIHVpbnQ4X3QqIHBDUDsNCisgIGludDMyX3QgaSA9IDAsIGogPSAwOw0KKyAgaWYgKGlMZW4gPT0gMCkgew0KKyAgICBpTGVuID0gRlhTWVNfc3RybGVuKChGWF9DSEFSKilwU3RyKTsNCisgIH0NCisgIHBDUCA9IEZYX0FsbG9jKHVpbnQ4X3QsIGlMZW4gKyAxKTsNCisgIGZvciAoOyBpIDwgaUxlbjsgaSsrKSB7DQorICAgIGlmICgocFN0cltpXSAmIDEyOCkgPT0gMCkgew0KKyAgICAgIGlmIChnX2ludl9iYXNlNjRbcFN0cltpXV0gIT0gMHhGRiB8fCBwU3RyW2ldID09ICc9Jykgew0KKyAgICAgICAgcENQW2orK10gPSBwU3RyW2ldOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcENQW2pdID0gJ1wwJzsNCisgIHJldHVybiBwQ1A7DQorfQ0KK3N0YXRpYyBpbnQzMl90IFhGQV9CYXNlNjREZWNvZGUoY29uc3QgRlhfQ0hBUiogcFN0ciwgdWludDhfdCogcE91dEJ1ZmZlcikgew0KKyAgaWYgKHBTdHIgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHVpbnQ4X3QqIHBCdWZmZXIgPQ0KKyAgICAgIFhGQV9SZW1vdmVCYXNlNjRXaGl0ZXNwYWNlKCh1aW50OF90KilwU3RyLCBGWFNZU19zdHJsZW4oKEZYX0NIQVIqKXBTdHIpKTsNCisgIGlmIChwQnVmZmVyID09IE5VTEwpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpbnQzMl90IGlMZW4gPSBGWFNZU19zdHJsZW4oKEZYX0NIQVIqKXBCdWZmZXIpOw0KKyAgaW50MzJfdCBpID0gMCwgaiA9IDA7DQorICBGWF9EV09SRCBkd0xpbWIgPSAwOw0KKyAgZm9yICg7IGkgKyAzIDwgaUxlbjsgaSArPSA0KSB7DQorICAgIGlmIChwQnVmZmVyW2ldID09ICc9JyB8fCBwQnVmZmVyW2kgKyAxXSA9PSAnPScgfHwgcEJ1ZmZlcltpICsgMl0gPT0gJz0nIHx8DQorICAgICAgICBwQnVmZmVyW2kgKyAzXSA9PSAnPScpIHsNCisgICAgICBpZiAocEJ1ZmZlcltpXSA9PSAnPScgfHwgcEJ1ZmZlcltpICsgMV0gPT0gJz0nKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgaWYgKHBCdWZmZXJbaSArIDJdID09ICc9Jykgew0KKyAgICAgICAgZHdMaW1iID0gKChGWF9EV09SRClnX2ludl9iYXNlNjRbcEJ1ZmZlcltpXV0gPDwgNikgfA0KKyAgICAgICAgICAgICAgICAgKChGWF9EV09SRClnX2ludl9iYXNlNjRbcEJ1ZmZlcltpICsgMV1dKTsNCisgICAgICAgIHBPdXRCdWZmZXJbal0gPSAodWludDhfdCkoZHdMaW1iID4+IDQpICYgMHhGRjsNCisgICAgICAgIGorKzsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgZHdMaW1iID0gKChGWF9EV09SRClnX2ludl9iYXNlNjRbcEJ1ZmZlcltpXV0gPDwgMTIpIHwNCisgICAgICAgICAgICAgICAgICgoRlhfRFdPUkQpZ19pbnZfYmFzZTY0W3BCdWZmZXJbaSArIDFdXSA8PCA2KSB8DQorICAgICAgICAgICAgICAgICAoKEZYX0RXT1JEKWdfaW52X2Jhc2U2NFtwQnVmZmVyW2kgKyAyXV0pOw0KKyAgICAgICAgcE91dEJ1ZmZlcltqXSA9ICh1aW50OF90KShkd0xpbWIgPj4gMTApICYgMHhGRjsNCisgICAgICAgIHBPdXRCdWZmZXJbaiArIDFdID0gKHVpbnQ4X3QpKGR3TGltYiA+PiAyKSAmIDB4RkY7DQorICAgICAgICBqICs9IDI7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGR3TGltYiA9ICgoRlhfRFdPUkQpZ19pbnZfYmFzZTY0W3BCdWZmZXJbaV1dIDw8IDE4KSB8DQorICAgICAgICAgICAgICAgKChGWF9EV09SRClnX2ludl9iYXNlNjRbcEJ1ZmZlcltpICsgMV1dIDw8IDEyKSB8DQorICAgICAgICAgICAgICAgKChGWF9EV09SRClnX2ludl9iYXNlNjRbcEJ1ZmZlcltpICsgMl1dIDw8IDYpIHwNCisgICAgICAgICAgICAgICAoKEZYX0RXT1JEKWdfaW52X2Jhc2U2NFtwQnVmZmVyW2kgKyAzXV0pOw0KKyAgICAgIHBPdXRCdWZmZXJbal0gPSAodWludDhfdCkoZHdMaW1iID4+IDE2KSAmIDB4ZmY7DQorICAgICAgcE91dEJ1ZmZlcltqICsgMV0gPSAodWludDhfdCkoZHdMaW1iID4+IDgpICYgMHhmZjsNCisgICAgICBwT3V0QnVmZmVyW2ogKyAyXSA9ICh1aW50OF90KShkd0xpbWIpJjB4ZmY7DQorICAgICAgaiArPSAzOw0KKyAgICB9DQorICB9DQorICBGWF9GcmVlKHBCdWZmZXIpOw0KKyAgcmV0dXJuIGo7DQorfQ0KK3N0YXRpYyBGWF9DSEFSIGdfYmFzZTY0X2NoYXJzW10gPQ0KKyAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7DQorRlhfQ0hBUiogWEZBX0Jhc2U2NEVuY29kZShjb25zdCB1aW50OF90KiBidWYsIGludDMyX3QgYnVmX2xlbikgew0KKyAgRlhfQ0hBUiogb3V0ID0gTlVMTDsNCisgIGludCBpLCBqOw0KKyAgRlhfRFdPUkQgbGltYjsNCisgIG91dCA9IEZYX0FsbG9jKEZYX0NIQVIsICgoYnVmX2xlbiAqIDggKyA1KSAvIDYpICsgNSk7DQorICBmb3IgKGkgPSAwLCBqID0gMCwgbGltYiA9IDA7IGkgKyAyIDwgYnVmX2xlbjsgaSArPSAzLCBqICs9IDQpIHsNCisgICAgbGltYiA9ICgoRlhfRFdPUkQpYnVmW2ldIDw8IDE2KSB8ICgoRlhfRFdPUkQpYnVmW2kgKyAxXSA8PCA4KSB8DQorICAgICAgICAgICAoKEZYX0RXT1JEKWJ1ZltpICsgMl0pOw0KKyAgICBvdXRbal0gPSBnX2Jhc2U2NF9jaGFyc1sobGltYiA+PiAxOCkgJiA2M107DQorICAgIG91dFtqICsgMV0gPSBnX2Jhc2U2NF9jaGFyc1sobGltYiA+PiAxMikgJiA2M107DQorICAgIG91dFtqICsgMl0gPSBnX2Jhc2U2NF9jaGFyc1sobGltYiA+PiA2KSAmIDYzXTsNCisgICAgb3V0W2ogKyAzXSA9IGdfYmFzZTY0X2NoYXJzWyhsaW1iKSY2M107DQorICB9DQorICBzd2l0Y2ggKGJ1Zl9sZW4gLSBpKSB7DQorICAgIGNhc2UgMDoNCisgICAgICBicmVhazsNCisgICAgY2FzZSAxOg0KKyAgICAgIGxpbWIgPSAoKEZYX0RXT1JEKWJ1ZltpXSk7DQorICAgICAgb3V0W2orK10gPSBnX2Jhc2U2NF9jaGFyc1sobGltYiA+PiAyKSAmIDYzXTsNCisgICAgICBvdXRbaisrXSA9IGdfYmFzZTY0X2NoYXJzWyhsaW1iIDw8IDQpICYgNjNdOw0KKyAgICAgIG91dFtqKytdID0gJz0nOw0KKyAgICAgIG91dFtqKytdID0gJz0nOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDI6DQorICAgICAgbGltYiA9ICgoRlhfRFdPUkQpYnVmW2ldIDw8IDgpIHwgKChGWF9EV09SRClidWZbaSArIDFdKTsNCisgICAgICBvdXRbaisrXSA9IGdfYmFzZTY0X2NoYXJzWyhsaW1iID4+IDEwKSAmIDYzXTsNCisgICAgICBvdXRbaisrXSA9IGdfYmFzZTY0X2NoYXJzWyhsaW1iID4+IDQpICYgNjNdOw0KKyAgICAgIG91dFtqKytdID0gZ19iYXNlNjRfY2hhcnNbKGxpbWIgPDwgMikgJiA2M107DQorICAgICAgb3V0W2orK10gPSAnPSc7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICBvdXRbal0gPSAnXDAnOw0KKyAgcmV0dXJuIG91dDsNCit9DQorRlhDT0RFQ19JTUFHRV9UWVBFIFhGQV9HZXRJbWFnZVR5cGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1R5cGUpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudFR5cGUod3NUeXBlKTsNCisgIHdzQ29udGVudFR5cGUuTWFrZUxvd2VyKCk7DQorICBpZiAod3NDb250ZW50VHlwZSA9PSBGWF9XU1RSQyhMImltYWdlL2pwZyIpKSB7DQorICAgIHJldHVybiBGWENPREVDX0lNQUdFX0pQRzsNCisgIH0NCisgIGlmICh3c0NvbnRlbnRUeXBlID09IEZYX1dTVFJDKEwiaW1hZ2UvcG5nIikpIHsNCisgICAgcmV0dXJuIEZYQ09ERUNfSU1BR0VfUE5HOw0KKyAgfQ0KKyAgaWYgKHdzQ29udGVudFR5cGUgPT0gRlhfV1NUUkMoTCJpbWFnZS9naWYiKSkgew0KKyAgICByZXR1cm4gRlhDT0RFQ19JTUFHRV9HSUY7DQorICB9DQorICBpZiAod3NDb250ZW50VHlwZSA9PSBGWF9XU1RSQyhMImltYWdlL2JtcCIpKSB7DQorICAgIHJldHVybiBGWENPREVDX0lNQUdFX0JNUDsNCisgIH0NCisgIGlmICh3c0NvbnRlbnRUeXBlID09IEZYX1dTVFJDKEwiaW1hZ2UvdGlmIikpIHsNCisgICAgcmV0dXJuIEZYQ09ERUNfSU1BR0VfVElGOw0KKyAgfQ0KKyAgcmV0dXJuIEZYQ09ERUNfSU1BR0VfVU5LTk9XTjsNCit9DQorQ0ZYX0RJQml0bWFwKiBYRkFfTG9hZEltYWdlRGF0YShDWEZBX0ZGRG9jKiBwRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9JbWFnZSogcEltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYk5hbWVJbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlJbWFnZVhEcGksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSW1hZ2VZRHBpKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c0hyZWY7DQorICBwSW1hZ2UtPkdldEhyZWYod3NIcmVmKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzSW1hZ2U7DQorICBwSW1hZ2UtPkdldENvbnRlbnQod3NJbWFnZSk7DQorICBpZiAod3NIcmVmLklzRW1wdHkoKSAmJiB3c0ltYWdlLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudFR5cGU7DQorICBwSW1hZ2UtPkdldENvbnRlbnRUeXBlKHdzQ29udGVudFR5cGUpOw0KKyAgRlhDT0RFQ19JTUFHRV9UWVBFIHR5cGUgPSBYRkFfR2V0SW1hZ2VUeXBlKHdzQ29udGVudFR5cGUpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnNDb250ZW50Ow0KKyAgdWludDhfdCogcEltYWdlQnVmZmVyID0gTlVMTDsNCisgIElGWF9GaWxlUmVhZCogcEltYWdlRmlsZVJlYWQgPSBOVUxMOw0KKyAgaWYgKHdzSW1hZ2UuR2V0TGVuZ3RoKCkgPiAwKSB7DQorICAgIFhGQV9BVFRSSUJVVEVFTlVNIGlFbmNvZGluZyA9DQorICAgICAgICAoWEZBX0FUVFJJQlVURUVOVU0pcEltYWdlLT5HZXRUcmFuc2ZlckVuY29kaW5nKCk7DQorICAgIGlmIChpRW5jb2RpbmcgPT0gWEZBX0FUVFJJQlVURUVOVU1fQmFzZTY0KSB7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEYXRhID0gd3NJbWFnZS5VVEY4RW5jb2RlKCk7DQorICAgICAgaW50MzJfdCBpTGVuZ3RoID0gYnNEYXRhLkdldExlbmd0aCgpOw0KKyAgICAgIHBJbWFnZUJ1ZmZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIGlMZW5ndGgpOw0KKyAgICAgIGludDMyX3QgaVJlYWQgPSBYRkFfQmFzZTY0RGVjb2RlKChjb25zdCBGWF9DSEFSKilic0RhdGEsIHBJbWFnZUJ1ZmZlcik7DQorICAgICAgaWYgKGlSZWFkID4gMCkgew0KKyAgICAgICAgcEltYWdlRmlsZVJlYWQgPSBGWF9DcmVhdGVNZW1vcnlTdHJlYW0ocEltYWdlQnVmZmVyLCBpUmVhZCk7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGJzQ29udGVudCA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh3c0ltYWdlKTsNCisgICAgICBwSW1hZ2VGaWxlUmVhZCA9IEZYX0NyZWF0ZU1lbW9yeVN0cmVhbSgNCisgICAgICAgICAgKHVpbnQ4X3QqKShjb25zdCB1aW50OF90Kilic0NvbnRlbnQsIGJzQ29udGVudC5HZXRMZW5ndGgoKSk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVVJMID0gd3NIcmVmOw0KKyAgICBpZiAod3NVUkwuTGVmdCg3KSAhPSBGWF9XU1RSQyhMImh0dHA6Ly8iKSAmJg0KKyAgICAgICAgd3NVUkwuTGVmdCg2KSAhPSBGWF9XU1RSQyhMImZ0cDovLyIpKSB7DQorICAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0NCisgICAgICAgICAgcERvYy0+R2V0UERGTmFtZWRJbWFnZSh3c1VSTCwgaUltYWdlWERwaSwgaUltYWdlWURwaSk7DQorICAgICAgaWYgKHBCaXRtYXAgIT0gTlVMTCkgew0KKyAgICAgICAgYk5hbWVJbWFnZSA9IFRSVUU7DQorICAgICAgICByZXR1cm4gcEJpdG1hcDsNCisgICAgICB9DQorICAgIH0NCisgICAgcEltYWdlRmlsZVJlYWQgPSBwRG9jLT5HZXREb2NQcm92aWRlcigpLT5PcGVuTGlua2VkRmlsZShwRG9jLCB3c1VSTCk7DQorICB9DQorICBpZiAoIXBJbWFnZUZpbGVSZWFkKSB7DQorICAgIEZYX0ZyZWUocEltYWdlQnVmZmVyKTsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBiTmFtZUltYWdlID0gRkFMU0U7DQorICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPQ0KKyAgICAgIFhGQV9Mb2FkSW1hZ2VGcm9tQnVmZmVyKHBJbWFnZUZpbGVSZWFkLCB0eXBlLCBpSW1hZ2VYRHBpLCBpSW1hZ2VZRHBpKTsNCisgIEZYX0ZyZWUocEltYWdlQnVmZmVyKTsNCisgIHBJbWFnZUZpbGVSZWFkLT5SZWxlYXNlKCk7DQorICByZXR1cm4gcEJpdG1hcDsNCit9DQorc3RhdGljIEZYRElCX0Zvcm1hdCBYRkFfR2V0RElCRm9ybWF0KEZYQ09ERUNfSU1BR0VfVFlQRSB0eXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb21wb25lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCaXRzUGVyQ29tcG9uZW50KSB7DQorICBGWERJQl9Gb3JtYXQgZGliRm9ybWF0ID0gRlhESUJfQXJnYjsNCisgIHN3aXRjaCAodHlwZSkgew0KKyAgICBjYXNlIEZYQ09ERUNfSU1BR0VfQk1QOg0KKyAgICBjYXNlIEZYQ09ERUNfSU1BR0VfSlBHOg0KKyAgICBjYXNlIEZYQ09ERUNfSU1BR0VfVElGOiB7DQorICAgICAgZGliRm9ybWF0ID0gRlhESUJfUmdiMzI7DQorICAgICAgaW50MzJfdCBicHAgPSBpQ29tcG9uZW50cyAqIGlCaXRzUGVyQ29tcG9uZW50Ow0KKyAgICAgIGlmIChicHAgPD0gMjQpIHsNCisgICAgICAgIGRpYkZvcm1hdCA9IEZYRElCX1JnYjsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9QTkc6DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gZGliRm9ybWF0Ow0KK30NCitDRlhfRElCaXRtYXAqIFhGQV9Mb2FkSW1hZ2VGcm9tQnVmZmVyKElGWF9GaWxlUmVhZCogcEltYWdlRmlsZVJlYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWENPREVDX0lNQUdFX1RZUEUgdHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlJbWFnZVhEcGksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSW1hZ2VZRHBpKSB7DQorICBDRlhfR0VNb2R1bGUqIHBHZU1vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCk7DQorICBpZiAoIXBHZU1vZHVsZSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENDb2RlY19Nb2R1bGVNZ3IqIHBDb2RlY01nciA9IHBHZU1vZHVsZS0+R2V0Q29kZWNNb2R1bGUoKTsNCisgIGlmICghcENvZGVjTWdyKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0ZYX0RJQkF0dHJpYnV0ZSBkaWJBdHRyOw0KKyAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gTlVMTDsNCisgIElDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIqIHBQcm9ncmVzc2l2ZURlY29kZXIgPQ0KKyAgICAgIHBDb2RlY01nci0+Q3JlYXRlUHJvZ3Jlc3NpdmVEZWNvZGVyKCk7DQorICBwUHJvZ3Jlc3NpdmVEZWNvZGVyLT5Mb2FkSW1hZ2VJbmZvKHBJbWFnZUZpbGVSZWFkLCB0eXBlLCAmZGliQXR0cik7DQorICBzd2l0Y2ggKGRpYkF0dHIubV93RFBJVW5pdCkgew0KKyAgICBjYXNlIEZYQ09ERUNfUkVTVU5JVF9DRU5USU1FVEVSOg0KKyAgICAgIGRpYkF0dHIubV9uWERQSSA9IChpbnQzMl90KShkaWJBdHRyLm1fblhEUEkgKiAyLjU0Zik7DQorICAgICAgZGliQXR0ci5tX25ZRFBJID0gKGludDMyX3QpKGRpYkF0dHIubV9uWURQSSAqIDIuNTRmKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWENPREVDX1JFU1VOSVRfTUVURVI6DQorICAgICAgZGliQXR0ci5tX25YRFBJID0gKGludDMyX3QpKGRpYkF0dHIubV9uWERQSSAvIChGWF9GTE9BVCkxMDAgKiAyLjU0Zik7DQorICAgICAgZGliQXR0ci5tX25ZRFBJID0gKGludDMyX3QpKGRpYkF0dHIubV9uWURQSSAvIChGWF9GTE9BVCkxMDAgKiAyLjU0Zik7DQorICAgICAgYnJlYWs7DQorICAgICAgOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgaUltYWdlWERwaSA9IGRpYkF0dHIubV9uWERQSSA+IDEgPyBkaWJBdHRyLm1fblhEUEkgOiAoOTYpOw0KKyAgaUltYWdlWURwaSA9IGRpYkF0dHIubV9uWURQSSA+IDEgPyBkaWJBdHRyLm1fbllEUEkgOiAoOTYpOw0KKyAgaWYgKHBQcm9ncmVzc2l2ZURlY29kZXItPkdldFdpZHRoKCkgPiAwICYmDQorICAgICAgcFByb2dyZXNzaXZlRGVjb2Rlci0+R2V0SGVpZ2h0KCkgPiAwKSB7DQorICAgIHR5cGUgPSBwUHJvZ3Jlc3NpdmVEZWNvZGVyLT5HZXRUeXBlKCk7DQorICAgIGludDMyX3QgaUNvbXBvbmVudHMgPSBwUHJvZ3Jlc3NpdmVEZWNvZGVyLT5HZXROdW1Db21wb25lbnRzKCk7DQorICAgIGludDMyX3QgaUJwYyA9IHBQcm9ncmVzc2l2ZURlY29kZXItPkdldEJQQygpOw0KKyAgICBGWERJQl9Gb3JtYXQgZGliRm9ybWF0ID0gWEZBX0dldERJQkZvcm1hdCh0eXBlLCBpQ29tcG9uZW50cywgaUJwYyk7DQorICAgIHBCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwKCk7DQorICAgIHBCaXRtYXAtPkNyZWF0ZShwUHJvZ3Jlc3NpdmVEZWNvZGVyLT5HZXRXaWR0aCgpLA0KKyAgICAgICAgICAgICAgICAgICAgcFByb2dyZXNzaXZlRGVjb2Rlci0+R2V0SGVpZ2h0KCksIGRpYkZvcm1hdCk7DQorICAgIHBCaXRtYXAtPkNsZWFyKDB4ZmZmZmZmZmYpOw0KKyAgICBpbnQzMl90IG5GcmFtZXM7DQorICAgIGlmICgocFByb2dyZXNzaXZlRGVjb2Rlci0+R2V0RnJhbWVzKG5GcmFtZXMpID09DQorICAgICAgICAgRlhDT0RFQ19TVEFUVVNfREVDT0RFX1JFQURZKSAmJg0KKyAgICAgICAgKG5GcmFtZXMgPiAwKSkgew0KKyAgICAgIHBQcm9ncmVzc2l2ZURlY29kZXItPlN0YXJ0RGVjb2RlKHBCaXRtYXAsIDAsIDAsIHBCaXRtYXAtPkdldFdpZHRoKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdG1hcC0+R2V0SGVpZ2h0KCkpOw0KKyAgICAgIHBQcm9ncmVzc2l2ZURlY29kZXItPkNvbnRpbnVlRGVjb2RlKCk7DQorICAgIH0NCisgIH0NCisgIGRlbGV0ZSBwUHJvZ3Jlc3NpdmVEZWNvZGVyOw0KKyAgcmV0dXJuIHBCaXRtYXA7DQorfQ0KK3ZvaWQgWEZBX1JlY3RXaWR0aG91dE1hcmdpbihDRlhfUmVjdEYmIHJ0LCBjb25zdCBDWEZBX01hcmdpbiYgbWcsIEZYX0JPT0wgYlVJKSB7DQorICBpZiAoIW1nKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQsIGZUb3BJbnNldCwgZlJpZ2h0SW5zZXQsIGZCb3R0b21JbnNldDsNCisgIG1nLkdldExlZnRJbnNldChmTGVmdEluc2V0KTsNCisgIG1nLkdldFRvcEluc2V0KGZUb3BJbnNldCk7DQorICBtZy5HZXRSaWdodEluc2V0KGZSaWdodEluc2V0KTsNCisgIG1nLkdldEJvdHRvbUluc2V0KGZCb3R0b21JbnNldCk7DQorICBydC5EZWZsYXRlKGZMZWZ0SW5zZXQsIGZUb3BJbnNldCwgZlJpZ2h0SW5zZXQsIGZCb3R0b21JbnNldCk7DQorfQ0KK0NYRkFfRkZXaWRnZXQqIFhGQV9HZXRXaWRnZXRGcm9tTGF5b3V0SXRlbShDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtKSB7DQorICBYRkFfRUxFTUVOVCBpVHlwZSA9IHBMYXlvdXRJdGVtLT5HZXRGb3JtTm9kZSgpLT5HZXRDbGFzc0lEKCk7DQorICBpZiAoWEZBX0lzQ3JlYXRlV2lkZ2V0KGlUeXBlKSkgew0KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KHBMYXlvdXRJdGVtKTsNCisgIH0NCisgIHJldHVybiBudWxscHRyOw0KK30NCitGWF9CT09MIFhGQV9Jc0NyZWF0ZVdpZGdldChYRkFfRUxFTUVOVCBpVHlwZSkgew0KKyAgcmV0dXJuIGlUeXBlID09IFhGQV9FTEVNRU5UX0ZpZWxkIHx8IGlUeXBlID09IFhGQV9FTEVNRU5UX0RyYXcgfHwNCisgICAgICAgICBpVHlwZSA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtIHx8IGlUeXBlID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cDsNCit9DQorc3RhdGljIHZvaWQgWEZBX0JPWF9HZXRQYXRoX0FyYyhDWEZBX0JveCBib3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnREcmF3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGgmIGZpbGxQYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncykgew0KKyAgRlhfRkxPQVQgYSwgYjsNCisgIGEgPSBydERyYXcud2lkdGggLyAyLjBmOw0KKyAgYiA9IHJ0RHJhdy5oZWlnaHQgLyAyLjBmOw0KKyAgaWYgKGJveC5Jc0NpcmN1bGFyKCkgfHwgKGR3RmxhZ3MgJiBYRkFfRFJBV0JPWF9Gb3JjZVJvdW5kKSAhPSAwKSB7DQorICAgIGEgPSBiID0gc3RkOjptaW4oYSwgYik7DQorICB9DQorICBDRlhfUG9pbnRGIGNlbnRlciA9IHJ0RHJhdy5DZW50ZXIoKTsNCisgIHJ0RHJhdy5sZWZ0ID0gY2VudGVyLnggLSBhOw0KKyAgcnREcmF3LnRvcCA9IGNlbnRlci55IC0gYjsNCisgIHJ0RHJhdy53aWR0aCA9IGEgKyBhOw0KKyAgcnREcmF3LmhlaWdodCA9IGIgKyBiOw0KKyAgRlhfRkxPQVQgc3RhcnRBbmdsZSA9IDAsIHN3ZWVwQW5nbGUgPSAzNjA7DQorICBGWF9CT09MIGJTdGFydCA9IGJveC5HZXRTdGFydEFuZ2xlKHN0YXJ0QW5nbGUpOw0KKyAgRlhfQk9PTCBiRW5kID0gYm94LkdldFN3ZWVwQW5nbGUoc3dlZXBBbmdsZSk7DQorICBpZiAoIWJTdGFydCAmJiAhYkVuZCkgew0KKyAgICBmaWxsUGF0aC5BZGRFbGxpcHNlKHJ0RHJhdyk7DQorICAgIHJldHVybjsNCisgIH0NCisgIHN0YXJ0QW5nbGUgPSAtc3RhcnRBbmdsZSAqIEZYX1BJIC8gMTgwLjBmOw0KKyAgc3dlZXBBbmdsZSA9IC1zd2VlcEFuZ2xlICogRlhfUEkgLyAxODAuMGY7DQorICBmaWxsUGF0aC5BZGRBcmMocnREcmF3LmxlZnQsIHJ0RHJhdy50b3AsIHJ0RHJhdy53aWR0aCwgcnREcmF3LmhlaWdodCwNCisgICAgICAgICAgICAgICAgICBzdGFydEFuZ2xlLCBzd2VlcEFuZ2xlKTsNCit9DQorc3RhdGljIHZvaWQgWEZBX0JPWF9HZXRQYXRoKENYRkFfQm94IGJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hGQV9TdHJva2VBcnJheSYgc3Ryb2tlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aCYgcGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDb3JuZXIpIHsNCisgIEZYU1lTX2Fzc2VydChuSW5kZXggPj0gMCAmJiBuSW5kZXggPCA4KTsNCisgIEZYX0JPT0wgYkludmVydGVkLCBiUm91bmQ7DQorICBGWF9GTE9BVCBmUmFkaXVzMSwgZlJhZGl1czIsIHN4LCBzeSwgdngsIHZ5LCBueCwgbnksIG9mZnNldFksIG9mZnNldFgsDQorICAgICAgb2Zmc2V0RVgsIG9mZnNldEVZOw0KKyAgQ0ZYX1BvaW50RiBjcFN0YXJ0LCBjcCwgY3AxLCBjcDI7DQorICBDRlhfUmVjdEYgcnRSYWRpdXM7DQorICBpbnQzMl90IG4gPSAobkluZGV4ICYgMSkgPyBuSW5kZXggLSAxIDogbkluZGV4Ow0KKyAgQ1hGQV9Db3JuZXIgY29ybmVyMSA9IChDWEZBX05vZGUqKXN0cm9rZXNbbl07DQorICBDWEZBX0Nvcm5lciBjb3JuZXIyID0gKENYRkFfTm9kZSopc3Ryb2tlc1sobiArIDIpICUgOF07DQorICBmUmFkaXVzMSA9IGJDb3JuZXIgPyBjb3JuZXIxLkdldFJhZGl1cygpIDogMDsNCisgIGZSYWRpdXMyID0gYkNvcm5lciA/IGNvcm5lcjIuR2V0UmFkaXVzKCkgOiAwOw0KKyAgYkludmVydGVkID0gY29ybmVyMS5Jc0ludmVydGVkKCk7DQorICBvZmZzZXRZID0gMC4wZjsNCisgIG9mZnNldFggPSAwLjBmOw0KKyAgYlJvdW5kID0gY29ybmVyMS5HZXRKb2luVHlwZSgpID09IFhGQV9BVFRSSUJVVEVFTlVNX1JvdW5kOw0KKyAgRlhfRkxPQVQgaGFsZkFmdGVyID0gMC4wZjsNCisgIEZYX0ZMT0FUIGhhbGZCZWZvcmUgPSAwLjBmOw0KKyAgQ1hGQV9TdHJva2Ugc3Ryb2tlID0gc3Ryb2tlc1tuSW5kZXhdOw0KKyAgaWYgKHN0cm9rZS5Jc0Nvcm5lcigpKSB7DQorICAgIENYRkFfU3Ryb2tlIGVkZ2VCZWZvcmUgPSBzdHJva2VzWyhuSW5kZXggKyAxICogOCAtIDEpICUgOF07DQorICAgIENYRkFfU3Ryb2tlIGVkZ2VBZnRlciA9IHN0cm9rZXNbbkluZGV4ICsgMV07DQorICAgIGlmIChzdHJva2UuSXNJbnZlcnRlZCgpKSB7DQorICAgICAgaWYgKCFzdHJva2UuU2FtZVN0eWxlcyhlZGdlQmVmb3JlKSkgew0KKyAgICAgICAgaGFsZkJlZm9yZSA9IGVkZ2VCZWZvcmUuR2V0VGhpY2tuZXNzKCkgLyAyOw0KKyAgICAgIH0NCisgICAgICBpZiAoIXN0cm9rZS5TYW1lU3R5bGVzKGVkZ2VBZnRlcikpIHsNCisgICAgICAgIGhhbGZBZnRlciA9IGVkZ2VBZnRlci5HZXRUaGlja25lc3MoKSAvIDI7DQorICAgICAgfQ0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX1N0cm9rZSBlZGdlQmVmb3JlID0gc3Ryb2tlc1sobkluZGV4ICsgOCAtIDIpICUgOF07DQorICAgIENYRkFfU3Ryb2tlIGVkZ2VBZnRlciA9IHN0cm9rZXNbKG5JbmRleCArIDIpICUgOF07DQorICAgIGlmICghYlJvdW5kICYmICFiSW52ZXJ0ZWQpIHsNCisgICAgICB7IGhhbGZCZWZvcmUgPSBlZGdlQmVmb3JlLkdldFRoaWNrbmVzcygpIC8gMjsgfQ0KKyAgICAgIHsgaGFsZkFmdGVyID0gZWRnZUFmdGVyLkdldFRoaWNrbmVzcygpIC8gMjsgfQ0KKyAgICB9DQorICB9DQorICBvZmZzZXRFWCA9IDAuMGY7DQorICBvZmZzZXRFWSA9IDAuMGY7DQorICBpZiAoYlJvdW5kKSB7DQorICAgIHN5ID0gRlhfUEkgLyAyOw0KKyAgfQ0KKyAgc3dpdGNoIChuSW5kZXgpIHsNCisgICAgY2FzZSAwOg0KKyAgICBjYXNlIDE6DQorICAgICAgY3AxID0gcnRXaWRnZXQuVG9wTGVmdCgpOw0KKyAgICAgIGNwMiA9IHJ0V2lkZ2V0LlRvcFJpZ2h0KCk7DQorICAgICAgaWYgKG5JbmRleCA9PSAwKSB7DQorICAgICAgICBjcFN0YXJ0LnggPSBjcDEueCAtIGhhbGZCZWZvcmU7DQorICAgICAgICBjcFN0YXJ0LnkgPSBjcDEueSArIGZSYWRpdXMxLCBvZmZzZXRZID0gLWhhbGZBZnRlcjsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgY3BTdGFydC54ID0gY3AxLnggKyBmUmFkaXVzMSAtIGhhbGZCZWZvcmUsIGNwU3RhcnQueSA9IGNwMS55LA0KKyAgICAgICAgb2Zmc2V0RVggPSBoYWxmQWZ0ZXI7DQorICAgICAgfQ0KKyAgICAgIHZ4ID0gMSwgdnkgPSAxOw0KKyAgICAgIG54ID0gLTEsIG55ID0gMDsNCisgICAgICBpZiAoYlJvdW5kKSB7DQorICAgICAgICBzeCA9IGJJbnZlcnRlZCA/IEZYX1BJIC8gMiA6IEZYX1BJOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBzeCA9IDEsIHN5ID0gMDsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMjoNCisgICAgY2FzZSAzOg0KKyAgICAgIGNwMSA9IHJ0V2lkZ2V0LlRvcFJpZ2h0KCk7DQorICAgICAgY3AyID0gcnRXaWRnZXQuQm90dG9tUmlnaHQoKTsNCisgICAgICBpZiAobkluZGV4ID09IDIpIHsNCisgICAgICAgIGNwU3RhcnQueCA9IGNwMS54IC0gZlJhZGl1czEsIGNwU3RhcnQueSA9IGNwMS55IC0gaGFsZkJlZm9yZSwNCisgICAgICAgIG9mZnNldFggPSBoYWxmQWZ0ZXI7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGNwU3RhcnQueCA9IGNwMS54LCBjcFN0YXJ0LnkgPSBjcDEueSArIGZSYWRpdXMxIC0gaGFsZkJlZm9yZSwNCisgICAgICAgIG9mZnNldEVZID0gaGFsZkFmdGVyOw0KKyAgICAgIH0NCisgICAgICB2eCA9IC0xLCB2eSA9IDE7DQorICAgICAgbnggPSAwLCBueSA9IC0xOw0KKyAgICAgIGlmIChiUm91bmQpIHsNCisgICAgICAgIHN4ID0gYkludmVydGVkID8gRlhfUEkgOiBGWF9QSSAqIDMgLyAyOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBzeCA9IDAsIHN5ID0gMTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgNDoNCisgICAgY2FzZSA1Og0KKyAgICAgIGNwMSA9IHJ0V2lkZ2V0LkJvdHRvbVJpZ2h0KCk7DQorICAgICAgY3AyID0gcnRXaWRnZXQuQm90dG9tTGVmdCgpOw0KKyAgICAgIGlmIChuSW5kZXggPT0gNCkgew0KKyAgICAgICAgY3BTdGFydC54ID0gY3AxLnggKyBoYWxmQmVmb3JlLCBjcFN0YXJ0LnkgPSBjcDEueSAtIGZSYWRpdXMxLA0KKyAgICAgICAgb2Zmc2V0WSA9IGhhbGZBZnRlcjsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgY3BTdGFydC54ID0gY3AxLnggLSBmUmFkaXVzMSArIGhhbGZCZWZvcmUsIGNwU3RhcnQueSA9IGNwMS55LA0KKyAgICAgICAgb2Zmc2V0RVggPSAtaGFsZkFmdGVyOw0KKyAgICAgIH0NCisgICAgICB2eCA9IC0xLCB2eSA9IC0xOw0KKyAgICAgIG54ID0gMSwgbnkgPSAwOw0KKyAgICAgIGlmIChiUm91bmQpIHsNCisgICAgICAgIHN4ID0gYkludmVydGVkID8gRlhfUEkgKiAzIC8gMiA6IDA7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHN4ID0gLTEsIHN5ID0gMDsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgNjoNCisgICAgY2FzZSA3Og0KKyAgICAgIGNwMSA9IHJ0V2lkZ2V0LkJvdHRvbUxlZnQoKTsNCisgICAgICBjcDIgPSBydFdpZGdldC5Ub3BMZWZ0KCk7DQorICAgICAgaWYgKG5JbmRleCA9PSA2KSB7DQorICAgICAgICBjcFN0YXJ0LnggPSBjcDEueCArIGZSYWRpdXMxLCBjcFN0YXJ0LnkgPSBjcDEueSArIGhhbGZCZWZvcmUsDQorICAgICAgICBvZmZzZXRYID0gLWhhbGZBZnRlcjsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgY3BTdGFydC54ID0gY3AxLngsIGNwU3RhcnQueSA9IGNwMS55IC0gZlJhZGl1czEgKyBoYWxmQmVmb3JlLA0KKyAgICAgICAgb2Zmc2V0RVkgPSAtaGFsZkFmdGVyOw0KKyAgICAgIH0NCisgICAgICB2eCA9IDEsIHZ5ID0gLTE7DQorICAgICAgbnggPSAwLCBueSA9IDE7DQorICAgICAgaWYgKGJSb3VuZCkgew0KKyAgICAgICAgc3ggPSBiSW52ZXJ0ZWQgPyAwIDogRlhfUEkgLyAyOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBzeCA9IDAsIHN5ID0gLTE7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgaWYgKGJTdGFydCkgew0KKyAgICBwYXRoLk1vdmVUbyhjcFN0YXJ0LngsIGNwU3RhcnQueSk7DQorICB9DQorICBpZiAobkluZGV4ICYgMSkgew0KKyAgICBwYXRoLkxpbmVUbyhjcDIueCArIGZSYWRpdXMyICogbnggKyBvZmZzZXRFWCwNCisgICAgICAgICAgICAgICAgY3AyLnkgKyBmUmFkaXVzMiAqIG55ICsgb2Zmc2V0RVkpOw0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoYlJvdW5kKSB7DQorICAgIGlmIChmUmFkaXVzMSA8IDApIHsNCisgICAgICBzeCAtPSBGWF9QSTsNCisgICAgfQ0KKyAgICBpZiAoYkludmVydGVkKSB7DQorICAgICAgc3kgKj0gLTE7DQorICAgIH0NCisgICAgcnRSYWRpdXMuU2V0KGNwMS54ICsgb2Zmc2V0WCAqIDIsIGNwMS55ICsgb2Zmc2V0WSAqIDIsDQorICAgICAgICAgICAgICAgICBmUmFkaXVzMSAqIDIgKiB2eCAtIG9mZnNldFggKiAyLA0KKyAgICAgICAgICAgICAgICAgZlJhZGl1czEgKiAyICogdnkgLSBvZmZzZXRZICogMik7DQorICAgIHJ0UmFkaXVzLk5vcm1hbGl6ZSgpOw0KKyAgICBpZiAoYkludmVydGVkKSB7DQorICAgICAgcnRSYWRpdXMuT2Zmc2V0KC1mUmFkaXVzMSAqIHZ4LCAtZlJhZGl1czEgKiB2eSk7DQorICAgIH0NCisgICAgcGF0aC5BcmNUbyhydFJhZGl1cy5sZWZ0LCBydFJhZGl1cy50b3AsIHJ0UmFkaXVzLndpZHRoLCBydFJhZGl1cy5oZWlnaHQsIHN4LA0KKyAgICAgICAgICAgICAgIHN5KTsNCisgIH0gZWxzZSB7DQorICAgIGlmIChiSW52ZXJ0ZWQpIHsNCisgICAgICBjcC54ID0gY3AxLnggKyBmUmFkaXVzMSAqIHZ4LCBjcC55ID0gY3AxLnkgKyBmUmFkaXVzMSAqIHZ5Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGNwID0gY3AxOw0KKyAgICB9DQorICAgIHBhdGguTGluZVRvKGNwLngsIGNwLnkpOw0KKyAgICBwYXRoLkxpbmVUbyhjcDEueCArIGZSYWRpdXMxICogc3ggKyBvZmZzZXRYLA0KKyAgICAgICAgICAgICAgICBjcDEueSArIGZSYWRpdXMxICogc3kgKyBvZmZzZXRZKTsNCisgIH0NCit9DQorc3RhdGljIHZvaWQgWEZBX0JPWF9HZXRGaWxsUGF0aChDWEZBX0JveCBib3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWEZBX1N0cm9rZUFycmF5JiBzdHJva2VzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGgmIGZpbGxQYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV09SRCBkd0ZsYWdzKSB7DQorICBpZiAoYm94LklzQXJjKCkgfHwgKGR3RmxhZ3MgJiBYRkFfRFJBV0JPWF9Gb3JjZVJvdW5kKSAhPSAwKSB7DQorICAgIENYRkFfRWRnZSBlZGdlID0gYm94LkdldEVkZ2UoMCk7DQorICAgIEZYX0ZMT0FUIGZUaGlja25lc3MgPSBlZGdlLkdldFRoaWNrbmVzcygpOw0KKyAgICBpZiAoZlRoaWNrbmVzcyA8IDApIHsNCisgICAgICBmVGhpY2tuZXNzID0gMDsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmSGFsZiA9IGZUaGlja25lc3MgLyAyOw0KKyAgICBpbnQzMl90IGlIYW5kID0gYm94LkdldEhhbmQoKTsNCisgICAgaWYgKGlIYW5kID09IFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQpIHsNCisgICAgICBydFdpZGdldC5JbmZsYXRlKGZIYWxmLCBmSGFsZik7DQorICAgIH0gZWxzZSBpZiAoaUhhbmQgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQpIHsNCisgICAgICBydFdpZGdldC5EZWZsYXRlKGZIYWxmLCBmSGFsZik7DQorICAgIH0NCisgICAgWEZBX0JPWF9HZXRQYXRoX0FyYyhib3gsIHJ0V2lkZ2V0LCBmaWxsUGF0aCwgZHdGbGFncyk7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0JPT0wgYlNhbWVTdHlsZXMgPSBUUlVFOw0KKyAgaW50MzJfdCBpOw0KKyAgQ1hGQV9TdHJva2Ugc3Ryb2tlMSA9IHN0cm9rZXNbMF07DQorICBmb3IgKGkgPSAxOyBpIDwgODsgaSsrKSB7DQorICAgIENYRkFfU3Ryb2tlIHN0cm9rZTIgPSBzdHJva2VzW2ldOw0KKyAgICBpZiAoIXN0cm9rZTEuU2FtZVN0eWxlcyhzdHJva2UyKSkgew0KKyAgICAgIGJTYW1lU3R5bGVzID0gRkFMU0U7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgc3Ryb2tlMSA9IHN0cm9rZTI7DQorICB9DQorICBpZiAoYlNhbWVTdHlsZXMpIHsNCisgICAgc3Ryb2tlMSA9IHN0cm9rZXNbMF07DQorICAgIGZvciAoaSA9IDI7IGkgPCA4OyBpICs9IDIpIHsNCisgICAgICBDWEZBX1N0cm9rZSBzdHJva2UyID0gc3Ryb2tlc1tpXTsNCisgICAgICBpZiAoIXN0cm9rZTEuU2FtZVN0eWxlcyhzdHJva2UyLCBYRkFfU1RST0tFX1NBTUVTVFlMRV9Ob1ByZXNlbmNlIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1NUUk9LRV9TQU1FU1RZTEVfQ29ybmVyKSkgew0KKyAgICAgICAgYlNhbWVTdHlsZXMgPSBGQUxTRTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBzdHJva2UxID0gc3Ryb2tlMjsNCisgICAgfQ0KKyAgICBpZiAoYlNhbWVTdHlsZXMpIHsNCisgICAgICBzdHJva2UxID0gc3Ryb2tlc1swXTsNCisgICAgICBpZiAoc3Ryb2tlMS5Jc0ludmVydGVkKCkpIHsNCisgICAgICAgIGJTYW1lU3R5bGVzID0gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGlmIChzdHJva2UxLkdldEpvaW5UeXBlKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fU3F1YXJlKSB7DQorICAgICAgICBiU2FtZVN0eWxlcyA9IEZBTFNFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGJTYW1lU3R5bGVzKSB7DQorICAgIGZpbGxQYXRoLkFkZFJlY3RhbmdsZShydFdpZGdldC5sZWZ0LCBydFdpZGdldC50b3AsIHJ0V2lkZ2V0LndpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnRXaWRnZXQuaGVpZ2h0KTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfQk9PTCBiSW52ZXJ0ZWQsIGJSb3VuZDsNCisgIEZYX0ZMT0FUIGZSYWRpdXMxLCBmUmFkaXVzMiwgc3gsIHN5LCB2eCwgdnksIG54LCBueTsNCisgIENGWF9Qb2ludEYgY3AsIGNwMSwgY3AyOw0KKyAgQ0ZYX1JlY3RGIHJ0UmFkaXVzOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgODsgaSArPSAyKSB7DQorICAgIENYRkFfQ29ybmVyIGNvcm5lcjEgPSAoQ1hGQV9Ob2RlKilzdHJva2VzW2ldOw0KKyAgICBDWEZBX0Nvcm5lciBjb3JuZXIyID0gKENYRkFfTm9kZSopc3Ryb2tlc1soaSArIDIpICUgOF07DQorICAgIGZSYWRpdXMxID0gY29ybmVyMS5HZXRSYWRpdXMoKTsNCisgICAgZlJhZGl1czIgPSBjb3JuZXIyLkdldFJhZGl1cygpOw0KKyAgICBiSW52ZXJ0ZWQgPSBjb3JuZXIxLklzSW52ZXJ0ZWQoKTsNCisgICAgYlJvdW5kID0gY29ybmVyMS5HZXRKb2luVHlwZSgpID09IFhGQV9BVFRSSUJVVEVFTlVNX1JvdW5kOw0KKyAgICBpZiAoYlJvdW5kKSB7DQorICAgICAgc3kgPSBGWF9QSSAvIDI7DQorICAgIH0NCisgICAgc3dpdGNoIChpKSB7DQorICAgICAgY2FzZSAwOg0KKyAgICAgICAgY3AxID0gcnRXaWRnZXQuVG9wTGVmdCgpOw0KKyAgICAgICAgY3AyID0gcnRXaWRnZXQuVG9wUmlnaHQoKTsNCisgICAgICAgIHZ4ID0gMSwgdnkgPSAxOw0KKyAgICAgICAgbnggPSAtMSwgbnkgPSAwOw0KKyAgICAgICAgaWYgKGJSb3VuZCkgew0KKyAgICAgICAgICBzeCA9IGJJbnZlcnRlZCA/IEZYX1BJIC8gMiA6IEZYX1BJOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgc3ggPSAxLCBzeSA9IDA7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIDI6DQorICAgICAgICBjcDEgPSBydFdpZGdldC5Ub3BSaWdodCgpOw0KKyAgICAgICAgY3AyID0gcnRXaWRnZXQuQm90dG9tUmlnaHQoKTsNCisgICAgICAgIHZ4ID0gLTEsIHZ5ID0gMTsNCisgICAgICAgIG54ID0gMCwgbnkgPSAtMTsNCisgICAgICAgIGlmIChiUm91bmQpIHsNCisgICAgICAgICAgc3ggPSBiSW52ZXJ0ZWQgPyBGWF9QSSA6IEZYX1BJICogMyAvIDI7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBzeCA9IDAsIHN5ID0gMTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgNDoNCisgICAgICAgIGNwMSA9IHJ0V2lkZ2V0LkJvdHRvbVJpZ2h0KCk7DQorICAgICAgICBjcDIgPSBydFdpZGdldC5Cb3R0b21MZWZ0KCk7DQorICAgICAgICB2eCA9IC0xLCB2eSA9IC0xOw0KKyAgICAgICAgbnggPSAxLCBueSA9IDA7DQorICAgICAgICBpZiAoYlJvdW5kKSB7DQorICAgICAgICAgIHN4ID0gYkludmVydGVkID8gRlhfUEkgKiAzIC8gMiA6IDA7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBzeCA9IC0xLCBzeSA9IDA7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIDY6DQorICAgICAgICBjcDEgPSBydFdpZGdldC5Cb3R0b21MZWZ0KCk7DQorICAgICAgICBjcDIgPSBydFdpZGdldC5Ub3BMZWZ0KCk7DQorICAgICAgICB2eCA9IDEsIHZ5ID0gLTE7DQorICAgICAgICBueCA9IDAsIG55ID0gMTsNCisgICAgICAgIGlmIChiUm91bmQpIHsNCisgICAgICAgICAgc3ggPSBiSW52ZXJ0ZWQgPyAwIDogRlhfUEkgLyAyOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgc3ggPSAwLCBzeSA9IC0xOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKGkgPT0gMCkgew0KKyAgICAgIGZpbGxQYXRoLk1vdmVUbyhjcDEueCwgY3AxLnkgKyBmUmFkaXVzMSk7DQorICAgIH0NCisgICAgaWYgKGJSb3VuZCkgew0KKyAgICAgIGlmIChmUmFkaXVzMSA8IDApIHsNCisgICAgICAgIHN4IC09IEZYX1BJOw0KKyAgICAgIH0NCisgICAgICBpZiAoYkludmVydGVkKSB7DQorICAgICAgICBzeSAqPSAtMTsNCisgICAgICB9DQorICAgICAgcnRSYWRpdXMuU2V0KGNwMS54LCBjcDEueSwgZlJhZGl1czEgKiAyICogdngsIGZSYWRpdXMxICogMiAqIHZ5KTsNCisgICAgICBydFJhZGl1cy5Ob3JtYWxpemUoKTsNCisgICAgICBpZiAoYkludmVydGVkKSB7DQorICAgICAgICBydFJhZGl1cy5PZmZzZXQoLWZSYWRpdXMxICogdngsIC1mUmFkaXVzMSAqIHZ5KTsNCisgICAgICB9DQorICAgICAgZmlsbFBhdGguQXJjVG8ocnRSYWRpdXMubGVmdCwgcnRSYWRpdXMudG9wLCBydFJhZGl1cy53aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICBydFJhZGl1cy5oZWlnaHQsIHN4LCBzeSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKGJJbnZlcnRlZCkgew0KKyAgICAgICAgY3AueCA9IGNwMS54ICsgZlJhZGl1czEgKiB2eCwgY3AueSA9IGNwMS55ICsgZlJhZGl1czEgKiB2eTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgY3AgPSBjcDE7DQorICAgICAgfQ0KKyAgICAgIGZpbGxQYXRoLkxpbmVUbyhjcC54LCBjcC55KTsNCisgICAgICBmaWxsUGF0aC5MaW5lVG8oY3AxLnggKyBmUmFkaXVzMSAqIHN4LCBjcDEueSArIGZSYWRpdXMxICogc3kpOw0KKyAgICB9DQorICAgIGZpbGxQYXRoLkxpbmVUbyhjcDIueCArIGZSYWRpdXMyICogbngsIGNwMi55ICsgZlJhZGl1czIgKiBueSk7DQorICB9DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9CT1hfRmlsbF9SYWRpYWwoQ1hGQV9Cb3ggYm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aCYgZmlsbFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnRGaWxsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgQ1hGQV9GaWxsIGZpbGwgPSBib3guR2V0RmlsbCgpOw0KKyAgRlhfQVJHQiBjclN0YXJ0LCBjckVuZDsNCisgIGNyU3RhcnQgPSBmaWxsLkdldENvbG9yKCk7DQorICBpbnQzMl90IGlUeXBlID0gZmlsbC5HZXRSYWRpYWwoY3JFbmQpOw0KKyAgQ0ZYX1NoYWRpbmcgc2hhZGluZzsNCisgIGlmIChpVHlwZSAhPSBYRkFfQVRUUklCVVRFRU5VTV9Ub0VkZ2UpIHsNCisgICAgRlhfQVJHQiB0ZW1wID0gY3JFbmQ7DQorICAgIGNyRW5kID0gY3JTdGFydDsNCisgICAgY3JTdGFydCA9IHRlbXA7DQorICB9DQorICBzaGFkaW5nLkNyZWF0ZVJhZGlhbChydEZpbGwuQ2VudGVyKCksIHJ0RmlsbC5DZW50ZXIoKSwgMCwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3NxcnQocnRGaWxsLldpZHRoKCkgKiBydEZpbGwuV2lkdGgoKSArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0RmlsbC5IZWlnaHQoKSAqIHJ0RmlsbC5IZWlnaHQoKSkgLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsDQorICAgICAgICAgICAgICAgICAgICAgICBUUlVFLCBUUlVFLCBjclN0YXJ0LCBjckVuZCk7DQorICBDRlhfQ29sb3IgY3IoJnNoYWRpbmcpOw0KKyAgcEdTLT5TZXRGaWxsQ29sb3IoJmNyKTsNCisgIHBHUy0+RmlsbFBhdGgoJmZpbGxQYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9CT1hfRmlsbF9QYXR0ZXJuKENYRkFfQm94IGJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aCYgZmlsbFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0RmlsbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBDWEZBX0ZpbGwgZmlsbCA9IGJveC5HZXRGaWxsKCk7DQorICBGWF9BUkdCIGNyU3RhcnQsIGNyRW5kOw0KKyAgY3JTdGFydCA9IGZpbGwuR2V0Q29sb3IoKTsNCisgIGludDMyX3QgaVR5cGUgPSBmaWxsLkdldFBhdHRlcm4oY3JFbmQpOw0KKyAgaW50MzJfdCBpSGF0Y2ggPSBGWF9IQVRDSFNUWUxFX0Nyb3NzOw0KKyAgc3dpdGNoIChpVHlwZSkgew0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0Nyb3NzRGlhZ29uYWw6DQorICAgICAgaUhhdGNoID0gRlhfSEFUQ0hTVFlMRV9EaWFnb25hbENyb3NzOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0RpYWdvbmFsTGVmdDoNCisgICAgICBpSGF0Y2ggPSBGWF9IQVRDSFNUWUxFX0ZvcndhcmREaWFnb25hbDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9EaWFnb25hbFJpZ2h0Og0KKyAgICAgIGlIYXRjaCA9IEZYX0hBVENIU1RZTEVfQmFja3dhcmREaWFnb25hbDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ib3Jpem9udGFsOg0KKyAgICAgIGlIYXRjaCA9IEZYX0hBVENIU1RZTEVfSG9yaXpvbnRhbDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9WZXJ0aWNhbDoNCisgICAgICBpSGF0Y2ggPSBGWF9IQVRDSFNUWUxFX1ZlcnRpY2FsOw0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgQ0ZYX1BhdHRlcm4gcGF0dGVybjsNCisgIHBhdHRlcm4uQ3JlYXRlKGlIYXRjaCwgY3JFbmQsIGNyU3RhcnQpOw0KKyAgQ0ZYX0NvbG9yIGNyKCZwYXR0ZXJuKTsNCisgIHBHUy0+U2V0RmlsbENvbG9yKCZjcik7DQorICBwR1MtPkZpbGxQYXRoKCZmaWxsUGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfQk9YX0ZpbGxfTGluZWFyKENYRkFfQm94IGJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGgmIGZpbGxQYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0RmlsbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENYRkFfRmlsbCBmaWxsID0gYm94LkdldEZpbGwoKTsNCisgIEZYX0FSR0IgY3JTdGFydCwgY3JFbmQ7DQorICBjclN0YXJ0ID0gZmlsbC5HZXRDb2xvcigpOw0KKyAgaW50MzJfdCBpVHlwZSA9IGZpbGwuR2V0TGluZWFyKGNyRW5kKTsNCisgIENGWF9Qb2ludEYgcHRTdGFydCwgcHRFbmQ7DQorICBzd2l0Y2ggKGlUeXBlKSB7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9SaWdodDoNCisgICAgICBwdFN0YXJ0LlNldChydEZpbGwubGVmdCwgcnRGaWxsLnRvcCk7DQorICAgICAgcHRFbmQuU2V0KHJ0RmlsbC5yaWdodCgpLCBydEZpbGwudG9wKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub0JvdHRvbToNCisgICAgICBwdFN0YXJ0LlNldChydEZpbGwubGVmdCwgcnRGaWxsLnRvcCk7DQorICAgICAgcHRFbmQuU2V0KHJ0RmlsbC5sZWZ0LCBydEZpbGwuYm90dG9tKCkpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvTGVmdDoNCisgICAgICBwdFN0YXJ0LlNldChydEZpbGwucmlnaHQoKSwgcnRGaWxsLnRvcCk7DQorICAgICAgcHRFbmQuU2V0KHJ0RmlsbC5sZWZ0LCBydEZpbGwudG9wKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub1RvcDoNCisgICAgICBwdFN0YXJ0LlNldChydEZpbGwubGVmdCwgcnRGaWxsLmJvdHRvbSgpKTsNCisgICAgICBwdEVuZC5TZXQocnRGaWxsLmxlZnQsIHJ0RmlsbC50b3ApOw0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgQ0ZYX1NoYWRpbmcgc2hhZGluZzsNCisgIHNoYWRpbmcuQ3JlYXRlQXhpYWwocHRTdGFydCwgcHRFbmQsIEZBTFNFLCBGQUxTRSwgY3JTdGFydCwgY3JFbmQpOw0KKyAgQ0ZYX0NvbG9yIGNyKCZzaGFkaW5nKTsNCisgIHBHUy0+U2V0RmlsbENvbG9yKCZjcik7DQorICBwR1MtPkZpbGxQYXRoKCZmaWxsUGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfQk9YX0ZpbGwoQ1hGQV9Cb3ggYm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWEZBX1N0cm9rZUFycmF5JiBzdHJva2VzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncykgew0KKyAgQ1hGQV9GaWxsIGZpbGwgPSBib3guR2V0RmlsbCgpOw0KKyAgaWYgKCFmaWxsLklzRXhpc3RJblhNTCgpIHx8IGZpbGwuR2V0UHJlc2VuY2UoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBHUy0+U2F2ZUdyYXBoU3RhdGUoKTsNCisgIENGWF9QYXRoIGZpbGxQYXRoOw0KKyAgZmlsbFBhdGguQ3JlYXRlKCk7DQorICBYRkFfQk9YX0dldEZpbGxQYXRoKGJveCwgc3Ryb2tlcywgcnRXaWRnZXQsIGZpbGxQYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAoZHdGbGFncyAmIFhGQV9EUkFXQk9YX0ZvcmNlUm91bmQpICE9IDApOw0KKyAgZmlsbFBhdGguQ2xvc2UoKTsNCisgIGludDMyX3QgZVR5cGUgPSBmaWxsLkdldEZpbGxUeXBlKCk7DQorICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfUmFkaWFsOg0KKyAgICAgIFhGQV9CT1hfRmlsbF9SYWRpYWwoYm94LCBwR1MsIGZpbGxQYXRoLCBydFdpZGdldCwgcE1hdHJpeCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfUGF0dGVybjoNCisgICAgICBYRkFfQk9YX0ZpbGxfUGF0dGVybihib3gsIHBHUywgZmlsbFBhdGgsIHJ0V2lkZ2V0LCBwTWF0cml4KTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9MaW5lYXI6DQorICAgICAgWEZBX0JPWF9GaWxsX0xpbmVhcihib3gsIHBHUywgZmlsbFBhdGgsIHJ0V2lkZ2V0LCBwTWF0cml4KTsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDogew0KKyAgICAgIEZYX0FSR0IgY3I7DQorICAgICAgaWYgKGVUeXBlID09IFhGQV9FTEVNRU5UX1N0aXBwbGUpIHsNCisgICAgICAgIGludDMyX3QgaVJhdGUgPSBmaWxsLkdldFN0aXBwbGUoY3IpOw0KKyAgICAgICAgaWYgKGlSYXRlID09IDApIHsNCisgICAgICAgICAgaVJhdGUgPSAxMDA7DQorICAgICAgICB9DQorICAgICAgICBpbnQzMl90IGEgPSAwOw0KKyAgICAgICAgRlhfQ09MT1JSRUYgcmdiOw0KKyAgICAgICAgQXJnYkRlY29kZShjciwgYSwgcmdiKTsNCisgICAgICAgIGNyID0gQXJnYkVuY29kZShpUmF0ZSAqIGEgLyAxMDAsIHJnYik7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGNyID0gZmlsbC5HZXRDb2xvcigpOw0KKyAgICAgIH0NCisgICAgICBDRlhfQ29sb3IgZmlsbENvbG9yKGNyKTsNCisgICAgICBwR1MtPlNldEZpbGxDb2xvcigmZmlsbENvbG9yKTsNCisgICAgICBwR1MtPkZpbGxQYXRoKCZmaWxsUGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOw0KKyAgICB9IGJyZWFrOw0KKyAgfQ0KKyAgcEdTLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfQk9YX1N0cm9rZVBhdGgoQ1hGQV9TdHJva2Ugc3Ryb2tlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aCogcFBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBpZiAoIXN0cm9rZS5Jc0V4aXN0SW5YTUwoKSB8fCAhc3Ryb2tlLklzVmlzaWJsZSgpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0ZMT0FUIGZUaGlja25lc3MgPSBzdHJva2UuR2V0VGhpY2tuZXNzKCk7DQorICBpZiAoZlRoaWNrbmVzcyA8IDAuMDAxZikgew0KKyAgICByZXR1cm47DQorICB9DQorICBwR1MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBpZiAoc3Ryb2tlLklzQ29ybmVyKCkgJiYgZlRoaWNrbmVzcyA+IDIgKiBzdHJva2UuR2V0UmFkaXVzKCkpIHsNCisgICAgZlRoaWNrbmVzcyA9IDIgKiBzdHJva2UuR2V0UmFkaXVzKCk7DQorICB9DQorICBwR1MtPlNldExpbmVXaWR0aChmVGhpY2tuZXNzLCBUUlVFKTsNCisgIHBHUy0+U2V0TGluZUNhcChDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBCdXR0KTsNCisgIFhGQV9TdHJva2VUeXBlU2V0TGluZURhc2gocEdTLCBzdHJva2UuR2V0U3Ryb2tlVHlwZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTV9CdXR0KTsNCisgIENGWF9Db2xvciBmeENvbG9yKHN0cm9rZS5HZXRDb2xvcigpKTsNCisgIHBHUy0+U2V0U3Ryb2tlQ29sb3IoJmZ4Q29sb3IpOw0KKyAgcEdTLT5TdHJva2VQYXRoKHBQYXRoLCBwTWF0cml4KTsNCisgIHBHUy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsNCit9DQorc3RhdGljIHZvaWQgWEZBX0JPWF9TdHJva2VBcmMoQ1hGQV9Cb3ggYm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiBydFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpIHsNCisgIENYRkFfRWRnZSBlZGdlID0gYm94LkdldEVkZ2UoMCk7DQorICBpZiAoIWVkZ2UuSXNFeGlzdEluWE1MKCkgfHwgIWVkZ2UuSXNWaXNpYmxlKCkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfQk9PTCBiVmlzaWJsZSA9IEZBTFNFOw0KKyAgRlhfRkxPQVQgZlRoaWNrbmVzcyA9IDA7DQorICBpbnQzMl90IGkzRFR5cGUgPSBib3guR2V0M0RTdHlsZShiVmlzaWJsZSwgZlRoaWNrbmVzcyk7DQorICBpZiAoaTNEVHlwZSkgew0KKyAgICBpZiAoYlZpc2libGUgJiYgZlRoaWNrbmVzcyA+PSAwLjAwMWYpIHsNCisgICAgICBkd0ZsYWdzIHw9IFhGQV9EUkFXQk9YX0xvd2VyZWQzRDsNCisgICAgfQ0KKyAgfQ0KKyAgRlhfRkxPQVQgZkhhbGYgPSBlZGdlLkdldFRoaWNrbmVzcygpIC8gMjsNCisgIGlmIChmSGFsZiA8IDApIHsNCisgICAgZkhhbGYgPSAwOw0KKyAgfQ0KKyAgaW50MzJfdCBpSGFuZCA9IGJveC5HZXRIYW5kKCk7DQorICBpZiAoaUhhbmQgPT0gWEZBX0FUVFJJQlVURUVOVU1fTGVmdCkgew0KKyAgICBydFdpZGdldC5JbmZsYXRlKGZIYWxmLCBmSGFsZik7DQorICB9IGVsc2UgaWYgKGlIYW5kID09IFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0KSB7DQorICAgIHJ0V2lkZ2V0LkRlZmxhdGUoZkhhbGYsIGZIYWxmKTsNCisgIH0NCisgIGlmICgoZHdGbGFncyAmIFhGQV9EUkFXQk9YX0ZvcmNlUm91bmQpID09IDAgfHwNCisgICAgICAoZHdGbGFncyAmIFhGQV9EUkFXQk9YX0xvd2VyZWQzRCkgPT0gMCkgew0KKyAgICBpZiAoZkhhbGYgPCAwLjAwMWYpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX1BhdGggYXJjUGF0aDsNCisgICAgYXJjUGF0aC5DcmVhdGUoKTsNCisgICAgWEZBX0JPWF9HZXRQYXRoX0FyYyhib3gsIHJ0V2lkZ2V0LCBhcmNQYXRoLCBkd0ZsYWdzKTsNCisgICAgWEZBX0JPWF9TdHJva2VQYXRoKGVkZ2UsICZhcmNQYXRoLCBwR1MsIHBNYXRyaXgpOw0KKyAgICByZXR1cm47DQorICB9DQorICBwR1MtPlNhdmVHcmFwaFN0YXRlKCk7DQorICBwR1MtPlNldExpbmVXaWR0aChmSGFsZik7DQorICBGWF9GTE9BVCBhLCBiOw0KKyAgYSA9IHJ0V2lkZ2V0LndpZHRoIC8gMi4wZjsNCisgIGIgPSBydFdpZGdldC5oZWlnaHQgLyAyLjBmOw0KKyAgaWYgKGR3RmxhZ3MgJiBYRkFfRFJBV0JPWF9Gb3JjZVJvdW5kKSB7DQorICAgIGEgPSBiID0gc3RkOjptaW4oYSwgYik7DQorICB9DQorICBDRlhfUG9pbnRGIGNlbnRlciA9IHJ0V2lkZ2V0LkNlbnRlcigpOw0KKyAgcnRXaWRnZXQubGVmdCA9IGNlbnRlci54IC0gYTsNCisgIHJ0V2lkZ2V0LnRvcCA9IGNlbnRlci55IC0gYjsNCisgIHJ0V2lkZ2V0LndpZHRoID0gYSArIGE7DQorICBydFdpZGdldC5oZWlnaHQgPSBiICsgYjsNCisgIEZYX0ZMT0FUIHN0YXJ0QW5nbGUgPSAwLCBzd2VlcEFuZ2xlID0gMzYwOw0KKyAgc3RhcnRBbmdsZSA9IHN0YXJ0QW5nbGUgKiBGWF9QSSAvIDE4MC4wZjsNCisgIHN3ZWVwQW5nbGUgPSAtc3dlZXBBbmdsZSAqIEZYX1BJIC8gMTgwLjBmOw0KKyAgQ0ZYX1BhdGggYXJjUGF0aDsNCisgIGFyY1BhdGguQ3JlYXRlKCk7DQorICBhcmNQYXRoLkFkZEFyYyhydFdpZGdldC5sZWZ0LCBydFdpZGdldC50b3AsIHJ0V2lkZ2V0LndpZHRoLCBydFdpZGdldC5oZWlnaHQsDQorICAgICAgICAgICAgICAgICAzLjBmICogRlhfUEkgLyA0LjBmLCBGWF9QSSk7DQorICBDRlhfQ29sb3IgY3IoMHhGRjgwODA4MCk7DQorICBwR1MtPlNldFN0cm9rZUNvbG9yKCZjcik7DQorICBwR1MtPlN0cm9rZVBhdGgoJmFyY1BhdGgsIHBNYXRyaXgpOw0KKyAgYXJjUGF0aC5DbGVhcigpOw0KKyAgYXJjUGF0aC5BZGRBcmMocnRXaWRnZXQubGVmdCwgcnRXaWRnZXQudG9wLCBydFdpZGdldC53aWR0aCwgcnRXaWRnZXQuaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgLTEuMGYgKiBGWF9QSSAvIDQuMGYsIEZYX1BJKTsNCisgIGNyLlNldCgweEZGRkZGRkZGKTsNCisgIHBHUy0+U2V0U3Ryb2tlQ29sb3IoJmNyKTsNCisgIHBHUy0+U3Ryb2tlUGF0aCgmYXJjUGF0aCwgcE1hdHJpeCk7DQorICBydFdpZGdldC5EZWZsYXRlKGZIYWxmLCBmSGFsZik7DQorICBhcmNQYXRoLkNsZWFyKCk7DQorICBhcmNQYXRoLkFkZEFyYyhydFdpZGdldC5sZWZ0LCBydFdpZGdldC50b3AsIHJ0V2lkZ2V0LndpZHRoLCBydFdpZGdldC5oZWlnaHQsDQorICAgICAgICAgICAgICAgICAzLjBmICogRlhfUEkgLyA0LjBmLCBGWF9QSSk7DQorICBjci5TZXQoMHhGRjQwNDA0MCk7DQorICBwR1MtPlNldFN0cm9rZUNvbG9yKCZjcik7DQorICBwR1MtPlN0cm9rZVBhdGgoJmFyY1BhdGgsIHBNYXRyaXgpOw0KKyAgYXJjUGF0aC5DbGVhcigpOw0KKyAgYXJjUGF0aC5BZGRBcmMocnRXaWRnZXQubGVmdCwgcnRXaWRnZXQudG9wLCBydFdpZGdldC53aWR0aCwgcnRXaWRnZXQuaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgLTEuMGYgKiBGWF9QSSAvIDQuMGYsIEZYX1BJKTsNCisgIGNyLlNldCgweEZGQzBDMEMwKTsNCisgIHBHUy0+U2V0U3Ryb2tlQ29sb3IoJmNyKTsNCisgIHBHUy0+U3Ryb2tlUGF0aCgmYXJjUGF0aCwgcE1hdHJpeCk7DQorICBwR1MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9EcmF3M0RSZWN0KENGWF9HcmFwaGljcyogcEdyYXBoaWMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTGluZVdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiVG9wTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGFyZ2JCb3R0b21SaWdodCkgew0KKyAgQ0ZYX0NvbG9yIGNyTFQoYXJnYlRvcExlZnQpOw0KKyAgcEdyYXBoaWMtPlNldEZpbGxDb2xvcigmY3JMVCk7DQorICBGWF9GTE9BVCBmQm90dG9tID0gcnQuYm90dG9tKCk7DQorICBGWF9GTE9BVCBmUmlnaHQgPSBydC5yaWdodCgpOw0KKyAgQ0ZYX1BhdGggcGF0aExUOw0KKyAgcGF0aExULkNyZWF0ZSgpOw0KKyAgcGF0aExULk1vdmVUbyhydC5sZWZ0LCBmQm90dG9tKTsNCisgIHBhdGhMVC5MaW5lVG8ocnQubGVmdCwgcnQudG9wKTsNCisgIHBhdGhMVC5MaW5lVG8oZlJpZ2h0LCBydC50b3ApOw0KKyAgcGF0aExULkxpbmVUbyhmUmlnaHQgLSBmTGluZVdpZHRoLCBydC50b3AgKyBmTGluZVdpZHRoKTsNCisgIHBhdGhMVC5MaW5lVG8ocnQubGVmdCArIGZMaW5lV2lkdGgsIHJ0LnRvcCArIGZMaW5lV2lkdGgpOw0KKyAgcGF0aExULkxpbmVUbyhydC5sZWZ0ICsgZkxpbmVXaWR0aCwgZkJvdHRvbSAtIGZMaW5lV2lkdGgpOw0KKyAgcGF0aExULkxpbmVUbyhydC5sZWZ0LCBmQm90dG9tKTsNCisgIHBHcmFwaGljLT5GaWxsUGF0aCgmcGF0aExULCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorICBDRlhfQ29sb3IgY3JSQihhcmdiQm90dG9tUmlnaHQpOw0KKyAgcEdyYXBoaWMtPlNldEZpbGxDb2xvcigmY3JSQik7DQorICBDRlhfUGF0aCBwYXRoUkI7DQorICBwYXRoUkIuQ3JlYXRlKCk7DQorICBwYXRoUkIuTW92ZVRvKGZSaWdodCwgcnQudG9wKTsNCisgIHBhdGhSQi5MaW5lVG8oZlJpZ2h0LCBmQm90dG9tKTsNCisgIHBhdGhSQi5MaW5lVG8ocnQubGVmdCwgZkJvdHRvbSk7DQorICBwYXRoUkIuTGluZVRvKHJ0LmxlZnQgKyBmTGluZVdpZHRoLCBmQm90dG9tIC0gZkxpbmVXaWR0aCk7DQorICBwYXRoUkIuTGluZVRvKGZSaWdodCAtIGZMaW5lV2lkdGgsIGZCb3R0b20gLSBmTGluZVdpZHRoKTsNCisgIHBhdGhSQi5MaW5lVG8oZlJpZ2h0IC0gZkxpbmVXaWR0aCwgcnQudG9wICsgZkxpbmVXaWR0aCk7DQorICBwYXRoUkIuTGluZVRvKGZSaWdodCwgcnQudG9wKTsNCisgIHBHcmFwaGljLT5GaWxsUGF0aCgmcGF0aFJCLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9CT1hfU3Ryb2tlXzNEUmVjdF9Mb3dlcmVkKENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiBydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVGhpY2tuZXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIEZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmVGhpY2tuZXNzIC8gMi4wZjsNCisgIENGWF9SZWN0RiBydElubmVyKHJ0KTsNCisgIHJ0SW5uZXIuRGVmbGF0ZShmSGFsZldpZHRoLCBmSGFsZldpZHRoKTsNCisgIENGWF9Db2xvciBjcigweEZGMDAwMDAwKTsNCisgIHBHUy0+U2V0RmlsbENvbG9yKCZjcik7DQorICBDRlhfUGF0aCBwYXRoOw0KKyAgcGF0aC5DcmVhdGUoKTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQsIHJ0LnRvcCwgcnQud2lkdGgsIHJ0LmhlaWdodCk7DQorICBwYXRoLkFkZFJlY3RhbmdsZShydElubmVyLmxlZnQsIHJ0SW5uZXIudG9wLCBydElubmVyLndpZHRoLCBydElubmVyLmhlaWdodCk7DQorICBwR1MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfQUxURVJOQVRFLCBwTWF0cml4KTsNCisgIFhGQV9EcmF3M0RSZWN0KHBHUywgcnRJbm5lciwgZkhhbGZXaWR0aCwgcE1hdHJpeCwgMHhGRjgwODA4MCwgMHhGRkMwQzBDMCk7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9CT1hfU3Ryb2tlXzNEUmVjdF9SYWlzZWQoQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVGhpY2tuZXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgRlhfRkxPQVQgZkhhbGZXaWR0aCA9IGZUaGlja25lc3MgLyAyLjBmOw0KKyAgQ0ZYX1JlY3RGIHJ0SW5uZXIocnQpOw0KKyAgcnRJbm5lci5EZWZsYXRlKGZIYWxmV2lkdGgsIGZIYWxmV2lkdGgpOw0KKyAgQ0ZYX0NvbG9yIGNyKDB4RkYwMDAwMDApOw0KKyAgcEdTLT5TZXRGaWxsQ29sb3IoJmNyKTsNCisgIENGWF9QYXRoIHBhdGg7DQorICBwYXRoLkNyZWF0ZSgpOw0KKyAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCwgcnQudG9wLCBydC53aWR0aCwgcnQuaGVpZ2h0KTsNCisgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0SW5uZXIubGVmdCwgcnRJbm5lci50b3AsIHJ0SW5uZXIud2lkdGgsIHJ0SW5uZXIuaGVpZ2h0KTsNCisgIHBHUy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9BTFRFUk5BVEUsIHBNYXRyaXgpOw0KKyAgWEZBX0RyYXczRFJlY3QocEdTLCBydElubmVyLCBmSGFsZldpZHRoLCBwTWF0cml4LCAweEZGRkZGRkZGLCAweEZGODA4MDgwKTsNCit9DQorc3RhdGljIHZvaWQgWEZBX0JPWF9TdHJva2VfM0RSZWN0X0V0Y2hlZChDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiBydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUaGlja25lc3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBGWF9GTE9BVCBmSGFsZldpZHRoID0gZlRoaWNrbmVzcyAvIDIuMGY7DQorICBYRkFfRHJhdzNEUmVjdChwR1MsIHJ0LCBmVGhpY2tuZXNzLCBwTWF0cml4LCAweEZGODA4MDgwLCAweEZGRkZGRkZGKTsNCisgIENGWF9SZWN0RiBydElubmVyKHJ0KTsNCisgIHJ0SW5uZXIuRGVmbGF0ZShmSGFsZldpZHRoLCBmSGFsZldpZHRoKTsNCisgIFhGQV9EcmF3M0RSZWN0KHBHUywgcnRJbm5lciwgZkhhbGZXaWR0aCwgcE1hdHJpeCwgMHhGRkZGRkZGRiwgMHhGRjgwODA4MCk7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9CT1hfU3Ryb2tlXzNEUmVjdF9FbWJvc3NlZChDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVGhpY2tuZXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7DQorICBGWF9GTE9BVCBmSGFsZldpZHRoID0gZlRoaWNrbmVzcyAvIDIuMGY7DQorICBYRkFfRHJhdzNEUmVjdChwR1MsIHJ0LCBmVGhpY2tuZXNzLCBwTWF0cml4LCAweEZGODA4MDgwLCAweEZGMDAwMDAwKTsNCisgIENGWF9SZWN0RiBydElubmVyKHJ0KTsNCisgIHJ0SW5uZXIuRGVmbGF0ZShmSGFsZldpZHRoLCBmSGFsZldpZHRoKTsNCisgIFhGQV9EcmF3M0RSZWN0KHBHUywgcnRJbm5lciwgZkhhbGZXaWR0aCwgcE1hdHJpeCwgMHhGRjAwMDAwMCwgMHhGRjgwODA4MCk7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9CT1hfU3Ryb2tlX1JlY3QoQ1hGQV9Cb3ggYm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hGQV9TdHJva2VBcnJheSYgc3Ryb2tlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgew0KKyAgRlhfQk9PTCBiVmlzaWJsZSA9IEZBTFNFOw0KKyAgRlhfRkxPQVQgZlRoaWNrbmVzcyA9IDA7DQorICBpbnQzMl90IGkzRFR5cGUgPSBib3guR2V0M0RTdHlsZShiVmlzaWJsZSwgZlRoaWNrbmVzcyk7DQorICBpZiAoaTNEVHlwZSkgew0KKyAgICBpZiAoIWJWaXNpYmxlIHx8IGZUaGlja25lc3MgPCAwLjAwMWYpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgc3dpdGNoIChpM0RUeXBlKSB7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Mb3dlcmVkOg0KKyAgICAgICAgWEZBX0JPWF9TdHJva2VfM0RSZWN0X0xvd2VyZWQocEdTLCBydFdpZGdldCwgZlRoaWNrbmVzcywgcE1hdHJpeCk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JhaXNlZDoNCisgICAgICAgIFhGQV9CT1hfU3Ryb2tlXzNEUmVjdF9SYWlzZWQocEdTLCBydFdpZGdldCwgZlRoaWNrbmVzcywgcE1hdHJpeCk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0V0Y2hlZDoNCisgICAgICAgIFhGQV9CT1hfU3Ryb2tlXzNEUmVjdF9FdGNoZWQocEdTLCBydFdpZGdldCwgZlRoaWNrbmVzcywgcE1hdHJpeCk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0VtYm9zc2VkOg0KKyAgICAgICAgWEZBX0JPWF9TdHJva2VfM0RSZWN0X0VtYm9zc2VkKHBHUywgcnRXaWRnZXQsIGZUaGlja25lc3MsIHBNYXRyaXgpOw0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfQk9PTCBiQ2xvc2UgPSBGQUxTRTsNCisgIEZYX0JPT0wgYlNhbWVTdHlsZXMgPSBUUlVFOw0KKyAgaW50MzJfdCBpOw0KKyAgQ1hGQV9TdHJva2Ugc3Ryb2tlMSA9IHN0cm9rZXNbMF07DQorICBmb3IgKGkgPSAxOyBpIDwgODsgaSsrKSB7DQorICAgIENYRkFfU3Ryb2tlIHN0cm9rZTIgPSBzdHJva2VzW2ldOw0KKyAgICBpZiAoIXN0cm9rZTEuU2FtZVN0eWxlcyhzdHJva2UyKSkgew0KKyAgICAgIGJTYW1lU3R5bGVzID0gRkFMU0U7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgc3Ryb2tlMSA9IHN0cm9rZTI7DQorICB9DQorICBpZiAoYlNhbWVTdHlsZXMpIHsNCisgICAgc3Ryb2tlMSA9IHN0cm9rZXNbMF07DQorICAgIGJDbG9zZSA9IFRSVUU7DQorICAgIGZvciAoaSA9IDI7IGkgPCA4OyBpICs9IDIpIHsNCisgICAgICBDWEZBX1N0cm9rZSBzdHJva2UyID0gc3Ryb2tlc1tpXTsNCisgICAgICBpZiAoIXN0cm9rZTEuU2FtZVN0eWxlcyhzdHJva2UyLCBYRkFfU1RST0tFX1NBTUVTVFlMRV9Ob1ByZXNlbmNlIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1NUUk9LRV9TQU1FU1RZTEVfQ29ybmVyKSkgew0KKyAgICAgICAgYlNhbWVTdHlsZXMgPSBGQUxTRTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBzdHJva2UxID0gc3Ryb2tlMjsNCisgICAgfQ0KKyAgICBpZiAoYlNhbWVTdHlsZXMpIHsNCisgICAgICBzdHJva2UxID0gc3Ryb2tlc1swXTsNCisgICAgICBpZiAoc3Ryb2tlMS5Jc0ludmVydGVkKCkpIHsNCisgICAgICAgIGJTYW1lU3R5bGVzID0gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGlmIChzdHJva2UxLkdldEpvaW5UeXBlKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fU3F1YXJlKSB7DQorICAgICAgICBiU2FtZVN0eWxlcyA9IEZBTFNFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgRlhfQk9PTCBiU3RhcnQgPSBUUlVFOw0KKyAgQ0ZYX1BhdGggcGF0aDsNCisgIHBhdGguQ3JlYXRlKCk7DQorICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7DQorICAgIENYRkFfU3Ryb2tlIHN0cm9rZTEgPSBzdHJva2VzW2ldOw0KKyAgICBpZiAoKGkgJSAxKSA9PSAwICYmIHN0cm9rZTEuR2V0UmFkaXVzKCkgPCAwKSB7DQorICAgICAgRlhfQk9PTCBiRW1wdHkgPSBwYXRoLklzRW1wdHkoKTsNCisgICAgICBpZiAoIWJFbXB0eSkgew0KKyAgICAgICAgWEZBX0JPWF9TdHJva2VQYXRoKHN0cm9rZTEsICZwYXRoLCBwR1MsIHBNYXRyaXgpOw0KKyAgICAgICAgcGF0aC5DbGVhcigpOw0KKyAgICAgIH0NCisgICAgICBiU3RhcnQgPSBUUlVFOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIFhGQV9CT1hfR2V0UGF0aChib3gsIHN0cm9rZXMsIHJ0V2lkZ2V0LCBwYXRoLCBpLCBiU3RhcnQsICFiU2FtZVN0eWxlcyk7DQorICAgIENYRkFfU3Ryb2tlIHN0cm9rZTIgPSBzdHJva2VzWyhpICsgMSkgJSA4XTsNCisgICAgYlN0YXJ0ID0gIXN0cm9rZTEuU2FtZVN0eWxlcyhzdHJva2UyKTsNCisgICAgaWYgKGJTdGFydCkgew0KKyAgICAgIFhGQV9CT1hfU3Ryb2tlUGF0aChzdHJva2UxLCAmcGF0aCwgcEdTLCBwTWF0cml4KTsNCisgICAgICBwYXRoLkNsZWFyKCk7DQorICAgIH0NCisgIH0NCisgIEZYX0JPT0wgYkVtcHR5ID0gcGF0aC5Jc0VtcHR5KCk7DQorICBpZiAoIWJFbXB0eSkgew0KKyAgICBpZiAoYkNsb3NlKSB7DQorICAgICAgcGF0aC5DbG9zZSgpOw0KKyAgICB9DQorICAgIFhGQV9CT1hfU3Ryb2tlUGF0aChzdHJva2VzWzddLCAmcGF0aCwgcEdTLCBwTWF0cml4KTsNCisgIH0NCit9DQorc3RhdGljIHZvaWQgWEZBX0JPWF9TdHJva2UoQ1hGQV9Cb3ggYm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYRkFfU3Ryb2tlQXJyYXkmIHN0cm9rZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncykgew0KKyAgaWYgKGJveC5Jc0FyYygpIHx8IChkd0ZsYWdzICYgWEZBX0RSQVdCT1hfRm9yY2VSb3VuZCkgIT0gMCkgew0KKyAgICBYRkFfQk9YX1N0cm9rZUFyYyhib3gsIHBHUywgcnRXaWRnZXQsIHBNYXRyaXgsIGR3RmxhZ3MpOw0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9CT09MIGJWaXNpYmxlID0gRkFMU0U7DQorICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCA0OyBqKyspIHsNCisgICAgYlZpc2libGUgfD0gc3Ryb2tlc1tqICogMiArIDFdLklzVmlzaWJsZSgpOw0KKyAgICBpZiAoYlZpc2libGUpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKCFiVmlzaWJsZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCA4OyBpICs9IDIpIHsNCisgICAgQ1hGQV9FZGdlIGVkZ2UgPSAoQ1hGQV9Ob2RlKilzdHJva2VzW2ldOw0KKyAgICBGWF9GTE9BVCBmVGhpY2tuZXNzID0gZWRnZS5HZXRUaGlja25lc3MoKTsNCisgICAgaWYgKGZUaGlja25lc3MgPCAwKSB7DQorICAgICAgZlRoaWNrbmVzcyA9IDA7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZkhhbGYgPSBmVGhpY2tuZXNzIC8gMjsNCisgICAgaW50MzJfdCBpSGFuZCA9IGJveC5HZXRIYW5kKCk7DQorICAgIHN3aXRjaCAoaSkgew0KKyAgICAgIGNhc2UgMToNCisgICAgICAgIGlmIChpSGFuZCA9PSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0KSB7DQorICAgICAgICAgIHJ0V2lkZ2V0LnRvcCAtPSBmSGFsZjsNCisgICAgICAgICAgcnRXaWRnZXQuaGVpZ2h0ICs9IGZIYWxmOw0KKyAgICAgICAgfSBlbHNlIGlmIChpSGFuZCA9PSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodCkgew0KKyAgICAgICAgICBydFdpZGdldC50b3AgKz0gZkhhbGY7DQorICAgICAgICAgIHJ0V2lkZ2V0LmhlaWdodCAtPSBmSGFsZjsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgMzoNCisgICAgICAgIGlmIChpSGFuZCA9PSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0KSB7DQorICAgICAgICAgIHJ0V2lkZ2V0LndpZHRoICs9IGZIYWxmOw0KKyAgICAgICAgfSBlbHNlIGlmIChpSGFuZCA9PSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodCkgew0KKyAgICAgICAgICBydFdpZGdldC53aWR0aCAtPSBmSGFsZjsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgNToNCisgICAgICAgIGlmIChpSGFuZCA9PSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0KSB7DQorICAgICAgICAgIHJ0V2lkZ2V0LmhlaWdodCArPSBmSGFsZjsNCisgICAgICAgIH0gZWxzZSBpZiAoaUhhbmQgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQpIHsNCisgICAgICAgICAgcnRXaWRnZXQuaGVpZ2h0IC09IGZIYWxmOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSA3Og0KKyAgICAgICAgaWYgKGlIYW5kID09IFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQpIHsNCisgICAgICAgICAgcnRXaWRnZXQubGVmdCAtPSBmSGFsZjsNCisgICAgICAgICAgcnRXaWRnZXQud2lkdGggKz0gZkhhbGY7DQorICAgICAgICB9IGVsc2UgaWYgKGlIYW5kID09IFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0KSB7DQorICAgICAgICAgIHJ0V2lkZ2V0LmxlZnQgKz0gZkhhbGY7DQorICAgICAgICAgIHJ0V2lkZ2V0LndpZHRoIC09IGZIYWxmOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIFhGQV9CT1hfU3Ryb2tlX1JlY3QoYm94LCBzdHJva2VzLCBwR1MsIHJ0V2lkZ2V0LCBwTWF0cml4KTsNCit9DQordm9pZCBYRkFfRHJhd0JveChDWEZBX0JveCBib3gsDQorICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRXaWRnZXQsDQorICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncykgew0KKyAgaWYgKCFib3ggfHwgYm94LkdldFByZXNlbmNlKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlUeXBlID0gYm94LkdldENsYXNzSUQoKTsNCisgIGlmIChpVHlwZSAhPSBYRkFfRUxFTUVOVF9BcmMgJiYgaVR5cGUgIT0gWEZBX0VMRU1FTlRfQm9yZGVyICYmDQorICAgICAgaVR5cGUgIT0gWEZBX0VMRU1FTlRfUmVjdGFuZ2xlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfU3Ryb2tlQXJyYXkgc3Ryb2tlczsNCisgIGlmICghKGR3RmxhZ3MgJiBYRkFfRFJBV0JPWF9Gb3JjZVJvdW5kKSAmJiBpVHlwZSAhPSBYRkFfRUxFTUVOVF9BcmMpIHsNCisgICAgYm94LkdldFN0cm9rZXMoc3Ryb2tlcyk7DQorICB9DQorICBYRkFfQk9YX0ZpbGwoYm94LCBzdHJva2VzLCBwR1MsIHJ0V2lkZ2V0LCBwTWF0cml4LCBkd0ZsYWdzKTsNCisgIFhGQV9CT1hfU3Ryb2tlKGJveCwgc3Ryb2tlcywgcEdTLCBydFdpZGdldCwgcE1hdHJpeCwgZHdGbGFncyk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZndpZGdldC5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBhN2Q4MAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZndpZGdldC5oCkBAIC0wLDAgKzEsMTg2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYRkFfRk9STUZJTExFUl9XSURHRVRfSU1QX0gNCisjZGVmaW5lIF9GWEZBX0ZPUk1GSUxMRVJfV0lER0VUX0lNUF9IDQorDQorI2luY2x1ZGUgInhmYS9pbmNsdWRlL2Z4ZmEvZnhmYS5oIg0KKw0KK2NsYXNzIENYRkFfRkZQYWdlVmlldzsNCitjbGFzcyBDWEZBX0ZGRG9jVmlldzsNCitjbGFzcyBDWEZBX0ZGRG9jOw0KK2NsYXNzIENYRkFfRkZBcHA7DQorDQorI2RlZmluZSBYRkFfR09UT19QT1NJVElPTl9JRl9GQUlMKGFyZywgcG9zKSBcDQorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgIGlmICghKGFyZykpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgICAgZ290byBwb3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICB9DQoraW5saW5lIEZYX0ZMT0FUIFhGQV9Vbml0UHgyUHQoRlhfRkxPQVQgZlB4LCBGWF9GTE9BVCBmRHBpKSB7DQorICByZXR1cm4gZlB4ICogNzIuMGYgLyBmRHBpOw0KK30NCisjZGVmaW5lIFhGQV9GTE9BVF9QRVJDSVNJT04gMC4wMDFmDQorZW51bSBYRkFfV0lER0VUSVRFTSB7DQorICBYRkFfV0lER0VUSVRFTV9QYXJlbnQsDQorICBYRkFfV0lER0VUSVRFTV9GaXJzdENoaWxkLA0KKyAgWEZBX1dJREdFVElURU1fTmV4dFNpYmxpbmcsDQorICBYRkFfV0lER0VUSVRFTV9QcmV2U2libGluZywNCit9Ow0KK2NsYXNzIENYRkFfQ2FsY0RhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX0NhbGNEYXRhKCkgOiBtX2lSZWZDb3VudCgwKSB7fQ0KKyAgfkNYRkFfQ2FsY0RhdGEoKSB7IG1fR2xvYmFscy5SZW1vdmVBbGwoKTsgfQ0KKyAgQ0ZYX1B0ckFycmF5IG1fR2xvYmFsczsNCisgIGludDMyX3QgbV9pUmVmQ291bnQ7DQorfTsNCitjbGFzcyBDWEZBX0ZGV2lkZ2V0IDogcHVibGljIElYRkFfV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQ0ZYX1ByaXZhdGVEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSB7DQorIHB1YmxpYzoNCisgIENYRkFfRkZXaWRnZXQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7DQorICB2aXJ0dWFsIH5DWEZBX0ZGV2lkZ2V0KCk7DQorICBJWEZBX1BhZ2VWaWV3KiBHZXRQYWdlVmlldygpOw0KKyAgdm9pZCBTZXRQYWdlVmlldyhJWEZBX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOw0KKyAgdm9pZCBHZXRXaWRnZXRSZWN0KENGWF9SZWN0RiYgcnRXaWRnZXQpOw0KKyAgQ0ZYX1JlY3RGIFJlQ2FjaGVXaWRnZXRSZWN0KCk7DQorICBGWF9EV09SRCBHZXRTdGF0dXMoKTsNCisgIHZvaWQgTW9kaWZ5U3RhdHVzKEZYX0RXT1JEIGR3QWRkZWQsIEZYX0RXT1JEIGR3UmVtb3ZlZCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0QkJveChDRlhfUmVjdEYmIHJ0Qm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEcmF3Rm9jdXMgPSBGQUxTRSk7DQorICBDWEZBX1dpZGdldEFjYyogR2V0RGF0YUFjYygpOw0KKyAgRlhfQk9PTCBHZXRUb29sVGlwKENGWF9XaWRlU3RyaW5nJiB3c1Rvb2xUaXApOw0KKyAgdmlydHVhbCB2b2lkIFJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzID0gMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlID0gMCk7DQorDQorICB2aXJ0dWFsIEZYX0JPT0wgSXNMb2FkZWQoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBMb2FkV2lkZ2V0KCk7DQorICB2aXJ0dWFsIHZvaWQgVW5sb2FkV2lkZ2V0KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUGVyZm9ybUxheW91dCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIFVwZGF0ZUZXTERhdGEoKTsNCisgIHZpcnR1YWwgdm9pZCBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VFbnRlcigpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTW91c2VFeGl0KCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uTEJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uRGJsQ2xrKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25Nb3VzZU1vdmUoRlhfRFdPUkQgZHdGbGFncywgRlhfRkxPQVQgZngsIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlV2hlZWwoRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCB6RGVsdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25SQnV0dG9uRG93bihGWF9EV09SRCBkd0ZsYWdzLCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvblVwKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25SQnV0dG9uRGJsQ2xrKEZYX0RXT1JEIGR3RmxhZ3MsIEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorDQorICB2aXJ0dWFsIEZYX0JPT0wgT25TZXRGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwT2xkV2lkZ2V0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbktpbGxGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwTmV3V2lkZ2V0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbktleURvd24oRlhfRFdPUkQgZHdLZXlDb2RlLCBGWF9EV09SRCBkd0ZsYWdzKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbktleVVwKEZYX0RXT1JEIGR3S2V5Q29kZSwgRlhfRFdPUkQgZHdGbGFncyk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25DaGFyKEZYX0RXT1JEIGR3Q2hhciwgRlhfRFdPUkQgZHdGbGFncyk7DQorICB2aXJ0dWFsIEZYX0RXT1JEIE9uSGl0VGVzdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uU2V0Q3Vyc29yKEZYX0ZMT0FUIGZ4LCBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuVW5kbygpIHsgcmV0dXJuIEZBTFNFOyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuUmVkbygpIHsgcmV0dXJuIEZBTFNFOyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgVW5kbygpIHsgcmV0dXJuIEZBTFNFOyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgUmVkbygpIHsgcmV0dXJuIEZBTFNFOyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuQ29weSgpIHsgcmV0dXJuIEZBTFNFOyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuQ3V0KCkgeyByZXR1cm4gRkFMU0U7IH0NCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5QYXN0ZSgpIHsgcmV0dXJuIEZBTFNFOyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuU2VsZWN0QWxsKCkgeyByZXR1cm4gRkFMU0U7IH0NCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5EZWxldGUoKSB7IHJldHVybiBDYW5DdXQoKTsgfQ0KKyAgdmlydHVhbCBGWF9CT09MIENhbkRlU2VsZWN0KCkgeyByZXR1cm4gQ2FuQ29weSgpOyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgQ29weShDRlhfV2lkZVN0cmluZyYgd3NDb3B5KSB7IHJldHVybiBGQUxTRTsgfQ0KKyAgdmlydHVhbCBGWF9CT09MIEN1dChDRlhfV2lkZVN0cmluZyYgd3NDdXQpIHsgcmV0dXJuIEZBTFNFOyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgUGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGFzdGUpIHsgcmV0dXJuIEZBTFNFOyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgU2VsZWN0QWxsKCkgeyByZXR1cm4gRkFMU0U7IH0NCisgIHZpcnR1YWwgRlhfQk9PTCBEZWxldGUoKSB7IHJldHVybiBGQUxTRTsgfQ0KKyAgdmlydHVhbCBGWF9CT09MIERlU2VsZWN0KCkgeyByZXR1cm4gRkFMU0U7IH0NCisgIHZpcnR1YWwgRlhfQk9PTCBHZXRTdWdnZXN0V29yZHMoQ0ZYX1BvaW50RiBwb2ludGYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQXJyYXkmIHNTdWdnZXN0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHZpcnR1YWwgRlhfQk9PTCBSZXBsYWNlU3BlbGxDaGVja1dvcmQoQ0ZYX1BvaW50RiBwb2ludGYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZXBsYWNlKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENYRkFfRkZEb2NWaWV3KiBHZXREb2NWaWV3KCk7DQorICB2b2lkIFNldERvY1ZpZXcoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3KSB7IG1fcERvY1ZpZXcgPSBwRG9jVmlldzsgfQ0KKyAgQ1hGQV9GRkRvYyogR2V0RG9jKCk7DQorICBDWEZBX0ZGQXBwKiBHZXRBcHAoKTsNCisgIElYRkFfQXBwUHJvdmlkZXIqIEdldEFwcFByb3ZpZGVyKCk7DQorICB2b2lkIEludmFsaWRhdGVXaWRnZXQoY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCA9IE5VTEwpOw0KKyAgdm9pZCBBZGRJbnZhbGlkYXRlUmVjdChjb25zdCBDRlhfUmVjdEYqIHBSZWN0ID0gTlVMTCk7DQorICBGWF9CT09MIEdldENhcHRpb25UZXh0KENGWF9XaWRlU3RyaW5nJiB3c0NhcCk7DQorICBGWF9CT09MIElzRm9jdXNlZCgpOw0KKyAgdm9pZCBSb3RhdGUyTm9ybWFsKEZYX0ZMT0FUJiBmeCwgRlhfRkxPQVQmIGZ5KTsNCisgIHZvaWQgR2V0Um90YXRlTWF0cml4KENGWF9NYXRyaXgmIG10KTsNCisgIEZYX0JPT0wgSXNMYXlvdXRSZWN0RW1wdHkoKTsNCisgIENYRkFfRkZXaWRnZXQqIEdldFBhcmVudCgpOw0KKyAgRlhfQk9PTCBJc0FuY2VzdG9yT2YoQ1hGQV9GRldpZGdldCogcFdpZGdldCk7DQorDQorIHByb3RlY3RlZDoNCisgIHZpcnR1YWwgRlhfQk9PTCBQdEluQWN0aXZlUmVjdChGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdm9pZCBEcmF3Qm9yZGVyKENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgIENYRkFfQm94IGJveCwNCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0Qm9yZGVyLA0KKyAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsDQorICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncyA9IDApOw0KKyAgdm9pZCBHZXRNaW5NYXhXaWR0aChGWF9GTE9BVCBmTWluV2lkdGgsIEZYX0ZMT0FUIGZNYXhXaWR0aCk7DQorICB2b2lkIEdldE1pbk1heEhlaWdodChGWF9GTE9BVCBmTWluSGVpZ2h0LCBGWF9GTE9BVCBmTWF4SGVpZ2h0KTsNCisgIHZvaWQgR2V0UmVjdFdpdGhvdXRSb3RhdGUoQ0ZYX1JlY3RGJiBydFdpZGdldCk7DQorICBGWF9CT09MIElzTWF0Y2hWaXNpYmxlU3RhdHVzKEZYX0RXT1JEIGR3U3RhdHVzKTsNCisNCisgIHZvaWQgRXZlbnRLaWxsRm9jdXMoKTsNCisgIEZYX0JPT0wgSXNCdXR0b25Eb3duKCk7DQorICB2b2lkIFNldEJ1dHRvbkRvd24oRlhfQk9PTCBiU2V0KTsNCisgIENYRkFfRkZEb2NWaWV3KiBtX3BEb2NWaWV3Ow0KKyAgQ1hGQV9GRlBhZ2VWaWV3KiBtX3BQYWdlVmlldzsNCisgIENYRkFfV2lkZ2V0QWNjKiBtX3BEYXRhQWNjOw0KKyAgQ0ZYX1JlY3RGIG1fcnRXaWRnZXQ7DQorfTsNCitpbnQzMl90IFhGQV9TdHJva2VUeXBlU2V0TGluZURhc2goQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0cm9rZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNhcFR5cGUpOw0KK0NGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcCBYRkFfTGluZUNhcFRvRlhHRShpbnQzMl90IGlMaW5lQ2FwKTsNCit2b2lkIFhGQV9EcmF3SW1hZ2UoQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRJbWFnZSwNCisgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsDQorICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUFzcGVjdCwNCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpSW1hZ2VYRHBpLA0KKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlJbWFnZVlEcGksDQorICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUhvcnpBbGlnbiA9IFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQsDQorICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZlcnRBbGlnbiA9IFhGQV9BVFRSSUJVVEVFTlVNX1RvcCk7DQorQ0ZYX0RJQml0bWFwKiBYRkFfTG9hZEltYWdlRGF0YShDWEZBX0ZGRG9jKiBwRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9JbWFnZSogcEltYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYk5hbWVJbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlJbWFnZVhEcGksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSW1hZ2VZRHBpKTsNCitDRlhfRElCaXRtYXAqIFhGQV9Mb2FkSW1hZ2VGcm9tQnVmZmVyKElGWF9GaWxlUmVhZCogcEltYWdlRmlsZVJlYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWENPREVDX0lNQUdFX1RZUEUgdHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlJbWFnZVhEcGksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSW1hZ2VZRHBpKTsNCitGWENPREVDX0lNQUdFX1RZUEUgWEZBX0dldEltYWdlVHlwZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVHlwZSk7DQorRlhfQ0hBUiogWEZBX0Jhc2U2NEVuY29kZShjb25zdCB1aW50OF90KiBidWYsIGludDMyX3QgYnVmX2xlbik7DQordm9pZCBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKENGWF9SZWN0RiYgcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYRkFfTWFyZ2luJiBtZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVUkgPSBGQUxTRSk7DQorRlhfRkxPQVQgWEZBX0dldEVkZ2VUaGlja25lc3MoY29uc3QgQ1hGQV9TdHJva2VBcnJheSYgc3Ryb2tlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGIzRFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4KTsNCitDWEZBX0ZGV2lkZ2V0KiBYRkFfR2V0V2lkZ2V0RnJvbUxheW91dEl0ZW0oQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSk7DQorRlhfQk9PTCBYRkFfSXNDcmVhdGVXaWRnZXQoWEZBX0VMRU1FTlQgaVR5cGUpOw0KKyNkZWZpbmUgWEZBX0RSQVdCT1hfRm9yY2VSb3VuZCAxDQorI2RlZmluZSBYRkFfRFJBV0JPWF9Mb3dlcmVkM0QgMg0KK3ZvaWQgWEZBX0RyYXdCb3goQ1hGQV9Cb3ggYm94LA0KKyAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0V2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwNCisgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MgPSAwKTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXRhY2MuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0YWNjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTc0MDhkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0YWNjLmNwcApAQCAtMCwwICsxLDE3MTggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgPGFsZ29yaXRobT4NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfY29tbW9uLmgiDQorI2luY2x1ZGUgInhmYV9mZndpZGdldC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2MuaCINCisjaW5jbHVkZSAieGZhX2ZmZG9jdmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZwYWdldmlldy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZhcHAuaCINCisjaW5jbHVkZSAieGZhX3RleHRsYXlvdXQuaCINCisjaW5jbHVkZSAieGZhX2Z3bGFkYXB0ZXIuaCINCisjaW5jbHVkZSAieGZhX2ZmZmllbGQuaCINCisjaW5jbHVkZSAieGZhX2ZmY2hvaWNlbGlzdC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZjaGVja2J1dHRvbi5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXRhY2MuaCINCisjaW5jbHVkZSAieGZhX2ZvbnRtZ3IuaCINCitzdGF0aWMgdm9pZCBYRkFfRkZEZWxldGVDYWxjRGF0YSh2b2lkKiBwRGF0YSkgew0KKyAgaWYgKHBEYXRhKSB7DQorICAgIGRlbGV0ZSAoKENYRkFfQ2FsY0RhdGEqKXBEYXRhKTsNCisgIH0NCit9DQorc3RhdGljIFhGQV9NQVBEQVRBQkxPQ0tDQUxMQkFDS0lORk8gZ3NfWEZBRGVsZXRlQ2FsY0RhdGEgPSB7DQorICAgIFhGQV9GRkRlbGV0ZUNhbGNEYXRhLCBOVUxMfTsNCitjbGFzcyBDWEZBX1dpZGdldExheW91dERhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX1dpZGdldExheW91dERhdGEoKSA6IG1fZldpZGdldEhlaWdodCgtMSkge30NCisgIHZpcnR1YWwgfkNYRkFfV2lkZ2V0TGF5b3V0RGF0YSgpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIEZYX0ZMT0FUIG1fZldpZGdldEhlaWdodDsNCit9Ow0KK2NsYXNzIENYRkFfVGV4dExheW91dERhdGEgOiBwdWJsaWMgQ1hGQV9XaWRnZXRMYXlvdXREYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9UZXh0TGF5b3V0RGF0YSgpIDogbV9wVGV4dExheW91dChOVUxMKSwgbV9wVGV4dFByb3ZpZGVyKE5VTEwpIHt9DQorICB+Q1hGQV9UZXh0TGF5b3V0RGF0YSgpIHsNCisgICAgaWYgKG1fcFRleHRMYXlvdXQpIHsNCisgICAgICBkZWxldGUgbV9wVGV4dExheW91dDsNCisgICAgfQ0KKyAgICBtX3BUZXh0TGF5b3V0ID0gTlVMTDsNCisgICAgaWYgKG1fcFRleHRQcm92aWRlcikgew0KKyAgICAgIGRlbGV0ZSBtX3BUZXh0UHJvdmlkZXI7DQorICAgIH0NCisgICAgbV9wVGV4dFByb3ZpZGVyID0gTlVMTDsNCisgIH0NCisgIHZvaWQgTG9hZFRleHQoQ1hGQV9XaWRnZXRBY2MqIHBBY2MpIHsNCisgICAgaWYgKG1fcFRleHRMYXlvdXQpDQorICAgICAgcmV0dXJuOw0KKw0KKyAgICBtX3BUZXh0UHJvdmlkZXIgPSBuZXcgQ1hGQV9UZXh0UHJvdmlkZXIocEFjYywgWEZBX1RFWFRQUk9WSURFUlRZUEVfVGV4dCk7DQorICAgIG1fcFRleHRMYXlvdXQgPSBuZXcgQ1hGQV9UZXh0TGF5b3V0KG1fcFRleHRQcm92aWRlcik7DQorICB9DQorICBDWEZBX1RleHRMYXlvdXQqIG1fcFRleHRMYXlvdXQ7DQorICBDWEZBX1RleHRQcm92aWRlciogbV9wVGV4dFByb3ZpZGVyOw0KK307DQorY2xhc3MgQ1hGQV9JbWFnZUxheW91dERhdGEgOiBwdWJsaWMgQ1hGQV9XaWRnZXRMYXlvdXREYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9JbWFnZUxheW91dERhdGEoKQ0KKyAgICAgIDogbV9wRElCaXRtYXAoTlVMTCksDQorICAgICAgICBtX2JOYW1lZEltYWdlKEZBTFNFKSwNCisgICAgICAgIG1faUltYWdlWERwaSgwKSwNCisgICAgICAgIG1faUltYWdlWURwaSgwKSB7fQ0KKw0KKyAgfkNYRkFfSW1hZ2VMYXlvdXREYXRhKCkgew0KKyAgICBpZiAobV9wRElCaXRtYXAgJiYgIW1fYk5hbWVkSW1hZ2UpIHsNCisgICAgICBkZWxldGUgbV9wRElCaXRtYXA7DQorICAgIH0NCisgICAgbV9wRElCaXRtYXAgPSBOVUxMOw0KKyAgfQ0KKw0KKyAgRlhfQk9PTCBMb2FkSW1hZ2VEYXRhKENYRkFfV2lkZ2V0QWNjKiBwQWNjKSB7DQorICAgIGlmIChtX3BESUJpdG1hcCkgew0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIENYRkFfVmFsdWUgdmFsdWUgPSBwQWNjLT5HZXRGb3JtVmFsdWUoKTsNCisgICAgaWYgKCF2YWx1ZSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDWEZBX0ltYWdlIGltYWdlT2JqID0gdmFsdWUuR2V0SW1hZ2UoKTsNCisgICAgaWYgKCFpbWFnZU9iaikgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDWEZBX0ZGRG9jKiBwRkZEb2MgPSBwQWNjLT5HZXREb2MoKTsNCisgICAgcEFjYy0+U2V0SW1hZ2VJbWFnZShYRkFfTG9hZEltYWdlRGF0YShwRkZEb2MsICZpbWFnZU9iaiwgbV9iTmFtZWRJbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lJbWFnZVhEcGksIG1faUltYWdlWURwaSkpOw0KKyAgICByZXR1cm4gbV9wRElCaXRtYXAgIT0gTlVMTDsNCisgIH0NCisNCisgIENGWF9ESUJpdG1hcCogbV9wRElCaXRtYXA7DQorICBGWF9CT09MIG1fYk5hbWVkSW1hZ2U7DQorICBpbnQzMl90IG1faUltYWdlWERwaTsNCisgIGludDMyX3QgbV9pSW1hZ2VZRHBpOw0KK307DQorY2xhc3MgQ1hGQV9GaWVsZExheW91dERhdGEgOiBwdWJsaWMgQ1hGQV9XaWRnZXRMYXlvdXREYXRhIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GaWVsZExheW91dERhdGEoKQ0KKyAgICAgIDogbV9wQ2FwVGV4dExheW91dChOVUxMKSwNCisgICAgICAgIG1fcENhcFRleHRQcm92aWRlcihOVUxMKSwNCisgICAgICAgIG1fcFRleHRPdXQoTlVMTCksDQorICAgICAgICBtX3BGaWVsZFNwbGl0QXJyYXkoTlVMTCkge30NCisgIH5DWEZBX0ZpZWxkTGF5b3V0RGF0YSgpIHsNCisgICAgaWYgKG1fcENhcFRleHRMYXlvdXQpIHsNCisgICAgICBkZWxldGUgbV9wQ2FwVGV4dExheW91dDsNCisgICAgfQ0KKyAgICBtX3BDYXBUZXh0TGF5b3V0ID0gTlVMTDsNCisgICAgaWYgKG1fcENhcFRleHRQcm92aWRlcikgew0KKyAgICAgIGRlbGV0ZSBtX3BDYXBUZXh0UHJvdmlkZXI7DQorICAgIH0NCisgICAgbV9wQ2FwVGV4dFByb3ZpZGVyID0gTlVMTDsNCisgICAgaWYgKG1fcFRleHRPdXQpIHsNCisgICAgICBtX3BUZXh0T3V0LT5SZWxlYXNlKCk7DQorICAgIH0NCisgICAgbV9wVGV4dE91dCA9IE5VTEw7DQorICAgIGlmIChtX3BGaWVsZFNwbGl0QXJyYXkpIHsNCisgICAgICBtX3BGaWVsZFNwbGl0QXJyYXktPlJlbW92ZUFsbCgpOw0KKyAgICAgIGRlbGV0ZSBtX3BGaWVsZFNwbGl0QXJyYXk7DQorICAgICAgbV9wRmllbGRTcGxpdEFycmF5ID0gTlVMTDsNCisgICAgfQ0KKyAgfQ0KKyAgRlhfQk9PTCBMb2FkQ2FwdGlvbihDWEZBX1dpZGdldEFjYyogcEFjYykgew0KKyAgICBpZiAobV9wQ2FwVGV4dExheW91dCkgew0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIENYRkFfQ2FwdGlvbiBjYXB0aW9uID0gcEFjYy0+R2V0Q2FwdGlvbigpOw0KKyAgICBpZiAoY2FwdGlvbi5Jc0V4aXN0SW5YTUwoKSAmJg0KKyAgICAgICAgY2FwdGlvbi5HZXRQcmVzZW5jZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX0hpZGRlbikgew0KKyAgICAgIG1fcENhcFRleHRQcm92aWRlciA9DQorICAgICAgICAgIG5ldyBDWEZBX1RleHRQcm92aWRlcihwQWNjLCBYRkFfVEVYVFBST1ZJREVSVFlQRV9DYXB0aW9uKTsNCisgICAgICBtX3BDYXBUZXh0TGF5b3V0ID0gbmV3IENYRkFfVGV4dExheW91dChtX3BDYXBUZXh0UHJvdmlkZXIpOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENYRkFfVGV4dExheW91dCogbV9wQ2FwVGV4dExheW91dDsNCisgIENYRkFfVGV4dFByb3ZpZGVyKiBtX3BDYXBUZXh0UHJvdmlkZXI7DQorICBJRkRFX1RleHRPdXQqIG1fcFRleHRPdXQ7DQorICBDRlhfRmxvYXRBcnJheSogbV9wRmllbGRTcGxpdEFycmF5Ow0KK307DQorY2xhc3MgQ1hGQV9UZXh0RWRpdERhdGEgOiBwdWJsaWMgQ1hGQV9GaWVsZExheW91dERhdGEgew0KKyBwdWJsaWM6DQorfTsNCitjbGFzcyBDWEZBX0ltYWdlRWRpdERhdGEgOiBwdWJsaWMgQ1hGQV9GaWVsZExheW91dERhdGEgew0KKyBwdWJsaWM6DQorICBDWEZBX0ltYWdlRWRpdERhdGEoKQ0KKyAgICAgIDogbV9wRElCaXRtYXAoTlVMTCksDQorICAgICAgICBtX2JOYW1lZEltYWdlKEZBTFNFKSwNCisgICAgICAgIG1faUltYWdlWERwaSgwKSwNCisgICAgICAgIG1faUltYWdlWURwaSgwKSB7fQ0KKw0KKyAgfkNYRkFfSW1hZ2VFZGl0RGF0YSgpIHsNCisgICAgaWYgKG1fcERJQml0bWFwICYmICFtX2JOYW1lZEltYWdlKSB7DQorICAgICAgZGVsZXRlIG1fcERJQml0bWFwOw0KKyAgICB9DQorICAgIG1fcERJQml0bWFwID0gTlVMTDsNCisgIH0NCisgIEZYX0JPT0wgTG9hZEltYWdlRGF0YShDWEZBX1dpZGdldEFjYyogcEFjYykgew0KKyAgICBpZiAobV9wRElCaXRtYXApIHsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBDWEZBX1ZhbHVlIHZhbHVlID0gcEFjYy0+R2V0Rm9ybVZhbHVlKCk7DQorICAgIGlmICghdmFsdWUpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ1hGQV9JbWFnZSBpbWFnZU9iaiA9IHZhbHVlLkdldEltYWdlKCk7DQorICAgIENYRkFfRkZEb2MqIHBGRkRvYyA9IHBBY2MtPkdldERvYygpOw0KKyAgICBwQWNjLT5TZXRJbWFnZUVkaXRJbWFnZShYRkFfTG9hZEltYWdlRGF0YShwRkZEb2MsICZpbWFnZU9iaiwgbV9iTmFtZWRJbWFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pSW1hZ2VYRHBpLCBtX2lJbWFnZVlEcGkpKTsNCisgICAgcmV0dXJuIG1fcERJQml0bWFwICE9IE5VTEw7DQorICB9DQorICBDRlhfRElCaXRtYXAqIG1fcERJQml0bWFwOw0KKyAgRlhfQk9PTCBtX2JOYW1lZEltYWdlOw0KKyAgaW50MzJfdCBtX2lJbWFnZVhEcGk7DQorICBpbnQzMl90IG1faUltYWdlWURwaTsNCit9Ow0KK0NYRkFfV2lkZ2V0QWNjOjpDWEZBX1dpZGdldEFjYyhDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcsIENYRkFfTm9kZSogcE5vZGUpDQorICAgIDogQ1hGQV9XaWRnZXREYXRhKHBOb2RlKSwNCisgICAgICBtX3BEb2NWaWV3KHBEb2NWaWV3KSwNCisgICAgICBtX3BMYXlvdXREYXRhKE5VTEwpLA0KKyAgICAgIG1fblJlY3Vyc2lvbkRlcHRoKDApIHt9DQorQ1hGQV9XaWRnZXRBY2M6On5DWEZBX1dpZGdldEFjYygpIHsNCisgIGlmIChtX3BMYXlvdXREYXRhKSB7DQorICAgIG1fcExheW91dERhdGEtPlJlbGVhc2UoKTsNCisgICAgbV9wTGF5b3V0RGF0YSA9IE5VTEw7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXRBY2M6OkdldE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSwgaW50MzJfdCBpTmFtZVR5cGUpIHsNCisgIGlmIChpTmFtZVR5cGUgPT0gMCkgew0KKyAgICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7DQorICAgIHJldHVybiAhd3NOYW1lLklzRW1wdHkoKTsNCisgIH0NCisgIG1fcE5vZGUtPkdldFNPTUV4cHJlc3Npb24od3NOYW1lKTsNCisgIGlmIChpTmFtZVR5cGUgPT0gMiAmJiB3c05hbWUuR2V0TGVuZ3RoKCkgPj0gMTUpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzUHJlID0gRlhfV1NUUkMoTCJ4ZmFbMF0uZm9ybVswXS4iKTsNCisgICAgaWYgKHdzUHJlID09IENGWF9XaWRlU3RyaW5nQyh3c05hbWUsIHdzUHJlLkdldExlbmd0aCgpKSkgew0KKyAgICAgIHdzTmFtZS5EZWxldGUoMCwgd3NQcmUuR2V0TGVuZ3RoKCkpOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX1dpZGdldEFjYzo6R2V0RGF0YXNldHMoKSB7DQorICByZXR1cm4gbV9wTm9kZS0+R2V0QmluZERhdGEoKTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldEFjYzo6UHJvY2Vzc1ZhbHVlQ2hhbmdlZCgpIHsNCisgIG1fcERvY1ZpZXctPkFkZFZhbGlkYXRlV2lkZ2V0KHRoaXMpOw0KKyAgbV9wRG9jVmlldy0+QWRkQ2FsY3VsYXRlV2lkZ2V0QWNjKHRoaXMpOw0KKyAgbV9wRG9jVmlldy0+UnVuQ2FsY3VsYXRlV2lkZ2V0cygpOw0KKyAgbV9wRG9jVmlldy0+UnVuVmFsaWRhdGUoKTsNCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpSZXNldERhdGEoKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgWEZBX0VMRU1FTlQgZVVJVHlwZSA9IChYRkFfRUxFTUVOVClHZXRVSVR5cGUoKTsNCisgIHN3aXRjaCAoZVVJVHlwZSkgew0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0ltYWdlRWRpdDogew0KKyAgICAgIENYRkFfVmFsdWUgaW1hZ2VWYWx1ZSA9IEdldERlZmF1bHRWYWx1ZSgpOw0KKyAgICAgIENYRkFfSW1hZ2UgaW1hZ2UgPSBpbWFnZVZhbHVlLkdldEltYWdlKCk7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZSwgd3NIcmVmOw0KKyAgICAgIGlmIChpbWFnZSkgew0KKyAgICAgICAgaW1hZ2UuR2V0Q29udGVudCh3c1ZhbHVlKTsNCisgICAgICAgIGltYWdlLkdldENvbnRlbnRUeXBlKHdzQ29udGVudFR5cGUpOw0KKyAgICAgICAgaW1hZ2UuR2V0SHJlZih3c0hyZWYpOw0KKyAgICAgIH0NCisgICAgICBTZXRJbWFnZUVkaXQod3NDb250ZW50VHlwZSwgd3NIcmVmLCB3c1ZhbHVlKTsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9FeGNsR3JvdXA6IHsNCisgICAgICBDWEZBX05vZGUqIHBOZXh0Q2hpbGQgPSBtX3BOb2RlLT5HZXROb2RlSXRlbSgNCisgICAgICAgICAgWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpOw0KKyAgICAgIHdoaWxlIChwTmV4dENoaWxkKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBDaGlsZCA9IHBOZXh0Q2hpbGQ7DQorICAgICAgICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IChDWEZBX1dpZGdldEFjYyopcENoaWxkLT5HZXRXaWRnZXREYXRhKCk7DQorICAgICAgICBpZiAoIXBBY2MpIHsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBDWEZBX1ZhbHVlIGRlZlZhbHVlKE5VTEwpOw0KKyAgICAgICAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpICYmIChkZWZWYWx1ZSA9IHBBY2MtPkdldERlZmF1bHRWYWx1ZSgpKSkgew0KKyAgICAgICAgICBkZWZWYWx1ZS5HZXRDaGlsZFZhbHVlQ29udGVudCh3c1ZhbHVlKTsNCisgICAgICAgICAgdGhpcy0+U2V0VmFsdWUod3NWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRV9SYXcpOw0KKyAgICAgICAgICBwQWNjLT5TZXRWYWx1ZSh3c1ZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBDWEZBX05vZGUqIHBJdGVtcyA9IHBDaGlsZC0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfSXRlbXMpOw0KKyAgICAgICAgICBpZiAoIXBJdGVtcykgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGl0ZW1UZXh0Ow0KKyAgICAgICAgICBpZiAocEl0ZW1zLT5Db3VudENoaWxkcmVuKFhGQV9FTEVNRU5UX1VOS05PV04pID4gMSkgew0KKyAgICAgICAgICAgIGl0ZW1UZXh0ID0gcEl0ZW1zLT5HZXRDaGlsZCgxLCBYRkFfRUxFTUVOVF9VTktOT1dOKS0+R2V0Q29udGVudCgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHBBY2MtPlNldFZhbHVlKGl0ZW1UZXh0LCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7DQorICAgICAgICB9DQorICAgICAgICBwTmV4dENoaWxkID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKTsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdDoNCisgICAgICBDbGVhckFsbFNlbGVjdGlvbnMoKTsNCisgICAgZGVmYXVsdDoNCisgICAgICBpZiAoQ1hGQV9WYWx1ZSBkZWZWYWx1ZSA9IEdldERlZmF1bHRWYWx1ZSgpKSB7DQorICAgICAgICBkZWZWYWx1ZS5HZXRDaGlsZFZhbHVlQ29udGVudCh3c1ZhbHVlKTsNCisgICAgICB9DQorICAgICAgU2V0VmFsdWUod3NWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRV9SYXcpOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpTZXRJbWFnZUVkaXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NvbnRlbnRUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzSHJlZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0RhdGEpIHsNCisgIENYRkFfSW1hZ2UgaW1hZ2UgPSBHZXRGb3JtVmFsdWUoKS5HZXRJbWFnZSgpOw0KKyAgaWYgKGltYWdlKSB7DQorICAgIGltYWdlLlNldENvbnRlbnRUeXBlKHdzQ29udGVudFR5cGUpOw0KKyAgICBpbWFnZS5TZXRIcmVmKHdzSHJlZik7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdFZhbHVlKHdzRGF0YSk7DQorICB0aGlzLT5HZXRGb3JtYXREYXRhVmFsdWUod3NEYXRhLCB3c0Zvcm1hdFZhbHVlKTsNCisgIG1fcE5vZGUtPlNldENvbnRlbnQod3NEYXRhLCB3c0Zvcm1hdFZhbHVlLCBUUlVFKTsNCisgIENYRkFfTm9kZSogcEJpbmQgPSBHZXREYXRhc2V0cygpOw0KKyAgaWYgKCFwQmluZCkgew0KKyAgICBpbWFnZS5TZXRUcmFuc2ZlckVuY29kaW5nKFhGQV9BVFRSSUJVVEVFTlVNX0Jhc2U2NCk7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBCaW5kLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlKTsNCisgIENYRkFfTm9kZSogcEhyZWZOb2RlID0gcEJpbmQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIGlmIChwSHJlZk5vZGUpIHsNCisgICAgcEhyZWZOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0hyZWYpOw0KKyAgfSBlbHNlIHsNCisgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSA9IHBCaW5kLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICBGWFNZU19hc3NlcnQocFhNTE5vZGUgJiYgcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KTsNCisgICAgKChJRkRFX1hNTEVsZW1lbnQqKXBYTUxOb2RlKS0+U2V0U3RyaW5nKEZYX1dTVFJDKEwiaHJlZiIpLCB3c0hyZWYpOw0KKyAgfQ0KK30NCisNCitDWEZBX1dpZGdldEFjYyogQ1hGQV9XaWRnZXRBY2M6OkdldEV4Y2xHcm91cCgpIHsNCisgIENYRkFfTm9kZSogcEV4Y2wgPSBtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgIGlmICghcEV4Y2wgfHwgcEV4Y2wtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9FeGNsR3JvdXApIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gKENYRkFfV2lkZ2V0QWNjKilwRXhjbC0+R2V0V2lkZ2V0RGF0YSgpOw0KK30NCitDWEZBX0ZGRG9jVmlldyogQ1hGQV9XaWRnZXRBY2M6OkdldERvY1ZpZXcoKSB7DQorICByZXR1cm4gbV9wRG9jVmlldzsNCit9DQorQ1hGQV9GRkRvYyogQ1hGQV9XaWRnZXRBY2M6OkdldERvYygpIHsNCisgIHJldHVybiAoQ1hGQV9GRkRvYyopbV9wRG9jVmlldy0+R2V0RG9jKCk7DQorfQ0KK0NYRkFfRkZBcHAqIENYRkFfV2lkZ2V0QWNjOjpHZXRBcHAoKSB7DQorICByZXR1cm4gR2V0RG9jKCktPkdldEFwcCgpOw0KK30NCitJWEZBX0FwcFByb3ZpZGVyKiBDWEZBX1dpZGdldEFjYzo6R2V0QXBwUHJvdmlkZXIoKSB7DQorICByZXR1cm4gR2V0QXBwKCktPkdldEFwcFByb3ZpZGVyKCk7DQorfQ0KK2ludDMyX3QgQ1hGQV9XaWRnZXRBY2M6OlByb2Nlc3NFdmVudChpbnQzMl90IGlBY3Rpdml0eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSkgew0KKyAgaWYgKHRoaXMtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9EcmF3KSB7DQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgIH0NCisgIGludDMyX3QgaVJldCA9IFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KKyAgQ1hGQV9Ob2RlQXJyYXkgZXZlbnRBcnJheTsNCisgIGludDMyX3QgaUNvdW50cyA9DQorICAgICAgR2V0RXZlbnRCeUFjdGl2aXR5KGlBY3Rpdml0eSwgZXZlbnRBcnJheSwgcEV2ZW50UGFyYW0tPm1fYklzRm9ybVJlYWR5KTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudHM7IGkrKykgew0KKyAgICBDWEZBX0V2ZW50IGV2ZW50KGV2ZW50QXJyYXlbaV0pOw0KKyAgICBpbnQzMl90IHJlc3VsdCA9IFByb2Nlc3NFdmVudChldmVudCwgcEV2ZW50UGFyYW0pOw0KKyAgICBpZiAoaSA9PSAwKSB7DQorICAgICAgaVJldCA9IHJlc3VsdDsNCisgICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gWEZBX0VWRU5URVJST1JfU3VjZXNzKSB7DQorICAgICAgaVJldCA9IHJlc3VsdDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGlSZXQ7DQorfQ0KK2ludDMyX3QgQ1hGQV9XaWRnZXRBY2M6OlByb2Nlc3NFdmVudChDWEZBX0V2ZW50JiBldmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSkgew0KKyAgaWYgKCFldmVudCkgew0KKyAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7DQorICB9DQorICBzd2l0Y2ggKGV2ZW50LkdldEV2ZW50VHlwZSgpKSB7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfRXhlY3V0ZToNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9TY3JpcHQ6IHsNCisgICAgICBDWEZBX1NjcmlwdCBzY3JpcHQgPSBldmVudC5HZXRTY3JpcHQoKTsNCisgICAgICByZXR1cm4gRXhlY3V0ZVNjcmlwdChzY3JpcHQsIHBFdmVudFBhcmFtKTsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9TaWduRGF0YToNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9TdWJtaXQ6IHsNCisgICAgICBDWEZBX1N1Ym1pdCBzdWJtaXQgPSBldmVudC5HZXRTdWJtaXQoKTsNCisgICAgICByZXR1cm4gR2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCktPlN1Ym1pdERhdGEoR2V0RG9jKCksIHN1Ym1pdCk7DQorICAgIH0NCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCit9DQoraW50MzJfdCBDWEZBX1dpZGdldEFjYzo6UHJvY2Vzc0NhbGN1bGF0ZSgpIHsNCisgIGlmICh0aGlzLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRHJhdykgew0KKyAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7DQorICB9DQorICBDWEZBX0NhbGN1bGF0ZSBjYWxjID0gdGhpcy0+R2V0Q2FsY3VsYXRlKCk7DQorICBpZiAoIWNhbGMpIHsNCisgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KKyAgfQ0KKyAgaWYgKHRoaXMtPkdldE5vZGUoKS0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfVXNlckludGVyYWN0aXZlKSkgew0KKyAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRGlzYWJsZWQ7DQorICB9DQorICBDWEZBX0V2ZW50UGFyYW0gRXZlbnRQYXJhbTsNCisgIEV2ZW50UGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9DYWxjdWxhdGU7DQorICBDWEZBX1NjcmlwdCBzY3JpcHQgPSBjYWxjLkdldFNjcmlwdCgpOw0KKyAgaW50MzJfdCBpUmV0ID0gRXhlY3V0ZVNjcmlwdChzY3JpcHQsICZFdmVudFBhcmFtKTsNCisgIGlmIChpUmV0ID09IFhGQV9FVkVOVEVSUk9SX1N1Y2Vzcykgew0KKyAgICBpZiAoR2V0UmF3VmFsdWUoKSAhPSBFdmVudFBhcmFtLm1fd3NSZXN1bHQpIHsNCisgICAgICBGWF9CT09MIGJOb3RpZnkgPSBHZXREb2MoKS0+R2V0RG9jVHlwZSgpID09IFhGQV9ET0NUWVBFX1N0YXRpYzsNCisgICAgICBTZXRWYWx1ZShFdmVudFBhcmFtLm1fd3NSZXN1bHQsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsNCisgICAgICBVcGRhdGVVSURpc3BsYXkoKTsNCisgICAgICBpZiAoYk5vdGlmeSkgew0KKyAgICAgICAgTm90aWZ5RXZlbnQoWEZBX1dJREdFVEVWRU5UX1Bvc3RDb250ZW50Q2hhbmdlZCwgTlVMTCwgTlVMTCwgTlVMTCk7DQorICAgICAgfQ0KKyAgICAgIGlSZXQgPSBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBpUmV0Ow0KK30NCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpQcm9jZXNzU2NyaXB0VGVzdFZhbGlkYXRlKENYRkFfVmFsaWRhdGUgdmFsaWRhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgcFJldFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVyc2lvbkZsYWcpIHsNCisgIGlmIChpUmV0ID09IFhGQV9FVkVOVEVSUk9SX1N1Y2VzcyAmJiBwUmV0VmFsdWUpIHsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzQm9vbGVhbihwUmV0VmFsdWUpICYmICFGWEpTRV9WYWx1ZV9Ub0Jvb2xlYW4ocFJldFZhbHVlKSkgew0KKyAgICAgIElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciA9IEdldEFwcFByb3ZpZGVyKCk7DQorICAgICAgaWYgKCFwQXBwUHJvdmlkZXIpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUaXRsZTsNCisgICAgICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoWEZBX0lEU19BcHBOYW1lLCB3c1RpdGxlKTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1NjcmlwdE1zZzsNCisgICAgICB2YWxpZGF0ZS5HZXRTY3JpcHRNZXNzYWdlVGV4dCh3c1NjcmlwdE1zZyk7DQorICAgICAgaW50MzJfdCBlU2NyaXB0VGVzdCA9IHZhbGlkYXRlLkdldFNjcmlwdFRlc3QoKTsNCisgICAgICBpZiAoZVNjcmlwdFRlc3QgPT0gWEZBX0FUVFJJQlVURUVOVU1fV2FybmluZykgew0KKyAgICAgICAgaWYgKHRoaXMtPkdldE5vZGUoKS0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfVXNlckludGVyYWN0aXZlKSkgew0KKyAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBpZiAod3NTY3JpcHRNc2cuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIEdldFZhbGlkYXRlTWVzc2FnZShwQXBwUHJvdmlkZXIsIHdzU2NyaXB0TXNnLCBGQUxTRSwgYlZlcnNpb25GbGFnKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChiVmVyc2lvbkZsYWcpIHsNCisgICAgICAgICAgcEFwcFByb3ZpZGVyLT5Nc2dCb3god3NTY3JpcHRNc2csIHdzVGl0bGUsIFhGQV9NQklDT05fV2FybmluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX01CX09LKTsNCisgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBBcHBQcm92aWRlci0+TXNnQm94KHdzU2NyaXB0TXNnLCB3c1RpdGxlLCBYRkFfTUJJQ09OX1dhcm5pbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX01CX1llc05vKSA9PSBYRkFfSURZZXMpIHsNCisgICAgICAgICAgdGhpcy0+R2V0Tm9kZSgpLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Vc2VySW50ZXJhY3RpdmUsIFRSVUUsIEZBTFNFKTsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKHdzU2NyaXB0TXNnLklzRW1wdHkoKSkgew0KKyAgICAgICAgICBHZXRWYWxpZGF0ZU1lc3NhZ2UocEFwcFByb3ZpZGVyLCB3c1NjcmlwdE1zZywgVFJVRSwgYlZlcnNpb25GbGFnKTsNCisgICAgICAgIH0NCisgICAgICAgIHBBcHBQcm92aWRlci0+TXNnQm94KHdzU2NyaXB0TXNnLCB3c1RpdGxlLCBYRkFfTUJJQ09OX0Vycm9yLCBYRkFfTUJfT0spOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KK30NCitpbnQzMl90IENYRkFfV2lkZ2V0QWNjOjpQcm9jZXNzRm9ybWF0VGVzdFZhbGlkYXRlKENYRkFfVmFsaWRhdGUgdmFsaWRhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJWZXJzaW9uRmxhZykgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NSYXdWYWx1ZSA9IEdldFJhd1ZhbHVlKCk7DQorICBpZiAoIXdzUmF3VmFsdWUuSXNFbXB0eSgpKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzUGljdHVyZTsNCisgICAgdmFsaWRhdGUuR2V0UGljdHVyZSh3c1BpY3R1cmUpOw0KKyAgICBpZiAod3NQaWN0dXJlLklzRW1wdHkoKSkgew0KKyAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgICAgfQ0KKyAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0TG9jYWwoKTsNCisgICAgaWYgKCFwTG9jYWxlKSB7DQorICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KKyAgICB9DQorICAgIENYRkFfTG9jYWxlVmFsdWUgbGNWYWx1ZSA9IFhGQV9HZXRMb2NhbGVWYWx1ZSh0aGlzKTsNCisgICAgaWYgKCFsY1ZhbHVlLlZhbGlkYXRlVmFsdWUobGNWYWx1ZS5HZXRWYWx1ZSgpLCB3c1BpY3R1cmUsIHBMb2NhbGUpKSB7DQorICAgICAgSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyID0gR2V0QXBwUHJvdmlkZXIoKTsNCisgICAgICBpZiAoIXBBcHBQcm92aWRlcikgew0KKyAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KKyAgICAgIH0NCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdE1zZzsNCisgICAgICB2YWxpZGF0ZS5HZXRGb3JtYXRNZXNzYWdlVGV4dCh3c0Zvcm1hdE1zZyk7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUaXRsZTsNCisgICAgICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoWEZBX0lEU19BcHBOYW1lLCB3c1RpdGxlKTsNCisgICAgICBpbnQzMl90IGVGb3JtYXRUZXN0ID0gdmFsaWRhdGUuR2V0Rm9ybWF0VGVzdCgpOw0KKyAgICAgIGlmIChlRm9ybWF0VGVzdCA9PSBYRkFfQVRUUklCVVRFRU5VTV9FcnJvcikgew0KKyAgICAgICAgaWYgKHdzRm9ybWF0TXNnLklzRW1wdHkoKSkgew0KKyAgICAgICAgICBHZXRWYWxpZGF0ZU1lc3NhZ2UocEFwcFByb3ZpZGVyLCB3c0Zvcm1hdE1zZywgVFJVRSwgYlZlcnNpb25GbGFnKTsNCisgICAgICAgIH0NCisgICAgICAgIHBBcHBQcm92aWRlci0+TXNnQm94KHdzRm9ybWF0TXNnLCB3c1RpdGxlLCBYRkFfTUJJQ09OX0Vycm9yLCBYRkFfTUJfT0spOw0KKyAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX1N1Y2VzczsNCisgICAgICB9DQorICAgICAgaWYgKHRoaXMtPkdldE5vZGUoKS0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfVXNlckludGVyYWN0aXZlKSkgew0KKyAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KKyAgICAgIH0NCisgICAgICBpZiAod3NGb3JtYXRNc2cuSXNFbXB0eSgpKSB7DQorICAgICAgICBHZXRWYWxpZGF0ZU1lc3NhZ2UocEFwcFByb3ZpZGVyLCB3c0Zvcm1hdE1zZywgRkFMU0UsIGJWZXJzaW9uRmxhZyk7DQorICAgICAgfQ0KKyAgICAgIGlmIChiVmVyc2lvbkZsYWcpIHsNCisgICAgICAgIHBBcHBQcm92aWRlci0+TXNnQm94KHdzRm9ybWF0TXNnLCB3c1RpdGxlLCBYRkFfTUJJQ09OX1dhcm5pbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTUJfT0spOw0KKyAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX1N1Y2VzczsNCisgICAgICB9DQorICAgICAgaWYgKHBBcHBQcm92aWRlci0+TXNnQm94KHdzRm9ybWF0TXNnLCB3c1RpdGxlLCBYRkFfTUJJQ09OX1dhcm5pbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9NQl9ZZXNObykgPT0gWEZBX0lEWWVzKSB7DQorICAgICAgICB0aGlzLT5HZXROb2RlKCktPlNldEZsYWcoWEZBX05PREVGTEFHX1VzZXJJbnRlcmFjdGl2ZSwgVFJVRSwgRkFMU0UpOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfU3VjZXNzOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7DQorfQ0KK2ludDMyX3QgQ1hGQV9XaWRnZXRBY2M6OlByb2Nlc3NOdWxsVGVzdFZhbGlkYXRlKENYRkFfVmFsaWRhdGUgdmFsaWRhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmVyc2lvbkZsYWcpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICB0aGlzLT5HZXRWYWx1ZSh3c1ZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7DQorICBpZiAoIXdzVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQorICB9DQorICBpZiAodGhpcy0+bV9iSXNOdWxsICYmICh0aGlzLT5tX2JQcmVOdWxsID09IHRoaXMtPm1fYklzTnVsbCkpIHsNCisgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX1N1Y2VzczsNCisgIH0NCisgIGludDMyX3QgZU51bGxUZXN0ID0gdmFsaWRhdGUuR2V0TnVsbFRlc3QoKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzTnVsbE1zZzsNCisgIHZhbGlkYXRlLkdldE51bGxNZXNzYWdlVGV4dCh3c051bGxNc2cpOw0KKyAgaWYgKGlGbGFncyAmIDB4MDEpIHsNCisgICAgaW50MzJfdCBpUmV0ID0gWEZBX0VWRU5URVJST1JfU3VjZXNzOw0KKyAgICBpZiAoZU51bGxUZXN0ICE9IFhGQV9BVFRSSUJVVEVFTlVNX0Rpc2FibGVkKSB7DQorICAgICAgaVJldCA9IFhGQV9FVkVOVEVSUk9SX0Vycm9yOw0KKyAgICB9DQorICAgIGlmICghd3NOdWxsTXNnLklzRW1wdHkoKSkgew0KKyAgICAgIGlmIChlTnVsbFRlc3QgIT0gWEZBX0FUVFJJQlVURUVOVU1fRGlzYWJsZWQpIHsNCisgICAgICAgIG1fcERvY1ZpZXctPm1fYXJyTnVsbFRlc3RNc2cuQWRkKHdzTnVsbE1zZyk7DQorICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRXJyb3I7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQorICAgIH0NCisgICAgcmV0dXJuIGlSZXQ7DQorICB9DQorICBpZiAod3NOdWxsTXNnLklzRW1wdHkoKSAmJiBiVmVyc2lvbkZsYWcgJiYNCisgICAgICBlTnVsbFRlc3QgIT0gWEZBX0FUVFJJQlVURUVOVU1fRGlzYWJsZWQpIHsNCisgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX0Vycm9yOw0KKyAgfQ0KKyAgSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyID0gR2V0QXBwUHJvdmlkZXIoKTsNCisgIGlmICghcEFwcFByb3ZpZGVyKSB7DQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzQ2FwdGlvbk5hbWU7DQorICBDRlhfV2lkZVN0cmluZyB3c1RpdGxlOw0KKyAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfQXBwTmFtZSwgd3NUaXRsZSk7DQorICBzd2l0Y2ggKGVOdWxsVGVzdCkgew0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0Vycm9yOiB7DQorICAgICAgaWYgKHdzTnVsbE1zZy5Jc0VtcHR5KCkpIHsNCisgICAgICAgIEdldFZhbGlkYXRlQ2FwdGlvbk5hbWUod3NDYXB0aW9uTmFtZSwgYlZlcnNpb25GbGFnKTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRXJyb3I7DQorICAgICAgICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoWEZBX0lEU19WYWxpZGF0ZU51bGxFcnJvciwgd3NFcnJvcik7DQorICAgICAgICB3c051bGxNc2cuRm9ybWF0KHdzRXJyb3IsIChjb25zdCBGWF9XQ0hBUiopd3NDYXB0aW9uTmFtZSk7DQorICAgICAgfQ0KKyAgICAgIHBBcHBQcm92aWRlci0+TXNnQm94KHdzTnVsbE1zZywgd3NUaXRsZSwgWEZBX01CSUNPTl9TdGF0dXMsIFhGQV9NQl9PSyk7DQorICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX0Vycm9yOw0KKyAgICB9DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fV2FybmluZzogew0KKyAgICAgIGlmICh0aGlzLT5HZXROb2RlKCktPkhhc0ZsYWcoWEZBX05PREVGTEFHX1VzZXJJbnRlcmFjdGl2ZSkpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgICBpZiAod3NOdWxsTXNnLklzRW1wdHkoKSkgew0KKyAgICAgICAgR2V0VmFsaWRhdGVDYXB0aW9uTmFtZSh3c0NhcHRpb25OYW1lLCBiVmVyc2lvbkZsYWcpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NXYXJuaW5nOw0KKyAgICAgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfVmFsaWRhdGVOdWxsV2FybmluZywgd3NXYXJuaW5nKTsNCisgICAgICAgIHdzTnVsbE1zZy5Gb3JtYXQod3NXYXJuaW5nLCAoY29uc3QgRlhfV0NIQVIqKXdzQ2FwdGlvbk5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBGWF9XQ0hBUiopd3NDYXB0aW9uTmFtZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwQXBwUHJvdmlkZXItPk1zZ0JveCh3c051bGxNc2csIHdzVGl0bGUsIFhGQV9NQklDT05fV2FybmluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX01CX1llc05vKSA9PSBYRkFfSURZZXMpIHsNCisgICAgICAgIHRoaXMtPkdldE5vZGUoKS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVXNlckludGVyYWN0aXZlLCBUUlVFLCBGQUxTRSk7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9FcnJvcjsNCisgICAgfQ0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0Rpc2FibGVkOg0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX1N1Y2VzczsNCit9DQordm9pZCBDWEZBX1dpZGdldEFjYzo6R2V0VmFsaWRhdGVDYXB0aW9uTmFtZShDRlhfV2lkZVN0cmluZyYgd3NDYXB0aW9uTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZlcnNpb25GbGFnKSB7DQorICBpZiAoIWJWZXJzaW9uRmxhZykgew0KKyAgICBDWEZBX0NhcHRpb24gY2FwdGlvbiA9IEdldENhcHRpb24oKTsNCisgICAgaWYgKGNhcHRpb24pIHsNCisgICAgICBDWEZBX1ZhbHVlIGNhcFZhbHVlID0gY2FwdGlvbi5HZXRWYWx1ZSgpOw0KKyAgICAgIGlmIChjYXBWYWx1ZSkgew0KKyAgICAgICAgQ1hGQV9UZXh0IGNhcFRleHQgPSBjYXBWYWx1ZS5HZXRUZXh0KCk7DQorICAgICAgICBpZiAoY2FwVGV4dCkgew0KKyAgICAgICAgICBjYXBUZXh0LkdldENvbnRlbnQod3NDYXB0aW9uTmFtZSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAod3NDYXB0aW9uTmFtZS5Jc0VtcHR5KCkpIHsNCisgICAgR2V0TmFtZSh3c0NhcHRpb25OYW1lKTsNCisgIH0NCit9DQordm9pZCBDWEZBX1dpZGdldEFjYzo6R2V0VmFsaWRhdGVNZXNzYWdlKElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTWVzc2FnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRXJyb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZlcnNpb25GbGFnKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c0NhcHRpb25OYW1lOw0KKyAgR2V0VmFsaWRhdGVDYXB0aW9uTmFtZSh3c0NhcHRpb25OYW1lLCBiVmVyc2lvbkZsYWcpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NFcnJvcjsNCisgIGlmIChiVmVyc2lvbkZsYWcpIHsNCisgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfVmFsaWRhdGVGYWlsZWQsIHdzRXJyb3IpOw0KKyAgICB3c01lc3NhZ2UuRm9ybWF0KHdzRXJyb3IsIChjb25zdCBGWF9XQ0hBUiopd3NDYXB0aW9uTmFtZSk7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChiRXJyb3IpIHsNCisgICAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfVmFsaWRhdGVFcnJvciwgd3NFcnJvcik7DQorICAgIHdzTWVzc2FnZS5Gb3JtYXQod3NFcnJvciwgKGNvbnN0IEZYX1dDSEFSKil3c0NhcHRpb25OYW1lKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NXYXJuaW5nOw0KKyAgcEFwcFByb3ZpZGVyLT5Mb2FkU3RyaW5nKFhGQV9JRFNfVmFsaWRhdGVXYXJuaW5nLCB3c1dhcm5pbmcpOw0KKyAgd3NNZXNzYWdlLkZvcm1hdCh3c1dhcm5pbmcsIChjb25zdCBGWF9XQ0hBUiopd3NDYXB0aW9uTmFtZSwNCisgICAgICAgICAgICAgICAgICAgKGNvbnN0IEZYX1dDSEFSKil3c0NhcHRpb25OYW1lKTsNCit9DQoraW50MzJfdCBDWEZBX1dpZGdldEFjYzo6UHJvY2Vzc1ZhbGlkYXRlKGludDMyX3QgaUZsYWdzKSB7DQorICBpZiAodGhpcy0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0RyYXcpIHsNCisgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KKyAgfQ0KKyAgQ1hGQV9WYWxpZGF0ZSB2YWxpZGF0ZSA9IHRoaXMtPkdldFZhbGlkYXRlKCk7DQorICBpZiAoIXZhbGlkYXRlKSB7DQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgIH0NCisgIEZYX0JPT0wgYkluaXREb2MgPSAoKENYRkFfTm9kZSopdmFsaWRhdGUpLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19OZWVkc0luaXRBcHApOw0KKyAgRlhfQk9PTCBiU3RhdHVzID0NCisgICAgICBtX3BEb2NWaWV3LT5HZXRMYXlvdXRTdGF0dXMoKSA8IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19FbmQ7DQorICBpbnQzMl90IGlGb3JtYXQgPSAwOw0KKyAgRlhKU0VfSFZBTFVFIHBSZXRWYWx1ZSA9IE5VTEw7DQorICBpbnQzMl90IGlSZXQgPSBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgIENYRkFfU2NyaXB0IHNjcmlwdCA9IHZhbGlkYXRlLkdldFNjcmlwdCgpOw0KKyAgaWYgKHNjcmlwdCkgew0KKyAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOw0KKyAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9WYWxpZGF0ZTsNCisgICAgZVBhcmFtLm1fcFRhcmdldCA9IHRoaXM7DQorICAgIGlSZXQgPSBFeGVjdXRlU2NyaXB0KA0KKyAgICAgICAgc2NyaXB0LCAmZVBhcmFtLA0KKyAgICAgICAgKChiSW5pdERvYyB8fCBiU3RhdHVzKSAmJiB0aGlzLT5HZXRSYXdWYWx1ZSgpLklzRW1wdHkoKSkgPyBOVUxMDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICZwUmV0VmFsdWUpOw0KKyAgfQ0KKyAgWEZBX1ZFUlNJT04gdmVyc2lvbiA9IEdldERvYygpLT5HZXRYRkFEb2MoKS0+R2V0Q3VyVmVyc2lvbk1vZGUoKTsNCisgIEZYX0JPT0wgYlZlcnNpb25GbGFnID0gRkFMU0U7DQorICBpZiAodmVyc2lvbiA8IFhGQV9WRVJTSU9OXzIwOCkgew0KKyAgICBiVmVyc2lvbkZsYWcgPSBUUlVFOw0KKyAgfQ0KKyAgaWYgKGJJbml0RG9jKSB7DQorICAgICgoQ1hGQV9Ob2RlKil2YWxpZGF0ZSktPlNldEZsYWcoWEZBX05PREVGTEFHX05lZWRzSW5pdEFwcCwgRkFMU0UsIEZBTFNFKTsNCisgIH0gZWxzZSB7DQorICAgIGlGb3JtYXQgPSBQcm9jZXNzRm9ybWF0VGVzdFZhbGlkYXRlKHZhbGlkYXRlLCBiVmVyc2lvbkZsYWcpOw0KKyAgICBpZiAoIWJWZXJzaW9uRmxhZykgew0KKyAgICAgIGJWZXJzaW9uRmxhZyA9IEdldERvYygpLT5HZXRYRkFEb2MoKS0+SGFzRmxhZyhYRkFfRE9DRkxBR19TY3JpcHRpbmcpOw0KKyAgICB9DQorICAgIGlSZXQgfD0gUHJvY2Vzc051bGxUZXN0VmFsaWRhdGUodmFsaWRhdGUsIGlGbGFncywgYlZlcnNpb25GbGFnKTsNCisgIH0NCisgIGlmIChpRm9ybWF0ICE9IFhGQV9FVkVOVEVSUk9SX1N1Y2Vzcykgew0KKyAgICBQcm9jZXNzU2NyaXB0VGVzdFZhbGlkYXRlKHZhbGlkYXRlLCBpUmV0LCBwUmV0VmFsdWUsIGJWZXJzaW9uRmxhZyk7DQorICB9DQorICBpZiAocFJldFZhbHVlKSB7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocFJldFZhbHVlKTsNCisgIH0NCisgIHJldHVybiBpUmV0IHwgaUZvcm1hdDsNCit9DQoraW50MzJfdCBDWEZBX1dpZGdldEFjYzo6RXhlY3V0ZVNjcmlwdChDWEZBX1NjcmlwdCBzY3JpcHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0V2ZW50UGFyYW0qIHBFdmVudFBhcmFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFKiBwUmV0VmFsdWUpIHsNCisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNQVhfUkVDVVJTSU9OX0RFUFRIID0gMjsNCisgIGlmIChtX25SZWN1cnNpb25EZXB0aCA+IE1BWF9SRUNVUlNJT05fREVQVEgpDQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNlc3M7DQorICBGWFNZU19hc3NlcnQocEV2ZW50UGFyYW0pOw0KKyAgaWYgKCFzY3JpcHQpIHsNCisgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KKyAgfQ0KKyAgaWYgKHNjcmlwdC5HZXRSdW5BdCgpID09IFhGQV9BVFRSSUJVVEVFTlVNX1NlcnZlcikgew0KKyAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRGlzYWJsZWQ7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb247DQorICBzY3JpcHQuR2V0RXhwcmVzc2lvbih3c0V4cHJlc3Npb24pOw0KKyAgaWYgKHdzRXhwcmVzc2lvbi5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KKyAgfQ0KKyAgWEZBX1NDUklQVFRZUEUgZVNjcmlwdFR5cGUgPSBzY3JpcHQuR2V0Q29udGVudFR5cGUoKTsNCisgIGlmIChlU2NyaXB0VHlwZSA9PSBYRkFfU0NSSVBUVFlQRV9Vbmtvd24pIHsNCisgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX1N1Y2VzczsNCisgIH0NCisgIENYRkFfRkZEb2MqIHBEb2MgPSBHZXREb2MoKTsNCisgIElYRkFfU2NyaXB0Q29udGV4dCogcENvbnRleHQgPSBwRG9jLT5HZXRYRkFEb2MoKS0+R2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgcENvbnRleHQtPlNldEV2ZW50UGFyYW0ocEV2ZW50UGFyYW0pOw0KKyAgcENvbnRleHQtPlNldFJ1bkF0VHlwZSgoWEZBX0FUVFJJQlVURUVOVU0pc2NyaXB0LkdldFJ1bkF0KCkpOw0KKyAgQ1hGQV9Ob2RlQXJyYXkgcmVmTm9kZXM7DQorICBpZiAocEV2ZW50UGFyYW0tPm1fZVR5cGUgPT0gWEZBX0VWRU5UX0luaXRDYWxjdWxhdGUgfHwNCisgICAgICBwRXZlbnRQYXJhbS0+bV9lVHlwZSA9PSBYRkFfRVZFTlRfQ2FsY3VsYXRlKSB7DQorICAgIHBDb250ZXh0LT5TZXROb2Rlc09mUnVuU2NyaXB0KCZyZWZOb2Rlcyk7DQorICB9DQorICBGWEpTRV9IVkFMVUUgaFJldFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKHBDb250ZXh0LT5HZXRSdW50aW1lKCkpOw0KKyAgKyttX25SZWN1cnNpb25EZXB0aDsNCisgIEZYX0JPT0wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoKFhGQV9TQ1JJUFRMQU5HVFlQRSllU2NyaXB0VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NFeHByZXNzaW9uLCBoUmV0VmFsdWUsIG1fcE5vZGUpOw0KKyAgLS1tX25SZWN1cnNpb25EZXB0aDsNCisgIGludDMyX3QgaVJldCA9IFhGQV9FVkVOVEVSUk9SX0Vycm9yOw0KKyAgaWYgKGJSZXQpIHsNCisgICAgaVJldCA9IFhGQV9FVkVOVEVSUk9SX1N1Y2VzczsNCisgICAgaWYgKHBFdmVudFBhcmFtLT5tX2VUeXBlID09IFhGQV9FVkVOVF9DYWxjdWxhdGUgfHwNCisgICAgICAgIHBFdmVudFBhcmFtLT5tX2VUeXBlID09IFhGQV9FVkVOVF9Jbml0Q2FsY3VsYXRlKSB7DQorICAgICAgaWYgKCFGWEpTRV9WYWx1ZV9Jc1VuZGVmaW5lZChoUmV0VmFsdWUpKSB7DQorICAgICAgICBpZiAoIUZYSlNFX1ZhbHVlX0lzTnVsbChoUmV0VmFsdWUpKSB7DQorICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzU3RyaW5nOw0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFJldFZhbHVlLCBic1N0cmluZyk7DQorICAgICAgICAgIHBFdmVudFBhcmFtLT5tX3dzUmVzdWx0ID0NCisgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1N0cmluZywgYnNTdHJpbmcuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaVJldCA9IFhGQV9FVkVOVEVSUk9SX1N1Y2VzczsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaVJldCA9IFhGQV9FVkVOVEVSUk9SX0Vycm9yOw0KKyAgICAgIH0NCisgICAgICBpZiAocEV2ZW50UGFyYW0tPm1fZVR5cGUgPT0gWEZBX0VWRU5UX0luaXRDYWxjdWxhdGUpIHsNCisgICAgICAgIGlmICgoaVJldCA9PSBYRkFfRVZFTlRFUlJPUl9TdWNlc3MpICYmDQorICAgICAgICAgICAgKEdldFJhd1ZhbHVlKCkgIT0gcEV2ZW50UGFyYW0tPm1fd3NSZXN1bHQpKSB7DQorICAgICAgICAgIFNldFZhbHVlKHBFdmVudFBhcmFtLT5tX3dzUmVzdWx0LCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7DQorICAgICAgICAgIG1fcERvY1ZpZXctPkFkZFZhbGlkYXRlV2lkZ2V0KHRoaXMpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpbnQzMl90IGlSZWZzID0gcmVmTm9kZXMuR2V0U2l6ZSgpOw0KKyAgICAgIGZvciAoaW50MzJfdCByID0gMDsgciA8IGlSZWZzOyByKyspIHsNCisgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwUmVmQWNjID0gKENYRkFfV2lkZ2V0QWNjKilyZWZOb2Rlc1tyXS0+R2V0V2lkZ2V0RGF0YSgpOw0KKyAgICAgICAgaWYgKHBSZWZBY2MgJiYgcFJlZkFjYyA9PSB0aGlzKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwUmVmTm9kZSA9IHJlZk5vZGVzW3JdOw0KKyAgICAgICAgQ1hGQV9DYWxjRGF0YSogcEdsb2JhbERhdGEgPQ0KKyAgICAgICAgICAgIChDWEZBX0NhbGNEYXRhKilwUmVmTm9kZS0+R2V0VXNlckRhdGEoWEZBX0NhbGNEYXRhKTsNCisgICAgICAgIGlmICghcEdsb2JhbERhdGEpIHsNCisgICAgICAgICAgcEdsb2JhbERhdGEgPSBuZXcgQ1hGQV9DYWxjRGF0YTsNCisgICAgICAgICAgcFJlZk5vZGUtPlNldFVzZXJEYXRhKFhGQV9DYWxjRGF0YSwgcEdsb2JhbERhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3NfWEZBRGVsZXRlQ2FsY0RhdGEpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBHbG9iYWxEYXRhLT5tX0dsb2JhbHMuRmluZCh0aGlzKSA8IDApIHsNCisgICAgICAgICAgcEdsb2JhbERhdGEtPm1fR2xvYmFscy5BZGQodGhpcyk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAocFJldFZhbHVlKSB7DQorICAgICpwUmV0VmFsdWUgPSBoUmV0VmFsdWU7DQorICB9IGVsc2Ugew0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhSZXRWYWx1ZSk7DQorICB9DQorICBwQ29udGV4dC0+U2V0Tm9kZXNPZlJ1blNjcmlwdChOVUxMKTsNCisgIHJldHVybiBpUmV0Ow0KK30NCitDWEZBX0ZGV2lkZ2V0KiBDWEZBX1dpZGdldEFjYzo6R2V0TmV4dFdpZGdldChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXQgPSBudWxscHRyOw0KKyAgaWYgKHBXaWRnZXQpIHsNCisgICAgcExheW91dCA9IHBXaWRnZXQtPkdldE5leHQoKTsNCisgIH0gZWxzZSB7DQorICAgIHBMYXlvdXQgPSBtX3BEb2NWaWV3LT5HZXRYRkFMYXlvdXQoKS0+R2V0TGF5b3V0SXRlbShtX3BOb2RlKTsNCisgIH0NCisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4ocExheW91dCk7DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXRBY2M6OlVwZGF0ZVVJRGlzcGxheShDWEZBX0ZGV2lkZ2V0KiBwRXhjZXB0KSB7DQorICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gTlVMTDsNCisgIHdoaWxlICgocFdpZGdldCA9IHRoaXMtPkdldE5leHRXaWRnZXQocFdpZGdldCkpICE9IE5VTEwpIHsNCisgICAgaWYgKHBXaWRnZXQgPT0gcEV4Y2VwdCB8fCAhcFdpZGdldC0+SXNMb2FkZWQoKSB8fA0KKyAgICAgICAgKEdldFVJVHlwZSgpICE9IFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uICYmIHBXaWRnZXQtPklzRm9jdXNlZCgpKSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIHBXaWRnZXQtPlVwZGF0ZUZXTERhdGEoKTsNCisgICAgcFdpZGdldC0+QWRkSW52YWxpZGF0ZVJlY3QoKTsNCisgIH0NCit9DQordm9pZCBDWEZBX1dpZGdldEFjYzo6Tm90aWZ5RXZlbnQoRlhfRFdPUkQgZHdFdmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwQWRkaXRpb25hbCkgew0KKyAgSVhGQV9Eb2NQcm92aWRlciogcERvY1Byb3ZpZGVyID0gR2V0RG9jKCktPkdldERvY1Byb3ZpZGVyKCk7DQorICBpZiAocFdpZGdldCkgew0KKyAgICBwRG9jUHJvdmlkZXItPldpZGdldEV2ZW50KHBXaWRnZXQsIHRoaXMsIGR3RXZlbnQsIHBQYXJhbSwgcEFkZGl0aW9uYWwpOw0KKyAgfSBlbHNlIHsNCisgICAgcFdpZGdldCA9IEdldE5leHRXaWRnZXQocFdpZGdldCk7DQorICAgIGlmIChwV2lkZ2V0ID09IE5VTEwpIHsNCisgICAgICBwRG9jUHJvdmlkZXItPldpZGdldEV2ZW50KE5VTEwsIHRoaXMsIGR3RXZlbnQsIHBQYXJhbSwgcEFkZGl0aW9uYWwpOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICB3aGlsZSAocFdpZGdldCkgew0KKyAgICAgIHBEb2NQcm92aWRlci0+V2lkZ2V0RXZlbnQocFdpZGdldCwgdGhpcywgZHdFdmVudCwgcFBhcmFtLCBwQWRkaXRpb25hbCk7DQorICAgICAgcFdpZGdldCA9IEdldE5leHRXaWRnZXQocFdpZGdldCk7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDWEZBX1dpZGdldEFjYzo6Q2FsY0NhcHRpb25TaXplKENGWF9TaXplRiYgc3pDYXApIHsNCisgIENYRkFfQ2FwdGlvbiBjYXB0aW9uID0gdGhpcy0+R2V0Q2FwdGlvbigpOw0KKyAgaWYgKCFjYXB0aW9uLklzRXhpc3RJblhNTCgpIHx8DQorICAgICAgY2FwdGlvbi5HZXRQcmVzZW5jZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgTG9hZENhcHRpb24oKTsNCisgIFhGQV9FTEVNRU5UIGVVSVR5cGUgPSAoWEZBX0VMRU1FTlQpR2V0VUlUeXBlKCk7DQorICBpbnQzMl90IGlDYXBQbGFjZW1lbnQgPSBjYXB0aW9uLkdldFBsYWNlbWVudFR5cGUoKTsNCisgIEZYX0ZMT0FUIGZDYXBSZXNlcnZlID0gY2FwdGlvbi5HZXRSZXNlcnZlKCk7DQorICBGWF9CT09MIGJWZXJ0ID0gaUNhcFBsYWNlbWVudCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Ub3AgfHwNCisgICAgICAgICAgICAgICAgICBpQ2FwUGxhY2VtZW50ID09IFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbTsNCisgIEZYX0JPT0wgYlJlc2VydmVFeGl0ID0gZkNhcFJlc2VydmUgPiAwLjAxOw0KKyAgQ1hGQV9UZXh0TGF5b3V0KiBwQ2FwVGV4dExheW91dCA9DQorICAgICAgKChDWEZBX0ZpZWxkTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcENhcFRleHRMYXlvdXQ7DQorICBpZiAocENhcFRleHRMYXlvdXQpIHsNCisgICAgaWYgKCFiVmVydCAmJiBlVUlUeXBlICE9IFhGQV9FTEVNRU5UX0J1dHRvbikgew0KKyAgICAgIHN6Q2FwLnggPSBmQ2FwUmVzZXJ2ZTsNCisgICAgfQ0KKyAgICBDRlhfU2l6ZUYgbWluU2l6ZTsNCisgICAgbWluU2l6ZS5TZXQoMCwgMCk7DQorICAgIHBDYXBUZXh0TGF5b3V0LT5DYWxjU2l6ZShtaW5TaXplLCBzekNhcCwgc3pDYXApOw0KKyAgICBpZiAoYlJlc2VydmVFeGl0KSB7DQorICAgICAgYlZlcnQgPyBzekNhcC55ID0gZkNhcFJlc2VydmUgOiBzekNhcC54ID0gZkNhcFJlc2VydmU7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IDEwLjBmOw0KKyAgICBpZiAoQ1hGQV9Gb250IGZvbnQgPSBjYXB0aW9uLkdldEZvbnQoKSkgew0KKyAgICAgIGZGb250U2l6ZSA9IGZvbnQuR2V0Rm9udFNpemUoKTsNCisgICAgfSBlbHNlIGlmIChDWEZBX0ZvbnQgd2lkZ2V0Zm9udCA9IEdldEZvbnQoKSkgew0KKyAgICAgIGZGb250U2l6ZSA9IHdpZGdldGZvbnQuR2V0Rm9udFNpemUoKTsNCisgICAgfQ0KKyAgICBpZiAoYlZlcnQpIHsNCisgICAgICBzekNhcC55ID0gZkNhcFJlc2VydmUgPiAwID8gZkNhcFJlc2VydmUgOiBmRm9udFNpemU7DQorICAgIH0gZWxzZSB7DQorICAgICAgc3pDYXAueCA9IGZDYXBSZXNlcnZlID4gMCA/IGZDYXBSZXNlcnZlIDogMDsNCisgICAgICBzekNhcC55ID0gZkZvbnRTaXplOw0KKyAgICB9DQorICB9DQorICBpZiAoQ1hGQV9NYXJnaW4gbWdDYXAgPSBjYXB0aW9uLkdldE1hcmdpbigpKSB7DQorICAgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQsIGZUb3BJbnNldCwgZlJpZ2h0SW5zZXQsIGZCb3R0b21JbnNldDsNCisgICAgbWdDYXAuR2V0TGVmdEluc2V0KGZMZWZ0SW5zZXQpOw0KKyAgICBtZ0NhcC5HZXRUb3BJbnNldChmVG9wSW5zZXQpOw0KKyAgICBtZ0NhcC5HZXRSaWdodEluc2V0KGZSaWdodEluc2V0KTsNCisgICAgbWdDYXAuR2V0Qm90dG9tSW5zZXQoZkJvdHRvbUluc2V0KTsNCisgICAgaWYgKGJSZXNlcnZlRXhpdCkgew0KKyAgICAgIGJWZXJ0ID8gKHN6Q2FwLnggKz0gZkxlZnRJbnNldCArIGZSaWdodEluc2V0KQ0KKyAgICAgICAgICAgIDogKHN6Q2FwLnkgKz0gZlRvcEluc2V0ICsgZkJvdHRvbUluc2V0KTsNCisgICAgfSBlbHNlIHsNCisgICAgICBzekNhcC54ICs9IGZMZWZ0SW5zZXQgKyBmUmlnaHRJbnNldDsNCisgICAgICBzekNhcC55ICs9IGZUb3BJbnNldCArIGZCb3R0b21JbnNldDsNCisgICAgfQ0KKyAgfQ0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0QWNjOjpDYWxjdWxhdGVGaWVsZEF1dG9TaXplKENGWF9TaXplRiYgc2l6ZSkgew0KKyAgQ0ZYX1NpemVGIHN6Q2FwOw0KKyAgc3pDYXAuU2V0KDAsIDApOw0KKyAgQ2FsY0NhcHRpb25TaXplKHN6Q2FwKTsNCisgIENGWF9SZWN0RiBydFVJTWFyZ2luOw0KKyAgR2V0VUlNYXJnaW4ocnRVSU1hcmdpbik7DQorICBzaXplLnggKz0gcnRVSU1hcmdpbi5sZWZ0ICsgcnRVSU1hcmdpbi53aWR0aDsNCisgIHNpemUueSArPSBydFVJTWFyZ2luLnRvcCArIHJ0VUlNYXJnaW4uaGVpZ2h0Ow0KKyAgaWYgKHN6Q2FwLnggPiAwICYmIHN6Q2FwLnkgPiAwKSB7DQorICAgIGludDMyX3QgaUNhcFBsYWNlbWVudCA9IHRoaXMtPkdldENhcHRpb24oKS5HZXRQbGFjZW1lbnRUeXBlKCk7DQorICAgIHN3aXRjaCAoaUNhcFBsYWNlbWVudCkgew0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTGVmdDoNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSW5saW5lOiB7DQorICAgICAgICBzaXplLnggKz0gc3pDYXAueDsNCisgICAgICAgIHNpemUueSA9IHN0ZDo6bWF4KHNpemUueSwgc3pDYXAueSk7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvcDoNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbTogew0KKyAgICAgICAgc2l6ZS55ICs9IHN6Q2FwLnk7DQorICAgICAgICBzaXplLnggPSBzdGQ6Om1heChzaXplLngsIHN6Q2FwLngpOw0KKyAgICAgIH0NCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBDYWxjdWxhdGVXaWRnZXRBdXRvU2l6ZShzaXplKTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlV2lkZ2V0QXV0b1NpemUoQ0ZYX1NpemVGJiBzaXplKSB7DQorICBDWEZBX01hcmdpbiBtZ1dpZGdldCA9IHRoaXMtPkdldE1hcmdpbigpOw0KKyAgaWYgKG1nV2lkZ2V0LklzRXhpc3RJblhNTCgpKSB7DQorICAgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQsIGZUb3BJbnNldCwgZlJpZ2h0SW5zZXQsIGZCb3R0b21JbnNldDsNCisgICAgbWdXaWRnZXQuR2V0TGVmdEluc2V0KGZMZWZ0SW5zZXQpOw0KKyAgICBtZ1dpZGdldC5HZXRUb3BJbnNldChmVG9wSW5zZXQpOw0KKyAgICBtZ1dpZGdldC5HZXRSaWdodEluc2V0KGZSaWdodEluc2V0KTsNCisgICAgbWdXaWRnZXQuR2V0Qm90dG9tSW5zZXQoZkJvdHRvbUluc2V0KTsNCisgICAgc2l6ZS54ICs9IGZMZWZ0SW5zZXQgKyBmUmlnaHRJbnNldDsNCisgICAgc2l6ZS55ICs9IGZUb3BJbnNldCArIGZCb3R0b21JbnNldDsNCisgIH0NCisgIENYRkFfUGFyYSBwYXJhID0gdGhpcy0+R2V0UGFyYSgpOw0KKyAgaWYgKHBhcmEuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgc2l6ZS54ICs9IHBhcmEuR2V0TWFyZ2luTGVmdCgpOw0KKyAgICBzaXplLnggKz0gcGFyYS5HZXRUZXh0SW5kZW50KCk7DQorICB9DQorICBGWF9GTE9BVCBmVmFsID0gMCwgZk1pbiA9IDAsIGZNYXggPSAwOw0KKyAgaWYgKHRoaXMtPkdldFdpZHRoKGZWYWwpKSB7DQorICAgIHNpemUueCA9IGZWYWw7DQorICB9IGVsc2Ugew0KKyAgICBpZiAodGhpcy0+R2V0TWluV2lkdGgoZk1pbikpIHsNCisgICAgICBzaXplLnggPSBzdGQ6Om1heChzaXplLngsIGZNaW4pOw0KKyAgICB9DQorICAgIGlmICh0aGlzLT5HZXRNYXhXaWR0aChmTWF4KSAmJiBmTWF4ID4gMCkgew0KKyAgICAgIHNpemUueCA9IHN0ZDo6bWluKHNpemUueCwgZk1heCk7DQorICAgIH0NCisgIH0NCisgIGZWYWwgPSAwLCBmTWluID0gMCwgZk1heCA9IDA7DQorICBpZiAodGhpcy0+R2V0SGVpZ2h0KGZWYWwpKSB7DQorICAgIHNpemUueSA9IGZWYWw7DQorICB9IGVsc2Ugew0KKyAgICBpZiAodGhpcy0+R2V0TWluSGVpZ2h0KGZNaW4pKSB7DQorICAgICAgc2l6ZS55ID0gc3RkOjptYXgoc2l6ZS55LCBmTWluKTsNCisgICAgfQ0KKyAgICBpZiAodGhpcy0+R2V0TWF4SGVpZ2h0KGZNYXgpICYmIGZNYXggPiAwKSB7DQorICAgICAgc2l6ZS55ID0gc3RkOjptaW4oc2l6ZS55LCBmTWF4KTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXRBY2M6OkNhbGN1bGF0ZVRleHRDb250ZW50U2l6ZShDRlhfU2l6ZUYmIHNpemUpIHsNCisgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IEdldEZvbnRTaXplKCk7DQorICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7DQorICB0aGlzLT5HZXRWYWx1ZSh3c1RleHQsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7DQorICBpZiAod3NUZXh0LklzRW1wdHkoKSkgew0KKyAgICBzaXplLnkgKz0gZkZvbnRTaXplOw0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9XQ0hBUiB3Y0VudGVyID0gJ1xuJzsNCisgIEZYX1dDSEFSIHdzTGFzdCA9IHdzVGV4dC5HZXRBdCh3c1RleHQuR2V0TGVuZ3RoKCkgLSAxKTsNCisgIGlmICh3c0xhc3QgPT0gd2NFbnRlcikgew0KKyAgICB3c1RleHQgPSB3c1RleHQgKyB3Y0VudGVyOw0KKyAgfQ0KKyAgaWYgKCEoKENYRkFfRmllbGRMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wVGV4dE91dCkgew0KKyAgICAoKENYRkFfRmllbGRMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wVGV4dE91dCA9IElGREVfVGV4dE91dDo6Q3JlYXRlKCk7DQorICAgIElGREVfVGV4dE91dCogcFRleHRPdXQgPSAoKENYRkFfRmllbGRMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wVGV4dE91dDsNCisgICAgcFRleHRPdXQtPlNldEZvbnQoR2V0RkRFRm9udCgpKTsNCisgICAgcFRleHRPdXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7DQorICAgIHBUZXh0T3V0LT5TZXRMaW5lQnJlYWtUb2xlcmFuY2UoZkZvbnRTaXplICogMC4yZik7DQorICAgIHBUZXh0T3V0LT5TZXRMaW5lU3BhY2UoR2V0TGluZUhlaWdodCgpKTsNCisgICAgRlhfRFdPUkQgZHdTdHlsZXMgPSBGREVfVFRPU1RZTEVfTGFzdExpbmVIZWlnaHQ7DQorICAgIGlmIChHZXRVSVR5cGUoKSA9PSBYRkFfRUxFTUVOVF9UZXh0RWRpdCAmJiBJc011bHRpTGluZSgpKSB7DQorICAgICAgZHdTdHlsZXMgfD0gRkRFX1RUT1NUWUxFX0xpbmVXcmFwOw0KKyAgICB9DQorICAgIHBUZXh0T3V0LT5TZXRTdHlsZXMoZHdTdHlsZXMpOw0KKyAgfQ0KKyAgKChDWEZBX0ZpZWxkTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSkNCisgICAgICAtPm1fcFRleHRPdXQtPkNhbGNMb2dpY1NpemUod3NUZXh0LCB3c1RleHQuR2V0TGVuZ3RoKCksIHNpemUpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0QWNjOjpDYWxjdWxhdGVUZXh0RWRpdEF1dG9TaXplKENGWF9TaXplRiYgc2l6ZSkgew0KKyAgaWYgKHNpemUueCA+IDApIHsNCisgICAgQ0ZYX1NpemVGIHN6T3J6ID0gc2l6ZTsNCisgICAgQ0ZYX1NpemVGIHN6Q2FwOw0KKyAgICBzekNhcC5TZXQoMCwgMCk7DQorICAgIENhbGNDYXB0aW9uU2l6ZShzekNhcCk7DQorICAgIEZYX0JPT0wgYkNhcEV4aXQgPSBzekNhcC54ID4gMC4wMSAmJiBzekNhcC55ID4gMC4wMTsNCisgICAgaW50MzJfdCBpQ2FwUGxhY2VtZW50ID0gWEZBX0FUVFJJQlVURUVOVU1fVW5rbm93bjsNCisgICAgaWYgKGJDYXBFeGl0KSB7DQorICAgICAgaUNhcFBsYWNlbWVudCA9IHRoaXMtPkdldENhcHRpb24oKS5HZXRQbGFjZW1lbnRUeXBlKCk7DQorICAgICAgc3dpdGNoIChpQ2FwUGxhY2VtZW50KSB7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ6DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9JbmxpbmU6IHsNCisgICAgICAgICAgc2l6ZS54IC09IHN6Q2FwLng7DQorICAgICAgICB9DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgQ0ZYX1JlY3RGIHJ0VUlNYXJnaW47DQorICAgIEdldFVJTWFyZ2luKHJ0VUlNYXJnaW4pOw0KKyAgICBzaXplLnggLT0gcnRVSU1hcmdpbi5sZWZ0ICsgcnRVSU1hcmdpbi53aWR0aDsNCisgICAgQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSB0aGlzLT5HZXRNYXJnaW4oKTsNCisgICAgaWYgKG1nV2lkZ2V0LklzRXhpc3RJblhNTCgpKSB7DQorICAgICAgRlhfRkxPQVQgZkxlZnRJbnNldCwgZlJpZ2h0SW5zZXQ7DQorICAgICAgbWdXaWRnZXQuR2V0TGVmdEluc2V0KGZMZWZ0SW5zZXQpOw0KKyAgICAgIG1nV2lkZ2V0LkdldFJpZ2h0SW5zZXQoZlJpZ2h0SW5zZXQpOw0KKyAgICAgIHNpemUueCAtPSBmTGVmdEluc2V0ICsgZlJpZ2h0SW5zZXQ7DQorICAgIH0NCisgICAgQ2FsY3VsYXRlVGV4dENvbnRlbnRTaXplKHNpemUpOw0KKyAgICBzaXplLnkgKz0gcnRVSU1hcmdpbi50b3AgKyBydFVJTWFyZ2luLmhlaWdodDsNCisgICAgaWYgKGJDYXBFeGl0KSB7DQorICAgICAgc3dpdGNoIChpQ2FwUGxhY2VtZW50KSB7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ6DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9JbmxpbmU6IHsNCisgICAgICAgICAgc2l6ZS55ID0gc3RkOjptYXgoc2l6ZS55LCBzekNhcC55KTsNCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvcDoNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tOiB7DQorICAgICAgICAgIHNpemUueSArPSBzekNhcC55Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHNpemUueCA9IHN6T3J6Lng7DQorICAgIHJldHVybiBDYWxjdWxhdGVXaWRnZXRBdXRvU2l6ZShzaXplKTsNCisgIH0NCisgIENhbGN1bGF0ZVRleHRDb250ZW50U2l6ZShzaXplKTsNCisgIHJldHVybiBDYWxjdWxhdGVGaWVsZEF1dG9TaXplKHNpemUpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0QWNjOjpDYWxjdWxhdGVDaGVja0J1dHRvbkF1dG9TaXplKENGWF9TaXplRiYgc2l6ZSkgew0KKyAgRlhfRkxPQVQgZkNoZWNrU2l6ZSA9IHRoaXMtPkdldENoZWNrQnV0dG9uU2l6ZSgpOw0KKyAgc2l6ZS54ID0gc2l6ZS55ID0gZkNoZWNrU2l6ZTsNCisgIHJldHVybiBDYWxjdWxhdGVGaWVsZEF1dG9TaXplKHNpemUpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0QWNjOjpDYWxjdWxhdGVQdXNoQnV0dG9uQXV0b1NpemUoQ0ZYX1NpemVGJiBzaXplKSB7DQorICBDYWxjQ2FwdGlvblNpemUoc2l6ZSk7DQorICByZXR1cm4gQ2FsY3VsYXRlV2lkZ2V0QXV0b1NpemUoc2l6ZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXRBY2M6OkNhbGN1bGF0ZUltYWdlQXV0b1NpemUoQ0ZYX1NpemVGJiBzaXplKSB7DQorICBpZiAoIUdldEltYWdlSW1hZ2UoKSkgew0KKyAgICBMb2FkSW1hZ2VJbWFnZSgpOw0KKyAgfQ0KKyAgc2l6ZS5TZXQoMCwgMCk7DQorICBpZiAoQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gR2V0SW1hZ2VJbWFnZSgpKSB7DQorICAgIENGWF9SZWN0RiBydEltYWdlLCBydEZpdDsNCisgICAgcnRJbWFnZS5TZXQoMCwgMCwgMCwgMCk7DQorICAgIHJ0Rml0LlNldCgwLCAwLCAwLCAwKTsNCisgICAgaW50MzJfdCBpSW1hZ2VYRHBpID0gMDsNCisgICAgaW50MzJfdCBpSW1hZ2VZRHBpID0gMDsNCisgICAgR2V0SW1hZ2VEcGkoaUltYWdlWERwaSwgaUltYWdlWURwaSk7DQorICAgIHJ0SW1hZ2Uud2lkdGggPQ0KKyAgICAgICAgWEZBX1VuaXRQeDJQdCgoRlhfRkxPQVQpcEJpdG1hcC0+R2V0V2lkdGgoKSwgKEZYX0ZMT0FUKWlJbWFnZVhEcGkpOw0KKyAgICBydEltYWdlLmhlaWdodCA9DQorICAgICAgICBYRkFfVW5pdFB4MlB0KChGWF9GTE9BVClwQml0bWFwLT5HZXRIZWlnaHQoKSwgKEZYX0ZMT0FUKWlJbWFnZVlEcGkpOw0KKyAgICBpZiAoR2V0V2lkdGgocnRGaXQud2lkdGgpKSB7DQorICAgICAgR2V0V2lkdGhXaXRob3V0TWFyZ2luKHJ0Rml0LndpZHRoKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBydEZpdC53aWR0aCA9IHJ0SW1hZ2Uud2lkdGg7DQorICAgIH0NCisgICAgaWYgKEdldEhlaWdodChydEZpdC5oZWlnaHQpKSB7DQorICAgICAgR2V0SGVpZ2h0V2l0aG91dE1hcmdpbihydEZpdC5oZWlnaHQpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJ0Rml0LmhlaWdodCA9IHJ0SW1hZ2UuaGVpZ2h0Ow0KKyAgICB9DQorICAgIHNpemUueCA9IHJ0Rml0LndpZHRoOw0KKyAgICBzaXplLnkgPSBydEZpdC5oZWlnaHQ7DQorICB9DQorICByZXR1cm4gQ2FsY3VsYXRlV2lkZ2V0QXV0b1NpemUoc2l6ZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXRBY2M6OkNhbGN1bGF0ZUltYWdlRWRpdEF1dG9TaXplKENGWF9TaXplRiYgc2l6ZSkgew0KKyAgaWYgKCFHZXRJbWFnZUVkaXRJbWFnZSgpKSB7DQorICAgIExvYWRJbWFnZUVkaXRJbWFnZSgpOw0KKyAgfQ0KKyAgc2l6ZS5TZXQoMCwgMCk7DQorICBpZiAoQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gR2V0SW1hZ2VFZGl0SW1hZ2UoKSkgew0KKyAgICBDRlhfUmVjdEYgcnRJbWFnZSwgcnRGaXQ7DQorICAgIHJ0SW1hZ2UuU2V0KDAsIDAsIDAsIDApOw0KKyAgICBydEZpdC5TZXQoMCwgMCwgMCwgMCk7DQorICAgIGludDMyX3QgaUltYWdlWERwaSA9IDA7DQorICAgIGludDMyX3QgaUltYWdlWURwaSA9IDA7DQorICAgIEdldEltYWdlRWRpdERwaShpSW1hZ2VYRHBpLCBpSW1hZ2VZRHBpKTsNCisgICAgcnRJbWFnZS53aWR0aCA9DQorICAgICAgICBYRkFfVW5pdFB4MlB0KChGWF9GTE9BVClwQml0bWFwLT5HZXRXaWR0aCgpLCAoRlhfRkxPQVQpaUltYWdlWERwaSk7DQorICAgIHJ0SW1hZ2UuaGVpZ2h0ID0NCisgICAgICAgIFhGQV9Vbml0UHgyUHQoKEZYX0ZMT0FUKXBCaXRtYXAtPkdldEhlaWdodCgpLCAoRlhfRkxPQVQpaUltYWdlWURwaSk7DQorICAgIGlmIChHZXRXaWR0aChydEZpdC53aWR0aCkpIHsNCisgICAgICBHZXRXaWR0aFdpdGhvdXRNYXJnaW4ocnRGaXQud2lkdGgpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJ0Rml0LndpZHRoID0gcnRJbWFnZS53aWR0aDsNCisgICAgfQ0KKyAgICBpZiAoR2V0SGVpZ2h0KHJ0Rml0LmhlaWdodCkpIHsNCisgICAgICBHZXRIZWlnaHRXaXRob3V0TWFyZ2luKHJ0Rml0LmhlaWdodCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgcnRGaXQuaGVpZ2h0ID0gcnRJbWFnZS5oZWlnaHQ7DQorICAgIH0NCisgICAgc2l6ZS54ID0gcnRGaXQud2lkdGg7DQorICAgIHNpemUueSA9IHJ0Rml0LmhlaWdodDsNCisgIH0NCisgIHJldHVybiBDYWxjdWxhdGVGaWVsZEF1dG9TaXplKHNpemUpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0QWNjOjpMb2FkSW1hZ2VJbWFnZSgpIHsNCisgIEluaXRMYXlvdXREYXRhKCk7DQorICByZXR1cm4gKChDWEZBX0ltYWdlTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPkxvYWRJbWFnZURhdGEodGhpcyk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXRBY2M6OkxvYWRJbWFnZUVkaXRJbWFnZSgpIHsNCisgIEluaXRMYXlvdXREYXRhKCk7DQorICByZXR1cm4gKChDWEZBX0ltYWdlRWRpdERhdGEqKW1fcExheW91dERhdGEpLT5Mb2FkSW1hZ2VEYXRhKHRoaXMpOw0KK30NCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpHZXRJbWFnZURwaShpbnQzMl90JiBpSW1hZ2VYRHBpLCBpbnQzMl90JiBpSW1hZ2VZRHBpKSB7DQorICBpSW1hZ2VYRHBpID0gKChDWEZBX0ltYWdlTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1faUltYWdlWERwaTsNCisgIGlJbWFnZVlEcGkgPSAoKENYRkFfSW1hZ2VMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9pSW1hZ2VZRHBpOw0KK30NCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpHZXRJbWFnZUVkaXREcGkoaW50MzJfdCYgaUltYWdlWERwaSwgaW50MzJfdCYgaUltYWdlWURwaSkgew0KKyAgaUltYWdlWERwaSA9ICgoQ1hGQV9JbWFnZUVkaXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9pSW1hZ2VYRHBpOw0KKyAgaUltYWdlWURwaSA9ICgoQ1hGQV9JbWFnZUVkaXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9pSW1hZ2VZRHBpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0QWNjOjpDYWxjdWxhdGVUZXh0QXV0b1NpemUoQ0ZYX1NpemVGJiBzaXplKSB7DQorICBMb2FkVGV4dCgpOw0KKyAgQ1hGQV9UZXh0TGF5b3V0KiBwVGV4dExheW91dCA9DQorICAgICAgKChDWEZBX1RleHRMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wVGV4dExheW91dDsNCisgIGlmIChwVGV4dExheW91dCkgew0KKyAgICBzaXplLnggPSBwVGV4dExheW91dC0+U3RhcnRMYXlvdXQoc2l6ZS54KTsNCisgICAgc2l6ZS55ID0gcFRleHRMYXlvdXQtPkdldExheW91dEhlaWdodCgpOw0KKyAgfQ0KKyAgcmV0dXJuIENhbGN1bGF0ZVdpZGdldEF1dG9TaXplKHNpemUpOw0KK30NCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpMb2FkVGV4dCgpIHsNCisgIEluaXRMYXlvdXREYXRhKCk7DQorICAoKENYRkFfVGV4dExheW91dERhdGEqKW1fcExheW91dERhdGEpLT5Mb2FkVGV4dCh0aGlzKTsNCit9DQorRlhfRkxPQVQgQ1hGQV9XaWRnZXRBY2M6OkNhbGN1bGF0ZVdpZGdldEF1dG9XaWR0aChGWF9GTE9BVCBmV2lkdGhDYWxjKSB7DQorICBDWEZBX01hcmdpbiBtZ1dpZGdldCA9IHRoaXMtPkdldE1hcmdpbigpOw0KKyAgaWYgKG1nV2lkZ2V0LklzRXhpc3RJblhNTCgpKSB7DQorICAgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQsIGZSaWdodEluc2V0Ow0KKyAgICBtZ1dpZGdldC5HZXRMZWZ0SW5zZXQoZkxlZnRJbnNldCk7DQorICAgIG1nV2lkZ2V0LkdldFJpZ2h0SW5zZXQoZlJpZ2h0SW5zZXQpOw0KKyAgICBmV2lkdGhDYWxjICs9IGZMZWZ0SW5zZXQgKyBmUmlnaHRJbnNldDsNCisgIH0NCisgIEZYX0ZMT0FUIGZNaW4gPSAwLCBmTWF4ID0gMDsNCisgIGlmICh0aGlzLT5HZXRNaW5XaWR0aChmTWluKSkgew0KKyAgICBmV2lkdGhDYWxjID0gc3RkOjptYXgoZldpZHRoQ2FsYywgZk1pbik7DQorICB9DQorICBpZiAodGhpcy0+R2V0TWF4V2lkdGgoZk1heCkgJiYgZk1heCA+IDApIHsNCisgICAgZldpZHRoQ2FsYyA9IHN0ZDo6bWluKGZXaWR0aENhbGMsIGZNYXgpOw0KKyAgfQ0KKyAgcmV0dXJuIGZXaWR0aENhbGM7DQorfQ0KK0ZYX0ZMT0FUIENYRkFfV2lkZ2V0QWNjOjpHZXRXaWR0aFdpdGhvdXRNYXJnaW4oRlhfRkxPQVQgZldpZHRoQ2FsYykgew0KKyAgQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSB0aGlzLT5HZXRNYXJnaW4oKTsNCisgIGlmIChtZ1dpZGdldC5Jc0V4aXN0SW5YTUwoKSkgew0KKyAgICBGWF9GTE9BVCBmTGVmdEluc2V0LCBmUmlnaHRJbnNldDsNCisgICAgbWdXaWRnZXQuR2V0TGVmdEluc2V0KGZMZWZ0SW5zZXQpOw0KKyAgICBtZ1dpZGdldC5HZXRSaWdodEluc2V0KGZSaWdodEluc2V0KTsNCisgICAgZldpZHRoQ2FsYyAtPSBmTGVmdEluc2V0ICsgZlJpZ2h0SW5zZXQ7DQorICB9DQorICByZXR1cm4gZldpZHRoQ2FsYzsNCit9DQorRlhfRkxPQVQgQ1hGQV9XaWRnZXRBY2M6OkNhbGN1bGF0ZVdpZGdldEF1dG9IZWlnaHQoRlhfRkxPQVQgZkhlaWdodENhbGMpIHsNCisgIENYRkFfTWFyZ2luIG1nV2lkZ2V0ID0gdGhpcy0+R2V0TWFyZ2luKCk7DQorICBpZiAobWdXaWRnZXQuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgRlhfRkxPQVQgZlRvcEluc2V0LCBmQm90dG9tSW5zZXQ7DQorICAgIG1nV2lkZ2V0LkdldFRvcEluc2V0KGZUb3BJbnNldCk7DQorICAgIG1nV2lkZ2V0LkdldEJvdHRvbUluc2V0KGZCb3R0b21JbnNldCk7DQorICAgIGZIZWlnaHRDYWxjICs9IGZUb3BJbnNldCArIGZCb3R0b21JbnNldDsNCisgIH0NCisgIEZYX0ZMT0FUIGZNaW4gPSAwLCBmTWF4ID0gMDsNCisgIGlmICh0aGlzLT5HZXRNaW5IZWlnaHQoZk1pbikpIHsNCisgICAgZkhlaWdodENhbGMgPSBzdGQ6Om1heChmSGVpZ2h0Q2FsYywgZk1pbik7DQorICB9DQorICBpZiAodGhpcy0+R2V0TWF4SGVpZ2h0KGZNYXgpICYmIGZNYXggPiAwKSB7DQorICAgIGZIZWlnaHRDYWxjID0gc3RkOjptaW4oZkhlaWdodENhbGMsIGZNYXgpOw0KKyAgfQ0KKyAgcmV0dXJuIGZIZWlnaHRDYWxjOw0KK30NCitGWF9GTE9BVCBDWEZBX1dpZGdldEFjYzo6R2V0SGVpZ2h0V2l0aG91dE1hcmdpbihGWF9GTE9BVCBmSGVpZ2h0Q2FsYykgew0KKyAgQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSB0aGlzLT5HZXRNYXJnaW4oKTsNCisgIGlmIChtZ1dpZGdldC5Jc0V4aXN0SW5YTUwoKSkgew0KKyAgICBGWF9GTE9BVCBmVG9wSW5zZXQsIGZCb3R0b21JbnNldDsNCisgICAgbWdXaWRnZXQuR2V0VG9wSW5zZXQoZlRvcEluc2V0KTsNCisgICAgbWdXaWRnZXQuR2V0Qm90dG9tSW5zZXQoZkJvdHRvbUluc2V0KTsNCisgICAgZkhlaWdodENhbGMgLT0gZlRvcEluc2V0ICsgZkJvdHRvbUluc2V0Ow0KKyAgfQ0KKyAgcmV0dXJuIGZIZWlnaHRDYWxjOw0KK30NCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpTdGFydFdpZGdldExheW91dChGWF9GTE9BVCYgZkNhbGNXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkNhbGNIZWlnaHQpIHsNCisgIEluaXRMYXlvdXREYXRhKCk7DQorICBYRkFfRUxFTUVOVCBlVUlUeXBlID0gR2V0VUlUeXBlKCk7DQorICBpZiAoZVVJVHlwZSA9PSBYRkFfRUxFTUVOVF9UZXh0KSB7DQorICAgIG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCA9IC0xOw0KKyAgICBHZXRIZWlnaHQobV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0KTsNCisgICAgU3RhcnRUZXh0TGF5b3V0KGZDYWxjV2lkdGgsIGZDYWxjSGVpZ2h0KTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKGZDYWxjV2lkdGggPiAwICYmIGZDYWxjSGVpZ2h0ID4gMCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQgPSAtMTsNCisgIEZYX0ZMT0FUIGZXaWR0aCA9IDA7DQorICBpZiAoZkNhbGNXaWR0aCA+IDAgJiYgZkNhbGNIZWlnaHQgPCAwKSB7DQorICAgIGlmICghR2V0SGVpZ2h0KGZDYWxjSGVpZ2h0KSkgew0KKyAgICAgIENhbGN1bGF0ZUFjY1dpZHRoQW5kSGVpZ2h0KGVVSVR5cGUsIGZDYWxjV2lkdGgsIGZDYWxjSGVpZ2h0KTsNCisgICAgfQ0KKyAgICBtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQgPSBmQ2FsY0hlaWdodDsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKGZDYWxjV2lkdGggPCAwICYmIGZDYWxjSGVpZ2h0IDwgMCkgew0KKyAgICBpZiAoIUdldFdpZHRoKGZXaWR0aCkgfHwgIUdldEhlaWdodChmQ2FsY0hlaWdodCkpIHsNCisgICAgICBDYWxjdWxhdGVBY2NXaWR0aEFuZEhlaWdodChlVUlUeXBlLCBmV2lkdGgsIGZDYWxjSGVpZ2h0KTsNCisgICAgfQ0KKyAgICBmQ2FsY1dpZHRoID0gZldpZHRoOw0KKyAgfQ0KKyAgbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0ID0gZkNhbGNIZWlnaHQ7DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXRBY2M6OkNhbGN1bGF0ZUFjY1dpZHRoQW5kSGVpZ2h0KFhGQV9FTEVNRU5UIGVVSVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkNhbGNIZWlnaHQpIHsNCisgIENGWF9TaXplRiBzejsNCisgIHN6LlNldChmV2lkdGgsIG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCk7DQorICBzd2l0Y2ggKGVVSVR5cGUpIHsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9CYXJjb2RlOg0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0Nob2ljZUxpc3Q6DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfU2lnbmF0dXJlOg0KKyAgICAgIENhbGN1bGF0ZUZpZWxkQXV0b1NpemUoc3opOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0ltYWdlRWRpdDoNCisgICAgICBDYWxjdWxhdGVJbWFnZUVkaXRBdXRvU2l6ZShzeik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfQnV0dG9uOg0KKyAgICAgIENhbGN1bGF0ZVB1c2hCdXR0b25BdXRvU2l6ZShzeik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfQ2hlY2tCdXR0b246DQorICAgICAgQ2FsY3VsYXRlQ2hlY2tCdXR0b25BdXRvU2l6ZShzeik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfRGF0ZVRpbWVFZGl0Og0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX051bWVyaWNFZGl0Og0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX1Bhc3N3b3JkRWRpdDoNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9UZXh0RWRpdDoNCisgICAgICBDYWxjdWxhdGVUZXh0RWRpdEF1dG9TaXplKHN6KTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9JbWFnZToNCisgICAgICBDYWxjdWxhdGVJbWFnZUF1dG9TaXplKHN6KTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9BcmM6DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfTGluZToNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9SZWN0YW5nbGU6DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfU3ViZm9ybToNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9FeGNsR3JvdXA6DQorICAgICAgQ2FsY3VsYXRlV2lkZ2V0QXV0b1NpemUoc3opOw0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgZldpZHRoID0gc3oueDsNCisgIG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCA9IHN6Lnk7DQorICBmQ2FsY0hlaWdodCA9IHN6Lnk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXRBY2M6OkZpbmRTcGxpdFBvcyhpbnQzMl90IGlCbG9ja0luZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkNhbGNIZWlnaHQpIHsNCisgIFhGQV9FTEVNRU5UIGVVSVR5cGUgPSAoWEZBX0VMRU1FTlQpR2V0VUlUeXBlKCk7DQorICBpZiAoZVVJVHlwZSA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChlVUlUeXBlICE9IFhGQV9FTEVNRU5UX1RleHQgJiYgZVVJVHlwZSAhPSBYRkFfRUxFTUVOVF9UZXh0RWRpdCAmJg0KKyAgICAgIGVVSVR5cGUgIT0gWEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQgJiYNCisgICAgICBlVUlUeXBlICE9IFhGQV9FTEVNRU5UX1Bhc3N3b3JkRWRpdCkgew0KKyAgICBmQ2FsY0hlaWdodCA9IDA7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZlRvcEluc2V0ID0gMDsNCisgIEZYX0ZMT0FUIGZCb3R0b21JbnNldCA9IDA7DQorICBpZiAoaUJsb2NrSW5kZXggPT0gMCkgew0KKyAgICBDWEZBX01hcmdpbiBtZ1dpZGdldCA9IHRoaXMtPkdldE1hcmdpbigpOw0KKyAgICBpZiAobWdXaWRnZXQuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgICBtZ1dpZGdldC5HZXRUb3BJbnNldChmVG9wSW5zZXQpOw0KKyAgICAgIG1nV2lkZ2V0LkdldEJvdHRvbUluc2V0KGZCb3R0b21JbnNldCk7DQorICAgIH0NCisgICAgQ0ZYX1JlY3RGIHJ0VUlNYXJnaW47DQorICAgIHRoaXMtPkdldFVJTWFyZ2luKHJ0VUlNYXJnaW4pOw0KKyAgICBmVG9wSW5zZXQgKz0gcnRVSU1hcmdpbi50b3A7DQorICAgIGZCb3R0b21JbnNldCArPSBydFVJTWFyZ2luLndpZHRoOw0KKyAgfQ0KKyAgaWYgKGVVSVR5cGUgPT0gWEZBX0VMRU1FTlRfVGV4dCkgew0KKyAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gZkNhbGNIZWlnaHQ7DQorICAgIGlmIChpQmxvY2tJbmRleCA9PSAwKSB7DQorICAgICAgZkNhbGNIZWlnaHQgPSBmQ2FsY0hlaWdodCAtIGZUb3BJbnNldDsNCisgICAgICBpZiAoZkNhbGNIZWlnaHQgPCAwKSB7DQorICAgICAgICBmQ2FsY0hlaWdodCA9IDA7DQorICAgICAgfQ0KKyAgICB9DQorICAgIENYRkFfVGV4dExheW91dCogcFRleHRMYXlvdXQgPQ0KKyAgICAgICAgKChDWEZBX1RleHRMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wVGV4dExheW91dDsNCisgICAgcFRleHRMYXlvdXQtPkRvTGF5b3V0KGlCbG9ja0luZGV4LCBmQ2FsY0hlaWdodCwgZkNhbGNIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQgLSBmVG9wSW5zZXQpOw0KKyAgICBpZiAoZkNhbGNIZWlnaHQgIT0gMCkgew0KKyAgICAgIGlmIChpQmxvY2tJbmRleCA9PSAwKSB7DQorICAgICAgICBmQ2FsY0hlaWdodCA9IGZDYWxjSGVpZ2h0ICsgZlRvcEluc2V0Ow0KKyAgICAgIH0NCisgICAgICBpZiAoZmFicyhmSGVpZ2h0IC0gZkNhbGNIZWlnaHQpIDwgWEZBX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIFhGQV9BVFRSSUJVVEVFTlVNIGlDYXBQbGFjZW1lbnQgPSBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duOw0KKyAgRlhfRkxPQVQgZkNhcFJlc2VydmUgPSAwOw0KKyAgaWYgKGlCbG9ja0luZGV4ID09IDApIHsNCisgICAgQ1hGQV9DYXB0aW9uIGNhcHRpb24gPSBHZXRDYXB0aW9uKCk7DQorICAgIGlmIChjYXB0aW9uLklzRXhpc3RJblhNTCgpICYmDQorICAgICAgICBjYXB0aW9uLkdldFByZXNlbmNlKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fSGlkZGVuKSB7DQorICAgICAgaUNhcFBsYWNlbWVudCA9IChYRkFfQVRUUklCVVRFRU5VTSljYXB0aW9uLkdldFBsYWNlbWVudFR5cGUoKTsNCisgICAgICBmQ2FwUmVzZXJ2ZSA9IGNhcHRpb24uR2V0UmVzZXJ2ZSgpOw0KKyAgICB9DQorICAgIGlmIChpQ2FwUGxhY2VtZW50ID09IFhGQV9BVFRSSUJVVEVFTlVNX1RvcCAmJg0KKyAgICAgICAgZkNhbGNIZWlnaHQgPCBmQ2FwUmVzZXJ2ZSArIGZUb3BJbnNldCkgew0KKyAgICAgIGZDYWxjSGVpZ2h0ID0gMDsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBpZiAoaUNhcFBsYWNlbWVudCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b20gJiYNCisgICAgICAgIG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCAtIGZDYXBSZXNlcnZlIC0gZkJvdHRvbUluc2V0KSB7DQorICAgICAgZkNhbGNIZWlnaHQgPSAwOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGlmIChpQ2FwUGxhY2VtZW50ICE9IFhGQV9BVFRSSUJVVEVFTlVNX1RvcCkgew0KKyAgICAgIGZDYXBSZXNlcnZlID0gMDsNCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBpTGluZXNDb3VudCA9IDA7DQorICBGWF9GTE9BVCBmSGVpZ2h0ID0gbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0Ow0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgdGhpcy0+R2V0VmFsdWUod3NUZXh0LCBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpOw0KKyAgaWYgKHdzVGV4dC5Jc0VtcHR5KCkpIHsNCisgICAgaUxpbmVzQ291bnQgPSAxOw0KKyAgfSBlbHNlIHsNCisgICAgaWYgKCEoKENYRkFfRmllbGRMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wVGV4dE91dCkgew0KKyAgICAgIEZYX0ZMT0FUIGZXaWR0aCA9IDA7DQorICAgICAgR2V0V2lkdGgoZldpZHRoKTsNCisgICAgICBDYWxjdWxhdGVBY2NXaWR0aEFuZEhlaWdodChlVUlUeXBlLCBmV2lkdGgsIGZIZWlnaHQpOw0KKyAgICB9DQorICAgIGlMaW5lc0NvdW50ID0NCisgICAgICAgICgoQ1hGQV9GaWVsZExheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BUZXh0T3V0LT5HZXRUb3RhbExpbmVzKCk7DQorICB9DQorICBpZiAoISgoQ1hGQV9GaWVsZExheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BGaWVsZFNwbGl0QXJyYXkpIHsNCisgICAgKChDWEZBX0ZpZWxkTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcEZpZWxkU3BsaXRBcnJheSA9DQorICAgICAgICBuZXcgQ0ZYX0Zsb2F0QXJyYXk7DQorICB9DQorICBDRlhfRmxvYXRBcnJheSogcEZpZWxkQXJyYXkgPQ0KKyAgICAgICgoQ1hGQV9GaWVsZExheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BGaWVsZFNwbGl0QXJyYXk7DQorICBpbnQzMl90IGlGaWVsZFNwbGl0Q291bnQgPSBwRmllbGRBcnJheS0+R2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUJsb2NrSW5kZXggKiAzOyBpICs9IDMpIHsNCisgICAgaUxpbmVzQ291bnQgLT0gKGludDMyX3QpcEZpZWxkQXJyYXktPkdldEF0KGkgKyAxKTsNCisgICAgZkhlaWdodCAtPSBwRmllbGRBcnJheS0+R2V0QXQoaSArIDIpOw0KKyAgfQ0KKyAgaWYgKGlMaW5lc0NvdW50ID09IDApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZkxpbmVIZWlnaHQgPSBHZXRMaW5lSGVpZ2h0KCk7DQorICBGWF9GTE9BVCBmRm9udFNpemUgPSBHZXRGb250U2l6ZSgpOw0KKyAgRlhfRkxPQVQgZlRleHRIZWlnaHQgPSBpTGluZXNDb3VudCAqIGZMaW5lSGVpZ2h0IC0gZkxpbmVIZWlnaHQgKyBmRm9udFNpemU7DQorICBGWF9GTE9BVCBmU3BhY2VBYm92ZSA9IDA7DQorICBGWF9GTE9BVCBmU3RhcnRPZmZzZXQgPSAwOw0KKyAgaWYgKGZIZWlnaHQgPiAwLjFmICYmIGlCbG9ja0luZGV4ID09IDApIHsNCisgICAgZlN0YXJ0T2Zmc2V0ID0gZlRvcEluc2V0Ow0KKyAgICBmSGVpZ2h0IC09IChmVG9wSW5zZXQgKyBmQm90dG9tSW5zZXQpOw0KKyAgICBpZiAoQ1hGQV9QYXJhIHBhcmEgPSB0aGlzLT5HZXRQYXJhKCkpIHsNCisgICAgICBmU3BhY2VBYm92ZSA9IHBhcmEuR2V0U3BhY2VBYm92ZSgpOw0KKyAgICAgIEZYX0ZMT0FUIGZTcGFjZUJlbG93ID0gcGFyYS5HZXRTcGFjZUJlbG93KCk7DQorICAgICAgZkhlaWdodCAtPSAoZlNwYWNlQWJvdmUgKyBmU3BhY2VCZWxvdyk7DQorICAgICAgc3dpdGNoIChwYXJhLkdldFZlcnRpY2FsQWxpZ24oKSkgew0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub3A6DQorICAgICAgICAgIGZTdGFydE9mZnNldCArPSBmU3BhY2VBYm92ZTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZToNCisgICAgICAgICAgZlN0YXJ0T2Zmc2V0ICs9ICgoZkhlaWdodCAtIGZUZXh0SGVpZ2h0KSAvIDIgKyBmU3BhY2VBYm92ZSk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b206DQorICAgICAgICAgIGZTdGFydE9mZnNldCArPSAoZkhlaWdodCAtIGZUZXh0SGVpZ2h0ICsgZlNwYWNlQWJvdmUpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGZTdGFydE9mZnNldCA8IDAuMWYpIHsNCisgICAgICBmU3RhcnRPZmZzZXQgPSAwOw0KKyAgICB9DQorICB9DQorICBmb3IgKGludDMyX3QgaSA9IGlCbG9ja0luZGV4IC0gMTsgaUJsb2NrSW5kZXggPiAwICYmIGkgPCBpQmxvY2tJbmRleDsgaSsrKSB7DQorICAgIGZTdGFydE9mZnNldCA9IHBGaWVsZEFycmF5LT5HZXRBdChpICogMykgLSBwRmllbGRBcnJheS0+R2V0QXQoaSAqIDMgKyAyKTsNCisgICAgaWYgKGZTdGFydE9mZnNldCA8IDAuMWYpIHsNCisgICAgICBmU3RhcnRPZmZzZXQgPSAwOw0KKyAgICB9DQorICB9DQorICBpZiAoaUZpZWxkU3BsaXRDb3VudCAvIDMgPT0gKGlCbG9ja0luZGV4ICsgMSkpIHsNCisgICAgcEZpZWxkQXJyYXktPlNldEF0KDAsIGZTdGFydE9mZnNldCk7DQorICB9IGVsc2Ugew0KKyAgICBwRmllbGRBcnJheS0+QWRkKGZTdGFydE9mZnNldCk7DQorICB9DQorICBYRkFfVkVSU0lPTiB2ZXJzaW9uID0gR2V0RG9jKCktPkdldFhGQURvYygpLT5HZXRDdXJWZXJzaW9uTW9kZSgpOw0KKyAgRlhfQk9PTCBiQ2FuU3BsaXROb0NvbnRlbnQgPSBGQUxTRTsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXRNb2RlOw0KKyAgdGhpcy0+R2V0Tm9kZSgpDQorICAgICAgLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KQ0KKyAgICAgIC0+VHJ5RW51bShYRkFfQVRUUklCVVRFX0xheW91dCwgZUxheW91dE1vZGUsIFRSVUUpOw0KKyAgaWYgKChlTGF5b3V0TW9kZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Qb3NpdGlvbiB8fA0KKyAgICAgICBlTGF5b3V0TW9kZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9UYiB8fA0KKyAgICAgICBlTGF5b3V0TW9kZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Sb3cgfHwNCisgICAgICAgZUxheW91dE1vZGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fVGFibGUpICYmDQorICAgICAgdmVyc2lvbiA+IFhGQV9WRVJTSU9OXzIwOCkgew0KKyAgICBiQ2FuU3BsaXROb0NvbnRlbnQgPSBUUlVFOw0KKyAgfQ0KKyAgaWYgKChlTGF5b3V0TW9kZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9UYiB8fA0KKyAgICAgICBlTGF5b3V0TW9kZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Sb3cgfHwNCisgICAgICAgZUxheW91dE1vZGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fVGFibGUpICYmDQorICAgICAgdmVyc2lvbiA8PSBYRkFfVkVSU0lPTl8yMDgpIHsNCisgICAgaWYgKGZTdGFydE9mZnNldCA8IGZDYWxjSGVpZ2h0KSB7DQorICAgICAgYkNhblNwbGl0Tm9Db250ZW50ID0gVFJVRTsNCisgICAgfSBlbHNlIHsNCisgICAgICBmQ2FsY0hlaWdodCA9IDA7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgIH0NCisgIGlmIChiQ2FuU3BsaXROb0NvbnRlbnQpIHsNCisgICAgaWYgKChmQ2FsY0hlaWdodCAtIGZUb3BJbnNldCAtIGZTcGFjZUFib3ZlIDwgZkxpbmVIZWlnaHQpKSB7DQorICAgICAgZkNhbGNIZWlnaHQgPSAwOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGlmIChmU3RhcnRPZmZzZXQgKyBYRkFfRkxPQVRfUEVSQ0lTSU9OID49IGZDYWxjSGVpZ2h0KSB7DQorICAgICAgaWYgKGlGaWVsZFNwbGl0Q291bnQgLyAzID09IChpQmxvY2tJbmRleCArIDEpKSB7DQorICAgICAgICBwRmllbGRBcnJheS0+U2V0QXQoaUJsb2NrSW5kZXggKiAzICsgMSwgMCk7DQorICAgICAgICBwRmllbGRBcnJheS0+U2V0QXQoaUJsb2NrSW5kZXggKiAzICsgMiwgZkNhbGNIZWlnaHQpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBwRmllbGRBcnJheS0+QWRkKDApOw0KKyAgICAgICAgcEZpZWxkQXJyYXktPkFkZChmQ2FsY0hlaWdodCk7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAoZkNhbGNIZWlnaHQgLSBmU3RhcnRPZmZzZXQgPCBmTGluZUhlaWdodCkgew0KKyAgICAgIGZDYWxjSGVpZ2h0ID0gZlN0YXJ0T2Zmc2V0Ow0KKyAgICAgIGlmIChpRmllbGRTcGxpdENvdW50IC8gMyA9PSAoaUJsb2NrSW5kZXggKyAxKSkgew0KKyAgICAgICAgcEZpZWxkQXJyYXktPlNldEF0KGlCbG9ja0luZGV4ICogMyArIDEsIDApOw0KKyAgICAgICAgcEZpZWxkQXJyYXktPlNldEF0KGlCbG9ja0luZGV4ICogMyArIDIsIGZDYWxjSGVpZ2h0KTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcEZpZWxkQXJyYXktPkFkZCgwKTsNCisgICAgICAgIHBGaWVsZEFycmF5LT5BZGQoZkNhbGNIZWlnaHQpOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBGWF9GTE9BVCBmVGV4dE51bSA9DQorICAgICAgICBmQ2FsY0hlaWdodCArIFhGQV9GTE9BVF9QRVJDSVNJT04gLSBmQ2FwUmVzZXJ2ZSAtIGZTdGFydE9mZnNldDsNCisgICAgaW50MzJfdCBpTGluZU51bSA9DQorICAgICAgICAoaW50MzJfdCkoKGZUZXh0TnVtICsgKGZMaW5lSGVpZ2h0IC0gZkZvbnRTaXplKSkgLyBmTGluZUhlaWdodCk7DQorICAgIGlmIChpTGluZU51bSA+PSBpTGluZXNDb3VudCkgew0KKyAgICAgIGlmIChmQ2FsY0hlaWdodCAtIGZTdGFydE9mZnNldCAtIGZUZXh0SGVpZ2h0ID49IGZGb250U2l6ZSkgew0KKyAgICAgICAgaWYgKGlGaWVsZFNwbGl0Q291bnQgLyAzID09IChpQmxvY2tJbmRleCArIDEpKSB7DQorICAgICAgICAgIHBGaWVsZEFycmF5LT5TZXRBdChpQmxvY2tJbmRleCAqIDMgKyAxLCAoRlhfRkxPQVQpaUxpbmVzQ291bnQpOw0KKyAgICAgICAgICBwRmllbGRBcnJheS0+U2V0QXQoaUJsb2NrSW5kZXggKiAzICsgMiwgZkNhbGNIZWlnaHQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcEZpZWxkQXJyYXktPkFkZCgoRlhfRkxPQVQpaUxpbmVzQ291bnQpOw0KKyAgICAgICAgICBwRmllbGRBcnJheS0+QWRkKGZDYWxjSGVpZ2h0KTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgaWYgKGZIZWlnaHQgLSBmU3RhcnRPZmZzZXQgLSBmVGV4dEhlaWdodCA8IGZGb250U2l6ZSkgew0KKyAgICAgICAgaUxpbmVOdW0gLT0gMTsNCisgICAgICAgIGlmIChpTGluZU51bSA9PSAwKSB7DQorICAgICAgICAgIGZDYWxjSGVpZ2h0ID0gMDsNCisgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlMaW5lTnVtID0gKGludDMyX3QpKGZUZXh0TnVtIC8gZkxpbmVIZWlnaHQpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoaUxpbmVOdW0gPiAwKSB7DQorICAgICAgRlhfRkxPQVQgZlNwbGl0SGVpZ2h0ID0NCisgICAgICAgICAgaUxpbmVOdW0gKiBmTGluZUhlaWdodCArIGZDYXBSZXNlcnZlICsgZlN0YXJ0T2Zmc2V0Ow0KKyAgICAgIGlmIChpRmllbGRTcGxpdENvdW50IC8gMyA9PSAoaUJsb2NrSW5kZXggKyAxKSkgew0KKyAgICAgICAgcEZpZWxkQXJyYXktPlNldEF0KGlCbG9ja0luZGV4ICogMyArIDEsIChGWF9GTE9BVClpTGluZU51bSk7DQorICAgICAgICBwRmllbGRBcnJheS0+U2V0QXQoaUJsb2NrSW5kZXggKiAzICsgMiwgZlNwbGl0SGVpZ2h0KTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcEZpZWxkQXJyYXktPkFkZCgoRlhfRkxPQVQpaUxpbmVOdW0pOw0KKyAgICAgICAgcEZpZWxkQXJyYXktPkFkZChmU3BsaXRIZWlnaHQpOw0KKyAgICAgIH0NCisgICAgICBpZiAoZmFicyhmU3BsaXRIZWlnaHQgLSBmQ2FsY0hlaWdodCkgPCBYRkFfRkxPQVRfUEVSQ0lTSU9OKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGZDYWxjSGVpZ2h0ID0gZlNwbGl0SGVpZ2h0Ow0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICB9DQorICBmQ2FsY0hlaWdodCA9IDA7DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDWEZBX1dpZGdldEFjYzo6SW5pdExheW91dERhdGEoKSB7DQorICBpZiAobV9wTGF5b3V0RGF0YSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBzd2l0Y2ggKEdldFVJVHlwZSgpKSB7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfVGV4dDoNCisgICAgICBtX3BMYXlvdXREYXRhID0gbmV3IENYRkFfVGV4dExheW91dERhdGE7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX1RleHRFZGl0Og0KKyAgICAgIG1fcExheW91dERhdGEgPSBuZXcgQ1hGQV9UZXh0RWRpdERhdGE7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0ltYWdlOg0KKyAgICAgIG1fcExheW91dERhdGEgPSBuZXcgQ1hGQV9JbWFnZUxheW91dERhdGE7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0ltYWdlRWRpdDoNCisgICAgICBtX3BMYXlvdXREYXRhID0gbmV3IENYRkFfSW1hZ2VFZGl0RGF0YTsNCisgICAgICByZXR1cm47DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICBpZiAoR2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0ZpZWxkKSB7DQorICAgIG1fcExheW91dERhdGEgPSBuZXcgQ1hGQV9GaWVsZExheW91dERhdGE7DQorICB9IGVsc2Ugew0KKyAgICBtX3BMYXlvdXREYXRhID0gbmV3IENYRkFfV2lkZ2V0TGF5b3V0RGF0YTsNCisgIH0NCit9DQordm9pZCBDWEZBX1dpZGdldEFjYzo6U3RhcnRUZXh0TGF5b3V0KEZYX0ZMT0FUJiBmQ2FsY1dpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkNhbGNIZWlnaHQpIHsNCisgIExvYWRUZXh0KCk7DQorICBDWEZBX1RleHRMYXlvdXQqIHBUZXh0TGF5b3V0ID0NCisgICAgICAoKENYRkFfVGV4dExheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BUZXh0TGF5b3V0Ow0KKyAgRlhfRkxPQVQgZlRleHRIZWlnaHQgPSAwOw0KKyAgaWYgKGZDYWxjV2lkdGggPiAwICYmIGZDYWxjSGVpZ2h0ID4gMCkgew0KKyAgICBGWF9GTE9BVCBmV2lkdGggPSBHZXRXaWR0aFdpdGhvdXRNYXJnaW4oZkNhbGNXaWR0aCk7DQorICAgIHBUZXh0TGF5b3V0LT5TdGFydExheW91dChmV2lkdGgpOw0KKyAgICBmVGV4dEhlaWdodCA9IGZDYWxjSGVpZ2h0Ow0KKyAgICBmVGV4dEhlaWdodCA9IEdldEhlaWdodFdpdGhvdXRNYXJnaW4oZlRleHRIZWlnaHQpOw0KKyAgICBwVGV4dExheW91dC0+RG9MYXlvdXQoMCwgZlRleHRIZWlnaHQsIC0xLCBmVGV4dEhlaWdodCk7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChmQ2FsY1dpZHRoID4gMCAmJiBmQ2FsY0hlaWdodCA8IDApIHsNCisgICAgRlhfRkxPQVQgZldpZHRoID0gR2V0V2lkdGhXaXRob3V0TWFyZ2luKGZDYWxjV2lkdGgpOw0KKyAgICBwVGV4dExheW91dC0+U3RhcnRMYXlvdXQoZldpZHRoKTsNCisgIH0NCisgIGlmIChmQ2FsY1dpZHRoIDwgMCAmJiBmQ2FsY0hlaWdodCA8IDApIHsNCisgICAgRlhfRkxPQVQgZk1heFdpZHRoID0gLTE7DQorICAgIEZYX0JPT0wgYlJldCA9IEdldFdpZHRoKGZNYXhXaWR0aCk7DQorICAgIGlmIChiUmV0KSB7DQorICAgICAgRlhfRkxPQVQgZldpZHRoID0gR2V0V2lkdGhXaXRob3V0TWFyZ2luKGZNYXhXaWR0aCk7DQorICAgICAgcFRleHRMYXlvdXQtPlN0YXJ0TGF5b3V0KGZXaWR0aCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhfRkxPQVQgZldpZHRoID0gcFRleHRMYXlvdXQtPlN0YXJ0TGF5b3V0KGZNYXhXaWR0aCk7DQorICAgICAgZk1heFdpZHRoID0gQ2FsY3VsYXRlV2lkZ2V0QXV0b1dpZHRoKGZXaWR0aCk7DQorICAgICAgZldpZHRoID0gR2V0V2lkdGhXaXRob3V0TWFyZ2luKGZNYXhXaWR0aCk7DQorICAgICAgcFRleHRMYXlvdXQtPlN0YXJ0TGF5b3V0KGZXaWR0aCk7DQorICAgIH0NCisgICAgZkNhbGNXaWR0aCA9IGZNYXhXaWR0aDsNCisgIH0NCisgIGlmIChtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQgPCAwKSB7DQorICAgIG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCA9IHBUZXh0TGF5b3V0LT5HZXRMYXlvdXRIZWlnaHQoKTsNCisgICAgbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0ID0NCisgICAgICAgIENhbGN1bGF0ZVdpZGdldEF1dG9IZWlnaHQobV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0KTsNCisgIH0NCisgIGZUZXh0SGVpZ2h0ID0gbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0Ow0KKyAgZlRleHRIZWlnaHQgPSBHZXRIZWlnaHRXaXRob3V0TWFyZ2luKGZUZXh0SGVpZ2h0KTsNCisgIHBUZXh0TGF5b3V0LT5Eb0xheW91dCgwLCBmVGV4dEhlaWdodCwgLTEsIGZUZXh0SGVpZ2h0KTsNCisgIGZDYWxjSGVpZ2h0ID0gbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0Ow0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0QWNjOjpMb2FkQ2FwdGlvbigpIHsNCisgIEluaXRMYXlvdXREYXRhKCk7DQorICByZXR1cm4gKChDWEZBX0ZpZWxkTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPkxvYWRDYXB0aW9uKHRoaXMpOw0KK30NCitDWEZBX1RleHRMYXlvdXQqIENYRkFfV2lkZ2V0QWNjOjpHZXRDYXB0aW9uVGV4dExheW91dCgpIHsNCisgIHJldHVybiBtX3BMYXlvdXREYXRhDQorICAgICAgICAgICAgID8gKChDWEZBX0ZpZWxkTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcENhcFRleHRMYXlvdXQNCisgICAgICAgICAgICAgOiBOVUxMOw0KK30NCitDWEZBX1RleHRMYXlvdXQqIENYRkFfV2lkZ2V0QWNjOjpHZXRUZXh0TGF5b3V0KCkgew0KKyAgcmV0dXJuIG1fcExheW91dERhdGEgPyAoKENYRkFfVGV4dExheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BUZXh0TGF5b3V0DQorICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7DQorfQ0KK0NGWF9ESUJpdG1hcCogQ1hGQV9XaWRnZXRBY2M6OkdldEltYWdlSW1hZ2UoKSB7DQorICByZXR1cm4gbV9wTGF5b3V0RGF0YSA/ICgoQ1hGQV9JbWFnZUxheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BESUJpdG1hcA0KKyAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOw0KK30NCitDRlhfRElCaXRtYXAqIENYRkFfV2lkZ2V0QWNjOjpHZXRJbWFnZUVkaXRJbWFnZSgpIHsNCisgIHJldHVybiBtX3BMYXlvdXREYXRhID8gKChDWEZBX0ltYWdlRWRpdERhdGEqKW1fcExheW91dERhdGEpLT5tX3BESUJpdG1hcA0KKyAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOw0KK30NCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpTZXRJbWFnZUltYWdlKENGWF9ESUJpdG1hcCogbmV3SW1hZ2UpIHsNCisgIGlmICgoKENYRkFfSW1hZ2VMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wRElCaXRtYXAgPT0gbmV3SW1hZ2UpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKCgoQ1hGQV9JbWFnZUxheW91dERhdGEqKW1fcExheW91dERhdGEpLT5tX3BESUJpdG1hcCAmJg0KKyAgICAgICEoKENYRkFfSW1hZ2VMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9iTmFtZWRJbWFnZSkgew0KKyAgICBkZWxldGUgKChDWEZBX0ltYWdlTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcERJQml0bWFwOw0KKyAgICAoKENYRkFfSW1hZ2VMYXlvdXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9wRElCaXRtYXAgPSBOVUxMOw0KKyAgfQ0KKyAgKChDWEZBX0ltYWdlTGF5b3V0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcERJQml0bWFwID0gbmV3SW1hZ2U7DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXRBY2M6OlNldEltYWdlRWRpdEltYWdlKENGWF9ESUJpdG1hcCogbmV3SW1hZ2UpIHsNCisgIGlmICgoKENYRkFfSW1hZ2VFZGl0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcERJQml0bWFwID09IG5ld0ltYWdlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmICgoKENYRkFfSW1hZ2VFZGl0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcERJQml0bWFwICYmDQorICAgICAgISgoQ1hGQV9JbWFnZUVkaXREYXRhKiltX3BMYXlvdXREYXRhKS0+bV9iTmFtZWRJbWFnZSkgew0KKyAgICBkZWxldGUgKChDWEZBX0ltYWdlRWRpdERhdGEqKW1fcExheW91dERhdGEpLT5tX3BESUJpdG1hcDsNCisgICAgKChDWEZBX0ltYWdlRWRpdERhdGEqKW1fcExheW91dERhdGEpLT5tX3BESUJpdG1hcCA9IE5VTEw7DQorICB9DQorICAoKENYRkFfSW1hZ2VFZGl0RGF0YSopbV9wTGF5b3V0RGF0YSktPm1fcERJQml0bWFwID0gbmV3SW1hZ2U7DQorfQ0KK0NYRkFfV2lkZ2V0TGF5b3V0RGF0YSogQ1hGQV9XaWRnZXRBY2M6OkdldFdpZGdldExheW91dERhdGEoKSB7DQorICByZXR1cm4gbV9wTGF5b3V0RGF0YTsNCit9DQorSUZYX0ZvbnQqIENYRkFfV2lkZ2V0QWNjOjpHZXRGREVGb250KCkgew0KKyAgQ0ZYX1dpZGVTdHJpbmdDIHdzRm9udE5hbWUgPSBGWF9XU1RSQyhMIkNvdXJpZXIiKTsNCisgIEZYX0RXT1JEIGR3Rm9udFN0eWxlID0gMDsNCisgIGlmIChDWEZBX0ZvbnQgZm9udCA9IHRoaXMtPkdldEZvbnQoKSkgew0KKyAgICBpZiAoZm9udC5Jc0JvbGQoKSkgew0KKyAgICAgIGR3Rm9udFN0eWxlIHw9IEZYX0ZPTlRTVFlMRV9Cb2xkOw0KKyAgICB9DQorICAgIGlmIChmb250LklzSXRhbGljKCkpIHsNCisgICAgICBkd0ZvbnRTdHlsZSB8PSBGWF9GT05UU1RZTEVfSXRhbGljOw0KKyAgICB9DQorICAgIGZvbnQuR2V0VHlwZWZhY2Uod3NGb250TmFtZSk7DQorICB9DQorICBDWEZBX0ZGRG9jKiBwRG9jID0gR2V0RG9jKCk7DQorICByZXR1cm4gcERvYy0+R2V0QXBwKCktPkdldFhGQUZvbnRNZ3IoKS0+R2V0Rm9udChwRG9jLCB3c0ZvbnROYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdGb250U3R5bGUpOw0KK30NCitGWF9GTE9BVCBDWEZBX1dpZGdldEFjYzo6R2V0Rm9udFNpemUoKSB7DQorICBGWF9GTE9BVCBmRm9udFNpemUgPSAxMC4wZjsNCisgIGlmIChDWEZBX0ZvbnQgZm9udCA9IHRoaXMtPkdldEZvbnQoKSkgew0KKyAgICBmRm9udFNpemUgPSBmb250LkdldEZvbnRTaXplKCk7DQorICB9DQorICByZXR1cm4gZkZvbnRTaXplIDwgMC4xZiA/IDEwLjBmIDogZkZvbnRTaXplOw0KK30NCitGWF9GTE9BVCBDWEZBX1dpZGdldEFjYzo6R2V0TGluZUhlaWdodCgpIHsNCisgIEZYX0ZMT0FUIGZMaW5lSGVpZ2h0ID0gMDsNCisgIGlmIChDWEZBX1BhcmEgcGFyYSA9IHRoaXMtPkdldFBhcmEoKSkgew0KKyAgICBmTGluZUhlaWdodCA9IHBhcmEuR2V0TGluZUhlaWdodCgpOw0KKyAgfQ0KKyAgaWYgKGZMaW5lSGVpZ2h0IDwgMSkgew0KKyAgICBmTGluZUhlaWdodCA9IEdldEZvbnRTaXplKCkgKiAxLjJmOw0KKyAgfQ0KKyAgcmV0dXJuIGZMaW5lSGVpZ2h0Ow0KK30NCitGWF9BUkdCIENYRkFfV2lkZ2V0QWNjOjpHZXRUZXh0Q29sb3IoKSB7DQorICBpZiAoQ1hGQV9Gb250IGZvbnQgPSB0aGlzLT5HZXRGb250KCkpIHsNCisgICAgcmV0dXJuIGZvbnQuR2V0Q29sb3IoKTsNCisgIH0NCisgIHJldHVybiAweEZGMDAwMDAwOw0KK30NCitDWEZBX05vZGUqIENYRkFfVGV4dFByb3ZpZGVyOjpHZXRUZXh0Tm9kZShGWF9CT09MJiBiUmljaFRleHQpIHsNCisgIGJSaWNoVGV4dCA9IEZBTFNFOw0KKyAgaWYgKG1fcFRleHROb2RlKSB7DQorICAgIGlmIChtX3BUZXh0Tm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4RGF0YSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudFR5cGU7DQorICAgICAgbV9wVGV4dE5vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOw0KKyAgICAgIGlmICh3c0NvbnRlbnRUeXBlLkVxdWFsKEZYX1dTVFJDKEwidGV4dC9odG1sIikpKSB7DQorICAgICAgICBiUmljaFRleHQgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gbV9wVGV4dE5vZGU7DQorICB9DQorICBpZiAobV9lVHlwZSA9PSBYRkFfVEVYVFBST1ZJREVSVFlQRV9UZXh0KSB7DQorICAgIENYRkFfTm9kZSogcEVsZW1lbnROb2RlID0gbV9wV2lkZ2V0QWNjLT5HZXROb2RlKCk7DQorICAgIENYRkFfTm9kZSogcFZhbHVlTm9kZSA9IHBFbGVtZW50Tm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfVmFsdWUpOw0KKyAgICBpZiAoIXBWYWx1ZU5vZGUpIHsNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwVmFsdWVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgIGlmIChwQ2hpbGROb2RlICYmIHBDaGlsZE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9FeERhdGEpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlOw0KKyAgICAgIHBDaGlsZE5vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlLCBGQUxTRSk7DQorICAgICAgaWYgKHdzQ29udGVudFR5cGUuRXF1YWwoRlhfV1NUUkMoTCJ0ZXh0L2h0bWwiKSkpIHsNCisgICAgICAgIGJSaWNoVGV4dCA9IFRSVUU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBwQ2hpbGROb2RlOw0KKyAgfSBlbHNlIGlmIChtX2VUeXBlID09IFhGQV9URVhUUFJPVklERVJUWVBFX0RhdGFzZXRzKSB7DQorICAgIENYRkFfTm9kZSogcEJpbmQgPSBtX3BXaWRnZXRBY2MtPkdldERhdGFzZXRzKCk7DQorICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBwQmluZC0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBYTUxOb2RlKTsNCisgICAgZm9yIChJRkRFX1hNTE5vZGUqIHBYTUxDaGlsZCA9DQorICAgICAgICAgICAgIHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOw0KKyAgICAgICAgIHBYTUxDaGlsZDsNCisgICAgICAgICBwWE1MQ2hpbGQgPSBwWE1MQ2hpbGQtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQorICAgICAgaWYgKHBYTUxDaGlsZC0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgIElGREVfWE1MRWxlbWVudCogcEVsZW1lbnQgPSAoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQ7DQorICAgICAgICBpZiAoWEZBX1JlY29nbml6ZVJpY2hUZXh0KHBFbGVtZW50KSkgew0KKyAgICAgICAgICBiUmljaFRleHQgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gcEJpbmQ7DQorICB9IGVsc2UgaWYgKG1fZVR5cGUgPT0gWEZBX1RFWFRQUk9WSURFUlRZUEVfQ2FwdGlvbikgew0KKyAgICBDWEZBX05vZGUqIHBDYXB0aW9uTm9kZSA9DQorICAgICAgICBtX3BXaWRnZXRBY2MtPkdldE5vZGUoKS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfQ2FwdGlvbik7DQorICAgIGlmIChwQ2FwdGlvbk5vZGUgPT0gTlVMTCkgew0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcFZhbHVlTm9kZSA9IHBDYXB0aW9uTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfVmFsdWUpOw0KKyAgICBpZiAocFZhbHVlTm9kZSA9PSBOVUxMKSB7DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcFZhbHVlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBpZiAocENoaWxkTm9kZSAmJiBwQ2hpbGROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhEYXRhKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZTsNCisgICAgICBwQ2hpbGROb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSwgRkFMU0UpOw0KKyAgICAgIGlmICh3c0NvbnRlbnRUeXBlLkVxdWFsKEZYX1dTVFJDKEwidGV4dC9odG1sIikpKSB7DQorICAgICAgICBiUmljaFRleHQgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gcENoaWxkTm9kZTsNCisgIH0NCisgIENYRkFfTm9kZSogcEl0ZW1Ob2RlID0NCisgICAgICBtX3BXaWRnZXRBY2MtPkdldE5vZGUoKS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfSXRlbXMpOw0KKyAgaWYgKHBJdGVtTm9kZSA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBJdGVtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgd2hpbGUgKHBOb2RlKSB7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c05hbWU7DQorICAgIHBOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7DQorICAgIGlmIChtX2VUeXBlID09IFhGQV9URVhUUFJPVklERVJUWVBFX1JvbGxvdmVyICYmDQorICAgICAgICB3c05hbWUgPT0gRlhfV1NUUkMoTCJyb2xsb3ZlciIpKSB7DQorICAgICAgcmV0dXJuIHBOb2RlOw0KKyAgICB9DQorICAgIGlmIChtX2VUeXBlID09IFhGQV9URVhUUFJPVklERVJUWVBFX0Rvd24gJiYgd3NOYW1lID09IEZYX1dTVFJDKEwiZG93biIpKSB7DQorICAgICAgcmV0dXJuIHBOb2RlOw0KKyAgICB9DQorICAgIHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorQ1hGQV9QYXJhIENYRkFfVGV4dFByb3ZpZGVyOjpHZXRQYXJhTm9kZSgpIHsNCisgIGlmIChtX2VUeXBlID09IFhGQV9URVhUUFJPVklERVJUWVBFX1RleHQpIHsNCisgICAgcmV0dXJuIG1fcFdpZGdldEFjYy0+R2V0UGFyYSgpOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcFdpZGdldEFjYy0+R2V0Tm9kZSgpLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9DYXB0aW9uKTsNCisgIHJldHVybiBwTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfUGFyYSk7DQorfQ0KK0NYRkFfRm9udCBDWEZBX1RleHRQcm92aWRlcjo6R2V0Rm9udE5vZGUoKSB7DQorICBpZiAobV9lVHlwZSA9PSBYRkFfVEVYVFBST1ZJREVSVFlQRV9UZXh0KSB7DQorICAgIHJldHVybiBtX3BXaWRnZXRBY2MtPkdldEZvbnQoKTsNCisgIH0NCisgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BXaWRnZXRBY2MtPkdldE5vZGUoKS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfQ2FwdGlvbik7DQorICBwTm9kZSA9IHBOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9Gb250KTsNCisgIGlmIChwTm9kZSkgew0KKyAgICByZXR1cm4gcE5vZGU7DQorICB9DQorICByZXR1cm4gbV9wV2lkZ2V0QWNjLT5HZXRGb250KCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9UZXh0UHJvdmlkZXI6OklzQ2hlY2tCdXR0b25BbmRBdXRvV2lkdGgoKSB7DQorICBYRkFfRUxFTUVOVCBlVHlwZSA9IG1fcFdpZGdldEFjYy0+R2V0VUlUeXBlKCk7DQorICBpZiAoZVR5cGUgPT0gWEZBX0VMRU1FTlRfQ2hlY2tCdXR0b24pIHsNCisgICAgRlhfRkxPQVQgZldpZHRoID0gMDsNCisgICAgcmV0dXJuICFtX3BXaWRnZXRBY2MtPkdldFdpZHRoKGZXaWR0aCk7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9UZXh0UHJvdmlkZXI6OkdldEVtYmJlZE9iaihGWF9CT09MIGJVUkksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJhdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpIHsNCisgIGlmIChtX2VUeXBlICE9IFhGQV9URVhUUFJPVklERVJUWVBFX1RleHQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGJVUkkpIHsNCisgICAgQ1hGQV9Ob2RlKiBwV2lkZ2V0Tm9kZSA9IG1fcFdpZGdldEFjYy0+R2V0Tm9kZSgpOw0KKyAgICBDWEZBX05vZGUqIHBQYXJlbnQgPSBwV2lkZ2V0Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBXaWRnZXROb2RlLT5HZXREb2N1bWVudCgpOw0KKyAgICBDWEZBX05vZGUqIHBJRE5vZGUgPSBOVUxMOw0KKyAgICBDWEZBX1dpZGdldEFjYyogcEVtYkFjYyA9IE5VTEw7DQorICAgIGlmIChwUGFyZW50KSB7DQorICAgICAgcElETm9kZSA9IHBEb2N1bWVudC0+R2V0Tm9kZUJ5SUQocFBhcmVudCwgd3NBdHRyKTsNCisgICAgfQ0KKyAgICBpZiAoIXBJRE5vZGUpIHsNCisgICAgICBwSUROb2RlID0gcERvY3VtZW50LT5HZXROb2RlQnlJRCgNCisgICAgICAgICAgKENYRkFfTm9kZSopcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKSwgd3NBdHRyKTsNCisgICAgfQ0KKyAgICBpZiAocElETm9kZSkgew0KKyAgICAgIHBFbWJBY2MgPSAoQ1hGQV9XaWRnZXRBY2MqKXBJRE5vZGUtPkdldFdpZGdldERhdGEoKTsNCisgICAgfQ0KKyAgICBpZiAocEVtYkFjYykgew0KKyAgICAgIHBFbWJBY2MtPkdldFZhbHVlKHdzVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0YWNjLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXRhY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjlmY2NkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0YWNjLmgKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9GWEZBX0ZPUk1GSUxMRVJfV0lER0VUQUNDX0lNUF9IDQorI2RlZmluZSBfRlhGQV9GT1JNRklMTEVSX1dJREdFVEFDQ19JTVBfSA0KKyNpbmNsdWRlICJ4ZmFfdGV4dGxheW91dC5oIg0KK2VudW0gWEZBX1RFWFRQUk9WSURFUlRZUEUgew0KKyAgWEZBX1RFWFRQUk9WSURFUlRZUEVfVGV4dCwNCisgIFhGQV9URVhUUFJPVklERVJUWVBFX0RhdGFzZXRzLA0KKyAgWEZBX1RFWFRQUk9WSURFUlRZUEVfQ2FwdGlvbiwNCisgIFhGQV9URVhUUFJPVklERVJUWVBFX1JvbGxvdmVyLA0KKyAgWEZBX1RFWFRQUk9WSURFUlRZUEVfRG93biwNCit9Ow0KK2NsYXNzIENYRkFfVGV4dFByb3ZpZGVyIDogcHVibGljIElYRkFfVGV4dFByb3ZpZGVyIHsNCisgcHVibGljOg0KKyAgQ1hGQV9UZXh0UHJvdmlkZXIoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MsDQorICAgICAgICAgICAgICAgICAgICBYRkFfVEVYVFBST1ZJREVSVFlQRSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFRleHROb2RlID0gTlVMTCkNCisgICAgICA6IG1fcFdpZGdldEFjYyhwV2lkZ2V0QWNjKSwgbV9lVHlwZShlVHlwZSksIG1fcFRleHROb2RlKHBUZXh0Tm9kZSkgew0KKyAgICBGWFNZU19hc3NlcnQobV9wV2lkZ2V0QWNjICE9IE5VTEwpOw0KKyAgfQ0KKyAgdmlydHVhbCB+Q1hGQV9UZXh0UHJvdmlkZXIoKSB7fQ0KKyAgdmlydHVhbCBDWEZBX05vZGUqIEdldFRleHROb2RlKEZYX0JPT0wmIGJSaWNoVGV4dCk7DQorICB2aXJ0dWFsIENYRkFfUGFyYSBHZXRQYXJhTm9kZSgpOw0KKyAgdmlydHVhbCBDWEZBX0ZvbnQgR2V0Rm9udE5vZGUoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0NoZWNrQnV0dG9uQW5kQXV0b1dpZHRoKCk7DQorICB2aXJ0dWFsIENYRkFfRkZEb2MqIEdldERvY05vZGUoKSB7IHJldHVybiBtX3BXaWRnZXRBY2MtPkdldERvYygpOyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0RW1iYmVkT2JqKEZYX0JPT0wgYlVSSSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUmF3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSk7DQorDQorIHByb3RlY3RlZDoNCisgIENYRkFfV2lkZ2V0QWNjKiBtX3BXaWRnZXRBY2M7DQorICBYRkFfVEVYVFBST1ZJREVSVFlQRSBtX2VUeXBlOw0KKyAgQ1hGQV9Ob2RlKiBtX3BUZXh0Tm9kZTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZndpZGdldGhhbmRsZXIuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0aGFuZGxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmOThhNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mZndpZGdldGhhbmRsZXIuY3BwCkBAIC0wLDAgKzEsNjM5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9jb21tb24uaCINCisjaW5jbHVkZSAieGZhX2Z3bGFkYXB0ZXIuaCINCisjaW5jbHVkZSAieGZhX2Zmd2lkZ2V0aGFuZGxlci5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZ3aWRnZXQuaCINCisjaW5jbHVkZSAieGZhX2ZmZmllbGQuaCINCisjaW5jbHVkZSAieGZhX2ZmY2hvaWNlbGlzdC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZkb2MuaCINCisjaW5jbHVkZSAieGZhX2ZmZG9jdmlldy5oIg0KK0NYRkFfRkZXaWRnZXRIYW5kbGVyOjpDWEZBX0ZGV2lkZ2V0SGFuZGxlcihDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcpDQorICAgIDogbV9wRG9jVmlldyhwRG9jVmlldykge30NCitDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6fkNYRkFfRkZXaWRnZXRIYW5kbGVyKCkge30NCitJWEZBX1BhZ2VWaWV3KiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6R2V0UGFnZVZpZXcoSVhGQV9XaWRnZXQqIGhXaWRnZXQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPkdldFBhZ2VWaWV3KCk7DQorfQ0KK3ZvaWQgQ1hGQV9GRldpZGdldEhhbmRsZXI6OkdldFJlY3QoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIENGWF9SZWN0RiYgcnQpIHsNCisgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+R2V0V2lkZ2V0UmVjdChydCk7DQorfQ0KK0ZYX0RXT1JEIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpHZXRTdGF0dXMoSVhGQV9XaWRnZXQqIGhXaWRnZXQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPkdldFN0YXR1cygpOw0KK30NCitGWF9CT09MIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpHZXRCQm94KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydEJveCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3RhdHVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRHJhd0ZvY3VzKSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpDQorICAgICAgLT5HZXRCQm94KHJ0Qm94LCBkd1N0YXR1cywgYkRyYXdGb2N1cyk7DQorfQ0KK0NYRkFfV2lkZ2V0QWNjKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6R2V0RGF0YUFjYyhJWEZBX1dpZGdldCogaFdpZGdldCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+R2V0RGF0YUFjYygpOw0KK30NCit2b2lkIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpHZXROYW1lKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU5hbWVUeXBlKSB7DQorICBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPkdldERhdGFBY2MoKS0+R2V0TmFtZSh3c05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTmFtZVR5cGUpOw0KK30NCitGWF9CT09MIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpHZXRUb29sVGlwKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVG9vbFRpcCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+R2V0VG9vbFRpcCh3c1Rvb2xUaXApOw0KK30NCit2b2lkIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpTZXRQcml2YXRlRGF0YShJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBtb2R1bGVfaWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcERhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERfQ0FMTEJBQ0tfRlJFRURBVEEgY2FsbGJhY2spIHsNCisgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KQ0KKyAgICAgIC0+U2V0UHJpdmF0ZURhdGEobW9kdWxlX2lkLCBwRGF0YSwgY2FsbGJhY2spOw0KK30NCit2b2lkKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6R2V0UHJpdmF0ZURhdGEoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG1vZHVsZV9pZCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+R2V0UHJpdmF0ZURhdGEobW9kdWxlX2lkKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25Nb3VzZUVudGVyKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSB7DQorICBtX3BEb2NWaWV3LT5Mb2NrVXBkYXRlKCk7DQorICBGWF9CT09MIGJSZXQgPSBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPk9uTW91c2VFbnRlcigpOw0KKyAgbV9wRG9jVmlldy0+VW5sb2NrVXBkYXRlKCk7DQorICBtX3BEb2NWaWV3LT5VcGRhdGVEb2NWaWV3KCk7DQorICByZXR1cm4gYlJldDsNCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25Nb3VzZUV4aXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQpIHsNCisgIG1fcERvY1ZpZXctPkxvY2tVcGRhdGUoKTsNCisgIEZYX0JPT0wgYlJldCA9IHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+T25Nb3VzZUV4aXQoKTsNCisgIG1fcERvY1ZpZXctPlVubG9ja1VwZGF0ZSgpOw0KKyAgbV9wRG9jVmlldy0+VXBkYXRlRG9jVmlldygpOw0KKyAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uTEJ1dHRvbkRvd24oSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgbV9wRG9jVmlldy0+TG9ja1VwZGF0ZSgpOw0KKyAgc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5Sb3RhdGUyTm9ybWFsKGZ4LCBmeSk7DQorICBGWF9CT09MIGJSZXQgPQ0KKyAgICAgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+T25MQnV0dG9uRG93bihkd0ZsYWdzLCBmeCwgZnkpOw0KKyAgaWYgKGJSZXQgJiYgbV9wRG9jVmlldy0+U2V0Rm9jdXMoaFdpZGdldCkpIHsNCisgICAgKChDWEZBX0ZGRG9jKiltX3BEb2NWaWV3LT5HZXREb2MoKSkNCisgICAgICAgIC0+R2V0RG9jUHJvdmlkZXIoKQ0KKyAgICAgICAgLT5TZXRGb2N1c1dpZGdldChtX3BEb2NWaWV3LT5HZXREb2MoKSwgKElYRkFfV2lkZ2V0KiloV2lkZ2V0KTsNCisgIH0NCisgIG1fcERvY1ZpZXctPlVubG9ja1VwZGF0ZSgpOw0KKyAgbV9wRG9jVmlldy0+VXBkYXRlRG9jVmlldygpOw0KKyAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uTEJ1dHRvblVwKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIG1fcERvY1ZpZXctPkxvY2tVcGRhdGUoKTsNCisgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+Um90YXRlMk5vcm1hbChmeCwgZnkpOw0KKyAgbV9wRG9jVmlldy0+bV9iTGF5b3V0RXZlbnQgPSBUUlVFOw0KKyAgRlhfQk9PTCBiUmV0ID0NCisgICAgICBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPk9uTEJ1dHRvblVwKGR3RmxhZ3MsIGZ4LCBmeSk7DQorICBtX3BEb2NWaWV3LT5VbmxvY2tVcGRhdGUoKTsNCisgIG1fcERvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsNCisgIHJldHVybiBiUmV0Ow0KK30NCitGWF9CT09MIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpPbkxCdXR0b25EYmxDbGsoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5Sb3RhdGUyTm9ybWFsKGZ4LCBmeSk7DQorICBGWF9CT09MIGJSZXQgPQ0KKyAgICAgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+T25MQnV0dG9uRGJsQ2xrKGR3RmxhZ3MsIGZ4LCBmeSk7DQorICBtX3BEb2NWaWV3LT5SdW5JbnZhbGlkYXRlKCk7DQorICByZXR1cm4gYlJldDsNCit9DQorRlhfQk9PTCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25Nb3VzZU1vdmUoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5Sb3RhdGUyTm9ybWFsKGZ4LCBmeSk7DQorICBGWF9CT09MIGJSZXQgPQ0KKyAgICAgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+T25Nb3VzZU1vdmUoZHdGbGFncywgZngsIGZ5KTsNCisgIG1fcERvY1ZpZXctPlJ1bkludmFsaWRhdGUoKTsNCisgIHJldHVybiBiUmV0Ow0KK30NCitGWF9CT09MIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpPbk1vdXNlV2hlZWwoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgekRlbHRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpIHsNCisgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+Um90YXRlMk5vcm1hbChmeCwgZnkpOw0KKyAgRlhfQk9PTCBiUmV0ID0gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpDQorICAgICAgICAgICAgICAgICAgICAgLT5Pbk1vdXNlV2hlZWwoZHdGbGFncywgekRlbHRhLCBmeCwgZnkpOw0KKyAgbV9wRG9jVmlldy0+UnVuSW52YWxpZGF0ZSgpOw0KKyAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uUkJ1dHRvbkRvd24oSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5Sb3RhdGUyTm9ybWFsKGZ4LCBmeSk7DQorICBGWF9CT09MIGJSZXQgPQ0KKyAgICAgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+T25SQnV0dG9uRG93bihkd0ZsYWdzLCBmeCwgZnkpOw0KKyAgaWYgKGJSZXQgJiYgbV9wRG9jVmlldy0+U2V0Rm9jdXMoaFdpZGdldCkpIHsNCisgICAgKChDWEZBX0ZGRG9jKiltX3BEb2NWaWV3LT5HZXREb2MoKSkNCisgICAgICAgIC0+R2V0RG9jUHJvdmlkZXIoKQ0KKyAgICAgICAgLT5TZXRGb2N1c1dpZGdldChtX3BEb2NWaWV3LT5HZXREb2MoKSwgKElYRkFfV2lkZ2V0KiloV2lkZ2V0KTsNCisgIH0NCisgIG1fcERvY1ZpZXctPlJ1bkludmFsaWRhdGUoKTsNCisgIHJldHVybiBiUmV0Ow0KK30NCitGWF9CT09MIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpPblJCdXR0b25VcChJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPlJvdGF0ZTJOb3JtYWwoZngsIGZ5KTsNCisgIEZYX0JPT0wgYlJldCA9DQorICAgICAgc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5PblJCdXR0b25VcChkd0ZsYWdzLCBmeCwgZnkpOw0KKyAgbV9wRG9jVmlldy0+UnVuSW52YWxpZGF0ZSgpOw0KKyAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uUkJ1dHRvbkRibENsayhJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPlJvdGF0ZTJOb3JtYWwoZngsIGZ5KTsNCisgIEZYX0JPT0wgYlJldCA9DQorICAgICAgc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5PblJCdXR0b25EYmxDbGsoZHdGbGFncywgZngsIGZ5KTsNCisgIG1fcERvY1ZpZXctPlJ1bkludmFsaWRhdGUoKTsNCisgIHJldHVybiBiUmV0Ow0KK30NCitGWF9CT09MIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpPbktleURvd24oSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3S2V5Q29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncykgew0KKyAgRlhfQk9PTCBiUmV0ID0NCisgICAgICBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPk9uS2V5RG93bihkd0tleUNvZGUsIGR3RmxhZ3MpOw0KKyAgbV9wRG9jVmlldy0+UnVuSW52YWxpZGF0ZSgpOw0KKyAgbV9wRG9jVmlldy0+VXBkYXRlRG9jVmlldygpOw0KKyAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uS2V5VXAoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0tleUNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKSB7DQorICBGWF9CT09MIGJSZXQgPQ0KKyAgICAgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+T25LZXlVcChkd0tleUNvZGUsIGR3RmxhZ3MpOw0KKyAgbV9wRG9jVmlldy0+UnVuSW52YWxpZGF0ZSgpOw0KKyAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uQ2hhcihJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDaGFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKSB7DQorICBGWF9CT09MIGJSZXQgPSBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPk9uQ2hhcihkd0NoYXIsIGR3RmxhZ3MpOw0KKyAgbV9wRG9jVmlldy0+UnVuSW52YWxpZGF0ZSgpOw0KKyAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0RXT1JEIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpPbkhpdFRlc3QoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KSB7DQorICBpZiAoIShzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPkdldFN0YXR1cygpICYNCisgICAgICAgIFhGQV9XSURHRVRTVEFUVVNfVmlzaWJsZSkpIHsNCisgICAgcmV0dXJuIEZXTF9XR1RISVRURVNUX1Vua25vd247DQorICB9DQorICBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPlJvdGF0ZTJOb3JtYWwoZngsIGZ5KTsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPk9uSGl0VGVzdChmeCwgZnkpOw0KK30NCitGWF9CT09MIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpPblNldEN1cnNvcihJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5Sb3RhdGUyTm9ybWFsKGZ4LCBmeSk7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5PblNldEN1cnNvcihmeCwgZnkpOw0KK30NCit2b2lkIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpSZW5kZXJXaWRnZXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJIaWdobGlnaHQpIHsNCisgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+UmVuZGVyV2lkZ2V0KA0KKyAgICAgIHBHUywgcE1hdHJpeCwgYkhpZ2hsaWdodCA/IFhGQV9XSURHRVRTVEFUVVNfSGlnaGxpZ2h0IDogMCwgMCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Okhhc0V2ZW50KENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FVkVOVFRZUEUgZUV2ZW50VHlwZSkgew0KKyAgaWYgKCFwV2lkZ2V0QWNjIHx8IGVFdmVudFR5cGUgPT0gWEZBX0VWRU5UX1Vua25vd24pIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHBXaWRnZXRBY2MtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9EcmF3KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHN3aXRjaCAoZUV2ZW50VHlwZSkgew0KKyAgICBjYXNlIFhGQV9FVkVOVF9DYWxjdWxhdGU6IHsNCisgICAgICBDWEZBX0NhbGN1bGF0ZSBjYWxjID0gcFdpZGdldEFjYy0+R2V0Q2FsY3VsYXRlKCk7DQorICAgICAgaWYgKCFjYWxjKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGlmIChjYWxjLkdldFNjcmlwdCgpKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGNhc2UgWEZBX0VWRU5UX1ZhbGlkYXRlOiB7DQorICAgICAgQ1hGQV9WYWxpZGF0ZSB2YWwgPSBwV2lkZ2V0QWNjLT5HZXRWYWxpZGF0ZSgpOw0KKyAgICAgIGlmICghdmFsKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGlmICh2YWwuR2V0U2NyaXB0KCkpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIENYRkFfTm9kZUFycmF5IGV2ZW50QXJyYXk7DQorICByZXR1cm4gcFdpZGdldEFjYy0+R2V0RXZlbnRCeUFjdGl2aXR5KGdzX0V2ZW50QWN0aXZpdHlbZUV2ZW50VHlwZV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50QXJyYXkpOw0KK30NCitpbnQzMl90IENYRkFfRkZXaWRnZXRIYW5kbGVyOjpQcm9jZXNzRXZlbnQoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRXZlbnRQYXJhbSogcFBhcmFtKSB7DQorICBpZiAoIXBQYXJhbSB8fCBwUGFyYW0tPm1fZVR5cGUgPT0gWEZBX0VWRU5UX1Vua25vd24pIHsNCisgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KKyAgfQ0KKyAgaWYgKCFwV2lkZ2V0QWNjIHx8IHBXaWRnZXRBY2MtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9EcmF3KSB7DQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgIH0NCisgIHN3aXRjaCAocFBhcmFtLT5tX2VUeXBlKSB7DQorICAgIGNhc2UgWEZBX0VWRU5UX0NhbGN1bGF0ZToNCisgICAgICByZXR1cm4gcFdpZGdldEFjYy0+UHJvY2Vzc0NhbGN1bGF0ZSgpOw0KKyAgICBjYXNlIFhGQV9FVkVOVF9WYWxpZGF0ZToNCisgICAgICBpZiAoKChDWEZBX0ZGRG9jKiltX3BEb2NWaWV3LT5HZXREb2MoKSkNCisgICAgICAgICAgICAgIC0+R2V0RG9jUHJvdmlkZXIoKQ0KKyAgICAgICAgICAgICAgLT5Jc1ZhbGlkYXRpb25zRW5hYmxlZChtX3BEb2NWaWV3LT5HZXREb2MoKSkpIHsNCisgICAgICAgIHJldHVybiBwV2lkZ2V0QWNjLT5Qcm9jZXNzVmFsaWRhdGUoKTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX0Rpc2FibGVkOw0KKyAgICBjYXNlIFhGQV9FVkVOVF9Jbml0Q2FsY3VsYXRlOiB7DQorICAgICAgQ1hGQV9DYWxjdWxhdGUgY2FsYyA9IHBXaWRnZXRBY2MtPkdldENhbGN1bGF0ZSgpOw0KKyAgICAgIGlmICghY2FsYykgew0KKyAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0Ow0KKyAgICAgIH0NCisgICAgICBpZiAocFdpZGdldEFjYy0+R2V0Tm9kZSgpLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19Vc2VySW50ZXJhY3RpdmUpKSB7DQorICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRGlzYWJsZWQ7DQorICAgICAgfQ0KKyAgICAgIENYRkFfU2NyaXB0IHNjcmlwdCA9IGNhbGMuR2V0U2NyaXB0KCk7DQorICAgICAgcmV0dXJuIHBXaWRnZXRBY2MtPkV4ZWN1dGVTY3JpcHQoc2NyaXB0LCBwUGFyYW0pOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICBpbnQzMl90IGlSZXQgPQ0KKyAgICAgIHBXaWRnZXRBY2MtPlByb2Nlc3NFdmVudChnc19FdmVudEFjdGl2aXR5W3BQYXJhbS0+bV9lVHlwZV0sIHBQYXJhbSk7DQorICByZXR1cm4gaVJldDsNCit9DQorSVhGQV9XaWRnZXQqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVXaWRnZXQoSVhGQV9XaWRnZXQqIGhQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1dJREdFVFRZUEUgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhGQV9XaWRnZXQqIGhCZWZvcmUpIHsNCisgIENYRkFfTm9kZSogcFBhcmVudEZvcm1JdGVtID0NCisgICAgICBoUGFyZW50ID8gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhQYXJlbnQpLT5HZXREYXRhQWNjKCktPkdldE5vZGUoKQ0KKyAgICAgICAgICAgICAgOiBOVUxMOw0KKyAgQ1hGQV9Ob2RlKiBwQmVmb3JlRm9ybUl0ZW0gPQ0KKyAgICAgIGhCZWZvcmUgPyBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaEJlZm9yZSktPkdldERhdGFBY2MoKS0+R2V0Tm9kZSgpDQorICAgICAgICAgICAgICA6IE5VTEw7DQorICBDWEZBX05vZGUqIHBOZXdGb3JtSXRlbSA9DQorICAgICAgQ3JlYXRlV2lkZ2V0Rm9ybUl0ZW0oZVR5cGUsIHBQYXJlbnRGb3JtSXRlbSwgcEJlZm9yZUZvcm1JdGVtKTsNCisgIGlmIChwTmV3Rm9ybUl0ZW0gPT0gTlVMTCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHBOZXdGb3JtSXRlbS0+R2V0VGVtcGxhdGVOb2RlKCktPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCisgIHBOZXdGb3JtSXRlbS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KKyAgbV9wRG9jVmlldy0+UnVuTGF5b3V0KCk7DQorICBDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXQgPQ0KKyAgICAgIG1fcERvY1ZpZXctPkdldFhGQUxheW91dCgpLT5HZXRMYXlvdXRJdGVtKHBOZXdGb3JtSXRlbSk7DQorICByZXR1cm4gKElYRkFfV2lkZ2V0KilwTGF5b3V0Ow0KK30NCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVXaWRnZXRGb3JtSXRlbSgNCisgICAgWEZBX1dJREdFVFRZUEUgZVR5cGUsDQorICAgIENYRkFfTm9kZSogcFBhcmVudCwNCisgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7DQorICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfQmFyY29kZToNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9QdXNoQnV0dG9uOg0KKyAgICAgIHJldHVybiBDcmVhdGVQdXNoQnV0dG9uKHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICBjYXNlIFhGQV9XSURHRVRUWVBFX0NoZWNrQnV0dG9uOg0KKyAgICAgIHJldHVybiBDcmVhdGVDaGVja0J1dHRvbihwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9FeGNsdWRlR3JvdXA6DQorICAgICAgcmV0dXJuIENyZWF0ZUV4Y2xHcm91cChwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9SYWRpb0J1dHRvbjoNCisgICAgICByZXR1cm4gQ3JlYXRlUmFkaW9CdXR0b24ocFBhcmVudCwgcEJlZm9yZSk7DQorICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfQXJjOg0KKyAgICAgIHJldHVybiBDcmVhdGVBcmMocFBhcmVudCwgcEJlZm9yZSk7DQorICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfUmVjdGFuZ2xlOg0KKyAgICAgIHJldHVybiBDcmVhdGVSZWN0YW5nbGUocFBhcmVudCwgcEJlZm9yZSk7DQorICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfSW1hZ2U6DQorICAgICAgcmV0dXJuIENyZWF0ZUltYWdlKHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICBjYXNlIFhGQV9XSURHRVRUWVBFX0xpbmU6DQorICAgICAgcmV0dXJuIENyZWF0ZUxpbmUocFBhcmVudCwgcEJlZm9yZSk7DQorICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfVGV4dDoNCisgICAgICByZXR1cm4gQ3JlYXRlVGV4dChwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9EYXRldGltZUVkaXQ6DQorICAgICAgcmV0dXJuIENyZWF0ZURhdGV0aW1lRWRpdChwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9EZWNpbWFsRmllbGQ6DQorICAgICAgcmV0dXJuIENyZWF0ZURlY2ltYWxGaWVsZChwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9OdW1lcmljRmllbGQ6DQorICAgICAgcmV0dXJuIENyZWF0ZU51bWVyaWNGaWVsZChwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9TaWduYXR1cmU6DQorICAgICAgcmV0dXJuIENyZWF0ZVNpZ25hdHVyZShwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9UZXh0RWRpdDoNCisgICAgICByZXR1cm4gQ3JlYXRlVGV4dEVkaXQocFBhcmVudCwgcEJlZm9yZSk7DQorICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfRHJvcGRvd25MaXN0Og0KKyAgICAgIHJldHVybiBDcmVhdGVEcm9wZG93bkxpc3QocFBhcmVudCwgcEJlZm9yZSk7DQorICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfTGlzdEJveDoNCisgICAgICByZXR1cm4gQ3JlYXRlTGlzdEJveChwUGFyZW50LCBwQmVmb3JlKTsNCisgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9JbWFnZUZpZWxkOg0KKyAgICAgIHJldHVybiBDcmVhdGVJbWFnZUZpZWxkKHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICBjYXNlIFhGQV9XSURHRVRUWVBFX1Bhc3N3b3JkRWRpdDoNCisgICAgICByZXR1cm4gQ3JlYXRlUGFzc3dvcmRFZGl0KHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgICBjYXNlIFhGQV9XSURHRVRUWVBFX1N1YmZvcm06DQorICAgICAgcmV0dXJuIENyZWF0ZVN1YmZvcm0ocFBhcmVudCwgcEJlZm9yZSk7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlUHVzaEJ1dHRvbihDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsNCisgIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRmllbGQoWEZBX0VMRU1FTlRfQnV0dG9uLCBwUGFyZW50LCBwQmVmb3JlKTsNCisgIENYRkFfTm9kZSogcENhcHRpb24gPSBDcmVhdGVDb3B5Tm9kZShYRkFfRUxFTUVOVF9DYXB0aW9uLCBwRmllbGQpOw0KKyAgQ1hGQV9Ob2RlKiBwVmFsdWUgPSBDcmVhdGVDb3B5Tm9kZShYRkFfRUxFTUVOVF9WYWx1ZSwgcENhcHRpb24pOw0KKyAgQ1hGQV9Ob2RlKiBwVGV4dCA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX1RleHQsIHBWYWx1ZSk7DQorICBwVGV4dC0+U2V0Q29udGVudChGWF9XU1RSQyhMIkJ1dHRvbiIpLCBGWF9XU1RSQyhMIkJ1dHRvbiIpLCBGQUxTRSk7DQorICBDWEZBX05vZGUqIHBQYXJhID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VMRU1FTlRfUGFyYSwgcENhcHRpb24pOw0KKyAgcFBhcmEtPlNldEVudW0oWEZBX0FUVFJJQlVURV9WQWxpZ24sIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZSwgRkFMU0UpOw0KKyAgcFBhcmEtPlNldEVudW0oWEZBX0FUVFJJQlVURV9IQWxpZ24sIFhGQV9BVFRSSUJVVEVFTlVNX0NlbnRlciwgRkFMU0UpOw0KKyAgQ3JlYXRlRm9udE5vZGUocENhcHRpb24pOw0KKyAgQ1hGQV9Ob2RlKiBwQm9yZGVyID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VMRU1FTlRfQm9yZGVyLCBwRmllbGQpOw0KKyAgcEJvcmRlci0+U2V0RW51bShYRkFfQVRUUklCVVRFX0hhbmQsIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0LCBGQUxTRSk7DQorICBDWEZBX05vZGUqIHBFZGdlID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VMRU1FTlRfRWRnZSwgcEJvcmRlcik7DQorICBwRWRnZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1N0cm9rZSwgWEZBX0FUVFJJQlVURUVOVU1fUmFpc2VkLCBGQUxTRSk7DQorICBDWEZBX05vZGUqIHBGaWxsID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VMRU1FTlRfRmlsbCwgcEJvcmRlcik7DQorICBDWEZBX05vZGUqIHBDb2xvciA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX0NvbG9yLCBwRmlsbCk7DQorICBwQ29sb3ItPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIEZYX1dTVFJDKEwiMjEyLCAyMDgsIDIwMCIpLCBGQUxTRSk7DQorICBDWEZBX05vZGUqIHBCaW5kID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VMRU1FTlRfQmluZCwgcEZpZWxkKTsNCisgIHBCaW5kLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfTWF0Y2gsIFhGQV9BVFRSSUJVVEVFTlVNX05vbmUpOw0KKyAgcmV0dXJuIHBGaWVsZDsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlQ2hlY2tCdXR0b24oQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Qgew0KKyAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVGaWVsZChYRkFfRUxFTUVOVF9DaGVja0J1dHRvbiwgcFBhcmVudCwgcEJlZm9yZSk7DQorICByZXR1cm4gcEZpZWxkOw0KK30NCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVFeGNsR3JvdXAoQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsNCisgIHJldHVybiBDcmVhdGVGb3JtSXRlbShYRkFfRUxFTUVOVF9FeGNsR3JvdXAsIHBQYXJlbnQsIHBCZWZvcmUpOw0KK30NCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVSYWRpb0J1dHRvbihDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7DQorICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZUZpZWxkKFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uLCBwUGFyZW50LCBwQmVmb3JlKTsNCisgIENYRkFfTm9kZSogcFVpID0gcEZpZWxkLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9VaSk7DQorICBDWEZBX05vZGUqIHBXaWRnZXQgPSBwVWktPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uKTsNCisgIHBXaWRnZXQtPlNldEVudW0oWEZBX0FUVFJJQlVURV9TaGFwZSwgWEZBX0FUVFJJQlVURUVOVU1fUm91bmQpOw0KKyAgcmV0dXJuIHBGaWVsZDsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlRGF0ZXRpbWVFZGl0KENYRkFfTm9kZSogcFBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7DQorICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZUZpZWxkKFhGQV9FTEVNRU5UX0RhdGVUaW1lRWRpdCwgcFBhcmVudCwgcEJlZm9yZSk7DQorICBDcmVhdGVWYWx1ZU5vZGUoWEZBX0VMRU1FTlRfRGF0ZSwgcEZpZWxkKTsNCisgIHJldHVybiBwRmllbGQ7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZURlY2ltYWxGaWVsZChDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Qgew0KKyAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVOdW1lcmljRmllbGQocFBhcmVudCwgcEJlZm9yZSk7DQorICBDcmVhdGVWYWx1ZU5vZGUoWEZBX0VMRU1FTlRfRGVjaW1hbCwgcEZpZWxkKTsNCisgIHJldHVybiBwRmllbGQ7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZU51bWVyaWNGaWVsZChDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Qgew0KKyAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVGaWVsZChYRkFfRUxFTUVOVF9OdW1lcmljRWRpdCwgcFBhcmVudCwgcEJlZm9yZSk7DQorICByZXR1cm4gcEZpZWxkOw0KK30NCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVTaWduYXR1cmUoQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsNCisgIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRmllbGQoWEZBX0VMRU1FTlRfU2lnbmF0dXJlLCBwUGFyZW50LCBwQmVmb3JlKTsNCisgIHJldHVybiBwRmllbGQ7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZVRleHRFZGl0KENYRkFfTm9kZSogcFBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsNCisgIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRmllbGQoWEZBX0VMRU1FTlRfVGV4dEVkaXQsIHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgcmV0dXJuIHBGaWVsZDsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlRHJvcGRvd25MaXN0KENYRkFfTm9kZSogcFBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7DQorICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZUZpZWxkKFhGQV9FTEVNRU5UX0Nob2ljZUxpc3QsIHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgcmV0dXJuIHBGaWVsZDsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlTGlzdEJveChDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsNCisgIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRHJvcGRvd25MaXN0KHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgQ1hGQV9Ob2RlKiBwVWkgPSBwRmllbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIENYRkFfTm9kZSogcExpc3RCb3ggPSBwVWktPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIHBMaXN0Qm94LT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfT3BlbiwgWEZBX0FUVFJJQlVURUVOVU1fQWx3YXlzKTsNCisgIHBMaXN0Qm94LT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfQ29tbWl0T24sIFhGQV9BVFRSSUJVVEVFTlVNX0V4aXQpOw0KKyAgcmV0dXJuIHBGaWVsZDsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlSW1hZ2VGaWVsZChDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsNCisgIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRmllbGQoWEZBX0VMRU1FTlRfSW1hZ2VFZGl0LCBwUGFyZW50LCBwQmVmb3JlKTsNCisgIHJldHVybiBwRmllbGQ7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZVBhc3N3b3JkRWRpdChDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Qgew0KKyAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVGaWVsZChYRkFfRUxFTUVOVF9QYXNzd29yZEVkaXQsIHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgQ1hGQV9Ob2RlKiBwQmluZCA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX0JpbmQsIHBGaWVsZCk7DQorICBwQmluZC0+U2V0RW51bShYRkFfQVRUUklCVVRFX01hdGNoLCBYRkFfQVRUUklCVVRFRU5VTV9Ob25lLCBGQUxTRSk7DQorICByZXR1cm4gcEZpZWxkOw0KK30NCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVGaWVsZChYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7DQorICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZUZvcm1JdGVtKFhGQV9FTEVNRU5UX0ZpZWxkLCBwUGFyZW50LCBwQmVmb3JlKTsNCisgIENyZWF0ZUNvcHlOb2RlKGVFbGVtZW50LCBDcmVhdGVDb3B5Tm9kZShYRkFfRUxFTUVOVF9VaSwgcEZpZWxkKSk7DQorICBDcmVhdGVGb250Tm9kZShwRmllbGQpOw0KKyAgcmV0dXJuIHBGaWVsZDsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlQXJjKENYRkFfTm9kZSogcFBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7DQorICByZXR1cm4gQ3JlYXRlRHJhdyhYRkFfRUxFTUVOVF9BcmMsIHBQYXJlbnQsIHBCZWZvcmUpOw0KK30NCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVSZWN0YW5nbGUoQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsNCisgIHJldHVybiBDcmVhdGVEcmF3KFhGQV9FTEVNRU5UX1JlY3RhbmdsZSwgcFBhcmVudCwgcEJlZm9yZSk7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUltYWdlKENYRkFfTm9kZSogcFBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsNCisgIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRHJhdyhYRkFfRUxFTUVOVF9JbWFnZSwgcFBhcmVudCwgcEJlZm9yZSk7DQorICBDcmVhdGVDb3B5Tm9kZShYRkFfRUxFTUVOVF9JbWFnZUVkaXQsIENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX1VpLCBwRmllbGQpKTsNCisgIHJldHVybiBwRmllbGQ7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUxpbmUoQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7DQorICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZURyYXcoWEZBX0VMRU1FTlRfTGluZSwgcFBhcmVudCwgcEJlZm9yZSk7DQorICByZXR1cm4gcEZpZWxkOw0KK30NCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVUZXh0KENYRkFfTm9kZSogcFBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Qgew0KKyAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVEcmF3KFhGQV9FTEVNRU5UX1RleHQsIHBQYXJlbnQsIHBCZWZvcmUpOw0KKyAgQ3JlYXRlQ29weU5vZGUoWEZBX0VMRU1FTlRfVGV4dEVkaXQsIENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX1VpLCBwRmllbGQpKTsNCisgIENyZWF0ZUZvbnROb2RlKHBGaWVsZCk7DQorICByZXR1cm4gcEZpZWxkOw0KK30NCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVEcmF3KFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7DQorICBDWEZBX05vZGUqIHBEcmF3ID0gQ3JlYXRlRm9ybUl0ZW0oWEZBX0VMRU1FTlRfRHJhdywgcFBhcmVudCwgcEJlZm9yZSk7DQorICBDcmVhdGVWYWx1ZU5vZGUoZUVsZW1lbnQsIHBEcmF3KTsNCisgIHJldHVybiBwRHJhdzsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlU3ViZm9ybShDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsNCisgIENYRkFfTm9kZSogcFN1YmZvcm0gPSBDcmVhdGVGb3JtSXRlbShYRkFfRUxFTUVOVF9TdWJmb3JtLCBwUGFyZW50LCBwQmVmb3JlKTsNCisgIHJldHVybiBwU3ViZm9ybTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlRm9ybUl0ZW0oWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Qgew0KKyAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVQYXJlbnQgPQ0KKyAgICAgIHBQYXJlbnQgIT0gTlVMTCA/IHBQYXJlbnQtPkdldFRlbXBsYXRlTm9kZSgpIDogTlVMTDsNCisgIENYRkFfTm9kZSogcE5ld0Zvcm1JdGVtID0gcFRlbXBsYXRlUGFyZW50LT5DbG9uZVRlbXBsYXRlVG9Gb3JtKEZBTFNFKTsNCisgIGlmIChwUGFyZW50ICE9IE5VTEwpIHsNCisgICAgcFBhcmVudC0+SW5zZXJ0Q2hpbGQocE5ld0Zvcm1JdGVtLCBwQmVmb3JlKTsNCisgIH0NCisgIHJldHVybiBwTmV3Rm9ybUl0ZW07DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsNCisgIENYRkFfTm9kZSogcFRlbXBsYXRlUGFyZW50ID0NCisgICAgICBwUGFyZW50ICE9IE5VTEwgPyBwUGFyZW50LT5HZXRUZW1wbGF0ZU5vZGUoKSA6IE5VTEw7DQorICBDWEZBX05vZGUqIHBOZXdOb2RlID0NCisgICAgICBDcmVhdGVUZW1wbGF0ZU5vZGUoZUVsZW1lbnQsIHBUZW1wbGF0ZVBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgcEJlZm9yZSA/IHBCZWZvcmUtPkdldFRlbXBsYXRlTm9kZSgpIDogTlVMTCkNCisgICAgICAgICAgLT5DbG9uZShGQUxTRSk7DQorICBpZiAocFBhcmVudCAhPSBOVUxMKSB7DQorICAgIHBQYXJlbnQtPkluc2VydENoaWxkKHBOZXdOb2RlLCBwQmVmb3JlKTsNCisgIH0NCisgIHJldHVybiBwTmV3Tm9kZTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlVGVtcGxhdGVOb2RlKFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Qgew0KKyAgQ1hGQV9Eb2N1bWVudCogcFhGQURvYyA9IEdldFhGQURvYygpOw0KKyAgQ1hGQV9Ob2RlKiBwTmV3VGVtcGxhdGVOb2RlID0gcFhGQURvYy0+R2V0UGFyc2VyKCktPkdldEZhY3RvcnkoKS0+Q3JlYXRlTm9kZSgNCisgICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlLCBlRWxlbWVudCk7DQorICBpZiAocFBhcmVudCAhPSBOVUxMKSB7DQorICAgIHBQYXJlbnQtPkluc2VydENoaWxkKHBOZXdUZW1wbGF0ZU5vZGUsIHBCZWZvcmUpOw0KKyAgfQ0KKyAgcmV0dXJuIHBOZXdUZW1wbGF0ZU5vZGU7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUZvbnROb2RlKENYRkFfTm9kZSogcFBhcmVudCkgY29uc3Qgew0KKyAgQ1hGQV9Ob2RlKiBwRm9udCA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX0ZvbnQsIHBQYXJlbnQpOw0KKyAgcEZvbnQtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVHlwZWZhY2UsIEZYX1dTVFJDKEwiTXlyaWFkIFBybyIpLCBGQUxTRSk7DQorICByZXR1cm4gcEZvbnQ7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZU1hcmdpbk5vZGUoQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZJbnNldHNbNF0pIGNvbnN0IHsNCisgIENYRkFfTm9kZSogcE1hcmdpbiA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX01hcmdpbiwgcFBhcmVudCk7DQorICBpZiAoZHdGbGFncyAmIDB4MDEpIHsNCisgICAgcE1hcmdpbi0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0xlZnRJbnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX01lYXN1cmVtZW50KGZJbnNldHNbMF0sIFhGQV9VTklUX1B0KSwgRkFMU0UpOw0KKyAgfQ0KKyAgaWYgKGR3RmxhZ3MgJiAweDAyKSB7DQorICAgIHBNYXJnaW4tPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Ub3BJbnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX01lYXN1cmVtZW50KGZJbnNldHNbMV0sIFhGQV9VTklUX1B0KSwgRkFMU0UpOw0KKyAgfQ0KKyAgaWYgKGR3RmxhZ3MgJiAweDA0KSB7DQorICAgIHBNYXJnaW4tPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9SaWdodEluc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTWVhc3VyZW1lbnQoZkluc2V0c1syXSwgWEZBX1VOSVRfUHQpLCBGQUxTRSk7DQorICB9DQorICBpZiAoZHdGbGFncyAmIDB4MDgpIHsNCisgICAgcE1hcmdpbi0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTWVhc3VyZW1lbnQoZkluc2V0c1szXSwgWEZBX1VOSVRfUHQpLCBGQUxTRSk7DQorICB9DQorICByZXR1cm4gcE1hcmdpbjsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlVmFsdWVOb2RlKFhGQV9FTEVNRU5UIGVWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50KSBjb25zdCB7DQorICBDWEZBX05vZGUqIHBWYWx1ZSA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UX1ZhbHVlLCBwUGFyZW50KTsNCisgIENyZWF0ZUNvcHlOb2RlKGVWYWx1ZSwgcFZhbHVlKTsNCisgIHJldHVybiBwVmFsdWU7DQorfQ0KK0lYRkFfT2JqRmFjdG9yeSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkdldE9iakZhY3RvcnkoKSBjb25zdCB7DQorICByZXR1cm4gR2V0WEZBRG9jKCktPkdldFBhcnNlcigpLT5HZXRGYWN0b3J5KCk7DQorfQ0KK0NYRkFfRG9jdW1lbnQqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpHZXRYRkFEb2MoKSBjb25zdCB7DQorICByZXR1cm4gKChDWEZBX0ZGRG9jKikobV9wRG9jVmlldy0+R2V0RG9jKCkpKS0+R2V0WEZBRG9jKCk7DQorfQ0KK0NYRkFfRkZNZW51SGFuZGxlcjo6Q1hGQV9GRk1lbnVIYW5kbGVyKCkge30NCitDWEZBX0ZGTWVudUhhbmRsZXI6On5DWEZBX0ZGTWVudUhhbmRsZXIoKSB7fQ0KK0ZYX0JPT0wgQ1hGQV9GRk1lbnVIYW5kbGVyOjpDYW5Db3B5KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5DYW5Db3B5KCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRk1lbnVIYW5kbGVyOjpDYW5DdXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPkNhbkN1dCgpOw0KK30NCitGWF9CT09MIENYRkFfRkZNZW51SGFuZGxlcjo6Q2FuUGFzdGUoSVhGQV9XaWRnZXQqIGhXaWRnZXQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPkNhblBhc3RlKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRk1lbnVIYW5kbGVyOjpDYW5TZWxlY3RBbGwoSVhGQV9XaWRnZXQqIGhXaWRnZXQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPkNhblNlbGVjdEFsbCgpOw0KK30NCitGWF9CT09MIENYRkFfRkZNZW51SGFuZGxlcjo6Q2FuRGVsZXRlKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5DYW5EZWxldGUoKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGTWVudUhhbmRsZXI6OkNhbkRlU2VsZWN0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5DYW5EZVNlbGVjdCgpOw0KK30NCitGWF9CT09MIENYRkFfRkZNZW51SGFuZGxlcjo6Q29weShJWEZBX1dpZGdldCogaFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+Q29weSh3c1RleHQpOw0KK30NCitGWF9CT09MIENYRkFfRkZNZW51SGFuZGxlcjo6Q3V0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5DdXQod3NUZXh0KTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGTWVudUhhbmRsZXI6OlBhc3RlKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5QYXN0ZSh3c1RleHQpOw0KK30NCitGWF9CT09MIENYRkFfRkZNZW51SGFuZGxlcjo6U2VsZWN0QWxsKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KSB7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5TZWxlY3RBbGwoKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGTWVudUhhbmRsZXI6OkRlbGV0ZShJWEZBX1dpZGdldCogaFdpZGdldCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+RGVsZXRlKCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GRk1lbnVIYW5kbGVyOjpEZVNlbGVjdChJWEZBX1dpZGdldCogaFdpZGdldCkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+RGVTZWxlY3QoKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGTWVudUhhbmRsZXI6OkNhblVuZG8oSVhGQV9XaWRnZXQqIGhXaWRnZXQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPkNhblVuZG8oKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGTWVudUhhbmRsZXI6OkNhblJlZG8oSVhGQV9XaWRnZXQqIGhXaWRnZXQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPkNhblJlZG8oKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGTWVudUhhbmRsZXI6OlVuZG8oSVhGQV9XaWRnZXQqIGhXaWRnZXQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPlVuZG8oKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGTWVudUhhbmRsZXI6OlJlZG8oSVhGQV9XaWRnZXQqIGhXaWRnZXQpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPlJlZG8oKTsNCit9DQorI2RlZmluZSBGWF9FRElUX0lTTEFUSU5XT1JEKHUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICh1ID09IDB4MkQgfHwgKHUgPD0gMHgwMDVBICYmIHUgPj0gMHgwMDQxKSB8fCAgICAgICAgICAgICAgICAgICAgXA0KKyAgICh1IDw9IDB4MDA3QSAmJiB1ID49IDB4MDA2MSkgfHwgKHUgPD0gMHgwMkFGICYmIHUgPj0gMHgwMEMwKSB8fCBcDQorICAgdSA9PSAweDAwMjcpDQorRlhfQk9PTCBDWEZBX0ZGTWVudUhhbmRsZXI6OkdldFN1Z2dlc3RXb3JkcyhJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Qb2ludEYgcG9pbnRmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdBcnJheSYgc1N1Z2dlc3QpIHsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCkNCisgICAgICAtPkdldFN1Z2dlc3RXb3Jkcyhwb2ludGYsIHNTdWdnZXN0KTsNCit9DQorRlhfQk9PTCBDWEZBX0ZGTWVudUhhbmRsZXI6OlJlcGxhY2VTcGVsbENoZWNrV29yZCgNCisgICAgSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgIENGWF9Qb2ludEYgcG9pbnRmLA0KKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUmVwbGFjZSkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KQ0KKyAgICAgIC0+UmVwbGFjZVNwZWxsQ2hlY2tXb3JkKHBvaW50ZiwgYnNSZXBsYWNlKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0aGFuZGxlci5oIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Zmd2lkZ2V0aGFuZGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlODgzNjcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZmZ3aWRnZXRoYW5kbGVyLmgKQEAgLTAsMCArMSwxNjcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhGQV9GT1JNRklMTEVSX0FOTk9USEFORExFUl9JTVBfSA0KKyNkZWZpbmUgX0ZYRkFfRk9STUZJTExFUl9BTk5PVEhBTkRMRVJfSU1QX0gNCitjbGFzcyBDWEZBX0ZGRG9jVmlldzsNCitjbGFzcyBDWEZBX0ZGV2lkZ2V0SGFuZGxlciA6IHB1YmxpYyBJWEZBX1dpZGdldEhhbmRsZXIgew0KKyBwdWJsaWM6DQorICBDWEZBX0ZGV2lkZ2V0SGFuZGxlcihDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcpOw0KKyAgfkNYRkFfRkZXaWRnZXRIYW5kbGVyKCk7DQorICB2aXJ0dWFsIElYRkFfV2lkZ2V0KiBDcmVhdGVXaWRnZXQoSVhGQV9XaWRnZXQqIGhQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1dJREdFVFRZUEUgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhGQV9XaWRnZXQqIGhCZWZvcmUgPSBOVUxMKTsNCisgIHZpcnR1YWwgSVhGQV9QYWdlVmlldyogR2V0UGFnZVZpZXcoSVhGQV9XaWRnZXQqIGhXaWRnZXQpOw0KKyAgdmlydHVhbCB2b2lkIEdldFJlY3QoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIENGWF9SZWN0RiYgcnQpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBHZXRTdGF0dXMoSVhGQV9XaWRnZXQqIGhXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldEJCb3goSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJ0Qm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdGF0dXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEcmF3Rm9jdXMgPSBGQUxTRSk7DQorICB2aXJ0dWFsIENYRkFfV2lkZ2V0QWNjKiBHZXREYXRhQWNjKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KTsNCisgIHZpcnR1YWwgdm9pZCBHZXROYW1lKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU5hbWVUeXBlID0gMCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0VG9vbFRpcChJWEZBX1dpZGdldCogaFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcmIHdzVG9vbFRpcCk7DQorICB2aXJ0dWFsIHZvaWQgU2V0UHJpdmF0ZURhdGEoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogbW9kdWxlX2lkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBEX0NBTExCQUNLX0ZSRUVEQVRBIGNhbGxiYWNrKTsNCisgIHZpcnR1YWwgdm9pZCogR2V0UHJpdmF0ZURhdGEoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIHZvaWQqIG1vZHVsZV9pZCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25Nb3VzZUVudGVyKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbk1vdXNlRXhpdChJWEZBX1dpZGdldCogaFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25MQnV0dG9uRG93bihJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25VcChJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPbkxCdXR0b25EYmxDbGsoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25Nb3VzZU1vdmUoSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25Nb3VzZVdoZWVsKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IHpEZWx0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBPblJCdXR0b25Eb3duKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvblVwKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uUkJ1dHRvbkRibENsayhJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5KTsNCisNCisgIHZpcnR1YWwgRlhfQk9PTCBPbktleURvd24oSVhGQV9XaWRnZXQqIGhXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3S2V5Q29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFncyk7DQorICB2aXJ0dWFsIEZYX0JPT0wgT25LZXlVcChJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3S2V5Q29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZ3MpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uQ2hhcihJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdDaGFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgT25IaXRUZXN0KElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCBGWF9CT09MIE9uU2V0Q3Vyc29yKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LCBGWF9GTE9BVCBmeCwgRlhfRkxPQVQgZnkpOw0KKyAgdmlydHVhbCB2b2lkIFJlbmRlcldpZGdldChJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR1MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJIaWdobGlnaHQgPSBGQUxTRSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSGFzRXZlbnQoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VWRU5UVFlQRSBlRXZlbnRUeXBlKTsNCisgIHZpcnR1YWwgaW50MzJfdCBQcm9jZXNzRXZlbnQoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRXZlbnRQYXJhbSogcFBhcmFtKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ1hGQV9Ob2RlKiBDcmVhdGVXaWRnZXRGb3JtSXRlbShYRkFfV0lER0VUVFlQRSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKw0KKyAgQ1hGQV9Ob2RlKiBDcmVhdGVQdXNoQnV0dG9uKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsNCisgIENYRkFfTm9kZSogQ3JlYXRlQ2hlY2tCdXR0b24oQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBDcmVhdGVFeGNsR3JvdXAoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBDcmVhdGVSYWRpb0J1dHRvbihDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorICBDWEZBX05vZGUqIENyZWF0ZURhdGV0aW1lRWRpdChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorICBDWEZBX05vZGUqIENyZWF0ZURlY2ltYWxGaWVsZChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorICBDWEZBX05vZGUqIENyZWF0ZU51bWVyaWNGaWVsZChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorICBDWEZBX05vZGUqIENyZWF0ZVNpZ25hdHVyZShDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorICBDWEZBX05vZGUqIENyZWF0ZVRleHRFZGl0KENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsNCisgIENYRkFfTm9kZSogQ3JlYXRlRHJvcGRvd25MaXN0KENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsNCisgIENYRkFfTm9kZSogQ3JlYXRlTGlzdEJveChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorICBDWEZBX05vZGUqIENyZWF0ZUltYWdlRmllbGQoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBDcmVhdGVQYXNzd29yZEVkaXQoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBDcmVhdGVGaWVsZChYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBDcmVhdGVBcmMoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBDcmVhdGVSZWN0YW5nbGUoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBDcmVhdGVJbWFnZShDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorICBDWEZBX05vZGUqIENyZWF0ZUxpbmUoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBDcmVhdGVUZXh0KENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsNCisgIENYRkFfTm9kZSogQ3JlYXRlRHJhdyhYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsNCisNCisgIENYRkFfTm9kZSogQ3JlYXRlU3ViZm9ybShDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorICBDWEZBX05vZGUqIENyZWF0ZUZvcm1JdGVtKFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7DQorICBDWEZBX05vZGUqIENyZWF0ZUNvcHlOb2RlKFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSA9IE5VTEwpIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBDcmVhdGVUZW1wbGF0ZU5vZGUoWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBDcmVhdGVGb250Tm9kZShDWEZBX05vZGUqIHBQYXJlbnQpIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBDcmVhdGVNYXJnaW5Ob2RlKENYRkFfTm9kZSogcFBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZJbnNldHNbNF0pIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBDcmVhdGVWYWx1ZU5vZGUoWEZBX0VMRU1FTlQgZVZhbHVlLCBDWEZBX05vZGUqIHBQYXJlbnQpIGNvbnN0Ow0KKyAgSVhGQV9PYmpGYWN0b3J5KiBHZXRPYmpGYWN0b3J5KCkgY29uc3Q7DQorICBDWEZBX0RvY3VtZW50KiBHZXRYRkFEb2MoKSBjb25zdDsNCisNCisgIENYRkFfRkZEb2NWaWV3KiBtX3BEb2NWaWV3Ow0KK307DQorY2xhc3MgQ1hGQV9GRk1lbnVIYW5kbGVyIDogcHVibGljIElYRkFfTWVudUhhbmRsZXIgew0KKyBwdWJsaWM6DQorICBDWEZBX0ZGTWVudUhhbmRsZXIoKTsNCisgIH5DWEZBX0ZGTWVudUhhbmRsZXIoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5Db3B5KElYRkFfV2lkZ2V0KiBoV2lkZ2V0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5DdXQoSVhGQV9XaWRnZXQqIGhXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIENhblBhc3RlKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBDYW5TZWxlY3RBbGwoSVhGQV9XaWRnZXQqIGhXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIENhbkRlbGV0ZShJWEZBX1dpZGdldCogaFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuRGVTZWxlY3QoSVhGQV9XaWRnZXQqIGhXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9CT09MIENvcHkoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgdmlydHVhbCBGWF9CT09MIEN1dChJWEZBX1dpZGdldCogaFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUGFzdGUoSVhGQV9XaWRnZXQqIGhXaWRnZXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOw0KKyAgdmlydHVhbCBGWF9CT09MIFNlbGVjdEFsbChJWEZBX1dpZGdldCogaFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgRGVsZXRlKElYRkFfV2lkZ2V0KiBoV2lkZ2V0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEZVNlbGVjdChJWEZBX1dpZGdldCogaFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuVW5kbyhJWEZBX1dpZGdldCogaFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FuUmVkbyhJWEZBX1dpZGdldCogaFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgVW5kbyhJWEZBX1dpZGdldCogaFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUmVkbyhJWEZBX1dpZGdldCogaFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0U3VnZ2VzdFdvcmRzKElYRkFfV2lkZ2V0KiBoV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGIHBvaW50ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdBcnJheSYgc1N1Z2dlc3QpOw0KKyAgdmlydHVhbCBGWF9CT09MIFJlcGxhY2VTcGVsbENoZWNrV29yZChJWEZBX1dpZGdldCogaFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RiBwb2ludGYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZXBsYWNlKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mb250bWdyLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mb250bWdyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDUxMjBlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2ZvbnRtZ3IuY3BwCkBAIC0wLDAgKzEsMjEzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSA8YWxnb3JpdGhtPg0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9jb21tb24uaCINCisjaW5jbHVkZSAieGZhX2ZvbnRtZ3IuaCINCisjaW5jbHVkZSAieGZhX2ZmZG9jLmgiDQorI2luY2x1ZGUgInhmYV9mZkNvbmZpZ0FjYy5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZhcHAuaCINCisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXw0KK3N0YXRpYyBjb25zdCBYRkFfRk9OVElORk8gZ19YRkFGb250c01hcFtdID0gew0KKyAgICB7MHgwMWQ1ZDMzZSwgTCJTaW1TdW4iLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4MDFlNGYxMDIsIEwiWW91WXVhbiIsIEwiQXJpYWwiLCAxLCA5MzZ9LA0KKyAgICB7MHgwMzA1NDlkYywgTCJMaVN1IiwgTCJBcmlhbCIsIDEsIDkzNn0sDQorICAgIHsweDAzMmVkZDQ0LCBMIlNpbWhlaSIsIEwiQXJpYWwiLCAxLCA5MzZ9LA0KKyAgICB7MHgwM2VhYzZmYywgTCJQb29yUmljaGFyZC1SZWd1bGFyIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LA0KKyAgICB7MHgwM2VkOTBlNiwgTCJOaW5hIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHgwNzdiNTZiMywgTCJLaW5nc29mdFBob25ldGljUGxhaW4iLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDA3OGVkNTI0LCBMIk1pY3Jvc29mdFNhbnNTZXJpZiIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4MDg5YjE4YTksIEwiQXJpYWwiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDBiMmNhZDcyLCBMIk1vbm90eXBlQ29yc2l2YSIsIEwiQXJpYWwiLCA4LCAxMjUyfSwNCisgICAgezB4MGJiMDAzZTcsIEwiS2FydGlrYSIsIEwiQXJpYWwiLCAyLCAxMjUyfSwNCisgICAgezB4MGJiNDY5ZGYsIEwiVmluZXJIYW5kSVRDIiwgTCJBcmlhbCIsIDgsIDEyNTJ9LA0KKyAgICB7MHgwYmMxYTg1MSwgTCJTZWdvZVVJIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHgwYzExMmViZCwgTCJLb3p1a2FHb3RoaWNQcm8tVklNIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHgwY2ZjYjljMSwgTCJBZG9iZVRoYWkiLCBMIktva2lsYSxBcmlhbCBOYXJyb3ciLCAwLCA4NDd9LA0KKyAgICB7MHgwZTdkZTBmOSwgTCJQbGF5YmlsbCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4MGVmZjQ3YzMsIEwiU1RIdXBvIiwgTCJBcmlhbCIsIDAsIDkzNn0sDQorICAgIHsweDEwN2FkMzc0LCBMIkNvbnN0YW50aWEiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sDQorICAgIHsweDEyMTk0YzJkLCBMIkt1bnN0bGVyU2NyaXB0IiwgTCJBcmlhbCIsIDgsIDEyNTJ9LA0KKyAgICB7MHgxMzVlZjZhMSwgTCJNaW5pb25Qcm9TbUJkIiwNCisgICAgIEwiQmVsbCBNVCxDb3JiZWwsVGltZXMgTmV3IFJvbWFuLENhbWJyaWEsQmVybGluIFNhbnMgRkIiLCAwLCAxMjUyfSwNCisgICAgezB4MTU4YzQwNDksIEwiR2FyYW1vbmQiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sDQorICAgIHsweDE2MGVjYjI0LCBMIlNUWmhvbmdzb25nIiwgTCJBcmlhbCIsIDAsIDkzNn0sDQorICAgIHsweDE2MWVkMDdlLCBMIk1TR290aGljIiwgTCJBcmlhbCIsIDEsIDEyNTJ9LA0KKyAgICB7MHgxNzFkMWVkMSwgTCJTbmFwSVRDLVJlZ3VsYXIiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDE4ZDExODhmLCBMIkNhbWJyaWEiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sDQorICAgIHsweDE4ZWFmMzUwLCBMIkFyaWFsVW5pY29kZU1TIiwgTCJBcmlhbCIsIDAsIDkzNn0sDQorICAgIHsweDFhOTJkMTE1LCBMIk1pbmdMaVUiLCBMIkFyaWFsIiwgMSwgMTI1Mn0sDQorICAgIHsweDFjYzIxN2M2LCBMIlRyZWJ1Y2hldE1TIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHgxZDY0OTU5NiwgTCJCYXNlbWljVGltZXMiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDFlMzRlZTYwLCBMIkJlbGxNVCIsIEwiQXJpYWwiLCAyLCAxMjUyfSwNCisgICAgezB4MWViMzY5NDUsIEwiQ29vcGVyQmxhY2siLCBMIkFyaWFsIiwgMiwgMTI1Mn0sDQorICAgIHsweDFlZjc3ODdkLCBMIkJhdGFuZ0NoZSIsIEwiQXJpYWwiLCAxLCAxMjUyfSwNCisgICAgezB4MjBiM2JkM2EsIEwiQnJ1c2hTY3JpcHRNVCIsIEwiQXJpYWwiLCA4LCAxMjUyfSwNCisgICAgezB4MjIwODc3YWEsIEwiQ2FuZGFyYSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4MjIxMzUwMDcsIEwiRnJlZXN0eWxlU2NyaXB0LVJlZ3VsYXIiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sDQorICAgIHsweDI1MTA1OWMzLCBMIkNoaWxsZXIiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDI1YmVkNmRkLCBMIk1TUmVmZXJlbmNlU2Fuc1NlcmlmIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyODE1NGM4MSwgTCJQYXJjaG1lbnQtUmVndWxhciIsIEwiQXJpYWwiLCA4LCAxMjUyfSwNCisgICAgezB4Mjk3MTFlYjksIEwiU1RMaXRpIiwgTCJBcmlhbCIsIDAsIDkzNn0sDQorICAgIHsweDJiMTk5M2I0LCBMIkJhc2VtaWMiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDJiMzE2MzM5LCBMIk5pYWdhcmFTb2xpZC1SZWciLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDJjMTQ3NTI5LCBMIkZvb3RsaWdodE1UTGlnaHQiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDJjMTk4OTI4LCBMIkhhcmxvd1NvbGlkIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyYzZhYzZiMiwgTCJMdWNpZGFCcmlnaHQiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sDQorICAgIHsweDJjOWYzOGUyLCBMIktvenVrYU1pbmNob1Byby1WSVIiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDJkNWE0N2IwLCBMIlNUQ2FpeXVuIiwgTCJBcmlhbCIsIDAsIDkzNn0sDQorICAgIHsweDJkZWYyNmJmLCBMIkJlcm5hcmRNVC1Db25kZW5zZWQiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDJmZDg5MzBiLCBMIktvenVrYU1pbmNob1ByNk5SIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzMTE1NTI1YSwgTCJGYW5nU29uZ19HQjIzMTIiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDMxMzI3ODE3LCBMIk15cmlhZFBybyIsDQorICAgICBMIkNhbGlicmksQ29yYmVsLENhbmRhcmEsQ2FtYnJpYSBNYXRoLEZyYW5rbGluIEdvdGhpYyBNZWRpdW0sQXJpYWwgIg0KKyAgICAgTCJOYXJyb3csVGltZXMgTmV3IFJvbWFuIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHgzMjI0NDk3NSwgTCJIZWx2ZXRpY2EiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDMyYWM5OTVjLCBMIlRlcm1pbmFsIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzMzhkNjQ4YSwgTCJOaWFnYXJhRW5ncmF2ZWQtUmVnIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzM2JiNjVmMiwgTCJTeWxmYWVuIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LA0KKyAgICB7MHgzNDAyYzMwZSwgTCJNU1BNaW5jaG8iLCBMIkFyaWFsIiwgMiwgMTI1Mn0sDQorICAgIHsweDM0MTJiZjMxLCBMIlNpbVN1bi1QVUEiLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4MzZlYjM5YjksIEwiQmVybGluU2Fuc0ZCIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzNmY0MjA1NSwgTCJVbml2ZXJzQVRUIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZiIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzODY0YzRmNiwgTCJIaWdoVG93ZXJUZXh0IiwgTCJBcmlhbCIsIDIsIDEyNTJ9LA0KKyAgICB7MHgzYTI1N2QwMywgTCJGYW5nU29uZ19HQjIzMTIiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDNjZGFlNjY4LCBMIkZyZWVzdHlsZVNjcmlwdCIsIEwiQXJpYWwiLCA4LCAxMjUyfSwNCisgICAgezB4M2Q1NWFlZDcsIEwiSm9rZXJtYW4iLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDNkNWI0Mzg1LCBMIlBNaW5nTGlVIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LA0KKyAgICB7MHgzZDliNzY2OSwgTCJFc3RyYW5nZWxvRWRlc3NhIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzZTUzMmQ3NCwgTCJGcmFua2xpbkdvdGhpY01lZGl1bSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4M2U2YWEzMmQsIEwiTlNpbVN1biIsIEwiQXJpYWwiLCAxLCA5MzZ9LA0KKyAgICB7MHgzZjZjMzZhOCwgTCJHYXV0YW1pIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzZmYzMjY2MiwgTCJDaGlsbGVyLVJlZ3VsYXIiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDQwOWRlMzEyLCBMIk1vZGVybk5vLjIwIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LA0KKyAgICB7MHg0MTQ0M2M1ZSwgTCJHZW9yZ2lhIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LA0KKyAgICB7MHg0MTYwYWRlNSwgTCJCZWxsR290aGljU3RkQmxhY2siLA0KKyAgICAgTCJBcmlhbCxBcmlhbCBVbmljb2RlIE1TLEJvb2sgQW50aXF1YSxEb3R1bSxHZW9yZ2lhIiwgMCwgMTI1Mn0sDQorICAgIHsweDQyMTk3NmM0LCBMIk1vZGVybi1SZWd1bGFyIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LA0KKyAgICB7MHg0MjJhNzI1MiwgTCJTdGVuY2lsIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg0MmM4NTU0ZiwgTCJGaXhlZHN5cyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4NDM1Y2I0MWQsIEwiUm9tYW4iLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDQ3ODgyMzgzLCBMIkNvdXJpZXJOZXciLCBMIkFyaWFsIiwgMSwgMTI1Mn0sDQorICAgIHsweDQ4MGEyMzM4LCBMIkJlcmxpblNhbnNGQkRlbWkiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDQ4MGJmN2E0LCBMIkNvdXJpZXJTdGQiLCBMIkNvdXJpZXIgTmV3LFZlcmRhbmEiLCAwLCAxMjUyfSwNCisgICAgezB4NDgxYWQ2ZWQsIEwiVmxhZGltaXJTY3JpcHQiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sDQorICAgIHsweDQ5MTE1NzdhLCBMIllvdVl1YW4iLCBMIkFyaWFsIiwgMSwgOTM2fSwNCisgICAgezB4NGE3ODhkNzIsIEwiU1RYaW5na2FpIiwgTCJBcmlhbCIsIDAsIDkzNn0sDQorICAgIHsweDRiZjg4NTY2LCBMIlNlZ29lQ29uZGVuc2VkIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg0Y2NmNTFhNCwgTCJCZXJsaW5TYW5zRkItUmVnIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg0ZWE5NjdjZSwgTCJHdWxpbUNoZSIsIEwiQXJpYWwiLCAxLCAxMjUyfSwNCisgICAgezB4NGY2OGJkNzksIEwiTGV0dGVyR290aGljU3RkIiwgTCJDb3VyaWVyIE5ldyxWZXJkYW5hIiwgMCwgMTI1Mn0sDQorICAgIHsweDUxYTBkMGU2LCBMIktvenVrYUdvdGhpY1ByNk5NIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg1MzFiM2RlYSwgTCJCYXNlbWljU3ltYm9sIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg1MzMzZmQzOSwgTCJDYWxpZm9ybmlhbkZCLVJlZyIsIEwiQXJpYWwiLCAyLCAxMjUyfSwNCisgICAgezB4NTM1NjFhNTQsIEwiRlpZVEstLUdCSzEtMCIsIEwiQXJpYWwiLCAwLCA5MzZ9LA0KKyAgICB7MHg1NWUwZGRlNiwgTCJMdWNpZGFTYW5zVHlwZXdyaXRlciIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4NTc0ZDRkM2QsIEwiQWRvYmVBcmFiaWMiLCBMIkFyaWFsIE5hcnJvdyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg1NzkyZTc1OSwgTCJTVEthaXRpIiwgTCJBcmlhbCIsIDAsIDkzNn0sDQorICAgIHsweDU5MjE5NzhlLCBMIkx1Y2lkYVNhbnNVbmljb2RlIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg1OTRlMmRhNCwgTCJWcmluZGEiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDU5YmFhOWEyLCBMIkthaVRpX0dCMjMxMiIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4NWNmZWRmNGYsIEwiQmFza09sZEZhY2UiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDVmOTc5MjFjLCBMIkFkb2JlTXl1bmdqb1N0ZE0iLA0KKyAgICAgTCJCYXRhbmcsQm9va21hbiBPbGQgU3R5bGUsQ29uc29sYXMsU1RaaG9uZ3NvbmciLCAwLCA5MzZ9LA0KKyAgICB7MHg1ZmVmYmZhZCwgTCJCYXRhbmciLCBMIkFyaWFsIiwgMiwgMTI1Mn0sDQorICAgIHsweDYwNTM0MmI5LCBMIkRvdHVtQ2hlIiwgTCJBcmlhbCIsIDEsIDEyNTJ9LA0KKyAgICB7MHg2MDhjNWY5YSwgTCJLYWlUaV9HQjIzMTIiLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4NjFlZmQwZDEsIEwiTWF0dXJhTVRTY3JpcHRDYXBpdGFscyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4NjI2NjA4YTksIEwiTVZCb2xpIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg2MzA1MDFhMywgTCJTbWFsbEZvbnRzIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg2NWQwZTJhOSwgTCJGWllUSy0tR0JLMS0wIiwgTCJBcmlhbCIsIDAsIDkzNn0sDQorICAgIHsweDY2OWYyOWUxLCBMIkZaU1RLLS1HQksxLTAiLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4NjczYTllNWYsIEwiVHVuZ2EiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDY5MWFhNGNlLCBMIk5pYWdhcmFTb2xpZCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4Njk2MjU5YjcsIEwiQ29yYmVsIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg2OTZlZTliZSwgTCJTVFhpaGVpIiwgTCJBcmlhbCIsIDAsIDkzNn0sDQorICAgIHsweDZjNTljZjY5LCBMIkRvdHVtIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg3MDdmYTU2MSwgTCJHdW5nc3VoIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LA0KKyAgICB7MHg3MTQxNmJiMiwgTCJaV0Fkb2JlRiIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4NzFiNDE4MDEsIEwiVmVyZGFuYSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4NzNmMjVlNGMsIEwiUGFsYXRpbm9MaW5vdHlwZSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4NzNmNGQxOWYsIEwiTmlhZ2FyYUVuZ3JhdmVkIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg3NDAwMTY5NCwgTCJNeXJpYWRQcm9CbGFjayIsIEwiQm9vayBBbnRpcXVhLENvbnN0YW50aWEsRG90dW0sR2VvcmdpYSIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4NzRiMTRkOGYsIEwiSGFldHRlbnNjaHdlaWxlciIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4NzRjYjQ0ZWUsIEwiTlNpbVN1biIsIEwiQXJpYWwiLCAxLCA5MzZ9LA0KKyAgICB7MHg3NmI0ZDdmZiwgTCJTaHJ1dGkiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDc4OGIzNTMzLCBMIldlYmRpbmdzIiwgTCJBcmlhbCIsIDYsIDQyfSwNCisgICAgezB4Nzk3ZGRlOTksIEwiTVNTZXJpZiIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4N2EwZjllOWUsIEwiTVNNaW5jaG8iLCBMIkFyaWFsIiwgMSwgMTI1Mn0sDQorICAgIHsweDdiNDM5Y2FmLCBMIk9sZEVuZ2xpc2hUZXh0TVQiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDgyMTNhNDMzLCBMIkx1Y2lkYVNhbnMtVHlwZXdyaXRlciIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4ODJmZWM5MjksIEwiQWRvYmVTb25nU3RkTCIsDQorICAgICBMIkNlbnRhdXIsQ2FsaWJyaSxTVFNvbmcsQmVsbCBNVCxHYXJhbW9uZCxUaW1lcyBOZXcgUm9tYW4iLCAwLCA5MzZ9LA0KKyAgICB7MHg4MzU4MTgyNSwgTCJNb2Rlcm4iLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDgzNWEyODIzLCBMIkFsZ2VyaWFuIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg4M2RhYjlmNSwgTCJTY3JpcHQiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDg0N2I1NmRhLCBMIlRhaG9tYSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4OGE3ODNjYjIsIEwiU2ltU3VuLVBVQSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4OGI1Y2FjMGUsIEwiT255eCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4OGM2YTQ5OWUsIEwiR3VsaW0iLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDhlMGFmNzkwLCBMIkp1aWNlSVRDIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg4ZThkNDNiMiwgTCJDZW50YXVyIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LA0KKyAgICB7MHg4ZWU0ZGNjYSwgTCJCb29rc2hlbGZTeW1ib2w3IiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg5MDc5NDgwMCwgTCJCZWxsR290aGljU3RkTGlnaHQiLCBMIkJlbGwgTVQsQ2FsaWJyaSxUaW1lcyBOZXcgUm9tYW4iLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDkwOWI1MTZhLCBMIkNlbnR1cnkiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sDQorICAgIHsweDkyYWUzNzBkLCBMIk1TT3V0bG9vayIsIEwiQXJpYWwiLCA0LCA0Mn0sDQorICAgIHsweDkzYzlmYmYxLCBMIkx1Y2lkYUZheCIsIEwiQXJpYWwiLCAyLCAxMjUyfSwNCisgICAgezB4OTU2NTA4NWUsIEwiQm9va0FudGlxdWEiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sDQorICAgIHsweDk4NTZkOTVkLCBMIkFkb2JlTWluZ1N0ZEwiLCBMIkFyaWFsLEFyaWFsIFVuaWNvZGUgTVMsQ2FtYnJpYSxCYXRhbmdDaGUiLA0KKyAgICAgMCwgOTQ5fSwNCisgICAgezB4OWJiYWRkNmIsIEwiQ29sb25uYU1UIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg5Y2JkMTZhNCwgTCJTaG93Y2FyZEdvdGhpYy1SZWciLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweDlkNzMwMDhlLCBMIk1TU2Fuc1NlcmlmIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhhMDYwN2RiMSwgTCJHdW5nc3VoQ2hlIiwgTCJBcmlhbCIsIDEsIDEyNTJ9LA0KKyAgICB7MHhhMGJjZjZhMSwgTCJMYXRpbldpZGUiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sDQorICAgIHsweGExNDI5YjM2LCBMIlN5bWJvbCIsIEwiQXJpYWwiLCA2LCA0Mn0sDQorICAgIHsweGExZmE1YWJjLCBMIldpbmdkaW5nczIiLCBMIkFyaWFsIiwgNiwgNDJ9LA0KKyAgICB7MHhhMWZhNWFiZCwgTCJXaW5nZGluZ3MzIiwgTCJBcmlhbCIsIDYsIDQyfSwNCisgICAgezB4YTQyN2JhZDQsIEwiSW5mb3JtYWxSb21hbi1SZWd1bGFyIiwgTCJBcmlhbCIsIDgsIDEyNTJ9LA0KKyAgICB7MHhhOGI5MmVjZSwgTCJGWlNUSy0tR0JLMS0wIiwgTCJBcmlhbCIsIDAsIDkzNn0sDQorICAgIHsweGE4ZDgzZWNlLCBMIkNhbGlmb3JuaWFuRkIiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sDQorICAgIHsweGFhM2UwODJjLCBMIktpbmdzb2Z0LVBob25ldGljIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhhYTZiY2FiZSwgTCJIYXJsb3dTb2xpZEl0YWxpYyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4YWRlNTMzN2MsIEwiTVNVSUdvdGhpYyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4YjA4ZGQ5NDEsIEwiV2lkZUxhdGluIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LA0KKyAgICB7MHhiMjA3ZjA1ZCwgTCJQb29yUmljaGFyZCIsIEwiQXJpYWwiLCAyLCAxMjUyfSwNCisgICAgezB4YjNiYzQ5MmYsIEwiSnVpY2VJVEMtUmVndWxhciIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4YjU1NDUzOTksIEwiTWFybGV0dCIsIEwiQXJpYWwiLCA0LCA0Mn0sDQorICAgIHsweGI1ZGQxZWJiLCBMIkJyaXRhbm5pY0JvbGQiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweGI2OTljMWM1LCBMIkx1Y2lkYUNhbGxpZ3JhcGh5LUl0YWxpYyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4YjcyNWQ2MjksIEwiVGltZXNOZXdSb21hbiIsIEwiQXJpYWwiLCAyLCAxMjUyfSwNCisgICAgezB4YjdlYWViZWIsIEwiQWRvYmVIZWl0aVN0ZFIiLCBMIkJhdGFuZyxDZW50dXJ5LERvdHVtIiwgMCwgOTM2fSwNCisgICAgezB4YmQyOWM0ODYsIEwiQmVybGluU2Fuc0ZCRGVtaS1Cb2xkIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhiZThhOGRiNCwgTCJCb29rc2hlbGZTeW1ib2xTZXZlbiIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4YzE2YzAxMTgsIEwiQWRvYmVIZWJyZXciLCBMIkJlbGwgTVQsQmVybGluIFNhbnMgRkIsQ2FsaWJyaSIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjMzE4YjBhZiwgTCJNeXJpYWRQcm9MaWdodCIsIEwiQ2FsaWJyaSxTVEZhbmdzb25nLFRpbWVzIE5ldyBSb21hbiIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4YzY1ZTU2NTksIEwiQ2FtYnJpYU1hdGgiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sDQorICAgIHsweGM3NWM4ZjA1LCBMIkx1Y2lkYUNvbnNvbGUiLCBMIkFyaWFsIiwgMSwgMTI1Mn0sDQorICAgIHsweGNhN2MzNWQ2LCBMIkNhbGlicmkiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweGNiMDUzZjUzLCBMIk1pY3Jvc29mdFlhSGVpIiwgTCJBcmlhbCIsIDAsIDkzNn0sDQorICAgIHsweGNiNzE5MGY5LCBMIk1hZ25ldG8tQm9sZCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4Y2NhMDBjYzUsIEwiU3lzdGVtIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjY2FkNmY3NiwgTCJKb2tlcm1hbi1SZWd1bGFyIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjY2M1ODE4YywgTCJFdXJvU2lnbiIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4Y2YzZDcyMzQsIEwiTHVjaWRhSGFuZHdyaXRpbmctSXRhbGljIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjZjdiOGZkYiwgTCJNaW5pb25Qcm8iLA0KKyAgICAgTCJCZWxsIE1ULENvcmJlbCxUaW1lcyBOZXcgUm9tYW4sQ2FtYnJpYSxCZXJsaW4gU2FucyBGQiIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjZmU1NzU1ZiwgTCJTaW1oZWkiLCBMIkFyaWFsIiwgMSwgOTM2fSwNCisgICAgezB4ZDAxMWY0ZWUsIEwiTVNQR290aGljIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhkMDYwZTdlZiwgTCJWaXZhbGRpIiwgTCJBcmlhbCIsIDgsIDEyNTJ9LA0KKyAgICB7MHhkMDdlZGVjMSwgTCJGcmFua2xpbkdvdGhpYy1NZWRpdW0iLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweGQxMDcyNDNmLCBMIlNpbVN1biIsIEwiQXJpYWwiLCAwLCA5MzZ9LA0KKyAgICB7MHhkMTg4MTU2MiwgTCJBcmlhbE5hcnJvdyIsIEwiQXJpYWwgTmFycm93IiwgMCwgMTI1Mn0sDQorICAgIHsweGQyMmI3ZGNlLCBMIkJvZG9uaU1UUG9zdGVyQ29tcHJlc3NlZCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4ZDIyYmZhNjAsIEwiQ29taWNTYW5zTVMiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sDQorICAgIHsweGQzYmQwZTM1LCBMIkJhdWhhdXM5MyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4ZDQyOWVlN2EsIEwiU1RGYW5nc29uZyIsIEwiQXJpYWwiLCAwLCA5MzZ9LA0KKyAgICB7MHhkNjY3OWMxMiwgTCJCZXJuYXJkTVRDb25kZW5zZWQiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweGQ4ZThhMDI3LCBMIkx1Y2lkYVNhbnMiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweGQ5ZmU3NzYxLCBMIkhpZ2hUb3dlclRleHQtUmVnIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LA0KKyAgICB7MHhkYTdlNTUxZSwgTCJTVFNvbmciLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4ZGFhNjg0MmQsIEwiU1RaaG9uZ3NvbmciLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4ZGFhYWI5M2YsIEwiU1RGYW5nc29uZyIsIEwiQXJpYWwiLCAwLCA5MzZ9LA0KKyAgICB7MHhkYWViMDcxMywgTCJTVFNvbmciLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4ZGFmZWRiZWYsIEwiU1RDYWl5dW4iLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4ZGIwMGEzZDksIEwiQnJvYWR3YXkiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweGRiMWY1YWQ0LCBMIlNUWGlud2VpIiwgTCJBcmlhbCIsIDAsIDkzNn0sDQorICAgIHsweGRiMzI2ZTdmLCBMIlNUS2FpdGkiLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4ZGI2OTU5NWEsIEwiU1RIdXBvIiwgTCJBcmlhbCIsIDAsIDkzNn0sDQorICAgIHsweGRiYTAwODJjLCBMIlNUWGloZWkiLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4ZGJkMGFiMTgsIEwiU1RYaW5na2FpIiwgTCJBcmlhbCIsIDAsIDkzNn0sDQorICAgIHsweGRjMWE3ZGIxLCBMIlNUTGl0aSIsIEwiQXJpYWwiLCAwLCA5MzZ9LA0KKyAgICB7MHhkYzMzMDc1ZiwgTCJLcmlzdGVuSVRDLVJlZ3VsYXIiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sDQorICAgIHsweGRjYzcwMDljLCBMIkhhcnJpbmd0b24iLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweGRkNzEyNDY2LCBMIkFyaWFsQmxhY2siLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweGRkZTg3YjNlLCBMIkltcGFjdCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4ZGY2OWZiMzIsIEwiU25hcElUQyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4ZGY4YjI1ZTgsIEwiQ2VudHVyeUdvdGhpYyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4ZTBmNzA1YzAsIEwiS3Jpc3RlbklUQyIsIEwiQXJpYWwiLCA4LCAxMjUyfSwNCisgICAgezB4ZTE0Mjc1NzMsIEwiUmFhdmkiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweGUyY2VhMGNiLCBMIk1hZ25ldG8iLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweGUzNmE5ZTE3LCBMIlJhdmllIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhlNDMzZjhlMiwgTCJQYXJjaG1lbnQiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sDQorICAgIHsweGU0M2RmZjRhLCBMIldpbmdkaW5ncyIsIEwiQXJpYWwiLCA0LCA0Mn0sDQorICAgIHsweGU0ZTJjNDA1LCBMIk1URXh0cmEiLCBMIkFyaWFsIiwgNiwgNDJ9LA0KKyAgICB7MHhlNjE4Y2MzNSwgTCJJbmZvcm1hbFJvbWFuIiwgTCJBcmlhbCIsIDgsIDEyNTJ9LA0KKyAgICB7MHhlNmMyN2ZmYywgTCJNaXN0cmFsIiwgTCJBcmlhbCIsIDgsIDEyNTJ9LA0KKyAgICB7MHhlN2ViZjRiOSwgTCJDb3VyaWVyIiwgTCJDb3VyaWVyIE5ldyIsIDAsIDEyNTJ9LA0KKyAgICB7MHhlOGJjNGE5ZCwgTCJNU1JlZmVyZW5jZVNwZWNpYWx0eSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4ZTkwZmIwMTMsIEwiVGVtcHVzU2Fuc0lUQyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4ZWM2MzdiNDIsIEwiQ29uc29sYXMiLCBMIlZlcmRhbmEiLCAxLCAxMjUyfSwNCisgICAgezB4ZWQzYTY4M2IsIEwiU1RYaW53ZWkiLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4ZWYyNjRjZDEsIEwiTHVjaWRhSGFuZHdyaXRpbmciLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweGYwODZiY2EyLCBMIkJhc2tlcnZpbGxlT2xkRmFjZSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4ZjEwMjgwMzAsIEwiTWFuZ2FsIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LA0KKyAgICB7MHhmMWRhN2ViOSwgTCJTaG93Y2FyZEdvdGhpYyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4ZjIxMGYwNmEsIEwiQXJpYWxNVCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4ZjQ3N2YxNmEsIEwiTGF0aGEiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sDQorICAgIHsweGY2MTZmM2RkLCBMIkxpU3UiLCBMIkFyaWFsIiwgMSwgOTM2fSwNCisgICAgezB4ZmE0NzlhYTYsIEwiTWljcm9zb2Z0WWFIZWkiLCBMIkFyaWFsIiwgMCwgOTM2fSwNCisgICAgezB4ZmNkMTk2OTcsIEwiQm9va21hbk9sZFN0eWxlIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LA0KKyAgICB7MHhmZTIwOWE4MiwgTCJMdWNpZGFDYWxsaWdyYXBoeSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwNCisgICAgezB4ZmVmMTM1ZjgsIEwiQWRvYmVIZWl0aVN0ZC1SZWd1bGFyIiwgTCJCYXRhbmcsQ2VudHVyeSxEb3R1bSIsIDAsIDkzNn0sDQorfTsNCisjZWxpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0xJTlVYXw0KK3N0YXRpYyBjb25zdCBYRkFfRk9OVElORk8gZ19YRkFGb250c01hcFtdID0gew0KKyAgICB7MHgwMWQ1ZDMzZSwgTCJTaW1TdW4iLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXLEFSICINCisgICAgIEwiUEwgVU1pbmcgVFcgTUJFIiwNCisgICAgIDAsIDkzNn0sDQorICAgIHsweDAxZTRmMTAyLCBMIllvdVl1YW4iLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXLEFSICINCisgICAgIEwiUEwgVU1pbmcgVFcgTUJFIiwNCisgICAgIDEsIDkzNn0sDQorICAgIHsweDAzMDU0OWRjLCBMIkxpU3UiLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCxXZW5RdWFuWWkgWmVuIEhlaSAiDQorICAgICBMIk1vbm8sV2VuUXVhbllpIE1pY3JvIEhlaSIsDQorICAgICAxLCA5MzZ9LA0KKyAgICB7MHgwMzJlZGQ0NCwgTCJTaW1oZWkiLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCxXZW5RdWFuWWkgWmVuIEhlaSAiDQorICAgICBMIk1vbm8sV2VuUXVhbllpIE1pY3JvIEhlaSIsDQorICAgICAxLCA5MzZ9LA0KKyAgICB7MHgwM2VhYzZmYywgTCJQb29yUmljaGFyZC1SZWd1bGFyIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTZXJpZiIsIDIsDQorICAgICAxMjUyfSwNCisgICAgezB4MDNlZDkwZTYsIEwiTmluYSIsIEwiRnJlZVNlcmlmIiwgMCwgMTI1Mn0sDQorICAgIHsweDA3N2I1NmIzLCBMIktpbmdzb2Z0UGhvbmV0aWNQbGFpbiIsDQorICAgICBMIlRpYmV0YW4gTWFjaGluZSBVbmksTEtMVUcsU2FteWFrIEd1amFyYXRpLERyb2lkIFNhbnMgVGhhaSxEcm9pZCBTYW5zICINCisgICAgIEwiQXJtZW5pYW4sVW50aXRsZWQxLHV0a2FsLExvaGl0IE9yaXlhIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHgwNzhlZDUyNCwgTCJNaWNyb3NvZnRTYW5zU2VyaWYiLA0KKyAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTZXJpZixXZW5RdWFuWWkgTWljcm8gSGVpIiwgMCwgMTI1Mn0sDQorICAgIHsweDA4OWIxOGE5LCBMIkFyaWFsIiwNCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyBDb25kZW5zZWQsRnJlZVNlcmlmLFdlblF1YW5ZaSBNaWNybyBIZWkiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDBiMmNhZDcyLCBMIk1vbm90eXBlQ29yc2l2YSIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2VyaWYiLCA4LCAxMjUyfSwNCisgICAgezB4MGJiMDAzZTcsIEwiS2FydGlrYSIsDQorICAgICBMIkZyZWVTYW5zLExpYmVyYXRpb24gU2FucyxMaWJlcmF0aW9uIFNhbnMgTmFycm93LE5pbWJ1cyBTYW5zICINCisgICAgIEwiTCxHYXJ1ZGEsRnJlZVNlcmlmLFdlblF1YW5ZaSBNaWNybyBIZWkiLA0KKyAgICAgMiwgMTI1Mn0sDQorICAgIHsweDBiYjQ2OWRmLCBMIlZpbmVySGFuZElUQyIsDQorICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsVWJ1bnR1LExpYmVyYXRpb24gU2FucyxMaWJlcmF0aW9uIFNlcmlmIiwgOCwgMTI1Mn0sDQorICAgIHsweDBiYzFhODUxLCBMIlNlZ29lVUkiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNhbnMiLCAwLCAxMjUyfSwNCisgICAgezB4MGMxMTJlYmQsIEwiS296dWthR290aGljUHJvLVZJTSIsIEwiRnJlZVNlcmlmIiwgMCwgMTI1Mn0sDQorICAgIHsweDBjZmNiOWMxLCBMIkFkb2JlVGhhaSIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxXYXJlZSIsIDAsIDg0N30sDQorICAgIHsweDBlN2RlMGY5LCBMIlBsYXliaWxsIiwNCisgICAgIEwiS2Fjc3RRdXJuLERyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLG1yeV9LYWNzdFF1cm4sRHJvaWQgIg0KKyAgICAgTCJTYW5zIEV0aGlvcGljLERyb2lkIFNhbnMgSmFwYW5lc2UsRnJlZVNlcmlmIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHgwZWZmNDdjMywgTCJTVEh1cG8iLCBMIkFSIFBMIFVLYWkgSEssQVIgUEwgVU1pbmcgSEssQVIgUEwgVUthaSBDTiIsIDAsDQorICAgICA5MzZ9LA0KKyAgICB7MHgxMDdhZDM3NCwgTCJDb25zdGFudGlhIiwNCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2VyaWYsV2VuUXVhbllpIE1pY3JvIEhlaSxVYnVudHUiLCAyLCAxMjUyfSwNCisgICAgezB4MTIxOTRjMmQsIEwiS3Vuc3RsZXJTY3JpcHQiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZiIsIDgsDQorICAgICAxMjUyfSwNCisgICAgezB4MTM1ZWY2YTEsIEwiTWluaW9uUHJvU21CZCIsIEwiTGliZXJhdGlvbiBTZXJpZiIsIDAsIDEyNTJ9LA0KKyAgICB7MHgxNThjNDA0OSwgTCJHYXJhbW9uZCIsDQorICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZixVYnVudHUsRnJlZVNlcmlmIiwgMiwgMTI1Mn0sDQorICAgIHsweDE2MGVjYjI0LCBMIlNUWmhvbmdzb25nIiwNCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiDQorICAgICBMIlNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLA0KKyAgICAgMCwgOTM2fSwNCisgICAgezB4MTYxZWQwN2UsIEwiTVNHb3RoaWMiLA0KKyAgICAgTCJXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxBUiBQTCAiDQorICAgICBMIlVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXIiwNCisgICAgIDEsIDEyNTJ9LA0KKyAgICB7MHgxNzFkMWVkMSwgTCJTbmFwSVRDLVJlZ3VsYXIiLA0KKyAgICAgTCJMaWJlcmF0aW9uIFNhbnMgTmFycm93LFVidW50dSBDb25kZW5zZWQsTmltYnVzIFNhbnMgTCxEZWphVnUgU2FucyIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4MThkMTE4OGYsIEwiQ2FtYnJpYSIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2VyaWYsRnJlZU1vbm8iLCAyLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDE4ZWFmMzUwLCBMIkFyaWFsVW5pY29kZU1TIiwNCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiDQorICAgICBMIlNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLA0KKyAgICAgMCwgOTM2fSwNCisgICAgezB4MWE5MmQxMTUsIEwiTWluZ0xpVSIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIg0KKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwNCisgICAgIDEsIDEyNTJ9LA0KKyAgICB7MHgxY2MyMTdjNiwgTCJUcmVidWNoZXRNUyIsDQorICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZixGcmVlU2VyaWYsVWJ1bnR1IiwgMCwgMTI1Mn0sDQorICAgIHsweDFkNjQ5NTk2LCBMIkJhc2VtaWNUaW1lcyIsDQorICAgICBMIkxpYmVyYXRpb24gU2VyaWYsVGltZXMgTmV3IFJvbWFuLERyb2lkIFNhbnMgSmFwYW5lc2UsRnJlZVNlcmlmLFVidW50dSIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4MWUzNGVlNjAsIEwiQmVsbE1UIiwNCisgICAgIEwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsVWJ1bnR1LExpYmVyYXRpb24gU2VyaWYiLCAyLCAxMjUyfSwNCisgICAgezB4MWViMzY5NDUsIEwiQ29vcGVyQmxhY2siLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlTW9ubyxMaWJlcmF0aW9uIE1vbm8sIFdlblF1YW5ZaSBNaWNybyAiDQorICAgICBMIkhlaSBNb25vIiwNCisgICAgIDIsIDEyNTJ9LA0KKyAgICB7MHgxZWY3Nzg3ZCwgTCJCYXRhbmdDaGUiLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nICINCisgICAgIEwiVFcsV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIE1pY3JvIEhlaSIsDQorICAgICAxLCAxMjUyfSwNCisgICAgezB4MjBiM2JkM2EsIEwiQnJ1c2hTY3JpcHRNVCIsDQorICAgICBMIkthY3N0UXVybixEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTYW5zICINCisgICAgIEwiSmFwYW5lc2UsVVJXIENoYW5jZXJ5IEwsTGliZXJhdGlvbiBTYW5zIiwNCisgICAgIDgsIDEyNTJ9LA0KKyAgICB7MHgyMjA4NzdhYSwgTCJDYW5kYXJhIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwgMCwgMTI1Mn0sDQorICAgIHsweDIyMTM1MDA3LCBMIkZyZWVzdHlsZVNjcmlwdC1SZWd1bGFyIiwNCisgICAgIEwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zIiwgOCwgMTI1Mn0sDQorICAgIHsweDI1MTA1OWMzLCBMIkNoaWxsZXIiLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2FucyAiDQorICAgICBMIkphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4MjViZWQ2ZGQsIEwiTVNSZWZlcmVuY2VTYW5zU2VyaWYiLA0KKyAgICAgTCJEZWphVnUgU2FucyBDb25kZW5zZWQsVWJ1bnR1IENvbmRlbnNlZCxEcm9pZCBTYW5zIEphcGFuZXNlLEFSIFBMIFVLYWkgIg0KKyAgICAgTCJISyIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4MjgxNTRjODEsIEwiUGFyY2htZW50LVJlZ3VsYXIiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zIiwNCisgICAgIDgsIDEyNTJ9LA0KKyAgICB7MHgyOTcxMWViOSwgTCJTVExpdGkiLCBMIkFSIFBMIFVLYWkgSEsiLCAwLCA5MzZ9LA0KKyAgICB7MHgyYjE5OTNiNCwgTCJCYXNlbWljIiwNCisgICAgIEwiTGliZXJhdGlvbiBTZXJpZixEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyYjMxNjMzOSwgTCJOaWFnYXJhU29saWQtUmVnIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4MmMxNDc1MjksIEwiRm9vdGxpZ2h0TVRMaWdodCIsDQorICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyYzE5ODkyOCwgTCJIYXJsb3dTb2xpZCIsDQorICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyYzZhYzZiMiwgTCJMdWNpZGFCcmlnaHQiLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCAiDQorICAgICBMIlNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zIiwNCisgICAgIDIsIDEyNTJ9LA0KKyAgICB7MHgyYzlmMzhlMiwgTCJLb3p1a2FNaW5jaG9Qcm8tVklSIiwgTCJEZWphVnUgU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyZDVhNDdiMCwgTCJTVENhaXl1biIsIEwiQVIgUEwgVUthaSBISyIsIDAsIDkzNn0sDQorICAgIHsweDJkZWYyNmJmLCBMIkJlcm5hcmRNVC1Db25kZW5zZWQiLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLCAwLCAxMjUyfSwNCisgICAgezB4MmZkODkzMGIsIEwiS296dWthTWluY2hvUHI2TlIiLCBMIkRlamFWdSBTZXJpZiIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzMTE1NTI1YSwgTCJGYW5nU29uZ19HQjIzMTIiLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICINCisgICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4MzEzMjc4MTcsIEwiTXlyaWFkUHJvIiwNCisgICAgIEwiVWJ1bnR1IENvbmRlbnNlZCxEcm9pZCBTYW5zIEphcGFuZXNlLCBGcmVlU2VyaWYiLCAwLCAxMjUyfSwNCisgICAgezB4MzIyNDQ5NzUsIEwiSGVsdmV0aWNhIiwNCisgICAgIEwiVWJ1bnR1LERlamFWdSBTYW5zIENvbmRlbnNlZCxMaWJlcmF0aW9uIFNhbnMsTGliZXJhdGlvbiBTYW5zICINCisgICAgIEwiTmFycm93LE5pbWJ1cyBTYW5zIEwiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDMyYWM5OTVjLCBMIlRlcm1pbmFsIiwgTCJEZWphVnUgU2VyaWYiLCAwLCAxMjUyfSwNCisgICAgezB4MzM4ZDY0OGEsIEwiTmlhZ2FyYUVuZ3JhdmVkLVJlZyIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDMzYmI2NWYyLCBMIlN5bGZhZW4iLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNhbnMiLCAyLCAxMjUyfSwNCisgICAgezB4MzQwMmMzMGUsIEwiTVNQTWluY2hvIiwNCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyIsIDIsDQorICAgICAxMjUyfSwNCisgICAgezB4MzQxMmJmMzEsIEwiU2ltU3VuLVBVQSIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sQVIgUEwgVU1pbmcgQ04sQVIgUEwgVU1pbmcgQ04sQVIgUEwgVU1pbmcgSEsiLCAwLA0KKyAgICAgOTM2fSwNCisgICAgezB4MzZlYjM5YjksIEwiQmVybGluU2Fuc0ZCIiwNCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNlcmlmLFVidW50dSxGcmVlU2VyaWYiLCAwLCAxMjUyfSwNCisgICAgezB4MzZmNDIwNTUsIEwiVW5pdmVyc0FUVCIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYiLCAwLCAxMjUyfSwNCisgICAgezB4Mzg2NGM0ZjYsIEwiSGlnaFRvd2VyVGV4dCIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLCAyLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDNhMjU3ZDAzLCBMIkZhbmdTb25nX0dCMjMxMiIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWkiLCAwLCAxMjUyfSwNCisgICAgezB4M2M3ZDFkMDcsIEwiR2FyYW1vbmQzTFRTdGQiLA0KKyAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLFVidW50dSBDb25kZW5zZWQsRGVqYVZ1IFNhbnMgQ29uZGVuc2VkLExpYmVyYXRpb24gIg0KKyAgICAgTCJTZXJpZixVYnVudHUsRnJlZVNlcmlmIiwNCisgICAgIDIsIDEyNTJ9LA0KKyAgICB7MHgzY2RhZTY2OCwgTCJGcmVlc3R5bGVTY3JpcHQiLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyIsIDgsIDEyNTJ9LA0KKyAgICB7MHgzZDU1YWVkNywgTCJKb2tlcm1hbiIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzZDViNDM4NSwgTCJQTWluZ0xpVSIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIg0KKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwNCisgICAgIDIsIDEyNTJ9LA0KKyAgICB7MHgzZDliNzY2OSwgTCJFc3RyYW5nZWxvRWRlc3NhIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHgzZTUzMmQ3NCwgTCJGcmFua2xpbkdvdGhpY01lZGl1bSIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxVYnVudHUiLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDNlNmFhMzJkLCBMIk5TaW1TdW4iLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICINCisgICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsDQorICAgICAxLCA5MzZ9LA0KKyAgICB7MHgzZjZjMzZhOCwgTCJHYXV0YW1pIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsIG1yeV9LYWNzdFF1cm4sRHJvaWQgU2FucyAiDQorICAgICBMIkphcGFuZXNlLEZyZWVTYW5zIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHgzZmYzMjY2MiwgTCJDaGlsbGVyLVJlZ3VsYXIiLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRnJlZVNhbnMiLCAwLCAxMjUyfSwNCisgICAgezB4NDA5ZGUzMTIsIEwiTW9kZXJuTm8uMjAiLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxOaW1idXMgU2FucyBMLE5pbWJ1cyBTYW5zIEwsRnJlZVNhbnMiLCAyLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDQxNDQzYzVlLCBMIkdlb3JnaWEiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRnJlZVNhbnMiLCAyLCAxMjUyfSwNCisgICAgezB4NDE2MGFkZTUsIEwiQmVsbEdvdGhpY1N0ZEJsYWNrIiwgTCJGcmVlU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg0MjE5NzZjNCwgTCJNb2Rlcm4tUmVndWxhciIsIEwiRnJlZVNhbnMiLCAyLCAxMjUyfSwNCisgICAgezB4NDIyYTcyNTIsIEwiU3RlbmNpbCIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2FucyxMaWJlcmF0aW9uIFNhbnMiLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDQyYzg1NTRmLCBMIkZpeGVkc3lzIiwgTCJGcmVlU2VyaWYiLCAwLCAxMjUyfSwNCisgICAgezB4NDM1Y2I0MWQsIEwiUm9tYW4iLCBMIkZyZWVTZXJpZiIsIDAsIDEyNTJ9LA0KKyAgICB7MHg0Nzg4MjM4MywgTCJDb3VyaWVyTmV3IiwNCisgICAgIEwiRnJlZU1vbm8sV2VuUXVhbllpIE1pY3JvIEhlaSBNb25vLEFSIFBMIFVLYWkgQ04sQVIgUEwgVUthaSBISyxBUiBQTCAiDQorICAgICBMIlVLYWkgVFcsQVIgUEwgVUthaSBUVyBNQkUsRGVqYVZ1IFNhbnMiLA0KKyAgICAgMSwgMTI1Mn0sDQorICAgIHsweDQ4MGEyMzM4LCBMIkJlcmxpblNhbnNGQkRlbWkiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZiIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4NDgwYmY3YTQsIEwiQ291cmllclN0ZCIsIEwiRGVqYVZ1IFNhbnMiLCAwLCAxMjUyfSwNCisgICAgezB4NDgxYWQ2ZWQsIEwiVmxhZGltaXJTY3JpcHQiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwgOCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHg0OTExNTc3YSwgTCJZb3VZdWFuIiwNCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyIsIDEsDQorICAgICA5MzZ9LA0KKyAgICB7MHg0YTc4OGQ3MiwgTCJTVFhpbmdrYWkiLCBMIkFSIFBMIFVLYWkgSEssQVIgUEwgVU1pbmcgSEssQVIgUEwgVUthaSBDTiIsIDAsDQorICAgICA5MzZ9LA0KKyAgICB7MHg0YmY4ODU2NiwgTCJTZWdvZUNvbmRlbnNlZCIsIEwiRnJlZVNlcmlmIiwgMCwgMTI1Mn0sDQorICAgIHsweDRjY2Y1MWE0LCBMIkJlcmxpblNhbnNGQi1SZWciLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZiIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4NGVhOTY3Y2UsIEwiR3VsaW1DaGUiLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVLYWkgQ04sQVIgUEwgVUthaSBISyxBUiBQTCBVS2FpIFRXLEFSIFBMICINCisgICAgIEwiVUthaSBUVyBNQkUiLA0KKyAgICAgMSwgMTI1Mn0sDQorICAgIHsweDRmNjhiZDc5LCBMIkxldHRlckdvdGhpY1N0ZCIsDQorICAgICBMIkZyZWVNb25vLExpYmVyYXRpb24gTW9ubyxBbmRhbGUgTW9ubyxXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8iLCAwLCAxMjUyfSwNCisgICAgezB4NTFhMGQwZTYsIEwiS296dWthR290aGljUHI2Tk0iLCBMIkZyZWVTZXJpZiIsIDAsIDEyNTJ9LA0KKyAgICB7MHg1MzFiM2RlYSwgTCJCYXNlbWljU3ltYm9sIiwgTCJGcmVlU2VyaWYiLCAwLCAxMjUyfSwNCisgICAgezB4NTMzM2ZkMzksIEwiQ2FsaWZvcm5pYW5GQi1SZWciLA0KKyAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLFVSVyBDaGFuY2VyeSBMLEZyZWVTZXJpZiIsIDIsIDEyNTJ9LA0KKyAgICB7MHg1MzU2MWE1NCwgTCJGWllUSy0tR0JLMS0wIiwNCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiDQorICAgICBMIlNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLA0KKyAgICAgMCwgOTM2fSwNCisgICAgezB4NTVlMGRkZTYsIEwiTHVjaWRhU2Fuc1R5cGV3cml0ZXIiLA0KKyAgICAgTCJVYnVudHUgTW9ubyxEZWphVnUgU2FucyBNb25vLE5pbWJ1cyBNb25vIEwsTGliZXJhdGlvbiBNb25vLENvdXJpZXIgMTAgIg0KKyAgICAgTCJQaXRjaCxGcmVlTW9ubyIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4NTc0ZDRkM2QsIEwiQWRvYmVBcmFiaWMiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNhbnMiLCAwLCAxMjUyfSwNCisgICAgezB4NTc5MmU3NTksIEwiU1RLYWl0aSIsIEwiV2VuUXVhbllpIE1pY3JvIEhlaSBNb25vIiwgMCwgOTM2fSwNCisgICAgezB4NTkyMTk3OGUsIEwiTHVjaWRhU2Fuc1VuaWNvZGUiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNhbnMiLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDU5NGUyZGE0LCBMIlZyaW5kYSIsDQorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLERyb2lkIEFyYWJpYyAiDQorICAgICBMIk5hc2toLG1yeV9LYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2FucyxGcmVlU2VyaWYiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDU5YmFhOWEyLCBMIkthaVRpX0dCMjMxMiIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIg0KKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg1Y2ZlZGY0ZiwgTCJCYXNrT2xkRmFjZSIsDQorICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLFVidW50dSxMaWJlcmF0aW9uIFNlcmlmIiwgMCwgMTI1Mn0sDQorICAgIHsweDVlMTZhYzkxLCBMIlRyYWphblBybyIsDQorICAgICBMIk5pbWJ1cyBTYW5zIEwsQVIgUEwgVU1pbmcgSEssQVIgUEwgVUthaSBISyxBUiBQTCBVTWluZyBUVyxBUiBQTCBVTWluZyAiDQorICAgICBMIlRXIE1CRSxEZWphVnUgU2FucyxEZWphVnUgU2VyaWYiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDVmMzg4MTk2LCBMIklUQ0xlZ2FjeVNhbnNTdGRNZWRpdW0iLA0KKyAgICAgTCJMaWJlcmF0aW9uIFNlcmlmLEZyZWVTZXJpZixGcmVlU2FucyxVYnVudHUiLCAwLCAxMjUyfSwNCisgICAgezB4NWY5NzkyMWMsIEwiQWRvYmVNeXVuZ2pvU3RkTSIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIg0KKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwNCisgICAgIDAsIDkzNn0sDQorICAgIHsweDVmZWZiZmFkLCBMIkJhdGFuZyIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIg0KKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwNCisgICAgIDIsIDEyNTJ9LA0KKyAgICB7MHg2MDUzNDJiOSwgTCJEb3R1bUNoZSIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sQVIgUEwgVU1pbmcgQ04sQVIgUEwgVU1pbmcgSEssQVIgUEwgVU1pbmcgVFciLCAxLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDYwOGM1ZjlhLCBMIkthaVRpX0dCMjMxMiIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIg0KKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwNCisgICAgIDAsIDkzNn0sDQorICAgIHsweDYxZWZkMGQxLCBMIk1hdHVyYU1UU2NyaXB0Q2FwaXRhbHMiLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCAiDQorICAgICBMIlNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmLERlamFWdSBTYW5zIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg2MjY2MDhhOSwgTCJNVkJvbGkiLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERyb2lkIFNhbnMgIg0KKyAgICAgTCJFdGhpb3BpYyxEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg2MzA1MDFhMywgTCJTbWFsbEZvbnRzIiwgTCJEZWphVnUgU2VyaWYiLCAwLCAxMjUyfSwNCisgICAgezB4NjVkMGUyYTksIEwiRlpZVEstLUdCSzEtMCIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIg0KKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwNCisgICAgIDAsIDkzNn0sDQorICAgIHsweDY2OWYyOWUxLCBMIkZaU1RLLS1HQksxLTAiLA0KKyAgICAgTCJBUiBQTCBVTWluZyBDTixBUiBQTCBVS2FpIENOLCBBUiBQTCBVTWluZyBISyIsIDAsIDkzNn0sDQorICAgIHsweDY3M2E5ZTVmLCBMIlR1bmdhIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCBTYW5zICINCisgICAgIEwiSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg2OTFhYTRjZSwgTCJOaWFnYXJhU29saWQiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwgMCwgMTI1Mn0sDQorICAgIHsweDY5NjI1OWI3LCBMIkNvcmJlbCIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg2OTZlZTliZSwgTCJTVFhpaGVpIiwgTCJXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8iLCAwLCA5MzZ9LA0KKyAgICB7MHg2YzU5Y2Y2OSwgTCJEb3R1bSIsIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg3MDdmYTU2MSwgTCJHdW5nc3VoIiwgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vIiwgMiwgMTI1Mn0sDQorICAgIHsweDcxNDE2YmIyLCBMIlpXQWRvYmVGIiwNCisgICAgIEwiS2Fjc3RBcnQsS2Fjc3RCb29rbSxLYWNzdERlY29yYXRpdmUsS2Fjc3REaWdpdGFsLEthY3N0RmFyc2ksS2Fjc3RMZXR0ZXIsIg0KKyAgICAgTCJLYWNzdE9mZmljZSxEaW5nYmF0cyxGcmVlU2VyaWYiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDcxYjQxODAxLCBMIlZlcmRhbmEiLA0KKyAgICAgTCJEZWphVnUgU2FucyBDb25kZW5zZWQsVWJ1bnR1IENvbmRlbnNlZCxEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg3M2YyNWU0YywgTCJQYWxhdGlub0xpbm90eXBlIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTZXJpZiIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4NzNmNGQxOWYsIEwiTmlhZ2FyYUVuZ3JhdmVkIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTZXJpZiIsIDAsIDEyNTJ9LA0KKyAgICB7MHg3NDAwMTY5NCwgTCJNeXJpYWRQcm9CbGFjayIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxBUiBQTCBVS2FpIEhLIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHg3NGIxNGQ4ZiwgTCJIYWV0dGVuc2Nod2VpbGVyIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTZXJpZiIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4NzRjYjQ0ZWUsIEwiTlNpbVN1biIsIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyIsIDEsIDkzNn0sDQorICAgIHsweDc2YjRkN2ZmLCBMIlNocnV0aSIsDQorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLG1yeV9LYWNzdFF1cm4sRHJvaWQgU2FucyAiDQorICAgICBMIkphcGFuZXNlLEZyZWVTYW5zIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg3ODhiMzUzMywgTCJXZWJkaW5ncyIsIEwiRnJlZVNhbnMiLCA2LCA0Mn0sDQorICAgIHsweDc5N2RkZTk5LCBMIk1TU2VyaWYiLCBMIkZyZWVTYW5zIiwgMCwgMTI1Mn0sDQorICAgIHsweDdhMGY5ZTllLCBMIk1TTWluY2hvIiwNCisgICAgIEwiV2VuUXVhbllpIE1pY3JvIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXIiwNCisgICAgIDEsIDEyNTJ9LA0KKyAgICB7MHg3YjQzOWNhZiwgTCJPbGRFbmdsaXNoVGV4dE1UIiwNCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNhbnMsVWJ1bnR1IiwgMCwgMTI1Mn0sDQorICAgIHsweDgyMTNhNDMzLCBMIkx1Y2lkYVNhbnMtVHlwZXdyaXRlciIsDQorICAgICBMIlVidW50dSBNb25vLExpYmVyYXRpb24gTW9ubyxEZWphVnUgU2FucyBNb25vIiwgMCwgMTI1Mn0sDQorICAgIHsweDgyZmVjOTI5LCBMIkFkb2JlU29uZ1N0ZEwiLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICINCisgICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsDQorICAgICAwLCA5MzZ9LA0KKyAgICB7MHg4MzU4MTgyNSwgTCJNb2Rlcm4iLCBMIkZyZWVTYW5zIiwgMCwgMTI1Mn0sDQorICAgIHsweDgzNWEyODIzLCBMIkFsZ2VyaWFuIiwNCisgICAgIEwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsRnJlZVNhbnMsTGliZXJhdGlvbiBTYW5zLFVidW50dSIsIDAsIDEyNTJ9LA0KKyAgICB7MHg4M2RhYjlmNSwgTCJTY3JpcHQiLCBMIkZyZWVTYW5zIiwgMCwgMTI1Mn0sDQorICAgIHsweDg0N2I1NmRhLCBMIlRhaG9tYSIsDQorICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNhbnMgQ29uZGVuc2VkLEZyZWVTZXJpZiIsIDAsIDEyNTJ9LA0KKyAgICB7MHg4YTc4M2NiMiwgTCJTaW1TdW4tUFVBIiwNCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiDQorICAgICBMIlNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDhiNWNhYzBlLCBMIk9ueXgiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zIiwgMCwgMTI1Mn0sDQorICAgIHsweDhjNmE0OTllLCBMIkd1bGltIiwNCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiDQorICAgICBMIlNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDhlMGFmNzkwLCBMIkp1aWNlSVRDIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg4ZThkNDNiMiwgTCJDZW50YXVyIiwNCisgICAgIEwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsS2htZXIgT1MsS2htZXIgT1MgU3lzdGVtIiwgMiwgMTI1Mn0sDQorICAgIHsweDhlZTRkY2NhLCBMIkJvb2tzaGVsZlN5bWJvbDciLCBMIkxpYmVyYXRpb24gU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg5MDc5NDgwMCwgTCJCZWxsR290aGljU3RkTGlnaHQiLCBMIkxpYmVyYXRpb24gU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg5MDliNTE2YSwgTCJDZW50dXJ5IiwNCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNhbnMsTGliZXJhdGlvbiBNb25vLExpYmVyYXRpb24gU2VyaWYiLCAyLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDkyYWUzNzBkLCBMIk1TT3V0bG9vayIsIEwiTGliZXJhdGlvbiBTYW5zIiwgNCwgNDJ9LA0KKyAgICB7MHg5M2M5ZmJmMSwgTCJMdWNpZGFGYXgiLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgIg0KKyAgICAgTCJFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLExpYmVyYXRpb24gU2FucyIsDQorICAgICAyLCAxMjUyfSwNCisgICAgezB4OTU2NTA4NWUsIEwiQm9va0FudGlxdWEiLA0KKyAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyxMaWJlcmF0aW9uIFNlcmlmIiwgMiwgMTI1Mn0sDQorICAgIHsweDk4NTZkOTVkLCBMIkFkb2JlTWluZ1N0ZEwiLCBMIkFSIFBMIFVNaW5nIEhLIiwgMCwgOTQ5fSwNCisgICAgezB4OWJiYWRkNmIsIEwiQ29sb25uYU1UIiwNCisgICAgIEwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsS2htZXIgT1MsS2htZXIgT1MgU3lzdGVtIiwgMCwgMTI1Mn0sDQorICAgIHsweDljYmQxNmE0LCBMIlNob3djYXJkR290aGljLVJlZyIsDQorICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zLFVidW50dSIsIDAsIDEyNTJ9LA0KKyAgICB7MHg5ZDczMDA4ZSwgTCJNU1NhbnNTZXJpZiIsIEwiRnJlZVNlcmlmIiwgMCwgMTI1Mn0sDQorICAgIHsweGEwNjA3ZGIxLCBMIkd1bmdzdWhDaGUiLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICINCisgICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsDQorICAgICAxLCAxMjUyfSwNCisgICAgezB4YTBiY2Y2YTEsIEwiTGF0aW5XaWRlIiwgTCJGcmVlU2VyaWYiLCAyLCAxMjUyfSwNCisgICAgezB4YTE0MjliMzYsIEwiU3ltYm9sIiwgTCJGcmVlU2VyaWYiLCA2LCA0Mn0sDQorICAgIHsweGExZmE1YWJjLCBMIldpbmdkaW5nczIiLCBMIkZyZWVTZXJpZiIsIDYsIDQyfSwNCisgICAgezB4YTFmYTVhYmQsIEwiV2luZ2RpbmdzMyIsIEwiRnJlZVNlcmlmIiwgNiwgNDJ9LA0KKyAgICB7MHhhNDI3YmFkNCwgTCJJbmZvcm1hbFJvbWFuLVJlZ3VsYXIiLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERyb2lkIFNhbnMgIg0KKyAgICAgTCJKYXBhbmVzZSxGcmVlU2VyaWYiLA0KKyAgICAgOCwgMTI1Mn0sDQorICAgIHsweGE4YjkyZWNlLCBMIkZaU1RLLS1HQksxLTAiLCBMIkFSIFBMIFVNaW5nIENOIiwgMCwgOTM2fSwNCisgICAgezB4YThkODNlY2UsIEwiQ2FsaWZvcm5pYW5GQiIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2VyaWYiLCAyLCAxMjUyfSwNCisgICAgezB4YWEzZTA4MmMsIEwiS2luZ3NvZnQtUGhvbmV0aWMiLA0KKyAgICAgTCJUaWJldGFuIE1hY2hpbmUgVW5pLExLTFVHLFNhbXlhayBHdWphcmF0aSxEcm9pZCBTYW5zICINCisgICAgIEwiVGhhaSx1dGthbCxLZWRhZ2UsTWFsbGlnZSxBUiBQTCBVS2FpIENOIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhhYTZiY2FiZSwgTCJIYXJsb3dTb2xpZEl0YWxpYyIsDQorICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2VyaWYiLCAwLCAxMjUyfSwNCisgICAgezB4YWRlNTMzN2MsIEwiTVNVSUdvdGhpYyIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIg0KKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhiMDhkZDk0MSwgTCJXaWRlTGF0aW4iLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCAiDQorICAgICBMIlNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZiIsDQorICAgICAyLCAxMjUyfSwNCisgICAgezB4YjEyNzY1ZTAsIEwiSVRDTGVnYWN5U2Fuc1N0ZEJvb2siLA0KKyAgICAgTCJBUiBQTCBVTWluZyBISyxBUiBQTCBVS2FpIEhLLEZyZWVTZXJpZixVYnVudHUsRnJlZVNhbnMiLCAwLCAxMjUyfSwNCisgICAgezB4YjIwN2YwNWQsIEwiUG9vclJpY2hhcmQiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZiIsIDIsDQorICAgICAxMjUyfSwNCisgICAgezB4YjNiYzQ5MmYsIEwiSnVpY2VJVEMtUmVndWxhciIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNlcmlmIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhiNTU0NTM5OSwgTCJNYXJsZXR0IiwgTCJMaWJlcmF0aW9uIFNlcmlmIiwgNCwgNDJ9LA0KKyAgICB7MHhiNWRkMWViYiwgTCJCcml0YW5uaWNCb2xkIiwNCisgICAgIEwiS2Fjc3RRdXJuLERyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zICINCisgICAgIEwiRXRoaW9waWMsbXJ5X0thY3N0UXVybixMaWJlcmF0aW9uIFNlcmlmIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhiNjk5YzFjNSwgTCJMdWNpZGFDYWxsaWdyYXBoeS1JdGFsaWMiLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCAiDQorICAgICBMIlNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhiNzI1ZDYyOSwgTCJUaW1lc05ld1JvbWFuIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsIDIsDQorICAgICAxMjUyfSwNCisgICAgezB4YjdlYWViZWIsIEwiQWRvYmVIZWl0aVN0ZFIiLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICINCisgICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsDQorICAgICAwLCA5MzZ9LA0KKyAgICB7MHhiZDI5YzQ4NiwgTCJCZXJsaW5TYW5zRkJEZW1pLUJvbGQiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhiZThhOGRiNCwgTCJCb29rc2hlbGZTeW1ib2xTZXZlbiIsIEwiRGVqYVZ1IFNhbnMiLCAwLCAxMjUyfSwNCisgICAgezB4YzE2YzAxMTgsIEwiQWRvYmVIZWJyZXciLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsVWJ1bnR1LExpYmVyYXRpb24gU2VyaWYiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGMzMThiMGFmLCBMIk15cmlhZFByb0xpZ2h0IiwNCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxBUiBQTCBVS2FpIEhLLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVLYWkgQ04iLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweGM2NWU1NjU5LCBMIkNhbWJyaWFNYXRoIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTZXJpZixGcmVlTW9ubyIsIDIsDQorICAgICAxMjUyfSwNCisgICAgezB4Yzc1YzhmMDUsIEwiTHVjaWRhQ29uc29sZSIsDQorICAgICBMIkxpYmVyYXRpb24gTW9ubyxEZWphVnUgU2FucyBNb25vLEZyZWVNb25vLFdlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyIsIDEsDQorICAgICAxMjUyfSwNCisgICAgezB4Y2E3YzM1ZDYsIEwiQ2FsaWJyaSIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjYjA1M2Y1MywgTCJNaWNyb3NvZnRZYUhlaSIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIg0KKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwNCisgICAgIDAsIDkzNn0sDQorICAgIHsweGNiNzE5MGY5LCBMIk1hZ25ldG8tQm9sZCIsDQorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLG1yeV9LYWNzdFF1cm4sRHJvaWQgU2FucyAiDQorICAgICBMIkphcGFuZXNlLERlamFWdSBTZXJpZiIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4Y2NhMDBjYzUsIEwiU3lzdGVtIiwgTCJEZWphVnUgU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjY2FkNmY3NiwgTCJKb2tlcm1hbi1SZWd1bGFyIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHhjY2M1ODE4YywgTCJFdXJvU2lnbiIsIEwiRGVqYVZ1IFNlcmlmIiwgMCwgMTI1Mn0sDQorICAgIHsweGNmM2Q3MjM0LCBMIkx1Y2lkYUhhbmR3cml0aW5nLUl0YWxpYyIsDQorICAgICBMIkxpYmVyYXRpb24gU2FucyBOYXJyb3csVWJ1bnR1IENvbmRlbnNlZCxOaW1idXMgU2FucyBMLERlamFWdSBTZXJpZiIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4Y2Y3YjhmZGIsIEwiTWluaW9uUHJvIiwgTCJEZWphVnUgU2FucyIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjZmU1NzU1ZiwgTCJTaW1oZWkiLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICINCisgICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsDQorICAgICAxLCA5MzZ9LA0KKyAgICB7MHhkMDExZjRlZSwgTCJNU1BHb3RoaWMiLA0KKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHhkMDYwZTdlZiwgTCJWaXZhbGRpIiwNCisgICAgIEwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zLFVidW50dSIsIDgsIDEyNTJ9LA0KKyAgICB7MHhkMDdlZGVjMSwgTCJGcmFua2xpbkdvdGhpYy1NZWRpdW0iLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsVWJ1bnR1IiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHhkMTA3MjQzZiwgTCJTaW1TdW4iLCBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8iLCAwLCA5MzZ9LA0KKyAgICB7MHhkMTg4MTU2MiwgTCJBcmlhbE5hcnJvdyIsDQorICAgICBMIkxpYmVyYXRpb24gU2FucyBOYXJyb3csRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2VyaWYiLCAwLCAxMjUyfSwNCisgICAgezB4ZDIyYjdkY2UsIEwiQm9kb25pTVRQb3N0ZXJDb21wcmVzc2VkIiwNCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLCAwLCAxMjUyfSwNCisgICAgezB4ZDIyYmZhNjAsIEwiQ29taWNTYW5zTVMiLA0KKyAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVNb25vLExpYmVyYXRpb24gTW9ubyIsIDgsIDEyNTJ9LA0KKyAgICB7MHhkM2JkMGUzNSwgTCJCYXVoYXVzOTMiLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNhbnMsVWJ1bnR1IiwgMCwgMTI1Mn0sDQorICAgIHsweGQ0MjllZTdhLCBMIlNURmFuZ3NvbmciLCBMIldlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyIsIDAsIDkzNn0sDQorICAgIHsweGQ2Njc5YzEyLCBMIkJlcm5hcmRNVENvbmRlbnNlZCIsDQorICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLE5pbWJ1cyBTYW5zIEwsVVJXIENoYW5jZXJ5ICINCisgICAgIEwiTCxLYWNzdE9uZSxMaWJlcmF0aW9uIFNhbnMiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGQ4ZThhMDI3LCBMIkx1Y2lkYVNhbnMiLA0KKyAgICAgTCJMaWJlcmF0aW9uIFNhbnMgTmFycm93LE5pbWJ1cyBTYW5zIEwsS2Fjc3RRdXJuLERyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCAiDQorICAgICBMIlNhbnMgRXRoaW9waWMsRGVqYVZ1IFNlcmlmIENvbmRlbnNlZCxMaWJlcmF0aW9uIE1vbm8sVWJ1bnR1IiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhkOWZlNzc2MSwgTCJIaWdoVG93ZXJUZXh0LVJlZyIsDQorICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsVWJ1bnR1LExpYmVyYXRpb24gU2VyaWYiLCAyLCAxMjUyfSwNCisgICAgezB4ZGE3ZTU1MWUsIEwiU1RTb25nIiwgTCJXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8iLCAwLCA5MzZ9LA0KKyAgICB7MHhkYWE2ODQyZCwgTCJTVFpob25nc29uZyIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIg0KKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwNCisgICAgIDAsIDkzNn0sDQorICAgIHsweGRhYWFiOTNmLCBMIlNURmFuZ3NvbmciLA0KKyAgICAgTCJXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuICINCisgICAgIEwiSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwIiwNCisgICAgIDAsIDkzNn0sDQorICAgIHsweGRhZWIwNzEzLCBMIlNUU29uZyIsDQorICAgICBMIldlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gIg0KKyAgICAgTCJIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAiLA0KKyAgICAgMCwgOTM2fSwNCisgICAgezB4ZGFmZWRiZWYsIEwiU1RDYWl5dW4iLCBMIkFSIFBMIFVLYWkgSEssQVIgUEwgVU1pbmcgSEssQVIgUEwgVUthaSBDTiIsIDAsDQorICAgICA5MzZ9LA0KKyAgICB7MHhkYjAwYTNkOSwgTCJCcm9hZHdheSIsDQorICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zLEZyZWVNb25vLExpYmVyYXRpb24gTW9ubyIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4ZGIxZjVhZDQsIEwiU1RYaW53ZWkiLCBMIkFSIFBMIFVLYWkgSEssQVIgUEwgVU1pbmcgSEssQVIgUEwgVUthaSBDTiIsIDAsDQorICAgICA5MzZ9LA0KKyAgICB7MHhkYjMyNmU3ZiwgTCJTVEthaXRpIiwNCisgICAgIEwiV2VuUXVhbllpIE1pY3JvIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiAiDQorICAgICBMIkhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCIsDQorICAgICAwLCA5MzZ9LA0KKyAgICB7MHhkYjY5NTk1YSwgTCJTVEh1cG8iLA0KKyAgICAgTCJXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuICINCisgICAgIEwiSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwIiwNCisgICAgIDAsIDkzNn0sDQorICAgIHsweGRiYTAwODJjLCBMIlNUWGloZWkiLA0KKyAgICAgTCIgV2VuUXVhbllpIE1pY3JvIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiAiDQorICAgICBMIkhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCIsDQorICAgICAwLCA5MzZ9LA0KKyAgICB7MHhkYmQwYWIxOCwgTCJTVFhpbmdrYWkiLCBMIkFSIFBMIFVLYWkgSEssQVIgUEwgVU1pbmcgSEssQVIgUEwgVUthaSBDTiIsIDAsDQorICAgICA5MzZ9LA0KKyAgICB7MHhkYzFhN2RiMSwgTCJTVExpdGkiLCBMIkFSIFBMIFVLYWkgSEssQVIgUEwgVU1pbmcgSEssQVIgUEwgVUthaSBDTiIsIDAsDQorICAgICA5MzZ9LA0KKyAgICB7MHhkYzMzMDc1ZiwgTCJLcmlzdGVuSVRDLVJlZ3VsYXIiLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERlamFWdSBTYW5zICINCisgICAgIEwiQ29uZGVuc2VkLFVidW50dSxMaWJlcmF0aW9uIFNhbnMiLA0KKyAgICAgOCwgMTI1Mn0sDQorICAgIHsweGRjYzcwMDljLCBMIkhhcnJpbmd0b24iLA0KKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNlcmlmLEZyZWVTZXJpZixVYnVudHUiLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweGRkNzEyNDY2LCBMIkFyaWFsQmxhY2siLA0KKyAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zLERlamFWdSBTZXJpZixGcmVlTW9ubyIsIDAsIDEyNTJ9LA0KKyAgICB7MHhkZGU4N2IzZSwgTCJJbXBhY3QiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwgMCwgMTI1Mn0sDQorICAgIHsweGRmNjlmYjMyLCBMIlNuYXBJVEMiLA0KKyAgICAgTCJMaWJlcmF0aW9uIFNhbnMgTmFycm93LFVidW50dSBDb25kZW5zZWQsRGVqYVZ1IFNhbnMsRGVqYVZ1ICINCisgICAgIEwiU2VyaWYsRnJlZU1vbm8iLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGRmOGIyNWU4LCBMIkNlbnR1cnlHb3RoaWMiLA0KKyAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gTW9ubyxMaWJlcmF0aW9uIFNhbnMsTGliZXJhdGlvbiBTZXJpZiIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4ZTBmNzA1YzAsIEwiS3Jpc3RlbklUQyIsDQorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLG1yeV9LYWNzdFF1cm4sRGVqYVZ1IFNhbnMgIg0KKyAgICAgTCJDb25kZW5zZWQsVWJ1bnR1LExpYmVyYXRpb24gU2FucyIsDQorICAgICA4LCAxMjUyfSwNCisgICAgezB4ZTE0Mjc1NzMsIEwiUmFhdmkiLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyAiDQorICAgICBMIkV0aGlvcGljLG1yeV9LYWNzdFF1cm4sRnJlZVNlcmlmLExpYmVyYXRpb24gU2VyaWYsS2htZXIgT1MiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGUyY2VhMGNiLCBMIk1hZ25ldG8iLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERlamFWdSAiDQorICAgICBMIlNlcmlmLERlamFWdSBTZXJpZiBDb25kZW5zZWQsRGVqYVZ1IFNhbnMiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGUzNmE5ZTE3LCBMIlJhdmllIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEZWphVnUgIg0KKyAgICAgTCJTZXJpZixEZWphVnUgU2FucyxGcmVlTW9ubyIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4ZTQzM2Y4ZTIsIEwiUGFyY2htZW50IiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTZXJpZiIsIDgsIDEyNTJ9LA0KKyAgICB7MHhlNDNkZmY0YSwgTCJXaW5nZGluZ3MiLCBMIkRlamFWdSBTZXJpZiIsIDQsIDQyfSwNCisgICAgezB4ZTRlMmM0MDUsIEwiTVRFeHRyYSIsIEwiRGVqYVZ1IFNlcmlmIiwgNiwgNDJ9LA0KKyAgICB7MHhlNjE4Y2MzNSwgTCJJbmZvcm1hbFJvbWFuIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCBTYW5zICINCisgICAgIEwiSmFwYW5lc2UsTmltYnVzIFNhbnMgTCxEZWphVnUgU2FucyBDb25kZW5zZWQsVWJ1bnR1LExpYmVyYXRpb24gU2FucyIsDQorICAgICA4LCAxMjUyfSwNCisgICAgezB4ZTZjMjdmZmMsIEwiTWlzdHJhbCIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLCA4LCAxMjUyfSwNCisgICAgezB4ZTdlYmY0YjksIEwiQ291cmllciIsIEwiRGVqYVZ1IFNhbnMsRGVqYVZ1IFNhbnMgQ29uZGVuc2VkLEZyZWVTZXJpZiIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4ZThiYzRhOWQsIEwiTVNSZWZlcmVuY2VTcGVjaWFsdHkiLCBMIkRlamFWdSBTZXJpZiIsIDAsIDEyNTJ9LA0KKyAgICB7MHhlOTBmYjAxMywgTCJUZW1wdXNTYW5zSVRDIiwNCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxVYnVudHUsTGliZXJhdGlvbiBTZXJpZixGcmVlU2VyaWYiLCAwLCAxMjUyfSwNCisgICAgezB4ZWM2MzdiNDIsIEwiQ29uc29sYXMiLA0KKyAgICAgTCJEZWphVnUgU2FucyBDb25kZW5zZWQsQVIgUEwgVUthaSBDTixBUiBQTCBVS2FpIEhLLEFSIFBMIFVLYWkgIg0KKyAgICAgTCJUVyxGcmVlU2VyaWYsRnJlZVNhbnMiLA0KKyAgICAgMSwgMTI1Mn0sDQorICAgIHsweGVkM2E2ODNiLCBMIlNUWGlud2VpIiwgTCJBUiBQTCBVS2FpIEhLLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVLYWkgQ04iLCAwLA0KKyAgICAgOTM2fSwNCisgICAgezB4ZWYyNjRjZDEsIEwiTHVjaWRhSGFuZHdyaXRpbmciLA0KKyAgICAgTCJMaWJlcmF0aW9uIFNhbnMgTmFycm93LFVidW50dSBDb25kZW5zZWQsTmltYnVzIFNhbnMgIg0KKyAgICAgTCJMLEthY3N0UXVybixMaWJlcmF0aW9uIE1vbm8iLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGYwODZiY2EyLCBMIkJhc2tlcnZpbGxlT2xkRmFjZSIsDQorICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2VyaWYsVWJ1bnR1LEZyZWVTZXJpZiIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4ZjEwMjgwMzAsIEwiTWFuZ2FsIiwNCisgICAgIEwiRnJlZVNhbnMsVFNDdV9QYXJhbmFyLEdhcnVkYSxMaWJlcmF0aW9uIFNhbnMsTGliZXJhdGlvbiBTYW5zICINCisgICAgIEwiTmFycm93LE5pbWJ1cyBTYW5zIEwiLA0KKyAgICAgMiwgMTI1Mn0sDQorICAgIHsweGYxZGE3ZWI5LCBMIlNob3djYXJkR290aGljIiwNCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYgQ29uZGVuc2VkLERlamFWdSBTYW5zICINCisgICAgIEwiQ29uZGVuc2VkLExpYmVyYXRpb24gU2FucyxVYnVudHUiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGYyMTBmMDZhLCBMIkFyaWFsTVQiLA0KKyAgICAgTCJMaWJlcmF0aW9uIFNhbnMsTGliZXJhdGlvbiBTYW5zIE5hcnJvdyxGcmVlU2FucyxOaW1idXMgU2FucyBMLEtobWVyIE9TICINCisgICAgIEwiU3lzdGVtLEtobWVyIE9TIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhmNDc3ZjE2YSwgTCJMYXRoYSIsDQorICAgICBMIkxpYmVyYXRpb24gU2FucyBOYXJyb3csTmltYnVzIFNhbnMgTCxEcm9pZCBBcmFiaWMgIg0KKyAgICAgTCJOYXNraCxtcnlfS2Fjc3RRdXJuLEZyZWVTZXJpZixOaW1idXMgU2FucyBMIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhmNjE2ZjNkZCwgTCJMaVN1IiwNCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyxBUiAiDQorICAgICBMIlBMIFVNaW5nIFRXIE1CRSIsDQorICAgICAxLCA5MzZ9LA0KKyAgICB7MHhmYTQ3OWFhNiwgTCJNaWNyb3NvZnRZYUhlaSIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIg0KKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwNCisgICAgIDAsIDkzNn0sDQorICAgIHsweGZjZDE5Njk3LCBMIkJvb2ttYW5PbGRTdHlsZSIsDQorICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBNb25vLExpYmVyYXRpb24gU2FucyxMaWJlcmF0aW9uIFNlcmlmIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHhmZTIwOWE4MiwgTCJMdWNpZGFDYWxsaWdyYXBoeSIsDQorICAgICBMIkthY3N0UXVybixEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERyb2lkICINCisgICAgIEwiU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYsRGVqYVZ1IFNhbnMsRnJlZU1vbm8iLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGZlZjEzNWY4LCBMIkFkb2JlSGVpdGlTdGQtUmVndWxhciIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIg0KKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwNCisgICAgIDAsIDkzNn0sDQorfTsNCisjZWxpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXw0KK3N0YXRpYyBjb25zdCBYRkFfRk9OVElORk8gZ19YRkFGb250c01hcFtdID0gew0KKyAgICB7MHgwMWQ1ZDMzZSwgTCJTaW1TdW4iLCBMIlNUSGVpdGksSGVpdGkgVEMsU1RGYW5nc29uZyIsIDAsIDkzNn0sDQorICAgIHsweDAxZTRmMTAyLCBMIllvdVl1YW4iLCBMIlNUSGVpdGksSGVpdGkgVEMsU1RGYW5nc29uZyIsIDEsIDkzNn0sDQorICAgIHsweDAzMDU0OWRjLCBMIkxpU3UiLCBMIlNUSGVpdGksSGVpdGkgVEMsU1RGYW5nc29uZyIsIDEsIDkzNn0sDQorICAgIHsweDAzMmVkZDQ0LCBMIlNpbWhlaSIsIEwiU1RIZWl0aSxIZWl0aSBUQyxTVEZhbmdzb25nIiwgMSwgOTM2fSwNCisgICAgezB4MDNlYWM2ZmMsIEwiUG9vclJpY2hhcmQtUmVndWxhciIsDQorICAgICBMIk5vdGV3b3J0aHksQXZlbmlyIE5leHQgQ29uZGVuc2VkLEltcGFjdCIsIDIsIDEyNTJ9LA0KKyAgICB7MHgwM2VkOTBlNiwgTCJOaW5hIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZiIsIDAsIDEyNTJ9LA0KKyAgICB7MHgwNzdiNTZiMywgTCJLaW5nc29mdFBob25ldGljUGxhaW4iLA0KKyAgICAgTCJMYXN0UmVzb3J0LEFwcGxlICINCisgICAgIEwiQ2hhbmNlcnksU1RJWFZhcmlhbnRzLFNUSVhTaXplT25lU3ltLFNUSVhTaXplT25lU3ltLEFwcGxlIEJyYWlsbGUiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDA3OGVkNTI0LCBMIk1pY3Jvc29mdFNhbnNTZXJpZiIsIEwiU29uZ3RpIFNDLEFwcGxlIFN5bWJvbHMiLCAwLCAxMjUyfSwNCisgICAgezB4MDg5YjE4YTksIEwiQXJpYWwiLA0KKyAgICAgTCJBcmlhbCBVbmljb2RlIE1TLE1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLCAxMjUyfSwNCisgICAgezB4MGIyY2FkNzIsIEwiTW9ub3R5cGVDb3JzaXZhIiwgTCJBcmlhbCBOYXJyb3csSW1wYWN0IiwgOCwgMTI1Mn0sDQorICAgIHsweDBiYjAwM2U3LCBMIkthcnRpa2EiLA0KKyAgICAgTCJBcmlhbCBVbmljb2RlIE1TLE1pY3Jvc29mdCBTYW5zIFNlcmlmLEFyaWFsIE5hcnJvdyxEYW1hc2N1cyIsIDIsIDEyNTJ9LA0KKyAgICB7MHgwYmI0NjlkZiwgTCJWaW5lckhhbmRJVEMiLCBMIkNvbWljIFNhbnMgTVMsU29uZ3RpIFNDLFNUU29uZyIsIDgsIDEyNTJ9LA0KKyAgICB7MHgwYmMxYTg1MSwgTCJTZWdvZVVJIiwgTCJBcHBsZSBTeW1ib2xzIiwgMCwgMTI1Mn0sDQorICAgIHsweDBjMTEyZWJkLCBMIktvenVrYUdvdGhpY1Byby1WSU0iLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDBjZmNiOWMxLCBMIkFkb2JlVGhhaSIsIEwiQXZlbmlyIE5leHQgQ29uZGVuc2VkIFVsdHJhIExpZ2h0IiwgMCwgODQ3fSwNCisgICAgezB4MGU3ZGUwZjksIEwiUGxheWJpbGwiLCBMIlNUSVhOb25Vbmljb2RlIiwgMCwgMTI1Mn0sDQorICAgIHsweDBlZmY0N2MzLCBMIlNUSHVwbyIsIEwiS2FpdGkgU0MsU29uZ3RpIFNDLFNUSGVpdGkiLCAwLCA5MzZ9LA0KKyAgICB7MHgxMDdhZDM3NCwgTCJDb25zdGFudGlhIiwgTCJBcmlhbCBVbmljb2RlIE1TLFBhbGF0aW5vLEJhc2tlcnZpbGxlIiwgMiwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHgxMjE5NGMyZCwgTCJLdW5zdGxlclNjcmlwdCIsDQorICAgICBMIkF2ZW5pciBOZXh0IENvbmRlbnNlZCBEZW1pIEJvbGQsQXJpYWwgTmFycm93IiwgOCwgMTI1Mn0sDQorICAgIHsweDEzNWVmNmExLCBMIk1pbmlvblByb1NtQmQiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDE1OGM0MDQ5LCBMIkdhcmFtb25kIiwgTCJJbXBhY3QsQXJpYWwgTmFycm93IiwgMiwgMTI1Mn0sDQorICAgIHsweDE2MGVjYjI0LCBMIlNUWmhvbmdzb25nIiwgTCJTVEZhbmdzb25nLFNvbmd0aSBTQyIsIDAsIDkzNn0sDQorICAgIHsweDE2MWVkMDdlLCBMIk1TR290aGljIiwNCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyAiDQorICAgICBMIlRXLE1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLA0KKyAgICAgMSwgMTI1Mn0sDQorICAgIHsweDE3MWQxZWQxLCBMIlNuYXBJVEMtUmVndWxhciIsIEwiU1RIZWl0aSxBcmlhbCBCbGFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHgxOGQxMTg4ZiwgTCJDYW1icmlhIiwgTCJBcmlhbCBVbmljb2RlIE1TIiwgMiwgMTI1Mn0sDQorICAgIHsweDE4ZWFmMzUwLCBMIkFyaWFsVW5pY29kZU1TIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMCwNCisgICAgIDkzNn0sDQorICAgIHsweDFhOTJkMTE1LCBMIk1pbmdMaVUiLCBMIkhlaXRpIFNDLFNUSGVpdGkiLCAxLCAxMjUyfSwNCisgICAgezB4MWNjMjE3YzYsIEwiVHJlYnVjaGV0TVMiLCBMIkRhbWFzY3VzLEltcGFjdCxBcmlhbCBOYXJyb3ciLCAwLCAxMjUyfSwNCisgICAgezB4MWQ2NDk1OTYsIEwiQmFzZW1pY1RpbWVzIiwgTCJMaWJlcmF0aW9uIFNlcmlmLEltcGFjdCxBcmlhbCBOYXJyb3ciLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDFlMzRlZTYwLCBMIkJlbGxNVCIsDQorICAgICBMIlBhcHlydXMsU1RJWE5vblVuaWNvZGUsTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXZlbmlyIExpZ2h0IiwgMiwgMTI1Mn0sDQorICAgIHsweDFlYjM2OTQ1LCBMIkNvb3BlckJsYWNrIiwNCisgICAgIEwiTWFyaW9uLFNUSVhOb25Vbmljb2RlLEFyaWFsIFJvdW5kZWQgTVQgQm9sZCxMdWNpZGEgR3JhbmRlIiwgMiwgMTI1Mn0sDQorICAgIHsweDFlZjc3ODdkLCBMIkJhdGFuZ0NoZSIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sQVIgUEwgVU1pbmcgQ04sLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXLEFSICINCisgICAgIEwiUEwgVU1pbmcgVFcgTUJFLEFyaWFsIFVuaWNvZGUgTVMsSGVpdGkgVEMiLA0KKyAgICAgMSwgMTI1Mn0sDQorICAgIHsweDIwYjNiZDNhLCBMIkJydXNoU2NyaXB0TVQiLA0KKyAgICAgTCJTVElYTm9uVW5pY29kZSxEYW1hc2N1cyxBcmlhbCBOYXJyb3csQXZlbmlyIE5leHQgQ29uZGVuc2VkLENvY2hpbiIsIDgsDQorICAgICAxMjUyfSwNCisgICAgezB4MjIwODc3YWEsIEwiQ2FuZGFyYSIsIEwiQ29jaGluLEJhc2tlcnZpbGxlLE1hcmlvbiIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyMjEzNTAwNywgTCJGcmVlc3R5bGVTY3JpcHQtUmVndWxhciIsDQorICAgICBMIlNUSVhOb25Vbmljb2RlLE5hZGVlbSxaYXBmIERpbmdiYXRzIiwgOCwgMTI1Mn0sDQorICAgIHsweDI1MTA1OWMzLCBMIkNoaWxsZXIiLA0KKyAgICAgTCJaYXBmIERpbmdiYXRzLERhbWFzY3VzLFNUSVhOb25Vbmljb2RlLFBhcHlydXMsS3VmaVN0YW5kYXJkR0ssQmFnaGRhZCIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4MjViZWQ2ZGQsIEwiTVNSZWZlcmVuY2VTYW5zU2VyaWYiLA0KKyAgICAgTCJUYWhvbWEsQXBwbGUgU3ltYm9scyxBcHBsZSBMaUdvdGhpYyxBcmlhbCBVbmljb2RlIE1TLEx1Y2lkYSAiDQorICAgICBMIkdyYW5kZSxNaWNyb3NvZnQgU2FucyBTZXJpZiIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4MjgxNTRjODEsIEwiUGFyY2htZW50LVJlZ3VsYXIiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCA4LA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDI5NzExZWI5LCBMIlNUTGl0aSIsIEwiS2FpdGkgU0MsU29uZ3RpIFNDIiwgMCwgOTM2fSwNCisgICAgezB4MmIxOTkzYjQsIEwiQmFzZW1pYyIsIEwiSW1wYWN0LEFyaWFsIE5hcnJvdyIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyYjMxNjMzOSwgTCJOaWFnYXJhU29saWQtUmVnIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHgyYzE0NzUyOSwgTCJGb290bGlnaHRNVExpZ2h0IiwNCisgICAgIEwiU1RJWE5vblVuaWNvZGUsQXZlbmlyIE5leHQgQ29uZGVuc2VkIEhlYXZ5LFBUIFNhbnMsTm90ZXdvcnRoeSIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyYzE5ODkyOCwgTCJIYXJsb3dTb2xpZCIsDQorICAgICBMIkF2ZW5pciBNZWRpdW0sQXZlbmlyIE5leHQgTWVkaXVtLEFyaWFsIFVuaWNvZGUgTVMiLCAwLCAxMjUyfSwNCisgICAgezB4MmM2YWM2YjIsIEwiTHVjaWRhQnJpZ2h0IiwNCisgICAgIEwiUFQgU2FucyBOYXJyb3csUGFweXJ1cyxEYW1hc2N1cyxTVElYTm9uVW5pY29kZSxBcmlhbCBSb3VuZGVkIE1UICINCisgICAgIEwiQm9sZCxDb21pYyBTYW5zIE1TLEF2ZW5pciBOZXh0IiwNCisgICAgIDIsIDEyNTJ9LA0KKyAgICB7MHgyYzlmMzhlMiwgTCJLb3p1a2FNaW5jaG9Qcm8tVklSIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHgyZDVhNDdiMCwgTCJTVENhaXl1biIsIEwiS2FpdGkgU0MsU29uZ3RpIFNDIiwgMCwgOTM2fSwNCisgICAgezB4MmRlZjI2YmYsIEwiQmVybmFyZE1ULUNvbmRlbnNlZCIsDQorICAgICBMIkltcGFjdCxBdmVuaXIgTmV4dCBDb25kZW5zZWQgRGVtaSBCb2xkLEFtZXJpY2FuIFR5cGV3cml0ZXIiLCAwLCAxMjUyfSwNCisgICAgezB4MmZkODkzMGIsIEwiS296dWthTWluY2hvUHI2TlIiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDMxMTU1MjVhLCBMIkZhbmdTb25nX0dCMjMxMiIsIEwiSGlyYWdpbm8gU2FucyBHQixTVEhlaXRpIiwgMCwgMTI1Mn0sDQorICAgIHsweDMxMzI3ODE3LCBMIk15cmlhZFBybyIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzMjI0NDk3NSwgTCJIZWx2ZXRpY2EiLA0KKyAgICAgTCJBcmlhbCBOYXJyb3csQXJpYWwgVW5pY29kZSBNUyxEYW1hc2N1cyxTVElYTm9uVW5pY29kZSIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzMmFjOTk1YywgTCJUZXJtaW5hbCIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzMzhkNjQ4YSwgTCJOaWFnYXJhRW5ncmF2ZWQtUmVnIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHgzM2JiNjVmMiwgTCJTeWxmYWVuIiwgTCJBcmlhbCBVbmljb2RlIE1TLE1hcmlvbiIsIDIsIDEyNTJ9LA0KKyAgICB7MHgzNDAyYzMwZSwgTCJNU1BNaW5jaG8iLCBMIkFyaWFsIFVuaWNvZGUgTVMsQXBwbGUgU0QgR290aGljIE5lbyIsIDIsDQorICAgICAxMjUyfSwNCisgICAgezB4MzQxMmJmMzEsIEwiU2ltU3VuLVBVQSIsIEwiU1RIZWl0aSxIZWl0aSBUQyxTVEZhbmdzb25nIiwgMCwgOTM2fSwNCisgICAgezB4MzZlYjM5YjksIEwiQmVybGluU2Fuc0ZCIiwgTCJBbWVyaWNhbiBUeXBld3JpdGVyLEltcGFjdCIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzNmY0MjA1NSwgTCJVbml2ZXJzQVRUIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZiIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzODY0YzRmNiwgTCJIaWdoVG93ZXJUZXh0IiwgTCJTVElYR2VuZXJhbCwuSGVsdmV0aWNhIE5ldWUgRGVzayBVSSIsIDIsDQorICAgICAxMjUyfSwNCisgICAgezB4M2EyNTdkMDMsIEwiRmFuZ1NvbmdfR0IyMzEyIiwgTCJIaXJhZ2lubyBTYW5zIEdCLFNUSGVpdGkiLCAwLCAxMjUyfSwNCisgICAgezB4M2NkYWU2NjgsIEwiRnJlZXN0eWxlU2NyaXB0IiwgTCJOYWRlZW0sWmFwZiBEaW5nYmF0cyxTVElYTm9uVW5pY29kZSIsIDgsDQorICAgICAxMjUyfSwNCisgICAgezB4M2Q1NWFlZDcsIEwiSm9rZXJtYW4iLA0KKyAgICAgTCJQYXB5cnVzLEx1Y2lkYSBHcmFuZGUsSGVpdGkgVEMsQW1lcmljYW4gVHlwZXdyaXRlciIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzZDViNDM4NSwgTCJQTWluZ0xpVSIsIEwiSGVpdGkgU0MsU1RIZWl0aSIsIDIsIDEyNTJ9LA0KKyAgICB7MHgzZDliNzY2OSwgTCJFc3RyYW5nZWxvRWRlc3NhIiwgTCJBbWVyaWNhbiBUeXBld3JpdGVyLE1hcmlvbiIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzZTUzMmQ3NCwgTCJGcmFua2xpbkdvdGhpY01lZGl1bSIsIEwiSW1wYWN0LEFyaWFsIE5hcnJvdyIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzZTZhYTMyZCwgTCJOU2ltU3VuIiwgTCJTVEhlaXRpLFNURmFuZ3NvbmciLCAxLCA5MzZ9LA0KKyAgICB7MHgzZjZjMzZhOCwgTCJHYXV0YW1pIiwNCisgICAgIEwiRGFtYXNjdXMsU1RJWE5vblVuaWNvZGUsU1RJWEdlbmVyYWwsQW1lcmljYW4gVHlwZXdyaXRlciIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzZmYzMjY2MiwgTCJDaGlsbGVyLVJlZ3VsYXIiLCBMIlBhcHlydXMsS3VmaVN0YW5kYXJkR0ssQmFnaGRhZCIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4NDA5ZGUzMTIsIEwiTW9kZXJuTm8uMjAiLCBMIkF2ZW5pciBOZXh0IENvbmRlbnNlZCxJbXBhY3QiLCAyLCAxMjUyfSwNCisgICAgezB4NDE0NDNjNWUsIEwiR2VvcmdpYSIsIEwiLkhlbHZldGljYSBOZXVlIERlc2sgVUksQXJpYWwgVW5pY29kZSBNUyIsIDIsDQorICAgICAxMjUyfSwNCisgICAgezB4NDE2MGFkZTUsIEwiQmVsbEdvdGhpY1N0ZEJsYWNrIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg0MjE5NzZjNCwgTCJNb2Rlcm4tUmVndWxhciIsIEwiSW1wYWN0IiwgMiwgMTI1Mn0sDQorICAgIHsweDQyMmE3MjUyLCBMIlN0ZW5jaWwiLCBMIlNUSVhOb25Vbmljb2RlLFNvbmd0aSBTQyxHZW9yZ2lhLEJhc2tlcnZpbGxlIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHg0MmM4NTU0ZiwgTCJGaXhlZHN5cyIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg0MzVjYjQxZCwgTCJSb21hbiIsIEwiQXJpYWwgTmFycm93IiwgMCwgMTI1Mn0sDQorICAgIHsweDQ3ODgyMzgzLCBMIkNvdXJpZXJOZXciLCBMIlBDTXl1bmdqbyxPc2FrYSxBcmlhbCBVbmljb2RlIE1TLFNvbmd0aSBTQyIsDQorICAgICAxLCAxMjUyfSwNCisgICAgezB4NDgwYTIzMzgsIEwiQmVybGluU2Fuc0ZCRGVtaSIsDQorICAgICBMIlNUSVhOb25Vbmljb2RlLEFtZXJpY2FuIFR5cGV3cml0ZXIsQXZlbmlyIE5leHQgQ29uZGVuc2VkIEhlYXZ5IiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHg0ODBiZjdhNCwgTCJDb3VyaWVyU3RkIiwgTCJDb3VyaWVyIE5ldyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg0ODFhZDZlZCwgTCJWbGFkaW1pclNjcmlwdCIsDQorICAgICBMIlNUSVhOb25Vbmljb2RlLEF2ZW5pciBOZXh0IENvbmRlbnNlZCxJbXBhY3QiLCA4LCAxMjUyfSwNCisgICAgezB4NDkxMTU3N2EsIEwiWW91WXVhbiIsIEwiU1RIZWl0aSxIZWl0aSBUQyIsIDEsIDkzNn0sDQorICAgIHsweDRhNzg4ZDcyLCBMIlNUWGluZ2thaSIsIEwiS2FpdGkgU0MsU29uZ3RpIFNDIiwgMCwgOTM2fSwNCisgICAgezB4NGJmODg1NjYsIEwiU2Vnb2VDb25kZW5zZWQiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDRjY2Y1MWE0LCBMIkJlcmxpblNhbnNGQi1SZWciLA0KKyAgICAgTCJTVElYTm9uVW5pY29kZSxBbWVyaWNhbiBUeXBld3JpdGVyLEltcGFjdCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg0ZWE5NjdjZSwgTCJHdWxpbUNoZSIsIEwiQXJpYWwgVW5pY29kZSBNUyxIZWl0aSBUQyxTVEZhbmdzb25nIiwgMSwgMTI1Mn0sDQorICAgIHsweDRmNjhiZDc5LCBMIkxldHRlckdvdGhpY1N0ZCIsDQorICAgICBMIkNvdXJpZXIgTmV3LEFuZGFsZSBNb25vLEF5dXRoYXlhLFBDTXl1bmdqbyxPc2FrYSIsIDAsIDEyNTJ9LA0KKyAgICB7MHg1MWEwZDBlNiwgTCJLb3p1a2FHb3RoaWNQcjZOTSIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4NTMxYjNkZWEsIEwiQmFzZW1pY1N5bWJvbCIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4NTMzM2ZkMzksIEwiQ2FsaWZvcm5pYW5GQi1SZWciLA0KKyAgICAgTCJBbWVyaWNhbiBUeXBld3JpdGVyLEF2ZW5pciBOZXh0IENvbmRlbnNlZCxJbXBhY3QiLCAyLCAxMjUyfSwNCisgICAgezB4NTM1NjFhNTQsIEwiRlpZVEstLUdCSzEtMCIsIEwiU1RGYW5nc29uZyxTb25ndGkgU0MsU1RTb25nIiwgMCwgOTM2fSwNCisgICAgezB4NTVlMGRkZTYsIEwiTHVjaWRhU2Fuc1R5cGV3cml0ZXIiLCBMIk1lbmxvLENvdXJpZXIgTmV3LEFuZGFsZSBNb25vIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHg1NzRkNGQzZCwgTCJBZG9iZUFyYWJpYyIsIEwiQXJpYWwgTmFycm93IiwgMCwgMTI1Mn0sDQorICAgIHsweDU3OTJlNzU5LCBMIlNUS2FpdGkiLCBMIlNvbmd0aSBTQyxBcmlhbCBVbmljb2RlIE1TIiwgMCwgOTM2fSwNCisgICAgezB4NTkyMTk3OGUsIEwiTHVjaWRhU2Fuc1VuaWNvZGUiLCBMIkx1Y2lkYSBHcmFuZGUsQXJpYWwgVW5pY29kZSBNUyxNZW5sbyIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4NTk0ZTJkYTQsIEwiVnJpbmRhIiwgTCJHZWV6YSBQcm8sRGFtYXNjdXMsU1RJWEdlbmVyYWwsR2lsbCBTYW5zIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHg1OWJhYTlhMiwgTCJLYWlUaV9HQjIzMTIiLCBMIkhpcmFnaW5vIFNhbnMgR0IsU1RIZWl0aSIsIDAsIDEyNTJ9LA0KKyAgICB7MHg1Y2ZlZGY0ZiwgTCJCYXNrT2xkRmFjZSIsDQorICAgICBMIkF2ZW5pciBOZXh0IENvbmRlbnNlZCBIZWF2eSxQVCBTYW5zLEF2ZW5pciBOZXh0IENvbmRlbnNlZCIsIDAsIDEyNTJ9LA0KKyAgICB7MHg1ZTE2YWM5MSwgTCJUcmFqYW5Qcm8iLCBMIkFyaWFsIE5hcnJvdyxQVCBTYW5zIE5hcnJvdyxEYW1hc2N1cyIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4NWY5NzkyMWMsIEwiQWRvYmVNeXVuZ2pvU3RkTSIsDQorICAgICBMIkFwcGxlTXl1bmdqbyxBcHBsZUdvdGhpYyxBcmlhbCBVbmljb2RlIE1TIiwgMCwgOTM2fSwNCisgICAgezB4NWZlZmJmYWQsIEwiQmF0YW5nIiwgTCJBcmlhbCBVbmljb2RlIE1TLFNvbmd0aSBTQyIsIDIsIDEyNTJ9LA0KKyAgICB7MHg2MDUzNDJiOSwgTCJEb3R1bUNoZSIsIEwiQXJpYWwgVW5pY29kZSBNUyxIZWl0aSBUQyIsIDEsIDEyNTJ9LA0KKyAgICB7MHg2MDhjNWY5YSwgTCJLYWlUaV9HQjIzMTIiLCBMIkhpcmFnaW5vIFNhbnMgR0IsU1RIZWl0aSxIZWl0aSBUQyIsIDAsIDkzNn0sDQorICAgIHsweDYxZWZkMGQxLCBMIk1hdHVyYU1UU2NyaXB0Q2FwaXRhbHMiLA0KKyAgICAgTCJLb2tvbm9yLERhbWFzY3VzLFNUSVhOb25Vbmljb2RlLFNUSGVpdGksQXJpYWwgQmxhY2ssQXZlbmlyIE5leHQgSGVhdnkiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDYyNjYwOGE5LCBMIk1WQm9saSIsDQorICAgICBMIkFwcGxlIEJyYWlsbGUsR2VlemEgUHJvLE1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLCAxMjUyfSwNCisgICAgezB4NjMwNTAxYTMsIEwiU21hbGxGb250cyIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg2NWQwZTJhOSwgTCJGWllUSy0tR0JLMS0wIiwgTCJTVEZhbmdzb25nLFNvbmd0aSBTQyxTVFNvbmciLCAwLCA5MzZ9LA0KKyAgICB7MHg2NjlmMjllMSwgTCJGWlNUSy0tR0JLMS0wIiwgTCJTVEhlaXRpLEhlaXRpIFRDIiwgMCwgOTM2fSwNCisgICAgezB4NjczYTllNWYsIEwiVHVuZ2EiLA0KKyAgICAgTCJEYW1hc2N1cyxTVElYTm9uVW5pY29kZSxBdmVuaXIgTmV4dCBDb25kZW5zZWQsQXZlbmlyIE5leHQgQ29uZGVuc2VkICINCisgICAgIEwiVWx0cmEgTGlnaHQsRnV0dXJhIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg2OTFhYTRjZSwgTCJOaWFnYXJhU29saWQiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDY5NjI1OWI3LCBMIkNvcmJlbCIsIEwiQ29jaGluLEJhc2tlcnZpbGxlLE1hcmlvbiIsIDAsIDEyNTJ9LA0KKyAgICB7MHg2OTZlZTliZSwgTCJTVFhpaGVpIiwgTCJTVEhlaXRpLEhlaXRpIFRDLFNvbmd0aSBTQyxBcmlhbCBVbmljb2RlIE1TIiwgMCwNCisgICAgIDkzNn0sDQorICAgIHsweDZjNTljZjY5LCBMIkRvdHVtIiwgTCJBcmlhbCBVbmljb2RlIE1TLFNvbmd0aSBTQyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg3MDdmYTU2MSwgTCJHdW5nc3VoIiwgTCJBcmlhbCBVbmljb2RlIE1TLEhlaXRpIFRDIiwgMiwgMTI1Mn0sDQorICAgIHsweDcxNDE2YmIyLCBMIlpXQWRvYmVGIiwNCisgICAgIEwiU1RJWFNpemVGb3VyU3ltLFNUSVhTaXplVGhyZWVTeW0sU1RJWFNpemVUd29TeW0sU1RJWFNpemVPbmVTeW0iLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDcxYjQxODAxLCBMIlZlcmRhbmEiLA0KKyAgICAgTCJUYWhvbWEsTWFyaW9uLEFwcGxlIFN5bWJvbHMsLkhlbHZldGljYSBOZXVlIERlc2sgVUksTHVjaWRhICINCisgICAgIEwiR3JhbmRlLENvdXJpZXIgTmV3IiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg3M2YyNWU0YywgTCJQYWxhdGlub0xpbm90eXBlIiwgTCJQYWxhdGlubyxBcmlhbCBVbmljb2RlIE1TIiwgMCwgMTI1Mn0sDQorICAgIHsweDczZjRkMTlmLCBMIk5pYWdhcmFFbmdyYXZlZCIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4NzQwMDE2OTQsIEwiTXlyaWFkUHJvQmxhY2siLCBMIlBhbGF0aW5vLEJhc2tlcnZpbGxlLE1hcmlvbixDb2NoaW4iLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDc0YjE0ZDhmLCBMIkhhZXR0ZW5zY2h3ZWlsZXIiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDc0Y2I0NGVlLCBMIk5TaW1TdW4iLCBMIlNUSGVpdGksSGVpdGkgVEMsU1RGYW5nc29uZyIsIDEsIDkzNn0sDQorICAgIHsweDc2YjRkN2ZmLCBMIlNocnV0aSIsDQorICAgICBMIkRhbWFzY3VzLFNUSVhOb25Vbmljb2RlLEFyaWFsIFVuaWNvZGUgTVMsQW1lcmljYW4gVHlwZXdyaXRlciIsIDAsIDEyNTJ9LA0KKyAgICB7MHg3ODhiMzUzMywgTCJXZWJkaW5ncyIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDYsIDQyfSwNCisgICAgezB4Nzk3ZGRlOTksIEwiTVNTZXJpZiIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg3YTBmOWU5ZSwgTCJNU01pbmNobyIsDQorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sQVIgUEwgVU1pbmcgQ04sQVIgUEwgVU1pbmcgSEssQVIgUEwgVU1pbmcgVFcsQVIgIg0KKyAgICAgTCJQTCBVTWluZyBUVyBNQkUsQXJpYWwgVW5pY29kZSBNUyxBcHBsZSBTRCBHb3RoaWMgTmVvIiwNCisgICAgIDEsIDEyNTJ9LA0KKyAgICB7MHg3YjQzOWNhZiwgTCJPbGRFbmdsaXNoVGV4dE1UIiwNCisgICAgIEwiU1RJWE5vblVuaWNvZGUsQXJpYWwgVW5pY29kZSBNUyxCYXNrZXJ2aWxsZSxBdmVuaXIgTmV4dCBNZWRpdW0iLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDgyMTNhNDMzLCBMIkx1Y2lkYVNhbnMtVHlwZXdyaXRlciIsDQorICAgICBMIkNvbWljIFNhbnMgTVMsQXZlbmlyIE5leHQsQXJpYWwgUm91bmRlZCBNVCBCb2xkIiwgMCwgMTI1Mn0sDQorICAgIHsweDgyZmVjOTI5LCBMIkFkb2JlU29uZ1N0ZEwiLCBMIkhlaXRpIFRDLFNUSGVpdGkiLCAwLCA5MzZ9LA0KKyAgICB7MHg4MzU4MTgyNSwgTCJNb2Rlcm4iLCBMIkF2ZW5pciBOZXh0IENvbmRlbnNlZCxJbXBhY3QiLCAwLCAxMjUyfSwNCisgICAgezB4ODM1YTI4MjMsIEwiQWxnZXJpYW4iLA0KKyAgICAgTCJTVElYTm9uVW5pY29kZSxCYXNrZXJ2aWxsZSxBdmVuaXIgTmV4dCBNZWRpdW0sQW1lcmljYW4gVHlwZXdyaXRlciIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4ODNkYWI5ZjUsIEwiU2NyaXB0IiwgTCJBcmlhbCBOYXJyb3ciLCAwLCAxMjUyfSwNCisgICAgezB4ODQ3YjU2ZGEsIEwiVGFob21hIiwgTCJTb25ndGkgU0MsQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg4YTc4M2NiMiwgTCJTaW1TdW4tUFVBIiwgTCJTVEhlaXRpLEhlaXRpIFRDLFNURmFuZ3NvbmciLCAwLCAxMjUyfSwNCisgICAgezB4OGI1Y2FjMGUsIEwiT255eCIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg4YzZhNDk5ZSwgTCJHdWxpbSIsIEwiQXJpYWwgVW5pY29kZSBNUyxTb25ndGkgU0MiLCAwLCAxMjUyfSwNCisgICAgezB4OGUwYWY3OTAsIEwiSnVpY2VJVEMiLCBMIk5hZGVlbSxBbCBCYXlhbiIsIDAsIDEyNTJ9LA0KKyAgICB7MHg4ZThkNDNiMiwgTCJDZW50YXVyIiwgTCJBdmVuaXIgTmV4dCBDb25kZW5zZWQsTm90ZXdvcnRoeSxJbXBhY3QiLCAyLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDhlZTRkY2NhLCBMIkJvb2tzaGVsZlN5bWJvbDciLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDkwNzk0ODAwLCBMIkJlbGxHb3RoaWNTdGRMaWdodCIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4OTA5YjUxNmEsIEwiQ2VudHVyeSIsIEwiRGFtYXNjdXMsQW5kYWxlIE1vbm8sU29uZ3RpIFNDLEFyaWFsIFVuaWNvZGUgTVMiLA0KKyAgICAgMiwgMTI1Mn0sDQorICAgIHsweDkyYWUzNzBkLCBMIk1TT3V0bG9vayIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDQsIDQyfSwNCisgICAgezB4OTNjOWZiZjEsIEwiTHVjaWRhRmF4IiwNCisgICAgIEwiUFQgU2FucyBOYXJyb3csUGFweXJ1cyxLb2tvbm9yLEdlZXphIFBybyxBcmlhbCBSb3VuZGVkIE1UIEJvbGQsTHVjaWRhICINCisgICAgIEwiR3JhbmRlLEZ1dHVyYSIsDQorICAgICAyLCAxMjUyfSwNCisgICAgezB4OTU2NTA4NWUsIEwiQm9va0FudGlxdWEiLCBMIlBhbGF0aW5vLE1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLA0KKyAgICAgMiwgMTI1Mn0sDQorICAgIHsweDk4NTZkOTVkLCBMIkFkb2JlTWluZ1N0ZEwiLCBMIkFIaXJhZ2lubyBTYW5zIEdCLEhlaXRpIFRDLFNUSGVpdGkiLCAwLA0KKyAgICAgOTQ5fSwNCisgICAgezB4OWJiYWRkNmIsIEwiQ29sb25uYU1UIiwgTCJOb3Rld29ydGh5LEF2ZW5pciBOZXh0IENvbmRlbnNlZCxJbXBhY3QiLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDljYmQxNmE0LCBMIlNob3djYXJkR290aGljLVJlZyIsDQorICAgICBMIkFyaWFsIFVuaWNvZGUgTVMsR2VvcmdpYSxBbWVyaWNhbiBUeXBld3JpdGVyIiwgMCwgMTI1Mn0sDQorICAgIHsweDlkNzMwMDhlLCBMIk1TU2Fuc1NlcmlmIiwgTCJTb25ndGkgU0MsQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LA0KKyAgICB7MHhhMDYwN2RiMSwgTCJHdW5nc3VoQ2hlIiwNCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyxBUiAiDQorICAgICBMIlBMIFVNaW5nIFRXIE1CRSxBcmlhbCBVbmljb2RlIE1TLEhlaXRpIFRDLFNURmFuZ3NvbmciLA0KKyAgICAgMSwgMTI1Mn0sDQorICAgIHsweGEwYmNmNmExLCBMIkxhdGluV2lkZSIsIEwiWmFwZmlubyxBcmlhbCBCbGFjayxTVEhlaXRpIiwgMiwgMTI1Mn0sDQorICAgIHsweGExNDI5YjM2LCBMIlN5bWJvbCIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDYsIDQyfSwNCisgICAgezB4YTFmYTVhYmMsIEwiV2luZ2RpbmdzMiIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDYsIDQyfSwNCisgICAgezB4YTFmYTVhYmQsIEwiV2luZ2RpbmdzMyIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDYsIDQyfSwNCisgICAgezB4YTQyN2JhZDQsIEwiSW5mb3JtYWxSb21hbi1SZWd1bGFyIiwNCisgICAgIEwiU1RJWE5vblVuaWNvZGUsQXJpYWwgTmFycm93LEF2ZW5pciBOZXh0IENvbmRlbnNlZCBEZW1pIEJvbGQiLCA4LCAxMjUyfSwNCisgICAgezB4YThiOTJlY2UsIEwiRlpTVEstLUdCSzEtMCIsIEwiU1RIZWl0aSxIZWl0aSBUQyxTVEZhbmdzb25nIiwgMCwgOTM2fSwNCisgICAgezB4YThkODNlY2UsIEwiQ2FsaWZvcm5pYW5GQiIsDQorICAgICBMIkFtZXJpY2FuIFR5cGV3cml0ZXIsQXZlbmlyIE5leHQgQ29uZGVuc2VkLEltcGFjdCIsIDIsIDEyNTJ9LA0KKyAgICB7MHhhYTNlMDgyYywgTCJLaW5nc29mdC1QaG9uZXRpYyIsDQorICAgICBMIlNUSVhWYXJpYW50cyxTVElYU2l6ZU9uZVN5bSxBcHBsZSBCcmFpbGxlIiwgMCwgMTI1Mn0sDQorICAgIHsweGFhNmJjYWJlLCBMIkhhcmxvd1NvbGlkSXRhbGljIiwNCisgICAgIEwiU1RJWE5vblVuaWNvZGUsQXZlbmlyIE1lZGl1bSxBdmVuaXIgTmV4dCBNZWRpdW0sQXJpYWwgVW5pY29kZSBNUyIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4YWRlNTMzN2MsIEwiTVNVSUdvdGhpYyIsIEwiQXJpYWwgVW5pY29kZSBNUyxBcHBsZSBTRCBHb3RoaWMgTmVvIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHhiMDhkZDk0MSwgTCJXaWRlTGF0aW4iLA0KKyAgICAgTCJNYXJpb24sUGFweXJ1cyxOYW51bSBQZW4gU2NyaXB0LFphcGYgRGluZ2JhdHMsRGFtYXNjdXMsWmFwZmlubyxBcmlhbCAiDQorICAgICBMIkJsYWNrLFNUSGVpdGkiLA0KKyAgICAgMiwgMTI1Mn0sDQorICAgIHsweGIxMjc2NWUwLCBMIklUQ0xlZ2FjeVNhbnNTdGRCb29rIiwNCisgICAgIEwiTGFzdFJlc29ydCwuSGVsdmV0aWNhIE5ldWUgRGVzayBVSSxBcmlhbCBVbmljb2RlIE1TLFBhbGF0aW5vIiwgMCwgMTI1Mn0sDQorICAgIHsweGIyMDdmMDVkLCBMIlBvb3JSaWNoYXJkIiwgTCJOb3Rld29ydGh5LEF2ZW5pciBOZXh0IENvbmRlbnNlZCxJbXBhY3QiLCAyLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweGIzYmM0OTJmLCBMIkp1aWNlSVRDLVJlZ3VsYXIiLCBMIk5hZGVlbSxBbCBCYXlhbixTVElYTm9uVW5pY29kZSIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4YjU1NDUzOTksIEwiTWFybGV0dCIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDQsIDQyfSwNCisgICAgezB4YjVkZDFlYmIsIEwiQnJpdGFubmljQm9sZCIsDQorICAgICBMIkRhbWFzY3VzLFNUSVhOb25Vbmljb2RlLEF2ZW5pciBOZXh0IENvbmRlbnNlZCBIZWF2eSxQVCBTYW5zIiwgMCwgMTI1Mn0sDQorICAgIHsweGI2OTljMWM1LCBMIkx1Y2lkYUNhbGxpZ3JhcGh5LUl0YWxpYyIsIEwiU1RIZWl0aSxBcmlhbCBCbGFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhiNzI1ZDYyOSwgTCJUaW1lc05ld1JvbWFuIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMiwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHhiN2VhZWJlYiwgTCJBZG9iZUhlaXRpU3RkUiIsIEwiSGVpdGkgVEMsU1RIZWl0aSIsIDAsIDkzNn0sDQorICAgIHsweGJkMjljNDg2LCBMIkJlcmxpblNhbnNGQkRlbWktQm9sZCIsDQorICAgICBMIkFtZXJpY2FuIFR5cGV3cml0ZXIsQXZlbmlyIE5leHQgQ29uZGVuc2VkIEhlYXZ5IiwgMCwgMTI1Mn0sDQorICAgIHsweGJlOGE4ZGI0LCBMIkJvb2tzaGVsZlN5bWJvbFNldmVuIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhjMTZjMDExOCwgTCJBZG9iZUhlYnJldyIsDQorICAgICBMIi5IZWx2ZXRpY2EgTmV1ZSBEZXNrIFVJLFBhbGF0aW5vLEFtZXJpY2FuIFR5cGV3cml0ZXIiLCAwLCAxMjUyfSwNCisgICAgezB4YzMxOGIwYWYsIEwiTXlyaWFkUHJvTGlnaHQiLCBMIlBhbGF0aW5vLEJhc2tlcnZpbGxlLE1hcmlvbiIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjNjVlNTY1OSwgTCJDYW1icmlhTWF0aCIsIEwiQXJpYWwgVW5pY29kZSBNUyIsIDIsIDEyNTJ9LA0KKyAgICB7MHhjNzVjOGYwNSwgTCJMdWNpZGFDb25zb2xlIiwgTCJDb3VyaWVyIE5ldyxNZW5sbyxBbmRhbGUgTW9ubyIsIDEsIDEyNTJ9LA0KKyAgICB7MHhjYTdjMzVkNiwgTCJDYWxpYnJpIiwgTCJBcHBsZSBTeW1ib2xzLEhlYWRMaW5lQSIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjYjA1M2Y1MywgTCJNaWNyb3NvZnRZYUhlaSIsIEwiQXJpYWwgVW5pY29kZSBNUyIsIDAsIDkzNn0sDQorICAgIHsweGNiNzE5MGY5LCBMIk1hZ25ldG8tQm9sZCIsIEwiTHVjaWRhIEdyYW5kZSIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjY2EwMGNjNSwgTCJTeXN0ZW0iLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLCAxMjUyfSwNCisgICAgezB4Y2NhZDZmNzYsIEwiSm9rZXJtYW4tUmVndWxhciIsIEwiTHVjaWRhIEdyYW5kZSIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjY2M1ODE4YywgTCJFdXJvU2lnbiIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjZjNkNzIzNCwgTCJMdWNpZGFIYW5kd3JpdGluZy1JdGFsaWMiLA0KKyAgICAgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMCwgMTI1Mn0sDQorICAgIHsweGNmN2I4ZmRiLCBMIk1pbmlvblBybyIsDQorICAgICBMIkJlbGwgTVQsQ29yYmVsLFRpbWVzIE5ldyBSb21hbixDYW1icmlhLEJlcmxpbiBTYW5zIEZCIiwgMCwgMTI1Mn0sDQorICAgIHsweGNmZTU3NTVmLCBMIlNpbWhlaSIsIEwiU1RIZWl0aSxIZWl0aSBUQyxTVEZhbmdzb25nIiwgMSwgOTM2fSwNCisgICAgezB4ZDAxMWY0ZWUsIEwiTVNQR290aGljIiwgTCJBcmlhbCBVbmljb2RlIE1TLEFwcGxlIFNEIEdvdGhpYyBOZW8iLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweGQwNjBlN2VmLCBMIlZpdmFsZGkiLA0KKyAgICAgTCJTVElYTm9uVW5pY29kZSxBcmlhbCBVbmljb2RlIE1TLEF2ZW5pciBNZWRpdW0sQXZlbmlyIE5leHQgTWVkaXVtIiwgOCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHhkMDdlZGVjMSwgTCJGcmFua2xpbkdvdGhpYy1NZWRpdW0iLCBMIkltcGFjdCxBcmlhbCBOYXJyb3ciLCAwLCAxMjUyfSwNCisgICAgezB4ZDEwNzI0M2YsIEwiU2ltU3VuIiwgTCJTVEhlaXRpLEhlaXRpIFRDLFNURmFuZ3NvbmciLCAwLCA5MzZ9LA0KKyAgICB7MHhkMTg4MTU2MiwgTCJBcmlhbE5hcnJvdyIsIEwiUFQgU2FucyBOYXJyb3csQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LA0KKyAgICB7MHhkMjJiN2RjZSwgTCJCb2RvbmlNVFBvc3RlckNvbXByZXNzZWQiLA0KKyAgICAgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMCwgMTI1Mn0sDQorICAgIHsweGQyMmJmYTYwLCBMIkNvbWljU2Fuc01TIiwNCisgICAgIEwiRGFtYXNjdXMsR2VvcmdpYSwuSGVsdmV0aWNhIE5ldWUgRGVzayBVSSxMdWNpZGEgR3JhbmRlLEFyaWFsIFVuaWNvZGUgTVMiLA0KKyAgICAgOCwgMTI1Mn0sDQorICAgIHsweGQzYmQwZTM1LCBMIkJhdWhhdXM5MyIsDQorICAgICBMIlNUSVhOb25Vbmljb2RlLEFyaWFsIFVuaWNvZGUgTVMsQXZlbmlyIE5leHQsQXZlbmlyIiwgMCwgMTI1Mn0sDQorICAgIHsweGQ0MjllZTdhLCBMIlNURmFuZ3NvbmciLCBMIlNvbmd0aSBTQyxBcmlhbCBVbmljb2RlIE1TIiwgMCwgOTM2fSwNCisgICAgezB4ZDY2NzljMTIsIEwiQmVybmFyZE1UQ29uZGVuc2VkIiwNCisgICAgIEwiSW1wYWN0LEF2ZW5pciBOZXh0IENvbmRlbnNlZCBEZW1pIEJvbGQiLCAwLCAxMjUyfSwNCisgICAgezB4ZDhlOGEwMjcsIEwiTHVjaWRhU2FucyIsDQorICAgICBMIkFyaWFsIE5hcnJvdyxLaG1lciBNTixLb2tvbm9yLERhbWFzY3VzLE1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlICINCisgICAgIEwiU3ltYm9scyIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4ZDlmZTc3NjEsIEwiSGlnaFRvd2VyVGV4dC1SZWciLA0KKyAgICAgTCJTVElYR2VuZXJhbCwuSGVsdmV0aWNhIE5ldWUgRGVzayBVSSxUcmVidWNoZXQgTVMiLCAyLCAxMjUyfSwNCisgICAgezB4ZGE3ZTU1MWUsIEwiU1RTb25nIiwgTCJBcmlhbCBVbmljb2RlIE1TIiwgMCwgOTM2fSwNCisgICAgezB4ZGFhNjg0MmQsIEwiU1RaaG9uZ3NvbmciLCBMIlNURmFuZ3NvbmcsU29uZ3RpIFNDLFNUU29uZyIsIDAsIDkzNn0sDQorICAgIHsweGRhYWFiOTNmLCBMIlNURmFuZ3NvbmciLCBMIlNvbmd0aSBTQyxBcmlhbCBVbmljb2RlIE1TIiwgMCwgOTM2fSwNCisgICAgezB4ZGFlYjA3MTMsIEwiU1RTb25nIiwgTCJTb25ndGkgU0MsQXJpYWwgVW5pY29kZSBNUyIsIDAsIDkzNn0sDQorICAgIHsweGRhZmVkYmVmLCBMIlNUQ2FpeXVuIiwgTCJLYWl0aSBTQyxTb25ndGkgU0MsU1RIZWl0aSIsIDAsIDkzNn0sDQorICAgIHsweGRiMDBhM2Q5LCBMIkJyb2Fkd2F5IiwNCisgICAgIEwiUGFweXJ1cyxTVElYTm9uVW5pY29kZSxBcmlhbCBCbGFjayxBdmVuaXIgTmV4dCBIZWF2eSxIZWl0aSBUQyIsIDAsIDEyNTJ9LA0KKyAgICB7MHhkYjFmNWFkNCwgTCJTVFhpbndlaSIsIEwiS2FpdGkgU0MsU29uZ3RpIFNDLFNUSGVpdGkiLCAwLCA5MzZ9LA0KKyAgICB7MHhkYjMyNmU3ZiwgTCJTVEthaXRpIiwgTCJTb25ndGkgU0MsQXJpYWwgVW5pY29kZSBNUyIsIDAsIDkzNn0sDQorICAgIHsweGRiNjk1OTVhLCBMIlNUSHVwbyIsIEwiS2FpdGkgU0MsU29uZ3RpIFNDLFNUSGVpdGkiLCAwLCA5MzZ9LA0KKyAgICB7MHhkYmEwMDgyYywgTCJTVFhpaGVpIiwgTCJTb25ndGkgU0MsQXJpYWwgVW5pY29kZSBNUyIsIDAsIDkzNn0sDQorICAgIHsweGRiZDBhYjE4LCBMIlNUWGluZ2thaSIsIEwiS2FpdGkgU0MsU29uZ3RpIFNDIiwgMCwgOTM2fSwNCisgICAgezB4ZGMxYTdkYjEsIEwiU1RMaXRpIiwgTCJLYWl0aSBTQyxTb25ndGkgU0MiLCAwLCA5MzZ9LA0KKyAgICB7MHhkYzMzMDc1ZiwgTCJLcmlzdGVuSVRDLVJlZ3VsYXIiLA0KKyAgICAgTCJTVElYTm9uVW5pY29kZSxEYW1hc2N1cyxTb25ndGkgU0MsU1RTb25nIiwgOCwgMTI1Mn0sDQorICAgIHsweGRjYzcwMDljLCBMIkhhcnJpbmd0b24iLA0KKyAgICAgTCJTVElYTm9uVW5pY29kZSxBdmVuaXIgTmV4dCBDb25kZW5zZWQgSGVhdnksTm90ZXdvcnRoeSIsIDAsIDEyNTJ9LA0KKyAgICB7MHhkZDcxMjQ2NiwgTCJBcmlhbEJsYWNrIiwgTCJHZWV6YSBQcm8sRGFtYXNjdXMsU29uZ3RpIFNDLFNUU29uZyIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4ZGRlODdiM2UsIEwiSW1wYWN0IiwgTCJBcmlhbCBOYXJyb3csTWFyaW9uIiwgMCwgMTI1Mn0sDQorICAgIHsweGRmNjlmYjMyLCBMIlNuYXBJVEMiLA0KKyAgICAgTCJBcmlhbCBOYXJyb3csUFQgU2FucyBOYXJyb3csTWFyaW9uLFNUSGVpdGksQXJpYWwgQmxhY2siLCAwLCAxMjUyfSwNCisgICAgezB4ZGY4YjI1ZTgsIEwiQ2VudHVyeUdvdGhpYyIsDQorICAgICBMIkRhbWFzY3VzLEFuZGFsZSBNb25vLFNvbmd0aSBTQyxBcmlhbCBVbmljb2RlIE1TIiwgMCwgMTI1Mn0sDQorICAgIHsweGUwZjcwNWMwLCBMIktyaXN0ZW5JVEMiLCBMIlNvbmd0aSBTQyxTVFNvbmciLCA4LCAxMjUyfSwNCisgICAgezB4ZTE0Mjc1NzMsIEwiUmFhdmkiLA0KKyAgICAgTCJEYW1hc2N1cyxTVElYTm9uVW5pY29kZSxNYXJpb24sUGFweXJ1cyxBdmVuaXIgTmV4dCBDb25kZW5zZWQgIg0KKyAgICAgTCJIZWF2eSxBbWVyaWNhbiBUeXBld3JpdGVyIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhlMmNlYTBjYiwgTCJNYWduZXRvIiwNCisgICAgIEwiU1RJWE5vblVuaWNvZGUsRGFtYXNjdXMsR2VlemEgUHJvLEx1Y2lkYSBHcmFuZGUsR2VvcmdpYSxIZWl0aSBUQyIsIDAsDQorICAgICAxMjUyfSwNCisgICAgezB4ZTM2YTllMTcsIEwiUmF2aWUiLCBMIlNUSGVpdGksQXJpYWwgQmxhY2siLCAwLCAxMjUyfSwNCisgICAgezB4ZTQzM2Y4ZTIsIEwiUGFyY2htZW50IiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgOCwgMTI1Mn0sDQorICAgIHsweGU0M2RmZjRhLCBMIldpbmdkaW5ncyIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDQsIDQyfSwNCisgICAgezB4ZTRlMmM0MDUsIEwiTVRFeHRyYSIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDYsIDQyfSwNCisgICAgezB4ZTYxOGNjMzUsIEwiSW5mb3JtYWxSb21hbiIsIEwiQXJpYWwgTmFycm93IiwgOCwgMTI1Mn0sDQorICAgIHsweGU2YzI3ZmZjLCBMIk1pc3RyYWwiLCBMIkFwcGxlIFN5bWJvbHMiLCA4LCAxMjUyfSwNCisgICAgezB4ZTdlYmY0YjksIEwiQ291cmllciIsIEwiQ291cmllciBOZXciLCAwLCAxMjUyfSwNCisgICAgezB4ZThiYzRhOWQsIEwiTVNSZWZlcmVuY2VTcGVjaWFsdHkiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGU5MGZiMDEzLCBMIlRlbXB1c1NhbnNJVEMiLA0KKyAgICAgTCJTVElYTm9uVW5pY29kZSxNaWNyb3NvZnQgU2FucyBTZXJpZixBdmVuaXIgTGlnaHQiLCAwLCAxMjUyfSwNCisgICAgezB4ZWM2MzdiNDIsIEwiQ29uc29sYXMiLA0KKyAgICAgTCJBUiBQTCBVS2FpIENOLEFSIFBMIFVLYWkgSEssQVIgUEwgVUthaSBUVyxBUiBQTCBVS2FpIFRXIE1CRSxBUiBQTCBVTWluZyAiDQorICAgICBMIkNOLEFSIFBMIFVNaW5nIEhLLE1pY3Jvc29mdCBTYW5zIFNlcmlmLFRhaG9tYSIsDQorICAgICAxLCAxMjUyfSwNCisgICAgezB4ZWQzYTY4M2IsIEwiU1RYaW53ZWkiLCBMIkthaXRpIFNDLFNvbmd0aSBTQywiLCAwLCA5MzZ9LA0KKyAgICB7MHhlZjI2NGNkMSwgTCJMdWNpZGFIYW5kd3JpdGluZyIsDQorICAgICBMIkFyaWFsIE5hcnJvdyxBdmVuaXIgTmV4dCBDb25kZW5zZWQgRGVtaSBCb2xkLEF2ZW5pciBOZXh0ICINCisgICAgIEwiQ29uZGVuc2VkLEF2ZW5pciBOZXh0IENvbmRlbnNlZCBNZWRpdW0sU1RIZWl0aSxBcmlhbCBCbGFjayIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4ZjA4NmJjYTIsIEwiQmFza2VydmlsbGVPbGRGYWNlIiwNCisgICAgIEwiU1RJWE5vblVuaWNvZGUsQXZlbmlyIE5leHQgQ29uZGVuc2VkIEhlYXZ5LFBUIFNhbnMiLCAwLCAxMjUyfSwNCisgICAgezB4ZjEwMjgwMzAsIEwiTWFuZ2FsIiwNCisgICAgIEwiQXJpYWwgVW5pY29kZSBNUyxNaWNyb3NvZnQgU2FucyBTZXJpZixBcmlhbCBOYXJyb3csVGFob21hIiwgMiwgMTI1Mn0sDQorICAgIHsweGYxZGE3ZWI5LCBMIlNob3djYXJkR290aGljIiwNCisgICAgIEwiUGFweXJ1cyxBcmlhbCBVbmljb2RlIE1TLEdlb3JnaWEsQW1lcmljYW4gVHlwZXdyaXRlciIsIDAsIDEyNTJ9LA0KKyAgICB7MHhmMjEwZjA2YSwgTCJBcmlhbE1UIiwNCisgICAgIEwiQXJpYWwgVW5pY29kZSBNUyxBcmlhbCBOYXJyb3csU1RJWE5vblVuaWNvZGUsRGFtYXNjdXMsQXZlbmlyIE5leHQgIg0KKyAgICAgTCJDb25kZW5zZWQgRGVtaSBCb2xkLEF2ZW5pciBOZXh0IENvbmRlbnNlZCBNZWRpdW0sQXZlbmlyIE5leHQgQ29uZGVuc2VkIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhmNDc3ZjE2YSwgTCJMYXRoYSIsDQorICAgICBMIkFyaWFsIE5hcnJvdyxEYW1hc2N1cyxTVElYTm9uVW5pY29kZSxBbWVyaWNhbiBUeXBld3JpdGVyIiwgMCwgMTI1Mn0sDQorICAgIHsweGY2MTZmM2RkLCBMIkxpU3UiLCBMIlNUSGVpdGksSGVpdGkgVEMsU1RGYW5nc29uZyIsIDEsIDkzNn0sDQorICAgIHsweGZhNDc5YWE2LCBMIk1pY3Jvc29mdFlhSGVpIiwgTCJBcmlhbCBVbmljb2RlIE1TIiwgMCwgOTM2fSwNCisgICAgezB4ZmNkMTk2OTcsIEwiQm9va21hbk9sZFN0eWxlIiwNCisgICAgIEwiR2VlemEgUHJvLERhbWFzY3VzLEFuZGFsZSBNb25vLFNvbmd0aSBTQyxBcmlhbCBVbmljb2RlIE1TIiwgMCwgMTI1Mn0sDQorICAgIHsweGZlMjA5YTgyLCBMIkx1Y2lkYUNhbGxpZ3JhcGh5IiwNCisgICAgIEwiS29rb25vcixEYW1hc2N1cyxTVElYTm9uVW5pY29kZSxTVEhlaXRpLEFyaWFsIEJsYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweGZlZjEzNWY4LCBMIkFkb2JlSGVpdGlTdGQtUmVndWxhciIsIEwiSGVpdGkgVEMsU1RIZWl0aSIsIDAsIDkzNn0sDQorfTsNCisjZWxpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FORFJPSURfDQorc3RhdGljIGNvbnN0IFhGQV9GT05USU5GTyBnX1hGQUZvbnRzTWFwW10gPSB7DQorICAgIHsweDAxZDVkMzNlLCBMIlNpbVN1biIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweDAxZTRmMTAyLCBMIllvdVl1YW4iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCA5MzZ9LA0KKyAgICB7MHgwMzA1NDlkYywgTCJMaVN1IiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMSwgOTM2fSwNCisgICAgezB4MDMyZWRkNDQsIEwiU2ltaGVpIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMSwgOTM2fSwNCisgICAgezB4MDNlYWM2ZmMsIEwiUG9vclJpY2hhcmQtUmVndWxhciIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayxEcm9pZCBBcmFiaWMgIg0KKyAgICAgTCJOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljIiwNCisgICAgIDIsIDEyNTJ9LA0KKyAgICB7MHgwM2VkOTBlNiwgTCJOaW5hIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDA3N2I1NmIzLCBMIktpbmdzb2Z0UGhvbmV0aWNQbGFpbiIsDQorICAgICBMIkRyb2lkIFNhbnMgVGhhaSxEcm9pZCBTYW5zIEFybWVuaWFuLERyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zICINCisgICAgIEwiRXRoaW9waWMsRHJvaWQgU2FucyBGYWxsYmFjayIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4MDc4ZWQ1MjQsIEwiTWljcm9zb2Z0U2Fuc1NlcmlmIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDA4OWIxOGE5LCBMIkFyaWFsIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDBiMmNhZDcyLCBMIk1vbm90eXBlQ29yc2l2YSIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDgsIDEyNTJ9LA0KKyAgICB7MHgwYmIwMDNlNywgTCJLYXJ0aWthIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgIg0KKyAgICAgTCJNb25vIiwNCisgICAgIDIsIDEyNTJ9LA0KKyAgICB7MHgwYmI0NjlkZiwgTCJWaW5lckhhbmRJVEMiLA0KKyAgICAgTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCA4LCAxMjUyfSwNCisgICAgezB4MGJjMWE4NTEsIEwiU2Vnb2VVSSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHgwYzExMmViZCwgTCJLb3p1a2FHb3RoaWNQcm8tVklNIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDBjZmNiOWMxLCBMIkFkb2JlVGhhaSIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDg0N30sDQorICAgIHsweDBlN2RlMGY5LCBMIlBsYXliaWxsIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgIg0KKyAgICAgTCJNb25vIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHgwZWZmNDdjMywgTCJTVEh1cG8iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LA0KKyAgICB7MHgxMDdhZDM3NCwgTCJDb25zdGFudGlhIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sDQorICAgIHsweDEyMTk0YzJkLCBMIkt1bnN0bGVyU2NyaXB0IiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgOCwgMTI1Mn0sDQorICAgIHsweDEzNWVmNmExLCBMIk1pbmlvblByb1NtQmQiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4MTU4YzQwNDksIEwiR2FyYW1vbmQiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAyLCAxMjUyfSwNCisgICAgezB4MTYwZWNiMjQsIEwiU1RaaG9uZ3NvbmciLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LA0KKyAgICB7MHgxNjFlZDA3ZSwgTCJNU0dvdGhpYyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDEsIDEyNTJ9LA0KKyAgICB7MHgxNzFkMWVkMSwgTCJTbmFwSVRDLVJlZ3VsYXIiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4MThkMTE4OGYsIEwiQ2FtYnJpYSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LA0KKyAgICB7MHgxOGVhZjM1MCwgTCJBcmlhbFVuaWNvZGVNUyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweDFhOTJkMTE1LCBMIk1pbmdMaVUiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCAxMjUyfSwNCisgICAgezB4MWNjMjE3YzYsIEwiVHJlYnVjaGV0TVMiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4MWQ2NDk1OTYsIEwiQmFzZW1pY1RpbWVzIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDFlMzRlZTYwLCBMIkJlbGxNVCIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LA0KKyAgICB7MHgxZWIzNjk0NSwgTCJDb29wZXJCbGFjayIsDQorICAgICBMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LA0KKyAgICB7MHgxZWY3Nzg3ZCwgTCJCYXRhbmdDaGUiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCAxMjUyfSwNCisgICAgezB4MjBiM2JkM2EsIEwiQnJ1c2hTY3JpcHRNVCIsIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMiLCA4LA0KKyAgICAgMTI1Mn0sDQorICAgIHsweDIyMDg3N2FhLCBMIkNhbmRhcmEiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4MjIxMzUwMDcsIEwiRnJlZXN0eWxlU2NyaXB0LVJlZ3VsYXIiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCA4LCAxMjUyfSwNCisgICAgezB4MjUxMDU5YzMsIEwiQ2hpbGxlciIsDQorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLFJvYm90byxEcm9pZCBTZXJpZiIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyNWJlZDZkZCwgTCJNU1JlZmVyZW5jZVNhbnNTZXJpZiIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyODE1NGM4MSwgTCJQYXJjaG1lbnQtUmVndWxhciIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDgsIDEyNTJ9LA0KKyAgICB7MHgyOTcxMWViOSwgTCJTVExpdGkiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LA0KKyAgICB7MHgyYjE5OTNiNCwgTCJCYXNlbWljIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDJiMzE2MzM5LCBMIk5pYWdhcmFTb2xpZC1SZWciLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4MmMxNDc1MjksIEwiRm9vdGxpZ2h0TVRMaWdodCIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyYzE5ODkyOCwgTCJIYXJsb3dTb2xpZCIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyYzZhYzZiMiwgTCJMdWNpZGFCcmlnaHQiLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8iLCAyLCAxMjUyfSwNCisgICAgezB4MmM5ZjM4ZTIsIEwiS296dWthTWluY2hvUHJvLVZJUiIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHgyZDVhNDdiMCwgTCJTVENhaXl1biIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweDJkZWYyNmJmLCBMIkJlcm5hcmRNVC1Db25kZW5zZWQiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4MmZkODkzMGIsIEwiS296dWthTWluY2hvUHI2TlIiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4MzExNTUyNWEsIEwiRmFuZ1NvbmdfR0IyMzEyIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDMxMzI3ODE3LCBMIk15cmlhZFBybyIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzMjI0NDk3NSwgTCJIZWx2ZXRpY2EiLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8iLCAwLCAxMjUyfSwNCisgICAgezB4MzJhYzk5NWMsIEwiVGVybWluYWwiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4MzM4ZDY0OGEsIEwiTmlhZ2FyYUVuZ3JhdmVkLVJlZyIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzM2JiNjVmMiwgTCJTeWxmYWVuIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sDQorICAgIHsweDM0MDJjMzBlLCBMIk1TUE1pbmNobyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LA0KKyAgICB7MHgzNDEyYmYzMSwgTCJTaW1TdW4tUFVBIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwNCisgICAgezB4MzZlYjM5YjksIEwiQmVybGluU2Fuc0ZCIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDM2ZjQyMDU1LCBMIlVuaXZlcnNBVFQiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmIiwgMCwgMTI1Mn0sDQorICAgIHsweDM4NjRjNGY2LCBMIkhpZ2hUb3dlclRleHQiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAyLCAxMjUyfSwNCisgICAgezB4M2EyNTdkMDMsIEwiRmFuZ1NvbmdfR0IyMzEyIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDNjZGFlNjY4LCBMIkZyZWVzdHlsZVNjcmlwdCIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDgsIDEyNTJ9LA0KKyAgICB7MHgzZDU1YWVkNywgTCJKb2tlcm1hbiIsDQorICAgICBMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHgzZDViNDM4NSwgTCJQTWluZ0xpVSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LA0KKyAgICB7MHgzZDliNzY2OSwgTCJFc3RyYW5nZWxvRWRlc3NhIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDNlNTMyZDc0LCBMIkZyYW5rbGluR290aGljTWVkaXVtIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDNlNmFhMzJkLCBMIk5TaW1TdW4iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCA5MzZ9LA0KKyAgICB7MHgzZjZjMzZhOCwgTCJHYXV0YW1pIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgIg0KKyAgICAgTCJNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDNmZjMyNjYyLCBMIkNoaWxsZXItUmVndWxhciIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHg0MDlkZTMxMiwgTCJNb2Rlcm5Oby4yMCIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LA0KKyAgICB7MHg0MTQ0M2M1ZSwgTCJHZW9yZ2lhIiwNCisgICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sDQorICAgIHsweDQxNjBhZGU1LCBMIkJlbGxHb3RoaWNTdGRCbGFjayIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHg0MjE5NzZjNCwgTCJNb2Rlcm4tUmVndWxhciIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LA0KKyAgICB7MHg0MjJhNzI1MiwgTCJTdGVuY2lsIiwNCisgICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDQyYzg1NTRmLCBMIkZpeGVkc3lzIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDQzNWNiNDFkLCBMIlJvbWFuIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDQ3ODgyMzgzLCBMIkNvdXJpZXJOZXciLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCAxMjUyfSwNCisgICAgezB4NDgwYTIzMzgsIEwiQmVybGluU2Fuc0ZCRGVtaSIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHg0ODBiZjdhNCwgTCJDb3VyaWVyU3RkIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDQ4MWFkNmVkLCBMIlZsYWRpbWlyU2NyaXB0IiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgOCwgMTI1Mn0sDQorICAgIHsweDQ5MTE1NzdhLCBMIllvdVl1YW4iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCA5MzZ9LA0KKyAgICB7MHg0YTc4OGQ3MiwgTCJTVFhpbmdrYWkiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LA0KKyAgICB7MHg0YmY4ODU2NiwgTCJTZWdvZUNvbmRlbnNlZCIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHg0Y2NmNTFhNCwgTCJCZXJsaW5TYW5zRkItUmVnIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDRlYTk2N2NlLCBMIkd1bGltQ2hlIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMSwgMTI1Mn0sDQorICAgIHsweDRmNjhiZDc5LCBMIkxldHRlckdvdGhpY1N0ZCIsDQorICAgICBMIkRyb2lkIFNhbnMgTW9ubyxEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTYW5zICINCisgICAgIEwiTW9ubyxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIEZhbGxiYWNrIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg1MWEwZDBlNiwgTCJLb3p1a2FHb3RoaWNQcjZOTSIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHg1MzFiM2RlYSwgTCJCYXNlbWljU3ltYm9sIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDUzMzNmZDM5LCBMIkNhbGlmb3JuaWFuRkItUmVnIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sDQorICAgIHsweDUzNTYxYTU0LCBMIkZaWVRLLS1HQksxLTAiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LA0KKyAgICB7MHg1NWUwZGRlNiwgTCJMdWNpZGFTYW5zVHlwZXdyaXRlciIsDQorICAgICBMIkRyb2lkIFNhbnMgTW9ubyxEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyIsIDAsIDEyNTJ9LA0KKyAgICB7MHg1NzRkNGQzZCwgTCJBZG9iZUFyYWJpYyIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHg1NzkyZTc1OSwgTCJTVEthaXRpIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwNCisgICAgezB4NTkyMTk3OGUsIEwiTHVjaWRhU2Fuc1VuaWNvZGUiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4NTk0ZTJkYTQsIEwiVnJpbmRhIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgIg0KKyAgICAgTCJNb25vIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg1OWJhYTlhMiwgTCJLYWlUaV9HQjIzMTIiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4NWNmZWRmNGYsIEwiQmFza09sZEZhY2UiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4NWY5NzkyMWMsIEwiQWRvYmVNeXVuZ2pvU3RkTSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweDVmZWZiZmFkLCBMIkJhdGFuZyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LA0KKyAgICB7MHg2MDUzNDJiOSwgTCJEb3R1bUNoZSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDEsIDEyNTJ9LA0KKyAgICB7MHg2MDhjNWY5YSwgTCJLYWlUaV9HQjIzMTIiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LA0KKyAgICB7MHg2MWVmZDBkMSwgTCJNYXR1cmFNVFNjcmlwdENhcGl0YWxzIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgIg0KKyAgICAgTCJNb25vIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg2MjY2MDhhOSwgTCJNVkJvbGkiLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyAiDQorICAgICBMIk1vbm8iLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDYzMDUwMWEzLCBMIlNtYWxsRm9udHMiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4NjVkMGUyYTksIEwiRlpZVEstLUdCSzEtMCIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweDY2OWYyOWUxLCBMIkZaU1RLLS1HQksxLTAiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LA0KKyAgICB7MHg2NzNhOWU1ZiwgTCJUdW5nYSIsDQorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLFJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zICINCisgICAgIEwiTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg2OTFhYTRjZSwgTCJOaWFnYXJhU29saWQiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4Njk2MjU5YjcsIEwiQ29yYmVsIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDY5NmVlOWJlLCBMIlNUWGloZWkiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LA0KKyAgICB7MHg2YzU5Y2Y2OSwgTCJEb3R1bSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHg3MDdmYTU2MSwgTCJHdW5nc3VoIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sDQorICAgIHsweDcxNDE2YmIyLCBMIlpXQWRvYmVGIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgQXJtZW5pYW4sRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTYW5zICINCisgICAgIEwiR2VvcmdpYW4sRHJvaWQgU2FucyBIZWJyZXcsRHJvaWQgU2FucyBUaGFpIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHg3MWI0MTgwMSwgTCJWZXJkYW5hIiwNCisgICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDczZjI1ZTRjLCBMIlBhbGF0aW5vTGlub3R5cGUiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4NzNmNGQxOWYsIEwiTmlhZ2FyYUVuZ3JhdmVkIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDc0MDAxNjk0LCBMIk15cmlhZFByb0JsYWNrIiwgTCJCb29rIEFudGlxdWEsQ29uc3RhbnRpYSxEb3R1bSxHZW9yZ2lhIiwgMCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHg3NGIxNGQ4ZiwgTCJIYWV0dGVuc2Nod2VpbGVyIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDc0Y2I0NGVlLCBMIk5TaW1TdW4iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCA5MzZ9LA0KKyAgICB7MHg3NmI0ZDdmZiwgTCJTaHJ1dGkiLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyAiDQorICAgICBMIk1vbm8iLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweDc4OGIzNTMzLCBMIldlYmRpbmdzIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgNiwgNDJ9LA0KKyAgICB7MHg3OTdkZGU5OSwgTCJNU1NlcmlmIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDdhMGY5ZTllLCBMIk1TTWluY2hvIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMSwgMTI1Mn0sDQorICAgIHsweDdiNDM5Y2FmLCBMIk9sZEVuZ2xpc2hUZXh0TVQiLA0KKyAgICAgTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4ODIxM2E0MzMsIEwiTHVjaWRhU2Fucy1UeXBld3JpdGVyIiwNCisgICAgIEwiRHJvaWQgU2FucyBNb25vLERyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDgyZmVjOTI5LCBMIkFkb2JlU29uZ1N0ZEwiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LA0KKyAgICB7MHg4MzU4MTgyNSwgTCJNb2Rlcm4iLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4ODM1YTI4MjMsIEwiQWxnZXJpYW4iLA0KKyAgICAgTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4ODNkYWI5ZjUsIEwiU2NyaXB0IiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDg0N2I1NmRhLCBMIlRhaG9tYSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHg4YTc4M2NiMiwgTCJTaW1TdW4tUFVBIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDhiNWNhYzBlLCBMIk9ueXgiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4OGM2YTQ5OWUsIEwiR3VsaW0iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4OGUwYWY3OTAsIEwiSnVpY2VJVEMiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4OGU4ZDQzYjIsIEwiQ2VudGF1ciIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LA0KKyAgICB7MHg4ZWU0ZGNjYSwgTCJCb29rc2hlbGZTeW1ib2w3IiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDkwNzk0ODAwLCBMIkJlbGxHb3RoaWNTdGRMaWdodCIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHg5MDliNTE2YSwgTCJDZW50dXJ5IiwNCisgICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sDQorICAgIHsweDkyYWUzNzBkLCBMIk1TT3V0bG9vayIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDQsIDQyfSwNCisgICAgezB4OTNjOWZiZjEsIEwiTHVjaWRhRmF4IiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgIg0KKyAgICAgTCJNb25vIiwNCisgICAgIDIsIDEyNTJ9LA0KKyAgICB7MHg5NTY1MDg1ZSwgTCJCb29rQW50aXF1YSIsDQorICAgICBMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LA0KKyAgICB7MHg5ODU2ZDk1ZCwgTCJBZG9iZU1pbmdTdGRMIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTQ5fSwNCisgICAgezB4OWJiYWRkNmIsIEwiQ29sb25uYU1UIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweDljYmQxNmE0LCBMIlNob3djYXJkR290aGljLVJlZyIsDQorICAgICBMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjIiwgMCwgMTI1Mn0sDQorICAgIHsweDlkNzMwMDhlLCBMIk1TU2Fuc1NlcmlmIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweGEwNjA3ZGIxLCBMIkd1bmdzdWhDaGUiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCAxMjUyfSwNCisgICAgezB4YTBiY2Y2YTEsIEwiTGF0aW5XaWRlIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sDQorICAgIHsweGExNDI5YjM2LCBMIlN5bWJvbCIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDYsIDQyfSwNCisgICAgezB4YTFmYTVhYmMsIEwiV2luZ2RpbmdzMiIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDYsIDQyfSwNCisgICAgezB4YTFmYTVhYmQsIEwiV2luZ2RpbmdzMyIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDYsIDQyfSwNCisgICAgezB4YTQyN2JhZDQsIEwiSW5mb3JtYWxSb21hbi1SZWd1bGFyIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMiLCA4LCAxMjUyfSwNCisgICAgezB4YThiOTJlY2UsIEwiRlpTVEstLUdCSzEtMCIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweGE4ZDgzZWNlLCBMIkNhbGlmb3JuaWFuRkIiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAyLCAxMjUyfSwNCisgICAgezB4YWEzZTA4MmMsIEwiS2luZ3NvZnQtUGhvbmV0aWMiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4YWE2YmNhYmUsIEwiSGFybG93U29saWRJdGFsaWMiLA0KKyAgICAgTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4YWRlNTMzN2MsIEwiTVNVSUdvdGhpYyIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhiMDhkZDk0MSwgTCJXaWRlTGF0aW4iLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyAiDQorICAgICBMIk1vbm8iLA0KKyAgICAgMiwgMTI1Mn0sDQorICAgIHsweGIyMDdmMDVkLCBMIlBvb3JSaWNoYXJkIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sDQorICAgIHsweGIzYmM0OTJmLCBMIkp1aWNlSVRDLVJlZ3VsYXIiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4YjU1NDUzOTksIEwiTWFybGV0dCIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDQsIDQyfSwNCisgICAgezB4YjVkZDFlYmIsIEwiQnJpdGFubmljQm9sZCIsIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMiLCAwLA0KKyAgICAgMTI1Mn0sDQorICAgIHsweGI2OTljMWM1LCBMIkx1Y2lkYUNhbGxpZ3JhcGh5LUl0YWxpYyIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhiNzI1ZDYyOSwgTCJUaW1lc05ld1JvbWFuIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sDQorICAgIHsweGI3ZWFlYmViLCBMIkFkb2JlSGVpdGlTdGRSIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwNCisgICAgezB4YmQyOWM0ODYsIEwiQmVybGluU2Fuc0ZCRGVtaS1Cb2xkIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweGJlOGE4ZGI0LCBMIkJvb2tzaGVsZlN5bWJvbFNldmVuIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweGMxNmMwMTE4LCBMIkFkb2JlSGVicmV3IiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrLERyb2lkIEFyYWJpYyAiDQorICAgICBMIk5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMiLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGMzMThiMGFmLCBMIk15cmlhZFByb0xpZ2h0IiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweGM2NWU1NjU5LCBMIkNhbWJyaWFNYXRoIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sDQorICAgIHsweGM3NWM4ZjA1LCBMIkx1Y2lkYUNvbnNvbGUiLA0KKyAgICAgTCJEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCAxMjUyfSwNCisgICAgezB4Y2E3YzM1ZDYsIEwiQ2FsaWJyaSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjYjA1M2Y1MywgTCJNaWNyb3NvZnRZYUhlaSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweGNiNzE5MGY5LCBMIk1hZ25ldG8tQm9sZCIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjY2EwMGNjNSwgTCJTeXN0ZW0iLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4Y2NhZDZmNzYsIEwiSm9rZXJtYW4tUmVndWxhciIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjY2M1ODE4YywgTCJFdXJvU2lnbiIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhjZjNkNzIzNCwgTCJMdWNpZGFIYW5kd3JpdGluZy1JdGFsaWMiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4Y2Y3YjhmZGIsIEwiTWluaW9uUHJvIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweGNmZTU3NTVmLCBMIlNpbWhlaSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDEsIDkzNn0sDQorICAgIHsweGQwMTFmNGVlLCBMIk1TUEdvdGhpYyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhkMDYwZTdlZiwgTCJWaXZhbGRpIiwNCisgICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgOCwgMTI1Mn0sDQorICAgIHsweGQwN2VkZWMxLCBMIkZyYW5rbGluR290aGljLU1lZGl1bSIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhkMTA3MjQzZiwgTCJTaW1TdW4iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LA0KKyAgICB7MHhkMTg4MTU2MiwgTCJBcmlhbE5hcnJvdyIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhkMjJiN2RjZSwgTCJCb2RvbmlNVFBvc3RlckNvbXByZXNzZWQiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4ZDIyYmZhNjAsIEwiQ29taWNTYW5zTVMiLCBMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgOCwNCisgICAgIDEyNTJ9LA0KKyAgICB7MHhkM2JkMGUzNSwgTCJCYXVoYXVzOTMiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4ZDQyOWVlN2EsIEwiU1RGYW5nc29uZyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweGQ2Njc5YzEyLCBMIkJlcm5hcmRNVENvbmRlbnNlZCIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhkOGU4YTAyNywgTCJMdWNpZGFTYW5zIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2VyaWYsUm9ib3RvIiwgMCwgMTI1Mn0sDQorICAgIHsweGQ5ZmU3NzYxLCBMIkhpZ2hUb3dlclRleHQtUmVnIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sDQorICAgIHsweGRhN2U1NTFlLCBMIlNUU29uZyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweGRhYTY4NDJkLCBMIlNUWmhvbmdzb25nIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwNCisgICAgezB4ZGFhYWI5M2YsIEwiU1RGYW5nc29uZyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweGRhZWIwNzEzLCBMIlNUU29uZyIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweGRhZmVkYmVmLCBMIlNUQ2FpeXVuIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwNCisgICAgezB4ZGIwMGEzZDksIEwiQnJvYWR3YXkiLA0KKyAgICAgTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4ZGIxZjVhZDQsIEwiU1RYaW53ZWkiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LA0KKyAgICB7MHhkYjMyNmU3ZiwgTCJTVEthaXRpIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwNCisgICAgezB4ZGI2OTU5NWEsIEwiU1RIdXBvIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwNCisgICAgezB4ZGJhMDA4MmMsIEwiU1RYaWhlaSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweGRiZDBhYjE4LCBMIlNUWGluZ2thaSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweGRjMWE3ZGIxLCBMIlNUTGl0aSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sDQorICAgIHsweGRjMzMwNzVmLCBMIktyaXN0ZW5JVEMtUmVndWxhciIsDQorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLERyb2lkIFNlcmlmLFJvYm90byIsIDgsIDEyNTJ9LA0KKyAgICB7MHhkY2M3MDA5YywgTCJIYXJyaW5ndG9uIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweGRkNzEyNDY2LCBMIkFyaWFsQmxhY2siLA0KKyAgICAgTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwNCisgICAgezB4ZGRlODdiM2UsIEwiSW1wYWN0IiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweGRmNjlmYjMyLCBMIlNuYXBJVEMiLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyAiDQorICAgICBMIk1vbm8iLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGRmOGIyNWU4LCBMIkNlbnR1cnlHb3RoaWMiLA0KKyAgICAgTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vIiwgMCwgMTI1Mn0sDQorICAgIHsweGUwZjcwNWMwLCBMIktyaXN0ZW5JVEMiLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8iLCA4LCAxMjUyfSwNCisgICAgezB4ZTE0Mjc1NzMsIEwiUmFhdmkiLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyAiDQorICAgICBMIk1vbm8iLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGUyY2VhMGNiLCBMIk1hZ25ldG8iLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyAiDQorICAgICBMIk1vbm8iLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGUzNmE5ZTE3LCBMIlJhdmllIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgIg0KKyAgICAgTCJNb25vIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhlNDMzZjhlMiwgTCJQYXJjaG1lbnQiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCA4LCAxMjUyfSwNCisgICAgezB4ZTQzZGZmNGEsIEwiV2luZ2RpbmdzIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgNCwgNDJ9LA0KKyAgICB7MHhlNGUyYzQwNSwgTCJNVEV4dHJhIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgNiwgNDJ9LA0KKyAgICB7MHhlNjE4Y2MzNSwgTCJJbmZvcm1hbFJvbWFuIiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmIiwgOCwgMTI1Mn0sDQorICAgIHsweGU2YzI3ZmZjLCBMIk1pc3RyYWwiLA0KKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCA4LCAxMjUyfSwNCisgICAgezB4ZTdlYmY0YjksIEwiQ291cmllciIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhlOGJjNGE5ZCwgTCJNU1JlZmVyZW5jZVNwZWNpYWx0eSIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhlOTBmYjAxMywgTCJUZW1wdXNTYW5zSVRDIiwNCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweGVjNjM3YjQyLCBMIkNvbnNvbGFzIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMSwgMTI1Mn0sDQorICAgIHsweGVkM2E2ODNiLCBMIlNUWGlud2VpIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwNCisgICAgezB4ZWYyNjRjZDEsIEwiTHVjaWRhSGFuZHdyaXRpbmciLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyAiDQorICAgICBMIk1vbm8iLA0KKyAgICAgMCwgMTI1Mn0sDQorICAgIHsweGYwODZiY2EyLCBMIkJhc2tlcnZpbGxlT2xkRmFjZSIsDQorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LA0KKyAgICB7MHhmMTAyODAzMCwgTCJNYW5nYWwiLA0KKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyAiDQorICAgICBMIk1vbm8iLA0KKyAgICAgMiwgMTI1Mn0sDQorICAgIHsweGYxZGE3ZWI5LCBMIlNob3djYXJkR290aGljIiwNCisgICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWMiLCAwLCAxMjUyfSwNCisgICAgezB4ZjIxMGYwNmEsIEwiQXJpYWxNVCIsDQorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLFJvYm90byxEcm9pZCBTZXJpZiIsIDAsIDEyNTJ9LA0KKyAgICB7MHhmNDc3ZjE2YSwgTCJMYXRoYSIsDQorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLFJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zICINCisgICAgIEwiTW9ubyIsDQorICAgICAwLCAxMjUyfSwNCisgICAgezB4ZjYxNmYzZGQsIEwiTGlTdSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDEsIDkzNn0sDQorICAgIHsweGZhNDc5YWE2LCBMIk1pY3Jvc29mdFlhSGVpIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwNCisgICAgezB4ZmNkMTk2OTcsIEwiQm9va21hbk9sZFN0eWxlIiwNCisgICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sDQorICAgIHsweGZlMjA5YTgyLCBMIkx1Y2lkYUNhbGxpZ3JhcGh5IiwNCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgIg0KKyAgICAgTCJNb25vIiwNCisgICAgIDAsIDEyNTJ9LA0KKyAgICB7MHhmZWYxMzVmOCwgTCJBZG9iZUhlaXRpU3RkLVJlZ3VsYXIiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LA0KK307DQorI2VuZGlmDQordm9pZCBYRkFfTG9jYWxGb250TmFtZVRvRW5nbGlzaE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0xvY2FsTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NFbmdsaXNoTmFtZSkgew0KKyAgd3NFbmdsaXNoTmFtZSA9IHdzTG9jYWxOYW1lOw0KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfIHx8IFwNCisgICAgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9MSU5VWF8gfHwgICBcDQorICAgIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfIHx8ICAgXA0KKyAgICBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FORFJPSURfDQorICBGWF9EV09SRCBkd0xvY2FsTmFtZUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VygNCisgICAgICB3c0xvY2FsTmFtZS5HZXRQdHIoKSwgd3NMb2NhbE5hbWUuR2V0TGVuZ3RoKCksIFRSVUUpOw0KKyAgaW50MzJfdCBpU3RhcnQgPSAwOw0KKyAgaW50MzJfdCBpRW5kID0gc2l6ZW9mKGdfWEZBRm9udHNNYXApIC8gc2l6ZW9mKFhGQV9GT05USU5GTykgLSAxOw0KKyAgaW50MzJfdCBpTWlkID0gMDsNCisgIGRvIHsNCisgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgIEZYX0RXT1JEIGR3Rm9udE5hbWVIYXNoID0gZ19YRkFGb250c01hcFtpTWlkXS5kd0ZvbnROYW1lSGFzaDsNCisgICAgaWYgKGR3Rm9udE5hbWVIYXNoID09IGR3TG9jYWxOYW1lSGFzaCkgew0KKyAgICAgIHdzRW5nbGlzaE5hbWUgPSBnX1hGQUZvbnRzTWFwW2lNaWRdLnBQc05hbWU7DQorICAgICAgYnJlYWs7DQorICAgIH0gZWxzZSBpZiAoZHdGb250TmFtZUhhc2ggPCBkd0xvY2FsTmFtZUhhc2gpIHsNCisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpRW5kID0gaU1pZCAtIDE7DQorICAgIH0NCisgIH0gd2hpbGUgKGlFbmQgPj0gaVN0YXJ0KTsNCisjZW5kaWYNCit9DQorY29uc3QgWEZBX0ZPTlRJTkZPKiBYRkFfR2V0Rm9udElORk9CeUZvbnROYW1lKA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9udE5hbWUpIHsNCisjaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXyB8fCBcDQorICAgIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fTElOVVhfIHx8ICAgXA0KKyAgICBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXyB8fCAgIFwNCisgICAgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BTkRST0lEXw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGb250TmFtZVRlbXAgPSB3c0ZvbnROYW1lOw0KKyAgd3NGb250TmFtZVRlbXAuUmVtb3ZlKEwnICcpOw0KKyAgRlhfRFdPUkQgZHdDdXJGb250TmFtZUhhc2ggPQ0KKyAgICAgIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzRm9udE5hbWVUZW1wLCB3c0ZvbnROYW1lVGVtcC5HZXRMZW5ndGgoKSwgVFJVRSk7DQorICBpbnQzMl90IGlTdGFydCA9IDA7DQorICBpbnQzMl90IGlFbmQgPSBzaXplb2YoZ19YRkFGb250c01hcCkgLyBzaXplb2YoWEZBX0ZPTlRJTkZPKSAtIDE7DQorICBpbnQzMl90IGlNaWQgPSAwOw0KKyAgY29uc3QgWEZBX0ZPTlRJTkZPKiBwRm9udEluZm8gPSBOVUxMOw0KKyAgZG8gew0KKyAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgRlhfRFdPUkQgZHdGb250TmFtZUhhc2ggPSBnX1hGQUZvbnRzTWFwW2lNaWRdLmR3Rm9udE5hbWVIYXNoOw0KKyAgICBpZiAoZHdGb250TmFtZUhhc2ggPT0gZHdDdXJGb250TmFtZUhhc2gpIHsNCisgICAgICBwRm9udEluZm8gPSAmZ19YRkFGb250c01hcFtpTWlkXTsNCisgICAgICBicmVhazsNCisgICAgfSBlbHNlIGlmIChkd0ZvbnROYW1lSGFzaCA8IGR3Q3VyRm9udE5hbWVIYXNoKSB7DQorICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgIH0gZWxzZSB7DQorICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICB9DQorICB9IHdoaWxlIChpRW5kID49IGlTdGFydCk7DQorICByZXR1cm4gcEZvbnRJbmZvOw0KKyNlbHNlDQorICByZXR1cm4gTlVMTDsNCisjZW5kaWYNCit9DQorLy8gc3RhdGljDQorSVhGQV9Gb250TWdyKiBJWEZBX0ZvbnRNZ3I6OkNyZWF0ZURlZmF1bHQoKSB7DQorICByZXR1cm4gbmV3IENYRkFfRGVmRm9udE1ncjsNCit9DQorLy8gdmlydHVhbA0KK0lYRkFfRm9udE1ncjo6fklYRkFfRm9udE1ncigpIHt9DQorQ1hGQV9EZWZGb250TWdyOjp+Q1hGQV9EZWZGb250TWdyKCkgew0KKyAgaW50MzJfdCBpQ291bnRzID0gbV9DYWNoZUZvbnRzLkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudHM7IGkrKykgew0KKyAgICAoKElGWF9Gb250KiltX0NhY2hlRm9udHNbaV0pLT5SZWxlYXNlKCk7DQorICB9DQorICBtX0NhY2hlRm9udHMuUmVtb3ZlQWxsKCk7DQorfQ0KKyNkZWZpbmUgX0ZYRkFfVVNFR0FTRk9OVE1HUl8NCitJRlhfRm9udCogQ1hGQV9EZWZGb250TWdyOjpHZXRGb250KElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZvbnRGYW1pbHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGb250TmFtZSA9IHdzRm9udEZhbWlseTsNCisgIElGWF9Gb250TWdyKiBwRkRFRm9udE1nciA9ICgoQ1hGQV9GRkRvYyopaERvYyktPkdldEFwcCgpLT5HZXRGREVGb250TWdyKCk7DQorI2lmZGVmIF9GWEZBX1VTRUdBU0ZPTlRNR1JfDQorICBjb25zdCBYRkFfRk9OVElORk8qIHBDdXJGb250ID0gTlVMTDsNCisgIEZYX0JPT0wgYkdldEZvbnRJbmZvID0gVFJVRTsNCisgIElGWF9Gb250KiBwRm9udCA9IHBGREVGb250TWdyLT5Mb2FkRm9udCgoY29uc3QgRlhfV0NIQVIqKXdzRm9udE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOw0KKyNlbHNlDQorICBjb25zdCBYRkFfRk9OVElORk8qIHBDdXJGb250ID0gWEZBX0dldEZvbnRJTkZPQnlGb250TmFtZSh3c0ZvbnROYW1lKTsNCisgIEZYX0JPT0wgYkdldEZvbnRJbmZvID0gRkFMU0U7DQorICBJRlhfRm9udCogcEZvbnQgPSBJRlhfRm9udDo6TG9hZEZvbnQoDQorICAgICAgKGNvbnN0IEZYX1dDSEFSKil3c0ZvbnROYW1lLCBkd0ZvbnRTdHlsZXMgfCBGWF9GT05UU1RZTEVfRXhhY3RNYXRjaCwNCisgICAgICBwQ3VyRm9udCA/IHBDdXJGb250LT53Q29kZVBhZ2UgOiB3Q29kZVBhZ2UsIHBGREVGb250TWdyKTsNCisjZW5kaWYNCisgIGlmICghcEZvbnQgJiYgaERvYykgew0KKyAgICBpZiAoYkdldEZvbnRJbmZvKSB7DQorICAgICAgcEN1ckZvbnQgPSBYRkFfR2V0Rm9udElORk9CeUZvbnROYW1lKHdzRm9udE5hbWUpOw0KKyAgICB9DQorICAgIGlmIChwQ3VyRm9udCAhPSBOVUxMICYmIHBDdXJGb250LT5wUmVwbGFjZUZvbnQgIT0gTlVMTCkgew0KKyAgICAgIEZYX0RXT1JEIGR3U3R5bGUgPSAwOw0KKyAgICAgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfQm9sZCkgew0KKyAgICAgICAgZHdTdHlsZSB8PSBGWF9GT05UU1RZTEVfQm9sZDsNCisgICAgICB9DQorICAgICAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9JdGFsaWMpIHsNCisgICAgICAgIGR3U3R5bGUgfD0gRlhfRk9OVFNUWUxFX0l0YWxpYzsNCisgICAgICB9DQorICAgICAgY29uc3QgRlhfV0NIQVIqIHBSZXBsYWNlID0gcEN1ckZvbnQtPnBSZXBsYWNlRm9udDsNCisgICAgICBpbnQzMl90IGlMZW5ndGggPSBGWFNZU193Y3NsZW4ocFJlcGxhY2UpOw0KKyAgICAgIHdoaWxlIChpTGVuZ3RoID4gMCkgew0KKyAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBOYW1lVGV4dCA9IHBSZXBsYWNlOw0KKyAgICAgICAgd2hpbGUgKCpwTmFtZVRleHQgIT0gTCcsJyAmJiBpTGVuZ3RoID4gMCkgew0KKyAgICAgICAgICBwTmFtZVRleHQrKzsNCisgICAgICAgICAgaUxlbmd0aC0tOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXBsYWNlID0NCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyhwUmVwbGFjZSwgcE5hbWVUZXh0IC0gcFJlcGxhY2UpOw0KKyNpZmRlZiBfRlhGQV9VU0VHQVNGT05UTUdSXw0KKyAgICAgICAgcEZvbnQgPSBwRkRFRm9udE1nci0+TG9hZEZvbnQod3NSZXBsYWNlLCBkd1N0eWxlLCB3Q29kZVBhZ2UpOw0KKyNlbHNlDQorICAgICAgICBwRm9udCA9IElGWF9Gb250OjpMb2FkRm9udCgoY29uc3QgRlhfV0NIQVIqKXdzUmVwbGFjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3U3R5bGUgfCBGWF9GT05UU1RZTEVfRXhhY3RNYXRjaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJGb250LT53Q29kZVBhZ2UsIHBGREVGb250TWdyKTsNCisjZW5kaWYNCisgICAgICAgIGlmIChwRm9udCAhPSBOVUxMKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaUxlbmd0aC0tOw0KKyAgICAgICAgcE5hbWVUZXh0Kys7DQorICAgICAgICBwUmVwbGFjZSA9IHBOYW1lVGV4dDsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmIChwRm9udCkgew0KKyAgICBtX0NhY2hlRm9udHMuQWRkKHBGb250KTsNCisgIH0NCisgIHJldHVybiBwRm9udDsNCit9DQorSUZYX0ZvbnQqIENYRkFfRGVmRm9udE1ncjo6R2V0RGVmYXVsdEZvbnQoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZvbnRGYW1pbHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlKSB7DQorICBJRlhfRm9udE1nciogcEZERUZvbnRNZ3IgPSAoKENYRkFfRkZEb2MqKWhEb2MpLT5HZXRBcHAoKS0+R2V0RkRFRm9udE1ncigpOw0KKyNpZmRlZiBfRlhGQV9VU0VHQVNGT05UTUdSXw0KKyAgSUZYX0ZvbnQqIHBGb250ID0NCisgICAgICBwRkRFRm9udE1nci0+TG9hZEZvbnQoTCJBcmlhbCBOYXJyb3ciLCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7DQorI2Vsc2UNCisgIGNvbnN0IFhGQV9GT05USU5GTyogcEN1ckZvbnQgPSBYRkFfR2V0Rm9udElORk9CeUZvbnROYW1lKHdzRm9udEZhbWlseSk7DQorICBJRlhfRm9udCogcEZvbnQgPQ0KKyAgICAgIElGWF9Gb250OjpMb2FkRm9udChMIkFyaWFsIE5hcnJvdyIsIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgcEN1ckZvbnQgPyBwQ3VyRm9udC0+d0NvZGVQYWdlIDogMTI1MiwgcEZERUZvbnRNZ3IpOw0KKyNlbmRpZg0KKyAgaWYgKCFwRm9udCkNCisjaWZkZWYgX0ZYRkFfVVNFR0FTRk9OVE1HUl8NCisgICAgcEZvbnQgPQ0KKyAgICAgICAgcEZERUZvbnRNZ3ItPkxvYWRGb250KChjb25zdCBGWF9XQ0hBUiopTlVMTCwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOw0KKyNlbHNlDQorICAgIHBGb250ID0NCisgICAgICAgIElGWF9Gb250OjpMb2FkRm9udCgoY29uc3QgRlhfV0NIQVIqKU5VTEwsIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VyRm9udCA/IHBDdXJGb250LT53Q29kZVBhZ2UgOiAxMjUyLCBwRkRFRm9udE1ncik7DQorI2VuZGlmDQorICBGWFNZU19hc3NlcnQocEZvbnQgIT0gTlVMTCk7DQorICBpZiAocEZvbnQpIHsNCisgICAgbV9DYWNoZUZvbnRzLkFkZChwRm9udCk7DQorICB9DQorICByZXR1cm4gcEZvbnQ7DQorfQ0KK3N0cnVjdCBYRkFfUERGRk9OVE5BTUUgew0KKyAgY29uc3QgRlhfQ0hBUiogbHBQc05hbWU7DQorICBjb25zdCBGWF9DSEFSKiBscE5vcm1hbDsNCisgIGNvbnN0IEZYX0NIQVIqIGxwQm9sZDsNCisgIGNvbnN0IEZYX0NIQVIqIGxwSXRhbGljOw0KKyAgY29uc3QgRlhfQ0hBUiogbHBCb2xkSXRhbGljOw0KK307DQorY29uc3QgWEZBX1BERkZPTlROQU1FIGdfWEZBUERGRm9udE5hbWVbXSA9IHsNCisgICAgeyJBZG9iZSBQSSBTdGQiLCAiQWRvYmVQSVN0ZCIsICJBZG9iZVBJU3RkIiwgIkFkb2JlUElTdGQiLCAiQWRvYmVQSVN0ZCJ9LA0KKyAgICB7Ik15cmlhZCBQcm8gTGlnaHQiLCAiTXlyaWFkUHJvLUxpZ2h0IiwgIk15cmlhZFByby1TZW1pYm9sZCIsDQorICAgICAiTXlyaWFkUHJvLUxpZ2h0SXQiLCAiTXlyaWFkUHJvLVNlbWlib2xkSXQifSwNCit9Ow0KK0NYRkFfUERGRm9udE1ncjo6Q1hGQV9QREZGb250TWdyKENYRkFfRkZEb2MqIHBEb2MpIHsNCisgIG1fcERvYyA9IHBEb2M7DQorfQ0KK0NYRkFfUERGRm9udE1ncjo6fkNYRkFfUERGRm9udE1ncigpIHsNCisgIG1fRkRFMlBERkZvbnQuUmVtb3ZlQWxsKCk7DQorICBGWF9QT1NJVElPTiBwcyA9IG1fRm9udEFycmF5LkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChwcykgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBzdHJLZXk7DQorICAgIElGWF9Gb250KiBwRm9udCA9IE5VTEw7DQorICAgIG1fRm9udEFycmF5LkdldE5leHRBc3NvYyhwcywgc3RyS2V5LCAodm9pZComKXBGb250KTsNCisgICAgaWYgKHBGb250ICE9IE5VTEwpIHsNCisgICAgICBwRm9udC0+UmVsZWFzZSgpOw0KKyAgICB9DQorICB9DQorICBtX0ZvbnRBcnJheS5SZW1vdmVBbGwoKTsNCit9DQorSUZYX0ZvbnQqIENYRkFfUERGRm9udE1ncjo6RmluZEZvbnQoQ0ZYX0J5dGVTdHJpbmcgc3RyUHNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkJvbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXRhbGljLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCoqIHBEc3RQREZGb250LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0cmljdE1hdGNoKSB7DQorICBDUERGX0RvY3VtZW50KiBwRG9jID0gbV9wRG9jLT5HZXRQREZEb2MoKTsNCisgIGlmIChwRG9jID09IE5VTEwpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDUERGX0RpY3Rpb25hcnkqIHBGb250U2V0RGljdCA9DQorICAgICAgcERvYy0+R2V0Um9vdCgpLT5HZXREaWN0KCJBY3JvRm9ybSIpLT5HZXREaWN0KCJEUiIpOw0KKyAgaWYgKCFwRm9udFNldERpY3QpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBwRm9udFNldERpY3QgPSAoQ1BERl9EaWN0aW9uYXJ5KilwRm9udFNldERpY3QtPkdldERpY3QoIkZvbnQiKTsNCisgIGlmICghcEZvbnRTZXREaWN0KSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgc3RyUHNOYW1lLlJlbW92ZSgnICcpOw0KKyAgSUZYX0ZvbnRNZ3IqIHBGREVGb250TWdyID0gbV9wRG9jLT5HZXRBcHAoKS0+R2V0RkRFRm9udE1ncigpOw0KKyAgZm9yIChjb25zdCBhdXRvJiBpdCA6ICpwRm9udFNldERpY3QpIHsNCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGtleSA9IGl0LmZpcnN0Ow0KKyAgICBDUERGX09iamVjdCogcE9iaiA9IGl0LnNlY29uZDsNCisgICAgaWYgKCFQc05hbWVNYXRjaERSRm9udE5hbWUoc3RyUHNOYW1lLCBiQm9sZCwgYkl0YWxpYywga2V5LCBiU3RyaWN0TWF0Y2gpKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgQ1BERl9PYmplY3QqIHBEaXJlY3QgPSBwT2JqLT5HZXREaXJlY3QoKTsNCisgICAgaWYgKHBEaXJlY3QgPT0gTlVMTCB8fCBwRGlyZWN0LT5HZXRUeXBlKCkgIT0gUERGT0JKX0RJQ1RJT05BUlkpIHsNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBEaXJlY3Q7DQorICAgIGlmIChwRm9udERpY3QtPkdldFN0cmluZygiVHlwZSIpICE9ICJGb250Iikgew0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIENQREZfRm9udCogcFBERkZvbnQgPSBwRG9jLT5Mb2FkRm9udChwRm9udERpY3QpOw0KKyAgICBpZiAoIXBQREZGb250KSB7DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgaWYgKCFwUERGRm9udC0+SXNFbWJlZGRlZCgpKSB7DQorICAgICAgKnBEc3RQREZGb250ID0gcFBERkZvbnQ7DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuIElGWF9Gb250OjpMb2FkRm9udCgmcFBERkZvbnQtPm1fRm9udCwgcEZERUZvbnRNZ3IpOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0lGWF9Gb250KiBDWEZBX1BERkZvbnRNZ3I6OkdldEZvbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZvbnRGYW1pbHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqKiBwUERGRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0cmljdE1hdGNoKSB7DQorICBGWF9EV09SRCBkd0hhc2hDb2RlID0NCisgICAgICBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c0ZvbnRGYW1pbHkuR2V0UHRyKCksIHdzRm9udEZhbWlseS5HZXRMZW5ndGgoKSk7DQorICBDRlhfQnl0ZVN0cmluZyBzdHJLZXk7DQorICBJRlhfRm9udCogcEZvbnQgPSBOVUxMOw0KKyAgc3RyS2V5LkZvcm1hdCgiJXUldSIsIGR3SGFzaENvZGUsIGR3Rm9udFN0eWxlcyk7DQorICBpZiAobV9Gb250QXJyYXkuTG9va3VwKHN0cktleSwgKHZvaWQqJilwRm9udCkpIHsNCisgICAgcmV0dXJuIHBGb250Ow0KKyAgfQ0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnNQc05hbWU7DQorICBic1BzTmFtZSA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh3c0ZvbnRGYW1pbHkpOw0KKyAgRlhfQk9PTCBiQm9sZCA9IChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfQm9sZCkgPT0gRlhfRk9OVFNUWUxFX0JvbGQ7DQorICBGWF9CT09MIGJJdGFsaWMgPSAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0l0YWxpYykgPT0gRlhfRk9OVFNUWUxFX0l0YWxpYzsNCisgIENGWF9CeXRlU3RyaW5nIHN0ckZvbnROYW1lID0gUHNOYW1lVG9Gb250TmFtZShic1BzTmFtZSwgYkJvbGQsIGJJdGFsaWMpOw0KKyAgcEZvbnQgPSBGaW5kRm9udChzdHJGb250TmFtZSwgYkJvbGQsIGJJdGFsaWMsIHBQREZGb250LCBiU3RyaWN0TWF0Y2gpOw0KKyAgaWYgKHBGb250KSB7DQorICAgIG1fRm9udEFycmF5LlNldEF0KHN0cktleSwgcEZvbnQpOw0KKyAgfQ0KKyAgcmV0dXJuIHBGb250Ow0KK30NCitDRlhfQnl0ZVN0cmluZyBDWEZBX1BERkZvbnRNZ3I6OlBzTmFtZVRvRm9udE5hbWUoDQorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJQc05hbWUsDQorICAgIEZYX0JPT0wgYkJvbGQsDQorICAgIEZYX0JPT0wgYkl0YWxpYykgew0KKyAgaW50MzJfdCBuQ291bnQgPSBzaXplb2YoZ19YRkFQREZGb250TmFtZSkgLyBzaXplb2YoWEZBX1BERkZPTlROQU1FKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7DQorICAgIGlmIChzdHJQc05hbWUgPT0gZ19YRkFQREZGb250TmFtZVtpXS5scFBzTmFtZSkgew0KKyAgICAgIGludDMyX3QgaW5kZXggPSAxICsgKChiSXRhbGljIDw8IDEpIHwgYkJvbGQpOw0KKyAgICAgIHJldHVybiAqKCZnX1hGQVBERkZvbnROYW1lW2ldLmxwUHNOYW1lICsgaW5kZXgpOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gc3RyUHNOYW1lOw0KK30NCitGWF9CT09MIENYRkFfUERGRm9udE1ncjo6UHNOYW1lTWF0Y2hEUkZvbnROYW1lKA0KKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUHNOYW1lLA0KKyAgICBGWF9CT09MIGJCb2xkLA0KKyAgICBGWF9CT09MIGJJdGFsaWMsDQorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic0RSRm9udE5hbWUsDQorICAgIEZYX0JPT0wgYlN0cmljdE1hdGNoKSB7DQorICBDRlhfQnl0ZVN0cmluZyBic0RSTmFtZSA9IGJzRFJGb250TmFtZTsNCisgIGJzRFJOYW1lLlJlbW92ZSgnLScpOw0KKyAgaW50MzJfdCBpUHNMZW4gPSBic1BzTmFtZS5HZXRMZW5ndGgoKTsNCisgIGludDMyX3QgbkluZGV4ID0gYnNEUk5hbWUuRmluZChic1BzTmFtZSk7DQorICBpZiAobkluZGV4ICE9IC0xICYmICFiU3RyaWN0TWF0Y2gpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBpZiAobkluZGV4ICE9IDApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaW50MzJfdCBpRGlmZmVyTGVuZ3RoID0gYnNEUk5hbWUuR2V0TGVuZ3RoKCkgLSBpUHNMZW47DQorICBpZiAoaURpZmZlckxlbmd0aCA+IDEgfHwgKGJCb2xkIHx8IGJJdGFsaWMpKSB7DQorICAgIGludDMyX3QgaUJvbGRJbmRleCA9IGJzRFJOYW1lLkZpbmQoIkJvbGQiKTsNCisgICAgRlhfQk9PTCBiQm9sZEZvbnQgPSBpQm9sZEluZGV4ID4gMDsNCisgICAgaWYgKGJCb2xkIF4gYkJvbGRGb250KSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChiQm9sZEZvbnQpIHsNCisgICAgICBpRGlmZmVyTGVuZ3RoID0NCisgICAgICAgICAgc3RkOjptaW4oaURpZmZlckxlbmd0aCAtIDQsIGJzRFJOYW1lLkdldExlbmd0aCgpIC0gaUJvbGRJbmRleCAtIDQpOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYkl0YWxpY0ZvbnQgPSBUUlVFOw0KKyAgICBpZiAoYnNEUk5hbWUuRmluZCgiSXRhbGljIikgPiAwKSB7DQorICAgICAgaURpZmZlckxlbmd0aCAtPSA2Ow0KKyAgICB9IGVsc2UgaWYgKGJzRFJOYW1lLkZpbmQoIkl0IikgPiAwKSB7DQorICAgICAgaURpZmZlckxlbmd0aCAtPSAyOw0KKyAgICB9IGVsc2UgaWYgKGJzRFJOYW1lLkZpbmQoIk9ibGlxdWUiKSA+IDApIHsNCisgICAgICBpRGlmZmVyTGVuZ3RoIC09IDc7DQorICAgIH0gZWxzZSB7DQorICAgICAgYkl0YWxpY0ZvbnQgPSBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAoYkl0YWxpYyBeIGJJdGFsaWNGb250KSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChpRGlmZmVyTGVuZ3RoID4gMSkgew0KKyAgICAgIENGWF9CeXRlU3RyaW5nIGJzRFJUYWlsZXIgPSBic0RSTmFtZS5SaWdodChpRGlmZmVyTGVuZ3RoKTsNCisgICAgICBpZiAoYnNEUlRhaWxlci5FcXVhbCgiTVQiKSB8fCBic0RSVGFpbGVyLkVxdWFsKCJQU01UIikgfHwNCisgICAgICAgICAgYnNEUlRhaWxlci5FcXVhbCgiUmVndWxhciIpIHx8IGJzRFJUYWlsZXIuRXF1YWwoIlJlZyIpKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQorICAgICAgaWYgKGJCb2xkRm9udCB8fCBiSXRhbGljRm9udCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBGWF9CT09MIGJNYXRjaCA9IEZBTFNFOw0KKyAgICAgIHN3aXRjaCAoYnNQc05hbWUuR2V0QXQoaVBzTGVuIC0gMSkpIHsNCisgICAgICAgIGNhc2UgJ0wnOiB7DQorICAgICAgICAgIGlmIChic0RSTmFtZS5SaWdodCg1KS5FcXVhbCgiTGlnaHQiKSkgew0KKyAgICAgICAgICAgIGJNYXRjaCA9IFRSVUU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBjYXNlICdSJzogew0KKyAgICAgICAgICBpZiAoYnNEUk5hbWUuUmlnaHQoNykuRXF1YWwoIlJlZ3VsYXIiKSB8fA0KKyAgICAgICAgICAgICAgYnNEUk5hbWUuUmlnaHQoMykuRXF1YWwoIlJlZyIpKSB7DQorICAgICAgICAgICAgYk1hdGNoID0gVFJVRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBicmVhazsNCisgICAgICAgIGNhc2UgJ00nOiB7DQorICAgICAgICAgIGlmIChic0RSTmFtZS5SaWdodCg1KS5FcXVhbCgiTWVkaXVtIikpIHsNCisgICAgICAgICAgICBiTWF0Y2ggPSBUUlVFOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBiTWF0Y2g7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfUERGRm9udE1ncjo6R2V0Q2hhcldpZHRoKElGWF9Gb250KiBwRm9udCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIHdVbmljb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckNvZGUpIHsNCisgIGlmICh3VW5pY29kZSAhPSAweDIwIHx8IGJDaGFyQ29kZSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDUERGX0ZvbnQqIHBQREZGb250ID0gKENQREZfRm9udCopbV9GREUyUERGRm9udC5HZXRWYWx1ZUF0KHBGb250KTsNCisgIGlmICghcFBERkZvbnQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgd1VuaWNvZGUgPSAoRlhfV0NIQVIpcFBERkZvbnQtPkNoYXJDb2RlRnJvbVVuaWNvZGUod1VuaWNvZGUpOw0KKyAgaVdpZHRoID0gcFBERkZvbnQtPkdldENoYXJXaWR0aEYod1VuaWNvZGUpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0NYRkFfRm9udE1ncjo6Q1hGQV9Gb250TWdyKCkgOiBtX3BEZWZGb250TWdyKE5VTEwpIHt9DQorQ1hGQV9Gb250TWdyOjp+Q1hGQV9Gb250TWdyKCkgew0KKyAgRGVsQWxsTWdyTWFwKCk7DQorfQ0KK0lGWF9Gb250KiBDWEZBX0ZvbnRNZ3I6OkdldEZvbnQoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9udEZhbWlseSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3Rm9udFN0eWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlKSB7DQorICBGWF9EV09SRCBkd0hhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c0ZvbnRGYW1pbHkuR2V0UHRyKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0ZvbnRGYW1pbHkuR2V0TGVuZ3RoKCksIEZBTFNFKTsNCisgIENGWF9CeXRlU3RyaW5nIGJzS2V5Ow0KKyAgYnNLZXkuRm9ybWF0KCIldSV1JXUiLCBkd0hhc2gsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKTsNCisgIElGWF9Gb250KiBwRm9udCA9IE5VTEw7DQorICBpZiAobV9Gb250QXJyYXkuTG9va3VwKGJzS2V5LCAodm9pZComKXBGb250KSkgew0KKyAgICByZXR1cm4gcEZvbnQ7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0VuZ2xpc2hOYW1lOw0KKyAgWEZBX0xvY2FsRm9udE5hbWVUb0VuZ2xpc2hOYW1lKHdzRm9udEZhbWlseSwgd3NFbmdsaXNoTmFtZSk7DQorICBDWEZBX1BERkZvbnRNZ3IqIHBNZ3IgPSAoQ1hGQV9QREZGb250TWdyKiltX1BERkZvbnRNZ3JBcnJheS5HZXRWYWx1ZUF0KGhEb2MpOw0KKyAgQ1BERl9Gb250KiBwUERGRm9udCA9IE5VTEw7DQorICBpZiAocE1nciAhPSBOVUxMKSB7DQorICAgIHBGb250ID0gcE1nci0+R2V0Rm9udCh3c0VuZ2xpc2hOYW1lLCBkd0ZvbnRTdHlsZXMsICZwUERGRm9udCk7DQorICAgIGlmIChwRm9udCkgew0KKyAgICAgIHJldHVybiBwRm9udDsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHBGb250ID09IE5VTEwgJiYgbV9wRGVmRm9udE1nciAhPSBOVUxMKSB7DQorICAgIHBGb250ID0gbV9wRGVmRm9udE1nci0+R2V0Rm9udChoRG9jLCB3c0ZvbnRGYW1pbHksIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKTsNCisgIH0NCisgIGlmIChwRm9udCA9PSBOVUxMICYmIHBNZ3IgIT0gTlVMTCkgew0KKyAgICBwUERGRm9udCA9IE5VTEw7DQorICAgIHBGb250ID0gcE1nci0+R2V0Rm9udCh3c0VuZ2xpc2hOYW1lLCBkd0ZvbnRTdHlsZXMsICZwUERGRm9udCwgRkFMU0UpOw0KKyAgICBpZiAocEZvbnQpIHsNCisgICAgICByZXR1cm4gcEZvbnQ7DQorICAgIH0NCisgIH0NCisgIGlmIChwRm9udCA9PSBOVUxMICYmIG1fcERlZkZvbnRNZ3IgIT0gTlVMTCkgew0KKyAgICBwRm9udCA9IG1fcERlZkZvbnRNZ3ItPkdldERlZmF1bHRGb250KGhEb2MsIHdzRm9udEZhbWlseSwgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdDb2RlUGFnZSk7DQorICB9DQorICBGWFNZU19hc3NlcnQocEZvbnQgIT0gTlVMTCk7DQorICBpZiAocEZvbnQpIHsNCisgICAgaWYgKHBQREZGb250KSB7DQorICAgICAgcE1nci0+bV9GREUyUERGRm9udC5TZXRBdChwRm9udCwgcFBERkZvbnQpOw0KKyAgICAgIHBGb250LT5TZXRGb250UHJvdmlkZXIocE1ncik7DQorICAgIH0NCisgICAgbV9Gb250QXJyYXkuU2V0QXQoYnNLZXksIHBGb250KTsNCisgIH0NCisgIHJldHVybiBwRm9udDsNCit9DQordm9pZCBDWEZBX0ZvbnRNZ3I6OkxvYWREb2NGb250cyhJWEZBX0RvYyogaERvYykgew0KKyAgaWYgKCFtX1BERkZvbnRNZ3JBcnJheS5HZXRWYWx1ZUF0KGhEb2MpKSB7DQorICAgIG1fUERGRm9udE1nckFycmF5LlNldEF0KGhEb2MsIG5ldyBDWEZBX1BERkZvbnRNZ3IoKENYRkFfRkZEb2MqKWhEb2MpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZvbnRNZ3I6OlJlbGVhc2VEb2NGb250cyhJWEZBX0RvYyogaERvYykgew0KKyAgQ1hGQV9QREZGb250TWdyKiBwTWdyID0gTlVMTDsNCisgIGlmIChtX1BERkZvbnRNZ3JBcnJheS5Mb29rdXAoaERvYywgKHZvaWQqJilwTWdyKSkgew0KKyAgICBpZiAocE1nciAhPSBOVUxMKSB7DQorICAgICAgZGVsZXRlIHBNZ3I7DQorICAgIH0NCisgICAgbV9QREZGb250TWdyQXJyYXkuUmVtb3ZlS2V5KGhEb2MpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRm9udE1ncjo6RGVsQWxsTWdyTWFwKCkgew0KKyAgRlhfUE9TSVRJT04gcHMgPSBtX1BERkZvbnRNZ3JBcnJheS5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocHMpIHsNCisgICAgSVhGQV9Eb2MqIGhEb2MgPSBOVUxMOw0KKyAgICBDWEZBX1BERkZvbnRNZ3IqIHBNZ3IgPSBOVUxMOw0KKyAgICBtX1BERkZvbnRNZ3JBcnJheS5HZXROZXh0QXNzb2MocHMsICh2b2lkKiYpaERvYywgKHZvaWQqJilwTWdyKTsNCisgICAgaWYgKHBNZ3IgIT0gTlVMTCkgew0KKyAgICAgIGRlbGV0ZSBwTWdyOw0KKyAgICB9DQorICB9DQorICBtX1BERkZvbnRNZ3JBcnJheS5SZW1vdmVBbGwoKTsNCisgIG1fRm9udEFycmF5LlJlbW92ZUFsbCgpOw0KK30NCit2b2lkIENYRkFfRm9udE1ncjo6U2V0RGVmRm9udE1ncihJWEZBX0ZvbnRNZ3IqIHBGb250TWdyKSB7DQorICBtX3BEZWZGb250TWdyID0gcEZvbnRNZ3I7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9mb250bWdyLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZm9udG1nci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZmIwOWIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZm9udG1nci5oCkBAIC0wLDAgKzEsODQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhGQV9GT1JNRklMTEVSX0ZPTlRNR1JfSU1QX0gNCisjZGVmaW5lIF9GWEZBX0ZPUk1GSUxMRVJfRk9OVE1HUl9JTVBfSA0KK3N0cnVjdCBYRkFfRk9OVElORk8gew0KKyAgRlhfRFdPUkQgZHdGb250TmFtZUhhc2g7DQorICBjb25zdCBGWF9XQ0hBUiogcFBzTmFtZTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwUmVwbGFjZUZvbnQ7DQorICBGWF9XT1JEIGR3U3R5bGVzOw0KKyAgRlhfV09SRCB3Q29kZVBhZ2U7DQorfTsNCitjbGFzcyBDWEZBX0RlZkZvbnRNZ3IgOiBwdWJsaWMgSVhGQV9Gb250TWdyIHsNCisgcHVibGljOg0KKyAgQ1hGQV9EZWZGb250TWdyKCkge30NCisgIH5DWEZBX0RlZkZvbnRNZ3IoKSBvdmVycmlkZTsNCisNCisgIC8vIElYRkFfRm9udE1ncjoNCisgIElGWF9Gb250KiBHZXRGb250KElYRkFfRG9jKiBoRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZvbnRGYW1pbHksDQorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICBGWF9XT1JEIHdDb2RlUGFnZSA9IDB4RkZGRikgb3ZlcnJpZGU7DQorICBJRlhfRm9udCogR2V0RGVmYXVsdEZvbnQoSVhGQV9Eb2MqIGhEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZvbnRGYW1pbHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dPUkQgd0NvZGVQYWdlID0gMHhGRkZGKSBvdmVycmlkZTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX1B0ckFycmF5IG1fQ2FjaGVGb250czsNCit9Ow0KK2NsYXNzIENYRkFfUERGRm9udE1nciA6IHB1YmxpYyBJRlhfRm9udFByb3ZpZGVyIHsNCisgcHVibGljOg0KKyAgQ1hGQV9QREZGb250TWdyKENYRkFfRkZEb2MqIHBEb2MpOw0KKyAgfkNYRkFfUERGRm9udE1ncigpOw0KKyAgSUZYX0ZvbnQqIEdldEZvbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZvbnRGYW1pbHksDQorICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZvbnRTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqKiBwUERGRm9udCwNCisgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0cmljdE1hdGNoID0gVFJVRSk7DQorICBGWF9CT09MIEdldENoYXJXaWR0aChJRlhfRm9udCogcEZvbnQsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiB3VW5pY29kZSwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJDb2RlKTsNCisgIENGWF9NYXBQdHJUb1B0ciBtX0ZERTJQREZGb250Ow0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRlhfRm9udCogRmluZEZvbnQoQ0ZYX0J5dGVTdHJpbmcgc3RyRmFtaWx5TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJCb2xkLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkl0YWxpYywNCisgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqKiBwUERGRm9udCwNCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdHJpY3RNYXRjaCA9IFRSVUUpOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgUHNOYW1lVG9Gb250TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyUHNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJCb2xkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJdGFsaWMpOw0KKyAgRlhfQk9PTCBQc05hbWVNYXRjaERSRm9udE5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1BzTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkJvbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJdGFsaWMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgYnNEUkZvbnROYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RyaWN0TWF0Y2ggPSBUUlVFKTsNCisgIENYRkFfRkZEb2MqIG1fcERvYzsNCisgIENGWF9DTWFwQnl0ZVN0cmluZ1RvUHRyIG1fRm9udEFycmF5Ow0KK307DQorY2xhc3MgQ1hGQV9Gb250TWdyIHsNCisgcHVibGljOg0KKyAgQ1hGQV9Gb250TWdyKCk7DQorICB+Q1hGQV9Gb250TWdyKCk7DQorICBJRlhfRm9udCogR2V0Rm9udChJWEZBX0RvYyogaERvYywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb250RmFtaWx5LA0KKyAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGb250U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgRlhfV09SRCB3Q29kZVBhZ2UgPSAweEZGRkYpOw0KKyAgdm9pZCBMb2FkRG9jRm9udHMoSVhGQV9Eb2MqIGhEb2MpOw0KKyAgdm9pZCBSZWxlYXNlRG9jRm9udHMoSVhGQV9Eb2MqIGhEb2MpOw0KKw0KKyAgdm9pZCBTZXREZWZGb250TWdyKElYRkFfRm9udE1nciogcEZvbnRNZ3IpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIERlbEFsbE1nck1hcCgpOw0KKyAgQ0ZYX01hcFB0clRvUHRyIG1fUERGRm9udE1nckFycmF5Ow0KKyAgSVhGQV9Gb250TWdyKiBtX3BEZWZGb250TWdyOw0KKyAgQ0ZYX0NNYXBCeXRlU3RyaW5nVG9QdHIgbV9Gb250QXJyYXk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZndsYWRhcHRlci5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZndsYWRhcHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4MmQwYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9md2xhZGFwdGVyLmNwcApAQCAtMCwwICsxLDc4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9jb21tb24uaCINCisjaW5jbHVkZSAieGZhX2Z3bGFkYXB0ZXIuaCINCisjaW5jbHVkZSAieGZhX2Zmd2lkZ2V0LmgiDQorI2luY2x1ZGUgInhmYV9mZmZpZWxkLmgiDQorI2luY2x1ZGUgInhmYV9mZmRvYy5oIg0KK0lGV0xfQWRhcHRlck5hdGl2ZSogRldMX0NyZWF0ZUZ1ZWxBZGFwdGVyTmF0aXZlKCkgew0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK3ZvaWQgRldMX1JlbGVhc2VGdWVsQWRhcHRlck5hdGl2ZShJRldMX0FkYXB0ZXJOYXRpdmUqIG5hdGl2ZSkge30NCit2b2lkIEZXTF9Qb3N0TWVzc2FnZVRvTWFpblJvb3AoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkge30NCitGWF9CT09MIEZXTF9TaG93Q2FyZXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlZpc2libGUsDQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJ0QW5jaG9yKSB7DQorICBDWEZBX0ZGV2lkZ2V0KiBwWEZBV2lkZ2V0ID0gKENYRkFfRkZXaWRnZXQqKXBXaWRnZXQtPkdldFByaXZhdGVEYXRhKHBXaWRnZXQpOw0KKyAgaWYgKCFwWEZBV2lkZ2V0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIElYRkFfRG9jUHJvdmlkZXIqIHBEb2NQcm92aWRlciA9IHBYRkFXaWRnZXQtPkdldERvYygpLT5HZXREb2NQcm92aWRlcigpOw0KKyAgaWYgKCFwRG9jUHJvdmlkZXIpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGJWaXNpYmxlKSB7DQorICAgIENGWF9NYXRyaXggbXQ7DQorICAgIHBYRkFXaWRnZXQtPkdldFJvdGF0ZU1hdHJpeChtdCk7DQorICAgIENGWF9SZWN0RiBydCgqcFJ0QW5jaG9yKTsNCisgICAgbXQuVHJhbnNmb3JtUmVjdChydCk7DQorICAgIHBEb2NQcm92aWRlci0+RGlzcGxheUNhcmV0KHBYRkFXaWRnZXQsIGJWaXNpYmxlLCAmcnQpOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHBEb2NQcm92aWRlci0+RGlzcGxheUNhcmV0KHBYRkFXaWRnZXQsIGJWaXNpYmxlLCBwUnRBbmNob3IpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZXTF9FUlIgQ1hGQV9GV0xBZGFwdGVyV2lkZ2V0TWdyOjpSZXBhaW50V2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QpIHsNCisgIGlmICghcFdpZGdldCkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgIENYRkFfRkZGaWVsZCogcEZpZWxkID0gKENYRkFfRkZGaWVsZCopcFdpZGdldC0+R2V0UHJpdmF0ZURhdGEocFdpZGdldCk7DQorICBpZiAoIXBGaWVsZCkNCisgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisjaWZkZWYgX1hGQV9FTUINCisgIENGWF9SZWN0RiBydEludmFsaWRhdGU7DQorICBwV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KHJ0SW52YWxpZGF0ZSk7DQorICBpZiAocFJlY3QpIHsNCisgICAgcnRJbnZhbGlkYXRlLmxlZnQgKz0gcFJlY3QtPmxlZnQ7DQorICAgIHJ0SW52YWxpZGF0ZS50b3AgKz0gcFJlY3QtPnRvcDsNCisgICAgcnRJbnZhbGlkYXRlLndpZHRoID0gcFJlY3QtPndpZHRoOw0KKyAgICBydEludmFsaWRhdGUuaGVpZ2h0ID0gcFJlY3QtPmhlaWdodDsNCisgIH0NCisgIENGWF9NYXRyaXggbXQ7DQorICBwRmllbGQtPkdldFJvdGF0ZU1hdHJpeChtdCk7DQorICBtdC5UcmFuc2Zvcm1SZWN0KHJ0SW52YWxpZGF0ZSk7DQorICBwRmllbGQtPkFkZEludmFsaWRhdGVSZWN0KCZydEludmFsaWRhdGUpOw0KKyNlbHNlDQorICBwRmllbGQtPkFkZEludmFsaWRhdGVSZWN0KE5VTEwpOw0KKyNlbmRpZg0KKyAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9CT09MIENYRkFfRldMQWRhcHRlcldpZGdldE1ncjo6R2V0UG9wdXBQb3MoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNaW5IZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNYXhIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRBbmNob3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRQb3B1cCkgew0KKyAgQ1hGQV9GRldpZGdldCogcEZGV2lkZ2V0ID0gKENYRkFfRkZXaWRnZXQqKShwV2lkZ2V0LT5HZXRQcml2YXRlRGF0YShwV2lkZ2V0KSk7DQorICBDRlhfTWF0cml4IG10Ow0KKyAgcEZGV2lkZ2V0LT5HZXRSb3RhdGVNYXRyaXgobXQpOw0KKyAgQ0ZYX1JlY3RGIHJ0Um90YXRlQW5jaG9yKHJ0QW5jaG9yKTsNCisgIG10LlRyYW5zZm9ybVJlY3QocnRSb3RhdGVBbmNob3IpOw0KKyAgcEZGV2lkZ2V0LT5HZXREb2MoKS0+R2V0RG9jUHJvdmlkZXIoKS0+R2V0UG9wdXBQb3MoDQorICAgICAgcEZGV2lkZ2V0LCBmTWluSGVpZ2h0LCBmTWF4SGVpZ2h0LCBydFJvdGF0ZUFuY2hvciwgcnRQb3B1cCk7DQorICByZXR1cm4gVFJVRTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX2Z3bGFkYXB0ZXIuaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9md2xhZGFwdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyYmU2NQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9md2xhZGFwdGVyLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfRldMX0FEQVBURVJfSU1QX0gNCisjZGVmaW5lIF9YRkFfRldMX0FEQVBURVJfSU1QX0gNCitjbGFzcyBDWEZBX0ZXTEFkYXB0ZXJXaWRnZXRNZ3IgOiBwdWJsaWMgQ0ZXTF9TREFkYXB0ZXJXaWRnZXRNZ3Igew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIEZXTF9FUlIgUmVwYWludFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCwgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgR2V0UG9wdXBQb3MoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1pbkhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWF4SGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRBbmNob3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydFBvcHVwKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9md2x0aGVtZS5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZndsdGhlbWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYTYyNDIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZndsdGhlbWUuY3BwCkBAIC0wLDAgKzEsNDExIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9jb21tb24uaCINCisjaW5jbHVkZSAieGZhX2Z3bHRoZW1lLmgiDQorI2luY2x1ZGUgInhmYV9mZndpZGdldC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZhcHAuaCINCitDWEZBX0ZGV2lkZ2V0KiBYRkFfVGhlbWVHZXRPdXRlcldpZGdldChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgSUZXTF9XaWRnZXQqIHBPdXRlciA9IHBXaWRnZXQ7DQorICB3aGlsZSAocE91dGVyLT5HZXRPdXRlcigpKSB7DQorICAgIHBPdXRlciA9IHBPdXRlci0+R2V0T3V0ZXIoKTsNCisgIH0NCisgIGlmIChwT3V0ZXIpIHsNCisgICAgcmV0dXJuIChDWEZBX0ZGV2lkZ2V0KilwT3V0ZXItPkdldFByaXZhdGVEYXRhKHBPdXRlcik7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorQ1hGQV9GV0xUaGVtZTo6Q1hGQV9GV0xUaGVtZShDWEZBX0ZGQXBwKiBwQXBwKSA6IG1fcEFwcChwQXBwKSB7DQorICBtX3BUZXh0T3V0ID0gTlVMTDsNCisgIG1fZHdDYXBhY2l0eSA9IDA7DQorICBtX2ZDYXBhY2l0eSA9IDA7DQorICBtX3BDYWxlbmRhckZvbnQgPSBOVUxMOw0KKyAgbV9SZWN0LlNldCgwLCAwLCAwLCAwKTsNCisgIG1fU2l6ZUFib3ZlQmVsb3cuU2V0KDAsIDApOw0KKyAgbV9wQ2hlY2tCb3hUUCA9IG5ldyBDWEZBX0ZXTENoZWNrQm94VFA7DQorICBtX3BMaXN0Qm94VFAgPSBuZXcgQ0ZXTF9MaXN0Qm94VFA7DQorICBtX3BQaWN0dXJlQm94VFAgPSBuZXcgQ0ZXTF9QaWN0dXJlQm94VFA7DQorICBtX3BTcm9sbEJhclRQID0gbmV3IENGV0xfU2Nyb2xsQmFyVFA7DQorICBtX3BFZGl0VFAgPSBuZXcgQ1hGQV9GV0xFZGl0VFA7DQorICBtX3BDb21ib0JveFRQID0gbmV3IENGV0xfQ29tYm9Cb3hUUDsNCisgIG1fcE1vbnRoQ2FsZW5kYXJUUCA9IG5ldyBDRldMX01vbnRoQ2FsZW5kYXJUUDsNCisgIG1fcERhdGVUaW1lUGlja2VyVFAgPSBuZXcgQ0ZXTF9EYXRlVGltZVBpY2tlclRQOw0KKyAgbV9wUHVzaEJ1dHRvblRQID0gbmV3IENGV0xfUHVzaEJ1dHRvblRQOw0KKyAgbV9wQ2FyZXRUUCA9IG5ldyBDRldMX0NhcmV0VFA7DQorICBtX3BCYXJjb2RlVFAgPSBuZXcgQ0ZXTF9CYXJjb2RlVFA7DQorICBJbml0aWFsaXplKCk7DQorfQ0KK0NYRkFfRldMVGhlbWU6On5DWEZBX0ZXTFRoZW1lKCkgew0KKyAgRmluYWxpemUoKTsNCisgIGRlbGV0ZSBtX3BDaGVja0JveFRQOw0KKyAgZGVsZXRlIG1fcExpc3RCb3hUUDsNCisgIGRlbGV0ZSBtX3BQaWN0dXJlQm94VFA7DQorICBkZWxldGUgbV9wU3JvbGxCYXJUUDsNCisgIGRlbGV0ZSBtX3BFZGl0VFA7DQorICBkZWxldGUgbV9wQ29tYm9Cb3hUUDsNCisgIGRlbGV0ZSBtX3BNb250aENhbGVuZGFyVFA7DQorICBkZWxldGUgbV9wRGF0ZVRpbWVQaWNrZXJUUDsNCisgIGRlbGV0ZSBtX3BQdXNoQnV0dG9uVFA7DQorICBkZWxldGUgbV9wQ2FyZXRUUDsNCisgIGRlbGV0ZSBtX3BCYXJjb2RlVFA7DQorfQ0KK3N0YXRpYyBjb25zdCBGWF9XQ0hBUiogZ19GV0xUaGVtZV9DYWxGb250c1tdID0gew0KKyAgICBMIkFyaWFsIiwgTCJDb3VyaWVyIE5ldyIsIEwiRGVqYVZ1IFNhbnMiLA0KK307DQorRldMX0VSUiBDWEZBX0ZXTFRoZW1lOjpJbml0aWFsaXplKCkgew0KKyAgbV9wVGV4dE91dCA9IElGREVfVGV4dE91dDo6Q3JlYXRlKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IE5VTEwgPT0gbV9wQ2FsZW5kYXJGb250ICYmDQorICAgICAgICAgICAgICAgICAgICAgIGkgPCBzaXplb2YoZ19GV0xUaGVtZV9DYWxGb250cykgLyBzaXplb2YoY29uc3QgRlhfV0NIQVIqKTsNCisgICAgICAgaSsrKSB7DQorICAgIG1fcENhbGVuZGFyRm9udCA9IElGWF9Gb250OjpMb2FkRm9udChnX0ZXTFRoZW1lX0NhbEZvbnRzW2ldLCAwLCAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQXBwLT5HZXRGREVGb250TWdyKCkpOw0KKyAgfQ0KKyAgaWYgKE5VTEwgPT0gbV9wQ2FsZW5kYXJGb250KQ0KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQorICAgIG1fcENhbGVuZGFyRm9udCA9IG1fcEFwcC0+R2V0RkRFRm9udE1ncigpLT5HZXREZWZGb250QnlDb2RlUGFnZSgNCisgICAgICAgIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbiwgMCwgTlVMTCk7DQorI2Vsc2UNCisgICAgbV9wQ2FsZW5kYXJGb250ID0gbV9wQXBwLT5HZXRGREVGb250TWdyKCktPkdldEZvbnRCeUNvZGVQYWdlKA0KKyAgICAgICAgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFuLCAwLCBOVUxMKTsNCisjZW5kaWYNCisgIEZYU1lTX2Fzc2VydChOVUxMICE9IG1fcENhbGVuZGFyRm9udCk7DQorICBGV0xUSEVNRV9Jbml0KCk7DQorICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZXTF9FUlIgQ1hGQV9GV0xUaGVtZTo6RmluYWxpemUoKSB7DQorICBpZiAobV9wVGV4dE91dCkgew0KKyAgICBtX3BUZXh0T3V0LT5SZWxlYXNlKCk7DQorICAgIG1fcFRleHRPdXQgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcENhbGVuZGFyRm9udCkgew0KKyAgICBtX3BDYWxlbmRhckZvbnQtPlJlbGVhc2UoKTsNCisgICAgbV9wQ2FsZW5kYXJGb250ID0gTlVMTDsNCisgIH0NCisgIEZXTFRIRU1FX1JlbGVhc2UoKTsNCisgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfQk9PTCBDWEZBX0ZXTFRoZW1lOjpJc1ZhbGlkV2lkZ2V0KElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfRFdPUkQgQ1hGQV9GV0xUaGVtZTo6R2V0VGhlbWVJRChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIDA7DQorfQ0KK0ZYX0RXT1JEIENYRkFfRldMVGhlbWU6OlNldFRoZW1lSUQoSUZXTF9XaWRnZXQqIHBXaWRnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1RoZW1lSUQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGlsZHJlbikgew0KKyAgcmV0dXJuIDA7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GV0xUaGVtZTo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMpIHsNCisgIHJldHVybiBHZXRUaGVtZShwUGFyYW1zLT5tX3BXaWRnZXQpLT5EcmF3QmFja2dyb3VuZChwUGFyYW1zKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZXTFRoZW1lOjpEcmF3VGV4dChDRldMX1RoZW1lVGV4dCogcFBhcmFtcykgew0KKyAgaWYgKHBQYXJhbXMtPm1fd3NUZXh0LklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgfQ0KKyAgaWYgKHBQYXJhbXMtPm1fcFdpZGdldC0+R2V0Q2xhc3NJRCgpID09IEZXTF9DTEFTU0hBU0hfTW9udGhDYWxlbmRhcikgew0KKyAgICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gWEZBX1RoZW1lR2V0T3V0ZXJXaWRnZXQocFBhcmFtcy0+bV9wV2lkZ2V0KTsNCisgICAgaWYgKCFwV2lkZ2V0KSB7DQorICAgICAgcmV0dXJuIEZXTF9FUlJfSW5kZWZpbml0ZTsNCisgICAgfQ0KKyAgICBtX3BUZXh0T3V0LT5TZXRTdHlsZXMocFBhcmFtcy0+bV9kd1RUT1N0eWxlcyk7DQorICAgIG1fcFRleHRPdXQtPlNldEFsaWdubWVudChwUGFyYW1zLT5tX2lUVE9BbGlnbik7DQorICAgIG1fcFRleHRPdXQtPlNldEZvbnQobV9wQ2FsZW5kYXJGb250KTsNCisgICAgbV9wVGV4dE91dC0+U2V0Rm9udFNpemUoRldMVEhFTUVfQ0FQQUNJVFlfRm9udFNpemUpOw0KKyAgICBtX3BUZXh0T3V0LT5TZXRUZXh0Q29sb3IoRldMVEhFTUVfQ0FQQUNJVFlfVGV4dENvbG9yKTsNCisgICAgaWYgKChwUGFyYW1zLT5tX2lQYXJ0ID09IEZXTF9QQVJUX01DRF9EYXRlc0luKSAmJg0KKyAgICAgICAgIShwUGFyYW1zLT5tX2R3U3RhdGVzICYgRldMX0lURU1TVEFURV9NQ0RfRmxhZykgJiYNCisgICAgICAgIChwUGFyYW1zLT5tX2R3U3RhdGVzICYNCisgICAgICAgICAoRldMX1BBUlRTVEFURV9NQ0RfSG92ZXJlZCB8IEZXTF9QQVJUU1RBVEVfTUNEX1NlbGVjdGVkKSkpIHsNCisgICAgICBtX3BUZXh0T3V0LT5TZXRUZXh0Q29sb3IoMHhGRkZGRkZGRik7DQorICAgIH0NCisgICAgaWYgKHBQYXJhbXMtPm1faVBhcnQgPT0gRldMX1BBUlRfTUNEX0NhcHRpb24pIHsNCisgICAgICBpZiAobV9wTW9udGhDYWxlbmRhclRQLT5HZXRUaGVtZUlEKHBQYXJhbXMtPm1fcFdpZGdldCkgPT0gMCkgew0KKyAgICAgICAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKEFyZ2JFbmNvZGUoMHhmZiwgMCwgMTUzLCAyNTUpKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKEFyZ2JFbmNvZGUoMHhmZiwgMTI4LCAxMjgsIDApKTsNCisgICAgICB9DQorICAgIH0NCisgICAgQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MgPSBwUGFyYW1zLT5tX3BHcmFwaGljczsNCisgICAgQ0ZYX1JlbmRlckRldmljZSogcFJlbmRlckRldmljZSA9IHBHcmFwaGljcy0+R2V0UmVuZGVyRGV2aWNlKCk7DQorICAgIGlmICghcFJlbmRlckRldmljZSkNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIG1fcFRleHRPdXQtPlNldFJlbmRlckRldmljZShwUmVuZGVyRGV2aWNlKTsNCisgICAgQ0ZYX01hdHJpeCBtdFBhcnQgPSBwUGFyYW1zLT5tX21hdHJpeDsNCisgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IHBHcmFwaGljcy0+R2V0TWF0cml4KCk7DQorICAgIGlmIChwTWF0cml4KSB7DQorICAgICAgbXRQYXJ0LkNvbmNhdCgqcE1hdHJpeCk7DQorICAgIH0NCisgICAgbV9wVGV4dE91dC0+U2V0TWF0cml4KG10UGFydCk7DQorICAgIG1fcFRleHRPdXQtPkRyYXdMb2dpY1RleHQocFBhcmFtcy0+bV93c1RleHQsIHBQYXJhbXMtPm1fd3NUZXh0LkdldExlbmd0aCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fcnRQYXJ0KTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gWEZBX1RoZW1lR2V0T3V0ZXJXaWRnZXQocFBhcmFtcy0+bV9wV2lkZ2V0KTsNCisgIGlmICghcFdpZGdldCkgew0KKyAgICByZXR1cm4gRldMX0VSUl9JbmRlZmluaXRlOw0KKyAgfQ0KKyAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBwV2lkZ2V0LT5HZXREYXRhQWNjKCk7DQorICBDRlhfR3JhcGhpY3MqIHBHcmFwaGljcyA9IHBQYXJhbXMtPm1fcEdyYXBoaWNzOw0KKyAgQ0ZYX1JlbmRlckRldmljZSogcFJlbmRlckRldmljZSA9IHBHcmFwaGljcy0+R2V0UmVuZGVyRGV2aWNlKCk7DQorICBpZiAoIXBSZW5kZXJEZXZpY2UpDQorICAgIHJldHVybiBGQUxTRTsNCisgIG1fcFRleHRPdXQtPlNldFJlbmRlckRldmljZShwUmVuZGVyRGV2aWNlKTsNCisgIG1fcFRleHRPdXQtPlNldFN0eWxlcyhwUGFyYW1zLT5tX2R3VFRPU3R5bGVzKTsNCisgIG1fcFRleHRPdXQtPlNldEFsaWdubWVudChwUGFyYW1zLT5tX2lUVE9BbGlnbik7DQorICBtX3BUZXh0T3V0LT5TZXRGb250KHBBY2MtPkdldEZERUZvbnQoKSk7DQorICBtX3BUZXh0T3V0LT5TZXRGb250U2l6ZShwQWNjLT5HZXRGb250U2l6ZSgpKTsNCisgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcihwQWNjLT5HZXRUZXh0Q29sb3IoKSk7DQorICBDRlhfTWF0cml4IG10UGFydCA9IHBQYXJhbXMtPm1fbWF0cml4Ow0KKyAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IHBHcmFwaGljcy0+R2V0TWF0cml4KCk7DQorICBpZiAocE1hdHJpeCkgew0KKyAgICBtdFBhcnQuQ29uY2F0KCpwTWF0cml4KTsNCisgIH0NCisgIG1fcFRleHRPdXQtPlNldE1hdHJpeChtdFBhcnQpOw0KKyAgbV9wVGV4dE91dC0+RHJhd0xvZ2ljVGV4dChwUGFyYW1zLT5tX3dzVGV4dCwgcFBhcmFtcy0+bV93c1RleHQuR2V0TGVuZ3RoKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fcnRQYXJ0KTsNCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkKiBDWEZBX0ZXTFRoZW1lOjpHZXRDYXBhY2l0eShDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0NhcGFjaXR5KSB7DQorICBzd2l0Y2ggKGR3Q2FwYWNpdHkpIHsNCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfRm9udDogew0KKyAgICAgIGlmIChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0NCisgICAgICAgICAgICAgIFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBUaGVtZVBhcnQtPm1fcFdpZGdldCkpIHsNCisgICAgICAgIHJldHVybiBwV2lkZ2V0LT5HZXREYXRhQWNjKCktPkdldEZERUZvbnQoKTsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRldMX1dHVENBUEFDSVRZX0ZvbnRTaXplOiB7DQorICAgICAgaWYgKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPQ0KKyAgICAgICAgICAgICAgWEZBX1RoZW1lR2V0T3V0ZXJXaWRnZXQocFRoZW1lUGFydC0+bV9wV2lkZ2V0KSkgew0KKyAgICAgICAgbV9mQ2FwYWNpdHkgPSBwV2lkZ2V0LT5HZXREYXRhQWNjKCktPkdldEZvbnRTaXplKCk7DQorICAgICAgICByZXR1cm4gJm1fZkNhcGFjaXR5Ow0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfVGV4dENvbG9yOiB7DQorICAgICAgaWYgKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPQ0KKyAgICAgICAgICAgICAgWEZBX1RoZW1lR2V0T3V0ZXJXaWRnZXQocFRoZW1lUGFydC0+bV9wV2lkZ2V0KSkgew0KKyAgICAgICAgbV9kd0NhcGFjaXR5ID0gcFdpZGdldC0+R2V0RGF0YUFjYygpLT5HZXRUZXh0Q29sb3IoKTsNCisgICAgICAgIHJldHVybiAmbV9kd0NhcGFjaXR5Ow0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfTGluZUhlaWdodDogew0KKyAgICAgIGlmIChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0NCisgICAgICAgICAgICAgIFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBUaGVtZVBhcnQtPm1fcFdpZGdldCkpIHsNCisgICAgICAgIG1fZkNhcGFjaXR5ID0gcFdpZGdldC0+R2V0RGF0YUFjYygpLT5HZXRMaW5lSGVpZ2h0KCk7DQorICAgICAgICByZXR1cm4gJm1fZkNhcGFjaXR5Ow0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfU2Nyb2xsQmFyV2lkdGg6IHsNCisgICAgICBtX2ZDYXBhY2l0eSA9IDk7DQorICAgICAgcmV0dXJuICZtX2ZDYXBhY2l0eTsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfVUlNYXJnaW46IHsNCisgICAgICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gWEZBX1RoZW1lR2V0T3V0ZXJXaWRnZXQocFRoZW1lUGFydC0+bV9wV2lkZ2V0KTsNCisgICAgICBpZiAocFdpZGdldCkgew0KKyAgICAgICAgQ1hGQV9MYXlvdXRJdGVtKiBwSXRlbSA9IHBXaWRnZXQ7DQorICAgICAgICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBXaWRnZXQtPkdldERhdGFBY2MoKTsNCisgICAgICAgIHBXaWRnZXRBY2MtPkdldFVJTWFyZ2luKG1fUmVjdCk7DQorICAgICAgICBpZiAoQ1hGQV9QYXJhIHBhcmEgPSBwV2lkZ2V0QWNjLT5HZXRQYXJhKCkpIHsNCisgICAgICAgICAgbV9SZWN0LmxlZnQgKz0gcGFyYS5HZXRNYXJnaW5MZWZ0KCk7DQorICAgICAgICAgIGlmIChwV2lkZ2V0QWNjLT5Jc011bHRpTGluZSgpKSB7DQorICAgICAgICAgICAgbV9SZWN0LndpZHRoICs9IHBhcmEuR2V0TWFyZ2luUmlnaHQoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBJdGVtLT5HZXRQcmV2KCkgPT0gTlVMTCkgew0KKyAgICAgICAgICBpZiAocEl0ZW0tPkdldE5leHQoKSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgbV9SZWN0LmhlaWdodCA9IDA7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAocEl0ZW0tPkdldE5leHQoKSA9PSBOVUxMKSB7DQorICAgICAgICAgIG1fUmVjdC50b3AgPSAwOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgbV9SZWN0LnRvcCA9IDA7DQorICAgICAgICAgIG1fUmVjdC5oZWlnaHQgPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICByZXR1cm4gJm1fUmVjdDsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGV0xfV0dUQ0FQQUNJVFlfU3BhY2VBYm92ZUJlbG93OiB7DQorICAgICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBUaGVtZVBhcnQtPm1fcFdpZGdldCk7DQorICAgICAgaWYgKHBXaWRnZXQpIHsNCisgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gcFdpZGdldC0+R2V0RGF0YUFjYygpOw0KKyAgICAgICAgaWYgKENYRkFfUGFyYSBwYXJhID0gcFdpZGdldEFjYy0+R2V0UGFyYSgpKSB7DQorICAgICAgICAgIG1fU2l6ZUFib3ZlQmVsb3cueCA9IHBhcmEuR2V0U3BhY2VBYm92ZSgpOw0KKyAgICAgICAgICBtX1NpemVBYm92ZUJlbG93LnkgPSBwYXJhLkdldFNwYWNlQmVsb3coKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcmV0dXJuICZtX1NpemVBYm92ZUJlbG93Ow0KKyAgICB9IGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgaWYgKHBUaGVtZVBhcnQtPm1fcFdpZGdldC0+R2V0Q2xhc3NJRCgpID09IEZXTF9DTEFTU0hBU0hfTW9udGhDYWxlbmRhciAmJg0KKyAgICAgIGR3Q2FwYWNpdHkgPj0gRldMX01DQ0FQQUNJVFlfU3VuICYmIGR3Q2FwYWNpdHkgPD0gRldMX01DQ0FQQUNJVFlfVG9kYXkpIHsNCisgICAgaWYgKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPQ0KKyAgICAgICAgICAgIFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBUaGVtZVBhcnQtPm1fcFdpZGdldCkpIHsNCisgICAgICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBwV2lkZ2V0LT5HZXRBcHBQcm92aWRlcigpOw0KKyAgICAgIG1fd3NSZXNvdXJjZS5FbXB0eSgpOw0KKyAgICAgIHBBcHBQcm92aWRlci0+TG9hZFN0cmluZygNCisgICAgICAgICAgWEZBX0lEU19TdHJpbmdXZWVrRGF5X1N1biArIGR3Q2FwYWNpdHkgLSBGV0xfV0dUQ0FQQUNJVFlfTUFYIC0gNSwNCisgICAgICAgICAgbV93c1Jlc291cmNlKTsNCisgICAgICBpZiAoIW1fd3NSZXNvdXJjZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHJldHVybiAmbV93c1Jlc291cmNlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEdldFRoZW1lKHBUaGVtZVBhcnQtPm1fcFdpZGdldCktPkdldENhcGFjaXR5KHBUaGVtZVBhcnQsIGR3Q2FwYWNpdHkpOw0KK30NCitGWF9CT09MIENYRkFfRldMVGhlbWU6OklzQ3VzdG9taXplZExheW91dChJRldMX1dpZGdldCogcFdpZGdldCkgew0KKyAgcmV0dXJuIEdldFRoZW1lKHBXaWRnZXQpLT5Jc0N1c3RvbWl6ZWRMYXlvdXQocFdpZGdldCk7DQorfQ0KK0ZXTF9FUlIgQ1hGQV9GV0xUaGVtZTo6R2V0UGFydFJlY3QoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQpIHsNCisgIENGWF9SZWN0RiByZWN0Ow0KKyAgcmV0dXJuIEdldFRoZW1lKHBUaGVtZVBhcnQtPm1fcFdpZGdldCktPkdldFBhcnRSZWN0KHBUaGVtZVBhcnQsIHJlY3QpOw0KK30NCitGWF9CT09MIENYRkFfRldMVGhlbWU6OklzSW5QYXJ0KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSkgew0KKyAgcmV0dXJuIEdldFRoZW1lKHBUaGVtZVBhcnQtPm1fcFdpZGdldCktPklzSW5QYXJ0KHBUaGVtZVBhcnQsIGZ4LCBmeSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GV0xUaGVtZTo6Q2FsY1RleHRSZWN0KENGV0xfVGhlbWVUZXh0KiBwUGFyYW1zLCBDRlhfUmVjdEYmIHJlY3QpIHsNCisgIGlmIChwUGFyYW1zLT5tX3BXaWRnZXQtPkdldENsYXNzSUQoKSA9PSBGV0xfQ0xBU1NIQVNIX01vbnRoQ2FsZW5kYXIpIHsNCisgICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBQYXJhbXMtPm1fcFdpZGdldCk7DQorICAgIGlmICghcFdpZGdldCkgew0KKyAgICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICAgIH0NCisgICAgaWYgKCFwUGFyYW1zKQ0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgaWYgKCFtX3BUZXh0T3V0KQ0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgbV9wVGV4dE91dC0+U2V0Rm9udChtX3BDYWxlbmRhckZvbnQpOw0KKyAgICBtX3BUZXh0T3V0LT5TZXRGb250U2l6ZShGV0xUSEVNRV9DQVBBQ0lUWV9Gb250U2l6ZSk7DQorICAgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcihGV0xUSEVNRV9DQVBBQ0lUWV9UZXh0Q29sb3IpOw0KKyAgICBtX3BUZXh0T3V0LT5TZXRBbGlnbm1lbnQocFBhcmFtcy0+bV9pVFRPQWxpZ24pOw0KKyAgICBtX3BUZXh0T3V0LT5TZXRTdHlsZXMocFBhcmFtcy0+bV9kd1RUT1N0eWxlcyk7DQorICAgIG1fcFRleHRPdXQtPkNhbGNMb2dpY1NpemUocFBhcmFtcy0+bV93c1RleHQsIHBQYXJhbXMtPm1fd3NUZXh0LkdldExlbmd0aCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QpOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBYRkFfVGhlbWVHZXRPdXRlcldpZGdldChwUGFyYW1zLT5tX3BXaWRnZXQpOw0KKyAgaWYgKCFwV2lkZ2V0KSB7DQorICAgIHJldHVybiBGV0xfRVJSX0luZGVmaW5pdGU7DQorICB9DQorICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IHBXaWRnZXQtPkdldERhdGFBY2MoKTsNCisgIG1fcFRleHRPdXQtPlNldEZvbnQocEFjYy0+R2V0RkRFRm9udCgpKTsNCisgIG1fcFRleHRPdXQtPlNldEZvbnRTaXplKHBBY2MtPkdldEZvbnRTaXplKCkpOw0KKyAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKHBBY2MtPkdldFRleHRDb2xvcigpKTsNCisgIGlmICghcFBhcmFtcykNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgaWYgKCFtX3BUZXh0T3V0KQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICBtX3BUZXh0T3V0LT5TZXRBbGlnbm1lbnQocFBhcmFtcy0+bV9pVFRPQWxpZ24pOw0KKyAgbV9wVGV4dE91dC0+U2V0U3R5bGVzKHBQYXJhbXMtPm1fZHdUVE9TdHlsZXMpOw0KKyAgbV9wVGV4dE91dC0+Q2FsY0xvZ2ljU2l6ZShwUGFyYW1zLT5tX3dzVGV4dCwgcFBhcmFtcy0+bV93c1RleHQuR2V0TGVuZ3RoKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0NGV0xfV2lkZ2V0VFAqIENYRkFfRldMVGhlbWU6OkdldFRoZW1lKElGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7DQorICBzd2l0Y2ggKHBXaWRnZXQtPkdldENsYXNzSUQoKSkgew0KKyAgICBjYXNlIEZXTF9DTEFTU0hBU0hfQ2hlY2tCb3g6DQorICAgICAgcmV0dXJuIG1fcENoZWNrQm94VFA7DQorICAgIGNhc2UgRldMX0NMQVNTSEFTSF9MaXN0Qm94Og0KKyAgICAgIHJldHVybiBtX3BMaXN0Qm94VFA7DQorICAgIGNhc2UgRldMX0NMQVNTSEFTSF9QaWN0dXJlQm94Og0KKyAgICAgIHJldHVybiBtX3BQaWN0dXJlQm94VFA7DQorICAgIGNhc2UgRldMX0NMQVNTSEFTSF9TY3JvbGxCYXI6DQorICAgICAgcmV0dXJuIG1fcFNyb2xsQmFyVFA7DQorICAgIGNhc2UgRldMX0NMQVNTSEFTSF9FZGl0Og0KKyAgICAgIHJldHVybiBtX3BFZGl0VFA7DQorICAgIGNhc2UgRldMX0NMQVNTSEFTSF9Db21ib0JveDoNCisgICAgICByZXR1cm4gbV9wQ29tYm9Cb3hUUDsNCisgICAgY2FzZSBGV0xfQ0xBU1NIQVNIX01vbnRoQ2FsZW5kYXI6DQorICAgICAgcmV0dXJuIG1fcE1vbnRoQ2FsZW5kYXJUUDsNCisgICAgY2FzZSBGV0xfQ0xBU1NIQVNIX0RhdGVUaW1lUGlja2VyOg0KKyAgICAgIHJldHVybiBtX3BEYXRlVGltZVBpY2tlclRQOw0KKyAgICBjYXNlIEZXTF9DTEFTU0hBU0hfUHVzaEJ1dHRvbjoNCisgICAgICByZXR1cm4gbV9wUHVzaEJ1dHRvblRQOw0KKyAgICBjYXNlIEZXTF9DTEFTU0hBU0hfQ2FyZXQ6DQorICAgICAgcmV0dXJuIG1fcENhcmV0VFA7DQorICAgIGNhc2UgRldMX0NMQVNTSEFTSF9CYXJjb2RlOg0KKyAgICAgIHJldHVybiBtX3BCYXJjb2RlVFA7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorQ1hGQV9GV0xDaGVja0JveFRQOjpDWEZBX0ZXTENoZWNrQm94VFAoKSB7fQ0KK0ZYX0JPT0wgQ1hGQV9GV0xDaGVja0JveFRQOjpEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcykgew0KKyAgaWYgKHBQYXJhbXMtPm1faVBhcnQgIT0gRldMX1BBUlRfQ0tCX0NoZWNrQm94KSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaWYgKCgocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2syKSA9PQ0KKyAgICAgICBGV0xfUEFSVFNUQVRFX0NLQl9DaGVja2VkKSB8fA0KKyAgICAgICgocFBhcmFtcy0+bV9kd1N0YXRlcyAmIEZXTF9QQVJUU1RBVEVfQ0tCX01hc2syKSA9PQ0KKyAgICAgICBGV0xfUEFSVFNUQVRFX0NLQl9OZXV0cmFsKSkgew0KKyAgICBEcmF3Q2hlY2tTaWduKHBQYXJhbXMtPm1fcFdpZGdldCwgcFBhcmFtcy0+bV9wR3JhcGhpY3MsICZwUGFyYW1zLT5tX3J0UGFydCwNCisgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX2R3U3RhdGVzLCAmcFBhcmFtcy0+bV9tYXRyaXgpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ1hGQV9GV0xDaGVja0JveFRQOjpEcmF3Q2hlY2tTaWduKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJ0Qm94LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsNCisgIENGWF9SZWN0RiBydFNpZ24oKnBSdEJveCk7DQorICBGWF9EV09SRCBkd0NvbG9yID0gMHhGRjAwMDAwMDsNCisgIGlmICgoaVN0YXRlICYgRldMX1BBUlRTVEFURV9DS0JfTWFzazIpID09IEZXTF9QQVJUU1RBVEVfQ0tCX05ldXRyYWwpIHsNCisgICAgZHdDb2xvciA9IDB4RkZBOUE5QTk7DQorICB9DQorICB7DQorICAgIEZYX0RXT1JEIGR3U3R5bGUgPSBwV2lkZ2V0LT5HZXRTdHlsZXNFeCgpOw0KKyAgICBydFNpZ24uRGVmbGF0ZShydFNpZ24ud2lkdGggLyA0LCBydFNpZ24uaGVpZ2h0IC8gNCk7DQorICAgIHN3aXRjaCAoZHdTdHlsZSAmIEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlTWFzaykgew0KKyAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVDaGVjazoNCisgICAgICAgIERyYXdTaWduQ2hlY2socEdyYXBoaWNzLCAmcnRTaWduLCBkd0NvbG9yLCBwTWF0cml4KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVDaXJjbGU6DQorICAgICAgICBEcmF3U2lnbkNpcmNsZShwR3JhcGhpY3MsICZydFNpZ24sIGR3Q29sb3IsIHBNYXRyaXgpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZUNyb3NzOg0KKyAgICAgICAgRHJhd1NpZ25Dcm9zcyhwR3JhcGhpY3MsICZydFNpZ24sIGR3Q29sb3IsIHBNYXRyaXgpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZURpYW1vbmQ6DQorICAgICAgICBEcmF3U2lnbkRpYW1vbmQocEdyYXBoaWNzLCAmcnRTaWduLCBkd0NvbG9yLCBwTWF0cml4KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVTcXVhcmU6DQorICAgICAgICBEcmF3U2lnblNxdWFyZShwR3JhcGhpY3MsICZydFNpZ24sIGR3Q29sb3IsIHBNYXRyaXgpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZVN0YXI6DQorICAgICAgICBEcmF3U2lnblN0YXIocEdyYXBoaWNzLCAmcnRTaWduLCBkd0NvbG9yLCBwTWF0cml4KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KK30NCitDWEZBX0ZXTEVkaXRUUDo6Q1hGQV9GV0xFZGl0VFAoKSB7fQ0KK0NYRkFfRldMRWRpdFRQOjp+Q1hGQV9GV0xFZGl0VFAoKSB7fQ0KK0ZYX0JPT0wgQ1hGQV9GV0xFZGl0VFA6OkRyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKSB7DQorICBpZiAoRldMX1BBUlRfRURUX0NvbWJUZXh0TGluZSA9PSBwUGFyYW1zLT5tX2lQYXJ0KSB7DQorICAgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBYRkFfVGhlbWVHZXRPdXRlcldpZGdldChwUGFyYW1zLT5tX3BXaWRnZXQpOw0KKyAgICBGWF9BUkdCIGNyID0gMHhGRjAwMDAwMDsNCisgICAgRlhfRkxPQVQgZldpZHRoID0gMS4wZjsNCisgICAgaWYgKENYRkFfQm9yZGVyIGJvcmRlclVJID0gcFdpZGdldC0+R2V0RGF0YUFjYygpLT5HZXRVSUJvcmRlcigpKSB7DQorICAgICAgQ1hGQV9FZGdlIGVkZ2UgPSBib3JkZXJVSS5HZXRFZGdlKDApOw0KKyAgICAgIGlmIChlZGdlKSB7DQorICAgICAgICBjciA9IGVkZ2UuR2V0Q29sb3IoKTsNCisgICAgICAgIGZXaWR0aCA9IGVkZ2UuR2V0VGhpY2tuZXNzKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIENGWF9Db2xvciBjckxpbmUoY3IpOw0KKyAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNyTGluZSk7DQorICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRMaW5lV2lkdGgoZldpZHRoKTsNCisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlN0cm9rZVBhdGgocFBhcmFtcy0+bV9wUGF0aCwgJnBQYXJhbXMtPm1fbWF0cml4KTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gQ0ZXTF9FZGl0VFA6OkRyYXdCYWNrZ3JvdW5kKHBQYXJhbXMpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZndsdGhlbWUuaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9md2x0aGVtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOGE3YWQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfZndsdGhlbWUuaApAQCAtMCwwICsxLDkyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1hGQV9GV0xfVEhFTUVfSU1QX0gNCisjZGVmaW5lIF9YRkFfRldMX1RIRU1FX0lNUF9IDQorY2xhc3MgQ1hGQV9GV0xUaGVtZSA6IHB1YmxpYyBJRldMX1RoZW1lUHJvdmlkZXIgew0KKyBwdWJsaWM6DQorICBDWEZBX0ZXTFRoZW1lKENYRkFfRkZBcHAqIHBBcHApOw0KKyAgdmlydHVhbCB+Q1hGQV9GV0xUaGVtZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIFJlbGVhc2UoKSB7DQorICAgIGRlbGV0ZSB0aGlzOw0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICB2aXJ0dWFsIElGV0xfVGFyZ2V0KiBSZXRhaW4oKSB7IHJldHVybiBOVUxMOyB9DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0Q2xhc3NOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0NsYXNzKSBjb25zdCB7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIH0NCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0SGFzaENvZGUoKSBjb25zdCB7IHJldHVybiAwOyB9DQorICB2aXJ0dWFsIEZXTF9FUlIgSW5pdGlhbGl6ZSgpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEZpbmFsaXplKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNWYWxpZFdpZGdldChJRldMX1dpZGdldCogcFdpZGdldCk7DQorICB2aXJ0dWFsIEZYX0RXT1JEIEdldFRoZW1lSUQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGWF9EV09SRCBTZXRUaGVtZUlEKElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3VGhlbWVJRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDaGlsZHJlbiA9IFRSVUUpOw0KKyAgdmlydHVhbCBGWF9CT09MIERyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3VGV4dChDRldMX1RoZW1lVGV4dCogcFBhcmFtcyk7DQorICB2aXJ0dWFsIHZvaWQqIEdldENhcGFjaXR5KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0LCBGWF9EV09SRCBkd0NhcGFjaXR5KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0N1c3RvbWl6ZWRMYXlvdXQoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFBhcnRSZWN0KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0KTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0luUGFydChDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeSk7DQorDQorICB2aXJ0dWFsIEZYX0JPT0wgQ2FsY1RleHRSZWN0KENGV0xfVGhlbWVUZXh0KiBwUGFyYW1zLCBDRlhfUmVjdEYmIHJlY3QpOw0KKyAgdmlydHVhbCBGV0xfRVJSIEdldFRoZW1lTWF0cml4KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBDRlhfTWF0cml4JiBtYXRyaXgpIHsNCisgICAgcmV0dXJuIEZXTF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KKyAgdmlydHVhbCBGV0xfRVJSIFNldFRoZW1lTWF0cml4KElGV0xfV2lkZ2V0KiBwV2lkZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgew0KKyAgICByZXR1cm4gRldMX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICB2aXJ0dWFsIEZXTF9FUlIgR2V0UGFydFJlY3QoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQsIENGWF9SZWN0RiYgcnRQYXJ0KSB7DQorICAgIHJldHVybiBGV0xfRVJSX1N1Y2NlZWRlZDsNCisgIH0NCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZXTF9XaWRnZXRUUCogR2V0VGhlbWUoSUZXTF9XaWRnZXQqIHBXaWRnZXQpOw0KKyAgQ0ZXTF9DaGVja0JveFRQKiBtX3BDaGVja0JveFRQOw0KKyAgQ0ZXTF9MaXN0Qm94VFAqIG1fcExpc3RCb3hUUDsNCisgIENGV0xfUGljdHVyZUJveFRQKiBtX3BQaWN0dXJlQm94VFA7DQorICBDRldMX1Njcm9sbEJhclRQKiBtX3BTcm9sbEJhclRQOw0KKyAgQ0ZXTF9FZGl0VFAqIG1fcEVkaXRUUDsNCisgIENGV0xfQ29tYm9Cb3hUUCogbV9wQ29tYm9Cb3hUUDsNCisgIENGV0xfTW9udGhDYWxlbmRhclRQKiBtX3BNb250aENhbGVuZGFyVFA7DQorICBDRldMX0RhdGVUaW1lUGlja2VyVFAqIG1fcERhdGVUaW1lUGlja2VyVFA7DQorICBDRldMX1B1c2hCdXR0b25UUCogbV9wUHVzaEJ1dHRvblRQOw0KKyAgQ0ZXTF9DYXJldFRQKiBtX3BDYXJldFRQOw0KKyAgQ0ZXTF9CYXJjb2RlVFAqIG1fcEJhcmNvZGVUUDsNCisgIElGREVfVGV4dE91dCogbV9wVGV4dE91dDsNCisgIEZYX0ZMT0FUIG1fZkNhcGFjaXR5Ow0KKyAgRlhfRFdPUkQgbV9kd0NhcGFjaXR5Ow0KKyAgSUZYX0ZvbnQqIG1fcENhbGVuZGFyRm9udDsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NSZXNvdXJjZTsNCisgIENYRkFfRkZBcHAqIG1fcEFwcDsNCisgIENGWF9SZWN0RiBtX1JlY3Q7DQorICBDRlhfU2l6ZUYgbV9TaXplQWJvdmVCZWxvdzsNCit9Ow0KK2NsYXNzIENYRkFfRldMQ2hlY2tCb3hUUCA6IHB1YmxpYyBDRldMX0NoZWNrQm94VFAgew0KKyBwdWJsaWM6DQorICBDWEZBX0ZXTENoZWNrQm94VFAoKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcyk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgRHJhd0NoZWNrU2lnbihJRldMX1dpZGdldCogcFdpZGdldCwNCisgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdEJveCwNCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KTsNCit9Ow0KK2NsYXNzIENYRkFfRldMRWRpdFRQIDogcHVibGljIENGV0xfRWRpdFRQIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GV0xFZGl0VFAoKTsNCisgIHZpcnR1YWwgfkNYRkFfRldMRWRpdFRQKCk7DQorDQorIHB1YmxpYzoNCisgIHZpcnR1YWwgRlhfQk9PTCBEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcyk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfcmVuZGVyY29udGV4dC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfcmVuZGVyY29udGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ4ZWQwZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9yZW5kZXJjb250ZXh0LmNwcApAQCAtMCwwICsxLDc1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9jb21tb24uaCINCisjaW5jbHVkZSAieGZhX3JlbmRlcmNvbnRleHQuaCINCisjaW5jbHVkZSAieGZhX2Zmd2lkZ2V0LmgiDQorI2RlZmluZSBYRkFfUkVOREVSQ09OVEVYVF9NYXhDb3VudCAzMA0KK0lYRkFfUmVuZGVyQ29udGV4dCogWEZBX1JlbmRlckNvbnRleHRfQ3JlYXRlKCkgew0KKyAgcmV0dXJuIG5ldyBDWEZBX1JlbmRlckNvbnRleHQ7DQorfQ0KK0NYRkFfUmVuZGVyQ29udGV4dDo6Q1hGQV9SZW5kZXJDb250ZXh0KCkgew0KKyAgbV9wV2lkZ2V0SXRlcmF0b3IgPSBOVUxMOw0KKyAgbV9wV2lkZ2V0ID0gTlVMTDsNCisgIG1fcFBhZ2VWaWV3ID0gTlVMTDsNCisgIG1fcEdTID0gTlVMTDsNCisgIG1fZHdTdGF0dXMgPSAwOw0KKyAgbV9tYXRyaXguU2V0SWRlbnRpdHkoKTsNCisgIG1fcnRDbGlwUmVjdC5SZXNldCgpOw0KK30NCitDWEZBX1JlbmRlckNvbnRleHQ6On5DWEZBX1JlbmRlckNvbnRleHQoKSB7DQorICBTdG9wUmVuZGVyKCk7DQorfQ0KK2ludDMyX3QgQ1hGQV9SZW5kZXJDb250ZXh0OjpTdGFydFJlbmRlcihJWEZBX1BhZ2VWaWV3KiBwUGFnZVZpZXcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYRkFfUmVuZGVyT3B0aW9ucyYgb3B0aW9ucykgew0KKyAgbV9wUGFnZVZpZXcgPSBwUGFnZVZpZXc7DQorICBtX3BHUyA9IHBHUzsNCisgIG1fbWF0cml4ID0gbWF0cml4Ow0KKyAgbV9vcHRpb25zID0gb3B0aW9uczsNCisgIENGWF9SZWN0RiBydFBhZ2U7DQorICBwR1MtPkdldENsaXBSZWN0KHJ0UGFnZSk7DQorICBDRlhfTWF0cml4IG10UmVzOw0KKyAgbXRSZXMuU2V0UmV2ZXJzZShtYXRyaXgpOw0KKyAgbV9ydENsaXBSZWN0LlNldChydFBhZ2UubGVmdCwgcnRQYWdlLnRvcCwgcnRQYWdlLndpZHRoLCBydFBhZ2UuaGVpZ2h0KTsNCisgIG10UmVzLlRyYW5zZm9ybVJlY3QobV9ydENsaXBSZWN0KTsNCisgIG1fZHdTdGF0dXMgPSBtX29wdGlvbnMubV9iSGlnaGxpZ2h0ID8gWEZBX1dJREdFVFNUQVRVU19IaWdobGlnaHQgOiAwOw0KKyAgRlhfRFdPUkQgZHdGaWx0ZXJUeXBlID0gWEZBX1dJREdFVEZJTFRFUl9WaXNpYmxlIHwgWEZBX1dJREdFVEZJTFRFUl9BbGxUeXBlIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIChtX29wdGlvbnMubV9iUHJpbnQgPyBYRkFfV0lER0VUU1RBVFVTX1ByaW50YWJsZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFhGQV9XSURHRVRTVEFUVVNfVmlld2FibGUpOw0KKyAgbV9wV2lkZ2V0SXRlcmF0b3IgPQ0KKyAgICAgIG1fcFBhZ2VWaWV3LT5DcmVhdGVXaWRnZXRJdGVyYXRvcihYRkFfVFJBVkVSU0VXQVlfRm9ybSwgZHdGaWx0ZXJUeXBlKTsNCisgIG1fcFdpZGdldCA9IG1fcFdpZGdldEl0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7DQorICByZXR1cm4gWEZBX1JFTkRFUlNUQVRVU19SZWFkeTsNCit9DQoraW50MzJfdCBDWEZBX1JlbmRlckNvbnRleHQ6OkRvUmVuZGVyKElGWF9QYXVzZSogcFBhdXNlKSB7DQorICBpbnQzMl90IGlDb3VudCA9IDA7DQorICB3aGlsZSAobV9wV2lkZ2V0KSB7DQorICAgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSAoQ1hGQV9GRldpZGdldCopbV9wV2lkZ2V0Ow0KKyAgICBDRlhfUmVjdEYgcnRXaWRnZXRCb3g7DQorICAgIHBXaWRnZXQtPkdldEJCb3gocnRXaWRnZXRCb3gsIFhGQV9XSURHRVRTVEFUVVNfVmlzaWJsZSk7DQorICAgIHJ0V2lkZ2V0Qm94LndpZHRoICs9IDE7DQorICAgIHJ0V2lkZ2V0Qm94LmhlaWdodCArPSAxOw0KKyAgICBpZiAocnRXaWRnZXRCb3guSW50ZXJzZWN0V2l0aChtX3J0Q2xpcFJlY3QpKSB7DQorICAgICAgcFdpZGdldC0+UmVuZGVyV2lkZ2V0KG1fcEdTLCAmbV9tYXRyaXgsIG1fZHdTdGF0dXMpOw0KKyAgICB9DQorICAgIG1fcFdpZGdldCA9IG1fcFdpZGdldEl0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7DQorICAgIGlDb3VudCsrOw0KKyAgICBpZiAoaUNvdW50ID4gWEZBX1JFTkRFUkNPTlRFWFRfTWF4Q291bnQgJiYgcFBhdXNlICYmDQorICAgICAgICBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsNCisgICAgICByZXR1cm4gWEZBX1JFTkRFUlNUQVRVU19Ub0JlQ29udGludWVkOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gWEZBX1JFTkRFUlNUQVRVU19Eb25lOw0KK30NCit2b2lkIENYRkFfUmVuZGVyQ29udGV4dDo6U3RvcFJlbmRlcigpIHsNCisgIGlmIChtX3BXaWRnZXRJdGVyYXRvcikgew0KKyAgICBtX3BXaWRnZXRJdGVyYXRvci0+UmVsZWFzZSgpOw0KKyAgICBtX3BXaWRnZXRJdGVyYXRvciA9IE5VTEw7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV9yZW5kZXJjb250ZXh0LmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfcmVuZGVyY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMzdlM2UKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfcmVuZGVyY29udGV4dC5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhGQV9GT1JNRklMTEVSX1JFTkRFUkNPTlRFWFRfSU1QX0gNCisjZGVmaW5lIF9GWEZBX0ZPUk1GSUxMRVJfUkVOREVSQ09OVEVYVF9JTVBfSA0KK2NsYXNzIENYRkFfUmVuZGVyQ29udGV4dCA6IHB1YmxpYyBJWEZBX1JlbmRlckNvbnRleHQgew0KKyBwdWJsaWM6DQorICBDWEZBX1JlbmRlckNvbnRleHQoKTsNCisgIHZpcnR1YWwgfkNYRkFfUmVuZGVyQ29udGV4dCgpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorICB2aXJ0dWFsIGludDMyX3QgU3RhcnRSZW5kZXIoSVhGQV9QYWdlVmlldyogcFBhZ2VWaWV3LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWEZBX1JlbmRlck9wdGlvbnMmIG9wdGlvbnMpOw0KKyAgdmlydHVhbCBpbnQzMl90IERvUmVuZGVyKElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCk7DQorICB2aXJ0dWFsIHZvaWQgU3RvcFJlbmRlcigpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJWEZBX1dpZGdldEl0ZXJhdG9yKiBtX3BXaWRnZXRJdGVyYXRvcjsNCisgIElYRkFfV2lkZ2V0KiBtX3BXaWRnZXQ7DQorICBJWEZBX1BhZ2VWaWV3KiBtX3BQYWdlVmlldzsNCisgIENGWF9HcmFwaGljcyogbV9wR1M7DQorICBDRlhfTWF0cml4IG1fbWF0cml4Ow0KKyAgQ1hGQV9SZW5kZXJPcHRpb25zIG1fb3B0aW9uczsNCisgIEZYX0RXT1JEIG1fZHdTdGF0dXM7DQorICBDRlhfUmVjdEYgbV9ydENsaXBSZWN0Ow0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX3RleHRsYXlvdXQuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX3RleHRsYXlvdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZGRhYmMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2FwcC94ZmFfdGV4dGxheW91dC5jcHAKQEAgLTAsMCArMSwyMDIyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlIDxhbGdvcml0aG0+DQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2NvbW1vbi5oIg0KKyNpbmNsdWRlICJ4ZmFfdGV4dGxheW91dC5oIg0KKyNpbmNsdWRlICJ4ZmFfZmZhcHAuaCINCisjaW5jbHVkZSAieGZhX2ZmZG9jLmgiDQorI2luY2x1ZGUgInhmYV9mb250bWdyLmgiDQorQ1hGQV9DU1NUYWdQcm92aWRlcjo6fkNYRkFfQ1NTVGFnUHJvdmlkZXIoKSB7DQorICBGWF9QT1NJVElPTiBwb3MgPSBtX0F0dHJpYnV0ZXMuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBvcykgew0KKyAgICBDRlhfV2lkZVN0cmluZyAqcE5hbWUgPSBOVUxMLCAqcFZhbHVlID0gTlVMTDsNCisgICAgbV9BdHRyaWJ1dGVzLkdldE5leHRBc3NvYyhwb3MsICh2b2lkKiYpcE5hbWUsICh2b2lkKiYpcFZhbHVlKTsNCisgICAgaWYgKHBOYW1lICE9IE5VTEwpIHsNCisgICAgICBkZWxldGUgcE5hbWU7DQorICAgIH0NCisgICAgaWYgKHBWYWx1ZSAhPSBOVUxMKSB7DQorICAgICAgZGVsZXRlIHBWYWx1ZTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENYRkFfQ1NTVGFnUHJvdmlkZXI6OkdldE5leHRBdHRyaWJ1dGUoRlhfUE9TSVRJT04mIHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDJiB3c0F0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSkgew0KKyAgaWYgKHBvcyA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nKiBwTmFtZSA9IE5VTEw7DQorICBDRlhfV2lkZVN0cmluZyogcFZhbHVlID0gTlVMTDsNCisgIG1fQXR0cmlidXRlcy5HZXROZXh0QXNzb2MocG9zLCAodm9pZComKXBOYW1lLCAodm9pZComKXBWYWx1ZSk7DQorICB3c0F0dHIgPSAqcE5hbWU7DQorICB3c1ZhbHVlID0gKnBWYWx1ZTsNCit9DQordm9pZCBDWEZBX0NTU1RhZ1Byb3ZpZGVyOjpTZXRBdHRyaWJ1dGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcqIHBOYW1lID0gbmV3IENGWF9XaWRlU3RyaW5nKCk7DQorICBDRlhfV2lkZVN0cmluZyogcFZhbHVlID0gbmV3IENGWF9XaWRlU3RyaW5nKCk7DQorICAqcE5hbWUgPSB3c0F0dHI7DQorICAqcFZhbHVlID0gd3NWYWx1ZTsNCisgIG1fQXR0cmlidXRlcy5TZXRBdChwTmFtZSwgcFZhbHVlKTsNCit9DQordm9pZCBDWEZBX1RleHRQYXJzZUNvbnRleHQ6OlNldERlY2xzKGNvbnN0IElGREVfQ1NTRGVjbGFyYXRpb24qKiBwcERlY2xBcnJheSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGVjbENvdW50KSB7DQorICBpZiAoaURlY2xDb3VudCA8PSAwIHx8IHBwRGVjbEFycmF5ID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV9kd01hdGNoZWREZWNscyA9IGlEZWNsQ291bnQ7DQorICBtX3BwTWF0Y2hlZERlY2xzID0gRlhfQWxsb2MoSUZERV9DU1NEZWNsYXJhdGlvbiosIGlEZWNsQ291bnQpOw0KKyAgRlhfbWVtY3B5KG1fcHBNYXRjaGVkRGVjbHMsIHBwRGVjbEFycmF5LA0KKyAgICAgICAgICAgIGlEZWNsQ291bnQgKiBzaXplb2YoSUZERV9DU1NEZWNsYXJhdGlvbiopKTsNCit9DQorQ1hGQV9UZXh0UGFyc2VyOjp+Q1hGQV9UZXh0UGFyc2VyKCkgew0KKyAgaWYgKG1fcFVBU2hlZXQgIT0gTlVMTCkgew0KKyAgICBtX3BVQVNoZWV0LT5SZWxlYXNlKCk7DQorICB9DQorICBpZiAobV9wU2VsZWN0b3IgIT0gTlVMTCkgew0KKyAgICBtX3BTZWxlY3Rvci0+UmVsZWFzZSgpOw0KKyAgfQ0KKyAgaWYgKG1fcEFsbG9jYXRvciAhPSBOVUxMKSB7DQorICAgIG1fcEFsbG9jYXRvci0+UmVsZWFzZSgpOw0KKyAgfQ0KKyAgRlhfUE9TSVRJT04gcHMgPSBtX21hcFhNTE5vZGVUb1BhcnNlQ29udGV4dC5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocHMpIHsNCisgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZTsNCisgICAgQ1hGQV9UZXh0UGFyc2VDb250ZXh0KiBwUGFyc2VDb250ZXh0Ow0KKyAgICBtX21hcFhNTE5vZGVUb1BhcnNlQ29udGV4dC5HZXROZXh0QXNzb2MocHMsIHBYTUxOb2RlLCBwUGFyc2VDb250ZXh0KTsNCisgICAgaWYgKHBQYXJzZUNvbnRleHQgIT0gTlVMTCkgew0KKyAgICAgIEZERV9EZWxldGVXaXRoKENYRkFfVGV4dFBhcnNlQ29udGV4dCwgbV9wQWxsb2NhdG9yLCBwUGFyc2VDb250ZXh0KTsNCisgICAgfQ0KKyAgfQ0KKyAgbV9tYXBYTUxOb2RlVG9QYXJzZUNvbnRleHQuUmVtb3ZlQWxsKCk7DQorfQ0KK3ZvaWQgQ1hGQV9UZXh0UGFyc2VyOjpSZXNldCgpIHsNCisgIEZYX1BPU0lUSU9OIHBzID0gbV9tYXBYTUxOb2RlVG9QYXJzZUNvbnRleHQuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBzKSB7DQorICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGU7DQorICAgIENYRkFfVGV4dFBhcnNlQ29udGV4dCogcFBhcnNlQ29udGV4dDsNCisgICAgbV9tYXBYTUxOb2RlVG9QYXJzZUNvbnRleHQuR2V0TmV4dEFzc29jKHBzLCBwWE1MTm9kZSwgcFBhcnNlQ29udGV4dCk7DQorICAgIGlmIChwUGFyc2VDb250ZXh0ICE9IE5VTEwpIHsNCisgICAgICBGREVfRGVsZXRlV2l0aChDWEZBX1RleHRQYXJzZUNvbnRleHQsIG1fcEFsbG9jYXRvciwgcFBhcnNlQ29udGV4dCk7DQorICAgIH0NCisgIH0NCisgIG1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0LlJlbW92ZUFsbCgpOw0KKyAgaWYgKG1fcEFsbG9jYXRvciAhPSBOVUxMKSB7DQorICAgIG1fcEFsbG9jYXRvci0+UmVsZWFzZSgpOw0KKyAgICBtX3BBbGxvY2F0b3IgPSBOVUxMOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfVGV4dFBhcnNlcjo6SW5pdENTU0RhdGEoSVhGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIpIHsNCisgIGlmIChwVGV4dFByb3ZpZGVyID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1fcFNlbGVjdG9yID09IE5VTEwpIHsNCisgICAgQ1hGQV9GRkRvYyogcERvYyA9IHBUZXh0UHJvdmlkZXItPkdldERvY05vZGUoKTsNCisgICAgSUZYX0ZvbnRNZ3IqIHBGb250TWdyID0gcERvYy0+R2V0QXBwKCktPkdldEZERUZvbnRNZ3IoKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBGb250TWdyICE9IE5VTEwpOw0KKyAgICBtX3BTZWxlY3RvciA9IElGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6Q3JlYXRlKCk7DQorICAgIG1fcFNlbGVjdG9yLT5TZXRGb250TWdyKHBGb250TWdyKTsNCisgICAgRlhfRkxPQVQgZkZvbnRTaXplID0gMTA7DQorICAgIENYRkFfRm9udCBmb250ID0gcFRleHRQcm92aWRlci0+R2V0Rm9udE5vZGUoKTsNCisgICAgaWYgKGZvbnQuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgICBmRm9udFNpemUgPSBmb250LkdldEZvbnRTaXplKCk7DQorICAgIH0NCisgICAgbV9wU2VsZWN0b3ItPlNldERlZkZvbnRTaXplKGZGb250U2l6ZSk7DQorICB9DQorICBpZiAobV9wVUFTaGVldCA9PSBOVUxMKSB7DQorICAgIG1fcFVBU2hlZXQgPSBMb2FkRGVmYXVsdFNoZWV0U3R5bGUoKTsNCisgICAgbV9wU2VsZWN0b3ItPlNldFN0eWxlU2hlZXQoRkRFX0NTU1NUWUxFU0hFRVRHUk9VUF9Vc2VyQWdlbnQsIG1fcFVBU2hlZXQpOw0KKyAgICBtX3BTZWxlY3Rvci0+VXBkYXRlU3R5bGVJbmRleChGREVfQ1NTTUVESUFUWVBFX0FMTCk7DQorICB9DQorfQ0KK0lGREVfQ1NTU3R5bGVTaGVldCogQ1hGQV9UZXh0UGFyc2VyOjpMb2FkRGVmYXVsdFNoZWV0U3R5bGUoKSB7DQorICBzdGF0aWMgY29uc3QgRlhfV0NIQVIgc19wU3R5bGVbXSA9DQorICAgICAgTCJodG1sLGJvZHksb2wscCx1bHtkaXNwbGF5OmJsb2NrfSINCisgICAgICBMImxpe2Rpc3BsYXk6bGlzdC1pdGVtfSINCisgICAgICBMIm9sLHVse3BhZGRpbmctbGVmdDozM3B4fW9se2xpc3Qtc3R5bGUtdHlwZTpkZWNpbWFsfW9sLHVse21hcmdpbi10b3A6MDsiDQorICAgICAgTCJtYXJnaW4tYm90dG9tOjB9dWwsb2x7bWFyZ2luOjEuMTJlbSAwfSINCisgICAgICBMImF7Y29sb3I6IzAwMDBmZjt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfWJ7Zm9udC13ZWlnaHQ6Ym9sZGVyfWl7Zm9udC0iDQorICAgICAgTCJzdHlsZTppdGFsaWN9Ig0KKyAgICAgIEwic3Vwe3ZlcnRpY2FsLWFsaWduOisxNWVtO2ZvbnQtc2l6ZTouNjZlbX1zdWJ7dmVydGljYWwtYWxpZ246LTE1ZW07Zm9udC0iDQorICAgICAgTCJzaXplOi42NmVtfSI7DQorICByZXR1cm4gSUZERV9DU1NTdHlsZVNoZWV0OjpMb2FkRnJvbUJ1ZmZlcigNCisgICAgICBDRlhfV2lkZVN0cmluZygpLCBzX3BTdHlsZSwgRlhTWVNfd2NzbGVuKHNfcFN0eWxlKSwgRlhfQ09ERVBBR0VfVVRGOCk7DQorfQ0KK0lGREVfQ1NTQ29tcHV0ZWRTdHlsZSogQ1hGQV9UZXh0UGFyc2VyOjpDcmVhdGVSb290U3R5bGUoDQorICAgIElYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyKSB7DQorICBDWEZBX0ZvbnQgZm9udCA9IHBUZXh0UHJvdmlkZXItPkdldEZvbnROb2RlKCk7DQorICBDWEZBX1BhcmEgcGFyYSA9IHBUZXh0UHJvdmlkZXItPkdldFBhcmFOb2RlKCk7DQorICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSA9IG1fcFNlbGVjdG9yLT5DcmVhdGVDb21wdXRlZFN0eWxlKE5VTEwpOw0KKyAgSUZERV9DU1NGb250U3R5bGUqIHBGb250U3R5bGUgPSBwU3R5bGUtPkdldEZvbnRTdHlsZXMoKTsNCisgIElGREVfQ1NTUGFyYWdyYXBoU3R5bGUqIHBQYXJhU3R5bGUgPSBwU3R5bGUtPkdldFBhcmFncmFwaFN0eWxlcygpOw0KKyAgRlhfRkxPQVQgZkxpbmVIZWlnaHQgPSAwLCBmRm9udFNpemUgPSAxMDsNCisgIGlmIChwYXJhLklzRXhpc3RJblhNTCgpKSB7DQorICAgIGZMaW5lSGVpZ2h0ID0gcGFyYS5HZXRMaW5lSGVpZ2h0KCk7DQorICAgIEZERV9DU1NMRU5HVEggaW5kZW50Ow0KKyAgICBpbmRlbnQuU2V0KEZERV9DU1NMRU5HVEhVTklUX1BvaW50LCBwYXJhLkdldFRleHRJbmRlbnQoKSk7DQorICAgIHBQYXJhU3R5bGUtPlNldFRleHRJbmRlbnQoaW5kZW50KTsNCisgICAgRkRFX0NTU1RFWFRBTElHTiBoQWxnaW4gPSBGREVfQ1NTVEVYVEFMSUdOX0xlZnQ7DQorICAgIHN3aXRjaCAocGFyYS5HZXRIb3Jpem9udGFsQWxpZ24oKSkgew0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQ2VudGVyOg0KKyAgICAgICAgaEFsZ2luID0gRkRFX0NTU1RFWFRBTElHTl9DZW50ZXI7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KKyAgICAgICAgaEFsZ2luID0gRkRFX0NTU1RFWFRBTElHTl9SaWdodDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSnVzdGlmeToNCisgICAgICAgIGhBbGdpbiA9IEZERV9DU1NURVhUQUxJR05fSnVzdGlmeTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSnVzdGlmeUFsbDoNCisgICAgICAgIGhBbGdpbiA9IEZERV9DU1NURVhUQUxJR05fSnVzdGlmeUFsbDsNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHBQYXJhU3R5bGUtPlNldFRleHRBbGlnbihoQWxnaW4pOw0KKyAgICBGREVfQ1NTUkVDVCBydE1hcmdpbldpZHRoOw0KKyAgICBydE1hcmdpbldpZHRoLmxlZnQuU2V0KEZERV9DU1NMRU5HVEhVTklUX1BvaW50LCBwYXJhLkdldE1hcmdpbkxlZnQoKSk7DQorICAgIHJ0TWFyZ2luV2lkdGgudG9wLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgcGFyYS5HZXRTcGFjZUFib3ZlKCkpOw0KKyAgICBydE1hcmdpbldpZHRoLnJpZ2h0LlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgcGFyYS5HZXRNYXJnaW5SaWdodCgpKTsNCisgICAgcnRNYXJnaW5XaWR0aC5ib3R0b20uU2V0KEZERV9DU1NMRU5HVEhVTklUX1BvaW50LCBwYXJhLkdldFNwYWNlQmVsb3coKSk7DQorICAgIHBTdHlsZS0+R2V0Qm91bmRhcnlTdHlsZXMoKS0+U2V0TWFyZ2luV2lkdGgocnRNYXJnaW5XaWR0aCk7DQorICB9DQorICBpZiAoZm9udC5Jc0V4aXN0SW5YTUwoKSkgew0KKyAgICBwRm9udFN0eWxlLT5TZXRDb2xvcihmb250LkdldENvbG9yKCkpOw0KKyAgICBwRm9udFN0eWxlLT5TZXRGb250U3R5bGUoZm9udC5Jc0l0YWxpYygpID8gRkRFX0NTU0ZPTlRTVFlMRV9JdGFsaWMNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZERV9DU1NGT05UU1RZTEVfTm9ybWFsKTsNCisgICAgcEZvbnRTdHlsZS0+U2V0Rm9udFdlaWdodChmb250LklzQm9sZCgpID8gRlhGT05UX0ZXX0JPTEQNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhGT05UX0ZXX05PUk1BTCk7DQorICAgIHBQYXJhU3R5bGUtPlNldE51bWJlclZlcnRpY2FsQWxpZ24oLWZvbnQuR2V0QmFzZWxpbmVTaGlmdCgpKTsNCisgICAgZkZvbnRTaXplID0gZm9udC5HZXRGb250U2l6ZSgpOw0KKyAgICBGREVfQ1NTTEVOR1RIIGxldHRlclNwYWNpbmc7DQorICAgIGxldHRlclNwYWNpbmcuU2V0KEZERV9DU1NMRU5HVEhVTklUX1BvaW50LCBmb250LkdldExldHRlclNwYWNpbmcoKSk7DQorICAgIHBQYXJhU3R5bGUtPlNldExldHRlclNwYWNpbmcobGV0dGVyU3BhY2luZyk7DQorICAgIEZYX0RXT1JEIGR3RGVjb3JhdGlvbiA9IDA7DQorICAgIGlmIChmb250LkdldExpbmVUaHJvdWdoKCkgPiAwKSB7DQorICAgICAgZHdEZWNvcmF0aW9uIHw9IEZERV9DU1NURVhUREVDT1JBVElPTl9MaW5lVGhyb3VnaDsNCisgICAgfQ0KKyAgICBpZiAoZm9udC5HZXRVbmRlcmxpbmUoKSA+IDEpIHsNCisgICAgICBkd0RlY29yYXRpb24gfD0gRkRFX0NTU1RFWFRERUNPUkFUSU9OX0RvdWJsZTsNCisgICAgfSBlbHNlIGlmIChmb250LkdldFVuZGVybGluZSgpID4gMCkgew0KKyAgICAgIGR3RGVjb3JhdGlvbiB8PSBGREVfQ1NTVEVYVERFQ09SQVRJT05fVW5kZXJsaW5lOw0KKyAgICB9DQorICAgIHBQYXJhU3R5bGUtPlNldFRleHREZWNvcmF0aW9uKGR3RGVjb3JhdGlvbik7DQorICB9DQorICBwUGFyYVN0eWxlLT5TZXRMaW5lSGVpZ2h0KGZMaW5lSGVpZ2h0KTsNCisgIHBGb250U3R5bGUtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7DQorICByZXR1cm4gcFN0eWxlOw0KK30NCitJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIENYRkFfVGV4dFBhcnNlcjo6Q3JlYXRlU3R5bGUoDQorICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFBhcmVudFN0eWxlKSB7DQorICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBOZXdTdHlsZSA9DQorICAgICAgbV9wU2VsZWN0b3ItPkNyZWF0ZUNvbXB1dGVkU3R5bGUocFBhcmVudFN0eWxlKTsNCisgIEZYU1lTX2Fzc2VydChwTmV3U3R5bGUgIT0gTlVMTCk7DQorICBpZiAocFBhcmVudFN0eWxlKSB7DQorICAgIElGREVfQ1NTUGFyYWdyYXBoU3R5bGUqIHBQYXJhU3R5bGUgPSBwUGFyZW50U3R5bGUtPkdldFBhcmFncmFwaFN0eWxlcygpOw0KKyAgICBGWF9EV09SRCBkd0RlY29yYXRpb24gPSBwUGFyYVN0eWxlLT5HZXRUZXh0RGVjb3JhdGlvbigpOw0KKyAgICBGWF9GTE9BVCBmQmFzZUxpbmUgPSAwOw0KKyAgICBpZiAocFBhcmFTdHlsZS0+R2V0VmVydGljYWxBbGlnbigpID09IEZERV9DU1NWRVJUSUNBTEFMSUdOX051bWJlcikgew0KKyAgICAgIGZCYXNlTGluZSA9IHBQYXJhU3R5bGUtPkdldE51bWJlclZlcnRpY2FsQWxpZ24oKTsNCisgICAgfQ0KKyAgICBwUGFyYVN0eWxlID0gcE5ld1N0eWxlLT5HZXRQYXJhZ3JhcGhTdHlsZXMoKTsNCisgICAgcFBhcmFTdHlsZS0+U2V0VGV4dERlY29yYXRpb24oZHdEZWNvcmF0aW9uKTsNCisgICAgcFBhcmFTdHlsZS0+U2V0TnVtYmVyVmVydGljYWxBbGlnbihmQmFzZUxpbmUpOw0KKyAgICBJRkRFX0NTU0JvdW5kYXJ5U3R5bGUqIHBCb3VuZGFyeXR5bGUgPSBwUGFyZW50U3R5bGUtPkdldEJvdW5kYXJ5U3R5bGVzKCk7DQorICAgIGNvbnN0IEZERV9DU1NSRUNUKiBwUmVjdCA9IHBCb3VuZGFyeXR5bGUtPkdldE1hcmdpbldpZHRoKCk7DQorICAgIGlmIChwUmVjdCAhPSBOVUxMKSB7DQorICAgICAgcEJvdW5kYXJ5dHlsZSA9IHBOZXdTdHlsZS0+R2V0Qm91bmRhcnlTdHlsZXMoKTsNCisgICAgICBwQm91bmRhcnl0eWxlLT5TZXRNYXJnaW5XaWR0aCgqcFJlY3QpOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gcE5ld1N0eWxlOw0KK30NCitJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIENYRkFfVGV4dFBhcnNlcjo6Q29tcHV0ZVN0eWxlKA0KKyAgICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlLA0KKyAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBQYXJlbnRTdHlsZSkgew0KKyAgQ1hGQV9UZXh0UGFyc2VDb250ZXh0KiBwQ29udGV4dCA9IHN0YXRpY19jYXN0PENYRkFfVGV4dFBhcnNlQ29udGV4dCo+KA0KKyAgICAgIG1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0LkdldFZhbHVlQXQocFhNTE5vZGUpKTsNCisgIGlmICghcENvbnRleHQpDQorICAgIHJldHVybiBudWxscHRyOw0KKyAgcENvbnRleHQtPm1fcFBhcmVudFN0eWxlID0gcFBhcmVudFN0eWxlOw0KKyAgcFBhcmVudFN0eWxlLT5BZGRSZWYoKTsNCisgIENYRkFfQ1NTVGFnUHJvdmlkZXIgdGFnUHJvdmlkZXI7DQorICBQYXJzZVRhZ0luZm8ocFhNTE5vZGUsIHRhZ1Byb3ZpZGVyKTsNCisgIGlmICh0YWdQcm92aWRlci5tX2JDb250ZW50KQ0KKyAgICByZXR1cm4gbnVsbHB0cjsNCisgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlID0gQ3JlYXRlU3R5bGUocFBhcmVudFN0eWxlKTsNCisgIElGREVfQ1NTQWNjZWxlcmF0b3IqIHBDU1NBY2NlbCA9IG1fcFNlbGVjdG9yLT5Jbml0QWNjZWxlcmF0b3IoKTsNCisgIHBDU1NBY2NlbC0+T25FbnRlclRhZygmdGFnUHJvdmlkZXIpOw0KKyAgbV9wU2VsZWN0b3ItPkNvbXB1dGVTdHlsZSgmdGFnUHJvdmlkZXIsIHBDb250ZXh0LT5HZXREZWNscygpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+Q291bnREZWNscygpLCBwU3R5bGUpOw0KKyAgcENTU0FjY2VsLT5PbkxlYXZlVGFnKCZ0YWdQcm92aWRlcik7DQorICByZXR1cm4gcFN0eWxlOw0KK30NCit2b2lkIENYRkFfVGV4dFBhcnNlcjo6RG9QYXJzZShJRkRFX1hNTE5vZGUqIHBYTUxDb250YWluZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIpIHsNCisgIGlmIChwWE1MQ29udGFpbmVyID09IE5VTEwgfHwgcFRleHRQcm92aWRlciA9PSBOVUxMIHx8IG1fcEFsbG9jYXRvciAhPSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIG1fcEFsbG9jYXRvciA9DQorICAgICAgRlhfQ3JlYXRlQWxsb2NhdG9yKEZYX0FMTE9DVFlQRV9GaXhlZCwgMzIsIHNpemVvZihDWEZBX0NTU1RhZ1Byb3ZpZGVyKSk7DQorICBJbml0Q1NTRGF0YShwVGV4dFByb3ZpZGVyKTsNCisgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFJvb3RTdHlsZSA9IENyZWF0ZVJvb3RTdHlsZShwVGV4dFByb3ZpZGVyKTsNCisgIFBhcnNlUmljaFRleHQocFhNTENvbnRhaW5lciwgcFJvb3RTdHlsZSk7DQorICBwUm9vdFN0eWxlLT5SZWxlYXNlKCk7DQorfQ0KK3ZvaWQgQ1hGQV9UZXh0UGFyc2VyOjpQYXJzZVJpY2hUZXh0KElGREVfWE1MTm9kZSogcFhNTE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwUGFyZW50U3R5bGUpIHsNCisgIGlmIChwWE1MTm9kZSA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfQ1NTVGFnUHJvdmlkZXIgdGFnUHJvdmlkZXI7DQorICBQYXJzZVRhZ0luZm8ocFhNTE5vZGUsIHRhZ1Byb3ZpZGVyKTsNCisgIGlmICghdGFnUHJvdmlkZXIubV9iVGFnQXZpbGlhYmxlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcE5ld1N0eWxlID0gTlVMTDsNCisgIGlmICgodGFnUHJvdmlkZXIuR2V0VGFnTmFtZSgpICE9IEZYX1dTVFJDKEwiYm9keSIpKSB8fA0KKyAgICAgICh0YWdQcm92aWRlci5HZXRUYWdOYW1lKCkgIT0gRlhfV1NUUkMoTCJodG1sIikpKSB7DQorICAgIENYRkFfVGV4dFBhcnNlQ29udGV4dCogcFRleHRDb250ZXh0ID0NCisgICAgICAgIEZERV9OZXdXaXRoKG1fcEFsbG9jYXRvcikgQ1hGQV9UZXh0UGFyc2VDb250ZXh0Ow0KKyAgICBGREVfQ1NTRElTUExBWSBlRGlzcGxheSA9IEZERV9DU1NESVNQTEFZX0lubGluZTsNCisgICAgaWYgKCF0YWdQcm92aWRlci5tX2JDb250ZW50KSB7DQorICAgICAgcE5ld1N0eWxlID0gQ3JlYXRlU3R5bGUocFBhcmVudFN0eWxlKTsNCisgICAgICBJRkRFX0NTU0FjY2VsZXJhdG9yKiBwQ1NTQWNjZWwgPSBtX3BTZWxlY3Rvci0+SW5pdEFjY2VsZXJhdG9yKCk7DQorICAgICAgcENTU0FjY2VsLT5PbkVudGVyVGFnKCZ0YWdQcm92aWRlcik7DQorICAgICAgQ0ZERV9DU1NEZWNsYXJhdGlvbkFycmF5IERlY2xBcnJheTsNCisgICAgICBpbnQzMl90IGlNYXRjaGVkRGVjbHMgPQ0KKyAgICAgICAgICBtX3BTZWxlY3Rvci0+TWF0Y2hEZWNsYXJhdGlvbnMoJnRhZ1Byb3ZpZGVyLCBEZWNsQXJyYXkpOw0KKyAgICAgIGNvbnN0IElGREVfQ1NTRGVjbGFyYXRpb24qKiBwcE1hdGNoRGVjbHMgPQ0KKyAgICAgICAgICAoY29uc3QgSUZERV9DU1NEZWNsYXJhdGlvbioqKURlY2xBcnJheS5HZXREYXRhKCk7DQorICAgICAgbV9wU2VsZWN0b3ItPkNvbXB1dGVTdHlsZSgmdGFnUHJvdmlkZXIsIHBwTWF0Y2hEZWNscywgaU1hdGNoZWREZWNscywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXdTdHlsZSk7DQorICAgICAgcENTU0FjY2VsLT5PbkxlYXZlVGFnKCZ0YWdQcm92aWRlcik7DQorICAgICAgaWYgKGlNYXRjaGVkRGVjbHMgPiAwKSB7DQorICAgICAgICBwVGV4dENvbnRleHQtPlNldERlY2xzKHBwTWF0Y2hEZWNscywgaU1hdGNoZWREZWNscyk7DQorICAgICAgfQ0KKyAgICAgIGVEaXNwbGF5ID0gcE5ld1N0eWxlLT5HZXRQb3NpdGlvblN0eWxlcygpLT5HZXREaXNwbGF5KCk7DQorICAgIH0NCisgICAgcFRleHRDb250ZXh0LT5TZXREaXNwbGF5KGVEaXNwbGF5KTsNCisgICAgbV9tYXBYTUxOb2RlVG9QYXJzZUNvbnRleHQuU2V0QXQocFhNTE5vZGUsIHBUZXh0Q29udGV4dCk7DQorICB9DQorICBmb3IgKElGREVfWE1MTm9kZSogcFhNTENoaWxkID0NCisgICAgICAgICAgIHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOw0KKyAgICAgICBwWE1MQ2hpbGQ7DQorICAgICAgIHBYTUxDaGlsZCA9IHBYTUxDaGlsZC0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgUGFyc2VSaWNoVGV4dChwWE1MQ2hpbGQsIHBOZXdTdHlsZSk7DQorICB9DQorICBpZiAocE5ld1N0eWxlICE9IE5VTEwpIHsNCisgICAgcE5ld1N0eWxlLT5SZWxlYXNlKCk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9UZXh0UGFyc2VyOjpQYXJzZVRhZ0luZm8oSUZERV9YTUxOb2RlKiBwWE1MTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfQ1NTVGFnUHJvdmlkZXImIHRhZ1Byb3ZpZGVyKSB7DQorICBzdGF0aWMgY29uc3QgRlhfRFdPUkQgc19YRkFUYWdOYW1lW10gPSB7DQorICAgICAgMHg2MSwgICAgICAgMHg2MiwgICAgICAgMHg2OSwgICAgICAgMHg3MCwgICAgICAgMHgwMDAxZjcxNCwNCisgICAgICAweDAwMDIyYTU1LCAweDAwMDIzOWJiLCAweDAwMDI1ODgxLCAweDBiZDM3ZmFhLCAweDBiZDM3ZmI4LA0KKyAgICAgIDB4YTczZTNhZjIsIDB4YjE4MmVhYWUsIDB4ZGI4YWM0NTUsDQorICB9Ow0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOw0KKyAgaWYgKHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICBJRkRFX1hNTEVsZW1lbnQqIHBYTUxFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCopcFhNTE5vZGU7DQorICAgIHBYTUxFbGVtZW50LT5HZXRMb2NhbFRhZ05hbWUod3NOYW1lKTsNCisgICAgdGFnUHJvdmlkZXIuU2V0VGFnTmFtZU9iaih3c05hbWUpOw0KKyAgICBGWF9EV09SRCBkd0hhc2hDb2RlID0NCisgICAgICAgIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTmFtZSwgd3NOYW1lLkdldExlbmd0aCgpLCBUUlVFKTsNCisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qgc19pQ291bnQgPSBzaXplb2Yoc19YRkFUYWdOYW1lKSAvIHNpemVvZihGWF9EV09SRCk7DQorICAgIENGWF9EU1BBVGVtcGxhdGU8RlhfRFdPUkQ+IGxvb2t1cDsNCisgICAgdGFnUHJvdmlkZXIubV9iVGFnQXZpbGlhYmxlID0NCisgICAgICAgIGxvb2t1cC5Mb29rdXAoZHdIYXNoQ29kZSwgc19YRkFUYWdOYW1lLCBzX2lDb3VudCkgPiAtMTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgICAgcFhNTEVsZW1lbnQtPkdldFN0cmluZyhGWF9XU1RSQyhMInN0eWxlIikuR2V0UHRyKCksIHdzVmFsdWUpOw0KKyAgICBpZiAoIXdzVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgdGFnUHJvdmlkZXIuU2V0QXR0cmlidXRlKEZYX1dTVFJDKEwic3R5bGUiKSwgd3NWYWx1ZSk7DQorICAgIH0NCisgIH0gZWxzZSBpZiAocFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9UZXh0KSB7DQorICAgIHRhZ1Byb3ZpZGVyLm1fYlRhZ0F2aWxpYWJsZSA9IFRSVUU7DQorICAgIHRhZ1Byb3ZpZGVyLm1fYkNvbnRlbnQgPSBUUlVFOw0KKyAgfQ0KK30NCitpbnQzMl90IENYRkFfVGV4dFBhcnNlcjo6R2V0VkFsZ2luKElYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyKSBjb25zdCB7DQorICBpbnQzMl90IGlBbGlnbiA9IFhGQV9BVFRSSUJVVEVFTlVNX1RvcDsNCisgIENYRkFfUGFyYSBwYXJhID0gcFRleHRQcm92aWRlci0+R2V0UGFyYU5vZGUoKTsNCisgIGlmIChwYXJhLklzRXhpc3RJblhNTCgpKSB7DQorICAgIGlBbGlnbiA9IHBhcmEuR2V0VmVydGljYWxBbGlnbigpOw0KKyAgfQ0KKyAgcmV0dXJuIGlBbGlnbjsNCit9DQorRlhfRkxPQVQgQ1hGQV9UZXh0UGFyc2VyOjpHZXRUYWJJbnRlcnZhbChJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSkgY29uc3Qgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgIGlmIChwU3R5bGUgJiYgcFN0eWxlLT5HZXRDdXN0b21TdHlsZShGWF9XU1RSQyhMInRhYi1pbnRlcnZhbCIpLCB3c1ZhbHVlKSkgew0KKyAgICBDWEZBX01lYXN1cmVtZW50IG1zKHdzVmFsdWUpOw0KKyAgICByZXR1cm4gbXMuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgIH0NCisgIHJldHVybiAzNjsNCit9DQoraW50MzJfdCBDWEZBX1RleHRQYXJzZXI6OkNvdW50VGFicyhJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSkgY29uc3Qgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgIGlmIChwU3R5bGUgJiYgcFN0eWxlLT5HZXRDdXN0b21TdHlsZShGWF9XU1RSQyhMInhmYS10YWItY291bnQiKSwgd3NWYWx1ZSkpIHsNCisgICAgcmV0dXJuIHdzVmFsdWUuR2V0SW50ZWdlcigpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9UZXh0UGFyc2VyOjpJc1NwYWNlUnVuKElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlKSBjb25zdCB7DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgaWYgKHBTdHlsZSAmJiBwU3R5bGUtPkdldEN1c3RvbVN0eWxlKEZYX1dTVFJDKEwieGZhLXNwYWNlcnVuIiksIHdzVmFsdWUpKSB7DQorICAgIHdzVmFsdWUuTWFrZUxvd2VyKCk7DQorICAgIHJldHVybiB3c1ZhbHVlID09IEZYX1dTVFJDKEwieWVzIik7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0lGWF9Gb250KiBDWEZBX1RleHRQYXJzZXI6OkdldEZvbnQoSVhGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSkgY29uc3Qgew0KKyAgQ0ZYX1dpZGVTdHJpbmdDIHdzRmFtaWx5ID0gRlhfV1NUUkMoTCJDb3VyaWVyIik7DQorICBGWF9EV09SRCBkd1N0eWxlID0gMDsNCisgIENYRkFfRm9udCBmb250ID0gcFRleHRQcm92aWRlci0+R2V0Rm9udE5vZGUoKTsNCisgIGlmIChmb250LklzRXhpc3RJblhNTCgpKSB7DQorICAgIGZvbnQuR2V0VHlwZWZhY2Uod3NGYW1pbHkpOw0KKyAgICBpZiAoZm9udC5Jc0JvbGQoKSkgew0KKyAgICAgIGR3U3R5bGUgfD0gRlhfRk9OVFNUWUxFX0JvbGQ7DQorICAgIH0NCisgICAgaWYgKGZvbnQuSXNJdGFsaWMoKSkgew0KKyAgICAgIGR3U3R5bGUgfD0gRlhfRk9OVFNUWUxFX0l0YWxpYzsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHBTdHlsZSkgew0KKyAgICBJRkRFX0NTU0ZvbnRTdHlsZSogcEZvbnRTdHlsZSA9IHBTdHlsZS0+R2V0Rm9udFN0eWxlcygpOw0KKyAgICBpbnQzMl90IGlDb3VudCA9IHBGb250U3R5bGUtPkNvdW50Rm9udEZhbWlsaWVzKCk7DQorICAgIGlmIChpQ291bnQgPiAwKSB7DQorICAgICAgd3NGYW1pbHkgPSBwRm9udFN0eWxlLT5HZXRGb250RmFtaWx5KGlDb3VudCAtIDEpOw0KKyAgICB9DQorICAgIGR3U3R5bGUgPSAwOw0KKyAgICBpZiAocEZvbnRTdHlsZS0+R2V0Rm9udFdlaWdodCgpID4gRlhGT05UX0ZXX05PUk1BTCkgew0KKyAgICAgIGR3U3R5bGUgfD0gRlhfRk9OVFNUWUxFX0JvbGQ7DQorICAgIH0NCisgICAgaWYgKHBGb250U3R5bGUtPkdldEZvbnRTdHlsZSgpID09IEZERV9DU1NGT05UU1RZTEVfSXRhbGljKSB7DQorICAgICAgZHdTdHlsZSB8PSBGWF9GT05UU1RZTEVfSXRhbGljOw0KKyAgICB9DQorICB9DQorICBDWEZBX0ZGRG9jKiBwRG9jID0gcFRleHRQcm92aWRlci0+R2V0RG9jTm9kZSgpOw0KKyAgRlhTWVNfYXNzZXJ0KHBEb2MgIT0gTlVMTCk7DQorICBDWEZBX0ZvbnRNZ3IqIHBGb250TWdyID0gcERvYy0+R2V0QXBwKCktPkdldFhGQUZvbnRNZ3IoKTsNCisgIHJldHVybiBwRm9udE1nci0+R2V0Rm9udChwRG9jLCB3c0ZhbWlseSwgZHdTdHlsZSk7DQorfQ0KK0ZYX0ZMT0FUIENYRkFfVGV4dFBhcnNlcjo6R2V0Rm9udFNpemUoSVhGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSkgY29uc3Qgew0KKyAgaWYgKHBTdHlsZSAhPSBOVUxMKSB7DQorICAgIHJldHVybiBwU3R5bGUtPkdldEZvbnRTdHlsZXMoKS0+R2V0Rm9udFNpemUoKTsNCisgIH0NCisgIENYRkFfRm9udCBmb250ID0gcFRleHRQcm92aWRlci0+R2V0Rm9udE5vZGUoKTsNCisgIGlmIChmb250LklzRXhpc3RJblhNTCgpKSB7DQorICAgIHJldHVybiBmb250LkdldEZvbnRTaXplKCk7DQorICB9DQorICByZXR1cm4gMTA7DQorfQ0KK2ludDMyX3QgQ1hGQV9UZXh0UGFyc2VyOjpHZXRIb3JTY2FsZShJWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUpIGNvbnN0IHsNCisgIGlmIChwU3R5bGUpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgICAgaWYgKHBTdHlsZS0+R2V0Q3VzdG9tU3R5bGUoRlhfV1NUUkMoTCJ4ZmEtZm9udC1ob3Jpem9udGFsLXNjYWxlIiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzVmFsdWUpKSB7DQorICAgICAgcmV0dXJuIHdzVmFsdWUuR2V0SW50ZWdlcigpOw0KKyAgICB9DQorICAgIHdoaWxlIChwWE1MTm9kZSkgew0KKyAgICAgIENYRkFfVGV4dFBhcnNlQ29udGV4dCogcENvbnRleHQgPSBzdGF0aWNfY2FzdDxDWEZBX1RleHRQYXJzZUNvbnRleHQqPigNCisgICAgICAgICAgbV9tYXBYTUxOb2RlVG9QYXJzZUNvbnRleHQuR2V0VmFsdWVBdChwWE1MTm9kZSkpOw0KKyAgICAgIGlmIChwQ29udGV4dCAmJiBwQ29udGV4dC0+bV9wUGFyZW50U3R5bGUgJiYNCisgICAgICAgICAgcENvbnRleHQtPm1fcFBhcmVudFN0eWxlLT5HZXRDdXN0b21TdHlsZSgNCisgICAgICAgICAgICAgIEZYX1dTVFJDKEwieGZhLWZvbnQtaG9yaXpvbnRhbC1zY2FsZSIpLCB3c1ZhbHVlKSkgew0KKyAgICAgICAgcmV0dXJuIHdzVmFsdWUuR2V0SW50ZWdlcigpOw0KKyAgICAgIH0NCisgICAgICBwWE1MTm9kZSA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OlBhcmVudCk7DQorICAgIH0NCisgIH0NCisgIGlmIChDWEZBX0ZvbnQgZm9udCA9IHBUZXh0UHJvdmlkZXItPkdldEZvbnROb2RlKCkpIHsNCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KGZvbnQuR2V0SG9yaXpvbnRhbFNjYWxlKCkpOw0KKyAgfQ0KKyAgcmV0dXJuIDEwMDsNCit9DQoraW50MzJfdCBDWEZBX1RleHRQYXJzZXI6OkdldFZlclNjYWxlKElYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSkgY29uc3Qgew0KKyAgaWYgKHBTdHlsZSAhPSBOVUxMKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICAgIGlmIChwU3R5bGUtPkdldEN1c3RvbVN0eWxlKEZYX1dTVFJDKEwieGZhLWZvbnQtdmVydGljYWwtc2NhbGUiKSwgd3NWYWx1ZSkpIHsNCisgICAgICByZXR1cm4gd3NWYWx1ZS5HZXRJbnRlZ2VyKCk7DQorICAgIH0NCisgIH0NCisgIGlmIChDWEZBX0ZvbnQgZm9udCA9IHBUZXh0UHJvdmlkZXItPkdldEZvbnROb2RlKCkpIHsNCisgICAgcmV0dXJuIChpbnQzMl90KWZvbnQuR2V0VmVydGljYWxTY2FsZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIDEwMDsNCit9DQordm9pZCBDWEZBX1RleHRQYXJzZXI6OkdldFVuZGVybGluZShJWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVVuZGVybGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlQZXJpb2QpIGNvbnN0IHsNCisgIGlVbmRlcmxpbmUgPSAwOw0KKyAgaVBlcmlvZCA9IFhGQV9BVFRSSUJVVEVFTlVNX0FsbDsNCisgIGlmIChwU3R5bGUpIHsNCisgICAgRlhfRFdPUkQgZHdEZWNvcmF0aW9uID0gcFN0eWxlLT5HZXRQYXJhZ3JhcGhTdHlsZXMoKS0+R2V0VGV4dERlY29yYXRpb24oKTsNCisgICAgaWYgKGR3RGVjb3JhdGlvbiAmIEZERV9DU1NURVhUREVDT1JBVElPTl9Eb3VibGUpIHsNCisgICAgICBpVW5kZXJsaW5lID0gMjsNCisgICAgfSBlbHNlIGlmIChkd0RlY29yYXRpb24gJiBGREVfQ1NTVEVYVERFQ09SQVRJT05fVW5kZXJsaW5lKSB7DQorICAgICAgaVVuZGVybGluZSA9IDE7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgICAgaWYgKHBTdHlsZS0+R2V0Q3VzdG9tU3R5bGUoRlhfV1NUUkMoTCJ1bmRlcmxpbmVQZXJpb2QiKSwgd3NWYWx1ZSkpIHsNCisgICAgICBpZiAod3NWYWx1ZSA9PSBGWF9XU1RSQyhMIndvcmQiKSkgew0KKyAgICAgICAgaVBlcmlvZCA9IFhGQV9BVFRSSUJVVEVFTlVNX1dvcmQ7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKENYRkFfRm9udCBmb250ID0gcFRleHRQcm92aWRlci0+R2V0Rm9udE5vZGUoKSkgew0KKyAgICAgIGlQZXJpb2QgPSBmb250LkdldFVuZGVybGluZVBlcmlvZCgpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZvbnQgZm9udCA9IHBUZXh0UHJvdmlkZXItPkdldEZvbnROb2RlKCk7DQorICAgIGlmIChmb250LklzRXhpc3RJblhNTCgpKSB7DQorICAgICAgaVVuZGVybGluZSA9IGZvbnQuR2V0VW5kZXJsaW5lKCk7DQorICAgICAgaVBlcmlvZCA9IGZvbnQuR2V0VW5kZXJsaW5lUGVyaW9kKCk7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDWEZBX1RleHRQYXJzZXI6OkdldExpbmV0aHJvdWdoKElYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUxpbmV0aHJvdWdoKSBjb25zdCB7DQorICBpZiAocFN0eWxlKSB7DQorICAgIEZYX0RXT1JEIGR3RGVjb3JhdGlvbiA9IHBTdHlsZS0+R2V0UGFyYWdyYXBoU3R5bGVzKCktPkdldFRleHREZWNvcmF0aW9uKCk7DQorICAgIGlMaW5ldGhyb3VnaCA9IChkd0RlY29yYXRpb24gJiBGREVfQ1NTVEVYVERFQ09SQVRJT05fTGluZVRocm91Z2gpID8gMSA6IDA7DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZvbnQgZm9udCA9IHBUZXh0UHJvdmlkZXItPkdldEZvbnROb2RlKCk7DQorICAgIGlmIChmb250LklzRXhpc3RJblhNTCgpKSB7DQorICAgICAgaUxpbmV0aHJvdWdoID0gZm9udC5HZXRMaW5lVGhyb3VnaCgpOw0KKyAgICB9DQorICB9DQorfQ0KK0ZYX0FSR0IgQ1hGQV9UZXh0UGFyc2VyOjpHZXRDb2xvcihJWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUpIGNvbnN0IHsNCisgIGlmIChwU3R5bGUgIT0gTlVMTCkgew0KKyAgICByZXR1cm4gcFN0eWxlLT5HZXRGb250U3R5bGVzKCktPkdldENvbG9yKCk7DQorICB9DQorICBpZiAoQ1hGQV9Gb250IGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250Tm9kZSgpKSB7DQorICAgIHJldHVybiBmb250LkdldENvbG9yKCk7DQorICB9DQorICByZXR1cm4gMHhGRjAwMDAwMDsNCit9DQorRlhfRkxPQVQgQ1hGQV9UZXh0UGFyc2VyOjpHZXRCYXNlbGluZShJWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlKSBjb25zdCB7DQorICBpZiAocFN0eWxlICE9IE5VTEwpIHsNCisgICAgSUZERV9DU1NQYXJhZ3JhcGhTdHlsZSogcFBhcmFTdHlsZSA9IHBTdHlsZS0+R2V0UGFyYWdyYXBoU3R5bGVzKCk7DQorICAgIGlmIChwUGFyYVN0eWxlLT5HZXRWZXJ0aWNhbEFsaWduKCkgPT0gRkRFX0NTU1ZFUlRJQ0FMQUxJR05fTnVtYmVyKSB7DQorICAgICAgcmV0dXJuIHBQYXJhU3R5bGUtPkdldE51bWJlclZlcnRpY2FsQWxpZ24oKTsNCisgICAgfQ0KKyAgfSBlbHNlIGlmIChDWEZBX0ZvbnQgZm9udCA9IHBUZXh0UHJvdmlkZXItPkdldEZvbnROb2RlKCkpIHsNCisgICAgcmV0dXJuIGZvbnQuR2V0QmFzZWxpbmVTaGlmdCgpOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KK0ZYX0ZMT0FUIENYRkFfVGV4dFBhcnNlcjo6R2V0TGluZUhlaWdodChJWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpcnN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVmVyU2NhbGUpIGNvbnN0IHsNCisgIEZYX0ZMT0FUIGZMaW5lSGVpZ2h0ID0gMDsNCisgIGlmIChwU3R5bGUgIT0gTlVMTCkgew0KKyAgICBmTGluZUhlaWdodCA9IHBTdHlsZS0+R2V0UGFyYWdyYXBoU3R5bGVzKCktPkdldExpbmVIZWlnaHQoKTsNCisgIH0gZWxzZSBpZiAoQ1hGQV9QYXJhIHBhcmEgPSBwVGV4dFByb3ZpZGVyLT5HZXRQYXJhTm9kZSgpKSB7DQorICAgIGZMaW5lSGVpZ2h0ID0gcGFyYS5HZXRMaW5lSGVpZ2h0KCk7DQorICB9DQorICBpZiAoYkZpcnN0KSB7DQorICAgIEZYX0ZMT0FUIGZGb250U2l6ZSA9IEdldEZvbnRTaXplKHBUZXh0UHJvdmlkZXIsIHBTdHlsZSk7DQorICAgIGlmIChmTGluZUhlaWdodCA8IDAuMWYpIHsNCisgICAgICBmTGluZUhlaWdodCA9IGZGb250U2l6ZTsNCisgICAgfSBlbHNlIHsNCisgICAgICBmTGluZUhlaWdodCA9IHN0ZDo6bWluKGZMaW5lSGVpZ2h0LCBmRm9udFNpemUpOw0KKyAgICB9DQorICB9IGVsc2UgaWYgKGZMaW5lSGVpZ2h0IDwgMC4xZikgew0KKyAgICBmTGluZUhlaWdodCA9IEdldEZvbnRTaXplKHBUZXh0UHJvdmlkZXIsIHBTdHlsZSkgKiAxLjJmOw0KKyAgfQ0KKyAgZkxpbmVIZWlnaHQgKj0gZlZlclNjYWxlOw0KKyAgcmV0dXJuIGZMaW5lSGVpZ2h0Ow0KK30NCitGWF9CT09MIENYRkFfVGV4dFBhcnNlcjo6R2V0RW1iYmVkT2JqKElYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKSB7DQorICB3c1ZhbHVlLkVtcHR5KCk7DQorICBpZiAocFhNTE5vZGUgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWF9CT09MIGJSZXQgPSBGQUxTRTsNCisgIGlmIChwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgSUZERV9YTUxFbGVtZW50KiBwRWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQqKXBYTUxOb2RlOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHI7DQorICAgIHBFbGVtZW50LT5HZXRTdHJpbmcoRlhfV1NUUkMoTCJ4ZmE6ZW1iZWQiKS5HZXRQdHIoKSwgd3NBdHRyKTsNCisgICAgaWYgKHdzQXR0ci5Jc0VtcHR5KCkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKHdzQXR0ci5HZXRBdCgwKSA9PSBMJyMnKSB7DQorICAgICAgd3NBdHRyLkRlbGV0ZSgwKTsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3czsNCisgICAgcEVsZW1lbnQtPkdldFN0cmluZyhGWF9XU1RSQyhMInhmYTplbWJlZFR5cGUiKS5HZXRQdHIoKSwgd3MpOw0KKyAgICBpZiAod3MuSXNFbXB0eSgpKSB7DQorICAgICAgd3MgPSBMInNvbSI7DQorICAgIH0gZWxzZSB7DQorICAgICAgd3MuTWFrZUxvd2VyKCk7DQorICAgIH0NCisgICAgRlhfQk9PTCBiVVJJID0gKHdzID09IEZYX1dTVFJDKEwidXJpIikpOw0KKyAgICBpZiAoIWJVUkkgJiYgd3MgIT0gRlhfV1NUUkMoTCJzb20iKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB3cy5FbXB0eSgpOw0KKyAgICBwRWxlbWVudC0+R2V0U3RyaW5nKEZYX1dTVFJDKEwieGZhOmVtYmVkTW9kZSIpLkdldFB0cigpLCB3cyk7DQorICAgIGlmICh3cy5Jc0VtcHR5KCkpIHsNCisgICAgICB3cyA9IEwiZm9ybWF0dGVkIjsNCisgICAgfSBlbHNlIHsNCisgICAgICB3cy5NYWtlTG93ZXIoKTsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJSYXcgPSAod3MgPT0gRlhfV1NUUkMoTCJyYXciKSk7DQorICAgIGlmICghYlJhdyAmJiB3cyAhPSBGWF9XU1RSQyhMImZvcm1hdHRlZCIpKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGJSZXQgPSBwVGV4dFByb3ZpZGVyLT5HZXRFbWJiZWRPYmooYlVSSSwgYlJhdywgd3NBdHRyLCB3c1ZhbHVlKTsNCisgIH0NCisgIHJldHVybiBiUmV0Ow0KK30NCitDWEZBX1RleHRQYXJzZUNvbnRleHQqIENYRkFfVGV4dFBhcnNlcjo6R2V0UGFyc2VDb250ZXh0RnJvbU1hcCgNCisgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSkgew0KKyAgcmV0dXJuIChDWEZBX1RleHRQYXJzZUNvbnRleHQqKW1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0LkdldFZhbHVlQXQoDQorICAgICAgcFhNTE5vZGUpOw0KK30NCitlbnVtIFhGQV9UQUJTVE9QU1NUQVRVUyB7DQorICBYRkFfVEFCU1RPUFNTVEFUVVNfRXJyb3IsDQorICBYRkFfVEFCU1RPUFNTVEFUVVNfRU9TLA0KKyAgWEZBX1RBQlNUT1BTU1RBVFVTX05vbmUsDQorICBYRkFfVEFCU1RPUFNTVEFUVVNfQWxpZ25tZW50LA0KKyAgWEZBX1RBQlNUT1BTU1RBVFVTX1N0YXJ0TGVhZGVyLA0KKyAgWEZBX1RBQlNUT1BTU1RBVFVTX0xlYWRlciwNCisgIFhGQV9UQUJTVE9QU1NUQVRVU19Mb2NhdGlvbiwNCit9Ow0KK0ZYX0JPT0wgQ1hGQV9UZXh0UGFyc2VyOjpHZXRUYWJzdG9wcygNCisgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUsDQorICAgIENYRkFfVGV4dFRhYnN0b3BzQ29udGV4dCogcFRhYnN0b3BDb250ZXh0KSB7DQorICBpZiAocFN0eWxlID09IE5VTEwgfHwgcFRhYnN0b3BDb250ZXh0ID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgIGlmICghcFN0eWxlLT5HZXRDdXN0b21TdHlsZShGWF9XU1RSQyhMInhmYS10YWItc3RvcHMiKSwgd3NWYWx1ZSkgJiYNCisgICAgICAhcFN0eWxlLT5HZXRDdXN0b21TdHlsZShGWF9XU1RSQyhMInRhYi1zdG9wcyIpLCB3c1ZhbHVlKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpbnQzMl90IGlMZW5ndGggPSB3c1ZhbHVlLkdldExlbmd0aCgpOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBUYWJTdG9wcyA9IHdzVmFsdWU7DQorICBpbnQzMl90IGlDdXIgPSAwOw0KKyAgaW50MzJfdCBpTGFzdCA9IDA7DQorICBDRlhfV2lkZVN0cmluZyB3c0FsaWduOw0KKyAgWEZBX1RBQlNUT1BTU1RBVFVTIGVTdGF0dXMgPSBYRkFfVEFCU1RPUFNTVEFUVVNfTm9uZTsNCisgIEZYX1dDSEFSIGNoOw0KKyAgd2hpbGUgKGlDdXIgPCBpTGVuZ3RoKSB7DQorICAgIGNoID0gcFRhYlN0b3BzW2lDdXJdOw0KKyAgICBzd2l0Y2ggKGVTdGF0dXMpIHsNCisgICAgICBjYXNlIFhGQV9UQUJTVE9QU1NUQVRVU19Ob25lOg0KKyAgICAgICAgaWYgKGNoIDw9ICcgJykgew0KKyAgICAgICAgICBpQ3VyKys7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBlU3RhdHVzID0gWEZBX1RBQlNUT1BTU1RBVFVTX0FsaWdubWVudDsNCisgICAgICAgICAgaUxhc3QgPSBpQ3VyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfVEFCU1RPUFNTVEFUVVNfQWxpZ25tZW50Og0KKyAgICAgICAgaWYgKGNoID09ICcgJykgew0KKyAgICAgICAgICB3c0FsaWduID0gQ0ZYX1dpZGVTdHJpbmdDKHBUYWJTdG9wcyArIGlMYXN0LCBpQ3VyIC0gaUxhc3QpOw0KKyAgICAgICAgICBlU3RhdHVzID0gWEZBX1RBQlNUT1BTU1RBVFVTX1N0YXJ0TGVhZGVyOw0KKyAgICAgICAgICBpQ3VyKys7DQorICAgICAgICAgIHdoaWxlIChpQ3VyIDwgaUxlbmd0aCAmJiBwVGFiU3RvcHNbaUN1cl0gPD0gJyAnKSB7DQorICAgICAgICAgICAgaUN1cisrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlMYXN0ID0gaUN1cjsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGlDdXIrKzsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX1RBQlNUT1BTU1RBVFVTX1N0YXJ0TGVhZGVyOg0KKyAgICAgICAgaWYgKGNoICE9ICdsJykgew0KKyAgICAgICAgICBlU3RhdHVzID0gWEZBX1RBQlNUT1BTU1RBVFVTX0xvY2F0aW9uOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgaW50MzJfdCBpQ291bnQgPSAwOw0KKyAgICAgICAgICB3aGlsZSAoaUN1ciA8IGlMZW5ndGgpIHsNCisgICAgICAgICAgICBjaCA9IHBUYWJTdG9wc1tpQ3VyXTsNCisgICAgICAgICAgICBpQ3VyKys7DQorICAgICAgICAgICAgaWYgKGNoID09ICcoJykgew0KKyAgICAgICAgICAgICAgaUNvdW50Kys7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnKScpIHsNCisgICAgICAgICAgICAgIGlDb3VudC0tOw0KKyAgICAgICAgICAgICAgaWYgKGlDb3VudCA9PSAwKSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICB3aGlsZSAoaUN1ciA8IGlMZW5ndGggJiYgcFRhYlN0b3BzW2lDdXJdIDw9ICcgJykgew0KKyAgICAgICAgICAgIGlDdXIrKzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpTGFzdCA9IGlDdXI7DQorICAgICAgICAgIGVTdGF0dXMgPSBYRkFfVEFCU1RPUFNTVEFUVVNfTG9jYXRpb247DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9UQUJTVE9QU1NUQVRVU19Mb2NhdGlvbjoNCisgICAgICAgIGlmIChjaCA9PSAnICcpIHsNCisgICAgICAgICAgRlhfRFdPUkQgZHdIYXNoQ29kZSA9DQorICAgICAgICAgICAgICBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c0FsaWduLCB3c0FsaWduLkdldExlbmd0aCgpLCBUUlVFKTsNCisgICAgICAgICAgQ1hGQV9NZWFzdXJlbWVudCBtcyhDRlhfV2lkZVN0cmluZ0MocFRhYlN0b3BzICsgaUxhc3QsIGlDdXIgLSBpTGFzdCkpOw0KKyAgICAgICAgICBGWF9GTE9BVCBmUG9zID0gbXMuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgICAgICAgcFRhYnN0b3BDb250ZXh0LT5BcHBlbmQoZHdIYXNoQ29kZSwgZlBvcyk7DQorICAgICAgICAgIHdzQWxpZ24uRW1wdHkoKTsNCisgICAgICAgICAgZVN0YXR1cyA9IFhGQV9UQUJTVE9QU1NUQVRVU19Ob25lOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaUN1cisrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpZiAoIXdzQWxpZ24uSXNFbXB0eSgpKSB7DQorICAgIEZYX0RXT1JEIGR3SGFzaENvZGUgPQ0KKyAgICAgICAgRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NBbGlnbiwgd3NBbGlnbi5HZXRMZW5ndGgoKSwgVFJVRSk7DQorICAgIENYRkFfTWVhc3VyZW1lbnQgbXMoQ0ZYX1dpZGVTdHJpbmdDKHBUYWJTdG9wcyArIGlMYXN0LCBpQ3VyIC0gaUxhc3QpKTsNCisgICAgRlhfRkxPQVQgZlBvcyA9IG1zLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgIHBUYWJzdG9wQ29udGV4dC0+QXBwZW5kKGR3SGFzaENvZGUsIGZQb3MpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0NYRkFfVGV4dExheW91dDo6Q1hGQV9UZXh0TGF5b3V0KElYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyKQ0KKyAgICA6IG1fYkhhc0Jsb2NrKEZBTFNFKSwNCisgICAgICBtX3BUZXh0UHJvdmlkZXIocFRleHRQcm92aWRlciksDQorICAgICAgbV9wVGV4dERhdGFOb2RlKG51bGxwdHIpLA0KKyAgICAgIG1fYlJpY2hUZXh0KEZBTFNFKSwNCisgICAgICBtX3BBbGxvY2F0b3IobnVsbHB0ciksDQorICAgICAgbV9wQnJlYWsobnVsbHB0ciksDQorICAgICAgbV9wTG9hZGVyKG51bGxwdHIpLA0KKyAgICAgIG1faUxpbmVzKDApLA0KKyAgICAgIG1fZk1heFdpZHRoKDApLA0KKyAgICAgIG1fcFRhYnN0b3BDb250ZXh0KG51bGxwdHIpLA0KKyAgICAgIG1fYkJsb2NrQ29udGludWUoVFJVRSkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcFRleHRQcm92aWRlcik7DQorfQ0KK0NYRkFfVGV4dExheW91dDo6fkNYRkFfVGV4dExheW91dCgpIHsNCisgIG1fdGV4dFBhcnNlci5SZXNldCgpOw0KKyAgZGVsZXRlIG1fcExvYWRlcjsNCisgIGRlbGV0ZSBtX3BUYWJzdG9wQ29udGV4dDsNCisgIFVubG9hZCgpOw0KK30NCit2b2lkIENYRkFfVGV4dExheW91dDo6VW5sb2FkKCkgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX3BpZWNlTGluZXMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgQ1hGQV9QaWVjZUxpbmUqIHBMaW5lID0gbV9waWVjZUxpbmVzLkdldEF0KGkpOw0KKyAgICBGREVfRGVsZXRlV2l0aChDWEZBX1BpZWNlTGluZSwgbV9wQWxsb2NhdG9yLCBwTGluZSk7DQorICB9DQorICBtX3BpZWNlTGluZXMuUmVtb3ZlQWxsKCk7DQorICBpZiAobV9wQnJlYWsgIT0gTlVMTCkgew0KKyAgICBtX3BCcmVhay0+UmVsZWFzZSgpOw0KKyAgICBtX3BCcmVhayA9IE5VTEw7DQorICB9DQorICBpZiAobV9wQWxsb2NhdG9yICE9IE5VTEwpIHsNCisgICAgbV9wQWxsb2NhdG9yLT5SZWxlYXNlKCk7DQorICAgIG1fcEFsbG9jYXRvciA9IE5VTEw7DQorICB9DQorfQ0KK2NvbnN0IENYRkFfUGllY2VMaW5lQXJyYXkqIENYRkFfVGV4dExheW91dDo6R2V0UGllY2VMaW5lcygpIHsNCisgIHJldHVybiAmbV9waWVjZUxpbmVzOw0KK30NCit2b2lkIENYRkFfVGV4dExheW91dDo6R2V0VGV4dERhdGFOb2RlKCkgew0KKyAgaWYgKG1fcFRleHRQcm92aWRlciA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BUZXh0UHJvdmlkZXItPkdldFRleHROb2RlKG1fYlJpY2hUZXh0KTsNCisgIGlmIChwTm9kZSAmJiBtX2JSaWNoVGV4dCkgew0KKyAgICBtX3RleHRQYXJzZXIuUmVzZXQoKTsNCisgIH0NCisgIG1fcFRleHREYXRhTm9kZSA9IHBOb2RlOw0KK30NCitJRkRFX1hNTE5vZGUqIENYRkFfVGV4dExheW91dDo6R2V0WE1MQ29udGFpbmVyTm9kZSgpIHsNCisgIElGREVfWE1MTm9kZSogcFhNTENvbnRhaW5lciA9IE5VTEw7DQorICBpZiAobV9iUmljaFRleHQpIHsNCisgICAgSUZERV9YTUxOb2RlKiBwWE1MUm9vdCA9IG1fcFRleHREYXRhTm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCisgICAgaWYgKCFwWE1MUm9vdCkgew0KKyAgICAgIHJldHVybiBwWE1MQ29udGFpbmVyOw0KKyAgICB9DQorICAgIGZvciAoSUZERV9YTUxOb2RlKiBwWE1MQ2hpbGQgPQ0KKyAgICAgICAgICAgICBwWE1MUm9vdC0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsNCisgICAgICAgICBwWE1MQ2hpbGQ7DQorICAgICAgICAgcFhNTENoaWxkID0gcFhNTENoaWxkLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgew0KKyAgICAgIGlmIChwWE1MQ2hpbGQtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICBJRkRFX1hNTEVsZW1lbnQqIHBYTUxFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCopcFhNTENoaWxkOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUYWc7DQorICAgICAgICBwWE1MRWxlbWVudC0+R2V0TG9jYWxUYWdOYW1lKHdzVGFnKTsNCisgICAgICAgIGlmICh3c1RhZy5FcXVhbChGWF9XU1RSQyhMImJvZHkiKSkgfHwgd3NUYWcuRXF1YWwoRlhfV1NUUkMoTCJodG1sIikpKSB7DQorICAgICAgICAgIHBYTUxDb250YWluZXIgPSBwWE1MQ2hpbGQ7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHBYTUxDb250YWluZXI7DQorfQ0KK0lGWF9SVEZCcmVhayogQ1hGQV9UZXh0TGF5b3V0OjpDcmVhdGVCcmVhayhGWF9CT09MIGJEZWZhdWx0KSB7DQorICBGWF9EV09SRCBkd1N0eWxlID0gRlhfUlRGTEFZT1VUU1RZTEVfRXhwYW5kVGFiOw0KKyAgaWYgKCFiRGVmYXVsdCkgew0KKyAgICBkd1N0eWxlIHw9IEZYX1JURkxBWU9VVFNUWUxFX1BhZ2luYXRpb247DQorICB9DQorICBJRlhfUlRGQnJlYWsqIHBCcmVhayA9IElGWF9SVEZCcmVhazo6Q3JlYXRlKDApOw0KKyAgcEJyZWFrLT5TZXRMYXlvdXRTdHlsZXMoZHdTdHlsZSk7DQorICBwQnJlYWstPlNldExpbmVCcmVha0NoYXIoTCdcbicpOw0KKyAgcEJyZWFrLT5TZXRMaW5lQnJlYWtUb2xlcmFuY2UoMSk7DQorICBwQnJlYWstPlNldEZvbnQobV90ZXh0UGFyc2VyLkdldEZvbnQobV9wVGV4dFByb3ZpZGVyLCBOVUxMKSk7DQorICBwQnJlYWstPlNldEZvbnRTaXplKG1fdGV4dFBhcnNlci5HZXRGb250U2l6ZShtX3BUZXh0UHJvdmlkZXIsIE5VTEwpKTsNCisgIHJldHVybiBwQnJlYWs7DQorfQ0KK3ZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpJbml0QnJlYWsoRlhfRkxPQVQgZkxpbmVXaWR0aCkgew0KKyAgQ1hGQV9Gb250IGZvbnQgPSBtX3BUZXh0UHJvdmlkZXItPkdldEZvbnROb2RlKCk7DQorICBDWEZBX1BhcmEgcGFyYSA9IG1fcFRleHRQcm92aWRlci0+R2V0UGFyYU5vZGUoKTsNCisgIEZYX0ZMT0FUIGZTdGFydCA9IDA7DQorICBGWF9GTE9BVCBmU3RhcnRQb3MgPSAwOw0KKyAgaWYgKHBhcmEuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgaW50MzJfdCBpQWxpZ24gPSBGWF9SVEZMSU5FQUxJR05NRU5UX0xlZnQ7DQorICAgIHN3aXRjaCAocGFyYS5HZXRIb3Jpem9udGFsQWxpZ24oKSkgew0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQ2VudGVyOg0KKyAgICAgICAgaUFsaWduID0gRlhfUlRGTElORUFMSUdOTUVOVF9DZW50ZXI7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KKyAgICAgICAgaUFsaWduID0gRlhfUlRGTElORUFMSUdOTUVOVF9SaWdodDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSnVzdGlmeToNCisgICAgICAgIGlBbGlnbiA9IEZYX1JURkxJTkVBTElHTk1FTlRfSnVzdGlmaWVkOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5QWxsOg0KKyAgICAgICAgaUFsaWduID0gRlhfUlRGTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZDsNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIG1fcEJyZWFrLT5TZXRBbGlnbm1lbnQoaUFsaWduKTsNCisgICAgZlN0YXJ0ID0gcGFyYS5HZXRNYXJnaW5MZWZ0KCk7DQorICAgIGlmIChtX3BUZXh0UHJvdmlkZXItPklzQ2hlY2tCdXR0b25BbmRBdXRvV2lkdGgoKSkgew0KKyAgICAgIGlmIChpQWxpZ24gIT0gRlhfUlRGTElORUFMSUdOTUVOVF9MZWZ0KSB7DQorICAgICAgICBmTGluZVdpZHRoIC09IHBhcmEuR2V0TWFyZ2luUmlnaHQoKTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgZkxpbmVXaWR0aCAtPSBwYXJhLkdldE1hcmdpblJpZ2h0KCk7DQorICAgIH0NCisgICAgaWYgKGZMaW5lV2lkdGggPCAwKSB7DQorICAgICAgZkxpbmVXaWR0aCA9IGZTdGFydDsNCisgICAgfQ0KKyAgICBmU3RhcnRQb3MgPSBmU3RhcnQ7DQorICAgIEZYX0ZMT0FUIGZJbmRlbnQgPSBwYXJhLkdldFRleHRJbmRlbnQoKTsNCisgICAgaWYgKGZJbmRlbnQgPiAwKSB7DQorICAgICAgZlN0YXJ0UG9zICs9IGZJbmRlbnQ7DQorICAgIH0NCisgIH0NCisgIG1fcEJyZWFrLT5TZXRMaW5lQm91bmRhcnkoZlN0YXJ0LCBmTGluZVdpZHRoKTsNCisgIG1fcEJyZWFrLT5TZXRMaW5lU3RhcnRQb3MoZlN0YXJ0UG9zKTsNCisgIGlmIChmb250LklzRXhpc3RJblhNTCgpKSB7DQorICAgIG1fcEJyZWFrLT5TZXRIb3Jpem9udGFsU2NhbGUoKGludDMyX3QpZm9udC5HZXRIb3Jpem9udGFsU2NhbGUoKSk7DQorICAgIG1fcEJyZWFrLT5TZXRWZXJ0aWNhbFNjYWxlKChpbnQzMl90KWZvbnQuR2V0VmVydGljYWxTY2FsZSgpKTsNCisgICAgbV9wQnJlYWstPlNldENoYXJTcGFjZShmb250LkdldExldHRlclNwYWNpbmcoKSk7DQorICB9DQorICBGWF9GTE9BVCBmRm9udFNpemUgPSBtX3RleHRQYXJzZXIuR2V0Rm9udFNpemUobV9wVGV4dFByb3ZpZGVyLCBOVUxMKTsNCisgIG1fcEJyZWFrLT5TZXRGb250U2l6ZShmRm9udFNpemUpOw0KKyAgbV9wQnJlYWstPlNldEZvbnQobV90ZXh0UGFyc2VyLkdldEZvbnQobV9wVGV4dFByb3ZpZGVyLCBOVUxMKSk7DQorICBtX3BCcmVhay0+U2V0TGluZUJyZWFrVG9sZXJhbmNlKGZGb250U2l6ZSAqIDAuMmYpOw0KK30NCit2b2lkIENYRkFfVGV4dExheW91dDo6SW5pdEJyZWFrKElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU0RJU1BMQVkgZURpc3BsYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTGluZVdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFBhcmVudFN0eWxlKSB7DQorICBpZiAocFN0eWxlID09IE5VTEwpIHsNCisgICAgSW5pdEJyZWFrKGZMaW5lV2lkdGgpOw0KKyAgICByZXR1cm47DQorICB9DQorICBJRkRFX0NTU1BhcmFncmFwaFN0eWxlKiBwUGFyYVN0eWxlID0gcFN0eWxlLT5HZXRQYXJhZ3JhcGhTdHlsZXMoKTsNCisgIGlmIChlRGlzcGxheSA9PSBGREVfQ1NTRElTUExBWV9CbG9jayB8fCBlRGlzcGxheSA9PSBGREVfQ1NTRElTUExBWV9MaXN0SXRlbSkgew0KKyAgICBpbnQzMl90IGlBbGlnbiA9IEZYX1JURkxJTkVBTElHTk1FTlRfTGVmdDsNCisgICAgc3dpdGNoIChwUGFyYVN0eWxlLT5HZXRUZXh0QWxpZ24oKSkgew0KKyAgICAgIGNhc2UgRkRFX0NTU1RFWFRBTElHTl9SaWdodDoNCisgICAgICAgIGlBbGlnbiA9IEZYX1JURkxJTkVBTElHTk1FTlRfUmlnaHQ7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NURVhUQUxJR05fQ2VudGVyOg0KKyAgICAgICAgaUFsaWduID0gRlhfUlRGTElORUFMSUdOTUVOVF9DZW50ZXI7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9DU1NURVhUQUxJR05fSnVzdGlmeToNCisgICAgICAgIGlBbGlnbiA9IEZYX1JURkxJTkVBTElHTk1FTlRfSnVzdGlmaWVkOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfQ1NTVEVYVEFMSUdOX0p1c3RpZnlBbGw6DQorICAgICAgICBpQWxpZ24gPSBGWF9SVEZMSU5FQUxJR05NRU5UX0Rpc3RyaWJ1dGVkOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIG1fcEJyZWFrLT5TZXRBbGlnbm1lbnQoaUFsaWduKTsNCisgICAgRlhfRkxPQVQgZlN0YXJ0ID0gMDsNCisgICAgY29uc3QgRkRFX0NTU1JFQ1QqIHBSZWN0ID0gcFN0eWxlLT5HZXRCb3VuZGFyeVN0eWxlcygpLT5HZXRNYXJnaW5XaWR0aCgpOw0KKyAgICBjb25zdCBGREVfQ1NTUkVDVCogcFBhZGRpbmdSZWN0ID0NCisgICAgICAgIHBTdHlsZS0+R2V0Qm91bmRhcnlTdHlsZXMoKS0+R2V0UGFkZGluZ1dpZHRoKCk7DQorICAgIGlmIChwUmVjdCAhPSBOVUxMKSB7DQorICAgICAgZlN0YXJ0ID0gcFJlY3QtPmxlZnQuR2V0VmFsdWUoKTsNCisgICAgICBmTGluZVdpZHRoIC09IHBSZWN0LT5yaWdodC5HZXRWYWx1ZSgpOw0KKyAgICAgIGlmIChwUGFkZGluZ1JlY3QgIT0gTlVMTCkgew0KKyAgICAgICAgZlN0YXJ0ICs9IHBQYWRkaW5nUmVjdC0+bGVmdC5HZXRWYWx1ZSgpOw0KKyAgICAgICAgZkxpbmVXaWR0aCAtPSBwUGFkZGluZ1JlY3QtPnJpZ2h0LkdldFZhbHVlKCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChlRGlzcGxheSA9PSBGREVfQ1NTRElTUExBWV9MaXN0SXRlbSkgew0KKyAgICAgICAgY29uc3QgRkRFX0NTU1JFQ1QqIHBQYXJSZWN0ID0NCisgICAgICAgICAgICBwUGFyZW50U3R5bGUtPkdldEJvdW5kYXJ5U3R5bGVzKCktPkdldE1hcmdpbldpZHRoKCk7DQorICAgICAgICBjb25zdCBGREVfQ1NTUkVDVCogcFBhclBhZGRpbmdSZWN0ID0NCisgICAgICAgICAgICBwUGFyZW50U3R5bGUtPkdldEJvdW5kYXJ5U3R5bGVzKCktPkdldFBhZGRpbmdXaWR0aCgpOw0KKyAgICAgICAgaWYgKHBQYXJSZWN0ICE9IE5VTEwpIHsNCisgICAgICAgICAgZlN0YXJ0ICs9IHBQYXJSZWN0LT5sZWZ0LkdldFZhbHVlKCk7DQorICAgICAgICAgIGZMaW5lV2lkdGggLT0gcFBhclJlY3QtPnJpZ2h0LkdldFZhbHVlKCk7DQorICAgICAgICAgIGlmIChwUGFyUGFkZGluZ1JlY3QgIT0gTlVMTCkgew0KKyAgICAgICAgICAgIGZTdGFydCArPSBwUGFyUGFkZGluZ1JlY3QtPmxlZnQuR2V0VmFsdWUoKTsNCisgICAgICAgICAgICBmTGluZVdpZHRoIC09IHBQYXJQYWRkaW5nUmVjdC0+cmlnaHQuR2V0VmFsdWUoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgRkRFX0NTU1JFQ1QgcE5ld1JlY3Q7DQorICAgICAgICBwTmV3UmVjdC5sZWZ0LlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgZlN0YXJ0KTsNCisgICAgICAgIHBOZXdSZWN0LnJpZ2h0LlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgcFJlY3QtPnJpZ2h0LkdldFZhbHVlKCkpOw0KKyAgICAgICAgcE5ld1JlY3QudG9wLlNldChGREVfQ1NTTEVOR1RIVU5JVF9Qb2ludCwgcFJlY3QtPnRvcC5HZXRWYWx1ZSgpKTsNCisgICAgICAgIHBOZXdSZWN0LmJvdHRvbS5TZXQoRkRFX0NTU0xFTkdUSFVOSVRfUG9pbnQsIHBSZWN0LT5ib3R0b20uR2V0VmFsdWUoKSk7DQorICAgICAgICBwU3R5bGUtPkdldEJvdW5kYXJ5U3R5bGVzKCktPlNldE1hcmdpbldpZHRoKHBOZXdSZWN0KTsNCisgICAgICB9DQorICAgIH0NCisgICAgbV9wQnJlYWstPlNldExpbmVCb3VuZGFyeShmU3RhcnQsIGZMaW5lV2lkdGgpOw0KKyAgICBGWF9GTE9BVCBmSW5kZW50ID0gcFBhcmFTdHlsZS0+R2V0VGV4dEluZGVudCgpLkdldFZhbHVlKCk7DQorICAgIGlmIChmSW5kZW50ID4gMCkgew0KKyAgICAgIGZTdGFydCArPSBmSW5kZW50Ow0KKyAgICB9DQorICAgIG1fcEJyZWFrLT5TZXRMaW5lU3RhcnRQb3MoZlN0YXJ0KTsNCisgICAgbV9wQnJlYWstPlNldFRhYldpZHRoKG1fdGV4dFBhcnNlci5HZXRUYWJJbnRlcnZhbChwU3R5bGUpKTsNCisgICAgaWYgKG1fcFRhYnN0b3BDb250ZXh0ID09IE5VTEwpIHsNCisgICAgICBtX3BUYWJzdG9wQ29udGV4dCA9IG5ldyBDWEZBX1RleHRUYWJzdG9wc0NvbnRleHQ7DQorICAgIH0NCisgICAgbV90ZXh0UGFyc2VyLkdldFRhYnN0b3BzKHBTdHlsZSwgbV9wVGFic3RvcENvbnRleHQpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX3BUYWJzdG9wQ29udGV4dC0+bV9pVGFiQ291bnQ7IGkrKykgew0KKyAgICAgIFhGQV9UQUJTVE9QUyogcFRhYiA9IG1fcFRhYnN0b3BDb250ZXh0LT5tX3RhYnN0b3BzLkdldERhdGFQdHIoaSk7DQorICAgICAgbV9wQnJlYWstPkFkZFBvc2l0aW9uZWRUYWIocFRhYi0+ZlRhYnN0b3BzKTsNCisgICAgfQ0KKyAgfQ0KKyAgRlhfRkxPQVQgZkZvbnRTaXplID0gbV90ZXh0UGFyc2VyLkdldEZvbnRTaXplKG1fcFRleHRQcm92aWRlciwgcFN0eWxlKTsNCisgIG1fcEJyZWFrLT5TZXRGb250U2l6ZShmRm9udFNpemUpOw0KKyAgbV9wQnJlYWstPlNldExpbmVCcmVha1RvbGVyYW5jZShmRm9udFNpemUgKiAwLjJmKTsNCisgIG1fcEJyZWFrLT5TZXRGb250KG1fdGV4dFBhcnNlci5HZXRGb250KG1fcFRleHRQcm92aWRlciwgcFN0eWxlKSk7DQorICBtX3BCcmVhay0+U2V0SG9yaXpvbnRhbFNjYWxlKA0KKyAgICAgIG1fdGV4dFBhcnNlci5HZXRIb3JTY2FsZShtX3BUZXh0UHJvdmlkZXIsIHBTdHlsZSwgcFhNTE5vZGUpKTsNCisgIG1fcEJyZWFrLT5TZXRWZXJ0aWNhbFNjYWxlKG1fdGV4dFBhcnNlci5HZXRWZXJTY2FsZShtX3BUZXh0UHJvdmlkZXIsIHBTdHlsZSkpOw0KKyAgbV9wQnJlYWstPlNldENoYXJTcGFjZShwUGFyYVN0eWxlLT5HZXRMZXR0ZXJTcGFjaW5nKCkuR2V0VmFsdWUoKSk7DQorfQ0KK2ludDMyX3QgQ1hGQV9UZXh0TGF5b3V0OjpHZXRUZXh0KENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIEdldFRleHREYXRhTm9kZSgpOw0KKyAgd3NUZXh0LkVtcHR5KCk7DQorICBpZiAobV9iUmljaFRleHQpIHsNCisgIH0gZWxzZSB7DQorICAgIHdzVGV4dCA9IG1fcFRleHREYXRhTm9kZS0+R2V0Q29udGVudCgpOw0KKyAgfQ0KKyAgcmV0dXJuIHdzVGV4dC5HZXRMZW5ndGgoKTsNCit9DQorRlhfRkxPQVQgQ1hGQV9UZXh0TGF5b3V0OjpHZXRMYXlvdXRIZWlnaHQoKSB7DQorICBpZiAobV9wTG9hZGVyID09IE5VTEwpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpbnQzMl90IGlDb3VudCA9IG1fcExvYWRlci0+bV9saW5lSGVpZ2h0cy5HZXRTaXplKCk7DQorICBpZiAoaUNvdW50ID09IDAgJiYgbV9wTG9hZGVyLT5tX2ZXaWR0aCA+IDApIHsNCisgICAgQ0ZYX1NpemVGIHN6TWF4LCBzekRlZjsNCisgICAgc3pNYXguU2V0KG1fcExvYWRlci0+bV9mV2lkdGgsIG1fcExvYWRlci0+bV9mSGVpZ2h0KTsNCisgICAgc3pEZWYuU2V0KDAsIDApOw0KKyAgICBtX3BMb2FkZXItPm1fYlNhdmVMaW5lSGVpZ2h0ID0gVFJVRTsNCisgICAgbV9wTG9hZGVyLT5tX2ZMYXN0UG9zID0gMDsNCisgICAgQ2FsY1NpemUoc3pNYXgsIHN6TWF4LCBzekRlZik7DQorICAgIG1fcExvYWRlci0+bV9iU2F2ZUxpbmVIZWlnaHQgPSBGQUxTRTsNCisgICAgcmV0dXJuIHN6RGVmLnk7DQorICB9DQorICBGWF9GTE9BVCBmSGVpZ2h0ID0gbV9wTG9hZGVyLT5tX2ZIZWlnaHQ7DQorICBpZiAoZkhlaWdodCA8IDAuMWYpIHsNCisgICAgZkhlaWdodCA9IDA7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgZkhlaWdodCArPSBtX3BMb2FkZXItPm1fbGluZUhlaWdodHMuRWxlbWVudEF0KGkpOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gZkhlaWdodDsNCit9DQorRlhfRkxPQVQgQ1hGQV9UZXh0TGF5b3V0OjpTdGFydExheW91dChGWF9GTE9BVCBmV2lkdGgpIHsNCisgIGlmIChtX3BMb2FkZXIgPT0gTlVMTCkgew0KKyAgICBtX3BMb2FkZXIgPSBuZXcgQ1hGQV9Mb2FkZXJDb250ZXh0Ow0KKyAgfQ0KKyAgaWYgKGZXaWR0aCA8IDAgfHwgKG1fcExvYWRlci0+bV9mV2lkdGggPiAtMSAmJg0KKyAgICAgICAgICAgICAgICAgICAgIEZYU1lTX2ZhYnMoZldpZHRoIC0gbV9wTG9hZGVyLT5tX2ZXaWR0aCkgPiAwKSkgew0KKyAgICBtX3BMb2FkZXItPm1fbGluZUhlaWdodHMuUmVtb3ZlQWxsKCk7DQorICAgIG1fQmxvY2tzLlJlbW92ZUFsbCgpOw0KKyAgICBVbmxvYWQoKTsNCisgICAgbV9wTG9hZGVyLT5tX2ZTdGFydExpbmVPZmZzZXQgPSAwOw0KKyAgfQ0KKyAgbV9wTG9hZGVyLT5tX2ZXaWR0aCA9IGZXaWR0aDsNCisgIGlmIChmV2lkdGggPCAwKSB7DQorICAgIENGWF9TaXplRiBzek1heCwgc3pEZWY7DQorICAgIHN6TWF4LlNldCgwLCAwKTsNCisgICAgc3pEZWYuU2V0KDAsIDApOw0KKyAgICBtX3BMb2FkZXItPm1fYlNhdmVMaW5lSGVpZ2h0ID0gVFJVRTsNCisgICAgbV9wTG9hZGVyLT5tX2ZMYXN0UG9zID0gMDsNCisgICAgQ2FsY1NpemUoc3pNYXgsIHN6TWF4LCBzekRlZik7DQorICAgIG1fcExvYWRlci0+bV9iU2F2ZUxpbmVIZWlnaHQgPSBGQUxTRTsNCisgICAgZldpZHRoID0gc3pEZWYueDsNCisgIH0NCisgIHJldHVybiBmV2lkdGg7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9UZXh0TGF5b3V0OjpEb0xheW91dChpbnQzMl90IGlCbG9ja0luZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkNhbGNIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50QXJlYUhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRleHRIZWlnaHQpIHsNCisgIGlmIChtX3BMb2FkZXIgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpbnQzMl90IGlCbG9ja0NvdW50ID0gbV9CbG9ja3MuR2V0U2l6ZSgpOw0KKyAgRlhfRkxPQVQgZkhlaWdodCA9IGZUZXh0SGVpZ2h0Ow0KKyAgaWYgKGZIZWlnaHQgPCAwKSB7DQorICAgIGZIZWlnaHQgPSBHZXRMYXlvdXRIZWlnaHQoKTsNCisgIH0NCisgIG1fcExvYWRlci0+bV9mSGVpZ2h0ID0gZkhlaWdodDsNCisgIGlmIChmQ29udGVudEFyZWFIZWlnaHQgPCAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIG1fYkhhc0Jsb2NrID0gVFJVRTsNCisgIGlmIChpQmxvY2tDb3VudCA9PSAwICYmIGZIZWlnaHQgPiAwKSB7DQorICAgIGZIZWlnaHQgPSBmVGV4dEhlaWdodCAtIEdldExheW91dEhlaWdodCgpOw0KKyAgICBpZiAoZkhlaWdodCA+IDApIHsNCisgICAgICBpbnQzMl90IGlBbGlnbiA9IG1fdGV4dFBhcnNlci5HZXRWQWxnaW4obV9wVGV4dFByb3ZpZGVyKTsNCisgICAgICBpZiAoaUFsaWduID09IFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZSkgew0KKyAgICAgICAgZkhlaWdodCAvPSAyLjBmOw0KKyAgICAgIH0gZWxzZSBpZiAoaUFsaWduICE9IFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbSkgew0KKyAgICAgICAgZkhlaWdodCA9IDA7DQorICAgICAgfQ0KKyAgICAgIG1fcExvYWRlci0+bV9mU3RhcnRMaW5lT2Zmc2V0ID0gZkhlaWdodDsNCisgICAgfQ0KKyAgfQ0KKyAgRlhfRkxPQVQgZkxpbmVQb3MgPSBtX3BMb2FkZXItPm1fZlN0YXJ0TGluZU9mZnNldDsNCisgIGludDMyX3QgaUxpbmVJbmRleCA9IDA7DQorICBpZiAoaUJsb2NrQ291bnQgPiAxKSB7DQorICAgIGlmIChpQmxvY2tDb3VudCA+PSAoaUJsb2NrSW5kZXggKyAxKSAqIDIpIHsNCisgICAgICBpTGluZUluZGV4ID0gbV9CbG9ja3MuRWxlbWVudEF0KGlCbG9ja0luZGV4ICogMik7DQorICAgIH0gZWxzZSB7DQorICAgICAgaUxpbmVJbmRleCA9IG1fQmxvY2tzLkVsZW1lbnRBdChpQmxvY2tDb3VudCAtIDEpICsNCisgICAgICAgICAgICAgICAgICAgbV9CbG9ja3MuRWxlbWVudEF0KGlCbG9ja0NvdW50IC0gMik7DQorICAgIH0NCisgICAgaWYgKG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHQuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlCbG9ja0luZGV4OyBpKyspIHsNCisgICAgICAgIGZMaW5lUG9zIC09IG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHQuRWxlbWVudEF0KGkgKiAyICsgMSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpbnQzMl90IGlDb3VudCA9IG1fcExvYWRlci0+bV9saW5lSGVpZ2h0cy5HZXRTaXplKCk7DQorICBpbnQzMl90IGkgPSAwOw0KKyAgZm9yIChpID0gaUxpbmVJbmRleDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIEZYX0ZMT0FUIGZMaW5lSGVpZ2h0ID0gbV9wTG9hZGVyLT5tX2xpbmVIZWlnaHRzLkVsZW1lbnRBdChpKTsNCisgICAgaWYgKChpID09IGlMaW5lSW5kZXgpICYmIChmTGluZUhlaWdodCAtIGZDb250ZW50QXJlYUhlaWdodCA+IDAuMDAxKSkgew0KKyAgICAgIGZDYWxjSGVpZ2h0ID0gMDsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBpZiAoZkxpbmVQb3MgKyBmTGluZUhlaWdodCAtIGZDb250ZW50QXJlYUhlaWdodCA+IDAuMDAxKSB7DQorICAgICAgaWYgKGlCbG9ja0NvdW50ID49IChpQmxvY2tJbmRleCArIDEpICogMikgew0KKyAgICAgICAgbV9CbG9ja3MuU2V0QXQoaUJsb2NrSW5kZXggKiAyLCBpTGluZUluZGV4KTsNCisgICAgICAgIG1fQmxvY2tzLlNldEF0KGlCbG9ja0luZGV4ICogMiArIDEsIGkgLSBpTGluZUluZGV4KTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgbV9CbG9ja3MuQWRkKGlMaW5lSW5kZXgpOw0KKyAgICAgICAgbV9CbG9ja3MuQWRkKGkgLSBpTGluZUluZGV4KTsNCisgICAgICB9DQorICAgICAgaWYgKGkgPT0gaUxpbmVJbmRleCkgew0KKyAgICAgICAgaWYgKGZDYWxjSGVpZ2h0IDw9IGZMaW5lUG9zKSB7DQorICAgICAgICAgIGlmIChtX3BMb2FkZXItPm1fQmxvY2tzSGVpZ2h0LkdldFNpemUoKSA+IGlCbG9ja0luZGV4ICogMiAmJg0KKyAgICAgICAgICAgICAgKG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHQuR2V0QXQoaUJsb2NrSW5kZXggKiAyKSA9PQ0KKyAgICAgICAgICAgICAgIGlCbG9ja0luZGV4KSkgew0KKyAgICAgICAgICAgIG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHQuU2V0QXQoaUJsb2NrSW5kZXggKiAyICsgMSwgZkNhbGNIZWlnaHQpOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHQuQWRkKChGWF9GTE9BVClpQmxvY2tJbmRleCk7DQorICAgICAgICAgICAgbV9wTG9hZGVyLT5tX0Jsb2Nrc0hlaWdodC5BZGQoZkNhbGNIZWlnaHQpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQorICAgICAgZkNhbGNIZWlnaHQgPSBmTGluZVBvczsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBmTGluZVBvcyArPSBmTGluZUhlaWdodDsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQoraW50MzJfdCBDWEZBX1RleHRMYXlvdXQ6OkNvdW50QmxvY2tzKCkgY29uc3Qgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX0Jsb2Nrcy5HZXRTaXplKCkgLyAyOw0KKyAgcmV0dXJuIGlDb3VudCA+IDAgPyBpQ291bnQgOiAxOw0KK30NCitGWF9CT09MIENYRkFfVGV4dExheW91dDo6Q2FsY1NpemUoY29uc3QgQ0ZYX1NpemVGJiBtaW5TaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfU2l6ZUYmIG1heFNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9TaXplRiYgZGVmYXVsdFNpemUpIHsNCisgIGRlZmF1bHRTaXplLnggPSBtYXhTaXplLng7DQorICBpZiAoZGVmYXVsdFNpemUueCA8IDEpIHsNCisgICAgZGVmYXVsdFNpemUueCA9IDB4RkZGRjsNCisgIH0NCisgIGlmIChtX3BCcmVhayAhPSBOVUxMKSB7DQorICAgIG1fcEJyZWFrLT5SZWxlYXNlKCk7DQorICB9DQorICBtX3BCcmVhayA9IENyZWF0ZUJyZWFrKEZBTFNFKTsNCisgIEZYX0ZMT0FUIGZMaW5lUG9zID0gMDsNCisgIG1faUxpbmVzID0gMDsNCisgIG1fZk1heFdpZHRoID0gMDsNCisgIExvYWRlcihkZWZhdWx0U2l6ZSwgZkxpbmVQb3MsIEZBTFNFKTsNCisgIGlmIChmTGluZVBvcyA8IDAuMWYpIHsNCisgICAgZkxpbmVQb3MgPSBtX3RleHRQYXJzZXIuR2V0Rm9udFNpemUobV9wVGV4dFByb3ZpZGVyLCBOVUxMKTsNCisgIH0NCisgIGlmIChtX3BUYWJzdG9wQ29udGV4dCkgew0KKyAgICBkZWxldGUgbV9wVGFic3RvcENvbnRleHQ7DQorICAgIG1fcFRhYnN0b3BDb250ZXh0ID0gTlVMTDsNCisgIH0NCisgIGRlZmF1bHRTaXplLlNldChtX2ZNYXhXaWR0aCwgZkxpbmVQb3MpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9UZXh0TGF5b3V0OjpMYXlvdXQoY29uc3QgQ0ZYX1NpemVGJiBzaXplLCBGWF9GTE9BVCogZkhlaWdodCkgew0KKyAgaWYgKHNpemUueCA8IDEpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgVW5sb2FkKCk7DQorICBtX3BCcmVhayA9IENyZWF0ZUJyZWFrKFRSVUUpOw0KKyAgaWYgKG1fcExvYWRlciAhPSBOVUxMKSB7DQorICAgIG1fcExvYWRlci0+bV9pVG90YWxMaW5lcyA9IC0xOw0KKyAgICBtX3BMb2FkZXItPm1faUNoYXIgPSAwOw0KKyAgfQ0KKyAgbV9pTGluZXMgPSAwOw0KKyAgRlhfRkxPQVQgZkxpbmVQb3MgPSAwOw0KKyAgTG9hZGVyKHNpemUsIGZMaW5lUG9zLCBUUlVFKTsNCisgIFVwZGF0ZUFsaWduKHNpemUueSwgZkxpbmVQb3MpOw0KKyAgaWYgKG1fcFRhYnN0b3BDb250ZXh0KSB7DQorICAgIGRlbGV0ZSBtX3BUYWJzdG9wQ29udGV4dDsNCisgICAgbV9wVGFic3RvcENvbnRleHQgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKGZIZWlnaHQpIHsNCisgICAgKmZIZWlnaHQgPSBmTGluZVBvczsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfVGV4dExheW91dDo6TGF5b3V0KGludDMyX3QgaUJsb2NrKSB7DQorICBpZiAobV9wTG9hZGVyID09IE5VTEwgfHwgaUJsb2NrIDwgMCB8fCBpQmxvY2sgPj0gQ291bnRCbG9ja3MoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAobV9wTG9hZGVyLT5tX2ZXaWR0aCA8IDEpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgbV9wTG9hZGVyLT5tX2lUb3RhbExpbmVzID0gLTE7DQorICBtX2lMaW5lcyA9IDA7DQorICBGWF9GTE9BVCBmTGluZVBvcyA9IDA7DQorICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCisgIENGWF9TaXplRiBzelRleHQ7DQorICBzelRleHQuU2V0KG1fcExvYWRlci0+bV9mV2lkdGgsIG1fcExvYWRlci0+bV9mSGVpZ2h0KTsNCisgIGludDMyX3QgaUNvdW50ID0gbV9CbG9ja3MuR2V0U2l6ZSgpOw0KKyAgaW50MzJfdCBpQmxvY2tzSGVpZ2h0Q291bnQgPSBtX3BMb2FkZXItPm1fQmxvY2tzSGVpZ2h0LkdldFNpemUoKTsNCisgIGlCbG9ja3NIZWlnaHRDb3VudCAvPSAyOw0KKyAgaWYgKGlCbG9jayA8IGlCbG9ja3NIZWlnaHRDb3VudCkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIGlmIChpQmxvY2sgPT0gaUJsb2Nrc0hlaWdodENvdW50KSB7DQorICAgIFVubG9hZCgpOw0KKyAgICBtX3BCcmVhayA9IENyZWF0ZUJyZWFrKFRSVUUpOw0KKyAgICBmTGluZVBvcyA9IG1fcExvYWRlci0+bV9mU3RhcnRMaW5lT2Zmc2V0Ow0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQmxvY2tzSGVpZ2h0Q291bnQ7IGkrKykgew0KKyAgICAgIGZMaW5lUG9zIC09IG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHQuRWxlbWVudEF0KGkgKiAyICsgMSk7DQorICAgIH0NCisgICAgbV9wTG9hZGVyLT5tX2lDaGFyID0gMDsNCisgICAgaWYgKGlDb3VudCA+IDEpIHsNCisgICAgICBtX3BMb2FkZXItPm1faVRvdGFsTGluZXMgPSBtX0Jsb2Nrcy5FbGVtZW50QXQoaUJsb2NrICogMiArIDEpOw0KKyAgICB9DQorICAgIExvYWRlcihzelRleHQsIGZMaW5lUG9zLCBUUlVFKTsNCisgICAgaWYgKGlDb3VudCA9PSAwICYmIG1fcExvYWRlci0+bV9mU3RhcnRMaW5lT2Zmc2V0IDwgMC4xZikgew0KKyAgICAgIFVwZGF0ZUFsaWduKHN6VGV4dC55LCBmTGluZVBvcyk7DQorICAgIH0NCisgIH0gZWxzZSBpZiAobV9wVGV4dERhdGFOb2RlICE9IE5VTEwpIHsNCisgICAgaUJsb2NrICo9IDI7DQorICAgIGlmIChpQmxvY2sgPCBpQ291bnQgLSAyKSB7DQorICAgICAgbV9wTG9hZGVyLT5tX2lUb3RhbExpbmVzID0gbV9CbG9ja3MuRWxlbWVudEF0KGlCbG9jayArIDEpOw0KKyAgICB9DQorICAgIG1fcEJyZWFrLT5SZXNldCgpOw0KKyAgICBpZiAobV9iUmljaFRleHQpIHsNCisgICAgICBJRkRFX1hNTE5vZGUqIHBDb250YWluZXJOb2RlID0gR2V0WE1MQ29udGFpbmVyTm9kZSgpOw0KKyAgICAgIGlmICghcENvbnRhaW5lck5vZGUpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlID0gbV9wTG9hZGVyLT5tX3BYTUxOb2RlOw0KKyAgICAgIGlmIChwWE1MTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQorICAgICAgSUZERV9YTUxOb2RlKiBwU2F2ZVhNTE5vZGUgPSBtX3BMb2FkZXItPm1fcFhNTE5vZGU7DQorICAgICAgZm9yICg7IHBYTUxOb2RlOw0KKyAgICAgICAgICAgcFhNTE5vZGUgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgICAgIEZYX0JPT0wgYkZsYWcgPSBMb2FkUmljaFRleHQocFhNTE5vZGUsIHN6VGV4dCwgZkxpbmVQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcExvYWRlci0+bV9wUGFyZW50U3R5bGUsIFRSVUUpOw0KKyAgICAgICAgaWYgKCFiRmxhZykgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgd2hpbGUgKHBYTUxOb2RlID09IE5VTEwpIHsNCisgICAgICAgIHBYTUxOb2RlID0gcFNhdmVYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OlBhcmVudCk7DQorICAgICAgICBpZiAocFhNTE5vZGUgPT0gcENvbnRhaW5lck5vZGUpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBGWF9CT09MIGJGbGFnID0NCisgICAgICAgICAgICBMb2FkUmljaFRleHQocFhNTE5vZGUsIHN6VGV4dCwgZkxpbmVQb3MsIG1fcExvYWRlci0+bV9wUGFyZW50U3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsIE5VTEwsIEZBTFNFKTsNCisgICAgICAgIGlmICghYkZsYWcpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBwU2F2ZVhNTE5vZGUgPSBwWE1MTm9kZTsNCisgICAgICAgIHBYTUxOb2RlID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpOw0KKyAgICAgICAgaWYgKCFwWE1MTm9kZSkgew0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGZvciAoOyBwWE1MTm9kZTsNCisgICAgICAgICAgICAgcFhNTE5vZGUgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgICAgICAgRlhfQk9PTCBiRmxhZyA9IExvYWRSaWNoVGV4dChwWE1MTm9kZSwgc3pUZXh0LCBmTGluZVBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BMb2FkZXItPm1fcFBhcmVudFN0eWxlLCBUUlVFKTsNCisgICAgICAgICAgaWYgKCFiRmxhZykgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHBOb2RlID0gbV9wTG9hZGVyLT5tX3BOb2RlOw0KKyAgICAgIGlmIChwTm9kZSA9PSBOVUxMKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQorICAgICAgTG9hZFRleHQocE5vZGUsIHN6VGV4dCwgZkxpbmVQb3MsIFRSVUUpOw0KKyAgICB9DQorICB9DQorICBpZiAoaUJsb2NrID09IGlDb3VudCkgew0KKyAgICBpZiAobV9wVGFic3RvcENvbnRleHQgIT0gTlVMTCkgew0KKyAgICAgIGRlbGV0ZSBtX3BUYWJzdG9wQ29udGV4dDsNCisgICAgICBtX3BUYWJzdG9wQ29udGV4dCA9IE5VTEw7DQorICAgIH0NCisgICAgaWYgKG1fcExvYWRlciAhPSBOVUxMKSB7DQorICAgICAgZGVsZXRlIG1fcExvYWRlcjsNCisgICAgICBtX3BMb2FkZXIgPSBOVUxMOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDWEZBX1RleHRMYXlvdXQ6Okl0ZW1CbG9ja3MoY29uc3QgQ0ZYX1JlY3RGJiBydFRleHQsIGludDMyX3QgaUJsb2NrSW5kZXgpIHsNCisgIGlmICghbV9wTG9hZGVyKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgaUNvdW50SGVpZ2h0ID0gbV9wTG9hZGVyLT5tX2xpbmVIZWlnaHRzLkdldFNpemUoKTsNCisgIGlmIChpQ291bnRIZWlnaHQgPT0gMCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9CT09MIGJFbmRJdGVtID0gVFJVRTsNCisgIGludDMyX3QgaUJsb2NrQ291bnQgPSBtX0Jsb2Nrcy5HZXRTaXplKCk7DQorICBGWF9GTE9BVCBmTGluZVBvcyA9IG1fcExvYWRlci0+bV9mU3RhcnRMaW5lT2Zmc2V0Ow0KKyAgaW50MzJfdCBpTGluZUluZGV4ID0gMDsNCisgIGlmIChpQmxvY2tJbmRleCA+IDApIHsNCisgICAgaW50MzJfdCBpQmxvY2tIZWlnaHRDb3VudCA9IG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHQuR2V0U2l6ZSgpOw0KKyAgICBpQmxvY2tIZWlnaHRDb3VudCAvPSAyOw0KKyAgICBpZiAoaUJsb2NrSGVpZ2h0Q291bnQgPj0gaUJsb2NrSW5kZXgpIHsNCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQmxvY2tJbmRleDsgaSsrKSB7DQorICAgICAgICBmTGluZVBvcyAtPSBtX3BMb2FkZXItPm1fQmxvY2tzSGVpZ2h0LkVsZW1lbnRBdChpICogMiArIDEpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBmTGluZVBvcyA9IDA7DQorICAgIH0NCisgICAgaUxpbmVJbmRleCA9IG1fQmxvY2tzLkVsZW1lbnRBdChpQmxvY2tDb3VudCAtIDEpICsNCisgICAgICAgICAgICAgICAgIG1fQmxvY2tzLkVsZW1lbnRBdChpQmxvY2tDb3VudCAtIDIpOw0KKyAgfQ0KKyAgaW50MzJfdCBpID0gMDsNCisgIGZvciAoaSA9IGlMaW5lSW5kZXg7IGkgPCBpQ291bnRIZWlnaHQ7IGkrKykgew0KKyAgICBGWF9GTE9BVCBmTGluZUhlaWdodCA9IG1fcExvYWRlci0+bV9saW5lSGVpZ2h0cy5FbGVtZW50QXQoaSk7DQorICAgIGlmIChmTGluZVBvcyArIGZMaW5lSGVpZ2h0IC0gcnRUZXh0LmhlaWdodCA+IDAuMDAxKSB7DQorICAgICAgbV9CbG9ja3MuQWRkKGlMaW5lSW5kZXgpOw0KKyAgICAgIG1fQmxvY2tzLkFkZChpIC0gaUxpbmVJbmRleCk7DQorICAgICAgYkVuZEl0ZW0gPSBGQUxTRTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBmTGluZVBvcyArPSBmTGluZUhlaWdodDsNCisgIH0NCisgIGlmIChpQ291bnRIZWlnaHQgPiAwICYmIChpIC0gaUxpbmVJbmRleCkgPiAwICYmIGJFbmRJdGVtKSB7DQorICAgIG1fQmxvY2tzLkFkZChpTGluZUluZGV4KTsNCisgICAgbV9CbG9ja3MuQWRkKGkgLSBpTGluZUluZGV4KTsNCisgIH0NCit9DQorRlhfQk9PTCBDWEZBX1RleHRMYXlvdXQ6OkRyYXdTdHJpbmcoQ0ZYX1JlbmRlckRldmljZSogcEZ4RGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIHRtRG9jMkRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0Q2xpcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCbG9jaykgew0KKyAgSUZERV9SZW5kZXJEZXZpY2UqIHBEZXZpY2UgPSBJRkRFX1JlbmRlckRldmljZTo6Q3JlYXRlKHBGeERldmljZSk7DQorICBpZiAocERldmljZSA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZERV9IREVWSUNFU1RBVEUgc3RhdGUgPSBwRGV2aWNlLT5TYXZlU3RhdGUoKTsNCisgIHBEZXZpY2UtPlNldENsaXBSZWN0KHJ0Q2xpcCk7DQorICBJRkRFX1NvbGlkQnJ1c2gqIHBTb2xpZEJydXNoID0NCisgICAgICAoSUZERV9Tb2xpZEJydXNoKilJRkRFX0JydXNoOjpDcmVhdGUoRkRFX0JSVVNIVFlQRV9Tb2xpZCk7DQorICBJRkRFX1BlbiogcFBlbiA9IElGREVfUGVuOjpDcmVhdGUoKTsNCisgIEZYU1lTX2Fzc2VydChwRGV2aWNlICE9IE5VTEwgJiYgcFNvbGlkQnJ1c2ggIT0gTlVMTCAmJiBwUGVuICE9IE5VTEwpOw0KKyAgaWYgKG1fcGllY2VMaW5lcy5HZXRTaXplKCkgPT0gMCkgew0KKyAgICBpbnQzMl90IGlCbG9ja0NvdW50ID0gQ291bnRCbG9ja3MoKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUJsb2NrQ291bnQ7IGkrKykgew0KKyAgICAgIExheW91dChpKTsNCisgICAgfQ0KKyAgfQ0KKyAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zID0gTlVMTDsNCisgIGludDMyX3QgaUNoYXJDb3VudCA9IDA7DQorICBpbnQzMl90IGlMaW5lU3RhcnQgPSAwOw0KKyAgaW50MzJfdCBpUGllY2VMaW5lcyA9IG1fcGllY2VMaW5lcy5HZXRTaXplKCk7DQorICBpbnQzMl90IGlDb3VudCA9IG1fQmxvY2tzLkdldFNpemUoKTsNCisgIGlmIChpQ291bnQgPiAwKSB7DQorICAgIGlCbG9jayAqPSAyOw0KKyAgICBpZiAoaUJsb2NrIDwgaUNvdW50KSB7DQorICAgICAgaUxpbmVTdGFydCA9IG1fQmxvY2tzLkVsZW1lbnRBdChpQmxvY2spOw0KKyAgICAgIGlQaWVjZUxpbmVzID0gbV9CbG9ja3MuRWxlbWVudEF0KGlCbG9jayArIDEpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlQaWVjZUxpbmVzID0gMDsNCisgICAgfQ0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVBpZWNlTGluZXM7IGkrKykgew0KKyAgICBpZiAoaSArIGlMaW5lU3RhcnQgPj0gbV9waWVjZUxpbmVzLkdldFNpemUoKSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIENYRkFfUGllY2VMaW5lKiBwUGllY2VMaW5lID0gbV9waWVjZUxpbmVzLkdldEF0KGkgKyBpTGluZVN0YXJ0KTsNCisgICAgaW50MzJfdCBpUGllY2VzID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldFNpemUoKTsNCisgICAgaW50MzJfdCBqID0gMDsNCisgICAgZm9yIChqID0gMDsgaiA8IGlQaWVjZXM7IGorKykgew0KKyAgICAgIFhGQV9MUENURVhUUElFQ0UgcFBpZWNlID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldEF0KGopOw0KKyAgICAgIGludDMyX3QgaUNoYXJzID0gcFBpZWNlLT5pQ2hhcnM7DQorICAgICAgaWYgKGlDaGFyQ291bnQgPCBpQ2hhcnMpIHsNCisgICAgICAgIEZYX0ZyZWUocENoYXJQb3MpOw0KKyAgICAgICAgcENoYXJQb3MgPSBGWF9BbGxvYyhGWFRFWFRfQ0hBUlBPUywgaUNoYXJzKTsNCisgICAgICAgIGlDaGFyQ291bnQgPSBpQ2hhcnM7DQorICAgICAgfQ0KKyAgICAgIEZYU1lTX21lbXNldChwQ2hhclBvcywgMCwgaUNoYXJDb3VudCAqIHNpemVvZihGWFRFWFRfQ0hBUlBPUykpOw0KKyAgICAgIFJlbmRlclN0cmluZyhwRGV2aWNlLCBwU29saWRCcnVzaCwgcFBpZWNlTGluZSwgaiwgcENoYXJQb3MsIHRtRG9jMkRldmljZSk7DQorICAgIH0NCisgICAgZm9yIChqID0gMDsgaiA8IGlQaWVjZXM7IGorKykgew0KKyAgICAgIFJlbmRlclBhdGgocERldmljZSwgcFBlbiwgcFBpZWNlTGluZSwgaiwgcENoYXJQb3MsIHRtRG9jMkRldmljZSk7DQorICAgIH0NCisgIH0NCisgIHBEZXZpY2UtPlJlc3RvcmVTdGF0ZShzdGF0ZSk7DQorICBGWF9GcmVlKHBDaGFyUG9zKTsNCisgIHBTb2xpZEJydXNoLT5SZWxlYXNlKCk7DQorICBwUGVuLT5SZWxlYXNlKCk7DQorICBwRGV2aWNlLT5SZWxlYXNlKCk7DQorICByZXR1cm4gaVBpZWNlTGluZXM7DQorfQ0KK3ZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpVcGRhdGVBbGlnbihGWF9GTE9BVCBmSGVpZ2h0LCBGWF9GTE9BVCBmQm90dG9tKSB7DQorICBmSGVpZ2h0IC09IGZCb3R0b207DQorICBpZiAoZkhlaWdodCA8IDAuMWYpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgc3dpdGNoIChtX3RleHRQYXJzZXIuR2V0VkFsZ2luKG1fcFRleHRQcm92aWRlcikpIHsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGU6DQorICAgICAgZkhlaWdodCAvPSAyLjBmOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbToNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlDb3VudCA9IG1fcGllY2VMaW5lcy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBDWEZBX1BpZWNlTGluZSogcFBpZWNlTGluZSA9IG1fcGllY2VMaW5lcy5HZXRBdChpKTsNCisgICAgaW50MzJfdCBpUGllY2VzID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldFNpemUoKTsNCisgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaVBpZWNlczsgaisrKSB7DQorICAgICAgWEZBX0xQVEVYVFBJRUNFIHBQaWVjZSA9IHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlcy5HZXRBdChqKTsNCisgICAgICBDRlhfUmVjdEYmIHJlY3QgPSBwUGllY2UtPnJ0UGllY2U7DQorICAgICAgcmVjdC50b3AgKz0gZkhlaWdodDsNCisgICAgfQ0KKyAgfQ0KK30NCitGWF9CT09MIENYRkFfVGV4dExheW91dDo6TG9hZGVyKGNvbnN0IENGWF9TaXplRiYgc3pUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZMaW5lUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVBpZWNlcykgew0KKyAgaWYgKG1fcEFsbG9jYXRvciA9PSBOVUxMKSB7DQorICAgIG1fcEFsbG9jYXRvciA9IEZYX0NyZWF0ZUFsbG9jYXRvcihGWF9BTExPQ1RZUEVfU3RhdGljLCAyNTYsIDApOw0KKyAgfQ0KKyAgR2V0VGV4dERhdGFOb2RlKCk7DQorICBpZiAobV9wVGV4dERhdGFOb2RlID09IE5VTEwpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBpZiAobV9iUmljaFRleHQpIHsNCisgICAgSUZERV9YTUxOb2RlKiBwWE1MQ29udGFpbmVyID0gR2V0WE1MQ29udGFpbmVyTm9kZSgpOw0KKyAgICBpZiAocFhNTENvbnRhaW5lcikgew0KKyAgICAgIGlmICghbV90ZXh0UGFyc2VyLklzUGFyc2VkKCkpIHsNCisgICAgICAgIG1fdGV4dFBhcnNlci5Eb1BhcnNlKHBYTUxDb250YWluZXIsIG1fcFRleHRQcm92aWRlcik7DQorICAgICAgfQ0KKyAgICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFJvb3RTdHlsZSA9DQorICAgICAgICAgIG1fdGV4dFBhcnNlci5DcmVhdGVSb290U3R5bGUobV9wVGV4dFByb3ZpZGVyKTsNCisgICAgICBMb2FkUmljaFRleHQocFhNTENvbnRhaW5lciwgc3pUZXh0LCBmTGluZVBvcywgcFJvb3RTdHlsZSwgYlNhdmVQaWVjZXMpOw0KKyAgICAgIHBSb290U3R5bGUtPlJlbGVhc2UoKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgTG9hZFRleHQobV9wVGV4dERhdGFOb2RlLCBzelRleHQsIGZMaW5lUG9zLCBiU2F2ZVBpZWNlcyk7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDWEZBX1RleHRMYXlvdXQ6OkxvYWRUZXh0KENYRkFfTm9kZSogcE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9TaXplRiYgc3pUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkxpbmVQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNhdmVQaWVjZXMpIHsNCisgIEluaXRCcmVhayhzelRleHQueCk7DQorICBDWEZBX1BhcmEgcGFyYSA9IG1fcFRleHRQcm92aWRlci0+R2V0UGFyYU5vZGUoKTsNCisgIEZYX0ZMT0FUIGZTcGFjZUFib3ZlID0gMDsNCisgIGlmIChwYXJhLklzRXhpc3RJblhNTCgpKSB7DQorICAgIGZTcGFjZUFib3ZlID0gcGFyYS5HZXRTcGFjZUFib3ZlKCk7DQorICAgIGlmIChmU3BhY2VBYm92ZSA8IDAuMWYpIHsNCisgICAgICBmU3BhY2VBYm92ZSA9IDA7DQorICAgIH0NCisgICAgaW50MzJfdCB2ZXJBbGlnbiA9IHBhcmEuR2V0VmVydGljYWxBbGlnbigpOw0KKyAgICBzd2l0Y2ggKHZlckFsaWduKSB7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub3A6DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGU6DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b206IHsNCisgICAgICAgIGZMaW5lUG9zICs9IGZTcGFjZUFib3ZlOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1RleHQgPSBwTm9kZS0+R2V0Q29udGVudCgpOw0KKyAgd3NUZXh0LlRyaW1SaWdodChMIiAiKTsNCisgIEZYX0JPT0wgYlJldCA9IEFwcGVuZENoYXIod3NUZXh0LCBmTGluZVBvcywgZlNwYWNlQWJvdmUsIGJTYXZlUGllY2VzKTsNCisgIGlmIChiUmV0ICYmIG1fcExvYWRlciAhPSBOVUxMKSB7DQorICAgIG1fcExvYWRlci0+bV9wTm9kZSA9IHBOb2RlOw0KKyAgfSBlbHNlIHsNCisgICAgRW5kQnJlYWsoRlhfUlRGQlJFQUtfUGFyYWdyYXBoQnJlYWssIGZMaW5lUG9zLCBiU2F2ZVBpZWNlcyk7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9UZXh0TGF5b3V0OjpMb2FkUmljaFRleHQoSUZERV9YTUxOb2RlKiBwWE1MTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9TaXplRiYgc3pUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZMaW5lUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwUGFyZW50U3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlUGllY2VzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9MaW5rVXNlckRhdGEqIHBMaW5rRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkVuZEJyZWFrLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNPbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxpQ291bnQpIHsNCisgIGlmIChwWE1MTm9kZSA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENYRkFfVGV4dFBhcnNlQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIG1fdGV4dFBhcnNlci5HZXRQYXJzZUNvbnRleHRGcm9tTWFwKHBYTUxOb2RlKTsNCisgIEZERV9DU1NESVNQTEFZIGVEaXNwbGF5ID0gRkRFX0NTU0RJU1BMQVlfTm9uZTsNCisgIEZYX0JPT0wgYkNvbnRlbnROb2RlID0gRkFMU0U7DQorICBGWF9GTE9BVCBmU3BhY2VCZWxvdyA9IDA7DQorICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSA9IE5VTEw7DQorICBDRlhfV2lkZVN0cmluZyB3c05hbWU7DQorICBpZiAoYkVuZEJyZWFrKSB7DQorICAgIEZYX0JPT0wgYkN1ck9sID0gRkFMU0U7DQorICAgIEZYX0JPT0wgYkN1ckxpID0gRkFMU0U7DQorICAgIElGREVfWE1MRWxlbWVudCogcEVsZW1lbnQgPSBOVUxMOw0KKyAgICBpZiAocENvbnRleHQgIT0gTlVMTCkgew0KKyAgICAgIGlmIChtX2JCbG9ja0NvbnRpbnVlIHx8DQorICAgICAgICAgIChtX3BMb2FkZXIgJiYgcFhNTE5vZGUgPT0gbV9wTG9hZGVyLT5tX3BYTUxOb2RlKSkgew0KKyAgICAgICAgbV9iQmxvY2tDb250aW51ZSA9IFRSVUU7DQorICAgICAgfQ0KKyAgICAgIGlmIChwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX1RleHQpIHsNCisgICAgICAgIGJDb250ZW50Tm9kZSA9IFRSVUU7DQorICAgICAgfSBlbHNlIGlmIChwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgIHBFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCopcFhNTE5vZGU7DQorICAgICAgICBwRWxlbWVudC0+R2V0TG9jYWxUYWdOYW1lKHdzTmFtZSk7DQorICAgICAgfQ0KKyAgICAgIGlmICh3c05hbWUgPT0gRlhfV1NUUkMoTCJvbCIpKSB7DQorICAgICAgICBiSXNPbCA9IFRSVUU7DQorICAgICAgICBiQ3VyT2wgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgICBpZiAobV9iQmxvY2tDb250aW51ZSB8fCBiQ29udGVudE5vZGUgPT0gRkFMU0UpIHsNCisgICAgICAgIGVEaXNwbGF5ID0gcENvbnRleHQtPkdldERpc3BsYXkoKTsNCisgICAgICAgIGlmIChlRGlzcGxheSAhPSBGREVfQ1NTRElTUExBWV9CbG9jayAmJg0KKyAgICAgICAgICAgIGVEaXNwbGF5ICE9IEZERV9DU1NESVNQTEFZX0lubGluZSAmJg0KKyAgICAgICAgICAgIGVEaXNwbGF5ICE9IEZERV9DU1NESVNQTEFZX0xpc3RJdGVtKSB7DQorICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcFN0eWxlID0gbV90ZXh0UGFyc2VyLkNvbXB1dGVTdHlsZShwWE1MTm9kZSwgcFBhcmVudFN0eWxlKTsNCisgICAgICAgIEluaXRCcmVhayhiQ29udGVudE5vZGUgPyBwUGFyZW50U3R5bGUgOiBwU3R5bGUsIGVEaXNwbGF5LCBzelRleHQueCwNCisgICAgICAgICAgICAgICAgICBwWE1MTm9kZSwgcFBhcmVudFN0eWxlKTsNCisgICAgICAgIGlmICgoZURpc3BsYXkgPT0gRkRFX0NTU0RJU1BMQVlfQmxvY2sgfHwNCisgICAgICAgICAgICAgZURpc3BsYXkgPT0gRkRFX0NTU0RJU1BMQVlfTGlzdEl0ZW0pICYmDQorICAgICAgICAgICAgKHBTdHlsZSAhPSBOVUxMKSAmJg0KKyAgICAgICAgICAgICh3c05hbWUuSXNFbXB0eSgpIHx8DQorICAgICAgICAgICAgICh3c05hbWUgIT0gRlhfV1NUUkMoTCJib2R5IikgJiYgd3NOYW1lICE9IEZYX1dTVFJDKEwiaHRtbCIpICYmDQorICAgICAgICAgICAgICB3c05hbWUgIT0gRlhfV1NUUkMoTCJvbCIpICYmIHdzTmFtZSAhPSBGWF9XU1RSQyhMInVsIikpKSkgew0KKyAgICAgICAgICBjb25zdCBGREVfQ1NTUkVDVCogcFJlY3QgPQ0KKyAgICAgICAgICAgICAgcFN0eWxlLT5HZXRCb3VuZGFyeVN0eWxlcygpLT5HZXRNYXJnaW5XaWR0aCgpOw0KKyAgICAgICAgICBpZiAocFJlY3QpIHsNCisgICAgICAgICAgICBmTGluZVBvcyArPSBwUmVjdC0+dG9wLkdldFZhbHVlKCk7DQorICAgICAgICAgICAgZlNwYWNlQmVsb3cgPSBwUmVjdC0+Ym90dG9tLkdldFZhbHVlKCk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmICh3c05hbWUgPT0gRlhfV1NUUkMoTCJhIikpIHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMaW5rQ29udGVudDsNCisgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBFbGVtZW50KTsNCisgICAgICAgICAgcEVsZW1lbnQtPkdldFN0cmluZyhGWF9XU1RSQyhMImhyZWYiKS5HZXRQdHIoKSwgd3NMaW5rQ29udGVudCk7DQorICAgICAgICAgIGlmICghd3NMaW5rQ29udGVudC5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICBwTGlua0RhdGEgPSBGREVfTmV3V2l0aChtX3BBbGxvY2F0b3IpIENYRkFfTGlua1VzZXJEYXRhKA0KKyAgICAgICAgICAgICAgICBtX3BBbGxvY2F0b3IsDQorICAgICAgICAgICAgICAgIHdzTGlua0NvbnRlbnQuR2V0QnVmZmVyKHdzTGlua0NvbnRlbnQuR2V0TGVuZ3RoKCkpKTsNCisgICAgICAgICAgICB3c0xpbmtDb250ZW50LlJlbGVhc2VCdWZmZXIod3NMaW5rQ29udGVudC5HZXRMZW5ndGgoKSk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGludDMyX3QgaVRhYkNvdW50ID0NCisgICAgICAgICAgICBtX3RleHRQYXJzZXIuQ291bnRUYWJzKGJDb250ZW50Tm9kZSA/IHBQYXJlbnRTdHlsZSA6IHBTdHlsZSk7DQorICAgICAgICBGWF9CT09MIGJTcGFjZVJ1biA9DQorICAgICAgICAgICAgbV90ZXh0UGFyc2VyLklzU3BhY2VSdW4oYkNvbnRlbnROb2RlID8gcFBhcmVudFN0eWxlIDogcFN0eWxlKTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICAgIGlmIChiQ29udGVudE5vZGUgJiYgaVRhYkNvdW50ID09IDApIHsNCisgICAgICAgICAgKChJRkRFX1hNTFRleHQqKXBYTUxOb2RlKS0+R2V0VGV4dCh3c1RleHQpOw0KKyAgICAgICAgfSBlbHNlIGlmICh3c05hbWUgPT0gRlhfV1NUUkMoTCJiciIpKSB7DQorICAgICAgICAgIHdzVGV4dCA9IEwnXG4nOw0KKyAgICAgICAgfSBlbHNlIGlmICh3c05hbWUgPT0gRlhfV1NUUkMoTCJsaSIpKSB7DQorICAgICAgICAgIGJDdXJMaSA9IFRSVUU7DQorICAgICAgICAgIGlmIChiSXNPbCkgew0KKyAgICAgICAgICAgIHdzVGV4dC5Gb3JtYXQoTCIlZC4gICIsIGlMaUNvdW50KTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICB3c1RleHQgPSAweDAwQjcgKyBGWF9XU1RSQyhMIiAgIik7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoIWJDb250ZW50Tm9kZSkgew0KKyAgICAgICAgICBpZiAoaVRhYkNvdW50ID4gMCkNCisgICAgICAgICAgICB3aGlsZSAoaVRhYkNvdW50LS0gPiAwKSB7DQorICAgICAgICAgICAgICB3c1RleHQgKz0gTCdcdCc7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICBtX3RleHRQYXJzZXIuR2V0RW1iYmVkT2JqKG1fcFRleHRQcm92aWRlciwgcFhNTE5vZGUsIHdzVGV4dCk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGludDMyX3QgaUxlbmd0aCA9IHdzVGV4dC5HZXRMZW5ndGgoKTsNCisgICAgICAgIGlmIChpTGVuZ3RoID4gMCAmJiBiQ29udGVudE5vZGUgJiYgIWJTcGFjZVJ1bikgew0KKyAgICAgICAgICBQcm9jZXNzVGV4dCh3c1RleHQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1fcExvYWRlcikgew0KKyAgICAgICAgICBpZiAod3NUZXh0LkdldExlbmd0aCgpID4gMCAmJg0KKyAgICAgICAgICAgICAgKG1fcExvYWRlci0+bV9kd0ZsYWdzICYgWEZBX0xPQURFUkNOVFhURkxHX0ZJTFRFUlNQQUNFKSkgew0KKyAgICAgICAgICAgIHdzVGV4dC5UcmltTGVmdCgweDIwKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoRkRFX0NTU0RJU1BMQVlfQmxvY2sgPT0gZURpc3BsYXkpIHsNCisgICAgICAgICAgICBtX3BMb2FkZXItPm1fZHdGbGFncyB8PSBYRkFfTE9BREVSQ05UWFRGTEdfRklMVEVSU1BBQ0U7DQorICAgICAgICAgIH0gZWxzZSBpZiAoRkRFX0NTU0RJU1BMQVlfSW5saW5lID09IGVEaXNwbGF5ICYmDQorICAgICAgICAgICAgICAgICAgICAgKG1fcExvYWRlci0+bV9kd0ZsYWdzICYgWEZBX0xPQURFUkNOVFhURkxHX0ZJTFRFUlNQQUNFKSkgew0KKyAgICAgICAgICAgIG1fcExvYWRlci0+bV9kd0ZsYWdzICY9IH5YRkFfTE9BREVSQ05UWFRGTEdfRklMVEVSU1BBQ0U7DQorICAgICAgICAgIH0gZWxzZSBpZiAod3NUZXh0LkdldExlbmd0aCgpID4gMCAmJg0KKyAgICAgICAgICAgICAgICAgICAgICgweDIwID09IHdzVGV4dC5HZXRBdCh3c1RleHQuR2V0TGVuZ3RoKCkgLSAxKSkpIHsNCisgICAgICAgICAgICBtX3BMb2FkZXItPm1fZHdGbGFncyB8PSBYRkFfTE9BREVSQ05UWFRGTEdfRklMVEVSU1BBQ0U7DQorICAgICAgICAgIH0gZWxzZSBpZiAod3NUZXh0LkdldExlbmd0aCgpID09IDApDQorICAgICAgICAgICAgOw0KKyAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICBtX3BMb2FkZXItPm1fZHdGbGFncyAmPSB+WEZBX0xPQURFUkNOVFhURkxHX0ZJTFRFUlNQQUNFOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAod3NUZXh0LkdldExlbmd0aCgpID4gMCkgew0KKyAgICAgICAgICBpZiAobV9wTG9hZGVyID09IE5VTEwgfHwgbV9wTG9hZGVyLT5tX2lDaGFyID09IDApIHsNCisgICAgICAgICAgICBpZiAocExpbmtEYXRhKSB7DQorICAgICAgICAgICAgICBwTGlua0RhdGEtPkFkZFJlZigpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDWEZBX1RleHRVc2VyRGF0YSogcFVzZXJEYXRhID0gRkRFX05ld1dpdGgobV9wQWxsb2NhdG9yKQ0KKyAgICAgICAgICAgICAgICBDWEZBX1RleHRVc2VyRGF0YShtX3BBbGxvY2F0b3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDb250ZW50Tm9kZSA/IHBQYXJlbnRTdHlsZSA6IHBTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExpbmtEYXRhKTsNCisgICAgICAgICAgICBtX3BCcmVhay0+U2V0VXNlckRhdGEocFVzZXJEYXRhKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoQXBwZW5kQ2hhcih3c1RleHQsIGZMaW5lUG9zLCAwLCBiU2F2ZVBpZWNlcykpIHsNCisgICAgICAgICAgICBpZiAobV9wTG9hZGVyKSB7DQorICAgICAgICAgICAgICBtX3BMb2FkZXItPm1fZHdGbGFncyAmPSB+WEZBX0xPQURFUkNOVFhURkxHX0ZJTFRFUlNQQUNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoSXNFbmQoYlNhdmVQaWVjZXMpKSB7DQorICAgICAgICAgICAgICBpZiAobV9wTG9hZGVyICYmIG1fcExvYWRlci0+bV9pVG90YWxMaW5lcyA+IC0xKSB7DQorICAgICAgICAgICAgICAgIG1fcExvYWRlci0+bV9wWE1MTm9kZSA9IHBYTUxOb2RlOw0KKyAgICAgICAgICAgICAgICBtX3BMb2FkZXItPm1fcFBhcmVudFN0eWxlID0gcFBhcmVudFN0eWxlOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHBTdHlsZSAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIHBTdHlsZS0+UmVsZWFzZSgpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBGWF9CT09MIHJldCA9IFRSVUU7DQorICAgIGZvciAoSUZERV9YTUxOb2RlKiBwQ2hpbGROb2RlID0NCisgICAgICAgICAgICAgcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7DQorICAgICAgICAgcENoaWxkTm9kZTsNCisgICAgICAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgICBpZiAoYkN1ck9sKSB7DQorICAgICAgICBpTGlDb3VudCsrOw0KKyAgICAgIH0NCisgICAgICByZXQgPSBMb2FkUmljaFRleHQocENoaWxkTm9kZSwgc3pUZXh0LCBmTGluZVBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQgPyBwU3R5bGUgOiBwUGFyZW50U3R5bGUsIGJTYXZlUGllY2VzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBwTGlua0RhdGEsIFRSVUUsIGJJc09sLCBpTGlDb3VudCk7DQorICAgICAgaWYgKHJldCA9PSBGQUxTRSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAobV9wTG9hZGVyKSB7DQorICAgICAgaWYgKEZERV9DU1NESVNQTEFZX0Jsb2NrID09IGVEaXNwbGF5KSB7DQorICAgICAgICBtX3BMb2FkZXItPm1fZHdGbGFncyB8PSBYRkFfTE9BREVSQ05UWFRGTEdfRklMVEVSU1BBQ0U7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChiQ3VyTGkpIHsNCisgICAgICBFbmRCcmVhayhGWF9SVEZCUkVBS19MaW5lQnJlYWssIGZMaW5lUG9zLCBiU2F2ZVBpZWNlcyk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGlmIChwQ29udGV4dCAhPSBOVUxMKSB7DQorICAgICAgZURpc3BsYXkgPSBwQ29udGV4dC0+R2V0RGlzcGxheSgpOw0KKyAgICB9DQorICB9DQorICBpZiAobV9iQmxvY2tDb250aW51ZSkgew0KKyAgICBpZiAocENvbnRleHQgIT0gTlVMTCAmJiAhYkNvbnRlbnROb2RlKSB7DQorICAgICAgRlhfRFdPUkQgZHdTdGF0dXMgPSAoZURpc3BsYXkgPT0gRkRFX0NTU0RJU1BMQVlfQmxvY2spDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBGWF9SVEZCUkVBS19QYXJhZ3JhcGhCcmVhaw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhfUlRGQlJFQUtfUGllY2VCcmVhazsNCisgICAgICBFbmRCcmVhayhkd1N0YXR1cywgZkxpbmVQb3MsIGJTYXZlUGllY2VzKTsNCisgICAgICBpZiAoZURpc3BsYXkgPT0gRkRFX0NTU0RJU1BMQVlfQmxvY2spIHsNCisgICAgICAgIGZMaW5lUG9zICs9IGZTcGFjZUJlbG93Ow0KKyAgICAgICAgaWYgKG1fcFRhYnN0b3BDb250ZXh0KSB7DQorICAgICAgICAgIG1fcFRhYnN0b3BDb250ZXh0LT5SZW1vdmVBbGwoKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgaWYgKHdzTmFtZSA9PSBGWF9XU1RSQyhMImEiKSkgew0KKyAgICAgICAgaWYgKHBMaW5rRGF0YSkgew0KKyAgICAgICAgICBwTGlua0RhdGEtPlJlbGVhc2UoKTsNCisgICAgICAgICAgcExpbmtEYXRhID0gbnVsbHB0cjsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgaWYgKElzRW5kKGJTYXZlUGllY2VzKSkgew0KKyAgICAgICAgaWYgKHBTdHlsZSkgew0KKyAgICAgICAgICBwU3R5bGUtPlJlbGVhc2UoKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChtX3BMb2FkZXIgJiYgbV9wTG9hZGVyLT5tX2lUb3RhbExpbmVzID4gLTEpIHsNCisgICAgICAgICAgbV9wTG9hZGVyLT5tX3BYTUxOb2RlID0NCisgICAgICAgICAgICAgIHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKTsNCisgICAgICAgICAgbV9wTG9hZGVyLT5tX3BQYXJlbnRTdHlsZSA9IHBQYXJlbnRTdHlsZTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmIChwU3R5bGUgIT0gTlVMTCkgew0KKyAgICBwU3R5bGUtPlJlbGVhc2UoKTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfVGV4dExheW91dDo6QXBwZW5kQ2hhcihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmTGluZVBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU3BhY2VBYm92ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlUGllY2VzKSB7DQorICBGWF9EV09SRCBkd1N0YXR1cyA9IDA7DQorICBpbnQzMl90IGlDaGFyID0gMDsNCisgIGlmIChtX3BMb2FkZXIpIHsNCisgICAgaUNoYXIgPSBtX3BMb2FkZXItPm1faUNoYXI7DQorICB9DQorICBpbnQzMl90IGlMZW5ndGggPSB3c1RleHQuR2V0TGVuZ3RoKCk7DQorICBmb3IgKGludDMyX3QgaSA9IGlDaGFyOyBpIDwgaUxlbmd0aDsgaSsrKSB7DQorICAgIEZYX1dDSEFSIHdjaCA9IHdzVGV4dC5HZXRBdChpKTsNCisgICAgaWYgKHdjaCA9PSAweEEwKSB7DQorICAgICAgd2NoID0gMHgyMDsNCisgICAgfQ0KKyAgICBpZiAoKGR3U3RhdHVzID0gbV9wQnJlYWstPkFwcGVuZENoYXIod2NoKSkgPiBGWF9SVEZCUkVBS19QaWVjZUJyZWFrKSB7DQorICAgICAgQXBwZW5kVGV4dExpbmUoZHdTdGF0dXMsIGZMaW5lUG9zLCBiU2F2ZVBpZWNlcyk7DQorICAgICAgaWYgKElzRW5kKGJTYXZlUGllY2VzKSkgew0KKyAgICAgICAgaWYgKG1fcExvYWRlciAhPSBOVUxMKSB7DQorICAgICAgICAgIG1fcExvYWRlci0+bV9pQ2hhciA9IGk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQorICAgICAgaWYgKGR3U3RhdHVzID09IEZYX1JURkJSRUFLX1BhcmFncmFwaEJyZWFrICYmIG1fYlJpY2hUZXh0KSB7DQorICAgICAgICBmTGluZVBvcyArPSBmU3BhY2VBYm92ZTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmIChtX3BMb2FkZXIpIHsNCisgICAgbV9wTG9hZGVyLT5tX2lDaGFyID0gMDsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX1RleHRMYXlvdXQ6OklzRW5kKEZYX0JPT0wgYlNhdmVQaWVjZXMpIHsNCisgIGlmICghYlNhdmVQaWVjZXMpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKG1fcExvYWRlciAmJiBtX3BMb2FkZXItPm1faVRvdGFsTGluZXMgPiAwKSB7DQorICAgIHJldHVybiBtX2lMaW5lcyA+PSBtX3BMb2FkZXItPm1faVRvdGFsTGluZXM7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpQcm9jZXNzVGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7DQorICBpbnQzMl90IGlMZW4gPSB3c1RleHQuR2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbiA9PSAwKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX1dDSEFSKiBwc3ogPSB3c1RleHQuR2V0QnVmZmVyKGlMZW4pOw0KKyAgaW50MzJfdCBpVHJpbUxlZnQgPSAwOw0KKyAgRlhfV0NIQVIgd2NoID0gMCwgd1ByZXYgPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUxlbjsgaSsrKSB7DQorICAgIHdjaCA9IHBzeltpXTsNCisgICAgaWYgKHdjaCA8IDB4MjApIHsNCisgICAgICB3Y2ggPSAweDIwOw0KKyAgICB9DQorICAgIGlmICh3Y2ggPT0gMHgyMCAmJiB3UHJldiA9PSAweDIwKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgd1ByZXYgPSB3Y2g7DQorICAgIHBzeltpVHJpbUxlZnQrK10gPSB3Y2g7DQorICB9DQorICB3c1RleHQuUmVsZWFzZUJ1ZmZlcihpTGVuKTsNCisgIHdzVGV4dCA9IHdzVGV4dC5MZWZ0KGlUcmltTGVmdCk7DQorfQ0KK3ZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpFbmRCcmVhayhGWF9EV09SRCBkd1N0YXR1cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZMaW5lUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlUGllY2VzKSB7DQorICBkd1N0YXR1cyA9IG1fcEJyZWFrLT5FbmRCcmVhayhkd1N0YXR1cyk7DQorICBpZiAoZHdTdGF0dXMgPiBGWF9SVEZCUkVBS19QaWVjZUJyZWFrKSB7DQorICAgIEFwcGVuZFRleHRMaW5lKGR3U3RhdHVzLCBmTGluZVBvcywgYlNhdmVQaWVjZXMsIFRSVUUpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfVGV4dExheW91dDo6RG9UYWJzdG9wcyhJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1BpZWNlTGluZSogcFBpZWNlTGluZSkgew0KKyAgaWYgKG1fcFRhYnN0b3BDb250ZXh0ID09IE5VTEwgfHwgbV9wVGFic3RvcENvbnRleHQtPm1faVRhYkNvdW50ID09IDApIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKHBTdHlsZSA9PSBOVUxMIHx8IHBQaWVjZUxpbmUgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlQaWVjZXMgPSBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXMuR2V0U2l6ZSgpOw0KKyAgaWYgKGlQaWVjZXMgPT0gMCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBYRkFfTFBURVhUUElFQ0UgcFBpZWNlID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldEF0KGlQaWVjZXMgLSAxKTsNCisgIGludDMyX3QmIGlUYWJzdG9wc0luZGV4ID0gbV9wVGFic3RvcENvbnRleHQtPm1faVRhYkluZGV4Ow0KKyAgaW50MzJfdCBpQ291bnQgPSBtX3RleHRQYXJzZXIuQ291bnRUYWJzKHBTdHlsZSk7DQorICBpZiAoaVRhYnN0b3BzSW5kZXggPiBtX3BUYWJzdG9wQ29udGV4dC0+bV9pVGFiQ291bnQgLSAxKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChpQ291bnQgPiAwKSB7DQorICAgIGlUYWJzdG9wc0luZGV4Kys7DQorICAgIG1fcFRhYnN0b3BDb250ZXh0LT5tX2JUYWJzdG9wcyA9IFRSVUU7DQorICAgIEZYX0ZMT0FUIGZSaWdodCA9IDA7DQorICAgIGlmIChpUGllY2VzID4gMSkgew0KKyAgICAgIFhGQV9MUFRFWFRQSUVDRSBwID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldEF0KGlQaWVjZXMgLSAyKTsNCisgICAgICBmUmlnaHQgPSBwLT5ydFBpZWNlLnJpZ2h0KCk7DQorICAgIH0NCisgICAgbV9wVGFic3RvcENvbnRleHQtPm1fZlRhYldpZHRoID0NCisgICAgICAgIHBQaWVjZS0+cnRQaWVjZS53aWR0aCArIHBQaWVjZS0+cnRQaWVjZS5sZWZ0IC0gZlJpZ2h0Ow0KKyAgfSBlbHNlIGlmIChpVGFic3RvcHNJbmRleCA+IC0xKSB7DQorICAgIEZYX0ZMT0FUIGZMZWZ0ID0gMDsNCisgICAgaWYgKG1fcFRhYnN0b3BDb250ZXh0LT5tX2JUYWJzdG9wcykgew0KKyAgICAgIFhGQV9UQUJTVE9QUyogcFRhYnN0b3BzID0NCisgICAgICAgICAgbV9wVGFic3RvcENvbnRleHQtPm1fdGFic3RvcHMuR2V0RGF0YVB0cihpVGFic3RvcHNJbmRleCk7DQorICAgICAgRlhfRFdPUkQgZHdBbGdpbiA9IHBUYWJzdG9wcy0+ZHdBbGlnbjsNCisgICAgICBpZiAoZHdBbGdpbiA9PSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VyhMImNlbnRlciIsIDYpKSB7DQorICAgICAgICBmTGVmdCA9IHBQaWVjZS0+cnRQaWVjZS53aWR0aCAvIDIuMGY7DQorICAgICAgfSBlbHNlIGlmIChkd0FsZ2luID09IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKEwicmlnaHQiLCA1KSB8fA0KKyAgICAgICAgICAgICAgICAgZHdBbGdpbiA9PSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VyhMImJlZm9yZSIsIDYpKSB7DQorICAgICAgICBmTGVmdCA9IHBQaWVjZS0+cnRQaWVjZS53aWR0aDsNCisgICAgICB9IGVsc2UgaWYgKGR3QWxnaW4gPT0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoTCJkZWNpbWFsIiwgNykpIHsNCisgICAgICAgIGludDMyX3QgaUNoYXJzID0gcFBpZWNlLT5pQ2hhcnM7DQorICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ2hhcnM7IGkrKykgew0KKyAgICAgICAgICBpZiAocFBpZWNlLT5wc3pUZXh0W2ldID09IEwnLicpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBmTGVmdCArPSBwUGllY2UtPnBXaWR0aHNbaV0gLyAyMDAwMC4wZjsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgbV9wVGFic3RvcENvbnRleHQtPm1fZkxlZnQgPQ0KKyAgICAgICAgICBzdGQ6Om1pbihmTGVmdCwgbV9wVGFic3RvcENvbnRleHQtPm1fZlRhYldpZHRoKTsNCisgICAgICBtX3BUYWJzdG9wQ29udGV4dC0+bV9iVGFic3RvcHMgPSBGQUxTRTsNCisgICAgICBtX3BUYWJzdG9wQ29udGV4dC0+bV9mVGFiV2lkdGggPSAwOw0KKyAgICB9DQorICAgIHBQaWVjZS0+cnRQaWVjZS5sZWZ0IC09IG1fcFRhYnN0b3BDb250ZXh0LT5tX2ZMZWZ0Ow0KKyAgfQ0KK30NCit2b2lkIENYRkFfVGV4dExheW91dDo6QXBwZW5kVGV4dExpbmUoRlhfRFdPUkQgZHdTdGF0dXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmTGluZVBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVBpZWNlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRW5kQnJlYWspIHsNCisgIGludDMyX3QgaVBpZWNlcyA9IG1fcEJyZWFrLT5Db3VudEJyZWFrUGllY2VzKCk7DQorICBpZiAoaVBpZWNlcyA8IDEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUgPSBOVUxMOw0KKyAgaWYgKGJTYXZlUGllY2VzKSB7DQorICAgIENYRkFfUGllY2VMaW5lKiBwUGllY2VMaW5lID0gRkRFX05ld1dpdGgobV9wQWxsb2NhdG9yKSBDWEZBX1BpZWNlTGluZTsNCisgICAgbV9waWVjZUxpbmVzLkFkZChwUGllY2VMaW5lKTsNCisgICAgaWYgKG1fcFRhYnN0b3BDb250ZXh0KSB7DQorICAgICAgbV9wVGFic3RvcENvbnRleHQtPlJlc2V0KCk7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZkxpbmVTdGVwID0gMCwgZkJhc2VMaW5lID0gMDsNCisgICAgaW50MzJfdCBpID0gMDsNCisgICAgZm9yIChpID0gMDsgaSA8IGlQaWVjZXM7IGkrKykgew0KKyAgICAgIGNvbnN0IENGWF9SVEZQaWVjZSogcFBpZWNlID0gbV9wQnJlYWstPkdldEJyZWFrUGllY2UoaSk7DQorICAgICAgQ1hGQV9UZXh0VXNlckRhdGEqIHBVc2VyRGF0YSA9IChDWEZBX1RleHRVc2VyRGF0YSopcFBpZWNlLT5tX3BVc2VyRGF0YTsNCisgICAgICBpZiAocFVzZXJEYXRhICE9IE5VTEwpIHsNCisgICAgICAgIHBTdHlsZSA9IHBVc2VyRGF0YS0+bV9wU3R5bGU7DQorICAgICAgfQ0KKyAgICAgIEZYX0ZMT0FUIGZWZXJTY2FsZSA9IHBQaWVjZS0+bV9pVmVydGljYWxTY2FsZSAvIDEwMC4wZjsNCisgICAgICBYRkFfTFBURVhUUElFQ0UgcFRQID0NCisgICAgICAgICAgKFhGQV9MUFRFWFRQSUVDRSltX3BBbGxvY2F0b3ItPkFsbG9jKHNpemVvZihYRkFfVEVYVFBJRUNFKSk7DQorICAgICAgcFRQLT5wc3pUZXh0ID0NCisgICAgICAgICAgKEZYX1dDSEFSKiltX3BBbGxvY2F0b3ItPkFsbG9jKHBQaWVjZS0+bV9pQ2hhcnMgKiBzaXplb2YoRlhfV0NIQVIpKTsNCisgICAgICBwVFAtPnBXaWR0aHMgPQ0KKyAgICAgICAgICAoaW50MzJfdCopbV9wQWxsb2NhdG9yLT5BbGxvYyhwUGllY2UtPm1faUNoYXJzICogc2l6ZW9mKGludDMyX3QpKTsNCisgICAgICBwVFAtPmlDaGFycyA9IHBQaWVjZS0+bV9pQ2hhcnM7DQorICAgICAgcFBpZWNlLT5HZXRTdHJpbmcocFRQLT5wc3pUZXh0KTsNCisgICAgICBwUGllY2UtPkdldFdpZHRocyhwVFAtPnBXaWR0aHMpOw0KKyAgICAgIHBUUC0+aUJpZGlMZXZlbCA9IHBQaWVjZS0+bV9pQmlkaUxldmVsOw0KKyAgICAgIHBUUC0+aUhvclNjYWxlID0gcFBpZWNlLT5tX2lIb3Jpem9udGFsU2NhbGU7DQorICAgICAgcFRQLT5pVmVyU2NhbGUgPSBwUGllY2UtPm1faVZlcnRpY2FsU2NhbGU7DQorICAgICAgbV90ZXh0UGFyc2VyLkdldFVuZGVybGluZShtX3BUZXh0UHJvdmlkZXIsIHBTdHlsZSwgcFRQLT5pVW5kZXJsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRQLT5pUGVyaW9kKTsNCisgICAgICBtX3RleHRQYXJzZXIuR2V0TGluZXRocm91Z2gobV9wVGV4dFByb3ZpZGVyLCBwU3R5bGUsIHBUUC0+aUxpbmVUaHJvdWdoKTsNCisgICAgICBwVFAtPmR3Q29sb3IgPSBtX3RleHRQYXJzZXIuR2V0Q29sb3IobV9wVGV4dFByb3ZpZGVyLCBwU3R5bGUpOw0KKyAgICAgIHBUUC0+cEZvbnQgPSBtX3RleHRQYXJzZXIuR2V0Rm9udChtX3BUZXh0UHJvdmlkZXIsIHBTdHlsZSk7DQorICAgICAgcFRQLT5mRm9udFNpemUgPSBtX3RleHRQYXJzZXIuR2V0Rm9udFNpemUobV9wVGV4dFByb3ZpZGVyLCBwU3R5bGUpOw0KKyAgICAgIHBUUC0+cnRQaWVjZS5sZWZ0ID0gcFBpZWNlLT5tX2lTdGFydFBvcyAvIDIwMDAwLjBmOw0KKyAgICAgIHBUUC0+cnRQaWVjZS53aWR0aCA9IHBQaWVjZS0+bV9pV2lkdGggLyAyMDAwMC4wZjsNCisgICAgICBwVFAtPnJ0UGllY2UuaGVpZ2h0ID0gKEZYX0ZMT0FUKXBQaWVjZS0+bV9pRm9udFNpemUgKiBmVmVyU2NhbGUgLyAyMC4wZjsNCisgICAgICBGWF9GTE9BVCBmQmFzZUxpbmVUZW1wID0NCisgICAgICAgICAgbV90ZXh0UGFyc2VyLkdldEJhc2VsaW5lKG1fcFRleHRQcm92aWRlciwgcFN0eWxlKTsNCisgICAgICBwVFAtPnJ0UGllY2UudG9wID0gZkJhc2VMaW5lVGVtcDsNCisgICAgICBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXMuQWRkKHBUUCk7DQorICAgICAgRlhfRkxPQVQgZkxpbmVIZWlnaHQgPSBtX3RleHRQYXJzZXIuR2V0TGluZUhlaWdodCgNCisgICAgICAgICAgbV9wVGV4dFByb3ZpZGVyLCBwU3R5bGUsIG1faUxpbmVzID09IDAsIGZWZXJTY2FsZSk7DQorICAgICAgaWYgKGZCYXNlTGluZVRlbXAgPiAwKSB7DQorICAgICAgICBGWF9GTE9BVCBmTGluZUhlaWdodFRtcCA9IGZCYXNlTGluZVRlbXAgKyBwVFAtPnJ0UGllY2UuaGVpZ2h0Ow0KKyAgICAgICAgaWYgKGZMaW5lSGVpZ2h0IDwgZkxpbmVIZWlnaHRUbXApIHsNCisgICAgICAgICAgZkxpbmVIZWlnaHQgPSBmTGluZUhlaWdodFRtcDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGZCYXNlTGluZVRlbXAgPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSBpZiAoZkJhc2VMaW5lIDwgLWZCYXNlTGluZVRlbXApIHsNCisgICAgICAgIGZCYXNlTGluZSA9IC1mQmFzZUxpbmVUZW1wOw0KKyAgICAgIH0NCisgICAgICBmTGluZVN0ZXAgPSBzdGQ6Om1heChmTGluZVN0ZXAsIGZMaW5lSGVpZ2h0KTsNCisgICAgICBpZiAocFVzZXJEYXRhICE9IE5VTEwgJiYgcFVzZXJEYXRhLT5tX3BMaW5rRGF0YSAhPSBOVUxMKSB7DQorICAgICAgICBwVXNlckRhdGEtPm1fcExpbmtEYXRhLT5BZGRSZWYoKTsNCisgICAgICAgIHBUUC0+cExpbmtEYXRhID0gcFVzZXJEYXRhLT5tX3BMaW5rRGF0YTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcFRQLT5wTGlua0RhdGEgPSBOVUxMOw0KKyAgICAgIH0NCisgICAgICBEb1RhYnN0b3BzKHBTdHlsZSwgcFBpZWNlTGluZSk7DQorICAgIH0NCisgICAgZm9yIChpID0gMDsgaSA8IGlQaWVjZXM7IGkrKykgew0KKyAgICAgIFhGQV9MUFRFWFRQSUVDRSBwVFAgPSBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXMuR2V0QXQoaSk7DQorICAgICAgRlhfRkxPQVQmIGZUb3AgPSBwVFAtPnJ0UGllY2UudG9wOw0KKyAgICAgIEZYX0ZMT0FUIGZCYXNlTGluZVRlbXAgPSBmVG9wOw0KKyAgICAgIGZUb3AgPSBmTGluZVBvcyArIGZMaW5lU3RlcCAtIHBUUC0+cnRQaWVjZS5oZWlnaHQgLSBmQmFzZUxpbmVUZW1wOw0KKyAgICAgIGZUb3AgPSBzdGQ6Om1heCgwLjBmLCBmVG9wKTsNCisgICAgfQ0KKyAgICBmTGluZVBvcyArPSBmTGluZVN0ZXAgKyBmQmFzZUxpbmU7DQorICB9IGVsc2Ugew0KKyAgICBGWF9GTE9BVCBmTGluZVN0ZXAgPSAwOw0KKyAgICBGWF9GTE9BVCBmTGluZVdpZHRoID0gMDsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVBpZWNlczsgaSsrKSB7DQorICAgICAgY29uc3QgQ0ZYX1JURlBpZWNlKiBwUGllY2UgPSBtX3BCcmVhay0+R2V0QnJlYWtQaWVjZShpKTsNCisgICAgICBDWEZBX1RleHRVc2VyRGF0YSogcFVzZXJEYXRhID0gKENYRkFfVGV4dFVzZXJEYXRhKilwUGllY2UtPm1fcFVzZXJEYXRhOw0KKyAgICAgIGlmIChwVXNlckRhdGEgIT0gTlVMTCkgew0KKyAgICAgICAgcFN0eWxlID0gcFVzZXJEYXRhLT5tX3BTdHlsZTsNCisgICAgICB9DQorICAgICAgRlhfRkxPQVQgZlZlclNjYWxlID0gcFBpZWNlLT5tX2lWZXJ0aWNhbFNjYWxlIC8gMTAwLjBmOw0KKyAgICAgIEZYX0ZMT0FUIGZCYXNlTGluZSA9IG1fdGV4dFBhcnNlci5HZXRCYXNlbGluZShtX3BUZXh0UHJvdmlkZXIsIHBTdHlsZSk7DQorICAgICAgRlhfRkxPQVQgZkxpbmVIZWlnaHQgPSBtX3RleHRQYXJzZXIuR2V0TGluZUhlaWdodCgNCisgICAgICAgICAgbV9wVGV4dFByb3ZpZGVyLCBwU3R5bGUsIG1faUxpbmVzID09IDAsIGZWZXJTY2FsZSk7DQorICAgICAgaWYgKGZCYXNlTGluZSA+IDApIHsNCisgICAgICAgIEZYX0ZMT0FUIGZMaW5lSGVpZ2h0VG1wID0NCisgICAgICAgICAgICBmQmFzZUxpbmUgKyAoRlhfRkxPQVQpcFBpZWNlLT5tX2lGb250U2l6ZSAqIGZWZXJTY2FsZSAvIDIwLjBmOw0KKyAgICAgICAgaWYgKGZMaW5lSGVpZ2h0IDwgZkxpbmVIZWlnaHRUbXApIHsNCisgICAgICAgICAgZkxpbmVIZWlnaHQgPSBmTGluZUhlaWdodFRtcDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgZkxpbmVTdGVwID0gc3RkOjptYXgoZkxpbmVTdGVwLCBmTGluZUhlaWdodCk7DQorICAgICAgZkxpbmVXaWR0aCArPSBwUGllY2UtPm1faVdpZHRoIC8gMjAwMDAuMGY7DQorICAgIH0NCisgICAgZkxpbmVQb3MgKz0gZkxpbmVTdGVwOw0KKyAgICBtX2ZNYXhXaWR0aCA9IHN0ZDo6bWF4KG1fZk1heFdpZHRoLCBmTGluZVdpZHRoKTsNCisgICAgaWYgKG1fcExvYWRlciAmJiBtX3BMb2FkZXItPm1fYlNhdmVMaW5lSGVpZ2h0KSB7DQorICAgICAgRlhfRkxPQVQgZkhlaWdodCA9IGZMaW5lUG9zIC0gbV9wTG9hZGVyLT5tX2ZMYXN0UG9zOw0KKyAgICAgIG1fcExvYWRlci0+bV9mTGFzdFBvcyA9IGZMaW5lUG9zOw0KKyAgICAgIG1fcExvYWRlci0+bV9saW5lSGVpZ2h0cy5BZGQoZkhlaWdodCk7DQorICAgIH0NCisgIH0NCisgIGlmIChwU3R5bGUpIHsNCisgICAgcFN0eWxlLT5BZGRSZWYoKTsNCisgIH0NCisgIG1fcEJyZWFrLT5DbGVhckJyZWFrUGllY2VzKCk7DQorICBpZiAoZHdTdGF0dXMgPT0gRlhfUlRGQlJFQUtfUGFyYWdyYXBoQnJlYWspIHsNCisgICAgbV9wQnJlYWstPlJlc2V0KCk7DQorICAgIGlmICghcFN0eWxlICYmIGJFbmRCcmVhaykgew0KKyAgICAgIENYRkFfUGFyYSBwYXJhID0gbV9wVGV4dFByb3ZpZGVyLT5HZXRQYXJhTm9kZSgpOw0KKyAgICAgIGlmIChwYXJhLklzRXhpc3RJblhNTCgpKSB7DQorICAgICAgICBGWF9GTE9BVCBmU3RhcnRQb3MgPSBwYXJhLkdldE1hcmdpbkxlZnQoKTsNCisgICAgICAgIEZYX0ZMT0FUIGZJbmRlbnQgPSBwYXJhLkdldFRleHRJbmRlbnQoKTsNCisgICAgICAgIGlmIChmSW5kZW50ID4gMCkgew0KKyAgICAgICAgICBmU3RhcnRQb3MgKz0gZkluZGVudDsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0ZMT0FUIGZTcGFjZUJlbG93ID0gcGFyYS5HZXRTcGFjZUJlbG93KCk7DQorICAgICAgICBpZiAoZlNwYWNlQmVsb3cgPCAwLjFmKSB7DQorICAgICAgICAgIGZTcGFjZUJlbG93ID0gMDsNCisgICAgICAgIH0NCisgICAgICAgIG1fcEJyZWFrLT5TZXRMaW5lU3RhcnRQb3MoZlN0YXJ0UG9zKTsNCisgICAgICAgIGZMaW5lUG9zICs9IGZTcGFjZUJlbG93Ow0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHBTdHlsZSkgew0KKyAgICBGWF9GTE9BVCBmU3RhcnQgPSAwOw0KKyAgICBjb25zdCBGREVfQ1NTUkVDVCogcFJlY3QgPSBwU3R5bGUtPkdldEJvdW5kYXJ5U3R5bGVzKCktPkdldE1hcmdpbldpZHRoKCk7DQorICAgIGlmIChwUmVjdCkgew0KKyAgICAgIGZTdGFydCA9IHBSZWN0LT5sZWZ0LkdldFZhbHVlKCk7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZlRleHRJbmRlbnQgPQ0KKyAgICAgICAgcFN0eWxlLT5HZXRQYXJhZ3JhcGhTdHlsZXMoKS0+R2V0VGV4dEluZGVudCgpLkdldFZhbHVlKCk7DQorICAgIGlmIChmVGV4dEluZGVudCA8IDApIHsNCisgICAgICBmU3RhcnQgLT0gZlRleHRJbmRlbnQ7DQorICAgIH0NCisgICAgbV9wQnJlYWstPlNldExpbmVTdGFydFBvcyhmU3RhcnQpOw0KKyAgICBwU3R5bGUtPlJlbGVhc2UoKTsNCisgIH0NCisgIG1faUxpbmVzKys7DQorfQ0KK3ZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpSZW5kZXJTdHJpbmcoSUZERV9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1NvbGlkQnJ1c2gqIHBCcnVzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfUGllY2VMaW5lKiBwUGllY2VMaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUGllY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiB0bURvYzJEZXZpY2UpIHsNCisgIFhGQV9MUENURVhUUElFQ0UgcFBpZWNlID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldEF0KGlQaWVjZSk7DQorICBpbnQzMl90IGlDb3VudCA9IEdldERpc3BsYXlQb3MocFBpZWNlLCBwQ2hhclBvcyk7DQorICBpZiAoaUNvdW50ID4gMCkgew0KKyAgICBwQnJ1c2gtPlNldENvbG9yKHBQaWVjZS0+ZHdDb2xvcik7DQorICAgIHBEZXZpY2UtPkRyYXdTdHJpbmcocEJydXNoLCBwUGllY2UtPnBGb250LCBwQ2hhclBvcywgaUNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBQaWVjZS0+ZkZvbnRTaXplLCAmdG1Eb2MyRGV2aWNlKTsNCisgIH0NCisgIHBQaWVjZUxpbmUtPm1fY2hhckNvdW50cy5BZGQoaUNvdW50KTsNCit9DQordm9pZCBDWEZBX1RleHRMYXlvdXQ6OlJlbmRlclBhdGgoSUZERV9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9QaWVjZUxpbmUqIHBQaWVjZUxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUGllY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIHRtRG9jMkRldmljZSkgew0KKyAgWEZBX1RFWFRQSUVDRSogcFBpZWNlID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzLkdldEF0KGlQaWVjZSk7DQorICBGWF9CT09MIGJOb1VuZGVybGluZSA9IHBQaWVjZS0+aVVuZGVybGluZSA8IDEgfHwgcFBpZWNlLT5pVW5kZXJsaW5lID4gMjsNCisgIEZYX0JPT0wgYk5vTGluZVRocm91Z2ggPSBwUGllY2UtPmlMaW5lVGhyb3VnaCA8IDEgfHwgcFBpZWNlLT5pTGluZVRocm91Z2ggPiAyOw0KKyAgaWYgKGJOb1VuZGVybGluZSAmJiBiTm9MaW5lVGhyb3VnaCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBwUGVuLT5TZXRDb2xvcihwUGllY2UtPmR3Q29sb3IpOw0KKyAgSUZERV9QYXRoKiBwUGF0aCA9IElGREVfUGF0aDo6Q3JlYXRlKCk7DQorICBpbnQzMl90IGlDaGFycyA9IEdldERpc3BsYXlQb3MocFBpZWNlLCBwQ2hhclBvcyk7DQorICBpZiAoaUNoYXJzID4gMCkgew0KKyAgICBDRlhfUG9pbnRGIHB0MSwgcHQyOw0KKyAgICBGWF9GTE9BVCBmRW5kWSA9IHBDaGFyUG9zWzBdLm1fT3JpZ2luWSArIDEuMDVmOw0KKyAgICBpbnQzMl90IGkgPSAwOw0KKyAgICBpZiAocFBpZWNlLT5pUGVyaW9kID09IFhGQV9BVFRSSUJVVEVFTlVNX1dvcmQpIHsNCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwUGllY2UtPmlVbmRlcmxpbmU7IGkrKykgew0KKyAgICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaUNoYXJzOyBqKyspIHsNCisgICAgICAgICAgcHQxLnggPSBwQ2hhclBvc1tqXS5tX09yaWdpblg7DQorICAgICAgICAgIHB0Mi54ID0NCisgICAgICAgICAgICAgIHB0MS54ICsgcENoYXJQb3Nbal0ubV9Gb250Q2hhcldpZHRoICogcFBpZWNlLT5mRm9udFNpemUgLyAxMDAwLjBmOw0KKyAgICAgICAgICBwdDEueSA9IHB0Mi55ID0gZkVuZFk7DQorICAgICAgICAgIHBQYXRoLT5BZGRMaW5lKHB0MSwgcHQyKTsNCisgICAgICAgIH0NCisgICAgICAgIGZFbmRZICs9IDIuMGY7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHB0MS54ID0gcENoYXJQb3NbMF0ubV9PcmlnaW5YOw0KKyAgICAgIHB0Mi54ID0NCisgICAgICAgICAgcENoYXJQb3NbaUNoYXJzIC0gMV0ubV9PcmlnaW5YICsNCisgICAgICAgICAgcENoYXJQb3NbaUNoYXJzIC0gMV0ubV9Gb250Q2hhcldpZHRoICogcFBpZWNlLT5mRm9udFNpemUgLyAxMDAwLjBmOw0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHBQaWVjZS0+aVVuZGVybGluZTsgaSsrKSB7DQorICAgICAgICBwdDEueSA9IHB0Mi55ID0gZkVuZFk7DQorICAgICAgICBwUGF0aC0+QWRkTGluZShwdDEsIHB0Mik7DQorICAgICAgICBmRW5kWSArPSAyLjBmOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBmRW5kWSA9IHBDaGFyUG9zWzBdLm1fT3JpZ2luWSAtIHBQaWVjZS0+cnRQaWVjZS5oZWlnaHQgKiAwLjI1ZjsNCisgICAgcHQxLnggPSBwQ2hhclBvc1swXS5tX09yaWdpblg7DQorICAgIHB0Mi54ID0gcENoYXJQb3NbaUNoYXJzIC0gMV0ubV9PcmlnaW5YICsNCisgICAgICAgICAgICBwQ2hhclBvc1tpQ2hhcnMgLSAxXS5tX0ZvbnRDaGFyV2lkdGggKiBwUGllY2UtPmZGb250U2l6ZSAvIDEwMDAuMGY7DQorICAgIGZvciAoaSA9IDA7IGkgPCBwUGllY2UtPmlMaW5lVGhyb3VnaDsgaSsrKSB7DQorICAgICAgcHQxLnkgPSBwdDIueSA9IGZFbmRZOw0KKyAgICAgIHBQYXRoLT5BZGRMaW5lKHB0MSwgcHQyKTsNCisgICAgICBmRW5kWSArPSAyLjBmOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBpZiAoYk5vTGluZVRocm91Z2ggJiYNCisgICAgICAgIChiTm9VbmRlcmxpbmUgfHwgcFBpZWNlLT5pUGVyaW9kICE9IFhGQV9BVFRSSUJVVEVFTlVNX0FsbCkpIHsNCisgICAgICBnb3RvIFhGQV9SZW5kZXJQYXRoUmV0Ow0KKyAgICB9DQorICAgIGludDMyX3QgaUNoYXJzVG1wID0gMDsNCisgICAgaW50MzJfdCBpUGllY2VQcmV2ID0gaVBpZWNlLCBpUGllY2VOZXh0ID0gaVBpZWNlOw0KKyAgICB3aGlsZSAoaVBpZWNlUHJldiA+IDApIHsNCisgICAgICBpUGllY2VQcmV2LS07DQorICAgICAgaUNoYXJzVG1wID0gcFBpZWNlTGluZS0+bV9jaGFyQ291bnRzLkdldEF0KGlQaWVjZVByZXYpOw0KKyAgICAgIGlmIChpQ2hhcnNUbXAgPiAwKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGlDaGFyc1RtcCA9PSAwKSB7DQorICAgICAgZ290byBYRkFfUmVuZGVyUGF0aFJldDsNCisgICAgfQ0KKyAgICBpQ2hhcnNUbXAgPSAwOw0KKyAgICBpbnQzMl90IGlQaWVjZXMgPSBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXMuR2V0U2l6ZSgpOw0KKyAgICB3aGlsZSAoaVBpZWNlTmV4dCA8IGlQaWVjZXMgLSAxKSB7DQorICAgICAgaVBpZWNlTmV4dCsrOw0KKyAgICAgIGlDaGFyc1RtcCA9IHBQaWVjZUxpbmUtPm1fY2hhckNvdW50cy5HZXRBdChpUGllY2VOZXh0KTsNCisgICAgICBpZiAoaUNoYXJzVG1wID4gMCkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChpQ2hhcnNUbXAgPT0gMCkgew0KKyAgICAgIGdvdG8gWEZBX1JlbmRlclBhdGhSZXQ7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZk9yZ1ggPSAwLjBmLCBmRW5kWCA9IDAuMGY7DQorICAgIHBQaWVjZSA9IHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlcy5HZXRBdChpUGllY2VQcmV2KTsNCisgICAgaUNoYXJzID0gR2V0RGlzcGxheVBvcyhwUGllY2UsIHBDaGFyUG9zKTsNCisgICAgaWYgKGlDaGFycyA8IDEpIHsNCisgICAgICBnb3RvIFhGQV9SZW5kZXJQYXRoUmV0Ow0KKyAgICB9DQorICAgIGZPcmdYID0gcENoYXJQb3NbaUNoYXJzIC0gMV0ubV9PcmlnaW5YICsNCisgICAgICAgICAgICBwQ2hhclBvc1tpQ2hhcnMgLSAxXS5tX0ZvbnRDaGFyV2lkdGggKiBwUGllY2UtPmZGb250U2l6ZSAvIDEwMDAuMGY7DQorICAgIHBQaWVjZSA9IHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlcy5HZXRBdChpUGllY2VOZXh0KTsNCisgICAgaUNoYXJzID0gR2V0RGlzcGxheVBvcyhwUGllY2UsIHBDaGFyUG9zKTsNCisgICAgaWYgKGlDaGFycyA8IDEpIHsNCisgICAgICBnb3RvIFhGQV9SZW5kZXJQYXRoUmV0Ow0KKyAgICB9DQorICAgIGZFbmRYID0gcENoYXJQb3NbMF0ubV9PcmlnaW5YOw0KKyAgICBDRlhfUG9pbnRGIHB0MSwgcHQyOw0KKyAgICBwdDEueCA9IGZPcmdYLCBwdDIueCA9IGZFbmRYOw0KKyAgICBGWF9GTE9BVCBmRW5kWSA9IHBDaGFyUG9zWzBdLm1fT3JpZ2luWSArIDEuMDVmOw0KKyAgICBpbnQzMl90IGkgPSAwOw0KKyAgICBmb3IgKGkgPSAwOyBpIDwgcFBpZWNlLT5pVW5kZXJsaW5lOyBpKyspIHsNCisgICAgICBwdDEueSA9IHB0Mi55ID0gZkVuZFk7DQorICAgICAgcFBhdGgtPkFkZExpbmUocHQxLCBwdDIpOw0KKyAgICAgIGZFbmRZICs9IDIuMGY7DQorICAgIH0NCisgICAgZkVuZFkgPSBwQ2hhclBvc1swXS5tX09yaWdpblkgLSBwUGllY2UtPnJ0UGllY2UuaGVpZ2h0ICogMC4yNWY7DQorICAgIGZvciAoaSA9IDA7IGkgPCBwUGllY2UtPmlMaW5lVGhyb3VnaDsgaSsrKSB7DQorICAgICAgcHQxLnkgPSBwdDIueSA9IGZFbmRZOw0KKyAgICAgIHBQYXRoLT5BZGRMaW5lKHB0MSwgcHQyKTsNCisgICAgICBmRW5kWSArPSAyLjBmOw0KKyAgICB9DQorICB9DQorICBwRGV2aWNlLT5EcmF3UGF0aChwUGVuLCAxLCBwUGF0aCwgJnRtRG9jMkRldmljZSk7DQorWEZBX1JlbmRlclBhdGhSZXQ6DQorICBwUGF0aC0+UmVsZWFzZSgpOw0KK30NCitpbnQzMl90IENYRkFfVGV4dExheW91dDo6R2V0RGlzcGxheVBvcyhYRkFfTFBDVEVYVFBJRUNFIHBQaWVjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ2hhckNvZGUpIHsNCisgIGlmIChwUGllY2UgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIEZYX1JURlRFWFRPQkogdHI7DQorICBpZiAoIVRvUnVuKHBQaWVjZSwgdHIpKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcEJyZWFrLT5HZXREaXNwbGF5UG9zKCZ0ciwgcENoYXJQb3MsIGJDaGFyQ29kZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9UZXh0TGF5b3V0OjpUb1J1bihYRkFfTFBDVEVYVFBJRUNFIHBQaWVjZSwgRlhfUlRGVEVYVE9CSiYgdHIpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHBQaWVjZS0+aUNoYXJzOw0KKyAgaWYgKGlMZW5ndGggPCAxKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHRyLnBTdHIgPSBwUGllY2UtPnBzelRleHQ7DQorICB0ci5wRm9udCA9IHBQaWVjZS0+cEZvbnQ7DQorICB0ci5wUmVjdCA9ICZwUGllY2UtPnJ0UGllY2U7DQorICB0ci5wV2lkdGhzID0gcFBpZWNlLT5wV2lkdGhzOw0KKyAgdHIuaUxlbmd0aCA9IGlMZW5ndGg7DQorICB0ci5mRm9udFNpemUgPSBwUGllY2UtPmZGb250U2l6ZTsNCisgIHRyLmlCaWRpTGV2ZWwgPSBwUGllY2UtPmlCaWRpTGV2ZWw7DQorICB0ci5pQ2hhclJvdGF0aW9uID0gMDsNCisgIHRyLndMaW5lQnJlYWtDaGFyID0gTCdcbic7DQorICB0ci5pVmVydGljYWxTY2FsZSA9IHBQaWVjZS0+aVZlclNjYWxlOw0KKyAgdHIuZHdMYXlvdXRTdHlsZXMgPSBGWF9SVEZMQVlPVVRTVFlMRV9FeHBhbmRUYWI7DQorICB0ci5pSG9yaXpvbnRhbFNjYWxlID0gcFBpZWNlLT5pSG9yU2NhbGU7DQorICByZXR1cm4gVFJVRTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9hcHAveGZhX3RleHRsYXlvdXQuaCBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV90ZXh0bGF5b3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ3YjM3MwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvYXBwL3hmYV90ZXh0bGF5b3V0LmgKQEAgLTAsMCArMSw0MDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhGQV9URVhUTEFZT1VUX0gNCisjZGVmaW5lIF9GWEZBX1RFWFRMQVlPVVRfSA0KKyNkZWZpbmUgWEZBX0xPQURFUkNOVFhURkxHX0ZJTFRFUlNQQUNFIDB4MDAxDQorY2xhc3MgQ1hGQV9UZXh0VGFic3RvcHNDb250ZXh0Ow0KK2NsYXNzIElYRkFfVGV4dFByb3ZpZGVyIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SVhGQV9UZXh0UHJvdmlkZXIoKSB7fQ0KKyAgdmlydHVhbCBDWEZBX05vZGUqIEdldFRleHROb2RlKEZYX0JPT0wmIGJSaWNoVGV4dCkgPSAwOw0KKyAgdmlydHVhbCBDWEZBX1BhcmEgR2V0UGFyYU5vZGUoKSA9IDA7DQorICB2aXJ0dWFsIENYRkFfRm9udCBHZXRGb250Tm9kZSgpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0NoZWNrQnV0dG9uQW5kQXV0b1dpZHRoKCkgPSAwOw0KKyAgdmlydHVhbCBDWEZBX0ZGRG9jKiBHZXREb2NOb2RlKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEdldEVtYmJlZE9iaihGWF9CT09MIGJVUkksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJhdywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpID0gMDsNCit9Ow0KK2NsYXNzIENYRkFfQ1NTVGFnUHJvdmlkZXIgOiBwdWJsaWMgSUZERV9DU1NUYWdQcm92aWRlciB7DQorIHB1YmxpYzoNCisgIENYRkFfQ1NTVGFnUHJvdmlkZXIoKSA6IG1fYlRhZ0F2aWxpYWJsZShGQUxTRSksIG1fYkNvbnRlbnQoRkFMU0UpIHt9DQorICB2aXJ0dWFsIH5DWEZBX0NTU1RhZ1Byb3ZpZGVyKCk7DQorICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nQyBHZXRUYWdOYW1lKCkgeyByZXR1cm4gbV93c1RhZ05hbWU7IH0NCisgIHZpcnR1YWwgRlhfUE9TSVRJT04gR2V0Rmlyc3RBdHRyaWJ1dGUoKSB7DQorICAgIHJldHVybiBtX0F0dHJpYnV0ZXMuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgfQ0KKyAgdmlydHVhbCB2b2lkIEdldE5leHRBdHRyaWJ1dGUoRlhfUE9TSVRJT04mIHBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyYgd3NBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDJiB3c1ZhbHVlKTsNCisgIHZvaWQgU2V0VGFnTmFtZU9iaihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NOYW1lKSB7IG1fd3NUYWdOYW1lID0gd3NOYW1lOyB9DQorICB2b2lkIFNldEF0dHJpYnV0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpOw0KKyAgRlhfQk9PTCBtX2JUYWdBdmlsaWFibGU7DQorICBGWF9CT09MIG1fYkNvbnRlbnQ7DQorDQorIHByb3RlY3RlZDoNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NUYWdOYW1lOw0KKyAgQ0ZYX01hcFB0clRvUHRyIG1fQXR0cmlidXRlczsNCit9Ow0KK2NsYXNzIENYRkFfVGV4dFBhcnNlQ29udGV4dCA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ1hGQV9UZXh0UGFyc2VDb250ZXh0KCkNCisgICAgICA6IG1fcFBhcmVudFN0eWxlKG51bGxwdHIpLA0KKyAgICAgICAgbV9wcE1hdGNoZWREZWNscyhudWxscHRyKSwNCisgICAgICAgIG1fZHdNYXRjaGVkRGVjbHMoMCksDQorICAgICAgICBtX2VEaXNwbGF5KEZERV9DU1NESVNQTEFZX05vbmUpIHt9DQorICB+Q1hGQV9UZXh0UGFyc2VDb250ZXh0KCkgew0KKyAgICBpZiAobV9wUGFyZW50U3R5bGUpDQorICAgICAgbV9wUGFyZW50U3R5bGUtPlJlbGVhc2UoKTsNCisgICAgRlhfRnJlZShtX3BwTWF0Y2hlZERlY2xzKTsNCisgIH0NCisgIHZvaWQgU2V0RGlzcGxheShGREVfQ1NTRElTUExBWSBlRGlzcGxheSkgeyBtX2VEaXNwbGF5ID0gZURpc3BsYXk7IH0NCisgIEZERV9DU1NESVNQTEFZIEdldERpc3BsYXkoKSBjb25zdCB7IHJldHVybiBtX2VEaXNwbGF5OyB9DQorICB2b2lkIFNldERlY2xzKGNvbnN0IElGREVfQ1NTRGVjbGFyYXRpb24qKiBwcERlY2xBcnJheSwgaW50MzJfdCBpRGVjbENvdW50KTsNCisgIGNvbnN0IElGREVfQ1NTRGVjbGFyYXRpb24qKiBHZXREZWNscygpIHsNCisgICAgcmV0dXJuIChjb25zdCBJRkRFX0NTU0RlY2xhcmF0aW9uKiopbV9wcE1hdGNoZWREZWNsczsNCisgIH0NCisgIEZYX0RXT1JEIENvdW50RGVjbHMoKSBjb25zdCB7IHJldHVybiBtX2R3TWF0Y2hlZERlY2xzOyB9DQorICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIG1fcFBhcmVudFN0eWxlOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJRkRFX0NTU0RlY2xhcmF0aW9uKiogbV9wcE1hdGNoZWREZWNsczsNCisgIEZYX0RXT1JEIG1fZHdNYXRjaGVkRGVjbHMgOiAyODsNCisgIEZERV9DU1NESVNQTEFZIG1fZURpc3BsYXkgOiA0Ow0KK307DQorY2xhc3MgQ1hGQV9UZXh0UGFyc2VyIHsNCisgcHVibGljOg0KKyAgQ1hGQV9UZXh0UGFyc2VyKCkgOiBtX3BBbGxvY2F0b3IoTlVMTCksIG1fcFNlbGVjdG9yKE5VTEwpLCBtX3BVQVNoZWV0KE5VTEwpIHt9DQorICB2aXJ0dWFsIH5DWEZBX1RleHRQYXJzZXIoKTsNCisgIHZvaWQgUmVzZXQoKTsNCisgIHZvaWQgRG9QYXJzZShJRkRFX1hNTE5vZGUqIHBYTUxDb250YWluZXIsIElYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyKTsNCisgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogQ3JlYXRlUm9vdFN0eWxlKElYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyKTsNCisgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogQ29tcHV0ZVN0eWxlKElGREVfWE1MTm9kZSogcFhNTE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBQYXJlbnRTdHlsZSk7DQorICBGWF9CT09MIElzUGFyc2VkKCkgY29uc3QgeyByZXR1cm4gbV9wQWxsb2NhdG9yICE9IE5VTEw7IH0NCisNCisgIGludDMyX3QgR2V0VkFsZ2luKElYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyKSBjb25zdDsNCisgIEZYX0ZMT0FUIEdldFRhYkludGVydmFsKElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlKSBjb25zdDsNCisgIGludDMyX3QgQ291bnRUYWJzKElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlKSBjb25zdDsNCisgIEZYX0JPT0wgSXNTcGFjZVJ1bihJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSkgY29uc3Q7DQorICBGWF9CT09MIEdldFRhYnN0b3BzKElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICBDWEZBX1RleHRUYWJzdG9wc0NvbnRleHQqIHBUYWJzdG9wQ29udGV4dCk7DQorICBJRlhfRm9udCogR2V0Rm9udChJWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlKSBjb25zdDsNCisgIEZYX0ZMT0FUIEdldEZvbnRTaXplKElYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUpIGNvbnN0Ow0KKyAgaW50MzJfdCBHZXRIb3JTY2FsZShJWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUpIGNvbnN0Ow0KKyAgaW50MzJfdCBHZXRWZXJTY2FsZShJWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUpIGNvbnN0Ow0KKyAgdm9pZCBHZXRVbmRlcmxpbmUoSVhGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIsDQorICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlVbmRlcmxpbmUsDQorICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpUGVyaW9kKSBjb25zdDsNCisgIHZvaWQgR2V0TGluZXRocm91Z2goSVhGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIsDQorICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTGluZXRocm91Z2gpIGNvbnN0Ow0KKyAgRlhfQVJHQiBHZXRDb2xvcihJWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUpIGNvbnN0Ow0KKyAgRlhfRkxPQVQgR2V0QmFzZWxpbmUoSVhGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSkgY29uc3Q7DQorICBGWF9GTE9BVCBHZXRMaW5lSGVpZ2h0KElYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRmlyc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZWZXJTY2FsZSkgY29uc3Q7DQorICBGWF9CT09MIEdldEVtYmJlZE9iaihJWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSk7DQorICBDWEZBX1RleHRQYXJzZUNvbnRleHQqIEdldFBhcnNlQ29udGV4dEZyb21NYXAoSUZERV9YTUxOb2RlKiBwWE1MTm9kZSk7DQorDQorIHByaXZhdGU6DQorICB2b2lkIEluaXRDU1NEYXRhKElYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyKTsNCisgIHZvaWQgUGFyc2VSaWNoVGV4dChJRkRFX1hNTE5vZGUqIHBYTUxOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFBhcmVudFN0eWxlKTsNCisgIHZvaWQgUGFyc2VUYWdJbmZvKElGREVfWE1MTm9kZSogcFhNTE5vZGUsIENYRkFfQ1NTVGFnUHJvdmlkZXImIHRhZ1Byb3ZpZGVyKTsNCisgIElGREVfQ1NTU3R5bGVTaGVldCogTG9hZERlZmF1bHRTaGVldFN0eWxlKCk7DQorICBJRkRFX0NTU0NvbXB1dGVkU3R5bGUqIENyZWF0ZVN0eWxlKElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFBhcmVudFN0eWxlKTsNCisgIElGWF9NRU1BbGxvY2F0b3IqIG1fcEFsbG9jYXRvcjsNCisgIElGREVfQ1NTU3R5bGVTZWxlY3RvciogbV9wU2VsZWN0b3I7DQorICBJRkRFX0NTU1N0eWxlU2hlZXQqIG1fcFVBU2hlZXQ7DQorICBDRlhfTWFwUHRyVGVtcGxhdGU8SUZERV9YTUxOb2RlKiwgQ1hGQV9UZXh0UGFyc2VDb250ZXh0Kj4NCisgICAgICBtX21hcFhNTE5vZGVUb1BhcnNlQ29udGV4dDsNCit9Ow0KK2NsYXNzIENYRkFfTG9hZGVyQ29udGV4dCB7DQorIHB1YmxpYzoNCisgIENYRkFfTG9hZGVyQ29udGV4dCgpDQorICAgICAgOiBtX2JTYXZlTGluZUhlaWdodChGQUxTRSksDQorICAgICAgICBtX2ZXaWR0aCgwKSwNCisgICAgICAgIG1fZkhlaWdodCgwKSwNCisgICAgICAgIG1fZkxhc3RQb3MoMCksDQorICAgICAgICBtX2ZTdGFydExpbmVPZmZzZXQoMCksDQorICAgICAgICBtX2lDaGFyKDApLA0KKyAgICAgICAgbV9pVG90YWxMaW5lcygtMSksDQorICAgICAgICBtX3BYTUxOb2RlKE5VTEwpLA0KKyAgICAgICAgbV9wTm9kZShOVUxMKSwNCisgICAgICAgIG1fcFBhcmVudFN0eWxlKE5VTEwpLA0KKyAgICAgICAgbV9kd0ZsYWdzKDApIHt9DQorICBGWF9CT09MIG1fYlNhdmVMaW5lSGVpZ2h0Ow0KKyAgRlhfRkxPQVQgbV9mV2lkdGg7DQorICBGWF9GTE9BVCBtX2ZIZWlnaHQ7DQorICBGWF9GTE9BVCBtX2ZMYXN0UG9zOw0KKyAgRlhfRkxPQVQgbV9mU3RhcnRMaW5lT2Zmc2V0Ow0KKyAgaW50MzJfdCBtX2lDaGFyOw0KKyAgaW50MzJfdCBtX2lMaW5lczsNCisgIGludDMyX3QgbV9pVG90YWxMaW5lczsNCisgIElGREVfWE1MTm9kZSogbV9wWE1MTm9kZTsNCisgIENYRkFfTm9kZSogbV9wTm9kZTsNCisgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogbV9wUGFyZW50U3R5bGU7DQorICBDRlhfQXJyYXlUZW1wbGF0ZTxGWF9GTE9BVD4gbV9saW5lSGVpZ2h0czsNCisgIEZYX0RXT1JEIG1fZHdGbGFnczsNCisgIENGWF9GbG9hdEFycmF5IG1fQmxvY2tzSGVpZ2h0Ow0KK307DQorY2xhc3MgQ1hGQV9MaW5rVXNlckRhdGEgOiBwdWJsaWMgSUZYX1Vua25vd24sIHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ1hGQV9MaW5rVXNlckRhdGEoSUZYX01FTUFsbG9jYXRvciogcEFsbG9jYXRvciwgRlhfV0NIQVIqIHBzelRleHQpDQorICAgICAgOiBtX3BBbGxvY2F0b3IocEFsbG9jYXRvciksIG1fZHdSZWZDb3VudCgxKSB7DQorICAgIG1fcHN6VVJMQ29udGVudCA9IHBzelRleHQ7DQorICB9DQorICB+Q1hGQV9MaW5rVXNlckRhdGEoKSB7fQ0KKyAgdmlydHVhbCBGWF9EV09SRCBSZWxlYXNlKCkgew0KKyAgICBGWF9EV09SRCBkd1JlZkNvdW50ID0gLS1tX2R3UmVmQ291bnQ7DQorICAgIGlmIChkd1JlZkNvdW50IDw9IDApIHsNCisgICAgICBGREVfRGVsZXRlV2l0aChDWEZBX0xpbmtVc2VyRGF0YSwgbV9wQWxsb2NhdG9yLCB0aGlzKTsNCisgICAgfQ0KKyAgICByZXR1cm4gZHdSZWZDb3VudDsNCisgIH0NCisgIHZpcnR1YWwgRlhfRFdPUkQgQWRkUmVmKCkgeyByZXR1cm4gKyttX2R3UmVmQ291bnQ7IH0NCisNCisgcHVibGljOg0KKyAgY29uc3QgRlhfV0NIQVIqIEdldExpbmtVUkwoKSB7IHJldHVybiBtX3BzelVSTENvbnRlbnQ7IH07DQorDQorIHByb3RlY3RlZDoNCisgIElGWF9NRU1BbGxvY2F0b3IqIG1fcEFsbG9jYXRvcjsNCisgIEZYX0RXT1JEIG1fZHdSZWZDb3VudDsNCisgIENGWF9XaWRlU3RyaW5nIG1fcHN6VVJMQ29udGVudDsNCit9Ow0KK2NsYXNzIENYRkFfVGV4dFVzZXJEYXRhIDogcHVibGljIElGWF9Vbmtub3duLCBwdWJsaWMgQ0ZYX1RhcmdldCB7DQorIHB1YmxpYzoNCisgIENYRkFfVGV4dFVzZXJEYXRhKElGWF9NRU1BbGxvY2F0b3IqIHBBbGxvY2F0b3IsIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlKQ0KKyAgICAgIDogbV9wU3R5bGUocFN0eWxlKSwNCisgICAgICAgIG1fcExpbmtEYXRhKG51bGxwdHIpLA0KKyAgICAgICAgbV9wQWxsb2NhdG9yKHBBbGxvY2F0b3IpLA0KKyAgICAgICAgbV9kd1JlZkNvdW50KDApIHsNCisgICAgRlhTWVNfYXNzZXJ0KG1fcEFsbG9jYXRvcik7DQorICAgIGlmIChtX3BTdHlsZSkNCisgICAgICBtX3BTdHlsZS0+QWRkUmVmKCk7DQorICB9DQorICBDWEZBX1RleHRVc2VyRGF0YShJRlhfTUVNQWxsb2NhdG9yKiBwQWxsb2NhdG9yLA0KKyAgICAgICAgICAgICAgICAgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICBDWEZBX0xpbmtVc2VyRGF0YSogcExpbmtEYXRhKQ0KKyAgICAgIDogbV9wU3R5bGUocFN0eWxlKSwNCisgICAgICAgIG1fcExpbmtEYXRhKHBMaW5rRGF0YSksDQorICAgICAgICBtX3BBbGxvY2F0b3IocEFsbG9jYXRvciksDQorICAgICAgICBtX2R3UmVmQ291bnQoMCkgew0KKyAgICBGWFNZU19hc3NlcnQobV9wQWxsb2NhdG9yKTsNCisgICAgaWYgKG1fcFN0eWxlKQ0KKyAgICAgIG1fcFN0eWxlLT5BZGRSZWYoKTsNCisgIH0NCisgIH5DWEZBX1RleHRVc2VyRGF0YSgpIHsNCisgICAgaWYgKG1fcFN0eWxlKQ0KKyAgICAgIG1fcFN0eWxlLT5SZWxlYXNlKCk7DQorICAgIGlmIChtX3BMaW5rRGF0YSkNCisgICAgICBtX3BMaW5rRGF0YS0+UmVsZWFzZSgpOw0KKyAgfQ0KKyAgdmlydHVhbCBGWF9EV09SRCBSZWxlYXNlKCkgew0KKyAgICBGWF9EV09SRCBkd1JlZkNvdW50ID0gLS1tX2R3UmVmQ291bnQ7DQorICAgIGlmIChkd1JlZkNvdW50ID09IDApIHsNCisgICAgICBGREVfRGVsZXRlV2l0aChDWEZBX1RleHRVc2VyRGF0YSwgbV9wQWxsb2NhdG9yLCB0aGlzKTsNCisgICAgfQ0KKyAgICByZXR1cm4gZHdSZWZDb3VudDsNCisgIH0NCisgIHZpcnR1YWwgRlhfRFdPUkQgQWRkUmVmKCkgeyByZXR1cm4gKyttX2R3UmVmQ291bnQ7IH0NCisNCisgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogbV9wU3R5bGU7DQorICBDWEZBX0xpbmtVc2VyRGF0YSogbV9wTGlua0RhdGE7DQorDQorIHByb3RlY3RlZDoNCisgIElGWF9NRU1BbGxvY2F0b3IqIG1fcEFsbG9jYXRvcjsNCisgIEZYX0RXT1JEIG1fZHdSZWZDb3VudDsNCit9Ow0KK3R5cGVkZWYgc3RydWN0IF9YRkFfVEVYVFBJRUNFIDogcHVibGljIENGWF9UYXJnZXQgew0KKyAgRlhfV0NIQVIqIHBzelRleHQ7DQorICBpbnQzMl90IGlDaGFyczsNCisgIGludDMyX3QqIHBXaWR0aHM7DQorICBpbnQzMl90IGlIb3JTY2FsZTsNCisgIGludDMyX3QgaVZlclNjYWxlOw0KKyAgaW50MzJfdCBpQmlkaUxldmVsOw0KKyAgaW50MzJfdCBpVW5kZXJsaW5lOw0KKyAgaW50MzJfdCBpUGVyaW9kOw0KKyAgaW50MzJfdCBpTGluZVRocm91Z2g7DQorICBJRlhfRm9udCogcEZvbnQ7DQorICBGWF9BUkdCIGR3Q29sb3I7DQorICBGWF9GTE9BVCBmRm9udFNpemU7DQorICBDRlhfUmVjdEYgcnRQaWVjZTsNCisgIENYRkFfTGlua1VzZXJEYXRhKiBwTGlua0RhdGE7DQorDQorICBfWEZBX1RFWFRQSUVDRSgpIDogcHN6VGV4dChOVUxMKSwgcEZvbnQoTlVMTCksIHBMaW5rRGF0YShOVUxMKSB7DQorICAgIHBzelRleHQgPSBOVUxMOw0KKyAgfQ0KKyAgfl9YRkFfVEVYVFBJRUNFKCkgew0KKyAgICBwc3pUZXh0ID0gTlVMTDsNCisgICAgaWYgKE5VTEwgIT0gcExpbmtEYXRhKSB7DQorICAgICAgcExpbmtEYXRhLT5SZWxlYXNlKCk7DQorICAgICAgcExpbmtEYXRhID0gTlVMTDsNCisgICAgfQ0KKyAgfQ0KK30gWEZBX1RFWFRQSUVDRSwgKlhGQV9MUFRFWFRQSUVDRTsNCit0eXBlZGVmIFhGQV9URVhUUElFQ0UgY29uc3QqIFhGQV9MUENURVhUUElFQ0U7DQordHlwZWRlZiBDRlhfQXJyYXlUZW1wbGF0ZTxYRkFfTFBURVhUUElFQ0U+IENYRkFfUGllY2VBcnJheTsNCitjbGFzcyBDWEZBX1BpZWNlTGluZSA6IHB1YmxpYyBDRlhfVGFyZ2V0IHsNCisgcHVibGljOg0KKyAgQ1hGQV9QaWVjZUxpbmUoKSB7fQ0KKyAgQ1hGQV9QaWVjZUFycmF5IG1fdGV4dFBpZWNlczsNCisgIENGWF9JbnQzMkFycmF5IG1fY2hhckNvdW50czsNCit9Ow0KK3R5cGVkZWYgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9QaWVjZUxpbmUqPiBDWEZBX1BpZWNlTGluZUFycmF5Ow0KK3N0cnVjdCBYRkFfVEFCU1RPUFMgew0KKyAgRlhfRFdPUkQgZHdBbGlnbjsNCisgIEZYX0ZMT0FUIGZUYWJzdG9wczsNCit9Ow0KK2NsYXNzIENYRkFfVGV4dFRhYnN0b3BzQ29udGV4dCB7DQorIHB1YmxpYzoNCisgIENYRkFfVGV4dFRhYnN0b3BzQ29udGV4dCgpDQorICAgICAgOiBtX2lUYWJDb3VudCgwKSwNCisgICAgICAgIG1faVRhYkluZGV4KC0xKSwNCisgICAgICAgIG1fYlRhYnN0b3BzKEZBTFNFKSwNCisgICAgICAgIG1fZlRhYldpZHRoKDApLA0KKyAgICAgICAgbV9mTGVmdCgwKSB7fQ0KKyAgdm9pZCBBcHBlbmQoRlhfRFdPUkQgZHdBbGlnbiwgRlhfRkxPQVQgZlRhYnN0b3BzKSB7DQorICAgIGludDMyX3QgaSA9IDA7DQorICAgIGZvciAoaSA9IDA7IGkgPCBtX2lUYWJDb3VudDsgaSsrKSB7DQorICAgICAgWEZBX1RBQlNUT1BTKiBwVGFic3RvcCA9IG1fdGFic3RvcHMuR2V0RGF0YVB0cihpKTsNCisgICAgICBpZiAoZlRhYnN0b3BzIDwgcFRhYnN0b3AtPmZUYWJzdG9wcykgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICAgIG1fdGFic3RvcHMuSW5zZXJ0U3BhY2VBdChpLCAxKTsNCisgICAgWEZBX1RBQlNUT1BTIHRhYnN0b3A7DQorICAgIHRhYnN0b3AuZHdBbGlnbiA9IGR3QWxpZ247DQorICAgIHRhYnN0b3AuZlRhYnN0b3BzID0gZlRhYnN0b3BzOw0KKyAgICBtX3RhYnN0b3BzLlNldEF0KGksIHRhYnN0b3ApOw0KKyAgICBtX2lUYWJDb3VudCsrOw0KKyAgfQ0KKyAgdm9pZCBSZW1vdmVBbGwoKSB7DQorICAgIG1fdGFic3RvcHMuUmVtb3ZlQWxsKCk7DQorICAgIG1faVRhYkNvdW50ID0gMDsNCisgIH0NCisgIHZvaWQgUmVzZXQoKSB7DQorICAgIG1faVRhYkluZGV4ID0gLTE7DQorICAgIG1fYlRhYnN0b3BzID0gRkFMU0U7DQorICAgIG1fZlRhYldpZHRoID0gMDsNCisgICAgbV9mTGVmdCA9IDA7DQorICB9DQorICBDRlhfQXJyYXlUZW1wbGF0ZTxYRkFfVEFCU1RPUFM+IG1fdGFic3RvcHM7DQorICBpbnQzMl90IG1faVRhYkNvdW50Ow0KKyAgaW50MzJfdCBtX2lUYWJJbmRleDsNCisgIEZYX0JPT0wgbV9iVGFic3RvcHM7DQorICBGWF9GTE9BVCBtX2ZUYWJXaWR0aDsNCisgIEZYX0ZMT0FUIG1fZkxlZnQ7DQorfTsNCitjbGFzcyBDWEZBX1RleHRMYXlvdXQgew0KKyBwdWJsaWM6DQorICBDWEZBX1RleHRMYXlvdXQoSVhGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIpOw0KKyAgdmlydHVhbCB+Q1hGQV9UZXh0TGF5b3V0KCk7DQorICBpbnQzMl90IEdldFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorICBGWF9GTE9BVCBHZXRMYXlvdXRIZWlnaHQoKTsNCisgIEZYX0ZMT0FUIFN0YXJ0TGF5b3V0KEZYX0ZMT0FUIGZXaWR0aCA9IC0xKTsNCisgIEZYX0JPT0wgRG9MYXlvdXQoaW50MzJfdCBpQmxvY2tJbmRleCwNCisgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZDYWxjSGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29udGVudEFyZWFIZWlnaHQgPSAtMSwNCisgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRleHRIZWlnaHQgPSAtMSk7DQorDQorICBGWF9CT09MIENhbGNTaXplKGNvbnN0IENGWF9TaXplRiYgbWluU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1NpemVGJiBtYXhTaXplLA0KKyAgICAgICAgICAgICAgICAgICBDRlhfU2l6ZUYmIGRlZmF1bHRTaXplKTsNCisgIEZYX0JPT0wgTGF5b3V0KGNvbnN0IENGWF9TaXplRiYgc2l6ZSwgRlhfRkxPQVQqIGZIZWlnaHQgPSBOVUxMKTsNCisgIHZvaWQgSXRlbUJsb2Nrcyhjb25zdCBDRlhfUmVjdEYmIHJ0VGV4dCwgaW50MzJfdCBpQmxvY2tJbmRleCk7DQorICBGWF9CT09MIERyYXdTdHJpbmcoQ0ZYX1JlbmRlckRldmljZSogcEZ4RGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIHRtRG9jMkRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0Q2xpcCwNCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCbG9jayA9IDApOw0KKyAgRlhfQk9PTCBJc0xvYWRlZCgpIGNvbnN0IHsgcmV0dXJuIG1fcGllY2VMaW5lcy5HZXRTaXplKCkgPiAwOyB9DQorICB2b2lkIFVubG9hZCgpOw0KKyAgY29uc3QgQ1hGQV9QaWVjZUxpbmVBcnJheSogR2V0UGllY2VMaW5lcygpOw0KKw0KKyAgRlhfQk9PTCBtX2JIYXNCbG9jazsNCisgIENGWF9JbnQzMkFycmF5IG1fQmxvY2tzOw0KKw0KKyBwcml2YXRlOg0KKyAgdm9pZCBHZXRUZXh0RGF0YU5vZGUoKTsNCisgIElGREVfWE1MTm9kZSogR2V0WE1MQ29udGFpbmVyTm9kZSgpOw0KKyAgSUZYX1JURkJyZWFrKiBDcmVhdGVCcmVhayhGWF9CT09MIGJEZWZhdWx0KTsNCisgIHZvaWQgSW5pdEJyZWFrKEZYX0ZMT0FUIGZMaW5lV2lkdGgpOw0KKyAgdm9pZCBJbml0QnJlYWsoSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUsDQorICAgICAgICAgICAgICAgICBGREVfQ1NTRElTUExBWSBlRGlzcGxheSwNCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZMaW5lV2lkdGgsDQorICAgICAgICAgICAgICAgICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlLA0KKyAgICAgICAgICAgICAgICAgSUZERV9DU1NDb21wdXRlZFN0eWxlKiBwUGFyZW50U3R5bGUgPSBOVUxMKTsNCisgIEZYX0JPT0wgTG9hZGVyKGNvbnN0IENGWF9TaXplRiYgc3pUZXh0LA0KKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZMaW5lUG9zLA0KKyAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVBpZWNlcyA9IFRSVUUpOw0KKyAgdm9pZCBMb2FkVGV4dChDWEZBX05vZGUqIHBOb2RlLA0KKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfU2l6ZUYmIHN6VGV4dCwNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZMaW5lUG9zLA0KKyAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlUGllY2VzKTsNCisgIEZYX0JPT0wgTG9hZFJpY2hUZXh0KElGREVfWE1MTm9kZSogcFhNTE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfU2l6ZUYmIHN6VGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmTGluZVBvcywNCisgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFBhcmVudFN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVBpZWNlcywNCisgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTGlua1VzZXJEYXRhKiBwTGlua0RhdGEgPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRW5kQnJlYWsgPSBUUlVFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNPbCA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGlDb3VudCA9IDApOw0KKyAgRlhfQk9PTCBBcHBlbmRDaGFyKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZMaW5lUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTcGFjZUFib3ZlLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNhdmVQaWVjZXMpOw0KKyAgdm9pZCBBcHBlbmRUZXh0TGluZShGWF9EV09SRCBkd1N0YXR1cywNCisgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZMaW5lUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlUGllY2VzLA0KKyAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJFbmRCcmVhayA9IEZBTFNFKTsNCisgIHZvaWQgRW5kQnJlYWsoRlhfRFdPUkQgZHdTdGF0dXMsIEZYX0ZMT0FUJiBmTGluZVBvcywgRlhfQk9PTCBiRGVmYXVsdCk7DQorICBGWF9CT09MIElzRW5kKEZYX0JPT0wgYlNhdmVQaWVjZXMpOw0KKyAgdm9pZCBQcm9jZXNzVGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsNCisgIHZvaWQgVXBkYXRlQWxpZ24oRlhfRkxPQVQgZkhlaWdodCwgRlhfRkxPQVQgZkJvdHRvbSk7DQorICB2b2lkIFJlbmRlclN0cmluZyhJRkRFX1JlbmRlckRldmljZSogcERldmljZSwNCisgICAgICAgICAgICAgICAgICAgIElGREVfU29saWRCcnVzaCogcEJydXNoLA0KKyAgICAgICAgICAgICAgICAgICAgQ1hGQV9QaWVjZUxpbmUqIHBQaWVjZUxpbmUsDQorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQaWVjZSwNCisgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIHRtRG9jMkRldmljZSk7DQorICB2b2lkIFJlbmRlclBhdGgoSUZERV9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsDQorICAgICAgICAgICAgICAgICAgSUZERV9QZW4qIHBQZW4sDQorICAgICAgICAgICAgICAgICAgQ1hGQV9QaWVjZUxpbmUqIHBQaWVjZUxpbmUsDQorICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUGllY2UsDQorICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLA0KKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIHRtRG9jMkRldmljZSk7DQorICBpbnQzMl90IEdldERpc3BsYXlQb3MoWEZBX0xQQ1RFWFRQSUVDRSBwUGllY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNoYXJDb2RlID0gRkFMU0UpOw0KKyAgRlhfQk9PTCBUb1J1bihYRkFfTFBDVEVYVFBJRUNFIHBQaWVjZSwgRlhfUlRGVEVYVE9CSiYgdHIpOw0KKyAgdm9pZCBEb1RhYnN0b3BzKElGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlLCBDWEZBX1BpZWNlTGluZSogcFBpZWNlTGluZSk7DQorICBGWF9CT09MIExheW91dChpbnQzMl90IGlCbG9jayk7DQorICBpbnQzMl90IENvdW50QmxvY2tzKCkgY29uc3Q7DQorDQorICBJWEZBX1RleHRQcm92aWRlciogbV9wVGV4dFByb3ZpZGVyOw0KKyAgQ1hGQV9Ob2RlKiBtX3BUZXh0RGF0YU5vZGU7DQorICBGWF9CT09MIG1fYlJpY2hUZXh0Ow0KKyAgSUZYX01FTUFsbG9jYXRvciogbV9wQWxsb2NhdG9yOw0KKyAgSUZYX1JURkJyZWFrKiBtX3BCcmVhazsNCisgIENYRkFfTG9hZGVyQ29udGV4dCogbV9wTG9hZGVyOw0KKyAgaW50MzJfdCBtX2lMaW5lczsNCisgIEZYX0ZMT0FUIG1fZk1heFdpZHRoOw0KKyAgQ1hGQV9UZXh0UGFyc2VyIG1fdGV4dFBhcnNlcjsNCisgIENYRkFfUGllY2VMaW5lQXJyYXkgbV9waWVjZUxpbmVzOw0KKyAgQ1hGQV9UZXh0VGFic3RvcHNDb250ZXh0KiBtX3BUYWJzdG9wQ29udGV4dDsNCisgIEZYX0JPT0wgbV9iQmxvY2tDb250aW51ZTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL2Z4ZmFfbG9jYWxldmFsdWUuaCBiL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL2Z4ZmFfbG9jYWxldmFsdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODE0NjliCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9jb21tb24vZnhmYV9sb2NhbGV2YWx1ZS5oCkBAIC0wLDAgKzEsMTA2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYRkFfV0lER0VUVkFMVUVfSA0KKyNkZWZpbmUgX0ZYRkFfV0lER0VUVkFMVUVfSA0KK2NsYXNzIElGWF9Mb2NhbGU7DQorY2xhc3MgQ0ZYX1VuaXRpbWU7DQorY2xhc3MgQ1hGQV9Mb2NhbGVNZ3I7DQorI2RlZmluZSBYRkFfVlRfTlVMTCAwDQorI2RlZmluZSBYRkFfVlRfQk9PTEVBTiAxDQorI2RlZmluZSBYRkFfVlRfSU5URUdFUiAyDQorI2RlZmluZSBYRkFfVlRfREVDSU1BTCA0DQorI2RlZmluZSBYRkFfVlRfRkxPQVQgOA0KKyNkZWZpbmUgWEZBX1ZUX1RFWFQgMTYNCisjZGVmaW5lIFhGQV9WVF9EQVRFIDMyDQorI2RlZmluZSBYRkFfVlRfVElNRSA2NA0KKyNkZWZpbmUgWEZBX1ZUX0RBVEVUSU1FIDEyOA0KK2NsYXNzIENYRkFfTG9jYWxlVmFsdWUgew0KKyBwdWJsaWM6DQorICBDWEZBX0xvY2FsZVZhbHVlKCk7DQorICBDWEZBX0xvY2FsZVZhbHVlKGNvbnN0IENYRkFfTG9jYWxlVmFsdWUmIHZhbHVlKTsNCisgIENYRkFfTG9jYWxlVmFsdWUoRlhfRFdPUkQgZHdUeXBlLCBDWEZBX0xvY2FsZU1nciogcExvY2FsZU1ncik7DQorICBDWEZBX0xvY2FsZVZhbHVlKEZYX0RXT1JEIGR3VHlwZSwNCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgIENYRkFfTG9jYWxlTWdyKiBwTG9jYWxlTWdyKTsNCisgIENYRkFfTG9jYWxlVmFsdWUoRlhfRFdPUkQgZHdUeXBlLA0KKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICBDWEZBX0xvY2FsZU1nciogcExvY2FsZU1ncik7DQorICB+Q1hGQV9Mb2NhbGVWYWx1ZSgpOw0KKyAgQ1hGQV9Mb2NhbGVWYWx1ZSYgb3BlcmF0b3I9KGNvbnN0IENYRkFfTG9jYWxlVmFsdWUmIHZhbHVlKTsNCisNCisgIEZYX0JPT0wgVmFsaWRhdGVWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcqIHBNYXRjaEZvcm1hdCA9IE5VTEwpOw0KKyAgRlhfQk9PTCBGb3JtYXRQYXR0ZXJucyhDRlhfV2lkZVN0cmluZyYgd3NSZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1ZBTFVFUElDVFVSRSBlVmFsdWVUeXBlKSBjb25zdDsNCisgIEZYX0JPT0wgRm9ybWF0U2luZ2xlUGF0dGVybihDRlhfV2lkZVN0cmluZyYgd3NSZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1ZBTFVFUElDVFVSRSBlVmFsdWVUeXBlKSBjb25zdDsNCisgIEZYX0JPT0wgVmFsaWRhdGVDYW5vbmljYWxWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1ZUeXBlKTsNCisgIEZYX0JPT0wgVmFsaWRhdGVDYW5vbmljYWxEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfVW5pdGltZSYgdW5EYXRlKTsNCisgIEZYX0JPT0wgVmFsaWRhdGVDYW5vbmljYWxUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RpbWUpOw0KKyAgRlhfQk9PTCBWYWxpZGF0ZUNhbm9uaWNhbERhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGVUaW1lKTsNCisgIHZvaWQgR2V0TnVtYmVyaWNGb3JtYXQoQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbnRMZW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkRlY0xlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2lnbiA9IFRSVUUpOw0KKyAgRlhfQk9PTCBWYWxpZGF0ZU51bWVyaWNUZW1wKENGWF9XaWRlU3RyaW5nJiB3c051bWVyaWMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBvcyA9IE5VTEwpOw0KKw0KKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0VmFsdWUoKSBjb25zdDsNCisgIEZYX0RXT1JEIEdldFR5cGUoKSBjb25zdDsNCisgIHZvaWQgU2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsIEZYX0RXT1JEIGR3VHlwZSk7DQorICBDRlhfV2lkZVN0cmluZyBHZXRUZXh0KCkgY29uc3Q7DQorICBGWF9GTE9BVCBHZXROdW0oKSBjb25zdDsNCisgIEZYX0RPVUJMRSBHZXREb3VibGVOdW0oKSBjb25zdDsNCisgIENGWF9Vbml0aW1lIEdldERhdGUoKSBjb25zdDsNCisgIENGWF9Vbml0aW1lIEdldFRpbWUoKSBjb25zdDsNCisgIENGWF9Vbml0aW1lIEdldERhdGVUaW1lKCkgY29uc3Q7DQorICBGWF9CT09MIFNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7DQorICBGWF9CT09MIFNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwNCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsDQorICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSk7DQorICBGWF9CT09MIFNldE51bShGWF9GTE9BVCBmTnVtKTsNCisgIEZYX0JPT0wgU2V0TnVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c051bSwNCisgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwNCisgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUpOw0KKyAgRlhfQk9PTCBTZXREYXRlKGNvbnN0IENGWF9Vbml0aW1lJiBkKTsNCisgIEZYX0JPT0wgU2V0RGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRlLA0KKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwNCisgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlKTsNCisgIEZYX0JPT0wgU2V0VGltZShjb25zdCBDRlhfVW5pdGltZSYgdCk7DQorICBGWF9CT09MIFNldFRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGltZSwNCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsDQorICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSk7DQorICBGWF9CT09MIFNldERhdGVUaW1lKGNvbnN0IENGWF9Vbml0aW1lJiBkdCk7DQorICBGWF9CT09MIFNldERhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGVUaW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUpOw0KKyAgaW5saW5lIEZYX0JPT0wgSXNOdWxsKCkgY29uc3QgeyByZXR1cm4gbV9kd1R5cGUgPT0gWEZBX1ZUX05VTEw7IH0NCisgIGlubGluZSBGWF9CT09MIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX3dzVmFsdWUuSXNFbXB0eSgpOyB9DQorICBpbmxpbmUgRlhfQk9PTCBJc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gbV9iVmFsaWQ7IH0NCisNCisgcHJvdGVjdGVkOg0KKyAgRlhfQk9PTCBQYXJzZVBhdHRlcm5WYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSk7DQorICBDWEZBX0xvY2FsZU1nciogbV9wTG9jYWxlTWdyOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c1ZhbHVlOw0KKyAgRlhfRFdPUkQgbV9kd1R5cGU7DQorICBGWF9CT09MIG1fYlZhbGlkOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2NvbW1vbi5oIGIveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMjAxY2MKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfY29tbW9uLmgKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisvLyBUT0RPKHRoZXN0aWcpOiBSZW1vdmUgdGhpcyBmaWxlIGFuZCBkbyBJV1lVLg0KKw0KKyNpZm5kZWYgX1hGQV9DT01NT05fSF8NCisjZGVmaW5lIF9YRkFfQ09NTU9OX0hfDQorI2luY2x1ZGUgInhmYV91dGlscy5oIg0KKyNpbmNsdWRlICJ4ZmFfb2JqZWN0LmgiDQorI2luY2x1ZGUgInhmYV9kb2N1bWVudC5oIg0KKyNpbmNsdWRlICJ4ZmFfcGFyc2VyLmgiDQorI2luY2x1ZGUgInhmYV9zY3JpcHQuaCINCisjaW5jbHVkZSAieGZhX2RvY2RhdGEuaCINCisjaW5jbHVkZSAieGZhX2RvY2xheW91dC5oIg0KKyNpbmNsdWRlICJ4ZmFfbG9jYWxlbWdyLmgiDQorI2luY2x1ZGUgInhmYV9mbTJqc2FwaS5oIg0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NkYXRhLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMGE5YzQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jZGF0YS5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfWEZBX0RPQ0RBVEFfSA0KKyNkZWZpbmUgX1hGQV9ET0NEQVRBX0gNCitlbnVtIFhGQV9EQVRBRk9STUFUIHsNCisgIFhGQV9EQVRBRk9STUFUX1hEUCwNCit9Ow0KK2NsYXNzIElYRkFfUGFja2V0RXhwb3J0IHsNCisgcHVibGljOg0KKyAgc3RhdGljIElYRkFfUGFja2V0RXhwb3J0KiBDcmVhdGUoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0RBVEFGT1JNQVQgZUZvcm1hdCA9IFhGQV9EQVRBRk9STUFUX1hEUCk7DQorICB2aXJ0dWFsIH5JWEZBX1BhY2tldEV4cG9ydCgpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBFeHBvcnQoSUZYX0ZpbGVXcml0ZSogcFdyaXRlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgRXhwb3J0KElGWF9GaWxlV3JpdGUqIHBXcml0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdGbGFnID0gMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogcENoZWNrc3VtID0gTlVMTCkgPSAwOw0KK307DQorY2xhc3MgSVhGQV9QYWNrZXRJbXBvcnQgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSVhGQV9QYWNrZXRJbXBvcnQqIENyZWF0ZShDWEZBX0RvY3VtZW50KiBwRHN0RG9jKTsNCisgIHZpcnR1YWwgfklYRkFfUGFja2V0SW1wb3J0KCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEltcG9ydERhdGEoSUZYX0ZpbGVSZWFkKiBwRGF0YURvY3VtZW50KSA9IDA7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jbGF5b3V0LmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jbGF5b3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0NDUzMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NsYXlvdXQuaApAQCAtMCwwICsxLDEzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfRE9DTEFZT1VUX0hfDQorI2RlZmluZSBfWEZBX0RPQ0xBWU9VVF9IXw0KKyNkZWZpbmUgX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8NCisNCitjbGFzcyBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW07DQorY2xhc3MgQ1hGQV9Db250ZW50TGF5b3V0SXRlbTsNCisNCitjbGFzcyBJWEZBX0xheW91dFBhZ2Ugew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JWEZBX0xheW91dFBhZ2UoKSB7fQ0KKyAgdmlydHVhbCBJWEZBX0RvY0xheW91dCogR2V0TGF5b3V0KCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldFBhZ2VJbmRleCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgdm9pZCBHZXRQYWdlU2l6ZShDRlhfU2l6ZUYmIHNpemUpID0gMDsNCisgIHZpcnR1YWwgQ1hGQV9Ob2RlKiBHZXRNYXN0ZXJQYWdlKCkgY29uc3QgPSAwOw0KK307DQorDQorY2xhc3MgQ1hGQV9MYXlvdXRJdGVtIHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+Q1hGQV9MYXlvdXRJdGVtKCk7DQorDQorICBGWF9CT09MIElzQ29udGFpbmVyTGF5b3V0SXRlbSgpIGNvbnN0IHsgcmV0dXJuICFtX2JJc0NvbnRlbnRMYXlvdXRJdGVtOyB9DQorICBGWF9CT09MIElzQ29udGVudExheW91dEl0ZW0oKSBjb25zdCB7IHJldHVybiBtX2JJc0NvbnRlbnRMYXlvdXRJdGVtOyB9DQorICBpbmxpbmUgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBBc0NvbnRhaW5lckxheW91dEl0ZW0oKTsNCisgIGlubGluZSBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBBc0NvbnRlbnRMYXlvdXRJdGVtKCk7DQorDQorICBJWEZBX0xheW91dFBhZ2UqIEdldFBhZ2UoKSBjb25zdDsNCisgIENYRkFfTm9kZSogR2V0Rm9ybU5vZGUoKSBjb25zdDsNCisgIHZvaWQgR2V0UmVjdChDRlhfUmVjdEYmIHJ0TGF5b3V0LCBGWF9CT09MIGJSZWxhdGl2ZSA9IEZBTFNFKSBjb25zdDsNCisgIGludDMyX3QgR2V0SW5kZXgoKSBjb25zdDsNCisgIGludDMyX3QgR2V0Q291bnQoKSBjb25zdDsNCisgIENYRkFfTGF5b3V0SXRlbSogR2V0UGFyZW50KCkgY29uc3Q7DQorICBjb25zdCBDWEZBX0xheW91dEl0ZW0qIEdldEZpcnN0KCkgY29uc3Q7DQorICBDWEZBX0xheW91dEl0ZW0qIEdldEZpcnN0KCk7DQorICBjb25zdCBDWEZBX0xheW91dEl0ZW0qIEdldExhc3QoKSBjb25zdDsNCisgIENYRkFfTGF5b3V0SXRlbSogR2V0TGFzdCgpOw0KKyAgQ1hGQV9MYXlvdXRJdGVtKiBHZXRQcmV2KCkgY29uc3Q7DQorICBDWEZBX0xheW91dEl0ZW0qIEdldE5leHQoKSBjb25zdDsNCisNCisgIHZvaWQgQWRkQ2hpbGQoQ1hGQV9MYXlvdXRJdGVtKiBwQ2hpbGRJdGVtKTsNCisgIHZvaWQgQWRkSGVhZENoaWxkKENYRkFfTGF5b3V0SXRlbSogcENoaWxkSXRlbSk7DQorICB2b2lkIFJlbW92ZUNoaWxkKENYRkFfTGF5b3V0SXRlbSogcENoaWxkSXRlbSk7DQorICB2b2lkIEluc2VydENoaWxkKENYRkFfTGF5b3V0SXRlbSogcEJlZm9yZUl0ZW0sIENYRkFfTGF5b3V0SXRlbSogcENoaWxkSXRlbSk7DQorDQorICBDWEZBX05vZGUqIG1fcEZvcm1Ob2RlOw0KKyAgQ1hGQV9MYXlvdXRJdGVtKiBtX3BQYXJlbnQ7DQorICBDWEZBX0xheW91dEl0ZW0qIG1fcE5leHRTaWJsaW5nOw0KKyAgQ1hGQV9MYXlvdXRJdGVtKiBtX3BGaXJzdENoaWxkOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDWEZBX0xheW91dEl0ZW0oQ1hGQV9Ob2RlKiBwTm9kZSwgRlhfQk9PTCBiSXNDb250ZW50TGF5b3V0SXRlbSk7DQorDQorICBGWF9CT09MIG1fYklzQ29udGVudExheW91dEl0ZW07DQorfTsNCisNCitjbGFzcyBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0gOiBwdWJsaWMgQ1hGQV9MYXlvdXRJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJWEZBX0xheW91dFBhZ2Ugew0KKyBwdWJsaWM6DQorICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0oQ1hGQV9Ob2RlKiBwTm9kZSk7DQorDQorICAvLyBJWEZBX0xheW91dFBhZ2U6DQorICBJWEZBX0RvY0xheW91dCogR2V0TGF5b3V0KCkgY29uc3Qgb3ZlcnJpZGU7DQorICBpbnQzMl90IEdldFBhZ2VJbmRleCgpIGNvbnN0IG92ZXJyaWRlOw0KKyAgdm9pZCBHZXRQYWdlU2l6ZShDRlhfU2l6ZUYmIHNpemUpIG92ZXJyaWRlOw0KKyAgQ1hGQV9Ob2RlKiBHZXRNYXN0ZXJQYWdlKCkgY29uc3Qgb3ZlcnJpZGU7DQorDQorICBDWEZBX05vZGUqIG1fcE9sZFN1YmZvcm07DQorfTsNCisNCisjZGVmaW5lIFhGQV9XSURHRVRTVEFUVVNfQWNjZXNzIDB4ODAwMDAwMDANCisjZGVmaW5lIFhGQV9XSURHRVRTVEFUVVNfRGlzYWJsZWQgMHg0MDAwMDAwMA0KKyNkZWZpbmUgWEZBX1dJREdFVFNUQVRVU19SZWN0Q2FjaGVkIDB4MjAwMDAwMDANCisjZGVmaW5lIFhGQV9XSURHRVRTVEFUVVNfQnV0dG9uRG93biAweDEwMDAwMDAwDQorI2RlZmluZSBYRkFfV0lER0VUU1RBVFVTX0hpZ2hsaWdodCAweDA4MDAwMDAwDQorI2RlZmluZSBYRkFfV0lER0VUU1RBVFVTX1RleHRFZGl0VmFsdWVDaGFuZ2VkIDB4MDQwMDAwMDANCisNCitjbGFzcyBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtIDogcHVibGljIENYRkFfTGF5b3V0SXRlbSB7DQorIHB1YmxpYzoNCisgIENYRkFfQ29udGVudExheW91dEl0ZW0oQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICB2aXJ0dWFsIH5DWEZBX0NvbnRlbnRMYXlvdXRJdGVtKCk7DQorDQorICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBtX3BQcmV2Ow0KKyAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogbV9wTmV4dDsNCisgIENGWF9Qb2ludEYgbV9zUG9zOw0KKyAgQ0ZYX1NpemVGIG1fc1NpemU7DQorICBGWF9EV09SRCBtX2R3U3RhdHVzOw0KK307DQorDQorQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBDWEZBX0xheW91dEl0ZW06OkFzQ29udGFpbmVyTGF5b3V0SXRlbSgpIHsNCisgIHJldHVybiBJc0NvbnRhaW5lckxheW91dEl0ZW0oKSA/IHN0YXRpY19jYXN0PENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSo+KHRoaXMpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxscHRyOw0KK30NCitDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBDWEZBX0xheW91dEl0ZW06OkFzQ29udGVudExheW91dEl0ZW0oKSB7DQorICByZXR1cm4gSXNDb250ZW50TGF5b3V0SXRlbSgpID8gc3RhdGljX2Nhc3Q8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSo+KHRoaXMpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbHB0cjsNCit9DQoraW5saW5lIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogVG9Db250YWluZXJMYXlvdXRJdGVtKENYRkFfTGF5b3V0SXRlbSogcEl0ZW0pIHsNCisgIHJldHVybiBwSXRlbSA/IHBJdGVtLT5Bc0NvbnRhaW5lckxheW91dEl0ZW0oKSA6IG51bGxwdHI7DQorfQ0KK2lubGluZSBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBUb0NvbnRlbnRMYXlvdXRJdGVtKENYRkFfTGF5b3V0SXRlbSogcEl0ZW0pIHsNCisgIHJldHVybiBwSXRlbSA/IHBJdGVtLT5Bc0NvbnRlbnRMYXlvdXRJdGVtKCkgOiBudWxscHRyOw0KK30NCisNCitjbGFzcyBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfTGF5b3V0SXRlbSB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBpbmxpbmUgQ1hGQV9MYXlvdXRJdGVtKiBHZXRGaXJzdENoaWxkKENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0pIHsNCisgICAgcmV0dXJuIHBMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOw0KKyAgfQ0KKyAgc3RhdGljIGlubGluZSBDWEZBX0xheW91dEl0ZW0qIEdldE5leHRTaWJsaW5nKENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0pIHsNCisgICAgcmV0dXJuIHBMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgIH0NCisgIHN0YXRpYyBpbmxpbmUgQ1hGQV9MYXlvdXRJdGVtKiBHZXRQYXJlbnQoQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSkgew0KKyAgICByZXR1cm4gcExheW91dEl0ZW0tPm1fcFBhcmVudDsNCisgIH0NCit9Ow0KKw0KK2NsYXNzIElYRkFfRG9jTGF5b3V0IHsNCisgcHVibGljOg0KKyAgdmlydHVhbCB+SVhGQV9Eb2NMYXlvdXQoKSB7fQ0KKyAgdmlydHVhbCBDWEZBX0RvY3VtZW50KiBHZXREb2N1bWVudCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBTdGFydExheW91dChGWF9CT09MIGJGb3JjZVJlc3RhcnQgPSBGQUxTRSkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IERvTGF5b3V0KElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEluY3JlbWVudExheW91dCgpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudFBhZ2VzKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBJWEZBX0xheW91dFBhZ2UqIEdldFBhZ2UoaW50MzJfdCBpbmRleCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBDWEZBX0xheW91dEl0ZW0qIEdldExheW91dEl0ZW0oQ1hGQV9Ob2RlKiBwRm9ybUl0ZW0pID0gMDsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2N1bWVudC5oIGIveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY3VtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZkZThiNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2N1bWVudC5oCkBAIC0wLDAgKzEsMTk2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1hGQV9ET0NVTUVOVF9IDQorI2RlZmluZSBfWEZBX0RPQ1VNRU5UX0gNCisNCitjbGFzcyBDWEZBX0RvY3VtZW50Ow0KK2NsYXNzIENYRkFfTGF5b3V0SXRlbTsNCitjbGFzcyBDWEZBX0xheW91dFByb2Nlc3NvcjsNCitjbGFzcyBDWEZBX05vZGU7DQorY2xhc3MgSVhGQV9Eb2NMYXlvdXQ7DQorY2xhc3MgSVhGQV9Eb2NQYXJzZXI7DQorY2xhc3MgSVhGQV9MYXlvdXRQYWdlOw0KK2NsYXNzIElYRkFfTm90aWZ5Ow0KK2NsYXNzIElYRkFfT2JqRmFjdG9yeTsNCitjbGFzcyBJWEZBX1BhZ2VDb250ZW50Ow0KK2NsYXNzIElYRkFfU2NyaXB0Q29udGV4dDsNCisNCitlbnVtIFhGQV9WRVJTSU9OIHsNCisgIFhGQV9WRVJTSU9OX1VOS05PV04gPSAwLA0KKyAgWEZBX1ZFUlNJT05fMjAwID0gMjAwLA0KKyAgWEZBX1ZFUlNJT05fMjAyID0gMjAyLA0KKyAgWEZBX1ZFUlNJT05fMjA0ID0gMjA0LA0KKyAgWEZBX1ZFUlNJT05fMjA1ID0gMjA1LA0KKyAgWEZBX1ZFUlNJT05fMjA2ID0gMjA2LA0KKyAgWEZBX1ZFUlNJT05fMjA3ID0gMjA3LA0KKyAgWEZBX1ZFUlNJT05fMjA4ID0gMjA4LA0KKyAgWEZBX1ZFUlNJT05fMzAwID0gMzAwLA0KKyAgWEZBX1ZFUlNJT05fMzAxID0gMzAxLA0KKyAgWEZBX1ZFUlNJT05fMzAzID0gMzAzLA0KKyAgWEZBX1ZFUlNJT05fMzA2ID0gMzA2LA0KKyAgWEZBX1ZFUlNJT05fREVGQVVMVCA9IFhGQV9WRVJTSU9OXzMwMywNCisgIFhGQV9WRVJTSU9OX01JTiA9IDIwMCwNCisgIFhGQV9WRVJTSU9OX01BWCA9IDQwMCwNCit9Ow0KKw0KKyNkZWZpbmUgWEZBX0xBWU9VVFNUQVRVU19WaXNpYmxlIDB4MDAwMQ0KKyNkZWZpbmUgWEZBX0xBWU9VVFNUQVRVU19WaWV3YWJsZSAweDAwMTANCisjZGVmaW5lIFhGQV9MQVlPVVRTVEFUVVNfUHJpbnRhYmxlIDB4MDAyMA0KK2VudW0gWEZBX05PREVFVkVOVCB7DQorICBYRkFfTk9ERUVWRU5UX1JlYWR5LA0KKyAgWEZBX05PREVFVkVOVF9WYWx1ZUNoYW5naW5nLA0KKyAgWEZBX05PREVFVkVOVF9WYWx1ZUNoYW5nZWQsDQorICBYRkFfTk9ERUVWRU5UX0NoaWxkQWRkZWQsDQorICBYRkFfTk9ERUVWRU5UX0NoaWxkUmVtb3ZlZCwNCit9Ow0KK2VudW0gWEZBX1BBR0VFVkVOVCB7DQorICBYRkFfUEFHRUVWRU5UX1BhZ2VBZGRlZCwNCisgIFhGQV9QQUdFRVZFTlRfUGFnZVJlbW92ZWQsDQorfTsNCitlbnVtIFhGQV9MQVlPVVRFVkVOVCB7DQorICBYRkFfTEFZT1VURVZFTlRfSXRlbUFkZGVkLA0KKyAgWEZBX0xBWU9VVEVWRU5UX0l0ZW1SZW1vdmluZywNCisgIFhGQV9MQVlPVVRFVkVOVF9SZWN0Q2hhbmdlZCwNCisgIFhGQV9MQVlPVVRFVkVOVF9TdGF0dXNDaGFuZ2VkLA0KK307DQorZW51bSBYRkFfTEFZT1VUUkVTVUxUIHsNCisgIFhGQV9MQVlPVVRSRVNVTFRfQ29udGludWUsDQorICBYRkFfTEFZT1VUUkVTVUxUX0RvbmUsDQorICBYRkFfTEFZT1VUUkVTVUxUX05leHRDb250ZW50LA0KK307DQorI2RlZmluZSBYRkFfTEFZT1VUTk9USUZZX1N0cmljdEhlaWdodCAweDAwMDENCisjZGVmaW5lIFhGQV9MQVlPVVROT1RJRllfTm9QYXJlbnRCcmVhayAweDAwMDINCitjbGFzcyBJWEZBX05vdGlmeSB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklYRkFfTm90aWZ5KCkge30NCisgIHZpcnR1YWwgdm9pZCBPblBhZ2VFdmVudChJWEZBX0xheW91dFBhZ2UqIHBTZW5kZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BBR0VFVkVOVCBlRXZlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtID0gTlVMTCkgPSAwOw0KKw0KKyAgdmlydHVhbCB2b2lkIE9uTm9kZUV2ZW50KENYRkFfTm9kZSogcFNlbmRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTk9ERUVWRU5UIGVFdmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0gPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbTIgPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbTMgPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBQYXJhbTQgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgT25XaWRnZXREYXRhRXZlbnQoQ1hGQV9XaWRnZXREYXRhKiBwU2VuZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RXZlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwQWRkaXRpb25hbCA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEFkZGl0aW9uYWwyID0gTlVMTCkgPSAwOw0KKw0KKyAgdmlydHVhbCBDWEZBX0xheW91dEl0ZW0qIE9uQ3JlYXRlTGF5b3V0SXRlbShDWEZBX05vZGUqIHBOb2RlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgT25MYXlvdXRFdmVudChJWEZBX0RvY0xheW91dCogcExheW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbSogcFNlbmRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MQVlPVVRFVkVOVCBlRXZlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwUGFyYW0gPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFBhcmFtMiA9IE5VTEwpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTdGFydEZpZWxkRHJhd0xheW91dChDWEZBX05vZGUqIHBJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmQ2FsY1dpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmQ2FsY0hlaWdodCkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEZpbmRTcGxpdFBvcyhDWEZBX05vZGUqIHBJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCbG9ja0luZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkNhbGNIZWlnaHRQb3MpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBSdW5TY3JpcHQoQ1hGQV9Ob2RlKiBwU2NyaXB0LCBDWEZBX05vZGUqIHBGb3JtSXRlbSkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEV4ZWNFdmVudEJ5RGVlcEZpcnN0KENYRkFfTm9kZSogcEZvcm1Ob2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FVkVOVFRZUEUgZUV2ZW50VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJc0Zvcm1SZWFkeSA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlY3Vyc2l2ZSA9IFRSVUUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBFeGNsdWRlID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEFkZENhbGNWYWxpZGF0ZShDWEZBX05vZGUqIHBOb2RlKSA9IDA7DQorICB2aXJ0dWFsIElYRkFfRG9jKiBHZXRIRE9DKCkgPSAwOw0KKyAgdmlydHVhbCBJWEZBX0RvY1Byb3ZpZGVyKiBHZXREb2NQcm92aWRlcigpID0gMDsNCisgIHZpcnR1YWwgSVhGQV9BcHBQcm92aWRlciogR2V0QXBwUHJvdmlkZXIoKSA9IDA7DQorICB2aXJ0dWFsIElYRkFfV2lkZ2V0SGFuZGxlciogR2V0V2lkZ2V0SGFuZGxlcigpID0gMDsNCisgIHZpcnR1YWwgSVhGQV9XaWRnZXQqIEdldEhXaWRnZXQoQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIE9wZW5Ecm9wRG93bkxpc3QoSVhGQV9XaWRnZXQqIGhXaWRnZXQpID0gMDsNCisgIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0Q3VycmVudERhdGVUaW1lKCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFJlc2V0RGF0YShDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldExheW91dFN0YXR1cygpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBSdW5Ob2RlSW5pdGlhbGl6ZShDWEZBX05vZGUqIHBOb2RlKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgUnVuU3ViZm9ybUluZGV4Q2hhbmdlKENYRkFfTm9kZSogcFN1YmZvcm1Ob2RlKSA9IDA7DQorICB2aXJ0dWFsIENYRkFfTm9kZSogR2V0Rm9jdXNXaWRnZXROb2RlKCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIFNldEZvY3VzV2lkZ2V0Tm9kZShDWEZBX05vZGUqIHBOb2RlKSA9IDA7DQorfTsNCitjbGFzcyBJWEZBX09iakZhY3Rvcnkgew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIH5JWEZBX09iakZhY3RvcnkoKSB7fQ0KKyAgdmlydHVhbCBDWEZBX05vZGUqIENyZWF0ZU5vZGUoRlhfRFdPUkQgZHdQYWNrZXQsIFhGQV9FTEVNRU5UIGVFbGVtZW50KSA9IDA7DQorICB2aXJ0dWFsIENYRkFfTm9kZSogQ3JlYXRlTm9kZShYRkFfTFBDUEFDS0VUSU5GTyBwUGFja2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgZUVsZW1lbnQpID0gMDsNCit9Ow0KKyNkZWZpbmUgWEZBX0RPQ0ZMQUdfU3RyaWN0U2NvcGluZyAweDAwMDENCisjZGVmaW5lIFhGQV9ET0NGTEFHX0hhc0ludGVyYWN0aXZlIDB4MDAwMg0KKyNkZWZpbmUgWEZBX0RPQ0ZMQUdfSW50ZXJhY3RpdmUgMHgwMDA0DQorI2RlZmluZSBYRkFfRE9DRkxBR19TY3JpcHRpbmcgMHgwMDA4DQorY2xhc3MgQ1NjcmlwdF9EYXRhV2luZG93Ow0KK2NsYXNzIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDsNCitjbGFzcyBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDsNCitjbGFzcyBDU2NyaXB0X0xvZ1BzZXVkb01vZGVsOw0KK2NsYXNzIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw7DQorY2xhc3MgQ1NjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbDsNCitjbGFzcyBDWEZBX0RvY3VtZW50IDogcHVibGljIElYRkFfT2JqRmFjdG9yeSB7DQorIHB1YmxpYzoNCisgIENYRkFfRG9jdW1lbnQoSVhGQV9Eb2NQYXJzZXIqIHBQYXJzZXIpOw0KKyAgfkNYRkFfRG9jdW1lbnQoKTsNCisgIENYRkFfTm9kZSogR2V0Um9vdCgpIGNvbnN0IHsgcmV0dXJuIG1fcFJvb3ROb2RlOyB9DQorICBJWEZBX0RvY1BhcnNlciogR2V0UGFyc2VyKCkgY29uc3QgeyByZXR1cm4gbV9wUGFyc2VyOyB9DQorICBJWEZBX05vdGlmeSogR2V0Tm90aWZ5KCkgY29uc3Q7DQorICB2b2lkIFNldFJvb3QoQ1hGQV9Ob2RlKiBwTmV3Um9vdCk7DQorICBDWEZBX09iamVjdCogR2V0WEZBTm9kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTm9kZU5hbWUpOw0KKyAgQ1hGQV9PYmplY3QqIEdldFhGQU5vZGUoRlhfRFdPUkQgd3NOb2RlTmFtZUhhc2gpOw0KKyAgdm9pZCBBZGRQdXJnZU5vZGUoQ1hGQV9Ob2RlKiBwTm9kZSk7DQorICBGWF9CT09MIFJlbW92ZVB1cmdlTm9kZShDWEZBX05vZGUqIHBOb2RlKTsNCisgIHZvaWQgUHVyZ2VOb2RlcygpOw0KKyAgRlhfQk9PTCBIYXNGbGFnKEZYX0RXT1JEIGR3RmxhZykgeyByZXR1cm4gKG1fZHdEb2NGbGFncyAmIGR3RmxhZykgPT0gZHdGbGFnOyB9DQorICB2b2lkIFNldEZsYWcoRlhfRFdPUkQgZHdGbGFnLCBGWF9CT09MIGJPbiA9IFRSVUUpOw0KKyAgRlhfQk9PTCBJc0ludGVyYWN0aXZlKCk7DQorICBYRkFfVkVSU0lPTiBHZXRDdXJWZXJzaW9uTW9kZSgpIHsgcmV0dXJuIG1fZUN1clZlcnNpb25Nb2RlOyB9DQorICBYRkFfVkVSU0lPTiBSZWNvZ25pemVYRkFWZXJzaW9uTnVtYmVyKENGWF9XaWRlU3RyaW5nJiB3c1RlbXBsYXRlTlMpOw0KKyAgQ1hGQV9Mb2NhbGVNZ3IqIEdldExvY2FsTWdyKCk7DQorICB2aXJ0dWFsIENYRkFfTm9kZSogQ3JlYXRlTm9kZShGWF9EV09SRCBkd1BhY2tldCwgWEZBX0VMRU1FTlQgZUVsZW1lbnQpOw0KKyAgdmlydHVhbCBDWEZBX05vZGUqIENyZWF0ZU5vZGUoWEZBX0xQQ1BBQ0tFVElORk8gcFBhY2tldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVFbGVtZW50KTsNCisgIHZvaWQgRG9Qcm90b01lcmdlKCk7DQorICBDWEZBX05vZGUqIEdldE5vZGVCeUlEKENYRkFfTm9kZSogcFJvb3QsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NJRCk7DQorICB2b2lkIERvRGF0YU1lcmdlKCk7DQorICB2b2lkIERvRGF0YVJlbWVyZ2UoRlhfQk9PTCBiRG9EYXRhTWVyZ2UpOw0KKyAgQ1hGQV9Ob2RlKiBEYXRhTWVyZ2VfQ29weUNvbnRhaW5lcihDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEYXRhU2NvcGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk9uZUluc3RhbmNlID0gRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRhdGFNZXJnZSA9IFRSVUUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVwTGV2ZWwgPSBUUlVFKTsNCisgIHZvaWQgRGF0YU1lcmdlX1VwZGF0ZUJpbmRpbmdSZWxhdGlvbnMoQ1hGQV9Ob2RlKiBwRm9ybVVwZGF0ZVJvb3QpOw0KKyAgQ1hGQV9Ob2RlKiBHZXROb3RCaW5kTm9kZShDWEZBX09iakFycmF5JiBhcnJheU5vZGVzKTsNCisgIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBHZXRMYXlvdXRQcm9jZXNzb3IoKTsNCisgIElYRkFfRG9jTGF5b3V0KiBHZXREb2NMYXlvdXQoKTsNCisgIElYRkFfU2NyaXB0Q29udGV4dCogSW5pdFNjcmlwdENvbnRleHQoRlhKU0VfSFJVTlRJTUUgaFJ1bnRpbWUpOw0KKyAgSVhGQV9TY3JpcHRDb250ZXh0KiBHZXRTY3JpcHRDb250ZXh0KCk7DQorICB2b2lkIENsZWFyTGF5b3V0RGF0YSgpOw0KKw0KKyAgQ0ZYX01hcFB0clRlbXBsYXRlPEZYX0RXT1JELCBDWEZBX05vZGUqPiBtX3JnR2xvYmFsQmluZGluZzsNCisgIENYRkFfTm9kZUFycmF5IG1fcFBlbmRpbmdQYWdlU2V0Ow0KKw0KKyBwcm90ZWN0ZWQ6DQorICBJWEZBX0RvY1BhcnNlciogbV9wUGFyc2VyOw0KKyAgSVhGQV9TY3JpcHRDb250ZXh0KiBtX3BTY3JpcHRDb250ZXh0Ow0KKyAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIG1fcExheW91dFByb2Nlc3NvcjsNCisgIENYRkFfTm9kZSogbV9wUm9vdE5vZGU7DQorICBDWEZBX0xvY2FsZU1nciogbV9wTG9jYWxNZ3I7DQorICBDU2NyaXB0X0RhdGFXaW5kb3cqIG1fcFNjcmlwdERhdGFXaW5kb3c7DQorICBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWwqIG1fcFNjcmlwdEV2ZW50Ow0KKyAgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWwqIG1fcFNjcmlwdEhvc3Q7DQorICBDU2NyaXB0X0xvZ1BzZXVkb01vZGVsKiBtX3BTY3JpcHRMb2c7DQorICBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsKiBtX3BTY3JpcHRMYXlvdXQ7DQorICBDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsKiBtX3BTY3JpcHRTaWduYXR1cmU7DQorICBDWEZBX05vZGVTZXQgbV9yZ1B1cmdlTm9kZXM7DQorICBYRkFfVkVSU0lPTiBtX2VDdXJWZXJzaW9uTW9kZTsNCisgIEZYX0RXT1JEIG1fZHdEb2NGbGFnczsNCisgIGZyaWVuZCBjbGFzcyBDWEZBX1NpbXBsZVBhcnNlcjsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9mbTJqc2FwaS5oIGIveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2ZtMmpzYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA1NmUxNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9mbTJqc2FwaS5oCkBAIC0wLDAgKzEsMjggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfWEZBX0ZNMkpTX0FQSV9IDQorI2RlZmluZSBfWEZBX0ZNMkpTX0FQSV9IDQorI2RlZmluZSBGT1hJVF9YRkFfRk0ySlNfRk9STUNBTENfUlVOVElNRSAiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUiDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmDQordHlwZWRlZiBzdHJ1Y3QgWEZBX0hGTTJKU0NPTlRFWFRfIHsgdm9pZCoqIHBEYXRhOyB9ICogWEZBX0hGTTJKU0NPTlRFWFQ7DQoraW50MzJfdCBYRkFfRk0ySlNfVHJhbnNsYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb3JtY2FsYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVUZXh0QnVmJiB3c0phdmFzY3JpcHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0Vycm9yKTsNCitYRkFfSEZNMkpTQ09OVEVYVCBYRkFfRk0ySlNfQ29udGV4dENyZWF0ZSgpOw0KK3ZvaWQgWEZBX0ZNMkpTX0NvbnRleHRJbml0aWFsaXplKFhGQV9IRk0ySlNDT05URVhUIGhGTTJKU0NvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFJVTlRJTUUgaFNjcmlwdFJ1bnRpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSENPTlRFWFQgaFNjcmlwdENvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsNCit2b2lkIFhGQV9GTTJKU19HbG9iYWxQcm9wZXJ0eUdldHRlcihYRkFfSEZNMkpTQ09OVEVYVCBoRk0ySlNDb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KK3ZvaWQgWEZBX0ZNMkpTX0NvbnRleHRSZWxlYXNlKFhGQV9IRk0ySlNDT05URVhUIGhGTTJKU0NvbnRleHQpOw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK30NCisjZW5kaWYNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfbG9jYWxlbWdyLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfbG9jYWxlbWdyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRkYTZkMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9sb2NhbGVtZ3IuaApAQCAtMCwwICsxLDcwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYRkFfTE9DQUxFTUdSX0gNCisjZGVmaW5lIF9GWEZBX0xPQ0FMRU1HUl9IDQorY2xhc3MgQ1hGQV9Ob2RlOw0KK2NsYXNzIElGWF9Mb2NhbGU7DQorY2xhc3MgSUZYX0xvY2FsZU1ncjsNCitjbGFzcyBDWEZBX0xvY2FsZU1ncjsNCisjZGVmaW5lIFhGQV9MQU5HSURfemhfQ04gMHgwODA0DQorI2RlZmluZSBYRkFfTEFOR0lEX3poX1RXIDB4MDQwNA0KKyNkZWZpbmUgWEZBX0xBTkdJRF96aF9ISyAweDBjMDQNCisjZGVmaW5lIFhGQV9MQU5HSURfamFfSlAgMHgwNDExDQorI2RlZmluZSBYRkFfTEFOR0lEX2tvX0tSIDB4MDQxMg0KKyNkZWZpbmUgWEZBX0xBTkdJRF9lbl9VUyAweDA0MDkNCisjZGVmaW5lIFhGQV9MQU5HSURfZW5fR0IgMHgwODA5DQorI2RlZmluZSBYRkFfTEFOR0lEX2VzX0VTIDB4MGMwYQ0KKyNkZWZpbmUgWEZBX0xBTkdJRF9lc19MQSAweDA4MGENCisjZGVmaW5lIFhGQV9MQU5HSURfZGVfREUgMHgwNDA3DQorI2RlZmluZSBYRkFfTEFOR0lEX2ZyX0ZSIDB4MDQwYw0KKyNkZWZpbmUgWEZBX0xBTkdJRF9pdF9JVCAweDA0MTANCisjZGVmaW5lIFhGQV9MQU5HSURfcHRfQlIgMHgwNDE2DQorI2RlZmluZSBYRkFfTEFOR0lEX25sX05MIDB4MDQxMw0KKyNkZWZpbmUgWEZBX0xBTkdJRF9ydV9SVSAweDA0MTkNCitjbGFzcyBDWEZBX0xvY2FsZU1nciA6IHB1YmxpYyBJRlhfTG9jYWxlTWdyIHsNCisgcHVibGljOg0KKyAgQ1hGQV9Mb2NhbGVNZ3IoQ1hGQV9Ob2RlKiBwTG9jYWxlU2V0LCBDRlhfV2lkZVN0cmluZyB3c0RlZmxjaWQpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKTsNCisgIHZpcnR1YWwgRlhfV09SRCBHZXREZWZMb2NhbGVJRCgpOw0KKyAgdmlydHVhbCBJRlhfTG9jYWxlKiBHZXREZWZMb2NhbGUoKTsNCisgIHZpcnR1YWwgSUZYX0xvY2FsZSogR2V0TG9jYWxlKEZYX1dPUkQgbGNpZCk7DQorICB2aXJ0dWFsIElGWF9Mb2NhbGUqIEdldExvY2FsZUJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTG9jYWxlTmFtZSk7DQorICB+Q1hGQV9Mb2NhbGVNZ3IoKTsNCisgIHZvaWQgU2V0RGVmTG9jYWxlKElGWF9Mb2NhbGUqIHBMb2NhbGUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmdDIEdldENvbmZpZ0xvY2FsZU5hbWUoQ1hGQV9Ob2RlKiBwQ29uZmlnKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX1B0ckFycmF5IG1fTG9jYWxlQXJyYXk7DQorICBDRlhfUHRyQXJyYXkgbV9YTUxMb2NhbGVBcnJheTsNCisgIElGWF9Mb2NhbGUqIG1fcERlZkxvY2FsZTsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NDb25maWdMb2NhbGU7DQorICBGWF9XT1JEIG1fZHdEZWZsY2lkOw0KKyAgRlhfV09SRCBtX2R3TG9jYWxlRmxhZ3M7DQorfTsNCitjbGFzcyBJWEZBX1RpbWVab25lUHJvdmlkZXIgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSVhGQV9UaW1lWm9uZVByb3ZpZGVyKiBDcmVhdGUoKTsNCisgIHN0YXRpYyBJWEZBX1RpbWVab25lUHJvdmlkZXIqIEdldCgpOw0KKyAgc3RhdGljIHZvaWQgRGVzdHJveSgpOw0KKw0KKyAgdmlydHVhbCB+SVhGQV9UaW1lWm9uZVByb3ZpZGVyKCkge30NCisNCisgIHZpcnR1YWwgdm9pZCBTZXRUaW1lWm9uZShGWF9USU1FWk9ORSYgdHopID0gMDsNCisNCisgIHZpcnR1YWwgdm9pZCBHZXRUaW1lWm9uZShGWF9USU1FWk9ORSYgdHopID0gMDsNCit9Ow0KK2NsYXNzIENYRkFfVGltZVpvbmVQcm92aWRlciA6IHB1YmxpYyBJWEZBX1RpbWVab25lUHJvdmlkZXIgew0KKyBwdWJsaWM6DQorICBDWEZBX1RpbWVab25lUHJvdmlkZXIoKTsNCisgIHZpcnR1YWwgfkNYRkFfVGltZVpvbmVQcm92aWRlcigpOw0KKyAgdmlydHVhbCB2b2lkIFNldFRpbWVab25lKEZYX1RJTUVaT05FJiB0eik7DQorICB2aXJ0dWFsIHZvaWQgR2V0VGltZVpvbmUoRlhfVElNRVpPTkUmIHR6KTsNCisNCisgcHJpdmF0ZToNCisgIEZYX1RJTUVaT05FIG1fdHo7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfb2JqZWN0LmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZmMzE2NAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9vYmplY3QuaApAQCAtMCwwICsxLDc0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfT0JKRUNUX0hfDQorI2RlZmluZSBfWEZBX09CSkVDVF9IXw0KK2NsYXNzIENYRkFfRG9jdW1lbnQ7DQorY2xhc3MgSVhGQV9PYmpGYWN0b3J5Ow0KK2NsYXNzIElYRkFfTm90aWZ5Ow0KK2NsYXNzIENYRkFfT2JqZWN0Ow0KK2NsYXNzIENYRkFfT3JkaW5hcnlPYmplY3Q7DQorY2xhc3MgQ1hGQV9Ob2RlOw0KK2NsYXNzIENYRkFfTm9kZUxpc3Q7DQorY2xhc3MgQ1hGQV9BcnJheU5vZGVMaXN0Ow0KK2NsYXNzIENYRkFfQXR0YWNoTm9kZUxpc3Q7DQorZW51bSBYRkFfT0JKRUNUVFlQRSB7DQorICBYRkFfT0JKRUNUVFlQRV9PcmRpbmFyeU9iamVjdCA9IDB4MCwNCisgIFhGQV9PQkpFQ1RUWVBFX09yZGluYXJ5TGlzdCA9IDB4MSwNCisgIFhGQV9PQkpFQ1RUWVBFX05vZGVMaXN0ID0gMHgyLA0KKyAgWEZBX09CSkVDVFRZUEVfTm9kZSA9IDB4NCwNCisgIFhGQV9PQkpFQ1RUWVBFX05vZGVDID0gMHg1LA0KKyAgWEZBX09CSkVDVFRZUEVfTm9kZVYgPSAweDYsDQorICBYRkFfT0JKRUNUVFlQRV9Nb2RlbE5vZGUgPSAweDgsDQorICBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZSA9IDB4OSwNCisgIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUgPSAweEEsDQorICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZSA9IDB4QiwNCisgIFhGQV9PQkpFQ1RUWVBFX1ZhcmlhYmxlc1RoaXMgPSAweEMsDQorICBYRkFfT0JKRUNUVFlQRU1BU0sgPSAweEYsDQorICBYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQgPSAweDAwMDIwLA0KKyAgWEZBX05PREVGTEFHX0hhc1JlbW92ZWQgPSAweDAwMjAwLA0KKyAgWEZBX05PREVGTEFHX05lZWRzSW5pdEFwcCA9IDB4MDA0MDAsDQorICBYRkFfTk9ERUZMQUdfQmluZEZvcm1JdGVtcyA9IDB4MDA4MDAsDQorICBYRkFfTk9ERUZMQUdfVXNlckludGVyYWN0aXZlID0gMHgwMTAwMCwNCisgIFhGQV9OT0RFRkxBR19Ta2lwRGF0YUJpbmRpbmcgPSAweDAyMDAwLA0KKyAgWEZBX05PREVGTEFHX093blhNTE5vZGUgPSAweDA0MDAwLA0KKyAgWEZBX05PREVGTEFHX1VudXNlZE5vZGUgPSAweDA4MDAwLA0KKyAgWEZBX05PREVGTEFHX0xheW91dEdlbmVyYXRlZE5vZGUgPSAweDEwMDAwLA0KK307DQorY2xhc3MgQ1hGQV9PYmplY3Qgew0KKyBwdWJsaWM6DQorICBDWEZBX09iamVjdChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsIEZYX0RXT1JEIHVGbGFncyk7DQorICBpbmxpbmUgQ1hGQV9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BEb2N1bWVudDsgfQ0KKyAgaW5saW5lIEZYX0RXT1JEIEdldEZsYWcoKSBjb25zdCB7IHJldHVybiBtX3VGbGFnczsgfQ0KKyAgaW5saW5lIFhGQV9PQkpFQ1RUWVBFIEdldE9iamVjdFR5cGUoKSBjb25zdCB7DQorICAgIHJldHVybiAoWEZBX09CSkVDVFRZUEUpKG1fdUZsYWdzICYgWEZBX09CSkVDVFRZUEVNQVNLKTsNCisgIH0NCisgIGlubGluZSBGWF9CT09MIElzTm9kZSgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChtX3VGbGFncyAmIFhGQV9PQkpFQ1RUWVBFTUFTSykgPj0gWEZBX09CSkVDVFRZUEVfTm9kZTsNCisgIH0NCisgIGlubGluZSBGWF9CT09MIElzT3JkaW5hcnlPYmplY3QoKSBjb25zdCB7DQorICAgIHJldHVybiAobV91RmxhZ3MgJiBYRkFfT0JKRUNUVFlQRU1BU0spID09IFhGQV9PQkpFQ1RUWVBFX09yZGluYXJ5T2JqZWN0Ow0KKyAgfQ0KKyAgaW5saW5lIEZYX0JPT0wgSXNOb2RlTGlzdCgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChtX3VGbGFncyAmIFhGQV9PQkpFQ1RUWVBFTUFTSykgPT0gWEZBX09CSkVDVFRZUEVfTm9kZUxpc3Q7DQorICB9DQorICBpbmxpbmUgRlhfQk9PTCBJc09yZGluYXJ5TGlzdCgpIGNvbnN0IHsNCisgICAgcmV0dXJuIChtX3VGbGFncyAmIFhGQV9PQkpFQ1RUWVBFTUFTSykgPT0gWEZBX09CSkVDVFRZUEVfT3JkaW5hcnlMaXN0Ow0KKyAgfQ0KKyAgRlhfQk9PTCBJc0NvbnRlbnROb2RlKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKG1fdUZsYWdzICYgWEZBX09CSkVDVFRZUEVNQVNLKSA9PSBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZTsNCisgIH0NCisgIEZYX0JPT0wgSXNDb250YWluZXJOb2RlKCkgY29uc3Qgew0KKyAgICByZXR1cm4gKG1fdUZsYWdzICYgWEZBX09CSkVDVFRZUEVNQVNLKSA9PSBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlOw0KKyAgfQ0KKyAgWEZBX0VMRU1FTlQgR2V0Q2xhc3NJRCgpIGNvbnN0Ow0KKyAgdm9pZCBHZXRDbGFzc05hbWUoQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpIGNvbnN0Ow0KKyAgdWludDMyX3QgR2V0Q2xhc3NIYXNoQ29kZSgpIGNvbnN0Ow0KKyAgdm9pZCBTY3JpcHRfT2JqZWN0Q2xhc3NfQ2xhc3NOYW1lKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShpbnQzMl90IGlTdHJpbmdJRCwgLi4uKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ1hGQV9Eb2N1bWVudCogbV9wRG9jdW1lbnQ7DQorICBGWF9EV09SRCBtX3VGbGFnczsNCit9Ow0KKyNkZWZpbmUgWEZBX05PREVGSUxURVJfQ2hpbGRyZW4gMHgwMQ0KKyNkZWZpbmUgWEZBX05PREVGSUxURVJfUHJvcGVydGllcyAweDAyDQorI2RlZmluZSBYRkFfTk9ERUZJTFRFUl9PbmVPZlByb3BlcnR5IDB4MDQNCisjZGVmaW5lIFhGQV9DTE9ORUZMQUdfQ29udGVudCAweDAxDQorZW51bSBYRkFfTk9ERUlURU0gew0KKyAgWEZBX05PREVJVEVNX1BhcmVudCwNCisgIFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkLA0KKyAgWEZBX05PREVJVEVNX05leHRTaWJsaW5nLA0KKyAgWEZBX05PREVJVEVNX1ByZXZTaWJsaW5nLA0KK307DQorZW51bSBYRkFfU09NX01FU1NBR0VUWVBFIHsNCisgIFhGQV9TT01fVmFsaWRhdGlvbk1lc3NhZ2UsDQorICBYRkFfU09NX0Zvcm1hdE1lc3NhZ2UsDQorICBYRkFfU09NX01hbmRhdG9yeU1lc3NhZ2UNCit9Ow0KK3R5cGVkZWYgQ0ZYX1N0YWNrVGVtcGxhdGU8Q1hGQV9Ob2RlKj4gQ1hGQV9Ob2RlU3RhY2s7DQordHlwZWRlZiBDWEZBX1B0clNldFRlbXBsYXRlPENYRkFfTm9kZSo+IENYRkFfTm9kZVNldDsNCit0eXBlZGVmIHZvaWQgKCpQRF9DQUxMQkFDS19EVVBMSUNBVEVEQVRBKSh2b2lkKiYgcERhdGEpOw0KK3R5cGVkZWYgc3RydWN0IF9YRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPIHsNCisgIFBEX0NBTExCQUNLX0ZSRUVEQVRBIHBGcmVlOw0KKyAgUERfQ0FMTEJBQ0tfRFVQTElDQVRFREFUQSBwQ29weTsNCit9IFhGQV9NQVBEQVRBQkxPQ0tDQUxMQkFDS0lORk87DQordHlwZWRlZiBzdHJ1Y3QgX1hGQV9NQVBEQVRBQkxPQ0sgew0KKyAgdWludDhfdCogR2V0RGF0YSgpIGNvbnN0IHsNCisgICAgcmV0dXJuICh1aW50OF90Kil0aGlzICsgc2l6ZW9mKF9YRkFfTUFQREFUQUJMT0NLKTsNCisgIH0NCisgIFhGQV9NQVBEQVRBQkxPQ0tDQUxMQkFDS0lORk8qIHBDYWxsYmFja0luZm87DQorICBpbnQzMl90IGlCeXRlczsNCit9IFhGQV9NQVBEQVRBQkxPQ0ssICpYRkFfTFBNQVBEQVRBQkxPQ0s7DQordHlwZWRlZiBzdHJ1Y3QgX1hGQV9NQVBNT0RVTEVEQVRBIHsNCisgIENGWF9NYXBQdHJUb1B0ciBtX1ZhbHVlTWFwOw0KKyAgQ0ZYX01hcFB0clRlbXBsYXRlPHZvaWQqLCBYRkFfTFBNQVBEQVRBQkxPQ0s+IG1fQnVmZmVyTWFwOw0KK30gWEZBX01BUE1PRFVMRURBVEEsICpYRkFfTFBNQVBNT0RVTEVEQVRBOw0KKyNkZWZpbmUgWEZBX0NhbGNSZWZDb3VudCAodm9pZCopKHVpbnRwdHJfdCkgRlhCU1RSX0lEKCdYJywgJ0YnLCAnQScsICdSJykNCisjZGVmaW5lIFhGQV9DYWxjRGF0YSAodm9pZCopKHVpbnRwdHJfdCkgRlhCU1RSX0lEKCdYJywgJ0YnLCAnQScsICdDJykNCisjZGVmaW5lIFhGQV9MQVlPVVRJVEVNS0VZICh2b2lkKikodWludHB0cl90KSBGWEJTVFJfSUQoJ0wnLCAnWScsICdJJywgJ00nKQ0KK2NsYXNzIENYRkFfTm9kZSA6IHB1YmxpYyBDWEZBX09iamVjdCB7DQorIHB1YmxpYzoNCisgIFhGQV9FTEVNRU5UIEdldENsYXNzSUQoKSBjb25zdCB7IHJldHVybiAoWEZBX0VMRU1FTlQpbV9lTm9kZUNsYXNzOyB9DQorICBGWF9EV09SRCBHZXRQYWNrZXRJRCgpIGNvbnN0IHsgcmV0dXJuIG1fZVBhY2tldDsgfQ0KKyAgRlhfQk9PTCBIYXNGbGFnKEZYX0RXT1JEIGR3RmxhZykgY29uc3Q7DQorICB2b2lkIFNldEZsYWcoRlhfRFdPUkQgZHdGbGFnLCBGWF9CT09MIGJPbiA9IFRSVUUsIEZYX0JPT0wgYk5vdGlmeSA9IFRSVUUpOw0KKyAgRlhfQk9PTCBJc0F0dHJpYnV0ZUluWE1MKCk7DQorICBGWF9CT09MIElzRm9ybUNvbnRhaW5lcigpIHsNCisgICAgcmV0dXJuIG1fZVBhY2tldCA9PSBYRkFfWERQUEFDS0VUX0Zvcm0gJiYgSXNDb250YWluZXJOb2RlKCk7DQorICB9DQorICB2b2lkIFNldFhNTE1hcHBpbmdOb2RlKElGREVfWE1MTm9kZSogcFhNTE5vZGUpIHsgbV9wWE1MTm9kZSA9IHBYTUxOb2RlOyB9DQorICBJRkRFX1hNTE5vZGUqIEdldFhNTE1hcHBpbmdOb2RlKCkgY29uc3QgeyByZXR1cm4gbV9wWE1MTm9kZTsgfQ0KKyAgSUZERV9YTUxOb2RlKiBDcmVhdGVYTUxNYXBwaW5nTm9kZSgpOw0KKyAgRlhfQk9PTCBJc05lZWRTYXZpbmdYTUxOb2RlKCk7DQorICBpbmxpbmUgRlhfRFdPUkQgR2V0TmFtZUhhc2goKSBjb25zdCB7IHJldHVybiBtX2R3TmFtZUhhc2g7IH0NCisgIGlubGluZSBGWF9CT09MIElzVW5uYW1lZCgpIGNvbnN0IHsgcmV0dXJuIG1fZHdOYW1lSGFzaCA9PSAwOyB9DQorICBDWEZBX05vZGUqIEdldE1vZGVsTm9kZSgpOw0KKyAgdm9pZCBVcGRhdGVOYW1lSGFzaCgpOw0KKyAgRlhfQk9PTCBIYXNBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURSBlQXR0ciwgRlhfQk9PTCBiQ2FuSW5oZXJpdCA9IEZBTFNFKTsNCisgIEZYX0JPT0wgU2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEUgZUF0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7DQorICBGWF9CT09MIEdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFIGVBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVc2VEZWZhdWx0ID0gVFJVRSk7DQorICBGWF9CT09MIFNldEF0dHJpYnV0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQXR0ciwNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKTsNCisgIEZYX0JPT0wgR2V0QXR0cmlidXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVc2VEZWZhdWx0ID0gVFJVRSk7DQorICBGWF9CT09MIFJlbW92ZUF0dHJpYnV0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQXR0cik7DQorICBGWF9CT09MIFNldENvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudCwNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NYTUxWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTY3JpcHRNb2RpZnkgPSBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTeW5jRGF0YSA9IFRSVUUpOw0KKyAgRlhfQk9PTCBUcnlDb250ZW50KENGWF9XaWRlU3RyaW5nJiB3c0NvbnRlbnQsDQorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5ID0gRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJvdG8gPSBUUlVFKTsNCisgIENGWF9XaWRlU3RyaW5nIEdldENvbnRlbnQoKTsNCisNCisgIEZYX0JPT0wgVHJ5TmFtZXNwYWNlKENGWF9XaWRlU3RyaW5nJiB3c05hbWVzcGFjZSk7DQorDQorICBGWF9CT09MIFNldEJvb2xlYW4oWEZBX0FUVFJJQlVURSBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSkgew0KKyAgICByZXR1cm4gU2V0VmFsdWUoZUF0dHIsIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sICh2b2lkKikodWludHB0cl90KWJWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgIGJOb3RpZnkpOw0KKyAgfQ0KKyAgRlhfQk9PTCBUcnlCb29sZWFuKFhGQV9BVFRSSUJVVEUgZUF0dHIsDQorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZURlZmF1bHQgPSBUUlVFKTsNCisgIEZYX0JPT0wgR2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFIGVBdHRyKSB7DQorICAgIEZYX0JPT0wgYlZhbHVlOw0KKyAgICByZXR1cm4gVHJ5Qm9vbGVhbihlQXR0ciwgYlZhbHVlLCBUUlVFKSA/IGJWYWx1ZSA6IEZBTFNFOw0KKyAgfQ0KKyAgRlhfQk9PTCBTZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEUgZUF0dHIsDQorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UpIHsNCisgICAgcmV0dXJuIFNldFZhbHVlKGVBdHRyLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCAodm9pZCopKHVpbnRwdHJfdClpVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICBiTm90aWZ5KTsNCisgIH0NCisgIEZYX0JPT0wgVHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFIGVBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVc2VEZWZhdWx0ID0gVFJVRSk7DQorICBpbnQzMl90IEdldEludGVnZXIoWEZBX0FUVFJJQlVURSBlQXR0cikgew0KKyAgICBpbnQzMl90IGlWYWx1ZTsNCisgICAgcmV0dXJuIFRyeUludGVnZXIoZUF0dHIsIGlWYWx1ZSwgVFJVRSkgPyBpVmFsdWUgOiAwOw0KKyAgfQ0KKyAgRlhfQk9PTCBTZXRFbnVtKFhGQV9BVFRSSUJVVEUgZUF0dHIsDQorICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZVZhbHVlLA0KKyAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFKSB7DQorICAgIHJldHVybiBTZXRWYWx1ZShlQXR0ciwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKHZvaWQqKSh1aW50cHRyX3QpZVZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgYk5vdGlmeSk7DQorICB9DQorICBGWF9CT09MIFRyeUVudW0oWEZBX0FUVFJJQlVURSBlQXR0ciwNCisgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSYgZVZhbHVlLA0KKyAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZURlZmF1bHQgPSBUUlVFKTsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIEdldEVudW0oWEZBX0FUVFJJQlVURSBlQXR0cikgew0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlVmFsdWU7DQorICAgIHJldHVybiBUcnlFbnVtKGVBdHRyLCBlVmFsdWUsIFRSVUUpID8gZVZhbHVlIDogWEZBX0FUVFJJQlVURUVOVU1fVW5rbm93bjsNCisgIH0NCisgIEZYX0JPT0wgU2V0Q0RhdGEoWEZBX0FUVFJJQlVURSBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTY3JpcHRNb2RpZnkgPSBGQUxTRSk7DQorICBGWF9CT09MIFNldEF0dHJpYnV0ZVZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NYTUxWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSA9IEZBTFNFKTsNCisgIEZYX0JPT0wgVHJ5Q0RhdGEoWEZBX0FUVFJJQlVURSBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZURlZmF1bHQgPSBUUlVFLA0KKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcm90byA9IFRSVUUpOw0KKyAgRlhfQk9PTCBUcnlDRGF0YShYRkFfQVRUUklCVVRFIGVBdHRyLA0KKyAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZURlZmF1bHQgPSBUUlVFLA0KKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcm90byA9IFRSVUUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmdDIEdldENEYXRhKFhGQV9BVFRSSUJVVEUgZUF0dHIpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVmFsdWU7DQorICAgIHJldHVybiBUcnlDRGF0YShlQXR0ciwgd3NWYWx1ZSkgPyB3c1ZhbHVlIDogQ0ZYX1dpZGVTdHJpbmdDKCk7DQorICB9DQorICBGWF9CT09MIFNldE1lYXN1cmUoWEZBX0FUVFJJQlVURSBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgICBDWEZBX01lYXN1cmVtZW50IG1WYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBGQUxTRSk7DQorICBGWF9CT09MIFRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURSBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgICBDWEZBX01lYXN1cmVtZW50JiBtVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXNlRGVmYXVsdCA9IFRSVUUpOw0KKyAgQ1hGQV9NZWFzdXJlbWVudCBHZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEUgZUF0dHIpIHsNCisgICAgQ1hGQV9NZWFzdXJlbWVudCBtVmFsdWU7DQorICAgIHJldHVybiBUcnlNZWFzdXJlKGVBdHRyLCBtVmFsdWUsIFRSVUUpID8gbVZhbHVlIDogQ1hGQV9NZWFzdXJlbWVudCgpOw0KKyAgfQ0KKyAgRlhfQk9PTCBTZXRPYmplY3QoWEZBX0FUVFJJQlVURSBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTyogcENhbGxiYWNrSW5mbyA9IE5VTEwpOw0KKyAgRlhfQk9PTCBUcnlPYmplY3QoWEZBX0FUVFJJQlVURSBlQXR0ciwgdm9pZComIHBEYXRhKTsNCisgIHZvaWQqIEdldE9iamVjdChYRkFfQVRUUklCVVRFIGVBdHRyKSB7DQorICAgIHZvaWQqIHBEYXRhOw0KKyAgICByZXR1cm4gVHJ5T2JqZWN0KGVBdHRyLCBwRGF0YSkgPyBwRGF0YSA6IE5VTEw7DQorICB9DQorICBGWF9CT09MIFNldFVzZXJEYXRhKHZvaWQqIHBLZXksDQorICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICBYRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPKiBwQ2FsbGJhY2tJbmZvID0gTlVMTCk7DQorICBGWF9CT09MIFRyeVVzZXJEYXRhKHZvaWQqIHBLZXksIHZvaWQqJiBwRGF0YSwgRlhfQk9PTCBiUHJvdG9BbHNvID0gRkFMU0UpOw0KKyAgdm9pZCogR2V0VXNlckRhdGEodm9pZCogcEtleSwgRlhfQk9PTCBiUHJvdG9BbHNvID0gRkFMU0UpIHsNCisgICAgdm9pZCogcERhdGE7DQorICAgIHJldHVybiBUcnlVc2VyRGF0YShwS2V5LCBwRGF0YSwgYlByb3RvQWxzbykgPyBwRGF0YSA6IE5VTEw7DQorICB9DQorICBDWEZBX05vZGUqIEdldFByb3BlcnR5KGludDMyX3QgaW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVQcm9wZXJ0eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ3JlYXRlUHJvcGVydHkgPSBUUlVFKTsNCisgIGludDMyX3QgQ291bnRDaGlsZHJlbihYRkFfRUxFTUVOVCBlRWxlbWVudCwgRlhfQk9PTCBiT25seUNoaWxkID0gRkFMU0UpOw0KKyAgQ1hGQV9Ob2RlKiBHZXRDaGlsZChpbnQzMl90IGluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiT25seUNoaWxkID0gRkFMU0UpOw0KKyAgaW50MzJfdCBJbnNlcnRDaGlsZChpbnQzMl90IGluZGV4LCBDWEZBX05vZGUqIHBOb2RlKTsNCisgIEZYX0JPT0wgSW5zZXJ0Q2hpbGQoQ1hGQV9Ob2RlKiBwTm9kZSwgQ1hGQV9Ob2RlKiBwQmVmb3JlTm9kZSA9IE5VTEwpOw0KKyAgRlhfQk9PTCBSZW1vdmVDaGlsZChDWEZBX05vZGUqIHBOb2RlLCBGWF9CT09MIGJOb3RpZnkgPSBUUlVFKTsNCisgIENYRkFfTm9kZSogQ2xvbmUoRlhfQk9PTCBiUmVjdXJzaXZlKTsNCisgIENYRkFfTm9kZSogR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNIGVJdGVtKSBjb25zdDsNCisgIENYRkFfTm9kZSogR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNIGVJdGVtLCBYRkFfT0JKRUNUVFlQRSBlVHlwZSkgY29uc3Q7DQorICBpbnQzMl90IEdldE5vZGVMaXN0KENYRkFfTm9kZUFycmF5JiBub2RlcywNCisgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdUeXBlRmlsdGVyID0gWEZBX05PREVGSUxURVJfQ2hpbGRyZW4gfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTk9ERUZJTFRFUl9Qcm9wZXJ0aWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVCBlRWxlbWVudEZpbHRlciA9IFhGQV9FTEVNRU5UX1VOS05PV04sDQorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxldmVsID0gMSk7DQorICBDWEZBX05vZGUqIENyZWF0ZVNhbWVQYWNrZXROb2RlKFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzID0gWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCisgIENYRkFfTm9kZSogQ2xvbmVUZW1wbGF0ZVRvRm9ybShGWF9CT09MIGJSZWN1cnNpdmUpOw0KKyAgQ1hGQV9Ob2RlKiBHZXRUZW1wbGF0ZU5vZGUoKTsNCisgIHZvaWQgU2V0VGVtcGxhdGVOb2RlKENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSk7DQorICBDWEZBX05vZGUqIEdldERhdGFEZXNjcmlwdGlvbk5vZGUoKTsNCisgIHZvaWQgU2V0RGF0YURlc2NyaXB0aW9uTm9kZShDWEZBX05vZGUqIHBEYXRhRGVzY3JpcHRpb25Ob2RlKTsNCisgIENYRkFfTm9kZSogR2V0QmluZERhdGEoKTsNCisgIGludDMyX3QgR2V0QmluZEl0ZW1zKENYRkFfTm9kZUFycmF5JiBmb3JtSXRlbXMpOw0KKyAgaW50MzJfdCBBZGRCaW5kSXRlbShDWEZBX05vZGUqIHBGb3JtTm9kZSk7DQorICBpbnQzMl90IFJlbW92ZUJpbmRJdGVtKENYRkFfTm9kZSogcEZvcm1Ob2RlKTsNCisgIEZYX0JPT0wgSGFzQmluZEl0ZW0oKTsNCisgIENYRkFfV2lkZ2V0RGF0YSogR2V0V2lkZ2V0RGF0YSgpOw0KKyAgQ1hGQV9XaWRnZXREYXRhKiBHZXRDb250YWluZXJXaWRnZXREYXRhKCk7DQorICBGWF9CT09MIEdldExvY2FsZU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzTG9jYWxlTmFtZSk7DQorICBYRkFfQVRUUklCVVRFRU5VTSBHZXRJbnRhY3QoKTsNCisgIENYRkFfTm9kZSogR2V0Rmlyc3RDaGlsZEJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTm9kZU5hbWUpIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBHZXRGaXJzdENoaWxkQnlOYW1lKEZYX0RXT1JEIGR3Tm9kZU5hbWVIYXNoKSBjb25zdDsNCisgIENYRkFfTm9kZSogR2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlQgZU5vZGVDbGFzcykgY29uc3Q7DQorICBDWEZBX05vZGUqIEdldE5leHRTYW1lTmFtZVNpYmxpbmcoRlhfRFdPUkQgZHdOb2RlTmFtZUhhc2gpIGNvbnN0Ow0KKyAgQ1hGQV9Ob2RlKiBHZXROZXh0U2FtZU5hbWVTaWJsaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOb2RlTmFtZSkgY29uc3Q7DQorICBDWEZBX05vZGUqIEdldE5leHRTYW1lQ2xhc3NTaWJsaW5nKFhGQV9FTEVNRU5UIGVOb2RlQ2xhc3MpIGNvbnN0Ow0KKyAgaW50MzJfdCBHZXROb2RlU2FtZU5hbWVJbmRleCgpIGNvbnN0Ow0KKyAgaW50MzJfdCBHZXROb2RlU2FtZUNsYXNzSW5kZXgoKSBjb25zdDsNCisgIHZvaWQgR2V0U09NRXhwcmVzc2lvbihDRlhfV2lkZVN0cmluZyYgd3NTT01FeHByZXNzaW9uKTsNCisgIENYRkFfTm9kZSogR2V0SW5zdGFuY2VNZ3JPZlN1YmZvcm0oKTsNCisNCisgIENYRkFfTm9kZSogR2V0T2NjdXJOb2RlKCk7DQorICB2b2lkIFNjcmlwdF9UcmVlQ2xhc3NfUmVzb2x2ZU5vZGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9UcmVlQ2xhc3NfUmVzb2x2ZU5vZGVzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfU29tX1Jlc29sdmVOb2RlTGlzdChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiByZWZOb2RlID0gTlVMTCk7DQorICB2b2lkIFNjcmlwdF9UcmVlQ2xhc3NfQWxsKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9UcmVlQ2xhc3NfTm9kZXMoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9UcmVlQ2xhc3NfQ2xhc3NBbGwoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9UcmVlQ2xhc3NfUGFyZW50KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9UcmVlQ2xhc3NfSW5kZXgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9UcmVlQ2xhc3NfQ2xhc3NJbmRleChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9UcmVlQ2xhc3NfU29tRXhwcmVzc2lvbihGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfQXBwbHlYU0woQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfQXNzaWduTm9kZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X05vZGVDbGFzc19DbG9uZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X05vZGVDbGFzc19HZXRBdHRyaWJ1dGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfR2V0RWxlbWVudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X05vZGVDbGFzc19Jc1Byb3BlcnR5U3BlY2lmaWVkKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTm9kZUNsYXNzX0xvYWRYTUwoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfU2F2ZUZpbHRlcmVkWE1MKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTm9kZUNsYXNzX1NhdmVYTUwoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfU2V0QXR0cmlidXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTm9kZUNsYXNzX1NldEVsZW1lbnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfTnMoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfTW9kZWwoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfSXNDb250YWluZXIoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfSXNOdWxsKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfT25lT2ZDaGlsZChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9Db250YWluZXJDbGFzc19HZXREZWx0YShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0NvbnRhaW5lckNsYXNzX0dldERlbHRhcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X01vZGVsQ2xhc3NfQ2xlYXJFcnJvckxpc3QoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Nb2RlbENsYXNzX0NyZWF0ZU5vZGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Nb2RlbENsYXNzX0lzQ29tcGF0aWJsZU5TKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTW9kZWxDbGFzc19Db250ZXh0KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfTW9kZWxDbGFzc19BbGlhc05vZGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfV3NkbENvbm5lY3Rpb25fRXhlY3V0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0RlbHRhX1Jlc3RvcmUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9EZWx0YV9DdXJyZW50VmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9EZWx0YV9TYXZlZFZhbHVlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9EZWx0YV9UYXJnZXQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9BdHRyaWJ1dGVfU2VuZEF0dHJpYnV0ZUNoYW5nZU1lc3NhZ2Uodm9pZCogZUF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBlVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5KTsNCisgIHZvaWQgU2NyaXB0X0F0dHJpYnV0ZV9JbnRlZ2VyKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X0F0dHJpYnV0ZV9JbnRlZ2VyUmVhZChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X0F0dHJpYnV0ZV9CT09MKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X0F0dHJpYnV0ZV9CT09MUmVhZChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmdSZWFkKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X1NvbV9WYWxpZGF0aW9uTWVzc2FnZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X0ZpZWxkX0xlbmd0aChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X1NvbV9EZWZhdWx0VmFsdWVfUmVhZChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X0Jvb2xlYW5fVmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X1NvbV9NZXNzYWdlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1NPTV9NRVNTQUdFVFlQRSBpTWVzc2FnZVR5cGUpOw0KKyAgdm9pZCBTY3JpcHRfU29tX0JvcmRlckNvbG9yKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfU29tX0JvcmRlcldpZHRoKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfU29tX0ZpbGxDb2xvcihGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfU29tX0RhdGFOb2RlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfU29tX0ZvbnRDb2xvcihGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfU29tX01hbmRhdG9yeShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfU29tX01hbmRhdG9yeU1lc3NhZ2UoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfU29tX0luc3RhbmNlSW5kZXgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRHJhd19EZWZhdWx0VmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfRGVmYXVsdFZhbHVlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfRWRpdFZhbHVlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfRm9ybWF0TWVzc2FnZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfRm9ybWF0dGVkVmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfUGFyZW50U3ViZm9ybShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfU2VsZWN0ZWRJbmRleChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfQ2xlYXJJdGVtcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0ZpZWxkX0V4ZWNFdmVudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0ZpZWxkX0V4ZWNJbml0aWFsaXplKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfRGVsZXRlSXRlbShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0ZpZWxkX0dldFNhdmVJdGVtKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfQm91bmRJdGVtKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfR2V0SXRlbVN0YXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfRXhlY0NhbGN1bGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0ZpZWxkX1NldEl0ZW1zKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfR2V0RGlzcGxheUl0ZW0oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9GaWVsZF9TZXRJdGVtU3RhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9GaWVsZF9BZGRJdGVtKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRmllbGRfRXhlY1ZhbGlkYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRXhjbEdyb3VwX0RlZmF1bHRBbmRSYXdWYWx1ZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXhjbEdyb3VwX0Vycm9yVGV4dChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXhjbEdyb3VwX1RyYW5zaWVudChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXhjbEdyb3VwX0V4ZWNFdmVudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0V4Y2xHcm91cF9TZWxlY3RlZE1lbWJlcihDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0V4Y2xHcm91cF9FeGVjSW5pdGlhbGl6ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0V4Y2xHcm91cF9FeGVjQ2FsY3VsYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRXhjbEdyb3VwX0V4ZWNWYWxpZGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X1N1YmZvcm1fSW5zdGFuY2VNYW5hZ2VyKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X1N1YmZvcm1fTG9jYWxlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X1N1YmZvcm1fRXhlY0V2ZW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfU3ViZm9ybV9FeGVjSW5pdGlhbGl6ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X1N1YmZvcm1fRXhlY0NhbGN1bGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X1N1YmZvcm1fRXhlY1ZhbGlkYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfU3ViZm9ybV9HZXRJbnZhbGlkT2JqZWN0cyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisNCisgIGludDMyX3QgU3ViZm9ybV9hbmRfU3ViZm9ybVNldF9JbnN0YW5jZUluZGV4KCk7DQorICB2b2lkIFNjcmlwdF9UZW1wbGF0ZV9Gb3JtTm9kZXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9UZW1wbGF0ZV9SZW1lcmdlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfVGVtcGxhdGVfRXhlY0luaXRpYWxpemUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9UZW1wbGF0ZV9DcmVhdGVOb2RlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfVGVtcGxhdGVfUmVjYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9UZW1wbGF0ZV9FeGVjQ2FsY3VsYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfVGVtcGxhdGVfRXhlY1ZhbGlkYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTWFuaWZlc3RfRXZhbHVhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfQ291bnQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfTWF4KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfTWluKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfTW92ZUluc3RhbmNlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX1JlbW92ZUluc3RhbmNlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX1NldEluc3RhbmNlcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0luc3RhbmNlTWFuYWdlcl9BZGRJbnN0YW5jZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0luc3RhbmNlTWFuYWdlcl9JbnNlcnRJbnN0YW5jZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIGludDMyX3QgSW5zdGFuY2VNYW5hZ2VyX1NldEluc3RhbmNlcyhpbnQzMl90IGlDb3VudCk7DQorICBpbnQzMl90IEluc3RhbmNlTWFuYWdlcl9Nb3ZlSW5zdGFuY2UoaW50MzJfdCBpVG8sIGludDMyX3QgaUZyb20pOw0KKyAgdm9pZCBTY3JpcHRfT2NjdXJfTWF4KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfT2NjdXJfTWluKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRGVzY19NZXRhZGF0YShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0Zvcm1fRm9ybU5vZGVzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRm9ybV9SZW1lcmdlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRm9ybV9FeGVjSW5pdGlhbGl6ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0Zvcm1fUmVjYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Gb3JtX0V4ZWNDYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Gb3JtX0V4ZWNWYWxpZGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0Zvcm1fQ2hlY2tzdW0oRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X1BhY2tldF9HZXRBdHRyaWJ1dGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9QYWNrZXRfU2V0QXR0cmlidXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfUGFja2V0X1JlbW92ZUF0dHJpYnV0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X1BhY2tldF9Db250ZW50KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsNCisgIHZvaWQgU2NyaXB0X1NvdXJjZV9OZXh0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfU291cmNlX0NhbmNlbEJhdGNoKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfU291cmNlX0ZpcnN0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfU291cmNlX1VwZGF0ZUJhdGNoKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfU291cmNlX1ByZXZpb3VzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfU291cmNlX0lzQk9GKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfU291cmNlX0lzRU9GKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfU291cmNlX0NhbmNlbChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X1NvdXJjZV9VcGRhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Tb3VyY2VfT3BlbihDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X1NvdXJjZV9EZWxldGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Tb3VyY2VfQWRkTmV3KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfU291cmNlX1JlcXVlcnkoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Tb3VyY2VfUmVzeW5jKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfU291cmNlX0Nsb3NlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfU291cmNlX0xhc3QoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Tb3VyY2VfSGFzRGF0YUNoYW5nZWQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Tb3VyY2VfRGIoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9YZmFfVGhpcyhGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9IYW5kbGVyX1ZlcnNpb24oRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9TdWJtaXRGb3JtYXRfTW9kZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9FeHRyYXNfVHlwZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9FbmNyeXB0X0Zvcm1hdChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9TY3JpcHRfU3RhdGVsZXNzKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorDQorIHByb3RlY3RlZDoNCisgIENYRkFfTm9kZShDWEZBX0RvY3VtZW50KiBwRG9jLCBGWF9XT1JEIGVQYWNrZXQsIFhGQV9FTEVNRU5UIGVFbGVtZW50KTsNCisgIH5DWEZBX05vZGUoKTsNCisgIGZyaWVuZCBjbGFzcyBDWEZBX0RvY3VtZW50Ow0KKyAgQ1hGQV9Ob2RlKiBEZXByZWNhdGVkX0dldFByZXZTaWJsaW5nKCk7DQorICBGWF9CT09MIFNldFZhbHVlKFhGQV9BVFRSSUJVVEUgZUF0dHIsDQorICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVUWVBFIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICB2b2lkKiBwVmFsdWUsDQorICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSk7DQorICBGWF9CT09MIEdldFZhbHVlKFhGQV9BVFRSSUJVVEUgZUF0dHIsDQorICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVUWVBFIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVc2VEZWZhdWx0LA0KKyAgICAgICAgICAgICAgICAgICB2b2lkKiYgcFZhbHVlKTsNCisgIHZvaWQgT25SZW1vdmVkKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwUmVtb3ZlZCwgRlhfQk9PTCBiTm90aWZ5KTsNCisgIHZvaWQgT25DaGFuZ2luZyhYRkFfQVRUUklCVVRFIGVBdHRyLCB2b2lkKiBwTmV3VmFsdWUsIEZYX0JPT0wgYk5vdGlmeSk7DQorICB2b2lkIE9uQ2hhbmdlZChYRkFfQVRUUklCVVRFIGVBdHRyLA0KKyAgICAgICAgICAgICAgICAgdm9pZCogcE5ld1ZhbHVlLA0KKyAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5LA0KKyAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5ID0gRkFMU0UpOw0KKyAgaW50MzJfdCBleGVjU2luZ2xlRXZlbnRCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0V2ZW50TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVFbGVtZW50VHlwZSk7DQorICBGWF9CT09MIFNldFNjcmlwdENvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NYTUxWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkgPSBUUlVFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN5bmNEYXRhID0gVFJVRSk7DQorICBDRlhfV2lkZVN0cmluZyBHZXRTY3JpcHRDb250ZW50KEZYX0JPT0wgYlNjcmlwdE1vZGlmeSA9IEZBTFNFKTsNCisgIFhGQV9MUE1BUE1PRFVMRURBVEEgR2V0TWFwTW9kdWxlRGF0YShGWF9CT09MIGJDcmVhdGVOZXcpOw0KKyAgdm9pZCBTZXRNYXBNb2R1bGVWYWx1ZSh2b2lkKiBwS2V5LCB2b2lkKiBwVmFsdWUpOw0KKyAgRlhfQk9PTCBHZXRNYXBNb2R1bGVWYWx1ZSh2b2lkKiBwS2V5LCB2b2lkKiYgcFZhbHVlKTsNCisgIHZvaWQgU2V0TWFwTW9kdWxlU3RyaW5nKHZvaWQqIHBLZXksIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSk7DQorICBGWF9CT09MIEdldE1hcE1vZHVsZVN0cmluZyh2b2lkKiBwS2V5LCBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUpOw0KKyAgdm9pZCBTZXRNYXBNb2R1bGVCdWZmZXIodm9pZCogcEtleSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJ5dGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTyogcENhbGxiYWNrSW5mbyA9IE5VTEwpOw0KKyAgRlhfQk9PTCBHZXRNYXBNb2R1bGVCdWZmZXIodm9pZCogcEtleSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBwVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpQnl0ZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcm90b0Fsc28gPSBUUlVFKTsNCisgIEZYX0JPT0wgSGFzTWFwTW9kdWxlS2V5KHZvaWQqIHBLZXksIEZYX0JPT0wgYlByb3RvQWxzbyA9IEZBTFNFKTsNCisgIHZvaWQgUmVtb3ZlTWFwTW9kdWxlS2V5KHZvaWQqIHBLZXkgPSBOVUxMKTsNCisgIHZvaWQgTWVyZ2VBbGxEYXRhKHZvaWQqIHBEc3RNb2R1bGUsIEZYX0JPT0wgYlVzZVNyY0F0dHIgPSBUUlVFKTsNCisgIHZvaWQgTW92ZUJ1ZmZlck1hcERhdGEoQ1hGQV9Ob2RlKiBwRHN0TW9kdWxlLCB2b2lkKiBwS2V5KTsNCisgIHZvaWQgTW92ZUJ1ZmZlck1hcERhdGEoQ1hGQV9Ob2RlKiBwU3JjTW9kdWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEc3RNb2R1bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBLZXksDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlY3Vyc2l2ZSA9IEZBTFNFKTsNCisNCisgIENYRkFfTm9kZSogbV9wTmV4dDsNCisgIENYRkFfTm9kZSogbV9wQ2hpbGQ7DQorICBDWEZBX05vZGUqIG1fcExhc3RDaGlsZDsNCisgIENYRkFfTm9kZSogbV9wUGFyZW50Ow0KKyAgSUZERV9YTUxOb2RlKiBtX3BYTUxOb2RlOw0KKyAgWEZBX0VMRU1FTlQgbV9lTm9kZUNsYXNzOw0KKyAgRlhfV09SRCBtX2VQYWNrZXQ7DQorICBGWF9EV09SRCBtX2R3TmFtZUhhc2g7DQorICBDWEZBX05vZGUqIG1fcEF1eE5vZGU7DQorICBYRkFfTFBNQVBNT0RVTEVEQVRBIG1fcE1hcE1vZHVsZURhdGE7DQorfTsNCitjbGFzcyBDWEZBX09yZGluYXJ5T2JqZWN0IDogcHVibGljIENYRkFfT2JqZWN0IHsNCisgcHVibGljOg0KKyAgQ1hGQV9PcmRpbmFyeU9iamVjdChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsIFhGQV9FTEVNRU5UIGVFbGVtZW50KQ0KKyAgICAgIDogQ1hGQV9PYmplY3QocERvY3VtZW50LCBYRkFfT0JKRUNUVFlQRV9PcmRpbmFyeU9iamVjdCksDQorICAgICAgICBtX3VTY3JpcHRIYXNoKDApIHsNCisgICAgbV9lTm9kZUNsYXNzID0gZUVsZW1lbnQ7DQorICB9DQorICBYRkFfRUxFTUVOVCBHZXRDbGFzc0lEKCkgY29uc3QgeyByZXR1cm4gKFhGQV9FTEVNRU5UKW1fZU5vZGVDbGFzczsgfQ0KKyAgdWludDMyX3QgR2V0U2NyaXB0T2JqSGFzaCgpIHsgcmV0dXJuIG1fdVNjcmlwdEhhc2g7IH0NCisNCisgcHJvdGVjdGVkOg0KKyAgWEZBX0VMRU1FTlQgbV9lTm9kZUNsYXNzOw0KKyAgdWludDMyX3QgbV91U2NyaXB0SGFzaDsNCit9Ow0KK2NsYXNzIENYRkFfVGhpc1Byb3h5IDogcHVibGljIENYRkFfT2JqZWN0IHsNCisgcHVibGljOg0KKyAgQ1hGQV9UaGlzUHJveHkoQ1hGQV9Ob2RlKiBwVGhpc05vZGUsIENYRkFfTm9kZSogcFNjcmlwdE5vZGUpDQorICAgICAgOiBDWEZBX09iamVjdChwVGhpc05vZGUtPkdldERvY3VtZW50KCksIFhGQV9PQkpFQ1RUWVBFX1ZhcmlhYmxlc1RoaXMpLA0KKyAgICAgICAgbV9wVGhpc05vZGUoTlVMTCksDQorICAgICAgICBtX3BTY3JpcHROb2RlKE5VTEwpIHsNCisgICAgbV9wVGhpc05vZGUgPSBwVGhpc05vZGU7DQorICAgIG1fcFNjcmlwdE5vZGUgPSBwU2NyaXB0Tm9kZTsNCisgIH0NCisgIHZpcnR1YWwgfkNYRkFfVGhpc1Byb3h5KCkge30NCisgIENYRkFfTm9kZSogR2V0VGhpc05vZGUoKSB7IHJldHVybiBtX3BUaGlzTm9kZTsgfQ0KKyAgQ1hGQV9Ob2RlKiBHZXRTY3JpcHROb2RlKCkgeyByZXR1cm4gbV9wU2NyaXB0Tm9kZTsgfQ0KKw0KKyBwcml2YXRlOg0KKyAgQ1hGQV9Ob2RlKiBtX3BUaGlzTm9kZTsNCisgIENYRkFfTm9kZSogbV9wU2NyaXB0Tm9kZTsNCit9Ow0KK2NsYXNzIENYRkFfTm9kZUxpc3QgOiBwdWJsaWMgQ1hGQV9PYmplY3Qgew0KKyBwdWJsaWM6DQorICBDWEZBX05vZGVMaXN0KENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCk7DQorICB2aXJ0dWFsIH5DWEZBX05vZGVMaXN0KCkge30NCisgIFhGQV9FTEVNRU5UIEdldENsYXNzSUQoKSBjb25zdCB7IHJldHVybiBYRkFfRUxFTUVOVF9Ob2RlTGlzdDsgfQ0KKyAgQ1hGQV9Ob2RlKiBOYW1lZEl0ZW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldExlbmd0aCgpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBBcHBlbmQoQ1hGQV9Ob2RlKiBwTm9kZSkgPSAwOw0KKyAgdmlydHVhbCBGWF9CT09MIEluc2VydChDWEZBX05vZGUqIHBOZXdOb2RlLCBDWEZBX05vZGUqIHBCZWZvcmVOb2RlKSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgUmVtb3ZlKENYRkFfTm9kZSogcE5vZGUpID0gMDsNCisgIHZpcnR1YWwgQ1hGQV9Ob2RlKiBJdGVtKGludDMyX3QgaUluZGV4KSA9IDA7DQorDQorICB2b2lkIFNjcmlwdF9MaXN0Q2xhc3NfQXBwZW5kKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTGlzdENsYXNzX0luc2VydChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0xpc3RDbGFzc19SZW1vdmUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9MaXN0Q2xhc3NfSXRlbShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisNCisgIHZvaWQgU2NyaXB0X1RyZWVsaXN0Q2xhc3NfTmFtZWRJdGVtKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTGlzdENsYXNzX0xlbmd0aChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KK307DQorY2xhc3MgQ1hGQV9BcnJheU5vZGVMaXN0IDogcHVibGljIENYRkFfTm9kZUxpc3Qgew0KKyBwdWJsaWM6DQorICBDWEZBX0FycmF5Tm9kZUxpc3QoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsNCisgIHZvaWQgU2V0QXJyYXlOb2RlTGlzdChjb25zdCBDWEZBX05vZGVBcnJheSYgc3JjQXJyYXkpOw0KKyAgdmlydHVhbCBpbnQzMl90IEdldExlbmd0aCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIEFwcGVuZChDWEZBX05vZGUqIHBOb2RlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJbnNlcnQoQ1hGQV9Ob2RlKiBwTmV3Tm9kZSwgQ1hGQV9Ob2RlKiBwQmVmb3JlTm9kZSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUmVtb3ZlKENYRkFfTm9kZSogcE5vZGUpOw0KKyAgdmlydHVhbCBDWEZBX05vZGUqIEl0ZW0oaW50MzJfdCBpSW5kZXgpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDWEZBX05vZGVBcnJheSBtX2FycmF5Ow0KK307DQorY2xhc3MgQ1hGQV9BdHRhY2hOb2RlTGlzdCA6IHB1YmxpYyBDWEZBX05vZGVMaXN0IHsNCisgcHVibGljOg0KKyAgQ1hGQV9BdHRhY2hOb2RlTGlzdChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsIENYRkFfTm9kZSogcEF0dGFjaE5vZGUpOw0KKw0KKyAgdmlydHVhbCBpbnQzMl90IEdldExlbmd0aCgpOw0KKyAgdmlydHVhbCBGWF9CT09MIEFwcGVuZChDWEZBX05vZGUqIHBOb2RlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJbnNlcnQoQ1hGQV9Ob2RlKiBwTmV3Tm9kZSwgQ1hGQV9Ob2RlKiBwQmVmb3JlTm9kZSk7DQorICB2aXJ0dWFsIEZYX0JPT0wgUmVtb3ZlKENYRkFfTm9kZSogcE5vZGUpOw0KKyAgdmlydHVhbCBDWEZBX05vZGUqIEl0ZW0oaW50MzJfdCBpSW5kZXgpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDWEZBX05vZGUqIG1fcEF0dGFjaE5vZGU7DQorfTsNCitjbGFzcyBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBQ29udGFpbmVyTm9kZSB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBDWEZBX05vZGUqIEdldEZpcnN0Q2hpbGQoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVXNlckRhdGEgPSBOVUxMKSB7DQorICAgIHJldHVybiBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpOw0KKyAgfQ0KKyAgc3RhdGljIENYRkFfTm9kZSogR2V0TmV4dFNpYmxpbmcoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFVzZXJEYXRhID0gTlVMTCkgew0KKyAgICByZXR1cm4gcFRlbXBsYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQorICB9DQorICBzdGF0aWMgQ1hGQV9Ob2RlKiBHZXRQYXJlbnQoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBVc2VyRGF0YSA9IE5VTEwpIHsNCisgICAgcmV0dXJuIHBUZW1wbGF0ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKTsNCisgIH0NCit9Ow0KK3R5cGVkZWYgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFDb250YWluZXJOb2RlPg0KKyAgICBDWEZBX0NvbnRhaW5lckl0ZXJhdG9yOw0KK2NsYXNzIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFOb2RlIHsNCisgcHVibGljOg0KKyAgc3RhdGljIGlubGluZSBDWEZBX05vZGUqIEdldEZpcnN0Q2hpbGQoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlKSB7DQorICAgIHJldHVybiBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICB9DQorICBzdGF0aWMgaW5saW5lIENYRkFfTm9kZSogR2V0TmV4dFNpYmxpbmcoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlKSB7DQorICAgIHJldHVybiBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgfQ0KKyAgc3RhdGljIGlubGluZSBDWEZBX05vZGUqIEdldFBhcmVudChDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUpIHsNCisgICAgcmV0dXJuIHBUZW1wbGF0ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgfQ0KK307DQordHlwZWRlZiBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQU5vZGU+DQorICAgIENYRkFfTm9kZUl0ZXJhdG9yOw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9wYXJzZXIuaCBiL3hmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9wYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDdkZmM4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3BhcnNlci5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfWEZBX1BBUlNFUl9IDQorI2RlZmluZSBfWEZBX1BBUlNFUl9IDQorY2xhc3MgSUZYX1N0cmVhbTsNCitjbGFzcyBJWEZBX1BhcnNlciB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBJWEZBX1BhcnNlciogQ3JlYXRlKElYRkFfT2JqRmFjdG9yeSogcEZhY3RvcnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEb2N1bWVudFBhcnNlciA9IEZBTFNFKTsNCisgIHZpcnR1YWwgfklYRkFfUGFyc2VyKCkge30NCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IFN0YXJ0UGFyc2UoSUZYX0ZpbGVSZWFkKiBwU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQgPSBYRkFfWERQUEFDS0VUX1hEUCkgPSAwOw0KKyAgdmlydHVhbCBpbnQzMl90IERvUGFyc2UoSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgUGFyc2VYTUxEYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1hNTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxOb2RlKiYgcFhNTE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIENvbnN0cnVjdFhGQU5vZGUoQ1hGQV9Ob2RlKiBwWEZBTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUpID0gMDsNCisgIHZpcnR1YWwgSVhGQV9PYmpGYWN0b3J5KiBHZXRGYWN0b3J5KCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBDWEZBX05vZGUqIEdldFJvb3ROb2RlKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBJRkRFX1hNTERvYyogR2V0WE1MRG9jKCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCB2b2lkIENsb3NlUGFyc2VyKCkgPSAwOw0KK307DQorY2xhc3MgSVhGQV9Eb2NQYXJzZXIgOiBwdWJsaWMgSVhGQV9QYXJzZXIgew0KKyBwdWJsaWM6DQorICBzdGF0aWMgSVhGQV9Eb2NQYXJzZXIqIENyZWF0ZShJWEZBX05vdGlmeSogcE5vdGlmeSk7DQorICB2aXJ0dWFsIENYRkFfRG9jdW1lbnQqIEdldERvY3VtZW50KCkgY29uc3QgPSAwOw0KKyAgdmlydHVhbCBJWEZBX05vdGlmeSogR2V0Tm90aWZ5KCkgY29uc3QgPSAwOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3NjcmlwdC5oIGIveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3NjcmlwdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZGRjOGIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfc2NyaXB0LmgKQEAgLTAsMCArMSwxMTAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhGQV9TQ1JJUFRfSA0KKyNkZWZpbmUgX0ZYRkFfU0NSSVBUX0gNCisjZGVmaW5lIFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiAweDAwMDENCisjZGVmaW5lIFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzIDB4MDAwNA0KKyNkZWZpbmUgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMgMHgwMDA4DQorI2RlZmluZSBYRkFfUkVTT0xWRU5PREVfU2libGluZ3MgMHgwMDIwDQorI2RlZmluZSBYRkFfUkVTT0xWRU5PREVfUGFyZW50IDB4MDA0MA0KKyNkZWZpbmUgWEZBX1JFU09MVkVOT0RFX0FueUNoaWxkIDB4MDA4MA0KKyNkZWZpbmUgWEZBX1JFU09MVkVOT0RFX0FMTCAweDAxMDANCisjZGVmaW5lIFhGQV9SRVNPTFZFTk9ERV9DcmVhdGVOb2RlIDB4MDQwMA0KKyNkZWZpbmUgWEZBX1JFU09MVkVOT0RFX0JpbmQgMHgwODAwDQorI2RlZmluZSBYRkFfUkVTT0xWRU5PREVfQmluZE5ldyAweDEwMDANCitlbnVtIFhGQV9TQ1JJUFRMQU5HVFlQRSB7DQorICBYRkFfU0NSSVBUTEFOR1RZUEVfRm9ybWNhbGMgPSBYRkFfU0NSSVBUVFlQRV9Gb3JtY2FsYywNCisgIFhGQV9TQ1JJUFRMQU5HVFlQRV9KYXZhc2NyaXB0ID0gWEZBX1NDUklQVFRZUEVfSmF2YXNjcmlwdCwNCisgIFhGQV9TQ1JJUFRMQU5HVFlQRV9Vbmtvd24gPSBYRkFfU0NSSVBUVFlQRV9Vbmtvd24sDQorfTsNCitlbnVtIFhGQV9SRVNPVkVOT0RFX1JTVFlQRSB7DQorICBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfTm9kZXMsDQorICBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfQXR0cmlidXRlLA0KKyAgWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlT25lLA0KKyAgWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlQWxsLA0KKyAgWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlTWlkQWxsLA0KKyAgWEZBX1JFU09WRU5PREVfUlNUWVBFX0V4aXN0Tm9kZXMsDQorfTsNCitjbGFzcyBDWEZBX0hWQUxVRUFycmF5IDogcHVibGljIENGWF9BcnJheVRlbXBsYXRlPEZYSlNFX0hWQUxVRT4gew0KKyBwdWJsaWM6DQorICBDWEZBX0hWQUxVRUFycmF5KEZYSlNFX0hSVU5USU1FIGhSdW5UaW1lKSA6IG1faFJ1blRpbWUoaFJ1blRpbWUpe307DQorICB+Q1hGQV9IVkFMVUVBcnJheSgpIHsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKEdldEF0KGkpKTsNCisgICAgfQ0KKyAgfQ0KKyAgdm9pZCBHZXRBdHRyaWJ1dGVPYmplY3QoQ1hGQV9PYmpBcnJheSYgb2JqQXJyYXkpIHsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICBDWEZBX09iamVjdCogcE9iamVjdCA9IChDWEZBX09iamVjdCopRlhKU0VfVmFsdWVfVG9PYmplY3QoR2V0QXQoaSksIE5VTEwpOw0KKyAgICAgIG9iakFycmF5LkFkZChwT2JqZWN0KTsNCisgICAgfQ0KKyAgfQ0KKyAgRlhKU0VfSFJVTlRJTUUgbV9oUnVuVGltZTsNCit9Ow0KK3R5cGVkZWYgc3RydWN0IF9YRkFfUkVTT0xWRU5PREVfUlMgew0KKyAgX1hGQV9SRVNPTFZFTk9ERV9SUygpDQorICAgICAgOiBkd0ZsYWdzKFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9Ob2RlcyksIHBTY3JpcHRBdHRyaWJ1dGUoTlVMTCkge30NCisgIH5fWEZBX1JFU09MVkVOT0RFX1JTKCkgeyBub2Rlcy5SZW1vdmVBbGwoKTsgfQ0KKyAgaW50MzJfdCBHZXRBdHRyaWJ1dGVSZXN1bHQoQ1hGQV9IVkFMVUVBcnJheSYgaFZhbHVlQXJyYXkpIGNvbnN0IHsNCisgICAgaWYgKHBTY3JpcHRBdHRyaWJ1dGUgJiYgcFNjcmlwdEF0dHJpYnV0ZS0+ZVZhbHVlVHlwZSA9PSBYRkFfU0NSSVBUX09iamVjdCkgew0KKyAgICAgIEZYSlNFX0hSVU5USU1FIGhSdW5UaW1lID0gaFZhbHVlQXJyYXkubV9oUnVuVGltZTsNCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBub2Rlcy5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShoUnVuVGltZSk7DQorICAgICAgICAobm9kZXNbaV0tPioocFNjcmlwdEF0dHJpYnV0ZS0+bHBmbkNhbGxiYWNrKSkoDQorICAgICAgICAgICAgaFZhbHVlLCBGQUxTRSwgKFhGQV9BVFRSSUJVVEUpcFNjcmlwdEF0dHJpYnV0ZS0+ZUF0dHJpYnV0ZSk7DQorICAgICAgICBoVmFsdWVBcnJheS5BZGQoaFZhbHVlKTsNCisgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIGhWYWx1ZUFycmF5LkdldFNpemUoKTsNCisgIH0NCisgIENYRkFfT2JqQXJyYXkgbm9kZXM7DQorICBYRkFfUkVTT1ZFTk9ERV9SU1RZUEUgZHdGbGFnczsNCisgIFhGQV9MUENTQ1JJUFRBVFRSSUJVVEVJTkZPIHBTY3JpcHRBdHRyaWJ1dGU7DQorfSBYRkFfUkVTT0xWRU5PREVfUlMsICpYRkFfTFBSRVNPTFZFTk9ERV9SUzsNCit0eXBlZGVmIHN0cnVjdCBfWEZBX0pTQlVJTFRJTklORk8gew0KKyAgdWludDMyX3QgdVVuaWNvZGVIYXNoOw0KKyAgY29uc3QgRlhfQ0hBUiogcE5hbWU7DQorfSBYRkFfSlNCVUlMVElOSU5GTywgKlhGQV9MUEpTQlVJTFRJTklORk87DQordHlwZWRlZiBYRkFfSlNCVUlMVElOSU5GTyBjb25zdCogWEZBX0xQQ0pTQlVJTFRJTklORk87DQorWEZBX0xQQ0pTQlVJTFRJTklORk8gWEZBX0dldEpTQnVpbHRpbkJ5SGFzaCh1aW50MzJfdCB1SGFzaENvZGUpOw0KK2NsYXNzIElYRkFfU2NyaXB0Q29udGV4dCB7DQorIHB1YmxpYzoNCisgIHZpcnR1YWwgfklYRkFfU2NyaXB0Q29udGV4dCgpIHt9DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKEZYSlNFX0hSVU5USU1FIGhSdW50aW1lKSA9IDA7DQorDQorICB2aXJ0dWFsIHZvaWQgU2V0RXZlbnRQYXJhbShDWEZBX0V2ZW50UGFyYW0qIHBFdmVudFBhcmFtKSA9IDA7DQorICB2aXJ0dWFsIENYRkFfRXZlbnRQYXJhbSogR2V0RXZlbnRQYXJhbSgpID0gMDsNCisgIHZpcnR1YWwgRlhfQk9PTCBSdW5TY3JpcHQoWEZBX1NDUklQVExBTkdUWVBFIGVTY3JpcHRUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzU2NyaXB0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFJldFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX09iamVjdCogcFRoaXNPYmplY3QgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIGludDMyX3QgUmVzb2x2ZU9iamVjdHMoQ1hGQV9PYmplY3QqIHJlZk5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0V4cHJlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1JTJiByZXNvbHZlTm9kZVJTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3U3R5bGVzID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogYmluZE5vZGUgPSBOVUxMKSA9IDA7DQorICB2aXJ0dWFsIEZYSlNFX0hWQUxVRSBHZXRKU1ZhbHVlRnJvbU1hcChDWEZBX09iamVjdCogcE9iamVjdCkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIENhY2hlTGlzdChDWEZBX05vZGVMaXN0KiBwTGlzdCkgPSAwOw0KKyAgdmlydHVhbCBDWEZBX09iamVjdCogR2V0VGhpc09iamVjdCgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgRlhKU0VfSFJVTlRJTUUgR2V0UnVudGltZSgpIGNvbnN0ID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRJbmRleEJ5TmFtZShDWEZBX05vZGUqIHJlZk5vZGUpID0gMDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRJbmRleEJ5Q2xhc3NOYW1lKENYRkFfTm9kZSogcmVmTm9kZSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEdldFNvbUV4cHJlc3Npb24oQ1hGQV9Ob2RlKiByZWZOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRXhwcmVzc2lvbikgPSAwOw0KKw0KKyAgdmlydHVhbCB2b2lkIFNldE5vZGVzT2ZSdW5TY3JpcHQoQ1hGQV9Ob2RlQXJyYXkqIHBBcnJheSkgPSAwOw0KKyAgdmlydHVhbCB2b2lkIEFkZE5vZGVzT2ZSdW5TY3JpcHQoY29uc3QgQ1hGQV9Ob2RlQXJyYXkmIG5vZGVzKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgQWRkTm9kZXNPZlJ1blNjcmlwdChDWEZBX05vZGUqIHBOb2RlKSA9IDA7DQorICB2aXJ0dWFsIEZYSlNFX0hDTEFTUyBHZXRKc2VOb3JtYWxDbGFzcygpID0gMDsNCisgIHZpcnR1YWwgWEZBX1NDUklQVExBTkdUWVBFIEdldFR5cGUoKSA9IDA7DQorICB2aXJ0dWFsIHZvaWQgQWRkSlNCdWlsdGluT2JqZWN0KFhGQV9MUENKU0JVSUxUSU5JTkZPIHBCdWl0aW5PYmplY3QpID0gMDsNCisgIHZpcnR1YWwgdm9pZCBTZXRSdW5BdFR5cGUoWEZBX0FUVFJJQlVURUVOVU0gZVJ1bkF0KSA9IDA7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNSdW5BdENsaWVudCgpID0gMDsNCit9Ow0KK0lYRkFfU2NyaXB0Q29udGV4dCogWEZBX1NjcmlwdENvbnRleHRfQ3JlYXRlKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCk7DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3V0aWxzLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTM5YmI0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3V0aWxzLmgKQEAgLTAsMCArMSwyMTQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfWEZBX1VUSUxTX0hfDQorI2RlZmluZSBfWEZBX1VUSUxTX0hfDQorRlhfQk9PTCBYRkFfRkRFRXh0ZW5zaW9uX1Jlc29sdmVOYW1lc3BhY2VRdWFsaWZpZXIoDQorICAgIElGREVfWE1MRWxlbWVudCogcE5vZGUsDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NRdWFsaWZpZXIsDQorICAgIENGWF9XaWRlU3RyaW5nJiB3c05hbWVzcGFjZVVSSSk7DQordGVtcGxhdGUgPGNsYXNzIE5vZGVUeXBlLCBjbGFzcyBUcmF2ZXJzZVN0cmF0ZWd5Pg0KK2NsYXNzIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGUgew0KKyBwdWJsaWM6DQorICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlKE5vZGVUeXBlKiBwUm9vdE5vZGUgPSBOVUxMKSA6IG1fcFJvb3QocFJvb3ROb2RlKSB7DQorICAgIGlmIChwUm9vdE5vZGUpIHsNCisgICAgICBtX05vZGVTdGFjay5QdXNoKHBSb290Tm9kZSk7DQorICAgIH0NCisgIH0NCisgIEZYX0JPT0wgSW5pdChOb2RlVHlwZSogcFJvb3ROb2RlKSB7DQorICAgIGlmICghcFJvb3ROb2RlKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIG1fcFJvb3QgPSBwUm9vdE5vZGU7DQorICAgIG1fTm9kZVN0YWNrLlJlbW92ZUFsbCgpOw0KKyAgICBtX05vZGVTdGFjay5QdXNoKHBSb290Tm9kZSk7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgdm9pZCBDbGVhcigpIHsgbV9Ob2RlU3RhY2suUmVtb3ZlQWxsKCk7IH0NCisgIHZvaWQgUmVzZXQoKSB7DQorICAgIENsZWFyKCk7DQorICAgIGlmIChtX3BSb290KSB7DQorICAgICAgbV9Ob2RlU3RhY2suUHVzaChtX3BSb290KTsNCisgICAgfQ0KKyAgfQ0KKyAgRlhfQk9PTCBTZXRDdXJyZW50KE5vZGVUeXBlKiBwQ3VyTm9kZSkgew0KKyAgICBtX05vZGVTdGFjay5SZW1vdmVBbGwoKTsNCisgICAgaWYgKHBDdXJOb2RlKSB7DQorICAgICAgQ0ZYX1N0YWNrVGVtcGxhdGU8Tm9kZVR5cGUqPiByZXZTdGFjazsNCisgICAgICBOb2RlVHlwZSogcE5vZGU7DQorICAgICAgZm9yIChwTm9kZSA9IHBDdXJOb2RlOyBwTm9kZSAmJiBwTm9kZSAhPSBtX3BSb290Ow0KKyAgICAgICAgICAgcE5vZGUgPSBUcmF2ZXJzZVN0cmF0ZWd5OjpHZXRQYXJlbnQocE5vZGUpKSB7DQorICAgICAgICByZXZTdGFjay5QdXNoKHBOb2RlKTsNCisgICAgICB9DQorICAgICAgaWYgKCFwTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICByZXZTdGFjay5QdXNoKG1fcFJvb3QpOw0KKyAgICAgIHdoaWxlIChyZXZTdGFjay5HZXRTaXplKCkpIHsNCisgICAgICAgIG1fTm9kZVN0YWNrLlB1c2goKnJldlN0YWNrLkdldFRvcEVsZW1lbnQoKSk7DQorICAgICAgICByZXZTdGFjay5Qb3AoKTsNCisgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBOb2RlVHlwZSogR2V0Q3VycmVudCgpIGNvbnN0IHsNCisgICAgcmV0dXJuIG1fTm9kZVN0YWNrLkdldFNpemUoKSA/ICptX05vZGVTdGFjay5HZXRUb3BFbGVtZW50KCkgOiBOVUxMOw0KKyAgfQ0KKyAgTm9kZVR5cGUqIEdldFJvb3QoKSBjb25zdCB7IHJldHVybiBtX3BSb290OyB9DQorICBOb2RlVHlwZSogTW92ZVRvUHJldigpIHsNCisgICAgaW50MzJfdCBuU3RhY2tMZW5ndGggPSBtX05vZGVTdGFjay5HZXRTaXplKCk7DQorICAgIGlmIChuU3RhY2tMZW5ndGggPT0gMSkgew0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9IGVsc2UgaWYgKG5TdGFja0xlbmd0aCA+IDEpIHsNCisgICAgICBOb2RlVHlwZSogcEN1ckl0ZW0gPSAqbV9Ob2RlU3RhY2suR2V0VG9wRWxlbWVudCgpOw0KKyAgICAgIG1fTm9kZVN0YWNrLlBvcCgpOw0KKyAgICAgIE5vZGVUeXBlKiBwUGFyZW50SXRlbSA9ICptX05vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICAgICAgTm9kZVR5cGUqIHBQYXJlbnRGaXJzdENoaWxkSXRlbSA9DQorICAgICAgICAgIFRyYXZlcnNlU3RyYXRlZ3k6OkdldEZpcnN0Q2hpbGQocFBhcmVudEl0ZW0pOw0KKyAgICAgIGlmIChwQ3VySXRlbSA9PSBwUGFyZW50Rmlyc3RDaGlsZEl0ZW0pIHsNCisgICAgICAgIHJldHVybiBwUGFyZW50SXRlbTsNCisgICAgICB9DQorICAgICAgTm9kZVR5cGUgKnBQcmV2SXRlbSA9IHBQYXJlbnRGaXJzdENoaWxkSXRlbSwgKnBQcmV2SXRlbU5leHQgPSBOVUxMOw0KKyAgICAgIGZvciAoOyBwUHJldkl0ZW07IHBQcmV2SXRlbSA9IHBQcmV2SXRlbU5leHQpIHsNCisgICAgICAgIHBQcmV2SXRlbU5leHQgPSBUcmF2ZXJzZVN0cmF0ZWd5OjpHZXROZXh0U2libGluZyhwUHJldkl0ZW0pOw0KKyAgICAgICAgaWYgKCFwUHJldkl0ZW1OZXh0IHx8IHBQcmV2SXRlbU5leHQgPT0gcEN1ckl0ZW0pIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIG1fTm9kZVN0YWNrLlB1c2gocFByZXZJdGVtKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBtX05vZGVTdGFjay5SZW1vdmVBbGwoKTsNCisgICAgICBpZiAobV9wUm9vdCkgew0KKyAgICAgICAgbV9Ob2RlU3RhY2suUHVzaChtX3BSb290KTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKG1fTm9kZVN0YWNrLkdldFNpemUoKSA+IDApIHsNCisgICAgICBOb2RlVHlwZSogcENoaWxkSXRlbSA9ICptX05vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICAgICAgd2hpbGUgKChwQ2hpbGRJdGVtID0gVHJhdmVyc2VTdHJhdGVneTo6R2V0Rmlyc3RDaGlsZChwQ2hpbGRJdGVtKSkgIT0NCisgICAgICAgICAgICAgTlVMTCkgew0KKyAgICAgICAgd2hpbGUgKE5vZGVUeXBlKiBwTmV4dEl0ZW0gPQ0KKyAgICAgICAgICAgICAgICAgICBUcmF2ZXJzZVN0cmF0ZWd5OjpHZXROZXh0U2libGluZyhwQ2hpbGRJdGVtKSkgew0KKyAgICAgICAgICBwQ2hpbGRJdGVtID0gcE5leHRJdGVtOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9Ob2RlU3RhY2suUHVzaChwQ2hpbGRJdGVtKTsNCisgICAgICB9DQorICAgICAgcmV0dXJuICptX05vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBOb2RlVHlwZSogTW92ZVRvTmV4dCgpIHsNCisgICAgTm9kZVR5cGUqKiBwcE5vZGUgPSBOVUxMOw0KKyAgICBOb2RlVHlwZSogcEN1cnJlbnQgPSBHZXRDdXJyZW50KCk7DQorICAgIHdoaWxlIChtX05vZGVTdGFjay5HZXRTaXplKCkgPiAwKSB7DQorICAgICAgd2hpbGUgKChwcE5vZGUgPSBtX05vZGVTdGFjay5HZXRUb3BFbGVtZW50KCkpICE9IE5VTEwpIHsNCisgICAgICAgIGlmIChwQ3VycmVudCAhPSAqcHBOb2RlKSB7DQorICAgICAgICAgIHJldHVybiAqcHBOb2RlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgTm9kZVR5cGUqIHBDaGlsZCA9IFRyYXZlcnNlU3RyYXRlZ3k6OkdldEZpcnN0Q2hpbGQoKnBwTm9kZSk7DQorICAgICAgICBpZiAocENoaWxkID09IE5VTEwpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBtX05vZGVTdGFjay5QdXNoKHBDaGlsZCk7DQorICAgICAgfQ0KKyAgICAgIHdoaWxlICgocHBOb2RlID0gbV9Ob2RlU3RhY2suR2V0VG9wRWxlbWVudCgpKSAhPSBOVUxMKSB7DQorICAgICAgICBOb2RlVHlwZSogcE5leHQgPSBUcmF2ZXJzZVN0cmF0ZWd5OjpHZXROZXh0U2libGluZygqcHBOb2RlKTsNCisgICAgICAgIG1fTm9kZVN0YWNrLlBvcCgpOw0KKyAgICAgICAgaWYgKG1fTm9kZVN0YWNrLkdldFNpemUoKSA9PSAwKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBOZXh0KSB7DQorICAgICAgICAgIG1fTm9kZVN0YWNrLlB1c2gocE5leHQpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBOb2RlVHlwZSogU2tpcENoaWxkcmVuQW5kTW92ZVRvTmV4dCgpIHsNCisgICAgTm9kZVR5cGUqKiBwcE5vZGUgPSBOVUxMOw0KKyAgICB3aGlsZSAoKHBwTm9kZSA9IG1fTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKSkgIT0gTlVMTCkgew0KKyAgICAgIE5vZGVUeXBlKiBwTmV4dCA9IFRyYXZlcnNlU3RyYXRlZ3k6OkdldE5leHRTaWJsaW5nKCpwcE5vZGUpOw0KKyAgICAgIG1fTm9kZVN0YWNrLlBvcCgpOw0KKyAgICAgIGlmIChtX05vZGVTdGFjay5HZXRTaXplKCkgPT0gMCkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlmIChwTmV4dCkgew0KKyAgICAgICAgbV9Ob2RlU3RhY2suUHVzaChwTmV4dCk7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEdldEN1cnJlbnQoKTsNCisgIH0NCisNCisgcHJvdGVjdGVkOg0KKyAgTm9kZVR5cGUqIG1fcFJvb3Q7DQorICBDRlhfU3RhY2tUZW1wbGF0ZTxOb2RlVHlwZSo+IG1fTm9kZVN0YWNrOw0KK307DQordGVtcGxhdGUgPGNsYXNzIEtleVR5cGU+DQorY2xhc3MgQ1hGQV9QdHJTZXRUZW1wbGF0ZSA6IHByaXZhdGUgQ0ZYX01hcFB0clRvUHRyIHsNCisgcHVibGljOg0KKyAgQ1hGQV9QdHJTZXRUZW1wbGF0ZSgpIDogQ0ZYX01hcFB0clRvUHRyKDEwKSB7fQ0KKw0KKyAgaW50IEdldENvdW50KCkgY29uc3QgeyByZXR1cm4gQ0ZYX01hcFB0clRvUHRyOjpHZXRDb3VudCgpOyB9DQorDQorICBGWF9CT09MIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiBDRlhfTWFwUHRyVG9QdHI6OklzRW1wdHkoKTsgfQ0KKw0KKyAgRlhfQk9PTCBMb29rdXAoS2V5VHlwZSBrZXkpIGNvbnN0IHsNCisgICAgdm9pZCogcFZhbHVlID0gTlVMTDsNCisgICAgcmV0dXJuIENGWF9NYXBQdHJUb1B0cjo6TG9va3VwKCh2b2lkKilrZXksIHBWYWx1ZSk7DQorICB9DQorDQorICBGWF9CT09MIG9wZXJhdG9yW10oS2V5VHlwZSBrZXkpIHsgcmV0dXJuIExvb2t1cChrZXkpOyB9DQorDQorICB2b2lkIEFkZChLZXlUeXBlIGtleSkgeyBDRlhfTWFwUHRyVG9QdHI6OlNldEF0KCh2b2lkKilrZXksICh2b2lkKilrZXkpOyB9DQorDQorICBGWF9CT09MIFJlbW92ZUtleShLZXlUeXBlIGtleSkgew0KKyAgICByZXR1cm4gQ0ZYX01hcFB0clRvUHRyOjpSZW1vdmVLZXkoKHZvaWQqKWtleSk7DQorICB9DQorDQorICB2b2lkIFJlbW92ZUFsbCgpIHsgQ0ZYX01hcFB0clRvUHRyOjpSZW1vdmVBbGwoKTsgfQ0KKw0KKyAgRlhfUE9TSVRJT04gR2V0U3RhcnRQb3NpdGlvbigpIGNvbnN0IHsNCisgICAgcmV0dXJuIENGWF9NYXBQdHJUb1B0cjo6R2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgfQ0KKw0KKyAgdm9pZCBHZXROZXh0QXNzb2MoRlhfUE9TSVRJT04mIHJOZXh0UG9zaXRpb24sIEtleVR5cGUmIHJLZXkpIGNvbnN0IHsNCisgICAgdm9pZCogcEtleSA9IE5VTEw7DQorICAgIHZvaWQqIHBWYWx1ZSA9IE5VTEw7DQorICAgIENGWF9NYXBQdHJUb1B0cjo6R2V0TmV4dEFzc29jKHJOZXh0UG9zaXRpb24sIHBLZXksIHBWYWx1ZSk7DQorICAgIHJLZXkgPSAoS2V5VHlwZSkodWludHB0cl90KXBLZXk7DQorICB9DQorfTsNCitjbGFzcyBDWEZBX05vZGU7DQorY2xhc3MgQ1hGQV9XaWRnZXREYXRhOw0KKyNpbmNsdWRlICJmeGZhX2xvY2FsZXZhbHVlLmgiDQorQ1hGQV9Ob2RlKiBYRkFfQ3JlYXRlVUlDaGlsZChDWEZBX05vZGUqIHBOb2RlLCBYRkFfRUxFTUVOVCYgZVdpZGdldFR5cGUpOw0KK0NYRkFfTG9jYWxlVmFsdWUgWEZBX0dldExvY2FsZVZhbHVlKENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEpOw0KK0NGWF9XaWRlU3RyaW5nIFhGQV9OdW1lcmljTGltaXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZWFkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVHJlYWQpOw0KK0ZYX0RPVUJMRSBYRkFfV2lkZVN0cmluZ1RvRG91YmxlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1N0cmluZ1ZhbCk7DQorRlhfRE9VQkxFIFhGQV9CeXRlU3RyaW5nVG9Eb3VibGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelN0cmluZ1ZhbCk7DQoraW50MzJfdCBYRkFfTWFwUm90YXRpb24oaW50MzJfdCBuUm90YXRpb24pOw0KKyNpZm5kZWYgWEZBX1BBUlNFX0hBU19MSU5FSURFTlRJRklFUg0KKyNkZWZpbmUgWEZBX1BBUlNFX0hBU19MSU5FSURFTlRJRklFUg0KKyNlbmRpZg0KK0ZYX0JPT0wgWEZBX1JlY29nbml6ZVJpY2hUZXh0KElGREVfWE1MRWxlbWVudCogcFJpY2hUZXh0WE1MTm9kZSk7DQordm9pZCBYRkFfR2V0UGxhaW5UZXh0RnJvbVJpY2hUZXh0KElGREVfWE1MTm9kZSogcFhNTE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BsYWluVGV4dCk7DQorRlhfQk9PTCBYRkFfRmllbGRJc011bHRpTGlzdEJveChDWEZBX05vZGUqIHBGaWVsZE5vZGUpOw0KK0lGWF9TdHJlYW0qIFhGQV9DcmVhdGVXaWRlVGV4dFJlYWQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQnVmZmVyKTsNCitGWF9CT09MIFhGQV9Jc0xheW91dEVsZW1lbnQoWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxheW91dENvbnRhaW5lciA9IEZBTFNFKTsNCitGWF9CT09MIFhGQV9Jc1Rha2luZ3VwU3BhY2UoWEZBX0FUVFJJQlVURUVOVU0gZVByZXNlbmNlKTsNCitGWF9CT09MIFhGQV9Jc0Zsb3dpbmdMYXlvdXQoWEZBX0FUVFJJQlVURUVOVU0gZUxheW91dCk7DQorRlhfQk9PTCBYRkFfSXNIb3Jpem9udGFsRmxvdyhYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0KTsNCit2b2lkIFhGQV9EYXRhRXhwb3J0ZXJfRGVhbFdpdGhEYXRhR3JvdXBOb2RlKENYRkFfTm9kZSogcERhdGFOb2RlKTsNCit2b2lkIFhGQV9EYXRhRXhwb3J0ZXJfUmVnZW5lcmF0ZUZvcm1GaWxlKENYRkFfTm9kZSogcE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfU3RyZWFtKiBwU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogcENoZWNrc3VtID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNhdmVYTUwgPSBGQUxTRSk7DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZXJyb3IuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZXJyb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMGNkMzUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9lcnJvci5jcHAKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhX2ZtMmpzLmgiDQorc3RhdGljIGNvbnN0IEZYX1dDSEFSKiBnc19scFN0ckVycm9yTXNnSW5mb1tdID0gew0KKyAgICBMInVuc3VwcG9ydGVkIGNoYXIgJyVjJyIsICAgICAgICAgTCJiYWQgc3VmZml4IG9uIG51bWJlciIsDQorICAgIEwiaW52YWxpZGF0ZSBjaGFyICclYyciLCAgICAgICAgICBMImV4cGVjdGVkIGlkZW50aWZpZXIgaW5zdGVhZCBvZiAnJXMnIiwNCisgICAgTCJleHBlY3RlZCAnJXMnIGluc3RlYWQgb2YgJyVzJyIsIEwiZXhwZWN0ZWQgJ2VuZGlmJyBpbnN0ZWFkIG9mICclcyciLA0KKyAgICBMInVuZXhwZWN0ZWQgZXhwcmVzc2lvbiAnJXMnIiwgICAgTCJleHBlY3RlZCBvcGVyYXRvciAnJXMnIGluc3RlYWQgb2YgJyVzJyIsDQorfTsNCitjb25zdCBGWF9XQ0hBUiogWEZBX0ZNX0Vycm9yTXNnKFhGQV9GTV9FUlJNU0cgbXNnKSB7DQorICBpZiAobXNnIDwgRk1FUlJfTUFYSU1VTSkgew0KKyAgICByZXR1cm4gZ3NfbHBTdHJFcnJvck1zZ0luZm9bbXNnXTsNCisgIH0gZWxzZSB7DQorICAgIHJldHVybiBMIiI7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2Vycm9yLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9lcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZmE0NTcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9lcnJvci5oCkBAIC0wLDAgKzEsMjggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfWEZBX0ZNX0VSUk9SX0gNCisjZGVmaW5lIF9YRkFfRk1fRVJST1JfSA0KK2VudW0gWEZBX0ZNX0VSUk1TRyB7DQorICBGTUVSUl9VTlNVUFBPUlRFRF9DSEFSLA0KKyAgRk1FUlJfQkFEX1NVRkZJWF9OVU1CRVIsDQorICBGTUVSUl9JTlZBTElEQVRFX0NIQVIsDQorICBGTUVSUl9FWFBFQ1RFRF9JREVOVElGSUVSLA0KKyAgRk1FUlJfRVhQRUNURURfVE9LRU4sDQorICBGTUVSUl9FWFBFQ1RFRF9JRkVORCwNCisgIEZNRVJSX1VORVhQRUNURURfRVhQUkVTU0lPTiwNCisgIEZNRVJSX0VYUFRFQ1RFRF9PUEVSQVRPUiwNCisgIEZNRVJSX01BWElNVU0NCit9Ow0KK2NsYXNzIENYRkFfRk1FcnJvckluZm8gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNRXJyb3JJbmZvKCkgOiBsaW5lbnVtKDApe307DQorICB+Q1hGQV9GTUVycm9ySW5mbygpe307DQorICBGWF9EV09SRCBsaW5lbnVtOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbWVzc2FnZTsNCit9Ow0KK2NvbnN0IEZYX1dDSEFSKiBYRkFfRk1fRXJyb3JNc2coWEZBX0ZNX0VSUk1TRyBtc2cpOw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2V4cHJlc3Npb24uY3BwIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZXhwcmVzc2lvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNiNzE5NwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2V4cHJlc3Npb24uY3BwCkBAIC0wLDAgKzEsNjgxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmFfZm0yanMuaCINCitzdGF0aWMgQ0ZYX1dpZGVTdHJpbmdDIFJVTlRJTUVCTE9DS1RFTVBBUlJBWSA9DQorICAgIEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWVfYmxvY2tfdGVtcF9hcnJheSIpOw0KK3N0YXRpYyBDRlhfV2lkZVN0cmluZ0MgUlVOVElNRUJMT0NLVEVNUEFSUkFZSU5ERVggPQ0KKyAgICBGWF9XU1RSQyhMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lX2Jsb2NrX3RlbXBfYXJyYXlfaW5kZXgiKTsNCitDWEZBX0ZNRXhwcmVzc2lvbjo6Q1hGQV9GTUV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSkNCisgICAgOiBtX3R5cGUoWEZBX0ZNX0VYUFRZUEVfVU5LTk9XTiksIG1fbGluZShsaW5lKSB7DQorfQ0KK0NYRkFfRk1FeHByZXNzaW9uOjpDWEZBX0ZNRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBYRkFfRk1fRVhQVFlQRSB0eXBlKQ0KKyAgICA6IG1fdHlwZSh0eXBlKSwgbV9saW5lKGxpbmUpIHsNCit9DQordm9pZCBDWEZBX0ZNRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkge30NCit2b2lkIENYRkFfRk1FeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHt9DQorQ1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbjo6Q1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbigNCisgICAgRlhfRFdPUkQgbGluZSwNCisgICAgRlhfQk9PTCBpc0dsb2JhbCwNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsDQorICAgIENGWF9XaWRlU3RyaW5nQ0FycmF5KiBwQXJndW1lbnRzLA0KKyAgICBDRlhfUHRyQXJyYXkqIHBFeHByZXNzaW9ucykNCisgICAgOiBDWEZBX0ZNRXhwcmVzc2lvbihsaW5lLCBYRkFfRk1fRVhQVFlQRV9GVU5DKSwNCisgICAgICBtX3dzTmFtZSh3c05hbWUpLA0KKyAgICAgIG1fcEFyZ3VtZW50cyhwQXJndW1lbnRzKSwNCisgICAgICBtX3BFeHByZXNzaW9ucyhwRXhwcmVzc2lvbnMpLA0KKyAgICAgIG1faXNHbG9iYWwoaXNHbG9iYWwpIHsNCit9DQorQ1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbjo6fkNYRkFfRk1GdW5jdGlvbkRlZmluaXRpb24oKSB7DQorICBpZiAobV9wQXJndW1lbnRzKSB7DQorICAgIG1fcEFyZ3VtZW50cy0+UmVtb3ZlQWxsKCk7DQorICAgIGRlbGV0ZSBtX3BBcmd1bWVudHM7DQorICAgIG1fcEFyZ3VtZW50cyA9IDA7DQorICB9DQorICBpZiAobV9wRXhwcmVzc2lvbnMpIHsNCisgICAgaW50MzJfdCBleHBjID0gbV9wRXhwcmVzc2lvbnMtPkdldFNpemUoKTsNCisgICAgaW50MzJfdCBpbmRleCA9IDA7DQorICAgIENYRkFfRk1FeHByZXNzaW9uKiBlID0gMDsNCisgICAgd2hpbGUgKGluZGV4IDwgZXhwYykgew0KKyAgICAgIGUgPSAoQ1hGQV9GTUV4cHJlc3Npb24qKW1fcEV4cHJlc3Npb25zLT5HZXRBdChpbmRleCk7DQorICAgICAgZGVsZXRlIGU7DQorICAgICAgaW5kZXgrKzsNCisgICAgfQ0KKyAgICBtX3BFeHByZXNzaW9ucy0+UmVtb3ZlQWxsKCk7DQorICAgIGRlbGV0ZSBtX3BFeHByZXNzaW9uczsNCisgICAgbV9wRXhwcmVzc2lvbnMgPSAwOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk1GdW5jdGlvbkRlZmluaXRpb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIGlmIChtX2lzR2xvYmFsICYmICghbV9wRXhwcmVzc2lvbnMgfHwgbV9wRXhwcmVzc2lvbnMtPkdldFNpemUoKSA9PSAwKSkgew0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLy8gY29tbWVudHMgb25seSIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAobV9pc0dsb2JhbCkgew0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKFxuIik7DQorICB9DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiZnVuY3Rpb24gIik7DQorICBpZiAobV93c05hbWUuR2V0QXQoMCkgPT0gTCchJykgew0KKyAgICBDRlhfV2lkZVN0cmluZyB0ZW1wTmFtZSA9IEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIgKyBtX3dzTmFtZS5NaWQoMSk7DQorICAgIGphdmFzY3JpcHQgPDwgdGVtcE5hbWU7DQorICB9IGVsc2Ugew0KKyAgICBqYXZhc2NyaXB0IDw8IG1fd3NOYW1lOw0KKyAgfQ0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgIGlmIChtX3BBcmd1bWVudHMgIT0gMCkgew0KKyAgICBpbnQzMl90IGFyZ2MgPSBtX3BBcmd1bWVudHMtPkdldFNpemUoKTsNCisgICAgaW50MzJfdCBpbmRleCA9IDA7DQorICAgIENGWF9XaWRlU3RyaW5nQyBpZGVudGlmaWVyID0gMDsNCisgICAgd2hpbGUgKGluZGV4IDwgYXJnYykgew0KKyAgICAgIGlkZW50aWZpZXIgPSBtX3BBcmd1bWVudHMtPkdldEF0KGluZGV4KTsNCisgICAgICBpZiAoaWRlbnRpZmllci5HZXRBdCgwKSA9PSBMJyEnKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB0ZW1wSWRlbnRpZmllciA9DQorICAgICAgICAgICAgRVhDTEFNQVRJT05fSU5fSURFTlRJRklFUiArIGlkZW50aWZpZXIuTWlkKDEpOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCB0ZW1wSWRlbnRpZmllcjsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBpZGVudGlmaWVyOw0KKyAgICAgIH0NCisgICAgICBpZiAoaW5kZXggKyAxIDwgYXJnYykgew0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiwgIik7DQorICAgICAgfQ0KKyAgICAgIGluZGV4Kys7DQorICAgIH0NCisgIH0NCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpXG57XG4iKTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ2YXIgIik7DQorICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9IG51bGw7XG4iKTsNCisgIGlmIChtX3BFeHByZXNzaW9ucykgew0KKyAgICBpbnQzMl90IGV4cGMgPSBtX3BFeHByZXNzaW9ucy0+R2V0U2l6ZSgpOw0KKyAgICBpbnQzMl90IGluZGV4ID0gMDsNCisgICAgQ1hGQV9GTUV4cHJlc3Npb24qIGUgPSAwOw0KKyAgICB3aGlsZSAoaW5kZXggPCBleHBjKSB7DQorICAgICAgZSA9IChDWEZBX0ZNRXhwcmVzc2lvbiopbV9wRXhwcmVzc2lvbnMtPkdldEF0KGluZGV4KTsNCisgICAgICBpZiAoaW5kZXggKyAxIDwgZXhwYykgew0KKyAgICAgICAgZS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBlLT5Ub0ltcGxpZWRSZXR1cm5KUyhqYXZhc2NyaXB0KTsNCisgICAgICB9DQorICAgICAgaW5kZXgrKzsNCisgICAgfQ0KKyAgfQ0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMInJldHVybiAiKTsNCisgIGlmIChtX2lzR2xvYmFsKSB7DQorICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCisgIH0gZWxzZSB7DQorICAgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7DQorICB9DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiO1xufVxuIik7DQorICBpZiAobV9pc0dsb2JhbCkgew0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKS5jYWxsKHRoaXMpO1xuIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJikge30NCitDWEZBX0ZNVmFyRXhwcmVzc2lvbjo6Q1hGQV9GTVZhckV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1FeHByZXNzaW9uKiBwSW5pdCkNCisgICAgOiBDWEZBX0ZNRXhwcmVzc2lvbihsaW5lLCBYRkFfRk1fRVhQVFlQRV9WQVIpLA0KKyAgICAgIG1fd3NOYW1lKHdzTmFtZSksDQorICAgICAgbV9wSW5pdChwSW5pdCkge30NCitDWEZBX0ZNVmFyRXhwcmVzc2lvbjo6fkNYRkFfRk1WYXJFeHByZXNzaW9uKCkgew0KKyAgaWYgKG1fcEluaXQpIHsNCisgICAgZGVsZXRlIG1fcEluaXQ7DQorICAgIG1fcEluaXQgPSAwOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk1WYXJFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwidmFyICIpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgdGVtcE5hbWUgPSBtX3dzTmFtZTsNCisgIGlmIChtX3dzTmFtZS5HZXRBdCgwKSA9PSBMJyEnKSB7DQorICAgIHRlbXBOYW1lID0gRVhDTEFNQVRJT05fSU5fSURFTlRJRklFUiArIG1fd3NOYW1lLk1pZCgxKTsNCisgIH0NCisgIGphdmFzY3JpcHQgPDwgdGVtcE5hbWU7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gIik7DQorICBpZiAobV9wSW5pdCkgew0KKyAgICBtX3BJbml0LT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgIGphdmFzY3JpcHQgPDwgdGVtcE5hbWU7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAiKTsNCisgICAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKFZBUkZJTFRFUik7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICAgIGphdmFzY3JpcHQgPDwgdGVtcE5hbWU7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpO1xuIik7DQorICB9IGVsc2Ugew0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiXCJcIjtcbiIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk1WYXJFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ2YXIgIik7DQorICBDRlhfV2lkZVN0cmluZyB0ZW1wTmFtZSA9IG1fd3NOYW1lOw0KKyAgaWYgKG1fd3NOYW1lLkdldEF0KDApID09IEwnIScpIHsNCisgICAgdGVtcE5hbWUgPSBFWENMQU1BVElPTl9JTl9JREVOVElGSUVSICsgbV93c05hbWUuTWlkKDEpOw0KKyAgfQ0KKyAgamF2YXNjcmlwdCA8PCB0ZW1wTmFtZTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAiKTsNCisgIGlmIChtX3BJbml0KSB7DQorICAgIG1fcEluaXQtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgamF2YXNjcmlwdCA8PCB0ZW1wTmFtZTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9ICIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoVkFSRklMVEVSKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgamF2YXNjcmlwdCA8PCB0ZW1wTmFtZTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIik7XG4iKTsNCisgIH0gZWxzZSB7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcIlwiO1xuIik7DQorICB9DQorICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9ICIpOw0KKyAgamF2YXNjcmlwdCA8PCB0ZW1wTmFtZTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCI7XG4iKTsNCit9DQorQ1hGQV9GTUV4cEV4cHJlc3Npb246OkNYRkFfRk1FeHBFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwcmVzc2lvbikNCisgICAgOiBDWEZBX0ZNRXhwcmVzc2lvbihsaW5lLCBYRkFfRk1fRVhQVFlQRV9FWFApLCBtX3BFeHByZXNzaW9uKHBFeHByZXNzaW9uKSB7fQ0KK0NYRkFfRk1FeHBFeHByZXNzaW9uOjp+Q1hGQV9GTUV4cEV4cHJlc3Npb24oKSB7DQorICBpZiAobV9wRXhwcmVzc2lvbikgew0KKyAgICBkZWxldGUgbV9wRXhwcmVzc2lvbjsNCisgICAgbV9wRXhwcmVzc2lvbiA9IDA7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTUV4cEV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIGlmIChtX3BFeHByZXNzaW9uLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9LYXNzaWduKSB7DQorICAgIG1fcEV4cHJlc3Npb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIH0gZWxzZSB7DQorICAgIG1fcEV4cHJlc3Npb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIjtcbiIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk1FeHBFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIGlmIChtX3BFeHByZXNzaW9uLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9LYXNzaWduKSB7DQorICAgIG1fcEV4cHJlc3Npb24tPlRvSW1wbGllZFJldHVybkpTKGphdmFzY3JpcHQpOw0KKyAgfSBlbHNlIHsNCisgICAgaWYgKG1fcEV4cHJlc3Npb24tPkdldE9wZXJhdG9yVG9rZW4oKSA9PSBUT0tzdGFyIHx8DQorICAgICAgICBtX3BFeHByZXNzaW9uLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9LZG90c3RhciB8fA0KKyAgICAgICAgbV9wRXhwcmVzc2lvbi0+R2V0T3BlcmF0b3JUb2tlbigpID09IFRPS2RvdHNjcmVhbSB8fA0KKyAgICAgICAgbV9wRXhwcmVzc2lvbi0+R2V0T3BlcmF0b3JUb2tlbigpID09IFRPS2RvdGRvdCB8fA0KKyAgICAgICAgbV9wRXhwcmVzc2lvbi0+R2V0T3BlcmF0b3JUb2tlbigpID09IFRPS2RvdCkgew0KKyAgICAgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7DQorICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9ICIpOw0KKyAgICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsNCisgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgICAgIG1fcEV4cHJlc3Npb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKTtcbiIpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7DQorICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9ICIpOw0KKyAgICAgIG1fcEV4cHJlc3Npb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiO1xuIik7DQorICAgIH0NCisgIH0NCit9DQorQ1hGQV9GTUJsb2NrRXhwcmVzc2lvbjo6Q1hGQV9GTUJsb2NrRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckFycmF5KiBwRXhwcmVzc2lvbkxpc3QpDQorICAgIDogQ1hGQV9GTUV4cHJlc3Npb24obGluZSwgWEZBX0ZNX0VYUFRZUEVfQkxPQ0spLA0KKyAgICAgIG1fcEV4cHJlc3Npb25MaXN0KHBFeHByZXNzaW9uTGlzdCkge30NCitDWEZBX0ZNQmxvY2tFeHByZXNzaW9uOjp+Q1hGQV9GTUJsb2NrRXhwcmVzc2lvbigpIHsNCisgIGlmIChtX3BFeHByZXNzaW9uTGlzdCkgew0KKyAgICBpbnQzMl90IGV4cGMgPSBtX3BFeHByZXNzaW9uTGlzdC0+R2V0U2l6ZSgpOw0KKyAgICBpbnQzMl90IGluZGV4ID0gMDsNCisgICAgQ1hGQV9GTUV4cHJlc3Npb24qIGUgPSAwOw0KKyAgICB3aGlsZSAoaW5kZXggPCBleHBjKSB7DQorICAgICAgZSA9IChDWEZBX0ZNRXhwcmVzc2lvbiopbV9wRXhwcmVzc2lvbkxpc3QtPkdldEF0KGluZGV4KTsNCisgICAgICBkZWxldGUgZTsNCisgICAgICBpbmRleCsrOw0KKyAgICB9DQorICAgIG1fcEV4cHJlc3Npb25MaXN0LT5SZW1vdmVBbGwoKTsNCisgICAgZGVsZXRlIG1fcEV4cHJlc3Npb25MaXN0Ow0KKyAgICBtX3BFeHByZXNzaW9uTGlzdCA9IDA7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTUJsb2NrRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgew0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIntcbiIpOw0KKyAgaWYgKG1fcEV4cHJlc3Npb25MaXN0KSB7DQorICAgIGludDMyX3QgZXhwYyA9IG1fcEV4cHJlc3Npb25MaXN0LT5HZXRTaXplKCk7DQorICAgIGludDMyX3QgaW5kZXggPSAwOw0KKyAgICBDWEZBX0ZNRXhwcmVzc2lvbiogZSA9IDA7DQorICAgIHdoaWxlIChpbmRleCA8IGV4cGMpIHsNCisgICAgICBlID0gKENYRkFfRk1FeHByZXNzaW9uKiltX3BFeHByZXNzaW9uTGlzdC0+R2V0QXQoaW5kZXgpOw0KKyAgICAgIGUtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgICBpbmRleCsrOw0KKyAgICB9DQorICB9DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwifVxuIik7DQorfQ0KK3ZvaWQgQ1hGQV9GTUJsb2NrRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwie1xuIik7DQorICBpZiAobV9wRXhwcmVzc2lvbkxpc3QpIHsNCisgICAgaW50MzJfdCBleHBjID0gbV9wRXhwcmVzc2lvbkxpc3QtPkdldFNpemUoKTsNCisgICAgaW50MzJfdCBpbmRleCA9IDA7DQorICAgIENYRkFfRk1FeHByZXNzaW9uKiBlID0gMDsNCisgICAgd2hpbGUgKGluZGV4IDwgZXhwYykgew0KKyAgICAgIGUgPSAoQ1hGQV9GTUV4cHJlc3Npb24qKW1fcEV4cHJlc3Npb25MaXN0LT5HZXRBdChpbmRleCk7DQorICAgICAgaWYgKGluZGV4ICsgMSA9PSBleHBjKSB7DQorICAgICAgICBlLT5Ub0ltcGxpZWRSZXR1cm5KUyhqYXZhc2NyaXB0KTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgZS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICAgIH0NCisgICAgICBpbmRleCsrOw0KKyAgICB9DQorICB9DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwifVxuIik7DQorfQ0KK0NYRkFfRk1Eb0V4cHJlc3Npb246OkNYRkFfRk1Eb0V4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1FeHByZXNzaW9uKiBwTGlzdCkNCisgICAgOiBDWEZBX0ZNRXhwcmVzc2lvbihsaW5lKSwgbV9wTGlzdChwTGlzdCkge30NCitDWEZBX0ZNRG9FeHByZXNzaW9uOjp+Q1hGQV9GTURvRXhwcmVzc2lvbigpIHsNCisgIGlmIChtX3BMaXN0KSB7DQorICAgIGRlbGV0ZSBtX3BMaXN0Ow0KKyAgICBtX3BMaXN0ID0gMDsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNRG9FeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBtX3BMaXN0LT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorfQ0KK3ZvaWQgQ1hGQV9GTURvRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBtX3BMaXN0LT5Ub0ltcGxpZWRSZXR1cm5KUyhqYXZhc2NyaXB0KTsNCit9DQorQ1hGQV9GTUlmRXhwcmVzc2lvbjo6Q1hGQV9GTUlmRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHByZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTUV4cHJlc3Npb24qIHBJZkV4cHJlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNRXhwcmVzc2lvbiogcEVsc2VFeHByZXNzaW9uKQ0KKyAgICA6IENYRkFfRk1FeHByZXNzaW9uKGxpbmUsIFhGQV9GTV9FWFBUWVBFX0lGKSwNCisgICAgICBtX3BFeHByZXNzaW9uKHBFeHByZXNzaW9uKSwNCisgICAgICBtX3BJZkV4cHJlc3Npb24ocElmRXhwcmVzc2lvbiksDQorICAgICAgbV9wRWxzZUV4cHJlc3Npb24ocEVsc2VFeHByZXNzaW9uKSB7fQ0KK0NYRkFfRk1JZkV4cHJlc3Npb246On5DWEZBX0ZNSWZFeHByZXNzaW9uKCkgew0KKyAgaWYgKG1fcEV4cHJlc3Npb24pIHsNCisgICAgZGVsZXRlIG1fcEV4cHJlc3Npb247DQorICAgIG1fcEV4cHJlc3Npb24gPSAwOw0KKyAgfQ0KKyAgaWYgKG1fcElmRXhwcmVzc2lvbikgew0KKyAgICBkZWxldGUgbV9wSWZFeHByZXNzaW9uOw0KKyAgICBtX3BJZkV4cHJlc3Npb24gPSAwOw0KKyAgfQ0KKyAgaWYgKG1fcEVsc2VFeHByZXNzaW9uKSB7DQorICAgIGRlbGV0ZSBtX3BFbHNlRXhwcmVzc2lvbjsNCisgICAgbV9wRWxzZUV4cHJlc3Npb24gPSAwOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk1JZkV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJpZiAoIik7DQorICBpZiAobV9wRXhwcmVzc2lvbikgew0KKyAgICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoR0VURk1WQUxVRSk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICAgIG1fcEV4cHJlc3Npb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCisgIH0NCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpXG4iKTsNCisgIGlmIChtX3BJZkV4cHJlc3Npb24pIHsNCisgICAgbV9wSWZFeHByZXNzaW9uLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICB9DQorICBpZiAobV9wRWxzZUV4cHJlc3Npb24pIHsNCisgICAgaWYgKG1fcEVsc2VFeHByZXNzaW9uLT5HZXRFeHBUeXBlKCkgPT0gWEZBX0ZNX0VYUFRZUEVfSUYpIHsNCisgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiZWxzZVxuIik7DQorICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIntcbiIpOw0KKyAgICAgIG1fcEVsc2VFeHByZXNzaW9uLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIn1cbiIpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJlbHNlXG4iKTsNCisgICAgICBtX3BFbHNlRXhwcmVzc2lvbi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTUlmRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9IDA7XG4iKTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJpZiAoIik7DQorICBpZiAobV9wRXhwcmVzc2lvbikgew0KKyAgICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoR0VURk1WQUxVRSk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICAgIG1fcEV4cHJlc3Npb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCisgIH0NCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpXG4iKTsNCisgIGlmIChtX3BJZkV4cHJlc3Npb24pIHsNCisgICAgbV9wSWZFeHByZXNzaW9uLT5Ub0ltcGxpZWRSZXR1cm5KUyhqYXZhc2NyaXB0KTsNCisgIH0NCisgIGlmIChtX3BFbHNlRXhwcmVzc2lvbikgew0KKyAgICBpZiAobV9wRWxzZUV4cHJlc3Npb24tPkdldEV4cFR5cGUoKSA9PSBYRkFfRk1fRVhQVFlQRV9JRikgew0KKyAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJlbHNlXG4iKTsNCisgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwie1xuIik7DQorICAgICAgbV9wRWxzZUV4cHJlc3Npb24tPlRvSW1wbGllZFJldHVybkpTKGphdmFzY3JpcHQpOw0KKyAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ9XG4iKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiZWxzZVxuIik7DQorICAgICAgbV9wRWxzZUV4cHJlc3Npb24tPlRvSW1wbGllZFJldHVybkpTKGphdmFzY3JpcHQpOw0KKyAgICB9DQorICB9DQorfQ0KK0NYRkFfRk1Mb29wRXhwcmVzc2lvbjo6fkNYRkFfRk1Mb29wRXhwcmVzc2lvbigpIHt9DQordm9pZCBDWEZBX0ZNTG9vcEV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHt9DQordm9pZCBDWEZBX0ZNTG9vcEV4cHJlc3Npb246OlRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpIHt9DQorQ1hGQV9GTVdoaWxlRXhwcmVzc2lvbjo6Q1hGQV9GTVdoaWxlRXhwcmVzc2lvbigNCisgICAgRlhfRFdPUkQgbGluZSwNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBDb25kaXRpb24sDQorICAgIENYRkFfRk1FeHByZXNzaW9uKiBwRXhwcmVzc2lvbikNCisgICAgOiBDWEZBX0ZNTG9vcEV4cHJlc3Npb24obGluZSksDQorICAgICAgbV9wQ29uZGl0aW9uKHBDb25kaXRpb24pLA0KKyAgICAgIG1fcEV4cHJlc3Npb24ocEV4cHJlc3Npb24pIHt9DQorQ1hGQV9GTVdoaWxlRXhwcmVzc2lvbjo6fkNYRkFfRk1XaGlsZUV4cHJlc3Npb24oKSB7DQorICBpZiAobV9wQ29uZGl0aW9uKSB7DQorICAgIGRlbGV0ZSBtX3BDb25kaXRpb247DQorICAgIG1fcENvbmRpdGlvbiA9IDA7DQorICB9DQorICBpZiAobV9wRXhwcmVzc2lvbikgew0KKyAgICBkZWxldGUgbV9wRXhwcmVzc2lvbjsNCisgICAgbV9wRXhwcmVzc2lvbiA9IDA7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTVdoaWxlRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgew0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIndoaWxlICgiKTsNCisgIG1fcENvbmRpdGlvbi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIilcbiIpOw0KKyAgbV9wRXhwcmVzc2lvbi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KK30NCit2b2lkIENYRkFfRk1XaGlsZUV4cHJlc3Npb246OlRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgew0KKyAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAwO1xuIik7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwid2hpbGUgKCIpOw0KKyAgbV9wQ29uZGl0aW9uLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKVxuIik7DQorICBtX3BFeHByZXNzaW9uLT5Ub0ltcGxpZWRSZXR1cm5KUyhqYXZhc2NyaXB0KTsNCit9DQorQ1hGQV9GTUJyZWFrRXhwcmVzc2lvbjo6Q1hGQV9GTUJyZWFrRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lKQ0KKyAgICA6IENYRkFfRk1FeHByZXNzaW9uKGxpbmUsIFhGQV9GTV9FWFBUWVBFX0JSRUFLKSB7DQorfQ0KK0NYRkFfRk1CcmVha0V4cHJlc3Npb246On5DWEZBX0ZNQnJlYWtFeHByZXNzaW9uKCkge30NCit2b2lkIENYRkFfRk1CcmVha0V4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gMDtcbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImJyZWFrO1xuIik7DQorfQ0KK3ZvaWQgQ1hGQV9GTUJyZWFrRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9IDA7XG4iKTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJicmVhaztcbiIpOw0KK30NCitDWEZBX0ZNQ29udGludWVFeHByZXNzaW9uOjpDWEZBX0ZNQ29udGludWVFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUpDQorICAgIDogQ1hGQV9GTUV4cHJlc3Npb24obGluZSwgWEZBX0ZNX0VYUFRZUEVfQ09OVElOVUUpIHsNCit9DQorQ1hGQV9GTUNvbnRpbnVlRXhwcmVzc2lvbjo6fkNYRkFfRk1Db250aW51ZUV4cHJlc3Npb24oKSB7fQ0KK3ZvaWQgQ1hGQV9GTUNvbnRpbnVlRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgew0KKyAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAwO1xuIik7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiY29udGludWU7XG4iKTsNCit9DQordm9pZCBDWEZBX0ZNQ29udGludWVFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gMDtcbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImNvbnRpbnVlO1xuIik7DQorfQ0KK0NYRkFfRk1Gb3JFeHByZXNzaW9uOjpDWEZBX0ZNRm9yRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVmFyaWFudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBBc3NpZ25tZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEFjY2Vzc29yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEaXJlY3Rpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwU3RlcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTUV4cHJlc3Npb24qIHBMaXN0KQ0KKyAgICA6IENYRkFfRk1Mb29wRXhwcmVzc2lvbihsaW5lKSwNCisgICAgICBtX3dzVmFyaWFudCh3c1ZhcmlhbnQpLA0KKyAgICAgIG1fcEFzc2lnbm1lbnQocEFzc2lnbm1lbnQpLA0KKyAgICAgIG1fcEFjY2Vzc29yKHBBY2Nlc3NvciksDQorICAgICAgbV9pRGlyZWN0aW9uKGlEaXJlY3Rpb24pLA0KKyAgICAgIG1fcFN0ZXAocFN0ZXApLA0KKyAgICAgIG1fcExpc3QocExpc3QpIHt9DQorQ1hGQV9GTUZvckV4cHJlc3Npb246On5DWEZBX0ZNRm9yRXhwcmVzc2lvbigpIHsNCisgIGlmIChtX3BBc3NpZ25tZW50KSB7DQorICAgIGRlbGV0ZSBtX3BBc3NpZ25tZW50Ow0KKyAgICBtX3BBc3NpZ25tZW50ID0gMDsNCisgIH0NCisgIGlmIChtX3BBY2Nlc3Nvcikgew0KKyAgICBkZWxldGUgbV9wQWNjZXNzb3I7DQorICAgIG1fcEFjY2Vzc29yID0gMDsNCisgIH0NCisgIGlmIChtX3BTdGVwKSB7DQorICAgIGRlbGV0ZSBtX3BTdGVwOw0KKyAgICBtX3BTdGVwID0gMDsNCisgIH0NCisgIGlmIChtX3BMaXN0KSB7DQorICAgIGRlbGV0ZSBtX3BMaXN0Ow0KKyAgICBtX3BMaXN0ID0gMDsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNRm9yRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgew0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIntcbnZhciAiKTsNCisgIENGWF9XaWRlU3RyaW5nIHRlbXBWYXJpYW50Ow0KKyAgaWYgKG1fd3NWYXJpYW50LkdldEF0KDApID09IEwnIScpIHsNCisgICAgdGVtcFZhcmlhbnQgPSBFWENMQU1BVElPTl9JTl9JREVOVElGSUVSICsgbV93c1ZhcmlhbnQuTWlkKDEpOw0KKyAgICBqYXZhc2NyaXB0IDw8IHRlbXBWYXJpYW50Ow0KKyAgfSBlbHNlIHsNCisgICAgdGVtcFZhcmlhbnQgPSBtX3dzVmFyaWFudDsNCisgICAgamF2YXNjcmlwdCA8PCBtX3dzVmFyaWFudDsNCisgIH0NCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSBudWxsO1xuIik7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiZm9yICgiKTsNCisgIGphdmFzY3JpcHQgPDwgdGVtcFZhcmlhbnQ7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gIik7DQorICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoR0VURk1WQUxVRSk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgbV9wQXNzaWdubWVudC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIik7ICIpOw0KKyAgamF2YXNjcmlwdCA8PCB0ZW1wVmFyaWFudDsNCisgIGlmIChtX2lEaXJlY3Rpb24gPT0gMSkgew0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiIDw9ICIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoR0VURk1WQUxVRSk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICAgIG1fcEFjY2Vzc29yLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpOyAiKTsNCisgICAgamF2YXNjcmlwdCA8PCB0ZW1wVmFyaWFudDsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiArPSAiKTsNCisgIH0gZWxzZSB7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPj0gIik7DQorICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgbV9wQWNjZXNzb3ItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIik7ICIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IHRlbXBWYXJpYW50Ow0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiIC09ICIpOw0KKyAgfQ0KKyAgaWYgKG1fcFN0ZXApIHsNCisgICAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKEdFVEZNVkFMVUUpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgICBtX3BTdGVwLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpIik7DQorICB9IGVsc2Ugew0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiMSIpOw0KKyAgfQ0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIilcbiIpOw0KKyAgbV9wTGlzdC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIn1cbiIpOw0KK30NCit2b2lkIENYRkFfRk1Gb3JFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gMDtcbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIntcbnZhciAiKTsNCisgIENGWF9XaWRlU3RyaW5nIHRlbXBWYXJpYW50Ow0KKyAgaWYgKG1fd3NWYXJpYW50LkdldEF0KDApID09IEwnIScpIHsNCisgICAgdGVtcFZhcmlhbnQgPSBFWENMQU1BVElPTl9JTl9JREVOVElGSUVSICsgbV93c1ZhcmlhbnQuTWlkKDEpOw0KKyAgICBqYXZhc2NyaXB0IDw8IHRlbXBWYXJpYW50Ow0KKyAgfSBlbHNlIHsNCisgICAgdGVtcFZhcmlhbnQgPSBtX3dzVmFyaWFudDsNCisgICAgamF2YXNjcmlwdCA8PCBtX3dzVmFyaWFudDsNCisgIH0NCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSBudWxsO1xuIik7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiZm9yICgiKTsNCisgIGphdmFzY3JpcHQgPDwgdGVtcFZhcmlhbnQ7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gIik7DQorICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoR0VURk1WQUxVRSk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgbV9wQXNzaWdubWVudC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIik7ICIpOw0KKyAgamF2YXNjcmlwdCA8PCB0ZW1wVmFyaWFudDsNCisgIGlmIChtX2lEaXJlY3Rpb24gPT0gMSkgew0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiIDw9ICIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoR0VURk1WQUxVRSk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICAgIG1fcEFjY2Vzc29yLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpOyAiKTsNCisgICAgamF2YXNjcmlwdCA8PCB0ZW1wVmFyaWFudDsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiArPSAiKTsNCisgIH0gZWxzZSB7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPj0gIik7DQorICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgbV9wQWNjZXNzb3ItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIik7ICIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IHRlbXBWYXJpYW50Ow0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiIC09ICIpOw0KKyAgfQ0KKyAgaWYgKG1fcFN0ZXApIHsNCisgICAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKEdFVEZNVkFMVUUpOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgICBtX3BTdGVwLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpIik7DQorICB9IGVsc2Ugew0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiMSIpOw0KKyAgfQ0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIilcbiIpOw0KKyAgbV9wTGlzdC0+VG9JbXBsaWVkUmV0dXJuSlMoamF2YXNjcmlwdCk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwifVxuIik7DQorfQ0KK0NYRkFfRk1Gb3JlYWNoRXhwcmVzc2lvbjo6Q1hGQV9GTUZvcmVhY2hFeHByZXNzaW9uKA0KKyAgICBGWF9EV09SRCBsaW5lLA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzSWRlbnRpZmllciwNCisgICAgQ0ZYX1B0ckFycmF5KiBwQWNjZXNzb3JzLA0KKyAgICBDWEZBX0ZNRXhwcmVzc2lvbiogcExpc3QpDQorICAgIDogQ1hGQV9GTUxvb3BFeHByZXNzaW9uKGxpbmUpLA0KKyAgICAgIG1fd3NJZGVudGlmaWVyKHdzSWRlbnRpZmllciksDQorICAgICAgbV9wQWNjZXNzb3JzKHBBY2Nlc3NvcnMpLA0KKyAgICAgIG1fcExpc3QocExpc3QpIHt9DQorQ1hGQV9GTUZvcmVhY2hFeHByZXNzaW9uOjp+Q1hGQV9GTUZvcmVhY2hFeHByZXNzaW9uKCkgew0KKyAgaWYgKG1fcExpc3QpIHsNCisgICAgZGVsZXRlIG1fcExpc3Q7DQorICAgIG1fcExpc3QgPSAwOw0KKyAgfQ0KKyAgaWYgKG1fcEFjY2Vzc29ycykgew0KKyAgICBpbnQzMl90IHNpemUgPSBtX3BBY2Nlc3NvcnMtPkdldFNpemUoKTsNCisgICAgaW50MzJfdCBpbmRleCA9IDA7DQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBlID0gMDsNCisgICAgd2hpbGUgKGluZGV4IDwgc2l6ZSkgew0KKyAgICAgIGUgPSAoQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qKW1fcEFjY2Vzc29ycy0+R2V0QXQoaW5kZXgpOw0KKyAgICAgIGRlbGV0ZSBlOw0KKyAgICAgIGluZGV4Kys7DQorICAgIH0NCisgICAgbV9wQWNjZXNzb3JzLT5SZW1vdmVBbGwoKTsNCisgICAgZGVsZXRlIG1fcEFjY2Vzc29yczsNCisgICAgbV9wQWNjZXNzb3JzID0gMDsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNRm9yZWFjaEV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ7XG4iKTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ2YXIgIik7DQorICBpZiAobV93c0lkZW50aWZpZXIuR2V0QXQoMCkgPT0gTCchJykgew0KKyAgICBDRlhfV2lkZVN0cmluZyB0ZW1wSWRlbnRpZmllciA9DQorICAgICAgICBFWENMQU1BVElPTl9JTl9JREVOVElGSUVSICsgbV93c0lkZW50aWZpZXIuTWlkKDEpOw0KKyAgICBqYXZhc2NyaXB0IDw8IHRlbXBJZGVudGlmaWVyOw0KKyAgfSBlbHNlIHsNCisgICAgamF2YXNjcmlwdCA8PCBtX3dzSWRlbnRpZmllcjsNCisgIH0NCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSBudWxsO1xuIik7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwidmFyICIpOw0KKyAgamF2YXNjcmlwdCA8PCBSVU5USU1FQkxPQ0tURU1QQVJSQVk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gIik7DQorICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoQ09OQ0FURk1PQkpFQ1QpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgIGludDMyX3QgaVNpemUgPSBtX3BBY2Nlc3NvcnMtPkdldFNpemUoKTsNCisgIGludDMyX3QgaW5kZXggPSAwOw0KKyAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHMgPSAwOw0KKyAgd2hpbGUgKGluZGV4IDwgaVNpemUpIHsNCisgICAgcyA9IChDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiopbV9wQWNjZXNzb3JzLT5HZXRBdChpbmRleCk7DQorICAgIHMtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgaWYgKGluZGV4ICsgMSA8IGlTaXplKSB7DQorICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiwgIik7DQorICAgIH0NCisgICAgaW5kZXgrKzsNCisgIH0NCisgIHMgPSAwOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIik7XG4iKTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ2YXIgIik7DQorICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVCTE9DS1RFTVBBUlJBWUlOREVYOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9IDA7XG4iKTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ3aGlsZSgiKTsNCisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZSU5ERVg7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiIDwgIik7DQorICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVCTE9DS1RFTVBBUlJBWTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIubGVuZ3RoKVxue1xuIik7DQorICBpZiAobV93c0lkZW50aWZpZXIuR2V0QXQoMCkgPT0gTCchJykgew0KKyAgICBDRlhfV2lkZVN0cmluZyB0ZW1wSWRlbnRpZmllciA9DQorICAgICAgICBFWENMQU1BVElPTl9JTl9JREVOVElGSUVSICsgbV93c0lkZW50aWZpZXIuTWlkKDEpOw0KKyAgICBqYXZhc2NyaXB0IDw8IHRlbXBJZGVudGlmaWVyOw0KKyAgfSBlbHNlIHsNCisgICAgamF2YXNjcmlwdCA8PCBtX3dzSWRlbnRpZmllcjsNCisgIH0NCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAiKTsNCisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlsiKTsNCisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZSU5ERVg7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKytdO1xuIik7DQorICBtX3BMaXN0LT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwifVxuIik7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwifVxuIik7DQorfQ0KK3ZvaWQgQ1hGQV9GTUZvcmVhY2hFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gMDtcbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIntcbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMInZhciAiKTsNCisgIGlmIChtX3dzSWRlbnRpZmllci5HZXRBdCgwKSA9PSBMJyEnKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHRlbXBJZGVudGlmaWVyID0NCisgICAgICAgIEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIgKyBtX3dzSWRlbnRpZmllci5NaWQoMSk7DQorICAgIGphdmFzY3JpcHQgPDwgdGVtcElkZW50aWZpZXI7DQorICB9IGVsc2Ugew0KKyAgICBqYXZhc2NyaXB0IDw8IG1fd3NJZGVudGlmaWVyOw0KKyAgfQ0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9IG51bGw7XG4iKTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJ2YXIgIik7DQorICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVCTE9DS1RFTVBBUlJBWTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAiKTsNCisgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhDT05DQVRGTU9CSkVDVCk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgaW50MzJfdCBpU2l6ZSA9IG1fcEFjY2Vzc29ycy0+R2V0U2l6ZSgpOw0KKyAgaW50MzJfdCBpbmRleCA9IDA7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcyA9IDA7DQorICB3aGlsZSAoaW5kZXggPCBpU2l6ZSkgew0KKyAgICBzID0gKENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiltX3BBY2Nlc3NvcnMtPkdldEF0KGluZGV4KTsNCisgICAgcy0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgICBpZiAoaW5kZXggKyAxIDwgaVNpemUpIHsNCisgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLCAiKTsNCisgICAgfQ0KKyAgICBpbmRleCsrOw0KKyAgfQ0KKyAgcyA9IDA7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKTtcbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMInZhciAiKTsNCisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZSU5ERVg7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gMDtcbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIndoaWxlKCIpOw0KKyAgamF2YXNjcmlwdCA8PCBSVU5USU1FQkxPQ0tURU1QQVJSQVlJTkRFWDsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPCAiKTsNCisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIi5sZW5ndGgpXG57XG4iKTsNCisgIGlmIChtX3dzSWRlbnRpZmllci5HZXRBdCgwKSA9PSBMJyEnKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHRlbXBJZGVudGlmaWVyID0NCisgICAgICAgIEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIgKyBtX3dzSWRlbnRpZmllci5NaWQoMSk7DQorICAgIGphdmFzY3JpcHQgPDwgdGVtcElkZW50aWZpZXI7DQorICB9IGVsc2Ugew0KKyAgICBqYXZhc2NyaXB0IDw8IG1fd3NJZGVudGlmaWVyOw0KKyAgfQ0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiA9ICIpOw0KKyAgamF2YXNjcmlwdCA8PCBSVU5USU1FQkxPQ0tURU1QQVJSQVk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiWyIpOw0KKyAgamF2YXNjcmlwdCA8PCBSVU5USU1FQkxPQ0tURU1QQVJSQVlJTkRFWDsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIrK107XG4iKTsNCisgIG1fcExpc3QtPlRvSW1wbGllZFJldHVybkpTKGphdmFzY3JpcHQpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIn1cbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIn1cbiIpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9leHByZXNzaW9uLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9leHByZXNzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNjMGE3YgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2V4cHJlc3Npb24uaApAQCAtMCwwICsxLDE3OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfRk1fRVhQUkVTU0lPTl9IDQorI2RlZmluZSBfWEZBX0ZNX0VYUFJFU1NJT05fSA0KK2VudW0gWEZBX0ZNX0VYUFRZUEUgew0KKyAgWEZBX0ZNX0VYUFRZUEVfVU5LTk9XTiwNCisgIFhGQV9GTV9FWFBUWVBFX0ZVTkMsDQorICBYRkFfRk1fRVhQVFlQRV9WQVIsDQorICBYRkFfRk1fRVhQVFlQRV9FWFAsDQorICBYRkFfRk1fRVhQVFlQRV9CTE9DSywNCisgIFhGQV9GTV9FWFBUWVBFX0lGLA0KKyAgWEZBX0ZNX0VYUFRZUEVfQlJFQUssDQorICBYRkFfRk1fRVhQVFlQRV9DT05USU5VRSwNCit9Ow0KK2NsYXNzIENYRkFfRk1FeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTUV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSk7DQorICBDWEZBX0ZNRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBYRkFfRk1fRVhQVFlQRSB0eXBlKTsNCisgIHZpcnR1YWwgfkNYRkFfRk1FeHByZXNzaW9uKCl7fTsNCisgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisgIHZpcnR1YWwgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKTsNCisgIEZYX0RXT1JEIEdldExpbmUoKSB7IHJldHVybiBtX2xpbmU7IH0NCisgIFhGQV9GTV9FWFBUWVBFIEdldEV4cFR5cGUoKSBjb25zdCB7IHJldHVybiBtX3R5cGU7IH0NCisNCisgcHJvdGVjdGVkOg0KKyAgWEZBX0ZNX0VYUFRZUEUgbV90eXBlOw0KKyAgRlhfRFdPUkQgbV9saW5lOw0KK307DQorY2xhc3MgQ1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbiA6IHB1YmxpYyBDWEZBX0ZNRXhwcmVzc2lvbiB7DQorIHB1YmxpYzoNCisgIENYRkFfRk1GdW5jdGlvbkRlZmluaXRpb24oRlhfRFdPUkQgbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0dsb2JhbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQ0FycmF5KiBwQXJndW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkqIHBFeHByZXNzaW9ucyk7DQorICB2aXJ0dWFsIH5DWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uKCk7DQorICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQorICB2aXJ0dWFsIHZvaWQgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJik7DQorDQorIHByaXZhdGU6DQorICBDRlhfV2lkZVN0cmluZ0MgbV93c05hbWU7DQorICBDRlhfV2lkZVN0cmluZ0NBcnJheSogbV9wQXJndW1lbnRzOw0KKyAgQ0ZYX1B0ckFycmF5KiBtX3BFeHByZXNzaW9uczsNCisgIEZYX0JPT0wgbV9pc0dsb2JhbDsNCit9Ow0KK2NsYXNzIENYRkFfRk1WYXJFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1FeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTVZhckV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTUV4cHJlc3Npb24qIHBJbml0KTsNCisgIHZpcnR1YWwgfkNYRkFfRk1WYXJFeHByZXNzaW9uKCk7DQorICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQorICB2aXJ0dWFsIHZvaWQgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJik7DQorDQorIHByaXZhdGU6DQorICBDRlhfV2lkZVN0cmluZ0MgbV93c05hbWU7DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogbV9wSW5pdDsNCit9Ow0KK2NsYXNzIENYRkFfRk1FeHBFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1FeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTUV4cEV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHByZXNzaW9uKTsNCisgIHZpcnR1YWwgfkNYRkFfRk1FeHBFeHByZXNzaW9uKCk7DQorICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQorICB2aXJ0dWFsIHZvaWQgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJik7DQorDQorIHByaXZhdGU6DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogbV9wRXhwcmVzc2lvbjsNCit9Ow0KK2NsYXNzIENYRkFfRk1CbG9ja0V4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNQmxvY2tFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIENGWF9QdHJBcnJheSogcEV4cHJlc3Npb25MaXN0KTsNCisgIHZpcnR1YWwgfkNYRkFfRk1CbG9ja0V4cHJlc3Npb24oKTsNCisgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisgIHZpcnR1YWwgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKTsNCisNCisgcHJpdmF0ZToNCisgIENGWF9QdHJBcnJheSogbV9wRXhwcmVzc2lvbkxpc3Q7DQorfTsNCitjbGFzcyBDWEZBX0ZNRG9FeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1FeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTURvRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDWEZBX0ZNRXhwcmVzc2lvbiogcExpc3QpOw0KKyAgdmlydHVhbCB+Q1hGQV9GTURvRXhwcmVzc2lvbigpOw0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKyAgdmlydHVhbCB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ1hGQV9GTUV4cHJlc3Npb24qIG1fcExpc3Q7DQorfTsNCitjbGFzcyBDWEZBX0ZNSWZFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1FeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTUlmRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cHJlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1FeHByZXNzaW9uKiBwSWZFeHByZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNRXhwcmVzc2lvbiogcEVsc2VFeHByZXNzaW9uKTsNCisgIHZpcnR1YWwgfkNYRkFfRk1JZkV4cHJlc3Npb24oKTsNCisgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisgIHZpcnR1YWwgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKTsNCisNCisgcHJpdmF0ZToNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBtX3BFeHByZXNzaW9uOw0KKyAgQ1hGQV9GTUV4cHJlc3Npb24qIG1fcElmRXhwcmVzc2lvbjsNCisgIENYRkFfRk1FeHByZXNzaW9uKiBtX3BFbHNlRXhwcmVzc2lvbjsNCit9Ow0KK2NsYXNzIENYRkFfRk1Mb29wRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNRXhwcmVzc2lvbiB7DQorIHB1YmxpYzoNCisgIENYRkFfRk1Mb29wRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lKSA6IENYRkFfRk1FeHByZXNzaW9uKGxpbmUpIHt9DQorICB2aXJ0dWFsIH5DWEZBX0ZNTG9vcEV4cHJlc3Npb24oKTsNCisgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisgIHZpcnR1YWwgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKTsNCit9Ow0KK2NsYXNzIENYRkFfRk1XaGlsZUV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUxvb3BFeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTVdoaWxlRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcENvZGl0aW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNRXhwcmVzc2lvbiogcEV4cHJlc3Npb24pOw0KKyAgdmlydHVhbCB+Q1hGQV9GTVdoaWxlRXhwcmVzc2lvbigpOw0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKyAgdmlydHVhbCB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpOw0KKw0KKyBwcml2YXRlOg0KKyAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIG1fcENvbmRpdGlvbjsNCisgIENYRkFfRk1FeHByZXNzaW9uKiBtX3BFeHByZXNzaW9uOw0KK307DQorY2xhc3MgQ1hGQV9GTUJyZWFrRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNRXhwcmVzc2lvbiB7DQorIHB1YmxpYzoNCisgIENYRkFfRk1CcmVha0V4cHJlc3Npb24oRlhfRFdPUkQgbGluZSk7DQorICB2aXJ0dWFsIH5DWEZBX0ZNQnJlYWtFeHByZXNzaW9uKCk7DQorICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQorICB2aXJ0dWFsIHZvaWQgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJik7DQorfTsNCitjbGFzcyBDWEZBX0ZNQ29udGludWVFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1FeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTUNvbnRpbnVlRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lKTsNCisgIHZpcnR1YWwgfkNYRkFfRk1Db250aW51ZUV4cHJlc3Npb24oKTsNCisgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisgIHZpcnR1YWwgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKTsNCit9Ow0KK2NsYXNzIENYRkFfRk1Gb3JFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1Mb29wRXhwcmVzc2lvbiB7DQorIHB1YmxpYzoNCisgIENYRkFfRk1Gb3JFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVmFyaWFudCwNCisgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwQXNzaWdubWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwQWNjZXNzb3IsDQorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEaXJlY3Rpb24sDQorICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcFN0ZXAsDQorICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNRXhwcmVzc2lvbiogcExpc3QpOw0KKyAgdmlydHVhbCB+Q1hGQV9GTUZvckV4cHJlc3Npb24oKTsNCisgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisgIHZpcnR1YWwgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKTsNCisNCisgcHJpdmF0ZToNCisgIENGWF9XaWRlU3RyaW5nQyBtX3dzVmFyaWFudDsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBtX3BBc3NpZ25tZW50Ow0KKyAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIG1fcEFjY2Vzc29yOw0KKyAgaW50MzJfdCBtX2lEaXJlY3Rpb247DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogbV9wU3RlcDsNCisgIENYRkFfRk1FeHByZXNzaW9uKiBtX3BMaXN0Ow0KK307DQorY2xhc3MgQ1hGQV9GTUZvcmVhY2hFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1Mb29wRXhwcmVzc2lvbiB7DQorIHB1YmxpYzoNCisgIENYRkFfRk1Gb3JlYWNoRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NJZGVudGlmaWVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QdHJBcnJheSogcEFjY2Vzc29ycywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNRXhwcmVzc2lvbiogcExpc3QpOw0KKyAgdmlydHVhbCB+Q1hGQV9GTUZvcmVhY2hFeHByZXNzaW9uKCk7DQorICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQorICB2aXJ0dWFsIHZvaWQgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJik7DQorDQorIHByaXZhdGU6DQorICBDRlhfV2lkZVN0cmluZ0MgbV93c0lkZW50aWZpZXI7DQorICBDRlhfUHRyQXJyYXkqIG1fcEFjY2Vzc29yczsNCisgIENYRkFfRk1FeHByZXNzaW9uKiBtX3BMaXN0Ow0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm0yanMuaCBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2ZtMmpzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJmN2JiYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2ZtMmpzLmgKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfRk0ySlNfSA0KKyNkZWZpbmUgX1hGQV9GTTJKU19IDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3V0aWxzLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9vYmplY3QuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY3VtZW50LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9wYXJzZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3NjcmlwdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jZGF0YS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jbGF5b3V0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9sb2NhbGVtZ3IuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2ZtMmpzYXBpLmgiDQorI2RlZmluZSBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRSBcDQorICAoRlhfV1NUUkMoTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZV9mdW5jX3JldHVybl92YWx1ZSIpKQ0KKyNkZWZpbmUgRVhDTEFNQVRJT05fSU5fSURFTlRJRklFUiBcDQorICAoRlhfV1NUUkMoTCJmb3hpdF94ZmFfZm9ybWNhbGNfX2V4Y2xhbWF0aW9uX18iKSkNCit0eXBlZGVmIENGWF9BcnJheVRlbXBsYXRlPENGWF9XaWRlU3RyaW5nQz4gQ0ZYX1dpZGVTdHJpbmdDQXJyYXk7DQorI2luY2x1ZGUgInhmYV9lcnJvci5oIg0KKyNpbmNsdWRlICJ4ZmFfbGV4ZXIuaCINCisjaW5jbHVkZSAieGZhX3NpbXBsZWV4cHJlc3Npb24uaCINCisjaW5jbHVkZSAieGZhX2V4cHJlc3Npb24uaCINCisjaW5jbHVkZSAieGZhX2ZtcGFyc2UuaCINCisjaW5jbHVkZSAieGZhX3Byb2dyYW0uaCINCisjaW5jbHVkZSAieGZhX2ZtMmpzY29udGV4dC5oIg0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2ZtMmpzYXBpLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2ZtMmpzYXBpLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWI2MDBiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm0yanNhcGkuY3BwCkBAIC0wLDAgKzEsNTggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYV9mbTJqcy5oIg0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyIgew0KKyNlbmRpZg0KK2ludDMyX3QgWEZBX0ZNMkpTX1RyYW5zbGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9ybWNhbGMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlVGV4dEJ1ZiYgd3NKYXZhc2NyaXB0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NFcnJvcikgew0KKyAgaWYgKHdzRm9ybWNhbGMuSXNFbXB0eSgpKSB7DQorICAgIHdzSmF2YXNjcmlwdC5DbGVhcigpOw0KKyAgICB3c0Vycm9yLkVtcHR5KCk7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaW50MzJfdCBzdGF0dXMgPSAwOw0KKyAgQ1hGQV9GTVByb2dyYW0gcHJvZ3JhbTsNCisgIHN0YXR1cyA9IHByb2dyYW0uSW5pdCh3c0Zvcm1jYWxjKTsNCisgIGlmIChzdGF0dXMpIHsNCisgICAgd3NFcnJvciA9IHByb2dyYW0uR2V0RXJyb3IoKS5tZXNzYWdlOw0KKyAgICByZXR1cm4gc3RhdHVzOw0KKyAgfQ0KKyAgc3RhdHVzID0gcHJvZ3JhbS5QYXJzZVByb2dyYW0oKTsNCisgIGlmIChzdGF0dXMpIHsNCisgICAgd3NFcnJvciA9IHByb2dyYW0uR2V0RXJyb3IoKS5tZXNzYWdlOw0KKyAgICByZXR1cm4gc3RhdHVzOw0KKyAgfQ0KKyAgcHJvZ3JhbS5UcmFuc2xhdGVQcm9ncmFtKHdzSmF2YXNjcmlwdCk7DQorICByZXR1cm4gMDsNCit9DQorWEZBX0hGTTJKU0NPTlRFWFQgWEZBX0ZNMkpTX0NvbnRleHRDcmVhdGUoKSB7DQorICByZXR1cm4gKFhGQV9IRk0ySlNDT05URVhUKUNYRkFfRk0ySlNDb250ZXh0OjpDcmVhdGUoKTsNCit9DQordm9pZCBYRkFfRk0ySlNfQ29udGV4dEluaXRpYWxpemUoWEZBX0hGTTJKU0NPTlRFWFQgaEZNMkpTQ29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IUlVOVElNRSBoU2NyaXB0UnVudGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IQ09OVEVYVCBoU2NyaXB0Q29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxDWEZBX0ZNMkpTQ29udGV4dCo+KGhGTTJKU0NvbnRleHQpOw0KKyAgcENvbnRleHQtPkluaXRpYWxpemUoaFNjcmlwdFJ1bnRpbWUsIGhTY3JpcHRDb250ZXh0LCBwRG9jdW1lbnQpOw0KK30NCit2b2lkIFhGQV9GTTJKU19HbG9iYWxQcm9wZXJ0eUdldHRlcihYRkFfSEZNMkpTQ09OVEVYVCBoRk0ySlNDb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxDWEZBX0ZNMkpTQ29udGV4dCo+KGhGTTJKU0NvbnRleHQpOw0KKyAgcENvbnRleHQtPkdsb2JhbFByb3BlcnR5R2V0dGVyKGhWYWx1ZSk7DQorfQ0KK3ZvaWQgWEZBX0ZNMkpTX0NvbnRleHRSZWxlYXNlKFhGQV9IRk0ySlNDT05URVhUIGhGTTJKU0NvbnRleHQpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxDWEZBX0ZNMkpTQ29udGV4dCo+KGhGTTJKU0NvbnRleHQpOw0KKyAgcENvbnRleHQtPlJlbGVhc2UoKTsNCit9DQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfQ0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2ZtMmpzY29udGV4dC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbTJqc2NvbnRleHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMmFhMGMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbTJqc2NvbnRleHQuY3BwCkBAIC0wLDAgKzEsNzIwMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhX2ZtMmpzLmgiDQorI2luY2x1ZGUgPHRpbWUuaD4NCisjZGVmaW5lIEZJTkFOQ0lBTF9QUkVDSVNJT04gMC4wMDAwMDAwMQ0KK3N0cnVjdCBYRkFfRk1IdG1sUmVzZXJ2ZUNvZGUgew0KKyAgdWludDMyX3QgbV91Q29kZTsNCisgIGNvbnN0IEZYX1dDSEFSKiBtX2h0bWxSZXNlcnZlOw0KK307DQorc3RydWN0IFhGQV9GTUh0bWxIYXNoZWRSZXNlcnZlQ29kZSB7DQorICB1aW50MzJfdCBtX3VIYXNoOw0KKyAgY29uc3QgRlhfV0NIQVIqIG1faHRtbFJlc2VydmU7DQorICB1aW50MzJfdCBtX3VDb2RlOw0KK307DQorc3RhdGljIFhGQV9GTUh0bWxIYXNoZWRSZXNlcnZlQ29kZSByZXNlcnZlc0ZvckRlY29kZVtdID0gew0KKyAgICB7MHgwMDAxOGI2MiwgTCJNdSIsIDkyNH0sICAgICAgIHsweDAwMDE5MDgzLCBMIk51IiwgOTI1fSwNCisgICAgezB4MDAwMTlhYjksIEwiUGkiLCA5Mjh9LCAgICAgICB7MHgwMDAxYzNjMSwgTCJYaSIsIDkyNn0sDQorICAgIHsweDAwMDIxMGFjLCBMImdlIiwgODgwNX0sICAgICAgezB4MDAwMjEwYmIsIEwiZ3QiLCA2Mn0sDQorICAgIHsweDAwMDIyYTUxLCBMImxlIiwgODgwNH0sICAgICAgezB4MDAwMjJhNjAsIEwibHQiLCA2MH0sDQorICAgIHsweDAwMDIyZjgyLCBMIm11IiwgOTU2fSwgICAgICAgezB4MDAwMjM0OTMsIEwibmUiLCA4ODAwfSwNCisgICAgezB4MDAwMjM0OTcsIEwibmkiLCA4NzE1fSwgICAgICB7MHgwMDAyMzRhMywgTCJudSIsIDk1N30sDQorICAgIHsweDAwMDIzOWMxLCBMIm9yIiwgODc0NH0sICAgICAgezB4MDAwMjNlZDksIEwicGkiLCA5NjB9LA0KKyAgICB7MHgwMDAyNjdlMSwgTCJ4aSIsIDk1OH0sICAgICAgIHsweDAwYzQxNzg5LCBMImxjZWlsIiwgODk2OH0sDQorICAgIHsweDAwZWVmMzRmLCBMInRoZXRhc3ltIiwgOTc3fSwgezB4MDEyZDdlYWQsIEwibGNpcmMiLCAyMDZ9LA0KKyAgICB7MHgwMTYzN2I1NiwgTCJhZ3JhdmUiLCAyMjR9LCAgIHsweDAyMDg1NmRhLCBMImNyYXJyIiwgODYyOX0sDQorICAgIHsweDAyMjE4OGMzLCBMImdhbW1hIiwgOTQ3fSwgICAgezB4MDMzNTg2ZDMsIEwibmJzcCIsIDE2MH0sDQorICAgIHsweDA0ZjRjMzU4LCBMIm5zdWIiLCA4ODM2fSwgICAgezB4MDU4MTQ2NmEsIEwiZGFnZ2VyIiwgODIyNH0sDQorICAgIHsweDA2YjFmNzkwLCBMIm9lbGlnIiwgMzM5fSwgICAgezB4MDZlNDkwZDQsIEwiQ2hpIiwgOTM1fSwNCisgICAgezB4MDcxOGM2YTEsIEwiRVRIIiwgMjA4fSwgICAgICB7MHgwNzE5NmFkYSwgTCJFdGEiLCA5MTl9LA0KKyAgICB7MHgwN2Y2NjdjYSwgTCJVZ3JhdmUiLCAyMTd9LCAgIHsweDA4M2E4YTIxLCBMIlBoaSIsIDkzNH0sDQorICAgIHsweDA4M2FjMjhjLCBMIlBzaSIsIDkzNn0sICAgICAgezB4MDg2ZjI2YTksIEwiUmhvIiwgOTI5fSwNCisgICAgezB4MDg5YjViNTEsIEwiYXJpbmciLCAyMjl9LCAgICB7MHgwOGEzOWY0YSwgTCJUYXUiLCA5MzJ9LA0KKyAgICB7MHgwOGI2MTg4YiwgTCJUSE9STiIsIDIyMn0sICAgIHsweDA5Y2U3OTJhLCBMImljaXJjIiwgMjM4fSwNCisgICAgezB4MDlmOWQ2MWUsIEwiYW1wIiwgMzh9LCAgICAgICB7MHgwOWY5ZGIzMywgTCJhbmQiLCA4NzQzfSwNCisgICAgezB4MDlmOWRiMzYsIEwiYW5nIiwgODczNn0sICAgICB7MHgwYTJlMzUxNCwgTCJjYXAiLCA4NzQ1fSwNCisgICAgezB4MGEyZTU4ZjQsIEwiY2hpIiwgOTY3fSwgICAgICB7MHgwYTJlOWJhOCwgTCJjdXAiLCA4NzQ2fSwNCisgICAgezB4MGE0ODk3ZDAsIEwiZGVnIiwgMTc2fSwgICAgICB7MHgwYTYzMzJmYSwgTCJldGEiLCA5NTF9LA0KKyAgICB7MHgwYTYzMzMwMSwgTCJldGgiLCAyNDB9LCAgICAgIHsweDBhY2M0ZDRiLCBMImludCIsIDg3NDd9LA0KKyAgICB7MHgwYjFiM2QzNSwgTCJsb3oiLCA5Njc0fSwgICAgIHsweDBiMWI0YzhiLCBMImxybSIsIDgyMDZ9LA0KKyAgICB7MHgwYjRmZDliMSwgTCJub3QiLCAxNzJ9LCAgICAgIHsweDBiODQ1MjQxLCBMInBoaSIsIDk2Nn0sDQorICAgIHsweDBiODQ1NzZmLCBMInBpdiIsIDk4Mn0sICAgICAgezB4MGI4NDhhYWMsIEwicHNpIiwgOTY4fSwNCisgICAgezB4MGJiOGRmNWUsIEwicmVnIiwgMTc0fSwgICAgICB7MHgwYmI4ZWVjOSwgTCJyaG8iLCA5NjF9LA0KKyAgICB7MHgwYmI5MDM0YiwgTCJybG0iLCA4MjA3fSwgICAgIHsweDBiZDMzZDE0LCBMInNoeSIsIDE3M30sDQorICAgIHsweDBiZDM0MjI5LCBMInNpbSIsIDg3NjR9LCAgICAgezB4MGJkMzdmYWEsIEwic3ViIiwgODgzNH0sDQorICAgIHsweDBiZDM3ZmI1LCBMInN1bSIsIDg3MjF9LCAgICAgezB4MGJkMzdmYjgsIEwic3VwIiwgODgzNX0sDQorICAgIHsweDBiZWQ2NzZhLCBMInRhdSIsIDk2NH0sICAgICAgezB4MGMwN2YzMmUsIEwidW1sIiwgMTY4fSwNCisgICAgezB4MGM3MTAzMmMsIEwieWVuIiwgMTY1fSwgICAgICB7MHgwYzdmMjg4OSwgTCJzemxpZyIsIDIyM30sDQorICAgIHsweDBjOGJhZGJiLCBMInp3aiIsIDgyMDV9LCAgICAgezB4MTBiYTRkYmEsIEwiRWdyYXZlIiwgMjAwfSwNCisgICAgezB4MTBmMWVhMjQsIEwicGFyYSIsIDE4Mn0sICAgICB7MHgxMGYxZWEzNywgTCJwYXJ0IiwgODcwNn0sDQorICAgIHsweDExNWIyMzM3LCBMInBlcnAiLCA4ODY5fSwgICAgezB4MTJiMTBkMTUsIEwicHJvZCIsIDg3MTl9LA0KKyAgICB7MHgxMmIxMGQyMSwgTCJwcm9wIiwgODczM30sICAgIHsweDEyZGZhOWY0LCBMInJmbG9vciIsIDg5NzF9LA0KKyAgICB7MHgxMmViNDczNiwgTCJBZ3JhdmUiLCAxOTJ9LCAgIHsweDEyZmZmMmI3LCBMInB1bmQiLCAxNjN9LA0KKyAgICB7MHgxM2ZkYTlmMiwgTCJ0aWxkZSIsIDczMn0sICAgIHsweDE0MTdmZDYyLCBMInRpbWVzIiwgMjE1fSwNCisgICAgezB4MTU0ZmM3MjYsIEwiZWNpcmMiLCAyMzR9LCAgICB7MHgxNjVhYTQ1MSwgTCJzaWdtYSIsIDk2M30sDQorICAgIHsweDE3MDkxMjRhLCBMIkRhZ2dlciIsIDgyMjV9LCAgezB4MTkyZjc4ZDUsIEwiaWV4Y2wiLCAxNjF9LA0KKyAgICB7MHgxYjdlZDhkNywgTCJyQXJyIiwgODY1OH0sICAgIHsweDFlYzg4YzY4LCBMInJhbmciLCA5MDAyfSwNCisgICAgezB4MWVjOGEwZjcsIEwicmFyciIsIDg1OTR9LCAgICB7MHgxZWRhMDdmMywgTCJhdGlsZGUiLCAyMjd9LA0KKyAgICB7MHgxZjMxODJjNCwgTCJyZWFsIiwgODQ3Nn0sICAgIHsweDFmYzM0ZjhiLCBMInlhY3V0ZSIsIDI1M30sDQorICAgIHsweDIwZDExNTIyLCBMImFjaXJjIiwgMjI2fSwgICAgezB4MjE5MzNhOWIsIEwicnNhcXVvIiwgODI1MH0sDQorICAgIHsweDIxZjQ0OTA3LCBMInVhY3V0ZSIsIDI1MH0sICAgezB4MjIwY2NhNzIsIEwiYWN1dGUiLCAxODB9LA0KKyAgICB7MHgyNDJjZGVkMSwgTCJhbGVmc3ltIiwgODUwMX0sIHsweDI2NTVjNjZhLCBMImRlbHRhIiwgOTQ4fSwNCisgICAgezB4MjY5ZTRiNGQsIEwiZXhpc3QiLCA4NzA3fSwgICB7MHgyNzMzNzlmYSwgTCJtaWNybyIsIDE4MX0sDQorICAgIHsweDI3YTM3NDQwLCBMImZvcmFsbCIsIDg3MDR9LCAgezB4Mjg1NGU2MmMsIEwibWludXMiLCA4NzIyfSwNCisgICAgezB4Mjg2MzZmODEsIEwiY2VkaWwiLCAxODR9LCAgICB7MHgyODg3MzU3YiwgTCJpYWN1dGUiLCAyMzd9LA0KKyAgICB7MHgyOTk0ZDVmZiwgTCJmcmFjMTIiLCAxODl9LCAgIHsweDI5OTRkNjAxLCBMImZyYWMxNCIsIDE4OH0sDQorICAgIHsweDI5OTRlMDQzLCBMImZyYWMzNCIsIDE5MH0sICAgezB4MmExZmViNDEsIEwibGFtYmRhIiwgOTU1fSwNCisgICAgezB4MmFiMjE1ZjMsIEwiYXBvcyIsIDM5fSwgICAgICB7MHgyYWI4MmVmNywgTCJlYWN1dGUiLCAyMzN9LA0KKyAgICB7MHgyYjM1OTJlZiwgTCJhdW1sIiwgMjI4fSwgICAgIHsweDJjZTkyODczLCBMImFhY3V0ZSIsIDIyNX0sDQorICAgIHsweDJkYWZmNDhhLCBMIm9zbGFzaCIsIDI0OH0sICAgezB4MmVmNjg4ODIsIEwiYWVsaWciLCAyMzB9LA0KKyAgICB7MHgzMDYxZDNkMywgTCJBdGlsZGUiLCAxOTV9LCAgIHsweDMxNGIxYjZiLCBMIllhY3V0ZSIsIDIyMX0sDQorICAgIHsweDMzN2MxNGU3LCBMIlVhY3V0ZSIsIDIxOH0sICAgezB4Mzc2NzZhY2EsIEwiY2VudCIsIDE2Mn0sDQorICAgIHsweDM3ZDBiODQxLCBMImNpcmMiLCA3MTB9LCAgICAgezB4Mzg2ZTc5NDcsIEwiY29uZyIsIDg3NzN9LA0KKyAgICB7MHgzODZlODM5YiwgTCJjb3B5IiwgMTY5fSwgICAgIHsweDNhMGUyMjVhLCBMIkVwc2lsb24iLCA5MTd9LA0KKyAgICB7MHgzYmE3YjcyMSwgTCJMYW1iZGEiLCA5MjN9LCAgIHsweDNiZDlhYmU2LCBMIkFscGhhIiwgOTEzfSwNCisgICAgezB4M2MzZmZhZDcsIEwiRWFjdXRlIiwgMjAxfSwgICB7MHgzY2ZhZjY5ZiwgTCJicnZiYXIiLCAxNjZ9LA0KKyAgICB7MHgzZDU0YTQ4OSwgTCJvbWVnYSIsIDk2OX0sICAgIHsweDNlNzBmNDUzLCBMIkFhY3V0ZSIsIDE5M30sDQorICAgIHsweDNmMzdjMDZhLCBMIk9zbGFzaCIsIDIxNn0sICAgezB4NDBlMWIzNGUsIEwiZGlhbXMiLCA5ODMwfSwNCisgICAgezB4NDE2NTk2ZGYsIEwicGx1c21uIiwgMTc3fSwgICB7MHg0MzU0ZmYxNiwgTCJVY2lyYyIsIDIxOX0sDQorICAgIHsweDQ1NGZjZTZhLCBMIlVwc2lsb24iLCA5MzN9LCAgezB4NDYxMGFkMzUsIEwiZW1zcCIsIDgxOTV9LA0KKyAgICB7MHg0NjJhZmI3NiwgTCJlbnNwIiwgODE5NH0sICAgIHsweDQ2ZTMwMDczLCBMImV1bWwiLCAyMzV9LA0KKyAgICB7MHg0NmUzMWExYiwgTCJldXJvIiwgODM2NH0sICAgIHsweDQ2ZjJlYWRhLCBMImxvd2FzdCIsIDg3Mjd9LA0KKyAgICB7MHg0ZGNhMjZjZiwgTCJBdW1sIiwgMTk2fSwgICAgIHsweDRlMmQ2MDgzLCBMImltYWdlIiwgODQ2NX0sDQorICAgIHsweDRmOTY0ZWU4LCBMIm5vdGluIiwgODcxM30sICAgezB4NTA5MTdhN2EsIEwiZXBzaWxvbiIsIDk0OX0sDQorICAgIHsweDUyZjlhNGNkLCBMIkthcHBhIiwgOTIyfSwgICAgezB4NTQ5NmY0MTAsIEwiT2NpcmMiLCAyMTJ9LA0KKyAgICB7MHg1NjhjYmYzNCwgTCJ6ZXRhIiwgOTUwfSwgICAgIHsweDU3YmFkZDIwLCBMIm50aWxkZSIsIDI0MX0sDQorICAgIHsweDU4NjYyMTA5LCBMInp3bmoiLCA4MjA0fSwgICAgezB4NWIzOTg3MGYsIEwiZW1wdHkiLCA4NzA5fSwNCisgICAgezB4NWJkMzI2OGEsIEwidXBzaWxvbiIsIDk2NX0sICB7MHg1ZTJiZjhhMywgTCJHYW1tYSIsIDkxNX0sDQorICAgIHsweDVmNzNjMTNhLCBMInJzcXVvIiwgODIxN30sICAgezB4NjFmMmJjNGQsIEwiaW90YSIsIDk1M30sDQorICAgIHsweDYyNWJiY2YzLCBMImlzaW4iLCA4NzEyfSwgICAgezB4NjI5MDZkZjcsIEwiaXVtbCIsIDIzOX0sDQorICAgIHsweDY0YTVjYjMxLCBMIkFyaW5nIiwgMTk3fSwgICAgezB4NjZmMjVjNGEsIEwic2JxdW8iLCA4MjE4fSwNCisgICAgezB4Njg1MWFiNjAsIEwic3BhZGVzIiwgOTgyNH0sICB7MHg2OTQyYTkwMCwgTCJOdGlsZGUiLCAyMDl9LA0KKyAgICB7MHg2OTc3OTQ1MywgTCJFdW1sIiwgMjAzfSwgICAgIHsweDZjZGE2ZTIzLCBMImN1cnJlbnQiLCAxNjR9LA0KKyAgICB7MHg3MGI1YjYzNCwgTCJsc3F1byIsIDgyMTZ9LCAgIHsweDcxNWEzNzA2LCBMIkVjaXJjIiwgMjAyfSwNCisgICAgezB4NzFlOGJmOGQsIEwidGRxdW8iLCA4MjIxfSwgICB7MHg3MjY1MTQzMSwgTCJTaWdtYSIsIDkzMX0sDQorICAgIHsweDc1Njk4MTNiLCBMImlxdWVzdCIsIDE5MX0sICAgezB4Nzc2YTQzNmEsIEwiZXF1aXYiLCA4ODAxfSwNCisgICAgezB4NzkyMTUzMTQsIEwiWmV0YSIsIDkxOH0sICAgICB7MHg3OWI4MTIyNCwgTCJvZ3JhdmUiLCAyNDJ9LA0KKyAgICB7MHg3YzJmOGIyMywgTCJtYWNyIiwgMTc1fSwgICAgIHsweDdjZGI4NTAyLCBMIkFjaXJjIiwgMTk0fSwNCisgICAgezB4ODE4NWM2MmUsIEwibmRhc2giLCA4MjExfSwgICB7MHg4MjYwMzY0YSwgTCJEZWx0YSIsIDkxNn0sDQorICAgIHsweDg0NjYxOWFkLCBMIm1kYXNoIiwgODIxMn0sICAgezB4ODU1MGZiNTAsIEwiT0VsaWciLCAzMzh9LA0KKyAgICB7MHg4OGViNWI4NSwgTCJsZHF1byIsIDgyMjB9LCAgIHsweDhiM2ZkZTA0LCBMIk9ncmF2ZSIsIDIxMH0sDQorICAgIHsweDhiYzU3OTRiLCBMIm9yZGYiLCAxNzB9LCAgICAgezB4OGJjNTc5NTIsIEwib3JkbSIsIDE4Nn0sDQorICAgIHsweDhjMTQ5MjNkLCBMIm91bWwiLCAyNDZ9LCAgICAgezB4OGM1YTdjZDYsIEwidGhldGEiLCA5NTJ9LA0KKyAgICB7MHg4ZDYxODEyYiwgTCJ0aG9ybiIsIDI1NH0sICAgIHsweDkxMmI5NWFhLCBMImFzeW1wIiwgODc3Nn0sDQorICAgIHsweDk0N2ZhZjgxLCBMIm1pZGRvdCIsIDE4M30sICAgezB4OTYyOTIwMmUsIEwibGZsb29yIiwgODk3MH0sDQorICAgIHsweDk3MmU5ZWMxLCBMIm90aWxkZSIsIDI0NX0sICAgezB4OTc0OGYyMzEsIEwib3RpbWVzIiwgODg1NX0sDQorICAgIHsweDk5NWYxNDY5LCBMIk9tZWdhIiwgOTM3fSwgICAgezB4OTllYjUzNDksIEwicXVvdCIsIDM0fSwNCisgICAgezB4OWFlYjYzOWUsIEwiaGVsbGlwIiwgODIzMH0sICB7MHhhMGFlMmY4NiwgTCJTY2Fyb24iLCAzNTJ9LA0KKyAgICB7MHhhNGRjYjBkNSwgTCJsc2FxdW8iLCA4MjQ5fSwgIHsweGE1M2RiZjQxLCBMIm9hY3V0ZSIsIDI0M30sDQorICAgIHsweGE1YWU5ZTdiLCBMImJkcXVvIiwgODIyMn0sICAgezB4YTYwMmQ3YmEsIEwic2RvdCIsIDg5MDF9LA0KKyAgICB7MHhhNjFjZTg2ZiwgTCJzZWN0IiwgMTY3fSwgICAgIHsweGE2ZTRjM2Q3LCBMInNpZ21hZiIsIDk2Mn0sDQorICAgIHsweGE3YzFjNzRmLCBMInN1YmUiLCA4ODM4fSwgICAgezB4YTdjMjBlZTksIEwic3VwMSIsIDE4NX0sDQorICAgIHsweGE3YzIwZWVhLCBMInN1cDIiLCAxNzh9LCAgICAgezB4YTdjMjBlZWIsIEwic3VwMyIsIDE3OX0sDQorICAgIHsweGE3YzIwZjFkLCBMInN1cGUiLCA4ODM5fSwgICAgezB4YThiNjZhYTEsIEwiT3RpbGRlIiwgMjEzfSwNCisgICAgezB4YWQ5NThjNDIsIEwiQUVsaWciLCAxOTh9LCAgICB7MHhhZWE5MjYxZCwgTCJPdW1sIiwgMjE0fSwNCisgICAgezB4YjA0MGVhZmEsIEwidUFyciIsIDg2NTd9LCAgICB7MHhiMDdjMmUxYywgTCJiZXRhIiwgOTQ2fSwNCisgICAgezB4YjIyMGU5MmYsIEwiYnVsbCIsIDgyMjZ9LCAgICB7MHhiMjI3NTBjNCwgTCJjY2VkaWwiLCAyMzF9LA0KKyAgICB7MHhiMzhhYjMxYSwgTCJ1YXJyIiwgODU5M30sICAgIHsweGI1OThiNjgzLCBMInV1bWwiLCAyNTJ9LA0KKyAgICB7MHhiNmM1OGIyMSwgTCJPYWN1dGUiLCAyMTF9LCAgIHsweGI2ZDJhNjE3LCBMIm9saW5lIiwgODI1NH0sDQorICAgIHsweGJhOWZkOTg5LCBMImRBcnIiLCA4NjU5fSwgICAgezB4YmI1Y2NkNDEsIEwibGdyYXZlIiwgMjA0fSwNCisgICAgezB4YmQzOWI0NGMsIEwid2VpZXJwIiwgODQ3Mn0sICB7MHhiZGU5YTFhOSwgTCJkYXJyIiwgODU5NX0sDQorICAgIHsweGMwMjdlMzI5LCBMInBlcm1pbCIsIDgyNDB9LCAgezB4YzI0NTEzODksIEwidXBzaWgiLCA5Nzh9LA0KKyAgICB7MHhjM2FmMWNhNCwgTCJDY2VkaWwiLCAxOTl9LCAgIHsweGNkMTY0MjQ5LCBMImZub2YiLCA0MDJ9LA0KKyAgICB7MHhjZjZjODQ2NywgTCJoZWFydHMiLCA5ODI5fSwgIHsweGQxMjI4MzkwLCBMInRyYWRlIiwgODQ4Mn0sDQorICAgIHsweGQxNDYyNDA3LCBMInl1bWwiLCAyNTV9LCAgICAgezB4ZDJjZjIyNTMsIEwib3BsdXMiLCA4ODUzfSwNCisgICAgezB4ZDMxMGMxZmMsIEwiQmV0YSIsIDkxNH0sICAgICB7MHhkNTljNGQ3NCwgTCJpbmZpbiIsIDg3MzR9LA0KKyAgICB7MHhkNjRkNDcwZCwgTCJoQXJyIiwgODY2MH0sICAgIHsweGQ2N2Q5Yzc1LCBMImRpdmlkZSIsIDI0N30sDQorICAgIHsweGQ2OThkZDM3LCBMIk9taWNyb24iLCA5Mjd9LCAgezB4ZDgyZDRhNjMsIEwiVXVtbCIsIDIyMH0sDQorICAgIHsweGQ5OTcwZjJkLCBMImhhcnIiLCA4NTk2fSwgICAgezB4ZGE5MWZkOTksIEwiY2x1YnMiLCA5ODI3fSwNCisgICAgezB4ZGJlNWJkY2MsIEwidGhlcmU0IiwgODc1Nn0sICB7MHhkZDc2NzFiZCwgTCJwcmltZSIsIDgyNDJ9LA0KKyAgICB7MHhkZmNmM2MwNiwgTCJhbHBoYSIsIDk0NX0sICAgIHsweGUwMjEzMDYzLCBMInNhcm9uIiwgMzUzfSwNCisgICAgezB4ZTE5MTFkODMsIEwicmFkaWMiLCA4NzMwfSwgICB7MHhlMmU3NTQ2OCwgTCJyYXF1byIsIDE4N30sDQorICAgIHsweGU2ZTI3YTVlLCBMImxhY3V0ZSIsIDIwNX0sICAgezB4ZTc0YThmMzYsIEwidWNpcmMiLCAyNTF9LA0KKyAgICB7MHhlODY0ZWNiNiwgTCJUaGV0YSIsIDkyMH0sICAgIHsweGVjZGRkZTVlLCBMIm5hYmxhIiwgODcxMX0sDQorICAgIHsweGVkMWMzNTU3LCBMIm9taWNyb24iLCA5NTl9LCAgezB4ZWY4MjIyOGYsIEwicmNlaWwiLCA4OTY5fSwNCisgICAgezB4ZjFmYWI0OTEsIEwibEFyciIsIDg2NTZ9LCAgICB7MHhmM2RhYjdlNywgTCJZdW1sIiwgMzc2fSwNCisgICAgezB4ZjQyOTQ5NjIsIEwibGFxdW8iLCAxNzF9LCAgICB7MHhmNTQ0NjgyMiwgTCJsYW5nIiwgOTAwMX0sDQorICAgIHsweGY1NDQ3Y2IxLCBMImxhcnIiLCA4NTkyfSwgICAgezB4ZjY2ZTliZWEsIEwidWdyYXZlIiwgMjQ5fSwNCisgICAgezB4ZjZiNGNlNzAsIEwibG90YSIsIDkyMX0sICAgICB7MHhmNmVmMzRlZCwgTCJrYXBwYSIsIDk1NH0sDQorICAgIHsweGY3MmEzYTU2LCBMInRoaW5zcCIsIDgyMDF9LCAgezB4Zjc1MjgwMWEsIEwibHVtbCIsIDIwN30sDQorICAgIHsweGY4OGM4NDMwLCBMIm9jaXJjIiwgMjQ0fSwgICAgezB4Zjk2NzYxNzgsIEwiZnJhc2wiLCA4MjYwfSwNCisgICAgezB4ZmQwMTg4NWUsIEwiaWdyYXZlIiwgMjM2fSwgICB7MHhmZjMyODFkYSwgTCJlZ3JhdmUiLCAyMzJ9LA0KK307DQorc3RhdGljIFhGQV9GTUh0bWxSZXNlcnZlQ29kZSByZXNlcnZlc0ZvckVuY29kZVtdID0gew0KKyAgICB7MzQsIEwicXVvdCJ9LCAgICAgezM4LCBMImFtcCJ9LCAgICAgIHszOSwgTCJhcG9zIn0sDQorICAgIHs2MCwgTCJsdCJ9LCAgICAgICB7NjIsIEwiZ3QifSwgICAgICAgezE2MCwgTCJuYnNwIn0sDQorICAgIHsxNjEsIEwiaWV4Y2wifSwgICB7MTYyLCBMImNlbnQifSwgICAgezE2MywgTCJwdW5kIn0sDQorICAgIHsxNjQsIEwiY3VycmVudCJ9LCB7MTY1LCBMInllbiJ9LCAgICAgezE2NiwgTCJicnZiYXIifSwNCisgICAgezE2NywgTCJzZWN0In0sICAgIHsxNjgsIEwidW1sIn0sICAgICB7MTY5LCBMImNvcHkifSwNCisgICAgezE3MCwgTCJvcmRmIn0sICAgIHsxNzEsIEwibGFxdW8ifSwgICB7MTcyLCBMIm5vdCJ9LA0KKyAgICB7MTczLCBMInNoeSJ9LCAgICAgezE3NCwgTCJyZWcifSwgICAgIHsxNzUsIEwibWFjciJ9LA0KKyAgICB7MTc2LCBMImRlZyJ9LCAgICAgezE3NywgTCJwbHVzbW4ifSwgIHsxNzgsIEwic3VwMiJ9LA0KKyAgICB7MTc5LCBMInN1cDMifSwgICAgezE4MCwgTCJhY3V0ZSJ9LCAgIHsxODEsIEwibWljcm8ifSwNCisgICAgezE4MiwgTCJwYXJhIn0sICAgIHsxODMsIEwibWlkZG90In0sICB7MTg0LCBMImNlZGlsIn0sDQorICAgIHsxODUsIEwic3VwMSJ9LCAgICB7MTg2LCBMIm9yZG0ifSwgICAgezE4NywgTCJyYXF1byJ9LA0KKyAgICB7MTg4LCBMImZyYWMxNCJ9LCAgezE4OSwgTCJmcmFjMTIifSwgIHsxOTAsIEwiZnJhYzM0In0sDQorICAgIHsxOTEsIEwiaXF1ZXN0In0sICB7MTkyLCBMIkFncmF2ZSJ9LCAgezE5MywgTCJBYWN1dGUifSwNCisgICAgezE5NCwgTCJBY2lyYyJ9LCAgIHsxOTUsIEwiQXRpbGRlIn0sICB7MTk2LCBMIkF1bWwifSwNCisgICAgezE5NywgTCJBcmluZyJ9LCAgIHsxOTgsIEwiQUVsaWcifSwgICB7MTk5LCBMIkNjZWRpbCJ9LA0KKyAgICB7MjAwLCBMIkVncmF2ZSJ9LCAgezIwMSwgTCJFYWN1dGUifSwgIHsyMDIsIEwiRWNpcmMifSwNCisgICAgezIwMywgTCJFdW1sIn0sICAgIHsyMDQsIEwibGdyYXZlIn0sICB7MjA1LCBMImxhY3V0ZSJ9LA0KKyAgICB7MjA2LCBMImxjaXJjIn0sICAgezIwNywgTCJsdW1sIn0sICAgIHsyMDgsIEwiRVRIIn0sDQorICAgIHsyMDksIEwiTnRpbGRlIn0sICB7MjEwLCBMIk9ncmF2ZSJ9LCAgezIxMSwgTCJPYWN1dGUifSwNCisgICAgezIxMiwgTCJPY2lyYyJ9LCAgIHsyMTMsIEwiT3RpbGRlIn0sICB7MjE0LCBMIk91bWwifSwNCisgICAgezIxNSwgTCJ0aW1lcyJ9LCAgIHsyMTYsIEwiT3NsYXNoIn0sICB7MjE3LCBMIlVncmF2ZSJ9LA0KKyAgICB7MjE4LCBMIlVhY3V0ZSJ9LCAgezIxOSwgTCJVY2lyYyJ9LCAgIHsyMjAsIEwiVXVtbCJ9LA0KKyAgICB7MjIxLCBMIllhY3V0ZSJ9LCAgezIyMiwgTCJUSE9STiJ9LCAgIHsyMjMsIEwic3psaWcifSwNCisgICAgezIyNCwgTCJhZ3JhdmUifSwgIHsyMjUsIEwiYWFjdXRlIn0sICB7MjI2LCBMImFjaXJjIn0sDQorICAgIHsyMjcsIEwiYXRpbGRlIn0sICB7MjI4LCBMImF1bWwifSwgICAgezIyOSwgTCJhcmluZyJ9LA0KKyAgICB7MjMwLCBMImFlbGlnIn0sICAgezIzMSwgTCJjY2VkaWwifSwgIHsyMzIsIEwiZWdyYXZlIn0sDQorICAgIHsyMzMsIEwiZWFjdXRlIn0sICB7MjM0LCBMImVjaXJjIn0sICAgezIzNSwgTCJldW1sIn0sDQorICAgIHsyMzYsIEwiaWdyYXZlIn0sICB7MjM3LCBMImlhY3V0ZSJ9LCAgezIzOCwgTCJpY2lyYyJ9LA0KKyAgICB7MjM5LCBMIml1bWwifSwgICAgezI0MCwgTCJldGgifSwgICAgIHsyNDEsIEwibnRpbGRlIn0sDQorICAgIHsyNDIsIEwib2dyYXZlIn0sICB7MjQzLCBMIm9hY3V0ZSJ9LCAgezI0NCwgTCJvY2lyYyJ9LA0KKyAgICB7MjQ1LCBMIm90aWxkZSJ9LCAgezI0NiwgTCJvdW1sIn0sICAgIHsyNDcsIEwiZGl2aWRlIn0sDQorICAgIHsyNDgsIEwib3NsYXNoIn0sICB7MjQ5LCBMInVncmF2ZSJ9LCAgezI1MCwgTCJ1YWN1dGUifSwNCisgICAgezI1MSwgTCJ1Y2lyYyJ9LCAgIHsyNTIsIEwidXVtbCJ9LCAgICB7MjUzLCBMInlhY3V0ZSJ9LA0KKyAgICB7MjU0LCBMInRob3JuIn0sICAgezI1NSwgTCJ5dW1sIn0sICAgIHszMzgsIEwiT0VsaWcifSwNCisgICAgezMzOSwgTCJvZWxpZyJ9LCAgIHszNTIsIEwiU2Nhcm9uIn0sICB7MzUzLCBMInNhcm9uIn0sDQorICAgIHszNzYsIEwiWXVtbCJ9LCAgICB7NDAyLCBMImZub2YifSwgICAgezcxMCwgTCJjaXJjIn0sDQorICAgIHs3MzIsIEwidGlsZGUifSwgICB7OTEzLCBMIkFscGhhIn0sICAgezkxNCwgTCJCZXRhIn0sDQorICAgIHs5MTUsIEwiR2FtbWEifSwgICB7OTE2LCBMIkRlbHRhIn0sICAgezkxNywgTCJFcHNpbG9uIn0sDQorICAgIHs5MTgsIEwiWmV0YSJ9LCAgICB7OTE5LCBMIkV0YSJ9LCAgICAgezkyMCwgTCJUaGV0YSJ9LA0KKyAgICB7OTIxLCBMImxvdGEifSwgICAgezkyMiwgTCJLYXBwYSJ9LCAgIHs5MjMsIEwiTGFtYmRhIn0sDQorICAgIHs5MjQsIEwiTXUifSwgICAgICB7OTI1LCBMIk51In0sICAgICAgezkyNiwgTCJYaSJ9LA0KKyAgICB7OTI3LCBMIk9taWNyb24ifSwgezkyOCwgTCJQaSJ9LCAgICAgIHs5MjksIEwiUmhvIn0sDQorICAgIHs5MzEsIEwiU2lnbWEifSwgICB7OTMyLCBMIlRhdSJ9LCAgICAgezkzMywgTCJVcHNpbG9uIn0sDQorICAgIHs5MzQsIEwiUGhpIn0sICAgICB7OTM1LCBMIkNoaSJ9LCAgICAgezkzNiwgTCJQc2kifSwNCisgICAgezkzNywgTCJPbWVnYSJ9LCAgIHs5NDUsIEwiYWxwaGEifSwgICB7OTQ2LCBMImJldGEifSwNCisgICAgezk0NywgTCJnYW1tYSJ9LCAgIHs5NDgsIEwiZGVsdGEifSwgICB7OTQ5LCBMImVwc2lsb24ifSwNCisgICAgezk1MCwgTCJ6ZXRhIn0sICAgIHs5NTEsIEwiZXRhIn0sICAgICB7OTUyLCBMInRoZXRhIn0sDQorICAgIHs5NTMsIEwiaW90YSJ9LCAgICB7OTU0LCBMImthcHBhIn0sICAgezk1NSwgTCJsYW1iZGEifSwNCisgICAgezk1NiwgTCJtdSJ9LCAgICAgIHs5NTcsIEwibnUifSwgICAgICB7OTU4LCBMInhpIn0sDQorICAgIHs5NTksIEwib21pY3JvbiJ9LCB7OTYwLCBMInBpIn0sICAgICAgezk2MSwgTCJyaG8ifSwNCisgICAgezk2MiwgTCJzaWdtYWYifSwgIHs5NjMsIEwic2lnbWEifSwgICB7OTY0LCBMInRhdSJ9LA0KKyAgICB7OTY1LCBMInVwc2lsb24ifSwgezk2NiwgTCJwaGkifSwgICAgIHs5NjcsIEwiY2hpIn0sDQorICAgIHs5NjgsIEwicHNpIn0sICAgICB7OTY5LCBMIm9tZWdhIn0sICAgezk3NywgTCJ0aGV0YXN5bSJ9LA0KKyAgICB7OTc4LCBMInVwc2loIn0sICAgezk4MiwgTCJwaXYifSwgICAgIHs4MTk0LCBMImVuc3AifSwNCisgICAgezgxOTUsIEwiZW1zcCJ9LCAgIHs4MjAxLCBMInRoaW5zcCJ9LCB7ODIwNCwgTCJ6d25qIn0sDQorICAgIHs4MjA1LCBMInp3aiJ9LCAgICB7ODIwNiwgTCJscm0ifSwgICAgezgyMDcsIEwicmxtIn0sDQorICAgIHs4MjExLCBMIm5kYXNoIn0sICB7ODIxMiwgTCJtZGFzaCJ9LCAgezgyMTYsIEwibHNxdW8ifSwNCisgICAgezgyMTcsIEwicnNxdW8ifSwgIHs4MjE4LCBMInNicXVvIn0sICB7ODIyMCwgTCJsZHF1byJ9LA0KKyAgICB7ODIyMSwgTCJ0ZHF1byJ9LCAgezgyMjIsIEwiYmRxdW8ifSwgIHs4MjI0LCBMImRhZ2dlciJ9LA0KKyAgICB7ODIyNSwgTCJEYWdnZXIifSwgezgyMjYsIEwiYnVsbCJ9LCAgIHs4MjMwLCBMImhlbGxpcCJ9LA0KKyAgICB7ODI0MCwgTCJwZXJtaWwifSwgezgyNDIsIEwicHJpbWUifSwgIHs4MjQ5LCBMImxzYXF1byJ9LA0KKyAgICB7ODI1MCwgTCJyc2FxdW8ifSwgezgyNTQsIEwib2xpbmUifSwgIHs4MjYwLCBMImZyYXNsIn0sDQorICAgIHs4MzY0LCBMImV1cm8ifSwgICB7ODQ2NSwgTCJpbWFnZSJ9LCAgezg0NzIsIEwid2VpZXJwIn0sDQorICAgIHs4NDc2LCBMInJlYWwifSwgICB7ODQ4MiwgTCJ0cmFkZSJ9LCAgezg1MDEsIEwiYWxlZnN5bSJ9LA0KKyAgICB7ODU5MiwgTCJsYXJyIn0sICAgezg1OTMsIEwidWFyciJ9LCAgIHs4NTk0LCBMInJhcnIifSwNCisgICAgezg1OTUsIEwiZGFyciJ9LCAgIHs4NTk2LCBMImhhcnIifSwgICB7ODYyOSwgTCJjcmFyciJ9LA0KKyAgICB7ODY1NiwgTCJsQXJyIn0sICAgezg2NTcsIEwidUFyciJ9LCAgIHs4NjU4LCBMInJBcnIifSwNCisgICAgezg2NTksIEwiZEFyciJ9LCAgIHs4NjYwLCBMImhBcnIifSwgICB7ODcwNCwgTCJmb3JhbGwifSwNCisgICAgezg3MDYsIEwicGFydCJ9LCAgIHs4NzA3LCBMImV4aXN0In0sICB7ODcwOSwgTCJlbXB0eSJ9LA0KKyAgICB7ODcxMSwgTCJuYWJsYSJ9LCAgezg3MTIsIEwiaXNpbiJ9LCAgIHs4NzEzLCBMIm5vdGluIn0sDQorICAgIHs4NzE1LCBMIm5pIn0sICAgICB7ODcxOSwgTCJwcm9kIn0sICAgezg3MjEsIEwic3VtIn0sDQorICAgIHs4NzIyLCBMIm1pbnVzIn0sICB7ODcyNywgTCJsb3dhc3QifSwgezg3MzAsIEwicmFkaWMifSwNCisgICAgezg3MzMsIEwicHJvcCJ9LCAgIHs4NzM0LCBMImluZmluIn0sICB7ODczNiwgTCJhbmcifSwNCisgICAgezg3NDMsIEwiYW5kIn0sICAgIHs4NzQ0LCBMIm9yIn0sICAgICB7ODc0NSwgTCJjYXAifSwNCisgICAgezg3NDYsIEwiY3VwIn0sICAgIHs4NzQ3LCBMImludCJ9LCAgICB7ODc1NiwgTCJ0aGVyZTQifSwNCisgICAgezg3NjQsIEwic2ltIn0sICAgIHs4NzczLCBMImNvbmcifSwgICB7ODc3NiwgTCJhc3ltcCJ9LA0KKyAgICB7ODgwMCwgTCJuZSJ9LCAgICAgezg4MDEsIEwiZXF1aXYifSwgIHs4ODA0LCBMImxlIn0sDQorICAgIHs4ODA1LCBMImdlIn0sICAgICB7ODgzNCwgTCJzdWIifSwgICAgezg4MzUsIEwic3VwIn0sDQorICAgIHs4ODM2LCBMIm5zdWIifSwgICB7ODgzOCwgTCJzdWJlIn0sICAgezg4MzksIEwic3VwZSJ9LA0KKyAgICB7ODg1MywgTCJvcGx1cyJ9LCAgezg4NTUsIEwib3RpbWVzIn0sIHs4ODY5LCBMInBlcnAifSwNCisgICAgezg5MDEsIEwic2RvdCJ9LCAgIHs4OTY4LCBMImxjZWlsIn0sICB7ODk2OSwgTCJyY2VpbCJ9LA0KKyAgICB7ODk3MCwgTCJsZmxvb3IifSwgezg5NzEsIEwicmZsb29yIn0sIHs5MDAxLCBMImxhbmcifSwNCisgICAgezkwMDIsIEwicmFuZyJ9LCAgIHs5Njc0LCBMImxveiJ9LCAgICB7OTgyNCwgTCJzcGFkZXMifSwNCisgICAgezk4MjcsIEwiY2x1YnMifSwgIHs5ODI5LCBMImhlYXJ0cyJ9LCB7OTgzMCwgTCJkaWFtcyJ9LA0KK307DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6QWJzKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMSkgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gYXJncy5HZXRWYWx1ZSgwKTsNCisgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWF9ET1VCTEUgZFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ09uZSk7DQorICAgICAgaWYgKGRWYWx1ZSA8IDApIHsNCisgICAgICAgIGRWYWx1ZSA9IC1kVmFsdWU7DQorICAgICAgfQ0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldERvdWJsZShhcmdzLkdldFJldHVyblZhbHVlKCksIGRWYWx1ZSk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiQWJzIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkF2ZyhGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgdWludDMyX3QgdUNvdW50ID0gMDsNCisgIEZYX0RPVUJMRSBkU3VtID0gMC4wOw0KKyAgaWYgKGFyZ2MgPj0gMSkgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVmFsdWUgPSAwOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsNCisgICAgICBhcmdWYWx1ZSA9IGFyZ3MuR2V0VmFsdWUoaSk7DQorICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdWYWx1ZSkpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVmFsdWUpOw0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ1ZhbHVlKSkgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGxlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoYXJnVmFsdWUsICJsZW5ndGgiLCBsZW5ndGhWYWx1ZSk7DQorICAgICAgICBpbnQzMl90IGlMZW5ndGggPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIobGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZW5ndGhWYWx1ZSk7DQorICAgICAgICBpZiAoaUxlbmd0aCA+IDIpIHsNCisgICAgICAgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVmFsdWUsIDEsIHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICBGWEpTRV9IVkFMVUUganNPYmplY3RWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwocHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgICBmb3IgKGludDMyX3QgaiA9IDI7IGogPCBpTGVuZ3RoOyBqKyspIHsNCisgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgaiwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgZGVmYXVsdFByb3BWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoanNPYmplY3RWYWx1ZSwgZGVmYXVsdFByb3BWYWx1ZSk7DQorICAgICAgICAgICAgICBpZiAoIUZYSlNFX1ZhbHVlX0lzTnVsbChkZWZhdWx0UHJvcFZhbHVlKSkgew0KKyAgICAgICAgICAgICAgICBkU3VtICs9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBkZWZhdWx0UHJvcFZhbHVlKTsNCisgICAgICAgICAgICAgICAgdUNvdW50Kys7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGRlZmF1bHRQcm9wVmFsdWUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlTdHIpOw0KKyAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICBmb3IgKGludDMyX3QgaiA9IDI7IGogPCBpTGVuZ3RoOyBqKyspIHsNCisgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgaiwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzT2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgIGlmICghRlhKU0VfVmFsdWVfSXNOdWxsKG5ld1Byb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICAgICAgICAgIGRTdW0gKz0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICB1Q291bnQrKzsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBkU3VtICs9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdWYWx1ZSk7DQorICAgICAgICB1Q291bnQrKzsNCisgICAgICB9DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdWYWx1ZSk7DQorICAgIH0NCisgICAgYXJnVmFsdWUgPSAwOw0KKyAgfQ0KKyAgaWYgKDAgPT0gdUNvdW50KSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgIH0gZWxzZSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldERvdWJsZShhcmdzLkdldFJldHVyblZhbHVlKCksIGRTdW0gLyB1Q291bnQpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpDZWlsKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMSkgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdWYWx1ZSkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0RmxvYXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX2NlaWwoSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnVmFsdWUpKSk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdWYWx1ZSk7DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiQ2VpbCIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpDb3VudChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIHVpbnQzMl90IHVDb3VudCA9IDA7DQorICBGWEpTRV9IVkFMVUUgYXJnVmFsdWUgPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7DQorICAgIGFyZ1ZhbHVlID0gYXJncy5HZXRWYWx1ZShpKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdWYWx1ZSkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1ZhbHVlKTsNCisgICAgICBjb250aW51ZTsNCisgICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ1ZhbHVlKSkgew0KKyAgICAgIEZYSlNFX0hWQUxVRSBsZW5ndGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChhcmdWYWx1ZSwgImxlbmd0aCIsIGxlbmd0aFZhbHVlKTsNCisgICAgICBpbnQzMl90IGlMZW5ndGggPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIobGVuZ3RoVmFsdWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVuZ3RoVmFsdWUpOw0KKyAgICAgIGlmIChpTGVuZ3RoID4gMikgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGpzT2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1ZhbHVlLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgMiwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMjsgaSA8IGlMZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgaSwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGpzT2JqZWN0VmFsdWUsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgIGlmICghRlhKU0VfVmFsdWVfSXNOdWxsKG5ld1Byb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICAgICAgICB1Q291bnQrKzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHByb3BlcnR5U3RyOw0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlTdHIpOw0KKyAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDI7IGkgPCBpTGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVmFsdWUsIGksIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoanNPYmplY3RWYWx1ZSwgcHJvcGVydHlTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICB1Q291bnQgKz0gKEZYSlNFX1ZhbHVlX0lzTnVsbChuZXdQcm9wZXJ0eVZhbHVlKSA/IDAgOiAxKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNPYmplY3RWYWx1ZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzT2JqZWN0KGFyZ1ZhbHVlKSkgew0KKyAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnVmFsdWUsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgIGlmICghRlhKU0VfVmFsdWVfSXNOdWxsKG5ld1Byb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICB1Q291bnQrKzsNCisgICAgICB9DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICB1Q291bnQrKzsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1ZhbHVlKTsNCisgIH0NCisgIGFyZ1ZhbHVlID0gMDsNCisgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoaW50MzJfdCl1Q291bnQpOw0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpGbG9vcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMSkgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdWYWx1ZSkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0RmxvYXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX2Zsb29yKEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ1ZhbHVlKSkpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVmFsdWUpOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkZsb29yIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Ok1heChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgdWludDMyX3QgdUNvdW50ID0gMDsNCisgIEZYX0RPVUJMRSBkTWF4VmFsdWUgPSAwLjA7DQorICBGWEpTRV9IVkFMVUUgYXJnVmFsdWUgPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7DQorICAgIGFyZ1ZhbHVlID0gYXJncy5HZXRWYWx1ZShpKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdWYWx1ZSkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1ZhbHVlKTsNCisgICAgICBjb250aW51ZTsNCisgICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ1ZhbHVlKSkgew0KKyAgICAgIEZYSlNFX0hWQUxVRSBsZW5ndGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChhcmdWYWx1ZSwgImxlbmd0aCIsIGxlbmd0aFZhbHVlKTsNCisgICAgICBpbnQzMl90IGlMZW5ndGggPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIobGVuZ3RoVmFsdWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVuZ3RoVmFsdWUpOw0KKyAgICAgIGlmIChpTGVuZ3RoID4gMikgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGpzT2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1ZhbHVlLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgMiwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMjsgaSA8IGlMZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgaSwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGpzT2JqZWN0VmFsdWUsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgIGlmICghRlhKU0VfVmFsdWVfSXNOdWxsKG5ld1Byb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICAgICAgICB1Q291bnQrKzsNCisgICAgICAgICAgICAgIGlmICh1Q291bnQgPT0gMSkgew0KKyAgICAgICAgICAgICAgICBkTWF4VmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBGWF9ET1VCTEUgZFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICBpZiAoZE1heFZhbHVlIDwgZFZhbHVlKSB7DQorICAgICAgICAgICAgICAgICAgZE1heFZhbHVlID0gZFZhbHVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKHByb3BlcnR5VmFsdWUsIHByb3BlcnR5U3RyKTsNCisgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAyOyBpIDwgaUxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1ZhbHVlLCBpLCBqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzT2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgaWYgKCFGWEpTRV9WYWx1ZV9Jc051bGwobmV3UHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgICAgIHVDb3VudCsrOw0KKyAgICAgICAgICAgICAgaWYgKHVDb3VudCA9PSAxKSB7DQorICAgICAgICAgICAgICAgIGRNYXhWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIEZYX0RPVUJMRSBkVmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICAgIGlmIChkTWF4VmFsdWUgPCBkVmFsdWUpIHsNCisgICAgICAgICAgICAgICAgICBkTWF4VmFsdWUgPSBkVmFsdWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJvcGVydHlWYWx1ZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc09iamVjdChhcmdWYWx1ZSkpIHsNCisgICAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGFyZ1ZhbHVlLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICBpZiAoIUZYSlNFX1ZhbHVlX0lzTnVsbChuZXdQcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgICAgdUNvdW50Kys7DQorICAgICAgICBpZiAodUNvdW50ID09IDEpIHsNCisgICAgICAgICAgZE1heFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgRlhfRE9VQkxFIGRWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgaWYgKGRNYXhWYWx1ZSA8IGRWYWx1ZSkgew0KKyAgICAgICAgICAgIGRNYXhWYWx1ZSA9IGRWYWx1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHVDb3VudCsrOw0KKyAgICAgIGlmICh1Q291bnQgPT0gMSkgew0KKyAgICAgICAgZE1heFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1ZhbHVlKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfRE9VQkxFIGRWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdWYWx1ZSk7DQorICAgICAgICBpZiAoZE1heFZhbHVlIDwgZFZhbHVlKSB7DQorICAgICAgICAgIGRNYXhWYWx1ZSA9IGRWYWx1ZTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdWYWx1ZSk7DQorICB9DQorICBhcmdWYWx1ZSA9IDA7DQorICBpZiAodUNvdW50KSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldERvdWJsZShhcmdzLkdldFJldHVyblZhbHVlKCksIGRNYXhWYWx1ZSk7DQorICB9IGVsc2Ugew0KKyAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Ok1pbihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgdWludDMyX3QgdUNvdW50ID0gMDsNCisgIEZYX0RPVUJMRSBkTWluVmFsdWUgPSAwLjA7DQorICBGWEpTRV9IVkFMVUUgYXJnVmFsdWUgPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7DQorICAgIGFyZ1ZhbHVlID0gYXJncy5HZXRWYWx1ZShpKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdWYWx1ZSkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1ZhbHVlKTsNCisgICAgICBjb250aW51ZTsNCisgICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ1ZhbHVlKSkgew0KKyAgICAgIEZYSlNFX0hWQUxVRSBsZW5ndGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChhcmdWYWx1ZSwgImxlbmd0aCIsIGxlbmd0aFZhbHVlKTsNCisgICAgICBpbnQzMl90IGlMZW5ndGggPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIobGVuZ3RoVmFsdWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVuZ3RoVmFsdWUpOw0KKyAgICAgIGlmIChpTGVuZ3RoID4gMikgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGpzT2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1ZhbHVlLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgMiwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMjsgaSA8IGlMZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgaSwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGpzT2JqZWN0VmFsdWUsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgIGlmICghRlhKU0VfVmFsdWVfSXNOdWxsKG5ld1Byb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICAgICAgICB1Q291bnQrKzsNCisgICAgICAgICAgICAgIGlmICh1Q291bnQgPT0gMSkgew0KKyAgICAgICAgICAgICAgICBkTWluVmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBGWF9ET1VCTEUgZFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgICBpZiAoZE1pblZhbHVlID4gZFZhbHVlKSB7DQorICAgICAgICAgICAgICAgICAgZE1pblZhbHVlID0gZFZhbHVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKHByb3BlcnR5VmFsdWUsIHByb3BlcnR5U3RyKTsNCisgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAyOyBpIDwgaUxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1ZhbHVlLCBpLCBqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzT2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgaWYgKCFGWEpTRV9WYWx1ZV9Jc051bGwobmV3UHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgICAgIHVDb3VudCsrOw0KKyAgICAgICAgICAgICAgaWYgKHVDb3VudCA9PSAxKSB7DQorICAgICAgICAgICAgICAgIGRNaW5WYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIEZYX0RPVUJMRSBkVmFsdWUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICAgIGlmIChkTWluVmFsdWUgPiBkVmFsdWUpIHsNCisgICAgICAgICAgICAgICAgICBkTWluVmFsdWUgPSBkVmFsdWU7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJvcGVydHlWYWx1ZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc09iamVjdChhcmdWYWx1ZSkpIHsNCisgICAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGFyZ1ZhbHVlLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICBpZiAoIUZYSlNFX1ZhbHVlX0lzTnVsbChuZXdQcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgICAgdUNvdW50Kys7DQorICAgICAgICBpZiAodUNvdW50ID09IDEpIHsNCisgICAgICAgICAgZE1pblZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgRlhfRE9VQkxFIGRWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgaWYgKGRNaW5WYWx1ZSA+IGRWYWx1ZSkgew0KKyAgICAgICAgICAgIGRNaW5WYWx1ZSA9IGRWYWx1ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHVDb3VudCsrOw0KKyAgICAgIGlmICh1Q291bnQgPT0gMSkgew0KKyAgICAgICAgZE1pblZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1ZhbHVlKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfRE9VQkxFIGRWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdWYWx1ZSk7DQorICAgICAgICBpZiAoZE1pblZhbHVlID4gZFZhbHVlKSB7DQorICAgICAgICAgIGRNaW5WYWx1ZSA9IGRWYWx1ZTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdWYWx1ZSk7DQorICB9DQorICBhcmdWYWx1ZSA9IDA7DQorICBpZiAodUNvdW50KSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldERvdWJsZShhcmdzLkdldFJldHVyblZhbHVlKCksIGRNaW5WYWx1ZSk7DQorICB9IGVsc2Ugew0KKyAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Ok1vZChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAyKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVHdvID0gYXJncy5HZXRWYWx1ZSgxKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdPbmUpIHx8IEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdUd28pKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYX0RPVUJMRSBkRGl2aWRlbmQgPSAwLjA7DQorICAgICAgRlhfRE9VQkxFIGREaXZpZG9yID0gMC4wOw0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ09uZSkpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBsZW5ndGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ09uZSwgImxlbmd0aCIsIGxlbmd0aFZhbHVlKTsNCisgICAgICAgIGludDMyX3QgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxlbmd0aFZhbHVlKTsNCisgICAgICAgIGlmIChpTGVuZ3RoID4gMikgew0KKyAgICAgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgIEZYSlNFX0hWQUxVRSBqc09iamVjdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ09uZSwgMSwgcHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdPbmUsIDIsIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICAgICAgZERpdmlkZW5kID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIHByb3BlcnR5U3RyOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVN0cik7DQorICAgICAgICAgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoanNPYmplY3RWYWx1ZSwgcHJvcGVydHlTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICBkRGl2aWRlbmQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBkRGl2aWRlbmQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnT25lKTsNCisgICAgICB9DQorICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnVHdvKSkgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGxlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoYXJnVHdvLCAibGVuZ3RoIiwgbGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgaW50MzJfdCBpTGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlbmd0aFZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgaWYgKGlMZW5ndGggPiAyKSB7DQorICAgICAgICAgIEZYSlNFX0hWQUxVRSBwcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgRlhKU0VfSFZBTFVFIGpzT2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVHdvLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1R3bywgMiwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwocHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgICBkRGl2aWRvciA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlTdHIpOw0KKyAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzT2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgZERpdmlkb3IgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBkRGl2aWRvciA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdUd28pOw0KKyAgICAgIH0NCisgICAgICBpZiAoZERpdmlkb3IpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldERvdWJsZSgNCisgICAgICAgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgZERpdmlkZW5kIC0gZERpdmlkb3IgKiAoaW50MzJfdCkoZERpdmlkZW5kIC8gZERpdmlkb3IpKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfRElWSURFX1pFUk8pOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCisgIH0gZWxzZSB7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJNb2QiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6Um91bmQoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICB1aW50OF90IHVQcmVjaXNpb24gPSAwOw0KKyAgaWYgKGFyZ2MgPT0gMSkgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gYXJncy5HZXRWYWx1ZSgwKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdPbmUpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYX0RPVUJMRSBkVmFsdWUgPSAwLjA7DQorICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnT25lKSkgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGpzT2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ09uZSwgMSwgcHJvcGVydHlWYWx1ZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnT25lLCAyLCBqc09iamVjdFZhbHVlKTsNCisgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwocHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgZFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcHJvcGVydHlTdHI7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVN0cik7DQorICAgICAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChqc09iamVjdFZhbHVlLCBwcm9wZXJ0eVN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgZFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNPYmplY3RWYWx1ZSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGRWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdPbmUpOw0KKyAgICAgIH0NCisgICAgICBDRlhfRGVjaW1hbCBkZWNpbWFsVmFsdWUoKEZYX0ZMT0FUKWRWYWx1ZSwgdVByZWNpc2lvbik7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSA9IGRlY2ltYWxWYWx1ZTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgd3NWYWx1ZS5VVEY4RW5jb2RlKCkpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgIH0gZWxzZSBpZiAoYXJnYyA9PSAyKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVHdvID0gYXJncy5HZXRWYWx1ZSgxKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdPbmUpIHx8IEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdUd28pKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYX0RPVUJMRSBkVmFsdWUgPSAwLjA7DQorICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnT25lKSkgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGpzT2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ09uZSwgMSwgcHJvcGVydHlWYWx1ZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnT25lLCAyLCBqc09iamVjdFZhbHVlKTsNCisgICAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwocHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgZFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcHJvcGVydHlTdHI7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVN0cik7DQorICAgICAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChqc09iamVjdFZhbHVlLCBwcm9wZXJ0eVN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgZFZhbHVlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNPYmplY3RWYWx1ZSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGRWYWx1ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdPbmUpOw0KKyAgICAgIH0NCisgICAgICBGWF9ET1VCTEUgZFByZWNpc2lvbiA9IDAuMDsNCisgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdUd28pKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICBGWEpTRV9IVkFMVUUganNPYmplY3RWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVHdvLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdUd28sIDIsIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgICAgICBkUHJlY2lzaW9uID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcHJvcGVydHlTdHI7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVN0cik7DQorICAgICAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChqc09iamVjdFZhbHVlLCBwcm9wZXJ0eVN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgZFByZWNpc2lvbiA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJvcGVydHlWYWx1ZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBkUHJlY2lzaW9uID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1R3byk7DQorICAgICAgfQ0KKyAgICAgIGlmIChkUHJlY2lzaW9uIDwgMCkgew0KKyAgICAgICAgdVByZWNpc2lvbiA9IDA7DQorICAgICAgfSBlbHNlIGlmIChkUHJlY2lzaW9uID4gMTIuMCkgew0KKyAgICAgICAgdVByZWNpc2lvbiA9IDEyOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICB1UHJlY2lzaW9uID0gKHVpbnQ4X3QpZFByZWNpc2lvbjsNCisgICAgICB9DQorICAgICAgQ0ZYX0RlY2ltYWwgZGVjaW1hbFZhbHVlKChGWF9GTE9BVClkVmFsdWUsIHVQcmVjaXNpb24pOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUgPSBkZWNpbWFsVmFsdWU7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIHdzVmFsdWUuVVRGOEVuY29kZSgpKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCisgIH0gZWxzZSB7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJSb3VuZCIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpTdW0oRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIHVpbnQzMl90IHVDb3VudCA9IDA7DQorICBGWF9ET1VCTEUgZFN1bSA9IDAuMDsNCisgIGlmIChhcmdjKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdWYWx1ZSA9IDA7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgew0KKyAgICAgIGFyZ1ZhbHVlID0gYXJncy5HZXRWYWx1ZShpKTsNCisgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1ZhbHVlKSkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdWYWx1ZSk7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnVmFsdWUpKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgbGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChhcmdWYWx1ZSwgImxlbmd0aCIsIGxlbmd0aFZhbHVlKTsNCisgICAgICAgIGludDMyX3QgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxlbmd0aFZhbHVlKTsNCisgICAgICAgIGlmIChpTGVuZ3RoID4gMikgew0KKyAgICAgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZSwgMSwgcHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgIEZYSlNFX0hWQUxVRSBqc09iamVjdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICAgICAgZm9yIChpbnQzMl90IGogPSAyOyBqIDwgaUxlbmd0aDsgaisrKSB7DQorICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnVmFsdWUsIGosIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGpzT2JqZWN0VmFsdWUsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgaWYgKCFGWEpTRV9WYWx1ZV9Jc051bGwobmV3UHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgICAgICAgZFN1bSArPSBIVmFsdWVUb0RvdWJsZShoVGhpcywganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgICAgIHVDb3VudCsrOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlTdHIpOw0KKyAgICAgICAgICAgIGZvciAoaW50MzJfdCBqID0gMjsgaiA8IGlMZW5ndGg7IGorKykgew0KKyAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1ZhbHVlLCBqLCBqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoanNPYmplY3RWYWx1ZSwgcHJvcGVydHlTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgICAgaWYgKCFGWEpTRV9WYWx1ZV9Jc051bGwobmV3UHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgICAgICAgZFN1bSArPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgICAgICAgICAgIHVDb3VudCsrOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnVmFsdWUpKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnVmFsdWUsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgaWYgKCFGWEpTRV9WYWx1ZV9Jc051bGwobmV3UHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgICAgZFN1bSArPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnVmFsdWUpOw0KKyAgICAgICAgICB1Q291bnQrKzsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobmV3UHJvcGVydHlWYWx1ZSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGRTdW0gKz0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1ZhbHVlKTsNCisgICAgICAgIHVDb3VudCsrOw0KKyAgICAgIH0NCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1ZhbHVlKTsNCisgICAgfQ0KKyAgICBhcmdWYWx1ZSA9IDA7DQorICB9DQorICBpZiAodUNvdW50IDwgMSkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICB9IGVsc2Ugew0KKyAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBkU3VtKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RGF0ZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMCkgew0KKyAgICBzdHJ1Y3QgdG0qIHBUbVN0cnVjdCA9IDA7DQorICAgIHRpbWVfdCBjdXJyZW50VGltZTsNCisgICAgdGltZSgmY3VycmVudFRpbWUpOw0KKyAgICBwVG1TdHJ1Y3QgPSBnbXRpbWUoJmN1cnJlbnRUaW1lKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnVmZmVyWWVhcjsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnVmZmVyTW9uOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBidWZmZXJEYXk7DQorICAgIGJ1ZmZlclllYXIuRm9ybWF0KCIlZCIsIHBUbVN0cnVjdC0+dG1feWVhciArIDE5MDApOw0KKyAgICBidWZmZXJNb24uRm9ybWF0KCIlMDJkIiwgcFRtU3RydWN0LT50bV9tb24gKyAxKTsNCisgICAgYnVmZmVyRGF5LkZvcm1hdCgiJTAyZCIsIHBUbVN0cnVjdC0+dG1fbWRheSk7DQorICAgIENGWF9CeXRlU3RyaW5nIGJ1ZmZlckN1cnJlbnQgPSBidWZmZXJZZWFyICsgYnVmZmVyTW9uICsgYnVmZmVyRGF5Ow0KKyAgICBpbnQzMl90IGREYXlzID0gRGF0ZVN0cmluZzJOdW0oYnVmZmVyQ3VycmVudCk7DQorICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBkRGF5cyk7DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJEYXRlIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkRhdGUyTnVtKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoKGFyZ2MgPiAwKSAmJiAoYXJnYyA8IDQpKSB7DQorICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgIENGWF9CeXRlU3RyaW5nIGRhdGVTdHJpbmc7DQorICAgIENGWF9CeXRlU3RyaW5nIGZvcm1hdFN0cmluZzsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgbG9jYWxTdHJpbmc7DQorICAgIEZYSlNFX0hWQUxVRSBkYXRlVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgZm9ybWF0VmFsdWUgPSAwOw0KKyAgICBGWEpTRV9IVkFMVUUgbG9jYWxWYWx1ZSA9IDA7DQorICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGRhdGVWYWx1ZSkpIHsNCisgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhkYXRlVmFsdWUsIGRhdGVTdHJpbmcpOw0KKyAgICB9DQorICAgIGlmIChhcmdjID4gMSkgew0KKyAgICAgIGZvcm1hdFZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBmb3JtYXRWYWx1ZSkpIHsNCisgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhmb3JtYXRWYWx1ZSwgZm9ybWF0U3RyaW5nKTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGFyZ2MgPT0gMykgew0KKyAgICAgIGxvY2FsVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGxvY2FsVmFsdWUpKSB7DQorICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcobG9jYWxWYWx1ZSwgbG9jYWxTdHJpbmcpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoIWJGbGFncykgew0KKyAgICAgIENGWF9CeXRlU3RyaW5nIHN6SXNvRGF0ZVN0cmluZzsNCisgICAgICBGWF9CT09MIGJSZXQgPSBMb2NhbDJJc29EYXRlKGhUaGlzLCBkYXRlU3RyaW5nLCBmb3JtYXRTdHJpbmcsIGxvY2FsU3RyaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pJc29EYXRlU3RyaW5nKTsNCisgICAgICBpZiAoYlJldCkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGVTdHJpbmcyTnVtKHN6SXNvRGF0ZVN0cmluZykpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgMCk7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGRhdGVWYWx1ZSk7DQorICAgIGlmIChhcmdjID4gMSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoZm9ybWF0VmFsdWUpOw0KKyAgICAgIGlmIChhcmdjID09IDMpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobG9jYWxWYWx1ZSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJEYXRlMk51bSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpEYXRlRm10KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPCAzKSB7DQorICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgIGludDMyX3QgaVN0eWxlID0gMDsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgc3pMb2NhbDsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1N0eWxlID0gMDsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ0xvY2FsID0gMDsNCisgICAgaWYgKGFyZ2MgPiAwKSB7DQorICAgICAgYXJnU3R5bGUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU3R5bGUpKSB7DQorICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgICBpU3R5bGUgPSAoaW50MzJfdClIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdTdHlsZSk7DQorICAgICAgaWYgKGlTdHlsZSA+IDQgfHwgaVN0eWxlIDwgMCkgew0KKyAgICAgICAgaVN0eWxlID0gMDsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGFyZ2MgPT0gMikgew0KKyAgICAgIGFyZ0xvY2FsID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0xvY2FsKSkgew0KKyAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ0xvY2FsLCBzekxvY2FsKTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFiRmxhZ3MpIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBmb3JtYXRTdHI7DQorICAgICAgR2V0U3RhbmRhcmREYXRlRm9ybWF0KGhUaGlzLCBpU3R5bGUsIHN6TG9jYWwsIGZvcm1hdFN0cik7DQorICAgICAgaWYgKGZvcm1hdFN0ci5Jc0VtcHR5KCkpIHsNCisgICAgICAgIGZvcm1hdFN0ciA9ICIiOw0KKyAgICAgIH0NCisgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgZm9ybWF0U3RyKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0NCisgICAgaWYgKGFyZ2MgPiAwKSB7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdTdHlsZSk7DQorICAgICAgaWYgKGFyZ2MgPT0gMikgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdMb2NhbCk7DQorICAgICAgfQ0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJEYXRlMk51bSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpJc29EYXRlMk51bShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAxKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ09uZSkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pBcmdTdHJpbmc7DQorICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgc3pBcmdTdHJpbmcpOw0KKyAgICAgIGludDMyX3QgZERheXMgPSBEYXRlU3RyaW5nMk51bShzekFyZ1N0cmluZyk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIChpbnQzMl90KWREYXlzKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJJc29EYXRlMk51bSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpJc29UaW1lMk51bShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMSkgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBDWEZBX0RvY3VtZW50KiBwRG9jID0gcENvbnRleHQtPkdldERvY3VtZW50KCk7DQorICAgICAgRlhTWVNfYXNzZXJ0KHBEb2MpOw0KKyAgICAgIElGWF9Mb2NhbGVNZ3IqIHBNZ3IgPSAoSUZYX0xvY2FsZU1nciopcERvYy0+R2V0TG9jYWxNZ3IoKTsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBzekFyZ1N0cmluZzsNCisgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCBzekFyZ1N0cmluZyk7DQorICAgICAgc3pBcmdTdHJpbmcgPSBzekFyZ1N0cmluZy5NaWQoc3pBcmdTdHJpbmcuRmluZCgnVCcsIDApICsgMSk7DQorICAgICAgaWYgKHN6QXJnU3RyaW5nLklzRW1wdHkoKSkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIDApOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgICBDWEZBX0xvY2FsZVZhbHVlIHRpbWVWYWx1ZSgNCisgICAgICAgICAgWEZBX1ZUX1RJTUUsDQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekFyZ1N0cmluZywgc3pBcmdTdHJpbmcuR2V0TGVuZ3RoKCkpLA0KKyAgICAgICAgICAoQ1hGQV9Mb2NhbGVNZ3IqKXBNZ3IpOw0KKyAgICAgIGlmICh0aW1lVmFsdWUuSXNWYWxpZCgpKSB7DQorICAgICAgICBDRlhfVW5pdGltZSB1bmlUaW1lID0gdGltZVZhbHVlLkdldFRpbWUoKTsNCisgICAgICAgIGludDMyX3QgaG91ciA9IHVuaVRpbWUuR2V0SG91cigpOw0KKyAgICAgICAgaW50MzJfdCBtaW4gPSB1bmlUaW1lLkdldE1pbnV0ZSgpOw0KKyAgICAgICAgaW50MzJfdCBzZWNvbmQgPSB1bmlUaW1lLkdldFNlY29uZCgpOw0KKyAgICAgICAgaW50MzJfdCBtaWxTZWNvbmQgPSB1bmlUaW1lLkdldE1pbGxpc2Vjb25kKCk7DQorICAgICAgICBJRlhfTG9jYWxlKiBwRGVmTG9jYWxlID0gcE1nci0+R2V0RGVmTG9jYWxlKCk7DQorICAgICAgICBGWFNZU19hc3NlcnQocERlZkxvY2FsZSk7DQorICAgICAgICBGWF9USU1FWk9ORSB0ekxvY2FsZTsNCisgICAgICAgIHBEZWZMb2NhbGUtPkdldFRpbWVab25lKHR6TG9jYWxlKTsNCisgICAgICAgIGludDMyX3QgbWlucyA9IGhvdXIgKiA2MCArIG1pbjsNCisgICAgICAgIG1pbnMgLT0gKHR6TG9jYWxlLnR6SG91ciAqIDYwKTsNCisgICAgICAgIHdoaWxlIChtaW5zID4gMTQ0MCkgew0KKyAgICAgICAgICBtaW5zIC09IDE0NDA7DQorICAgICAgICB9DQorICAgICAgICB3aGlsZSAobWlucyA8IDApIHsNCisgICAgICAgICAgbWlucyArPSAxNDQwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaG91ciA9IG1pbnMgLyA2MDsNCisgICAgICAgIG1pbiA9IG1pbnMgJSA2MDsNCisgICAgICAgIGludDMyX3QgaVJlc3VsdCA9DQorICAgICAgICAgICAgaG91ciAqIDM2MDAwMDAgKyBtaW4gKiA2MDAwMCArIHNlY29uZCAqIDEwMDAgKyBtaWxTZWNvbmQgKyAxOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIGlSZXN1bHQpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgMCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgIH0gZWxzZSB7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJJc29UaW1lMk51bSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpMb2NhbERhdGVGbXQoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPCAzKSB7DQorICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgIGludDMyX3QgaVN0eWxlID0gMDsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgc3pMb2NhbDsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1N0eWxlID0gMDsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ0xvY2FsID0gMDsNCisgICAgaWYgKGFyZ2MgPiAwKSB7DQorICAgICAgYXJnU3R5bGUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU3R5bGUpKSB7DQorICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgICBpU3R5bGUgPSAoaW50MzJfdClIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdTdHlsZSk7DQorICAgICAgaWYgKGlTdHlsZSA+IDQgfHwgaVN0eWxlIDwgMCkgew0KKyAgICAgICAgaVN0eWxlID0gMDsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGFyZ2MgPT0gMikgew0KKyAgICAgIGFyZ0xvY2FsID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0xvY2FsKSkgew0KKyAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ0xvY2FsLCBzekxvY2FsKTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFiRmxhZ3MpIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBmb3JtYXRTdHI7DQorICAgICAgR2V0TG9jYWxEYXRlRm9ybWF0KGhUaGlzLCBpU3R5bGUsIHN6TG9jYWwsIGZvcm1hdFN0ciwgRkFMU0UpOw0KKyAgICAgIGlmIChmb3JtYXRTdHIuSXNFbXB0eSgpKSB7DQorICAgICAgICBmb3JtYXRTdHIgPSAiIjsNCisgICAgICB9DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIGZvcm1hdFN0cik7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9DQorICAgIGlmIChhcmdjID4gMCkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU3R5bGUpOw0KKyAgICAgIGlmIChhcmdjID09IDIpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnTG9jYWwpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiTG9jYWxEYXRlRm10Iik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkxvY2FsVGltZUZtdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA8IDMpIHsNCisgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgaW50MzJfdCBpU3R5bGUgPSAwOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBzekxvY2FsOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnU3R5bGUgPSAwOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnTG9jYWwgPSAwOw0KKyAgICBpZiAoYXJnYyA+IDApIHsNCisgICAgICBhcmdTdHlsZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdTdHlsZSkpIHsNCisgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgfQ0KKyAgICAgIGlTdHlsZSA9IChpbnQzMl90KUhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ1N0eWxlKTsNCisgICAgICBpZiAoaVN0eWxlID4gNCB8fCBpU3R5bGUgPCAwKSB7DQorICAgICAgICBpU3R5bGUgPSAwOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoYXJnYyA9PSAyKSB7DQorICAgICAgYXJnTG9jYWwgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnTG9jYWwpKSB7DQorICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnTG9jYWwsIHN6TG9jYWwpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoIWJGbGFncykgew0KKyAgICAgIENGWF9CeXRlU3RyaW5nIGZvcm1hdFN0cjsNCisgICAgICBHZXRMb2NhbFRpbWVGb3JtYXQoaFRoaXMsIGlTdHlsZSwgc3pMb2NhbCwgZm9ybWF0U3RyLCBGQUxTRSk7DQorICAgICAgaWYgKGZvcm1hdFN0ci5Jc0VtcHR5KCkpIHsNCisgICAgICAgIGZvcm1hdFN0ciA9ICIiOw0KKyAgICAgIH0NCisgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgZm9ybWF0U3RyKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0NCisgICAgaWYgKGFyZ2MgPiAwKSB7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdTdHlsZSk7DQorICAgICAgaWYgKGFyZ2MgPT0gMikgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdMb2NhbCk7DQorICAgICAgfQ0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJMb2NhbFRpbWVGbXQiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6TnVtMkRhdGUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmICgoYXJnYyA+IDApICYmIChhcmdjIDwgNCkpIHsNCisgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgaW50MzJfdCBkRGF0ZTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgZm9ybWF0U3RyaW5nOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBsb2NhbFN0cmluZzsNCisgICAgRlhKU0VfSFZBTFVFIGRhdGVWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEZYSlNFX0hWQUxVRSBmb3JtYXRWYWx1ZSA9IDA7DQorICAgIEZYSlNFX0hWQUxVRSBsb2NhbFZhbHVlID0gMDsNCisgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgZGF0ZVZhbHVlKSkgew0KKyAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgIH0gZWxzZSB7DQorICAgICAgZERhdGUgPSAoaW50MzJfdClIVmFsdWVUb0Zsb2F0KGhUaGlzLCBkYXRlVmFsdWUpOw0KKyAgICAgIGJGbGFncyA9IGREYXRlIDwgMTsNCisgICAgfQ0KKyAgICBpZiAoYXJnYyA+IDEpIHsNCisgICAgICBmb3JtYXRWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgZm9ybWF0VmFsdWUpKSB7DQorICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoZm9ybWF0VmFsdWUsIGZvcm1hdFN0cmluZyk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChhcmdjID09IDMpIHsNCisgICAgICBsb2NhbFZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCisgICAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBsb2NhbFZhbHVlKSkgew0KKyAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGxvY2FsVmFsdWUsIGxvY2FsU3RyaW5nKTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFiRmxhZ3MpIHsNCisgICAgICBpbnQzMl90IGlZZWFyID0gMTkwMDsNCisgICAgICBpbnQzMl90IGlNb250aCA9IDE7DQorICAgICAgaW50MzJfdCBpRGF5ID0gMTsNCisgICAgICBpbnQzMl90IGkgPSAwOw0KKyAgICAgIHdoaWxlIChkRGF0ZSA+IDApIHsNCisgICAgICAgIGlmIChpTW9udGggPT0gMikgew0KKyAgICAgICAgICBpZiAoKCEoKGlZZWFyICsgaSkgJSA0KSAmJiAoKGlZZWFyICsgaSkgJSAxMDApKSB8fA0KKyAgICAgICAgICAgICAgISgoaVllYXIgKyBpKSAlIDQwMCkpIHsNCisgICAgICAgICAgICBpZiAoZERhdGUgPiAyOSkgew0KKyAgICAgICAgICAgICAgKytpTW9udGg7DQorICAgICAgICAgICAgICBpZiAoaU1vbnRoID4gMTIpIHsNCisgICAgICAgICAgICAgICAgaU1vbnRoID0gMTsNCisgICAgICAgICAgICAgICAgKytpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaURheSA9IDE7DQorICAgICAgICAgICAgICBkRGF0ZSAtPSAyOTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgaURheSArPSBzdGF0aWNfY2FzdDxpbnQzMl90PihkRGF0ZSkgLSAxOw0KKyAgICAgICAgICAgICAgZERhdGUgPSAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAoZERhdGUgPiAyOCkgew0KKyAgICAgICAgICAgICAgKytpTW9udGg7DQorICAgICAgICAgICAgICBpZiAoaU1vbnRoID4gMTIpIHsNCisgICAgICAgICAgICAgICAgaU1vbnRoID0gMTsNCisgICAgICAgICAgICAgICAgKytpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaURheSA9IDE7DQorICAgICAgICAgICAgICBkRGF0ZSAtPSAyODsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgaURheSArPSBzdGF0aWNfY2FzdDxpbnQzMl90PihkRGF0ZSkgLSAxOw0KKyAgICAgICAgICAgICAgZERhdGUgPSAwOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChpTW9udGggPCA4KSB7DQorICAgICAgICAgIGlmICgoaU1vbnRoICUgMiA9PSAwKSkgew0KKyAgICAgICAgICAgIGlmIChkRGF0ZSA+IDMwKSB7DQorICAgICAgICAgICAgICArK2lNb250aDsNCisgICAgICAgICAgICAgIGlmIChpTW9udGggPiAxMikgew0KKyAgICAgICAgICAgICAgICBpTW9udGggPSAxOw0KKyAgICAgICAgICAgICAgICArK2k7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpRGF5ID0gMTsNCisgICAgICAgICAgICAgIGREYXRlIC09IDMwOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBpRGF5ICs9IHN0YXRpY19jYXN0PGludDMyX3Q+KGREYXRlKSAtIDE7DQorICAgICAgICAgICAgICBkRGF0ZSA9IDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChkRGF0ZSA+IDMxKSB7DQorICAgICAgICAgICAgICArK2lNb250aDsNCisgICAgICAgICAgICAgIGlmIChpTW9udGggPiAxMikgew0KKyAgICAgICAgICAgICAgICBpTW9udGggPSAxOw0KKyAgICAgICAgICAgICAgICArK2k7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpRGF5ID0gMTsNCisgICAgICAgICAgICAgIGREYXRlIC09IDMxOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBpRGF5ICs9IHN0YXRpY19jYXN0PGludDMyX3Q+KGREYXRlKSAtIDE7DQorICAgICAgICAgICAgICBkRGF0ZSA9IDA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBpZiAoaU1vbnRoICUgMiAhPSAwKSB7DQorICAgICAgICAgICAgaWYgKGREYXRlID4gMzApIHsNCisgICAgICAgICAgICAgICsraU1vbnRoOw0KKyAgICAgICAgICAgICAgaWYgKGlNb250aCA+IDEyKSB7DQorICAgICAgICAgICAgICAgIGlNb250aCA9IDE7DQorICAgICAgICAgICAgICAgICsraTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlEYXkgPSAxOw0KKyAgICAgICAgICAgICAgZERhdGUgLT0gMzA7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIGlEYXkgKz0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZERhdGUpIC0gMTsNCisgICAgICAgICAgICAgIGREYXRlID0gMDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaWYgKGREYXRlID4gMzEpIHsNCisgICAgICAgICAgICAgICsraU1vbnRoOw0KKyAgICAgICAgICAgICAgaWYgKGlNb250aCA+IDEyKSB7DQorICAgICAgICAgICAgICAgIGlNb250aCA9IDE7DQorICAgICAgICAgICAgICAgICsraTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlEYXkgPSAxOw0KKyAgICAgICAgICAgICAgZERhdGUgLT0gMzE7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIGlEYXkgKz0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZERhdGUpIC0gMTsNCisgICAgICAgICAgICAgIGREYXRlID0gMDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pJc29EYXRlU3RyaW5nOw0KKyAgICAgIHN6SXNvRGF0ZVN0cmluZy5Gb3JtYXQoIiVkJTAyZCUwMmQiLCBpWWVhciArIGksIGlNb250aCwgaURheSk7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pMb2NhbERhdGVTdHJpbmc7DQorICAgICAgSXNvRGF0ZTJMb2NhbChoVGhpcywgc3pJc29EYXRlU3RyaW5nLCBmb3JtYXRTdHJpbmcsDQorICAgICAgICAgICAgICAgICAgICBsb2NhbFN0cmluZywgc3pMb2NhbERhdGVTdHJpbmcpOw0KKyAgICAgIGlmIChzekxvY2FsRGF0ZVN0cmluZy5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHN6TG9jYWxEYXRlU3RyaW5nID0gIiI7DQorICAgICAgfQ0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzekxvY2FsRGF0ZVN0cmluZyk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoZGF0ZVZhbHVlKTsNCisgICAgaWYgKGFyZ2MgPiAxKSB7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShmb3JtYXRWYWx1ZSk7DQorICAgICAgaWYgKGFyZ2MgPT0gMykgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsb2NhbFZhbHVlKTsNCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIk51bTJEYXRlIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Ok51bTJHTVRpbWUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoKGFyZ2MgPiAwKSAmJiAoYXJnYyA8IDQpKSB7DQorICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgIGludDMyX3QgaVRpbWU7DQorICAgIENGWF9CeXRlU3RyaW5nIGZvcm1hdFN0cmluZzsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgbG9jYWxTdHJpbmc7DQorICAgIEZYSlNFX0hWQUxVRSB0aW1lVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgZm9ybWF0VmFsdWUgPSAwOw0KKyAgICBGWEpTRV9IVkFMVUUgbG9jYWxWYWx1ZSA9IDA7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwodGltZVZhbHVlKSkgew0KKyAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgIH0gZWxzZSB7DQorICAgICAgaVRpbWUgPSAoaW50MzJfdClIVmFsdWVUb0Zsb2F0KGhUaGlzLCB0aW1lVmFsdWUpOw0KKyAgICAgIGlmIChGWFNZU19hYnMoaVRpbWUpIDwgMS4wKSB7DQorICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoYXJnYyA+IDEpIHsNCisgICAgICBmb3JtYXRWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChmb3JtYXRWYWx1ZSkpIHsNCisgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhmb3JtYXRWYWx1ZSwgZm9ybWF0U3RyaW5nKTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGFyZ2MgPT0gMykgew0KKyAgICAgIGxvY2FsVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwobG9jYWxWYWx1ZSkpIHsNCisgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhsb2NhbFZhbHVlLCBsb2NhbFN0cmluZyk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmICghYkZsYWdzKSB7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3pHTVRUaW1lU3RyaW5nOw0KKyAgICAgIE51bTJBbGxUaW1lKGhUaGlzLCBpVGltZSwgZm9ybWF0U3RyaW5nLCBsb2NhbFN0cmluZywgVFJVRSwNCisgICAgICAgICAgICAgICAgICBzekdNVFRpbWVTdHJpbmcpOw0KKyAgICAgIGlmIChzekdNVFRpbWVTdHJpbmcuSXNFbXB0eSgpKSB7DQorICAgICAgICBzekdNVFRpbWVTdHJpbmcgPSAiIjsNCisgICAgICB9DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIHN6R01UVGltZVN0cmluZyk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UodGltZVZhbHVlKTsNCisgICAgaWYgKGFyZ2MgPiAxKSB7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShmb3JtYXRWYWx1ZSk7DQorICAgICAgaWYgKGFyZ2MgPT0gMykgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsb2NhbFZhbHVlKTsNCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIk51bTJHTVRpbWUiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6TnVtMlRpbWUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmICgoYXJnYyA+IDApICYmIChhcmdjIDwgNCkpIHsNCisgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgRlhfRkxPQVQgZlRpbWU7DQorICAgIENGWF9CeXRlU3RyaW5nIGZvcm1hdFN0cmluZzsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgbG9jYWxTdHJpbmc7DQorICAgIEZYSlNFX0hWQUxVRSB0aW1lVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgZm9ybWF0VmFsdWUgPSAwOw0KKyAgICBGWEpTRV9IVkFMVUUgbG9jYWxWYWx1ZSA9IDA7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwodGltZVZhbHVlKSkgew0KKyAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgIH0gZWxzZSB7DQorICAgICAgZlRpbWUgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCB0aW1lVmFsdWUpOw0KKyAgICAgIGlmIChGWFNZU19mYWJzKGZUaW1lKSA8IDEuMCkgew0KKyAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGFyZ2MgPiAxKSB7DQorICAgICAgZm9ybWF0VmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoZm9ybWF0VmFsdWUpKSB7DQorICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoZm9ybWF0VmFsdWUsIGZvcm1hdFN0cmluZyk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChhcmdjID09IDMpIHsNCisgICAgICBsb2NhbFZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCisgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGxvY2FsVmFsdWUpKSB7DQorICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcobG9jYWxWYWx1ZSwgbG9jYWxTdHJpbmcpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoIWJGbGFncykgew0KKyAgICAgIENGWF9CeXRlU3RyaW5nIHN6TG9jYWxUaW1lU3RyaW5nOw0KKyAgICAgIE51bTJBbGxUaW1lKGhUaGlzLCAoaW50MzJfdClmVGltZSwgZm9ybWF0U3RyaW5nLCBsb2NhbFN0cmluZywgRkFMU0UsDQorICAgICAgICAgICAgICAgICAgc3pMb2NhbFRpbWVTdHJpbmcpOw0KKyAgICAgIGlmIChzekxvY2FsVGltZVN0cmluZy5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHN6TG9jYWxUaW1lU3RyaW5nID0gIiI7DQorICAgICAgfQ0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzekxvY2FsVGltZVN0cmluZyk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UodGltZVZhbHVlKTsNCisgICAgaWYgKGFyZ2MgPiAxKSB7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShmb3JtYXRWYWx1ZSk7DQorICAgICAgaWYgKGFyZ2MgPT0gMykgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsb2NhbFZhbHVlKTsNCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIk51bTJUaW1lIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlRpbWUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDApIHsNCisgICAgdGltZV90IG5vdzsNCisgICAgdGltZSgmbm93KTsNCisgICAgc3RydWN0IHRtKiBwR210ID0gZ210aW1lKCZub3cpOw0KKyAgICBpbnQzMl90IGlHTUhvdXIgPSBwR210LT50bV9ob3VyOw0KKyAgICBpbnQzMl90IGlHTU1pbiA9IHBHbXQtPnRtX21pbjsNCisgICAgaW50MzJfdCBpR01TZWMgPSBwR210LT50bV9zZWM7DQorICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaUdNSG91ciAqIDM2MDAgKyBpR01NaW4gKiA2MCArIGlHTVNlYykgKiAxMDAwKSk7DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJUaW1lIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlRpbWUyTnVtKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoKGFyZ2MgPiAwKSAmJiAoYXJnYyA8IDQpKSB7DQorICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgIENGWF9CeXRlU3RyaW5nIHRpbWVTdHJpbmc7DQorICAgIENGWF9CeXRlU3RyaW5nIGZvcm1hdFN0cmluZzsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgbG9jYWxTdHJpbmc7DQorICAgIEZYSlNFX0hWQUxVRSB0aW1lVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgZm9ybWF0VmFsdWUgPSAwOw0KKyAgICBGWEpTRV9IVkFMVUUgbG9jYWxWYWx1ZSA9IDA7DQorICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIHRpbWVWYWx1ZSkpIHsNCisgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyh0aW1lVmFsdWUsIHRpbWVTdHJpbmcpOw0KKyAgICB9DQorICAgIGlmIChhcmdjID4gMSkgew0KKyAgICAgIGZvcm1hdFZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBmb3JtYXRWYWx1ZSkpIHsNCisgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhmb3JtYXRWYWx1ZSwgZm9ybWF0U3RyaW5nKTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGFyZ2MgPT0gMykgew0KKyAgICAgIGxvY2FsVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGxvY2FsVmFsdWUpKSB7DQorICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcobG9jYWxWYWx1ZSwgbG9jYWxTdHJpbmcpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoIWJGbGFncykgew0KKyAgICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICAgIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCisgICAgICBJRlhfTG9jYWxlTWdyKiBwTWdyID0gKElGWF9Mb2NhbGVNZ3IqKXBEb2MtPkdldExvY2FsTWdyKCk7DQorICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IE5VTEw7DQorICAgICAgaWYgKGxvY2FsU3RyaW5nLklzRW1wdHkoKSkgew0KKyAgICAgICAgQ1hGQV9PYmplY3QqIHBUaGlzTm9kZSA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpOw0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KHBUaGlzTm9kZS0+SXNOb2RlKCkpOw0KKyAgICAgICAgQ1hGQV9XaWRnZXREYXRhIHdpZGdldERhdGEoKENYRkFfTm9kZSopcFRoaXNOb2RlKTsNCisgICAgICAgIHBMb2NhbGUgPSB3aWRnZXREYXRhLkdldExvY2FsKCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHBMb2NhbGUgPSBwTWdyLT5HZXRMb2NhbGVCeU5hbWUoDQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGxvY2FsU3RyaW5nLCBsb2NhbFN0cmluZy5HZXRMZW5ndGgoKSkpOw0KKyAgICAgIH0NCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdDsNCisgICAgICBpZiAoZm9ybWF0U3RyaW5nLklzRW1wdHkoKSkgew0KKyAgICAgICAgcExvY2FsZS0+R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0LCB3c0Zvcm1hdCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHdzRm9ybWF0ID0NCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoZm9ybWF0U3RyaW5nLCBmb3JtYXRTdHJpbmcuR2V0TGVuZ3RoKCkpOw0KKyAgICAgIH0NCisgICAgICB3c0Zvcm1hdCA9IEZYX1dTVFJDKEwidGltZXsiKSArIHdzRm9ybWF0Ow0KKyAgICAgIHdzRm9ybWF0ICs9IEZYX1dTVFJDKEwifSIpOw0KKyAgICAgIENYRkFfTG9jYWxlVmFsdWUgdGltZVZhbHVlKA0KKyAgICAgICAgICBYRkFfVlRfVElNRSwNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHRpbWVTdHJpbmcsIHRpbWVTdHJpbmcuR2V0TGVuZ3RoKCkpLA0KKyAgICAgICAgICB3c0Zvcm1hdCwgcExvY2FsZSwgKENYRkFfTG9jYWxlTWdyKilwTWdyKTsNCisgICAgICBpZiAodGltZVZhbHVlLklzVmFsaWQoKSkgew0KKyAgICAgICAgQ0ZYX1VuaXRpbWUgdW5pVGltZSA9IHRpbWVWYWx1ZS5HZXRUaW1lKCk7DQorICAgICAgICBpbnQzMl90IGhvdXIgPSB1bmlUaW1lLkdldEhvdXIoKTsNCisgICAgICAgIGludDMyX3QgbWluID0gdW5pVGltZS5HZXRNaW51dGUoKTsNCisgICAgICAgIGludDMyX3Qgc2Vjb25kID0gdW5pVGltZS5HZXRTZWNvbmQoKTsNCisgICAgICAgIGludDMyX3QgbWlsU2Vjb25kID0gdW5pVGltZS5HZXRNaWxsaXNlY29uZCgpOw0KKyAgICAgICAgaW50MzJfdCBtaW5zID0gaG91ciAqIDYwICsgbWluOw0KKyAgICAgICAgSVhGQV9UaW1lWm9uZVByb3ZpZGVyKiBwUHJvdmlkZXIgPSBJWEZBX1RpbWVab25lUHJvdmlkZXI6OkdldCgpOw0KKyAgICAgICAgaWYgKHBQcm92aWRlciAhPSBOVUxMKSB7DQorICAgICAgICAgIEZYX1RJTUVaT05FIHR6Ow0KKyAgICAgICAgICBwUHJvdmlkZXItPkdldFRpbWVab25lKHR6KTsNCisgICAgICAgICAgbWlucyAtPSAodHoudHpIb3VyICogNjApOw0KKyAgICAgICAgICB3aGlsZSAobWlucyA+IDE0NDApIHsNCisgICAgICAgICAgICBtaW5zIC09IDE0NDA7DQorICAgICAgICAgIH0NCisgICAgICAgICAgd2hpbGUgKG1pbnMgPCAwKSB7DQorICAgICAgICAgICAgbWlucyArPSAxNDQwOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGhvdXIgPSBtaW5zIC8gNjA7DQorICAgICAgICAgIG1pbiA9IG1pbnMgJSA2MDsNCisgICAgICAgIH0NCisgICAgICAgIGludDMyX3QgaVJlc3VsdCA9DQorICAgICAgICAgICAgaG91ciAqIDM2MDAwMDAgKyBtaW4gKiA2MDAwMCArIHNlY29uZCAqIDEwMDAgKyBtaWxTZWNvbmQgKyAxOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIGlSZXN1bHQpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgMCk7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHRpbWVWYWx1ZSk7DQorICAgIGlmIChhcmdjID4gMSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoZm9ybWF0VmFsdWUpOw0KKyAgICAgIGlmIChhcmdjID09IDMpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobG9jYWxWYWx1ZSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJUaW1lMk51bSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpUaW1lRm10KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPCAzKSB7DQorICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgIGludDMyX3QgaVN0eWxlID0gMDsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgc3pMb2NhbDsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1N0eWxlID0gMDsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ0xvY2FsID0gMDsNCisgICAgaWYgKGFyZ2MgPiAwKSB7DQorICAgICAgYXJnU3R5bGUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU3R5bGUpKSB7DQorICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgICBpU3R5bGUgPSAoaW50MzJfdClIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdTdHlsZSk7DQorICAgICAgaWYgKGlTdHlsZSA+IDQgfHwgaVN0eWxlIDwgMCkgew0KKyAgICAgICAgaVN0eWxlID0gMDsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGFyZ2MgPT0gMikgew0KKyAgICAgIGFyZ0xvY2FsID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0xvY2FsKSkgew0KKyAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ0xvY2FsLCBzekxvY2FsKTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFiRmxhZ3MpIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBmb3JtYXRTdHI7DQorICAgICAgR2V0U3RhbmRhcmRUaW1lRm9ybWF0KGhUaGlzLCBpU3R5bGUsIHN6TG9jYWwsIGZvcm1hdFN0cik7DQorICAgICAgaWYgKGZvcm1hdFN0ci5Jc0VtcHR5KCkpIHsNCisgICAgICAgIGZvcm1hdFN0ciA9ICIiOw0KKyAgICAgIH0NCisgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgZm9ybWF0U3RyKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0NCisgICAgaWYgKGFyZ2MgPiAwKSB7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdTdHlsZSk7DQorICAgICAgaWYgKGFyZ2MgPT0gMikgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdMb2NhbCk7DQorICAgICAgfQ0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJUaW1lRm10Iik7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GTTJKU0NvbnRleHQ6OklzSXNvRGF0ZUZvcm1hdChjb25zdCBGWF9DSEFSKiBwRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlEYXkpIHsNCisgIGlZZWFyID0gMDsNCisgIGlNb250aCA9IDE7DQorICBpRGF5ID0gMTsNCisgIEZYX0JPT0wgaVJldCA9IEZBTFNFOw0KKyAgaWYgKGlMZW5ndGggPCA0KSB7DQorICAgIHJldHVybiBpUmV0Ow0KKyAgfQ0KKyAgRlhfQ0hBUiBzdHJZZWFyWzVdOw0KKyAgc3RyWWVhcls0XSA9ICdcMCc7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsNCisgICAgaWYgKCoocERhdGEgKyBpKSA8PSAnOScgJiYgKihwRGF0YSArIGkpID49ICcwJykgew0KKyAgICAgIHN0clllYXJbaV0gPSAqKHBEYXRhICsgaSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgcmV0dXJuIGlSZXQ7DQorICAgIH0NCisgIH0NCisgIGlZZWFyID0gRlhTWVNfYXRvaShzdHJZZWFyKTsNCisgIGlTdHlsZSA9IDA7DQorICBpZiAoaUxlbmd0aCA+IDQpIHsNCisgICAgaWYgKCoocERhdGEgKyA0KSA9PSAnLScpIHsNCisgICAgICBpU3R5bGUgPSAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlTdHlsZSA9IDA7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGlSZXQgPSBUUlVFOw0KKyAgICByZXR1cm4gaVJldDsNCisgIH0NCisgIEZYX0NIQVIgc3RyVGVtcFszXTsNCisgIHN0clRlbXBbMl0gPSAnXDAnOw0KKyAgaW50MzJfdCBpUG9zT2ZmID0gMDsNCisgIGlmIChpU3R5bGUgPT0gMCkgew0KKyAgICBpUG9zT2ZmID0gNDsNCisgICAgaWYgKGlMZW5ndGggPT0gNCkgew0KKyAgICAgIGlSZXQgPSBUUlVFOw0KKyAgICAgIHJldHVybiBpUmV0Ow0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBpUG9zT2ZmID0gNTsNCisgICAgaWYgKGlMZW5ndGggPT0gNCkgew0KKyAgICAgIGlSZXQgPSBUUlVFOw0KKyAgICAgIHJldHVybiBpUmV0Ow0KKyAgICB9DQorICB9DQorICBpZiAoKCoocERhdGEgKyBpUG9zT2ZmKSA+ICc5JyB8fCAqKHBEYXRhICsgaVBvc09mZikgPCAnMCcpIHx8DQorICAgICAgKCoocERhdGEgKyBpUG9zT2ZmICsgMSkgPiAnOScgfHwgKihwRGF0YSArIGlQb3NPZmYgKyAxKSA8ICcwJykpIHsNCisgICAgcmV0dXJuIGlSZXQ7DQorICB9DQorICBzdHJUZW1wWzBdID0gKihwRGF0YSArIGlQb3NPZmYpOw0KKyAgc3RyVGVtcFsxXSA9ICoocERhdGEgKyBpUG9zT2ZmICsgMSk7DQorICBpTW9udGggPSBGWFNZU19hdG9pKHN0clRlbXApOw0KKyAgaWYgKGlNb250aCA+IDEyIHx8IGlNb250aCA8IDEpIHsNCisgICAgcmV0dXJuIGlSZXQ7DQorICB9DQorICBpZiAoaVN0eWxlID09IDApIHsNCisgICAgaVBvc09mZiArPSAyOw0KKyAgICBpZiAoaUxlbmd0aCA9PSA2KSB7DQorICAgICAgaVJldCA9IDE7DQorICAgICAgcmV0dXJuIGlSZXQ7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGlQb3NPZmYgKz0gMzsNCisgICAgaWYgKGlMZW5ndGggPT0gNykgew0KKyAgICAgIGlSZXQgPSAxOw0KKyAgICAgIHJldHVybiBpUmV0Ow0KKyAgICB9DQorICB9DQorICBpZiAoKCoocERhdGEgKyBpUG9zT2ZmKSA+ICc5JyB8fCAqKHBEYXRhICsgaVBvc09mZikgPCAnMCcpIHx8DQorICAgICAgKCoocERhdGEgKyBpUG9zT2ZmICsgMSkgPiAnOScgfHwgKihwRGF0YSArIGlQb3NPZmYgKyAxKSA8ICcwJykpIHsNCisgICAgcmV0dXJuIGlSZXQ7DQorICB9DQorICBzdHJUZW1wWzBdID0gKihwRGF0YSArIGlQb3NPZmYpOw0KKyAgc3RyVGVtcFsxXSA9ICoocERhdGEgKyBpUG9zT2ZmICsgMSk7DQorICBpRGF5ID0gRlhTWVNfYXRvaShzdHJUZW1wKTsNCisgIGlmIChpUG9zT2ZmICsgMiA8IGlMZW5ndGgpIHsNCisgICAgcmV0dXJuIGlSZXQ7DQorICB9DQorICBpZiAoKCEoaVllYXIgJSA0KSAmJiAoaVllYXIgJSAxMDApKSB8fCAhKGlZZWFyICUgNDAwKSkgew0KKyAgICBpZiAoaU1vbnRoID09IDIpIHsNCisgICAgICBpZiAoaURheSA+IDI5KSB7DQorICAgICAgICByZXR1cm4gaVJldDsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKGlNb250aCA8IDgpIHsNCisgICAgICAgIGlmIChpRGF5ID4gKGlNb250aCAlIDIgPT0gMCA/IDMwIDogMzEpKSB7DQorICAgICAgICAgIHJldHVybiBpUmV0Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAoaURheSA+IChpTW9udGggJSAyID09IDAgPyAzMSA6IDMwKSkgew0KKyAgICAgICAgICByZXR1cm4gaVJldDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGlmIChpTW9udGggPT0gMikgew0KKyAgICAgIGlmIChpRGF5ID4gMjgpIHsNCisgICAgICAgIHJldHVybiBpUmV0Ow0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAoaU1vbnRoIDwgOCkgew0KKyAgICAgICAgaWYgKGlEYXkgPiAoaU1vbnRoICUgMiA9PSAwID8gMzAgOiAzMSkpIHsNCisgICAgICAgICAgcmV0dXJuIGlSZXQ7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChpRGF5ID4gKGlNb250aCAlIDIgPT0gMCA/IDMxIDogMzApKSB7DQorICAgICAgICAgIHJldHVybiBpUmV0Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaVJldCA9IFRSVUU7DQorICByZXR1cm4gaVJldDsNCit9DQorRlhfQk9PTCBDWEZBX0ZNMkpTQ29udGV4dDo6SXNJc29UaW1lRm9ybWF0KGNvbnN0IEZYX0NIQVIqIHBEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlIb3VyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTWludXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpU2Vjb25kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTWlsbGlTZWNvbmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlab25lSG91ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVpvbmVNaW51dGUpIHsNCisgIGlIb3VyID0gMDsNCisgIGlNaW51dGUgPSAwOw0KKyAgaVNlY29uZCA9IDA7DQorICBpTWlsbGlTZWNvbmQgPSAwOw0KKyAgaVpvbmVIb3VyID0gMDsNCisgIGlab25lTWludXRlID0gMDsNCisgIGlmICghcERhdGEpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaW50MzJfdCBpUmV0ID0gRkFMU0U7DQorICBGWF9DSEFSIHN0clRlbXBbM107DQorICBzdHJUZW1wWzJdID0gJ1wwJzsNCisgIGludDMyX3QgaUluZGV4ID0gMDsNCisgIGludDMyX3QgaVpvbmUgPSAwOw0KKyAgaW50MzJfdCBpID0gaUluZGV4Ow0KKyAgd2hpbGUgKGkgPCBpTGVuZ3RoKSB7DQorICAgIGlmICgoKihwRGF0YSArIGkpID4gJzknIHx8ICoocERhdGEgKyBpKSA8ICcwJykgJiYgKihwRGF0YSArIGkpICE9ICc6Jykgew0KKyAgICAgIGlab25lID0gaTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICArK2k7DQorICB9DQorICBpZiAoaSA9PSBpTGVuZ3RoKSB7DQorICAgIGlab25lID0gaUxlbmd0aDsNCisgIH0NCisgIGludDMyX3QgaVBvcyA9IDA7DQorICB3aGlsZSAoaUluZGV4IDwgaVpvbmUpIHsNCisgICAgaWYgKGlJbmRleCA+PSBpWm9uZSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmICgqKHBEYXRhICsgaUluZGV4KSA+ICc5JyB8fCAqKHBEYXRhICsgaUluZGV4KSA8ICcwJykgew0KKyAgICAgIHJldHVybiBpUmV0Ow0KKyAgICB9DQorICAgIHN0clRlbXBbMF0gPSAqKHBEYXRhICsgaUluZGV4KTsNCisgICAgaWYgKCoocERhdGEgKyBpSW5kZXggKyAxKSA+ICc5JyB8fCAqKHBEYXRhICsgaUluZGV4ICsgMSkgPCAnMCcpIHsNCisgICAgICByZXR1cm4gaVJldDsNCisgICAgfQ0KKyAgICBzdHJUZW1wWzFdID0gKihwRGF0YSArIGlJbmRleCArIDEpOw0KKyAgICBpZiAoRlhTWVNfYXRvaShzdHJUZW1wKSA+IDYwKSB7DQorICAgICAgcmV0dXJuIGlSZXQ7DQorICAgIH0NCisgICAgaWYgKCoocERhdGEgKyAyKSA9PSAnOicpIHsNCisgICAgICBpZiAoaVBvcyA9PSAwKSB7DQorICAgICAgICBpSG91ciA9IEZYU1lTX2F0b2koc3RyVGVtcCk7DQorICAgICAgICArK2lQb3M7DQorICAgICAgfSBlbHNlIGlmIChpUG9zID09IDEpIHsNCisgICAgICAgIGlNaW51dGUgPSBGWFNZU19hdG9pKHN0clRlbXApOw0KKyAgICAgICAgKytpUG9zOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpU2Vjb25kID0gRlhTWVNfYXRvaShzdHJUZW1wKTsNCisgICAgICB9DQorICAgICAgaUluZGV4ICs9IDM7DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKGlQb3MgPT0gMCkgew0KKyAgICAgICAgaUhvdXIgPSBGWFNZU19hdG9pKHN0clRlbXApOw0KKyAgICAgICAgKytpUG9zOw0KKyAgICAgIH0gZWxzZSBpZiAoaVBvcyA9PSAxKSB7DQorICAgICAgICBpTWludXRlID0gRlhTWVNfYXRvaShzdHJUZW1wKTsNCisgICAgICAgICsraVBvczsNCisgICAgICB9IGVsc2UgaWYgKGlQb3MgPT0gMikgew0KKyAgICAgICAgaVNlY29uZCA9IEZYU1lTX2F0b2koc3RyVGVtcCk7DQorICAgICAgICArK2lQb3M7DQorICAgICAgfQ0KKyAgICAgIGlJbmRleCArPSAyOw0KKyAgICB9DQorICB9DQorICBpZiAoKihwRGF0YSArIGlJbmRleCkgPT0gJy4nKSB7DQorICAgICsraUluZGV4Ow0KKyAgICBGWF9DSEFSIHN0clRlbXBbNF07DQorICAgIHN0clRlbXBbM10gPSAnXDAnOw0KKyAgICBpZiAoKihwRGF0YSArIGlJbmRleCkgPiAnOScgfHwgKihwRGF0YSArIGlJbmRleCkgPCAnMCcpIHsNCisgICAgICByZXR1cm4gaVJldDsNCisgICAgfQ0KKyAgICBzdHJUZW1wWzBdID0gKihwRGF0YSArIGlJbmRleCk7DQorICAgIGlmICgqKHBEYXRhICsgaUluZGV4ICsgMSkgPiAnOScgfHwgKihwRGF0YSArIGlJbmRleCArIDEpIDwgJzAnKSB7DQorICAgICAgcmV0dXJuIGlSZXQ7DQorICAgIH0NCisgICAgc3RyVGVtcFsxXSA9ICoocERhdGEgKyBpSW5kZXggKyAxKTsNCisgICAgaWYgKCoocERhdGEgKyBpSW5kZXggKyAyKSA+ICc5JyB8fCAqKHBEYXRhICsgaUluZGV4ICsgMikgPCAnMCcpIHsNCisgICAgICByZXR1cm4gaVJldDsNCisgICAgfQ0KKyAgICBzdHJUZW1wWzJdID0gKihwRGF0YSArIGlJbmRleCArIDIpOw0KKyAgICBpTWlsbGlTZWNvbmQgPSBGWFNZU19hdG9pKHN0clRlbXApOw0KKyAgICBpZiAoaU1pbGxpU2Vjb25kID4gMTAwKSB7DQorICAgICAgaU1pbGxpU2Vjb25kID0gMDsNCisgICAgICByZXR1cm4gaVJldDsNCisgICAgfQ0KKyAgICBpSW5kZXggKz0gMzsNCisgIH0NCisgIGludDMyX3QgaVNpZ24gPSAxOw0KKyAgaWYgKCoocERhdGEgKyBpSW5kZXgpID09ICd6JyB8fCAqKHBEYXRhICsgaUluZGV4KSA9PSAnWicpIHsNCisgICAgaVJldCA9IDE7DQorICAgIHJldHVybiBpUmV0Ow0KKyAgfSBlbHNlIGlmICgqKHBEYXRhICsgaUluZGV4KSA9PSAnKycpIHsNCisgICAgKytpSW5kZXg7DQorICB9IGVsc2UgaWYgKCoocERhdGEgKyBpSW5kZXgpID09ICctJykgew0KKyAgICBpU2lnbiA9IC0xOw0KKyAgICArK2lJbmRleDsNCisgIH0NCisgIGlQb3MgPSAwOw0KKyAgd2hpbGUgKGlJbmRleCA8IGlMZW5ndGgpIHsNCisgICAgaWYgKGlJbmRleCA+PSBpTGVuZ3RoKSB7DQorICAgICAgcmV0dXJuIGlSZXQ7DQorICAgIH0NCisgICAgaWYgKCoocERhdGEgKyBpSW5kZXgpID4gJzknIHx8ICoocERhdGEgKyBpSW5kZXgpIDwgJzAnKSB7DQorICAgICAgcmV0dXJuIGlSZXQ7DQorICAgIH0NCisgICAgc3RyVGVtcFswXSA9ICoocERhdGEgKyBpSW5kZXgpOw0KKyAgICBpZiAoKihwRGF0YSArIGlJbmRleCArIDEpID4gJzknIHx8ICoocERhdGEgKyBpSW5kZXggKyAxKSA8ICcwJykgew0KKyAgICAgIHJldHVybiBpUmV0Ow0KKyAgICB9DQorICAgIHN0clRlbXBbMV0gPSAqKHBEYXRhICsgaUluZGV4ICsgMSk7DQorICAgIGlmIChGWFNZU19hdG9pKHN0clRlbXApID4gNjApIHsNCisgICAgICByZXR1cm4gaVJldDsNCisgICAgfQ0KKyAgICBpZiAoKihwRGF0YSArIDIpID09ICc6Jykgew0KKyAgICAgIGlmIChpUG9zID09IDApIHsNCisgICAgICAgIGlab25lSG91ciA9IEZYU1lTX2F0b2koc3RyVGVtcCk7DQorICAgICAgfSBlbHNlIGlmIChpUG9zID09IDEpIHsNCisgICAgICAgIGlab25lTWludXRlID0gRlhTWVNfYXRvaShzdHJUZW1wKTsNCisgICAgICB9DQorICAgICAgaUluZGV4ICs9IDM7DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKCFpUG9zKSB7DQorICAgICAgICBpWm9uZUhvdXIgPSBGWFNZU19hdG9pKHN0clRlbXApOw0KKyAgICAgICAgKytpUG9zOw0KKyAgICAgIH0gZWxzZSBpZiAoaVBvcyA9PSAxKSB7DQorICAgICAgICBpWm9uZU1pbnV0ZSA9IEZYU1lTX2F0b2koc3RyVGVtcCk7DQorICAgICAgICArK2lQb3M7DQorICAgICAgfQ0KKyAgICAgIGlJbmRleCArPSAyOw0KKyAgICB9DQorICB9DQorICBpZiAoaUluZGV4IDwgaUxlbmd0aCkgew0KKyAgICByZXR1cm4gaVJldDsNCisgIH0NCisgIGlab25lSG91ciAqPSBpU2lnbjsNCisgIGlSZXQgPSBUUlVFOw0KKyAgcmV0dXJuIGlSZXQ7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GTTJKU0NvbnRleHQ6OklzSXNvRGF0ZVRpbWVGb3JtYXQoY29uc3QgRlhfQ0hBUiogcERhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpWWVhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlEYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSG91ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNaW51dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpU2Vjb25kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1pbGxpb25TZWNvbmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpWm9uZUhvdXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpWm9uZU1pbnV0ZSkgew0KKyAgaVllYXIgPSAwOw0KKyAgaU1vbnRoID0gMDsNCisgIGlEYXkgPSAwOw0KKyAgaUhvdXIgPSAwOw0KKyAgaU1pbnV0ZSA9IDA7DQorICBpU2Vjb25kID0gMDsNCisgIGlmICghcERhdGEpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaW50MzJfdCBpUmV0ID0gRkFMU0U7DQorICBpbnQzMl90IGlJbmRleCA9IDA7DQorICB3aGlsZSAoKihwRGF0YSArIGlJbmRleCkgIT0gJ1QnICYmICoocERhdGEgKyBpSW5kZXgpICE9ICd0Jykgew0KKyAgICBpZiAoaUluZGV4ID49IGlMZW5ndGgpIHsNCisgICAgICByZXR1cm4gaVJldDsNCisgICAgfQ0KKyAgICArK2lJbmRleDsNCisgIH0NCisgIGlmIChpSW5kZXggIT0gOCAmJiBpSW5kZXggIT0gMTApIHsNCisgICAgcmV0dXJuIGlSZXQ7DQorICB9DQorICBpbnQzMl90IGlTdHlsZSA9IC0xOw0KKyAgaVJldCA9IElzSXNvRGF0ZUZvcm1hdChwRGF0YSwgaUluZGV4LCBpU3R5bGUsIGlZZWFyLCBpTW9udGgsIGlEYXkpOw0KKyAgaWYgKCFpUmV0KSB7DQorICAgIHJldHVybiBpUmV0Ow0KKyAgfQ0KKyAgaWYgKCoocERhdGEgKyBpSW5kZXgpICE9ICdUJyAmJiAqKHBEYXRhICsgaUluZGV4KSAhPSAndCcpIHsNCisgICAgcmV0dXJuIGlSZXQ7DQorICB9DQorICArK2lJbmRleDsNCisgIGlmICgoKGlMZW5ndGggLSBpSW5kZXggPiAxMykgJiYgKGlMZW5ndGggLSBpSW5kZXggPCA2KSkgJiYNCisgICAgICAoaUxlbmd0aCAtIGlJbmRleCAhPSAxNSkpIHsNCisgICAgcmV0dXJuIGlSZXQ7DQorICB9DQorICBpUmV0ID0gSXNJc29UaW1lRm9ybWF0KHBEYXRhICsgaUluZGV4LCBpTGVuZ3RoIC0gaUluZGV4LCBpSG91ciwgaU1pbnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgaVNlY29uZCwgaU1pbGxpb25TZWNvbmQsIGlab25lSG91ciwgaVpvbmVNaW51dGUpOw0KKyAgaWYgKCFpUmV0KSB7DQorICAgIHJldHVybiBpUmV0Ow0KKyAgfQ0KKyAgaVJldCA9IFRSVUU7DQorICByZXR1cm4gaVJldDsNCit9DQorRlhfQk9PTCBDWEZBX0ZNMkpTQ29udGV4dDo6TG9jYWwySXNvRGF0ZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekRhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6Rm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzdHJJc29EYXRlKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgQ1hGQV9Eb2N1bWVudCogcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOw0KKyAgaWYgKCFwRG9jKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIElGWF9Mb2NhbGVNZ3IqIHBNZ3IgPSAoSUZYX0xvY2FsZU1nciopcERvYy0+R2V0TG9jYWxNZ3IoKTsNCisgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBOVUxMOw0KKyAgaWYgKHN6TG9jYWxlLklzRW1wdHkoKSkgew0KKyAgICBDWEZBX09iamVjdCogcFRoaXNOb2RlID0gcERvYy0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRUaGlzT2JqZWN0KCk7DQorICAgIEZYU1lTX2Fzc2VydChwVGhpc05vZGUtPklzTm9kZSgpKTsNCisgICAgQ1hGQV9XaWRnZXREYXRhIHdpZGdldERhdGEoKENYRkFfTm9kZSopcFRoaXNOb2RlKTsNCisgICAgcExvY2FsZSA9IHdpZGdldERhdGEuR2V0TG9jYWwoKTsNCisgIH0gZWxzZSB7DQorICAgIHBMb2NhbGUgPSBwTWdyLT5HZXRMb2NhbGVCeU5hbWUoDQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pMb2NhbGUuR2V0Q1N0cigpLCBzekxvY2FsZS5HZXRMZW5ndGgoKSkpOw0KKyAgfQ0KKyAgaWYgKCFwTG9jYWxlKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0Ow0KKyAgaWYgKHN6Rm9ybWF0LklzRW1wdHkoKSkgew0KKyAgICBwTG9jYWxlLT5HZXREYXRlUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0RlZmF1bHQsIHdzRm9ybWF0KTsNCisgIH0gZWxzZSB7DQorICAgIHdzRm9ybWF0ID0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekZvcm1hdC5HZXRDU3RyKCksIHN6Rm9ybWF0LkdldExlbmd0aCgpKTsNCisgIH0NCisgIENYRkFfTG9jYWxlVmFsdWUgd2lkZ2V0VmFsdWUoDQorICAgICAgWEZBX1ZUX0RBVEUsDQorICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6RGF0ZS5HZXRDU3RyKCksIHN6RGF0ZS5HZXRMZW5ndGgoKSksIHdzRm9ybWF0LA0KKyAgICAgIHBMb2NhbGUsIChDWEZBX0xvY2FsZU1nciopcE1ncik7DQorICBDRlhfVW5pdGltZSBkdCA9IHdpZGdldFZhbHVlLkdldERhdGUoKTsNCisgIHN0cklzb0RhdGUuRm9ybWF0KCIlNGQtJTAyZC0lMDJkIiwgZHQuR2V0WWVhcigpLCBkdC5HZXRNb250aCgpLCBkdC5HZXREYXkoKSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZNMkpTQ29udGV4dDo6TG9jYWwySXNvVGltZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelRpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6Rm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzdHJJc29UaW1lKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgQ1hGQV9Eb2N1bWVudCogcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOw0KKyAgaWYgKCFwRG9jKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIElGWF9Mb2NhbGVNZ3IqIHBNZ3IgPSAoSUZYX0xvY2FsZU1nciopcERvYy0+R2V0TG9jYWxNZ3IoKTsNCisgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBOVUxMOw0KKyAgaWYgKHN6TG9jYWxlLklzRW1wdHkoKSkgew0KKyAgICBDWEZBX09iamVjdCogcFRoaXNOb2RlID0gcERvYy0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRUaGlzT2JqZWN0KCk7DQorICAgIEZYU1lTX2Fzc2VydChwVGhpc05vZGUtPklzTm9kZSgpKTsNCisgICAgQ1hGQV9XaWRnZXREYXRhIHdpZGdldERhdGEoKENYRkFfTm9kZSopcFRoaXNOb2RlKTsNCisgICAgcExvY2FsZSA9IHdpZGdldERhdGEuR2V0TG9jYWwoKTsNCisgIH0gZWxzZSB7DQorICAgIHBMb2NhbGUgPSBwTWdyLT5HZXRMb2NhbGVCeU5hbWUoDQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pMb2NhbGUuR2V0Q1N0cigpLCBzekxvY2FsZS5HZXRMZW5ndGgoKSkpOw0KKyAgfQ0KKyAgaWYgKCFwTG9jYWxlKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0Ow0KKyAgaWYgKHN6Rm9ybWF0LklzRW1wdHkoKSkgew0KKyAgICBwTG9jYWxlLT5HZXRUaW1lUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0RlZmF1bHQsIHdzRm9ybWF0KTsNCisgIH0gZWxzZSB7DQorICAgIHdzRm9ybWF0ID0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekZvcm1hdC5HZXRDU3RyKCksIHN6Rm9ybWF0LkdldExlbmd0aCgpKTsNCisgIH0NCisgIHdzRm9ybWF0ID0gRlhfV1NUUkMoTCJ0aW1leyIpICsgd3NGb3JtYXQ7DQorICB3c0Zvcm1hdCArPSBGWF9XU1RSQyhMIn0iKTsNCisgIENYRkFfTG9jYWxlVmFsdWUgd2lkZ2V0VmFsdWUoDQorICAgICAgWEZBX1ZUX1RJTUUsDQorICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6VGltZS5HZXRDU3RyKCksIHN6VGltZS5HZXRMZW5ndGgoKSksIHdzRm9ybWF0LA0KKyAgICAgIHBMb2NhbGUsIChDWEZBX0xvY2FsZU1nciopcE1ncik7DQorICBDRlhfVW5pdGltZSB1dGltZSA9IHdpZGdldFZhbHVlLkdldFRpbWUoKTsNCisgIHN0cklzb1RpbWUuRm9ybWF0KCIlMDJkOiUwMmQ6JTAyZC4lMDNkIiwgdXRpbWUuR2V0SG91cigpLCB1dGltZS5HZXRNaW51dGUoKSwNCisgICAgICAgICAgICAgICAgICAgIHV0aW1lLkdldFNlY29uZCgpLCB1dGltZS5HZXRNaWxsaXNlY29uZCgpKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfRk0ySlNDb250ZXh0OjpJc29EYXRlMkxvY2FsKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0ckxvY2FsRGF0ZSkgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCisgIGlmICghcERvYykgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBJRlhfTG9jYWxlTWdyKiBwTWdyID0gKElGWF9Mb2NhbGVNZ3IqKXBEb2MtPkdldExvY2FsTWdyKCk7DQorICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gTlVMTDsNCisgIGlmIChzekxvY2FsZS5Jc0VtcHR5KCkpIHsNCisgICAgQ1hGQV9PYmplY3QqIHBUaGlzTm9kZSA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpOw0KKyAgICBGWFNZU19hc3NlcnQocFRoaXNOb2RlLT5Jc05vZGUoKSk7DQorICAgIENYRkFfV2lkZ2V0RGF0YSB3aWRnZXREYXRhKChDWEZBX05vZGUqKXBUaGlzTm9kZSk7DQorICAgIHBMb2NhbGUgPSB3aWRnZXREYXRhLkdldExvY2FsKCk7DQorICB9IGVsc2Ugew0KKyAgICBwTG9jYWxlID0gcE1nci0+R2V0TG9jYWxlQnlOYW1lKA0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6TG9jYWxlLkdldENTdHIoKSwgc3pMb2NhbGUuR2V0TGVuZ3RoKCkpKTsNCisgIH0NCisgIGlmICghcExvY2FsZSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdDsNCisgIGlmIChzekZvcm1hdC5Jc0VtcHR5KCkpIHsNCisgICAgcExvY2FsZS0+R2V0RGF0ZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0LCB3c0Zvcm1hdCk7DQorICB9IGVsc2Ugew0KKyAgICB3c0Zvcm1hdCA9DQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pGb3JtYXQuR2V0Q1N0cigpLCBzekZvcm1hdC5HZXRMZW5ndGgoKSk7DQorICB9DQorICBDWEZBX0xvY2FsZVZhbHVlIHdpZGdldFZhbHVlKA0KKyAgICAgIFhGQV9WVF9EQVRFLA0KKyAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekRhdGUuR2V0Q1N0cigpLCBzekRhdGUuR2V0TGVuZ3RoKCkpLA0KKyAgICAgIChDWEZBX0xvY2FsZU1nciopcE1ncik7DQorICBDRlhfV2lkZVN0cmluZyB3c1JldDsNCisgIHdpZGdldFZhbHVlLkZvcm1hdFBhdHRlcm5zKHdzUmV0LCB3c0Zvcm1hdCwgcExvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7DQorICBzdHJMb2NhbERhdGUgPSBGWF9VVEY4RW5jb2RlKHdzUmV0LCB3c1JldC5HZXRMZW5ndGgoKSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZNMkpTQ29udGV4dDo6SXNvVGltZTJMb2NhbChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelRpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6Rm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzdHJMb2NhbFRpbWUpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBDWEZBX0RvY3VtZW50KiBwRG9jID0gcENvbnRleHQtPkdldERvY3VtZW50KCk7DQorICBpZiAoIXBEb2MpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgSUZYX0xvY2FsZU1nciogcE1nciA9IChJRlhfTG9jYWxlTWdyKilwRG9jLT5HZXRMb2NhbE1ncigpOw0KKyAgSUZYX0xvY2FsZSogcExvY2FsZSA9IE5VTEw7DQorICBpZiAoc3pMb2NhbGUuSXNFbXB0eSgpKSB7DQorICAgIENYRkFfT2JqZWN0KiBwVGhpc05vZGUgPSBwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldFRoaXNPYmplY3QoKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBUaGlzTm9kZS0+SXNOb2RlKCkpOw0KKyAgICBDWEZBX1dpZGdldERhdGEgd2lkZ2V0RGF0YSgoQ1hGQV9Ob2RlKilwVGhpc05vZGUpOw0KKyAgICBwTG9jYWxlID0gd2lkZ2V0RGF0YS5HZXRMb2NhbCgpOw0KKyAgfSBlbHNlIHsNCisgICAgcExvY2FsZSA9IHBNZ3ItPkdldExvY2FsZUJ5TmFtZSgNCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekxvY2FsZS5HZXRDU3RyKCksIHN6TG9jYWxlLkdldExlbmd0aCgpKSk7DQorICB9DQorICBpZiAoIXBMb2NhbGUpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXQ7DQorICBpZiAoc3pGb3JtYXQuSXNFbXB0eSgpKSB7DQorICAgIHBMb2NhbGUtPkdldFRpbWVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRGVmYXVsdCwgd3NGb3JtYXQpOw0KKyAgfSBlbHNlIHsNCisgICAgd3NGb3JtYXQgPQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6Rm9ybWF0LkdldENTdHIoKSwgc3pGb3JtYXQuR2V0TGVuZ3RoKCkpOw0KKyAgfQ0KKyAgd3NGb3JtYXQgPSBGWF9XU1RSQyhMInRpbWV7IikgKyB3c0Zvcm1hdDsNCisgIHdzRm9ybWF0ICs9IEZYX1dTVFJDKEwifSIpOw0KKyAgQ1hGQV9Mb2NhbGVWYWx1ZSB3aWRnZXRWYWx1ZSgNCisgICAgICBYRkFfVlRfVElNRSwNCisgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pUaW1lLkdldENTdHIoKSwgc3pUaW1lLkdldExlbmd0aCgpKSwNCisgICAgICAoQ1hGQV9Mb2NhbGVNZ3IqKXBNZ3IpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXQ7DQorICB3aWRnZXRWYWx1ZS5Gb3JtYXRQYXR0ZXJucyh3c1JldCwgd3NGb3JtYXQsIHBMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpOw0KKyAgc3RyTG9jYWxUaW1lID0gRlhfVVRGOEVuY29kZSh3c1JldCwgd3NSZXQuR2V0TGVuZ3RoKCkpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GTTJKU0NvbnRleHQ6OkdldEdNVFRpbWUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pUaW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyR01UVGltZSkgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCisgIGlmICghcERvYykgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBJRlhfTG9jYWxlTWdyKiBwTWdyID0gKElGWF9Mb2NhbGVNZ3IqKXBEb2MtPkdldExvY2FsTWdyKCk7DQorICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gTlVMTDsNCisgIGlmIChzekxvY2FsZS5Jc0VtcHR5KCkpIHsNCisgICAgQ1hGQV9PYmplY3QqIHBUaGlzTm9kZSA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpOw0KKyAgICBGWFNZU19hc3NlcnQocFRoaXNOb2RlLT5Jc05vZGUoKSk7DQorICAgIENYRkFfV2lkZ2V0RGF0YSB3aWRnZXREYXRhKChDWEZBX05vZGUqKXBUaGlzTm9kZSk7DQorICAgIHBMb2NhbGUgPSB3aWRnZXREYXRhLkdldExvY2FsKCk7DQorICB9IGVsc2Ugew0KKyAgICBwTG9jYWxlID0gcE1nci0+R2V0TG9jYWxlQnlOYW1lKA0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6TG9jYWxlLkdldENTdHIoKSwgc3pMb2NhbGUuR2V0TGVuZ3RoKCkpKTsNCisgIH0NCisgIGlmICghcExvY2FsZSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdDsNCisgIGlmIChzekZvcm1hdC5Jc0VtcHR5KCkpIHsNCisgICAgcExvY2FsZS0+R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0LCB3c0Zvcm1hdCk7DQorICB9IGVsc2Ugew0KKyAgICB3c0Zvcm1hdCA9DQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pGb3JtYXQuR2V0Q1N0cigpLCBzekZvcm1hdC5HZXRMZW5ndGgoKSk7DQorICB9DQorICB3c0Zvcm1hdCA9IEZYX1dTVFJDKEwidGltZXsiKSArIHdzRm9ybWF0Ow0KKyAgd3NGb3JtYXQgKz0gRlhfV1NUUkMoTCJ9Iik7DQorICBDWEZBX0xvY2FsZVZhbHVlIHdpZGdldFZhbHVlKA0KKyAgICAgIFhGQV9WVF9USU1FLA0KKyAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelRpbWUuR2V0Q1N0cigpLCBzelRpbWUuR2V0TGVuZ3RoKCkpLA0KKyAgICAgIChDWEZBX0xvY2FsZU1nciopcE1ncik7DQorICBDRlhfV2lkZVN0cmluZyB3c1JldDsNCisgIHdpZGdldFZhbHVlLkZvcm1hdFBhdHRlcm5zKHdzUmV0LCB3c0Zvcm1hdCwgcExvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7DQorICBzdHJHTVRUaW1lID0gRlhfVVRGOEVuY29kZSh3c1JldCwgd3NSZXQuR2V0TGVuZ3RoKCkpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK2ludDMyX3QgQ1hGQV9GTTJKU0NvbnRleHQ6OkRhdGVTdHJpbmcyTnVtKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pEYXRlU3RyaW5nKSB7DQorICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KKyAgaW50MzJfdCBpTGVuZ3RoID0gc3pEYXRlU3RyaW5nLkdldExlbmd0aCgpOw0KKyAgRlhfQk9PTCBpUmV0ID0gRkFMU0U7DQorICBpbnQzMl90IGlTdHlsZSA9IC0xOw0KKyAgaW50MzJfdCBpWWVhciA9IDA7DQorICBpbnQzMl90IGlNb250aCA9IDA7DQorICBpbnQzMl90IGlEYXkgPSAwOw0KKyAgaW50MzJfdCBpSG91ciA9IDA7DQorICBpbnQzMl90IGlNaW51dGUgPSAwOw0KKyAgaW50MzJfdCBpU2Vjb25kID0gMDsNCisgIGludDMyX3QgaU1pbGxpb25TZWNvbmQgPSAwOw0KKyAgaW50MzJfdCBpWm9uZUhvdXIgPSAwOw0KKyAgaW50MzJfdCBpWm9uZU1pbnV0ZSA9IDA7DQorICBpZiAoaUxlbmd0aCA8PSAxMCkgew0KKyAgICBpUmV0ID0gSXNJc29EYXRlRm9ybWF0KHN6RGF0ZVN0cmluZy5HZXRDU3RyKCksIGlMZW5ndGgsIGlTdHlsZSwgaVllYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaU1vbnRoLCBpRGF5KTsNCisgIH0gZWxzZSB7DQorICAgIGlSZXQgPSBJc0lzb0RhdGVUaW1lRm9ybWF0KHN6RGF0ZVN0cmluZy5HZXRDU3RyKCksIGlMZW5ndGgsIGlZZWFyLCBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlEYXksIGlIb3VyLCBpTWludXRlLCBpU2Vjb25kLCBpTWlsbGlvblNlY29uZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVpvbmVIb3VyLCBpWm9uZU1pbnV0ZSk7DQorICB9DQorICBpZiAoIWlSZXQpIHsNCisgICAgYkZsYWdzID0gVFJVRTsNCisgIH0NCisgIEZYX0ZMT0FUIGREYXlzID0gMDsNCisgIGludDMyX3QgaSA9IDE7DQorICBpZiAoaVllYXIgPCAxOTAwKSB7DQorICAgIGJGbGFncyA9IFRSVUU7DQorICB9DQorICBpZiAoIWJGbGFncykgew0KKyAgICB3aGlsZSAoaVllYXIgLSBpID49IDE5MDApIHsNCisgICAgICBpZiAoKCEoKGlZZWFyIC0gaSkgJSA0KSAmJiAoKGlZZWFyIC0gaSkgJSAxMDApKSB8fCAhKChpWWVhciAtIGkpICUgNDAwKSkgew0KKyAgICAgICAgZERheXMgKz0gMzY2Ow0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBkRGF5cyArPSAzNjU7DQorICAgICAgfQ0KKyAgICAgICsraTsNCisgICAgfQ0KKyAgICBpID0gMTsNCisgICAgd2hpbGUgKGkgPCBpTW9udGgpIHsNCisgICAgICBpZiAoaSA9PSAyKSB7DQorICAgICAgICBpZiAoKCEoaVllYXIgJSA0KSAmJiAoaVllYXIgJSAxMDApKSB8fCAhKGlZZWFyICUgNDAwKSkgew0KKyAgICAgICAgICBkRGF5cyArPSAyOTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGREYXlzICs9IDI4Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSBpZiAoaSA8PSA3KSB7DQorICAgICAgICBpZiAoaSAlIDIgPT0gMCkgew0KKyAgICAgICAgICBkRGF5cyArPSAzMDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGREYXlzICs9IDMxOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAoaSAlIDIgPT0gMCkgew0KKyAgICAgICAgICBkRGF5cyArPSAzMTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGREYXlzICs9IDMwOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICArK2k7DQorICAgIH0NCisgICAgaSA9IDA7DQorICAgIHdoaWxlIChpRGF5IC0gaSA+IDApIHsNCisgICAgICBkRGF5cyArPSAxOw0KKyAgICAgICsraTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgZERheXMgPSAwOw0KKyAgfQ0KKyAgcmV0dXJuIChpbnQzMl90KWREYXlzOw0KK30NCisjZGVmaW5lIFhGQV9OIDE5DQorc3RhdGljIHVpbnQ4X3QgZ19zQWx0VGFibGVfRGF0ZVtdID0gew0KKyAgICBYRkFfTiwgWEZBX04sIFhGQV9OLCAzLCAgICAgOSwgICAgIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sDQorICAgIFhGQV9OLCAyLCAgICAgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwNCisgICAgWEZBX04sIFhGQV9OLCAxLCAgICAgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLA0KKyAgICBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sDQorICAgIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwNCisgICAgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwNCit9Ow0KK3N0YXRpYyB1aW50OF90IGdfc0FsdFRhYmxlX1RpbWVbXSA9IHsNCisgICAgMTQsICAgIFhGQV9OLCBYRkFfTiwgMywgICAgIDksICAgICBYRkFfTiwgWEZBX04sIDE1LCAgICBYRkFfTiwgWEZBX04sIFhGQV9OLA0KKyAgICBYRkFfTiwgNiwgICAgIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgNywgICAgIFhGQV9OLCBYRkFfTiwgWEZBX04sDQorICAgIFhGQV9OLCBYRkFfTiwgMSwgICAgIDE3LCAgICBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwNCisgICAgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgMTUsICAgIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLA0KKyAgICBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sDQorICAgIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sIFhGQV9OLCBYRkFfTiwgWEZBX04sDQorfTsNCitzdGF0aWMgdm9pZCBYRkFfRk1fQWx0ZXJuYXRlRGF0ZVRpbWVTeW1ib2xzKENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NBbHRTeW1ib2xzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcEFsdFRhYmxlKSB7DQorICBpbnQzMl90IG5MZW5ndGggPSB3c1BhdHRlcm4uR2V0TGVuZ3RoKCk7DQorICBGWF9CT09MIGJJbkNvbnN0UmFuZ2UgPSBGQUxTRTsNCisgIEZYX0JPT0wgYkVzY2FwZSA9IEZBTFNFOw0KKyAgaW50MzJfdCBpID0gMCwgbiA9IDA7DQorICB3aGlsZSAoaSA8IG5MZW5ndGgpIHsNCisgICAgRlhfV0NIQVIgd2MgPSB3c1BhdHRlcm5baV07DQorICAgIGlmICh3YyA9PSBMJ1wnJykgew0KKyAgICAgIGJJbkNvbnN0UmFuZ2UgPSAhYkluQ29uc3RSYW5nZTsNCisgICAgICBpZiAoYkVzY2FwZSkgew0KKyAgICAgICAgaSsrOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICB3c1BhdHRlcm4uRGVsZXRlKGkpOw0KKyAgICAgICAgbkxlbmd0aC0tOw0KKyAgICAgIH0NCisgICAgICBiRXNjYXBlID0gIWJFc2NhcGU7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKCFiSW5Db25zdFJhbmdlICYmIChuID0gd2MgLSBMJ0EnKSA+PSAwICYmIG4gPD0gKEwnYScgLSBMJ0EnKSkgew0KKyAgICAgIGludDMyX3QgbkFsdCA9IChpbnQzMl90KXBBbHRUYWJsZVtuXTsNCisgICAgICBpZiAobkFsdCAhPSBYRkFfTikgew0KKyAgICAgICAgd3NQYXR0ZXJuLlNldEF0KGksIHdzQWx0U3ltYm9sc1tuQWx0XSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGkrKzsNCisgICAgYkVzY2FwZSA9IEZBTFNFOw0KKyAgfQ0KK30NCisjdW5kZWYgWEZBX04NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpHZXRMb2NhbERhdGVGb3JtYXQoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pMb2NhbFN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0ckZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RhbmRhcmQpIHsNCisgIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgc3RyU3R5bGU7DQorICBzd2l0Y2ggKGlTdHlsZSkgew0KKyAgICBjYXNlIDA6DQorICAgICAgc3RyU3R5bGUgPSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAxOg0KKyAgICAgIHN0clN0eWxlID0gRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9TaG9ydDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAyOg0KKyAgICAgIHN0clN0eWxlID0gRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW07DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMzoNCisgICAgICBzdHJTdHlsZSA9IEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTG9uZzsNCisgICAgICBicmVhazsNCisgICAgY2FzZSA0Og0KKyAgICAgIHN0clN0eWxlID0gRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9GdWxsOw0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHN0clN0eWxlID0gRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW07DQorICAgICAgYnJlYWs7DQorICB9DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgQ1hGQV9Eb2N1bWVudCogcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOw0KKyAgaWYgKCFwRG9jKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElGWF9Mb2NhbGVNZ3IqIHBNZ3IgPSAoSUZYX0xvY2FsZU1nciopcERvYy0+R2V0TG9jYWxNZ3IoKTsNCisgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBOVUxMOw0KKyAgaWYgKHN6TG9jYWxTdHIuSXNFbXB0eSgpKSB7DQorICAgIENYRkFfT2JqZWN0KiBwVGhpc05vZGUgPSBwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldFRoaXNPYmplY3QoKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBUaGlzTm9kZS0+SXNOb2RlKCkpOw0KKyAgICBDWEZBX1dpZGdldERhdGEgd2lkZ2V0RGF0YSgoQ1hGQV9Ob2RlKilwVGhpc05vZGUpOw0KKyAgICBwTG9jYWxlID0gd2lkZ2V0RGF0YS5HZXRMb2NhbCgpOw0KKyAgfSBlbHNlIHsNCisgICAgcExvY2FsZSA9IHBNZ3ItPkdldExvY2FsZUJ5TmFtZSgNCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekxvY2FsU3RyLkdldENTdHIoKSwgc3pMb2NhbFN0ci5HZXRMZW5ndGgoKSkpOw0KKyAgfQ0KKyAgaWYgKCFwTG9jYWxlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHN0clJldDsNCisgIHBMb2NhbGUtPkdldERhdGVQYXR0ZXJuKHN0clN0eWxlLCBzdHJSZXQpOw0KKyAgaWYgKCFiU3RhbmRhcmQpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2xzOw0KKyAgICBwTG9jYWxlLT5HZXREYXRlVGltZVN5bWJvbHMod3NTeW1ib2xzKTsNCisgICAgWEZBX0ZNX0FsdGVybmF0ZURhdGVUaW1lU3ltYm9scyhzdHJSZXQsIHdzU3ltYm9scywgZ19zQWx0VGFibGVfRGF0ZSk7DQorICB9DQorICBzdHJGb3JtYXQgPSBGWF9VVEY4RW5jb2RlKHN0clJldCwgc3RyUmV0LkdldExlbmd0aCgpKTsNCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6R2V0TG9jYWxUaW1lRm9ybWF0KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TG9jYWxTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzdHJGb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlN0YW5kYXJkKSB7DQorICBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIHN0clN0eWxlOw0KKyAgc3dpdGNoIChpU3R5bGUpIHsNCisgICAgY2FzZSAwOg0KKyAgICAgIHN0clN0eWxlID0gRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW07DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMToNCisgICAgICBzdHJTdHlsZSA9IEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnQ7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgMjoNCisgICAgICBzdHJTdHlsZSA9IEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIDM6DQorICAgICAgc3RyU3R5bGUgPSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0xvbmc7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgNDoNCisgICAgICBzdHJTdHlsZSA9IEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRnVsbDsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBzdHJTdHlsZSA9IEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCisgIGlmICghcERvYykgew0KKyAgICByZXR1cm47DQorICB9DQorICBJRlhfTG9jYWxlTWdyKiBwTWdyID0gKElGWF9Mb2NhbGVNZ3IqKXBEb2MtPkdldExvY2FsTWdyKCk7DQorICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gTlVMTDsNCisgIGlmIChzekxvY2FsU3RyLklzRW1wdHkoKSkgew0KKyAgICBDWEZBX09iamVjdCogcFRoaXNPYmplY3QgPSBwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldFRoaXNPYmplY3QoKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBUaGlzT2JqZWN0LT5Jc05vZGUoKSk7DQorICAgIENYRkFfTm9kZSogcFRoaXNOb2RlID0gKENYRkFfTm9kZSopcFRoaXNPYmplY3Q7DQorICAgIENYRkFfV2lkZ2V0RGF0YSB3aWRnZXREYXRhKHBUaGlzTm9kZSk7DQorICAgIHBMb2NhbGUgPSB3aWRnZXREYXRhLkdldExvY2FsKCk7DQorICB9IGVsc2Ugew0KKyAgICBwTG9jYWxlID0gcE1nci0+R2V0TG9jYWxlQnlOYW1lKA0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6TG9jYWxTdHIuR2V0Q1N0cigpLCBzekxvY2FsU3RyLkdldExlbmd0aCgpKSk7DQorICB9DQorICBpZiAoIXBMb2NhbGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgc3RyUmV0Ow0KKyAgcExvY2FsZS0+R2V0VGltZVBhdHRlcm4oc3RyU3R5bGUsIHN0clJldCk7DQorICBpZiAoIWJTdGFuZGFyZCkgew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbHM7DQorICAgIHBMb2NhbGUtPkdldERhdGVUaW1lU3ltYm9scyh3c1N5bWJvbHMpOw0KKyAgICBYRkFfRk1fQWx0ZXJuYXRlRGF0ZVRpbWVTeW1ib2xzKHN0clJldCwgd3NTeW1ib2xzLCBnX3NBbHRUYWJsZV9UaW1lKTsNCisgIH0NCisgIHN0ckZvcm1hdCA9IEZYX1VURjhFbmNvZGUoc3RyUmV0LCBzdHJSZXQuR2V0TGVuZ3RoKCkpOw0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpHZXRTdGFuZGFyZERhdGVGb3JtYXQoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pMb2NhbFN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0ckZvcm1hdCkgew0KKyAgR2V0TG9jYWxEYXRlRm9ybWF0KGhUaGlzLCBpU3R5bGUsIHN6TG9jYWxTdHIsIHN0ckZvcm1hdCwgVFJVRSk7DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkdldFN0YW5kYXJkVGltZUZvcm1hdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyRm9ybWF0KSB7DQorICBHZXRMb2NhbFRpbWVGb3JtYXQoaFRoaXMsIGlTdHlsZSwgc3pMb2NhbFN0ciwgc3RyRm9ybWF0LCBUUlVFKTsNCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6TnVtMkFsbFRpbWUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlUaW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJHTSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyVGltZSkgew0KKyAgaW50MzJfdCBpSG91ciA9IDA7DQorICBpbnQzMl90IGlNaW4gPSAwOw0KKyAgaW50MzJfdCBpU2VjID0gMDsNCisgIGludDMyX3QgaVpvbmVIb3VyID0gMDsNCisgIGludDMyX3QgaVpvbmVNaW4gPSAwOw0KKyAgaW50MzJfdCBpWm9uZVNlYyA9IDA7DQorICBpSG91ciA9IHN0YXRpY19jYXN0PGludD4oaVRpbWUpIC8gMzYwMDAwMDsNCisgIGlNaW4gPSAoc3RhdGljX2Nhc3Q8aW50PihpVGltZSkgLSBpSG91ciAqIDM2MDAwMDApIC8gNjAwMDA7DQorICBpU2VjID0gKHN0YXRpY19jYXN0PGludD4oaVRpbWUpIC0gaUhvdXIgKiAzNjAwMDAwIC0gaU1pbiAqIDYwMDAwKSAvIDEwMDA7DQorICBpZiAoIWJHTSkgew0KKyAgICBHZXRMb2NhbFRpbWVab25lKGlab25lSG91ciwgaVpvbmVNaW4sIGlab25lU2VjKTsNCisgICAgaUhvdXIgKz0gaVpvbmVIb3VyOw0KKyAgICBpTWluICs9IGlab25lTWluOw0KKyAgICBpU2VjICs9IGlab25lU2VjOw0KKyAgfQ0KKyAgaW50MzJfdCBpUmV0ID0gMDsNCisgIENGWF9CeXRlU3RyaW5nIHN0cklzb1RpbWU7DQorICBzdHJJc29UaW1lLkZvcm1hdCgiJTAyZDolMDJkOiUwMmQiLCBpSG91ciwgaU1pbiwgaVNlYyk7DQorICBpZiAoYkdNKSB7DQorICAgIGlSZXQgPSBHZXRHTVRUaW1lKGhUaGlzLCBzdHJJc29UaW1lLCBzekZvcm1hdCwgc3pMb2NhbGUsIHN0clRpbWUpOw0KKyAgfSBlbHNlIHsNCisgICAgaVJldCA9IElzb1RpbWUyTG9jYWwoaFRoaXMsIHN0cklzb1RpbWUsIHN6Rm9ybWF0LCBzekxvY2FsZSwgc3RyVGltZSk7DQorICB9DQorICBpZiAoIWlSZXQpIHsNCisgICAgc3RyVGltZSA9ICIiOw0KKyAgfQ0KKyAgcmV0dXJuOw0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpHZXRMb2NhbFRpbWVab25lKGludDMyX3QmIGlIb3VyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1pbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlTZWMpIHsNCisgIHRpbWVfdCBub3c7DQorICB0aW1lKCZub3cpOw0KKyAgc3RydWN0IHRtKiBwR210ID0gZ210aW1lKCZub3cpOw0KKyAgaW50MzJfdCBpR01Ib3VyID0gcEdtdC0+dG1faG91cjsNCisgIGludDMyX3QgaUdNTWluID0gcEdtdC0+dG1fbWluOw0KKyAgaW50MzJfdCBpR01TZWMgPSBwR210LT50bV9zZWM7DQorICBzdHJ1Y3QgdG0qIHBMb2NhbCA9IGxvY2FsdGltZSgmbm93KTsNCisgIGludDMyX3QgaUxvY2FsSG91ciA9IHBMb2NhbC0+dG1faG91cjsNCisgIGludDMyX3QgaUxvY2FsTWluID0gcExvY2FsLT50bV9taW47DQorICBpbnQzMl90IGlMb2NhbFNlYyA9IHBMb2NhbC0+dG1fc2VjOw0KKyAgaUhvdXIgPSBpTG9jYWxIb3VyIC0gaUdNSG91cjsNCisgIGlNaW4gPSBpTG9jYWxNaW4gLSBpR01NaW47DQorICBpU2VjID0gaUxvY2FsU2VjIC0gaUdNU2VjOw0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpBcHIoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMykgew0KKyAgICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KKyAgICBGWF9ET1VCTEUgblByaW5jaXBhbCA9IDA7DQorICAgIEZYX0RPVUJMRSBuUGF5bWVudCA9IDA7DQorICAgIEZYX0RPVUJMRSBuUGVyaW9kcyA9IDA7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVHdvID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1RocmVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCisgICAgYkZsYWdzID0gKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSB8fCBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1R3bykgfHwNCisgICAgICAgICAgICAgIEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVGhyZWUpKTsNCisgICAgaWYgKGJGbGFncykgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBuUHJpbmNpcGFsID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ09uZSk7DQorICAgICAgblBheW1lbnQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnVHdvKTsNCisgICAgICBuUGVyaW9kcyA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdUaHJlZSk7DQorICAgICAgYkZsYWdzID0gKChuUHJpbmNpcGFsIDw9IDApIHx8IChuUGF5bWVudCA8PSAwKSB8fCAoblBlcmlvZHMgPD0gMCkpOw0KKyAgICAgIGlmIChiRmxhZ3MpIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfRE9VQkxFIHIgPQ0KKyAgICAgICAgICAgIDIgKiAoblBlcmlvZHMgKiBuUGF5bWVudCAtIG5QcmluY2lwYWwpIC8gKG5QZXJpb2RzICogblByaW5jaXBhbCk7DQorICAgICAgICBGWF9ET1VCTEUgblRlbXAgPSAxOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgblBlcmlvZHM7ICsraSkgew0KKyAgICAgICAgICBuVGVtcCAqPSAoMSArIHIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRE9VQkxFIG5SZXQgPSByICogblRlbXAgLyAoblRlbXAgLSAxKSAtIG5QYXltZW50IC8gblByaW5jaXBhbDsNCisgICAgICAgIHdoaWxlICgoblJldCA+IEZJTkFOQ0lBTF9QUkVDSVNJT04gfHwgblJldCA8IC1GSU5BTkNJQUxfUFJFQ0lTSU9OKSAmJg0KKyAgICAgICAgICAgICAgICghYkZsYWdzKSkgew0KKyAgICAgICAgICBGWF9ET1VCTEUgbkRlcml2YXRpdmUgPSAwOw0KKyAgICAgICAgICBuRGVyaXZhdGl2ZSA9DQorICAgICAgICAgICAgICAoKG5UZW1wICsgciAqIG5QZXJpb2RzICogKG5UZW1wIC8gKDEgKyByKSkpICogKG5UZW1wIC0gMSkgLQ0KKyAgICAgICAgICAgICAgIChyICogblRlbXAgKiBuUGVyaW9kcyAqIChuVGVtcCAvICgxICsgcikpKSkgLw0KKyAgICAgICAgICAgICAgKChuVGVtcCAtIDEpICogKG5UZW1wIC0gMSkpOw0KKyAgICAgICAgICBpZiAobkRlcml2YXRpdmUgPT0gMCkgew0KKyAgICAgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgciA9IHIgLSBuUmV0IC8gbkRlcml2YXRpdmU7DQorICAgICAgICAgIG5UZW1wID0gMTsNCisgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgblBlcmlvZHM7ICsraSkgew0KKyAgICAgICAgICAgIG5UZW1wICo9ICgxICsgcik7DQorICAgICAgICAgIH0NCisgICAgICAgICAgblJldCA9IHIgKiBuVGVtcCAvIChuVGVtcCAtIDEpIC0gblBheW1lbnQgLyBuUHJpbmNpcGFsOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGJGbGFncykgew0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICByID0gciAqIDEyOw0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCByKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1R3byk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVGhyZWUpOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkFwciIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpDVGVybShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMykgew0KKyAgICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KKyAgICBGWF9GTE9BVCBuUmF0ZSA9IDA7DQorICAgIEZYX0ZMT0FUIG5GdXR1cmVWYWx1ZSA9IDA7DQorICAgIEZYX0ZMT0FUIG5Jbml0QW1vdW50ID0gMDsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVGhyZWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICBiRmxhZ3MgPSAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpIHx8IEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVHdvKSB8fA0KKyAgICAgICAgICAgICAgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUaHJlZSkpOw0KKyAgICBpZiAoYkZsYWdzKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG5SYXRlID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnT25lKTsNCisgICAgICBuRnV0dXJlVmFsdWUgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdUd28pOw0KKyAgICAgIG5Jbml0QW1vdW50ID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnVGhyZWUpOw0KKyAgICAgIGJGbGFncyA9ICgoblJhdGUgPD0gMCkgfHwgKG5GdXR1cmVWYWx1ZSA8PSAwKSB8fCAobkluaXRBbW91bnQgPD0gMCkpOw0KKyAgICAgIGlmIChiRmxhZ3MpIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0RmxvYXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbG9nKChGWF9GTE9BVCkobkZ1dHVyZVZhbHVlIC8gbkluaXRBbW91bnQpKSAvDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbG9nKChGWF9GTE9BVCkoMSArIG5SYXRlKSkpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUaHJlZSk7DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiQ1Rlcm0iKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RlYoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDMpIHsNCisgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgRlhfRE9VQkxFIG5BbW91bnQgPSAwOw0KKyAgICBGWF9ET1VCTEUgblJhdGUgPSAwOw0KKyAgICBGWF9ET1VCTEUgblBlcmlvZCA9IDA7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVHdvID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1RocmVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCisgICAgYkZsYWdzID0gKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSB8fCBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1R3bykgfHwNCisgICAgICAgICAgICAgIEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVGhyZWUpKTsNCisgICAgaWYgKGJGbGFncykgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBuQW1vdW50ID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ09uZSk7DQorICAgICAgblJhdGUgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnVHdvKTsNCisgICAgICBuUGVyaW9kID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1RocmVlKTsNCisgICAgICBiRmxhZ3MgPSAoKG5SYXRlIDwgMCkgfHwgKG5QZXJpb2QgPD0gMCkgfHwgKG5BbW91bnQgPD0gMCkpOw0KKyAgICAgIGlmIChiRmxhZ3MpIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfRE9VQkxFIGRSZXN1bHQgPSAwOw0KKyAgICAgICAgaWYgKCFuUmF0ZSkgew0KKyAgICAgICAgICBkUmVzdWx0ID0gbkFtb3VudCAqIG5QZXJpb2Q7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBGWF9ET1VCTEUgblRlbXAgPSAxOw0KKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5QZXJpb2Q7ICsraSkgew0KKyAgICAgICAgICAgIG5UZW1wICo9IDEgKyBuUmF0ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBkUmVzdWx0ID0gbkFtb3VudCAqIChuVGVtcCAtIDEpIC8gblJhdGU7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBkUmVzdWx0KTsNCisgICAgICB9DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1R3byk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVGhyZWUpOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkZWIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OklQbXQoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSA1KSB7DQorICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgIEZYX0ZMT0FUIG5QcmluY3BhbEFtb3VudCA9IDA7DQorICAgIEZYX0ZMT0FUIG5SYXRlID0gMDsNCisgICAgRlhfRkxPQVQgblBheW1lbnQgPSAwOw0KKyAgICBGWF9GTE9BVCBuRmlyc3RNb250aCA9IDA7DQorICAgIEZYX0ZMT0FUIG5OdW1iZXJPZk1vbnRocyA9IDA7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVHdvID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1RocmVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ0ZvdXIgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDMpOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnRml2ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgNCk7DQorICAgIGJGbGFncyA9IChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkgfHwgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUd28pIHx8DQorICAgICAgICAgICAgICBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1RocmVlKSB8fCBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ0ZvdXIpIHx8DQorICAgICAgICAgICAgICBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ0ZpdmUpKTsNCisgICAgaWYgKGJGbGFncykgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBuUHJpbmNwYWxBbW91bnQgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdPbmUpOw0KKyAgICAgIG5SYXRlID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnVHdvKTsNCisgICAgICBuUGF5bWVudCA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ1RocmVlKTsNCisgICAgICBuRmlyc3RNb250aCA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ0ZvdXIpOw0KKyAgICAgIG5OdW1iZXJPZk1vbnRocyA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ0ZpdmUpOw0KKyAgICAgIGJGbGFncyA9ICgoblByaW5jcGFsQW1vdW50IDw9IDApIHx8IChuUmF0ZSA8PSAwKSB8fCAoblBheW1lbnQgPD0gMCkgfHwNCisgICAgICAgICAgICAgICAgKG5GaXJzdE1vbnRoIDwgMCkgfHwgKG5OdW1iZXJPZk1vbnRocyA8IDApKTsNCisgICAgICBpZiAoYkZsYWdzKSB7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEZYX0ZMT0FUIGZSZXN1bHQgPSAwOw0KKyAgICAgICAgRlhfRkxPQVQgblJhdGVPZk1vbnRoID0gblJhdGUgLyAxMjsNCisgICAgICAgIGludDMyX3QgaU51bXMgPQ0KKyAgICAgICAgICAgIChpbnQzMl90KSgoRlhTWVNfbG9nMTAoKEZYX0ZMT0FUKShuUGF5bWVudCAvIG5QcmluY3BhbEFtb3VudCkpIC0NCisgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX2xvZzEwKChGWF9GTE9BVCkoblBheW1lbnQgLyBuUHJpbmNwYWxBbW91bnQgLQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUmF0ZU9mTW9udGgpKSkgLw0KKyAgICAgICAgICAgICAgICAgICAgICBGWFNZU19sb2cxMCgoRlhfRkxPQVQpKDEgKyBuUmF0ZU9mTW9udGgpKSk7DQorICAgICAgICBpbnQzMl90IGlFbmQgPSAoaW50MzJfdCkobkZpcnN0TW9udGggKyBuTnVtYmVyT2ZNb250aHMgLSAxKTsNCisgICAgICAgIGlmIChpRW5kID4gaU51bXMpIHsNCisgICAgICAgICAgaUVuZCA9IGlOdW1zOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRkxPQVQgblN1bSA9IDA7DQorICAgICAgICBpZiAoblBheW1lbnQgPCBuUHJpbmNwYWxBbW91bnQgKiBuUmF0ZU9mTW9udGgpIHsNCisgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICAgICAgZlJlc3VsdCA9IDA7DQorICAgICAgICB9DQorICAgICAgICBpZiAoIWJGbGFncykgew0KKyAgICAgICAgICBpbnQzMl90IGkgPSAwOw0KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbkZpcnN0TW9udGggLSAxOyArK2kpIHsNCisgICAgICAgICAgICBuUHJpbmNwYWxBbW91bnQgLT0gblBheW1lbnQgLSBuUHJpbmNwYWxBbW91bnQgKiBuUmF0ZU9mTW9udGg7DQorICAgICAgICAgIH0NCisgICAgICAgICAgZm9yICg7IGkgPCBpRW5kOyArK2kpIHsNCisgICAgICAgICAgICBuU3VtICs9IG5QcmluY3BhbEFtb3VudCAqIG5SYXRlT2ZNb250aDsNCisgICAgICAgICAgICBuUHJpbmNwYWxBbW91bnQgLT0gblBheW1lbnQgLSBuUHJpbmNwYWxBbW91bnQgKiBuUmF0ZU9mTW9udGg7DQorICAgICAgICAgIH0NCisgICAgICAgICAgZlJlc3VsdCA9IG5TdW07DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRGbG9hdChhcmdzLkdldFJldHVyblZhbHVlKCksIGZSZXN1bHQpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUaHJlZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRm91cik7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRml2ZSk7DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiSVBtdCIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpOUFYoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID4gMikgew0KKyAgICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KKyAgICBGWEpTRV9IVkFMVUUqIGFyZ1ZhbHVlcyA9IEZYX0FsbG9jKEZYSlNFX0hWQUxVRSwgYXJnYyk7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgew0KKyAgICAgIGFyZ1ZhbHVlc1tpXSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgaSk7DQorICAgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVmFsdWVzW2ldKSkgew0KKyAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFiRmxhZ3MpIHsNCisgICAgICBGWF9ET1VCTEUgblJhdGUgPSAwOw0KKyAgICAgIG5SYXRlID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1ZhbHVlc1swXSk7DQorICAgICAgaWYgKG5SYXRlIDw9IDApIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhfRE9VQkxFKiBwRGF0YSA9IEZYX0FsbG9jKEZYX0RPVUJMRSwgYXJnYyAtIDEpOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7DQorICAgICAgICAgIHBEYXRhW2kgLSAxXSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdWYWx1ZXNbaV0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRE9VQkxFIG5TdW0gPSAwOw0KKyAgICAgICAgaW50MzJfdCBpSW5kZXggPSAwOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYXJnYyAtIDE7IGkrKykgew0KKyAgICAgICAgICBGWF9ET1VCTEUgblRlbXAgPSAxOw0KKyAgICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPD0gaTsgaisrKSB7DQorICAgICAgICAgICAgblRlbXAgKj0gMSArIG5SYXRlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIEZYX0RPVUJMRSBuTnVtID0gKihwRGF0YSArIGlJbmRleCsrKTsNCisgICAgICAgICAgblN1bSArPSBuTnVtIC8gblRlbXA7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBuU3VtKTsNCisgICAgICAgIEZYX0ZyZWUocERhdGEpOw0KKyAgICAgICAgcERhdGEgPSAwOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0NCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdWYWx1ZXNbaV0pOw0KKyAgICB9DQorICAgIEZYX0ZyZWUoYXJnVmFsdWVzKTsNCisgIH0gZWxzZSB7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJOUFYiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6UG10KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDMpIHsNCisgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgRlhfRkxPQVQgblByaW5jaXBhbCA9IDA7DQorICAgIEZYX0ZMT0FUIG5SYXRlID0gMDsNCisgICAgRlhfRkxPQVQgblBlcmlvZHMgPSAwOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdUaHJlZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQorICAgIGJGbGFncyA9IChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkgfHwgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUd28pIHx8DQorICAgICAgICAgICAgICBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1RocmVlKSk7DQorICAgIGlmIChiRmxhZ3MpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgblByaW5jaXBhbCA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ09uZSk7DQorICAgICAgblJhdGUgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdUd28pOw0KKyAgICAgIG5QZXJpb2RzID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnVGhyZWUpOw0KKyAgICAgIGJGbGFncyA9ICgoblByaW5jaXBhbCA8PSAwKSB8fCAoblJhdGUgPD0gMCkgfHwgKG5QZXJpb2RzIDw9IDApKTsNCisgICAgICBpZiAoYkZsYWdzKSB7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEZYX0ZMT0FUIG5TdW0gPSAwOw0KKyAgICAgICAgRlhfRkxPQVQgblRtcCA9IDEgKyBuUmF0ZTsNCisgICAgICAgIG5TdW0gPSBuVG1wOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgblBlcmlvZHMgLSAxOyArK2kpIHsNCisgICAgICAgICAgblN1bSAqPSBuVG1wOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0RmxvYXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5QcmluY2lwYWwgKiBuUmF0ZSAqIG5TdW0pIC8gKG5TdW0gLSAxKSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1RocmVlKTsNCisgIH0gZWxzZSB7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJQbXQiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6UFBtdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDUpIHsNCisgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgRlhfRkxPQVQgblByaW5jcGFsQW1vdW50ID0gMDsNCisgICAgRlhfRkxPQVQgblJhdGUgPSAwOw0KKyAgICBGWF9GTE9BVCBuUGF5bWVudCA9IDA7DQorICAgIEZYX0ZMT0FUIG5GaXJzdE1vbnRoID0gMDsNCisgICAgRlhfRkxPQVQgbk51bWJlck9mTW9udGhzID0gMDsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVGhyZWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnRm91ciA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMyk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdGaXZlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCA0KTsNCisgICAgYkZsYWdzID0gKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSB8fCBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1R3bykgfHwNCisgICAgICAgICAgICAgIEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVGhyZWUpIHx8IEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnRm91cikgfHwNCisgICAgICAgICAgICAgIEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnRml2ZSkpOw0KKyAgICBpZiAoYkZsYWdzKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG5QcmluY3BhbEFtb3VudCA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ09uZSk7DQorICAgICAgblJhdGUgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdUd28pOw0KKyAgICAgIG5QYXltZW50ID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnVGhyZWUpOw0KKyAgICAgIG5GaXJzdE1vbnRoID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnRm91cik7DQorICAgICAgbk51bWJlck9mTW9udGhzID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnRml2ZSk7DQorICAgICAgYkZsYWdzID0gKChuUHJpbmNwYWxBbW91bnQgPD0gMCkgfHwgKG5SYXRlIDw9IDApIHx8IChuUGF5bWVudCA8PSAwKSB8fA0KKyAgICAgICAgICAgICAgICAobkZpcnN0TW9udGggPCAwKSB8fCAobk51bWJlck9mTW9udGhzIDwgMCkpOw0KKyAgICAgIGlmIChiRmxhZ3MpIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaW50MzJfdCBpRW5kID0gKGludDMyX3QpKG5GaXJzdE1vbnRoICsgbk51bWJlck9mTW9udGhzIC0gMSk7DQorICAgICAgICBGWF9GTE9BVCBuU3VtID0gMDsNCisgICAgICAgIEZYX0ZMT0FUIG5SYXRlT2ZNb250aCA9IG5SYXRlIC8gMTI7DQorICAgICAgICBpbnQzMl90IGlOdW1zID0NCisgICAgICAgICAgICAoaW50MzJfdCkoKEZYU1lTX2xvZzEwKChGWF9GTE9BVCkoblBheW1lbnQgLyBuUHJpbmNwYWxBbW91bnQpKSAtDQorICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19sb2cxMCgoRlhfRkxPQVQpKG5QYXltZW50IC8gblByaW5jcGFsQW1vdW50IC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblJhdGVPZk1vbnRoKSkpIC8NCisgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfbG9nMTAoKEZYX0ZMT0FUKSgxICsgblJhdGVPZk1vbnRoKSkpOw0KKyAgICAgICAgaWYgKGlFbmQgPiBpTnVtcykgew0KKyAgICAgICAgICBpRW5kID0gaU51bXM7DQorICAgICAgICB9DQorICAgICAgICBpZiAoblBheW1lbnQgPCBuUHJpbmNwYWxBbW91bnQgKiBuUmF0ZU9mTW9udGgpIHsNCisgICAgICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICghYkZsYWdzKSB7DQorICAgICAgICAgIGludDMyX3QgaSA9IDA7DQorICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuRmlyc3RNb250aCAtIDE7ICsraSkgew0KKyAgICAgICAgICAgIG5QcmluY3BhbEFtb3VudCAtPSBuUGF5bWVudCAtIG5QcmluY3BhbEFtb3VudCAqIG5SYXRlT2ZNb250aDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBGWF9GTE9BVCBuVGVtcCA9IDA7DQorICAgICAgICAgIGZvciAoOyBpIDwgaUVuZDsgKytpKSB7DQorICAgICAgICAgICAgblRlbXAgPSBuUGF5bWVudCAtIG5QcmluY3BhbEFtb3VudCAqIG5SYXRlT2ZNb250aDsNCisgICAgICAgICAgICBuU3VtICs9IG5UZW1wOw0KKyAgICAgICAgICAgIG5QcmluY3BhbEFtb3VudCAtPSBuVGVtcDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRGbG9hdChhcmdzLkdldFJldHVyblZhbHVlKCksIG5TdW0pOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUaHJlZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRm91cik7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRml2ZSk7DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiUFBtdCIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpQVihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMykgew0KKyAgICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KKyAgICBGWF9ET1VCTEUgbkFtb3VudCA9IDA7DQorICAgIEZYX0RPVUJMRSBuUmF0ZSA9IDA7DQorICAgIEZYX0RPVUJMRSBuUGVyaW9kID0gMDsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVGhyZWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICBiRmxhZ3MgPSAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpIHx8IEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVHdvKSB8fA0KKyAgICAgICAgICAgICAgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUaHJlZSkpOw0KKyAgICBpZiAoYkZsYWdzKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG5BbW91bnQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnT25lKTsNCisgICAgICBuUmF0ZSA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdUd28pOw0KKyAgICAgIG5QZXJpb2QgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnVGhyZWUpOw0KKyAgICAgIGJGbGFncyA9ICgobkFtb3VudCA8PSAwKSB8fCAoblJhdGUgPCAwKSB8fCAoblBlcmlvZCA8PSAwKSk7DQorICAgICAgaWYgKGJGbGFncykgew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBGWF9ET1VCTEUgblRlbXAgPSAxOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgblBlcmlvZDsgKytpKSB7DQorICAgICAgICAgIG5UZW1wICo9IDEgKyBuUmF0ZTsNCisgICAgICAgIH0NCisgICAgICAgIG5UZW1wID0gMSAvIG5UZW1wOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0RG91YmxlKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQW1vdW50ICogKCgxIC0gblRlbXApIC8gblJhdGUpKTsNCisgICAgICB9DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1R3byk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVGhyZWUpOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIlBWIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlJhdGUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAzKSB7DQorICAgIEZYX0JPT0wgYkZsYWdzID0gRkFMU0U7DQorICAgIEZYX0ZMT0FUIG5GdXR1cmUgPSAwOw0KKyAgICBGWF9GTE9BVCBuUHJlc2VudCA9IDA7DQorICAgIEZYX0ZMT0FUIG5Ub3RhbE51bWJlciA9IDA7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVHdvID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1RocmVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCisgICAgYkZsYWdzID0gKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSB8fCBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1R3bykgfHwNCisgICAgICAgICAgICAgIEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVGhyZWUpKTsNCisgICAgaWYgKGJGbGFncykgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBuRnV0dXJlID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnT25lKTsNCisgICAgICBuUHJlc2VudCA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ1R3byk7DQorICAgICAgblRvdGFsTnVtYmVyID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnVGhyZWUpOw0KKyAgICAgIGJGbGFncyA9ICgobkZ1dHVyZSA8PSAwKSB8fCAoblByZXNlbnQgPCAwKSB8fCAoblRvdGFsTnVtYmVyIDw9IDApKTsNCisgICAgICBpZiAoYkZsYWdzKSB7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEZsb2F0KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWFNZU19wb3coKEZYX0ZMT0FUKShuRnV0dXJlIC8gblByZXNlbnQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKDEgLyBuVG90YWxOdW1iZXIpKSAtDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSkpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUaHJlZSk7DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiUmF0ZSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpUZXJtKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMykgew0KKyAgICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KKyAgICBGWF9GTE9BVCBuTW91bnQgPSAwOw0KKyAgICBGWF9GTE9BVCBuUmF0ZSA9IDA7DQorICAgIEZYX0ZMT0FUIG5GdXR1cmUgPSAwOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdUaHJlZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQorICAgIGJGbGFncyA9IChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnT25lKSB8fCBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnVHdvKSB8fA0KKyAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1RocmVlKSk7DQorICAgIGlmIChiRmxhZ3MpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgbk1vdW50ID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnT25lKTsNCisgICAgICBuUmF0ZSA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ1R3byk7DQorICAgICAgbkZ1dHVyZSA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ1RocmVlKTsNCisgICAgICBiRmxhZ3MgPSAoKG5Nb3VudCA8PSAwKSB8fCAoblJhdGUgPD0gMCkgfHwgKG5GdXR1cmUgPD0gMCkpOw0KKyAgICAgIGlmIChiRmxhZ3MpIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0RmxvYXQoDQorICAgICAgICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgIChGWFNZU19sb2coKEZYX0ZMT0FUKShuRnV0dXJlIC8gbk1vdW50ICogblJhdGUpICsgMSkgLw0KKyAgICAgICAgICAgICBGWFNZU19sb2coKEZYX0ZMT0FUKSgxICsgblJhdGUpKSkpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUaHJlZSk7DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiVGVybSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpDaG9vc2UoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID4gMSkgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gYXJncy5HZXRWYWx1ZSgwKTsNCisgICAgRlhfQk9PTCBhcmdPbmVJc051bGwgPSBGQUxTRTsNCisgICAgaW50MzJfdCBpSW5kZXggPSAwOw0KKyAgICBhcmdPbmVJc051bGwgPSBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSk7DQorICAgIGlmICghYXJnT25lSXNOdWxsKSB7DQorICAgICAgaUluZGV4ID0gKGludDMyX3QpSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnT25lKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgIGlmIChhcmdPbmVJc051bGwpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSBpZiAoaUluZGV4IDwgMSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAiIik7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhfQk9PTCBiRm91bmQgPSBGQUxTRTsNCisgICAgICBGWF9CT09MIGJTdG9wQ291bnRlckZsYWdzID0gRkFMU0U7DQorICAgICAgaW50MzJfdCBpQXJnSW5kZXggPSAxOw0KKyAgICAgIGludDMyX3QgaVZhbHVlSW5kZXggPSAwOw0KKyAgICAgIHdoaWxlICghYkZvdW5kICYmICFiU3RvcENvdW50ZXJGbGFncyAmJiAoaUFyZ0luZGV4IDwgYXJnYykpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBhcmdJbmRleFZhbHVlID0gYXJncy5HZXRWYWx1ZShpQXJnSW5kZXgpOw0KKyAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnSW5kZXhWYWx1ZSkpIHsNCisgICAgICAgICAgRlhKU0VfSFZBTFVFIGxlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChhcmdJbmRleFZhbHVlLCAibGVuZ3RoIiwgbGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgICBpbnQzMl90IGlMZW5ndGggPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIobGVuZ3RoVmFsdWUpOw0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxlbmd0aFZhbHVlKTsNCisgICAgICAgICAgaWYgKGlMZW5ndGggPiAzKSB7DQorICAgICAgICAgICAgYlN0b3BDb3VudGVyRmxhZ3MgPSBUUlVFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlWYWx1ZUluZGV4ICs9IChpTGVuZ3RoIC0gMik7DQorICAgICAgICAgIGlmIChpVmFsdWVJbmRleCA+PSBpSW5kZXgpIHsNCisgICAgICAgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGpzb2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ0luZGV4VmFsdWUsIDEsIHByb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeCgNCisgICAgICAgICAgICAgICAgYXJnSW5kZXhWYWx1ZSwgKChpTGVuZ3RoIC0gMSkgLSAoaVZhbHVlSW5kZXggLSBpSW5kZXgpKSwNCisgICAgICAgICAgICAgICAganNvYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgICAgICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGpzb2JqZWN0VmFsdWUsIG5ld1Byb3BlcnR5KTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcHJvcFN0cjsNCisgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wU3RyKTsNCisgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoanNvYmplY3RWYWx1ZSwgcHJvcFN0ciwgbmV3UHJvcGVydHkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0Nob29zZWQ7DQorICAgICAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKG5ld1Byb3BlcnR5LCBic0Nob29zZWQpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBic0Nob29zZWQpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobmV3UHJvcGVydHkpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNvYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCisgICAgICAgICAgICBiRm91bmQgPSBUUlVFOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBpVmFsdWVJbmRleCsrOw0KKyAgICAgICAgICBpZiAoaVZhbHVlSW5kZXggPT0gaUluZGV4KSB7DQorICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNDaG9vc2VkOw0KKyAgICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdJbmRleFZhbHVlLCBic0Nob29zZWQpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBic0Nob29zZWQpOw0KKyAgICAgICAgICAgIGJGb3VuZCA9IFRSVUU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnSW5kZXhWYWx1ZSk7DQorICAgICAgICBpQXJnSW5kZXgrKzsNCisgICAgICB9DQorICAgICAgaWYgKCFiRm91bmQpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAiIik7DQorICAgICAgfQ0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJDaG9vc2UiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RXhpc3RzKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMSkgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gYXJncy5HZXRWYWx1ZSgwKTsNCisgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIEZYSlNFX1ZhbHVlX0lzT2JqZWN0KGFyZ09uZSkpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJFeGlzdHMiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6SGFzVmFsdWUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMSkgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhhcmdPbmUpKSB7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgdmFsdWVTdHI7DQorICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGFyZ09uZSwgdmFsdWVTdHIpOw0KKyAgICAgIHZhbHVlU3RyLlRyaW1MZWZ0KCk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksICghdmFsdWVTdHIuSXNFbXB0eSgpKSk7DQorICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNOdW1iZXIoYXJnT25lKSB8fCBGWEpTRV9WYWx1ZV9Jc0Jvb2xlYW4oYXJnT25lKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBUUlVFKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRkFMU0UpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkhhc1ZhbHVlIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Ok9uZW9mKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA+IDEpIHsNCisgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEZYSlNFX0hWQUxVRSogcGFyYW1ldGVyc1ZhbHVlID0gMDsNCisgICAgaW50MzJfdCBpQ291bnQgPSAwOw0KKyAgICB1bmZvbGRBcmdzKGhUaGlzLCBhcmdzLCBwYXJhbWV0ZXJzVmFsdWUsIGlDb3VudCwgMSk7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgaWYgKHNpbXBsZVZhbHVlQ29tcGFyZShoVGhpcywgYXJnT25lLCBwYXJhbWV0ZXJzVmFsdWVbaV0pKSB7DQorICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBiRmxhZ3MpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwYXJhbWV0ZXJzVmFsdWVbaV0pOw0KKyAgICB9DQorICAgIEZYX0ZyZWUocGFyYW1ldGVyc1ZhbHVlKTsNCisgICAgcGFyYW1ldGVyc1ZhbHVlID0gMDsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIk9uZW9mIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OldpdGhpbihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAzKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ09uZSkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRVbmRlZmluZWQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWEpTRV9IVkFMVUUgYXJnTG93ID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICBGWEpTRV9IVkFMVUUgYXJnSGVpZ2h0ID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCisgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdW1iZXIoYXJnT25lKSkgew0KKyAgICAgICAgRlhfRkxPQVQgb25lTnVtYmVyID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnT25lKTsNCisgICAgICAgIEZYX0ZMT0FUIGxvd051bWJlciA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ0xvdyk7DQorICAgICAgICBGWF9GTE9BVCBoZWlnaHROdW1iZXIgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdIZWlnaHQpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcigNCisgICAgICAgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgKChvbmVOdW1iZXIgPj0gbG93TnVtYmVyKSAmJiAob25lTnVtYmVyIDw9IGhlaWdodE51bWJlcikpKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgb25lU3RyaW5nOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbG93U3RyaW5nOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgaGVpZ2h0U3RyaW5nOw0KKyAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgb25lU3RyaW5nKTsNCisgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdMb3csIGxvd1N0cmluZyk7DQorICAgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnSGVpZ2h0LCBoZWlnaHRTdHJpbmcpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgob25lU3RyaW5nLkNvbXBhcmUobG93U3RyaW5nKSA+PSAwKSAmJg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uZVN0cmluZy5Db21wYXJlKGhlaWdodFN0cmluZykgPD0gMCkpKTsNCisgICAgICB9DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdMb3cpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnSGVpZ2h0KTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJXaXRoaW4iKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6SWYoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMykgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnQ29uZGl0aW9uID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ0ZpcnN0VmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnU2Vjb25kVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICBGWF9CT09MIGJDb25kaXRpb24gPSBGWEpTRV9WYWx1ZV9Ub0Jvb2xlYW4oYXJnQ29uZGl0aW9uKTsNCisgICAgRlhKU0VfVmFsdWVfU2V0KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgIGJDb25kaXRpb24gPyBhcmdGaXJzdFZhbHVlIDogYXJnU2Vjb25kVmFsdWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1NlY29uZFZhbHVlKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdGaXJzdFZhbHVlKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdDb25kaXRpb24pOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiSWYiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RXZhbChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDEpIHsNCisgICAgRlhKU0VfSFZBTFVFIHNjcmlwdFZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgdXRmOFNjcmlwdFN0cmluZzsNCisgICAgSFZhbHVlVG9VVEY4U3RyaW5nKHNjcmlwdFZhbHVlLCB1dGY4U2NyaXB0U3RyaW5nKTsNCisgICAgaWYgKHV0ZjhTY3JpcHRTdHJpbmcuSXNFbXB0eSgpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIENGWF9XaWRlVGV4dEJ1ZiB3c0phdmFTY3JpcHRCdWY7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgamF2YVNjcmlwdDsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0Vycm9yOw0KKyAgICAgIFhGQV9GTTJKU19UcmFuc2xhdGUoQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0ZjhTY3JpcHRTdHJpbmcsIHV0ZjhTY3JpcHRTdHJpbmcuR2V0TGVuZ3RoKCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgd3NKYXZhU2NyaXB0QnVmLCB3c0Vycm9yKTsNCisgICAgICBGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCA9IEZYSlNFX0NvbnRleHRfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICBGWEpTRV9IVkFMVUUgcmV0dXJuVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgIGphdmFTY3JpcHQgPSB3c0phdmFTY3JpcHRCdWYuR2V0V2lkZVN0cmluZygpOw0KKyAgICAgIEZYSlNFX0V4ZWN1dGVTY3JpcHQoaENvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VVEY4RW5jb2RlKGphdmFTY3JpcHQsIGphdmFTY3JpcHQuR2V0TGVuZ3RoKCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldChhcmdzLkdldFJldHVyblZhbHVlKCksIHJldHVyblZhbHVlKTsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHJldHVyblZhbHVlKTsNCisgICAgICBGWEpTRV9Db250ZXh0X1JlbGVhc2UoaENvbnRleHQpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2Uoc2NyaXB0VmFsdWUpOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkV2YWwiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6UmVmKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDEpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IGFyZ3MuR2V0VmFsdWUoMCk7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnT25lKSkgew0KKyAgICAgIEZYSlNFX0hWQUxVRSByZ1ZhbHVlc1szXTsNCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAzOyBpKyspIHsNCisgICAgICAgIHJnVmFsdWVzW2ldID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICB9DQorICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihyZ1ZhbHVlc1swXSwgNCk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChyZ1ZhbHVlc1sxXSk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChyZ1ZhbHVlc1syXSk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0QXJyYXkoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAzLCByZ1ZhbHVlcyk7DQorICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMzsgaSsrKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHJnVmFsdWVzW2ldKTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdPbmUpKSB7DQorICAgICAgRlhKU0VfSFZBTFVFIGxlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ09uZSwgImxlbmd0aCIsIGxlbmd0aFZhbHVlKTsNCisgICAgICBpbnQzMl90IGlMZW5ndGggPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIobGVuZ3RoVmFsdWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVuZ3RoVmFsdWUpOw0KKyAgICAgIEZYU1lTX2Fzc2VydChpTGVuZ3RoID49IDMpOw0KKyAgICAgIEZYSlNFX0hWQUxVRSBwcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICBGWEpTRV9IVkFMVUUganNPYmplY3RWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ09uZSwgMSwgcHJvcGVydHlWYWx1ZSk7DQorICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ09uZSwgMiwganNPYmplY3RWYWx1ZSk7DQorICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChqc09iamVjdFZhbHVlKSkgew0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KKyAgICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpICYmDQorICAgICAgICAgICAgICAgICAoIUZYSlNFX1ZhbHVlX0lzTnVsbChqc09iamVjdFZhbHVlKSkpIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSByZ1ZhbHVlc1szXTsNCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDM7IGkrKykgew0KKyAgICAgICAgICByZ1ZhbHVlc1tpXSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKHJnVmFsdWVzWzBdLCAzKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocmdWYWx1ZXNbMV0pOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0KHJnVmFsdWVzWzJdLCBqc09iamVjdFZhbHVlKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEFycmF5KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgMywgcmdWYWx1ZXMpOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMzsgaSsrKSB7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocmdWYWx1ZXNbaV0pOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgICAgfQ0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNPYmplY3RWYWx1ZSk7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCisgICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc09iamVjdChhcmdPbmUpKSB7DQorICAgICAgRlhKU0VfSFZBTFVFIHJnVmFsdWVzWzNdOw0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDM7IGkrKykgew0KKyAgICAgICAgcmdWYWx1ZXNbaV0gPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgIH0NCisgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKHJnVmFsdWVzWzBdLCAzKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHJnVmFsdWVzWzFdKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXQocmdWYWx1ZXNbMl0sIGFyZ09uZSk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0QXJyYXkoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAzLCByZ1ZhbHVlcyk7DQorICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMzsgaSsrKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHJnVmFsdWVzW2ldKTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNCb29sZWFuKGFyZ09uZSkgfHwNCisgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoYXJnT25lKSB8fA0KKyAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0lzTnVtYmVyKGFyZ09uZSkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBhcmdPbmUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiUmVmIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlVuaXRUeXBlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDEpIHsNCisgICAgRlhKU0VfSFZBTFVFIHVuaXRzcGFuVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKHVuaXRzcGFuVmFsdWUpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UodW5pdHNwYW5WYWx1ZSk7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIENGWF9CeXRlU3RyaW5nIHVuaXRzcGFuU3RyaW5nOw0KKyAgICBIVmFsdWVUb1VURjhTdHJpbmcodW5pdHNwYW5WYWx1ZSwgdW5pdHNwYW5TdHJpbmcpOw0KKyAgICBpZiAodW5pdHNwYW5TdHJpbmcuSXNFbXB0eSgpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksICJpbiIpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGVudW0gWEZBX0ZNMkpTX1ZBTFVFVFlQRV9QYXJzZXJTdGF0dXMgew0KKyAgICAgICAgVkFMVUVUWVBFX1NUQVJULA0KKyAgICAgICAgVkFMVUVUWVBFX0hBVkVJTlZBTElEQ0hBUiwNCisgICAgICAgIFZBTFVFVFlQRV9IQVZFRElHSVQsDQorICAgICAgICBWQUxVRVRZUEVfSEFWRURJR0lUV0hJVEUsDQorICAgICAgICBWQUxVRVRZUEVfSVNDTSwNCisgICAgICAgIFZBTFVFVFlQRV9JU01NLA0KKyAgICAgICAgVkFMVUVUWVBFX0lTUFQsDQorICAgICAgICBWQUxVRVRZUEVfSVNNUCwNCisgICAgICAgIFZBTFVFVFlQRV9JU0lOLA0KKyAgICAgIH07DQorICAgICAgdW5pdHNwYW5TdHJpbmcuTWFrZUxvd2VyKCk7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUeXBlU3RyaW5nID0NCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHVuaXRzcGFuU3RyaW5nLCB1bml0c3BhblN0cmluZy5HZXRMZW5ndGgoKSk7DQorICAgICAgY29uc3QgRlhfV0NIQVIqIHBEYXRhID0gd3NUeXBlU3RyaW5nOw0KKyAgICAgIGludDMyX3QgdSA9IDA7DQorICAgICAgaW50MzJfdCB1TGVuID0gd3NUeXBlU3RyaW5nLkdldExlbmd0aCgpOw0KKyAgICAgIHdoaWxlICgqKHBEYXRhICsgdSkgPT0gMHgyMCB8fCAqKHBEYXRhICsgdSkgPT0gMHgwOSB8fA0KKyAgICAgICAgICAgICAqKHBEYXRhICsgdSkgPT0gMHgwQiB8fCAqKHBEYXRhICsgdSkgPT0gMHgwQyB8fA0KKyAgICAgICAgICAgICAqKHBEYXRhICsgdSkgPT0gMHgwQSB8fCAqKHBEYXRhICsgdSkgPT0gMHgwRCkgew0KKyAgICAgICAgdSsrOw0KKyAgICAgIH0NCisgICAgICBYRkFfRk0ySlNfVkFMVUVUWVBFX1BhcnNlclN0YXR1cyBlUGFyc2VyU3RhdHVzID0gVkFMVUVUWVBFX1NUQVJUOw0KKyAgICAgIEZYX1dDSEFSIHR5cGVDaGFyOw0KKyAgICAgIHdoaWxlICh1IDwgdUxlbikgew0KKyAgICAgICAgdHlwZUNoYXIgPSAqKHBEYXRhICsgdSk7DQorICAgICAgICBpZiAodHlwZUNoYXIgPT0gMHgyMCB8fCB0eXBlQ2hhciA9PSAweDA5IHx8IHR5cGVDaGFyID09IDB4MEIgfHwNCisgICAgICAgICAgICB0eXBlQ2hhciA9PSAweDBDIHx8IHR5cGVDaGFyID09IDB4MEEgfHwgdHlwZUNoYXIgPT0gMHgwRCkgew0KKyAgICAgICAgICBpZiAoZVBhcnNlclN0YXR1cyA9PSBWQUxVRVRZUEVfSEFWRURJR0lUIHx8DQorICAgICAgICAgICAgICBlUGFyc2VyU3RhdHVzID09IFZBTFVFVFlQRV9IQVZFRElHSVRXSElURSkgew0KKyAgICAgICAgICAgIGVQYXJzZXJTdGF0dXMgPSBWQUxVRVRZUEVfSEFWRURJR0lUV0hJVEU7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZVBhcnNlclN0YXR1cyA9IFZBTFVFVFlQRV9JU0lOOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKCh0eXBlQ2hhciA+PSAnMCcgJiYgdHlwZUNoYXIgPD0gJzknKSB8fCB0eXBlQ2hhciA9PSAnLScgfHwNCisgICAgICAgICAgICAgICAgICAgdHlwZUNoYXIgPT0gJy4nKSB7DQorICAgICAgICAgIGlmIChlUGFyc2VyU3RhdHVzID09IFZBTFVFVFlQRV9IQVZFRElHSVRXSElURSkgew0KKyAgICAgICAgICAgIGVQYXJzZXJTdGF0dXMgPSBWQUxVRVRZUEVfSVNJTjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBlUGFyc2VyU3RhdHVzID0gVkFMVUVUWVBFX0hBVkVESUdJVDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmICgodHlwZUNoYXIgPT0gJ2MnIHx8IHR5cGVDaGFyID09ICdwJykgJiYgKHUgKyAxIDwgdUxlbikpIHsNCisgICAgICAgICAgRlhfV0NIQVIgbmV4dENoYXIgPSAqKHBEYXRhICsgdSArIDEpOw0KKyAgICAgICAgICBpZiAoKGVQYXJzZXJTdGF0dXMgPT0gVkFMVUVUWVBFX1NUQVJUIHx8DQorICAgICAgICAgICAgICAgZVBhcnNlclN0YXR1cyA9PSBWQUxVRVRZUEVfSEFWRURJR0lUIHx8DQorICAgICAgICAgICAgICAgZVBhcnNlclN0YXR1cyA9PSBWQUxVRVRZUEVfSEFWRURJR0lUV0hJVEUpICYmDQorICAgICAgICAgICAgICAobmV4dENoYXIgPiAnOScgfHwgbmV4dENoYXIgPCAnMCcpICYmIG5leHRDaGFyICE9ICcuJyAmJg0KKyAgICAgICAgICAgICAgbmV4dENoYXIgIT0gJy0nKSB7DQorICAgICAgICAgICAgZVBhcnNlclN0YXR1cyA9ICh0eXBlQ2hhciA9PSAnYycpID8gVkFMVUVUWVBFX0lTQ00gOiBWQUxVRVRZUEVfSVNQVDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBlUGFyc2VyU3RhdHVzID0gVkFMVUVUWVBFX0hBVkVJTlZBTElEQ0hBUjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmICh0eXBlQ2hhciA9PSAnbScgJiYgKHUgKyAxIDwgdUxlbikpIHsNCisgICAgICAgICAgRlhfV0NIQVIgbmV4dENoYXIgPSAqKHBEYXRhICsgdSArIDEpOw0KKyAgICAgICAgICBpZiAoKGVQYXJzZXJTdGF0dXMgPT0gVkFMVUVUWVBFX1NUQVJUIHx8DQorICAgICAgICAgICAgICAgZVBhcnNlclN0YXR1cyA9PSBWQUxVRVRZUEVfSEFWRURJR0lUIHx8DQorICAgICAgICAgICAgICAgZVBhcnNlclN0YXR1cyA9PSBWQUxVRVRZUEVfSEFWRURJR0lUV0hJVEUpICYmDQorICAgICAgICAgICAgICAobmV4dENoYXIgPiAnOScgfHwgbmV4dENoYXIgPCAnMCcpICYmIG5leHRDaGFyICE9ICcuJyAmJg0KKyAgICAgICAgICAgICAgbmV4dENoYXIgIT0gJy0nKSB7DQorICAgICAgICAgICAgZVBhcnNlclN0YXR1cyA9IFZBTFVFVFlQRV9JU01NOw0KKyAgICAgICAgICAgIGlmIChuZXh0Q2hhciA9PSAncCcgfHwNCisgICAgICAgICAgICAgICAgKCh1ICsgNSA8IHVMZW4pICYmICoocERhdGEgKyB1ICsgMSkgPT0gJ2knICYmDQorICAgICAgICAgICAgICAgICAqKHBEYXRhICsgdSArIDIpID09ICdsJyAmJiAqKHBEYXRhICsgdSArIDMpID09ICdsJyAmJg0KKyAgICAgICAgICAgICAgICAgKihwRGF0YSArIHUgKyA0KSA9PSAnaScgJiYgKihwRGF0YSArIHUgKyA1KSA9PSAncCcpKSB7DQorICAgICAgICAgICAgICBlUGFyc2VyU3RhdHVzID0gVkFMVUVUWVBFX0lTTVA7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBlUGFyc2VyU3RhdHVzID0gVkFMVUVUWVBFX0hBVkVJTlZBTElEQ0hBUjsNCisgICAgICAgIH0NCisgICAgICAgIHUrKzsNCisgICAgICB9DQorICAgICAgc3dpdGNoIChlUGFyc2VyU3RhdHVzKSB7DQorICAgICAgICBjYXNlIFZBTFVFVFlQRV9JU0NNOg0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgImNtIik7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBWQUxVRVRZUEVfSVNNTToNCisgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksICJtbSIpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgVkFMVUVUWVBFX0lTUFQ6DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAicHQiKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFZBTFVFVFlQRV9JU01QOg0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgIm1wIik7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksICJpbiIpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZSh1bml0c3BhblZhbHVlKTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIlVuaXRUeXBlIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlVuaXRWYWx1ZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoKGFyZ2MgPT0gMSkgfHwgKGFyZ2MgPT0gMikpIHsNCisgICAgRlhKU0VfSFZBTFVFIHVuaXRzcGFuVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgdW5pdFZhbHVlID0gMDsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgdW5pdHNwYW5TdHJpbmc7DQorICAgIEZYX0RPVUJMRSBkRmlyc3ROdW1iZXIgPSAwOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBzdHJGaXJzdFVuaXQ7DQorICAgIENGWF9CeXRlU3RyaW5nIHN0clVuaXQ7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwodW5pdHNwYW5WYWx1ZSkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKHVuaXRzcGFuVmFsdWUsIHVuaXRzcGFuU3RyaW5nKTsNCisgICAgICBjb25zdCBGWF9DSEFSKiBwRGF0YSA9IHVuaXRzcGFuU3RyaW5nOw0KKyAgICAgIGlmIChwRGF0YSkgew0KKyAgICAgICAgaW50MzJfdCB1ID0gMDsNCisgICAgICAgIHdoaWxlICgqKHBEYXRhICsgdSkgPT0gMHgyMCB8fCAqKHBEYXRhICsgdSkgPT0gMHgwOSB8fA0KKyAgICAgICAgICAgICAgICoocERhdGEgKyB1KSA9PSAweDBCIHx8ICoocERhdGEgKyB1KSA9PSAweDBDIHx8DQorICAgICAgICAgICAgICAgKihwRGF0YSArIHUpID09IDB4MEEgfHwgKihwRGF0YSArIHUpID09IDB4MEQpIHsNCisgICAgICAgICAgKyt1Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgd2hpbGUgKHUgPCB1bml0c3BhblN0cmluZy5HZXRMZW5ndGgoKSkgew0KKyAgICAgICAgICBpZiAoKCoocERhdGEgKyB1KSA+ICc5JyB8fCAqKHBEYXRhICsgdSkgPCAnMCcpICYmDQorICAgICAgICAgICAgICAqKHBEYXRhICsgdSkgIT0gJy4nICYmICoocERhdGEgKyB1KSAhPSAnLScpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICArK3U7DQorICAgICAgICB9DQorICAgICAgICBGWF9DSEFSKiBwVGVtcCA9IE5VTEw7DQorICAgICAgICBkRmlyc3ROdW1iZXIgPSBzdHJ0b2QocERhdGEsICZwVGVtcCk7DQorICAgICAgICB3aGlsZSAoKihwRGF0YSArIHUpID09ICcgJyB8fCAqKHBEYXRhICsgdSkgPT0gMHgwOSB8fA0KKyAgICAgICAgICAgICAgICoocERhdGEgKyB1KSA9PSAweDBCIHx8ICoocERhdGEgKyB1KSA9PSAweDBDIHx8DQorICAgICAgICAgICAgICAgKihwRGF0YSArIHUpID09IDB4MEEgfHwgKihwRGF0YSArIHUpID09IDB4MEQpIHsNCisgICAgICAgICAgKyt1Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaW50MzJfdCB1TGVuID0gdW5pdHNwYW5TdHJpbmcuR2V0TGVuZ3RoKCk7DQorICAgICAgICB3aGlsZSAodSA8IHVMZW4pIHsNCisgICAgICAgICAgaWYgKCoocERhdGEgKyB1KSA9PSAnICcpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBzdHJGaXJzdFVuaXQgKz0gKCoocERhdGEgKyB1KSk7DQorICAgICAgICAgICsrdTsNCisgICAgICAgIH0NCisgICAgICAgIHN0ckZpcnN0VW5pdC5NYWtlTG93ZXIoKTsNCisgICAgICAgIGlmIChhcmdjID09IDIpIHsNCisgICAgICAgICAgdW5pdFZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgdW5pdFRlbXBTdHJpbmc7DQorICAgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyh1bml0VmFsdWUsIHVuaXRUZW1wU3RyaW5nKTsNCisgICAgICAgICAgY29uc3QgRlhfQ0hBUiogcERhdGEgPSB1bml0VGVtcFN0cmluZzsNCisgICAgICAgICAgaW50MzJfdCB1ID0gMDsNCisgICAgICAgICAgd2hpbGUgKCoocERhdGEgKyB1KSA9PSAnICcgfHwgKihwRGF0YSArIHUpID09IDB4MDkgfHwNCisgICAgICAgICAgICAgICAgICoocERhdGEgKyB1KSA9PSAweDBCIHx8ICoocERhdGEgKyB1KSA9PSAweDBDIHx8DQorICAgICAgICAgICAgICAgICAqKHBEYXRhICsgdSkgPT0gMHgwQSB8fCAqKHBEYXRhICsgdSkgPT0gMHgwRCkgew0KKyAgICAgICAgICAgICsrdTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICB3aGlsZSAodSA8IHVuaXRUZW1wU3RyaW5nLkdldExlbmd0aCgpKSB7DQorICAgICAgICAgICAgaWYgKCgqKHBEYXRhICsgdSkgPiAnOScgfHwgKihwRGF0YSArIHUpIDwgJzAnKSAmJg0KKyAgICAgICAgICAgICAgICAqKHBEYXRhICsgdSkgIT0gJy4nKSB7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgKyt1Ow0KKyAgICAgICAgICB9DQorICAgICAgICAgIHdoaWxlICgqKHBEYXRhICsgdSkgPT0gJyAnIHx8ICoocERhdGEgKyB1KSA9PSAweDA5IHx8DQorICAgICAgICAgICAgICAgICAqKHBEYXRhICsgdSkgPT0gMHgwQiB8fCAqKHBEYXRhICsgdSkgPT0gMHgwQyB8fA0KKyAgICAgICAgICAgICAgICAgKihwRGF0YSArIHUpID09IDB4MEEgfHwgKihwRGF0YSArIHUpID09IDB4MEQpIHsNCisgICAgICAgICAgICArK3U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaW50MzJfdCB1TGVuID0gdW5pdFRlbXBTdHJpbmcuR2V0TGVuZ3RoKCk7DQorICAgICAgICAgIHdoaWxlICh1IDwgdUxlbikgew0KKyAgICAgICAgICAgIGlmICgqKHBEYXRhICsgdSkgPT0gJyAnKSB7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgc3RyVW5pdCArPSAoKihwRGF0YSArIHUpKTsNCisgICAgICAgICAgICArK3U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgc3RyVW5pdC5NYWtlTG93ZXIoKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHN0clVuaXQgPSBzdHJGaXJzdFVuaXQ7DQorICAgICAgICB9DQorICAgICAgICBGWF9ET1VCTEUgZFJlc3VsdCA9IDA7DQorICAgICAgICBpZiAoc3RyRmlyc3RVbml0LkVxdWFsKCJpbiIpIHx8IHN0ckZpcnN0VW5pdC5FcXVhbCgiaW5jaGVzIikpIHsNCisgICAgICAgICAgaWYgKHN0clVuaXQuRXF1YWwoIm1tIikgfHwgc3RyVW5pdC5FcXVhbCgibWlsbGltZXRlcnMiKSkgew0KKyAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgKiAyNS40Ow0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN0clVuaXQuRXF1YWwoImNtIikgfHwgc3RyVW5pdC5FcXVhbCgiY2VudGltZXRlcnMiKSkgew0KKyAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgKiAyLjU0Ow0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN0clVuaXQuRXF1YWwoInB0IikgfHwgc3RyVW5pdC5FcXVhbCgicG9pbnRzIikpIHsNCisgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gNzI7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3RyVW5pdC5FcXVhbCgibXAiKSB8fCBzdHJVbml0LkVxdWFsKCJtaWxsaXBvaW50cyIpKSB7DQorICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDcyMDAwOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXI7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoc3RyRmlyc3RVbml0LkVxdWFsKCJtbSIpIHx8DQorICAgICAgICAgICAgICAgICAgIHN0ckZpcnN0VW5pdC5FcXVhbCgibWlsbGltZXRlcnMiKSkgew0KKyAgICAgICAgICBpZiAoc3RyVW5pdC5FcXVhbCgibW0iKSB8fCBzdHJVbml0LkVxdWFsKCJtaWxsaW1ldGVycyIpKSB7DQorICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlcjsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdHJVbml0LkVxdWFsKCJjbSIpIHx8IHN0clVuaXQuRXF1YWwoImNlbnRpbWV0ZXJzIikpIHsNCisgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gMTA7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3RyVW5pdC5FcXVhbCgicHQiKSB8fCBzdHJVbml0LkVxdWFsKCJwb2ludHMiKSkgew0KKyAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyAyNS40IC8gNzI7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3RyVW5pdC5FcXVhbCgibXAiKSB8fCBzdHJVbml0LkVxdWFsKCJtaWxsaXBvaW50cyIpKSB7DQorICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDI1LjQgLyA3MjAwMDsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gMjUuNDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChzdHJGaXJzdFVuaXQuRXF1YWwoImNtIikgfHwNCisgICAgICAgICAgICAgICAgICAgc3RyRmlyc3RVbml0LkVxdWFsKCJjZW50aW1ldGVycyIpKSB7DQorICAgICAgICAgIGlmIChzdHJVbml0LkVxdWFsKCJtbSIpIHx8IHN0clVuaXQuRXF1YWwoIm1pbGxpbWV0ZXJzIikpIHsNCisgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyICogMTA7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3RyVW5pdC5FcXVhbCgiY20iKSB8fCBzdHJVbml0LkVxdWFsKCJjZW50aW1ldGVycyIpKSB7DQorICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlcjsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdHJVbml0LkVxdWFsKCJwdCIpIHx8IHN0clVuaXQuRXF1YWwoInBvaW50cyIpKSB7DQorICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDIuNTQgLyA3MjsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdHJVbml0LkVxdWFsKCJtcCIpIHx8IHN0clVuaXQuRXF1YWwoIm1pbGxpcG9pbnRzIikpIHsNCisgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gMi41NCAvIDcyMDAwOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyAyLjU0Ow0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKHN0ckZpcnN0VW5pdC5FcXVhbCgicHQiKSB8fCBzdHJGaXJzdFVuaXQuRXF1YWwoInBvaW50cyIpKSB7DQorICAgICAgICAgIGlmIChzdHJVbml0LkVxdWFsKCJtbSIpIHx8IHN0clVuaXQuRXF1YWwoIm1pbGxpbWV0ZXJzIikpIHsNCisgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gNzIgKiAyNS40Ow0KKyAgICAgICAgICB9IGVsc2UgaWYgKHN0clVuaXQuRXF1YWwoImNtIikgfHwgc3RyVW5pdC5FcXVhbCgiY2VudGltZXRlcnMiKSkgew0KKyAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyA3MiAqIDIuNTQ7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3RyVW5pdC5FcXVhbCgicHQiKSB8fCBzdHJVbml0LkVxdWFsKCJwb2ludHMiKSkgew0KKyAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXI7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3RyVW5pdC5FcXVhbCgibXAiKSB8fCBzdHJVbml0LkVxdWFsKCJtaWxsaXBvaW50cyIpKSB7DQorICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAqIDEwMDA7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDcyOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKHN0ckZpcnN0VW5pdC5FcXVhbCgibXAiKSB8fA0KKyAgICAgICAgICAgICAgICAgICBzdHJGaXJzdFVuaXQuRXF1YWwoIm1pbGxpcG9pbnRzIikpIHsNCisgICAgICAgICAgaWYgKHN0clVuaXQuRXF1YWwoIm1tIikgfHwgc3RyVW5pdC5FcXVhbCgibWlsbGltZXRlcnMiKSkgew0KKyAgICAgICAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyA3MjAwMCAqIDI1LjQ7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3RyVW5pdC5FcXVhbCgiY20iKSB8fCBzdHJVbml0LkVxdWFsKCJjZW50aW1ldGVycyIpKSB7DQorICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDcyMDAwICogMi41NDsNCisgICAgICAgICAgfSBlbHNlIGlmIChzdHJVbml0LkVxdWFsKCJwdCIpIHx8IHN0clVuaXQuRXF1YWwoInBvaW50cyIpKSB7DQorICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDEwMDA7DQorICAgICAgICAgIH0gZWxzZSBpZiAoc3RyVW5pdC5FcXVhbCgibXAiKSB8fCBzdHJVbml0LkVxdWFsKCJtaWxsaXBvaW50cyIpKSB7DQorICAgICAgICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlcjsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gNzIwMDA7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldERvdWJsZShhcmdzLkdldFJldHVyblZhbHVlKCksIGRSZXN1bHQpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgMCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UodW5pdHNwYW5WYWx1ZSk7DQorICAgIGlmIChhcmdjID09IDIpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHVuaXRWYWx1ZSk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIlVuaXRWYWx1ZSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpBdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMikgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkgfHwgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUd28pKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIENGWF9CeXRlU3RyaW5nIHN0cmluZ1R3bzsNCisgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnVHdvLCBzdHJpbmdUd28pOw0KKyAgICAgIGlmIChzdHJpbmdUd28uSXNFbXB0eSgpKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgMSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIHN0cmluZ09uZTsNCisgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIHN0cmluZ09uZSk7DQorICAgICAgICBGWF9TVFJTSVpFIGlQb3NpdGlvbiA9IHN0cmluZ09uZS5GaW5kKHN0cmluZ1R3byk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgaVBvc2l0aW9uICsgMSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkF0Iik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkNvbmNhdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPj0gMSkgew0KKyAgICBDRlhfQnl0ZVN0cmluZyByZXN1bHRTdHJpbmc7DQorICAgIEZYX0JPT0wgYkFsbE51bGwgPSBUUlVFOw0KKyAgICBGWEpTRV9IVkFMVUUqIGFyZ1ZhbHVlcyA9IEZYX0FsbG9jKEZYSlNFX0hWQUxVRSwgYXJnYyk7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgew0KKyAgICAgIGFyZ1ZhbHVlc1tpXSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgaSk7DQorICAgICAgaWYgKCFIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1ZhbHVlc1tpXSkpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIHZhbHVlU3RyOw0KKyAgICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ1ZhbHVlc1tpXSwgdmFsdWVTdHIpOw0KKyAgICAgICAgcmVzdWx0U3RyaW5nICs9IHZhbHVlU3RyOw0KKyAgICAgICAgYkFsbE51bGwgPSBGQUxTRTsNCisgICAgICB9DQorICAgIH0NCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdWYWx1ZXNbaV0pOw0KKyAgICB9DQorICAgIEZYX0ZyZWUoYXJnVmFsdWVzKTsNCisgICAgaWYgKGJBbGxOdWxsKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCByZXN1bHRTdHJpbmcpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiQ29uY2F0Iik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkRlY29kZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMSkgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyB0b0RlY29kZVN0cmluZzsNCisgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCB0b0RlY29kZVN0cmluZyk7DQorICAgICAgQ0ZYX0J5dGVUZXh0QnVmIHJlc3VsdEJ1ZjsNCisgICAgICBEZWNvZGVVUkwodG9EZWNvZGVTdHJpbmcsIHJlc3VsdEJ1Zik7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRCdWYuR2V0Qnl0ZVN0cmluZygpKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICB9IGVsc2UgaWYgKGFyZ2MgPT0gMikgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkgfHwgSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUd28pKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIENGWF9CeXRlU3RyaW5nIHRvRGVjb2RlU3RyaW5nOw0KKyAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIHRvRGVjb2RlU3RyaW5nKTsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBpZGVudGlmeVN0cmluZzsNCisgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnVHdvLCBpZGVudGlmeVN0cmluZyk7DQorICAgICAgQ0ZYX0J5dGVUZXh0QnVmIHJlc3VsdEJ1ZjsNCisgICAgICBpZiAoaWRlbnRpZnlTdHJpbmcuRXF1YWxOb0Nhc2UoImh0bWwiKSkgew0KKyAgICAgICAgRGVjb2RlSFRNTCh0b0RlY29kZVN0cmluZywgcmVzdWx0QnVmKTsNCisgICAgICB9IGVsc2UgaWYgKGlkZW50aWZ5U3RyaW5nLkVxdWFsTm9DYXNlKCJ4bWwiKSkgew0KKyAgICAgICAgRGVjb2RlWE1MKHRvRGVjb2RlU3RyaW5nLCByZXN1bHRCdWYpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBEZWNvZGVVUkwodG9EZWNvZGVTdHJpbmcsIHJlc3VsdEJ1Zik7DQorICAgICAgfQ0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0QnVmLkdldEJ5dGVTdHJpbmcoKSk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1R3byk7DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiRGVjb2RlIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkRlY29kZVVSTChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6VVJMU3RyaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVRleHRCdWYmIHN6UmVzdWx0U3RyaW5nKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1VSTFN0cmluZyA9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6VVJMU3RyaW5nLkdldENTdHIoKSwgc3pVUkxTdHJpbmcuR2V0TGVuZ3RoKCkpOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBEYXRhID0gd3NVUkxTdHJpbmc7DQorICBpbnQzMl90IGlMZW4gPSB3c1VSTFN0cmluZy5HZXRMZW5ndGgoKTsNCisgIGludDMyX3QgaSA9IDA7DQorICBGWF9XQ0hBUiBjaCA9IDA7DQorICBGWF9XQ0hBUiBjaFRlbXAgPSAwOw0KKyAgQ0ZYX1dpZGVUZXh0QnVmIHdzUmVzdWx0QnVmOw0KKyAgd2hpbGUgKGkgPCBpTGVuKSB7DQorICAgIGNoID0gKihwRGF0YSArIGkpOw0KKyAgICBpZiAoJyUnID09IGNoKSB7DQorICAgICAgY2hUZW1wID0gMDsNCisgICAgICBpbnQzMl90IGlDb3VudCA9IDA7DQorICAgICAgd2hpbGUgKGlDb3VudCA8IDIpIHsNCisgICAgICAgICsraTsNCisgICAgICAgIGNoID0gKihwRGF0YSArIGkpOw0KKyAgICAgICAgaWYgKGNoIDw9ICc5JyAmJiBjaCA+PSAnMCcpIHsNCisgICAgICAgICAgaWYgKCFpQ291bnQpIHsNCisgICAgICAgICAgICBjaFRlbXAgKz0gKGNoIC0gJzAnKSAqIDE2Ow0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGNoVGVtcCArPSAoY2ggLSAnMCcpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBpZiAoY2ggPD0gJ0YnICYmIGNoID49ICdBJykgew0KKyAgICAgICAgICAgIGlmICghaUNvdW50KSB7DQorICAgICAgICAgICAgICBjaFRlbXAgKz0gKGNoIC0gJ0EnICsgMTApICogMTY7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIGNoVGVtcCArPSAoY2ggLSAnQScgKyAxMCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2UgaWYgKGNoIDw9ICdmJyAmJiBjaCA+PSAnYScpIHsNCisgICAgICAgICAgICBpZiAoIWlDb3VudCkgew0KKyAgICAgICAgICAgICAgY2hUZW1wICs9IChjaCAtICdhJyArIDEwKSAqIDE2Ow0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBjaFRlbXAgKz0gKGNoIC0gJ2EnICsgMTApOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICB3c1Jlc3VsdEJ1Zi5DbGVhcigpOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgKytpQ291bnQ7DQorICAgICAgfQ0KKyAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoY2hUZW1wKTsNCisgICAgfSBlbHNlIHsNCisgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKGNoKTsNCisgICAgfQ0KKyAgICArK2k7DQorICB9DQorICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKDApOw0KKyAgc3pSZXN1bHRTdHJpbmcgPQ0KKyAgICAgIEZYX1VURjhFbmNvZGUod3NSZXN1bHRCdWYuR2V0QnVmZmVyKCksIHdzUmVzdWx0QnVmLkdldExlbmd0aCgpKTsNCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RGVjb2RlSFRNTChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6SFRNTFN0cmluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiYgc3pSZXN1bHRTdHJpbmcpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzSFRNTFN0cmluZyA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOCgNCisgICAgICBzekhUTUxTdHJpbmcuR2V0Q1N0cigpLCBzekhUTUxTdHJpbmcuR2V0TGVuZ3RoKCkpOw0KKyAgRlhfV0NIQVIgc3RyU3RyaW5nWzldOw0KKyAgaW50MzJfdCBpU3RySW5kZXggPSAwOw0KKyAgaW50MzJfdCBpTGVuID0gd3NIVE1MU3RyaW5nLkdldExlbmd0aCgpOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIGludDMyX3QgaUNvZGUgPSAwOw0KKyAgRlhfV0NIQVIgY2ggPSAwOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBEYXRhID0gd3NIVE1MU3RyaW5nOw0KKyAgQ0ZYX1dpZGVUZXh0QnVmIHdzUmVzdWx0QnVmOw0KKyAgd2hpbGUgKGkgPCBpTGVuKSB7DQorICAgIGNoID0gKihwRGF0YSArIGkpOw0KKyAgICBpZiAoY2ggPT0gJyYnKSB7DQorICAgICAgKytpOw0KKyAgICAgIGNoID0gKihwRGF0YSArIGkpOw0KKyAgICAgIGlmIChjaCA9PSAnIycpIHsNCisgICAgICAgICsraTsNCisgICAgICAgIGNoID0gKihwRGF0YSArIGkpOw0KKyAgICAgICAgaWYgKGNoID09ICd4JyB8fCBjaCA9PSAnWCcpIHsNCisgICAgICAgICAgKytpOw0KKyAgICAgICAgICBjaCA9ICoocERhdGEgKyBpKTsNCisgICAgICAgICAgaWYgKChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB8fCAoY2ggPD0gJ2YnICYmIGNoID49ICdhJykgfHwNCisgICAgICAgICAgICAgIChjaCA8PSAnRicgJiYgY2ggPj0gJ0EnKSkgew0KKyAgICAgICAgICAgIHdoaWxlIChjaCAhPSAnOycgJiYgaSA8IGlMZW4pIHsNCisgICAgICAgICAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7DQorICAgICAgICAgICAgICAgIGlDb2RlICs9IGNoIC0gJzAnOw0KKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA8PSAnZicgJiYgY2ggPj0gJ2EnKSB7DQorICAgICAgICAgICAgICAgIGlDb2RlICs9IGNoIC0gJ2EnICsgMTA7DQorICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoIDw9ICdGJyAmJiBjaCA+PSAnQScpIHsNCisgICAgICAgICAgICAgICAgaUNvZGUgKz0gY2ggLSAnQScgKyAxMDsNCisgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHdzUmVzdWx0QnVmLkNsZWFyKCk7DQorICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICsraTsNCisgICAgICAgICAgICAgIGlDb2RlICo9IDE2Ow0KKyAgICAgICAgICAgICAgY2ggPSAqKHBEYXRhICsgaSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlDb2RlIC89IDE2Ow0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICB3c1Jlc3VsdEJ1Zi5DbGVhcigpOw0KKyAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHdoaWxlIChjaCAhPSAnOycgJiYgaSA8IGlMZW4pIHsNCisgICAgICAgICAgc3RyU3RyaW5nW2lTdHJJbmRleCsrXSA9IGNoOw0KKyAgICAgICAgICArK2k7DQorICAgICAgICAgIGNoID0gKihwRGF0YSArIGkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc3RyU3RyaW5nW2lTdHJJbmRleF0gPSAwOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKGNoKTsNCisgICAgICArK2k7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgdWludDMyX3QgaURhdGEgPSAwOw0KKyAgICBpZiAoSFRNTFNUUjJDb2RlKHN0clN0cmluZywgaURhdGEpKSB7DQorICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcigoRlhfV0NIQVIpaURhdGEpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoaUNvZGUpOw0KKyAgICB9DQorICAgIGlTdHJJbmRleCA9IDA7DQorICAgIHN0clN0cmluZ1tpU3RySW5kZXhdID0gMDsNCisgICAgKytpOw0KKyAgfQ0KKyAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcigwKTsNCisgIHN6UmVzdWx0U3RyaW5nID0NCisgICAgICBGWF9VVEY4RW5jb2RlKHdzUmVzdWx0QnVmLkdldEJ1ZmZlcigpLCB3c1Jlc3VsdEJ1Zi5HZXRMZW5ndGgoKSk7DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkRlY29kZVhNTChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6WE1MU3RyaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVRleHRCdWYmIHN6UmVzdWx0U3RyaW5nKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1hNTFN0cmluZyA9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6WE1MU3RyaW5nLkdldENTdHIoKSwgc3pYTUxTdHJpbmcuR2V0TGVuZ3RoKCkpOw0KKyAgRlhfV0NIQVIgc3RyU3RyaW5nWzldOw0KKyAgaW50MzJfdCBpU3RySW5kZXggPSAwOw0KKyAgaW50MzJfdCBpTGVuID0gd3NYTUxTdHJpbmcuR2V0TGVuZ3RoKCk7DQorICBpbnQzMl90IGkgPSAwOw0KKyAgaW50MzJfdCBpQ29kZSA9IDA7DQorICBGWF9XQ0hBUiBjaCA9IDA7DQorICBjb25zdCBGWF9XQ0hBUiogcERhdGEgPSB3c1hNTFN0cmluZzsNCisgIENGWF9XaWRlVGV4dEJ1ZiB3c1hNTEJ1ZjsNCisgIHdoaWxlIChpIDwgaUxlbikgew0KKyAgICBjaCA9ICoocERhdGEgKyBpKTsNCisgICAgaWYgKGNoID09ICcmJykgew0KKyAgICAgICsraTsNCisgICAgICBjaCA9ICoocERhdGEgKyBpKTsNCisgICAgICBpZiAoY2ggPT0gJyMnKSB7DQorICAgICAgICArK2k7DQorICAgICAgICBjaCA9ICoocERhdGEgKyBpKTsNCisgICAgICAgIGlmIChjaCA9PSAneCcgfHwgY2ggPT0gJ1gnKSB7DQorICAgICAgICAgICsraTsNCisgICAgICAgICAgY2ggPSAqKHBEYXRhICsgaSk7DQorICAgICAgICAgIGlmICgoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgfHwgKGNoIDw9ICdmJyAmJiBjaCA+PSAnYScpIHx8DQorICAgICAgICAgICAgICAoY2ggPD0gJ0YnICYmIGNoID49ICdBJykpIHsNCisgICAgICAgICAgICB3aGlsZSAoY2ggIT0gJzsnKSB7DQorICAgICAgICAgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jykgew0KKyAgICAgICAgICAgICAgICBpQ29kZSArPSBjaCAtICcwJzsNCisgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPD0gJ2YnICYmIGNoID49ICdhJykgew0KKyAgICAgICAgICAgICAgICBpQ29kZSArPSBjaCAtICdhJyArIDEwOw0KKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA8PSAnRicgJiYgY2ggPj0gJ0EnKSB7DQorICAgICAgICAgICAgICAgIGlDb2RlICs9IGNoIC0gJ0EnICsgMTA7DQorICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICB3c1hNTEJ1Zi5DbGVhcigpOw0KKyAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICArK2k7DQorICAgICAgICAgICAgICBpQ29kZSAqPSAxNjsNCisgICAgICAgICAgICAgIGNoID0gKihwRGF0YSArIGkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpQ29kZSAvPSAxNjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgd3NYTUxCdWYuQ2xlYXIoKTsNCisgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICB3aGlsZSAoY2ggIT0gJzsnICYmIGkgPCBpTGVuKSB7DQorICAgICAgICAgIHN0clN0cmluZ1tpU3RySW5kZXgrK10gPSBjaDsNCisgICAgICAgICAgKytpOw0KKyAgICAgICAgICBjaCA9ICoocERhdGEgKyBpKTsNCisgICAgICAgIH0NCisgICAgICAgIHN0clN0cmluZ1tpU3RySW5kZXhdID0gMDsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgd3NYTUxCdWYuQXBwZW5kQ2hhcihjaCk7DQorICAgICAgKytpOw0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGNvbnN0IEZYX1dDSEFSKiBjb25zdCBzdHJOYW1lW10gPSB7TCJxdW90IiwgTCJhbXAiLCBMImFwb3MiLCBMImx0IiwgTCJndCJ9Ow0KKyAgICBpbnQzMl90IGlJbmRleCA9IDA7DQorICAgIHdoaWxlIChpSW5kZXggPCA1KSB7DQorICAgICAgaWYgKEZYU1lTX21lbWNtcChzdHJTdHJpbmcsIHN0ck5hbWVbaUluZGV4XSwNCisgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3djc2xlbihzdHJOYW1lW2lJbmRleF0pKSA9PSAwKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgKytpSW5kZXg7DQorICAgIH0NCisgICAgc3dpdGNoIChpSW5kZXgpIHsNCisgICAgICBjYXNlIDA6DQorICAgICAgICB3c1hNTEJ1Zi5BcHBlbmRDaGFyKCciJyk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIDE6DQorICAgICAgICB3c1hNTEJ1Zi5BcHBlbmRDaGFyKCcmJyk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIDI6DQorICAgICAgICB3c1hNTEJ1Zi5BcHBlbmRDaGFyKCdcJycpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAzOg0KKyAgICAgICAgd3NYTUxCdWYuQXBwZW5kQ2hhcignPCcpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSA0Og0KKyAgICAgICAgd3NYTUxCdWYuQXBwZW5kQ2hhcignPicpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIHdzWE1MQnVmLkFwcGVuZENoYXIoaUNvZGUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaVN0ckluZGV4ID0gMDsNCisgICAgc3RyU3RyaW5nW2lTdHJJbmRleF0gPSAwOw0KKyAgICArK2k7DQorICAgIGlDb2RlID0gMDsNCisgIH0NCisgIHdzWE1MQnVmLkFwcGVuZENoYXIoMCk7DQorICBzelJlc3VsdFN0cmluZyA9IEZYX1VURjhFbmNvZGUod3NYTUxCdWYuR2V0QnVmZmVyKCksIHdzWE1MQnVmLkdldExlbmd0aCgpKTsNCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RW5jb2RlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAxKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIENGWF9CeXRlU3RyaW5nIHRvRW5jb2RlU3RyaW5nOw0KKyAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIHRvRW5jb2RlU3RyaW5nKTsNCisgICAgICBDRlhfQnl0ZVRleHRCdWYgcmVzdWx0QnVmOw0KKyAgICAgIEVuY29kZVVSTCh0b0VuY29kZVN0cmluZywgcmVzdWx0QnVmKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEJ1Zi5HZXRCeXRlU3RyaW5nKCkpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgIH0gZWxzZSBpZiAoYXJnYyA9PSAyKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVHdvID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSB8fCBIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1R3bykpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgdG9FbmNvZGVTdHJpbmc7DQorICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgdG9FbmNvZGVTdHJpbmcpOw0KKyAgICAgIENGWF9CeXRlU3RyaW5nIGlkZW50aWZ5U3RyaW5nOw0KKyAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdUd28sIGlkZW50aWZ5U3RyaW5nKTsNCisgICAgICBDRlhfQnl0ZVRleHRCdWYgcmVzdWx0QnVmOw0KKyAgICAgIGlmIChpZGVudGlmeVN0cmluZy5FcXVhbE5vQ2FzZSgiaHRtbCIpKSB7DQorICAgICAgICBFbmNvZGVIVE1MKHRvRW5jb2RlU3RyaW5nLCByZXN1bHRCdWYpOw0KKyAgICAgIH0gZWxzZSBpZiAoaWRlbnRpZnlTdHJpbmcuRXF1YWxOb0Nhc2UoInhtbCIpKSB7DQorICAgICAgICBFbmNvZGVYTUwodG9FbmNvZGVTdHJpbmcsIHJlc3VsdEJ1Zik7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEVuY29kZVVSTCh0b0VuY29kZVN0cmluZywgcmVzdWx0QnVmKTsNCisgICAgICB9DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRCdWYuR2V0Qnl0ZVN0cmluZygpKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCisgIH0gZWxzZSB7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJFbmNvZGUiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RW5jb2RlVVJMKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pVUkxTdHJpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiYgc3pSZXN1bHRCdWYpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzVVJMU3RyaW5nID0NCisgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pVUkxTdHJpbmcuR2V0Q1N0cigpLCBzelVSTFN0cmluZy5HZXRMZW5ndGgoKSk7DQorICBDRlhfV2lkZVRleHRCdWYgd3NSZXN1bHRCdWY7DQorICBGWF9XQ0hBUiBjaCA9IDA7DQorICBpbnQzMl90IGlMZW5ndGggPSB3c1VSTFN0cmluZy5HZXRMZW5ndGgoKTsNCisgIEZYX1dDSEFSIHN0ckVuY29kZVs0XTsNCisgIHN0ckVuY29kZVswXSA9ICclJzsNCisgIHN0ckVuY29kZVszXSA9IDA7DQorICBGWF9XQ0hBUiBzdHJVbnNhZmVbXSA9IHsnICcsICc8JywgICc+JywgJyInLCAnIycsICclJywgJ3snLCAnfScsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAnfCcsICdcXCcsICdeJywgJ34nLCAnWycsICddJywgJ2AnfTsNCisgIEZYX1dDSEFSIHN0clJlc2VydmVkW10gPSB7JzsnLCAnLycsICc/JywgJzonLCAnQCcsICc9JywgJyYnfTsNCisgIEZYX1dDSEFSIHN0clNwZWNpYWxbXSA9IHsnJCcsICctJywgJysnLCAnIScsICcqJywgJ1wnJywgJygnLCAnKScsICcsJ307DQorICBjb25zdCBGWF9XQ0hBUiogc3RyQ29kZSA9IEwiMDEyMzQ1Njc4OWFiY2RlZiI7DQorICBmb3IgKGludDMyX3QgdSA9IDA7IHUgPCBpTGVuZ3RoOyArK3UpIHsNCisgICAgY2ggPSB3c1VSTFN0cmluZy5HZXRBdCh1KTsNCisgICAgaW50MzJfdCBpID0gMDsNCisgICAgaW50MzJfdCBpQ291bnQgPSBzaXplb2Yoc3RyVW5zYWZlKSAvIHNpemVvZihzdHJVbnNhZmVbMF0pOw0KKyAgICB3aGlsZSAoaSA8IGlDb3VudCkgew0KKyAgICAgIGlmIChjaCA9PSBzdHJVbnNhZmVbaV0pIHsNCisgICAgICAgIGludDMyX3QgaUluZGV4ID0gY2ggLyAxNjsNCisgICAgICAgIHN0ckVuY29kZVsxXSA9IHN0ckNvZGVbaUluZGV4XTsNCisgICAgICAgIHN0ckVuY29kZVsyXSA9IHN0ckNvZGVbY2ggLSBpSW5kZXggKiAxNl07DQorICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBGWF9XU1RSQyhzdHJFbmNvZGUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgICsraTsNCisgICAgfQ0KKyAgICBpZiAoaSA8IGlDb3VudCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGkgPSAwOw0KKyAgICBpQ291bnQgPSBzaXplb2Yoc3RyUmVzZXJ2ZWQpIC8gc2l6ZW9mKHN0clJlc2VydmVkWzBdKTsNCisgICAgd2hpbGUgKGkgPCBpQ291bnQpIHsNCisgICAgICBpZiAoY2ggPT0gc3RyUmVzZXJ2ZWRbaV0pIHsNCisgICAgICAgIGludDMyX3QgaUluZGV4ID0gY2ggLyAxNjsNCisgICAgICAgIHN0ckVuY29kZVsxXSA9IHN0ckNvZGVbaUluZGV4XTsNCisgICAgICAgIHN0ckVuY29kZVsyXSA9IHN0ckNvZGVbY2ggLSBpSW5kZXggKiAxNl07DQorICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBGWF9XU1RSQyhzdHJFbmNvZGUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgICsraTsNCisgICAgfQ0KKyAgICBpZiAoaSA8IGlDb3VudCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGkgPSAwOw0KKyAgICBpQ291bnQgPSBzaXplb2Yoc3RyU3BlY2lhbCkgLyBzaXplb2Yoc3RyU3BlY2lhbFswXSk7DQorICAgIHdoaWxlIChpIDwgaUNvdW50KSB7DQorICAgICAgaWYgKGNoID09IHN0clNwZWNpYWxbaV0pIHsNCisgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoY2gpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgICsraTsNCisgICAgfQ0KKyAgICBpZiAoaSA8IGlDb3VudCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChjaCA+PSAweDgwICYmIGNoIDw9IDB4ZmYpIHsNCisgICAgICBpbnQzMl90IGlJbmRleCA9IGNoIC8gMTY7DQorICAgICAgc3RyRW5jb2RlWzFdID0gc3RyQ29kZVtpSW5kZXhdOw0KKyAgICAgIHN0ckVuY29kZVsyXSA9IHN0ckNvZGVbY2ggLSBpSW5kZXggKiAxNl07DQorICAgICAgd3NSZXN1bHRCdWYgPDwgRlhfV1NUUkMoc3RyRW5jb2RlKTsNCisgICAgfSBlbHNlIGlmICgoY2ggPj0gMHgwICYmIGNoIDw9IDB4MWYpIHx8IGNoID09IDB4N2YpIHsNCisgICAgICBpbnQzMl90IGlJbmRleCA9IGNoIC8gMTY7DQorICAgICAgc3RyRW5jb2RlWzFdID0gc3RyQ29kZVtpSW5kZXhdOw0KKyAgICAgIHN0ckVuY29kZVsyXSA9IHN0ckNvZGVbY2ggLSBpSW5kZXggKiAxNl07DQorICAgICAgd3NSZXN1bHRCdWYgPDwgRlhfV1NUUkMoc3RyRW5jb2RlKTsNCisgICAgfSBlbHNlIGlmIChjaCA+PSAweDIwICYmIGNoIDw9IDB4N2UpIHsNCisgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKGNoKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpbnQzMl90IGlSYWRpeCA9IDE2Ow0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHN0clRtcDsNCisgICAgICB3aGlsZSAoY2ggPj0gaVJhZGl4KSB7DQorICAgICAgICBGWF9XQ0hBUiB0bXAgPSBzdHJDb2RlW2NoICUgaVJhZGl4XTsNCisgICAgICAgIGNoIC89IGlSYWRpeDsNCisgICAgICAgIHN0clRtcCArPSB0bXA7DQorICAgICAgfQ0KKyAgICAgIHN0clRtcCArPSBzdHJDb2RlW2NoXTsNCisgICAgICBpbnQzMl90IGlMZW4gPSBzdHJUbXAuR2V0TGVuZ3RoKCk7DQorICAgICAgaWYgKGlMZW4gPCAyKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgaW50MzJfdCBpSW5kZXggPSAwOw0KKyAgICAgIGlmIChpTGVuICUgMiAhPSAwKSB7DQorICAgICAgICBzdHJFbmNvZGVbMV0gPSAnMCc7DQorICAgICAgICBzdHJFbmNvZGVbMl0gPSBzdHJUbXAuR2V0QXQoaUxlbiAtIDEpOw0KKyAgICAgICAgaUluZGV4ID0gaUxlbiAtIDI7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHN0ckVuY29kZVsxXSA9IHN0clRtcC5HZXRBdChpTGVuIC0gMSk7DQorICAgICAgICBzdHJFbmNvZGVbMl0gPSBzdHJUbXAuR2V0QXQoaUxlbiAtIDIpOw0KKyAgICAgICAgaUluZGV4ID0gaUxlbiAtIDM7DQorICAgICAgfQ0KKyAgICAgIHdzUmVzdWx0QnVmIDw8IEZYX1dTVFJDKHN0ckVuY29kZSk7DQorICAgICAgd2hpbGUgKGlJbmRleCA+IDApIHsNCisgICAgICAgIHN0ckVuY29kZVsxXSA9IHN0clRtcC5HZXRBdChpSW5kZXgpOw0KKyAgICAgICAgc3RyRW5jb2RlWzJdID0gc3RyVG1wLkdldEF0KGlJbmRleCAtIDEpOw0KKyAgICAgICAgaUluZGV4IC09IDI7DQorICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBGWF9XU1RSQyhzdHJFbmNvZGUpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcigwKTsNCisgIHN6UmVzdWx0QnVmID0gRlhfVVRGOEVuY29kZSh3c1Jlc3VsdEJ1Zi5HZXRCdWZmZXIoKSwgd3NSZXN1bHRCdWYuR2V0TGVuZ3RoKCkpOw0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpFbmNvZGVIVE1MKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pIVE1MU3RyaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmJiBzelJlc3VsdEJ1Zikgew0KKyAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gc3pIVE1MU3RyaW5nLkdldENTdHIoKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzSFRNTFN0cmluZyA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzdHIsIHN0ci5HZXRMZW5ndGgoKSk7DQorICBjb25zdCBGWF9XQ0hBUiogc3RyQ29kZSA9IEwiMDEyMzQ1Njc4OWFiY2RlZiI7DQorICBGWF9XQ0hBUiBzdHJFbmNvZGVbOV07DQorICBzdHJFbmNvZGVbMF0gPSAnJic7DQorICBzdHJFbmNvZGVbMV0gPSAnIyc7DQorICBzdHJFbmNvZGVbMl0gPSAneCc7DQorICBzdHJFbmNvZGVbNV0gPSAnOyc7DQorICBzdHJFbmNvZGVbNl0gPSAwOw0KKyAgc3RyRW5jb2RlWzddID0gJzsnOw0KKyAgc3RyRW5jb2RlWzhdID0gMDsNCisgIENGWF9XaWRlVGV4dEJ1ZiB3c1Jlc3VsdEJ1ZjsNCisgIHVpbnQzMl90IGNoID0gMDsNCisgIGludDMyX3QgaUxlbiA9IHdzSFRNTFN0cmluZy5HZXRMZW5ndGgoKTsNCisgIGludDMyX3QgaSA9IDA7DQorICBjb25zdCBGWF9XQ0hBUiogcERhdGEgPSB3c0hUTUxTdHJpbmc7DQorICBpbnQzMl90IGlJbmRleCA9IDA7DQorICBDRlhfV2lkZVN0cmluZyBodG1sUmVzZXJ2ZTsNCisgIHdoaWxlIChpIDwgaUxlbikgew0KKyAgICBjaCA9ICoocERhdGEgKyBpKTsNCisgICAgaHRtbFJlc2VydmUuRW1wdHkoKTsNCisgICAgaWYgKEhUTUxDb2RlMlNUUihjaCwgaHRtbFJlc2VydmUpKSB7DQorICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcihMJyYnKTsNCisgICAgICB3c1Jlc3VsdEJ1ZiA8PCBodG1sUmVzZXJ2ZTsNCisgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKEwnOycpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChjaCA+PSAzMiAmJiBjaCA8PSAxMjYpIHsNCisgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoKEZYX1dDSEFSKWNoKTsNCisgICAgICB9IGVsc2UgaWYgKGNoIDwgMjU2KSB7DQorICAgICAgICBpSW5kZXggPSBjaCAvIDE2Ow0KKyAgICAgICAgc3RyRW5jb2RlWzNdID0gc3RyQ29kZVtpSW5kZXhdOw0KKyAgICAgICAgc3RyRW5jb2RlWzRdID0gc3RyQ29kZVtjaCAtIGlJbmRleCAqIDE2XTsNCisgICAgICAgIHN0ckVuY29kZVs1XSA9ICc7JzsNCisgICAgICAgIHN0ckVuY29kZVs2XSA9IDA7DQorICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBGWF9XU1RSQyhzdHJFbmNvZGUpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpbnQzMl90IGlCaWdCeXRlID0gY2ggLyAyNTY7DQorICAgICAgICBpbnQzMl90IGlMaXR0bGVCeXRlID0gY2ggJSAyNTY7DQorICAgICAgICBzdHJFbmNvZGVbM10gPSBzdHJDb2RlW2lCaWdCeXRlIC8gMTZdOw0KKyAgICAgICAgc3RyRW5jb2RlWzRdID0gc3RyQ29kZVtpQmlnQnl0ZSAlIDE2XTsNCisgICAgICAgIHN0ckVuY29kZVs1XSA9IHN0ckNvZGVbaUxpdHRsZUJ5dGUgLyAxNl07DQorICAgICAgICBzdHJFbmNvZGVbNl0gPSBzdHJDb2RlW2lMaXR0bGVCeXRlICUgMTZdOw0KKyAgICAgICAgd3NSZXN1bHRCdWYgPDwgRlhfV1NUUkMoc3RyRW5jb2RlKTsNCisgICAgICB9DQorICAgIH0NCisgICAgKytpOw0KKyAgfQ0KKyAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcigwKTsNCisgIHN6UmVzdWx0QnVmID0gRlhfVVRGOEVuY29kZSh3c1Jlc3VsdEJ1Zi5HZXRCdWZmZXIoKSwgd3NSZXN1bHRCdWYuR2V0TGVuZ3RoKCkpOw0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpFbmNvZGVYTUwoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelhNTFN0cmluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmJiBzelJlc3VsdEJ1Zikgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NYTUxTdHJpbmcgPQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelhNTFN0cmluZy5HZXRDU3RyKCksIHN6WE1MU3RyaW5nLkdldExlbmd0aCgpKTsNCisgIENGWF9XaWRlVGV4dEJ1ZiB3c1Jlc3VsdEJ1ZjsNCisgIGVudW0gew0KKyAgICBRVU9ULA0KKyAgICBBTVAsDQorICAgIEFQT1MsDQorICAgIExULA0KKyAgICBHVCwNCisgIH07DQorICBGWF9XQ0hBUiBzdHJFbmNvZGVbOV07DQorICBzdHJFbmNvZGVbMF0gPSAnJic7DQorICBzdHJFbmNvZGVbMV0gPSAnIyc7DQorICBzdHJFbmNvZGVbMl0gPSAneCc7DQorICBzdHJFbmNvZGVbNV0gPSAnOyc7DQorICBzdHJFbmNvZGVbNl0gPSAwOw0KKyAgc3RyRW5jb2RlWzddID0gJzsnOw0KKyAgc3RyRW5jb2RlWzhdID0gMDsNCisgIGNvbnN0IEZYX1dDSEFSKiBjb25zdCBzdHJOYW1lW10gPSB7TCJxdW90IiwgTCJhbXAiLCBMImFwb3MiLCBMImx0IiwgTCJndCJ9Ow0KKyAgY29uc3QgRlhfV0NIQVIqIHN0ckNvZGUgPSBMIjAxMjM0NTY3ODlhYmNkZWYiOw0KKyAgRlhfV0NIQVIgY2ggPSAwOw0KKyAgaW50MzJfdCBpTGVuZ3RoID0gd3NYTUxTdHJpbmcuR2V0TGVuZ3RoKCk7DQorICBpbnQzMl90IGlJbmRleCA9IDA7DQorICBpbnQzMl90IHUgPSAwOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBEYXRhID0gd3NYTUxTdHJpbmc7DQorICBmb3IgKHUgPSAwOyB1IDwgaUxlbmd0aDsgKyt1KSB7DQorICAgIGNoID0gKihwRGF0YSArIHUpOw0KKyAgICBzd2l0Y2ggKGNoKSB7DQorICAgICAgY2FzZSAnIic6DQorICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKCcmJyk7DQorICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBDRlhfV2lkZVN0cmluZ0Moc3RyTmFtZVtRVU9UXSk7DQorICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKCc7Jyk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICcmJzoNCisgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoJyYnKTsNCisgICAgICAgIHdzUmVzdWx0QnVmIDw8IENGWF9XaWRlU3RyaW5nQyhzdHJOYW1lW0FNUF0pOw0KKyAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcignOycpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnXCcnOg0KKyAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcignJicpOw0KKyAgICAgICAgd3NSZXN1bHRCdWYgPDwgQ0ZYX1dpZGVTdHJpbmdDKHN0ck5hbWVbQVBPU10pOw0KKyAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcignOycpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnPCc6DQorICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKCcmJyk7DQorICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBDRlhfV2lkZVN0cmluZ0Moc3RyTmFtZVtMVF0pOw0KKyAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcignOycpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnPic6DQorICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKCcmJyk7DQorICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBDRlhfV2lkZVN0cmluZ0Moc3RyTmFtZVtHVF0pOw0KKyAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcignOycpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgaWYgKGNoID49IDMyICYmIGNoIDw9IDEyNikgew0KKyAgICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKGNoKTsNCisgICAgICAgIH0gZWxzZSBpZiAoY2ggPCAyNTYpIHsNCisgICAgICAgICAgaUluZGV4ID0gY2ggLyAxNjsNCisgICAgICAgICAgc3RyRW5jb2RlWzNdID0gc3RyQ29kZVtpSW5kZXhdOw0KKyAgICAgICAgICBzdHJFbmNvZGVbNF0gPSBzdHJDb2RlW2NoIC0gaUluZGV4ICogMTZdOw0KKyAgICAgICAgICBzdHJFbmNvZGVbNV0gPSAnOyc7DQorICAgICAgICAgIHN0ckVuY29kZVs2XSA9IDA7DQorICAgICAgICAgIHdzUmVzdWx0QnVmIDw8IEZYX1dTVFJDKHN0ckVuY29kZSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBpbnQzMl90IGlCaWdCeXRlID0gY2ggLyAyNTY7DQorICAgICAgICAgIGludDMyX3QgaUxpdHRsZUJ5dGUgPSBjaCAlIDI1NjsNCisgICAgICAgICAgc3RyRW5jb2RlWzNdID0gc3RyQ29kZVtpQmlnQnl0ZSAvIDE2XTsNCisgICAgICAgICAgc3RyRW5jb2RlWzRdID0gc3RyQ29kZVtpQmlnQnl0ZSAlIDE2XTsNCisgICAgICAgICAgc3RyRW5jb2RlWzVdID0gc3RyQ29kZVtpTGl0dGxlQnl0ZSAvIDE2XTsNCisgICAgICAgICAgc3RyRW5jb2RlWzZdID0gc3RyQ29kZVtpTGl0dGxlQnl0ZSAlIDE2XTsNCisgICAgICAgICAgd3NSZXN1bHRCdWYgPDwgRlhfV1NUUkMoc3RyRW5jb2RlKTsNCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICB9DQorICB9DQorICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKDApOw0KKyAgc3pSZXN1bHRCdWYgPSBGWF9VVEY4RW5jb2RlKHdzUmVzdWx0QnVmLkdldEJ1ZmZlcigpLCB3c1Jlc3VsdEJ1Zi5HZXRMZW5ndGgoKSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GTTJKU0NvbnRleHQ6OkhUTUxTVFIyQ29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHBEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgaUNvZGUpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHBEYXRhLkdldExlbmd0aCgpOw0KKyAgdWludDMyX3QgdUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VyhwRGF0YS5HZXRQdHIoKSwgaUxlbmd0aCk7DQorICBYRkFfRk1IdG1sSGFzaGVkUmVzZXJ2ZUNvZGUgaHRtbGhhc2hlZHJlc2VydmVjb2RlOw0KKyAgaW50MzJfdCBpU3RhcnQgPSAwLA0KKyAgICAgICAgICBpRW5kID0gKHNpemVvZihyZXNlcnZlc0ZvckRlY29kZSkgLyBzaXplb2YocmVzZXJ2ZXNGb3JEZWNvZGVbMF0pKSAtIDE7DQorICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgZG8gew0KKyAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgaHRtbGhhc2hlZHJlc2VydmVjb2RlID0gcmVzZXJ2ZXNGb3JEZWNvZGVbaU1pZF07DQorICAgIGlmICh1SGFzaCA9PSBodG1saGFzaGVkcmVzZXJ2ZWNvZGUubV91SGFzaCkgew0KKyAgICAgIGlDb2RlID0gaHRtbGhhc2hlZHJlc2VydmVjb2RlLm1fdUNvZGU7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0gZWxzZSBpZiAodUhhc2ggPCBodG1saGFzaGVkcmVzZXJ2ZWNvZGUubV91SGFzaCkgew0KKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgfQ0KKyAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfRk0ySlNDb250ZXh0OjpIVE1MQ29kZTJTVFIodWludDMyX3QgaUNvZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0hUTUxSZXNlcnZlKSB7DQorICBYRkFfRk1IdG1sUmVzZXJ2ZUNvZGUgaHRtbHJlc2VydmVjb2RlOw0KKyAgaW50MzJfdCBpU3RhcnQgPSAwLA0KKyAgICAgICAgICBpRW5kID0gKHNpemVvZihyZXNlcnZlc0ZvckVuY29kZSkgLyBzaXplb2YocmVzZXJ2ZXNGb3JFbmNvZGVbMF0pKSAtIDE7DQorICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgZG8gew0KKyAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgaHRtbHJlc2VydmVjb2RlID0gcmVzZXJ2ZXNGb3JFbmNvZGVbaU1pZF07DQorICAgIGlmIChpQ29kZSA9PSBodG1scmVzZXJ2ZWNvZGUubV91Q29kZSkgew0KKyAgICAgIHdzSFRNTFJlc2VydmUgPSBodG1scmVzZXJ2ZWNvZGUubV9odG1sUmVzZXJ2ZTsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfSBlbHNlIGlmIChpQ29kZSA8IGh0bWxyZXNlcnZlY29kZS5tX3VDb2RlKSB7DQorICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICB9DQorICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK3N0YXRpYyBGWF9CT09MIFhGQV9QQVRURVJOX1NUUklOR19UeXBlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEJiBwYXR0ZXJuVHlwZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NQYXR0ZXJuID0NCisgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pQYXR0ZXJuLkdldENTdHIoKSwgc3pQYXR0ZXJuLkdldExlbmd0aCgpKTsNCisgIGlmIChGWF9XU1RSQyhMImRhdGV0aW1lIikgPT0gd3NQYXR0ZXJuLkxlZnQoOCkpIHsNCisgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfREFURVRJTUU7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfSBlbHNlIGlmIChGWF9XU1RSQyhMImRhdGUiKSA9PSB3c1BhdHRlcm4uTGVmdCg0KSkgew0KKyAgICBwYXR0ZXJuVHlwZSA9IHdzUGF0dGVybi5GaW5kKEwidGltZSIpID4gMCA/IFhGQV9WVF9EQVRFVElNRSA6IFhGQV9WVF9EQVRFOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0gZWxzZSBpZiAoRlhfV1NUUkMoTCJ0aW1lIikgPT0gd3NQYXR0ZXJuLkxlZnQoNCkpIHsNCisgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfVElNRTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9IGVsc2UgaWYgKEZYX1dTVFJDKEwidGV4dCIpID09IHdzUGF0dGVybi5MZWZ0KDQpKSB7DQorICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX1RFWFQ7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfSBlbHNlIGlmIChGWF9XU1RSQyhMIm51bSIpID09IHdzUGF0dGVybi5MZWZ0KDMpKSB7DQorICAgIGlmIChGWF9XU1RSQyhMImludGVnZXIiKSA9PSB3c1BhdHRlcm4uTWlkKDQsIDcpKSB7DQorICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfSU5URUdFUjsNCisgICAgfSBlbHNlIGlmIChGWF9XU1RSQyhMImRlY2ltYWwiKSA9PSB3c1BhdHRlcm4uTWlkKDQsIDcpKSB7DQorICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfREVDSU1BTDsNCisgICAgfSBlbHNlIGlmIChGWF9XU1RSQyhMImN1cnJlbmN5IikgPT0gd3NQYXR0ZXJuLk1pZCg0LCA4KSkgew0KKyAgICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX0ZMT0FUOw0KKyAgICB9IGVsc2UgaWYgKEZYX1dTVFJDKEwicGVyY2VudCIpID09IHdzUGF0dGVybi5NaWQoNCwgNykpIHsNCisgICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9GTE9BVDsNCisgICAgfSBlbHNlIHsNCisgICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9GTE9BVDsNCisgICAgfQ0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX05VTEw7DQorICB3c1BhdHRlcm4uTWFrZUxvd2VyKCk7DQorICBjb25zdCBGWF9XQ0hBUiogcERhdGEgPSB3c1BhdHRlcm47DQorICBpbnQzMl90IGlMZW5ndGggPSB3c1BhdHRlcm4uR2V0TGVuZ3RoKCk7DQorICBpbnQzMl90IGlJbmRleCA9IDA7DQorICBGWF9CT09MIGJTaW5nbGVRdW90YXRpb24gPSBGQUxTRTsNCisgIEZYX1dDSEFSIHBhdHRlcm5DaGFyOw0KKyAgd2hpbGUgKGlJbmRleCA8IGlMZW5ndGgpIHsNCisgICAgcGF0dGVybkNoYXIgPSAqKHBEYXRhICsgaUluZGV4KTsNCisgICAgaWYgKHBhdHRlcm5DaGFyID09IDB4MjcpIHsNCisgICAgICBiU2luZ2xlUXVvdGF0aW9uID0gIWJTaW5nbGVRdW90YXRpb247DQorICAgIH0gZWxzZSBpZiAoIWJTaW5nbGVRdW90YXRpb24gJiYNCisgICAgICAgICAgICAgICAocGF0dGVybkNoYXIgPT0gJ3knIHx8IHBhdHRlcm5DaGFyID09ICdqJykpIHsNCisgICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9EQVRFOw0KKyAgICAgIGlJbmRleCsrOw0KKyAgICAgIEZYX1dDSEFSIHRpbWVQYXR0ZXJuQ2hhcjsNCisgICAgICB3aGlsZSAoaUluZGV4IDwgaUxlbmd0aCkgew0KKyAgICAgICAgdGltZVBhdHRlcm5DaGFyID0gKihwRGF0YSArIGlJbmRleCk7DQorICAgICAgICBpZiAodGltZVBhdHRlcm5DaGFyID09IDB4MjcpIHsNCisgICAgICAgICAgYlNpbmdsZVF1b3RhdGlvbiA9ICFiU2luZ2xlUXVvdGF0aW9uOw0KKyAgICAgICAgfSBlbHNlIGlmICghYlNpbmdsZVF1b3RhdGlvbiAmJiB0aW1lUGF0dGVybkNoYXIgPT0gJ3QnKSB7DQorICAgICAgICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX0RBVEVUSU1FOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGlJbmRleCsrOw0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgfSBlbHNlIGlmICghYlNpbmdsZVF1b3RhdGlvbiAmJg0KKyAgICAgICAgICAgICAgIChwYXR0ZXJuQ2hhciA9PSAnaCcgfHwgcGF0dGVybkNoYXIgPT0gJ2snKSkgew0KKyAgICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX1RJTUU7DQorICAgICAgYnJlYWs7DQorICAgIH0gZWxzZSBpZiAoIWJTaW5nbGVRdW90YXRpb24gJiYNCisgICAgICAgICAgICAgICAocGF0dGVybkNoYXIgPT0gJ2EnIHx8IHBhdHRlcm5DaGFyID09ICd4JyB8fA0KKyAgICAgICAgICAgICAgICBwYXR0ZXJuQ2hhciA9PSAnbycgfHwgcGF0dGVybkNoYXIgPT0gJzAnKSkgew0KKyAgICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX1RFWFQ7DQorICAgICAgaWYgKHBhdHRlcm5DaGFyID09ICd4JyB8fCBwYXR0ZXJuQ2hhciA9PSAnbycgfHwgcGF0dGVybkNoYXIgPT0gJzAnKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoIWJTaW5nbGVRdW90YXRpb24gJiYNCisgICAgICAgICAgICAgICAocGF0dGVybkNoYXIgPT0gJ3onIHx8IHBhdHRlcm5DaGFyID09ICdzJyB8fA0KKyAgICAgICAgICAgICAgICBwYXR0ZXJuQ2hhciA9PSAnZScgfHwgcGF0dGVybkNoYXIgPT0gJ3YnIHx8DQorICAgICAgICAgICAgICAgIHBhdHRlcm5DaGFyID09ICc4JyB8fCBwYXR0ZXJuQ2hhciA9PSAnLCcgfHwNCisgICAgICAgICAgICAgICAgcGF0dGVybkNoYXIgPT0gJy4nIHx8IHBhdHRlcm5DaGFyID09ICckJykpIHsNCisgICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9GTE9BVDsNCisgICAgICBpZiAocGF0dGVybkNoYXIgPT0gJ3YnIHx8IHBhdHRlcm5DaGFyID09ICc4JyB8fCBwYXR0ZXJuQ2hhciA9PSAnJCcpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpSW5kZXgrKzsNCisgIH0NCisgIGlmIChwYXR0ZXJuVHlwZSA9PSBYRkFfVlRfTlVMTCkgew0KKyAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9URVhUIHwgWEZBX1ZUX0ZMT0FUOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpGb3JtYXQoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID49IDIpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBzelBhdHRlcm47DQorICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIHN6UGF0dGVybik7DQorICAgIENGWF9CeXRlU3RyaW5nIHN6VmFsdWU7DQorICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdUd28sIHN6VmFsdWUpOw0KKyAgICBDWEZBX0RvY3VtZW50KiBwRG9jID0gcENvbnRleHQtPkdldERvY3VtZW50KCk7DQorICAgIElGWF9Mb2NhbGVNZ3IqIHBNZ3IgPSAoSUZYX0xvY2FsZU1nciopcERvYy0+R2V0TG9jYWxNZ3IoKTsNCisgICAgQ1hGQV9PYmplY3QqIHBUaGlzTm9kZSA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpOw0KKyAgICBGWFNZU19hc3NlcnQocFRoaXNOb2RlLT5Jc05vZGUoKSk7DQorICAgIENYRkFfV2lkZ2V0RGF0YSB3aWRnZXREYXRhKChDWEZBX05vZGUqKXBUaGlzTm9kZSk7DQorICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSB3aWRnZXREYXRhLkdldExvY2FsKCk7DQorICAgIEZYX0RXT1JEIHBhdHRlcm5UeXBlOw0KKyAgICBGWF9CT09MIGJDb21wZWx0ZSA9IFhGQV9QQVRURVJOX1NUUklOR19UeXBlKHN6UGF0dGVybiwgcGF0dGVyblR5cGUpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1BhdHRlcm4gPQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6UGF0dGVybiwgc3pQYXR0ZXJuLkdldExlbmd0aCgpKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSA9DQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pWYWx1ZSwgc3pWYWx1ZS5HZXRMZW5ndGgoKSk7DQorICAgIGlmICghYkNvbXBlbHRlKSB7DQorICAgICAgc3dpdGNoIChwYXR0ZXJuVHlwZSkgew0KKyAgICAgICAgY2FzZSBYRkFfVlRfREFURVRJTUU6IHsNCisgICAgICAgICAgRlhfU1RSU0laRSBpVENoYXIgPSB3c1BhdHRlcm4uRmluZChMJ1QnKTsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlUGF0dGVybiA9IEZYX1dTVFJDKEwiZGF0ZXsiKTsNCisgICAgICAgICAgd3NEYXRlUGF0dGVybiArPSB3c1BhdHRlcm4uTGVmdChpVENoYXIpOw0KKyAgICAgICAgICB3c0RhdGVQYXR0ZXJuICs9IEZYX1dTVFJDKEwifSAiKTsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUaW1lUGF0dGVybiA9IEZYX1dTVFJDKEwidGltZXsiKTsNCisgICAgICAgICAgd3NUaW1lUGF0dGVybiArPSB3c1BhdHRlcm4uTWlkKGlUQ2hhciArIDEpOw0KKyAgICAgICAgICB3c1RpbWVQYXR0ZXJuICs9IEZYX1dTVFJDKEwifSIpOw0KKyAgICAgICAgICB3c1BhdHRlcm4gPSB3c0RhdGVQYXR0ZXJuICsgd3NUaW1lUGF0dGVybjsNCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9WVF9EQVRFOiB7DQorICAgICAgICAgIHdzUGF0dGVybiA9IEZYX1dTVFJDKEwiZGF0ZXsiKSArIHdzUGF0dGVybjsNCisgICAgICAgICAgd3NQYXR0ZXJuICs9IEZYX1dTVFJDKEwifSIpOw0KKyAgICAgICAgfSBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX1ZUX1RJTUU6IHsNCisgICAgICAgICAgd3NQYXR0ZXJuID0gRlhfV1NUUkMoTCJ0aW1leyIpICsgd3NQYXR0ZXJuOw0KKyAgICAgICAgICB3c1BhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9Iik7DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfVlRfVEVYVDogew0KKyAgICAgICAgICB3c1BhdHRlcm4gPSBGWF9XU1RSQyhMInRleHR7IikgKyB3c1BhdHRlcm47DQorICAgICAgICAgIHdzUGF0dGVybiArPSBGWF9XU1RSQyhMIn0iKTsNCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9WVF9GTE9BVDogew0KKyAgICAgICAgICB3c1BhdHRlcm4gPSBGWF9XU1RSQyhMIm51bXsiKSArIHdzUGF0dGVybjsNCisgICAgICAgICAgd3NQYXR0ZXJuICs9IEZYX1dTVFJDKEwifSIpOw0KKyAgICAgICAgfSBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXN0UGF0dGVybjsNCisgICAgICAgICAgd3NUZXN0UGF0dGVybiA9IEZYX1dTVFJDKEwibnVteyIpICsgd3NQYXR0ZXJuOw0KKyAgICAgICAgICB3c1Rlc3RQYXR0ZXJuICs9IEZYX1dTVFJDKEwifSIpOw0KKyAgICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIHRlbXBMb2NhbGVWYWx1ZShYRkFfVlRfRkxPQVQsIHdzVmFsdWUsIHdzVGVzdFBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUsIChDWEZBX0xvY2FsZU1nciopcE1ncik7DQorICAgICAgICAgIGlmICh0ZW1wTG9jYWxlVmFsdWUuSXNWYWxpZCgpKSB7DQorICAgICAgICAgICAgd3NQYXR0ZXJuID0gd3NUZXN0UGF0dGVybjsNCisgICAgICAgICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9GTE9BVDsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICB3c1Rlc3RQYXR0ZXJuID0gRlhfV1NUUkMoTCJ0ZXh0eyIpICsgd3NQYXR0ZXJuOw0KKyAgICAgICAgICAgIHdzVGVzdFBhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9Iik7DQorICAgICAgICAgICAgd3NQYXR0ZXJuID0gd3NUZXN0UGF0dGVybjsNCisgICAgICAgICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9URVhUOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBDWEZBX0xvY2FsZVZhbHVlIGxvY2FsZVZhbHVlKHBhdHRlcm5UeXBlLCB3c1ZhbHVlLCB3c1BhdHRlcm4sIHBMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENYRkFfTG9jYWxlTWdyKilwTWdyKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXQ7DQorICAgIGlmIChsb2NhbGVWYWx1ZS5Gb3JtYXRQYXR0ZXJucyh3c1JldCwgd3NQYXR0ZXJuLCBwTG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVVRGOEVuY29kZSh3c1JldCwgd3NSZXQuR2V0TGVuZ3RoKCkpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgIiIpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkZvcm1hdCIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpMZWZ0KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMikgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgIEZYX0JPT0wgYXJnSXNOdWxsID0gRkFMU0U7DQorICAgIGlmICgoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpKSB8fCAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUd28pKSkgew0KKyAgICAgIGFyZ0lzTnVsbCA9IFRSVUU7DQorICAgIH0NCisgICAgaWYgKGFyZ0lzTnVsbCkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBzb3VyY2VTdHJpbmc7DQorICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgc291cmNlU3RyaW5nKTsNCisgICAgICBpbnQzMl90IGNvdW50ID0gSFZhbHVlVG9JbnRlZ2VyKGhUaGlzLCBhcmdUd28pOw0KKyAgICAgIGlmIChjb3VudCA8IDApIHsNCisgICAgICAgIGNvdW50ID0gMDsNCisgICAgICB9DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VTdHJpbmcuTGVmdChjb3VudCkpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdUd28pOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkxlZnQiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6TGVuKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDEpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgc291cmNlU3RyaW5nOw0KKyAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIHNvdXJjZVN0cmluZyk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIHNvdXJjZVN0cmluZy5HZXRMZW5ndGgoKSk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkxlbiIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpMb3dlcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgaWYgKChhcmdjID4gMCkgJiYgKGFyZ2MgPCAzKSkgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBhcmdTdHJpbmc7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgbG9jYWxlVmFsdWUgPSAwOw0KKyAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChhcmdjID09IDIpIHsNCisgICAgICAgIGxvY2FsZVZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICB9DQorICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgYXJnU3RyaW5nKTsNCisgICAgICBDRlhfV2lkZVRleHRCdWYgbG93U3RyaW5nQnVmOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzQXJnU3RyaW5nID0NCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGFyZ1N0cmluZywgYXJnU3RyaW5nLkdldExlbmd0aCgpKTsNCisgICAgICBjb25zdCBGWF9XQ0hBUiogcERhdGEgPSB3c0FyZ1N0cmluZzsNCisgICAgICBpbnQzMl90IGlMZW4gPSBhcmdTdHJpbmcuR2V0TGVuZ3RoKCk7DQorICAgICAgaW50MzJfdCBpID0gMDsNCisgICAgICBpbnQzMl90IGNoID0gMDsNCisgICAgICB3aGlsZSAoaSA8IGlMZW4pIHsNCisgICAgICAgIGNoID0gKihwRGF0YSArIGkpOw0KKyAgICAgICAgaWYgKGNoID49IDB4NDEgJiYgY2ggPD0gMHg1QSkgew0KKyAgICAgICAgICBjaCArPSAzMjsNCisgICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gMHhDMCAmJiBjaCA8PSAweERFKSB7DQorICAgICAgICAgIGNoICs9IDMyOw0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAweDEwMCB8fCBjaCA9PSAweDEwMiB8fCBjaCA9PSAweDEwNCkgew0KKyAgICAgICAgICBjaCArPSAxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbG93U3RyaW5nQnVmLkFwcGVuZENoYXIoY2gpOw0KKyAgICAgICAgKytpOw0KKyAgICAgIH0NCisgICAgICBsb3dTdHJpbmdCdWYuQXBwZW5kQ2hhcigwKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKA0KKyAgICAgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgIEZYX1VURjhFbmNvZGUobG93U3RyaW5nQnVmLkdldEJ1ZmZlcigpLCBsb3dTdHJpbmdCdWYuR2V0TGVuZ3RoKCkpKTsNCisgICAgICBpZiAoYXJnYyA9PSAyKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxvY2FsZVZhbHVlKTsNCisgICAgICB9DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiTG93ZXIiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6THRyaW0oRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDEpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIGlmIChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgc291cmNlU3RyaW5nOw0KKyAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUsIHNvdXJjZVN0cmluZyk7DQorICAgICAgc291cmNlU3RyaW5nLlRyaW1MZWZ0KCk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIHNvdXJjZVN0cmluZyk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkx0cmltIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlBhcnNlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAyKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVHdvID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnVHdvKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBzelBhdHRlcm47DQorICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgc3pQYXR0ZXJuKTsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBzelZhbHVlOw0KKyAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdUd28sIHN6VmFsdWUpOw0KKyAgICAgIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCisgICAgICBJRlhfTG9jYWxlTWdyKiBwTWdyID0gKElGWF9Mb2NhbGVNZ3IqKXBEb2MtPkdldExvY2FsTWdyKCk7DQorICAgICAgQ1hGQV9PYmplY3QqIHBUaGlzTm9kZSA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpOw0KKyAgICAgIEZYU1lTX2Fzc2VydChwVGhpc05vZGUtPklzTm9kZSgpKTsNCisgICAgICBDWEZBX1dpZGdldERhdGEgd2lkZ2V0RGF0YSgoQ1hGQV9Ob2RlKilwVGhpc05vZGUpOw0KKyAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSB3aWRnZXREYXRhLkdldExvY2FsKCk7DQorICAgICAgRlhfRFdPUkQgcGF0dGVyblR5cGU7DQorICAgICAgRlhfQk9PTCBiQ29tcGxldGVQYXR0ZXJuID0NCisgICAgICAgICAgWEZBX1BBVFRFUk5fU1RSSU5HX1R5cGUoc3pQYXR0ZXJuLCBwYXR0ZXJuVHlwZSk7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQYXR0ZXJuID0NCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6UGF0dGVybiwgc3pQYXR0ZXJuLkdldExlbmd0aCgpKTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlID0NCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6VmFsdWUsIHN6VmFsdWUuR2V0TGVuZ3RoKCkpOw0KKyAgICAgIENGWF9CeXRlU3RyaW5nIHN6UGFyc2VkVmFsdWU7DQorICAgICAgaWYgKGJDb21wbGV0ZVBhdHRlcm4pIHsNCisgICAgICAgIENYRkFfTG9jYWxlVmFsdWUgbG9jYWxlVmFsdWUocGF0dGVyblR5cGUsIHdzVmFsdWUsIHdzUGF0dGVybiwgcExvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENYRkFfTG9jYWxlTWdyKilwTWdyKTsNCisgICAgICAgIGlmIChsb2NhbGVWYWx1ZS5Jc1ZhbGlkKCkpIHsNCisgICAgICAgICAgc3pQYXJzZWRWYWx1ZSA9IEZYX1VURjhFbmNvZGUobG9jYWxlVmFsdWUuR2V0VmFsdWUoKSk7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzelBhcnNlZFZhbHVlKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAiIik7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHN3aXRjaCAocGF0dGVyblR5cGUpIHsNCisgICAgICAgICAgY2FzZSBYRkFfVlRfREFURVRJTUU6IHsNCisgICAgICAgICAgICBGWF9TVFJTSVpFIGlUQ2hhciA9IHdzUGF0dGVybi5GaW5kKEwnVCcpOw0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZVBhdHRlcm4gPSBGWF9XU1RSQyhMImRhdGV7Iik7DQorICAgICAgICAgICAgd3NEYXRlUGF0dGVybiArPSB3c1BhdHRlcm4uTGVmdChpVENoYXIpOw0KKyAgICAgICAgICAgIHdzRGF0ZVBhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9ICIpOw0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGltZVBhdHRlcm4gPSBGWF9XU1RSQyhMInRpbWV7Iik7DQorICAgICAgICAgICAgd3NUaW1lUGF0dGVybiArPSB3c1BhdHRlcm4uTWlkKGlUQ2hhciArIDEpOw0KKyAgICAgICAgICAgIHdzVGltZVBhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9Iik7DQorICAgICAgICAgICAgd3NQYXR0ZXJuID0gd3NEYXRlUGF0dGVybiArIHdzVGltZVBhdHRlcm47DQorICAgICAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSBsb2NhbGVWYWx1ZShwYXR0ZXJuVHlwZSwgd3NWYWx1ZSwgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExvY2FsZSwgKENYRkFfTG9jYWxlTWdyKilwTWdyKTsNCisgICAgICAgICAgICBpZiAobG9jYWxlVmFsdWUuSXNWYWxpZCgpKSB7DQorICAgICAgICAgICAgICBzelBhcnNlZFZhbHVlID0gRlhfVVRGOEVuY29kZShsb2NhbGVWYWx1ZS5HZXRWYWx1ZSgpKTsNCisgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzelBhcnNlZFZhbHVlKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksICIiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gYnJlYWs7DQorICAgICAgICAgIGNhc2UgWEZBX1ZUX0RBVEU6IHsNCisgICAgICAgICAgICB3c1BhdHRlcm4gPSBGWF9XU1RSQyhMImRhdGV7IikgKyB3c1BhdHRlcm47DQorICAgICAgICAgICAgd3NQYXR0ZXJuICs9IEZYX1dTVFJDKEwifSIpOw0KKyAgICAgICAgICAgIENYRkFfTG9jYWxlVmFsdWUgbG9jYWxlVmFsdWUocGF0dGVyblR5cGUsIHdzVmFsdWUsIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUsIChDWEZBX0xvY2FsZU1nciopcE1ncik7DQorICAgICAgICAgICAgaWYgKGxvY2FsZVZhbHVlLklzVmFsaWQoKSkgew0KKyAgICAgICAgICAgICAgc3pQYXJzZWRWYWx1ZSA9IEZYX1VURjhFbmNvZGUobG9jYWxlVmFsdWUuR2V0VmFsdWUoKSk7DQorICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgc3pQYXJzZWRWYWx1ZSk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAiIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgICBjYXNlIFhGQV9WVF9USU1FOiB7DQorICAgICAgICAgICAgd3NQYXR0ZXJuID0gRlhfV1NUUkMoTCJ0aW1leyIpICsgd3NQYXR0ZXJuOw0KKyAgICAgICAgICAgIHdzUGF0dGVybiArPSBGWF9XU1RSQyhMIn0iKTsNCisgICAgICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIGxvY2FsZVZhbHVlKHBhdHRlcm5UeXBlLCB3c1ZhbHVlLCB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLCAoQ1hGQV9Mb2NhbGVNZ3IqKXBNZ3IpOw0KKyAgICAgICAgICAgIGlmIChsb2NhbGVWYWx1ZS5Jc1ZhbGlkKCkpIHsNCisgICAgICAgICAgICAgIHN6UGFyc2VkVmFsdWUgPSBGWF9VVEY4RW5jb2RlKGxvY2FsZVZhbHVlLkdldFZhbHVlKCkpOw0KKyAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIHN6UGFyc2VkVmFsdWUpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgIiIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBicmVhazsNCisgICAgICAgICAgY2FzZSBYRkFfVlRfVEVYVDogew0KKyAgICAgICAgICAgIHdzUGF0dGVybiA9IEZYX1dTVFJDKEwidGV4dHsiKSArIHdzUGF0dGVybjsNCisgICAgICAgICAgICB3c1BhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9Iik7DQorICAgICAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSBsb2NhbGVWYWx1ZShYRkFfVlRfVEVYVCwgd3NWYWx1ZSwgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExvY2FsZSwgKENYRkFfTG9jYWxlTWdyKilwTWdyKTsNCisgICAgICAgICAgICBpZiAobG9jYWxlVmFsdWUuSXNWYWxpZCgpKSB7DQorICAgICAgICAgICAgICBzelBhcnNlZFZhbHVlID0gRlhfVVRGOEVuY29kZShsb2NhbGVWYWx1ZS5HZXRWYWx1ZSgpKTsNCisgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzelBhcnNlZFZhbHVlKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksICIiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gYnJlYWs7DQorICAgICAgICAgIGNhc2UgWEZBX1ZUX0ZMT0FUOiB7DQorICAgICAgICAgICAgd3NQYXR0ZXJuID0gRlhfV1NUUkMoTCJudW17IikgKyB3c1BhdHRlcm47DQorICAgICAgICAgICAgd3NQYXR0ZXJuICs9IEZYX1dTVFJDKEwifSIpOw0KKyAgICAgICAgICAgIENYRkFfTG9jYWxlVmFsdWUgbG9jYWxlVmFsdWUoWEZBX1ZUX0ZMT0FULCB3c1ZhbHVlLCB3c1BhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLCAoQ1hGQV9Mb2NhbGVNZ3IqKXBNZ3IpOw0KKyAgICAgICAgICAgIGlmIChsb2NhbGVWYWx1ZS5Jc1ZhbGlkKCkpIHsNCisgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldERvdWJsZShhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlVmFsdWUuR2V0RG91YmxlTnVtKCkpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgIiIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBicmVhazsNCisgICAgICAgICAgZGVmYXVsdDogew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGVzdFBhdHRlcm47DQorICAgICAgICAgICAgd3NUZXN0UGF0dGVybiA9IEZYX1dTVFJDKEwibnVteyIpICsgd3NQYXR0ZXJuOw0KKyAgICAgICAgICAgIHdzVGVzdFBhdHRlcm4gKz0gRlhfV1NUUkMoTCJ9Iik7DQorICAgICAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSBsb2NhbGVWYWx1ZShYRkFfVlRfRkxPQVQsIHdzVmFsdWUsIHdzVGVzdFBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLCAoQ1hGQV9Mb2NhbGVNZ3IqKXBNZ3IpOw0KKyAgICAgICAgICAgIGlmIChsb2NhbGVWYWx1ZS5Jc1ZhbGlkKCkpIHsNCisgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldERvdWJsZShhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlVmFsdWUuR2V0RG91YmxlTnVtKCkpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICB3c1Rlc3RQYXR0ZXJuID0gRlhfV1NUUkMoTCJ0ZXh0eyIpICsgd3NQYXR0ZXJuOw0KKyAgICAgICAgICAgICAgd3NUZXN0UGF0dGVybiArPSBGWF9XU1RSQyhMIn0iKTsNCisgICAgICAgICAgICAgIENYRkFfTG9jYWxlVmFsdWUgbG9jYWxlVmFsdWUoWEZBX1ZUX1RFWFQsIHdzVmFsdWUsIHdzVGVzdFBhdHRlcm4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUsIChDWEZBX0xvY2FsZU1nciopcE1ncik7DQorICAgICAgICAgICAgICBpZiAobG9jYWxlVmFsdWUuSXNWYWxpZCgpKSB7DQorICAgICAgICAgICAgICAgIHN6UGFyc2VkVmFsdWUgPSBGWF9VVEY4RW5jb2RlKGxvY2FsZVZhbHVlLkdldFZhbHVlKCkpOw0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgc3pQYXJzZWRWYWx1ZSk7DQorICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgIiIpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBicmVhazsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1R3byk7DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiUGFyc2UiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6UmVwbGFjZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmICgoYXJnYyA9PSAyKSB8fCAoYXJnYyA9PSAzKSkgew0KKyAgICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdUaHJlZSA9IDA7DQorICAgIENGWF9CeXRlU3RyaW5nIG9uZVN0cmluZzsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgdHdvU3RyaW5nOw0KKyAgICBDRlhfQnl0ZVN0cmluZyB0aHJlZVN0cmluZzsNCisgICAgaWYgKChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ09uZSkpIHx8IChIVmFsdWVJc051bGwoaFRoaXMsIGFyZ1R3bykpKSB7DQorICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgfSBlbHNlIHsNCisgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCBvbmVTdHJpbmcpOw0KKyAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdUd28sIHR3b1N0cmluZyk7DQorICAgIH0NCisgICAgaWYgKGFyZ2MgPT0gMykgew0KKyAgICAgIGFyZ1RocmVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCisgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnVGhyZWUsIHRocmVlU3RyaW5nKTsNCisgICAgfQ0KKyAgICBpbnQzMl90IGlTcmNMZW4gPSBvbmVTdHJpbmcuR2V0TGVuZ3RoKCk7DQorICAgIGludDMyX3QgaUZpbmRMZW4gPSB0d29TdHJpbmcuR2V0TGVuZ3RoKCk7DQorICAgIENGWF9CeXRlVGV4dEJ1ZiByZXN1bHRTdHJpbmc7DQorICAgIGludDMyX3QgaUZpbmRJbmRleCA9IDA7DQorICAgIHVpbnQ4X3QgY2ggPSAwOw0KKyAgICBmb3IgKGludDMyX3QgdSA9IDA7IHUgPCBpU3JjTGVuOyArK3UpIHsNCisgICAgICBjaCA9IG9uZVN0cmluZy5HZXRBdCh1KTsNCisgICAgICBpZiAoY2ggPT0gdHdvU3RyaW5nLkdldEF0KGlGaW5kSW5kZXgpKSB7DQorICAgICAgICBpbnQzMl90IGlUZW1wID0gdSArIDE7DQorICAgICAgICArK2lGaW5kSW5kZXg7DQorICAgICAgICB1aW50OF90IGNoVGVtcCA9IDA7DQorICAgICAgICB3aGlsZSAoaUZpbmRJbmRleCA8IGlGaW5kTGVuKSB7DQorICAgICAgICAgIGNoVGVtcCA9IG9uZVN0cmluZy5HZXRBdChpVGVtcCk7DQorICAgICAgICAgIGlmIChjaFRlbXAgPT0gdHdvU3RyaW5nLkdldEF0KGlGaW5kSW5kZXgpKSB7DQorICAgICAgICAgICAgKytpVGVtcDsNCisgICAgICAgICAgICArK2lGaW5kSW5kZXg7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgaUZpbmRJbmRleCA9IDA7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChpRmluZEluZGV4ID09IGlGaW5kTGVuKSB7DQorICAgICAgICAgIHJlc3VsdFN0cmluZyA8PCB0aHJlZVN0cmluZzsNCisgICAgICAgICAgdSArPSBpRmluZExlbiAtIDE7DQorICAgICAgICAgIGlGaW5kSW5kZXggPSAwOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcmVzdWx0U3RyaW5nLkFwcGVuZENoYXIoY2gpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICByZXN1bHRTdHJpbmcuQXBwZW5kQ2hhcihjaCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHJlc3VsdFN0cmluZy5BcHBlbmRDaGFyKDApOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRTdHJpbmcuR2V0Qnl0ZVN0cmluZygpKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1R3byk7DQorICAgIGlmIChhcmdjID09IDMpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1RocmVlKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiUmVwbGFjZSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpSaWdodChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMikgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgIEZYX0JPT0wgYXJnSXNOdWxsID0gRkFMU0U7DQorICAgIGlmICgoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpKSB8fCAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdUd28pKSkgew0KKyAgICAgIGFyZ0lzTnVsbCA9IFRSVUU7DQorICAgIH0NCisgICAgaWYgKGFyZ0lzTnVsbCkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBzb3VyY2VTdHJpbmc7DQorICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgc291cmNlU3RyaW5nKTsNCisgICAgICBpbnQzMl90IGNvdW50ID0gSFZhbHVlVG9JbnRlZ2VyKGhUaGlzLCBhcmdUd28pOw0KKyAgICAgIGlmIChjb3VudCA8IDApIHsNCisgICAgICAgIGNvdW50ID0gMDsNCisgICAgICB9DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VTdHJpbmcuUmlnaHQoY291bnQpKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVHdvKTsNCisgIH0gZWxzZSB7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJSaWdodCIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpSdHJpbShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMSkgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnT25lKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBzb3VyY2VTdHJpbmc7DQorICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgc291cmNlU3RyaW5nKTsNCisgICAgICBzb3VyY2VTdHJpbmcuVHJpbVJpZ2h0KCk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIHNvdXJjZVN0cmluZyk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIlJ0cmltIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlNwYWNlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAxKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ09uZSkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgaW50MzJfdCBjb3VudCA9IDA7DQorICAgICAgY291bnQgPSBIVmFsdWVUb0ludGVnZXIoaFRoaXMsIGFyZ09uZSk7DQorICAgICAgY291bnQgPSAoY291bnQgPCAwKSA/IDAgOiBjb3VudDsNCisgICAgICBDRlhfQnl0ZVRleHRCdWYgc3BhY2VTdHJpbmc7DQorICAgICAgaW50MzJfdCBpbmRleCA9IDA7DQorICAgICAgd2hpbGUgKGluZGV4IDwgY291bnQpIHsNCisgICAgICAgIHNwYWNlU3RyaW5nLkFwcGVuZEJ5dGUoJyAnKTsNCisgICAgICAgIGluZGV4Kys7DQorICAgICAgfQ0KKyAgICAgIHNwYWNlU3RyaW5nLkFwcGVuZEJ5dGUoMCk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZVN0cmluZy5HZXRCeXRlU3RyaW5nKCkpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgIH0gZWxzZSB7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJTcGFjZSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpTdHIoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgaWYgKChhcmdjID4gMCkgJiYgKGFyZ2MgPCA0KSkgew0KKyAgICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KKyAgICBGWF9GTE9BVCBmTnVtYmVyOw0KKyAgICBpbnQzMl90IGlXaWR0aCA9IDEwOw0KKyAgICBpbnQzMl90IGlQcmVjaXNpb24gPSAwOw0KKyAgICBGWEpTRV9IVkFMVUUgbnVtYmVyVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgd2lkdGhWYWx1ZSA9IDA7DQorICAgIEZYSlNFX0hWQUxVRSBwcmVjaXNpb25WYWx1ZSA9IDA7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwobnVtYmVyVmFsdWUpKSB7DQorICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgfSBlbHNlIHsNCisgICAgICBmTnVtYmVyID0gSFZhbHVlVG9GbG9hdChoVGhpcywgbnVtYmVyVmFsdWUpOw0KKyAgICB9DQorICAgIGlmIChhcmdjID4gMSkgew0KKyAgICAgIHdpZHRoVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICAgIGlXaWR0aCA9IChpbnQzMl90KUhWYWx1ZVRvRmxvYXQoaFRoaXMsIHdpZHRoVmFsdWUpOw0KKyAgICB9DQorICAgIGlmIChhcmdjID09IDMpIHsNCisgICAgICBwcmVjaXNpb25WYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQorICAgICAgaVByZWNpc2lvbiA9IChpbnQzMl90KUhWYWx1ZVRvRmxvYXQoaFRoaXMsIHByZWNpc2lvblZhbHVlKTsNCisgICAgICBpZiAoaVByZWNpc2lvbiA8IDApIHsNCisgICAgICAgIGlQcmVjaXNpb24gPSAwOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoIWJGbGFncykgew0KKyAgICAgIENGWF9CeXRlU3RyaW5nIG51bWJlclN0cmluZzsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBmb3JtYXRTdHIgPSAiJSI7DQorICAgICAgaWYgKGlQcmVjaXNpb24pIHsNCisgICAgICAgIGZvcm1hdFN0ciArPSAiLiI7DQorICAgICAgICBmb3JtYXRTdHIgKz0gQ0ZYX0J5dGVTdHJpbmc6OkZvcm1hdEludGVnZXIoaVByZWNpc2lvbik7DQorICAgICAgfQ0KKyAgICAgIGZvcm1hdFN0ciArPSAiZiI7DQorICAgICAgbnVtYmVyU3RyaW5nLkZvcm1hdChmb3JtYXRTdHIsIGZOdW1iZXIpOw0KKyAgICAgIGNvbnN0IEZYX0NIQVIqIHBEYXRhID0gbnVtYmVyU3RyaW5nOw0KKyAgICAgIGludDMyX3QgaUxlbmd0aCA9IG51bWJlclN0cmluZy5HZXRMZW5ndGgoKTsNCisgICAgICBpbnQzMl90IHUgPSAwOw0KKyAgICAgIHdoaWxlICh1IDwgaUxlbmd0aCkgew0KKyAgICAgICAgaWYgKCoocERhdGEgKyB1KSA9PSAnLicpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICArK3U7DQorICAgICAgfQ0KKyAgICAgIENGWF9CeXRlVGV4dEJ1ZiByZXN1bHRCdWY7DQorICAgICAgaWYgKHUgPiBpV2lkdGggfHwgKGlQcmVjaXNpb24gKyB1KSA+PSBpV2lkdGgpIHsNCisgICAgICAgIGludDMyX3QgaSA9IDA7DQorICAgICAgICB3aGlsZSAoaSA8IGlXaWR0aCkgew0KKyAgICAgICAgICByZXN1bHRCdWYuQXBwZW5kQ2hhcignKicpOw0KKyAgICAgICAgICArK2k7DQorICAgICAgICB9DQorICAgICAgICByZXN1bHRCdWYuQXBwZW5kQ2hhcigwKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKHUgPT0gaUxlbmd0aCkgew0KKyAgICAgICAgICBpZiAoaUxlbmd0aCA+IGlXaWR0aCkgew0KKyAgICAgICAgICAgIGludDMyX3QgaSA9IDA7DQorICAgICAgICAgICAgd2hpbGUgKGkgPCBpV2lkdGgpIHsNCisgICAgICAgICAgICAgIHJlc3VsdEJ1Zi5BcHBlbmRDaGFyKCcqJyk7DQorICAgICAgICAgICAgICArK2k7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGludDMyX3QgaSA9IDA7DQorICAgICAgICAgICAgaW50MzJfdCBpU3BhY2UgPSBpV2lkdGggLSBpTGVuZ3RoOw0KKyAgICAgICAgICAgIHdoaWxlIChpIDwgaVNwYWNlKSB7DQorICAgICAgICAgICAgICByZXN1bHRCdWYuQXBwZW5kQ2hhcignICcpOw0KKyAgICAgICAgICAgICAgKytpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXN1bHRCdWYgPDwgcERhdGE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGludDMyX3QgaUxlYXZpbmdTcGFjZSA9IDA7DQorICAgICAgICAgIGlmIChpUHJlY2lzaW9uID09IDApIHsNCisgICAgICAgICAgICBpTGVhdmluZ1NwYWNlID0gaVdpZHRoIC0gKHUgKyBpUHJlY2lzaW9uKTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpTGVhdmluZ1NwYWNlID0gaVdpZHRoIC0gKHUgKyBpUHJlY2lzaW9uICsgMSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaW50MzJfdCBpID0gMDsNCisgICAgICAgICAgd2hpbGUgKGkgPCBpTGVhdmluZ1NwYWNlKSB7DQorICAgICAgICAgICAgcmVzdWx0QnVmLkFwcGVuZENoYXIoJyAnKTsNCisgICAgICAgICAgICArK2k7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaSA9IDA7DQorICAgICAgICAgIHdoaWxlIChpIDwgdSkgew0KKyAgICAgICAgICAgIHJlc3VsdEJ1Zi5BcHBlbmRDaGFyKCoocERhdGEgKyBpKSk7DQorICAgICAgICAgICAgKytpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChpUHJlY2lzaW9uICE9IDApIHsNCisgICAgICAgICAgICByZXN1bHRCdWYuQXBwZW5kQ2hhcignLicpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHUrKzsNCisgICAgICAgICAgaSA9IDA7DQorICAgICAgICAgIHdoaWxlICh1IDwgaUxlbmd0aCkgew0KKyAgICAgICAgICAgIGlmIChpID49IGlQcmVjaXNpb24pIHsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXN1bHRCdWYuQXBwZW5kQ2hhcigqKHBEYXRhICsgdSkpOw0KKyAgICAgICAgICAgICsraTsNCisgICAgICAgICAgICArK3U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgd2hpbGUgKGkgPCBpUHJlY2lzaW9uKSB7DQorICAgICAgICAgICAgcmVzdWx0QnVmLkFwcGVuZENoYXIoJzAnKTsNCisgICAgICAgICAgICArK2k7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcmVzdWx0QnVmLkFwcGVuZENoYXIoMCk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0QnVmLkdldEJ5dGVTdHJpbmcoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobnVtYmVyVmFsdWUpOw0KKyAgICBpZiAoYXJnYyA+IDEpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHdpZHRoVmFsdWUpOw0KKyAgICAgIGlmIChhcmdjID09IDMpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJlY2lzaW9uVmFsdWUpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiU3RyIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlN0dWZmKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoKGFyZ2MgPT0gMykgfHwgKGFyZ2MgPT0gNCkpIHsNCisgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgc291cmNlU3RyaW5nOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBpbnNlcnRTdHJpbmc7DQorICAgIGludDMyX3QgaUxlbmd0aCA9IDA7DQorICAgIGludDMyX3QgaVN0YXJ0ID0gMDsNCisgICAgaW50MzJfdCBpRGVsZXRlID0gMDsNCisgICAgRlhKU0VfSFZBTFVFIHNvdXJjZVZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgRlhKU0VfSFZBTFVFIHN0YXJ0VmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICBGWEpTRV9IVkFMVUUgZGVsZXRlVmFsdWUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDIpOw0KKyAgICBGWEpTRV9IVkFMVUUgaW5zZXJ0VmFsdWUgPSAwOw0KKyAgICBpZiAoKEZYSlNFX1ZhbHVlX0lzTnVsbChzb3VyY2VWYWx1ZSkpIHx8IChGWEpTRV9WYWx1ZV9Jc051bGwoc3RhcnRWYWx1ZSkpIHx8DQorICAgICAgICAoRlhKU0VfVmFsdWVfSXNOdWxsKGRlbGV0ZVZhbHVlKSkpIHsNCisgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhzb3VyY2VWYWx1ZSwgc291cmNlU3RyaW5nKTsNCisgICAgICBpTGVuZ3RoID0gc291cmNlU3RyaW5nLkdldExlbmd0aCgpOw0KKyAgICAgIGlTdGFydCA9IChpbnQzMl90KUhWYWx1ZVRvRmxvYXQoaFRoaXMsIHN0YXJ0VmFsdWUpOw0KKyAgICAgIGlmIChpU3RhcnQgPCAxKSB7DQorICAgICAgICBpU3RhcnQgPSAxOw0KKyAgICAgIH0NCisgICAgICBpZiAoaVN0YXJ0ID4gaUxlbmd0aCkgew0KKyAgICAgICAgaVN0YXJ0ID0gaUxlbmd0aDsNCisgICAgICB9DQorICAgICAgaURlbGV0ZSA9IChpbnQzMl90KUhWYWx1ZVRvRmxvYXQoaFRoaXMsIGRlbGV0ZVZhbHVlKTsNCisgICAgICBpZiAoaURlbGV0ZSA8PSAwKSB7DQorICAgICAgICBpRGVsZXRlID0gMDsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGFyZ2MgPT0gNCkgew0KKyAgICAgIGluc2VydFZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAzKTsNCisgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoaW5zZXJ0VmFsdWUsIGluc2VydFN0cmluZyk7DQorICAgIH0NCisgICAgaVN0YXJ0IC09IDE7DQorICAgIENGWF9CeXRlVGV4dEJ1ZiByZXN1bHRTdHJpbmc7DQorICAgIGludDMyX3QgaSA9IDA7DQorICAgIHdoaWxlIChpIDwgaVN0YXJ0KSB7DQorICAgICAgcmVzdWx0U3RyaW5nLkFwcGVuZENoYXIoc291cmNlU3RyaW5nLkdldEF0KGkpKTsNCisgICAgICArK2k7DQorICAgIH0NCisgICAgcmVzdWx0U3RyaW5nIDw8IGluc2VydFN0cmluZzsNCisgICAgaSA9IGlTdGFydCArIGlEZWxldGU7DQorICAgIHdoaWxlIChpIDwgaUxlbmd0aCkgew0KKyAgICAgIHJlc3VsdFN0cmluZy5BcHBlbmRDaGFyKHNvdXJjZVN0cmluZy5HZXRBdChpKSk7DQorICAgICAgKytpOw0KKyAgICB9DQorICAgIHJlc3VsdFN0cmluZy5BcHBlbmRDaGFyKDApOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRTdHJpbmcuR2V0Qnl0ZVN0cmluZygpKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShzb3VyY2VWYWx1ZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2Uoc3RhcnRWYWx1ZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoZGVsZXRlVmFsdWUpOw0KKyAgICBpZiAoYXJnYyA9PSA0KSB7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShpbnNlcnRWYWx1ZSk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIlN0dWZmIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlN1YnN0cihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAzKSB7DQorICAgIEZYSlNFX0hWQUxVRSBzdHJpbmdWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEZYSlNFX0hWQUxVRSBzdGFydFZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgRlhKU0VfSFZBTFVFIGVuZFZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCisgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgc3RyaW5nVmFsdWUpIHx8IChIVmFsdWVJc051bGwoaFRoaXMsIHN0YXJ0VmFsdWUpKSB8fA0KKyAgICAgICAgKEhWYWx1ZUlzTnVsbChoVGhpcywgZW5kVmFsdWUpKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBzelNvdXJjZVN0cjsNCisgICAgICBpbnQzMl90IGlTdGFydCA9IDA7DQorICAgICAgaW50MzJfdCBpQ291bnQgPSAwOw0KKyAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhzdHJpbmdWYWx1ZSwgc3pTb3VyY2VTdHIpOw0KKyAgICAgIGludDMyX3QgaUxlbmd0aCA9IHN6U291cmNlU3RyLkdldExlbmd0aCgpOw0KKyAgICAgIGlmIChpTGVuZ3RoID09IDApIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAiIik7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlTdGFydCA9IChpbnQzMl90KUhWYWx1ZVRvRmxvYXQoaFRoaXMsIHN0YXJ0VmFsdWUpOw0KKyAgICAgICAgaUNvdW50ID0gKGludDMyX3QpSFZhbHVlVG9GbG9hdChoVGhpcywgZW5kVmFsdWUpOw0KKyAgICAgICAgaWYgKGlTdGFydCA8IDEpIHsNCisgICAgICAgICAgaVN0YXJ0ID0gMTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChpU3RhcnQgPiBpTGVuZ3RoKSB7DQorICAgICAgICAgIGlTdGFydCA9IGlMZW5ndGg7DQorICAgICAgICB9DQorICAgICAgICBpZiAoaUNvdW50IDw9IDApIHsNCisgICAgICAgICAgaUNvdW50ID0gMDsNCisgICAgICAgIH0NCisgICAgICAgIGlTdGFydCAtPSAxOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6U291cmNlU3RyLk1pZChpU3RhcnQsIGlDb3VudCkpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHN0cmluZ1ZhbHVlKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShzdGFydFZhbHVlKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShlbmRWYWx1ZSk7DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJTdWJzdHIiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6VXVpZChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmICgoYXJnYyA9PSAwKSB8fCAoYXJnYyA9PSAxKSkgew0KKyAgICBpbnQzMl90IGlOdW0gPSAwOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gMDsNCisgICAgaWYgKGFyZ2MgPT0gMSkgew0KKyAgICAgIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgaU51bSA9IChpbnQzMl90KUhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ09uZSk7DQorICAgIH0NCisgICAgRlhfR1VJRCBndWlkOw0KKyAgICBGWF9HVUlEX0NyZWF0ZVY0KCZndWlkKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNVSWQ7DQorICAgIEZYX0dVSURfVG9TdHJpbmcoJmd1aWQsIGJzVUlkLCBpTnVtKTsNCisgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksIGJzVUlkKTsNCisgICAgaWYgKGFyZ2MgPT0gMSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiVXVpZCIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpVcHBlcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgaWYgKChhcmdjID4gMCkgJiYgKGFyZ2MgPCAzKSkgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBhcmdTdHJpbmc7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgbG9jYWxlVmFsdWUgPSAwOw0KKyAgICBpZiAoSFZhbHVlSXNOdWxsKGhUaGlzLCBhcmdPbmUpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChhcmdjID09IDIpIHsNCisgICAgICAgIGxvY2FsZVZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICB9DQorICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgYXJnU3RyaW5nKTsNCisgICAgICBDRlhfV2lkZVRleHRCdWYgdXBwZXJTdHJpbmdCdWY7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NBcmdTdHJpbmcgPQ0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYXJnU3RyaW5nLCBhcmdTdHJpbmcuR2V0TGVuZ3RoKCkpOw0KKyAgICAgIGNvbnN0IEZYX1dDSEFSKiBwRGF0YSA9IHdzQXJnU3RyaW5nOw0KKyAgICAgIGludDMyX3QgaUxlbiA9IHdzQXJnU3RyaW5nLkdldExlbmd0aCgpOw0KKyAgICAgIGludDMyX3QgaSA9IDA7DQorICAgICAgaW50MzJfdCBjaCA9IDA7DQorICAgICAgd2hpbGUgKGkgPCBpTGVuKSB7DQorICAgICAgICBjaCA9ICoocERhdGEgKyBpKTsNCisgICAgICAgIGlmIChjaCA+PSAweDYxICYmIGNoIDw9IDB4N0EpIHsNCisgICAgICAgICAgY2ggLT0gMzI7DQorICAgICAgICB9IGVsc2UgaWYgKGNoID49IDB4RTAgJiYgY2ggPD0gMHhGRSkgew0KKyAgICAgICAgICBjaCAtPSAzMjsNCisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gMHgxMDEgfHwgY2ggPT0gMHgxMDMgfHwgY2ggPT0gMHgxMDUpIHsNCisgICAgICAgICAgY2ggLT0gMTsNCisgICAgICAgIH0NCisgICAgICAgIHVwcGVyU3RyaW5nQnVmLkFwcGVuZENoYXIoY2gpOw0KKyAgICAgICAgKytpOw0KKyAgICAgIH0NCisgICAgICB1cHBlclN0cmluZ0J1Zi5BcHBlbmRDaGFyKDApOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVVRGOEVuY29kZSh1cHBlclN0cmluZ0J1Zi5HZXRCdWZmZXIoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJTdHJpbmdCdWYuR2V0TGVuZ3RoKCkpKTsNCisgICAgICBpZiAoYXJnYyA9PSAyKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxvY2FsZVZhbHVlKTsNCisgICAgICB9DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiVXBwZXIiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6V29yZE51bShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmICgoYXJnYyA+IDApICYmIChhcmdjIDwgNCkpIHsNCisgICAgRlhfQk9PTCBiRmxhZ3MgPSBGQUxTRTsNCisgICAgRlhfRkxPQVQgZk51bWJlcjsNCisgICAgaW50MzJfdCBpSWRlbnRpZmllciA9IDA7DQorICAgIENGWF9CeXRlU3RyaW5nIGxvY2FsZVN0cmluZzsNCisgICAgRlhKU0VfSFZBTFVFIG51bWJlclZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgRlhKU0VfSFZBTFVFIGlkZW50aWZpZXJWYWx1ZSA9IDA7DQorICAgIEZYSlNFX0hWQUxVRSBsb2NhbGVWYWx1ZSA9IDA7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwobnVtYmVyVmFsdWUpKSB7DQorICAgICAgYkZsYWdzID0gVFJVRTsNCisgICAgfSBlbHNlIHsNCisgICAgICBmTnVtYmVyID0gSFZhbHVlVG9GbG9hdChoVGhpcywgbnVtYmVyVmFsdWUpOw0KKyAgICB9DQorICAgIGlmIChhcmdjID4gMSkgew0KKyAgICAgIGlkZW50aWZpZXJWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChpZGVudGlmaWVyVmFsdWUpKSB7DQorICAgICAgICBiRmxhZ3MgPSBUUlVFOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpSWRlbnRpZmllciA9IChpbnQzMl90KUhWYWx1ZVRvRmxvYXQoaFRoaXMsIGlkZW50aWZpZXJWYWx1ZSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChhcmdjID09IDMpIHsNCisgICAgICBsb2NhbGVWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQorICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChsb2NhbGVWYWx1ZSkpIHsNCisgICAgICAgIGJGbGFncyA9IFRSVUU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhsb2NhbGVWYWx1ZSwgbG9jYWxlU3RyaW5nKTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFiRmxhZ3MpIHsNCisgICAgICBpZiAoKGZOdW1iZXIgPCAwKSB8fCAoZk51bWJlciA+IDkyMjMzNzIwMzY4NTQ3NzU1MCkpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAiKiIpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfQnl0ZVRleHRCdWYgcmVzdWx0QnVmOw0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbnVtYmVyU3RyaW5nOw0KKyAgICAgICAgbnVtYmVyU3RyaW5nLkZvcm1hdCgiJS4yZiIsIGZOdW1iZXIpOw0KKyAgICAgICAgV29yZFVTKG51bWJlclN0cmluZywgaUlkZW50aWZpZXIsIHJlc3VsdEJ1Zik7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0QnVmLkdldEJ5dGVTdHJpbmcoKSk7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG51bWJlclZhbHVlKTsNCisgICAgaWYgKGFyZ2MgPiAxKSB7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShpZGVudGlmaWVyVmFsdWUpOw0KKyAgICAgIGlmIChhcmdjID09IDMpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobG9jYWxlVmFsdWUpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiV29yZE51bSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpUcmlsbGlvblVTKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmJiBzdHJCdWYpIHsNCisgIENGWF9CeXRlU3RyaW5nQyBwVW5pdHNbXSA9IHsiemVybyIsICJvbmUiLCAidHdvIiwgICAidGhyZWUiLCAiZm91ciIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUifTsNCisgIENGWF9CeXRlU3RyaW5nQyBwQ2FwVW5pdHNbXSA9IHsiWmVybyIsICJPbmUiLCAiVHdvIiwgICAiVGhyZWUiLCAiRm91ciIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpdmUiLCAiU2l4IiwgIlNldmVuIiwgIkVpZ2h0IiwgIk5pbmUifTsNCisgIENGWF9CeXRlU3RyaW5nQyBwVGVuc1tdID0geyJUZW4iLCAgICAgICJFbGV2ZW4iLCAgIlR3ZWx2ZSIsICAiVGhpcnRlZW4iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvdXJ0ZWVuIiwgIkZpZnRlZW4iLCAiU2l4dGVlbiIsICJTZXZlbnRlZW4iLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVpZ2h0ZWVuIiwgIk5pbmV0ZWVuIn07DQorICBDRlhfQnl0ZVN0cmluZ0MgcExhc3RUZW5zW10gPSB7IlR3ZW50eSIsICJUaGlydHkiLCAgIkZvcnR5IiwgICJGaWZ0eSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNpeHR5IiwgICJTZXZlbnR5IiwgIkVpZ2h0eSIsICJOaW5ldHkifTsNCisgIENGWF9CeXRlU3RyaW5nQyBwQ29tbVtdID0geyIgSHVuZHJlZCAiLCAiIFRob3VzYW5kICIsICIgTWlsbGlvbiAiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBCaWxsaW9uICIsICJUcmlsbGlvbiJ9Ow0KKyAgaW50MzJfdCBpQ29tbSA9IDA7DQorICBjb25zdCBGWF9DSEFSKiBwRGF0YSA9IHN6RGF0YS5HZXRDU3RyKCk7DQorICBpbnQzMl90IGlMZW5ndGggPSBzekRhdGEuR2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCA+IDEyKSB7DQorICAgIGlDb21tID0gNDsNCisgIH0gZWxzZSBpZiAoaUxlbmd0aCA+IDkpIHsNCisgICAgaUNvbW0gPSAzOw0KKyAgfSBlbHNlIGlmIChpTGVuZ3RoID4gNikgew0KKyAgICBpQ29tbSA9IDI7DQorICB9IGVsc2UgaWYgKGlMZW5ndGggPiAzKSB7DQorICAgIGlDb21tID0gMTsNCisgIH0NCisgIGludDMyX3QgaUluZGV4ID0gMDsNCisgIGludDMyX3QgaUZpcnN0Q291bnQgPSBpTGVuZ3RoICUgMzsNCisgIGlmIChpRmlyc3RDb3VudCA9PSAwKSB7DQorICAgIGlGaXJzdENvdW50ID0gMzsNCisgIH0NCisgIGlmIChpRmlyc3RDb3VudCA9PSAzKSB7DQorICAgIGlmICgqKHBEYXRhICsgaUluZGV4KSAhPSAnMCcpIHsNCisgICAgICBzdHJCdWYgPDwgcENhcFVuaXRzWyoocERhdGEgKyBpSW5kZXgpIC0gJzAnXTsNCisgICAgICBzdHJCdWYgPDwgcENvbW1bMF07DQorICAgIH0NCisgICAgaWYgKCoocERhdGEgKyBpSW5kZXggKyAxKSA9PSAnMCcpIHsNCisgICAgICBzdHJCdWYgPDwgcENhcFVuaXRzWyoocERhdGEgKyBpSW5kZXggKyAyKSAtICcwJ107DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKCoocERhdGEgKyBpSW5kZXggKyAxKSA+ICcxJykgew0KKyAgICAgICAgc3RyQnVmIDw8IHBMYXN0VGVuc1sqKHBEYXRhICsgaUluZGV4ICsgMSkgLSAnMiddOw0KKyAgICAgICAgc3RyQnVmIDw8ICItIjsNCisgICAgICAgIHN0ckJ1ZiA8PCBwVW5pdHNbKihwRGF0YSArIGlJbmRleCArIDIpIC0gJzAnXTsNCisgICAgICB9IGVsc2UgaWYgKCoocERhdGEgKyBpSW5kZXggKyAxKSA9PSAnMScpIHsNCisgICAgICAgIHN0ckJ1ZiA8PCBwVGVuc1sqKHBEYXRhICsgaUluZGV4ICsgMikgLSAnMCddOw0KKyAgICAgIH0gZWxzZSBpZiAoKihwRGF0YSArIGlJbmRleCArIDEpID09ICcwJykgew0KKyAgICAgICAgc3RyQnVmIDw8IHBDYXBVbml0c1sqKHBEYXRhICsgaUluZGV4ICsgMikgLSAnMCddOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpSW5kZXggKz0gMzsNCisgIH0gZWxzZSBpZiAoaUZpcnN0Q291bnQgPT0gMikgew0KKyAgICBpZiAoKihwRGF0YSArIGlJbmRleCkgPT0gJzAnKSB7DQorICAgICAgc3RyQnVmIDw8IHBDYXBVbml0c1sqKHBEYXRhICsgaUluZGV4ICsgMSkgLSAnMCddOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmICgqKHBEYXRhICsgaUluZGV4KSA+ICcxJykgew0KKyAgICAgICAgc3RyQnVmIDw8IHBMYXN0VGVuc1sqKHBEYXRhICsgaUluZGV4KSAtICcyJ107DQorICAgICAgICBzdHJCdWYgPDwgIi0iOw0KKyAgICAgICAgc3RyQnVmIDw8IHBVbml0c1sqKHBEYXRhICsgaUluZGV4ICsgMSkgLSAnMCddOw0KKyAgICAgIH0gZWxzZSBpZiAoKihwRGF0YSArIGlJbmRleCkgPT0gJzEnKSB7DQorICAgICAgICBzdHJCdWYgPDwgcFRlbnNbKihwRGF0YSArIGlJbmRleCArIDEpIC0gJzAnXTsNCisgICAgICB9IGVsc2UgaWYgKCoocERhdGEgKyBpSW5kZXgpID09ICcwJykgew0KKyAgICAgICAgc3RyQnVmIDw8IHBDYXBVbml0c1sqKHBEYXRhICsgaUluZGV4ICsgMSkgLSAnMCddOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpSW5kZXggKz0gMjsNCisgIH0gZWxzZSBpZiAoaUZpcnN0Q291bnQgPT0gMSkgew0KKyAgICBzdHJCdWYgPDwgcENhcFVuaXRzWyoocERhdGEgKyBpSW5kZXgpIC0gJzAnXTsNCisgICAgaUluZGV4ICs9IDE7DQorICB9DQorICBpZiAoaUxlbmd0aCA+IDMgJiYgaUZpcnN0Q291bnQgPiAwKSB7DQorICAgIHN0ckJ1ZiA8PCBwQ29tbVtpQ29tbV07DQorICAgIC0taUNvbW07DQorICB9DQorICB3aGlsZSAoaUluZGV4IDwgaUxlbmd0aCkgew0KKyAgICBpZiAoKihwRGF0YSArIGlJbmRleCkgIT0gJzAnKSB7DQorICAgICAgc3RyQnVmIDw8IHBDYXBVbml0c1sqKHBEYXRhICsgaUluZGV4KSAtICcwJ107DQorICAgICAgc3RyQnVmIDw8IHBDb21tWzBdOw0KKyAgICB9DQorICAgIGlmICgqKHBEYXRhICsgaUluZGV4ICsgMSkgPT0gJzAnKSB7DQorICAgICAgc3RyQnVmIDw8IHBDYXBVbml0c1sqKHBEYXRhICsgaUluZGV4ICsgMikgLSAnMCddOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmICgqKHBEYXRhICsgaUluZGV4ICsgMSkgPiAnMScpIHsNCisgICAgICAgIHN0ckJ1ZiA8PCBwTGFzdFRlbnNbKihwRGF0YSArIGlJbmRleCArIDEpIC0gJzInXTsNCisgICAgICAgIHN0ckJ1ZiA8PCAiLSI7DQorICAgICAgICBzdHJCdWYgPDwgcFVuaXRzWyoocERhdGEgKyBpSW5kZXggKyAyKSAtICcwJ107DQorICAgICAgfSBlbHNlIGlmICgqKHBEYXRhICsgaUluZGV4ICsgMSkgPT0gJzEnKSB7DQorICAgICAgICBzdHJCdWYgPDwgcFRlbnNbKihwRGF0YSArIGlJbmRleCArIDIpIC0gJzAnXTsNCisgICAgICB9IGVsc2UgaWYgKCoocERhdGEgKyBpSW5kZXggKyAxKSA9PSAnMCcpIHsNCisgICAgICAgIHN0ckJ1ZiA8PCBwQ2FwVW5pdHNbKihwRGF0YSArIGlJbmRleCArIDIpIC0gJzAnXTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGlJbmRleCA8IGlMZW5ndGggLSAzKSB7DQorICAgICAgc3RyQnVmIDw8IHBDb21tW2lDb21tXTsNCisgICAgICAtLWlDb21tOw0KKyAgICB9DQorICAgIGlJbmRleCArPSAzOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpXb3JkVVMoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekRhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVRleHRCdWYmIHN0ckJ1Zikgew0KKyAgY29uc3QgRlhfQ0hBUiogcERhdGEgPSBzekRhdGEuR2V0Q1N0cigpOw0KKyAgaW50MzJfdCBpTGVuZ3RoID0gc3pEYXRhLkdldExlbmd0aCgpOw0KKyAgc3dpdGNoIChpU3R5bGUpIHsNCisgICAgY2FzZSAwOiB7DQorICAgICAgaW50MzJfdCBpSW5kZXggPSAwOw0KKyAgICAgIHdoaWxlIChpSW5kZXggPCBpTGVuZ3RoKSB7DQorICAgICAgICBpZiAoKihwRGF0YSArIGlJbmRleCkgPT0gJy4nKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgKytpSW5kZXg7DQorICAgICAgfQ0KKyAgICAgIGlMZW5ndGggPSBpSW5kZXg7DQorICAgICAgaUluZGV4ID0gMDsNCisgICAgICBpbnQzMl90IGlDb3VudCA9IDA7DQorICAgICAgd2hpbGUgKGlJbmRleCA8IGlMZW5ndGgpIHsNCisgICAgICAgIGlDb3VudCA9IChpTGVuZ3RoIC0gaUluZGV4KSAlIDEyOw0KKyAgICAgICAgaWYgKCFpQ291bnQgJiYgaUxlbmd0aCAtIGlJbmRleCA+IDApIHsNCisgICAgICAgICAgaUNvdW50ID0gMTI7DQorICAgICAgICB9DQorICAgICAgICBUcmlsbGlvblVTKENGWF9CeXRlU3RyaW5nQyhwRGF0YSArIGlJbmRleCwgaUNvdW50KSwgc3RyQnVmKTsNCisgICAgICAgIGlJbmRleCArPSBpQ291bnQ7DQorICAgICAgICBpZiAoaUluZGV4IDwgaUxlbmd0aCkgew0KKyAgICAgICAgICBzdHJCdWYgPDwgIiBUcmlsbGlvbiAiOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSAxOiB7DQorICAgICAgaW50MzJfdCBpSW5kZXggPSAwOw0KKyAgICAgIHdoaWxlIChpSW5kZXggPCBpTGVuZ3RoKSB7DQorICAgICAgICBpZiAoKihwRGF0YSArIGlJbmRleCkgPT0gJy4nKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgKytpSW5kZXg7DQorICAgICAgfQ0KKyAgICAgIGlMZW5ndGggPSBpSW5kZXg7DQorICAgICAgaUluZGV4ID0gMDsNCisgICAgICBpbnQzMl90IGlDb3VudCA9IDA7DQorICAgICAgd2hpbGUgKGlJbmRleCA8IGlMZW5ndGgpIHsNCisgICAgICAgIGlDb3VudCA9IChpTGVuZ3RoIC0gaUluZGV4KSAlIDEyOw0KKyAgICAgICAgaWYgKCFpQ291bnQgJiYgaUxlbmd0aCAtIGlJbmRleCA+IDApIHsNCisgICAgICAgICAgaUNvdW50ID0gMTI7DQorICAgICAgICB9DQorICAgICAgICBUcmlsbGlvblVTKENGWF9CeXRlU3RyaW5nQyhwRGF0YSArIGlJbmRleCwgaUNvdW50KSwgc3RyQnVmKTsNCisgICAgICAgIGlJbmRleCArPSBpQ291bnQ7DQorICAgICAgICBpZiAoaUluZGV4IDwgaUxlbmd0aCkgew0KKyAgICAgICAgICBzdHJCdWYgPDwgIiBUcmlsbGlvbiAiOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBzdHJCdWYgPDwgIiBEb2xsYXJzIjsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSAyOiB7DQorICAgICAgaW50MzJfdCBpSW5kZXggPSAwOw0KKyAgICAgIHdoaWxlIChpSW5kZXggPCBpTGVuZ3RoKSB7DQorICAgICAgICBpZiAoKihwRGF0YSArIGlJbmRleCkgPT0gJy4nKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgKytpSW5kZXg7DQorICAgICAgfQ0KKyAgICAgIGludDMyX3QgaUludGVnZXIgPSBpSW5kZXg7DQorICAgICAgaUluZGV4ID0gMDsNCisgICAgICBpbnQzMl90IGlDb3VudCA9IDA7DQorICAgICAgd2hpbGUgKGlJbmRleCA8IGlJbnRlZ2VyKSB7DQorICAgICAgICBpQ291bnQgPSAoaUludGVnZXIgLSBpSW5kZXgpICUgMTI7DQorICAgICAgICBpZiAoIWlDb3VudCAmJiBpTGVuZ3RoIC0gaUluZGV4ID4gMCkgew0KKyAgICAgICAgICBpQ291bnQgPSAxMjsNCisgICAgICAgIH0NCisgICAgICAgIFRyaWxsaW9uVVMoQ0ZYX0J5dGVTdHJpbmdDKHBEYXRhICsgaUluZGV4LCBpQ291bnQpLCBzdHJCdWYpOw0KKyAgICAgICAgaUluZGV4ICs9IGlDb3VudDsNCisgICAgICAgIGlmIChpSW5kZXggPCBpSW50ZWdlcikgew0KKyAgICAgICAgICBzdHJCdWYgPDwgIiBUcmlsbGlvbiAiOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBzdHJCdWYgPDwgIiBEb2xsYXJzIjsNCisgICAgICBpZiAoaUludGVnZXIgPCBpTGVuZ3RoKSB7DQorICAgICAgICBzdHJCdWYgPDwgIiBBbmQgIjsNCisgICAgICAgIGlJbmRleCA9IGlJbnRlZ2VyICsgMTsNCisgICAgICAgIGludDMyX3QgaUNvdW50ID0gMDsNCisgICAgICAgIHdoaWxlIChpSW5kZXggPCBpTGVuZ3RoKSB7DQorICAgICAgICAgIGlDb3VudCA9IChpTGVuZ3RoIC0gaUluZGV4KSAlIDEyOw0KKyAgICAgICAgICBpZiAoIWlDb3VudCAmJiBpTGVuZ3RoIC0gaUluZGV4ID4gMCkgew0KKyAgICAgICAgICAgIGlDb3VudCA9IDEyOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIFRyaWxsaW9uVVMoQ0ZYX0J5dGVTdHJpbmdDKHBEYXRhICsgaUluZGV4LCBpQ291bnQpLCBzdHJCdWYpOw0KKyAgICAgICAgICBpSW5kZXggKz0gaUNvdW50Ow0KKyAgICAgICAgICBpZiAoaUluZGV4IDwgaUxlbmd0aCkgew0KKyAgICAgICAgICAgIHN0ckJ1ZiA8PCAiIFRyaWxsaW9uICI7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHN0ckJ1ZiA8PCAiIENlbnRzIjsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkdldChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMSkgew0KKyAgICBDWEZBX0RvY3VtZW50KiBwRG9jID0gcENvbnRleHQtPkdldERvY3VtZW50KCk7DQorICAgIGlmICghcERvYykgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPQ0KKyAgICAgICAgcERvYy0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpLT5HZXRBcHBQcm92aWRlcigpOw0KKyAgICBpZiAoIXBBcHBQcm92aWRlcikgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgdXJsU3RyaW5nOw0KKyAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCB1cmxTdHJpbmcpOw0KKyAgICBJRlhfRmlsZVJlYWQqIHBGaWxlID0gcEFwcFByb3ZpZGVyLT5Eb3dubG9hZFVSTCgNCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOCh1cmxTdHJpbmcsIHVybFN0cmluZy5HZXRMZW5ndGgoKSkpOw0KKyAgICBpZiAocEZpbGUpIHsNCisgICAgICBpbnQzMl90IHNpemUgPSBwRmlsZS0+R2V0U2l6ZSgpOw0KKyAgICAgIHVpbnQ4X3QqIHBEYXRhID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7DQorICAgICAgcEZpbGUtPlJlYWRCbG9jayhwRGF0YSwgc2l6ZSk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0MocERhdGEsIHNpemUpKTsNCisgICAgICBGWF9GcmVlKHBEYXRhKTsNCisgICAgICBwRmlsZS0+UmVsZWFzZSgpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgIH0gZWxzZSB7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJHZXQiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6UG9zdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoKGFyZ2MgPj0gMikgJiYgKGFyZ2MgPD0gNSkpIHsNCisgICAgQ1hGQV9Eb2N1bWVudCogcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOw0KKyAgICBpZiAoIXBEb2MpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyID0NCisgICAgICAgIHBEb2MtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKS0+R2V0QXBwUHJvdmlkZXIoKTsNCisgICAgaWYgKCFwQXBwUHJvdmlkZXIpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNVUkw7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzRGF0YTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNDb250ZW50VHlwZTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNFbmNvZGU7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzSGVhZGVyOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVHdvOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnVGhyZWU7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdGb3VyOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnRml2ZTsNCisgICAgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgYnNVUkwpOw0KKyAgICBhcmdUd28gPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnVHdvLCBic0RhdGEpOw0KKyAgICBpZiAoYXJnYyA+IDIpIHsNCisgICAgICBhcmdUaHJlZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMik7DQorICAgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ1RocmVlLCBic0NvbnRlbnRUeXBlKTsNCisgICAgfQ0KKyAgICBpZiAoYXJnYyA+IDMpIHsNCisgICAgICBhcmdGb3VyID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAzKTsNCisgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnRm91ciwgYnNFbmNvZGUpOw0KKyAgICB9DQorICAgIGlmIChhcmdjID4gNCkgew0KKyAgICAgIGFyZ0ZpdmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDQpOw0KKyAgICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdGaXZlLCBic0hlYWRlcik7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgZGVjb2RlZFJlc3BvbnNlOw0KKyAgICBGWF9CT09MIGJGbGFncyA9IHBBcHBQcm92aWRlci0+UG9zdFJlcXVlc3RVUkwoDQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNVUkwsIGJzVVJMLkdldExlbmd0aCgpKSwNCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0RhdGEsIGJzRGF0YS5HZXRMZW5ndGgoKSksDQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNDb250ZW50VHlwZSwgYnNDb250ZW50VHlwZS5HZXRMZW5ndGgoKSksDQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNFbmNvZGUsIGJzRW5jb2RlLkdldExlbmd0aCgpKSwNCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0hlYWRlciwgYnNIZWFkZXIuR2V0TGVuZ3RoKCkpLA0KKyAgICAgICAgZGVjb2RlZFJlc3BvbnNlKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1R3byk7DQorICAgIGlmIChhcmdjID4gMikgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVGhyZWUpOw0KKyAgICB9DQorICAgIGlmIChhcmdjID4gMykgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRm91cik7DQorICAgIH0NCisgICAgaWYgKGFyZ2MgPiA0KSB7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdGaXZlKTsNCisgICAgfQ0KKyAgICBpZiAoYkZsYWdzKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZygNCisgICAgICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICBGWF9VVEY4RW5jb2RlKGRlY29kZWRSZXNwb25zZSwgZGVjb2RlZFJlc3BvbnNlLkdldExlbmd0aCgpKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfU0VSVkVSX0RFTlkpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiUG9zdCIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpQdXQoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmICgoYXJnYyA9PSAyKSB8fCAoYXJnYyA9PSAzKSkgew0KKyAgICBDWEZBX0RvY3VtZW50KiBwRG9jID0gcENvbnRleHQtPkdldERvY3VtZW50KCk7DQorICAgIGlmICghcERvYykgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPQ0KKyAgICAgICAgcERvYy0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpLT5HZXRBcHBQcm92aWRlcigpOw0KKyAgICBpZiAoIXBBcHBQcm92aWRlcikgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfQnl0ZVN0cmluZyBic1VSTDsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEYXRhOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBic0VuY29kZTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1R3bzsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1RocmVlOw0KKyAgICBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLCBic1VSTCk7DQorICAgIGFyZ1R3byA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgIEhWYWx1ZVRvVVRGOFN0cmluZyhhcmdUd28sIGJzRGF0YSk7DQorICAgIGlmIChhcmdjID4gMikgew0KKyAgICAgIGFyZ1RocmVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAyKTsNCisgICAgICBIVmFsdWVUb1VURjhTdHJpbmcoYXJnVGhyZWUsIGJzRW5jb2RlKTsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJGbGFncyA9IHBBcHBQcm92aWRlci0+UHV0UmVxdWVzdFVSTCgNCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1VSTCwgYnNVUkwuR2V0TGVuZ3RoKCkpLA0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzRGF0YSwgYnNEYXRhLkdldExlbmd0aCgpKSwNCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0VuY29kZSwgYnNFbmNvZGUuR2V0TGVuZ3RoKCkpKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1R3byk7DQorICAgIGlmIChhcmdjID4gMikgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVGhyZWUpOw0KKyAgICB9DQorICAgIGlmIChiRmxhZ3MpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgIiIpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX1NFUlZFUl9ERU5ZKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIlB1dCIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0Ojphc3NpZ25fdmFsdWVfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMikgew0KKyAgICBGWEpTRV9IVkFMVUUgbFZhbHVlID0gYXJncy5HZXRWYWx1ZSgwKTsNCisgICAgRlhKU0VfSFZBTFVFIHJWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgIEZYX0JPT0wgYlNldFN0YXR1cyA9IFRSVUU7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGxWYWx1ZSkpIHsNCisgICAgICBGWEpTRV9IVkFMVUUgbGVmdExlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGxWYWx1ZSwgImxlbmd0aCIsIGxlZnRMZW5ndGhWYWx1ZSk7DQorICAgICAgaW50MzJfdCBpTGVmdExlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZWZ0TGVuZ3RoVmFsdWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVmdExlbmd0aFZhbHVlKTsNCisgICAgICBGWEpTRV9IVkFMVUUganNPYmplY3RWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChsVmFsdWUsIDEsIHByb3BlcnR5VmFsdWUpOw0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwocHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMjsgaSA8IGlMZWZ0TGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGxWYWx1ZSwgaSwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgIGJTZXRTdGF0dXMgPSBTZXRPYmplY3REZWZhdWx0VmFsdWUoanNPYmplY3RWYWx1ZSwgclZhbHVlKTsNCisgICAgICAgICAgaWYgKCFiU2V0U3RhdHVzKSB7DQorICAgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfTk9UX0RFRkFVTF9WQUxVRSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcHJvcGVydHlTdHI7DQorICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlTdHIpOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAyOyBpIDwgaUxlZnRMZW5ndGg7IGkrKykgew0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgobFZhbHVlLCBpLCBqc09iamVjdFZhbHVlKTsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0T2JqZWN0UHJvcChqc09iamVjdFZhbHVlLCBwcm9wZXJ0eVN0ciwgclZhbHVlKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShqc09iamVjdFZhbHVlKTsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KKyAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzT2JqZWN0KGxWYWx1ZSkpIHsNCisgICAgICBiU2V0U3RhdHVzID0gU2V0T2JqZWN0RGVmYXVsdFZhbHVlKGxWYWx1ZSwgclZhbHVlKTsNCisgICAgICBpZiAoIWJTZXRTdGF0dXMpIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX05PVF9ERUZBVUxfVkFMVUUpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9TZXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCByVmFsdWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxWYWx1ZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoclZhbHVlKTsNCisgIH0gZWxzZSB7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6bG9naWNhbF9vcl9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMikgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnRmlyc3QgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnU2Vjb25kID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdGaXJzdCkgJiYgRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1NlY29uZCkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhfRkxPQVQgZmlyc3QgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdGaXJzdCk7DQorICAgICAgRlhfRkxPQVQgc2Vjb25kID0gSFZhbHVlVG9GbG9hdChoVGhpcywgYXJnU2Vjb25kKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgKGZpcnN0IHx8IHNlY29uZCkgPyAxIDogMCk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdGaXJzdCk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU2Vjb25kKTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0Ojpsb2dpY2FsX2FuZF9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAyKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdGaXJzdCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdTZWNvbmQgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0ZpcnN0KSAmJiBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU2Vjb25kKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWF9GTE9BVCBmaXJzdCA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIGFyZ0ZpcnN0KTsNCisgICAgICBGWF9GTE9BVCBzZWNvbmQgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBhcmdTZWNvbmQpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoZmlyc3QgJiYgc2Vjb25kKSA/IDEgOiAwKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZpcnN0KTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdTZWNvbmQpOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmVxdWFsaXR5X29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDIpIHsNCisgICAgaWYgKGZtX3JlZl9lcXVhbChoVGhpcywgYXJncykpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgMSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhKU0VfSFZBTFVFIGFyZ0ZpcnN0ID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICBGWEpTRV9IVkFMVUUgYXJnU2Vjb25kID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0ZpcnN0KSB8fCBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU2Vjb25kKSkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcigNCisgICAgICAgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdGaXJzdCkgJiYgRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1NlY29uZCkpDQorICAgICAgICAgICAgICAgID8gMQ0KKyAgICAgICAgICAgICAgICA6IDApOw0KKyAgICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZ0ZpcnN0KSAmJg0KKyAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZ1NlY29uZCkpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGZpcnN0T3V0cHV0Ow0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc2Vjb25kT3V0cHV0Ow0KKyAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGFyZ0ZpcnN0LCBmaXJzdE91dHB1dCk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnU2Vjb25kLCBzZWNvbmRPdXRwdXQpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0T3V0cHV0LkVxdWFsKHNlY29uZE91dHB1dCkgPyAxIDogMCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEZYX0RPVUJMRSBmaXJzdCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdGaXJzdCk7DQorICAgICAgICBGWF9ET1VCTEUgc2Vjb25kID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1NlY29uZCk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpcnN0ID09IHNlY29uZCkgPyAxIDogMCk7DQorICAgICAgfQ0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRmlyc3QpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU2Vjb25kKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Om5vdGVxdWFsaXR5X29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDIpIHsNCisgICAgaWYgKGZtX3JlZl9lcXVhbChoVGhpcywgYXJncykpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgMCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhKU0VfSFZBTFVFIGFyZ0ZpcnN0ID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICBGWEpTRV9IVkFMVUUgYXJnU2Vjb25kID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0ZpcnN0KSB8fCBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU2Vjb25kKSkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcigNCisgICAgICAgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdGaXJzdCkgJiYgRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1NlY29uZCkpDQorICAgICAgICAgICAgICAgID8gMA0KKyAgICAgICAgICAgICAgICA6IDEpOw0KKyAgICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZ0ZpcnN0KSAmJg0KKyAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZ1NlY29uZCkpIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIGZpcnN0T3V0cHV0Ow0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc2Vjb25kT3V0cHV0Ow0KKyAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGFyZ0ZpcnN0LCBmaXJzdE91dHB1dCk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnU2Vjb25kLCBzZWNvbmRPdXRwdXQpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0T3V0cHV0LkVxdWFsKHNlY29uZE91dHB1dCkgPyAwIDogMSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEZYX0RPVUJMRSBmaXJzdCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdGaXJzdCk7DQorICAgICAgICBGWF9ET1VCTEUgc2Vjb25kID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1NlY29uZCk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpcnN0ID09IHNlY29uZCkgPyAwIDogMSk7DQorICAgICAgfQ0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRmlyc3QpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU2Vjb25kKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GTTJKU0NvbnRleHQ6OmZtX3JlZl9lcXVhbChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBGWF9CT09MIGJSZXQgPSBGQUxTRTsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICBGWEpTRV9IVkFMVUUgYXJnRmlyc3QgPSBhcmdzLkdldFZhbHVlKDApOw0KKyAgRlhKU0VfSFZBTFVFIGFyZ1NlY29uZCA9IGFyZ3MuR2V0VmFsdWUoMCk7DQorICBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdGaXJzdCkgJiYgRlhKU0VfVmFsdWVfSXNBcnJheShhcmdTZWNvbmQpKSB7DQorICAgIEZYSlNFX0hWQUxVRSBmaXJzdEZsYWdWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgIEZYSlNFX0hWQUxVRSBzZWNvbmRGbGFnVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnRmlyc3QsIDAsIGZpcnN0RmxhZ1ZhbHVlKTsNCisgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ1NlY29uZCwgMCwgc2Vjb25kRmxhZ1ZhbHVlKTsNCisgICAgaWYgKChGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoZmlyc3RGbGFnVmFsdWUpID09IDMpICYmDQorICAgICAgICAoRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKHNlY29uZEZsYWdWYWx1ZSkgPT0gMykpIHsNCisgICAgICBGWEpTRV9IVkFMVUUgZmlyc3RKU09iamVjdCA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgRlhKU0VfSFZBTFVFIHNlY29uZEpTT2JqZWN0ID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnRmlyc3QsIDIsIGZpcnN0SlNPYmplY3QpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdTZWNvbmQsIDIsIHNlY29uZEpTT2JqZWN0KTsNCisgICAgICBpZiAoIUZYSlNFX1ZhbHVlX0lzTnVsbChmaXJzdEpTT2JqZWN0KSAmJg0KKyAgICAgICAgICAhRlhKU0VfVmFsdWVfSXNOdWxsKHNlY29uZEpTT2JqZWN0KSkgew0KKyAgICAgICAgYlJldCA9IChGWEpTRV9WYWx1ZV9Ub09iamVjdChmaXJzdEpTT2JqZWN0LCBOVUxMKSA9PQ0KKyAgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Ub09iamVjdChzZWNvbmRKU09iamVjdCwgTlVMTCkpOw0KKyAgICAgIH0NCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGZpcnN0SlNPYmplY3QpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2Uoc2Vjb25kSlNPYmplY3QpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoZmlyc3RGbGFnVmFsdWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHNlY29uZEZsYWdWYWx1ZSk7DQorICB9DQorICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZpcnN0KTsNCisgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU2Vjb25kKTsNCisgIHJldHVybiBiUmV0Ow0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpsZXNzX29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAyKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdGaXJzdCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdTZWNvbmQgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0ZpcnN0KSB8fCBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU2Vjb25kKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAwKTsNCisgICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoYXJnRmlyc3QpICYmDQorICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZ1NlY29uZCkpIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBmaXJzdE91dHB1dDsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBzZWNvbmRPdXRwdXQ7DQorICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGFyZ0ZpcnN0LCBmaXJzdE91dHB1dCk7DQorICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGFyZ1NlY29uZCwgc2Vjb25kT3V0cHV0KTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaXJzdE91dHB1dC5Db21wYXJlKHNlY29uZE91dHB1dCkgPT0gLTEpID8gMSA6IDApOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYX0RPVUJMRSBmaXJzdCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdGaXJzdCk7DQorICAgICAgRlhfRE9VQkxFIHNlY29uZCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdTZWNvbmQpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoZmlyc3QgPCBzZWNvbmQpID8gMSA6IDApOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRmlyc3QpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1NlY29uZCk7DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6bGVzc2VxdWFsX29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMikgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnRmlyc3QgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnU2Vjb25kID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdGaXJzdCkgfHwgRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1NlY29uZCkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKA0KKyAgICAgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnRmlyc3QpICYmIEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdTZWNvbmQpKSA/IDENCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMCk7DQorICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZ0ZpcnN0KSAmJg0KKyAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhhcmdTZWNvbmQpKSB7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgZmlyc3RPdXRwdXQ7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgc2Vjb25kT3V0cHV0Ow0KKyAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhhcmdGaXJzdCwgZmlyc3RPdXRwdXQpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhhcmdTZWNvbmQsIHNlY29uZE91dHB1dCk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlyc3RPdXRwdXQuQ29tcGFyZShzZWNvbmRPdXRwdXQpICE9IDEpID8gMSA6IDApOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYX0RPVUJMRSBmaXJzdCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdGaXJzdCk7DQorICAgICAgRlhfRE9VQkxFIHNlY29uZCA9IEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdTZWNvbmQpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoZmlyc3QgPD0gc2Vjb25kKSA/IDEgOiAwKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZpcnN0KTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdTZWNvbmQpOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmdyZWF0ZXJfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDIpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ0ZpcnN0ID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1NlY29uZCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnRmlyc3QpIHx8IEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdTZWNvbmQpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIDApOw0KKyAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhhcmdGaXJzdCkgJiYNCisgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoYXJnU2Vjb25kKSkgew0KKyAgICAgIENGWF9CeXRlU3RyaW5nIGZpcnN0T3V0cHV0Ow0KKyAgICAgIENGWF9CeXRlU3RyaW5nIHNlY29uZE91dHB1dDsNCisgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnRmlyc3QsIGZpcnN0T3V0cHV0KTsNCisgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnU2Vjb25kLCBzZWNvbmRPdXRwdXQpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpcnN0T3V0cHV0LkNvbXBhcmUoc2Vjb25kT3V0cHV0KSA9PSAxKSA/IDEgOiAwKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWF9ET1VCTEUgZmlyc3QgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnRmlyc3QpOw0KKyAgICAgIEZYX0RPVUJMRSBzZWNvbmQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnU2Vjb25kKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgKGZpcnN0ID4gc2Vjb25kKSA/IDEgOiAwKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZpcnN0KTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdTZWNvbmQpOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmdyZWF0ZXJlcXVhbF9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGlmIChhcmdzLkdldExlbmd0aCgpID09IDIpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ0ZpcnN0ID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ1NlY29uZCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMSk7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnRmlyc3QpIHx8IEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdTZWNvbmQpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcigNCisgICAgICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0ZpcnN0KSAmJiBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU2Vjb25kKSkgPyAxDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDApOw0KKyAgICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhhcmdGaXJzdCkgJiYNCisgICAgICAgICAgICAgICBGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoYXJnU2Vjb25kKSkgew0KKyAgICAgIENGWF9CeXRlU3RyaW5nIGZpcnN0T3V0cHV0Ow0KKyAgICAgIENGWF9CeXRlU3RyaW5nIHNlY29uZE91dHB1dDsNCisgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnRmlyc3QsIGZpcnN0T3V0cHV0KTsNCisgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnU2Vjb25kLCBzZWNvbmRPdXRwdXQpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpcnN0T3V0cHV0LkNvbXBhcmUoc2Vjb25kT3V0cHV0KSAhPSAtMSkgPyAxIDogMCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhfRE9VQkxFIGZpcnN0ID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ0ZpcnN0KTsNCisgICAgICBGWF9ET1VCTEUgc2Vjb25kID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1NlY29uZCk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIChmaXJzdCA+PSBzZWNvbmQpID8gMSA6IDApOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnRmlyc3QpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ1NlY29uZCk7DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6cGx1c19vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMikgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnRmlyc3QgPSBhcmdzLkdldFZhbHVlKDApOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnU2Vjb25kID0gYXJncy5HZXRWYWx1ZSgxKTsNCisgICAgaWYgKEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnRmlyc3QpICYmIEhWYWx1ZUlzTnVsbChoVGhpcywgYXJnU2Vjb25kKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWF9ET1VCTEUgZmlyc3QgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnRmlyc3QpOw0KKyAgICAgIEZYX0RPVUJMRSBzZWNvbmQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnU2Vjb25kKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBmaXJzdCArIHNlY29uZCk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdGaXJzdCk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU2Vjb25kKTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjptaW51c19vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAyKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdGaXJzdCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdTZWNvbmQgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0ZpcnN0KSAmJiBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU2Vjb25kKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWF9ET1VCTEUgZmlyc3QgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnRmlyc3QpOw0KKyAgICAgIEZYX0RPVUJMRSBzZWNvbmQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnU2Vjb25kKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBmaXJzdCAtIHNlY29uZCk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdGaXJzdCk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU2Vjb25kKTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjptdWx0aXBsZV9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBpZiAoYXJncy5HZXRMZW5ndGgoKSA9PSAyKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdGaXJzdCA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdTZWNvbmQgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDEpOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0ZpcnN0KSAmJiBGWEpTRV9WYWx1ZV9Jc051bGwoYXJnU2Vjb25kKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWF9ET1VCTEUgZmlyc3QgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnRmlyc3QpOw0KKyAgICAgIEZYX0RPVUJMRSBzZWNvbmQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnU2Vjb25kKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBmaXJzdCAqIHNlY29uZCk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdGaXJzdCk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnU2Vjb25kKTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpkaXZpZGVfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPT0gMikgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnRmlyc3QgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnU2Vjb25kID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAxKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdGaXJzdCkgJiYgRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ1NlY29uZCkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhfRE9VQkxFIGZpcnN0ID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ0ZpcnN0KTsNCisgICAgICBGWF9ET1VCTEUgc2Vjb25kID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ1NlY29uZCk7DQorICAgICAgaWYgKHNlY29uZCA9PSAwLjApIHsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0RJVklERV9aRVJPKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0RG91YmxlKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgZmlyc3QgLyBzZWNvbmQpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0ZpcnN0KTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdTZWNvbmQpOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0Ojpwb3NpdGl2ZV9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggPT0gMSkgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmdPbmUpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldERvdWJsZShhcmdzLkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMCArIEhWYWx1ZVRvRG91YmxlKGhUaGlzLCBhcmdPbmUpKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0NPTVBJTEVSX0VSUk9SKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6bmVnYXRpdmVfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoID09IDEpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnT25lKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXREb3VibGUoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAgLSBIVmFsdWVUb0RvdWJsZShoVGhpcywgYXJnT25lKSk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmxvZ2ljYWxfbm90X29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCA9PSAxKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBHZXRTaW1wbGVIVmFsdWUoaFRoaXMsIGFyZ3MsIDApOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ09uZSkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhfRE9VQkxFIGZpcnN0ID0gSFZhbHVlVG9Eb3VibGUoaFRoaXMsIGFyZ09uZSk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihhcmdzLkdldFJldHVyblZhbHVlKCksIChmaXJzdCA9PSAwLjApID8gMSA6IDApOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0Ojpkb3RfYWNjZXNzb3IoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmICgoYXJnYyA9PSA0KSB8fCAoYXJnYyA9PSA1KSkgew0KKyAgICBGWF9CT09MIGJJc1N0YXIgPSBUUlVFOw0KKyAgICBGWEpTRV9IVkFMVUUgYXJnQWNjZXNzb3IgPSBhcmdzLkdldFZhbHVlKDApOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBic0FjY2Vzc29yTmFtZSA9IGFyZ3MuR2V0VVRGOFN0cmluZygxKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgc3pOYW1lID0gYXJncy5HZXRVVEY4U3RyaW5nKDIpOw0KKyAgICBpbnQzMl90IGlJbmRleEZsYWdzID0gYXJncy5HZXRJbnQzMigzKTsNCisgICAgaW50MzJfdCBpSW5kZXhWYWx1ZSA9IDA7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdJbmRleCA9IE5VTEw7DQorICAgIGlmIChhcmdjID09IDUpIHsNCisgICAgICBiSXNTdGFyID0gRkFMU0U7DQorICAgICAgYXJnSW5kZXggPSBhcmdzLkdldFZhbHVlKDQpOw0KKyAgICAgIGlJbmRleFZhbHVlID0gSFZhbHVlVG9JbnRlZ2VyKGhUaGlzLCBhcmdJbmRleCk7DQorICAgIH0NCisgICAgQ0ZYX0J5dGVTdHJpbmcgc3pTb21FeHA7DQorICAgIEdlbmVyYXRlU29tRXhwcmVzc2lvbihzek5hbWUsIGlJbmRleEZsYWdzLCBpSW5kZXhWYWx1ZSwgYklzU3Rhciwgc3pTb21FeHApOw0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdBY2Nlc3NvcikpIHsNCisgICAgICBGWEpTRV9IVkFMVUUgaExlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ0FjY2Vzc29yLCAibGVuZ3RoIiwgaExlbmd0aFZhbHVlKTsNCisgICAgICBpbnQzMl90IGlMZW5ndGggPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoaExlbmd0aFZhbHVlKTsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhMZW5ndGhWYWx1ZSk7DQorICAgICAgaW50MzJfdCBpQ291bnRlciA9IDA7DQorICAgICAgRlhKU0VfSFZBTFVFKiogaFJlc29sdmVWYWx1ZXMgPSBGWF9BbGxvYyhGWEpTRV9IVkFMVUUqLCBpTGVuZ3RoIC0gMik7DQorICAgICAgaW50MzJfdCogaVNpemVzID0gRlhfQWxsb2MoaW50MzJfdCwgaUxlbmd0aCAtIDIpOw0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IChpTGVuZ3RoIC0gMik7IGkrKykgew0KKyAgICAgICAgaVNpemVzW2ldID0gMDsNCisgICAgICB9DQorICAgICAgRlhKU0VfSFZBTFVFIGhKU09ialZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICBGWF9CT09MIGJBdHRyaWJ1dGUgPSBGQUxTRTsNCisgICAgICBmb3IgKGludDMyX3QgaSA9IDI7IGkgPCBpTGVuZ3RoOyBpKyspIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdBY2Nlc3NvciwgaSwgaEpTT2JqVmFsdWUpOw0KKyAgICAgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc292ZU5vZGVSUzsNCisgICAgICAgIGludDMyX3QgaVJldCA9IFJlc29sdmVPYmplY3RzKGhUaGlzLCBoSlNPYmpWYWx1ZSwgc3pTb21FeHAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdmVOb2RlUlMsIFRSVUUsIHN6TmFtZS5Jc0VtcHR5KCkpOw0KKyAgICAgICAgaWYgKGlSZXQgPiAwKSB7DQorICAgICAgICAgIFBhcnNlUmVzb2x2ZVJlc3VsdChoVGhpcywgcmVzb3ZlTm9kZVJTLCBoSlNPYmpWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhSZXNvbHZlVmFsdWVzW2kgLSAyXSwgaVNpemVzW2kgLSAyXSwgYkF0dHJpYnV0ZSk7DQorICAgICAgICAgIGlDb3VudGVyICs9IGlTaXplc1tpIC0gMl07DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaEpTT2JqVmFsdWUpOw0KKyAgICAgIGlmIChpQ291bnRlciA+IDApIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSogcmdWYWx1ZXMgPSBGWF9BbGxvYyhGWEpTRV9IVkFMVUUsIGlDb3VudGVyICsgMik7DQorICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAoaUNvdW50ZXIgKyAyKTsgaSsrKSB7DQorICAgICAgICAgIHJnVmFsdWVzW2ldID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIocmdWYWx1ZXNbMF0sIDEpOw0KKyAgICAgICAgaWYgKGJBdHRyaWJ1dGUpIHsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhyZ1ZhbHVlc1sxXSwgc3pOYW1lKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocmdWYWx1ZXNbMV0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaW50MzJfdCBpSW5kZXggPSAyOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUxlbmd0aCAtIDI7IGkrKykgew0KKyAgICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpU2l6ZXNbaV07IGorKykgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldChyZ1ZhbHVlc1tpSW5kZXhdLCBoUmVzb2x2ZVZhbHVlc1tpXVtqXSk7DQorICAgICAgICAgICAgaUluZGV4Kys7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEFycmF5KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgKGlDb3VudGVyICsgMiksIHJnVmFsdWVzKTsNCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IChpQ291bnRlciArIDIpOyBpKyspIHsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShyZ1ZhbHVlc1tpXSk7DQorICAgICAgICB9DQorICAgICAgICBGWF9GcmVlKHJnVmFsdWVzKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQcm9wZXJ0eU5hbWUgPQ0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzek5hbWUsIHN6TmFtZS5HZXRMZW5ndGgoKSk7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1NvbUV4cHJlc3Npb24gPQ0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelNvbUV4cCwgc3pTb21FeHAuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQUNDRVNTX1BST1BFUlRZX0lOX05PVF9PQkpFQ1QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IEZYX1dDSEFSKil3c1Byb3BlcnR5TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgRlhfV0NIQVIqKXdzU29tRXhwcmVzc2lvbik7DQorICAgICAgfQ0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMZW5ndGggLSAyOyBpKyspIHsNCisgICAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlTaXplc1tpXTsgaisrKSB7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaFJlc29sdmVWYWx1ZXNbaV1bal0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGlTaXplc1tpXSA+IDApIHsNCisgICAgICAgICAgRlhfRnJlZShoUmVzb2x2ZVZhbHVlc1tpXSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIEZYX0ZyZWUoaFJlc29sdmVWYWx1ZXMpOw0KKyAgICAgIEZYX0ZyZWUoaVNpemVzKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb3ZlTm9kZVJTOw0KKyAgICAgIGludDMyX3QgaVJldCA9IDA7DQorICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzT2JqZWN0KGFyZ0FjY2Vzc29yKSB8fA0KKyAgICAgICAgICAoRlhKU0VfVmFsdWVfSXNOdWxsKGFyZ0FjY2Vzc29yKSAmJiBic0FjY2Vzc29yTmFtZS5Jc0VtcHR5KCkpKSB7DQorICAgICAgICBpUmV0ID0gUmVzb2x2ZU9iamVjdHMoaFRoaXMsIGFyZ0FjY2Vzc29yLCBzelNvbUV4cCwgcmVzb3ZlTm9kZVJTLCBUUlVFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6TmFtZS5Jc0VtcHR5KCkpOw0KKyAgICAgIH0gZWxzZSBpZiAoIUZYSlNFX1ZhbHVlX0lzT2JqZWN0KGFyZ0FjY2Vzc29yKSAmJg0KKyAgICAgICAgICAgICAgICAgIWJzQWNjZXNzb3JOYW1lLklzRW1wdHkoKSkgew0KKyAgICAgICAgRlhfQk9PTCBiR2V0T2JqZWN0ID0NCisgICAgICAgICAgICBHZXRPYmplY3RCeU5hbWUoaFRoaXMsIGFyZ0FjY2Vzc29yLCBic0FjY2Vzc29yTmFtZSk7DQorICAgICAgICBpZiAoYkdldE9iamVjdCkgew0KKyAgICAgICAgICBpUmV0ID0gUmVzb2x2ZU9iamVjdHMoaFRoaXMsIGFyZ0FjY2Vzc29yLCBzelNvbUV4cCwgcmVzb3ZlTm9kZVJTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgc3pOYW1lLklzRW1wdHkoKSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmIChpUmV0ID4gMCkgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFKiBoUmVzb2x2ZVZhbHVlczsNCisgICAgICAgIGludDMyX3QgaVNpemUgPSAwOw0KKyAgICAgICAgRlhfQk9PTCBiQXR0cmlidXRlID0gRkFMU0U7DQorICAgICAgICBQYXJzZVJlc29sdmVSZXN1bHQoaFRoaXMsIHJlc292ZU5vZGVSUywgYXJnQWNjZXNzb3IsIGhSZXNvbHZlVmFsdWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTaXplLCBiQXR0cmlidXRlKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSogcmdWYWx1ZXMgPSBGWF9BbGxvYyhGWEpTRV9IVkFMVUUsIGlTaXplICsgMik7DQorICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAoaVNpemUgKyAyKTsgaSsrKSB7DQorICAgICAgICAgIHJnVmFsdWVzW2ldID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIocmdWYWx1ZXNbMF0sIDEpOw0KKyAgICAgICAgaWYgKGJBdHRyaWJ1dGUpIHsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhyZ1ZhbHVlc1sxXSwgc3pOYW1lKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocmdWYWx1ZXNbMV0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7IGkrKykgew0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQocmdWYWx1ZXNbaSArIDJdLCBoUmVzb2x2ZVZhbHVlc1tpXSk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRBcnJheShhcmdzLkdldFJldHVyblZhbHVlKCksIChpU2l6ZSArIDIpLCByZ1ZhbHVlcyk7DQorICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAoaVNpemUgKyAyKTsgaSsrKSB7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocmdWYWx1ZXNbaV0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRnJlZShyZ1ZhbHVlcyk7DQorICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgaSsrKSB7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaFJlc29sdmVWYWx1ZXNbaV0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRnJlZShoUmVzb2x2ZVZhbHVlcyk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzUHJvcGVydHlOYW1lID0NCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pOYW1lLCBzek5hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTb21FeHByZXNzaW9uID0NCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pTb21FeHAsIHN6U29tRXhwLkdldExlbmd0aCgpKTsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FDQ0VTU19QUk9QRVJUWV9JTl9OT1RfT0JKRUNULA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBGWF9XQ0hBUiopd3NQcm9wZXJ0eU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IEZYX1dDSEFSKil3c1NvbUV4cHJlc3Npb24pOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoYXJnYyA9PSA1KSB7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdJbmRleCk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdBY2Nlc3Nvcik7DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmRvdGRvdF9hY2Nlc3NvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgaWYgKChhcmdjID09IDQpIHx8IChhcmdjID09IDUpKSB7DQorICAgIEZYX0JPT0wgYklzU3RhciA9IFRSVUU7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdBY2Nlc3NvciA9IGFyZ3MuR2V0VmFsdWUoMCk7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzQWNjZXNzb3JOYW1lID0gYXJncy5HZXRVVEY4U3RyaW5nKDEpOw0KKyAgICBDRlhfQnl0ZVN0cmluZyBzek5hbWUgPSBhcmdzLkdldFVURjhTdHJpbmcoMik7DQorICAgIGludDMyX3QgaUluZGV4RmxhZ3MgPSBhcmdzLkdldEludDMyKDMpOw0KKyAgICBpbnQzMl90IGlJbmRleFZhbHVlID0gMDsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ0luZGV4ID0gTlVMTDsNCisgICAgaWYgKGFyZ2MgPT0gNSkgew0KKyAgICAgIGJJc1N0YXIgPSBGQUxTRTsNCisgICAgICBhcmdJbmRleCA9IGFyZ3MuR2V0VmFsdWUoNCk7DQorICAgICAgaUluZGV4VmFsdWUgPSBIVmFsdWVUb0ludGVnZXIoaFRoaXMsIGFyZ0luZGV4KTsNCisgICAgfQ0KKyAgICBDRlhfQnl0ZVN0cmluZyBzelNvbUV4cDsNCisgICAgR2VuZXJhdGVTb21FeHByZXNzaW9uKHN6TmFtZSwgaUluZGV4RmxhZ3MsIGlJbmRleFZhbHVlLCBiSXNTdGFyLCBzelNvbUV4cCk7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ0FjY2Vzc29yKSkgew0KKyAgICAgIEZYSlNFX0hWQUxVRSBoTGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoYXJnQWNjZXNzb3IsICJsZW5ndGgiLCBoTGVuZ3RoVmFsdWUpOw0KKyAgICAgIGludDMyX3QgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihoTGVuZ3RoVmFsdWUpOw0KKyAgICAgIGludDMyX3QgaUNvdW50ZXIgPSAwOw0KKyAgICAgIEZYSlNFX0hWQUxVRSoqIGhSZXNvbHZlVmFsdWVzID0gRlhfQWxsb2MoRlhKU0VfSFZBTFVFKiwgaUxlbmd0aCAtIDIpOw0KKyAgICAgIGludDMyX3QqIGlTaXplcyA9IEZYX0FsbG9jKGludDMyX3QsIGlMZW5ndGggLSAyKTsNCisgICAgICBGWEpTRV9IVkFMVUUgaEpTT2JqVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgIEZYX0JPT0wgYkF0dHJpYnV0ZSA9IEZBTFNFOw0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMjsgaSA8IGlMZW5ndGg7IGkrKykgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ0FjY2Vzc29yLCBpLCBoSlNPYmpWYWx1ZSk7DQorICAgICAgICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb3ZlTm9kZVJTOw0KKyAgICAgICAgaW50MzJfdCBpUmV0ID0NCisgICAgICAgICAgICBSZXNvbHZlT2JqZWN0cyhoVGhpcywgaEpTT2JqVmFsdWUsIHN6U29tRXhwLCByZXNvdmVOb2RlUlMsIEZBTFNFKTsNCisgICAgICAgIGlmIChpUmV0ID4gMCkgew0KKyAgICAgICAgICBQYXJzZVJlc29sdmVSZXN1bHQoaFRoaXMsIHJlc292ZU5vZGVSUywgaEpTT2JqVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUmVzb2x2ZVZhbHVlc1tpIC0gMl0sIGlTaXplc1tpIC0gMl0sIGJBdHRyaWJ1dGUpOw0KKyAgICAgICAgICBpQ291bnRlciArPSBpU2l6ZXNbaSAtIDJdOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhKU09ialZhbHVlKTsNCisgICAgICBpZiAoaUNvdW50ZXIgPiAwKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUqIHJnVmFsdWVzID0gRlhfQWxsb2MoRlhKU0VfSFZBTFVFLCBpQ291bnRlciArIDIpOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgKGlDb3VudGVyICsgMik7IGkrKykgew0KKyAgICAgICAgICByZ1ZhbHVlc1tpXSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKHJnVmFsdWVzWzBdLCAxKTsNCisgICAgICAgIGlmIChiQXR0cmlidXRlKSB7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcocmdWYWx1ZXNbMV0sIHN6TmFtZSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHJnVmFsdWVzWzFdKTsNCisgICAgICAgIH0NCisgICAgICAgIGludDMyX3QgaUluZGV4ID0gMjsNCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMZW5ndGggLSAyOyBpKyspIHsNCisgICAgICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaVNpemVzW2ldOyBqKyspIHsNCisgICAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQocmdWYWx1ZXNbaUluZGV4XSwgaFJlc29sdmVWYWx1ZXNbaV1bal0pOw0KKyAgICAgICAgICAgIGlJbmRleCsrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRBcnJheShhcmdzLkdldFJldHVyblZhbHVlKCksIChpQ291bnRlciArIDIpLCByZ1ZhbHVlcyk7DQorICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAoaUNvdW50ZXIgKyAyKTsgaSsrKSB7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocmdWYWx1ZXNbaV0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRnJlZShyZ1ZhbHVlcyk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzUHJvcGVydHlOYW1lID0NCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pOYW1lLCBzek5hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTb21FeHByZXNzaW9uID0NCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pTb21FeHAsIHN6U29tRXhwLkdldExlbmd0aCgpKTsNCisgICAgICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FDQ0VTU19QUk9QRVJUWV9JTl9OT1RfT0JKRUNULA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBGWF9XQ0hBUiopd3NQcm9wZXJ0eU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IEZYX1dDSEFSKil3c1NvbUV4cHJlc3Npb24pOw0KKyAgICAgIH0NCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGVuZ3RoIC0gMjsgaSsrKSB7DQorICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpU2l6ZXNbaV07IGorKykgew0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhSZXNvbHZlVmFsdWVzW2ldW2pdKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0ZyZWUoaFJlc29sdmVWYWx1ZXNbaV0pOw0KKyAgICAgIH0NCisgICAgICBGWF9GcmVlKGhSZXNvbHZlVmFsdWVzKTsNCisgICAgICBGWF9GcmVlKGlTaXplcyk7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoTGVuZ3RoVmFsdWUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvdmVOb2RlUlM7DQorICAgICAgaW50MzJfdCBpUmV0ID0gMDsNCisgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnQWNjZXNzb3IpIHx8DQorICAgICAgICAgIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnQWNjZXNzb3IpICYmIGJzQWNjZXNzb3JOYW1lLklzRW1wdHkoKSkpIHsNCisgICAgICAgIGlSZXQgPQ0KKyAgICAgICAgICAgIFJlc29sdmVPYmplY3RzKGhUaGlzLCBhcmdBY2Nlc3Nvciwgc3pTb21FeHAsIHJlc292ZU5vZGVSUywgRkFMU0UpOw0KKyAgICAgIH0gZWxzZSBpZiAoIUZYSlNFX1ZhbHVlX0lzT2JqZWN0KGFyZ0FjY2Vzc29yKSAmJg0KKyAgICAgICAgICAgICAgICAgIWJzQWNjZXNzb3JOYW1lLklzRW1wdHkoKSkgew0KKyAgICAgICAgRlhfQk9PTCBiR2V0T2JqZWN0ID0NCisgICAgICAgICAgICBHZXRPYmplY3RCeU5hbWUoaFRoaXMsIGFyZ0FjY2Vzc29yLCBic0FjY2Vzc29yTmFtZSk7DQorICAgICAgICBpZiAoYkdldE9iamVjdCkgew0KKyAgICAgICAgICBpUmV0ID0NCisgICAgICAgICAgICAgIFJlc29sdmVPYmplY3RzKGhUaGlzLCBhcmdBY2Nlc3Nvciwgc3pTb21FeHAsIHJlc292ZU5vZGVSUywgRkFMU0UpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoaVJldCA+IDApIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSogaFJlc29sdmVWYWx1ZXM7DQorICAgICAgICBpbnQzMl90IGlTaXplID0gMDsNCisgICAgICAgIEZYX0JPT0wgYkF0dHJpYnV0ZSA9IEZBTFNFOw0KKyAgICAgICAgUGFyc2VSZXNvbHZlUmVzdWx0KGhUaGlzLCByZXNvdmVOb2RlUlMsIGFyZ0FjY2Vzc29yLCBoUmVzb2x2ZVZhbHVlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpU2l6ZSwgYkF0dHJpYnV0ZSk7DQorICAgICAgICBGWEpTRV9IVkFMVUUqIHJnVmFsdWVzID0gRlhfQWxsb2MoRlhKU0VfSFZBTFVFLCBpU2l6ZSArIDIpOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgKGlTaXplICsgMik7IGkrKykgew0KKyAgICAgICAgICByZ1ZhbHVlc1tpXSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKHJnVmFsdWVzWzBdLCAxKTsNCisgICAgICAgIGlmIChiQXR0cmlidXRlKSB7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcocmdWYWx1ZXNbMV0sIHN6TmFtZSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHJnVmFsdWVzWzFdKTsNCisgICAgICAgIH0NCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTaXplOyBpKyspIHsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0KHJnVmFsdWVzW2kgKyAyXSwgaFJlc29sdmVWYWx1ZXNbaV0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0QXJyYXkoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAoaVNpemUgKyAyKSwgcmdWYWx1ZXMpOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgKGlTaXplICsgMik7IGkrKykgew0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHJnVmFsdWVzW2ldKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0ZyZWUocmdWYWx1ZXMpOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7IGkrKykgew0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhSZXNvbHZlVmFsdWVzW2ldKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0ZyZWUoaFJlc29sdmVWYWx1ZXMpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1Byb3BlcnR5TmFtZSA9DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6TmFtZSwgc3pOYW1lLkdldExlbmd0aCgpKTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU29tRXhwcmVzc2lvbiA9DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6U29tRXhwLCBzelNvbUV4cC5HZXRMZW5ndGgoKSk7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BQ0NFU1NfUFJPUEVSVFlfSU5fTk9UX09CSkVDVCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgRlhfV0NIQVIqKXdzUHJvcGVydHlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBGWF9XQ0hBUiopd3NTb21FeHByZXNzaW9uKTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGFyZ2MgPT0gNSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnSW5kZXgpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnQWNjZXNzb3IpOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpldmFsX3RyYW5zbGF0aW9uKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDEpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgIENGWF9CeXRlU3RyaW5nIGFyZ1N0cmluZzsNCisgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZSwgYXJnU3RyaW5nKTsNCisgICAgaWYgKGFyZ1N0cmluZy5Jc0VtcHR5KCkpIHsNCisgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgc2NyaXB0U3RyaW5nID0NCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGFyZ1N0cmluZywgYXJnU3RyaW5nLkdldExlbmd0aCgpKTsNCisgICAgICBDRlhfV2lkZVRleHRCdWYgd3NKYXZhU2NyaXB0QnVmOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzRXJyb3I7DQorICAgICAgWEZBX0ZNMkpTX1RyYW5zbGF0ZShzY3JpcHRTdHJpbmcsIHdzSmF2YVNjcmlwdEJ1Ziwgd3NFcnJvcik7DQorICAgICAgaWYgKHdzRXJyb3IuSXNFbXB0eSgpKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyBqYXZhU2NyaXB0ID0gd3NKYXZhU2NyaXB0QnVmLkdldFdpZGVTdHJpbmcoKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoDQorICAgICAgICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgIEZYX1VURjhFbmNvZGUoamF2YVNjcmlwdCwgamF2YVNjcmlwdC5HZXRMZW5ndGgoKSkpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICAgICAgfQ0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgIH0gZWxzZSB7DQorICAgIHBDb250ZXh0LT5UaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJFdmFsIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmlzX2ZtX29iamVjdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCA9PSAxKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnT25lKSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnT25lKTsNCisgIH0gZWxzZSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBGQUxTRSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmlzX2ZtX2FycmF5KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IGFyZ3MuR2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCA9PSAxKSB7DQorICAgIEZYSlNFX0hWQUxVRSBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOw0KKyAgICBGWF9CT09MIGJJc0FycmF5ID0gRlhKU0VfVmFsdWVfSXNBcnJheShhcmdPbmUpOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgYklzQXJyYXkpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICB9IGVsc2Ugew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgRkFMU0UpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpnZXRfZm1fdmFsdWUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgaW50MzJfdCBpTGVuZ3RoID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoID09IDEpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IGFyZ3MuR2V0VmFsdWUoMCk7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ09uZSkpIHsNCisgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgRlhKU0VfSFZBTFVFIGpzb2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdPbmUsIDEsIHByb3BlcnR5VmFsdWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdPbmUsIDIsIGpzb2JqZWN0VmFsdWUpOw0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwocHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc29iamVjdFZhbHVlLCBhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVN0cik7DQorICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzb2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICAgIH0NCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNvYmplY3RWYWx1ZSk7DQorICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnT25lKSkgew0KKyAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShhcmdPbmUsIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0KGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSwgYXJnT25lKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ09uZSk7DQorICB9IGVsc2Ugew0KKyAgICBwQ29udGV4dC0+VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19DT01QSUxFUl9FUlJPUik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmdldF9mbV9qc29iaihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMSkgew0KKyAgICBGWEpTRV9IVkFMVUUgYXJnT25lID0gYXJncy5HZXRWYWx1ZSgwKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnT25lKSkgew0KKyAgICAgIEZYSlNFX0hWQUxVRSBsZW5ndGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChhcmdPbmUsICJsZW5ndGgiLCBsZW5ndGhWYWx1ZSk7DQorICAgICAgaW50MzJfdCBpTGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlbmd0aFZhbHVlKTsNCisgICAgICBGWFNZU19hc3NlcnQoaUxlbmd0aCA+PSAzKTsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxlbmd0aFZhbHVlKTsNCisgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnT25lLCAyLCBhcmdzLkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldChhcmdzLkdldFJldHVyblZhbHVlKCksIGFyZ09uZSk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpmbV92YXJfZmlsdGVyKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDEpIHsNCisgICAgRlhKU0VfSFZBTFVFIGFyZ09uZSA9IGFyZ3MuR2V0VmFsdWUoMCk7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ09uZSkpIHsNCisgICAgICBGWEpTRV9IVkFMVUUgbGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoYXJnT25lLCAibGVuZ3RoIiwgbGVuZ3RoVmFsdWUpOw0KKyAgICAgIGludDMyX3QgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQorICAgICAgRlhTWVNfYXNzZXJ0KGlMZW5ndGggPj0gMyk7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZW5ndGhWYWx1ZSk7DQorICAgICAgRlhKU0VfSFZBTFVFIGZsYWdzVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdPbmUsIDAsIGZsYWdzVmFsdWUpOw0KKyAgICAgIGludDMyX3QgaUZsYWdzID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGZsYWdzVmFsdWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoZmxhZ3NWYWx1ZSk7DQorICAgICAgaWYgKGlGbGFncyA9PSA0KSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgcmdWYWx1ZXNbM107DQorICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAzOyBpKyspIHsNCisgICAgICAgICAgcmdWYWx1ZXNbaV0gPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihyZ1ZhbHVlc1swXSwgMyk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHJnVmFsdWVzWzFdKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocmdWYWx1ZXNbMl0pOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0QXJyYXkoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCAzLCByZ1ZhbHVlcyk7DQorICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAzOyBpKyspIHsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShyZ1ZhbHVlc1tpXSk7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIGlmIChpRmxhZ3MgPT0gMykgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIG9iamVjdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdPbmUsIDIsIG9iamVjdFZhbHVlKTsNCisgICAgICAgIGlmICghRlhKU0VfVmFsdWVfSXNOdWxsKG9iamVjdFZhbHVlKSkgew0KKyAgICAgICAgICBGWEpTRV9WYWx1ZV9TZXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBhcmdPbmUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShvYmplY3RWYWx1ZSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBzaW1wbGVWYWx1ZSA9IEdldFNpbXBsZUhWYWx1ZShoVGhpcywgYXJncywgMCk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzaW1wbGVWYWx1ZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHNpbXBsZVZhbHVlKTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhKU0VfSFZBTFVFIHNpbXBsZVZhbHVlID0gR2V0U2ltcGxlSFZhbHVlKGhUaGlzLCBhcmdzLCAwKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXQoYXJncy5HZXRSZXR1cm5WYWx1ZSgpLCBzaW1wbGVWYWx1ZSk7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShzaW1wbGVWYWx1ZSk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShhcmdPbmUpOw0KKyAgfSBlbHNlIHsNCisgICAgcENvbnRleHQtPlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQ09NUElMRVJfRVJST1IpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0Ojpjb25jYXRfZm1fb2JqZWN0KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7DQorICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPQ0KKyAgICAgIChDWEZBX0ZNMkpTQ29udGV4dCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFRoaXMsIE5VTEwpOw0KKyAgRlhKU0VfSFJVTlRJTUUgaHJ1bnRpbWUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOw0KKyAgdWludDMyX3QgaUxlbmd0aCA9IDA7DQorICBpbnQzMl90IGFyZ0NvdW50ID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIEZYSlNFX0hWQUxVRSogYXJnVmFsdWVzID0gRlhfQWxsb2MoRlhKU0VfSFZBTFVFLCBhcmdDb3VudCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhcmdDb3VudDsgaSsrKSB7DQorICAgIGFyZ1ZhbHVlc1tpXSA9IGFyZ3MuR2V0VmFsdWUoaSk7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ1ZhbHVlc1tpXSkpIHsNCisgICAgICBGWEpTRV9IVkFMVUUgbGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoYXJnVmFsdWVzW2ldLCAibGVuZ3RoIiwgbGVuZ3RoVmFsdWUpOw0KKyAgICAgIGludDMyX3QgbGVuZ3RoID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGxlbmd0aFZhbHVlKTsNCisgICAgICBpTGVuZ3RoID0gaUxlbmd0aCArICgobGVuZ3RoID4gMikgPyAobGVuZ3RoIC0gMikgOiAwKTsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGxlbmd0aFZhbHVlKTsNCisgICAgfQ0KKyAgICBpTGVuZ3RoICs9IDE7DQorICB9DQorICBGWEpTRV9IVkFMVUUqIHJldHVyblZhbHVlcyA9IEZYX0FsbG9jKEZYSlNFX0hWQUxVRSwgaUxlbmd0aCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAoaW50MzJfdClpTGVuZ3RoOyBpKyspIHsNCisgICAgcmV0dXJuVmFsdWVzW2ldID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgIH0NCisgIGludDMyX3QgaW5kZXggPSAwOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYXJnQ291bnQ7IGkrKykgew0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdWYWx1ZXNbaV0pKSB7DQorICAgICAgRlhKU0VfSFZBTFVFIGxlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ1ZhbHVlc1tpXSwgImxlbmd0aCIsIGxlbmd0aFZhbHVlKTsNCisgICAgICBpbnQzMl90IGxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQorICAgICAgZm9yIChpbnQzMl90IGogPSAyOyBqIDwgbGVuZ3RoOyBqKyspIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdWYWx1ZXNbaV0sIGosIHJldHVyblZhbHVlc1tpbmRleF0pOw0KKyAgICAgICAgaW5kZXgrKzsNCisgICAgICB9DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZW5ndGhWYWx1ZSk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfU2V0KHJldHVyblZhbHVlc1tpbmRleF0sIGFyZ1ZhbHVlc1tpXSk7DQorICAgIGluZGV4Kys7DQorICB9DQorICBGWEpTRV9WYWx1ZV9TZXRBcnJheShhcmdzLkdldFJldHVyblZhbHVlKCksIGlMZW5ndGgsIHJldHVyblZhbHVlcyk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhcmdDb3VudDsgaSsrKSB7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnVmFsdWVzW2ldKTsNCisgIH0NCisgIEZYX0ZyZWUoYXJnVmFsdWVzKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IChpbnQzMl90KWlMZW5ndGg7IGkrKykgew0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHJldHVyblZhbHVlc1tpXSk7DQorICB9DQorICBGWF9GcmVlKHJldHVyblZhbHVlcyk7DQorfQ0KK0ZYSlNFX0hWQUxVRSBDWEZBX0ZNMkpTQ29udGV4dDo6R2V0U2ltcGxlSFZhbHVlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbmRleCkgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgIEZYU1lTX2Fzc2VydChpbmRleCA8ICh1aW50MzJfdClhcmdzLkdldExlbmd0aCgpKTsNCisgIEZYSlNFX0hWQUxVRSBhcmdJbmRleCA9IGFyZ3MuR2V0VmFsdWUoaW5kZXgpOw0KKyAgaWYgKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnSW5kZXgpKSB7DQorICAgIEZYSlNFX0hWQUxVRSBsZW5ndGhWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoYXJnSW5kZXgsICJsZW5ndGgiLCBsZW5ndGhWYWx1ZSk7DQorICAgIGludDMyX3QgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVuZ3RoVmFsdWUpOw0KKyAgICBGWEpTRV9IVkFMVUUgc2ltcGxlVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICBpZiAoaUxlbmd0aCA+IDIpIHsNCisgICAgICBGWEpTRV9IVkFMVUUgcHJvcGVydHlWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgICAgRlhKU0VfSFZBTFVFIGpzb2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdJbmRleCwgMSwgcHJvcGVydHlWYWx1ZSk7DQorICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ0luZGV4LCAyLCBqc29iamVjdFZhbHVlKTsNCisgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoanNvYmplY3RWYWx1ZSwgc2ltcGxlVmFsdWUpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cjsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVN0cik7DQorICAgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzb2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLCBzaW1wbGVWYWx1ZSk7DQorICAgICAgfQ0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJvcGVydHlWYWx1ZSk7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShqc29iamVjdFZhbHVlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRVbmRlZmluZWQoc2ltcGxlVmFsdWUpOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoYXJnSW5kZXgpOw0KKyAgICByZXR1cm4gc2ltcGxlVmFsdWU7DQorICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzT2JqZWN0KGFyZ0luZGV4KSkgew0KKyAgICBGWEpTRV9IVkFMVUUgZGVmYXVsdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGFyZ0luZGV4LCBkZWZhdWx0VmFsdWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ0luZGV4KTsNCisgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsNCisgIH0gZWxzZSB7DQorICAgIHJldHVybiBhcmdJbmRleDsNCisgIH0NCit9DQorRlhfQk9PTCBDWEZBX0ZNMkpTQ29udGV4dDo6SFZhbHVlSXNOdWxsKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYSlNFX0hWQUxVRSBhcmcpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICBGWF9CT09MIGlzTnVsbCA9IEZBTFNFOw0KKyAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChhcmcpKSB7DQorICAgIGlzTnVsbCA9IFRSVUU7DQorICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnKSkgew0KKyAgICBpbnQzMl90IGlMZW5ndGggPSBodmFsdWVfZ2V0X2FycmF5X2xlbmd0aChoVGhpcywgYXJnKTsNCisgICAgaWYgKGlMZW5ndGggPiAyKSB7DQorICAgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgIEZYSlNFX0hWQUxVRSBqc09iamVjdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCisgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnLCAyLCBqc09iamVjdFZhbHVlKTsNCisgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgZGVmYXVsdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc09iamVjdFZhbHVlLCBkZWZhdWx0VmFsdWUpOw0KKyAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChkZWZhdWx0VmFsdWUpKSB7DQorICAgICAgICAgIGlzTnVsbCA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGRlZmF1bHRWYWx1ZSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIENGWF9CeXRlU3RyaW5nIHByb3BlcnR5U3RyOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKHByb3BlcnR5VmFsdWUsIHByb3BlcnR5U3RyKTsNCisgICAgICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoanNPYmplY3RWYWx1ZSwgcHJvcGVydHlTdHIsIG5ld1Byb3BlcnR5VmFsdWUpOw0KKyAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChuZXdQcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgICAgICBpc051bGwgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eVZhbHVlKTsNCisgICAgICB9DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCisgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzT2JqZWN0VmFsdWUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlzTnVsbCA9IFRSVUU7DQorICAgIH0NCisgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnKSkgew0KKyAgICBGWEpTRV9IVkFMVUUgZGVmYXVsdFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGFyZywgZGVmYXVsdFZhbHVlKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChkZWZhdWx0VmFsdWUpKSB7DQorICAgICAgaXNOdWxsID0gVFJVRTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGRlZmF1bHRWYWx1ZSk7DQorICB9DQorICByZXR1cm4gaXNOdWxsOw0KK30NCitpbnQzMl90IENYRkFfRk0ySlNDb250ZXh0OjpodmFsdWVfZ2V0X2FycmF5X2xlbmd0aChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBhcmcpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICBpbnQzMl90IGlMZW5ndGggPSAwOw0KKyAgaWYgKEZYSlNFX1ZhbHVlX0lzQXJyYXkoYXJnKSkgew0KKyAgICBGWEpTRV9IVkFMVUUgbGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZywgImxlbmd0aCIsIGxlbmd0aFZhbHVlKTsNCisgICAgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVuZ3RoVmFsdWUpOw0KKyAgfQ0KKyAgcmV0dXJuIGlMZW5ndGg7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GTTJKU0NvbnRleHQ6OnNpbXBsZVZhbHVlQ29tcGFyZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgZmlyc3RWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIHNlY29uZFZhbHVlKSB7DQorICBGWF9CT09MIGJSZXR1cm4gPSBGQUxTRTsNCisgIGlmIChGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoZmlyc3RWYWx1ZSkpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgZmlyc3RTdHJpbmcsIHNlY29uZFN0cmluZzsNCisgICAgSFZhbHVlVG9VVEY4U3RyaW5nKGZpcnN0VmFsdWUsIGZpcnN0U3RyaW5nKTsNCisgICAgSFZhbHVlVG9VVEY4U3RyaW5nKHNlY29uZFZhbHVlLCBzZWNvbmRTdHJpbmcpOw0KKyAgICBiUmV0dXJuID0gZmlyc3RTdHJpbmcuRXF1YWwoc2Vjb25kU3RyaW5nKTsNCisgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNOdW1iZXIoZmlyc3RWYWx1ZSkpIHsNCisgICAgRlhfRkxPQVQgZmlyc3QgPSBIVmFsdWVUb0Zsb2F0KGhUaGlzLCBmaXJzdFZhbHVlKTsNCisgICAgRlhfRkxPQVQgc2Vjb25kID0gSFZhbHVlVG9GbG9hdChoVGhpcywgc2Vjb25kVmFsdWUpOw0KKyAgICBiUmV0dXJuID0gKGZpcnN0ID09IHNlY29uZCk7DQorICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzQm9vbGVhbihmaXJzdFZhbHVlKSkgew0KKyAgICBiUmV0dXJuID0gKEZYSlNFX1ZhbHVlX1RvQm9vbGVhbihmaXJzdFZhbHVlKSA9PQ0KKyAgICAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1RvQm9vbGVhbihzZWNvbmRWYWx1ZSkpOw0KKyAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoZmlyc3RWYWx1ZSkgJiYNCisgICAgICAgICAgICAgRlhKU0VfVmFsdWVfSXNOdWxsKHNlY29uZFZhbHVlKSkgew0KKyAgICBiUmV0dXJuID0gVFJVRTsNCisgIH0NCisgIHJldHVybiBiUmV0dXJuOw0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0Ojp1bmZvbGRBcmdzKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFKiYgcmVzdWx0VmFsdWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUNvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICBpQ291bnQgPSAwOw0KKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsNCisgIEZYSlNFX0hWQUxVRSogYXJnc1ZhbHVlID0gRlhfQWxsb2MoRlhKU0VfSFZBTFVFLCBhcmdjKTsNCisgIGZvciAoaW50MzJfdCBpID0gaVN0YXJ0OyBpIDwgYXJnYzsgaSsrKSB7DQorICAgIGFyZ3NWYWx1ZVtpXSA9IGFyZ3MuR2V0VmFsdWUoaSk7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZ3NWYWx1ZVtpXSkpIHsNCisgICAgICBGWEpTRV9IVkFMVUUgbGVuZ3RoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoYXJnc1ZhbHVlW2ldLCAibGVuZ3RoIiwgbGVuZ3RoVmFsdWUpOw0KKyAgICAgIGludDMyX3QgaUxlbmd0aCA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihsZW5ndGhWYWx1ZSk7DQorICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShsZW5ndGhWYWx1ZSk7DQorICAgICAgaUNvdW50ICs9ICgoaUxlbmd0aCA+IDIpID8gKGlMZW5ndGggLSAyKSA6IDApOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlDb3VudCArPSAxOw0KKyAgICB9DQorICB9DQorICByZXN1bHRWYWx1ZXMgPSBGWF9BbGxvYyhGWEpTRV9IVkFMVUUsIGlDb3VudCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICByZXN1bHRWYWx1ZXNbaV0gPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgfQ0KKyAgaW50MzJfdCBpbmRleCA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IGlTdGFydDsgaSA8IGFyZ2M7IGkrKykgew0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmdzVmFsdWVbaV0pKSB7DQorICAgICAgRlhKU0VfSFZBTFVFIGxlbmd0aFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGFyZ3NWYWx1ZVtpXSwgImxlbmd0aCIsIGxlbmd0aFZhbHVlKTsNCisgICAgICBpbnQzMl90IGlMZW5ndGggPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIobGVuZ3RoVmFsdWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobGVuZ3RoVmFsdWUpOw0KKyAgICAgIGlmIChpTGVuZ3RoID4gMikgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGpzT2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ3NWYWx1ZVtpXSwgMSwgcHJvcGVydHlWYWx1ZSk7DQorICAgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKHByb3BlcnR5VmFsdWUpKSB7DQorICAgICAgICAgIGZvciAoaW50MzJfdCBqID0gMjsgaiA8IGlMZW5ndGg7IGorKykgew0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmdzVmFsdWVbaV0sIGosIGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc09iamVjdFZhbHVlLCByZXN1bHRWYWx1ZXNbaW5kZXhdKTsNCisgICAgICAgICAgICBpbmRleCsrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBwcm9wZXJ0eVN0cmluZzsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKHByb3BlcnR5VmFsdWUsIHByb3BlcnR5U3RyaW5nKTsNCisgICAgICAgICAgZm9yIChpbnQzMl90IGogPSAyOyBqIDwgaUxlbmd0aDsgaisrKSB7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZ3NWYWx1ZVtpXSwgaiwganNPYmplY3RWYWx1ZSk7DQorICAgICAgICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChqc09iamVjdFZhbHVlLCBwcm9wZXJ0eVN0cmluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFZhbHVlc1tpbmRleF0pOw0KKyAgICAgICAgICAgIGluZGV4Kys7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJvcGVydHlWYWx1ZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzT2JqZWN0VmFsdWUpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc09iamVjdChhcmdzVmFsdWVbaV0pKSB7DQorICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGFyZ3NWYWx1ZVtpXSwgcmVzdWx0VmFsdWVzW2luZGV4XSk7DQorICAgICAgaW5kZXgrKzsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXQocmVzdWx0VmFsdWVzW2luZGV4XSwgYXJnc1ZhbHVlW2ldKTsNCisgICAgICBpbmRleCsrOw0KKyAgICB9DQorICB9DQorICBmb3IgKGludDMyX3QgaSA9IGlTdGFydDsgaSA8IGFyZ2M7IGkrKykgew0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGFyZ3NWYWx1ZVtpXSk7DQorICB9DQorICBGWF9GcmVlKGFyZ3NWYWx1ZSk7DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkdldE9iamVjdERlZmF1bHRWYWx1ZShGWEpTRV9IVkFMVUUgaE9iamVjdFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaERlZmF1bHRWYWx1ZSkgew0KKyAgQ1hGQV9PYmplY3QqIHBOb2RlID0gKENYRkFfT2JqZWN0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoT2JqZWN0VmFsdWUsIE5VTEwpOw0KKyAgaWYgKHBOb2RlICYmIHBOb2RlLT5Jc05vZGUoKSkgew0KKyAgICAoKENYRkFfTm9kZSopcE5vZGUpDQorICAgICAgICAtPlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlKGhEZWZhdWx0VmFsdWUsIEZBTFNFLCAoWEZBX0FUVFJJQlVURSktMSk7DQorICB9IGVsc2Ugew0KKyAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGhEZWZhdWx0VmFsdWUpOw0KKyAgfQ0KK30NCitGWF9CT09MIENYRkFfRk0ySlNDb250ZXh0OjpTZXRPYmplY3REZWZhdWx0VmFsdWUoRlhKU0VfSFZBTFVFIGhPYmplY3RWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhOZXdWYWx1ZSkgew0KKyAgRlhfQk9PTCBiU3VjY2VzcyA9IEZBTFNFOw0KKyAgQ1hGQV9PYmplY3QqIHBOb2RlID0gKENYRkFfT2JqZWN0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoT2JqZWN0VmFsdWUsIE5VTEwpOw0KKyAgaWYgKHBOb2RlICYmIHBOb2RlLT5Jc05vZGUoKSkgew0KKyAgICAoKENYRkFfTm9kZSopcE5vZGUpDQorICAgICAgICAtPlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlKGhOZXdWYWx1ZSwgVFJVRSwgKFhGQV9BVFRSSUJVVEUpLTEpOw0KKyAgICBiU3VjY2VzcyA9IFRSVUU7DQorICB9DQorICByZXR1cm4gYlN1Y2Nlc3M7DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkdlbmVyYXRlU29tRXhwcmVzc2lvbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpSW5kZXhGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpSW5kZXhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNTdGFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3pTb21FeHApIHsNCisgIGlmIChiSXNTdGFyKSB7DQorICAgIHN6U29tRXhwID0gc3pOYW1lICsgIlsqXSI7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChpSW5kZXhGbGFncyA9PSAwKSB7DQorICAgIHN6U29tRXhwID0gc3pOYW1lOw0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoaUluZGV4RmxhZ3MgPT0gMSB8fCBpSW5kZXhWYWx1ZSA9PSAwKSB7DQorICAgIHN6U29tRXhwID0gc3pOYW1lICsgIlsiICsNCisgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZzo6Rm9ybWF0SW50ZWdlcihpSW5kZXhWYWx1ZSwgRlhGT1JNQVRfU0lHTkVEKSArDQorICAgICAgICAgICAgICAgIl0iOw0KKyAgfSBlbHNlIGlmIChpSW5kZXhGbGFncyA9PSAyKSB7DQorICAgIHN6U29tRXhwID0gKGlJbmRleFZhbHVlIDwgMCkgPyAoc3pOYW1lICsgIlstIikgOiAoc3pOYW1lICsgIlsrIik7DQorICAgIGlJbmRleFZhbHVlID0gKGlJbmRleFZhbHVlIDwgMCkgPyAoMCAtIGlJbmRleFZhbHVlKSA6IGlJbmRleFZhbHVlOw0KKyAgICBzelNvbUV4cCArPSBDRlhfQnl0ZVN0cmluZzo6Rm9ybWF0SW50ZWdlcihpSW5kZXhWYWx1ZSk7DQorICAgIHN6U29tRXhwICs9ICJdIjsNCisgIH0gZWxzZSB7DQorICAgIHN6U29tRXhwID0gKGlJbmRleFZhbHVlIDwgMCkgPyAoc3pOYW1lICsgIlsiKSA6IChzek5hbWUgKyAiWy0iKTsNCisgICAgaUluZGV4VmFsdWUgPSAoaUluZGV4VmFsdWUgPCAwKSA/ICgwIC0gaUluZGV4VmFsdWUpIDogaUluZGV4VmFsdWU7DQorICAgIHN6U29tRXhwICs9IENGWF9CeXRlU3RyaW5nOjpGb3JtYXRJbnRlZ2VyKGlJbmRleFZhbHVlKTsNCisgICAgc3pTb21FeHAgKz0gIl0iOw0KKyAgfQ0KK30NCitGWF9CT09MIENYRkFfRk0ySlNDb250ZXh0OjpHZXRPYmplY3RCeU5hbWUoDQorICAgIEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgIEZYSlNFX0hWQUxVRSBhY2Nlc3NvclZhbHVlLA0KKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6QWNjZXNzb3JOYW1lKSB7DQorICBGWF9CT09MIGJGbGFncyA9IEZBTFNFOw0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCisgIGlmICghcERvYykgew0KKyAgICByZXR1cm4gYkZsYWdzOw0KKyAgfQ0KKyAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKTsNCisgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvdmVOb2RlUlM7DQorICBGWF9EV09SRCBkd0ZsYWdzID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMgfA0KKyAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQ7DQorICBpbnQzMl90IGlSZXQgPSBwU2NyaXB0Q29udGV4dC0+UmVzb2x2ZU9iamVjdHMoDQorICAgICAgcFNjcmlwdENvbnRleHQtPkdldFRoaXNPYmplY3QoKSwNCisgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pBY2Nlc3Nvck5hbWUuR2V0Q1N0cigpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekFjY2Vzc29yTmFtZS5HZXRMZW5ndGgoKSksDQorICAgICAgcmVzb3ZlTm9kZVJTLCBkd0ZsYWdzKTsNCisgIGlmIChpUmV0ID49IDEgJiYgcmVzb3ZlTm9kZVJTLmR3RmxhZ3MgPT0gWEZBX1JFU09WRU5PREVfUlNUWVBFX05vZGVzKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldChhY2Nlc3NvclZhbHVlLCBwU2NyaXB0Q29udGV4dC0+R2V0SlNWYWx1ZUZyb21NYXAoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3ZlTm9kZVJTLm5vZGVzLkdldEF0KDApKSk7DQorICAgIGJGbGFncyA9IFRSVUU7DQorICB9DQorICByZXR1cm4gYkZsYWdzOw0KK30NCitpbnQzMl90IENYRkFfRk0ySlNDb250ZXh0OjpSZXNvbHZlT2JqZWN0cyhGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoUmVmVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1NvbUV4cCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUlMmIHJlc292ZU5vZGVSUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJkb3RBY2Nlc3NvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJIYXNOb1Jlc29sdmVOYW1lKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1NvbUV4cHJlc3Npb24gPQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1NvbUV4cC5HZXRDU3RyKCksIGJzU29tRXhwLkdldExlbmd0aCgpKTsNCisgIGludDMyX3QgaVJldCA9IC0xOw0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsNCisgIGlmICghcERvYykgew0KKyAgICByZXR1cm4gaVJldDsNCisgIH0NCisgIElYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICBDWEZBX09iamVjdCogcE5vZGUgPSBOVUxMOw0KKyAgRlhfRFdPUkQgZEZsYWdzID0gMFVMOw0KKyAgaWYgKGJkb3RBY2Nlc3Nvcikgew0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNOdWxsKGhSZWZWYWx1ZSkpIHsNCisgICAgICBwTm9kZSA9IHBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCk7DQorICAgICAgZEZsYWdzID0gWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzIHwgWEZBX1JFU09MVkVOT0RFX1BhcmVudDsNCisgICAgfSBlbHNlIHsNCisgICAgICBwTm9kZSA9IChDWEZBX09iamVjdCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFJlZlZhbHVlLCBOVUxMKTsNCisgICAgICBGWFNZU19hc3NlcnQocE5vZGUpOw0KKyAgICAgIGlmIChiSGFzTm9SZXNvbHZlTmFtZSkgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOw0KKyAgICAgICAgaWYgKHBOb2RlLT5Jc05vZGUoKSkgew0KKyAgICAgICAgICBDWEZBX05vZGUqIHBYRkFOb2RlID0gKENYRkFfTm9kZSopcE5vZGU7DQorICAgICAgICAgIHBYRkFOb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUsIEZBTFNFKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICh3c05hbWUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyBjbGFzc05hbWU7DQorICAgICAgICAgIHBOb2RlLT5HZXRDbGFzc05hbWUoY2xhc3NOYW1lKTsNCisgICAgICAgICAgd3NOYW1lID0gRlhfV1NUUkMoTCIjIikgKyBjbGFzc05hbWU7DQorICAgICAgICB9DQorICAgICAgICB3c1NvbUV4cHJlc3Npb24gPSB3c05hbWUgKyB3c1NvbUV4cHJlc3Npb247DQorICAgICAgICBkRmxhZ3MgPSBYRkFfUkVTT0xWRU5PREVfU2libGluZ3M7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGRGbGFncyA9IChic1NvbUV4cCA9PSAiKiIpDQorICAgICAgICAgICAgICAgICAgICAgPyAoWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuKQ0KKyAgICAgICAgICAgICAgICAgICAgIDogKFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzIHwNCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcyk7DQorICAgICAgfQ0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBwTm9kZSA9IChDWEZBX09iamVjdCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFJlZlZhbHVlLCBOVUxMKTsNCisgICAgZEZsYWdzID0gWEZBX1JFU09MVkVOT0RFX0FueUNoaWxkOw0KKyAgfQ0KKyAgaVJldCA9IHBTY3JpcHRDb250ZXh0LT5SZXNvbHZlT2JqZWN0cyhwTm9kZSwgd3NTb21FeHByZXNzaW9uLCByZXNvdmVOb2RlUlMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRGbGFncyk7DQorICByZXR1cm4gaVJldDsNCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6UGFyc2VSZXNvbHZlUmVzdWx0KA0KKyAgICBGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICBjb25zdCBYRkFfUkVTT0xWRU5PREVfUlMmIHJlc292ZU5vZGVSUywNCisgICAgRlhKU0VfSFZBTFVFIGhQYXJlbnRWYWx1ZSwNCisgICAgRlhKU0VfSFZBTFVFKiYgcmVzdWx0VmFsdWVzLA0KKyAgICBpbnQzMl90JiBpU2l6ZSwNCisgICAgRlhfQk9PTCYgYkF0dHJpYnV0ZSkgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIEZYSlNFX0hSVU5USU1FIGhSdW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgIGlTaXplID0gMDsNCisgIHJlc3VsdFZhbHVlcyA9IE5VTEw7DQorICBpZiAocmVzb3ZlTm9kZVJTLmR3RmxhZ3MgPT0gWEZBX1JFU09WRU5PREVfUlNUWVBFX05vZGVzKSB7DQorICAgIGJBdHRyaWJ1dGUgPSBGQUxTRTsNCisgICAgaVNpemUgPSByZXNvdmVOb2RlUlMubm9kZXMuR2V0U2l6ZSgpOw0KKyAgICByZXN1bHRWYWx1ZXMgPSBGWF9BbGxvYyhGWEpTRV9IVkFMVUUsIGlTaXplKTsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7IGkrKykgew0KKyAgICAgIHJlc3VsdFZhbHVlc1tpXSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShoUnVudGltZSk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0KA0KKyAgICAgICAgICByZXN1bHRWYWx1ZXNbaV0sDQorICAgICAgICAgIHBDb250ZXh0LT5HZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKA0KKyAgICAgICAgICAgICAgcmVzb3ZlTm9kZVJTLm5vZGVzLkdldEF0KGkpKSk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIENYRkFfSFZBTFVFQXJyYXkgb2JqZWN0UHJvcGVydGllcyhoUnVudGltZSk7DQorICAgIGludDMyX3QgaVJldCA9IHJlc292ZU5vZGVSUy5HZXRBdHRyaWJ1dGVSZXN1bHQob2JqZWN0UHJvcGVydGllcyk7DQorICAgIGJBdHRyaWJ1dGUgPSAoaVJldCA9PSAwKTsNCisgICAgaWYgKGJBdHRyaWJ1dGUpIHsNCisgICAgICBpZiAoRlhKU0VfVmFsdWVfSXNPYmplY3QoaFBhcmVudFZhbHVlKSkgew0KKyAgICAgICAgaVNpemUgPSAxOw0KKyAgICAgICAgcmVzdWx0VmFsdWVzID0gRlhfQWxsb2MoRlhKU0VfSFZBTFVFLCAxKTsNCisgICAgICAgIHJlc3VsdFZhbHVlc1swXSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShoUnVudGltZSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXQocmVzdWx0VmFsdWVzWzBdLCBoUGFyZW50VmFsdWUpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBpU2l6ZSA9IGlSZXQ7DQorICAgICAgcmVzdWx0VmFsdWVzID0gRlhfQWxsb2MoRlhKU0VfSFZBTFVFLCBpU2l6ZSk7DQorICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7IGkrKykgew0KKyAgICAgICAgcmVzdWx0VmFsdWVzW2ldID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhSdW50aW1lKTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1NldChyZXN1bHRWYWx1ZXNbaV0sIG9iamVjdFByb3BlcnRpZXNbaV0pOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KK30NCitpbnQzMl90IENYRkFfRk0ySlNDb250ZXh0OjpIVmFsdWVUb0ludGVnZXIoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSkgew0KKyAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0NCisgICAgICAoQ1hGQV9GTTJKU0NvbnRleHQqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhUaGlzLCBOVUxMKTsNCisgIEZYSlNFX0hSVU5USU1FIGhydW50aW1lID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsNCisgIGludDMyX3QgaVZhbHVlID0gMDsNCisgIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGhWYWx1ZSkpIHsNCisgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICBGWEpTRV9IVkFMVUUganNvYmplY3RWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChoVmFsdWUsIDEsIHByb3BlcnR5VmFsdWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoaFZhbHVlLCAyLCBqc29iamVjdFZhbHVlKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc29iamVjdFZhbHVlLCBuZXdQcm9wZXJ0eSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgcHJvcGVydHlTdHI7DQorICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKHByb3BlcnR5VmFsdWUsIHByb3BlcnR5U3RyKTsNCisgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzb2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLCBuZXdQcm9wZXJ0eSk7DQorICAgIH0NCisgICAgaVZhbHVlID0gSFZhbHVlVG9JbnRlZ2VyKGhUaGlzLCBuZXdQcm9wZXJ0eSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobmV3UHJvcGVydHkpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGpzb2JqZWN0VmFsdWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHByb3BlcnR5VmFsdWUpOw0KKyAgICByZXR1cm4gaVZhbHVlOw0KKyAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc09iamVjdChoVmFsdWUpKSB7DQorICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShoVmFsdWUsIG5ld1Byb3BlcnR5KTsNCisgICAgaVZhbHVlID0gSFZhbHVlVG9JbnRlZ2VyKGhUaGlzLCBuZXdQcm9wZXJ0eSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UobmV3UHJvcGVydHkpOw0KKyAgICByZXR1cm4gaVZhbHVlOw0KKyAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoaFZhbHVlKSkgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBzelZhbHVlOw0KKyAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBzelZhbHVlKTsNCisgICAgaVZhbHVlID0gRlhTWVNfYXRvaShzelZhbHVlKTsNCisgIH0gZWxzZSB7DQorICAgIGlWYWx1ZSA9IEZYSlNFX1ZhbHVlX1RvSW50ZWdlcihoVmFsdWUpOw0KKyAgfQ0KKyAgcmV0dXJuIGlWYWx1ZTsNCit9DQorRlhfRE9VQkxFIENYRkFfRk0ySlNDb250ZXh0OjpTdHJpbmdUb0RvdWJsZSgNCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelN0cmluZ1ZhbCkgew0KKyAgcmV0dXJuIFhGQV9CeXRlU3RyaW5nVG9Eb3VibGUoc3pTdHJpbmdWYWwpOw0KK30NCitGWF9GTE9BVCBDWEZBX0ZNMkpTQ29udGV4dDo6SFZhbHVlVG9GbG9hdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBhcmcpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICBGWF9GTE9BVCBmUmV0ID0gMC4wZjsNCisgIGlmIChGWEpTRV9WYWx1ZV9Jc0FycmF5KGFyZykpIHsNCisgICAgRlhKU0VfSFZBTFVFIHByb3BlcnR5VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICBGWEpTRV9IVkFMVUUganNvYmplY3RWYWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgIEZYSlNFX0hWQUxVRSBuZXdQcm9wZXJ0eSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShocnVudGltZSk7DQorICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3BCeUlkeChhcmcsIDEsIHByb3BlcnR5VmFsdWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnLCAyLCBqc29iamVjdFZhbHVlKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChwcm9wZXJ0eVZhbHVlKSkgew0KKyAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc29iamVjdFZhbHVlLCBuZXdQcm9wZXJ0eSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgcHJvcGVydHlTdHI7DQorICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKHByb3BlcnR5VmFsdWUsIHByb3BlcnR5U3RyKTsNCisgICAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wKGpzb2JqZWN0VmFsdWUsIHByb3BlcnR5U3RyLCBuZXdQcm9wZXJ0eSk7DQorICAgIH0NCisgICAgZlJldCA9IEhWYWx1ZVRvRmxvYXQoaFRoaXMsIG5ld1Byb3BlcnR5KTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShuZXdQcm9wZXJ0eSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoanNvYmplY3RWYWx1ZSk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UocHJvcGVydHlWYWx1ZSk7DQorICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzT2JqZWN0KGFyZykpIHsNCisgICAgRlhKU0VfSFZBTFVFIG5ld1Byb3BlcnR5ID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGFyZywgbmV3UHJvcGVydHkpOw0KKyAgICBmUmV0ID0gSFZhbHVlVG9GbG9hdChoVGhpcywgbmV3UHJvcGVydHkpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5KTsNCisgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZykpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNPdXRwdXQ7DQorICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhhcmcsIGJzT3V0cHV0KTsNCisgICAgZlJldCA9IChGWF9GTE9BVClTdHJpbmdUb0RvdWJsZShic091dHB1dCk7DQorICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzVW5kZWZpbmVkKGFyZykpIHsNCisgICAgZlJldCA9IDA7DQorICB9IGVsc2Ugew0KKyAgICBmUmV0ID0gRlhKU0VfVmFsdWVfVG9GbG9hdChhcmcpOw0KKyAgfQ0KKyAgcmV0dXJuIGZSZXQ7DQorfQ0KK0ZYX0RPVUJMRSBDWEZBX0ZNMkpTQ29udGV4dDo6SFZhbHVlVG9Eb3VibGUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBhcmcpIHsNCisgIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9DQorICAgICAgKENYRkFfRk0ySlNDb250ZXh0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBGWEpTRV9IUlVOVElNRSBocnVudGltZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7DQorICBGWF9ET1VCTEUgZFJldCA9IDA7DQorICBpZiAoRlhKU0VfVmFsdWVfSXNBcnJheShhcmcpKSB7DQorICAgIEZYSlNFX0hWQUxVRSBwcm9wZXJ0eVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKGhydW50aW1lKTsNCisgICAgRlhKU0VfSFZBTFVFIGpzb2JqZWN0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHkgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9HZXRPYmplY3RQcm9wQnlJZHgoYXJnLCAxLCBwcm9wZXJ0eVZhbHVlKTsNCisgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KGFyZywgMiwganNvYmplY3RWYWx1ZSk7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwocHJvcGVydHlWYWx1ZSkpIHsNCisgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoanNvYmplY3RWYWx1ZSwgbmV3UHJvcGVydHkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIENGWF9CeXRlU3RyaW5nIHByb3BlcnR5U3RyOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhwcm9wZXJ0eVZhbHVlLCBwcm9wZXJ0eVN0cik7DQorICAgICAgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChqc29iamVjdFZhbHVlLCBwcm9wZXJ0eVN0ciwgbmV3UHJvcGVydHkpOw0KKyAgICB9DQorICAgIGRSZXQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHkpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5KTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShqc29iamVjdFZhbHVlKTsNCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShwcm9wZXJ0eVZhbHVlKTsNCisgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNPYmplY3QoYXJnKSkgew0KKyAgICBGWEpTRV9IVkFMVUUgbmV3UHJvcGVydHkgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaHJ1bnRpbWUpOw0KKyAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnLCBuZXdQcm9wZXJ0eSk7DQorICAgIGRSZXQgPSBIVmFsdWVUb0RvdWJsZShoVGhpcywgbmV3UHJvcGVydHkpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG5ld1Byb3BlcnR5KTsNCisgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGFyZykpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNPdXRwdXQ7DQorICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhhcmcsIGJzT3V0cHV0KTsNCisgICAgZFJldCA9IFN0cmluZ1RvRG91YmxlKGJzT3V0cHV0KTsNCisgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNVbmRlZmluZWQoYXJnKSkgew0KKyAgICBkUmV0ID0gMDsNCisgIH0gZWxzZSB7DQorICAgIGRSZXQgPSBGWEpTRV9WYWx1ZV9Ub0RvdWJsZShhcmcpOw0KKyAgfQ0KKyAgcmV0dXJuIGRSZXQ7DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkhWYWx1ZVRvVVRGOFN0cmluZyhGWEpTRV9IVkFMVUUgYXJnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3pPdXRwdXRTdHJpbmcpIHsNCisgIGlmIChGWEpTRV9WYWx1ZV9Jc051bGwoYXJnKSB8fCBGWEpTRV9WYWx1ZV9Jc1VuZGVmaW5lZChhcmcpKSB7DQorICAgIHN6T3V0cHV0U3RyaW5nID0gIiI7DQorICB9IGVsc2UgaWYgKEZYSlNFX1ZhbHVlX0lzQm9vbGVhbihhcmcpKSB7DQorICAgIHN6T3V0cHV0U3RyaW5nID0gRlhKU0VfVmFsdWVfVG9Cb29sZWFuKGFyZykgPyAiMSIgOiAiMCI7DQorICB9IGVsc2Ugew0KKyAgICBzek91dHB1dFN0cmluZyA9ICIiOw0KKyAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoYXJnLCBzek91dHB1dFN0cmluZyk7DQorICB9DQorfQ0KK3N0YXRpYyBGWEpTRV9GVU5DVElPTiBmb3JtY2FsY19mbTJqc19mdW5jdGlvbnNbXSA9IHsNCisgICAgeyJBYnMiLCBDWEZBX0ZNMkpTQ29udGV4dDo6QWJzfSwNCisgICAgeyJBdmciLCBDWEZBX0ZNMkpTQ29udGV4dDo6QXZnfSwNCisgICAgeyJDZWlsIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OkNlaWx9LA0KKyAgICB7IkNvdW50IiwgQ1hGQV9GTTJKU0NvbnRleHQ6OkNvdW50fSwNCisgICAgeyJGbG9vciIsIENYRkFfRk0ySlNDb250ZXh0OjpGbG9vcn0sDQorICAgIHsiTWF4IiwgQ1hGQV9GTTJKU0NvbnRleHQ6Ok1heH0sDQorICAgIHsiTWluIiwgQ1hGQV9GTTJKU0NvbnRleHQ6Ok1pbn0sDQorICAgIHsiTW9kIiwgQ1hGQV9GTTJKU0NvbnRleHQ6Ok1vZH0sDQorICAgIHsiUm91bmQiLCBDWEZBX0ZNMkpTQ29udGV4dDo6Um91bmR9LA0KKyAgICB7IlN1bSIsIENYRkFfRk0ySlNDb250ZXh0OjpTdW19LA0KKyAgICB7IkRhdGUiLCBDWEZBX0ZNMkpTQ29udGV4dDo6RGF0ZX0sDQorICAgIHsiRGF0ZTJOdW0iLCBDWEZBX0ZNMkpTQ29udGV4dDo6RGF0ZTJOdW19LA0KKyAgICB7IkRhdGVGbXQiLCBDWEZBX0ZNMkpTQ29udGV4dDo6RGF0ZUZtdH0sDQorICAgIHsiSXNvRGF0ZTJOdW0iLCBDWEZBX0ZNMkpTQ29udGV4dDo6SXNvRGF0ZTJOdW19LA0KKyAgICB7Iklzb1RpbWUyTnVtIiwgQ1hGQV9GTTJKU0NvbnRleHQ6Oklzb1RpbWUyTnVtfSwNCisgICAgeyJMb2NhbERhdGVGbXQiLCBDWEZBX0ZNMkpTQ29udGV4dDo6TG9jYWxEYXRlRm10fSwNCisgICAgeyJMb2NhbFRpbWVGbXQiLCBDWEZBX0ZNMkpTQ29udGV4dDo6TG9jYWxUaW1lRm10fSwNCisgICAgeyJOdW0yRGF0ZSIsIENYRkFfRk0ySlNDb250ZXh0OjpOdW0yRGF0ZX0sDQorICAgIHsiTnVtMkdNVGltZSIsIENYRkFfRk0ySlNDb250ZXh0OjpOdW0yR01UaW1lfSwNCisgICAgeyJOdW0yVGltZSIsIENYRkFfRk0ySlNDb250ZXh0OjpOdW0yVGltZX0sDQorICAgIHsiVGltZSIsIENYRkFfRk0ySlNDb250ZXh0OjpUaW1lfSwNCisgICAgeyJUaW1lMk51bSIsIENYRkFfRk0ySlNDb250ZXh0OjpUaW1lMk51bX0sDQorICAgIHsiVGltZUZtdCIsIENYRkFfRk0ySlNDb250ZXh0OjpUaW1lRm10fSwNCisgICAgeyJBcHIiLCBDWEZBX0ZNMkpTQ29udGV4dDo6QXByfSwNCisgICAgeyJDdGVybSIsIENYRkFfRk0ySlNDb250ZXh0OjpDVGVybX0sDQorICAgIHsiRlYiLCBDWEZBX0ZNMkpTQ29udGV4dDo6RlZ9LA0KKyAgICB7IklwbXQiLCBDWEZBX0ZNMkpTQ29udGV4dDo6SVBtdH0sDQorICAgIHsiTlBWIiwgQ1hGQV9GTTJKU0NvbnRleHQ6Ok5QVn0sDQorICAgIHsiUG10IiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlBtdH0sDQorICAgIHsiUFBtdCIsIENYRkFfRk0ySlNDb250ZXh0OjpQUG10fSwNCisgICAgeyJQViIsIENYRkFfRk0ySlNDb250ZXh0OjpQVn0sDQorICAgIHsiUmF0ZSIsIENYRkFfRk0ySlNDb250ZXh0OjpSYXRlfSwNCisgICAgeyJUZXJtIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlRlcm19LA0KKyAgICB7IkNob29zZSIsIENYRkFfRk0ySlNDb250ZXh0OjpDaG9vc2V9LA0KKyAgICB7IkV4aXN0cyIsIENYRkFfRk0ySlNDb250ZXh0OjpFeGlzdHN9LA0KKyAgICB7Ikhhc1ZhbHVlIiwgQ1hGQV9GTTJKU0NvbnRleHQ6Okhhc1ZhbHVlfSwNCisgICAgeyJPbmVvZiIsIENYRkFfRk0ySlNDb250ZXh0OjpPbmVvZn0sDQorICAgIHsiV2l0aGluIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OldpdGhpbn0sDQorICAgIHsiSWYiLCBDWEZBX0ZNMkpTQ29udGV4dDo6SWZ9LA0KKyAgICB7IkV2YWwiLCBDWEZBX0ZNMkpTQ29udGV4dDo6RXZhbH0sDQorICAgIHsiVHJhbnNsYXRlIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OmV2YWxfdHJhbnNsYXRpb259LA0KKyAgICB7IlJlZiIsIENYRkFfRk0ySlNDb250ZXh0OjpSZWZ9LA0KKyAgICB7IlVuaXRUeXBlIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlVuaXRUeXBlfSwNCisgICAgeyJVbml0VmFsdWUiLCBDWEZBX0ZNMkpTQ29udGV4dDo6VW5pdFZhbHVlfSwNCisgICAgeyJBdCIsIENYRkFfRk0ySlNDb250ZXh0OjpBdH0sDQorICAgIHsiQ29uY2F0IiwgQ1hGQV9GTTJKU0NvbnRleHQ6OkNvbmNhdH0sDQorICAgIHsiRGVjb2RlIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OkRlY29kZX0sDQorICAgIHsiRW5jb2RlIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OkVuY29kZX0sDQorICAgIHsiRm9ybWF0IiwgQ1hGQV9GTTJKU0NvbnRleHQ6OkZvcm1hdH0sDQorICAgIHsiTGVmdCIsIENYRkFfRk0ySlNDb250ZXh0OjpMZWZ0fSwNCisgICAgeyJMZW4iLCBDWEZBX0ZNMkpTQ29udGV4dDo6TGVufSwNCisgICAgeyJMb3dlciIsIENYRkFfRk0ySlNDb250ZXh0OjpMb3dlcn0sDQorICAgIHsiTHRyaW0iLCBDWEZBX0ZNMkpTQ29udGV4dDo6THRyaW19LA0KKyAgICB7IlBhcnNlIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlBhcnNlfSwNCisgICAgeyJSZXBsYWNlIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlJlcGxhY2V9LA0KKyAgICB7IlJpZ2h0IiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlJpZ2h0fSwNCisgICAgeyJSdHJpbSIsIENYRkFfRk0ySlNDb250ZXh0OjpSdHJpbX0sDQorICAgIHsiU3BhY2UiLCBDWEZBX0ZNMkpTQ29udGV4dDo6U3BhY2V9LA0KKyAgICB7IlN0ciIsIENYRkFfRk0ySlNDb250ZXh0OjpTdHJ9LA0KKyAgICB7IlN0dWZmIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlN0dWZmfSwNCisgICAgeyJTdWJzdHIiLCBDWEZBX0ZNMkpTQ29udGV4dDo6U3Vic3RyfSwNCisgICAgeyJVdWlkIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlV1aWR9LA0KKyAgICB7IlVwcGVyIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlVwcGVyfSwNCisgICAgeyJXb3JkTnVtIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OldvcmROdW19LA0KKyAgICB7IkdldCIsIENYRkFfRk0ySlNDb250ZXh0OjpHZXR9LA0KKyAgICB7IlBvc3QiLCBDWEZBX0ZNMkpTQ29udGV4dDo6UG9zdH0sDQorICAgIHsiUHV0IiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlB1dH0sDQorICAgIHsicG9zaXRpdmVfb3BlcmF0b3IiLCBDWEZBX0ZNMkpTQ29udGV4dDo6cG9zaXRpdmVfb3BlcmF0b3J9LA0KKyAgICB7Im5lZ2F0aXZlX29wZXJhdG9yIiwgQ1hGQV9GTTJKU0NvbnRleHQ6Om5lZ2F0aXZlX29wZXJhdG9yfSwNCisgICAgeyJsb2dpY2FsX29yX29wZXJhdG9yIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OmxvZ2ljYWxfb3Jfb3BlcmF0b3J9LA0KKyAgICB7ImxvZ2ljYWxfYW5kX29wZXJhdG9yIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OmxvZ2ljYWxfYW5kX29wZXJhdG9yfSwNCisgICAgeyJsb2dpY2FsX25vdF9vcGVyYXRvciIsIENYRkFfRk0ySlNDb250ZXh0Ojpsb2dpY2FsX25vdF9vcGVyYXRvcn0sDQorICAgIHsiZXF1YWxpdHlfb3BlcmF0b3IiLCBDWEZBX0ZNMkpTQ29udGV4dDo6ZXF1YWxpdHlfb3BlcmF0b3J9LA0KKyAgICB7Im5vdGVxdWFsaXR5X29wZXJhdG9yIiwgQ1hGQV9GTTJKU0NvbnRleHQ6Om5vdGVxdWFsaXR5X29wZXJhdG9yfSwNCisgICAgeyJsZXNzX29wZXJhdG9yIiwgQ1hGQV9GTTJKU0NvbnRleHQ6Omxlc3Nfb3BlcmF0b3J9LA0KKyAgICB7Imxlc3NlcXVhbF9vcGVyYXRvciIsIENYRkFfRk0ySlNDb250ZXh0OjpsZXNzZXF1YWxfb3BlcmF0b3J9LA0KKyAgICB7ImdyZWF0ZXJfb3BlcmF0b3IiLCBDWEZBX0ZNMkpTQ29udGV4dDo6Z3JlYXRlcl9vcGVyYXRvcn0sDQorICAgIHsiZ3JlYXRlcmVxdWFsX29wZXJhdG9yIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OmdyZWF0ZXJlcXVhbF9vcGVyYXRvcn0sDQorICAgIHsicGx1c19vcGVyYXRvciIsIENYRkFfRk0ySlNDb250ZXh0OjpwbHVzX29wZXJhdG9yfSwNCisgICAgeyJtaW51c19vcGVyYXRvciIsIENYRkFfRk0ySlNDb250ZXh0OjptaW51c19vcGVyYXRvcn0sDQorICAgIHsibXVsdGlwbGVfb3BlcmF0b3IiLCBDWEZBX0ZNMkpTQ29udGV4dDo6bXVsdGlwbGVfb3BlcmF0b3J9LA0KKyAgICB7ImRpdmlkZV9vcGVyYXRvciIsIENYRkFfRk0ySlNDb250ZXh0OjpkaXZpZGVfb3BlcmF0b3J9LA0KKyAgICB7ImFzc2lnbl92YWx1ZV9vcGVyYXRvciIsIENYRkFfRk0ySlNDb250ZXh0Ojphc3NpZ25fdmFsdWVfb3BlcmF0b3J9LA0KKyAgICB7ImRvdF9hY2Nlc3NvciIsIENYRkFfRk0ySlNDb250ZXh0Ojpkb3RfYWNjZXNzb3J9LA0KKyAgICB7ImRvdGRvdF9hY2Nlc3NvciIsIENYRkFfRk0ySlNDb250ZXh0Ojpkb3Rkb3RfYWNjZXNzb3J9LA0KKyAgICB7ImNvbmNhdF9mbV9vYmplY3QiLCBDWEZBX0ZNMkpTQ29udGV4dDo6Y29uY2F0X2ZtX29iamVjdH0sDQorICAgIHsiaXNfZm1fb2JqZWN0IiwgQ1hGQV9GTTJKU0NvbnRleHQ6OmlzX2ZtX29iamVjdH0sDQorICAgIHsiaXNfZm1fYXJyYXkiLCBDWEZBX0ZNMkpTQ29udGV4dDo6aXNfZm1fYXJyYXl9LA0KKyAgICB7ImdldF9mbV92YWx1ZSIsIENYRkFfRk0ySlNDb250ZXh0OjpnZXRfZm1fdmFsdWV9LA0KKyAgICB7ImdldF9mbV9qc29iaiIsIENYRkFfRk0ySlNDb250ZXh0OjpnZXRfZm1fanNvYmp9LA0KKyAgICB7ImZtX3Zhcl9maWx0ZXIiLCBDWEZBX0ZNMkpTQ29udGV4dDo6Zm1fdmFyX2ZpbHRlcn0sDQorfTsNCitDWEZBX0ZNMkpTQ29udGV4dDo6Q1hGQV9GTTJKU0NvbnRleHQoKQ0KKyAgICA6IG1faEZNQ2xhc3MobnVsbHB0ciksIG1fcERvY3VtZW50KG51bGxwdHIpIHsNCisgIEZYX21lbXNldCgmbV9mbUNsYXNzLCAwLCBzaXplb2YoRlhKU0VfQ0xBU1MpKTsNCit9DQorQ1hGQV9GTTJKU0NvbnRleHQ6On5DWEZBX0ZNMkpTQ29udGV4dCgpIHsNCisgIG1fcERvY3VtZW50ID0gTlVMTDsNCisgIGlmIChtX2hWYWx1ZSkgew0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKG1faFZhbHVlKTsNCisgICAgbV9oVmFsdWUgPSBOVUxMOw0KKyAgfQ0KKyAgbV9oU2NyaXB0UnVudGltZSA9IE5VTEw7DQorfQ0KK0NYRkFfRk0ySlNDb250ZXh0KiBDWEZBX0ZNMkpTQ29udGV4dDo6Q3JlYXRlKCkgew0KKyAgcmV0dXJuIG5ldyBDWEZBX0ZNMkpTQ29udGV4dDsNCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6SW5pdGlhbGl6ZShGWEpTRV9IUlVOVElNRSBoU2NyaXB0UnVudGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hDT05URVhUIGhTY3JpcHRDb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Eb2N1bWVudCogcERvYykgew0KKyAgbV9wRG9jdW1lbnQgPSBwRG9jOw0KKyAgbV9oU2NyaXB0UnVudGltZSA9IGhTY3JpcHRSdW50aW1lOw0KKyAgbV9mbUNsYXNzLm5hbWUgPSAiWEZBX0ZNMkpTX0Zvcm1DYWxjQ2xhc3MiOw0KKyAgbV9mbUNsYXNzLmNvbnN0cnVjdG9yID0gTlVMTDsNCisgIG1fZm1DbGFzcy5wcm9wZXJ0aWVzID0gTlVMTDsNCisgIG1fZm1DbGFzcy5tZXRob2RzID0gZm9ybWNhbGNfZm0yanNfZnVuY3Rpb25zOw0KKyAgbV9mbUNsYXNzLnByb3BOdW0gPSAwOw0KKyAgbV9mbUNsYXNzLm1ldGhOdW0gPQ0KKyAgICAgIHNpemVvZihmb3JtY2FsY19mbTJqc19mdW5jdGlvbnMpIC8gc2l6ZW9mKGZvcm1jYWxjX2ZtMmpzX2Z1bmN0aW9uc1swXSk7DQorICBtX2hGTUNsYXNzID0gRlhKU0VfRGVmaW5lQ2xhc3MoaFNjcmlwdENvbnRleHQsICZtX2ZtQ2xhc3MpOw0KKyAgbV9oVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUoaFNjcmlwdFJ1bnRpbWUpOw0KKyAgRlhKU0VfVmFsdWVfU2V0TnVsbChtX2hWYWx1ZSk7DQorICBGWEpTRV9WYWx1ZV9TZXRPYmplY3QobV9oVmFsdWUsIHRoaXMsIG1faEZNQ2xhc3MpOw0KK30NCit2b2lkIENYRkFfRk0ySlNDb250ZXh0OjpHbG9iYWxQcm9wZXJ0eUdldHRlcihGWEpTRV9IVkFMVUUgaFZhbHVlKSB7DQorICBGWEpTRV9WYWx1ZV9TZXQoaFZhbHVlLCBtX2hWYWx1ZSk7DQorfQ0KK3ZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlJlbGVhc2UoKSB7DQorICBkZWxldGUgdGhpczsNCit9DQordm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6VGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoaW50MzJfdCBpU3RyaW5nSUQsIC4uLikgew0KKyAgSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyID0gbV9wRG9jdW1lbnQtPkdldE5vdGlmeSgpLT5HZXRBcHBQcm92aWRlcigpOw0KKyAgRlhTWVNfYXNzZXJ0KHBBcHBQcm92aWRlcik7DQorICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdDsNCisgIHBBcHBQcm92aWRlci0+TG9hZFN0cmluZyhpU3RyaW5nSUQsIHdzRm9ybWF0KTsNCisgIENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZTsNCisgIHZhX2xpc3QgYXJnX3B0cjsNCisgIHZhX3N0YXJ0KGFyZ19wdHIsIGlTdHJpbmdJRCk7DQorICB3c01lc3NhZ2UuRm9ybWF0VigoY29uc3QgRlhfV0NIQVIqKXdzRm9ybWF0LCBhcmdfcHRyKTsNCisgIHZhX2VuZChhcmdfcHRyKTsNCisgIEZYSlNFX1Rocm93TWVzc2FnZSgiIiwgRlhfVVRGOEVuY29kZSh3c01lc3NhZ2UsIHdzTWVzc2FnZS5HZXRMZW5ndGgoKSkpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbTJqc2NvbnRleHQuaCBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2ZtMmpzY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZjBhNzcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbTJqc2NvbnRleHQuaApAQCAtMCwwICsxLDQ0OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfRk0ySlNfQ09OVEVYVF9IDQorI2RlZmluZSBfWEZBX0ZNMkpTX0NPTlRFWFRfSA0KK2NsYXNzIENYRkFfRk0ySlNDb250ZXh0IHsNCisgcHVibGljOg0KKyAgc3RhdGljIHZvaWQgQWJzKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgQXZnKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgQ2VpbChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgQ291bnQoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgRmxvb3IoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgTWF4KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgTWluKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgTW9kKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgUm91bmQoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgU3VtKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgRGF0ZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgRGF0ZTJOdW0oRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgRGF0ZUZtdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgSXNvRGF0ZTJOdW0oRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgSXNvVGltZTJOdW0oRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgTG9jYWxEYXRlRm10KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgTG9jYWxUaW1lRm10KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgTnVtMkRhdGUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgTnVtMkdNVGltZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgTnVtMlRpbWUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgVGltZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgVGltZTJOdW0oRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgVGltZUZtdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKw0KKyAgc3RhdGljIEZYX0JPT0wgSXNJc29EYXRlRm9ybWF0KGNvbnN0IEZYX0NIQVIqIHBEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVllYXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlEYXkpOw0KKyAgc3RhdGljIEZYX0JPT0wgSXNJc29UaW1lRm9ybWF0KGNvbnN0IEZYX0NIQVIqIHBEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSG91ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTWludXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlTZWNvbmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1pbGxpU2Vjb25kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlab25lSG91ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpWm9uZU1pbnV0ZSk7DQorICBzdGF0aWMgRlhfQk9PTCBJc0lzb0RhdGVUaW1lRm9ybWF0KGNvbnN0IEZYX0NIQVIqIHBEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlZZWFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlEYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlIb3VyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTWludXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpU2Vjb25kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTWlsbGlvblNlY29uZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVpvbmVIb3VyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpWm9uZU1pbnV0ZSk7DQorICBzdGF0aWMgRlhfQk9PTCBMb2NhbDJJc29EYXRlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pEYXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6Rm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RySXNvRGF0ZSk7DQorICBzdGF0aWMgRlhfQk9PTCBMb2NhbDJJc29UaW1lKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pUaW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6Rm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RySXNvVGltZSk7DQorICBzdGF0aWMgRlhfQk9PTCBJc29EYXRlMkxvY2FsKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pEYXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6Rm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyTG9jYWxEYXRlKTsNCisgIHN0YXRpYyBGWF9CT09MIElzb1RpbWUyTG9jYWwoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelRpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzdHJMb2NhbFRpbWUpOw0KKyAgc3RhdGljIEZYX0JPT0wgR2V0R01UVGltZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6VGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0ckdNVFRpbWUpOw0KKyAgc3RhdGljIGludDMyX3QgRGF0ZVN0cmluZzJOdW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekRhdGVTdHJpbmcpOw0KKyAgc3RhdGljIHZvaWQgR2V0TG9jYWxEYXRlRm9ybWF0KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzdHJGb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RhbmRhcmQpOw0KKyAgc3RhdGljIHZvaWQgR2V0TG9jYWxUaW1lRm9ybWF0KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzdHJGb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RhbmRhcmQpOw0KKyAgc3RhdGljIHZvaWQgR2V0U3RhbmRhcmREYXRlRm9ybWF0KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzdHJGb3JtYXQpOw0KKyAgc3RhdGljIHZvaWQgR2V0U3RhbmRhcmRUaW1lRm9ybWF0KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzdHJGb3JtYXQpOw0KKw0KKyAgc3RhdGljIHZvaWQgTnVtMkFsbFRpbWUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVRpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6Rm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkdNLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0clRpbWUpOw0KKyAgc3RhdGljIHZvaWQgR2V0TG9jYWxUaW1lWm9uZShpbnQzMl90JiBpSG91ciwgaW50MzJfdCYgaU1pbiwgaW50MzJfdCYgaVNlYyk7DQorDQorICBzdGF0aWMgdm9pZCBBcHIoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBDVGVybShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBGVihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBJUG10KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBOUFYoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBQbXQoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBQUG10KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBQVihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBSYXRlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBUZXJtKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBDaG9vc2UoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBFeGlzdHMoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBIYXNWYWx1ZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBPbmVvZihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBXaXRoaW4oRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBJZihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBFdmFsKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBSZWYoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBVbml0VHlwZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBVbml0VmFsdWUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorDQorICBzdGF0aWMgdm9pZCBBdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBDb25jYXQoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBEZWNvZGUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBEZWNvZGVVUkwoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelVSTFN0cmluZywNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVRleHRCdWYmIHN6UmVzdWx0QnVmKTsNCisgIHN0YXRpYyB2b2lkIERlY29kZUhUTUwoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekhUTUxTdHJpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiYgc3pSZXN1bHRCdWYpOw0KKyAgc3RhdGljIHZvaWQgRGVjb2RlWE1MKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pYTUxTdHJpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmJiBzelJlc3VsdEJ1Zik7DQorICBzdGF0aWMgdm9pZCBFbmNvZGUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgdm9pZCBFbmNvZGVVUkwoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelVSTFN0cmluZywNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVRleHRCdWYmIHN6UmVzdWx0QnVmKTsNCisgIHN0YXRpYyB2b2lkIEVuY29kZUhUTUwoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekhUTUxTdHJpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiYgc3pSZXN1bHRCdWYpOw0KKyAgc3RhdGljIHZvaWQgRW5jb2RlWE1MKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pYTUxTdHJpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmJiBzelJlc3VsdEJ1Zik7DQorICBzdGF0aWMgRlhfQk9PTCBIVE1MU1RSMkNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBwRGF0YSwgdWludDMyX3QmIGlDb2RlKTsNCisgIHN0YXRpYyBGWF9CT09MIEhUTUxDb2RlMlNUUih1aW50MzJfdCBpQ29kZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzSFRNTFJlc2VydmUpOw0KKyAgc3RhdGljIHZvaWQgRm9ybWF0KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgTGVmdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgTGVuKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgTG93ZXIoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgTHRyaW0oRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgUGFyc2UoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgUmVwbGFjZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgUmlnaHQoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgUnRyaW0oRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgU3BhY2UoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgU3RyKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgU3R1ZmYoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgU3Vic3RyKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgVXVpZChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgVXBwZXIoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgV29yZE51bShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOw0KKyAgc3RhdGljIHZvaWQgVHJpbGxpb25VUyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmJiBzdHJCdWYpOw0KKyAgc3RhdGljIHZvaWQgV29yZFVTKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pEYXRhLA0KKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0eWxlLA0KKyAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiYgc3RyQnVmKTsNCisNCisgIHN0YXRpYyB2b2lkIEdldChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIFBvc3QoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIFB1dChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGFzc2lnbl92YWx1ZV9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGxvZ2ljYWxfb3Jfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGxvZ2ljYWxfYW5kX29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGVxdWFsaXR5X29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIG5vdGVxdWFsaXR5X29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyBGWF9CT09MIGZtX3JlZl9lcXVhbChGWEpTRV9IT0JKRUNUIGhUaGlzLCBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGxlc3Nfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGxlc3NlcXVhbF9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGdyZWF0ZXJfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGdyZWF0ZXJlcXVhbF9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIHBsdXNfb3BlcmF0b3IoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIG1pbnVzX29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIG11bHRpcGxlX29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGRpdmlkZV9vcGVyYXRvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIHBvc2l0aXZlX29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIG5lZ2F0aXZlX29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGxvZ2ljYWxfbm90X29wZXJhdG9yKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGRvdF9hY2Nlc3NvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGRvdGRvdF9hY2Nlc3NvcihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGV2YWxfdHJhbnNsYXRpb24oRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGlzX2ZtX29iamVjdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGlzX2ZtX2FycmF5KEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGdldF9mbV92YWx1ZShGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGdldF9mbV9qc29iaihGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGZtX3Zhcl9maWx0ZXIoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisgIHN0YXRpYyB2b2lkIGNvbmNhdF9mbV9vYmplY3QoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsNCisNCisgIHN0YXRpYyBpbnQzMl90IGh2YWx1ZV9nZXRfYXJyYXlfbGVuZ3RoKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYSlNFX0hWQUxVRSBhcmcpOw0KKyAgc3RhdGljIEZYX0JPT0wgc2ltcGxlVmFsdWVDb21wYXJlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGZpcnN0VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIHNlY29uZFZhbHVlKTsNCisgIHN0YXRpYyB2b2lkIHVuZm9sZEFyZ3MoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFKiYgcmVzdWx0VmFsdWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0ID0gMCk7DQorICBzdGF0aWMgdm9pZCBHZXRPYmplY3REZWZhdWx0VmFsdWUoRlhKU0VfSFZBTFVFIGhPYmplY3RWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaERlZmF1bHRWYWx1ZSk7DQorICBzdGF0aWMgRlhfQk9PTCBTZXRPYmplY3REZWZhdWx0VmFsdWUoRlhKU0VfSFZBTFVFIGhPYmplY3RWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaE5ld1ZhbHVlKTsNCisgIHN0YXRpYyB2b2lkIEdlbmVyYXRlU29tRXhwcmVzc2lvbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlJbmRleEZsYWdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUluZGV4VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNTdGFyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzelNvbUV4cCk7DQorICBzdGF0aWMgRlhfQk9PTCBHZXRPYmplY3RCeU5hbWUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgYWNjZXNzb3JWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6QWNjZXNzb3JOYW1lKTsNCisgIHN0YXRpYyBpbnQzMl90IFJlc29sdmVPYmplY3RzKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFBhcmVudFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1NvbUV4cCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9SUyYgcmVzb3ZlTm9kZVJTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiZG90QWNjZXNzb3IgPSBUUlVFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSGFzTm9SZXNvbHZlTmFtZSA9IEZBTFNFKTsNCisgIHN0YXRpYyB2b2lkIFBhcnNlUmVzb2x2ZVJlc3VsdChGWEpTRV9IT0JKRUNUIGhUaGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhGQV9SRVNPTFZFTk9ERV9SUyYgcmVzb3ZlTm9kZVJTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoUGFyZW50VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFKiYgcmVzdWx0VmFsdWVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlTaXplLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJBdHRyaWJ1dGUpOw0KKw0KKyAgc3RhdGljIEZYSlNFX0hWQUxVRSBHZXRTaW1wbGVIVmFsdWUoRlhKU0VfSE9CSkVDVCBoVGhpcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbmRleCk7DQorICBzdGF0aWMgRlhfQk9PTCBIVmFsdWVJc051bGwoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorICBzdGF0aWMgaW50MzJfdCBIVmFsdWVUb0ludGVnZXIoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorICBzdGF0aWMgRlhfRE9VQkxFIFN0cmluZ1RvRG91YmxlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pTdHJpbmdWYWwpOw0KKyAgc3RhdGljIEZYX0ZMT0FUIEhWYWx1ZVRvRmxvYXQoRlhKU0VfSE9CSkVDVCBoVGhpcywgRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorICBzdGF0aWMgRlhfRE9VQkxFIEhWYWx1ZVRvRG91YmxlKEZYSlNFX0hPQkpFQ1QgaFRoaXMsIEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KKyAgc3RhdGljIHZvaWQgSFZhbHVlVG9VVEY4U3RyaW5nKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIG91dHB1dFZhbHVlKTsNCisgIENYRkFfRk0ySlNDb250ZXh0KCk7DQorICB+Q1hGQV9GTTJKU0NvbnRleHQoKTsNCisgIHN0YXRpYyBDWEZBX0ZNMkpTQ29udGV4dCogQ3JlYXRlKCk7DQorICB2b2lkIEluaXRpYWxpemUoRlhKU0VfSFJVTlRJTUUgaFNjcmlwdFJ1bnRpbWUsDQorICAgICAgICAgICAgICAgICAgRlhKU0VfSENPTlRFWFQgaFNjcmlwdENvbnRleHQsDQorICAgICAgICAgICAgICAgICAgQ1hGQV9Eb2N1bWVudCogcERvYyk7DQorICB2b2lkIEdsb2JhbFByb3BlcnR5R2V0dGVyKEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KKyAgdm9pZCBSZWxlYXNlKCk7DQorICBGWEpTRV9IUlVOVElNRSBHZXRTY3JpcHRSdW50aW1lKCkgY29uc3QgeyByZXR1cm4gbV9oU2NyaXB0UnVudGltZTsgfQ0KKyAgQ1hGQV9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BEb2N1bWVudDsgfQ0KKyAgdm9pZCBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShpbnQzMl90IGlTdHJpbmdJRCwgLi4uKTsNCisNCisgcHJpdmF0ZToNCisgIEZYSlNFX0hSVU5USU1FIG1faFNjcmlwdFJ1bnRpbWU7DQorICBGWEpTRV9DTEFTUyBtX2ZtQ2xhc3M7DQorICBGWEpTRV9IQ0xBU1MgbV9oRk1DbGFzczsNCisgIEZYSlNFX0hWQUxVRSBtX2hWYWx1ZTsNCisgIENYRkFfRG9jdW1lbnQqIG1fcERvY3VtZW50Ow0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm1wYXJzZS5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbXBhcnNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTA0YWFlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm1wYXJzZS5jcHAKQEAgLTAsMCArMSwxMTUyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmFfZm0yanMuaCINCitDWEZBX0ZNUGFyc2U6OkNYRkFfRk1QYXJzZSgpIHsNCisgIG1fcFNjcmlwdCA9IDA7DQorICBtX3VMZW5ndGggPSAwOw0KKyAgbV9wRXJyb3JJbmZvID0gMDsNCisgIG1fbGV4ZXIgPSAwOw0KKyAgbV9wVG9rZW4gPSAwOw0KK30NCitDWEZBX0ZNUGFyc2U6On5DWEZBX0ZNUGFyc2UoKSB7DQorICBpZiAobV9sZXhlcikgew0KKyAgICBkZWxldGUgbV9sZXhlcjsNCisgIH0NCisgIG1fbGV4ZXIgPSAwOw0KKyAgbV9wRXJyb3JJbmZvID0gMDsNCisgIG1fcFNjcmlwdCA9IDA7DQorICBtX3BUb2tlbiA9IDA7DQorfQ0KK2ludDMyX3QgQ1hGQV9GTVBhcnNlOjpJbml0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb3JtY2FsYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNRXJyb3JJbmZvKiBwRXJyb3JJbmZvKSB7DQorICBtX3BTY3JpcHQgPSB3c0Zvcm1jYWxjLkdldFB0cigpOw0KKyAgbV91TGVuZ3RoID0gd3NGb3JtY2FsYy5HZXRMZW5ndGgoKTsNCisgIG1fcEVycm9ySW5mbyA9IHBFcnJvckluZm87DQorICBtX2xleGVyID0gbmV3IENYRkFfRk1MZXhlcih3c0Zvcm1jYWxjLCBtX3BFcnJvckluZm8pOw0KKyAgaWYgKG1fbGV4ZXIgPT0gMCkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICByZXR1cm4gMDsNCit9DQordm9pZCBDWEZBX0ZNUGFyc2U6Ok5leHRUb2tlbigpIHsNCisgIG1fcFRva2VuID0gbV9sZXhlci0+TmV4dFRva2VuKCk7DQorICB3aGlsZSAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tyZXNlcnZlcikgew0KKyAgICBpZiAobV9sZXhlci0+SGFzRXJyb3IoKSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIG1fcFRva2VuID0gbV9sZXhlci0+TmV4dFRva2VuKCk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTVBhcnNlOjpDaGVjayhYRkFfRk1fVE9LRU4gb3ApIHsNCisgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IG9wKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfRVhQRUNURURfVE9LRU4sDQorICAgICAgICAgIFhGQV9GTV9LZXl3b3JkVG9TdHJpbmcob3ApLCB3c19UZW1wU3RyaW5nLmNfc3RyKCkpOw0KKyAgfQ0KKyAgTmV4dFRva2VuKCk7DQorfQ0KK3ZvaWQgQ1hGQV9GTVBhcnNlOjpFcnJvcihGWF9EV09SRCBsaW5lTnVtLCBYRkFfRk1fRVJSTVNHIG1zZywgLi4uKSB7DQorICBtX3BFcnJvckluZm8tPmxpbmVudW0gPSBsaW5lTnVtOw0KKyAgY29uc3QgRlhfV0NIQVIqIGxwTWVzc2FnZUluZm8gPSBYRkFfRk1fRXJyb3JNc2cobXNnKTsNCisgIHZhX2xpc3QgYXA7DQorICB2YV9zdGFydChhcCwgbXNnKTsNCisgIG1fcEVycm9ySW5mby0+bWVzc2FnZS5Gb3JtYXRWKGxwTWVzc2FnZUluZm8sIGFwKTsNCisgIHZhX2VuZChhcCk7DQorfQ0KK0NGWF9QdHJBcnJheSogQ1hGQV9GTVBhcnNlOjpQYXJzZVRvcEV4cHJlc3Npb24oKSB7DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogZSA9IDA7DQorICBDRlhfUHRyQXJyYXkqIGV4cHJlc3Npb24gPSBuZXcgQ0ZYX1B0ckFycmF5KCk7DQorICB3aGlsZSAoMSkgew0KKyAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tlb2YpIHsNCisgICAgICByZXR1cm4gZXhwcmVzc2lvbjsNCisgICAgfQ0KKyAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tlbmRmdW5jKSB7DQorICAgICAgcmV0dXJuIGV4cHJlc3Npb247DQorICAgIH0NCisgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LZW5kaWYpIHsNCisgICAgICByZXR1cm4gZXhwcmVzc2lvbjsNCisgICAgfQ0KKyAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tlbHNlaWYpIHsNCisgICAgICByZXR1cm4gZXhwcmVzc2lvbjsNCisgICAgfQ0KKyAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tlbHNlKSB7DQorICAgICAgcmV0dXJuIGV4cHJlc3Npb247DQorICAgIH0NCisgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LZnVuYykgew0KKyAgICAgIGUgPSBQYXJzZUZ1bmN0aW9uKCk7DQorICAgICAgaWYgKGUpIHsNCisgICAgICAgIGV4cHJlc3Npb24tPkFkZChlKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGUgPSBQYXJzZUV4cHJlc3Npb24oKTsNCisgICAgICBpZiAoZSkgew0KKyAgICAgICAgZXhwcmVzc2lvbi0+QWRkKGUpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBleHByZXNzaW9uOw0KK30NCitDWEZBX0ZNRXhwcmVzc2lvbiogQ1hGQV9GTVBhcnNlOjpQYXJzZUZ1bmN0aW9uKCkgew0KKyAgQ1hGQV9GTUV4cHJlc3Npb24qIGUgPSAwOw0KKyAgQ0ZYX1dpZGVTdHJpbmdDIGlkZW50Ow0KKyAgQ0ZYX1dpZGVTdHJpbmdDQXJyYXkqIHBBcmd1bWVudHMgPSAwOw0KKyAgQ0ZYX1B0ckFycmF5KiBwRXhwcmVzc2lvbnMgPSAwOw0KKyAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgTmV4dFRva2VuKCk7DQorICBpZiAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tpZGVudGlmaWVyKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfRVhQRUNURURfSURFTlRJRklFUiwNCisgICAgICAgICAgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsNCisgIH0gZWxzZSB7DQorICAgIGlkZW50ID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgTmV4dFRva2VuKCk7DQorICB9DQorICBDaGVjayhUT0tscGFyZW4pOw0KKyAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LcnBhcmVuKSB7DQorICAgIE5leHRUb2tlbigpOw0KKyAgfSBlbHNlIHsNCisgICAgcEFyZ3VtZW50cyA9IG5ldyBDRlhfV2lkZVN0cmluZ0NBcnJheSgpOw0KKyAgICBDRlhfV2lkZVN0cmluZ0MgcDsNCisgICAgd2hpbGUgKDEpIHsNCisgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tpZGVudGlmaWVyKSB7DQorICAgICAgICBwID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgICAgIHBBcmd1bWVudHMtPkFkZChwKTsNCisgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LY29tbWEpIHsNCisgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfSBlbHNlIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS3JwYXJlbikgew0KKyAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBDaGVjayhUT0tycGFyZW4pOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICAgICAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfRVhQRUNURURfSURFTlRJRklFUiwNCisgICAgICAgICAgICAgIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7DQorICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgQ2hlY2soVE9LZG8pOw0KKyAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LZW5kZnVuYykgew0KKyAgICBOZXh0VG9rZW4oKTsNCisgIH0gZWxzZSB7DQorICAgIHBFeHByZXNzaW9ucyA9IFBhcnNlVG9wRXhwcmVzc2lvbigpOw0KKyAgICBDaGVjayhUT0tlbmRmdW5jKTsNCisgIH0NCisgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgIGUgPSBuZXcgQ1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbihsaW5lLCAwLCBpZGVudCwgcEFyZ3VtZW50cywgcEV4cHJlc3Npb25zKTsNCisgIH0gZWxzZSB7DQorICAgIGludDMyX3Qgc2l6ZSA9IDA7DQorICAgIGludDMyX3QgaW5kZXggPSAwOw0KKyAgICBpZiAocEFyZ3VtZW50cykgew0KKyAgICAgIHBBcmd1bWVudHMtPlJlbW92ZUFsbCgpOw0KKyAgICAgIGRlbGV0ZSBwQXJndW1lbnRzOw0KKyAgICAgIHBBcmd1bWVudHMgPSAwOw0KKyAgICB9DQorICAgIGluZGV4ID0gMDsNCisgICAgaWYgKHBFeHByZXNzaW9ucykgew0KKyAgICAgIENYRkFfRk1FeHByZXNzaW9uKiBlMSA9IDA7DQorICAgICAgc2l6ZSA9IHBFeHByZXNzaW9ucy0+R2V0U2l6ZSgpOw0KKyAgICAgIHdoaWxlIChpbmRleCA8IHNpemUpIHsNCisgICAgICAgIGUxID0gKENYRkFfRk1FeHByZXNzaW9uKilwRXhwcmVzc2lvbnMtPkdldEF0KGluZGV4KTsNCisgICAgICAgIGRlbGV0ZSBlMTsNCisgICAgICAgIGluZGV4Kys7DQorICAgICAgfQ0KKyAgICAgIHBFeHByZXNzaW9ucy0+UmVtb3ZlQWxsKCk7DQorICAgICAgZGVsZXRlIHBFeHByZXNzaW9uczsNCisgICAgICBwRXhwcmVzc2lvbnMgPSAwOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gZTsNCit9DQorQ1hGQV9GTUV4cHJlc3Npb24qIENYRkFfRk1QYXJzZTo6UGFyc2VFeHByZXNzaW9uKCkgew0KKyAgQ1hGQV9GTUV4cHJlc3Npb24qIGUgPSAwOw0KKyAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgc3dpdGNoIChtX3BUb2tlbi0+bV90eXBlKSB7DQorICAgIGNhc2UgVE9LdmFyOg0KKyAgICAgIGUgPSBQYXJzZVZhckV4cHJlc3Npb24oKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBUT0tudWxsOg0KKyAgICBjYXNlIFRPS251bWJlcjoNCisgICAgY2FzZSBUT0tzdHJpbmc6DQorICAgIGNhc2UgVE9LcGx1czoNCisgICAgY2FzZSBUT0ttaW51czoNCisgICAgY2FzZSBUT0trc25vdDoNCisgICAgY2FzZSBUT0tpZGVudGlmaWVyOg0KKyAgICBjYXNlIFRPS2xwYXJlbjoNCisgICAgICBlID0gUGFyc2VFeHBFeHByZXNzaW9uKCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgVE9LaWY6DQorICAgICAgZSA9IFBhcnNlSWZFeHByZXNzaW9uKCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgVE9Ld2hpbGU6DQorICAgICAgZSA9IFBhcnNlV2hpbGVFeHByZXNzaW9uKCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgVE9LZm9yOg0KKyAgICAgIGUgPSBQYXJzZUZvckV4cHJlc3Npb24oKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBUT0tmb3JlYWNoOg0KKyAgICAgIGUgPSBQYXJzZUZvcmVhY2hFeHByZXNzaW9uKCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgVE9LZG86DQorICAgICAgZSA9IFBhcnNlRG9FeHByZXNzaW9uKCk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgVE9LYnJlYWs6DQorICAgICAgZSA9IG5ldyBDWEZBX0ZNQnJlYWtFeHByZXNzaW9uKGxpbmUpOw0KKyAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRPS2NvbnRpbnVlOg0KKyAgICAgIGUgPSBuZXcgQ1hGQV9GTUNvbnRpbnVlRXhwcmVzc2lvbihsaW5lKTsNCisgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfVU5FWFBFQ1RFRF9FWFBSRVNTSU9OLA0KKyAgICAgICAgICAgIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7DQorICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gZTsNCit9DQorQ1hGQV9GTUV4cHJlc3Npb24qIENYRkFfRk1QYXJzZTo6UGFyc2VWYXJFeHByZXNzaW9uKCkgew0KKyAgQ1hGQV9GTUV4cHJlc3Npb24qIGUgPSAwOw0KKyAgQ0ZYX1dpZGVTdHJpbmdDIGlkZW50Ow0KKyAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgTmV4dFRva2VuKCk7DQorICBpZiAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tpZGVudGlmaWVyKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfRVhQRUNURURfSURFTlRJRklFUiwNCisgICAgICAgICAgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsNCisgIH0gZWxzZSB7DQorICAgIGlkZW50ID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgTmV4dFRva2VuKCk7DQorICB9DQorICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0thc3NpZ24pIHsNCisgICAgTmV4dFRva2VuKCk7DQorICAgIGUgPSBQYXJzZUV4cEV4cHJlc3Npb24oKTsNCisgIH0NCisgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgIGUgPSBuZXcgQ1hGQV9GTVZhckV4cHJlc3Npb24obGluZSwgaWRlbnQsIGUpOw0KKyAgfSBlbHNlIHsNCisgICAgZGVsZXRlIGU7DQorICAgIGUgPSAwOw0KKyAgfQ0KKyAgcmV0dXJuIGU7DQorfQ0KK0NYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBDWEZBX0ZNUGFyc2U6OlBhcnNlU2ltcGxlRXhwcmVzc2lvbigpIHsNCisgIEZYX0RXT1JEIGxpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICpwRXhwMSA9IDAsICpwRXhwMiA9IDA7DQorICBwRXhwMSA9IFBhcnNlTG9naWNhbE9yRXhwcmVzc2lvbigpOw0KKyAgd2hpbGUgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LYXNzaWduKSB7DQorICAgIE5leHRUb2tlbigpOw0KKyAgICBwRXhwMiA9IFBhcnNlTG9naWNhbE9yRXhwcmVzc2lvbigpOw0KKyAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICAgIHBFeHAxID0gbmV3IENYRkFfRk1Bc3NpZ25FeHByZXNzaW9uKGxpbmUsIFRPS2Fzc2lnbiwgcEV4cDEsIHBFeHAyKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBkZWxldGUgcEV4cDE7DQorICAgICAgcEV4cDEgPSAwOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gcEV4cDE7DQorfQ0KK0NYRkFfRk1FeHByZXNzaW9uKiBDWEZBX0ZNUGFyc2U6OlBhcnNlRXhwRXhwcmVzc2lvbigpIHsNCisgIENYRkFfRk1FeHByZXNzaW9uKiBlID0gMDsNCisgIEZYX0RXT1JEIGxpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwMSA9IDA7DQorICBwRXhwMSA9IFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOw0KKyAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgZSA9IG5ldyBDWEZBX0ZNRXhwRXhwcmVzc2lvbihsaW5lLCBwRXhwMSk7DQorICB9IGVsc2Ugew0KKyAgICBkZWxldGUgcEV4cDE7DQorICAgIGUgPSAwOw0KKyAgfQ0KKyAgcmV0dXJuIGU7DQorfQ0KK0NYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBDWEZBX0ZNUGFyc2U6OlBhcnNlTG9naWNhbE9yRXhwcmVzc2lvbigpIHsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICplMSA9IDAsICplMiA9IDA7DQorICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICBlMSA9IFBhcnNlTG9naWNhbEFuZEV4cHJlc3Npb24oKTsNCisgIGZvciAoOzspIHsNCisgICAgc3dpdGNoIChtX3BUb2tlbi0+bV90eXBlKSB7DQorICAgICAgY2FzZSBUT0tvcjoNCisgICAgICBjYXNlIFRPS2tzb3I6DQorICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgIGUyID0gUGFyc2VMb2dpY2FsQW5kRXhwcmVzc2lvbigpOw0KKyAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgZTEgPSBuZXcgQ1hGQV9GTUxvZ2ljYWxPckV4cHJlc3Npb24obGluZSwgVE9Lb3IsIGUxLCBlMik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBkZWxldGUgZTE7DQorICAgICAgICAgIGUxID0gMDsNCisgICAgICAgIH0NCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBlMTsNCit9DQorQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIENYRkFfRk1QYXJzZTo6UGFyc2VMb2dpY2FsQW5kRXhwcmVzc2lvbigpIHsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICplMSA9IDAsICplMiA9IDA7DQorICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICBlMSA9IFBhcnNlRXF1YWxpdHlFeHByZXNzaW9uKCk7DQorICBmb3IgKDs7KSB7DQorICAgIHN3aXRjaCAobV9wVG9rZW4tPm1fdHlwZSkgew0KKyAgICAgIGNhc2UgVE9LYW5kOg0KKyAgICAgIGNhc2UgVE9La3NhbmQ6DQorICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgIGUyID0gUGFyc2VFcXVhbGl0eUV4cHJlc3Npb24oKTsNCisgICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIGUxID0gbmV3IENYRkFfRk1Mb2dpY2FsQW5kRXhwcmVzc2lvbihsaW5lLCBUT0thbmQsIGUxLCBlMik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBkZWxldGUgZTE7DQorICAgICAgICAgIGUxID0gMDsNCisgICAgICAgIH0NCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBlMTsNCit9DQorQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIENYRkFfRk1QYXJzZTo6UGFyc2VFcXVhbGl0eUV4cHJlc3Npb24oKSB7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqZTEgPSAwLCAqZTIgPSAwOw0KKyAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgZTEgPSBQYXJzZVJlbGF0aW9uYWxFeHByZXNzaW9uKCk7DQorICBmb3IgKDs7KSB7DQorICAgIHN3aXRjaCAobV9wVG9rZW4tPm1fdHlwZSkgew0KKyAgICAgIGNhc2UgVE9LZXE6DQorICAgICAgY2FzZSBUT0trc2VxOg0KKyAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICBlMiA9IFBhcnNlUmVsYXRpb25hbEV4cHJlc3Npb24oKTsNCisgICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIGUxID0gbmV3IENYRkFfRk1FcXVhbGl0eUV4cHJlc3Npb24obGluZSwgVE9LZXEsIGUxLCBlMik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBkZWxldGUgZTE7DQorICAgICAgICAgIGUxID0gMDsNCisgICAgICAgIH0NCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGNhc2UgVE9LbmU6DQorICAgICAgY2FzZSBUT0trc25lOg0KKyAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICBlMiA9IFBhcnNlUmVsYXRpb25hbEV4cHJlc3Npb24oKTsNCisgICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIGUxID0gbmV3IENYRkFfRk1FcXVhbGl0eUV4cHJlc3Npb24obGluZSwgVE9LbmUsIGUxLCBlMik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBkZWxldGUgZTE7DQorICAgICAgICAgIGUxID0gMDsNCisgICAgICAgIH0NCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBlMTsNCit9DQorQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIENYRkFfRk1QYXJzZTo6UGFyc2VSZWxhdGlvbmFsRXhwcmVzc2lvbigpIHsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICplMSA9IDAsICplMiA9IDA7DQorICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICBlMSA9IFBhcnNlQWRkdGl2ZUV4cHJlc3Npb24oKTsNCisgIGZvciAoOzspIHsNCisgICAgc3dpdGNoIChtX3BUb2tlbi0+bV90eXBlKSB7DQorICAgICAgY2FzZSBUT0tsdDoNCisgICAgICBjYXNlIFRPS2tzbHQ6DQorICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgIGUyID0gUGFyc2VBZGR0aXZlRXhwcmVzc2lvbigpOw0KKyAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgZTEgPSBuZXcgQ1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uKGxpbmUsIFRPS2x0LCBlMSwgZTIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgZGVsZXRlIGUxOw0KKyAgICAgICAgICBlMSA9IDA7DQorICAgICAgICB9DQorICAgICAgICBjb250aW51ZTsNCisgICAgICBjYXNlIFRPS2d0Og0KKyAgICAgIGNhc2UgVE9La3NndDoNCisgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgZTIgPSBQYXJzZUFkZHRpdmVFeHByZXNzaW9uKCk7DQorICAgICAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICBlMSA9IG5ldyBDWEZBX0ZNUmVsYXRpb25hbEV4cHJlc3Npb24obGluZSwgVE9LZ3QsIGUxLCBlMik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBkZWxldGUgZTE7DQorICAgICAgICAgIGUxID0gMDsNCisgICAgICAgIH0NCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGNhc2UgVE9LbGU6DQorICAgICAgY2FzZSBUT0trc2xlOg0KKyAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICBlMiA9IFBhcnNlQWRkdGl2ZUV4cHJlc3Npb24oKTsNCisgICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIGUxID0gbmV3IENYRkFfRk1SZWxhdGlvbmFsRXhwcmVzc2lvbihsaW5lLCBUT0tsZSwgZTEsIGUyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGRlbGV0ZSBlMTsNCisgICAgICAgICAgZTEgPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY29udGludWU7DQorICAgICAgY2FzZSBUT0tnZToNCisgICAgICBjYXNlIFRPS2tzZ2U6DQorICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgIGUyID0gUGFyc2VBZGR0aXZlRXhwcmVzc2lvbigpOw0KKyAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgZTEgPSBuZXcgQ1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uKGxpbmUsIFRPS2dlLCBlMSwgZTIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgZGVsZXRlIGUxOw0KKyAgICAgICAgICBlMSA9IDA7DQorICAgICAgICB9DQorICAgICAgICBjb250aW51ZTsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gZTE7DQorfQ0KK0NYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBDWEZBX0ZNUGFyc2U6OlBhcnNlQWRkdGl2ZUV4cHJlc3Npb24oKSB7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqZTEgPSAwLCAqZTIgPSAwOw0KKyAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgZTEgPSBQYXJzZU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOw0KKyAgZm9yICg7Oykgew0KKyAgICBzd2l0Y2ggKG1fcFRva2VuLT5tX3R5cGUpIHsNCisgICAgICBjYXNlIFRPS3BsdXM6DQorICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgIGUyID0gUGFyc2VNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKTsNCisgICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIGUxID0gbmV3IENYRkFfRk1BZGRpdGl2ZUV4cHJlc3Npb24obGluZSwgVE9LcGx1cywgZTEsIGUyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGRlbGV0ZSBlMTsNCisgICAgICAgICAgZTEgPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY29udGludWU7DQorICAgICAgY2FzZSBUT0ttaW51czoNCisgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgZTIgPSBQYXJzZU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOw0KKyAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgZTEgPSBuZXcgQ1hGQV9GTUFkZGl0aXZlRXhwcmVzc2lvbihsaW5lLCBUT0ttaW51cywgZTEsIGUyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGRlbGV0ZSBlMTsNCisgICAgICAgICAgZTEgPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY29udGludWU7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIGUxOw0KK30NCitDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogQ1hGQV9GTVBhcnNlOjpQYXJzZU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpIHsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uICplMSA9IDAsICplMiA9IDA7DQorICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICBlMSA9IFBhcnNlVW5hcnlFeHByZXNzaW9uKCk7DQorICBmb3IgKDs7KSB7DQorICAgIHN3aXRjaCAobV9wVG9rZW4tPm1fdHlwZSkgew0KKyAgICAgIGNhc2UgVE9LbXVsOg0KKyAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICBlMiA9IFBhcnNlVW5hcnlFeHByZXNzaW9uKCk7DQorICAgICAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICBlMSA9IG5ldyBDWEZBX0ZNTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKGxpbmUsIFRPS211bCwgZTEsIGUyKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGRlbGV0ZSBlMTsNCisgICAgICAgICAgZTEgPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgY29udGludWU7DQorICAgICAgY2FzZSBUT0tkaXY6DQorICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgIGUyID0gUGFyc2VVbmFyeUV4cHJlc3Npb24oKTsNCisgICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIGUxID0gbmV3IENYRkFfRk1NdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24obGluZSwgVE9LZGl2LCBlMSwgZTIpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgZGVsZXRlIGUxOw0KKyAgICAgICAgICBlMSA9IDA7DQorICAgICAgICB9DQorICAgICAgICBjb250aW51ZTsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gZTE7DQorfQ0KK0NYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBDWEZBX0ZNUGFyc2U6OlBhcnNlVW5hcnlFeHByZXNzaW9uKCkgew0KKyAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIGUgPSAwOw0KKyAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgc3dpdGNoIChtX3BUb2tlbi0+bV90eXBlKSB7DQorICAgIGNhc2UgVE9LcGx1czoNCisgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICBlID0gUGFyc2VVbmFyeUV4cHJlc3Npb24oKTsNCisgICAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICAgICAgZSA9IG5ldyBDWEZBX0ZNUG9zRXhwcmVzc2lvbihsaW5lLCBlKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgZSA9IDA7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRPS21pbnVzOg0KKyAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgIGUgPSBQYXJzZVVuYXJ5RXhwcmVzc2lvbigpOw0KKyAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICBlID0gbmV3IENYRkFfRk1OZWdFeHByZXNzaW9uKGxpbmUsIGUpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBlID0gMDsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgVE9La3Nub3Q6DQorICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgZSA9IFBhcnNlVW5hcnlFeHByZXNzaW9uKCk7DQorICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIGUgPSBuZXcgQ1hGQV9GTU5vdEV4cHJlc3Npb24obGluZSwgZSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGUgPSAwOw0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBlID0gUGFyc2VQcmltYXJ5RXhwcmVzc2lvbigpOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIGU7DQorfQ0KK0NYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBDWEZBX0ZNUGFyc2U6OlBhcnNlUHJpbWFyeUV4cHJlc3Npb24oKSB7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogZSA9IDA7DQorICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICBzd2l0Y2ggKG1fcFRva2VuLT5tX3R5cGUpIHsNCisgICAgY2FzZSBUT0tudW1iZXI6DQorICAgICAgZSA9IG5ldyBDWEZBX0ZNTnVtYmVyRXhwcmVzc2lvbihsaW5lLCBtX3BUb2tlbi0+bV93c3RyaW5nKTsNCisgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBUT0tzdHJpbmc6DQorICAgICAgZSA9IG5ldyBDWEZBX0ZNU3RyaW5nRXhwcmVzc2lvbihsaW5lLCBtX3BUb2tlbi0+bV93c3RyaW5nKTsNCisgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBUT0tpZGVudGlmaWVyOiB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSWRlbnRpZmllcihtX3BUb2tlbi0+bV93c3RyaW5nKTsNCisgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tsYnJhY2tldCkgew0KKyAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHMgPSBQYXJzZUluZGV4RXhwcmVzc2lvbigpOw0KKyAgICAgICAgaWYgKHMpIHsNCisgICAgICAgICAgZSA9IG5ldyBDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uKGxpbmUsIE5VTEwsIFRPS2RvdCwgd3NJZGVudGlmaWVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyk7DQorICAgICAgICB9DQorICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgZSA9IG5ldyBDWEZBX0ZNSWRlbnRpZmllckV4cHJlc3Npb25uKGxpbmUsIHdzSWRlbnRpZmllcik7DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIFRPS2lmOg0KKyAgICAgIGUgPSBuZXcgQ1hGQV9GTUlkZW50aWZpZXJFeHByZXNzaW9ubihsaW5lLCBtX3BUb2tlbi0+bV93c3RyaW5nKTsNCisgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBUT0tudWxsOg0KKyAgICAgIGUgPSBuZXcgQ1hGQV9GTU51bGxFeHByZXNzaW9uKGxpbmUpOw0KKyAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRPS2xwYXJlbjoNCisgICAgICBlID0gUGFyc2VQYXJlbkV4cHJlc3Npb24oKTsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfVU5FWFBFQ1RFRF9FWFBSRVNTSU9OLA0KKyAgICAgICAgICAgIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7DQorICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgYnJlYWs7DQorICB9DQorICBlID0gUGFyc2VQb3N0RXhwcmVzc2lvbihlKTsNCisgIGlmICghKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpKSB7DQorICAgIGRlbGV0ZSBlOw0KKyAgICBlID0gMDsNCisgIH0NCisgIHJldHVybiBlOw0KK30NCitDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogQ1hGQV9GTVBhcnNlOjpQYXJzZVBvc3RFeHByZXNzaW9uKA0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogZSkgew0KKyAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgd2hpbGUgKDEpIHsNCisgICAgc3dpdGNoIChtX3BUb2tlbi0+bV90eXBlKSB7DQorICAgICAgY2FzZSBUT0tscGFyZW46IHsNCisgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgQ0ZYX1B0ckFycmF5KiBwQXJyYXkgPSAwOw0KKyAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LcnBhcmVuKSB7DQorICAgICAgICAgIHBBcnJheSA9IG5ldyBDRlhfUHRyQXJyYXkoKTsNCisgICAgICAgICAgd2hpbGUgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LcnBhcmVuKSB7DQorICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIGUgPSBQYXJzZVNpbXBsZUV4cHJlc3Npb24oKTsNCisgICAgICAgICAgICBpZiAoZSkgew0KKyAgICAgICAgICAgICAgcEFycmF5LT5BZGQoZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2NvbW1hKSB7DQorICAgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LZW9mKSB7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LcnBhcmVuKSB7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICAgICAgICAgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX0VYUEVDVEVEX1RPS0VOLA0KKyAgICAgICAgICAgICAgICAgIFhGQV9GTV9LZXl3b3JkVG9TdHJpbmcoVE9LcnBhcmVuKSwgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgZSA9IG5ldyBDWEZBX0ZNQ2FsbEV4cHJlc3Npb24obGluZSwgZSwgcEFycmF5LCBGQUxTRSk7DQorICAgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tsYnJhY2tldCkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBzID0gUGFyc2VJbmRleEV4cHJlc3Npb24oKTsNCisgICAgICAgICAgaWYgKHMpIHsNCisgICAgICAgICAgICBlID0gbmV3IENYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24obGluZSwgZSwgVE9LY2FsbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV1NUUkMoTCIiKSwgcyk7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZGVsZXRlIGU7DQorICAgICAgICAgICAgZSA9IDA7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGludDMyX3QgaVNpemUgPSBwQXJyYXktPkdldFNpemUoKTsNCisgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7ICsraSkgew0KKyAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwVGVtcCA9DQorICAgICAgICAgICAgICAgIChDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiopcEFycmF5LT5HZXRBdChpKTsNCisgICAgICAgICAgICBkZWxldGUgcFRlbXA7DQorICAgICAgICAgIH0NCisgICAgICAgICAgZGVsZXRlIHBBcnJheTsNCisgICAgICAgICAgZGVsZXRlIGU7DQorICAgICAgICAgIGUgPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBUT0tkb3Q6DQorICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2lkZW50aWZpZXIpIHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHRlbXBTdHIgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgICAgICAgICBGWF9EV09SRCB0ZW1wTGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LbHBhcmVuKSB7DQorICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHBBY2Nlc3NvcjsNCisgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cENhbGw7DQorICAgICAgICAgICAgcEV4cEFjY2Vzc29yID0gZTsNCisgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgICBDRlhfUHRyQXJyYXkqIHBBcnJheSA9IDA7DQorICAgICAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LcnBhcmVuKSB7DQorICAgICAgICAgICAgICBwQXJyYXkgPSBuZXcgQ0ZYX1B0ckFycmF5KCk7DQorICAgICAgICAgICAgICB3aGlsZSAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tycGFyZW4pIHsNCisgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIGV4cCA9IFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOw0KKyAgICAgICAgICAgICAgICBwQXJyYXktPkFkZChleHApOw0KKyAgICAgICAgICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tjb21tYSkgew0KKyAgICAgICAgICAgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LZW9mKSB7DQorICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS3JwYXJlbikgew0KKyAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgICAgICAgICAgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX0VYUEVDVEVEX1RPS0VOLA0KKyAgICAgICAgICAgICAgICAgICAgICBYRkFfRk1fS2V5d29yZFRvU3RyaW5nKFRPS3JwYXJlbiksIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcElkZW50aWZpZXIgPQ0KKyAgICAgICAgICAgICAgICAgIG5ldyBDWEZBX0ZNSWRlbnRpZmllckV4cHJlc3Npb25uKHRlbXBMaW5lLCB0ZW1wU3RyKTsNCisgICAgICAgICAgICAgIHBFeHBDYWxsID0NCisgICAgICAgICAgICAgICAgICBuZXcgQ1hGQV9GTUNhbGxFeHByZXNzaW9uKGxpbmUsIHBJZGVudGlmaWVyLCBwQXJyYXksIFRSVUUpOw0KKyAgICAgICAgICAgICAgZSA9IG5ldyBDWEZBX0ZNTWV0aG9kQ2FsbEV4cHJlc3Npb24obGluZSwgcEV4cEFjY2Vzc29yLCBwRXhwQ2FsbCk7DQorICAgICAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS2xicmFja2V0KSB7DQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHMgPSBQYXJzZUluZGV4RXhwcmVzc2lvbigpOw0KKyAgICAgICAgICAgICAgaWYgKHMpIHsNCisgICAgICAgICAgICAgICAgZSA9IG5ldyBDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uKGxpbmUsIGUsIFRPS2NhbGwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XU1RSQyhMIiIpLCBzKTsNCisgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGRlbGV0ZSBlOw0KKyAgICAgICAgICAgICAgICBlID0gMDsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgaW50MzJfdCBpU2l6ZSA9IHBBcnJheS0+R2V0U2l6ZSgpOw0KKyAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7ICsraSkgew0KKyAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcFRlbXAgPQ0KKyAgICAgICAgICAgICAgICAgICAgKENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKilwQXJyYXktPkdldEF0KGkpOw0KKyAgICAgICAgICAgICAgICBkZWxldGUgcFRlbXA7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBkZWxldGUgcEFycmF5Ow0KKyAgICAgICAgICAgICAgZGVsZXRlIGU7DQorICAgICAgICAgICAgICBlID0gMDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gZWxzZSBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tsYnJhY2tldCkgew0KKyAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBzID0gUGFyc2VJbmRleEV4cHJlc3Npb24oKTsNCisgICAgICAgICAgICBpZiAoIShtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSkgew0KKyAgICAgICAgICAgICAgaWYgKHMpIHsNCisgICAgICAgICAgICAgICAgZGVsZXRlIHM7DQorICAgICAgICAgICAgICAgIHMgPSAwOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKGUpIHsNCisgICAgICAgICAgICAgICAgZGVsZXRlIGU7DQorICAgICAgICAgICAgICAgIGUgPSAwOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgcmV0dXJuIGU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGUgPSBuZXcgQ1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbih0ZW1wTGluZSwgZSwgVE9LZG90LCB0ZW1wU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzKTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcyA9IG5ldyBDWEZBX0ZNSW5kZXhFeHByZXNzaW9uKA0KKyAgICAgICAgICAgICAgICB0ZW1wTGluZSwgQUNDRVNTT1JfTk9fSU5ERVgsIE5VTEwsIEZBTFNFKTsNCisgICAgICAgICAgICBlID0gbmV3IENYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24obGluZSwgZSwgVE9LZG90LCB0ZW1wU3RyLCBzKTsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICAgICAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9FWFBFQ1RFRF9JREVOVElGSUVSLA0KKyAgICAgICAgICAgICAgICB3c19UZW1wU3RyaW5nLmNfc3RyKCkpOw0KKyAgICAgICAgICByZXR1cm4gZTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgVE9LZG90ZG90Og0KKyAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tpZGVudGlmaWVyKSB7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB0ZW1wU3RyID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgICAgICAgRlhfRFdPUkQgdGVtcExpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsNCisgICAgICAgICAgTmV4dFRva2VuKCk7DQorICAgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2xicmFja2V0KSB7DQorICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHMgPSBQYXJzZUluZGV4RXhwcmVzc2lvbigpOw0KKyAgICAgICAgICAgIGlmICghKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpKSB7DQorICAgICAgICAgICAgICBpZiAocykgew0KKyAgICAgICAgICAgICAgICBkZWxldGUgczsNCisgICAgICAgICAgICAgICAgcyA9IDA7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAoZSkgew0KKyAgICAgICAgICAgICAgICBkZWxldGUgZTsNCisgICAgICAgICAgICAgICAgZSA9IDA7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICByZXR1cm4gZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZSA9IG5ldyBDWEZBX0ZNRG90RG90QWNjZXNzb3JFeHByZXNzaW9uKHRlbXBMaW5lLCBlLCBUT0tkb3Rkb3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBTdHIsIHMpOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBzID0gbmV3IENYRkFfRk1JbmRleEV4cHJlc3Npb24oDQorICAgICAgICAgICAgICAgIHRlbXBMaW5lLCBBQ0NFU1NPUl9OT19JTkRFWCwgTlVMTCwgRkFMU0UpOw0KKyAgICAgICAgICAgIGUgPSBuZXcgQ1hGQV9GTURvdERvdEFjY2Vzc29yRXhwcmVzc2lvbihsaW5lLCBlLCBUT0tkb3Rkb3QsIHRlbXBTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMpOw0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgICAgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX0VYUEVDVEVEX0lERU5USUZJRVIsDQorICAgICAgICAgICAgICAgIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7DQorICAgICAgICAgIHJldHVybiBlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBUT0tkb3RzY3JlYW06DQorICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2lkZW50aWZpZXIpIHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHRlbXBTdHIgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgICAgICAgICBGWF9EV09SRCB0ZW1wTGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgICAgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LbGJyYWNrZXQpIHsNCisgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcyA9IFBhcnNlSW5kZXhFeHByZXNzaW9uKCk7DQorICAgICAgICAgICAgaWYgKCEobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkpIHsNCisgICAgICAgICAgICAgIGlmIChzKSB7DQorICAgICAgICAgICAgICAgIGRlbGV0ZSBzOw0KKyAgICAgICAgICAgICAgICBzID0gMDsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmIChlKSB7DQorICAgICAgICAgICAgICAgIGRlbGV0ZSBlOw0KKyAgICAgICAgICAgICAgICBlID0gMDsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIHJldHVybiBlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlID0gbmV3IENYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24odGVtcExpbmUsIGUsIFRPS2RvdHNjcmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFN0ciwgcyk7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHMgPSBuZXcgQ1hGQV9GTUluZGV4RXhwcmVzc2lvbigNCisgICAgICAgICAgICAgICAgdGVtcExpbmUsIEFDQ0VTU09SX05PX0lOREVYLCBOVUxMLCBGQUxTRSk7DQorICAgICAgICAgICAgZSA9IG5ldyBDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uKGxpbmUsIGUsIFRPS2RvdHNjcmVhbSwgdGVtcFN0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyk7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgICAgICAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfRVhQRUNURURfSURFTlRJRklFUiwNCisgICAgICAgICAgICAgICAgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsNCisgICAgICAgICAgcmV0dXJuIGU7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFRPS2RvdHN0YXI6IHsNCisgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBzID0NCisgICAgICAgICAgICBuZXcgQ1hGQV9GTUluZGV4RXhwcmVzc2lvbihsaW5lLCBBQ0NFU1NPUl9OT19JTkRFWCwgTlVMTCwgRkFMU0UpOw0KKyAgICAgICAgZSA9IG5ldyBDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uKGxpbmUsIGUsIFRPS2RvdHN0YXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV1NUUkMoTCIqIiksIHMpOw0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIHJldHVybiBlOw0KKyAgICB9DQorICAgIE5leHRUb2tlbigpOw0KKyAgfQ0KKyAgcmV0dXJuIGU7DQorfQ0KK0NYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBDWEZBX0ZNUGFyc2U6OlBhcnNlSW5kZXhFeHByZXNzaW9uKCkgew0KKyAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHAgPSAwOw0KKyAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgTmV4dFRva2VuKCk7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcyA9IDA7DQorICBYRkFfRk1fQWNjZXNzb3JJbmRleCBhY2Nlc3NvckluZGV4ID0gQUNDRVNTT1JfTk9fUkVMQVRJVkVJTkRFWDsNCisgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS211bCkgew0KKyAgICBwRXhwID0gbmV3IENYRkFfRk1JbmRleEV4cHJlc3Npb24obGluZSwgYWNjZXNzb3JJbmRleCwgcywgVFJVRSk7DQorICAgIE5leHRUb2tlbigpOw0KKyAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tyYnJhY2tldCkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9FWFBFQ1RFRF9UT0tFTiwNCisgICAgICAgICAgICBYRkFfRk1fS2V5d29yZFRvU3RyaW5nKFRPS3JwYXJlbiksIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7DQorICAgICAgaWYgKHBFeHApIHsNCisgICAgICAgIGRlbGV0ZSBwRXhwOw0KKyAgICAgICAgcEV4cCA9IDA7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBwRXhwOw0KKyAgfQ0KKyAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LcGx1cykgew0KKyAgICBhY2Nlc3NvckluZGV4ID0gQUNDRVNTT1JfUE9TSVRJVkVfSU5ERVg7DQorICAgIE5leHRUb2tlbigpOw0KKyAgfSBlbHNlIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS21pbnVzKSB7DQorICAgIGFjY2Vzc29ySW5kZXggPSBBQ0NFU1NPUl9ORUdBVElWRV9JTkRFWDsNCisgICAgTmV4dFRva2VuKCk7DQorICB9DQorICBzID0gUGFyc2VTaW1wbGVFeHByZXNzaW9uKCk7DQorICBpZiAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tyYnJhY2tldCkgew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nID0gbV9wVG9rZW4tPm1fd3N0cmluZzsNCisgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIEZNRVJSX0VYUEVDVEVEX1RPS0VOLA0KKyAgICAgICAgICBYRkFfRk1fS2V5d29yZFRvU3RyaW5nKFRPS3JwYXJlbiksIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7DQorICAgIGlmIChzKSB7DQorICAgICAgZGVsZXRlIHM7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIHBFeHAgPSBuZXcgQ1hGQV9GTUluZGV4RXhwcmVzc2lvbihsaW5lLCBhY2Nlc3NvckluZGV4LCBzLCBGQUxTRSk7DQorICB9DQorICByZXR1cm4gcEV4cDsNCit9DQorQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIENYRkFfRk1QYXJzZTo6UGFyc2VQYXJlbkV4cHJlc3Npb24oKSB7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiAqcEV4cDEgPSAwLCAqcEV4cDIgPSAwOw0KKyAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgQ2hlY2soVE9LbHBhcmVuKTsNCisgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS3JwYXJlbikgew0KKyAgICBwRXhwMSA9IFBhcnNlTG9naWNhbE9yRXhwcmVzc2lvbigpOw0KKyAgICB3aGlsZSAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0thc3NpZ24pIHsNCisgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICBwRXhwMiA9IFBhcnNlTG9naWNhbE9yRXhwcmVzc2lvbigpOw0KKyAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgICAgICBwRXhwMSA9IG5ldyBDWEZBX0ZNQXNzaWduRXhwcmVzc2lvbihsaW5lLCBUT0thc3NpZ24sIHBFeHAxLCBwRXhwMik7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGRlbGV0ZSBwRXhwMTsNCisgICAgICAgIHBFeHAxID0gMDsNCisgICAgICB9DQorICAgIH0NCisgICAgQ2hlY2soVE9LcnBhcmVuKTsNCisgIH0gZWxzZSB7DQorICAgIE5leHRUb2tlbigpOw0KKyAgfQ0KKyAgcmV0dXJuIHBFeHAxOw0KK30NCitDWEZBX0ZNRXhwcmVzc2lvbiogQ1hGQV9GTVBhcnNlOjpQYXJzZUJsb2NrRXhwcmVzc2lvbigpIHsNCisgIEZYX0RXT1JEIGxpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsNCisgIENYRkFfRk1FeHByZXNzaW9uKiBlID0gMDsNCisgIENGWF9QdHJBcnJheSogZXhwcmVzc2lvbiA9IG5ldyBDRlhfUHRyQXJyYXkoKTsNCisgIHdoaWxlICgxKSB7DQorICAgIHN3aXRjaCAobV9wVG9rZW4tPm1fdHlwZSkgew0KKyAgICAgIGNhc2UgVE9LZW9mOg0KKyAgICAgIGNhc2UgVE9LZW5kaWY6DQorICAgICAgY2FzZSBUT0tlbHNlaWY6DQorICAgICAgY2FzZSBUT0tlbHNlOg0KKyAgICAgIGNhc2UgVE9LZW5kd2hpbGU6DQorICAgICAgY2FzZSBUT0tlbmRmb3I6DQorICAgICAgY2FzZSBUT0tlbmQ6DQorICAgICAgY2FzZSBUT0tlbmRmdW5jOg0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBUT0tmdW5jOg0KKyAgICAgICAgZSA9IFBhcnNlRnVuY3Rpb24oKTsNCisgICAgICAgIGlmIChlKSB7DQorICAgICAgICAgIGV4cHJlc3Npb24tPkFkZChlKTsNCisgICAgICAgIH0NCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBlID0gUGFyc2VFeHByZXNzaW9uKCk7DQorICAgICAgICBpZiAoZSkgew0KKyAgICAgICAgICBleHByZXNzaW9uLT5BZGQoZSk7DQorICAgICAgICB9DQorICAgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBicmVhazsNCisgIH0NCisgIENYRkFfRk1CbG9ja0V4cHJlc3Npb24qIHBFeHAgPSAwOw0KKyAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgcEV4cCA9IG5ldyBDWEZBX0ZNQmxvY2tFeHByZXNzaW9uKGxpbmUsIGV4cHJlc3Npb24pOw0KKyAgfSBlbHNlIHsNCisgICAgaW50MzJfdCBzaXplID0gZXhwcmVzc2lvbi0+R2V0U2l6ZSgpOw0KKyAgICBpbnQzMl90IGluZGV4ID0gMDsNCisgICAgd2hpbGUgKGluZGV4IDwgc2l6ZSkgew0KKyAgICAgIGUgPSAoQ1hGQV9GTUV4cHJlc3Npb24qKWV4cHJlc3Npb24tPkdldEF0KGluZGV4KTsNCisgICAgICBkZWxldGUgZTsNCisgICAgICBpbmRleCsrOw0KKyAgICB9DQorICAgIGV4cHJlc3Npb24tPlJlbW92ZUFsbCgpOw0KKyAgICBkZWxldGUgZXhwcmVzc2lvbjsNCisgICAgZXhwcmVzc2lvbiA9IDA7DQorICB9DQorICByZXR1cm4gcEV4cDsNCit9DQorQ1hGQV9GTUV4cHJlc3Npb24qIENYRkFfRk1QYXJzZTo6UGFyc2VJZkV4cHJlc3Npb24oKSB7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cHJlc3Npb24gPSAwOw0KKyAgQ1hGQV9GTUV4cHJlc3Npb24qIHBJZkV4cHJlc3Npb24gPSAwOw0KKyAgQ1hGQV9GTUV4cHJlc3Npb24qIHBFbHNlRXhwcmVzc2lvbiA9IDA7DQorICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICBjb25zdCBGWF9XQ0hBUiogcFN0YXJ0UG9zID0gbV9sZXhlci0+U2F2ZVBvcygpOw0KKyAgTmV4dFRva2VuKCk7DQorICBDaGVjayhUT0tscGFyZW4pOw0KKyAgd2hpbGUgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LcnBhcmVuKSB7DQorICAgIGlmIChwRXhwcmVzc2lvbikgew0KKyAgICAgIGRlbGV0ZSBwRXhwcmVzc2lvbjsNCisgICAgfQ0KKyAgICBwRXhwcmVzc2lvbiA9IFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOw0KKyAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tjb21tYSkgew0KKyAgICAgIE5leHRUb2tlbigpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBDaGVjayhUT0tycGFyZW4pOw0KKyAgaWYgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LdGhlbikgew0KKyAgICBpZiAocEV4cHJlc3Npb24pIHsNCisgICAgICBkZWxldGUgcEV4cHJlc3Npb247DQorICAgIH0NCisgICAgbV9sZXhlci0+U2V0Q3VycmVudExpbmUobGluZSk7DQorICAgIG1fcFRva2VuID0gbmV3IENYRkFfRk1Ub2tlbihsaW5lKTsNCisgICAgbV9wVG9rZW4tPm1fdHlwZSA9IFRPS2lkZW50aWZpZXI7DQorICAgIG1fcFRva2VuLT5tX3dzdHJpbmcgPSBGWF9XU1RSQyhMImlmIik7DQorICAgIG1fbGV4ZXItPlNldFRva2VuKG1fcFRva2VuKTsNCisgICAgbV9sZXhlci0+UmVzdG9yZVBvcyhwU3RhcnRQb3MpOw0KKyAgICByZXR1cm4gUGFyc2VFeHBFeHByZXNzaW9uKCk7DQorICB9DQorICBDaGVjayhUT0t0aGVuKTsNCisgIHBJZkV4cHJlc3Npb24gPSBQYXJzZUJsb2NrRXhwcmVzc2lvbigpOw0KKyAgc3dpdGNoIChtX3BUb2tlbi0+bV90eXBlKSB7DQorICAgIGNhc2UgVE9LZW9mOg0KKyAgICBjYXNlIFRPS2VuZGlmOg0KKyAgICAgIENoZWNrKFRPS2VuZGlmKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBUT0tpZjoNCisgICAgICBwRWxzZUV4cHJlc3Npb24gPSBQYXJzZUlmRXhwcmVzc2lvbigpOw0KKyAgICAgIENoZWNrKFRPS2VuZGlmKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBUT0tlbHNlaWY6DQorICAgICAgcEVsc2VFeHByZXNzaW9uID0gUGFyc2VJZkV4cHJlc3Npb24oKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBUT0tlbHNlOg0KKyAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgIHBFbHNlRXhwcmVzc2lvbiA9IFBhcnNlQmxvY2tFeHByZXNzaW9uKCk7DQorICAgICAgQ2hlY2soVE9LZW5kaWYpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9FWFBFQ1RFRF9JRkVORCwgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsNCisgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICBicmVhazsNCisgIH0NCisgIENYRkFfRk1JZkV4cHJlc3Npb24qIHBFeHAgPSAwOw0KKyAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgcEV4cCA9IG5ldyBDWEZBX0ZNSWZFeHByZXNzaW9uKGxpbmUsIHBFeHByZXNzaW9uLCBwSWZFeHByZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVsc2VFeHByZXNzaW9uKTsNCisgIH0gZWxzZSB7DQorICAgIGlmIChwRXhwcmVzc2lvbikgew0KKyAgICAgIGRlbGV0ZSBwRXhwcmVzc2lvbjsNCisgICAgfQ0KKyAgICBpZiAocElmRXhwcmVzc2lvbikgew0KKyAgICAgIGRlbGV0ZSBwSWZFeHByZXNzaW9uOw0KKyAgICB9DQorICAgIGlmIChwRWxzZUV4cHJlc3Npb24pIHsNCisgICAgICBkZWxldGUgcEVsc2VFeHByZXNzaW9uOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gcEV4cDsNCit9DQorQ1hGQV9GTUV4cHJlc3Npb24qIENYRkFfRk1QYXJzZTo6UGFyc2VXaGlsZUV4cHJlc3Npb24oKSB7DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogZSA9IDA7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcENvbmRpdGlvbiA9IDA7DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogcEV4cHJlc3Npb24gPSAwOw0KKyAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgTmV4dFRva2VuKCk7DQorICBwQ29uZGl0aW9uID0gUGFyc2VQYXJlbkV4cHJlc3Npb24oKTsNCisgIENoZWNrKFRPS2RvKTsNCisgIHBFeHByZXNzaW9uID0gUGFyc2VCbG9ja0V4cHJlc3Npb24oKTsNCisgIENoZWNrKFRPS2VuZHdoaWxlKTsNCisgIGlmICghbV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICBpZiAocENvbmRpdGlvbikgew0KKyAgICAgIGRlbGV0ZSBwQ29uZGl0aW9uOw0KKyAgICB9DQorICAgIGlmIChwRXhwcmVzc2lvbikgew0KKyAgICAgIGRlbGV0ZSBwRXhwcmVzc2lvbjsNCisgICAgfQ0KKyAgICBkZWxldGUgZTsNCisgICAgZSA9IDA7DQorICB9IGVsc2Ugew0KKyAgICBlID0gbmV3IENYRkFfRk1XaGlsZUV4cHJlc3Npb24obGluZSwgcENvbmRpdGlvbiwgcEV4cHJlc3Npb24pOw0KKyAgfQ0KKyAgcmV0dXJuIGU7DQorfQ0KK0NYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBDWEZBX0ZNUGFyc2U6OlBhcnNlU3ViYXNzaWdubWVudEluRm9yRXhwcmVzc2lvbigpIHsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBlID0gMDsNCisgIHN3aXRjaCAobV9wVG9rZW4tPm1fdHlwZSkgew0KKyAgICBjYXNlIFRPS2lkZW50aWZpZXI6DQorICAgICAgZSA9IFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9VTkVYUEVDVEVEX0VYUFJFU1NJT04sDQorICAgICAgICAgICAgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsNCisgICAgICBOZXh0VG9rZW4oKTsNCisgICAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBlOw0KK30NCitDWEZBX0ZNRXhwcmVzc2lvbiogQ1hGQV9GTVBhcnNlOjpQYXJzZUZvckV4cHJlc3Npb24oKSB7DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogZSA9IDA7DQorICBDRlhfV2lkZVN0cmluZ0Mgd3NWYXJpYW50Ow0KKyAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBBc3NpZ25tZW50ID0gMDsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwQWNjZXNzb3IgPSAwOw0KKyAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBTdGVwID0gMDsNCisgIENYRkFfRk1FeHByZXNzaW9uKiBwTGlzdCA9IDA7DQorICBGWF9EV09SRCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07DQorICBOZXh0VG9rZW4oKTsNCisgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS2lkZW50aWZpZXIpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9FWFBFQ1RFRF9UT0tFTiwNCisgICAgICAgICAgWEZBX0ZNX0tleXdvcmRUb1N0cmluZyhtX3BUb2tlbi0+bV90eXBlKSwgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsNCisgIH0NCisgIHdzVmFyaWFudCA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICBOZXh0VG9rZW4oKTsNCisgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2Fzc2lnbikgew0KKyAgICBOZXh0VG9rZW4oKTsNCisgICAgcEFzc2lnbm1lbnQgPSBQYXJzZVNpbXBsZUV4cHJlc3Npb24oKTsNCisgIH0gZWxzZSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfRVhQRUNURURfVE9LRU4sDQorICAgICAgICAgIFhGQV9GTV9LZXl3b3JkVG9TdHJpbmcobV9wVG9rZW4tPm1fdHlwZSksIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7DQorICB9DQorICBpbnQzMl90IGlEaXJlY3Rpb24gPSAwOw0KKyAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LdXB0bykgew0KKyAgICBpRGlyZWN0aW9uID0gMTsNCisgIH0gZWxzZSBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tkb3dudG8pIHsNCisgICAgaURpcmVjdGlvbiA9IC0xOw0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyA9IG1fcFRva2VuLT5tX3dzdHJpbmc7DQorICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBGTUVSUl9FWFBFQ1RFRF9UT0tFTiwgTCJ1cHRvIG9yIGRvd250byIsDQorICAgICAgICAgIChjb25zdCBGWF9XQ0hBUiopd3NfVGVtcFN0cmluZyk7DQorICB9DQorICBOZXh0VG9rZW4oKTsNCisgIHBBY2Nlc3NvciA9IFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOw0KKyAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9Lc3RlcCkgew0KKyAgICBOZXh0VG9rZW4oKTsNCisgICAgcFN0ZXAgPSBQYXJzZVNpbXBsZUV4cHJlc3Npb24oKTsNCisgIH0NCisgIENoZWNrKFRPS2RvKTsNCisgIHBMaXN0ID0gUGFyc2VCbG9ja0V4cHJlc3Npb24oKTsNCisgIENoZWNrKFRPS2VuZGZvcik7DQorICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICBlID0gbmV3IENYRkFfRk1Gb3JFeHByZXNzaW9uKGxpbmUsIHdzVmFyaWFudCwgcEFzc2lnbm1lbnQsIHBBY2Nlc3NvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRGlyZWN0aW9uLCBwU3RlcCwgcExpc3QpOw0KKyAgfSBlbHNlIHsNCisgICAgaWYgKHBBc3NpZ25tZW50KSB7DQorICAgICAgZGVsZXRlIHBBc3NpZ25tZW50Ow0KKyAgICB9DQorICAgIGlmIChwQWNjZXNzb3IpIHsNCisgICAgICBkZWxldGUgcEFjY2Vzc29yOw0KKyAgICB9DQorICAgIGlmIChwU3RlcCkgew0KKyAgICAgIGRlbGV0ZSBwU3RlcDsNCisgICAgfQ0KKyAgICBpZiAocExpc3QpIHsNCisgICAgICBkZWxldGUgcExpc3Q7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBlOw0KK30NCitDWEZBX0ZNRXhwcmVzc2lvbiogQ1hGQV9GTVBhcnNlOjpQYXJzZUZvcmVhY2hFeHByZXNzaW9uKCkgew0KKyAgQ1hGQV9GTUV4cHJlc3Npb24qIGUgPSAwOw0KKyAgQ0ZYX1dpZGVTdHJpbmdDIHdzSWRlbnRpZmllcjsNCisgIENGWF9QdHJBcnJheSogcEFjY2Vzc29ycyA9IDA7DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogcExpc3QgPSAwOw0KKyAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgTmV4dFRva2VuKCk7DQorICBpZiAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tpZGVudGlmaWVyKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfRVhQRUNURURfVE9LRU4sDQorICAgICAgICAgIFhGQV9GTV9LZXl3b3JkVG9TdHJpbmcobV9wVG9rZW4tPm1fdHlwZSksIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7DQorICB9DQorICB3c0lkZW50aWZpZXIgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgTmV4dFRva2VuKCk7DQorICBDaGVjayhUT0tpbik7DQorICBDaGVjayhUT0tscGFyZW4pOw0KKyAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LcnBhcmVuKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcgPSBtX3BUb2tlbi0+bV93c3RyaW5nOw0KKyAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwgRk1FUlJfVU5FWFBFQ1RFRF9FWFBSRVNTSU9OLA0KKyAgICAgICAgICB3c19UZW1wU3RyaW5nLmNfc3RyKCkpOw0KKyAgICBOZXh0VG9rZW4oKTsNCisgIH0gZWxzZSB7DQorICAgIHBBY2Nlc3NvcnMgPSBuZXcgQ0ZYX1B0ckFycmF5KCk7DQorICAgIHdoaWxlIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS3JwYXJlbikgew0KKyAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBzID0gUGFyc2VTaW1wbGVFeHByZXNzaW9uKCk7DQorICAgICAgaWYgKHMpIHsNCisgICAgICAgIHBBY2Nlc3NvcnMtPkFkZChzKTsNCisgICAgICB9DQorICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LY29tbWEpIHsNCisgICAgICAgIE5leHRUb2tlbigpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgQ2hlY2soVE9LcnBhcmVuKTsNCisgIH0NCisgIENoZWNrKFRPS2RvKTsNCisgIHBMaXN0ID0gUGFyc2VCbG9ja0V4cHJlc3Npb24oKTsNCisgIENoZWNrKFRPS2VuZGZvcik7DQorICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICBlID0gbmV3IENYRkFfRk1Gb3JlYWNoRXhwcmVzc2lvbihsaW5lLCB3c0lkZW50aWZpZXIsIHBBY2Nlc3NvcnMsIHBMaXN0KTsNCisgIH0gZWxzZSB7DQorICAgIGlmIChwQWNjZXNzb3JzKSB7DQorICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHMgPSAwOw0KKyAgICAgIGludDMyX3Qgc2l6ZSA9IHBBY2Nlc3NvcnMtPkdldFNpemUoKTsNCisgICAgICBpbnQzMl90IGluZGV4ID0gMDsNCisgICAgICB3aGlsZSAoaW5kZXggPCBzaXplKSB7DQorICAgICAgICBzID0gKENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKilwQWNjZXNzb3JzLT5HZXRBdChpbmRleCk7DQorICAgICAgICBkZWxldGUgczsNCisgICAgICAgIGluZGV4Kys7DQorICAgICAgfQ0KKyAgICAgIHBBY2Nlc3NvcnMtPlJlbW92ZUFsbCgpOw0KKyAgICAgIGRlbGV0ZSBwQWNjZXNzb3JzOw0KKyAgICAgIHBBY2Nlc3NvcnMgPSAwOw0KKyAgICB9DQorICAgIGlmIChwTGlzdCkgew0KKyAgICAgIGRlbGV0ZSBwTGlzdDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGU7DQorfQ0KK0NYRkFfRk1FeHByZXNzaW9uKiBDWEZBX0ZNUGFyc2U6OlBhcnNlRG9FeHByZXNzaW9uKCkgew0KKyAgQ1hGQV9GTUV4cHJlc3Npb24qIGUgPSAwOw0KKyAgRlhfRFdPUkQgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOw0KKyAgTmV4dFRva2VuKCk7DQorICBlID0gUGFyc2VCbG9ja0V4cHJlc3Npb24oKTsNCisgIENoZWNrKFRPS2VuZCk7DQorICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgew0KKyAgICBlID0gbmV3IENYRkFfRk1Eb0V4cHJlc3Npb24obGluZSwgZSk7DQorICB9IGVsc2Ugew0KKyAgICBkZWxldGUgZTsNCisgICAgZSA9IDA7DQorICB9DQorICByZXR1cm4gZTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm1wYXJzZS5oIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfZm1wYXJzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OWU4NjYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9mbXBhcnNlLmgKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfRk1fUEFSU0VfSA0KKyNkZWZpbmUgX1hGQV9GTV9QQVJTRV9IDQorY2xhc3MgQ1hGQV9GTVBhcnNlIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTVBhcnNlKCk7DQorICB+Q1hGQV9GTVBhcnNlKCk7DQorICBpbnQzMl90IEluaXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0Zvcm1jYWxjLCBDWEZBX0ZNRXJyb3JJbmZvKiBwRXJyb3JJbmZvKTsNCisgIHZvaWQgTmV4dFRva2VuKCk7DQorICB2b2lkIENoZWNrKFhGQV9GTV9UT0tFTiBvcCk7DQorICB2b2lkIEVycm9yKEZYX0RXT1JEIGxpbmVOdW0sIFhGQV9GTV9FUlJNU0cgbXNnLCAuLi4pOw0KKyAgQ0ZYX1B0ckFycmF5KiBQYXJzZVRvcEV4cHJlc3Npb24oKTsNCisgIENYRkFfRk1FeHByZXNzaW9uKiBQYXJzZUZ1bmN0aW9uKCk7DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogUGFyc2VFeHByZXNzaW9uKCk7DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogUGFyc2VWYXJFeHByZXNzaW9uKCk7DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogUGFyc2VFeHBFeHByZXNzaW9uKCk7DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogUGFyc2VCbG9ja0V4cHJlc3Npb24oKTsNCisgIENYRkFfRk1FeHByZXNzaW9uKiBQYXJzZUlmRXhwcmVzc2lvbigpOw0KKyAgQ1hGQV9GTUV4cHJlc3Npb24qIFBhcnNlV2hpbGVFeHByZXNzaW9uKCk7DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogUGFyc2VGb3JFeHByZXNzaW9uKCk7DQorICBDWEZBX0ZNRXhwcmVzc2lvbiogUGFyc2VGb3JlYWNoRXhwcmVzc2lvbigpOw0KKyAgQ1hGQV9GTUV4cHJlc3Npb24qIFBhcnNlRG9FeHByZXNzaW9uKCk7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogUGFyc2VQYXJlbkV4cHJlc3Npb24oKTsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBQYXJzZVNpbXBsZUV4cHJlc3Npb24oKTsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBQYXJzZVN1YmFzc2lnbm1lbnRJbkZvckV4cHJlc3Npb24oKTsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBQYXJzZUxvZ2ljYWxPckV4cHJlc3Npb24oKTsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBQYXJzZUxvZ2ljYWxBbmRFeHByZXNzaW9uKCk7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogUGFyc2VFcXVhbGl0eUV4cHJlc3Npb24oKTsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBQYXJzZVJlbGF0aW9uYWxFeHByZXNzaW9uKCk7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogUGFyc2VBZGR0aXZlRXhwcmVzc2lvbigpOw0KKyAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIFBhcnNlTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCk7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogUGFyc2VVbmFyeUV4cHJlc3Npb24oKTsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBQYXJzZVByaW1hcnlFeHByZXNzaW9uKCk7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogUGFyc2VQb3N0RXhwcmVzc2lvbihDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogZSk7DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogUGFyc2VJbmRleEV4cHJlc3Npb24oKTsNCisNCisgcHJpdmF0ZToNCisgIGNvbnN0IEZYX1dDSEFSKiBtX3BTY3JpcHQ7DQorICBGWF9TVFJTSVpFIG1fdUxlbmd0aDsNCisgIENYRkFfRk1MZXhlciogbV9sZXhlcjsNCisgIENYRkFfRk1Ub2tlbiogbV9wVG9rZW47DQorICBDWEZBX0ZNRXJyb3JJbmZvKiBtX3BFcnJvckluZm87DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9sZXhlci5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9sZXhlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1ZjY2ZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2xleGVyLmNwcApAQCAtMCwwICsxLDU3MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhX2ZtMmpzLmgiDQorc3RydWN0IFhGQV9GTURDaGFyIHsNCisgIHN0YXRpYyBjb25zdCBGWF9XQ0hBUiogaW5jKGNvbnN0IEZYX1dDSEFSKiYgcCkgew0KKyAgICArK3A7DQorICAgIHJldHVybiBwOw0KKyAgfQ0KKyAgc3RhdGljIGNvbnN0IEZYX1dDSEFSKiBkZWMoY29uc3QgRlhfV0NIQVIqJiBwKSB7DQorICAgIC0tcDsNCisgICAgcmV0dXJuIHA7DQorICB9DQorICBzdGF0aWMgdWludDE2X3QgZ2V0KGNvbnN0IEZYX1dDSEFSKiBwKSB7IHJldHVybiAqcDsgfQ0KKyAgc3RhdGljIEZYX0JPT0wgaXNXaGl0ZVNwYWNlKGNvbnN0IEZYX1dDSEFSKiBwKSB7DQorICAgIHJldHVybiAoKnApID09IDB4MDkgfHwgKCpwKSA9PSAweDBiIHx8ICgqcCkgPT0gMHgwYyB8fCAoKnApID09IDB4MjA7DQorICB9DQorICBzdGF0aWMgRlhfQk9PTCBpc0xpbmVUZXJtaW5hdG9yKGNvbnN0IEZYX1dDSEFSKiBwKSB7DQorICAgIHJldHVybiAqcCA9PSAweDBBIHx8ICpwID09IDB4MEQ7DQorICB9DQorICBzdGF0aWMgRlhfQk9PTCBpc0JpbmFyeShjb25zdCBGWF9XQ0hBUiogcCkgew0KKyAgICByZXR1cm4gKCpwKSA+PSAnMCcgJiYgKCpwKSA8PSAnMSc7DQorICB9DQorICBzdGF0aWMgRlhfQk9PTCBpc09jdGFsKGNvbnN0IEZYX1dDSEFSKiBwKSB7DQorICAgIHJldHVybiAoKnApID49ICcwJyAmJiAoKnApIDw9ICc3JzsNCisgIH0NCisgIHN0YXRpYyBGWF9CT09MIGlzRGlnaXRhbChjb25zdCBGWF9XQ0hBUiogcCkgew0KKyAgICByZXR1cm4gKCpwKSA+PSAnMCcgJiYgKCpwKSA8PSAnOSc7DQorICB9DQorICBzdGF0aWMgRlhfQk9PTCBpc0hleChjb25zdCBGWF9XQ0hBUiogcCkgew0KKyAgICByZXR1cm4gaXNEaWdpdGFsKHApIHx8ICgoKnApID49ICdhJyAmJiAoKnApIDw9ICdmJykgfHwNCisgICAgICAgICAgICgoKnApID49ICdBJyAmJiAoKnApIDw9ICdGJyk7DQorICB9DQorICBzdGF0aWMgRlhfQk9PTCBpc0FscGhhKGNvbnN0IEZYX1dDSEFSKiBwKSB7DQorICAgIHJldHVybiAoKCpwKSA8PSAneicgJiYgKCpwKSA+PSAnYScpIHx8ICgoKnApIDw9ICdaJyAmJiAoKnApID49ICdBJyk7DQorICB9DQorICBzdGF0aWMgRlhfQk9PTCBpc0F2YWxpZChjb25zdCBGWF9XQ0hBUiogcCwgRlhfQk9PTCBmbGFnID0gMCk7DQorICBzdGF0aWMgRlhfQk9PTCBzdHJpbmcybnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ET1VCTEUqIHBWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqJiBwRW5kKTsNCisgIHN0YXRpYyBGWF9CT09MIGlzVW5pY29kZUFscGhhKHVpbnQxNl90IGNoKTsNCit9Ow0KK2lubGluZSBGWF9CT09MIFhGQV9GTURDaGFyOjppc0F2YWxpZChjb25zdCBGWF9XQ0hBUiogcCwgRlhfQk9PTCBmbGFnKSB7DQorICBpZiAoKnAgPT0gMCkgew0KKyAgICByZXR1cm4gMTsNCisgIH0NCisgIGlmICgoKnAgPD0gMHgwQSAmJiAqcCA+PSAweDA5KSB8fCAqcCA9PSAweDBEIHx8DQorICAgICAgKCpwIDw9IDB4ZDdmZiAmJiAqcCA+PSAweDIwKSB8fCAoKnAgPD0gMHhmZmZkICYmICpwID49IDB4ZTAwMCkpIHsNCisgICAgcmV0dXJuIDE7DQorICB9DQorICBpZiAoIWZsYWcpIHsNCisgICAgaWYgKCpwID09IDB4MEIgfHwgKnAgPT0gMHgwQykgew0KKyAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gMDsNCit9DQoraW5saW5lIEZYX0JPT0wgWEZBX0ZNRENoYXI6OnN0cmluZzJudW1iZXIoY29uc3QgRlhfV0NIQVIqIHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRE9VQkxFKiBwVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqJiBwRW5kKSB7DQorICBpZiAocykgew0KKyAgICAqcFZhbHVlID0gd2NzdG9kKCh3Y2hhcl90KilzLCAod2NoYXJfdCoqKSZwRW5kKTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCitpbmxpbmUgRlhfQk9PTCBYRkFfRk1EQ2hhcjo6aXNVbmljb2RlQWxwaGEodWludDE2X3QgY2gpIHsNCisgIGlmIChjaCA9PSAwIHx8IGNoID09IDB4MEEgfHwgY2ggPT0gMHgwRCB8fCBjaCA9PSAweDA5IHx8IGNoID09IDB4MEIgfHwNCisgICAgICBjaCA9PSAweDBDIHx8IGNoID09IDB4MjAgfHwgY2ggPT0gJy4nIHx8IGNoID09ICc7JyB8fCBjaCA9PSAnIicgfHwNCisgICAgICBjaCA9PSAnPScgfHwgY2ggPT0gJzwnIHx8IGNoID09ICc+JyB8fCBjaCA9PSAnLCcgfHwgY2ggPT0gJygnIHx8DQorICAgICAgY2ggPT0gJyknIHx8IGNoID09ICddJyB8fCBjaCA9PSAnWycgfHwgY2ggPT0gJyYnIHx8IGNoID09ICd8JyB8fA0KKyAgICAgIGNoID09ICcrJyB8fCBjaCA9PSAnLScgfHwgY2ggPT0gJyonIHx8IGNoID09ICcvJykgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9IGVsc2Ugew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCit9DQorc3RhdGljIFhGQV9GTUtleXdvcmQga2V5V29yZHNbXSA9IHsNCisgICAge1RPS2FuZCwgMHgwMDAwMDAyNiwgTCImIn0sDQorICAgIHtUT0tscGFyZW4sIDB4MDAwMDAwMjgsIEwiKCJ9LA0KKyAgICB7VE9LcnBhcmVuLCAweDAwMDAwMDI5LCBMIikifSwNCisgICAge1RPS211bCwgMHgwMDAwMDAyYSwgTCIqIn0sDQorICAgIHtUT0twbHVzLCAweDAwMDAwMDJiLCBMIisifSwNCisgICAge1RPS2NvbW1hLCAweDAwMDAwMDJjLCBMIiwifSwNCisgICAge1RPS21pbnVzLCAweDAwMDAwMDJkLCBMIi0ifSwNCisgICAge1RPS2RvdCwgMHgwMDAwMDAyZSwgTCIuIn0sDQorICAgIHtUT0tkaXYsIDB4MDAwMDAwMmYsIEwiLyJ9LA0KKyAgICB7VE9LbHQsIDB4MDAwMDAwM2MsIEwiPCJ9LA0KKyAgICB7VE9LYXNzaWduLCAweDAwMDAwMDNkLCBMIj0ifSwNCisgICAge1RPS2d0LCAweDAwMDAwMDNlLCBMIj4ifSwNCisgICAge1RPS2xicmFja2V0LCAweDAwMDAwMDViLCBMIlsifSwNCisgICAge1RPS3JicmFja2V0LCAweDAwMDAwMDVkLCBMIl0ifSwNCisgICAge1RPS29yLCAweDAwMDAwMDdjLCBMInwifSwNCisgICAge1RPS2RvdHNjcmVhbSwgMHgwMDAwZWMxMSwgTCIuIyJ9LA0KKyAgICB7VE9LZG90c3RhciwgMHgwMDAwZWMxOCwgTCIuKiJ9LA0KKyAgICB7VE9LZG90ZG90LCAweDAwMDBlYzFjLCBMIi4uIn0sDQorICAgIHtUT0tsZSwgMHgwMDAxMzNmOSwgTCI8PSJ9LA0KKyAgICB7VE9LbmUsIDB4MDAwMTMzZmEsIEwiPD4ifSwNCisgICAge1RPS2VxLCAweDAwMDEzOTFhLCBMIj09In0sDQorICAgIHtUT0tnZSwgMHgwMDAxM2UzYiwgTCI+PSJ9LA0KKyAgICB7VE9LZG8sIDB4MDAwMjAxNTMsIEwiZG8ifSwNCisgICAge1RPS2tzZXEsIDB4MDAwMjA2NzYsIEwiZXEifSwNCisgICAge1RPS2tzZ2UsIDB4MDAwMjEwYWMsIEwiZ2UifSwNCisgICAge1RPS2tzZ3QsIDB4MDAwMjEwYmIsIEwiZ3QifSwNCisgICAge1RPS2lmLCAweDAwMDIxYWVmLCBMImlmIn0sDQorICAgIHtUT0tpbiwgMHgwMDAyMWFmNywgTCJpbiJ9LA0KKyAgICB7VE9La3NsZSwgMHgwMDAyMmE1MSwgTCJsZSJ9LA0KKyAgICB7VE9La3NsdCwgMHgwMDAyMmE2MCwgTCJsdCJ9LA0KKyAgICB7VE9La3NuZSwgMHgwMDAyMzQ5MywgTCJuZSJ9LA0KKyAgICB7VE9La3NvciwgMHgwMDAyMzljMSwgTCJvciJ9LA0KKyAgICB7VE9LbnVsbCwgMHgwNTI5MzFiYiwgTCJudWxsIn0sDQorICAgIHtUT0ticmVhaywgMHgwNTUxOGMyNSwgTCJicmVhayJ9LA0KKyAgICB7VE9La3NhbmQsIDB4MDlmOWRiMzMsIEwiYW5kIn0sDQorICAgIHtUT0tlbmQsIDB4MGE2MzE0MzcsIEwiZW5kIn0sDQorICAgIHtUT0tlb2YsIDB4MGE2MzE5NWEsIEwiZW9mIn0sDQorICAgIHtUT0tmb3IsIDB4MGE3ZDY3YTcsIEwiZm9yIn0sDQorICAgIHtUT0tuYW4sIDB4MGI0ZjkxZGQsIEwibmFuIn0sDQorICAgIHtUT0trc25vdCwgMHgwYjRmZDliMSwgTCJub3QifSwNCisgICAge1RPS3ZhciwgMHgwYzIyMDNlOSwgTCJ2YXIifSwNCisgICAge1RPS3RoZW4sIDB4MmQ1NzM4Y2YsIEwidGhlbiJ9LA0KKyAgICB7VE9LZWxzZSwgMHg0NWY2NWVlOSwgTCJlbHNlIn0sDQorICAgIHtUT0tleGl0LCAweDQ3MzFkNmJhLCBMImV4aXQifSwNCisgICAge1RPS2Rvd250bywgMHg0Y2FhZGMzYiwgTCJkb3dudG8ifSwNCisgICAge1RPS3JldHVybiwgMHg0ZGI4YmQ2MCwgTCJyZXR1cm4ifSwNCisgICAge1RPS2luZmluaXR5LCAweDVjMGEwMTBhLCBMImluZmluaXR5In0sDQorICAgIHtUT0tlbmR3aGlsZSwgMHg1YzY0YmZmMCwgTCJlbmR3aGlsZSJ9LA0KKyAgICB7VE9LZm9yZWFjaCwgMHg2N2UzMWYzOCwgTCJmb3JlYWNoIn0sDQorICAgIHtUT0tlbmRmdW5jLCAweDY4Zjk4NGEzLCBMImVuZGZ1bmMifSwNCisgICAge1RPS2Vsc2VpZiwgMHg3ODI1MzIxOCwgTCJlbHNlaWYifSwNCisgICAge1RPS3doaWxlLCAweDg0MjI5MjU5LCBMIndoaWxlIn0sDQorICAgIHtUT0tlbmRmb3IsIDB4OGFiNDlkN2UsIEwiZW5kZm9yIn0sDQorICAgIHtUT0t0aHJvdywgMHg4ZGIwNWM5NCwgTCJ0aHJvdyJ9LA0KKyAgICB7VE9Lc3RlcCwgMHhhN2E3ODg3YywgTCJzdGVwIn0sDQorICAgIHtUT0t1cHRvLCAweGI1MTU1MzI4LCBMInVwdG8ifSwNCisgICAge1RPS2NvbnRpbnVlLCAweGMwMzQwNjg1LCBMImNvbnRpbnVlIn0sDQorICAgIHtUT0tmdW5jLCAweGNkY2U2MGVjLCBMImZ1bmMifSwNCisgICAge1RPS2VuZGlmLCAweGUwZThmZWU2LCBMImVuZGlmIn0sDQorfTsNCitzdGF0aWMgY29uc3QgRlhfV09SRCBLRVlXT1JEX1NUQVJUID0gVE9LZG87DQorc3RhdGljIGNvbnN0IEZYX1dPUkQgS0VZV09SRF9FTkQgPSBUT0tlbmRpZjsNCitjb25zdCBGWF9XQ0hBUiogWEZBX0ZNX0tleXdvcmRUb1N0cmluZyhYRkFfRk1fVE9LRU4gb3ApIHsNCisgIHJldHVybiBrZXlXb3Jkc1tvcF0ubV9rZXdvcmQ7DQorfQ0KK0NYRkFfRk1Ub2tlbjo6Q1hGQV9GTVRva2VuKCkgew0KKyAgbV90eXBlID0gVE9LcmVzZXJ2ZXI7DQorICBtX3VMaW5lbnVtID0gMTsNCisgIG1fcE5leHQgPSAwOw0KK30NCitDWEZBX0ZNVG9rZW46OkNYRkFfRk1Ub2tlbihGWF9EV09SRCB1TGluZU51bSkgew0KKyAgbV90eXBlID0gVE9LcmVzZXJ2ZXI7DQorICBtX3VMaW5lbnVtID0gdUxpbmVOdW07DQorICBtX3BOZXh0ID0gMDsNCit9DQorQ1hGQV9GTVRva2VuOjp+Q1hGQV9GTVRva2VuKCkge30NCitDWEZBX0ZNTGV4ZXI6OkNYRkFfRk1MZXhlcihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9ybUNhbGMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTUVycm9ySW5mbyogcEVycm9ySW5mbykgew0KKyAgbV9wU2NyaXB0ID0gd3NGb3JtQ2FsYy5HZXRQdHIoKTsNCisgIG1fdUxlbmd0aCA9IHdzRm9ybUNhbGMuR2V0TGVuZ3RoKCk7DQorICBtX3VDdXJyZW50TGluZSA9IDE7DQorICBtX3B0ciA9IG1fcFNjcmlwdDsNCisgIG1fcFRva2VuID0gMDsNCisgIG1fcEVycm9ySW5mbyA9IHBFcnJvckluZm87DQorfQ0KK0NYRkFfRk1Ub2tlbiogQ1hGQV9GTUxleGVyOjpOZXh0VG9rZW4oKSB7DQorICBDWEZBX0ZNVG9rZW4qIHQgPSAwOw0KKyAgaWYgKCFtX3BUb2tlbikgew0KKyAgICBtX3BUb2tlbiA9IFNjYW4oKTsNCisgIH0gZWxzZSB7DQorICAgIGlmIChtX3BUb2tlbi0+bV9wTmV4dCkgew0KKyAgICAgIHQgPSBtX3BUb2tlbi0+bV9wTmV4dDsNCisgICAgICBkZWxldGUgbV9wVG9rZW47DQorICAgICAgbV9wVG9rZW4gPSB0Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHQgPSBtX3BUb2tlbjsNCisgICAgICBtX3BUb2tlbiA9IFNjYW4oKTsNCisgICAgICBkZWxldGUgdDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIG1fcFRva2VuOw0KK30NCitDWEZBX0ZNVG9rZW4qIENYRkFfRk1MZXhlcjo6U2NhbigpIHsNCisgIHVpbnQxNl90IGNoID0gMDsNCisgIENYRkFfRk1Ub2tlbiogcCA9IG5ldyBDWEZBX0ZNVG9rZW4obV91Q3VycmVudExpbmUpOw0KKyAgaWYgKCFYRkFfRk1EQ2hhcjo6aXNBdmFsaWQobV9wdHIpKSB7DQorICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChtX3B0cik7DQorICAgIEVycm9yKEZNRVJSX1VOU1VQUE9SVEVEX0NIQVIsIGNoKTsNCisgICAgcmV0dXJuIHA7DQorICB9DQorICBpbnQgaVJldCA9IDA7DQorICB3aGlsZSAoMSkgew0KKyAgICBpZiAoIVhGQV9GTURDaGFyOjppc0F2YWxpZChtX3B0cikpIHsNCisgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQobV9wdHIpOw0KKyAgICAgIEVycm9yKEZNRVJSX1VOU1VQUE9SVEVEX0NIQVIsIGNoKTsNCisgICAgICByZXR1cm4gcDsNCisgICAgfQ0KKyAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQobV9wdHIpOw0KKyAgICBzd2l0Y2ggKGNoKSB7DQorICAgICAgY2FzZSAwOg0KKyAgICAgICAgcC0+bV90eXBlID0gVE9LZW9mOw0KKyAgICAgICAgcmV0dXJuIHA7DQorICAgICAgY2FzZSAweDBBOg0KKyAgICAgICAgKyttX3VDdXJyZW50TGluZTsNCisgICAgICAgIHAtPm1fdUxpbmVudW0gPSBtX3VDdXJyZW50TGluZTsNCisgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAweDBEOg0KKyAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICc7Jzogew0KKyAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBUZW1wID0gMDsNCisgICAgICAgIENvbW1lbnQobV9wdHIsIHBUZW1wKTsNCisgICAgICAgIG1fcHRyID0gcFRlbXA7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlICciJzogew0KKyAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBUZW1wID0gMDsNCisgICAgICAgIHAtPm1fdHlwZSA9IFRPS3N0cmluZzsNCisgICAgICAgIGlSZXQgPSBTdHJpbmcocCwgbV9wdHIsIHBUZW1wKTsNCisgICAgICAgIGlmIChpUmV0KSB7DQorICAgICAgICAgIHJldHVybiBwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wdHIgPSBwVGVtcDsNCisgICAgICB9DQorICAgICAgICByZXR1cm4gcDsNCisgICAgICBjYXNlICcwJzoNCisgICAgICBjYXNlICcxJzoNCisgICAgICBjYXNlICcyJzoNCisgICAgICBjYXNlICczJzoNCisgICAgICBjYXNlICc0JzoNCisgICAgICBjYXNlICc1JzoNCisgICAgICBjYXNlICc2JzoNCisgICAgICBjYXNlICc3JzoNCisgICAgICBjYXNlICc4JzoNCisgICAgICBjYXNlICc5Jzogew0KKyAgICAgICAgcC0+bV90eXBlID0gVE9LbnVtYmVyOw0KKyAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBUZW1wID0gMDsNCisgICAgICAgIGlSZXQgPSBOdW1iZXIocCwgbV9wdHIsIHBUZW1wKTsNCisgICAgICAgIG1fcHRyID0gcFRlbXA7DQorICAgICAgICBpZiAoaVJldCkgew0KKyAgICAgICAgICBFcnJvcihGTUVSUl9CQURfU1VGRklYX05VTUJFUik7DQorICAgICAgICAgIHJldHVybiBwOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICAgIHJldHVybiBwOw0KKyAgICAgIGNhc2UgJz0nOg0KKyAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICBpZiAoWEZBX0ZNRENoYXI6OmlzQXZhbGlkKG1fcHRyKSkgew0KKyAgICAgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQobV9wdHIpOw0KKyAgICAgICAgICBpZiAoY2ggPT0gJz0nKSB7DQorICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LZXE7DQorICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICAgICAgcmV0dXJuIHA7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LYXNzaWduOw0KKyAgICAgICAgICAgIHJldHVybiBwOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQobV9wdHIpOw0KKyAgICAgICAgICBFcnJvcihGTUVSUl9VTlNVUFBPUlRFRF9DSEFSLCBjaCk7DQorICAgICAgICAgIHJldHVybiBwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnPCc6DQorICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCisgICAgICAgIGlmIChYRkFfRk1EQ2hhcjo6aXNBdmFsaWQobV9wdHIpKSB7DQorICAgICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChtX3B0cik7DQorICAgICAgICAgIGlmIChjaCA9PSAnPScpIHsNCisgICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tsZTsNCisgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCisgICAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnPicpIHsNCisgICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tuZTsNCisgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCisgICAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tsdDsNCisgICAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KG1fcHRyKTsNCisgICAgICAgICAgRXJyb3IoRk1FUlJfVU5TVVBQT1JURURfQ0hBUiwgY2gpOw0KKyAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJz4nOg0KKyAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICBpZiAoWEZBX0ZNRENoYXI6OmlzQXZhbGlkKG1fcHRyKSkgew0KKyAgICAgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQobV9wdHIpOw0KKyAgICAgICAgICBpZiAoY2ggPT0gJz0nKSB7DQorICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LZ2U7DQorICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICAgICAgcmV0dXJuIHA7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LZ3Q7DQorICAgICAgICAgICAgcmV0dXJuIHA7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChtX3B0cik7DQorICAgICAgICAgIEVycm9yKEZNRVJSX1VOU1VQUE9SVEVEX0NIQVIsIGNoKTsNCisgICAgICAgICAgcmV0dXJuIHA7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlICcsJzoNCisgICAgICAgIHAtPm1fdHlwZSA9IFRPS2NvbW1hOw0KKyAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICByZXR1cm4gcDsNCisgICAgICBjYXNlICcoJzoNCisgICAgICAgIHAtPm1fdHlwZSA9IFRPS2xwYXJlbjsNCisgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KKyAgICAgICAgcmV0dXJuIHA7DQorICAgICAgY2FzZSAnKSc6DQorICAgICAgICBwLT5tX3R5cGUgPSBUT0tycGFyZW47DQorICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCisgICAgICAgIHJldHVybiBwOw0KKyAgICAgIGNhc2UgJ1snOg0KKyAgICAgICAgcC0+bV90eXBlID0gVE9LbGJyYWNrZXQ7DQorICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCisgICAgICAgIHJldHVybiBwOw0KKyAgICAgIGNhc2UgJ10nOg0KKyAgICAgICAgcC0+bV90eXBlID0gVE9LcmJyYWNrZXQ7DQorICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCisgICAgICAgIHJldHVybiBwOw0KKyAgICAgIGNhc2UgJyYnOg0KKyAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICBwLT5tX3R5cGUgPSBUT0thbmQ7DQorICAgICAgICByZXR1cm4gcDsNCisgICAgICBjYXNlICd8JzoNCisgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KKyAgICAgICAgcC0+bV90eXBlID0gVE9Lb3I7DQorICAgICAgICByZXR1cm4gcDsNCisgICAgICBjYXNlICcrJzoNCisgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KKyAgICAgICAgcC0+bV90eXBlID0gVE9LcGx1czsNCisgICAgICAgIHJldHVybiBwOw0KKyAgICAgIGNhc2UgJy0nOg0KKyAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICBwLT5tX3R5cGUgPSBUT0ttaW51czsNCisgICAgICAgIHJldHVybiBwOw0KKyAgICAgIGNhc2UgJyonOg0KKyAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICBwLT5tX3R5cGUgPSBUT0ttdWw7DQorICAgICAgICByZXR1cm4gcDsNCisgICAgICBjYXNlICcvJzoNCisgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOw0KKyAgICAgICAgaWYgKFhGQV9GTURDaGFyOjppc0F2YWxpZChtX3B0cikpIHsNCisgICAgICAgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KG1fcHRyKTsNCisgICAgICAgICAgaWYgKGNoID09ICcvJykgew0KKyAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwVGVtcCA9IDA7DQorICAgICAgICAgICAgQ29tbWVudChtX3B0ciwgcFRlbXApOw0KKyAgICAgICAgICAgIG1fcHRyID0gcFRlbXA7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LZGl2Ow0KKyAgICAgICAgICAgIHJldHVybiBwOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQobV9wdHIpOw0KKyAgICAgICAgICBFcnJvcihGTUVSUl9VTlNVUFBPUlRFRF9DSEFSLCBjaCk7DQorICAgICAgICAgIHJldHVybiBwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAnLic6DQorICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCisgICAgICAgIGlmIChYRkFfRk1EQ2hhcjo6aXNBdmFsaWQobV9wdHIpKSB7DQorICAgICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChtX3B0cik7DQorICAgICAgICAgIGlmIChjaCA9PSAnLicpIHsNCisgICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tkb3Rkb3Q7DQorICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICAgICAgcmV0dXJuIHA7DQorICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyonKSB7DQorICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LZG90c3RhcjsNCisgICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCisgICAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnIycpIHsNCisgICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tkb3RzY3JlYW07DQorICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7DQorICAgICAgICAgICAgcmV0dXJuIHA7DQorICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPD0gJzknICYmIGNoID49ICcwJykgew0KKyAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS251bWJlcjsNCisgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcFRlbXAgPSAwOw0KKyAgICAgICAgICAgIFhGQV9GTURDaGFyOjpkZWMobV9wdHIpOw0KKyAgICAgICAgICAgIGlSZXQgPSBOdW1iZXIocCwgbV9wdHIsIHBUZW1wKTsNCisgICAgICAgICAgICBtX3B0ciA9IHBUZW1wOw0KKyAgICAgICAgICAgIGlmIChpUmV0KSB7DQorICAgICAgICAgICAgICBFcnJvcihGTUVSUl9CQURfU1VGRklYX05VTUJFUik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBwOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS2RvdDsNCisgICAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KG1fcHRyKTsNCisgICAgICAgICAgRXJyb3IoRk1FUlJfVU5TVVBQT1JURURfQ0hBUiwgY2gpOw0KKyAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgIH0NCisgICAgICBjYXNlIDB4MDk6DQorICAgICAgY2FzZSAweDBCOg0KKyAgICAgIGNhc2UgMHgwQzoNCisgICAgICBjYXNlIDB4MjA6DQorICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6IHsNCisgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwVGVtcCA9IDA7DQorICAgICAgICBpUmV0ID0gSWRlbnRpZmllcnMocCwgbV9wdHIsIHBUZW1wKTsNCisgICAgICAgIG1fcHRyID0gcFRlbXA7DQorICAgICAgICBpZiAoaVJldCkgew0KKyAgICAgICAgICByZXR1cm4gcDsNCisgICAgICAgIH0NCisgICAgICAgIHAtPm1fdHlwZSA9IElzS2V5d29yZChwLT5tX3dzdHJpbmcpOw0KKyAgICAgIH0NCisgICAgICAgIHJldHVybiBwOw0KKyAgICB9DQorICB9DQorfQ0KK0ZYX0RXT1JEIENYRkFfRk1MZXhlcjo6TnVtYmVyKENYRkFfRk1Ub2tlbiogdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiomIHBFbmQpIHsNCisgIEZYX0RPVUJMRSBudW1iZXIgPSAwOw0KKyAgaWYgKFhGQV9GTURDaGFyOjpzdHJpbmcybnVtYmVyKHAsICZudW1iZXIsIHBFbmQpKSB7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgaWYgKHBFbmQgJiYgWEZBX0ZNRENoYXI6OmlzQWxwaGEocEVuZCkpIHsNCisgICAgcmV0dXJuIDE7DQorICB9DQorICB0LT5tX3dzdHJpbmcgPSBDRlhfV2lkZVN0cmluZ0MocCwgKHBFbmQgLSBwKSk7DQorICByZXR1cm4gMDsNCit9DQorRlhfRFdPUkQgQ1hGQV9GTUxleGVyOjpTdHJpbmcoQ1hGQV9GTVRva2VuKiB0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiYgcEVuZCkgew0KKyAgY29uc3QgRlhfV0NIQVIqIHBTdGFydCA9IHA7DQorICB1aW50MTZfdCBjaCA9IDA7DQorICBYRkFfRk1EQ2hhcjo6aW5jKHApOw0KKyAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KHApOw0KKyAgd2hpbGUgKGNoKSB7DQorICAgIGlmICghWEZBX0ZNRENoYXI6OmlzQXZhbGlkKHApKSB7DQorICAgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KHApOw0KKyAgICAgIHBFbmQgPSBwOw0KKyAgICAgIHQtPm1fd3N0cmluZyA9IENGWF9XaWRlU3RyaW5nQyhwU3RhcnQsIChwRW5kIC0gcFN0YXJ0KSk7DQorICAgICAgRXJyb3IoRk1FUlJfVU5TVVBQT1JURURfQ0hBUiwgY2gpOw0KKyAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICAgIGlmIChjaCA9PSAnIicpIHsNCisgICAgICBYRkFfRk1EQ2hhcjo6aW5jKHApOw0KKyAgICAgIGlmICghWEZBX0ZNRENoYXI6OmlzQXZhbGlkKHApKSB7DQorICAgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQocCk7DQorICAgICAgICBwRW5kID0gcDsNCisgICAgICAgIHQtPm1fd3N0cmluZyA9IENGWF9XaWRlU3RyaW5nQyhwU3RhcnQsIChwRW5kIC0gcFN0YXJ0KSk7DQorICAgICAgICBFcnJvcihGTUVSUl9VTlNVUFBPUlRFRF9DSEFSLCBjaCk7DQorICAgICAgICByZXR1cm4gMTsNCisgICAgICB9DQorICAgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KHApOw0KKyAgICAgIGlmIChjaCA9PSAnIicpIHsNCisgICAgICAgIGdvdG8gTkVYVDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICBORVhUOg0KKyAgICBYRkFfRk1EQ2hhcjo6aW5jKHApOw0KKyAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQocCk7DQorICB9DQorICBwRW5kID0gcDsNCisgIHQtPm1fd3N0cmluZyA9IENGWF9XaWRlU3RyaW5nQyhwU3RhcnQsIChwRW5kIC0gcFN0YXJ0KSk7DQorICByZXR1cm4gMDsNCit9DQorRlhfRFdPUkQgQ1hGQV9GTUxleGVyOjpJZGVudGlmaWVycyhDWEZBX0ZNVG9rZW4qIHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiYgcEVuZCkgew0KKyAgY29uc3QgRlhfV0NIQVIqIHBTdGFydCA9IHA7DQorICB1aW50MTZfdCBjaCA9IDA7DQorICBjaCA9IFhGQV9GTURDaGFyOjpnZXQocCk7DQorICBYRkFfRk1EQ2hhcjo6aW5jKHApOw0KKyAgaWYgKCFYRkFfRk1EQ2hhcjo6aXNBdmFsaWQocCkpIHsNCisgICAgcEVuZCA9IHA7DQorICAgIHQtPm1fd3N0cmluZyA9IENGWF9XaWRlU3RyaW5nQyhwU3RhcnQsIChwRW5kIC0gcFN0YXJ0KSk7DQorICAgIEVycm9yKEZNRVJSX1VOU1VQUE9SVEVEX0NIQVIsIGNoKTsNCisgICAgcmV0dXJuIDE7DQorICB9DQorICBjaCA9IFhGQV9GTURDaGFyOjpnZXQocCk7DQorICB3aGlsZSAoY2gpIHsNCisgICAgaWYgKCFYRkFfRk1EQ2hhcjo6aXNBdmFsaWQocCkpIHsNCisgICAgICBwRW5kID0gcDsNCisgICAgICB0LT5tX3dzdHJpbmcgPSBDRlhfV2lkZVN0cmluZ0MocFN0YXJ0LCAocEVuZCAtIHBTdGFydCkpOw0KKyAgICAgIEVycm9yKEZNRVJSX1VOU1VQUE9SVEVEX0NIQVIsIGNoKTsNCisgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQocCk7DQorICAgIGlmIChYRkFfRk1EQ2hhcjo6aXNVbmljb2RlQWxwaGEoY2gpKSB7DQorICAgICAgWEZBX0ZNRENoYXI6OmluYyhwKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBwRW5kID0gcDsNCisgICAgICB0LT5tX3dzdHJpbmcgPSBDRlhfV2lkZVN0cmluZ0MocFN0YXJ0LCAocEVuZCAtIHBTdGFydCkpOw0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICB9DQorICBwRW5kID0gcDsNCisgIHQtPm1fd3N0cmluZyA9IENGWF9XaWRlU3RyaW5nQyhwU3RhcnQsIChwRW5kIC0gcFN0YXJ0KSk7DQorICByZXR1cm4gMDsNCit9DQordm9pZCBDWEZBX0ZNTGV4ZXI6OkNvbW1lbnQoY29uc3QgRlhfV0NIQVIqIHAsIGNvbnN0IEZYX1dDSEFSKiYgcEVuZCkgew0KKyAgdW5zaWduZWQgY2ggPSAwOw0KKyAgWEZBX0ZNRENoYXI6OmluYyhwKTsNCisgIGNoID0gWEZBX0ZNRENoYXI6OmdldChwKTsNCisgIHdoaWxlIChjaCkgew0KKyAgICBpZiAoY2ggPT0gMHgwRCkgew0KKyAgICAgIFhGQV9GTURDaGFyOjppbmMocCk7DQorICAgICAgcEVuZCA9IHA7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChjaCA9PSAweDBBKSB7DQorICAgICAgKyttX3VDdXJyZW50TGluZTsNCisgICAgICBYRkFfRk1EQ2hhcjo6aW5jKHApOw0KKyAgICAgIHBFbmQgPSBwOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBYRkFfRk1EQ2hhcjo6aW5jKHApOw0KKyAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQocCk7DQorICB9DQorICBwRW5kID0gcDsNCit9DQorWEZBX0ZNX1RPS0VOIENYRkFfRk1MZXhlcjo6SXNLZXl3b3JkKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBzdHIuR2V0TGVuZ3RoKCk7DQorICB1aW50MzJfdCB1SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHN0ci5HZXRQdHIoKSwgaUxlbmd0aCwgVFJVRSk7DQorICBpbnQzMl90IGlTdGFydCA9IEtFWVdPUkRfU1RBUlQsIGlFbmQgPSBLRVlXT1JEX0VORDsNCisgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICBYRkFfRk1LZXl3b3JkIGtleXdvcmQ7DQorICBkbyB7DQorICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICBrZXl3b3JkID0ga2V5V29yZHNbaU1pZF07DQorICAgIGlmICh1SGFzaCA9PSBrZXl3b3JkLm1fdUhhc2gpIHsNCisgICAgICByZXR1cm4ga2V5d29yZC5tX3R5cGU7DQorICAgIH0gZWxzZSBpZiAodUhhc2ggPCBrZXl3b3JkLm1fdUhhc2gpIHsNCisgICAgICBpRW5kID0gaU1pZCAtIDE7DQorICAgIH0gZWxzZSB7DQorICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgIH0NCisgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCisgIHJldHVybiBUT0tpZGVudGlmaWVyOw0KK30NCitDWEZBX0ZNTGV4ZXI6On5DWEZBX0ZNTGV4ZXIoKSB7DQorICBtX3BTY3JpcHQgPSAwOw0KKyAgbV9wdHIgPSBtX3BTY3JpcHQ7DQorICBpZiAobV9wVG9rZW4pIHsNCisgICAgQ1hGQV9GTVRva2VuKiB0MSA9IG1fcFRva2VuOw0KKyAgICBDWEZBX0ZNVG9rZW4qIHQyID0gdDEtPm1fcE5leHQ7DQorICAgIHdoaWxlICh0Mikgew0KKyAgICAgIGRlbGV0ZSB0MTsNCisgICAgICB0MSA9IHQyOw0KKyAgICAgIHQyID0gdDItPm1fcE5leHQ7DQorICAgIH0NCisgICAgZGVsZXRlIG1fcFRva2VuOw0KKyAgICBtX3BUb2tlbiA9IDA7DQorICB9DQorICBtX3BFcnJvckluZm8gPSAwOw0KK30NCit2b2lkIENYRkFfRk1MZXhlcjo6RXJyb3IoWEZBX0ZNX0VSUk1TRyBtc2csIC4uLikgew0KKyAgbV9wRXJyb3JJbmZvLT5saW5lbnVtID0gbV91Q3VycmVudExpbmU7DQorICBjb25zdCBGWF9XQ0hBUiogbHBNZXNzYWdlSW5mbyA9IFhGQV9GTV9FcnJvck1zZyhtc2cpOw0KKyAgdmFfbGlzdCBhcDsNCisgIHZhX3N0YXJ0KGFwLCBtc2cpOw0KKyAgbV9wRXJyb3JJbmZvLT5tZXNzYWdlLkZvcm1hdFYobHBNZXNzYWdlSW5mbywgYXApOw0KKyAgdmFfZW5kKGFwKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZNTGV4ZXI6Okhhc0Vycm9yKCkgY29uc3Qgew0KKyAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX2xleGVyLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9sZXhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlOTQzODAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9sZXhlci5oCkBAIC0wLDAgKzEsMTI4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1hGQV9GTV9MRVhFUl9IDQorI2RlZmluZSBfWEZBX0ZNX0xFWEVSX0gNCitlbnVtIFhGQV9GTV9UT0tFTiB7DQorICBUT0thbmQsDQorICBUT0tscGFyZW4sDQorICBUT0tycGFyZW4sDQorICBUT0ttdWwsDQorICBUT0twbHVzLA0KKyAgVE9LY29tbWEsDQorICBUT0ttaW51cywNCisgIFRPS2RvdCwNCisgIFRPS2RpdiwNCisgIFRPS2x0LA0KKyAgVE9LYXNzaWduLA0KKyAgVE9LZ3QsDQorICBUT0tsYnJhY2tldCwNCisgIFRPS3JicmFja2V0LA0KKyAgVE9Lb3IsDQorICBUT0tkb3RzY3JlYW0sDQorICBUT0tkb3RzdGFyLA0KKyAgVE9LZG90ZG90LA0KKyAgVE9LbGUsDQorICBUT0tuZSwNCisgIFRPS2VxLA0KKyAgVE9LZ2UsDQorICBUT0tkbywNCisgIFRPS2tzZXEsDQorICBUT0trc2dlLA0KKyAgVE9La3NndCwNCisgIFRPS2lmLA0KKyAgVE9LaW4sDQorICBUT0trc2xlLA0KKyAgVE9La3NsdCwNCisgIFRPS2tzbmUsDQorICBUT0trc29yLA0KKyAgVE9LbnVsbCwNCisgIFRPS2JyZWFrLA0KKyAgVE9La3NhbmQsDQorICBUT0tlbmQsDQorICBUT0tlb2YsDQorICBUT0tmb3IsDQorICBUT0tuYW4sDQorICBUT0trc25vdCwNCisgIFRPS3ZhciwNCisgIFRPS3RoZW4sDQorICBUT0tlbHNlLA0KKyAgVE9LZXhpdCwNCisgIFRPS2Rvd250bywNCisgIFRPS3JldHVybiwNCisgIFRPS2luZmluaXR5LA0KKyAgVE9LZW5kd2hpbGUsDQorICBUT0tmb3JlYWNoLA0KKyAgVE9LZW5kZnVuYywNCisgIFRPS2Vsc2VpZiwNCisgIFRPS3doaWxlLA0KKyAgVE9LZW5kZm9yLA0KKyAgVE9LdGhyb3csDQorICBUT0tzdGVwLA0KKyAgVE9LdXB0bywNCisgIFRPS2NvbnRpbnVlLA0KKyAgVE9LZnVuYywNCisgIFRPS2VuZGlmLA0KKyAgVE9Lc3RhciwNCisgIFRPS2lkZW50aWZpZXIsDQorICBUT0t1bmRlcnNjb3JlLA0KKyAgVE9LZG9sbGFyLA0KKyAgVE9LZXhjbGFtYXRpb24sDQorICBUT0tjYWxsLA0KKyAgVE9Lc3RyaW5nLA0KKyAgVE9LbnVtYmVyLA0KKyAgVE9LcmVzZXJ2ZXINCit9Ow0KK3N0cnVjdCBYRkFfRk1LZXl3b3JkIHsNCisgIFhGQV9GTV9UT0tFTiBtX3R5cGU7DQorICB1aW50MzJfdCBtX3VIYXNoOw0KKyAgY29uc3QgRlhfV0NIQVIqIG1fa2V3b3JkOw0KK307DQorY29uc3QgRlhfV0NIQVIqIFhGQV9GTV9LZXl3b3JkVG9TdHJpbmcoWEZBX0ZNX1RPS0VOIG9wKTsNCitjbGFzcyBDWEZBX0ZNVG9rZW4gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNVG9rZW4oKTsNCisgIENYRkFfRk1Ub2tlbihGWF9EV09SRCB1TGluZU51bSk7DQorICB+Q1hGQV9GTVRva2VuKCk7DQorICBDRlhfV2lkZVN0cmluZ0MgbV93c3RyaW5nOw0KKyAgWEZBX0ZNX1RPS0VOIG1fdHlwZTsNCisgIEZYX0RXT1JEIG1fdUxpbmVudW07DQorICBDWEZBX0ZNVG9rZW4qIG1fcE5leHQ7DQorfTsNCitjbGFzcyBDWEZBX0ZNTGV4ZXIgew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNTGV4ZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0Zvcm1jYWxjLCBDWEZBX0ZNRXJyb3JJbmZvKiBwRXJyb3JJbmZvKTsNCisgIH5DWEZBX0ZNTGV4ZXIoKTsNCisgIENYRkFfRk1Ub2tlbiogTmV4dFRva2VuKCk7DQorICBGWF9EV09SRCBOdW1iZXIoQ1hGQV9GTVRva2VuKiB0LCBjb25zdCBGWF9XQ0hBUiogcCwgY29uc3QgRlhfV0NIQVIqJiBwRW5kKTsNCisgIEZYX0RXT1JEIFN0cmluZyhDWEZBX0ZNVG9rZW4qIHQsIGNvbnN0IEZYX1dDSEFSKiBwLCBjb25zdCBGWF9XQ0hBUiomIHBFbmQpOw0KKyAgRlhfRFdPUkQgSWRlbnRpZmllcnMoQ1hGQV9GTVRva2VuKiB0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHAsDQorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiomIHBFbmQpOw0KKyAgdm9pZCBDb21tZW50KGNvbnN0IEZYX1dDSEFSKiBwLCBjb25zdCBGWF9XQ0hBUiomIHBFbmQpOw0KKyAgWEZBX0ZNX1RPS0VOIElzS2V5d29yZChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHApOw0KKyAgdm9pZCBTZXRDdXJyZW50TGluZShGWF9EV09SRCBsaW5lKSB7IG1fdUN1cnJlbnRMaW5lID0gbGluZTsgfQ0KKyAgdm9pZCBTZXRUb2tlbihDWEZBX0ZNVG9rZW4qIHBUb2tlbikgew0KKyAgICBpZiAobV9wVG9rZW4pIHsNCisgICAgICBkZWxldGUgbV9wVG9rZW47DQorICAgIH0NCisgICAgbV9wVG9rZW4gPSBwVG9rZW47DQorICB9DQorICBjb25zdCBGWF9XQ0hBUiogU2F2ZVBvcygpIHsgcmV0dXJuIG1fcHRyOyB9DQorICB2b2lkIFJlc3RvcmVQb3MoY29uc3QgRlhfV0NIQVIqIHBQb3MpIHsgbV9wdHIgPSBwUG9zOyB9DQorICB2b2lkIEVycm9yKFhGQV9GTV9FUlJNU0cgbXNnLCAuLi4pOw0KKyAgRlhfQk9PTCBIYXNFcnJvcigpIGNvbnN0Ow0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDWEZBX0ZNVG9rZW4qIFNjYW4oKTsNCisgIGNvbnN0IEZYX1dDSEFSKiBtX3BTY3JpcHQ7DQorICBjb25zdCBGWF9XQ0hBUiogbV9wdHI7DQorICBGWF9TVFJTSVpFIG1fdUxlbmd0aDsNCisgIEZYX0RXT1JEIG1fdUN1cnJlbnRMaW5lOw0KKyAgQ1hGQV9GTVRva2VuKiBtX3BUb2tlbjsNCisgIENYRkFfRk1FcnJvckluZm8qIG1fcEVycm9ySW5mbzsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX3Byb2dyYW0uY3BwIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfcHJvZ3JhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg0NGQwOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX3Byb2dyYW0uY3BwCkBAIC0wLDAgKzEsNDQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYV9mbTJqcy5oIg0KK0NYRkFfRk1Qcm9ncmFtOjpDWEZBX0ZNUHJvZ3JhbSgpIDogbV9nbG9iYWxGdW5jdGlvbigwKSB7fQ0KK0NYRkFfRk1Qcm9ncmFtOjp+Q1hGQV9GTVByb2dyYW0oKSB7DQorICBpZiAobV9nbG9iYWxGdW5jdGlvbiAhPSAwKSB7DQorICAgIGRlbGV0ZSBtX2dsb2JhbEZ1bmN0aW9uOw0KKyAgICBtX2dsb2JhbEZ1bmN0aW9uID0gMDsNCisgIH0NCit9DQoraW50MzJfdCBDWEZBX0ZNUHJvZ3JhbTo6SW5pdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9ybWNhbGMpIHsNCisgIHJldHVybiBtX3BhcnNlLkluaXQod3NGb3JtY2FsYywgJm1fcEVycm9ySW5mbyk7DQorfQ0KK2ludDMyX3QgQ1hGQV9GTVByb2dyYW06OlBhcnNlUHJvZ3JhbSgpIHsNCisgIENGWF9QdHJBcnJheSogZXhwcmVzc2lvbnMgPSAwOw0KKyAgbV9wYXJzZS5OZXh0VG9rZW4oKTsNCisgIGlmICghbV9wRXJyb3JJbmZvLm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIGV4cHJlc3Npb25zID0gbV9wYXJzZS5QYXJzZVRvcEV4cHJlc3Npb24oKTsNCisgIGlmICghbV9wRXJyb3JJbmZvLm1lc3NhZ2UuSXNFbXB0eSgpKSB7DQorICAgIENYRkFfRk1FeHByZXNzaW9uKiBlID0gMDsNCisgICAgZm9yIChpbnQzMl90IHUgPSAwOyB1IDwgZXhwcmVzc2lvbnMtPkdldFNpemUoKTsgKyt1KSB7DQorICAgICAgZSA9IChDWEZBX0ZNRXhwcmVzc2lvbiopZXhwcmVzc2lvbnMtPkdldEF0KHUpOw0KKyAgICAgIGlmIChlKSB7DQorICAgICAgICBkZWxldGUgZTsNCisgICAgICB9DQorICAgIH0NCisgICAgZGVsZXRlIGV4cHJlc3Npb25zOw0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICBtX2dsb2JhbEZ1bmN0aW9uID0NCisgICAgICBuZXcgQ1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbigxLCAxLCBGWF9XU1RSQyhMIiIpLCAwLCBleHByZXNzaW9ucyk7DQorICByZXR1cm4gMDsNCit9DQoraW50MzJfdCBDWEZBX0ZNUHJvZ3JhbTo6VHJhbnNsYXRlUHJvZ3JhbShDRlhfV2lkZVRleHRCdWYmIHdzSmF2YVNjcmlwdCkgew0KKyAgbV9nbG9iYWxGdW5jdGlvbi0+VG9KYXZhU2NyaXB0KHdzSmF2YVNjcmlwdCk7DQorICB3c0phdmFTY3JpcHQuQXBwZW5kQ2hhcigwKTsNCisgIHJldHVybiAwOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9wcm9ncmFtLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9wcm9ncmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RmYTcyNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX3Byb2dyYW0uaApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1hGQV9GTV9QUk9HUkFNX0gNCisjZGVmaW5lIF9YRkFfRk1fUFJPR1JBTV9IDQorY2xhc3MgQ1hGQV9GTVByb2dyYW0gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNUHJvZ3JhbSgpOw0KKyAgfkNYRkFfRk1Qcm9ncmFtKCk7DQorICBpbnQzMl90IEluaXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0Zvcm1jYWxjKTsNCisgIGludDMyX3QgUGFyc2VQcm9ncmFtKCk7DQorICBpbnQzMl90IFRyYW5zbGF0ZVByb2dyYW0oQ0ZYX1dpZGVUZXh0QnVmJiB3c0phdmFTY3JpcHQpOw0KKyAgQ1hGQV9GTUVycm9ySW5mbyYgR2V0RXJyb3IoKSB7IHJldHVybiBtX3BFcnJvckluZm87IH0NCisNCisgcHJpdmF0ZToNCisgIENYRkFfRk1FcnJvckluZm8gbV9wRXJyb3JJbmZvOw0KKyAgQ1hGQV9GTVBhcnNlIG1fcGFyc2U7DQorICBDWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uKiBtX2dsb2JhbEZ1bmN0aW9uOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfc2ltcGxlZXhwcmVzc2lvbi5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9zaW1wbGVleHByZXNzaW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjNjZWFjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9mbTJqcy94ZmFfc2ltcGxlZXhwcmVzc2lvbi5jcHAKQEAgLTAsMCArMSw3MTEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYV9mbTJqcy5oIg0KK3N0YXRpYyBDRlhfV2lkZVN0cmluZ0MgZ3NfbHBTdHJFeHBGdW5jTmFtZVtdID0gew0KKyAgICBGWF9XU1RSQyhMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lLmFzc2lnbl92YWx1ZV9vcGVyYXRvciIpLA0KKyAgICBGWF9XU1RSQyhMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lLmxvZ2ljYWxfb3Jfb3BlcmF0b3IiKSwNCisgICAgRlhfV1NUUkMoTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5sb2dpY2FsX2FuZF9vcGVyYXRvciIpLA0KKyAgICBGWF9XU1RSQyhMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lLmVxdWFsaXR5X29wZXJhdG9yIiksDQorICAgIEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUubm90ZXF1YWxpdHlfb3BlcmF0b3IiKSwNCisgICAgRlhfV1NUUkMoTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5sZXNzX29wZXJhdG9yIiksDQorICAgIEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUubGVzc2VxdWFsX29wZXJhdG9yIiksDQorICAgIEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUuZ3JlYXRlcl9vcGVyYXRvciIpLA0KKyAgICBGWF9XU1RSQyhMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lLmdyZWF0ZXJlcXVhbF9vcGVyYXRvciIpLA0KKyAgICBGWF9XU1RSQyhMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lLnBsdXNfb3BlcmF0b3IiKSwNCisgICAgRlhfV1NUUkMoTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5taW51c19vcGVyYXRvciIpLA0KKyAgICBGWF9XU1RSQyhMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lLm11bHRpcGxlX29wZXJhdG9yIiksDQorICAgIEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUuZGl2aWRlX29wZXJhdG9yIiksDQorICAgIEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUucG9zaXRpdmVfb3BlcmF0b3IiKSwNCisgICAgRlhfV1NUUkMoTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5uZWdhdGl2ZV9vcGVyYXRvciIpLA0KKyAgICBGWF9XU1RSQyhMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lLmxvZ2ljYWxfbm90X29wZXJhdG9yIiksDQorICAgIEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUuIiksDQorICAgIEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUuZG90X2FjY2Vzc29yIiksDQorICAgIEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUuZG90ZG90X2FjY2Vzc29yIiksDQorICAgIEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUuY29uY2F0X2ZtX29iamVjdCIpLA0KKyAgICBGWF9XU1RSQyhMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lLmlzX2ZtX29iamVjdCIpLA0KKyAgICBGWF9XU1RSQyhMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lLmlzX2ZtX2FycmF5IiksDQorICAgIEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUuZ2V0X2ZtX3ZhbHVlIiksDQorICAgIEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUuZ2V0X2ZtX2pzb2JqIiksDQorICAgIEZYX1dTVFJDKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUuZm1fdmFyX2ZpbHRlciIpLA0KK307DQorQ0ZYX1dpZGVTdHJpbmdDIFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoDQorICAgIFhGQV9GTV9TaW1wbGVFeHByZXNzaW9uVHlwZSBzaW1wbGVFeHBUeXBlKSB7DQorICByZXR1cm4gZ3NfbHBTdHJFeHBGdW5jTmFtZVtzaW1wbGVFeHBUeXBlXTsNCit9DQorc3RhdGljIFhGQV9GTUJ1aWxkSW5GdW5jIGJ1aWxkSW5GdW5jc1tdID0gew0KKyAgICB7MHgwMDAxZjFmNSwgTCJBdCJ9LCAgICAgICAgICAgezB4MDAwMjBiOWMsIEwiRlYifSwNCisgICAgezB4MDAwMjFhZWYsIEwiSWYifSwgICAgICAgICAgIHsweDAwMDIzZWU2LCBMIlBWIn0sDQorICAgIHsweDA0YjVjOWVlLCBMIkVuY29kZSJ9LCAgICAgICB7MHgwOGU5NjY4NSwgTCJEYXRlRm10In0sDQorICAgIHsweDA5Zjk5ZGI2LCBMIkFicyJ9LCAgICAgICAgICB7MHgwOWY5ZTU4MywgTCJBcHIifSwNCisgICAgezB4MDlmYTA0M2UsIEwiQXZnIn0sICAgICAgICAgIHsweDBhOTc4MmEwLCBMIkdldCJ9LA0KKyAgICB7MHgwYjFiMDlkZiwgTCJMZW4ifSwgICAgICAgICAgezB4MGIzNTQzYTYsIEwiTWF4In0sDQorICAgIHsweDBiMzU2Y2E0LCBMIk1pbiJ9LCAgICAgICAgICB7MHgwYjM1OGI2MCwgTCJNb2QifSwNCisgICAgezB4MGI0ZmRlZDQsIEwiTlBWIn0sICAgICAgICAgIHsweDBiODQ2YmYxLCBMIlBtdCJ9LA0KKyAgICB7MHgwYjg0OTRmOSwgTCJQdXQifSwgICAgICAgICAgezB4MGJiOGRmNWQsIEwiUmVmIn0sDQorICAgIHsweDBiZDM3YTk5LCBMIlN0ciJ9LCAgICAgICAgICB7MHgwYmQzN2ZiNSwgTCJTdW0ifSwNCisgICAgezB4MTA0ODQ2OWIsIEwiQ3Rlcm0ifSwgICAgICAgIHsweDExZTAzNjYwLCBMIkV4aXN0cyJ9LA0KKyAgICB7MHgxMjYyMzZlNiwgTCJQb3N0In0sICAgICAgICAgezB4MTI3YzY2NjEsIEwiUFBtdCJ9LA0KKyAgICB7MHgxOTNhZGUzZSwgTCJSaWdodCJ9LCAgICAgICAgezB4MWVjOGFiMmMsIEwiUmF0ZSJ9LA0KKyAgICB7MHgyMGU0NzZkYywgTCJJc29UaW1lMk51bSJ9LCAgezB4MjNlYjY4MTYsIEwiVGltZUZtdCJ9LA0KKyAgICB7MHgyNGZiMTdiMCwgTCJMb2NhbERhdGVGbXQifSwgezB4MjhkZWU2ZTksIEwiRm9ybWF0In0sDQorICAgIHsweDJkMDg5MGI4LCBMIlRlcm0ifSwgICAgICAgICB7MHgyZDcxYjAwZiwgTCJUaW1lIn0sDQorICAgIHsweDJmODkwZmIxLCBMIk51bTJUaW1lIn0sICAgICB7MHgzNzY3NTExZCwgTCJDZWlsIn0sDQorICAgIHsweDNmZmQxOTQxLCBMIkxvY2FsVGltZUZtdCJ9LCB7MHg0NDJmNjhjOCwgTCJSb3VuZCJ9LA0KKyAgICB7MHg0NmZkMTEyOCwgTCJFdmFsIn0sICAgICAgICAgezB4NGQ2Mjk0NDAsIEwiRGF0ZTJOdW0ifSwNCisgICAgezB4NGRjZjI1ZjgsIEwiQ29uY2F0In0sICAgICAgIHsweDRlMDAyNTVkLCBMIlVuaXRWYWx1ZSJ9LA0KKyAgICB7MHg1NWE1Y2MyOSwgTCJMb3dlciJ9LCAgICAgICAgezB4NWU0M2UwNGMsIEwiV29yZE51bSJ9LA0KKyAgICB7MHg2MjBjZTZiYSwgTCJJcG10In0sICAgICAgICAgezB4NmY1NDRkNDksIEwiQ291bnQifSwNCisgICAgezB4N2UyNDEwMTMsIEwiV2l0aGluIn0sICAgICAgIHsweDliOWE2ZTJiLCBMIklzb0RhdGUyTnVtIn0sDQorICAgIHsweGIyYzk0MWMyLCBMIlVuaXRUeXBlIn0sICAgICB7MHhiNTk4YTFmNywgTCJVdWlkIn0sDQorICAgIHsweGJkZTlhYmRlLCBMIkRhdGUifSwgICAgICAgICB7MHhjMDAxMGI4MCwgTCJOdW0yRGF0ZSJ9LA0KKyAgICB7MHhjMWY2MTQ0YywgTCJVcHBlciJ9LCAgICAgICAgezB4YzQ0MDI4ZjcsIEwiT25lb2YifSwNCisgICAgezB4YzYyYzFiMmMsIEwiU3BhY2UifSwgICAgICAgIHsweGQwZmY1MGY5LCBMIkhhc1ZhbHVlIn0sDQorICAgIHsweGQxNTM3MDQyLCBMIkZsb29yIn0sICAgICAgICB7MHhkMmFjOWNmMSwgTCJUaW1lMk51bSJ9LA0KKyAgICB7MHhkOTA3YWVlNSwgTCJOdW0yR01UaW1lIn0sICAgezB4ZGYyNGY3YzQsIEwiRGVjb2RlIn0sDQorICAgIHsweGUyNjY0ODAzLCBMIlN1YnN0ciJ9LCAgICAgICB7MHhlM2U3YjUyOCwgTCJTdHVmZiJ9LA0KKyAgICB7MHhlNjc5MmQ0ZSwgTCJSdHJpbSJ9LCAgICAgICAgezB4ZThjMjNmNWIsIEwiUGFyc2UifSwNCisgICAgezB4ZWExOGQxMjEsIEwiQ2hvb3NlIn0sICAgICAgIHsweGViZmVmNjljLCBMIlJlcGxhY2UifSwNCisgICAgezB4ZjVhZDc4MmIsIEwiTGVmdCJ9LCAgICAgICAgIHsweGY3YmIyMjQ4LCBMIkx0cmltIn0sDQorfTsNCitzdGF0aWMgY29uc3QgWEZBX0ZNU09NTWV0aG9kIGdzX0ZNU29tTWV0aG9kc1tdID0gew0KKyAgICB7MHgwMDAwMDA2OCwgTCJoIiwgMHgwMX0sDQorICAgIHsweDAwMDAwMDc3LCBMInciLCAweDAxfSwNCisgICAgezB4MDAwMDAwNzgsIEwieCIsIDB4MDF9LA0KKyAgICB7MHgwMDAwMDA3OSwgTCJ5IiwgMHgwMX0sDQorICAgIHsweDA1ZWI1YjBmLCBMInBhZ2VTcGFuIiwgMHgwMX0sDQorICAgIHsweDEwZjFiMWJkLCBMInBhZ2UiLCAweDAxfSwNCisgICAgezB4M2JmMWMyYTUsIEwiYWJzUGFnZVNwYW4iLCAweDAxfSwNCisgICAgezB4M2M3NTI0OTUsIEwidmVyaWZ5IiwgMHgwZH0sDQorICAgIHsweDQ0YzM1MmFkLCBMImZvcm1Ob2RlcyIsIDB4MDF9LA0KKyAgICB7MHg1Nzc1YzJjYywgTCJhYnNQYWdlSW5CYXRjaCIsIDB4MDF9LA0KKyAgICB7MHg1ZWUwMDk5NiwgTCJzZXRFbGVtZW50IiwgMHgwMX0sDQorICAgIHsweDcwMzNiZmQ1LCBMImluc2VydCIsIDB4MDN9LA0KKyAgICB7MHg4YzVmZWIzMiwgTCJzaGVldEluQmF0Y2giLCAweDAxfSwNCisgICAgezB4OGYzYTgzNzksIEwic2hlZXQiLCAweDAxfSwNCisgICAgezB4OTJkYWRhNGYsIEwic2F2ZUZpbHRlcmVkWE1MIiwgMHgwMX0sDQorICAgIHsweDljYWI3Y2FlLCBMInJlbW92ZSIsIDB4MDF9LA0KKyAgICB7MHhhNjg2MzVmMSwgTCJzaWduIiwgMHg2MX0sDQorICAgIHsweGFhYzI0MWM4LCBMImlzUmVjb3JkR3JvdXAiLCAweDAxfSwNCisgICAgezB4ZDhlZDE0NjcsIEwiY2xlYXIiLCAweDAxfSwNCisgICAgezB4ZGExMmU1MTgsIEwiYXBwZW5kIiwgMHgwMX0sDQorICAgIHsweGU3NGYwNjUzLCBMImFic1BhZ2UiLCAweDAxfSwNCit9Ow0KK0NYRkFfRk1TaW1wbGVFeHByZXNzaW9uOjpDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBYRkFfRk1fVE9LRU4gb3ApDQorICAgIDogbV9saW5lKGxpbmUpLCBtX29wKG9wKSB7fQ0KK3ZvaWQgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHt9DQordm9pZCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7fQ0KK1hGQV9GTV9UT0tFTiBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbjo6R2V0T3BlcmF0b3JUb2tlbigpIGNvbnN0IHsNCisgIHJldHVybiBtX29wOw0KK30NCitDWEZBX0ZNTnVsbEV4cHJlc3Npb246OkNYRkFfRk1OdWxsRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lKQ0KKyAgICA6IENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKGxpbmUsIFRPS251bGwpIHt9DQordm9pZCBDWEZBX0ZNTnVsbEV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJudWxsIik7DQorfQ0KK0NYRkFfRk1OdW1iZXJFeHByZXNzaW9uOjpDWEZBX0ZNTnVtYmVyRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NOdW1iZXIpDQorICAgIDogQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24obGluZSwgVE9LbnVtYmVyKSwgbV93c051bWJlcih3c051bWJlcikge30NCit2b2lkIENYRkFfRk1OdW1iZXJFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBqYXZhc2NyaXB0IDw8IG1fd3NOdW1iZXI7DQorfQ0KK0NYRkFfRk1TdHJpbmdFeHByZXNzaW9uOjpDWEZBX0ZNU3RyaW5nRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NTdHJpbmcpDQorICAgIDogQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24obGluZSwgVE9Lc3RyaW5nKSwgbV93c1N0cmluZyh3c1N0cmluZykge30NCit2b2lkIENYRkFfRk1TdHJpbmdFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBDRlhfV2lkZVN0cmluZyB0ZW1wU3RyID0gbV93c1N0cmluZzsNCisgIGlmICh0ZW1wU3RyLkdldExlbmd0aCgpID4gMikgew0KKyAgICBqYXZhc2NyaXB0LkFwcGVuZENoYXIoTCdcIicpOw0KKyAgICBGWF9XQ0hBUiBvbmVDaGFyOw0KKyAgICBmb3IgKGludDE2X3QgaSA9IDE7IGkgPCB0ZW1wU3RyLkdldExlbmd0aCgpIC0gMTsgaSsrKSB7DQorICAgICAgb25lQ2hhciA9IHRlbXBTdHJbaV07DQorICAgICAgc3dpdGNoIChvbmVDaGFyKSB7DQorICAgICAgICBjYXNlIEwnXCInOiB7DQorICAgICAgICAgIGkrKzsNCisgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlxcXCIiKTsNCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBjYXNlIDB4MGQ6DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAweDBhOiB7DQorICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcXG4iKTsNCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBkZWZhdWx0OiB7IGphdmFzY3JpcHQuQXBwZW5kQ2hhcihvbmVDaGFyKTsgfSBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgamF2YXNjcmlwdC5BcHBlbmRDaGFyKEwnXCInKTsNCisgIH0gZWxzZSB7DQorICAgIGphdmFzY3JpcHQgPDwgdGVtcFN0cjsNCisgIH0NCit9DQorQ1hGQV9GTUlkZW50aWZpZXJFeHByZXNzaW9ubjo6Q1hGQV9GTUlkZW50aWZpZXJFeHByZXNzaW9ubigNCisgICAgRlhfRFdPUkQgbGluZSwNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSWRlbnRpZmllcikNCisgICAgOiBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbihsaW5lLCBUT0tpZGVudGlmaWVyKSwNCisgICAgICBtX3dzSWRlbnRpZmllcih3c0lkZW50aWZpZXIpIHt9DQordm9pZCBDWEZBX0ZNSWRlbnRpZmllckV4cHJlc3Npb25uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBDRlhfV2lkZVN0cmluZyB0ZW1wU3RyID0gbV93c0lkZW50aWZpZXI7DQorICBpZiAodGVtcFN0ci5FcXVhbChGWF9XU1RSQyhMIiQiKSkpIHsNCisgICAgdGVtcFN0ciA9IEZYX1dTVFJDKEwidGhpcyIpOw0KKyAgfSBlbHNlIGlmICh0ZW1wU3RyLkVxdWFsKEZYX1dTVFJDKEwiISIpKSkgew0KKyAgICB0ZW1wU3RyID0gRlhfV1NUUkMoTCJ4ZmEuZGF0YXNldHMiKTsNCisgIH0gZWxzZSBpZiAodGVtcFN0ci5FcXVhbChGWF9XU1RSQyhMIiRkYXRhIikpKSB7DQorICAgIHRlbXBTdHIgPSBGWF9XU1RSQyhMInhmYS5kYXRhc2V0cy5kYXRhIik7DQorICB9IGVsc2UgaWYgKHRlbXBTdHIuRXF1YWwoRlhfV1NUUkMoTCIkZXZlbnQiKSkpIHsNCisgICAgdGVtcFN0ciA9IEZYX1dTVFJDKEwieGZhLmV2ZW50Iik7DQorICB9IGVsc2UgaWYgKHRlbXBTdHIuRXF1YWwoRlhfV1NUUkMoTCIkZm9ybSIpKSkgew0KKyAgICB0ZW1wU3RyID0gRlhfV1NUUkMoTCJ4ZmEuZm9ybSIpOw0KKyAgfSBlbHNlIGlmICh0ZW1wU3RyLkVxdWFsKEZYX1dTVFJDKEwiJGhvc3QiKSkpIHsNCisgICAgdGVtcFN0ciA9IEZYX1dTVFJDKEwieGZhLmhvc3QiKTsNCisgIH0gZWxzZSBpZiAodGVtcFN0ci5FcXVhbChGWF9XU1RSQyhMIiRsYXlvdXQiKSkpIHsNCisgICAgdGVtcFN0ciA9IEZYX1dTVFJDKEwieGZhLmxheW91dCIpOw0KKyAgfSBlbHNlIGlmICh0ZW1wU3RyLkVxdWFsKEZYX1dTVFJDKEwiJHRlbXBsYXRlIikpKSB7DQorICAgIHRlbXBTdHIgPSBGWF9XU1RSQyhMInhmYS50ZW1wbGF0ZSIpOw0KKyAgfSBlbHNlIGlmICh0ZW1wU3RyWzBdID09IEwnIScpIHsNCisgICAgdGVtcFN0ciA9IEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIgKyB0ZW1wU3RyLk1pZCgxKTsNCisgIH0NCisgIGphdmFzY3JpcHQgPDwgdGVtcFN0cjsNCisgIHJldHVybjsNCit9DQorQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbjo6Q1hGQV9GTVVuYXJ5RXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZNX1RPS0VOIG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHApDQorICAgIDogQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24obGluZSwgb3ApLCBtX3BFeHAocEV4cCkge30NCitDWEZBX0ZNVW5hcnlFeHByZXNzaW9uOjp+Q1hGQV9GTVVuYXJ5RXhwcmVzc2lvbigpIHsNCisgIGlmIChtX3BFeHAgIT0gMCkgew0KKyAgICBkZWxldGUgbV9wRXhwOw0KKyAgICBtX3BFeHAgPSAwOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRk1VbmFyeUV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHt9DQorQ1hGQV9GTUJpbkV4cHJlc3Npb246OkNYRkFfRk1CaW5FeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9GTV9UT0tFTiBvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cDIpDQorICAgIDogQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24obGluZSwgb3ApLCBtX3BFeHAxKHBFeHAxKSwgbV9wRXhwMihwRXhwMikge30NCitDWEZBX0ZNQmluRXhwcmVzc2lvbjo6fkNYRkFfRk1CaW5FeHByZXNzaW9uKCkgew0KKyAgaWYgKG1fcEV4cDEgIT0gMCkgew0KKyAgICBkZWxldGUgbV9wRXhwMTsNCisgICAgbV9wRXhwMSA9IDA7DQorICB9DQorICBpZiAobV9wRXhwMiAhPSAwKSB7DQorICAgIGRlbGV0ZSBtX3BFeHAyOw0KKyAgICBtX3BFeHAyID0gMDsNCisgIH0NCit9DQordm9pZCBDWEZBX0ZNQmluRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkge30NCitDWEZBX0ZNQXNzaWduRXhwcmVzc2lvbjo6Q1hGQV9GTUFzc2lnbkV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZNX1RPS0VOIG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwMikNCisgICAgOiBDWEZBX0ZNQmluRXhwcmVzc2lvbihsaW5lLCBvcCwgcEV4cDEsIHBFeHAyKSB7fQ0KK3ZvaWQgQ1hGQV9GTUFzc2lnbkV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJpZiAoIik7DQorICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbSVNGTU9CSkVDVF07DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikpXG57XG4iKTsNCisgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtBU1NJR05dOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgIG1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KKyAgbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIik7XG59XG4iKTsNCisgIENGWF9XaWRlVGV4dEJ1ZiB0ZW1wRXhwMTsNCisgIG1fcEV4cDEtPlRvSmF2YVNjcmlwdCh0ZW1wRXhwMSk7DQorICBpZiAobV9wRXhwMS0+R2V0T3BlcmF0b3JUb2tlbigpID09IFRPS2lkZW50aWZpZXIgJiYNCisgICAgICB0ZW1wRXhwMS5HZXRXaWRlU3RyaW5nKCkgIT0gRlhfV1NUUkMoTCJ0aGlzIikpIHsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImVsc2VcbntcbiIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IHRlbXBFeHAxOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gIik7DQorICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtBU1NJR05dOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KKyAgICBtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpO1xufVxuIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9GTUFzc2lnbkV4cHJlc3Npb246OlRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgew0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImlmICgiKTsNCisgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtJU0ZNT0JKRUNUXTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSlcbntcbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAiKTsNCisgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtBU1NJR05dOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgIG1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIsICIpOw0KKyAgbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIik7XG59XG4iKTsNCisgIENGWF9XaWRlVGV4dEJ1ZiB0ZW1wRXhwMTsNCisgIG1fcEV4cDEtPlRvSmF2YVNjcmlwdCh0ZW1wRXhwMSk7DQorICBpZiAobV9wRXhwMS0+R2V0T3BlcmF0b3JUb2tlbigpID09IFRPS2lkZW50aWZpZXIgJiYNCisgICAgICB0ZW1wRXhwMS5HZXRXaWRlU3RyaW5nKCkgIT0gRlhfV1NUUkMoTCJ0aGlzIikpIHsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMImVsc2VcbntcbiIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiID0gIik7DQorICAgIGphdmFzY3JpcHQgPDwgdGVtcEV4cDE7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIgPSAiKTsNCisgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0FTU0lHTl07DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICAgIG1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiwgIik7DQorICAgIG1fcEV4cDItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIik7XG59XG4iKTsNCisgIH0NCit9DQorQ1hGQV9GTUxvZ2ljYWxPckV4cHJlc3Npb246OkNYRkFfRk1Mb2dpY2FsT3JFeHByZXNzaW9uKA0KKyAgICBGWF9EV09SRCBsaW5lLA0KKyAgICBYRkFfRk1fVE9LRU4gb3AsDQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwMSwNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHAyKQ0KKyAgICA6IENYRkFfRk1CaW5FeHByZXNzaW9uKGxpbmUsIG9wLCBwRXhwMSwgcEV4cDIpIHt9DQordm9pZCBDWEZBX0ZNTG9naWNhbE9yRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgew0KKyAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0xPR0lDQUxPUl07DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiwgIik7DQorICBtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KK30NCitDWEZBX0ZNTG9naWNhbEFuZEV4cHJlc3Npb246OkNYRkFfRk1Mb2dpY2FsQW5kRXhwcmVzc2lvbigNCisgICAgRlhfRFdPUkQgbGluZSwNCisgICAgWEZBX0ZNX1RPS0VOIG9wLA0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cDEsDQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwMikNCisgICAgOiBDWEZBX0ZNQmluRXhwcmVzc2lvbihsaW5lLCBvcCwgcEV4cDEsIHBFeHAyKSB7fQ0KK3ZvaWQgQ1hGQV9GTUxvZ2ljYWxBbmRFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbTE9HSUNBTEFORF07DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiwgIik7DQorICBtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KK30NCitDWEZBX0ZNRXF1YWxpdHlFeHByZXNzaW9uOjpDWEZBX0ZNRXF1YWxpdHlFeHByZXNzaW9uKA0KKyAgICBGWF9EV09SRCBsaW5lLA0KKyAgICBYRkFfRk1fVE9LRU4gb3AsDQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwMSwNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHAyKQ0KKyAgICA6IENYRkFfRk1CaW5FeHByZXNzaW9uKGxpbmUsIG9wLCBwRXhwMSwgcEV4cDIpIHt9DQordm9pZCBDWEZBX0ZNRXF1YWxpdHlFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBzd2l0Y2ggKG1fb3ApIHsNCisgICAgY2FzZSBUT0tlcToNCisgICAgY2FzZSBUT0trc2VxOg0KKyAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtFUVVBTElUWV07DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgVE9LbmU6DQorICAgIGNhc2UgVE9La3NuZToNCisgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbTk9URVFVQUxJVFldOw0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQorICAgICAgYnJlYWs7DQorICB9DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiwgIik7DQorICBtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KK30NCitDWEZBX0ZNUmVsYXRpb25hbEV4cHJlc3Npb246OkNYRkFfRk1SZWxhdGlvbmFsRXhwcmVzc2lvbigNCisgICAgRlhfRFdPUkQgbGluZSwNCisgICAgWEZBX0ZNX1RPS0VOIG9wLA0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cDEsDQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwMikNCisgICAgOiBDWEZBX0ZNQmluRXhwcmVzc2lvbihsaW5lLCBvcCwgcEV4cDEsIHBFeHAyKSB7fQ0KK3ZvaWQgQ1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBzd2l0Y2ggKG1fb3ApIHsNCisgICAgY2FzZSBUT0tsdDoNCisgICAgY2FzZSBUT0trc2x0Og0KKyAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtMRVNTXTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBUT0tndDoNCisgICAgY2FzZSBUT0trc2d0Og0KKyAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtHUkVBVEVSXTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBUT0tsZToNCisgICAgY2FzZSBUT0trc2xlOg0KKyAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtMRVNTRVFVQUxdOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRPS2dlOg0KKyAgICBjYXNlIFRPS2tzZ2U6DQorICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0dSRUFURVJFUVVBTF07DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCisgICAgICBicmVhazsNCisgIH0NCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLCAiKTsNCisgIG1fcEV4cDItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpIik7DQorfQ0KK0NYRkFfRk1BZGRpdGl2ZUV4cHJlc3Npb246OkNYRkFfRk1BZGRpdGl2ZUV4cHJlc3Npb24oDQorICAgIEZYX0RXT1JEIGxpbmUsDQorICAgIFhGQV9GTV9UT0tFTiBvcCwNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHAxLA0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cDIpDQorICAgIDogQ1hGQV9GTUJpbkV4cHJlc3Npb24obGluZSwgb3AsIHBFeHAxLCBwRXhwMikge30NCit2b2lkIENYRkFfRk1BZGRpdGl2ZUV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIHN3aXRjaCAobV9vcCkgew0KKyAgICBjYXNlIFRPS3BsdXM6DQorICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW1BMVVNdOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFRPS21pbnVzOg0KKyAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtNSU5VU107DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCisgICAgICBicmVhazsNCisgIH0NCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLCAiKTsNCisgIG1fcEV4cDItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpIik7DQorfQ0KK0NYRkFfRk1NdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb246OkNYRkFfRk1NdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oDQorICAgIEZYX0RXT1JEIGxpbmUsDQorICAgIFhGQV9GTV9UT0tFTiBvcCwNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHAxLA0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cDIpDQorICAgIDogQ1hGQV9GTUJpbkV4cHJlc3Npb24obGluZSwgb3AsIHBFeHAxLCBwRXhwMikge30NCit2b2lkIENYRkFfRk1NdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb246OlRvSmF2YVNjcmlwdCgNCisgICAgQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBzd2l0Y2ggKG1fb3ApIHsNCisgICAgY2FzZSBUT0ttdWw6DQorICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW01VTFRJUExFXTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBUT0tkaXY6DQorICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0RJVklERV07DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCisgICAgICBicmVhazsNCisgIH0NCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLCAiKTsNCisgIG1fcEV4cDItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpIik7DQorfQ0KK0NYRkFfRk1Qb3NFeHByZXNzaW9uOjpDWEZBX0ZNUG9zRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cCkNCisgICAgOiBDWEZBX0ZNVW5hcnlFeHByZXNzaW9uKGxpbmUsIFRPS3BsdXMsIHBFeHApIHt9DQordm9pZCBDWEZBX0ZNUG9zRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgew0KKyAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW1BPU0lUSVZFXTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICBtX3BFeHAtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpIik7DQorfQ0KK0NYRkFfRk1OZWdFeHByZXNzaW9uOjpDWEZBX0ZNTmVnRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cCkNCisgICAgOiBDWEZBX0ZNVW5hcnlFeHByZXNzaW9uKGxpbmUsIFRPS21pbnVzLCBwRXhwKSB7fQ0KK3ZvaWQgQ1hGQV9GTU5lZ0V4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtORUdBVElWRV07DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgbV9wRXhwLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KK30NCitDWEZBX0ZNTm90RXhwcmVzc2lvbjo6Q1hGQV9GTU5vdEV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHApDQorICAgIDogQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbihsaW5lLCBUT0trc25vdCwgcEV4cCkge30NCit2b2lkIENYRkFfRk1Ob3RFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbTk9UXTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICBtX3BFeHAtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpIik7DQorfQ0KK0NYRkFfRk1DYWxsRXhwcmVzc2lvbjo6Q1hGQV9GTUNhbGxFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1B0ckFycmF5KiBwQXJndW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYklzU29tTWV0aG9kKQ0KKyAgICA6IENYRkFfRk1VbmFyeUV4cHJlc3Npb24obGluZSwgVE9LY2FsbCwgcEV4cCksDQorICAgICAgbV9iSXNTb21NZXRob2QoYklzU29tTWV0aG9kKSwNCisgICAgICBtX3BBcmd1bWVudHMocEFyZ3VtZW50cykgew0KK30NCitDWEZBX0ZNQ2FsbEV4cHJlc3Npb246On5DWEZBX0ZNQ2FsbEV4cHJlc3Npb24oKSB7DQorICBpZiAobV9wQXJndW1lbnRzKSB7DQorICAgIGludDMyX3QgYXJnYyA9IG1fcEFyZ3VtZW50cy0+R2V0U2l6ZSgpOw0KKyAgICBpbnQzMl90IGluZGV4ID0gMDsNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIGUgPSAwOw0KKyAgICB3aGlsZSAoaW5kZXggPCBhcmdjKSB7DQorICAgICAgZSA9IChDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiopbV9wQXJndW1lbnRzLT5HZXRBdChpbmRleCk7DQorICAgICAgZGVsZXRlIGU7DQorICAgICAgaW5kZXgrKzsNCisgICAgfQ0KKyAgICBtX3BBcmd1bWVudHMtPlJlbW92ZUFsbCgpOw0KKyAgICBkZWxldGUgbV9wQXJndW1lbnRzOw0KKyAgICBtX3BBcmd1bWVudHMgPSAwOw0KKyAgfQ0KK30NCitGWF9CT09MIENYRkFfRk1DYWxsRXhwcmVzc2lvbjo6SXNCdWlsZEluRnVuYyhDRlhfV2lkZVRleHRCdWYmIGZ1bmNOYW1lKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBmdW5jTmFtZS5HZXRMZW5ndGgoKTsNCisgIHVpbnQzMl90IHVIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoZnVuY05hbWUuR2V0QnVmZmVyKCksIGlMZW5ndGgsIFRSVUUpOw0KKyAgWEZBX0ZNQnVpbGRJbkZ1bmMgYnVpbGRpbmZ1bmN0aW9uOw0KKyAgaW50MzJfdCBpU3RhcnQgPSAwLA0KKyAgICAgICAgICBpRW5kID0gKHNpemVvZihidWlsZEluRnVuY3MpIC8gc2l6ZW9mKGJ1aWxkSW5GdW5jc1swXSkpIC0gMTsNCisgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICBkbyB7DQorICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICBidWlsZGluZnVuY3Rpb24gPSBidWlsZEluRnVuY3NbaU1pZF07DQorICAgIGlmICh1SGFzaCA9PSBidWlsZGluZnVuY3Rpb24ubV91SGFzaCkgew0KKyAgICAgIGZ1bmNOYW1lLkNsZWFyKCk7DQorICAgICAgZnVuY05hbWUgPDwgYnVpbGRpbmZ1bmN0aW9uLm1fYnVpbGRpbmZ1bmM7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0gZWxzZSBpZiAodUhhc2ggPCBidWlsZGluZnVuY3Rpb24ubV91SGFzaCkgew0KKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgfQ0KKyAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9EV09SRCBDWEZBX0ZNQ2FsbEV4cHJlc3Npb246OklzU29tTWV0aG9kV2l0aE9ialBhcmEoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgbWV0aG9kTmFtZSkgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gbWV0aG9kTmFtZS5HZXRMZW5ndGgoKTsNCisgIHVpbnQzMl90IHVIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcobWV0aG9kTmFtZS5HZXRQdHIoKSwgaUxlbmd0aCk7DQorICBYRkFfRk1TT01NZXRob2Qgc29tTWV0aG9kV2l0aE9ialBhcmE7DQorICBGWF9EV09SRCBwYXJhbWV0ZXJzID0gMHgwMDsNCisgIGludDMyX3QgaVN0YXJ0ID0gMCwNCisgICAgICAgICAgaUVuZCA9IChzaXplb2YoZ3NfRk1Tb21NZXRob2RzKSAvIHNpemVvZihnc19GTVNvbU1ldGhvZHNbMF0pKSAtIDE7DQorICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgZG8gew0KKyAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgc29tTWV0aG9kV2l0aE9ialBhcmEgPSBnc19GTVNvbU1ldGhvZHNbaU1pZF07DQorICAgIGlmICh1SGFzaCA9PSBzb21NZXRob2RXaXRoT2JqUGFyYS5tX3VIYXNoKSB7DQorICAgICAgcGFyYW1ldGVycyA9IHNvbU1ldGhvZFdpdGhPYmpQYXJhLm1fZFBhcmFtZXRlcnM7DQorICAgICAgYnJlYWs7DQorICAgIH0gZWxzZSBpZiAodUhhc2ggPCBzb21NZXRob2RXaXRoT2JqUGFyYS5tX3VIYXNoKSB7DQorICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICB9DQorICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICByZXR1cm4gcGFyYW1ldGVyczsNCit9DQordm9pZCBDWEZBX0ZNQ2FsbEV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsNCisgIENGWF9XaWRlVGV4dEJ1ZiBmdW5jTmFtZTsNCisgIG1fcEV4cC0+VG9KYXZhU2NyaXB0KGZ1bmNOYW1lKTsNCisgIGlmIChtX2JJc1NvbU1ldGhvZCkgew0KKyAgICBqYXZhc2NyaXB0IDw8IGZ1bmNOYW1lOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKCIpOw0KKyAgICBpZiAobV9wQXJndW1lbnRzKSB7DQorICAgICAgaW50MzJfdCBhcmdjID0gbV9wQXJndW1lbnRzLT5HZXRTaXplKCk7DQorICAgICAgaW50MzJfdCBpbmRleCA9IDA7DQorICAgICAgRlhfRFdPUkQgbWV0aG9kUGFyYSA9IElzU29tTWV0aG9kV2l0aE9ialBhcmEoZnVuY05hbWUuR2V0V2lkZVN0cmluZygpKTsNCisgICAgICBpZiAobWV0aG9kUGFyYSA+IDApIHsNCisgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBlID0gMDsNCisgICAgICAgIHdoaWxlIChpbmRleCA8IGFyZ2MpIHsNCisgICAgICAgICAgaWYgKChtZXRob2RQYXJhICYgKDB4MDEgPDwgaW5kZXgpKSA+IDApIHsNCisgICAgICAgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbR0VURk1KU09CSl07DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0dFVEZNVkFMVUVdOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICAgICAgICAgIGUgPSAoQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qKW1fcEFyZ3VtZW50cy0+R2V0QXQoaW5kZXgpOw0KKyAgICAgICAgICBlLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpIik7DQorICAgICAgICAgIGlmIChpbmRleCArIDEgPCBhcmdjKSB7DQorICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiwgIik7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaW5kZXgrKzsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIGUgPSAwOw0KKyAgICAgICAgd2hpbGUgKGluZGV4IDwgYXJnYykgew0KKyAgICAgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbR0VURk1WQUxVRV07DQorICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICAgICAgICAgIGUgPSAoQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qKW1fcEFyZ3VtZW50cy0+R2V0QXQoaW5kZXgpOw0KKyAgICAgICAgICBlLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpIik7DQorICAgICAgICAgIGlmIChpbmRleCArIDEgPCBhcmdjKSB7DQorICAgICAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiwgIik7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaW5kZXgrKzsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCisgIH0gZWxzZSB7DQorICAgIEZYX0JPT0wgaXNFdmFsRnVuYyA9IEZBTFNFOw0KKyAgICBGWF9CT09MIGlzRXhpc3RzRnVuYyA9IEZBTFNFOw0KKyAgICBpZiAoSXNCdWlsZEluRnVuYyhmdW5jTmFtZSkpIHsNCisgICAgICBpZiAoZnVuY05hbWUuR2V0V2lkZVN0cmluZygpID09IEZYX1dTVFJDKEwiRXZhbCIpKSB7DQorICAgICAgICBpc0V2YWxGdW5jID0gVFJVRTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJldmFsLmNhbGwodGhpcywgIik7DQorICAgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbQ0FMTF07DQorICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiVHJhbnNsYXRlIik7DQorICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZS5HZXRXaWRlU3RyaW5nKCkgPT0gRlhfV1NUUkMoTCJFeGlzdHMiKSkgew0KKyAgICAgICAgaXNFeGlzdHNGdW5jID0gVFJVRTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtDQUxMXTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgZnVuY05hbWU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtDQUxMXTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgZnVuY05hbWU7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGphdmFzY3JpcHQgPDwgZnVuY05hbWU7DQorICAgIH0NCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIigiKTsNCisgICAgaWYgKGlzRXhpc3RzRnVuYykgew0KKyAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcbihcbmZ1bmN0aW9uICgpXG57XG50cnlcbntcbiIpOw0KKyAgICAgIGlmIChtX3BBcmd1bWVudHMgJiYgbV9wQXJndW1lbnRzLT5HZXRTaXplKCkgPiAwKSB7DQorICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogZSA9DQorICAgICAgICAgICAgKENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiltX3BBcmd1bWVudHMtPkdldEF0KDApOw0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMInJldHVybiAiKTsNCisgICAgICAgIGUtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCI7XG59XG4iKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMInJldHVybiAwO1xufVxuIik7DQorICAgICAgfQ0KKyAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoDQorICAgICAgICAgIEwiY2F0Y2goYWNjZXNzRXhjZXB0aW9ucylcbntcbnJldHVybiAwO1xufVxufVxuKS5jYWxsKHRoaXMpXG4iKTsNCisgICAgfSBlbHNlIGlmIChtX3BBcmd1bWVudHMpIHsNCisgICAgICBpbnQzMl90IGFyZ2MgPSBtX3BBcmd1bWVudHMtPkdldFNpemUoKTsNCisgICAgICBpbnQzMl90IGluZGV4ID0gMDsNCisgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogZSA9IDA7DQorICAgICAgd2hpbGUgKGluZGV4IDwgYXJnYykgew0KKyAgICAgICAgZSA9IChDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiopbV9wQXJndW1lbnRzLT5HZXRBdChpbmRleCk7DQorICAgICAgICBlLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICAgICAgICBpZiAoaW5kZXggKyAxIDwgYXJnYykgew0KKyAgICAgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLCAiKTsNCisgICAgICAgIH0NCisgICAgICAgIGluZGV4Kys7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIpIik7DQorICAgIGlmIChpc0V2YWxGdW5jKSB7DQorICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCisgICAgfQ0KKyAgfQ0KK30NCitDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uOjpDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uKA0KKyAgICBGWF9EV09SRCBsaW5lLA0KKyAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEFjY2Vzc29yLA0KKyAgICBYRkFfRk1fVE9LRU4gb3AsDQorICAgIENGWF9XaWRlU3RyaW5nQyB3c0lkZW50aWZpZXIsDQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwSW5kZXhFeHApDQorICAgIDogQ1hGQV9GTUJpbkV4cHJlc3Npb24obGluZSwgb3AsIHBBY2Nlc3NvciwgcEluZGV4RXhwKSwNCisgICAgICBtX3dzSWRlbnRpZmllcih3c0lkZW50aWZpZXIpIHt9DQordm9pZCBDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbRE9UXTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICBpZiAobV9wRXhwMSkgew0KKyAgICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICB9IGVsc2Ugew0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwibnVsbCIpOw0KKyAgfQ0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiwgIik7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiXCIiKTsNCisgIGlmIChtX3BFeHAxICYmIG1fcEV4cDEtPkdldE9wZXJhdG9yVG9rZW4oKSA9PSBUT0tpZGVudGlmaWVyKSB7DQorICAgIG1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIH0NCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcIiwgIik7DQorICBpZiAobV9vcCA9PSBUT0tkb3RzY3JlYW0pIHsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlwiIyIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IG1fd3NJZGVudGlmaWVyOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiXCIsICIpOw0KKyAgfSBlbHNlIGlmIChtX29wID09IFRPS2RvdHN0YXIpIHsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlwiKlwiLCAiKTsNCisgIH0gZWxzZSBpZiAobV9vcCA9PSBUT0tjYWxsKSB7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcIlwiLCAiKTsNCisgIH0gZWxzZSB7DQorICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcIiIpOw0KKyAgICBqYXZhc2NyaXB0IDw8IG1fd3NJZGVudGlmaWVyOw0KKyAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiXCIsICIpOw0KKyAgfQ0KKyAgbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIikiKTsNCit9DQorQ1hGQV9GTUluZGV4RXhwcmVzc2lvbjo6Q1hGQV9GTUluZGV4RXhwcmVzc2lvbigNCisgICAgRlhfRFdPUkQgbGluZSwNCisgICAgWEZBX0ZNX0FjY2Vzc29ySW5kZXggYWNjZXNzb3JJbmRleCwNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBJbmRleEV4cCwNCisgICAgRlhfQk9PTCBiSXNTdGFySW5kZXgpDQorICAgIDogQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbihsaW5lLCBUT0tsYnJhY2tldCwgcEluZGV4RXhwKSwNCisgICAgICBtX2FjY2Vzc29ySW5kZXgoYWNjZXNzb3JJbmRleCksDQorICAgICAgbV9iSXNTdGFySW5kZXgoYklzU3RhckluZGV4KSB7fQ0KK3ZvaWQgQ1hGQV9GTUluZGV4RXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgew0KKyAgc3dpdGNoIChtX2FjY2Vzc29ySW5kZXgpIHsNCisgICAgY2FzZSBBQ0NFU1NPUl9OT19JTkRFWDoNCisgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiMCIpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEFDQ0VTU09SX05PX1JFTEFUSVZFSU5ERVg6DQorICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIjEiKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBBQ0NFU1NPUl9QT1NJVElWRV9JTkRFWDoNCisgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiMiIpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEFDQ0VTU09SX05FR0FUSVZFX0lOREVYOg0KKyAgICAgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIzIik7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIjAiKTsNCisgIH0NCisgIGlmICghbV9iSXNTdGFySW5kZXgpIHsNCisgICAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIiwgIik7DQorICAgIGlmIChtX3BFeHApIHsNCisgICAgICBtX3BFeHAtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgICAgfSBlbHNlIHsNCisgICAgICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiMCIpOw0KKyAgICB9DQorICB9DQorfQ0KK0NYRkFfRk1Eb3REb3RBY2Nlc3NvckV4cHJlc3Npb246OkNYRkFfRk1Eb3REb3RBY2Nlc3NvckV4cHJlc3Npb24oDQorICAgIEZYX0RXT1JEIGxpbmUsDQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwQWNjZXNzb3IsDQorICAgIFhGQV9GTV9UT0tFTiBvcCwNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSWRlbnRpZmllciwNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBJbmRleEV4cCkNCisgICAgOiBDWEZBX0ZNQmluRXhwcmVzc2lvbihsaW5lLCBvcCwgcEFjY2Vzc29yLCBwSW5kZXhFeHApLA0KKyAgICAgIG1fd3NJZGVudGlmaWVyKHdzSWRlbnRpZmllcikge30NCit2b2lkIENYRkFfRk1Eb3REb3RBY2Nlc3NvckV4cHJlc3Npb246OlRvSmF2YVNjcmlwdCgNCisgICAgQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbRE9URE9UXTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoIik7DQorICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiLCAiKTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcIiIpOw0KKyAgaWYgKG1fcEV4cDEgJiYgbV9wRXhwMS0+R2V0T3BlcmF0b3JUb2tlbigpID09IFRPS2lkZW50aWZpZXIpIHsNCisgICAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOw0KKyAgfQ0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIlwiLCAiKTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcIiIpOw0KKyAgamF2YXNjcmlwdCA8PCBtX3dzSWRlbnRpZmllcjsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJcIiwgIik7DQorICBtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKSIpOw0KK30NCitDWEZBX0ZNTWV0aG9kQ2FsbEV4cHJlc3Npb246OkNYRkFfRk1NZXRob2RDYWxsRXhwcmVzc2lvbigNCisgICAgRlhfRFdPUkQgbGluZSwNCisgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBBY2Nlc3NvckV4cDEsDQorICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwQ2FsbEV4cCkNCisgICAgOiBDWEZBX0ZNQmluRXhwcmVzc2lvbihsaW5lLCBUT0tkb3QsIHBBY2Nlc3NvckV4cDEsIHBDYWxsRXhwKSB7fQ0KK3ZvaWQgQ1hGQV9GTU1ldGhvZENhbGxFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiKFxuZnVuY3Rpb24gKClcbntcbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMInZhciBtZXRob2RfcmV0dXJuX3ZhbHVlID0gbnVsbDtcbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMInZhciBhY2Nlc3Nvcl9vYmplY3QgPSAiKTsNCisgIG1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCI7XG4iKTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJpZiAoIik7DQorICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbSVNGTUFSUkFZXTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCIoYWNjZXNzb3Jfb2JqZWN0KSlcbntcbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQygNCisgICAgICBMImZvcih2YXIgaW5kZXggPSBhY2Nlc3Nvcl9vYmplY3QubGVuZ3RoIC0gMTsgaW5kZXggPiAxOyBpbmRleC0tKVxue1xuIik7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwibWV0aG9kX3JldHVybl92YWx1ZSA9IGFjY2Vzc29yX29iamVjdFtpbmRleF0uIik7DQorICBtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiO1xufVxufVxuIik7DQorICBqYXZhc2NyaXB0IDw8IEZYX1dTVFJDKEwiZWxzZVxue1xubWV0aG9kX3JldHVybl92YWx1ZSA9IGFjY2Vzc29yX29iamVjdC4iKTsNCisgIG1fcEV4cDItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCI7XG59XG4iKTsNCisgIGphdmFzY3JpcHQgPDwgRlhfV1NUUkMoTCJyZXR1cm4gbWV0aG9kX3JldHVybl92YWx1ZTtcbiIpOw0KKyAgamF2YXNjcmlwdCA8PCBGWF9XU1RSQyhMIn1cbikuY2FsbCh0aGlzKSIpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9zaW1wbGVleHByZXNzaW9uLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL2ZtMmpzL3hmYV9zaW1wbGVleHByZXNzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ4ZmJlOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvZm0yanMveGZhX3NpbXBsZWV4cHJlc3Npb24uaApAQCAtMCwwICsxLDI2OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfRk1fU0lNUExFRVhQUkVTU0lPTl9IDQorI2RlZmluZSBfWEZBX0ZNX1NJTVBMRUVYUFJFU1NJT05fSA0KK2VudW0gWEZBX0ZNX1NpbXBsZUV4cHJlc3Npb25UeXBlIHsNCisgIEFTU0lHTiwNCisgIExPR0lDQUxPUiwNCisgIExPR0lDQUxBTkQsDQorICBFUVVBTElUWSwNCisgIE5PVEVRVUFMSVRZLA0KKyAgTEVTUywNCisgIExFU1NFUVVBTCwNCisgIEdSRUFURVIsDQorICBHUkVBVEVSRVFVQUwsDQorICBQTFVTLA0KKyAgTUlOVVMsDQorICBNVUxUSVBMRSwNCisgIERJVklERSwNCisgIFBPU0lUSVZFLA0KKyAgTkVHQVRJVkUsDQorICBOT1QsDQorICBDQUxMLA0KKyAgRE9ULA0KKyAgRE9URE9ULA0KKyAgQ09OQ0FURk1PQkpFQ1QsDQorICBJU0ZNT0JKRUNULA0KKyAgSVNGTUFSUkFZLA0KKyAgR0VURk1WQUxVRSwNCisgIEdFVEZNSlNPQkosDQorICBWQVJGSUxURVINCit9Ow0KK0NGWF9XaWRlU3RyaW5nQyBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKA0KKyAgICBYRkFfRk1fU2ltcGxlRXhwcmVzc2lvblR5cGUgc2ltcGxlRXhwVHlwZSk7DQorc3RydWN0IFhGQV9GTUJ1aWxkSW5GdW5jIHsNCisgIHVpbnQzMl90IG1fdUhhc2g7DQorICBjb25zdCBGWF9XQ0hBUiogbV9idWlsZGluZnVuYzsNCit9Ow0KK3N0cnVjdCBYRkFfRk1TT01NZXRob2Qgew0KKyAgdWludDMyX3QgbV91SGFzaDsNCisgIGNvbnN0IEZYX1dDSEFSKiBtX3dzU29tTWV0aG9kTmFtZTsNCisgIEZYX0RXT1JEIG1fZFBhcmFtZXRlcnM7DQorfTsNCitlbnVtIFhGQV9GTV9BY2Nlc3NvckluZGV4IHsNCisgIEFDQ0VTU09SX05PX0lOREVYLA0KKyAgQUNDRVNTT1JfTk9fUkVMQVRJVkVJTkRFWCwNCisgIEFDQ0VTU09SX1BPU0lUSVZFX0lOREVYLA0KKyAgQUNDRVNTT1JfTkVHQVRJVkVfSU5ERVgNCit9Ow0KK2NsYXNzIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgWEZBX0ZNX1RPS0VOIG9wKTsNCisgIHZpcnR1YWwgfkNYRkFfRk1TaW1wbGVFeHByZXNzaW9uKCl7fTsNCisgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisgIHZpcnR1YWwgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKw0KKyAgWEZBX0ZNX1RPS0VOIEdldE9wZXJhdG9yVG9rZW4oKSBjb25zdDsNCisNCisgcHJvdGVjdGVkOg0KKyAgRlhfRFdPUkQgbV9saW5lOw0KKyAgWEZBX0ZNX1RPS0VOIG1fb3A7DQorfTsNCitjbGFzcyBDWEZBX0ZNTnVsbEV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNTnVsbEV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSk7DQorICB2aXJ0dWFsIH5DWEZBX0ZNTnVsbEV4cHJlc3Npb24oKXt9Ow0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KK307DQorY2xhc3MgQ1hGQV9GTU51bWJlckV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNTnVtYmVyRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDRlhfV2lkZVN0cmluZ0Mgd3NOdW1iZXIpOw0KKyAgdmlydHVhbCB+Q1hGQV9GTU51bWJlckV4cHJlc3Npb24oKXt9Ow0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRlhfV2lkZVN0cmluZ0MgbV93c051bWJlcjsNCit9Ow0KK2NsYXNzIENYRkFfRk1TdHJpbmdFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTVN0cmluZ0V4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgQ0ZYX1dpZGVTdHJpbmdDIHdzU3RyaW5nKTsNCisgIHZpcnR1YWwgfkNYRkFfRk1TdHJpbmdFeHByZXNzaW9uKCl7fTsNCisgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX1dpZGVTdHJpbmdDIG1fd3NTdHJpbmc7DQorfTsNCitjbGFzcyBDWEZBX0ZNSWRlbnRpZmllckV4cHJlc3Npb25uIDogcHVibGljIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTUlkZW50aWZpZXJFeHByZXNzaW9ubihGWF9EV09SRCBsaW5lLCBDRlhfV2lkZVN0cmluZ0Mgd3NJZGVudGlmaWVyKTsNCisgIHZpcnR1YWwgfkNYRkFfRk1JZGVudGlmaWVyRXhwcmVzc2lvbm4oKXt9Ow0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRlhfV2lkZVN0cmluZ0MgbV93c0lkZW50aWZpZXI7DQorfTsNCitjbGFzcyBDWEZBX0ZNVW5hcnlFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRk1fVE9LRU4gb3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwKTsNCisgIHZpcnR1YWwgfkNYRkFfRk1VbmFyeUV4cHJlc3Npb24oKTsNCisgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIG1fcEV4cDsNCit9Ow0KK2NsYXNzIENYRkFfRk1CaW5FeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTUJpbkV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgIFhGQV9GTV9UT0tFTiBvcCwNCisgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwMSwNCisgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwMik7DQorICB2aXJ0dWFsIH5DWEZBX0ZNQmluRXhwcmVzc2lvbigpOw0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogbV9wRXhwMTsNCisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBtX3BFeHAyOw0KK307DQorY2xhc3MgQ1hGQV9GTUFzc2lnbkV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUJpbkV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNQXNzaWduRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZNX1RPS0VOIG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHAyKTsNCisgIHZpcnR1YWwgfkNYRkFfRk1Bc3NpZ25FeHByZXNzaW9uKCl7fTsNCisgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisgIHZpcnR1YWwgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KK307DQorY2xhc3MgQ1hGQV9GTUxvZ2ljYWxPckV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUJpbkV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNTG9naWNhbE9yRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZNX1RPS0VOIG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHAyKTsNCisgIHZpcnR1YWwgfkNYRkFfRk1Mb2dpY2FsT3JFeHByZXNzaW9uKCl7fTsNCisgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCit9Ow0KK2NsYXNzIENYRkFfRk1Mb2dpY2FsQW5kRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNQmluRXhwcmVzc2lvbiB7DQorIHB1YmxpYzoNCisgIENYRkFfRk1Mb2dpY2FsQW5kRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9GTV9UT0tFTiBvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cDEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHAyKTsNCisgIHZpcnR1YWwgfkNYRkFfRk1Mb2dpY2FsQW5kRXhwcmVzc2lvbigpe307DQorICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQorfTsNCitjbGFzcyBDWEZBX0ZNRXF1YWxpdHlFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1CaW5FeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTUVxdWFsaXR5RXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRk1fVE9LRU4gb3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHAyKTsNCisgIHZpcnR1YWwgfkNYRkFfRk1FcXVhbGl0eUV4cHJlc3Npb24oKXt9Ow0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KK307DQorY2xhc3MgQ1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1CaW5FeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZNX1RPS0VOIG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cDIpOw0KKyAgdmlydHVhbCB+Q1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uKCl7fTsNCisgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCit9Ow0KK2NsYXNzIENYRkFfRk1BZGRpdGl2ZUV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUJpbkV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNQWRkaXRpdmVFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9GTV9UT0tFTiBvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cDIpOw0KKyAgdmlydHVhbCB+Q1hGQV9GTUFkZGl0aXZlRXhwcmVzc2lvbigpe307DQorICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQorfTsNCitjbGFzcyBDWEZBX0ZNTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1CaW5FeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRk1fVE9LRU4gb3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHAyKTsNCisgIHZpcnR1YWwgfkNYRkFfRk1NdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKXt9Ow0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KK307DQorY2xhc3MgQ1hGQV9GTVBvc0V4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbiB7DQorIHB1YmxpYzoNCisgIENYRkFfRk1Qb3NFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwRXhwKTsNCisgIHZpcnR1YWwgfkNYRkFfRk1Qb3NFeHByZXNzaW9uKCl7fTsNCisgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCit9Ow0KK2NsYXNzIENYRkFfRk1OZWdFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1VbmFyeUV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNTmVnRXhwcmVzc2lvbihGWF9EV09SRCBsaW5lLCBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cCk7DQorICB2aXJ0dWFsIH5DWEZBX0ZNTmVnRXhwcmVzc2lvbigpe307DQorICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7DQorfTsNCitjbGFzcyBDWEZBX0ZNTm90RXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNVW5hcnlFeHByZXNzaW9uIHsNCisgcHVibGljOg0KKyAgQ1hGQV9GTU5vdEV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBFeHApOw0KKyAgdmlydHVhbCB+Q1hGQV9GTU5vdEV4cHJlc3Npb24oKXt9Ow0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KK307DQorY2xhc3MgQ1hGQV9GTUNhbGxFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1VbmFyeUV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNQ2FsbEV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEV4cCwNCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUHRyQXJyYXkqIHBBcmd1bWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNTb21NZXRob2QpOw0KKyAgdmlydHVhbCB+Q1hGQV9GTUNhbGxFeHByZXNzaW9uKCk7DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNCdWlsZEluRnVuYyhDRlhfV2lkZVRleHRCdWYmIGZ1bmNOYW1lKTsNCisgIHZpcnR1YWwgRlhfRFdPUkQgSXNTb21NZXRob2RXaXRoT2JqUGFyYShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIG1ldGhvZE5hbWUpOw0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKw0KKyBwcml2YXRlOg0KKyAgRlhfQk9PTCBtX2JJc1NvbU1ldGhvZDsNCisgIENGWF9QdHJBcnJheSogbV9wQXJndW1lbnRzOw0KK307DQorY2xhc3MgQ1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNQmluRXhwcmVzc2lvbiB7DQorIHB1YmxpYzoNCisgIENYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBBY2Nlc3NvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZNX1RPS0VOIG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NJZGVudGlmaWVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEluZGV4RXhwKTsNCisgIHZpcnR1YWwgfkNYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24oKXt9Ow0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRlhfV2lkZVN0cmluZ0MgbV93c0lkZW50aWZpZXI7DQorfTsNCitjbGFzcyBDWEZBX0ZNSW5kZXhFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1VbmFyeUV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNSW5kZXhFeHByZXNzaW9uKEZYX0RXT1JEIGxpbmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9GTV9BY2Nlc3NvckluZGV4IGFjY2Vzc29ySW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKiBwSW5kZXhFeHAsDQorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYklzU3RhckluZGV4KTsNCisgIHZpcnR1YWwgfkNYRkFfRk1JbmRleEV4cHJlc3Npb24oKXt9Ow0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBYRkFfRk1fQWNjZXNzb3JJbmRleCBtX2FjY2Vzc29ySW5kZXg7DQorICBGWF9CT09MIG1fYklzU3RhckluZGV4Ow0KK307DQorY2xhc3MgQ1hGQV9GTURvdERvdEFjY2Vzc29yRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNQmluRXhwcmVzc2lvbiB7DQorIHB1YmxpYzoNCisgIENYRkFfRk1Eb3REb3RBY2Nlc3NvckV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24qIHBBY2Nlc3NvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZNX1RPS0VOIG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NJZGVudGlmaWVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEluZGV4RXhwKTsNCisgIHZpcnR1YWwgfkNYRkFfRk1Eb3REb3RBY2Nlc3NvckV4cHJlc3Npb24oKXt9Ow0KKyAgdmlydHVhbCB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDRlhfV2lkZVN0cmluZ0MgbV93c0lkZW50aWZpZXI7DQorfTsNCitjbGFzcyBDWEZBX0ZNTWV0aG9kQ2FsbEV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUJpbkV4cHJlc3Npb24gew0KKyBwdWJsaWM6DQorICBDWEZBX0ZNTWV0aG9kQ2FsbEV4cHJlc3Npb24oRlhfRFdPUkQgbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcEFjY2Vzc29yRXhwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiogcENhbGxFeHApOw0KKyAgdmlydHVhbCB+Q1hGQV9GTU1ldGhvZENhbGxFeHByZXNzaW9uKCl7fTsNCisgIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsNCisNCisgcHJvdGVjdGVkOg0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2Jhc2ljX2RhdGEuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2Jhc2ljX2RhdGEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NWNmNzMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfYmFzaWNfZGF0YS5jcHAKQEAgLTAsMCArMSw3MzMxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV91dGlscy5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfb2JqZWN0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2N1bWVudC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfcGFyc2VyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9zY3JpcHQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY2RhdGEuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY2xheW91dC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfbG9jYWxlbWdyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9mbTJqc2FwaS5oIg0KKyNpbmNsdWRlICJ4ZmFfYmFzaWNfaW1wLmgiDQorI2luY2x1ZGUgInhmYV9zY3JpcHRfZGF0YXdpbmRvdy5oIg0KKyNpbmNsdWRlICJ4ZmFfc2NyaXB0X2V2ZW50cHNldWRvbW9kZWwuaCINCisjaW5jbHVkZSAieGZhX3NjcmlwdF9ob3N0cHNldWRvbW9kZWwuaCINCisjaW5jbHVkZSAieGZhX3NjcmlwdF9sb2dwc2V1ZG9tb2RlbC5oIg0KKyNpbmNsdWRlICJ4ZmFfc2NyaXB0X2xheW91dHBzZXVkb21vZGVsLmgiDQorI2luY2x1ZGUgInhmYV9zY3JpcHRfc2lnbmF0dXJlcHNldWRvbW9kZWwuaCINCitleHRlcm4gY29uc3QgWEZBX0FUVFJJQlVURUVOVU1JTkZPIGdfWEZBRW51bURhdGFbXSA9IHsNCisgICAgezB4MmEsIEwiKiIsIFhGQV9BVFRSSUJVVEVFTlVNX0FzdGVyaXNrfSwNCisgICAgezB4MmYsIEwiLyIsIFhGQV9BVFRSSUJVVEVFTlVNX1NsYXNofSwNCisgICAgezB4NWMsIEwiXFwiLCBYRkFfQVRUUklCVVRFRU5VTV9CYWNrc2xhc2h9LA0KKyAgICB7MHgyMzliZCwgTCJvbiIsIFhGQV9BVFRSSUJVVEVFTlVNX09ufSwNCisgICAgezB4MjUzNTYsIEwidGIiLCBYRkFfQVRUUklCVVRFRU5VTV9UYn0sDQorICAgIHsweDI1ODg1LCBMInVwIiwgWEZBX0FUVFJJQlVURUVOVU1fVXB9LA0KKyAgICB7MHg5MWIyODEsIEwibWV0YURhdGEiLCBYRkFfQVRUUklCVVRFRU5VTV9NZXRhRGF0YX0sDQorICAgIHsweDFmOGRlZGIsIEwiZGVsZWdhdGUiLCBYRkFfQVRUUklCVVRFRU5VTV9EZWxlZ2F0ZX0sDQorICAgIHsweDJhNmM1NWEsIEwicG9zdFN1Ym1pdCIsIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RTdWJtaXR9LA0KKyAgICB7MHgzMWIxOWMxLCBMIm5hbWUiLCBYRkFfQVRUUklCVVRFRU5VTV9OYW1lfSwNCisgICAgezB4Mzc4YTM4YSwgTCJjcm9zcyIsIFhGQV9BVFRSSUJVVEVFTlVNX0Nyb3NzfSwNCisgICAgezB4Mzg0OGIzZiwgTCJuZXh0IiwgWEZBX0FUVFJJQlVURUVOVU1fTmV4dH0sDQorICAgIHsweDQ4YjY2NzAsIEwibm9uZSIsIFhGQV9BVFRSSUJVVEVFTlVNX05vbmV9LA0KKyAgICB7MHg1MWFhZmU1LCBMInNob3J0RWRnZSIsIFhGQV9BVFRSSUJVVEVFTlVNX1Nob3J0RWRnZX0sDQorICAgIHsweDU1MjY0YzQsIEwiMW1vZDEwXzFtb2QxMSIsIFhGQV9BVFRSSUJVVEVFTlVNXzFtb2QxMF8xbW9kMTF9LA0KKyAgICB7MHg1YTVjNTE5LCBMImhlaWdodCIsIFhGQV9BVFRSSUJVVEVFTlVNX0hlaWdodH0sDQorICAgIHsweDg5Y2U1NDksIEwiY3Jvc3NEaWFnb25hbCIsIFhGQV9BVFRSSUJVVEVFTlVNX0Nyb3NzRGlhZ29uYWx9LA0KKyAgICB7MHg5ZjlkMGY5LCBMImFsbCIsIFhGQV9BVFRSSUJVVEVFTlVNX0FsbH0sDQorICAgIHsweDlmOWRiNDgsIEwiYW55IiwgWEZBX0FUVFJJQlVURUVOVU1fQW55fSwNCisgICAgezB4YTEyNjI2MSwgTCJ0b1JpZ2h0IiwgWEZBX0FUVFJJQlVURUVOVU1fVG9SaWdodH0sDQorICAgIHsweGEzNmRlMjksIEwibWF0Y2hUZW1wbGF0ZSIsIFhGQV9BVFRSSUJVVEVFTlVNX01hdGNoVGVtcGxhdGV9LA0KKyAgICB7MHhhNDhkMDQwLCBMImRwbCIsIFhGQV9BVFRSSUJVVEVFTlVNX0RwbH0sDQorICAgIHsweGE1NTljMDUsIEwiaW52aXNpYmxlIiwgWEZBX0FUVFJJQlVURUVOVU1fSW52aXNpYmxlfSwNCisgICAgezB4YTdkNDhlMywgTCJmaXQiLCBYRkFfQVRUUklCVVRFRU5VTV9GaXR9LA0KKyAgICB7MHhhOGE4ZjgwLCBMIndpZHRoIiwgWEZBX0FUVFJJQlVURUVOVU1fV2lkdGh9LA0KKyAgICB7MHhhYjQ2NmJiLCBMInByZVN1Ym1pdCIsIFhGQV9BVFRSSUJVVEVFTlVNX1ByZVN1Ym1pdH0sDQorICAgIHsweGFjYzU3ODUsIEwiaXBsIiwgWEZBX0FUVFJJQlVURUVOVU1fSXBsfSwNCisgICAgezB4YWZhYjBmOCwgTCJmbGF0ZUNvbXByZXNzIiwgWEZBX0FUVFJJQlVURUVOVU1fRmxhdGVDb21wcmVzc30sDQorICAgIHsweGIzNTU4MTYsIEwibWVkIiwgWEZBX0FUVFJJQlVURUVOVU1fTWVkfSwNCisgICAgezB4YjY5ZWY3NywgTCJvZGQiLCBYRkFfQVRUUklCVVRFRU5VTV9PZGR9LA0KKyAgICB7MHhiNjlmOWJiLCBMIm9mZiIsIFhGQV9BVFRSSUJVVEVFTlVNX09mZn0sDQorICAgIHsweGI4NDNkYmEsIEwicGRmIiwgWEZBX0FUVFJJQlVURUVOVU1fUGRmfSwNCisgICAgezB4YmI5MTJiOCwgTCJyb3ciLCBYRkFfQVRUUklCVVRFRU5VTV9Sb3d9LA0KKyAgICB7MHhiZWRhZjMzLCBMInRvcCIsIFhGQV9BVFRSSUJVVEVFTlVNX1RvcH0sDQorICAgIHsweGM1NmFmY2MsIEwieGRwIiwgWEZBX0FUVFJJQlVURUVOVU1fWGRwfSwNCisgICAgezB4YzU2YmEwMiwgTCJ4ZmQiLCBYRkFfQVRUUklCVVRFRU5VTV9YZmR9LA0KKyAgICB7MHhjNTZkZGYxLCBMInhtbCIsIFhGQV9BVFRSSUJVVEVFTlVNX1htbH0sDQorICAgIHsweGM4YjY1ZjMsIEwiemlwIiwgWEZBX0FUVFJJQlVURUVOVU1fWmlwfSwNCisgICAgezB4YzhiODlkNiwgTCJ6cGwiLCBYRkFfQVRUUklCVVRFRU5VTV9acGx9LA0KKyAgICB7MHhmNTVkN2VlLCBMInZpc2libGUiLCBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlfSwNCisgICAgezB4ZmUzNTk2YSwgTCJleGNsdWRlIiwgWEZBX0FUVFJJQlVURUVOVU1fRXhjbHVkZX0sDQorICAgIHsweDEwOWQ3Y2U3LCBMIm1vdXNlRW50ZXIiLCBYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZUVudGVyfSwNCisgICAgezB4MTBmMWJjMGMsIEwicGFpciIsIFhGQV9BVFRSSUJVVEVFTlVNX1BhaXJ9LA0KKyAgICB7MHgxMTU0ZWZlNiwgTCJmaWx0ZXIiLCBYRkFfQVRUUklCVVRFRU5VTV9GaWx0ZXJ9LA0KKyAgICB7MHgxMjViYzk0YiwgTCJtb3ZlTGFzdCIsIFhGQV9BVFRSSUJVVEVFTlVNX01vdmVMYXN0fSwNCisgICAgezB4MTJlMWYxZjAsIEwiZXhwb3J0QW5kSW1wb3J0IiwgWEZBX0FUVFJJQlVURUVOVU1fRXhwb3J0QW5kSW1wb3J0fSwNCisgICAgezB4MTMwMDBjNjAsIEwicHVzaCIsIFhGQV9BVFRSSUJVVEVFTlVNX1B1c2h9LA0KKyAgICB7MHgxMzhlZTMxNSwgTCJwb3J0cmFpdCIsIFhGQV9BVFRSSUJVVEVFTlVNX1BvcnRyYWl0fSwNCisgICAgezB4MTRkYTIxMjUsIEwiZGVmYXVsdCIsIFhGQV9BVFRSSUJVVEVFTlVNX0RlZmF1bHR9LA0KKyAgICB7MHgxNTc3NDlhNSwgTCJzdG9yZWRQcm9jIiwgWEZBX0FUVFJJQlVURUVOVU1fU3RvcmVkUHJvY30sDQorICAgIHsweDE2NjQxMTk4LCBMInN0YXlCT0YiLCBYRkFfQVRUUklCVVRFRU5VTV9TdGF5Qk9GfSwNCisgICAgezB4MTZiMmZjNWIsIEwic3RheUVPRiIsIFhGQV9BVFRSSUJVVEVFTlVNX1N0YXlFT0Z9LA0KKyAgICB7MHgxN2ZhZDM3MywgTCJwb3N0UHJpbnQiLCBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0UHJpbnR9LA0KKyAgICB7MHgxOTMyMDdkMCwgTCJ1c0NhcnJpZXIiLCBYRkFfQVRUUklCVVRFRU5VTV9Vc0NhcnJpZXJ9LA0KKyAgICB7MHgxOTNhZGUzZSwgTCJyaWdodCIsIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0fSwNCisgICAgezB4MWJmYzcyZDksIEwicHJlT3BlbiIsIFhGQV9BVFRSSUJVVEVFTlVNX1ByZU9wZW59LA0KKyAgICB7MHgxY2M5MzE3YSwgTCJhY3R1YWwiLCBYRkFfQVRUUklCVVRFRU5VTV9BY3R1YWx9LA0KKyAgICB7MHgxZjMxZGYxZSwgTCJyZXN0IiwgWEZBX0FUVFJJQlVURUVOVU1fUmVzdH0sDQorICAgIHsweDFmYjFiZjE0LCBMInRvcENlbnRlciIsIFhGQV9BVFRSSUJVVEVFTlVNX1RvcENlbnRlcn0sDQorICAgIHsweDIwN2RlNjY3LCBMInN0YW5kYXJkU3ltYm9sIiwgWEZBX0FUVFJJQlVURUVOVU1fU3RhbmRhcmRTeW1ib2x9LA0KKyAgICB7MHgyMTk2YTQ1MiwgTCJpbml0aWFsaXplIiwgWEZBX0FUVFJJQlVURUVOVU1fSW5pdGlhbGl6ZX0sDQorICAgIHsweDIzYmQ0MGM3LCBMImp1c3RpZnlBbGwiLCBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5QWxsfSwNCisgICAgezB4MjQ3Y2YzZTksIEwibm9ybWFsIiwgWEZBX0FUVFJJQlVURUVOVU1fTm9ybWFsfSwNCisgICAgezB4MjVhYTk0NmIsIEwibGFuZHNjYXBlIiwgWEZBX0FUVFJJQlVURUVOVU1fTGFuZHNjYXBlfSwNCisgICAgezB4MjczOWI1YzksIEwibm9uSW50ZXJhY3RpdmUiLCBYRkFfQVRUUklCVVRFRU5VTV9Ob25JbnRlcmFjdGl2ZX0sDQorICAgIHsweDI3NDEwZjAzLCBMIm1vdXNlRXhpdCIsIFhGQV9BVFRSSUJVVEVFTlVNX01vdXNlRXhpdH0sDQorICAgIHsweDI4NTRlNjJjLCBMIm1pbnVzIiwgWEZBX0FUVFJJQlVURUVOVU1fTWludXN9LA0KKyAgICB7MHgyODdlOTM2YSwgTCJkaWFnb25hbExlZnQiLCBYRkFfQVRUUklCVVRFRU5VTV9EaWFnb25hbExlZnR9LA0KKyAgICB7MHgyOTcyYTk4ZiwgTCJzaW1wbGV4UGFnaW5hdGVkIiwgWEZBX0FUVFJJQlVURUVOVU1fU2ltcGxleFBhZ2luYXRlZH0sDQorICAgIHsweDI5ZDgyMjVmLCBMImRvY3VtZW50IiwgWEZBX0FUVFJJQlVURUVOVU1fRG9jdW1lbnR9LA0KKyAgICB7MHgyYTlkMzAxNiwgTCJ3YXJuaW5nIiwgWEZBX0FUVFJJQlVURUVOVU1fV2FybmluZ30sDQorICAgIHsweDJiMzViNmQ5LCBMImF1dG8iLCBYRkFfQVRUUklCVVRFRU5VTV9BdXRvfSwNCisgICAgezB4MmMxNjUzZDksIEwiYmVsb3ciLCBYRkFfQVRUUklCVVRFRU5VTV9CZWxvd30sDQorICAgIHsweDJjMWYwNTQwLCBMImJvdHRvbUxlZnQiLCBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b21MZWZ0fSwNCisgICAgezB4MmM0NGU4MTYsIEwiYm90dG9tQ2VudGVyIiwgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tQ2VudGVyfSwNCisgICAgezB4MmNkM2U5ZjMsIEwidGNwbCIsIFhGQV9BVFRSSUJVVEVFTlVNX1RjcGx9LA0KKyAgICB7MHgyZDA4YWY4NSwgTCJ0ZXh0IiwgWEZBX0FUVFJJQlVURUVOVU1fVGV4dH0sDQorICAgIHsweDJkYzQ3OGViLCBMImdyb3VwaW5nIiwgWEZBX0FUVFJJQlVURUVOVU1fR3JvdXBpbmd9LA0KKyAgICB7MHgyZWYzYWZkZCwgTCJzZWN1cmVTeW1ib2wiLCBYRkFfQVRUUklCVVRFRU5VTV9TZWN1cmVTeW1ib2x9LA0KKyAgICB7MHgyZjJkZDI5YSwgTCJwcmVFeGVjdXRlIiwgWEZBX0FUVFJJQlVURUVOVU1fUHJlRXhlY3V0ZX0sDQorICAgIHsweDMzYzQzZGVjLCBMImRvY0Nsb3NlIiwgWEZBX0FUVFJJQlVURUVOVU1fRG9jQ2xvc2V9LA0KKyAgICB7MHgzM2YyNWJiNSwgTCJrZXlzZXQiLCBYRkFfQVRUUklCVVRFRU5VTV9LZXlzZXR9LA0KKyAgICB7MHgzNGUzNjNkYSwgTCJ2ZXJ0aWNhbCIsIFhGQV9BVFRSSUJVVEVFTlVNX1ZlcnRpY2FsfSwNCisgICAgezB4MzYxZmExYjYsIEwicHJlU2F2ZSIsIFhGQV9BVFRSSUJVVEVFTlVNX1ByZVNhdmV9LA0KKyAgICB7MHgzNmYxYzZkOCwgTCJwcmVTaWduIiwgWEZBX0FUVFJJQlVURUVOVU1fUHJlU2lnbn0sDQorICAgIHsweDM5OWYwMmI1LCBMImJvdHRvbSIsIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbX0sDQorICAgIHsweDNiMGFiMDk2LCBMInRvVG9wIiwgWEZBX0FUVFJJQlVURUVOVU1fVG9Ub3B9LA0KKyAgICB7MHgzYzc1MjQ5NSwgTCJ2ZXJpZnkiLCBYRkFfQVRUUklCVVRFRU5VTV9WZXJpZnl9LA0KKyAgICB7MHgzY2UwNWQ2OCwgTCJmaXJzdCIsIFhGQV9BVFRSSUJVVEVFTlVNX0ZpcnN0fSwNCisgICAgezB4M2VjZWFkOTQsIEwiY29udGVudEFyZWEiLCBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYX0sDQorICAgIHsweDQwNjIzYjViLCBMInNvbGlkIiwgWEZBX0FUVFJJQlVURUVOVU1fU29saWR9LA0KKyAgICB7MHg0MmM2Y2Q4ZCwgTCJwZXNzaW1pc3RpYyIsIFhGQV9BVFRSSUJVVEVFTlVNX1Blc3NpbWlzdGljfSwNCisgICAgezB4NDNkZGM2YmYsIEwiZHVwbGV4UGFnaW5hdGVkIiwgWEZBX0FUVFJJQlVURUVOVU1fRHVwbGV4UGFnaW5hdGVkfSwNCisgICAgezB4NDQyZjY4YzgsIEwicm91bmQiLCBYRkFfQVRUUklCVVRFRU5VTV9Sb3VuZH0sDQorICAgIHsweDQ1ZWZiODQ3LCBMInJlbWVyZ2UiLCBYRkFfQVRUUklCVVRFRU5VTV9SZW1lcmdlfSwNCisgICAgezB4NDY5NzIyNjUsIEwib3JkZXJlZCIsIFhGQV9BVFRSSUJVVEVFTlVNX09yZGVyZWR9LA0KKyAgICB7MHg0NmY5NTUzMSwgTCJwZXJjZW50IiwgWEZBX0FUVFJJQlVURUVOVU1fUGVyY2VudH0sDQorICAgIHsweDQ2ZmQyNWFlLCBMImV2ZW4iLCBYRkFfQVRUUklCVVRFRU5VTV9FdmVufSwNCisgICAgezB4NDczMWQ2YmEsIEwiZXhpdCIsIFhGQV9BVFRSSUJVVEVFTlVNX0V4aXR9LA0KKyAgICB7MHg0OTc3MzU2YiwgTCJ0b29sVGlwIiwgWEZBX0FUVFJJQlVURUVOVU1fVG9vbFRpcH0sDQorICAgIHsweDQ5Yjk4MGVlLCBMIm9yZGVyZWRPY2N1cnJlbmNlIiwgWEZBX0FUVFJJQlVURUVOVU1fT3JkZXJlZE9jY3VycmVuY2V9LA0KKyAgICB7MHg0YTdlMmRmZSwgTCJyZWFkT25seSIsIFhGQV9BVFRSSUJVVEVFTlVNX1JlYWRPbmx5fSwNCisgICAgezB4NGM0ZThhY2IsIEwiY3VycmVuY3kiLCBYRkFfQVRUUklCVVRFRU5VTV9DdXJyZW5jeX0sDQorICAgIHsweDRkY2YyNWY4LCBMImNvbmNhdCIsIFhGQV9BVFRSSUJVVEVFTlVNX0NvbmNhdH0sDQorICAgIHsweDRmZWJiODI2LCBMIlRoYWkiLCBYRkFfQVRUUklCVVRFRU5VTV9UaGFpfSwNCisgICAgezB4NTBlZjk1YjIsIEwiZW1ib3NzZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9FbWJvc3NlZH0sDQorICAgIHsweDUxNmUzNWNlLCBMImZvcm1kYXRhIiwgWEZBX0FUVFJJQlVURUVOVU1fRm9ybWRhdGF9LA0KKyAgICB7MHg1MmZhNmYwZSwgTCJHcmVlayIsIFhGQV9BVFRSSUJVVEVFTlVNX0dyZWVrfSwNCisgICAgezB4NTQwMzRjMmYsIEwiZGVjaW1hbCIsIFhGQV9BVFRSSUJVVEVFTlVNX0RlY2ltYWx9LA0KKyAgICB7MHg1NDJjNzMwMCwgTCJzZWxlY3QiLCBYRkFfQVRUUklCVVRFRU5VTV9TZWxlY3R9LA0KKyAgICB7MHg1NTFmMGFlNSwgTCJsb25nRWRnZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0xvbmdFZGdlfSwNCisgICAgezB4NTU1MjBhOGEsIEwicHJvdGVjdGVkIiwgWEZBX0FUVFJJQlVURUVOVU1fUHJvdGVjdGVkfSwNCisgICAgezB4NTU5Zjc2ZjMsIEwiYm90dG9tUmlnaHQiLCBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b21SaWdodH0sDQorICAgIHsweDU2OGNiNTAwLCBMInplcm8iLCBYRkFfQVRUUklCVVRFRU5VTV9aZXJvfSwNCisgICAgezB4NTZiY2VjYjcsIEwiZm9yd2FyZE9ubHkiLCBYRkFfQVRUUklCVVRFRU5VTV9Gb3J3YXJkT25seX0sDQorICAgIHsweDU2YmY0NTZiLCBMImRvY1JlYWR5IiwgWEZBX0FUVFJJQlVURUVOVU1fRG9jUmVhZHl9LA0KKyAgICB7MHg1NzNjYjQwYywgTCJoaWRkZW4iLCBYRkFfQVRUUklCVVRFRU5VTV9IaWRkZW59LA0KKyAgICB7MHg1ODJlMzQyNCwgTCJpbmNsdWRlIiwgWEZBX0FUVFJJQlVURUVOVU1fSW5jbHVkZX0sDQorICAgIHsweDU4YTNkZDI5LCBMImRhc2hlZCIsIFhGQV9BVFRSSUJVVEVFTlVNX0Rhc2hlZH0sDQorICAgIHsweDU5NTViMjJiLCBMIm11bHRpU2VsZWN0IiwgWEZBX0FUVFJJQlVURUVOVU1fTXVsdGlTZWxlY3R9LA0KKyAgICB7MHg1OThkNWM1MywgTCJpbmFjdGl2ZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0luYWN0aXZlfSwNCisgICAgezB4NTljOGYyN2QsIEwiZW1iZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9FbWJlZH0sDQorICAgIHsweDVlNzU1NWU4LCBMInN0YXRpYyIsIFhGQV9BVFRSSUJVVEVFTlVNX1N0YXRpY30sDQorICAgIHsweDYwNmQ0ZGVmLCBMIm9uRW50cnkiLCBYRkFfQVRUUklCVVRFRU5VTV9PbkVudHJ5fSwNCisgICAgezB4NjE5NWVhZmIsIEwiQ3lyaWxsaWMiLCBYRkFfQVRUUklCVVRFRU5VTV9DeXJpbGxpY30sDQorICAgIHsweDY0OTFiMGYzLCBMIm5vbkJsYW5rIiwgWEZBX0FUVFJJQlVURUVOVU1fTm9uQmxhbmt9LA0KKyAgICB7MHg2N2JlZjAzMSwgTCJ0b3BSaWdodCIsIFhGQV9BVFRSSUJVVEVFTlVNX1RvcFJpZ2h0fSwNCisgICAgezB4NjdkZjVlYmQsIEwiSGVicmV3IiwgWEZBX0FUVFJJQlVURUVOVU1fSGVicmV3fSwNCisgICAgezB4NmFlYTk4YmUsIEwidG9wTGVmdCIsIFhGQV9BVFRSSUJVVEVFTlVNX1RvcExlZnR9LA0KKyAgICB7MHg2YzUxYWZjMSwgTCJjZW50ZXIiLCBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXJ9LA0KKyAgICB7MHg3MTQ1ZTZiZiwgTCJtb3ZlRmlyc3QiLCBYRkFfQVRUUklCVVRFRU5VTV9Nb3ZlRmlyc3R9LA0KKyAgICB7MHg3Mzc1NDY1YywgTCJkaWFtb25kIiwgWEZBX0FUVFJJQlVURUVOVU1fRGlhbW9uZH0sDQorICAgIHsweDc0NjFhZWY0LCBMInBhZ2VPZGQiLCBYRkFfQVRUUklCVVRFRU5VTV9QYWdlT2RkfSwNCisgICAgezB4NzVmOGFlYjIsIEwiMW1vZDEwIiwgWEZBX0FUVFJJQlVURUVOVU1fMW1vZDEwfSwNCisgICAgezB4NzZkNzA4ZTAsIEwiS29yZWFuIiwgWEZBX0FUVFJJQlVURUVOVU1fS29yZWFufSwNCisgICAgezB4Nzg5ZjE0ZDcsIEwiYWJvdmVFbWJlZGRlZCIsIFhGQV9BVFRSSUJVVEVFTlVNX0Fib3ZlRW1iZWRkZWR9LA0KKyAgICB7MHg3OTJlYTM5ZiwgTCJ6aXBDb21wcmVzcyIsIFhGQV9BVFRSSUJVVEVFTlVNX1ppcENvbXByZXNzfSwNCisgICAgezB4N2E1YjcxOTMsIEwibnVtZXJpYyIsIFhGQV9BVFRSSUJVVEVFTlVNX051bWVyaWN9LA0KKyAgICB7MHg3YWJlYzBkMiwgTCJjaXJjbGUiLCBYRkFfQVRUUklCVVRFRU5VTV9DaXJjbGV9LA0KKyAgICB7MHg3YWZiYmEzOCwgTCJ0b0JvdHRvbSIsIFhGQV9BVFRSSUJVVEVFTlVNX1RvQm90dG9tfSwNCisgICAgezB4N2I5NWU2NjEsIEwiaW52ZXJ0ZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9JbnZlcnRlZH0sDQorICAgIHsweDdiYWNhMmUzLCBMInVwZGF0ZSIsIFhGQV9BVFRSSUJVVEVFTlVNX1VwZGF0ZX0sDQorICAgIHsweDdlYjVkYTJjLCBMImlzb25hbWUiLCBYRkFfQVRUUklCVVRFRU5VTV9Jc29uYW1lfSwNCisgICAgezB4N2Y2ZmQzZDcsIEwic2VydmVyIiwgWEZBX0FUVFJJQlVURUVOVU1fU2VydmVyfSwNCisgICAgezB4ODE0ZjgyYjUsIEwicG9zaXRpb24iLCBYRkFfQVRUUklCVVRFRU5VTV9Qb3NpdGlvbn0sDQorICAgIHsweDgyZGVhY2YwLCBMIm1pZGRsZUNlbnRlciIsIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZUNlbnRlcn0sDQorICAgIHsweDgzYTQ5ZGM2LCBMIm9wdGlvbmFsIiwgWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWx9LA0KKyAgICB7MHg4NjFhMTE2ZiwgTCJ1c2VQcmludGVyU2V0dGluZyIsIFhGQV9BVFRSSUJVVEVFTlVNX1VzZVByaW50ZXJTZXR0aW5nfSwNCisgICAgezB4ODY3MDFjZTAsIEwib3V0bGluZSIsIFhGQV9BVFRSSUJVVEVFTlVNX091dGxpbmV9LA0KKyAgICB7MHg4ODA4Mzg1ZSwgTCJpbmRleENoYW5nZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0luZGV4Q2hhbmdlfSwNCisgICAgezB4ODkxZjQ2MDYsIEwiY2hhbmdlIiwgWEZBX0FUVFJJQlVURUVOVU1fQ2hhbmdlfSwNCisgICAgezB4ODk5MzlmMzYsIEwicGFnZUFyZWEiLCBYRkFfQVRUUklCVVRFRU5VTV9QYWdlQXJlYX0sDQorICAgIHsweDhiNWMzYjI1LCBMIm9uY2UiLCBYRkFfQVRUUklCVVRFRU5VTV9PbmNlfSwNCisgICAgezB4OGI1YzY5NjIsIEwib25seSIsIFhGQV9BVFRSSUJVVEVFTlVNX09ubHl9LA0KKyAgICB7MHg4YjkwZTFmMiwgTCJvcGVuIiwgWEZBX0FUVFJJQlVURUVOVU1fT3Blbn0sDQorICAgIHsweDhiY2ZlOTZlLCBMImNhcHRpb24iLCBYRkFfQVRUUklCVVRFRU5VTV9DYXB0aW9ufSwNCisgICAgezB4OGNlODNlZjgsIEwicmFpc2VkIiwgWEZBX0FUVFJJQlVURUVOVU1fUmFpc2VkfSwNCisgICAgezB4OGQyNjljYWUsIEwianVzdGlmeSIsIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnl9LA0KKyAgICB7MHg4ZmQ1MjBkYywgTCJyZWZBbmREZXNjZW5kYW50cyIsIFhGQV9BVFRSSUJVVEVFTlVNX1JlZkFuZERlc2NlbmRhbnRzfSwNCisgICAgezB4OTA0MWQ0YjAsIEwic2hvcnQiLCBYRkFfQVRUUklCVVRFRU5VTV9TaG9ydH0sDQorICAgIHsweDkwYzk0NDI2LCBMInBhZ2VGcm9udCIsIFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VGcm9udH0sDQorICAgIHsweDkzNmJlZWU1LCBMIm1vbm9zcGFjZSIsIFhGQV9BVFRSSUJVVEVFTlVNX01vbm9zcGFjZX0sDQorICAgIHsweDk0N2ZhMDBmLCBMIm1pZGRsZSIsIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZX0sDQorICAgIHsweDk1MjhhN2I0LCBMInByZVByaW50IiwgWEZBX0FUVFJJQlVURUVOVU1fUHJlUHJpbnR9LA0KKyAgICB7MHg5NTlhYjIzMSwgTCJhbHdheXMiLCBYRkFfQVRUUklCVVRFRU5VTV9BbHdheXN9LA0KKyAgICB7MHg5NmQ2MWJmMCwgTCJ1bmtub3duIiwgWEZBX0FUVFJJQlVURUVOVU1fVW5rbm93bn0sDQorICAgIHsweDk5NzE5NGVlLCBMInRvTGVmdCIsIFhGQV9BVFRSSUJVVEVFTlVNX1RvTGVmdH0sDQorICAgIHsweDlhODNhM2NkLCBMImFib3ZlIiwgWEZBX0FUVFJJQlVURUVOVU1fQWJvdmV9LA0KKyAgICB7MHg5ZDBkNzFjNywgTCJkYXNoRG90IiwgWEZBX0FUVFJJQlVURUVOVU1fRGFzaERvdH0sDQorICAgIHsweDlkZjU2ZjNlLCBMImdyZWdvcmlhbiIsIFhGQV9BVFRSSUJVVEVFTlVNX0dyZWdvcmlhbn0sDQorICAgIHsweDlmNjcyM2ZkLCBMIlJvbWFuIiwgWEZBX0FUVFJJQlVURUVOVU1fUm9tYW59LA0KKyAgICB7MHg5ZjY5M2IyMSwgTCJtb3VzZURvd24iLCBYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZURvd259LA0KKyAgICB7MHhhMTQyOWIzNiwgTCJzeW1ib2wiLCBYRkFfQVRUUklCVVRFRU5VTV9TeW1ib2x9LA0KKyAgICB7MHhhNWFhNDVjYiwgTCJwYWdlRXZlbiIsIFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VFdmVufSwNCisgICAgezB4YTY4NjM1ZjEsIEwic2lnbiIsIFhGQV9BVFRSSUJVVEVFTlVNX1NpZ259LA0KKyAgICB7MHhhNzMxNTA5MywgTCJhZGROZXciLCBYRkFfQVRUUklCVVRFRU5VTV9BZGROZXd9LA0KKyAgICB7MHhhN2E3NzNmYSwgTCJzdGFyIiwgWEZBX0FUVFJJQlVURUVOVU1fU3Rhcn0sDQorICAgIHsweGE3ZDU3YjQ1LCBMIm9wdGltaXN0aWMiLCBYRkFfQVRUUklCVVRFRU5VTV9PcHRpbWlzdGljfSwNCisgICAgezB4YTgwNzczMjEsIEwicmwtdGIiLCBYRkFfQVRUUklCVVRFRU5VTV9SbF90Yn0sDQorICAgIHsweGE4ZjE0NjhkLCBMIm1pZGRsZVJpZ2h0IiwgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlUmlnaHR9LA0KKyAgICB7MHhhYTg0YTFmMSwgTCJtYWludGFpbiIsIFhGQV9BVFRSSUJVVEVFTlVNX01haW50YWlufSwNCisgICAgezB4YWI0MGIxMmMsIEwicGFja2FnZSIsIFhGQV9BVFRSSUJVVEVFTlVNX1BhY2thZ2V9LA0KKyAgICB7MHhhYzhiNGQ4NSwgTCJTaW1wbGlmaWVkQ2hpbmVzZSIsIFhGQV9BVFRSSUJVVEVFTlVNX1NpbXBsaWZpZWRDaGluZXNlfSwNCisgICAgezB4YWRhZTY3NDQsIEwidG9DZW50ZXIiLCBYRkFfQVRUUklCVVRFRU5VTV9Ub0NlbnRlcn0sDQorICAgIHsweGIwMTI5ZGYxLCBMImJhY2siLCBYRkFfQVRUUklCVVRFRU5VTV9CYWNrfSwNCisgICAgezB4YjBmMDg4Y2YsIEwidW5zcGVjaWZpZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9VbnNwZWNpZmllZH0sDQorICAgIHsweGIxMjcxMDY3LCBMImJhdGNoT3B0aW1pc3RpYyIsIFhGQV9BVFRSSUJVVEVFTlVNX0JhdGNoT3B0aW1pc3RpY30sDQorICAgIHsweGIxODMxM2ExLCBMImJvbGQiLCBYRkFfQVRUUklCVVRFRU5VTV9Cb2xkfSwNCisgICAgezB4YjE4MzNjYWQsIEwiYm90aCIsIFhGQV9BVFRSSUJVVEVFTlVNX0JvdGh9LA0KKyAgICB7MHhiMjIxMTIzZiwgTCJidXR0IiwgWEZBX0FUVFJJQlVURUVOVU1fQnV0dH0sDQorICAgIHsweGI0MGMzNmJmLCBMImNsaWVudCIsIFhGQV9BVFRSSUJVVEVFTlVNX0NsaWVudH0sDQorICAgIHsweGI1NmM3MDUzLCBMIjJtb2QxMCIsIFhGQV9BVFRSSUJVVEVFTlVNXzJtb2QxMH0sDQorICAgIHsweGI2ODNhMzQ1LCBMImltYWdlT25seSIsIFhGQV9BVFRSSUJVVEVFTlVNX0ltYWdlT25seX0sDQorICAgIHsweGI3NzMyZGVhLCBMImhvcml6b250YWwiLCBYRkFfQVRUUklCVVRFRU5VTV9Ib3Jpem9udGFsfSwNCisgICAgezB4Yjg4NjUyYTQsIEwiZG90dGVkIiwgWEZBX0FUVFJJQlVURUVOVU1fRG90dGVkfSwNCisgICAgezB4YmIyZjI4ODAsIEwidXNlckNvbnRyb2wiLCBYRkFfQVRUUklCVVRFRU5VTV9Vc2VyQ29udHJvbH0sDQorICAgIHsweGJiYjc5YzVkLCBMImRpYWdvbmFsUmlnaHQiLCBYRkFfQVRUUklCVVRFRU5VTV9EaWFnb25hbFJpZ2h0fSwNCisgICAgezB4YmQwNzcxNTQsIEwiY29uc3VtZURhdGEiLCBYRkFfQVRUUklCVVRFRU5VTV9Db25zdW1lRGF0YX0sDQorICAgIHsweGJkM2ZiMTFlLCBMImNoZWNrIiwgWEZBX0FUVFJJQlVURUVOVU1fQ2hlY2t9LA0KKyAgICB7MHhiZGU5YWJkYSwgTCJkYXRhIiwgWEZBX0FUVFJJQlVURUVOVU1fRGF0YX0sDQorICAgIHsweGJmNWEwMmQ4LCBMImRvd24iLCBYRkFfQVRUUklCVVRFRU5VTV9Eb3dufSwNCisgICAgezB4YmY3NDUwZWUsIEwic2Fuc1NlcmlmIiwgWEZBX0FUVFJJQlVURUVOVU1fU2Fuc1NlcmlmfSwNCisgICAgezB4YzAyZDY0OWYsIEwiaW5saW5lIiwgWEZBX0FUVFJJQlVURUVOVU1fSW5saW5lfSwNCisgICAgezB4YzExYTllM2EsIEwiVHJhZGl0aW9uYWxDaGluZXNlIiwgWEZBX0FUVFJJQlVURUVOVU1fVHJhZGl0aW9uYWxDaGluZXNlfSwNCisgICAgezB4YzE2MTY5ZDgsIEwid2FybiIsIFhGQV9BVFRSSUJVVEVFTlVNX1dhcm59LA0KKyAgICB7MHhjMTZmMDcxZiwgTCJyZWZPbmx5IiwgWEZBX0FUVFJJQlVURUVOVU1fUmVmT25seX0sDQorICAgIHsweGMyN2M4YmE1LCBMImludGVyYWN0aXZlRm9ybXMiLCBYRkFfQVRUUklCVVRFRU5VTV9JbnRlcmFjdGl2ZUZvcm1zfSwNCisgICAgezB4YzJkMWIxNWMsIEwid29yZCIsIFhGQV9BVFRSSUJVVEVFTlVNX1dvcmR9LA0KKyAgICB7MHhjMzYyMTI4OCwgTCJ1bm9yZGVyZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9Vbm9yZGVyZWR9LA0KKyAgICB7MHhjNTI1MTk4MSwgTCJyZXF1aXJlZCIsIFhGQV9BVFRSSUJVVEVFTlVNX1JlcXVpcmVkfSwNCisgICAgezB4YzcwODhlN2QsIEwiaW1wb3J0T25seSIsIFhGQV9BVFRSSUJVVEVFTlVNX0ltcG9ydE9ubHl9LA0KKyAgICB7MHhjNzJjZjBlMywgTCJiZWxvd0VtYmVkZGVkIiwgWEZBX0FUVFJJQlVURUVOVU1fQmVsb3dFbWJlZGRlZH0sDQorICAgIHsweGM4MTljZjA3LCBMIkphcGFuZXNlIiwgWEZBX0FUVFJJQlVURUVOVU1fSmFwYW5lc2V9LA0KKyAgICB7MHhjZGNlNTZiMywgTCJmdWxsIiwgWEZBX0FUVFJJQlVURUVOVU1fRnVsbH0sDQorICAgIHsweGNlMDEyMmUzLCBMInJsLXJvdyIsIFhGQV9BVFRSSUJVVEVFTlVNX1JsX3Jvd30sDQorICAgIHsweGNmN2Q3MWYxLCBMIlZpZXRuYW1lc2UiLCBYRkFfQVRUUklCVVRFRU5VTV9WaWV0bmFtZXNlfSwNCisgICAgezB4Y2ZkZTNlMDksIEwiRWFzdEV1cm9wZWFuUm9tYW4iLCBYRkFfQVRUUklCVVRFRU5VTV9FYXN0RXVyb3BlYW5Sb21hbn0sDQorICAgIHsweGQ1NzZkMDhlLCBMIm1vdXNlVXAiLCBYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZVVwfSwNCisgICAgezB4ZDdhOTI5MDQsIEwiZXhwb3J0T25seSIsIFhGQV9BVFRSSUJVVEVFTlVNX0V4cG9ydE9ubHl9LA0KKyAgICB7MHhkOGVkMTQ2NywgTCJjbGVhciIsIFhGQV9BVFRSSUJVVEVFTlVNX0NsZWFyfSwNCisgICAgezB4ZDk1NjU3YTYsIEwiY2xpY2siLCBYRkFfQVRUUklCVVRFRU5VTV9DbGlja30sDQorICAgIHsweGQ5NmM3ZGU1LCBMImJhc2U2NCIsIFhGQV9BVFRSSUJVVEVFTlVNX0Jhc2U2NH0sDQorICAgIHsweGQ5ZjQ3ZjM2LCBMImNsb3NlIiwgWEZBX0FUVFJJQlVURUVOVU1fQ2xvc2V9LA0KKyAgICB7MHhkYjA3NWJkZSwgTCJob3N0IiwgWEZBX0FUVFJJQlVURUVOVU1fSG9zdH0sDQorICAgIHsweGRiMTAzNDExLCBMImdsb2JhbCIsIFhGQV9BVFRSSUJVVEVFTlVNX0dsb2JhbH0sDQorICAgIHsweGRiNjQ3MTg4LCBMImJsYW5rIiwgWEZBX0FUVFJJQlVURUVOVU1fQmxhbmt9LA0KKyAgICB7MHhkYjliZTk2OCwgTCJ0YWJsZSIsIFhGQV9BVFRSSUJVVEVFTlVNX1RhYmxlfSwNCisgICAgezB4ZGY1OTBmYmIsIEwiaW1wb3J0IiwgWEZBX0FUVFJJQlVURUVOVU1fSW1wb3J0fSwNCisgICAgezB4ZTBlNTczZmIsIEwiY3VzdG9tIiwgWEZBX0FUVFJJQlVURUVOVU1fQ3VzdG9tfSwNCisgICAgezB4ZTBlY2M3OWEsIEwibWlkZGxlTGVmdCIsIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZUxlZnR9LA0KKyAgICB7MHhlMTQ1MjAxOSwgTCJwb3N0RXhlY3V0ZSIsIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RFeGVjdXRlfSwNCisgICAgezB4ZTE5MTFkOTgsIEwicmFkaXgiLCBYRkFfQVRUUklCVVRFRU5VTV9SYWRpeH0sDQorICAgIHsweGUyNWZhN2I4LCBMInBvc3RPcGVuIiwgWEZBX0FUVFJJQlVURUVOVU1fUG9zdE9wZW59LA0KKyAgICB7MHhlMjhkY2U3ZSwgTCJlbnRlciIsIFhGQV9BVFRSSUJVVEVFTlVNX0VudGVyfSwNCisgICAgezB4ZTJjNDRkZTQsIEwiaWdub3JlIiwgWEZBX0FUVFJJQlVURUVOVU1fSWdub3JlfSwNCisgICAgezB4ZTJjZDhjNjEsIEwibHItdGIiLCBYRkFfQVRUUklCVVRFRU5VTV9Mcl90Yn0sDQorICAgIHsweGUyZGE4MzM2LCBMImZhbnRhc3kiLCBYRkFfQVRUUklCVVRFRU5VTV9GYW50YXN5fSwNCisgICAgezB4ZTMxZDUzOTYsIEwiaXRhbGljIiwgWEZBX0FUVFJJQlVURUVOVU1fSXRhbGljfSwNCisgICAgezB4ZTdhZGExMTMsIEwiYXV0aG9yIiwgWEZBX0FUVFJJQlVURUVOVU1fQXV0aG9yfSwNCisgICAgezB4ZThlN2NjMTgsIEwidG9FZGdlIiwgWEZBX0FUVFJJQlVURUVOVU1fVG9FZGdlfSwNCisgICAgezB4ZTk3YWE5OGIsIEwiY2hvaWNlIiwgWEZBX0FUVFJJQlVURUVOVU1fQ2hvaWNlfSwNCisgICAgezB4ZWFmZDJhMzgsIEwiZGlzYWJsZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9EaXNhYmxlZH0sDQorICAgIHsweGViMmI3OTcyLCBMImNyb3NzSGF0Y2giLCBYRkFfQVRUUklCVVRFRU5VTV9Dcm9zc0hhdGNofSwNCisgICAgezB4ZWIyZGIyZDcsIEwiZGF0YVJlZiIsIFhGQV9BVFRSSUJVVEVFTlVNX0RhdGFSZWZ9LA0KKyAgICB7MHhlYzM1ZGM2ZSwgTCJkYXNoRG90RG90IiwgWEZBX0FUVFJJQlVURUVOVU1fRGFzaERvdERvdH0sDQorICAgIHsweGVmODVkMzUxLCBMInNxdWFyZSIsIFhGQV9BVFRSSUJVVEVFTlVNX1NxdWFyZX0sDQorICAgIHsweGYyMTAyNDQ1LCBMImR5bmFtaWMiLCBYRkFfQVRUUklCVVRFRU5VTV9EeW5hbWljfSwNCisgICAgezB4ZjI3MmM3YmUsIEwibWFudWFsIiwgWEZBX0FUVFJJQlVURUVOVU1fTWFudWFsfSwNCisgICAgezB4ZjJiYmI2NGQsIEwiZXRjaGVkIiwgWEZBX0FUVFJJQlVURUVOVU1fRXRjaGVkfSwNCisgICAgezB4ZjNiOGZjNmMsIEwidmFsaWRhdGlvblN0YXRlIiwgWEZBX0FUVFJJQlVURUVOVU1fVmFsaWRhdGlvblN0YXRlfSwNCisgICAgezB4ZjQyZjJiODEsIEwiY3Vyc2l2ZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0N1cnNpdmV9LA0KKyAgICB7MHhmNTQ0ODFkNCwgTCJsYXN0IiwgWEZBX0FUVFJJQlVURUVOVU1fTGFzdH0sDQorICAgIHsweGY1YWQ3ODJiLCBMImxlZnQiLCBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0fSwNCisgICAgezB4ZjYxNmRhMmUsIEwibGluayIsIFhGQV9BVFRSSUJVVEVFTlVNX0xpbmt9LA0KKyAgICB7MHhmNmI0YWZiMCwgTCJsb25nIiwgWEZBX0FUVFJJQlVURUVOVU1fTG9uZ30sDQorICAgIHsweGY4NjM2NDYwLCBMImludGVybmF0aW9uYWxDYXJyaWVyIiwNCisgICAgIFhGQV9BVFRSSUJVVEVFTlVNX0ludGVybmF0aW9uYWxDYXJyaWVyfSwNCisgICAgezB4ZjlmYjM3YWMsIEwiUERGMS4zIiwgWEZBX0FUVFJJQlVURUVOVU1fUERGMV8zfSwNCisgICAgezB4ZjlmYjM3YWYsIEwiUERGMS42IiwgWEZBX0FUVFJJQlVURUVOVU1fUERGMV82fSwNCisgICAgezB4ZmJjZTdmMTksIEwic2VyaWYiLCBYRkFfQVRUUklCVVRFRU5VTV9TZXJpZn0sDQorICAgIHsweGZjODJkNjk1LCBMInBvc3RTYXZlIiwgWEZBX0FUVFJJQlVURUVOVU1fUG9zdFNhdmV9LA0KKyAgICB7MHhmY2VmODZiNSwgTCJyZWFkeSIsIFhGQV9BVFRSSUJVVEVFTlVNX1JlYWR5fSwNCisgICAgezB4ZmQ1NGZiYjcsIEwicG9zdFNpZ24iLCBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0U2lnbn0sDQorICAgIHsweGZkYzBhYWUyLCBMIkFyYWJpYyIsIFhGQV9BVFRSSUJVVEVFTlVNX0FyYWJpY30sDQorICAgIHsweGZlMDZkMmNhLCBMImVycm9yIiwgWEZBX0FUVFJJQlVURUVOVU1fRXJyb3J9LA0KKyAgICB7MHhmZWZjNDg4NSwgTCJ1cmxlbmNvZGVkIiwgWEZBX0FUVFJJQlVURUVOVU1fVXJsZW5jb2RlZH0sDQorICAgIHsweGZmNzk1YWQyLCBMImxvd2VyZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9Mb3dlcmVkfSwNCit9Ow0KK2V4dGVybiBjb25zdCBpbnQzMl90IGdfaVhGQUVudW1Db3VudCA9DQorICAgIHNpemVvZihnX1hGQUVudW1EYXRhKSAvIHNpemVvZihYRkFfQVRUUklCVVRFRU5VTUlORk8pOw0KK3N0YXRpYyBjb25zdCBDWEZBX01lYXN1cmVtZW50IGdfWEZBTWVhc3VyZW1lbnREYXRhW10gPSB7DQorICAgIENYRkFfTWVhc3VyZW1lbnQoMCwgWEZBX1VOSVRfSW4pLA0KKyAgICBDWEZBX01lYXN1cmVtZW50KDAsIFhGQV9VTklUX1B0KSwNCisgICAgQ1hGQV9NZWFzdXJlbWVudCg1LCBYRkFfVU5JVF9NbSksDQorICAgIENYRkFfTWVhc3VyZW1lbnQoMC4yNSwgWEZBX1VOSVRfTW0pLA0KKyAgICBDWEZBX01lYXN1cmVtZW50KC0xLCBYRkFfVU5JVF9Vbmtub3duKSwNCisgICAgQ1hGQV9NZWFzdXJlbWVudCgwLCBYRkFfVU5JVF9BbmdsZSksDQorICAgIENYRkFfTWVhc3VyZW1lbnQoMTAsIFhGQV9VTklUX1B0KSwNCisgICAgQ1hGQV9NZWFzdXJlbWVudCgzNjAsIFhGQV9VTklUX0FuZ2xlKSwNCisgICAgQ1hGQV9NZWFzdXJlbWVudCgwLjUsIFhGQV9VTklUX1B0KSwNCit9Ow0KK2V4dGVybiBjb25zdCBYRkFfQVRUUklCVVRFSU5GTyBnX1hGQUF0dHJpYnV0ZURhdGFbXSA9IHsNCisgICAgezB4NjgsIEwiaCIsIFhGQV9BVFRSSUJVVEVfSCwgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KKyAgICB7MHg3NywgTCJ3IiwgWEZBX0FUVFJJQlVURV9XLCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQorICAgIHsweDc4LCBMIngiLCBYRkFfQVRUUklCVVRFX1gsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KKyAgICB7MHg3OSwgTCJ5IiwgWEZBX0FUVFJJQlVURV9ZLCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwNCisgICAgezB4MjFhZWQsIEwiaWQiLCBYRkFfQVRUUklCVVRFX0lkLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8DQorICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0IHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHgyNTM2MywgTCJ0byIsIFhGQV9BVFRSSUJVVEVfVG8sIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsICh2b2lkKilOVUxMfSwNCisgICAgezB4Y2IwYWM5LCBMImxpbmVUaHJvdWdoIiwgWEZBX0FUVFJJQlVURV9MaW5lVGhyb3VnaCwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopMH0sDQorICAgIHsweDIyODJjNzMsIEwiaEFsaWduIiwgWEZBX0FUVFJJQlVURV9IQWxpZ24sIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0xlZnR9LA0KKyAgICB7MHgyYzFjN2YxLCBMInR5cGVmYWNlIiwgWEZBX0FUVFJJQlVURV9UeXBlZmFjZSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTCJDb3VyaWVyIn0sDQorICAgIHsweDMxMDZjM2EsIEwiYmVmb3JlVGFyZ2V0IiwgWEZBX0FUVFJJQlVURV9CZWZvcmVUYXJnZXQsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4MzFiMTljMSwgTCJuYW1lIiwgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0IHwNCisgICAgICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cyB8IFhGQV9YRFBQQUNLRVRfRm9ybSB8DQorICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0IHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHgzODQ4YjNmLCBMIm5leHQiLCBYRkFfQVRUUklCVVRFX05leHQsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX05vbmV9LA0KKyAgICB7MHg0M2UzNDliLCBMImRhdGFSb3dDb3VudCIsIFhGQV9BVFRSSUJVVEVfRGF0YVJvd0NvdW50LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweDU1MThjMjUsIEwiYnJlYWsiLCBYRkFfQVRUUklCVVRFX0JyZWFrLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9DbG9zZX0sDQorICAgIHsweDVjZTYxOTUsIEwidlNjcm9sbFBvbGljeSIsIFhGQV9BVFRSSUJVVEVfVlNjcm9sbFBvbGljeSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQXV0b30sDQorICAgIHsweDhjNzRhZTksIEwiZm9udEhvcml6b250YWxTY2FsZSIsIFhGQV9BVFRSSUJVVEVfRm9udEhvcml6b250YWxTY2FsZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKUwiMTAwJSJ9LA0KKyAgICB7MHg4ZDRmMWM3LCBMInRleHRJbmRlbnQiLCBYRkFfQVRUUklCVVRFX1RleHRJbmRlbnQsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwNCisgICAgezB4OTdjMWM2NSwgTCJjb250ZXh0IiwgWEZBX0FUVFJJQlVURV9Db250ZXh0LCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9VTktOT1dOLCAodm9pZCopMH0sDQorICAgIHsweDk4NzY1NzgsIEwidHJheU91dCIsIFhGQV9BVFRSSUJVVEVfVHJheU91dCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQXV0b30sDQorICAgIHsweGEyZTM1MTQsIEwiY2FwIiwgWEZBX0FUVFJJQlVURV9DYXAsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1NxdWFyZX0sDQorICAgIHsweGIzNTQzYTYsIEwibWF4IiwgWEZBX0FUVFJJQlVURV9NYXgsIFhGQV9BVFRSSUJVVEVUWVBFX05PVFNVUkUsDQorICAgICBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweGIzNTZjYTQsIEwibWluIiwgWEZBX0FUVFJJQlVURV9NaW4sIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMX0sDQorICAgIHsweGJiOGRmNWQsIEwicmVmIiwgWEZBX0FUVFJJQlVURV9SZWYsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfA0KKyAgICAgICAgIFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4YmI4ZjNkZiwgTCJyaWQiLCBYRkFfQVRUUklCVVRFX1JpZCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweGMwODBjZDMsIEwidXJsIiwgWEZBX0FUVFJJQlVURV9VcmwsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8DQorICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0IHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHhjZmVhMDJlLCBMImxlZnRJbnNldCIsIFhGQV9BVFRSSUJVVEVfTGVmdEluc2V0LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQorICAgIHsweDEwMjZjNTlkLCBMIndpZG93cyIsIFhGQV9BVFRSSUJVVEVfV2lkb3dzLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTB9LA0KKyAgICB7MHgxMDU5ZWMxOCwgTCJsZXZlbCIsIFhGQV9BVFRSSUJVVEVfTGV2ZWwsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgKHZvaWQqKTB9LA0KKyAgICB7MHgxMzU2Y2FmOCwgTCJib3R0b21JbnNldCIsIFhGQV9BVFRSSUJVVEVfQm90dG9tSW5zZXQsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwNCisgICAgezB4MTNhMDhiZGIsIEwib3ZlcmZsb3dUYXJnZXQiLCBYRkFfQVRUUklCVVRFX092ZXJmbG93VGFyZ2V0LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweDE0MTRkNDMxLCBMImFsbG93TWFjcm8iLCBYRkFfQVRUUklCVVRFX0FsbG93TWFjcm8sDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKTB9LA0KKyAgICB7MHgxNGEzMmQ1MiwgTCJwYWdlUG9zaXRpb24iLCBYRkFfQVRUUklCVVRFX1BhZ2VQb3NpdGlvbiwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQW55fSwNCisgICAgezB4MTUxN2RmYTEsIEwiY29sdW1uV2lkdGhzIiwgWEZBX0FUVFJJQlVURV9Db2x1bW5XaWR0aHMsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4MTY5MTM0YTEsIEwib3ZlcmZsb3dMZWFkZXIiLCBYRkFfQVRUUklCVVRFX092ZXJmbG93TGVhZGVyLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweDFiOGRjZTNlLCBMImFjdGlvbiIsIFhGQV9BVFRSSUJVVEVfQWN0aW9uLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9JbmNsdWRlfSwNCisgICAgezB4MWU0NTliOGYsIEwibm9uUmVwdWRpYXRpb24iLCBYRkFfQVRUUklCVVRFX05vblJlcHVkaWF0aW9uLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweDFlYzhhYjJjLCBMInJhdGUiLCBYRkFfQVRUUklCVVRFX1JhdGUsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopNTB9LA0KKyAgICB7MHgxZWYzYTY0YSwgTCJhbGxvd1JpY2hUZXh0IiwgWEZBX0FUVFJJQlVURV9BbGxvd1JpY2hUZXh0LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikwfSwNCisgICAgezB4MjAzOGM5YjIsIEwicm9sZSIsIFhGQV9BVFRSSUJVVEVfUm9sZSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweDIwOTE0MzY3LCBMIm92ZXJmbG93VHJhaWxlciIsIFhGQV9BVFRSSUJVVEVfT3ZlcmZsb3dUcmFpbGVyLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweDIyNmNhOGYxLCBMIm9wZXJhdGlvbiIsIFhGQV9BVFRSSUJVVEVfT3BlcmF0aW9uLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4MjRkODUxNjcsIEwidGltZW91dCIsIFhGQV9BVFRSSUJVVEVfVGltZW91dCwgWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSwNCisgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LCAodm9pZCopTlVMTH0sDQorICAgIHsweDI1NzY0NDM2LCBMInRvcEluc2V0IiwgWEZBX0FUVFJJQlVURV9Ub3BJbnNldCwgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KKyAgICB7MHgyNTgzOTg1MiwgTCJhY2Nlc3MiLCBYRkFfQVRUUklCVVRFX0FjY2VzcywgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fT3Blbn0sDQorICAgIHsweDI2OGI3ZWMxLCBMImNvbW1hbmRUeXBlIiwgWEZBX0FUVFJJQlVURV9Db21tYW5kVHlwZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd259LA0KKyAgICB7MHgyOGRlZTZlOSwgTCJmb3JtYXQiLCBYRkFfQVRUUklCVVRFX0Zvcm1hdCwgWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4MjhlMTdlOTEsIEwiZGF0YVByZXAiLCBYRkFfQVRUUklCVVRFX0RhdGFQcmVwLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Ob25lfSwNCisgICAgezB4MjkyYjg4ZmUsIEwid2lkZ2V0RGF0YSIsIFhGQV9BVFRSSUJVVEVfV2lkZ2V0RGF0YSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVU5LTk9XTiwgKHZvaWQqKTB9LA0KKyAgICB7MHgyOTQxOGJiNywgTCJhYmJyIiwgWEZBX0FUVFJJQlVURV9BYmJyLCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsICh2b2lkKikwfSwNCisgICAgezB4MmE4MmQ5OWMsIEwibWFyZ2luUmlnaHQiLCBYRkFfQVRUUklCVVRFX01hcmdpblJpZ2h0LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQorICAgIHsweDJiNWRmNTFlLCBMImRhdGFEZXNjcmlwdGlvbiIsIFhGQV9BVFRSSUJVVEVfRGF0YURlc2NyaXB0aW9uLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHgyYmIzZjQ3MCwgTCJlbmNpcGhlck9ubHkiLCBYRkFfQVRUUklCVVRFX0VuY2lwaGVyT25seSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHgyY2Q3OTAzMywgTCJrZXJuaW5nTW9kZSIsIFhGQV9BVFRSSUJVVEVfS2VybmluZ01vZGUsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX05vbmV9LA0KKyAgICB7MHgyZWU3Njc4ZiwgTCJyb3RhdGUiLCBYRkFfQVRUUklCVVRFX1JvdGF0ZSwgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgNSl9LA0KKyAgICB7MHgyZjEwNWY3MiwgTCJ3b3JkQ2hhcmFjdGVyQ291bnQiLCBYRkFfQVRUUklCVVRFX1dvcmRDaGFyYWN0ZXJDb3VudCwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopN30sDQorICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX05PVFNVUkUsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweDM0YWUxMDNjLCBMInJlc2VydmUiLCBYRkFfQVRUUklCVVRFX1Jlc2VydmUsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDQpfSwNCisgICAgezB4MzY1MDU1N2UsIEwidGV4dExvY2F0aW9uIiwgWEZBX0FUVFJJQlVURV9UZXh0TG9jYXRpb24sDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0JlbG93fSwNCisgICAgezB4MzljZGIwYTIsIEwicHJpb3JpdHkiLCBYRkFfQVRUUklCVVRFX1ByaW9yaXR5LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9DdXN0b219LA0KKyAgICB7MHgzYTAyNzNhNiwgTCJ1bmRlcmxpbmUiLCBYRkFfQVRUUklCVVRFX1VuZGVybGluZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopMH0sDQorICAgIHsweDNiNTgyMjg2LCBMIm1vZHVsZVdpZHRoIiwgWEZBX0FUVFJJQlVURV9Nb2R1bGVXaWR0aCwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMyl9LA0KKyAgICB7MHgzZDEyM2MyNiwgTCJoeXBoZW5hdGUiLCBYRkFfQVRUUklCVVRFX0h5cGhlbmF0ZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopMH0sDQorICAgIHsweDNlN2FmOTRmLCBMImxpc3RlbiIsIFhGQV9BVFRSSUJVVEVfTGlzdGVuLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9SZWZPbmx5fSwNCisgICAgezB4NDE1NmVlM2YsIEwiZGVsaW1pdGVyIiwgWEZBX0FUVFJJQlVURV9EZWxpbWl0ZXIsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHg0MmZlZDFmZCwgTCJjb250ZW50VHlwZSIsIFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cyB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4NDUzZWFmMzgsIEwic3RhcnROZXciLCBYRkFfQVRUUklCVVRFX1N0YXJ0TmV3LCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTB9LA0KKyAgICB7MHg0NWE2ZGFmOCwgTCJlb2ZBY3Rpb24iLCBYRkFfQVRUUklCVVRFX0VvZkFjdGlvbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTW92ZUxhc3R9LA0KKyAgICB7MHg0N2NmYTQzYSwgTCJhbGxvd05ldXRyYWwiLCBYRkFfQVRUUklCVVRFX0FsbG93TmV1dHJhbCwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopMH0sDQorICAgIHsweDQ3ZDAzNDkwLCBMImNvbm5lY3Rpb24iLCBYRkFfQVRUUklCVVRFX0Nvbm5lY3Rpb24sDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4NDg3M2M2MDEsIEwiYmFzZWxpbmVTaGlmdCIsIFhGQV9BVFRSSUJVVEVfQmFzZWxpbmVTaGlmdCwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KKyAgICB7MHg0YjMxOTc2NywgTCJvdmVybGluZVBlcmlvZCIsIFhGQV9BVFRSSUJVVEVfT3ZlcmxpbmVQZXJpb2QsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0FsbH0sDQorICAgIHsweDRiOGJjODQwLCBMImZyYWNEaWdpdHMiLCBYRkFfQVRUUklCVVRFX0ZyYWNEaWdpdHMsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKTJ9LA0KKyAgICB7MHg0ZWYzZDAyYywgTCJvcmllbnRhdGlvbiIsIFhGQV9BVFRSSUJVVEVfT3JpZW50YXRpb24sDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1BvcnRyYWl0fSwNCisgICAgezB4NGZkYzM0NTQsIEwidGltZVN0YW1wIiwgWEZBX0FUVFJJQlVURV9UaW1lU3RhbXAsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9YRFAsICh2b2lkKilOVUxMfSwNCisgICAgezB4NTI2NjZmMWMsIEwicHJpbnRDaGVja0RpZ2l0IiwgWEZBX0FUVFJJQlVURV9QcmludENoZWNrRGlnaXQsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKTB9LA0KKyAgICB7MHg1MzQ3MjljOSwgTCJtYXJnaW5MZWZ0IiwgWEZBX0FUVFJJQlVURV9NYXJnaW5MZWZ0LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQorICAgIHsweDUzOTJlYTU4LCBMInN0cm9rZSIsIFhGQV9BVFRSSUJVVEVfU3Ryb2tlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Tb2xpZH0sDQorICAgIHsweDU0MDRkNmRmLCBMIm1vZHVsZUhlaWdodCIsIFhGQV9BVFRSSUJVVEVfTW9kdWxlSGVpZ2h0LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAyKX0sDQorICAgIHsweDU0ZmE3MjJjLCBMInRyYW5zZmVyRW5jb2RpbmciLCBYRkFfQVRUUklCVVRFX1RyYW5zZmVyRW5jb2RpbmcsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHg1NTJkOWFkNSwgTCJ1c2FnZSIsIFhGQV9BVFRSSUJVVEVfVXNhZ2UsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0V4cG9ydEFuZEltcG9ydH0sDQorICAgIHsweDU3MGNlODM1LCBMInByZXNlbmNlIiwgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZX0sDQorICAgIHsweDU3MzlkMWZmLCBMInJhZGl4T2Zmc2V0IiwgWEZBX0FUVFJJQlVURV9SYWRpeE9mZnNldCwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KKyAgICB7MHg1Nzc2ODJhYywgTCJwcmVzZXJ2ZSIsIFhGQV9BVFRSSUJVVEVfUHJlc2VydmUsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHg1OGJlMjg3MCwgTCJhbGlhc05vZGUiLCBYRkFfQVRUUklCVVRFX0FsaWFzTm9kZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVU5LTk9XTiwgKHZvaWQqKTB9LA0KKyAgICB7MHg1YTMyZTQ5MywgTCJtdWx0aUxpbmUiLCBYRkFfQVRUUklCVVRFX011bHRpTGluZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopMH0sDQorICAgIHsweDVhNTBlOWU2LCBMInZlcnNpb24iLCBYRkFfQVRUUklCVVRFX1ZlcnNpb24sIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHg1YWIyM2I2YywgTCJzdGFydENoYXIiLCBYRkFfQVRUUklCVVRFX1N0YXJ0Q2hhciwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweDViNzA3YTM1LCBMInNjcmlwdFRlc3QiLCBYRkFfQVRUUklCVVRFX1NjcmlwdFRlc3QsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0Vycm9yfSwNCisgICAgezB4NWMwNTQ3NTUsIEwic3RhcnRBbmdsZSIsIFhGQV9BVFRSSUJVVEVfU3RhcnRBbmdsZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgNSl9LA0KKyAgICB7MHg1ZWM5NThjMCwgTCJjdXJzb3JUeXBlIiwgWEZBX0FUVFJJQlVURV9DdXJzb3JUeXBlLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fRm9yd2FyZE9ubHl9LA0KKyAgICB7MHg1Zjc2MGI1MCwgTCJkaWdpdGFsU2lnbmF0dXJlIiwgWEZBX0FUVFJJQlVURV9EaWdpdGFsU2lnbmF0dXJlLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweDYwYTYxZWRkLCBMImNvZGVUeXBlIiwgWEZBX0FUVFJJQlVURV9Db2RlVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweDYwZDRjOGIxLCBMIm91dHB1dCIsIFhGQV9BVFRSSUJVVEVfT3V0cHV0LCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHg2NDExMGFiNSwgTCJib29rZW5kVHJhaWxlciIsIFhGQV9BVFRSSUJVVEVfQm9va2VuZFRyYWlsZXIsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4NjVlMzBjNjcsIEwiaW1hZ2luZ0JCb3giLCBYRkFfQVRUUklCVVRFX0ltYWdpbmdCQm94LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTCJub25lIn0sDQorICAgIHsweDY2NTM5YzQ4LCBMImV4Y2x1ZGVJbml0aWFsQ2FwIiwgWEZBX0FUVFJJQlVURV9FeGNsdWRlSW5pdGlhbENhcCwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopMH0sDQorICAgIHsweDY2NjQyZjhmLCBMImZvcmNlIiwgWEZBX0FUVFJJQlVURV9Gb3JjZSwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCAodm9pZCopTlVMTH0sDQorICAgIHsweDY5YWEyMjkyLCBMImNybFNpZ24iLCBYRkFfQVRUUklCVVRFX0NybFNpZ24sIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHg2YTM0MDVkZCwgTCJwcmV2aW91cyIsIFhGQV9BVFRSSUJVVEVfUHJldmlvdXMsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX05vbmV9LA0KKyAgICB7MHg2YTk1Yzk3NiwgTCJwdXNoQ2hhcmFjdGVyQ291bnQiLCBYRkFfQVRUUklCVVRFX1B1c2hDaGFyYWN0ZXJDb3VudCwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopM30sDQorICAgIHsweDZiNmRkY2ZiLCBMIm51bGxUZXN0IiwgWEZBX0FUVFJJQlVURV9OdWxsVGVzdCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fRGlzYWJsZWR9LA0KKyAgICB7MHg2Y2ZhODI4YSwgTCJydW5BdCIsIFhGQV9BVFRSSUJVVEVfUnVuQXQsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0NsaWVudH0sDQorICAgIHsweDczMWUwNjY1LCBMInNwYWNlQmVsb3ciLCBYRkFfQVRUUklCVVRFX1NwYWNlQmVsb3csDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwNCisgICAgezB4NzQ3ODhmOGIsIEwic3dlZXBBbmdsZSIsIFhGQV9BVFRSSUJVVEVfU3dlZXBBbmdsZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgNyl9LA0KKyAgICB7MHg3OGJmZjUzMSwgTCJudW1iZXJPZkNlbGxzIiwgWEZBX0FUVFJJQlVURV9OdW1iZXJPZkNlbGxzLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikwfSwNCisgICAgezB4Nzk1NDMwNTUsIEwibGV0dGVyU3BhY2luZyIsIFhGQV9BVFRSSUJVVEVfTGV0dGVyU3BhY2luZywNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHg3OTk3NWYyYiwgTCJsb2NrVHlwZSIsIFhGQV9BVFRSSUJVVEVfTG9ja1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1JlYWRPbmx5fSwNCisgICAgezB4N2EwY2M0NzEsIEwicGFzc3dvcmRDaGFyIiwgWEZBX0FUVFJJQlVURV9QYXNzd29yZENoYXIsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilMIioifSwNCisgICAgezB4N2E3Y2MzNDEsIEwidkFsaWduIiwgWEZBX0FUVFJJQlVURV9WQWxpZ24sIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fVG9wfSwNCisgICAgezB4N2IyOTYzMGEsIEwic291cmNlQmVsb3ciLCBYRkFfQVRUUklCVVRFX1NvdXJjZUJlbG93LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fVXBkYXRlfSwNCisgICAgezB4N2I5NWU2NjEsIEwiaW52ZXJ0ZWQiLCBYRkFfQVRUUklCVVRFX0ludmVydGVkLCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTB9LA0KKyAgICB7MHg3YzJmZDgwYiwgTCJtYXJrIiwgWEZBX0FUVFJJQlVURV9NYXJrLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9EZWZhdWx0fSwNCisgICAgezB4N2MyZmY2YWUsIEwibWF4SCIsIFhGQV9BVFRSSUJVVEVfTWF4SCwgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KKyAgICB7MHg3YzJmZjZiZCwgTCJtYXhXIiwgWEZBX0FUVFJJQlVURV9NYXhXLCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQorICAgIHsweDdjNzMyYTY2LCBMInRydW5jYXRlIiwgWEZBX0FUVFJJQlVURV9UcnVuY2F0ZSwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikwfSwNCisgICAgezB4N2QwMjM1NmMsIEwibWluSCIsIFhGQV9BVFRSSUJVVEVfTWluSCwgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KKyAgICB7MHg3ZDAyMzU3YiwgTCJtaW5XIiwgWEZBX0FUVFJJQlVURV9NaW5XLCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQorICAgIHsweDdkMGI1ZmNhLCBMImluaXRpYWwiLCBYRkFfQVRUUklCVVRFX0luaXRpYWwsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMX0sDQorICAgIHsweDdkOWZkN2M1LCBMIm1vZGUiLCBYRkFfQVRUUklCVVRFX01vZGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1VzZVByaW50ZXJTZXR0aW5nfSwNCisgICAgezB4N2U3ZTg0NWUsIEwibGF5b3V0IiwgWEZBX0FUVFJJQlVURV9MYXlvdXQsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1Bvc2l0aW9ufSwNCisgICAgezB4N2Y2ZmQzZDcsIEwic2VydmVyIiwgWEZBX0FUVFJJQlVURV9TZXJ2ZXIsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHg4MjRmMjFiNywgTCJlbWJlZFBERiIsIFhGQV9BVFRSSUJVVEVfRW1iZWRQREYsIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMH0sDQorICAgIHsweDgzNDBlYTY2LCBMIm9kZE9yRXZlbiIsIFhGQV9BVFRSSUJVVEVfT2RkT3JFdmVuLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0FueX0sDQorICAgIHsweDgzNmQ0ZDdjLCBMInRhYkRlZmF1bHQiLCBYRkFfQVRUUklCVVRFX1RhYkRlZmF1bHQsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4ODg1NTgwNWYsIEwiY29udGFpbnMiLCBYRkFfQVRUUklCVVRFX0NvbnRhaW5zLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0RhdGF9LA0KKyAgICB7MHg4YTY5MjUyMSwgTCJyaWdodEluc2V0IiwgWEZBX0FUVFJJQlVURV9SaWdodEluc2V0LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQorICAgIHsweDhhZjJlNjU3LCBMIm1heENoYXJzIiwgWEZBX0FUVFJJQlVURV9NYXhDaGFycywgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikwfSwNCisgICAgezB4OGI5MGUxZjIsIEwib3BlbiIsIFhGQV9BVFRSSUJVVEVfT3BlbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fVXNlckNvbnRyb2x9LA0KKyAgICB7MHg4Yzk5Mzc3ZSwgTCJyZWxhdGlvbiIsIFhGQV9BVFRSSUJVVEVfUmVsYXRpb24sIFhGQV9BVFRSSUJVVEVUWVBFX05PVFNVUkUsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweDhkMTgxZDYxLCBMIndpZGVOYXJyb3dSYXRpbyIsIFhGQV9BVFRSSUJVVEVfV2lkZU5hcnJvd1JhdGlvLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTCIzOjEifSwNCisgICAgezB4OGUxYzI5MjEsIEwicmVsZXZhbnQiLCBYRkFfQVRUUklCVVRFX1JlbGV2YW50LCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCisgICAgezB4OGUyOWQ3OTQsIEwic2lnbmF0dXJlVHlwZSIsIFhGQV9BVFRSSUJVVEVfU2lnbmF0dXJlVHlwZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fRmlsdGVyfSwNCisgICAgezB4OGVjNjIwNGMsIEwibGluZVRocm91Z2hQZXJpb2QiLCBYRkFfQVRUUklCVVRFX0xpbmVUaHJvdWdoUGVyaW9kLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9BbGx9LA0KKyAgICB7MHg4ZWQxODJkMSwgTCJzaGFwZSIsIFhGQV9BVFRSSUJVVEVfU2hhcGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1NxdWFyZX0sDQorICAgIHsweDhmYTAxNzkwLCBMInRhYlN0b3BzIiwgWEZBX0FUVFJJQlVURV9UYWJTdG9wcywgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweDhmYzM2YzBhLCBMIm91dHB1dEJlbG93IiwgWEZBX0FUVFJJQlVURV9PdXRwdXRCZWxvdywNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1dhcm59LA0KKyAgICB7MHg5MDQxZDRiMCwgTCJzaG9ydCIsIFhGQV9BVFRSSUJVVEVfU2hvcnQsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwNCisgICAgezB4OTA3Yzc3MTksIEwiZm9udFZlcnRpY2FsU2NhbGUiLCBYRkFfQVRUUklCVVRFX0ZvbnRWZXJ0aWNhbFNjYWxlLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTCIxMDAlIn0sDQorICAgIHsweDk0NDQ2ZGNjLCBMInRoaWNrbmVzcyIsIFhGQV9BVFRSSUJVVEVfVGhpY2tuZXNzLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyA4KX0sDQorICAgIHsweDk1N2ZhMDA2LCBMImNvbW1pdE9uIiwgWEZBX0FUVFJJQlVURV9Db21taXRPbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fU2VsZWN0fSwNCisgICAgezB4OTgyYmQ4OTIsIEwicmVtYWluQ2hhcmFjdGVyQ291bnQiLCBYRkFfQVRUUklCVVRFX1JlbWFpbkNoYXJhY3RlckNvdW50LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikzfSwNCisgICAgezB4OThmZDRkODEsIEwia2V5QWdyZWVtZW50IiwgWEZBX0FUVFJJQlVURV9LZXlBZ3JlZW1lbnQsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4OTk4MDBkN2EsIEwiZXJyb3JDb3JyZWN0aW9uTGV2ZWwiLCBYRkFfQVRUUklCVVRFX0Vycm9yQ29ycmVjdGlvbkxldmVsLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweDlhNjNkYTNkLCBMInVwc01vZGUiLCBYRkFfQVRUUklCVVRFX1Vwc01vZGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1VzQ2Fycmllcn0sDQorICAgIHsweDljYzE3ZDc1LCBMIm1lcmdlTW9kZSIsIFhGQV9BVFRSSUJVVEVfTWVyZ2VNb2RlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Db25zdW1lRGF0YX0sDQorICAgIHsweDlkODMzZDc1LCBMImNpcmN1bGFyIiwgWEZBX0FUVFJJQlVURV9DaXJjdWxhciwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikwfSwNCisgICAgezB4OWQ4ZWUyMDQsIEwicHNOYW1lIiwgWEZBX0FUVFJJQlVURV9Qc05hbWUsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsICh2b2lkKilOVUxMfSwNCisgICAgezB4OWRjYzNhYjMsIEwidHJhaWxlciIsIFhGQV9BVFRSSUJVVEVfVHJhaWxlciwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweGEwOTMzOTU0LCBMInVuaWNvZGVSYW5nZSIsIFhGQV9BVFRSSUJVVEVfVW5pY29kZVJhbmdlLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCAodm9pZCopTlVMTH0sDQorICAgIHsweGExYjBkMmY1LCBMImV4ZWN1dGVUeXBlIiwgWEZBX0FUVFJJQlVURV9FeGVjdXRlVHlwZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fSW1wb3J0fSwNCisgICAgezB4YTI1YTg4M2QsIEwiZHVwbGV4SW1wb3NpdGlvbiIsIFhGQV9BVFRSSUJVVEVfRHVwbGV4SW1wb3NpdGlvbiwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTG9uZ0VkZ2V9LA0KKyAgICB7MHhhNDJjYTFiNywgTCJ0cmF5SW4iLCBYRkFfQVRUUklCVVRFX1RyYXlJbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQXV0b30sDQorICAgIHsweGE0MzNmMDAxLCBMImJpbmRpbmdOb2RlIiwgWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVU5LTk9XTiwgKHZvaWQqKTB9LA0KKyAgICB7MHhhNTM0MGZmNSwgTCJib2ZBY3Rpb24iLCBYRkFfQVRUUklCVVRFX0JvZkFjdGlvbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTW92ZUZpcnN0fSwNCisgICAgezB4YTViNDEwY2YsIEwic2F2ZSIsIFhGQV9BVFRSSUJVVEVfU2F2ZSwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikwfSwNCisgICAgezB4YTYxMThjODksIEwidGFyZ2V0VHlwZSIsIFhGQV9BVFRSSUJVVEVfVGFyZ2V0VHlwZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQXV0b30sDQorICAgIHsweGE2NjQwNGNiLCBMImtleUVuY2lwaGVybWVudCIsIFhGQV9BVFRSSUJVVEVfS2V5RW5jaXBoZXJtZW50LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweGE2NzEwMjYyLCBMImNyZWRlbnRpYWxTZXJ2ZXJQb2xpY3kiLA0KKyAgICAgWEZBX0FUVFJJQlVURV9DcmVkZW50aWFsU2VydmVyUG9saWN5LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sDQorICAgIHsweGE2ODY5NzViLCBMInNpemUiLCBYRkFfQVRUUklCVVRFX1NpemUsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDYpfSwNCisgICAgezB4YTg1ZTc0ZjMsIEwiaW5pdGlhbE51bWJlciIsIFhGQV9BVFRSSUJVVEVfSW5pdGlhbE51bWJlciwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopMX0sDQorICAgIHsweGFiZWYzN2UzLCBMInNsb3BlIiwgWEZBX0FUVFJJQlVURV9TbG9wZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQmFja3NsYXNofSwNCisgICAgezB4YWJmYTZjNGYsIEwiY1NwYWNlIiwgWEZBX0FUVFJJQlVURV9DU3BhY2UsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKUwiU1JHQiJ9LA0KKyAgICB7MHhhYzA2ZTJiMCwgTCJjb2xTcGFuIiwgWEZBX0FUVFJJQlVURV9Db2xTcGFuLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTF9LA0KKyAgICB7MHhhZGM0Yzc3YiwgTCJiaW5kaW5nIiwgWEZBX0FUVFJJQlVURV9CaW5kaW5nLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCisgICAgezB4YWY3NTQ2MTMsIEwiY2hlY2tzdW0iLCBYRkFfQVRUUklCVVRFX0NoZWNrc3VtLCBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4YjA0NWZiYzUsIEwiY2hhckVuY29kaW5nIiwgWEZBX0FUVFJJQlVURV9DaGFyRW5jb2RpbmcsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilMIlVURi04In0sDQorICAgIHsweGIwZTU0ODVkLCBMImJpbmQiLCBYRkFfQVRUUklCVVRFX0JpbmQsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsICh2b2lkKilOVUxMfSwNCisgICAgezB4YjEyMTI4YjcsIEwidGV4dEVudHJ5IiwgWEZBX0FUVFJJQlVURV9UZXh0RW50cnksDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKTB9LA0KKyAgICB7MHhiMzczYTg2MiwgTCJhcmNoaXZlIiwgWEZBX0FUVFJJQlVURV9BcmNoaXZlLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCisgICAgezB4YjU5OGExZjcsIEwidXVpZCIsIFhGQV9BVFRSSUJVVEVfVXVpZCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1hEUCwgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHhiNWU0OWJmMiwgTCJwb3N0dXJlIiwgWEZBX0FUVFJJQlVURV9Qb3N0dXJlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX05vcm1hbH0sDQorICAgIHsweGI2YjQ0MTcyLCBMImFmdGVyIiwgWEZBX0FUVFJJQlVURV9BZnRlciwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQXV0b30sDQorICAgIHsweGI3MTY0NjdiLCBMIm9ycGhhbnMiLCBYRkFfQVRUUklCVVRFX09ycGhhbnMsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMH0sDQorICAgIHsweGJjMGM0Njk1LCBMInF1YWxpZmllZE5hbWUiLCBYRkFfQVRUUklCVVRFX1F1YWxpZmllZE5hbWUsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9VTktOT1dOLCAodm9pZCopTlVMTH0sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwNCisgICAgICAgICBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweGJjOGZhMzUwLCBMImxvY2FsZSIsIFhGQV9BVFRSSUJVVEVfTG9jYWxlLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCisgICAgezB4YmQ2ZTFkODgsIEwid2VpZ2h0IiwgWEZBX0FUVFJJQlVURV9XZWlnaHQsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTm9ybWFsfSwNCisgICAgezB4YmQ5NmEwZTksIEwidW5kZXJsaW5lUGVyaW9kIiwgWEZBX0FUVFJJQlVURV9VbmRlcmxpbmVQZXJpb2QsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0FsbH0sDQorICAgIHsweGJkZTlhYmRhLCBMImRhdGEiLCBYRkFfQVRUUklCVVRFX0RhdGEsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0xpbmt9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsICh2b2lkKilOVUxMfSwNCisgICAgezB4YmU5YmE0NzIsIEwibnVtYmVyZWQiLCBYRkFfQVRUUklCVVRFX051bWJlcmVkLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTF9LA0KKyAgICB7MHhjMDM1YzZiMSwgTCJkYXRhQ29sdW1uQ291bnQiLCBYRkFfQVRUUklCVVRFX0RhdGFDb2x1bW5Db3VudCwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHhjMGVjOWZhNCwgTCJvdmVybGluZSIsIFhGQV9BVFRSSUJVVEVfT3ZlcmxpbmUsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMH0sDQorICAgIHsweGMyYmEwOTIzLCBMInVybFBvbGljeSIsIFhGQV9BVFRSSUJVVEVfVXJsUG9saWN5LCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCisgICAgezB4YzJiZDQwZmQsIEwiYW5jaG9yVHlwZSIsIFhGQV9BVFRSSUJVVEVfQW5jaG9yVHlwZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fVG9wTGVmdH0sDQorICAgIHsweGMzOWE4OGJkLCBMImxhYmVsUmVmIiwgWEZBX0FUVFJJQlVURV9MYWJlbFJlZiwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweGMzYzE0NDJmLCBMImJvb2tlbmRMZWFkZXIiLCBYRkFfQVRUUklCVVRFX0Jvb2tlbmRMZWFkZXIsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4YzQ1NDdhMDgsIEwibWF4TGVuZ3RoIiwgWEZBX0FUVFJJQlVURV9NYXhMZW5ndGgsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKSAtIDF9LA0KKyAgICB7MHhjNGZlZDA5YiwgTCJhY2Nlc3NLZXkiLCBYRkFfQVRUUklCVVRFX0FjY2Vzc0tleSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweGM1NzYyMTU3LCBMImN1cnNvckxvY2F0aW9uIiwgWEZBX0FUVFJJQlVURV9DdXJzb3JMb2NhdGlvbiwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0NsaWVudH0sDQorICAgIHsweGM4NjBmMzBhLCBMImRlbGF5ZWRPcGVuIiwgWEZBX0FUVFJJQlVURV9EZWxheWVkT3BlbiwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHhjOGRhNGRhNywgTCJ0YXJnZXQiLCBYRkFfQVRUUklCVVRFX1RhcmdldCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweGNhNWRjMjdjLCBMImRhdGFFbmNpcGhlcm1lbnQiLCBYRkFfQVRUUklCVVRFX0RhdGFFbmNpcGhlcm1lbnQsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4Y2IxNTA0NzksIEwiYWZ0ZXJUYXJnZXQiLCBYRkFfQVRUUklCVVRFX0FmdGVyVGFyZ2V0LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweGNiY2FmNjZkLCBMImxlYWRlciIsIFhGQV9BVFRSSUJVVEVfTGVhZGVyLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCisgICAgezB4Y2NhNzg5N2UsIEwicGlja2VyIiwgWEZBX0FUVFJJQlVURV9QaWNrZXIsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0hvc3R9LA0KKyAgICB7MHhjZDdmN2I1NCwgTCJmcm9tIiwgWEZBX0FUVFJJQlVURV9Gcm9tLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9Db25maWcsICh2b2lkKilOVUxMfSwNCisgICAgezB4Y2VhNWU2MmMsIEwiYmFzZVByb2ZpbGUiLCBYRkFfQVRUUklCVVRFX0Jhc2VQcm9maWxlLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9GdWxsfSwNCisgICAgezB4ZDE3MWIyNDAsIEwiYXNwZWN0IiwgWEZBX0FUVFJJQlVURV9Bc3BlY3QsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fRml0fSwNCisgICAgezB4ZDNjODRkMjUsIEwicm93Q29sdW1uUmF0aW8iLCBYRkFfQVRUUklCVVRFX1Jvd0NvbHVtblJhdGlvLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweGQ0YjAxOTIxLCBMImxpbmVIZWlnaHQiLCBYRkFfQVRUUklCVVRFX0xpbmVIZWlnaHQsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDEpfSwNCisgICAgezB4ZDRjYzUzZjgsIEwiaGlnaGxpZ2h0IiwgWEZBX0FUVFJJQlVURV9IaWdobGlnaHQsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0ludmVydGVkfSwNCisgICAgezB4ZDUwZjkwM2EsIEwidmFsdWVSZWYiLCBYRkFfQVRUUklCVVRFX1ZhbHVlUmVmLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCisgICAgezB4ZDUyNDgyZTAsIEwibWF4RW50cmllcyIsIFhGQV9BVFRSSUJVVEVfTWF4RW50cmllcywNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCAodm9pZCopNX0sDQorICAgIHsweGQ1N2M1MTNjLCBMImRhdGFMZW5ndGgiLCBYRkFfQVRUUklCVVRFX0RhdGFMZW5ndGgsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4ZDYxMjhkOGQsIEwiYWN0aXZpdHkiLCBYRkFfQVRUUklCVVRFX0FjdGl2aXR5LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9DbGlja30sDQorICAgIHsweGQ2YTM5OTkwLCBMImlucHV0IiwgWEZBX0FUVFJJQlVURV9JbnB1dCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsICh2b2lkKilOVUxMfSwNCisgICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLCBYRkFfQVRUUklCVVRFX1ZhbHVlLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCB8DQorICAgICAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMgfA0KKyAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4ZDcwNzk4YzIsIEwiYmxhbmtPck5vdEJsYW5rIiwgWEZBX0FUVFJJQlVURV9CbGFua09yTm90QmxhbmssDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0FueX0sDQorICAgIHsweGQ4NjFmOGFmLCBMImFkZFJldm9jYXRpb25JbmZvIiwgWEZBX0FUVFJJQlVURV9BZGRSZXZvY2F0aW9uSW5mbywNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHhkOGY5ODJiZiwgTCJnZW5lcmljRmFtaWx5IiwgWEZBX0FUVFJJQlVURV9HZW5lcmljRmFtaWx5LA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fU2VyaWZ9LA0KKyAgICB7MHhkOTk2ZmE5YiwgTCJoYW5kIiwgWEZBX0FUVFJJQlVURV9IYW5kLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9FdmVufSwNCisgICAgezB4ZGI1NWZlYzUsIEwiaHJlZiIsIFhGQV9BVFRSSUJVVEVfSHJlZiwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweGRjNzU2NzZjLCBMInRleHRFbmNvZGluZyIsIFhGQV9BVFRSSUJVVEVfVGV4dEVuY29kaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHsweGRlN2Y5MmJhLCBMImxlYWREaWdpdHMiLCBYRkFfQVRUUklCVVRFX0xlYWREaWdpdHMsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKSAtIDF9LA0KKyAgICB7MHhlMTFhMmNiYywgTCJwZXJtaXNzaW9ucyIsIFhGQV9BVFRSSUJVVEVfUGVybWlzc2lvbnMsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKTJ9LA0KKyAgICB7MHhlMThiNTY1OSwgTCJzcGFjZUFib3ZlIiwgWEZBX0FUVFJJQlVURV9TcGFjZUFib3ZlLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sDQorICAgIHsweGUxYTI2YjU2LCBMImNvZGVCYXNlIiwgWEZBX0FUVFJJQlVURV9Db2RlQmFzZSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweGUzNDlkMDQ0LCBMInN0b2NrIiwgWEZBX0FUVFJJQlVURV9TdG9jaywgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweGUzNzJhZTk3LCBMImlzTnVsbCIsIFhGQV9BVFRSSUJVVEVfSXNOdWxsLCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgKHZvaWQqKTB9LA0KKyAgICB7MHhlNGMzYTVlNSwgTCJyZXN0b3JlU3RhdGUiLCBYRkFfQVRUUklCVVRFX1Jlc3RvcmVTdGF0ZSwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTWFudWFsfSwNCisgICAgezB4ZTVjOTZkNmEsIEwiZXhjbHVkZUFsbENhcHMiLCBYRkFfQVRUUklCVVRFX0V4Y2x1ZGVBbGxDYXBzLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKikwfSwNCisgICAgezB4ZTY0YjExMjksIEwiZm9ybWF0VGVzdCIsIFhGQV9BVFRSSUJVVEVfRm9ybWF0VGVzdCwNCisgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fV2FybmluZ30sDQorICAgIHsweGU2Zjk5NDg3LCBMImhTY3JvbGxQb2xpY3kiLCBYRkFfQVRUUklCVVRFX0hTY3JvbGxQb2xpY3ksDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0F1dG99LA0KKyAgICB7MHhlOGRkZGY1MCwgTCJqb2luIiwgWEZBX0FUVFJJQlVURV9Kb2luLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9TcXVhcmV9LA0KKyAgICB7MHhlOGYxMThhOCwgTCJrZXlDZXJ0U2lnbiIsIFhGQV9BVFRSSUJVVEVfS2V5Q2VydFNpZ24sDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4ZTk0OGI5YTgsIEwicmFkaXVzIiwgWEZBX0FUVFJJQlVURV9SYWRpdXMsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwNCisgICAgezB4ZTk5NmIyZmUsIEwic291cmNlQWJvdmUiLCBYRkFfQVRUUklCVVRFX1NvdXJjZUFib3ZlLA0KKyAgICAgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fV2Fybn0sDQorICAgIHsweGVhNzA5MGEwLCBMIm92ZXJyaWRlIiwgWEZBX0FUVFJJQlVURV9PdmVycmlkZSwgWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilOVUxMfSwNCisgICAgezB4ZWIwOTEwMDMsIEwiY2xhc3NJZCIsIFhGQV9BVFRSSUJVVEVfQ2xhc3NJZCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopTlVMTH0sDQorICAgIHsweGViNTExYjU0LCBMImRpc2FibGUiLCBYRkFfQVRUUklCVVRFX0Rpc2FibGUsIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMH0sDQorICAgIHsweGVkYTkwMTdhLCBMInNjb3BlIiwgWEZBX0FUVFJJQlVURV9TY29wZSwgWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4ZjE5Nzg0NGQsIEwibWF0Y2giLCBYRkFfQVRUUklCVVRFX01hdGNoLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PbmNlfSwNCisgICAgezB4ZjIwMDkzMzksIEwicGxhY2VtZW50IiwgWEZBX0FUVFJJQlVURV9QbGFjZW1lbnQsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0xlZnR9LA0KKyAgICB7MHhmNGZmY2U3MywgTCJiZWZvcmUiLCBYRkFfQVRUUklCVVRFX0JlZm9yZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQXV0b30sDQorICAgIHsweGY1MzFiMDU5LCBMIndyaXRpbmdTY3JpcHQiLCBYRkFfQVRUUklCVVRFX1dyaXRpbmdTY3JpcHQsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Bc3Rlcmlza30sDQorICAgIHsweGY1NzVjYTc1LCBMImVuZENoYXIiLCBYRkFfQVRUUklCVVRFX0VuZENoYXIsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKU5VTEx9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsICh2b2lkKikwfSwNCisgICAgezB4ZjZiNGFmYjAsIEwibG9uZyIsIFhGQV9BVFRSSUJVVEVfTG9uZywgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LA0KKyAgICB7MHhmNmI1OTU0MywgTCJpbnRhY3QiLCBYRkFfQVRUUklCVVRFX0ludGFjdCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTm9uZX0sDQorICAgIHsweGY4ODllNzQ3LCBMInhkcENvbnRlbnQiLCBYRkFfQVRUUklCVVRFX1hkcENvbnRlbnQsDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAgezB4ZmVhNTNlYzYsIEwiZGVjaXBoZXJPbmx5IiwgWEZBX0FUVFJJQlVURV9EZWNpcGhlck9ubHksDQorICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgICh2b2lkKilOVUxMfSwNCit9Ow0KK2V4dGVybiBjb25zdCBpbnQzMl90IGdfaVhGQUF0dHJpYnV0ZUNvdW50ID0NCisgICAgc2l6ZW9mKGdfWEZBQXR0cmlidXRlRGF0YSkgLyBzaXplb2YoWEZBX0FUVFJJQlVURUlORk8pOw0KK2V4dGVybiBjb25zdCBYRkFfTk9UU1VSRUFUVFJJQlVURSBnX1hGQU5vdHN1cmVBdHRyaWJ1dGVzW10gPSB7DQorICAgIHtYRkFfRUxFTUVOVF9TdWJmb3JtU2V0LCBYRkFfQVRUUklCVVRFX1JlbGF0aW9uLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX09yZGVyZWR9LA0KKyAgICB7WEZBX0VMRU1FTlRfTnVtYmVyUGF0dGVybiwgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX051bWVyaWN9LA0KKyAgICB7WEZBX0VMRU1FTlRfS2V5VXNhZ2UsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sDQorICAgIHtYRkFfRUxFTUVOVF9MYWJlbFByaW50ZXIsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9acGx9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ2FsZW5kYXJTeW1ib2xzLCBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fR3JlZ29yaWFufSwNCisgICAge1hGQV9FTEVNRU5UX0JhcmNvZGUsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHtYRkFfRUxFTUVOVF9CYXJjb2RlLCBYRkFfQVRUUklCVVRFX0NoZWNrc3VtLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX05vbmV9LA0KKyAgICB7WEZBX0VMRU1FTlRfVGltZVBhdHRlcm4sIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9NZWR9LA0KKyAgICB7WEZBX0VMRU1FTlRfQmF0Y2hPdXRwdXQsIFhGQV9BVFRSSUJVVEVfRm9ybWF0LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX05vbmV9LA0KKyAgICB7WEZBX0VMRU1FTlRfU3ViamVjdEROcywgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwNCisgICAge1hGQV9FTEVNRU5UX0lzc3VlcnMsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sDQorICAgIHtYRkFfRUxFTUVOVF9FbmNyeXB0aW9uTWV0aG9kcywgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwNCisgICAge1hGQV9FTEVNRU5UX1BhdHRlcm4sIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Dcm9zc0hhdGNofSwNCisgICAge1hGQV9FTEVNRU5UX0NvbXByZXNzLCBYRkFfQVRUUklCVVRFX1Njb3BlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0ltYWdlT25seX0sDQorICAgIHtYRkFfRUxFTUVOVF9JbWFnZSwgWEZBX0FUVFJJQlVURV9UcmFuc2ZlckVuY29kaW5nLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0Jhc2U2NH0sDQorICAgIHtYRkFfRUxFTUVOVF9UaW1lU3RhbXAsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sDQorICAgIHtYRkFfRUxFTUVOVF9TdWJmb3JtLCBYRkFfQVRUUklCVVRFX1Njb3BlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX05hbWV9LA0KKyAgICB7WEZBX0VMRU1FTlRfSGFuZGxlciwgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwNCisgICAge1hGQV9FTEVNRU5UX1JlY29yZCwgWEZBX0FUVFJJQlVURV9NYXgsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsDQorICAgICAodm9pZCopMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Db21tYW5kLCBYRkFfQVRUUklCVVRFX1RpbWVvdXQsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsDQorICAgICAodm9pZCopMzB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRGlnZXN0TWV0aG9kcywgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwNCisgICAge1hGQV9FTEVNRU5UX1BhZ2VTZXQsIFhGQV9BVFRSSUJVVEVfUmVsYXRpb24sIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fT3JkZXJlZE9jY3VycmVuY2V9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXF1YXRlLCBYRkFfQVRUUklCVVRFX0Zyb20sIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLA0KKyAgICAgKHZvaWQqKU5VTEx9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXF1YXRlLCBYRkFfQVRUUklCVVRFX1RvLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAge1hGQV9FTEVNRU5UX1RyYXZlcnNlLCBYRkFfQVRUUklCVVRFX09wZXJhdGlvbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9OZXh0fSwNCisgICAge1hGQV9FTEVNRU5UX0VuY29kaW5ncywgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwNCisgICAge1hGQV9FTEVNRU5UX1NpZ25pbmcsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sDQorICAgIHtYRkFfRUxFTUVOVF9PaWRzLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWx9LA0KKyAgICB7WEZBX0VMRU1FTlRfU2lnbmF0dXJlLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fUERGMV8zfSwNCisgICAge1hGQV9FTEVNRU5UX0V4RGF0YSwgWEZBX0FUVFJJQlVURV9UcmFuc2ZlckVuY29kaW5nLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX05vbmV9LA0KKyAgICB7WEZBX0VMRU1FTlRfTGluZWFyLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fVG9SaWdodH0sDQorICAgIHtYRkFfRUxFTUVOVF9DdXJyZW5jeVN5bWJvbCwgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1N5bWJvbH0sDQorICAgIHtYRkFfRUxFTUVOVF9FcXVhdGVSYW5nZSwgWEZBX0FUVFJJQlVURV9Gcm9tLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAge1hGQV9FTEVNRU5UX0VxdWF0ZVJhbmdlLCBYRkFfQVRUUklCVVRFX1RvLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwNCisgICAgICh2b2lkKilOVUxMfSwNCisgICAge1hGQV9FTEVNRU5UX1NpZ25EYXRhLCBYRkFfQVRUUklCVVRFX09wZXJhdGlvbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9TaWdufSwNCisgICAge1hGQV9FTEVNRU5UX0RhdGVQYXR0ZXJuLCBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTWVkfSwNCisgICAge1hGQV9FTEVNRU5UX0JpbmQsIFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Ob25lfSwNCisgICAge1hGQV9FTEVNRU5UX1JlYXNvbnMsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sDQorICAgIHtYRkFfRUxFTUVOVF9BcHBlYXJhbmNlRmlsdGVyLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWx9LA0KKyAgICB7WEZBX0VMRU1FTlRfRm9ybSwgWEZBX0FUVFJJQlVURV9DaGVja3N1bSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsDQorICAgICAodm9pZCopTlVMTH0sDQorICAgIHtYRkFfRUxFTUVOVF9WYWx1ZSwgWEZBX0FUVFJJQlVURV9PdmVycmlkZSwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwNCisgICAgICh2b2lkKikwfSwNCisgICAge1hGQV9FTEVNRU5UX0NhbGN1bGF0ZSwgWEZBX0FUVFJJQlVURV9PdmVycmlkZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9FcnJvcn0sDQorICAgIHtYRkFfRUxFTUVOVF9Db25uZWN0LCBYRkFfQVRUUklCVVRFX1RpbWVvdXQsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsDQorICAgICAodm9pZCopMTV9LA0KKyAgICB7WEZBX0VMRU1FTlRfU3VibWl0LCBYRkFfQVRUUklCVVRFX0Zvcm1hdCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwNCisgICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9YZHB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUmFkaWFsLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fVG9FZGdlfSwNCisgICAge1hGQV9FTEVNRU5UX0xvY2tEb2N1bWVudCwgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLA0KKyAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwNCisgICAge1hGQV9FTEVNRU5UX09jY3VyLCBYRkFfQVRUUklCVVRFX01heCwgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgKHZvaWQqKTF9LA0KKyAgICB7WEZBX0VMRU1FTlRfTnVtYmVyU3ltYm9sLCBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sDQorICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fRGVjaW1hbH0sDQorfTsNCitleHRlcm4gY29uc3QgaW50MzJfdCBnX2lYRkFOb3RzdXJlQ291bnQgPQ0KKyAgICBzaXplb2YoZ19YRkFOb3RzdXJlQXR0cmlidXRlcykgLyBzaXplb2YoWEZBX05PVFNVUkVBVFRSSUJVVEUpOw0KK2V4dGVybiBjb25zdCBYRkFfRUxFTUVOVElORk8gZ19YRkFFbGVtZW50RGF0YVtdID0gew0KKyAgICB7MHgyM2VlMywgTCJwcyIsIFhGQV9FTEVNRU5UX1BzLCBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDI1MzYzLCBMInRvIiwgWEZBX0VMRU1FTlRfVG8sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHgyNTg3ZSwgTCJ1aSIsIFhGQV9FTEVNRU5UX1VpLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDFjNjQ4YiwgTCJyZWNvcmRTZXQiLCBYRkFfRUxFTUVOVF9SZWNvcmRTZXQsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDE3MTQyOGYsIEwic3Vic2V0QmVsb3ciLCBYRkFfRUxFTUVOVF9TdWJzZXRCZWxvdywgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDFhMDc3NmEsIEwic3ViZm9ybVNldCIsIFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlfSwNCisgICAgezB4MjM0MGQ3MCwgTCJhZG9iZUV4dGVuc2lvbkxldmVsIiwgWEZBX0VMRU1FTlRfQWRvYmVFeHRlbnNpb25MZXZlbCwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDJjMWM3ZjEsIEwidHlwZWZhY2UiLCBYRkFfRUxFTUVOVF9UeXBlZmFjZSwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NTUxOGMyNSwgTCJicmVhayIsIFhGQV9FTEVNRU5UX0JyZWFrLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDVmZmY1MjMsIEwiZm9udEluZm8iLCBYRkFfRUxFTUVOVF9Gb250SW5mbywgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NjUzYTIyNywgTCJudW1iZXJQYXR0ZXJuIiwgWEZBX0VMRU1FTlRfTnVtYmVyUGF0dGVybiwNCisgICAgIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDY1YjRhMDUsIEwiZHluYW1pY1JlbmRlciIsIFhGQV9FTEVNRU5UX0R5bmFtaWNSZW5kZXIsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg3ZTQzNjJlLCBMInByaW50U2NhbGluZyIsIFhGQV9FTEVNRU5UX1ByaW50U2NhbGluZywgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDdmZTZkM2EsIEwiY2hlY2tCdXR0b24iLCBYRkFfRUxFTUVOVF9DaGVja0J1dHRvbiwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg4MGNmNThmLCBMImRhdGVQYXR0ZXJucyIsIFhGQV9FTEVNRU5UX0RhdGVQYXR0ZXJucywNCisgICAgIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ODExOTI5ZCwgTCJzb3VyY2VTZXQiLCBYRkFfRUxFTUVOVF9Tb3VyY2VTZXQsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTW9kZWxOb2RlfSwNCisgICAgezB4OWY5ZDYxMiwgTCJhbWQiLCBYRkFfRUxFTUVOVF9BbWQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg5ZjllZmI2LCBMImFyYyIsIFhGQV9FTEVNRU5UX0FyYywNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhhNDg4MzVlLCBMImRheSIsIFhGQV9FTEVNRU5UX0RheSwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGE2MzI4YjgsIEwiZXJhIiwgWEZBX0VMRU1FTlRfRXJhLCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4YWU2YTBhMCwgTCJqb2ciLCBYRkFfRUxFTUVOVF9Kb2csIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhiMWIzZDIyLCBMImxvZyIsIFhGQV9FTEVNRU5UX0xvZywgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YjM1NDM5ZSwgTCJtYXAiLCBYRkFfRUxFTUVOVF9NYXAsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YjM1NTMwMSwgTCJtZHAiLCBYRkFfRUxFTUVOVF9NZHAsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YjQyMDQzOCwgTCJicmVha0JlZm9yZSIsIFhGQV9FTEVNRU5UX0JyZWFrQmVmb3JlLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGI2YTA5MWMsIEwib2lkIiwgWEZBX0VMRU1FTlRfT2lkLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KKyAgICB7MHhiODQzODlmLCBMInBjbCIsIFhGQV9FTEVNRU5UX1BjbCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4Yjg0M2RiYSwgTCJwZGYiLCBYRkFfRUxFTUVOVF9QZGYsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGJiOGRmNWQsIEwicmVmIiwgWEZBX0VMRU1FTlRfUmVmLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KKyAgICB7MHhjMDgwY2QwLCBMInVyaSIsIFhGQV9FTEVNRU5UX1VyaSwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LA0KKyAgICAgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KKyAgICB7MHhjNTZhZmJmLCBMInhkYyIsIFhGQV9FTEVNRU5UX1hkYywNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9YZGMsIFhGQV9PQkpFQ1RUWVBFX01vZGVsTm9kZX0sDQorICAgIHsweGM1NmFmY2MsIEwieGRwIiwgWEZBX0VMRU1FTlRfWGRwLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhjNTZiOWZmLCBMInhmYSIsIFhGQV9FTEVNRU5UX1hmYSwgWEZBX1hEUFBBQ0tFVF9YRFAsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Nb2RlbE5vZGV9LA0KKyAgICB7MHhjNTZmY2I3LCBMInhzbCIsIFhGQV9FTEVNRU5UX1hzbCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YzhiODlkNiwgTCJ6cGwiLCBYRkFfRUxFTUVOVF9acGwsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGM5YmFlOTQsIEwiY2FjaGUiLCBYRkFfRUxFTUVOVF9DYWNoZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4Y2IwMTZiZSwgTCJtYXJnaW4iLCBYRkFfRUxFTUVOVF9NYXJnaW4sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ZTEzNzhmZSwgTCJrZXlVc2FnZSIsIFhGQV9FTEVNRU5UX0tleVVzYWdlLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGZlMzU5NmEsIEwiZXhjbHVkZSIsIFhGQV9FTEVNRU5UX0V4Y2x1ZGUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHgxMDM5NWFjNywgTCJjaG9pY2VMaXN0IiwgWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdCwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHgxMDU5ZWMxOCwgTCJsZXZlbCIsIFhGQV9FTEVNRU5UX0xldmVsLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4MTA4NzQ4MDQsIEwibGFiZWxQcmludGVyIiwgWEZBX0VMRU1FTlRfTGFiZWxQcmludGVyLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHgxMGM0MGUwMywgTCJjYWxlbmRhclN5bWJvbHMiLCBYRkFfRUxFTUVOVF9DYWxlbmRhclN5bWJvbHMsDQorICAgICBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDEwZjFlYTI0LCBMInBhcmEiLCBYRkFfRUxFTUVOVF9QYXJhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDEwZjFlYTM3LCBMInBhcnQiLCBYRkFfRUxFTUVOVF9QYXJ0LCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4MTE0MDk3NWIsIEwicGRmYSIsIFhGQV9FTEVNRU5UX1BkZmEsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDExNTRlZmU2LCBMImZpbHRlciIsIFhGQV9FTEVNRU5UX0ZpbHRlciwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHgxM2Y0MWRlMSwgTCJwcmVzZW50IiwgWEZBX0VMRU1FTlRfUHJlc2VudCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MTgyN2U2ZWEsIEwicGFnaW5hdGlvbiIsIFhGQV9FTEVNRU5UX1BhZ2luYXRpb24sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHgxODQ2MzcwNywgTCJlbmNvZGluZyIsIFhGQV9FTEVNRU5UX0VuY29kaW5nLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZUN9LA0KKyAgICB7MHgxODVlNDFlMiwgTCJldmVudCIsIFhGQV9FTEVNRU5UX0V2ZW50LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDFhZGIxNDJkLCBMIndoaXRlc3BhY2UiLCBYRkFfRUxFTUVOVF9XaGl0ZXNwYWNlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4MWYzZjY0YzMsIEwiZGVmYXVsdFVpIiwgWEZBX0VMRU1FTlRfRGVmYXVsdFVpLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDIwNGU4N2NiLCBMImRhdGFNb2RlbCIsIFhGQV9FTEVNRU5UX0RhdGFNb2RlbCwgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX01vZGVsTm9kZX0sDQorICAgIHsweDIwNTdiMzUwLCBMImJhcmNvZGUiLCBYRkFfRUxFTUVOVF9CYXJjb2RlLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDIwNTk2YmFkLCBMInRpbWVQYXR0ZXJuIiwgWEZBX0VMRU1FTlRfVGltZVBhdHRlcm4sDQorICAgICBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHgyMTBiNzRkMywgTCJiYXRjaE91dHB1dCIsIFhGQV9FTEVNRU5UX0JhdGNoT3V0cHV0LCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHgyMTJmZjBlMiwgTCJlbmZvcmNlIiwgWEZBX0VMRU1FTlRfRW5mb3JjZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDIxZDM1MWI0LCBMImN1cnJlbmN5U3ltYm9scyIsIFhGQV9FTEVNRU5UX0N1cnJlbmN5U3ltYm9scywNCisgICAgIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MjFkYjgzYzUsIEwiYWRkU2lsZW50UHJpbnQiLCBYRkFfRUxFTUVOVF9BZGRTaWxlbnRQcmludCwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDIyMjY2MjU4LCBMInJlbmFtZSIsIFhGQV9FTEVNRU5UX1JlbmFtZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweDIyNmNhOGYxLCBMIm9wZXJhdGlvbiIsIFhGQV9FTEVNRU5UX09wZXJhdGlvbiwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KKyAgICB7MHgyM2UyN2I4NCwgTCJ0eXBlZmFjZXMiLCBYRkFfRUxFTUVOVF9UeXBlZmFjZXMsIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDIzZjRhYTc1LCBMInN1YmplY3RETnMiLCBYRkFfRUxFTUVOVF9TdWJqZWN0RE5zLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDI0MGQ1ZThlLCBMImlzc3VlcnMiLCBYRkFfRUxFTUVOVF9Jc3N1ZXJzLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDI0NTdhMDMzLCBMInNpZ25hdHVyZVBzZXVkb01vZGVsIiwgWEZBX0VMRU1FTlRfU2lnbmF0dXJlUHNldWRvTW9kZWwsDQorICAgICBYRkFfWERQUEFDS0VUX1hEUCwgWEZBX09CSkVDVFRZUEVfT3JkaW5hcnlPYmplY3R9LA0KKyAgICB7MHgyNGE1MmY4YSwgTCJ3c2RsQ29ubmVjdGlvbiIsIFhGQV9FTEVNRU5UX1dzZGxDb25uZWN0aW9uLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MjU0ZWJkMDcsIEwiZGVidWciLCBYRkFfRUxFTUVOVF9EZWJ1ZywgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MjY1NWM2NmEsIEwiZGVsdGEiLCBYRkFfRUxFTUVOVF9EZWx0YSwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfT3JkaW5hcnlPYmplY3R9LA0KKyAgICB7MHgyNmMwZGFlYywgTCJlcmFOYW1lcyIsIFhGQV9FTEVNRU5UX0VyYU5hbWVzLCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHgyNzNhYjAzYiwgTCJtb2RpZnlBbm5vdHMiLCBYRkFfRUxFTUVOVF9Nb2RpZnlBbm5vdHMsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHgyNzg3NWJiNCwgTCJzdGFydE5vZGUiLCBYRkFfRUxFTUVOVF9TdGFydE5vZGUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHgyODVkMGRiYywgTCJidXR0b24iLCBYRkFfRUxFTUVOVF9CdXR0b24sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MjhkZWU2ZTksIEwiZm9ybWF0IiwgWEZBX0VMRU1FTlRfRm9ybWF0LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDJhMjMzNDllLCBMImJvcmRlciIsIFhGQV9FTEVNRU5UX0JvcmRlciwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHgyYWU2N2YxOSwgTCJhcmVhIiwgWEZBX0VMRU1FTlRfQXJlYSwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGV9LA0KKyAgICB7MHgyYzNjNGM2NywgTCJoeXBoZW5hdGlvbiIsIFhGQV9FTEVNRU5UX0h5cGhlbmF0aW9uLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDJkMDhhZjg1LCBMInRleHQiLCBYRkFfRUxFTUVOVF9UZXh0LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHgyZDcxYjAwZiwgTCJ0aW1lIiwgWEZBX0VMRU1FTlRfVGltZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4MmYxNmEzODIsIEwidHlwZSIsIFhGQV9FTEVNRU5UX1R5cGUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHgyZmUwNTdlOSwgTCJvdmVycHJpbnQiLCBYRkFfRUxFTUVOVF9PdmVycHJpbnQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHgzMDJhZWUxNiwgTCJjZXJ0aWZpY2F0ZXMiLCBYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZXMsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MzBiMjI3ZGYsIEwiZW5jcnlwdGlvbk1ldGhvZHMiLCBYRkFfRUxFTUVOVF9FbmNyeXB0aW9uTWV0aG9kcywNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHgzMmI5MDBkMSwgTCJzZXRQcm9wZXJ0eSIsIFhGQV9FTEVNRU5UX1NldFByb3BlcnR5LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDMzN2Q5ZTQ1LCBMInByaW50ZXJOYW1lIiwgWEZBX0VMRU1FTlRfUHJpbnRlck5hbWUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHgzM2VkZGE0YiwgTCJzdGFydFBhZ2UiLCBYRkFfRUxFTUVOVF9TdGFydFBhZ2UsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHgzODE5NDNlNCwgTCJwYWdlT2Zmc2V0IiwgWEZBX0VMRU1FTlRfUGFnZU9mZnNldCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MzgyMTA2Y2QsIEwiZGF0ZVRpbWUiLCBYRkFfRUxFTUVOVF9EYXRlVGltZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4Mzg2ZTc0MjEsIEwiY29tYiIsIFhGQV9FTEVNRU5UX0NvbWIsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4MzkwYWNkOWUsIEwicGF0dGVybiIsIFhGQV9FTEVNRU5UX1BhdHRlcm4sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4Mzk0MjE2M2UsIEwiaWZFbXB0eSIsIFhGQV9FTEVNRU5UX0lmRW1wdHksIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHgzOTk0NGE3YiwgTCJzdXBwcmVzc0Jhbm5lciIsIFhGQV9FTEVNRU5UX1N1cHByZXNzQmFubmVyLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4M2IzYzNkY2EsIEwib3V0cHV0QmluIiwgWEZBX0VMRU1FTlRfT3V0cHV0QmluLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4M2I4YTQwMjQsIEwiZmllbGQiLCBYRkFfRUxFTUVOVF9GaWVsZCwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGV9LA0KKyAgICB7MHgzYzE1MzUyZiwgTCJhZ2VudCIsIFhGQV9FTEVNRU5UX0FnZW50LCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHgzZDdlODY2OCwgTCJvdXRwdXRYU0wiLCBYRkFfRUxFTUVOVF9PdXRwdXRYU0wsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDNlMWM5MWM1LCBMImFkanVzdERhdGEiLCBYRkFfRUxFTUVOVF9BZGp1c3REYXRhLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4M2U3YTk0MDgsIEwiYXV0b1NhdmUiLCBYRkFfRUxFTUVOVF9BdXRvU2F2ZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweDNlY2VhZDk0LCBMImNvbnRlbnRBcmVhIiwgWEZBX0VMRU1FTlRfQ29udGVudEFyZWEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlfSwNCisgICAgezB4M2VmMzM0ZTMsIEwiZXZlbnRQc2V1ZG9Nb2RlbCIsIFhGQV9FTEVNRU5UX0V2ZW50UHNldWRvTW9kZWwsDQorICAgICBYRkFfWERQUEFDS0VUX1hEUCwgWEZBX09CSkVDVFRZUEVfT3JkaW5hcnlPYmplY3R9LA0KKyAgICB7MHgzZmFkYWVjMCwgTCJ3c2RsQWRkcmVzcyIsIFhGQV9FTEVNRU5UX1dzZGxBZGRyZXNzLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQorICAgIHsweDQwNjIzYjViLCBMInNvbGlkIiwgWEZBX0VMRU1FTlRfU29saWQsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NDFmMGJkNzYsIEwiZGF0ZVRpbWVTeW1ib2xzIiwgWEZBX0VMRU1FTlRfRGF0ZVRpbWVTeW1ib2xzLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4NDQ0ZTc1MjMsIEwiZW5jcnlwdGlvbkxldmVsIiwgWEZBX0VMRU1FTlRfRW5jcnlwdGlvbkxldmVsLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4NDUyM2FmNTUsIEwiZWRnZSIsIFhGQV9FTEVNRU5UX0VkZ2UsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NDVkNWUzYzEsIEwic3RpcHBsZSIsIFhGQV9FTEVNRU5UX1N0aXBwbGUsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NDc1ZTRlODcsIEwiYXR0cmlidXRlcyIsIFhGQV9FTEVNRU5UX0F0dHJpYnV0ZXMsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHg0ODdhOGM4NywgTCJ2ZXJzaW9uQ29udHJvbCIsIFhGQV9FTEVNRU5UX1ZlcnNpb25Db250cm9sLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg0OGU1MjQ4YywgTCJtZXJpZGllbSIsIFhGQV9FTEVNRU5UX01lcmlkaWVtLCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4NDhmMzY3MTksIEwiZXhjbEdyb3VwIiwgWEZBX0VMRU1FTlRfRXhjbEdyb3VwLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZX0sDQorICAgIHsweDQ5NzczNTZiLCBMInRvb2xUaXAiLCBYRkFfRUxFTUVOVF9Ub29sVGlwLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KKyAgICB7MHg0OTlhZmVjYywgTCJjb21wcmVzcyIsIFhGQV9FTEVNRU5UX0NvbXByZXNzLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg0YTBjNDk0OCwgTCJyZWFzb24iLCBYRkFfRUxFTUVOVF9SZWFzb24sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQorICAgIHsweDRiZGNjZTEzLCBMImV4ZWN1dGUiLCBYRkFfRUxFTUVOVF9FeGVjdXRlLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDRjNTZiMjE2LCBMImNvbnRlbnRDb3B5IiwgWEZBX0VMRU1FTlRfQ29udGVudENvcHksIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg0Y2MxNzZkMywgTCJkYXRlVGltZUVkaXQiLCBYRkFfRUxFTUVOVF9EYXRlVGltZUVkaXQsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NGUxZTM5YjYsIEwiY29uZmlnIiwgWEZBX0VMRU1FTlRfQ29uZmlnLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX01vZGVsTm9kZX0sDQorICAgIHsweDRlMmQ2MDgzLCBMImltYWdlIiwgWEZBX0VMRU1FTlRfSW1hZ2UsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDRlODE0MTUwLCBMIiN4SFRNTCIsIFhGQV9FTEVNRU5UX1NoYXJweEhUTUwsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCB8DQorICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0IHwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfA0KKyAgICAgICAgIFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4NGYyMzg4YzEsIEwibnVtYmVyT2ZDb3BpZXMiLCBYRkFfRUxFTUVOVF9OdW1iZXJPZkNvcGllcywNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDRmNTEyZTMwLCBMImJlaGF2aW9yT3ZlcnJpZGUiLCBYRkFfRUxFTUVOVF9CZWhhdmlvck92ZXJyaWRlLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4NGZkYzM0NTQsIEwidGltZVN0YW1wIiwgWEZBX0VMRU1FTlRfVGltZVN0YW1wLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDUxZDkwNTQ2LCBMIm1vbnRoIiwgWEZBX0VMRU1FTlRfTW9udGgsIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg1MjM0MzdlNCwgTCJ2aWV3ZXJQcmVmZXJlbmNlcyIsIFhGQV9FTEVNRU5UX1ZpZXdlclByZWZlcmVuY2VzLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg1M2FiYzFjNiwgTCJzY3JpcHRNb2RlbCIsIFhGQV9FTEVNRU5UX1NjcmlwdE1vZGVsLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4NTQwMzRjMmYsIEwiZGVjaW1hbCIsIFhGQV9FTEVNRU5UX0RlY2ltYWwsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDU0MjAyYzllLCBMInN1YmZvcm0iLCBYRkFfRUxFTUVOVF9TdWJmb3JtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZX0sDQorICAgIHsweDU0MmM3MzAwLCBMInNlbGVjdCIsIFhGQV9FTEVNRU5UX1NlbGVjdCwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsDQorICAgICBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQorICAgIHsweDU0MzZkMTk4LCBMIndpbmRvdyIsIFhGQV9FTEVNRU5UX1dpbmRvdywgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweDU0NzNiNmRjLCBMImxvY2FsZVNldCIsIFhGQV9FTEVNRU5UX0xvY2FsZVNldCwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX01vZGVsTm9kZX0sDQorICAgIHsweDU2YWUxNzllLCBMImhhbmRsZXIiLCBYRkFfRUxFTUVOVF9IYW5kbGVyLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KKyAgICB7MHg1NzAwYmQ1ZiwgTCJob3N0UHNldWRvTW9kZWwiLCBYRkFfRUxFTUVOVF9Ib3N0UHNldWRvTW9kZWwsDQorICAgICBYRkFfWERQUEFDS0VUX1hEUCwgWEZBX09CSkVDVFRZUEVfT3JkaW5hcnlPYmplY3R9LA0KKyAgICB7MHg1NzBjZTgzNSwgTCJwcmVzZW5jZSIsIFhGQV9FTEVNRU5UX1ByZXNlbmNlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4NTc3OWQ2NWYsIEwicmVjb3JkIiwgWEZBX0VMRU1FTlRfUmVjb3JkLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4NTljOGYyN2QsIEwiZW1iZWQiLCBYRkFfRUxFTUVOVF9FbWJlZCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDVhNTBlOWU2LCBMInZlcnNpb24iLCBYRkFfRUxFTUVOVF9WZXJzaW9uLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4NWI4MzgzZGYsIEwiY29tbWFuZCIsIFhGQV9FTEVNRU5UX0NvbW1hbmQsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDVjNDNjNmMzLCBMImNvcGllcyIsIFhGQV9FTEVNRU5UX0NvcGllcywgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDVlMGMyYzQ5LCBMInN0YXBsZSIsIFhGQV9FTEVNRU5UX1N0YXBsZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NWU1MDgzZGQsIEwic3VibWl0Rm9ybWF0IiwgWEZBX0VMRU1FTlRfU3VibWl0Rm9ybWF0LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4NWU4YzVkMjAsIEwiYm9vbGVhbiIsIFhGQV9FTEVNRU5UX0Jvb2xlYW4sDQorICAgICBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDYwNDkwYTg1LCBMIm1lc3NhZ2UiLCBYRkFfRUxFTUVOVF9NZXNzYWdlLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDYwZDRjOGIxLCBMIm91dHB1dCIsIFhGQV9FTEVNRU5UX091dHB1dCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NjE4MTAwODEsIEwicHNNYXAiLCBYRkFfRUxFTUVOVF9Qc01hcCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NjJiZDkwNGIsIEwiZXhjbHVkZU5TIiwgWEZBX0VMRU1FTlRfRXhjbHVkZU5TLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4NjY5ZDRmNzcsIEwiYXNzaXN0IiwgWEZBX0VMRU1FTlRfQXNzaXN0LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDY3MzM0YTFjLCBMInBpY3R1cmUiLCBYRkFfRUxFTUVOVF9QaWN0dXJlLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg2N2ZlNzMzNCwgTCJ0cmF2ZXJzYWwiLCBYRkFfRUxFTUVOVF9UcmF2ZXJzYWwsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4Njg5NDU4OWMsIEwic2lsZW50UHJpbnQiLCBYRkFfRUxFTUVOVF9TaWxlbnRQcmludCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NjhhMTZiYmQsIEwid2ViQ2xpZW50IiwgWEZBX0VMRU1FTlRfV2ViQ2xpZW50LCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg2OWYxMTVkZiwgTCJsYXlvdXRQc2V1ZG9Nb2RlbCIsIFhGQV9FTEVNRU5UX0xheW91dFBzZXVkb01vZGVsLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9YRFAsIFhGQV9PQkpFQ1RUWVBFX09yZGluYXJ5T2JqZWN0fSwNCisgICAgezB4NmE0YmMwODQsIEwicHJvZHVjZXIiLCBYRkFfRUxFTUVOVF9Qcm9kdWNlciwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDZhOWUwNGM5LCBMImNvcm5lciIsIFhGQV9FTEVNRU5UX0Nvcm5lciwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg2Y2NkNzI3NCwgTCJtc2dJZCIsIFhGQV9FTEVNRU5UX01zZ0lkLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4NmU2NzkyMWYsIEwiY29sb3IiLCBYRkFfRUxFTUVOVF9Db2xvciwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg2ZWMyMTdhNSwgTCJrZWVwIiwgWEZBX0VMRU1FTlRfS2VlcCwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg2ZWVmMTExNiwgTCJxdWVyeSIsIFhGQV9FTEVNRU5UX1F1ZXJ5LCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg3MDMzYmZkNSwgTCJpbnNlcnQiLCBYRkFfRUxFTUVOVF9JbnNlcnQsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LA0KKyAgICAgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KKyAgICB7MHg3MDRhZjM4OSwgTCJpbWFnZUVkaXQiLCBYRkFfRUxFTUVOVF9JbWFnZUVkaXQsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NzIzMzAxOGEsIEwidmFsaWRhdGUiLCBYRkFfRUxFTUVOVF9WYWxpZGF0ZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4NzJiYTQ3YjQsIEwiZGlnZXN0TWV0aG9kcyIsIFhGQV9FTEVNRU5UX0RpZ2VzdE1ldGhvZHMsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NzJmMmFhN2EsIEwibnVtYmVyUGF0dGVybnMiLCBYRkFfRUxFTUVOVF9OdW1iZXJQYXR0ZXJucywNCisgICAgIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4NzRjYWVkMjksIEwicGFnZVNldCIsIFhGQV9FTEVNRU5UX1BhZ2VTZXQsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlfSwNCisgICAgezB4NzU2OGU2YWUsIEwiaW50ZWdlciIsIFhGQV9FTEVNRU5UX0ludGVnZXIsDQorICAgICBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDc2MTgyZGI5LCBMInNvYXBBZGRyZXNzIiwgWEZBX0VMRU1FTlRfU29hcEFkZHJlc3MsDQorICAgICBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlfSwNCisgICAgezB4NzczMTQ2YzUsIEwiZXF1YXRlIiwgWEZBX0VMRU1FTlRfRXF1YXRlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4NzdkNDQ5ZGQsIEwiZm9ybUZpZWxkRmlsbGluZyIsIFhGQV9FTEVNRU5UX0Zvcm1GaWVsZEZpbGxpbmcsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg3ODg5ZDY4YSwgTCJwYWdlUmFuZ2UiLCBYRkFfRUxFTUVOVF9QYWdlUmFuZ2UsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg3YmFjYTJlMywgTCJ1cGRhdGUiLCBYRkFfRUxFTUVOVF9VcGRhdGUsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LA0KKyAgICAgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KKyAgICB7MHg3Y2U4OTAwMSwgTCJjb25uZWN0U3RyaW5nIiwgWEZBX0VMRU1FTlRfQ29ubmVjdFN0cmluZywNCisgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LCBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQorICAgIHsweDdkOWZkN2M1LCBMIm1vZGUiLCBYRkFfRUxFTUVOVF9Nb2RlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4N2U3ZTg0NWUsIEwibGF5b3V0IiwgWEZBX0VMRU1FTlRfTGF5b3V0LCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4N2U4NDVjMzQsIEwiI3htbCIsIFhGQV9FTEVNRU5UX1NoYXJweG1sLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHg3ZmIzNDFkZiwgTCJ4c2RDb25uZWN0aW9uIiwgWEZBX0VMRU1FTlRfWHNkQ29ubmVjdGlvbiwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDdmZmI1MWNjLCBMInRyYXZlcnNlIiwgWEZBX0VMRU1FTlRfVHJhdmVyc2UsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ODAyMDNiNWEsIEwiZW5jb2RpbmdzIiwgWEZBX0VMRU1FTlRfRW5jb2RpbmdzLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDgwMzU1MGZjLCBMInRlbXBsYXRlIiwgWEZBX0VMRU1FTlRfVGVtcGxhdGUsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICBYRkFfT0JKRUNUVFlQRV9Nb2RlbE5vZGV9LA0KKyAgICB7MHg4MDNkNWJiYywgTCJhY3JvYmF0IiwgWEZBX0VMRU1FTlRfQWNyb2JhdCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ODIxZDY1NjksIEwidmFsaWRhdGlvbk1lc3NhZ2luZyIsIFhGQV9FTEVNRU5UX1ZhbGlkYXRpb25NZXNzYWdpbmcsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHg4MzBlNjg4ZiwgTCJzaWduaW5nIiwgWEZBX0VMRU1FTlRfU2lnbmluZywNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg4M2E1NTBkMiwgTCJkYXRhV2luZG93IiwgWEZBX0VMRU1FTlRfRGF0YVdpbmRvdywgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX09yZGluYXJ5T2JqZWN0fSwNCisgICAgezB4ODNkYWI5ZjUsIEwic2NyaXB0IiwgWEZBX0VMRU1FTlRfU2NyaXB0LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg4NDExZWJjZCwgTCJhZGRWaWV3ZXJQcmVmZXJlbmNlcyIsIFhGQV9FTEVNRU5UX0FkZFZpZXdlclByZWZlcmVuY2VzLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4ODc3NzY0MmUsIEwiYWx3YXlzRW1iZWQiLCBYRkFfRUxFTUVOVF9BbHdheXNFbWJlZCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweDg3N2E2YjM5LCBMInBhc3N3b3JkRWRpdCIsIFhGQV9FTEVNRU5UX1Bhc3N3b3JkRWRpdCwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg4N2U4NGM5OSwgTCJudW1lcmljRWRpdCIsIFhGQV9FTEVNRU5UX051bWVyaWNFZGl0LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDg4NTJjZGVjLCBMImVuY3J5cHRpb25NZXRob2QiLCBYRkFfRUxFTUVOVF9FbmNyeXB0aW9uTWV0aG9kLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZUN9LA0KKyAgICB7MHg4OTFmNDYwNiwgTCJjaGFuZ2UiLCBYRkFfRUxFTUVOVF9DaGFuZ2UsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHg4OTkzOWYzNiwgTCJwYWdlQXJlYSIsIFhGQV9FTEVNRU5UX1BhZ2VBcmVhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZX0sDQorICAgIHsweDhhOWQ2MjQ3LCBMInN1Ym1pdFVybCIsIFhGQV9FTEVNRU5UX1N1Ym1pdFVybCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweDhhZDhiOTBmLCBMIm9pZHMiLCBYRkFfRUxFTUVOVF9PaWRzLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDhiMDM2ZjMyLCBMInNpZ25hdHVyZSIsIFhGQV9FTEVNRU5UX1NpZ25hdHVyZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg4YjEyOGVmYiwgTCJBREJFX0pTQ29uc29sZSIsIFhGQV9FTEVNRU5UX0FEQkVfSlNDb25zb2xlLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4OGJjZmU5NmUsIEwiY2FwdGlvbiIsIFhGQV9FTEVNRU5UX0NhcHRpb24sDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4OGUxYzI5MjEsIEwicmVsZXZhbnQiLCBYRkFfRUxFTUVOVF9SZWxldmFudCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweDhlM2YwYTRiLCBMImZsaXBMYWJlbCIsIFhGQV9FTEVNRU5UX0ZsaXBMYWJlbCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweDkwMDI4MGI3LCBMImV4RGF0YSIsIFhGQV9FTEVNRU5UX0V4RGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4OTFlODAzNTIsIEwiZGF5TmFtZXMiLCBYRkFfRUxFTUVOVF9EYXlOYW1lcywgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4OTMxMTNiMTEsIEwic29hcEFjdGlvbiIsIFhGQV9FTEVNRU5UX1NvYXBBY3Rpb24sDQorICAgICBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlfSwNCisgICAgezB4OTM4YjA5ZjYsIEwiZGVmYXVsdFR5cGVmYWNlIiwgWEZBX0VMRU1FTlRfRGVmYXVsdFR5cGVmYWNlLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4OTViMzc4OTcsIEwibWFuaWZlc3QiLCBYRkFfRUxFTUVOVF9NYW5pZmVzdCwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg5N2I3NmI1NCwgTCJvdmVyZmxvdyIsIFhGQV9FTEVNRU5UX092ZXJmbG93LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweDlhNTc4NjFiLCBMImxpbmVhciIsIFhGQV9FTEVNRU5UX0xpbmVhciwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHg5YWQ1YTgyMSwgTCJjdXJyZW5jeVN5bWJvbCIsIFhGQV9FTEVNRU5UX0N1cnJlbmN5U3ltYm9sLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4OWM2NDcxYjMsIEwiZGVsZXRlIiwgWEZBX0VMRU1FTlRfRGVsZXRlLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlfSwNCisgICAgezB4OWRlZWE2MWQsIEwiZGVsdGFzIiwgWEZBX0VMRU1FTlRfRGVsdGFzLCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICBYRkFfT0JKRUNUVFlQRV9PcmRpbmFyeU9iamVjdH0sDQorICAgIHsweDllNjdkZTIxLCBMImRpZ2VzdE1ldGhvZCIsIFhGQV9FTEVNRU5UX0RpZ2VzdE1ldGhvZCwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGVDfSwNCisgICAgezB4OWYzZTk1MTAsIEwiaW5zdGFuY2VNYW5hZ2VyIiwgWEZBX0VMRU1FTlRfSW5zdGFuY2VNYW5hZ2VyLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YTA3OTk4OTIsIEwiZXF1YXRlUmFuZ2UiLCBYRkFfRUxFTUVOVF9FcXVhdGVSYW5nZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweGEwODRhMzgxLCBMIm1lZGl1bSIsIFhGQV9FTEVNRU5UX01lZGl1bSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhhMTIxMWI4YiwgTCJ0ZXh0RWRpdCIsIFhGQV9FTEVNRU5UX1RleHRFZGl0LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGExNzAwOGYwLCBMInRlbXBsYXRlQ2FjaGUiLCBYRkFfRUxFTUVOVF9UZW1wbGF0ZUNhY2hlLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhhNGY3Yjg4ZiwgTCJjb21wcmVzc09iamVjdFN0cmVhbSIsIFhGQV9FTEVNRU5UX0NvbXByZXNzT2JqZWN0U3RyZWFtLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4YTY1ZjVkMTcsIEwiZGF0YVZhbHVlIiwgWEZBX0VMRU1FTlRfRGF0YVZhbHVlLCBYRkFfWERQUEFDS0VUX0RhdGFzZXRzLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGE2Y2FhYTg5LCBMImFjY2Vzc2libGVDb250ZW50IiwgWEZBX0VMRU1FTlRfQWNjZXNzaWJsZUNvbnRlbnQsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhhOGM3ZDVlMiwgTCJub2RlTGlzdCIsIFhGQV9FTEVNRU5UX05vZGVMaXN0LCBYRkFfWERQUEFDS0VUX1hEUCwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGVMaXN0fSwNCisgICAgezB4YTk0Y2MwMGIsIEwiaW5jbHVkZVhEUENvbnRlbnQiLCBYRkFfRUxFTUVOVF9JbmNsdWRlWERQQ29udGVudCwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGE5YjA4MWExLCBMInhtbENvbm5lY3Rpb24iLCBYRkFfRUxFTUVOVF9YbWxDb25uZWN0aW9uLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YWIyYTNiNzQsIEwidmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMiLA0KKyAgICAgWEZBX0VMRU1FTlRfVmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHhhYjhjNWEyYiwgTCJzaWduRGF0YSIsIFhGQV9FTEVNRU5UX1NpZ25EYXRhLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGFiYWEyY2ViLCBMInBhY2tldHMiLCBYRkFfRUxFTUVOVF9QYWNrZXRzLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4YWRiYTM1OWMsIEwiZGF0ZVBhdHRlcm4iLCBYRkFfRUxFTUVOVF9EYXRlUGF0dGVybiwNCisgICAgIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGFlMjIyYjJiLCBMImR1cGxleE9wdGlvbiIsIFhGQV9FTEVNRU5UX0R1cGxleE9wdGlvbiwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGIwMTJlZmZiLCBMImJhc2UiLCBYRkFfRUxFTUVOVF9CYXNlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4YjBlNTQ4NWQsIEwiYmluZCIsIFhGQV9FTEVNRU5UX0JpbmQsDQorICAgICBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YjQ1ZDYxYjIsIEwiY29tcHJlc3Npb24iLCBYRkFfRUxFTUVOVF9Db21wcmVzc2lvbiwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YjU2M2YwZmYsIEwidXNlciIsIFhGQV9FTEVNRU5UX1VzZXIsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LA0KKyAgICAgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KKyAgICB7MHhiNTg0OGFkNSwgTCJyZWN0YW5nbGUiLCBYRkFfRUxFTUVOVF9SZWN0YW5nbGUsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YjZkYWNiNzIsIEwiZWZmZWN0aXZlT3V0cHV0UG9saWN5IiwgWEZBX0VMRU1FTlRfRWZmZWN0aXZlT3V0cHV0UG9saWN5LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YjdkNzY1NGQsIEwiQURCRV9KU0RlYnVnZ2VyIiwgWEZBX0VMRU1FTlRfQURCRV9KU0RlYnVnZ2VyLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4YmFiMzdmNzMsIEwiYWNyb2JhdDciLCBYRkFfRUxFTUVOVF9BY3JvYmF0NywgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4YmM3MDA4MWUsIEwiaW50ZXJhY3RpdmUiLCBYRkFfRUxFTUVOVF9JbnRlcmFjdGl2ZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGJjOGZhMzUwLCBMImxvY2FsZSIsIFhGQV9FTEVNRU5UX0xvY2FsZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhiY2Q0NDk0MCwgTCJjdXJyZW50UGFnZSIsIFhGQV9FTEVNRU5UX0N1cnJlbnRQYWdlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4YmRlOWFiZGEsIEwiZGF0YSIsIFhGQV9FTEVNRU5UX0RhdGEsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGJkZTlhYmRlLCBMImRhdGUiLCBYRkFfRUxFTUVOVF9EYXRlLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwgWEZBX0VMRU1FTlRfRGVzYywNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhiZjRiNjQwNSwgTCJlbmNyeXB0IiwgWEZBX0VMRU1FTlRfRW5jcnlwdCwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4YmZhODdjY2UsIEwiZHJhdyIsIFhGQV9FTEVNRU5UX0RyYXcsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlfSwNCisgICAgezB4YzE4MWZmNGIsIEwiZW5jcnlwdGlvbiIsIFhGQV9FTEVNRU5UX0VuY3J5cHRpb24sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGMxOTcwZjQwLCBMIm1lcmlkaWVtTmFtZXMiLCBYRkFfRUxFTUVOVF9NZXJpZGllbU5hbWVzLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhjNWFkOWY1ZSwgTCJtZXNzYWdpbmciLCBYRkFfRUxFTUVOVF9NZXNzYWdpbmcsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGM2OTU0OWY0LCBMInNwZWFrIiwgWEZBX0VMRU1FTlRfU3BlYWssDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQorICAgIHsweGM3NzQzZGM3LCBMImRhdGFHcm91cCIsIFhGQV9FTEVNRU5UX0RhdGFHcm91cCwgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhjN2ViMjBlOSwgTCJjb21tb24iLCBYRkFfRUxFTUVOVF9Db21tb24sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGM4NWQ0NTI4LCBMIiN0ZXh0IiwgWEZBX0VMRU1FTlRfU2hhcnB0ZXh0LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQgfA0KKyAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCB8IFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwNCisgICAgICAgICBYRkFfWERQUEFDS0VUX0Zvcm0sDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweGM4NjE1NTZhLCBMInBhZ2luYXRpb25PdmVycmlkZSIsIFhGQV9FTEVNRU5UX1BhZ2luYXRpb25PdmVycmlkZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGM5MDNkYWJiLCBMInJlYXNvbnMiLCBYRkFfRUxFTUVOVF9SZWFzb25zLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGM5YTgxMjdmLCBMInNpZ25hdHVyZVByb3BlcnRpZXMiLCBYRkFfRUxFTUVOVF9TaWduYXR1cmVQcm9wZXJ0aWVzLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGNhMDEwYzJkLCBMInRocmVzaG9sZCIsIFhGQV9FTEVNRU5UX1RocmVzaG9sZCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweGNiNGM1ZTk2LCBMImFwcGVhcmFuY2VGaWx0ZXIiLCBYRkFfRUxFTUVOVF9BcHBlYXJhbmNlRmlsdGVyLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZUN9LA0KKyAgICB7MHhjYzkyYWJhNywgTCJmaWxsIiwgWEZBX0VMRU1FTlRfRmlsbCwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhjZDMwOGI3NywgTCJmb250IiwgWEZBX0VMRU1FTlRfRm9udCwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhjZDMwOWZmNCwgTCJmb3JtIiwgWEZBX0VMRU1FTlRfRm9ybSwgWEZBX1hEUFBBQ0tFVF9Gb3JtLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTW9kZWxOb2RlfSwNCisgICAgezB4Y2ViY2NhMmQsIEwibWVkaXVtSW5mbyIsIFhGQV9FTEVNRU5UX01lZGl1bUluZm8sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGNmZTBkNjQzLCBMImNlcnRpZmljYXRlIiwgWEZBX0VMRU1FTlRfQ2VydGlmaWNhdGUsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZX0sDQorICAgIHsweGQwMTJjMDMzLCBMInBhc3N3b3JkIiwgWEZBX0VMRU1FTlRfUGFzc3dvcmQsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LA0KKyAgICAgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGV9LA0KKyAgICB7MHhkMDE2MDRiZCwgTCJydW5TY3JpcHRzIiwgWEZBX0VMRU1FTlRfUnVuU2NyaXB0cywgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGQxMjI3ZTZmLCBMInRyYWNlIiwgWEZBX0VMRU1FTlRfVHJhY2UsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGQxNTMyODc2LCBMImZsb2F0IiwgWEZBX0VMRU1FTlRfRmxvYXQsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGQxN2E2YzMwLCBMInJlbmRlclBvbGljeSIsIFhGQV9FTEVNRU5UX1JlbmRlclBvbGljeSwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGQ0YmY2ODIzLCBMImxvZ1BzZXVkb01vZGVsIiwgWEZBX0VMRU1FTlRfTG9nUHNldWRvTW9kZWwsDQorICAgICBYRkFfWERQUEFDS0VUX1hEUCwgWEZBX09CSkVDVFRZUEVfT3JkaW5hcnlPYmplY3R9LA0KKyAgICB7MHhkNThhYTk2MiwgTCJkZXN0aW5hdGlvbiIsIFhGQV9FTEVNRU5UX0Rlc3RpbmF0aW9uLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLCBYRkFfRUxFTUVOVF9WYWx1ZSwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhkN2ExNDQ2MiwgTCJib29rZW5kIiwgWEZBX0VMRU1FTlRfQm9va2VuZCwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhkOGMzMTI1NCwgTCJleE9iamVjdCIsIFhGQV9FTEVNRU5UX0V4T2JqZWN0LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGRhNmE4NTkwLCBMIm9wZW5BY3Rpb24iLCBYRkFfRUxFTUVOVF9PcGVuQWN0aW9uLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhkYWI0ZmI3ZCwgTCJuZXZlckVtYmVkIiwgWEZBX0VMRU1FTlRfTmV2ZXJFbWJlZCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlVn0sDQorICAgIHsweGRiOTg0NzVmLCBMImJpbmRJdGVtcyIsIFhGQV9FTEVNRU5UX0JpbmRJdGVtcywNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhkYmZiZTAyZSwgTCJjYWxjdWxhdGUiLCBYRkFfRUxFTUVOVF9DYWxjdWxhdGUsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ZGQ3Njc2ZWQsIEwicHJpbnQiLCBYRkFfRUxFTUVOVF9QcmludCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGRkZTI3M2Q3LCBMImV4dHJhcyIsIFhGQV9FTEVNRU5UX0V4dHJhcywNCisgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhkZTE0NmIzNCwgTCJwcm90byIsIFhGQV9FTEVNRU5UX1Byb3RvLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGRmMDU5MzIxLCBMImRTaWdEYXRhIiwgWEZBX0VMRU1FTlRfRFNpZ0RhdGEsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ZGZjY2YwMzAsIEwiY3JlYXRvciIsIFhGQV9FTEVNRU5UX0NyZWF0b3IsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhkZmY3OGM2YSwgTCJjb25uZWN0IiwgWEZBX0VMRU1FTlRfQ29ubmVjdCwNCisgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhlMTFhMmNiYywgTCJwZXJtaXNzaW9ucyIsIFhGQV9FTEVNRU5UX1Blcm1pc3Npb25zLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhlMTRjODAxYywgTCJjb25uZWN0aW9uU2V0IiwgWEZBX0VMRU1FTlRfQ29ubmVjdGlvblNldCwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgWEZBX09CSkVDVFRZUEVfTW9kZWxOb2RlfSwNCisgICAgezB4ZTFjODNhMTQsIEwic3VibWl0IiwgWEZBX0VMRU1FTlRfU3VibWl0LA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGUyOTgyMWNkLCBMInJhbmdlIiwgWEZBX0VMRU1FTlRfUmFuZ2UsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHhlMzhkODNjNywgTCJsaW5lYXJpemVkIiwgWEZBX0VMRU1FTlRfTGluZWFyaXplZCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGUzYWEyNTc4LCBMInBhY2tldCIsIFhGQV9FTEVNRU5UX1BhY2tldCwgWEZBX1hEUFBBQ0tFVF9YRFAsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlQ30sDQorICAgIHsweGUzYWE4NjBlLCBMInJvb3RFbGVtZW50IiwgWEZBX0VMRU1FTlRfUm9vdEVsZW1lbnQsDQorICAgICBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsIFhGQV9PQkpFQ1RUWVBFX1RleHROb2RlfSwNCisgICAgezB4ZTNlNTUzZmEsIEwicGxhaW50ZXh0TWV0YWRhdGEiLCBYRkFfRUxFTUVOVF9QbGFpbnRleHRNZXRhZGF0YSwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGUzZTZlNGYyLCBMIm51bWJlclN5bWJvbHMiLCBYRkFfRUxFTUVOVF9OdW1iZXJTeW1ib2xzLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhlM2YwNjdmNiwgTCJwcmludEhpZ2hRdWFsaXR5IiwgWEZBX0VMRU1FTlRfUHJpbnRIaWdoUXVhbGl0eSwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGUzZmQwNzhjLCBMImRyaXZlciIsIFhGQV9FTEVNRU5UX0RyaXZlciwgWEZBX1hEUFBBQ0tFVF9Db25maWcsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ZTQ4YjM0ZjIsIEwiaW5jcmVtZW50YWxMb2FkIiwgWEZBX0VMRU1FTlRfSW5jcmVtZW50YWxMb2FkLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4ZTU1MGU3YzIsIEwic3ViamVjdEROIiwgWEZBX0VMRU1FTlRfU3ViamVjdEROLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZUN9LA0KKyAgICB7MHhlNjY2OWE3OCwgTCJjb21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUiLA0KKyAgICAgWEZBX0VMRU1FTlRfQ29tcHJlc3NMb2dpY2FsU3RydWN0dXJlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4ZTdhN2VhMDIsIEwiaW5jcmVtZW50YWxNZXJnZSIsIFhGQV9FTEVNRU5UX0luY3JlbWVudGFsTWVyZ2UsDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhlOTQ4NTMwZCwgTCJyYWRpYWwiLCBYRkFfRUxFTUVOVF9SYWRpYWwsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ZWE4ZDY5OTksIEwidmFyaWFibGVzIiwgWEZBX0VMRU1FTlRfVmFyaWFibGVzLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZX0sDQorICAgIHsweGVhYTE0MmMwLCBMInRpbWVQYXR0ZXJucyIsIFhGQV9FTEVNRU5UX1RpbWVQYXR0ZXJucywNCisgICAgIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ZWI5NDNhNzEsIEwiZWZmZWN0aXZlSW5wdXRQb2xpY3kiLCBYRkFfRUxFTUVOVF9FZmZlY3RpdmVJbnB1dFBvbGljeSwNCisgICAgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGVmMDRhMmJjLCBMIm5hbWVBdHRyIiwgWEZBX0VMRU1FTlRfTmFtZUF0dHIsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHhmMDcyMjJhYiwgTCJjb25mb3JtYW5jZSIsIFhGQV9FTEVNRU5UX0NvbmZvcm1hbmNlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4ZjBhYWFhZGMsIEwidHJhbnNmb3JtIiwgWEZBX0VMRU1FTlRfVHJhbnNmb3JtLCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhmMTQzM2U4OCwgTCJsb2NrRG9jdW1lbnQiLCBYRkFfRUxFTUVOVF9Mb2NrRG9jdW1lbnQsDQorICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZX0sDQorICAgIHsweGY1NGViOTk3LCBMImJyZWFrQWZ0ZXIiLCBYRkFfRUxFTUVOVF9CcmVha0FmdGVyLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGY2MTZkYTI4LCBMImxpbmUiLCBYRkFfRUxFTUVOVF9MaW5lLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGY2MTZmM2RjLCBMImxpc3QiLCBYRkFfRUxFTUVOVF9MaXN0LCBYRkFfWERQUEFDS0VUX1hEUCwNCisgICAgIFhGQV9PQkpFQ1RUWVBFX09yZGluYXJ5TGlzdH0sDQorICAgIHsweGY3MDU1ZmIxLCBMInNvdXJjZSIsIFhGQV9FTEVNRU5UX1NvdXJjZSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsDQorICAgICBYRkFfT0JKRUNUVFlQRV9Ob2RlfSwNCisgICAgezB4ZjdlZWJlMWMsIEwib2NjdXIiLCBYRkFfRUxFTUVOVF9PY2N1ciwNCisgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PQkpFQ1RUWVBFX05vZGV9LA0KKyAgICB7MHhmOGQxMGQ5NywgTCJwaWNrVHJheUJ5UERGU2l6ZSIsIFhGQV9FTEVNRU5UX1BpY2tUcmF5QnlQREZTaXplLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlfSwNCisgICAgezB4ZjhmMTllM2EsIEwibW9udGhOYW1lcyIsIFhGQV9FTEVNRU5UX01vbnRoTmFtZXMsIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorICAgIHsweGY5ODQxNDliLCBMInNldmVyaXR5IiwgWEZBX0VMRU1FTlRfU2V2ZXJpdHksIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfTm9kZVZ9LA0KKyAgICB7MHhmOWJjYjAzNywgTCJncm91cFBhcmVudCIsIFhGQV9FTEVNRU5UX0dyb3VwUGFyZW50LCBYRkFfWERQUEFDS0VUX0NvbmZpZywNCisgICAgIFhGQV9PQkpFQ1RUWVBFX05vZGVWfSwNCisgICAgezB4ZmJjNDJmZmYsIEwiZG9jdW1lbnRBc3NlbWJseSIsIFhGQV9FTEVNRU5UX0RvY3VtZW50QXNzZW1ibHksDQorICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhmYzc4MTU5ZiwgTCJudW1iZXJTeW1ib2wiLCBYRkFfRUxFTUVOVF9OdW1iZXJTeW1ib2wsDQorICAgICBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhmY2JkNjA2YywgTCJ0YWdnZWQiLCBYRkFfRUxFTUVOVF9UYWdnZWQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGV9LA0KKyAgICB7MHhmZjA2MzgwMiwgTCJpdGVtcyIsIFhGQV9FTEVNRU5UX0l0ZW1zLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09CSkVDVFRZUEVfTm9kZX0sDQorfTsNCitleHRlcm4gY29uc3QgaW50MzJfdCBnX2lYRkFFbGVtZW50Q291bnQgPQ0KKyAgICBzaXplb2YoZ19YRkFFbGVtZW50RGF0YSkgLyBzaXplb2YoWEZBX0VMRU1FTlRJTkZPKTsNCitleHRlcm4gY29uc3QgWEZBX0VMRU1FTlRISUVSQVJDSFkgZ19YRkFFbGVtZW50UHJvcGVydHlJbmRleFtdID0gew0KKyAgICB7MCwgOH0sICAgIHs4LCAwfSwgICB7OCwgMTR9LCAgIHsyMiwgMH0sICAgezIyLCAwfSwgICB7MjIsIDZ9LCAgIHsyOCwgMH0sDQorICAgIHsyOCwgMH0sICAgezI4LCAxfSwgIHsyOSwgM30sICAgezMyLCAwfSwgICB7MzIsIDB9LCAgIHszMiwgMH0sICAgezMyLCAzfSwNCisgICAgezM1LCAxfSwgICB7MzYsIDB9LCAgezM2LCAwfSwgICB7MzYsIDJ9LCAgIHszOCwgMH0sICAgezM4LCAwfSwgICB7MzgsIDB9LA0KKyAgICB7MzgsIDR9LCAgIHs0MiwgMH0sICB7NDIsIDB9LCAgIHs0MiwgMX0sICAgezQzLCAwfSwgICB7NDMsIDh9LCAgIHs1MSwgMTl9LA0KKyAgICB7NzAsIDB9LCAgIHs3MCwgMH0sICB7NzAsIDJ9LCAgIHs3MiwgMX0sICAgezczLCAwfSwgICB7NzMsIDJ9LCAgIHs3NSwgNH0sDQorICAgIHs3OSwgMX0sICAgezgwLCAxfSwgIHs4MSwgMH0sICAgezgxLCAwfSwgICB7ODEsIDN9LCAgIHs4NCwgMH0sICAgezg0LCA0fSwNCisgICAgezg4LCA0fSwgICB7OTIsIDF9LCAgezkzLCAwfSwgICB7OTMsIDR9LCAgIHs5NywgOX0sICAgezEwNiwgMTR9LCB7MTIwLCAwfSwNCisgICAgezEyMCwgMH0sICB7MTIwLCA1fSwgezEyNSwgMH0sICB7MTI1LCAxfSwgIHsxMjYsIDB9LCAgezEyNiwgMH0sICB7MTI2LCAwfSwNCisgICAgezEyNiwgMH0sICB7MTI2LCAwfSwgezEyNiwgMX0sICB7MTI3LCAwfSwgIHsxMjcsIDB9LCAgezEyNywgMH0sICB7MTI3LCAwfSwNCisgICAgezEyNywgMH0sICB7MTI3LCAwfSwgezEyNywgMH0sICB7MTI3LCA2fSwgIHsxMzMsIDF9LCAgezEzNCwgMH0sICB7MTM0LCAxfSwNCisgICAgezEzNSwgMH0sICB7MTM1LCAwfSwgezEzNSwgMX0sICB7MTM2LCAyfSwgIHsxMzgsIDV9LCAgezE0MywgMn0sICB7MTQ1LCAwfSwNCisgICAgezE0NSwgMH0sICB7MTQ1LCAwfSwgezE0NSwgMH0sICB7MTQ1LCAwfSwgIHsxNDUsIDV9LCAgezE1MCwgMH0sICB7MTUwLCAwfSwNCisgICAgezE1MCwgMH0sICB7MTUwLCAwfSwgezE1MCwgMH0sICB7MTUwLCAwfSwgIHsxNTAsIDB9LCAgezE1MCwgMn0sICB7MTUyLCAwfSwNCisgICAgezE1MiwgMH0sICB7MTUyLCAwfSwgezE1MiwgMTd9LCB7MTY5LCAwfSwgIHsxNjksIDF9LCAgezE3MCwgMH0sICB7MTcwLCAwfSwNCisgICAgezE3MCwgMn0sICB7MTcyLCAwfSwgezE3MiwgMH0sICB7MTcyLCAxfSwgIHsxNzMsIDB9LCAgezE3MywgMH0sICB7MTczLCAyfSwNCisgICAgezE3NSwgMn0sICB7MTc3LCAwfSwgezE3NywgMH0sICB7MTc3LCAwfSwgIHsxNzcsIDExfSwgezE4OCwgMH0sICB7MTg4LCAwfSwNCisgICAgezE4OCwgMH0sICB7MTg4LCAwfSwgezE4OCwgMH0sICB7MTg4LCA0fSwgIHsxOTIsIDN9LCAgezE5NSwgMH0sICB7MTk1LCAwfSwNCisgICAgezE5NSwgMH0sICB7MTk1LCAwfSwgezE5NSwgMH0sICB7MTk1LCAwfSwgIHsxOTUsIDl9LCAgezIwNCwgMH0sICB7MjA0LCAwfSwNCisgICAgezIwNCwgMTd9LCB7MjIxLCAwfSwgezIyMSwgMH0sICB7MjIxLCAwfSwgIHsyMjEsIDB9LCAgezIyMSwgMH0sICB7MjIxLCAwfSwNCisgICAgezIyMSwgMH0sICB7MjIxLCAwfSwgezIyMSwgMH0sICB7MjIxLCA0fSwgIHsyMjUsIDB9LCAgezIyNSwgMH0sICB7MjI1LCAwfSwNCisgICAgezIyNSwgMH0sICB7MjI1LCAyfSwgezIyNywgM30sICB7MjMwLCAwfSwgIHsyMzAsIDB9LCAgezIzMCwgMn0sICB7MjMyLCAwfSwNCisgICAgezIzMiwgMX0sICB7MjMzLCAyfSwgezIzNSwgMn0sICB7MjM3LCAwfSwgIHsyMzcsIDB9LCAgezIzNywgMn0sICB7MjM5LCAwfSwNCisgICAgezIzOSwgMX0sICB7MjQwLCAxfSwgezI0MSwgMn0sICB7MjQzLCAwfSwgIHsyNDMsIDN9LCAgezI0NiwgNH0sICB7MjUwLCAwfSwNCisgICAgezI1MCwgMX0sICB7MjUxLCAyfSwgezI1MywgMH0sICB7MjUzLCAwfSwgIHsyNTMsIDB9LCAgezI1MywgMH0sICB7MjUzLCAwfSwNCisgICAgezI1MywgMH0sICB7MjUzLCAwfSwgezI1MywgMH0sICB7MjUzLCAwfSwgIHsyNTMsIDB9LCAgezI1MywgMn0sICB7MjU1LCAyfSwNCisgICAgezI1NywgMH0sICB7MjU3LCA2fSwgezI2MywgNX0sICB7MjY4LCAwfSwgIHsyNjgsIDB9LCAgezI2OCwgMH0sICB7MjY4LCAzfSwNCisgICAgezI3MSwgMH0sICB7MjcxLCAwfSwgezI3MSwgM30sICB7Mjc0LCA0fSwgIHsyNzgsIDB9LCAgezI3OCwgMH0sICB7Mjc4LCA0fSwNCisgICAgezI4MiwgMH0sICB7MjgyLCAwfSwgezI4MiwgNX0sICB7Mjg3LCAwfSwgIHsyODcsIDV9LCAgezI5MiwgMH0sICB7MjkyLCAwfSwNCisgICAgezI5MiwgMH0sICB7MjkyLCAxfSwgezI5MywgMH0sICB7MjkzLCAwfSwgIHsyOTMsIDF9LCAgezI5NCwgMH0sICB7Mjk0LCAyfSwNCisgICAgezI5NiwgMH0sICB7Mjk2LCAwfSwgezI5NiwgMH0sICB7Mjk2LCAwfSwgIHsyOTYsIDF9LCAgezI5NywgMH0sICB7Mjk3LCAwfSwNCisgICAgezI5NywgNH0sICB7MzAxLCAwfSwgezMwMSwgMH0sICB7MzAxLCAwfSwgIHszMDEsIDB9LCAgezMwMSwgMH0sICB7MzAxLCAwfSwNCisgICAgezMwMSwgMX0sICB7MzAyLCAwfSwgezMwMiwgMn0sICB7MzA0LCAwfSwgIHszMDQsIDB9LCAgezMwNCwgMH0sICB7MzA0LCAwfSwNCisgICAgezMwNCwgMX0sICB7MzA1LCA0fSwgezMwOSwgMH0sICB7MzA5LCAzfSwgIHszMTIsIDB9LCAgezMxMiwgMH0sICB7MzEyLCAxfSwNCisgICAgezMxMywgMH0sICB7MzEzLCA4fSwgezMyMSwgMH0sICB7MzIxLCAxMH0sIHszMzEsIDB9LCAgezMzMSwgMTB9LCB7MzQxLCAxfSwNCisgICAgezM0MiwgMTJ9LCB7MzU0LCAzfSwgezM1NywgMX0sICB7MzU4LCAwfSwgIHszNTgsIDB9LCAgezM1OCwgMH0sICB7MzU4LCA4fSwNCisgICAgezM2NiwgMH0sICB7MzY2LCAwfSwgezM2NiwgMH0sICB7MzY2LCAwfSwgIHszNjYsIDB9LCAgezM2NiwgMH0sICB7MzY2LCA3fSwNCisgICAgezM3MywgMn0sICB7Mzc1LCAwfSwgezM3NSwgMX0sICB7Mzc2LCAwfSwgIHszNzYsIDB9LCAgezM3NiwgMH0sICB7Mzc2LCAwfSwNCisgICAgezM3NiwgMH0sICB7Mzc2LCAwfSwgezM3NiwgMH0sICB7Mzc2LCAwfSwgIHszNzYsIDEzfSwgezM4OSwgMH0sICB7Mzg5LCAxfSwNCisgICAgezM5MCwgMX0sICB7MzkxLCAwfSwgezM5MSwgMH0sICB7MzkxLCAzfSwgIHszOTQsIDB9LCAgezM5NCwgMH0sICB7Mzk0LCAwfSwNCisgICAgezM5NCwgMH0sICB7Mzk0LCAwfSwgezM5NCwgNH0sICB7Mzk4LCA5fSwgIHs0MDcsIDB9LCAgezQwNywgMX0sICB7NDA4LCAwfSwNCisgICAgezQwOCwgMH0sICB7NDA4LCAwfSwgezQwOCwgMH0sICB7NDA4LCAwfSwgIHs0MDgsIDF9LCAgezQwOSwgMH0sICB7NDA5LCAyfSwNCisgICAgezQxMSwgMH0sICB7NDExLCAwfSwgezQxMSwgMH0sICB7NDExLCAwfSwgIHs0MTEsIDJ9LCAgezQxMywgMH0sICB7NDEzLCAxfSwNCisgICAgezQxNCwgMH0sICB7NDE0LCAwfSwgezQxNCwgMH0sICB7NDE0LCA3fSwgIHs0MjEsIDB9LCAgezQyMSwgMX0sICB7NDIyLCAxfSwNCisgICAgezQyMywgMH0sICB7NDIzLCAxfSwgezQyNCwgMX0sICB7NDI1LCAwfSwgIHs0MjUsIDF9LCAgezQyNiwgMH0sICB7NDI2LCAwfSwNCisgICAgezQyNiwgMH0sICB7NDI2LCAwfSwgezQyNiwgMH0sICB7NDI2LCAwfSwNCit9Ow0KK2V4dGVybiBjb25zdCBYRkFfUFJPUEVSVFkgZ19YRkFFbGVtZW50UHJvcGVydHlEYXRhW10gPSB7DQorICAgIHtYRkFfRUxFTUVOVF9Gb250SW5mbywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Kb2csIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfWGRjLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0JhdGNoT3V0cHV0LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX091dHB1dEJpbiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Db21wcmVzcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9TdGFwbGUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTWVkaXVtSW5mbywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9DaGVja0J1dHRvbiwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9DaG9pY2VMaXN0LCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwNCisgICAge1hGQV9FTEVNRU5UX0RlZmF1bHRVaSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9CYXJjb2RlLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwNCisgICAge1hGQV9FTEVNRU5UX0J1dHRvbiwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9EYXRlVGltZUVkaXQsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LA0KKyAgICB7WEZBX0VMRU1FTlRfUGljdHVyZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9JbWFnZUVkaXQsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LA0KKyAgICB7WEZBX0VMRU1FTlRfUGFzc3dvcmRFZGl0LCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwNCisgICAge1hGQV9FTEVNRU5UX051bWVyaWNFZGl0LCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwNCisgICAge1hGQV9FTEVNRU5UX1NpZ25hdHVyZSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9UZXh0RWRpdCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9FeE9iamVjdCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQnJlYWssIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfT3ZlcmZsb3csIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRGVzYywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Cb29rZW5kLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9PY2N1ciwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfU3Vic2V0QmVsb3csIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTWFwLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0VtYmVkLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX01hcmdpbiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Cb3JkZXIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0RhdGVQYXR0ZXJuLCA0LCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0VkZ2UsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRmlsbCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9UbywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9VcmksIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTW9kZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9UaHJlc2hvbGQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfU2NyaXB0LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0ZvbnRJbmZvLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0pvZywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9YZGMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQmF0Y2hPdXRwdXQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUGFnZU9mZnNldCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9PdXRwdXRCaW4sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfU3RhcGxlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX01lZGl1bUluZm8sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQWRvYmVFeHRlbnNpb25MZXZlbCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Gb250SW5mbywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9YZGMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUGRmYSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9CYXRjaE91dHB1dCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9WaWV3ZXJQcmVmZXJlbmNlcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9TY3JpcHRNb2RlbCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9WZXJzaW9uLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1N1Ym1pdEZvcm1hdCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9TaWxlbnRQcmludCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Qcm9kdWNlciwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Db21wcmVzc2lvbiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9JbnRlcmFjdGl2ZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FbmNyeXB0aW9uLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1JlbmRlclBvbGljeSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9PcGVuQWN0aW9uLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0NyZWF0b3IsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTGluZWFyaXplZCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9UYWdnZWQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVXJpLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1hzbCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9QYWNrZXRzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1VyaSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9EZWJ1ZywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Gb250SW5mbywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9YZGMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQmF0Y2hPdXRwdXQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRmxpcExhYmVsLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1RlbXBsYXRlQ2FjaGUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX01hcmdpbiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Cb3JkZXIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0ZvbnRJbmZvLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1hkYywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9CYXRjaE91dHB1dCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9GbGlwTGFiZWwsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXJhTmFtZXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRGF5TmFtZXMsIDIsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTWVyaWRpZW1OYW1lcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Nb250aE5hbWVzLCAyLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0h5cGhlbmF0aW9uLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0FtZCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9QYXJ0LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0luY2x1ZGVYRFBDb250ZW50LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0NvbmZvcm1hbmNlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX01kcCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVGltZVN0YW1wLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0hhbmRsZXIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRGlnZXN0TWV0aG9kcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FbmNvZGluZ3MsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUmVhc29ucywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9BcHBlYXJhbmNlRmlsdGVyLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0xvY2tEb2N1bWVudCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9YZHAsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ2FjaGUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUGFnaW5hdGlvbiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9PdmVycHJpbnQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQmVoYXZpb3JPdmVycmlkZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Db3BpZXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfT3V0cHV0LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1ZhbGlkYXRlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0xheW91dCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9TY3JpcHQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ29tbW9uLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1BhZ2luYXRpb25PdmVycmlkZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9EZXN0aW5hdGlvbiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9JbmNyZW1lbnRhbE1lcmdlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4ZWN1dGUsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LA0KKyAgICB7WEZBX0VMRU1FTlRfU2NyaXB0LCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwNCisgICAge1hGQV9FTEVNRU5UX1NpZ25EYXRhLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9TdWJtaXQsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0N1cnJlbmN5U3ltYm9sLCAzLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX09wZXJhdGlvbiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Xc2RsQWRkcmVzcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Tb2FwQWRkcmVzcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Tb2FwQWN0aW9uLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0VmZmVjdGl2ZU91dHB1dFBvbGljeSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FZmZlY3RpdmVJbnB1dFBvbGljeSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9VcmksIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXJhLCAyLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9QaWN0dXJlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9NYXJnaW4sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRWRnZSwgNCwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Db3JuZXIsIDQsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRmlsbCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRGVzYywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfS2V5VXNhZ2UsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfU3ViamVjdEROcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Jc3N1ZXJzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1NpZ25pbmcsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfT2lkcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Db2xvciwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVWksIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTWFyZ2luLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1BhcmEsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRm9ybWF0LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0JvcmRlciwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Bc3Npc3QsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVHJhdmVyc2FsLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0tlZXAsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVmFsaWRhdGUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ2FwdGlvbiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9CaW5kLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0Rlc2MsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRm9udCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9WYWx1ZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9DYWxjdWxhdGUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0l0ZW1zLCAyLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1VyaSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9EZXNjLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ29sb3IsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0NvbG9yLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9NYXJnaW4sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUGFyYSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Cb3JkZXIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQXNzaXN0LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1RyYXZlcnNhbCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9WYWxpZGF0ZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9DYXB0aW9uLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0JpbmQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRGVzYywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9DYWxjdWxhdGUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX01hcmdpbiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Cb3JkZXIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ29tYiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUHJlc2VudCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9BY3JvYmF0LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1RyYWNlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1ByaW50U2NhbGluZywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FbmZvcmNlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX051bWJlck9mQ29waWVzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1BhZ2VSYW5nZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9BZGRWaWV3ZXJQcmVmZXJlbmNlcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9BREJFX0pTQ29uc29sZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9EdXBsZXhPcHRpb24sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQURCRV9KU0RlYnVnZ2VyLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1BpY2tUcmF5QnlQREZTaXplLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0JyZWFrLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX01hcmdpbiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9QYXJhLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0JvcmRlciwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Bc3Npc3QsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVHJhdmVyc2FsLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0tlZXAsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVmFsaWRhdGUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUGFnZVNldCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9PdmVyZmxvdywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9CaW5kLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0Rlc2MsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQm9va2VuZCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9DYWxjdWxhdGUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1ZhcmlhYmxlcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9PY2N1ciwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9RdWVyeSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9JbnNlcnQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVXBkYXRlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0RlbGV0ZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Nc2dJZCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9TZXZlcml0eSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9UbywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9VcmksIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVHlwZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Ub29sVGlwLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1NwZWFrLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9BZGRTaWxlbnRQcmludCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9QcmludGVyTmFtZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Gb250SW5mbywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9YZGMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ29sb3IsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUmVjb3JkU2V0LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1NlbGVjdCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9NYXJnaW4sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQm9yZGVyLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9NZXNzYWdlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1BpY3R1cmUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfU2NyaXB0LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9OdW1iZXJQYXR0ZXJuLCA0LCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9PY2N1ciwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9VcmksIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUm9vdEVsZW1lbnQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfU2NyaXB0LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9VcmksIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfWHNsLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1N0YXJ0UGFnZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9SZWxldmFudCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9CYXNlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9BdXRvU2F2ZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9WYWxpZGF0ZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9WYWxpZGF0ZUFwcHJvdmFsU2lnbmF0dXJlcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9BY3JvYmF0NywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Db21tb24sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXhjbHVkZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9DdXJyZW50UGFnZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9SdW5TY3JpcHRzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX01hcmdpbiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Cb3JkZXIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX01hcmdpbiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Cb3JkZXIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ29tYiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTWVkaXVtLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0Rlc2MsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX09jY3VyLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX01hcmdpbiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9GaWx0ZXIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQm9yZGVyLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX01hbmlmZXN0LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9NYXJnaW4sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUGFyYSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Gb250LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1ZhbHVlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9EYXksIDcsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0NvbG9yLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9PY2N1ciwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9NYXJnaW4sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQm9yZGVyLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0NvbWIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1VyaSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9GaWx0ZXIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTWFuaWZlc3QsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUGljdHVyZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9MZXZlbCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9UeXBlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0NvbXByZXNzT2JqZWN0U3RyZWFtLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0NvbXByZXNzTG9naWNhbFN0cnVjdHVyZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FZGdlLCA0LCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0Nvcm5lciwgNCwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9GaWxsLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0R5bmFtaWNSZW5kZXIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRGF0ZVBhdHRlcm5zLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0NhbGVuZGFyU3ltYm9scywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9DdXJyZW5jeVN5bWJvbHMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVHlwZWZhY2VzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0RhdGVUaW1lU3ltYm9scywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9OdW1iZXJQYXR0ZXJucywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9OdW1iZXJTeW1ib2xzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1RpbWVQYXR0ZXJucywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9VcmksIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfWHNsLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1N0YXJ0Tm9kZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9PdXRwdXRYU0wsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQWRqdXN0RGF0YSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9BdHRyaWJ1dGVzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1dpbmRvdywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9SZWNvcmQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUmFuZ2UsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfSW5jcmVtZW50YWxMb2FkLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1RleHQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVGltZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9EYXRlVGltZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9JbWFnZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9EZWNpbWFsLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0Jvb2xlYW4sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfSW50ZWdlciwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeERhdGEsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRGF0ZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9GbG9hdCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9VaSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9NYXJnaW4sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUGFyYSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Cb3JkZXIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQXNzaXN0LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1RyYXZlcnNhbCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9LZWVwLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0NhcHRpb24sIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRGVzYywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Gb250LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1ZhbHVlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FbmNyeXB0aW9uTGV2ZWwsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRW5jcnlwdCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9QZXJtaXNzaW9ucywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9NZXJpZGllbSwgMiwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9TdXBwcmVzc0Jhbm5lciwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9WZXJzaW9uQ29udHJvbCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Mb2NhbGVTZXQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVGVtcGxhdGUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfVmFsaWRhdGlvbk1lc3NhZ2luZywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Mb2NhbGUsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRGF0YSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9NZXNzYWdpbmcsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUGF0dGVybiwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9Tb2xpZCwgMSwNCisgICAgIFhGQV9QUk9QRVJUWUZMQUdfT25lT2YgfCBYRkFfUFJPUEVSVFlGTEFHX0RlZmF1bHRPbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9TdGlwcGxlLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwNCisgICAge1hGQV9FTEVNRU5UX0NvbG9yLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0xpbmVhciwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUmFkaWFsLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwNCisgICAge1hGQV9FTEVNRU5UX0ZpbGwsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX01hcCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9BcmMsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LA0KKyAgICB7WEZBX0VMRU1FTlRfVGV4dCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9UaW1lLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwNCisgICAge1hGQV9FTEVNRU5UX0RhdGVUaW1lLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwNCisgICAge1hGQV9FTEVNRU5UX0ltYWdlLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwNCisgICAge1hGQV9FTEVNRU5UX0RlY2ltYWwsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LA0KKyAgICB7WEZBX0VMRU1FTlRfQm9vbGVhbiwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9JbnRlZ2VyLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwNCisgICAge1hGQV9FTEVNRU5UX0V4RGF0YSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9SZWN0YW5nbGUsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LA0KKyAgICB7WEZBX0VMRU1FTlRfRGF0ZSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9GbG9hdCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sDQorICAgIHtYRkFfRUxFTUVOVF9MaW5lLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9EZXN0aW5hdGlvbiwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9NZXNzYWdlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1NjcmlwdCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FeHRyYXMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUGljdHVyZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Db25uZWN0U3RyaW5nLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1VzZXIsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUGFzc3dvcmQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfTW9kaWZ5QW5ub3RzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0NvbnRlbnRDb3B5LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0Zvcm1GaWVsZEZpbGxpbmcsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ2hhbmdlLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0FjY2Vzc2libGVDb250ZW50LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1ByaW50LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1BsYWludGV4dE1ldGFkYXRhLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1ByaW50SGlnaFF1YWxpdHksIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRG9jdW1lbnRBc3NlbWJseSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9FbmNyeXB0LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX051bWJlclN5bWJvbCwgNSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Gb250SW5mbywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9YZGMsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfQ29sb3IsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRXh0cmFzLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1RpbWVQYXR0ZXJuLCA0LCAwfSwNCisgICAge1hGQV9FTEVNRU5UX1doaXRlc3BhY2UsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUmVuYW1lLCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0lmRW1wdHksIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUHJlc2VuY2UsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfUGljdHVyZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9OYW1lQXR0ciwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Hcm91cFBhcmVudCwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9TY3JpcHQsIDEsIDB9LA0KKyAgICB7WEZBX0VMRU1FTlRfRWRnZSwgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Db25uZWN0LCAxLCAwfSwNCisgICAge1hGQV9FTEVNRU5UX0V4dHJhcywgMSwgMH0sDQorICAgIHtYRkFfRUxFTUVOVF9Nb250aCwgMTIsIDB9LA0KK307DQorZXh0ZXJuIGNvbnN0IFhGQV9FTEVNRU5USElFUkFSQ0hZIGdfWEZBRWxlbWVudENoaWxkcmVuSW5kZXhbXSA9IHsNCisgICAgezAsIDB9LCAgIHswLCAwfSwgICB7MCwgMH0sICAgezAsIDF9LCAgICB7MSwgMH0sICAgezEsIDR9LCAgICB7NSwgMH0sDQorICAgIHs1LCAwfSwgICB7NSwgMH0sICAgezUsIDN9LCAgIHs4LCAwfSwgICAgezgsIDB9LCAgIHs4LCAwfSwgICAgezgsIDB9LA0KKyAgICB7OCwgMH0sICAgezgsIDF9LCAgIHs5LCAwfSwgICB7OSwgMH0sICAgIHs5LCAwfSwgICB7OSwgMH0sICAgIHs5LCAwfSwNCisgICAgezksIDB9LCAgIHs5LCAyfSwgICB7MTEsIDB9LCAgezExLCAwfSwgICB7MTEsIDB9LCAgezExLCAwfSwgICB7MTEsIDB9LA0KKyAgICB7MTEsIDB9LCAgezExLCAwfSwgIHsxMSwgMH0sICB7MTEsIDB9LCAgIHsxMSwgMH0sICB7MTEsIDB9LCAgIHsxMSwgMH0sDQorICAgIHsxMSwgMH0sICB7MTEsIDB9LCAgezExLCAwfSwgIHsxMSwgMH0sICAgezExLCAwfSwgIHsxMSwgMH0sICAgezExLCAwfSwNCisgICAgezExLCAwfSwgIHsxMSwgMH0sICB7MTEsIDB9LCAgezExLCAwfSwgICB7MTEsIDB9LCAgezExLCA4fSwgICB7MTksIDB9LA0KKyAgICB7MTksIDB9LCAgezE5LCAwfSwgIHsxOSwgMH0sICB7MTksIDB9LCAgIHsxOSwgMH0sICB7MTksIDB9LCAgIHsxOSwgMH0sDQorICAgIHsxOSwgMH0sICB7MTksIDB9LCAgezE5LCAwfSwgIHsxOSwgMH0sICAgezE5LCAwfSwgIHsxOSwgMH0sICAgezE5LCAxfSwNCisgICAgezIwLCAxfSwgIHsyMSwgMX0sICB7MjIsIDB9LCAgezIyLCAwfSwgICB7MjIsIDB9LCAgezIyLCAwfSwgICB7MjIsIDB9LA0KKyAgICB7MjIsIDB9LCAgezIyLCAwfSwgIHsyMiwgMH0sICB7MjIsIDB9LCAgIHsyMiwgMH0sICB7MjIsIDd9LCAgIHsyOSwgMH0sDQorICAgIHsyOSwgMH0sICB7MjksIDB9LCAgezI5LCAwfSwgIHsyOSwgMH0sICAgezI5LCAwfSwgIHsyOSwgMX0sICAgezMwLCAxfSwNCisgICAgezMxLCAwfSwgIHszMSwgMH0sICB7MzEsIDB9LCAgezMxLCAwfSwgICB7MzEsIDB9LCAgezMxLCAwfSwgICB7MzEsIDB9LA0KKyAgICB7MzEsIDB9LCAgezMxLCAwfSwgIHszMSwgNH0sICB7MzUsIDJ9LCAgIHszNywgMH0sICB7MzcsIDB9LCAgIHszNywgMH0sDQorICAgIHszNywgMH0sICB7MzcsIDB9LCAgezM3LCAwfSwgIHszNywgMH0sICAgezM3LCAwfSwgIHszNywgMH0sICAgezM3LCAwfSwNCisgICAgezM3LCAwfSwgIHszNywgMH0sICB7MzcsIDB9LCAgezM3LCAwfSwgICB7MzcsIDR9LCAgezQxLCAwfSwgICB7NDEsIDB9LA0KKyAgICB7NDEsIDB9LCAgezQxLCAwfSwgIHs0MSwgMH0sICB7NDEsIDB9LCAgIHs0MSwgMn0sICB7NDMsIDB9LCAgIHs0MywgMH0sDQorICAgIHs0MywgMH0sICB7NDMsIDB9LCAgezQzLCAwfSwgIHs0MywgMH0sICAgezQzLCAwfSwgIHs0MywgMH0sICAgezQzLCAwfSwNCisgICAgezQzLCAxM30sIHs1NiwgMH0sICB7NTYsIDB9LCAgezU2LCAxfSwgICB7NTcsIDB9LCAgezU3LCAwfSwgICB7NTcsIDB9LA0KKyAgICB7NTcsIDB9LCAgezU3LCAwfSwgIHs1NywgMH0sICB7NTcsIDB9LCAgIHs1NywgMH0sICB7NTcsIDB9LCAgIHs1NywgMH0sDQorICAgIHs1NywgMH0sICB7NTcsIDF9LCAgezU4LCAwfSwgIHs1OCwgMX0sICAgezU5LCAwfSwgIHs1OSwgMH0sICAgezU5LCAwfSwNCisgICAgezU5LCAxfSwgIHs2MCwgMH0sICB7NjAsIDB9LCAgezYwLCAwfSwgICB7NjAsIDB9LCAgezYwLCAwfSwgICB7NjAsIDB9LA0KKyAgICB7NjAsIDB9LCAgezYwLCAwfSwgIHs2MCwgMX0sICB7NjEsIDB9LCAgIHs2MSwgMH0sICB7NjEsIDB9LCAgIHs2MSwgMX0sDQorICAgIHs2MiwgMH0sICB7NjIsIDJ9LCAgezY0LCAwfSwgIHs2NCwgMH0sICAgezY0LCAwfSwgIHs2NCwgMH0sICAgezY0LCAwfSwNCisgICAgezY0LCAwfSwgIHs2NCwgMH0sICB7NjQsIDB9LCAgezY0LCAwfSwgICB7NjQsIDB9LCAgezY0LCAwfSwgICB7NjQsIDB9LA0KKyAgICB7NjQsIDF9LCAgezY1LCAxfSwgIHs2NiwgMX0sICB7NjcsIDB9LCAgIHs2NywgMX0sICB7NjgsIDB9LCAgIHs2OCwgMH0sDQorICAgIHs2OCwgMH0sICB7NjgsIDB9LCAgezY4LCAwfSwgIHs2OCwgMH0sICAgezY4LCAwfSwgIHs2OCwgMH0sICAgezY4LCA2fSwNCisgICAgezc0LCAwfSwgIHs3NCwgMX0sICB7NzUsIDB9LCAgezc1LCAwfSwgICB7NzUsIDB9LCAgezc1LCAwfSwgICB7NzUsIDB9LA0KKyAgICB7NzUsIDB9LCAgezc1LCAwfSwgIHs3NSwgMH0sICB7NzUsIDB9LCAgIHs3NSwgMX0sICB7NzYsIDB9LCAgIHs3NiwgMH0sDQorICAgIHs3NiwgMH0sICB7NzYsIDB9LCAgezc2LCAwfSwgIHs3NiwgMH0sICAgezc2LCAwfSwgIHs3NiwgMH0sICAgezc2LCAwfSwNCisgICAgezc2LCAwfSwgIHs3NiwgMH0sICB7NzYsIDB9LCAgezc2LCAwfSwgICB7NzYsIDB9LCAgezc2LCAwfSwgICB7NzYsIDB9LA0KKyAgICB7NzYsIDB9LCAgezc2LCAwfSwgIHs3NiwgMH0sICB7NzYsIDB9LCAgIHs3NiwgMH0sICB7NzYsIDB9LCAgIHs3NiwgMH0sDQorICAgIHs3NiwgMH0sICB7NzYsIDB9LCAgezc2LCAwfSwgIHs3NiwgMH0sICAgezc2LCAwfSwgIHs3NiwgMH0sICAgezc2LCAwfSwNCisgICAgezc2LCAwfSwgIHs3NiwgMH0sICB7NzYsIDB9LCAgezc2LCAyfSwgICB7NzgsIDB9LCAgezc4LCAwfSwgICB7NzgsIDB9LA0KKyAgICB7NzgsIDF9LCAgezc5LCAwfSwgIHs3OSwgMH0sICB7NzksIDF9LCAgIHs4MCwgMH0sICB7ODAsIDB9LCAgIHs4MCwgMX0sDQorICAgIHs4MSwgMH0sICB7ODEsIDB9LCAgezgxLCAxfSwgIHs4MiwgMH0sICAgezgyLCAwfSwgIHs4MiwgMH0sICAgezgyLCAwfSwNCisgICAgezgyLCAwfSwgIHs4MiwgMH0sICB7ODIsIDB9LCAgezgyLCAwfSwgICB7ODIsIDB9LCAgezgyLCAwfSwgICB7ODIsIDF9LA0KKyAgICB7ODMsIDB9LCAgezgzLCAwfSwgIHs4MywgMH0sICB7ODMsIDB9LCAgIHs4MywgMH0sICB7ODMsIDB9LCAgIHs4MywgMTF9LA0KKyAgICB7OTQsIDB9LCAgezk0LCAwfSwgIHs5NCwgMH0sICB7OTQsIDB9LCAgIHs5NCwgMH0sICB7OTQsIDExfSwgIHsxMDUsIDEwNn0sDQorICAgIHsyMTEsIDB9LCB7MjExLCAwfSwgezIxMSwgMX0sIHsyMTIsIDB9LCAgezIxMiwgM30sIHsyMTUsIDF9LCAgezIxNiwgMH0sDQorICAgIHsyMTYsIDB9LCB7MjE2LCAwfSwgezIxNiwgMH0sIHsyMTYsIDB9LCAgezIxNiwgMH0sIHsyMTYsIDB9LCAgezIxNiwgMH0sDQorICAgIHsyMTYsIDB9LCB7MjE2LCAwfSwgezIxNiwgMH0sIHsyMTYsIDB9LCAgezIxNiwgMH0sIHsyMTYsIDEyfSwgezIyOCwgMH0sDQorICAgIHsyMjgsIDB9LCB7MjI4LCAwfSwgezIyOCwgMH0sIHsyMjgsIDB9LCAgezIyOCwgMH0sIHsyMjgsIDB9LCAgezIyOCwgMH0sDQorICAgIHsyMjgsIDB9LCB7MjI4LCAyfSwgezIzMCwgMH0sIHsyMzAsIDB9LCAgezIzMCwgMH0sIHsyMzAsIDB9LCAgezIzMCwgMH0sDQorICAgIHsyMzAsIDB9LCB7MjMwLCAwfSwgezIzMCwgMH0sIHsyMzAsIDEwfSwNCit9Ow0KK2V4dGVybiBjb25zdCBGWF9XT1JEIGdfWEZBRWxlbWVudENoaWxkcmVuRGF0YVtdID0gew0KKyAgICBYRkFfRUxFTUVOVF9FeHRyYXMsDQorICAgIFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQsDQorICAgIFhGQV9FTEVNRU5UX0JyZWFrQmVmb3JlLA0KKyAgICBYRkFfRUxFTUVOVF9TdWJmb3JtLA0KKyAgICBYRkFfRUxFTUVOVF9CcmVha0FmdGVyLA0KKyAgICBYRkFfRUxFTUVOVF9BbHdheXNFbWJlZCwNCisgICAgWEZBX0VMRU1FTlRfRGVmYXVsdFR5cGVmYWNlLA0KKyAgICBYRkFfRUxFTUVOVF9OZXZlckVtYmVkLA0KKyAgICBYRkFfRUxFTUVOVF9Tb3VyY2UsDQorICAgIFhGQV9FTEVNRU5UX0VxdWF0ZSwNCisgICAgWEZBX0VMRU1FTlRfRXF1YXRlUmFuZ2UsDQorICAgIFhGQV9FTEVNRU5UX1BzLA0KKyAgICBYRkFfRUxFTUVOVF9QY2wsDQorICAgIFhGQV9FTEVNRU5UX1BkZiwNCisgICAgWEZBX0VMRU1FTlRfWnBsLA0KKyAgICBYRkFfRUxFTUVOVF9MYWJlbFByaW50ZXIsDQorICAgIFhGQV9FTEVNRU5UX1dlYkNsaWVudCwNCisgICAgWEZBX0VMRU1FTlRfU3VibWl0VXJsLA0KKyAgICBYRkFfRUxFTUVOVF9Ecml2ZXIsDQorICAgIFhGQV9FTEVNRU5UX1R5cGVmYWNlLA0KKyAgICBYRkFfRUxFTUVOVF9TdWJqZWN0RE4sDQorICAgIFhGQV9FTEVNRU5UX0NlcnRpZmljYXRlLA0KKyAgICBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0LA0KKyAgICBYRkFfRUxFTUVOVF9BcmVhLA0KKyAgICBYRkFfRUxFTUVOVF9GaWVsZCwNCisgICAgWEZBX0VMRU1FTlRfRXhjbEdyb3VwLA0KKyAgICBYRkFfRUxFTUVOVF9TdWJmb3JtLA0KKyAgICBYRkFfRUxFTUVOVF9EcmF3LA0KKyAgICBYRkFfRUxFTUVOVF9FeE9iamVjdCwNCisgICAgWEZBX0VMRU1FTlRfRW5jcnlwdGlvbk1ldGhvZCwNCisgICAgWEZBX0VMRU1FTlRfUmVmLA0KKyAgICBYRkFfRUxFTUVOVF9FdmVudCwNCisgICAgWEZBX0VMRU1FTlRfU2V0UHJvcGVydHksDQorICAgIFhGQV9FTEVNRU5UX0JpbmRJdGVtcywNCisgICAgWEZBX0VMRU1FTlRfQ29ubmVjdCwNCisgICAgWEZBX0VMRU1FTlRfUGRmLA0KKyAgICBYRkFfRUxFTUVOVF9EZXN0aW5hdGlvbiwNCisgICAgWEZBX0VMRU1FTlRfRXZlbnQsDQorICAgIFhGQV9FTEVNRU5UX1NldFByb3BlcnR5LA0KKyAgICBYRkFfRUxFTUVOVF9GaWVsZCwNCisgICAgWEZBX0VMRU1FTlRfQ29ubmVjdCwNCisgICAgWEZBX0VMRU1FTlRfQWdlbnQsDQorICAgIFhGQV9FTEVNRU5UX1BzTWFwLA0KKyAgICBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0LA0KKyAgICBYRkFfRUxFTUVOVF9CcmVha0JlZm9yZSwNCisgICAgWEZBX0VMRU1FTlRfRXZlbnQsDQorICAgIFhGQV9FTEVNRU5UX0FyZWEsDQorICAgIFhGQV9FTEVNRU5UX1NldFByb3BlcnR5LA0KKyAgICBYRkFfRUxFTUVOVF9GaWVsZCwNCisgICAgWEZBX0VMRU1FTlRfRXhjbEdyb3VwLA0KKyAgICBYRkFfRUxFTUVOVF9TdWJmb3JtLA0KKyAgICBYRkFfRUxFTUVOVF9EcmF3LA0KKyAgICBYRkFfRUxFTUVOVF9FeE9iamVjdCwNCisgICAgWEZBX0VMRU1FTlRfUHJvdG8sDQorICAgIFhGQV9FTEVNRU5UX0Nvbm5lY3QsDQorICAgIFhGQV9FTEVNRU5UX0JyZWFrQWZ0ZXIsDQorICAgIFhGQV9FTEVNRU5UX0xvY2FsZSwNCisgICAgWEZBX0VMRU1FTlRfVGV4dCwNCisgICAgWEZBX0VMRU1FTlRfRm9udCwNCisgICAgWEZBX0VMRU1FTlRfVHJhdmVyc2UsDQorICAgIFhGQV9FTEVNRU5UX01hcCwNCisgICAgWEZBX0VMRU1FTlRfRGlnZXN0TWV0aG9kLA0KKyAgICBYRkFfRUxFTUVOVF9QYWdlU2V0LA0KKyAgICBYRkFfRUxFTUVOVF9QYWdlQXJlYSwNCisgICAgWEZBX0VMRU1FTlRfRW5jb2RpbmcsDQorICAgIFhGQV9FTEVNRU5UX1N1YmZvcm0sDQorICAgIFhGQV9FTEVNRU5UX1N1Ym1pdFVybCwNCisgICAgWEZBX0VMRU1FTlRfQ2VydGlmaWNhdGUsDQorICAgIFhGQV9FTEVNRU5UX0FyZWEsDQorICAgIFhGQV9FTEVNRU5UX0ZpZWxkLA0KKyAgICBYRkFfRUxFTUVOVF9Db250ZW50QXJlYSwNCisgICAgWEZBX0VMRU1FTlRfRXhjbEdyb3VwLA0KKyAgICBYRkFfRUxFTUVOVF9TdWJmb3JtLA0KKyAgICBYRkFfRUxFTUVOVF9EcmF3LA0KKyAgICBYRkFfRUxFTUVOVF9PaWQsDQorICAgIFhGQV9FTEVNRU5UX1JlZiwNCisgICAgWEZBX0VMRU1FTlRfRXhjbHVkZU5TLA0KKyAgICBYRkFfRUxFTUVOVF9UcmFuc2Zvcm0sDQorICAgIFhGQV9FTEVNRU5UX1NldFByb3BlcnR5LA0KKyAgICBYRkFfRUxFTUVOVF9NZXNzYWdlLA0KKyAgICBYRkFfRUxFTUVOVF9Mb2csDQorICAgIFhGQV9FTEVNRU5UX1JlYXNvbiwNCisgICAgWEZBX0VMRU1FTlRfQXJlYSwNCisgICAgWEZBX0VMRU1FTlRfVGV4dCwNCisgICAgWEZBX0VMRU1FTlRfVGltZSwNCisgICAgWEZBX0VMRU1FTlRfRGF0ZVRpbWUsDQorICAgIFhGQV9FTEVNRU5UX0ltYWdlLA0KKyAgICBYRkFfRUxFTUVOVF9EZWNpbWFsLA0KKyAgICBYRkFfRUxFTUVOVF9Cb29sZWFuLA0KKyAgICBYRkFfRUxFTUVOVF9JbnRlZ2VyLA0KKyAgICBYRkFfRUxFTUVOVF9FeERhdGEsDQorICAgIFhGQV9FTEVNRU5UX0RhdGUsDQorICAgIFhGQV9FTEVNRU5UX0Zsb2F0LA0KKyAgICBYRkFfRUxFTUVOVF9FeE9iamVjdCwNCisgICAgWEZBX0VMRU1FTlRfVGV4dCwNCisgICAgWEZBX0VMRU1FTlRfVGltZSwNCisgICAgWEZBX0VMRU1FTlRfRGF0ZVRpbWUsDQorICAgIFhGQV9FTEVNRU5UX0ltYWdlLA0KKyAgICBYRkFfRUxFTUVOVF9EZWNpbWFsLA0KKyAgICBYRkFfRUxFTUVOVF9Cb29sZWFuLA0KKyAgICBYRkFfRUxFTUVOVF9JbnRlZ2VyLA0KKyAgICBYRkFfRUxFTUVOVF9FeERhdGEsDQorICAgIFhGQV9FTEVNRU5UX0RhdGUsDQorICAgIFhGQV9FTEVNRU5UX0Zsb2F0LA0KKyAgICBYRkFfRUxFTUVOVF9FeHRyYXMsDQorICAgIFhGQV9FTEVNRU5UX1VpLA0KKyAgICBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0LA0KKyAgICBYRkFfRUxFTUVOVF9CcmVhaywNCisgICAgWEZBX0VMRU1FTlRfQ2hlY2tCdXR0b24sDQorICAgIFhGQV9FTEVNRU5UX0FyYywNCisgICAgWEZBX0VMRU1FTlRfTWRwLA0KKyAgICBYRkFfRUxFTUVOVF9CcmVha0JlZm9yZSwNCisgICAgWEZBX0VMRU1FTlRfT2lkLA0KKyAgICBYRkFfRUxFTUVOVF9SZWYsDQorICAgIFhGQV9FTEVNRU5UX01hcmdpbiwNCisgICAgWEZBX0VMRU1FTlRfS2V5VXNhZ2UsDQorICAgIFhGQV9FTEVNRU5UX0Nob2ljZUxpc3QsDQorICAgIFhGQV9FTEVNRU5UX1BhcmEsDQorICAgIFhGQV9FTEVNRU5UX0ZpbHRlciwNCisgICAgWEZBX0VMRU1FTlRfRW5jb2RpbmcsDQorICAgIFhGQV9FTEVNRU5UX0V2ZW50LA0KKyAgICBYRkFfRUxFTUVOVF9EZWZhdWx0VWksDQorICAgIFhGQV9FTEVNRU5UX0JhcmNvZGUsDQorICAgIFhGQV9FTEVNRU5UX1N1YmplY3RETnMsDQorICAgIFhGQV9FTEVNRU5UX0lzc3VlcnMsDQorICAgIFhGQV9FTEVNRU5UX0J1dHRvbiwNCisgICAgWEZBX0VMRU1FTlRfRm9ybWF0LA0KKyAgICBYRkFfRUxFTUVOVF9Cb3JkZXIsDQorICAgIFhGQV9FTEVNRU5UX0FyZWEsDQorICAgIFhGQV9FTEVNRU5UX0h5cGhlbmF0aW9uLA0KKyAgICBYRkFfRUxFTUVOVF9UZXh0LA0KKyAgICBYRkFfRUxFTUVOVF9UaW1lLA0KKyAgICBYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZXMsDQorICAgIFhGQV9FTEVNRU5UX1NldFByb3BlcnR5LA0KKyAgICBYRkFfRUxFTUVOVF9EYXRlVGltZSwNCisgICAgWEZBX0VMRU1FTlRfQ29tYiwNCisgICAgWEZBX0VMRU1FTlRfUGF0dGVybiwNCisgICAgWEZBX0VMRU1FTlRfRmllbGQsDQorICAgIFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhLA0KKyAgICBYRkFfRUxFTUVOVF9Tb2xpZCwNCisgICAgWEZBX0VMRU1FTlRfRWRnZSwNCisgICAgWEZBX0VMRU1FTlRfU3RpcHBsZSwNCisgICAgWEZBX0VMRU1FTlRfRXhjbEdyb3VwLA0KKyAgICBYRkFfRUxFTUVOVF9Ub29sVGlwLA0KKyAgICBYRkFfRUxFTUVOVF9SZWFzb24sDQorICAgIFhGQV9FTEVNRU5UX0V4ZWN1dGUsDQorICAgIFhGQV9FTEVNRU5UX0RhdGVUaW1lRWRpdCwNCisgICAgWEZBX0VMRU1FTlRfSW1hZ2UsDQorICAgIFhGQV9FTEVNRU5UX1RpbWVTdGFtcCwNCisgICAgWEZBX0VMRU1FTlRfRGVjaW1hbCwNCisgICAgWEZBX0VMRU1FTlRfU3ViZm9ybSwNCisgICAgWEZBX0VMRU1FTlRfSGFuZGxlciwNCisgICAgWEZBX0VMRU1FTlRfQm9vbGVhbiwNCisgICAgWEZBX0VMRU1FTlRfTWVzc2FnZSwNCisgICAgWEZBX0VMRU1FTlRfQXNzaXN0LA0KKyAgICBYRkFfRUxFTUVOVF9QaWN0dXJlLA0KKyAgICBYRkFfRUxFTUVOVF9UcmF2ZXJzYWwsDQorICAgIFhGQV9FTEVNRU5UX0Nvcm5lciwNCisgICAgWEZBX0VMRU1FTlRfQ29sb3IsDQorICAgIFhGQV9FTEVNRU5UX0tlZXAsDQorICAgIFhGQV9FTEVNRU5UX0ltYWdlRWRpdCwNCisgICAgWEZBX0VMRU1FTlRfVmFsaWRhdGUsDQorICAgIFhGQV9FTEVNRU5UX0RpZ2VzdE1ldGhvZHMsDQorICAgIFhGQV9FTEVNRU5UX1BhZ2VTZXQsDQorICAgIFhGQV9FTEVNRU5UX0ludGVnZXIsDQorICAgIFhGQV9FTEVNRU5UX1RyYXZlcnNlLA0KKyAgICBYRkFfRUxFTUVOVF9FbmNvZGluZ3MsDQorICAgIFhGQV9FTEVNRU5UX1NpZ25pbmcsDQorICAgIFhGQV9FTEVNRU5UX1NjcmlwdCwNCisgICAgWEZBX0VMRU1FTlRfUGFzc3dvcmRFZGl0LA0KKyAgICBYRkFfRUxFTUVOVF9OdW1lcmljRWRpdCwNCisgICAgWEZBX0VMRU1FTlRfUGFnZUFyZWEsDQorICAgIFhGQV9FTEVNRU5UX09pZHMsDQorICAgIFhGQV9FTEVNRU5UX1NpZ25hdHVyZSwNCisgICAgWEZBX0VMRU1FTlRfQ2FwdGlvbiwNCisgICAgWEZBX0VMRU1FTlRfRXhEYXRhLA0KKyAgICBYRkFfRUxFTUVOVF9NYW5pZmVzdCwNCisgICAgWEZBX0VMRU1FTlRfT3ZlcmZsb3csDQorICAgIFhGQV9FTEVNRU5UX0xpbmVhciwNCisgICAgWEZBX0VMRU1FTlRfRGlnZXN0TWV0aG9kLA0KKyAgICBYRkFfRUxFTUVOVF9NZWRpdW0sDQorICAgIFhGQV9FTEVNRU5UX1RleHRFZGl0LA0KKyAgICBYRkFfRUxFTUVOVF9TaWduRGF0YSwNCisgICAgWEZBX0VMRU1FTlRfUmVjdGFuZ2xlLA0KKyAgICBYRkFfRUxFTUVOVF9EYXRlLA0KKyAgICBYRkFfRUxFTUVOVF9EZXNjLA0KKyAgICBYRkFfRUxFTUVOVF9FbmNyeXB0LA0KKyAgICBYRkFfRUxFTUVOVF9EcmF3LA0KKyAgICBYRkFfRUxFTUVOVF9TcGVhaywNCisgICAgWEZBX0VMRU1FTlRfUmVhc29ucywNCisgICAgWEZBX0VMRU1FTlRfQXBwZWFyYW5jZUZpbHRlciwNCisgICAgWEZBX0VMRU1FTlRfRmlsbCwNCisgICAgWEZBX0VMRU1FTlRfRm9udCwNCisgICAgWEZBX0VMRU1FTlRfQ2VydGlmaWNhdGUsDQorICAgIFhGQV9FTEVNRU5UX0Zsb2F0LA0KKyAgICBYRkFfRUxFTUVOVF9WYWx1ZSwNCisgICAgWEZBX0VMRU1FTlRfQm9va2VuZCwNCisgICAgWEZBX0VMRU1FTlRfRXhPYmplY3QsDQorICAgIFhGQV9FTEVNRU5UX0JpbmRJdGVtcywNCisgICAgWEZBX0VMRU1FTlRfQ2FsY3VsYXRlLA0KKyAgICBYRkFfRUxFTUVOVF9FeHRyYXMsDQorICAgIFhGQV9FTEVNRU5UX0Nvbm5lY3QsDQorICAgIFhGQV9FTEVNRU5UX1N1Ym1pdCwNCisgICAgWEZBX0VMRU1FTlRfU3ViamVjdEROLA0KKyAgICBYRkFfRUxFTUVOVF9SYWRpYWwsDQorICAgIFhGQV9FTEVNRU5UX1ZhcmlhYmxlcywNCisgICAgWEZBX0VMRU1FTlRfTG9ja0RvY3VtZW50LA0KKyAgICBYRkFfRUxFTUVOVF9CcmVha0FmdGVyLA0KKyAgICBYRkFfRUxFTUVOVF9MaW5lLA0KKyAgICBYRkFfRUxFTUVOVF9PY2N1ciwNCisgICAgWEZBX0VMRU1FTlRfSXRlbXMsDQorICAgIFhGQV9FTEVNRU5UX0V4dHJhcywNCisgICAgWEZBX0VMRU1FTlRfV3NkbENvbm5lY3Rpb24sDQorICAgIFhGQV9FTEVNRU5UX1hzZENvbm5lY3Rpb24sDQorICAgIFhGQV9FTEVNRU5UX1htbENvbm5lY3Rpb24sDQorICAgIFhGQV9FTEVNRU5UX1NpZ25EYXRhLA0KKyAgICBYRkFfRUxFTUVOVF9UZXh0LA0KKyAgICBYRkFfRUxFTUVOVF9UaW1lLA0KKyAgICBYRkFfRUxFTUVOVF9EYXRlVGltZSwNCisgICAgWEZBX0VMRU1FTlRfSW1hZ2UsDQorICAgIFhGQV9FTEVNRU5UX0RlY2ltYWwsDQorICAgIFhGQV9FTEVNRU5UX0Jvb2xlYW4sDQorICAgIFhGQV9FTEVNRU5UX0ludGVnZXIsDQorICAgIFhGQV9FTEVNRU5UX1NjcmlwdCwNCisgICAgWEZBX0VMRU1FTlRfRXhEYXRhLA0KKyAgICBYRkFfRUxFTUVOVF9NYW5pZmVzdCwNCisgICAgWEZBX0VMRU1FTlRfRGF0ZSwNCisgICAgWEZBX0VMRU1FTlRfRmxvYXQsDQorICAgIFhGQV9FTEVNRU5UX0NvbW1hbmQsDQorICAgIFhGQV9FTEVNRU5UX0JpbmQsDQorICAgIFhGQV9FTEVNRU5UX1RleHQsDQorICAgIFhGQV9FTEVNRU5UX1RpbWUsDQorICAgIFhGQV9FTEVNRU5UX0RhdGVUaW1lLA0KKyAgICBYRkFfRUxFTUVOVF9JbWFnZSwNCisgICAgWEZBX0VMRU1FTlRfRGVjaW1hbCwNCisgICAgWEZBX0VMRU1FTlRfQm9vbGVhbiwNCisgICAgWEZBX0VMRU1FTlRfSW50ZWdlciwNCisgICAgWEZBX0VMRU1FTlRfRXhEYXRhLA0KKyAgICBYRkFfRUxFTUVOVF9EYXRlLA0KKyAgICBYRkFfRUxFTUVOVF9GbG9hdCwNCit9Ow0KK2V4dGVybiBjb25zdCBYRkFfRUxFTUVOVEhJRVJBUkNIWSBnX1hGQUVsZW1lbnRBdHRyaWJ1dGVJbmRleFtdID0gew0KKyAgICB7MCwgM30sICAgIHszLCAyfSwgICAgezUsIDN9LCAgICB7OCwgMTB9LCAgIHsxOCwgMn0sICAgezIwLCA2fSwgICB7MjYsIDJ9LA0KKyAgICB7MjgsIDF9LCAgIHsyOSwgMTN9LCAgezQyLCAyfSwgICB7NDQsIDF9LCAgIHs0NSwgMn0sICAgezQ3LCAyfSwgICB7NDksIDd9LA0KKyAgICB7NTYsIDB9LCAgIHs1NiwgNH0sICAgezYwLCAyfSwgICB7NjIsIDd9LCAgIHs2OSwgMH0sICAgezY5LCAwfSwgICB7NjksIDJ9LA0KKyAgICB7NzEsIDJ9LCAgIHs3MywgOH0sICAgezgxLCA1fSwgICB7ODYsIDh9LCAgIHs5NCwgNH0sICAgezk4LCAzfSwgICB7MTAxLCAzfSwNCisgICAgezEwNCwgM30sICB7MTA3LCA2fSwgIHsxMTMsIDJ9LCAgezExNSwgMn0sICB7MTE3LCAyfSwgIHsxMTksIDJ9LCAgezEyMSwgM30sDQorICAgIHsxMjQsIDJ9LCAgezEyNiwgN30sICB7MTMzLCAxM30sIHsxNDYsIDJ9LCAgezE0OCwgNn0sICB7MTU0LCAyfSwgIHsxNTYsIDN9LA0KKyAgICB7MTU5LCAxfSwgIHsxNjAsIDE3fSwgezE3NywgMn0sICB7MTc5LCAyfSwgIHsxODEsIDZ9LCAgezE4NywgMn0sICB7MTg5LCAyfSwNCisgICAgezE5MSwgM30sICB7MTk0LCA3fSwgIHsyMDEsIDJ9LCAgezIwMywgM30sICB7MjA2LCAwfSwgIHsyMDYsIDIxfSwgezIyNywgMX0sDQorICAgIHsyMjgsIDN9LCAgezIzMSwgMn0sICB7MjMzLCAwfSwgIHsyMzMsIDJ9LCAgezIzNSwgMn0sICB7MjM3LCA2fSwgIHsyNDMsIDB9LA0KKyAgICB7MjQzLCA0fSwgIHsyNDcsIDR9LCAgezI1MSwgMH0sICB7MjUxLCAyfSwgIHsyNTMsIDJ9LCAgezI1NSwgMH0sICB7MjU1LCAwfSwNCisgICAgezI1NSwgMn0sICB7MjU3LCAyfSwgIHsyNTksIDR9LCAgezI2MywgM30sICB7MjY2LCA3fSwgIHsyNzMsIDEwfSwgezI4MywgOX0sDQorICAgIHsyOTIsIDZ9LCAgezI5OCwgNH0sICB7MzAyLCAyfSwgIHszMDQsIDJ9LCAgezMwNiwgNn0sICB7MzEyLCA0fSwgIHszMTYsIDN9LA0KKyAgICB7MzE5LCAyfSwgIHszMjEsIDJ9LCAgezMyMywgNH0sICB7MzI3LCA0fSwgIHszMzEsIDR9LCAgezMzNSwgNH0sICB7MzM5LCAyfSwNCisgICAgezM0MSwgMn0sICB7MzQzLCAyfSwgIHszNDUsIDIyfSwgezM2NywgM30sICB7MzcwLCAyfSwgIHszNzIsIDJ9LCAgezM3NCwgMn0sDQorICAgIHszNzYsIDl9LCAgezM4NSwgMH0sICB7Mzg1LCA0fSwgIHszODksIDN9LCAgezM5MiwgMH0sICB7MzkyLCAyfSwgIHszOTQsIDd9LA0KKyAgICB7NDAxLCA0fSwgIHs0MDUsIDJ9LCAgezQwNywgNH0sICB7NDExLCAwfSwgIHs0MTEsIDIxfSwgezQzMiwgNH0sICB7NDM2LCAzfSwNCisgICAgezQzOSwgNH0sICB7NDQzLCA2fSwgIHs0NDksIDJ9LCAgezQ1MSwgNX0sICB7NDU2LCAyfSwgIHs0NTgsIDh9LCAgezQ2NiwgMX0sDQorICAgIHs0NjcsIDJ9LCAgezQ2OSwgMn0sICB7NDcxLCA1fSwgIHs0NzYsIDB9LCAgezQ3NiwgMn0sICB7NDc4LCAyfSwgIHs0ODAsIDZ9LA0KKyAgICB7NDg2LCAyNn0sIHs1MTIsIDR9LCAgezUxNiwgMn0sICB7NTE4LCAyfSwgIHs1MjAsIDR9LCAgezUyNCwgMH0sICB7NTI0LCAyfSwNCisgICAgezUyNiwgMn0sICB7NTI4LCAyfSwgIHs1MzAsIDJ9LCAgezUzMiwgNX0sICB7NTM3LCAyfSwgIHs1MzksIDN9LCAgezU0MiwgMn0sDQorICAgIHs1NDQsIDR9LCAgezU0OCwgNX0sICB7NTUzLCAyfSwgIHs1NTUsIDB9LCAgezU1NSwgMn0sICB7NTU3LCA0fSwgIHs1NjEsIDV9LA0KKyAgICB7NTY2LCAzfSwgIHs1NjksIDJ9LCAgezU3MSwgM30sICB7NTc0LCAwfSwgIHs1NzQsIDJ9LCAgezU3NiwgOX0sICB7NTg1LCAyfSwNCisgICAgezU4NywgNX0sICB7NTkyLCA2fSwgIHs1OTgsIDV9LCAgezYwMywgNH0sICB7NjA3LCA0fSwgIHs2MTEsIDh9LCAgezYxOSwgNH0sDQorICAgIHs2MjMsIDB9LCAgezYyMywgN30sICB7NjMwLCA0fSwgIHs2MzQsIDR9LCAgezYzOCwgNX0sICB7NjQzLCAyfSwgIHs2NDUsIDJ9LA0KKyAgICB7NjQ3LCA0fSwgIHs2NTEsIDR9LCAgezY1NSwgMn0sICB7NjU3LCAyfSwgIHs2NTksIDF9LCAgezY2MCwgMn0sICB7NjYyLCA1fSwNCisgICAgezY2NywgNH0sICB7NjcxLCAzfSwgIHs2NzQsIDJ9LCAgezY3NiwgMn0sICB7Njc4LCA0fSwgIHs2ODIsIDB9LCAgezY4MiwgOX0sDQorICAgIHs2OTEsIDJ9LCAgezY5MywgMn0sICB7Njk1LCA1fSwgIHs3MDAsIDR9LCAgezcwNCwgM30sICB7NzA3LCAyfSwgIHs3MDksIDEwfSwNCisgICAgezcxOSwgMn0sICB7NzIxLCA0fSwgIHs3MjUsIDR9LCAgezcyOSwgMn0sICB7NzMxLCA2fSwgIHs3MzcsIDJ9LCAgezczOSwgMn0sDQorICAgIHs3NDEsIDl9LCAgezc1MCwgMX0sICB7NzUxLCA0fSwgIHs3NTUsIDN9LCAgezc1OCwgNX0sICB7NzYzLCA2fSwgIHs3NjksIDR9LA0KKyAgICB7NzczLCAxfSwgIHs3NzQsIDR9LCAgezc3OCwgMH0sICB7Nzc4LCAzfSwgIHs3ODEsIDF9LCAgezc4MiwgNX0sICB7Nzg3LCAxMH0sDQorICAgIHs3OTcsIDd9LCAgezgwNCwgM30sICB7ODA3LCAyfSwgIHs4MDksIDV9LCAgezgxNCwgMn0sICB7ODE2LCAwfSwgIHs4MTYsIDJ9LA0KKyAgICB7ODE4LCAyfSwgIHs4MjAsIDJ9LCAgezgyMiwgNn0sICB7ODI4LCAyfSwgIHs4MzAsIDF9LCAgezgzMSwgMn0sICB7ODMzLCAyfSwNCisgICAgezgzNSwgOH0sICB7ODQzLCAyfSwgIHs4NDUsIDR9LCAgezg0OSwgNH0sICB7ODUzLCA0fSwgIHs4NTcsIDJ9LCAgezg1OSwgMn0sDQorICAgIHs4NjEsIDJ9LCAgezg2MywgM30sICB7ODY2LCAyfSwgIHs4NjgsIDJ9LCAgezg3MCwgNH0sICB7ODc0LCAzfSwgIHs4NzcsIDV9LA0KKyAgICB7ODgyLCAyMH0sIHs5MDIsIDJ9LCAgezkwNCwgMH0sICB7OTA0LCAyfSwgIHs5MDYsIDZ9LCAgezkxMiwgMX0sICB7OTEzLCAyfSwNCisgICAgezkxNSwgMX0sICB7OTE2LCAyfSwgIHs5MTgsIDR9LCAgezkyMiwgMn0sICB7OTI0LCAyfSwgIHs5MjYsIDR9LCAgezkzMCwgNH0sDQorICAgIHs5MzQsIDIwfSwgezk1NCwgMX0sICB7OTU1LCAyfSwgIHs5NTcsIDR9LCAgezk2MSwgNH0sICB7OTY1LCAyfSwgIHs5NjcsIDJ9LA0KKyAgICB7OTY5LCA0fSwgIHs5NzMsIDJ9LCAgezk3NSwgMH0sICB7OTc1LCAyfSwgIHs5NzcsIDV9LCAgezk4MiwgNX0sICB7OTg3LCA4fSwNCisgICAgezk5NSwgMn0sICB7OTk3LCAyfSwgIHs5OTksIDR9LCAgezEwMDMsIDR9LCB7MTAwNywgMn0sIHsxMDA5LCA0fSwgezEwMTMsIDB9LA0KKyAgICB7MTAxMywgMX0sIHsxMDE0LCAyfSwgezEwMTYsIDl9LCB7MTAyNSwgMn0sIHsxMDI3LCAwfSwgezEwMjcsIDh9LCB7MTAzNSwgMn0sDQorICAgIHsxMDM3LCAyfSwgezEwMzksIDB9LCB7MTAzOSwgNH0sIHsxMDQzLCAyfSwgezEwNDUsIDB9LCB7MTA0NSwgMn0sIHsxMDQ3LCAzfSwNCisgICAgezEwNTAsIDJ9LCB7MTA1MiwgNX0sIHsxMDU3LCAyfSwgezEwNTksIDJ9LCB7MTA2MSwgNH0sIHsxMDY1LCAzfSwgezEwNjgsIDB9LA0KKyAgICB7MTA2OCwgNH0sIHsxMDcyLCAyfSwgezEwNzQsIDJ9LCB7MTA3NiwgM30sIHsxMDc5LCA0fSwgezEwODMsIDh9LCB7MTA5MSwgNX0sDQorICAgIHsxMDk2LCAwfSwgezEwOTYsIDR9LCB7MTEwMCwgNn0sIHsxMTA2LCAyfSwgezExMDgsIDF9LCB7MTEwOSwgMn0sIHsxMTExLCAyfSwNCisgICAgezExMTMsIDJ9LCB7MTExNSwgMX0sIHsxMTE2LCAyfSwgezExMTgsIDd9LA0KK307DQorZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ19YRkFFbGVtZW50QXR0cmlidXRlRGF0YVtdID0gew0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX01heCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfRW9mQWN0aW9uLA0KKyAgICBYRkFfQVRUUklCVVRFX0N1cnNvclR5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9ja1R5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfQm9mQWN0aW9uLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfQ3Vyc29yTG9jYXRpb24sDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1JlbGF0aW9uLA0KKyAgICBYRkFfQVRUUklCVVRFX1JlbGV2YW50LA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfQmVmb3JlVGFyZ2V0LA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RhcmdldCwNCisgICAgWEZBX0FUVFJJQlVURV9PdmVyZmxvd0xlYWRlciwNCisgICAgWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RyYWlsZXIsDQorICAgIFhGQV9BVFRSSUJVVEVfU3RhcnROZXcsDQorICAgIFhGQV9BVFRSSUJVVEVfQm9va2VuZFRyYWlsZXIsDQorICAgIFhGQV9BVFRSSUJVVEVfQWZ0ZXIsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9Cb29rZW5kTGVhZGVyLA0KKyAgICBYRkFfQVRUUklCVVRFX0FmdGVyVGFyZ2V0LA0KKyAgICBYRkFfQVRUUklCVVRFX0JlZm9yZSwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9BbGxvd05ldXRyYWwsDQorICAgIFhGQV9BVFRSSUJVVEVfTWFyaywNCisgICAgWEZBX0FUVFJJQlVURV9TaGFwZSwNCisgICAgWEZBX0FUVFJJQlVURV9TaXplLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1N0YXJ0QW5nbGUsDQorICAgIFhGQV9BVFRSSUJVVEVfU3dlZXBBbmdsZSwNCisgICAgWEZBX0FUVFJJQlVURV9DaXJjdWxhciwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0hhbmQsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9CaW5kLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Gcm9tLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1NpZ25hdHVyZVR5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9QZXJtaXNzaW9ucywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfU3RhcnROZXcsDQorICAgIFhGQV9BVFRSSUJVVEVfVHJhaWxlciwNCisgICAgWEZBX0FUVFJJQlVURV9UYXJnZXRUeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfVGFyZ2V0LA0KKyAgICBYRkFfQVRUUklCVVRFX0xlYWRlciwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfVGltZVN0YW1wLA0KKyAgICBYRkFfQVRUUklCVVRFX1V1aWQsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfTGVmdEluc2V0LA0KKyAgICBYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0LA0KKyAgICBYRkFfQVRUUklCVVRFX1RvcEluc2V0LA0KKyAgICBYRkFfQVRUUklCVVRFX1JpZ2h0SW5zZXQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfTm9uUmVwdWRpYXRpb24sDQorICAgIFhGQV9BVFRSSUJVVEVfRW5jaXBoZXJPbmx5LA0KKyAgICBYRkFfQVRUUklCVVRFX1R5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfRGlnaXRhbFNpZ25hdHVyZSwNCisgICAgWEZBX0FUVFJJQlVURV9DcmxTaWduLA0KKyAgICBYRkFfQVRUUklCVVRFX0tleUFncmVlbWVudCwNCisgICAgWEZBX0FUVFJJQlVURV9LZXlFbmNpcGhlcm1lbnQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EYXRhRW5jaXBoZXJtZW50LA0KKyAgICBYRkFfQVRUUklCVVRFX0tleUNlcnRTaWduLA0KKyAgICBYRkFfQVRUUklCVVRFX0RlY2lwaGVyT25seSwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX09wZW4sDQorICAgIFhGQV9BVFRSSUJVVEVfQ29tbWl0T24sDQorICAgIFhGQV9BVFRSSUJVVEVfVGV4dEVudHJ5LA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfSEFsaWduLA0KKyAgICBYRkFfQVRUUklCVVRFX1RleHRJbmRlbnQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1dpZG93cywNCisgICAgWEZBX0FUVFJJQlVURV9NYXJnaW5SaWdodCwNCisgICAgWEZBX0FUVFJJQlVURV9NYXJnaW5MZWZ0LA0KKyAgICBYRkFfQVRUUklCVVRFX1JhZGl4T2Zmc2V0LA0KKyAgICBYRkFfQVRUUklCVVRFX1ByZXNlcnZlLA0KKyAgICBYRkFfQVRUUklCVVRFX1NwYWNlQmVsb3csDQorICAgIFhGQV9BVFRSSUJVVEVfVkFsaWduLA0KKyAgICBYRkFfQVRUUklCVVRFX1RhYkRlZmF1bHQsDQorICAgIFhGQV9BVFRSSUJVVEVfVGFiU3RvcHMsDQorICAgIFhGQV9BVFRSSUJVVEVfT3JwaGFucywNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0xpbmVIZWlnaHQsDQorICAgIFhGQV9BVFRSSUJVVEVfU3BhY2VBYm92ZSwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1ZlcnNpb24sDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9BZGRSZXZvY2F0aW9uSW5mbywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfUmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9MaXN0ZW4sDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9BY3Rpdml0eSwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfRGF0YVJvd0NvdW50LA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9EYXRhUHJlcCwNCisgICAgWEZBX0FUVFJJQlVURV9UeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX1RleHRMb2NhdGlvbiwNCisgICAgWEZBX0FUVFJJQlVURV9Nb2R1bGVXaWR0aCwNCisgICAgWEZBX0FUVFJJQlVURV9QcmludENoZWNrRGlnaXQsDQorICAgIFhGQV9BVFRSSUJVVEVfTW9kdWxlSGVpZ2h0LA0KKyAgICBYRkFfQVRUUklCVVRFX1N0YXJ0Q2hhciwNCisgICAgWEZBX0FUVFJJQlVURV9UcnVuY2F0ZSwNCisgICAgWEZBX0FUVFJJQlVURV9XaWRlTmFycm93UmF0aW8sDQorICAgIFhGQV9BVFRSSUJVVEVfRXJyb3JDb3JyZWN0aW9uTGV2ZWwsDQorICAgIFhGQV9BVFRSSUJVVEVfVXBzTW9kZSwNCisgICAgWEZBX0FUVFJJQlVURV9DaGVja3N1bSwNCisgICAgWEZBX0FUVFJJQlVURV9DaGFyRW5jb2RpbmcsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EYXRhQ29sdW1uQ291bnQsDQorICAgIFhGQV9BVFRSSUJVVEVfUm93Q29sdW1uUmF0aW8sDQorICAgIFhGQV9BVFRSSUJVVEVfRGF0YUxlbmd0aCwNCisgICAgWEZBX0FUVFJJQlVURV9FbmRDaGFyLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfRm9ybWF0LA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9PdXRwdXQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JbnB1dCwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9UeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9EYXRhRGVzY3JpcHRpb24sDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSGlnaGxpZ2h0LA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX0JyZWFrLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwNCisgICAgWEZBX0FUVFJJQlVURV9SZWxldmFudCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0hhbmQsDQorICAgIFhGQV9BVFRSSUJVVEVfWCwNCisgICAgWEZBX0FUVFJJQlVURV9ZLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX0xldmVsLA0KKyAgICBYRkFfQVRUUklCVVRFX1JlbGV2YW50LA0KKyAgICBYRkFfQVRUUklCVVRFX0NvbFNwYW4sDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Xb3JkQ2hhcmFjdGVyQ291bnQsDQorICAgIFhGQV9BVFRSSUJVVEVfSHlwaGVuYXRlLA0KKyAgICBYRkFfQVRUUklCVVRFX0V4Y2x1ZGVJbml0aWFsQ2FwLA0KKyAgICBYRkFfQVRUUklCVVRFX1B1c2hDaGFyYWN0ZXJDb3VudCwNCisgICAgWEZBX0FUVFJJQlVURV9SZW1haW5DaGFyYWN0ZXJDb3VudCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0V4Y2x1ZGVBbGxDYXBzLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfUmlkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9NYXhDaGFycywNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9VcmwsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX0NyZWRlbnRpYWxTZXJ2ZXJQb2xpY3ksDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9VcmxQb2xpY3ksDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1R5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9SZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfQ29ubmVjdGlvbiwNCisgICAgWEZBX0FUVFJJQlVURV9UYXJnZXQsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9YLA0KKyAgICBYRkFfQVRUUklCVVRFX1ksDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX051bWJlck9mQ2VsbHMsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0gsDQorICAgIFhGQV9BVFRSSUJVVEVfVywNCisgICAgWEZBX0FUVFJJQlVURV9YLA0KKyAgICBYRkFfQVRUUklCVVRFX1ksDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfSEFsaWduLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX0FjY2VzcywNCisgICAgWEZBX0FUVFJJQlVURV9Sb3RhdGUsDQorICAgIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVkFsaWduLA0KKyAgICBYRkFfQVRUUklCVVRFX01heEgsDQorICAgIFhGQV9BVFRSSUJVVEVfTWF4VywNCisgICAgWEZBX0FUVFJJQlVURV9NaW5ILA0KKyAgICBYRkFfQVRUUklCVVRFX01pblcsDQorICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsDQorICAgIFhGQV9BVFRSSUJVVEVfQ29sU3BhbiwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2FsZSwNCisgICAgWEZBX0FUVFJJQlVURV9BbmNob3JUeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX0FjY2Vzc0tleSwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9ILA0KKyAgICBYRkFfQVRUUklCVVRFX1csDQorICAgIFhGQV9BVFRSSUJVVEVfWCwNCisgICAgWEZBX0FUVFJJQlVURV9ZLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1JlbGV2YW50LA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfQ2FwLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9TdHJva2UsDQorICAgIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVGhpY2tuZXNzLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1JhdGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfU291cmNlQmVsb3csDQorICAgIFhGQV9BVFRSSUJVVEVfT3V0cHV0QmVsb3csDQorICAgIFhGQV9BVFRSSUJVVEVfU291cmNlQWJvdmUsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9ILA0KKyAgICBYRkFfQVRUUklCVVRFX1csDQorICAgIFhGQV9BVFRSSUJVVEVfWCwNCisgICAgWEZBX0FUVFJJQlVURV9ZLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX0hBbGlnbiwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9BY2Nlc3MsDQorICAgIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVkFsaWduLA0KKyAgICBYRkFfQVRUUklCVVRFX01heEgsDQorICAgIFhGQV9BVFRSSUJVVEVfTWF4VywNCisgICAgWEZBX0FUVFJJQlVURV9NaW5ILA0KKyAgICBYRkFfQVRUUklCVVRFX01pblcsDQorICAgIFhGQV9BVFRSSUJVVEVfTGF5b3V0LA0KKyAgICBYRkFfQVRUUklCVVRFX1JlbGV2YW50LA0KKyAgICBYRkFfQVRUUklCVVRFX0NvbFNwYW4sDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9BbmNob3JUeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX0FjY2Vzc0tleSwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9SaWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9TY29wZSwNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX0Nvbm5lY3Rpb24sDQorICAgIFhGQV9BVFRSSUJVVEVfUnVuQXQsDQorICAgIFhGQV9BVFRSSUJVVEVfRXhlY3V0ZVR5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfUGlja2VyLA0KKyAgICBYRkFfQVRUUklCVVRFX0hTY3JvbGxQb2xpY3ksDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX1RyYW5zZmVyRW5jb2RpbmcsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9Bc3BlY3QsDQorICAgIFhGQV9BVFRSSUJVVEVfSHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9WYWx1ZSwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9UeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX1NlcnZlciwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfRnJhY0RpZ2l0cywNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0xlYWREaWdpdHMsDQorICAgIFhGQV9BVFRSSUJVVEVfSCwNCisgICAgWEZBX0FUVFJJQlVURV9XLA0KKyAgICBYRkFfQVRUUklCVVRFX1gsDQorICAgIFhGQV9BVFRSSUJVVEVfWSwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9IQWxpZ24sDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfQWxsb3dNYWNybywNCisgICAgWEZBX0FUVFJJQlVURV9Db2x1bW5XaWR0aHMsDQorICAgIFhGQV9BVFRSSUJVVEVfQWNjZXNzLA0KKyAgICBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1ZBbGlnbiwNCisgICAgWEZBX0FUVFJJQlVURV9NYXhILA0KKyAgICBYRkFfQVRUUklCVVRFX01heFcsDQorICAgIFhGQV9BVFRSSUJVVEVfTWluSCwNCisgICAgWEZBX0FUVFJJQlVURV9NaW5XLA0KKyAgICBYRkFfQVRUUklCVVRFX0xheW91dCwNCisgICAgWEZBX0FUVFJJQlVURV9SZWxldmFudCwNCisgICAgWEZBX0FUVFJJQlVURV9NZXJnZU1vZGUsDQorICAgIFhGQV9BVFRSSUJVVEVfQ29sU3BhbiwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2FsZSwNCisgICAgWEZBX0FUVFJJQlVURV9BbmNob3JUeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX1Jlc3RvcmVTdGF0ZSwNCisgICAgWEZBX0FUVFJJQlVURV9TY29wZSwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1R5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVGltZW91dCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9Nb2RlLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfUm9sZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9TdHJva2UsDQorICAgIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsDQorICAgIFhGQV9BVFRSSUJVVEVfSW52ZXJ0ZWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVGhpY2tuZXNzLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSm9pbiwNCisgICAgWEZBX0FUVFJJQlVURV9SYWRpdXMsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9DU3BhY2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9WYWx1ZSwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OZXh0LA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9QcmV2aW91cywNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0ludGFjdCwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Db21tYW5kVHlwZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfRGF0YSwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfU2NyaXB0VGVzdCwNCisgICAgWEZBX0FUVFJJQlVURV9OdWxsVGVzdCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfRm9ybWF0VGVzdCwNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9UeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfUmVsYXRpb24sDQorICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsDQorICAgIFhGQV9BVFRSSUJVVEVfRHVwbGV4SW1wb3NpdGlvbiwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9UbywNCisgICAgWEZBX0FUVFJJQlVURV9Gb3JjZSwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0Zyb20sDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX1ZhbHVlLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfRGF0YURlc2NyaXB0aW9uLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1JlZiwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfT3BlcmF0aW9uLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1R5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0Jhc2VQcm9maWxlLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX1J1bkF0LA0KKyAgICBYRkFfQVRUUklCVVRFX0JpbmRpbmcsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfUGFzc3dvcmRDaGFyLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSFNjcm9sbFBvbGljeSwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9IU2Nyb2xsUG9saWN5LA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9QYWdlUG9zaXRpb24sDQorICAgIFhGQV9BVFRSSUJVVEVfT2RkT3JFdmVuLA0KKyAgICBYRkFfQVRUUklCVVRFX1JlbGV2YW50LA0KKyAgICBYRkFfQVRUUklCVVRFX0luaXRpYWxOdW1iZXIsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9OdW1iZXJlZCwNCisgICAgWEZBX0FUVFJJQlVURV9CbGFua09yTm90QmxhbmssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9UeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1R5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1Jlc2VydmUsDQorICAgIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9QbGFjZW1lbnQsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1JpZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX01heExlbmd0aCwNCisgICAgWEZBX0FUVFJJQlVURV9IcmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0FiYnIsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX1dyaXRpbmdTY3JpcHQsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9BY3Rpb24sDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVHJhaWxlciwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX1RhcmdldCwNCisgICAgWEZBX0FUVFJJQlVURV9MZWFkZXIsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1R5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9UbywNCisgICAgWEZBX0FUVFJJQlVURV9Vbmljb2RlUmFuZ2UsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Gcm9tLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVHJheU91dCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfT3JpZW50YXRpb24sDQorICAgIFhGQV9BVFRSSUJVVEVfSW1hZ2luZ0JCb3gsDQorICAgIFhGQV9BVFRSSUJVVEVfU2hvcnQsDQorICAgIFhGQV9BVFRSSUJVVEVfVHJheUluLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfU3RvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfTG9uZywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9WU2Nyb2xsUG9saWN5LA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9BbGxvd1JpY2hUZXh0LA0KKyAgICBYRkFfQVRUUklCVVRFX011bHRpTGluZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0hTY3JvbGxQb2xpY3ksDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9NYXhFbnRyaWVzLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfQ29udGFpbnMsDQorICAgIFhGQV9BVFRSSUJVVEVfVmFsdWUsDQorICAgIFhGQV9BVFRSSUJVVEVfSXNOdWxsLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9EYXRhRGVzY3JpcHRpb24sDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1JlZiwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfT3BlcmF0aW9uLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfVGFyZ2V0LA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9SZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX1RyYW5zZmVyRW5jb2RpbmcsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9NYXRjaCwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9IYW5kLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9ILA0KKyAgICBYRkFfQVRUUklCVVRFX1csDQorICAgIFhGQV9BVFRSSUJVVEVfWCwNCisgICAgWEZBX0FUVFJJQlVURV9ZLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX0hBbGlnbiwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Sb3RhdGUsDQorICAgIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVkFsaWduLA0KKyAgICBYRkFfQVRUUklCVVRFX01heEgsDQorICAgIFhGQV9BVFRSSUJVVEVfTWF4VywNCisgICAgWEZBX0FUVFJJQlVURV9NaW5ILA0KKyAgICBYRkFfQVRUUklCVVRFX01pblcsDQorICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsDQorICAgIFhGQV9BVFRSSUJVVEVfQ29sU3BhbiwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2FsZSwNCisgICAgWEZBX0FUVFJJQlVURV9BbmNob3JUeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfUmlkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Qcmlvcml0eSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rpc2FibGUsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfVmFsdWUsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9UeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9UeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTGluZVRocm91Z2gsDQorICAgIFhGQV9BVFRSSUJVVEVfVHlwZWZhY2UsDQorICAgIFhGQV9BVFRSSUJVVEVfRm9udEhvcml6b250YWxTY2FsZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfS2VybmluZ01vZGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVW5kZXJsaW5lLA0KKyAgICBYRkFfQVRUUklCVVRFX0Jhc2VsaW5lU2hpZnQsDQorICAgIFhGQV9BVFRSSUJVVEVfT3ZlcmxpbmVQZXJpb2QsDQorICAgIFhGQV9BVFRSSUJVVEVfTGV0dGVyU3BhY2luZywNCisgICAgWEZBX0FUVFJJQlVURV9MaW5lVGhyb3VnaFBlcmlvZCwNCisgICAgWEZBX0FUVFJJQlVURV9Gb250VmVydGljYWxTY2FsZSwNCisgICAgWEZBX0FUVFJJQlVURV9Qc05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfU2l6ZSwNCisgICAgWEZBX0FUVFJJQlVURV9Qb3N0dXJlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfV2VpZ2h0LA0KKyAgICBYRkFfQVRUUklCVVRFX1VuZGVybGluZVBlcmlvZCwNCisgICAgWEZBX0FUVFJJQlVURV9PdmVybGluZSwNCisgICAgWEZBX0FUVFJJQlVURV9HZW5lcmljRmFtaWx5LA0KKyAgICBYRkFfQVRUUklCVVRFX0NoZWNrc3VtLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1JlbGV2YW50LA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfT3ZlcnJpZGUsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1RyYWlsZXIsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9MZWFkZXIsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfQ29kZVR5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfQXJjaGl2ZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0NvZGVCYXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX0NsYXNzSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9SZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfQ29ubmVjdGlvbiwNCisgICAgWEZBX0FUVFJJQlVURV9MYWJlbFJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9WYWx1ZVJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9PdmVycmlkZSwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9WYWx1ZSwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9SZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1RpbWVvdXQsDQorICAgIFhGQV9BVFRSSUJVVEVfQ29ubmVjdGlvbiwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2FnZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0RlbGF5ZWRPcGVuLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfRm9ybWF0LA0KKyAgICBYRkFfQVRUUklCVVRFX0VtYmVkUERGLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfVGFyZ2V0LA0KKyAgICBYRkFfQVRUUklCVVRFX1RleHRFbmNvZGluZywNCisgICAgWEZBX0FUVFJJQlVURV9YZHBDb250ZW50LA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9EZWxpbWl0ZXIsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9UeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX1JlZiwNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1R5cGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfU3RhcnROZXcsDQorICAgIFhGQV9BVFRSSUJVVEVfVHJhaWxlciwNCisgICAgWEZBX0FUVFJJQlVURV9UYXJnZXRUeXBlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfVGFyZ2V0LA0KKyAgICBYRkFfQVRUUklCVVRFX0xlYWRlciwNCisgICAgWEZBX0FUVFJJQlVURV9JZCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfU2xvcGUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwNCisgICAgWEZBX0FUVFJJQlVURV9IYW5kLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfVXNlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorICAgIFhGQV9BVFRSSUJVVEVfSWQsDQorICAgIFhGQV9BVFRSSUJVVEVfTWF4LA0KKyAgICBYRkFfQVRUUklCVVRFX01pbiwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2UsDQorICAgIFhGQV9BVFRSSUJVVEVfSW5pdGlhbCwNCisgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9BYmJyLA0KKyAgICBYRkFfQVRUUklCVVRFX0Rlc2MsDQorICAgIFhGQV9BVFRSSUJVVEVfTG9jaywNCisgICAgWEZBX0FUVFJJQlVURV9EZXNjLA0KKyAgICBYRkFfQVRUUklCVVRFX0xvY2ssDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfRGVzYywNCisgICAgWEZBX0FUVFJJQlVURV9Mb2NrLA0KKyAgICBYRkFfQVRUUklCVVRFX0lkLA0KKyAgICBYRkFfQVRUUklCVVRFX05hbWUsDQorICAgIFhGQV9BVFRSSUJVVEVfUmVmLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZSwNCisgICAgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwNCisgICAgWEZBX0FUVFJJQlVURV9TYXZlLA0KKyAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsDQorfTsNCitleHRlcm4gY29uc3QgWEZBX1BBQ0tFVElORk8gZ19YRkFQYWNrZXREYXRhW10gPSB7DQorICAgIHsweDAsIE5VTEwsIFhGQV9YRFBQQUNLRVRfVVNFUiwgTlVMTCwNCisgICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE1BTll9LA0KKyAgICB7MHg4MTE5MjlkLCBMInNvdXJjZVNldCIsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LA0KKyAgICAgTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1zb3VyY2Utc2V0LyIsDQorICAgICBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRPTkV9LA0KKyAgICB7MHhiODQzZGJhLCBMInBkZiIsIFhGQV9YRFBQQUNLRVRfUGRmLCBMImh0dHA6Ly9ucy5hZG9iZS5jb20veGRwL3BkZi8iLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9GTEFHU19DT01QTEVURU1BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FfSwNCisgICAgezB4YzU2YWZiZiwgTCJ4ZGMiLCBYRkFfWERQUEFDS0VUX1hkYywgTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hkYy8iLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9GTEFHU19OT01BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FfSwNCisgICAgezB4YzU2YWZjYywgTCJ4ZHAiLCBYRkFfWERQUEFDS0VUX1hEUCwgTCJodHRwOi8vbnMuYWRvYmUuY29tL3hkcC8iLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9GTEFHU19DT01QTEVURU1BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FfSwNCisgICAgezB4MTMyYThmYmMsIEwieG1wbWV0YSIsIFhGQV9YRFBQQUNLRVRfWG1wbWV0YSwNCisgICAgIEwiaHR0cDovL25zLmFkb2JlLmNvbS94bXBtZXRhLyIsDQorICAgICBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRNQU5ZfSwNCisgICAgezB4NDhkMDA0YTgsIEwieGZkZiIsIFhGQV9YRFBQQUNLRVRfWGZkZiwgTCJodHRwOi8vbnMuYWRvYmUuY29tL3hmZGYvIiwNCisgICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sDQorICAgIHsweDRlMWUzOWI2LCBMImNvbmZpZyIsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLA0KKyAgICAgTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hjaS8iLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9GTEFHU19OT01BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FfSwNCisgICAgezB4NTQ3M2I2ZGMsIEwibG9jYWxlU2V0IiwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsDQorICAgICBMImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWxvY2FsZS1zZXQvIiwNCisgICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sDQorICAgIHsweDYwMzg1ODBhLCBMInN0eWxlc2hlZXQiLCBYRkFfWERQUEFDS0VUX1N0eWxlc2hlZXQsDQorICAgICBMImh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIsDQorICAgICBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRNQU5ZfSwNCisgICAgezB4ODAzNTUwZmMsIEwidGVtcGxhdGUiLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlLA0KKyAgICAgTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS10ZW1wbGF0ZS8iLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9GTEFHU19OT01BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FfSwNCisgICAgezB4OGIwMzZmMzIsIEwic2lnbmF0dXJlIiwgWEZBX1hEUFBBQ0tFVF9TaWduYXR1cmUsDQorICAgICBMImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9GTEFHU19OT01BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FfSwNCisgICAgezB4OTliOTUwNzksIEwiZGF0YXNldHMiLCBYRkFfWERQUEFDS0VUX0RhdGFzZXRzLA0KKyAgICAgTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1kYXRhLyIsDQorICAgICBYRkFfWERQUEFDS0VUX0ZMQUdTX1BSRUZJWE1BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FfSwNCisgICAgezB4Y2QzMDlmZjQsIEwiZm9ybSIsIFhGQV9YRFBQQUNLRVRfRm9ybSwNCisgICAgIEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtZm9ybS8iLA0KKyAgICAgWEZBX1hEUFBBQ0tFVF9GTEFHU19OT01BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FfSwNCisgICAgezB4ZTE0YzgwMWMsIEwiY29ubmVjdGlvblNldCIsIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwNCisgICAgIEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtY29ubmVjdGlvbi1zZXQvIiwNCisgICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sDQorfTsNCitleHRlcm4gY29uc3QgaW50MzJfdCBnX2lYRkFQYWNrZXRDb3VudCA9DQorICAgIHNpemVvZihnX1hGQVBhY2tldERhdGEpIC8gc2l6ZW9mKFhGQV9QQUNLRVRJTkZPKTsNCitleHRlcm4gY29uc3QgWEZBX1NDUklQVEhJRVJBUkNIWSBnX1hGQVNjcmlwdEluZGV4W10gPSB7DQorICAgIHswLCAwLCAwLCAyLCAzMTZ9LCAgICAgIHswLCAwLCAyLCAyLCAzMTZ9LCAgICAgICB7MCwgMCwgNCwgMiwgMzE2fSwNCisgICAgezAsIDAsIDYsIDgsIDMxNn0sICAgICAgezAsIDAsIDE0LCA0LCAzMTZ9LCAgICAgIHswLCAwLCAxOCwgNSwgMzE3fSwNCisgICAgezAsIDAsIDIzLCAyLCAzMTZ9LCAgICAgezAsIDAsIDI1LCAxLCAzMTZ9LCAgICAgIHswLCAwLCAyNiwgMTIsIDMxNn0sDQorICAgIHswLCAwLCAzOCwgMiwgMzE2fSwgICAgIHswLCAwLCA0MCwgMSwgMzE2fSwgICAgICB7MCwgMCwgNDEsIDMsIDMxNn0sDQorICAgIHswLCAwLCA0NCwgMiwgMzE2fSwgICAgIHswLCAwLCA0NiwgNiwgMzE2fSwgICAgICB7MCwgMCwgNTIsIDAsIDMxNn0sDQorICAgIHswLCAwLCA1MiwgMiwgMzE5fSwgICAgIHswLCAwLCA1NCwgMiwgMzE2fSwgICAgICB7MCwgMCwgNTYsIDYsIDMxNn0sDQorICAgIHswLCAwLCA2MiwgMCwgMzE2fSwgICAgIHswLCAwLCA2MiwgMCwgMzE2fSwgICAgICB7MCwgMCwgNjIsIDIsIDMxNn0sDQorICAgIHswLCAwLCA2NCwgMiwgMzE2fSwgICAgIHswLCAwLCA2NiwgNiwgMzE2fSwgICAgICB7MCwgMCwgNzIsIDQsIDMxNn0sDQorICAgIHswLCAwLCA3NiwgNywgMzE2fSwgICAgIHswLCAwLCA4MywgMiwgMzIwfSwgICAgICB7MCwgMCwgODUsIDMsIDMxNn0sDQorICAgIHswLCAwLCA4OCwgMywgMzE2fSwgICAgIHswLCAwLCA5MSwgMiwgMzIwfSwgICAgICB7MCwgMCwgOTMsIDYsIDMyMH0sDQorICAgIHswLCAwLCA5OSwgNCwgMzE2fSwgICAgIHswLCAwLCAxMDMsIDIsIDMxNn0sICAgICB7MCwgMCwgMTA1LCAzLCAzMTl9LA0KKyAgICB7MCwgMCwgMTA4LCA0LCAzMTZ9LCAgICB7MCwgMCwgMTEyLCAzLCAzMTZ9LCAgICAgezAsIDAsIDExNSwgMiwgMzE2fSwNCisgICAgezAsIDAsIDExNywgNiwgMzE2fSwgICAgezAsIDAsIDEyMywgMTIsIDMxNn0sICAgIHswLCAwLCAxMzUsIDIsIDMxNn0sDQorICAgIHswLCAwLCAxMzcsIDUsIDMxNn0sICAgIHswLCAwLCAxNDIsIDIsIDMxNn0sICAgICB7MCwgMCwgMTQ0LCAzLCAzMTZ9LA0KKyAgICB7MCwgMCwgMTQ3LCAxLCAzMTZ9LCAgICB7MCwgMCwgMTQ4LCAxNCwgMzE2fSwgICAgezAsIDAsIDE2MiwgMiwgMzE2fSwNCisgICAgezAsIDAsIDE2NCwgMiwgMzE2fSwgICAgezAsIDAsIDE2NiwgMywgMzE2fSwgICAgIHswLCAwLCAxNjksIDIsIDMxNn0sDQorICAgIHswLCAwLCAxNzEsIDIsIDMxNn0sICAgIHswLCAwLCAxNzMsIDIsIDMxNn0sICAgICB7MCwgMCwgMTc1LCA0LCAzMTZ9LA0KKyAgICB7MCwgMCwgMTc5LCAyLCAzMTZ9LCAgICB7MCwgMCwgMTgxLCAyLCAzMTZ9LCAgICAgezAsIDAsIDE4MywgMCwgMzE5fSwNCisgICAgezAsIDAsIDE4MywgMjAsIDMxNn0sICAgezAsIDAsIDIwMywgMSwgMzE2fSwgICAgIHswLCAwLCAyMDQsIDMsIDMxNn0sDQorICAgIHswLCAwLCAyMDcsIDIsIDMxNn0sICAgIHswLCAwLCAyMDksIDAsIDMxNn0sICAgICB7MCwgMCwgMjA5LCAyLCAzMTZ9LA0KKyAgICB7MCwgMCwgMjExLCAyLCAzMTZ9LCAgICB7MCwgMCwgMjEzLCA0LCAzMjB9LCAgICAgezAsIDAsIDIxNywgMCwgMzE2fSwNCisgICAgezAsIDAsIDIxNywgMSwgMzE2fSwgICAgezAsIDAsIDIxOCwgMywgMzE2fSwgICAgIHswLCA0LCAyMjEsIDAsIDMxMn0sDQorICAgIHs0LCAxLCAyMjEsIDEsIDMxNn0sICAgIHs1LCAwLCAyMjIsIDIsIDMxNn0sICAgICB7NSwgMSwgMjI0LCAzLCAtMX0sDQorICAgIHs2LCAwLCAyMjcsIDAsIDMxNn0sICAgIHs2LCAwLCAyMjcsIDIsIDMxNn0sICAgICB7NiwgMCwgMjI5LCAyLCAzMTZ9LA0KKyAgICB7NiwgMCwgMjMxLCAzLCAzMTZ9LCAgICB7NiwgMCwgMjM0LCAyLCAzMTZ9LCAgICAgezYsIDAsIDIzNiwgNiwgMzE2fSwNCisgICAgezYsIDAsIDI0MiwgMTAsIDMxN30sICAgezYsIDAsIDI1MiwgOSwgMzE2fSwgICAgIHs2LCAwLCAyNjEsIDUsIDMxOH0sDQorICAgIHs2LCAwLCAyNjYsIDQsIDMxOH0sICAgIHs2LCAwLCAyNzAsIDIsIDMxNn0sICAgICB7NiwgMCwgMjcyLCAyLCAzMTZ9LA0KKyAgICB7NiwgMCwgMjc0LCA1LCAzMTZ9LCAgICB7NiwgMCwgMjc5LCAzLCAzMTZ9LCAgICAgezYsIDAsIDI4MiwgMiwgMzE2fSwNCisgICAgezYsIDAsIDI4NCwgMiwgMzE2fSwgICAgezYsIDAsIDI4NiwgMiwgMzE2fSwgICAgIHs2LCAwLCAyODgsIDIsIDMxNn0sDQorICAgIHs2LCAwLCAyOTAsIDQsIDMxNn0sICAgIHs2LCAwLCAyOTQsIDMsIDMxNn0sICAgICB7NiwgMCwgMjk3LCAzLCAzMTZ9LA0KKyAgICB7NiwgMCwgMzAwLCAyLCAzMTZ9LCAgICB7NiwgMCwgMzAyLCAyLCAzMTZ9LCAgICAgezYsIDAsIDMwNCwgMiwgMzE2fSwNCisgICAgezYsIDEzLCAzMDYsIDM2LCAzMTd9LCAgezE5LCAwLCAzNDIsIDMsIDMxNn0sICAgIHsxOSwgMCwgMzQ1LCAyLCAzMTZ9LA0KKyAgICB7MTksIDAsIDM0NywgMiwgMzE2fSwgICB7MTksIDAsIDM0OSwgMiwgMzE2fSwgICAgezE5LCAwLCAzNTEsIDcsIDMxN30sDQorICAgIHsxOSwgMiwgMzU4LCAxNiwgMzEyfSwgIHsyMSwgMCwgMzc0LCAyLCAzMjB9LCAgICB7MjEsIDAsIDM3NiwgMiwgMzE2fSwNCisgICAgezIxLCAwLCAzNzgsIDAsIDMxNn0sICAgezIxLCAwLCAzNzgsIDIsIDMxNn0sICAgIHsyMSwgMCwgMzgwLCA2LCAzMTZ9LA0KKyAgICB7MjEsIDAsIDM4NiwgMywgMzE2fSwgICB7MjEsIDAsIDM4OSwgMiwgMzE2fSwgICAgezIxLCAwLCAzOTEsIDQsIDMxNn0sDQorICAgIHsyMSwgMCwgMzk1LCAwLCAzMTZ9LCAgIHsyMSwgNSwgMzk1LCAzMCwgMzE2fSwgICB7MjYsIDAsIDQyNSwgMiwgMzIwfSwNCisgICAgezI2LCAwLCA0MjcsIDMsIDMxNn0sICAgezI2LCAwLCA0MzAsIDIsIDMyMH0sICAgIHsyNiwgMCwgNDMyLCA1LCAzMTZ9LA0KKyAgICB7MjYsIDAsIDQzNywgMiwgMzE2fSwgICB7MjYsIDAsIDQzOSwgMywgMzE2fSwgICAgezI2LCAwLCA0NDIsIDIsIDMxNn0sDQorICAgIHsyNiwgMCwgNDQ0LCA4LCAzMTZ9LCAgIHsyNiwgMCwgNDUyLCAxLCAzMTZ9LCAgICB7MjYsIDAsIDQ1MywgMiwgMzE2fSwNCisgICAgezI2LCAwLCA0NTUsIDIsIDMxNn0sICAgezI2LCAwLCA0NTcsIDQsIDMxNn0sICAgIHsyNiwgMCwgNDYxLCAwLCAzMTZ9LA0KKyAgICB7MjYsIDAsIDQ2MSwgMiwgMzE2fSwgICB7MjYsIDAsIDQ2MywgMiwgMzE2fSwgICAgezI2LCAwLCA0NjUsIDYsIDMxOH0sDQorICAgIHsyNiwgNSwgNDcxLCAzMSwgMzE3fSwgIHszMSwgMCwgNTAyLCAyLCAzMjB9LCAgICB7MzEsIDAsIDUwNCwgMiwgMzE2fSwNCisgICAgezMxLCAwLCA1MDYsIDIsIDMxNn0sICAgezMxLCAwLCA1MDgsIDQsIDMyMH0sICAgIHszMSwgMTYsIDUxMiwgMTQsIDMxMn0sDQorICAgIHs0NywgMCwgNTI2LCAyLCAzMTZ9LCAgIHs0NywgMCwgNTI4LCAyLCAzMTZ9LCAgICB7NDcsIDAsIDUzMCwgMiwgMzE2fSwNCisgICAgezQ3LCAwLCA1MzIsIDIsIDMxNn0sICAgezQ3LCAwLCA1MzQsIDMsIDMxNn0sICAgIHs0NywgMCwgNTM3LCAyLCAzMTZ9LA0KKyAgICB7NDcsIDAsIDUzOSwgMywgMzE2fSwgICB7NDcsIDAsIDU0MiwgMywgMzE2fSwgICAgezQ3LCAwLCA1NDUsIDQsIDMxOH0sDQorICAgIHs0NywgMCwgNTQ5LCA0LCAzMTZ9LCAgIHs0NywgMCwgNTUzLCAyLCAzMTZ9LCAgICB7NDcsIDAsIDU1NSwgMCwgMzE2fSwNCisgICAgezQ3LCAwLCA1NTUsIDIsIDMxNn0sICAgezQ3LCAwLCA1NTcsIDMsIDMxNn0sICAgIHs0NywgMCwgNTYwLCA2LCAzMTZ9LA0KKyAgICB7NDcsIDAsIDU2NiwgMiwgMzE2fSwgICB7NDcsIDAsIDU2OCwgMiwgMzE2fSwgICAgezQ3LCAwLCA1NzAsIDMsIDMxNn0sDQorICAgIHs0NywgMTksIDU3MywgMSwgMzEyfSwgIHs2NiwgMCwgNTc0LCAyLCAzMTZ9LCAgICB7NjYsIDAsIDU3NiwgOCwgMzE2fSwNCisgICAgezY2LCAwLCA1ODQsIDIsIDMxNn0sICAgezY2LCAwLCA1ODYsIDQsIDMxNn0sICAgIHs2NiwgMCwgNTkwLCA1LCAzMTZ9LA0KKyAgICB7NjYsIDAsIDU5NSwgMywgMzE2fSwgICB7NjYsIDAsIDU5OCwgMiwgMzIwfSwgICAgezY2LCAwLCA2MDAsIDMsIDMxNn0sDQorICAgIHs2NiwgMCwgNjAzLCA3LCAzMTZ9LCAgIHs2NiwgMCwgNjEwLCAzLCAzMTZ9LCAgICB7NjYsIDAsIDYxMywgMCwgMzE2fSwNCisgICAgezY2LCAwLCA2MTMsIDQsIDMxN30sICAgezY2LCAwLCA2MTcsIDQsIDMxOH0sICAgIHs2NiwgMCwgNjIxLCAyLCAzMjB9LA0KKyAgICB7NjYsIDAsIDYyMywgNSwgMzE2fSwgICB7NjYsIDAsIDYyOCwgMiwgMzE2fSwgICAgezY2LCAwLCA2MzAsIDIsIDMxNn0sDQorICAgIHs2NiwgMCwgNjMyLCAyLCAzMjB9LCAgIHs2NiwgMCwgNjM0LCAyLCAzMjB9LCAgICB7NjYsIDAsIDYzNiwgNCwgMzE2fSwNCisgICAgezY2LCAwLCA2NDAsIDIsIDMxNn0sICAgezY2LCAwLCA2NDIsIDEsIDMxNn0sICAgIHs2NiwgMCwgNjQzLCAxLCAzMTZ9LA0KKyAgICB7NjYsIDAsIDY0NCwgNCwgMzE2fSwgICB7NjYsIDAsIDY0OCwgMywgMzE2fSwgICAgezY2LCA3LCA2NTEsIDIsIDMxOX0sDQorICAgIHs3MywgMCwgNjUzLCAyLCAzMTZ9LCAgIHs3MywgMCwgNjU1LCAyLCAzMTZ9LCAgICB7NzMsIDAsIDY1NywgMywgMzE2fSwNCisgICAgezczLCA0LCA2NjAsIDQsIDMxMn0sICAgezc3LCAwLCA2NjQsIDEwLCAzMTZ9LCAgIHs3NywgMCwgNjc0LCAyLCAzMTZ9LA0KKyAgICB7NzcsIDAsIDY3NiwgNCwgMzE2fSwgICB7NzcsIDAsIDY4MCwgNCwgMzE2fSwgICAgezc3LCAwLCA2ODQsIDMsIDMxNn0sDQorICAgIHs3NywgMCwgNjg3LCAyLCAzMTZ9LCAgIHs3NywgMCwgNjg5LCAyLCAzMTZ9LCAgICB7NzcsIDAsIDY5MSwgOCwgMzE3fSwNCisgICAgezc3LCAwLCA2OTksIDMsIDMxNn0sICAgezc3LCAwLCA3MDIsIDMsIDMxNn0sICAgIHs3NywgMCwgNzA1LCAyLCAzMTZ9LA0KKyAgICB7NzcsIDAsIDcwNywgMiwgMzE2fSwgICB7NzcsIDAsIDcwOSwgNSwgMzE2fSwgICAgezc3LCAwLCA3MTQsIDQsIDMxNn0sDQorICAgIHs3NywgMCwgNzE4LCAyLCAzMTZ9LCAgIHs3NywgMCwgNzIwLCA4LCAzMTh9LCAgICB7NzcsIDAsIDcyOCwgMSwgMzE2fSwNCisgICAgezc3LCAwLCA3MjksIDIsIDMyMH0sICAgezc3LCAwLCA3MzEsIDMsIDMxNn0sICAgIHs3NywgMSwgNzM0LCA0LCAzMTZ9LA0KKyAgICB7NzgsIDAsIDczOCwgNSwgMzE2fSwgICB7NzgsIDAsIDc0MywgMywgMzE2fSwgICAgezc4LCAwLCA3NDYsIDEsIDMxNn0sDQorICAgIHs3OCwgMCwgNzQ3LCAyLCAzMjB9LCAgIHs3OCwgMCwgNzQ5LCAwLCAzMTN9LCAgICB7NzgsIDAsIDc0OSwgMiwgMzE2fSwNCisgICAgezc4LCA1LCA3NTEsIDMsIDMxNn0sICAgezgzLCAwLCA3NTQsIDUsIDMxNn0sICAgIHs4MywgMCwgNzU5LCA3LCAzMTZ9LA0KKyAgICB7ODMsIDAsIDc2NiwgNiwgMzE2fSwgICB7ODMsIDAsIDc3MiwgMywgMzE2fSwgICAgezgzLCAwLCA3NzUsIDIsIDMxNn0sDQorICAgIHs4MywgMCwgNzc3LCA1LCAzMTZ9LCAgIHs4MywgMCwgNzgyLCAyLCAzMTZ9LCAgICB7ODMsIDAsIDc4NCwgMCwgMzE0fSwNCisgICAgezgzLCAwLCA3ODQsIDIsIDMxNn0sICAgezgzLCAwLCA3ODYsIDEsIDMxNn0sICAgIHs4MywgMCwgNzg3LCAyLCAzMTZ9LA0KKyAgICB7ODMsIDAsIDc4OSwgNSwgMzE2fSwgICB7ODMsIDAsIDc5NCwgMiwgMzE2fSwgICAgezgzLCAwLCA3OTYsIDEsIDMxNn0sDQorICAgIHs4MywgMCwgNzk3LCAyLCAzMTZ9LCAgIHs4MywgMCwgNzk5LCAyLCAzMTZ9LCAgICB7ODMsIDAsIDgwMSwgNiwgMzE2fSwNCisgICAgezgzLCAwLCA4MDcsIDIsIDMxNn0sICAgezgzLCAwLCA4MDksIDIsIDMyMH0sICAgIHs4MywgMCwgODExLCAzLCAzMTZ9LA0KKyAgICB7ODMsIDAsIDgxNCwgNCwgMzE2fSwgICB7ODMsIDAsIDgxOCwgMiwgMzE2fSwgICAgezgzLCAwLCA4MjAsIDIsIDMxNn0sDQorICAgIHs4MywgMCwgODIyLCAyLCAzMTZ9LCAgIHs4MywgMCwgODI0LCAyLCAzMTZ9LCAgICB7ODMsIDAsIDgyNiwgMiwgMzE2fSwNCisgICAgezgzLCAwLCA4MjgsIDIsIDMxNn0sICAgezgzLCAwLCA4MzAsIDQsIDMxOH0sICAgIHs4MywgMSwgODM0LCAyLCAzMTZ9LA0KKyAgICB7ODQsIDAsIDgzNiwgNSwgMzE2fSwgICB7ODQsIDAsIDg0MSwgMjAsIDMxN30sICAgezg0LCAwLCA4NjEsIDIsIDMxNn0sDQorICAgIHs4NCwgMCwgODYzLCAwLCAzMTZ9LCAgIHs4NCwgMCwgODYzLCAyLCAzMTZ9LCAgICB7ODQsIDAsIDg2NSwgNCwgMzIwfSwNCisgICAgezg0LCAwLCA4NjksIDAsIDMxNn0sICAgezg0LCAwLCA4NjksIDIsIDMxNn0sICAgIHs4NCwgMCwgODcxLCAxLCAzMTZ9LA0KKyAgICB7ODQsIDAsIDg3MiwgMiwgMzE2fSwgICB7ODQsIDAsIDg3NCwgMywgMzE2fSwgICAgezg0LCAwLCA4NzcsIDIsIDMxNn0sDQorICAgIHs4NCwgMCwgODc5LCAyLCAzMTZ9LCAgIHs4NCwgMCwgODgxLCA0LCAzMTZ9LCAgICB7ODQsIDAsIDg4NSwgMywgMzE2fSwNCisgICAgezg0LCAwLCA4ODgsIDE3LCAzMTZ9LCAgezg0LCA2LCA5MDUsIDEsIDMxOX0sICAgIHs5MCwgMCwgOTA2LCAyLCAzMTZ9LA0KKyAgICB7OTAsIDAsIDkwOCwgMiwgMzIwfSwgICB7OTAsIDAsIDkxMCwgMiwgMzIwfSwgICAgezkwLCAwLCA5MTIsIDIsIDMxNn0sDQorICAgIHs5MCwgMCwgOTE0LCAyLCAzMTZ9LCAgIHs5MCwgMCwgOTE2LCA0LCAzMTh9LCAgICB7OTAsIDAsIDkyMCwgMiwgMzE2fSwNCisgICAgezkwLCA1LCA5MjIsIDAsIDMxMn0sICAgezk1LCAwLCA5MjIsIDIsIDMxNn0sICAgIHs5NSwgMCwgOTI0LCA0LCAzMTZ9LA0KKyAgICB7OTUsIDAsIDkyOCwgNCwgMzE2fSwgICB7OTUsIDAsIDkzMiwgNiwgMzE2fSwgICAgezk1LCAwLCA5MzgsIDIsIDMxNn0sDQorICAgIHs5NSwgMCwgOTQwLCA0LCAzMTZ9LCAgIHs5NSwgMCwgOTQ0LCAzLCAzMTZ9LCAgICB7OTUsIDAsIDk0NywgMywgMzE2fSwNCisgICAgezk1LCAwLCA5NTAsIDIsIDMxNn0sICAgezk1LCAwLCA5NTIsIDMsIDMxNn0sICAgIHs5NSwgMCwgOTU1LCAwLCAzMTZ9LA0KKyAgICB7OTUsIDAsIDk1NSwgMCwgMzE2fSwgICB7OTUsIDAsIDk1NSwgMiwgMzE2fSwgICAgezk1LCAwLCA5NTcsIDcsIDMxNn0sDQorICAgIHs5NSwgMCwgOTY0LCAyLCAzMTZ9LCAgIHs5NSwgMCwgOTY2LCAwLCAzMTl9LCAgICB7OTUsIDAsIDk2NiwgNywgMzE2fSwNCisgICAgezk1LCAwLCA5NzMsIDIsIDMxNn0sICAgezk1LCAwLCA5NzUsIDIsIDMxNn0sICAgIHs5NSwgMywgOTc3LCAxLCAzMTZ9LA0KKyAgICB7OTgsIDAsIDk3OCwgMiwgMzIwfSwgICB7OTgsIDAsIDk4MCwgNCwgMzE2fSwgICAgezk4LCAwLCA5ODQsIDAsIDMxNn0sDQorICAgIHs5OCwgMCwgOTg0LCAyLCAzMTZ9LCAgIHs5OCwgMCwgOTg2LCAyLCAzMTZ9LCAgICB7OTgsIDAsIDk4OCwgNCwgMzE2fSwNCisgICAgezk4LCAwLCA5OTIsIDEsIDMxNn0sICAgezk4LCAwLCA5OTMsIDIsIDMxNn0sICAgIHs5OCwgMCwgOTk1LCAyLCAzMTZ9LA0KKyAgICB7OTgsIDAsIDk5NywgMywgMzE2fSwgICB7OTgsIDAsIDEwMDAsIDIsIDMxN30sICAgezk4LCAwLCAxMDAyLCAwLCAzMTZ9LA0KKyAgICB7OTgsIDAsIDEwMDIsIDQsIDMxNn0sICB7OTgsIDAsIDEwMDYsIDQsIDMxNn0sICAgezk4LCAwLCAxMDEwLCAyLCAzMTZ9LA0KKyAgICB7OTgsIDAsIDEwMTIsIDMsIDMxNn0sICB7OTgsIDAsIDEwMTUsIDQsIDMxNn0sICAgezk4LCAwLCAxMDE5LCA3LCAzMTZ9LA0KKyAgICB7OTgsIDAsIDEwMjYsIDQsIDMxNn0sICB7OTgsIDAsIDEwMzAsIDEsIDMxM30sICAgezk4LCAxNywgMTAzMSwgMywgMzE2fSwNCisgICAgezExNSwgMCwgMTAzNCwgNSwgMzE2fSwgezExNSwgMCwgMTAzOSwgMiwgMzE2fSwgIHsxMTUsIDAsIDEwNDEsIDEsIDMxNn0sDQorICAgIHsxMTUsIDAsIDEwNDIsIDQsIDMxNn0sIHsxMTUsIDAsIDEwNDYsIDIsIDMxNn0sICB7MTE1LCAwLCAxMDQ4LCAyLCAzMTZ9LA0KKyAgICB7MTE1LCAwLCAxMDUwLCAxLCAzMTZ9LCB7MTE1LCAwLCAxMDUxLCAyLCAzMTZ9LCAgezExNSwgMCwgMTA1MywgNSwgMzE2fSwNCisgICAgezExNSwgMCwgMTA1OCwgMSwgLTF9LCAgezExNSwgNCwgMTA1OSwgMSwgMzEyfSwgIHsxMTksIDEsIDEwNjAsIDAsIDMxM30sDQorICAgIHsxMjAsIDIsIDEwNjAsIDgsIDMxMn0sIHsxMjIsIDExLCAxMDY4LCA2LCAzMTV9LCB7MTMzLCAyLCAxMDc0LCAwLCAzMTZ9LA0KKyAgICB7MTM1LCAwLCAxMDc0LCAwLCAzMTZ9LCB7MTM1LCAzLCAxMDc0LCAyLCAzMTZ9LCAgezEzOCwgMCwgMTA3NiwgMiwgMzE2fSwNCit9Ow0KK2V4dGVybiBjb25zdCBYRkFfTUVUSE9ESU5GTyBnX1NvbU1ldGhvZERhdGFbXSA9IHsNCisgICAgezB4M2M3NTI0OTUsIEwidmVyaWZ5IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsX1ZlcmlmeX0sDQorICAgIHsweGE2ODYzNWYxLCBMInNpZ24iLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsX1NpZ259LA0KKyAgICB7MHhhN2YyYzVlNiwgTCJlbnVtZXJhdGUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWw6Og0KKyAgICAgICAgIFNjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbF9FbnVtZXJhdGV9LA0KKyAgICB7MHhkOGVkMTQ2NywgTCJjbGVhciIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsX0NsZWFyfSwNCisgICAgezB4NGJkY2NlMTMsIEwiZXhlY3V0ZSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfV3NkbENvbm5lY3Rpb25fRXhlY3V0ZX0sDQorICAgIHsweDFjMjk2YmE0LCBMInJlc3RvcmUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0RlbHRhX1Jlc3RvcmV9LA0KKyAgICB7MHg3ZDEyM2E5LCBMImNsZWFySXRlbXMiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0NsZWFySXRlbXN9LA0KKyAgICB7MHhmYjBiMDA3LCBMImV4ZWNFdmVudCIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRXhlY0V2ZW50fSwNCisgICAgezB4NjcxNmNlOTcsIEwiZXhlY0luaXRpYWxpemUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0V4ZWNJbml0aWFsaXplfSwNCisgICAgezB4N2JiOTE5YzIsIEwiZGVsZXRlSXRlbSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRGVsZXRlSXRlbX0sDQorICAgIHsweDlmMDUzZDVlLCBMImdldFNhdmVJdGVtIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9HZXRTYXZlSXRlbX0sDQorICAgIHsweGJiZDMyNzQ3LCBMImJvdW5kSXRlbSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfQm91bmRJdGVtfSwNCisgICAgezB4YzQ5MmQ5NTAsIEwiZ2V0SXRlbVN0YXRlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9HZXRJdGVtU3RhdGV9LA0KKyAgICB7MHhjNjAxM2NkMywgTCJleGVjQ2FsY3VsYXRlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9FeGVjQ2FsY3VsYXRlfSwNCisgICAgezB4ZDg5MzBkMGUsIEwic2V0SXRlbXMiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX1NldEl0ZW1zfSwNCisgICAgezB4ZTBmMTUwNDUsIEwiZ2V0RGlzcGxheUl0ZW0iLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0dldERpc3BsYXlJdGVtfSwNCisgICAgezB4ZTIzYWNkZGMsIEwic2V0SXRlbVN0YXRlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9TZXRJdGVtU3RhdGV9LA0KKyAgICB7MHhlMmRmYjJmOCwgTCJhZGRJdGVtIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9BZGRJdGVtfSwNCisgICAgezB4ZWY4Y2U0OGYsIEwiZXhlY1ZhbGlkYXRlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9FeGVjVmFsaWRhdGV9LA0KKyAgICB7MHg0NjEwNzllZiwgTCJlbWl0IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfRW1pdH0sDQorICAgIHsweGZlYzkwYzYzLCBMInJlc2V0IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Jlc2V0fSwNCisgICAgezB4ZmIwYjAwNywgTCJleGVjRXZlbnQiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9FeGVjRXZlbnR9LA0KKyAgICB7MHgzZDgzMjIyMSwgTCJzZWxlY3RlZE1lbWJlciIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX1NlbGVjdGVkTWVtYmVyfSwNCisgICAgezB4NjcxNmNlOTcsIEwiZXhlY0luaXRpYWxpemUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9FeGVjSW5pdGlhbGl6ZX0sDQorICAgIHsweGM2MDEzY2QzLCBMImV4ZWNDYWxjdWxhdGUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9FeGVjQ2FsY3VsYXRlfSwNCisgICAgezB4ZWY4Y2U0OGYsIEwiZXhlY1ZhbGlkYXRlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfRXhlY1ZhbGlkYXRlfSwNCisgICAgezB4ZmIwYjAwNywgTCJleGVjRXZlbnQiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1N1YmZvcm1fRXhlY0V2ZW50fSwNCisgICAgezB4NjcxNmNlOTcsIEwiZXhlY0luaXRpYWxpemUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1N1YmZvcm1fRXhlY0luaXRpYWxpemV9LA0KKyAgICB7MHhjNjAxM2NkMywgTCJleGVjQ2FsY3VsYXRlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9TdWJmb3JtX0V4ZWNDYWxjdWxhdGV9LA0KKyAgICB7MHhkOWI5YjFmMSwgTCJnZXRJbnZhbGlkT2JqZWN0cyIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU3ViZm9ybV9HZXRJbnZhbGlkT2JqZWN0c30sDQorICAgIHsweGVmOGNlNDhmLCBMImV4ZWNWYWxpZGF0ZSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU3ViZm9ybV9FeGVjVmFsaWRhdGV9LA0KKyAgICB7MHhhMzY2YjdjLCBMImV4cG9ydERhdGEiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9FeHBvcnREYXRhfSwNCisgICAgezB4MTZjYzIyNmMsIEwiZ290b1VSTCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Hb3RvVVJMfSwNCisgICAgezB4MWUwNzIyZjUsIEwicGFnZURvd24iLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1BhZ2VEb3dufSwNCisgICAgezB4M2U2NmNiMmMsIEwic2V0Rm9jdXMiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1NldEZvY3VzfSwNCisgICAgezB4NGFjOWZhYWUsIEwib3Blbkxpc3QiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX09wZW5MaXN0fSwNCisgICAgezB4N2I4OTcxNGYsIEwicmVzcG9uc2UiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1Jlc3BvbnNlfSwNCisgICAgezB4N2ZkOWZkNTgsIEwiZG9jdW1lbnRJbkJhdGNoIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Eb2N1bWVudEluQmF0Y2h9LA0KKyAgICB7MHhhZjFkMDE5ZCwgTCJyZXNldERhdGEiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9SZXNldERhdGF9LA0KKyAgICB7MHhiMDdiZTEzYywgTCJiZWVwIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0JlZXB9LA0KKyAgICB7MHhiMTg4MmNhMCwgTCJnZXRGb2N1cyIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfR2V0Rm9jdXN9LA0KKyAgICB7MHhiZjRiYTllZSwgTCJtZXNzYWdlQm94IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX01lc3NhZ2VCb3h9LA0KKyAgICB7MHhkNmQ0ZGJjMSwgTCJkb2N1bWVudENvdW50SW5CYXRjaCIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfRG9jdW1lbnRDb3VudEluQmF0Y2h9LA0KKyAgICB7MHhkZDc2NzZlZCwgTCJwcmludCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfUHJpbnR9LA0KKyAgICB7MHhlMmY4NjNkMCwgTCJjdXJyZW50RGF0ZVRpbWUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjoNCisgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0N1cnJlbnREYXRlVGltZX0sDQorICAgIHsweGY5OTVkMGY1LCBMImltcG9ydERhdGEiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfSW1wb3J0RGF0YX0sDQorICAgIHsweGZlYjk2YjYyLCBMInBhZ2VVcCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1BhZ2VVcH0sDQorICAgIHsweDY4LCBMImgiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0h9LA0KKyAgICB7MHg3NywgTCJ3IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9XfSwNCisgICAgezB4NzgsIEwieCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfWH0sDQorICAgIHsweDc5LCBMInkiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1l9LA0KKyAgICB7MHg1NDYwMjA2LCBMInBhZ2VDb3VudCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1BhZ2VDb3VudH0sDQorICAgIHsweDVlYjViMGYsIEwicGFnZVNwYW4iLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1BhZ2VTcGFufSwNCisgICAgezB4MTBmMWIxYmQsIEwicGFnZSIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUGFnZX0sDQorICAgIHsweDFjMWU2MzE4LCBMInBhZ2VDb250ZW50IiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjoNCisgICAgICAgICBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUGFnZUNvbnRlbnR9LA0KKyAgICB7MHgxYzFmNGE1YywgTCJhYnNQYWdlQ291bnQiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9BYnNQYWdlQ291bnR9LA0KKyAgICB7MHgxZWM0N2RiNSwgTCJhYnNQYWdlQ291bnRJbkJhdGNoIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjoNCisgICAgICAgICBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfQWJzUGFnZUNvdW50SW5CYXRjaH0sDQorICAgIHsweDJlNGVjYmRiLCBMInNoZWV0Q291bnRJbkJhdGNoIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjoNCisgICAgICAgICBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfU2hlZXRDb3VudEluQmF0Y2h9LA0KKyAgICB7MHgyZmNmZjRiNSwgTCJyZWxheW91dCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1JlbGF5b3V0fSwNCisgICAgezB4M2JmMWMyYTUsIEwiYWJzUGFnZVNwYW4iLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9BYnNQYWdlU3Bhbn0sDQorICAgIHsweDU3NzVjMmNjLCBMImFic1BhZ2VJbkJhdGNoIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjoNCisgICAgICAgICBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfQWJzUGFnZUluQmF0Y2h9LA0KKyAgICB7MHg4YzVmZWIzMiwgTCJzaGVldEluQmF0Y2giLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9TaGVldEluQmF0Y2h9LA0KKyAgICB7MHg4ZjNhODM3OSwgTCJzaGVldCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1NoZWV0fSwNCisgICAgezB4OTZmM2M0Y2IsIEwicmVsYXlvdXRQYWdlQXJlYSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1JlbGF5b3V0UGFnZUFyZWF9LA0KKyAgICB7MHhkMmE0YTU0MiwgTCJzaGVldENvdW50IiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjoNCisgICAgICAgICBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfU2hlZXRDb3VudH0sDQorICAgIHsweGU3NGYwNjUzLCBMImFic1BhZ2UiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0Fic1BhZ2V9LA0KKyAgICB7MHg0NGMzNTJhZCwgTCJmb3JtTm9kZXMiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX0Zvcm1Ob2Rlc30sDQorICAgIHsweDQ1ZWZiODQ3LCBMInJlbWVyZ2UiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX1JlbWVyZ2V9LA0KKyAgICB7MHg2NzE2Y2U5NywgTCJleGVjSW5pdGlhbGl6ZSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVGVtcGxhdGVfRXhlY0luaXRpYWxpemV9LA0KKyAgICB7MHg3MTJjNmFmYSwgTCJjcmVhdGVOb2RlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UZW1wbGF0ZV9DcmVhdGVOb2RlfSwNCisgICAgezB4YThhMzVlMjUsIEwicmVjYWxjdWxhdGUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX1JlY2FsY3VsYXRlfSwNCisgICAgezB4YzYwMTNjZDMsIEwiZXhlY0NhbGN1bGF0ZSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVGVtcGxhdGVfRXhlY0NhbGN1bGF0ZX0sDQorICAgIHsweGVmOGNlNDhmLCBMImV4ZWNWYWxpZGF0ZSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVGVtcGxhdGVfRXhlY1ZhbGlkYXRlfSwNCisgICAgezB4NGNjMWMwZjksIEwibW92ZUN1cnJlbnRSZWNvcmQiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfRGF0YVdpbmRvdzo6DQorICAgICAgICAgU2NyaXB0X0RhdGFXaW5kb3dfTW92ZUN1cnJlbnRSZWNvcmR9LA0KKyAgICB7MHg1Nzc5ZDY1ZiwgTCJyZWNvcmQiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfRGF0YVdpbmRvdzo6U2NyaXB0X0RhdGFXaW5kb3dfUmVjb3JkfSwNCisgICAgezB4OGE0NzY0OTgsIEwiZ290b1JlY29yZCIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9EYXRhV2luZG93OjpTY3JpcHRfRGF0YVdpbmRvd19Hb3RvUmVjb3JkfSwNCisgICAgezB4YWFjMjQxYzgsIEwiaXNSZWNvcmRHcm91cCIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9EYXRhV2luZG93OjpTY3JpcHRfRGF0YVdpbmRvd19Jc1JlY29yZEdyb3VwfSwNCisgICAgezB4MWM2ZjQyNzcsIEwiZXZhbHVhdGUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X01hbmlmZXN0X0V2YWx1YXRlfSwNCisgICAgezB4MmFmZWMyY2MsIEwibW92ZUluc3RhbmNlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfTW92ZUluc3RhbmNlfSwNCisgICAgezB4MmJmOTRhNjMsIEwicmVtb3ZlSW5zdGFuY2UiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0luc3RhbmNlTWFuYWdlcl9SZW1vdmVJbnN0YW5jZX0sDQorICAgIHsweDMwM2FkYWY0LCBMInNldEluc3RhbmNlcyIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX1NldEluc3RhbmNlc30sDQorICAgIHsweDRkNzZiODllLCBMImFkZEluc3RhbmNlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfQWRkSW5zdGFuY2V9LA0KKyAgICB7MHhjNjYwZGM4YSwgTCJpbnNlcnRJbnN0YW5jZSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX0luc2VydEluc3RhbmNlfSwNCisgICAgezB4ZGRmZDFlYTEsIEwibWV0YWRhdGEiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0Rlc2NfTWV0YWRhdGF9LA0KKyAgICB7MHg0NGMzNTJhZCwgTCJmb3JtTm9kZXMiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fRm9ybU5vZGVzfSwNCisgICAgezB4NDVlZmI4NDcsIEwicmVtZXJnZSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRm9ybV9SZW1lcmdlfSwNCisgICAgezB4NjcxNmNlOTcsIEwiZXhlY0luaXRpYWxpemUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fRXhlY0luaXRpYWxpemV9LA0KKyAgICB7MHhhOGEzNWUyNSwgTCJyZWNhbGN1bGF0ZSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRm9ybV9SZWNhbGN1bGF0ZX0sDQorICAgIHsweGM2MDEzY2QzLCBMImV4ZWNDYWxjdWxhdGUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fRXhlY0NhbGN1bGF0ZX0sDQorICAgIHsweGVmOGNlNDhmLCBMImV4ZWNWYWxpZGF0ZSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRm9ybV9FeGVjVmFsaWRhdGV9LA0KKyAgICB7MHg2MDQ5MGE4NSwgTCJtZXNzYWdlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTG9nUHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9Mb2dQc2V1ZG9Nb2RlbF9NZXNzYWdlfSwNCisgICAgezB4NjBlY2ZjYzksIEwidHJhY2VEZWFjdGl2YXRlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xvZ1BzZXVkb01vZGVsOjoNCisgICAgICAgICBTY3JpcHRfTG9nUHNldWRvTW9kZWxfVHJhY2VEZWFjdGl2YXRlfSwNCisgICAgezB4ODZhMGY0YzAsIEwidHJhY2VBY3RpdmF0ZSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgU2NyaXB0X0xvZ1BzZXVkb01vZGVsX1RyYWNlQWN0aXZhdGV9LA0KKyAgICB7MHg5M2VhYzM5YSwgTCJ0cmFjZUVuYWJsZWQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfTG9nUHNldWRvTW9kZWxfVHJhY2VFbmFibGVkfSwNCisgICAgezB4ZDEyMjdlNmYsIEwidHJhY2UiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTG9nUHNldWRvTW9kZWw6OlNjcmlwdF9Mb2dQc2V1ZG9Nb2RlbF9UcmFjZX0sDQorICAgIHsweDM2YzBlZTE0LCBMImdldEF0dHJpYnV0ZSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfUGFja2V0X0dldEF0dHJpYnV0ZX0sDQorICAgIHsweDU0NjhlMmEwLCBMInNldEF0dHJpYnV0ZSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfUGFja2V0X1NldEF0dHJpYnV0ZX0sDQorICAgIHsweGFkYzQ4ZGUyLCBMInJlbW92ZUF0dHJpYnV0ZSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfUGFja2V0X1JlbW92ZUF0dHJpYnV0ZX0sDQorICAgIHsweDM4NDhiM2YsIEwibmV4dCIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfTmV4dH0sDQorICAgIHsweDE0ZTI1YmM4LCBMImNhbmNlbEJhdGNoIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfQ2FuY2VsQmF0Y2h9LA0KKyAgICB7MHgzY2UwNWQ2OCwgTCJmaXJzdCIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0ZpcnN0fSwNCisgICAgezB4NjQ5ZTFlNjUsIEwidXBkYXRlQmF0Y2giLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9VcGRhdGVCYXRjaH0sDQorICAgIHsweDZhMzQwNWRkLCBMInByZXZpb3VzIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfUHJldmlvdXN9LA0KKyAgICB7MHg3NDgxOGZiMywgTCJpc0JPRiIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0lzQk9GfSwNCisgICAgezB4NzRkMDdhNzYsIEwiaXNFT0YiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9Jc0VPRn0sDQorICAgIHsweDc2MTNjYjY2LCBMImNhbmNlbCIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0NhbmNlbH0sDQorICAgIHsweDdiYWNhMmUzLCBMInVwZGF0ZSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX1VwZGF0ZX0sDQorICAgIHsweDhiOTBlMWYyLCBMIm9wZW4iLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX09wZW59LA0KKyAgICB7MHg5YzY0NzFiMywgTCJkZWxldGUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9EZWxldGV9LA0KKyAgICB7MHhhNzMxNTA5MywgTCJhZGROZXciLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9BZGROZXd9LA0KKyAgICB7MHhhN2NlNWY4ZCwgTCJyZXF1ZXJ5IiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfUmVxdWVyeX0sDQorICAgIHsweGM3MzY4Njc0LCBMInJlc3luYyIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX1Jlc3luY30sDQorICAgIHsweGQ5ZjQ3ZjM2LCBMImNsb3NlIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfQ2xvc2V9LA0KKyAgICB7MHhmNTQ0ODFkNCwgTCJsYXN0IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9MYXN0fSwNCisgICAgezB4Zjc5NjU0NjAsIEwiaGFzRGF0YUNoYW5nZWQiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9IYXNEYXRhQ2hhbmdlZH0sDQorICAgIHsweDYyNzVmNmFmLCBMIml0ZW0iLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZUxpc3Q6OlNjcmlwdF9MaXN0Q2xhc3NfSXRlbX0sDQorICAgIHsweDcwMzNiZmQ1LCBMImluc2VydCIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X0xpc3RDbGFzc19JbnNlcnR9LA0KKyAgICB7MHg5Y2FiN2NhZSwgTCJyZW1vdmUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZUxpc3Q6OlNjcmlwdF9MaXN0Q2xhc3NfUmVtb3ZlfSwNCisgICAgezB4ZGExMmU1MTgsIEwiYXBwZW5kIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGVMaXN0OjpTY3JpcHRfTGlzdENsYXNzX0FwcGVuZH0sDQorICAgIHsweGQ4OTJhMDU0LCBMIm5hbWVkSXRlbSIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X1RyZWVsaXN0Q2xhc3NfTmFtZWRJdGVtfSwNCisgICAgezB4YmEyZGQzODYsIEwicmVzb2x2ZU5vZGUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19SZXNvbHZlTm9kZX0sDQorICAgIHsweGU1MDllMmI5LCBMInJlc29sdmVOb2RlcyIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX1Jlc29sdmVOb2Rlc30sDQorICAgIHsweDFiY2ExZWJkLCBMImFwcGx5WFNMIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfQXBwbHlYU0x9LA0KKyAgICB7MHgzNmMwZWUxNCwgTCJnZXRBdHRyaWJ1dGUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19HZXRBdHRyaWJ1dGV9LA0KKyAgICB7MHg1NDY4ZTJhMCwgTCJzZXRBdHRyaWJ1dGUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19TZXRBdHRyaWJ1dGV9LA0KKyAgICB7MHg1ZWUwMDk5NiwgTCJzZXRFbGVtZW50IiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfU2V0RWxlbWVudH0sDQorICAgIHsweDkyZGFkYTRmLCBMInNhdmVGaWx0ZXJlZFhNTCIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX1NhdmVGaWx0ZXJlZFhNTH0sDQorICAgIHsweDljNDU2NTAwLCBMInNhdmVYTUwiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19TYXZlWE1MfSwNCisgICAgezB4YWJkMzIwMGEsIEwiZ2V0RWxlbWVudCIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0dldEVsZW1lbnR9LA0KKyAgICB7MHhiMjY5YzYwZCwgTCJpc1Byb3BlcnR5U3BlY2lmaWVkIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfSXNQcm9wZXJ0eVNwZWNpZmllZH0sDQorICAgIHsweGI1MjhiZTkxLCBMImxvYWRYTUwiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19Mb2FkWE1MfSwNCisgICAgezB4ZDlmNDY1OTEsIEwiY2xvbmUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19DbG9uZX0sDQorICAgIHsweGUwMDZhNzZiLCBMImFzc2lnbk5vZGUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19Bc3NpZ25Ob2RlfSwNCisgICAgezB4NzMwM2ZjZWEsIEwiZ2V0RGVsdGEiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0NvbnRhaW5lckNsYXNzX0dldERlbHRhfSwNCisgICAgezB4ZTc3NDJjOWQsIEwiZ2V0RGVsdGFzIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Db250YWluZXJDbGFzc19HZXREZWx0YXN9LA0KKyAgICB7MHgzMGZmNmFhZCwgTCJjbGVhckVycm9yTGlzdCIsDQorICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTW9kZWxDbGFzc19DbGVhckVycm9yTGlzdH0sDQorICAgIHsweDcxMmM2YWZhLCBMImNyZWF0ZU5vZGUiLA0KKyAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X01vZGVsQ2xhc3NfQ3JlYXRlTm9kZX0sDQorICAgIHsweDgzYTY0MTFkLCBMImlzQ29tcGF0aWJsZU5TIiwNCisgICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Nb2RlbENsYXNzX0lzQ29tcGF0aWJsZU5TfSwNCit9Ow0KK2V4dGVybiBjb25zdCBpbnQzMl90IGdfaVNvbU1ldGhvZENvdW50ID0NCisgICAgc2l6ZW9mKGdfU29tTWV0aG9kRGF0YSkgLyBzaXplb2YoWEZBX01FVEhPRElORk8pOw0KK2V4dGVybiBjb25zdCBfWEZBX1NDUklQVEFUVFJJQlVURUlORk8gZ19Tb21BdHRyaWJ1dGVEYXRhW10gPSB7DQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YjM1NDNhNiwgTCJtYXgiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX01heCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg0NWE2ZGFmOCwgTCJlb2ZBY3Rpb24iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0VvZkFjdGlvbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDVlYzk1OGMwLCBMImN1cnNvclR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0N1cnNvclR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3OTk3NWYyYiwgTCJsb2NrVHlwZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9ja1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhNTM0MGZmNSwgTCJib2ZBY3Rpb24iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0JvZkFjdGlvbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjNTc2MjE1NywgTCJjdXJzb3JMb2NhdGlvbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQ3Vyc29yTG9jYXRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MWVlMmQyNGQsIEwiaW5zdGFuY2VJbmRleCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0luc3RhbmNlSW5kZXgsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDhjOTkzNzdlLCBMInJlbGF0aW9uIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9SZWxhdGlvbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDhlMWMyOTIxLCBMInJlbGV2YW50IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9SZWxldmFudCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgzMWIxOWMxLCBMIm5hbWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgzMTA2YzNhLCBMImJlZm9yZVRhcmdldCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQmVmb3JlVGFyZ2V0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDEzYTA4YmRiLCBMIm92ZXJmbG93VGFyZ2V0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RhcmdldCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDE2OTEzNGExLCBMIm92ZXJmbG93TGVhZGVyIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9PdmVyZmxvd0xlYWRlciwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDIwOTE0MzY3LCBMIm92ZXJmbG93VHJhaWxlciIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfT3ZlcmZsb3dUcmFpbGVyLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NDUzZWFmMzgsIEwic3RhcnROZXciLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1N0YXJ0TmV3LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NjQxMTBhYjUsIEwiYm9va2VuZFRyYWlsZXIiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Jvb2tlbmRUcmFpbGVyLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YjZiNDQxNzIsIEwiYWZ0ZXIiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0FmdGVyLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMzYzE0NDJmLCBMImJvb2tlbmRMZWFkZXIiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Jvb2tlbmRMZWFkZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjYjE1MDQ3OSwgTCJhZnRlclRhcmdldCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQWZ0ZXJUYXJnZXQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNGZmY2U3MywgTCJiZWZvcmUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0JlZm9yZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDMxYjE5YzEsIEwibmFtZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZV9SZWFkLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg0N2NmYTQzYSwgTCJhbGxvd05ldXRyYWwiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0FsbG93TmV1dHJhbCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDdjMmZkODBiLCBMIm1hcmsiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX01hcmssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4ZWQxODJkMSwgTCJzaGFwZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfU2hhcGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhNjg2OTc1YiwgTCJzaXplIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9TaXplLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDVjMDU0NzU1LCBMInN0YXJ0QW5nbGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1N0YXJ0QW5nbGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3NDc4OGY4YiwgTCJzd2VlcEFuZ2xlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Td2VlcEFuZ2xlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4OWQ4MzNkNzUsIEwiY2lyY3VsYXIiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0NpcmN1bGFyLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ5OTZmYTliLCBMImhhbmQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0hhbmQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YjBlNTQ4NWQsIEwiYmluZCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQmluZCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4Y2Q3ZjdiNTQsIEwiZnJvbSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRnJvbSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDhlMjlkNzk0LCBMInNpZ25hdHVyZVR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1NpZ25hdHVyZVR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZTExYTJjYmMsIEwicGVybWlzc2lvbnMiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1Blcm1pc3Npb25zLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDQ1M2VhZjM4LCBMInN0YXJ0TmV3IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9TdGFydE5ldywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDlkY2MzYWIzLCBMInRyYWlsZXIiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1RyYWlsZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhNjExOGM4OSwgTCJ0YXJnZXRUeXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UYXJnZXRUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGM4ZGE0ZGE3LCBMInRhcmdldCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVGFyZ2V0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4Y2JjYWY2NmQsIEwibGVhZGVyIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9MZWFkZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDMxYjE5YzEsIEwibmFtZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDMxYjE5YzEsIEwibmFtZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyZDU3NGQ1OCwgTCJ0aGlzIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1hmYV9UaGlzLA0KKyAgICAgLTEsIFhGQV9TQ1JJUFRfT2JqZWN0fSwNCisgICAgezB4NGZkYzM0NTQsIEwidGltZVN0YW1wIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UaW1lU3RhbXAsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiNTk4YTFmNywgTCJ1dWlkIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9VdWlkLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MzFiMTljMSwgTCJuYW1lIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4Y2ZlYTAyZSwgTCJsZWZ0SW5zZXQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0xlZnRJbnNldCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDEzNTZjYWY4LCBMImJvdHRvbUluc2V0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Cb3R0b21JbnNldCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDI1NzY0NDM2LCBMInRvcEluc2V0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Ub3BJbnNldCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDhhNjkyNTIxLCBMInJpZ2h0SW5zZXQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1JpZ2h0SW5zZXQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDFlNDU5YjhmLCBMIm5vblJlcHVkaWF0aW9uIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Ob25SZXB1ZGlhdGlvbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDJiYjNmNDcwLCBMImVuY2lwaGVyT25seSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRW5jaXBoZXJPbmx5LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MmYxNmEzODIsIEwidHlwZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDVmNzYwYjUwLCBMImRpZ2l0YWxTaWduYXR1cmUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0RpZ2l0YWxTaWduYXR1cmUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg2OWFhMjI5MiwgTCJjcmxTaWduIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9DcmxTaWduLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4OThmZDRkODEsIEwia2V5QWdyZWVtZW50IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9LZXlBZ3JlZW1lbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhNjY0MDRjYiwgTCJrZXlFbmNpcGhlcm1lbnQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0tleUVuY2lwaGVybWVudCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjYTVkYzI3YywgTCJkYXRhRW5jaXBoZXJtZW50IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EYXRhRW5jaXBoZXJtZW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZThmMTE4YTgsIEwia2V5Q2VydFNpZ24iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0tleUNlcnRTaWduLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZmVhNTNlYzYsIEwiZGVjaXBoZXJPbmx5IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZWNpcGhlck9ubHksIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4OGI5MGUxZjIsIEwib3BlbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfT3BlbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDk1N2ZhMDA2LCBMImNvbW1pdE9uIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Db21taXRPbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGIxMjEyOGI3LCBMInRleHRFbnRyeSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVGV4dEVudHJ5LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDMxYjE5YzEsIEwibmFtZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDMxYjE5YzEsIEwibmFtZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDIyODJjNzMsIEwiaEFsaWduIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9IQWxpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4ZDRmMWM3LCBMInRleHRJbmRlbnQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1RleHRJbmRlbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MmE4MmQ5OWMsIEwibWFyZ2luUmlnaHQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX01hcmdpblJpZ2h0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NTM0NzI5YzksIEwibWFyZ2luTGVmdCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTWFyZ2luTGVmdCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDU3MzlkMWZmLCBMInJhZGl4T2Zmc2V0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9SYWRpeE9mZnNldCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDU3NzY4MmFjLCBMInByZXNlcnZlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9QcmVzZXJ2ZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDczMWUwNjY1LCBMInNwYWNlQmVsb3ciLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1NwYWNlQmVsb3csIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3YTdjYzM0MSwgTCJ2QWxpZ24iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1ZBbGlnbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDgzNmQ0ZDdjLCBMInRhYkRlZmF1bHQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1RhYkRlZmF1bHQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4ZmEwMTc5MCwgTCJ0YWJTdG9wcyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVGFiU3RvcHMsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDRiMDE5MjEsIEwibGluZUhlaWdodCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTGluZUhlaWdodCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGUxOGI1NjU5LCBMInNwYWNlQWJvdmUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1NwYWNlQWJvdmUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ4NjFmOGFmLCBMImFkZFJldm9jYXRpb25JbmZvIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9BZGRSZXZvY2F0aW9uSW5mbywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmI4ZGY1ZCwgTCJyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1JlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDYxMjhkOGQsIEwiYWN0aXZpdHkiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0FjdGl2aXR5LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg0M2UzNDliLCBMImRhdGFSb3dDb3VudCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGF0YVJvd0NvdW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDI4ZTE3ZTkxLCBMImRhdGFQcmVwIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EYXRhUHJlcCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgzNjUwNTU3ZSwgTCJ0ZXh0TG9jYXRpb24iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1RleHRMb2NhdGlvbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDNiNTgyMjg2LCBMIm1vZHVsZVdpZHRoIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Nb2R1bGVXaWR0aCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDUyNjY2ZjFjLCBMInByaW50Q2hlY2tEaWdpdCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUHJpbnRDaGVja0RpZ2l0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NTQwNGQ2ZGYsIEwibW9kdWxlSGVpZ2h0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Nb2R1bGVIZWlnaHQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1YWIyM2I2YywgTCJzdGFydENoYXIiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1N0YXJ0Q2hhciwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDdjNzMyYTY2LCBMInRydW5jYXRlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UcnVuY2F0ZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDhkMTgxZDYxLCBMIndpZGVOYXJyb3dSYXRpbyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfV2lkZU5hcnJvd1JhdGlvLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4OTk4MDBkN2EsIEwiZXJyb3JDb3JyZWN0aW9uTGV2ZWwiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Vycm9yQ29ycmVjdGlvbkxldmVsLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4OWE2M2RhM2QsIEwidXBzTW9kZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXBzTW9kZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGFmNzU0NjEzLCBMImNoZWNrc3VtIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9DaGVja3N1bSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGIwNDVmYmM1LCBMImNoYXJFbmNvZGluZyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQ2hhckVuY29kaW5nLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwMzVjNmIxLCBMImRhdGFDb2x1bW5Db3VudCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGF0YUNvbHVtbkNvdW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDNjODRkMjUsIEwicm93Q29sdW1uUmF0aW8iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1Jvd0NvbHVtblJhdGlvLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDU3YzUxM2MsIEwiZGF0YUxlbmd0aCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGF0YUxlbmd0aCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY1NzVjYTc1LCBMImVuZENoYXIiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0VuZENoYXIsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgzMWIxOWMxLCBMIm5hbWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyOGRlZTZlOSwgTCJmb3JtYXQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Zvcm1hdCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg2MGQ0YzhiMSwgTCJvdXRwdXQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX091dHB1dCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkNmEzOTk5MCwgTCJpbnB1dCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSW5wdXQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MmI1ZGY1MWUsIEwiZGF0YURlc2NyaXB0aW9uIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EYXRhRGVzY3JpcHRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg2YzBkOTYwMCwgTCJjdXJyZW50VmFsdWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0RlbHRhX0N1cnJlbnRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4OTQyNjQzZjAsIEwic2F2ZWRWYWx1ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRGVsdGFfU2F2ZWRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzhkYTRkYTcsIEwidGFyZ2V0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9EZWx0YV9UYXJnZXQsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDRjYzUzZjgsIEwiaGlnaGxpZ2h0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9IaWdobGlnaHQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDU1MThjMjUsIEwiYnJlYWsiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0JyZWFrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDU3MGNlODM1LCBMInByZXNlbmNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDhlMWMyOTIxLCBMInJlbGV2YW50IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9SZWxldmFudCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkOTk2ZmE5YiwgTCJoYW5kIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9IYW5kLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NzgsIEwieCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9YLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NzksIEwieSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9ZLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MzFiMTljMSwgTCJuYW1lIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MzFiMTljMSwgTCJuYW1lIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDEwNTllYzE4LCBMImxldmVsIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfSW50ZWdlciwNCisgICAgIFhGQV9BVFRSSUJVVEVfTGV2ZWwsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhYzA2ZTJiMCwgTCJjb2xTcGFuIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Db2xTcGFuLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MjFhZWQsIEwiaWQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0lkLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDJmMTA1ZjcyLCBMIndvcmRDaGFyYWN0ZXJDb3VudCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfV29yZENoYXJhY3RlckNvdW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4M2QxMjNjMjYsIEwiaHlwaGVuYXRlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9IeXBoZW5hdGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg2NjUzOWM0OCwgTCJleGNsdWRlSW5pdGlhbENhcCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRXhjbHVkZUluaXRpYWxDYXAsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg2YTk1Yzk3NiwgTCJwdXNoQ2hhcmFjdGVyQ291bnQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1B1c2hDaGFyYWN0ZXJDb3VudCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDk4MmJkODkyLCBMInJlbWFpbkNoYXJhY3RlckNvdW50IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9SZW1haW5DaGFyYWN0ZXJDb3VudCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhlNWM5NmQ2YSwgTCJleGNsdWRlQWxsQ2FwcyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRXhjbHVkZUFsbENhcHMsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4OGFmMmU2NTcsIEwibWF4Q2hhcnMiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX01heENoYXJzLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MGNkMywgTCJ1cmwiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VybCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhNjcxMDI2MiwgTCJjcmVkZW50aWFsU2VydmVyUG9saWN5IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9DcmVkZW50aWFsU2VydmVyUG9saWN5LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMyYmEwOTIzLCBMInVybFBvbGljeSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXJsUG9saWN5LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NDdkMDM0OTAsIEwiY29ubmVjdGlvbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQ29ubmVjdGlvbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGM4ZGE0ZGE3LCBMInRhcmdldCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVGFyZ2V0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGE1MjY4MmJkLCBMIntkZWZhdWx0fSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NzhiZmY1MzEsIEwibnVtYmVyT2ZDZWxscyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0ludGVnZXIsDQorICAgICBYRkFfQVRUUklCVVRFX051bWJlck9mQ2VsbHMsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NjgsIEwiaCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9ILCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NzcsIEwidyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9XLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NzgsIEwieCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9YLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NzksIEwieSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9ZLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MjI4MmM3MywgTCJoQWxpZ24iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0hBbGlnbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgxYWJiZDdlMCwgTCJkYXRhTm9kZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RhdGFOb2RlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfT2JqZWN0fSwNCisgICAgezB4MjU4Mzk4NTIsIEwiYWNjZXNzIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9BY2Nlc3MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyZWU3Njc4ZiwgTCJyb3RhdGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1JvdGF0ZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDNiMWRkZDA2LCBMImZpbGxDb2xvciIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0ZpbGxDb2xvciwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NTRjMzk5ZTMsIEwiZm9ybWF0dGVkVmFsdWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0Zvcm1hdHRlZFZhbHVlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1NzBjZTgzNSwgTCJwcmVzZW5jZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1YTNiMzc1ZCwgTCJib3JkZXJDb2xvciIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0JvcmRlckNvbG9yLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1ZTkzNmVkNiwgTCJmb250Q29sb3IiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9Gb250Q29sb3IsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDY4MjZjNDA4LCBMInBhcmVudFN1YmZvcm0iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX1BhcmVudFN1YmZvcm0sIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDc5YjY3NDM0LCBMIm1hbmRhdG9yeU1lc3NhZ2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9NYW5kYXRvcnlNZXNzYWdlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3YTdjYzM0MSwgTCJ2QWxpZ24iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1ZBbGlnbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDdjMmZmNmFlLCBMIm1heEgiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX01heEgsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3YzJmZjZiZCwgTCJtYXhXIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9NYXhXLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4N2QwMjM1NmMsIEwibWluSCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTWluSCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDdkMDIzNTdiLCBMIm1pblciLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX01pblcsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4NWZkNmZhZiwgTCJtYW5kYXRvcnkiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9NYW5kYXRvcnksIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDhlMWMyOTIxLCBMInJlbGV2YW50IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9SZWxldmFudCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDk2NGZiNDJlLCBMImZvcm1hdE1lc3NhZ2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0Zvcm1hdE1lc3NhZ2UsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGEwM2NmNjI3LCBMInJhd1ZhbHVlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGE2MGRkMjAyLCBMImxlbmd0aCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfTGVuZ3RoLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhYzA2ZTJiMCwgTCJjb2xTcGFuIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Db2xTcGFuLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjOGZhMzUwLCBMImxvY2FsZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jYWxlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzJiZDQwZmQsIEwiYW5jaG9yVHlwZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQW5jaG9yVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGM0ZmVkMDliLCBMImFjY2Vzc0tleSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQWNjZXNzS2V5LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4Y2FiZmEzZDAsIEwidmFsaWRhdGlvbk1lc3NhZ2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9WYWxpZGF0aW9uTWVzc2FnZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZGNlY2Q2NjMsIEwiZWRpdFZhbHVlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9FZGl0VmFsdWUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGUwN2U1MDYxLCBMInNlbGVjdGVkSW5kZXgiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX1NlbGVjdGVkSW5kZXgsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2NWUzNGJlLCBMImJvcmRlcldpZHRoIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fQm9yZGVyV2lkdGgsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDMxYjE5YzEsIEwibmFtZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NjgsIEwiaCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9ILCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NzcsIEwidyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9XLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NzgsIEwieCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9YLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NzksIEwieSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9ZLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDhlMWMyOTIxLCBMInJlbGV2YW50IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9SZWxldmFudCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkODQzNzk4LCBMImZ1bGxUZXh0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfRnVsbFRleHQsDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDFiNmQxY2Y1LCBMInJlZW50ZXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9SZWVudGVyLA0KKyAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgxZTZmZmE5YSwgTCJwcmV2Q29udGVudFR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUHJldkNvbnRlbnRUeXBlLA0KKyAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyNWEzYzIwNiwgTCJzb2FwRmF1bHRTdHJpbmciLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU29hcEZhdWx0U3RyaW5nLA0KKyAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyZTAwYzAwNywgTCJuZXdDb250ZW50VHlwZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjoNCisgICAgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9OZXdDb250ZW50VHlwZSwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NDU3MDUwMGYsIEwibW9kaWZpZXIiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfTW9kaWZpZXIsDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDUwZTJlMzNiLCBMInNlbEVuZCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU2VsRW5kLA0KKyAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1N2RlODdjMiwgTCJwcmV2VGV4dCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjoNCisgICAgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9QcmV2VGV4dCwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NmVhMDRlMGEsIEwic29hcEZhdWx0Q29kZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjoNCisgICAgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Tb2FwRmF1bHRDb2RlLA0KKyAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg2ZjY1NTZjZiwgTCJuZXdUZXh0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfTmV3VGV4dCwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ODkxZjQ2MDYsIEwiY2hhbmdlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9DaGFuZ2UsDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDhmYTNjMTllLCBMInNoaWZ0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1NoaWZ0LA0KKyAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhOWQ5YjJlMSwgTCJrZXlEb3duIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfS2V5RG93biwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmZjODlkYjIsIEwic2VsU3RhcnQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU2VsU3RhcnQsDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMzMmE1ODEyLCBMImNvbW1pdEtleSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjoNCisgICAgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Db21taXRLZXksDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGM4ZGE0ZGE3LCBMInRhcmdldCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfVGFyZ2V0LA0KKyAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTJlMzUxNCwgTCJjYXAiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0NhcCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1MzkyZWE1OCwgTCJzdHJva2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1N0cm9rZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDU3MGNlODM1LCBMInByZXNlbmNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDk0NDQ2ZGNjLCBMInRoaWNrbmVzcyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVGhpY2tuZXNzLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgxZWM4YWIyYywgTCJyYXRlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9SYXRlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDdiMjk2MzBhLCBMInNvdXJjZUJlbG93IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Tb3VyY2VCZWxvdywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDhmYzM2YzBhLCBMIm91dHB1dEJlbG93IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9PdXRwdXRCZWxvdywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGU5OTZiMmZlLCBMInNvdXJjZUFib3ZlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Tb3VyY2VBYm92ZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NjgsIEwiaCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9ILCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NzcsIEwidyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9XLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NzgsIEwieCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9YLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NzksIEwieSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9ZLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MjI4MmM3MywgTCJoQWxpZ24iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0hBbGlnbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmMjMzMzJmLCBMImVycm9yVGV4dCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX0Vycm9yVGV4dCwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MWFiYmQ3ZTAsIEwiZGF0YU5vZGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EYXRhTm9kZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX09iamVjdH0sDQorICAgIHsweDI1ODM5ODUyLCBMImFjY2VzcyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQWNjZXNzLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4M2IxZGRkMDYsIEwiZmlsbENvbG9yIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRmlsbENvbG9yLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1NzBjZTgzNSwgTCJwcmVzZW5jZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1YTNiMzc1ZCwgTCJib3JkZXJDb2xvciIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0JvcmRlckNvbG9yLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3OWI2NzQzNCwgTCJtYW5kYXRvcnlNZXNzYWdlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fTWFuZGF0b3J5TWVzc2FnZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4N2E3Y2MzNDEsIEwidkFsaWduIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9WQWxpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3YzJmZjZhZSwgTCJtYXhIIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9NYXhILCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4N2MyZmY2YmQsIEwibWF4VyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTWF4VywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDdkMDIzNTZjLCBMIm1pbkgiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX01pbkgsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3ZDAyMzU3YiwgTCJtaW5XIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9NaW5XLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4N2U3ZTg0NWUsIEwibGF5b3V0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9MYXlvdXQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4NDY1OTlmOCwgTCJ0cmFuc2llbnQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9UcmFuc2llbnQsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDg1ZmQ2ZmFmLCBMIm1hbmRhdG9yeSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX01hbmRhdG9yeSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4OGUxYzI5MjEsIEwicmVsZXZhbnQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1JlbGV2YW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTAzY2Y2MjcsIEwicmF3VmFsdWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9EZWZhdWx0QW5kUmF3VmFsdWUsDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGE1MjY4MmJkLCBMIntkZWZhdWx0fSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX0RlZmF1bHRBbmRSYXdWYWx1ZSwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YWMwNmUyYjAsIEwiY29sU3BhbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQ29sU3BhbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMmJkNDBmZCwgTCJhbmNob3JUeXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9BbmNob3JUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzRmZWQwOWIsIEwiYWNjZXNzS2V5IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9BY2Nlc3NLZXksIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjYWJmYTNkMCwgTCJ2YWxpZGF0aW9uTWVzc2FnZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX1ZhbGlkYXRpb25NZXNzYWdlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNjVlMzRiZSwgTCJib3JkZXJXaWR0aCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0JvcmRlcldpZHRoLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhlZGE5MDE3YSwgTCJzY29wZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfU2NvcGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDQ3ZDAzNDkwLCBMImNvbm5lY3Rpb24iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Nvbm5lY3Rpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg2Y2ZhODI4YSwgTCJydW5BdCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUnVuQXQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhMWIwZDJmNSwgTCJleGVjdXRlVHlwZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRXhlY3V0ZVR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhlNmY5OTQ4NywgTCJoU2Nyb2xsUG9saWN5IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9IU2Nyb2xsUG9saWN5LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDQyZmVkMWZkLCBMImNvbnRlbnRUeXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDU0ZmE3MjJjLCBMInRyYW5zZmVyRW5jb2RpbmciLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1RyYW5zZmVyRW5jb2RpbmcsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWVfUmVhZCwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQxNzFiMjQwLCBMImFzcGVjdCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQXNwZWN0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWVfUmVhZCwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZGI1NWZlYzUsIEwiaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9WYWx1ZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3ZjZmZDNkNywgTCJzZXJ2ZXIiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1NlcnZlciwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NGI4YmM4NDAsIEwiZnJhY0RpZ2l0cyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRnJhY0RpZ2l0cywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGE1MjY4MmJkLCBMIntkZWZhdWx0fSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkZTdmOTJiYSwgTCJsZWFkRGlnaXRzIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9MZWFkRGlnaXRzLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NjgsIEwiaCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9ILCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NzcsIEwidyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9XLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NzgsIEwieCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9YLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NzksIEwieSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9ZLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MjI4MmM3MywgTCJoQWxpZ24iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0hBbGlnbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgxNDE0ZDQzMSwgTCJhbGxvd01hY3JvIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9BbGxvd01hY3JvLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MTUxN2RmYTEsIEwiY29sdW1uV2lkdGhzIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Db2x1bW5XaWR0aHMsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgxYWJiZDdlMCwgTCJkYXRhTm9kZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RhdGFOb2RlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfT2JqZWN0fSwNCisgICAgezB4MWVlMmQyNGQsIEwiaW5zdGFuY2VJbmRleCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0luc3RhbmNlSW5kZXgsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDI1ODM5ODUyLCBMImFjY2VzcyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQWNjZXNzLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4M2IxZGRkMDYsIEwiZmlsbENvbG9yIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRmlsbENvbG9yLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1NzBjZTgzNSwgTCJwcmVzZW5jZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1YTNiMzc1ZCwgTCJib3JkZXJDb2xvciIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0JvcmRlckNvbG9yLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3YTdjYzM0MSwgTCJ2QWxpZ24iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1ZBbGlnbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDdjMmZmNmFlLCBMIm1heEgiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX01heEgsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3YzJmZjZiZCwgTCJtYXhXIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9NYXhXLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4N2QwMjM1NmMsIEwibWluSCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTWluSCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDdkMDIzNTdiLCBMIm1pblciLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX01pblcsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3ZTdlODQ1ZSwgTCJsYXlvdXQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0xheW91dCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDhlMWMyOTIxLCBMInJlbGV2YW50IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9SZWxldmFudCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDljYzE3ZDc1LCBMIm1lcmdlTW9kZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTWVyZ2VNb2RlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4OWYzZTk1MTAsIEwiaW5zdGFuY2VNYW5hZ2VyIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9TdWJmb3JtX0luc3RhbmNlTWFuYWdlciwgLTEsDQorICAgICBYRkFfU0NSSVBUX09iamVjdH0sDQorICAgIHsweGFjMDZlMmIwLCBMImNvbFNwYW4iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0NvbFNwYW4sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmM4ZmEzNTAsIEwibG9jYWxlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9TdWJmb3JtX0xvY2FsZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzJiZDQwZmQsIEwiYW5jaG9yVHlwZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQW5jaG9yVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGNhYmZhM2QwLCBMInZhbGlkYXRpb25NZXNzYWdlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fVmFsaWRhdGlvbk1lc3NhZ2UsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGU0YzNhNWU1LCBMInJlc3RvcmVTdGF0ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUmVzdG9yZVN0YXRlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZWRhOTAxN2EsIEwic2NvcGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1Njb3BlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjY1ZTM0YmUsIEwiYm9yZGVyV2lkdGgiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9Cb3JkZXJXaWR0aCwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MmYxNmEzODIsIEwidHlwZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDVhNTBlOWU2LCBMInZlcnNpb24iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0hhbmRsZXJfVmVyc2lvbiwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDQxMDdlZCwgTCJmb3hpdEFwcFR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjoNCisgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0ZveGl0QXBwVHlwZSwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MzFiMTljMSwgTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfTmFtZSwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NjZjMWFlOSwgTCJ2YWxpZGF0aW9uc0VuYWJsZWQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjoNCisgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1ZhbGlkYXRpb25zRW5hYmxlZCwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MTRkMDQ1MDIsIEwidGl0bGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1RpdGxlLA0KKyAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgxOTNhZmU4YiwgTCJmb3hpdE5hbWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjoNCisgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0ZveGl0TmFtZSwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MzkyYWU0NDUsIEwicGxhdGZvcm0iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1BsYXRmb3JtLA0KKyAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1YTUwZTllNiwgTCJ2ZXJzaW9uIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1ZlcnNpb24sDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDY2Y2IxZWVkLCBMInZhcmlhdGlvbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfVmFyaWF0aW9uLA0KKyAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3NzE3Y2JjNCwgTCJsYW5ndWFnZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfTGFuZ3VhZ2UsDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDg2Njk4OTYzLCBMImFwcFR5cGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfQXBwVHlwZSwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4OTRmZjllOGQsIEwiY2FsY3VsYXRpb25zRW5hYmxlZCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfQ2FsY3VsYXRpb25zRW5hYmxlZCwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmNkNDQ5NDAsIEwiY3VycmVudFBhZ2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjoNCisgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0N1cnJlbnRQYWdlLA0KKyAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkNDI4Njg3MCwgTCJmb3hpdFZlcnNpb24iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjoNCisgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0ZveGl0VmVyc2lvbiwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDU5MmI5MjAsIEwibnVtUGFnZXMiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX051bVBhZ2VzLA0KKyAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MjRkODUxNjcsIEwidGltZW91dCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVGltZW91dCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3ZDlmZDdjNSwgTCJtb2RlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Nb2RlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3ZDlmZDdjNSwgTCJtb2RlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9TdWJtaXRGb3JtYXRfTW9kZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGE1MjY4MmJkLCBMIntkZWZhdWx0fSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyMDM4YzliMiwgTCJyb2xlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Sb2xlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgzMWIxOWMxLCBMIm5hbWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmY2VmODZiNSwgTCJyZWFkeSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1JlYWR5LA0KKyAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NTM5MmVhNTgsIEwic3Ryb2tlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9TdHJva2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1NzBjZTgzNSwgTCJwcmVzZW5jZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3Yjk1ZTY2MSwgTCJpbnZlcnRlZCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSW52ZXJ0ZWQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg5NDQ0NmRjYywgTCJ0aGlja25lc3MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1RoaWNrbmVzcywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhlOGRkZGY1MCwgTCJqb2luIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Kb2luLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZTk0OGI5YTgsIEwicmFkaXVzIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9SYWRpdXMsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YWJmYTZjNGYsIEwiY1NwYWNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9DU3BhY2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1ZhbHVlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4Mzg0OGIzZiwgTCJuZXh0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9OZXh0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDZhMzQwNWRkLCBMInByZXZpb3VzIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9QcmV2aW91cywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI1OTU0MywgTCJpbnRhY3QiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0ludGFjdCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyNjhiN2VjMSwgTCJjb21tYW5kVHlwZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQ29tbWFuZFR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJkZTlhYmRhLCBMImRhdGEiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0RhdGEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NWI3MDdhMzUsIEwic2NyaXB0VGVzdCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfU2NyaXB0VGVzdCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDZiNmRkY2ZiLCBMIm51bGxUZXN0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9OdWxsVGVzdCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZTY0YjExMjksIEwiZm9ybWF0VGVzdCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRm9ybWF0VGVzdCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDhjOTkzNzdlLCBMInJlbGF0aW9uIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9SZWxhdGlvbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDhlMWMyOTIxLCBMInJlbGV2YW50IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9SZWxldmFudCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MjUzNjMsIEwidG8iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1RvLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NjY2NDJmOGYsIEwiZm9yY2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Gb3JjZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjZDdmN2I1NCwgTCJmcm9tIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Gcm9tLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1ZhbHVlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MmI1ZGY1MWUsIEwiZGF0YURlc2NyaXB0aW9uIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EYXRhRGVzY3JpcHRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYjhkZjVkLCBMInJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDIyNmNhOGYxLCBMIm9wZXJhdGlvbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfT3BlcmF0aW9uLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGZiNjcxODUsIEwicmVjb3Jkc0JlZm9yZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0RhdGFXaW5kb3c6Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0X0RhdGFXaW5kb3dfUmVjb3Jkc0JlZm9yZSwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MjFkNWRmY2IsIEwiY3VycmVudFJlY29yZE51bWJlciIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9EYXRhV2luZG93OjoNCisgICAgICAgICBTY3JpcHRfRGF0YVdpbmRvd19DdXJyZW50UmVjb3JkTnVtYmVyLA0KKyAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgzMTJhZjA0NCwgTCJyZWNvcmRzQWZ0ZXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9EYXRhV2luZG93OjoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmlwdF9EYXRhV2luZG93X1JlY29yZHNBZnRlciwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NmFhYjM3Y2IsIEwiaXNEZWZpbmVkIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0RhdGFXaW5kb3c6OlNjcmlwdF9EYXRhV2luZG93X0lzRGVmaW5lZCwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDQyZmVkMWZkLCBMImNvbnRlbnRUeXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDZjZmE4MjhhLCBMInJ1bkF0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9SdW5BdCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGEwMjFiNzM4LCBMInN0YXRlbGVzcyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU2NyaXB0X1N0YXRlbGVzcywgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhZGM0Yzc3YiwgTCJiaW5kaW5nIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9CaW5kaW5nLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4N2EwY2M0NzEsIEwicGFzc3dvcmRDaGFyIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9QYXNzd29yZENoYXIsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZTZmOTk0ODcsIEwiaFNjcm9sbFBvbGljeSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSFNjcm9sbFBvbGljeSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZTZmOTk0ODcsIEwiaFNjcm9sbFBvbGljeSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSFNjcm9sbFBvbGljeSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDE0YTMyZDUyLCBMInBhZ2VQb3NpdGlvbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUGFnZVBvc2l0aW9uLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ODM0MGVhNjYsIEwib2RkT3JFdmVuIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9PZGRPckV2ZW4sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhODVlNzRmMywgTCJpbml0aWFsTnVtYmVyIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Jbml0aWFsTnVtYmVyLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlOWJhNDcyLCBMIm51bWJlcmVkIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9OdW1iZXJlZCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ3MDc5OGMyLCBMImJsYW5rT3JOb3RCbGFuayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQmxhbmtPck5vdEJsYW5rLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MzRhZTEwM2MsIEwicmVzZXJ2ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUmVzZXJ2ZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDU3MGNlODM1LCBMInByZXNlbmNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmMjAwOTMzOSwgTCJwbGFjZW1lbnQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1BsYWNlbWVudCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg0MmZlZDFmZCwgTCJjb250ZW50VHlwZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1NGZhNzIyYywgTCJ0cmFuc2ZlckVuY29kaW5nIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UcmFuc2ZlckVuY29kaW5nLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzQ1NDdhMDgsIEwibWF4TGVuZ3RoIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9NYXhMZW5ndGgsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZGI1NWZlYzUsIEwiaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDI5NDE4YmI3LCBMImFiYnIiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0FiYnIsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNTMxYjA1OSwgTCJ3cml0aW5nU2NyaXB0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Xcml0aW5nU2NyaXB0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MWI4ZGNlM2UsIEwiYWN0aW9uIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9BY3Rpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4OWRjYzNhYjMsIEwidHJhaWxlciIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVHJhaWxlciwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjOGRhNGRhNywgTCJ0YXJnZXQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1RhcmdldCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGNiY2FmNjZkLCBMImxlYWRlciIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTGVhZGVyLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MzFiMTljMSwgTCJuYW1lIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGIzNTQzYTYsIEwibWF4IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfTWF4LCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiMzU2Y2E0LCBMIm1pbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX01pbiwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NmY1NDRkNDksIEwiY291bnQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0luc3RhbmNlTWFuYWdlcl9Db3VudCwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MjUzNjMsIEwidG8iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1RvLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTA5MzM5NTQsIEwidW5pY29kZVJhbmdlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vbmljb2RlUmFuZ2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4Y2Q3ZjdiNTQsIEwiZnJvbSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRnJvbSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDRlZjNkMDJjLCBMIm9yaWVudGF0aW9uIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9PcmllbnRhdGlvbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDY1ZTMwYzY3LCBMImltYWdpbmdCQm94IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9JbWFnaW5nQkJveCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDkwNDFkNGIwLCBMInNob3J0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9TaG9ydCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhlMzQ5ZDA0NCwgTCJzdG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfU3RvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0YWZiMCwgTCJsb25nIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb25nLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NWNlNjE5NSwgTCJ2U2Nyb2xsUG9saWN5IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9WU2Nyb2xsUG9saWN5LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDFlZjNhNjRhLCBMImFsbG93UmljaFRleHQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0FsbG93UmljaFRleHQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1YTMyZTQ5MywgTCJtdWx0aUxpbmUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX011bHRpTGluZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhlNmY5OTQ4NywgTCJoU2Nyb2xsUG9saWN5IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9IU2Nyb2xsUG9saWN5LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ1MjQ4MmUwLCBMIm1heEVudHJpZXMiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX01heEVudHJpZXMsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NDJmZWQxZmQsIEwiY29udGVudFR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ODg1NTgwNWYsIEwiY29udGFpbnMiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0NvbnRhaW5zLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZTM3MmFlOTcsIEwiaXNOdWxsIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfSXNOdWxsLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MmI1ZGY1MWUsIEwiZGF0YURlc2NyaXB0aW9uIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EYXRhRGVzY3JpcHRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYjhkZjVkLCBMInJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDIyNmNhOGYxLCBMIm9wZXJhdGlvbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfT3BlcmF0aW9uLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGM4ZGE0ZGE3LCBMInRhcmdldCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVGFyZ2V0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MzFiMTljMSwgTCJuYW1lIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmI4ZGY1ZCwgTCJyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1JlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg0MmZlZDFmZCwgTCJjb250ZW50VHlwZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1NGZhNzIyYywgTCJ0cmFuc2ZlckVuY29kaW5nIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UcmFuc2ZlckVuY29kaW5nLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGYxOTc4NDRkLCBMIm1hdGNoIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9NYXRjaCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkOTk2ZmE5YiwgTCJoYW5kIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9IYW5kLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MjFhZWQsIEwiaWQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0lkLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MzFiMTljMSwgTCJuYW1lIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MjhkZWU2ZTksIEwiZm9ybWF0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9FbmNyeXB0X0Zvcm1hdCwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDY4LCBMImgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDc3LCBMInciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDc4LCBMIngiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfWCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDc5LCBMInkiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfWSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDIyODJjNzMsIEwiaEFsaWduIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9IQWxpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MmVlNzY3OGYsIEwicm90YXRlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Sb3RhdGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg1NzBjZTgzNSwgTCJwcmVzZW5jZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3YTdjYzM0MSwgTCJ2QWxpZ24iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1ZBbGlnbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDdjMmZmNmFlLCBMIm1heEgiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX01heEgsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg3YzJmZjZiZCwgTCJtYXhXIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9NYXhXLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4N2QwMjM1NmMsIEwibWluSCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTWluSCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDdkMDIzNTdiLCBMIm1pblciLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX01pblcsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhMDNjZjYyNywgTCJyYXdWYWx1ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhYzA2ZTJiMCwgTCJjb2xTcGFuIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Db2xTcGFuLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjOGZhMzUwLCBMImxvY2FsZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jYWxlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzJiZDQwZmQsIEwiYW5jaG9yVHlwZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQW5jaG9yVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgzOWNkYjBhMiwgTCJwcmlvcml0eSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfUHJpb3JpdHksIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZWI1MTFiNTQsIEwiZGlzYWJsZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGlzYWJsZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9WYWx1ZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MjFhZWQsIEwiaWQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0lkLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDU3MGNlODM1LCBMInByZXNlbmNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjYjBhYzksIEwibGluZVRocm91Z2giLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0xpbmVUaHJvdWdoLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MmMxYzdmMSwgTCJ0eXBlZmFjZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVHlwZWZhY2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4Yzc0YWU5LCBMImZvbnRIb3Jpem9udGFsU2NhbGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0ZvbnRIb3Jpem9udGFsU2NhbGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MmNkNzkwMzMsIEwia2VybmluZ01vZGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0tlcm5pbmdNb2RlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4M2EwMjczYTYsIEwidW5kZXJsaW5lIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9VbmRlcmxpbmUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg0ODczYzYwMSwgTCJiYXNlbGluZVNoaWZ0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9CYXNlbGluZVNoaWZ0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NGIzMTk3NjcsIEwib3ZlcmxpbmVQZXJpb2QiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX092ZXJsaW5lUGVyaW9kLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4Nzk1NDMwNTUsIEwibGV0dGVyU3BhY2luZyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTGV0dGVyU3BhY2luZywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDhlYzYyMDRjLCBMImxpbmVUaHJvdWdoUGVyaW9kIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9MaW5lVGhyb3VnaFBlcmlvZCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDkwN2M3NzE5LCBMImZvbnRWZXJ0aWNhbFNjYWxlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Gb250VmVydGljYWxTY2FsZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGE2ODY5NzViLCBMInNpemUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1NpemUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiNWU0OWJmMiwgTCJwb3N0dXJlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Qb3N0dXJlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJkNmUxZDg4LCBMIndlaWdodCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfV2VpZ2h0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmQ5NmEwZTksIEwidW5kZXJsaW5lUGVyaW9kIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9VbmRlcmxpbmVQZXJpb2QsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMGVjOWZhNCwgTCJvdmVybGluZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfT3ZlcmxpbmUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhZjc1NDYxMywgTCJjaGVja3N1bSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRm9ybV9DaGVja3N1bSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDhlMWMyOTIxLCBMInJlbGV2YW50IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9SZWxldmFudCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhlYTcwOTBhMCwgTCJvdmVycmlkZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX092ZXJyaWRlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDlkY2MzYWIzLCBMInRyYWlsZXIiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1RyYWlsZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4Y2JjYWY2NmQsIEwibGVhZGVyIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9MZWFkZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NjBhNjFlZGQsIEwiY29kZVR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0NvZGVUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YjM3M2E4NjIsIEwiYXJjaGl2ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQXJjaGl2ZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhlMWEyNmI1NiwgTCJjb2RlQmFzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQ29kZUJhc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhlYjA5MTAwMywgTCJjbGFzc0lkIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9DbGFzc0lkLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NDdkMDM0OTAsIEwiY29ubmVjdGlvbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQ29ubmVjdGlvbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMzOWE4OGJkLCBMImxhYmVsUmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9MYWJlbFJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGQ1MGY5MDNhLCBMInZhbHVlUmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9WYWx1ZVJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZWE3MDkwYTAsIEwib3ZlcnJpZGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX092ZXJyaWRlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0V4dHJhc19UeXBlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmI4ZGY1ZCwgTCJyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1JlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyNGQ4NTE2NywgTCJ0aW1lb3V0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UaW1lb3V0LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NDdkMDM0OTAsIEwiY29ubmVjdGlvbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQ29ubmVjdGlvbiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDU1MmQ5YWQ1LCBMInVzYWdlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2FnZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjODYwZjMwYSwgTCJkZWxheWVkT3BlbiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVsYXllZE9wZW4sIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MjhkZWU2ZTksIEwiZm9ybWF0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Gb3JtYXQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg4MjRmMjFiNywgTCJlbWJlZFBERiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRW1iZWRQREYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzhkYTRkYTcsIEwidGFyZ2V0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UYXJnZXQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkYzc1Njc2YywgTCJ0ZXh0RW5jb2RpbmciLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1RleHRFbmNvZGluZywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY4ODllNzQ3LCBMInhkcENvbnRlbnQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1hkcENvbnRlbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg5N2JlOTFiLCBMImNvbnRlbnQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1BhY2tldF9Db250ZW50LCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDQxNTZlZTNmLCBMImRlbGltaXRlciIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVsaW1pdGVyLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyMWFlZCwgTCJpZCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSWQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgzMWIxOWMxLCBMIm5hbWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJiOGRmNWQsIEwicmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9SZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyMWFlZCwgTCJpZCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSWQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4MmYxNmEzODIsIEwidHlwZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NDUzZWFmMzgsIEwic3RhcnROZXciLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1N0YXJ0TmV3LCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4OWRjYzNhYjMsIEwidHJhaWxlciIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVHJhaWxlciwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGE2MTE4Yzg5LCBMInRhcmdldFR5cGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1RhcmdldFR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzhkYTRkYTcsIEwidGFyZ2V0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9UYXJnZXQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjYmNhZjY2ZCwgTCJsZWFkZXIiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0xlYWRlciwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGMwODExZWQsIEwidXNlIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhYmVmMzdlMywgTCJzbG9wZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfU2xvcGUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZDk5NmZhOWIsIEwiaGFuZCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSGFuZCwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGE2MGRkMjAyLCBMImxlbmd0aCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X0xpc3RDbGFzc19MZW5ndGgsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDIwMTQ2LCBMImRiIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9EYiwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiMzU0M2E2LCBMIm1heCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9PY2N1cl9NYXgsDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGIzNTZjYTQsIEwibWluIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X09jY3VyX01pbiwNCisgICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDdkMGI1ZmNhLCBMImluaXRpYWwiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0luaXRpYWwsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLA0KKyAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4Mjk0MThiYjcsIEwiYWJiciIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfQWJiciwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsDQorICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDMxYjE5YzEsIEwibmFtZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwNCisgICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJiOGRmNWQsIEwicmVmIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLA0KKyAgICAgWEZBX0FUVFJJQlVURV9SZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4NTcwY2U4MzUsIEwicHJlc2VuY2UiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4YTViNDEwY2YsIEwic2F2ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfU2F2ZSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhiMmM4MDg1NywgTCJjbGFzc05hbWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfT2JqZWN0OjpTY3JpcHRfT2JqZWN0Q2xhc3NfQ2xhc3NOYW1lLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhhNjBkZDIwMiwgTCJsZW5ndGgiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZUxpc3Q6OlNjcmlwdF9MaXN0Q2xhc3NfTGVuZ3RoLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgzMWIxOWMxLCBMIm5hbWUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsDQorICAgICBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHg5ZjlkMGY5LCBMImFsbCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX0FsbCwgLTEsDQorICAgICBYRkFfU0NSSVBUX09iamVjdH0sDQorICAgIHsweDRkZjE1NjU5LCBMIm5vZGVzIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfTm9kZXMsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9PYmplY3R9LA0KKyAgICB7MHg3OGE4ZDZjZiwgTCJjbGFzc0FsbCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX0NsYXNzQWxsLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfT2JqZWN0fSwNCisgICAgezB4Y2FkNmQ4Y2EsIEwicGFyZW50IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfUGFyZW50LCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfT2JqZWN0fSwNCisgICAgezB4ZDU2NzljNzgsIEwiaW5kZXgiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19JbmRleCwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCisgICAgezB4ZGI1YjRiY2UsIEwiY2xhc3NJbmRleCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX0NsYXNzSW5kZXgsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGU0OTg5YWRmLCBMInNvbUV4cHJlc3Npb24iLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19Tb21FeHByZXNzaW9uLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyMWFlZCwgTCJpZCIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywNCisgICAgIFhGQV9BVFRSSUJVVEVfSWQsIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHgyMzRhMSwgTCJucyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfTnMsDQorICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweDUwZDFhOWQxLCBMIm1vZGVsIiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfTW9kZWwsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9PYmplY3R9LA0KKyAgICB7MHhhY2I0ODIzZiwgTCJpc0NvbnRhaW5lciIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0lzQ29udGFpbmVyLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhlMzcyYWU5NywgTCJpc051bGwiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19Jc051bGwsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9CYXNpY30sDQorICAgIHsweGZlNjEyYTViLCBMIm9uZU9mQ2hpbGQiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19PbmVPZkNoaWxkLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfT2JqZWN0fSwNCisgICAgezB4OTdjMWM2NSwgTCJjb250ZXh0IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Nb2RlbENsYXNzX0NvbnRleHQsIC0xLA0KKyAgICAgWEZBX1NDUklQVF9PYmplY3R9LA0KKyAgICB7MHg1OGJlMjg3MCwgTCJhbGlhc05vZGUiLA0KKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X01vZGVsQ2xhc3NfQWxpYXNOb2RlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfT2JqZWN0fSwNCisgICAgezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwNCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwNCisgICAgIFhGQV9TQ1JJUFRfQmFzaWN9LA0KKyAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsDQorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsDQorICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwNCit9Ow0KK2V4dGVybiBjb25zdCBpbnQzMl90IGdfaVNvbUF0dHJpYnV0ZUNvdW50ID0NCisgICAgc2l6ZW9mKGdfU29tQXR0cmlidXRlRGF0YSkgLyBzaXplb2YoWEZBX0FUVFJJQlVURUlORk8pOw0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9iYXNpY19pbXAuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2Jhc2ljX2ltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJkMGQ5NQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9iYXNpY19pbXAuY3BwCkBAIC0wLDAgKzEsNjI0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV91dGlscy5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfb2JqZWN0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2N1bWVudC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfcGFyc2VyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9zY3JpcHQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY2RhdGEuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY2xheW91dC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfbG9jYWxlbWdyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9mbTJqc2FwaS5oIg0KKyNpbmNsdWRlICJ4ZmFfYmFzaWNfaW1wLmgiDQorZXh0ZXJuIGNvbnN0IFhGQV9QQUNLRVRJTkZPIGdfWEZBUGFja2V0RGF0YVtdOw0KK2V4dGVybiBjb25zdCBpbnQzMl90IGdfaVhGQVBhY2tldENvdW50Ow0KK2V4dGVybiBjb25zdCBYRkFfQVRUUklCVVRFRU5VTUlORk8gZ19YRkFFbnVtRGF0YVtdOw0KK2V4dGVybiBjb25zdCBpbnQzMl90IGdfaVhGQUVudW1Db3VudDsNCitleHRlcm4gY29uc3QgWEZBX0FUVFJJQlVURUlORk8gZ19YRkFBdHRyaWJ1dGVEYXRhW107DQorZXh0ZXJuIGNvbnN0IGludDMyX3QgZ19pWEZBQXR0cmlidXRlQ291bnQ7DQorZXh0ZXJuIGNvbnN0IFhGQV9FTEVNRU5USU5GTyBnX1hGQUVsZW1lbnREYXRhW107DQorZXh0ZXJuIGNvbnN0IGludDMyX3QgZ19pWEZBRWxlbWVudENvdW50Ow0KK2V4dGVybiBjb25zdCBYRkFfRUxFTUVOVEhJRVJBUkNIWSBnX1hGQUVsZW1lbnRDaGlsZHJlbkluZGV4W107DQorZXh0ZXJuIGNvbnN0IEZYX1dPUkQgZ19YRkFFbGVtZW50Q2hpbGRyZW5EYXRhW107DQorZXh0ZXJuIGNvbnN0IFhGQV9FTEVNRU5USElFUkFSQ0hZIGdfWEZBRWxlbWVudEF0dHJpYnV0ZUluZGV4W107DQorZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ19YRkFFbGVtZW50QXR0cmlidXRlRGF0YVtdOw0KK2V4dGVybiBjb25zdCBYRkFfTk9UU1VSRUFUVFJJQlVURSBnX1hGQU5vdHN1cmVBdHRyaWJ1dGVzW107DQorZXh0ZXJuIGNvbnN0IGludDMyX3QgZ19pWEZBTm90c3VyZUNvdW50Ow0KK2V4dGVybiBjb25zdCBYRkFfRUxFTUVOVEhJRVJBUkNIWSBnX1hGQUVsZW1lbnRQcm9wZXJ0eUluZGV4W107DQorZXh0ZXJuIGNvbnN0IFhGQV9QUk9QRVJUWSBnX1hGQUVsZW1lbnRQcm9wZXJ0eURhdGFbXTsNCitleHRlcm4gY29uc3QgWEZBX1NDUklQVEhJRVJBUkNIWSBnX1hGQVNjcmlwdEluZGV4W107DQorZXh0ZXJuIGNvbnN0IFhGQV9NRVRIT0RJTkZPIGdfU29tTWV0aG9kRGF0YVtdOw0KK2V4dGVybiBjb25zdCBpbnQzMl90IGdfaVNvbU1ldGhvZENvdW50Ow0KK2V4dGVybiBjb25zdCBYRkFfU0NSSVBUQVRUUklCVVRFSU5GTyBnX1NvbUF0dHJpYnV0ZURhdGFbXTsNCitleHRlcm4gY29uc3QgaW50MzJfdCBnX2lTb21BdHRyaWJ1dGVDb3VudDsNCitYRkFfTFBDUEFDS0VUSU5GTyBYRkFfR2V0UGFja2V0QnlOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSB3c05hbWUuR2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCA9PSAwKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgdWludDMyX3QgdUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05hbWUuR2V0UHRyKCksIGlMZW5ndGgpOw0KKyAgaW50MzJfdCBpU3RhcnQgPSAwLCBpRW5kID0gZ19pWEZBUGFja2V0Q291bnQgLSAxOw0KKyAgZG8gew0KKyAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICBYRkFfTFBDUEFDS0VUSU5GTyBwSW5mbyA9IGdfWEZBUGFja2V0RGF0YSArIGlNaWQ7DQorICAgIGlmICh1SGFzaCA9PSBwSW5mby0+dUhhc2gpIHsNCisgICAgICByZXR1cm4gcEluZm87DQorICAgIH0gZWxzZSBpZiAodUhhc2ggPCBwSW5mby0+dUhhc2gpIHsNCisgICAgICBpRW5kID0gaU1pZCAtIDE7DQorICAgIH0gZWxzZSB7DQorICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgIH0NCisgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCisgIHJldHVybiBOVUxMOw0KK30NCitYRkFfTFBDUEFDS0VUSU5GTyBYRkFfR2V0UGFja2V0QnlJRChGWF9EV09SRCBkd1BhY2tldCkgew0KKyAgaW50MzJfdCBpU3RhcnQgPSAwLCBpRW5kID0gZ19pWEZBUGFja2V0Q291bnQgLSAxOw0KKyAgZG8gew0KKyAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICBGWF9EV09SRCBkd0ZpbmQgPSAoZ19YRkFQYWNrZXREYXRhICsgaU1pZCktPmVOYW1lOw0KKyAgICBpZiAoZHdQYWNrZXQgPT0gZHdGaW5kKSB7DQorICAgICAgcmV0dXJuIGdfWEZBUGFja2V0RGF0YSArIGlNaWQ7DQorICAgIH0gZWxzZSBpZiAoZHdQYWNrZXQgPCBkd0ZpbmQpIHsNCisgICAgICBpRW5kID0gaU1pZCAtIDE7DQorICAgIH0gZWxzZSB7DQorICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgIH0NCisgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCisgIHJldHVybiBOVUxMOw0KK30NCitYRkFfTFBDQVRUUklCVVRFRU5VTUlORk8gWEZBX0dldEF0dHJpYnV0ZUVudW1CeU5hbWUoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSB3c05hbWUuR2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCA9PSAwKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgdWludDMyX3QgdUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05hbWUuR2V0UHRyKCksIGlMZW5ndGgpOw0KKyAgaW50MzJfdCBpU3RhcnQgPSAwLCBpRW5kID0gZ19pWEZBRW51bUNvdW50IC0gMTsNCisgIGRvIHsNCisgICAgaW50MzJfdCBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgWEZBX0xQQ0FUVFJJQlVURUVOVU1JTkZPIHBJbmZvID0gZ19YRkFFbnVtRGF0YSArIGlNaWQ7DQorICAgIGlmICh1SGFzaCA9PSBwSW5mby0+dUhhc2gpIHsNCisgICAgICByZXR1cm4gcEluZm87DQorICAgIH0gZWxzZSBpZiAodUhhc2ggPCBwSW5mby0+dUhhc2gpIHsNCisgICAgICBpRW5kID0gaU1pZCAtIDE7DQorICAgIH0gZWxzZSB7DQorICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgIH0NCisgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCisgIHJldHVybiBOVUxMOw0KK30NCitYRkFfTFBDQVRUUklCVVRFRU5VTUlORk8gWEZBX0dldEF0dHJpYnV0ZUVudW1CeUlEKFhGQV9BVFRSSUJVVEVFTlVNIGVOYW1lKSB7DQorICByZXR1cm4gZ19YRkFFbnVtRGF0YSArIGVOYW1lOw0KK30NCitpbnQzMl90IFhGQV9HZXRBdHRyaWJ1dGVDb3VudCgpIHsNCisgIHJldHVybiBnX2lYRkFBdHRyaWJ1dGVDb3VudDsNCit9DQorWEZBX0xQQ0FUVFJJQlVURUlORk8gWEZBX0dldEF0dHJpYnV0ZUJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSkgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gd3NOYW1lLkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggPT0gMCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHVpbnQzMl90IHVIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NOYW1lLkdldFB0cigpLCBpTGVuZ3RoKTsNCisgIGludDMyX3QgaVN0YXJ0ID0gMCwgaUVuZCA9IGdfaVhGQUF0dHJpYnV0ZUNvdW50IC0gMTsNCisgIGRvIHsNCisgICAgaW50MzJfdCBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgWEZBX0xQQ0FUVFJJQlVURUlORk8gcEluZm8gPSBnX1hGQUF0dHJpYnV0ZURhdGEgKyBpTWlkOw0KKyAgICBpZiAodUhhc2ggPT0gcEluZm8tPnVIYXNoKSB7DQorICAgICAgcmV0dXJuIHBJbmZvOw0KKyAgICB9IGVsc2UgaWYgKHVIYXNoIDwgcEluZm8tPnVIYXNoKSB7DQorICAgICAgaUVuZCA9IGlNaWQgLSAxOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICB9DQorICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICByZXR1cm4gTlVMTDsNCit9DQorWEZBX0xQQ0FUVFJJQlVURUlORk8gWEZBX0dldEF0dHJpYnV0ZUJ5SUQoWEZBX0FUVFJJQlVURSBlTmFtZSkgew0KKyAgcmV0dXJuIChlTmFtZSA8IGdfaVhGQUF0dHJpYnV0ZUNvdW50KSA/IChnX1hGQUF0dHJpYnV0ZURhdGEgKyBlTmFtZSkgOiBOVUxMOw0KK30NCitGWF9CT09MIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWUodm9pZComIHBWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3UGFja2V0KSB7DQorICBYRkFfTFBDQVRUUklCVVRFSU5GTyBwSW5mbyA9IFhGQV9HZXRBdHRyaWJ1dGVCeUlEKGVBdHRyaWJ1dGUpOw0KKyAgaWYgKHBJbmZvID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGR3UGFja2V0ICYmIChkd1BhY2tldCAmIHBJbmZvLT5kd1BhY2tldHMpID09IDApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHBJbmZvLT5lVHlwZSA9PSBlVHlwZSkgew0KKyAgICBwVmFsdWUgPSBwSW5mby0+cERlZlZhbHVlOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0gZWxzZSBpZiAocEluZm8tPmVUeXBlID09IFhGQV9BVFRSSUJVVEVUWVBFX05PVFNVUkUpIHsNCisgICAgWEZBX0xQQ05PVFNVUkVBVFRSSUJVVEUgcEF0dHIgPQ0KKyAgICAgICAgWEZBX0dldE5vdHN1cmVBdHRyaWJ1dGUoZUVsZW1lbnQsIGVBdHRyaWJ1dGUsIGVUeXBlKTsNCisgICAgaWYgKHBBdHRyKSB7DQorICAgICAgcFZhbHVlID0gcEF0dHItPnBWYWx1ZTsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitYRkFfQVRUUklCVVRFRU5VTSBYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX0VudW0oWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQYWNrZXQpIHsNCisgIHZvaWQqIHBWYWx1ZTsNCisgIGlmIChYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlKHBWYWx1ZSwgZUVsZW1lbnQsIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBkd1BhY2tldCkpIHsNCisgICAgcmV0dXJuIChYRkFfQVRUUklCVVRFRU5VTSkodWludHB0cl90KXBWYWx1ZTsNCisgIH0NCisgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duOw0KK30NCitDRlhfV2lkZVN0cmluZ0MgWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9DZGF0YShYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQYWNrZXQpIHsNCisgIHZvaWQqIHBWYWx1ZTsNCisgIGlmIChYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlKHBWYWx1ZSwgZUVsZW1lbnQsIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgZHdQYWNrZXQpKSB7DQorICAgIHJldHVybiAoY29uc3QgRlhfV0NIQVIqKXBWYWx1ZTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitGWF9CT09MIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfQm9vbGVhbihYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQYWNrZXQpIHsNCisgIHZvaWQqIHBWYWx1ZTsNCisgIGlmIChYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlKHBWYWx1ZSwgZUVsZW1lbnQsIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLCBkd1BhY2tldCkpIHsNCisgICAgcmV0dXJuIChGWF9CT09MKSh1aW50cHRyX3QpcFZhbHVlOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitpbnQzMl90IFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfSW50ZWdlcihYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQYWNrZXQpIHsNCisgIHZvaWQqIHBWYWx1ZTsNCisgIGlmIChYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlKHBWYWx1ZSwgZUVsZW1lbnQsIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBkd1BhY2tldCkpIHsNCisgICAgcmV0dXJuIChpbnQzMl90KSh1aW50cHRyX3QpcFZhbHVlOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KK0NYRkFfTWVhc3VyZW1lbnQgWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9NZWFzdXJlKFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1BhY2tldCkgew0KKyAgdm9pZCogcFZhbHVlOw0KKyAgaWYgKFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWUocFZhbHVlLCBlRWxlbWVudCwgZUF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIGR3UGFja2V0KSkgew0KKyAgICByZXR1cm4gKihDWEZBX01lYXN1cmVtZW50KilwVmFsdWU7DQorICB9DQorICByZXR1cm4gQ1hGQV9NZWFzdXJlbWVudCgpOw0KK30NCitpbnQzMl90IFhGQV9HZXRFbGVtZW50Q291bnQoKSB7DQorICByZXR1cm4gZ19pWEZBRWxlbWVudENvdW50Ow0KK30NCitYRkFfTFBDRUxFTUVOVElORk8gWEZBX0dldEVsZW1lbnRCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHdzTmFtZS5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoID09IDApIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICB1aW50MzJfdCB1SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTmFtZS5HZXRQdHIoKSwgaUxlbmd0aCk7DQorICBpbnQzMl90IGlTdGFydCA9IDAsIGlFbmQgPSBnX2lYRkFFbGVtZW50Q291bnQgLSAxOw0KKyAgZG8gew0KKyAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICBYRkFfTFBDRUxFTUVOVElORk8gcEluZm8gPSBnX1hGQUVsZW1lbnREYXRhICsgaU1pZDsNCisgICAgaWYgKHVIYXNoID09IHBJbmZvLT51SGFzaCkgew0KKyAgICAgIHJldHVybiBwSW5mbzsNCisgICAgfSBlbHNlIGlmICh1SGFzaCA8IHBJbmZvLT51SGFzaCkgew0KKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgfQ0KKyAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK1hGQV9MUENFTEVNRU5USU5GTyBYRkFfR2V0RWxlbWVudEJ5SUQoWEZBX0VMRU1FTlQgZU5hbWUpIHsNCisgIHJldHVybiAoZU5hbWUgPCBnX2lYRkFFbGVtZW50Q291bnQpID8gKGdfWEZBRWxlbWVudERhdGEgKyBlTmFtZSkgOiBOVUxMOw0KK30NCitjb25zdCBGWF9XT1JEKiBYRkFfR2V0RWxlbWVudENoaWxkcmVuKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBpbnQzMl90JiBpQ291bnQpIHsNCisgIGlmIChlRWxlbWVudCA+PSBnX2lYRkFFbGVtZW50Q291bnQpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBYRkFfTFBDRUxFTUVOVEhJRVJBUkNIWSBwRWxlbWVudCA9IGdfWEZBRWxlbWVudENoaWxkcmVuSW5kZXggKyBlRWxlbWVudDsNCisgIGlDb3VudCA9IHBFbGVtZW50LT53Q291bnQ7DQorICByZXR1cm4gZ19YRkFFbGVtZW50Q2hpbGRyZW5EYXRhICsgcEVsZW1lbnQtPndTdGFydDsNCit9DQorY29uc3QgdWludDhfdCogWEZBX0dldEVsZW1lbnRBdHRyaWJ1dGVzKFhGQV9FTEVNRU5UIGVFbGVtZW50LCBpbnQzMl90JiBpQ291bnQpIHsNCisgIGlmIChlRWxlbWVudCA+PSBnX2lYRkFFbGVtZW50Q291bnQpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBYRkFfTFBDRUxFTUVOVEhJRVJBUkNIWSBwRWxlbWVudCA9IGdfWEZBRWxlbWVudEF0dHJpYnV0ZUluZGV4ICsgZUVsZW1lbnQ7DQorICBpQ291bnQgPSBwRWxlbWVudC0+d0NvdW50Ow0KKyAgcmV0dXJuIGdfWEZBRWxlbWVudEF0dHJpYnV0ZURhdGEgKyBwRWxlbWVudC0+d1N0YXJ0Ow0KK30NCitYRkFfTFBDQVRUUklCVVRFSU5GTyBYRkFfR2V0QXR0cmlidXRlT2ZFbGVtZW50KFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQYWNrZXQpIHsNCisgIGludDMyX3QgaUNvdW50ID0gMDsNCisgIGNvbnN0IHVpbnQ4X3QqIHBBdHRyID0gWEZBX0dldEVsZW1lbnRBdHRyaWJ1dGVzKGVFbGVtZW50LCBpQ291bnQpOw0KKyAgaWYgKHBBdHRyID09IE5VTEwgfHwgaUNvdW50IDwgMSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENGWF9EU1BBVGVtcGxhdGU8dWludDhfdD4gc2VhcmNoOw0KKyAgaW50MzJfdCBpbmRleCA9IHNlYXJjaC5Mb29rdXAoZUF0dHJpYnV0ZSwgcEF0dHIsIGlDb3VudCk7DQorICBpZiAoaW5kZXggPCAwKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgWEZBX0xQQ0FUVFJJQlVURUlORk8gcEluZm8gPSBYRkFfR2V0QXR0cmlidXRlQnlJRChlQXR0cmlidXRlKTsNCisgIEFTU0VSVChwSW5mbyAhPSBOVUxMKTsNCisgIGlmIChkd1BhY2tldCA9PSBYRkFfWERQUEFDS0VUX1VOS05PV04pIHsNCisgICAgcmV0dXJuIHBJbmZvOw0KKyAgfQ0KKyAgcmV0dXJuIChkd1BhY2tldCAmIHBJbmZvLT5kd1BhY2tldHMpID8gcEluZm8gOiBOVUxMOw0KK30NCitYRkFfTFBDRUxFTUVOVElORk8gWEZBX0dldENoaWxkT2ZFbGVtZW50KFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgZUNoaWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQYWNrZXQpIHsNCisgIGludDMyX3QgaUNvdW50ID0gMDsNCisgIGNvbnN0IEZYX1dPUkQqIHBDaGlsZCA9IFhGQV9HZXRFbGVtZW50Q2hpbGRyZW4oZUVsZW1lbnQsIGlDb3VudCk7DQorICBpZiAocENoaWxkID09IE5VTEwgfHwgaUNvdW50IDwgMSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENGWF9EU1BBVGVtcGxhdGU8RlhfV09SRD4gc2VhcmNoOw0KKyAgaW50MzJfdCBpbmRleCA9IHNlYXJjaC5Mb29rdXAoZUNoaWxkLCBwQ2hpbGQsIGlDb3VudCk7DQorICBpZiAoaW5kZXggPCAwKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgWEZBX0xQQ0VMRU1FTlRJTkZPIHBJbmZvID0gWEZBX0dldEVsZW1lbnRCeUlEKGVDaGlsZCk7DQorICBBU1NFUlQocEluZm8gIT0gTlVMTCk7DQorICBpZiAoZHdQYWNrZXQgPT0gWEZBX1hEUFBBQ0tFVF9VTktOT1dOKSB7DQorICAgIHJldHVybiBwSW5mbzsNCisgIH0NCisgIHJldHVybiAoZHdQYWNrZXQgJiBwSW5mby0+ZHdQYWNrZXRzKSA/IHBJbmZvIDogTlVMTDsNCit9DQorWEZBX0xQQ1BST1BFUlRZIFhGQV9HZXRFbGVtZW50UHJvcGVydGllcyhYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlDb3VudCkgew0KKyAgaWYgKGVFbGVtZW50ID49IGdfaVhGQUVsZW1lbnRDb3VudCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIFhGQV9MUENFTEVNRU5USElFUkFSQ0hZIHBFbGVtZW50ID0gZ19YRkFFbGVtZW50UHJvcGVydHlJbmRleCArIGVFbGVtZW50Ow0KKyAgaUNvdW50ID0gcEVsZW1lbnQtPndDb3VudDsNCisgIHJldHVybiBnX1hGQUVsZW1lbnRQcm9wZXJ0eURhdGEgKyBwRWxlbWVudC0+d1N0YXJ0Ow0KK30NCitYRkFfTFBDUFJPUEVSVFkgWEZBX0dldFByb3BlcnR5T2ZFbGVtZW50KFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgZVByb3BlcnR5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdQYWNrZXQpIHsNCisgIGludDMyX3QgaUNvdW50ID0gMDsNCisgIFhGQV9MUENQUk9QRVJUWSBwUHJvcGVydHkgPSBYRkFfR2V0RWxlbWVudFByb3BlcnRpZXMoZUVsZW1lbnQsIGlDb3VudCk7DQorICBpZiAocFByb3BlcnR5ID09IE5VTEwgfHwgaUNvdW50IDwgMSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGludDMyX3QgaVN0YXJ0ID0gMCwgaUVuZCA9IGlDb3VudCAtIDEsIGlNaWQ7DQorICBkbyB7DQorICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICBYRkFfRUxFTUVOVCBlTmFtZSA9IChYRkFfRUxFTUVOVClwUHJvcGVydHlbaU1pZF0uZU5hbWU7DQorICAgIGlmIChlUHJvcGVydHkgPT0gZU5hbWUpIHsNCisgICAgICBicmVhazsNCisgICAgfSBlbHNlIGlmIChlUHJvcGVydHkgPCBlTmFtZSkgew0KKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgfQ0KKyAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgaWYgKGlTdGFydCA+IGlFbmQpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBYRkFfTFBDRUxFTUVOVElORk8gcEluZm8gPSBYRkFfR2V0RWxlbWVudEJ5SUQoZVByb3BlcnR5KTsNCisgIEFTU0VSVChwSW5mbyAhPSBOVUxMKTsNCisgIGlmIChkd1BhY2tldCA9PSBYRkFfWERQUEFDS0VUX1VOS05PV04pIHsNCisgICAgcmV0dXJuIHBQcm9wZXJ0eSArIGlNaWQ7DQorICB9DQorICByZXR1cm4gKGR3UGFja2V0ICYgcEluZm8tPmR3UGFja2V0cykgPyAocFByb3BlcnR5ICsgaU1pZCkgOiBOVUxMOw0KK30NCitYRkFfTFBDTk9UU1VSRUFUVFJJQlVURSBYRkFfR2V0Tm90c3VyZUF0dHJpYnV0ZShYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGUpIHsNCisgIGludDMyX3QgaVN0YXJ0ID0gMCwgaUVuZCA9IGdfaVhGQU5vdHN1cmVDb3VudCAtIDE7DQorICBkbyB7DQorICAgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgIFhGQV9MUENOT1RTVVJFQVRUUklCVVRFIHBBdHRyID0gZ19YRkFOb3RzdXJlQXR0cmlidXRlcyArIGlNaWQ7DQorICAgIGlmIChlRWxlbWVudCA9PSBwQXR0ci0+ZUVsZW1lbnQpIHsNCisgICAgICBpZiAocEF0dHItPmVBdHRyaWJ1dGUgPT0gZUF0dHJpYnV0ZSkgew0KKyAgICAgICAgaWYgKGVUeXBlID09IFhGQV9BVFRSSUJVVEVUWVBFX05PVFNVUkUgfHwgZVR5cGUgPT0gcEF0dHItPmVUeXBlKSB7DQorICAgICAgICAgIHJldHVybiBwQXR0cjsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpbnQzMl90IGlCZWZvcmUgPSBpTWlkIC0gMTsNCisgICAgICAgIGlmIChpQmVmb3JlID49IDApIHsNCisgICAgICAgICAgcEF0dHIgPSBnX1hGQU5vdHN1cmVBdHRyaWJ1dGVzICsgaUJlZm9yZTsNCisgICAgICAgICAgd2hpbGUgKGVFbGVtZW50ID09IHBBdHRyLT5lRWxlbWVudCkgew0KKyAgICAgICAgICAgIGlmIChwQXR0ci0+ZUF0dHJpYnV0ZSA9PSBlQXR0cmlidXRlKSB7DQorICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSB8fCBlVHlwZSA9PSBwQXR0ci0+ZVR5cGUpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHBBdHRyOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlCZWZvcmUtLTsNCisgICAgICAgICAgICBpZiAoaUJlZm9yZSA8IDApIHsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwQXR0ciA9IGdfWEZBTm90c3VyZUF0dHJpYnV0ZXMgKyBpQmVmb3JlOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpbnQzMl90IGlBZnRlciA9IGlNaWQgKyAxOw0KKyAgICAgICAgaWYgKGlBZnRlciA8PSBnX2lYRkFOb3RzdXJlQ291bnQgLSAxKSB7DQorICAgICAgICAgIHBBdHRyID0gZ19YRkFOb3RzdXJlQXR0cmlidXRlcyArIGlBZnRlcjsNCisgICAgICAgICAgd2hpbGUgKGVFbGVtZW50ID09IHBBdHRyLT5lRWxlbWVudCkgew0KKyAgICAgICAgICAgIGlmIChwQXR0ci0+ZUF0dHJpYnV0ZSA9PSBlQXR0cmlidXRlKSB7DQorICAgICAgICAgICAgICBpZiAoZVR5cGUgPT0gWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSB8fCBlVHlwZSA9PSBwQXR0ci0+ZVR5cGUpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHBBdHRyOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlBZnRlcisrOw0KKyAgICAgICAgICAgIGlmIChpQWZ0ZXIgPiBnX2lYRkFOb3RzdXJlQ291bnQgLSAxKSB7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcEF0dHIgPSBnX1hGQU5vdHN1cmVBdHRyaWJ1dGVzICsgaUFmdGVyOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoZUVsZW1lbnQgPCBwQXR0ci0+ZUVsZW1lbnQpIHsNCisgICAgICBpRW5kID0gaU1pZCAtIDE7DQorICAgIH0gZWxzZSB7DQorICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgIH0NCisgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsNCisgIHJldHVybiBOVUxMOw0KK30NCitpbnQzMl90IFhGQV9HZXRNZXRob2RDb3VudCgpIHsNCisgIHJldHVybiBnX2lTb21NZXRob2RDb3VudDsNCit9DQorWEZBX0xQQ01FVEhPRElORk8gWEZBX0dldE1ldGhvZEJ5TmFtZShYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NNZXRob2ROYW1lKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSB3c01ldGhvZE5hbWUuR2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCA9PSAwKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaW50MzJfdCBpRWxlbWVudEluZGV4ID0gZUVsZW1lbnQ7DQorICB3aGlsZSAoaUVsZW1lbnRJbmRleCAhPSAtMSkgew0KKyAgICBYRkFfTFBDU0NSSVBUSElFUkFSQ0hZIHNjcmlwdEluZGV4ID0gZ19YRkFTY3JpcHRJbmRleCArIGlFbGVtZW50SW5kZXg7DQorICAgIGludDMyX3QgaWNvdW50ID0gc2NyaXB0SW5kZXgtPndNZXRob2RDb3VudDsNCisgICAgaWYgKGljb3VudCA9PSAwKSB7DQorICAgICAgaUVsZW1lbnRJbmRleCA9IHNjcmlwdEluZGV4LT53UGFyZW50SW5kZXg7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgdWludDMyX3QgdUhhc2ggPSBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c01ldGhvZE5hbWUuR2V0UHRyKCksIGlMZW5ndGgpOw0KKyAgICBpbnQzMl90IGlTdGFydCA9IHNjcmlwdEluZGV4LT53TWV0aG9kU3RhcnQsIGlFbmQgPSBpU3RhcnQgKyBpY291bnQgLSAxOw0KKyAgICBkbyB7DQorICAgICAgaW50MzJfdCBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsNCisgICAgICBYRkFfTFBDTUVUSE9ESU5GTyBwSW5mbyA9IGdfU29tTWV0aG9kRGF0YSArIGlNaWQ7DQorICAgICAgaWYgKHVIYXNoID09IHBJbmZvLT51SGFzaCkgew0KKyAgICAgICAgcmV0dXJuIHBJbmZvOw0KKyAgICAgIH0gZWxzZSBpZiAodUhhc2ggPCBwSW5mby0+dUhhc2gpIHsNCisgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7DQorICAgICAgfQ0KKyAgICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7DQorICAgIGlFbGVtZW50SW5kZXggPSBzY3JpcHRJbmRleC0+d1BhcmVudEluZGV4Ow0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK1hGQV9MUENTQ1JJUFRBVFRSSUJVVEVJTkZPIFhGQV9HZXRTY3JpcHRBdHRyaWJ1dGVCeU5hbWUoDQorICAgIFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQXR0cmlidXRlTmFtZSkgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gd3NBdHRyaWJ1dGVOYW1lLkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggPT0gMCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGludDMyX3QgaUVsZW1lbnRJbmRleCA9IGVFbGVtZW50Ow0KKyAgd2hpbGUgKGlFbGVtZW50SW5kZXggIT0gLTEpIHsNCisgICAgWEZBX0xQQ1NDUklQVEhJRVJBUkNIWSBzY3JpcHRJbmRleCA9IGdfWEZBU2NyaXB0SW5kZXggKyBpRWxlbWVudEluZGV4Ow0KKyAgICBpbnQzMl90IGljb3VudCA9IHNjcmlwdEluZGV4LT53QXR0cmlidXRlQ291bnQ7DQorICAgIGlmIChpY291bnQgPT0gMCkgew0KKyAgICAgIGlFbGVtZW50SW5kZXggPSBzY3JpcHRJbmRleC0+d1BhcmVudEluZGV4Ow0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIHVpbnQzMl90IHVIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NBdHRyaWJ1dGVOYW1lLkdldFB0cigpLCBpTGVuZ3RoKTsNCisgICAgaW50MzJfdCBpU3RhcnQgPSBzY3JpcHRJbmRleC0+d0F0dHJpYnV0ZVN0YXJ0LCBpRW5kID0gaVN0YXJ0ICsgaWNvdW50IC0gMTsNCisgICAgZG8gew0KKyAgICAgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICAgICAgWEZBX0xQQ1NDUklQVEFUVFJJQlVURUlORk8gcEluZm8gPSBnX1NvbUF0dHJpYnV0ZURhdGEgKyBpTWlkOw0KKyAgICAgIGlmICh1SGFzaCA9PSBwSW5mby0+dUhhc2gpIHsNCisgICAgICAgIHJldHVybiBwSW5mbzsNCisgICAgICB9IGVsc2UgaWYgKHVIYXNoIDwgcEluZm8tPnVIYXNoKSB7DQorICAgICAgICBpRW5kID0gaU1pZCAtIDE7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOw0KKyAgICAgIH0NCisgICAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgICBpRWxlbWVudEluZGV4ID0gc2NyaXB0SW5kZXgtPndQYXJlbnRJbmRleDsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCit2b2lkIENYRkFfTWVhc3VyZW1lbnQ6OlNldChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTWVhc3VyZSkgew0KKyAgaWYgKHdzTWVhc3VyZS5Jc0VtcHR5KCkpIHsNCisgICAgbV9mVmFsdWUgPSAwOw0KKyAgICBtX2VVbml0ID0gWEZBX1VOSVRfVW5rbm93bjsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpVXNlZExlbiA9IDA7DQorICBpbnQzMl90IGlPZmZzZXQgPSAod3NNZWFzdXJlLkdldEF0KDApID09IEwnPScpID8gMSA6IDA7DQorICBGWF9GTE9BVCBmVmFsdWUgPSBGWF93Y3N0b2Yod3NNZWFzdXJlLkdldFB0cigpICsgaU9mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c01lYXN1cmUuR2V0TGVuZ3RoKCkgLSBpT2Zmc2V0LCAmaVVzZWRMZW4pOw0KKyAgWEZBX1VOSVQgZVVuaXQgPSBHZXRVbml0KHdzTWVhc3VyZS5NaWQoaU9mZnNldCArIGlVc2VkTGVuKSk7DQorICBTZXQoZlZhbHVlLCBlVW5pdCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9NZWFzdXJlbWVudDo6VG9TdHJpbmcoQ0ZYX1dpZGVTdHJpbmcmIHdzTWVhc3VyZSkgY29uc3Qgew0KKyAgc3dpdGNoIChHZXRVbml0KCkpIHsNCisgICAgY2FzZSBYRkFfVU5JVF9NbToNCisgICAgICB3c01lYXN1cmUuRm9ybWF0KEwiJS44Z21tIiwgR2V0VmFsdWUoKSk7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIGNhc2UgWEZBX1VOSVRfUHQ6DQorICAgICAgd3NNZWFzdXJlLkZvcm1hdChMIiUuOGdwdCIsIEdldFZhbHVlKCkpOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICBjYXNlIFhGQV9VTklUX0luOg0KKyAgICAgIHdzTWVhc3VyZS5Gb3JtYXQoTCIlLjhnaW4iLCBHZXRWYWx1ZSgpKTsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgY2FzZSBYRkFfVU5JVF9DbToNCisgICAgICB3c01lYXN1cmUuRm9ybWF0KEwiJS44Z2NtIiwgR2V0VmFsdWUoKSk7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIGNhc2UgWEZBX1VOSVRfTXA6DQorICAgICAgd3NNZWFzdXJlLkZvcm1hdChMIiUuOGdtcCIsIEdldFZhbHVlKCkpOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICBjYXNlIFhGQV9VTklUX1BjOg0KKyAgICAgIHdzTWVhc3VyZS5Gb3JtYXQoTCIlLjhncGMiLCBHZXRWYWx1ZSgpKTsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgY2FzZSBYRkFfVU5JVF9FbToNCisgICAgICB3c01lYXN1cmUuRm9ybWF0KEwiJS44Z2VtIiwgR2V0VmFsdWUoKSk7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIGNhc2UgWEZBX1VOSVRfUGVyY2VudDoNCisgICAgICB3c01lYXN1cmUuRm9ybWF0KEwiJS44ZyUlIiwgR2V0VmFsdWUoKSk7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIGRlZmF1bHQ6DQorICAgICAgd3NNZWFzdXJlLkZvcm1hdChMIiUuOGciLCBHZXRWYWx1ZSgpKTsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9NZWFzdXJlbWVudDo6VG9Vbml0KFhGQV9VTklUIGVVbml0LCBGWF9GTE9BVCYgZlZhbHVlKSBjb25zdCB7DQorICBmVmFsdWUgPSBHZXRWYWx1ZSgpOw0KKyAgWEZBX1VOSVQgZUZyb20gPSBHZXRVbml0KCk7DQorICBpZiAoZUZyb20gPT0gZVVuaXQpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBzd2l0Y2ggKGVGcm9tKSB7DQorICAgIGNhc2UgWEZBX1VOSVRfUHQ6DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX1VOSVRfTW06DQorICAgICAgZlZhbHVlICo9IDcyIC8gMi41NGYgLyAxMDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfVU5JVF9JbjoNCisgICAgICBmVmFsdWUgKj0gNzI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX1VOSVRfQ206DQorICAgICAgZlZhbHVlICo9IDcyIC8gMi41NGY7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX1VOSVRfTXA6DQorICAgICAgZlZhbHVlICo9IDAuMDAxZjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfVU5JVF9QYzoNCisgICAgICBmVmFsdWUgKj0gMTIuMGY7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgZlZhbHVlID0gMDsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBzd2l0Y2ggKGVVbml0KSB7DQorICAgIGNhc2UgWEZBX1VOSVRfUHQ6DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIGNhc2UgWEZBX1VOSVRfTW06DQorICAgICAgZlZhbHVlIC89IDcyIC8gMi41NGYgLyAxMDsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgY2FzZSBYRkFfVU5JVF9JbjoNCisgICAgICBmVmFsdWUgLz0gNzI7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIGNhc2UgWEZBX1VOSVRfQ206DQorICAgICAgZlZhbHVlIC89IDcyIC8gMi41NGY7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIGNhc2UgWEZBX1VOSVRfTXA6DQorICAgICAgZlZhbHVlIC89IDAuMDAxZjsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgY2FzZSBYRkFfVU5JVF9QYzoNCisgICAgICBmVmFsdWUgLz0gMTIuMGY7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIGRlZmF1bHQ6DQorICAgICAgZlZhbHVlID0gMDsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK1hGQV9VTklUIENYRkFfTWVhc3VyZW1lbnQ6OkdldFVuaXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1VuaXQpIHsNCisgIGlmICh3c1VuaXQgPT0gRlhfV1NUUkMoTCJtbSIpKSB7DQorICAgIHJldHVybiBYRkFfVU5JVF9NbTsNCisgIH0gZWxzZSBpZiAod3NVbml0ID09IEZYX1dTVFJDKEwicHQiKSkgew0KKyAgICByZXR1cm4gWEZBX1VOSVRfUHQ7DQorICB9IGVsc2UgaWYgKHdzVW5pdCA9PSBGWF9XU1RSQyhMImluIikpIHsNCisgICAgcmV0dXJuIFhGQV9VTklUX0luOw0KKyAgfSBlbHNlIGlmICh3c1VuaXQgPT0gRlhfV1NUUkMoTCJjbSIpKSB7DQorICAgIHJldHVybiBYRkFfVU5JVF9DbTsNCisgIH0gZWxzZSBpZiAod3NVbml0ID09IEZYX1dTVFJDKEwicGMiKSkgew0KKyAgICByZXR1cm4gWEZBX1VOSVRfUGM7DQorICB9IGVsc2UgaWYgKHdzVW5pdCA9PSBGWF9XU1RSQyhMIm1wIikpIHsNCisgICAgcmV0dXJuIFhGQV9VTklUX01wOw0KKyAgfSBlbHNlIGlmICh3c1VuaXQgPT0gRlhfV1NUUkMoTCJlbSIpKSB7DQorICAgIHJldHVybiBYRkFfVU5JVF9FbTsNCisgIH0gZWxzZSBpZiAod3NVbml0ID09IEZYX1dTVFJDKEwiJSIpKSB7DQorICAgIHJldHVybiBYRkFfVU5JVF9QZXJjZW50Ow0KKyAgfSBlbHNlIHsNCisgICAgcmV0dXJuIFhGQV9VTklUX1Vua25vd247DQorICB9DQorfQ0KK0lGWF9TdHJlYW0qIFhGQV9DcmVhdGVXaWRlVGV4dFJlYWQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQnVmZmVyKSB7DQorICByZXR1cm4gbmV3IENYRkFfV2lkZVRleHRSZWFkKHdzQnVmZmVyKTsNCit9DQorQ1hGQV9XaWRlVGV4dFJlYWQ6OkNYRkFfV2lkZVRleHRSZWFkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0J1ZmZlcikNCisgICAgOiBtX3dzQnVmZmVyKHdzQnVmZmVyKSwgbV9pUG9zaXRpb24oMCksIG1faVJlZkNvdW50KDEpIHt9DQordm9pZCBDWEZBX1dpZGVUZXh0UmVhZDo6UmVsZWFzZSgpIHsNCisgIGlmICgtLW1faVJlZkNvdW50IDwgMSkgew0KKyAgICBkZWxldGUgdGhpczsNCisgIH0NCit9DQorSUZYX1N0cmVhbSogQ1hGQV9XaWRlVGV4dFJlYWQ6OlJldGFpbigpIHsNCisgIG1faVJlZkNvdW50Kys7DQorICByZXR1cm4gdGhpczsNCit9DQorRlhfRFdPUkQgQ1hGQV9XaWRlVGV4dFJlYWQ6OkdldEFjY2Vzc01vZGVzKCkgY29uc3Qgew0KKyAgcmV0dXJuIEZYX1NUUkVBTUFDQ0VTU19SZWFkIHwgRlhfU1RSRUFNQUNDRVNTX1RleHQ7DQorfQ0KK2ludDMyX3QgQ1hGQV9XaWRlVGV4dFJlYWQ6OkdldExlbmd0aCgpIGNvbnN0IHsNCisgIHJldHVybiBtX3dzQnVmZmVyLkdldExlbmd0aCgpICogc2l6ZW9mKEZYX1dDSEFSKTsNCit9DQoraW50MzJfdCBDWEZBX1dpZGVUZXh0UmVhZDo6U2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpIHsNCisgIHN3aXRjaCAoZVNlZWspIHsNCisgICAgY2FzZSBGWF9TVFJFQU1TRUVLX0JlZ2luOg0KKyAgICAgIG1faVBvc2l0aW9uID0gaU9mZnNldDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWF9TVFJFQU1TRUVLX0N1cnJlbnQ6DQorICAgICAgbV9pUG9zaXRpb24gKz0gaU9mZnNldDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWF9TVFJFQU1TRUVLX0VuZDoNCisgICAgICBtX2lQb3NpdGlvbiA9IG1fd3NCdWZmZXIuR2V0TGVuZ3RoKCkgKyBpT2Zmc2V0Ow0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgaWYgKG1faVBvc2l0aW9uIDwgMCkgew0KKyAgICBtX2lQb3NpdGlvbiA9IDA7DQorICB9DQorICBpZiAobV9pUG9zaXRpb24gPiBtX3dzQnVmZmVyLkdldExlbmd0aCgpKSB7DQorICAgIG1faVBvc2l0aW9uID0gbV93c0J1ZmZlci5HZXRMZW5ndGgoKTsNCisgIH0NCisgIHJldHVybiBHZXRQb3NpdGlvbigpOw0KK30NCitpbnQzMl90IENYRkFfV2lkZVRleHRSZWFkOjpHZXRQb3NpdGlvbigpIHsNCisgIHJldHVybiBtX2lQb3NpdGlvbiAqIHNpemVvZihGWF9XQ0hBUik7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRlVGV4dFJlYWQ6OklzRU9GKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1faVBvc2l0aW9uID49IG1fd3NCdWZmZXIuR2V0TGVuZ3RoKCk7DQorfQ0KK2ludDMyX3QgQ1hGQV9XaWRlVGV4dFJlYWQ6OlJlYWRTdHJpbmcoRlhfV0NIQVIqIHBTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNYXhMZW5ndGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRU9TLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb25zdCogcEJ5dGVTaXplKSB7DQorICBpZiAoaU1heExlbmd0aCA+IG1fd3NCdWZmZXIuR2V0TGVuZ3RoKCkgLSBtX2lQb3NpdGlvbikgew0KKyAgICBpTWF4TGVuZ3RoID0gbV93c0J1ZmZlci5HZXRMZW5ndGgoKSAtIG1faVBvc2l0aW9uOw0KKyAgfQ0KKyAgRlhTWVNfd2NzbmNweShwU3RyLCAoY29uc3QgRlhfV0NIQVIqKW1fd3NCdWZmZXIgKyBtX2lQb3NpdGlvbiwgaU1heExlbmd0aCk7DQorICBtX2lQb3NpdGlvbiArPSBpTWF4TGVuZ3RoOw0KKyAgYkVPUyA9IElzRU9GKCk7DQorICByZXR1cm4gaU1heExlbmd0aDsNCit9DQorRlhfV09SRCBDWEZBX1dpZGVUZXh0UmVhZDo6R2V0Q29kZVBhZ2UoKSBjb25zdCB7DQorICByZXR1cm4gKHNpemVvZihGWF9XQ0hBUikgPT0gMikgPyBGWF9DT0RFUEFHRV9VVEYxNkxFIDogRlhfQ09ERVBBR0VfVVRGMzJMRTsNCit9DQorRlhfV09SRCBDWEZBX1dpZGVUZXh0UmVhZDo6U2V0Q29kZVBhZ2UoRlhfV09SRCB3Q29kZVBhZ2UpIHsNCisgIHJldHVybiBHZXRDb2RlUGFnZSgpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfYmFzaWNfaW1wLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfYmFzaWNfaW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZmZmNlOQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9iYXNpY19pbXAuaApAQCAtMCwwICsxLDY2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1hGQV9CQVNJQ19JTVANCisjZGVmaW5lIF9YRkFfQkFTSUNfSU1QDQordHlwZWRlZiBzdHJ1Y3QgX1hGQV9OT1RTVVJFQVRUUklCVVRFIHsNCisgIFhGQV9FTEVNRU5UIGVFbGVtZW50Ow0KKyAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlOw0KKyAgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGU7DQorICB2b2lkKiBwVmFsdWU7DQorfSBYRkFfTk9UU1VSRUFUVFJJQlVURSwgKlhGQV9MUE5PVFNVUkVBVFRSSUJVVEU7DQordHlwZWRlZiBYRkFfTk9UU1VSRUFUVFJJQlVURSBjb25zdCogWEZBX0xQQ05PVFNVUkVBVFRSSUJVVEU7DQorWEZBX0xQQ05PVFNVUkVBVFRSSUJVVEUgWEZBX0dldE5vdHN1cmVBdHRyaWJ1dGUoDQorICAgIFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsDQorICAgIFhGQV9BVFRSSUJVVEVUWVBFIGVUeXBlID0gWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSk7DQorY2xhc3MgQ1hGQV9XaWRlVGV4dFJlYWQgOiBwdWJsaWMgSUZYX1N0cmVhbSB7DQorIHB1YmxpYzoNCisgIENYRkFfV2lkZVRleHRSZWFkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0J1ZmZlcik7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpOw0KKyAgdmlydHVhbCBJRlhfU3RyZWFtKiBSZXRhaW4oKTsNCisNCisgIHZpcnR1YWwgRlhfRFdPUkQgR2V0QWNjZXNzTW9kZXMoKSBjb25zdDsNCisgIHZpcnR1YWwgaW50MzJfdCBHZXRMZW5ndGgoKSBjb25zdDsNCisgIHZpcnR1YWwgaW50MzJfdCBTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIGludDMyX3QgaU9mZnNldCk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0UG9zaXRpb24oKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJc0VPRigpIGNvbnN0Ow0KKw0KKyAgdmlydHVhbCBpbnQzMl90IFJlYWREYXRhKHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpIHsgcmV0dXJuIDA7IH0NCisgIHZpcnR1YWwgaW50MzJfdCBSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTWF4TGVuZ3RoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYkVPUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29uc3QqIHBCeXRlU2l6ZSA9IE5VTEwpOw0KKyAgdmlydHVhbCBpbnQzMl90IFdyaXRlRGF0YShjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgdmlydHVhbCBpbnQzMl90IFdyaXRlU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICB2aXJ0dWFsIHZvaWQgRmx1c2goKSB7fQ0KKyAgdmlydHVhbCBGWF9CT09MIFNldExlbmd0aChpbnQzMl90IGlMZW5ndGgpIHsgcmV0dXJuIEZBTFNFOyB9DQorDQorICB2aXJ0dWFsIGludDMyX3QgR2V0Qk9NKHVpbnQ4X3QgYm9tWzRdKSBjb25zdCB7IHJldHVybiAwOyB9DQorICB2aXJ0dWFsIEZYX1dPUkQgR2V0Q29kZVBhZ2UoKSBjb25zdDsNCisgIHZpcnR1YWwgRlhfV09SRCBTZXRDb2RlUGFnZShGWF9XT1JEIHdDb2RlUGFnZSk7DQorDQorICB2aXJ0dWFsIHZvaWQgTG9jaygpIHt9DQorICB2aXJ0dWFsIHZvaWQgVW5sb2NrKCkge30NCisNCisgIHZpcnR1YWwgSUZYX1N0cmVhbSogQ3JlYXRlU2hhcmVkU3RyZWFtKEZYX0RXT1JEIGR3QWNjZXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpT2Zmc2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKw0KKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0U3JjVGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fd3NCdWZmZXI7IH0NCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93c0J1ZmZlcjsNCisgIGludDMyX3QgbV9pUG9zaXRpb247DQorICBpbnQzMl90IG1faVJlZkNvdW50Ow0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2RhdGFkZXNjcmlwdGlvbl9pbXAuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2RhdGFkZXNjcmlwdGlvbl9pbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMGRlNzUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfZGF0YWRlc2NyaXB0aW9uX2ltcC5jcHAKQEAgLTAsMCArMSwxMjUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3V0aWxzLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9vYmplY3QuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY3VtZW50LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9wYXJzZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3NjcmlwdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jZGF0YS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jbGF5b3V0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9sb2NhbGVtZ3IuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2ZtMmpzYXBpLmgiDQorI2RlZmluZSBYRkFfSEFTSENPREVfR3JvdXAgMHhmN2Y3NWZjZA0KK2NsYXNzIENYRkFfVHJhdmVyc2VTdHJhdGVneV9EREdyb3VwIHsNCisgcHVibGljOg0KKyAgc3RhdGljIGlubGluZSBDWEZBX05vZGUqIEdldEZpcnN0Q2hpbGQoQ1hGQV9Ob2RlKiBwRERHcm91cE5vZGUpIHsNCisgICAgcmV0dXJuIHBEREdyb3VwTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5TmFtZShYRkFfSEFTSENPREVfR3JvdXApOw0KKyAgfQ0KKyAgc3RhdGljIGlubGluZSBDWEZBX05vZGUqIEdldE5leHRTaWJsaW5nKENYRkFfTm9kZSogcERER3JvdXBOb2RlKSB7DQorICAgIHJldHVybiBwRERHcm91cE5vZGUtPkdldE5leHRTYW1lTmFtZVNpYmxpbmcoWEZBX0hBU0hDT0RFX0dyb3VwKTsNCisgIH0NCisgIHN0YXRpYyBpbmxpbmUgQ1hGQV9Ob2RlKiBHZXRQYXJlbnQoQ1hGQV9Ob2RlKiBwRERHcm91cE5vZGUpIHsNCisgICAgcmV0dXJuIHBEREdyb3VwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICB9DQorfTsNCit2b2lkIFhGQV9EYXRhRGVzY3JpcHRpb25fVXBkYXRlRGF0YVJlbGF0aW9uKENYRkFfTm9kZSogcERhdGFOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRGF0YURlc2NyaXB0aW9uTm9kZSkgew0KKyAgRlhTWVNfYXNzZXJ0KHBEYXRhRGVzY3JpcHRpb25Ob2RlKTsNCisgIGZvciAoQ1hGQV9Ob2RlKiBwRGF0YUNoaWxkID0gcERhdGFOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgIHBEYXRhQ2hpbGQ7DQorICAgICAgIHBEYXRhQ2hpbGQgPSBwRGF0YUNoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIEZYX0RXT1JEIGR3TmFtZUhhc2ggPSBwRGF0YUNoaWxkLT5HZXROYW1lSGFzaCgpOw0KKyAgICBYRkFfRUxFTUVOVCBlVHlwZSA9IHBEYXRhQ2hpbGQtPkdldENsYXNzSUQoKTsNCisgICAgaWYgKCFkd05hbWVIYXNoKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9EREdyb3VwPg0KKyAgICAgICAgc0l0ZXJhdG9yKHBEYXRhRGVzY3JpcHRpb25Ob2RlKTsNCisgICAgZm9yIChDWEZBX05vZGUqIHBEREdyb3VwTm9kZSA9IHNJdGVyYXRvci5HZXRDdXJyZW50KCk7IHBEREdyb3VwTm9kZTsNCisgICAgICAgICBwRERHcm91cE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgaWYgKHBEREdyb3VwTm9kZSAhPSBwRGF0YURlc2NyaXB0aW9uTm9kZSkgew0KKyAgICAgICAgaWYgKHBEREdyb3VwTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0RhdGFHcm91cCkgew0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZXNwYWNlOw0KKyAgICAgICAgaWYgKCFwRERHcm91cE5vZGUtPlRyeU5hbWVzcGFjZSh3c05hbWVzcGFjZSkgfHwNCisgICAgICAgICAgICB3c05hbWVzcGFjZSAhPSBGWF9XU1RSQyhMImh0dHA6Ly9ucy5hZG9iZS5jb20vZGF0YS1kZXNjcmlwdGlvbi8iKSkgew0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgQ1hGQV9Ob2RlKiBwREROb2RlID0gcERER3JvdXBOb2RlLT5HZXRGaXJzdENoaWxkQnlOYW1lKGR3TmFtZUhhc2gpOw0KKyAgICAgIGlmICghcERETm9kZSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmIChwREROb2RlLT5HZXRDbGFzc0lEKCkgIT0gZVR5cGUpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBwRGF0YUNoaWxkLT5TZXREYXRhRGVzY3JpcHRpb25Ob2RlKHBERE5vZGUpOw0KKyAgICAgIFhGQV9EYXRhRGVzY3JpcHRpb25fVXBkYXRlRGF0YVJlbGF0aW9uKHBEYXRhQ2hpbGQsIHBERE5vZGUpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorfQ0KK0NYRkFfTm9kZSogWEZBX0RhdGFEZXNjcmlwdGlvbl9NYXliZUNyZWF0ZURhdGFOb2RlKA0KKyAgICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsDQorICAgIENYRkFfTm9kZSogcERhdGFQYXJlbnQsDQorICAgIFhGQV9FTEVNRU5UIGVOb2RlVHlwZSwNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpIHsNCisgIGlmICghcERhdGFQYXJlbnQpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDWEZBX05vZGUqIHBQYXJlbnRERE5vZGUgPSBwRGF0YVBhcmVudC0+R2V0RGF0YURlc2NyaXB0aW9uTm9kZSgpOw0KKyAgaWYgKCFwUGFyZW50REROb2RlKSB7DQorICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0NCisgICAgICAgIHBEb2N1bWVudC0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0RhdGFzZXRzLCBlTm9kZVR5cGUpOw0KKyAgICBGWFNZU19hc3NlcnQocERhdGFOb2RlKTsNCisgICAgcERhdGFOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7DQorICAgIHBEYXRhTm9kZS0+Q3JlYXRlWE1MTWFwcGluZ05vZGUoKTsNCisgICAgcERhdGFQYXJlbnQtPkluc2VydENoaWxkKHBEYXRhTm9kZSk7DQorICAgIHBEYXRhTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQsIFRSVUUsIEZBTFNFKTsNCisgICAgcmV0dXJuIHBEYXRhTm9kZTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfRERHcm91cD4NCisgICAgICAgIHNJdGVyYXRvcihwUGFyZW50REROb2RlKTsNCisgICAgZm9yIChDWEZBX05vZGUqIHBEREdyb3VwTm9kZSA9IHNJdGVyYXRvci5HZXRDdXJyZW50KCk7IHBEREdyb3VwTm9kZTsNCisgICAgICAgICBwRERHcm91cE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgaWYgKHBEREdyb3VwTm9kZSAhPSBwUGFyZW50REROb2RlKSB7DQorICAgICAgICBpZiAocERER3JvdXBOb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfRGF0YUdyb3VwKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lc3BhY2U7DQorICAgICAgICBpZiAoIXBEREdyb3VwTm9kZS0+VHJ5TmFtZXNwYWNlKHdzTmFtZXNwYWNlKSB8fA0KKyAgICAgICAgICAgIHdzTmFtZXNwYWNlICE9IEZYX1dTVFJDKEwiaHR0cDovL25zLmFkb2JlLmNvbS9kYXRhLWRlc2NyaXB0aW9uLyIpKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBDWEZBX05vZGUqIHBERE5vZGUgPSBwRERHcm91cE5vZGUtPkdldEZpcnN0Q2hpbGRCeU5hbWUod3NOYW1lKTsNCisgICAgICBpZiAoIXBERE5vZGUpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBpZiAocERETm9kZS0+R2V0Q2xhc3NJRCgpICE9IGVOb2RlVHlwZSkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0NCisgICAgICAgICAgcERvY3VtZW50LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsIGVOb2RlVHlwZSk7DQorICAgICAgRlhTWVNfYXNzZXJ0KHBEYXRhTm9kZSk7DQorICAgICAgcERhdGFOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7DQorICAgICAgcERhdGFOb2RlLT5DcmVhdGVYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgIGlmIChlTm9kZVR5cGUgPT0gWEZBX0VMRU1FTlRfRGF0YVZhbHVlICYmDQorICAgICAgICAgIHBERE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9Db250YWlucykgPT0NCisgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX01ldGFEYXRhKSB7DQorICAgICAgICBwRGF0YU5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9Db250YWlucywgWEZBX0FUVFJJQlVURUVOVU1fTWV0YURhdGEpOw0KKyAgICAgIH0NCisgICAgICBwRGF0YVBhcmVudC0+SW5zZXJ0Q2hpbGQocERhdGFOb2RlKTsNCisgICAgICBwRGF0YU5vZGUtPlNldERhdGFEZXNjcmlwdGlvbk5vZGUocERETm9kZSk7DQorICAgICAgcERhdGFOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCwgVFJVRSwgRkFMU0UpOw0KKyAgICAgIHJldHVybiBwRGF0YU5vZGU7DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9kYXRhZGVzY3JpcHRpb25faW1wLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfZGF0YWRlc2NyaXB0aW9uX2ltcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MTU2NjQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfZGF0YWRlc2NyaXB0aW9uX2ltcC5oCkBAIC0wLDAgKzEsMTYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfWEZBX0RPQ1VNRU5UX0RBVEFERVNDUklQVElPTl9JTVBfSF8NCisjZGVmaW5lIF9YRkFfRE9DVU1FTlRfREFUQURFU0NSSVBUSU9OX0lNUF9IXw0KK3ZvaWQgWEZBX0RhdGFEZXNjcmlwdGlvbl9VcGRhdGVEYXRhUmVsYXRpb24oQ1hGQV9Ob2RlKiBwRGF0YU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEYXRhRGVzY3JpcHRpb25Ob2RlKTsNCitDWEZBX05vZGUqIFhGQV9EYXRhRGVzY3JpcHRpb25fTWF5YmVDcmVhdGVEYXRhTm9kZSgNCisgICAgQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LA0KKyAgICBDWEZBX05vZGUqIHBEYXRhUGFyZW50LA0KKyAgICBYRkFfRUxFTUVOVCBlTm9kZVR5cGUsDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfZGF0YW1lcmdlcl9pbXAuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2RhdGFtZXJnZXJfaW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWFiNWViCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2RhdGFtZXJnZXJfaW1wLmNwcApAQCAtMCwwICsxLDE1NTMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3V0aWxzLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9vYmplY3QuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY3VtZW50LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9wYXJzZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3NjcmlwdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jZGF0YS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jbGF5b3V0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9sb2NhbGVtZ3IuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2ZtMmpzYXBpLmgiDQorI2luY2x1ZGUgInhmYV9iYXNpY19pbXAuaCINCisjaW5jbHVkZSAieGZhX2RvY3VtZW50X2RhdGFkZXNjcmlwdGlvbl9pbXAuaCINCisjaW5jbHVkZSAieGZhX2RvY3VtZW50X2RhdGFtZXJnZXJfaW1wLmgiDQorI2luY2x1ZGUgInhmYV9kb2N1bWVudF9sYXlvdXRfaW1wLmgiDQorc3RhdGljIEZYX0JPT0wgWEZBX0dldE9jY3VySW5mbyhDWEZBX05vZGUqIHBPY2N1ck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTWluLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1heCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlJbml0KSB7DQorICBpZiAoIXBPY2N1ck5vZGUpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ1hGQV9PY2N1ciBvY2N1cihwT2NjdXJOb2RlKTsNCisgIHJldHVybiBvY2N1ci5HZXRPY2N1ckluZm8oaU1pbiwgaU1heCwgaUluaXQpOw0KK30NCitzdHJ1Y3QgWEZBX0RhdGFNZXJnZV9SZWN1cnNlUmVjb3JkIHsNCisgIENYRkFfTm9kZSogcFRlbXBsYXRlQ2hpbGQ7DQorICBDWEZBX05vZGUqIHBEYXRhQ2hpbGQ7DQorfTsNCitzdGF0aWMgQ1hGQV9Ob2RlKiBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfQ3JlYXRlQ2hpbGQoDQorICAgIENYRkFfTm9kZSogcFZhbHVlTm9kZSwNCisgICAgWEZBX0VMRU1FTlQgaVR5cGUgPSBYRkFfRUxFTUVOVF9VTktOT1dOKSB7DQorICBDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwVmFsdWVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICBpZiAoIXBDaGlsZE5vZGUpIHsNCisgICAgaWYgKGlUeXBlID09IFhGQV9FTEVNRU5UX1VOS05PV04pIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcENoaWxkTm9kZSA9IHBWYWx1ZU5vZGUtPkdldFByb3BlcnR5KDAsIGlUeXBlKTsNCisgIH0NCisgIHJldHVybiBwQ2hpbGROb2RlOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfTWF0Y2hOb25lQ3JlYXRlQ2hpbGQoDQorICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlKSB7DQorICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gcEZvcm1Ob2RlLT5HZXRXaWRnZXREYXRhKCk7DQorICBGWFNZU19hc3NlcnQocFdpZGdldERhdGEpOw0KKyAgcFdpZGdldERhdGEtPkdldFVJVHlwZSgpOw0KK30NCitzdGF0aWMgRlhfQk9PTCBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfU2V0Q2hpbGRDb250ZW50KA0KKyAgICBDWEZBX05vZGUqIHBWYWx1ZU5vZGUsDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0NvbnRlbnQsDQorICAgIFhGQV9FTEVNRU5UIGlUeXBlID0gWEZBX0VMRU1FTlRfVU5LTk9XTikgew0KKyAgaWYgKCFwVmFsdWVOb2RlKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZYU1lTX2Fzc2VydChwVmFsdWVOb2RlLT5HZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRm9ybSk7DQorICBDWEZBX05vZGUqIHBDaGlsZE5vZGUgPQ0KKyAgICAgIFhGQV9EYXRhTWVyZ2VfRm9ybVZhbHVlTm9kZV9DcmVhdGVDaGlsZChwVmFsdWVOb2RlLCBpVHlwZSk7DQorICBpZiAoIXBDaGlsZE5vZGUpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgWEZBX09CSkVDVFRZUEUgb2JqZWN0VHlwZSA9IHBDaGlsZE5vZGUtPkdldE9iamVjdFR5cGUoKTsNCisgIHN3aXRjaCAob2JqZWN0VHlwZSkgew0KKyAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlOiB7DQorICAgICAgQ1hGQV9Ob2RlKiBwQ29udGVudFJhd0RhdGFOb2RlID0NCisgICAgICAgICAgcENoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgIGlmICghcENvbnRlbnRSYXdEYXRhTm9kZSkgew0KKyAgICAgICAgWEZBX0VMRU1FTlQgZWxlbWVudCA9IFhGQV9FTEVNRU5UX1NoYXJwdGV4dDsNCisgICAgICAgIGlmIChwQ2hpbGROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhEYXRhKSB7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudFR5cGU7DQorICAgICAgICAgIHBDaGlsZE5vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOw0KKyAgICAgICAgICBpZiAod3NDb250ZW50VHlwZS5FcXVhbChGWF9XU1RSQyhMInRleHQvaHRtbCIpKSkgew0KKyAgICAgICAgICAgIGVsZW1lbnQgPSBYRkFfRUxFTUVOVF9TaGFycHhIVE1MOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHdzQ29udGVudFR5cGUuRXF1YWwoRlhfV1NUUkMoTCJ0ZXh0L3htbCIpKSkgew0KKyAgICAgICAgICAgIGVsZW1lbnQgPSBYRkFfRUxFTUVOVF9TaGFycHhtbDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcENvbnRlbnRSYXdEYXRhTm9kZSA9IHBDaGlsZE5vZGUtPkNyZWF0ZVNhbWVQYWNrZXROb2RlKGVsZW1lbnQpOw0KKyAgICAgICAgcENoaWxkTm9kZS0+SW5zZXJ0Q2hpbGQocENvbnRlbnRSYXdEYXRhTm9kZSk7DQorICAgICAgfQ0KKyAgICAgIHBDb250ZW50UmF3RGF0YU5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29udGVudCk7DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfTm9kZUM6DQorICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGU6DQorICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfTm9kZVY6IHsNCisgICAgICBwQ2hpbGROb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbnRlbnQpOw0KKyAgICB9IGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorc3RhdGljIHZvaWQgWEZBX0RhdGFNZXJnZV9DcmVhdGVEYXRhQmluZGluZyhDWEZBX05vZGUqIHBGb3JtTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRGF0YVRvRm9ybSA9IFRSVUUpIHsNCisgIHBGb3JtTm9kZS0+U2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsIHBEYXRhTm9kZSk7DQorICBwRGF0YU5vZGUtPkFkZEJpbmRJdGVtKHBGb3JtTm9kZSk7DQorICBYRkFfRUxFTUVOVCBlQ2xhc3MgPSBwRm9ybU5vZGUtPkdldENsYXNzSUQoKTsNCisgIGlmIChlQ2xhc3MgIT0gWEZBX0VMRU1FTlRfRmllbGQgJiYgZUNsYXNzICE9IFhGQV9FTEVNRU5UX0V4Y2xHcm91cCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gcEZvcm1Ob2RlLT5HZXRXaWRnZXREYXRhKCk7DQorICBGWFNZU19hc3NlcnQocFdpZGdldERhdGEpOw0KKyAgRlhfQk9PTCBiTm90aWZ5ID0gRkFMU0U7DQorICBYRkFfRUxFTUVOVCBlVUlUeXBlID0gcFdpZGdldERhdGEtPkdldFVJVHlwZSgpOw0KKyAgQ1hGQV9WYWx1ZSBkZWZWYWx1ZSA9IHBGb3JtTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfVmFsdWUpOw0KKyAgaWYgKCFiRGF0YVRvRm9ybSkgew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdGVkVmFsdWU7DQorICAgIHN3aXRjaCAoZVVJVHlwZSkgew0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfSW1hZ2VFZGl0OiB7DQorICAgICAgICBDWEZBX0ltYWdlIGltYWdlID0gZGVmVmFsdWUuR2V0SW1hZ2UoKTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudFR5cGU7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0hyZWY7DQorICAgICAgICBpZiAoaW1hZ2UpIHsNCisgICAgICAgICAgaW1hZ2UuR2V0Q29udGVudCh3c1ZhbHVlKTsNCisgICAgICAgICAgaW1hZ2UuR2V0Q29udGVudFR5cGUod3NDb250ZW50VHlwZSk7DQorICAgICAgICAgIGltYWdlLkdldEhyZWYod3NIcmVmKTsNCisgICAgICAgIH0NCisgICAgICAgIElGREVfWE1MRWxlbWVudCogcFhNTERhdGFFbGVtZW50ID0NCisgICAgICAgICAgICAoSUZERV9YTUxFbGVtZW50KikocERhdGFOb2RlLT5HZXRYTUxNYXBwaW5nTm9kZSgpKTsNCisgICAgICAgIEZYU1lTX2Fzc2VydChwWE1MRGF0YUVsZW1lbnQpOw0KKyAgICAgICAgcFdpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c1ZhbHVlLCB3c0Zvcm1hdGVkVmFsdWUpOw0KKyAgICAgICAgcERhdGFOb2RlLT5TZXRBdHRyaWJ1dGVWYWx1ZSh3c1ZhbHVlLCB3c0Zvcm1hdGVkVmFsdWUpOw0KKyAgICAgICAgcERhdGFOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlKTsNCisgICAgICAgIGlmICghd3NIcmVmLklzRW1wdHkoKSkgew0KKyAgICAgICAgICBwWE1MRGF0YUVsZW1lbnQtPlNldFN0cmluZyhGWF9XU1RSQyhMImhyZWYiKSwgd3NIcmVmKTsNCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdDoNCisgICAgICAgIGRlZlZhbHVlLkdldENoaWxkVmFsdWVDb250ZW50KHdzVmFsdWUpOw0KKyAgICAgICAgaWYgKHBXaWRnZXREYXRhLT5HZXRDaG9pY2VMaXN0T3BlbigpID09IFhGQV9BVFRSSUJVVEVFTlVNX011bHRpU2VsZWN0KSB7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NTZWxUZXh0QXJyYXk7DQorICAgICAgICAgIHBXaWRnZXREYXRhLT5HZXRTZWxlY3RlZEl0ZW1zVmFsdWUod3NTZWxUZXh0QXJyYXkpOw0KKyAgICAgICAgICBpbnQzMl90IGlTaXplID0gd3NTZWxUZXh0QXJyYXkuR2V0U2l6ZSgpOw0KKyAgICAgICAgICBpZiAoaVNpemUgPj0gMSkgew0KKyAgICAgICAgICAgIENYRkFfTm9kZSogcFZhbHVlID0gTlVMTDsNCisgICAgICAgICAgICBJRkRFX1hNTE5vZGUqIHBWYWx1ZVhNTE5vZGUgPSBOVUxMOw0KKyAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTaXplOyBpKyspIHsNCisgICAgICAgICAgICAgIHBWYWx1ZSA9IHBEYXRhTm9kZS0+Q3JlYXRlU2FtZVBhY2tldE5vZGUoWEZBX0VMRU1FTlRfRGF0YVZhbHVlKTsNCisgICAgICAgICAgICAgIHBWYWx1ZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCBGWF9XU1RSQyhMInZhbHVlIikpOw0KKyAgICAgICAgICAgICAgcFZhbHVlWE1MTm9kZSA9IHBWYWx1ZS0+Q3JlYXRlWE1MTWFwcGluZ05vZGUoKTsNCisgICAgICAgICAgICAgIHBEYXRhTm9kZS0+SW5zZXJ0Q2hpbGQocFZhbHVlKTsNCisgICAgICAgICAgICAgIHBWYWx1ZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NTZWxUZXh0QXJyYXlbaV0pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlID0gcERhdGFOb2RlLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgICAgICAgIEZYU1lTX2Fzc2VydChwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpOw0KKyAgICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50KilwWE1MTm9kZSkNCisgICAgICAgICAgICAgICAgLT5TZXRTdHJpbmcoRlhfV1NUUkMoTCJ4ZmE6ZGF0YU5vZGUiKSwgRlhfV1NUUkMoTCJkYXRhR3JvdXAiKSk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoIXdzVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIHBXaWRnZXREYXRhLT5HZXRGb3JtYXREYXRhVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXRlZFZhbHVlKTsNCisgICAgICAgICAgcERhdGFOb2RlLT5TZXRBdHRyaWJ1dGVWYWx1ZSh3c1ZhbHVlLCB3c0Zvcm1hdGVkVmFsdWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9DaGVja0J1dHRvbjoNCisgICAgICAgIGRlZlZhbHVlLkdldENoaWxkVmFsdWVDb250ZW50KHdzVmFsdWUpOw0KKyAgICAgICAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcFdpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c1ZhbHVlLCB3c0Zvcm1hdGVkVmFsdWUpOw0KKyAgICAgICAgcERhdGFOb2RlLT5TZXRBdHRyaWJ1dGVWYWx1ZSh3c1ZhbHVlLCB3c0Zvcm1hdGVkVmFsdWUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9FeGNsR3JvdXA6IHsNCisgICAgICAgIENYRkFfTm9kZSogcENoZWNrZWQgPSBOVUxMOw0KKyAgICAgICAgWEZBX0VMRU1FTlQgZVZhbHVlVHlwZSA9IFhGQV9FTEVNRU5UX1VOS05PV047DQorICAgICAgICBDWEZBX05vZGUqIHBDaGlsZCA9IHBGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICAgZm9yICg7IHBDaGlsZDsgcENoaWxkID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICAgIGlmIChwQ2hpbGQtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9GaWVsZCkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIENYRkFfTm9kZSogcFZhbHVlID0gcENoaWxkLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9WYWx1ZSk7DQorICAgICAgICAgIGlmICghcFZhbHVlKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgQ1hGQV9WYWx1ZSB2YWx1ZUNoaWxkKHBWYWx1ZSk7DQorICAgICAgICAgIHZhbHVlQ2hpbGQuR2V0Q2hpbGRWYWx1ZUNvbnRlbnQod3NWYWx1ZSk7DQorICAgICAgICAgIGlmICh3c1ZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIENYRkFfTm9kZSogcEl0ZW1zID0gcENoaWxkLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9JdGVtcyk7DQorICAgICAgICAgIGlmICghcEl0ZW1zKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgQ1hGQV9Ob2RlKiBwVGV4dCA9IHBJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICAgICBpZiAoIXBUZXh0KSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50Ow0KKyAgICAgICAgICBpZiAocFRleHQtPlRyeUNvbnRlbnQod3NDb250ZW50KSAmJiAod3NDb250ZW50ID09IHdzVmFsdWUpKSB7DQorICAgICAgICAgICAgcENoZWNrZWQgPSBwQ2hpbGQ7DQorICAgICAgICAgICAgZVZhbHVlVHlwZSA9IHBUZXh0LT5HZXRDbGFzc0lEKCk7DQorICAgICAgICAgICAgd3NGb3JtYXRlZFZhbHVlID0gd3NWYWx1ZTsNCisgICAgICAgICAgICBwRGF0YU5vZGUtPlNldEF0dHJpYnV0ZVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0ZWRWYWx1ZSk7DQorICAgICAgICAgICAgcEZvcm1Ob2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbnRlbnQpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoIXBDaGVja2VkKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcENoaWxkID0gcEZvcm1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICBmb3IgKDsgcENoaWxkOyBwQ2hpbGQgPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgICAgaWYgKHBDaGlsZCA9PSBwQ2hlY2tlZCkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChwQ2hpbGQtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9GaWVsZCkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIENYRkFfTm9kZSogcFZhbHVlID0gcENoaWxkLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9WYWx1ZSk7DQorICAgICAgICAgIENYRkFfTm9kZSogcEl0ZW1zID0gcENoaWxkLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9JdGVtcyk7DQorICAgICAgICAgIENYRkFfTm9kZSogcFRleHQgPQ0KKyAgICAgICAgICAgICAgcEl0ZW1zID8gcEl0ZW1zLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkgOiBOVUxMOw0KKyAgICAgICAgICBpZiAocFRleHQpIHsNCisgICAgICAgICAgICBwVGV4dCA9IHBUZXh0LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsNCisgICAgICAgICAgaWYgKHBUZXh0KSB7DQorICAgICAgICAgICAgcFRleHQtPlRyeUNvbnRlbnQod3NDb250ZW50KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfU2V0Q2hpbGRDb250ZW50KHBWYWx1ZSwgd3NDb250ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UX1RleHQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9OdW1lcmljRWRpdDogew0KKyAgICAgICAgZGVmVmFsdWUuR2V0Q2hpbGRWYWx1ZUNvbnRlbnQod3NWYWx1ZSk7DQorICAgICAgICBpZiAod3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c091dHB1dDsNCisgICAgICAgIHBXaWRnZXREYXRhLT5Ob3JtYWxpemVOdW1TdHIod3NWYWx1ZSwgd3NPdXRwdXQpOw0KKyAgICAgICAgd3NWYWx1ZSA9IHdzT3V0cHV0Ow0KKyAgICAgICAgcFdpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c1ZhbHVlLCB3c0Zvcm1hdGVkVmFsdWUpOw0KKyAgICAgICAgcERhdGFOb2RlLT5TZXRBdHRyaWJ1dGVWYWx1ZSh3c1ZhbHVlLCB3c0Zvcm1hdGVkVmFsdWUpOw0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwVmFsdWUgPSBwRm9ybU5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1ZhbHVlKTsNCisgICAgICAgIFhGQV9EYXRhTWVyZ2VfRm9ybVZhbHVlTm9kZV9TZXRDaGlsZENvbnRlbnQocFZhbHVlLCB3c1ZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVF9GbG9hdCk7DQorICAgICAgfSBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgZGVmVmFsdWUuR2V0Q2hpbGRWYWx1ZUNvbnRlbnQod3NWYWx1ZSk7DQorICAgICAgICBpZiAod3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBwV2lkZ2V0RGF0YS0+R2V0Rm9ybWF0RGF0YVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0ZWRWYWx1ZSk7DQorICAgICAgICBwRGF0YU5vZGUtPlNldEF0dHJpYnV0ZVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0ZWRWYWx1ZSk7DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NYTUxWYWx1ZTsNCisgICAgcERhdGFOb2RlLT5UcnlDb250ZW50KHdzWE1MVmFsdWUpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c05vcm1haWxpemVWYWx1ZTsNCisgICAgcFdpZGdldERhdGEtPkdldE5vcm1hbGl6ZURhdGFWYWx1ZSh3c1hNTFZhbHVlLCB3c05vcm1haWxpemVWYWx1ZSk7DQorICAgIHBEYXRhTm9kZS0+U2V0QXR0cmlidXRlVmFsdWUod3NOb3JtYWlsaXplVmFsdWUsIHdzWE1MVmFsdWUpOw0KKyAgICBzd2l0Y2ggKGVVSVR5cGUpIHsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0ltYWdlRWRpdDogew0KKyAgICAgICAgWEZBX0RhdGFNZXJnZV9Gb3JtVmFsdWVOb2RlX1NldENoaWxkQ29udGVudCgNCisgICAgICAgICAgICBkZWZWYWx1ZS5HZXROb2RlKCksIHdzTm9ybWFpbGl6ZVZhbHVlLCBYRkFfRUxFTUVOVF9JbWFnZSk7DQorICAgICAgICBDWEZBX0ltYWdlIGltYWdlID0gZGVmVmFsdWUuR2V0SW1hZ2UoKTsNCisgICAgICAgIGlmIChpbWFnZSkgew0KKyAgICAgICAgICBJRkRFX1hNTEVsZW1lbnQqIHBYTUxEYXRhRWxlbWVudCA9DQorICAgICAgICAgICAgICAoSUZERV9YTUxFbGVtZW50KikocERhdGFOb2RlLT5HZXRYTUxNYXBwaW5nTm9kZSgpKTsNCisgICAgICAgICAgRlhTWVNfYXNzZXJ0KHBYTUxEYXRhRWxlbWVudCk7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudFR5cGU7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzSHJlZjsNCisgICAgICAgICAgcFhNTERhdGFFbGVtZW50LT5HZXRTdHJpbmcoTCJ4ZmE6Y29udGVudFR5cGUiLCB3c0NvbnRlbnRUeXBlKTsNCisgICAgICAgICAgaWYgKCF3c0NvbnRlbnRUeXBlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICAgIHBEYXRhTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSk7DQorICAgICAgICAgICAgaW1hZ2UuU2V0Q29udGVudFR5cGUod3NDb250ZW50VHlwZSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcFhNTERhdGFFbGVtZW50LT5HZXRTdHJpbmcoTCJocmVmIiwgd3NIcmVmKTsNCisgICAgICAgICAgaWYgKCF3c0hyZWYuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgaW1hZ2UuU2V0SHJlZih3c0hyZWYpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0Nob2ljZUxpc3Q6DQorICAgICAgICBpZiAocFdpZGdldERhdGEtPkdldENob2ljZUxpc3RPcGVuKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fTXVsdGlTZWxlY3QpIHsNCisgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgaXRlbXM7DQorICAgICAgICAgIHBEYXRhTm9kZS0+R2V0Tm9kZUxpc3QoaXRlbXMpOw0KKyAgICAgICAgICBpbnQzMl90IGlDb3VudHMgPSBpdGVtcy5HZXRTaXplKCk7DQorICAgICAgICAgIGlmIChpQ291bnRzID4gMCkgew0KKyAgICAgICAgICAgIHdzTm9ybWFpbGl6ZVZhbHVlLkVtcHR5KCk7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NJdGVtOw0KKyAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudHM7IGkrKykgew0KKyAgICAgICAgICAgICAgaXRlbXNbaV0tPlRyeUNvbnRlbnQod3NJdGVtKTsNCisgICAgICAgICAgICAgIHdzSXRlbSA9IChpQ291bnRzID09IDEpID8gd3NJdGVtIDogd3NJdGVtICsgRlhfV1NUUkMoTCJcbiIpOw0KKyAgICAgICAgICAgICAgd3NOb3JtYWlsaXplVmFsdWUgKz0gd3NJdGVtOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBDWEZBX0V4RGF0YSBleERhdGEgPSBkZWZWYWx1ZS5HZXRFeERhdGEoKTsNCisgICAgICAgICAgICBGWFNZU19hc3NlcnQoZXhEYXRhICE9IE5VTEwpOw0KKyAgICAgICAgICAgIGV4RGF0YS5TZXRDb250ZW50VHlwZSgoaUNvdW50cyA9PSAxKSA/IEZYX1dTVFJDKEwidGV4dC9wbGFpbiIpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhfV1NUUkMoTCJ0ZXh0L3htbCIpKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfU2V0Q2hpbGRDb250ZW50KA0KKyAgICAgICAgICAgICAgZGVmVmFsdWUuR2V0Tm9kZSgpLCB3c05vcm1haWxpemVWYWx1ZSwgWEZBX0VMRU1FTlRfRXhEYXRhKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfRm9ybVZhbHVlTm9kZV9TZXRDaGlsZENvbnRlbnQoDQorICAgICAgICAgICAgICBkZWZWYWx1ZS5HZXROb2RlKCksIHdzTm9ybWFpbGl6ZVZhbHVlLCBYRkFfRUxFTUVOVF9UZXh0KTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQ2hlY2tCdXR0b246DQorICAgICAgICBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfU2V0Q2hpbGRDb250ZW50KA0KKyAgICAgICAgICAgIGRlZlZhbHVlLkdldE5vZGUoKSwgd3NOb3JtYWlsaXplVmFsdWUsIFhGQV9FTEVNRU5UX1RleHQpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9FeGNsR3JvdXA6IHsNCisgICAgICAgIHBXaWRnZXREYXRhLT5TZXRTZWxlY3RlZE1lbWJlckJ5VmFsdWUod3NOb3JtYWlsaXplVmFsdWUsIGJOb3RpZnksIEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0RhdGVUaW1lRWRpdDoNCisgICAgICAgIFhGQV9EYXRhTWVyZ2VfRm9ybVZhbHVlTm9kZV9TZXRDaGlsZENvbnRlbnQoDQorICAgICAgICAgICAgZGVmVmFsdWUuR2V0Tm9kZSgpLCB3c05vcm1haWxpemVWYWx1ZSwgWEZBX0VMRU1FTlRfRGF0ZVRpbWUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9OdW1lcmljRWRpdDogew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQaWN0dXJlOw0KKyAgICAgICAgcFdpZGdldERhdGEtPkdldFBpY3R1cmVDb250ZW50KHdzUGljdHVyZSwgWEZBX1ZBTFVFUElDVFVSRV9EYXRhQmluZCk7DQorICAgICAgICBpZiAod3NQaWN0dXJlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c091dHB1dDsNCisgICAgICAgICAgcFdpZGdldERhdGEtPk5vcm1hbGl6ZU51bVN0cih3c05vcm1haWxpemVWYWx1ZSwgd3NPdXRwdXQpOw0KKyAgICAgICAgICB3c05vcm1haWxpemVWYWx1ZSA9IHdzT3V0cHV0Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgWEZBX0RhdGFNZXJnZV9Gb3JtVmFsdWVOb2RlX1NldENoaWxkQ29udGVudCgNCisgICAgICAgICAgICBkZWZWYWx1ZS5HZXROb2RlKCksIHdzTm9ybWFpbGl6ZVZhbHVlLCBYRkFfRUxFTUVOVF9GbG9hdCk7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0JhcmNvZGU6DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CdXR0b246DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9QYXNzd29yZEVkaXQ6DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9TaWduYXR1cmU6DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9UZXh0RWRpdDoNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgWEZBX0RhdGFNZXJnZV9Gb3JtVmFsdWVOb2RlX1NldENoaWxkQ29udGVudCgNCisgICAgICAgICAgICBkZWZWYWx1ZS5HZXROb2RlKCksIHdzTm9ybWFpbGl6ZVZhbHVlLCBYRkFfRUxFTUVOVF9UZXh0KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorfQ0KK3N0YXRpYyBDWEZBX05vZGUqIFhGQV9EYXRhTWVyZ2VfR2V0R2xvYmFsQmluZGluZyhDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3TmFtZUhhc2gpIHsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBOVUxMOw0KKyAgcERvY3VtZW50LT5tX3JnR2xvYmFsQmluZGluZy5Mb29rdXAoZHdOYW1lSGFzaCwgcE5vZGUpOw0KKyAgcmV0dXJuIHBOb2RlOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfRGF0YU1lcmdlX1JlZ2lzdGVyR2xvYmFsQmluZGluZyhDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdOYW1lSGFzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSkgew0KKyAgcERvY3VtZW50LT5tX3JnR2xvYmFsQmluZGluZy5TZXRBdChkd05hbWVIYXNoLCBwRGF0YU5vZGUpOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfRGF0YU1lcmdlX0NsZWFyR2xvYmFsQmluZGluZyhDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsNCisgIHBEb2N1bWVudC0+bV9yZ0dsb2JhbEJpbmRpbmcuUmVtb3ZlQWxsKCk7DQorfQ0KK3N0YXRpYyBDWEZBX05vZGUqIFhGQV9EYXRhTWVyZ2VfU2NvcGVNYXRjaEdsb2JhbEJpbmRpbmcoDQorICAgIENYRkFfTm9kZSogcERhdGFTY29wZSwNCisgICAgRlhfRFdPUkQgZHdOYW1lSGFzaCwNCisgICAgWEZBX0VMRU1FTlQgZU1hdGNoRGF0YU5vZGVUeXBlLA0KKyAgICBGWF9CT09MIGJVcExldmVsID0gVFJVRSkgew0KKyAgZm9yIChDWEZBX05vZGUgKnBDdXJEYXRhU2NvcGUgPSBwRGF0YVNjb3BlLCAqcExhc3REYXRhU2NvcGUgPSBOVUxMOw0KKyAgICAgICBwQ3VyRGF0YVNjb3BlICYmIHBDdXJEYXRhU2NvcGUtPkdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0czsNCisgICAgICAgcExhc3REYXRhU2NvcGUgPSBwQ3VyRGF0YVNjb3BlLA0KKyAgICAgICAgICAgICAgICAgcEN1ckRhdGFTY29wZSA9DQorICAgICAgICAgICAgICAgICAgICAgcEN1ckRhdGFTY29wZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpIHsNCisgICAgZm9yIChDWEZBX05vZGUqIHBEYXRhQ2hpbGQgPSBwQ3VyRGF0YVNjb3BlLT5HZXRGaXJzdENoaWxkQnlOYW1lKGR3TmFtZUhhc2gpOw0KKyAgICAgICAgIHBEYXRhQ2hpbGQ7DQorICAgICAgICAgcERhdGFDaGlsZCA9IHBEYXRhQ2hpbGQtPkdldE5leHRTYW1lTmFtZVNpYmxpbmcoZHdOYW1lSGFzaCkpIHsNCisgICAgICBpZiAocERhdGFDaGlsZCA9PSBwTGFzdERhdGFTY29wZSB8fA0KKyAgICAgICAgICAoZU1hdGNoRGF0YU5vZGVUeXBlICE9IFhGQV9FTEVNRU5UX0RhdGFNb2RlbCAmJg0KKyAgICAgICAgICAgcERhdGFDaGlsZC0+R2V0Q2xhc3NJRCgpICE9IGVNYXRjaERhdGFOb2RlVHlwZSkgfHwNCisgICAgICAgICAgcERhdGFDaGlsZC0+SGFzQmluZEl0ZW0oKSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBwRGF0YUNoaWxkOw0KKyAgICB9DQorICAgIGZvciAoQ1hGQV9Ob2RlKiBwRGF0YUNoaWxkID0NCisgICAgICAgICAgICAgcEN1ckRhdGFTY29wZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfRGF0YUdyb3VwKTsNCisgICAgICAgICBwRGF0YUNoaWxkOyBwRGF0YUNoaWxkID0gcERhdGFDaGlsZC0+R2V0TmV4dFNhbWVDbGFzc1NpYmxpbmcoDQorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UX0RhdGFHcm91cCkpIHsNCisgICAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IFhGQV9EYXRhTWVyZ2VfU2NvcGVNYXRjaEdsb2JhbEJpbmRpbmcoDQorICAgICAgICAgIHBEYXRhQ2hpbGQsIGR3TmFtZUhhc2gsIGVNYXRjaERhdGFOb2RlVHlwZSwgRkFMU0UpOw0KKyAgICAgIGlmIChwRGF0YU5vZGUpIHsNCisgICAgICAgIHJldHVybiBwRGF0YU5vZGU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmICghYlVwTGV2ZWwpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK3N0YXRpYyBDWEZBX05vZGUqIFhGQV9EYXRhTWVyZ2VfRmluZEdsb2JhbERhdGFOb2RlKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcERhdGFTY29wZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVCBlTWF0Y2hOb2RlVHlwZSkgew0KKyAgRlhfRFdPUkQgZHdOYW1lSGFzaCA9DQorICAgICAgd3NOYW1lLklzRW1wdHkoKSA/IDAgOiBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05hbWUuR2V0UHRyKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c05hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgaWYgKGR3TmFtZUhhc2ggIT0gMCkgew0KKyAgICBDWEZBX05vZGUqIHBCb3VuZGVkID0gWEZBX0RhdGFNZXJnZV9HZXRHbG9iYWxCaW5kaW5nKHBEb2N1bWVudCwgZHdOYW1lSGFzaCk7DQorICAgIGlmICghcEJvdW5kZWQpIHsNCisgICAgICBwQm91bmRlZCA9IFhGQV9EYXRhTWVyZ2VfU2NvcGVNYXRjaEdsb2JhbEJpbmRpbmcocERhdGFTY29wZSwgZHdOYW1lSGFzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU1hdGNoTm9kZVR5cGUpOw0KKyAgICAgIGlmIChwQm91bmRlZCkgew0KKyAgICAgICAgWEZBX0RhdGFNZXJnZV9SZWdpc3Rlckdsb2JhbEJpbmRpbmcocERvY3VtZW50LCBkd05hbWVIYXNoLCBwQm91bmRlZCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBwQm91bmRlZDsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitzdGF0aWMgQ1hGQV9Ob2RlKiBYRkFfRGF0YU1lcmdlX0ZpbmRPbmNlRGF0YU5vZGUoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEYXRhU2NvcGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVNYXRjaE5vZGVUeXBlKSB7DQorICBGWF9EV09SRCBkd05hbWVIYXNoID0NCisgICAgICB3c05hbWUuSXNFbXB0eSgpID8gMCA6IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTmFtZS5HZXRQdHIoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzTmFtZS5HZXRMZW5ndGgoKSk7DQorICBpZiAoZHdOYW1lSGFzaCAhPSAwKSB7DQorICAgIGZvciAoQ1hGQV9Ob2RlICpwQ3VyRGF0YVNjb3BlID0gcERhdGFTY29wZSwgKnBMYXN0RGF0YVNjb3BlID0gTlVMTDsNCisgICAgICAgICBwQ3VyRGF0YVNjb3BlICYmDQorICAgICAgICAgcEN1ckRhdGFTY29wZS0+R2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzOw0KKyAgICAgICAgIHBMYXN0RGF0YVNjb3BlID0gcEN1ckRhdGFTY29wZSwNCisgICAgICAgICAgICAgICAgICAgcEN1ckRhdGFTY29wZSA9DQorICAgICAgICAgICAgICAgICAgICAgICBwQ3VyRGF0YVNjb3BlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSkgew0KKyAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwRGF0YUNoaWxkID0NCisgICAgICAgICAgICAgICBwQ3VyRGF0YVNjb3BlLT5HZXRGaXJzdENoaWxkQnlOYW1lKGR3TmFtZUhhc2gpOw0KKyAgICAgICAgICAgcERhdGFDaGlsZDsNCisgICAgICAgICAgIHBEYXRhQ2hpbGQgPSBwRGF0YUNoaWxkLT5HZXROZXh0U2FtZU5hbWVTaWJsaW5nKGR3TmFtZUhhc2gpKSB7DQorICAgICAgICBpZiAocERhdGFDaGlsZCA9PSBwTGFzdERhdGFTY29wZSB8fA0KKyAgICAgICAgICAgIChlTWF0Y2hOb2RlVHlwZSAhPSBYRkFfRUxFTUVOVF9EYXRhTW9kZWwgJiYNCisgICAgICAgICAgICAgcERhdGFDaGlsZC0+R2V0Q2xhc3NJRCgpICE9IGVNYXRjaE5vZGVUeXBlKSB8fA0KKyAgICAgICAgICAgIHBEYXRhQ2hpbGQtPkhhc0JpbmRJdGVtKCkpIHsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcERhdGFDaGlsZDsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitzdGF0aWMgQ1hGQV9Ob2RlKiBYRkFfRGF0YU1lcmdlX0ZpbmREYXRhUmVmRGF0YU5vZGUoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NSZWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcERhdGFTY29wZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgZU1hdGNoTm9kZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRm9yY2VCaW5kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVcExldmVsID0gVFJVRSkgew0KKyAgRlhfRFdPUkQgZEZsYWdzID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX0JpbmROZXc7DQorICBpZiAoYlVwTGV2ZWwgfHwgd3NSZWYgIT0gRlhfV1NUUkMoTCJuYW1lIikpIHsNCisgICAgZEZsYWdzIHw9IChYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzKTsNCisgIH0NCisgIFhGQV9SRVNPTFZFTk9ERV9SUyByczsNCisgIHBEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5SZXNvbHZlT2JqZWN0cyhwRGF0YVNjb3BlLCB3c1JlZiwgcnMsIGRGbGFncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcGxhdGVOb2RlKTsNCisgIGlmIChycy5kd0ZsYWdzID09IFhGQV9SRVNPTFZFTk9ERV9SU1RZUEVfQ3JlYXRlTm9kZUFsbCB8fA0KKyAgICAgIHJzLmR3RmxhZ3MgPT0gWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlTWlkQWxsIHx8DQorICAgICAgcnMubm9kZXMuR2V0U2l6ZSgpID4gMSkgew0KKyAgICByZXR1cm4gcERvY3VtZW50LT5HZXROb3RCaW5kTm9kZShycy5ub2Rlcyk7DQorICB9IGVsc2UgaWYgKHJzLmR3RmxhZ3MgPT0gWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlT25lKSB7DQorICAgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gKHJzLm5vZGVzLkdldFNpemUoKSA+IDApID8gcnMubm9kZXNbMF0gOiBOVUxMOw0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0NCisgICAgICAgIChwT2JqZWN0ICYmIHBPYmplY3QtPklzTm9kZSgpKSA/IChDWEZBX05vZGUqKXBPYmplY3QgOiBOVUxMOw0KKyAgICBpZiAoIWJGb3JjZUJpbmQgJiYgKHBOb2RlICE9IE5VTEwpICYmIHBOb2RlLT5IYXNCaW5kSXRlbSgpKSB7DQorICAgICAgcE5vZGUgPSBOVUxMOw0KKyAgICB9DQorICAgIHJldHVybiBwTm9kZTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitDWEZBX05vZGUqIFhGQV9EYXRhTWVyZ2VfRmluZEZvcm1ET01JbnN0YW5jZShDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgZUNsYXNzSUQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdOYW1lSGFzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBGb3JtUGFyZW50KSB7DQorICBDWEZBX05vZGUqIHBGb3JtQ2hpbGQgPSBwRm9ybVBhcmVudC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgZm9yICg7IHBGb3JtQ2hpbGQ7DQorICAgICAgIHBGb3JtQ2hpbGQgPSBwRm9ybUNoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIGlmIChwRm9ybUNoaWxkLT5HZXRDbGFzc0lEKCkgPT0gZUNsYXNzSUQgJiYNCisgICAgICAgIHBGb3JtQ2hpbGQtPkdldE5hbWVIYXNoKCkgPT0gZHdOYW1lSGFzaCAmJg0KKyAgICAgICAgcEZvcm1DaGlsZC0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSkpIHsNCisgICAgICByZXR1cm4gcEZvcm1DaGlsZDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK3N0YXRpYyBGWF9CT09MIFhGQV9OZWVkR2VuZXJhdGVGb3JtKENYRkFfTm9kZSogcFRlbXBsYXRlQ2hpbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXNlSW5zdGFuY2VNYW5hZ2VyID0gVFJVRSkgew0KKyAgWEZBX0VMRU1FTlQgZVR5cGUgPSBwVGVtcGxhdGVDaGlsZC0+R2V0Q2xhc3NJRCgpOw0KKyAgaWYgKGVUeXBlID09IFhGQV9FTEVNRU5UX1ZhcmlhYmxlcykgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIGlmIChwVGVtcGxhdGVDaGlsZC0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGVUeXBlID09IFhGQV9FTEVNRU5UX1Byb3RvIHx8DQorICAgICAgKGJVc2VJbnN0YW5jZU1hbmFnZXIgJiYgZVR5cGUgPT0gWEZBX0VMRU1FTlRfT2NjdXIpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitDWEZBX05vZGUqIFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEZvcm1QYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSZWN1cnNpdmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGVBcnJheSogcFN1YmZvcm1BcnJheSkgew0KKyAgQ1hGQV9Ob2RlKiBwRXhpc3RpbmdOb2RlID0gTlVMTDsNCisgIGlmIChwU3ViZm9ybUFycmF5ID09IE5VTEwpIHsNCisgICAgcEV4aXN0aW5nTm9kZSA9IFhGQV9EYXRhTWVyZ2VfRmluZEZvcm1ET01JbnN0YW5jZSgNCisgICAgICAgIHBEb2N1bWVudCwgcFRlbXBsYXRlTm9kZS0+R2V0Q2xhc3NJRCgpLCBwVGVtcGxhdGVOb2RlLT5HZXROYW1lSGFzaCgpLA0KKyAgICAgICAgcEZvcm1QYXJlbnQpOw0KKyAgfSBlbHNlIGlmIChwU3ViZm9ybUFycmF5LT5HZXRTaXplKCkgPiAwKSB7DQorICAgIHBFeGlzdGluZ05vZGUgPSBwU3ViZm9ybUFycmF5LT5HZXRBdCgwKTsNCisgICAgcFN1YmZvcm1BcnJheS0+UmVtb3ZlQXQoMCk7DQorICB9DQorICBpZiAocEV4aXN0aW5nTm9kZSkgew0KKyAgICBpZiAocFN1YmZvcm1BcnJheSkgew0KKyAgICAgIHBGb3JtUGFyZW50LT5JbnNlcnRDaGlsZChwRXhpc3RpbmdOb2RlKTsNCisgICAgfSBlbHNlIGlmIChwRXhpc3RpbmdOb2RlLT5Jc0NvbnRhaW5lck5vZGUoKSkgew0KKyAgICAgIHBGb3JtUGFyZW50LT5SZW1vdmVDaGlsZChwRXhpc3RpbmdOb2RlKTsNCisgICAgICBwRm9ybVBhcmVudC0+SW5zZXJ0Q2hpbGQocEV4aXN0aW5nTm9kZSk7DQorICAgIH0NCisgICAgcEV4aXN0aW5nTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSwgRkFMU0UpOw0KKyAgICBwRXhpc3RpbmdOb2RlLT5TZXRUZW1wbGF0ZU5vZGUocFRlbXBsYXRlTm9kZSk7DQorICAgIGlmIChiUmVjdXJzaXZlICYmIHBFeGlzdGluZ05vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9JdGVtcykgew0KKyAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVDaGlsZCA9DQorICAgICAgICAgICAgICAgcFRlbXBsYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICAgICAgcFRlbXBsYXRlQ2hpbGQ7IHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlQ2hpbGQtPkdldE5vZGVJdGVtKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICBpZiAoWEZBX05lZWRHZW5lcmF0ZUZvcm0ocFRlbXBsYXRlQ2hpbGQpKSB7DQorICAgICAgICAgIFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKHBEb2N1bWVudCwgcEV4aXN0aW5nTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBsYXRlQ2hpbGQsIGJSZWN1cnNpdmUpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBwRXhpc3RpbmdOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCk7DQorICAgIHJldHVybiBwRXhpc3RpbmdOb2RlOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTmV3Tm9kZSA9IHBUZW1wbGF0ZU5vZGUtPkNsb25lVGVtcGxhdGVUb0Zvcm0oRkFMU0UpOw0KKyAgcEZvcm1QYXJlbnQtPkluc2VydENoaWxkKHBOZXdOb2RlLCBOVUxMKTsNCisgIGlmIChiUmVjdXJzaXZlKSB7DQorICAgIGZvciAoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVDaGlsZCA9DQorICAgICAgICAgICAgIHBUZW1wbGF0ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICBwVGVtcGxhdGVDaGlsZDsgcFRlbXBsYXRlQ2hpbGQgPSBwVGVtcGxhdGVDaGlsZC0+R2V0Tm9kZUl0ZW0oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgaWYgKFhGQV9OZWVkR2VuZXJhdGVGb3JtKHBUZW1wbGF0ZUNoaWxkKSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwTmV3Q2hpbGQgPSBwVGVtcGxhdGVDaGlsZC0+Q2xvbmVUZW1wbGF0ZVRvRm9ybShUUlVFKTsNCisgICAgICAgIHBOZXdOb2RlLT5JbnNlcnRDaGlsZChwTmV3Q2hpbGQsIE5VTEwpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHBOZXdOb2RlOw0KK30NCitzdGF0aWMgQ1hGQV9Ob2RlKiBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUluc3RhbmNlTWFuYWdlcigNCisgICAgQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LA0KKyAgICBDWEZBX05vZGUqIHBGb3JtUGFyZW50LA0KKyAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUsDQorICAgIENYRkFfTm9kZUFycmF5JiBzdWJmb3Jtcykgew0KKyAgQ0ZYX1dpZGVTdHJpbmdDIHdzU3ViZm9ybU5hbWUgPSBwVGVtcGxhdGVOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NJbnN0TWdyTm9kZU5hbWUgPSBGWF9XU1RSQyhMIl8iKSArIHdzU3ViZm9ybU5hbWU7DQorICBGWF9EV09SRCBkd0luc3ROYW1lSGFzaCA9DQorICAgICAgRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NJbnN0TWdyTm9kZU5hbWUsIHdzSW5zdE1nck5vZGVOYW1lLkdldExlbmd0aCgpKTsNCisgIENYRkFfTm9kZSogcEV4aXN0aW5nTm9kZSA9IFhGQV9EYXRhTWVyZ2VfRmluZEZvcm1ET01JbnN0YW5jZSgNCisgICAgICBwRG9jdW1lbnQsIFhGQV9FTEVNRU5UX0luc3RhbmNlTWFuYWdlciwgZHdJbnN0TmFtZUhhc2gsIHBGb3JtUGFyZW50KTsNCisgIGlmIChwRXhpc3RpbmdOb2RlKSB7DQorICAgIEZYX0RXT1JEIGR3TmFtZUhhc2ggPSBwVGVtcGxhdGVOb2RlLT5HZXROYW1lSGFzaCgpOw0KKyAgICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPQ0KKyAgICAgICAgICAgICBwRXhpc3RpbmdOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgICAgIHBOb2RlOykgew0KKyAgICAgIFhGQV9FTEVNRU5UIGVDdXJUeXBlID0gcE5vZGUtPkdldENsYXNzSUQoKTsNCisgICAgICBpZiAoZUN1clR5cGUgPT0gWEZBX0VMRU1FTlRfSW5zdGFuY2VNYW5hZ2VyKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgaWYgKChlQ3VyVHlwZSAhPSBYRkFfRUxFTUVOVF9TdWJmb3JtKSAmJg0KKyAgICAgICAgICAoZUN1clR5cGUgIT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldCkpIHsNCisgICAgICAgIHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgaWYgKGR3TmFtZUhhc2ggIT0gcE5vZGUtPkdldE5hbWVIYXNoKCkpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBDWEZBX05vZGUqIHBOZXh0Tm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgIHBGb3JtUGFyZW50LT5SZW1vdmVDaGlsZChwTm9kZSk7DQorICAgICAgc3ViZm9ybXMuQWRkKHBOb2RlKTsNCisgICAgICBwTm9kZSA9IHBOZXh0Tm9kZTsNCisgICAgfQ0KKyAgICBwRm9ybVBhcmVudC0+UmVtb3ZlQ2hpbGQocEV4aXN0aW5nTm9kZSk7DQorICAgIHBGb3JtUGFyZW50LT5JbnNlcnRDaGlsZChwRXhpc3RpbmdOb2RlKTsNCisgICAgcEV4aXN0aW5nTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSwgRkFMU0UpOw0KKyAgICBwRXhpc3RpbmdOb2RlLT5TZXRUZW1wbGF0ZU5vZGUocFRlbXBsYXRlTm9kZSk7DQorICAgIHJldHVybiBwRXhpc3RpbmdOb2RlOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTmV3Tm9kZSA9IHBEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldEZhY3RvcnkoKS0+Q3JlYXRlTm9kZSgNCisgICAgICBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9FTEVNRU5UX0luc3RhbmNlTWFuYWdlcik7DQorICBGWFNZU19hc3NlcnQocE5ld05vZGUpOw0KKyAgd3NJbnN0TWdyTm9kZU5hbWUgPQ0KKyAgICAgIEZYX1dTVFJDKEwiXyIpICsgcFRlbXBsYXRlTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKTsNCisgIHBOZXdOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzSW5zdE1nck5vZGVOYW1lKTsNCisgIHBGb3JtUGFyZW50LT5JbnNlcnRDaGlsZChwTmV3Tm9kZSwgTlVMTCk7DQorICBwTmV3Tm9kZS0+U2V0VGVtcGxhdGVOb2RlKHBUZW1wbGF0ZU5vZGUpOw0KKyAgcmV0dXJuIHBOZXdOb2RlOw0KK30NCitzdGF0aWMgQ1hGQV9Ob2RlKiBYRkFfRGF0YU1lcmdlX0ZpbmRNYXRjaGluZ0RhdGFOb2RlKA0KKyAgICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsDQorICAgIENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSwNCisgICAgQ1hGQV9Ob2RlKiBwRGF0YVNjb3BlLA0KKyAgICBGWF9CT09MJiBiQWNjZXNzZWREYXRhRE9NLA0KKyAgICBGWF9CT09MIGJGb3JjZUJpbmQsDQorICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFDb250YWluZXJOb2RlPioNCisgICAgICAgIHBJdGVyYXRvciwNCisgICAgRlhfQk9PTCYgYlNlbGZNYXRjaCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU0mIGVCaW5kTWF0Y2gsDQorICAgIEZYX0JPT0wgYlVwTGV2ZWwgPSBUUlVFKSB7DQorICBGWF9CT09MIGJPd25JdGVyYXRvciA9IEZBTFNFOw0KKyAgaWYgKCFwSXRlcmF0b3IpIHsNCisgICAgYk93bkl0ZXJhdG9yID0gVFJVRTsNCisgICAgcEl0ZXJhdG9yID0gbmV3IENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8DQorICAgICAgICBDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFDb250YWluZXJOb2RlPihwVGVtcGxhdGVOb2RlKTsNCisgIH0NCisgIENYRkFfTm9kZSogcFJlc3VsdCA9IE5VTEw7DQorICBmb3IgKENYRkFfTm9kZSogcEN1clRlbXBsYXRlTm9kZSA9IHBJdGVyYXRvci0+R2V0Q3VycmVudCgpOw0KKyAgICAgICBwQ3VyVGVtcGxhdGVOb2RlOykgew0KKyAgICBYRkFfRUxFTUVOVCBlTWF0Y2hOb2RlVHlwZTsNCisgICAgc3dpdGNoIChwQ3VyVGVtcGxhdGVOb2RlLT5HZXRDbGFzc0lEKCkpIHsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX1N1YmZvcm06DQorICAgICAgICBlTWF0Y2hOb2RlVHlwZSA9IFhGQV9FTEVNRU5UX0RhdGFHcm91cDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRmllbGQ6IHsNCisgICAgICAgIGVNYXRjaE5vZGVUeXBlID0gWEZBX0ZpZWxkSXNNdWx0aUxpc3RCb3gocEN1clRlbXBsYXRlTm9kZSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gWEZBX0VMRU1FTlRfRGF0YUdyb3VwDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFhGQV9FTEVNRU5UX0RhdGFWYWx1ZTsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRXhjbEdyb3VwOg0KKyAgICAgICAgZU1hdGNoTm9kZVR5cGUgPSBYRkFfRUxFTUVOVF9EYXRhVmFsdWU7DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgcEN1clRlbXBsYXRlTm9kZSA9IHBJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KKyAgICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlT2NjdXIgPQ0KKyAgICAgICAgcEN1clRlbXBsYXRlTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfT2NjdXIpOw0KKyAgICBpbnQzMl90IGlNaW4sIGlNYXgsIGlJbml0Ow0KKyAgICBpZiAocFRlbXBsYXRlTm9kZU9jY3VyICYmDQorICAgICAgICBYRkFfR2V0T2NjdXJJbmZvKHBUZW1wbGF0ZU5vZGVPY2N1ciwgaU1pbiwgaU1heCwgaUluaXQpICYmIGlNYXggPT0gMCkgew0KKyAgICAgIHBDdXJUZW1wbGF0ZU5vZGUgPSBwSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGVCaW5kID0NCisgICAgICAgIHBDdXJUZW1wbGF0ZU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0JpbmQpOw0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlTWF0Y2ggPQ0KKyAgICAgICAgcFRlbXBsYXRlTm9kZUJpbmQgPyBwVGVtcGxhdGVOb2RlQmluZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX01hdGNoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBYRkFfQVRUUklCVVRFRU5VTV9PbmNlOw0KKyAgICBlQmluZE1hdGNoID0gZU1hdGNoOw0KKyAgICBzd2l0Y2ggKGVNYXRjaCkgew0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTm9uZToNCisgICAgICAgIHBDdXJUZW1wbGF0ZU5vZGUgPSBwSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fR2xvYmFsOg0KKyAgICAgICAgYkFjY2Vzc2VkRGF0YURPTSA9IFRSVUU7DQorICAgICAgICBpZiAoIWJGb3JjZUJpbmQpIHsNCisgICAgICAgICAgcEN1clRlbXBsYXRlTm9kZSA9IHBJdGVyYXRvci0+TW92ZVRvTmV4dCgpOw0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChlTWF0Y2hOb2RlVHlwZSA9PSBYRkFfRUxFTUVOVF9EYXRhVmFsdWUgfHwNCisgICAgICAgICAgICAoZU1hdGNoTm9kZVR5cGUgPT0gWEZBX0VMRU1FTlRfRGF0YUdyb3VwICYmDQorICAgICAgICAgICAgIFhGQV9GaWVsZElzTXVsdGlMaXN0Qm94KHBUZW1wbGF0ZU5vZGVCaW5kKSkpIHsNCisgICAgICAgICAgQ1hGQV9Ob2RlKiBwR2xvYmFsQmluZE5vZGUgPSBYRkFfRGF0YU1lcmdlX0ZpbmRHbG9iYWxEYXRhTm9kZSgNCisgICAgICAgICAgICAgIHBEb2N1bWVudCwgcEN1clRlbXBsYXRlTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKSwNCisgICAgICAgICAgICAgIHBEYXRhU2NvcGUsIGVNYXRjaE5vZGVUeXBlKTsNCisgICAgICAgICAgaWYgKCFwR2xvYmFsQmluZE5vZGUpIHsNCisgICAgICAgICAgICBwQ3VyVGVtcGxhdGVOb2RlID0gcEl0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcFJlc3VsdCA9IHBHbG9iYWxCaW5kTm9kZTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9PbmNlOiB7DQorICAgICAgICBiQWNjZXNzZWREYXRhRE9NID0gVFJVRTsNCisgICAgICAgIENYRkFfTm9kZSogcE9uY2VCaW5kTm9kZSA9IFhGQV9EYXRhTWVyZ2VfRmluZE9uY2VEYXRhTm9kZSgNCisgICAgICAgICAgICBwRG9jdW1lbnQsIHBDdXJUZW1wbGF0ZU5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSksDQorICAgICAgICAgICAgcERhdGFTY29wZSwgZU1hdGNoTm9kZVR5cGUpOw0KKyAgICAgICAgaWYgKCFwT25jZUJpbmROb2RlKSB7DQorICAgICAgICAgIHBDdXJUZW1wbGF0ZU5vZGUgPSBwSXRlcmF0b3ItPk1vdmVUb05leHQoKTsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBwUmVzdWx0ID0gcE9uY2VCaW5kTm9kZTsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRGF0YVJlZjogew0KKyAgICAgICAgYkFjY2Vzc2VkRGF0YURPTSA9IFRSVUU7DQorICAgICAgICBDWEZBX05vZGUqIHBEYXRhUmVmQmluZE5vZGUgPSBYRkFfRGF0YU1lcmdlX0ZpbmREYXRhUmVmRGF0YU5vZGUoDQorICAgICAgICAgICAgcERvY3VtZW50LCBwVGVtcGxhdGVOb2RlQmluZC0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9SZWYpLA0KKyAgICAgICAgICAgIHBEYXRhU2NvcGUsIGVNYXRjaE5vZGVUeXBlLCBwVGVtcGxhdGVOb2RlLCBiRm9yY2VCaW5kLCBiVXBMZXZlbCk7DQorICAgICAgICBpZiAocERhdGFSZWZCaW5kTm9kZSAmJg0KKyAgICAgICAgICAgIHBEYXRhUmVmQmluZE5vZGUtPkdldENsYXNzSUQoKSA9PSBlTWF0Y2hOb2RlVHlwZSkgew0KKyAgICAgICAgICBwUmVzdWx0ID0gcERhdGFSZWZCaW5kTm9kZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICghcFJlc3VsdCkgew0KKyAgICAgICAgICBwQ3VyVGVtcGxhdGVOb2RlID0gcEl0ZXJhdG9yLT5Ta2lwQ2hpbGRyZW5BbmRNb3ZlVG9OZXh0KCk7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChwQ3VyVGVtcGxhdGVOb2RlID09IHBUZW1wbGF0ZU5vZGUgJiYgcFJlc3VsdCAhPSBOVUxMKSB7DQorICAgICAgYlNlbGZNYXRjaCA9IFRSVUU7DQorICAgIH0NCisgICAgYnJlYWs7DQorICB9DQorICBpZiAoYk93bkl0ZXJhdG9yKSB7DQorICAgIGRlbGV0ZSBwSXRlcmF0b3I7DQorICB9DQorICByZXR1cm4gcFJlc3VsdDsNCit9DQorc3RhdGljIHZvaWQgWEZBX0RhdGFNZXJnZV9Tb3J0UmVjdXJzZVJlY29yZCgNCisgICAgQ0ZYX0FycmF5VGVtcGxhdGU8WEZBX0RhdGFNZXJnZV9SZWN1cnNlUmVjb3JkPiYgcmdSZWNvcmRzLA0KKyAgICBDWEZBX05vZGUqIHBEYXRhU2NvcGUsDQorICAgIEZYX0JPT0wgYkNob2ljZU1vZGUgPSBGQUxTRSkgew0KKyAgaW50MzJfdCBpQ291bnQgPSByZ1JlY29yZHMuR2V0U2l6ZSgpOw0KKyAgQ0ZYX0FycmF5VGVtcGxhdGU8WEZBX0RhdGFNZXJnZV9SZWN1cnNlUmVjb3JkPiByZ1Jlc3VsdFJlY29yZDsNCisgIGZvciAoQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcERhdGFTY29wZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICBwQ2hpbGROb2RlOw0KKyAgICAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgIENYRkFfTm9kZSogcE5vZGUgPSByZ1JlY29yZHNbaV0ucERhdGFDaGlsZDsNCisgICAgICBpZiAocENoaWxkTm9kZSA9PSBwTm9kZSkgew0KKyAgICAgICAgWEZBX0RhdGFNZXJnZV9SZWN1cnNlUmVjb3JkIHNOZXdSZWNvcmQgPSB7cmdSZWNvcmRzW2ldLnBUZW1wbGF0ZUNoaWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGV9Ow0KKyAgICAgICAgcmdSZXN1bHRSZWNvcmQuQWRkKHNOZXdSZWNvcmQpOw0KKyAgICAgICAgcmdSZWNvcmRzLlJlbW92ZUF0KGkpOw0KKyAgICAgICAgaUNvdW50LS07DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGJDaG9pY2VNb2RlICYmIHJnUmVzdWx0UmVjb3JkLkdldFNpemUoKSA+IDApIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHJnUmVzdWx0UmVjb3JkLkdldFNpemUoKSA+IDApIHsNCisgICAgaWYgKCFiQ2hvaWNlTW9kZSkgew0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICAgICBYRkFfRGF0YU1lcmdlX1JlY3Vyc2VSZWNvcmQgc05ld1JlY29yZCA9IHtyZ1JlY29yZHNbaV0ucFRlbXBsYXRlQ2hpbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ1JlY29yZHNbaV0ucERhdGFDaGlsZH07DQorICAgICAgICByZ1Jlc3VsdFJlY29yZC5BZGQoc05ld1JlY29yZCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHJnUmVjb3Jkcy5SZW1vdmVBbGwoKTsNCisgICAgcmdSZWNvcmRzLkNvcHkocmdSZXN1bHRSZWNvcmQpOw0KKyAgfQ0KK30NCitzdGF0aWMgQ1hGQV9Ob2RlKiBYRkFfRGF0YU1lcmdlX0NvcHlDb250YWluZXJfU3ViZm9ybVNldCgNCisgICAgQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LA0KKyAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUsDQorICAgIENYRkFfTm9kZSogcEZvcm1QYXJlbnROb2RlLA0KKyAgICBDWEZBX05vZGUqIHBEYXRhU2NvcGUsDQorICAgIEZYX0JPT0wgYk9uZUluc3RhbmNlLA0KKyAgICBGWF9CT09MIGJEYXRhTWVyZ2UpIHsNCisgIFhGQV9FTEVNRU5UIGVFbGVtZW50ID0gcFRlbXBsYXRlTm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgQ1hGQV9Ob2RlKiBwT2NjdXJOb2RlID0gTlVMTDsNCisgIENYRkFfTm9kZSogcEZpcnN0SW5zdGFuY2UgPSBOVUxMOw0KKyAgRlhfQk9PTCBiVXNlSW5zdGFuY2VNYW5hZ2VyID0NCisgICAgICBwRm9ybVBhcmVudE5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9BcmVhOw0KKyAgQ1hGQV9Ob2RlKiBwSW5zdE1nck5vZGUgPSBOVUxMOw0KKyAgQ1hGQV9Ob2RlQXJyYXkgc3ViZm9ybUFycmF5Ow0KKyAgQ1hGQV9Ob2RlQXJyYXkqIHBTZWFyY2hBcnJheSA9IE5VTEw7DQorICBpZiAoIWJPbmVJbnN0YW5jZSAmJg0KKyAgICAgIChlRWxlbWVudCA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0IHx8IGVFbGVtZW50ID09IFhGQV9FTEVNRU5UX1N1YmZvcm0pKSB7DQorICAgIHBJbnN0TWdyTm9kZSA9DQorICAgICAgICBiVXNlSW5zdGFuY2VNYW5hZ2VyDQorICAgICAgICAgICAgPyBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUluc3RhbmNlTWFuYWdlcigNCisgICAgICAgICAgICAgICAgICBwRG9jdW1lbnQsIHBGb3JtUGFyZW50Tm9kZSwgcFRlbXBsYXRlTm9kZSwgc3ViZm9ybUFycmF5KQ0KKyAgICAgICAgICAgIDogTlVMTDsNCisgICAgaWYgKENYRkFfTm9kZSogcE9jY3VyVGVtcGxhdGVOb2RlID0NCisgICAgICAgICAgICBwVGVtcGxhdGVOb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9PY2N1cikpIHsNCisgICAgICBwT2NjdXJOb2RlID0gcEluc3RNZ3JOb2RlICE9IE5VTEwNCisgICAgICAgICAgICAgICAgICAgICAgID8gWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRG9jdW1lbnQsIHBJbnN0TWdyTm9kZSwgcE9jY3VyVGVtcGxhdGVOb2RlLCBGQUxTRSkNCisgICAgICAgICAgICAgICAgICAgICAgIDogcE9jY3VyVGVtcGxhdGVOb2RlOw0KKyAgICB9IGVsc2UgaWYgKHBJbnN0TWdyTm9kZSkgew0KKyAgICAgIHBPY2N1ck5vZGUgPSBwSW5zdE1nck5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX09jY3VyKTsNCisgICAgICBpZiAocE9jY3VyTm9kZSkgew0KKyAgICAgICAgcE9jY3VyTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSwgRkFMU0UpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAocEluc3RNZ3JOb2RlKSB7DQorICAgICAgcEluc3RNZ3JOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCk7DQorICAgICAgcFNlYXJjaEFycmF5ID0gJnN1YmZvcm1BcnJheTsNCisgICAgICBpZiAocEZvcm1QYXJlbnROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCisgICAgICAgIGJPbmVJbnN0YW5jZSA9IFRSVUU7DQorICAgICAgICBpZiAoc3ViZm9ybUFycmF5LkdldFNpemUoKSA8IDEpIHsNCisgICAgICAgICAgcFNlYXJjaEFycmF5ID0gTlVMTDsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2UgaWYgKChwVGVtcGxhdGVOb2RlLT5HZXROYW1lSGFzaCgpID09IDApICYmDQorICAgICAgICAgICAgICAgICAoc3ViZm9ybUFycmF5LkdldFNpemUoKSA8IDEpKSB7DQorICAgICAgICBwU2VhcmNoQXJyYXkgPSBOVUxMOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBpTWF4ID0gMSwgaUluaXQgPSAxLCBpTWluID0gMTsNCisgIGlmICghYk9uZUluc3RhbmNlKSB7DQorICAgIFhGQV9HZXRPY2N1ckluZm8ocE9jY3VyTm9kZSwgaU1pbiwgaU1heCwgaUluaXQpOw0KKyAgfQ0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZVJlbGF0aW9uID0NCisgICAgICBlRWxlbWVudCA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0DQorICAgICAgICAgID8gcFRlbXBsYXRlTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1JlbGF0aW9uKQ0KKyAgICAgICAgICA6IFhGQV9BVFRSSUJVVEVFTlVNX09yZGVyZWQ7DQorICBpbnQzMl90IGlDdXJSZXBlYXRJbmRleCA9IDA7DQorICBYRkFfQVRUUklCVVRFRU5VTSBlUGFyZW50QmluZE1hdGNoID0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsNCisgIGlmIChiRGF0YU1lcmdlKSB7DQorICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBQ29udGFpbmVyTm9kZT4NCisgICAgICAgIHNOb2RlSXRlcmF0b3IocFRlbXBsYXRlTm9kZSk7DQorICAgIEZYX0JPT0wgYkFjY2Vzc2VkRGF0YURPTSA9IEZBTFNFOw0KKyAgICBpZiAoZUVsZW1lbnQgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldCB8fCBlRWxlbWVudCA9PSBYRkFfRUxFTUVOVF9BcmVhKSB7DQorICAgICAgc05vZGVJdGVyYXRvci5Nb3ZlVG9OZXh0KCk7DQorICAgIH0gZWxzZSB7DQorICAgICAgQ0ZYX01hcFB0clRlbXBsYXRlPENYRkFfTm9kZSosIENYRkFfTm9kZSo+IHN1YmZvcm1NYXBBcnJheTsNCisgICAgICBDWEZBX05vZGVBcnJheSBzdWJmb3JtQXJyYXk7DQorICAgICAgZm9yICg7IGlNYXggPCAwIHx8IGlDdXJSZXBlYXRJbmRleCA8IGlNYXg7IGlDdXJSZXBlYXRJbmRleCsrKSB7DQorICAgICAgICBGWF9CT09MIGJTZWxmTWF0Y2ggPSBGQUxTRTsNCisgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVCaW5kTWF0Y2ggPSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOw0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwRGF0YU5vZGUgPSBYRkFfRGF0YU1lcmdlX0ZpbmRNYXRjaGluZ0RhdGFOb2RlKA0KKyAgICAgICAgICAgIHBEb2N1bWVudCwgcFRlbXBsYXRlTm9kZSwgcERhdGFTY29wZSwgYkFjY2Vzc2VkRGF0YURPTSwgRkFMU0UsDQorICAgICAgICAgICAgJnNOb2RlSXRlcmF0b3IsIGJTZWxmTWF0Y2gsIGVCaW5kTWF0Y2gpOw0KKyAgICAgICAgaWYgKCFwRGF0YU5vZGUgfHwgc05vZGVJdGVyYXRvci5HZXRDdXJyZW50KCkgIT0gcFRlbXBsYXRlTm9kZSkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGVQYXJlbnRCaW5kTWF0Y2ggPSBlQmluZE1hdGNoOw0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwU3ViZm9ybU5vZGUgPSBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcigNCisgICAgICAgICAgICBwRG9jdW1lbnQsIHBGb3JtUGFyZW50Tm9kZSwgcFRlbXBsYXRlTm9kZSwgRkFMU0UsIHBTZWFyY2hBcnJheSk7DQorICAgICAgICBpZiAoIXBGaXJzdEluc3RhbmNlKSB7DQorICAgICAgICAgIHBGaXJzdEluc3RhbmNlID0gcFN1YmZvcm1Ob2RlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgWEZBX0RhdGFNZXJnZV9DcmVhdGVEYXRhQmluZGluZyhwU3ViZm9ybU5vZGUsIHBEYXRhTm9kZSk7DQorICAgICAgICBGWFNZU19hc3NlcnQocFN1YmZvcm1Ob2RlKTsNCisgICAgICAgIHN1YmZvcm1NYXBBcnJheS5TZXRBdChwU3ViZm9ybU5vZGUsIHBEYXRhTm9kZSk7DQorICAgICAgICBzdWJmb3JtQXJyYXkuQWRkKHBTdWJmb3JtTm9kZSk7DQorICAgICAgfQ0KKyAgICAgIHN1YmZvcm1NYXBBcnJheS5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgICAgZm9yIChpbnQzMl90IGlJbmRleCA9IDA7IGlJbmRleCA8IHN1YmZvcm1BcnJheS5HZXRTaXplKCk7IGlJbmRleCsrKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBTdWJmb3JtID0gc3ViZm9ybUFycmF5W2lJbmRleF07DQorICAgICAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IChDWEZBX05vZGUqKXN1YmZvcm1NYXBBcnJheS5HZXRWYWx1ZUF0KHBTdWJmb3JtKTsNCisgICAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVDaGlsZCA9DQorICAgICAgICAgICAgICAgICBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkOyBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5HZXROb2RlSXRlbSgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICAgIGlmIChYRkFfTmVlZEdlbmVyYXRlRm9ybShwVGVtcGxhdGVDaGlsZCwgYlVzZUluc3RhbmNlTWFuYWdlcikpIHsNCisgICAgICAgICAgICBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcihwRG9jdW1lbnQsIHBTdWJmb3JtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkLCBUUlVFKTsNCisgICAgICAgICAgfSBlbHNlIGlmIChwVGVtcGxhdGVDaGlsZC0+R2V0T2JqZWN0VHlwZSgpID09DQorICAgICAgICAgICAgICAgICAgICAgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSkgew0KKyAgICAgICAgICAgIHBEb2N1bWVudC0+RGF0YU1lcmdlX0NvcHlDb250YWluZXIocFRlbXBsYXRlQ2hpbGQsIHBTdWJmb3JtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGFOb2RlLCBGQUxTRSwgVFJVRSwgRkFMU0UpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHN1YmZvcm1NYXBBcnJheS5SZW1vdmVBbGwoKTsNCisgICAgfQ0KKyAgICBmb3IgKDsgaU1heCA8IDAgfHwgaUN1clJlcGVhdEluZGV4IDwgaU1heDsgaUN1clJlcGVhdEluZGV4KyspIHsNCisgICAgICBGWF9CT09MIGJTZWxmTWF0Y2ggPSBGQUxTRTsNCisgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlQmluZE1hdGNoID0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsNCisgICAgICBpZiAoIVhGQV9EYXRhTWVyZ2VfRmluZE1hdGNoaW5nRGF0YU5vZGUoDQorICAgICAgICAgICAgICBwRG9jdW1lbnQsIHBUZW1wbGF0ZU5vZGUsIHBEYXRhU2NvcGUsIGJBY2Nlc3NlZERhdGFET00sIEZBTFNFLA0KKyAgICAgICAgICAgICAgJnNOb2RlSXRlcmF0b3IsIGJTZWxmTWF0Y2gsIGVCaW5kTWF0Y2gpKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgaWYgKGVCaW5kTWF0Y2ggPT0gWEZBX0FUVFJJQlVURUVOVU1fRGF0YVJlZiAmJg0KKyAgICAgICAgICBlUGFyZW50QmluZE1hdGNoID09IFhGQV9BVFRSSUJVVEVFTlVNX0RhdGFSZWYpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBpZiAoZVJlbGF0aW9uID09IFhGQV9BVFRSSUJVVEVFTlVNX0Nob2ljZSB8fA0KKyAgICAgICAgICBlUmVsYXRpb24gPT0gWEZBX0FUVFJJQlVURUVOVU1fVW5vcmRlcmVkKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBTdWJmb3JtU2V0Tm9kZSA9IFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKA0KKyAgICAgICAgICAgIHBEb2N1bWVudCwgcEZvcm1QYXJlbnROb2RlLCBwVGVtcGxhdGVOb2RlLCBGQUxTRSwgcFNlYXJjaEFycmF5KTsNCisgICAgICAgIEZYU1lTX2Fzc2VydChwU3ViZm9ybVNldE5vZGUpOw0KKyAgICAgICAgaWYgKCFwRmlyc3RJbnN0YW5jZSkgew0KKyAgICAgICAgICBwRmlyc3RJbnN0YW5jZSA9IHBTdWJmb3JtU2V0Tm9kZTsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9BcnJheVRlbXBsYXRlPFhGQV9EYXRhTWVyZ2VfUmVjdXJzZVJlY29yZD4gcmdJdGVtTWF0Y2hMaXN0Ow0KKyAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9Ob2RlKj4gcmdJdGVtVW5tYXRjaExpc3Q7DQorICAgICAgICBmb3IgKENYRkFfTm9kZSogcFRlbXBsYXRlQ2hpbGQgPQ0KKyAgICAgICAgICAgICAgICAgcFRlbXBsYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICAgICAgICBwVGVtcGxhdGVDaGlsZDsgcFRlbXBsYXRlQ2hpbGQgPSBwVGVtcGxhdGVDaGlsZC0+R2V0Tm9kZUl0ZW0oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgICBpZiAoWEZBX05lZWRHZW5lcmF0ZUZvcm0ocFRlbXBsYXRlQ2hpbGQsIGJVc2VJbnN0YW5jZU1hbmFnZXIpKSB7DQorICAgICAgICAgICAgWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIocERvY3VtZW50LCBwU3ViZm9ybVNldE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBsYXRlQ2hpbGQsIFRSVUUpOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHBUZW1wbGF0ZUNoaWxkLT5HZXRPYmplY3RUeXBlKCkgPT0NCisgICAgICAgICAgICAgICAgICAgICBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKSB7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRGF0YU1hdGNoOw0KKyAgICAgICAgICAgIGJTZWxmTWF0Y2ggPSBGQUxTRTsNCisgICAgICAgICAgICBlQmluZE1hdGNoID0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsNCisgICAgICAgICAgICBpZiAoZVJlbGF0aW9uICE9IFhGQV9BVFRSSUJVVEVFTlVNX09yZGVyZWQgJiYNCisgICAgICAgICAgICAgICAgKHBEYXRhTWF0Y2ggPSBYRkFfRGF0YU1lcmdlX0ZpbmRNYXRjaGluZ0RhdGFOb2RlKA0KKyAgICAgICAgICAgICAgICAgICAgIHBEb2N1bWVudCwgcFRlbXBsYXRlQ2hpbGQsIHBEYXRhU2NvcGUsIGJBY2Nlc3NlZERhdGFET00sDQorICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIE5VTEwsIGJTZWxmTWF0Y2gsIGVCaW5kTWF0Y2gpKSkgew0KKyAgICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9SZWN1cnNlUmVjb3JkIHNOZXdSZWNvcmQgPSB7cFRlbXBsYXRlQ2hpbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YU1hdGNofTsNCisgICAgICAgICAgICAgIGlmIChiU2VsZk1hdGNoKSB7DQorICAgICAgICAgICAgICAgIHJnSXRlbU1hdGNoTGlzdC5JbnNlcnRBdCgwLCBzTmV3UmVjb3JkKTsNCisgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHJnSXRlbU1hdGNoTGlzdC5BZGQoc05ld1JlY29yZCk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHJnSXRlbVVubWF0Y2hMaXN0LkFkZChwVGVtcGxhdGVDaGlsZCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBzd2l0Y2ggKGVSZWxhdGlvbikgew0KKyAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0Nob2ljZTogew0KKyAgICAgICAgICAgIEZYU1lTX2Fzc2VydChyZ0l0ZW1NYXRjaExpc3QuR2V0U2l6ZSgpKTsNCisgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX1NvcnRSZWN1cnNlUmVjb3JkKHJnSXRlbU1hdGNoTGlzdCwgcERhdGFTY29wZSwgVFJVRSk7DQorICAgICAgICAgICAgcERvY3VtZW50LT5EYXRhTWVyZ2VfQ29weUNvbnRhaW5lcigNCisgICAgICAgICAgICAgICAgcmdJdGVtTWF0Y2hMaXN0WzBdLnBUZW1wbGF0ZUNoaWxkLCBwU3ViZm9ybVNldE5vZGUsIHBEYXRhU2NvcGUpOw0KKyAgICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1Vub3JkZXJlZDogew0KKyAgICAgICAgICAgIGlmIChyZ0l0ZW1NYXRjaExpc3QuR2V0U2l6ZSgpKSB7DQorICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX1NvcnRSZWN1cnNlUmVjb3JkKHJnSXRlbU1hdGNoTGlzdCwgcERhdGFTY29wZSk7DQorICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDAsIGNvdW50ID0gcmdJdGVtTWF0Y2hMaXN0LkdldFNpemUoKTsgaSA8IGNvdW50Ow0KKyAgICAgICAgICAgICAgICAgICBpKyspIHsNCisgICAgICAgICAgICAgICAgcERvY3VtZW50LT5EYXRhTWVyZ2VfQ29weUNvbnRhaW5lcigNCisgICAgICAgICAgICAgICAgICAgIHJnSXRlbU1hdGNoTGlzdFtpXS5wVGVtcGxhdGVDaGlsZCwgcFN1YmZvcm1TZXROb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgcERhdGFTY29wZSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMCwgY291bnQgPSByZ0l0ZW1Vbm1hdGNoTGlzdC5HZXRTaXplKCk7IGkgPCBjb3VudDsNCisgICAgICAgICAgICAgICAgIGkrKykgew0KKyAgICAgICAgICAgICAgcERvY3VtZW50LT5EYXRhTWVyZ2VfQ29weUNvbnRhaW5lcihyZ0l0ZW1Vbm1hdGNoTGlzdFtpXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1YmZvcm1TZXROb2RlLCBwRGF0YVNjb3BlKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0gYnJlYWs7DQorICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfTm9kZSogcFN1YmZvcm1TZXROb2RlID0gWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIoDQorICAgICAgICAgICAgcERvY3VtZW50LCBwRm9ybVBhcmVudE5vZGUsIHBUZW1wbGF0ZU5vZGUsIEZBTFNFLCBwU2VhcmNoQXJyYXkpOw0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KHBTdWJmb3JtU2V0Tm9kZSk7DQorICAgICAgICBpZiAoIXBGaXJzdEluc3RhbmNlKSB7DQorICAgICAgICAgIHBGaXJzdEluc3RhbmNlID0gcFN1YmZvcm1TZXROb2RlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZm9yIChDWEZBX05vZGUqIHBUZW1wbGF0ZUNoaWxkID0NCisgICAgICAgICAgICAgICAgIHBUZW1wbGF0ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICAgICAgcFRlbXBsYXRlQ2hpbGQ7IHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlQ2hpbGQtPkdldE5vZGVJdGVtKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgICAgaWYgKFhGQV9OZWVkR2VuZXJhdGVGb3JtKHBUZW1wbGF0ZUNoaWxkLCBiVXNlSW5zdGFuY2VNYW5hZ2VyKSkgew0KKyAgICAgICAgICAgIFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKHBEb2N1bWVudCwgcFN1YmZvcm1TZXROb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkLCBUUlVFKTsNCisgICAgICAgICAgfSBlbHNlIGlmIChwVGVtcGxhdGVDaGlsZC0+R2V0T2JqZWN0VHlwZSgpID09DQorICAgICAgICAgICAgICAgICAgICAgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSkgew0KKyAgICAgICAgICAgIHBEb2N1bWVudC0+RGF0YU1lcmdlX0NvcHlDb250YWluZXIocFRlbXBsYXRlQ2hpbGQsIHBTdWJmb3JtU2V0Tm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhU2NvcGUpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChpQ3VyUmVwZWF0SW5kZXggPT0gMCAmJiBiQWNjZXNzZWREYXRhRE9NID09IEZBTFNFKSB7DQorICAgICAgaW50MzJfdCBpTGltaXQgPSBpTWF4Ow0KKyAgICAgIGlmIChwSW5zdE1nck5vZGUgJiYgcFRlbXBsYXRlTm9kZS0+R2V0TmFtZUhhc2goKSA9PSAwKSB7DQorICAgICAgICBpTGltaXQgPSBzdWJmb3JtQXJyYXkuR2V0U2l6ZSgpOw0KKyAgICAgICAgaWYgKGlMaW1pdCA8IGlNaW4pIHsNCisgICAgICAgICAgaUxpbWl0ID0gaUluaXQ7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGZvciAoOyAoaUxpbWl0IDwgMCB8fCBpQ3VyUmVwZWF0SW5kZXggPCBpTGltaXQpOyBpQ3VyUmVwZWF0SW5kZXgrKykgew0KKyAgICAgICAgaWYgKHBJbnN0TWdyTm9kZSkgew0KKyAgICAgICAgICBpZiAocFNlYXJjaEFycmF5ICYmIHBTZWFyY2hBcnJheS0+R2V0U2l6ZSgpIDwgMSkgew0KKyAgICAgICAgICAgIGlmIChwVGVtcGxhdGVOb2RlLT5HZXROYW1lSGFzaCgpICE9IDApIHsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwU2VhcmNoQXJyYXkgPSBOVUxMOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKCFYRkFfRGF0YU1lcmdlX0ZpbmRGb3JtRE9NSW5zdGFuY2UoDQorICAgICAgICAgICAgICAgICAgICAgICBwRG9jdW1lbnQsIHBUZW1wbGF0ZU5vZGUtPkdldENsYXNzSUQoKSwNCisgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wbGF0ZU5vZGUtPkdldE5hbWVIYXNoKCksIHBGb3JtUGFyZW50Tm9kZSkpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBDWEZBX05vZGUqIHBTdWJmb3JtTm9kZSA9IFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKA0KKyAgICAgICAgICAgIHBEb2N1bWVudCwgcEZvcm1QYXJlbnROb2RlLCBwVGVtcGxhdGVOb2RlLCBGQUxTRSwgcFNlYXJjaEFycmF5KTsNCisgICAgICAgIEZYU1lTX2Fzc2VydChwU3ViZm9ybU5vZGUpOw0KKyAgICAgICAgaWYgKCFwRmlyc3RJbnN0YW5jZSkgew0KKyAgICAgICAgICBwRmlyc3RJbnN0YW5jZSA9IHBTdWJmb3JtTm9kZTsNCisgICAgICAgIH0NCisgICAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVDaGlsZCA9DQorICAgICAgICAgICAgICAgICBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkOyBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5HZXROb2RlSXRlbSgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICAgIGlmIChYRkFfTmVlZEdlbmVyYXRlRm9ybShwVGVtcGxhdGVDaGlsZCwgYlVzZUluc3RhbmNlTWFuYWdlcikpIHsNCisgICAgICAgICAgICBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcihwRG9jdW1lbnQsIHBTdWJmb3JtTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcGxhdGVDaGlsZCwgVFJVRSk7DQorICAgICAgICAgIH0gZWxzZSBpZiAocFRlbXBsYXRlQ2hpbGQtPkdldE9iamVjdFR5cGUoKSA9PQ0KKyAgICAgICAgICAgICAgICAgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpIHsNCisgICAgICAgICAgICBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKHBUZW1wbGF0ZUNoaWxkLCBwU3ViZm9ybU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YVNjb3BlKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBpTWluaW1hbExpbWl0ID0gaUN1clJlcGVhdEluZGV4ID09IDAgPyBpSW5pdCA6IGlNaW47DQorICBmb3IgKDsgaUN1clJlcGVhdEluZGV4IDwgaU1pbmltYWxMaW1pdDsgaUN1clJlcGVhdEluZGV4KyspIHsNCisgICAgQ1hGQV9Ob2RlKiBwU3ViZm9ybVNldE5vZGUgPSBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcigNCisgICAgICAgIHBEb2N1bWVudCwgcEZvcm1QYXJlbnROb2RlLCBwVGVtcGxhdGVOb2RlLCBGQUxTRSwgcFNlYXJjaEFycmF5KTsNCisgICAgRlhTWVNfYXNzZXJ0KHBTdWJmb3JtU2V0Tm9kZSk7DQorICAgIGlmICghcEZpcnN0SW5zdGFuY2UpIHsNCisgICAgICBwRmlyc3RJbnN0YW5jZSA9IHBTdWJmb3JtU2V0Tm9kZTsNCisgICAgfQ0KKyAgICBGWF9CT09MIGJGb3VuZCA9IEZBTFNFOw0KKyAgICBmb3IgKENYRkFfTm9kZSogcFRlbXBsYXRlQ2hpbGQgPQ0KKyAgICAgICAgICAgICBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgcFRlbXBsYXRlQ2hpbGQ7IHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlQ2hpbGQtPkdldE5vZGVJdGVtKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgIGlmIChYRkFfTmVlZEdlbmVyYXRlRm9ybShwVGVtcGxhdGVDaGlsZCwgYlVzZUluc3RhbmNlTWFuYWdlcikpIHsNCisgICAgICAgIFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKHBEb2N1bWVudCwgcFN1YmZvcm1TZXROb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBsYXRlQ2hpbGQsIFRSVUUpOw0KKyAgICAgIH0gZWxzZSBpZiAocFRlbXBsYXRlQ2hpbGQtPkdldE9iamVjdFR5cGUoKSA9PQ0KKyAgICAgICAgICAgICAgICAgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSkgew0KKyAgICAgICAgaWYgKGJGb3VuZCAmJiBlUmVsYXRpb24gPT0gWEZBX0FUVFJJQlVURUVOVU1fQ2hvaWNlKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcERvY3VtZW50LT5EYXRhTWVyZ2VfQ29weUNvbnRhaW5lcihwVGVtcGxhdGVDaGlsZCwgcFN1YmZvcm1TZXROb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YVNjb3BlLCBGQUxTRSwgYkRhdGFNZXJnZSk7DQorICAgICAgICBiRm91bmQgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHBGaXJzdEluc3RhbmNlOw0KK30NCitzdGF0aWMgQ1hGQV9Ob2RlKiBYRkFfRGF0YU1lcmdlX0NvcHlDb250YWluZXJfRmllbGQoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEYXRhU2NvcGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRhdGFNZXJnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXBMZXZlbCA9IFRSVUUpIHsNCisgIENYRkFfTm9kZSogcEZpZWxkTm9kZSA9IFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKA0KKyAgICAgIHBEb2N1bWVudCwgcEZvcm1Ob2RlLCBwVGVtcGxhdGVOb2RlLCBGQUxTRSk7DQorICBGWFNZU19hc3NlcnQocEZpZWxkTm9kZSk7DQorICBmb3IgKENYRkFfTm9kZSogcFRlbXBsYXRlQ2hpbGROb2RlID0NCisgICAgICAgICAgIHBUZW1wbGF0ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgcFRlbXBsYXRlQ2hpbGROb2RlOyBwVGVtcGxhdGVDaGlsZE5vZGUgPSBwVGVtcGxhdGVDaGlsZE5vZGUtPkdldE5vZGVJdGVtKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIGlmIChYRkFfTmVlZEdlbmVyYXRlRm9ybShwVGVtcGxhdGVDaGlsZE5vZGUpKSB7DQorICAgICAgWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIocERvY3VtZW50LCBwRmllbGROb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkTm9kZSwgVFJVRSk7DQorICAgIH0gZWxzZSBpZiAocFRlbXBsYXRlTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cCAmJg0KKyAgICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkTm9kZS0+SXNDb250YWluZXJOb2RlKCkpIHsNCisgICAgICBpZiAocFRlbXBsYXRlQ2hpbGROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCisgICAgICAgIFhGQV9EYXRhTWVyZ2VfQ29weUNvbnRhaW5lcl9GaWVsZChwRG9jdW1lbnQsIHBUZW1wbGF0ZUNoaWxkTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRmllbGROb2RlLCBOVUxMLCBGQUxTRSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAoYkRhdGFNZXJnZSkgew0KKyAgICBGWF9CT09MIGJBY2Nlc3NlZERhdGFET00gPSBGQUxTRTsNCisgICAgRlhfQk9PTCBiU2VsZk1hdGNoID0gRkFMU0U7DQorICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVCaW5kTWF0Y2g7DQorICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gWEZBX0RhdGFNZXJnZV9GaW5kTWF0Y2hpbmdEYXRhTm9kZSgNCisgICAgICAgIHBEb2N1bWVudCwgcFRlbXBsYXRlTm9kZSwgcERhdGFTY29wZSwgYkFjY2Vzc2VkRGF0YURPTSwgVFJVRSwgTlVMTCwNCisgICAgICAgIGJTZWxmTWF0Y2gsIGVCaW5kTWF0Y2gsIGJVcExldmVsKTsNCisgICAgaWYgKHBEYXRhTm9kZSkgew0KKyAgICAgIFhGQV9EYXRhTWVyZ2VfQ3JlYXRlRGF0YUJpbmRpbmcocEZpZWxkTm9kZSwgcERhdGFOb2RlKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgWEZBX0RhdGFNZXJnZV9Gb3JtVmFsdWVOb2RlX01hdGNoTm9uZUNyZWF0ZUNoaWxkKHBGaWVsZE5vZGUpOw0KKyAgfQ0KKyAgcmV0dXJuIHBGaWVsZE5vZGU7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9Eb2N1bWVudDo6RGF0YU1lcmdlX0NvcHlDb250YWluZXIoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRm9ybU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEYXRhU2NvcGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJPbmVJbnN0YW5jZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRhdGFNZXJnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVwTGV2ZWwpIHsNCisgIHN3aXRjaCAocFRlbXBsYXRlTm9kZS0+R2V0Q2xhc3NJRCgpKSB7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfU3ViZm9ybVNldDoNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9TdWJmb3JtOg0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0FyZWE6DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfUGFnZUFyZWE6DQorICAgICAgcmV0dXJuIFhGQV9EYXRhTWVyZ2VfQ29weUNvbnRhaW5lcl9TdWJmb3JtU2V0KA0KKyAgICAgICAgICB0aGlzLCBwVGVtcGxhdGVOb2RlLCBwRm9ybU5vZGUsIHBEYXRhU2NvcGUsIGJPbmVJbnN0YW5jZSwgYkRhdGFNZXJnZSk7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfRXhjbEdyb3VwOg0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0ZpZWxkOg0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0RyYXc6DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfQ29udGVudEFyZWE6DQorICAgICAgcmV0dXJuIFhGQV9EYXRhTWVyZ2VfQ29weUNvbnRhaW5lcl9GaWVsZCgNCisgICAgICAgICAgdGhpcywgcFRlbXBsYXRlTm9kZSwgcEZvcm1Ob2RlLCBwRGF0YVNjb3BlLCBiRGF0YU1lcmdlLCBiVXBMZXZlbCk7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfUGFnZVNldDoNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9WYXJpYWJsZXM6DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCisgICAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCisjZGVmaW5lIFhGQV9EQVRBTUVSR0VfVVBEQVRFQklORElOR1JFTEFUSU9OU19ERlMNCisjaWZkZWYgWEZBX0RBVEFNRVJHRV9VUERBVEVCSU5ESU5HUkVMQVRJT05TX0RGUw0KK3N0YXRpYyB2b2lkIFhGQV9EYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucyhDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEYXRhU2NvcGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRhdGFSZWYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlBhcmVudERhdGFSZWYpIHsNCisgIEZYX0JPT0wgYk1hdGNoUmVmID0gVFJVRTsNCisgIFhGQV9FTEVNRU5UIGVDbGFzc0lEID0gcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCk7DQorICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IHBGb3JtTm9kZS0+R2V0QmluZERhdGEoKTsNCisgIGlmIChlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtIHx8IGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cCB8fA0KKyAgICAgIGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX0ZpZWxkKSB7DQorICAgIENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSA9IHBGb3JtTm9kZS0+R2V0VGVtcGxhdGVOb2RlKCk7DQorICAgIENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZUJpbmQgPQ0KKyAgICAgICAgcFRlbXBsYXRlTm9kZSA/IHBUZW1wbGF0ZU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0JpbmQpDQorICAgICAgICAgICAgICAgICAgICAgIDogTlVMTDsNCisgICAgWEZBX0FUVFJJQlVURUVOVU0gZU1hdGNoID0NCisgICAgICAgIHBUZW1wbGF0ZU5vZGVCaW5kID8gcFRlbXBsYXRlTm9kZUJpbmQtPkdldEVudW0oWEZBX0FUVFJJQlVURV9NYXRjaCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogWEZBX0FUVFJJQlVURUVOVU1fT25jZTsNCisgICAgc3dpdGNoIChlTWF0Y2gpIHsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX05vbmU6DQorICAgICAgICBpZiAoIWJEYXRhUmVmIHx8IGJQYXJlbnREYXRhUmVmKSB7DQorICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfRm9ybVZhbHVlTm9kZV9NYXRjaE5vbmVDcmVhdGVDaGlsZChwRm9ybU5vZGUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9PbmNlOg0KKyAgICAgICAgaWYgKCFiRGF0YVJlZiB8fCBiUGFyZW50RGF0YVJlZikgew0KKyAgICAgICAgICBpZiAoIXBEYXRhTm9kZSkgew0KKyAgICAgICAgICAgIGlmIChwRm9ybU5vZGUtPkdldE5hbWVIYXNoKCkgIT0gMCAmJg0KKyAgICAgICAgICAgICAgICBwRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9TY29wZSkgIT0NCisgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX05vbmUpIHsNCisgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVEYXRhTm9kZVR5cGUgPSAoZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSB8fA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRmllbGRJc011bHRpTGlzdEJveChwRm9ybU5vZGUpKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFhGQV9FTEVNRU5UX0RhdGFHcm91cA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFhGQV9FTEVNRU5UX0RhdGFWYWx1ZTsNCisgICAgICAgICAgICAgIHBEYXRhTm9kZSA9IFhGQV9EYXRhRGVzY3JpcHRpb25fTWF5YmVDcmVhdGVEYXRhTm9kZSgNCisgICAgICAgICAgICAgICAgICBwRG9jdW1lbnQsIHBEYXRhU2NvcGUsIGVEYXRhTm9kZVR5cGUsDQorICAgICAgICAgICAgICAgICAgcEZvcm1Ob2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpKTsNCisgICAgICAgICAgICAgIGlmIChwRGF0YU5vZGUpIHsNCisgICAgICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9DcmVhdGVEYXRhQmluZGluZyhwRm9ybU5vZGUsIHBEYXRhTm9kZSwgRkFMU0UpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoIXBEYXRhTm9kZSkgew0KKyAgICAgICAgICAgICAgWEZBX0RhdGFNZXJnZV9Gb3JtVmFsdWVOb2RlX01hdGNoTm9uZUNyZWF0ZUNoaWxkKHBGb3JtTm9kZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIENYRkFfTm9kZSogcERhdGFQYXJlbnQgPQ0KKyAgICAgICAgICAgICAgICBwRGF0YU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgICAgIGlmIChwRGF0YVBhcmVudCAhPSBwRGF0YVNjb3BlKSB7DQorICAgICAgICAgICAgICBGWFNZU19hc3NlcnQocERhdGFQYXJlbnQpOw0KKyAgICAgICAgICAgICAgcERhdGFQYXJlbnQtPlJlbW92ZUNoaWxkKHBEYXRhTm9kZSk7DQorICAgICAgICAgICAgICBwRGF0YVNjb3BlLT5JbnNlcnRDaGlsZChwRGF0YU5vZGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9HbG9iYWw6DQorICAgICAgICBpZiAoIWJEYXRhUmVmIHx8IGJQYXJlbnREYXRhUmVmKSB7DQorICAgICAgICAgIEZYX0RXT1JEIGR3TmFtZUhhc2ggPSBwRm9ybU5vZGUtPkdldE5hbWVIYXNoKCk7DQorICAgICAgICAgIGlmIChkd05hbWVIYXNoICE9IDAgJiYgIXBEYXRhTm9kZSkgew0KKyAgICAgICAgICAgIHBEYXRhTm9kZSA9IFhGQV9EYXRhTWVyZ2VfR2V0R2xvYmFsQmluZGluZyhwRG9jdW1lbnQsIGR3TmFtZUhhc2gpOw0KKyAgICAgICAgICAgIGlmICghcERhdGFOb2RlKSB7DQorICAgICAgICAgICAgICBYRkFfRUxFTUVOVCBlRGF0YU5vZGVUeXBlID0gKGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX1N1YmZvcm0gfHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZpZWxkSXNNdWx0aUxpc3RCb3gocEZvcm1Ob2RlKSkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBYRkFfRUxFTUVOVF9EYXRhR3JvdXANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBYRkFfRUxFTUVOVF9EYXRhVmFsdWU7DQorICAgICAgICAgICAgICBDWEZBX05vZGUqIHBSZWNvcmROb2RlID0NCisgICAgICAgICAgICAgICAgICAoQ1hGQV9Ob2RlKilwRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX1JlY29yZCk7DQorICAgICAgICAgICAgICBwRGF0YU5vZGUgPSBYRkFfRGF0YURlc2NyaXB0aW9uX01heWJlQ3JlYXRlRGF0YU5vZGUoDQorICAgICAgICAgICAgICAgICAgcERvY3VtZW50LCBwUmVjb3JkTm9kZSwgZURhdGFOb2RlVHlwZSwNCisgICAgICAgICAgICAgICAgICBwRm9ybU5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSkpOw0KKyAgICAgICAgICAgICAgaWYgKHBEYXRhTm9kZSkgew0KKyAgICAgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX0NyZWF0ZURhdGFCaW5kaW5nKHBGb3JtTm9kZSwgcERhdGFOb2RlLCBGQUxTRSk7DQorICAgICAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfUmVnaXN0ZXJHbG9iYWxCaW5kaW5nKA0KKyAgICAgICAgICAgICAgICAgICAgcERvY3VtZW50LCBwRm9ybU5vZGUtPkdldE5hbWVIYXNoKCksIHBEYXRhTm9kZSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfQ3JlYXRlRGF0YUJpbmRpbmcocEZvcm1Ob2RlLCBwRGF0YU5vZGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoIXBEYXRhTm9kZSkgew0KKyAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfRm9ybVZhbHVlTm9kZV9NYXRjaE5vbmVDcmVhdGVDaGlsZChwRm9ybU5vZGUpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0RhdGFSZWY6IHsNCisgICAgICAgIGJNYXRjaFJlZiA9IGJEYXRhUmVmOw0KKyAgICAgICAgYlBhcmVudERhdGFSZWYgPSBUUlVFOw0KKyAgICAgICAgaWYgKCFwRGF0YU5vZGUgJiYgYkRhdGFSZWYpIHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzUmVmID0NCisgICAgICAgICAgICAgIHBUZW1wbGF0ZU5vZGVCaW5kLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX1JlZik7DQorICAgICAgICAgIEZYX0RXT1JEIGRGbGFncyA9DQorICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfCBYRkFfUkVTT0xWRU5PREVfQ3JlYXRlTm9kZTsNCisgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJzOw0KKyAgICAgICAgICBwRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+UmVzb2x2ZU9iamVjdHMocERhdGFTY29wZSwgd3NSZWYsIHJzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZEZsYWdzLCBwVGVtcGxhdGVOb2RlKTsNCisgICAgICAgICAgQ1hGQV9PYmplY3QqIHBPYmplY3QgPSAocnMubm9kZXMuR2V0U2l6ZSgpID4gMCkgPyBycy5ub2Rlc1swXSA6IE5VTEw7DQorICAgICAgICAgIHBEYXRhTm9kZSA9DQorICAgICAgICAgICAgICAocE9iamVjdCAmJiBwT2JqZWN0LT5Jc05vZGUoKSkgPyAoQ1hGQV9Ob2RlKilwT2JqZWN0IDogTlVMTDsNCisgICAgICAgICAgaWYgKHBEYXRhTm9kZSkgew0KKyAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfQ3JlYXRlRGF0YUJpbmRpbmcoDQorICAgICAgICAgICAgICAgIHBGb3JtTm9kZSwgcERhdGFOb2RlLA0KKyAgICAgICAgICAgICAgICBycy5kd0ZsYWdzID09IFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9FeGlzdE5vZGVzKTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBYRkFfRGF0YU1lcmdlX0Zvcm1WYWx1ZU5vZGVfTWF0Y2hOb25lQ3JlYXRlQ2hpbGQocEZvcm1Ob2RlKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpZiAoYk1hdGNoUmVmICYmDQorICAgICAgKGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX1N1YmZvcm0gfHwgZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldCB8fA0KKyAgICAgICBlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9BcmVhIHx8IGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX1BhZ2VBcmVhIHx8DQorICAgICAgIGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX1BhZ2VTZXQpKSB7DQorICAgIGZvciAoQ1hGQV9Ob2RlKiBwRm9ybUNoaWxkID0NCisgICAgICAgICAgICAgcEZvcm1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgcEZvcm1DaGlsZDsNCisgICAgICAgICBwRm9ybUNoaWxkID0gcEZvcm1DaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgIGlmIChwRm9ybUNoaWxkLT5HZXRPYmplY3RUeXBlKCkgIT0gWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmIChwRm9ybUNoaWxkLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19VbnVzZWROb2RlKSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIFhGQV9EYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucyhwRG9jdW1lbnQsIHBGb3JtQ2hpbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhTm9kZSA/IHBEYXRhTm9kZSA6IHBEYXRhU2NvcGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEYXRhUmVmLCBiUGFyZW50RGF0YVJlZik7DQorICAgIH0NCisgIH0NCit9DQorI2Vsc2UNCitzdGF0aWMgdm9pZCBYRkFfRGF0YU1lcmdlX1VwZGF0ZUJpbmRpbmdSZWxhdGlvbnMoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LCBDWEZBX05vZGUqIHBGb3JtTm9kZSwgQ1hGQV9Ob2RlKiBwRGF0YVNjb3BlLCBDRlhfUHRyTGlzdCYgcmdGb3JtTm9kZUxpc3QsIENGWF9QdHJMaXN0JiByZ0RhdGFTY29wZUxpc3QsIEZYX0JPT0wgYkQgX0RFQlVHDQorI2lmZGVmIF9ERUJVRw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtU09NOyBDRlhfV2lkZVN0cmluZyB3c0RhdGFTY29wZVNPTTsNCisgICAgICAgIHBGb3JtTm9kZS0+R2V0U09NRXhwcmVzc2lvbih3c0Zvcm1TT00pOyBwRGF0YVNjb3BlLT5HZXRTT01FeHByZXNzaW9uKHdzRGF0YVNjb3BlU09NKTsNCisjZW5kaWYNCisgICAgICAgIFhGQV9FTEVNRU5UIGVDbGFzc0lEID0gcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCk7DQorICAgICAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IHBGb3JtTm9kZS0+R2V0QmluZERhdGEoKTsNCisgICAgICAgIGlmKGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX1N1YmZvcm0gfHwgZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwIHx8IGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX0ZpZWxkKQ0KK3sNCisgIENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSA9IHBGb3JtTm9kZS0+R2V0VGVtcGxhdGVOb2RlKCk7DQorICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGVCaW5kID0NCisgICAgICBwVGVtcGxhdGVOb2RlID8gcFRlbXBsYXRlTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfQmluZCkNCisgICAgICAgICAgICAgICAgICAgIDogTlVMTDsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVNYXRjaCA9DQorICAgICAgcFRlbXBsYXRlTm9kZUJpbmQgPyBwVGVtcGxhdGVOb2RlQmluZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX01hdGNoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIDogWEZBX0FUVFJJQlVURUVOVU1fT25jZTsNCisgIHN3aXRjaCAoZU1hdGNoKSB7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTm9uZToNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9PbmNlOiB7DQorICAgICAgaWYgKCFwRGF0YU5vZGUpIHsNCisgICAgICAgIGlmIChwRm9ybU5vZGUtPkdldE5hbWVIYXNoKCkgIT0gMCAmJg0KKyAgICAgICAgICAgIHBGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1Njb3BlKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lKSB7DQorICAgICAgICAgIFhGQV9FTEVNRU5UIGVEYXRhTm9kZVR5cGUgPSBlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBYRkFfRUxFTUVOVF9EYXRhR3JvdXANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFhGQV9FTEVNRU5UX0RhdGFWYWx1ZTsNCisgICAgICAgICAgcERhdGFOb2RlID0gWEZBX0RhdGFEZXNjcmlwdGlvbl9NYXliZUNyZWF0ZURhdGFOb2RlKA0KKyAgICAgICAgICAgICAgcERvY3VtZW50LCBwRGF0YVNjb3BlLCBlRGF0YU5vZGVUeXBlLA0KKyAgICAgICAgICAgICAgcEZvcm1Ob2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpKTsNCisgICAgICAgICAgaWYgKHBEYXRhTm9kZSkgew0KKyAgICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfQ3JlYXRlRGF0YUJpbmRpbmcocEZvcm1Ob2RlLCBwRGF0YU5vZGUsIEZBTFNFKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX05vZGUqIHBEYXRhUGFyZW50ID0gcERhdGFOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICAgIGlmIChwRGF0YVBhcmVudCAhPSBwRGF0YVNjb3BlKSB7DQorICAgICAgICAgIEZYU1lTX2Fzc2VydChwRGF0YVBhcmVudCk7DQorICAgICAgICAgIHBEYXRhUGFyZW50LT5SZW1vdmVDaGlsZChwRGF0YU5vZGUpOw0KKyAgICAgICAgICBwRGF0YVNjb3BlLT5JbnNlcnRDaGlsZChwRGF0YU5vZGUpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9HbG9iYWw6IHsNCisgICAgICBGWF9EV09SRCBkd05hbWVIYXNoID0gcEZvcm1Ob2RlLT5HZXROYW1lSGFzaCgpOw0KKyAgICAgIGlmIChkd05hbWVIYXNoICE9IDAgJiYgIXBEYXRhTm9kZSkgew0KKyAgICAgICAgcERhdGFOb2RlID0gWEZBX0RhdGFNZXJnZV9HZXRHbG9iYWxCaW5kaW5nKHBEb2N1bWVudCwgZHdOYW1lSGFzaCk7DQorICAgICAgICBpZiAoIXBEYXRhTm9kZSkgew0KKyAgICAgICAgICBYRkFfRUxFTUVOVCBlRGF0YU5vZGVUeXBlID0gZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gWEZBX0VMRU1FTlRfRGF0YUdyb3VwDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBYRkFfRUxFTUVOVF9EYXRhVmFsdWU7DQorICAgICAgICAgIENYRkFfTm9kZSogcFJlY29yZE5vZGUgPQ0KKyAgICAgICAgICAgICAgKENYRkFfTm9kZSopcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9SZWNvcmQpOw0KKyAgICAgICAgICBwRGF0YU5vZGUgPSBYRkFfRGF0YURlc2NyaXB0aW9uX01heWJlQ3JlYXRlRGF0YU5vZGUoDQorICAgICAgICAgICAgICBwRG9jdW1lbnQsIHBSZWNvcmROb2RlLCBlRGF0YU5vZGVUeXBlLA0KKyAgICAgICAgICAgICAgcEZvcm1Ob2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwRGF0YU5vZGUpIHsNCisgICAgICAgICAgWEZBX0RhdGFNZXJnZV9DcmVhdGVEYXRhQmluZGluZyhwRm9ybU5vZGUsIHBEYXRhTm9kZSwgRkFMU0UpOw0KKyAgICAgICAgICBYRkFfRGF0YU1lcmdlX1JlZ2lzdGVyR2xvYmFsQmluZGluZygNCisgICAgICAgICAgICAgIHBEb2N1bWVudCwgcEZvcm1Ob2RlLT5HZXROYW1lSGFzaCgpLCBwRGF0YU5vZGUpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9EYXRhUmVmOiB7DQorICAgICAgaWYgKCFwRGF0YU5vZGUpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c1JlZiA9IHBUZW1wbGF0ZU5vZGVCaW5kLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX1JlZik7DQorICAgICAgICBGWF9EV09SRCBkRmxhZ3MgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX0F0dHJpYnV0ZXMgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzIHwgWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfQ3JlYXRlTm9kZTsNCisgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByczsNCisgICAgICAgIHBEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5SZXNvbHZlT2JqZWN0cyhwRGF0YVNjb3BlLCB3c1JlZiwgcnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZEZsYWdzLCBwVGVtcGxhdGVOb2RlKTsNCisgICAgICAgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gKHJzLm5vZGVzLkdldFNpemUoKSA+IDApID8gcnMubm9kZXNbMF0gOiBOVUxMOw0KKyAgICAgICAgcERhdGFOb2RlID0gKHBPYmplY3QgJiYgcE9iamVjdC0+SXNOb2RlKCkpID8gKENYRkFfTm9kZSopcE9iamVjdCA6IE5VTEw7DQorICAgICAgICBpZiAocERhdGFOb2RlKSB7DQorICAgICAgICAgIFhGQV9EYXRhTWVyZ2VfQ3JlYXRlRGF0YUJpbmRpbmcocEZvcm1Ob2RlLCBwRGF0YU5vZGUsIEZBTFNFKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICB9DQorfQ0KK2lmKGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX1N1YmZvcm0gfHwgZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwIHx8IGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQgfHwgZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfQXJlYSB8fCBlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9QYWdlQXJlYSkNCit7DQorICBmb3IgKENYRkFfTm9kZSogcEZvcm1DaGlsZCA9IHBGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICBwRm9ybUNoaWxkOw0KKyAgICAgICBwRm9ybUNoaWxkID0gcEZvcm1DaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBpZiAocEZvcm1DaGlsZC0+R2V0T2JqZWN0VHlwZSgpICE9IFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAocEZvcm1DaGlsZC0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSkpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICByZ0Zvcm1Ob2RlTGlzdC5BZGRUYWlsKHBGb3JtQ2hpbGQpOw0KKyAgICByZ0RhdGFTY29wZUxpc3QuQWRkVGFpbChwRGF0YU5vZGUgPyBwRGF0YU5vZGUgOiBwRGF0YVNjb3BlKTsNCisgIH0NCit9DQorfQ0KKyNlbmRpZg0KK0NYRkFfTm9kZSogWEZBX0RhdGFNZXJnZV9GaW5kRGF0YVNjb3BlKENYRkFfTm9kZSogcFBhcmVudEZvcm1Ob2RlKSB7DQorICBmb3IgKENYRkFfTm9kZSogcFJvb3RCb3VuZE5vZGUgPSBwUGFyZW50Rm9ybU5vZGU7DQorICAgICAgIHBSb290Qm91bmROb2RlICYmDQorICAgICAgIHBSb290Qm91bmROb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZTsNCisgICAgICAgcFJvb3RCb3VuZE5vZGUgPSBwUm9vdEJvdW5kTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpIHsNCisgICAgQ1hGQV9Ob2RlKiBwRGF0YVNjb3BlID0gcFJvb3RCb3VuZE5vZGUtPkdldEJpbmREYXRhKCk7DQorICAgIGlmIChwRGF0YVNjb3BlKSB7DQorICAgICAgcmV0dXJuIHBEYXRhU2NvcGU7DQorICAgIH0NCisgIH0NCisgIHJldHVybiAoQ1hGQV9Ob2RlKilwUGFyZW50Rm9ybU5vZGUtPkdldERvY3VtZW50KCktPkdldFhGQU5vZGUoDQorICAgICAgWEZBX0hBU0hDT0RFX0RhdGEpOw0KK30NCit2b2lkIENYRkFfRG9jdW1lbnQ6OkRhdGFNZXJnZV9VcGRhdGVCaW5kaW5nUmVsYXRpb25zKA0KKyAgICBDWEZBX05vZGUqIHBGb3JtVXBkYXRlUm9vdCkgew0KKyAgQ1hGQV9Ob2RlKiBwRGF0YVNjb3BlID0gWEZBX0RhdGFNZXJnZV9GaW5kRGF0YVNjb3BlKA0KKyAgICAgIHBGb3JtVXBkYXRlUm9vdC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpOw0KKyAgaWYgKCFwRGF0YVNjb3BlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisjaWZkZWYgWEZBX0RBVEFNRVJHRV9VUERBVEVCSU5ESU5HUkVMQVRJT05TX0RGUw0KKyAgWEZBX0RhdGFNZXJnZV9VcGRhdGVCaW5kaW5nUmVsYXRpb25zKHRoaXMsIHBGb3JtVXBkYXRlUm9vdCwgcERhdGFTY29wZSwgRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOw0KKyAgWEZBX0RhdGFNZXJnZV9VcGRhdGVCaW5kaW5nUmVsYXRpb25zKHRoaXMsIHBGb3JtVXBkYXRlUm9vdCwgcERhdGFTY29wZSwgVFJVRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7DQorI2Vsc2UNCisgIENGWF9QdHJMaXN0IHJnRm9ybU5vZGVMaXN0LCByZ0RhdGFTY29wZUxpc3Q7DQorICByZ0Zvcm1Ob2RlTGlzdC5BZGRUYWlsKHBGb3JtVXBkYXRlUm9vdCk7DQorICByZ0RhdGFTY29wZUxpc3QuQWRkVGFpbChwRGF0YVNjb3BlKTsNCisgIHdoaWxlIChyZ0Zvcm1Ob2RlTGlzdC5HZXRDb3VudCgpKSB7DQorICAgIEZYX1BPU0lUSU9OIHBvczsNCisgICAgcG9zID0gcmdGb3JtTm9kZUxpc3QuR2V0SGVhZFBvc2l0aW9uKCk7DQorICAgIENYRkFfTm9kZSogcEN1ckZvcm1Ob2RlID0gKENYRkFfTm9kZSopcmdGb3JtTm9kZUxpc3QuR2V0QXQocG9zKTsNCisgICAgcmdGb3JtTm9kZUxpc3QuUmVtb3ZlQXQocG9zKTsNCisgICAgcG9zID0gcmdEYXRhU2NvcGVMaXN0LkdldEhlYWRQb3NpdGlvbigpOw0KKyAgICBDWEZBX05vZGUqIHBDdXJEYXRhU2NvcGUgPSAoQ1hGQV9Ob2RlKilyZ0RhdGFTY29wZUxpc3QuR2V0QXQocG9zKTsNCisgICAgcmdEYXRhU2NvcGVMaXN0LlJlbW92ZUF0KHBvcyk7DQorICAgIFhGQV9EYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucyh0aGlzLCBwQ3VyRm9ybU5vZGUsIHBDdXJEYXRhU2NvcGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ0Zvcm1Ob2RlTGlzdCwgcmdEYXRhU2NvcGVMaXN0KTsNCisgIH0NCisjZW5kaWYNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0RvY3VtZW50OjpHZXROb3RCaW5kTm9kZShDWEZBX09iakFycmF5JiBhcnJheU5vZGVzKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhcnJheU5vZGVzLkdldFNpemUoKTsgaSsrKSB7DQorICAgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gYXJyYXlOb2Rlc1tpXTsNCisgICAgaWYgKCFwT2JqZWN0LT5Jc05vZGUoKSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmICgoKENYRkFfTm9kZSopcE9iamVjdCktPkhhc0JpbmRJdGVtKCkpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICByZXR1cm4gKChDWEZBX05vZGUqKXBPYmplY3QpOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK3ZvaWQgQ1hGQV9Eb2N1bWVudDo6RG9EYXRhTWVyZ2UoKSB7DQorICBDWEZBX05vZGUqIHBEYXRhc2V0c1Jvb3QgPSAoQ1hGQV9Ob2RlKilHZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9EYXRhc2V0cyk7DQorICBpZiAoIXBEYXRhc2V0c1Jvb3QpIHsNCisgICAgSUZERV9YTUxFbGVtZW50KiBwRGF0YXNldHNYTUxOb2RlID0NCisgICAgICAgIElGREVfWE1MRWxlbWVudDo6Q3JlYXRlKEZYX1dTVFJDKEwieGZhOmRhdGFzZXRzIikpOw0KKyAgICBGWFNZU19hc3NlcnQocERhdGFzZXRzWE1MTm9kZSk7DQorICAgIHBEYXRhc2V0c1hNTE5vZGUtPlNldFN0cmluZygNCisgICAgICAgIEZYX1dTVFJDKEwieG1sbnM6eGZhIiksDQorICAgICAgICBGWF9XU1RSQyhMImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWRhdGEvMS4wLyIpKTsNCisgICAgcERhdGFzZXRzUm9vdCA9IENyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgWEZBX0VMRU1FTlRfRGF0YU1vZGVsKTsNCisgICAgcERhdGFzZXRzUm9vdC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCBGWF9XU1RSQyhMImRhdGFzZXRzIikpOw0KKyAgICBtX3BSb290Tm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKS0+SW5zZXJ0Q2hpbGROb2RlKHBEYXRhc2V0c1hNTE5vZGUpOw0KKyAgICBtX3BSb290Tm9kZS0+SW5zZXJ0Q2hpbGQocERhdGFzZXRzUm9vdCk7DQorICAgIHBEYXRhc2V0c1Jvb3QtPlNldFhNTE1hcHBpbmdOb2RlKHBEYXRhc2V0c1hNTE5vZGUpOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlICpwRGF0YVJvb3QgPSBOVUxMLCAqcEREUm9vdCA9IE5VTEw7DQorICBDRlhfV2lkZVN0cmluZyB3c0RhdGFzZXRzVVJJOw0KKyAgcERhdGFzZXRzUm9vdC0+VHJ5TmFtZXNwYWNlKHdzRGF0YXNldHNVUkkpOw0KKyAgZm9yIChDWEZBX05vZGUqIHBDaGlsZE5vZGUgPQ0KKyAgICAgICAgICAgcERhdGFzZXRzUm9vdC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICBwQ2hpbGROb2RlOw0KKyAgICAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBpZiAocENoaWxkTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0RhdGFHcm91cCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZXNwYWNlVVJJOw0KKyAgICBpZiAoIXBERFJvb3QgJiYgcENoaWxkTm9kZS0+R2V0TmFtZUhhc2goKSA9PSBYRkFfSEFTSENPREVfRGF0YURlc2NyaXB0aW9uKSB7DQorICAgICAgaWYgKCFwQ2hpbGROb2RlLT5UcnlOYW1lc3BhY2Uod3NOYW1lc3BhY2VVUkkpKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgaWYgKHdzTmFtZXNwYWNlVVJJID09DQorICAgICAgICAgIEZYX1dTVFJDKEwiaHR0cDovL25zLmFkb2JlLmNvbS9kYXRhLWRlc2NyaXB0aW9uLyIpKSB7DQorICAgICAgICBwRERSb290ID0gcENoaWxkTm9kZTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoIXBEYXRhUm9vdCAmJiBwQ2hpbGROb2RlLT5HZXROYW1lSGFzaCgpID09IFhGQV9IQVNIQ09ERV9EYXRhKSB7DQorICAgICAgaWYgKCFwQ2hpbGROb2RlLT5UcnlOYW1lc3BhY2Uod3NOYW1lc3BhY2VVUkkpKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgaWYgKHdzTmFtZXNwYWNlVVJJID09IHdzRGF0YXNldHNVUkkpIHsNCisgICAgICAgIHBEYXRhUm9vdCA9IHBDaGlsZE5vZGU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChwRGF0YVJvb3QgJiYgcEREUm9vdCkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpZiAoIXBEYXRhUm9vdCkgew0KKyAgICBJRkRFX1hNTEVsZW1lbnQqIHBEYXRhUm9vdFhNTE5vZGUgPQ0KKyAgICAgICAgSUZERV9YTUxFbGVtZW50OjpDcmVhdGUoRlhfV1NUUkMoTCJ4ZmE6ZGF0YSIpKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBEYXRhUm9vdFhNTE5vZGUpOw0KKyAgICBwRGF0YVJvb3QgPSBDcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsIFhGQV9FTEVNRU5UX0RhdGFHcm91cCk7DQorICAgIHBEYXRhUm9vdC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCBGWF9XU1RSQyhMImRhdGEiKSk7DQorICAgIHBEYXRhUm9vdC0+U2V0WE1MTWFwcGluZ05vZGUocERhdGFSb290WE1MTm9kZSk7DQorICAgIHBEYXRhc2V0c1Jvb3QtPkluc2VydENoaWxkKHBEYXRhUm9vdCk7DQorICB9DQorICBDWEZBX05vZGUqIHBEYXRhVG9wTGV2ZWwgPQ0KKyAgICAgIHBEYXRhUm9vdC0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfRGF0YUdyb3VwKTsNCisgIEZYX0RXT1JEIGR3TmFtZUhhc2ggPSBwRGF0YVRvcExldmVsID8gcERhdGFUb3BMZXZlbC0+R2V0TmFtZUhhc2goKSA6IDA7DQorICBDWEZBX05vZGUqIHBUZW1wbGF0ZVJvb3QgPQ0KKyAgICAgIG1fcFJvb3ROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9UZW1wbGF0ZSk7DQorICBpZiAoIXBUZW1wbGF0ZVJvb3QpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVDaG9zZW4gPQ0KKyAgICAgIGR3TmFtZUhhc2ggIT0gMCA/IHBUZW1wbGF0ZVJvb3QtPkdldEZpcnN0Q2hpbGRCeU5hbWUoZHdOYW1lSGFzaCkgOiBOVUxMOw0KKyAgaWYgKCFwVGVtcGxhdGVDaG9zZW4gfHwNCisgICAgICBwVGVtcGxhdGVDaG9zZW4tPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9TdWJmb3JtKSB7DQorICAgIHBUZW1wbGF0ZUNob3NlbiA9IHBUZW1wbGF0ZVJvb3QtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1N1YmZvcm0pOw0KKyAgfQ0KKyAgaWYgKCFwVGVtcGxhdGVDaG9zZW4pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwRm9ybVJvb3QgPSBtX3BSb290Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfRm9ybSk7DQorICBGWF9CT09MIGJFbXB0eUZvcm0gPSBGQUxTRTsNCisgIGlmICghcEZvcm1Sb290KSB7DQorICAgIGJFbXB0eUZvcm0gPSBUUlVFOw0KKyAgICBwRm9ybVJvb3QgPSBDcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX0VMRU1FTlRfRm9ybSk7DQorICAgIEZYU1lTX2Fzc2VydChwRm9ybVJvb3QpOw0KKyAgICBwRm9ybVJvb3QtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgRlhfV1NUUkMoTCJmb3JtIikpOw0KKyAgICBtX3BSb290Tm9kZS0+SW5zZXJ0Q2hpbGQocEZvcm1Sb290LCBOVUxMKTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBTm9kZT4NCisgICAgICAgIHNJdGVyYXRvcihwRm9ybVJvb3QpOw0KKyAgICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpOyBwTm9kZTsNCisgICAgICAgICBwTm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSk7DQorICAgIH0NCisgIH0NCisgIENYRkFfTm9kZSogcFN1YmZvcm1TZXROb2RlID0gWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIoDQorICAgICAgdGhpcywgcEZvcm1Sb290LCBwVGVtcGxhdGVDaG9zZW4sIEZBTFNFKTsNCisgIEZYU1lTX2Fzc2VydChwU3ViZm9ybVNldE5vZGUpOw0KKyAgaWYgKCFwRGF0YVRvcExldmVsKSB7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c0Zvcm1OYW1lID0gcFN1YmZvcm1TZXROb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGFUb3BMZXZlbE5hbWUgPQ0KKyAgICAgICAgd3NGb3JtTmFtZS5Jc0VtcHR5KCkgPyBGWF9XU1RSQyhMImZvcm0iKSA6IHdzRm9ybU5hbWU7DQorICAgIElGREVfWE1MRWxlbWVudCogcERhdGFUb3BMZXZlbFhNTE5vZGUgPQ0KKyAgICAgICAgSUZERV9YTUxFbGVtZW50OjpDcmVhdGUod3NEYXRhVG9wTGV2ZWxOYW1lKTsNCisgICAgRlhTWVNfYXNzZXJ0KHBEYXRhVG9wTGV2ZWxYTUxOb2RlKTsNCisgICAgcERhdGFUb3BMZXZlbCA9IENyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgWEZBX0VMRU1FTlRfRGF0YUdyb3VwKTsNCisgICAgcERhdGFUb3BMZXZlbC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c0RhdGFUb3BMZXZlbE5hbWUpOw0KKyAgICBwRGF0YVRvcExldmVsLT5TZXRYTUxNYXBwaW5nTm9kZShwRGF0YVRvcExldmVsWE1MTm9kZSk7DQorICAgIENYRkFfTm9kZSogcEJlZm9yZU5vZGUgPSBwRGF0YVJvb3QtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgcERhdGFSb290LT5JbnNlcnRDaGlsZChwRGF0YVRvcExldmVsLCBwQmVmb3JlTm9kZSk7DQorICB9DQorICBGWFNZU19hc3NlcnQocERhdGFUb3BMZXZlbCk7DQorICBYRkFfRGF0YU1lcmdlX0NyZWF0ZURhdGFCaW5kaW5nKHBTdWJmb3JtU2V0Tm9kZSwgcERhdGFUb3BMZXZlbCk7DQorICBmb3IgKENYRkFfTm9kZSogcFRlbXBsYXRlQ2hpbGQgPQ0KKyAgICAgICAgICAgcFRlbXBsYXRlQ2hvc2VuLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgIHBUZW1wbGF0ZUNoaWxkOw0KKyAgICAgICBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIGlmIChYRkFfTmVlZEdlbmVyYXRlRm9ybShwVGVtcGxhdGVDaGlsZCkpIHsNCisgICAgICBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcih0aGlzLCBwU3ViZm9ybVNldE5vZGUsIHBUZW1wbGF0ZUNoaWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpOw0KKyAgICB9IGVsc2UgaWYgKHBUZW1wbGF0ZUNoaWxkLT5HZXRPYmplY3RUeXBlKCkgPT0NCisgICAgICAgICAgICAgICBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKSB7DQorICAgICAgRGF0YU1lcmdlX0NvcHlDb250YWluZXIocFRlbXBsYXRlQ2hpbGQsIHBTdWJmb3JtU2V0Tm9kZSwgcERhdGFUb3BMZXZlbCk7DQorICAgIH0NCisgIH0NCisgIGlmIChwRERSb290KSB7DQorICAgIFhGQV9EYXRhRGVzY3JpcHRpb25fVXBkYXRlRGF0YVJlbGF0aW9uKHBEYXRhUm9vdCwgcEREUm9vdCk7DQorICB9DQorICBEYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucyhwU3ViZm9ybVNldE5vZGUpOw0KKyAgQ1hGQV9Ob2RlKiBwUGFnZVNldE5vZGUgPQ0KKyAgICAgIHBTdWJmb3JtU2V0Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfUGFnZVNldCk7DQorICB3aGlsZSAocFBhZ2VTZXROb2RlKSB7DQorICAgIG1fcFBlbmRpbmdQYWdlU2V0LkFkZChwUGFnZVNldE5vZGUpOw0KKyAgICBDWEZBX05vZGUqIHBOZXh0UGFnZVNldE5vZGUgPQ0KKyAgICAgICAgcFBhZ2VTZXROb2RlLT5HZXROZXh0U2FtZUNsYXNzU2libGluZyhYRkFfRUxFTUVOVF9QYWdlU2V0KTsNCisgICAgcFN1YmZvcm1TZXROb2RlLT5SZW1vdmVDaGlsZChwUGFnZVNldE5vZGUpOw0KKyAgICBwUGFnZVNldE5vZGUgPSBwTmV4dFBhZ2VTZXROb2RlOw0KKyAgfQ0KKyAgaWYgKCFiRW1wdHlGb3JtKSB7DQorICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBTm9kZT4NCisgICAgICAgIHNJdGVyYXRvcihwRm9ybVJvb3QpOw0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKTsNCisgICAgd2hpbGUgKHBOb2RlKSB7DQorICAgICAgaWYgKHBOb2RlLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19VbnVzZWROb2RlKSkgew0KKyAgICAgICAgaWYgKHBOb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSB8fA0KKyAgICAgICAgICAgIHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfSW5zdGFuY2VNYW5hZ2VyKSB7DQorICAgICAgICAgIENYRkFfTm9kZSogcE5leHQgPSBzSXRlcmF0b3IuU2tpcENoaWxkcmVuQW5kTW92ZVRvTmV4dCgpOw0KKyAgICAgICAgICBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCktPlJlbW92ZUNoaWxkKHBOb2RlKTsNCisgICAgICAgICAgcE5vZGUgPSBwTmV4dDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHBOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19VbnVzZWROb2RlLCBGQUxTRSk7DQorICAgICAgICAgIHBOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCk7DQorICAgICAgICAgIHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKTsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCisgICAgICAgIHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDWEZBX0RvY3VtZW50OjpEb0RhdGFSZW1lcmdlKEZYX0JPT0wgYkRvRGF0YU1lcmdlKSB7DQorICBDWEZBX05vZGUqIHBGb3JtUm9vdCA9IChDWEZBX05vZGUqKXRoaXMtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0Zvcm0pOw0KKyAgaWYgKHBGb3JtUm9vdCkgew0KKyAgICB3aGlsZSAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHBGb3JtUm9vdC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpKSB7DQorICAgICAgcEZvcm1Sb290LT5SZW1vdmVDaGlsZChwTm9kZSk7DQorICAgIH0NCisgICAgcEZvcm1Sb290LT5TZXRPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSwgTlVMTCk7DQorICB9DQorICBYRkFfRGF0YU1lcmdlX0NsZWFyR2xvYmFsQmluZGluZyh0aGlzKTsNCisgIGlmIChiRG9EYXRhTWVyZ2UpIHsNCisgICAgRG9EYXRhTWVyZ2UoKTsNCisgIH0NCisgIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvY2Vzc29yID0gR2V0TGF5b3V0UHJvY2Vzc29yKCk7DQorICBwTGF5b3V0UHJvY2Vzc29yLT5TZXRGb3JjZVJlTGF5b3V0KFRSVUUpOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfZGF0YW1lcmdlcl9pbXAuaCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9kYXRhbWVyZ2VyX2ltcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYTQxMjEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfZGF0YW1lcmdlcl9pbXAuaApAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1hGQV9ET0NVTUVOVF9EQVRBTUVSR0VSX0lNUF9IXw0KKyNkZWZpbmUgX1hGQV9ET0NVTUVOVF9EQVRBTUVSR0VSX0lNUF9IXw0KK0NYRkFfTm9kZSogWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIoDQorICAgIENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwNCisgICAgQ1hGQV9Ob2RlKiBwRm9ybVBhcmVudCwNCisgICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlLA0KKyAgICBGWF9CT09MIGJSZWN1cnNpdmUsDQorICAgIENYRkFfTm9kZUFycmF5KiBwU3ViZm9ybUFycmF5ID0gTlVMTCk7DQorQ1hGQV9Ob2RlKiBYRkFfRGF0YU1lcmdlX0ZpbmREYXRhU2NvcGUoQ1hGQV9Ob2RlKiBwUGFyZW50Rm9ybU5vZGUpOw0KK0NYRkFfTm9kZSogWEZBX0RhdGFNZXJnZV9GaW5kRm9ybURPTUluc3RhbmNlKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVCBlQ2xhc3NJRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd05hbWVIYXNoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEZvcm1QYXJlbnQpOw0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9pbXAuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2ltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUwNjdjZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9pbXAuY3BwCkBAIC0wLDAgKzEsNDQxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV91dGlscy5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfb2JqZWN0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2N1bWVudC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfcGFyc2VyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9zY3JpcHQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY2RhdGEuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY2xheW91dC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfbG9jYWxlbWdyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9mbTJqc2FwaS5oIg0KKyNpbmNsdWRlICJ4ZmFfYmFzaWNfaW1wLmgiDQorI2luY2x1ZGUgInhmYV9kb2N1bWVudF9sYXlvdXRfaW1wLmgiDQorI2luY2x1ZGUgInhmYV9zY3JpcHRfZGF0YXdpbmRvdy5oIg0KKyNpbmNsdWRlICJ4ZmFfc2NyaXB0X2V2ZW50cHNldWRvbW9kZWwuaCINCisjaW5jbHVkZSAieGZhX3NjcmlwdF9ob3N0cHNldWRvbW9kZWwuaCINCisjaW5jbHVkZSAieGZhX3NjcmlwdF9sb2dwc2V1ZG9tb2RlbC5oIg0KKyNpbmNsdWRlICJ4ZmFfc2NyaXB0X2xheW91dHBzZXVkb21vZGVsLmgiDQorI2luY2x1ZGUgInhmYV9zY3JpcHRfc2lnbmF0dXJlcHNldWRvbW9kZWwuaCINCitDWEZBX0RvY3VtZW50OjpDWEZBX0RvY3VtZW50KElYRkFfRG9jUGFyc2VyKiBwUGFyc2VyKQ0KKyAgICA6IG1fcFBhcnNlcihwUGFyc2VyKSwNCisgICAgICBtX3BTY3JpcHRDb250ZXh0KG51bGxwdHIpLA0KKyAgICAgIG1fcExheW91dFByb2Nlc3NvcihudWxscHRyKSwNCisgICAgICBtX3BSb290Tm9kZShudWxscHRyKSwNCisgICAgICBtX3BMb2NhbE1ncihudWxscHRyKSwNCisgICAgICBtX3BTY3JpcHREYXRhV2luZG93KG51bGxwdHIpLA0KKyAgICAgIG1fcFNjcmlwdEV2ZW50KG51bGxwdHIpLA0KKyAgICAgIG1fcFNjcmlwdEhvc3QobnVsbHB0ciksDQorICAgICAgbV9wU2NyaXB0TG9nKG51bGxwdHIpLA0KKyAgICAgIG1fcFNjcmlwdExheW91dChudWxscHRyKSwNCisgICAgICBtX3BTY3JpcHRTaWduYXR1cmUobnVsbHB0ciksDQorICAgICAgbV9lQ3VyVmVyc2lvbk1vZGUoWEZBX1ZFUlNJT05fREVGQVVMVCksDQorICAgICAgbV9kd0RvY0ZsYWdzKDApIHsNCisgIEFTU0VSVChtX3BQYXJzZXIpOw0KK30NCitDWEZBX0RvY3VtZW50Ojp+Q1hGQV9Eb2N1bWVudCgpIHsNCisgIGRlbGV0ZSBtX3BSb290Tm9kZTsNCisgIFB1cmdlTm9kZXMoKTsNCit9DQordm9pZCBDWEZBX0RvY3VtZW50OjpDbGVhckxheW91dERhdGEoKSB7DQorICBpZiAobV9wTGF5b3V0UHJvY2Vzc29yKSB7DQorICAgIGRlbGV0ZSBtX3BMYXlvdXRQcm9jZXNzb3I7DQorICAgIG1fcExheW91dFByb2Nlc3NvciA9IE5VTEw7DQorICB9DQorICBpZiAobV9wU2NyaXB0Q29udGV4dCkgew0KKyAgICBtX3BTY3JpcHRDb250ZXh0LT5SZWxlYXNlKCk7DQorICAgIG1fcFNjcmlwdENvbnRleHQgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcExvY2FsTWdyKSB7DQorICAgIGRlbGV0ZSBtX3BMb2NhbE1ncjsNCisgICAgbV9wTG9jYWxNZ3IgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcFNjcmlwdERhdGFXaW5kb3cpIHsNCisgICAgZGVsZXRlIG1fcFNjcmlwdERhdGFXaW5kb3c7DQorICAgIG1fcFNjcmlwdERhdGFXaW5kb3cgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcFNjcmlwdEV2ZW50KSB7DQorICAgIGRlbGV0ZSBtX3BTY3JpcHRFdmVudDsNCisgICAgbV9wU2NyaXB0RXZlbnQgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcFNjcmlwdEhvc3QpIHsNCisgICAgZGVsZXRlIG1fcFNjcmlwdEhvc3Q7DQorICAgIG1fcFNjcmlwdEhvc3QgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcFNjcmlwdExvZykgew0KKyAgICBkZWxldGUgbV9wU2NyaXB0TG9nOw0KKyAgICBtX3BTY3JpcHRMb2cgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcFNjcmlwdExheW91dCkgew0KKyAgICBkZWxldGUgbV9wU2NyaXB0TGF5b3V0Ow0KKyAgICBtX3BTY3JpcHRMYXlvdXQgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcFNjcmlwdFNpZ25hdHVyZSkgew0KKyAgICBkZWxldGUgbV9wU2NyaXB0U2lnbmF0dXJlOw0KKyAgICBtX3BTY3JpcHRTaWduYXR1cmUgPSBOVUxMOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfRG9jdW1lbnQ6OlNldFJvb3QoQ1hGQV9Ob2RlKiBwTmV3Um9vdCkgew0KKyAgaWYgKG1fcFJvb3ROb2RlKSB7DQorICAgIEFkZFB1cmdlTm9kZShtX3BSb290Tm9kZSk7DQorICB9DQorICBtX3BSb290Tm9kZSA9IHBOZXdSb290Ow0KKyAgUmVtb3ZlUHVyZ2VOb2RlKHBOZXdSb290KTsNCit9DQorSVhGQV9Ob3RpZnkqIENYRkFfRG9jdW1lbnQ6OkdldE5vdGlmeSgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BQYXJzZXItPkdldE5vdGlmeSgpOw0KK30NCitDWEZBX09iamVjdCogQ1hGQV9Eb2N1bWVudDo6R2V0WEZBTm9kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTm9kZU5hbWUpIHsNCisgIHJldHVybiBHZXRYRkFOb2RlKA0KKyAgICAgIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTm9kZU5hbWUuR2V0UHRyKCksIHdzTm9kZU5hbWUuR2V0TGVuZ3RoKCkpKTsNCit9DQorQ1hGQV9PYmplY3QqIENYRkFfRG9jdW1lbnQ6OkdldFhGQU5vZGUoRlhfRFdPUkQgZHdOb2RlTmFtZUhhc2gpIHsNCisgIHN3aXRjaCAoZHdOb2RlTmFtZUhhc2gpIHsNCisgICAgY2FzZSBYRkFfSEFTSENPREVfRGF0YTogew0KKyAgICAgIENYRkFfTm9kZSogcERhdGFzZXRzTm9kZSA9IChDWEZBX05vZGUqKUdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0RhdGFzZXRzKTsNCisgICAgICBpZiAoIXBEYXRhc2V0c05vZGUpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0NCisgICAgICBmb3IgKENYRkFfTm9kZSogcERhdGFzZXRzQ2hpbGQgPQ0KKyAgICAgICAgICAgICAgIHBEYXRhc2V0c05vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0RhdGFHcm91cCk7DQorICAgICAgICAgICBwRGF0YXNldHNDaGlsZDsNCisgICAgICAgICAgIHBEYXRhc2V0c0NoaWxkID0NCisgICAgICAgICAgICAgICBwRGF0YXNldHNDaGlsZC0+R2V0TmV4dFNhbWVDbGFzc1NpYmxpbmcoWEZBX0VMRU1FTlRfRGF0YUdyb3VwKSkgew0KKyAgICAgICAgaWYgKHBEYXRhc2V0c0NoaWxkLT5HZXROYW1lSGFzaCgpICE9IFhGQV9IQVNIQ09ERV9EYXRhKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lc3BhY2VVUkk7DQorICAgICAgICBpZiAoIXBEYXRhc2V0c0NoaWxkLT5UcnlOYW1lc3BhY2Uod3NOYW1lc3BhY2VVUkkpKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRhc2V0c1VSSTsNCisgICAgICAgIGlmICghcERhdGFzZXRzTm9kZS0+VHJ5TmFtZXNwYWNlKHdzRGF0YXNldHNVUkkpKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHdzTmFtZXNwYWNlVVJJID09IHdzRGF0YXNldHNVUkkpIHsNCisgICAgICAgICAgcmV0dXJuIHBEYXRhc2V0c0NoaWxkOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICBjYXNlIFhGQV9IQVNIQ09ERV9SZWNvcmQ6IHsNCisgICAgICBDWEZBX05vZGUqIHBEYXRhID0gKENYRkFfTm9kZSopR2V0WEZBTm9kZShYRkFfSEFTSENPREVfRGF0YSk7DQorICAgICAgcmV0dXJuIHBEYXRhID8gcERhdGEtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0RhdGFHcm91cCkgOiBOVUxMOw0KKyAgICB9DQorICAgIGNhc2UgWEZBX0hBU0hDT0RFX0RhdGFXaW5kb3c6IHsNCisgICAgICBpZiAobV9wU2NyaXB0RGF0YVdpbmRvdyA9PSBOVUxMKSB7DQorICAgICAgICBtX3BTY3JpcHREYXRhV2luZG93ID0gbmV3IENTY3JpcHRfRGF0YVdpbmRvdyh0aGlzKTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIG1fcFNjcmlwdERhdGFXaW5kb3c7DQorICAgIH0NCisgICAgY2FzZSBYRkFfSEFTSENPREVfRXZlbnQ6IHsNCisgICAgICBpZiAobV9wU2NyaXB0RXZlbnQgPT0gTlVMTCkgew0KKyAgICAgICAgbV9wU2NyaXB0RXZlbnQgPSBuZXcgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsKHRoaXMpOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gbV9wU2NyaXB0RXZlbnQ7DQorICAgIH0NCisgICAgY2FzZSBYRkFfSEFTSENPREVfSG9zdDogew0KKyAgICAgIGlmIChtX3BTY3JpcHRIb3N0ID09IE5VTEwpIHsNCisgICAgICAgIG1fcFNjcmlwdEhvc3QgPSBuZXcgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWwodGhpcyk7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBtX3BTY3JpcHRIb3N0Ow0KKyAgICB9DQorICAgIGNhc2UgWEZBX0hBU0hDT0RFX0xvZzogew0KKyAgICAgIGlmIChtX3BTY3JpcHRMb2cgPT0gTlVMTCkgew0KKyAgICAgICAgbV9wU2NyaXB0TG9nID0gbmV3IENTY3JpcHRfTG9nUHNldWRvTW9kZWwodGhpcyk7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBtX3BTY3JpcHRMb2c7DQorICAgIH0NCisgICAgY2FzZSBYRkFfSEFTSENPREVfU2lnbmF0dXJlOiB7DQorICAgICAgaWYgKG1fcFNjcmlwdFNpZ25hdHVyZSA9PSBOVUxMKSB7DQorICAgICAgICBtX3BTY3JpcHRTaWduYXR1cmUgPSBuZXcgQ1NjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbCh0aGlzKTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIG1fcFNjcmlwdFNpZ25hdHVyZTsNCisgICAgfQ0KKyAgICBjYXNlIFhGQV9IQVNIQ09ERV9MYXlvdXQ6IHsNCisgICAgICBpZiAobV9wU2NyaXB0TGF5b3V0ID09IE5VTEwpIHsNCisgICAgICAgIG1fcFNjcmlwdExheW91dCA9IG5ldyBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsKHRoaXMpOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gbV9wU2NyaXB0TGF5b3V0Ow0KKyAgICB9DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIG1fcFJvb3ROb2RlLT5HZXRGaXJzdENoaWxkQnlOYW1lKGR3Tm9kZU5hbWVIYXNoKTsNCisgIH0NCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0RvY3VtZW50OjpDcmVhdGVOb2RlKEZYX0RXT1JEIGR3UGFja2V0LCBYRkFfRUxFTUVOVCBlRWxlbWVudCkgew0KKyAgWEZBX0xQQ1BBQ0tFVElORk8gcFBhY2tldCA9IFhGQV9HZXRQYWNrZXRCeUlEKGR3UGFja2V0KTsNCisgIHJldHVybiBDcmVhdGVOb2RlKHBQYWNrZXQsIGVFbGVtZW50KTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0RvY3VtZW50OjpDcmVhdGVOb2RlKFhGQV9MUENQQUNLRVRJTkZPIHBQYWNrZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVFbGVtZW50KSB7DQorICBpZiAocFBhY2tldCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgWEZBX0xQQ0VMRU1FTlRJTkZPIHBFbGVtZW50ID0gWEZBX0dldEVsZW1lbnRCeUlEKGVFbGVtZW50KTsNCisgIGlmIChwRWxlbWVudCAmJiAocEVsZW1lbnQtPmR3UGFja2V0cyAmIHBQYWNrZXQtPmVOYW1lKSkgew0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gbmV3IENYRkFfTm9kZSh0aGlzLCBwUGFja2V0LT5lTmFtZSwgcEVsZW1lbnQtPmVOYW1lKTsNCisgICAgaWYgKHBOb2RlKSB7DQorICAgICAgQWRkUHVyZ2VOb2RlKHBOb2RlKTsNCisgICAgfQ0KKyAgICByZXR1cm4gcE5vZGU7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQordm9pZCBDWEZBX0RvY3VtZW50OjpBZGRQdXJnZU5vZGUoQ1hGQV9Ob2RlKiBwTm9kZSkgew0KKyAgbV9yZ1B1cmdlTm9kZXMuQWRkKHBOb2RlKTsNCit9DQorRlhfQk9PTCBDWEZBX0RvY3VtZW50OjpSZW1vdmVQdXJnZU5vZGUoQ1hGQV9Ob2RlKiBwTm9kZSkgew0KKyAgcmV0dXJuIG1fcmdQdXJnZU5vZGVzLlJlbW92ZUtleShwTm9kZSk7DQorfQ0KK3ZvaWQgQ1hGQV9Eb2N1bWVudDo6UHVyZ2VOb2RlcygpIHsNCisgIEZYX1BPU0lUSU9OIHBzTm9kZSA9IG1fcmdQdXJnZU5vZGVzLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgIHdoaWxlIChwc05vZGUpIHsNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZTsNCisgICAgbV9yZ1B1cmdlTm9kZXMuR2V0TmV4dEFzc29jKHBzTm9kZSwgcE5vZGUpOw0KKyAgICBkZWxldGUgcE5vZGU7DQorICB9DQorICBtX3JnUHVyZ2VOb2Rlcy5SZW1vdmVBbGwoKTsNCit9DQordm9pZCBDWEZBX0RvY3VtZW50OjpTZXRGbGFnKEZYX0RXT1JEIGR3RmxhZywgRlhfQk9PTCBiT24pIHsNCisgIGlmIChiT24pIHsNCisgICAgbV9kd0RvY0ZsYWdzIHw9IGR3RmxhZzsNCisgIH0gZWxzZSB7DQorICAgIG1fZHdEb2NGbGFncyAmPSB+ZHdGbGFnOw0KKyAgfQ0KK30NCitGWF9CT09MIENYRkFfRG9jdW1lbnQ6OklzSW50ZXJhY3RpdmUoKSB7DQorICBpZiAobV9kd0RvY0ZsYWdzICYgWEZBX0RPQ0ZMQUdfSGFzSW50ZXJhY3RpdmUpIHsNCisgICAgcmV0dXJuIG1fZHdEb2NGbGFncyAmIFhGQV9ET0NGTEFHX0ludGVyYWN0aXZlOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwQ29uZmlnID0gKENYRkFfTm9kZSopdGhpcy0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfQ29uZmlnKTsNCisgIGlmICghcENvbmZpZykgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0ludGVyYWN0aXZlOw0KKyAgQ1hGQV9Ob2RlKiBwUHJlc2VudCA9IHBDb25maWctPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1ByZXNlbnQpOw0KKyAgaWYgKCFwUHJlc2VudCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDWEZBX05vZGUqIHBQREYgPSBwUHJlc2VudC0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfUGRmKTsNCisgIGlmICghcFBERikgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDWEZBX05vZGUqIHBJbnRlcmFjdGl2ZSA9IHBQREYtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0ludGVyYWN0aXZlKTsNCisgIGlmIChwSW50ZXJhY3RpdmUpIHsNCisgICAgbV9kd0RvY0ZsYWdzIHw9IFhGQV9ET0NGTEFHX0hhc0ludGVyYWN0aXZlOw0KKyAgICBpZiAocEludGVyYWN0aXZlLT5UcnlDb250ZW50KHdzSW50ZXJhY3RpdmUpICYmDQorICAgICAgICB3c0ludGVyYWN0aXZlID09IEZYX1dTVFJDKEwiMSIpKSB7DQorICAgICAgbV9kd0RvY0ZsYWdzIHw9IFhGQV9ET0NGTEFHX0ludGVyYWN0aXZlOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0NYRkFfTG9jYWxlTWdyKiBDWEZBX0RvY3VtZW50OjpHZXRMb2NhbE1ncigpIHsNCisgIGlmICghbV9wTG9jYWxNZ3IpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMYW5ndWFnZTsNCisgICAgdGhpcy0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpLT5HZXRBcHBQcm92aWRlcigpLT5HZXRMYW5ndWFnZSh3c0xhbmd1YWdlKTsNCisgICAgbV9wTG9jYWxNZ3IgPSBuZXcgQ1hGQV9Mb2NhbGVNZ3IoDQorICAgICAgICAoQ1hGQV9Ob2RlKil0aGlzLT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Mb2NhbGVTZXQpLCB3c0xhbmd1YWdlKTsNCisgIH0NCisgIHJldHVybiBtX3BMb2NhbE1ncjsNCit9DQorSVhGQV9TY3JpcHRDb250ZXh0KiBDWEZBX0RvY3VtZW50OjpJbml0U2NyaXB0Q29udGV4dChGWEpTRV9IUlVOVElNRSBoUnVudGltZSkgew0KKyAgaWYgKCFtX3BTY3JpcHRDb250ZXh0KSB7DQorICAgIG1fcFNjcmlwdENvbnRleHQgPSBYRkFfU2NyaXB0Q29udGV4dF9DcmVhdGUodGhpcyk7DQorICB9DQorICBtX3BTY3JpcHRDb250ZXh0LT5Jbml0aWFsaXplKGhSdW50aW1lKTsNCisgIHJldHVybiBtX3BTY3JpcHRDb250ZXh0Ow0KK30NCitJWEZBX1NjcmlwdENvbnRleHQqIENYRkFfRG9jdW1lbnQ6OkdldFNjcmlwdENvbnRleHQoKSB7DQorICBpZiAoIW1fcFNjcmlwdENvbnRleHQpIHsNCisgICAgbV9wU2NyaXB0Q29udGV4dCA9IFhGQV9TY3JpcHRDb250ZXh0X0NyZWF0ZSh0aGlzKTsNCisgIH0NCisgIHJldHVybiBtX3BTY3JpcHRDb250ZXh0Ow0KK30NCitYRkFfVkVSU0lPTiBDWEZBX0RvY3VtZW50OjpSZWNvZ25pemVYRkFWZXJzaW9uTnVtYmVyKA0KKyAgICBDRlhfV2lkZVN0cmluZyYgd3NUZW1wbGF0ZU5TKSB7DQorICBDRlhfV2lkZVN0cmluZ0Mgd3NUZW1wbGF0ZVVSSVByZWZpeCA9DQorICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9UZW1wbGF0ZSktPnBVUkk7DQorICBGWF9TVFJTSVpFIG5QcmVmaXhMZW5ndGggPSB3c1RlbXBsYXRlVVJJUHJlZml4LkdldExlbmd0aCgpOw0KKyAgaWYgKENGWF9XaWRlU3RyaW5nQyh3c1RlbXBsYXRlTlMsIHdzVGVtcGxhdGVOUy5HZXRMZW5ndGgoKSkgIT0NCisgICAgICB3c1RlbXBsYXRlVVJJUHJlZml4KSB7DQorICAgIHJldHVybiBYRkFfVkVSU0lPTl9VTktOT1dOOw0KKyAgfQ0KKyAgRlhfU1RSU0laRSBuRG90UG9zID0gd3NUZW1wbGF0ZU5TLkZpbmQoJy4nLCBuUHJlZml4TGVuZ3RoKTsNCisgIGlmIChuRG90UG9zID09IChGWF9TVFJTSVpFKS0xKSB7DQorICAgIHJldHVybiBYRkFfVkVSU0lPTl9VTktOT1dOOw0KKyAgfQ0KKyAgaW50OF90IGlNYWpvciA9DQorICAgICAgRlhTWVNfd3RvaSh3c1RlbXBsYXRlTlMuTWlkKG5QcmVmaXhMZW5ndGgsIG5Eb3RQb3MgLSBuUHJlZml4TGVuZ3RoKSk7DQorICBpbnQ4X3QgaU1pbm9yID0gRlhTWVNfd3RvaSgNCisgICAgICB3c1RlbXBsYXRlTlMuTWlkKG5Eb3RQb3MgKyAxLCB3c1RlbXBsYXRlTlMuR2V0TGVuZ3RoKCkgLSBuRG90UG9zIC0gMikpOw0KKyAgWEZBX1ZFUlNJT04gZVZlcnNpb24gPSAoWEZBX1ZFUlNJT04pKChpbnQzMl90KWlNYWpvciAqIDEwMCArIGlNaW5vcik7DQorICBpZiAoZVZlcnNpb24gPCBYRkFfVkVSU0lPTl9NSU4gfHwgZVZlcnNpb24gPiBYRkFfVkVSU0lPTl9NQVgpIHsNCisgICAgcmV0dXJuIFhGQV9WRVJTSU9OX1VOS05PV047DQorICB9DQorICBtX2VDdXJWZXJzaW9uTW9kZSA9IGVWZXJzaW9uOw0KKyAgcmV0dXJuIGVWZXJzaW9uOw0KK30NCitDWEZBX05vZGUqIENYRkFfRG9jdW1lbnQ6OkdldE5vZGVCeUlEKENYRkFfTm9kZSogcFJvb3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzSUQpIHsNCisgIGlmICghcFJvb3QgfHwgd3NJRC5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDWEZBX05vZGVJdGVyYXRvciBzSXRlcmF0b3IocFJvb3QpOw0KKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcE5vZGU7DQorICAgICAgIHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICBDRlhfV2lkZVN0cmluZ0Mgd3NJRFZhbDsNCisgICAgaWYgKHBOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0lkLCB3c0lEVmFsKSAmJiAhd3NJRFZhbC5Jc0VtcHR5KCkpIHsNCisgICAgICBpZiAod3NJRFZhbCA9PSB3c0lEKSB7DQorICAgICAgICByZXR1cm4gcE5vZGU7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorc3RhdGljIHZvaWQgWEZBX1Byb3RvTWVyZ2VfTWVyZ2VOb2RlUmVjdXJzZShDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEZXN0Tm9kZVBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFByb3RvTm9kZSkgew0KKyAgQ1hGQV9Ob2RlKiBwRXhpc3RpbmdOb2RlID0gTlVMTDsNCisgIGZvciAoQ1hGQV9Ob2RlKiBwRm9ybUNoaWxkID0NCisgICAgICAgICAgIHBEZXN0Tm9kZVBhcmVudC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICBwRm9ybUNoaWxkOw0KKyAgICAgICBwRm9ybUNoaWxkID0gcEZvcm1DaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBpZiAocEZvcm1DaGlsZC0+R2V0Q2xhc3NJRCgpID09IHBQcm90b05vZGUtPkdldENsYXNzSUQoKSAmJg0KKyAgICAgICAgcEZvcm1DaGlsZC0+R2V0TmFtZUhhc2goKSA9PSBwUHJvdG9Ob2RlLT5HZXROYW1lSGFzaCgpICYmDQorICAgICAgICBwRm9ybUNoaWxkLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19VbnVzZWROb2RlKSkgew0KKyAgICAgIHBGb3JtQ2hpbGQtPlNldEZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUsIEZBTFNFKTsNCisgICAgICBwRXhpc3RpbmdOb2RlID0gcEZvcm1DaGlsZDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHBFeGlzdGluZ05vZGUpIHsNCisgICAgcEV4aXN0aW5nTm9kZS0+U2V0VGVtcGxhdGVOb2RlKHBQcm90b05vZGUpOw0KKyAgICBmb3IgKENYRkFfTm9kZSogcFRlbXBsYXRlQ2hpbGQgPQ0KKyAgICAgICAgICAgICBwUHJvdG9Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgcFRlbXBsYXRlQ2hpbGQ7IHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlQ2hpbGQtPkdldE5vZGVJdGVtKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgIFhGQV9Qcm90b01lcmdlX01lcmdlTm9kZVJlY3Vyc2UocERvY3VtZW50LCBwRXhpc3RpbmdOb2RlLCBwVGVtcGxhdGVDaGlsZCk7DQorICAgIH0NCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTmV3Tm9kZSA9IHBQcm90b05vZGUtPkNsb25lKFRSVUUpOw0KKyAgcE5ld05vZGUtPlNldFRlbXBsYXRlTm9kZShwUHJvdG9Ob2RlKTsNCisgIHBEZXN0Tm9kZVBhcmVudC0+SW5zZXJ0Q2hpbGQocE5ld05vZGUsIE5VTEwpOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfUHJvdG9NZXJnZV9NZXJnZU5vZGUoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEZXN0Tm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUHJvdG9Ob2RlKSB7DQorICB7DQorICAgIENYRkFfTm9kZUl0ZXJhdG9yIHNJdGVyYXRvcihwRGVzdE5vZGUpOw0KKyAgICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBzSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwTm9kZTsNCisgICAgICAgICBwTm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSk7DQorICAgIH0NCisgIH0NCisgIHBEZXN0Tm9kZS0+U2V0VGVtcGxhdGVOb2RlKHBQcm90b05vZGUpOw0KKyAgZm9yIChDWEZBX05vZGUqIHBUZW1wbGF0ZUNoaWxkID0NCisgICAgICAgICAgIHBQcm90b05vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgcFRlbXBsYXRlQ2hpbGQ7DQorICAgICAgIHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgWEZBX1Byb3RvTWVyZ2VfTWVyZ2VOb2RlUmVjdXJzZShwRG9jdW1lbnQsIHBEZXN0Tm9kZSwgcFRlbXBsYXRlQ2hpbGQpOw0KKyAgfQ0KKyAgew0KKyAgICBDWEZBX05vZGVJdGVyYXRvciBzSXRlcmF0b3IocERlc3ROb2RlKTsNCisgICAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcE5vZGU7DQorICAgICAgICAgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUsIEZBTFNFKTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENYRkFfRG9jdW1lbnQ6OkRvUHJvdG9NZXJnZSgpIHsNCisgIENYRkFfTm9kZSogcFRlbXBsYXRlUm9vdCA9IChDWEZBX05vZGUqKUdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX1RlbXBsYXRlKTsNCisgIGlmICghcFRlbXBsYXRlUm9vdCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfTWFwUHRyVGVtcGxhdGU8RlhfRFdPUkQsIENYRkFfTm9kZSo+IG1JRE1hcDsNCisgIENYRkFfTm9kZVNldCBzVXNlTm9kZXM7DQorICBDWEZBX05vZGVJdGVyYXRvciBzSXRlcmF0b3IocFRlbXBsYXRlUm9vdCk7DQorICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBzSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwTm9kZTsNCisgICAgICAgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c0lEVmFsOw0KKyAgICBpZiAocE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfSWQsIHdzSURWYWwpICYmICF3c0lEVmFsLklzRW1wdHkoKSkgew0KKyAgICAgIG1JRE1hcFtGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c0lEVmFsLkdldFB0cigpLCB3c0lEVmFsLkdldExlbmd0aCgpKV0gPQ0KKyAgICAgICAgICBwTm9kZTsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZ0Mgd3NVc2VWYWw7DQorICAgIGlmIChwTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Vc2UsIHdzVXNlVmFsKSAmJiAhd3NVc2VWYWwuSXNFbXB0eSgpKSB7DQorICAgICAgc1VzZU5vZGVzLkFkZChwTm9kZSk7DQorICAgIH0gZWxzZSBpZiAocE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgd3NVc2VWYWwpICYmDQorICAgICAgICAgICAgICAgIXdzVXNlVmFsLklzRW1wdHkoKSkgew0KKyAgICAgIHNVc2VOb2Rlcy5BZGQocE5vZGUpOw0KKyAgICB9DQorICB9DQorICBGWF9QT1NJVElPTiBwb3MgPSBzVXNlTm9kZXMuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgd2hpbGUgKHBvcykgew0KKyAgICBDWEZBX05vZGUqIHBVc2VIcmVmTm9kZSA9IE5VTEw7DQorICAgIHNVc2VOb2Rlcy5HZXROZXh0QXNzb2MocG9zLCBwVXNlSHJlZk5vZGUpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1VzZVZhbDsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVVJJLCB3c0lELCB3c1NPTTsNCisgICAgaWYgKHBVc2VIcmVmTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Vc2VocmVmLCB3c1VzZVZhbCkgJiYNCisgICAgICAgICF3c1VzZVZhbC5Jc0VtcHR5KCkpIHsNCisgICAgICBGWF9TVFJTSVpFIHVTaGFycFBvcyA9IHdzVXNlVmFsLkZpbmQoJyMnKTsNCisgICAgICBpZiAodVNoYXJwUG9zIDwgMCkgew0KKyAgICAgICAgd3NVUkkgPSB3c1VzZVZhbDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgd3NVUkkgPSBDRlhfV2lkZVN0cmluZ0MoKGNvbnN0IEZYX1dDSEFSKil3c1VzZVZhbCwgdVNoYXJwUG9zKTsNCisgICAgICAgIEZYX1NUUlNJWkUgdUxlbiA9IHdzVXNlVmFsLkdldExlbmd0aCgpOw0KKyAgICAgICAgaWYgKHVMZW4gPj0gdVNoYXJwUG9zICsgNSAmJg0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQygoY29uc3QgRlhfV0NIQVIqKXdzVXNlVmFsICsgdVNoYXJwUG9zLCA1KSA9PQ0KKyAgICAgICAgICAgICAgICBGWF9XU1RSQyhMIiNzb20oIikgJiYNCisgICAgICAgICAgICB3c1VzZVZhbFt1TGVuIC0gMV0gPT0gJyknKSB7DQorICAgICAgICAgIHdzU09NID0gQ0ZYX1dpZGVTdHJpbmdDKChjb25zdCBGWF9XQ0hBUiopd3NVc2VWYWwgKyB1U2hhcnBQb3MgKyA1LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TGVuIC0gMSAtIHVTaGFycFBvcyAtIDUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgd3NJRCA9IENGWF9XaWRlU3RyaW5nQygoY29uc3QgRlhfV0NIQVIqKXdzVXNlVmFsICsgdVNoYXJwUG9zICsgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TGVuIC0gdVNoYXJwUG9zIC0gMSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKHBVc2VIcmVmTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Vc2UsIHdzVXNlVmFsKSAmJg0KKyAgICAgICAgICAgICAgICF3c1VzZVZhbC5Jc0VtcHR5KCkpIHsNCisgICAgICBpZiAod3NVc2VWYWxbMF0gPT0gJyMnKSB7DQorICAgICAgICB3c0lEID0gQ0ZYX1dpZGVTdHJpbmdDKChjb25zdCBGWF9XQ0hBUiopd3NVc2VWYWwgKyAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1VzZVZhbC5HZXRMZW5ndGgoKSAtIDEpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICB3c1NPTSA9DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDKChjb25zdCBGWF9XQ0hBUiopd3NVc2VWYWwsIHdzVXNlVmFsLkdldExlbmd0aCgpKTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKCF3c1VSSS5Jc0VtcHR5KCkgJiYgd3NVUkkgIT0gRlhfV1NUUkMoTCIuIikpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBQcm90b05vZGUgPSBOVUxMOw0KKyAgICBpZiAoIXdzU09NLklzRW1wdHkoKSkgew0KKyAgICAgIEZYX0RXT1JEIGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzIHwNCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5nczsNCisgICAgICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb3ZlTm9kZVJTOw0KKyAgICAgIGludDMyX3QgaVJldCA9IG1fcFNjcmlwdENvbnRleHQtPlJlc29sdmVPYmplY3RzKHBVc2VIcmVmTm9kZSwgd3NTT00sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3ZlTm9kZVJTLCBkd0ZsYWcpOw0KKyAgICAgIGlmIChpUmV0ID4gMCAmJiByZXNvdmVOb2RlUlMubm9kZXNbMF0tPklzTm9kZSgpKSB7DQorICAgICAgICBwUHJvdG9Ob2RlID0gKENYRkFfTm9kZSopcmVzb3ZlTm9kZVJTLm5vZGVzWzBdOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmICghd3NJRC5Jc0VtcHR5KCkpIHsNCisgICAgICBpZiAoIW1JRE1hcC5Mb29rdXAoDQorICAgICAgICAgICAgICBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c0lELkdldFB0cigpLCB3c0lELkdldExlbmd0aCgpKSwNCisgICAgICAgICAgICAgIHBQcm90b05vZGUpKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFwUHJvdG9Ob2RlKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgWEZBX1Byb3RvTWVyZ2VfTWVyZ2VOb2RlKHRoaXMsIHBVc2VIcmVmTm9kZSwgcFByb3RvTm9kZSk7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9sYXlvdXRfaW1wLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9sYXlvdXRfaW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjFmZjFmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X2xheW91dF9pbXAuY3BwCkBAIC0wLDAgKzEsMjEzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV91dGlscy5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfb2JqZWN0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2N1bWVudC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfcGFyc2VyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9zY3JpcHQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY2RhdGEuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY2xheW91dC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfbG9jYWxlbWdyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9mbTJqc2FwaS5oIg0KKyNpbmNsdWRlICJ4ZmFfYmFzaWNfaW1wLmgiDQorI2luY2x1ZGUgInhmYV9kb2N1bWVudF9sYXlvdXRfaW1wLmgiDQorI2luY2x1ZGUgInhmYV9kb2N1bWVudF9kYXRhbWVyZ2VyX2ltcC5oIg0KKyNpbmNsdWRlICJ4ZmFfbGF5b3V0X2l0ZW1sYXlvdXQuaCINCisjaW5jbHVkZSAieGZhX2xheW91dF9wYWdlbWdyX25ldy5oIg0KKyNpbmNsdWRlICJ4ZmFfbGF5b3V0X2FwcGFkYXB0ZXIuaCINCitDWEZBX0xheW91dFByb2Nlc3NvciogQ1hGQV9Eb2N1bWVudDo6R2V0TGF5b3V0UHJvY2Vzc29yKCkgew0KKyAgaWYgKCFtX3BMYXlvdXRQcm9jZXNzb3IpIHsNCisgICAgbV9wTGF5b3V0UHJvY2Vzc29yID0gbmV3IENYRkFfTGF5b3V0UHJvY2Vzc29yKHRoaXMpOw0KKyAgICBBU1NFUlQobV9wTGF5b3V0UHJvY2Vzc29yKTsNCisgIH0NCisgIHJldHVybiBtX3BMYXlvdXRQcm9jZXNzb3I7DQorfQ0KK0lYRkFfRG9jTGF5b3V0KiBDWEZBX0RvY3VtZW50OjpHZXREb2NMYXlvdXQoKSB7DQorICByZXR1cm4gR2V0TGF5b3V0UHJvY2Vzc29yKCk7DQorfQ0KK0NYRkFfTGF5b3V0UHJvY2Vzc29yOjpDWEZBX0xheW91dFByb2Nlc3NvcihDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpDQorICAgIDogbV9wRG9jdW1lbnQocERvY3VtZW50KSwNCisgICAgICBtX3BSb290SXRlbUxheW91dFByb2Nlc3NvcihOVUxMKSwNCisgICAgICBtX3BMYXlvdXRQYWdlTWdyKE5VTEwpLA0KKyAgICAgIG1fblByb2dyZXNzQ291bnRlcigwKSwNCisgICAgICBtX2JOZWVMYXlvdXQoVFJVRSkge30NCitDWEZBX0xheW91dFByb2Nlc3Nvcjo6fkNYRkFfTGF5b3V0UHJvY2Vzc29yKCkgew0KKyAgQ2xlYXJMYXlvdXREYXRhKCk7DQorfQ0KK0NYRkFfRG9jdW1lbnQqIENYRkFfTGF5b3V0UHJvY2Vzc29yOjpHZXREb2N1bWVudCgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BEb2N1bWVudDsNCit9DQoraW50MzJfdCBDWEZBX0xheW91dFByb2Nlc3Nvcjo6U3RhcnRMYXlvdXQoRlhfQk9PTCBiRm9yY2VSZXN0YXJ0KSB7DQorICBpZiAoIWJGb3JjZVJlc3RhcnQgJiYgIUlzTmVlZExheW91dCgpKSB7DQorICAgIHJldHVybiAxMDA7DQorICB9DQorICBpZiAobV9wUm9vdEl0ZW1MYXlvdXRQcm9jZXNzb3IpIHsNCisgICAgZGVsZXRlIG1fcFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yOw0KKyAgICBtX3BSb290SXRlbUxheW91dFByb2Nlc3NvciA9IE5VTEw7DQorICB9DQorICBtX25Qcm9ncmVzc0NvdW50ZXIgPSAwOw0KKyAgQ1hGQV9Ob2RlKiBwRm9ybVBhY2tldE5vZGUgPQ0KKyAgICAgIChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKTsNCisgIGlmICghcEZvcm1QYWNrZXROb2RlKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIENYRkFfTm9kZSogcEZvcm1Sb290ID0NCisgICAgICBwRm9ybVBhY2tldE5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1N1YmZvcm0pOw0KKyAgaWYgKCFwRm9ybVJvb3QpIHsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgaWYgKCFtX3BMYXlvdXRQYWdlTWdyKSB7DQorICAgIG1fcExheW91dFBhZ2VNZ3IgPSBuZXcgQ1hGQV9MYXlvdXRQYWdlTWdyKHRoaXMpOw0KKyAgfQ0KKyAgaWYgKCFtX3BMYXlvdXRQYWdlTWdyLT5Jbml0TGF5b3V0UGFnZShwRm9ybVJvb3QpKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIGlmICghbV9wTGF5b3V0UGFnZU1nci0+UHJlcGFyZUZpcnN0UGFnZShwRm9ybVJvb3QpKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIG1fcFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yID0NCisgICAgICBuZXcgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKHBGb3JtUm9vdCwgbV9wTGF5b3V0UGFnZU1ncik7DQorI2lmbmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KKyAgbV9wUm9vdEl0ZW1MYXlvdXRQcm9jZXNzb3ItPm1fcFBhZ2VNZ3JDcmVhdGVJdGVtID0gbV9wTGF5b3V0UGFnZU1ncjsNCisjZW5kaWYNCisgIG1fblByb2dyZXNzQ291bnRlciA9IDE7DQorICByZXR1cm4gMDsNCit9DQoraW50MzJfdCBDWEZBX0xheW91dFByb2Nlc3Nvcjo6RG9MYXlvdXQoSUZYX1BhdXNlKiBwUGF1c2UpIHsNCisgIGlmIChtX25Qcm9ncmVzc0NvdW50ZXIgPCAxKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IGVTdGF0dXM7DQorICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IG1fcFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yLT5HZXRGb3JtTm9kZSgpOw0KKyAgRlhfRkxPQVQgZlBvc1ggPSBwRm9ybU5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9YKS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgRlhfRkxPQVQgZlBvc1kgPSBwRm9ybU5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9ZKS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgZG8gew0KKyAgICBGWF9GTE9BVCBmQXZhaWxIZWlnaHQgPSBtX3BMYXlvdXRQYWdlTWdyLT5HZXRBdmFpbEhlaWdodCgpOw0KKyAgICBlU3RhdHVzID0NCisgICAgICAgIG1fcFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yLT5Eb0xheW91dChUUlVFLCBmQXZhaWxIZWlnaHQsIGZBdmFpbEhlaWdodCk7DQorICAgIGlmIChlU3RhdHVzICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmUpIHsNCisgICAgICBtX25Qcm9ncmVzc0NvdW50ZXIrKzsNCisgICAgfQ0KKyAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSA9DQorICAgICAgICBtX3BSb290SXRlbUxheW91dFByb2Nlc3Nvci0+RXh0cmFjdExheW91dEl0ZW0oKTsNCisgICAgaWYgKHBMYXlvdXRJdGVtKSB7DQorICAgICAgcExheW91dEl0ZW0tPm1fc1Bvcy5TZXQoZlBvc1gsIGZQb3NZKTsNCisgICAgfQ0KKyAgICBtX3BMYXlvdXRQYWdlTWdyLT5TdWJtaXRDb250ZW50SXRlbShwTGF5b3V0SXRlbSwgZVN0YXR1cyk7DQorICB9IHdoaWxlIChlU3RhdHVzICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmUgJiYNCisgICAgICAgICAgICghcFBhdXNlIHx8ICFwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpKTsNCisgIGlmIChlU3RhdHVzID09IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmUpIHsNCisgICAgbV9wTGF5b3V0UGFnZU1nci0+RmluaXNoUGFnaW5hdGVkUGFnZVNldHMoKTsNCisgICAgbV9wTGF5b3V0UGFnZU1nci0+U3luY0xheW91dERhdGEoKTsNCisgICAgbV9iTmVlTGF5b3V0ID0gRkFMU0U7DQorICAgIG1fcmdDaGFuZ2VkQ29udGFpbmVycy5SZW1vdmVBbGwoKTsNCisgIH0NCisgIHJldHVybiAxMDAgKiAoZVN0YXR1cyA9PSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lDQorICAgICAgICAgICAgICAgICAgICA/IG1fblByb2dyZXNzQ291bnRlcg0KKyAgICAgICAgICAgICAgICAgICAgOiBtX25Qcm9ncmVzc0NvdW50ZXIgLSAxKSAvDQorICAgICAgICAgbV9uUHJvZ3Jlc3NDb3VudGVyOw0KK30NCitGWF9CT09MIENYRkFfTGF5b3V0UHJvY2Vzc29yOjpJbmNyZW1lbnRMYXlvdXQoKSB7DQorICBpZiAobV9iTmVlTGF5b3V0KSB7DQorICAgIFN0YXJ0TGF5b3V0KFRSVUUpOw0KKyAgICByZXR1cm4gRG9MYXlvdXQoTlVMTCkgPT0gMTAwOw0KKyAgfQ0KKyAgZm9yIChpbnQzMl90IGkgPSAwLCBjID0gbV9yZ0NoYW5nZWRDb250YWluZXJzLkdldFNpemUoKTsgaSA8IGM7IGkrKykgew0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9yZ0NoYW5nZWRDb250YWluZXJzW2ldOw0KKyAgICBDWEZBX05vZGUqIHBQYXJlbnROb2RlID0NCisgICAgICAgIHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50LCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKTsNCisgICAgaWYgKCFwUGFyZW50Tm9kZSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBpZiAoIUNYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6SW5jcmVtZW50UmVsYXlvdXROb2RlKHRoaXMsIHBOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJlbnROb2RlKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgfQ0KKyAgbV9yZ0NoYW5nZWRDb250YWluZXJzLlJlbW92ZUFsbCgpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK2ludDMyX3QgQ1hGQV9MYXlvdXRQcm9jZXNzb3I6OkNvdW50UGFnZXMoKSBjb25zdCB7DQorICByZXR1cm4gbV9wTGF5b3V0UGFnZU1nciA/IG1fcExheW91dFBhZ2VNZ3ItPkdldFBhZ2VDb3VudCgpIDogMDsNCit9DQorSVhGQV9MYXlvdXRQYWdlKiBDWEZBX0xheW91dFByb2Nlc3Nvcjo6R2V0UGFnZShpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICByZXR1cm4gbV9wTGF5b3V0UGFnZU1nciA/IG1fcExheW91dFBhZ2VNZ3ItPkdldFBhZ2UoaW5kZXgpIDogTlVMTDsNCit9DQorQ1hGQV9MYXlvdXRJdGVtKiBDWEZBX0xheW91dFByb2Nlc3Nvcjo6R2V0TGF5b3V0SXRlbShDWEZBX05vZGUqIHBGb3JtSXRlbSkgew0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfTGF5b3V0SXRlbSo+KA0KKyAgICAgIHBGb3JtSXRlbS0+R2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVkpKTsNCit9DQordm9pZCBDWEZBX0xheW91dFByb2Nlc3Nvcjo6QWRkQ2hhbmdlZENvbnRhaW5lcihDWEZBX05vZGUqIHBDb250YWluZXIpIHsNCisgIGlmIChtX3JnQ2hhbmdlZENvbnRhaW5lcnMuRmluZChwQ29udGFpbmVyKSA8IDApIHsNCisgICAgbV9yZ0NoYW5nZWRDb250YWluZXJzLkFkZChwQ29udGFpbmVyKTsNCisgIH0NCit9DQorQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBDWEZBX0xheW91dFByb2Nlc3Nvcjo6R2V0Um9vdExheW91dEl0ZW0oKSBjb25zdCB7DQorICByZXR1cm4gbV9wTGF5b3V0UGFnZU1nciA/IG1fcExheW91dFBhZ2VNZ3ItPkdldFJvb3RMYXlvdXRJdGVtKCkgOiBOVUxMOw0KK30NCit2b2lkIENYRkFfTGF5b3V0UHJvY2Vzc29yOjpDbGVhckxheW91dERhdGEoKSB7DQorICBpZiAobV9wTGF5b3V0UGFnZU1ncikgew0KKyAgICBkZWxldGUgbV9wTGF5b3V0UGFnZU1ncjsNCisgICAgbV9wTGF5b3V0UGFnZU1nciA9IE5VTEw7DQorICB9DQorICBpZiAobV9wUm9vdEl0ZW1MYXlvdXRQcm9jZXNzb3IpIHsNCisgICAgZGVsZXRlIG1fcFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yOw0KKyAgICBtX3BSb290SXRlbUxheW91dFByb2Nlc3NvciA9IE5VTEw7DQorICB9DQorICBtX25Qcm9ncmVzc0NvdW50ZXIgPSAwOw0KK30NCitGWF9CT09MIENYRkFfTGF5b3V0UHJvY2Vzc29yOjpJc05lZWRMYXlvdXQoKSB7DQorICByZXR1cm4gbV9iTmVlTGF5b3V0IHx8IG1fcmdDaGFuZ2VkQ29udGFpbmVycy5HZXRTaXplKCkgPiAwOw0KK30NCitDWEZBX0xheW91dEl0ZW06OkNYRkFfTGF5b3V0SXRlbShDWEZBX05vZGUqIHBOb2RlLCBGWF9CT09MIGJJc0NvbnRlbnRMYXlvdXRJdGVtKQ0KKyAgICA6IG1fcEZvcm1Ob2RlKHBOb2RlKSwNCisgICAgICBtX3BQYXJlbnQoTlVMTCksDQorICAgICAgbV9wTmV4dFNpYmxpbmcoTlVMTCksDQorICAgICAgbV9wRmlyc3RDaGlsZChOVUxMKSwNCisgICAgICBtX2JJc0NvbnRlbnRMYXlvdXRJdGVtKGJJc0NvbnRlbnRMYXlvdXRJdGVtKSB7DQorfQ0KK0NYRkFfTGF5b3V0SXRlbTo6fkNYRkFfTGF5b3V0SXRlbSgpIHsNCit9DQorQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtOjpDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0oQ1hGQV9Ob2RlKiBwTm9kZSkNCisgICAgOiBDWEZBX0xheW91dEl0ZW0ocE5vZGUsIEZBTFNFKSwgbV9wT2xkU3ViZm9ybShOVUxMKSB7DQorfQ0KK0lYRkFfRG9jTGF5b3V0KiBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW06OkdldExheW91dCgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0TGF5b3V0UHJvY2Vzc29yKCk7DQorfQ0KK2ludDMyX3QgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtOjpHZXRQYWdlSW5kZXgoKSBjb25zdCB7DQorICByZXR1cm4gbV9wRm9ybU5vZGUtPkdldERvY3VtZW50KCkNCisgICAgICAtPkdldExheW91dFByb2Nlc3NvcigpDQorICAgICAgLT5HZXRMYXlvdXRQYWdlTWdyKCkNCisgICAgICAtPkdldFBhZ2VJbmRleCh0aGlzKTsNCit9DQordm9pZCBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW06OkdldFBhZ2VTaXplKENGWF9TaXplRiYgc2l6ZSkgew0KKyAgc2l6ZS5TZXQoMCwgMCk7DQorICBDWEZBX05vZGUqIHBNZWRpdW0gPSBtX3BGb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfTWVkaXVtKTsNCisgIGlmIChwTWVkaXVtKSB7DQorICAgIHNpemUueCA9IHBNZWRpdW0tPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9TaG9ydCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgc2l6ZS55ID0gcE1lZGl1bS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0xvbmcpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgIGlmIChwTWVkaXVtLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfT3JpZW50YXRpb24pID09DQorICAgICAgICBYRkFfQVRUUklCVVRFRU5VTV9MYW5kc2NhcGUpIHsNCisgICAgICBzaXplLlNldChzaXplLnksIHNpemUueCk7DQorICAgIH0NCisgIH0NCit9DQorQ1hGQV9Ob2RlKiBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW06OkdldE1hc3RlclBhZ2UoKSBjb25zdCB7DQorICByZXR1cm4gbV9wRm9ybU5vZGU7DQorfQ0KK0NYRkFfQ29udGVudExheW91dEl0ZW06OkNYRkFfQ29udGVudExheW91dEl0ZW0oQ1hGQV9Ob2RlKiBwTm9kZSkNCisgICAgOiBDWEZBX0xheW91dEl0ZW0ocE5vZGUsIFRSVUUpLA0KKyAgICAgIG1fcFByZXYoTlVMTCksDQorICAgICAgbV9wTmV4dChOVUxMKSwNCisgICAgICBtX2R3U3RhdHVzKDApIHsNCit9DQorQ1hGQV9Db250ZW50TGF5b3V0SXRlbTo6fkNYRkFfQ29udGVudExheW91dEl0ZW0oKSB7DQorICBpZiAobV9wRm9ybU5vZGUtPkdldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZKSA9PSB0aGlzKSB7DQorICAgIG1fcEZvcm1Ob2RlLT5TZXRVc2VyRGF0YShYRkFfTEFZT1VUSVRFTUtFWSwgTlVMTCk7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9kb2N1bWVudF9sYXlvdXRfaW1wLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfbGF5b3V0X2ltcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNWFmNmUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfbGF5b3V0X2ltcC5oCkBAIC0wLDAgKzEsNDUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfWEZBX0RPQ1VNRU5UX0xBWU9VVF9JTVBfSF8NCisjZGVmaW5lIF9YRkFfRE9DVU1FTlRfTEFZT1VUX0lNUF9IXw0KK2NsYXNzIENYRkFfSXRlbUxheW91dFByb2Nlc3NvcjsNCitjbGFzcyBDWEZBX0xheW91dFBhZ2VNZ3I7DQorY2xhc3MgQ1hGQV9MYXlvdXRBcHBBZGFwdGVyOw0KK2NsYXNzIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbTsNCitjbGFzcyBDWEZBX0xheW91dFByb2Nlc3NvciA6IHB1YmxpYyBJWEZBX0RvY0xheW91dCB7DQorIHB1YmxpYzoNCisgIENYRkFfTGF5b3V0UHJvY2Vzc29yKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCk7DQorICB+Q1hGQV9MYXlvdXRQcm9jZXNzb3IoKTsNCisgIHZpcnR1YWwgQ1hGQV9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBjb25zdDsNCisgIHZpcnR1YWwgaW50MzJfdCBTdGFydExheW91dChGWF9CT09MIGJGb3JjZVJlc3RhcnQgPSBGQUxTRSk7DQorICB2aXJ0dWFsIGludDMyX3QgRG9MYXlvdXQoSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBJbmNyZW1lbnRMYXlvdXQoKTsNCisgIHZpcnR1YWwgaW50MzJfdCBDb3VudFBhZ2VzKCkgY29uc3Q7DQorICB2aXJ0dWFsIElYRkFfTGF5b3V0UGFnZSogR2V0UGFnZShpbnQzMl90IGluZGV4KSBjb25zdDsNCisgIHZpcnR1YWwgQ1hGQV9MYXlvdXRJdGVtKiBHZXRMYXlvdXRJdGVtKENYRkFfTm9kZSogcEZvcm1JdGVtKTsNCisNCisgIHZvaWQgQWRkQ2hhbmdlZENvbnRhaW5lcihDWEZBX05vZGUqIHBDb250YWluZXIpOw0KKyAgdm9pZCBTZXRGb3JjZVJlTGF5b3V0KEZYX0JPT0wgYkZvcmNlUmVzdGFydCkgeyBtX2JOZWVMYXlvdXQgPSBiRm9yY2VSZXN0YXJ0OyB9DQorICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIEdldFJvb3RMYXlvdXRJdGVtKCkgY29uc3Q7DQorICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIEdldFJvb3RSb290SXRlbUxheW91dFByb2Nlc3NvcigpIHsNCisgICAgcmV0dXJuIG1fcFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yOw0KKyAgfQ0KKyAgQ1hGQV9MYXlvdXRQYWdlTWdyKiBHZXRMYXlvdXRQYWdlTWdyKCkgeyByZXR1cm4gbV9wTGF5b3V0UGFnZU1ncjsgfQ0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIENsZWFyTGF5b3V0RGF0YSgpOw0KKw0KKyAgRlhfQk9PTCBJc05lZWRMYXlvdXQoKTsNCisNCisgIENYRkFfRG9jdW1lbnQqIG1fcERvY3VtZW50Ow0KKyAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBtX3BSb290SXRlbUxheW91dFByb2Nlc3NvcjsNCisgIENYRkFfTGF5b3V0UGFnZU1nciogbV9wTGF5b3V0UGFnZU1ncjsNCisgIENYRkFfTm9kZUFycmF5IG1fcmdDaGFuZ2VkQ29udGFpbmVyczsNCisgIHVpbnQzMl90IG1fblByb2dyZXNzQ291bnRlcjsNCisgIEZYX0JPT0wgbV9iTmVlTGF5b3V0Ow0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X3NlcmlhbGl6ZS5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfc2VyaWFsaXplLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzgxYWE5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X3NlcmlhbGl6ZS5jcHAKQEAgLTAsMCArMSw1ODggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3V0aWxzLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9vYmplY3QuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY3VtZW50LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9wYXJzZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3NjcmlwdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jZGF0YS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jbGF5b3V0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9sb2NhbGVtZ3IuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2ZtMmpzYXBpLmgiDQorI2luY2x1ZGUgInhmYV9kb2N1bWVudF9zZXJpYWxpemUuaCINCitJWEZBX1BhY2tldEltcG9ydCogSVhGQV9QYWNrZXRJbXBvcnQ6OkNyZWF0ZShDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsNCisgIHJldHVybiBuZXcgQ1hGQV9EYXRhSW1wb3J0ZXIocERvY3VtZW50KTsNCit9DQorQ1hGQV9EYXRhSW1wb3J0ZXI6OkNYRkFfRGF0YUltcG9ydGVyKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCkNCisgICAgOiBtX3BEb2N1bWVudChwRG9jdW1lbnQpIHsNCisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsNCit9DQorRlhfQk9PTCBDWEZBX0RhdGFJbXBvcnRlcjo6SW1wb3J0RGF0YShJRlhfRmlsZVJlYWQqIHBEYXRhRG9jdW1lbnQpIHsNCisgIElYRkFfUGFyc2VyKiBwRGF0YURvY3VtZW50UGFyc2VyID0gSVhGQV9QYXJzZXI6OkNyZWF0ZShtX3BEb2N1bWVudCk7DQorICBpZiAoIXBEYXRhRG9jdW1lbnRQYXJzZXIpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHBEYXRhRG9jdW1lbnRQYXJzZXItPlN0YXJ0UGFyc2UocERhdGFEb2N1bWVudCwgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cykgIT0NCisgICAgICBYRkFfUEFSU0VTVEFUVVNfUmVhZHkpIHsNCisgICAgcERhdGFEb2N1bWVudFBhcnNlci0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAocERhdGFEb2N1bWVudFBhcnNlci0+RG9QYXJzZShOVUxMKSA8IFhGQV9QQVJTRVNUQVRVU19Eb25lKSB7DQorICAgIHBEYXRhRG9jdW1lbnRQYXJzZXItPlJlbGVhc2UoKTsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwSW1wb3J0RGF0YVJvb3QgPSBwRGF0YURvY3VtZW50UGFyc2VyLT5HZXRSb290Tm9kZSgpOw0KKyAgaWYgKCFwSW1wb3J0RGF0YVJvb3QpIHsNCisgICAgcERhdGFEb2N1bWVudFBhcnNlci0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDWEZBX05vZGUqIHBEYXRhTW9kZWwgPQ0KKyAgICAgIChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9EYXRhc2V0cyk7DQorICBpZiAoIXBEYXRhTW9kZWwpIHsNCisgICAgcERhdGFEb2N1bWVudFBhcnNlci0+UmVsZWFzZSgpOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9EYXRhKTsNCisgIGlmIChwRGF0YU5vZGUpIHsNCisgICAgcERhdGFNb2RlbC0+UmVtb3ZlQ2hpbGQocERhdGFOb2RlKTsNCisgIH0NCisgIGlmIChwSW1wb3J0RGF0YVJvb3QtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9EYXRhTW9kZWwpIHsNCisgICAgd2hpbGUgKENYRkFfTm9kZSogcENoaWxkTm9kZSA9DQorICAgICAgICAgICAgICAgcEltcG9ydERhdGFSb290LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpIHsNCisgICAgICBwSW1wb3J0RGF0YVJvb3QtPlJlbW92ZUNoaWxkKHBDaGlsZE5vZGUpOw0KKyAgICAgIHBEYXRhTW9kZWwtPkluc2VydENoaWxkKHBDaGlsZE5vZGUpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlID0gcEltcG9ydERhdGFSb290LT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICBJRkRFX1hNTE5vZGUqIHBQYXJlbnRYTUxOb2RlID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6UGFyZW50KTsNCisgICAgaWYgKHBQYXJlbnRYTUxOb2RlKSB7DQorICAgICAgcFBhcmVudFhNTE5vZGUtPlJlbW92ZUNoaWxkTm9kZShwWE1MTm9kZSk7DQorICAgIH0NCisgICAgcERhdGFNb2RlbC0+SW5zZXJ0Q2hpbGQocEltcG9ydERhdGFSb290KTsNCisgIH0NCisgIG1fcERvY3VtZW50LT5Eb0RhdGFSZW1lcmdlKEZBTFNFKTsNCisgIHBEYXRhRG9jdW1lbnRQYXJzZXItPlJlbGVhc2UoKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitDRlhfV2lkZVN0cmluZyBYRkFfRXhwb3J0RW5jb2RlQXR0cmlidXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIHsNCisgIENGWF9XaWRlVGV4dEJ1ZiB0ZXh0QnVmOw0KKyAgaW50MzJfdCBpTGVuID0gc3RyLkdldExlbmd0aCgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUxlbjsgaSsrKSB7DQorICAgIHN3aXRjaCAoc3RyW2ldKSB7DQorICAgICAgY2FzZSAnJic6DQorICAgICAgICB0ZXh0QnVmIDw8IEZYX1dTVFJDKEwiJmFtcDsiKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJzwnOg0KKyAgICAgICAgdGV4dEJ1ZiA8PCBGWF9XU1RSQyhMIiZsdDsiKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJz4nOg0KKyAgICAgICAgdGV4dEJ1ZiA8PCBGWF9XU1RSQyhMIiZndDsiKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ1wnJzoNCisgICAgICAgIHRleHRCdWYgPDwgRlhfV1NUUkMoTCImYXBvczsiKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgJ1wiJzoNCisgICAgICAgIHRleHRCdWYgPDwgRlhfV1NUUkMoTCImcXVvdDsiKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICB0ZXh0QnVmLkFwcGVuZENoYXIoc3RyW2ldKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHRleHRCdWYuR2V0V2lkZVN0cmluZygpOw0KK30NCitDRlhfV2lkZVN0cmluZyBYRkFfRXhwb3J0RW5jb2RlQ29udGVudChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cikgew0KKyAgQ0ZYX1dpZGVUZXh0QnVmIHRleHRCdWY7DQorICBpbnQzMl90IGlMZW4gPSBzdHIuR2V0TGVuZ3RoKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGVuOyBpKyspIHsNCisgICAgRlhfV0NIQVIgY2ggPSBzdHIuR2V0QXQoaSk7DQorICAgIGlmICghRkRFX0lzWE1MVmFsaWRDaGFyKGNoKSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChjaCA9PSAnJicpIHsNCisgICAgICB0ZXh0QnVmIDw8IEZYX1dTVFJDKEwiJmFtcDsiKTsNCisgICAgfSBlbHNlIGlmIChjaCA9PSAnPCcpIHsNCisgICAgICB0ZXh0QnVmIDw8IEZYX1dTVFJDKEwiJmx0OyIpOw0KKyAgICB9IGVsc2UgaWYgKGNoID09ICc+Jykgew0KKyAgICAgIHRleHRCdWYgPDwgRlhfV1NUUkMoTCImZ3Q7Iik7DQorICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1wnJykgew0KKyAgICAgIHRleHRCdWYgPDwgRlhfV1NUUkMoTCImYXBvczsiKTsNCisgICAgfSBlbHNlIGlmIChjaCA9PSAnXCInKSB7DQorICAgICAgdGV4dEJ1ZiA8PCBGWF9XU1RSQyhMIiZxdW90OyIpOw0KKyAgICB9IGVsc2UgaWYgKGNoID09ICcgJykgew0KKyAgICAgIGlmIChpICYmIHN0ci5HZXRBdChpIC0gMSkgIT0gJyAnKSB7DQorICAgICAgICB0ZXh0QnVmLkFwcGVuZENoYXIoJyAnKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgdGV4dEJ1ZiA8PCBGWF9XU1RSQyhMIiYjeDIwOyIpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICB0ZXh0QnVmLkFwcGVuZENoYXIoc3RyLkdldEF0KGkpKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHRleHRCdWYuR2V0V2lkZVN0cmluZygpOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfU2F2ZUF0dHJpYnV0ZShDWEZBX05vZGUqIHBOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJvdG8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgaWYgKCghYlByb3RvICYmICFwTm9kZS0+SGFzQXR0cmlidXRlKChYRkFfQVRUUklCVVRFKWVOYW1lLCBiUHJvdG8pKSB8fA0KKyAgICAgICFwTm9kZS0+R2V0QXR0cmlidXRlKChYRkFfQVRUUklCVVRFKWVOYW1lLCB3c1ZhbHVlLCBGQUxTRSkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgd3NWYWx1ZSA9IFhGQV9FeHBvcnRFbmNvZGVBdHRyaWJ1dGUod3NWYWx1ZSk7DQorICB3c091dHB1dCArPSBGWF9XU1RSQyhMIiAiKTsNCisgIHdzT3V0cHV0ICs9IHdzTmFtZTsNCisgIHdzT3V0cHV0ICs9IEZYX1dTVFJDKEwiPVwiIik7DQorICB3c091dHB1dCArPSB3c1ZhbHVlOw0KKyAgd3NPdXRwdXQgKz0gRlhfV1NUUkMoTCJcIiIpOw0KK30NCitzdGF0aWMgRlhfQk9PTCBYRkFfRGF0YUV4cG9ydGVyX0F0dHJpYnV0ZVNhdmVJbkRhdGFNb2RlbCgNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSwNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBGWF9CT09MIGJTYXZlSW5EYXRhTW9kZWwgPSBGQUxTRTsNCisgIGlmIChwTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0ltYWdlKSB7DQorICAgIHJldHVybiBiU2F2ZUluRGF0YU1vZGVsOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwVmFsdWVOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgaWYgKCFwVmFsdWVOb2RlIHx8IHBWYWx1ZU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9WYWx1ZSkgew0KKyAgICByZXR1cm4gYlNhdmVJbkRhdGFNb2RlbDsNCisgIH0NCisgIENYRkFfTm9kZSogcEZpZWxkTm9kZSA9IHBWYWx1ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgaWYgKHBGaWVsZE5vZGUgJiYgcEZpZWxkTm9kZS0+R2V0QmluZERhdGEoKSAmJg0KKyAgICAgIGVBdHRyaWJ1dGUgPT0gWEZBX0FUVFJJQlVURV9IcmVmKSB7DQorICAgIGJTYXZlSW5EYXRhTW9kZWwgPSBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIGJTYXZlSW5EYXRhTW9kZWw7DQorfQ0KK0ZYX0JPT0wgWEZBX0RhdGFFeHBvcnRlcl9Db250ZW50Tm9kZU5lZWR0b0V4cG9ydChDWEZBX05vZGUqIHBDb250ZW50Tm9kZSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50Ow0KKyAgaWYgKCFwQ29udGVudE5vZGUtPlRyeUNvbnRlbnQod3NDb250ZW50LCBGQUxTRSwgRkFMU0UpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZYU1lTX2Fzc2VydChwQ29udGVudE5vZGUtPkdldE9iamVjdFR5cGUoKSA9PSBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZSk7DQorICBDWEZBX05vZGUqIHBQYXJlbnROb2RlID0gcENvbnRlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgIGlmICghcFBhcmVudE5vZGUgfHwgcFBhcmVudE5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9WYWx1ZSkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIENYRkFfTm9kZSogcEdyYW5kUGFyZW50Tm9kZSA9IHBQYXJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgIGlmICghcEdyYW5kUGFyZW50Tm9kZSB8fA0KKyAgICAgIHBHcmFuZFBhcmVudE5vZGUtPkdldE9iamVjdFR5cGUoKSAhPSBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaWYgKHBHcmFuZFBhcmVudE5vZGUtPkdldEJpbmREYXRhKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IHBHcmFuZFBhcmVudE5vZGUtPkdldFdpZGdldERhdGEoKTsNCisgIFhGQV9FTEVNRU5UIGVVSVR5cGUgPSBwV2lkZ2V0RGF0YS0+R2V0VUlUeXBlKCk7DQorICBpZiAoZVVJVHlwZSA9PSBYRkFfRUxFTUVOVF9QYXNzd29yZEVkaXQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9EYXRhRXhwb3J0ZXJfUmVjb2duaXplWEZBVmVyc2lvbk51bWJlcigNCisgICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVSb290LA0KKyAgICBDRlhfV2lkZVN0cmluZyYgd3NWZXJzaW9uTnVtYmVyKSB7DQorICB3c1ZlcnNpb25OdW1iZXIuRW1wdHkoKTsNCisgIGlmICghcFRlbXBsYXRlUm9vdCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1RlbXBsYXRlTlM7DQorICBpZiAoIXBUZW1wbGF0ZVJvb3QtPlRyeU5hbWVzcGFjZSh3c1RlbXBsYXRlTlMpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIFhGQV9WRVJTSU9OIGVWZXJzaW9uID0NCisgICAgICBwVGVtcGxhdGVSb290LT5HZXREb2N1bWVudCgpLT5SZWNvZ25pemVYRkFWZXJzaW9uTnVtYmVyKHdzVGVtcGxhdGVOUyk7DQorICBpZiAoZVZlcnNpb24gPT0gWEZBX1ZFUlNJT05fVU5LTk9XTikgew0KKyAgICBlVmVyc2lvbiA9IFhGQV9WRVJTSU9OX0RFRkFVTFQ7DQorICB9DQorICB3c1ZlcnNpb25OdW1iZXIuRm9ybWF0KEwiJWkuJWkiLCBlVmVyc2lvbiAvIDEwMCwgZVZlcnNpb24gJSAxMDApOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfRGF0YUV4cG9ydGVyX1JlZ2VuZXJhdGVGb3JtRmlsZV9DaGFuZ2VkKA0KKyAgICBDWEZBX05vZGUqIHBOb2RlLA0KKyAgICBDRlhfV2lkZVRleHRCdWYmIGJ1ZiwNCisgICAgRlhfQk9PTCBiU2F2ZVhNTCA9IEZBTFNFKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c0F0dHJzOw0KKyAgaW50MzJfdCBpQXR0cnMgPSAwOw0KKyAgY29uc3QgdWludDhfdCogcEF0dHJzID0gWEZBX0dldEVsZW1lbnRBdHRyaWJ1dGVzKHBOb2RlLT5HZXRDbGFzc0lEKCksIGlBdHRycyk7DQorICB3aGlsZSAoaUF0dHJzLS0pIHsNCisgICAgWEZBX0xQQ0FUVFJJQlVURUlORk8gcEF0dHIgPQ0KKyAgICAgICAgWEZBX0dldEF0dHJpYnV0ZUJ5SUQoKFhGQV9BVFRSSUJVVEUpcEF0dHJzW2lBdHRyc10pOw0KKyAgICBpZiAocEF0dHItPmVOYW1lID09IFhGQV9BVFRSSUJVVEVfTmFtZSB8fA0KKyAgICAgICAgKFhGQV9EYXRhRXhwb3J0ZXJfQXR0cmlidXRlU2F2ZUluRGF0YU1vZGVsKHBOb2RlLCBwQXR0ci0+ZU5hbWUpICYmDQorICAgICAgICAgIWJTYXZlWE1MKSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0cjsNCisgICAgWEZBX1NhdmVBdHRyaWJ1dGUocE5vZGUsIHBBdHRyLT5lTmFtZSwgcEF0dHItPnBOYW1lLCBiU2F2ZVhNTCwgd3NBdHRyKTsNCisgICAgd3NBdHRycyArPSB3c0F0dHI7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0NoaWxkcmVuOw0KKyAgc3dpdGNoIChwTm9kZS0+R2V0T2JqZWN0VHlwZSgpKSB7DQorICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGU6IHsNCisgICAgICBpZiAoIWJTYXZlWE1MICYmICFYRkFfRGF0YUV4cG9ydGVyX0NvbnRlbnROb2RlTmVlZHRvRXhwb3J0KHBOb2RlKSkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIENYRkFfTm9kZSogcFJhd1ZhbHVlTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgd2hpbGUgKHBSYXdWYWx1ZU5vZGUgJiYNCisgICAgICAgICAgICAgcFJhd1ZhbHVlTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1NoYXJweEhUTUwgJiYNCisgICAgICAgICAgICAgcFJhd1ZhbHVlTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1NoYXJwdGV4dCAmJg0KKyAgICAgICAgICAgICBwUmF3VmFsdWVOb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfU2hhcnB4bWwpIHsNCisgICAgICAgIHBSYXdWYWx1ZU5vZGUgPSBwUmF3VmFsdWVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgIH0NCisgICAgICBpZiAoIXBSYXdWYWx1ZU5vZGUpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlOw0KKyAgICAgIHBOb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSwgRkFMU0UpOw0KKyAgICAgIGlmIChwUmF3VmFsdWVOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU2hhcnB4SFRNTCAmJg0KKyAgICAgICAgICB3c0NvbnRlbnRUeXBlLkVxdWFsKEZYX1dTVFJDKEwidGV4dC9odG1sIikpKSB7DQorICAgICAgICBJRkRFX1hNTE5vZGUqIHBFeERhdGFYTUwgPSBwTm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCisgICAgICAgIGlmICghcEV4RGF0YVhNTCkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIElGREVfWE1MTm9kZSogcFJpY2hUZXh0WE1MID0NCisgICAgICAgICAgICBwRXhEYXRhWE1MLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOw0KKyAgICAgICAgaWYgKCFwUmljaFRleHRYTUwpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBJRlhfTWVtb3J5U3RyZWFtKiBwTWVtU3RyZWFtID0gRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKFRSVUUpOw0KKyAgICAgICAgSUZYX1N0cmVhbSogcFRlbXBTdHJlYW0gPSBJRlhfU3RyZWFtOjpDcmVhdGVTdHJlYW0oDQorICAgICAgICAgICAgKElGWF9GaWxlV3JpdGUqKXBNZW1TdHJlYW0sIEZYX1NUUkVBTUFDQ0VTU19UZXh0IHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TVFJFQU1BQ0NFU1NfQXBwZW5kKTsNCisgICAgICAgIHBUZW1wU3RyZWFtLT5TZXRDb2RlUGFnZShGWF9DT0RFUEFHRV9VVEY4KTsNCisgICAgICAgIHBSaWNoVGV4dFhNTC0+U2F2ZVhNTE5vZGUocFRlbXBTdHJlYW0pOw0KKyAgICAgICAgd3NDaGlsZHJlbiArPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoDQorICAgICAgICAgICAgKGNvbnN0IEZYX0NIQVIqKXBNZW1TdHJlYW0tPkdldEJ1ZmZlcigpLCBwTWVtU3RyZWFtLT5HZXRTaXplKCkpOw0KKyAgICAgICAgcFRlbXBTdHJlYW0tPlJlbGVhc2UoKTsNCisgICAgICAgIHBNZW1TdHJlYW0tPlJlbGVhc2UoKTsNCisgICAgICB9IGVsc2UgaWYgKHBSYXdWYWx1ZU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9TaGFycHhtbCAmJg0KKyAgICAgICAgICAgICAgICAgd3NDb250ZW50VHlwZS5FcXVhbChGWF9XU1RSQyhMInRleHQveG1sIikpKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1Jhd1ZhbHVlOw0KKyAgICAgICAgcFJhd1ZhbHVlTm9kZS0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzUmF3VmFsdWUsIEZBTFNFKTsNCisgICAgICAgIGlmICh3c1Jhd1ZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NTZWxUZXh0QXJyYXk7DQorICAgICAgICBpbnQzMl90IGlTdGFydCA9IDA7DQorICAgICAgICBpbnQzMl90IGlFbmQgPSB3c1Jhd1ZhbHVlLkZpbmQoTCdcbicsIGlTdGFydCk7DQorICAgICAgICBpRW5kID0gKGlFbmQgPT0gLTEpID8gd3NSYXdWYWx1ZS5HZXRMZW5ndGgoKSA6IGlFbmQ7DQorICAgICAgICB3aGlsZSAoaUVuZCA+PSBpU3RhcnQpIHsNCisgICAgICAgICAgd3NTZWxUZXh0QXJyYXkuQWRkKHdzUmF3VmFsdWUuTWlkKGlTdGFydCwgaUVuZCAtIGlTdGFydCkpOw0KKyAgICAgICAgICBpU3RhcnQgPSBpRW5kICsgMTsNCisgICAgICAgICAgaWYgKGlTdGFydCA+PSB3c1Jhd1ZhbHVlLkdldExlbmd0aCgpKSB7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaUVuZCA9IHdzUmF3VmFsdWUuRmluZChMJ1xuJywgaVN0YXJ0KTsNCisgICAgICAgIH0NCisgICAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICBGWFNZU19hc3NlcnQocFBhcmVudE5vZGUpOw0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwR3JhbmRwYXJlbnROb2RlID0NCisgICAgICAgICAgICBwUGFyZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICBGWFNZU19hc3NlcnQocEdyYW5kcGFyZW50Tm9kZSk7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyBib2R5VGFnTmFtZTsNCisgICAgICAgIGJvZHlUYWdOYW1lID0gcEdyYW5kcGFyZW50Tm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKTsNCisgICAgICAgIGlmIChib2R5VGFnTmFtZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgYm9keVRhZ05hbWUgPSBGWF9XU1RSQyhMIkxpc3RCb3gxIik7DQorICAgICAgICB9DQorICAgICAgICBidWYgPDwgRlhfV1NUUkMoTCI8Iik7DQorICAgICAgICBidWYgPDwgYm9keVRhZ05hbWU7DQorICAgICAgICBidWYgPDwgRlhfV1NUUkMoTCIgeG1sbnM9XCJcIlxuPiIpOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgd3NTZWxUZXh0QXJyYXkuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgICAgYnVmIDw8IEZYX1dTVFJDKEwiPHZhbHVlXG4+Iik7DQorICAgICAgICAgIGJ1ZiA8PCBYRkFfRXhwb3J0RW5jb2RlQ29udGVudCh3c1NlbFRleHRBcnJheVtpXSk7DQorICAgICAgICAgIGJ1ZiA8PCBGWF9XU1RSQyhMIjwvdmFsdWVcbj4iKTsNCisgICAgICAgIH0NCisgICAgICAgIGJ1ZiA8PCBGWF9XU1RSQyhMIjwvIik7DQorICAgICAgICBidWYgPDwgYm9keVRhZ05hbWU7DQorICAgICAgICBidWYgPDwgRlhfV1NUUkMoTCJcbj4iKTsNCisgICAgICAgIHdzQ2hpbGRyZW4gKz0gYnVmLkdldFdpZGVTdHJpbmcoKTsNCisgICAgICAgIGJ1Zi5DbGVhcigpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NWYWx1ZSA9IHBSYXdWYWx1ZU5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUpOw0KKyAgICAgICAgd3NDaGlsZHJlbiArPSBYRkFfRXhwb3J0RW5jb2RlQ29udGVudCh3c1ZhbHVlKTsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGU6DQorICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfTm9kZUM6DQorICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfTm9kZVY6IHsNCisgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NWYWx1ZSA9IHBOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlKTsNCisgICAgICB3c0NoaWxkcmVuICs9IFhGQV9FeHBvcnRFbmNvZGVDb250ZW50KHdzVmFsdWUpOw0KKyAgICB9IGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGlmIChwTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0l0ZW1zKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUgPSBwTm9kZS0+R2V0VGVtcGxhdGVOb2RlKCk7DQorICAgICAgICBpZiAoIXBUZW1wbGF0ZU5vZGUgfHwNCisgICAgICAgICAgICBwVGVtcGxhdGVOb2RlLT5Db3VudENoaWxkcmVuKFhGQV9FTEVNRU5UX1VOS05PV04pICE9DQorICAgICAgICAgICAgICAgIHBOb2RlLT5Db3VudENoaWxkcmVuKFhGQV9FTEVNRU5UX1VOS05PV04pKSB7DQorICAgICAgICAgIGJTYXZlWE1MID0gVFJVRTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgQ0ZYX1dpZGVUZXh0QnVmIG5ld0J1ZjsNCisgICAgICBDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgIHdoaWxlIChwQ2hpbGROb2RlKSB7DQorICAgICAgICBYRkFfRGF0YUV4cG9ydGVyX1JlZ2VuZXJhdGVGb3JtRmlsZV9DaGFuZ2VkKHBDaGlsZE5vZGUsIG5ld0J1ZiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNhdmVYTUwpOw0KKyAgICAgICAgd3NDaGlsZHJlbiArPSBuZXdCdWYuR2V0V2lkZVN0cmluZygpOw0KKyAgICAgICAgbmV3QnVmLkNsZWFyKCk7DQorICAgICAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICB9DQorICAgICAgaWYgKCFiU2F2ZVhNTCAmJiAhd3NDaGlsZHJlbi5Jc0VtcHR5KCkgJiYNCisgICAgICAgICAgcE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9JdGVtcykgew0KKyAgICAgICAgd3NDaGlsZHJlbi5FbXB0eSgpOw0KKyAgICAgICAgYlNhdmVYTUwgPSBUUlVFOw0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgIHdoaWxlIChwQ2hpbGROb2RlKSB7DQorICAgICAgICAgIFhGQV9EYXRhRXhwb3J0ZXJfUmVnZW5lcmF0ZUZvcm1GaWxlX0NoYW5nZWQocENoaWxkTm9kZSwgbmV3QnVmLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTYXZlWE1MKTsNCisgICAgICAgICAgd3NDaGlsZHJlbiArPSBuZXdCdWYuR2V0V2lkZVN0cmluZygpOw0KKyAgICAgICAgICBuZXdCdWYuQ2xlYXIoKTsNCisgICAgICAgICAgcENoaWxkTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgaWYgKCF3c0NoaWxkcmVuLklzRW1wdHkoKSB8fCAhd3NBdHRycy5Jc0VtcHR5KCkgfHwNCisgICAgICBwTm9kZS0+SGFzQXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfTmFtZSkpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzRWxlbWVudDsNCisgICAgcE5vZGUtPkdldENsYXNzTmFtZSh3c0VsZW1lbnQpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c05hbWU7DQorICAgIFhGQV9TYXZlQXR0cmlidXRlKHBOb2RlLCBYRkFfQVRUUklCVVRFX05hbWUsIEZYX1dTVFJDKEwibmFtZSIpLCBUUlVFLA0KKyAgICAgICAgICAgICAgICAgICAgICB3c05hbWUpOw0KKyAgICBidWYgPDwgRlhfV1NUUkMoTCI8Iik7DQorICAgIGJ1ZiA8PCB3c0VsZW1lbnQ7DQorICAgIGJ1ZiA8PCB3c05hbWU7DQorICAgIGJ1ZiA8PCB3c0F0dHJzOw0KKyAgICBpZiAod3NDaGlsZHJlbi5Jc0VtcHR5KCkpIHsNCisgICAgICBidWYgPDwgRlhfV1NUUkMoTCJcbi8+Iik7DQorICAgIH0gZWxzZSB7DQorICAgICAgYnVmIDw8IEZYX1dTVFJDKEwiXG4+Iik7DQorICAgICAgYnVmIDw8IHdzQ2hpbGRyZW47DQorICAgICAgYnVmIDw8IEZYX1dTVFJDKEwiPC8iKTsNCisgICAgICBidWYgPDwgd3NFbGVtZW50Ow0KKyAgICAgIGJ1ZiA8PCBGWF9XU1RSQyhMIlxuPiIpOw0KKyAgICB9DQorICB9DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9EYXRhRXhwb3J0ZXJfUmVnZW5lcmF0ZUZvcm1GaWxlX0NvbnRhaW5lcigNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSwNCisgICAgSUZYX1N0cmVhbSogcFN0cmVhbSwNCisgICAgRlhfQk9PTCBiU2F2ZVhNTCA9IEZBTFNFKSB7DQorICBYRkFfRUxFTUVOVCBlRWxlbWVudCA9IHBOb2RlLT5HZXRDbGFzc0lEKCk7DQorICBpZiAoZUVsZW1lbnQgPT0gWEZBX0VMRU1FTlRfRmllbGQgfHwgZUVsZW1lbnQgPT0gWEZBX0VMRU1FTlRfRHJhdyB8fA0KKyAgICAgICFwTm9kZS0+SXNDb250YWluZXJOb2RlKCkpIHsNCisgICAgQ0ZYX1dpZGVUZXh0QnVmIGJ1ZjsNCisgICAgWEZBX0RhdGFFeHBvcnRlcl9SZWdlbmVyYXRlRm9ybUZpbGVfQ2hhbmdlZChwTm9kZSwgYnVmLCBiU2F2ZVhNTCk7DQorICAgIEZYX1NUUlNJWkUgbkxlbiA9IGJ1Zi5HZXRMZW5ndGgoKTsNCisgICAgaWYgKG5MZW4gPiAwKSB7DQorICAgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoKGNvbnN0IEZYX1dDSEFSKilidWYuR2V0QnVmZmVyKCksIG5MZW4pOw0KKyAgICB9DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nQyB3c0VsZW1lbnQ7DQorICBwTm9kZS0+R2V0Q2xhc3NOYW1lKHdzRWxlbWVudCk7DQorICBwU3RyZWFtLT5Xcml0ZVN0cmluZyhMIjwiLCAxKTsNCisgIHBTdHJlYW0tPldyaXRlU3RyaW5nKHdzRWxlbWVudC5HZXRQdHIoKSwgd3NFbGVtZW50LkdldExlbmd0aCgpKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzT3V0cHV0Ow0KKyAgWEZBX1NhdmVBdHRyaWJ1dGUocE5vZGUsIFhGQV9BVFRSSUJVVEVfTmFtZSwgRlhfV1NUUkMoTCJuYW1lIiksIFRSVUUsDQorICAgICAgICAgICAgICAgICAgICB3c091dHB1dCk7DQorICBDRlhfV2lkZVN0cmluZyB3c0F0dHJzOw0KKyAgaW50MzJfdCBpQXR0cnMgPSAwOw0KKyAgY29uc3QgdWludDhfdCogcEF0dHJzID0gWEZBX0dldEVsZW1lbnRBdHRyaWJ1dGVzKHBOb2RlLT5HZXRDbGFzc0lEKCksIGlBdHRycyk7DQorICB3aGlsZSAoaUF0dHJzLS0pIHsNCisgICAgWEZBX0xQQ0FUVFJJQlVURUlORk8gcEF0dHIgPQ0KKyAgICAgICAgWEZBX0dldEF0dHJpYnV0ZUJ5SUQoKFhGQV9BVFRSSUJVVEUpcEF0dHJzW2lBdHRyc10pOw0KKyAgICBpZiAocEF0dHItPmVOYW1lID09IFhGQV9BVFRSSUJVVEVfTmFtZSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0cjsNCisgICAgWEZBX1NhdmVBdHRyaWJ1dGUocE5vZGUsIHBBdHRyLT5lTmFtZSwgcEF0dHItPnBOYW1lLCBGQUxTRSwgd3NBdHRyKTsNCisgICAgd3NPdXRwdXQgKz0gd3NBdHRyOw0KKyAgfQ0KKyAgaWYgKCF3c091dHB1dC5Jc0VtcHR5KCkpIHsNCisgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoKGNvbnN0IEZYX1dDSEFSKil3c091dHB1dCwgd3NPdXRwdXQuR2V0TGVuZ3RoKCkpOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIGlmIChwQ2hpbGROb2RlKSB7DQorICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKEwiXG4+IiwgMik7DQorICAgIHdoaWxlIChwQ2hpbGROb2RlKSB7DQorICAgICAgWEZBX0RhdGFFeHBvcnRlcl9SZWdlbmVyYXRlRm9ybUZpbGVfQ29udGFpbmVyKHBDaGlsZE5vZGUsIHBTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTYXZlWE1MKTsNCisgICAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgfQ0KKyAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZyhMIjwvIiwgMik7DQorICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKHdzRWxlbWVudC5HZXRQdHIoKSwgd3NFbGVtZW50LkdldExlbmd0aCgpKTsNCisgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoTCJcbj4iLCAyKTsNCisgIH0gZWxzZSB7DQorICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKEwiXG4vPiIsIDMpOw0KKyAgfQ0KK30NCit2b2lkIFhGQV9EYXRhRXhwb3J0ZXJfUmVnZW5lcmF0ZUZvcm1GaWxlKENYRkFfTm9kZSogcE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfU3RyZWFtKiBwU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogcENoZWNrc3VtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVhNTCkgew0KKyAgaWYgKHBOb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfTW9kZWxOb2RlKSB7DQorICAgIHN0YXRpYyBjb25zdCBGWF9XQ0hBUiogc19wd3NUYWdOYW1lID0gTCI8Zm9ybSI7DQorICAgIHN0YXRpYyBjb25zdCBGWF9XQ0hBUiogc19wd3NDbG9zZSA9IEwiPC9mb3JtXG4+IjsNCisgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoc19wd3NUYWdOYW1lLCBGWFNZU193Y3NsZW4oc19wd3NUYWdOYW1lKSk7DQorICAgIGlmIChwQ2hlY2tzdW0gIT0gTlVMTCkgew0KKyAgICAgIHN0YXRpYyBjb25zdCBGWF9XQ0hBUiogc19wd0NoZWNrc3VtID0gTCIgY2hlY2tzdW09XCIiOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2hlY2tzdW0gPQ0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgocENoZWNrc3VtLCBGWFNZU19zdHJsZW4ocENoZWNrc3VtKSk7DQorICAgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoc19wd0NoZWNrc3VtLCBGWFNZU193Y3NsZW4oc19wd0NoZWNrc3VtKSk7DQorICAgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoKGNvbnN0IEZYX1dDSEFSKil3c0NoZWNrc3VtLCB3c0NoZWNrc3VtLkdldExlbmd0aCgpKTsNCisgICAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZyhMIlwiIiwgMSk7DQorICAgIH0NCisgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoTCIgeG1sbnM9XCIiLCBGWFNZU193Y3NsZW4oTCIgeG1sbnM9XCIiKSk7DQorICAgIGNvbnN0IEZYX1dDSEFSKiBwVVJJID0gWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Gb3JtKS0+cFVSSTsNCisgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcocFVSSSwgRlhTWVNfd2NzbGVuKHBVUkkpKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWZXJzaW9uTnVtYmVyOw0KKyAgICBYRkFfRGF0YUV4cG9ydGVyX1JlY29nbml6ZVhGQVZlcnNpb25OdW1iZXIoDQorICAgICAgICAoQ1hGQV9Ob2RlKilwTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0WEZBTm9kZShYRkFfWERQUEFDS0VUX1RlbXBsYXRlKSwNCisgICAgICAgIHdzVmVyc2lvbk51bWJlcik7DQorICAgIGlmICh3c1ZlcnNpb25OdW1iZXIuSXNFbXB0eSgpKSB7DQorICAgICAgd3NWZXJzaW9uTnVtYmVyID0gRlhfV1NUUkMoTCIyLjgiKTsNCisgICAgfQ0KKyAgICB3c1ZlcnNpb25OdW1iZXIgKz0gRlhfV1NUUkMoTCIvXCJcbj4iKTsNCisgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoKGNvbnN0IEZYX1dDSEFSKil3c1ZlcnNpb25OdW1iZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIHdzVmVyc2lvbk51bWJlci5HZXRMZW5ndGgoKSk7DQorICAgIENYRkFfTm9kZSogcENoaWxkTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgIHdoaWxlIChwQ2hpbGROb2RlKSB7DQorICAgICAgWEZBX0RhdGFFeHBvcnRlcl9SZWdlbmVyYXRlRm9ybUZpbGVfQ29udGFpbmVyKHBDaGlsZE5vZGUsIHBTdHJlYW0pOw0KKyAgICAgIHBDaGlsZE5vZGUgPSBwQ2hpbGROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICB9DQorICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKHNfcHdzQ2xvc2UsIEZYU1lTX3djc2xlbihzX3B3c0Nsb3NlKSk7DQorICB9IGVsc2Ugew0KKyAgICBYRkFfRGF0YUV4cG9ydGVyX1JlZ2VuZXJhdGVGb3JtRmlsZV9Db250YWluZXIocE5vZGUsIHBTdHJlYW0sIGJTYXZlWE1MKTsNCisgIH0NCit9DQorSVhGQV9QYWNrZXRFeHBvcnQqIElYRkFfUGFja2V0RXhwb3J0OjpDcmVhdGUoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9EQVRBRk9STUFUIGVGb3JtYXQpIHsNCisgIHJldHVybiBuZXcgQ1hGQV9EYXRhRXhwb3J0ZXIocERvY3VtZW50KTsNCit9DQorQ1hGQV9EYXRhRXhwb3J0ZXI6OkNYRkFfRGF0YUV4cG9ydGVyKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCkNCisgICAgOiBtX3BEb2N1bWVudChwRG9jdW1lbnQpIHsNCisgIEFTU0VSVChtX3BEb2N1bWVudCAhPSBOVUxMKTsNCit9DQorRlhfQk9PTCBDWEZBX0RhdGFFeHBvcnRlcjo6RXhwb3J0KElGWF9GaWxlV3JpdGUqIHBXcml0ZSkgew0KKyAgcmV0dXJuIEV4cG9ydChwV3JpdGUsIG1fcERvY3VtZW50LT5HZXRSb290KCkpOw0KK30NCitGWF9CT09MIENYRkFfRGF0YUV4cG9ydGVyOjpFeHBvcnQoSUZYX0ZpbGVXcml0ZSogcFdyaXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIHBDaGVja3N1bSkgew0KKyAgQVNTRVJUKHBXcml0ZSAhPSBOVUxMKTsNCisgIGlmIChwV3JpdGUgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBJRlhfU3RyZWFtKiBwU3RyZWFtID0gSUZYX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKA0KKyAgICAgIHBXcml0ZSwNCisgICAgICBGWF9TVFJFQU1BQ0NFU1NfVGV4dCB8IEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSB8IEZYX1NUUkVBTUFDQ0VTU19BcHBlbmQpOw0KKyAgaWYgKHBTdHJlYW0gPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBwU3RyZWFtLT5TZXRDb2RlUGFnZShGWF9DT0RFUEFHRV9VVEY4KTsNCisgIEZYX0JPT0wgYlJldCA9IEV4cG9ydChwU3RyZWFtLCBwTm9kZSwgZHdGbGFnLCBwQ2hlY2tzdW0pOw0KKyAgcFN0cmVhbS0+UmVsZWFzZSgpOw0KKyAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9EYXRhRXhwb3J0ZXI6OkV4cG9ydChJRlhfU3RyZWFtKiBwU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIHBDaGVja3N1bSkgew0KKyAgSUZERV9YTUxEb2MqIHBYTUxEb2MgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldFhNTERvYygpOw0KKyAgaWYgKHBOb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfTW9kZWxOb2RlKSB7DQorICAgIHN3aXRjaCAocE5vZGUtPkdldFBhY2tldElEKCkpIHsNCisgICAgICBjYXNlIFhGQV9YRFBQQUNLRVRfWERQOiB7DQorICAgICAgICBzdGF0aWMgY29uc3QgRlhfV0NIQVIqIHNfcHdzUHJlYW1ibGUgPQ0KKyAgICAgICAgICAgIEwiPHhkcDp4ZHAgeG1sbnM6eGRwPVwiaHR0cDovL25zLmFkb2JlLmNvbS94ZHAvXCI+IjsNCisgICAgICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKHNfcHdzUHJlYW1ibGUsIEZYU1lTX3djc2xlbihzX3B3c1ByZWFtYmxlKSk7DQorICAgICAgICBmb3IgKENYRkFfTm9kZSogcENoaWxkID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICAgICAgcENoaWxkOyBwQ2hpbGQgPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgICAgRXhwb3J0KHBTdHJlYW0sIHBDaGlsZCwgZHdGbGFnLCBwQ2hlY2tzdW0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc3RhdGljIGNvbnN0IEZYX1dDSEFSKiBzX3B3c1Bvc3RhbWJsZSA9IEwiPC94ZHA6eGRwXG4+IjsNCisgICAgICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKHNfcHdzUG9zdGFtYmxlLCBGWFNZU193Y3NsZW4oc19wd3NQb3N0YW1ibGUpKTsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0czogew0KKyAgICAgICAgSUZERV9YTUxFbGVtZW50KiBwRWxlbWVudCA9DQorICAgICAgICAgICAgKElGREVfWE1MRWxlbWVudCopcE5vZGUtPkdldFhNTE1hcHBpbmdOb2RlKCk7DQorICAgICAgICBpZiAoIXBFbGVtZW50IHx8IHBFbGVtZW50LT5HZXRUeXBlKCkgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICBGWFNZU19hc3NlcnQocERhdGFOb2RlICE9IE5VTEwpOw0KKyAgICAgICAgWEZBX0RhdGFFeHBvcnRlcl9EZWFsV2l0aERhdGFHcm91cE5vZGUocERhdGFOb2RlKTsNCisgICAgICAgIHBYTUxEb2MtPlNhdmVYTUxOb2RlKHBTdHJlYW0sIHBFbGVtZW50KTsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9Gb3JtOiB7DQorICAgICAgICBYRkFfRGF0YUV4cG9ydGVyX1JlZ2VuZXJhdGVGb3JtRmlsZShwTm9kZSwgcFN0cmVhbSwgcENoZWNrc3VtKTsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZToNCisgICAgICBkZWZhdWx0OiB7DQorICAgICAgICBJRkRFX1hNTEVsZW1lbnQqIHBFbGVtZW50ID0NCisgICAgICAgICAgICAoSUZERV9YTUxFbGVtZW50KilwTm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCisgICAgICAgIGlmICghcEVsZW1lbnQgfHwgcEVsZW1lbnQtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIHBYTUxEb2MtPlNhdmVYTUxOb2RlKHBTdHJlYW0sIHBFbGVtZW50KTsNCisgICAgICB9IGJyZWFrOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgQ1hGQV9Ob2RlKiBwRXhwb3J0Tm9kZSA9IHBOb2RlOw0KKyAgICBmb3IgKENYRkFfTm9kZSogcENoaWxkTm9kZSA9DQorICAgICAgICAgICAgIHBEYXRhTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICAgIHBDaGlsZE5vZGU7DQorICAgICAgICAgcENoaWxkTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICBpZiAocENoaWxkTm9kZSAhPSBwTm9kZSkgew0KKyAgICAgICAgcEV4cG9ydE5vZGUgPSBwRGF0YU5vZGU7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgSUZERV9YTUxFbGVtZW50KiBwRWxlbWVudCA9DQorICAgICAgICAoSUZERV9YTUxFbGVtZW50KilwRXhwb3J0Tm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCisgICAgaWYgKCFwRWxlbWVudCB8fCBwRWxlbWVudC0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgWEZBX0RhdGFFeHBvcnRlcl9EZWFsV2l0aERhdGFHcm91cE5vZGUocEV4cG9ydE5vZGUpOw0KKyAgICBwRWxlbWVudC0+U2V0U3RyaW5nKEZYX1dTVFJDKEwieG1sbnM6eGZhIiksDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfV1NUUkMoTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1kYXRhLzEuMC8iKSk7DQorICAgIHBYTUxEb2MtPlNhdmVYTUxOb2RlKHBTdHJlYW0sIHBFbGVtZW50KTsNCisgICAgcEVsZW1lbnQtPlJlbW92ZUF0dHJpYnV0ZShMInhtbG5zOnhmYSIpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgWEZBX0RhdGFFeHBvcnRlcl9EZWFsV2l0aERhdGFHcm91cE5vZGUoQ1hGQV9Ob2RlKiBwRGF0YU5vZGUpIHsNCisgIGlmICghcERhdGFOb2RlIHx8IHBEYXRhTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlDaGlsZE51bSA9IDA7DQorICBmb3IgKENYRkFfTm9kZSogcENoaWxkTm9kZSA9IHBEYXRhTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICBwQ2hpbGROb2RlOw0KKyAgICAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBpQ2hpbGROdW0rKzsNCisgICAgWEZBX0RhdGFFeHBvcnRlcl9EZWFsV2l0aERhdGFHcm91cE5vZGUocENoaWxkTm9kZSk7DQorICB9DQorICBpZiAocERhdGFOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRGF0YUdyb3VwKSB7DQorICAgIGlmIChpQ2hpbGROdW0gPiAwKSB7DQorICAgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSA9IHBEYXRhTm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCisgICAgICBGWFNZU19hc3NlcnQocFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KTsNCisgICAgICBJRkRFX1hNTEVsZW1lbnQqIHBYTUxFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCopcFhNTE5vZGU7DQorICAgICAgaWYgKHBYTUxFbGVtZW50LT5IYXNBdHRyaWJ1dGUoTCJ4ZmE6ZGF0YU5vZGUiKSkgew0KKyAgICAgICAgcFhNTEVsZW1lbnQtPlJlbW92ZUF0dHJpYnV0ZShMInhmYTpkYXRhTm9kZSIpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlID0gcERhdGFOb2RlLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgIEZYU1lTX2Fzc2VydChwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpOw0KKyAgICAgICgoSUZERV9YTUxFbGVtZW50KilwWE1MTm9kZSkNCisgICAgICAgICAgLT5TZXRTdHJpbmcoRlhfV1NUUkMoTCJ4ZmE6ZGF0YU5vZGUiKSwgRlhfV1NUUkMoTCJkYXRhR3JvdXAiKSk7DQorICAgIH0NCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X3NlcmlhbGl6ZS5oIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2RvY3VtZW50X3NlcmlhbGl6ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNmU1ZjUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfZG9jdW1lbnRfc2VyaWFsaXplLmgKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfRE9DVU1FTlRfU0VSSUFMSVpFX0hfDQorI2RlZmluZSBfWEZBX0RPQ1VNRU5UX1NFUklBTElaRV9IXw0KK2NsYXNzIENYRkFfRGF0YUltcG9ydGVyIDogcHVibGljIElYRkFfUGFja2V0SW1wb3J0IHsNCisgcHVibGljOg0KKyAgQ1hGQV9EYXRhSW1wb3J0ZXIoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKyAgdmlydHVhbCBGWF9CT09MIEltcG9ydERhdGEoSUZYX0ZpbGVSZWFkKiBwRGF0YURvY3VtZW50KTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ1hGQV9Eb2N1bWVudCogbV9wRG9jdW1lbnQ7DQorfTsNCitjbGFzcyBDWEZBX0RhdGFFeHBvcnRlciA6IHB1YmxpYyBJWEZBX1BhY2tldEV4cG9ydCB7DQorIHB1YmxpYzoNCisgIENYRkFfRGF0YUV4cG9ydGVyKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgRlhfQk9PTCBFeHBvcnQoSUZYX0ZpbGVXcml0ZSogcFdyaXRlKTsNCisgIHZpcnR1YWwgRlhfQk9PTCBFeHBvcnQoSUZYX0ZpbGVXcml0ZSogcFdyaXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWcgPSAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBwQ2hlY2tzdW0gPSBOVUxMKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgRlhfQk9PTCBFeHBvcnQoSUZYX1N0cmVhbSogcFN0cmVhbSwNCisgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcE5vZGUsDQorICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWcsDQorICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBwQ2hlY2tzdW0pOw0KKyAgQ1hGQV9Eb2N1bWVudCogbV9wRG9jdW1lbnQ7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X2FwcGFkYXB0ZXIuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9hcHBhZGFwdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjJiZWI5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9hcHBhZGFwdGVyLmNwcApAQCAtMCwwICsxLDU2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV91dGlscy5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfb2JqZWN0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2N1bWVudC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfcGFyc2VyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9zY3JpcHQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY2RhdGEuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY2xheW91dC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfbG9jYWxlbWdyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9mbTJqc2FwaS5oIg0KKyNpbmNsdWRlICJ4ZmFfZG9jdW1lbnRfbGF5b3V0X2ltcC5oIg0KKyNpbmNsdWRlICJ4ZmFfbGF5b3V0X2l0ZW1sYXlvdXQuaCINCisjaW5jbHVkZSAieGZhX2xheW91dF9wYWdlbWdyX25ldy5oIg0KKyNpbmNsdWRlICJ4ZmFfbGF5b3V0X2FwcGFkYXB0ZXIuaCINCitGWF9EV09SRCBYRkFfR2V0UmVsZXZhbnQoQ1hGQV9Ob2RlKiBwRm9ybUl0ZW0sIEZYX0RXT1JEIGR3UGFyZW50UmVsdmFudCkgew0KKyAgRlhfRFdPUkQgZHdSZWxldmFudCA9IFhGQV9MQVlPVVRTVEFUVVNfVmlld2FibGUgfCBYRkFfTEFZT1VUU1RBVFVTX1ByaW50YWJsZTsNCisgIENGWF9XaWRlU3RyaW5nQyB3c1JlbGV2YW50Ow0KKyAgaWYgKHBGb3JtSXRlbS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9SZWxldmFudCwgd3NSZWxldmFudCkpIHsNCisgICAgaWYgKHdzUmVsZXZhbnQgPT0gRlhfV1NUUkMoTCIrcHJpbnQiKSB8fCB3c1JlbGV2YW50ID09IEZYX1dTVFJDKEwicHJpbnQiKSkgew0KKyAgICAgIGR3UmVsZXZhbnQgJj0gflhGQV9MQVlPVVRTVEFUVVNfVmlld2FibGU7DQorICAgIH0gZWxzZSBpZiAod3NSZWxldmFudCA9PSBGWF9XU1RSQyhMIi1wcmludCIpKSB7DQorICAgICAgZHdSZWxldmFudCAmPSB+WEZBX0xBWU9VVFNUQVRVU19QcmludGFibGU7DQorICAgIH0NCisgIH0NCisgIGlmICghKGR3UGFyZW50UmVsdmFudCAmIFhGQV9MQVlPVVRTVEFUVVNfVmlld2FibGUpICYmDQorICAgICAgKGR3UmVsZXZhbnQgIT0gWEZBX0xBWU9VVFNUQVRVU19WaWV3YWJsZSkpIHsNCisgICAgZHdSZWxldmFudCAmPSB+WEZBX0xBWU9VVFNUQVRVU19WaWV3YWJsZTsNCisgIH0NCisgIGlmICghKGR3UGFyZW50UmVsdmFudCAmIFhGQV9MQVlPVVRTVEFUVVNfUHJpbnRhYmxlKSAmJg0KKyAgICAgIChkd1JlbGV2YW50ICE9IFhGQV9MQVlPVVRTVEFUVVNfUHJpbnRhYmxlKSkgew0KKyAgICBkd1JlbGV2YW50ICY9IH5YRkFfTEFZT1VUU1RBVFVTX1ByaW50YWJsZTsNCisgIH0NCisgIHJldHVybiBkd1JlbGV2YW50Ow0KK30NCit2b2lkIFhGQV9SZWxlYXNlTGF5b3V0SXRlbShDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtKSB7DQorICBDWEZBX0xheW91dEl0ZW0qIHBOb2RlID0gcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQorICB3aGlsZSAocE5vZGUpIHsNCisgICAgQ1hGQV9MYXlvdXRJdGVtKiBwTmV4dCA9IHBOb2RlLT5tX3BOZXh0U2libGluZzsNCisgICAgcE5vZGUtPm1fcFBhcmVudCA9IG51bGxwdHI7DQorICAgIFhGQV9SZWxlYXNlTGF5b3V0SXRlbShwTm9kZSk7DQorICAgIHBOb2RlID0gcE5leHQ7DQorICB9DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9DQorICAgICAgcExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXREb2N1bWVudCgpLT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAocExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCisgICAgcE5vdGlmeS0+T25QYWdlRXZlbnQoc3RhdGljX2Nhc3Q8Q1hGQV9Db250YWluZXJMYXlvdXRJdGVtKj4ocExheW91dEl0ZW0pLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUEFHRUVWRU5UX1BhZ2VSZW1vdmVkKTsNCisgIH0NCisgIGRlbGV0ZSBwTGF5b3V0SXRlbTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9hcHBhZGFwdGVyLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X2FwcGFkYXB0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmJkZTI0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9hcHBhZGFwdGVyLmgKQEAgLTAsMCArMSw3MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfTEFZT1VUX0FQUEFEQVBURVJfSF8NCisjZGVmaW5lIF9YRkFfTEFZT1VUX0FQUEFEQVBURVJfSF8NCitjbGFzcyBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfUGFnZUFyZWFDb250YWluZXJMYXlvdXRJdGVtIHsNCisgcHVibGljOg0KKyAgc3RhdGljIGlubGluZSBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIEdldEZpcnN0Q2hpbGQoDQorICAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSkgew0KKyAgICBpZiAocExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZVNldCkgew0KKyAgICAgIHJldHVybiAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKilwTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCisgICAgfQ0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHN0YXRpYyBpbmxpbmUgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBHZXROZXh0U2libGluZygNCisgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIHBMYXlvdXRJdGVtKSB7DQorICAgIHJldHVybiAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKilwTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmc7DQorICB9DQorICBzdGF0aWMgaW5saW5lIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogR2V0UGFyZW50KA0KKyAgICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcExheW91dEl0ZW0pIHsNCisgICAgcmV0dXJuIChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qKXBMYXlvdXRJdGVtLT5tX3BQYXJlbnQ7DQorICB9DQorfTsNCitjbGFzcyBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfQ29udGVudEFyZWFDb250YWluZXJMYXlvdXRJdGVtIHsNCisgcHVibGljOg0KKyAgc3RhdGljIGlubGluZSBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIEdldEZpcnN0Q2hpbGQoDQorICAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSkgew0KKyAgICBmb3IgKENYRkFfTGF5b3V0SXRlbSogcENoaWxkSXRlbSA9IHBMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOyBwQ2hpbGRJdGVtOw0KKyAgICAgICAgIHBDaGlsZEl0ZW0gPSBwQ2hpbGRJdGVtLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgIGlmIChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIHBDb250YWluZXIgPQ0KKyAgICAgICAgICAgICAgcENoaWxkSXRlbS0+QXNDb250YWluZXJMYXlvdXRJdGVtKCkpIHsNCisgICAgICAgIHJldHVybiBwQ29udGFpbmVyOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gbnVsbHB0cjsNCisgIH0NCisgIHN0YXRpYyBpbmxpbmUgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBHZXROZXh0U2libGluZygNCisgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIHBMYXlvdXRJdGVtKSB7DQorICAgIGZvciAoQ1hGQV9MYXlvdXRJdGVtKiBwQ2hpbGRJdGVtID0gcExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOyBwQ2hpbGRJdGVtOw0KKyAgICAgICAgIHBDaGlsZEl0ZW0gPSBwQ2hpbGRJdGVtLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgIGlmIChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIHBDb250YWluZXIgPQ0KKyAgICAgICAgICAgICAgcENoaWxkSXRlbS0+QXNDb250YWluZXJMYXlvdXRJdGVtKCkpIHsNCisgICAgICAgIHJldHVybiBwQ29udGFpbmVyOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gbnVsbHB0cjsNCisgIH0NCisgIHN0YXRpYyBpbmxpbmUgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBHZXRQYXJlbnQoDQorICAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSkgew0KKyAgICByZXR1cm4gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSopcExheW91dEl0ZW0tPm1fcFBhcmVudDsNCisgIH0NCit9Ow0KK2NsYXNzIENYRkFfVHJhdmVyc2VTdHJhdGVneV9Db250ZW50TGF5b3V0SXRlbSB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBpbmxpbmUgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogR2V0Rmlyc3RDaGlsZCgNCisgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSkgew0KKyAgICByZXR1cm4gKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOw0KKyAgfQ0KKyAgc3RhdGljIGlubGluZSBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBHZXROZXh0U2libGluZygNCisgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSkgew0KKyAgICByZXR1cm4gKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgIH0NCisgIHN0YXRpYyBpbmxpbmUgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogR2V0UGFyZW50KA0KKyAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBMYXlvdXRJdGVtKSB7DQorICAgIHJldHVybiAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcExheW91dEl0ZW0tPm1fcFBhcmVudDsNCisgIH0NCit9Ow0KK0ZYX0RXT1JEIFhGQV9HZXRSZWxldmFudChDWEZBX05vZGUqIHBGb3JtSXRlbSwgRlhfRFdPUkQgZHdQYXJlbnRSZWx2YW50KTsNCit2b2lkIFhGQV9SZWxlYXNlTGF5b3V0SXRlbShDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtKTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X2l0ZW1sYXlvdXQuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9pdGVtbGF5b3V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjk5MTA2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9pdGVtbGF5b3V0LmNwcApAQCAtMCwwICsxLDMwMjcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgPGFsZ29yaXRobT4NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfdXRpbHMuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX29iamVjdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jdW1lbnQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3BhcnNlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfc2NyaXB0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NkYXRhLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NsYXlvdXQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2xvY2FsZW1nci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZm0yanNhcGkuaCINCisjaW5jbHVkZSAieGZhX2RvY3VtZW50X2xheW91dF9pbXAuaCINCisjaW5jbHVkZSAieGZhX2xheW91dF9pdGVtbGF5b3V0LmgiDQorI2luY2x1ZGUgInhmYV9sYXlvdXRfcGFnZW1ncl9uZXcuaCINCisjaW5jbHVkZSAieGZhX2xheW91dF9hcHBhZGFwdGVyLmgiDQorQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IoQ1hGQV9Ob2RlKiBwTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dFBhZ2VNZ3IqIHBQYWdlTWdyKQ0KKyAgICA6IG1fYktlZXBCcmVha0ZpbmlzaChGQUxTRSksDQorICAgICAgbV9iSXNQcm9jZXNzS2VlcChGQUxTRSksDQorICAgICAgbV9wS2VlcEhlYWROb2RlKG51bGxwdHIpLA0KKyAgICAgIG1fcEtlZXBUYWlsTm9kZShudWxscHRyKSwNCisgICAgICBtX3BGb3JtTm9kZShwTm9kZSksDQorICAgICAgbV9wTGF5b3V0SXRlbShudWxscHRyKSwNCisjaWZkZWYgX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8NCisgICAgICBtX3BPbGRMYXlvdXRJdGVtKG51bGxwdHIpLA0KKyNlbHNlDQorICAgICAgbV9wUGFnZU1nckNyZWF0ZUl0ZW0obnVsbHB0ciksDQorI2VuZGlmDQorICAgICAgbV9wQ3VyQ2hpbGROb2RlKFhGQV9MQVlPVVRfSU5WQUxJRE5PREUpLA0KKyAgICAgIG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yKG51bGxwdHIpLA0KKyAgICAgIG1fbkN1ckNoaWxkTm9kZVN0YWdlKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX05vbmUpLA0KKyAgICAgIG1fZlVzZWRTaXplKDApLA0KKyAgICAgIG1fcFBhZ2VNZ3IocFBhZ2VNZ3IpLA0KKyAgICAgIG1fYkJyZWFrUGVuZGluZyhUUlVFKSwNCisgICAgICBtX2ZMYXN0Um93V2lkdGgoMCksDQorICAgICAgbV9mTGFzdFJvd1koMCksDQorICAgICAgbV9mV2lkdGhMaW1pdGUoMCksDQorICAgICAgbV9iVXNlSW5oZXJpYXRlZChGQUxTRSksDQorICAgICAgbV9lUHJlUHJvY2Vzc1JzKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmUpLA0KKyAgICAgIG1fYkhhc0F2YWlsSGVpZ2h0KFRSVUUpIHsNCisgIEZYU1lTX2Fzc2VydChtX3BGb3JtTm9kZSAmJiAobV9wRm9ybU5vZGUtPklzQ29udGFpbmVyTm9kZSgpIHx8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRm9ybSkpOw0KKyNpZmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KKyAgbV9wT2xkTGF5b3V0SXRlbSA9DQorICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW0qKW1fcEZvcm1Ob2RlLT5HZXRVc2VyRGF0YShYRkFfTEFZT1VUSVRFTUtFWSk7DQorI2VuZGlmDQorfQ0KK0NYRkFfQ29udGVudExheW91dEl0ZW0qIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6Q3JlYXRlQ29udGVudExheW91dEl0ZW0oDQorICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlKSB7DQorICBpZiAoIXBGb3JtTm9kZSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gTlVMTDsNCisjaWZkZWYgX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8NCisgIGlmIChtX3BPbGRMYXlvdXRJdGVtKSB7DQorICAgIHBMYXlvdXRJdGVtID0gbV9wT2xkTGF5b3V0SXRlbTsNCisgICAgbV9wT2xkTGF5b3V0SXRlbSA9IG1fcE9sZExheW91dEl0ZW0tPm1fcE5leHQ7DQorICAgIHJldHVybiBwTGF5b3V0SXRlbTsNCisgIH0NCisgIHBMYXlvdXRJdGVtID0gKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKQ0KKyAgICAgICAgICAgICAgICAgICAgLT5HZXRQYXJzZXIoKQ0KKyAgICAgICAgICAgICAgICAgICAgLT5HZXROb3RpZnkoKQ0KKyAgICAgICAgICAgICAgICAgICAgLT5PbkNyZWF0ZUxheW91dEl0ZW0ocEZvcm1Ob2RlKTsNCisjZWxzZQ0KKyAgcExheW91dEl0ZW0gPQ0KKyAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiltX3BQYWdlTWdyQ3JlYXRlSXRlbS0+RmluZE9yQ3JlYXRlTGF5b3V0SXRlbSgNCisgICAgICAgICAgcEZvcm1Ob2RlKTsNCisjZW5kaWYNCisgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBQcmV2TGF5b3V0SXRlbSA9DQorICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBGb3JtTm9kZS0+R2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVkpOw0KKyAgaWYgKHBQcmV2TGF5b3V0SXRlbSkgew0KKyAgICB3aGlsZSAocFByZXZMYXlvdXRJdGVtLT5tX3BOZXh0KSB7DQorICAgICAgcFByZXZMYXlvdXRJdGVtID0gcFByZXZMYXlvdXRJdGVtLT5tX3BOZXh0Ow0KKyAgICB9DQorICAgIHBQcmV2TGF5b3V0SXRlbS0+bV9wTmV4dCA9IHBMYXlvdXRJdGVtOw0KKyAgICBwTGF5b3V0SXRlbS0+bV9wUHJldiA9IHBQcmV2TGF5b3V0SXRlbTsNCisgIH0gZWxzZSB7DQorICAgIHBGb3JtTm9kZS0+U2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVksIHBMYXlvdXRJdGVtKTsNCisgIH0NCisgIHJldHVybiBwTGF5b3V0SXRlbTsNCit9DQorRlhfQk9PTCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkZpbmRMYXlvdXRJdGVtU3BsaXRQb3MoDQorICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBMYXlvdXRJdGVtLA0KKyAgICBGWF9GTE9BVCBmQ3VyVmVydGljYWxPZmZzZXQsDQorICAgIEZYX0ZMT0FUJiBmUHJvcG9zZWRTcGxpdFBvcywNCisgICAgRlhfQk9PTCYgYkFwcENoYW5nZSwNCisgICAgRlhfQk9PTCBiQ2FsY3VsYXRlTWFyZ2luKSB7DQorICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZTsNCisgIGlmIChmUHJvcG9zZWRTcGxpdFBvcyA+IGZDdXJWZXJ0aWNhbE9mZnNldCArIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OICYmDQorICAgICAgZlByb3Bvc2VkU3BsaXRQb3MgPD0gZkN1clZlcnRpY2FsT2Zmc2V0ICsgcExheW91dEl0ZW0tPm1fc1NpemUueSAtDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQorICAgIHN3aXRjaCAocEZvcm1Ob2RlLT5HZXRJbnRhY3QoKSkgew0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTm9uZTogew0KKyAgICAgICAgRlhfQk9PTCBiQW55Q2hhbmdlZCA9IEZBTFNFOw0KKyAgICAgICAgQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gcEZvcm1Ob2RlLT5HZXREb2N1bWVudCgpOw0KKyAgICAgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBwRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgICAgIEZYX0ZMT0FUIGZDdXJUb3BNYXJnaW4gPSAwLCBmQ3VyQm90dG9tTWFyZ2luID0gMDsNCisgICAgICAgIENYRkFfTm9kZSogcE1hcmdpbk5vZGUgPQ0KKyAgICAgICAgICAgIHBGb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfTWFyZ2luKTsNCisgICAgICAgIGlmIChwTWFyZ2luTm9kZSAmJiBiQ2FsY3VsYXRlTWFyZ2luKSB7DQorICAgICAgICAgIGZDdXJUb3BNYXJnaW4gPSBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1RvcEluc2V0KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICAgICAgICBmQ3VyQm90dG9tTWFyZ2luID0gcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Cb3R0b21JbnNldCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0JPT0wgYkNoYW5nZWQgPSBUUlVFOw0KKyAgICAgICAgd2hpbGUgKGJDaGFuZ2VkKSB7DQorICAgICAgICAgIGJDaGFuZ2VkID0gRkFMU0U7DQorICAgICAgICAgIHsNCisgICAgICAgICAgICBGWF9GTE9BVCBmUmVsU3BsaXRQb3MgPSBmUHJvcG9zZWRTcGxpdFBvcyAtIGZDdXJWZXJ0aWNhbE9mZnNldDsNCisgICAgICAgICAgICBpZiAocE5vdGlmeS0+RmluZFNwbGl0UG9zKHBGb3JtTm9kZSwgcExheW91dEl0ZW0tPkdldEluZGV4KCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUmVsU3BsaXRQb3MpKSB7DQorICAgICAgICAgICAgICBiQW55Q2hhbmdlZCA9IFRSVUU7DQorICAgICAgICAgICAgICBiQ2hhbmdlZCA9IFRSVUU7DQorICAgICAgICAgICAgICBmUHJvcG9zZWRTcGxpdFBvcyA9IGZDdXJWZXJ0aWNhbE9mZnNldCArIGZSZWxTcGxpdFBvczsNCisgICAgICAgICAgICAgIGJBcHBDaGFuZ2UgPSBUUlVFOw0KKyAgICAgICAgICAgICAgaWYgKGZQcm9wb3NlZFNwbGl0UG9zIDw9DQorICAgICAgICAgICAgICAgICAgZkN1clZlcnRpY2FsT2Zmc2V0ICsgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIEZYX0ZMT0FUIGZSZWxTcGxpdFBvcyA9IGZQcm9wb3NlZFNwbGl0UG9zIC0gZkN1ckJvdHRvbU1hcmdpbjsNCisgICAgICAgICAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwQ2hpbGRJdGVtID0NCisgICAgICAgICAgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOw0KKyAgICAgICAgICAgICAgIHBDaGlsZEl0ZW07DQorICAgICAgICAgICAgICAgcENoaWxkSXRlbSA9DQorICAgICAgICAgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKilwQ2hpbGRJdGVtLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGZDaGlsZE9mZnNldCA9DQorICAgICAgICAgICAgICAgIGZDdXJWZXJ0aWNhbE9mZnNldCArIGZDdXJUb3BNYXJnaW4gKyBwQ2hpbGRJdGVtLT5tX3NQb3MueTsNCisgICAgICAgICAgICBGWF9CT09MIGJBcHBDaGFuZ2UgPSBGQUxTRTsNCisgICAgICAgICAgICBpZiAoRmluZExheW91dEl0ZW1TcGxpdFBvcyhwQ2hpbGRJdGVtLCBmQ2hpbGRPZmZzZXQsIGZSZWxTcGxpdFBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQXBwQ2hhbmdlLCBiQ2FsY3VsYXRlTWFyZ2luKSkgew0KKyAgICAgICAgICAgICAgaWYgKGZSZWxTcGxpdFBvcyAtIGZDaGlsZE9mZnNldCA8IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OICYmDQorICAgICAgICAgICAgICAgICAgYkFwcENoYW5nZSkgew0KKyAgICAgICAgICAgICAgICBmUHJvcG9zZWRTcGxpdFBvcyA9IGZSZWxTcGxpdFBvcyAtIGZDdXJUb3BNYXJnaW47DQorICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBmUHJvcG9zZWRTcGxpdFBvcyA9IGZSZWxTcGxpdFBvcyArIGZDdXJCb3R0b21NYXJnaW47DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBiQW55Q2hhbmdlZCA9IFRSVUU7DQorICAgICAgICAgICAgICBiQ2hhbmdlZCA9IFRSVUU7DQorICAgICAgICAgICAgICBpZiAoZlByb3Bvc2VkU3BsaXRQb3MgPD0NCisgICAgICAgICAgICAgICAgICBmQ3VyVmVydGljYWxPZmZzZXQgKyBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlmIChiQW55Q2hhbmdlZCkgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBiQW55Q2hhbmdlZDsNCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWE6DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9QYWdlQXJlYTogew0KKyAgICAgICAgZlByb3Bvc2VkU3BsaXRQb3MgPSBmQ3VyVmVydGljYWxPZmZzZXQ7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitzdGF0aWMgWEZBX0FUVFJJQlVURUVOVU0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfR2V0TGF5b3V0KA0KKyAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSwNCisgICAgRlhfQk9PTCYgYlJvb3RGb3JjZVRiKSB7DQorICBiUm9vdEZvcmNlVGIgPSBGQUxTRTsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXRNb2RlOw0KKyAgaWYgKHBGb3JtTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX0xheW91dCwgZUxheW91dE1vZGUsIEZBTFNFKSkgew0KKyAgICByZXR1cm4gZUxheW91dE1vZGU7DQorICB9DQorICBDWEZBX05vZGUqIHBQYXJlbnROb2RlID0gcEZvcm1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgIGlmIChwUGFyZW50Tm9kZSAmJiBwUGFyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0Zvcm0pIHsNCisgICAgYlJvb3RGb3JjZVRiID0gVFJVRTsNCisgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX1RiOw0KKyAgfQ0KKyAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc2l0aW9uOw0KK30NCitzdGF0aWMgRlhfQk9PTCBYRkFfRXhpc3RDb250YWluZXJLZWVwKENYRkFfTm9kZSogcEN1ck5vZGUsIEZYX0JPT0wgYlByZUZpbmQpIHsNCisgIGlmIChwQ3VyTm9kZSA9PSBOVUxMIHx8ICFYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKHBDdXJOb2RlKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBYRkFfTk9ERUlURU0gZUl0ZW1UeXBlID0gWEZBX05PREVJVEVNX1ByZXZTaWJsaW5nOw0KKyAgaWYgKCFiUHJlRmluZCkgew0KKyAgICBlSXRlbVR5cGUgPSBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmc7DQorICB9DQorICBDWEZBX05vZGUqIHBQcmVDb250YWluZXIgPQ0KKyAgICAgIHBDdXJOb2RlLT5HZXROb2RlSXRlbShlSXRlbVR5cGUsIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpOw0KKyAgaWYgKHBQcmVDb250YWluZXIgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDWEZBX05vZGUqIHBLZWVwID0gcEN1ck5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0tlZXApOw0KKyAgaWYgKHBLZWVwKSB7DQorICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVQcmV2aW91czsNCisgICAgWEZBX0FUVFJJQlVURSBlS2VlcFR5cGUgPSBYRkFfQVRUUklCVVRFX1ByZXZpb3VzOw0KKyAgICBpZiAoIWJQcmVGaW5kKSB7DQorICAgICAgZUtlZXBUeXBlID0gWEZBX0FUVFJJQlVURV9OZXh0Ow0KKyAgICB9DQorICAgIGlmIChwS2VlcC0+VHJ5RW51bShlS2VlcFR5cGUsIGVQcmV2aW91cywgRkFMU0UpKSB7DQorICAgICAgaWYgKGVQcmV2aW91cyA9PSBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYSB8fA0KKyAgICAgICAgICBlUHJldmlvdXMgPT0gWEZBX0FUVFJJQlVURUVOVU1fUGFnZUFyZWEpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcEtlZXAgPSBwUHJlQ29udGFpbmVyLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9LZWVwKTsNCisgIGlmICghcEtlZXApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZU5leHQ7DQorICBYRkFfQVRUUklCVVRFIGVLZWVwVHlwZSA9IFhGQV9BVFRSSUJVVEVfTmV4dDsNCisgIGlmICghYlByZUZpbmQpIHsNCisgICAgZUtlZXBUeXBlID0gWEZBX0FUVFJJQlVURV9QcmV2aW91czsNCisgIH0NCisgIGlmICghcEtlZXAtPlRyeUVudW0oZUtlZXBUeXBlLCBlTmV4dCwgRkFMU0UpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChlTmV4dCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYSB8fA0KKyAgICAgIGVOZXh0ID09IFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VBcmVhKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9GTE9BVCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkZpbmRTcGxpdFBvcyhGWF9GTE9BVCBmUHJvcG9zZWRTcGxpdFBvcykgew0KKyAgQVNTRVJUKG1fcExheW91dEl0ZW0pOw0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZUxheW91dCA9IG1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTGF5b3V0KTsNCisgIEZYX0JPT0wgYkNhbGN1bGF0ZU1hcmdpbiA9IFRSVUU7DQorICBpZiAoZUxheW91dCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Qb3NpdGlvbikgew0KKyAgICBiQ2FsY3VsYXRlTWFyZ2luID0gRkFMU0U7DQorICB9DQorICB3aGlsZSAoZlByb3Bvc2VkU3BsaXRQb3MgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICBGWF9CT09MIGJBcHBDaGFuZ2UgPSBGQUxTRTsNCisgICAgaWYgKCFGaW5kTGF5b3V0SXRlbVNwbGl0UG9zKG1fcExheW91dEl0ZW0sIDAsIGZQcm9wb3NlZFNwbGl0UG9zLCBiQXBwQ2hhbmdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNhbGN1bGF0ZU1hcmdpbikpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGZQcm9wb3NlZFNwbGl0UG9zOw0KK30NCit2b2lkIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6U3BsaXRMYXlvdXRJdGVtKA0KKyAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSwNCisgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcFNlY29uZFBhcmVudCwNCisgICAgRlhfRkxPQVQgZlNwbGl0UG9zKSB7DQorICBGWF9GTE9BVCBmQ3VyVG9wTWFyZ2luID0gMCwgZkN1ckJvdHRvbU1hcmdpbiA9IDA7DQorICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0ID0gbV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQpOw0KKyAgRlhfQk9PTCBiQ2FsY3VsYXRlTWFyZ2luID0gVFJVRTsNCisgIGlmIChlTGF5b3V0ID09IFhGQV9BVFRSSUJVVEVFTlVNX1Bvc2l0aW9uKSB7DQorICAgIGJDYWxjdWxhdGVNYXJnaW4gPSBGQUxTRTsNCisgIH0NCisgIENYRkFfTm9kZSogcE1hcmdpbk5vZGUgPQ0KKyAgICAgIHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfTWFyZ2luKTsNCisgIGlmIChwTWFyZ2luTm9kZSAmJiBiQ2FsY3VsYXRlTWFyZ2luKSB7DQorICAgIGZDdXJUb3BNYXJnaW4gPQ0KKyAgICAgICAgcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Ub3BJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgZkN1ckJvdHRvbU1hcmdpbiA9DQorICAgICAgICBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgfQ0KKyAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcFNlY29uZExheW91dEl0ZW0gPSBOVUxMOw0KKyAgaWYgKG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yICYmDQorICAgICAgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3ItPm1fcEZvcm1Ob2RlID09IHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSkgew0KKyAgICBwU2Vjb25kTGF5b3V0SXRlbSA9IG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yLT5DcmVhdGVDb250ZW50TGF5b3V0SXRlbSgNCisgICAgICAgIHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSk7DQorICB9IGVsc2Ugew0KKyAgICBwU2Vjb25kTGF5b3V0SXRlbSA9IENyZWF0ZUNvbnRlbnRMYXlvdXRJdGVtKHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSk7DQorICB9DQorICBwU2Vjb25kTGF5b3V0SXRlbS0+bV9zUG9zLnggPSBwTGF5b3V0SXRlbS0+bV9zUG9zLng7DQorICBwU2Vjb25kTGF5b3V0SXRlbS0+bV9zU2l6ZS54ID0gcExheW91dEl0ZW0tPm1fc1NpemUueDsNCisgIHBTZWNvbmRMYXlvdXRJdGVtLT5tX3NQb3MueSA9IDA7DQorICBwU2Vjb25kTGF5b3V0SXRlbS0+bV9zU2l6ZS55ID0gcExheW91dEl0ZW0tPm1fc1NpemUueSAtIGZTcGxpdFBvczsNCisgIHBMYXlvdXRJdGVtLT5tX3NTaXplLnkgLT0gcFNlY29uZExheW91dEl0ZW0tPm1fc1NpemUueTsNCisgIGlmIChwTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZCkgew0KKyAgICBwU2Vjb25kTGF5b3V0SXRlbS0+bV9zU2l6ZS55ICs9IGZDdXJUb3BNYXJnaW47DQorICB9DQorICBpZiAocFNlY29uZFBhcmVudCkgew0KKyAgICBwU2Vjb25kUGFyZW50LT5BZGRDaGlsZChwU2Vjb25kTGF5b3V0SXRlbSk7DQorICAgIGlmIChmQ3VyVG9wTWFyZ2luID4gMCAmJiBwTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZCkgew0KKyAgICAgIHBTZWNvbmRQYXJlbnQtPm1fc1NpemUueSArPSBmQ3VyVG9wTWFyZ2luOw0KKyAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBQYXJlbnRJdGVtID0NCisgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBTZWNvbmRQYXJlbnQtPm1fcFBhcmVudDsNCisgICAgICB3aGlsZSAocFBhcmVudEl0ZW0pIHsNCisgICAgICAgIHBQYXJlbnRJdGVtLT5tX3NTaXplLnkgKz0gZkN1clRvcE1hcmdpbjsNCisgICAgICAgIHBQYXJlbnRJdGVtID0gKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBQYXJlbnRJdGVtLT5tX3BQYXJlbnQ7DQorICAgICAgfQ0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBwU2Vjb25kTGF5b3V0SXRlbS0+bV9wUGFyZW50ID0gcExheW91dEl0ZW0tPm1fcFBhcmVudDsNCisgICAgcFNlY29uZExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nID0gcExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KKyAgICBwTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcgPSBwU2Vjb25kTGF5b3V0SXRlbTsNCisgIH0NCisgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBDaGlsZHJlbiA9DQorICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOw0KKyAgcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQgPSBOVUxMOw0KKyAgRlhfRkxPQVQgbEhlaWdodEZvcktlZXAgPSAwOw0KKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSo+IGtlZXBMYXlvdXRJdGVtczsNCisgIEZYX0ZMT0FUIGZBZGRNYXJnaW5IZWlnaHQgPSAwOw0KKyAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwQ2hpbGRJdGVtID0gcENoaWxkcmVuLCAqIHBDaGlsZE5leHQgPSBOVUxMOw0KKyAgICAgICBwQ2hpbGRJdGVtOyBwQ2hpbGRJdGVtID0gcENoaWxkTmV4dCkgew0KKyAgICBwQ2hpbGROZXh0ID0gKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBDaGlsZEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KKyAgICBwQ2hpbGRJdGVtLT5tX3BOZXh0U2libGluZyA9IE5VTEw7DQorICAgIGlmIChmU3BsaXRQb3MgPD0gZkN1clRvcE1hcmdpbiArIHBDaGlsZEl0ZW0tPm1fc1Bvcy55ICsgZkN1ckJvdHRvbU1hcmdpbiArDQorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQorICAgICAgaWYgKCFYRkFfRXhpc3RDb250YWluZXJLZWVwKHBDaGlsZEl0ZW0tPm1fcEZvcm1Ob2RlLCBUUlVFKSkgew0KKyAgICAgICAgcENoaWxkSXRlbS0+bV9zUG9zLnkgLT0gZlNwbGl0UG9zIC0gZkN1ckJvdHRvbU1hcmdpbjsNCisgICAgICAgIHBDaGlsZEl0ZW0tPm1fc1Bvcy55ICs9IGxIZWlnaHRGb3JLZWVwOw0KKyAgICAgICAgcENoaWxkSXRlbS0+bV9zUG9zLnkgKz0gZkFkZE1hcmdpbkhlaWdodDsNCisgICAgICAgIHBTZWNvbmRMYXlvdXRJdGVtLT5BZGRDaGlsZChwQ2hpbGRJdGVtKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKGxIZWlnaHRGb3JLZWVwIDwgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCisgICAgICAgICAgZm9yIChpbnQzMl90IGlJbmRleCA9IDA7IGlJbmRleCA8IGtlZXBMYXlvdXRJdGVtcy5HZXRTaXplKCk7DQorICAgICAgICAgICAgICAgaUluZGV4KyspIHsNCisgICAgICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwUHJlSXRlbSA9IGtlZXBMYXlvdXRJdGVtc1tpSW5kZXhdOw0KKyAgICAgICAgICAgIHBMYXlvdXRJdGVtLT5SZW1vdmVDaGlsZChwUHJlSXRlbSk7DQorICAgICAgICAgICAgcFByZUl0ZW0tPm1fc1Bvcy55IC09IGZTcGxpdFBvczsNCisgICAgICAgICAgICBpZiAocFByZUl0ZW0tPm1fc1Bvcy55IDwgMCkgew0KKyAgICAgICAgICAgICAgcFByZUl0ZW0tPm1fc1Bvcy55ID0gMDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHBQcmVJdGVtLT5tX3NQb3MueSArIHBQcmVJdGVtLT5tX3NTaXplLnkgPiBsSGVpZ2h0Rm9yS2VlcCkgew0KKyAgICAgICAgICAgICAgcFByZUl0ZW0tPm1fc1Bvcy55ID0gbEhlaWdodEZvcktlZXA7DQorICAgICAgICAgICAgICBsSGVpZ2h0Rm9yS2VlcCArPSBwUHJlSXRlbS0+bV9zU2l6ZS55Ow0KKyAgICAgICAgICAgICAgcFNlY29uZExheW91dEl0ZW0tPm1fc1NpemUueSArPSBwUHJlSXRlbS0+bV9zU2l6ZS55Ow0KKyAgICAgICAgICAgICAgaWYgKHBTZWNvbmRQYXJlbnQpIHsNCisgICAgICAgICAgICAgICAgcFNlY29uZFBhcmVudC0+bV9zU2l6ZS55ICs9IHBQcmVJdGVtLT5tX3NTaXplLnk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBTZWNvbmRMYXlvdXRJdGVtLT5BZGRDaGlsZChwUHJlSXRlbSk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHBDaGlsZEl0ZW0tPm1fc1Bvcy55IC09IGZTcGxpdFBvczsNCisgICAgICAgIHBDaGlsZEl0ZW0tPm1fc1Bvcy55ICs9IGxIZWlnaHRGb3JLZWVwOw0KKyAgICAgICAgcENoaWxkSXRlbS0+bV9zUG9zLnkgKz0gZkFkZE1hcmdpbkhlaWdodDsNCisgICAgICAgIHBTZWNvbmRMYXlvdXRJdGVtLT5BZGRDaGlsZChwQ2hpbGRJdGVtKTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoZlNwbGl0UG9zICsgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04gPj0NCisgICAgICAgICAgICAgICBmQ3VyVG9wTWFyZ2luICsgZkN1ckJvdHRvbU1hcmdpbiArIHBDaGlsZEl0ZW0tPm1fc1Bvcy55ICsNCisgICAgICAgICAgICAgICAgICAgcENoaWxkSXRlbS0+bV9zU2l6ZS55KSB7DQorICAgICAgcExheW91dEl0ZW0tPkFkZENoaWxkKHBDaGlsZEl0ZW0pOw0KKyAgICAgIGlmIChYRkFfRXhpc3RDb250YWluZXJLZWVwKHBDaGlsZEl0ZW0tPm1fcEZvcm1Ob2RlLCBGQUxTRSkpIHsNCisgICAgICAgIGtlZXBMYXlvdXRJdGVtcy5BZGQocENoaWxkSXRlbSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGtlZXBMYXlvdXRJdGVtcy5SZW1vdmVBbGwoKTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhfRkxPQVQgZk9sZEhlaWdodCA9IHBTZWNvbmRMYXlvdXRJdGVtLT5tX3NTaXplLnk7DQorICAgICAgU3BsaXRMYXlvdXRJdGVtKA0KKyAgICAgICAgICBwQ2hpbGRJdGVtLCBwU2Vjb25kTGF5b3V0SXRlbSwNCisgICAgICAgICAgZlNwbGl0UG9zIC0gZkN1clRvcE1hcmdpbiAtIGZDdXJCb3R0b21NYXJnaW4gLSBwQ2hpbGRJdGVtLT5tX3NQb3MueSk7DQorICAgICAgZkFkZE1hcmdpbkhlaWdodCA9IHBTZWNvbmRMYXlvdXRJdGVtLT5tX3NTaXplLnkgLSBmT2xkSGVpZ2h0Ow0KKyAgICAgIHBMYXlvdXRJdGVtLT5BZGRDaGlsZChwQ2hpbGRJdGVtKTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6U3BsaXRMYXlvdXRJdGVtKEZYX0ZMT0FUIGZTcGxpdFBvcykgew0KKyAgQVNTRVJUKG1fcExheW91dEl0ZW0pOw0KKyAgU3BsaXRMYXlvdXRJdGVtKG1fcExheW91dEl0ZW0sIE5VTEwsIGZTcGxpdFBvcyk7DQorICByZXR1cm47DQorfQ0KKw0KK0lYRkFfTGF5b3V0UGFnZSogQ1hGQV9MYXlvdXRJdGVtOjpHZXRQYWdlKCkgY29uc3Qgew0KKyAgZm9yIChDWEZBX0xheW91dEl0ZW0qIHBDdXJOb2RlID0gY29uc3RfY2FzdDxDWEZBX0xheW91dEl0ZW0qPih0aGlzKTsgcEN1ck5vZGU7DQorICAgICAgIHBDdXJOb2RlID0gcEN1ck5vZGUtPm1fcFBhcmVudCkgew0KKyAgICBpZiAocEN1ck5vZGUtPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpDQorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSo+KHBDdXJOb2RlKTsNCisgIH0NCisgIHJldHVybiBudWxscHRyOw0KK30NCisNCitDWEZBX05vZGUqIENYRkFfTGF5b3V0SXRlbTo6R2V0Rm9ybU5vZGUoKSBjb25zdCB7DQorICByZXR1cm4gbV9wRm9ybU5vZGU7DQorfQ0KKw0KK3ZvaWQgQ1hGQV9MYXlvdXRJdGVtOjpHZXRSZWN0KENGWF9SZWN0RiYgcnRMYXlvdXQsIEZYX0JPT0wgYlJlbGF0aXZlKSBjb25zdCB7DQorICBBU1NFUlQobV9iSXNDb250ZW50TGF5b3V0SXRlbSk7DQorICBjb25zdCBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwVGhpcyA9DQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSo+KHRoaXMpOw0KKyAgQ0ZYX1BvaW50RiBzUG9zID0gcFRoaXMtPm1fc1BvczsNCisgIENGWF9TaXplRiBzU2l6ZSA9IHBUaGlzLT5tX3NTaXplOw0KKyAgaWYgKCFiUmVsYXRpdmUpIHsNCisgICAgZm9yIChDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gcFRoaXMtPm1fcFBhcmVudDsgcExheW91dEl0ZW07DQorICAgICAgICAgcExheW91dEl0ZW0gPSBwTGF5b3V0SXRlbS0+bV9wUGFyZW50KSB7DQorICAgICAgaWYgKENYRkFfQ29udGVudExheW91dEl0ZW0qIHBDb250ZW50ID0NCisgICAgICAgICAgICAgIHBMYXlvdXRJdGVtLT5Bc0NvbnRlbnRMYXlvdXRJdGVtKCkpIHsNCisgICAgICAgIHNQb3MgKz0gcENvbnRlbnQtPm1fc1BvczsNCisgICAgICAgIGlmIChDWEZBX05vZGUqIHBNYXJnaW5Ob2RlID0NCisgICAgICAgICAgICAgICAgcExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcygNCisgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UX01hcmdpbikpIHsNCisgICAgICAgICAgc1Bvcy5BZGQocE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQpDQorICAgICAgICAgICAgICAgICAgICAgICAuVG9Vbml0KFhGQV9VTklUX1B0KSwNCisgICAgICAgICAgICAgICAgICAgcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Ub3BJbnNldCkNCisgICAgICAgICAgICAgICAgICAgICAgIC5Ub1VuaXQoWEZBX1VOSVRfUHQpKTsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSB7DQorICAgICAgICAgIHNQb3MuQWRkKHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1gpDQorICAgICAgICAgICAgICAgICAgICAgICAuVG9Vbml0KFhGQV9VTklUX1B0KSwNCisgICAgICAgICAgICAgICAgICAgcExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfWSkNCisgICAgICAgICAgICAgICAgICAgICAgIC5Ub1VuaXQoWEZBX1VOSVRfUHQpKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9IGVsc2UgaWYgKHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpID09DQorICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcnRMYXlvdXQuU2V0KHNQb3MueCwgc1Bvcy55LCBzU2l6ZS54LCBzU2l6ZS55KTsNCit9DQorDQorQ1hGQV9MYXlvdXRJdGVtKiBDWEZBX0xheW91dEl0ZW06OkdldFBhcmVudCgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BQYXJlbnQ7DQorfQ0KKw0KK2NvbnN0IENYRkFfTGF5b3V0SXRlbSogQ1hGQV9MYXlvdXRJdGVtOjpHZXRGaXJzdCgpIGNvbnN0IHsNCisgIEFTU0VSVChtX2JJc0NvbnRlbnRMYXlvdXRJdGVtKTsNCisgIGNvbnN0IENYRkFfQ29udGVudExheW91dEl0ZW0qIHBDdXJOb2RlID0NCisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKj4odGhpcyk7DQorICB3aGlsZSAocEN1ck5vZGUtPm1fcFByZXYpIHsNCisgICAgcEN1ck5vZGUgPSBwQ3VyTm9kZS0+bV9wUHJldjsNCisgIH0NCisgIHJldHVybiBwQ3VyTm9kZTsNCit9DQorDQorQ1hGQV9MYXlvdXRJdGVtKiBDWEZBX0xheW91dEl0ZW06OkdldEZpcnN0KCkgew0KKyAgQVNTRVJUKG1fYklzQ29udGVudExheW91dEl0ZW0pOw0KKyAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcEN1ck5vZGUgPSBzdGF0aWNfY2FzdDxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKj4odGhpcyk7DQorICB3aGlsZSAocEN1ck5vZGUtPm1fcFByZXYpIHsNCisgICAgcEN1ck5vZGUgPSBwQ3VyTm9kZS0+bV9wUHJldjsNCisgIH0NCisgIHJldHVybiBwQ3VyTm9kZTsNCit9DQorDQorQ1hGQV9MYXlvdXRJdGVtKiBDWEZBX0xheW91dEl0ZW06OkdldExhc3QoKSB7DQorICBBU1NFUlQobV9iSXNDb250ZW50TGF5b3V0SXRlbSk7DQorICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwQ3VyTm9kZSA9IHN0YXRpY19jYXN0PENYRkFfQ29udGVudExheW91dEl0ZW0qPih0aGlzKTsNCisgIHdoaWxlIChwQ3VyTm9kZS0+bV9wTmV4dCkgew0KKyAgICBwQ3VyTm9kZSA9IHBDdXJOb2RlLT5tX3BOZXh0Ow0KKyAgfQ0KKyAgcmV0dXJuIHBDdXJOb2RlOw0KK30NCisNCitjb25zdCBDWEZBX0xheW91dEl0ZW0qIENYRkFfTGF5b3V0SXRlbTo6R2V0TGFzdCgpIGNvbnN0IHsNCisgIEFTU0VSVChtX2JJc0NvbnRlbnRMYXlvdXRJdGVtKTsNCisgIGNvbnN0IENYRkFfQ29udGVudExheW91dEl0ZW0qIHBDdXJOb2RlID0NCisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKj4odGhpcyk7DQorICB3aGlsZSAocEN1ck5vZGUtPm1fcE5leHQpIHsNCisgICAgcEN1ck5vZGUgPSBwQ3VyTm9kZS0+bV9wTmV4dDsNCisgIH0NCisgIHJldHVybiBwQ3VyTm9kZTsNCit9DQorDQorQ1hGQV9MYXlvdXRJdGVtKiBDWEZBX0xheW91dEl0ZW06OkdldFByZXYoKSBjb25zdCB7DQorICBBU1NFUlQobV9iSXNDb250ZW50TGF5b3V0SXRlbSk7DQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSo+KHRoaXMpLT5tX3BQcmV2Ow0KK30NCisNCitDWEZBX0xheW91dEl0ZW0qIENYRkFfTGF5b3V0SXRlbTo6R2V0TmV4dCgpIGNvbnN0IHsNCisgIEFTU0VSVChtX2JJc0NvbnRlbnRMYXlvdXRJdGVtKTsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKj4odGhpcyktPm1fcE5leHQ7DQorfQ0KKw0KK2ludDMyX3QgQ1hGQV9MYXlvdXRJdGVtOjpHZXRJbmRleCgpIGNvbnN0IHsNCisgIEFTU0VSVChtX2JJc0NvbnRlbnRMYXlvdXRJdGVtKTsNCisgIGludDMyX3QgaUluZGV4ID0gMDsNCisgIGNvbnN0IENYRkFfQ29udGVudExheW91dEl0ZW0qIHBDdXJOb2RlID0NCisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKj4odGhpcyk7DQorICB3aGlsZSAocEN1ck5vZGUtPm1fcFByZXYpIHsNCisgICAgcEN1ck5vZGUgPSBwQ3VyTm9kZS0+bV9wUHJldjsNCisgICAgKytpSW5kZXg7DQorICB9DQorICByZXR1cm4gaUluZGV4Ow0KK30NCisNCitpbnQzMl90IENYRkFfTGF5b3V0SXRlbTo6R2V0Q291bnQoKSBjb25zdCB7DQorICBBU1NFUlQobV9iSXNDb250ZW50TGF5b3V0SXRlbSk7DQorICBpbnQzMl90IGlDb3VudCA9IEdldEluZGV4KCkgKyAxOw0KKyAgY29uc3QgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcEN1ck5vZGUgPQ0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IENYRkFfQ29udGVudExheW91dEl0ZW0qPih0aGlzKTsNCisgIHdoaWxlIChwQ3VyTm9kZS0+bV9wTmV4dCkgew0KKyAgICBwQ3VyTm9kZSA9IHBDdXJOb2RlLT5tX3BOZXh0Ow0KKyAgICBpQ291bnQrKzsNCisgIH0NCisgIHJldHVybiBpQ291bnQ7DQorfQ0KKw0KK3ZvaWQgQ1hGQV9MYXlvdXRJdGVtOjpBZGRDaGlsZChDWEZBX0xheW91dEl0ZW0qIHBDaGlsZEl0ZW0pIHsNCisgIGlmIChwQ2hpbGRJdGVtLT5tX3BQYXJlbnQpIHsNCisgICAgcENoaWxkSXRlbS0+bV9wUGFyZW50LT5SZW1vdmVDaGlsZChwQ2hpbGRJdGVtKTsNCisgIH0NCisgIHBDaGlsZEl0ZW0tPm1fcFBhcmVudCA9IHRoaXM7DQorICBpZiAobV9wRmlyc3RDaGlsZCA9PSBOVUxMKSB7DQorICAgIG1fcEZpcnN0Q2hpbGQgPSBwQ2hpbGRJdGVtOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9MYXlvdXRJdGVtKiBwRXhpc3RpbmdDaGlsZEl0ZW0gPSBtX3BGaXJzdENoaWxkOw0KKyAgICB3aGlsZSAocEV4aXN0aW5nQ2hpbGRJdGVtLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgIHBFeGlzdGluZ0NoaWxkSXRlbSA9IHBFeGlzdGluZ0NoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmc7DQorICAgIH0NCisgICAgcEV4aXN0aW5nQ2hpbGRJdGVtLT5tX3BOZXh0U2libGluZyA9IHBDaGlsZEl0ZW07DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9MYXlvdXRJdGVtOjpBZGRIZWFkQ2hpbGQoQ1hGQV9MYXlvdXRJdGVtKiBwQ2hpbGRJdGVtKSB7DQorICBpZiAocENoaWxkSXRlbS0+bV9wUGFyZW50KSB7DQorICAgIHBDaGlsZEl0ZW0tPm1fcFBhcmVudC0+UmVtb3ZlQ2hpbGQocENoaWxkSXRlbSk7DQorICB9DQorICBwQ2hpbGRJdGVtLT5tX3BQYXJlbnQgPSB0aGlzOw0KKyAgaWYgKG1fcEZpcnN0Q2hpbGQgPT0gTlVMTCkgew0KKyAgICBtX3BGaXJzdENoaWxkID0gcENoaWxkSXRlbTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfTGF5b3V0SXRlbSogcEV4aXN0aW5nQ2hpbGRJdGVtID0gbV9wRmlyc3RDaGlsZDsNCisgICAgbV9wRmlyc3RDaGlsZCA9IHBDaGlsZEl0ZW07DQorICAgIG1fcEZpcnN0Q2hpbGQtPm1fcE5leHRTaWJsaW5nID0gcEV4aXN0aW5nQ2hpbGRJdGVtOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTGF5b3V0SXRlbTo6SW5zZXJ0Q2hpbGQoQ1hGQV9MYXlvdXRJdGVtKiBwQmVmb3JlSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9MYXlvdXRJdGVtKiBwQ2hpbGRJdGVtKSB7DQorICBpZiAocEJlZm9yZUl0ZW0tPm1fcFBhcmVudCAhPSB0aGlzKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChwQ2hpbGRJdGVtLT5tX3BQYXJlbnQpIHsNCisgICAgcENoaWxkSXRlbS0+bV9wUGFyZW50ID0gTlVMTDsNCisgIH0NCisgIHBDaGlsZEl0ZW0tPm1fcFBhcmVudCA9IHRoaXM7DQorICBDWEZBX0xheW91dEl0ZW0qIHBFeGlzdGluZ0NoaWxkSXRlbSA9IHBCZWZvcmVJdGVtLT5tX3BOZXh0U2libGluZzsNCisgIHBCZWZvcmVJdGVtLT5tX3BOZXh0U2libGluZyA9IHBDaGlsZEl0ZW07DQorICBwQ2hpbGRJdGVtLT5tX3BOZXh0U2libGluZyA9IHBFeGlzdGluZ0NoaWxkSXRlbTsNCit9DQordm9pZCBDWEZBX0xheW91dEl0ZW06OlJlbW92ZUNoaWxkKENYRkFfTGF5b3V0SXRlbSogcENoaWxkSXRlbSkgew0KKyAgaWYgKHBDaGlsZEl0ZW0tPm1fcFBhcmVudCAhPSB0aGlzKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChtX3BGaXJzdENoaWxkID09IHBDaGlsZEl0ZW0pIHsNCisgICAgbV9wRmlyc3RDaGlsZCA9IHBDaGlsZEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9MYXlvdXRJdGVtKiBwRXhpc3RpbmdDaGlsZEl0ZW0gPSBtX3BGaXJzdENoaWxkOw0KKyAgICB3aGlsZSAocEV4aXN0aW5nQ2hpbGRJdGVtICYmDQorICAgICAgICAgICBwRXhpc3RpbmdDaGlsZEl0ZW0tPm1fcE5leHRTaWJsaW5nICE9IHBDaGlsZEl0ZW0pIHsNCisgICAgICBwRXhpc3RpbmdDaGlsZEl0ZW0gPSBwRXhpc3RpbmdDaGlsZEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KKyAgICB9DQorICAgIGlmIChwRXhpc3RpbmdDaGlsZEl0ZW0pIHsNCisgICAgICBwRXhpc3RpbmdDaGlsZEl0ZW0tPm1fcE5leHRTaWJsaW5nID0gcENoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmc7DQorICAgIH0NCisgIH0NCisgIHBDaGlsZEl0ZW0tPm1fcE5leHRTaWJsaW5nID0gTlVMTDsNCisgIHBDaGlsZEl0ZW0tPm1fcFBhcmVudCA9IE5VTEw7DQorfQ0KK0NYRkFfQ29udGVudExheW91dEl0ZW0qIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6RXh0cmFjdExheW91dEl0ZW0oKSB7DQorICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSA9IG1fcExheW91dEl0ZW07DQorICBpZiAocExheW91dEl0ZW0pIHsNCisgICAgbV9wTGF5b3V0SXRlbSA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKilwTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmc7DQorICAgIHBMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZyA9IE5VTEw7DQorICB9DQorI2lmZGVmIF9YRkFfTEFZT1VUSVRFTV9Qcm9jZXNzQ0FDSEVfDQorICBpZiAobV9uQ3VyQ2hpbGROb2RlU3RhZ2UgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfRG9uZSAmJg0KKyAgICAgIFRvQ29udGVudExheW91dEl0ZW0obV9wT2xkTGF5b3V0SXRlbSkpIHsNCisgICAgaWYgKG1fcE9sZExheW91dEl0ZW0tPm1fcFByZXYpIHsNCisgICAgICBtX3BPbGRMYXlvdXRJdGVtLT5tX3BQcmV2LT5tX3BOZXh0ID0gTlVMTDsNCisgICAgfQ0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9DQorICAgICAgICBtX3BPbGRMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCA9DQorICAgICAgICBtX3BPbGRMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0RG9jTGF5b3V0KCk7DQorICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBPbGRMYXlvdXRJdGVtID0gbV9wT2xkTGF5b3V0SXRlbTsNCisgICAgd2hpbGUgKHBPbGRMYXlvdXRJdGVtKSB7DQorICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcE5leHRPbGRMYXlvdXRJdGVtID0gcE9sZExheW91dEl0ZW0tPm1fcE5leHQ7DQorICAgICAgcE5vdGlmeS0+T25MYXlvdXRFdmVudChwRG9jTGF5b3V0LCBwT2xkTGF5b3V0SXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MQVlPVVRFVkVOVF9JdGVtUmVtb3ZpbmcpOw0KKyAgICAgIGRlbGV0ZSBwT2xkTGF5b3V0SXRlbTsNCisgICAgICBwT2xkTGF5b3V0SXRlbSA9IHBOZXh0T2xkTGF5b3V0SXRlbTsNCisgICAgfQ0KKyAgICBtX3BPbGRMYXlvdXRJdGVtID0gTlVMTDsNCisgIH0NCisjZW5kaWYNCisgIHJldHVybiBwTGF5b3V0SXRlbTsNCit9DQorc3RhdGljIEZYX0JPT0wgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfRmluZEJyZWFrTm9kZSgNCisgICAgQ1hGQV9Ob2RlKiBwQ29udGFpbmVyTm9kZSwNCisgICAgQ1hGQV9Ob2RlKiYgcEN1ckFjdGlvbk5vZGUsDQorICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzJiBuQ3VyU3RhZ2UsDQorICAgIEZYX0JPT0wgYkJyZWFrQmVmb3JlKSB7DQorICBGWF9CT09MIGJGaW5kUnMgPSBGQUxTRTsNCisgIGZvciAoQ1hGQV9Ob2RlKiBwQnJlYWtOb2RlID0gcENvbnRhaW5lck5vZGU7IHBCcmVha05vZGU7DQorICAgICAgIHBCcmVha05vZGUgPSBwQnJlYWtOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZVR5cGUgPSBYRkFfQVRUUklCVVRFX0JlZm9yZTsNCisgICAgaWYgKCFiQnJlYWtCZWZvcmUpIHsNCisgICAgICBlQXR0cmlidXRlVHlwZSA9IFhGQV9BVFRSSUJVVEVfQWZ0ZXI7DQorICAgIH0NCisgICAgc3dpdGNoIChwQnJlYWtOb2RlLT5HZXRDbGFzc0lEKCkpIHsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0JyZWFrQmVmb3JlOiB7DQorICAgICAgICBpZiAoYkJyZWFrQmVmb3JlKSB7DQorICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlID0gcEJyZWFrTm9kZTsNCisgICAgICAgICAgbkN1clN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQnJlYWtCZWZvcmU7DQorICAgICAgICAgIGJGaW5kUnMgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CcmVha0FmdGVyOiB7DQorICAgICAgICBpZiAoIWJCcmVha0JlZm9yZSkgew0KKyAgICAgICAgICBwQ3VyQWN0aW9uTm9kZSA9IHBCcmVha05vZGU7DQorICAgICAgICAgIG5DdXJTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0JyZWFrQWZ0ZXI7DQorICAgICAgICAgIGJGaW5kUnMgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CcmVhazoNCisgICAgICAgIGlmIChwQnJlYWtOb2RlLT5HZXRFbnVtKGVBdHRyaWJ1dGVUeXBlKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9BdXRvKSB7DQorICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlID0gcEJyZWFrTm9kZTsNCisgICAgICAgICAgbkN1clN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQnJlYWtCZWZvcmU7DQorICAgICAgICAgIGlmICghYkJyZWFrQmVmb3JlKSB7DQorICAgICAgICAgICAgbkN1clN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQnJlYWtBZnRlcjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBiRmluZFJzID0gVFJVRTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChiRmluZFJzKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBiRmluZFJzOw0KK30NCisjaWZkZWYgX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8NCitzdGF0aWMgdm9pZCBYRkFfRGVsZXRlTGF5b3V0R2VuZXJhdGVkTm9kZShDWEZBX05vZGUqIHBHZW5lcmF0ZU5vZGUpIHsNCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gcEdlbmVyYXRlTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgSVhGQV9Eb2NMYXlvdXQqIHBEb2NMYXlvdXQgPSBwR2VuZXJhdGVOb2RlLT5HZXREb2N1bWVudCgpLT5HZXREb2NMYXlvdXQoKTsNCisgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBTm9kZT4gc0l0ZXJhdG9yKA0KKyAgICAgIHBHZW5lcmF0ZU5vZGUpOw0KKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcE5vZGU7DQorICAgICAgIHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwQ3VyTGF5b3V0SXRlbSA9DQorICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcE5vZGUtPkdldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZKTsNCisgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcE5leHRMYXlvdXRJdGVtID0gTlVMTDsNCisgICAgd2hpbGUgKHBDdXJMYXlvdXRJdGVtKSB7DQorICAgICAgcE5leHRMYXlvdXRJdGVtID0gcEN1ckxheW91dEl0ZW0tPm1fcE5leHQ7DQorICAgICAgcE5vdGlmeS0+T25MYXlvdXRFdmVudChwRG9jTGF5b3V0LCBwQ3VyTGF5b3V0SXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MQVlPVVRFVkVOVF9JdGVtUmVtb3ZpbmcpOw0KKyAgICAgIGRlbGV0ZSBwQ3VyTGF5b3V0SXRlbTsNCisgICAgICBwQ3VyTGF5b3V0SXRlbSA9IHBOZXh0TGF5b3V0SXRlbTsNCisgICAgfQ0KKyAgfQ0KKyAgcEdlbmVyYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCktPlJlbW92ZUNoaWxkKHBHZW5lcmF0ZU5vZGUpOw0KK30NCisjZW5kaWYNCit2b2lkIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6WEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfR290b05leHRDb250YWluZXJOb2RlKA0KKyAgICBDWEZBX05vZGUqJiBwQ3VyQWN0aW9uTm9kZSwNCisgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXMmIG5DdXJTdGFnZSwNCisgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Q29udGFpbmVyLA0KKyAgICBGWF9CT09MIGJVc2VQYWdlQnJlYWspIHsNCisgIENYRkFfTm9kZSogcEVudGlyZUNvbnRhaW5lciA9IHBQYXJlbnRDb250YWluZXI7DQorICBDWEZBX05vZGUqIHBDaGlsZENvbnRhaW5lciA9IFhGQV9MQVlPVVRfSU5WQUxJRE5PREU7DQorICBzd2l0Y2ggKG5DdXJTdGFnZSkgew0KKyAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0JyZWFrQmVmb3JlOg0KKyAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0JyZWFrQWZ0ZXI6IHsNCisgICAgICBwQ2hpbGRDb250YWluZXIgPSBwQ3VyQWN0aW9uTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfS2VlcDoNCisgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Db250YWluZXI6DQorICAgICAgcENoaWxkQ29udGFpbmVyID0gcEN1ckFjdGlvbk5vZGU7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcENoaWxkQ29udGFpbmVyID0gWEZBX0xBWU9VVF9JTlZBTElETk9ERTsNCisgICAgICBicmVhazsNCisgIH0NCisgIHN3aXRjaCAobkN1clN0YWdlKSB7DQorICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfS2VlcDogew0KKyAgICAgIENYRkFfTm9kZSogcEJyZWFrQWZ0ZXJOb2RlID0NCisgICAgICAgICAgcENoaWxkQ29udGFpbmVyLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgaWYgKCFtX2JLZWVwQnJlYWtGaW5pc2ggJiYNCisgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfRmluZEJyZWFrTm9kZShwQnJlYWtBZnRlck5vZGUsIHBDdXJBY3Rpb25Ob2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DdXJTdGFnZSwgRkFMU0UpKSB7DQorICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICAgIGdvdG8gQ2hlY2tOZXh0Q2hpbGRDb250YWluZXI7DQorICAgIH0NCisgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Ob25lOiB7DQorICAgICAgcEN1ckFjdGlvbk5vZGUgPSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFOw0KKyAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQm9va2VuZExlYWRlcjoNCisgICAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwQm9va2VuZE5vZGUgPQ0KKyAgICAgICAgICAgICAgICAgcEN1ckFjdGlvbk5vZGUgPT0gWEZBX0xBWU9VVF9JTlZBTElETk9ERQ0KKyAgICAgICAgICAgICAgICAgICAgID8gcEVudGlyZUNvbnRhaW5lci0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpDQorICAgICAgICAgICAgICAgICAgICAgOiBwQ3VyQWN0aW9uTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgICAgICAgcEJvb2tlbmROb2RlOyBwQm9va2VuZE5vZGUgPSBwQm9va2VuZE5vZGUtPkdldE5vZGVJdGVtKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICAgIHN3aXRjaCAocEJvb2tlbmROb2RlLT5HZXRDbGFzc0lEKCkpIHsNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0Jvb2tlbmQ6DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CcmVhazoNCisgICAgICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlID0gcEJvb2tlbmROb2RlOw0KKyAgICAgICAgICAgICAgbkN1clN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQm9va2VuZExlYWRlcjsNCisgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICAgIHsNCisgICAgICAgIHBDdXJBY3Rpb25Ob2RlID0gWEZBX0xBWU9VVF9JTlZBTElETk9ERTsNCisgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQnJlYWtCZWZvcmU6DQorICAgICAgICAgIGlmIChwQ3VyQWN0aW9uTm9kZSAhPSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFKSB7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQnJlYWtCZWZvcmVOb2RlID0NCisgICAgICAgICAgICAgICAgcEN1ckFjdGlvbk5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgICAgICAgaWYgKCFtX2JLZWVwQnJlYWtGaW5pc2ggJiYNCisgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfRmluZEJyZWFrTm9kZSgNCisgICAgICAgICAgICAgICAgICAgIHBCcmVha0JlZm9yZU5vZGUsIHBDdXJBY3Rpb25Ob2RlLCBuQ3VyU3RhZ2UsIFRSVUUpKSB7DQorICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChtX2JJc1Byb2Nlc3NLZWVwKSB7DQorICAgICAgICAgICAgICBpZiAoUHJvY2Vzc0tlZXBOb2Rlc0ZvckJyZWFrQmVmb3JlKHBDdXJBY3Rpb25Ob2RlLCBuQ3VyU3RhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGlsZENvbnRhaW5lcikpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgZ290byBDaGVja05leHRDaGlsZENvbnRhaW5lcjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcEN1ckFjdGlvbk5vZGUgPSBwQ2hpbGRDb250YWluZXI7DQorICAgICAgICAgICAgbkN1clN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQ29udGFpbmVyOw0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBnb3RvIENoZWNrTmV4dENoaWxkQ29udGFpbmVyOw0KKyAgICAgIH0NCisgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Db250YWluZXI6IHsNCisgICAgICBwQ3VyQWN0aW9uTm9kZSA9IFhGQV9MQVlPVVRfSU5WQUxJRE5PREU7DQorICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19CcmVha0FmdGVyOiB7DQorICAgICAgICBpZiAocEN1ckFjdGlvbk5vZGUgPT0gWEZBX0xBWU9VVF9JTlZBTElETk9ERSkgew0KKyAgICAgICAgICBDWEZBX05vZGUqIHBCcmVha0FmdGVyTm9kZSA9DQorICAgICAgICAgICAgICBwQ2hpbGRDb250YWluZXItPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICAgaWYgKCFtX2JLZWVwQnJlYWtGaW5pc2ggJiYNCisgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0ZpbmRCcmVha05vZGUoDQorICAgICAgICAgICAgICAgICAgcEJyZWFrQWZ0ZXJOb2RlLCBwQ3VyQWN0aW9uTm9kZSwgbkN1clN0YWdlLCBGQUxTRSkpIHsNCisgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIENYRkFfTm9kZSogcEJyZWFrQWZ0ZXJOb2RlID0NCisgICAgICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgICAgICBpZiAoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfRmluZEJyZWFrTm9kZSgNCisgICAgICAgICAgICAgICAgICBwQnJlYWtBZnRlck5vZGUsIHBDdXJBY3Rpb25Ob2RlLCBuQ3VyU3RhZ2UsIEZBTFNFKSkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgZ290byBDaGVja05leHRDaGlsZENvbnRhaW5lcjsNCisgICAgICB9DQorICAgIH0NCisgICAgQ2hlY2tOZXh0Q2hpbGRDb250YWluZXIgOiB7DQorICAgICAgQ1hGQV9Ob2RlKiBwTmV4dENoaWxkQ29udGFpbmVyID0NCisgICAgICAgICAgcENoaWxkQ29udGFpbmVyID09IFhGQV9MQVlPVVRfSU5WQUxJRE5PREUNCisgICAgICAgICAgICAgID8gcEVudGlyZUNvbnRhaW5lci0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpDQorICAgICAgICAgICAgICA6IHBDaGlsZENvbnRhaW5lci0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpOw0KKyAgICAgIHdoaWxlIChwTmV4dENoaWxkQ29udGFpbmVyICYmDQorICAgICAgICAgICAgIHBOZXh0Q2hpbGRDb250YWluZXItPkhhc0ZsYWcoWEZBX05PREVGTEFHX0xheW91dEdlbmVyYXRlZE5vZGUpKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBTYXZlTm9kZSA9IHBOZXh0Q2hpbGRDb250YWluZXI7DQorICAgICAgICBwTmV4dENoaWxkQ29udGFpbmVyID0gcE5leHRDaGlsZENvbnRhaW5lci0+R2V0Tm9kZUl0ZW0oDQorICAgICAgICAgICAgWEZBX05PREVJVEVNX05leHRTaWJsaW5nLCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKTsNCisjaWZkZWYgX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8NCisgICAgICAgIGlmIChwU2F2ZU5vZGUtPkhhc0ZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUpKSB7DQorICAgICAgICAgIFhGQV9EZWxldGVMYXlvdXRHZW5lcmF0ZWROb2RlKHBTYXZlTm9kZSk7DQorICAgICAgICB9DQorI2VuZGlmDQorICAgICAgfQ0KKyAgICAgIGlmICghcE5leHRDaGlsZENvbnRhaW5lcikgew0KKyAgICAgICAgZ290byBOb01vcmVDaGlsZENvbnRhaW5lcjsNCisgICAgICB9DQorICAgICAgRlhfQk9PTCBiTGFzdEtlZXAgPSBGQUxTRTsNCisgICAgICBpZiAoUHJvY2Vzc0tlZXBOb2Rlc0ZvckNoZWNrTmV4dChwQ3VyQWN0aW9uTm9kZSwgbkN1clN0YWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXh0Q2hpbGRDb250YWluZXIsIGJMYXN0S2VlcCkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgICAgaWYgKCFtX2JLZWVwQnJlYWtGaW5pc2ggJiYgIWJMYXN0S2VlcCAmJg0KKyAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9GaW5kQnJlYWtOb2RlKA0KKyAgICAgICAgICAgICAgcE5leHRDaGlsZENvbnRhaW5lci0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpLA0KKyAgICAgICAgICAgICAgcEN1ckFjdGlvbk5vZGUsIG5DdXJTdGFnZSwgVFJVRSkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgICAgcEN1ckFjdGlvbk5vZGUgPSBwTmV4dENoaWxkQ29udGFpbmVyOw0KKyAgICAgIGlmIChtX2JJc1Byb2Nlc3NLZWVwKSB7DQorICAgICAgICBuQ3VyU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19LZWVwOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBuQ3VyU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Db250YWluZXI7DQorICAgICAgfQ0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBOb01vcmVDaGlsZENvbnRhaW5lciA6IHsNCisgICAgICBwQ3VyQWN0aW9uTm9kZSA9IFhGQV9MQVlPVVRfSU5WQUxJRE5PREU7DQorICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Cb29rZW5kVHJhaWxlcjoNCisgICAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwQm9va2VuZE5vZGUgPQ0KKyAgICAgICAgICAgICAgICAgcEN1ckFjdGlvbk5vZGUgPT0gWEZBX0xBWU9VVF9JTlZBTElETk9ERQ0KKyAgICAgICAgICAgICAgICAgICAgID8gcEVudGlyZUNvbnRhaW5lci0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpDQorICAgICAgICAgICAgICAgICAgICAgOiBwQ3VyQWN0aW9uTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgICAgICAgcEJvb2tlbmROb2RlOyBwQm9va2VuZE5vZGUgPSBwQm9va2VuZE5vZGUtPkdldE5vZGVJdGVtKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICAgIHN3aXRjaCAocEJvb2tlbmROb2RlLT5HZXRDbGFzc0lEKCkpIHsNCisgICAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0Jvb2tlbmQ6DQorICAgICAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CcmVhazoNCisgICAgICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlID0gcEJvb2tlbmROb2RlOw0KKyAgICAgICAgICAgICAgbkN1clN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQm9va2VuZFRyYWlsZXI7DQorICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgZGVmYXVsdDoNCisgICAgICBwQ3VyQWN0aW9uTm9kZSA9IE5VTEw7DQorICAgICAgbkN1clN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfRG9uZTsNCisgIH0NCit9DQorRlhfQk9PTCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OlByb2Nlc3NLZWVwTm9kZXNGb3JDaGVja05leHQoDQorICAgIENYRkFfTm9kZSomIHBDdXJBY3Rpb25Ob2RlLA0KKyAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlcyYgbkN1clN0YWdlLA0KKyAgICBDWEZBX05vZGUqJiBwTmV4dENvbnRhaW5lciwNCisgICAgRlhfQk9PTCYgYkxhc3RLZWVwTm9kZSkgew0KKyAgRlhfQk9PTCBiQ2FuU3BsaXRlID0gcE5leHRDb250YWluZXItPkdldEludGFjdCgpID09IFhGQV9BVFRSSUJVVEVFTlVNX05vbmU7DQorICBGWF9CT09MIGJOZXh0S2VlcCA9IEZBTFNFOw0KKyAgaWYgKFhGQV9FeGlzdENvbnRhaW5lcktlZXAocE5leHRDb250YWluZXIsIEZBTFNFKSkgew0KKyAgICBiTmV4dEtlZXAgPSBUUlVFOw0KKyAgfQ0KKyAgaWYgKGJOZXh0S2VlcCAmJiAhYkNhblNwbGl0ZSkgew0KKyAgICBpZiAoIW1fYklzUHJvY2Vzc0tlZXAgJiYgIW1fYktlZXBCcmVha0ZpbmlzaCkgew0KKyAgICAgIG1fcEtlZXBIZWFkTm9kZSA9IHBOZXh0Q29udGFpbmVyOw0KKyAgICAgIG1fYklzUHJvY2Vzc0tlZXAgPSBUUlVFOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBpZiAobV9iSXNQcm9jZXNzS2VlcCAmJiBtX3BLZWVwSGVhZE5vZGUgIT0gTlVMTCkgew0KKyAgICAgIG1fcEtlZXBUYWlsTm9kZSA9IHBOZXh0Q29udGFpbmVyOw0KKyAgICAgIGlmICghbV9iS2VlcEJyZWFrRmluaXNoICYmDQorICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0ZpbmRCcmVha05vZGUoDQorICAgICAgICAgICAgICBwTmV4dENvbnRhaW5lci0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpLA0KKyAgICAgICAgICAgICAgcEN1ckFjdGlvbk5vZGUsIG5DdXJTdGFnZSwgVFJVRSkpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBwTmV4dENvbnRhaW5lciA9IG1fcEtlZXBIZWFkTm9kZTsNCisgICAgICAgIG1fYktlZXBCcmVha0ZpbmlzaCA9IFRSVUU7DQorICAgICAgICBtX3BLZWVwSGVhZE5vZGUgPSBOVUxMOw0KKyAgICAgICAgbV9wS2VlcFRhaWxOb2RlID0gTlVMTDsNCisgICAgICAgIG1fYklzUHJvY2Vzc0tlZXAgPSBGQUxTRTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKG1fYktlZXBCcmVha0ZpbmlzaCkgew0KKyAgICAgICAgYkxhc3RLZWVwTm9kZSA9IFRSVUU7DQorICAgICAgfQ0KKyAgICAgIG1fYktlZXBCcmVha0ZpbmlzaCA9IEZBTFNFOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpQcm9jZXNzS2VlcE5vZGVzRm9yQnJlYWtCZWZvcmUoDQorICAgIENYRkFfTm9kZSomIHBDdXJBY3Rpb25Ob2RlLA0KKyAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlcyYgbkN1clN0YWdlLA0KKyAgICBDWEZBX05vZGUqIHBDb250YWluZXJOb2RlKSB7DQorICBpZiAobV9wS2VlcFRhaWxOb2RlID09IHBDb250YWluZXJOb2RlKSB7DQorICAgIHBDdXJBY3Rpb25Ob2RlID0gbV9wS2VlcEhlYWROb2RlOw0KKyAgICBtX2JLZWVwQnJlYWtGaW5pc2ggPSBUUlVFOw0KKyAgICBtX3BLZWVwSGVhZE5vZGUgPSBOVUxMOw0KKyAgICBtX3BLZWVwVGFpbE5vZGUgPSBOVUxMOw0KKyAgICBtX2JJc1Byb2Nlc3NLZWVwID0gRkFMU0U7DQorICAgIG5DdXJTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0NvbnRhaW5lcjsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBDWEZBX05vZGUqIHBCcmVha0FmdGVyTm9kZSA9DQorICAgICAgcENvbnRhaW5lck5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIGlmIChYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9GaW5kQnJlYWtOb2RlKHBCcmVha0FmdGVyTm9kZSwgcEN1ckFjdGlvbk5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ3VyU3RhZ2UsIEZBTFNFKSkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKENYRkFfTm9kZSogcE5vZGUpIHsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVQcmVzZW5jZSA9IHBOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UpOw0KKyAgcmV0dXJuIGVQcmVzZW5jZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlIHx8DQorICAgICAgICAgZVByZXNlbmNlID09IFhGQV9BVFRSSUJVVEVFTlVNX0ludmlzaWJsZTsNCit9DQorc3RhdGljIGlubGluZSB2b2lkIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0NhbGN1bGF0ZUNvbnRhaW5lclNwZWNmaWVkU2l6ZSgNCisgICAgQ1hGQV9Ob2RlKiBwRm9ybU5vZGUsDQorICAgIEZYX0ZMT0FUJiBmQ29udGFpbmVyV2lkdGgsDQorICAgIEZYX0ZMT0FUJiBmQ29udGFpbmVySGVpZ2h0LA0KKyAgICBGWF9CT09MJiBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwNCisgICAgRlhfQk9PTCYgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplKSB7DQorICBmQ29udGFpbmVyV2lkdGggPSAwOw0KKyAgZkNvbnRhaW5lckhlaWdodCA9IDA7DQorICBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSA9IFRSVUU7DQorICBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgPSBUUlVFOw0KKyAgWEZBX0VMRU1FTlQgZUNsYXNzSUQgPSBwRm9ybU5vZGUtPkdldENsYXNzSUQoKTsNCisgIENYRkFfTWVhc3VyZW1lbnQgbVRtcFZhbHVlOw0KKyAgaWYgKGJDb250YWluZXJXaWR0aEF1dG9TaXplICYmDQorICAgICAgKGVDbGFzc0lEID09IFhGQV9FTEVNRU5UX1N1YmZvcm0gfHwgZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwKSAmJg0KKyAgICAgIHBGb3JtTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1csIG1UbXBWYWx1ZSwgRkFMU0UpICYmDQorICAgICAgbVRtcFZhbHVlLkdldFZhbHVlKCkgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICBmQ29udGFpbmVyV2lkdGggPSBtVG1wVmFsdWUuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPSBGQUxTRTsNCisgIH0NCisgIGlmIChiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgJiYNCisgICAgICAoZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSB8fCBlQ2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9FeGNsR3JvdXApICYmDQorICAgICAgcEZvcm1Ob2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfSCwgbVRtcFZhbHVlLCBGQUxTRSkgJiYNCisgICAgICBtVG1wVmFsdWUuR2V0VmFsdWUoKSA+IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQorICAgIGZDb250YWluZXJIZWlnaHQgPSBtVG1wVmFsdWUuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplID0gRkFMU0U7DQorICB9DQorICBpZiAoYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgJiYgZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSAmJg0KKyAgICAgIHBGb3JtTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX01heFcsIG1UbXBWYWx1ZSwgRkFMU0UpICYmDQorICAgICAgbVRtcFZhbHVlLkdldFZhbHVlKCkgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICBmQ29udGFpbmVyV2lkdGggPSBtVG1wVmFsdWUuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPSBGQUxTRTsNCisgIH0NCisgIGlmIChiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgJiYgZUNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSAmJg0KKyAgICAgIHBGb3JtTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX01heEgsIG1UbXBWYWx1ZSwgRkFMU0UpICYmDQorICAgICAgbVRtcFZhbHVlLkdldFZhbHVlKCkgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICBmQ29udGFpbmVySGVpZ2h0ID0gbVRtcFZhbHVlLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSA9IEZBTFNFOw0KKyAgfQ0KK30NCitzdGF0aWMgaW5saW5lIHZvaWQNCitYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9DYWxjdWxhdGVDb250YWluZXJDb21wb25lbnRTaXplRnJvbUNvbnRlbnRTaXplKA0KKyAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSwNCisgICAgRlhfQk9PTCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwNCisgICAgRlhfRkxPQVQgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGgsDQorICAgIEZYX0ZMT0FUJiBmQ29udGFpbmVyV2lkdGgsDQorICAgIEZYX0JPT0wgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLA0KKyAgICBGWF9GTE9BVCBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsDQorICAgIEZYX0ZMT0FUJiBmQ29udGFpbmVySGVpZ2h0KSB7DQorICBDWEZBX05vZGUqIHBNYXJnaW5Ob2RlID0gcEZvcm1Ob2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9NYXJnaW4pOw0KKyAgQ1hGQV9NZWFzdXJlbWVudCBtVG1wVmFsdWU7DQorICBpZiAoYkNvbnRhaW5lcldpZHRoQXV0b1NpemUpIHsNCisgICAgZkNvbnRhaW5lcldpZHRoID0gZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGg7DQorICAgIGlmIChwTWFyZ2luTm9kZSkgew0KKyAgICAgIGlmIChwTWFyZ2luTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX0xlZnRJbnNldCwgbVRtcFZhbHVlLCBGQUxTRSkpIHsNCisgICAgICAgIGZDb250YWluZXJXaWR0aCArPSBtVG1wVmFsdWUuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgICB9DQorICAgICAgaWYgKHBNYXJnaW5Ob2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUmlnaHRJbnNldCwgbVRtcFZhbHVlLCBGQUxTRSkpIHsNCisgICAgICAgIGZDb250YWluZXJXaWR0aCArPSBtVG1wVmFsdWUuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmIChiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpIHsNCisgICAgZkNvbnRhaW5lckhlaWdodCA9IGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodDsNCisgICAgaWYgKHBNYXJnaW5Ob2RlKSB7DQorICAgICAgaWYgKHBNYXJnaW5Ob2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQsIG1UbXBWYWx1ZSwgRkFMU0UpKSB7DQorICAgICAgICBmQ29udGFpbmVySGVpZ2h0ICs9IG1UbXBWYWx1ZS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICAgIH0NCisgICAgICBpZiAocE1hcmdpbk5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9Cb3R0b21JbnNldCwgbVRtcFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSkpIHsNCisgICAgICAgIGZDb250YWluZXJIZWlnaHQgKz0gbVRtcFZhbHVlLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpDYWxjdWxhdGVQb3NpdGlvbmVkQ29udGFpbmVyUG9zKA0KKyAgICBDWEZBX05vZGUqIHBOb2RlLA0KKyAgICBGWF9GTE9BVCBmV2lkdGgsDQorICAgIEZYX0ZMT0FUIGZIZWlnaHQsDQorICAgIEZYX0ZMT0FUJiBmQWJzb2x1dGVYLA0KKyAgICBGWF9GTE9BVCYgZkFic29sdXRlWSkgew0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZUFuY2hvclR5cGUgPSBwTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0FuY2hvclR5cGUpOw0KKyAgaW50MzJfdCBuQW5jaG9yVHlwZSA9IDA7DQorICBzd2l0Y2ggKGVBbmNob3JUeXBlKSB7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9wTGVmdDoNCisgICAgICBuQW5jaG9yVHlwZSA9IDA7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9wQ2VudGVyOg0KKyAgICAgIG5BbmNob3JUeXBlID0gMTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub3BSaWdodDoNCisgICAgICBuQW5jaG9yVHlwZSA9IDI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlTGVmdDoNCisgICAgICBuQW5jaG9yVHlwZSA9IDM7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlQ2VudGVyOg0KKyAgICAgIG5BbmNob3JUeXBlID0gNDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGVSaWdodDoNCisgICAgICBuQW5jaG9yVHlwZSA9IDU7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tTGVmdDoNCisgICAgICBuQW5jaG9yVHlwZSA9IDY7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tQ2VudGVyOg0KKyAgICAgIG5BbmNob3JUeXBlID0gNzsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b21SaWdodDoNCisgICAgICBuQW5jaG9yVHlwZSA9IDg7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICBzdGF0aWMgY29uc3QgdWludDhfdCBuTmV4dFBvc1s0XVs5XSA9IHt7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOH0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NiwgMywgMCwgNywgNCwgMSwgOCwgNSwgMn0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7OCwgNywgNiwgNSwgNCwgMywgMiwgMSwgMH0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MiwgNSwgOCwgMSwgNCwgNywgMCwgMywgNn19Ow0KKw0KKyAgRlhfRkxPQVQgZkFuY2hvclggPSBwTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1gpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICBGWF9GTE9BVCBmQW5jaG9yWSA9IHBOb2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfWSkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgIGludDMyX3QgblJvdGF0ZSA9DQorICAgICAgRlhTWVNfcm91bmQocE5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Sb3RhdGUpLkdldFZhbHVlKCkpOw0KKyAgblJvdGF0ZSA9IFhGQV9NYXBSb3RhdGlvbihuUm90YXRlKSAvIDkwOw0KKyAgaW50MzJfdCBuQWJzb2x1dGVBbmNob3JUeXBlID0gbk5leHRQb3NbblJvdGF0ZV1bbkFuY2hvclR5cGVdOw0KKyAgZkFic29sdXRlWCA9IGZBbmNob3JYOw0KKyAgZkFic29sdXRlWSA9IGZBbmNob3JZOw0KKyAgc3dpdGNoIChuQWJzb2x1dGVBbmNob3JUeXBlIC8gMykgew0KKyAgICBjYXNlIDE6DQorICAgICAgZkFic29sdXRlWSAtPSBmSGVpZ2h0IC8gMjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAyOg0KKyAgICAgIGZBYnNvbHV0ZVkgLT0gZkhlaWdodDsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIHN3aXRjaCAobkFic29sdXRlQW5jaG9yVHlwZSAlIDMpIHsNCisgICAgY2FzZSAxOg0KKyAgICAgIGZBYnNvbHV0ZVggLT0gZldpZHRoIC8gMjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSAyOg0KKyAgICAgIGZBYnNvbHV0ZVggLT0gZldpZHRoOw0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KK30NCitGWF9CT09MIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6SW5jcmVtZW50UmVsYXlvdXROb2RlKA0KKyAgICBDWEZBX0xheW91dFByb2Nlc3NvciogcExheW91dFByb2Nlc3NvciwNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSwNCisgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSkgew0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6RG9MYXlvdXRQYWdlQXJlYSgNCisgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwUGFnZUFyZWFMYXlvdXRJdGVtKSB7DQorICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IHBQYWdlQXJlYUxheW91dEl0ZW0tPm1fcEZvcm1Ob2RlOw0KKyAgQ1hGQV9Ob2RlKiBwQ3VyQ2hpbGROb2RlID0gWEZBX0xBWU9VVF9JTlZBTElETk9ERTsNCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzIG5DdXJDaGlsZE5vZGVTdGFnZSA9DQorICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfTm9uZTsNCisgIENYRkFfTGF5b3V0SXRlbSogcEJlZm9yZUl0ZW0gPSBOVUxMOw0KKyAgZm9yIChYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Hb3RvTmV4dENvbnRhaW5lck5vZGUoDQorICAgICAgICAgICBwQ3VyQ2hpbGROb2RlLCBuQ3VyQ2hpbGROb2RlU3RhZ2UsIHBGb3JtTm9kZSwgRkFMU0UpOw0KKyAgICAgICBwQ3VyQ2hpbGROb2RlOyBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Hb3RvTmV4dENvbnRhaW5lck5vZGUoDQorICAgICAgICAgICBwQ3VyQ2hpbGROb2RlLCBuQ3VyQ2hpbGROb2RlU3RhZ2UsIHBGb3JtTm9kZSwgRkFMU0UpKSB7DQorICAgIGlmIChuQ3VyQ2hpbGROb2RlU3RhZ2UgIT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQ29udGFpbmVyKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKHBDdXJDaGlsZE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9WYXJpYWJsZXMpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBQcm9jZXNzb3IgPQ0KKyAgICAgICAgbmV3IENYRkFfSXRlbUxheW91dFByb2Nlc3NvcihwQ3VyQ2hpbGROb2RlLCBOVUxMKTsNCisjaWZuZGVmIF9YRkFfTEFZT1VUSVRFTV9Qcm9jZXNzQ0FDSEVfDQorICAgIHBQcm9jZXNzb3ItPm1fcFBhZ2VNZ3JDcmVhdGVJdGVtID0gbV9wUGFnZU1nckNyZWF0ZUl0ZW07DQorI2VuZGlmDQorICAgIHBQcm9jZXNzb3ItPkRvTGF5b3V0KEZBTFNFLCBYRkFfTEFZT1VUX0ZMT0FUX01BWCk7DQorICAgIGlmICghcFByb2Nlc3Nvci0+SGFzTGF5b3V0SXRlbSgpKSB7DQorICAgICAgZGVsZXRlIHBQcm9jZXNzb3I7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZldpZHRoLCBmSGVpZ2h0Ow0KKyAgICBwUHJvY2Vzc29yLT5HZXRDdXJyZW50Q29tcG9uZW50U2l6ZShmV2lkdGgsIGZIZWlnaHQpOw0KKyAgICBGWF9GTE9BVCBmQWJzb2x1dGVYID0gMCwgZkFic29sdXRlWSA9IDA7DQorICAgIENhbGN1bGF0ZVBvc2l0aW9uZWRDb250YWluZXJQb3MocEN1ckNoaWxkTm9kZSwgZldpZHRoLCBmSGVpZ2h0LCBmQWJzb2x1dGVYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZBYnNvbHV0ZVkpOw0KKyAgICBwUHJvY2Vzc29yLT5TZXRDdXJyZW50Q29tcG9uZW50UG9zKGZBYnNvbHV0ZVgsIGZBYnNvbHV0ZVkpOw0KKyAgICBDWEZBX0xheW91dEl0ZW0qIHBQcm9jZXNzSXRlbSA9IHBQcm9jZXNzb3ItPkV4dHJhY3RMYXlvdXRJdGVtKCk7DQorICAgIGlmIChwQmVmb3JlSXRlbSA9PSBOVUxMKSB7DQorICAgICAgcFBhZ2VBcmVhTGF5b3V0SXRlbS0+QWRkSGVhZENoaWxkKHBQcm9jZXNzSXRlbSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgcFBhZ2VBcmVhTGF5b3V0SXRlbS0+SW5zZXJ0Q2hpbGQocEJlZm9yZUl0ZW0sIHBQcm9jZXNzSXRlbSk7DQorICAgIH0NCisgICAgcEJlZm9yZUl0ZW0gPSBwUHJvY2Vzc0l0ZW07DQorICAgIGRlbGV0ZSBwUHJvY2Vzc29yOw0KKyAgfQ0KKyAgcEJlZm9yZUl0ZW0gPSBOVUxMOw0KKyAgQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSA9IHBQYWdlQXJlYUxheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQorICB3aGlsZSAocExheW91dEl0ZW0pIHsNCisgICAgaWYgKCFwTGF5b3V0SXRlbS0+SXNDb250ZW50TGF5b3V0SXRlbSgpIHx8DQorICAgICAgICBwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9EcmF3KSB7DQorICAgICAgcExheW91dEl0ZW0gPSBwTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmc7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0RyYXcpIHsNCisgICAgICBDWEZBX0xheW91dEl0ZW0qIHBOZXh0TGF5b3V0SXRlbSA9IHBMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgICAgICBwUGFnZUFyZWFMYXlvdXRJdGVtLT5SZW1vdmVDaGlsZChwTGF5b3V0SXRlbSk7DQorICAgICAgaWYgKHBCZWZvcmVJdGVtID09IE5VTEwpIHsNCisgICAgICAgIHBQYWdlQXJlYUxheW91dEl0ZW0tPkFkZEhlYWRDaGlsZChwTGF5b3V0SXRlbSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHBQYWdlQXJlYUxheW91dEl0ZW0tPkluc2VydENoaWxkKHBCZWZvcmVJdGVtLCBwTGF5b3V0SXRlbSk7DQorICAgICAgfQ0KKyAgICAgIHBCZWZvcmVJdGVtID0gcExheW91dEl0ZW07DQorICAgICAgcExheW91dEl0ZW0gPSBwTmV4dExheW91dEl0ZW07DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkRvTGF5b3V0UG9zaXRpb25lZENvbnRhaW5lcigNCisgICAgQ1hGQV9MYXlvdXRDb250ZXh0KiBwQ29udGV4dCkgew0KKyAgaWYgKG1fcExheW91dEl0ZW0gIT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBtX3BMYXlvdXRJdGVtID0gQ3JlYXRlQ29udGVudExheW91dEl0ZW0obV9wRm9ybU5vZGUpOw0KKyAgRlhfQk9PTCBiSWdub3JlWFkgPSAobV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQpICE9DQorICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTV9Qb3NpdGlvbik7DQorICBGWF9GTE9BVCBmQ29udGFpbmVyV2lkdGggPSAwLCBmQ29udGFpbmVySGVpZ2h0ID0gMDsNCisgIEZYX0JPT0wgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPSBUUlVFLCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgPSBUUlVFOw0KKyAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQ2FsY3VsYXRlQ29udGFpbmVyU3BlY2ZpZWRTaXplKA0KKyAgICAgIG1fcEZvcm1Ob2RlLCBmQ29udGFpbmVyV2lkdGgsIGZDb250YWluZXJIZWlnaHQsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLA0KKyAgICAgIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSk7DQorICBGWF9GTE9BVCBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9IDAsIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA9IDA7DQorICBGWF9GTE9BVCBmSGlkZGVuQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9IDAsDQorICAgICAgICAgICBmSGlkZGVuQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSAwOw0KKyAgaWYgKG1fcEN1ckNoaWxkTm9kZSA9PSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFKSB7DQorICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0dvdG9OZXh0Q29udGFpbmVyTm9kZSgNCisgICAgICAgIG1fcEN1ckNoaWxkTm9kZSwgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UsIG1fcEZvcm1Ob2RlLCBGQUxTRSk7DQorICB9DQorICBpbnQzMl90IGlDb2xJbmRleCA9IDA7DQorICBmb3IgKDsgbV9wQ3VyQ2hpbGROb2RlOyBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Hb3RvTmV4dENvbnRhaW5lck5vZGUoDQorICAgICAgICAgICBtX3BDdXJDaGlsZE5vZGUsIG1fbkN1ckNoaWxkTm9kZVN0YWdlLCBtX3BGb3JtTm9kZSwgRkFMU0UpKSB7DQorICAgIGlmIChtX25DdXJDaGlsZE5vZGVTdGFnZSAhPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Db250YWluZXIpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAobV9wQ3VyQ2hpbGROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfVmFyaWFibGVzKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBwUHJvY2Vzc29yID0NCisgICAgICAgIG5ldyBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IobV9wQ3VyQ2hpbGROb2RlLCBtX3BQYWdlTWdyKTsNCisjaWZuZGVmIF9YRkFfTEFZT1VUSVRFTV9Qcm9jZXNzQ0FDSEVfDQorICAgIHBQcm9jZXNzb3ItPm1fcFBhZ2VNZ3JDcmVhdGVJdGVtID0gbV9wUGFnZU1nckNyZWF0ZUl0ZW07DQorI2VuZGlmDQorICAgIGlmIChwQ29udGV4dCAmJiBwQ29udGV4dC0+bV9wcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMpIHsNCisgICAgICBpbnQzMl90IGlDb2xTcGFuID0gbV9wQ3VyQ2hpbGROb2RlLT5HZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfQ29sU3Bhbik7DQorICAgICAgaWYgKGlDb2xTcGFuIDw9DQorICAgICAgICAgIHBDb250ZXh0LT5tX3ByZ1NwZWNpZmllZENvbHVtbldpZHRocy0+R2V0U2l6ZSgpIC0gaUNvbEluZGV4KSB7DQorICAgICAgICBwQ29udGV4dC0+bV9mQ3VyQ29sdW1uV2lkdGggPSAwOw0KKyAgICAgICAgcENvbnRleHQtPm1fYkN1ckNvbHVtbldpZHRoQXZhaWFibGUgPSBUUlVFOw0KKyAgICAgICAgaWYgKGlDb2xTcGFuID09IC0xKSB7DQorICAgICAgICAgIGlDb2xTcGFuID0gcENvbnRleHQtPm1fcHJnU3BlY2lmaWVkQ29sdW1uV2lkdGhzLT5HZXRTaXplKCk7DQorICAgICAgICB9DQorICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ29sU3BhbjsgaSsrKSB7DQorICAgICAgICAgIHBDb250ZXh0LT5tX2ZDdXJDb2x1bW5XaWR0aCArPQ0KKyAgICAgICAgICAgICAgcENvbnRleHQtPm1fcHJnU3BlY2lmaWVkQ29sdW1uV2lkdGhzLT5HZXRBdChpQ29sSW5kZXggKyBpKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwQ29udGV4dC0+bV9mQ3VyQ29sdW1uV2lkdGggPT0gMCkgew0KKyAgICAgICAgICBwQ29udGV4dC0+bV9iQ3VyQ29sdW1uV2lkdGhBdmFpYWJsZSA9IEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaUNvbEluZGV4ICs9IGlDb2xTcGFuOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBwUHJvY2Vzc29yLT5Eb0xheW91dChGQUxTRSwgWEZBX0xBWU9VVF9GTE9BVF9NQVgsIFhGQV9MQVlPVVRfRkxPQVRfTUFYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCk7DQorICAgIGlmICghcFByb2Nlc3Nvci0+SGFzTGF5b3V0SXRlbSgpKSB7DQorICAgICAgZGVsZXRlIHBQcm9jZXNzb3I7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZldpZHRoLCBmSGVpZ2h0Ow0KKyAgICBwUHJvY2Vzc29yLT5HZXRDdXJyZW50Q29tcG9uZW50U2l6ZShmV2lkdGgsIGZIZWlnaHQpOw0KKyAgICBGWF9CT09MIGJDaGFuZ2VQYXJlbnRTaXplID0gRkFMU0U7DQorICAgIGlmIChYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKG1fcEN1ckNoaWxkTm9kZSkpIHsNCisgICAgICBiQ2hhbmdlUGFyZW50U2l6ZSA9IFRSVUU7DQorICAgIH0NCisgICAgRlhfRkxPQVQgZkFic29sdXRlWCA9IDAsIGZBYnNvbHV0ZVkgPSAwOw0KKyAgICBpZiAoIWJJZ25vcmVYWSkgew0KKyAgICAgIENhbGN1bGF0ZVBvc2l0aW9uZWRDb250YWluZXJQb3MobV9wQ3VyQ2hpbGROb2RlLCBmV2lkdGgsIGZIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQWJzb2x1dGVYLCBmQWJzb2x1dGVZKTsNCisgICAgfQ0KKyAgICBwUHJvY2Vzc29yLT5TZXRDdXJyZW50Q29tcG9uZW50UG9zKGZBYnNvbHV0ZVgsIGZBYnNvbHV0ZVkpOw0KKyAgICBpZiAoYkNvbnRhaW5lcldpZHRoQXV0b1NpemUpIHsNCisgICAgICBGWF9GTE9BVCBmQ2hpbGRTdXBwbGllZFdpZHRoID0gZkFic29sdXRlWCArIGZXaWR0aDsNCisgICAgICBpZiAoYkNoYW5nZVBhcmVudFNpemUpIHsNCisgICAgICAgIGlmIChmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA8IGZDaGlsZFN1cHBsaWVkV2lkdGgpIHsNCisgICAgICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSBmQ2hpbGRTdXBwbGllZFdpZHRoOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAoZkhpZGRlbkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPCBmQ2hpbGRTdXBwbGllZFdpZHRoICYmDQorICAgICAgICAgICAgbV9wQ3VyQ2hpbGROb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgew0KKyAgICAgICAgICBmSGlkZGVuQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9IGZDaGlsZFN1cHBsaWVkV2lkdGg7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpIHsNCisgICAgICBGWF9GTE9BVCBmQ2hpbGRTdXBwbGllZEhlaWdodCA9IGZBYnNvbHV0ZVkgKyBmSGVpZ2h0Ow0KKyAgICAgIGlmIChiQ2hhbmdlUGFyZW50U2l6ZSkgew0KKyAgICAgICAgaWYgKGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA8IGZDaGlsZFN1cHBsaWVkSGVpZ2h0KSB7DQorICAgICAgICAgIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA9IGZDaGlsZFN1cHBsaWVkSGVpZ2h0Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAoZkhpZGRlbkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0IDwgZkNoaWxkU3VwcGxpZWRIZWlnaHQgJiYNCisgICAgICAgICAgICBtX3BDdXJDaGlsZE5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9TdWJmb3JtKSB7DQorICAgICAgICAgIGZIaWRkZW5Db250ZW50Q2FsY3VsYXRlZEhlaWdodCA9IGZDaGlsZFN1cHBsaWVkSGVpZ2h0Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBtX3BMYXlvdXRJdGVtLT5BZGRDaGlsZChwUHJvY2Vzc29yLT5FeHRyYWN0TGF5b3V0SXRlbSgpKTsNCisgICAgZGVsZXRlIHBQcm9jZXNzb3I7DQorICB9DQorICBYRkFfVkVSU0lPTiBlVmVyc2lvbiA9IG1fcEZvcm1Ob2RlLT5HZXREb2N1bWVudCgpLT5HZXRDdXJWZXJzaW9uTW9kZSgpOw0KKyAgaWYgKGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoID09IDAgJiYgZVZlcnNpb24gPCBYRkFfVkVSU0lPTl8yMDcpIHsNCisgICAgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSBmSGlkZGVuQ29udGVudENhbGN1bGF0ZWRXaWR0aDsNCisgIH0NCisgIGlmIChmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPT0gMCAmJiBlVmVyc2lvbiA8IFhGQV9WRVJTSU9OXzIwNykgew0KKyAgICBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSBmSGlkZGVuQ29udGVudENhbGN1bGF0ZWRIZWlnaHQ7DQorICB9DQorICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9DYWxjdWxhdGVDb250YWluZXJDb21wb25lbnRTaXplRnJvbUNvbnRlbnRTaXplKA0KKyAgICAgIG1fcEZvcm1Ob2RlLCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGgsDQorICAgICAgZkNvbnRhaW5lcldpZHRoLCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCwNCisgICAgICBmQ29udGFpbmVySGVpZ2h0KTsNCisgIFNldEN1cnJlbnRDb21wb25lbnRTaXplKGZDb250YWluZXJXaWR0aCwgZkNvbnRhaW5lckhlaWdodCk7DQorfQ0KK3N0YXRpYyBpbmxpbmUgdm9pZCBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9VcGRhdGVXaWRnZXRTaXplKA0KKyAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSwNCisgICAgRlhfRkxPQVQmIGZXaWR0aCwNCisgICAgRlhfRkxPQVQmIGZIZWlnaHQpIHsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGU7DQorICBBU1NFUlQocE5vZGUpOw0KKyAgWEZBX0VMRU1FTlQgZUNsYXNzSUQgPSBwTm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgc3dpdGNoIChlQ2xhc3NJRCkgew0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX1N1YmZvcm06DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfQXJlYToNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9FeGNsR3JvdXA6DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfU3ViZm9ybVNldDogew0KKyAgICAgIGlmIChmV2lkdGggPCAtWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCisgICAgICAgIGZXaWR0aCA9IHBMYXlvdXRJdGVtLT5tX3NTaXplLng7DQorICAgICAgfQ0KKyAgICAgIGlmIChmSGVpZ2h0IDwgLVhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQorICAgICAgICBmSGVpZ2h0ID0gcExheW91dEl0ZW0tPm1fc1NpemUueTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgY2FzZSBYRkFfRUxFTUVOVF9EcmF3Og0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0ZpZWxkOiB7DQorICAgICAgcE5vZGUtPkdldERvY3VtZW50KCktPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKS0+U3RhcnRGaWVsZERyYXdMYXlvdXQoDQorICAgICAgICAgIHBOb2RlLCBmV2lkdGgsIGZIZWlnaHQpOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6DQorICAgICAgQVNTRVJUKEZBTFNFKTsNCisgIH0NCit9DQorc3RhdGljIGlubGluZSB2b2lkIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX1JlbG9jYXRlVGFibGVSb3dDZWxscygNCisgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcExheW91dFJvdywNCisgICAgY29uc3QgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfRkxPQVQ+JiByZ1NwZWNpZmllZENvbHVtbldpZHRocywNCisgICAgWEZBX0FUVFJJQlVURUVOVU0gZUxheW91dCkgew0KKyAgRlhfRkxPQVQgZkNvbnRhaW5lcldpZHRoID0gMCwgZkNvbnRhaW5lckhlaWdodCA9IDA7DQorICBGWF9CT09MIGJDb250YWluZXJXaWR0aEF1dG9TaXplID0gVFJVRSwgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplID0gVFJVRTsNCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0NhbGN1bGF0ZUNvbnRhaW5lclNwZWNmaWVkU2l6ZSgNCisgICAgICBwTGF5b3V0Um93LT5tX3BGb3JtTm9kZSwgZkNvbnRhaW5lcldpZHRoLCBmQ29udGFpbmVySGVpZ2h0LA0KKyAgICAgIGJDb250YWluZXJXaWR0aEF1dG9TaXplLCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpOw0KKyAgQ1hGQV9Ob2RlKiBwTWFyZ2luTm9kZSA9DQorICAgICAgcExheW91dFJvdy0+bV9wRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX01hcmdpbik7DQorICBGWF9GTE9BVCBmTGVmdEluc2V0ID0gMCwgZlRvcEluc2V0ID0gMCwgZlJpZ2h0SW5zZXQgPSAwLCBmQm90dG9tSW5zZXQgPSAwOw0KKyAgaWYgKHBNYXJnaW5Ob2RlKSB7DQorICAgIGZMZWZ0SW5zZXQgPQ0KKyAgICAgICAgcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgIGZUb3BJbnNldCA9DQorICAgICAgICBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1RvcEluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICBmUmlnaHRJbnNldCA9DQorICAgICAgICBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1JpZ2h0SW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgIGZCb3R0b21JbnNldCA9DQorICAgICAgICBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZkNvbnRlbnRXaWR0aExpbWl0ID0NCisgICAgICBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSA/IFhGQV9MQVlPVVRfRkxPQVRfTUFYDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmQ29udGFpbmVyV2lkdGggLSBmTGVmdEluc2V0IC0gZlJpZ2h0SW5zZXQ7DQorICBGWF9GTE9BVCBmQ29udGVudEN1cnJlbnRIZWlnaHQgPQ0KKyAgICAgIHBMYXlvdXRSb3ctPm1fc1NpemUueSAtIGZUb3BJbnNldCAtIGZCb3R0b21JbnNldDsNCisgIEZYX0ZMT0FUIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoID0gMCwgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0gMDsNCisgIEZYX0ZMT0FUIGZDdXJyZW50Q29sWCA9IDA7DQorICBpbnQzMl90IG5DdXJyZW50Q29sSWR4ID0gMDsNCisgIEZYX0JPT0wgYk1ldFdob2xlUm93Q2VsbCA9IEZBTFNFOw0KKyAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwTGF5b3V0Q2hpbGQgPQ0KKyAgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBMYXlvdXRSb3ctPm1fcEZpcnN0Q2hpbGQ7DQorICAgICAgIHBMYXlvdXRDaGlsZDsNCisgICAgICAgcExheW91dENoaWxkID0gKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBMYXlvdXRDaGlsZC0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgaW50MzJfdCBuT3JpZ2luYWxDb2xTcGFuID0NCisgICAgICAgIHBMYXlvdXRDaGlsZC0+bV9wRm9ybU5vZGUtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9Db2xTcGFuKTsNCisgICAgaW50MzJfdCBuQ29sU3BhbiA9IG5PcmlnaW5hbENvbFNwYW47DQorICAgIEZYX0ZMT0FUIGZDb2xTcGFuV2lkdGggPSAwOw0KKyAgICBpZiAobkNvbFNwYW4gPT0gLTEgfHwNCisgICAgICAgIG5DdXJyZW50Q29sSWR4ICsgbkNvbFNwYW4gPiByZ1NwZWNpZmllZENvbHVtbldpZHRocy5HZXRTaXplKCkpIHsNCisgICAgICBuQ29sU3BhbiA9IHJnU3BlY2lmaWVkQ29sdW1uV2lkdGhzLkdldFNpemUoKSAtIG5DdXJyZW50Q29sSWR4Ow0KKyAgICB9DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db2xTcGFuOyBpKyspIHsNCisgICAgICBmQ29sU3BhbldpZHRoICs9IHJnU3BlY2lmaWVkQ29sdW1uV2lkdGhzW25DdXJyZW50Q29sSWR4ICsgaV07DQorICAgIH0NCisgICAgaWYgKG5Db2xTcGFuICE9IG5PcmlnaW5hbENvbFNwYW4pIHsNCisgICAgICBmQ29sU3BhbldpZHRoID0gYk1ldFdob2xlUm93Q2VsbCA/IDAgOiBzdGQ6Om1heChmQ29sU3BhbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXlvdXRDaGlsZC0+bV9zU2l6ZS55KTsNCisgICAgfQ0KKyAgICBpZiAobk9yaWdpbmFsQ29sU3BhbiA9PSAtMSkgew0KKyAgICAgIGJNZXRXaG9sZVJvd0NlbGwgPSBUUlVFOw0KKyAgICB9DQorICAgIHBMYXlvdXRDaGlsZC0+bV9zUG9zLlNldChmQ3VycmVudENvbFgsIDApOw0KKyAgICBwTGF5b3V0Q2hpbGQtPm1fc1NpemUueCA9IGZDb2xTcGFuV2lkdGg7DQorICAgIGlmIChYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKHBMYXlvdXRDaGlsZC0+bV9wRm9ybU5vZGUpKSB7DQorICAgICAgZkN1cnJlbnRDb2xYICs9IGZDb2xTcGFuV2lkdGg7DQorICAgICAgbkN1cnJlbnRDb2xJZHggKz0gbkNvbFNwYW47DQorICAgICAgRlhfRkxPQVQgZk5ld0hlaWdodCA9DQorICAgICAgICAgIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSA/IC0xIDogZkNvbnRlbnRDdXJyZW50SGVpZ2h0Ow0KKyAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX1VwZGF0ZVdpZGdldFNpemUocExheW91dENoaWxkLCBmQ29sU3BhbldpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZk5ld0hlaWdodCk7DQorICAgICAgcExheW91dENoaWxkLT5tX3NTaXplLnkgPSBmTmV3SGVpZ2h0Ow0KKyAgICAgIGlmIChiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpIHsNCisgICAgICAgIEZYX0ZMT0FUIGZDaGlsZFN1cHBsaWVkSGVpZ2h0ID0gcExheW91dENoaWxkLT5tX3NTaXplLnk7DQorICAgICAgICBpZiAoZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0IDwgZkNoaWxkU3VwcGxpZWRIZWlnaHQpIHsNCisgICAgICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0gZkNoaWxkU3VwcGxpZWRIZWlnaHQ7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAoYkNvbnRhaW5lckhlaWdodEF1dG9TaXplKSB7DQorICAgIGZvciAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcExheW91dENoaWxkID0NCisgICAgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBMYXlvdXRSb3ctPm1fcEZpcnN0Q2hpbGQ7DQorICAgICAgICAgcExheW91dENoaWxkOw0KKyAgICAgICAgIHBMYXlvdXRDaGlsZCA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKilwTGF5b3V0Q2hpbGQtPm1fcE5leHRTaWJsaW5nKSB7DQorICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfVXBkYXRlV2lkZ2V0U2l6ZSgNCisgICAgICAgICAgcExheW91dENoaWxkLCBwTGF5b3V0Q2hpbGQtPm1fc1NpemUueCwgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0KTsNCisgICAgICBGWF9GTE9BVCBmT2xkQ2hpbGRIZWlnaHQgPSBwTGF5b3V0Q2hpbGQtPm1fc1NpemUueTsNCisgICAgICBwTGF5b3V0Q2hpbGQtPm1fc1NpemUueSA9IGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodDsNCisgICAgICBDWEZBX05vZGUqIHBQYXJhTm9kZSA9DQorICAgICAgICAgIHBMYXlvdXRDaGlsZC0+bV9wRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1BhcmEpOw0KKyAgICAgIGlmIChwUGFyYU5vZGUgJiYgcExheW91dENoaWxkLT5tX3BGaXJzdENoaWxkKSB7DQorICAgICAgICBGWF9GTE9BVCBmT2ZmSGVpZ2h0ID0gZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0IC0gZk9sZENoaWxkSGVpZ2h0Ow0KKyAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZVZUeXBlID0gcFBhcmFOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfVkFsaWduKTsNCisgICAgICAgIHN3aXRjaCAoZVZUeXBlKSB7DQorICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlOg0KKyAgICAgICAgICAgIGZPZmZIZWlnaHQgPSBmT2ZmSGVpZ2h0IC8gMjsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b206DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9wOg0KKyAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGZPZmZIZWlnaHQgPSAwOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGZPZmZIZWlnaHQgPiAwKSB7DQorICAgICAgICAgIGZvciAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcElubmVyTGF5b3V0Q2hpbGQgPQ0KKyAgICAgICAgICAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcExheW91dENoaWxkLT5tX3BGaXJzdENoaWxkOw0KKyAgICAgICAgICAgICAgIHBJbm5lckxheW91dENoaWxkOw0KKyAgICAgICAgICAgICAgIHBJbm5lckxheW91dENoaWxkID0NCisgICAgICAgICAgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBJbm5lckxheW91dENoaWxkLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgICAgICAgIHBJbm5lckxheW91dENoaWxkLT5tX3NQb3MueSArPSBmT2ZmSGVpZ2h0Ow0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAoYkNvbnRhaW5lcldpZHRoQXV0b1NpemUpIHsNCisgICAgRlhfRkxPQVQgZkNoaWxkU3VwcGxpZWRXaWR0aCA9IGZDdXJyZW50Q29sWDsNCisgICAgaWYgKGZDb250ZW50V2lkdGhMaW1pdCA8IFhGQV9MQVlPVVRfRkxPQVRfTUFYICYmDQorICAgICAgICBmQ29udGVudFdpZHRoTGltaXQgPiBmQ2hpbGRTdXBwbGllZFdpZHRoKSB7DQorICAgICAgZkNoaWxkU3VwcGxpZWRXaWR0aCA9IGZDb250ZW50V2lkdGhMaW1pdDsNCisgICAgfQ0KKyAgICBpZiAoZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPCBmQ2hpbGRTdXBwbGllZFdpZHRoKSB7DQorICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSBmQ2hpbGRTdXBwbGllZFdpZHRoOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9IGZDb250YWluZXJXaWR0aCAtIGZMZWZ0SW5zZXQgLSBmUmlnaHRJbnNldDsNCisgIH0NCisgIGlmIChwTGF5b3V0Um93LT5tX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0xheW91dCkgPT0NCisgICAgICBYRkFfQVRUUklCVVRFRU5VTV9SbF9yb3cpIHsNCisgICAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwTGF5b3V0Q2hpbGQgPQ0KKyAgICAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcExheW91dFJvdy0+bV9wRmlyc3RDaGlsZDsNCisgICAgICAgICBwTGF5b3V0Q2hpbGQ7DQorICAgICAgICAgcExheW91dENoaWxkID0gKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBMYXlvdXRDaGlsZC0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgICBwTGF5b3V0Q2hpbGQtPm1fc1Bvcy54ID0gZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggLQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF5b3V0Q2hpbGQtPm1fc1Bvcy54IC0gcExheW91dENoaWxkLT5tX3NTaXplLng7DQorICAgIH0NCisgIH0NCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0NhbGN1bGF0ZUNvbnRhaW5lckNvbXBvbmVudFNpemVGcm9tQ29udGVudFNpemUoDQorICAgICAgcExheW91dFJvdy0+bV9wRm9ybU5vZGUsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLCBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCwNCisgICAgICBmQ29udGFpbmVyV2lkdGgsIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0LA0KKyAgICAgIGZDb250YWluZXJIZWlnaHQpOw0KKyAgcExheW91dFJvdy0+bV9zU2l6ZS5TZXQoZkNvbnRhaW5lcldpZHRoLCBmQ29udGFpbmVySGVpZ2h0KTsNCit9DQordm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkRvTGF5b3V0VGFibGVDb250YWluZXIoQ1hGQV9Ob2RlKiBwTGF5b3V0Tm9kZSkgew0KKyAgaWYgKG1fcExheW91dEl0ZW0gIT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAocExheW91dE5vZGUgPT0gTlVMTCkgew0KKyAgICBwTGF5b3V0Tm9kZSA9IG1fcEZvcm1Ob2RlOw0KKyAgfQ0KKyAgQVNTRVJUKG1fcEN1ckNoaWxkTm9kZSA9PSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFKTsNCisgIG1fcExheW91dEl0ZW0gPSBDcmVhdGVDb250ZW50TGF5b3V0SXRlbShtX3BGb3JtTm9kZSk7DQorICBGWF9GTE9BVCBmQ29udGFpbmVyV2lkdGggPSAwLCBmQ29udGFpbmVySGVpZ2h0ID0gMDsNCisgIEZYX0JPT0wgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPSBUUlVFLCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgPSBUUlVFOw0KKyAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQ2FsY3VsYXRlQ29udGFpbmVyU3BlY2ZpZWRTaXplKA0KKyAgICAgIG1fcEZvcm1Ob2RlLCBmQ29udGFpbmVyV2lkdGgsIGZDb250YWluZXJIZWlnaHQsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLA0KKyAgICAgIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSk7DQorICBGWF9GTE9BVCBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9IDAsIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA9IDA7DQorICBDWEZBX05vZGUqIHBNYXJnaW5Ob2RlID0NCisgICAgICBtX3BGb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfTWFyZ2luKTsNCisgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQgPSAwLCBmVG9wSW5zZXQgPSAwLCBmUmlnaHRJbnNldCA9IDAsIGZCb3R0b21JbnNldCA9IDA7DQorICBpZiAocE1hcmdpbk5vZGUpIHsNCisgICAgZkxlZnRJbnNldCA9DQorICAgICAgICBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0xlZnRJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgZlRvcEluc2V0ID0NCisgICAgICAgIHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgIGZSaWdodEluc2V0ID0NCisgICAgICAgIHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUmlnaHRJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgZkJvdHRvbUluc2V0ID0NCisgICAgICAgIHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfQm90dG9tSW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICB9DQorICBGWF9GTE9BVCBmQ29udGVudFdpZHRoTGltaXQgPQ0KKyAgICAgIGJDb250YWluZXJXaWR0aEF1dG9TaXplID8gWEZBX0xBWU9VVF9GTE9BVF9NQVgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZDb250YWluZXJXaWR0aCAtIGZMZWZ0SW5zZXQgLSBmUmlnaHRJbnNldDsNCisgIENGWF9XaWRlU3RyaW5nQyB3c0NvbHVtbldpZHRoczsNCisgIGlmIChwTGF5b3V0Tm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Db2x1bW5XaWR0aHMsIHdzQ29sdW1uV2lkdGhzKSkgew0KKyAgICBDRlhfV2lkZVN0cmluZ0FycmF5IHdpZHRoczsNCisgICAgaWYgKEZYX1NlcGFyYXRlU3RyaW5nVyh3c0NvbHVtbldpZHRocy5HZXRQdHIoKSwgd3NDb2x1bW5XaWR0aHMuR2V0TGVuZ3RoKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTCcgJywgd2lkdGhzKSA+IDApIHsNCisgICAgICBpbnQzMl90IGlDb2xzID0gd2lkdGhzLkdldFNpemUoKTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1dpZHRoOw0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb2xzOyBpKyspIHsNCisgICAgICAgIHdzV2lkdGggPSB3aWR0aHNbaV07DQorICAgICAgICB3c1dpZHRoLlRyaW1MZWZ0KEwnICcpOw0KKyAgICAgICAgaWYgKCF3c1dpZHRoLklzRW1wdHkoKSkgew0KKyAgICAgICAgICBDWEZBX01lYXN1cmVtZW50IG1lYXN1cmUod3NXaWR0aCk7DQorICAgICAgICAgIG1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMuQWRkKG1lYXN1cmUuVG9Vbml0KFhGQV9VTklUX1B0KSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpbnQzMl90IGlTcGVjaWZpZWRDb2x1bW5Db3VudCA9IG1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMuR2V0U2l6ZSgpOw0KKyAgQ1hGQV9MYXlvdXRDb250ZXh0IGxheW91dENvbnRleHQ7DQorICBsYXlvdXRDb250ZXh0Lm1fcHJnU3BlY2lmaWVkQ29sdW1uV2lkdGhzID0gJm1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHM7DQorICBDWEZBX0xheW91dENvbnRleHQqIHBMYXlvdXRDb250ZXh0ID0NCisgICAgICBpU3BlY2lmaWVkQ29sdW1uQ291bnQgPiAwID8gJmxheW91dENvbnRleHQgOiBOVUxMOw0KKyAgaWYgKG1fcEN1ckNoaWxkTm9kZSA9PSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFKSB7DQorICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0dvdG9OZXh0Q29udGFpbmVyTm9kZSgNCisgICAgICAgIG1fcEN1ckNoaWxkTm9kZSwgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UsIG1fcEZvcm1Ob2RlLCBGQUxTRSk7DQorICB9DQorICBmb3IgKDsgbV9wQ3VyQ2hpbGROb2RlOyBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Hb3RvTmV4dENvbnRhaW5lck5vZGUoDQorICAgICAgICAgICBtX3BDdXJDaGlsZE5vZGUsIG1fbkN1ckNoaWxkTm9kZVN0YWdlLCBtX3BGb3JtTm9kZSwgRkFMU0UpKSB7DQorICAgIGxheW91dENvbnRleHQubV9iQ3VyQ29sdW1uV2lkdGhBdmFpYWJsZSA9IEZBTFNFOw0KKyAgICBsYXlvdXRDb250ZXh0Lm1fZkN1ckNvbHVtbldpZHRoID0gMDsNCisgICAgaWYgKG1fbkN1ckNoaWxkTm9kZVN0YWdlICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0NvbnRhaW5lcikgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFByb2Nlc3NvciA9DQorICAgICAgICBuZXcgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKG1fcEN1ckNoaWxkTm9kZSwgbV9wUGFnZU1ncik7DQorI2lmbmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KKyAgICBwUHJvY2Vzc29yLT5tX3BQYWdlTWdyQ3JlYXRlSXRlbSA9IG1fcFBhZ2VNZ3JDcmVhdGVJdGVtOw0KKyNlbmRpZg0KKyAgICBwUHJvY2Vzc29yLT5Eb0xheW91dChGQUxTRSwgWEZBX0xBWU9VVF9GTE9BVF9NQVgsIFhGQV9MQVlPVVRfRkxPQVRfTUFYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBwTGF5b3V0Q29udGV4dCk7DQorICAgIGlmICghcFByb2Nlc3Nvci0+SGFzTGF5b3V0SXRlbSgpKSB7DQorICAgICAgZGVsZXRlIHBQcm9jZXNzb3I7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgbV9wTGF5b3V0SXRlbS0+QWRkQ2hpbGQocFByb2Nlc3Nvci0+RXh0cmFjdExheW91dEl0ZW0oKSk7DQorICAgIGRlbGV0ZSBwUHJvY2Vzc29yOw0KKyAgfQ0KKyAgaW50MzJfdCBpUm93Q291bnQgPSAwLCBpQ29sQ291bnQgPSAwOw0KKyAgew0KKyAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKj4gcmdSb3dJdGVtczsNCisgICAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4gcmdSb3dJdGVtc1NwYW47DQorICAgIENGWF9BcnJheVRlbXBsYXRlPEZYX0ZMT0FUPiByZ1Jvd0l0ZW1zV2lkdGg7DQorICAgIGZvciAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcExheW91dENoaWxkID0NCisgICAgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW0qKW1fcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQorICAgICAgICAgcExheW91dENoaWxkOw0KKyAgICAgICAgIHBMYXlvdXRDaGlsZCA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKilwTGF5b3V0Q2hpbGQtPm1fcE5leHRTaWJsaW5nKSB7DQorICAgICAgaWYgKHBMYXlvdXRDaGlsZC0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9TdWJmb3JtKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgaWYgKCFYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKHBMYXlvdXRDaGlsZC0+bV9wRm9ybU5vZGUpKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZUxheW91dCA9DQorICAgICAgICAgIHBMYXlvdXRDaGlsZC0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQpOw0KKyAgICAgIGlmIChlTGF5b3V0ICE9IFhGQV9BVFRSSUJVVEVFTlVNX1JvdyAmJg0KKyAgICAgICAgICBlTGF5b3V0ICE9IFhGQV9BVFRSSUJVVEVFTlVNX1JsX3Jvdykgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwUm93TGF5b3V0Q2VsbCA9DQorICAgICAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcExheW91dENoaWxkLT5tX3BGaXJzdENoaWxkKSB7DQorICAgICAgICByZ1Jvd0l0ZW1zLkFkZChwUm93TGF5b3V0Q2VsbCk7DQorICAgICAgICBpbnQzMl90IGlDb2xTcGFuID0NCisgICAgICAgICAgICBwUm93TGF5b3V0Q2VsbC0+bV9wRm9ybU5vZGUtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9Db2xTcGFuKTsNCisgICAgICAgIHJnUm93SXRlbXNTcGFuLkFkZChpQ29sU3Bhbik7DQorICAgICAgICByZ1Jvd0l0ZW1zV2lkdGguQWRkKHBSb3dMYXlvdXRDZWxsLT5tX3NTaXplLngpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpUm93Q291bnQgPSByZ1Jvd0l0ZW1zLkdldFNpemUoKTsNCisgICAgaUNvbENvdW50ID0gMDsNCisgICAgRlhfQk9PTCBiTW9yZUNvbHVtbnMgPSBUUlVFOw0KKyAgICB3aGlsZSAoYk1vcmVDb2x1bW5zKSB7DQorICAgICAgYk1vcmVDb2x1bW5zID0gRkFMU0U7DQorICAgICAgRlhfQk9PTCBiQXV0b0NvbCA9IEZBTFNFOw0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlSb3dDb3VudDsgaSsrKSB7DQorICAgICAgICB3aGlsZSAocmdSb3dJdGVtc1tpXSAhPSBOVUxMICYmIChyZ1Jvd0l0ZW1zU3BhbltpXSA8PSAwIHx8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZSgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ1Jvd0l0ZW1zW2ldLT5tX3BGb3JtTm9kZSkpKSB7DQorICAgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBOZXdDZWxsID0NCisgICAgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKilyZ1Jvd0l0ZW1zW2ldLT5tX3BOZXh0U2libGluZzsNCisgICAgICAgICAgaWYgKHJnUm93SXRlbXNTcGFuW2ldIDwgMCAmJiBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ1Jvd0l0ZW1zW2ldLT5tX3BGb3JtTm9kZSkpIHsNCisgICAgICAgICAgICBwTmV3Q2VsbCA9IE5VTEw7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcmdSb3dJdGVtc1tpXSA9IHBOZXdDZWxsOw0KKyAgICAgICAgICByZ1Jvd0l0ZW1zU3BhbltpXSA9DQorICAgICAgICAgICAgICBwTmV3Q2VsbA0KKyAgICAgICAgICAgICAgICAgID8gcE5ld0NlbGwtPm1fcEZvcm1Ob2RlLT5HZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfQ29sU3BhbikNCisgICAgICAgICAgICAgICAgICA6IDA7DQorICAgICAgICAgIHJnUm93SXRlbXNXaWR0aFtpXSA9IHBOZXdDZWxsID8gcE5ld0NlbGwtPm1fc1NpemUueCA6IDA7DQorICAgICAgICB9DQorICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwQ2VsbCA9IHJnUm93SXRlbXNbaV07DQorICAgICAgICBpZiAoIXBDZWxsKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYk1vcmVDb2x1bW5zID0gVFJVRTsNCisgICAgICAgIGlmIChyZ1Jvd0l0ZW1zU3BhbltpXSA9PSAxKSB7DQorICAgICAgICAgIGlmIChpQ29sQ291bnQgPj0gaVNwZWNpZmllZENvbHVtbkNvdW50KSB7DQorICAgICAgICAgICAgZm9yIChpbnQzMl90IGogPSAwLCBjID0gaUNvbENvdW50ICsgMSAtDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9yZ1NwZWNpZmllZENvbHVtbldpZHRocy5HZXRTaXplKCk7DQorICAgICAgICAgICAgICAgICBqIDwgYzsgaisrKSB7DQorICAgICAgICAgICAgICBtX3JnU3BlY2lmaWVkQ29sdW1uV2lkdGhzLkFkZCgwKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKG1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHNbaUNvbENvdW50XSA8DQorICAgICAgICAgICAgICBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICAgICAgICAgIGJBdXRvQ29sID0gVFJVRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoYkF1dG9Db2wgJiYNCisgICAgICAgICAgICAgIG1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHNbaUNvbENvdW50XSA8IHJnUm93SXRlbXNXaWR0aFtpXSkgew0KKyAgICAgICAgICAgIG1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHNbaUNvbENvdW50XSA9IHJnUm93SXRlbXNXaWR0aFtpXTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoYk1vcmVDb2x1bW5zKSB7DQorICAgICAgICBGWF9GTE9BVCBmRmluYWxDb2x1bW5XaWR0aCA9IG1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHNbaUNvbENvdW50XTsNCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlSb3dDb3VudDsgaSsrKSB7DQorICAgICAgICAgIGlmICghcmdSb3dJdGVtc1tpXSkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHJnUm93SXRlbXNTcGFuW2ldLS07DQorICAgICAgICAgIHJnUm93SXRlbXNXaWR0aFtpXSAtPSBmRmluYWxDb2x1bW5XaWR0aDsNCisgICAgICAgIH0NCisgICAgICAgIGlDb2xDb3VudCsrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgRlhfRkxPQVQgZkN1cnJlbnRSb3dZID0gMDsNCisgIGZvciAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcExheW91dENoaWxkID0NCisgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiltX3BMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOw0KKyAgICAgICBwTGF5b3V0Q2hpbGQ7DQorICAgICAgIHBMYXlvdXRDaGlsZCA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKilwTGF5b3V0Q2hpbGQtPm1fcE5leHRTaWJsaW5nKSB7DQorICAgIGlmICghWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShwTGF5b3V0Q2hpbGQtPm1fcEZvcm1Ob2RlKSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChwTGF5b3V0Q2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgew0KKyAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVTdWJmb3JtTGF5b3V0ID0NCisgICAgICAgICAgcExheW91dENoaWxkLT5tX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0xheW91dCk7DQorICAgICAgaWYgKGVTdWJmb3JtTGF5b3V0ID09IFhGQV9BVFRSSUJVVEVFTlVNX1JvdyB8fA0KKyAgICAgICAgICBlU3ViZm9ybUxheW91dCA9PSBYRkFfQVRUUklCVVRFRU5VTV9SbF9yb3cpIHsNCisgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX1JlbG9jYXRlVGFibGVSb3dDZWxscygNCisgICAgICAgICAgICBwTGF5b3V0Q2hpbGQsIG1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMsIGVTdWJmb3JtTGF5b3V0KTsNCisgICAgICB9DQorICAgIH0NCisgICAgcExheW91dENoaWxkLT5tX3NQb3MueSA9IGZDdXJyZW50Um93WTsNCisgICAgaWYgKGJDb250YWluZXJXaWR0aEF1dG9TaXplKSB7DQorICAgICAgcExheW91dENoaWxkLT5tX3NQb3MueCA9IDA7DQorICAgIH0gZWxzZSB7DQorICAgICAgc3dpdGNoIChwTGF5b3V0Q2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfSEFsaWduKSkgew0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0Og0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgcExheW91dENoaWxkLT5tX3NQb3MueCA9IDA7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXI6DQorICAgICAgICAgIHBMYXlvdXRDaGlsZC0+bV9zUG9zLnggPQ0KKyAgICAgICAgICAgICAgKGZDb250ZW50V2lkdGhMaW1pdCAtIHBMYXlvdXRDaGlsZC0+bV9zU2l6ZS54KSAvIDI7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoNCisgICAgICAgICAgcExheW91dENoaWxkLT5tX3NQb3MueCA9IGZDb250ZW50V2lkdGhMaW1pdCAtIHBMYXlvdXRDaGlsZC0+bV9zU2l6ZS54Ow0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKGJDb250YWluZXJXaWR0aEF1dG9TaXplKSB7DQorICAgICAgRlhfRkxPQVQgZkNoaWxkU3VwcGxpZWRXaWR0aCA9DQorICAgICAgICAgIHBMYXlvdXRDaGlsZC0+bV9zUG9zLnggKyBwTGF5b3V0Q2hpbGQtPm1fc1NpemUueDsNCisgICAgICBpZiAoZkNvbnRlbnRXaWR0aExpbWl0IDwgWEZBX0xBWU9VVF9GTE9BVF9NQVggJiYNCisgICAgICAgICAgZkNvbnRlbnRXaWR0aExpbWl0ID4gZkNoaWxkU3VwcGxpZWRXaWR0aCkgew0KKyAgICAgICAgZkNoaWxkU3VwcGxpZWRXaWR0aCA9IGZDb250ZW50V2lkdGhMaW1pdDsNCisgICAgICB9DQorICAgICAgaWYgKGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoIDwgZkNoaWxkU3VwcGxpZWRXaWR0aCkgew0KKyAgICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSBmQ2hpbGRTdXBwbGllZFdpZHRoOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBmQ3VycmVudFJvd1kgKz0gcExheW91dENoaWxkLT5tX3NTaXplLnk7DQorICB9DQorICBpZiAoYkNvbnRhaW5lckhlaWdodEF1dG9TaXplKSB7DQorICAgIEZYX0ZMT0FUIGZDaGlsZFN1cHBsaWVkSGVpZ2h0ID0gZkN1cnJlbnRSb3dZOw0KKyAgICBpZiAoZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0IDwgZkNoaWxkU3VwcGxpZWRIZWlnaHQpIHsNCisgICAgICBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSBmQ2hpbGRTdXBwbGllZEhlaWdodDsNCisgICAgfQ0KKyAgfQ0KKyAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQ2FsY3VsYXRlQ29udGFpbmVyQ29tcG9uZW50U2l6ZUZyb21Db250ZW50U2l6ZSgNCisgICAgICBtX3BGb3JtTm9kZSwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoLA0KKyAgICAgIGZDb250YWluZXJXaWR0aCwgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLCBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsDQorICAgICAgZkNvbnRhaW5lckhlaWdodCk7DQorICBTZXRDdXJyZW50Q29tcG9uZW50U2l6ZShmQ29udGFpbmVyV2lkdGgsIGZDb250YWluZXJIZWlnaHQpOw0KK30NCitzdGF0aWMgdWludDhfdCBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9IQWxpZ25FbnVtVG9JbnQoDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVIQWxpZ24pIHsNCisgIHN3aXRjaCAoZUhBbGlnbikgew0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0NlbnRlcjoNCisgICAgICByZXR1cm4gMTsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoNCisgICAgICByZXR1cm4gMjsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0Og0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiAwOw0KKyAgfQ0KK30NCitzdGF0aWMgdm9pZCBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9VcGRhdGVQZW5kZWRJdGVtTGF5b3V0KA0KKyAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBQcm9jZXNzb3IsDQorICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBMYXlvdXRJdGVtKSB7DQorICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0ID0NCisgICAgICBwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQpOw0KKyAgc3dpdGNoIChlTGF5b3V0KSB7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUm93Og0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JsX3JvdzoNCisgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9SZWxvY2F0ZVRhYmxlUm93Q2VsbHMoDQorICAgICAgICAgIHBMYXlvdXRJdGVtLCBwUHJvY2Vzc29yLT5tX3JnU3BlY2lmaWVkQ29sdW1uV2lkdGhzLCBlTGF5b3V0KTsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCit9DQorRlhfQk9PTCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OklzQWRkTmV3Um93Rm9yVHJhaWxlcigNCisgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcFRyYWlsZXJJdGVtKSB7DQorICBpZiAoIXBUcmFpbGVySXRlbSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWF9GTE9BVCBmV2lkdGggPSBwVHJhaWxlckl0ZW0tPm1fc1NpemUueDsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXQgPSBtX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0xheW91dCk7DQorICBpZiAoZUxheW91dCAhPSBYRkFfQVRUUklCVVRFRU5VTV9UYiAmJiBtX2ZXaWR0aExpbWl0ZSA+IGZXaWR0aCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorc3RhdGljIHZvaWQgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQWRkVHJhaWxlckJlZm9yZVNwbGl0KA0KKyAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBQcm9jZXNzb3IsDQorICAgIEZYX0ZMT0FUIGZTcGxpdFBvcywNCisgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcFRyYWlsZXJMYXlvdXRJdGVtLA0KKyAgICBGWF9CT09MIGJVc2VJbmhlcml0ZWQgPSBGQUxTRSkgew0KKyAgaWYgKCFwVHJhaWxlckxheW91dEl0ZW0pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfRkxPQVQgZkhlaWdodCA9IHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS55Ow0KKyAgaWYgKGJVc2VJbmhlcml0ZWQpIHsNCisgICAgRlhfRkxPQVQgZk5ld1NwbGl0UG9zID0gMDsNCisgICAgaWYgKGZTcGxpdFBvcyAtIGZIZWlnaHQgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICAgIGZOZXdTcGxpdFBvcyA9IHBQcm9jZXNzb3ItPkZpbmRTcGxpdFBvcyhmU3BsaXRQb3MgLSBmSGVpZ2h0KTsNCisgICAgfQ0KKyAgICBpZiAoZk5ld1NwbGl0UG9zID4gWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCisgICAgICBwUHJvY2Vzc29yLT5TcGxpdExheW91dEl0ZW0oZk5ld1NwbGl0UG9zKTsNCisgICAgfQ0KKyAgICByZXR1cm47DQorICB9DQorICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9VcGRhdGVQZW5kZWRJdGVtTGF5b3V0KHBQcm9jZXNzb3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbSk7DQorICBDWEZBX05vZGUqIHBNYXJnaW5Ob2RlID0NCisgICAgICBwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfTWFyZ2luKTsNCisgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQgPSAwLCBmVG9wSW5zZXQgPSAwLCBmUmlnaHRJbnNldCA9IDAsIGZCb3R0b21JbnNldCA9IDA7DQorICBpZiAocE1hcmdpbk5vZGUpIHsNCisgICAgZkxlZnRJbnNldCA9DQorICAgICAgICBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0xlZnRJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgZlRvcEluc2V0ID0NCisgICAgICAgIHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgIGZSaWdodEluc2V0ID0NCisgICAgICAgIHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUmlnaHRJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgZkJvdHRvbUluc2V0ID0NCisgICAgICAgIHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfQm90dG9tSW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICB9DQorICBpZiAoIXBQcm9jZXNzb3ItPklzQWRkTmV3Um93Rm9yVHJhaWxlcihwVHJhaWxlckxheW91dEl0ZW0pKSB7DQorICAgIHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zUG9zLnkgPSBwUHJvY2Vzc29yLT5tX2ZMYXN0Um93WTsNCisgICAgcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NQb3MueCA9IHBQcm9jZXNzb3ItPm1fZkxhc3RSb3dXaWR0aDsNCisgICAgcFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+bV9zU2l6ZS54ICs9IHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS54Ow0KKyAgICBwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5BZGRDaGlsZChwVHJhaWxlckxheW91dEl0ZW0pOw0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9GTE9BVCBmTmV3U3BsaXRQb3MgPSAwOw0KKyAgaWYgKGZTcGxpdFBvcyAtIGZIZWlnaHQgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICBmTmV3U3BsaXRQb3MgPSBwUHJvY2Vzc29yLT5GaW5kU3BsaXRQb3MoZlNwbGl0UG9zIC0gZkhlaWdodCk7DQorICB9DQorICBpZiAoZk5ld1NwbGl0UG9zID4gWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsNCisgICAgcFByb2Nlc3Nvci0+U3BsaXRMYXlvdXRJdGVtKGZOZXdTcGxpdFBvcyk7DQorICAgIHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zUG9zLnkgPSBmTmV3U3BsaXRQb3MgLSBmVG9wSW5zZXQgLSBmQm90dG9tSW5zZXQ7DQorICB9IGVsc2Ugew0KKyAgICBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1Bvcy55ID0gZlNwbGl0UG9zIC0gZlRvcEluc2V0IC0gZkJvdHRvbUluc2V0Ow0KKyAgfQ0KKyAgc3dpdGNoIChwVHJhaWxlckxheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfSEFsaWduKSkgew0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ6DQorICAgIGRlZmF1bHQ6DQorICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NQb3MueCA9IGZMZWZ0SW5zZXQ7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQ6DQorICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NQb3MueCA9IHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fc1NpemUueCAtDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZSaWdodEluc2V0IC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NTaXplLng7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQ2VudGVyOg0KKyAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zUG9zLnggPQ0KKyAgICAgICAgICAocFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+bV9zU2l6ZS54IC0gZkxlZnRJbnNldCAtIGZSaWdodEluc2V0IC0NCisgICAgICAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS54KSAvDQorICAgICAgICAgIDI7DQorICAgICAgYnJlYWs7DQorICB9DQorICBwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5tX3NTaXplLnkgKz0gZkhlaWdodDsNCisgIHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPkFkZENoaWxkKHBUcmFpbGVyTGF5b3V0SXRlbSk7DQorfTsNCitzdGF0aWMgdm9pZCBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9BZGRMZWFkZXJBZnRlclNwbGl0KA0KKyAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBQcm9jZXNzb3IsDQorICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBMZWFkZXJMYXlvdXRJdGVtKSB7DQorICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9VcGRhdGVQZW5kZWRJdGVtTGF5b3V0KHBQcm9jZXNzb3IsIHBMZWFkZXJMYXlvdXRJdGVtKTsNCisgIENYRkFfTm9kZSogcE1hcmdpbk5vZGUgPQ0KKyAgICAgIHBQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9NYXJnaW4pOw0KKyAgRlhfRkxPQVQgZkxlZnRJbnNldCA9IDAsIGZUb3BJbnNldCA9IDAsIGZSaWdodEluc2V0ID0gMCwgZkJvdHRvbUluc2V0ID0gMDsNCisgIGlmIChwTWFyZ2luTm9kZSkgew0KKyAgICBmTGVmdEluc2V0ID0NCisgICAgICAgIHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTGVmdEluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICBmVG9wSW5zZXQgPQ0KKyAgICAgICAgcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Ub3BJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgZlJpZ2h0SW5zZXQgPQ0KKyAgICAgICAgcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9SaWdodEluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICBmQm90dG9tSW5zZXQgPQ0KKyAgICAgICAgcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Cb3R0b21JbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgIH0NCisgIEZYX0ZMT0FUIGZIZWlnaHQgPSBwTGVhZGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS55Ow0KKyAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwQ2hpbGRJdGVtID0NCisgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKilwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOw0KKyAgICAgICBwQ2hpbGRJdGVtOw0KKyAgICAgICBwQ2hpbGRJdGVtID0gKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBDaGlsZEl0ZW0tPm1fcE5leHRTaWJsaW5nKSB7DQorICAgIHBDaGlsZEl0ZW0tPm1fc1Bvcy55ICs9IGZIZWlnaHQ7DQorICB9DQorICBwTGVhZGVyTGF5b3V0SXRlbS0+bV9zUG9zLnkgPSAwOw0KKyAgc3dpdGNoIChwTGVhZGVyTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9IQWxpZ24pKSB7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTGVmdDoNCisgICAgZGVmYXVsdDoNCisgICAgICBwTGVhZGVyTGF5b3V0SXRlbS0+bV9zUG9zLnggPSBmTGVmdEluc2V0Ow0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0Og0KKyAgICAgIHBMZWFkZXJMYXlvdXRJdGVtLT5tX3NQb3MueCA9IHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fc1NpemUueCAtDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJpZ2h0SW5zZXQgLSBwTGVhZGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS54Ow0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0NlbnRlcjoNCisgICAgICBwTGVhZGVyTGF5b3V0SXRlbS0+bV9zUG9zLnggPQ0KKyAgICAgICAgICAocFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+bV9zU2l6ZS54IC0gZkxlZnRJbnNldCAtIGZSaWdodEluc2V0IC0NCisgICAgICAgICAgIHBMZWFkZXJMYXlvdXRJdGVtLT5tX3NTaXplLngpIC8NCisgICAgICAgICAgMjsNCisgICAgICBicmVhazsNCisgIH0NCisgIHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fc1NpemUueSArPSBmSGVpZ2h0Ow0KKyAgcFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+QWRkQ2hpbGQocExlYWRlckxheW91dEl0ZW0pOw0KK307DQorc3RhdGljIHZvaWQgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQWRkUGVuZGluZ05vZGUoDQorICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFByb2Nlc3NvciwNCisgICAgQ1hGQV9Ob2RlKiBwUGVuZGluZ05vZGUsDQorICAgIEZYX0JPT0wgYkJyZWFrUGVuZGluZykgew0KKyAgcFByb2Nlc3Nvci0+bV9yZ1BlbmRpbmdOb2Rlcy5BZGRUYWlsKHBQZW5kaW5nTm9kZSk7DQorICBwUHJvY2Vzc29yLT5tX2JCcmVha1BlbmRpbmcgPSBiQnJlYWtQZW5kaW5nOw0KK30NCitzdGF0aWMgRlhfRkxPQVQgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSW5zZXJ0UGVuZGluZ0l0ZW1zKA0KKyAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBQcm9jZXNzb3IsDQorICAgIENYRkFfTm9kZSogcEN1ckNoaWxkTm9kZSkgew0KKyAgRlhfRkxPQVQgZlRvdGFsSGVpZ2h0ID0gMDsNCisgIGlmIChwUHJvY2Vzc29yLT5tX3JnUGVuZGluZ05vZGVzLkdldENvdW50KCkgPCAxKSB7DQorICAgIHJldHVybiBmVG90YWxIZWlnaHQ7DQorICB9DQorICBpZiAocFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbSA9PSBOVUxMKSB7DQorICAgIHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0gPQ0KKyAgICAgICAgcFByb2Nlc3Nvci0+Q3JlYXRlQ29udGVudExheW91dEl0ZW0ocEN1ckNoaWxkTm9kZSk7DQorICAgIHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fc1NpemUuU2V0KDAsIDApOw0KKyAgfQ0KKyAgd2hpbGUgKHBQcm9jZXNzb3ItPm1fcmdQZW5kaW5nTm9kZXMuR2V0Q291bnQoKSA+IDApIHsNCisgICAgRlhfUE9TSVRJT04gcG9zID0gcFByb2Nlc3Nvci0+bV9yZ1BlbmRpbmdOb2Rlcy5HZXRIZWFkUG9zaXRpb24oKTsNCisgICAgQ1hGQV9Ob2RlKiBwUGVuZGluZ05vZGUgPQ0KKyAgICAgICAgKENYRkFfTm9kZSopcFByb2Nlc3Nvci0+bV9yZ1BlbmRpbmdOb2Rlcy5HZXRBdChwb3MpOw0KKyAgICBwUHJvY2Vzc29yLT5tX3JnUGVuZGluZ05vZGVzLlJlbW92ZUF0KHBvcyk7DQorICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBQZW5kaW5nTGF5b3V0SXRlbSA9IE5VTEw7DQorICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFBlbmRpbmdQcm9jZXNzb3IgPQ0KKyAgICAgICAgbmV3IENYRkFfSXRlbUxheW91dFByb2Nlc3NvcihwUGVuZGluZ05vZGUsIE5VTEwpOw0KKyNpZm5kZWYgX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8NCisgICAgcFBlbmRpbmdQcm9jZXNzb3ItPm1fcFBhZ2VNZ3JDcmVhdGVJdGVtID0gcFByb2Nlc3Nvci0+bV9wUGFnZU1nckNyZWF0ZUl0ZW07DQorI2VuZGlmDQorICAgIHBQZW5kaW5nUHJvY2Vzc29yLT5Eb0xheW91dChGQUxTRSwgWEZBX0xBWU9VVF9GTE9BVF9NQVgpOw0KKyAgICBwUGVuZGluZ0xheW91dEl0ZW0gPSBwUGVuZGluZ1Byb2Nlc3Nvci0+SGFzTGF5b3V0SXRlbSgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBQZW5kaW5nUHJvY2Vzc29yLT5FeHRyYWN0TGF5b3V0SXRlbSgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7DQorICAgIGRlbGV0ZSBwUGVuZGluZ1Byb2Nlc3NvcjsNCisgICAgaWYgKHBQZW5kaW5nTGF5b3V0SXRlbSkgew0KKyAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0FkZExlYWRlckFmdGVyU3BsaXQocFByb2Nlc3NvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQZW5kaW5nTGF5b3V0SXRlbSk7DQorICAgICAgaWYgKHBQcm9jZXNzb3ItPm1fYkJyZWFrUGVuZGluZykgew0KKyAgICAgICAgZlRvdGFsSGVpZ2h0ICs9IHBQZW5kaW5nTGF5b3V0SXRlbS0+bV9zU2l6ZS55Ow0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGZUb3RhbEhlaWdodDsNCit9DQorRlhfRkxPQVQgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpJbnNlcnRLZWVwTGF5b3V0SXRlbXMoKSB7DQorICBGWF9GTE9BVCBmVG90YWxIZWlnaHQgPSAwOw0KKyAgaWYgKG1fYXJyYXlLZWVwSXRlbXMuR2V0U2l6ZSgpKSB7DQorICAgIGlmIChtX3BMYXlvdXRJdGVtID09IE5VTEwpIHsNCisgICAgICBtX3BMYXlvdXRJdGVtID0gQ3JlYXRlQ29udGVudExheW91dEl0ZW0obV9wRm9ybU5vZGUpOw0KKyAgICAgIG1fcExheW91dEl0ZW0tPm1fc1NpemUuU2V0KDAsIDApOw0KKyAgICB9DQorICAgIGZvciAoaW50MzJfdCBpSW5kZXggPSBtX2FycmF5S2VlcEl0ZW1zLkdldFNpemUoKSAtIDE7IGlJbmRleCA+PSAwOw0KKyAgICAgICAgIGlJbmRleC0tKSB7DQorICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQWRkTGVhZGVyQWZ0ZXJTcGxpdCh0aGlzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hcnJheUtlZXBJdGVtc1tpSW5kZXhdKTsNCisgICAgICBmVG90YWxIZWlnaHQgKz0gbV9hcnJheUtlZXBJdGVtc1tpSW5kZXhdLT5tX3NTaXplLnk7DQorICAgIH0NCisgICAgbV9hcnJheUtlZXBJdGVtcy5SZW1vdmVBbGwoKTsNCisgIH0NCisgIHJldHVybiBmVG90YWxIZWlnaHQ7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpQcm9jZXNzS2VlcEZvclNwbGl0ZSgNCisgICAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBwUGFyZW50UHJvY2Vzc29yLA0KKyAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBDaGlsZFByb2Nlc3NvciwNCisgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQgZVJldFZhbHVlLA0KKyAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKj4mIHJnQ3VyTGluZUxheW91dEl0ZW0sDQorICAgIEZYX0ZMT0FUJiBmQ29udGVudEN1clJvd0F2YWlsV2lkdGgsDQorICAgIEZYX0ZMT0FUJiBmQ29udGVudEN1clJvd0hlaWdodCwNCisgICAgRlhfRkxPQVQmIGZDb250ZW50Q3VyUm93WSwNCisgICAgRlhfQk9PTCYgYkFkZGVkSXRlbUluUm93LA0KKyAgICBGWF9CT09MJiBiRm9yY2VFbmRQYWdlLA0KKyAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCYgcmVzdWx0KSB7DQorICBpZiAocFBhcmVudFByb2Nlc3NvciA9PSBOVUxMIHx8IHBDaGlsZFByb2Nlc3NvciA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChwUGFyZW50UHJvY2Vzc29yLT5tX3BDdXJDaGlsZE5vZGUtPkdldEludGFjdCgpICE9DQorICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX05vbmUgfHwNCisgICAgICAhcENoaWxkUHJvY2Vzc29yLT5tX2JIYXNBdmFpbEhlaWdodCkgew0KKyAgICBpZiAoWEZBX0V4aXN0Q29udGFpbmVyS2VlcChwUGFyZW50UHJvY2Vzc29yLT5tX3BDdXJDaGlsZE5vZGUsIFRSVUUpKSB7DQorICAgICAgRlhfRkxPQVQgZkNoaWxkV2lkdGgsIGZDaGlsZEhlaWdodDsNCisgICAgICBwQ2hpbGRQcm9jZXNzb3ItPkdldEN1cnJlbnRDb21wb25lbnRTaXplKGZDaGlsZFdpZHRoLCBmQ2hpbGRIZWlnaHQpOw0KKyAgICAgIENGWF9BcnJheVRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW0qPiBrZWVwTGF5b3V0SXRlbXM7DQorICAgICAgaWYgKHBQYXJlbnRQcm9jZXNzb3ItPkp1ZGdlUHV0TmV4dFBhZ2UocFBhcmVudFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQ2hpbGRIZWlnaHQsIGtlZXBMYXlvdXRJdGVtcykpIHsNCisgICAgICAgIG1fYXJyYXlLZWVwSXRlbXMuUmVtb3ZlQWxsKCk7DQorICAgICAgICBmb3IgKGludDMyX3QgaUluZGV4ID0gMDsgaUluZGV4IDwga2VlcExheW91dEl0ZW1zLkdldFNpemUoKTsgaUluZGV4KyspIHsNCisgICAgICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcEl0ZW0gPSBrZWVwTGF5b3V0SXRlbXMuR2V0QXQoaUluZGV4KTsNCisgICAgICAgICAgcFBhcmVudFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+UmVtb3ZlQ2hpbGQocEl0ZW0pOw0KKyAgICAgICAgICBmQ29udGVudEN1clJvd1kgLT0gcEl0ZW0tPm1fc1NpemUueTsNCisgICAgICAgICAgbV9hcnJheUtlZXBJdGVtcy5BZGQocEl0ZW0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYkFkZGVkSXRlbUluUm93ID0gVFJVRTsNCisgICAgICAgIGJGb3JjZUVuZFBhZ2UgPSBUUlVFOw0KKyAgICAgICAgcmVzdWx0ID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfUGFnZUZ1bGxCcmVhazsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtLkFkZChwQ2hpbGRQcm9jZXNzb3ItPkV4dHJhY3RMYXlvdXRJdGVtKCkpOw0KKyAgICAgIGJBZGRlZEl0ZW1JblJvdyA9IFRSVUU7DQorICAgICAgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoIC09IGZDaGlsZFdpZHRoOw0KKyAgICAgIGlmIChmQ29udGVudEN1clJvd0hlaWdodCA8IGZDaGlsZEhlaWdodCkgew0KKyAgICAgICAgZkNvbnRlbnRDdXJSb3dIZWlnaHQgPSBmQ2hpbGRIZWlnaHQ7DQorICAgICAgfQ0KKyAgICAgIHJlc3VsdCA9IGVSZXRWYWx1ZTsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6SnVkZ2VQdXROZXh0UGFnZSgNCisgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcFBhcmVudExheW91dEl0ZW0sDQorICAgIEZYX0ZMT0FUIGZDaGlsZEhlaWdodCwNCisgICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSo+JiBwS2VlcEl0ZW1zKSB7DQorICBpZiAocFBhcmVudExheW91dEl0ZW0gPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWF9GTE9BVCBmSXRlbXNIZWlnaHQgPSAwOw0KKyAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwQ2hpbGRMYXlvdXRJdGVtID0NCisgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKilwUGFyZW50TGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCisgICAgICAgcENoaWxkTGF5b3V0SXRlbTsNCisgICAgICAgcENoaWxkTGF5b3V0SXRlbSA9DQorICAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcENoaWxkTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgaWYgKFhGQV9FeGlzdENvbnRhaW5lcktlZXAocENoaWxkTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUsIEZBTFNFKSkgew0KKyAgICAgIHBLZWVwSXRlbXMuQWRkKHBDaGlsZExheW91dEl0ZW0pOw0KKyAgICAgIGZJdGVtc0hlaWdodCArPSBwQ2hpbGRMYXlvdXRJdGVtLT5tX3NTaXplLnk7DQorICAgIH0gZWxzZSB7DQorICAgICAgcEtlZXBJdGVtcy5SZW1vdmVBbGwoKTsNCisgICAgICBmSXRlbXNIZWlnaHQgPSAwOw0KKyAgICB9DQorICB9DQorICBmSXRlbXNIZWlnaHQgKz0gZkNoaWxkSGVpZ2h0Ow0KKyAgaWYgKG1fcFBhZ2VNZ3ItPkdldE5leHRBdmFpbENvbnRlbnRIZWlnaHQoZkl0ZW1zSGVpZ2h0KSkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OlByb2Nlc3NVblVzZUJpbmRzKENYRkFfTm9kZSogcEZvcm1Ob2RlKSB7DQorICBpZiAoIXBGb3JtTm9kZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQU5vZGU+IHNJdGVyYXRvcigNCisgICAgICBwRm9ybU5vZGUpOw0KKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKTsgcE5vZGU7DQorICAgICAgIHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICBpZiAocE5vZGUtPklzQ29udGFpbmVyTm9kZSgpKSB7DQorICAgICAgQ1hGQV9Ob2RlKiBwQmluZE5vZGUgPSBwTm9kZS0+R2V0QmluZERhdGEoKTsNCisgICAgICBpZiAocEJpbmROb2RlKSB7DQorICAgICAgICBwQmluZE5vZGUtPlJlbW92ZUJpbmRJdGVtKHBOb2RlKTsNCisgICAgICAgIHBOb2RlLT5TZXRPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSwgTlVMTCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHBOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19VbnVzZWROb2RlKTsNCisgIH0NCit9DQordm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OlByb2Nlc3NVblVzZU92ZXJGbG93KA0KKyAgICBDWEZBX05vZGUqIHBMZWFkZXJOb2RlLA0KKyAgICBDWEZBX05vZGUqIHBUcmFpbGVyTm9kZSwNCisgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcFRyYWlsZXJJdGVtLA0KKyAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSkgew0KKyAgUHJvY2Vzc1VuVXNlQmluZHMocExlYWRlck5vZGUpOw0KKyAgUHJvY2Vzc1VuVXNlQmluZHMocFRyYWlsZXJOb2RlKTsNCisgIGlmIChwRm9ybU5vZGUgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAocEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfT3ZlcmZsb3cgfHwNCisgICAgICBwRm9ybU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9CcmVhaykgew0KKyAgICBwRm9ybU5vZGUgPSBwRm9ybU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgfQ0KKyAgaWYgKHBMZWFkZXJOb2RlICYmIHBGb3JtTm9kZSkgew0KKyAgICBwRm9ybU5vZGUtPlJlbW92ZUNoaWxkKHBMZWFkZXJOb2RlKTsNCisgIH0NCisgIGlmIChwVHJhaWxlck5vZGUgJiYgcEZvcm1Ob2RlKSB7DQorICAgIHBGb3JtTm9kZS0+UmVtb3ZlQ2hpbGQocFRyYWlsZXJOb2RlKTsNCisgIH0NCisgIGlmIChwVHJhaWxlckl0ZW0pIHsNCisgICAgWEZBX1JlbGVhc2VMYXlvdXRJdGVtKHBUcmFpbGVySXRlbSk7DQorICB9DQorfQ0KK3N0YXRpYyBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9JbnNlcnRGbG93ZWRJdGVtKA0KKyAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBUaGlzLA0KKyAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqJiBwUHJvY2Vzc29yLA0KKyAgICBGWF9CT09MIGJDb250YWluZXJXaWR0aEF1dG9TaXplLA0KKyAgICBGWF9CT09MIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwNCisgICAgRlhfRkxPQVQgZkNvbnRhaW5lckhlaWdodCwNCisgICAgWEZBX0FUVFJJQlVURUVOVU0gZUZsb3dTdHJhdGVneSwNCisgICAgdWludDhfdCYgdUN1ckhBbGlnblN0YXRlLA0KKyAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKj4oJnJnQ3VyTGluZUxheW91dEl0ZW1zKVszXSwNCisgICAgRlhfQk9PTCBiVXNlQnJlYWtDb250cm9sLA0KKyAgICBGWF9GTE9BVCBmQXZhaWxIZWlnaHQsDQorICAgIEZYX0ZMT0FUIGZSZWFsSGVpZ2h0LA0KKyAgICBGWF9GTE9BVCYgZkNvbnRlbnRDdXJSb3dZLA0KKyAgICBGWF9GTE9BVCYgZkNvbnRlbnRXaWR0aExpbWl0LA0KKyAgICBGWF9GTE9BVCYgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoLA0KKyAgICBGWF9GTE9BVCYgZkNvbnRlbnRDdXJSb3dIZWlnaHQsDQorICAgIEZYX0JPT0wmIGJBZGRlZEl0ZW1JblJvdywNCisgICAgRlhfQk9PTCYgYkZvcmNlRW5kUGFnZSwNCisgICAgQ1hGQV9MYXlvdXRDb250ZXh0KiBwTGF5b3V0Q29udGV4dCA9IE5VTEwsDQorICAgIEZYX0JPT0wgYk5ld1JvdyA9IEZBTFNFKSB7DQorICBGWF9CT09MIGJUYWtlU3BhY2UgPQ0KKyAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UocFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUpOw0KKyAgdWludDhfdCB1SEFsaWduID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSEFsaWduRW51bVRvSW50KA0KKyAgICAgIHBUaGlzLT5tX3BDdXJDaGlsZE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9IQWxpZ24pKTsNCisgIGlmIChiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSkgew0KKyAgICB1SEFsaWduID0gMDsNCisgIH0NCisgIGlmICgoZUZsb3dTdHJhdGVneSAhPSBYRkFfQVRUUklCVVRFRU5VTV9SbF90YiAmJiB1SEFsaWduIDwgdUN1ckhBbGlnblN0YXRlKSB8fA0KKyAgICAgIChlRmxvd1N0cmF0ZWd5ID09IFhGQV9BVFRSSUJVVEVFTlVNX1JsX3RiICYmIHVIQWxpZ24gPiB1Q3VySEFsaWduU3RhdGUpKSB7DQorICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Sb3dGdWxsQnJlYWs7DQorICB9DQorICB1Q3VySEFsaWduU3RhdGUgPSB1SEFsaWduOw0KKyAgRlhfQk9PTCBiSXNPd25TcGxpdGUgPQ0KKyAgICAgIHBQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlLT5HZXRJbnRhY3QoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOw0KKyAgRlhfQk9PTCBiVXNlUmVhbEhlaWdodCA9DQorICAgICAgYlRha2VTcGFjZSAmJiBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgJiYgYklzT3duU3BsaXRlICYmDQorICAgICAgcFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpLT5HZXRJbnRhY3QoKSA9PQ0KKyAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOw0KKyAgRlhfQk9PTCBiSXNUcmFuc0hlaWdodCA9IGJUYWtlU3BhY2U7DQorICBpZiAoYklzVHJhbnNIZWlnaHQgJiYgIWJJc093blNwbGl0ZSkgew0KKyAgICBGWF9CT09MIGJSb290Rm9yY2VUYiA9IEZBTFNFOw0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0U3RyYXRlZ3kgPSBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9HZXRMYXlvdXQoDQorICAgICAgICBwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZSwgYlJvb3RGb3JjZVRiKTsNCisgICAgaWYgKGVMYXlvdXRTdHJhdGVneSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Mcl90YiB8fA0KKyAgICAgICAgZUxheW91dFN0cmF0ZWd5ID09IFhGQV9BVFRSSUJVVEVFTlVNX1JsX3RiKSB7DQorICAgICAgYklzVHJhbnNIZWlnaHQgPSBGQUxTRTsNCisgICAgfQ0KKyAgfQ0KKyAgRlhfQk9PTCBiVXNlSW5oZXJpdGVkID0gRkFMU0U7DQorICBDWEZBX0xheW91dENvbnRleHQgbGF5b3V0Q29udGV4dDsNCisgIGlmIChwVGhpcy0+bV9wUGFnZU1ncikgew0KKyAgICBDWEZBX05vZGUqIHBPdmVyZmxvd05vZGUgPQ0KKyAgICAgICAgcFRoaXMtPm1fcFBhZ2VNZ3ItPlF1ZXJ5T3ZlcmZsb3cocFRoaXMtPm1fcEZvcm1Ob2RlKTsNCisgICAgaWYgKHBPdmVyZmxvd05vZGUpIHsNCisgICAgICBsYXlvdXRDb250ZXh0Lm1fcE92ZXJmbG93Tm9kZSA9IHBPdmVyZmxvd05vZGU7DQorICAgICAgbGF5b3V0Q29udGV4dC5tX3BPdmVyZmxvd1Byb2Nlc3NvciA9IHBUaGlzOw0KKyAgICAgIHBMYXlvdXRDb250ZXh0ID0gJmxheW91dENvbnRleHQ7DQorICAgIH0NCisgIH0NCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IGVSZXRWYWx1ZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmU7DQorICBpZiAoIWJOZXdSb3cgfHwNCisgICAgICBwUHJvY2Vzc29yLT5tX2VQcmVQcm9jZXNzUnMgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZSkgew0KKyAgICBlUmV0VmFsdWUgPSBwUHJvY2Vzc29yLT5Eb0xheW91dCgNCisgICAgICAgIGJUYWtlU3BhY2UgPyBiVXNlQnJlYWtDb250cm9sIDogRkFMU0UsDQorICAgICAgICBiVXNlUmVhbEhlaWdodCA/IGZSZWFsSGVpZ2h0IC0gZkNvbnRlbnRDdXJSb3dZIDogWEZBX0xBWU9VVF9GTE9BVF9NQVgsDQorICAgICAgICBiSXNUcmFuc0hlaWdodCA/IGZSZWFsSGVpZ2h0IC0gZkNvbnRlbnRDdXJSb3dZIDogWEZBX0xBWU9VVF9GTE9BVF9NQVgsDQorICAgICAgICBwTGF5b3V0Q29udGV4dCk7DQorICAgIHBQcm9jZXNzb3ItPm1fZVByZVByb2Nlc3NScyA9IGVSZXRWYWx1ZTsNCisgIH0gZWxzZSB7DQorICAgIGVSZXRWYWx1ZSA9IHBQcm9jZXNzb3ItPm1fZVByZVByb2Nlc3NSczsNCisgICAgcFByb2Nlc3Nvci0+bV9lUHJlUHJvY2Vzc1JzID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZTsNCisgIH0NCisgIGlmIChwUHJvY2Vzc29yLT5IYXNMYXlvdXRJdGVtKCkgPT0gRkFMU0UpIHsNCisgICAgcmV0dXJuIGVSZXRWYWx1ZTsNCisgIH0NCisgIEZYX0ZMT0FUIGZDaGlsZFdpZHRoLCBmQ2hpbGRIZWlnaHQ7DQorICBwUHJvY2Vzc29yLT5HZXRDdXJyZW50Q29tcG9uZW50U2l6ZShmQ2hpbGRXaWR0aCwgZkNoaWxkSGVpZ2h0KTsNCisgIGlmIChiVXNlUmVhbEhlaWdodCAmJiBmUmVhbEhlaWdodCA8IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQorICAgIGZSZWFsSGVpZ2h0ID0gWEZBX0xBWU9VVF9GTE9BVF9NQVg7DQorICAgIGZBdmFpbEhlaWdodCA9IFhGQV9MQVlPVVRfRkxPQVRfTUFYOw0KKyAgfQ0KKyAgaWYgKCFiVGFrZVNwYWNlIHx8DQorICAgICAgKGZDaGlsZFdpZHRoIDw9IGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCArIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB8fA0KKyAgICAgIChmQ29udGVudFdpZHRoTGltaXQgLSBmQ29udGVudEN1clJvd0F2YWlsV2lkdGggPD0NCisgICAgICAgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pKSB7DQorICAgIENYRkFfTm9kZSAqcE92ZXJmbG93TGVhZGVyTm9kZSA9IE5VTEwsICpwT3ZlcmZsb3dUcmFpbGVyTm9kZSA9IE5VTEwsDQorICAgICAgICAgICAgICAqcEZvcm1Ob2RlID0gTlVMTDsNCisgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcFRyYWlsZXJMYXlvdXRJdGVtID0gTlVMTDsNCisgICAgRlhfQk9PTCBiSXNBZGRUcmFpbGVySGVpZ2h0ID0gRkFMU0U7DQorICAgIGlmIChwVGhpcy0+bV9wUGFnZU1nciAmJg0KKyAgICAgICAgcFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUtPkdldEludGFjdCgpID09IFhGQV9BVFRSSUJVVEVFTlVNX05vbmUpIHsNCisgICAgICBwRm9ybU5vZGUgPSBwVGhpcy0+bV9wUGFnZU1nci0+UXVlcnlPdmVyZmxvdyhwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZSk7DQorICAgICAgaWYgKHBGb3JtTm9kZSA9PSBOVUxMICYmIHBMYXlvdXRDb250ZXh0ICYmDQorICAgICAgICAgIHBMYXlvdXRDb250ZXh0LT5tX3BPdmVyZmxvd1Byb2Nlc3Nvcikgew0KKyAgICAgICAgcEZvcm1Ob2RlID0gcExheW91dENvbnRleHQtPm1fcE92ZXJmbG93Tm9kZTsNCisgICAgICAgIGJVc2VJbmhlcml0ZWQgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgICBpZiAocFRoaXMtPm1fcFBhZ2VNZ3ItPlByb2Nlc3NPdmVyZmxvdyhwRm9ybU5vZGUsIHBPdmVyZmxvd0xlYWRlck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE92ZXJmbG93VHJhaWxlck5vZGUsIEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKSkgew0KKyAgICAgICAgaWYgKHBQcm9jZXNzb3ItPkp1ZGdlTGVhZGVyT3JUcmFpbGVyRm9yT2NjdXIocE92ZXJmbG93VHJhaWxlck5vZGUpKSB7DQorICAgICAgICAgIGlmIChwT3ZlcmZsb3dUcmFpbGVyTm9kZSkgew0KKyAgICAgICAgICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcE92ZXJmbG93TGVhZGVyUHJvY2Vzc29yID0NCisgICAgICAgICAgICAgICAgbmV3IENYRkFfSXRlbUxheW91dFByb2Nlc3NvcihwT3ZlcmZsb3dUcmFpbGVyTm9kZSwgTlVMTCk7DQorI2lmbmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KKyAgICAgICAgICAgIHBPdmVyZmxvd0xlYWRlclByb2Nlc3Nvci0+bV9wUGFnZU1nckNyZWF0ZUl0ZW0gPQ0KKyAgICAgICAgICAgICAgICBwUHJvY2Vzc29yLT5tX3BQYWdlTWdyQ3JlYXRlSXRlbTsNCisjZW5kaWYNCisgICAgICAgICAgICBwT3ZlcmZsb3dMZWFkZXJQcm9jZXNzb3ItPkRvTGF5b3V0KEZBTFNFLCBYRkFfTEFZT1VUX0ZMT0FUX01BWCk7DQorICAgICAgICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtID0NCisgICAgICAgICAgICAgICAgcE92ZXJmbG93TGVhZGVyUHJvY2Vzc29yLT5IYXNMYXlvdXRJdGVtKCkNCisgICAgICAgICAgICAgICAgICAgID8gcE92ZXJmbG93TGVhZGVyUHJvY2Vzc29yLT5FeHRyYWN0TGF5b3V0SXRlbSgpDQorICAgICAgICAgICAgICAgICAgICA6IE5VTEw7DQorICAgICAgICAgICAgZGVsZXRlIHBPdmVyZmxvd0xlYWRlclByb2Nlc3NvcjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoYlVzZUluaGVyaXRlZCkgew0KKyAgICAgICAgICAgIGJJc0FkZFRyYWlsZXJIZWlnaHQgPQ0KKyAgICAgICAgICAgICAgICBwVGhpcy0+SXNBZGROZXdSb3dGb3JUcmFpbGVyKHBUcmFpbGVyTGF5b3V0SXRlbSk7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgYklzQWRkVHJhaWxlckhlaWdodCA9DQorICAgICAgICAgICAgICAgIHBQcm9jZXNzb3ItPklzQWRkTmV3Um93Rm9yVHJhaWxlcihwVHJhaWxlckxheW91dEl0ZW0pOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChiSXNBZGRUcmFpbGVySGVpZ2h0KSB7DQorICAgICAgICAgICAgRlhfRkxPQVQgZlRyYWlsZXJIZWlnaHQgPSBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1NpemUueTsNCisgICAgICAgICAgICBmQ2hpbGRIZWlnaHQgKz0gZlRyYWlsZXJIZWlnaHQ7DQorICAgICAgICAgICAgYklzQWRkVHJhaWxlckhlaWdodCA9IFRSVUU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFiVGFrZVNwYWNlIHx8DQorICAgICAgICBmQ29udGVudEN1clJvd1kgKyBmQ2hpbGRIZWlnaHQgPD0NCisgICAgICAgICAgICBmQXZhaWxIZWlnaHQgKyBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTiB8fA0KKyAgICAgICAgKCFiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgJiYNCisgICAgICAgICBwVGhpcy0+bV9mVXNlZFNpemUgKyBmQXZhaWxIZWlnaHQgKyBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTiA+PQ0KKyAgICAgICAgICAgICBmQ29udGFpbmVySGVpZ2h0KSkgew0KKyAgICAgIGlmICghYlRha2VTcGFjZSB8fCBlUmV0VmFsdWUgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZSkgew0KKyAgICAgICAgaWYgKHBQcm9jZXNzb3ItPm1fYlVzZUluaGVyaWF0ZWQpIHsNCisgICAgICAgICAgaWYgKHBUcmFpbGVyTGF5b3V0SXRlbSkgew0KKyAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0FkZFRyYWlsZXJCZWZvcmVTcGxpdCgNCisgICAgICAgICAgICAgICAgcFByb2Nlc3NvciwgZkNoaWxkSGVpZ2h0LCBwVHJhaWxlckxheW91dEl0ZW0pOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChwUHJvY2Vzc29yLT5KdWRnZUxlYWRlck9yVHJhaWxlckZvck9jY3VyKHBPdmVyZmxvd0xlYWRlck5vZGUpKSB7DQorICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQWRkUGVuZGluZ05vZGUocFByb2Nlc3NvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3ZlcmZsb3dMZWFkZXJOb2RlLCBGQUxTRSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcFByb2Nlc3Nvci0+bV9iVXNlSW5oZXJpYXRlZCA9IEZBTFNFOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgaWYgKGJJc0FkZFRyYWlsZXJIZWlnaHQpIHsNCisgICAgICAgICAgICBmQ2hpbGRIZWlnaHQgLT0gcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NTaXplLnk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcFByb2Nlc3Nvci0+UHJvY2Vzc1VuVXNlT3ZlckZsb3cocE92ZXJmbG93TGVhZGVyTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE92ZXJmbG93VHJhaWxlck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbSwgcEZvcm1Ob2RlKTsNCisgICAgICAgIH0NCisgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBDaGlsZExheW91dEl0ZW0gPQ0KKyAgICAgICAgICAgIHBQcm9jZXNzb3ItPkV4dHJhY3RMYXlvdXRJdGVtKCk7DQorICAgICAgICBpZiAoWEZBX0V4aXN0Q29udGFpbmVyS2VlcChwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZSwgRkFMU0UpICYmDQorICAgICAgICAgICAgcFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUtPkdldEludGFjdCgpID09IFhGQV9BVFRSSUJVVEVFTlVNX05vbmUpIHsNCisgICAgICAgICAgcFRoaXMtPm1fYXJyYXlLZWVwSXRlbXMuQWRkKHBDaGlsZExheW91dEl0ZW0pOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcFRoaXMtPm1fYXJyYXlLZWVwSXRlbXMuUmVtb3ZlQWxsKCk7DQorICAgICAgICB9DQorICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1t1SEFsaWduXS5BZGQocENoaWxkTGF5b3V0SXRlbSk7DQorICAgICAgICBiQWRkZWRJdGVtSW5Sb3cgPSBUUlVFOw0KKyAgICAgICAgaWYgKGJUYWtlU3BhY2UpIHsNCisgICAgICAgICAgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoIC09IGZDaGlsZFdpZHRoOw0KKyAgICAgICAgICBpZiAoZkNvbnRlbnRDdXJSb3dIZWlnaHQgPCBmQ2hpbGRIZWlnaHQpIHsNCisgICAgICAgICAgICBmQ29udGVudEN1clJvd0hlaWdodCA9IGZDaGlsZEhlaWdodDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmU7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChlUmV0VmFsdWUgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfUGFnZUZ1bGxCcmVhaykgew0KKyAgICAgICAgICBpZiAocFByb2Nlc3Nvci0+bV9iVXNlSW5oZXJpYXRlZCkgew0KKyAgICAgICAgICAgIGlmIChwVHJhaWxlckxheW91dEl0ZW0pIHsNCisgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0FkZFRyYWlsZXJCZWZvcmVTcGxpdCgNCisgICAgICAgICAgICAgICAgICBwUHJvY2Vzc29yLCBmQ2hpbGRIZWlnaHQsIHBUcmFpbGVyTGF5b3V0SXRlbSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChwUHJvY2Vzc29yLT5KdWRnZUxlYWRlck9yVHJhaWxlckZvck9jY3VyKHBPdmVyZmxvd0xlYWRlck5vZGUpKSB7DQorICAgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9BZGRQZW5kaW5nTm9kZSgNCisgICAgICAgICAgICAgICAgICBwUHJvY2Vzc29yLCBwT3ZlcmZsb3dMZWFkZXJOb2RlLCBGQUxTRSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBQcm9jZXNzb3ItPm1fYlVzZUluaGVyaWF0ZWQgPSBGQUxTRTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBpZiAoYklzQWRkVHJhaWxlckhlaWdodCkgew0KKyAgICAgICAgICAgICAgZkNoaWxkSGVpZ2h0IC09IHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS55Ow0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwUHJvY2Vzc29yLT5Qcm9jZXNzVW5Vc2VPdmVyRmxvdyhwT3ZlcmZsb3dMZWFkZXJOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdmVyZmxvd1RyYWlsZXJOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbSwgcEZvcm1Ob2RlKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbdUhBbGlnbl0uQWRkKHBQcm9jZXNzb3ItPkV4dHJhY3RMYXlvdXRJdGVtKCkpOw0KKyAgICAgICAgYkFkZGVkSXRlbUluUm93ID0gVFJVRTsNCisgICAgICAgIGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCAtPSBmQ2hpbGRXaWR0aDsNCisgICAgICAgIGlmIChmQ29udGVudEN1clJvd0hlaWdodCA8IGZDaGlsZEhlaWdodCkgew0KKyAgICAgICAgICBmQ29udGVudEN1clJvd0hlaWdodCA9IGZDaGlsZEhlaWdodDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBlUmV0VmFsdWU7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IGVSZXN1bHQ7DQorICAgICAgaWYgKHBUaGlzLT5Qcm9jZXNzS2VlcEZvclNwbGl0ZSgNCisgICAgICAgICAgICAgIHBUaGlzLCBwUHJvY2Vzc29yLCBlUmV0VmFsdWUsIHJnQ3VyTGluZUxheW91dEl0ZW1zW3VIQWxpZ25dLA0KKyAgICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoLCBmQ29udGVudEN1clJvd0hlaWdodCwgZkNvbnRlbnRDdXJSb3dZLA0KKyAgICAgICAgICAgICAgYkFkZGVkSXRlbUluUm93LCBiRm9yY2VFbmRQYWdlLCBlUmVzdWx0KSkgew0KKyAgICAgICAgcmV0dXJuIGVSZXN1bHQ7DQorICAgICAgfQ0KKyAgICAgIGJGb3JjZUVuZFBhZ2UgPSBUUlVFOw0KKyAgICAgIEZYX0ZMT0FUIGZTcGxpdFBvcyA9DQorICAgICAgICAgIHBQcm9jZXNzb3ItPkZpbmRTcGxpdFBvcyhmQXZhaWxIZWlnaHQgLSBmQ29udGVudEN1clJvd1kpOw0KKyAgICAgIGlmIChmU3BsaXRQb3MgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZUxheW91dCA9DQorICAgICAgICAgICAgcFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQpOw0KKyAgICAgICAgaWYgKGVMYXlvdXQgPT0gWEZBX0FUVFJJQlVURUVOVU1fVGIgJiYNCisgICAgICAgICAgICBlUmV0VmFsdWUgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZSkgew0KKyAgICAgICAgICBwUHJvY2Vzc29yLT5Qcm9jZXNzVW5Vc2VPdmVyRmxvdyhwT3ZlcmZsb3dMZWFkZXJOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3ZlcmZsb3dUcmFpbGVyTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtLCBwRm9ybU5vZGUpOw0KKyAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1t1SEFsaWduXS5BZGQocFByb2Nlc3Nvci0+RXh0cmFjdExheW91dEl0ZW0oKSk7DQorICAgICAgICAgIGJBZGRlZEl0ZW1JblJvdyA9IFRSVUU7DQorICAgICAgICAgIGlmIChiVGFrZVNwYWNlKSB7DQorICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoIC09IGZDaGlsZFdpZHRoOw0KKyAgICAgICAgICAgIGlmIChmQ29udGVudEN1clJvd0hlaWdodCA8IGZDaGlsZEhlaWdodCkgew0KKyAgICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dIZWlnaHQgPSBmQ2hpbGRIZWlnaHQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9QYWdlRnVsbEJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1hGQV9Ob2RlICpwVGVtcExlYWRlck5vZGUgPSBOVUxMLCAqcFRlbXBUcmFpbGVyTm9kZSA9IE5VTEw7DQorICAgICAgICBpZiAocFRoaXMtPm1fcFBhZ2VNZ3IgJiYgIXBQcm9jZXNzb3ItPm1fYlVzZUluaGVyaWF0ZWQgJiYNCisgICAgICAgICAgICBlUmV0VmFsdWUgIT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfUGFnZUZ1bGxCcmVhaykgew0KKyAgICAgICAgICBwVGhpcy0+bV9wUGFnZU1nci0+UHJvY2Vzc092ZXJmbG93KHBGb3JtTm9kZSwgcFRlbXBMZWFkZXJOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wVHJhaWxlck5vZGUsIEZBTFNFLCBUUlVFKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwVHJhaWxlckxheW91dEl0ZW0gJiYgYklzQWRkVHJhaWxlckhlaWdodCkgew0KKyAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9BZGRUcmFpbGVyQmVmb3JlU3BsaXQoDQorICAgICAgICAgICAgICBwUHJvY2Vzc29yLCBmU3BsaXRQb3MsIHBUcmFpbGVyTGF5b3V0SXRlbSwgYlVzZUluaGVyaXRlZCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBwUHJvY2Vzc29yLT5TcGxpdExheW91dEl0ZW0oZlNwbGl0UG9zKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChiVXNlSW5oZXJpdGVkKSB7DQorICAgICAgICAgIHBQcm9jZXNzb3ItPlByb2Nlc3NVblVzZU92ZXJGbG93KHBPdmVyZmxvd0xlYWRlck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdmVyZmxvd1RyYWlsZXJOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhaWxlckxheW91dEl0ZW0sIHBGb3JtTm9kZSk7DQorICAgICAgICAgIHBUaGlzLT5tX2JVc2VJbmhlcmlhdGVkID0gVFJVRTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGlmIChwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkICYmDQorICAgICAgICAgICAgICBwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkLT5tX3BOZXh0U2libGluZyA9PQ0KKyAgICAgICAgICAgICAgICAgIE5VTEwgJiYNCisgICAgICAgICAgICAgIHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQtPm1fcEZvcm1Ob2RlLT5IYXNGbGFnKA0KKyAgICAgICAgICAgICAgICAgIFhGQV9OT0RFRkxBR19MYXlvdXRHZW5lcmF0ZWROb2RlKSkgew0KKyAgICAgICAgICAgIHBQcm9jZXNzb3ItPlByb2Nlc3NVblVzZU92ZXJGbG93KHBPdmVyZmxvd0xlYWRlck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE92ZXJmbG93VHJhaWxlck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtLCBwRm9ybU5vZGUpOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChwUHJvY2Vzc29yLT5KdWRnZUxlYWRlck9yVHJhaWxlckZvck9jY3VyKHBPdmVyZmxvd0xlYWRlck5vZGUpKSB7DQorICAgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9BZGRQZW5kaW5nTm9kZSgNCisgICAgICAgICAgICAgICAgICBwUHJvY2Vzc29yLCBwT3ZlcmZsb3dMZWFkZXJOb2RlLCBGQUxTRSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAocFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgICAgICAgcFByb2Nlc3Nvci0+R2V0Q3VycmVudENvbXBvbmVudFNpemUoZkNoaWxkV2lkdGgsIGZDaGlsZEhlaWdodCk7DQorICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zW3VIQWxpZ25dLkFkZChwUHJvY2Vzc29yLT5FeHRyYWN0TGF5b3V0SXRlbSgpKTsNCisgICAgICAgICAgYkFkZGVkSXRlbUluUm93ID0gVFJVRTsNCisgICAgICAgICAgaWYgKGJUYWtlU3BhY2UpIHsNCisgICAgICAgICAgICBmQ29udGVudEN1clJvd0F2YWlsV2lkdGggLT0gZkNoaWxkV2lkdGg7DQorICAgICAgICAgICAgaWYgKGZDb250ZW50Q3VyUm93SGVpZ2h0IDwgZkNoaWxkSGVpZ2h0KSB7DQorICAgICAgICAgICAgICBmQ29udGVudEN1clJvd0hlaWdodCA9IGZDaGlsZEhlaWdodDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9QYWdlRnVsbEJyZWFrOw0KKyAgICAgIH0gZWxzZSBpZiAoZkNvbnRlbnRDdXJSb3dZIDw9IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7DQorICAgICAgICBwUHJvY2Vzc29yLT5HZXRDdXJyZW50Q29tcG9uZW50U2l6ZShmQ2hpbGRXaWR0aCwgZkNoaWxkSGVpZ2h0KTsNCisgICAgICAgIGlmIChwUHJvY2Vzc29yLT5tX3BQYWdlTWdyLT5HZXROZXh0QXZhaWxDb250ZW50SGVpZ2h0KGZDaGlsZEhlaWdodCkpIHsNCisgICAgICAgICAgQ1hGQV9Ob2RlICpwVGVtcExlYWRlck5vZGUgPSBOVUxMLCAqcFRlbXBUcmFpbGVyTm9kZSA9IE5VTEw7DQorICAgICAgICAgIGlmIChwVGhpcy0+bV9wUGFnZU1ncikgew0KKyAgICAgICAgICAgIGlmIChwRm9ybU5vZGUgPT0gTlVMTCAmJiBwTGF5b3V0Q29udGV4dCAhPSBOVUxMKSB7DQorICAgICAgICAgICAgICBwRm9ybU5vZGUgPSBwTGF5b3V0Q29udGV4dC0+bV9wT3ZlcmZsb3dQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwVGhpcy0+bV9wUGFnZU1nci0+UHJvY2Vzc092ZXJmbG93KHBGb3JtTm9kZSwgcFRlbXBMZWFkZXJOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBUcmFpbGVyTm9kZSwgRkFMU0UsIFRSVUUpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChiVXNlSW5oZXJpdGVkKSB7DQorICAgICAgICAgICAgcFByb2Nlc3Nvci0+UHJvY2Vzc1VuVXNlT3ZlckZsb3cocE92ZXJmbG93TGVhZGVyTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3ZlcmZsb3dUcmFpbGVyTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhaWxlckxheW91dEl0ZW0sIHBGb3JtTm9kZSk7DQorICAgICAgICAgICAgcFRoaXMtPm1fYlVzZUluaGVyaWF0ZWQgPSBUUlVFOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9QYWdlRnVsbEJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbdUhBbGlnbl0uQWRkKHBQcm9jZXNzb3ItPkV4dHJhY3RMYXlvdXRJdGVtKCkpOw0KKyAgICAgICAgYkFkZGVkSXRlbUluUm93ID0gVFJVRTsNCisgICAgICAgIGlmIChiVGFrZVNwYWNlKSB7DQorICAgICAgICAgIGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCAtPSBmQ2hpbGRXaWR0aDsNCisgICAgICAgICAgaWYgKGZDb250ZW50Q3VyUm93SGVpZ2h0IDwgZkNoaWxkSGVpZ2h0KSB7DQorICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dIZWlnaHQgPSBmQ2hpbGRIZWlnaHQ7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmIChlUmV0VmFsdWUgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZSkgew0KKyAgICAgICAgICBiRm9yY2VFbmRQYWdlID0gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gZVJldFZhbHVlOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0ID0NCisgICAgICAgICAgICBwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0xheW91dCk7DQorICAgICAgICBpZiAocFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUtPkdldEludGFjdCgpID09IFhGQV9BVFRSSUJVVEVFTlVNX05vbmUgJiYNCisgICAgICAgICAgICBlTGF5b3V0ID09IFhGQV9BVFRSSUJVVEVFTlVNX1RiKSB7DQorICAgICAgICAgIGlmIChwVGhpcy0+bV9wUGFnZU1ncikgew0KKyAgICAgICAgICAgIHBUaGlzLT5tX3BQYWdlTWdyLT5Qcm9jZXNzT3ZlcmZsb3cocEZvcm1Ob2RlLCBwT3ZlcmZsb3dMZWFkZXJOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE92ZXJmbG93VHJhaWxlck5vZGUsIEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKHBUcmFpbGVyTGF5b3V0SXRlbSkgew0KKyAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0FkZFRyYWlsZXJCZWZvcmVTcGxpdChwUHJvY2Vzc29yLCBmU3BsaXRQb3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKHBQcm9jZXNzb3ItPkp1ZGdlTGVhZGVyT3JUcmFpbGVyRm9yT2NjdXIocE92ZXJmbG93TGVhZGVyTm9kZSkpIHsNCisgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9BZGRQZW5kaW5nTm9kZShwUHJvY2Vzc29yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdmVyZmxvd0xlYWRlck5vZGUsIEZBTFNFKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgaWYgKGVSZXRWYWx1ZSA9PSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lKSB7DQorICAgICAgICAgICAgaWYgKHBGb3JtTm9kZSA9PSBOVUxMICYmIHBMYXlvdXRDb250ZXh0ICE9IE5VTEwpIHsNCisgICAgICAgICAgICAgIHBGb3JtTm9kZSA9IHBMYXlvdXRDb250ZXh0LT5tX3BPdmVyZmxvd1Byb2Nlc3Nvci0+bV9wRm9ybU5vZGU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChwVGhpcy0+bV9wUGFnZU1ncikgew0KKyAgICAgICAgICAgICAgcFRoaXMtPm1fcFBhZ2VNZ3ItPlByb2Nlc3NPdmVyZmxvdyhwRm9ybU5vZGUsIHBPdmVyZmxvd0xlYWRlck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdmVyZmxvd1RyYWlsZXJOb2RlLCBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChiVXNlSW5oZXJpdGVkKSB7DQorICAgICAgICAgICAgICBwUHJvY2Vzc29yLT5Qcm9jZXNzVW5Vc2VPdmVyRmxvdyhwT3ZlcmZsb3dMZWFkZXJOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE92ZXJmbG93VHJhaWxlck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhaWxlckxheW91dEl0ZW0sIHBGb3JtTm9kZSk7DQorICAgICAgICAgICAgICBwVGhpcy0+bV9iVXNlSW5oZXJpYXRlZCA9IFRSVUU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfUGFnZUZ1bGxCcmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Sb3dGdWxsQnJlYWs7DQorICB9DQorICByZXR1cm4gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZTsNCit9DQorWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpEb0xheW91dEZsb3dlZENvbnRhaW5lcigNCisgICAgRlhfQk9PTCBiVXNlQnJlYWtDb250cm9sLA0KKyAgICBYRkFfQVRUUklCVVRFRU5VTSBlRmxvd1N0cmF0ZWd5LA0KKyAgICBGWF9GTE9BVCBmSGVpZ2h0TGltaXQsDQorICAgIEZYX0ZMT0FUIGZSZWFsSGVpZ2h0LA0KKyAgICBDWEZBX0xheW91dENvbnRleHQqIHBDb250ZXh0LA0KKyAgICBGWF9CT09MIGJSb290Rm9yY2VUYikgew0KKyAgbV9iSGFzQXZhaWxIZWlnaHQgPSBUUlVFOw0KKyAgRlhfRkxPQVQgZkNvbnRhaW5lcldpZHRoID0gMCwgZkNvbnRhaW5lckhlaWdodCA9IDA7DQorICBGWF9CT09MIGJCcmVha0RvbmUgPSBGQUxTRTsNCisgIEZYX0JPT0wgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPSBUUlVFLCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgPSBUUlVFOw0KKyAgRlhfQk9PTCBiRm9yY2VFbmRQYWdlID0gRkFMU0U7DQorICBGWF9CT09MIGJJc01hbnVhbEJyZWFrID0gRkFMU0U7DQorICBpZiAobV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IpIHsNCisgICAgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3ItPm1fZVByZVByb2Nlc3NScyA9DQorICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lOw0KKyAgfQ0KKyAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQ2FsY3VsYXRlQ29udGFpbmVyU3BlY2ZpZWRTaXplKA0KKyAgICAgIG1fcEZvcm1Ob2RlLCBmQ29udGFpbmVyV2lkdGgsIGZDb250YWluZXJIZWlnaHQsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLA0KKyAgICAgIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSk7DQorICBpZiAocENvbnRleHQgJiYgcENvbnRleHQtPm1fYkN1ckNvbHVtbldpZHRoQXZhaWFibGUpIHsNCisgICAgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPSBGQUxTRTsNCisgICAgZkNvbnRhaW5lcldpZHRoID0gcENvbnRleHQtPm1fZkN1ckNvbHVtbldpZHRoOw0KKyAgfQ0KKyAgaWYgKCFiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpIHsNCisgICAgZkNvbnRhaW5lckhlaWdodCAtPSBtX2ZVc2VkU2l6ZTsNCisgIH0NCisgIGlmICghYkNvbnRhaW5lckhlaWdodEF1dG9TaXplKSB7DQorICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBtX3BGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIEZYX0JPT0wgYkZvY3JUYiA9IEZBTFNFOw0KKyAgICBpZiAocFBhcmVudE5vZGUgJiYNCisgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0dldExheW91dChwUGFyZW50Tm9kZSwgYkZvY3JUYikgPT0NCisgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTV9Sb3cpIHsNCisgICAgICBDWEZBX05vZGUqIHBDaGlsZENvbnRhaW5lciA9IG1fcEZvcm1Ob2RlLT5HZXROb2RlSXRlbSgNCisgICAgICAgICAgWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpOw0KKyAgICAgIGlmIChwQ2hpbGRDb250YWluZXIgJiYNCisgICAgICAgICAgcENoaWxkQ29udGFpbmVyLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSkpIHsNCisgICAgICAgIGZDb250YWluZXJIZWlnaHQgPSAwOw0KKyAgICAgICAgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplID0gVFJVRTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIENYRkFfTm9kZSogcE1hcmdpbk5vZGUgPQ0KKyAgICAgIG1fcEZvcm1Ob2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9NYXJnaW4pOw0KKyAgRlhfRkxPQVQgZkxlZnRJbnNldCA9IDAsIGZUb3BJbnNldCA9IDAsIGZSaWdodEluc2V0ID0gMCwgZkJvdHRvbUluc2V0ID0gMDsNCisgIGlmIChwTWFyZ2luTm9kZSkgew0KKyAgICBmTGVmdEluc2V0ID0NCisgICAgICAgIHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTGVmdEluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICBmVG9wSW5zZXQgPQ0KKyAgICAgICAgcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Ub3BJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgICAgZlJpZ2h0SW5zZXQgPQ0KKyAgICAgICAgcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9SaWdodEluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICBmQm90dG9tSW5zZXQgPQ0KKyAgICAgICAgcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Cb3R0b21JbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgIH0NCisgIEZYX0ZMT0FUIGZDb250ZW50V2lkdGhMaW1pdCA9DQorICAgICAgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPyBYRkFfTEFZT1VUX0ZMT0FUX01BWA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZkNvbnRhaW5lcldpZHRoIC0gZkxlZnRJbnNldCAtIGZSaWdodEluc2V0Ow0KKyAgRlhfRkxPQVQgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSAwLCBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSAwOw0KKyAgRlhfRkxPQVQgZkF2YWlsSGVpZ2h0ID0gZkhlaWdodExpbWl0IC0gZlRvcEluc2V0IC0gZkJvdHRvbUluc2V0Ow0KKyAgaWYgKGZBdmFpbEhlaWdodCA8IDApIHsNCisgICAgbV9iSGFzQXZhaWxIZWlnaHQgPSBGQUxTRTsNCisgIH0NCisgIGZSZWFsSGVpZ2h0ID0gZlJlYWxIZWlnaHQgLSBmVG9wSW5zZXQgLSBmQm90dG9tSW5zZXQ7DQorICBGWF9GTE9BVCBmQ29udGVudEN1clJvd1kgPSAwOw0KKyAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcExheW91dENoaWxkID0gTlVMTDsNCisgIGlmIChtX3BMYXlvdXRJdGVtICE9IE5VTEwpIHsNCisgICAgaWYgKG1fbkN1ckNoaWxkTm9kZVN0YWdlICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0RvbmUgJiYNCisgICAgICAgIGVGbG93U3RyYXRlZ3kgIT0gWEZBX0FUVFJJQlVURUVOVU1fVGIpIHsNCisgICAgICBwTGF5b3V0Q2hpbGQgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopbV9wTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCisgICAgICBmb3IgKENYRkFfQ29udGVudExheW91dEl0ZW0qIHBMYXlvdXROZXh0ID0gcExheW91dENoaWxkOyBwTGF5b3V0TmV4dDsNCisgICAgICAgICAgIHBMYXlvdXROZXh0ID0gKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBMYXlvdXROZXh0LT5tX3BOZXh0U2libGluZykgew0KKyAgICAgICAgaWYgKHBMYXlvdXROZXh0LT5tX3NQb3MueSAhPSBwTGF5b3V0Q2hpbGQtPm1fc1Bvcy55KSB7DQorICAgICAgICAgIHBMYXlvdXRDaGlsZCA9IHBMYXlvdXROZXh0Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBmb3IgKENYRkFfQ29udGVudExheW91dEl0ZW0qIHBMYXlvdXRUZW1wQ2hpbGQgPQ0KKyAgICAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopbV9wTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCisgICAgICAgICBwTGF5b3V0VGVtcENoaWxkICE9IHBMYXlvdXRDaGlsZDsNCisgICAgICAgICBwTGF5b3V0VGVtcENoaWxkID0NCisgICAgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBMYXlvdXRUZW1wQ2hpbGQtPm1fcE5leHRTaWJsaW5nKSB7DQorICAgICAgaWYgKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UoDQorICAgICAgICAgICAgICBwTGF5b3V0VGVtcENoaWxkLT5tX3BGb3JtTm9kZSkpIHsNCisgICAgICAgIEZYX0ZMT0FUIGZDaGlsZENvbnRlbnRXaWR0aCA9DQorICAgICAgICAgICAgcExheW91dFRlbXBDaGlsZC0+bV9zUG9zLnggKyBwTGF5b3V0VGVtcENoaWxkLT5tX3NTaXplLng7DQorICAgICAgICBGWF9GTE9BVCBmQ2hpbGRDb250ZW50SGVpZ2h0ID0NCisgICAgICAgICAgICBwTGF5b3V0VGVtcENoaWxkLT5tX3NQb3MueSArIHBMYXlvdXRUZW1wQ2hpbGQtPm1fc1NpemUueTsNCisgICAgICAgIGlmIChmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA8IGZDaGlsZENvbnRlbnRXaWR0aCkgew0KKyAgICAgICAgICBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9IGZDaGlsZENvbnRlbnRXaWR0aDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPCBmQ2hpbGRDb250ZW50SGVpZ2h0KSB7DQorICAgICAgICAgIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA9IGZDaGlsZENvbnRlbnRIZWlnaHQ7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChwTGF5b3V0Q2hpbGQpIHsNCisgICAgICBmQ29udGVudEN1clJvd1kgPSBwTGF5b3V0Q2hpbGQtPm1fc1Bvcy55Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGZDb250ZW50Q3VyUm93WSA9IGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodDsNCisgICAgfQ0KKyAgfQ0KKyAgZkNvbnRlbnRDdXJSb3dZICs9IEluc2VydEtlZXBMYXlvdXRJdGVtcygpOw0KKyAgaWYgKG1fbkN1ckNoaWxkTm9kZVN0YWdlID09IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX05vbmUpIHsNCisgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfR290b05leHRDb250YWluZXJOb2RlKA0KKyAgICAgICAgbV9wQ3VyQ2hpbGROb2RlLCBtX25DdXJDaGlsZE5vZGVTdGFnZSwgbV9wRm9ybU5vZGUsIFRSVUUpOw0KKyAgfQ0KKyAgZkNvbnRlbnRDdXJSb3dZICs9DQorICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSW5zZXJ0UGVuZGluZ0l0ZW1zKHRoaXMsIG1fcEZvcm1Ob2RlKTsNCisgIGlmIChtX3BDdXJDaGlsZFByZXByb2Nlc3NvciAmJg0KKyAgICAgIG1fbkN1ckNoaWxkTm9kZVN0YWdlID09IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0NvbnRhaW5lcikgew0KKyAgICBpZiAoWEZBX0V4aXN0Q29udGFpbmVyS2VlcChtX3BDdXJDaGlsZFByZXByb2Nlc3Nvci0+R2V0Rm9ybU5vZGUoKSwgRkFMU0UpKSB7DQorICAgICAgbV9wS2VlcEhlYWROb2RlID0gbV9wQ3VyQ2hpbGROb2RlOw0KKyAgICAgIG1fYklzUHJvY2Vzc0tlZXAgPSBUUlVFOw0KKyAgICAgIG1fbkN1ckNoaWxkTm9kZVN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfS2VlcDsNCisgICAgfQ0KKyAgfQ0KKyAgd2hpbGUgKG1fbkN1ckNoaWxkTm9kZVN0YWdlICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0RvbmUpIHsNCisgICAgRlhfRkxPQVQgZkNvbnRlbnRDdXJSb3dIZWlnaHQgPSAwOw0KKyAgICBGWF9GTE9BVCBmQ29udGVudEN1clJvd0F2YWlsV2lkdGggPSBmQ29udGVudFdpZHRoTGltaXQ7DQorICAgIG1fZldpZHRoTGltaXRlID0gZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoOw0KKyAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKj4gcmdDdXJMaW5lTGF5b3V0SXRlbXNbM107DQorICAgIHVpbnQ4X3QgdUN1ckhBbGlnblN0YXRlID0NCisgICAgICAgIChlRmxvd1N0cmF0ZWd5ICE9IFhGQV9BVFRSSUJVVEVFTlVNX1JsX3RiID8gMCA6IDIpOw0KKyAgICBpZiAocExheW91dENoaWxkKSB7DQorICAgICAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwTGF5b3V0TmV4dCA9IHBMYXlvdXRDaGlsZDsgcExheW91dE5leHQ7DQorICAgICAgICAgICBwTGF5b3V0TmV4dCA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKilwTGF5b3V0TmV4dC0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgICAgIGlmIChwTGF5b3V0TmV4dC0+bV9wTmV4dFNpYmxpbmcgPT0gTlVMTCAmJiBtX3BDdXJDaGlsZFByZXByb2Nlc3NvciAmJg0KKyAgICAgICAgICAgIG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yLT5tX3BGb3JtTm9kZSA9PSBwTGF5b3V0TmV4dC0+bV9wRm9ybU5vZGUpIHsNCisgICAgICAgICAgcExheW91dE5leHQtPm1fcE5leHQgPSBtX3BDdXJDaGlsZFByZXByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbTsNCisgICAgICAgICAgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3ItPm1fcExheW91dEl0ZW0gPSBwTGF5b3V0TmV4dDsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICB1aW50OF90IHVIQWxpZ24gPSBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9IQWxpZ25FbnVtVG9JbnQoDQorICAgICAgICAgICAgcExheW91dE5leHQtPm1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfSEFsaWduKSk7DQorICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1t1SEFsaWduXS5BZGQocExheW91dE5leHQpOw0KKyAgICAgICAgaWYgKGVGbG93U3RyYXRlZ3kgPT0gWEZBX0FUVFJJQlVURUVOVU1fTHJfdGIpIHsNCisgICAgICAgICAgaWYgKHVIQWxpZ24gPiB1Q3VySEFsaWduU3RhdGUpIHsNCisgICAgICAgICAgICB1Q3VySEFsaWduU3RhdGUgPSB1SEFsaWduOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2UgaWYgKHVIQWxpZ24gPCB1Q3VySEFsaWduU3RhdGUpIHsNCisgICAgICAgICAgdUN1ckhBbGlnblN0YXRlID0gdUhBbGlnbjsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKHBMYXlvdXROZXh0LT5tX3BGb3JtTm9kZSkpIHsNCisgICAgICAgICAgaWYgKHBMYXlvdXROZXh0LT5tX3NTaXplLnkgPiBmQ29udGVudEN1clJvd0hlaWdodCkgew0KKyAgICAgICAgICAgIGZDb250ZW50Q3VyUm93SGVpZ2h0ID0gcExheW91dE5leHQtPm1fc1NpemUueTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBmQ29udGVudEN1clJvd0F2YWlsV2lkdGggLT0gcExheW91dE5leHQtPm1fc1NpemUueDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgaWYgKChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiltX3BMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkID09DQorICAgICAgICAgIHBMYXlvdXRDaGlsZCkgew0KKyAgICAgICAgbV9wTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZCA9IE5VTEw7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBMYXlvdXROZXh0ID0NCisgICAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopbV9wTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCisgICAgICAgIGZvciAoOyBwTGF5b3V0TmV4dDsNCisgICAgICAgICAgICAgcExheW91dE5leHQgPQ0KKyAgICAgICAgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBMYXlvdXROZXh0LT5tX3BOZXh0U2libGluZykgew0KKyAgICAgICAgICBpZiAoKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBMYXlvdXROZXh0LT5tX3BOZXh0U2libGluZyA9PQ0KKyAgICAgICAgICAgICAgcExheW91dENoaWxkKSB7DQorICAgICAgICAgICAgcExheW91dE5leHQtPm1fcE5leHRTaWJsaW5nID0gTlVMTDsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwTGF5b3V0TmV4dFRlbXAgPQ0KKyAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcExheW91dENoaWxkOw0KKyAgICAgIHdoaWxlIChwTGF5b3V0TmV4dFRlbXApIHsNCisgICAgICAgIHBMYXlvdXROZXh0VGVtcC0+bV9wUGFyZW50ID0gTlVMTDsNCisgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBTYXZlTGF5b3V0TmV4dCA9DQorICAgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBMYXlvdXROZXh0VGVtcC0+bV9wTmV4dFNpYmxpbmc7DQorICAgICAgICBwTGF5b3V0TmV4dFRlbXAtPm1fcE5leHRTaWJsaW5nID0gTlVMTDsNCisgICAgICAgIHBMYXlvdXROZXh0VGVtcCA9IHBTYXZlTGF5b3V0TmV4dDsNCisgICAgICB9DQorICAgICAgcExheW91dENoaWxkID0gTlVMTDsNCisgICAgfQ0KKyAgICB3aGlsZSAobV9wQ3VyQ2hpbGROb2RlKSB7DQorICAgICAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBwUHJvY2Vzc29yID0gTlVMTDsNCisgICAgICBGWF9CT09MIGJBZGRlZEl0ZW1JblJvdyA9IEZBTFNFOw0KKyAgICAgIGZDb250ZW50Q3VyUm93WSArPQ0KKyAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9JbnNlcnRQZW5kaW5nSXRlbXModGhpcywgbV9wRm9ybU5vZGUpOw0KKyAgICAgIHN3aXRjaCAobV9uQ3VyQ2hpbGROb2RlU3RhZ2UpIHsNCisgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfS2VlcDoNCisgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfTm9uZToNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0JyZWFrQmVmb3JlOiB7DQorICAgICAgICAgIGZvciAoaW50MzJfdCBpSW5kZXggPSAwOyBpSW5kZXggPCBtX2FycmF5S2VlcEl0ZW1zLkdldFNpemUoKTsNCisgICAgICAgICAgICAgICBpSW5kZXgrKykgew0KKyAgICAgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBJdGVtID0gbV9hcnJheUtlZXBJdGVtcy5HZXRBdChpSW5kZXgpOw0KKyAgICAgICAgICAgIG1fcExheW91dEl0ZW0tPlJlbW92ZUNoaWxkKHBJdGVtKTsNCisgICAgICAgICAgICBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgLT0gcEl0ZW0tPm1fc1NpemUueTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBDWEZBX05vZGUgKnBMZWFkZXJOb2RlID0gTlVMTCwgKnBUcmFpbGVyTm9kZSA9IE5VTEw7DQorICAgICAgICAgIEZYX0JPT0wgYkNyZWF0ZVBhZ2UgPSBGQUxTRTsNCisgICAgICAgICAgaWYgKGJVc2VCcmVha0NvbnRyb2wgJiYgbV9wUGFnZU1nciAmJg0KKyAgICAgICAgICAgICAgbV9wUGFnZU1nci0+UHJvY2Vzc0JyZWFrQmVmb3JlT3JBZnRlcihtX3BDdXJDaGlsZE5vZGUsIFRSVUUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMZWFkZXJOb2RlLCBwVHJhaWxlck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDcmVhdGVQYWdlKSAmJg0KKyAgICAgICAgICAgICAgbV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9Gb3JtICYmIGJDcmVhdGVQYWdlKSB7DQorICAgICAgICAgICAgaWYgKEp1ZGdlTGVhZGVyT3JUcmFpbGVyRm9yT2NjdXIocExlYWRlck5vZGUpKSB7DQorICAgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9BZGRQZW5kaW5nTm9kZSh0aGlzLCBwTGVhZGVyTm9kZSwgVFJVRSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChKdWRnZUxlYWRlck9yVHJhaWxlckZvck9jY3VyKHBUcmFpbGVyTm9kZSkpIHsNCisgICAgICAgICAgICAgIGlmIChtX3BGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCktPkdldENsYXNzSUQoKSA9PQ0KKyAgICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVF9Gb3JtICYmDQorICAgICAgICAgICAgICAgICAgbV9wTGF5b3V0SXRlbSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0FkZFBlbmRpbmdOb2RlKHRoaXMsIHBUcmFpbGVyTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSk7DQorICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBQcm9jZXNzb3IgPQ0KKyAgICAgICAgICAgICAgICAgICAgbmV3IENYRkFfSXRlbUxheW91dFByb2Nlc3NvcihwVHJhaWxlck5vZGUsIE5VTEwpOw0KKyNpZm5kZWYgX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8NCisgICAgICAgICAgICAgICAgcFByb2Nlc3Nvci0+bV9wUGFnZU1nckNyZWF0ZUl0ZW0gPSBtX3BQYWdlTWdyQ3JlYXRlSXRlbTsNCisjZW5kaWYNCisgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSW5zZXJ0Rmxvd2VkSXRlbSgNCisgICAgICAgICAgICAgICAgICAgIHRoaXMsIHBQcm9jZXNzb3IsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLA0KKyAgICAgICAgICAgICAgICAgICAgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLCBmQ29udGFpbmVySGVpZ2h0LCBlRmxvd1N0cmF0ZWd5LA0KKyAgICAgICAgICAgICAgICAgICAgdUN1ckhBbGlnblN0YXRlLCByZ0N1ckxpbmVMYXlvdXRJdGVtcywgRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICBYRkFfTEFZT1VUX0ZMT0FUX01BWCwgWEZBX0xBWU9VVF9GTE9BVF9NQVgsIGZDb250ZW50Q3VyUm93WSwNCisgICAgICAgICAgICAgICAgICAgIGZDb250ZW50V2lkdGhMaW1pdCwgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dIZWlnaHQsIGJBZGRlZEl0ZW1JblJvdywgYkZvcmNlRW5kUGFnZSwNCisgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0KTsNCisgICAgICAgICAgICAgICAgZGVsZXRlIHBQcm9jZXNzb3I7DQorICAgICAgICAgICAgICAgIHBQcm9jZXNzb3IgPSBOVUxMOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Hb3RvTmV4dENvbnRhaW5lck5vZGUoDQorICAgICAgICAgICAgICAgIG1fcEN1ckNoaWxkTm9kZSwgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UsIG1fcEZvcm1Ob2RlLCBUUlVFKTsNCisgICAgICAgICAgICBiRm9yY2VFbmRQYWdlID0gVFJVRTsNCisgICAgICAgICAgICBiSXNNYW51YWxCcmVhayA9IFRSVUU7DQorICAgICAgICAgICAgZ290byBTdXNwZW5kQW5kQ3JlYXRlTmV3Um93Ow0KKyAgICAgICAgICB9DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19CcmVha0FmdGVyOiB7DQorICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IGVSZXN1bHQ7DQorICAgICAgICAgIENYRkFfTm9kZSAqcExlYWRlck5vZGUgPSBOVUxMLCAqcFRyYWlsZXJOb2RlID0gTlVMTDsNCisgICAgICAgICAgRlhfQk9PTCBiQ3JlYXRlUGFnZSA9IEZBTFNFOw0KKyAgICAgICAgICBpZiAoYlVzZUJyZWFrQ29udHJvbCAmJiBtX3BQYWdlTWdyICYmDQorICAgICAgICAgICAgICBtX3BQYWdlTWdyLT5Qcm9jZXNzQnJlYWtCZWZvcmVPckFmdGVyKG1fcEN1ckNoaWxkTm9kZSwgRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMZWFkZXJOb2RlLCBwVHJhaWxlck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDcmVhdGVQYWdlKSAmJg0KKyAgICAgICAgICAgICAgbV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9Gb3JtKSB7DQorICAgICAgICAgICAgaWYgKEp1ZGdlTGVhZGVyT3JUcmFpbGVyRm9yT2NjdXIocFRyYWlsZXJOb2RlKSkgew0KKyAgICAgICAgICAgICAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBwUHJvY2Vzc29yID0NCisgICAgICAgICAgICAgICAgICBuZXcgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKHBUcmFpbGVyTm9kZSwgTlVMTCk7DQorI2lmbmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KKyAgICAgICAgICAgICAgcFByb2Nlc3Nvci0+bV9wUGFnZU1nckNyZWF0ZUl0ZW0gPSBtX3BQYWdlTWdyQ3JlYXRlSXRlbTsNCisjZW5kaWYNCisgICAgICAgICAgICAgIGVSZXN1bHQgPSBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9JbnNlcnRGbG93ZWRJdGVtKA0KKyAgICAgICAgICAgICAgICAgIHRoaXMsIHBQcm9jZXNzb3IsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLA0KKyAgICAgICAgICAgICAgICAgIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwgZkNvbnRhaW5lckhlaWdodCwgZUZsb3dTdHJhdGVneSwNCisgICAgICAgICAgICAgICAgICB1Q3VySEFsaWduU3RhdGUsIHJnQ3VyTGluZUxheW91dEl0ZW1zLCBGQUxTRSwNCisgICAgICAgICAgICAgICAgICBYRkFfTEFZT1VUX0ZMT0FUX01BWCwgWEZBX0xBWU9VVF9GTE9BVF9NQVgsIGZDb250ZW50Q3VyUm93WSwNCisgICAgICAgICAgICAgICAgICBmQ29udGVudFdpZHRoTGltaXQsIGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCwNCisgICAgICAgICAgICAgICAgICBmQ29udGVudEN1clJvd0hlaWdodCwgYkFkZGVkSXRlbUluUm93LCBiRm9yY2VFbmRQYWdlLA0KKyAgICAgICAgICAgICAgICAgIHBDb250ZXh0KTsNCisgICAgICAgICAgICAgIGRlbGV0ZSBwUHJvY2Vzc29yOw0KKyAgICAgICAgICAgICAgcFByb2Nlc3NvciA9IE5VTEw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICghYkNyZWF0ZVBhZ2UpIHsNCisgICAgICAgICAgICAgIGlmIChKdWRnZUxlYWRlck9yVHJhaWxlckZvck9jY3VyKHBMZWFkZXJOb2RlKSkgew0KKyAgICAgICAgICAgICAgICBDYWxjdWxhdGVSb3dDaGlsZFBvc2l0aW9uKA0KKyAgICAgICAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXMsIGVGbG93U3RyYXRlZ3ksDQorICAgICAgICAgICAgICAgICAgICBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLA0KKyAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGgsIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q3VyUm93WSwgZkNvbnRlbnRDdXJSb3dIZWlnaHQsIGZDb250ZW50V2lkdGhMaW1pdCk7DQorICAgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zLT5SZW1vdmVBbGwoKTsNCisgICAgICAgICAgICAgICAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBwUHJvY2Vzc29yID0NCisgICAgICAgICAgICAgICAgICAgIG5ldyBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IocExlYWRlck5vZGUsIE5VTEwpOw0KKyNpZm5kZWYgX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8NCisgICAgICAgICAgICAgICAgcFByb2Nlc3Nvci0+bV9wUGFnZU1nckNyZWF0ZUl0ZW0gPSBtX3BQYWdlTWdyQ3JlYXRlSXRlbTsNCisjZW5kaWYNCisgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSW5zZXJ0Rmxvd2VkSXRlbSgNCisgICAgICAgICAgICAgICAgICAgIHRoaXMsIHBQcm9jZXNzb3IsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLA0KKyAgICAgICAgICAgICAgICAgICAgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLCBmQ29udGFpbmVySGVpZ2h0LCBlRmxvd1N0cmF0ZWd5LA0KKyAgICAgICAgICAgICAgICAgICAgdUN1ckhBbGlnblN0YXRlLCByZ0N1ckxpbmVMYXlvdXRJdGVtcywgRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICBYRkFfTEFZT1VUX0ZMT0FUX01BWCwgWEZBX0xBWU9VVF9GTE9BVF9NQVgsIGZDb250ZW50Q3VyUm93WSwNCisgICAgICAgICAgICAgICAgICAgIGZDb250ZW50V2lkdGhMaW1pdCwgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dIZWlnaHQsIGJBZGRlZEl0ZW1JblJvdywgYkZvcmNlRW5kUGFnZSwNCisgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0KTsNCisgICAgICAgICAgICAgICAgZGVsZXRlIHBQcm9jZXNzb3I7DQorICAgICAgICAgICAgICAgIHBQcm9jZXNzb3IgPSBOVUxMOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBpZiAoSnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cihwTGVhZGVyTm9kZSkpIHsNCisgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQWRkUGVuZGluZ05vZGUodGhpcywgcExlYWRlck5vZGUsIFRSVUUpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Hb3RvTmV4dENvbnRhaW5lck5vZGUoDQorICAgICAgICAgICAgICAgIG1fcEN1ckNoaWxkTm9kZSwgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UsIG1fcEZvcm1Ob2RlLCBUUlVFKTsNCisgICAgICAgICAgICBpZiAoYkNyZWF0ZVBhZ2UpIHsNCisgICAgICAgICAgICAgIGJGb3JjZUVuZFBhZ2UgPSBUUlVFOw0KKyAgICAgICAgICAgICAgYklzTWFudWFsQnJlYWsgPSBUUlVFOw0KKyAgICAgICAgICAgICAgaWYgKG1fbkN1ckNoaWxkTm9kZVN0YWdlID09IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0RvbmUpIHsNCisgICAgICAgICAgICAgICAgYkJyZWFrRG9uZSA9IFRSVUU7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGdvdG8gU3VzcGVuZEFuZENyZWF0ZU5ld1JvdzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQm9va2VuZExlYWRlcjogew0KKyAgICAgICAgICBDWEZBX05vZGUqIHBMZWFkZXJOb2RlID0gTlVMTDsNCisgICAgICAgICAgaWYgKG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yKSB7DQorICAgICAgICAgICAgcFByb2Nlc3NvciA9IG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yOw0KKyAgICAgICAgICAgIG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yID0gTlVMTDsNCisgICAgICAgICAgfSBlbHNlIGlmIChtX3BQYWdlTWdyICYmDQorICAgICAgICAgICAgICAgICAgICAgbV9wUGFnZU1nci0+UHJvY2Vzc0Jvb2tlbmRMZWFkZXJPclRyYWlsZXIoDQorICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1ckNoaWxkTm9kZSwgVFJVRSwgcExlYWRlck5vZGUpKSB7DQorICAgICAgICAgICAgcFByb2Nlc3NvciA9IG5ldyBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IocExlYWRlck5vZGUsIG1fcFBhZ2VNZ3IpOw0KKyNpZm5kZWYgX1hGQV9MQVlPVVRJVEVNX1Byb2Nlc3NDQUNIRV8NCisgICAgICAgICAgICBwUHJvY2Vzc29yLT5tX3BQYWdlTWdyQ3JlYXRlSXRlbSA9IG1fcFBhZ2VNZ3JDcmVhdGVJdGVtOw0KKyNlbmRpZg0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChwUHJvY2Vzc29yKSB7DQorICAgICAgICAgICAgaWYgKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0luc2VydEZsb3dlZEl0ZW0oDQorICAgICAgICAgICAgICAgICAgICB0aGlzLCBwUHJvY2Vzc29yLCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwgZkNvbnRhaW5lckhlaWdodCwgZUZsb3dTdHJhdGVneSwNCisgICAgICAgICAgICAgICAgICAgIHVDdXJIQWxpZ25TdGF0ZSwgcmdDdXJMaW5lTGF5b3V0SXRlbXMsIGJVc2VCcmVha0NvbnRyb2wsDQorICAgICAgICAgICAgICAgICAgICBmQXZhaWxIZWlnaHQsIGZSZWFsSGVpZ2h0LCBmQ29udGVudEN1clJvd1ksDQorICAgICAgICAgICAgICAgICAgICBmQ29udGVudFdpZHRoTGltaXQsIGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q3VyUm93SGVpZ2h0LCBiQWRkZWRJdGVtSW5Sb3csIGJGb3JjZUVuZFBhZ2UsDQorICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCkgIT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfRG9uZSkgew0KKyAgICAgICAgICAgICAgZ290byBTdXNwZW5kQW5kQ3JlYXRlTmV3Um93Ow0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICBkZWxldGUgcFByb2Nlc3NvcjsNCisgICAgICAgICAgICAgIHBQcm9jZXNzb3IgPSBOVUxMOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQm9va2VuZFRyYWlsZXI6IHsNCisgICAgICAgICAgQ1hGQV9Ob2RlKiBwVHJhaWxlck5vZGUgPSBOVUxMOw0KKyAgICAgICAgICBpZiAobV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IpIHsNCisgICAgICAgICAgICBwUHJvY2Vzc29yID0gbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3I7DQorICAgICAgICAgICAgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IgPSBOVUxMOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKG1fcFBhZ2VNZ3IgJiYNCisgICAgICAgICAgICAgICAgICAgICBtX3BQYWdlTWdyLT5Qcm9jZXNzQm9va2VuZExlYWRlck9yVHJhaWxlcigNCisgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VyQ2hpbGROb2RlLCBGQUxTRSwgcFRyYWlsZXJOb2RlKSkgew0KKyAgICAgICAgICAgIHBQcm9jZXNzb3IgPSBuZXcgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKHBUcmFpbGVyTm9kZSwgbV9wUGFnZU1ncik7DQorI2lmbmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KKyAgICAgICAgICAgIHBQcm9jZXNzb3ItPm1fcFBhZ2VNZ3JDcmVhdGVJdGVtID0gbV9wUGFnZU1nckNyZWF0ZUl0ZW07DQorI2VuZGlmDQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKHBQcm9jZXNzb3IpIHsNCisgICAgICAgICAgICBpZiAoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSW5zZXJ0Rmxvd2VkSXRlbSgNCisgICAgICAgICAgICAgICAgICAgIHRoaXMsIHBQcm9jZXNzb3IsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLA0KKyAgICAgICAgICAgICAgICAgICAgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLCBmQ29udGFpbmVySGVpZ2h0LCBlRmxvd1N0cmF0ZWd5LA0KKyAgICAgICAgICAgICAgICAgICAgdUN1ckhBbGlnblN0YXRlLCByZ0N1ckxpbmVMYXlvdXRJdGVtcywgYlVzZUJyZWFrQ29udHJvbCwNCisgICAgICAgICAgICAgICAgICAgIGZBdmFpbEhlaWdodCwgZlJlYWxIZWlnaHQsIGZDb250ZW50Q3VyUm93WSwNCisgICAgICAgICAgICAgICAgICAgIGZDb250ZW50V2lkdGhMaW1pdCwgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dIZWlnaHQsIGJBZGRlZEl0ZW1JblJvdywgYkZvcmNlRW5kUGFnZSwNCisgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0KSAhPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lKSB7DQorICAgICAgICAgICAgICBnb3RvIFN1c3BlbmRBbmRDcmVhdGVOZXdSb3c7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIGRlbGV0ZSBwUHJvY2Vzc29yOw0KKyAgICAgICAgICAgICAgcFByb2Nlc3NvciA9IE5VTEw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Db250YWluZXI6DQorICAgICAgICAgIEFTU0VSVChtX3BDdXJDaGlsZE5vZGUtPklzQ29udGFpbmVyTm9kZSgpKTsNCisgICAgICAgICAgaWYgKG1fcEN1ckNoaWxkTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1ZhcmlhYmxlcykgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChmQ29udGVudEN1clJvd1kgPj0gZkhlaWdodExpbWl0ICsgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04gJiYNCisgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UobV9wQ3VyQ2hpbGROb2RlKSkgew0KKyAgICAgICAgICAgIGJGb3JjZUVuZFBhZ2UgPSBUUlVFOw0KKyAgICAgICAgICAgIGdvdG8gU3VzcGVuZEFuZENyZWF0ZU5ld1JvdzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAobV9wQ3VyQ2hpbGROb2RlLT5Jc0NvbnRhaW5lck5vZGUoKSkgew0KKyAgICAgICAgICAgIEZYX0JPT0wgYk5ld1JvdyA9IEZBTFNFOw0KKyAgICAgICAgICAgIGlmIChtX3BDdXJDaGlsZFByZXByb2Nlc3Nvcikgew0KKyAgICAgICAgICAgICAgcFByb2Nlc3NvciA9IG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yOw0KKyAgICAgICAgICAgICAgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IgPSBOVUxMOw0KKyAgICAgICAgICAgICAgYk5ld1JvdyA9IFRSVUU7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHBQcm9jZXNzb3IgPQ0KKyAgICAgICAgICAgICAgICAgIG5ldyBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IobV9wQ3VyQ2hpbGROb2RlLCBtX3BQYWdlTWdyKTsNCisjaWZuZGVmIF9YRkFfTEFZT1VUSVRFTV9Qcm9jZXNzQ0FDSEVfDQorICAgICAgICAgICAgICBwUHJvY2Vzc29yLT5tX3BQYWdlTWdyQ3JlYXRlSXRlbSA9IG1fcFBhZ2VNZ3JDcmVhdGVJdGVtOw0KKyNlbmRpZg0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9JbnNlcnRQZW5kaW5nSXRlbXMocFByb2Nlc3NvciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VyQ2hpbGROb2RlKTsNCisgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBycyA9DQorICAgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0luc2VydEZsb3dlZEl0ZW0oDQorICAgICAgICAgICAgICAgICAgICB0aGlzLCBwUHJvY2Vzc29yLCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwgZkNvbnRhaW5lckhlaWdodCwgZUZsb3dTdHJhdGVneSwNCisgICAgICAgICAgICAgICAgICAgIHVDdXJIQWxpZ25TdGF0ZSwgcmdDdXJMaW5lTGF5b3V0SXRlbXMsIGJVc2VCcmVha0NvbnRyb2wsDQorICAgICAgICAgICAgICAgICAgICBmQXZhaWxIZWlnaHQsIGZSZWFsSGVpZ2h0LCBmQ29udGVudEN1clJvd1ksDQorICAgICAgICAgICAgICAgICAgICBmQ29udGVudFdpZHRoTGltaXQsIGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q3VyUm93SGVpZ2h0LCBiQWRkZWRJdGVtSW5Sb3csIGJGb3JjZUVuZFBhZ2UsDQorICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCwgYk5ld1Jvdyk7DQorICAgICAgICAgICAgc3dpdGNoIChycykgew0KKyAgICAgICAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9NYW51YWxCcmVhazoNCisgICAgICAgICAgICAgICAgYklzTWFudWFsQnJlYWsgPSBUUlVFOw0KKyAgICAgICAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9QYWdlRnVsbEJyZWFrOg0KKyAgICAgICAgICAgICAgICBiRm9yY2VFbmRQYWdlID0gVFJVRTsNCisgICAgICAgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfUm93RnVsbEJyZWFrOg0KKyAgICAgICAgICAgICAgICBnb3RvIFN1c3BlbmRBbmRDcmVhdGVOZXdSb3c7DQorICAgICAgICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmU6DQorICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBmQ29udGVudEN1clJvd1kgKz0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSW5zZXJ0UGVuZGluZ0l0ZW1zKA0KKyAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NvciwgbV9wQ3VyQ2hpbGROb2RlKTsNCisgICAgICAgICAgICAgICAgZGVsZXRlIHBQcm9jZXNzb3I7DQorICAgICAgICAgICAgICAgIHBQcm9jZXNzb3IgPSBOVUxMOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfRG9uZToNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfR290b05leHRDb250YWluZXJOb2RlKA0KKyAgICAgICAgICBtX3BDdXJDaGlsZE5vZGUsIG1fbkN1ckNoaWxkTm9kZVN0YWdlLCBtX3BGb3JtTm9kZSwgVFJVRSk7DQorICAgICAgaWYgKGJBZGRlZEl0ZW1JblJvdyAmJiBlRmxvd1N0cmF0ZWd5ID09IFhGQV9BVFRSSUJVVEVFTlVNX1RiKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICBTdXNwZW5kQW5kQ3JlYXRlTmV3Um93Og0KKyAgICAgIGlmIChwUHJvY2Vzc29yKSB7DQorICAgICAgICBtX3BDdXJDaGlsZFByZXByb2Nlc3NvciA9IHBQcm9jZXNzb3I7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIENhbGN1bGF0ZVJvd0NoaWxkUG9zaXRpb24ocmdDdXJMaW5lTGF5b3V0SXRlbXMsIGVGbG93U3RyYXRlZ3ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCwgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDb250ZW50Q3VyUm93WSwgZkNvbnRlbnRDdXJSb3dIZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRXaWR0aExpbWl0LCBiUm9vdEZvcmNlVGIpOw0KKyAgICBtX2ZXaWR0aExpbWl0ZSA9IGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aDsNCisgICAgaWYgKGJGb3JjZUVuZFBhZ2UpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgRlhfQk9PTCBiUmV0VmFsdWUgPQ0KKyAgICAgIChtX25DdXJDaGlsZE5vZGVTdGFnZSA9PSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Eb25lICYmDQorICAgICAgIG1fcmdQZW5kaW5nTm9kZXMuR2V0Q291bnQoKSA9PSAwKTsNCisgIGlmIChiQnJlYWtEb25lKSB7DQorICAgIGJSZXRWYWx1ZSA9IEZBTFNFOw0KKyAgfQ0KKyAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfQ2FsY3VsYXRlQ29udGFpbmVyQ29tcG9uZW50U2l6ZUZyb21Db250ZW50U2l6ZSgNCisgICAgICBtX3BGb3JtTm9kZSwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoLA0KKyAgICAgIGZDb250YWluZXJXaWR0aCwgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLCBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsDQorICAgICAgZkNvbnRhaW5lckhlaWdodCk7DQorICBpZiAoZkNvbnRhaW5lckhlaWdodCA+PSBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTiB8fCBtX3BMYXlvdXRJdGVtIHx8DQorICAgICAgYlJldFZhbHVlKSB7DQorICAgIGlmIChtX3BMYXlvdXRJdGVtID09IE5VTEwpIHsNCisgICAgICBtX3BMYXlvdXRJdGVtID0gQ3JlYXRlQ29udGVudExheW91dEl0ZW0obV9wRm9ybU5vZGUpOw0KKyAgICB9DQorICAgIGlmIChmQ29udGFpbmVySGVpZ2h0IDwgMCkgew0KKyAgICAgIGZDb250YWluZXJIZWlnaHQgPSAwOw0KKyAgICB9DQorICAgIFNldEN1cnJlbnRDb21wb25lbnRTaXplKGZDb250YWluZXJXaWR0aCwgZkNvbnRhaW5lckhlaWdodCk7DQorICAgIGlmIChiRm9yY2VFbmRQYWdlKSB7DQorICAgICAgbV9mVXNlZFNpemUgPSAwOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG1fZlVzZWRTaXplICs9IG1fcExheW91dEl0ZW0tPm1fc1NpemUueTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGJSZXRWYWx1ZQ0KKyAgICAgICAgICAgICA/IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmUNCisgICAgICAgICAgICAgOiAoYklzTWFudWFsQnJlYWsgPyBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9NYW51YWxCcmVhaw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X1BhZ2VGdWxsQnJlYWspOw0KK30NCitGWF9CT09MIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6Q2FsY3VsYXRlUm93Q2hpbGRQb3NpdGlvbigNCisgICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSo+KCZyZ0N1ckxpbmVMYXlvdXRJdGVtcylbM10sDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVGbG93U3RyYXRlZ3ksDQorICAgIEZYX0JPT0wgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLA0KKyAgICBGWF9CT09MIGJDb250YWluZXJXaWR0aEF1dG9TaXplLA0KKyAgICBGWF9GTE9BVCYgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGgsDQorICAgIEZYX0ZMT0FUJiBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsDQorICAgIEZYX0ZMT0FUJiBmQ29udGVudEN1clJvd1ksDQorICAgIEZYX0ZMT0FUIGZDb250ZW50Q3VyUm93SGVpZ2h0LA0KKyAgICBGWF9GTE9BVCBmQ29udGVudFdpZHRoTGltaXQsDQorICAgIEZYX0JPT0wgYlJvb3RGb3JjZVRiKSB7DQorICBpbnQzMl90IG5Hcm91cExlbmd0aHNbM10gPSB7MCwgMCwgMH07DQorICBGWF9GTE9BVCBmR3JvdXBXaWR0aHNbM10gPSB7MCwgMCwgMH07DQorICBpbnQzMl90IG5Ub3RhbExlbmd0aCA9IDA7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAzOyBpKyspIHsNCisgICAgbkdyb3VwTGVuZ3Roc1tpXSA9IHJnQ3VyTGluZUxheW91dEl0ZW1zW2ldLkdldFNpemUoKTsNCisgICAgZm9yIChpbnQzMl90IGMgPSBuR3JvdXBMZW5ndGhzW2ldLCBqID0gMDsgaiA8IGM7IGorKykgew0KKyAgICAgIG5Ub3RhbExlbmd0aCsrOw0KKyAgICAgIGlmIChYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKA0KKyAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbaV1bal0tPm1fcEZvcm1Ob2RlKSkgew0KKyAgICAgICAgZkdyb3VwV2lkdGhzW2ldICs9IHJnQ3VyTGluZUxheW91dEl0ZW1zW2ldW2pdLT5tX3NTaXplLng7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAoIW5Ub3RhbExlbmd0aCkgew0KKyAgICBpZiAoYkNvbnRhaW5lckhlaWdodEF1dG9TaXplKSB7DQorICAgICAgRlhfRkxPQVQgZk5ld0hlaWdodCA9IGZDb250ZW50Q3VyUm93WTsNCisgICAgICBpZiAoZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID4gZk5ld0hlaWdodCkgew0KKyAgICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0gZk5ld0hlaWdodDsNCisgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKG1fcExheW91dEl0ZW0gPT0gTlVMTCkgew0KKyAgICBtX3BMYXlvdXRJdGVtID0gQ3JlYXRlQ29udGVudExheW91dEl0ZW0obV9wRm9ybU5vZGUpOw0KKyAgfQ0KKyAgaWYgKGVGbG93U3RyYXRlZ3kgIT0gWEZBX0FUVFJJQlVURUVOVU1fUmxfdGIpIHsNCisgICAgRlhfRkxPQVQgZkN1clBvczsNCisgICAgZkN1clBvcyA9IDA7DQorICAgIGZvciAoaW50MzJfdCBjID0gbkdyb3VwTGVuZ3Roc1swXSwgaiA9IDA7IGogPCBjOyBqKyspIHsNCisgICAgICBpZiAoYlJvb3RGb3JjZVRiKSB7DQorICAgICAgICBGWF9GTE9BVCBmQWJzb2x1dGVYLCBmQWJzb2x1dGVZOw0KKyAgICAgICAgQ2FsY3VsYXRlUG9zaXRpb25lZENvbnRhaW5lclBvcyhyZ0N1ckxpbmVMYXlvdXRJdGVtc1swXVtqXS0+bV9wRm9ybU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzBdW2pdLT5tX3NTaXplLngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzBdW2pdLT5tX3NTaXplLnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZBYnNvbHV0ZVgsIGZBYnNvbHV0ZVkpOw0KKyAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMF1bal0tPm1fc1Bvcy5TZXQoZkFic29sdXRlWCwgZkFic29sdXRlWSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzBdW2pdLT5tX3NQb3MuU2V0KGZDdXJQb3MsIGZDb250ZW50Q3VyUm93WSk7DQorICAgICAgICBpZiAoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZSgNCisgICAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMF1bal0tPm1fcEZvcm1Ob2RlKSkgew0KKyAgICAgICAgICBmQ3VyUG9zICs9IHJnQ3VyTGluZUxheW91dEl0ZW1zWzBdW2pdLT5tX3NTaXplLng7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIG1fcExheW91dEl0ZW0tPkFkZENoaWxkKHJnQ3VyTGluZUxheW91dEl0ZW1zWzBdW2pdKTsNCisgICAgICBtX2ZMYXN0Um93V2lkdGggPSBmQ3VyUG9zOw0KKyAgICB9DQorICAgIGZDdXJQb3MgPSAoZkNvbnRlbnRXaWR0aExpbWl0ICsgZkdyb3VwV2lkdGhzWzBdIC0gZkdyb3VwV2lkdGhzWzFdIC0NCisgICAgICAgICAgICAgICBmR3JvdXBXaWR0aHNbMl0pIC8NCisgICAgICAgICAgICAgIDI7DQorICAgIGZvciAoaW50MzJfdCBjID0gbkdyb3VwTGVuZ3Roc1sxXSwgaiA9IDA7IGogPCBjOyBqKyspIHsNCisgICAgICBpZiAoYlJvb3RGb3JjZVRiKSB7DQorICAgICAgICBGWF9GTE9BVCBmQWJzb2x1dGVYLCBmQWJzb2x1dGVZOw0KKyAgICAgICAgQ2FsY3VsYXRlUG9zaXRpb25lZENvbnRhaW5lclBvcyhyZ0N1ckxpbmVMYXlvdXRJdGVtc1sxXVtqXS0+bV9wRm9ybU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzFdW2pdLT5tX3NTaXplLngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzFdW2pdLT5tX3NTaXplLnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZBYnNvbHV0ZVgsIGZBYnNvbHV0ZVkpOw0KKyAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMV1bal0tPm1fc1Bvcy5TZXQoZkFic29sdXRlWCwgZkFic29sdXRlWSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzFdW2pdLT5tX3NQb3MuU2V0KGZDdXJQb3MsIGZDb250ZW50Q3VyUm93WSk7DQorICAgICAgICBpZiAoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZSgNCisgICAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMV1bal0tPm1fcEZvcm1Ob2RlKSkgew0KKyAgICAgICAgICBmQ3VyUG9zICs9IHJnQ3VyTGluZUxheW91dEl0ZW1zWzFdW2pdLT5tX3NTaXplLng7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIG1fcExheW91dEl0ZW0tPkFkZENoaWxkKHJnQ3VyTGluZUxheW91dEl0ZW1zWzFdW2pdKTsNCisgICAgICBtX2ZMYXN0Um93V2lkdGggPSBmQ3VyUG9zOw0KKyAgICB9DQorICAgIGZDdXJQb3MgPSBmQ29udGVudFdpZHRoTGltaXQgLSBmR3JvdXBXaWR0aHNbMl07DQorICAgIGZvciAoaW50MzJfdCBjID0gbkdyb3VwTGVuZ3Roc1syXSwgaiA9IDA7IGogPCBjOyBqKyspIHsNCisgICAgICBpZiAoYlJvb3RGb3JjZVRiKSB7DQorICAgICAgICBGWF9GTE9BVCBmQWJzb2x1dGVYLCBmQWJzb2x1dGVZOw0KKyAgICAgICAgQ2FsY3VsYXRlUG9zaXRpb25lZENvbnRhaW5lclBvcyhyZ0N1ckxpbmVMYXlvdXRJdGVtc1syXVtqXS0+bV9wRm9ybU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdLT5tX3NTaXplLngsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdLT5tX3NTaXplLnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZBYnNvbHV0ZVgsIGZBYnNvbHV0ZVkpOw0KKyAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMl1bal0tPm1fc1Bvcy5TZXQoZkFic29sdXRlWCwgZkFic29sdXRlWSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdLT5tX3NQb3MuU2V0KGZDdXJQb3MsIGZDb250ZW50Q3VyUm93WSk7DQorICAgICAgICBpZiAoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZSgNCisgICAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMl1bal0tPm1fcEZvcm1Ob2RlKSkgew0KKyAgICAgICAgICBmQ3VyUG9zICs9IHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdLT5tX3NTaXplLng7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIG1fcExheW91dEl0ZW0tPkFkZENoaWxkKHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdKTsNCisgICAgICBtX2ZMYXN0Um93V2lkdGggPSBmQ3VyUG9zOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBGWF9GTE9BVCBmQ3VyUG9zOw0KKyAgICBmQ3VyUG9zID0gZkdyb3VwV2lkdGhzWzBdOw0KKyAgICBmb3IgKGludDMyX3QgYyA9IG5Hcm91cExlbmd0aHNbMF0sIGogPSAwOyBqIDwgYzsgaisrKSB7DQorICAgICAgaWYgKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UoDQorICAgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1swXVtqXS0+bV9wRm9ybU5vZGUpKSB7DQorICAgICAgICBmQ3VyUG9zIC09IHJnQ3VyTGluZUxheW91dEl0ZW1zWzBdW2pdLT5tX3NTaXplLng7DQorICAgICAgfQ0KKyAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzBdW2pdLT5tX3NQb3MuU2V0KGZDdXJQb3MsIGZDb250ZW50Q3VyUm93WSk7DQorICAgICAgbV9wTGF5b3V0SXRlbS0+QWRkQ2hpbGQocmdDdXJMaW5lTGF5b3V0SXRlbXNbMF1bal0pOw0KKyAgICAgIG1fZkxhc3RSb3dXaWR0aCA9IGZDdXJQb3M7DQorICAgIH0NCisgICAgZkN1clBvcyA9IChmQ29udGVudFdpZHRoTGltaXQgKyBmR3JvdXBXaWR0aHNbMF0gKyBmR3JvdXBXaWR0aHNbMV0gLQ0KKyAgICAgICAgICAgICAgIGZHcm91cFdpZHRoc1syXSkgLw0KKyAgICAgICAgICAgICAgMjsNCisgICAgZm9yIChpbnQzMl90IGMgPSBuR3JvdXBMZW5ndGhzWzFdLCBqID0gMDsgaiA8IGM7IGorKykgew0KKyAgICAgIGlmIChYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKA0KKyAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMV1bal0tPm1fcEZvcm1Ob2RlKSkgew0KKyAgICAgICAgZkN1clBvcyAtPSByZ0N1ckxpbmVMYXlvdXRJdGVtc1sxXVtqXS0+bV9zU2l6ZS54Ow0KKyAgICAgIH0NCisgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1sxXVtqXS0+bV9zUG9zLlNldChmQ3VyUG9zLCBmQ29udGVudEN1clJvd1kpOw0KKyAgICAgIG1fcExheW91dEl0ZW0tPkFkZENoaWxkKHJnQ3VyTGluZUxheW91dEl0ZW1zWzFdW2pdKTsNCisgICAgICBtX2ZMYXN0Um93V2lkdGggPSBmQ3VyUG9zOw0KKyAgICB9DQorICAgIGZDdXJQb3MgPSBmQ29udGVudFdpZHRoTGltaXQ7DQorICAgIGZvciAoaW50MzJfdCBjID0gbkdyb3VwTGVuZ3Roc1syXSwgaiA9IDA7IGogPCBjOyBqKyspIHsNCisgICAgICBpZiAoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZSgNCisgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdLT5tX3BGb3JtTm9kZSkpIHsNCisgICAgICAgIGZDdXJQb3MgLT0gcmdDdXJMaW5lTGF5b3V0SXRlbXNbMl1bal0tPm1fc1NpemUueDsNCisgICAgICB9DQorICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMl1bal0tPm1fc1Bvcy5TZXQoZkN1clBvcywgZkNvbnRlbnRDdXJSb3dZKTsNCisgICAgICBtX3BMYXlvdXRJdGVtLT5BZGRDaGlsZChyZ0N1ckxpbmVMYXlvdXRJdGVtc1syXVtqXSk7DQorICAgICAgbV9mTGFzdFJvd1dpZHRoID0gZkN1clBvczsNCisgICAgfQ0KKyAgfQ0KKyAgbV9mTGFzdFJvd1kgPSBmQ29udGVudEN1clJvd1k7DQorICBmQ29udGVudEN1clJvd1kgKz0gZkNvbnRlbnRDdXJSb3dIZWlnaHQ7DQorICBpZiAoYkNvbnRhaW5lcldpZHRoQXV0b1NpemUpIHsNCisgICAgRlhfRkxPQVQgZkNoaWxkU3VwcGxpZWRXaWR0aCA9IGZHcm91cFdpZHRoc1swXTsNCisgICAgaWYgKGZDb250ZW50V2lkdGhMaW1pdCA8IFhGQV9MQVlPVVRfRkxPQVRfTUFYICYmDQorICAgICAgICBmQ29udGVudFdpZHRoTGltaXQgPiBmQ2hpbGRTdXBwbGllZFdpZHRoKSB7DQorICAgICAgZkNoaWxkU3VwcGxpZWRXaWR0aCA9IGZDb250ZW50V2lkdGhMaW1pdDsNCisgICAgfQ0KKyAgICBpZiAoZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPCBmQ2hpbGRTdXBwbGllZFdpZHRoKSB7DQorICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSBmQ2hpbGRTdXBwbGllZFdpZHRoOw0KKyAgICB9DQorICB9DQorICBpZiAoYkNvbnRhaW5lckhlaWdodEF1dG9TaXplKSB7DQorICAgIEZYX0ZMT0FUIGZDaGlsZFN1cHBsaWVkSGVpZ2h0ID0gZkNvbnRlbnRDdXJSb3dZOw0KKyAgICBpZiAoZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0IDwgZkNoaWxkU3VwcGxpZWRIZWlnaHQpIHsNCisgICAgICBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSBmQ2hpbGRTdXBwbGllZEhlaWdodDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpHZXRTdWJmb3JtU2V0UGFyZW50KA0KKyAgICBDWEZBX05vZGUqIHBTdWJmb3JtU2V0KSB7DQorICBpZiAocFN1YmZvcm1TZXQgJiYgcFN1YmZvcm1TZXQtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0KSB7DQorICAgIENYRkFfTm9kZSogcFBhcmVudCA9IHBTdWJmb3JtU2V0LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgd2hpbGUgKHBQYXJlbnQpIHsNCisgICAgICBpZiAocFBhcmVudC0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQpIHsNCisgICAgICAgIHJldHVybiBwUGFyZW50Ow0KKyAgICAgIH0NCisgICAgICBwUGFyZW50ID0gcFBhcmVudC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBwU3ViZm9ybVNldDsNCit9DQordm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkRvTGF5b3V0RmllbGQoKSB7DQorICBpZiAobV9wTGF5b3V0SXRlbSAhPSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEFTU0VSVChtX3BDdXJDaGlsZE5vZGUgPT0gWEZBX0xBWU9VVF9JTlZBTElETk9ERSk7DQorICBtX3BMYXlvdXRJdGVtID0gQ3JlYXRlQ29udGVudExheW91dEl0ZW0obV9wRm9ybU5vZGUpOw0KKyAgaWYgKCFtX3BMYXlvdXRJdGVtKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IG1fcEZvcm1Ob2RlLT5HZXREb2N1bWVudCgpOw0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBwRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIEZYX0ZMT0FUIGZIZWlnaHQgPSAtMTsNCisgIEZYX0ZMT0FUIGZXaWR0aCA9IC0xOw0KKyAgcE5vdGlmeS0+U3RhcnRGaWVsZERyYXdMYXlvdXQobV9wRm9ybU5vZGUsIGZXaWR0aCwgZkhlaWdodCk7DQorICBpbnQzMl90IG5Sb3RhdGUgPQ0KKyAgICAgIEZYU1lTX3JvdW5kKG1fcEZvcm1Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUm90YXRlKS5HZXRWYWx1ZSgpKTsNCisgIG5Sb3RhdGUgPSBYRkFfTWFwUm90YXRpb24oblJvdGF0ZSk7DQorICBpZiAoblJvdGF0ZSA9PSA5MCB8fCBuUm90YXRlID09IDI3MCkgew0KKyAgICBGWF9GTE9BVCBmVG1wID0gZldpZHRoOw0KKyAgICBmV2lkdGggPSBmSGVpZ2h0Ow0KKyAgICBmSGVpZ2h0ID0gZlRtcDsNCisgIH0NCisgIFNldEN1cnJlbnRDb21wb25lbnRTaXplKGZXaWR0aCwgZkhlaWdodCk7DQorfQ0KK1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6RG9MYXlvdXQoDQorICAgIEZYX0JPT0wgYlVzZUJyZWFrQ29udHJvbCwNCisgICAgRlhfRkxPQVQgZkhlaWdodExpbWl0LA0KKyAgICBGWF9GTE9BVCBmUmVhbEhlaWdodCwNCisgICAgQ1hGQV9MYXlvdXRDb250ZXh0KiBwQ29udGV4dCkgew0KKyAgWEZBX0VMRU1FTlQgZUNsYXNzSUQgPSBtX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgc3dpdGNoIChlQ2xhc3NJRCkgew0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX1N1YmZvcm06DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfQXJlYToNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9FeGNsR3JvdXA6DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfU3ViZm9ybVNldDogew0KKyAgICAgIEZYX0JPT0wgYlJvb3RGb3JjZVRiID0gRkFMU0U7DQorICAgICAgQ1hGQV9Ob2RlKiBwTGF5b3V0Tm9kZSA9IEdldFN1YmZvcm1TZXRQYXJlbnQobV9wRm9ybU5vZGUpOw0KKyAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXRTdHJhdGVneSA9DQorICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0dldExheW91dChwTGF5b3V0Tm9kZSwgYlJvb3RGb3JjZVRiKTsNCisgICAgICBzd2l0Y2ggKGVMYXlvdXRTdHJhdGVneSkgew0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9UYjoNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTHJfdGI6DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JsX3RiOg0KKyAgICAgICAgICByZXR1cm4gRG9MYXlvdXRGbG93ZWRDb250YWluZXIoYlVzZUJyZWFrQ29udHJvbCwgZUxheW91dFN0cmF0ZWd5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkhlaWdodExpbWl0LCBmUmVhbEhlaWdodCwgcENvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUm9vdEZvcmNlVGIpOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Qb3NpdGlvbjoNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUm93Og0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SbF9yb3c6DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBEb0xheW91dFBvc2l0aW9uZWRDb250YWluZXIocENvbnRleHQpOw0KKyAgICAgICAgICBtX25DdXJDaGlsZE5vZGVTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0RvbmU7DQorICAgICAgICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9UYWJsZToNCisgICAgICAgICAgRG9MYXlvdXRUYWJsZUNvbnRhaW5lcihwTGF5b3V0Tm9kZSk7DQorICAgICAgICAgIG1fbkN1ckNoaWxkTm9kZVN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfRG9uZTsNCisgICAgICAgICAgcmV0dXJuIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X0RvbmU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfRHJhdzoNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9GaWVsZDoNCisgICAgICBEb0xheW91dEZpZWxkKCk7DQorICAgICAgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Eb25lOw0KKyAgICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhOg0KKyAgICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6R2V0Q3VycmVudENvbXBvbmVudFBvcyhGWF9GTE9BVCYgZkFic29sdXRlWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkFic29sdXRlWSkgew0KKyAgQVNTRVJUKG1fcExheW91dEl0ZW0pOw0KKyAgZkFic29sdXRlWCA9IG1fcExheW91dEl0ZW0tPm1fc1Bvcy54Ow0KKyAgZkFic29sdXRlWSA9IG1fcExheW91dEl0ZW0tPm1fc1Bvcy55Ow0KK30NCit2b2lkIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6R2V0Q3VycmVudENvbXBvbmVudFNpemUoRlhfRkxPQVQmIGZXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZIZWlnaHQpIHsNCisgIEFTU0VSVChtX3BMYXlvdXRJdGVtKTsNCisgIGZXaWR0aCA9IG1fcExheW91dEl0ZW0tPm1fc1NpemUueDsNCisgIGZIZWlnaHQgPSBtX3BMYXlvdXRJdGVtLT5tX3NTaXplLnk7DQorfQ0KK3ZvaWQgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpTZXRDdXJyZW50Q29tcG9uZW50UG9zKEZYX0ZMT0FUIGZBYnNvbHV0ZVgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkFic29sdXRlWSkgew0KKyAgQVNTRVJUKG1fcExheW91dEl0ZW0pOw0KKyAgbV9wTGF5b3V0SXRlbS0+bV9zUG9zLlNldChmQWJzb2x1dGVYLCBmQWJzb2x1dGVZKTsNCit9DQordm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OlNldEN1cnJlbnRDb21wb25lbnRTaXplKEZYX0ZMT0FUIGZXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkhlaWdodCkgew0KKyAgQVNTRVJUKG1fcExheW91dEl0ZW0pOw0KKyAgbV9wTGF5b3V0SXRlbS0+bV9zU2l6ZS5TZXQoZldpZHRoLCBmSGVpZ2h0KTsNCit9DQorRlhfQk9PTCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6Okp1ZGdlTGVhZGVyT3JUcmFpbGVyRm9yT2NjdXIoDQorICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlKSB7DQorICBpZiAocEZvcm1Ob2RlID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGUgPSBwRm9ybU5vZGUtPkdldFRlbXBsYXRlTm9kZSgpOw0KKyAgaWYgKCFwVGVtcGxhdGUpIHsNCisgICAgcFRlbXBsYXRlID0gcEZvcm1Ob2RlOw0KKyAgfQ0KKyAgQ1hGQV9PY2N1ciBOb2RlT2NjdXIgPSBwVGVtcGxhdGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX09jY3VyKTsNCisgIGludDMyX3QgaU1heCA9IE5vZGVPY2N1ci5HZXRNYXgoKTsNCisgIGlmIChpTWF4ID4gLTEpIHsNCisgICAgaW50MzJfdCBpQ291bnQgPQ0KKyAgICAgICAgKGludDMyX3QpKHVpbnRwdHJfdCltX1BlbmRpbmdOb2Rlc0NvdW50LkdldFZhbHVlQXQocFRlbXBsYXRlKTsNCisgICAgaWYgKGlDb3VudCA+PSBpTWF4KSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlDb3VudCsrOw0KKyAgICBtX1BlbmRpbmdOb2Rlc0NvdW50LlNldEF0KHBUZW1wbGF0ZSwgKHZvaWQqKSh1aW50cHRyX3QpKGlDb3VudCkpOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X2l0ZW1sYXlvdXQuaCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sYXlvdXRfaXRlbWxheW91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NzUzZTYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X2l0ZW1sYXlvdXQuaApAQCAtMCwwICsxLDE4NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9YRkFfTEFZT1VUX0lURU1MQVlPVVRfSF8NCisjZGVmaW5lIF9YRkFfTEFZT1VUX0lURU1MQVlPVVRfSF8NCisjZGVmaW5lIFhGQV9MQVlPVVRfSU5WQUxJRE5PREUgKChDWEZBX05vZGUqKShpbnRwdHJfdCktMSkNCisjZGVmaW5lIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OICgwLjAwMDVmKQ0KKyNpbmNsdWRlICJmbG9hdC5oIg0KKyNkZWZpbmUgWEZBX0xBWU9VVF9GTE9BVF9NQVggRkxUX01BWA0KK2NsYXNzIENYRkFfSXRlbUxheW91dFByb2Nlc3NvcjsNCitjbGFzcyBDWEZBX0xheW91dFBhZ2VNZ3I7DQorY2xhc3MgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtOw0KK2NsYXNzIENYRkFfQ29udGVudExheW91dEl0ZW07DQorZW51bSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCB7DQorICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lLA0KKyAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHRfUGFnZUZ1bGxCcmVhaywNCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X1Jvd0Z1bGxCcmVhaywNCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X01hbnVhbEJyZWFrLA0KK307DQorZW51bSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlcyB7DQorICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Ob25lLA0KKyAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfQm9va2VuZExlYWRlciwNCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0JyZWFrQmVmb3JlLA0KKyAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXNfS2VlcCwNCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0NvbnRhaW5lciwNCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0JyZWFrQWZ0ZXIsDQorICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlc19Cb29rZW5kVHJhaWxlciwNCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzX0RvbmUsDQorfTsNCisNCitjbGFzcyBDWEZBX0xheW91dENvbnRleHQgew0KKyBwdWJsaWM6DQorICBDWEZBX0xheW91dENvbnRleHQoKQ0KKyAgICAgIDogbV9wcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMoTlVMTCksDQorICAgICAgICBtX2ZDdXJDb2x1bW5XaWR0aCgwKSwNCisgICAgICAgIG1fYkN1ckNvbHVtbldpZHRoQXZhaWFibGUoRkFMU0UpLA0KKyAgICAgICAgbV9wT3ZlcmZsb3dQcm9jZXNzb3IoTlVMTCksDQorICAgICAgICBtX3BPdmVyZmxvd05vZGUoTlVMTCkge30NCisgIH5DWEZBX0xheW91dENvbnRleHQoKSB7IG1fcE92ZXJmbG93UHJvY2Vzc29yID0gTlVMTDsgfQ0KKyAgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfRkxPQVQ+KiBtX3ByZ1NwZWNpZmllZENvbHVtbldpZHRoczsNCisgIEZYX0ZMT0FUIG1fZkN1ckNvbHVtbldpZHRoOw0KKyAgRlhfQk9PTCBtX2JDdXJDb2x1bW5XaWR0aEF2YWlhYmxlOw0KKyAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBtX3BPdmVyZmxvd1Byb2Nlc3NvcjsNCisgIENYRkFfTm9kZSogbV9wT3ZlcmZsb3dOb2RlOw0KK307DQorDQorY2xhc3MgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yIHsNCisgcHVibGljOg0KKyAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKENYRkFfTm9kZSogcE5vZGUsIENYRkFfTGF5b3V0UGFnZU1nciogcFBhZ2VNZ3IpOw0KKw0KKyAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQgRG9MYXlvdXQoDQorICAgICAgRlhfQk9PTCBiVXNlQnJlYWtDb250cm9sLA0KKyAgICAgIEZYX0ZMT0FUIGZIZWlnaHRMaW1pdCwNCisgICAgICBGWF9GTE9BVCBmUmVhbEhlaWdodCA9IFhGQV9MQVlPVVRfRkxPQVRfTUFYLA0KKyAgICAgIENYRkFfTGF5b3V0Q29udGV4dCogcENvbnRleHQgPSBOVUxMKTsNCisNCisgIHZvaWQgR2V0Q3VycmVudENvbXBvbmVudFBvcyhGWF9GTE9BVCYgZkFic29sdXRlWCwgRlhfRkxPQVQmIGZBYnNvbHV0ZVkpOw0KKw0KKyAgdm9pZCBHZXRDdXJyZW50Q29tcG9uZW50U2l6ZShGWF9GTE9BVCYgZldpZHRoLCBGWF9GTE9BVCYgZkhlaWdodCk7DQorDQorICB2b2lkIFNldEN1cnJlbnRDb21wb25lbnRQb3MoRlhfRkxPQVQgZkFic29sdXRlWCwgRlhfRkxPQVQgZkFic29sdXRlWSk7DQorDQorICB2b2lkIFNldEN1cnJlbnRDb21wb25lbnRTaXplKEZYX0ZMT0FUIGZXaWR0aCwgRlhfRkxPQVQgZkhlaWdodCk7DQorICBpbmxpbmUgQ1hGQV9Ob2RlKiBHZXRGb3JtTm9kZSgpIHsgcmV0dXJuIG1fcEZvcm1Ob2RlOyB9DQorICBpbmxpbmUgRlhfQk9PTCBIYXNMYXlvdXRJdGVtKCkgeyByZXR1cm4gbV9wTGF5b3V0SXRlbSAhPSBOVUxMOyB9DQorICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBFeHRyYWN0TGF5b3V0SXRlbSgpOw0KKw0KKyAgc3RhdGljIEZYX0JPT0wgSW5jcmVtZW50UmVsYXlvdXROb2RlKENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvY2Vzc29yLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSk7DQorICBzdGF0aWMgdm9pZCBDYWxjdWxhdGVQb3NpdGlvbmVkQ29udGFpbmVyUG9zKENYRkFfTm9kZSogcE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZXaWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZBYnNvbHV0ZVgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmQWJzb2x1dGVZKTsNCisgIHN0YXRpYyBGWF9CT09MIEZpbmRMYXlvdXRJdGVtU3BsaXRQb3MoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcExheW91dEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDdXJWZXJ0aWNhbE9mZnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZQcm9wb3NlZFNwbGl0UG9zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiQXBwQ2hhbmdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDYWxjdWxhdGVNYXJnaW4gPSBUUlVFKTsNCisgIEZYX0ZMT0FUIEZpbmRTcGxpdFBvcyhGWF9GTE9BVCBmUHJvcG9zZWRTcGxpdFBvcyk7DQorICB2b2lkIFNwbGl0TGF5b3V0SXRlbShDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBTZWNvbmRQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU3BsaXRQb3MpOw0KKyAgdm9pZCBTcGxpdExheW91dEl0ZW0oRlhfRkxPQVQgZlNwbGl0UG9zKTsNCisgIEZYX0JPT0wgSnVkZ2VQdXROZXh0UGFnZSgNCisgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwUGFyZW50TGF5b3V0SXRlbSwNCisgICAgICBGWF9GTE9BVCBmQ2hpbGRIZWlnaHQsDQorICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSo+JiBwS2VlcEl0ZW1zKTsNCisgIEZYX0JPT0wgUHJvY2Vzc0tlZXBGb3JTcGxpdGUoDQorICAgICAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBwUGFyZW50UHJvY2Vzc29yLA0KKyAgICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcENoaWxkUHJvY2Vzc29yLA0KKyAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IGVSZXRWYWx1ZSwNCisgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKj4mIHJnQ3VyTGluZUxheW91dEl0ZW0sDQorICAgICAgRlhfRkxPQVQmIGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCwNCisgICAgICBGWF9GTE9BVCYgZkNvbnRlbnRDdXJSb3dIZWlnaHQsDQorICAgICAgRlhfRkxPQVQmIGZDb250ZW50Q3VyUm93WSwNCisgICAgICBGWF9CT09MJiBiQWRkZWRJdGVtSW5Sb3csDQorICAgICAgRlhfQk9PTCYgYkZvcmNlRW5kUGFnZSwNCisgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCYgcmVzdWx0KTsNCisgIEZYX0ZMT0FUIEluc2VydEtlZXBMYXlvdXRJdGVtcygpOw0KKyAgdm9pZCBEb0xheW91dFBhZ2VBcmVhKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcFBhZ2VBcmVhTGF5b3V0SXRlbSk7DQorICBGWF9CT09MIENhbGN1bGF0ZVJvd0NoaWxkUG9zaXRpb24oDQorICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSo+KCZyZ0N1ckxpbmVMYXlvdXRJdGVtcylbM10sDQorICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZUZsb3dTdHJhdGVneSwNCisgICAgICBGWF9CT09MIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwNCisgICAgICBGWF9CT09MIGJDb250YWluZXJXaWR0aEF1dG9TaXplLA0KKyAgICAgIEZYX0ZMT0FUJiBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCwNCisgICAgICBGWF9GTE9BVCYgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0LA0KKyAgICAgIEZYX0ZMT0FUJiBmQ29udGVudEN1clJvd1ksDQorICAgICAgRlhfRkxPQVQgZkNvbnRlbnRDdXJSb3dIZWlnaHQsDQorICAgICAgRlhfRkxPQVQgZkNvbnRlbnRXaWR0aExpbWl0LA0KKyAgICAgIEZYX0JPT0wgYlJvb3RGb3JjZVRiID0gRkFMU0UpOw0KKw0KKyAgdm9pZCBQcm9jZXNzVW5Vc2VPdmVyRmxvdyhDWEZBX05vZGUqIHBMZWFkZXJOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBUcmFpbGVyTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcFRyYWlsZXJJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSk7DQorICB2b2lkIFByb2Nlc3NVblVzZUJpbmRzKENYRkFfTm9kZSogcEZvcm1Ob2RlKTsNCisgIEZYX0JPT0wgSXNBZGROZXdSb3dGb3JUcmFpbGVyKENYRkFfQ29udGVudExheW91dEl0ZW0qIHBUcmFpbGVySXRlbSk7DQorICBGWF9CT09MIEp1ZGdlTGVhZGVyT3JUcmFpbGVyRm9yT2NjdXIoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpOw0KKyAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogQ3JlYXRlQ29udGVudExheW91dEl0ZW0oQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2b2lkIERvTGF5b3V0UG9zaXRpb25lZENvbnRhaW5lcihDWEZBX0xheW91dENvbnRleHQqIHBDb250ZXh0ID0gTlVMTCk7DQorICB2b2lkIERvTGF5b3V0VGFibGVDb250YWluZXIoQ1hGQV9Ob2RlKiBwTGF5b3V0Tm9kZSk7DQorICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBEb0xheW91dEZsb3dlZENvbnRhaW5lcigNCisgICAgICBGWF9CT09MIGJVc2VCcmVha0NvbnRyb2wsDQorICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZUZsb3dTdHJhdGVneSwNCisgICAgICBGWF9GTE9BVCBmSGVpZ2h0TGltaXQsDQorICAgICAgRlhfRkxPQVQgZlJlYWxIZWlnaHQsDQorICAgICAgQ1hGQV9MYXlvdXRDb250ZXh0KiBwQ29udGV4dCA9IE5VTEwsDQorICAgICAgRlhfQk9PTCBiUm9vdEZvcmNlVGIgPSBGQUxTRSk7DQorICB2b2lkIERvTGF5b3V0RmllbGQoKTsNCisgIHZvaWQgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfR290b05leHRDb250YWluZXJOb2RlKA0KKyAgICAgIENYRkFfTm9kZSomIHBDdXJBY3Rpb25Ob2RlLA0KKyAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzJiBuQ3VyU3RhZ2UsDQorICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Q29udGFpbmVyLA0KKyAgICAgIEZYX0JPT0wgYlVzZVBhZ2VCcmVhayk7DQorDQorICBGWF9CT09MIFByb2Nlc3NLZWVwTm9kZXNGb3JDaGVja05leHQoQ1hGQV9Ob2RlKiYgcEN1ckFjdGlvbk5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXMmIG5DdXJTdGFnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqJiBwTmV4dENvbnRhaW5lciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiTGFzdEtlZXBOb2RlKTsNCisNCisgIEZYX0JPT0wgUHJvY2Vzc0tlZXBOb2Rlc0ZvckJyZWFrQmVmb3JlKA0KKyAgICAgIENYRkFfTm9kZSomIHBDdXJBY3Rpb25Ob2RlLA0KKyAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzJiBuQ3VyU3RhZ2UsDQorICAgICAgQ1hGQV9Ob2RlKiBwQ29udGFpbmVyTm9kZSk7DQorDQorICBDWEZBX05vZGUqIEdldFN1YmZvcm1TZXRQYXJlbnQoQ1hGQV9Ob2RlKiBwU3ViZm9ybVNldCk7DQorDQorIHB1YmxpYzoNCisgIEZYX0JPT0wgbV9iS2VlcEJyZWFrRmluaXNoOw0KKyAgRlhfQk9PTCBtX2JJc1Byb2Nlc3NLZWVwOw0KKyAgQ1hGQV9Ob2RlKiBtX3BLZWVwSGVhZE5vZGU7DQorICBDWEZBX05vZGUqIG1fcEtlZXBUYWlsTm9kZTsNCisgIENYRkFfTm9kZSogbV9wRm9ybU5vZGU7DQorICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBtX3BMYXlvdXRJdGVtOw0KKyNpZmRlZiBfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXw0KKyAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogbV9wT2xkTGF5b3V0SXRlbTsNCisjZWxzZQ0KKyAgQ1hGQV9MYXlvdXRQYWdlTWdyKiBtX3BQYWdlTWdyQ3JlYXRlSXRlbTsNCisjZW5kaWYNCisgIENYRkFfTm9kZSogbV9wQ3VyQ2hpbGROb2RlOw0KKyAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBtX3BDdXJDaGlsZFByZXByb2Nlc3NvcjsNCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzIG1fbkN1ckNoaWxkTm9kZVN0YWdlOw0KKyAgRlhfRkxPQVQgbV9mVXNlZFNpemU7DQorICBDWEZBX0xheW91dFBhZ2VNZ3IqIG1fcFBhZ2VNZ3I7DQorICBDRlhfUHRyTGlzdCBtX3JnUGVuZGluZ05vZGVzOw0KKyAgRlhfQk9PTCBtX2JCcmVha1BlbmRpbmc7DQorICBDRlhfQXJyYXlUZW1wbGF0ZTxGWF9GTE9BVD4gbV9yZ1NwZWNpZmllZENvbHVtbldpZHRoczsNCisgIENGWF9BcnJheVRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW0qPiBtX2FycmF5S2VlcEl0ZW1zOw0KKyAgQ0ZYX01hcFB0clRvUHRyIG1fUGVuZGluZ05vZGVzQ291bnQ7DQorICBGWF9GTE9BVCBtX2ZMYXN0Um93V2lkdGg7DQorICBGWF9GTE9BVCBtX2ZMYXN0Um93WTsNCisgIEZYX0ZMT0FUIG1fZldpZHRoTGltaXRlOw0KKyAgRlhfQk9PTCBtX2JVc2VJbmhlcmlhdGVkOw0KKyAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQgbV9lUHJlUHJvY2Vzc1JzOw0KKyAgRlhfQk9PTCBtX2JIYXNBdmFpbEhlaWdodDsNCit9Ow0KK0ZYX0JPT0wgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShDWEZBX05vZGUqIHBOb2RlKTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X3BhZ2VtZ3JfbmV3LmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sYXlvdXRfcGFnZW1ncl9uZXcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZGQwOTAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X3BhZ2VtZ3JfbmV3LmNwcApAQCAtMCwwICsxLDIwMTcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3V0aWxzLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9vYmplY3QuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY3VtZW50LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9wYXJzZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3NjcmlwdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jZGF0YS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jbGF5b3V0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9sb2NhbGVtZ3IuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2ZtMmpzYXBpLmgiDQorI2luY2x1ZGUgInhmYV9kb2N1bWVudF9kYXRhbWVyZ2VyX2ltcC5oIg0KKyNpbmNsdWRlICJ4ZmFfZG9jdW1lbnRfbGF5b3V0X2ltcC5oIg0KKyNpbmNsdWRlICJ4ZmFfbGF5b3V0X2l0ZW1sYXlvdXQuaCINCisjaW5jbHVkZSAieGZhX2xheW91dF9wYWdlbWdyX25ldy5oIg0KKyNpbmNsdWRlICJ4ZmFfbGF5b3V0X2FwcGFkYXB0ZXIuaCINCitDWEZBX0xheW91dFBhZ2VNZ3I6OkNYRkFfTGF5b3V0UGFnZU1ncihDWEZBX0xheW91dFByb2Nlc3NvciogcExheW91dFByb2Nlc3NvcikNCisgICAgOiBtX3BMYXlvdXRQcm9jZXNzb3IocExheW91dFByb2Nlc3NvciksDQorICAgICAgbV9wVGVtcGxhdGVQYWdlU2V0Um9vdChudWxscHRyKSwNCisgICAgICBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3QobnVsbHB0ciksDQorICAgICAgbV9wUGFnZVNldEN1clJvb3QobnVsbHB0ciksDQorICAgICAgbV9wQ3VycmVudENvbnRhaW5lclJlY29yZChudWxscHRyKSwNCisgICAgICBtX3BDdXJQYWdlQXJlYShudWxscHRyKSwNCisgICAgICBtX25BdmFpbFBhZ2VzKDApLA0KKyAgICAgIG1fbkN1clBhZ2VDb3VudCgwKSwNCisgICAgICBtX2VQYWdlU2V0TW9kZShYRkFfQVRUUklCVVRFRU5VTV9PcmRlcmVkT2NjdXJyZW5jZSksDQorICAgICAgbV9iQ3JlYXRlT3ZlckZsb3dQYWdlKEZBTFNFKSB7DQorfQ0KK0NYRkFfTGF5b3V0UGFnZU1ncjo6fkNYRkFfTGF5b3V0UGFnZU1ncigpIHsNCisgIENsZWFyRGF0YSgpOw0KKyAgQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSA9IEdldFJvb3RMYXlvdXRJdGVtKCk7DQorICBDWEZBX0xheW91dEl0ZW0qIHBOZXh0TGF5b3V0ID0gTlVMTDsNCisgIGZvciAoOyBwTGF5b3V0SXRlbTsgcExheW91dEl0ZW0gPSBwTmV4dExheW91dCkgew0KKyAgICBwTmV4dExheW91dCA9IHBMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgICAgWEZBX1JlbGVhc2VMYXlvdXRJdGVtKHBMYXlvdXRJdGVtKTsNCisgIH0NCit9DQorRlhfQk9PTCBDWEZBX0xheW91dFBhZ2VNZ3I6OkluaXRMYXlvdXRQYWdlKENYRkFfTm9kZSogcEZvcm1Ob2RlKSB7DQorICBQcmVwYXJlTGF5b3V0KCk7DQorICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUgPSBwRm9ybU5vZGUtPkdldFRlbXBsYXRlTm9kZSgpOw0KKyAgaWYgKCFwVGVtcGxhdGVOb2RlKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIG1fcFRlbXBsYXRlUGFnZVNldFJvb3QgPSBwVGVtcGxhdGVOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9QYWdlU2V0KTsNCisgIEFTU0VSVChtX3BUZW1wbGF0ZVBhZ2VTZXRSb290KTsNCisgIGlmIChtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3QpIHsNCisgICAgbV9wUGFnZVNldExheW91dEl0ZW1Sb290LT5tX3BQYXJlbnQgPSBOVUxMOw0KKyAgICBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3QtPm1fcEZpcnN0Q2hpbGQgPSBOVUxMOw0KKyAgICBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3QtPm1fcE5leHRTaWJsaW5nID0gTlVMTDsNCisgICAgbV9wUGFnZVNldExheW91dEl0ZW1Sb290LT5tX3BGb3JtTm9kZSA9IG1fcFRlbXBsYXRlUGFnZVNldFJvb3Q7DQorICB9IGVsc2Ugew0KKyAgICBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3QgPQ0KKyAgICAgICAgbmV3IENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbShtX3BUZW1wbGF0ZVBhZ2VTZXRSb290KTsNCisgIH0NCisgIG1fcFBhZ2VTZXRDdXJSb290ID0gbV9wUGFnZVNldExheW91dEl0ZW1Sb290Ow0KKyAgbV9wVGVtcGxhdGVQYWdlU2V0Um9vdC0+U2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbV9wUGFnZVNldExheW91dEl0ZW1Sb290KTsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVSZWxhdGlvbiA9DQorICAgICAgbV9wVGVtcGxhdGVQYWdlU2V0Um9vdC0+R2V0RW51bShYRkFfQVRUUklCVVRFX1JlbGF0aW9uKTsNCisgIGlmIChlUmVsYXRpb24gIT0gWEZBX0FUVFJJQlVURUVOVU1fVW5rbm93bikgew0KKyAgICBtX2VQYWdlU2V0TW9kZSA9IGVSZWxhdGlvbjsNCisgIH0NCisgIEluaXRQYWdlU2V0TWFwKCk7DQorICBDWEZBX05vZGUqIHBQYWdlQXJlYSA9IE5VTEw7DQorICBpbnQzMl90IGlDb3VudCA9IDA7DQorICBmb3IgKHBQYWdlQXJlYSA9IG1fcFRlbXBsYXRlUGFnZVNldFJvb3QtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgcFBhZ2VBcmVhOw0KKyAgICAgICBwUGFnZUFyZWEgPSBwUGFnZUFyZWEtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgaWYgKHBQYWdlQXJlYS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQorICAgICAgaUNvdW50Kys7DQorICAgICAgaWYgKHBQYWdlQXJlYS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmIChpQ291bnQgPiAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBUZW1wbGF0ZU5vZGUtPkdldERvY3VtZW50KCk7DQorICBJWEZBX09iakZhY3RvcnkqIHBPYmpGYWN0b3J5ID0gcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0RmFjdG9yeSgpOw0KKyAgcFBhZ2VBcmVhID0gbV9wVGVtcGxhdGVQYWdlU2V0Um9vdC0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfUGFnZUFyZWEpOw0KKyAgaWYgKCFwUGFnZUFyZWEpIHsNCisgICAgcFBhZ2VBcmVhID0gcE9iakZhY3RvcnktPkNyZWF0ZU5vZGUobV9wVGVtcGxhdGVQYWdlU2V0Um9vdC0+R2V0UGFja2V0SUQoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlRfUGFnZUFyZWEpOw0KKyAgICBpZiAoIXBQYWdlQXJlYSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBtX3BUZW1wbGF0ZVBhZ2VTZXRSb290LT5JbnNlcnRDaGlsZChwUGFnZUFyZWEsIE5VTEwpOw0KKyAgICBwUGFnZUFyZWEtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCisgIH0NCisgIENYRkFfTm9kZSogcENvbnRlbnRBcmVhID0gcFBhZ2VBcmVhLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9Db250ZW50QXJlYSk7DQorICBpZiAoIXBDb250ZW50QXJlYSkgew0KKyAgICBwQ29udGVudEFyZWEgPSBwT2JqRmFjdG9yeS0+Q3JlYXRlTm9kZShwUGFnZUFyZWEtPkdldFBhY2tldElEKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKTsNCisgICAgaWYgKCFwQ29udGVudEFyZWEpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcFBhZ2VBcmVhLT5JbnNlcnRDaGlsZChwQ29udGVudEFyZWEsIE5VTEwpOw0KKyAgICBwQ29udGVudEFyZWEtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCisgICAgcENvbnRlbnRBcmVhLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfWCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTWVhc3VyZW1lbnQoMC4yNWYsIFhGQV9VTklUX0luKSk7DQorICAgIHBDb250ZW50QXJlYS0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1ksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX01lYXN1cmVtZW50KDAuMjVmLCBYRkFfVU5JVF9JbikpOw0KKyAgICBwQ29udGVudEFyZWEtPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9XLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9NZWFzdXJlbWVudCg4LjBmLCBYRkFfVU5JVF9JbikpOw0KKyAgICBwQ29udGVudEFyZWEtPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9ILA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9NZWFzdXJlbWVudCgxMC41ZiwgWEZBX1VOSVRfSW4pKTsNCisgIH0NCisgIENYRkFfTm9kZSogcE1lZGl1bSA9IHBQYWdlQXJlYS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfTWVkaXVtKTsNCisgIGlmICghcE1lZGl1bSkgew0KKyAgICBwTWVkaXVtID0NCisgICAgICAgIHBPYmpGYWN0b3J5LT5DcmVhdGVOb2RlKHBQYWdlQXJlYS0+R2V0UGFja2V0SUQoKSwgWEZBX0VMRU1FTlRfTWVkaXVtKTsNCisgICAgaWYgKCFwQ29udGVudEFyZWEpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcFBhZ2VBcmVhLT5JbnNlcnRDaGlsZChwTWVkaXVtLCBOVUxMKTsNCisgICAgcE1lZGl1bS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KKyAgICBwTWVkaXVtLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfU2hvcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9NZWFzdXJlbWVudCg4LjVmLCBYRkFfVU5JVF9JbikpOw0KKyAgICBwTWVkaXVtLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTG9uZywNCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX01lYXN1cmVtZW50KDExLjBmLCBYRkFfVU5JVF9JbikpOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpQcmVwYXJlRmlyc3RQYWdlKENYRkFfTm9kZSogcFJvb3RTdWJmb3JtKSB7DQorICBGWF9CT09MIGJQcm9CcmVha0JlZm9yZSA9IEZBTFNFOw0KKyAgQ1hGQV9Ob2RlKiBwQnJlYWtCZWZvcmVOb2RlID0gTlVMTDsNCisgIHdoaWxlIChwUm9vdFN1YmZvcm0pIHsNCisgICAgZm9yIChDWEZBX05vZGUqIHBCcmVha05vZGUgPQ0KKyAgICAgICAgICAgICBwUm9vdFN1YmZvcm0tPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICBwQnJlYWtOb2RlOw0KKyAgICAgICAgIHBCcmVha05vZGUgPSBwQnJlYWtOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgWEZBX0VMRU1FTlQgZVR5cGUgPSBwQnJlYWtOb2RlLT5HZXRDbGFzc0lEKCk7DQorICAgICAgaWYgKGVUeXBlID09IFhGQV9FTEVNRU5UX0JyZWFrQmVmb3JlIHx8DQorICAgICAgICAgIChlVHlwZSA9PSBYRkFfRUxFTUVOVF9CcmVhayAmJg0KKyAgICAgICAgICAgcEJyZWFrTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0JlZm9yZSkgIT0NCisgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTV9BdXRvKSkgew0KKyAgICAgICAgYlByb0JyZWFrQmVmb3JlID0gVFJVRTsNCisgICAgICAgIHBCcmVha0JlZm9yZU5vZGUgPSBwQnJlYWtOb2RlOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChiUHJvQnJlYWtCZWZvcmUpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBiUHJvQnJlYWtCZWZvcmUgPSBUUlVFOw0KKyAgICBwUm9vdFN1YmZvcm0gPSBwUm9vdFN1YmZvcm0tPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1N1YmZvcm0pOw0KKyAgICB3aGlsZSAocFJvb3RTdWJmb3JtICYmDQorICAgICAgICAgICAhWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShwUm9vdFN1YmZvcm0pKSB7DQorICAgICAgcFJvb3RTdWJmb3JtID0gcFJvb3RTdWJmb3JtLT5HZXROZXh0U2FtZUNsYXNzU2libGluZyhYRkFfRUxFTUVOVF9TdWJmb3JtKTsNCisgICAgfQ0KKyAgfQ0KKyAgQ1hGQV9Ob2RlICpwTGVhZGVyLCAqcFRyYWlsZXI7DQorICBpZiAocEJyZWFrQmVmb3JlTm9kZSAmJg0KKyAgICAgIEV4ZWN1dGVCcmVha0JlZm9yZU9yQWZ0ZXIocEJyZWFrQmVmb3JlTm9kZSwgVFJVRSwgcExlYWRlciwgcFRyYWlsZXIpKSB7DQorICAgIG1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQgPSBtX3JnUHJvcG9zZWRDb250YWluZXJSZWNvcmQuR2V0SGVhZFBvc2l0aW9uKCk7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEFwcGVuZE5ld1BhZ2UoVFJVRSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpBcHBlbmROZXdQYWdlKEZYX0JPT0wgYkZpcnN0VGVtUGFnZSkgew0KKyAgaWYgKG1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQgIT0NCisgICAgICBtX3JnUHJvcG9zZWRDb250YWluZXJSZWNvcmQuR2V0VGFpbFBvc2l0aW9uKCkpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBDWEZBX05vZGUqIHBQYWdlTm9kZSA9IEdldE5leHRBdmFpbFBhZ2VBcmVhKE5VTEwpOw0KKyAgaWYgKCFwUGFnZU5vZGUpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGJGaXJzdFRlbVBhZ2UgJiYgbV9wQ3VycmVudENvbnRhaW5lclJlY29yZCA9PSBOVUxMKSB7DQorICAgIG1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQgPSBtX3JnUHJvcG9zZWRDb250YWluZXJSZWNvcmQuR2V0SGVhZFBvc2l0aW9uKCk7DQorICB9DQorICByZXR1cm4gIWJGaXJzdFRlbVBhZ2UgfHwgbV9wQ3VycmVudENvbnRhaW5lclJlY29yZCAhPSBOVUxMOw0KK30NCitzdGF0aWMgdm9pZCBYRkFfTGF5b3V0SXRlbU1ncl9SZW9yZGVyTGF5b3V0SXRlbVRvVGFpbCgNCisgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSkgew0KKyAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwUGFyZW50TGF5b3V0SXRlbSA9DQorICAgICAgKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSopcExheW91dEl0ZW0tPm1fcFBhcmVudDsNCisgIGlmICghcFBhcmVudExheW91dEl0ZW0pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgcFBhcmVudExheW91dEl0ZW0tPlJlbW92ZUNoaWxkKHBMYXlvdXRJdGVtKTsNCisgIHBQYXJlbnRMYXlvdXRJdGVtLT5BZGRDaGlsZChwTGF5b3V0SXRlbSk7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9MYXlvdXRJdGVtTWdyX1JlbW92ZUxheW91dEl0ZW0oDQorICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcExheW91dEl0ZW0pIHsNCisgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcFBhcmVudExheW91dEl0ZW0gPQ0KKyAgICAgIChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qKXBMYXlvdXRJdGVtLT5tX3BQYXJlbnQ7DQorICBpZiAoIXBQYXJlbnRMYXlvdXRJdGVtKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBQYXJlbnRMYXlvdXRJdGVtLT5SZW1vdmVDaGlsZChwTGF5b3V0SXRlbSk7DQorfQ0KK3ZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpSZW1vdmVMYXlvdXRSZWNvcmQoQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcFByZXZSZWNvcmQpIHsNCisgIGlmICghcE5ld1JlY29yZCB8fCAhcFByZXZSZWNvcmQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKHBOZXdSZWNvcmQtPnBDdXJQYWdlU2V0ICE9IHBQcmV2UmVjb3JkLT5wQ3VyUGFnZVNldCkgew0KKyAgICBYRkFfTGF5b3V0SXRlbU1ncl9SZW1vdmVMYXlvdXRJdGVtKHBOZXdSZWNvcmQtPnBDdXJQYWdlU2V0KTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKHBOZXdSZWNvcmQtPnBDdXJQYWdlQXJlYSAhPSBwUHJldlJlY29yZC0+cEN1clBhZ2VBcmVhKSB7DQorICAgIFhGQV9MYXlvdXRJdGVtTWdyX1JlbW92ZUxheW91dEl0ZW0ocE5ld1JlY29yZC0+cEN1clBhZ2VBcmVhKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKHBOZXdSZWNvcmQtPnBDdXJDb250ZW50QXJlYSAhPSBwUHJldlJlY29yZC0+cEN1ckNvbnRlbnRBcmVhKSB7DQorICAgIFhGQV9MYXlvdXRJdGVtTWdyX1JlbW92ZUxheW91dEl0ZW0ocE5ld1JlY29yZC0+cEN1ckNvbnRlbnRBcmVhKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6UmVvcmRlclBlbmRpbmdMYXlvdXRSZWNvcmRUb1RhaWwoDQorICAgIENYRkFfQ29udGFpbmVyUmVjb3JkKiBwTmV3UmVjb3JkLA0KKyAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcFByZXZSZWNvcmQpIHsNCisgIGlmICghcE5ld1JlY29yZCB8fCAhcFByZXZSZWNvcmQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKHBOZXdSZWNvcmQtPnBDdXJQYWdlU2V0ICE9IHBQcmV2UmVjb3JkLT5wQ3VyUGFnZVNldCkgew0KKyAgICBYRkFfTGF5b3V0SXRlbU1ncl9SZW9yZGVyTGF5b3V0SXRlbVRvVGFpbChwTmV3UmVjb3JkLT5wQ3VyUGFnZVNldCk7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChwTmV3UmVjb3JkLT5wQ3VyUGFnZUFyZWEgIT0gcFByZXZSZWNvcmQtPnBDdXJQYWdlQXJlYSkgew0KKyAgICBYRkFfTGF5b3V0SXRlbU1ncl9SZW9yZGVyTGF5b3V0SXRlbVRvVGFpbChwTmV3UmVjb3JkLT5wQ3VyUGFnZUFyZWEpOw0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAocE5ld1JlY29yZC0+cEN1ckNvbnRlbnRBcmVhICE9IHBQcmV2UmVjb3JkLT5wQ3VyQ29udGVudEFyZWEpIHsNCisgICAgWEZBX0xheW91dEl0ZW1NZ3JfUmVvcmRlckxheW91dEl0ZW1Ub1RhaWwocE5ld1JlY29yZC0+cEN1ckNvbnRlbnRBcmVhKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6U3VibWl0Q29udGVudEl0ZW0oDQorICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBDb250ZW50TGF5b3V0SXRlbSwNCisgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQgZVN0YXR1cykgew0KKyAgaWYgKHBDb250ZW50TGF5b3V0SXRlbSkgew0KKyAgICBHZXRDdXJyZW50Q29udGFpbmVyUmVjb3JkKCktPnBDdXJDb250ZW50QXJlYS0+QWRkQ2hpbGQocENvbnRlbnRMYXlvdXRJdGVtKTsNCisgICAgbV9iQ3JlYXRlT3ZlckZsb3dQYWdlID0gRkFMU0U7DQorICB9DQorICBpZiAoZVN0YXR1cyAhPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdF9Eb25lKSB7DQorICAgIGlmIChlU3RhdHVzID09IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0X1BhZ2VGdWxsQnJlYWsgJiYNCisgICAgICAgIG1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQgPT0NCisgICAgICAgICAgICBtX3JnUHJvcG9zZWRDb250YWluZXJSZWNvcmQuR2V0VGFpbFBvc2l0aW9uKCkpIHsNCisgICAgICBBcHBlbmROZXdQYWdlKCk7DQorICAgIH0NCisgICAgbV9wQ3VycmVudENvbnRhaW5lclJlY29yZCA9IG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5HZXRUYWlsUG9zaXRpb24oKTsNCisgICAgbV9wQ3VyUGFnZUFyZWEgPSBHZXRDdXJyZW50Q29udGFpbmVyUmVjb3JkKCktPnBDdXJQYWdlQXJlYS0+bV9wRm9ybU5vZGU7DQorICB9DQorfQ0KK0ZYX0ZMT0FUIENYRkFfTGF5b3V0UGFnZU1ncjo6R2V0QXZhaWxIZWlnaHQoKSB7DQorICBGWF9GTE9BVCBmQXZhaWxIZWlnaHQgPQ0KKyAgICAgIEdldEN1cnJlbnRDb250YWluZXJSZWNvcmQoKQ0KKyAgICAgICAgICAtPnBDdXJDb250ZW50QXJlYS0+bV9wRm9ybU5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9IKQ0KKyAgICAgICAgICAuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgIGlmIChmQXZhaWxIZWlnaHQgPCBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICBpZiAobV9wQ3VycmVudENvbnRhaW5lclJlY29yZCA9PQ0KKyAgICAgICAgbV9yZ1Byb3Bvc2VkQ29udGFpbmVyUmVjb3JkLkdldEhlYWRQb3NpdGlvbigpKSB7DQorICAgICAgZkF2YWlsSGVpZ2h0ID0gMDsNCisgICAgfSBlbHNlIHsNCisgICAgICBmQXZhaWxIZWlnaHQgPSBYRkFfTEFZT1VUX0ZMT0FUX01BWDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGZBdmFpbEhlaWdodDsNCit9DQorc3RhdGljIENYRkFfTm9kZSogWEZBX1Jlc29sdmVCcmVha1RhcmdldChDWEZBX05vZGUqIHBQYWdlU2V0Um9vdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5ld0V4cHJTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyYgd3NUYXJnZXRFeHByKSB7DQorICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwUGFnZVNldFJvb3QtPkdldERvY3VtZW50KCk7DQorICBpZiAod3NUYXJnZXRFeHByLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzVGFyZ2V0QWxsID0gd3NUYXJnZXRFeHByOw0KKyAgd3NUYXJnZXRBbGwuVHJpbUxlZnQoKTsNCisgIHdzVGFyZ2V0QWxsLlRyaW1SaWdodCgpOw0KKyAgaW50MzJfdCBpU3BsaXRlSW5kZXggPSAwOw0KKyAgRlhfQk9PTCBiVGFyZ2V0QWxsRmluZCA9IFRSVUU7DQorICB3aGlsZSAoaVNwbGl0ZUluZGV4ICE9IC0xKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGFyZ2V0RXhwcjsNCisgICAgaW50MzJfdCBpU3BsaXRlTmV4dEluZGV4ID0gMDsNCisgICAgaWYgKCFiVGFyZ2V0QWxsRmluZCkgew0KKyAgICAgIGlTcGxpdGVOZXh0SW5kZXggPSB3c1RhcmdldEFsbC5GaW5kKCcgJywgaVNwbGl0ZUluZGV4KTsNCisgICAgICB3c1RhcmdldEV4cHIgPQ0KKyAgICAgICAgICB3c1RhcmdldEFsbC5NaWQoaVNwbGl0ZUluZGV4LCBpU3BsaXRlTmV4dEluZGV4IC0gaVNwbGl0ZUluZGV4KTsNCisgICAgfSBlbHNlIHsNCisgICAgICB3c1RhcmdldEV4cHIgPSB3c1RhcmdldEFsbDsNCisgICAgfQ0KKyAgICBpZiAod3NUYXJnZXRFeHByLklzRW1wdHkoKSkgew0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIGJUYXJnZXRBbGxGaW5kID0gRkFMU0U7DQorICAgIGlmICh3c1RhcmdldEV4cHIuR2V0QXQoMCkgPT0gJyMnKSB7DQorICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBEb2N1bWVudC0+R2V0Tm9kZUJ5SUQoDQorICAgICAgICAgIChDWEZBX05vZGUqKXBEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfVGVtcGxhdGUpLA0KKyAgICAgICAgICB3c1RhcmdldEV4cHIuTWlkKDEpKTsNCisgICAgICBpZiAocE5vZGUpIHsNCisgICAgICAgIHJldHVybiBwTm9kZTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoYk5ld0V4cHJTdHlsZSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzUHJvY2Vzc2VkVGFyZ2V0ID0gd3NUYXJnZXRFeHByOw0KKyAgICAgIGlmICh3c1RhcmdldEV4cHIuTGVmdCg0KSA9PSBGWF9XU1RSQyhMInNvbSgiKSAmJg0KKyAgICAgICAgICB3c1RhcmdldEV4cHIuUmlnaHQoMSkgPT0gRlhfV1NUUkMoTCIpIikpIHsNCisgICAgICAgIHdzUHJvY2Vzc2VkVGFyZ2V0ID0gd3NUYXJnZXRFeHByLk1pZCg0LCB3c1RhcmdldEV4cHIuR2V0TGVuZ3RoKCkgLSA1KTsNCisgICAgICB9DQorICAgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJzOw0KKyAgICAgIGludDMyX3QgaUNvdW50ID0gcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPlJlc29sdmVPYmplY3RzKA0KKyAgICAgICAgICBwUGFnZVNldFJvb3QsIHdzUHJvY2Vzc2VkVGFyZ2V0LCBycywNCisgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMgfA0KKyAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX0F0dHJpYnV0ZXMgfCBYRkFfUkVTT0xWRU5PREVfU2libGluZ3MgfA0KKyAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1BhcmVudCk7DQorICAgICAgaWYgKGlDb3VudCA+IDAgJiYgcnMubm9kZXNbMF0tPklzTm9kZSgpKSB7DQorICAgICAgICByZXR1cm4gKENYRkFfTm9kZSopcnMubm9kZXNbMF07DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlTcGxpdGVJbmRleCA9IGlTcGxpdGVOZXh0SW5kZXg7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorDQorRlhfQk9PTCBYRkFfTGF5b3V0UGFnZU1ncl9SdW5CcmVha1Rlc3RTY3JpcHQoQ1hGQV9Ob2RlKiBwVGVzdFNjcmlwdCkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uOw0KKyAgcFRlc3RTY3JpcHQtPlRyeUNvbnRlbnQod3NFeHByZXNzaW9uKTsNCisgIGlmICh3c0V4cHJlc3Npb24uSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIHBUZXN0U2NyaXB0LT5HZXREb2N1bWVudCgpLT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCktPlJ1blNjcmlwdCgNCisgICAgICBwVGVzdFNjcmlwdCwgcFRlc3RTY3JpcHQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKSk7DQorfQ0KK0NYRkFfQ29udGFpbmVyUmVjb3JkKiBDWEZBX0xheW91dFBhZ2VNZ3I6OkNyZWF0ZUNvbnRhaW5lclJlY29yZCgNCisgICAgQ1hGQV9Ob2RlKiBwUGFnZU5vZGUsDQorICAgIEZYX0JPT0wgYkNyZWF0ZU5ldykgew0KKyAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQgPSBuZXcgQ1hGQV9Db250YWluZXJSZWNvcmQoKTsNCisgIGlmIChtX3BDdXJyZW50Q29udGFpbmVyUmVjb3JkKSB7DQorICAgIGlmICghSXNQYWdlU2V0Um9vdE9yZGVyZWRPY2N1cnJlbmNlKCkgfHwgcFBhZ2VOb2RlID09IE5VTEwpIHsNCisgICAgICAqcE5ld1JlY29yZCA9ICpHZXRDdXJyZW50Q29udGFpbmVyUmVjb3JkKCk7DQorICAgICAgbV9yZ1Byb3Bvc2VkQ29udGFpbmVyUmVjb3JkLkFkZFRhaWwocE5ld1JlY29yZCk7DQorICAgICAgcmV0dXJuIHBOZXdSZWNvcmQ7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwUGFnZVNldCA9IHBQYWdlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIGlmICghYkNyZWF0ZU5ldykgew0KKyAgICAgIGlmIChwUGFnZVNldCA9PSBtX3BUZW1wbGF0ZVBhZ2VTZXRSb290KSB7DQorICAgICAgICBwTmV3UmVjb3JkLT5wQ3VyUGFnZVNldCA9IG1fcFBhZ2VTZXRDdXJSb290Ow0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIHBQYXJlbnRMYXlvdXRJdGVtID0NCisgICAgICAgICAgICAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKilwUGFnZVNldC0+R2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVkpOw0KKyAgICAgICAgaWYgKHBQYXJlbnRMYXlvdXRJdGVtID09IE5VTEwpIHsNCisgICAgICAgICAgcFBhcmVudExheW91dEl0ZW0gPSBtX3BQYWdlU2V0Q3VyUm9vdDsNCisgICAgICAgIH0NCisgICAgICAgIHBOZXdSZWNvcmQtPnBDdXJQYWdlU2V0ID0gcFBhcmVudExheW91dEl0ZW07DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcFBhcmVudFBhZ2VTZXRMYXlvdXQgPSBOVUxMOw0KKyAgICAgIGlmIChwUGFnZVNldCA9PSBHZXRDdXJyZW50Q29udGFpbmVyUmVjb3JkKCktPnBDdXJQYWdlU2V0LT5tX3BGb3JtTm9kZSkgew0KKyAgICAgICAgcFBhcmVudFBhZ2VTZXRMYXlvdXQgPQ0KKyAgICAgICAgICAgIChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qKQ0KKyAgICAgICAgICAgICAgICBHZXRDdXJyZW50Q29udGFpbmVyUmVjb3JkKCktPnBDdXJQYWdlU2V0LT5tX3BQYXJlbnQ7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHBQYXJlbnRQYWdlU2V0TGF5b3V0ID0NCisgICAgICAgICAgICAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKilwUGFnZVNldC0+R2V0Tm9kZUl0ZW0oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTk9ERUlURU1fUGFyZW50KQ0KKyAgICAgICAgICAgICAgICAtPkdldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZKTsNCisgICAgICB9DQorICAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwUGFnZVNldExheW91dEl0ZW0gPQ0KKyAgICAgICAgICBuZXcgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKHBQYWdlU2V0KTsNCisgICAgICBwUGFnZVNldC0+U2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVksICh2b2lkKilwUGFnZVNldExheW91dEl0ZW0pOw0KKyAgICAgIGlmIChwUGFyZW50UGFnZVNldExheW91dCA9PSBOVUxMKSB7DQorICAgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIHBQcmVQYWdlU2V0ID0gbV9wUGFnZVNldExheW91dEl0ZW1Sb290Ow0KKyAgICAgICAgd2hpbGUgKHBQcmVQYWdlU2V0LT5tX3BOZXh0U2libGluZykgew0KKyAgICAgICAgICBwUHJlUGFnZVNldCA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qKXBQcmVQYWdlU2V0LT5tX3BOZXh0U2libGluZzsNCisgICAgICAgIH0NCisgICAgICAgIHBQcmVQYWdlU2V0LT5tX3BOZXh0U2libGluZyA9IHBQYWdlU2V0TGF5b3V0SXRlbTsNCisgICAgICAgIG1fcFBhZ2VTZXRDdXJSb290ID0gcFBhZ2VTZXRMYXlvdXRJdGVtOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBwUGFyZW50UGFnZVNldExheW91dC0+QWRkQ2hpbGQocFBhZ2VTZXRMYXlvdXRJdGVtKTsNCisgICAgICB9DQorICAgICAgcE5ld1JlY29yZC0+cEN1clBhZ2VTZXQgPSBwUGFnZVNldExheW91dEl0ZW07DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGlmIChwUGFnZU5vZGUpIHsNCisgICAgICBDWEZBX05vZGUqIHBQYWdlU2V0ID0gcFBhZ2VOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICBpZiAocFBhZ2VTZXQgPT0gbV9wVGVtcGxhdGVQYWdlU2V0Um9vdCkgew0KKyAgICAgICAgcE5ld1JlY29yZC0+cEN1clBhZ2VTZXQgPSBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3Q7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcFBhZ2VTZXRMYXlvdXRJdGVtID0NCisgICAgICAgICAgICBuZXcgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKHBQYWdlU2V0KTsNCisgICAgICAgIHBQYWdlU2V0LT5TZXRVc2VyRGF0YShYRkFfTEFZT1VUSVRFTUtFWSwgKHZvaWQqKXBQYWdlU2V0TGF5b3V0SXRlbSk7DQorICAgICAgICBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3QtPkFkZENoaWxkKHBQYWdlU2V0TGF5b3V0SXRlbSk7DQorICAgICAgICBwTmV3UmVjb3JkLT5wQ3VyUGFnZVNldCA9IHBQYWdlU2V0TGF5b3V0SXRlbTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgcE5ld1JlY29yZC0+cEN1clBhZ2VTZXQgPSBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3Q7DQorICAgIH0NCisgIH0NCisgIG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5BZGRUYWlsKHBOZXdSZWNvcmQpOw0KKyAgcmV0dXJuIHBOZXdSZWNvcmQ7DQorfQ0KK3ZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpBZGRQYWdlQXJlYUxheW91dEl0ZW0oQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBOZXdQYWdlQXJlYSkgew0KKyAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwTmV3UGFnZUFyZWFMYXlvdXRJdGVtID0gTlVMTDsNCisgIGlmIChtX1BhZ2VBcnJheS5HZXRTaXplKCkgPiBtX25BdmFpbFBhZ2VzKSB7DQorICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcENvbnRhaW5lckl0ZW0gPSBtX1BhZ2VBcnJheVttX25BdmFpbFBhZ2VzXTsNCisgICAgcENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlID0gcE5ld1BhZ2VBcmVhOw0KKyAgICBtX25BdmFpbFBhZ2VzKys7DQorICAgIHBOZXdQYWdlQXJlYUxheW91dEl0ZW0gPSBwQ29udGFpbmVySXRlbTsNCisgIH0gZWxzZSB7DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0NCisgICAgICAgIHBOZXdQYWdlQXJlYS0+R2V0RG9jdW1lbnQoKS0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIHBDb250YWluZXJJdGVtID0NCisgICAgICAgIChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qKXBOb3RpZnktPk9uQ3JlYXRlTGF5b3V0SXRlbShwTmV3UGFnZUFyZWEpOw0KKyAgICBtX1BhZ2VBcnJheS5BZGQocENvbnRhaW5lckl0ZW0pOw0KKyAgICBtX25BdmFpbFBhZ2VzKys7DQorICAgIHBOb3RpZnktPk9uUGFnZUV2ZW50KHBDb250YWluZXJJdGVtLCBYRkFfUEFHRUVWRU5UX1BhZ2VBZGRlZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSh1aW50cHRyX3QpbV9uQXZhaWxQYWdlcyk7DQorICAgIHBOZXdQYWdlQXJlYUxheW91dEl0ZW0gPSBwQ29udGFpbmVySXRlbTsNCisgIH0NCisgIHBOZXdSZWNvcmQtPnBDdXJQYWdlU2V0LT5BZGRDaGlsZChwTmV3UGFnZUFyZWFMYXlvdXRJdGVtKTsNCisgIHBOZXdSZWNvcmQtPnBDdXJQYWdlQXJlYSA9IHBOZXdQYWdlQXJlYUxheW91dEl0ZW07DQorICBwTmV3UmVjb3JkLT5wQ3VyQ29udGVudEFyZWEgPSBOVUxMOw0KK30NCit2b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6QWRkQ29udGVudEFyZWFMYXlvdXRJdGVtKA0KKyAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcE5ld1JlY29yZCwNCisgICAgQ1hGQV9Ob2RlKiBwQ29udGVudEFyZWEpIHsNCisgIGlmIChwQ29udGVudEFyZWEgPT0gTlVMTCkgew0KKyAgICBwTmV3UmVjb3JkLT5wQ3VyQ29udGVudEFyZWEgPSBOVUxMOw0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIHBOZXdDb250ZW50QXJlYUxheW91dEl0ZW0gPQ0KKyAgICAgIG5ldyBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0ocENvbnRlbnRBcmVhKTsNCisgIEFTU0VSVChwTmV3UmVjb3JkLT5wQ3VyUGFnZUFyZWEpOw0KKyAgcE5ld1JlY29yZC0+cEN1clBhZ2VBcmVhLT5BZGRDaGlsZChwTmV3Q29udGVudEFyZWFMYXlvdXRJdGVtKTsNCisgIHBOZXdSZWNvcmQtPnBDdXJDb250ZW50QXJlYSA9IHBOZXdDb250ZW50QXJlYUxheW91dEl0ZW07DQorfQ0KK2NsYXNzIENYRkFfVHJhdmVyc2VTdHJhdGVneV9QYWdlU2V0Q29udGFpbmVyTGF5b3V0SXRlbSB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBpbmxpbmUgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBHZXRGaXJzdENoaWxkKA0KKyAgICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcExheW91dEl0ZW0pIHsNCisgICAgaWYgKHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VTZXQpIHsNCisgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIHBDaGlsZEl0ZW0gPQ0KKyAgICAgICAgICAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKilwTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCisgICAgICB3aGlsZSAocENoaWxkSXRlbSAmJg0KKyAgICAgICAgICAgICBwQ2hpbGRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1BhZ2VTZXQpIHsNCisgICAgICAgIHBDaGlsZEl0ZW0gPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKilwQ2hpbGRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgICAgICB9DQorICAgICAgcmV0dXJuIHBDaGlsZEl0ZW07DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBzdGF0aWMgaW5saW5lIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogR2V0TmV4dFNpYmxpbmcoDQorICAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSkgew0KKyAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIHBDaGlsZEl0ZW0gPQ0KKyAgICAgICAgKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSopcExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KKyAgICB3aGlsZSAocENoaWxkSXRlbSAmJg0KKyAgICAgICAgICAgcENoaWxkSXRlbS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9QYWdlU2V0KSB7DQorICAgICAgcENoaWxkSXRlbSA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qKXBDaGlsZEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KKyAgICB9DQorICAgIHJldHVybiBwQ2hpbGRJdGVtOw0KKyAgfQ0KKyAgc3RhdGljIGlubGluZSBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIEdldFBhcmVudCgNCisgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIHBMYXlvdXRJdGVtKSB7DQorICAgIHJldHVybiAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKilwTGF5b3V0SXRlbS0+bV9wUGFyZW50Ow0KKyAgfQ0KK307DQordm9pZCBDWEZBX0xheW91dFBhZ2VNZ3I6OkZpbmlzaFBhZ2luYXRlZFBhZ2VTZXRzKCkgew0KKyAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwUm9vdFBhZ2VTZXRMYXlvdXRJdGVtID0gbV9wUGFnZVNldExheW91dEl0ZW1Sb290Ow0KKyAgZm9yICg7IHBSb290UGFnZVNldExheW91dEl0ZW07DQorICAgICAgIHBSb290UGFnZVNldExheW91dEl0ZW0gPQ0KKyAgICAgICAgICAgKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSopcFJvb3RQYWdlU2V0TGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1BhZ2VTZXRDb250YWluZXJMYXlvdXRJdGVtPg0KKyAgICAgICAgc0l0ZXJhdG9yKHBSb290UGFnZVNldExheW91dEl0ZW0pOw0KKyAgICBmb3IgKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcFBhZ2VTZXRMYXlvdXRJdGVtID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsNCisgICAgICAgICBwUGFnZVNldExheW91dEl0ZW07IHBQYWdlU2V0TGF5b3V0SXRlbSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlUGFnZVJlbGF0aW9uID0NCisgICAgICAgICAgcFBhZ2VTZXRMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1JlbGF0aW9uKTsNCisgICAgICBzd2l0Y2ggKGVQYWdlUmVsYXRpb24pIHsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fT3JkZXJlZE9jY3VycmVuY2U6DQorICAgICAgICBkZWZhdWx0OiB7IFByb2Nlc3NMYXN0UGFnZVNldCgpOyB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9TaW1wbGV4UGFnaW5hdGVkOg0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9EdXBsZXhQYWdpbmF0ZWQ6IHsNCisgICAgICAgICAgQ1hGQV9MYXlvdXRJdGVtKiBwTGFzdFBhZ2VBcmVhTGF5b3V0SXRlbSA9IE5VTEw7DQorICAgICAgICAgIGludDMyX3QgblBhZ2VBcmVhQ291bnQgPSAwOw0KKyAgICAgICAgICBmb3IgKENYRkFfTGF5b3V0SXRlbSogcFBhZ2VBcmVhTGF5b3V0SXRlbSA9DQorICAgICAgICAgICAgICAgICAgIHBQYWdlU2V0TGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCisgICAgICAgICAgICAgICBwUGFnZUFyZWFMYXlvdXRJdGVtOw0KKyAgICAgICAgICAgICAgIHBQYWdlQXJlYUxheW91dEl0ZW0gPSBwUGFnZUFyZWFMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgICAgICAgIGlmIChwUGFnZUFyZWFMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpICE9DQorICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgblBhZ2VBcmVhQ291bnQrKzsNCisgICAgICAgICAgICBwTGFzdFBhZ2VBcmVhTGF5b3V0SXRlbSA9IHBQYWdlQXJlYUxheW91dEl0ZW07DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKCFwTGFzdFBhZ2VBcmVhTGF5b3V0SXRlbSkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmICghRmluZFBhZ2VBcmVhRnJvbVBhZ2VTZXRfU2ltcGxleER1cGxleCgNCisgICAgICAgICAgICAgICAgICBwUGFnZVNldExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLCBOVUxMLCBOVUxMLCBOVUxMLCBUUlVFLCBUUlVFLA0KKyAgICAgICAgICAgICAgICAgIG5QYWdlQXJlYUNvdW50ID09IDEgPyBYRkFfQVRUUklCVVRFRU5VTV9Pbmx5DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFhGQV9BVFRSSUJVVEVFTlVNX0xhc3QpICYmDQorICAgICAgICAgICAgICAoblBhZ2VBcmVhQ291bnQgPT0gMSAmJg0KKyAgICAgICAgICAgICAgICFGaW5kUGFnZUFyZWFGcm9tUGFnZVNldF9TaW1wbGV4RHVwbGV4KA0KKyAgICAgICAgICAgICAgICAgICBwUGFnZVNldExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLCBOVUxMLCBOVUxMLCBOVUxMLCBUUlVFLA0KKyAgICAgICAgICAgICAgICAgICBUUlVFLCBYRkFfQVRUUklCVVRFRU5VTV9MYXN0KSkpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wQ3VyUGFnZUFyZWE7DQorICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVDdXJDaG9pY2UgPQ0KKyAgICAgICAgICAgICAgcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9QYWdlUG9zaXRpb24pOw0KKyAgICAgICAgICBpZiAoZUN1ckNob2ljZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9MYXN0KSB7DQorICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZU9kZE9yRXZlbiA9IFhGQV9BVFRSSUJVVEVFTlVNX0FueTsNCisgICAgICAgICAgICBwTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX09kZE9yRXZlbiwgZU9kZE9yRXZlbik7DQorICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZUxhc3RDaG9pY2UgPQ0KKyAgICAgICAgICAgICAgICBwTGFzdFBhZ2VBcmVhTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldEVudW0oDQorICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFX1BhZ2VQb3NpdGlvbik7DQorICAgICAgICAgICAgaWYgKGVMYXN0Q2hvaWNlID09IFhGQV9BVFRSSUJVVEVFTlVNX0ZpcnN0ICYmDQorICAgICAgICAgICAgICAgIChlUGFnZVJlbGF0aW9uID09IFhGQV9BVFRSSUJVVEVFTlVNX1NpbXBsZXhQYWdpbmF0ZWQgfHwNCisgICAgICAgICAgICAgICAgIGVPZGRPckV2ZW4gIT0gWEZBX0FUVFJJQlVURUVOVU1fT2RkKSkgew0KKyAgICAgICAgICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBSZWNvcmQgPSBDcmVhdGVDb250YWluZXJSZWNvcmQoKTsNCisgICAgICAgICAgICAgIEFkZFBhZ2VBcmVhTGF5b3V0SXRlbShwUmVjb3JkLCBwTm9kZSk7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgIDsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgRlhfQk9PTCBiVXNhYmxlID0gVFJVRTsNCisgICAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfRkxPQVQ+IHJnVXNlZEhlaWdodHM7DQorICAgICAgICAgIGZvciAoQ1hGQV9MYXlvdXRJdGVtKiBwQ2hpbGRMYXlvdXRJdGVtID0NCisgICAgICAgICAgICAgICAgICAgcExhc3RQYWdlQXJlYUxheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQorICAgICAgICAgICAgICAgcENoaWxkTGF5b3V0SXRlbTsNCisgICAgICAgICAgICAgICBwQ2hpbGRMYXlvdXRJdGVtID0gcENoaWxkTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgICAgICAgICBpZiAocENoaWxkTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSAhPQ0KKyAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVF9Db250ZW50QXJlYSkgew0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEZYX0ZMT0FUIGZVc2VkSGVpZ2h0ID0gMDsNCisgICAgICAgICAgICBmb3IgKENYRkFfTGF5b3V0SXRlbSogcENvbnRlbnRDaGlsZExheW91dEl0ZW0gPQ0KKyAgICAgICAgICAgICAgICAgICAgIHBDaGlsZExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQorICAgICAgICAgICAgICAgICBwQ29udGVudENoaWxkTGF5b3V0SXRlbTsNCisgICAgICAgICAgICAgICAgIHBDb250ZW50Q2hpbGRMYXlvdXRJdGVtID0NCisgICAgICAgICAgICAgICAgICAgICBwQ29udGVudENoaWxkTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgICAgICAgICAgIGlmIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwQ29udGVudCA9DQorICAgICAgICAgICAgICAgICAgICAgIHBDb250ZW50Q2hpbGRMYXlvdXRJdGVtLT5Bc0NvbnRlbnRMYXlvdXRJdGVtKCkpIHsNCisgICAgICAgICAgICAgICAgZlVzZWRIZWlnaHQgKz0gcENvbnRlbnQtPm1fc1NpemUueTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmdVc2VkSGVpZ2h0cy5BZGQoZlVzZWRIZWlnaHQpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGludDMyX3QgaUN1ckNvbnRlbnRBcmVhSW5kZXggPSAtMTsNCisgICAgICAgICAgZm9yIChDWEZBX05vZGUqIHBDb250ZW50QXJlYU5vZGUgPQ0KKyAgICAgICAgICAgICAgICAgICBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICAgICAgICAgIHBDb250ZW50QXJlYU5vZGU7DQorICAgICAgICAgICAgICAgcENvbnRlbnRBcmVhTm9kZSA9DQorICAgICAgICAgICAgICAgICAgIHBDb250ZW50QXJlYU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgICAgICBpZiAocENvbnRlbnRBcmVhTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSB7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaUN1ckNvbnRlbnRBcmVhSW5kZXgrKzsNCisgICAgICAgICAgICBpZiAocmdVc2VkSGVpZ2h0c1tpQ3VyQ29udGVudEFyZWFJbmRleF0gPg0KKyAgICAgICAgICAgICAgICBwQ29udGVudEFyZWFOb2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfSCkNCisgICAgICAgICAgICAgICAgICAgICAgICAuVG9Vbml0KFhGQV9VTklUX1B0KSArDQorICAgICAgICAgICAgICAgICAgICBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICAgICAgICAgICAgYlVzYWJsZSA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChiVXNhYmxlKSB7DQorICAgICAgICAgICAgQ1hGQV9MYXlvdXRJdGVtKiBwQ2hpbGRMYXlvdXRJdGVtID0NCisgICAgICAgICAgICAgICAgcExhc3RQYWdlQXJlYUxheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQ29udGVudEFyZWFOb2RlID0NCisgICAgICAgICAgICAgICAgcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICAgICBwTGFzdFBhZ2VBcmVhTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUgPSBwTm9kZTsNCisgICAgICAgICAgICB3aGlsZSAocENoaWxkTGF5b3V0SXRlbSAmJiBwQ29udGVudEFyZWFOb2RlKSB7DQorICAgICAgICAgICAgICBpZiAocENoaWxkTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSAhPQ0KKyAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSB7DQorICAgICAgICAgICAgICAgIHBDaGlsZExheW91dEl0ZW0gPSBwQ2hpbGRMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBpZiAocENvbnRlbnRBcmVhTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSB7DQorICAgICAgICAgICAgICAgIHBDb250ZW50QXJlYU5vZGUgPQ0KKyAgICAgICAgICAgICAgICAgICAgcENvbnRlbnRBcmVhTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICBwQ2hpbGRMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSA9IHBDb250ZW50QXJlYU5vZGU7DQorICAgICAgICAgICAgICBwQ2hpbGRMYXlvdXRJdGVtID0gcENoaWxkTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmc7DQorICAgICAgICAgICAgICBwQ29udGVudEFyZWFOb2RlID0NCisgICAgICAgICAgICAgICAgICBwQ29udGVudEFyZWFOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIGlmIChwTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1BhZ2VQb3NpdGlvbikgPT0NCisgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTV9MYXN0KSB7DQorICAgICAgICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBSZWNvcmQgPSBDcmVhdGVDb250YWluZXJSZWNvcmQoKTsNCisgICAgICAgICAgICBBZGRQYWdlQXJlYUxheW91dEl0ZW0ocFJlY29yZCwgcE5vZGUpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KK30NCitpbnQzMl90IENYRkFfTGF5b3V0UGFnZU1ncjo6R2V0UGFnZUNvdW50KCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fUGFnZUFycmF5LkdldFNpemUoKTsNCit9DQorSVhGQV9MYXlvdXRQYWdlKiBDWEZBX0xheW91dFBhZ2VNZ3I6OkdldFBhZ2UoaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBtX1BhZ2VBcnJheS5HZXRTaXplKCkpDQorICAgIHJldHVybiBudWxscHRyOw0KKyAgcmV0dXJuIG1fUGFnZUFycmF5W2luZGV4XTsNCit9DQoraW50MzJfdCBDWEZBX0xheW91dFBhZ2VNZ3I6OkdldFBhZ2VJbmRleChjb25zdCBJWEZBX0xheW91dFBhZ2UqIHBQYWdlKSBjb25zdCB7DQorICAvLyBGSVhNRTogRmluZCgpIG1ldGhvZCBzaG91bGQgdGFrZSBjb25zdC4NCisgIHJldHVybiBtX1BhZ2VBcnJheS5GaW5kKHN0YXRpY19jYXN0PENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSo+KA0KKyAgICAgIGNvbnN0X2Nhc3Q8SVhGQV9MYXlvdXRQYWdlKj4ocFBhZ2UpKSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpSdW5CcmVhayhYRkFfRUxFTUVOVCBlQnJlYWtUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlVGFyZ2V0VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVGFyZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTdGFydE5ldykgew0KKyAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7DQorICBzd2l0Y2ggKGVUYXJnZXRUeXBlKSB7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWE6DQorICAgICAgaWYgKHBUYXJnZXQgJiYgcFRhcmdldC0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSB7DQorICAgICAgICBwVGFyZ2V0ID0gTlVMTDsNCisgICAgICB9DQorICAgICAgaWYgKCFwVGFyZ2V0IHx8ICFtX3BDdXJyZW50Q29udGFpbmVyUmVjb3JkIHx8DQorICAgICAgICAgIHBUYXJnZXQgIT0NCisgICAgICAgICAgICAgIEdldEN1cnJlbnRDb250YWluZXJSZWNvcmQoKS0+cEN1ckNvbnRlbnRBcmVhLT5tX3BGb3JtTm9kZSB8fA0KKyAgICAgICAgICBiU3RhcnROZXcpIHsNCisgICAgICAgIENYRkFfTm9kZSogcFBhZ2VBcmVhID0gTlVMTDsNCisgICAgICAgIGlmIChwVGFyZ2V0KSB7DQorICAgICAgICAgIHBQYWdlQXJlYSA9IHBUYXJnZXQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcFBhZ2VBcmVhID0gR2V0TmV4dEF2YWlsUGFnZUFyZWEocFBhZ2VBcmVhLCBwVGFyZ2V0KTsNCisgICAgICAgIGJSZXQgPSBwUGFnZUFyZWEgIT0gTlVMTDsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUGFnZUFyZWE6DQorICAgICAgaWYgKHBUYXJnZXQgJiYgcFRhcmdldC0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQorICAgICAgICBwVGFyZ2V0ID0gTlVMTDsNCisgICAgICB9DQorICAgICAgaWYgKCFwVGFyZ2V0IHx8ICFtX3BDdXJyZW50Q29udGFpbmVyUmVjb3JkIHx8DQorICAgICAgICAgIHBUYXJnZXQgIT0gR2V0Q3VycmVudENvbnRhaW5lclJlY29yZCgpLT5wQ3VyUGFnZUFyZWEtPm1fcEZvcm1Ob2RlIHx8DQorICAgICAgICAgIGJTdGFydE5ldykgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwUGFnZUFyZWEgPSBHZXROZXh0QXZhaWxQYWdlQXJlYShwVGFyZ2V0LCBOVUxMLCBUUlVFKTsNCisgICAgICAgIGJSZXQgPSBwUGFnZUFyZWEgIT0gTlVMTDsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUGFnZU9kZDoNCisgICAgICBpZiAocFRhcmdldCAmJiBwVGFyZ2V0LT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCisgICAgICAgIHBUYXJnZXQgPSBOVUxMOw0KKyAgICAgIH0NCisgICAgICBpZiAobV9uQXZhaWxQYWdlcyAlIDIgIT0gMSB8fCAhbV9wQ3VycmVudENvbnRhaW5lclJlY29yZCB8fA0KKyAgICAgICAgICAocFRhcmdldCAmJg0KKyAgICAgICAgICAgcFRhcmdldCAhPSBHZXRDdXJyZW50Q29udGFpbmVyUmVjb3JkKCktPnBDdXJQYWdlQXJlYS0+bV9wRm9ybU5vZGUpIHx8DQorICAgICAgICAgIGJTdGFydE5ldykgew0KKyAgICAgICAgaWYgKG1fbkF2YWlsUGFnZXMgJSAyID09IDEpIHsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUGFnZUV2ZW46DQorICAgICAgaWYgKHBUYXJnZXQgJiYgcFRhcmdldC0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQorICAgICAgICBwVGFyZ2V0ID0gTlVMTDsNCisgICAgICB9DQorICAgICAgaWYgKG1fbkF2YWlsUGFnZXMgJSAyICE9IDAgfHwgIW1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQgfHwNCisgICAgICAgICAgKHBUYXJnZXQgJiYNCisgICAgICAgICAgIHBUYXJnZXQgIT0gR2V0Q3VycmVudENvbnRhaW5lclJlY29yZCgpLT5wQ3VyUGFnZUFyZWEtPm1fcEZvcm1Ob2RlKSB8fA0KKyAgICAgICAgICBiU3RhcnROZXcpIHsNCisgICAgICAgIGlmIChtX25BdmFpbFBhZ2VzICUgMiA9PSAwKSB7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0F1dG86DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICAgICAgOw0KKyAgfQ0KKyAgcmV0dXJuIGJSZXQ7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpFeGVjdXRlQnJlYWtCZWZvcmVPckFmdGVyKA0KKyAgICBDWEZBX05vZGUqIHBDdXJOb2RlLA0KKyAgICBGWF9CT09MIGJCZWZvcmUsDQorICAgIENYRkFfTm9kZSomIHBCcmVha0xlYWRlclRlbXBsYXRlLA0KKyAgICBDWEZBX05vZGUqJiBwQnJlYWtUcmFpbGVyVGVtcGxhdGUpIHsNCisgIFhGQV9FTEVNRU5UIGVUeXBlID0gcEN1ck5vZGUtPkdldENsYXNzSUQoKTsNCisgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9CcmVha0JlZm9yZToNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9CcmVha0FmdGVyOiB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQnJlYWtMZWFkZXIsIHdzQnJlYWtUcmFpbGVyOw0KKyAgICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlID0gcEN1ck5vZGUtPkdldE5vZGVJdGVtKA0KKyAgICAgICAgICBYRkFfTk9ERUlURU1fUGFyZW50LCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKTsNCisgICAgICBDWEZBX05vZGUqIHBDb250YWluZXIgPSBwRm9ybU5vZGUtPkdldFRlbXBsYXRlTm9kZSgpOw0KKyAgICAgIEZYX0JPT0wgYlN0YXJ0TmV3ID0gcEN1ck5vZGUtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9TdGFydE5ldykgIT0gMDsNCisgICAgICBDWEZBX05vZGUqIHBTY3JpcHQgPSBwQ3VyTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfU2NyaXB0KTsNCisgICAgICBpZiAocFNjcmlwdCAmJiAhWEZBX0xheW91dFBhZ2VNZ3JfUnVuQnJlYWtUZXN0U2NyaXB0KHBTY3JpcHQpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nQyB3c1RhcmdldCA9IHBDdXJOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX1RhcmdldCk7DQorICAgICAgQ1hGQV9Ob2RlKiBwVGFyZ2V0ID0NCisgICAgICAgICAgWEZBX1Jlc29sdmVCcmVha1RhcmdldChtX3BUZW1wbGF0ZVBhZ2VTZXRSb290LCBUUlVFLCB3c1RhcmdldCk7DQorICAgICAgd3NCcmVha1RyYWlsZXIgPSBwQ3VyTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9UcmFpbGVyKTsNCisgICAgICB3c0JyZWFrTGVhZGVyID0gcEN1ck5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTGVhZGVyKTsNCisgICAgICBwQnJlYWtMZWFkZXJUZW1wbGF0ZSA9DQorICAgICAgICAgIFhGQV9SZXNvbHZlQnJlYWtUYXJnZXQocENvbnRhaW5lciwgVFJVRSwgd3NCcmVha0xlYWRlcik7DQorICAgICAgcEJyZWFrVHJhaWxlclRlbXBsYXRlID0NCisgICAgICAgICAgWEZBX1Jlc29sdmVCcmVha1RhcmdldChwQ29udGFpbmVyLCBUUlVFLCB3c0JyZWFrVHJhaWxlcik7DQorICAgICAgaWYgKFJ1bkJyZWFrKGVUeXBlLCBwQ3VyTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1RhcmdldFR5cGUpLCBwVGFyZ2V0LA0KKyAgICAgICAgICAgICAgICAgICBiU3RhcnROZXcpKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5HZXRDb3VudCgpID4gMCAmJg0KKyAgICAgICAgICAgIG1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQgPT0NCisgICAgICAgICAgICAgICAgbV9yZ1Byb3Bvc2VkQ29udGFpbmVyUmVjb3JkLkdldEhlYWRQb3NpdGlvbigpICYmDQorICAgICAgICAgICAgZVR5cGUgPT0gWEZBX0VMRU1FTlRfQnJlYWtCZWZvcmUpIHsNCisgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IHBGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oDQorICAgICAgICAgICAgICBYRkFfTk9ERUlURU1fUGFyZW50LCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKTsNCisgICAgICAgICAgaWYgKCFwUGFyZW50Tm9kZSB8fA0KKyAgICAgICAgICAgICAgcEZvcm1Ob2RlICE9DQorICAgICAgICAgICAgICAgICAgcFBhcmVudE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKSkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHBQYXJlbnROb2RlID0gcFBhcmVudE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgICBpZiAoIXBQYXJlbnROb2RlIHx8IHBQYXJlbnROb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfRm9ybSkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9CcmVhazogew0KKyAgICAgIEZYX0JPT0wgYlN0YXJ0TmV3ID0gcEN1ck5vZGUtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9TdGFydE5ldykgIT0gMDsNCisgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NUYXJnZXQgPSBwQ3VyTm9kZS0+R2V0Q0RhdGEoDQorICAgICAgICAgIGJCZWZvcmUgPyBYRkFfQVRUUklCVVRFX0JlZm9yZVRhcmdldCA6IFhGQV9BVFRSSUJVVEVfQWZ0ZXJUYXJnZXQpOw0KKyAgICAgIENYRkFfTm9kZSogcFRhcmdldCA9DQorICAgICAgICAgIFhGQV9SZXNvbHZlQnJlYWtUYXJnZXQobV9wVGVtcGxhdGVQYWdlU2V0Um9vdCwgVFJVRSwgd3NUYXJnZXQpOw0KKyAgICAgIGlmIChSdW5CcmVhayhiQmVmb3JlID8gWEZBX0VMRU1FTlRfQnJlYWtCZWZvcmUgOiBYRkFfRUxFTUVOVF9CcmVha0FmdGVyLA0KKyAgICAgICAgICAgICAgICAgICBwQ3VyTm9kZS0+R2V0RW51bShiQmVmb3JlID8gWEZBX0FUVFJJQlVURV9CZWZvcmUNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFhGQV9BVFRSSUJVVEVfQWZ0ZXIpLA0KKyAgICAgICAgICAgICAgICAgICBwVGFyZ2V0LCBiU3RhcnROZXcpKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9TZXRMYXlvdXRHZW5lcmF0ZWROb2RlRmxhZyhDWEZBX05vZGUqIHBOb2RlKSB7DQorICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfTGF5b3V0R2VuZXJhdGVkTm9kZSwgVFJVRSwgRkFMU0UpOw0KKyAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUsIEZBTFNFLCBGQUxTRSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpQcm9jZXNzQnJlYWtCZWZvcmVPckFmdGVyKA0KKyAgICBDWEZBX05vZGUqIHBCcmVha05vZGUsDQorICAgIEZYX0JPT0wgYkJlZm9yZSwNCisgICAgQ1hGQV9Ob2RlKiYgcEJyZWFrTGVhZGVyTm9kZSwNCisgICAgQ1hGQV9Ob2RlKiYgcEJyZWFrVHJhaWxlck5vZGUsDQorICAgIEZYX0JPT0wmIGJDcmVhdGVQYWdlKSB7DQorICBDWEZBX05vZGUgKnBMZWFkZXJUZW1wbGF0ZSA9IE5VTEwsICpwVHJhaWxlclRlbXBsYXRlID0gTlVMTDsNCisgIENYRkFfTm9kZSogcEZvcm1Ob2RlID0gcEJyZWFrTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQorICBpZiAoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShwRm9ybU5vZGUpKSB7DQorICAgIGJDcmVhdGVQYWdlID0gRXhlY3V0ZUJyZWFrQmVmb3JlT3JBZnRlcihwQnJlYWtOb2RlLCBiQmVmb3JlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlYWRlclRlbXBsYXRlLCBwVHJhaWxlclRlbXBsYXRlKTsNCisgICAgQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gcEJyZWFrTm9kZS0+R2V0RG9jdW1lbnQoKTsNCisgICAgQ1hGQV9Ob2RlKiBwRGF0YVNjb3BlID0gTlVMTDsNCisgICAgcEZvcm1Ob2RlID0gcEZvcm1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpOw0KKyAgICBpZiAocExlYWRlclRlbXBsYXRlKSB7DQorICAgICAgaWYgKCFwRGF0YVNjb3BlKSB7DQorICAgICAgICBwRGF0YVNjb3BlID0gWEZBX0RhdGFNZXJnZV9GaW5kRGF0YVNjb3BlKHBGb3JtTm9kZSk7DQorICAgICAgfQ0KKyAgICAgIHBCcmVha0xlYWRlck5vZGUgPSBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKA0KKyAgICAgICAgICBwTGVhZGVyVGVtcGxhdGUsIHBGb3JtTm9kZSwgcERhdGFTY29wZSwgVFJVRSk7DQorICAgICAgcERvY3VtZW50LT5EYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucyhwQnJlYWtMZWFkZXJOb2RlKTsNCisgICAgICBYRkFfU2V0TGF5b3V0R2VuZXJhdGVkTm9kZUZsYWcocEJyZWFrTGVhZGVyTm9kZSk7DQorICAgIH0NCisgICAgaWYgKHBUcmFpbGVyVGVtcGxhdGUpIHsNCisgICAgICBpZiAoIXBEYXRhU2NvcGUpIHsNCisgICAgICAgIHBEYXRhU2NvcGUgPSBYRkFfRGF0YU1lcmdlX0ZpbmREYXRhU2NvcGUocEZvcm1Ob2RlKTsNCisgICAgICB9DQorICAgICAgcEJyZWFrVHJhaWxlck5vZGUgPSBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKA0KKyAgICAgICAgICBwVHJhaWxlclRlbXBsYXRlLCBwRm9ybU5vZGUsIHBEYXRhU2NvcGUsIFRSVUUpOw0KKyAgICAgIHBEb2N1bWVudC0+RGF0YU1lcmdlX1VwZGF0ZUJpbmRpbmdSZWxhdGlvbnMocEJyZWFrVHJhaWxlck5vZGUpOw0KKyAgICAgIFhGQV9TZXRMYXlvdXRHZW5lcmF0ZWROb2RlRmxhZyhwQnJlYWtUcmFpbGVyTm9kZSk7DQorICAgIH0NCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpQcm9jZXNzQm9va2VuZExlYWRlck9yVHJhaWxlcigNCisgICAgQ1hGQV9Ob2RlKiBwQm9va2VuZE5vZGUsDQorICAgIEZYX0JPT0wgYkxlYWRlciwNCisgICAgQ1hGQV9Ob2RlKiYgcEJvb2tlbmRBcHBlbmROb2RlKSB7DQorICBDWEZBX05vZGUqIHBMZWFkZXJUZW1wbGF0ZSA9IE5VTEw7DQorICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IHBCb29rZW5kTm9kZS0+R2V0Tm9kZUl0ZW0oDQorICAgICAgWEZBX05PREVJVEVNX1BhcmVudCwgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSk7DQorICBpZiAoUmVzb2x2ZUJvb2tlbmRMZWFkZXJPclRyYWlsZXIocEJvb2tlbmROb2RlLCBiTGVhZGVyLCBwTGVhZGVyVGVtcGxhdGUpKSB7DQorICAgIENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBCb29rZW5kTm9kZS0+R2V0RG9jdW1lbnQoKTsNCisgICAgQ1hGQV9Ob2RlKiBwRGF0YVNjb3BlID0gTlVMTDsNCisgICAgaWYgKHBMZWFkZXJUZW1wbGF0ZSkgew0KKyAgICAgIGlmICghcERhdGFTY29wZSkgew0KKyAgICAgICAgcERhdGFTY29wZSA9IFhGQV9EYXRhTWVyZ2VfRmluZERhdGFTY29wZShwRm9ybU5vZGUpOw0KKyAgICAgIH0NCisgICAgICBwQm9va2VuZEFwcGVuZE5vZGUgPSBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKA0KKyAgICAgICAgICBwTGVhZGVyVGVtcGxhdGUsIHBGb3JtTm9kZSwgcERhdGFTY29wZSwgVFJVRSk7DQorICAgICAgcERvY3VtZW50LT5EYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucyhwQm9va2VuZEFwcGVuZE5vZGUpOw0KKyAgICAgIFhGQV9TZXRMYXlvdXRHZW5lcmF0ZWROb2RlRmxhZyhwQm9va2VuZEFwcGVuZE5vZGUpOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9MYXlvdXRQYWdlTWdyOjpCcmVha092ZXJmbG93KENYRkFfTm9kZSogcE92ZXJmbG93Tm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqJiBwTGVhZGVyVGVtcGxhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiYgcFRyYWlsZXJUZW1wbGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDcmVhdGVQYWdlKSB7DQorICBDRlhfV2lkZVN0cmluZ0Mgd3NPdmVyZmxvd0xlYWRlciwgd3NPdmVyZmxvd1RyYWlsZXI7DQorICBDWEZBX05vZGUqIHBDb250YWluZXIgPQ0KKyAgICAgIHBPdmVyZmxvd05vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSkNCisgICAgICAgICAgLT5HZXRUZW1wbGF0ZU5vZGUoKTsNCisgIGlmIChwT3ZlcmZsb3dOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfQnJlYWspIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzT3ZlcmZsb3dMZWFkZXI7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c092ZXJmbG93VGFyZ2V0Ow0KKyAgICBDRlhfV2lkZVN0cmluZ0Mgd3NPdmVyZmxvd1RyYWlsZXI7DQorICAgIHBPdmVyZmxvd05vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfT3ZlcmZsb3dMZWFkZXIsIHdzT3ZlcmZsb3dMZWFkZXIpOw0KKyAgICBwT3ZlcmZsb3dOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX092ZXJmbG93VHJhaWxlciwgd3NPdmVyZmxvd1RyYWlsZXIpOw0KKyAgICBwT3ZlcmZsb3dOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX092ZXJmbG93VGFyZ2V0LCB3c092ZXJmbG93VGFyZ2V0KTsNCisgICAgaWYgKCF3c092ZXJmbG93TGVhZGVyLklzRW1wdHkoKSB8fCAhd3NPdmVyZmxvd1RyYWlsZXIuSXNFbXB0eSgpIHx8DQorICAgICAgICAhd3NPdmVyZmxvd1RhcmdldC5Jc0VtcHR5KCkpIHsNCisgICAgICBpZiAoIXdzT3ZlcmZsb3dUYXJnZXQuSXNFbXB0eSgpICYmIGJDcmVhdGVQYWdlICYmDQorICAgICAgICAgICFtX2JDcmVhdGVPdmVyRmxvd1BhZ2UpIHsNCisgICAgICAgIENYRkFfTm9kZSogcFRhcmdldCA9IFhGQV9SZXNvbHZlQnJlYWtUYXJnZXQoDQorICAgICAgICAgICAgdGhpcy0+bV9wVGVtcGxhdGVQYWdlU2V0Um9vdCwgVFJVRSwgd3NPdmVyZmxvd1RhcmdldCk7DQorICAgICAgICBpZiAocFRhcmdldCkgew0KKyAgICAgICAgICBtX2JDcmVhdGVPdmVyRmxvd1BhZ2UgPSBUUlVFOw0KKyAgICAgICAgICBzd2l0Y2ggKHBUYXJnZXQtPkdldENsYXNzSUQoKSkgew0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfUGFnZUFyZWE6DQorICAgICAgICAgICAgICBSdW5CcmVhayhYRkFfRUxFTUVOVF9PdmVyZmxvdywgWEZBX0FUVFJJQlVURUVOVU1fUGFnZUFyZWEsDQorICAgICAgICAgICAgICAgICAgICAgICBwVGFyZ2V0LCBUUlVFKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQ29udGVudEFyZWE6DQorICAgICAgICAgICAgICBSdW5CcmVhayhYRkFfRUxFTUVOVF9PdmVyZmxvdywgWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWEsDQorICAgICAgICAgICAgICAgICAgICAgICBwVGFyZ2V0LCBUUlVFKTsNCisgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoIWJDcmVhdGVQYWdlKSB7DQorICAgICAgICBwTGVhZGVyVGVtcGxhdGUgPQ0KKyAgICAgICAgICAgIFhGQV9SZXNvbHZlQnJlYWtUYXJnZXQocENvbnRhaW5lciwgVFJVRSwgd3NPdmVyZmxvd0xlYWRlcik7DQorICAgICAgICBwVHJhaWxlclRlbXBsYXRlID0NCisgICAgICAgICAgICBYRkFfUmVzb2x2ZUJyZWFrVGFyZ2V0KHBDb250YWluZXIsIFRSVUUsIHdzT3ZlcmZsb3dUcmFpbGVyKTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIHBPdmVyZmxvd05vZGU7DQorICAgIH0NCisgICAgcmV0dXJuIE5VTEw7DQorICB9IGVsc2UgaWYgKHBPdmVyZmxvd05vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9PdmVyZmxvdykgew0KKyAgICBDRlhfV2lkZVN0cmluZ0Mgd3NPdmVyZmxvd1RhcmdldDsNCisgICAgcE92ZXJmbG93Tm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9MZWFkZXIsIHdzT3ZlcmZsb3dMZWFkZXIpOw0KKyAgICBwT3ZlcmZsb3dOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1RyYWlsZXIsIHdzT3ZlcmZsb3dUcmFpbGVyKTsNCisgICAgcE92ZXJmbG93Tm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9UYXJnZXQsIHdzT3ZlcmZsb3dUYXJnZXQpOw0KKyAgICBpZiAoIXdzT3ZlcmZsb3dUYXJnZXQuSXNFbXB0eSgpICYmIGJDcmVhdGVQYWdlICYmICFtX2JDcmVhdGVPdmVyRmxvd1BhZ2UpIHsNCisgICAgICBDWEZBX05vZGUqIHBUYXJnZXQgPSBYRkFfUmVzb2x2ZUJyZWFrVGFyZ2V0KHRoaXMtPm1fcFRlbXBsYXRlUGFnZVNldFJvb3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLCB3c092ZXJmbG93VGFyZ2V0KTsNCisgICAgICBpZiAocFRhcmdldCkgew0KKyAgICAgICAgbV9iQ3JlYXRlT3ZlckZsb3dQYWdlID0gVFJVRTsNCisgICAgICAgIHN3aXRjaCAocFRhcmdldC0+R2V0Q2xhc3NJRCgpKSB7DQorICAgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfUGFnZUFyZWE6DQorICAgICAgICAgICAgUnVuQnJlYWsoWEZBX0VMRU1FTlRfT3ZlcmZsb3csIFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VBcmVhLCBwVGFyZ2V0LA0KKyAgICAgICAgICAgICAgICAgICAgIFRSVUUpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhOg0KKyAgICAgICAgICAgIFJ1bkJyZWFrKFhGQV9FTEVNRU5UX092ZXJmbG93LCBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYSwNCisgICAgICAgICAgICAgICAgICAgICBwVGFyZ2V0LCBUUlVFKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKCFiQ3JlYXRlUGFnZSkgew0KKyAgICAgIHBMZWFkZXJUZW1wbGF0ZSA9DQorICAgICAgICAgIFhGQV9SZXNvbHZlQnJlYWtUYXJnZXQocENvbnRhaW5lciwgVFJVRSwgd3NPdmVyZmxvd0xlYWRlcik7DQorICAgICAgcFRyYWlsZXJUZW1wbGF0ZSA9DQorICAgICAgICAgIFhGQV9SZXNvbHZlQnJlYWtUYXJnZXQocENvbnRhaW5lciwgVFJVRSwgd3NPdmVyZmxvd1RyYWlsZXIpOw0KKyAgICB9DQorICAgIHJldHVybiBwT3ZlcmZsb3dOb2RlOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpQcm9jZXNzT3ZlcmZsb3coQ1hGQV9Ob2RlKiBwRm9ybU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqJiBwTGVhZGVyTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSomIHBUcmFpbGVyTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRhdGFNZXJnZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNyZWF0ZVBhZ2UpIHsNCisgIGlmIChwRm9ybU5vZGUgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDWEZBX05vZGUgKnBMZWFkZXJUZW1wbGF0ZSA9IE5VTEwsICpwVHJhaWxlclRlbXBsYXRlID0gTlVMTDsNCisgIEZYX0JPT0wgYklzT3ZlcmZsb3dOb2RlID0gRkFMU0U7DQorICBpZiAocEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfT3ZlcmZsb3cgfHwNCisgICAgICBwRm9ybU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9CcmVhaykgew0KKyAgICBiSXNPdmVyZmxvd05vZGUgPSBUUlVFOw0KKyAgfQ0KKyAgZm9yIChDWEZBX05vZGUqIHBDdXJOb2RlID0NCisgICAgICAgICAgIGJJc092ZXJmbG93Tm9kZSA/IHBGb3JtTm9kZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcEZvcm1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgIHBDdXJOb2RlOyBwQ3VyTm9kZSA9IHBDdXJOb2RlLT5HZXROb2RlSXRlbSgoWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkpIHsNCisgICAgaWYgKEJyZWFrT3ZlcmZsb3cocEN1ck5vZGUsIHBMZWFkZXJUZW1wbGF0ZSwgcFRyYWlsZXJUZW1wbGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgYkNyZWF0ZVBhZ2UpKSB7DQorICAgICAgaWYgKGJJc092ZXJmbG93Tm9kZSkgew0KKyAgICAgICAgcEZvcm1Ob2RlID0gcEN1ck5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgIH0NCisgICAgICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwQ3VyTm9kZS0+R2V0RG9jdW1lbnQoKTsNCisgICAgICBDWEZBX05vZGUqIHBEYXRhU2NvcGUgPSBOVUxMOw0KKyAgICAgIGlmIChwTGVhZGVyVGVtcGxhdGUpIHsNCisgICAgICAgIGlmICghcERhdGFTY29wZSkgew0KKyAgICAgICAgICBwRGF0YVNjb3BlID0gWEZBX0RhdGFNZXJnZV9GaW5kRGF0YVNjb3BlKHBGb3JtTm9kZSk7DQorICAgICAgICB9DQorICAgICAgICBwTGVhZGVyTm9kZSA9IHBEb2N1bWVudC0+RGF0YU1lcmdlX0NvcHlDb250YWluZXIoDQorICAgICAgICAgICAgcExlYWRlclRlbXBsYXRlLCBwRm9ybU5vZGUsIHBEYXRhU2NvcGUsIFRSVUUpOw0KKyAgICAgICAgcERvY3VtZW50LT5EYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucyhwTGVhZGVyTm9kZSk7DQorICAgICAgICBYRkFfU2V0TGF5b3V0R2VuZXJhdGVkTm9kZUZsYWcocExlYWRlck5vZGUpOw0KKyAgICAgIH0NCisgICAgICBpZiAocFRyYWlsZXJUZW1wbGF0ZSkgew0KKyAgICAgICAgaWYgKCFwRGF0YVNjb3BlKSB7DQorICAgICAgICAgIHBEYXRhU2NvcGUgPSBYRkFfRGF0YU1lcmdlX0ZpbmREYXRhU2NvcGUocEZvcm1Ob2RlKTsNCisgICAgICAgIH0NCisgICAgICAgIHBUcmFpbGVyTm9kZSA9IHBEb2N1bWVudC0+RGF0YU1lcmdlX0NvcHlDb250YWluZXIoDQorICAgICAgICAgICAgcFRyYWlsZXJUZW1wbGF0ZSwgcEZvcm1Ob2RlLCBwRGF0YVNjb3BlLCBUUlVFKTsNCisgICAgICAgIHBEb2N1bWVudC0+RGF0YU1lcmdlX1VwZGF0ZUJpbmRpbmdSZWxhdGlvbnMocFRyYWlsZXJOb2RlKTsNCisgICAgICAgIFhGQV9TZXRMYXlvdXRHZW5lcmF0ZWROb2RlRmxhZyhwVHJhaWxlck5vZGUpOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBpZiAoYklzT3ZlcmZsb3dOb2RlKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX0xheW91dFBhZ2VNZ3I6OlJlc29sdmVCb29rZW5kTGVhZGVyT3JUcmFpbGVyKA0KKyAgICBDWEZBX05vZGUqIHBCb29rZW5kTm9kZSwNCisgICAgRlhfQk9PTCBiTGVhZGVyLA0KKyAgICBDWEZBX05vZGUqJiBwQm9va2VuZEFwcGVuZFRlbXBsYXRlKSB7DQorICBDRlhfV2lkZVN0cmluZ0Mgd3NCb29rZW5kTGVhZGVyOw0KKyAgQ1hGQV9Ob2RlKiBwQ29udGFpbmVyID0NCisgICAgICBwQm9va2VuZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKQ0KKyAgICAgICAgICAtPkdldFRlbXBsYXRlTm9kZSgpOw0KKyAgaWYgKHBCb29rZW5kTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0JyZWFrKSB7DQorICAgIHBCb29rZW5kTm9kZS0+VHJ5Q0RhdGEoDQorICAgICAgICBiTGVhZGVyID8gWEZBX0FUVFJJQlVURV9Cb29rZW5kTGVhZGVyIDogWEZBX0FUVFJJQlVURV9Cb29rZW5kVHJhaWxlciwNCisgICAgICAgIHdzQm9va2VuZExlYWRlcik7DQorICAgIGlmICghd3NCb29rZW5kTGVhZGVyLklzRW1wdHkoKSkgew0KKyAgICAgIHBCb29rZW5kQXBwZW5kVGVtcGxhdGUgPQ0KKyAgICAgICAgICBYRkFfUmVzb2x2ZUJyZWFrVGFyZ2V0KHBDb250YWluZXIsIEZBTFNFLCB3c0Jvb2tlbmRMZWFkZXIpOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0gZWxzZSBpZiAocEJvb2tlbmROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfQm9va2VuZCkgew0KKyAgICBwQm9va2VuZE5vZGUtPlRyeUNEYXRhKA0KKyAgICAgICAgYkxlYWRlciA/IFhGQV9BVFRSSUJVVEVfTGVhZGVyIDogWEZBX0FUVFJJQlVURV9UcmFpbGVyLA0KKyAgICAgICAgd3NCb29rZW5kTGVhZGVyKTsNCisgICAgcEJvb2tlbmRBcHBlbmRUZW1wbGF0ZSA9DQorICAgICAgICBYRkFfUmVzb2x2ZUJyZWFrVGFyZ2V0KHBDb250YWluZXIsIFRSVUUsIHdzQm9va2VuZExlYWRlcik7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfTGF5b3V0UGFnZU1ncjo6RmluZFBhZ2VBcmVhRnJvbVBhZ2VTZXQoDQorICAgIENYRkFfTm9kZSogcFBhZ2VTZXQsDQorICAgIENYRkFfTm9kZSogcFN0YXJ0Q2hpbGQsDQorICAgIENYRkFfTm9kZSogcFRhcmdldFBhZ2VBcmVhLA0KKyAgICBDWEZBX05vZGUqIHBUYXJnZXRDb250ZW50QXJlYSwNCisgICAgRlhfQk9PTCBiTmV3UGFnZSwNCisgICAgRlhfQk9PTCBiUXVlcnkpIHsNCisgIGlmIChwUGFnZVNldCA9PSBOVUxMICYmIHBTdGFydENoaWxkID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKElzUGFnZVNldFJvb3RPcmRlcmVkT2NjdXJyZW5jZSgpKSB7DQorICAgIHJldHVybiBGaW5kUGFnZUFyZWFGcm9tUGFnZVNldF9PcmRlcmVkKHBQYWdlU2V0LCBwU3RhcnRDaGlsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRhcmdldFBhZ2VBcmVhLCBwVGFyZ2V0Q29udGVudEFyZWEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOZXdQYWdlLCBiUXVlcnkpOw0KKyAgfQ0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZVByZWZlcnJlZFBvc2l0aW9uID0gbV9wQ3VycmVudENvbnRhaW5lclJlY29yZA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gWEZBX0FUVFJJQlVURUVOVU1fUmVzdA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogWEZBX0FUVFJJQlVURUVOVU1fRmlyc3Q7DQorICByZXR1cm4gRmluZFBhZ2VBcmVhRnJvbVBhZ2VTZXRfU2ltcGxleER1cGxleCgNCisgICAgICBwUGFnZVNldCwgcFN0YXJ0Q2hpbGQsIHBUYXJnZXRQYWdlQXJlYSwgcFRhcmdldENvbnRlbnRBcmVhLCBiTmV3UGFnZSwNCisgICAgICBiUXVlcnksIGVQcmVmZXJyZWRQb3NpdGlvbik7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpGaW5kUGFnZUFyZWFGcm9tUGFnZVNldF9PcmRlcmVkKA0KKyAgICBDWEZBX05vZGUqIHBQYWdlU2V0LA0KKyAgICBDWEZBX05vZGUqIHBTdGFydENoaWxkLA0KKyAgICBDWEZBX05vZGUqIHBUYXJnZXRQYWdlQXJlYSwNCisgICAgQ1hGQV9Ob2RlKiBwVGFyZ2V0Q29udGVudEFyZWEsDQorICAgIEZYX0JPT0wgYk5ld1BhZ2UsDQorICAgIEZYX0JPT0wgYlF1ZXJ5KSB7DQorICBpbnQzMl90IGlQYWdlU2V0Q291bnQgPSAwOw0KKyAgaWYgKCFwU3RhcnRDaGlsZCAmJiAhYlF1ZXJ5KSB7DQorICAgIG1fcFBhZ2VTZXRNYXAuTG9va3VwKHBQYWdlU2V0LCBpUGFnZVNldENvdW50KTsNCisgICAgaW50MzJfdCBpTWF4ID0gLTE7DQorICAgIENYRkFfTm9kZSogcE9jY3VyTm9kZSA9IHBQYWdlU2V0LT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9PY2N1cik7DQorICAgIGlmIChwT2NjdXJOb2RlKSB7DQorICAgICAgcE9jY3VyTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX01heCwgaU1heCwgRkFMU0UpOw0KKyAgICB9DQorICAgIGlmIChpTWF4ID49IDAgJiYgaU1heCA8PSBpUGFnZVNldENvdW50KSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICB9DQorICBGWF9CT09MIGJSZXMgPSBGQUxTRTsNCisgIENYRkFfTm9kZSogcEN1cnJlbnROb2RlID0NCisgICAgICBwU3RhcnRDaGlsZCA/IHBTdGFydENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpDQorICAgICAgICAgICAgICAgICAgOiBwUGFnZVNldC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgZm9yICg7IHBDdXJyZW50Tm9kZTsNCisgICAgICAgcEN1cnJlbnROb2RlID0gcEN1cnJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIGlmIChwQ3VycmVudE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9QYWdlQXJlYSkgew0KKyAgICAgIGlmICgocFRhcmdldFBhZ2VBcmVhID09IHBDdXJyZW50Tm9kZSB8fCBwVGFyZ2V0UGFnZUFyZWEgPT0gTlVMTCkpIHsNCisgICAgICAgIGlmIChwQ3VycmVudE5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSA9PQ0KKyAgICAgICAgICAgIE5VTEwpIHsNCisgICAgICAgICAgaWYgKHBUYXJnZXRQYWdlQXJlYSA9PSBwQ3VycmVudE5vZGUpIHsNCisgICAgICAgICAgICBDcmVhdGVNaW5QYWdlUmVjb3JkKHBDdXJyZW50Tm9kZSwgVFJVRSk7DQorICAgICAgICAgICAgcFRhcmdldFBhZ2VBcmVhID0gTlVMTDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmICghYlF1ZXJ5KSB7DQorICAgICAgICAgIENYRkFfQ29udGFpbmVyUmVjb3JkKiBwTmV3UmVjb3JkID0NCisgICAgICAgICAgICAgIENyZWF0ZUNvbnRhaW5lclJlY29yZChwQ3VycmVudE5vZGUsIHBTdGFydENoaWxkID09IE5VTEwpOw0KKyAgICAgICAgICBBZGRQYWdlQXJlYUxheW91dEl0ZW0ocE5ld1JlY29yZCwgcEN1cnJlbnROb2RlKTsNCisgICAgICAgICAgaWYgKHBUYXJnZXRDb250ZW50QXJlYSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgcFRhcmdldENvbnRlbnRBcmVhID0NCisgICAgICAgICAgICAgICAgcEN1cnJlbnROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9Db250ZW50QXJlYSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgQWRkQ29udGVudEFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIHBUYXJnZXRDb250ZW50QXJlYSk7DQorICAgICAgICB9DQorICAgICAgICBtX3BDdXJQYWdlQXJlYSA9IHBDdXJyZW50Tm9kZTsNCisgICAgICAgIG1fbkN1clBhZ2VDb3VudCA9IDE7DQorICAgICAgICBiUmVzID0gVFJVRTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBpZiAoIWJRdWVyeSkgew0KKyAgICAgICAgQ3JlYXRlTWluUGFnZVJlY29yZChwQ3VycmVudE5vZGUsIEZBTFNFKTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAocEN1cnJlbnROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZVNldCkgew0KKyAgICAgIGlmIChGaW5kUGFnZUFyZWFGcm9tUGFnZVNldF9PcmRlcmVkKHBDdXJyZW50Tm9kZSwgTlVMTCwgcFRhcmdldFBhZ2VBcmVhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUYXJnZXRDb250ZW50QXJlYSwgYk5ld1BhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlF1ZXJ5KSkgew0KKyAgICAgICAgYlJlcyA9IFRSVUU7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgaWYgKCFiUXVlcnkpIHsNCisgICAgICAgIENyZWF0ZU1pblBhZ2VTZXRSZWNvcmQocEN1cnJlbnROb2RlLCBUUlVFKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmICghcFN0YXJ0Q2hpbGQgJiYgYlJlcyAmJiAhYlF1ZXJ5KSB7DQorICAgIG1fcFBhZ2VTZXRNYXAuU2V0QXQocFBhZ2VTZXQsICsraVBhZ2VTZXRDb3VudCk7DQorICB9DQorICByZXR1cm4gYlJlczsNCit9DQorRlhfQk9PTCBDWEZBX0xheW91dFBhZ2VNZ3I6OkZpbmRQYWdlQXJlYUZyb21QYWdlU2V0X1NpbXBsZXhEdXBsZXgoDQorICAgIENYRkFfTm9kZSogcFBhZ2VTZXQsDQorICAgIENYRkFfTm9kZSogcFN0YXJ0Q2hpbGQsDQorICAgIENYRkFfTm9kZSogcFRhcmdldFBhZ2VBcmVhLA0KKyAgICBDWEZBX05vZGUqIHBUYXJnZXRDb250ZW50QXJlYSwNCisgICAgRlhfQk9PTCBiTmV3UGFnZSwNCisgICAgRlhfQk9PTCBiUXVlcnksDQorICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVQcmVmZXJyZWRQb3NpdGlvbikgew0KKyAgY29uc3QgWEZBX0FUVFJJQlVURUVOVU0gZUZhbGxiYWNrUG9zaXRpb24gPSBYRkFfQVRUUklCVVRFRU5VTV9Bbnk7DQorICBDWEZBX05vZGUgKnBQcmVmZXJyZWRQYWdlQXJlYSA9IE5VTEwsICpwRmFsbGJhY2tQYWdlQXJlYSA9IE5VTEw7DQorICBDWEZBX05vZGUqIHBDdXJyZW50Tm9kZSA9IE5VTEw7DQorICBpZiAoIXBTdGFydENoaWxkIHx8IHBTdGFydENoaWxkLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCisgICAgcEN1cnJlbnROb2RlID0gcFBhZ2VTZXQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIH0gZWxzZSB7DQorICAgIHBDdXJyZW50Tm9kZSA9IHBTdGFydENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgfQ0KKyAgZm9yICg7IHBDdXJyZW50Tm9kZTsNCisgICAgICAgcEN1cnJlbnROb2RlID0gcEN1cnJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIGlmIChwQ3VycmVudE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9QYWdlQXJlYSkgew0KKyAgICAgIGlmICghTWF0Y2hQYWdlQXJlYU9kZE9yRXZlbihwQ3VycmVudE5vZGUsIEZBTFNFKSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVDdXJQYWdlUG9zaXRpb24gPQ0KKyAgICAgICAgICBwQ3VycmVudE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9QYWdlUG9zaXRpb24pOw0KKyAgICAgIGlmIChlUHJlZmVycmVkUG9zaXRpb24gPT0gWEZBX0FUVFJJQlVURUVOVU1fTGFzdCkgew0KKyAgICAgICAgaWYgKGVDdXJQYWdlUG9zaXRpb24gIT0gZVByZWZlcnJlZFBvc2l0aW9uKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1fZVBhZ2VTZXRNb2RlID09IFhGQV9BVFRSSUJVVEVFTlVNX1NpbXBsZXhQYWdpbmF0ZWQgfHwNCisgICAgICAgICAgICBwQ3VycmVudE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9PZGRPckV2ZW4pID09DQorICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX0FueSkgew0KKyAgICAgICAgICBwUHJlZmVycmVkUGFnZUFyZWEgPSBwQ3VycmVudE5vZGU7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQgPSBDcmVhdGVDb250YWluZXJSZWNvcmQoKTsNCisgICAgICAgIEFkZFBhZ2VBcmVhTGF5b3V0SXRlbShwTmV3UmVjb3JkLCBwQ3VycmVudE5vZGUpOw0KKyAgICAgICAgQWRkQ29udGVudEFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIHBDdXJyZW50Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSk7DQorICAgICAgICBwUHJlZmVycmVkUGFnZUFyZWEgPSBwQ3VycmVudE5vZGU7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfSBlbHNlIGlmIChlUHJlZmVycmVkUG9zaXRpb24gPT0gWEZBX0FUVFJJQlVURUVOVU1fT25seSkgew0KKyAgICAgICAgaWYgKGVDdXJQYWdlUG9zaXRpb24gIT0gZVByZWZlcnJlZFBvc2l0aW9uKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKG1fZVBhZ2VTZXRNb2RlICE9IFhGQV9BVFRSSUJVVEVFTlVNX0R1cGxleFBhZ2luYXRlZCB8fA0KKyAgICAgICAgICAgIHBDdXJyZW50Tm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX09kZE9yRXZlbikgPT0NCisgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU1fQW55KSB7DQorICAgICAgICAgIHBQcmVmZXJyZWRQYWdlQXJlYSA9IHBDdXJyZW50Tm9kZTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGlmICgocFRhcmdldFBhZ2VBcmVhID09IHBDdXJyZW50Tm9kZSB8fCBwVGFyZ2V0UGFnZUFyZWEgPT0gTlVMTCkpIHsNCisgICAgICAgIGlmIChwQ3VycmVudE5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSA9PQ0KKyAgICAgICAgICAgIE5VTEwpIHsNCisgICAgICAgICAgaWYgKHBUYXJnZXRQYWdlQXJlYSA9PSBwQ3VycmVudE5vZGUpIHsNCisgICAgICAgICAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcE5ld1JlY29yZCA9IENyZWF0ZUNvbnRhaW5lclJlY29yZCgpOw0KKyAgICAgICAgICAgIEFkZFBhZ2VBcmVhTGF5b3V0SXRlbShwTmV3UmVjb3JkLCBwQ3VycmVudE5vZGUpOw0KKyAgICAgICAgICAgIHBUYXJnZXRQYWdlQXJlYSA9IE5VTEw7DQorICAgICAgICAgIH0NCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAoKGVQcmVmZXJyZWRQb3NpdGlvbiA9PSBYRkFfQVRUUklCVVRFRU5VTV9SZXN0ICYmDQorICAgICAgICAgICAgIGVDdXJQYWdlUG9zaXRpb24gPT0gWEZBX0FUVFJJQlVURUVOVU1fQW55KSB8fA0KKyAgICAgICAgICAgIGVDdXJQYWdlUG9zaXRpb24gPT0gZVByZWZlcnJlZFBvc2l0aW9uKSB7DQorICAgICAgICAgIHBQcmVmZXJyZWRQYWdlQXJlYSA9IHBDdXJyZW50Tm9kZTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9IGVsc2UgaWYgKGVDdXJQYWdlUG9zaXRpb24gPT0gZUZhbGxiYWNrUG9zaXRpb24gJiYNCisgICAgICAgICAgICAgICAgICAgIXBGYWxsYmFja1BhZ2VBcmVhKSB7DQorICAgICAgICAgIHBGYWxsYmFja1BhZ2VBcmVhID0gcEN1cnJlbnROb2RlOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSBpZiAocFRhcmdldFBhZ2VBcmVhICYmDQorICAgICAgICAgICAgICAgICAhTWF0Y2hQYWdlQXJlYU9kZE9yRXZlbihwVGFyZ2V0UGFnZUFyZWEsIEZBTFNFKSkgew0KKyAgICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQgPSBDcmVhdGVDb250YWluZXJSZWNvcmQoKTsNCisgICAgICAgIEFkZFBhZ2VBcmVhTGF5b3V0SXRlbShwTmV3UmVjb3JkLCBwQ3VycmVudE5vZGUpOw0KKyAgICAgICAgQWRkQ29udGVudEFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIHBDdXJyZW50Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSk7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKHBDdXJyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VTZXQpIHsNCisgICAgICBpZiAoRmluZFBhZ2VBcmVhRnJvbVBhZ2VTZXRfU2ltcGxleER1cGxleCgNCisgICAgICAgICAgICAgIHBDdXJyZW50Tm9kZSwgTlVMTCwgcFRhcmdldFBhZ2VBcmVhLCBwVGFyZ2V0Q29udGVudEFyZWEsIGJOZXdQYWdlLA0KKyAgICAgICAgICAgICAgYlF1ZXJ5LCBlUHJlZmVycmVkUG9zaXRpb24pKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIENYRkFfTm9kZSogcEN1clBhZ2VBcmVhID0gTlVMTDsNCisgIGlmIChwUHJlZmVycmVkUGFnZUFyZWEpIHsNCisgICAgcEN1clBhZ2VBcmVhID0gcFByZWZlcnJlZFBhZ2VBcmVhOw0KKyAgfSBlbHNlIGlmIChwRmFsbGJhY2tQYWdlQXJlYSkgew0KKyAgICBwQ3VyUGFnZUFyZWEgPSBwRmFsbGJhY2tQYWdlQXJlYTsNCisgIH0NCisgIGlmICghcEN1clBhZ2VBcmVhKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICghYlF1ZXJ5KSB7DQorICAgIENYRkFfQ29udGFpbmVyUmVjb3JkKiBwTmV3UmVjb3JkID0gQ3JlYXRlQ29udGFpbmVyUmVjb3JkKCk7DQorICAgIEFkZFBhZ2VBcmVhTGF5b3V0SXRlbShwTmV3UmVjb3JkLCBwQ3VyUGFnZUFyZWEpOw0KKyAgICBpZiAocFRhcmdldENvbnRlbnRBcmVhID09IE5VTEwpIHsNCisgICAgICBwVGFyZ2V0Q29udGVudEFyZWEgPQ0KKyAgICAgICAgICBwQ3VyUGFnZUFyZWEtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKTsNCisgICAgfQ0KKyAgICBBZGRDb250ZW50QXJlYUxheW91dEl0ZW0ocE5ld1JlY29yZCwgcFRhcmdldENvbnRlbnRBcmVhKTsNCisgIH0NCisgIG1fcEN1clBhZ2VBcmVhID0gcEN1clBhZ2VBcmVhOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpNYXRjaFBhZ2VBcmVhT2RkT3JFdmVuKENYRkFfTm9kZSogcFBhZ2VBcmVhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkxhc3RNYXRjaCkgew0KKyAgaWYgKG1fZVBhZ2VTZXRNb2RlICE9IFhGQV9BVFRSSUJVVEVFTlVNX0R1cGxleFBhZ2luYXRlZCkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVPZGRPckV2ZW4gPSBYRkFfQVRUUklCVVRFRU5VTV9Bbnk7DQorICBwUGFnZUFyZWEtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9PZGRPckV2ZW4sIGVPZGRPckV2ZW4pOw0KKyAgaWYgKGVPZGRPckV2ZW4gIT0gWEZBX0FUVFJJQlVURUVOVU1fQW55KSB7DQorICAgIGludDMyX3QgaVBhZ2VDb3VudCA9IEdldFBhZ2VDb3VudCgpOw0KKyAgICBpZiAoYkxhc3RNYXRjaCkgew0KKyAgICAgIHJldHVybiBlT2RkT3JFdmVuID09IFhGQV9BVFRSSUJVVEVFTlVNX09kZCA/IGlQYWdlQ291bnQgJSAyID09IDENCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpUGFnZUNvdW50ICUgMiA9PSAwOw0KKyAgICB9DQorICAgIHJldHVybiBlT2RkT3JFdmVuID09IFhGQV9BVFRSSUJVVEVFTlVNX09kZCA/IGlQYWdlQ291bnQgJSAyID09IDANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaVBhZ2VDb3VudCAlIDIgPT0gMTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitDWEZBX05vZGUqIENYRkFfTGF5b3V0UGFnZU1ncjo6R2V0TmV4dEF2YWlsUGFnZUFyZWEoDQorICAgIENYRkFfTm9kZSogcFRhcmdldFBhZ2VBcmVhLA0KKyAgICBDWEZBX05vZGUqIHBUYXJnZXRDb250ZW50QXJlYSwNCisgICAgRlhfQk9PTCBiTmV3UGFnZSwNCisgICAgRlhfQk9PTCBiUXVlcnkpIHsNCisgIGlmIChtX3BDdXJQYWdlQXJlYSA9PSBOVUxMKSB7DQorICAgIEZpbmRQYWdlQXJlYUZyb21QYWdlU2V0KG1fcFRlbXBsYXRlUGFnZVNldFJvb3QsIE5VTEwsIHBUYXJnZXRQYWdlQXJlYSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRhcmdldENvbnRlbnRBcmVhLCBiTmV3UGFnZSwgYlF1ZXJ5KTsNCisgICAgQVNTRVJUKG1fcEN1clBhZ2VBcmVhKTsNCisgICAgcmV0dXJuIG1fcEN1clBhZ2VBcmVhOw0KKyAgfQ0KKyAgaWYgKHBUYXJnZXRQYWdlQXJlYSA9PSBOVUxMIHx8IHBUYXJnZXRQYWdlQXJlYSA9PSBtX3BDdXJQYWdlQXJlYSkgew0KKyAgICBpZiAoIWJOZXdQYWdlICYmIEdldE5leHRDb250ZW50QXJlYShwVGFyZ2V0Q29udGVudEFyZWEpKSB7DQorICAgICAgcmV0dXJuIG1fcEN1clBhZ2VBcmVhOw0KKyAgICB9DQorICAgIGlmIChJc1BhZ2VTZXRSb290T3JkZXJlZE9jY3VycmVuY2UoKSkgew0KKyAgICAgIGludDMyX3QgaU1heCA9IC0xOw0KKyAgICAgIENYRkFfTm9kZSogcE9jY3VyTm9kZSA9DQorICAgICAgICAgIG1fcEN1clBhZ2VBcmVhLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9PY2N1cik7DQorICAgICAgaWYgKHBPY2N1ck5vZGUpIHsNCisgICAgICAgIHBPY2N1ck5vZGUtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9NYXgsIGlNYXgsIEZBTFNFKTsNCisgICAgICB9DQorICAgICAgaWYgKChpTWF4IDwgMCB8fCBtX25DdXJQYWdlQ291bnQgPCBpTWF4KSkgew0KKyAgICAgICAgaWYgKCFiUXVlcnkpIHsNCisgICAgICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQgPQ0KKyAgICAgICAgICAgICAgQ3JlYXRlQ29udGFpbmVyUmVjb3JkKG1fcEN1clBhZ2VBcmVhKTsNCisgICAgICAgICAgQWRkUGFnZUFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIG1fcEN1clBhZ2VBcmVhKTsNCisgICAgICAgICAgaWYgKHBUYXJnZXRDb250ZW50QXJlYSA9PSBOVUxMKSB7DQorICAgICAgICAgICAgcFRhcmdldENvbnRlbnRBcmVhID0NCisgICAgICAgICAgICAgICAgbV9wQ3VyUGFnZUFyZWEtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBBZGRDb250ZW50QXJlYUxheW91dEl0ZW0ocE5ld1JlY29yZCwgcFRhcmdldENvbnRlbnRBcmVhKTsNCisgICAgICAgIH0NCisgICAgICAgIG1fbkN1clBhZ2VDb3VudCsrOw0KKyAgICAgICAgcmV0dXJuIG1fcEN1clBhZ2VBcmVhOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKCFiUXVlcnkgJiYgSXNQYWdlU2V0Um9vdE9yZGVyZWRPY2N1cnJlbmNlKCkpIHsNCisgICAgQ3JlYXRlTWluUGFnZVJlY29yZChtX3BDdXJQYWdlQXJlYSwgRkFMU0UsIFRSVUUpOw0KKyAgfQ0KKyAgaWYgKEZpbmRQYWdlQXJlYUZyb21QYWdlU2V0KG1fcEN1clBhZ2VBcmVhLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJQYWdlQXJlYSwgcFRhcmdldFBhZ2VBcmVhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUYXJnZXRDb250ZW50QXJlYSwgYk5ld1BhZ2UsIGJRdWVyeSkpIHsNCisgICAgcmV0dXJuIG1fcEN1clBhZ2VBcmVhOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwUGFnZVNldCA9IG1fcEN1clBhZ2VBcmVhLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgIHdoaWxlIChUUlVFKSB7DQorICAgIGlmIChGaW5kUGFnZUFyZWFGcm9tUGFnZVNldChwUGFnZVNldCwgTlVMTCwgcFRhcmdldFBhZ2VBcmVhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRhcmdldENvbnRlbnRBcmVhLCBiTmV3UGFnZSwgYlF1ZXJ5KSkgew0KKyAgICAgIHJldHVybiBtX3BDdXJQYWdlQXJlYTsNCisgICAgfQ0KKyAgICBpZiAoIWJRdWVyeSAmJiBJc1BhZ2VTZXRSb290T3JkZXJlZE9jY3VycmVuY2UoKSkgew0KKyAgICAgIENyZWF0ZU1pblBhZ2VTZXRSZWNvcmQocFBhZ2VTZXQpOw0KKyAgICB9DQorICAgIGlmIChGaW5kUGFnZUFyZWFGcm9tUGFnZVNldChOVUxMLCBwUGFnZVNldCwgcFRhcmdldFBhZ2VBcmVhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRhcmdldENvbnRlbnRBcmVhLCBiTmV3UGFnZSwgYlF1ZXJ5KSkgew0KKyAgICAgIHJldHVybiBtX3BDdXJQYWdlQXJlYTsNCisgICAgfQ0KKyAgICBpZiAocFBhZ2VTZXQgPT0gbV9wVGVtcGxhdGVQYWdlU2V0Um9vdCkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHBQYWdlU2V0ID0gcFBhZ2VTZXQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK3N0YXRpYyBGWF9CT09MIFhGQV9MYXlvdXRQYWdlTWdyX0NoZWNrQ29udGVudEFyZWFOb3RVc2VkKA0KKyAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIHBQYWdlQXJlYUxheW91dEl0ZW0sDQorICAgIENYRkFfTm9kZSogcENvbnRlbnRBcmVhLA0KKyAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qJiBwQ29udGVudEFyZWFMYXlvdXRJdGVtKSB7DQorICBmb3IgKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcExheW91dEl0ZW0gPQ0KKyAgICAgICAgICAgKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSopcFBhZ2VBcmVhTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsNCisgICAgICAgcExheW91dEl0ZW07DQorICAgICAgIHBMYXlvdXRJdGVtID0gKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSopcExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nKSB7DQorICAgIGlmIChwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUgPT0gcENvbnRlbnRBcmVhKSB7DQorICAgICAgaWYgKHBMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkID09IE5VTEwpIHsNCisgICAgICAgIHBDb250ZW50QXJlYUxheW91dEl0ZW0gPSBwTGF5b3V0SXRlbTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTGF5b3V0UGFnZU1ncjo6R2V0TmV4dENvbnRlbnRBcmVhKENYRkFfTm9kZSogcENvbnRlbnRBcmVhKSB7DQorICBDWEZBX05vZGUqIHBDdXJDb250ZW50Tm9kZSA9DQorICAgICAgR2V0Q3VycmVudENvbnRhaW5lclJlY29yZCgpLT5wQ3VyQ29udGVudEFyZWEtPm1fcEZvcm1Ob2RlOw0KKyAgaWYgKHBDb250ZW50QXJlYSA9PSBOVUxMKSB7DQorICAgIHBDb250ZW50QXJlYSA9DQorICAgICAgICBwQ3VyQ29udGVudE5vZGUtPkdldE5leHRTYW1lQ2xhc3NTaWJsaW5nKFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKTsNCisgICAgaWYgKHBDb250ZW50QXJlYSA9PSBOVUxMKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBpZiAocENvbnRlbnRBcmVhLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSAhPSBtX3BDdXJQYWdlQXJlYSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIHBDb250ZW50QXJlYUxheW91dCA9IE5VTEw7DQorICAgIGlmICghWEZBX0xheW91dFBhZ2VNZ3JfQ2hlY2tDb250ZW50QXJlYU5vdFVzZWQoDQorICAgICAgICAgICAgR2V0Q3VycmVudENvbnRhaW5lclJlY29yZCgpLT5wQ3VyUGFnZUFyZWEsIHBDb250ZW50QXJlYSwNCisgICAgICAgICAgICBwQ29udGVudEFyZWFMYXlvdXQpKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChwQ29udGVudEFyZWFMYXlvdXQpIHsNCisgICAgICBpZiAocENvbnRlbnRBcmVhTGF5b3V0LT5tX3BGb3JtTm9kZSAhPSBwQ3VyQ29udGVudE5vZGUpIHsNCisgICAgICAgIENYRkFfQ29udGFpbmVyUmVjb3JkKiBwTmV3UmVjb3JkID0gQ3JlYXRlQ29udGFpbmVyUmVjb3JkKCk7DQorICAgICAgICBwTmV3UmVjb3JkLT5wQ3VyQ29udGVudEFyZWEgPSBwQ29udGVudEFyZWFMYXlvdXQ7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQgPSBDcmVhdGVDb250YWluZXJSZWNvcmQoKTsNCisgIEFkZENvbnRlbnRBcmVhTGF5b3V0SXRlbShwTmV3UmVjb3JkLCBwQ29udGVudEFyZWEpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK3ZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpJbml0UGFnZVNldE1hcCgpIHsNCisgIGlmICghSXNQYWdlU2V0Um9vdE9yZGVyZWRPY2N1cnJlbmNlKCkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlSXRlcmF0b3Igc0l0ZXJhdG9yKG1fcFRlbXBsYXRlUGFnZVNldFJvb3QpOw0KKyAgZm9yIChDWEZBX05vZGUqIHBQYWdlU2V0Tm9kZSA9IHNJdGVyYXRvci5HZXRDdXJyZW50KCk7IHBQYWdlU2V0Tm9kZTsNCisgICAgICAgcFBhZ2VTZXROb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICBpZiAocFBhZ2VTZXROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZVNldCkgew0KKyAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVSZWxhdGlvbiA9DQorICAgICAgICAgIHBQYWdlU2V0Tm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1JlbGF0aW9uKTsNCisgICAgICBpZiAoZVJlbGF0aW9uID09IFhGQV9BVFRSSUJVVEVFTlVNX09yZGVyZWRPY2N1cnJlbmNlKSB7DQorICAgICAgICBtX3BQYWdlU2V0TWFwLlNldEF0KHBQYWdlU2V0Tm9kZSwgMCk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KK2ludDMyX3QgQ1hGQV9MYXlvdXRQYWdlTWdyOjpDcmVhdGVNaW5QYWdlUmVjb3JkKENYRkFfTm9kZSogcFBhZ2VBcmVhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlRhcmdldFBhZ2VBcmVhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkNyZWF0ZUxhc3QpIHsNCisgIGlmIChwUGFnZUFyZWEgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIENYRkFfTm9kZSogcE9jY3VyTm9kZSA9IHBQYWdlQXJlYS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfT2NjdXIpOw0KKyAgaW50MzJfdCBpTWluID0gMDsNCisgIGlmICgocE9jY3VyTm9kZSAmJiBwT2NjdXJOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWluLCBpTWluLCBGQUxTRSkpIHx8DQorICAgICAgYlRhcmdldFBhZ2VBcmVhKSB7DQorICAgIENYRkFfTm9kZSogcENvbnRlbnRBcmVhID0NCisgICAgICAgIHBQYWdlQXJlYS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpOw0KKyAgICBpZiAoaU1pbiA8IDEgJiYgYlRhcmdldFBhZ2VBcmVhICYmICFwQ29udGVudEFyZWEpIHsNCisgICAgICBpTWluID0gMTsNCisgICAgfQ0KKyAgICBpbnQzMl90IGkgPSAwOw0KKyAgICBpZiAoYkNyZWF0ZUxhc3QpIHsNCisgICAgICBpID0gbV9uQ3VyUGFnZUNvdW50Ow0KKyAgICB9DQorICAgIGZvciAoOyBpIDwgaU1pbjsgaSsrKSB7DQorICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQgPSBDcmVhdGVDb250YWluZXJSZWNvcmQoKTsNCisgICAgICBBZGRQYWdlQXJlYUxheW91dEl0ZW0ocE5ld1JlY29yZCwgcFBhZ2VBcmVhKTsNCisgICAgICBBZGRDb250ZW50QXJlYUxheW91dEl0ZW0ocE5ld1JlY29yZCwgcENvbnRlbnRBcmVhKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGlNaW47DQorfQ0KK3ZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpDcmVhdGVNaW5QYWdlU2V0UmVjb3JkKENYRkFfTm9kZSogcFBhZ2VTZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ3JlYXRlQWxsKSB7DQorICBpZiAocFBhZ2VTZXQgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlDdXJTZXRDb3VudCA9IDA7DQorICBpZiAoIW1fcFBhZ2VTZXRNYXAuTG9va3VwKHBQYWdlU2V0LCBpQ3VyU2V0Q291bnQpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChiQ3JlYXRlQWxsKSB7DQorICAgIGlDdXJTZXRDb3VudCA9IDA7DQorICB9DQorICBDWEZBX05vZGUqIHBPY2N1ck5vZGUgPSBwUGFnZVNldC0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfT2NjdXIpOw0KKyAgaW50MzJfdCBpTWluID0gMDsNCisgIGlmIChwT2NjdXJOb2RlICYmIHBPY2N1ck5vZGUtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9NaW4sIGlNaW4sIEZBTFNFKSkgew0KKyAgICBpZiAoaUN1clNldENvdW50IDwgaU1pbikgew0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlNaW4gLSBpQ3VyU2V0Q291bnQ7IGkrKykgew0KKyAgICAgICAgZm9yIChDWEZBX05vZGUqIHBDdXJyZW50UGFnZU5vZGUgPQ0KKyAgICAgICAgICAgICAgICAgcFBhZ2VTZXQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICAgICAgcEN1cnJlbnRQYWdlTm9kZTsgcEN1cnJlbnRQYWdlTm9kZSA9IHBDdXJyZW50UGFnZU5vZGUtPkdldE5vZGVJdGVtKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgICAgICBpZiAocEN1cnJlbnRQYWdlTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VBcmVhKSB7DQorICAgICAgICAgICAgQ3JlYXRlTWluUGFnZVJlY29yZChwQ3VycmVudFBhZ2VOb2RlLCBGQUxTRSk7DQorICAgICAgICAgIH0gZWxzZSBpZiAocEN1cnJlbnRQYWdlTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VTZXQpIHsNCisgICAgICAgICAgICBDcmVhdGVNaW5QYWdlU2V0UmVjb3JkKHBDdXJyZW50UGFnZU5vZGUsIFRSVUUpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIG1fcFBhZ2VTZXRNYXAuU2V0QXQocFBhZ2VTZXQsIGlNaW4pOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpDcmVhdGVOZXh0TWluUmVjb3JkKENYRkFfTm9kZSogcFJlY29yZE5vZGUpIHsNCisgIGlmIChwUmVjb3JkTm9kZSA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGZvciAoQ1hGQV9Ob2RlKiBwQ3VycmVudE5vZGUgPQ0KKyAgICAgICAgICAgcFJlY29yZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgIHBDdXJyZW50Tm9kZTsNCisgICAgICAgcEN1cnJlbnROb2RlID0gcEN1cnJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIGlmIChwQ3VycmVudE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9QYWdlQXJlYSkgew0KKyAgICAgIENyZWF0ZU1pblBhZ2VSZWNvcmQocEN1cnJlbnROb2RlLCBGQUxTRSk7DQorICAgIH0gZWxzZSBpZiAocEN1cnJlbnROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZVNldCkgew0KKyAgICAgIENyZWF0ZU1pblBhZ2VTZXRSZWNvcmQocEN1cnJlbnROb2RlLCBUUlVFKTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6UHJvY2Vzc0xhc3RQYWdlU2V0KCkgew0KKyAgQ3JlYXRlTWluUGFnZVJlY29yZChtX3BDdXJQYWdlQXJlYSwgRkFMU0UsIFRSVUUpOw0KKyAgQ3JlYXRlTmV4dE1pblJlY29yZChtX3BDdXJQYWdlQXJlYSk7DQorICBDWEZBX05vZGUqIHBQYWdlU2V0ID0gbV9wQ3VyUGFnZUFyZWEtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgd2hpbGUgKFRSVUUpIHsNCisgICAgQ3JlYXRlTWluUGFnZVNldFJlY29yZChwUGFnZVNldCk7DQorICAgIGlmIChwUGFnZVNldCA9PSBtX3BUZW1wbGF0ZVBhZ2VTZXRSb290KSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgQ3JlYXRlTmV4dE1pblJlY29yZChwUGFnZVNldCk7DQorICAgIHBQYWdlU2V0ID0gcFBhZ2VTZXQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgfQ0KK30NCitGWF9CT09MIENYRkFfTGF5b3V0UGFnZU1ncjo6R2V0TmV4dEF2YWlsQ29udGVudEhlaWdodChGWF9GTE9BVCBmQ2hpbGRIZWlnaHQpIHsNCisgIENYRkFfTm9kZSogcEN1ckNvbnRlbnROb2RlID0NCisgICAgICBHZXRDdXJyZW50Q29udGFpbmVyUmVjb3JkKCktPnBDdXJDb250ZW50QXJlYS0+bV9wRm9ybU5vZGU7DQorICBpZiAocEN1ckNvbnRlbnROb2RlID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcEN1ckNvbnRlbnROb2RlID0NCisgICAgICBwQ3VyQ29udGVudE5vZGUtPkdldE5leHRTYW1lQ2xhc3NTaWJsaW5nKFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKTsNCisgIGlmIChwQ3VyQ29udGVudE5vZGUpIHsNCisgICAgRlhfRkxPQVQgZk5leHRDb250ZW50SGVpZ2h0ID0NCisgICAgICAgIHBDdXJDb250ZW50Tm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0gpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgIHJldHVybiBmTmV4dENvbnRlbnRIZWlnaHQgPiBmQ2hpbGRIZWlnaHQ7DQorICB9DQorICBDWEZBX05vZGUqIHBQYWdlTm9kZSA9IEdldEN1cnJlbnRDb250YWluZXJSZWNvcmQoKS0+cEN1clBhZ2VBcmVhLT5tX3BGb3JtTm9kZTsNCisgIENYRkFfTm9kZSogcE9jY3VyTm9kZSA9IHBQYWdlTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfT2NjdXIpOw0KKyAgaW50MzJfdCBpTWF4ID0gMDsNCisgIGlmIChwT2NjdXJOb2RlICYmIHBPY2N1ck5vZGUtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9NYXgsIGlNYXgsIEZBTFNFKSkgew0KKyAgICBpZiAobV9uQ3VyUGFnZUNvdW50ID09IGlNYXgpIHsNCisgICAgICBDWEZBX05vZGUqIHBTcmNQYWdlID0gbV9wQ3VyUGFnZUFyZWE7DQorICAgICAgaW50MzJfdCBuU3JjUGFnZUNvdW50ID0gbV9uQ3VyUGFnZUNvdW50Ow0KKyAgICAgIEZYX1BPU0lUSU9OIHBzU3JjUmVjb3JkID0gbV9yZ1Byb3Bvc2VkQ29udGFpbmVyUmVjb3JkLkdldFRhaWxQb3NpdGlvbigpOw0KKyAgICAgIENYRkFfTm9kZSogcE5leHRQYWdlID0gR2V0TmV4dEF2YWlsUGFnZUFyZWEoTlVMTCwgTlVMTCwgRkFMU0UsIFRSVUUpOw0KKyAgICAgIG1fcEN1clBhZ2VBcmVhID0gcFNyY1BhZ2U7DQorICAgICAgbV9uQ3VyUGFnZUNvdW50ID0gblNyY1BhZ2VDb3VudDsNCisgICAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcFByZXZSZWNvcmQgPQ0KKyAgICAgICAgICAoQ1hGQV9Db250YWluZXJSZWNvcmQqKW1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5HZXROZXh0KA0KKyAgICAgICAgICAgICAgcHNTcmNSZWNvcmQpOw0KKyAgICAgIHdoaWxlIChwc1NyY1JlY29yZCkgew0KKyAgICAgICAgRlhfUE9TSVRJT04gcHNTYXZlUmVjb3JkID0gcHNTcmNSZWNvcmQ7DQorICAgICAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcEluc2VydFJlY29yZCA9DQorICAgICAgICAgICAgKENYRkFfQ29udGFpbmVyUmVjb3JkKiltX3JnUHJvcG9zZWRDb250YWluZXJSZWNvcmQuR2V0TmV4dCgNCisgICAgICAgICAgICAgICAgcHNTcmNSZWNvcmQpOw0KKyAgICAgICAgUmVtb3ZlTGF5b3V0UmVjb3JkKHBJbnNlcnRSZWNvcmQsIHBQcmV2UmVjb3JkKTsNCisgICAgICAgIGRlbGV0ZSBwSW5zZXJ0UmVjb3JkOw0KKyAgICAgICAgbV9yZ1Byb3Bvc2VkQ29udGFpbmVyUmVjb3JkLlJlbW92ZUF0KHBzU2F2ZVJlY29yZCk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwTmV4dFBhZ2UpIHsNCisgICAgICAgIENYRkFfTm9kZSogcENvbnRlbnRBcmVhID0NCisgICAgICAgICAgICBwTmV4dFBhZ2UtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKTsNCisgICAgICAgIGlmIChwQ29udGVudEFyZWEpIHsNCisgICAgICAgICAgRlhfRkxPQVQgZk5leHRDb250ZW50SGVpZ2h0ID0NCisgICAgICAgICAgICAgIHBDb250ZW50QXJlYS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0gpLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorICAgICAgICAgIGlmIChmTmV4dENvbnRlbnRIZWlnaHQgPiBmQ2hpbGRIZWlnaHQpIHsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgIH0NCisgIENYRkFfTm9kZSogcENvbnRlbnRBcmVhID0NCisgICAgICBwUGFnZU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKTsNCisgIEZYX0ZMT0FUIGZOZXh0Q29udGVudEhlaWdodCA9DQorICAgICAgcENvbnRlbnRBcmVhLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfSCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgIGlmIChmTmV4dENvbnRlbnRIZWlnaHQgPCBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIGlmIChmTmV4dENvbnRlbnRIZWlnaHQgPiBmQ2hpbGRIZWlnaHQpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpDbGVhckRhdGEoKSB7DQorICBDbGVhclJlY29yZExpc3QoKTsNCit9DQordm9pZCBDWEZBX0xheW91dFBhZ2VNZ3I6OkNsZWFyUmVjb3JkTGlzdCgpIHsNCisgIGlmICghbV9wVGVtcGxhdGVQYWdlU2V0Um9vdCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAobV9yZ1Byb3Bvc2VkQ29udGFpbmVyUmVjb3JkLkdldENvdW50KCkgPiAwKSB7DQorICAgIEZYX1BPU0lUSU9OIHNQb3M7DQorICAgIHNQb3MgPSBtX3JnUHJvcG9zZWRDb250YWluZXJSZWNvcmQuR2V0SGVhZFBvc2l0aW9uKCk7DQorICAgIHdoaWxlIChzUG9zKSB7DQorICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBSZWNvcmQgPQ0KKyAgICAgICAgICAoQ1hGQV9Db250YWluZXJSZWNvcmQqKW1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5HZXROZXh0KHNQb3MpOw0KKyAgICAgIGRlbGV0ZSBwUmVjb3JkOw0KKyAgICB9DQorICAgIG1fcmdQcm9wb3NlZENvbnRhaW5lclJlY29yZC5SZW1vdmVBbGwoKTsNCisgIH0NCisgIG1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQgPSBOVUxMOw0KKyAgbV9wQ3VyUGFnZUFyZWEgPSBOVUxMOw0KKyAgbV9uQ3VyUGFnZUNvdW50ID0gMDsNCisgIG1fYkNyZWF0ZU92ZXJGbG93UGFnZSA9IEZBTFNFOw0KKyAgbV9wUGFnZVNldE1hcC5SZW1vdmVBbGwoKTsNCit9DQorQ1hGQV9MYXlvdXRJdGVtKiBDWEZBX0xheW91dFBhZ2VNZ3I6OkZpbmRPckNyZWF0ZUxheW91dEl0ZW0oDQorICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlKSB7DQorI2lmIGRlZmluZWQoX1hGQV9MQVlPVVRJVEVNX01BUENBQ0hFXykNCisgIGlmIChtX05vZGVUb0NvbnRlbnQuR2V0Q291bnQoKSA+IDApIHsNCisgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcExheW91dEl0ZW0gPSBOVUxMOw0KKyAgICBpZiAobV9Ob2RlVG9Db250ZW50Lkxvb2t1cChwRm9ybU5vZGUsICh2b2lkKiYpcExheW91dEl0ZW0pKSB7DQorICAgICAgaWYgKHBMYXlvdXRJdGVtLT5tX3BOZXh0KSB7DQorICAgICAgICBtX05vZGVUb0NvbnRlbnQuU2V0QXQocEZvcm1Ob2RlLCBwTGF5b3V0SXRlbS0+bV9wTmV4dCk7DQorICAgICAgICBwTGF5b3V0SXRlbS0+bV9wTmV4dC0+bV9wUHJldiA9IE5VTEw7DQorICAgICAgICBwTGF5b3V0SXRlbS0+bV9wTmV4dCA9IE5VTEw7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIG1fTm9kZVRvQ29udGVudC5SZW1vdmVLZXkocEZvcm1Ob2RlKTsNCisgICAgICB9DQorICAgICAgcExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlID0gcEZvcm1Ob2RlOw0KKyAgICAgIHJldHVybiBwTGF5b3V0SXRlbTsNCisgICAgfQ0KKyAgfQ0KKyNlbmRpZg0KKyAgcmV0dXJuIChDWEZBX0xheW91dEl0ZW0qKXBGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKQ0KKyAgICAgIC0+R2V0UGFyc2VyKCkNCisgICAgICAtPkdldE5vdGlmeSgpDQorICAgICAgLT5PbkNyZWF0ZUxheW91dEl0ZW0ocEZvcm1Ob2RlKTsNCit9DQorI2lmIGRlZmluZWQoX1hGQV9MQVlPVVRJVEVNX01BUENBQ0hFXykNCit2b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6U2F2ZUxheW91dEl0ZW0oQ1hGQV9MYXlvdXRJdGVtKiBwUGFyZW50TGF5b3V0SXRlbSkgew0KKyAgQ1hGQV9MYXlvdXRJdGVtKiBwTmV4dExheW91dEl0ZW0sDQorICAgICAgKiBwQ3VyTGF5b3V0SXRlbSA9IHBQYXJlbnRMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOw0KKyAgd2hpbGUgKHBDdXJMYXlvdXRJdGVtKSB7DQorICAgIHBOZXh0TGF5b3V0SXRlbSA9IHBDdXJMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgICAgaWYgKHBDdXJMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkKSB7DQorICAgICAgU2F2ZUxheW91dEl0ZW0ocEN1ckxheW91dEl0ZW0pOw0KKyAgICB9DQorICAgIGlmIChwQ3VyTGF5b3V0SXRlbS0+SXNDb250ZW50TGF5b3V0SXRlbSgpKSB7DQorICAgICAgaWYgKG1fTm9kZVRvQ29udGVudC5HZXRWYWx1ZUF0KHBDdXJMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSkgPT0gTlVMTCkgew0KKyAgICAgICAgcEN1ckxheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5TZXRVc2VyRGF0YShYRkFfTEFZT1VUSVRFTUtFWSwgTlVMTCk7DQorICAgICAgICBtX05vZGVUb0NvbnRlbnQuU2V0QXQocEN1ckxheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLCBwQ3VyTGF5b3V0SXRlbSk7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKHBDdXJMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpICE9DQorICAgICAgICAgICAgICAgWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCisgICAgICBkZWxldGUgcEN1ckxheW91dEl0ZW07DQorICAgICAgcEN1ckxheW91dEl0ZW0gPSBOVUxMOw0KKyAgICB9DQorICAgIGlmIChwQ3VyTGF5b3V0SXRlbSkgew0KKyAgICAgIHBDdXJMYXlvdXRJdGVtLT5tX3BQYXJlbnQgPSBOVUxMOw0KKyAgICAgIHBDdXJMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZyA9IE5VTEw7DQorICAgICAgcEN1ckxheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQgPSBOVUxMOw0KKyAgICB9DQorICAgIHBDdXJMYXlvdXRJdGVtID0gcE5leHRMYXlvdXRJdGVtOw0KKyAgfQ0KK30NCisjZWxpZiBkZWZpbmVkKF9YRkFfTEFZT1VUSVRFTV9Qcm9jZXNzQ0FDSEVfKQ0KK3N0YXRpYyB2b2lkIFhGQV9TeW5jUmVtb3ZlTGF5b3V0SXRlbShDWEZBX0xheW91dEl0ZW0qIHBQYXJlbnRMYXlvdXRJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEZBX05vdGlmeSogcE5vdGlmeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVhGQV9Eb2NMYXlvdXQqIHBEb2NMYXlvdXQpIHsNCisgIENYRkFfTGF5b3V0SXRlbSogcE5leHRMYXlvdXRJdGVtOw0KKyAgQ1hGQV9MYXlvdXRJdGVtKiBwQ3VyTGF5b3V0SXRlbSA9IHBQYXJlbnRMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOw0KKyAgd2hpbGUgKHBDdXJMYXlvdXRJdGVtKSB7DQorICAgIHBOZXh0TGF5b3V0SXRlbSA9IHBDdXJMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsNCisgICAgaWYgKHBDdXJMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkKSB7DQorICAgICAgWEZBX1N5bmNSZW1vdmVMYXlvdXRJdGVtKHBDdXJMYXlvdXRJdGVtLCBwTm90aWZ5LCBwRG9jTGF5b3V0KTsNCisgICAgfQ0KKyAgICBwTm90aWZ5LT5PbkxheW91dEV2ZW50KHBEb2NMYXlvdXQsIHBDdXJMYXlvdXRJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MQVlPVVRFVkVOVF9JdGVtUmVtb3ZpbmcpOw0KKyAgICBkZWxldGUgcEN1ckxheW91dEl0ZW07DQorICAgIHBDdXJMYXlvdXRJdGVtID0gcE5leHRMYXlvdXRJdGVtOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6U2F2ZUxheW91dEl0ZW0oQ1hGQV9MYXlvdXRJdGVtKiBwUGFyZW50TGF5b3V0SXRlbSkgew0KKyAgQ1hGQV9MYXlvdXRJdGVtKiBwTmV4dExheW91dEl0ZW07DQorICBDWEZBX0xheW91dEl0ZW0qIHBDdXJMYXlvdXRJdGVtID0gcFBhcmVudExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQorICB3aGlsZSAocEN1ckxheW91dEl0ZW0pIHsNCisgICAgcE5leHRMYXlvdXRJdGVtID0gcEN1ckxheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KKyAgICBpZiAocEN1ckxheW91dEl0ZW0tPklzQ29udGVudExheW91dEl0ZW0oKSkgew0KKyAgICAgIEZYX0RXT1JEIGR3RmxhZyA9IHBDdXJMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RmxhZygpOw0KKyAgICAgIGlmIChkd0ZsYWcgJiAoWEZBX05PREVGTEFHX0hhc1JlbW92ZWQpKSB7DQorICAgICAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9DQorICAgICAgICAgICAgbV9wVGVtcGxhdGVQYWdlU2V0Um9vdC0+R2V0RG9jdW1lbnQoKS0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICAgICAgSVhGQV9Eb2NMYXlvdXQqIHBEb2NMYXlvdXQgPQ0KKyAgICAgICAgICAgIG1fcFRlbXBsYXRlUGFnZVNldFJvb3QtPkdldERvY3VtZW50KCktPkdldERvY0xheW91dCgpOw0KKyAgICAgICAgaWYgKHBDdXJMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkKSB7DQorICAgICAgICAgIFhGQV9TeW5jUmVtb3ZlTGF5b3V0SXRlbShwQ3VyTGF5b3V0SXRlbSwgcE5vdGlmeSwgcERvY0xheW91dCk7DQorICAgICAgICB9DQorICAgICAgICBwTm90aWZ5LT5PbkxheW91dEV2ZW50KHBEb2NMYXlvdXQsIHBDdXJMYXlvdXRJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTEFZT1VURVZFTlRfSXRlbVJlbW92aW5nKTsNCisgICAgICAgIGRlbGV0ZSBwQ3VyTGF5b3V0SXRlbTsNCisgICAgICAgIHBDdXJMYXlvdXRJdGVtID0gcE5leHRMYXlvdXRJdGVtOw0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmIChkd0ZsYWcgJiBYRkFfTk9ERUZMQUdfTGF5b3V0R2VuZXJhdGVkTm9kZSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFOb2RlPg0KKyAgICAgICAgICAgIHNJdGVyYXRvcihwQ3VyTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUpOw0KKyAgICAgICAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcE5vZGU7DQorICAgICAgICAgICAgIHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICAgICAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfVW51c2VkTm9kZSwgVFJVRSwgRkFMU0UpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAocEN1ckxheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQpIHsNCisgICAgICBTYXZlTGF5b3V0SXRlbShwQ3VyTGF5b3V0SXRlbSk7DQorICAgIH0NCisgICAgcEN1ckxheW91dEl0ZW0tPm1fcFBhcmVudCA9IE5VTEw7DQorICAgIHBDdXJMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZyA9IE5VTEw7DQorICAgIHBDdXJMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkID0gTlVMTDsNCisgICAgaWYgKCFwQ3VyTGF5b3V0SXRlbS0+SXNDb250ZW50TGF5b3V0SXRlbSgpICYmDQorICAgICAgICBwQ3VyTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9QYWdlQXJlYSkgew0KKyAgICAgIGRlbGV0ZSBwQ3VyTGF5b3V0SXRlbTsNCisgICAgfQ0KKyAgICBwQ3VyTGF5b3V0SXRlbSA9IHBOZXh0TGF5b3V0SXRlbTsNCisgIH0NCit9DQorI2VuZGlmDQorQ1hGQV9Ob2RlKiBDWEZBX0xheW91dFBhZ2VNZ3I6OlF1ZXJ5T3ZlcmZsb3coDQorICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlLA0KKyAgICBDWEZBX0xheW91dENvbnRleHQqIHBMYXlvdXRDb250ZXh0KSB7DQorICBmb3IgKENYRkFfTm9kZSogcEN1ck5vZGUgPSBwRm9ybU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgcEN1ck5vZGU7IHBDdXJOb2RlID0gcEN1ck5vZGUtPkdldE5vZGVJdGVtKChYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSkgew0KKyAgICBpZiAocEN1ck5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9CcmVhaykgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nQyB3c092ZXJmbG93TGVhZGVyOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nQyB3c092ZXJmbG93VGFyZ2V0Ow0KKyAgICAgIENGWF9XaWRlU3RyaW5nQyB3c092ZXJmbG93VHJhaWxlcjsNCisgICAgICBwQ3VyTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9PdmVyZmxvd0xlYWRlciwgd3NPdmVyZmxvd0xlYWRlcik7DQorICAgICAgcEN1ck5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfT3ZlcmZsb3dUcmFpbGVyLCB3c092ZXJmbG93VHJhaWxlcik7DQorICAgICAgcEN1ck5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfT3ZlcmZsb3dUYXJnZXQsIHdzT3ZlcmZsb3dUYXJnZXQpOw0KKyAgICAgIGlmICghd3NPdmVyZmxvd0xlYWRlci5Jc0VtcHR5KCkgfHwgIXdzT3ZlcmZsb3dUcmFpbGVyLklzRW1wdHkoKSB8fA0KKyAgICAgICAgICAhd3NPdmVyZmxvd1RhcmdldC5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHJldHVybiBwQ3VyTm9kZTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0gZWxzZSBpZiAocEN1ck5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9PdmVyZmxvdykgew0KKyAgICAgIHJldHVybiBwQ3VyTm9kZTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK3ZvaWQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpNZXJnZVBhZ2VTZXRDb250ZW50cygpIHsNCisgIENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IG1fcFRlbXBsYXRlUGFnZVNldFJvb3QtPkdldERvY3VtZW50KCk7DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IHBEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgSVhGQV9Eb2NMYXlvdXQqIHBEb2NMYXlvdXQgPSBwRG9jdW1lbnQtPkdldERvY0xheW91dCgpOw0KKyAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwUm9vdExheW91dCA9IHRoaXMtPkdldFJvb3RMYXlvdXRJdGVtKCk7DQorICB7DQorICAgIGZvciAoaW50MzJfdCBpSW5kZXggPSAwOyBpSW5kZXggPCBwRG9jdW1lbnQtPm1fcFBlbmRpbmdQYWdlU2V0LkdldFNpemUoKTsNCisgICAgICAgICBpSW5kZXgrKykgew0KKyAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBTm9kZT4NCisgICAgICAgICAgc0l0ZXJhdG9yKHBEb2N1bWVudC0+bV9wUGVuZGluZ1BhZ2VTZXQuR2V0QXQoaUluZGV4KSk7DQorICAgICAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcE5vZGU7DQorICAgICAgICAgICBwTm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgICAgIGlmIChwTm9kZS0+SXNDb250YWluZXJOb2RlKCkpIHsNCisgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmluZE5vZGUgPSBwTm9kZS0+R2V0QmluZERhdGEoKTsNCisgICAgICAgICAgaWYgKHBCaW5kTm9kZSkgew0KKyAgICAgICAgICAgIHBCaW5kTm9kZS0+UmVtb3ZlQmluZEl0ZW0ocE5vZGUpOw0KKyAgICAgICAgICAgIHBOb2RlLT5TZXRPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSwgTlVMTCk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHBOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19VbnVzZWROb2RlKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGludDMyX3QgaUluZGV4ID0gMDsNCisgIENYRkFfTm9kZSogcFBlbmRpbmdQYWdlU2V0ID0gTlVMTDsNCisgIGZvciAoOyBwUm9vdExheW91dDsNCisgICAgICAgcFJvb3RMYXlvdXQgPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKilwUm9vdExheW91dC0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgcFBlbmRpbmdQYWdlU2V0ID0gTlVMTDsNCisgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTwNCisgICAgICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSwNCisgICAgICAgIENYRkFfVHJhdmVyc2VTdHJhdGVneV9Db250ZW50QXJlYUNvbnRhaW5lckxheW91dEl0ZW0+DQorICAgICAgICBpdGVyYXRvcihwUm9vdExheW91dCk7DQorICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcFJvb3RQYWdlU2V0Q29udGFpbmVySXRlbSA9IGl0ZXJhdG9yLkdldEN1cnJlbnQoKTsNCisgICAgQVNTRVJUKHBSb290UGFnZVNldENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgPT0NCisgICAgICAgICAgIFhGQV9FTEVNRU5UX1BhZ2VTZXQpOw0KKyAgICBpZiAoaUluZGV4IDwgcERvY3VtZW50LT5tX3BQZW5kaW5nUGFnZVNldC5HZXRTaXplKCkpIHsNCisgICAgICBwUGVuZGluZ1BhZ2VTZXQgPSBwRG9jdW1lbnQtPm1fcFBlbmRpbmdQYWdlU2V0LkdldEF0KGlJbmRleCk7DQorICAgICAgaUluZGV4Kys7DQorICAgIH0NCisgICAgaWYgKCFwUGVuZGluZ1BhZ2VTZXQpIHsNCisgICAgICBpZiAocFJvb3RQYWdlU2V0Q29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUtPkdldFBhY2tldElEKCkgPT0NCisgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSkgew0KKyAgICAgICAgcFBlbmRpbmdQYWdlU2V0ID0NCisgICAgICAgICAgICBwUm9vdFBhZ2VTZXRDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZS0+Q2xvbmVUZW1wbGF0ZVRvRm9ybShGQUxTRSk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHBQZW5kaW5nUGFnZVNldCA9IHBSb290UGFnZVNldENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAocFJvb3RQYWdlU2V0Q29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUtPkdldFVzZXJEYXRhKA0KKyAgICAgICAgICAgIFhGQV9MQVlPVVRJVEVNS0VZKSA9PSBwUm9vdFBhZ2VTZXRDb250YWluZXJJdGVtKSB7DQorICAgICAgcFJvb3RQYWdlU2V0Q29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUtPlNldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsNCisgICAgfQ0KKyAgICBwUm9vdFBhZ2VTZXRDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZSA9IHBQZW5kaW5nUGFnZVNldDsNCisgICAgcFBlbmRpbmdQYWdlU2V0LT5TZXRGbGFnKFhGQV9OT0RFRkxBR19VbnVzZWROb2RlLCBGQUxTRSk7DQorICAgIGZvciAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwQ29udGFpbmVySXRlbSA9IGl0ZXJhdG9yLk1vdmVUb05leHQoKTsNCisgICAgICAgICBwQ29udGFpbmVySXRlbTsgcENvbnRhaW5lckl0ZW0gPSBpdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgICBDWEZBX05vZGUqIHBOb2RlID0gcENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlOw0KKyAgICAgIGlmIChwTm9kZS0+R2V0UGFja2V0SUQoKSAhPSBYRkFfWERQUEFDS0VUX1RlbXBsYXRlKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgc3dpdGNoIChwTm9kZS0+R2V0Q2xhc3NJRCgpKSB7DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1BhZ2VTZXQ6IHsNCisgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IHBDb250YWluZXJJdGVtLT5tX3BQYXJlbnQtPm1fcEZvcm1Ob2RlOw0KKyAgICAgICAgICBwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUgPSBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcigNCisgICAgICAgICAgICAgIHBEb2N1bWVudCwgcFBhcmVudE5vZGUsIHBDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZSwgVFJVRSk7DQorICAgICAgICB9IGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9QYWdlQXJlYTogew0KKyAgICAgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIHBGb3JtTGF5b3V0ID0gcENvbnRhaW5lckl0ZW07DQorICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBwQ29udGFpbmVySXRlbS0+bV9wUGFyZW50LT5tX3BGb3JtTm9kZTsNCisgICAgICAgICAgRlhfQk9PTCBiSXNFeGlzdEZvcm0gPSBUUlVFOw0KKyAgICAgICAgICBmb3IgKGludDMyX3QgaUxldmVsID0gMDsgaUxldmVsIDwgMzsgaUxldmVsKyspIHsNCisgICAgICAgICAgICBwRm9ybUxheW91dCA9IChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qKXBGb3JtTGF5b3V0LT5tX3BGaXJzdENoaWxkOw0KKyAgICAgICAgICAgIGlmIChpTGV2ZWwgPT0gMikgew0KKyAgICAgICAgICAgICAgd2hpbGUgKHBGb3JtTGF5b3V0ICYmDQorICAgICAgICAgICAgICAgICAgICAgIVhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UoDQorICAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtTGF5b3V0LT5tX3BGb3JtTm9kZSkpIHsNCisgICAgICAgICAgICAgICAgcEZvcm1MYXlvdXQgPQ0KKyAgICAgICAgICAgICAgICAgICAgKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSopcEZvcm1MYXlvdXQtPm1fcE5leHRTaWJsaW5nOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAocEZvcm1MYXlvdXQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgICAgYklzRXhpc3RGb3JtID0gRkFMU0U7DQorICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGJJc0V4aXN0Rm9ybSkgew0KKyAgICAgICAgICAgIENYRkFfTm9kZSogcE5ld1N1YmZvcm0gPSBwRm9ybUxheW91dC0+bV9wRm9ybU5vZGU7DQorICAgICAgICAgICAgaWYgKHBDb250YWluZXJJdGVtLT5tX3BPbGRTdWJmb3JtICE9IE5VTEwgJiYNCisgICAgICAgICAgICAgICAgcENvbnRhaW5lckl0ZW0tPm1fcE9sZFN1YmZvcm0gIT0gcE5ld1N1YmZvcm0pIHsNCisgICAgICAgICAgICAgIENYRkFfTm9kZSogcEV4aXN0aW5nTm9kZSA9IFhGQV9EYXRhTWVyZ2VfRmluZEZvcm1ET01JbnN0YW5jZSgNCisgICAgICAgICAgICAgICAgICBwRG9jdW1lbnQsIHBDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZS0+R2V0Q2xhc3NJRCgpLA0KKyAgICAgICAgICAgICAgICAgIHBDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZS0+R2V0TmFtZUhhc2goKSwgcFBhcmVudE5vZGUpOw0KKyAgICAgICAgICAgICAgQ1hGQV9Db250YWluZXJJdGVyYXRvciBzSXRlcmF0b3IocEV4aXN0aW5nTm9kZSk7DQorICAgICAgICAgICAgICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBzSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwTm9kZTsNCisgICAgICAgICAgICAgICAgICAgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgICAgICAgICAgIGlmIChwTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhKSB7DQorICAgICAgICAgICAgICAgICAgQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSA9IHN0YXRpY19jYXN0PENYRkFfTGF5b3V0SXRlbSo+KA0KKyAgICAgICAgICAgICAgICAgICAgICBwTm9kZS0+R2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVkpKTsNCisgICAgICAgICAgICAgICAgICBpZiAocExheW91dEl0ZW0pIHsNCisgICAgICAgICAgICAgICAgICAgIHBOb3RpZnktPk9uTGF5b3V0RXZlbnQocERvY0xheW91dCwgcExheW91dEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MQVlPVVRFVkVOVF9JdGVtUmVtb3ZpbmcpOw0KKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBMYXlvdXRJdGVtOw0KKyAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgaWYgKHBFeGlzdGluZ05vZGUpIHsNCisgICAgICAgICAgICAgICAgcFBhcmVudE5vZGUtPlJlbW92ZUNoaWxkKHBFeGlzdGluZ05vZGUpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwQ29udGFpbmVySXRlbS0+bV9wT2xkU3ViZm9ybSA9IHBOZXdTdWJmb3JtOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHBDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZSA9IHBEb2N1bWVudC0+RGF0YU1lcmdlX0NvcHlDb250YWluZXIoDQorICAgICAgICAgICAgICBwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUsIHBQYXJlbnROb2RlLA0KKyAgICAgICAgICAgICAgKENYRkFfTm9kZSopcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9SZWNvcmQpLCBUUlVFKTsNCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX0NvbnRlbnRBcmVhOiB7DQorICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBwQ29udGFpbmVySXRlbS0+bV9wUGFyZW50LT5tX3BGb3JtTm9kZTsNCisgICAgICAgICAgZm9yIChDWEZBX05vZGUqIHBDaGlsZE5vZGUgPQ0KKyAgICAgICAgICAgICAgICAgICBwUGFyZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICAgICAgICAgIHBDaGlsZE5vZGU7DQorICAgICAgICAgICAgICAgcENoaWxkTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgICAgICBpZiAocENoaWxkTm9kZS0+R2V0VGVtcGxhdGVOb2RlKCkgIT0gcENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlKSB7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlID0gcENoaWxkTm9kZTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoIXBQZW5kaW5nUGFnZVNldC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpIHsNCisgICAgICBDWEZBX05vZGUqIHBGb3JtVG9wbGV2ZWxTdWJmb3JtID0NCisgICAgICAgICAgKChDWEZBX05vZGUqKXBEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRm9ybSkpDQorICAgICAgICAgICAgICAtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1N1YmZvcm0pOw0KKyAgICAgIHBGb3JtVG9wbGV2ZWxTdWJmb3JtLT5JbnNlcnRDaGlsZChwUGVuZGluZ1BhZ2VTZXQpOw0KKyAgICB9DQorICAgIHBEb2N1bWVudC0+RGF0YU1lcmdlX1VwZGF0ZUJpbmRpbmdSZWxhdGlvbnMocFBlbmRpbmdQYWdlU2V0KTsNCisgICAgcFBlbmRpbmdQYWdlU2V0LT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCk7DQorICB9DQorICBwUGVuZGluZ1BhZ2VTZXQgPSBHZXRSb290TGF5b3V0SXRlbSgpLT5tX3BGb3JtTm9kZTsNCisgIHdoaWxlIChwUGVuZGluZ1BhZ2VTZXQpIHsNCisgICAgQ1hGQV9Ob2RlKiBwTmV4dFBlbmRpbmdQYWdlU2V0ID0NCisgICAgICAgIHBQZW5kaW5nUGFnZVNldC0+R2V0TmV4dFNhbWVDbGFzc1NpYmxpbmcoWEZBX0VMRU1FTlRfUGFnZVNldCk7DQorICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBTm9kZT4NCisgICAgICAgIHNJdGVyYXRvcihwUGVuZGluZ1BhZ2VTZXQpOw0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsNCisgICAgd2hpbGUgKHBOb2RlKSB7DQorICAgICAgaWYgKHBOb2RlLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19VbnVzZWROb2RlKSkgew0KKyAgICAgICAgaWYgKHBOb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSkgew0KKyAgICAgICAgICBYRkFfRUxFTUVOVCBlQ3VySWQgPSBwTm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICAgICAgICBpZiAoZUN1cklkID09IFhGQV9FTEVNRU5UX1BhZ2VBcmVhIHx8IGVDdXJJZCA9PSBYRkFfRUxFTUVOVF9QYWdlU2V0KSB7DQorICAgICAgICAgICAgQ1hGQV9Db250YWluZXJJdGVyYXRvciBpdGVDaGlsZChwTm9kZSk7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gaXRlQ2hpbGQuTW92ZVRvTmV4dCgpOw0KKyAgICAgICAgICAgIGZvciAoOyBwQ2hpbGROb2RlOyBwQ2hpbGROb2RlID0gaXRlQ2hpbGQuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgICAgICAgICBDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gc3RhdGljX2Nhc3Q8Q1hGQV9MYXlvdXRJdGVtKj4oDQorICAgICAgICAgICAgICAgICAgcENoaWxkTm9kZS0+R2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVkpKTsNCisgICAgICAgICAgICAgIGlmIChwTGF5b3V0SXRlbSkgew0KKyAgICAgICAgICAgICAgICBwTm90aWZ5LT5PbkxheW91dEV2ZW50KHBEb2NMYXlvdXQsIHBMYXlvdXRJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MQVlPVVRFVkVOVF9JdGVtUmVtb3ZpbmcpOw0KKyAgICAgICAgICAgICAgICBkZWxldGUgcExheW91dEl0ZW07DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9IGVsc2UgaWYgKGVDdXJJZCAhPSBYRkFfRUxFTUVOVF9Db250ZW50QXJlYSkgew0KKyAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0gPSBzdGF0aWNfY2FzdDxDWEZBX0xheW91dEl0ZW0qPigNCisgICAgICAgICAgICAgICAgcE5vZGUtPkdldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZKSk7DQorICAgICAgICAgICAgaWYgKHBMYXlvdXRJdGVtKSB7DQorICAgICAgICAgICAgICBwTm90aWZ5LT5PbkxheW91dEV2ZW50KHBEb2NMYXlvdXQsIHBMYXlvdXRJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTEFZT1VURVZFTlRfSXRlbVJlbW92aW5nKTsNCisgICAgICAgICAgICAgIGRlbGV0ZSBwTGF5b3V0SXRlbTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgQ1hGQV9Ob2RlKiBwTmV4dCA9IHNJdGVyYXRvci5Ta2lwQ2hpbGRyZW5BbmRNb3ZlVG9OZXh0KCk7DQorICAgICAgICAgIHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KS0+UmVtb3ZlQ2hpbGQocE5vZGUpOw0KKyAgICAgICAgICBwTm9kZSA9IHBOZXh0Ow0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX1VudXNlZE5vZGUsIEZBTFNFKTsNCisgICAgICAgICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCisgICAgICAgICAgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KKyAgICAgICAgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBwUGVuZGluZ1BhZ2VTZXQgPSBwTmV4dFBlbmRpbmdQYWdlU2V0Ow0KKyAgfQ0KK30NCit2b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6TGF5b3V0UGFnZVNldENvbnRlbnRzKCkgew0KKyAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwUm9vdExheW91dEl0ZW0gPSB0aGlzLT5HZXRSb290TGF5b3V0SXRlbSgpOw0KKyAgZm9yICg7IHBSb290TGF5b3V0SXRlbTsNCisgICAgICAgcFJvb3RMYXlvdXRJdGVtID0NCisgICAgICAgICAgIChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qKXBSb290TGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTwNCisgICAgICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSwNCisgICAgICAgIENYRkFfVHJhdmVyc2VTdHJhdGVneV9Db250ZW50QXJlYUNvbnRhaW5lckxheW91dEl0ZW0+DQorICAgICAgICBpdGVyYXRvcihwUm9vdExheW91dEl0ZW0pOw0KKyAgICBmb3IgKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcENvbnRhaW5lckl0ZW0gPSBpdGVyYXRvci5HZXRDdXJyZW50KCk7DQorICAgICAgICAgcENvbnRhaW5lckl0ZW07IHBDb250YWluZXJJdGVtID0gaXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZTsNCisgICAgICBzd2l0Y2ggKHBOb2RlLT5HZXRDbGFzc0lEKCkpIHsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfUGFnZUFyZWE6DQorICAgICAgICAgIG1fcExheW91dFByb2Nlc3Nvci0+R2V0Um9vdFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yKCkNCisgICAgICAgICAgICAgIC0+RG9MYXlvdXRQYWdlQXJlYShwQ29udGFpbmVySXRlbSk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgWEZBX1N5bmNDb250YWluZXIoSVhGQV9Ob3RpZnkqIHBOb3RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCwNCisgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbSogcENvbnRhaW5lckl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1JlbGV2YW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVmlzaWJsZSwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblBhZ2VJbmRleCkgew0KKyAgRlhfQk9PTCBiVmlzaWJsZUl0ZW0gPSBGQUxTRTsNCisgIEZYX0RXT1JEIGR3U3RhdHVzID0gMDsNCisgIEZYX0RXT1JEIGR3UmVsZXZhbnRDb250YWluZXIgPSAwOw0KKyAgaWYgKGJWaXNpYmxlKSB7DQorICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVBdHRyaWJ1dGVWYWx1ZSA9DQorICAgICAgICBwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9QcmVzZW5jZSk7DQorICAgIGlmIChlQXR0cmlidXRlVmFsdWUgPT0gWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZSB8fA0KKyAgICAgICAgZUF0dHJpYnV0ZVZhbHVlID09IFhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd24pIHsNCisgICAgICBiVmlzaWJsZUl0ZW0gPSBUUlVFOw0KKyAgICB9DQorICAgIGR3UmVsZXZhbnRDb250YWluZXIgPQ0KKyAgICAgICAgWEZBX0dldFJlbGV2YW50KHBDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZSwgZHdSZWxldmFudCk7DQorICAgIGR3U3RhdHVzID0NCisgICAgICAgIChiVmlzaWJsZUl0ZW0gPyBYRkFfTEFZT1VUU1RBVFVTX1Zpc2libGUgOiAwKSB8IGR3UmVsZXZhbnRDb250YWluZXI7DQorICB9DQorICBwTm90aWZ5LT5PbkxheW91dEV2ZW50KHBEb2NMYXlvdXQsIHBDb250YWluZXJJdGVtLCBYRkFfTEFZT1VURVZFTlRfSXRlbUFkZGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopKHVpbnRwdHJfdCluUGFnZUluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopKHVpbnRwdHJfdClkd1N0YXR1cyk7DQorICBmb3IgKENYRkFfTGF5b3V0SXRlbSogcENoaWxkID0gcENvbnRhaW5lckl0ZW0tPm1fcEZpcnN0Q2hpbGQ7IHBDaGlsZDsNCisgICAgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0U2libGluZykgew0KKyAgICBpZiAocENoaWxkLT5Jc0NvbnRlbnRMYXlvdXRJdGVtKCkpIHsNCisgICAgICBYRkFfU3luY0NvbnRhaW5lcihwTm90aWZ5LCBwRG9jTGF5b3V0LCBwQ2hpbGQsIGR3UmVsZXZhbnRDb250YWluZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgYlZpc2libGVJdGVtLCBuUGFnZUluZGV4KTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6U3luY0xheW91dERhdGEoKSB7DQorICBNZXJnZVBhZ2VTZXRDb250ZW50cygpOw0KKyAgTGF5b3V0UGFnZVNldENvbnRlbnRzKCk7DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9DQorICAgICAgbV9wVGVtcGxhdGVQYWdlU2V0Um9vdC0+R2V0RG9jdW1lbnQoKS0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaW50MzJfdCBuUGFnZUlkeCA9IC0xOw0KKyAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwUm9vdExheW91dEl0ZW0gPSB0aGlzLT5HZXRSb290TGF5b3V0SXRlbSgpOw0KKyAgZm9yICg7IHBSb290TGF5b3V0SXRlbTsNCisgICAgICAgcFJvb3RMYXlvdXRJdGVtID0NCisgICAgICAgICAgIChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qKXBSb290TGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTwNCisgICAgICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSwNCisgICAgICAgIENYRkFfVHJhdmVyc2VTdHJhdGVneV9Db250ZW50QXJlYUNvbnRhaW5lckxheW91dEl0ZW0+DQorICAgICAgICBpdGVyYXRvclBhcmVudChwUm9vdExheW91dEl0ZW0pOw0KKyAgICBmb3IgKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcENvbnRhaW5lckl0ZW0gPSBpdGVyYXRvclBhcmVudC5HZXRDdXJyZW50KCk7DQorICAgICAgICAgcENvbnRhaW5lckl0ZW07IHBDb250YWluZXJJdGVtID0gaXRlcmF0b3JQYXJlbnQuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgc3dpdGNoIChwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSkgew0KKyAgICAgICAgY2FzZSBYRkFfRUxFTUVOVF9QYWdlQXJlYTogew0KKyAgICAgICAgICBuUGFnZUlkeCsrOw0KKyAgICAgICAgICBGWF9EV09SRCBkd1JlbGV2YW50ID0NCisgICAgICAgICAgICAgIFhGQV9MQVlPVVRTVEFUVVNfVmlld2FibGUgfCBYRkFfTEFZT1VUU1RBVFVTX1ByaW50YWJsZTsNCisgICAgICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX0xheW91dEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0xheW91dEl0ZW0+DQorICAgICAgICAgICAgICBpdGVyYXRvcihwQ29udGFpbmVySXRlbSk7DQorICAgICAgICAgIENYRkFfTGF5b3V0SXRlbSogcENoaWxkTGF5b3V0SXRlbSA9IGl0ZXJhdG9yLkdldEN1cnJlbnQoKTsNCisgICAgICAgICAgd2hpbGUgKHBDaGlsZExheW91dEl0ZW0pIHsNCisgICAgICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwQ29udGVudEl0ZW0gPQ0KKyAgICAgICAgICAgICAgICBwQ2hpbGRMYXlvdXRJdGVtLT5Bc0NvbnRlbnRMYXlvdXRJdGVtKCk7DQorICAgICAgICAgICAgaWYgKCFwQ29udGVudEl0ZW0pIHsNCisgICAgICAgICAgICAgIHBDaGlsZExheW91dEl0ZW0gPSBpdGVyYXRvci5Nb3ZlVG9OZXh0KCk7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhfQk9PTCBiVmlzaWJsZSA9DQorICAgICAgICAgICAgICAgIChwQ29udGVudEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UpID09DQorICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlKTsNCisgICAgICAgICAgICBGWF9EV09SRCBkd1JlbGV2YW50Q2hpbGQgPQ0KKyAgICAgICAgICAgICAgICBYRkFfR2V0UmVsZXZhbnQocENvbnRlbnRJdGVtLT5tX3BGb3JtTm9kZSwgZHdSZWxldmFudCk7DQorICAgICAgICAgICAgWEZBX1N5bmNDb250YWluZXIocE5vdGlmeSwgbV9wTGF5b3V0UHJvY2Vzc29yLCBwQ29udGVudEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdSZWxldmFudENoaWxkLCBiVmlzaWJsZSwgblBhZ2VJZHgpOw0KKyAgICAgICAgICAgIHBDaGlsZExheW91dEl0ZW0gPSBpdGVyYXRvci5Ta2lwQ2hpbGRyZW5BbmRNb3ZlVG9OZXh0KCk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0gYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGludDMyX3QgblBhZ2UgPSBtX1BhZ2VBcnJheS5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IG5QYWdlIC0gMTsgaSA+PSBtX25BdmFpbFBhZ2VzOyBpLS0pIHsNCisgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwUGFnZSA9IG1fUGFnZUFycmF5W2ldOw0KKyAgICBtX1BhZ2VBcnJheS5SZW1vdmVBdChpKTsNCisgICAgcE5vdGlmeS0+T25QYWdlRXZlbnQocFBhZ2UsIFhGQV9QQUdFRVZFTlRfUGFnZVJlbW92ZWQpOw0KKyAgICBkZWxldGUgcFBhZ2U7DQorICB9DQorICBDbGVhclJlY29yZExpc3QoKTsNCit9DQordm9pZCBYRkFfUmVsZWFzZUxheW91dEl0ZW1fTm9QYWdlQXJlYShDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtKSB7DQorICBDWEZBX0xheW91dEl0ZW0qIHBOZXh0LCAqIHBOb2RlID0gcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7DQorICB3aGlsZSAocE5vZGUpIHsNCisgICAgcE5leHQgPSBwTm9kZS0+bV9wTmV4dFNpYmxpbmc7DQorICAgIHBOb2RlLT5tX3BQYXJlbnQgPSBOVUxMOw0KKyAgICBYRkFfUmVsZWFzZUxheW91dEl0ZW1fTm9QYWdlQXJlYShwTm9kZSk7DQorICAgIHBOb2RlID0gcE5leHQ7DQorICB9DQorICBpZiAocExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCisgICAgZGVsZXRlIHBMYXlvdXRJdGVtOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6UHJlcGFyZUxheW91dCgpIHsNCisgIG1fcFBhZ2VTZXRDdXJSb290ID0gTlVMTDsNCisgIG1fZVBhZ2VTZXRNb2RlID0gWEZBX0FUVFJJQlVURUVOVU1fT3JkZXJlZE9jY3VycmVuY2U7DQorICBtX25BdmFpbFBhZ2VzID0gMDsNCisgIENsZWFyUmVjb3JkTGlzdCgpOw0KKyAgaWYgKCFtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3QpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwUm9vdExheW91dEl0ZW0gPSBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3Q7DQorICBpZiAocFJvb3RMYXlvdXRJdGVtICYmDQorICAgICAgcFJvb3RMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0Zvcm0pIHsNCisgICAgQ1hGQV9Ob2RlKiBwUGFnZVNldEZvcm1Ob2RlID0gcFJvb3RMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZTsNCisgICAgcFJvb3RMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKS0+bV9wUGVuZGluZ1BhZ2VTZXQuUmVtb3ZlQWxsKCk7DQorICAgIGlmIChwUGFnZVNldEZvcm1Ob2RlLT5IYXNGbGFnKFhGQV9OT0RFRkxBR19IYXNSZW1vdmVkKSkgew0KKyAgICAgIFhGQV9SZWxlYXNlTGF5b3V0SXRlbShwUm9vdExheW91dEl0ZW0pOw0KKyAgICAgIG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdCA9IE5VTEw7DQorICAgICAgcFJvb3RMYXlvdXRJdGVtID0gTlVMTDsNCisgICAgICBwUGFnZVNldEZvcm1Ob2RlID0gTlVMTDsNCisgICAgICBtX1BhZ2VBcnJheS5SZW1vdmVBbGwoKTsNCisgICAgfQ0KKyAgICB3aGlsZSAocFBhZ2VTZXRGb3JtTm9kZSkgew0KKyAgICAgIENYRkFfTm9kZSogcE5leHRQYWdlU2V0ID0NCisgICAgICAgICAgcFBhZ2VTZXRGb3JtTm9kZS0+R2V0TmV4dFNhbWVDbGFzc1NpYmxpbmcoWEZBX0VMRU1FTlRfUGFnZVNldCk7DQorICAgICAgcFBhZ2VTZXRGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkNCisgICAgICAgICAgLT5SZW1vdmVDaGlsZChwUGFnZVNldEZvcm1Ob2RlLCBGQUxTRSk7DQorICAgICAgcFJvb3RMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKS0+bV9wUGVuZGluZ1BhZ2VTZXQuQWRkKA0KKyAgICAgICAgICBwUGFnZVNldEZvcm1Ob2RlKTsNCisgICAgICBwUGFnZVNldEZvcm1Ob2RlID0gcE5leHRQYWdlU2V0Ow0KKyAgICB9DQorICB9DQorI2lmIGRlZmluZWQoX1hGQV9MQVlPVVRJVEVNX01BUENBQ0hFXykgfHwgZGVmaW5lZChfWEZBX0xBWU9VVElURU1fUHJvY2Vzc0NBQ0hFXykNCisgIHBSb290TGF5b3V0SXRlbSA9IG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdDsNCisgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcE5leHRMYXlvdXQgPSBOVUxMOw0KKyAgZm9yICg7IHBSb290TGF5b3V0SXRlbTsgcFJvb3RMYXlvdXRJdGVtID0gcE5leHRMYXlvdXQpIHsNCisgICAgcE5leHRMYXlvdXQgPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKilwUm9vdExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KKyAgICBTYXZlTGF5b3V0SXRlbShwUm9vdExheW91dEl0ZW0pOw0KKyAgICBkZWxldGUgcFJvb3RMYXlvdXRJdGVtOw0KKyAgfQ0KKyAgbV9wUGFnZVNldExheW91dEl0ZW1Sb290ID0gTlVMTDsNCisjZWxzZQ0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPQ0KKyAgICAgIG1fcExheW91dFByb2Nlc3Nvci0+R2V0RG9jdW1lbnQoKS0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgcFJvb3RMYXlvdXRJdGVtID0gbV9wUGFnZVNldExheW91dEl0ZW1Sb290Ow0KKyAgZm9yICg7IHBSb290TGF5b3V0SXRlbTsNCisgICAgICAgcFJvb3RMYXlvdXRJdGVtID0NCisgICAgICAgICAgIChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qKXBSb290TGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1BhZ2VBcmVhQ29udGFpbmVyTGF5b3V0SXRlbT4NCisgICAgICAgIGl0ZXJhdG9yKHBSb290TGF5b3V0SXRlbSk7DQorICAgIGZvciAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwQ29udGFpbmVySXRlbSA9IGl0ZXJhdG9yLkdldEN1cnJlbnQoKTsNCisgICAgICAgICBwQ29udGFpbmVySXRlbTsgcENvbnRhaW5lckl0ZW0gPSBpdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgICBpZiAocENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTGF5b3V0SXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfVHJhdmVyc2VTdHJhdGVneV9MYXlvdXRJdGVtPg0KKyAgICAgICAgICBpdGVyYXRvcihwQ29udGFpbmVySXRlbSk7DQorICAgICAgZm9yIChDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gaXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwTGF5b3V0SXRlbTsNCisgICAgICAgICAgIHBMYXlvdXRJdGVtID0gaXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgICBpZiAoIXBMYXlvdXRJdGVtLT5Jc0NvbnRlbnRMYXlvdXRJdGVtKCkpIHsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBwTm90aWZ5LT5PbkxheW91dEV2ZW50KG1fcExheW91dFByb2Nlc3NvciwgcExheW91dEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MQVlPVVRFVkVOVF9JdGVtUmVtb3ZpbmcpOw0KKyAgICAgIH0NCisgICAgICBwTm90aWZ5LT5PblBhZ2VFdmVudChwQ29udGFpbmVySXRlbSwgWEZBX1BBR0VFVkVOVF9QYWdlUmVtb3ZlZCk7DQorICAgIH0NCisgIH0NCisgIHBSb290TGF5b3V0SXRlbSA9IG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdDsNCisgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcE5leHRMYXlvdXQgPSBOVUxMOw0KKyAgZm9yICg7IHBSb290TGF5b3V0SXRlbTsgcFJvb3RMYXlvdXRJdGVtID0gcE5leHRMYXlvdXQpIHsNCisgICAgcE5leHRMYXlvdXQgPSAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKilwUm9vdExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOw0KKyAgICBYRkFfUmVsZWFzZUxheW91dEl0ZW1fTm9QYWdlQXJlYShwUm9vdExheW91dEl0ZW0pOw0KKyAgfQ0KKyAgbV9wUGFnZVNldExheW91dEl0ZW1Sb290ID0gTlVMTDsNCisjZW5kaWYNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9wYWdlbWdyX25ldy5oIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xheW91dF9wYWdlbWdyX25ldy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYzk2YTgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbGF5b3V0X3BhZ2VtZ3JfbmV3LmgKQEAgLTAsMCArMSwxNTIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfWEZBX0xBWU9VVF9QQUdFTUdSX0hfDQorI2RlZmluZSBfWEZBX0xBWU9VVF9QQUdFTUdSX0hfDQorY2xhc3MgQ1hGQV9Db250YWluZXJSZWNvcmQgew0KKyBwdWJsaWM6DQorICBDWEZBX0NvbnRhaW5lclJlY29yZChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIHBQYWdlU2V0ID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcFBhZ2VBcmVhID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcENvbnRlbnRBcmVhID0gTlVMTCkNCisgICAgICA6IHBDdXJQYWdlU2V0KHBQYWdlU2V0KSwNCisgICAgICAgIHBDdXJQYWdlQXJlYShwUGFnZUFyZWEpLA0KKyAgICAgICAgcEN1ckNvbnRlbnRBcmVhKHBDb250ZW50QXJlYSkge30NCisgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcEN1clBhZ2VTZXQ7DQorICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIHBDdXJQYWdlQXJlYTsNCisgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcEN1ckNvbnRlbnRBcmVhOw0KK307DQorY2xhc3MgQ1hGQV9MYXlvdXRQYWdlTWdyIHsNCisgcHVibGljOg0KKyAgQ1hGQV9MYXlvdXRQYWdlTWdyKENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvY2Vzc29yKTsNCisgIH5DWEZBX0xheW91dFBhZ2VNZ3IoKTsNCisgIEZYX0JPT0wgSW5pdExheW91dFBhZ2UoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpOw0KKyAgRlhfQk9PTCBQcmVwYXJlRmlyc3RQYWdlKENYRkFfTm9kZSogcFJvb3RTdWJmb3JtKTsNCisgIEZYX0ZMT0FUIEdldEF2YWlsSGVpZ2h0KCk7DQorICBGWF9CT09MIEdldE5leHRBdmFpbENvbnRlbnRIZWlnaHQoRlhfRkxPQVQgZkNoaWxkSGVpZ2h0KTsNCisgIHZvaWQgU3VibWl0Q29udGVudEl0ZW0oQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcENvbnRlbnRMYXlvdXRJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBlU3RhdHVzKTsNCisgIHZvaWQgRmluaXNoUGFnaW5hdGVkUGFnZVNldHMoKTsNCisgIHZvaWQgU3luY0xheW91dERhdGEoKTsNCisgIGludDMyX3QgR2V0UGFnZUNvdW50KCkgY29uc3Q7DQorICBJWEZBX0xheW91dFBhZ2UqIEdldFBhZ2UoaW50MzJfdCBpbmRleCkgY29uc3Q7DQorICBpbnQzMl90IEdldFBhZ2VJbmRleChjb25zdCBJWEZBX0xheW91dFBhZ2UqIHBQYWdlKSBjb25zdDsNCisgIGlubGluZSBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIEdldFJvb3RMYXlvdXRJdGVtKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9wUGFnZVNldExheW91dEl0ZW1Sb290Ow0KKyAgfQ0KKyAgRlhfQk9PTCBQcm9jZXNzQnJlYWtCZWZvcmVPckFmdGVyKENYRkFfTm9kZSogcEJyZWFrTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJCZWZvcmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiYgcEJyZWFrTGVhZGVyTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqJiBwQnJlYWtUcmFpbGVyTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiQ3JlYXRlUGFnZSk7DQorICBGWF9CT09MIFByb2Nlc3NPdmVyZmxvdyhDWEZBX05vZGUqIHBGb3JtTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSomIHBMZWFkZXJOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiYgcFRyYWlsZXJOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRGF0YU1lcmdlID0gRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDcmVhdGVQYWdlID0gVFJVRSk7DQorICBDWEZBX05vZGUqIFF1ZXJ5T3ZlcmZsb3coQ1hGQV9Ob2RlKiBwRm9ybU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9MYXlvdXRDb250ZXh0KiBwTGF5b3V0Q29udGV4dCA9IE5VTEwpOw0KKyAgRlhfQk9PTCBQcm9jZXNzQm9va2VuZExlYWRlck9yVHJhaWxlcihDWEZBX05vZGUqIHBCb29rZW5kTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTGVhZGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqJiBwQm9va2VuZEFwcGVuZE5vZGUpOw0KKyAgQ1hGQV9MYXlvdXRJdGVtKiBGaW5kT3JDcmVhdGVMYXlvdXRJdGVtKENYRkFfTm9kZSogcEZvcm1Ob2RlKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgRlhfQk9PTCBBcHBlbmROZXdQYWdlKEZYX0JPT0wgYkZpcnN0VGVtUGFnZSA9IEZBTFNFKTsNCisgIHZvaWQgUmVvcmRlclBlbmRpbmdMYXlvdXRSZWNvcmRUb1RhaWwoQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfQ29udGFpbmVyUmVjb3JkKiBwUHJldlJlY29yZCk7DQorICB2b2lkIFJlbW92ZUxheW91dFJlY29yZChDWEZBX0NvbnRhaW5lclJlY29yZCogcE5ld1JlY29yZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfQ29udGFpbmVyUmVjb3JkKiBwUHJldlJlY29yZCk7DQorICBpbmxpbmUgQ1hGQV9Db250YWluZXJSZWNvcmQqIEdldEN1cnJlbnRDb250YWluZXJSZWNvcmQoKSB7DQorICAgIENYRkFfQ29udGFpbmVyUmVjb3JkKiByZXN1bHQgPQ0KKyAgICAgICAgKChDWEZBX0NvbnRhaW5lclJlY29yZCopbV9yZ1Byb3Bvc2VkQ29udGFpbmVyUmVjb3JkLkdldEF0KA0KKyAgICAgICAgICAgIG1fcEN1cnJlbnRDb250YWluZXJSZWNvcmQpKTsNCisgICAgQVNTRVJUKHJlc3VsdCk7DQorICAgIHJldHVybiByZXN1bHQ7DQorICB9DQorICBDWEZBX0NvbnRhaW5lclJlY29yZCogQ3JlYXRlQ29udGFpbmVyUmVjb3JkKENYRkFfTm9kZSogcFBhZ2VOb2RlID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ3JlYXRlTmV3ID0gRkFMU0UpOw0KKyAgdm9pZCBBZGRQYWdlQXJlYUxheW91dEl0ZW0oQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBOZXdQYWdlQXJlYSk7DQorICB2b2lkIEFkZENvbnRlbnRBcmVhTGF5b3V0SXRlbShDWEZBX0NvbnRhaW5lclJlY29yZCogcE5ld1JlY29yZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcENvbnRlbnRBcmVhKTsNCisgIEZYX0JPT0wgUnVuQnJlYWsoWEZBX0VMRU1FTlQgZUJyZWFrVHlwZSwNCisgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZVRhcmdldFR5cGUsDQorICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFRhcmdldCwNCisgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3RhcnROZXcpOw0KKyAgQ1hGQV9Ob2RlKiBCcmVha092ZXJmbG93KENYRkFfTm9kZSogcE92ZXJmbG93Tm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqJiBwTGVhZGVyVGVtcGxhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiYgcFRyYWlsZXJUZW1wbGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJDcmVhdGVQYWdlID0gVFJVRSk7DQorICBGWF9CT09MIFJlc29sdmVCb29rZW5kTGVhZGVyT3JUcmFpbGVyKENYRkFfTm9kZSogcEJvb2tlbmROb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJMZWFkZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSomIHBCb29rZW5kQXBwZW5kVGVtcGxhdGUpOw0KKyAgRlhfQk9PTCBFeGVjdXRlQnJlYWtCZWZvcmVPckFmdGVyKENYRkFfTm9kZSogcEN1ck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQmVmb3JlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSomIHBCcmVha0xlYWRlclRlbXBsYXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSomIHBCcmVha1RyYWlsZXJUZW1wbGF0ZSk7DQorDQorICBpbnQzMl90IENyZWF0ZU1pblBhZ2VSZWNvcmQoQ1hGQV9Ob2RlKiBwUGFnZUFyZWEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVGFyZ2V0UGFnZUFyZWEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ3JlYXRlTGFzdCA9IEZBTFNFKTsNCisgIHZvaWQgQ3JlYXRlTWluUGFnZVNldFJlY29yZChDWEZBX05vZGUqIHBQYWdlU2V0LCBGWF9CT09MIGJDcmVhdGVBbGwgPSBGQUxTRSk7DQorICB2b2lkIENyZWF0ZU5leHRNaW5SZWNvcmQoQ1hGQV9Ob2RlKiBwUmVjb3JkTm9kZSk7DQorICBGWF9CT09MIEZpbmRQYWdlQXJlYUZyb21QYWdlU2V0KENYRkFfTm9kZSogcFBhZ2VTZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFN0YXJ0Q2hpbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFRhcmdldFBhZ2VBcmVhID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVGFyZ2V0Q29udGVudEFyZWEgPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOZXdQYWdlID0gRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlF1ZXJ5ID0gRkFMU0UpOw0KKyAgRlhfQk9PTCBGaW5kUGFnZUFyZWFGcm9tUGFnZVNldF9PcmRlcmVkKENYRkFfTm9kZSogcFBhZ2VTZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwU3RhcnRDaGlsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBUYXJnZXRQYWdlQXJlYSA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVGFyZ2V0Q29udGVudEFyZWEgPSBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5ld1BhZ2UgPSBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJRdWVyeSA9IEZBTFNFKTsNCisgIEZYX0JPT0wgRmluZFBhZ2VBcmVhRnJvbVBhZ2VTZXRfU2ltcGxleER1cGxleCgNCisgICAgICBDWEZBX05vZGUqIHBQYWdlU2V0LA0KKyAgICAgIENYRkFfTm9kZSogcFN0YXJ0Q2hpbGQsDQorICAgICAgQ1hGQV9Ob2RlKiBwVGFyZ2V0UGFnZUFyZWEgPSBOVUxMLA0KKyAgICAgIENYRkFfTm9kZSogcFRhcmdldENvbnRlbnRBcmVhID0gTlVMTCwNCisgICAgICBGWF9CT09MIGJOZXdQYWdlID0gRkFMU0UsDQorICAgICAgRlhfQk9PTCBiUXVlcnkgPSBGQUxTRSwNCisgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlUHJlZmVycmVkUG9zaXRpb24gPSBYRkFfQVRUUklCVVRFRU5VTV9GaXJzdCk7DQorICBGWF9CT09MIE1hdGNoUGFnZUFyZWFPZGRPckV2ZW4oQ1hGQV9Ob2RlKiBwUGFnZUFyZWEsIEZYX0JPT0wgYkxhc3RNYXRjaCk7DQorICBDWEZBX05vZGUqIEdldE5leHRBdmFpbFBhZ2VBcmVhKENYRkFfTm9kZSogcFRhcmdldFBhZ2VBcmVhLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBUYXJnZXRDb250ZW50QXJlYSA9IE5VTEwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5ld1BhZ2UgPSBGQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUXVlcnkgPSBGQUxTRSk7DQorICBGWF9CT09MIEdldE5leHRDb250ZW50QXJlYShDWEZBX05vZGUqIHBUYXJnZXRDb250ZW50QXJlYSk7DQorICB2b2lkIEluaXRQYWdlU2V0TWFwKCk7DQorICB2b2lkIFByb2Nlc3NMYXN0UGFnZVNldCgpOw0KKyAgaW5saW5lIEZYX0JPT0wgSXNQYWdlU2V0Um9vdE9yZGVyZWRPY2N1cnJlbmNlKCkgew0KKyAgICByZXR1cm4gbV9lUGFnZVNldE1vZGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fT3JkZXJlZE9jY3VycmVuY2U7DQorICB9DQorICB2b2lkIENsZWFyRGF0YSgpOw0KKyAgdm9pZCBDbGVhclJlY29yZExpc3QoKTsNCisgIHZvaWQgTWVyZ2VQYWdlU2V0Q29udGVudHMoKTsNCisgIHZvaWQgTGF5b3V0UGFnZVNldENvbnRlbnRzKCk7DQorICB2b2lkIFByZXBhcmVMYXlvdXQoKTsNCisjaWYgZGVmaW5lZChfWEZBX0xBWU9VVElURU1fTUFQQ0FDSEVfKSB8fCBkZWZpbmVkKF9YRkFfTEFZT1VUSVRFTV9Qcm9jZXNzQ0FDSEVfKQ0KKyAgdm9pZCBTYXZlTGF5b3V0SXRlbShDWEZBX0xheW91dEl0ZW0qIHBQYXJlbnRMYXlvdXRJdGVtKTsNCisjZW5kaWYNCisgIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBtX3BMYXlvdXRQcm9jZXNzb3I7DQorICBDWEZBX05vZGUqIG1fcFRlbXBsYXRlUGFnZVNldFJvb3Q7DQorICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdDsNCisgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogbV9wUGFnZVNldEN1clJvb3Q7DQorICBGWF9QT1NJVElPTiBtX3BDdXJyZW50Q29udGFpbmVyUmVjb3JkOw0KKyAgQ0ZYX1B0ckxpc3QgbV9yZ1Byb3Bvc2VkQ29udGFpbmVyUmVjb3JkOw0KKyAgQ1hGQV9Ob2RlKiBtX3BDdXJQYWdlQXJlYTsNCisgIGludDMyX3QgbV9uQXZhaWxQYWdlczsNCisgIGludDMyX3QgbV9uQ3VyUGFnZUNvdW50Ow0KKyAgWEZBX0FUVFJJQlVURUVOVU0gbV9lUGFnZVNldE1vZGU7DQorICBGWF9CT09MIG1fYkNyZWF0ZU92ZXJGbG93UGFnZTsNCisgIENGWF9NYXBQdHJUZW1wbGF0ZTxDWEZBX05vZGUqLCBpbnQzMl90PiBtX3BQYWdlU2V0TWFwOw0KKyAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9Db250YWluZXJMYXlvdXRJdGVtKj4gbV9QYWdlQXJyYXk7DQorI2lmZGVmIF9YRkFfTEFZT1VUSVRFTV9NQVBDQUNIRV8NCisgIENGWF9NYXBQdHJUb1B0ciBtX05vZGVUb0NvbnRlbnQ7DQorI2VuZGlmDQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbG9jYWxlLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sb2NhbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYWRlZmMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbG9jYWxlLmNwcApAQCAtMCwwICsxLDM3NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAiY29yZS9pbmNsdWRlL2Z4Y3J0L2Z4X3htbC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV91dGlscy5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfb2JqZWN0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2N1bWVudC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfcGFyc2VyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9zY3JpcHQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY2RhdGEuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY2xheW91dC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfbG9jYWxlbWdyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9mbTJqc2FwaS5oIg0KKyNpbmNsdWRlICJ4ZmFfbG9jYWxlLmgiDQorDQorc3RhdGljIGNvbnN0IEZYX1dDSEFSKiBnX0ZYX1BlcmNlbnQgPSBMInosenp6LHp6eix6enosenp6LHp6eiUiOw0KK3N0YXRpYyBjb25zdCBGWF9XQ0hBUiogZ19GWF9DdXJyZW5jeSA9IEwiJHosenp6LHp6eix6enosenp6LHp6OS45OSI7DQorc3RhdGljIGNvbnN0IEZYX1dDSEFSKiBnX0ZYX0RlY2ltYWwgPSBMInosenp6LHp6eix6enosenp6LHp6OS56enoiOw0KK3N0YXRpYyBjb25zdCBGWF9XQ0hBUiogZ19GWF9JbnRlZ2VyID0gTCJ6LHp6eix6enosenp6LHp6eix6enoiOw0KK0NYRkFfWE1MTG9jYWxlOjpDWEZBX1hNTExvY2FsZShDWE1MX0VsZW1lbnQqIHBMb2NhbGVEYXRhKSB7DQorICBtX3BMb2NhbGVEYXRhID0gcExvY2FsZURhdGE7DQorfQ0KK0NYRkFfWE1MTG9jYWxlOjp+Q1hGQV9YTUxMb2NhbGUoKSB7DQorICBpZiAobV9wTG9jYWxlRGF0YSkgew0KKyAgICBkZWxldGUgbV9wTG9jYWxlRGF0YTsNCisgIH0NCit9DQordm9pZCBDWEZBX1hNTExvY2FsZTo6UmVsZWFzZSgpIHsNCisgIGRlbGV0ZSB0aGlzOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX1hNTExvY2FsZTo6R2V0TmFtZSgpIHsNCisgIHJldHVybiBtX3BMb2NhbGVEYXRhID8gbV9wTG9jYWxlRGF0YS0+R2V0QXR0clZhbHVlKCJuYW1lIikgOiBDRlhfV2lkZVN0cmluZygpOw0KK30NCit2b2lkIENYRkFfWE1MTG9jYWxlOjpHZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0wgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTnVtU3ltYm9sKSBjb25zdCB7DQorICBDRlhfQnl0ZVN0cmluZyBic1N5bWJvbHM7DQorICBDRlhfV2lkZVN0cmluZyB3c05hbWU7DQorICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgIGNhc2UgRlhfTE9DQUxFTlVNU1lNQk9MX0RlY2ltYWw6DQorICAgICAgYnNTeW1ib2xzID0gIm51bWJlclN5bWJvbHMiOw0KKyAgICAgIHdzTmFtZSA9IEZYX1dTVFJDKEwiZGVjaW1hbCIpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9Hcm91cGluZzoNCisgICAgICBic1N5bWJvbHMgPSAibnVtYmVyU3ltYm9scyI7DQorICAgICAgd3NOYW1lID0gRlhfV1NUUkMoTCJncm91cGluZyIpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50Og0KKyAgICAgIGJzU3ltYm9scyA9ICJudW1iZXJTeW1ib2xzIjsNCisgICAgICB3c05hbWUgPSBGWF9XU1RSQyhMInBlcmNlbnQiKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfTWludXM6DQorICAgICAgYnNTeW1ib2xzID0gIm51bWJlclN5bWJvbHMiOw0KKyAgICAgIHdzTmFtZSA9IEZYX1dTVFJDKEwibWludXMiKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfWmVybzoNCisgICAgICBic1N5bWJvbHMgPSAibnVtYmVyU3ltYm9scyI7DQorICAgICAgd3NOYW1lID0gRlhfV1NUUkMoTCJ6ZXJvIik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sOg0KKyAgICAgIGJzU3ltYm9scyA9ICJjdXJyZW5jeVN5bWJvbHMiOw0KKyAgICAgIHdzTmFtZSA9IEZYX1dTVFJDKEwic3ltYm9sIik7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5TmFtZToNCisgICAgICBic1N5bWJvbHMgPSAiY3VycmVuY3lTeW1ib2xzIjsNCisgICAgICB3c05hbWUgPSBGWF9XU1RSQyhMImlzb25hbWUiKTsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm47DQorICB9DQorICBDWE1MX0VsZW1lbnQqIHBFbGVtZW50ID0gbV9wTG9jYWxlRGF0YS0+R2V0RWxlbWVudCgiIiwgYnNTeW1ib2xzKTsNCisgIGlmICghcEVsZW1lbnQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgR2V0UGF0dGVybihwRWxlbWVudCwgQ0ZYX0J5dGVTdHJpbmdDKChjb25zdCBGWF9DSEFSKilic1N5bWJvbHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNTeW1ib2xzLkdldExlbmd0aCgpIC0gMSksDQorICAgICAgICAgICAgIHdzTmFtZSwgd3NOdW1TeW1ib2wpOw0KK30NCit2b2lkIENYRkFfWE1MTG9jYWxlOjpHZXREYXRlVGltZVN5bWJvbHMoQ0ZYX1dpZGVTdHJpbmcmIHdzRHRTeW1ib2wpIGNvbnN0IHsNCisgIGlmICghbV9wTG9jYWxlRGF0YSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfQnl0ZVN0cmluZyBic1NwYWNlOw0KKyAgQ1hNTF9FbGVtZW50KiBwTnVtYmVyU3ltYm9scyA9DQorICAgICAgbV9wTG9jYWxlRGF0YS0+R2V0RWxlbWVudChic1NwYWNlLCAiZGF0ZVRpbWVTeW1ib2xzIik7DQorICBpZiAoIXBOdW1iZXJTeW1ib2xzKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHdzRHRTeW1ib2wgPSBwTnVtYmVyU3ltYm9scy0+R2V0Q29udGVudCgwKTsNCit9DQordm9pZCBDWEZBX1hNTExvY2FsZTo6R2V0TW9udGhOYW1lKGludDMyX3Qgbk1vbnRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NNb250aE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFiYnIpIGNvbnN0IHsNCisgIHdzTW9udGhOYW1lID0gR2V0Q2FsZW5kYXJTeW1ib2woIm1vbnRoIiwgbk1vbnRoLCBiQWJicik7DQorfQ0KK3ZvaWQgQ1hGQV9YTUxMb2NhbGU6OkdldERheU5hbWUoaW50MzJfdCBuV2VlaywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0RheU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBYmJyKSBjb25zdCB7DQorICB3c0RheU5hbWUgPSBHZXRDYWxlbmRhclN5bWJvbCgiZGF5IiwgbldlZWssIGJBYmJyKTsNCit9DQordm9pZCBDWEZBX1hNTExvY2FsZTo6R2V0TWVyaWRpZW1OYW1lKENGWF9XaWRlU3RyaW5nJiB3c01lcmlkaWVtTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQU0pIGNvbnN0IHsNCisgIHdzTWVyaWRpZW1OYW1lID0gR2V0Q2FsZW5kYXJTeW1ib2woIm1lcmlkaWVtIiwgYkFNID8gMCA6IDEsIEZBTFNFKTsNCit9DQordm9pZCBDWEZBX1hNTExvY2FsZTo6R2V0VGltZVpvbmUoRlhfVElNRVpPTkUmIHR6KSBjb25zdCB7DQorICBJWEZBX1RpbWVab25lUHJvdmlkZXIqIHBQcm92aWRlciA9IElYRkFfVGltZVpvbmVQcm92aWRlcjo6R2V0KCk7DQorICBwUHJvdmlkZXItPkdldFRpbWVab25lKHR6KTsNCit9DQordm9pZCBDWEZBX1hNTExvY2FsZTo6R2V0RXJhTmFtZShDRlhfV2lkZVN0cmluZyYgd3NFcmFOYW1lLCBGWF9CT09MIGJBRCkgY29uc3Qgew0KKyAgd3NFcmFOYW1lID0gR2V0Q2FsZW5kYXJTeW1ib2woImVyYSIsIGJBRCA/IDEgOiAwLCBGQUxTRSk7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfWE1MTG9jYWxlOjpHZXRDYWxlbmRhclN5bWJvbChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN5bWJvbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBYmJyKSBjb25zdCB7DQorICBDRlhfQnl0ZVN0cmluZyBwc3RyU3ltYm9sTmFtZXMgPSBzeW1ib2wgKyAiTmFtZXMiOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2xOYW1lID0gTCIiOw0KKyAgaWYgKG1fcExvY2FsZURhdGEpIHsNCisgICAgQ1hNTF9FbGVtZW50KiBwQ2hpbGQgPSBtX3BMb2NhbGVEYXRhLT5HZXRFbGVtZW50KCIiLCAiY2FsZW5kYXJTeW1ib2xzIik7DQorICAgIGlmIChwQ2hpbGQpIHsNCisgICAgICBDWE1MX0VsZW1lbnQqIHBTeW1ib2xOYW1lcyA9IHBDaGlsZC0+R2V0RWxlbWVudCgiIiwgcHN0clN5bWJvbE5hbWVzKTsNCisgICAgICBpZiAocFN5bWJvbE5hbWVzKSB7DQorICAgICAgICBpZiAocFN5bWJvbE5hbWVzLT5HZXRBdHRySW50ZWdlcigiYWJiciIpICE9IGJBYmJyKSB7DQorICAgICAgICAgIHBTeW1ib2xOYW1lcyA9IHBDaGlsZC0+R2V0RWxlbWVudCgiIiwgcHN0clN5bWJvbE5hbWVzLCAxKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwU3ltYm9sTmFtZXMgJiYgcFN5bWJvbE5hbWVzLT5HZXRBdHRySW50ZWdlcigiYWJiciIpID09IGJBYmJyKSB7DQorICAgICAgICAgIENYTUxfRWxlbWVudCogcFN5bWJvbE5hbWUgPQ0KKyAgICAgICAgICAgICAgcFN5bWJvbE5hbWVzLT5HZXRFbGVtZW50KCIiLCBzeW1ib2wsIGluZGV4KTsNCisgICAgICAgICAgaWYgKHBTeW1ib2xOYW1lKSB7DQorICAgICAgICAgICAgd3NTeW1ib2xOYW1lID0gcFN5bWJvbE5hbWUtPkdldENvbnRlbnQoMCk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiB3c1N5bWJvbE5hbWU7DQorfQ0KK3ZvaWQgQ1hGQV9YTUxMb2NhbGU6OkdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Qgew0KKyAgQ1hNTF9FbGVtZW50KiBwRWxlbWVudCA9IG1fcExvY2FsZURhdGEtPkdldEVsZW1lbnQoIiIsICJkYXRlUGF0dGVybnMiKTsNCisgIGlmIChwRWxlbWVudCA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzTmFtZTsNCisgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX1Nob3J0Og0KKyAgICAgIHdzTmFtZSA9IEwic2hvcnQiOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRGVmYXVsdDoNCisgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bToNCisgICAgICB3c05hbWUgPSBMIm1lZCI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9GdWxsOg0KKyAgICAgIHdzTmFtZSA9IEwiZnVsbCI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9Mb25nOg0KKyAgICAgIHdzTmFtZSA9IEwibG9uZyI7DQorICAgICAgYnJlYWs7DQorICB9DQorICBHZXRQYXR0ZXJuKHBFbGVtZW50LCAiZGF0ZVBhdHRlcm4iLCB3c05hbWUsIHdzUGF0dGVybik7DQorfQ0KK3ZvaWQgQ1hGQV9YTUxMb2NhbGU6OkdldFRpbWVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Qgew0KKyAgQ1hNTF9FbGVtZW50KiBwRWxlbWVudCA9IG1fcExvY2FsZURhdGEtPkdldEVsZW1lbnQoIiIsICJ0aW1lUGF0dGVybnMiKTsNCisgIGlmIChwRWxlbWVudCA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzTmFtZTsNCisgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX1Nob3J0Og0KKyAgICAgIHdzTmFtZSA9IEwic2hvcnQiOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRGVmYXVsdDoNCisgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bToNCisgICAgICB3c05hbWUgPSBMIm1lZCI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9GdWxsOg0KKyAgICAgIHdzTmFtZSA9IEwiZnVsbCI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9Mb25nOg0KKyAgICAgIHdzTmFtZSA9IEwibG9uZyI7DQorICAgICAgYnJlYWs7DQorICB9DQorICBHZXRQYXR0ZXJuKHBFbGVtZW50LCAidGltZVBhdHRlcm4iLCB3c05hbWUsIHdzUGF0dGVybik7DQorfQ0KK3ZvaWQgQ1hGQV9YTUxMb2NhbGU6OkdldE51bVBhdHRlcm4oRlhfTE9DQUxFTlVNU1VCQ0FURUdPUlkgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdCB7DQorICBDWE1MX0VsZW1lbnQqIHBFbGVtZW50ID0gbV9wTG9jYWxlRGF0YS0+R2V0RWxlbWVudCgiIiwgIm51bWJlclBhdHRlcm5zIik7DQorICBpZiAocEVsZW1lbnQgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgIGNhc2UgRlhfTE9DQUxFTlVNUEFUVEVSTl9QZXJjZW50Og0KKyAgICAgIHdzUGF0dGVybiA9IGdfRlhfUGVyY2VudDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWF9MT0NBTEVOVU1QQVRURVJOX0N1cnJlbmN5Og0KKyAgICAgIHdzUGF0dGVybiA9IGdfRlhfQ3VycmVuY3k7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFTlVNUEFUVEVSTl9EZWNpbWFsOg0KKyAgICAgIHdzUGF0dGVybiA9IGdfRlhfRGVjaW1hbDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWF9MT0NBTEVOVU1QQVRURVJOX0ludGVnZXI6DQorICAgICAgd3NQYXR0ZXJuID0gZ19GWF9JbnRlZ2VyOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfWE1MTG9jYWxlOjpHZXRQYXR0ZXJuKENYTUxfRWxlbWVudCogcEVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzVGFnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdCB7DQorICBpbnQzMl90IGlDb3VudCA9IHBFbGVtZW50LT5Db3VudEVsZW1lbnRzKCIiLCBic1RhZyk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBDWE1MX0VsZW1lbnQqIHBDaGlsZCA9IHBFbGVtZW50LT5HZXRFbGVtZW50KCIiLCBic1RhZywgaSk7DQorICAgIGlmIChwQ2hpbGQtPkdldEF0dHJWYWx1ZSgibmFtZSIpID09IHdzTmFtZSkgew0KKyAgICAgIHdzUGF0dGVybiA9IHBDaGlsZC0+R2V0Q29udGVudCgwKTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgIH0NCit9DQorQ1hGQV9Ob2RlTG9jYWxlOjpDWEZBX05vZGVMb2NhbGUoQ1hGQV9Ob2RlKiBwTG9jYWxlKSB7DQorICBtX3BMb2NhbGUgPSBwTG9jYWxlOw0KK30NCitDWEZBX05vZGVMb2NhbGU6On5DWEZBX05vZGVMb2NhbGUoKSB7fQ0KK3ZvaWQgQ1hGQV9Ob2RlTG9jYWxlOjpSZWxlYXNlKCkgew0KKyAgZGVsZXRlIHRoaXM7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfTm9kZUxvY2FsZTo6R2V0TmFtZSgpIHsNCisgIHJldHVybiBtX3BMb2NhbGUgPyBtX3BMb2NhbGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSkgOiBOVUxMOw0KK30NCit2b2lkIENYRkFfTm9kZUxvY2FsZTo6R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NOdW1TeW1ib2wpIGNvbnN0IHsNCisgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfRGVjaW1hbDoNCisgICAgICB3c051bVN5bWJvbCA9IEdldFN5bWJvbChYRkFfRUxFTUVOVF9OdW1iZXJTeW1ib2xzLCBGWF9XU1RSQyhMImRlY2ltYWwiKSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFTlVNU1lNQk9MX0dyb3VwaW5nOg0KKyAgICAgIHdzTnVtU3ltYm9sID0gR2V0U3ltYm9sKFhGQV9FTEVNRU5UX051bWJlclN5bWJvbHMsIEZYX1dTVFJDKEwiZ3JvdXBpbmciKSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFTlVNU1lNQk9MX1BlcmNlbnQ6DQorICAgICAgd3NOdW1TeW1ib2wgPSBHZXRTeW1ib2woWEZBX0VMRU1FTlRfTnVtYmVyU3ltYm9scywgRlhfV1NUUkMoTCJwZXJjZW50IikpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51czoNCisgICAgICB3c051bVN5bWJvbCA9IEdldFN5bWJvbChYRkFfRUxFTUVOVF9OdW1iZXJTeW1ib2xzLCBGWF9XU1RSQyhMIm1pbnVzIikpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9aZXJvOg0KKyAgICAgIHdzTnVtU3ltYm9sID0gR2V0U3ltYm9sKFhGQV9FTEVNRU5UX051bWJlclN5bWJvbHMsIEZYX1dTVFJDKEwiemVybyIpKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfQ3VycmVuY3lTeW1ib2w6DQorICAgICAgd3NOdW1TeW1ib2wgPSBHZXRTeW1ib2woWEZBX0VMRU1FTlRfQ3VycmVuY3lTeW1ib2xzLCBGWF9XU1RSQyhMInN5bWJvbCIpKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfQ3VycmVuY3lOYW1lOg0KKyAgICAgIHdzTnVtU3ltYm9sID0NCisgICAgICAgICAgR2V0U3ltYm9sKFhGQV9FTEVNRU5UX0N1cnJlbmN5U3ltYm9scywgRlhfV1NUUkMoTCJpc29uYW1lIikpOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZUxvY2FsZTo6R2V0RGF0ZVRpbWVTeW1ib2xzKENGWF9XaWRlU3RyaW5nJiB3c0R0U3ltYm9sKSBjb25zdCB7DQorICBDWEZBX05vZGUqIHBTeW1ib2xzID0NCisgICAgICBtX3BMb2NhbGUgPyBtX3BMb2NhbGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0RhdGVUaW1lU3ltYm9scykgOiBOVUxMOw0KKyAgd3NEdFN5bWJvbCA9IHBTeW1ib2xzID8gcFN5bWJvbHMtPkdldENvbnRlbnQoKSA6IENGWF9XaWRlU3RyaW5nKCk7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlTG9jYWxlOjpHZXRNb250aE5hbWUoaW50MzJfdCBuTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NNb250aE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBYmJyKSBjb25zdCB7DQorICB3c01vbnRoTmFtZSA9IEdldENhbGVuZGFyU3ltYm9sKFhGQV9FTEVNRU5UX01vbnRoTmFtZXMsIG5Nb250aCwgYkFiYnIpOw0KK30NCit2b2lkIENYRkFfTm9kZUxvY2FsZTo6R2V0RGF5TmFtZShpbnQzMl90IG5XZWVrLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0RheU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWJicikgY29uc3Qgew0KKyAgd3NEYXlOYW1lID0gR2V0Q2FsZW5kYXJTeW1ib2woWEZBX0VMRU1FTlRfRGF5TmFtZXMsIG5XZWVrLCBiQWJicik7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlTG9jYWxlOjpHZXRNZXJpZGllbU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzTWVyaWRpZW1OYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQU0pIGNvbnN0IHsNCisgIHdzTWVyaWRpZW1OYW1lID0NCisgICAgICBHZXRDYWxlbmRhclN5bWJvbChYRkFfRUxFTUVOVF9NZXJpZGllbU5hbWVzLCBiQU0gPyAwIDogMSwgRkFMU0UpOw0KK30NCit2b2lkIENYRkFfTm9kZUxvY2FsZTo6R2V0VGltZVpvbmUoRlhfVElNRVpPTkUmIHR6KSBjb25zdCB7DQorICBJWEZBX1RpbWVab25lUHJvdmlkZXIqIHBQcm92aWRlciA9IElYRkFfVGltZVpvbmVQcm92aWRlcjo6R2V0KCk7DQorICBwUHJvdmlkZXItPkdldFRpbWVab25lKHR6KTsNCit9DQordm9pZCBDWEZBX05vZGVMb2NhbGU6OkdldEVyYU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzRXJhTmFtZSwgRlhfQk9PTCBiQUQpIGNvbnN0IHsNCisgIHdzRXJhTmFtZSA9IEdldENhbGVuZGFyU3ltYm9sKFhGQV9FTEVNRU5UX0VyYU5hbWVzLCBiQUQgPyAxIDogMCwgRkFMU0UpOw0KK30NCit2b2lkIENYRkFfTm9kZUxvY2FsZTo6R2V0RGF0ZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Qgew0KKyAgc3dpdGNoIChlVHlwZSkgew0KKyAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnQ6DQorICAgICAgd3NQYXR0ZXJuID0gR2V0U3ltYm9sKFhGQV9FTEVNRU5UX0RhdGVQYXR0ZXJucywgRlhfV1NUUkMoTCJzaG9ydCIpKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bToNCisgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0RlZmF1bHQ6DQorICAgICAgd3NQYXR0ZXJuID0gR2V0U3ltYm9sKFhGQV9FTEVNRU5UX0RhdGVQYXR0ZXJucywgRlhfV1NUUkMoTCJtZWQiKSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9GdWxsOg0KKyAgICAgIHdzUGF0dGVybiA9IEdldFN5bWJvbChYRkFfRUxFTUVOVF9EYXRlUGF0dGVybnMsIEZYX1dTVFJDKEwiZnVsbCIpKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0xvbmc6DQorICAgICAgd3NQYXR0ZXJuID0gR2V0U3ltYm9sKFhGQV9FTEVNRU5UX0RhdGVQYXR0ZXJucywgRlhfV1NUUkMoTCJsb25nIikpOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZUxvY2FsZTo6R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Qgew0KKyAgc3dpdGNoIChlVHlwZSkgew0KKyAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnQ6DQorICAgICAgd3NQYXR0ZXJuID0gR2V0U3ltYm9sKFhGQV9FTEVNRU5UX1RpbWVQYXR0ZXJucywgRlhfV1NUUkMoTCJzaG9ydCIpKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bToNCisgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0RlZmF1bHQ6DQorICAgICAgd3NQYXR0ZXJuID0gR2V0U3ltYm9sKFhGQV9FTEVNRU5UX1RpbWVQYXR0ZXJucywgRlhfV1NUUkMoTCJtZWQiKSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9GdWxsOg0KKyAgICAgIHdzUGF0dGVybiA9IEdldFN5bWJvbChYRkFfRUxFTUVOVF9UaW1lUGF0dGVybnMsIEZYX1dTVFJDKEwiZnVsbCIpKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0xvbmc6DQorICAgICAgd3NQYXR0ZXJuID0gR2V0U3ltYm9sKFhGQV9FTEVNRU5UX1RpbWVQYXR0ZXJucywgRlhfV1NUUkMoTCJsb25nIikpOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZUxvY2FsZTo6R2V0TnVtUGF0dGVybihGWF9MT0NBTEVOVU1TVUJDQVRFR09SWSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdCB7DQorICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgIGNhc2UgRlhfTE9DQUxFTlVNUEFUVEVSTl9QZXJjZW50Og0KKyAgICAgIHdzUGF0dGVybiA9IGdfRlhfUGVyY2VudDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWF9MT0NBTEVOVU1QQVRURVJOX0N1cnJlbmN5Og0KKyAgICAgIHdzUGF0dGVybiA9IGdfRlhfQ3VycmVuY3k7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFTlVNUEFUVEVSTl9EZWNpbWFsOg0KKyAgICAgIHdzUGF0dGVybiA9IGdfRlhfRGVjaW1hbDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWF9MT0NBTEVOVU1QQVRURVJOX0ludGVnZXI6DQorICAgICAgd3NQYXR0ZXJuID0gZ19GWF9JbnRlZ2VyOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KK30NCitDWEZBX05vZGUqIENYRkFfTm9kZUxvY2FsZTo6R2V0Tm9kZUJ5TmFtZShDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpIGNvbnN0IHsNCisgIENYRkFfTm9kZSogcENoaWxkID0NCisgICAgICBwUGFyZW50ID8gcFBhcmVudC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpIDogTlVMTDsNCisgIHdoaWxlIChwQ2hpbGQpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDaGlsZDsNCisgICAgaWYgKHBDaGlsZC0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NDaGlsZCkpIHsNCisgICAgICBpZiAod3NDaGlsZCA9PSB3c05hbWUpIHsNCisgICAgICAgIHJldHVybiBwQ2hpbGQ7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHBDaGlsZCA9IHBDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX05vZGVMb2NhbGU6OkdldFN5bWJvbCgNCisgICAgWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3ltYm9sX3R5cGUpIGNvbnN0IHsNCisgIENYRkFfTm9kZSogcFN5bWJvbHMgPSBtX3BMb2NhbGUgPyBtX3BMb2NhbGUtPkdldENoaWxkKDAsIGVFbGVtZW50KSA6IE5VTEw7DQorICBDWEZBX05vZGUqIHBTeW1ib2wgPSBHZXROb2RlQnlOYW1lKHBTeW1ib2xzLCBzeW1ib2xfdHlwZSk7DQorICByZXR1cm4gcFN5bWJvbCA/IHBTeW1ib2wtPkdldENvbnRlbnQoKSA6IENGWF9XaWRlU3RyaW5nKCk7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfTm9kZUxvY2FsZTo6R2V0Q2FsZW5kYXJTeW1ib2woWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBYmJyKSBjb25zdCB7DQorICBDWEZBX05vZGUqIHBDYWxlbmRhciA9DQorICAgICAgbV9wTG9jYWxlID8gbV9wTG9jYWxlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9DYWxlbmRhclN5bWJvbHMpIDogTlVMTDsNCisgIGlmIChwQ2FsZW5kYXIpIHsNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBDYWxlbmRhci0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoZUVsZW1lbnQpOw0KKyAgICBmb3IgKDsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5leHRTYW1lQ2xhc3NTaWJsaW5nKGVFbGVtZW50KSkgew0KKyAgICAgIGlmIChwTm9kZS0+R2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX0FiYnIpID09IGJBYmJyKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBTeW1ib2wgPSBwTm9kZS0+R2V0Q2hpbGQoaW5kZXgsIFhGQV9FTEVNRU5UX1VOS05PV04pOw0KKyAgICAgICAgcmV0dXJuIHBTeW1ib2wgPyBwU3ltYm9sLT5HZXRDb250ZW50KCkgOiBDRlhfV2lkZVN0cmluZygpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sb2NhbGUuaCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sb2NhbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWE3MTM2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xvY2FsZS5oCkBAIC0wLDAgKzEsODggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfRlhGQV9MT0NBTEVfSA0KKyNkZWZpbmUgX0ZYRkFfTE9DQUxFX0gNCitjbGFzcyBDWEZBX1hNTExvY2FsZSA6IHB1YmxpYyBJRlhfTG9jYWxlIHsNCisgcHVibGljOg0KKyAgQ1hGQV9YTUxMb2NhbGUoQ1hNTF9FbGVtZW50KiBwTG9jYWxlRGF0YSk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpOw0KKyAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBHZXROYW1lKCk7DQorICB2aXJ0dWFsIHZvaWQgR2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c051bVN5bWJvbCkgY29uc3Q7DQorDQorICB2aXJ0dWFsIHZvaWQgR2V0RGF0ZVRpbWVTeW1ib2xzKENGWF9XaWRlU3RyaW5nJiB3c0R0U3ltYm9sKSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBHZXRNb250aE5hbWUoaW50MzJfdCBuTW9udGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c01vbnRoTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQWJiciA9IFRSVUUpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEdldERheU5hbWUoaW50MzJfdCBuV2VlaywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0RheU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBYmJyID0gVFJVRSkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0TWVyaWRpZW1OYW1lKENGWF9XaWRlU3RyaW5nJiB3c01lcmlkaWVtTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQU0gPSBUUlVFKSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBHZXRUaW1lWm9uZShGWF9USU1FWk9ORSYgdHopIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEdldEVyYU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzRXJhTmFtZSwgRlhfQk9PTCBiQUQgPSBUUlVFKSBjb25zdDsNCisNCisgIHZpcnR1YWwgdm9pZCBHZXREYXRlUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEdldFRpbWVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0TnVtUGF0dGVybihGWF9MT0NBTEVOVU1TVUJDQVRFR09SWSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0Ow0KKw0KKyBwcm90ZWN0ZWQ6DQorICB+Q1hGQV9YTUxMb2NhbGUoKTsNCisgIHZvaWQgR2V0UGF0dGVybihDWE1MX0VsZW1lbnQqIHBFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNUYWcsDQorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsDQorICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Q7DQorICBDRlhfV2lkZVN0cmluZyBHZXRDYWxlbmRhclN5bWJvbChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN5bWJvbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFiYnIpIGNvbnN0Ow0KKw0KKyBwcml2YXRlOg0KKyAgQ1hNTF9FbGVtZW50KiBtX3BMb2NhbGVEYXRhOw0KK307DQorY2xhc3MgQ1hGQV9Ob2RlTG9jYWxlIDogcHVibGljIElGWF9Mb2NhbGUgew0KKyBwdWJsaWM6DQorICBDWEZBX05vZGVMb2NhbGUoQ1hGQV9Ob2RlKiBwTG9jYWxlKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCk7DQorICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIEdldE5hbWUoKTsNCisgIHZpcnR1YWwgdm9pZCBHZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0wgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTnVtU3ltYm9sKSBjb25zdDsNCisNCisgIHZpcnR1YWwgdm9pZCBHZXREYXRlVGltZVN5bWJvbHMoQ0ZYX1dpZGVTdHJpbmcmIHdzRHRTeW1ib2wpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEdldE1vbnRoTmFtZShpbnQzMl90IG5Nb250aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTW9udGhOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBYmJyID0gVFJVRSkgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0RGF5TmFtZShpbnQzMl90IG5XZWVrLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF5TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFiYnIgPSBUUlVFKSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBHZXRNZXJpZGllbU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzTWVyaWRpZW1OYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBTSA9IFRSVUUpIGNvbnN0Ow0KKyAgdmlydHVhbCB2b2lkIEdldFRpbWVab25lKEZYX1RJTUVaT05FJiB0eikgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0RXJhTmFtZShDRlhfV2lkZVN0cmluZyYgd3NFcmFOYW1lLCBGWF9CT09MIGJBRCA9IFRSVUUpIGNvbnN0Ow0KKw0KKyAgdmlydHVhbCB2b2lkIEdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Q7DQorICB2aXJ0dWFsIHZvaWQgR2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdDsNCisgIHZpcnR1YWwgdm9pZCBHZXROdW1QYXR0ZXJuKEZYX0xPQ0FMRU5VTVNVQkNBVEVHT1JZIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Q7DQorDQorIHByb3RlY3RlZDoNCisgIH5DWEZBX05vZGVMb2NhbGUoKTsNCisgIENYRkFfTm9kZSogR2V0Tm9kZUJ5TmFtZShDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpIGNvbnN0Ow0KKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0U3ltYm9sKFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3ltYm9sX3R5cGUpIGNvbnN0Ow0KKyAgQ0ZYX1dpZGVTdHJpbmcgR2V0Q2FsZW5kYXJTeW1ib2woWEZBX0VMRU1FTlQgZUVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJBYmJyKSBjb25zdDsNCisNCisgIENYRkFfTm9kZSogbV9wTG9jYWxlOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xvY2FsZW1nci5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfbG9jYWxlbWdyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGIyMDY2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xvY2FsZW1nci5jcHAKQEAgLTAsMCArMSwxMzA1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhjcnQvZnhfeG1sLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3V0aWxzLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9vYmplY3QuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY3VtZW50LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9wYXJzZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3NjcmlwdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jZGF0YS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jbGF5b3V0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9sb2NhbGVtZ3IuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2ZtMmpzYXBpLmgiDQorI2luY2x1ZGUgInhmYV9sb2NhbGUuaCINCisNCitjb25zdCB1aW50OF90IGdfZW5VU19Mb2NhbGVbXSA9IHsNCisgICAgMHg3OCwgMHg5QywgMHg5NSwgMHg1NiwgMHhEMSwgMHg2RSwgMHg5QiwgMHgzMCwgMHgxNCwgMHg3RCwgMHg5RiwgMHhCNCwNCisgICAgMHg3RiwgMHg0MCwgMHhENiwgMHgyQSwgMHhCNSwgMHg1MiwgMHg1NiwgMHg2RiwgMHg4RiwgMHhBOSwgMHg4OCwgMHhBNSwNCisgICAgMHg2QywgMHgyNCwgMHg5QiwgMHgzQSwgMHhEMSwgMHg1NSwgMHgyMiwgMHg1NSwgMHhCNSwgMHhCRSwgMHg0QywgMHgwRSwNCisgICAgMHhEQywgMHgwNSwgMHgzNCwgMHhCMCwgMHgyMywgMHg4MywgMHgzNywgMHgwNSwgMHhFRCwgMHhFMywgMHg2NywgMHgwNywNCisgICAgMHhDMywgMHhDMCwgMHhGNiwgMHgyNCwgMHhDMiwgMHg0QiwgMHg3QywgMHhDRiwgMHgzRCwgMHhFNywgMHhFNiwgMHhERSwNCisgICAgMHg2MywgMHgzMCwgMHg4NCwgMHgyNSwgMHg0RiwgMHg2OSwgMHgwOSwgMHgwMSwgMHhBMywgMHgxNSwgMHhBQywgMHgxMCwNCisgICAgMHhCMCwgMHhFRiwgMHg0RiwgMHgwOSwgMHgwQSwgMHgzMiwgMHhBOCwgMHhEMywgMHgxNSwgMHhEQSwgMHhCMCwgMHg0MywNCisgICAgMHg1OSwgMHhENCwgMHhGOSwgMHhGNSwgMHhCQSwgMHgwMiwgMHg1MSwgMHhBNCwgMHhGNCwgMHgwNiwgMHg5MSwgMHg1MCwNCisgICAgMHg1MywgMHg1OSwgMHg0NiwgMHg0NSwgMHg3MiwgMHhBQSwgMHhGNiwgMHhCQywgMHhBQywgMHg4RCwgMHhFQSwgMHgyMCwNCisgICAgMHhFMCwgMHhDMCwgMHg0NSwgMHg0MSwgMHg5OSwgMHg2MiwgMHg1NCwgMHg5QywgMHgzNSwgMHhGOSwgMHg4MywgMHg4MiwNCisgICAgMHg2QiwgMHhCMywgMHgyNiwgMHhGNywgMHg5NCwgMHg0OSwgMHgyQSwgMHg0RSwgMHgyMSwgMHhFRSwgMHhDMiwgMHhENywNCisgICAgMHhBRiwgMHgwQywgMHhCRSwgMHg4NSwgMHhCRCwgMHhGMCwgMHgyNiwgMHg2MiwgMHgyQSwgMHhEMiwgMHhEQywgMHg0MSwNCisgICAgMHhENywgMHg0NywgMHg1MSwgMHg5NCwgMHgxRSwgMHhBRSwgMHhBQiwgMHhCRiwgMHg5NywgMHgwQywgMHgzQywgMHg2MCwNCisgICAgMHhFOSwgMHgzMiwgMHhENywgMHhGMiwgMHgyMCwgMHhFQiwgMHhDNiwgMHg4MSwgMHgxMywgMHgzOCwgMHgzNiwgMHg1MCwNCisgICAgMHhFRCwgMHg0MSwgMHgzOCwgMHg5OSwgMHhBRiwgMHg2OSwgMHhDMywgMHg3RCwgMHhGOCwgMHgwMywgMHhGRiwgMHhFNSwNCisgICAgMHgxNywgMHg0NCwgMHg5MCwgMHhEQSwgMHgwOSwgMHgzQywgMHhCMiwgMHhBOCwgMHhFNywgMHg5RCwgMHhBMywgMHg4MCwNCisgICAgMHhFRSwgMHhGNywgMHg2MiwgMHg4NSwgMHhERSwgMHhBMywgMHg5MSwgMHg3MywgMHgzRSwgMHhENywgMHg3QywgMHg4NiwNCisgICAgMHhGOSwgMHhFQywgMHg5QSwgMHg2QiwgMHg5NiwgMHhDRiwgMHgyQiwgMHg5RiwgMHg1NSwgMHgzRSwgMHg5RiwgMHg3QywNCisgICAgMHgwRSwgMHhGOSwgMHhEQywgMHhGMSwgMHgxOSwgMHhGMywgMHg3RiwgMHg0RiwgMHgzMiwgMHg3QSwgMHgzMiwgMHhCNywNCisgICAgMHg5MCwgMHg1QSwgMHg5MSwgMHg0NCwgMHhBQSwgMHg1QiwgMHg0RSwgMHg3NSwgMHhBRSwgMHhENywgMHg1RCwgMHg5MiwNCisgICAgMHhDNCwgMHhEQywgMHg4MSwgMHg3NiwgMHgxMiwgMHg2QSwgMHgxQiwgMHg3QiwgMHg4NiwgMHg4QywgMHhCOSwgMHhFOCwNCisgICAgMHgyRSwgMHg5NywgMHhDMiwgMHgwMSwgMHhCNywgMHhBMiwgMHhCMCwgMHhBMSwgMHg4NCwgMHgzNiwgMHg1MiwgMHg4QywNCisgICAgMHg0MSwgMHgzQywgMHhGNCwgMHgzNSwgMHhFQSwgMHg3MSwgMHhCNCwgMHg2QiwgMHhBNiwgMHg1OSwgMHhCQiwgMHg1MywNCisgICAgMHhCQiwgMHg0RCwgMHhCQiwgMHg0NSwgMHhCQiwgMHgzOSwgMHhCQiwgMHgyRiwgMHhCQiwgMHgyOSwgMHg3RiwgMHgzRiwNCisgICAgMHhGQSwgMHgyMSwgMHhDRCwgMHgwQSwgMHhBOCwgMHhGQSwgMHg2NywgMHhDRiwgMHg4NCwgMHg2NCwgMHgxRCwgMHgyQiwNCisgICAgMHg3NywgMHhGQiwgMHg2MCwgMHhDNCwgMHgyMywgMHg4RiwgMHg1NiwgMHgwMiwgMHg0RiwgMHgyQiwgMHgyOCwgMHgwNCwNCisgICAgMHgwNCwgMHgzNSwgMHhENSwgMHhENCwgMHg4QSwgMHg3QywgMHhGOCwgMHgxOCwgMHg2MiwgMHhGRCwgMHhEQiwgMHgyNSwNCisgICAgMHhDOCwgMHgzQSwgMHgxQSwgMHg0MiwgMHgzQywgMHgxMCwgMHg3NSwgMHg2MCwgMHg5RCwgMHgxMSwgMHg1RCwgMHhFMywNCisgICAgMHgwRCwgMHgzQywgMHhEMiwgMHhBNiwgMHgwMSwgMHhDMSwgMHhDRSwgMHg3QiwgMHgzQSwgMHg0NCwgMHhFNiwgMHgwMCwNCisgICAgMHhGOSwgMHgyMSwgMHhDQiwgMHgxMiwgMHg5MSwgMHg4RCwgMHhCQSwgMHgxNiwgMHg0MSwgMHhBQywgMHhBRSwgMHgyMCwNCisgICAgMHg1QSwgMHgwNCwgMHhERiwgMHhENCwgMHhBNSwgMHgyNywgMHgxQywgMHhCOCwgMHg1NiwgMHgyMSwgMHgyMywgMHgyRCwNCisgICAgMHgzOSwgMHgzQiwgMHgyMCwgMHg3MiwgMHhBMSwgMHhBOCwgMHg4MiwgMHhFQywgMHhBQywgMHhCOSwgMHg0MCwgMHg1MiwNCisgICAgMHhFNywgMHg1QywgMHgzNCwgMHg0QSwgMHg4NCwgMHgyMywgMHhFQywgMHhFMSwgMHhFMywgMHhDOSwgMHg4NCwgMHgwQSwNCisgICAgMHg2OCwgMHg4QSwgMHg2QSwgMHgzNCwgMHhGMSwgMHgyOCwgMHg5QSwgMHg0QywgMHg5QywgMHhERiwgMHhDNSwgMHhGMSwNCisgICAgMHg1RCwgMHg5MiwgMHgwNCwgMHhFQiwgMHhFMCwgMHgyNSwgMHhDNCwgMHgyMywgMHg5MiwgMHg1NSwgMHg2MSwgMHgzMiwNCisgICAgMHhFQSwgMHg2NSwgMHg5QSwgMHhGMywgMHhBNCwgMHg4MywgMHg2NCwgMHg4NiwgMHhDMCwgMHhDQywgMHhBOSwgMHgyNSwNCisgICAgMHgxRSwgMHgzRSwgMHg5RSwgMHhDQywgMHg2NSwgMHg4QywgMHhEQSwgMHgyOSwgMHhBQywgMHhERiwgMHhFQywgMHg0RiwNCisgICAgMHhBNywgMHgzOCwgMHhGQiwgMHhGOSwgMHhCOSwgMHhBQSwgMHg5MywgMHg0RCwgMHhCNCwgMHhGRCwgMHhGRCwgMHg0QywNCisgICAgMHhGMywgMHgyRiwgMHhFRCwgMHg0QiwgMHg2NywgMHhDRSwgMHg5OCwgMHhBNCwgMHg3NCwgMHg0QywgMHhFQSwgMHg1MywNCisgICAgMHhGMSwgMHg5RiwgMHg0MywgMHg5MywgMHhEOCwgMHhCNCwgMHhBMiwgMHgzMCwgMHhGRCwgMHhFMiwgMHg0MSwgMHhBNCwNCisgICAgMHg1RCwgMHhCNCwgMHhFRCwgMHhGMiwgMHhCNiwgMHg2RCwgMHhEQiwgMHgxMCwgMHg0RiwgMHg3OCwgMHg0RSwgMHgyMSwNCisgICAgMHgyMywgMHg0QywgMHhBNSwgMHgxMCwgMHhDMCwgMHhEMiwgMHgxMywgMHgyMiwgMHg2RiwgMHgzQSwgMHhFOSwgMHg3MiwNCisgICAgMHhGOSwgMHhFNywgMHg3QSwgMHg1OCwgMHhERSwgMHhDQywgMHhBQywgMHg3MiwgMHgwNCwgMHg5MSwgMHgwMiwgMHg2QiwNCisgICAgMHhDQywgMHhERiwgMHg1RiwgMHg3OSwgMHg1NCwgMHhEOCwgMHg5QSwgMHg2MiwgMHgyOCwgMHhENCwgMHgwRiwgMHgzQSwNCisgICAgMHgwOSwgMHg0RCwgMHhEOSwgMHgwQywgMHhEMiwgMHhBMiwgMHhBMiwgMHg2QSwgMHhGMywgMHg2RiwgMHg3QiwgMHg3RCwNCisgICAgMHg5NywgMHhCNiwgMHhENSwgMHhDMywgMHhCQiwgMHg5NSwgMHhDQiwgMHg2MywgMHhBMSwgMHgzNywgMHg3RSwgMHgzMSwNCisgICAgMHg4QiwgMHgzRiwgMHg3NCwgMHg3RCwgMHgzNSwgMHg4QiwgMHg1RSwgMHgxNSwgMHg0QywgMHhENiwgMHg4OCwgMHhCQywNCisgICAgMHg5RCwgMHg0NSwgMHg2RSwgMHg0MSwgMHg3MCwgMHg0NCwgMHhERSwgMHhCOSwgMHg1QywgMHgzQywgMHgxRCwgMHg1QiwNCisgICAgMHgyMSwgMHhGRCwgMHgxNiwgMHgwQywgMHg0RSwgMHg0QywgMHg4MSwgMHhGRSwgMHg2NiwgMHgzQiwgMHgwNywgMHg2QSwNCisgICAgMHg5QiwgMHhENCwgMHhBOSwgMHgzMSwgMHhDOSwgMHhCQiwgMHgyNSwgMHg4QywgMHhBMiwgMHhBOCwgMHhCOSwgMHg1RSwNCisgICAgMHgyMCwgMHhGMiwgMHg5NCwgMHg0NCwgMHhCMywgMHg0NSwgMHg2MywgMHhDQiwgMHg1RCwgMHgwOSwgMHhCNiwgMHg3QiwNCisgICAgMHhENSwgMHg1OCwgMHhGNywgMHg1NSwgMHhBNCwgMHg5NiwgMHg3RiwgMHgwMSwgMHg3NSwgMHgzNywgMHgxQiwgMHg4QiwNCit9Ow0KK2NvbnN0IHVpbnQ4X3QgZ19lbkdCX0xvY2FsZVtdID0gew0KKyAgICAweDc4LCAweDlDLCAweDk1LCAweDU2LCAweEQxLCAweDZFLCAweEQzLCAweDMwLCAweDE0LCAweDdELCAweDQ3LCAweEUyLA0KKyAgICAweDFGLCAweEEyLCAweDg4LCAweDQ5LCAweDIwLCAweDZELCAweDMzLCAweDNDLCAweDZFLCAweEVBLCAweDJDLCAweDc1LA0KKyAgICAweEVCLCAweEQ2LCAweDMyLCAweEM4LCAweEE4LCAweDQ4LCAweEM1LCAweEM0LCAweDVFLCAweDkwLCAweDlCLCAweDc4LA0KKyAgICAweDhELCAweDU5LCAweDYyLCAweDU3LCAweDRFLCAweENDLCAweDk0LCAweEZDLCAweDAyLCAweDlGLCAweEMwLCAweDIzLA0KKyAgICAweENGLCAweDA4LCAweEYxLCAweDAxLCAweEJDLCAweEYwLCAweDJGLCAweDQ4LCAweEZCLCAweDBDLCAweDZFLCAweDFBLA0KKyAgICAweDI3LCAweDRCLCAweDFDLCAweEFGLCAweDY0LCAweDc5LCAweDg5LCAweEVGLCAweEI5LCAweEU3LCAweERDLCAweERFLA0KKyAgICAweDdCLCAweDlDLCAweEI4LCAweDE5LCAweEM1LCAweDIyLCAweDIwLCAweDMxLCAweDc1LCAweDM4LCAweDQ5LCAweEU4LA0KKyAgICAweDkxLCAweDRCLCAweEY5LCAweEE3LCAweEU5LCAweEIxLCAweEVCLCAweDg0LCAweDM0LCAweDBELCAweDhFLCAweERDLA0KKyAgICAweEJCLCAweEFGLCAweEJGLCAweEVFLCAweDdFLCAweEZFLCAweDc4LCAweDBFLCAweEI3LCAweEJGLCAweERGLCAweDdFLA0KKyAgICAweEJGLCAweDcwLCAweEYxLCAweEE4LCAweDI0LCAweEYyLCAweDkwLCAweDQ4LCAweDNGLCAweDRGLCAweDk2LCAweDIyLA0KKyAgICAweDRFLCAweEI1LCAweDY2LCAweDI1LCAweEU5LCAweDRBLCAweDQ4LCAweDQ2LCAweDM4LCAweDMwLCAweDEyLCAweEMxLA0KKyAgICAweEIzLCAweEU4LCAweDAyLCAweEUwLCAweDU0LCAweEFGLCAweEYxLCAweDM5LCAweEUxLCAweDhBLCAweEM4LCAweDdDLA0KKyAgICAweDg0LCAweEFBLCAweEYwLCAweEU5LCAweDEzLCAweDhELCAweDlGLCAweEQxLCAweEE1LCAweEI0LCAweDI2LCAweDNDLA0KKyAgICAweDIyLCAweDgzLCAweEE4LCAweDg3LCAweDhFLCAweEQ3LCAweDkyLCAweEM1LCAweDE2LCAweDZFLCAweDVGLCAweDdGLA0KKyAgICAweEFFLCAweDM4LCAweEI1LCAweDgwLCAweDcxLCAweDlGLCAweDM5LCAweDU2LCAweDJCLCAweDk1LCAweDY2LCAweDNELA0KKyAgICAweEQ4LCAweEE3LCAweEVCLCAweDhDLCAweDI2LCAweDRCLCAweDJBLCAweDdCLCAweDk5LCAweDc3LCAweDQxLCAweDI2LA0KKyAgICAweDZDLCAweEY4LCAweDg1LCAweEY4LCAweDYyLCAweDE3LCAweDRDLCAweDY4LCAweDYwLCAweDI2LCAweDUwLCAweENCLA0KKyAgICAweEEyLCAweDlBLCAweEI3LCAweDg5LCAweDFDLCAweEIyLCAweDVDLCAweENBLCAweDIzLCAweEY3LCAweDk1LCAweERCLA0KKyAgICAweDcyLCAweENFLCAweEU2LCAweDlBLCAweENELCAweDMwLCAweDlCLCAweDVELCAweDQzLCAweENELCAweEIyLCAweDc5LA0KKyAgICAweDY1LCAweEIzLCAweENBLCAweEU2LCAweDkzLCAweENELCAweDIxLCAweDlCLCAweDNCLCAweDM2LCAweDYzLCAweDFFLA0KKyAgICAweEY2LCAweDI0LCAweDI0LCAweEI5LCAweDdFLCAweDg0LCAweDYwLCAweDg1LCAweDdELCAweDA1LCAweDhGLCAweDFDLA0KKyAgICAweDc0LCAweDVFLCAweEFFLCAweEFCLCAweDI0LCAweEY2LCAweDQ0LCAweDBGLCAweDVBLCAweDI4LCAweDlBLCAweDlBLA0KKyAgICAweEQ4LCAweDI1LCAweDBELCAweDc5LCAweDFGLCAweDVELCAweDQ0LCAweDRBLCAweEY2LCAweEMwLCAweDMzLCAweEM5LA0KKyAgICAweDRDLCAweEM4LCAweDI3LCAweDk5LCAweDkyLCAweDZELCAweDEwLCAweDM1LCAweDdELCAweEI1LCAweDdBLCAweDZDLA0KKyAgICAweEVELCAweDlBLCAweDZFLCAweEQ2LCAweEVDLCAweEQ0LCAweDZDLCAweEQzLCAweDZDLCAweEQxLCAweDZDLCAweENFLA0KKyAgICAweEVDLCAweENCLCAweDZDLCAweENBLCAweERFLCAweDRGLCAweDQyLCAweDYxLCAweDAyLCAweDQ2LCAweDkzLCAweEZBLA0KKyAgICAweERELCAweEQzLCAweDIxLCAweDFFLCAweDdCLCAweEUwLCAweDZFLCAweDFELCAweEI0LCAweDc4LCAweDc4LCAweDZFLA0KKyAgICAweDI0LCAweDUwLCAweEI3LCAweDAyLCAweDIwLCAweDU0LCAweDEyLCAweDVELCAweDBELCAweDU2LCAweEY4LCAweEY4LA0KKyAgICAweDY0LCAweDg0LCAweENBLCAweDdCLCAweDk1LCAweEMwLCAweEUzLCAweDQ5LCAweDEzLCAweEEyLCAweDg2LCAweDU4LA0KKyAgICAweDA2LCAweEM2LCAweDE5LCAweDUxLCAweDM1LCAweDlFLCAweEQxLCAweDM5LCAweEM5LCAweDMyLCAweDJBLCAweEY5LA0KKyAgICAweDY2LCAweDRGLCAweDlCLCAweDQ4LCAweDFGLCAweDIwLCAweEQ3LCAweDJBLCAweDhFLCAweDVELCAweDdDLCAweDBBLA0KKyAgICAweEQ3LCAweEFFLCAweDMzLCAweDcxLCAweDNDLCAweEI4LCAweDlDLCAweDhGLCAweDcwLCAweDk1LCAweDAzLCAweDM2LA0KKyAgICAweDU0LCAweEEzLCAweDhFLCAweDU2LCAweEM2LCAweDgyLCAweEFGLCAweDVDLCAweEZDLCAweDM4LCAweDRELCAweDQyLA0KKyAgICAweDQzLCAweDJELCAweDE5LCAweEFBLCAweDQ4LCAweDIzLCAweDIxLCAweDMzLCAweEQwLCAweDRDLCAweDkwLCAweEU3LA0KKyAgICAweDIxLCAweEFCLCAweDA2LCAweDc1LCAweDQ2LCAweDA0LCAweDIwLCAweDYzLCAweDQ5LCAweDZCLCAweEU0LCAweDU2LA0KKyAgICAweEQ0LCAweDE5LCAweDc5LCAweDM2LCAweDNCLCAweEY0LCAweEJDLCAweDQzLCAweERGLCAweDc3LCAweEFFLCAweDQ2LA0KKyAgICAweEE4LCAweEM1LCAweDMxLCAweDBBLCAweDc0LCAweDY2LCAweDdELCAweDk0LCAweDY0LCAweDMzLCAweDZBLCAweEFELA0KKyAgICAweDE4LCAweEMwLCAweEQ3LCAweDgzLCAweDZFLCAweDE0LCAweDNELCAweDNBLCAweEVBLCAweENDLCAweEE0LCAweDhELA0KKyAgICAweDVBLCAweDAwLCAweDU2LCAweEVGLCAweEY0LCAweDM0LCAweEY3LCAweEMyLCAweDlCLCAweDU5LCAweDkyLCAweEZBLA0KKyAgICAweEE3LCAweDkzLCAweEIzLCAweERCLCAweDRCLCAweDEyLCAweEJELCAweDI5LCAweEFFLCAweDJBLCAweDYzLCAweERBLA0KKyAgICAweDI0LCAweEQwLCAweDcxLCAweDU1LCAweDFFLCAweDg5LCAweEY3LCAweEVFLCAweDc0LCAweDYyLCAweERELCAweDA5LA0KKyAgICAweDYwLCAweEYwLCAweDM4LCAweDA2LCAweDJFLCAweDJFLCAweDc2LCAweDhCLCAweEUyLCAweDYwLCAweEJGLCAweDI4LA0KKyAgICAweDhBLCAweDExLCAweEVBLCAweEYwLCAweDdBLCAweDg1LCAweEI0LCAweDMwLCAweDUwLCAweDUyLCAweDUyLCAweDFFLA0KKyAgICAweEU0LCAweDJFLCAweDdFLCAweDU2LCAweDQ5LCAweDBGLCAweDBFLCAweDA2LCAweDJBLCAweEQ3LCAweDU0LCAweDA2LA0KKyAgICAweDk0LCAweDY3LCAweEZBLCAweDI3LCAweDc3LCAweDJDLCAweDJBLCAweDY0LCAweDc0LCAweERFLCAweDE0LCAweEFBLA0KKyAgICAweDg3LCAweEVCLCAweDg0LCAweEJBLCAweDZDLCAweDQ4LCAweDAzLCAweDk2LCAweDEwLCAweEQ4LCAweEVDLCAweEZELA0KKyAgICAweDVBLCAweDVGLCAweEE1LCAweDRELCAweDc1LCAweEYzLCAweDY3LCAweDJBLCAweEQ0LCAweDlBLCAweDk1LCAweDNCLA0KKyAgICAweEJELCAweDNCLCAweDg4LCAweERGLCAweDc0LCAweEJELCAweDMzLCAweDg4LCAweDlFLCAweDMwLCAweEFFLCAweDUyLA0KKyAgICAweDE3LCAweEVGLCAweDBELCAweDIyLCAweDE3LCAweDU0LCAweDBBLCAweDE3LCAweEJGLCAweEVDLCAweDczLCAweDUxLA0KKyAgICAweDc3LCAweDZDLCAweDQwLCAweDZBLCAweERCLCAweDFCLCAweDI3LCAweEJBLCAweDQwLCAweEZELCAweDdDLCAweDZELA0KKyAgICAweDAyLCAweDE3LCAweEZGLCAweEY5LCAweDBFLCAweEU3LCAweDQ0LCAweDg3LCAweEQwLCAweEFGLCAweEExLCAweDI1LA0KKyAgICAweDJDLCAweDE1LCAweEU1LCAweEMyLCAweEM1LCAweEQzLCAweEUzLCAweEY5LCAweDYwLCAweDUxLCAweERCLCAweEYzLA0KKyAgICAweEJFLCAweDA0LCAweDk5LCAweENELCAweDk2LCAweEVGLCAweDQyLCAweEJFLCAweEE2LCAweEQ3LCAweDI0LCAweDI4LA0KKyAgICAweDBGLCAweEJCLCAweDdBLCAweEE5LCAweDZCLCAweDc5LCAweDM5LCAweDdDLCAweERBLCAweDg0LCAweENFLCAweDFDLA0KKyAgICAweEFDLCAweDQwLCAweDZELCAweDY2LCAweDlELCAweDY2LCAweDlDLCAweDA5LCAweEZFLCAweDYwLCAweEZBLCAweDQ0LA0KKyAgICAweDI4LCAweEM5LCAweEE4LCAweDc0LCAweEZDLCAweDJDLCAweEI0LCAweEU2LCAweEM3LCAweDIxLCAweDdDLCAweDUwLA0KKyAgICAweDM4LCAweDczLCAweEY2LCAweDFGLCAweEMyLCAweDBDLCAweDNFLCAweDk2LCAweEU4LCAweEVELCAweDE2LCAweEMyLA0KKyAgICAweDU4LCAweDkyLCAweDI1LCAweEJDLCAweDJFLCAweDBGLCAweDEzLCAweDE2LCAweDExLCAweDYxLCAweEQ2LCAweEY0LA0KKyAgICAweDFCLCAweDUxLCAweEE4LCAweDFCLCAweEUyLCAweDRDLCAweDQ1LCAweDE2LCAweEIxLCAweEEwLCAweDlDLCAweDYzLA0KKyAgICAweEVGLCAweEMzLCAweDZCLCAweEM3LCAweERCLCAweDQ2LCAweDg1LCAweDkxLCAweDgzLCAweDQ4LCAweEQ0LCAweEQ0LA0KKyAgICAweEY3LCAweDVCLCAweDdFLCAweDE0LCAweDk4LCAweEFCLCAweDcyLCAweDMyLCAweEU3LCAweEVELCAweDE2LCAweDkyLA0KKyAgICAweDJGLCAweDA2LCAweDkwLCAweEJDLCAweDVDLCAweEYxLCAweEQ1LCAweDY3LCAweEIxLCAweEUxLCAweEU5LCAweEU2LA0KKyAgICAweEQwLCAweEZELCAweDlFLCAweDk1LCAweDUxLCAweEY1LCAweDE5LCAweDBCLCAweENCLCAweDdGLCAweDhFLCAweDY5LA0KKyAgICAweEFDLCAweEQwfTsNCitjb25zdCB1aW50OF90IGdfemhDTl9Mb2NhbGVbXSA9IHsNCisgICAgMHg3OCwgMHg5QywgMHhFRCwgMHg1NiwgMHg0MSwgMHg0RiwgMHhENCwgMHg0MCwgMHgxNCwgMHhCRSwgMHg5QiwgMHhGOCwNCisgICAgMHgxRiwgMHg5QSwgMHg0NiwgMHg1MiwgMHg0RCwgMHg1OCwgMHg0NiwgMHg4RiwgMHg5MCwgMHhEMiwgMHg2NCwgMHgwMywNCisgICAgMHgwOCwgMHgwNiwgMHhCQiwgMHgyMSwgMHg5NiwgMHg2OCwgMHhFMCwgMHg2MiwgMHhCQSwgMHhFRCwgMHhCMCwgMHgyRCwNCisgICAgMHg2QywgMHgzQiwgMHg2NCwgMHhCNiwgMHgwRCwgMHg2RSwgMHg0RiwgMHgxOCwgMHg4MiwgMHg4MiwgMHhDMiwgMHg0NSwNCisgICAgMHg4OSwgMHg5QSwgMHg4MCwgMHhFMSwgMHg2NCwgMHgzQywgMHgyOCwgMHg5RSwgMHg4QywgMHgwMSwgMHgyMiwgMHhGMSwNCisgICAgMHhDRiwgMHhCMCwgMHhDQiwgMHg5MSwgMHhCRiwgMHhFMCwgMHg5QiwgMHhFRCwgMHhCNCwgMHhCNCwgMHhERCwgMHhEOSwNCisgICAgMHhCNSwgMHgzRiwgMHhDMCwgMHgzRCwgMHhDRCwgMHhGQiwgMHhERSwgMHhGNywgMHg3RCwgMHhGMywgMHhERSwgMHhFQiwNCisgICAgMHg3NCwgMHhCNiwgMHg2QSwgMHg5MywgMHg1OCwgMHg2NiwgMHgxMywgMHg0QiwgMHhCRSwgMHhFOSwgMHhFMSwgMHg0OSwNCisgICAgMHgzOSwgMHg3MiwgMHg5RSwgMHg0RiwgMHhENSwgMHg2NCwgMHhDOSwgMHhDNiwgMHgyRCwgMHg2QiwgMHg1MiwgMHhCRSwNCisgICAgMHgzQywgMHgzRCwgMHhFOSwgMHg3RSwgMHg3OCwgMHg3RCwgMHhGNywgMHhFQSwgMHhDNywgMHhFNiwgMHhFNSwgMHhDNSwNCisgICAgMHhGQiwgMHhFQiwgMHhERiwgMHg3QiwgMHgxMCwgMHg3NywgMHgwRSwgMHgyRiwgMHhFRSwgMHhDOSwgMHg5QSwgMHhDQSwNCisgICAgMHgxNCwgMHhCRSwgMHg2RCwgMHg1MiwgMHhBMywgMHhFRCwgMHhENSwgMHg0OSwgMHhCMywgMHhDNSwgMHhDNSwgMHgwRCwNCisgICAgMHg4QSwgMHgxQiwgMHg4NCwgMHhCQSwgMHhBNiwgMHgwRiwgMHgwQywgMHg4RiwgMHhGOCwgMHg4MSwgMHg1MywgMHgwMywNCisgICAgMHhCOCwgMHhDNSwgMHhENywgMHhEQSwgMHhFNSwgMHhFOSwgMHg2NiwgMHhGNywgMHg2OCwgMHg0NywgMHg0NSwgMHg3MSwNCisgICAgMHg3NCwgMHhGQiwgMHg1NiwgMHgwMiwgMHg5RiwgMHhFRiwgMHgwOSwgMHhFMSwgMHhEMywgMHg1RCwgMHgxMSwgMHhEQywNCisgICAgMHgzOSwgMHgzQywgMHgxNCwgMHg5QiwgMHgxQywgMHgwOCwgMHhEOSwgMHhEQiwgMHgyNywgMHg2MiwgMHhFRiwgMHgyRCwNCisgICAgMHgzMSwgMHhGQiwgMHg5QiwgMHg5MCwgMHg3RCwgMHhGNiwgMHg1OSwgMHhDOCwgMHhERSwgMHg3RiwgMHgzOSwgMHgwMCwNCisgICAgMHgxRSwgMHhEMCwgMHgyOCwgMHhDQiwgMHgxNCwgMHg3QiwgMHg0NSwgMHg5OSwgMHgzMSwgMHgyNSwgMHhDNCwgMHg1RSwNCisgICAgMHgyNCwgMHg5OSwgMHhGNSwgMHgzQSwgMHg5RCwgMHg5NCwgMHgxRiwgMHhDOCwgMHhGRiwgMHhBNywgMHg1NywgMHg3QSwNCisgICAgMHg3QSwgMHhCNiwgMHhEOSwgMHhFNiwgMHgwNywgMHgwRSwgMHg1NiwgMHg1QSwgMHhGNywgMHhEMywgMHg3MSwgMHhGNywNCisgICAgMHhFOCwgMHhCOCwgMHhGQiwgMHhGMSwgMHg4QiwgMHg4QSwgMHg1OCwgMHgxOCwgMHhFNywgMHgzOSwgMHgwQSwgMHg3QiwNCisgICAgMHg4OCwgMHhEMCwgMHhGMywgMHgzRCwgMHgyMSwgMHg3NywgMHg1NywgMHg4MCwgMHhDMiwgMHgyNCwgMHg4NSwgMHgwRSwNCisgICAgMHgwNywgMHgyMiwgMHhFRSwgMHhGNiwgMHg0OSwgMHg4QSwgMHhBMiwgMHhCNCwgMHhDOCwgMHg0QywgMHhDMSwgMHg5OSwNCisgICAgMHg4NywgMHhERCwgMHg1MywgMHgxNSwgMHg2QSwgMHgyRSwgMHg1NiwgMHg1QiwgMHhBQywgMHhCMywgMHg1OCwgMHg2MSwNCisgICAgMHhCMSwgMHhCNiwgMHg2MiwgMHg1NSwgMHgwMywgMHhFQiwgMHhGMSwgMHgzMCwgMHg3NSwgMHg2RCwgMHgxNywgMHg3QiwNCisgICAgMHhDOSwgMHg2QiwgMHhDQiwgMHg0MywgMHhEOCwgMHhFMCwgMHg0RCwgMHg2NywgMHg5RiwgMHgwRCwgMHgzRSwgMHgwMSwNCisgICAgMHgzMiwgMHg1QywgMHg0OCwgMHhCRSwgMHhFRCwgMHg0QiwgMHhBMiwgMHhCQywgMHgxMywgMHgyMCwgMHg5OCwgMHg5QSwNCisgICAgMHhEQywgMHgxNSwgMHg1NiwgMHg1MCwgMHhDMSwgMHhGNywgMHhDRSwgMHhGNiwgMHg1NiwgMHg2NywgMHg3NywgMHg1RiwNCisgICAgMHg0NSwgMHgyQywgMHg4QywgMHhGMywgMHgxQywgMHg0RCwgMHgyMSwgMHg5NCwgMHg2QSwgMHg1OCwgMHg1MCwgMHhCOCwNCisgICAgMHg3MSwgMHhFMiwgMHg1RSwgMHgwMiwgMHhCQywgMHg2MCwgMHgwNiwgMHgwMSwgMHhBNiwgMHg3RSwgMHhFRiwgMHg5OSwNCisgICAgMHhBNywgMHgxMSwgMHhCRiwgMHg4RSwgMHg1NiwgMHhDMiwgMHg2NiwgMHg1MywgMHhENiwgMHg5NiwgMHhFMCwgMHhBNywNCisgICAgMHg3NCwgMHhDRSwgMHg3RSwgMHgyQSwgMHhCQSwgMHgwMiwgMHhBNywgMHg0NywgMHg5OSwgMHg1NiwgMHg2MCwgMHhCQywNCisgICAgMHhDQSwgMHgwQywgMHhGQywgMHg1OCwgMHhFRiwgMHhBOSwgMHhBNCwgMHhFMCwgMHhDNywgMHgxRCwgMHg5QSwgMHhDNCwNCisgICAgMHg2RiwgMHgwQywgMHg3MCwgMHgyOCwgMHhBMSwgMHhGNiwgMHhCMCwgMHgxRCwgMHg4QiwgMHgyQiwgMHg3QSwgMHg2NSwNCisgICAgMHhCQSwgMHgwNCwgMHhCRiwgMHhFNSwgMHgxMCwgMHgxQSwgMHgzMCwgMHg4NSwgMHg5MCwgMHg4RiwgMHg3MiwgMHhFRCwNCisgICAgMHgwMiwgMHgxMCwgMHhCOCwgMHg1RSwgMHhBNiwgMHhGRCwgMHg0QywgMHg5NCwgMHg2QiwgMHhCRiwgMHhFQSwgMHgzOCwNCisgICAgMHg1MCwgMHhFRiwgMHgyRiwgMHg0NSwgMHhENywgMHg5NSwgMHhDRSwgMHhDRSwgMHgyQiwgMHhDNSwgMHgzMCwgMHg5NCwNCisgICAgMHhBQiwgMHhBRiwgMHhFRiwgMHgxNCwgMHg2OSwgMHg1OSwgMHg0NSwgMHgxOSwgMHg0NSwgMHhDMSwgMHgyRSwgMHhENywNCisgICAgMHhCRCwgMHhEOCwgMHhBMCwgMHg4NCwgMHhCQywgMHhENywgMHgzRSwgMHhBOCwgMHgyNywgMHg3NCwgMHg3RCwgMHhDMiwNCisgICAgMHgzMCwgMHg0QSwgMHgwOCwgMHg3OCwgMHhGRiwgMHg1NSwgMHhBNiwgMHhFOCwgMHhBMywgMHhBMywgMHg1QywgMHhCQiwNCisgICAgMHg3QywgMHg3RSwgMHg4QiwgMHg4MCwgMHgyNSwgMHgwNywgMHg2MiwgMHhENiwgMHhGNCwgMHg1NywgMHhENywgMHhFNiwNCisgICAgMHhCQywgMHg5NiwgMHgzMSwgMHgzMywgMHhGRCwgMHg3MCwgMHhFMywgMHhEOSwgMHgwQiwgMHg2NywgMHgzRSwgMHg1QSwNCisgICAgMHg4RSwgMHg2NywgMHg5NiwgMHgyNSwgMHg4MSwgMHhDRSwgMHgwRiwgMHhCRCwgMHgzQSwgMHhBNiwgMHgzNywgMHg4MywNCisgICAgMHhDQiwgMHhDNSwgMHhCQywgMHgxMiwgMHhDMCwgMHhFMCwgMHgwMCwgMHg1QiwgMHhCMiwgMHgxNiwgMHg4RCwgMHg0NiwNCisgICAgMHhEMSwgMHhGOCwgMHg1OCwgMHgxNCwgMHg0NSwgMHgyQSwgMHhDQSwgMHhGMSwgMHhGQSwgMHg4QywgMHhCOCwgMHhEMCwNCisgICAgMHgwQSwgMHgyOSwgMHhDNSwgMHhCRSwgMHhENSwgMHg5NiwgMHhCNSwgMHgzQiwgMHhCMSwgMHg3NCwgMHg3QywgMHhCQywNCisgICAgMHhBNCwgMHg3MiwgMHgxRCwgMHg1MywgMHgwQiwgMHhGQiwgMHgwMSwgMHhERiwgMHg3MiwgMHg0NCwgMHhBMCwgMHg0MiwNCisgICAgMHg4NSwgMHhDQSwgMHg1MywgMHhBMywgMHhBNCwgMHhCOSwgMHg1QywgMHhDOCwgMHg2RCwgMHg2RCwgMHg2QywgMHhCOSwNCisgICAgMHg5RSwgMHgwOSwgMHhFNywgMHg2MCwgMHgyQywgMHhEMSwgMHhDNywgMHhFOSwgMHhBMiwgMHgzQSwgMHhGRCwgMHgwNywNCisgICAgMHgyNywgMHhFMSwgMHhCQSwgMHhDQiwgMHgxRSwgMHhGQiwgMHg2OCwgMHgyOSwgMHg3RSwgMHg1QSwgMHhGNSwgMHg0OCwNCisgICAgMHgyOSwgMHhCQSwgMHhFNywgMHhGQSwgMHg2MSwgMHg0QiwgMHhENiwgMHgyQSwgMHhBNSwgMHhDOCwgMHgxMSwgMHhBNiwNCisgICAgMHg0NCwgMHhENiwgMHhFRSwgMHhGNywgMHg3MywgMHg1MSwgMHhCRSwgMHg2RCwgMHg0MCwgMHg5MiwgMHhCMSwgMHhBNywNCisgICAgMHg5MywgMHhDOCwgMHgwMywgMHhDOSwgMHhGOSwgMHhFQSwgMHgwNSwgMHhCMiwgMHg3NiwgMHhGRCwgMHgwNywgMHhFRSwNCisgICAgMHhENywgMHgzQywgMHhBMywgMHhERiwgMHg4NCwgMHg2QiwgMHhEQywgMHgxNiwgMHg2MSwgMHgwQiwgMHg1OSwgMHg5QiwNCisgICAgMHhBQSwgMHgyRCwgMHg5NSwgMHgxNiwgMHg2NSwgMHg4NywgMHhERSwgMHgyRiwgMHg0MSwgMHhDNSwgMHg2QSwgMHhEOSwNCisgICAgMHhDQiwgMHhEMCwgMHg1RSwgMHhDNywgMHgyQiwgMHhBNiwgMHhDNSwgMHhFRSwgMHhDNywgMHg2NCwgMHhDOSwgMHhCRCwNCisgICAgMHhBQSwgMHgzNiwgMHhBOSwgMHg2MywgMHhDOSwgMHg4MCwgMHg1NywgMHg1MSwgMHgzMiwgMHgwMiwgMHg1QiwgMHg3QSwNCisgICAgMHgyQywgMHhBMywgMHgyQywgMHg5RiwgMHg5MywgMHhGNCwgMHgzNiwgMHg3QywgMHg3NSwgMHhEOSwgMHhEMiwgMHgwMiwNCisgICAgMHgwQywgMHg0QywgMHg5OCwgMHg3NiwgMHg3RCwgMHg5NywgMHhGOCwgMHgwMywgMHhEMywgMHg1MywgMHgyNCwgMHhBNCwNCisgICAgMHgyRSwgMHhBNiwgMHhDQywgMHg1RiwgMHg5OCwgMHg4RiwgMHg0QiwgMHg1OCwgMHg3MCwgMHhGRiwgMHg0MSwgMHg5OCwNCisgICAgMHhDMywgMHg3NSwgMHg4QSwgMHgzNywgMHg4NiwgMHgxMCwgMHhBQSwgMHhENCwgMHhBQywgMHhDMywgMHg0QiwgMHgzNSwNCisgICAgMHg5OCwgMHhCMCwgMHhFOCwgMHg5OCwgMHhBRSwgMHgzMCwgMHgzRCwgMHg0RiwgMHhBMiwgMHg3MCwgMHhDRCwgMHg5NCwNCisgICAgMHg2NiwgMHg0OSwgMHhFMCwgMHhCOCwgMHgxNiwgMHhFQiwgMHhBMywgMHhGMiwgMHhGNCwgMHg5MSwgMHhBNCwgMHgwRiwNCisgICAgMHhBMywgMHg0MiwgMHhDQiwgMHg5NiwgMHg0MywgMHgxMiwgMHhFQSwgMHg5MywgMHgyMSwgMHg5QiwgMHgwMiwgMHg3MywNCisgICAgMHhEOCwgMHg2OCwgMHgzOSwgMHhBOSwgMHgxRCwgMHhGQSwgMHg4RCwgMHg1NSwgMHhEMiwgMHhFMywgMHhGMSwgMHg3RCwNCisgICAgMHhEMSwgMHhDRCwgMHgzMywgMHg2MywgMHg1MSwgMHhGQywgMHgxNSwgMHgwRCwgMHhDQiwgMHhCRiwgMHhDMCwgMHhFNCwNCisgICAgMHgzRCwgMHg0MH07DQorY29uc3QgdWludDhfdCBnX3poVFdfTG9jYWxlW10gPSB7DQorICAgIDB4NzgsIDB4OUMsIDB4RUQsIDB4NTcsIDB4Q0QsIDB4NEYsIDB4RDQsIDB4NDAsIDB4MTQsIDB4M0YsIDB4NjMsIDB4RTIsDQorICAgIDB4RkYsIDB4MzAsIDB4NjksIDB4MjAsIDB4RDUsIDB4MDQsIDB4QTgsIDB4MUUsIDB4MjEsIDB4QTUsIDB4QzksIDB4QzYsDQorICAgIDB4NDUsIDB4MzAsIDB4NTgsIDB4NDIsIDB4RUMsIDB4NDYsIDB4MjIsIDB4MTcsIDB4MzMsIDB4REIsIDB4MEUsIDB4REIsDQorICAgIDB4QzIsIDB4QjYsIDB4NDMsIDB4NjYsIDB4REIsIDB4QzAsIDB4RjYsIDB4MjQsIDB4MTIsIDB4MTQsIDB4MTQsIDB4NjIsDQorICAgIDB4QTIsIDB4QzQsIDB4OEYsIDB4ODAsIDB4RTEsIDB4NjQsIDB4M0MsIDB4MjgsIDB4ODksIDB4MDcsIDB4MEYsIDB4MkMsDQorICAgIDB4NTEsIDB4RkYsIDB4MUEsIDB4NzYsIDB4MzksIDB4RkEsIDB4MkYsIDB4MzgsIDB4RDMsIDB4MkYsIDB4RkEsIDB4QjEsDQorICAgIDB4QjMsIDB4RDQsIDB4QzQsIDB4QTMsIDB4N0IsIDB4OUEsIDB4RjcsIDB4REUsIDB4RUYsIDB4RjcsIDB4RTYsIDB4QkQsDQorICAgIDB4REYsIDB4QkMsIDB4N0QsIDB4RDksIDB4OTUsIDB4OUIsIDB4NTgsIDB4ODcsIDB4NEQsIDB4MDQsIDB4MUMsIDB4NjgsDQorICAgIDB4QTMsIDB4MjksIDB4QzEsIDB4MzcsIDB4MUYsIDB4RDcsIDB4MTYsIDB4MDUsIDB4NjAsIDB4QTAsIDB4OTYsIDB4M0UsDQorICAgIDB4MjUsIDB4OUMsIDB4OUYsIDB4OUUsIDB4RjQsIDB4REUsIDB4M0UsIDB4QkYsIDB4NzEsIDB4RDEsIDB4RDksIDB4M0MsDQorICAgIDB4RkYsIDB4RjksIDB4RTYsIDB4RjcsIDB4OEYsIDB4QkQsIDB4RUUsIDB4QUIsIDB4NkYsIDB4QkQsIDB4Q0UsIDB4QUYsDQorICAgIDB4OUIsIDB4ODIsIDB4NzIsIDB4RkQsIDB4MUEsIDB4MDAsIDB4MzIsIDB4NjMsIDB4MzksIDB4MDYsIDB4MjQsIDB4NUEsDQorICAgIDB4REIsIDB4QUUsIDB4RTMsIDB4NjYsIDB4MkIsIDB4NEEsIDB4RDAsIDB4MjAsIDB4QTgsIDB4ODEsIDB4ODksIDB4MDUsDQorICAgIDB4MUQsIDB4ODYsIDB4MUEsIDB4MDIsIDB4QjIsIDB4OEQsIDB4MUQsIDB4RDcsIDB4OUMsIDB4QTcsIDB4QTEsIDB4MTYsDQorICAgIDB4QjMsIDB4ODcsIDB4NDIsIDB4NUIsIDB4MzksIDB4M0YsIDB4N0QsIDB4RDIsIDB4M0IsIDB4REEsIDB4OTEsIDB4QTUsDQorICAgIDB4RDAsIDB4NEEsIDB4MDcsIDB4Q0UsIDB4RjYsIDB4MzgsIDB4ODEsIDB4RDMsIDB4REQsIDB4RkUsIDB4ODEsIDB4RUUsDQorICAgIDB4RTEsIDB4MjEsIDB4MkYsIDB4RDUsIDB4MDEsIDB4ODcsIDB4QjEsIDB4N0QsIDB4QzIsIDB4QkIsIDB4NjMsIDB4OEIsDQorICAgIDB4QzcsIDB4RjgsIDB4QzIsIDB4NjEsIDB4NzQsIDB4M0UsIDB4NzIsIDB4MTgsIDB4RkIsIDB4OUIsIDB4REMsIDB4MDAsDQorICAgIDB4QjcsIDB4NzksIDB4MTYsIDB4Q0IsIDB4RjcsIDB4MEYsIDB4QTIsIDB4NzMsIDB4MjIsIDB4NjEsIDB4NUEsIDB4NTIsDQorICAgIDB4MDAsIDB4RUIsIDB4NzUsIDB4MzIsIDB4MjUsIDB4REMsIDB4MTYsIDB4RkUsIDB4NkIsIDB4RkIsIDB4OEYsIDB4QjQsDQorICAgIDB4MzUsIDB4NjAsIDB4M0IsIDB4MzUsIDB4QUMsIDB4RDQsIDB4NTIsIDB4N0EsIDB4RUYsIDB4OEYsIDB4N0IsIDB4NDcsDQorICAgIDB4QzcsIDB4QkQsIDB4NzcsIDB4OUYsIDB4NjQsIDB4ODksIDB4OTksIDB4MzksIDB4M0YsIDB4QkQsIDB4QUYsIDB4QkYsDQorICAgIDB4RkYsIDB4NkMsIDB4OEYsIDB4ODMsIDB4REYsIDB4RUQsIDB4RUIsIDB4QTcsIDB4NEEsIDB4NzMsIDB4RjIsIDB4MUMsDQorICAgIDB4RjQsIDB4QzcsIDB4NkYsIDB4OUYsIDB4MjQsIDB4N0UsIDB4MTAsIDB4OUMsIDB4RkEsIDB4MzQsIDB4OTEsIDB4MUIsDQorICAgIDB4OEYsIDB4ODAsIDB4NUQsIDB4RTgsIDB4QTMsIDB4RDgsIDB4NDEsIDB4QjEsIDB4RjYsIDB4NjIsIDB4RDUsIDB4QzUsDQorICAgIDB4N0EsIDB4OEIsIDB4OTUsIDB4MEUsIDB4QUMsIDB4RDEsIDB4NDYsIDB4QzQsIDB4MzIsIDB4MkMsIDB4NjQsIDB4QTcsDQorICAgIDB4NTcsIDB4NDMsIDB4RTQsIDB4QTIsIDB4RDcsIDB4QkQsIDB4RTgsIDB4RUUsIDB4QjMsIDB4ODcsIDB4OEEsIDB4MUQsDQorICAgIDB4RjksIDB4RjAsIDB4Q0IsIDB4NDIsIDB4MTgsIDB4NUMsIDB4OUEsIDB4QTksIDB4NEIsIDB4MTAsIDB4ODEsIDB4QTksDQorICAgIDB4RkMsIDB4RDQsIDB4QTIsIDB4MzUsIDB4N0QsIDB4RUQsIDB4NkUsIDB4NkYsIDB4NzUsIDB4NzcsIDB4RjcsIDB4NjUsDQorICAgIDB4ODksIDB4OTksIDB4MzksIDB4N0YsIDB4RTIsIDB4MDQsIDB4QzEsIDB4MjksIDB4RTYsIDB4RDIsIDB4NjUsIDB4MjcsDQorICAgIDB4RTUsIDB4QjYsIDB4NUQsIDB4RTgsIDB4MzUsIDB4QTAsIDB4OEIsIDB4MTYsIDB4QTAsIDB4RUIsIDB4MjIsIDB4RTIsDQorICAgIDB4MjQsIDB4RDIsIDB4MjcsIDB4OUUsIDB4NjgsIDB4MjEsIDB4MkUsIDB4N0IsIDB4Q0QsIDB4QTYsIDB4QTAsIDB4M0MsDQorICAgIDB4QTIsIDB4MUYsIDB4QjEsIDB4REIsIDB4RjksIDB4MkUsIDB4QUEsIDB4MjIsIDB4OUQsIDB4NDEsIDB4QjEsIDB4MkEsDQorICAgIDB4RDIsIDB4ODcsIDB4MTAsIDB4QTcsIDB4RTksIDB4ODcsIDB4RTksIDB4OTIsIDB4NTAsIDB4NzgsIDB4MzksIDB4OUEsDQorICAgIDB4RDgsIDB4NjksIDB4NzAsIDB4NzIsIDB4OTQsIDB4RTIsIDB4REIsIDB4QzgsIDB4MDgsIDB4RTksIDB4OTIsIDB4MkEsDQorICAgIDB4NTUsIDB4NEIsIDB4MzEsIDB4NUEsIDB4MjYsIDB4MjYsIDB4MkUsIDB4OUYsIDB4MDMsIDB4NDAsIDB4QzYsIDB4MTMsDQorICAgIDB4QzksIDB4RTEsIDB4NUEsIDB4NzYsIDB4NEUsIDB4OEUsIDB4OTQsIDB4MjcsIDB4MjMsIDB4NDcsIDB4QzUsIDB4MzQsDQorICAgIDB4QzUsIDB4REUsIDB4ODcsIDB4QTcsIDB4QTIsIDB4QUEsIDB4OEEsIDB4REQsIDB4OUQsIDB4NjcsIDB4QTIsIDB4QTYsDQorICAgIDB4ODksIDB4MTcsIDB4OUYsIDB4NUYsIDB4OEIsIDB4NjAsIDB4NDksIDB4OTYsIDB4NTIsIDB4MEMsIDB4NUUsIDB4OEEsDQorICAgIDB4NTAsIDB4OEQsIDB4RkUsIDB4MjksIDB4NEEsIDB4MjUsIDB4MDgsIDB4RTQsIDB4QTgsIDB4MDAsIDB4NzMsIDB4NTIsDQorICAgIDB4NTUsIDB4MjcsIDB4MzUsIDB4QUQsIDB4MTQsIDB4MjUsIDB4RDIsIDB4MjMsIDB4MjQsIDB4RTUsIDB4MTksIDB4NEMsDQorICAgIDB4OEQsIDB4NUMsIDB4RUYsIDB4RDEsIDB4NzAsIDB4RDQsIDB4QTgsIDB4MzcsIDB4OUUsIDB4OTgsIDB4MTksIDB4RTgsDQorICAgIDB4QUMsIDB4QUMsIDB4Q0UsIDB4REEsIDB4MkQsIDB4NkQsIDB4QkEsIDB4N0EsIDB4NzcsIDB4N0QsIDB4NzEsIDB4QzMsDQorICAgIDB4OUMsIDB4RjMsIDB4OTcsIDB4NDIsIDB4MTEsIDB4RDMsIDB4QTAsIDB4ODAsIDB4RTksIDB4NzgsIDB4NzYsIDB4MUQsDQorICAgIDB4OTEsIDB4QUMsIDB4OTIsIDB4MTksIDB4NUYsIDB4NTQsIDB4MTQsIDB4RjUsIDB4RDEsIDB4OTksIDB4RDcsIDB4MDUsDQorICAgIDB4QzUsIDB4MUYsIDB4RjUsIDB4RkQsIDB4ODksIDB4NzEsIDB4REYsIDB4RjcsIDB4NjUsIDB4MjksIDB4ODMsIDB4RTMsDQorICAgIDB4NTMsIDB4NzUsIDB4OEYsIDB4MTAsIDB4RTQsIDB4RTgsIDB4NkQsIDB4NDEsIDB4MTksIDB4MEUsIDB4QzksIDB4MTMsDQorICAgIDB4MTMsIDB4QTUsIDB4QjksIDB4NkIsIDB4ODgsIDB4RTgsIDB4QzgsIDB4NzEsIDB4QTMsIDB4NkIsIDB4NDcsIDB4OEEsDQorICAgIDB4M0MsIDB4QTYsIDB4NDcsIDB4QTEsIDB4ODcsIDB4QTQsIDB4QUYsIDB4Q0IsIDB4NTYsIDB4ODcsIDB4QjIsIDB4QUUsDQorICAgIDB4MjgsIDB4QkQsIDB4ODEsIDB4NzQsIDB4Q0IsIDB4ODYsIDB4NzQsIDB4NDgsIDB4QzYsIDB4RTMsIDB4MkMsIDB4NjEsDQorICAgIDB4OTgsIDB4NEIsIDB4NjgsIDB4MTAsIDB4RUMsIDB4QUQsIDB4NTksIDB4NkMsIDB4MjYsIDB4NDYsIDB4NEIsIDB4MzIsDQorICAgIDB4OTIsIDB4MEUsIDB4NDYsIDB4NEEsIDB4MTIsIDB4NkMsIDB4Q0IsIDB4RjEsIDB4NUEsIDB4ODIsIDB4MzIsIDB4NTYsDQorICAgIDB4MTIsIDB4RUUsIDB4MjMsIDB4ODIsIDB4MDUsIDB4RTUsIDB4NTYsIDB4MDEsIDB4N0QsIDB4MjksIDB4NEMsIDB4RTYsDQorICAgIDB4QkQsIDB4RTMsIDB4QzcsIDB4QzgsIDB4MjgsIDB4OTMsIDB4NzUsIDB4QzYsIDB4NjMsIDB4MTgsIDB4MTgsIDB4ODIsDQorICAgIDB4MzIsIDB4NUYsIDB4MUIsIDB4QTYsIDB4MkIsIDB4MjksIDB4ODMsIDB4MTgsIDB4QzAsIDB4QjIsIDB4NUEsIDB4OTgsDQorICAgIDB4MUQsIDB4MDQsIDB4QTUsIDB4QjYsIDB4NTgsIDB4RkQsIDB4MEIsIDB4NUEsIDB4RkEsIDB4MjEsIDB4MEEsIDB4QTQsDQorICAgIDB4NjAsIDB4MjcsIDB4MTYsIDB4RUEsIDB4NjYsIDB4NEIsIDB4QTAsIDB4QkQsIDB4ODYsIDB4OTYsIDB4QTEsIDB4MUUsDQorICAgIDB4QUYsIDB4RTAsIDB4RDgsIDB4OEMsIDB4NzIsIDB4NTYsIDB4MEMsIDB4NUMsIDB4NDcsIDB4NDAsIDB4QTUsIDB4QUYsDQorICAgIDB4MDUsIDB4MzQsIDB4RDcsIDB4MDAsIDB4RjcsIDB4MDUsIDB4QTksIDB4MkYsIDB4NEMsIDB4NkQsIDB4RDMsIDB4OUYsDQorICAgIDB4OTAsIDB4MDYsIDB4NTgsIDB4QTAsIDB4MzIsIDB4NzIsIDB4MDAsIDB4OTYsIDB4NjMsIDB4NjEsIDB4NjcsIDB4MDAsDQorICAgIDB4RTAsIDB4MEUsIDB4RjYsIDB4ODgsIDB4ODUsIDB4MDgsIDB4QkIsIDB4ODUsIDB4ODMsIDB4MDgsIDB4NEIsIDB4NTksDQorICAgIDB4QjAsIDB4QUUsIDB4ODQsIDB4Q0MsIDB4QTIsIDB4M0EsIDB4NDEsIDB4RUIsIDB4MDMsIDB4MjEsIDB4MTUsIDB4MDIsDQorICAgIDB4RUIsIDB4RjQsIDB4OEIsIDB4MzgsIDB4MDgsIDB4NTIsIDB4MzMsIDB4QTEsIDB4QzUsIDB4MDEsIDB4Q0MsIDB4NjEsDQorICAgIDB4REYsIDB4NUIsIDB4ODUsIDB4NjAsIDB4MDYsIDB4QkIsIDB4QTYsIDB4QTUsIDB4QjMsIDB4OUUsIDB4QzYsIDB4MUUsDQorICAgIDB4REUsIDB4MDMsIDB4RUEsIDB4NjAsIDB4MzAsIDB4MTUsIDB4NDAsIDB4MzcsIDB4NzEsIDB4MEMsIDB4N0UsIDB4MzAsDQorICAgIDB4RjAsIDB4NkEsIDB4MEQsIDB4NUYsIDB4MjEsIDB4NzcsIDB4RjQsIDB4MkEsIDB4NkQsIDB4Q0YsIDB4NjksIDB4QUMsDQorICAgIDB4RTAsIDB4MDAsIDB4MTksIDB4REUsIDB4MUUsIDB4MkMsIDB4QjYsIDB4RDQsIDB4N0IsIDB4Q0EsIDB4NTIsIDB4RjgsDQorICAgIDB4NjcsIDB4NDEsIDB4RjksIDB4MDMsIDB4MTEsIDB4QzIsIDB4NEEsIDB4Qzl9Ow0KK2NvbnN0IHVpbnQ4X3QgZ196aEhLX0xvY2FsZVtdID0gew0KKyAgICAweDc4LCAweDlDLCAweEE1LCAweDU3LCAweDRELCAweDRGLCAweDEzLCAweDQxLCAweDE4LCAweDNFLCAweDYzLCAweEUyLA0KKyAgICAweDdGLCAweDk4LCAweDZDLCAweDIwLCAweDBCLCAweDA5LCAweDUwLCAweDhBLCAweDlGLCAweDI1LCAweENCLCAweDI2LA0KKyAgICAweDQ0LCAweDkwLCAweDlBLCAweDVBLCAweDQzLCAweDJDLCAweEQxLCAweEM4LCAweEM1LCAweDZDLCAweDc3LCAweDg3LA0KKyAgICAweEVFLCAweDQyLCAweDc3LCAweDg3LCAweDRDLCAweEI3LCAweEMxLCAweDZFLCAweDNDLCAweDg4LCAweDA0LCAweEE1LA0KKyAgICAweDVBLCAweDJFLCAweDRBLCAweDU0LCAweDAyLCAweDg2LCAweDc4LCAweDUwLCAweDBGLCAweDQ4LCAweEJDLCAweDc4LA0KKyAgICAweDY4LCAweDg5LCAweEM2LCAweDNGLCAweDQzLCAweDhCLCAweDlFLCAweEZDLCAweDBCLCAweENFLCAweEVDLCAweDE3LA0KKyAgICAweEZCLCAweDM1LCAweDZELCAweDhELCAweDNELCAweENELCAweEZCLCAweEJDLCAweENGLCAweEYzLCAweENFLCAweEZCLA0KKyAgICAweDNFLCAweDMzLCAweDNCLCAweDAxLCAweEExLCAweDhDLCAweDY0LCAweEE5LCAweDBDLCAweDgxLCAweDIxLCAweEU5LA0KKyAgICAweDcwLCAweDlBLCAweEIzLCAweEQ0LCAweDg3LCAweEQ5LCAweDFDLCAweDA3LCAweDE0LCAweDU4LCAweDkxLCAweEE3LA0KKyAgICAweEI5LCAweEQzLCAweEU2LCAweDcxLCAweEU3LCAweENELCAweEYzLCAweEUxLCAweEIzLCAweEQ2LCAweEM2LCAweEU5LA0KKyAgICAweDhGLCAweEQ3LCAweDdGLCAweEJFLCAweDM3LCAweDdFLCAweDdGLCAweERBLCAweEVCLCAweDM0LCAweEJGLCAweDlFLA0KKyAgICAweEQ1LCAweDVCLCAweEVELCAweEVELCAweEEzLCAweDVGLCAweDFGLCAweDFBLCAweDlELCAweERELCAweDlGLCAweEVELA0KKyAgICAweEM2LCAweEM5LCAweDA4LCAweDI3LCAweDVFLCAweEJDLCAweDAwLCAweDgwLCAweDQwLCAweDhCLCAweDE4LCAweDhBLA0KKyAgICAweDg0LCAweDBCLCAweDM1LCAweEJELCAweDg4LCAweENBLCAweDE1LCAweEI3LCAweDVFLCAweDA5LCAweEMzLCAweDEyLA0KKyAgICAweEMyLCAweDlBLCAweDY0LCAweDUwLCAweEQ2LCAweDAwLCAweDEwLCAweDc0LCAweDY0LCAweDk4LCAweEVBLCAweDFELA0KKyAgICAweDkyLCAweEFBLCAweEQwLCAweDc4LCAweEMwLCAweDg5LCAweEM1LCAweEQzLCAweEU2LCAweDkzLCAweENFLCAweEMxLA0KKyAgICAweEI2LCAweDkwLCAweDcyLCAweEEyLCAweDYwLCAweEUyLCAweEE0LCAweEMxLCAweDQ4LCAweDM0LCAweEVCLCAweEM5LA0KKyAgICAweDg5LCAweEY2LCAweEZFLCAweDNFLCAweEFCLCAweEQ0LCAweDJFLCAweDQzLCAweEIxLCAweDc1LCAweENDLCAweERBLA0KKyAgICAweDYzLCAweDkzLCAweEE1LCAweDM4LCAweDYyLCAweDI4LCAweDVBLCAweEVGLCAweDE5LCAweDhBLCAweDlELCAweDBELA0KKyAgICAweDY2LCAweDgyLCAweDM5LCAweDNDLCAweENELCAweDQ1LCAweEU3LCAweDA3LCAweEVFLCAweERBLCAweEI3LCAweDMwLA0KKyAgICAweDY4LCAweDI5LCAweDkwLCAweDhBLCAweDQ1LCAweDNDLCAweENELCAweEE1LCAweEI5LCAweDYwLCAweDk1LCAweDc0LA0KKyAgICAweDcyLCAweEYxLCAweEM5LCAweDY0LCAweEY4LCAweDUyLCAweDMyLCAweDdDLCAweDM5LCAweDE5LCAweEJFLCAweDkyLA0KKyAgICAweDBDLCAweDVGLCAweDRELCAweDg2LCAweEFGLCAweDI1LCAweEMzLCAweEQ3LCAweDkzLCAweEUxLCAweDRDLCAweDMyLA0KKyAgICAweDlDLCAweDlFLCAweDYwLCAweEUwLCAweDhDLCAweDM5LCAweEQzLCAweDkzLCAweDNELCAweDBELCAweDU0LCAweEE0LA0KKyAgICAweDVBLCAweEUwLCAweDQ2LCAweDkyLCAweDQ4LCAweEVDLCAweEJDLCAweDNCLCAweEVDLCAweDFDLCAweDFDLCAweDc2LA0KKyAgICAweERFLCAweDdFLCAweDE0LCAweDUyLCAweDM0LCAweDhDLCAweEUwLCAweEU0LCAweEMwLCAweDkyLCAweEYxLCAweDkzLA0KKyAgICAweDA2LCAweDgzLCAweDVGLCAweDRGLCAweEM0LCAweEM5LCAweDU1LCAweDY1LCAweEQ0LCAweEQ5LCAweDRELCAweEU2LA0KKyAgICAweDZGLCAweDFELCAweEZCLCAweDM4LCAweEIwLCAweDU3LCAweDA5LCAweDQzLCAweDQ0LCAweEVFLCAweDgwLCAweEFELA0KKyAgICAweDhFLCAweENELCAweDExLCAweDlGLCAweDIwLCAweERFLCAweDdCLCAweEJDLCAweEVCLCAweDc4LCAweEJGLCAweEYxLA0KKyAgICAweDRFLCAweEJCLCAweEY2LCAweEE4LCAweDQzLCAweEFDLCAweDI5LCAweDFBLCAweEQ0LCAweDgzLCAweERGLCAweEJGLA0KKyAgICAweDBCLCAweDkxLCAweEVELCAweDVFLCAweEI0LCAweDc3LCAweEU4LCAweDQxLCAweDc5LCAweDQwLCAweDM0LCAweEZELA0KKyAgICAweDMyLCAweDk2LCAweDA2LCAweEU3LCAweDYxLCAweDYwLCAweDEzLCAweDg4LCAweEE1LCAweDQwLCAweDdELCAweDEyLA0KKyAgICAweDkxLCAweDlFLCAweEJFLCAweEI0LCAweEI3LCAweDM2LCAweERCLCAweEY1LCAweDFELCAweDIxLCAweDQ1LCAweEMzLA0KKyAgICAweDA4LCAweEVFLCAweDgzLCAweEMwLCAweDVFLCAweDc5LCAweDVBLCAweEYyLCAweEEyLCAweEE1LCAweDIyLCAweDRGLA0KKyAgICAweDlBLCAweDgzLCAweDJBLCAweDkyLCAweDA5LCAweDE3LCAweDI0LCAweEQzLCAweDg0LCAweEQ4LCAweEYwLCAweEFELA0KKyAgICAweEY3LCAweDExLCAweEY3LCAweEQ1LCAweDVCLCAweEFFLCAweDk2LCAweENCLCAweDlDLCAweEY4LCAweDgwLCAweEZDLA0KKyAgICAweEY4LCAweDc2LCAweEVCLCAweDFCLCAweDlGLCAweEU3LCAweEM5LCAweDFELCAweEU0LCAweDY3LCAweDc5LCAweDcyLA0KKyAgICAweDEwLCAweDNDLCAweDk4LCAweDIzLCAweDNGLCAweDZBLCAweDhDLCAweEFGLCAweDYxLCAweDE1LCAweDI5LCAweDIzLA0KKyAgICAweEEzLCAweEM0LCAweDI4LCAweEQyLCAweDk3LCAweDVFLCAweDg3LCAweENBLCAweEZGLCAweEM4LCAweDJCLCAweDJBLA0KKyAgICAweEMyLCAweDI2LCAweDJELCAweEQwLCAweDUzLCAweDBFLCAweDQwLCAweDA4LCAweDcxLCAweDdELCAweDMyLCAweDM1LA0KKyAgICAweDNELCAweEUyLCAweDUzLCAweDAwLCAweDA5LCAweEY5LCAweDM0LCAweEEzLCAweEFBLCAweDdDLCAweDY3LCAweEVGLA0KKyAgICAweDI5LCAweDlGLCAweENGLCAweEYzLCAweEVELCAweEVELCAweDY3LCAweDdDLCAweEExLCAweEMwLCAweDlGLCAweDdELA0KKyAgICAweDdFLCAweEM1LCAweDgzLCAweDI1LCAweDIxLCAweDE1LCAweDUwLCAweEIwLCAweDRBLCAweDM4LCAweDJFLCAweDI1LA0KKyAgICAweDk3LCAweEU4LCAweEFCLCAweDgwLCAweDZELCAweDEzLCAweEQxLCAweDRGLCAweEU1LCAweEYzLCAweDUzLCAweDg1LA0KKyAgICAweDQyLCAweDVGLCAweDEyLCAweEQ3LCAweDlBLCAweDE5LCAweEFBLCAweDg5LCAweDBBLCAweEE4LCAweDE5LCAweDkxLA0KKyAgICAweEQxLCAweERELCAweDRCLCAweEIzLCAweDQ4LCAweDUwLCAweEVGLCAweDI2LCAweENELCAweDRCLCAweEM2LCAweENBLA0KKyAgICAweDZBLCAweDU2LCAweEFGLCAweDE0LCAweEU2LCAweDY2LCAweDZGLCAweEFFLCAweERGLCAweDdGLCAweEE0LCAweEU2LA0KKyAgICAweEFDLCAweDI1LCAweEM3LCAweEMzLCAweDIwLCAweEM5LCAweDU2LCAweDFBLCAweDU1LCAweEJELCAweDA4LCAweDcxLA0KKyAgICAweEQ4LCAweEM4LCAweDEwLCAweEU2LCAweEY2LCAweDQ0LCAweDMwLCAweEYyLCAweDJELCAweEM4LCAweDlDLCAweDY4LA0KKyAgICAweDhELCAweDVBLCAweDU2LCAweDY2LCAweERDLCAweEIyLCAweDJDLCAweDIxLCAweDE1LCAweEUyLCAweEIxLCAweEE1LA0KKyAgICAweDcyLCAweDE1LCAweDYzLCAweDY4LCAweEM4LCAweDM1LCAweDRFLCAweDFDLCAweDc0LCAweEM0LCAweDk5LCAweENDLA0KKyAgICAweEUzLCAweDYxLCAweDdGLCAweDM5LCAweEQyLCAweDc3LCAweDlELCAweDM1LCAweDg4LCAweDY1LCAweDY4LCAweDk4LA0KKyAgICAweDZFLCAweDBCLCAweDQzLCAweDcxLCAweDFELCAweEY1LCAweDI2LCAweDM2LCAweDhGLCAweDNGLCAweEUzLCAweEY5LA0KKyAgICAweEQ4LCAweDAzLCAweDYxLCAweEM4LCAweDJELCAweEFGLCAweDQwLCAweDU5LCAweEQzLCAweDI1LCAweDcyLCAweDVGLA0KKyAgICAweEM2LCAweEJELCAweDJBLCAweDRFLCAweDlBLCAweDI5LCAweDI4LCAweDYxLCAweDU0LCAweDVELCAweEQzLCAweEU4LA0KKyAgICAweEY1LCAweDE4LCAweEVELCAweDUzLCAweEUxLCAweDRGLCAweDMwLCAweEQ0LCAweEE3LCAweDQwLCAweEQ3LCAweDhDLA0KKyAgICAweDZBLCAweDg1LCAweDEzLCAweEM3LCAweEZBLCAweEE0LCAweDVCLCAweDEwLCAweDIzLCAweDRFLCAweDlDLCAweDg4LA0KKyAgICAweEIxLCAweENGLCAweDhELCAweDA5LCAweDlELCAweEJELCAweDc3LCAweDMwLCAweDIxLCAweDY3LCAweEMyLCAweEEwLA0KKyAgICAweDc3LCAweDIzLCAweEVELCAweDgwLCAweDEzLCAweEIzLCAweEI5LCAweDQxLCAweEYyLCAweDZDLCAweDg1LCAweDE4LA0KKyAgICAweDVELCAweDU0LCAweDVBLCAweDA1LCAweEQxLCAweDA1LCAweDk1LCAweENELCAweEZFLCAweDgzLCAweDJDLCAweDc4LA0KKyAgICAweDEwLCAweDMxLCAweDkxLCAweEZELCAweDZFLCAweEM2LCAweEZBLCAweEE2LCAweEVGLCAweDQxLCAweDZELCAweDBELA0KKyAgICAweDJFLCAweDRCLCAweEIyLCAweEY3LCAweDRDLCAweDdCLCAweEExLCAweDVCLCAweDczLCAweDQ2LCAweDQxLCAweDQ1LA0KKyAgICAweDA4LCAweEYyLCAweEU0LCAweEI0LCAweDQwLCAweEMxLCAweDU0LCAweEMwLCAweDZELCAweDJFLCAweDk1LCAweDQ4LA0KKyAgICAweENCLCAweEQ3LCAweEM4LCAweERGLCAweDkyLCAweDBBLCAweDU4LCAweDIwLCAweDM2LCAweDMyLCAweDA4LCAweDlBLA0KKyAgICAweEExLCAweDIxLCAweEEzLCAweDBCLCAweEUxLCAweDA2LCAweEFBLCAweDYyLCAweDBELCAweDYyLCAweEJBLCAweDBCLA0KKyAgICAweDgzLCAweEUxLCAweEI0LCAweEIyLCAweEEwLCAweEY1LCAweEE0LCAweDY0LCAweDYxLCAweDExLCAweEMzLCAweEY1LA0KKyAgICAweEFFLCAweDk0LCAweDE5LCAweDJDLCAweDE1LCAweEM5LCAweDQ3LCAweEQ5LCAweDhELCAweEIyLCAweEE4LCAweDRBLA0KKyAgICAweDFBLCAweDgzLCAweDkwLCAweDQzLCAweDU2LCAweDc1LCAweDU1LCAweDAyLCAweEYzLCAweEM4LCAweDU0LCAweDM1LA0KKyAgICAweDk5LCAweENFLCAweDM0LCAweDc2LCAweEVGLCAweDE2LCAweEM4LCAweDc3LCAweDI3LCAweDEzLCAweDAzLCAweDY0LA0KKyAgICAweDE1LCAweDc5LCAweEU0LCAweEJCLCAweDVELCAweEI3LCAweDJFLCAweEEwLCAweDFFLCAweDc2LCAweEJCLCAweEE3LA0KKyAgICAweDUyLCAweEFCLCAweDFBLCAweEE1LCAweDE1LCAweDY0LCAweDMzLCAweDlELCAweERELCAweEVELCAweDQ3LCAweDJFLA0KKyAgICAweDcwLCAweDlFLCAweDQyLCAweENBLCAweEY5LCAweDI3LCAweDQyLCAweEZDLCAweDBCLCAweEQ5LCAweDBFLCAweDRCLA0KKyAgICAweEVEfTsNCitjb25zdCB1aW50OF90IGdfamFKUF9Mb2NhbGVbXSA9IHsNCisgICAgMHg3OCwgMHg5QywgMHhFRCwgMHg1NiwgMHhDQiwgMHg2RSwgMHhEMywgMHg0MCwgMHgxNCwgMHg1RCwgMHgxNywgMHg4OSwNCisgICAgMHg3RiwgMHgxOCwgMHg1OSwgMHgyMCwgMHg4MywgMHhENCwgMHhENiwgMHgwRCwgMHhFRiwgMHg1NiwgMHhBRSwgMHhBNSwNCisgICAgMHg4QSwgMHg5NiwgMHg4NiwgMHgxNiwgMHhBMywgMHgwOCwgMHg1NywgMHhBMCwgMHg3NiwgMHg4MywgMHgyNiwgMHhGNiwNCisgICAgMHgzNCwgMHg5OSwgMHgzNiwgMHg5RSwgMHhBOSwgMHgyNiwgMHhCNiwgMHg0QSwgMHhCQywgMHhFMiwgMHgyMSwgMHgyMCwNCisgICAgMHg0OCwgMHg3NCwgMHgwMSwgMHgxQiwgMHgwNCwgMHg0NCwgMHg2MiwgMHg1NSwgMHg0MCwgMHgwMiwgMHgwNCwgMHg4QiwNCisgICAgMHg2RSwgMHhEOCwgMHhEMCwgMHhBRiwgMHg0OSwgMHg1QSwgMHg1NiwgMHhGQywgMHgwMiwgMHgzMywgMHg3RSwgMHhDNSwNCisgICAgMHg4RSwgMHhFRCwgMHhFMCwgMHhFRSwgMHhGMSwgMHgyMiwgMHg5OSwgMHg3QiwgMHg3QywgMHhDRSwgMHhGNSwgMHhCRCwNCisgICAgMHhFNywgMHg4RSwgMHg0NywgMHg1NiwgMHg1QiwgMHhENCwgMHg4NCwgMHgyRCwgMHgwNCwgMHgwOCwgMHhCNCwgMHhEMSwNCisgICAgMHhCQywgMHhCNCwgMHgwNSwgMHhFRiwgMHhBRiwgMHhENCwgMHgyNCwgMHg2MCwgMHhBMSwgMHhCNiwgMHgzOSwgMHgyRiwNCisgICAgMHgwRCwgMHhERSwgMHhFQywgMHgxRiwgMHg3RiwgMHhGRiwgMHg3NiwgMHg4RSwgMHhGRiwgMHgwRCwgMHg3QSwgMHg1RiwNCisgICAgMHhDRiwgMHg0QiwgMHhEQSwgMHhFOSwgMHg1MywgMHgwMCwgMHhBOCwgMHg4MiwgMHg0QywgMHgyQywgMHhDOCwgMHg4QywNCisgICAgMHg4RSwgMHg1RCwgMHhBNywgMHhBRCwgMHg3NiwgMHhBOCwgMHg2QiwgMHgzMCwgMHhENCwgMHhBMCwgMHgwQywgMHg0MywNCisgICAgMHgyMiwgMHg1OCwgMHgxMywgMHg0MCwgMHhCNSwgMHgyOSwgMHg3MSwgMHg5QSwgMHhCNywgMHhGOSwgMHhBRCwgMHhCNiwNCisgICAgMHg4OCwgMHgyNywgMHg4MiwgMHg1OCwgMHhBQiwgMHgwQywgMHg3QSwgMHg1RCwgMHg1NSwgMHgwOSwgMHhENiwgMHgwOSwNCisgICAgMHhGOCwgMHg0MiwgMHgzRSwgMHg3QywgMHgzMSwgMHgxRiwgMHhCRSwgMHg5NCwgMHgwRiwgMHg1RiwgMHhDRSwgMHg4NywNCisgICAgMHhBRiwgMHhFNCwgMHhDMywgMHg1NywgMHhGMywgMHhFMSwgMHg2QiwgMHhGOSwgMHhGMCwgMHg2QywgMHgzRSwgMHg1QywNCisgICAgMHg5OSwgMHgyOSwgMHhDMCwgMHgwQiwgMHhGQSwgMHhBQywgMHg4QywgMHgzNCwgMHgwQSwgMHhDMiwgMHg3NSwgMHhFQywNCisgICAgMHg1MywgMHhEMiwgMHgzNywgMHgwMCwgMHhFQiwgMHg3NSwgMHgzNiwgMHgyRiwgMHg1NSwgMHhBNCwgMHhGRiwgMHgwNiwNCisgICAgMHg5RSwgMHhDNCwgMHg0MCwgMHgwQiwgMHg3NiwgMHgxMiwgMHhEQiwgMHg4RSwgMHg0NywgMHg5QSwgMHhEOCwgMHhCRSwNCisgICAgMHhFRiwgMHg3QiwgMHhGQywgMHg1NywgMHg1NSwgMHg0NCwgMHgzOCwgMHhDNCwgMHg3QiwgMHhERCwgMHg1QywgMHhGQywNCisgICAgMHhFOCwgMHhEMSwgMHg5NywgMHg3QywgMHhGRSwgMHg4RiwgMHg4MywgMHg4MiwgMHgzQywgMHg5RiwgMHg3MywgMHhGMSwNCisgICAgMHhERiwgMHhDRiwgMHg1RiwgMHhFNSwgMHhFMiwgMHhGRCwgMHhERSwgMHg4NywgMHgxMSwgMHgxQywgMHhGOCwgMHhBQiwNCisgICAgMHg5QywgMHgyNiwgMHg0NiwgMHhGNiwgMHg0MCwgMHhEOCwgMHg0RCwgMHhCNiwgMHg4RiwgMHg2QywgMHgwNywgMHhEOSwNCisgICAgMHhEQSwgMHhCMywgMHg1NSwgMHg2NywgMHhFQiwgMHhDRCwgMHg1NiwgMHg1QSwgMHg1QywgMHhBMywgMHg4RCwgMHgxOCwNCisgICAgMHhCNiwgMHgzMCwgMHhCMiwgMHg5MywgMHgyRiwgMHg3OSwgMHgwOCwgMHg2OSwgMHhGRCwgMHhCRCwgMHg2RSwgMHhGRiwNCisgICAgMHhDNSwgMHgxRSwgMHgxRiwgMHg0RSwgMHgwNCwgMHg2NCwgMHg2RiwgMHhGRiwgMHg3QSwgMHg5OSwgMHhCRSwgMHgwRCwNCisgICAgMHg4NiwgMHg2MSwgMHhFMiwgMHgyMSwgMHg4OCwgMHhDMSwgMHg0NCwgMHg3RSwgMHgxRSwgMHg2OSwgMHg0NywgMHgwNywNCisgICAgMHgwRiwgMHhGQiwgMHg0RiwgMHg5RiwgMHhGOCwgMHhEOSwgMHg0NSwgMHgxOCwgMHhFMywgMHhDNywgMHhGQiwgMHg4NywNCisgICAgMHg4MywgMHg3NywgMHgxRiwgMHg2MywgMHgxMCwgMHhGOCwgMHhBQiwgMHg0OCwgMHhDQiwgMHg4RiwgMHgyRCwgMHg2NSwNCisgICAgMHhFNCwgMHhEQywgMHgwQSwgMHg1MCwgMHgwQiwgMHgzQSwgMHhBOCwgMHgwNiwgMHgxRCwgMHgwNywgMHgzMSwgMHgxMiwNCisgICAgMHg1QiwgMHgxRiwgMHgyMywgMHhFMSwgMHhEMSwgMHhCNiwgMHhFOSwgMHhCNiwgMHg1QSwgMHg5MiwgMHhCNiwgMHhDRSwNCisgICAgMHgyRiwgMHhCOSwgMHhGRiwgMHhGMywgMHg0MCwgMHhENiwgMHg2NSwgMHg2RSwgMHhCOCwgMHhCQywgMHgyOCwgMHhGMywNCisgICAgMHg0MSwgMHhDOCwgMHg0QiwgMHhGQywgMHgxMiwgMHhCRSwgMHhDNCwgMHg5MiwgMHhBMiwgMHgxQywgMHgyRCwgMHg0QSwNCisgICAgMHgxQSwgMHgwNSwgMHgzOSwgMHg0QSwgMHhFOSwgMHg2RCwgMHg2NCwgMHgwNSwgMHg3MiwgMHg0NSwgMHhENywgMHg5NSwNCisgICAgMHhDNSwgMHhDNSwgMHg1MiwgMHg5QSwgMHg3NiwgMHg5MywgMHgzMiwgMHg0NywgMHhBOCwgMHhGMiwgMHgzNSwgMHgwMCwNCisgICAgMHhBNCwgMHg5MCwgMHhEMCwgMHgxMCwgMHgwNywgMHhEQiwgMHgyMywgMHg4NiwgMHgyNCwgMHg5MCwgMHg5NCwgMHgyMSwNCisgICAgMHg1NSwgMHg3OSwgMHhGMCwgMHhGNiwgMHhCMSwgMHhBQywgMHhFQiwgMHg3MiwgMHhCRiwgMHhGQiwgMHg0QywgMHgzNiwNCisgICAgMHgwQywgMHhGOSwgMHhFOCwgMHhEMywgMHg2QiwgMHg3OSwgMHg0MywgMHg1NSwgMHgxMiwgMHhGNCwgMHgyMiwgMHg3RCwNCisgICAgMHg2MCwgMHg0NiwgMHg3NSwgMHg0RSwgMHhENywgMHhFNywgMHgwQywgMHg2MywgMHhBRSwgMHg5QywgMHhDNiwgMHgzNywNCisgICAgMHgyMCwgMHg5NCwgMHg5NCwgMHgxMiwgMHg4NCwgMHhERCwgMHgwQiwgMHhDOSwgMHgyOCwgMHg1RiwgMHg3NCwgMHgzRSwNCisgICAgMHhEMiwgMHg2NywgMHhCOCwgMHgxNSwgMHhENiwgMHgzOCwgMHgxQSwgMHhFRCwgMHg4RiwgMHg2NSwgMHg0OCwgMHhCNiwNCisgICAgMHhCNiwgMHhBQiwgMHg3NiwgMHhEQiwgMHg1OCwgMHg1QSwgMHhCQywgMHhCMSwgMHg3QiwgMHhFRiwgMHg0MSwgMHg3MywNCisgICAgMHhENSwgMHhEQiwgMHgwOCwgMHgwQywgMHg0QiwgMHg5MiwgMHg3QywgMHgyNSwgMHg3MSwgMHhFRCwgMHgzQSwgMHg2MiwNCisgICAgMHg2OSwgMHhENywgMHg1MiwgMHg1OCwgMHg1OCwgMHgxMiwgMHhDNywgMHhGOCwgMHgwRSwgMHgzNywgMHgyNSwgMHhDRCwNCisgICAgMHg5QiwgMHhGNCwgMHhCQywgMHhEOSwgMHg2OSwgMHhDRiwgMHhGMywgMHg1NCwgMHgyNSwgMHhDNSwgMHgyQiwgMHg5NiwNCisgICAgMHg5QSwgMHgyRSwgMHg2MywgMHg4OCwgMHg5OCwgMHgxRCwgMHg0OSwgMHgzQiwgMHhFMywgMHg4QiwgMHg0QiwgMHgwQiwNCisgICAgMHg3NywgMHgxMCwgMHgzMywgMHgxMSwgMHg3MSwgMHhDMiwgMHg2NywgMHg5RSwgMHhDRCwgMHhFQSwgMHg4NCwgMHgxOSwNCisgICAgMHg5OSwgMHgwNiwgMHhFMiwgMHhBNiwgMHg4NiwgMHg3RCwgMHg0RSwgMHhBNCwgMHhBMSwgMHgzMCwgMHhCRCwgMHg4NSwNCisgICAgMHg0QywgMHg2QywgMHg0MywgMHhCRSwgMHgxQiwgMHhBNiwgMHhBMywgMHgyQywgMHhDMSwgMHhFRCwgMHg0MiwgMHg0MSwNCisgICAgMHg4MywgMHg1MSwgMHg3NywgMHgwNywgMHg4QiwgMHhGOSwgMHg0RiwgMHg5NiwgMHg1NCwgMHhDNCwgMHgxRCwgMHg5QywNCisgICAgMHgyRCwgMHgyOSwgMHhCMCwgMHgzMSwgMHg3MSwgMHhEQiwgMHg5MiwgMHgzNiwgMHg1NSwgMHg5MiwgMHhFRSwgMHgyMSwNCisgICAgMHg0NiwgMHgyNSwgMHg2RCwgMHgyNiwgMHhDMywgMHgxRSwgMHgxQSwgMHg5MywgMHgxQSwgMHg3NiwgMHgzNCwgMHg4OSwNCisgICAgMHg5NCwgMHgzMywgMHg2OSwgMHgzMCwgMHhEQSwgMHg4MSwgMHg3RSwgMHgyMCwgMHg2OSwgMHg3RiwgMHgwRSwgMHhGOSwNCisgICAgMHg4OSwgMHg5RCwgMHg2NiwgMHg4QywgMHg1MSwgMHhFMSwgMHgzNiwgMHgxNSwgMHgwQiwgMHg0OSwgMHg1QiwgMHhBOSwNCisgICAgMHhBRCwgMHg5RiwgMHg0MCwgMHg5NiwgMHgxQywgMHg0NCwgMHg0NiwgMHhFNCwgMHgxRiwgMHg3RiwgMHg5OSwgMHhCQSwNCisgICAgMHhDNSwgMHhEQiwgMHhERSwgMHhEOSwgMHg0MSwgMHg5QiwgMHhEMCwgMHg4QywgMHg0RSwgMHhEQiwgMHgyOCwgMHgwQywNCisgICAgMHg3MywgMHhBRSwgMHg1MiwgMHhDRiwgMHhERCwgMHg4NiwgMHg2MCwgMHg5OSwgMHgzQSwgMHg0RCwgMHg2QywgMHg4MiwNCisgICAgMHgxQSwgMHhBMywgMHg1MywgMHg3NywgMHg2RiwgMHgwMiwgMHg1RCwgMHg1MiwgMHhDNiwgMHg5MSwgMHg3NSwgMHg0QywNCisgICAgMHhDQywgMHgyNiwgMHg4RCwgMHhDOCwgMHg3NywgMHgwQSwgMHhDOCwgMHg3QSwgMHg4NywgMHg3RiwgMHgyQSwgMHg1QSwNCisgICAgMHg4MiwgMHg1NSwgMHg0NCwgMHhDMCwgMHgwNCwgMHg1MywgMHgzMiwgMHg4NiwgMHg3MCwgMHg5RCwgMHhCQSwgMHgwQywNCisgICAgMHgyMywgMHgwNiwgMHgwQywgMHhDNywgMHgyQSwgMHg2MCwgMHgyQywgMHg1OCwgMHhCNCwgMHg4RSwgMHg0MCwgMHgwRCwNCisgICAgMHhGRiwgMHg5MywgMHg1MiwgMHg0NSwgMHg3NSwgMHg4NiwgMHg3NiwgMHhDNywgMHg1MiwgMHgxNiwgMHgxOCwgMHhBQywNCisgICAgMHhGMywgMHgxNywgMHg3NywgMHgxQywgMHg2NSwgMHhBRCwgMHgwOSwgMHhGMSwgMHg1OCwgMHgwMiwgMHg2RiwgMHhBOSwNCisgICAgMHgyMSwgMHg2QSwgMHgwMSwgMHhCNywgMHhDNiwgMHhEMiwgMHgwQywgMHg1QSwgMHg4QSwgMHhBNiwgMHg3NywgMHg1QywNCisgICAgMHhEMiwgMHhEOCwgMHhBMiwgMHgzRSwgMHgzMywgMHgxOCwgMHg4OSwgMHg3RiwgMHhBQSwgMHgyNSwgMHhFNiwgMHhBOSwNCisgICAgMHgyQSwgMHhDMSwgMHg4NywgMHhCRCwgMHhGNiwgMHgxNywgMHg2QywgMHg0MiwgMHgwOCwgMHgyMX07DQorY29uc3QgdWludDhfdCBnX2tvS1JfTG9jYWxlW10gPSB7DQorICAgIDB4NzgsIDB4OUMsIDB4RUQsIDB4NTYsIDB4NEQsIDB4NkIsIDB4RDQsIDB4NDAsIDB4MTgsIDB4M0UsIDB4NTcsIDB4RjAsDQorICAgIDB4M0YsIDB4MEMsIDB4QzEsIDB4MTIsIDB4ODUsIDB4NzYsIDB4QjcsIDB4RUIsIDB4NzcsIDB4NEIsIDB4MUEsIDB4MjgsDQorICAgIDB4NkUsIDB4NkQsIDB4NjUsIDB4OEQsIDB4OTQsIDB4QTYsIDB4NTgsIDB4RUMsIDB4NDUsIDB4NjYsIDB4OTMsIDB4RTksDQorICAgIDB4MjYsIDB4RUQsIDB4MjYsIDB4NTMsIDB4MjYsIDB4MDksIDB4NzUsIDB4NzMsIDB4QUUsIDB4NTIsIDB4RjAsIDB4RTIsDQorICAgIDB4QTEsIDB4ODcsIDB4RUEsIDB4NkUsIDB4QjEsIDB4MDcsIDB4MTEsIDB4MkEsIDB4ODgsIDB4MjIsIDB4MjIsIDB4MUUsDQorICAgIDB4MTQsIDB4N0YsIDB4OEQsIDB4NjIsIDB4NkQsIDB4OEEsIDB4N0YsIDB4QzEsIDB4QzksIDB4RTcsIDB4RTYsIDB4NjMsDQorICAgIDB4QjIsIDB4NEQsIDB4RUYsIDB4RUUsIDB4NjEsIDB4OTksIDB4RjcsIDB4OTksIDB4RTcsIDB4NzksIDB4RjMsIDB4QkUsDQorICAgIDB4Q0YsIDB4NEMsIDB4NUUsIDB4MjIsIDB4NzQsIDB4QjEsIDB4MDIsIDB4QkIsIDB4MDgsIDB4OTgsIDB4RDAsIDB4NDAsDQorICAgIDB4QjMsIDB4REMsIDB4MjYsIDB4N0UsIDB4REMsIDB4NUEsIDB4RTYsIDB4ODAsIDB4OEEsIDB4MkMsIDB4NjUsIDB4OTYsDQorICAgIDB4RkIsIDB4MzUsIDB4MzgsIDB4MzgsIDB4RkUsIDB4MzQsIDB4RjgsIDB4RkQsIDB4RTEsIDB4RkQsIDB4RTUsIDB4RTMsDQorICAgIDB4RDcsIDB4NDcsIDB4M0YsIDB4RkIsIDB4REYsIDB4QUYsIDB4NzAsIDB4RTIsIDB4QzUsIDB4MEIsIDB4MDAsIDB4MDgsDQorICAgIDB4M0UsIDB4REYsIDB4NTQsIDB4MjEsIDB4OTEsIDB4N0IsIDB4NDYsIDB4MUIsIDB4NzcsIDB4QUQsIDB4NDgsIDB4REEsDQorICAgIDB4MjEsIDB4QTgsIDB4ODMsIDB4ODksIDB4MEUsIDB4NEQsIDB4OUYsIDB4MzUsIDB4MDYsIDB4MDQsIDB4MDMsIDB4OUIsDQorICAgIDB4QjYsIDB4RjYsIDB4ODAsIDB4NkUsIDB4NTksIDB4N0UsIDB4M0MsIDB4MTYsIDB4QzYsIDB4NjIsIDB4QzMsIDB4RUIsDQorICAgIDB4RUYsIDB4MDksIDB4RjUsIDB4NzAsIDB4OUQsIDB4ODIsIDB4QUYsIDB4QjIsIDB4RTEsIDB4NkIsIDB4NkMsIDB4RjgsDQorICAgIDB4M0EsIDB4MUIsIDB4QkUsIDB4QzEsIDB4ODYsIDB4NkYsIDB4QjIsIDB4RTEsIDB4NUIsIDB4NkMsIDB4RjgsIDB4MzYsDQorICAgIDB4MUIsIDB4OUUsIDB4NjYsIDB4QzMsIDB4OEQsIDB4QTksIDB4MTIsIDB4QkMsIDB4QTQsIDB4Q0YsIDB4NDYsIDB4QUUsDQorICAgIDB4NTEsIDB4MTAsIDB4QUQsIDB4MTMsIDB4OUYsIDB4RDIsIDB4QkUsIDB4MDEsIDB4RDgsIDB4NkUsIDB4OTMsIDB4NTksDQorICAgIDB4QUUsIDB4QzEsIDB4RkQsIDB4MzcsIDB4RjAsIDB4M0MsIDB4MDYsIDB4QUEsIDB4QjAsIDB4OTcsIDB4QkEsIDB4NzYsDQorICAgIDB4MzQsIDB4MTIsIDB4QkQsIDB4ODMsIDB4NkYsIDB4REUsIDB4QUIsIDB4M0QsIDB4RkEsIDB4MkYsIDB4RDQsIDB4RkQsDQorICAgIDB4NzAsIDB4ODgsIDB4RjcsIDB4RjcsIDB4OTgsIDB4RjgsIDB4RTksIDB4NEIsIDB4MzYsIDB4RUUsIDB4RUQsIDB4RUUsDQorICAgIDB4MzMsIDB4RjEsIDB4OTMsIDB4NzcsIDB4NDcsIDB4NEMsIDB4RkMsIDB4Q0YsIDB4RDcsIDB4NUQsIDB4NzYsIDB4RkUsDQorICAgIDB4NjcsIDB4ODcsIDB4MzksIDB4MUMsIDB4MDQsIDB4MkIsIDB4NDYsIDB4MTMsIDB4QjksIDB4M0IsIDB4MTAsIDB4NzUsDQorICAgIDB4NTMsIDB4RUMsIDB4QTMsIDB4RDgsIDB4NDEsIDB4QjEsIDB4RjYsIDB4NjIsIDB4RDUsIDB4QzUsIDB4N0EsIDB4OEIsDQorICAgIDB4OTUsIDB4OTYsIDB4RDcsIDB4NjgsIDB4MjAsIDB4QTIsIDB4QUIsIDB4M0EsIDB4MzIsIDB4RDIsIDB4MkYsIDB4NzksDQorICAgIDB4MDQsIDB4ODksIDB4REUsIDB4RkUsIDB4MUIsIDB4RUYsIDB4NzAsIDB4ODcsIDB4MUUsIDB4NEUsIDB4MEMsIDB4MTQsDQorICAgIDB4QjYsIDB4NEYsIDB4RkIsIDB4QjksIDB4NkQsIDB4MzAsIDB4MEMsIDB4NTMsIDB4MEYsIDB4NDEsIDB4MDQsIDB4QTYsDQorICAgIDB4RjIsIDB4RDMsIDB4ODgsIDB4NTYsIDB4RjksIDB4RDEsIDB4RUIsIDB4QkYsIDB4MDgsIDB4QjIsIDB4RkIsIDB4NjEsDQorICAgIDB4ODIsIDB4N0IsIDB4M0IsIDB4MDMsIDB4QkEsIDB4OTUsIDB4ODAsIDB4MjAsIDB4NTgsIDB4QzUsIDB4NUEsIDB4M0EsDQorICAgIDB4QjYsIDB4RUEsIDB4QjksIDB4QjksIDB4MTUsIDB4QTIsIDB4MkEsIDB4QjQsIDB4RDEsIDB4MTIsIDB4QjQsIDB4NkQsDQorICAgIDB4NDQsIDB4Q0MsIDB4QzQsIDB4RkEsIDB4MDQsIDB4ODksIDB4NDYsIDB4REIsIDB4QkEsIDB4RDMsIDB4RUQsIDB4NzIsDQorICAgIDB4RTIsIDB4MjMsIDB4RkEsIDB4RTMsIDB4NEYsIDB4OUUsIDB4RUUsIDB4RjAsIDB4NDAsIDB4RTIsIDB4QTksIDB4RTMsDQorICAgIDB4M0MsIDB4NjgsIDB4RjIsIDB4RjQsIDB4MjgsIDB4NzgsIDB4MzAsIDB4NEYsIDB4N0YsIDB4QkUsIDB4MzUsIDB4ODksDQorICAgIDB4QUEsIDB4MkMsIDB4NEQsIDB4MTcsIDB4OUIsIDB4OUQsIDB4RDIsIDB4MzQsIDB4OTUsIDB4MzIsIDB4MTgsIDB4NDgsDQorICAgIDB4MEQsIDB4MTMsIDB4RDQsIDB4ODAsIDB4MjQsIDB4RDUsIDB4NDAsIDB4QjMsIDB4NTksIDB4NDksIDB4NjUsIDB4NjksDQorICAgIDB4OTgsIDB4RDgsIDB4QkUsIDB4QUUsIDB4NEMsIDB4MDUsIDB4NDAsIDB4MDYsIDB4ODksIDB4OUMsIDB4QjEsIDB4NzUsDQorICAgIDB4MjMsIDB4RTcsIDB4NEMsIDB4MEEsIDB4QzksIDB4MzgsIDB4MzMsIDB4MDcsIDB4MzQsIDB4OEQsIDB4RjcsIDB4OUUsDQorICAgIDB4MEYsIDB4NjgsIDB4NEIsIDB4MTIsIDB4N0YsIDB4RjIsIDB4ODUsIDB4QjYsIDB4MjYsIDB4Q0IsIDB4QkMsIDB4RjcsDQorICAgIDB4NzksIDB4OTcsIDB4MDcsIDB4NkIsIDB4NDIsIDB4M0QsIDB4MjUsIDB4MkEsIDB4Q0IsIDB4MTIsIDB4MUEsIDB4NTMsDQorICAgIDB4OUEsIDB4QTUsIDB4NTIsIDB4OEUsIDB4QzAsIDB4MUEsIDB4OUEsIDB4NjIsIDB4NDYsIDB4OTIsIDB4NjYsIDB4NjQsDQorICAgIDB4QjksIDB4OTIsIDB4MjQsIDB4RjIsIDB4MjUsIDB4MTQsIDB4RTUsIDB4MTUsIDB4QkUsIDB4MjcsIDB4MzksIDB4MDcsDQorICAgIDB4QTIsIDB4REIsIDB4QjIsIDB4NDIsIDB4RDEsIDB4RjgsIDB4MEEsIDB4MkQsIDB4NDAsIDB4NzMsIDB4NjMsIDB4NzMsDQorICAgIDB4RDEsIDB4QjAsIDB4RTQsIDB4RjksIDB4RTYsIDB4REQsIDB4RUQsIDB4RDUsIDB4MjcsIDB4NUEsIDB4Q0IsIDB4NUQsDQorICAgIDB4MEIsIDB4QUQsIDB4NEMsIDB4OTMsIDB4MDIsIDB4QTUsIDB4RTksIDB4MTgsIDB4NkQsIDB4NDQsIDB4QjIsIDB4N0UsDQorICAgIDB4NjYsIDB4QjAsIDB4QTgsIDB4MjgsIDB4OEEsIDB4RDEsIDB4OTcsIDB4NDAsIDB4RTEsIDB4NDQsIDB4NzcsIDB4QzIsDQorICAgIDB4NzUsIDB4QTcsIDB4NkIsIDB4QUUsIDB4RUIsIDB4MEEsIDB4RjUsIDB4MEMsIDB4QUYsIDB4NUMsIDB4QUEsIDB4MzgsDQorICAgIDB4ODQsIDB4MjAsIDB4NTMsIDB4RTksIDB4NzEsIDB4RTIsIDB4QTUsIDB4NDAsIDB4NUMsIDB4NTksIDB4QjgsIDB4ODUsDQorICAgIDB4ODgsIDB4ODIsIDB4NEMsIDB4M0IsIDB4N0EsIDB4RTYsIDB4NzgsIDB4NTEsIDB4RTcsIDB4OUIsIDB4NTEsIDB4NjgsDQorICAgIDB4MjAsIDB4NjksIDB4NkEsIDB4RDgsIDB4RTcsIDB4NTgsIDB4MTYsIDB4OEEsIDB4RDIsIDB4QUIsIDB4NDgsIDB4RDEsDQorICAgIDB4MEQsIDB4NDgsIDB4RUYsIDB4NDksIDB4MkQsIDB4Q0UsIDB4MTIsIDB4NkUsIDB4OTcsIDB4MEEsIDB4M0EsIDB4MDQsDQorICAgIDB4M0IsIDB4NUIsIDB4QkEsIDB4N0YsIDB4MjcsIDB4MjYsIDB4MkEsIDB4MkEsIDB4OTIsIDB4MEUsIDB4QzYsIDB4MkIsDQorICAgIDB4MEEsIDB4MEMsIDB4REQsIDB4NzQsIDB4MkMsIDB4NEUsIDB4OUMsIDB4QUMsIDB4NDgsIDB4NzcsIDB4MTEsIDB4QzEsDQorICAgIDB4OUMsIDB4MzgsIDB4NTUsIDB4NjAsIDB4MEYsIDB4OEQsIDB4QzksIDB4MUMsIDB4NzYsIDB4N0MsIDB4MTIsIDB4MTksDQorICAgIDB4NjcsIDB4QjIsIDB4NjAsIDB4N0MsIDB4MDcsIDB4ODMsIDB4ODAsIDB4MTMsIDB4RkYsIDB4RkUsIDB4NzgsIDB4NEIsDQorICAgIDB4MDcsIDB4NTQsIDB4ODYsIDB4MzEsIDB4NDIsIDB4QTUsIDB4NUIsIDB4RDgsIDB4NUYsIDB4NzAsIDB4NjIsIDB4NkIsDQorICAgIDB4NzksIDB4RjUsIDB4MUMsIDB4QjIsIDB4RjQsIDB4NDEsIDB4MTQsIDB4NDQsIDB4QzEsIDB4ODQsIDB4MkMsIDB4RDQsDQorICAgIDB4RUQsIDB4Q0YsIDB4ODEsIDB4REUsIDB4MTYsIDB4NUEsIDB4ODcsIDB4NEEsIDB4M0MsIDB4OTAsIDB4RTMsIDB4MzAsDQorICAgIDB4Q0EsIDB4MzksIDB4QTcsIDB4RTIsIDB4MzYsIDB4MDIsIDB4NTIsIDB4Q0YsIDB4MzEsIDB4M0IsIDB4MUIsIDB4MTgsDQorICAgIDB4QzgsIDB4QjYsIDB4MEEsIDB4MjQsIDB4QUUsIDB4Q0UsIDB4NjQsIDB4NEEsIDB4M0QsIDB4RkEsIDB4NzUsIDB4QTgsDQorICAgIDB4ODIsIDB4MjUsIDB4RUEsIDB4NjQsIDB4MDksIDB4NDEsIDB4MzcsIDB4NzUsIDB4NkMsIDB4OEUsIDB4MjAsIDB4REMsDQorICAgIDB4QzEsIDB4MEUsIDB4RDEsIDB4MTEsIDB4RjEsIDB4OUYsIDB4NTIsIDB4QzIsIDB4MDgsIDB4QUIsIDB4NTksIDB4RDIsDQorICAgIDB4Q0YsIDB4QTQsIDB4MkMsIDB4QTIsIDB4MzYsIDB4NDEsIDB4REIsIDB4MjMsIDB4MjksIDB4NzMsIDB4MDQsIDB4QjYsDQorICAgIDB4RTksIDB4OEIsIDB4MzgsIDB4OEEsIDB4QjIsIDB4QTIsIDB4NDEsIDB4QkQsIDB4ODQsIDB4RDAsIDB4QzIsIDB4QUUsDQorICAgIDB4QjMsIDB4MDksIDB4QzEsIDB4MDIsIDB4QjYsIDB4MzUsIDB4NUQsIDB4RjEsIDB4N0IsIDB4OUEsIDB4N0MsIDB4NzgsDQorICAgIDB4QUYsIDB4RDQsIDB4OUEsIDB4ODgsIDB4NEMsIDB4MEQsIDB4NTAsIDB4MzQsIDB4MUMsIDB4OTMsIDB4OTcsIDB4NDcsDQorICAgIDB4M0UsIDB4OUEsIDB4NzIsIDB4M0IsIDB4ODEsIDB4REQsIDB4RjcsIDB4NDcsIDB4RDIsIDB4NjQsIDB4OUMsIDB4QTEsDQorICAgIDB4MDUsIDB4NTMsIDB4MkQsIDB4NzUsIDB4OUUsIDB4NDIsIDB4M0QsIDB4RkMsIDB4RkMsIDB4MTcsIDB4RkYsIDB4MDEsDQorICAgIDB4REMsIDB4RjEsIDB4MTgsIDB4RDN9Ow0KK2NvbnN0IHVpbnQ4X3QgZ19lc0VTX0xvY2FsZVtdID0gew0KKyAgICAweDc4LCAweDlDLCAweDlELCAweDU2LCAweENGLCAweDZCLCAweEQ0LCAweDQwLCAweDE0LCAweEJFLCAweDBCLCAweEZFLA0KKyAgICAweDBGLCAweDIxLCAweDU4LCAweDU2LCAweEExLCAweERELCAweEQxLCAweDYzLCAweENCLCAweDM2LCAweDUwLCAweERBLA0KKyAgICAweERBLCAweDk1LCAweDFBLCAweDU5LCAweDlBLCAweEFBLCAweEQ4LCAweDhCLCAweDRDLCAweDkyLCAweEU5LCAweEVFLA0KKyAgICAweEI0LCAweEM5LCAweENDLCAweDMyLCAweDQ5LCAweDJDLCAweDlCLCAweEEzLCAweEUwLCAweDQxLCAweDEwLCAweDBCLA0KKyAgICAweERFLCAweDhBLCAweDI3LCAweDBGLCAweDFFLCAweDA0LCAweDhCLCAweDc3LCAweDUxLCAweDNDLCAweEY0LCAweDNGLA0KKyAgICAweDExLCAweDZBLCAweEVCLCAweEM5LCAweDdGLCAweEMxLCAweDM3LCAweDlCLCAweDQ5LCAweDM2LCAweDNGLCAweDY2LA0KKyAgICAweEQ3LCAweDYwLCAweDRFLCAweEYzLCAweEJFLCAweEY3LCAweDdELCAweDJGLCAweEVGLCAweDdELCAweDkzLCAweDRDLA0KKyAgICAweEQyLCAweDBCLCAweEI4LCAweDg3LCAweDAzLCAweDYyLCAweDMwLCAweDFDLCAweDkyLCAweDc1LCAweDkzLCAweDQ0LA0KKyAgICAweENGLCAweEI3LCAweDFELCAweEQzLCAweEYwLCAweDQ5LCAweEU0LCAweEFELCAweDlCLCAweEQ3LCAweDFGLCAweDdGLA0KKyAgICAweDVDLCAweDlELCAweDlFLCAweDVGLCAweEJELCAweDNFLCAweEJCLCAweEZFLCAweDcyLCAweDdFLCAweEJCLCAweDA4LA0KKyAgICAweEZFLCAweDdDLCAweDdCLCAweDczLCAweEY5LCAweEZFLCAweEZCLCAweEVGLCAweEIzLCAweDU3LCAweEJGLCAweERFLA0KKyAgICAweEJFLCAweEJCLCAweEZDLCAweDdBLCAweDdBLCAweEM3LCAweEI0LCAweDdBLCAweEIyLCAweDAwLCAweEYzLCAweEIxLA0KKyAgICAweDcwLCAweDI2LCAweEExLCAweENCLCAweDgzLCAweDQ4LCAweEQ1LCAweDFBLCAweDBBLCAweDMyLCAweEU0LCAweDgyLA0KKyAgICAweDYyLCAweDA2LCAweDhDLCAweDkwLCAweEIzLCAweDc4LCAweEY0LCAweDA4LCAweEUwLCAweDQ4LCAweEFELCAweDJELA0KKyAgICAweEMyLCAweDg4LCAweEUwLCAweDNELCAweDk0LCAweDA1LCAweDM3LCAweDZGLCAweDI4LCAweEY0LCAweDkwLCAweEI4LA0KKyAgICAweDQyLCAweDg3LCAweDg3LCAweDU4LCAweEE0LCAweDRELCAweDE0LCAweEJCLCAweDgyLCAweDA2LCAweDFBLCAweEVFLA0KKyAgICAweEE0LCAweDQ5LCAweDNELCAweDRBLCAweDE4LCAweEQ1LCAweEExLCAweDgxLCAweDA2LCAweEM1LCAweDQzLCAweDFFLA0KKyAgICAweEM1LCAweDRELCAweDM4LCAweDIyLCAweEUzLCAweDk4LCAweDkyLCAweDEwLCAweDFBLCAweDZDLCAweEE0LCAweEI4LA0KKyAgICAweDE3LCAweDI3LCAweDNBLCAweDlDLCAweEYxLCAweDE3LCAweDczLCAweDE0LCAweDNFLCAweEY1LCAweDFBLCAweDE5LA0KKyAgICAweDU0LCAweDcyLCAweDI5LCAweDI3LCAweDRFLCAweDIzLCAweDAzLCAweEJCLCAweEFFLCAweDU4LCAweDM3LCAweEVGLA0KKyAgICAweDk5LCAweDI1LCAweEYzLCAweDc0LCAweEQ2LCAweEU5LCAweDZDLCAweEQzLCAweDk5LCAweEE2LCAweEIzLCAweDRDLA0KKyAgICAweEU3LCAweDk4LCAweENFLCAweDJGLCAweDlELCAweDVCLCAweDNBLCAweEFCLCAweDc0LCAweDFFLCAweEU5LCAweEZDLA0KKyAgICAweEQxLCAweDM5LCAweDMzLCAweERGLCAweDEzLCAweDFGLCAweDRGLCAweEQ0LCAweDUzLCAweDA0LCAweDJCLCAweENCLA0KKyAgICAweEU3LCAweDIxLCAweDY1LCAweEYyLCAweEY2LCAweDMyLCAweEM4LCAweEIyLCAweDU2LCAweDkwLCAweDMwLCAweDEyLA0KKyAgICAweDU1LCAweDEwLCAweDMwLCAweDIxLCAweEFFLCAweDQzLCAweEY0LCAweEUyLCAweDkzLCAweEYwLCAweDc4LCAweDUwLA0KKyAgICAweDgzLCAweDhGLCAweDEyLCAweEYyLCAweEEyLCAweDA2LCAweEMxLCAweEZFLCAweDg5LCAweDdBLCAweEMxLCAweEU4LA0KKyAgICAweEUyLCAweDgzLCAweDhCLCAweEZELCAweEQ5LCAweDZELCAweDUxLCAweEQxLCAweDU1LCAweEE5LCAweEMzLCAweEQyLA0KKyAgICAweDlFLCAweEE5LCAweDU2LCAweEVCLCAweDZELCAweEQ2LCAweDlCLCAweDZDLCAweDc0LCAweDU4LCAweEVGLCAweEFELA0KKyAgICAweERFLCAweDU4LCAweEEzLCAweDI5LCAweDdELCAweDQ3LCAweDIxLCAweDExLCAweEQ0LCAweDg3LCAweDg3LCAweDJELA0KKyAgICAweDdGLCAweEZELCAweDU0LCAweDY4LCAweDZELCAweEQ4LCAweEUwLCAweDZFLCAweDFFLCAweDk0LCAweDc4LCAweEQ2LA0KKyAgICAweEEwLCAweDk2LCAweDQwLCAweEQ1LCAweDBBLCAweDgwLCAweDEwLCAweDgxLCAweDU1LCAweDM1LCAweDU4LCAweDU5LA0KKyAgICAweEI4LCAweEJCLCAweEQ5LCAweEVELCAweDIxLCAweEI5LCAweENBLCAweDUyLCAweDk2LCAweDVGLCAweDA2LCAweDUwLA0KKyAgICAweDQxLCAweDk2LCAweDQxLCAweEVELCAweEE4LCAweEM4LCAweEJBLCAweDhGLCAweEM5LCAweDAwLCAweEM3LCAweDMxLA0KKyAgICAweDE4LCAweDNELCAweERELCAweEQ3LCAweDIyLCAweDUyLCAweEU3LCAweEM4LCAweDYxLCAweDEyLCAweDA0LCAweEE2LA0KKyAgICAweEI1LCAweDBELCAweDk3LCAweEIxLCAweEQ1LCAweDgxLCAweEEzLCAweEM5LCAweEU4LCAweEQ4LCAweDcwLCAweDY1LA0KKyAgICAweEFCLCAweDY3LCAweDcwLCAweEM5LCAweDY5LCAweDBCLCAweDRELCAweEFELCAweEEwLCAweDJBLCAweDExLCAweDcwLA0KKyAgICAweDM2LCAweDM0LCAweEFELCAweEZGLCAweDU1LCAweDg3LCAweEM0LCAweDA3LCAweEYxLCAweDE2LCAweEIyLCAweDZELA0KKyAgICAweEQ0LCAweDUyLCAweDExLCAweDhELCAweEI4LCAweDg4LCAweDY3LCAweDlBLCAweDg2LCAweDAyLCAweDU1LCAweDY2LA0KKyAgICAweDA2LCAweDIwLCAweEE2LCAweDYxLCAweEM5LCAweDgzLCAweDUyLCAweDU0LCAweEYxLCAweEEwLCAweERGLCAweEVGLA0KKyAgICAweEY0LCAweEExLCAweEZELCAweDBFLCAweDVDLCAweDBFLCAweDlDLCAweEQyLCAweDA3LCAweDNELCAweDU0LCAweDYyLA0KKyAgICAweEQ2LCAweENBLCAweDU0LCAweDI2LCAweEVGLCAweEY3LCAweEQ3LCAweDZDLCAweDdCLCAweENELCAweDcxLCAweDVBLA0KKyAgICAweDQ5LCAweEE2LCAweEUzLCAweDJBLCAweDQxLCAweDBCLCAweEJBLCAweDlBLCAweDU1LCAweDBBLCAweDFBLCAweDZDLA0KKyAgICAweDU0LCAweDk5LCAweDRCLCAweDU5LCAweEI1LCAweDBGLCAweDU4LCAweEJFLCAweEZELCAweDNCLCAweDg5LCAweDFELA0KKyAgICAweDFGLCAweDhGLCAweEMyLCAweEM4LCAweEQ5LCAweERFLCAweEJBLCAweDdGLCAweEYyLCAweDE0LCAweDhGLCAweDc2LA0KKyAgICAweEQzLCAweDgzLCAweENDLCAweDlDLCAweDMyLCAweDA5LCAweDc0LCAweDJDLCAweDA5LCAweDVELCAweDIyLCAweDY2LA0KKyAgICAweDBFLCAweDU1LCAweDYyLCAweEQ1LCAweDA4LCAweDYwLCAweEYwLCAweDlDLCAweDdBLCAweEE2LCAweDk1LCAweDJFLA0KKyAgICAweEE3LCAweEU5LCAweDZBLCAweDM3LCAweDRELCAweEQzLCAweDFFLCAweEFBLCAweEYwLCAweDFBLCAweDg1LCAweDk0LA0KKyAgICAweEQwLCAweDRCLCAweDg0LCAweDIwLCAweENDLCAweDlCLCAweEU0LCAweENBLCAweEQ1LCAweDU1LCAweEUzLCAweDU2LA0KKyAgICAweDRCLCAweEU5LCAweDk4LCAweDA4LCAweDhGLCAweEIwLCAweDU4LCAweDI5LCAweDk3LCAweDM0LCAweDJBLCAweDU0LA0KKyAgICAweDZCLCAweEJELCAweDI4LCAweDk0LCAweDRGLCAweDU3LCAweDA5LCAweDU1LCAweDU5LCAweDlGLCAweDc4LCAweDM0LA0KKyAgICAweEM0LCAweEIwLCAweEUzLCAweENCLCAweEI5LCAweDNFLCAweDRCLCAweEQ3LCAweEQ1LCAweEM1LCAweDk3LCAweDk2LA0KKyAgICAweDI3LCAweDYzLCAweDJBLCAweDM3LCAweEJBLCAweERCLCAweDhBLCAweDVGLCAweDc0LCAweEJELCAweEQ0LCAweDhBLA0KKyAgICAweDBFLCAweDg3LCAweDZDLCAweDEyLCAweDk5LCAweEQ2LCAweDRBLCAweDJCLCAweDcyLCAweDBBLCAweDlGLCAweDZGLA0KKyAgICAweEQzLCAweEJBLCAweERCLCAweEU0LCAweEEyLCAweEVBLCAweEQ4LCAweDgwLCAweEU0LCAweEJFLCAweDE3LCAweDRFLA0KKyAgICAweDU0LCAweDgxLCAweEZDLCAweEY5LCAweDlBLCAweDA2LCAweEE2LCAweEY1LCAweEYzLCAweEU1LCAweDY3LCAweDM4LA0KKyAgICAweDNFLCAweDJBLCAweDhDLCAweDY2LCAweDExLCAweEE1LCAweEExLCAweDExLCAweDk3LCAweDBCLCAweDM4LCAweDM1LA0KKyAgICAweDFFLCAweEVGLCAweEI1LCAweDE2LCAweDk1LCAweDRELCAweDZGLCAweDRBLCAweDUwLCAweEJELCAweDVCLCAweEY5LA0KKyAgICAweDMyLCAweDRDLCAweEM2LCAweEU0LCAweDEwLCAweDdCLCAweEYyLCAweDFDLCAweENDLCAweDk3LCAweEFBLCAweDk2LA0KKyAgICAweDNELCAweDgxLCAweDFGLCAweDFGLCAweERGLCAweDE4LCAweDgwLCAweDE3LCAweEE4LCAweENDLCAweENDLCAweEQzLA0KKyAgICAweDE0LCAweEZFLCAweDQ2LCAweEQ4LCAweERDLCAweEY0LCAweDI2LCAweDRGLCAweDA0LCAweDdDLCAweDc3LCAweDBDLA0KKyAgICAweDI3LCAweEY2LCAweEI1LCAweEY5LCAweDBELCAweDlGLCAweEJCLCAweEM0LCAweDE4LCAweEQwLCAweDdGLCAweDEwLA0KKyAgICAweEZBLCAweEYyLCAweDY3LCAweEVBLCAweDY0LCAweDAxLCAweDYxLCAweDQzLCAweDYwLCAweDE3LCAweDVFLCAweDk4LA0KKyAgICAweEY5LCAweDg0LCAweEZELCAweDExLCAweEE2LCAweERBLCAweEY0LCAweDJFLCAweDRGLCAweDkzLCAweDYzLCAweDZDLA0KKyAgICAweEVDLCAweEYwLCAweDc4LCAweDQ0LCAweDNELCAweDM5LCAweEM3LCAweENBLCAweDkzLCAweDA3LCAweDg2LCAweEJELA0KKyAgICAweDg4LCAweDBBLCAweDIzLCAweDdCLCAweDIzLCAweDlFLCAweDUzLCAweEY3LCAweDE2LCAweERDLCAweDE0LCAweDk4LA0KKyAgICAweDQzLCAweDM5LCAweDk5LCAweEYxLCAweDcwLCAweDAxLCAweEM5LCAweEUxLCAweDJELCAweDQ4LCAweEY2LCAweDI0LA0KKyAgICAweDYxLCAweEMzLCAweDIzLCAweDNFLCAweEU1LCAweEE5LCAweEU2LCAweEQwLCAweDZDLCAweENGLCAweDY0LCAweDk0LA0KKyAgICAweEZELCAweEZDLCAweEMyLCAweEYyLCAweDJGLCAweDdDLCAweERDLCAweENDLCAweDJGLA0KK307DQorY29uc3QgdWludDhfdCBnX2VzTEFfTG9jYWxlW10gPSB7DQorICAgIDB4NzgsIDB4OUMsIDB4OUQsIDB4NTYsIDB4Q0QsIDB4NEUsIDB4REMsIDB4MzAsIDB4MTAsIDB4M0UsIDB4NTMsIDB4QTksDQorICAgIDB4RUYsIDB4NjAsIDB4NDUsIDB4NDUsIDB4ODAsIDB4MDQsIDB4OUIsIDB4RjYsIDB4QjgsIDB4MjgsIDB4NDQsIDB4NUEsDQorICAgIDB4MDEsIDB4QTUsIDB4MTUsIDB4MEQsIDB4NUEsIDB4NzUsIDB4NTEsIDB4NEIsIDB4QjksIDB4NTQsIDB4NEUsIDB4NjIsDQorICAgIDB4MzYsIDB4ODYsIDB4QzQsIDB4NUUsIDB4MzksIDB4MDksIDB4NjgsIDB4QTMsIDB4QkUsIDB4NDAsIDB4NEYsIDB4M0QsDQorICAgIDB4RjQsIDB4RDQsIDB4NjMsIDB4MkIsIDB4MjEsIDB4QjUsIDB4MDcsIDB4RDQsIDB4NDcsIDB4RTgsIDB4ODEsIDB4NjcsDQorICAgIDB4NDEsIDB4RjAsIDB4MTgsIDB4OUQsIDB4RkMsIDB4NkUsIDB4MTIsIDB4M0IsIDB4RTksIDB4RDIsIDB4OUMsIDB4M0MsDQorICAgIDB4REYsIDB4N0MsIDB4OUYsIDB4NzcsIDB4RTYsIDB4QjMsIDB4MzMsIDB4MUIsIDB4QzMsIDB4RTcsIDB4MEUsIDB4RjYsDQorICAgIDB4MDksIDB4NjIsIDB4MzgsIDB4MjAsIDB4M0IsIDB4MUEsIDB4MDksIDB4M0YsIDB4NUEsIDB4MjcsIDB4MUEsIDB4NzIsDQorICAgIDB4NDksIDB4RTgsIDB4RUMsIDB4NjgsIDB4MEYsIDB4RDcsIDB4N0YsIDB4RUUsIDB4QkYsIDB4REMsIDB4REMsIDB4N0YsDQorICAgIDB4RkUsIDB4RjYsIDB4RjAsIDB4RkIsIDB4NjYsIDB4RkQsIDB4RUUsIDB4QzcsIDB4NEYsIDB4ODgsIDB4RUYsIDB4QkUsDQorICAgIDB4NUUsIDB4NkYsIDB4NjgsIDB4RTYsIDB4RDMsIDB4MjcsIDB4MDgsIDB4MTksIDB4QTksIDB4OEEsIDB4QjksIDB4NTgsDQorICAgIDB4NEMsIDB4RTYsIDB4ODEsIDB4Q0QsIDB4RkQsIDB4QjAsIDB4RDgsIDB4NjAsIDB4MkEsIDB4QzgsIDB4OTQsIDB4MEIsDQorICAgIDB4OEEsIDB4NTksIDB4Q0EsIDB4NUEsIDB4NDEsIDB4NDYsIDB4QzAsIDB4NTksIDB4RTQsIDB4MUQsIDB4NDEsIDB4MkEsDQorICAgIDB4NEMsIDB4RTMsIDB4OTUsIDB4M0MsIDB4MzYsIDB4MDksIDB4MjMsIDB4ODIsIDB4MUIsIDB4N0EsIDB4MUUsIDB4RDQsDQorICAgIDB4RjAsIDB4MzMsIDB4NjIsIDB4MEIsIDB4NzUsIDB4MjYsIDB4QzAsIDB4MjIsIDB4NTEsIDB4RTEsIDB4RDgsIDB4MTYsDQorICAgIDB4RDQsIDB4NTcsIDB4RjIsIDB4RTcsIDB4MkEsIDB4RkEsIDB4NzksIDB4Q0MsIDB4QTgsIDB4MUEsIDB4RjcsIDB4OTUsDQorICAgIDB4MzgsIDB4OUUsIDB4RjIsIDB4MzAsIDB4NTIsIDB4MjUsIDB4NDIsIDB4MzIsIDB4OEIsIDB4MjgsIDB4MDksIDB4QTAsDQorICAgIDB4NUMsIDB4NDUsIDB4OTIsIDB4M0IsIDB4NTEsIDB4QUMsIDB4Q0UsIDB4MzAsIDB4N0UsIDB4RDksIDB4QTksIDB4NzIsDQorICAgIDB4QTksIDB4MjMsIDB4RTUsIDB4NTAsIDB4QjEsIDB4QUUsIDB4MUMsIDB4QUMsIDB4M0IsIDB4OEEsIDB4QjAsIDB4NkQsDQorICAgIDB4OEIsIDB4MUQsIDB4RUQsIDB4ODUsIDB4RDYsIDB4QjIsIDB4NTYsIDB4NkQsIDB4QUMsIDB4REEsIDB4NTQsIDB4QjUsDQorICAgIDB4QTUsIDB4NkEsIDB4NDMsIDB4RDUsIDB4N0UsIDB4QUEsIDB4REQsIDB4NTQsIDB4N0IsIDB4QTksIDB4MzYsIDB4NTIsDQorICAgIDB4RUQsIDB4QTAsIDB4REEsIDB4M0QsIDB4QjUsIDB4NkYsIDB4RkQsIDB4OEUsIDB4QjksIDB4NzgsIDB4NUUsIDB4QkIsDQorICAgIDB4ODEsIDB4MTAsIDB4OTksIDB4MkUsIDB4MEYsIDB4MjgsIDB4NEIsIDB4Q0IsIDB4NDksIDB4ODMsIDB4MEEsIDB4RjUsDQorICAgIDB4NjMsIDB4NDYsIDB4QzIsIDB4MTYsIDB4MDYsIDB4MTYsIDB4NDUsIDB4MzIsIDB4NDgsIDB4NkYsIDB4N0YsIDB4MDksDQorICAgIDB4ODcsIDB4RkIsIDB4NTIsIDB4RTIsIDB4M0MsIDB4MjYsIDB4OTcsIDB4MTIsIDB4MDgsIDB4MjcsIDB4MkUsIDB4RTQsDQorICAgIDB4OEQsIDB4QzMsIDB4REIsIDB4RUYsIDB4MzYsIDB4NzYsIDB4MTcsIDB4MjUsIDB4QTAsIDB4NkMsIDB4QTUsIDB4QTgsDQorICAgIDB4QkEsIDB4NzUsIDB4Q0EsIDB4NDUsIDB4RjksIDB4NzIsIDB4RTksIDB4NzIsIDB4RTEsIDB4OEEsIDB4QUEsIDB4RTUsDQorICAgIDB4N0EsIDB4RTUsIDB4NjIsIDB4MTUsIDB4ODUsIDB4NzYsIDB4NTcsIDB4MTksIDB4MTAsIDB4NDEsIDB4NUQsIDB4QjgsDQorICAgIDB4QjYsIDB4RjUsIDB4NTcsIDB4QkMsIDB4ODAsIDB4Q0MsIDB4OTEsIDB4MDUsIDB4NjcsIDB4NTEsIDB4MDYsIDB4Q0QsDQorICAgIDB4RDQsIDB4QjgsIDB4OTUsIDB4NDIsIDB4OEIsIDB4QjAsIDB4QjYsIDB4MzksIDB4MTEsIDB4QjgsIDB4QjYsIDB4MkYsDQorICAgIDB4NDQsIDB4MjYsIDB4MUUsIDB4RUMsIDB4MEUsIDB4MEMsIDB4M0QsIDB4NUQsIDB4NTUsIDB4OTAsIDB4NUIsIDB4ODcsDQorICAgIDB4NTAsIDB4QjYsIDB4MkEsIDB4NDUsIDB4MzAsIDB4QTUsIDB4RjQsIDB4RDYsIDB4OTgsIDB4Q0EsIDB4NTEsIDB4MTcsDQorICAgIDB4NDcsIDB4NjQsIDB4OEMsIDB4QTMsIDB4MDgsIDB4MEUsIDB4QTYsIDB4NzIsIDB4QkIsIDB4NDIsIDB4OEEsIDB4NDksDQorICAgIDB4NzYsIDB4MTYsIDB4RkIsIDB4QkUsIDB4NjYsIDB4RUUsIDB4QzMsIDB4ODMsIDB4RjYsIDB4RDYsIDB4NjAsIDB4MjIsDQorICAgIDB4QTIsIDB4MzUsIDB4MEIsIDB4OUUsIDB4N0MsIDB4RjUsIDB4MDEsIDB4OUUsIDB4RDQsIDB4ODksIDB4NEEsIDB4RDMsDQorICAgIDB4QjUsIDB4ODksIDB4Q0YsIDB4RDksIDB4NTQsIDB4MzMsIDB4RkYsIDB4NUYsIDB4MUYsIDB4MTAsIDB4MTcsIDB4RTQsDQorICAgIDB4N0IsIDB4QkEsIDB4NjUsIDB4RTksIDB4NEIsIDB4NkIsIDB4NDIsIDB4OEYsIDB4OEIsIDB4NjgsIDB4QTEsIDB4NkEsDQorICAgIDB4NkIsIDB4MTAsIDB4NkEsIDB4MjAsIDB4ODUsIDB4MjMsIDB4MTEsIDB4MEQsIDB4NUEsIDB4OEUsIDB4RDQsIDB4OTAsDQorICAgIDB4ODYsIDB4MjMsIDB4OUUsIDB4QjcsIDB4NkQsIDB4NTksIDB4REIsIDB4OTMsIDB4MDksIDB4MUEsIDB4QTEsIDB4NTMsDQorICAgIDB4NDMsIDB4QUYsIDB4QjEsIDB4QkEsIDB4NjQsIDB4QjksIDB4MDcsIDB4OEYsIDB4OTYsIDB4NjUsIDB4QUQsIDB4MkYsDQorICAgIDB4NTQsIDB4NEIsIDB4NjksIDB4OEEsIDB4RDYsIDB4MzMsIDB4OTUsIDB4MkMsIDB4NDksIDB4M0IsIDB4NkYsIDB4RjUsDQorICAgIDB4NTksIDB4REMsIDB4ODUsIDB4NjMsIDB4NDAsIDB4Q0IsIDB4MEIsIDB4NzIsIDB4MTAsIDB4NUIsIDB4RDEsIDB4ODUsDQorICAgIDB4MTcsIDB4ODQsIDB4OTMsIDB4RkQsIDB4QkQsIDB4OTcsIDB4NTcsIDB4RUYsIDB4QjEsIDB4NzcsIDB4OTgsIDB4OUMsDQorICAgIDB4RTYsIDB4ODYsIDB4RDUsIDB4NDksIDB4OTksIDB4OTIsIDB4QzUsIDB4ODEsIDB4NEQsIDB4NDQsIDB4RDMsIDB4QjUsDQorICAgIDB4MDYsIDB4NTYsIDB4NTQsIDB4MDUsIDB4MTgsIDB4REMsIDB4NkQsIDB4NDcsIDB4MzMsIDB4OTMsIDB4Q0QsIDB4MjQsDQorICAgIDB4MTksIDB4MEUsIDB4OTIsIDB4MjQsIDB4MzEsIDB4RjQsIDB4MDYsIDB4QUYsIDB4NUIsIDB4RUEsIDB4QzQsIDB4NDIsDQorICAgIDB4MTAsIDB4RTYsIDB4Q0MsIDB4MzUsIDB4RjMsIDB4NTksIDB4MkUsIDB4MUUsIDB4MEUsIDB4M0YsIDB4QUQsIDB4NTcsDQorICAgIDB4Q0IsIDB4OEQsIDB4QTUsIDB4RjcsIDB4OTksIDB4MTEsIDB4RTEsIDB4MTAsIDB4MTYsIDB4MTUsIDB4MjUsIDB4QUMsDQorICAgIDB4Q0EsIDB4QkEsIDB4RDQsIDB4MUIsIDB4QTksIDB4OUYsIDB4QUEsIDB4QzcsIDB4NDUsIDB4REIsIDB4MkIsIDB4NEQsDQorICAgIDB4QTgsIDB4RDgsIDB4REUsIDB4MjUsIDB4MEUsIDB4MEQsIDB4MzAsIDB4NUMsIDB4OEUsIDB4NDEsIDB4QjksIDB4NEIsDQorICAgIDB4OUUsIDB4RUUsIDB4MTQsIDB4NEMsIDB4MDUsIDB4OEYsIDB4NjcsIDB4MzQsIDB4QkQsIDB4MTcsIDB4OUIsIDB4NEIsDQorICAgIDB4MkEsIDB4QUEsIDB4MEUsIDB4NTYsIDB4OTcsIDB4MTQsIDB4QzAsIDB4ODQsIDB4OEYsIDB4NDMsIDB4Q0QsIDB4REMsDQorICAgIDB4NUEsIDB4OTIsIDB4OUUsIDB4QzAsIDB4NzcsIDB4ODcsIDB4NjYsIDB4M0UsIDB4OTcsIDB4RDgsIDB4MEIsIDB4NjMsDQorICAgIDB4MUEsIDB4NjcsIDB4NUYsIDB4MUUsIDB4NEMsIDB4QzMsIDB4OTksIDB4MjYsIDB4NTgsIDB4REUsIDB4QzksIDB4MkMsDQorICAgIDB4ODAsIDB4MDMsIDB4ODQsIDB4NTksIDB4RDQsIDB4QzgsIDB4RjcsIDB4NjgsIDB4NjgsIDB4QzgsIDB4RDMsIDB4ODUsDQorICAgIDB4NjYsIDB4NUEsIDB4MjcsIDB4NDcsIDB4OEYsIDB4OTAsIDB4RDUsIDB4OEYsIDB4NDEsIDB4MTIsIDB4NjUsIDB4QzMsDQorICAgIDB4NTAsIDB4QUEsIDB4M0EsIDB4N0QsIDB4RjUsIDB4RTcsIDB4MzMsIDB4NzIsIDB4ODYsIDB4OUQsIDB4NzIsIDB4RTgsDQorICAgIDB4OTYsIDB4NjEsIDB4QjEsIDB4QTcsIDB4MzUsIDB4ODcsIDB4QUYsIDB4MzksIDB4MTcsIDB4OEQsIDB4QzEsIDB4MUQsDQorICAgIDB4NUQsIDB4NEQsIDB4QTAsIDB4RjAsIDB4NDksIDB4QzUsIDB4N0EsIDB4MDgsIDB4QkIsIDB4M0MsIDB4MTYsIDB4RjAsDQorICAgIDB4MTcsIDB4ODgsIDB4MjYsIDB4OTEsIDB4REIsIDB4QzEsIDB4MTgsIDB4QjksIDB4REMsIDB4MjYsIDB4NjgsIDB4NEMsDQorICAgIDB4RkYsIDB4NDksIDB4NzksIDB4OTUsIDB4N0UsIDB4MUYsIDB4NUUsIDB4RjUsIDB4NTIsIDB4NDYsIDB4MDIsIDB4REIsDQorICAgIDB4RjAsIDB4QUUsIDB4RjUsIDB4NTEsIDB4OEUsIDB4M0QsIDB4NEMsIDB4M0IsIDB4MDgsIDB4ODcsIDB4M0MsIDB4ODksDQorICAgIDB4MkYsIDB4MzAsIDB4M0EsIDB4RTAsIDB4OTEsIDB4NDcsIDB4OUQsIDB4QjQsIDB4QTcsIDB4QUQsIDB4NzcsIDB4QUYsDQorICAgIDB4OTEsIDB4RDUsIDB4NEYsIDB4MDYsIDB4MDMsIDB4MUMsIDB4OEYsIDB4OTcsIDB4RTQsIDB4QjcsIDB4QkQsIDB4M0YsDQorICAgIDB4MEQsIDB4REMsIDB4NjksIDB4REEsIDB4MjUsIDB4N0EsIDB4RDMsIDB4NEIsIDB4OUIsIDB4RjAsIDB4QTUsIDB4NjgsDQorICAgIDB4RDYsIDB4M0MsIDB4NjYsIDB4RDMsIDB4NzMsIDB4OUUsIDB4MzEsIDB4RjMsIDB4MjIsIDB4QjMsIDB4MTEsIDB4NTcsDQorICAgIDB4M0IsIDB4NEYsIDB4NDMsIDB4Q0YsIDB4M0YsIDB4RUYsIDB4Q0QsIDB4QkYsIDB4QzQsIDB4QjUsIDB4RDQsIDB4MDR9Ow0KK2NvbnN0IHVpbnQ4X3QgZ19kZURFX0xvYWNhbGVbXSA9IHsNCisgICAgMHg3OCwgMHg5QywgMHg5NSwgMHg1NiwgMHg0RCwgMHg2RiwgMHhENCwgMHgzMCwgMHgxMCwgMHhCRCwgMHgyMywgMHhGMSwNCisgICAgMHgxRiwgMHhBQywgMHg4OCwgMHhBQSwgMHgyMCwgMHhCNSwgMHgxQiwgMHgzOCwgMHhCNiwgMHhEQSwgMHg0NiwgMHg1QSwNCisgICAgMHg3NSwgMHhGQiwgMHg0MSwgMHg0QiwgMHhDQSwgMHhBQSwgMHg2OSwgMHg0MSwgMHhGNCwgMHg4MiwgMHhCQywgMHg4OSwNCisgICAgMHhCQiwgMHg3MSwgMHg5QiwgMHhEOCwgMHgyQiwgMHhDNywgMHg2OSwgMHhCNSwgMHgzOSwgMHhGMiwgMHgzNywgMHhCOCwNCisgICAgMHg3MiwgMHgwNCwgMHg3MSwgMHhFNCwgMHgwNCwgMHgxNywgMHhGRSwgMHgwOSwgMHg1MiwgMHgyNSwgMHg3RSwgMHgwNiwNCisgICAgMHg5MywgMHg4RCwgMHg5MywgMHgyNiwgMHhCNiwgMHhCQiwgMHgwRCwgMHhCOSwgMHhBQywgMHhFNywgMHhDRCwgMHg3QiwNCisgICAgMHhCMywgMHgzMywgMHhDRiwgMHg4OSwgMHg5MywgMHg2MSwgMHhDMiwgMHg0MywgMHg5QywgMHgxMCwgMHhDNCwgMHg3MCwNCisgICAgMHg0QSwgMHg3NiwgMHg5QywgMHg4OCwgMHg3QywgMHgxQywgMHhFRiwgMHgzOSwgMHgyOCwgMHgyMiwgMHg1OSwgMHhCOCwNCisgICAgMHhFMywgMHhEQywgMHhGRCwgMHhGQSwgMHhGMSwgMHhGNywgMHhGQiwgMHhCNywgMHhFNywgMHhGMCwgMHg3MywgMHhGNywNCisgICAgMHhGOSwgMHhFNywgMHgwQiwgMHhDNywgMHgxQiwgMHg5NiwgMHg0NCwgMHgxNiwgMHg2MSwgMHgxMSwgMHgyQywgMHhEMiwNCisgICAgMHgyOSwgMHg0RiwgMHgzMiwgMHhBNSwgMHg5OSwgMHgwOSwgMHgzMiwgMHhFMywgMHg4MiwgMHg2MiwgMHgwNiwgMHg4QywNCisgICAgMHg5NCwgMHgzMywgMHgxOSwgMHg5RiwgMHgwMCwgMHg5QywgMHhBOSwgMHhCNSwgMHg3NywgMHg4NCwgMHg1OSwgMHg4RSwNCisgICAgMHhDNSwgMHhEMCwgMHhBRCwgMHhBMiwgMHhBNywgMHg0RiwgMHgxNCwgMHhCQywgMHg0RiwgMHhBNiwgMHhDMiwgMHg4NiwNCisgICAgMHhGQiwgMHhCRiwgMHhCRiwgMHg4OCwgMHhDMiwgMHg0MCwgMHg0NywgMHg3MywgMHg0MSwgMHgxMywgMHg5MywgMHg4QiwNCisgICAgMHhBOSwgMHg4MSwgMHgxRCwgMHhFNSwgMHhDQywgMHgwNiwgMHgyNiwgMHgyNiwgMHgzOCwgMHhDQSwgMHg2NywgMHg3OSwNCisgICAgMHgyNiwgMHgwRCwgMHgzOCwgMHgyMCwgMHg3MywgMHg0OSwgMHhEMiwgMHgyOSwgMHgzMSwgMHg1QiwgMHg3QiwgMHg3QiwNCisgICAgMHgyRCwgMHhCOSwgMHgwRCwgMHgzRiwgMHhFMSwgMHgzNywgMHg3NiwgMHhDMSwgMHg5OCwgMHgxNCwgMHg3QSwgMHhDMiwNCisgICAgMHg2RCwgMHgxOSwgMHg1NCwgMHhGMywgMHg5NiwgMHgxMSwgMHhDMiwgMHhEMywgMHhBOSwgMHhEOCwgMHg3MSwgMHg1RSwNCisgICAgMHgzOSwgMHgyRCwgMHhERiwgMHg2QywgMHhBNiwgMHg5OSwgMHgyNiwgMHhEOCwgMHhFRCwgMHhFQSwgMHg2QiwgMHg5NiwNCisgICAgMHhDRCwgMHgyQiwgMHg5QiwgMHg1NSwgMHgzNiwgMHg5RiwgMHg2QywgMHgwRSwgMHhEOSwgMHhEQywgMHhCMSwgMHgxOSwNCisgICAgMHhGMywgMHhCMCwgMHgyNywgMHgxMSwgMHg1RSwgMHhBOCwgMHgxQiwgMHgwOCwgMHg1NiwgMHg1RSwgMHhDMCwgMHgxOSwNCisgICAgMHg5MywgMHgxOCwgMHhGRSwgMHhCRSwgMHgwQywgMHhBQSwgMHhBQywgMHhFNywgMHg3MywgMHgwMywgMHgxQSwgMHg1MywNCisgICAgMHhDMiwgMHgzMiwgMHg4MywgMHg0NywgMHhBNSwgMHhCQywgMHhFNSwgMHg2MSwgMHhEQywgMHg2NSwgMHg0MiwgMHg0MSwNCisgICAgMHgyMiwgMHgwQywgMHhFRSwgMHhCRSwgMHgyMCwgMHg1NCwgMHhDNywgMHgwMiwgMHg5QywgMHg3NiwgMHg3OCwgMHg2RSwNCisgICAgMHhEMywgMHg1QSwgMHhBQiwgMHhDRCwgMHhENiwgMHhDNiwgMHg1NSwgMHhGRCwgMHg2QSwgMHhBRCwgMHg2QSwgMHg2RCwNCisgICAgMHg2QSwgMHgwRCwgMHg2QSwgMHhBRCwgMHg2OSwgMHgyRCwgMHg2OSwgMHhERCwgMHhEOCwgMHgxQiwgMHg0OSwgMHg4OSwNCisgICAgMHhBMCwgMHgxMSwgMHgyNSwgMHg2OSwgMHhGRCwgMHhENCwgMHhBOSwgMHhEMCwgMHgxQiwgMHhGOSwgMHhFMCwgMHg2QywNCisgICAgMHgxRCwgMHhCNCwgMHg3OCwgMHhERSwgMHg0NCwgMHg0QiwgMHhCOCwgMHhERCwgMHgwQSwgMHg4MCwgMHgxMCwgMHg4MSwNCisgICAgMHg1NSwgMHgzNSwgMHg1OCwgMHg3OSwgMHgzNywgMHgwMywgMHhCNCwgMHgxQiwgMHg4QiwgMHhDMSwgMHhEMCwgMHgyRCwNCisgICAgMHg4MywgMHgyQSwgMHhFQiwgMHgzMSwgMHgwRCwgMHg3MywgMHgxQiwgMHg0OSwgMHgxOSwgMHg2OCwgMHhFNywgMHg0NCwNCisgICAgMHgzNSwgMHg4MSwgMHgyNCwgMHgxMywgMHgyQywgMHgyNSwgMHgxMSwgMHg2QywgMHhCOSwgMHhCMywgMHg0RCwgMHhBNCwNCisgICAgMHgwRSwgMHg5MSwgMHhDQiwgMHgzQywgMHg0OSwgMHgxQywgMHg2RiwgMHgwRiwgMHhBRSwgMHgwRCwgMHgzNCwgMHgxRSwNCisgICAgMHgyMCwgMHgxRiwgMHgyRSwgMHhGNCwgMHgwMSwgMHhBRSwgMHg3MiwgMHhENiwgMHg4NiwgMHhBQiwgMHgxNSwgMHg1MiwNCisgICAgMHhEMiwgMHg4NCwgMHhCMywgMHg5OSwgMHhFMywgMHhGRCwgMHhBNywgMHgyOCwgMHgyNSwgMHgxMSwgMHg2OCwgMHhDNiwNCisgICAgMHgwMywgMHhERiwgMHgxRiwgMHhGNCwgMHg1NCwgMHg2NCwgMHgzMSwgMHgxNywgMHhGMiwgMHg1RSwgMHg2MywgMHgyOCwNCisgICAgMHhEQywgMHhDRSwgMHg4OCwgMHgwMCwgMHg0OCwgMHg5QSwgMHhCNiwgMHg0NiwgMHg2RSwgMHg0NSwgMHg5RCwgMHg5MSwNCisgICAgMHgwRiwgMHhCNywgMHg3RCwgMHg3RiwgMHgxRCwgMHg5RCwgMHhDNywgMHgwMiwgMHhBRCwgMHg1RiwgMHgwQywgMHhERCwNCisgICAgMHgxNiwgMHg0QiwgMHgyQiwgMHhEMSwgMHgxOSwgMHhGNiwgMHhCMCwgMHg1NCwgMHg2RCwgMHgwNywgMHgwMSwgMHhFQSwNCisgICAgMHgyMywgMHg1OSwgMHg4RSwgMHg1QSwgMHgyQiwgMHg3QSwgMHhGMCwgMHhENSwgMHhBMCwgMHg0QiwgMHg4NSwgMHg0MSwNCisgICAgMHg3NywgMHgzQiwgMHg1MywgMHgyOSwgMHhBMywgMHhDRSwgMHgwMCwgMHhBQiwgMHhGNywgMHhGQSwgMHhFMCwgMHhDQSwNCisgICAgMHg5NywgMHhENywgMHg4NywgMHg2OSwgMHgxNiwgMHhFQywgMHg4RCwgMHhGNywgMHg2RiwgMHhERiwgMHhFMywgMHhGOCwNCisgICAgMHhCOCwgMHhCOCwgMHhBOCwgMHhBQywgMHg2OSwgMHg5MywgMHg0MCwgMHhDNywgMHhGMiwgMHhGMiwgMHg2OCwgMHhCQywNCisgICAgMHhGNywgMHhBNywgMHgxMywgMHhBQiwgMHg0RSwgMHgwMCwgMHg4MywgMHg1QiwgMHgzMywgMHg3NCwgMHhCQywgMHg2MiwNCisgICAgMHhBMywgMHgyOCwgMHhCNiwgMHgwNiwgMHg0NSwgMHgwMSwgMHhDNywgMHg0NiwgMHg4NywgMHg2NywgMHgxNCwgMHg1MiwNCisgICAgMHhDMiwgMHgzMCwgMHgxNywgMHg4MiwgMHhCMCwgMHg3MCwgMHg1MSwgMHgyQiwgMHhCNywgMHhCNiwgMHhEMCwgMHhCMywNCisgICAgMHg5RSwgMHhEMiwgMHgzOSwgMHgxMSwgMHgyMSwgMHg2MSwgMHg1MiwgMHgyOSwgMHhENywgMHgyQywgMHgyQSwgMHg1NywNCisgICAgMHg2QiwgMHhCRCwgMHgyOSwgMHg1NCwgMHg0RiwgMHhENywgMHgwOSwgMHg5QiwgMHgxNywgMHg2QiwgMHg0OCwgMHg1MywNCisgICAgMHgwQywgMHhGQiwgMHhCRCwgMHg1MSwgMHhFQiwgMHhBQiwgMHhCNCwgMHhBRSwgMHg2RSwgMHhERSwgMHhBOSwgMHgzQywNCisgICAgMHg5RiwgMHhEMywgMHg3MiwgMHhBQiwgMHgwNywgMHhCRCwgMHhGOCwgMHg0RCwgMHhENywgMHg2QiwgMHhCRCwgMHhFOCwNCisgICAgMHgyOSwgMHg2NSwgMHg3OSwgMHhFNiwgMHg3OCwgMHg5QiwgMHhCRCwgMHhDOCwgMHgwNSwgMHgxMSwgMHhEQywgMHhGMSwNCisgICAgMHg1RSwgMHg5QSwgMHg1QywgMHhCNywgMHgzQiwgMHgzNiwgMHgyMCwgMHhCNSwgMHhFRiwgMHg4RCwgMHgxMywgMHg1RCwNCisgICAgMHhBMCwgMHhCRSwgMHhDMSwgMHg5NiwgMHg4MSwgMHhFMywgMHhGRCwgMHhGOSwgMHhGNCwgMHgxNSwgMHhDRSwgMHg4QSwNCisgICAgMHgwRSwgMHhDMywgMHgyQywgMHhBMiwgMHgzNCwgMHgzNCwgMHhFMywgMHhFNSwgMHgwMiwgMHg4RSwgMHg4OCwgMHhGMywNCisgICAgMHhEMywgMHhERSwgMHhBMiwgMHhCNiwgMHhFOSwgMHhBNiwgMHhDNCwgMHhENSwgMHhCQiwgMHgyRCwgMHg5RiwgMHg4NiwNCisgICAgMHhDNSwgMHg5QywgMHg1QywgMHhFMiwgMHhCMCwgMHgzQywgMHhGQSwgMHhFQSwgMHhBNSwgMHhBQSwgMHhFNSwgMHgyRiwNCisgICAgMHhFMCwgMHgxMywgMHgyNywgMHg0MiwgMHgxMywgMHhGMCwgMHhDMiwgMHg2RCwgMHgzMywgMHhFQiwgMHgzNCwgMHg2NSwNCisgICAgMHg5NCwgMHhCMywgMHgwNywgMHhEMywgMHhCQiwgMHgzQywgMHgxNywgMHg5NCwgMHgwOCwgMHgxNCwgMHhDOCwgMHhDOCwNCisgICAgMHg5QSwgMHgxRiwgMHg0NSwgMHhGMCwgMHg2OSwgMHg4MSwgMHgyNiwgMHhGNCwgMHgxMSwgMHhDMiwgMHgyMSwgMHg3QywNCisgICAgMHgzNSwgMHg5MSwgMHhEQiwgMHgxNSwgMHg4NCwgMHg5MSwgMHhDMCwgMHg1MywgMHg3OCwgMHg2MCwgMHgxRSwgMHgyNiwNCisgICAgMHg5QywgMHhDNSwgMHg5OCwgMHg1QSwgMHhEMywgMHhDNywgMHhCQywgMHhDOCwgMHhBRiwgMHgzMSwgMHgzQSwgMHhFMCwNCisgICAgMHgzMiwgMHhBNiwgMHg2MSwgMHgzOSwgMHhDNywgMHhFNiwgMHhCQiwgMHhENywgMHhDOCwgMHg1RiwgMHg0NSwgMHg4NSwNCisgICAgMHg5MSwgMHhDMywgMHg5OCwgMHhENywgMHhENCwgMHhEMywgMHgxNSwgMHg3RiwgMHgwQSwgMHhDQywgMHg1OSwgMHgzOSwNCisgICAgMHgxOSwgMHg3QSwgMHhCMywgMHg4MiwgMHgwNCwgMHg2RiwgMHhGQSwgMHhDNywgMHg0OSwgMHhGRSwgMHgyMiwgMHg2NywNCisgICAgMHhCMywgMHgyQiwgMHhCRSwgMHhFNCwgMHhBOSwgMHhFNiwgMHhEQywgMHhGQiwgMHgzRCwgMHgyQiwgMHhBMywgMHhFQSwNCisgICAgMHg3MywgMHgxNiwgMHg5NiwgMHhGRiwgMHgwMCwgMHgyOSwgMHgyNywgMHhBRiwgMHgxNywNCit9Ow0KK2NvbnN0IHVpbnQ4X3QgZ19mckZSX0xvY2FsZVtdID0gew0KKyAgICAweDc4LCAweDlDLCAweDk1LCAweDU2LCAweDRELCAweDZGLCAweEQzLCAweDQwLCAweDEwLCAweEJELCAweDIzLCAweEYxLA0KKyAgICAweDFGLCAweDU2LCAweDE2LCAweDU1LCAweDQxLCAweDZBLCAweEJELCAweDcwLCAweDRDLCAweDk1LCAweDVBLCAweEFBLA0KKyAgICAweEZBLCAweDE1LCAweDI4LCAweDQ2LCAweDUxLCAweDUzLCAweDQwLCAweEY0LCAweDgyLCAweDM2LCAweEY2LCAweDM2LA0KKyAgICAweERFLCAweEQ0LCAweERFLCAweDhELCAweEQ2LCAweDc2LCAweDRBLCAweDdDLCAweEU0LCAweDNGLCAweDcwLCAweEUyLA0KKyAgICAweEMyLCAweEI1LCAweDEyLCAweDg4LCAweDAzLCAweDQ3LCAweEM0LCAweDg1LCAweEZFLCAweDEzLCAweDI0LCAweDEwLA0KKyAgICAweDNGLCAweDgzLCAweDcxLCAweEJDLCAweDc2LCAweEVELCAweDVELCAweDI3LCAweEI4LCAweEJFLCAweDY0LCAweEU3LA0KKyAgICAweENELCAweDdCLCAweEUzLCAweDk5LCAweEI3LCAweEY2LCAweEM2LCAweEZELCAweDUwLCAweDc4LCAweDI0LCAweEE0LA0KKyAgICAweDg4LCAweDkzLCAweDg4LCAweEVFLCAweDVBLCAweDE3LCAweEYyLCAweEVELCAweEQxLCAweEE5LCAweDg1LCAweDdDLA0KKyAgICAweDFBLCAweDdCLCAweEJCLCAweEQ2LCAweDlGLCAweDZGLCAweDFGLCAweEZFLCAweDdFLCAweEZELCAweEYyLCAweDEwLA0KKyAgICAweDdFLCAweDdFLCAweDdGLCAweEZDLCAweEYxLCAweEM4LCAweDcyLCAweEZBLCAweDM5LCAweDkxLCAweEZCLCAweDQ0LA0KKyAgICAweDhFLCAweDE2LCAweEQxLCAweDU4LCAweDg0LCAweEIxLCAweEQyLCAweDRDLCAweDI0LCAweDlELCAweDA4LCAweEM5LA0KKyAgICAweDA4LCAweDA3LCAweDQ2LCAweDI0LCAweDc4LCAweDEyLCAweEJDLCAweDAwLCAweDM4LCAweDU2LCAweDZCLCAweDY3LA0KKyAgICAweDRBLCAweEY4LCAweDlDLCAweDUxLCAweEQ5LCAweEM3LCAweDQ1LCAweDc4LCAweEZGLCAweDlFLCAweEMyLCAweDJGLA0KKyAgICAweDZFLCAweEFFLCAweEU3LCAweEIyLCAweDJELCAweDExLCAweDExLCAweDE5LCAweDFCLCAweDIwLCAweDAxLCAweDZFLA0KKyAgICAweEQ4LCAweDQyLCAweDY1LCAweDA2LCAweDM2LCAweDRELCAweDE5LCAweDZGLCAweDAzLCAweEMzLCAweDkwLCAweDI2LA0KKyAgICAweDY2LCAweDU5LCAweDcxLCAweEYzLCAweERELCAweDQ0LCAweDYzLCAweDNBLCAweDRCLCAweDY4LCAweDM0LCAweDk2LA0KKyAgICAweEQ0LCAweEM4LCAweDA4LCAweDJGLCAweDExLCAweDZELCAweDM4LCAweDE3LCAweEYzLCAweDc2LCAweDgxLCAweDdGLA0KKyAgICAweDczLCAweEVELCAweEU5LCAweDE5LCAweDVDLCAweDMzLCAweEE5LCAweDI0LCAweDJFLCAweDIzLCAweDQ0LCAweEM2LA0KKyAgICAweDYzLCAweEI5LCAweDZCLCAweDNELCAweEIxLCAweEVBLCAweERFLCAweEQ5LCAweEVELCAweENFLCAweDk5LCAweEYwLA0KKyAgICAweDJBLCAweERGLCAweERBLCAweDk4LCAweDc3LCAweEIwLCAweENELCAweDk0LCAweEFGLCAweDM2LCAweENELCAweEU0LA0KKyAgICAweDgyLCAweDYxLCAweDI2LCAweDA4LCAweDZFLCAweDk5LCAweDYwLCAweEVFLCAweDk0LCAweEJELCAweERBLCAweDI1LA0KKyAgICAweDlGLCAweDJDLCAweEQ0LCAweDYzLCAweDA1LCAweDJCLCAweEM3LCAweDY3LCAweDExLCAweEUxLCAweDVFLCAweDAwLA0KKyAgICAweEFFLCAweEU2LCAweDUxLCAweDkxLCAweDc2LCAweEMyLCAweDk0LCAweEZCLCAweEFDLCAweDgxLCAweDgwLCAweDI1LA0KKyAgICAweDNBLCAweDQyLCAweEE1LCAweDI3LCAweEE5LCAweDA2LCAweDRFLCAweDY5LCAweEFBLCAweDIxLCAweDczLCAweDc4LA0KKyAgICAweENDLCAweDBELCAweDVBLCAweDBDLCAweEY3LCAweEFGLCAweDQxLCAweEI4LCAweDZBLCAweEE5LCAweEQ2LCAweDVFLA0KKyAgICAweDZELCAweDBCLCAweDU1LCAweDlGLCAweEI2LCAweERFLCAweEEzLCAweEFELCAweEI3LCAweDY4LCAweEVCLCAweDFELA0KKyAgICAweERBLCAweDdBLCAweDc3LCAweEI2LCAweERFLCAweDlDLCAweEFELCAweDM3LCAweDY2LCAweEI3LCAweEI3LCAweDA1LA0KKyAgICAweEM1LCAweDk4LCAweENGLCAweDY4LCAweDU0LCAweEJFLCAweDkxLCAweDJBLCAweDc0LCAweEY2LCAweDVDLCAweEYwLA0KKyAgICAweEI3LCAweDBDLCAweDZBLCAweDNDLCAweDY3LCAweEE4LCAweDI1LCAweDcwLCAweEIzLCAweDAyLCAweDIwLCAweDU0LA0KKyAgICAweDEyLCAweDU1LCAweDBELCAweDU2LCAweEYwLCAweDdDLCAweEQ5LCAweEU4LCAweDk5LCAweEJELCAweEJELCAweDBGLA0KKyAgICAweEY3LCAweENGLCAweEMzLCAweDIyLCAweEVGLCAweDkwLCAweDk5LCAweDhFLCAweEUyLCAweDRBLCAweDk2LCAweDA3LA0KKyAgICAweERBLCAweDM5LCAweDUyLCAweENDLCAweDkxLCAweEQwLCAweDIxLCAweDQ5LCAweDEyLCAweDJBLCAweEY5LCAweDcyLA0KKyAgICAweDhGLCAweEFCLCAweEE4LCAweDNDLCAweDk4LCAweEQyLCAweDMwLCAweEI0LCAweDlDLCAweDQzLCAweEI4LCAweEQwLA0KKyAgICAweDAxLCAweDcyLCAweEUxLCAweDQyLCAweDZGLCAweEUwLCAweENBLCAweEE3LCAweEFELCAweDk4LCAweDVBLCAweDE5LA0KKyAgICAweDI1LCAweDBDLCAweDA1LCAweDlGLCAweDU4LCAweENFLCAweERELCAweDM0LCAweEIwLCAweENGLCAweDRBLCAweDgyLA0KKyAgICAweDNBLCAweEYxLCAweEUzLCAweDQwLCAweEM4LCAweDA0LCAweDE0LCAweDA3LCAweEQ4LCAweDc1LCAweDcxLCAweDhCLA0KKyAgICAweDAyLCAweDM3LCAweEE2LCAweDAzLCAweDIwLCAweDYxLCAweDUxLCAweDZELCAweERBLCAweDVBLCAweEQ0LCAweDk4LA0KKyAgICAweDc2LCAweDMwLCAweEQ4LCAweDQ0LCAweDAxLCAweERBLCAweDg0LCAweDJFLCAweENFLCAweEZCLCAweEI4LCAweDQ2LA0KKyAgICAweEQyLCAweDJBLCAweDM0LCAweDA2LCAweDFELCAweDBDLCAweDc2LCAweDVDLCAweDc3LCAweDY3LCAweDM0LCAweEVBLA0KKyAgICAweDI0LCAweDU5LCAweENFLCAweDU5LCAweDJBLCAweDNBLCAweEYwLCAweEQ1LCAweDlDLCAweDRCLCAweDg1LCAweDQxLA0KKyAgICAweEM3LCAweDhELCAweEExLCAweDk0LCAweDRGLCAweDY3LCAweDgwLCAweDk1LCAweEJCLCAweDdDLCAweDRDLCAweERDLA0KKyAgICAweEU5LCAweEU1LCAweDIwLCAweDhBLCAweDQ3LCAweDg3LCAweDA3LCAweDQ3LCAweDU3LCAweEFGLCAweERGLCAweDA1LA0KKyAgICAweDI3LCAweEQ5LCAweDc5LCAweEUxLCAweDRDLCAweDlELCAweDA0LCAweDNBLCAweDlFLCAweDQ2LCAweDYzLCAweDJBLA0KKyAgICAweDZGLCAweEVELCAweDY5LCAweEM0LCAweEFBLCAweDEzLCAweEMwLCAweEUwLCAweEMxLCAweEY0LCAweDJDLCAweDI3LA0KKyAgICAweERCLCAweENBLCAweEIyLCAweDlFLCAweDlELCAweDY1LCAweDU5LCAweDFGLCAweDM3LCAweDc4LCAweDQ2LCAweDIxLA0KKyAgICAweDI1LCAweEY0LCAweDUyLCAweDI5LCAweDI5LCAweEY3LCAweDE2LCAweEE1LCAweEIyLCAweEQ3LCAweDQzLCAweDBGLA0KKyAgICAweDNBLCAweDRBLCAweDY3LCAweDcwLCAweDc2LCAweDUwLCAweDlFLCAweDI4LCAweEU1LCAweDQ2LCAweDhCLCAweDBBLA0KKyAgICAweDZCLCAweEFELCAweDU3LCAweDg1LCAweENBLCAweEU5LCAweDFBLCAweEExLCAweDJBLCAweEVCLCAweDUzLCAweDBGLA0KKyAgICAweDRFLCAweDMzLCAweEQ4LCAweEVFLCAweEFELCAweDUyLCAweDVGLCAweEE0LCAweDc1LCAweDc1LCAweEY1LCAweDZGLA0KKyAgICAweDJCLCAweEQyLCAweDE5LCAweENCLCAweEI3LCAweEZBLCAweEU3LCAweEE3LCAweDRFLCAweDgyLCAweEFBLCAweEVELA0KKyAgICAweDhELCAweDRFLCAweEY0LCAweDg4LCAweEYxLCAweDM0LCAweEI2LCAweDlDLCAweEVELCAweDRFLCAweEU0LCAweDhDLA0KKyAgICAweDRBLCAweDYxLCAweDM5LCAweDhGLCAweDRELCAweDJFLCAweDZFLCAweENFLCAweDBELCAweDQ4LCAweDY5LCAweDdDLA0KKyAgICAweDY1LCAweDQ1LCAweDEzLCAweDI4LCAweDlGLCAweEIwLCAweDY1LCAweDYwLCAweDM5LCAweEJGLCAweERFLCAweDdGLA0KKyAgICAweDg2LCAweDYzLCAweEEyLCAweEMxLCAweDMwLCAweDhCLCAweDI4LCAweDBELCAweDhCLCAweDQ1LCAweEJFLCAweDgwLA0KKyAgICAweEQzLCAweEUxLCAweEU1LCAweDY5LCAweDY3LCAweDUxLCAweERELCAweDc1LCAweDUzLCAweDgyLCAweEY1LCAweDZFLA0KKyAgICAweEYzLCAweEQ3LCAweDYxLCAweDMxLCAweEEzLCAweDE3LCAweEM0LCAweENCLCAweDRGLCAweEJFLCAweDcyLCAweEE5LA0KKyAgICAweDZBLCAweEI5LCAweDBCLCAweEY4LCAweEZBLCAweEYxLCAweEQxLCAweDEwLCAweEJDLCAweEMwLCAweDc1LCAweDY2LA0KKyAgICAweDk5LCAweDY2LCAweDlDLCAweDA5LCAweEJFLCAweDMyLCAweEJELCAweDJGLCAweEQyLCAweEZDLCAweDNCLCAweDA4LA0KKyAgICAweDhELCAweDEyLCAweEJGLCAweDM1LCAweEJGLCAweEU3LCAweDhCLCAweDMxLCAweDQ1LCAweDQzLCAweEY2LCAweDFGLA0KKyAgICAweEMyLCAweDgwLCAweEMyLCAweDU3LCAweEM2LCAweEQ1LCAweDFBLCAweEMyLCAweDlFLCAweDI0LCAweDYzLCAweDc4LA0KKyAgICAweDYzLCAweDU2LCAweDEzLCAweENFLCAweDAyLCAweEMyLCAweDVBLCAweEQzLCAweDI3LCAweDIyLCAweDRCLCAweDJGLA0KKyAgICAweDA5LCAweDNBLCAweDE2LCAweDQ5LCAweEMwLCAweEJDLCAweDdDLCAweDhFLCAweEVELCAweDU3LCAweDRGLCAweDkxLA0KKyAgICAweEJCLCAweDhFLCAweDBBLCAweDIzLCAweDdCLCAweDgxLCAweDI4LCAweEE5LCAweEE3LCAweDZCLCAweDZFLCAweDBBLA0KKyAgICAweENDLCAweDQ5LCAweDNFLCAweDE5LCAweDdBLCAweEJFLCAweDg2LCAweDM0LCAweDEyLCAweDFELCAweDQ4LCAweEVFLA0KKyAgICAweDIyLCAweEU1LCAweDkzLCAweEE5LCAweDU4LCAweEYyLCAweDU0LCAweDczLCAweEY4LCAweDc2LCAweENGLCAweEYyLA0KKyAgICAweEE4LCAweEY4LCAweEQyLCAweDg1LCAweEU1LCAweDNGLCAweDVELCAweDQ5LCAweEJFLCAweDFCfTsNCitjb25zdCB1aW50OF90IGdfaXRJVF9Mb2NhbGVbXSA9IHsNCisgICAgMHg3OCwgMHg5QywgMHg5NSwgMHg1NiwgMHhEMSwgMHg2QSwgMHhENCwgMHg0MCwgMHgxNCwgMHg3RCwgMHgxNywgMHhGQywNCisgICAgMHg4NywgMHgyMSwgMHg1OCwgMHg1MCwgMHg2OCwgMHgzQiwgMHhGQSwgMHhEOCwgMHg5MiwgMHgwNiwgMHg0QSwgMHg1QiwNCisgICAgMHhCQiwgMHhBNSwgMHg0NiwgMHg5NiwgMHhFRSwgMHhBQSwgMHhEOCwgMHgxNywgMHg5OSwgMHg2NCwgMHhBNiwgMHhEOSwNCisgICAgMHhCMSwgMHhDOSwgMHhDQywgMHgzMiwgMHg0OSwgMHg1QSwgMHg5MiwgMHg0NywgMHhGMSwgMHhDMSwgMHgzNywgMHg3RiwNCisgICAgMHg0MiwgMHgxMCwgMHg0MSwgMHhGMSwgMHgyMywgMHhGQywgMHgxMywgMHhBMSwgMHhFMiwgMHg2NywgMHg3OCwgMHhCMywNCisgICAgMHg5OSwgMHhBNCwgMHhDOSwgMHg2NCwgMHhCQSwgMHhBNiwgMHg3OSwgMHhEOSwgMHhCOSwgMHhFNywgMHg5RSwgMHg3MywNCisgICAgMHg3MywgMHhFRiwgMHg5OSwgMHg2NCwgMHgzNiwgMHg2RSwgMHgyQywgMHg0MywgMHgxMiwgMHgzMywgMHgyNCwgMHg0OCwNCisgICAgMHhDMiwgMHhGNiwgMHgxQywgMHg5RSwgMHhCRCwgMHgzQiwgMHg5OSwgMHgzQiwgMHg4OCwgMHhCMiwgMHgzNCwgMHhEQywNCisgICAgMHg3MywgMHhGRSwgMHg3QywgMHhGQywgMHg3QywgMHhGMywgMHhFNSwgMHhFQiwgMHhDRCwgMHhBNywgMHg2RiwgMHg3RiwNCisgICAgMHg3RiwgMHhGRSwgMHg3OCwgMHhEQywgMHgwNiwgMHg0RiwgMHgxQywgMHhDRiwgMHhBRCwgMHgxNCwgMHg4MiwgMHgxMiwNCisgICAgMHgzNSwgMHgyQiwgMHg5MiwgMHg0MCwgMHhDNiwgMHhBOSwgMHgxNiwgMHg0NywgMHg4QSwgMHg0NSwgMHg1MiwgMHg3MSwNCisgICAgMHgyMiwgMHg4MCwgMHg5MSwgMHg0OCwgMHg5MSwgMHgyRCwgMHg1RSwgMHgwMiwgMHg5QywgMHhFQSwgMHhCNSwgMHgxNywNCisgICAgMHgzMSwgMHgyMSwgMHgwOCwgMHg5NywgMHgyRSwgMHhBRSwgMHhDMywgMHg4NywgMHgwRiwgMHgzNCwgMHg3RSwgMHhDMSwNCisgICAgMHg4MiwgMHg0MCwgMHhEOSwgMHgxMiwgMHgwOSwgMHg1MSwgMHhFNSwgMHgxMCwgMHgyNSwgMHg0QiwgMHhDNSwgMHg2MywNCisgICAgMHg2NiwgMHgyMSwgMHg0NywgMHg5MSwgMHhBNSwgMHg0NiwgMHhDNCwgMHhGMywgMHg0OCwgMHgwQywgMHhFMSwgMHgzOCwNCisgICAgMHg4RiwgMHg2MiwgMHgwQiwgMHg5QiwgMHg0NCwgMHgzMiwgMHhDRCwgMHg4NiwgMHg3MCwgMHhDQSwgMHhCMiwgMHg4QywNCisgICAgMHgyNSwgMHg4MSwgMHgxQSwgMHhERSwgMHg1NSwgMHg2NiwgMHg5OSwgMHhCNCwgMHhFMSwgMHg0MiwgMHg1RSwgMHhEOSwNCisgICAgMHgwNSwgMHg5NCwgMHg4NywgMHg2NiwgMHgwMiwgMHg3NywgMHhBQywgMHg2QSwgMHg3OCwgMHhBQiwgMHgwOCwgMHgxMSwNCisgICAgMHgzMCwgMHg2NiwgMHhDRiwgMHg3OSwgMHhFNiwgMHg3NCwgMHgxQywgMHhCNCwgMHhCOSwgMHg2NywgMHgzMywgMHhDRSwNCisgICAgMHg2NiwgMHg5QiwgMHhDRCwgMHgzMywgMHg5QiwgMHg2MSwgMHgzNiwgMHhCNywgMHg2QywgMHg1NiwgMHhEOSwgMHg3QywNCisgICAgMHhCMiwgMHgzOSwgMHg2NCwgMHg3MywgMHhDNywgMHg2NiwgMHhDQywgMHhERCwgMHg5RSwgMHg1MCwgMHg1MiwgMHhFOCwNCisgICAgMHg0NywgMHgwOSwgMHg1NiwgMHgxRSwgMHg5NSwgMHgwOSwgMHgxMywgMHgzQywgMHgyNCwgMHgyRSwgMHhBRSwgMHhBMiwNCisgICAgMHgzQSwgMHgwRCwgMHgzRCwgMHgwQSwgMHg0NiwgMHg3RiwgMHg3RCwgMHhFRiwgMHg2MSwgMHhFMCwgMHg0MywgMHgzNiwNCisgICAgMHgwNCwgMHg5OSwgMHgwQSwgMHg2NSwgMHgzQywgMHg4MCwgMHhFMSwgMHhFMSwgMHhCOSwgMHgxQSwgMHg4MCwgMHg1NywNCisgICAgMHg0QywgMHgzMCwgMHg2NSwgMHg4MiwgMHgyOSwgMHgwOSwgMHg0OCwgMHhGNSwgMHg5MCwgMHg2OCwgMHgwOCwgMHhCNywNCisgICAgMHhDRCwgMHg3NSwgMHgxQSwgMHhFRCwgMHg2QywgMHg5RCwgMHhFRSwgMHhEOCwgMHg2QywgMHhENiwgMHg2QywgMHhENCwNCisgICAgMHhFQywgMHhEMSwgMHg2QywgMHhDRSwgMHhFQywgMHhDQiwgMHg2QywgMHhDOSwgMHhERSwgMHgwRiwgMHgxNCwgMHhFMiwNCisgICAgMHg5NCwgMHhCMywgMHhBNCwgMHg3OSwgMHgxMSwgMHg3NSwgMHhFOCwgMHhFRCwgMHhGQiwgMHg2MCwgMHg3MSwgMHgxMywNCisgICAgMHg3NCwgMHg3OCwgMHhERSwgMHhENCwgMHg0OCwgMHhFMCwgMHg3RSwgMHgwNSwgMHg0MCwgMHg5OCwgMHgyMiwgMHhCQSwNCisgICAgMHgxQSwgMHhBQywgMHgzQywgMHg3MiwgMHhFMCwgMHhFMiwgMHhFQSwgMHhCNywgMHg0RSwgMHg3OCwgMHhGNCwgMHgzNiwNCisgICAgMHhDNCwgMHgyRCwgMHhCMSwgMHgwQSwgMHg4QywgMHgwMywgMHhBMywgMHg2RSwgMHgzQywgMHg2MywgMHg1MywgMHgwMiwNCisgICAgMHg2RiwgMHg5NiwgMHgxMiwgMHhBQiwgMHg4RCwgMHg2RCwgMHgyMywgMHg3RCwgMHg5QSwgMHg1QywgMHhFNCwgMHg3MSwNCisgICAgMHhFQywgMHg3OCwgMHg0NywgMHg3MCwgMHhBMSwgMHg0MywgMHhFNCwgMHhDMywgMHg4NSwgMHhERSwgMHhDMiwgMHg1NSwNCisgICAgMHhDRCwgMHhENywgMHgzMiwgMHg4RCwgMHgzMiwgMHg1QSwgMHgxOCwgMHg0QiwgMHgxMSwgMHgzOSwgMHhERSwgMHhFMSwNCisgICAgMHhGRCwgMHg0NCwgMHgwOSwgMHhBMywgMHg5NSwgMHgwNiwgMHg4MywgMHgwNCwgMHg4RiwgMHgxMiwgMHhBNCwgMHgwQiwNCisgICAgMHhBOSwgMHgzMiwgMHgyRCwgMHhCMSwgMHgyOSwgMHg3MCwgMHg2RiwgMHgzRSwgMHgwMCwgMHgzMiwgMHg5RSwgMHg3NCwNCisgICAgMHhFNiwgMHhFRCwgMHg0NCwgMHhCRCwgMHg3OSwgMHgyNywgMHg5MywgMHg1RCwgMHhERiwgMHhERiwgMHg5RCwgMHhDRCwNCisgICAgMHhEMCwgMHhCOSwgMHg4QiwgMHgzQiwgMHgxQywgMHhBMywgMHg0MCwgMHg2RiwgMHhEMiwgMHhGQiwgMHgyOCwgMHg1NiwNCisgICAgMHg2MywgMHgzNiwgMHhGNywgMHgxOCwgMHhDMSwgMHhENywgMHg1MywgMHhBRSwgMHgxNCwgMHgwMywgMHgzQSwgMHhFRSwNCisgICAgMHg4RCwgMHhBNCwgMHg1RCwgMHg5QSwgMHgwMywgMHhENiwgMHhFQywgMHhGMiwgMHg3MSwgMHhFMSwgMHhEMywgMHhDQiwNCisgICAgMHg0OSwgMHg5MiwgMHhDRSwgMHg4RSwgMHgwRSwgMHg5RiwgMHg1RiwgMHhCRiwgMHgyMSwgMHg4QiwgMHhEMywgMHhGMiwNCisgICAgMHhCQywgMHhGNiwgMHhBNSwgMHg0QiwgMHgwMiwgMHg5RCwgMHhDOCwgMHg5MywgMHg4MCwgMHhBOSwgMHg1QiwgMHg3MywNCisgICAgMHg3QSwgMHhCMSwgMHhFRSwgMHgwNCwgMHgzMCwgMHg3OCwgMHgxNCwgMHg0MywgMHhDNywgMHgyQiwgMHgzNywgMHhDQiwNCisgICAgMHg3MiwgMHg2NywgMHhCQiwgMHgyQywgMHg0QiwgMHgxNywgMHhGNywgMHg3OCwgMHg4MywgMHg0MiwgMHg1QSwgMHgxOCwNCisgICAgMHhFNiwgMHg0QSwgMHgzMSwgMHgxMSwgMHgxNiwgMHg4RSwgMHhGNywgMHgwOCwgMHhENSwgMHhEQSwgMHg5RCwgMHg5RCwNCisgICAgMHg5MSwgMHhEMiwgMHgyNSwgMHg5QywgMHgxNSwgMHg0QywgMHg2NCwgMHhGQSwgMHg5RSwgMHgxQiwgMHgxNiwgMHgxNSwNCisgICAgMHgzNiwgMHg1QSwgMHg2RiwgMHgwQiwgMHgzNSwgMHhEMywgMHhGNSwgMHg0MiwgMHg1RCwgMHg5NiwgMHhCMiwgMHg5MCwNCisgICAgMHgyNywgMHgwNCwgMHgzNiwgMHg3QiwgMHhCMywgMHhEMSwgMHhENywgMHg2OSwgMHg1MywgMHhERCwgMHhGRSwgMHhBRCwNCisgICAgMHhDQSwgMHg3QywgMHhDOSwgMHhBQiwgMHg5RCwgMHhERSwgMHgxRSwgMHhDNSwgMHg2RiwgMHhCQiwgMHhERSwgMHgxOCwNCisgICAgMHg0NSwgMHg0RiwgMHhCOCwgMHhDOCwgMHg1MywgMHhDNywgMHhEQiwgMHgxQSwgMHg0NSwgMHgyRSwgMHg5OSwgMHg5MiwNCisgICAgMHg4RSwgMHhGNywgMHg3NCwgMHhDOCwgMHhDNSwgMHhGRCwgMHhCMSwgMHgwMSwgMHg2OSwgMHg3QywgMHg2RiwgMHg5RCwNCisgICAgMHhFOCwgMHgwMywgMHhDRCwgMHgwMywgMHhCNiwgMHgwQSwgMHgxQywgMHhFRiwgMHhGNywgMHgwNywgMHgzOCwgMHg2NSwNCisgICAgMHhGQiwgMHg4QywgMHg2MSwgMHg5MSwgMHhFNiwgMHgyMywgMHgyNSwgMHg5NSwgMHhENSwgMHgwMiwgMHgwRSwgMHg4NywNCisgICAgMHg1NywgMHg2NywgMHhBMywgMHg0NSwgMHg1RCwgMHhEMywgMHg4NywgMHgxMiwgMHg2QywgMHg3NiwgMHg1QiwgMHhCRCwNCisgICAgMHgwRCwgMHhDNSwgMHg5MiwgMHg1RCwgMHg5MCwgMHhCMCwgMHgzQSwgMHhFQSwgMHg5QSwgMHhBNSwgMHhBRSwgMHhFNSwNCisgICAgMHgxNywgMHhGMCwgMHg5NSwgMHg0MywgMHhEMSwgMHgxNCwgMHhCQywgMHhDMCwgMHg1RCwgMHg2NiwgMHg5MywgMHhFNiwNCisgICAgMHg4MiwgMHg0QiwgMHg3MSwgMHg2NywgMHhGQSwgMHg0MCwgMHhFNiwgMHg4QSwgMHgzMywgMHg4NSwgMHg2NiwgMHgxOSwNCisgICAgMHhCNSwgMHhFNiwgMHhGNywgMHhBOSwgMHgwQywgMHgxOCwgMHg5QSwgMHhGMiwgMHhGRiwgMHgxMCwgMHgyNiwgMHgwQywNCisgICAgMHhCRSwgMHgyMywgMHhBRSwgMHhENywgMHgxMCwgMHhGNiwgMHgxNSwgMHgwOSwgMHhFMCwgMHg4NSwgMHhCOSwgMHg5QiwNCisgICAgMHgzMCwgMHg1RiwgMHgxMCwgMHg2RSwgMHg0RCwgMHg5RiwgMHhDQSwgMHgzMiwgMHhCRiwgMHgyNCwgMHhFOCwgMHg1OCwNCisgICAgMHg2NiwgMHgwQiwgMHgxRSwgMHg1NiwgMHg3MywgMHg2QywgMHhCRCwgMHgzRSwgMHg0MSwgMHhGRSwgMHgzQSwgMHgyQSwNCisgICAgMHg4QywgMHgxQywgMHgyRSwgMHg2NCwgMHg0MywgMHgzRCwgMHg1QiwgMHg3MywgMHg1MywgMHg2MCwgMHg0NiwgMHhENSwNCisgICAgMHg2NCwgMHhFOCwgMHhDNSwgMHgxQSwgMHhEMiwgMHg0QywgMHg4RSwgMHgyMCwgMHhGOSwgMHg0NSwgMHgyRSwgMHhBMiwNCisgICAgMHhGNywgMHg3MiwgMHhDNSwgMHhEMywgMHhDRCwgMHhFMSwgMHhEQiwgMHgzRCwgMHhBQiwgMHhBMiwgMHhGQSwgMHhEMywNCisgICAgMHgxNiwgMHg5NiwgMHhGRiwgMHgwMCwgMHgyMCwgMHg4QiwgMHhCRSwgMHhGN307DQorY29uc3QgdWludDhfdCBnX3B0QlJfTG9jYWxlW10gPSB7DQorICAgIDB4NzgsIDB4OUMsIDB4OUQsIDB4NTYsIDB4M0QsIDB4NkYsIDB4RDQsIDB4NDAsIDB4MTAsIDB4QUQsIDB4ODMsIDB4QzQsDQorICAgIDB4N0YsIDB4NTgsIDB4NTksIDB4ODksIDB4MEUsIDB4QTQsIDB4MjQsIDB4ODYsIDB4OTIsIDB4QzgsIDB4NjcsIDB4RTksDQorICAgIDB4OTIsIDB4MEIsIDB4MzksIDB4OTQsIDB4MTgsIDB4OUQsIDB4Q0UsIDB4MTEsIDB4ODgsIDB4MzQsIDB4NjgsIDB4NkQsDQorICAgIDB4RUYsIDB4RDksIDB4OUIsIDB4RDgsIDB4QkIsIDB4QzcsIDB4REEsIDB4NEUsIDB4QjAsIDB4NkIsIDB4MUEsIDB4M0EsDQorICAgIDB4MjgsIDB4MjksIDB4NTMsIDB4MjAsIDB4MkEsIDB4NDQsIDB4ODMsIDB4NDQsIDB4NDksIDB4OTEsIDB4REYsIDB4ODIsDQorICAgIDB4QjgsIDB4OUYsIDB4QzEsIDB4RkEsIDB4RjMsIDB4RkMsIDB4QjEsIDB4MzYsIDB4MDYsIDB4MzcsIDB4REUsIDB4OTksDQorICAgIDB4NzksIDB4NkYsIDB4M0QsIDB4RjMsIDB4NzYsIDB4NzYsIDB4NjQsIDB4QzUsIDB4QTUsIDB4MjYsIDB4NzQsIDB4MTEsDQorICAgIDB4MjAsIDB4RDAsIDB4NDMsIDB4NjMsIDB4NjksIDB4MTUsIDB4QkMsIDB4M0UsIDB4NUMsIDB4NDgsIDB4QzAsIDB4NDIsDQorICAgIDB4QkUsIDB4MzksIDB4OTYsIDB4RDYsIDB4MUYsIDB4NkYsIDB4RDcsIDB4MUYsIDB4REUsIDB4RkQsIDB4N0UsIDB4RkYsDQorICAgIDB4NjksIDB4RkQsIDB4RUQsIDB4RUIsIDB4ODMsIDB4NUYsIDB4M0YsIDB4QkUsIDB4QUYsIDB4M0YsIDB4RkYsIDB4N0MsDQorICAgIDB4MjgsIDB4QTksIDB4RjcsIDB4RUYsIDB4MDEsIDB4QTAsIDB4MjQsIDB4MTQsIDB4NjIsIDB4NDEsIDB4QTYsIDB4NDcsDQorICAgIDB4OUUsIDB4NDEsIDB4NUQsIDB4M0YsIDB4NjcsIDB4REIsIDB4MEMsIDB4RDksIDB4OTQsIDB4NjEsIDB4NDgsIDB4MTIsDQorICAgIDB4RDQsIDB4MTYsIDB4NTAsIDB4M0MsIDB4NEEsIDB4MDIsIDB4RTcsIDB4MzksIDB4MEYsIDB4RjksIDB4ODksIDB4QkQsDQorICAgIDB4OTUsIDB4RDksIDB4RUEsIDB4MjUsIDB4MjQsIDB4MDgsIDB4MzMsIDB4QUEsIDB4QzgsIDB4OTksIDB4NTksIDB4ODksDQorICAgIDB4MkMsIDB4RDEsIDB4MzUsIDB4NjIsIDB4MUQsIDB4MzEsIDB4MEYsIDB4QjIsIDB4QkIsIDB4MkYsIDB4QTIsIDB4MDAsDQorICAgIDB4MzQsIDB4MTgsIDB4NzYsIDB4ODUsIDB4MDQsIDB4MkMsIDB4ODIsIDB4NUYsIDB4ODYsIDB4QzQsIDB4MTEsIDB4RkIsDQorICAgIDB4NUQsIDB4QTEsIDB4MUYsIDB4REEsIDB4RDQsIDB4MEYsIDB4NDQsIDB4MDEsIDB4MUYsIDB4MDUsIDB4QzgsIDB4MzMsDQorICAgIDB4ODQsIDB4QjksIDB4RDIsIDB4MzAsIDB4MDgsIDB4QzUsIDB4MTEsIDB4NDIsIDB4QUYsIDB4QkIsIDB4NDgsIDB4MTYsDQorICAgIDB4OEEsIDB4OUIsIDB4MjEsIDB4OTAsIDB4QUYsIDB4NEIsIDB4MDksIDB4QUIsIDB4OTIsIDB4MDIsIDB4NjgsIDB4MTgsDQorICAgIDB4NkMsIDB4MkMsIDB4M0QsIDB4OTYsIDB4MUEsIDB4REEsIDB4OEEsIDB4NzUsIDB4MTUsIDB4MkIsIDB4MkEsIDB4OTYsDQorICAgIDB4NTMsIDB4MkMsIDB4QTYsIDB4NTgsIDB4NEIsIDB4QjEsIDB4OTIsIDB4NjIsIDB4MUQsIDB4QzUsIDB4MjIsIDB4OEEsDQorICAgIDB4RjUsIDB4MTMsIDB4NkIsIDB4MjcsIDB4OTYsIDB4QUQsIDB4NUYsIDB4MzEsIDB4MEIsIDB4NDYsIDB4OTUsIDB4MTYsDQorICAgIDB4RTQsIDB4OTYsIDB4NkEsIDB4NTEsIDB4MEYsIDB4OTMsIDB4MjQsIDB4OUQsIDB4QzQsIDB4MjgsIDB4QkQsIDB4M0UsDQorICAgIDB4QjIsIDB4NDMsIDB4REUsIDB4RDIsIDB4N0IsIDB4NEIsIDB4REUsIDB4ODAsIDB4QjAsIDB4MTEsIDB4MEIsIDB4MTAsDQorICAgIDB4NkYsIDB4M0UsIDB4NzEsIDB4RTgsIDB4NEQsIDB4MDgsIDB4NTksIDB4RDAsIDB4MTUsIDB4QzIsIDB4QTQsIDB4MjMsDQorICAgIDB4RTQsIDB4QTMsIDB4QjcsIDB4NUQsIDB4OTEsIDB4QkIsIDB4NUIsIDB4MDMsIDB4NUEsIDB4OUIsIDB4RTQsIDB4NDAsDQorICAgIDB4QkEsIDB4MTIsIDB4RDQsIDB4RDMsIDB4MzgsIDB4RkYsIDB4QkMsIDB4QjAsIDB4NzYsIDB4NTEsIDB4RUQsIDB4NTIsDQorICAgIDB4REEsIDB4MTUsIDB4QjQsIDB4MTMsIDB4NkYsIDB4RTcsIDB4MkIsIDB4QzgsIDB4QjMsIDB4M0IsIDB4NDksIDB4MEYsDQorICAgIDB4MzEsIDB4NkMsIDB4NjEsIDB4RTQsIDB4NTUsIDB4MkYsIDB4N0YsIDB4RUUsIDB4NTIsIDB4MjcsIDB4MUEsIDB4M0YsDQorICAgIDB4QTQsIDB4QzIsIDB4QTgsIDB4ODcsIDB4RTYsIDB4OEQsIDB4MTAsIDB4RDgsIDB4OTgsIDB4OTUsIDB4Q0QsIDB4MTEsDQorICAgIDB4ODMsIDB4OTUsIDB4N0QsIDB4QjksIDB4QTUsIDB4MUUsIDB4MUUsIDB4MjksIDB4NzIsIDB4RjIsIDB4MkUsIDB4MUQsDQorICAgIDB4OTMsIDB4NjksIDB4RTksIDB4MDAsIDB4RTksIDB4QUEsIDB4MjAsIDB4RjAsIDB4RDksIDB4MjUsIDB4MzcsIDB4ODYsDQorICAgIDB4NTcsIDB4RTYsIDB4QjUsIDB4NjAsIDB4ODAsIDB4RTYsIDB4MzAsIDB4RTAsIDB4RjIsIDB4OTAsIDB4NTIsIDB4RTgsDQorICAgIDB4RDIsIDB4OTMsIDB4Q0YsIDB4QjcsIDB4NjUsIDB4RTgsIDB4QkEsIDB4OTIsIDB4N0EsIDB4Q0MsIDB4OUYsIDB4NUQsDQorICAgIDB4MzAsIDB4MUQsIDB4RjEsIDB4MjksIDB4MDksIDB4NDYsIDB4MUEsIDB4N0YsIDB4QjIsIDB4RDUsIDB4MkIsIDB4RkUsDQorICAgIDB4MjQsIDB4MzIsIDB4OTQsIDB4QTQsIDB4QUUsIDB4NUQsIDB4NUMsIDB4NEEsIDB4NkMsIDB4NDksIDB4RkQsIDB4N0YsDQorICAgIDB4QkUsIDB4ODcsIDB4MkMsIDB4NEUsIDB4OUYsIDB4Q0EsIDB4OUEsIDB4MjYsIDB4MEYsIDB4RTYsIDB4RjgsIDB4MEUsDQorICAgIDB4NjUsIDB4QzEsIDB4ODYsIDB4RDUsIDB4RTQsIDB4MDAsIDB4NTAsIDB4RjMsIDB4RTQsIDB4OTIsIDB4MDQsIDB4RDgsDQorICAgIDB4NkIsIDB4NDgsIDB4NTIsIDB4RjEsIDB4RDQsIDB4MjQsIDB4OTksIDB4Q0QsIDB4NDYsIDB4MEUsIDB4MkYsIDB4NjUsDQorICAgIDB4QzQsIDB4RUYsIDB4RDUsIDB4NDgsIDB4RDcsIDB4NDcsIDB4RkUsIDB4MDgsIDB4NUMsIDB4MjgsIDB4NzIsIDB4MDUsDQorICAgIDB4REMsIDB4QzUsIDB4Q0UsIDB4QTQsIDB4NDgsIDB4QzksIDB4MTksIDB4NzcsIDB4MzgsIDB4MzUsIDB4NTUsIDB4NjEsDQorICAgIDB4MzYsIDB4M0IsIDB4RDAsIDB4QjQsIDB4MDMsIDB4NUQsIDB4MUYsIDB4QzQsIDB4QzgsIDB4MzUsIDB4NDgsIDB4MzksDQorICAgIDB4NEQsIDB4NDIsIDB4MjIsIDB4NDAsIDB4QTMsIDB4REMsIDB4QkMsIDB4MjcsIDB4Q0UsIDB4QjksIDB4QjcsIDB4NjgsDQorICAgIDB4OTQsIDB4OTMsIDB4NDgsIDB4QjMsIDB4QUUsIDB4NjYsIDB4OUUsIDB4QUYsIDB4MUYsIDB4NEYsIDB4OUYsIDB4REUsDQorICAgIDB4QkMsIDB4ODQsIDB4Q0UsIDB4NjksIDB4N0MsIDB4OTEsIDB4RTksIDB4NTYsIDB4MDUsIDB4QTUsIDB4NEMsIDB4MTIsDQorICAgIDB4N0EsIDB4MDYsIDB4NjIsIDB4NzUsIDB4RjEsIDB4NkEsIDB4QkUsIDB4M0MsIDB4MjcsIDB4RUUsIDB4RTMsIDB4RkQsDQorICAgIDB4NkQsIDB4NEEsIDB4NkEsIDB4QkMsIDB4MUIsIDB4QzcsIDB4NEYsIDB4RjYsIDB4RTMsIDB4OTgsIDB4MEYsIDB4QjMsDQorICAgIDB4MUEsIDB4QUUsIDB4OUIsIDB4NkEsIDB4ODYsIDB4OEMsIDB4MjEsIDB4NjIsIDB4NDYsIDB4OTIsIDB4QkEsIDB4MEQsDQorICAgIDB4MEEsIDB4RjYsIDB4NjAsIDB4RjIsIDB4MEEsIDB4MzEsIDB4MTMsIDB4OTEsIDB4MjAsIDB4RkYsIDB4RUUsIDB4NEUsDQorICAgIDB4OUIsIDB4OTcsIDB4MDgsIDB4RDIsIDB4MkEsIDB4QTIsIDB4MkMsIDB4NkMsIDB4NTMsIDB4RUIsIDB4NTYsIDB4REQsDQorICAgIDB4OTUsIDB4NkYsIDB4NkYsIDB4MjEsIDB4MTMsIDB4N0IsIDB4OTAsIDB4MzcsIDB4QzYsIDB4NkUsIDB4QjEsIDB4NEIsDQorICAgIDB4MTYsIDB4RUUsIDB4MjQsIDB4RDgsIDB4OEMsIDB4ODYsIDB4MkIsIDB4OUMsIDB4MzQsIDB4QzMsIDB4RkUsIDB4NDAsDQorICAgIDB4NDYsIDB4NTksIDB4QzEsIDB4Q0UsIDB4NDAsIDB4MDIsIDB4RUYsIDB4QUYsIDB4RDAsIDB4OTcsIDB4RDQsIDB4QkQsDQorICAgIDB4ODEsIDB4RjAsIDB4MTgsIDB4MzEsIDB4MkEsIDB4QTksIDB4OEYsIDB4NUEsIDB4RTgsIDB4OEQsIDB4MzAsIDB4QjUsDQorICAgIDB4MDMsIDB4MkYsIDB4NEUsIDB4QTMsIDB4QTYsIDB4NEMsIDB4REQsIDB4NTksIDB4QjQsIDB4NjEsIDB4NkEsIDB4NDgsDQorICAgIDB4RUEsIDB4NjIsIDB4OUIsIDB4NEYsIDB4QTIsIDB4MUEsIDB4QTAsIDB4ODcsIDB4ODQsIDB4N0QsIDB4OUEsIDB4MkMsDQorICAgIDB4MjQsIDB4RjUsIDB4NzAsIDB4NzEsIDB4RjYsIDB4MEYsIDB4QjQsIDB4RUEsIDB4MzksIDB4QjQsIDB4NDgsIDB4RTksDQorICAgIDB4MjgsIDB4NkMsIDB4QTUsIDB4OUQsIDB4REMsIDB4RkIsIDB4NjgsIDB4ODUsIDB4OTYsIDB4RDAsIDB4MkMsIDB4QzYsDQorICAgIDB4NkQsIDB4NjEsIDB4RTYsIDB4N0IsIDB4NkEsIDB4MTEsIDB4RkYsIDB4QzMsIDB4QjMsIDB4QzAsIDB4OUMsIDB4Q0IsDQorICAgIDB4MjMsIDB4OEIsIDB4MDEsIDB4OTgsIDB4NjAsIDB4NEEsIDB4N0EsIDB4MDAsIDB4NDcsIDB4MzQsIDB4NjQsIDB4MTgsDQorICAgIDB4MzEsIDB4QTAsIDB4MDcsIDB4NTYsIDB4MDcsIDB4NjIsIDB4NjIsIDB4NTEsIDB4MDMsIDB4ODEsIDB4MzksIDB4RkUsDQorICAgIDB4MkIsIDB4NjQsIDB4ODYsIDB4MEMsIDB4ODYsIDB4NkUsIDB4N0EsIDB4MjEsIDB4MTMsIDB4MDYsIDB4MEQsIDB4N0UsDQorICAgIDB4QzMsIDB4RkEsIDB4MjAsIDB4RTcsIDB4MEUsIDB4QzQsIDB4MUQsIDB4ODAsIDB4NTMsIDB4MUEsIDB4ODcsIDB4NTcsDQorICAgIDB4MTAsIDB4OUMsIDB4RDAsIDB4QzAsIDB4QzEsIDB4NjYsIDB4NTIsIDB4RDMsIDB4REUsIDB4OEIsIDB4NjcsIDB4NDAsDQorICAgIDB4RUIsIDB4MDcsIDB4NzMsIDB4MDEsIDB4NEMsIDB4ODcsIDB4MTYsIDB4RTAsIDB4NDUsIDB4RUYsIDB4QTcsIDB4MzksDQorICAgIDB4RDYsIDB4NEUsIDB4QUEsIDB4MDQsIDB4NjcsIDB4QkQsIDB4MzAsIDB4OUQsIDB4MEUsIDB4ODIsIDB4NjksIDB4NTEsDQorICAgIDB4NDgsIDB4RUMsIDB4NEIsIDB4OUEsIDB4MjIsIDB4QjMsIDB4MjQsIDB4RDMsIDB4QzEsIDB4NTYsIDB4MzksIDB4NEYsDQorICAgIDB4NDUsIDB4Q0UsIDB4RkUsIDB4RjcsIDB4RDUsIDB4M0YsIDB4MzAsIDB4QkIsIDB4RDksIDB4OUJ9Ow0KK2NvbnN0IHVpbnQ4X3QgZ19ubE5MX0xvY2FsZVtdID0gew0KKyAgICAweDc4LCAweDlDLCAweDk1LCAweDU2LCAweDRELCAweDRGLCAweERDLCAweDMwLCAweDEwLCAweDNELCAweDUzLCAweEE5LA0KKyAgICAweEZGLCAweEMxLCAweDhBLCAweDhBLCAweDY4LCAweDI1LCAweDk2LCAweDJELCAweDQ3LCAweDUwLCAweDg4LCAweEI0LA0KKyAgICAweDA1LCAweDBBLCAweDE1LCAweDA0LCAweEFELCAweDU4LCAweERBLCAweEFBLCAweDVDLCAweDJBLCAweDZGLCAweDYyLA0KKyAgICAweDc2LCAweEJELCAweDI0LCAweEY2LCAweENBLCAweDg5LCAweDQxLCAweEM5LCAweEIxLCAweDUyLCAweDhGLCAweEZELA0KKyAgICAweDI3LCAweEFELCAweERBLCAweDVCLCAweEZGLCAweDRGLCAweEE1LCAweDRBLCAweEZDLCAweDhDLCAweDhFLCAweEYzLA0KKyAgICAweDQ1LCAweDEyLCAweDNCLCAweDY5LCAweEM4LCAweDA1LCAweENGLCAweDlCLCAweEY3LCAweEJDLCAweDMzLCAweENGLA0KKyAgICAweENFLCAweDEwLCAweDNCLCAweEUwLCAweDFFLCAweDBFLCAweDA4LCAweDYyLCAweDM4LCAweDI0LCAweDA3LCAweDE2LA0KKyAgICAweDBCLCAweDNFLCAweDVGLCAweDlDLCAweDVCLCAweEM4LCAweDI3LCAweDkxLCAweDc3LCAweDYwLCAweDNELCAweDdDLA0KKyAgICAweEZCLCAweEZELCAweEY3LCAweEVCLCAweEFGLCAweDg3LCAweDlGLCAweDNGLCAweDVFLCAweEU2LCAweEFCLCAweDU3LA0KKyAgICAweDk2LCAweEYzLCAweEZDLCAweDE5LCAweDQyLCAweEI2LCAweEUyLCAweDMzLCAweDFGLCAweDhCLCAweDU5LCAweDEyLA0KKyAgICAweENFLCAweDc5LCAweDEwLCAweDE1LCAweEQyLCAweDg1LCAweDIwLCAweDBCLCAweDJFLCAweDI4LCAweDY2LCAweDhBLA0KKyAgICAweEI1LCAweDgxLCAweEVDLCAweDkwLCAweEIzLCAweDc4LCAweDc5LCAweDAxLCAweEE5LCAweDQ4LCAweEM1LCAweDFCLA0KKyAgICAweDc5LCAweEVDLCAweEFDLCAweDMwLCAweDkzLCAweDU4LCAweDUwLCAweDdCLCAweDlDLCAweDg3LCAweEI1LCAweENDLA0KKyAgICAweDBELCAweDk5LCAweDhCLCAweDhFLCAweDU0LCAweDg4LCAweEIxLCAweDg4LCAweDBELCAweDM4LCAweDVFLCAweDBCLA0KKyAgICAweDFBLCAweDk4LCAweEY4LCAweEM0LCAweEI0LCAweENCLCAweDRBLCAweDMyLCAweDMzLCAweDFDLCAweDk4LCAweDYwLA0KKyAgICAweDJDLCAweDE3LCAweDMyLCAweDhBLCAweDY1LCAweDY0LCAweDQ4LCAweDQ1LCAweDY0LCAweDFELCAweDkzLCAweDcwLA0KKyAgICAweDRFLCAweDg0LCAweDIxLCAweEM3LCAweDZGLCAweDYzLCAweDZFLCAweENFLCAweDMwLCAweDdFLCAweEQ3LCAweDI1LA0KKyAgICAweEYyLCAweDg5LCAweEQ3LCAweDRFLCAweEExLCAweDYyLCAweDVELCAweDE5LCAweDU4LCAweDM3LCAweDE0LCAweEUxLA0KKyAgICAweEY5LCAweDVDLCAweDFDLCAweDU4LCAweEJCLCAweDU2LCAweENCLCAweDU5LCAweEIzLCAweEFCLCAweDI2LCAweDgzLA0KKyAgICAweEJBLCAweEVDLCAweDdDLCAweDhBLCAweDk5LCAweDY2LCAweDJGLCAweENELCAweDU2LCAweDlBLCAweDVELCAweDM0LA0KKyAgICAweEZCLCAweDY3LCAweEY2LCAweENFLCAweDZDLCAweDVCLCAweEJGLCAweDYzLCAweDNFLCAweDRFLCAweDZBLCAweDE3LA0KKyAgICAweDEwLCAweDIyLCAweDI3LCAweEU1LCAweDcwLCAweDcxLCAweEExLCAweDFBLCAweEI1LCAweEFFLCAweDQwLCAweEI4LA0KKyAgICAweDVFLCAweDA2LCAweEQ0LCAweEE3LCAweDJDLCAweEQyLCAweEQxLCAweDdCLCAweDRFLCAweDRDLCAweEIwLCAweDBGLA0KKyAgICAweEZCLCAweDEyLCAweEExLCAweEUzLCAweDc3LCAweDgyLCAweEFFLCAweDc0LCAweDM0LCAweEM1LCAweDcxLCAweDkzLA0KKyAgICAweDhDLCAweEIyLCAweDk1LCAweEExLCAweEYyLCAweEQ2LCAweDQ5LCAweEU3LCAweDJELCAweDY4LCAweEU1LCAweDZCLA0KKyAgICAweDk1LCAweDZCLCAweDQ1LCAweDZCLCAweEU1LCAweDZBLCAweDc1LCAweDZBLCAweDI1LCAweDc2LCAweDE3LCAweDE3LA0KKyAgICAweDEyLCAweDQxLCAweDdELCAweDRBLCAweEMyLCAweEZBLCAweENCLCAweDVELCAweDQwLCAweENFLCAweEM0LCAweDg1LA0KKyAgICAweDYzLCAweDI4LCAweDgzLCAweDY2LCAweDZBLCAweERBLCAweDRBLCAweEExLCAweEM3LCAweEIwLCAweEI2LCAweDM5LA0KKyAgICAweDExLCAweEI4LCAweEI2LCAweDJGLCAweDQ0LCAweENFLCAweDlCLCAweDQzLCAweDdCLCAweEFDLCAweEZFLCAweDU2LA0KKyAgICAweEMwLCAweEU0LCAweEE4LCAweDAyLCAweDUwLCAweEI2LCAweDJBLCAweDA1LCAweDMwLCAweDlCLCAweEM2LCAweEFELA0KKyAgICAweEUxLCAweDk0LCAweEEzLCAweDNFLCAweDE4LCAweDNFLCAweEM1LCAweDMxLCAweEI4LCAweENFLCAweDJBLCAweDgzLA0KKyAgICAweDJCLCAweEE0LCAweDk4LCAweDVGLCAweDM3LCAweDMyLCAweDA4LCAweDJDLCAweEU3LCAweDE4LCAweDFFLCAweDc0LA0KKyAgICAweDg0LCAweDVDLCAweDc4LCAweEQwLCAweDI3LCAweDc4LCAweDU0LCAweEVGLCAweDE1LCAweEIzLCAweDRCLCAweDFBLA0KKyAgICAweDcwLCAweEI2LCAweEIwLCAweDlDLCAweEE3LCAweEFBLCAweDQyLCAweEUyLCAweDgzLCAweDY4LCAweDA0LCAweDlBLA0KKyAgICAweEQxLCAweDYwLCAweDRELCAweEI0LCAweEU0LCAweDIyLCAweENFLCAweDU0LCAweDIzLCAweDVELCAweDgxLCAweDUwLA0KKyAgICAweDAzLCAweDI5LCAweDdBLCAweDhGLCAweDY5LCAweEQ4LCAweEVBLCAweEJELCAweDg2LCAweDM0LCAweDdBLCAweDNGLA0KKyAgICAweERELCAweDc3LCAweERELCAweEZELCAweEQ5LCAweDZDLCAweDBCLCAweDQ5LCAweDI5LCAweEI2LCAweEQwLCAweEI1LA0KKyAgICAweDNELCAweEFFLCAweDExLCAweEJCLCAweDk0LCAweDc5LCAweEVCLCAweDg1LCAweDcyLCAweEEwLCAweDI2LCAweDZCLA0KKyAgICAweEJDLCAweDkwLCAweDBDLCAweDEyLCAweDE0LCAweDVELCAweDJCLCAweDQ5LCAweDlCLCAweEFGLCAweDdBLCAweDZFLA0KKyAgICAweDc1LCAweDU4LCAweDlDLCAweEY3LCAweDE1LCAweEEwLCAweEU1LCAweDI1LCAweDM4LCAweDQ5LCAweDVDLCAweEZGLA0KKyAgICAweEY2LCAweDM0LCAweDhDLCAweDY2LCAweEM3LCAweDQ3LCAweDZGLCAweEVGLCAweDNGLCAweEUyLCAweEU1LCAweDU5LA0KKyAgICAweDdBLCAweDlELCAweDVCLCAweDU1LCAweDI3LCAweDY1LCAweDRBLCAweDI2LCAweEQ1LCAweDIwLCAweDZFLCAweEZBLA0KKyAgICAweEQ1LCAweEMwLCAweENBLCAweDdGLCAweDk0LCAweDUyLCAweERELCAweDVELCAweENGLCAweDcyLCAweEQyLCAweEVELA0KKyAgICAweDM0LCAweERELCAweERCLCAweDQ5LCAweEQzLCAweEQ0LCAweDFFLCAweDM3LCAweDc4LCAweERELCAweDUyLCAweDRGLA0KKyAgICAweDBBLCAweDQxLCAweDk4LCAweDk3LCAweDU4LCAweENFLCAweDBCLCAweDk0LCAweEFCLCAweEY3LCAweEY2LCAweEEyLA0KKyAgICAweEMxLCAweEVBLCAweDM1LCAweDExLCAweDFFLCAweDYxLCAweDcxLCAweEYxLCAweEMzLCAweDlCLCAweEJBLCAweDRFLA0KKyAgICAweDM5LCAweEEyLCAweDc1LCAweDUxLCAweDc1LCAweEY2LCAweEQ4LCAweEVDLCAweDQ2LCAweDEzLCAweDJBLCAweEI2LA0KKyAgICAweDg3LCAweDk5LCAweDRBLCAweDQzLCAweDBDLCAweDk3LCAweDYxLCAweEJCLCAweERDLCAweDI1LCAweDRGLCAweDc3LA0KKyAgICAweDBBLCAweDE2LCAweDgyLCAweENCLCAweDM1LCAweDU1LCAweDk3LCAweDYwLCAweDY3LCAweEEwLCAweEEyLCAweEVBLA0KKyAgICAweDYwLCAweDczLCAweEEwLCAweDIwLCAweEE0LCAweDRDLCAweDQ2LCAweDk2LCAweDMzLCAweDFBLCAweDQ4LCAweDRGLA0KKyAgICAweDg5LCAweEUwLCAweDk2LCAweEYzLCAweDVBLCAweDYzLCAweDNGLCAweDFBLCAweEQzLCAweDM4LCAweEYxLCAweEYyLA0KKyAgICAweDM4LCAweDFBLCAweENFLCAweDM0LCAweEMxLCAweEYyLCAweDFBLCAweDY2LCAweDgxLCAweEU1LCAweEZDLCAweEY5LA0KKyAgICAweEYyLCAweDFELCAweEU2LCAweDRDLCAweDgzLCAweEQxLCAweEEzLCAweEEyLCAweDExLCAweDU3LCAweDBCLCAweDE4LA0KKyAgICAweDJELCAweEVGLCAweDJGLCAweDlGLCAweDIwLCAweEFCLCAweDFGLCAweDg0LCAweDI2LCAweENBLCAweDA2LCAweDlELA0KKyAgICAweDU2LCAweEI3LCAweDdBLCAweEQ5LCAweDkzLCAweDM1LCAweEI5LCAweEMxLCAweDVFLCAweDM5LCAweDRDLCAweENCLA0KKyAgICAweEIwLCAweEQ4LCAweEQzLCAweDRELCAweEUwLCAweEZCLCAweENDLCAweDQ3LCAweDUzLCAweEYwLCAweDY3LCAweDZDLA0KKyAgICAweDI2LCAweDUwLCAweDQ2LCAweDM5LCAweEVCLCAweDIxLCAweDFDLCAweDcyLCAweDI5LCAweDI4LCAweDExLCAweDY4LA0KKyAgICAweDE2LCAweEZCLCAweDFELCAweDhDLCAweDg5LCAweDBGLCAweERGLCAweDNGLCAweDY4LCAweDRBLCAweEZGLCAweDRCLA0KKyAgICAweDM5LCAweDg1LCAweEVGLCAweDNELCAweDcyLCAweERGLCAweDRCLCAweDk5LCAweDA4LCAweDNDLCAweDg3LCAweDc3LA0KKyAgICAweEFDLCAweDhGLCAweDcyLCAweEI1LCAweEM0LCAweEI0LCAweDgzLCAweDcwLCAweEM2LCAweDUzLCAweDc5LCAweDhCLA0KKyAgICAweEQxLCAweDA5LCAweDhGLCAweDk3LCAweEQ0LCAweDUzLCAweDNELCAweDhELCAweDNFLCAweEJDLCAweDQzLCAweDZFLA0KKyAgICAweDNGLCAweDE5LCAweDBDLCAweEYwLCAweDk2LCAweEJDLCAweDI0LCAweDVGLCAweEY2LCAweEZFLCAweDM0LCAweDcwLA0KKyAgICAweDE3LCAweEFBLCAweDRCLCAweDc0LCAweERFLCAweDRCLCAweDlCLCAweEYxLCAweDQxLCAweDM0LCAweDM3LCAweDkxLA0KKyAgICAweDZDLCAweEIxLCAweEUyLCAweDE5LCAweDMzLCAweDJGLCAweDMyLCAweDFCLCAweDZELCAweEI1LCAweEYzLCAweEI0LA0KKyAgICAweEM3LCAweEY5LCAweEE3LCAweEJBLCAweEYzLCAweDBGLCAweEQ1LCAweEZBLCAweEMwLCAweEZBfTsNCitjb25zdCB1aW50OF90IGdfcnVSVV9Mb2NhbGVbXSA9IHsNCisgICAgMHg3OCwgMHg5QywgMHhBRCwgMHg1NywgMHg0RCwgMHg0RiwgMHgxMywgMHg0MSwgMHgxOCwgMHgzRSwgMHg2MywgMHhFMiwNCisgICAgMHg3RiwgMHg5OCwgMHg2QywgMHgyNCwgMHg2OCwgMHgwMiwgMHhBRCwgMHgxRSwgMHgyNSwgMHg2NSwgMHgxMywgMHgyMiwNCisgICAgMHgwQSwgMHgwNiwgMHhENywgMHg5MCwgMHgxNiwgMHgzNCwgMHg3MiwgMHgzMSwgMHhEQiwgMHhERCwgMHhBMSwgMHg1RCwNCisgICAgMHhFOCwgMHhFRSwgMHg5MCwgMHhFOSwgMHg2RSwgMHhCMCwgMHg3QiwgMHgyQSwgMHg4NSwgMHhFOCwgMHgwNSwgMHgyNSwNCisgICAgMHhFMSwgMHhBMCwgMHg0NywgMHhGNCwgMHhFNCwgMHhDOSwgMHg1MCwgMHhCRSwgMHgxMiwgMHg4MiwgMHhCNiwgMHgyNCwNCisgICAgMHhGRSwgMHg4MiwgMHhEOSwgMHhGRiwgMHg2MCwgMHhENCwgMHg5RiwgMHhFMSwgMHgzQiwgMHhGQiwgMHhEMSwgMHhFRSwNCisgICAgMHhCNywgMHhDNSwgMHhEOCwgMHgxRSwgMHgzQSwgMHhGMywgMHgzRSwgMHhDRiwgMHhGMywgMHhDRSwgMHhGQiwgMHhCNSwNCisgICAgMHhEMywgMHhCNiwgMHhENCwgMHgyMCwgMHg4QSwgMHhEQywgMHhDMCwgMHhDOCwgMHg5MCwgMHg3NSwgMHgzQywgMHgyMywNCisgICAgMHg1MCwgMHhFQiwgMHg2NSwgMHg3OSwgMHg0NSwgMHg0MCwgMHgyQSwgMHg2RSwgMHgyQSwgMHgzMywgMHhDMiwgMHg4RiwNCisgICAgMHhBQiwgMHhERCwgMHhERiwgMHg0NywgMHg1RiwgMHg2RSwgMHhDMywgMHhDNywgMHhBRiwgMHhERSwgMHg4NywgMHg5RiwNCisgICAgMHhFRiwgMHg4RiwgMHhFRSwgMHgwOCwgMHhFMiwgMHhDRCwgMHgxQiwgMHgwOCwgMHg5NSwgMHgzOCwgMHhERiwgMHg1MCwNCisgICAgMHg2NSwgMHg1QSwgMHg2OSwgMHhFOSwgMHg1NSwgMHhEMiwgMHg2OCwgMHhGQSwgMHhEMiwgMHgxQSwgMHhDNSwgMHgzNSwNCisgICAgMHg0MiwgMHgzNSwgMHhEOSwgMHhFMCwgMHhBQywgMHgzMSwgMHg1NCwgMHhEMiwgMHg4OSwgMHg2MSwgMHhENiwgMHg5RiwNCisgICAgMHgwMiwgMHhENCwgMHhFNCwgMHhGQiwgMHgzMSwgMHg2RiwgMHgyRiwgMHgzQSwgMHhGQiwgMHhBQywgMHhDNywgMHg0RSwNCisgICAgMHg1OCwgMHhENywgMHg2OSwgMHgzQiwgMHhGQiwgMHhBNSwgMHhBMiwgMHg2NywgMHgwQiwgMHhDMywgMHhCQiwgMHhFQywNCisgICAgMHg5QywgMHg5RCwgMHgzOCwgMHg2RCwgMHhENiwgMHg2NSwgMHg1RiwgMHg1MywgMHgwOSwgMHhFQywgMHg5QiwgMHhBQiwNCisgICAgMHhFRCwgMHhCMCwgMHg2RSwgMHgxQSwgMHhEOCwgMHg2NSwgMHg1NywgMHhBMCwgMHgzRCwgMHhDRiwgMHhEMywgMHhBNiwNCisgICAgMHgwMiwgMHgxNywgMHhDRSwgMHgzQiwgMHhENiwgMHhDQiwgMHg4NiwgMHgzMiwgMHhEQywgMHg3NSwgMHgyMSwgMHg5MSwNCisgICAgMHg1MywgMHg2NywgMHhDNywgMHhEOSwgMHhDRSwgMHgwOCwgMHhDNywgMHhEOSwgMHg4NiwgMHg1MCwgMHg3QSwgMHg0RSwNCisgICAgMHgwNywgMHg3MiwgMHgzRSwgMHhDRSwgMHhDOCwgMHg5NywgMHhGNSwgMHhEOSwgMHg2NSwgMHgzRSwgMHhBMSwgMHhDNywNCisgICAgMHhGQSwgMHg3OSwgMHhGMCwgMHgxOSwgMHgxQywgMHg3MSwgMHgwOSwgMHg5MSwgMHhDNCwgMHgwOSwgMHhDOCwgMHg1RiwNCisgICAgMHgwRiwgMHgxQSwgMHgxMCwgMHg2RSwgMHgwOCwgMHg5MiwgMHhBQiwgMHg1NSwgMHgzQSwgMHgyMywgMHhEQywgMHgxMywNCisgICAgMHg5MiwgMHg5RCwgMHgyOSwgMHhFNCwgMHgzNCwgMHgyNSwgMHgwRCwgMHgxQiwgMHhBMSwgMHgxRiwgMHg5OSwgMHhCMiwNCisgICAgMHhGRiwgMHhERCwgMHg4QSwgMHhENCwgMHhEOCwgMHhGRCwgMHgxRSwgMHhBNCwgMHgwNiwgMHhFMSwgMHgxNiwgMHgzRiwNCisgICAgMHgxNSwgMHhGMSwgMHhBQiwgMHg5RSwgMHg4QSwgMHhCOSwgMHgyNSwgMHgyRiwgMHhFNCwgMHhENywgMHg1QSwgMHg5NSwNCisgICAgMHg1QiwgMHhBMSwgMHhEMSwgMHg4NywgMHg5RCwgMHgwOCwgMHgwMSwgMHhGNiwgMHgyMSwgMHg5OCwgMHg0QiwgMHgzRSwNCisgICAgMHg5RiwgMHg3RSwgMHg1MCwgMHg3QiwgMHhFQywgMHhCQywgMHg1NCwgMHhFNCwgMHhEOCwgMHg5MCwgMHg3NCwgMHgwNSwNCisgICAgMHgzMSwgMHhGNSwgMHgwMCwgMHgzQywgMHg3MywgMHg4NywgMHg3OCwgMHgwRiwgMHhENiwgMHgxNywgMHhFQywgMHgzMiwNCisgICAgMHg0RSwgMHgzQSwgMHg4MSwgMHg3MiwgMHhGNywgMHhDMSwgMHg0RiwgMHgxQSwgMHgwOCwgMHhDMywgMHhEOCwgMHg3NiwNCisgICAgMHhGNSwgMHhERCwgMHgzOCwgMHhGMCwgMHgwNiwgMHhDRSwgMHhFRCwgMHg0MCwgMHgxNCwgMHhFNywgMHg0MCwgMHgzOCwNCisgICAgMHg0RCwgMHg5QywgMHhFQiwgMHhFQywgMHgwMywgMHgwOCwgMHgwRSwgMHg5RCwgMHhENywgMHg0OSwgMHhFNSwgMHhCNiwNCisgICAgMHhCMywgMHhDMywgMHg4RSwgMHhFMSwgMHhERCwgMHhGNywgMHhEQSwgMHhFQywgMHg4MywgMHhDOCwgMHg1RCwgMHhBNSwNCisgICAgMHhFNCwgMHgxQywgMHg5QiwgMHgyRSwgMHhENywgMHhGRiwgMHg4MSwgMHhCMywgMHgxRCwgMHgzRiwgMHhGMiwgMHg5MCwNCisgICAgMHhGNSwgMHhFMiwgMHhBNiwgMHgwMywgMHhBNywgMHgxMywgMHgzNywgMHg3RCwgMHg3MiwgMHhEQSwgMHg3MSwgMHhEMywNCisgICAgMHhFNywgMHgyNCwgMHhFQiwgMHgzMCwgMHg0NSwgMHhDOCwgMHg4RSwgMHhCMywgMHg0MywgMHhENSwgMHgzMSwgMHhENSwNCisgICAgMHg1NCwgMHgwRCwgMHhFQiwgMHhFMSwgMHhFQiwgMHhDOSwgMHgzNywgMHg4OSwgMHhCMywgMHgxMiwgMHhCNCwgMHgzMywNCisgICAgMHhEOCwgMHg0NCwgMHhBMSwgMHhBNSwgMHgxOCwgMHg4NCwgMHg4NiwgMHhEQiwgMHg5MCwgMHg3MywgMHg0QywgMHhFNSwNCisgICAgMHg5MCwgMHg1RiwgMHhEOCwgMHhGMSwgMHg5MSwgMHhFOSwgMHgyMywgMHhENiwgMHgyQiwgMHgzOCwgMHg2RiwgMHg2MSwNCisgICAgMHg2QywgMHhCOCwgMHg2MSwgMHg4OCwgMHg0NCwgMHg4RCwgMHhDOCwgMHg1RCwgMHgwNSwgMHg2QSwgMHhCOCwgMHg2QSwNCisgICAgMHg4QiwgMHhCMSwgMHhCQiwgMHhENiwgMHhCMywgMHhBQSwgMHhCMiwgMHg4OSwgMHg5NywgMHg2NCwgMHhEMywgMHhDNCwNCisgICAgMHhENCwgMHgxOCwgMHhENCwgMHg3RSwgMHg2MCwgMHhGMSwgMHhBRiwgMHhFMywgMHgzNSwgMHhBQiwgMHhEMSwgMHgxMCwNCisgICAgMHhDNCwgMHgzOSwgMHgyNCwgMHhDMSwgMHgwQiwgMHhCRCwgMHg4MCwgMHgxNywgMHg5QSwgMHg4MCwgMHgyNywgMHg2NCwNCisgICAgMHg4MiwgMHg1NywgMHg2MiwgMHg0MCwgMHhDRCwgMHhEMiwgMHgzNiwgMHg4OCwgMHg1MSwgMHhGQiwgMHg1NywgMHhBRCwNCisgICAgMHg4RSwgMHg1NSwgMHg5MCwgMHhDRSwgMHgxNSwgMHgyNCwgMHhBOSwgMHhDMCwgMHg5NSwgMHgyMywgMHg2OSwgMHg5QSwNCisgICAgMHg3NSwgMHg0MiwgMHhDRCwgMHhBMSwgMHgyQSwgMHhBRSwgMHg0MSwgMHgyOCwgMHg2MiwgMHhGMSwgMHg4QiwgMHg2MCwNCisgICAgMHg2QSwgMHg3QSwgMHhBQywgMHgwOCwgMHgyMSwgMHg0QiwgMHhBNCwgMHgwOCwgMHgwQiwgMHhEMywgMHg5MiwgMHgzNCwNCisgICAgMHg1RCwgMHhBOSwgMHhBMCwgMHhENSwgMHg1MiwgMHgzMSwgMHg0NCwgMHhDOSwgMHhEMiwgMHg3OCwgMHhDOSwgMHg1RiwNCisgICAgMHg0RiwgMHhFMywgMHgyNiwgMHhFRCwgMHg0QiwgMHg0NiwgMHgxMiwgMHhGOCwgMHgxOSwgMHg3MywgMHg0OSwgMHg5QywNCisgICAgMHhDRiwgMHhCMywgMHg4RCwgMHhFNSwgMHhFNiwgMHhCNywgMHg3QywgMHgxOSwgMHhBQywgMHhDMSwgMHgxQywgMHhDQywNCisgICAgMHhDQiwgMHhDNiwgMHhGQSwgMHhDNiwgMHg4MiwgMHhERSwgMHhBQywgMHgzQywgMHg5QywgMHg3QiwgMHhCNCwgMHhGNSwNCisgICAgMHhGQywgMHg1NSwgMHg3RCwgMHhEMSwgMHg1RSwgMHhGNSwgMHg4QSwgMHgxNCwgMHgyNiwgMHhCOSwgMHg0QSwgMHhDMywNCisgICAgMHhEMiwgMHhBQiwgMHg5OCwgMHg0NiwgMHgyQiwgMHgxNSwgMHhCMSwgMHhGOSwgMHgyMSwgMHg4MSwgMHgwRCwgMHg2NiwNCisgICAgMHg1OSwgMHgxMSwgMHg0NCwgMHg3QiwgMHhEMiwgMHhCNiwgMHhFRiwgMHgxNywgMHg2QywgMHhEQiwgMHgyRSwgMHgxNSwNCisgICAgMHgyMywgMHhCQywgMHg2QywgMHhBOSwgMHg2MiwgMHg1MSwgMHg4QSwgMHgwRCwgMHhBNSwgMHgzNSwgMHhENCwgMHhERSwNCisgICAgMHgxQSwgMHg1OSwgMHhCQiwgMHg4OSwgMHhBOSwgMHg4MiwgMHgwRCwgMHhEMywgMHg5NywgMHg4RSwgMHgyNywgMHg3NSwNCisgICAgMHhCQywgMHgxRSwgMHg4OSwgMHgxQywgMHgwNiwgMHg3OSwgMHgwRCwgMHg1MywgMHgxRCwgMHg4QiwgMHg5QSwgMHg3QywNCisgICAgMHhGNywgMHgyQSwgMHg1NiwgMHgzNCwgMHg1RCwgMHg4NiwgMHgyMSwgMHg5OCwgMHgwQywgMHhCQywgMHg3OCwgMHg3MCwNCisgICAgMHhBNiwgMHhBMCwgMHg0NiwgMHg4OSwgMHhCNSwgMHhBOSwgMHhGMSwgMHgxMSwgMHhGOCwgMHhGRSwgMHg3MSwgMHg0NCwNCisgICAgMHhDOSwgMHgyMCwgMHg4NSwgMHhGMSwgMHgxMSwgMHgwNSwgMHhCQSwgMHg2NiwgMHg1OCwgMHg0RCwgMHg0MSwgMHg5QywNCisgICAgMHgxQSwgMHg5MSwgMHg2RSwgMHg2MywgMHg0QSwgMHgwNCwgMHhGMSwgMHg2RSwgMHg4MiwgMHgzRCwgMHhBQywgMHg0QywNCisgICAgMHhBNCwgMHhFMSwgMHg0MSwgMHgzNywgMHgyMiwgMHhBNSwgMHg4OSwgMHgxQSwgMHg4MywgMHgyOSwgMHg3NCwgMHgzNywNCisgICAgMHg4MiwgMHhFOCwgMHg3RSwgMHg0NywgMHg0NywgMHgxOSwgMHgzOSwgMHgyQSwgMHhBRCwgMHg0OSwgMHhGOCwgMHg0MiwNCisgICAgMHgxMCwgMHhDQiwgMHgyQiwgMHhFNSwgMHg2QiwgMHhDOCwgMHhDMiwgMHg5RCwgMHg0OCwgMHg4OCwgMHhEQywgMHhBQiwNCisgICAgMHgyRSwgMHgxMSwgMHgzNywgMHg3RiwgMHhDQSwgMHg1QiwgMHg5QiwgMHg3OCwgMHg0RCwgMHg1NiwgMHg4MiwgMHhCQiwNCisgICAgMHgzNSwgMHhEOCwgMHhGQSwgMHgzRSwgMHhBNSwgMHgxNiwgMHhGQywgMHhFMCwgMHg1NCwgMHhEMSwgMHgxMiwgMHhENCwNCisgICAgMHhBNywgMHg5OCwgMHg0RSwgMHhEMCwgMHgwQywgMHg4RCwgMHgxOCwgMHgzOSwgMHg4NCwgMHgwNywgMHhDNCwgMHhBMiwNCisgICAgMHgxQSwgMHhBNiwgMHhBOCwgMHg2MiwgMHhBQSwgMHgxOSwgMHg4QywgMHg1OSwgMHg5NSwgMHg1NCwgMHgzMSwgMHg1QSwNCisgICAgMHhEMiwgMHhGRSwgMHg0QSwgMHg1OSwgMHhDMCwgMHg1NSwgMHg4QSwgMHhCNywgMHg3MiwgMHgyOSwgMHhCMywgMHg1NCwNCisgICAgMHhBRSwgMHhDMiwgMHgyMywgMHg5NiwgMHg0NywgMHg1OSwgMHhBRSwgMHhDQiwgMHg1QSwgMHgwNiwgMHg2MSwgMHg5MSwNCisgICAgMHhEOCwgMHhENiwgMHg4NiwgMHg4QywgMHhFNiwgMHg4OSwgMHg1OSwgMHhENywgMHgxNCwgMHg5RSwgMHhEMywgMHhENCwNCisgICAgMHhCMywgMHhDNywgMHg0OCwgMHhDQSwgMHgyNywgMHg0MywgMHgwMSwgMHg5NCwgMHgzQSwgMHgwOSwgMHhDOCwgMHhFNSwNCisgICAgMHhEQywgMHhBMywgMHg4MSwgMHg1QiwgMHhFMywgMHg1OSwgMHhBMiwgMHgyNywgMHhCOSwgMHhCNCwgMHgwQSwgMHgxOSwNCisgICAgMHg4OSwgMHgyNiwgMHhCNSwgMHgyQywgMHhBMywgMHhCNiwgMHg0RSwgMHg1QywgMHhBNiwgMHgxNywgMHhBNCwgMHg3QiwNCisgICAgMHhCMywgMHg4NSwgMHhGQSwgMHg1OSwgMHgyQSwgMHg3QSwgMHhGRiwgMHgzRCwgMHhDNCwgMHgzRiwgMHhERSwgMHhDQiwNCisgICAgMHg4QiwgMHhDNH07DQorc3RhdGljIElGWF9Mb2NhbGUqIFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGNvbnN0IHVpbnQ4X3QqIHBCdWYsIGludCBuQnVmTGVuKSB7DQorICBpZiAocEJ1ZiA9PSBOVUxMIHx8IG5CdWZMZW4gPD0gMCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENGWF9HRU1vZHVsZSogcEdlTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKTsNCisgIGlmICghcEdlTW9kdWxlKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0NvZGVjX01vZHVsZU1nciogcENvZGVjTWdyID0gcEdlTW9kdWxlLT5HZXRDb2RlY01vZHVsZSgpOw0KKyAgaWYgKCFwQ29kZWNNZ3IpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDWE1MX0VsZW1lbnQqIHBMb2NhbGUgPSBOVUxMOw0KKyAgdWludDhfdCogcE91dCA9IE5VTEw7DQorICBGWF9EV09SRCBkd1NpemU7DQorICBwQ29kZWNNZ3ItPkdldEZsYXRlTW9kdWxlKCktPkZsYXRlT3JMWldEZWNvZGUoRkFMU0UsIHBCdWYsIG5CdWZMZW4sIFRSVUUsIDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgcE91dCwgZHdTaXplKTsNCisgIGlmIChwT3V0KSB7DQorICAgIHBMb2NhbGUgPSBDWE1MX0VsZW1lbnQ6OlBhcnNlKHBPdXQsIGR3U2l6ZSk7DQorICAgIEZYX0ZyZWUocE91dCk7DQorICB9DQorICBpZiAocExvY2FsZSkgew0KKyAgICByZXR1cm4gbmV3IENYRkFfWE1MTG9jYWxlKHBMb2NhbGUpOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK3N0YXRpYyBGWF9XT1JEIFhGQV9HZXRMYW5ndWFnZShDRlhfV2lkZVN0cmluZyB3c0xhbmd1YWdlKSB7DQorICBGWF9XT1JEIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX2VuX1VTOw0KKyAgaWYgKHdzTGFuZ3VhZ2UuR2V0TGVuZ3RoKCkgPCAyKSB7DQorICAgIHJldHVybiBkd0xhbmd1ZUlEOw0KKyAgfQ0KKyAgd3NMYW5ndWFnZS5NYWtlTG93ZXIoKTsNCisgIEZYX0RXT1JEIGR3SURGaXJzdCA9IHdzTGFuZ3VhZ2UuR2V0QXQoMCkgPDwgOCB8IHdzTGFuZ3VhZ2UuR2V0QXQoMSk7DQorICBGWF9EV09SRCBkd0lEU2Vjb25kID0gd3NMYW5ndWFnZS5HZXRMZW5ndGgoKSA+PSA1DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gd3NMYW5ndWFnZS5HZXRBdCgzKSA8PCA4IHwgd3NMYW5ndWFnZS5HZXRBdCg0KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7DQorICBzd2l0Y2ggKGR3SURGaXJzdCkgew0KKyAgICBjYXNlIEZYQlNUUl9JRCgwLCAwLCAneicsICdoJyk6IHsNCisgICAgICBpZiAoZHdJRFNlY29uZCA9PSBGWEJTVFJfSUQoMCwgMCwgJ2MnLCAnbicpKSB7DQorICAgICAgICBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF96aF9DTjsNCisgICAgICB9IGVsc2UgaWYgKGR3SURTZWNvbmQgPT0gRlhCU1RSX0lEKDAsIDAsICd0JywgJ3cnKSkgew0KKyAgICAgICAgZHdMYW5ndWVJRCA9IFhGQV9MQU5HSURfemhfVFc7DQorICAgICAgfSBlbHNlIGlmIChkd0lEU2Vjb25kID09IEZYQlNUUl9JRCgwLCAwLCAnaCcsICdrJykpIHsNCisgICAgICAgIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX3poX0hLOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGWEJTVFJfSUQoMCwgMCwgJ2onLCAnYScpOg0KKyAgICAgIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX2phX0pQOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYQlNUUl9JRCgwLCAwLCAnaycsICdvJyk6DQorICAgICAgZHdMYW5ndWVJRCA9IFhGQV9MQU5HSURfa29fS1I7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhCU1RSX0lEKDAsIDAsICdlJywgJ24nKTogew0KKyAgICAgIGlmIChkd0lEU2Vjb25kID09IEZYQlNUUl9JRCgwLCAwLCAnZycsICdiJykpIHsNCisgICAgICAgIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX2VuX0dCOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF9lbl9VUzsNCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgRlhCU1RSX0lEKDAsIDAsICdkJywgJ2UnKToNCisgICAgICBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF9kZV9ERTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWEJTVFJfSUQoMCwgMCwgJ2YnLCAncicpOg0KKyAgICAgIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX2ZyX0ZSOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYQlNUUl9JRCgwLCAwLCAnZScsICdzJyk6IHsNCisgICAgICBpZiAoZHdJRFNlY29uZCA9PSBGWEJTVFJfSUQoMCwgMCwgJ2UnLCAncycpKSB7DQorICAgICAgICBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF9lc19FUzsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgZHdMYW5ndWVJRCA9IFhGQV9MQU5HSURfZXNfTEE7DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZYQlNUUl9JRCgwLCAwLCAnaScsICd0Jyk6DQorICAgICAgZHdMYW5ndWVJRCA9IFhGQV9MQU5HSURfaXRfSVQ7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhCU1RSX0lEKDAsIDAsICdwJywgJ3QnKToNCisgICAgICBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF9wdF9CUjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWEJTVFJfSUQoMCwgMCwgJ24nLCAnbCcpOg0KKyAgICAgIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX25sX05MOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYQlNUUl9JRCgwLCAwLCAncicsICd1Jyk6DQorICAgICAgZHdMYW5ndWVJRCA9IFhGQV9MQU5HSURfcnVfUlU7DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gZHdMYW5ndWVJRDsNCit9DQorQ1hGQV9Mb2NhbGVNZ3I6OkNYRkFfTG9jYWxlTWdyKENYRkFfTm9kZSogcExvY2FsZVNldCwgQ0ZYX1dpZGVTdHJpbmcgd3NEZWZsY2lkKQ0KKyAgICA6IG1fZHdMb2NhbGVGbGFncygweDAwKSB7DQorICBtX2R3RGVmbGNpZCA9IFhGQV9HZXRMYW5ndWFnZSh3c0RlZmxjaWQpOw0KKyAgQ1hGQV9Ob2RlKiBwTm9kZUxvY2FsZSA9IE5VTEw7DQorICBpZiAocExvY2FsZVNldCAmJg0KKyAgICAgIChwTm9kZUxvY2FsZSA9IHBMb2NhbGVTZXQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkpIHsNCisgICAgd2hpbGUgKHBOb2RlTG9jYWxlKSB7DQorICAgICAgbV9Mb2NhbGVBcnJheS5BZGQobmV3IENYRkFfTm9kZUxvY2FsZShwTm9kZUxvY2FsZSkpOw0KKyAgICAgIHBOb2RlTG9jYWxlID0gcE5vZGVMb2NhbGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgIH0NCisgIH0NCisgIG1fcERlZkxvY2FsZSA9IEdldExvY2FsZUJ5TmFtZSh3c0RlZmxjaWQpOw0KK30NCitDWEZBX0xvY2FsZU1ncjo6fkNYRkFfTG9jYWxlTWdyKCkgew0KKyAgaW50MzJfdCBpQ291bnQgPSBtX0xvY2FsZUFycmF5LkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgICgoSUZYX0xvY2FsZSopbV9Mb2NhbGVBcnJheVtpXSktPlJlbGVhc2UoKTsNCisgIH0NCisgIGludDMyX3QgaVhtbHMgPSBtX1hNTExvY2FsZUFycmF5LkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlYbWxzOyBqKyspIHsNCisgICAgKChJRlhfTG9jYWxlKiltX1hNTExvY2FsZUFycmF5W2pdKS0+UmVsZWFzZSgpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTG9jYWxlTWdyOjpSZWxlYXNlKCkgew0KKyAgZGVsZXRlIHRoaXM7DQorfQ0KK0ZYX1dPUkQgQ1hGQV9Mb2NhbGVNZ3I6OkdldERlZkxvY2FsZUlEKCkgew0KKyAgcmV0dXJuIG1fZHdEZWZsY2lkOw0KK30NCitJRlhfTG9jYWxlKiBDWEZBX0xvY2FsZU1ncjo6R2V0RGVmTG9jYWxlKCkgew0KKyAgaWYgKG1fcERlZkxvY2FsZSkgew0KKyAgICByZXR1cm4gbV9wRGVmTG9jYWxlOw0KKyAgfSBlbHNlIGlmIChtX0xvY2FsZUFycmF5LkdldFNpemUoKSkgew0KKyAgICByZXR1cm4gKElGWF9Mb2NhbGUqKW1fTG9jYWxlQXJyYXlbMF07DQorICB9IGVsc2UgaWYgKG1fWE1MTG9jYWxlQXJyYXkuR2V0U2l6ZSgpKSB7DQorICAgIHJldHVybiAoSUZYX0xvY2FsZSopbV9YTUxMb2NhbGVBcnJheVswXTsNCisgIH0NCisgIG1fcERlZkxvY2FsZSA9IEdldExvY2FsZShtX2R3RGVmbGNpZCk7DQorICBpZiAobV9wRGVmTG9jYWxlICE9IE5VTEwpIHsNCisgICAgbV9YTUxMb2NhbGVBcnJheS5BZGQobV9wRGVmTG9jYWxlKTsNCisgIH0NCisgIHJldHVybiBtX3BEZWZMb2NhbGU7DQorfQ0KK0lGWF9Mb2NhbGUqIENYRkFfTG9jYWxlTWdyOjpHZXRMb2NhbGUoRlhfV09SRCBsY2lkKSB7DQorICBJRlhfTG9jYWxlKiBwTG9jYWwgPSBOVUxMOw0KKyAgc3dpdGNoIChsY2lkKSB7DQorICAgIGNhc2UgWEZBX0xBTkdJRF96aF9DTjoNCisgICAgICBwTG9jYWwgPSBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX3poQ05fTG9jYWxlLCBzaXplb2YoZ196aENOX0xvY2FsZSkpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9MQU5HSURfemhfVFc6DQorICAgICAgcExvY2FsID0gWEZBX0dldExvY2FsZUZyb21CdWZmZXIoZ196aFRXX0xvY2FsZSwgc2l6ZW9mKGdfemhUV19Mb2NhbGUpKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfTEFOR0lEX3poX0hLOg0KKyAgICAgIHBMb2NhbCA9IFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfemhIS19Mb2NhbGUsIHNpemVvZihnX3poSEtfTG9jYWxlKSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0xBTkdJRF9qYV9KUDoNCisgICAgICBwTG9jYWwgPSBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX2phSlBfTG9jYWxlLCBzaXplb2YoZ19qYUpQX0xvY2FsZSkpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9MQU5HSURfa29fS1I6DQorICAgICAgcExvY2FsID0gWEZBX0dldExvY2FsZUZyb21CdWZmZXIoZ19rb0tSX0xvY2FsZSwgc2l6ZW9mKGdfa29LUl9Mb2NhbGUpKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfTEFOR0lEX2VuX0dCOg0KKyAgICAgIHBMb2NhbCA9IFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfZW5HQl9Mb2NhbGUsIHNpemVvZihnX2VuR0JfTG9jYWxlKSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0xBTkdJRF9lc19MQToNCisgICAgICBwTG9jYWwgPSBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX2VzTEFfTG9jYWxlLCBzaXplb2YoZ19lc0xBX0xvY2FsZSkpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9MQU5HSURfZXNfRVM6DQorICAgICAgcExvY2FsID0gWEZBX0dldExvY2FsZUZyb21CdWZmZXIoZ19lc0VTX0xvY2FsZSwgc2l6ZW9mKGdfZXNFU19Mb2NhbGUpKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfTEFOR0lEX2RlX0RFOg0KKyAgICAgIHBMb2NhbCA9IFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfZGVERV9Mb2FjYWxlLCBzaXplb2YoZ19kZURFX0xvYWNhbGUpKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfTEFOR0lEX2ZyX0ZSOg0KKyAgICAgIHBMb2NhbCA9IFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfZnJGUl9Mb2NhbGUsIHNpemVvZihnX2ZyRlJfTG9jYWxlKSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0xBTkdJRF9pdF9JVDoNCisgICAgICBwTG9jYWwgPSBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX2l0SVRfTG9jYWxlLCBzaXplb2YoZ19pdElUX0xvY2FsZSkpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9MQU5HSURfcHRfQlI6DQorICAgICAgcExvY2FsID0gWEZBX0dldExvY2FsZUZyb21CdWZmZXIoZ19wdEJSX0xvY2FsZSwgc2l6ZW9mKGdfcHRCUl9Mb2NhbGUpKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfTEFOR0lEX25sX05MOg0KKyAgICAgIHBMb2NhbCA9IFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfbmxOTF9Mb2NhbGUsIHNpemVvZihnX25sTkxfTG9jYWxlKSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0xBTkdJRF9ydV9SVToNCisgICAgICBwTG9jYWwgPSBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX3J1UlVfTG9jYWxlLCBzaXplb2YoZ19ydVJVX0xvY2FsZSkpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9MQU5HSURfZW5fVVM6DQorICAgIGRlZmF1bHQ6DQorICAgICAgcExvY2FsID0gWEZBX0dldExvY2FsZUZyb21CdWZmZXIoZ19lblVTX0xvY2FsZSwgc2l6ZW9mKGdfZW5VU19Mb2NhbGUpKTsNCisgICAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBwTG9jYWw7DQorfQ0KK0lGWF9Mb2NhbGUqIENYRkFfTG9jYWxlTWdyOjpHZXRMb2NhbGVCeU5hbWUoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMb2NhbGVOYW1lKSB7DQorICBpbnQzMl90IGlDb3VudCA9IG1fTG9jYWxlQXJyYXkuR2V0U2l6ZSgpOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gKChJRlhfTG9jYWxlKiltX0xvY2FsZUFycmF5W2ldKTsNCisgICAgaWYgKHBMb2NhbGUtPkdldE5hbWUoKSA9PSB3c0xvY2FsZU5hbWUpIHsNCisgICAgICByZXR1cm4gcExvY2FsZTsNCisgICAgfQ0KKyAgfQ0KKyAgaW50MzJfdCBpTGVuID0gd3NMb2NhbGVOYW1lLkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW4gPCAyKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaUNvdW50ID0gbV9YTUxMb2NhbGVBcnJheS5HZXRTaXplKCk7DQorICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgSUZYX0xvY2FsZSogcExvY2FsZSA9ICgoSUZYX0xvY2FsZSopbV9YTUxMb2NhbGVBcnJheVtpXSk7DQorICAgIGlmIChwTG9jYWxlLT5HZXROYW1lKCkgPT0gd3NMb2NhbGVOYW1lKSB7DQorICAgICAgcmV0dXJuIHBMb2NhbGU7DQorICAgIH0NCisgIH0NCisgIEZYX1dPUkQgZHdMYW5ndWVJRCA9IFhGQV9HZXRMYW5ndWFnZSh3c0xvY2FsZU5hbWUpOw0KKyAgSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldExvY2FsZShkd0xhbmd1ZUlEKTsNCisgIGlmIChwTG9jYWxlICE9IE5VTEwpIHsNCisgICAgbV9YTUxMb2NhbGVBcnJheS5BZGQocExvY2FsZSk7DQorICB9DQorICByZXR1cm4gcExvY2FsZTsNCit9DQordm9pZCBDWEZBX0xvY2FsZU1ncjo6U2V0RGVmTG9jYWxlKElGWF9Mb2NhbGUqIHBMb2NhbGUpIHsNCisgIG1fcERlZkxvY2FsZSA9IHBMb2NhbGU7DQorfQ0KK0NGWF9XaWRlU3RyaW5nQyBDWEZBX0xvY2FsZU1ncjo6R2V0Q29uZmlnTG9jYWxlTmFtZShDWEZBX05vZGUqIHBDb25maWcpIHsNCisgIGlmICghKG1fZHdMb2NhbGVGbGFncyAmIDB4MDEpKSB7DQorICAgIG1fd3NDb25maWdMb2NhbGUuRW1wdHkoKTsNCisgICAgaWYgKHBDb25maWcpIHsNCisgICAgICBDWEZBX05vZGUqIHBDaGlsZGZDb25maWcgPQ0KKyAgICAgICAgICBwQ29uZmlnLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9BY3JvYmF0KTsNCisgICAgICBpZiAoIXBDaGlsZGZDb25maWcpIHsNCisgICAgICAgIHBDaGlsZGZDb25maWcgPSBwQ29uZmlnLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9QcmVzZW50KTsNCisgICAgICB9DQorICAgICAgQ1hGQV9Ob2RlKiBwQ29tbW9uID0NCisgICAgICAgICAgcENoaWxkZkNvbmZpZw0KKyAgICAgICAgICAgICAgPyBwQ2hpbGRmQ29uZmlnLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9Db21tb24pDQorICAgICAgICAgICAgICA6IE5VTEw7DQorICAgICAgQ1hGQV9Ob2RlKiBwTG9jYWxlID0NCisgICAgICAgICAgcENvbW1vbiA/IHBDb21tb24tPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0xvY2FsZSkgOiBOVUxMOw0KKyAgICAgIGlmIChwTG9jYWxlKSB7DQorICAgICAgICBwTG9jYWxlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCBtX3dzQ29uZmlnTG9jYWxlLCBGQUxTRSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIG1fZHdMb2NhbGVGbGFncyB8PSAweDAxOw0KKyAgfQ0KKyAgcmV0dXJuIG1fd3NDb25maWdMb2NhbGU7DQorfQ0KK3N0YXRpYyBDWEZBX1RpbWVab25lUHJvdmlkZXIqIGdfcFByb3ZpZGVyID0gTlVMTDsNCitJWEZBX1RpbWVab25lUHJvdmlkZXIqIElYRkFfVGltZVpvbmVQcm92aWRlcjo6Q3JlYXRlKCkgew0KKyAgRlhTWVNfYXNzZXJ0KCFnX3BQcm92aWRlcik7DQorICBnX3BQcm92aWRlciA9IG5ldyBDWEZBX1RpbWVab25lUHJvdmlkZXIoKTsNCisgIHJldHVybiBnX3BQcm92aWRlcjsNCit9DQorSVhGQV9UaW1lWm9uZVByb3ZpZGVyKiBJWEZBX1RpbWVab25lUHJvdmlkZXI6OkdldCgpIHsNCisgIGlmICghZ19wUHJvdmlkZXIpIHsNCisgICAgZ19wUHJvdmlkZXIgPSBuZXcgQ1hGQV9UaW1lWm9uZVByb3ZpZGVyKCk7DQorICB9DQorICByZXR1cm4gZ19wUHJvdmlkZXI7DQorfQ0KK3ZvaWQgSVhGQV9UaW1lWm9uZVByb3ZpZGVyOjpEZXN0cm95KCkgew0KKyAgZGVsZXRlIGdfcFByb3ZpZGVyOw0KKyAgZ19wUHJvdmlkZXIgPSBOVUxMOw0KK30NCisjaW5jbHVkZSA8dGltZS5oPg0KK0NYRkFfVGltZVpvbmVQcm92aWRlcjo6Q1hGQV9UaW1lWm9uZVByb3ZpZGVyKCkgew0KKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfDQorICBfdHpzZXQoKTsNCisgIG1fdHoudHpIb3VyID0gKGludDhfdCkoX3RpbWV6b25lIC8gMzYwMCAqIC0xKTsNCisgIG1fdHoudHpNaW51dGUgPSAoaW50OF90KSgoRlhTWVNfYWJzKF90aW1lem9uZSkgJSAzNjAwKSAvIDYwKTsNCisjZWxzZQ0KKyAgdHpzZXQoKTsNCisgIG1fdHoudHpIb3VyID0gKGludDhfdCkodGltZXpvbmUgLyAzNjAwICogLTEpOw0KKyAgbV90ei50ek1pbnV0ZSA9IChpbnQ4X3QpKChGWFNZU19hYnMoKGludCl0aW1lem9uZSkgJSAzNjAwKSAvIDYwKTsNCisjZW5kaWYNCit9DQorQ1hGQV9UaW1lWm9uZVByb3ZpZGVyOjp+Q1hGQV9UaW1lWm9uZVByb3ZpZGVyKCkge30NCit2b2lkIENYRkFfVGltZVpvbmVQcm92aWRlcjo6U2V0VGltZVpvbmUoRlhfVElNRVpPTkUmIHR6KSB7DQorICBtX3R6ID0gdHo7DQorfQ0KK3ZvaWQgQ1hGQV9UaW1lWm9uZVByb3ZpZGVyOjpHZXRUaW1lWm9uZShGWF9USU1FWk9ORSYgdHopIHsNCisgIHR6ID0gbV90ejsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX2xvY2FsZXZhbHVlLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sb2NhbGV2YWx1ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ3MzFiMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9sb2NhbGV2YWx1ZS5jcHAKQEAgLTAsMCArMSwxMDAxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV91dGlscy5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfb2JqZWN0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2N1bWVudC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfcGFyc2VyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9zY3JpcHQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY2RhdGEuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY2xheW91dC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfbG9jYWxlbWdyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9mbTJqc2FwaS5oIg0KK3N0YXRpYyBjb25zdCBGWF9ET1VCTEUgZnJhY3Rpb25fc2NhbGVzW10gPSB7MC4xLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAwMDAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAwMDAwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAwMDAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAwMDAwMDAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAwMDAwMDAwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAwMDAwMDAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAwMDAwMDAwMDAxfTsNCitDWEZBX0xvY2FsZVZhbHVlOjpDWEZBX0xvY2FsZVZhbHVlKCkgew0KKyAgbV9kd1R5cGUgPSBYRkFfVlRfTlVMTDsNCisgIG1fYlZhbGlkID0gVFJVRTsNCisgIG1fcExvY2FsZU1nciA9IE5VTEw7DQorfQ0KK0NYRkFfTG9jYWxlVmFsdWU6OkNYRkFfTG9jYWxlVmFsdWUoY29uc3QgQ1hGQV9Mb2NhbGVWYWx1ZSYgdmFsdWUpIHsNCisgIG1fZHdUeXBlID0gWEZBX1ZUX05VTEw7DQorICBtX2JWYWxpZCA9IFRSVUU7DQorICBtX3BMb2NhbGVNZ3IgPSBOVUxMOw0KKyAgKnRoaXMgPSB2YWx1ZTsNCit9DQorQ1hGQV9Mb2NhbGVWYWx1ZTo6Q1hGQV9Mb2NhbGVWYWx1ZShGWF9EV09SRCBkd1R5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xvY2FsZU1nciogcExvY2FsZU1ncikgew0KKyAgbV9kd1R5cGUgPSBkd1R5cGU7DQorICBtX2JWYWxpZCA9IChtX2R3VHlwZSAhPSBYRkFfVlRfTlVMTCk7DQorICBtX3BMb2NhbGVNZ3IgPSBwTG9jYWxlTWdyOw0KK30NCitDWEZBX0xvY2FsZVZhbHVlOjpDWEZBX0xvY2FsZVZhbHVlKEZYX0RXT1JEIGR3VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Mb2NhbGVNZ3IqIHBMb2NhbGVNZ3IpIHsNCisgIG1fd3NWYWx1ZSA9IHdzVmFsdWU7DQorICBtX2R3VHlwZSA9IGR3VHlwZTsNCisgIG1fcExvY2FsZU1nciA9IHBMb2NhbGVNZ3I7DQorICBtX2JWYWxpZCA9IFZhbGlkYXRlQ2Fub25pY2FsVmFsdWUod3NWYWx1ZSwgZHdUeXBlKTsNCit9DQorQ1hGQV9Mb2NhbGVWYWx1ZTo6Q1hGQV9Mb2NhbGVWYWx1ZShGWF9EV09SRCBkd1R5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xvY2FsZU1nciogcExvY2FsZU1ncikgew0KKyAgbV9wTG9jYWxlTWdyID0gcExvY2FsZU1ncjsNCisgIG1fYlZhbGlkID0gVFJVRTsNCisgIG1fZHdUeXBlID0gZHdUeXBlOw0KKyAgbV9iVmFsaWQgPSBQYXJzZVBhdHRlcm5WYWx1ZSh3c1ZhbHVlLCB3c0Zvcm1hdCwgcExvY2FsZSk7DQorfQ0KK0NYRkFfTG9jYWxlVmFsdWUmIENYRkFfTG9jYWxlVmFsdWU6Om9wZXJhdG9yPShjb25zdCBDWEZBX0xvY2FsZVZhbHVlJiB2YWx1ZSkgew0KKyAgbV93c1ZhbHVlID0gdmFsdWUubV93c1ZhbHVlOw0KKyAgbV9kd1R5cGUgPSB2YWx1ZS5tX2R3VHlwZTsNCisgIG1fYlZhbGlkID0gdmFsdWUubV9iVmFsaWQ7DQorICBtX3BMb2NhbGVNZ3IgPSB2YWx1ZS5tX3BMb2NhbGVNZ3I7DQorICByZXR1cm4gKnRoaXM7DQorfQ0KK0NYRkFfTG9jYWxlVmFsdWU6On5DWEZBX0xvY2FsZVZhbHVlKCkge30NCitzdGF0aWMgRlhfTE9DQUxFQ0FURUdPUlkgWEZBX1ZhbHVnZUNhdGVnb3J5KEZYX0xPQ0FMRUNBVEVHT1JZIGVDYXRlZ29yeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3VmFsdWVUeXBlKSB7DQorICBpZiAoZUNhdGVnb3J5ID09IEZYX0xPQ0FMRUNBVEVHT1JZX1Vua25vd24pIHsNCisgICAgc3dpdGNoIChkd1ZhbHVlVHlwZSkgew0KKyAgICAgIGNhc2UgWEZBX1ZUX0JPT0xFQU46DQorICAgICAgY2FzZSBYRkFfVlRfSU5URUdFUjoNCisgICAgICBjYXNlIFhGQV9WVF9ERUNJTUFMOg0KKyAgICAgIGNhc2UgWEZBX1ZUX0ZMT0FUOg0KKyAgICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX051bTsNCisgICAgICBjYXNlIFhGQV9WVF9URVhUOg0KKyAgICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX1RleHQ7DQorICAgICAgY2FzZSBYRkFfVlRfREFURToNCisgICAgICAgIHJldHVybiBGWF9MT0NBTEVDQVRFR09SWV9EYXRlOw0KKyAgICAgIGNhc2UgWEZBX1ZUX1RJTUU6DQorICAgICAgICByZXR1cm4gRlhfTE9DQUxFQ0FURUdPUllfVGltZTsNCisgICAgICBjYXNlIFhGQV9WVF9EQVRFVElNRToNCisgICAgICAgIHJldHVybiBGWF9MT0NBTEVDQVRFR09SWV9EYXRlVGltZTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGVDYXRlZ29yeTsNCit9DQorRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpWYWxpZGF0ZVZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyogcE1hdGNoRm9ybWF0KSB7DQorICBDRlhfV2lkZVN0cmluZyB3c091dHB1dDsNCisgIElGWF9Mb2NhbGUqIGxvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7DQorICBpZiAocExvY2FsZSkgew0KKyAgICBtX3BMb2NhbGVNZ3ItPlNldERlZkxvY2FsZShwTG9jYWxlKTsNCisgIH0NCisgIElGWF9Gb3JtYXRTdHJpbmcqIHBGb3JtYXQgPSBJRlhfRm9ybWF0U3RyaW5nOjpDcmVhdGUobV9wTG9jYWxlTWdyLCBGQUxTRSk7DQorICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzUGF0dGVybnM7DQorICBwRm9ybWF0LT5TcGxpdEZvcm1hdFN0cmluZyh3c1BhdHRlcm4sIHdzUGF0dGVybnMpOw0KKyAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7DQorICBpbnQzMl90IGlDb3VudCA9IHdzUGF0dGVybnMuR2V0U2l6ZSgpOw0KKyAgaW50MzJfdCBpID0gMDsNCisgIGZvciAoOyBpIDwgaUNvdW50ICYmICFiUmV0OyBpKyspIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXQgPSB3c1BhdHRlcm5zW2ldOw0KKyAgICBGWF9MT0NBTEVDQVRFR09SWSBlQ2F0ZWdvcnkgPSBwRm9ybWF0LT5HZXRDYXRlZ29yeSh3c0Zvcm1hdCk7DQorICAgIGVDYXRlZ29yeSA9IFhGQV9WYWx1Z2VDYXRlZ29yeShlQ2F0ZWdvcnksIG1fZHdUeXBlKTsNCisgICAgc3dpdGNoIChlQ2F0ZWdvcnkpIHsNCisgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX051bGw6DQorICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VOdWxsKHdzVmFsdWUsIHdzRm9ybWF0KTsNCisgICAgICAgIGlmICghYlJldCkgew0KKyAgICAgICAgICBiUmV0ID0gd3NWYWx1ZS5Jc0VtcHR5KCk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX1plcm86DQorICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VaZXJvKHdzVmFsdWUsIHdzRm9ybWF0KTsNCisgICAgICAgIGlmICghYlJldCkgew0KKyAgICAgICAgICBiUmV0ID0gd3NWYWx1ZSA9PSBGWF9XU1RSQyhMIjAiKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfTnVtOiB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyBmTnVtOw0KKyAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlTnVtKHdzVmFsdWUsIHdzRm9ybWF0LCBmTnVtKTsNCisgICAgICAgIGlmICghYlJldCkgew0KKyAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+Rm9ybWF0TnVtKHdzVmFsdWUsIHdzRm9ybWF0LCB3c091dHB1dCk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9UZXh0Og0KKyAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlVGV4dCh3c1ZhbHVlLCB3c0Zvcm1hdCwgd3NPdXRwdXQpOw0KKyAgICAgICAgd3NPdXRwdXQuRW1wdHkoKTsNCisgICAgICAgIGlmICghYlJldCkgew0KKyAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+Rm9ybWF0VGV4dCh3c1ZhbHVlLCB3c0Zvcm1hdCwgd3NPdXRwdXQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlOiB7DQorICAgICAgICBDRlhfVW5pdGltZSBkdDsNCisgICAgICAgIGJSZXQgPSBWYWxpZGF0ZUNhbm9uaWNhbERhdGUod3NWYWx1ZSwgZHQpOw0KKyAgICAgICAgaWYgKCFiUmV0KSB7DQorICAgICAgICAgIGJSZXQgPSBwRm9ybWF0LT5QYXJzZURhdGVUaW1lKHdzVmFsdWUsIHdzRm9ybWF0LCBGWF9EQVRFVElNRVRZUEVfRGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHQpOw0KKyAgICAgICAgICBpZiAoIWJSZXQpIHsNCisgICAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+Rm9ybWF0RGF0ZVRpbWUod3NWYWx1ZSwgd3NGb3JtYXQsIHdzT3V0cHV0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EQVRFVElNRVRZUEVfRGF0ZSk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX1RpbWU6IHsNCisgICAgICAgIENGWF9Vbml0aW1lIGR0Ow0KKyAgICAgICAgYlJldCA9DQorICAgICAgICAgICAgcEZvcm1hdC0+UGFyc2VEYXRlVGltZSh3c1ZhbHVlLCB3c0Zvcm1hdCwgRlhfREFURVRJTUVUWVBFX1RpbWUsIGR0KTsNCisgICAgICAgIGlmICghYlJldCkgew0KKyAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+Rm9ybWF0RGF0ZVRpbWUod3NWYWx1ZSwgd3NGb3JtYXQsIHdzT3V0cHV0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfREFURVRJTUVUWVBFX1RpbWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZVRpbWU6IHsNCisgICAgICAgIENGWF9Vbml0aW1lIGR0Ow0KKyAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlRGF0ZVRpbWUod3NWYWx1ZSwgd3NGb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EQVRFVElNRVRZUEVfRGF0ZVRpbWUsIGR0KTsNCisgICAgICAgIGlmICghYlJldCkgew0KKyAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+Rm9ybWF0RGF0ZVRpbWUod3NWYWx1ZSwgd3NGb3JtYXQsIHdzT3V0cHV0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfREFURVRJTUVUWVBFX0RhdGVUaW1lKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYlJldCA9IEZBTFNFOw0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGlmIChiUmV0ICYmIHBNYXRjaEZvcm1hdCkgew0KKyAgICAqcE1hdGNoRm9ybWF0ID0gd3NQYXR0ZXJuc1tpIC0gMV07DQorICB9DQorICBwRm9ybWF0LT5SZWxlYXNlKCk7DQorICBpZiAocExvY2FsZSkgew0KKyAgICBtX3BMb2NhbGVNZ3ItPlNldERlZkxvY2FsZShsb2NhbGUpOw0KKyAgfQ0KKyAgcmV0dXJuIGJSZXQ7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfTG9jYWxlVmFsdWU6OkdldFZhbHVlKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fd3NWYWx1ZTsNCit9DQorRlhfRFdPUkQgQ1hGQV9Mb2NhbGVWYWx1ZTo6R2V0VHlwZSgpIGNvbnN0IHsNCisgIHJldHVybiBtX2R3VHlwZTsNCit9DQordm9pZCBDWEZBX0xvY2FsZVZhbHVlOjpTZXRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3VHlwZSkgew0KKyAgbV93c1ZhbHVlID0gd3NWYWx1ZTsNCisgIG1fZHdUeXBlID0gZHdUeXBlOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX0xvY2FsZVZhbHVlOjpHZXRUZXh0KCkgY29uc3Qgew0KKyAgaWYgKG1fYlZhbGlkICYmIG1fZHdUeXBlID09IFhGQV9WVF9URVhUKSB7DQorICAgIHJldHVybiBtX3dzVmFsdWU7DQorICB9DQorICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsNCit9DQorRlhfRkxPQVQgQ1hGQV9Mb2NhbGVWYWx1ZTo6R2V0TnVtKCkgY29uc3Qgew0KKyAgaWYgKG1fYlZhbGlkICYmIChtX2R3VHlwZSA9PSBYRkFfVlRfQk9PTEVBTiB8fCBtX2R3VHlwZSA9PSBYRkFfVlRfSU5URUdFUiB8fA0KKyAgICAgICAgICAgICAgICAgICBtX2R3VHlwZSA9PSBYRkFfVlRfREVDSU1BTCB8fCBtX2R3VHlwZSA9PSBYRkFfVlRfRkxPQVQpKSB7DQorICAgIGludDY0X3QgbkludGVncmFsID0gMDsNCisgICAgRlhfRFdPUkQgZHdGcmFjdGlvbmFsID0gMDsNCisgICAgaW50MzJfdCBuRXhwb25lbnQgPSAwOw0KKyAgICBpbnQgY2MgPSAwOw0KKyAgICBGWF9CT09MIGJOZWdhdGl2ZSA9IEZBTFNFLCBiRXhwU2lnbiA9IEZBTFNFOw0KKyAgICBjb25zdCBGWF9XQ0hBUiogc3RyID0gKGNvbnN0IEZYX1dDSEFSKiltX3dzVmFsdWU7DQorICAgIGludCBsZW4gPSBtX3dzVmFsdWUuR2V0TGVuZ3RoKCk7DQorICAgIHdoaWxlIChYRkFfSXNTcGFjZShzdHJbY2NdKSAmJiBjYyA8IGxlbikgew0KKyAgICAgIGNjKys7DQorICAgIH0NCisgICAgaWYgKGNjID49IGxlbikgew0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIGlmIChzdHJbMF0gPT0gJysnKSB7DQorICAgICAgY2MrKzsNCisgICAgfSBlbHNlIGlmIChzdHJbMF0gPT0gJy0nKSB7DQorICAgICAgYk5lZ2F0aXZlID0gVFJVRTsNCisgICAgICBjYysrOw0KKyAgICB9DQorICAgIGludCBuSW50ZWdyYWxMZW4gPSAwOw0KKyAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCisgICAgICBpZiAoc3RyW2NjXSA9PSAnLicgfHwgIVhGQV9Jc0RpZ2l0KHN0cltjY10pIHx8IG5JbnRlZ3JhbExlbiA+IDE3KSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgbkludGVncmFsID0gbkludGVncmFsICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KKyAgICAgIGNjKys7DQorICAgICAgbkludGVncmFsTGVuKys7DQorICAgIH0NCisgICAgbkludGVncmFsID0gYk5lZ2F0aXZlID8gLW5JbnRlZ3JhbCA6IG5JbnRlZ3JhbDsNCisgICAgaW50IHNjYWxlID0gMDsNCisgICAgZG91YmxlIGZyYWN0aW9uID0gMC4wOw0KKyAgICBpZiAoY2MgPCBsZW4gJiYgc3RyW2NjXSA9PSAnLicpIHsNCisgICAgICBjYysrOw0KKyAgICAgIHdoaWxlIChjYyA8IGxlbikgew0KKyAgICAgICAgZnJhY3Rpb24gKz0gZnJhY3Rpb25fc2NhbGVzW3NjYWxlXSAqIChzdHJbY2NdIC0gJzAnKTsNCisgICAgICAgIHNjYWxlKys7DQorICAgICAgICBjYysrOw0KKyAgICAgICAgaWYgKHNjYWxlID09IHNpemVvZiBmcmFjdGlvbl9zY2FsZXMgLyBzaXplb2YoZG91YmxlKSB8fA0KKyAgICAgICAgICAgICFYRkFfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgZHdGcmFjdGlvbmFsID0gKEZYX0RXT1JEKShmcmFjdGlvbiAqIDQyOTQ5NjcyOTYuMCk7DQorICAgIH0NCisgICAgaWYgKGNjIDwgbGVuICYmIChzdHJbY2NdID09ICdFJyB8fCBzdHJbY2NdID09ICdlJykpIHsNCisgICAgICBjYysrOw0KKyAgICAgIGlmIChjYyA8IGxlbikgew0KKyAgICAgICAgaWYgKHN0cltjY10gPT0gJysnKSB7DQorICAgICAgICAgIGNjKys7DQorICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJy0nKSB7DQorICAgICAgICAgIGJFeHBTaWduID0gVFJVRTsNCisgICAgICAgICAgY2MrKzsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQorICAgICAgICBpZiAoc3RyW2NjXSA9PSAnLicgfHwgIVhGQV9Jc0RpZ2l0KHN0cltjY10pKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbkV4cG9uZW50ID0gbkV4cG9uZW50ICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KKyAgICAgICAgY2MrKzsNCisgICAgICB9DQorICAgICAgbkV4cG9uZW50ID0gYkV4cFNpZ24gPyAtbkV4cG9uZW50IDogbkV4cG9uZW50Ow0KKyAgICB9DQorICAgIEZYX0ZMT0FUIGZWYWx1ZSA9IChGWF9GTE9BVCkoZHdGcmFjdGlvbmFsIC8gNDI5NDk2NzI5Ni4wKTsNCisgICAgZlZhbHVlID0gbkludGVncmFsICsgKG5JbnRlZ3JhbCA+PSAwID8gZlZhbHVlIDogLWZWYWx1ZSk7DQorICAgIGlmIChuRXhwb25lbnQgIT0gMCkgew0KKyAgICAgIGZWYWx1ZSAqPSBGWFNZU19wb3coMTAsIChGWF9GTE9BVCluRXhwb25lbnQpOw0KKyAgICB9DQorICAgIHJldHVybiBmVmFsdWU7DQorICB9DQorICByZXR1cm4gMDsNCit9DQorRlhfRE9VQkxFIENYRkFfTG9jYWxlVmFsdWU6OkdldERvdWJsZU51bSgpIGNvbnN0IHsNCisgIGlmIChtX2JWYWxpZCAmJiAobV9kd1R5cGUgPT0gWEZBX1ZUX0JPT0xFQU4gfHwgbV9kd1R5cGUgPT0gWEZBX1ZUX0lOVEVHRVIgfHwNCisgICAgICAgICAgICAgICAgICAgbV9kd1R5cGUgPT0gWEZBX1ZUX0RFQ0lNQUwgfHwgbV9kd1R5cGUgPT0gWEZBX1ZUX0ZMT0FUKSkgew0KKyAgICBpbnQ2NF90IG5JbnRlZ3JhbCA9IDA7DQorICAgIEZYX0RXT1JEIGR3RnJhY3Rpb25hbCA9IDA7DQorICAgIGludDMyX3QgbkV4cG9uZW50ID0gMDsNCisgICAgaW50MzJfdCBjYyA9IDA7DQorICAgIEZYX0JPT0wgYk5lZ2F0aXZlID0gRkFMU0UsIGJFeHBTaWduID0gRkFMU0U7DQorICAgIGNvbnN0IEZYX1dDSEFSKiBzdHIgPSAoY29uc3QgRlhfV0NIQVIqKW1fd3NWYWx1ZTsNCisgICAgaW50IGxlbiA9IG1fd3NWYWx1ZS5HZXRMZW5ndGgoKTsNCisgICAgd2hpbGUgKFhGQV9Jc1NwYWNlKHN0cltjY10pICYmIGNjIDwgbGVuKSB7DQorICAgICAgY2MrKzsNCisgICAgfQ0KKyAgICBpZiAoY2MgPj0gbGVuKSB7DQorICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgaWYgKHN0clswXSA9PSAnKycpIHsNCisgICAgICBjYysrOw0KKyAgICB9IGVsc2UgaWYgKHN0clswXSA9PSAnLScpIHsNCisgICAgICBiTmVnYXRpdmUgPSBUUlVFOw0KKyAgICAgIGNjKys7DQorICAgIH0NCisgICAgaW50MzJfdCBuSW50ZWdyYWxMZW4gPSAwOw0KKyAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCisgICAgICBpZiAoc3RyW2NjXSA9PSAnLicgfHwgIVhGQV9Jc0RpZ2l0KHN0cltjY10pIHx8IG5JbnRlZ3JhbExlbiA+IDE3KSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgbkludGVncmFsID0gbkludGVncmFsICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KKyAgICAgIGNjKys7DQorICAgICAgbkludGVncmFsTGVuKys7DQorICAgIH0NCisgICAgbkludGVncmFsID0gYk5lZ2F0aXZlID8gLW5JbnRlZ3JhbCA6IG5JbnRlZ3JhbDsNCisgICAgaW50MzJfdCBzY2FsZSA9IDA7DQorICAgIEZYX0RPVUJMRSBmcmFjdGlvbiA9IDAuMDsNCisgICAgaWYgKGNjIDwgbGVuICYmIHN0cltjY10gPT0gJy4nKSB7DQorICAgICAgY2MrKzsNCisgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsNCisgICAgICAgIGZyYWN0aW9uICs9IGZyYWN0aW9uX3NjYWxlc1tzY2FsZV0gKiAoc3RyW2NjXSAtICcwJyk7DQorICAgICAgICBzY2FsZSsrOw0KKyAgICAgICAgY2MrKzsNCisgICAgICAgIGlmIChzY2FsZSA9PSBzaXplb2YgZnJhY3Rpb25fc2NhbGVzIC8gc2l6ZW9mKEZYX0RPVUJMRSkgfHwNCisgICAgICAgICAgICAhWEZBX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGR3RnJhY3Rpb25hbCA9IChGWF9EV09SRCkoZnJhY3Rpb24gKiA0Mjk0OTY3Mjk2LjApOw0KKyAgICB9DQorICAgIGlmIChjYyA8IGxlbiAmJiAoc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScpKSB7DQorICAgICAgY2MrKzsNCisgICAgICBpZiAoY2MgPCBsZW4pIHsNCisgICAgICAgIGlmIChzdHJbY2NdID09ICcrJykgew0KKyAgICAgICAgICBjYysrOw0KKyAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICctJykgew0KKyAgICAgICAgICBiRXhwU2lnbiA9IFRSVUU7DQorICAgICAgICAgIGNjKys7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIHdoaWxlIChjYyA8IGxlbikgew0KKyAgICAgICAgaWYgKHN0cltjY10gPT0gJy4nIHx8ICFYRkFfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIG5FeHBvbmVudCA9IG5FeHBvbmVudCAqIDEwICsgc3RyW2NjXSAtICcwJzsNCisgICAgICAgIGNjKys7DQorICAgICAgfQ0KKyAgICAgIG5FeHBvbmVudCA9IGJFeHBTaWduID8gLW5FeHBvbmVudCA6IG5FeHBvbmVudDsNCisgICAgfQ0KKyAgICBGWF9ET1VCTEUgZFZhbHVlID0gKGR3RnJhY3Rpb25hbCAvIDQyOTQ5NjcyOTYuMCk7DQorICAgIGRWYWx1ZSA9IG5JbnRlZ3JhbCArIChuSW50ZWdyYWwgPj0gMCA/IGRWYWx1ZSA6IC1kVmFsdWUpOw0KKyAgICBpZiAobkV4cG9uZW50ICE9IDApIHsNCisgICAgICBkVmFsdWUgKj0gRlhTWVNfcG93KDEwLCAoRlhfRkxPQVQpbkV4cG9uZW50KTsNCisgICAgfQ0KKyAgICByZXR1cm4gZFZhbHVlOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KK0NGWF9Vbml0aW1lIENYRkFfTG9jYWxlVmFsdWU6OkdldERhdGUoKSBjb25zdCB7DQorICBpZiAobV9iVmFsaWQgJiYgbV9kd1R5cGUgPT0gWEZBX1ZUX0RBVEUpIHsNCisgICAgQ0ZYX1VuaXRpbWUgZHQ7DQorICAgIEZYX0RhdGVGcm9tQ2Fub25pY2FsKG1fd3NWYWx1ZSwgZHQpOw0KKyAgICByZXR1cm4gZHQ7DQorICB9DQorICByZXR1cm4gQ0ZYX1VuaXRpbWUoKTsNCit9DQorQ0ZYX1VuaXRpbWUgQ1hGQV9Mb2NhbGVWYWx1ZTo6R2V0VGltZSgpIGNvbnN0IHsNCisgIGlmIChtX2JWYWxpZCAmJiBtX2R3VHlwZSA9PSBYRkFfVlRfVElNRSkgew0KKyAgICBDRlhfVW5pdGltZSBkdCgwKTsNCisgICAgRlhTWVNfYXNzZXJ0KG1fcExvY2FsZU1ncik7DQorICAgIEZYX1RpbWVGcm9tQ2Fub25pY2FsKG1fd3NWYWx1ZSwgZHQsIG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCkpOw0KKyAgICByZXR1cm4gZHQ7DQorICB9DQorICByZXR1cm4gQ0ZYX1VuaXRpbWUoKTsNCit9DQorQ0ZYX1VuaXRpbWUgQ1hGQV9Mb2NhbGVWYWx1ZTo6R2V0RGF0ZVRpbWUoKSBjb25zdCB7DQorICBpZiAobV9iVmFsaWQgJiYgbV9kd1R5cGUgPT0gWEZBX1ZUX0RBVEVUSU1FKSB7DQorICAgIGludDMyX3QgaW5kZXggPSBtX3dzVmFsdWUuRmluZCgnVCcpOw0KKyAgICBDRlhfVW5pdGltZSBkdDsNCisgICAgRlhfRGF0ZUZyb21DYW5vbmljYWwobV93c1ZhbHVlLkxlZnQoaW5kZXgpLCBkdCk7DQorICAgIEZYU1lTX2Fzc2VydChtX3BMb2NhbGVNZ3IpOw0KKyAgICBGWF9UaW1lRnJvbUNhbm9uaWNhbChtX3dzVmFsdWUuUmlnaHQobV93c1ZhbHVlLkdldExlbmd0aCgpIC0gaW5kZXggLSAxKSwgZHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCkpOw0KKyAgICByZXR1cm4gZHQ7DQorICB9DQorICByZXR1cm4gQ0ZYX1VuaXRpbWUoKTsNCit9DQorRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIG1fZHdUeXBlID0gWEZBX1ZUX1RFWFQ7DQorICBtX3dzVmFsdWUgPSB3c1RleHQ7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSkgew0KKyAgbV9kd1R5cGUgPSBYRkFfVlRfVEVYVDsNCisgIHJldHVybiBtX2JWYWxpZCA9IFBhcnNlUGF0dGVyblZhbHVlKHdzVGV4dCwgd3NGb3JtYXQsIHBMb2NhbGUpOw0KK30NCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlNldE51bShGWF9GTE9BVCBmTnVtKSB7DQorICBtX2R3VHlwZSA9IFhGQV9WVF9GTE9BVDsNCisgIG1fd3NWYWx1ZS5Gb3JtYXQoTCIlLjhnIiwgKEZYX0RPVUJMRSlmTnVtKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlNldE51bShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NOdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUpIHsNCisgIG1fZHdUeXBlID0gWEZBX1ZUX0ZMT0FUOw0KKyAgcmV0dXJuIG1fYlZhbGlkID0gUGFyc2VQYXR0ZXJuVmFsdWUod3NOdW0sIHdzRm9ybWF0LCBwTG9jYWxlKTsNCit9DQorRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpTZXREYXRlKGNvbnN0IENGWF9Vbml0aW1lJiBkKSB7DQorICBtX2R3VHlwZSA9IFhGQV9WVF9EQVRFOw0KKyAgbV93c1ZhbHVlLkZvcm1hdChMIiUwNGQtJTAyZC0lMDJkIiwgZC5HZXRZZWFyKCksIGQuR2V0TW9udGgoKSwgZC5HZXREYXkoKSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpTZXREYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSkgew0KKyAgbV9kd1R5cGUgPSBYRkFfVlRfREFURTsNCisgIHJldHVybiBtX2JWYWxpZCA9IFBhcnNlUGF0dGVyblZhbHVlKHdzRGF0ZSwgd3NGb3JtYXQsIHBMb2NhbGUpOw0KK30NCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlNldFRpbWUoY29uc3QgQ0ZYX1VuaXRpbWUmIHQpIHsNCisgIG1fZHdUeXBlID0gWEZBX1ZUX1RJTUU7DQorICBtX3dzVmFsdWUuRm9ybWF0KEwiJTAyZDolMDJkOiUwMmQiLCB0LkdldEhvdXIoKSwgdC5HZXRNaW51dGUoKSwNCisgICAgICAgICAgICAgICAgICAgdC5HZXRTZWNvbmQoKSk7DQorICBpZiAodC5HZXRNaWxsaXNlY29uZCgpID4gMCkgew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7DQorICAgIHdzVGVtcC5Gb3JtYXQoTCIlOjAzZCIsIHQuR2V0TWlsbGlzZWNvbmQoKSk7DQorICAgIG1fd3NWYWx1ZSArPSB3c1RlbXA7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpTZXRUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSkgew0KKyAgbV9kd1R5cGUgPSBYRkFfVlRfVElNRTsNCisgIHJldHVybiBtX2JWYWxpZCA9IFBhcnNlUGF0dGVyblZhbHVlKHdzVGltZSwgd3NGb3JtYXQsIHBMb2NhbGUpOw0KK30NCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlNldERhdGVUaW1lKGNvbnN0IENGWF9Vbml0aW1lJiBkdCkgew0KKyAgbV9kd1R5cGUgPSBYRkFfVlRfREFURVRJTUU7DQorICBtX3dzVmFsdWUuRm9ybWF0KEwiJTA0ZC0lMDJkLSUwMmRUJTAyZDolMDJkOiUwMmQiLCBkdC5HZXRZZWFyKCksDQorICAgICAgICAgICAgICAgICAgIGR0LkdldE1vbnRoKCksIGR0LkdldERheSgpLCBkdC5HZXRIb3VyKCksIGR0LkdldE1pbnV0ZSgpLA0KKyAgICAgICAgICAgICAgICAgICBkdC5HZXRTZWNvbmQoKSk7DQorICBpZiAoZHQuR2V0TWlsbGlzZWNvbmQoKSA+IDApIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOw0KKyAgICB3c1RlbXAuRm9ybWF0KEwiJTowM2QiLCBkdC5HZXRNaWxsaXNlY29uZCgpKTsNCisgICAgbV93c1ZhbHVlICs9IHdzVGVtcDsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlNldERhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGVUaW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSkgew0KKyAgbV9kd1R5cGUgPSBYRkFfVlRfREFURVRJTUU7DQorICByZXR1cm4gbV9iVmFsaWQgPSBQYXJzZVBhdHRlcm5WYWx1ZSh3c0RhdGVUaW1lLCB3c0Zvcm1hdCwgcExvY2FsZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Mb2NhbGVWYWx1ZTo6Rm9ybWF0UGF0dGVybnMoQ0ZYX1dpZGVTdHJpbmcmIHdzUmVzdWx0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9WQUxVRVBJQ1RVUkUgZVZhbHVlVHlwZSkgY29uc3Qgew0KKyAgd3NSZXN1bHQuRW1wdHkoKTsNCisgIEZYX0JPT0wgYlJldCA9IEZBTFNFOw0KKyAgSUZYX0Zvcm1hdFN0cmluZyogcEZvcm1hdCA9IElGWF9Gb3JtYXRTdHJpbmc6OkNyZWF0ZShtX3BMb2NhbGVNZ3IsIEZBTFNFKTsNCisgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NQYXR0ZXJuczsNCisgIHBGb3JtYXQtPlNwbGl0Rm9ybWF0U3RyaW5nKHdzRm9ybWF0LCB3c1BhdHRlcm5zKTsNCisgIGludDMyX3QgaUNvdW50ID0gd3NQYXR0ZXJucy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBiUmV0ID0gRm9ybWF0U2luZ2xlUGF0dGVybih3c1Jlc3VsdCwgd3NQYXR0ZXJuc1tpXSwgcExvY2FsZSwgZVZhbHVlVHlwZSk7DQorICAgIGlmIChiUmV0KSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHBGb3JtYXQtPlJlbGVhc2UoKTsNCisgIHJldHVybiBiUmV0Ow0KK30NCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OkZvcm1hdFNpbmdsZVBhdHRlcm4oDQorICAgIENGWF9XaWRlU3RyaW5nJiB3c1Jlc3VsdCwNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LA0KKyAgICBJRlhfTG9jYWxlKiBwTG9jYWxlLA0KKyAgICBYRkFfVkFMVUVQSUNUVVJFIGVWYWx1ZVR5cGUpIGNvbnN0IHsNCisgIElGWF9Mb2NhbGUqIGxvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7DQorICBpZiAocExvY2FsZSkgew0KKyAgICBtX3BMb2NhbGVNZ3ItPlNldERlZkxvY2FsZShwTG9jYWxlKTsNCisgIH0NCisgIHdzUmVzdWx0LkVtcHR5KCk7DQorICBGWF9CT09MIGJSZXQgPSBGQUxTRTsNCisgIElGWF9Gb3JtYXRTdHJpbmcqIHBGb3JtYXQgPSBJRlhfRm9ybWF0U3RyaW5nOjpDcmVhdGUobV9wTG9jYWxlTWdyLCBGQUxTRSk7DQorICBGWF9MT0NBTEVDQVRFR09SWSBlQ2F0ZWdvcnkgPSBwRm9ybWF0LT5HZXRDYXRlZ29yeSh3c0Zvcm1hdCk7DQorICBlQ2F0ZWdvcnkgPSBYRkFfVmFsdWdlQ2F0ZWdvcnkoZUNhdGVnb3J5LCBtX2R3VHlwZSk7DQorICBzd2l0Y2ggKGVDYXRlZ29yeSkgew0KKyAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX051bGw6DQorICAgICAgaWYgKG1fd3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIGJSZXQgPSBwRm9ybWF0LT5Gb3JtYXROdWxsKHdzRm9ybWF0LCB3c1Jlc3VsdCk7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX1plcm86DQorICAgICAgaWYgKG1fd3NWYWx1ZSA9PSBGWF9XU1RSQyhMIjAiKSkgew0KKyAgICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdFplcm8od3NGb3JtYXQsIHdzUmVzdWx0KTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfTnVtOg0KKyAgICAgIGJSZXQgPSBwRm9ybWF0LT5Gb3JtYXROdW0obV93c1ZhbHVlLCB3c0Zvcm1hdCwgd3NSZXN1bHQpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX1RleHQ6DQorICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdFRleHQobV93c1ZhbHVlLCB3c0Zvcm1hdCwgd3NSZXN1bHQpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGU6DQorICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdERhdGVUaW1lKG1fd3NWYWx1ZSwgd3NGb3JtYXQsIHdzUmVzdWx0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EQVRFVElNRVRZUEVfRGF0ZSk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfVGltZToNCisgICAgICBiUmV0ID0gcEZvcm1hdC0+Rm9ybWF0RGF0ZVRpbWUobV93c1ZhbHVlLCB3c0Zvcm1hdCwgd3NSZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RBVEVUSU1FVFlQRV9UaW1lKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlVGltZToNCisgICAgICBiUmV0ID0gcEZvcm1hdC0+Rm9ybWF0RGF0ZVRpbWUobV93c1ZhbHVlLCB3c0Zvcm1hdCwgd3NSZXN1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RBVEVUSU1FVFlQRV9EYXRlVGltZSk7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgd3NSZXN1bHQgPSBtX3dzVmFsdWU7DQorICAgICAgYlJldCA9IFRSVUU7DQorICB9DQorICBwRm9ybWF0LT5SZWxlYXNlKCk7DQorICBpZiAoIWJSZXQgJiYgKGVDYXRlZ29yeSAhPSBGWF9MT0NBTEVDQVRFR09SWV9OdW0gfHwNCisgICAgICAgICAgICAgICAgZVZhbHVlVHlwZSAhPSBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpKSB7DQorICAgIHdzUmVzdWx0ID0gbV93c1ZhbHVlOw0KKyAgfQ0KKyAgaWYgKHBMb2NhbGUpIHsNCisgICAgbV9wTG9jYWxlTWdyLT5TZXREZWZMb2NhbGUobG9jYWxlKTsNCisgIH0NCisgIHJldHVybiBiUmV0Ow0KK30NCitzdGF0aWMgRlhfQk9PTCBYRkFfVmFsdWVTcGxpdERhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGVUaW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RpbWUpIHsNCisgIHdzRGF0ZSA9IEwiIjsNCisgIHdzVGltZSA9IEwiIjsNCisgIGlmICh3c0RhdGVUaW1lLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpbnQgblNwbGl0SW5kZXggPSAtMTsNCisgIG5TcGxpdEluZGV4ID0gd3NEYXRlVGltZS5GaW5kKCdUJyk7DQorICBpZiAoblNwbGl0SW5kZXggPCAwKSB7DQorICAgIG5TcGxpdEluZGV4ID0gd3NEYXRlVGltZS5GaW5kKCcgJyk7DQorICB9DQorICBpZiAoblNwbGl0SW5kZXggPCAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHdzRGF0ZSA9IHdzRGF0ZVRpbWUuTGVmdChuU3BsaXRJbmRleCk7DQorICB3c1RpbWUgPSB3c0RhdGVUaW1lLlJpZ2h0KHdzRGF0ZVRpbWUuR2V0TGVuZ3RoKCkgLSBuU3BsaXRJbmRleCAtIDEpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Mb2NhbGVWYWx1ZTo6VmFsaWRhdGVDYW5vbmljYWxWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdWVHlwZSkgew0KKyAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgQ0ZYX1VuaXRpbWUgZHQ7DQorICBzd2l0Y2ggKGR3VlR5cGUpIHsNCisgICAgY2FzZSBYRkFfVlRfREFURTogew0KKyAgICAgIGlmIChWYWxpZGF0ZUNhbm9uaWNhbERhdGUod3NWYWx1ZSwgZHQpKSB7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICB9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlLCB3c1RpbWU7DQorICAgICAgaWYgKFhGQV9WYWx1ZVNwbGl0RGF0ZVRpbWUod3NWYWx1ZSwgd3NEYXRlLCB3c1RpbWUpICYmDQorICAgICAgICAgIFZhbGlkYXRlQ2Fub25pY2FsRGF0ZSh3c0RhdGUsIGR0KSkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBjYXNlIFhGQV9WVF9USU1FOiB7DQorICAgICAgaWYgKFZhbGlkYXRlQ2Fub25pY2FsVGltZSh3c1ZhbHVlKSkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZSwgd3NUaW1lOw0KKyAgICAgIGlmIChYRkFfVmFsdWVTcGxpdERhdGVUaW1lKHdzVmFsdWUsIHdzRGF0ZSwgd3NUaW1lKSAmJg0KKyAgICAgICAgICBWYWxpZGF0ZUNhbm9uaWNhbFRpbWUod3NUaW1lKSkgew0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBjYXNlIFhGQV9WVF9EQVRFVElNRTogew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZSwgd3NUaW1lOw0KKyAgICAgIGlmIChYRkFfVmFsdWVTcGxpdERhdGVUaW1lKHdzVmFsdWUsIHdzRGF0ZSwgd3NUaW1lKSAmJg0KKyAgICAgICAgICBWYWxpZGF0ZUNhbm9uaWNhbERhdGUod3NEYXRlLCBkdCkgJiYgVmFsaWRhdGVDYW5vbmljYWxUaW1lKHdzVGltZSkpIHsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgfSBicmVhazsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlZhbGlkYXRlQ2Fub25pY2FsRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Vbml0aW1lJiB1bkRhdGUpIHsNCisgIGNvbnN0IEZYX1dPUkQgTGFzdERheVsxMl0gPSB7MzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMX07DQorICBjb25zdCBGWF9XT1JEIHdDb3VudFkgPSA0LCB3Q291bnRNID0gMiwgd0NvdW50RCA9IDI7DQorICBpbnQgbkxlbiA9IHdzRGF0ZS5HZXRMZW5ndGgoKTsNCisgIGlmIChuTGVuIDwgd0NvdW50WSB8fCBuTGVuID4gd0NvdW50WSArIHdDb3VudE0gKyB3Q291bnREICsgMikgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWF9CT09MIGJTeW1ib2wgPSAod3NEYXRlLkZpbmQoMHgyRCkgPT0gLTEpID8gRkFMU0UgOiBUUlVFOw0KKyAgRlhfV09SRCB3WWVhciA9IDAsIHdNb250aCA9IDAsIHdEYXkgPSAwOw0KKyAgY29uc3QgRlhfV0NIQVIqIHBEYXRlID0gKGNvbnN0IEZYX1dDSEFSKil3c0RhdGU7DQorICBpbnQgbkluZGV4ID0gMCwgblN0YXJ0ID0gMDsNCisgIHdoaWxlIChwRGF0ZVtuSW5kZXhdICE9ICdcMCcgJiYgbkluZGV4IDwgd0NvdW50WSkgew0KKyAgICBpZiAoIVhGQV9Jc0RpZ2l0KHBEYXRlW25JbmRleF0pKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIHdZZWFyID0gKHBEYXRlW25JbmRleF0gLSAnMCcpICsgd1llYXIgKiAxMDsNCisgICAgbkluZGV4Kys7DQorICB9DQorICBpZiAoYlN5bWJvbCkgew0KKyAgICBpZiAocERhdGVbbkluZGV4XSAhPSAweDJEKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIG5JbmRleCsrOw0KKyAgfQ0KKyAgblN0YXJ0ID0gbkluZGV4Ow0KKyAgd2hpbGUgKHBEYXRlW25JbmRleF0gIT0gJ1wwJyAmJiBuSW5kZXggLSBuU3RhcnQgPCB3Q291bnRNICYmIG5JbmRleCA8IG5MZW4pIHsNCisgICAgaWYgKCFYRkFfSXNEaWdpdChwRGF0ZVtuSW5kZXhdKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB3TW9udGggPSAocERhdGVbbkluZGV4XSAtICcwJykgKyB3TW9udGggKiAxMDsNCisgICAgbkluZGV4Kys7DQorICB9DQorICBpZiAoYlN5bWJvbCkgew0KKyAgICBpZiAocERhdGVbbkluZGV4XSAhPSAweDJEKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIG5JbmRleCsrOw0KKyAgfQ0KKyAgblN0YXJ0ID0gbkluZGV4Ow0KKyAgd2hpbGUgKHBEYXRlW25JbmRleF0gIT0gJ1wwJyAmJiBuSW5kZXggLSBuU3RhcnQgPCB3Q291bnREICYmIG5JbmRleCA8IG5MZW4pIHsNCisgICAgaWYgKCFYRkFfSXNEaWdpdChwRGF0ZVtuSW5kZXhdKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB3RGF5ID0gKHBEYXRlW25JbmRleF0gLSAnMCcpICsgd0RheSAqIDEwOw0KKyAgICBuSW5kZXgrKzsNCisgIH0NCisgIGlmIChuSW5kZXggIT0gbkxlbikgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAod1llYXIgPCAxOTAwIHx8IHdZZWFyID4gMjAyOSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAod01vbnRoIDwgMSB8fCB3TW9udGggPiAxMikgew0KKyAgICBpZiAod01vbnRoID09IDAgJiYgbkxlbiA9PSB3Q291bnRZKSB7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHdEYXkgPCAxKSB7DQorICAgIGlmICh3RGF5ID09IDAgJiYgKG5MZW4gPT0gd0NvdW50WSArIHdDb3VudE0pKSB7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHdNb250aCA9PSAyKSB7DQorICAgIGlmICh3WWVhciAlIDQwMCA9PSAwIHx8ICh3WWVhciAlIDEwMCAhPSAwICYmIHdZZWFyICUgNCA9PSAwKSkgew0KKyAgICAgIGlmICh3RGF5ID4gMjkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKHdEYXkgPiAyOCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIGlmICh3RGF5ID4gTGFzdERheVt3TW9udGggLSAxXSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfVW5pdGltZSB1dDsNCisgIHV0LlNldCh3WWVhciwgc3RhdGljX2Nhc3Q8dWludDhfdD4od01vbnRoKSwgc3RhdGljX2Nhc3Q8dWludDhfdD4od0RheSkpOw0KKyAgdW5EYXRlID0gdW5EYXRlICsgdXQ7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0xvY2FsZVZhbHVlOjpWYWxpZGF0ZUNhbm9uaWNhbFRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGltZSkgew0KKyAgaW50IG5MZW4gPSB3c1RpbWUuR2V0TGVuZ3RoKCk7DQorICBpZiAobkxlbiA8IDIpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgY29uc3QgRlhfV09SRCB3Q291bnRIID0gMiwgd0NvdW50TSA9IDIsIHdDb3VudFMgPSAyLCB3Q291bnRGID0gMzsNCisgIEZYX0JPT0wgYlN5bWJvbCA9ICh3c1RpbWUuRmluZCgnOicpID09IC0xKSA/IEZBTFNFIDogVFJVRTsNCisgIEZYX1dPUkQgd0hvdXIgPSAwLCB3TWludXRlID0gMCwgd1NlY29uZCA9IDAsIHdGcmFjdGlvbiA9IDA7DQorICBjb25zdCBGWF9XQ0hBUiogcFRpbWUgPSAoY29uc3QgRlhfV0NIQVIqKXdzVGltZTsNCisgIGludCBuSW5kZXggPSAwLCBuU3RhcnQgPSAwOw0KKyAgd2hpbGUgKHBUaW1lW25JbmRleF0gIT0gJ1wwJyAmJiBuSW5kZXggLSBuU3RhcnQgPCB3Q291bnRIKSB7DQorICAgIGlmICghWEZBX0lzRGlnaXQocFRpbWVbbkluZGV4XSkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgd0hvdXIgPSAocFRpbWVbbkluZGV4XSAtICcwJykgKyB3SG91ciAqIDEwOw0KKyAgICBuSW5kZXgrKzsNCisgIH0NCisgIGlmIChiU3ltYm9sKSB7DQorICAgIGlmIChuSW5kZXggPCBuTGVuICYmIHBUaW1lW25JbmRleF0gIT0gJzonKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIG5JbmRleCsrOw0KKyAgfQ0KKyAgblN0YXJ0ID0gbkluZGV4Ow0KKyAgd2hpbGUgKHBUaW1lW25JbmRleF0gIT0gJ1wwJyAmJiBuSW5kZXggLSBuU3RhcnQgPCB3Q291bnRNICYmIG5JbmRleCA8IG5MZW4pIHsNCisgICAgaWYgKCFYRkFfSXNEaWdpdChwVGltZVtuSW5kZXhdKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB3TWludXRlID0gKHBUaW1lW25JbmRleF0gLSAnMCcpICsgd01pbnV0ZSAqIDEwOw0KKyAgICBuSW5kZXgrKzsNCisgIH0NCisgIGlmIChiU3ltYm9sKSB7DQorICAgIGlmIChuSW5kZXggPCBuTGVuICYmIHBUaW1lW25JbmRleF0gIT0gJzonKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIG5JbmRleCsrOw0KKyAgfQ0KKyAgblN0YXJ0ID0gbkluZGV4Ow0KKyAgd2hpbGUgKHBUaW1lW25JbmRleF0gIT0gJ1wwJyAmJiBuSW5kZXggLSBuU3RhcnQgPCB3Q291bnRTICYmIG5JbmRleCA8IG5MZW4pIHsNCisgICAgaWYgKCFYRkFfSXNEaWdpdChwVGltZVtuSW5kZXhdKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICB3U2Vjb25kID0gKHBUaW1lW25JbmRleF0gLSAnMCcpICsgd1NlY29uZCAqIDEwOw0KKyAgICBuSW5kZXgrKzsNCisgIH0NCisgIGlmICh3c1RpbWUuRmluZCgnLicpID4gMCkgew0KKyAgICBpZiAocFRpbWVbbkluZGV4XSAhPSAnLicpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgbkluZGV4Kys7DQorICAgIG5TdGFydCA9IG5JbmRleDsNCisgICAgd2hpbGUgKHBUaW1lW25JbmRleF0gIT0gJ1wwJyAmJiBuSW5kZXggLSBuU3RhcnQgPCB3Q291bnRGICYmDQorICAgICAgICAgICBuSW5kZXggPCBuTGVuKSB7DQorICAgICAgaWYgKCFYRkFfSXNEaWdpdChwVGltZVtuSW5kZXhdKSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICB3RnJhY3Rpb24gPSAocFRpbWVbbkluZGV4XSAtICcwJykgKyB3RnJhY3Rpb24gKiAxMDsNCisgICAgICBuSW5kZXgrKzsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKG5JbmRleCA8IG5MZW4pIHsNCisgICAgaWYgKHBUaW1lW25JbmRleF0gPT0gJ1onKSB7DQorICAgICAgbkluZGV4Kys7DQorICAgIH0gZWxzZSBpZiAocFRpbWVbbkluZGV4XSA9PSAnLScgfHwgcFRpbWVbbkluZGV4XSA9PSAnKycpIHsNCisgICAgICBpbnQxNl90IG5PZmZzZXRIID0gMCwgbk9mZnNldE0gPSAwOw0KKyAgICAgIG5JbmRleCsrOw0KKyAgICAgIG5TdGFydCA9IG5JbmRleDsNCisgICAgICB3aGlsZSAocFRpbWVbbkluZGV4XSAhPSAnXDAnICYmIG5JbmRleCAtIG5TdGFydCA8IHdDb3VudEggJiYNCisgICAgICAgICAgICAgbkluZGV4IDwgbkxlbikgew0KKyAgICAgICAgaWYgKCFYRkFfSXNEaWdpdChwVGltZVtuSW5kZXhdKSkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBuT2Zmc2V0SCA9IChwVGltZVtuSW5kZXhdIC0gJzAnKSArIG5PZmZzZXRIICogMTA7DQorICAgICAgICBuSW5kZXgrKzsNCisgICAgICB9DQorICAgICAgaWYgKGJTeW1ib2wpIHsNCisgICAgICAgIGlmIChuSW5kZXggPCBuTGVuICYmIHBUaW1lW25JbmRleF0gIT0gJzonKSB7DQorICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIG5JbmRleCsrOw0KKyAgICAgIH0NCisgICAgICBuU3RhcnQgPSBuSW5kZXg7DQorICAgICAgd2hpbGUgKHBUaW1lW25JbmRleF0gIT0gJ1wwJyAmJiBuSW5kZXggLSBuU3RhcnQgPCB3Q291bnRNICYmDQorICAgICAgICAgICAgIG5JbmRleCA8IG5MZW4pIHsNCisgICAgICAgIGlmICghWEZBX0lzRGlnaXQocFRpbWVbbkluZGV4XSkpIHsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbk9mZnNldE0gPSAocFRpbWVbbkluZGV4XSAtICcwJykgKyBuT2Zmc2V0TSAqIDEwOw0KKyAgICAgICAgbkluZGV4Kys7DQorICAgICAgfQ0KKyAgICAgIGlmIChuT2Zmc2V0SCA+IDEyKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIGlmIChuT2Zmc2V0TSA+PSA2MCkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKG5JbmRleCAhPSBuTGVuKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICh3SG91ciA+PSAyNCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAod01pbnV0ZSA+PSA2MCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAod1NlY29uZCA+PSA2MCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAod0ZyYWN0aW9uID4gOTk5KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlZhbGlkYXRlQ2Fub25pY2FsRGF0ZVRpbWUoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGVUaW1lKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c0RhdGUsIHdzVGltZTsNCisgIGlmICh3c0RhdGVUaW1lLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpbnQgblNwbGl0SW5kZXggPSAtMTsNCisgIG5TcGxpdEluZGV4ID0gd3NEYXRlVGltZS5GaW5kKCdUJyk7DQorICBpZiAoblNwbGl0SW5kZXggPCAwKSB7DQorICAgIG5TcGxpdEluZGV4ID0gd3NEYXRlVGltZS5GaW5kKCcgJyk7DQorICB9DQorICBpZiAoblNwbGl0SW5kZXggPCAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHdzRGF0ZSA9IHdzRGF0ZVRpbWUuTGVmdChuU3BsaXRJbmRleCk7DQorICB3c1RpbWUgPSB3c0RhdGVUaW1lLlJpZ2h0KHdzRGF0ZVRpbWUuR2V0TGVuZ3RoKCkgLSBuU3BsaXRJbmRleCAtIDEpOw0KKyAgQ0ZYX1VuaXRpbWUgZHQ7DQorICByZXR1cm4gVmFsaWRhdGVDYW5vbmljYWxEYXRlKHdzRGF0ZSwgZHQpICYmIFZhbGlkYXRlQ2Fub25pY2FsVGltZSh3c1RpbWUpOw0KK30NCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlBhcnNlUGF0dGVyblZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUpIHsNCisgIElGWF9Mb2NhbGUqIGxvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7DQorICBpZiAocExvY2FsZSkgew0KKyAgICBtX3BMb2NhbGVNZ3ItPlNldERlZkxvY2FsZShwTG9jYWxlKTsNCisgIH0NCisgIElGWF9Gb3JtYXRTdHJpbmcqIHBGb3JtYXQgPSBJRlhfRm9ybWF0U3RyaW5nOjpDcmVhdGUobV9wTG9jYWxlTWdyLCBGQUxTRSk7DQorICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzUGF0dGVybnM7DQorICBwRm9ybWF0LT5TcGxpdEZvcm1hdFN0cmluZyh3c1BhdHRlcm4sIHdzUGF0dGVybnMpOw0KKyAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7DQorICBpbnQzMl90IGlDb3VudCA9IHdzUGF0dGVybnMuR2V0U2l6ZSgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50ICYmICFiUmV0OyBpKyspIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXQgPSB3c1BhdHRlcm5zW2ldOw0KKyAgICBGWF9MT0NBTEVDQVRFR09SWSBlQ2F0ZWdvcnkgPSBwRm9ybWF0LT5HZXRDYXRlZ29yeSh3c0Zvcm1hdCk7DQorICAgIGVDYXRlZ29yeSA9IFhGQV9WYWx1Z2VDYXRlZ29yeShlQ2F0ZWdvcnksIG1fZHdUeXBlKTsNCisgICAgc3dpdGNoIChlQ2F0ZWdvcnkpIHsNCisgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX051bGw6DQorICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VOdWxsKHdzVmFsdWUsIHdzRm9ybWF0KTsNCisgICAgICAgIGlmIChiUmV0KSB7DQorICAgICAgICAgIG1fd3NWYWx1ZS5FbXB0eSgpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9aZXJvOg0KKyAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlWmVybyh3c1ZhbHVlLCB3c0Zvcm1hdCk7DQorICAgICAgICBpZiAoYlJldCkgew0KKyAgICAgICAgICBtX3dzVmFsdWUgPSBGWF9XU1RSQyhMIjAiKTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfTnVtOiB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyBmTnVtOw0KKyAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlTnVtKHdzVmFsdWUsIHdzRm9ybWF0LCBmTnVtKTsNCisgICAgICAgIGlmIChiUmV0KSB7DQorICAgICAgICAgIG1fd3NWYWx1ZSA9IGZOdW07DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9UZXh0Og0KKyAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlVGV4dCh3c1ZhbHVlLCB3c0Zvcm1hdCwgbV93c1ZhbHVlKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZTogew0KKyAgICAgICAgQ0ZYX1VuaXRpbWUgZHQ7DQorICAgICAgICBiUmV0ID0gVmFsaWRhdGVDYW5vbmljYWxEYXRlKHdzVmFsdWUsIGR0KTsNCisgICAgICAgIGlmICghYlJldCkgew0KKyAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VEYXRlVGltZSh3c1ZhbHVlLCB3c0Zvcm1hdCwgRlhfREFURVRJTUVUWVBFX0RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0KTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChiUmV0KSB7DQorICAgICAgICAgIFNldERhdGUoZHQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfVGltZTogew0KKyAgICAgICAgQ0ZYX1VuaXRpbWUgZHQ7DQorICAgICAgICBiUmV0ID0NCisgICAgICAgICAgICBwRm9ybWF0LT5QYXJzZURhdGVUaW1lKHdzVmFsdWUsIHdzRm9ybWF0LCBGWF9EQVRFVElNRVRZUEVfVGltZSwgZHQpOw0KKyAgICAgICAgaWYgKGJSZXQpIHsNCisgICAgICAgICAgU2V0VGltZShkdCk7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlVGltZTogew0KKyAgICAgICAgQ0ZYX1VuaXRpbWUgZHQ7DQorICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VEYXRlVGltZSh3c1ZhbHVlLCB3c0Zvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RBVEVUSU1FVFlQRV9EYXRlVGltZSwgZHQpOw0KKyAgICAgICAgaWYgKGJSZXQpIHsNCisgICAgICAgICAgU2V0RGF0ZVRpbWUoZHQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBtX3dzVmFsdWUgPSB3c1ZhbHVlOw0KKyAgICAgICAgYlJldCA9IFRSVUU7DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKCFiUmV0KSB7DQorICAgIG1fd3NWYWx1ZSA9IHdzVmFsdWU7DQorICB9DQorICBwRm9ybWF0LT5SZWxlYXNlKCk7DQorICBpZiAocExvY2FsZSkgew0KKyAgICBtX3BMb2NhbGVNZ3ItPlNldERlZkxvY2FsZShsb2NhbGUpOw0KKyAgfQ0KKyAgcmV0dXJuIGJSZXQ7DQorfQ0KK3ZvaWQgQ1hGQV9Mb2NhbGVWYWx1ZTo6R2V0TnVtYmVyaWNGb3JtYXQoQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW50TGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRGVjTGVuLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2lnbikgew0KKyAgRlhTWVNfYXNzZXJ0KHdzRm9ybWF0LklzRW1wdHkoKSk7DQorICBGWFNZU19hc3NlcnQobkludExlbiA+PSAtMSAmJiBuRGVjTGVuID49IC0xKTsNCisgIGludDMyX3QgblRvdGFsTGVuID0gKG5JbnRMZW4gPj0gMCA/IG5JbnRMZW4gOiAyKSArIChiU2lnbiA/IDEgOiAwKSArDQorICAgICAgICAgICAgICAgICAgICAgIChuRGVjTGVuID49IDAgPyBuRGVjTGVuIDogMikgKyAobkRlY0xlbiA9PSAwID8gMCA6IDEpOw0KKyAgRlhfV0NIQVIqIGxwQnVmID0gd3NGb3JtYXQuR2V0QnVmZmVyKG5Ub3RhbExlbik7DQorICBpbnQzMl90IG5Qb3MgPSAwOw0KKyAgaWYgKGJTaWduKSB7DQorICAgIGxwQnVmW25Qb3MrK10gPSBMJ3MnOw0KKyAgfQ0KKyAgaWYgKG5JbnRMZW4gPT0gLTEpIHsNCisgICAgbHBCdWZbblBvcysrXSA9IEwneic7DQorICAgIGxwQnVmW25Qb3MrK10gPSBMJyonOw0KKyAgfSBlbHNlIHsNCisgICAgd2hpbGUgKG5JbnRMZW4pIHsNCisgICAgICBscEJ1ZltuUG9zKytdID0gTCd6JzsNCisgICAgICBuSW50TGVuLS07DQorICAgIH0NCisgIH0NCisgIGlmIChuRGVjTGVuICE9IDApIHsNCisgICAgbHBCdWZbblBvcysrXSA9IEwnLic7DQorICB9DQorICBpZiAobkRlY0xlbiA9PSAtMSkgew0KKyAgICBscEJ1ZltuUG9zKytdID0gTCd6JzsNCisgICAgbHBCdWZbblBvcysrXSA9IEwnKic7DQorICB9IGVsc2Ugew0KKyAgICB3aGlsZSAobkRlY0xlbikgew0KKyAgICAgIGxwQnVmW25Qb3MrK10gPSBMJ3onOw0KKyAgICAgIG5EZWNMZW4tLTsNCisgICAgfQ0KKyAgfQ0KKyAgd3NGb3JtYXQuUmVsZWFzZUJ1ZmZlcihuVG90YWxMZW4pOw0KK30NCitGWF9CT09MIENYRkFfTG9jYWxlVmFsdWU6OlZhbGlkYXRlTnVtZXJpY1RlbXAoQ0ZYX1dpZGVTdHJpbmcmIHdzTnVtZXJpYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBwb3MpIHsNCisgIGlmICh3c0Zvcm1hdC5Jc0VtcHR5KCkgfHwgd3NOdW1lcmljLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIGNvbnN0IEZYX1dDSEFSKiBwTnVtID0gd3NOdW1lcmljLmNfc3RyKCk7DQorICBjb25zdCBGWF9XQ0hBUiogcEZtdCA9IHdzRm9ybWF0LmNfc3RyKCk7DQorICBpbnQzMl90IG4gPSAwLCBuZiA9IDA7DQorICBGWF9XQ0hBUiBjID0gcE51bVtuXTsNCisgIEZYX1dDSEFSIGNmID0gcEZtdFtuZl07DQorICBpZiAoY2YgPT0gTCdzJykgew0KKyAgICBpZiAoYyA9PSBMJy0nIHx8IGMgPT0gTCcrJykgew0KKyAgICAgICsrbjsNCisgICAgfQ0KKyAgICArK25mOw0KKyAgfQ0KKyAgRlhfQk9PTCBiTGltaXQgPSBUUlVFOw0KKyAgaW50MzJfdCBuQ291bnQgPSB3c051bWVyaWMuR2V0TGVuZ3RoKCk7DQorICBpbnQzMl90IG5Db3VudEZtdCA9IHdzRm9ybWF0LkdldExlbmd0aCgpOw0KKyAgd2hpbGUgKG4gPCBuQ291bnQgJiYgKGJMaW1pdCA/IG5mIDwgbkNvdW50Rm10IDogVFJVRSkgJiYNCisgICAgICAgICBYRkFfSXNEaWdpdChjID0gcE51bVtuXSkpIHsNCisgICAgaWYgKGJMaW1pdCA9PSBUUlVFKSB7DQorICAgICAgaWYgKChjZiA9IHBGbXRbbmZdKSA9PSBMJyonKSB7DQorICAgICAgICBiTGltaXQgPSBGQUxTRTsNCisgICAgICB9IGVsc2UgaWYgKGNmID09IEwneicpIHsNCisgICAgICAgIG5mKys7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgIH0NCisgICAgbisrOw0KKyAgfQ0KKyAgaWYgKG4gPT0gbkNvdW50KSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaWYgKG5mID09IG5Db3VudEZtdCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB3aGlsZSAobmYgPCBuQ291bnRGbXQgJiYgKGNmID0gcEZtdFtuZl0pICE9IEwnLicpIHsNCisgICAgRlhTWVNfYXNzZXJ0KGNmID09IEwneicgfHwgY2YgPT0gTCcqJyk7DQorICAgICsrbmY7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0RlY2ltYWxTeW1ib2w7DQorICBpZiAocExvY2FsZSkgew0KKyAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfRGVjaW1hbCwgd3NEZWNpbWFsU3ltYm9sKTsNCisgIH0gZWxzZSB7DQorICAgIHdzRGVjaW1hbFN5bWJvbCA9IENGWF9XaWRlU3RyaW5nKEwnLicpOw0KKyAgfQ0KKyAgaWYgKHBGbXRbbmZdICE9IEwnLicpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKHdzRGVjaW1hbFN5bWJvbCAhPSBDRlhfV2lkZVN0cmluZ0MoYykgJiYgYyAhPSBMJy4nKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgICsrbmY7DQorICArK247DQorICBiTGltaXQgPSBUUlVFOw0KKyAgd2hpbGUgKG4gPCBuQ291bnQgJiYgKGJMaW1pdCA/IG5mIDwgbkNvdW50Rm10IDogVFJVRSkgJiYNCisgICAgICAgICBYRkFfSXNEaWdpdChjID0gcE51bVtuXSkpIHsNCisgICAgaWYgKGJMaW1pdCA9PSBUUlVFKSB7DQorICAgICAgaWYgKChjZiA9IHBGbXRbbmZdKSA9PSBMJyonKSB7DQorICAgICAgICBiTGltaXQgPSBGQUxTRTsNCisgICAgICB9IGVsc2UgaWYgKGNmID09IEwneicpIHsNCisgICAgICAgIG5mKys7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgIH0NCisgICAgbisrOw0KKyAgfQ0KKyAgcmV0dXJuIG4gPT0gbkNvdW50Ow0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfb2JqZWN0X2ltcC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfb2JqZWN0X2ltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUyYmVkOQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9vYmplY3RfaW1wLmNwcApAQCAtMCwwICsxLDU0NjMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3V0aWxzLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9vYmplY3QuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY3VtZW50LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9wYXJzZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3NjcmlwdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jZGF0YS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jbGF5b3V0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9sb2NhbGVtZ3IuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2ZtMmpzYXBpLmgiDQorI2luY2x1ZGUgInhmYV9iYXNpY19pbXAuaCINCisjaW5jbHVkZSAieGZhX2RvY3VtZW50X2xheW91dF9pbXAuaCINCitDWEZBX09iamVjdDo6Q1hGQV9PYmplY3QoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LCBGWF9EV09SRCB1RmxhZ3MpDQorICAgIDogbV9wRG9jdW1lbnQocERvY3VtZW50KSwgbV91RmxhZ3ModUZsYWdzKSB7fQ0KK3ZvaWQgQ1hGQV9PYmplY3Q6OkdldENsYXNzTmFtZShDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSkgY29uc3Qgew0KKyAgWEZBX0xQQ0VMRU1FTlRJTkZPIHBFbGVtZW50ID0gWEZBX0dldEVsZW1lbnRCeUlEKEdldENsYXNzSUQoKSk7DQorICBBU1NFUlQocEVsZW1lbnQgIT0gTlVMTCk7DQorICB3c05hbWUgPSBwRWxlbWVudC0+cE5hbWU7DQorfQ0KK3VpbnQzMl90IENYRkFfT2JqZWN0OjpHZXRDbGFzc0hhc2hDb2RlKCkgY29uc3Qgew0KKyAgWEZBX0xQQ0VMRU1FTlRJTkZPIHBFbGVtZW50ID0gWEZBX0dldEVsZW1lbnRCeUlEKEdldENsYXNzSUQoKSk7DQorICBBU1NFUlQocEVsZW1lbnQgIT0gTlVMTCk7DQorICByZXR1cm4gcEVsZW1lbnQtPnVIYXNoOw0KK30NCitYRkFfRUxFTUVOVCBDWEZBX09iamVjdDo6R2V0Q2xhc3NJRCgpIGNvbnN0IHsNCisgIGlmIChJc05vZGUoKSkgew0KKyAgICByZXR1cm4gKChjb25zdCBDWEZBX05vZGUqKXRoaXMpLT5HZXRDbGFzc0lEKCk7DQorICB9IGVsc2UgaWYgKElzT3JkaW5hcnlPYmplY3QoKSkgew0KKyAgICByZXR1cm4gKChjb25zdCBDWEZBX09yZGluYXJ5T2JqZWN0Kil0aGlzKS0+R2V0Q2xhc3NJRCgpOw0KKyAgfSBlbHNlIGlmIChJc05vZGVMaXN0KCkpIHsNCisgICAgcmV0dXJuICgoY29uc3QgQ1hGQV9Ob2RlTGlzdCopdGhpcyktPkdldENsYXNzSUQoKTsNCisgIH0gZWxzZSBpZiAoSXNPcmRpbmFyeUxpc3QoKSkgew0KKyAgICByZXR1cm4gWEZBX0VMRU1FTlRfTGlzdDsNCisgIH0NCisgIEFTU0VSVChGQUxTRSk7DQorICByZXR1cm4gKFhGQV9FTEVNRU5UKTA7DQorfQ0KK3ZvaWQgQ1hGQV9PYmplY3Q6OlNjcmlwdF9PYmplY3RDbGFzc19DbGFzc05hbWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmICghYlNldHRpbmcpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIGNsYXNzTmFtZTsNCisgICAgR2V0Q2xhc3NOYW1lKGNsYXNzTmFtZSk7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoDQorICAgICAgICBoVmFsdWUsIEZYX1VURjhFbmNvZGUoY2xhc3NOYW1lLkdldFB0cigpLCBjbGFzc05hbWUuR2V0TGVuZ3RoKCkpKTsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9PYmplY3Q6OlRocm93U2NyaXB0RXJyb3JNZXNzYWdlKGludDMyX3QgaVN0cmluZ0lELCAuLi4pIHsNCisgIElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciA9IG1fcERvY3VtZW50LT5HZXROb3RpZnkoKS0+R2V0QXBwUHJvdmlkZXIoKTsNCisgIEZYU1lTX2Fzc2VydChwQXBwUHJvdmlkZXIpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXQ7DQorICBwQXBwUHJvdmlkZXItPkxvYWRTdHJpbmcoaVN0cmluZ0lELCB3c0Zvcm1hdCk7DQorICBDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2U7DQorICB2YV9saXN0IGFyZ19wdHI7DQorICB2YV9zdGFydChhcmdfcHRyLCBpU3RyaW5nSUQpOw0KKyAgd3NNZXNzYWdlLkZvcm1hdFYoKGNvbnN0IEZYX1dDSEFSKil3c0Zvcm1hdCwgYXJnX3B0cik7DQorICB2YV9lbmQoYXJnX3B0cik7DQorICBGWEpTRV9UaHJvd01lc3NhZ2UoIiIsIEZYX1VURjhFbmNvZGUod3NNZXNzYWdlLCB3c01lc3NhZ2UuR2V0TGVuZ3RoKCkpKTsNCit9DQorc3RhdGljIHZvaWQgWEZBX0RlbGV0ZVdpZGVTdHJpbmcodm9pZCogcERhdGEpIHsNCisgIGlmIChwRGF0YSkgew0KKyAgICBkZWxldGUgKENGWF9XaWRlU3RyaW5nKilwRGF0YTsNCisgIH0NCit9DQorc3RhdGljIHZvaWQgWEZBX0NvcHlXaWRlU3RyaW5nKHZvaWQqJiBwRGF0YSkgew0KKyAgaWYgKHBEYXRhKSB7DQorICAgIENGWF9XaWRlU3RyaW5nKiBwTmV3RGF0YSA9IG5ldyBDRlhfV2lkZVN0cmluZygqKENGWF9XaWRlU3RyaW5nKilwRGF0YSk7DQorICAgIHBEYXRhID0gcE5ld0RhdGE7DQorICB9DQorfQ0KK3N0YXRpYyBYRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPIGRlbGV0ZVdpZGVTdHJpbmdDYWxsQmFjayA9IHsNCisgICAgWEZBX0RlbGV0ZVdpZGVTdHJpbmcsIFhGQV9Db3B5V2lkZVN0cmluZ307DQorc3RhdGljIFhGQV9PQkpFQ1RUWVBFIFhGQV9HZXRFbGVtZW50T2JqZWN0VHlwZShYRkFfRUxFTUVOVCBlRWxlbWVudCkgew0KKyAgWEZBX0xQQ0VMRU1FTlRJTkZPIHBFbGVtZW50ID0gWEZBX0dldEVsZW1lbnRCeUlEKGVFbGVtZW50KTsNCisgIEFTU0VSVChwRWxlbWVudCAhPSBOVUxMKTsNCisgIHJldHVybiAoWEZBX09CSkVDVFRZUEUpcEVsZW1lbnQtPmVPYmplY3RUeXBlOw0KK30NCitDWEZBX05vZGU6OkNYRkFfTm9kZShDWEZBX0RvY3VtZW50KiBwRG9jLCBGWF9XT1JEIGVQYWNrZXQsIFhGQV9FTEVNRU5UIGVFbGVtZW50KQ0KKyAgICA6IENYRkFfT2JqZWN0KHBEb2MsIFhGQV9HZXRFbGVtZW50T2JqZWN0VHlwZShlRWxlbWVudCkpLA0KKyAgICAgIG1fcE5leHQobnVsbHB0ciksDQorICAgICAgbV9wQ2hpbGQobnVsbHB0ciksDQorICAgICAgbV9wTGFzdENoaWxkKG51bGxwdHIpLA0KKyAgICAgIG1fcFBhcmVudChudWxscHRyKSwNCisgICAgICBtX3BYTUxOb2RlKG51bGxwdHIpLA0KKyAgICAgIG1fZU5vZGVDbGFzcyhlRWxlbWVudCksDQorICAgICAgbV9lUGFja2V0KGVQYWNrZXQpLA0KKyAgICAgIG1fZHdOYW1lSGFzaCgwKSwNCisgICAgICBtX3BBdXhOb2RlKG51bGxwdHIpLA0KKyAgICAgIG1fcE1hcE1vZHVsZURhdGEobnVsbHB0cikgew0KKyAgQVNTRVJUKG1fcERvY3VtZW50KTsNCit9DQorQ1hGQV9Ob2RlOjp+Q1hGQV9Ob2RlKCkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fcFBhcmVudCA9PSBOVUxMKTsNCisgIFJlbW92ZU1hcE1vZHVsZUtleSgpOw0KKyAgQ1hGQV9Ob2RlICpwTmV4dCwgKnBOb2RlID0gbV9wQ2hpbGQ7DQorICB3aGlsZSAocE5vZGUpIHsNCisgICAgcE5leHQgPSBwTm9kZS0+bV9wTmV4dDsNCisgICAgcE5vZGUtPm1fcFBhcmVudCA9IE5VTEw7DQorICAgIGRlbGV0ZSBwTm9kZTsNCisgICAgcE5vZGUgPSBwTmV4dDsNCisgIH0NCisgIGlmIChtX3BYTUxOb2RlICYmIEhhc0ZsYWcoWEZBX05PREVGTEFHX093blhNTE5vZGUpKSB7DQorICAgIG1fcFhNTE5vZGUtPlJlbGVhc2UoKTsNCisgIH0NCit9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkNsb25lKEZYX0JPT0wgYlJlY3Vyc2l2ZSkgew0KKyAgSVhGQV9PYmpGYWN0b3J5KiBwRmFjdG9yeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0RmFjdG9yeSgpOw0KKyAgQ1hGQV9Ob2RlKiBwQ2xvbmUgPSBwRmFjdG9yeS0+Q3JlYXRlTm9kZShtX2VQYWNrZXQsIG1fZU5vZGVDbGFzcyk7DQorICBpZiAoIXBDbG9uZSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIE1lcmdlQWxsRGF0YShwQ2xvbmUpOw0KKyAgcENsb25lLT5VcGRhdGVOYW1lSGFzaCgpOw0KKyAgaWYgKElzTmVlZFNhdmluZ1hNTE5vZGUoKSkgew0KKyAgICBJRkRFX1hNTE5vZGUqIHBDbG9uZVhNTCA9IE5VTEw7DQorICAgIGlmIChJc0F0dHJpYnV0ZUluWE1MKCkpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c05hbWU7DQorICAgICAgdGhpcy0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOYW1lLCBGQUxTRSk7DQorICAgICAgSUZERV9YTUxFbGVtZW50KiBwQ2xvbmVYTUxFbGVtZW50ID0gSUZERV9YTUxFbGVtZW50OjpDcmVhdGUod3NOYW1lKTsNCisgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NWYWx1ZSA9IHRoaXMtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUpOw0KKyAgICAgIGlmICghd3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIHBDbG9uZVhNTEVsZW1lbnQtPlNldFRleHREYXRhKHdzVmFsdWUpOw0KKyAgICAgIH0NCisgICAgICBwQ2xvbmVYTUwgPSBwQ2xvbmVYTUxFbGVtZW50Ow0KKyAgICAgIHBDbG9uZVhNTEVsZW1lbnQgPSBOVUxMOw0KKyAgICAgIHBDbG9uZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0NvbnRhaW5zLCBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBwQ2xvbmVYTUwgPSBtX3BYTUxOb2RlLT5DbG9uZShGQUxTRSk7DQorICAgIH0NCisgICAgcENsb25lLT5TZXRYTUxNYXBwaW5nTm9kZShwQ2xvbmVYTUwpOw0KKyAgICBwQ2xvbmUtPlNldEZsYWcoWEZBX05PREVGTEFHX093blhNTE5vZGUsIFRSVUUsIEZBTFNFKTsNCisgIH0NCisgIGlmIChiUmVjdXJzaXZlKSB7DQorICAgIGZvciAoQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBDaGlsZDsNCisgICAgICAgICBwQ2hpbGQgPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICBwQ2xvbmUtPkluc2VydENoaWxkKHBDaGlsZC0+Q2xvbmUoYlJlY3Vyc2l2ZSkpOw0KKyAgICB9DQorICB9DQorICBwQ2xvbmUtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCisgIHBDbG9uZS0+U2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsIE5VTEwpOw0KKyAgcmV0dXJuIHBDbG9uZTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTSBlSXRlbSkgY29uc3Qgew0KKyAgc3dpdGNoIChlSXRlbSkgew0KKyAgICBjYXNlIFhGQV9OT0RFSVRFTV9OZXh0U2libGluZzoNCisgICAgICByZXR1cm4gbV9wTmV4dDsNCisgICAgY2FzZSBYRkFfTk9ERUlURU1fRmlyc3RDaGlsZDoNCisgICAgICByZXR1cm4gbV9wQ2hpbGQ7DQorICAgIGNhc2UgWEZBX05PREVJVEVNX1BhcmVudDoNCisgICAgICByZXR1cm4gbV9wUGFyZW50Ow0KKyAgICBjYXNlIFhGQV9OT0RFSVRFTV9QcmV2U2libGluZzoNCisgICAgICBpZiAobV9wUGFyZW50KSB7DQorICAgICAgICBDWEZBX05vZGUqIHBTaWJsaW5nID0gbV9wUGFyZW50LT5tX3BDaGlsZDsNCisgICAgICAgIENYRkFfTm9kZSogcFByZXYgPSBOVUxMOw0KKyAgICAgICAgd2hpbGUgKHBTaWJsaW5nICYmIHBTaWJsaW5nICE9IHRoaXMpIHsNCisgICAgICAgICAgcFByZXYgPSBwU2libGluZzsNCisgICAgICAgICAgcFNpYmxpbmcgPSBwU2libGluZy0+bV9wTmV4dDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBwUHJldjsNCisgICAgICB9DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTSBlSXRlbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX09CSkVDVFRZUEUgZVR5cGUpIGNvbnN0IHsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBOVUxMOw0KKyAgc3dpdGNoIChlSXRlbSkgew0KKyAgICBjYXNlIFhGQV9OT0RFSVRFTV9OZXh0U2libGluZzoNCisgICAgICBwTm9kZSA9IG1fcE5leHQ7DQorICAgICAgaWYgKGVUeXBlICE9IFhGQV9PQkpFQ1RUWVBFTUFTSykNCisgICAgICAgIHdoaWxlIChwTm9kZSAmJiBwTm9kZS0+R2V0T2JqZWN0VHlwZSgpICE9IGVUeXBlKSB7DQorICAgICAgICAgIHBOb2RlID0gcE5vZGUtPm1fcE5leHQ7DQorICAgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQ6DQorICAgICAgcE5vZGUgPSBtX3BDaGlsZDsNCisgICAgICBpZiAoZVR5cGUgIT0gWEZBX09CSkVDVFRZUEVNQVNLKQ0KKyAgICAgICAgd2hpbGUgKHBOb2RlICYmIHBOb2RlLT5HZXRPYmplY3RUeXBlKCkgIT0gZVR5cGUpIHsNCisgICAgICAgICAgcE5vZGUgPSBwTm9kZS0+bV9wTmV4dDsNCisgICAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfTk9ERUlURU1fUGFyZW50Og0KKyAgICAgIHBOb2RlID0gbV9wUGFyZW50Ow0KKyAgICAgIGlmIChlVHlwZSAhPSBYRkFfT0JKRUNUVFlQRU1BU0spDQorICAgICAgICB3aGlsZSAocE5vZGUgJiYgcE5vZGUtPkdldE9iamVjdFR5cGUoKSAhPSBlVHlwZSkgew0KKyAgICAgICAgICBwTm9kZSA9IHBOb2RlLT5tX3BQYXJlbnQ7DQorICAgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX05PREVJVEVNX1ByZXZTaWJsaW5nOg0KKyAgICAgIGlmIChtX3BQYXJlbnQpIHsNCisgICAgICAgIENYRkFfTm9kZSogcFNpYmxpbmcgPSBtX3BQYXJlbnQtPm1fcENoaWxkOw0KKyAgICAgICAgd2hpbGUgKHBTaWJsaW5nICYmIHBTaWJsaW5nICE9IHRoaXMpIHsNCisgICAgICAgICAgaWYgKGVUeXBlID09IFhGQV9PQkpFQ1RUWVBFTUFTSyB8fA0KKyAgICAgICAgICAgICAgZVR5cGUgPT0gcFNpYmxpbmctPkdldE9iamVjdFR5cGUoKSkgew0KKyAgICAgICAgICAgIHBOb2RlID0gcFNpYmxpbmc7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcFNpYmxpbmcgPSBwU2libGluZy0+bV9wTmV4dDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gcE5vZGU7DQorfQ0KK2ludDMyX3QgQ1hGQV9Ob2RlOjpHZXROb2RlTGlzdChDWEZBX05vZGVBcnJheSYgbm9kZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3VHlwZUZpbHRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgZUVsZW1lbnRGaWx0ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxldmVsKSB7DQorICBpZiAoLS1pTGV2ZWwgPCAwKSB7DQorICAgIHJldHVybiBub2Rlcy5HZXRTaXplKCk7DQorICB9DQorICBpZiAoZUVsZW1lbnRGaWx0ZXIgIT0gWEZBX0VMRU1FTlRfVU5LTk9XTikgew0KKyAgICBDWEZBX05vZGUqIHBDaGlsZCA9IG1fcENoaWxkOw0KKyAgICB3aGlsZSAocENoaWxkKSB7DQorICAgICAgaWYgKHBDaGlsZC0+R2V0Q2xhc3NJRCgpID09IGVFbGVtZW50RmlsdGVyKSB7DQorICAgICAgICBub2Rlcy5BZGQocENoaWxkKTsNCisgICAgICAgIGlmIChpTGV2ZWwgPiAwKSB7DQorICAgICAgICAgIEdldE5vZGVMaXN0KG5vZGVzLCBkd1R5cGVGaWx0ZXIsIGVFbGVtZW50RmlsdGVyLCBpTGV2ZWwpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBwQ2hpbGQgPSBwQ2hpbGQtPm1fcE5leHQ7DQorICAgIH0NCisgIH0gZWxzZSBpZiAoZHdUeXBlRmlsdGVyID09DQorICAgICAgICAgICAgIChYRkFfTk9ERUZJTFRFUl9DaGlsZHJlbiB8IFhGQV9OT0RFRklMVEVSX1Byb3BlcnRpZXMpKSB7DQorICAgIENYRkFfTm9kZSogcENoaWxkID0gbV9wQ2hpbGQ7DQorICAgIHdoaWxlIChwQ2hpbGQpIHsNCisgICAgICBub2Rlcy5BZGQocENoaWxkKTsNCisgICAgICBpZiAoaUxldmVsID4gMCkgew0KKyAgICAgICAgR2V0Tm9kZUxpc3Qobm9kZXMsIGR3VHlwZUZpbHRlciwgZUVsZW1lbnRGaWx0ZXIsIGlMZXZlbCk7DQorICAgICAgfQ0KKyAgICAgIHBDaGlsZCA9IHBDaGlsZC0+bV9wTmV4dDsNCisgICAgfQ0KKyAgfSBlbHNlIGlmIChkd1R5cGVGaWx0ZXIgIT0gMCkgew0KKyAgICBGWF9CT09MIGJGaWx0ZXJDaGlsZHJlbiA9IChkd1R5cGVGaWx0ZXIgJiBYRkFfTk9ERUZJTFRFUl9DaGlsZHJlbikgIT0gMDsNCisgICAgRlhfQk9PTCBiRmlsdGVyUHJvcGVydGllcyA9IChkd1R5cGVGaWx0ZXIgJiBYRkFfTk9ERUZJTFRFUl9Qcm9wZXJ0aWVzKSAhPSAwOw0KKyAgICBGWF9CT09MIGJGaWx0ZXJPbmVPZlByb3BlcnRpZXMgPQ0KKyAgICAgICAgKGR3VHlwZUZpbHRlciAmIFhGQV9OT0RFRklMVEVSX09uZU9mUHJvcGVydHkpICE9IDA7DQorICAgIENYRkFfTm9kZSogcENoaWxkID0gbV9wQ2hpbGQ7DQorICAgIHdoaWxlIChwQ2hpbGQpIHsNCisgICAgICBYRkFfTFBDUFJPUEVSVFkgcFByb3BlcnQgPSBYRkFfR2V0UHJvcGVydHlPZkVsZW1lbnQoDQorICAgICAgICAgIEdldENsYXNzSUQoKSwgcENoaWxkLT5HZXRDbGFzc0lEKCksIFhGQV9YRFBQQUNLRVRfVU5LTk9XTik7DQorICAgICAgaWYgKHBQcm9wZXJ0KSB7DQorICAgICAgICBpZiAoYkZpbHRlclByb3BlcnRpZXMpIHsNCisgICAgICAgICAgbm9kZXMuQWRkKHBDaGlsZCk7DQorICAgICAgICB9IGVsc2UgaWYgKGJGaWx0ZXJPbmVPZlByb3BlcnRpZXMgJiYNCisgICAgICAgICAgICAgICAgICAgKHBQcm9wZXJ0LT51RmxhZ3MgJiBYRkFfUFJPUEVSVFlGTEFHX09uZU9mKSkgew0KKyAgICAgICAgICBub2Rlcy5BZGQocENoaWxkKTsNCisgICAgICAgIH0gZWxzZSBpZiAoYkZpbHRlckNoaWxkcmVuICYmDQorICAgICAgICAgICAgICAgICAgIChwQ2hpbGQtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9WYXJpYWJsZXMgfHwNCisgICAgICAgICAgICAgICAgICAgIHBDaGlsZC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VTZXQpKSB7DQorICAgICAgICAgIG5vZGVzLkFkZChwQ2hpbGQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAoYkZpbHRlckNoaWxkcmVuKSB7DQorICAgICAgICAgIG5vZGVzLkFkZChwQ2hpbGQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBwQ2hpbGQgPSBwQ2hpbGQtPm1fcE5leHQ7DQorICAgIH0NCisgICAgaWYgKGJGaWx0ZXJPbmVPZlByb3BlcnRpZXMgJiYgbm9kZXMuR2V0U2l6ZSgpIDwgMSkgew0KKyAgICAgIGludDMyX3QgaVByb3BlcnRpZXMgPSAwOw0KKyAgICAgIFhGQV9MUENQUk9QRVJUWSBwUHJvcGVydHkgPQ0KKyAgICAgICAgICBYRkFfR2V0RWxlbWVudFByb3BlcnRpZXMoR2V0Q2xhc3NJRCgpLCBpUHJvcGVydGllcyk7DQorICAgICAgaWYgKHBQcm9wZXJ0eSA9PSBOVUxMIHx8IGlQcm9wZXJ0aWVzIDwgMSkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgICAgfQ0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlQcm9wZXJ0aWVzOyBpKyspIHsNCisgICAgICAgIGlmIChwUHJvcGVydHlbaV0udUZsYWdzICYgWEZBX1BST1BFUlRZRkxBR19EZWZhdWx0T25lT2YpIHsNCisgICAgICAgICAgSVhGQV9PYmpGYWN0b3J5KiBwRmFjdG9yeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0RmFjdG9yeSgpOw0KKyAgICAgICAgICBYRkFfTFBDUEFDS0VUSU5GTyBwUGFja2V0ID0gWEZBX0dldFBhY2tldEJ5SUQoR2V0UGFja2V0SUQoKSk7DQorICAgICAgICAgIENYRkFfTm9kZSogcE5ld05vZGUgPQ0KKyAgICAgICAgICAgICAgcEZhY3RvcnktPkNyZWF0ZU5vZGUocFBhY2tldCwgKFhGQV9FTEVNRU5UKXBQcm9wZXJ0eVtpXS5lTmFtZSk7DQorICAgICAgICAgIGlmICghcE5ld05vZGUpIHsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBJbnNlcnRDaGlsZChwTmV3Tm9kZSwgTlVMTCk7DQorICAgICAgICAgIHBOZXdOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCk7DQorICAgICAgICAgIG5vZGVzLkFkZChwTmV3Tm9kZSk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIG5vZGVzLkdldFNpemUoKTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkNyZWF0ZVNhbWVQYWNrZXROb2RlKFhGQV9FTEVNRU5UIGVFbGVtZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWdzKSB7DQorICBJWEZBX09iakZhY3RvcnkqIHBGYWN0b3J5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXRGYWN0b3J5KCk7DQorICBDWEZBX05vZGUqIHBOb2RlID0gcEZhY3RvcnktPkNyZWF0ZU5vZGUobV9lUGFja2V0LCBlRWxlbWVudCk7DQorICBwTm9kZS0+U2V0RmxhZyhkd0ZsYWdzKTsNCisgIHJldHVybiBwTm9kZTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkNsb25lVGVtcGxhdGVUb0Zvcm0oRlhfQk9PTCBiUmVjdXJzaXZlKSB7DQorICBGWFNZU19hc3NlcnQobV9lUGFja2V0ID09IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUpOw0KKyAgSVhGQV9PYmpGYWN0b3J5KiBwRmFjdG9yeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0RmFjdG9yeSgpOw0KKyAgQ1hGQV9Ob2RlKiBwQ2xvbmUgPSBwRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0Zvcm0sIG1fZU5vZGVDbGFzcyk7DQorICBpZiAoIXBDbG9uZSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHBDbG9uZS0+U2V0VGVtcGxhdGVOb2RlKHRoaXMpOw0KKyAgcENsb25lLT5VcGRhdGVOYW1lSGFzaCgpOw0KKyAgcENsb25lLT5TZXRYTUxNYXBwaW5nTm9kZShHZXRYTUxNYXBwaW5nTm9kZSgpKTsNCisgIGlmIChiUmVjdXJzaXZlKSB7DQorICAgIGZvciAoQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBDaGlsZDsNCisgICAgICAgICBwQ2hpbGQgPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICBwQ2xvbmUtPkluc2VydENoaWxkKHBDaGlsZC0+Q2xvbmVUZW1wbGF0ZVRvRm9ybShiUmVjdXJzaXZlKSk7DQorICAgIH0NCisgIH0NCisgIHBDbG9uZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpOw0KKyAgcmV0dXJuIHBDbG9uZTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldFRlbXBsYXRlTm9kZSgpIHsNCisgIHJldHVybiBtX3BBdXhOb2RlOw0KK30NCit2b2lkIENYRkFfTm9kZTo6U2V0VGVtcGxhdGVOb2RlKENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSkgew0KKyAgbV9wQXV4Tm9kZSA9IHBUZW1wbGF0ZU5vZGU7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXRCaW5kRGF0YSgpIHsNCisgIEFTU0VSVChHZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRm9ybSk7DQorICByZXR1cm4gKENYRkFfTm9kZSopR2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUpOw0KK30NCitpbnQzMl90IENYRkFfTm9kZTo6R2V0QmluZEl0ZW1zKENYRkFfTm9kZUFycmF5JiBmb3JtSXRlbXMpIHsNCisgIGlmIChtX3VGbGFncyAmIFhGQV9OT0RFRkxBR19CaW5kRm9ybUl0ZW1zKSB7DQorICAgIENYRkFfTm9kZUFycmF5KiBwSXRlbXMgPSBOVUxMOw0KKyAgICBUcnlPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSwgKHZvaWQqJilwSXRlbXMpOw0KKyAgICBmb3JtSXRlbXMuQ29weSgqcEl0ZW1zKTsNCisgICAgcmV0dXJuIGZvcm1JdGVtcy5HZXRTaXplKCk7DQorICB9DQorICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IChDWEZBX05vZGUqKUdldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlKTsNCisgIGlmIChwRm9ybU5vZGUpIHsNCisgICAgZm9ybUl0ZW1zLkFkZChwRm9ybU5vZGUpOw0KKyAgfQ0KKyAgcmV0dXJuIGZvcm1JdGVtcy5HZXRTaXplKCk7DQorfQ0KK3N0YXRpYyB2b2lkIFhGQV9EYXRhTm9kZURlbGV0ZUJpbmRJdGVtKHZvaWQqIHBEYXRhKSB7DQorICBpZiAocERhdGEpIHsNCisgICAgZGVsZXRlICgoQ1hGQV9Ob2RlQXJyYXkqKXBEYXRhKTsNCisgIH0NCit9DQorc3RhdGljIFhGQV9NQVBEQVRBQkxPQ0tDQUxMQkFDS0lORk8gZGVsZXRlQmluZEl0ZW1DYWxsQmFjayA9IHsNCisgICAgWEZBX0RhdGFOb2RlRGVsZXRlQmluZEl0ZW0sIE5VTEx9Ow0KK2ludDMyX3QgQ1hGQV9Ob2RlOjpBZGRCaW5kSXRlbShDWEZBX05vZGUqIHBGb3JtTm9kZSkgew0KKyAgQVNTRVJUKHBGb3JtTm9kZSk7DQorICBpZiAobV91RmxhZ3MgJiBYRkFfTk9ERUZMQUdfQmluZEZvcm1JdGVtcykgew0KKyAgICBDWEZBX05vZGVBcnJheSogcEl0ZW1zID0gTlVMTDsNCisgICAgVHJ5T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsICh2b2lkKiYpcEl0ZW1zKTsNCisgICAgQVNTRVJUKHBJdGVtcyk7DQorICAgIGlmIChwSXRlbXMtPkZpbmQocEZvcm1Ob2RlKSA8IDApIHsNCisgICAgICBwSXRlbXMtPkFkZChwRm9ybU5vZGUpOw0KKyAgICB9DQorICAgIHJldHVybiBwSXRlbXMtPkdldFNpemUoKTsNCisgIH0NCisgIENYRkFfTm9kZSogcE9sZEZvcm1JdGVtID0gKENYRkFfTm9kZSopR2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUpOw0KKyAgaWYgKCFwT2xkRm9ybUl0ZW0pIHsNCisgICAgU2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsIHBGb3JtTm9kZSk7DQorICAgIHJldHVybiAxOw0KKyAgfSBlbHNlIGlmIChwT2xkRm9ybUl0ZW0gPT0gcEZvcm1Ob2RlKSB7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlQXJyYXkqIHBJdGVtcyA9IG5ldyBDWEZBX05vZGVBcnJheTsNCisgIFNldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlLCBwSXRlbXMsICZkZWxldGVCaW5kSXRlbUNhbGxCYWNrKTsNCisgIHBJdGVtcy0+QWRkKHBPbGRGb3JtSXRlbSk7DQorICBwSXRlbXMtPkFkZChwRm9ybU5vZGUpOw0KKyAgbV91RmxhZ3MgfD0gWEZBX05PREVGTEFHX0JpbmRGb3JtSXRlbXM7DQorICByZXR1cm4gMjsNCit9DQoraW50MzJfdCBDWEZBX05vZGU6OlJlbW92ZUJpbmRJdGVtKENYRkFfTm9kZSogcEZvcm1Ob2RlKSB7DQorICBpZiAobV91RmxhZ3MgJiBYRkFfTk9ERUZMQUdfQmluZEZvcm1JdGVtcykgew0KKyAgICBDWEZBX05vZGVBcnJheSogcEl0ZW1zID0gTlVMTDsNCisgICAgVHJ5T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsICh2b2lkKiYpcEl0ZW1zKTsNCisgICAgQVNTRVJUKHBJdGVtcyk7DQorICAgIGludDMyX3QgaUluZGV4ID0gcEl0ZW1zLT5GaW5kKHBGb3JtTm9kZSk7DQorICAgIGludDMyX3QgaUNvdW50ID0gcEl0ZW1zLT5HZXRTaXplKCk7DQorICAgIGlmIChpSW5kZXggPj0gMCkgew0KKyAgICAgIGlmIChpSW5kZXggIT0gaUNvdW50IC0gMSkgew0KKyAgICAgICAgcEl0ZW1zLT5TZXRBdChpSW5kZXgsIHBJdGVtcy0+R2V0QXQoaUNvdW50IC0gMSkpOw0KKyAgICAgIH0NCisgICAgICBwSXRlbXMtPlJlbW92ZUF0KGlDb3VudCAtIDEpOw0KKyAgICAgIGlmIChpQ291bnQgPT0gMikgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwTGFzdEZvcm1Ob2RlID0gcEl0ZW1zLT5HZXRBdCgwKTsNCisgICAgICAgIFNldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlLCBwTGFzdEZvcm1Ob2RlKTsNCisgICAgICAgIG1fdUZsYWdzICY9IH5YRkFfTk9ERUZMQUdfQmluZEZvcm1JdGVtczsNCisgICAgICB9DQorICAgICAgaUNvdW50LS07DQorICAgIH0NCisgICAgcmV0dXJuIGlDb3VudDsNCisgIH0NCisgIENYRkFfTm9kZSogcE9sZEZvcm1JdGVtID0gKENYRkFfTm9kZSopR2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUpOw0KKyAgaWYgKHBPbGRGb3JtSXRlbSA9PSBwRm9ybU5vZGUpIHsNCisgICAgU2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsIE5VTEwpOw0KKyAgICBwT2xkRm9ybUl0ZW0gPSBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIHBPbGRGb3JtSXRlbSA9PSBOVUxMID8gMCA6IDE7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpIYXNCaW5kSXRlbSgpIHsNCisgIHJldHVybiAoR2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKSAmJg0KKyAgICAgICAgIEdldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlKSAhPSBOVUxMOw0KK30NCitDWEZBX1dpZGdldERhdGEqIENYRkFfTm9kZTo6R2V0V2lkZ2V0RGF0YSgpIHsNCisgIHJldHVybiAoQ1hGQV9XaWRnZXREYXRhKilHZXRPYmplY3QoWEZBX0FUVFJJQlVURV9XaWRnZXREYXRhKTsNCit9DQorQ1hGQV9XaWRnZXREYXRhKiBDWEZBX05vZGU6OkdldENvbnRhaW5lcldpZGdldERhdGEoKSB7DQorICBpZiAoR2V0UGFja2V0SUQoKSAhPSBYRkFfWERQUEFDS0VUX0Zvcm0pIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBYRkFfRUxFTUVOVCBjbGFzc0lEID0gR2V0Q2xhc3NJRCgpOw0KKyAgaWYgKGNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgaWYgKHBQYXJlbnROb2RlICYmIHBQYXJlbnROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaWYgKGNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCisgICAgQ1hGQV9XaWRnZXREYXRhKiBwRmllbGRXaWRnZXREYXRhID0gdGhpcy0+R2V0V2lkZ2V0RGF0YSgpOw0KKyAgICBpZiAocEZpZWxkV2lkZ2V0RGF0YSAmJg0KKyAgICAgICAgcEZpZWxkV2lkZ2V0RGF0YS0+R2V0Q2hvaWNlTGlzdE9wZW4oKSA9PQ0KKyAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX011bHRpU2VsZWN0KSB7DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0gZWxzZSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQaWN0dXJlOw0KKyAgICAgIGlmIChwRmllbGRXaWRnZXREYXRhKSB7DQorICAgICAgICBwRmllbGRXaWRnZXREYXRhLT5HZXRQaWN0dXJlQ29udGVudCh3c1BpY3R1cmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfVkFMVUVQSUNUVVJFX0RhdGFCaW5kKTsNCisgICAgICB9DQorICAgICAgaWYgKCF3c1BpY3R1cmUuSXNFbXB0eSgpKSB7DQorICAgICAgICByZXR1cm4gcEZpZWxkV2lkZ2V0RGF0YTsNCisgICAgICB9DQorICAgICAgQ1hGQV9Ob2RlKiBwRGF0YU5vZGUgPSB0aGlzLT5HZXRCaW5kRGF0YSgpOw0KKyAgICAgIGlmICghcERhdGFOb2RlKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICB9DQorICAgICAgcEZpZWxkV2lkZ2V0RGF0YSA9IE5VTEw7DQorICAgICAgQ1hGQV9Ob2RlQXJyYXkgZm9ybU5vZGVzOw0KKyAgICAgIHBEYXRhTm9kZS0+R2V0QmluZEl0ZW1zKGZvcm1Ob2Rlcyk7DQorICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZm9ybU5vZGVzLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IGZvcm1Ob2Rlcy5HZXRBdChpKTsNCisgICAgICAgIGlmICghcEZvcm1Ob2RlIHx8IHBGb3JtTm9kZS0+SGFzRmxhZyhYRkFfTk9ERUZMQUdfSGFzUmVtb3ZlZCkpIHsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBwRmllbGRXaWRnZXREYXRhID0gcEZvcm1Ob2RlLT5HZXRXaWRnZXREYXRhKCk7DQorICAgICAgICBpZiAocEZpZWxkV2lkZ2V0RGF0YSkgew0KKyAgICAgICAgICBwRmllbGRXaWRnZXREYXRhLT5HZXRQaWN0dXJlQ29udGVudCh3c1BpY3R1cmUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9WQUxVRVBJQ1RVUkVfRGF0YUJpbmQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKCF3c1BpY3R1cmUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcEZpZWxkV2lkZ2V0RGF0YSA9IE5VTEw7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBwRmllbGRXaWRnZXREYXRhOw0KKyAgICB9DQorICB9DQorICBDWEZBX05vZGUqIHBHcmFuZE5vZGUgPQ0KKyAgICAgIHBQYXJlbnROb2RlID8gcFBhcmVudE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpIDogTlVMTDsNCisgIENYRkFfTm9kZSogcFZhbHVlTm9kZSA9DQorICAgICAgKHBQYXJlbnROb2RlICYmIHBQYXJlbnROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfVmFsdWUpDQorICAgICAgICAgID8gcFBhcmVudE5vZGUNCisgICAgICAgICAgOiBOVUxMOw0KKyAgaWYgKCFwVmFsdWVOb2RlKSB7DQorICAgIHBWYWx1ZU5vZGUgPSAocEdyYW5kTm9kZSAmJiBwR3JhbmROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfVmFsdWUpDQorICAgICAgICAgICAgICAgICAgICAgPyBwR3JhbmROb2RlDQorICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwUGFyZW50T2ZWYWx1ZU5vZGUgPQ0KKyAgICAgIHBWYWx1ZU5vZGUgPyBwVmFsdWVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSA6IE5VTEw7DQorICByZXR1cm4gcFBhcmVudE9mVmFsdWVOb2RlID8gcFBhcmVudE9mVmFsdWVOb2RlLT5HZXRDb250YWluZXJXaWRnZXREYXRhKCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6R2V0TG9jYWxlTmFtZShDRlhfV2lkZVN0cmluZyYgd3NMb2NhbGVOYW1lKSB7DQorICBDWEZBX05vZGUqIHBGb3JtID0gKENYRkFfTm9kZSopR2V0RG9jdW1lbnQoKS0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRm9ybSk7DQorICBDWEZBX05vZGUqIHBUb3BTdWJmb3JtID0gcEZvcm0tPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1N1YmZvcm0pOw0KKyAgRlhTWVNfYXNzZXJ0KHBUb3BTdWJmb3JtKTsNCisgIENYRkFfTm9kZSogcExvY2FsZU5vZGUgPSB0aGlzOw0KKyAgRlhfQk9PTCBiTG9jYWxlID0gRkFMU0U7DQorICBkbyB7DQorICAgIGJMb2NhbGUgPSBwTG9jYWxlTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Mb2NhbGUsIHdzTG9jYWxlTmFtZSwgRkFMU0UpOw0KKyAgICBpZiAoIWJMb2NhbGUpIHsNCisgICAgICBwTG9jYWxlTm9kZSA9IHBMb2NhbGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgfQ0KKyAgfSB3aGlsZSAocExvY2FsZU5vZGUgJiYgcExvY2FsZU5vZGUgIT0gcFRvcFN1YmZvcm0gJiYgIWJMb2NhbGUpOw0KKyAgaWYgKGJMb2NhbGUpIHsNCisgICAgcmV0dXJuIGJMb2NhbGU7DQorICB9DQorICBDWEZBX05vZGUqIHBDb25maWcgPQ0KKyAgICAgIChDWEZBX05vZGUqKUdldERvY3VtZW50KCktPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0NvbmZpZyk7DQorICB3c0xvY2FsZU5hbWUgPSBHZXREb2N1bWVudCgpLT5HZXRMb2NhbE1ncigpLT5HZXRDb25maWdMb2NhbGVOYW1lKHBDb25maWcpOw0KKyAgaWYgKCF3c0xvY2FsZU5hbWUuSXNFbXB0eSgpKSB7DQorICAgIGJMb2NhbGUgPSBUUlVFOw0KKyAgfQ0KKyAgaWYgKGJMb2NhbGUpIHsNCisgICAgcmV0dXJuIGJMb2NhbGU7DQorICB9DQorICBpZiAocFRvcFN1YmZvcm0pIHsNCisgICAgYkxvY2FsZSA9IHBUb3BTdWJmb3JtLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0xvY2FsZSwgd3NMb2NhbGVOYW1lLCBGQUxTRSk7DQorICB9DQorICBpZiAoYkxvY2FsZSkgew0KKyAgICByZXR1cm4gYkxvY2FsZTsNCisgIH0NCisgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBHZXREb2N1bWVudCgpLT5HZXRMb2NhbE1ncigpLT5HZXREZWZMb2NhbGUoKTsNCisgIGlmIChwTG9jYWxlKSB7DQorICAgIHdzTG9jYWxlTmFtZSA9IHBMb2NhbGUtPkdldE5hbWUoKTsNCisgICAgYkxvY2FsZSA9IFRSVUU7DQorICB9DQorICByZXR1cm4gYkxvY2FsZTsNCit9DQorWEZBX0FUVFJJQlVURUVOVU0gQ1hGQV9Ob2RlOjpHZXRJbnRhY3QoKSB7DQorICBYRkFfRUxFTUVOVCBlRWxlbWVudCA9IEdldENsYXNzSUQoKTsNCisgIENYRkFfTm9kZSogcEtlZXAgPSBHZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9LZWVwKTsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXRUeXBlID0gR2V0RW51bShYRkFfQVRUUklCVVRFX0xheW91dCk7DQorICBpZiAocEtlZXApIHsNCisgICAgWEZBX0FUVFJJQlVURUVOVU0gZUludGFjdDsNCisgICAgaWYgKHBLZWVwLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfSW50YWN0LCBlSW50YWN0LCBGQUxTRSkpIHsNCisgICAgICBpZiAoZUludGFjdCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lICYmDQorICAgICAgICAgIGVMYXlvdXRUeXBlID09IFhGQV9BVFRSSUJVVEVFTlVNX1JvdyAmJg0KKyAgICAgICAgICBtX3BEb2N1bWVudC0+R2V0Q3VyVmVyc2lvbk1vZGUoKSA8IFhGQV9WRVJTSU9OXzIwOCkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwUHJldmlld1JvdyA9DQorICAgICAgICAgICAgR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1ByZXZTaWJsaW5nLCBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlKTsNCisgICAgICAgIGlmIChwUHJldmlld1JvdyAmJg0KKyAgICAgICAgICAgIHBQcmV2aWV3Um93LT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTGF5b3V0KSA9PQ0KKyAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTV9Sb3cpIHsNCisgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZVZhbHVlOw0KKyAgICAgICAgICBpZiAocEtlZXAtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9QcmV2aW91cywgZVZhbHVlLCBGQUxTRSkpIHsNCisgICAgICAgICAgICBpZiAoZVZhbHVlID09IFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhIHx8DQorICAgICAgICAgICAgICAgIGVWYWx1ZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9QYWdlQXJlYSkgew0KKyAgICAgICAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgICBDWEZBX05vZGUqIHBLZWVwID0NCisgICAgICAgICAgICAgIHBQcmV2aWV3Um93LT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9LZWVwKTsNCisgICAgICAgICAgaWYgKHBLZWVwKSB7DQorICAgICAgICAgICAgaWYgKHBLZWVwLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfTmV4dCwgZVZhbHVlLCBGQUxTRSkpIHsNCisgICAgICAgICAgICAgIGlmIChlVmFsdWUgPT0gWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWEgfHwNCisgICAgICAgICAgICAgICAgICBlVmFsdWUgPT0gWEZBX0FUVFJJQlVURUVOVU1fUGFnZUFyZWEpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICByZXR1cm4gZUludGFjdDsNCisgICAgfQ0KKyAgfQ0KKyAgc3dpdGNoIChlRWxlbWVudCkgew0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX1N1YmZvcm06DQorICAgICAgc3dpdGNoIChlTGF5b3V0VHlwZSkgew0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Qb3NpdGlvbjoNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUm93Og0KKyAgICAgICAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWE7DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RiOg0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9UYWJsZToNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTHJfdGI6DQorICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JsX3RiOg0KKyAgICAgICAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsNCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9GaWVsZDogew0KKyAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSB0aGlzLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICBpZiAoIXBQYXJlbnROb2RlIHx8IHBQYXJlbnROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZUFyZWEpIHsNCisgICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYTsNCisgICAgICB9DQorICAgICAgaWYgKHBQYXJlbnROb2RlLT5HZXRJbnRhY3QoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lKSB7DQorICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlUGFyTGF5b3V0ID0NCisgICAgICAgICAgICBwUGFyZW50Tm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0xheW91dCk7DQorICAgICAgICBpZiAoZVBhckxheW91dCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Qb3NpdGlvbiB8fA0KKyAgICAgICAgICAgIGVQYXJMYXlvdXQgPT0gWEZBX0FUVFJJQlVURUVOVU1fUm93IHx8DQorICAgICAgICAgICAgZVBhckxheW91dCA9PSBYRkFfQVRUUklCVVRFRU5VTV9UYWJsZSkgew0KKyAgICAgICAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsNCisgICAgICAgIH0NCisgICAgICAgIFhGQV9WRVJTSU9OIHZlcnNpb24gPSBtX3BEb2N1bWVudC0+R2V0Q3VyVmVyc2lvbk1vZGUoKTsNCisgICAgICAgIGlmIChlUGFyTGF5b3V0ID09IFhGQV9BVFRSSUJVVEVFTlVNX1RiICYmIHZlcnNpb24gPCBYRkFfVkVSU0lPTl8yMDgpIHsNCisgICAgICAgICAgQ1hGQV9NZWFzdXJlbWVudCBtZWFzdXJlSDsNCisgICAgICAgICAgaWYgKHRoaXMtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9ILCBtZWFzdXJlSCwgRkFMU0UpKSB7DQorICAgICAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhOw0KKyAgICB9DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfRHJhdzoNCisgICAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWE7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldERhdGFEZXNjcmlwdGlvbk5vZGUoKSB7DQorICBpZiAobV9lUGFja2V0ID09IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpIHsNCisgICAgcmV0dXJuIG1fcEF1eE5vZGU7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQordm9pZCBDWEZBX05vZGU6OlNldERhdGFEZXNjcmlwdGlvbk5vZGUoQ1hGQV9Ob2RlKiBwRGF0YURlc2NyaXB0aW9uTm9kZSkgew0KKyAgRlhTWVNfYXNzZXJ0KG1fZVBhY2tldCA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKTsNCisgIG1fcEF1eE5vZGUgPSBwRGF0YURlc2NyaXB0aW9uTm9kZTsNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfUmVzb2x2ZU5vZGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCAhPSAxKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwicmVzb2x2ZU5vZGUiKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnNFeHByZXNzaW9uID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgIHdzRXhwcmVzc2lvbiA9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzRXhwcmVzc2lvbiwgYnNFeHByZXNzaW9uLkdldExlbmd0aCgpKTsNCisgIElYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgaWYgKCFwU2NyaXB0Q29udGV4dCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX05vZGUqIHJlZk5vZGUgPSB0aGlzOw0KKyAgaWYgKHJlZk5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9YZmEpIHsNCisgICAgcmVmTm9kZSA9IChDWEZBX05vZGUqKXBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCk7DQorICB9DQorICBGWF9EV09SRCBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfCBYRkFfUkVTT0xWRU5PREVfQXR0cmlidXRlcyB8DQorICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfA0KKyAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzOw0KKyAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc292ZU5vZGVSUzsNCisgIGludDMyX3QgaVJldCA9IHBTY3JpcHRDb250ZXh0LT5SZXNvbHZlT2JqZWN0cyhyZWZOb2RlLCB3c0V4cHJlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3ZlTm9kZVJTLCBkd0ZsYWcpOw0KKyAgaWYgKGlSZXQgPCAxKSB7DQorICAgIHJldHVybiBGWEpTRV9WYWx1ZV9TZXROdWxsKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCkpOw0KKyAgfQ0KKyAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IE5VTEw7DQorICBpZiAocmVzb3ZlTm9kZVJTLmR3RmxhZ3MgPT0gWEZBX1JFU09WRU5PREVfUlNUWVBFX05vZGVzKSB7DQorICAgIENYRkFfT2JqZWN0KiBwTm9kZSA9IHJlc292ZU5vZGVSUy5ub2Rlc1swXTsNCisgICAgaFZhbHVlID0gcFNjcmlwdENvbnRleHQtPkdldEpTVmFsdWVGcm9tTWFwKHBOb2RlKTsNCisgICAgRlhKU0VfVmFsdWVfU2V0KHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIGhWYWx1ZSk7DQorICB9IGVsc2Ugew0KKyAgICBYRkFfTFBDU0NSSVBUQVRUUklCVVRFSU5GTyBscEF0dHJpYnV0ZUluZm8gPSByZXNvdmVOb2RlUlMucFNjcmlwdEF0dHJpYnV0ZTsNCisgICAgaWYgKGxwQXR0cmlidXRlSW5mbyAmJiBscEF0dHJpYnV0ZUluZm8tPmVWYWx1ZVR5cGUgPT0gWEZBX1NDUklQVF9PYmplY3QpIHsNCisgICAgICBoVmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUocFNjcmlwdENvbnRleHQtPkdldFJ1bnRpbWUoKSk7DQorICAgICAgKHJlc292ZU5vZGVSUy5ub2Rlc1swXS0+KihscEF0dHJpYnV0ZUluZm8tPmxwZm5DYWxsYmFjaykpKA0KKyAgICAgICAgICBoVmFsdWUsIEZBTFNFLCAoWEZBX0FUVFJJQlVURSlscEF0dHJpYnV0ZUluZm8tPmVBdHRyaWJ1dGUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBoVmFsdWUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaFZhbHVlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCkpOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX1Jlc29sdmVOb2RlcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoICE9IDEpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJyZXNvbHZlTm9kZXMiKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnNFeHByZXNzaW9uID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgIHdzRXhwcmVzc2lvbiA9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzRXhwcmVzc2lvbiwgYnNFeHByZXNzaW9uLkdldExlbmd0aCgpKTsNCisgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KKyAgaWYgKCFoVmFsdWUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfRFdPUkQgZHdGbGFnID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX0F0dHJpYnV0ZXMgfA0KKyAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMgfCBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwNCisgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5nczsNCisgIENYRkFfTm9kZSogcmVmTm9kZSA9IHRoaXM7DQorICBpZiAocmVmTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1hmYSkgew0KKyAgICByZWZOb2RlID0gKENYRkFfTm9kZSopbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpOw0KKyAgfQ0KKyAgU2NyaXB0X1NvbV9SZXNvbHZlTm9kZUxpc3QoaFZhbHVlLCB3c0V4cHJlc3Npb24sIGR3RmxhZywgcmVmTm9kZSk7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX1Jlc29sdmVOb2RlTGlzdChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiByZWZOb2RlKSB7DQorICBJWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKTsNCisgIGlmICghcFNjcmlwdENvbnRleHQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc292ZU5vZGVSUzsNCisgIGlmIChyZWZOb2RlID09IE5VTEwpIHsNCisgICAgcmVmTm9kZSA9IHRoaXM7DQorICB9DQorICBwU2NyaXB0Q29udGV4dC0+UmVzb2x2ZU9iamVjdHMocmVmTm9kZSwgd3NFeHByZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc292ZU5vZGVSUywgZHdGbGFnKTsNCisgIENYRkFfQXJyYXlOb2RlTGlzdCogcE5vZGVMaXN0ID0gbmV3IENYRkFfQXJyYXlOb2RlTGlzdChtX3BEb2N1bWVudCk7DQorICBpZiAocmVzb3ZlTm9kZVJTLmR3RmxhZ3MgPT0gWEZBX1JFU09WRU5PREVfUlNUWVBFX05vZGVzKSB7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHJlc292ZU5vZGVSUy5ub2Rlcy5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgIGlmIChyZXNvdmVOb2RlUlMubm9kZXNbaV0tPklzTm9kZSgpKSB7DQorICAgICAgICBwTm9kZUxpc3QtPkFwcGVuZCgoQ1hGQV9Ob2RlKilyZXNvdmVOb2RlUlMubm9kZXNbaV0pOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9IVkFMVUVBcnJheSBoVmFsdWVBcnJheShwU2NyaXB0Q29udGV4dC0+R2V0UnVudGltZSgpKTsNCisgICAgaWYgKHJlc292ZU5vZGVSUy5HZXRBdHRyaWJ1dGVSZXN1bHQoaFZhbHVlQXJyYXkpID4gMCkgew0KKyAgICAgIENYRkFfT2JqQXJyYXkgb2JqZWN0QXJyYXk7DQorICAgICAgaFZhbHVlQXJyYXkuR2V0QXR0cmlidXRlT2JqZWN0KG9iamVjdEFycmF5KTsNCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBvYmplY3RBcnJheS5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgaWYgKG9iamVjdEFycmF5W2ldLT5Jc05vZGUoKSkgew0KKyAgICAgICAgICBwTm9kZUxpc3QtPkFwcGVuZCgoQ1hGQV9Ob2RlKilvYmplY3RBcnJheVtpXSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBGWEpTRV9WYWx1ZV9TZXRPYmplY3QoaFZhbHVlLCAoQ1hGQV9PYmplY3QqKXBOb2RlTGlzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICBwU2NyaXB0Q29udGV4dC0+R2V0SnNlTm9ybWFsQ2xhc3MoKSk7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX0FsbChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmIChiU2V0dGluZykgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KKyAgfSBlbHNlIHsNCisgICAgRlhfRFdPUkQgZHdGbGFnID0gWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzIHwgWEZBX1JFU09MVkVOT0RFX0FMTDsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOw0KKyAgICBHZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb24gPSB3c05hbWUgKyBGWF9XU1RSQyhMIlsqXSIpOw0KKyAgICBTY3JpcHRfU29tX1Jlc29sdmVOb2RlTGlzdChoVmFsdWUsIHdzRXhwcmVzc2lvbiwgZHdGbGFnKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfTm9kZXMoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICBpZiAoIXBTY3JpcHRDb250ZXh0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChiU2V0dGluZykgew0KKyAgICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBtX3BEb2N1bWVudC0+R2V0Tm90aWZ5KCktPkdldEFwcFByb3ZpZGVyKCk7DQorICAgIEZYU1lTX2Fzc2VydChwQXBwUHJvdmlkZXIpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2U7DQorICAgIHBBcHBQcm92aWRlci0+TG9hZFN0cmluZyhYRkFfSURTX1VuYWJsZV9UT19TRVQsIHdzTWVzc2FnZSk7DQorICAgIEZYSlNFX1Rocm93TWVzc2FnZSgiIiwgRlhfVVRGOEVuY29kZSh3c01lc3NhZ2UsIHdzTWVzc2FnZS5HZXRMZW5ndGgoKSkpOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9BdHRhY2hOb2RlTGlzdCogcE5vZGVMaXN0ID0gbmV3IENYRkFfQXR0YWNoTm9kZUxpc3QobV9wRG9jdW1lbnQsIHRoaXMpOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRPYmplY3QoaFZhbHVlLCAoQ1hGQV9PYmplY3QqKXBOb2RlTGlzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JpcHRDb250ZXh0LT5HZXRKc2VOb3JtYWxDbGFzcygpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfQ2xhc3NBbGwoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICB9IGVsc2Ugew0KKyAgICBGWF9EV09SRCBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfU2libGluZ3MgfCBYRkFfUkVTT0xWRU5PREVfQUxMOw0KKyAgICBDRlhfV2lkZVN0cmluZ0Mgd3NOYW1lOw0KKyAgICB0aGlzLT5HZXRDbGFzc05hbWUod3NOYW1lKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uID0gRlhfV1NUUkMoTCIjIikgKyB3c05hbWUgKyBGWF9XU1RSQyhMIlsqXSIpOw0KKyAgICBTY3JpcHRfU29tX1Jlc29sdmVOb2RlTGlzdChoVmFsdWUsIHdzRXhwcmVzc2lvbiwgZHdGbGFnKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfUGFyZW50KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX05vZGUqIHBQYXJlbnQgPSB0aGlzLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgaWYgKHBQYXJlbnQpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXQoDQorICAgICAgICAgIGhWYWx1ZSwgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocFBhcmVudCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoaFZhbHVlKTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19JbmRleChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgIH0gZWxzZSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBHZXROb2RlU2FtZU5hbWVJbmRleCgpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfQ2xhc3NJbmRleChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICB9IGVsc2Ugew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgR2V0Tm9kZVNhbWVDbGFzc0luZGV4KCkpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19Tb21FeHByZXNzaW9uKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgIH0gZWxzZSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzU09NRXhwcmVzc2lvbjsNCisgICAgR2V0U09NRXhwcmVzc2lvbih3c1NPTUV4cHJlc3Npb24pOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c1NPTUV4cHJlc3Npb24pKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfQXBwbHlYU0woQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCAhPSAxKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiYXBwbHlYU0wiKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uOw0KKyAgQ0ZYX0J5dGVTdHJpbmcgYnNFeHByZXNzaW9uID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgIHdzRXhwcmVzc2lvbiA9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzRXhwcmVzc2lvbiwgYnNFeHByZXNzaW9uLkdldExlbmd0aCgpKTsNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfQXNzaWduTm9kZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoIDwgMSB8fCBpTGVuZ3RoID4gMykgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImFzc2lnbk5vZGUiKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgIGludDMyX3QgaUFjdGlvbiA9IDA7DQorICBpZiAoaUxlbmd0aCA+PSAxKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzRXhwcmVzc2lvbiA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICAgIHdzRXhwcmVzc2lvbiA9DQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNFeHByZXNzaW9uLCBic0V4cHJlc3Npb24uR2V0TGVuZ3RoKCkpOw0KKyAgfQ0KKyAgaWYgKGlMZW5ndGggPj0gMikgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic1ZhbHVlID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygxKTsNCisgICAgd3NWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1ZhbHVlLCBic1ZhbHVlLkdldExlbmd0aCgpKTsNCisgIH0NCisgIGlmIChpTGVuZ3RoID49IDMpIHsNCisgICAgaUFjdGlvbiA9IHBBcmd1bWVudHMtPkdldEludDMyKDIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19DbG9uZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoICE9IDEpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJjbG9uZSIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9CT09MIGJDbG9uZSA9IFRSVUU7DQorICBiQ2xvbmUgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigwKSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KKyAgQ1hGQV9Ob2RlKiBwQ2xvbmVOb2RlID0gdGhpcy0+Q2xvbmUoYkNsb25lKTsNCisgIEZYSlNFX1ZhbHVlX1NldCgNCisgICAgICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBDbG9uZU5vZGUpKTsNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfR2V0QXR0cmlidXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggIT0gMSkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImdldEF0dHJpYnV0ZSIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb247DQorICBDRlhfQnl0ZVN0cmluZyBic0V4cHJlc3Npb24gPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KKyAgd3NFeHByZXNzaW9uID0NCisgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNFeHByZXNzaW9uLCBic0V4cHJlc3Npb24uR2V0TGVuZ3RoKCkpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgIHRoaXMtPkdldEF0dHJpYnV0ZSh3c0V4cHJlc3Npb24sIHdzVmFsdWUpOw0KKyAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQorICBpZiAoaFZhbHVlKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVmFsdWUpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfR2V0RWxlbWVudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoIDwgMSB8fCBpTGVuZ3RoID4gMikgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImdldEVsZW1lbnQiKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uOw0KKyAgaW50MzJfdCBpVmFsdWUgPSAwOw0KKyAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic0V4cHJlc3Npb24gPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KKyAgICB3c0V4cHJlc3Npb24gPQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzRXhwcmVzc2lvbiwgYnNFeHByZXNzaW9uLkdldExlbmd0aCgpKTsNCisgIH0NCisgIGlmIChpTGVuZ3RoID49IDIpIHsNCisgICAgaVZhbHVlID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMSk7DQorICB9DQorICBYRkFfTFBDRUxFTUVOVElORk8gcEVsZW1lbnRJbmZvID0gWEZBX0dldEVsZW1lbnRCeU5hbWUod3NFeHByZXNzaW9uKTsNCisgIENYRkFfTm9kZSogcE5vZGUgPSB0aGlzLT5HZXRQcm9wZXJ0eShpVmFsdWUsIHBFbGVtZW50SW5mby0+ZU5hbWUpOw0KKyAgRlhKU0VfVmFsdWVfU2V0KHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocE5vZGUpKTsNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfSXNQcm9wZXJ0eVNwZWNpZmllZCgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCA8IDEgfHwgaUxlbmd0aCA+IDMpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJpc1Byb3BlcnR5U3BlY2lmaWVkIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbjsNCisgIEZYX0JPT0wgYlBhcmVudCA9IFRSVUU7DQorICBpbnQzMl90IGlJbmRleCA9IDA7DQorICBpZiAoaUxlbmd0aCA+PSAxKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzRXhwcmVzc2lvbiA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICAgIHdzRXhwcmVzc2lvbiA9DQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNFeHByZXNzaW9uLCBic0V4cHJlc3Npb24uR2V0TGVuZ3RoKCkpOw0KKyAgfQ0KKyAgaWYgKGlMZW5ndGggPj0gMikgew0KKyAgICBiUGFyZW50ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMSkgPT0gMCA/IEZBTFNFIDogVFJVRTsNCisgIH0NCisgIGlmIChpTGVuZ3RoID49IDMpIHsNCisgICAgaUluZGV4ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMik7DQorICB9DQorICBGWF9CT09MIGJIYXMgPSBGQUxTRTsNCisgIFhGQV9MUENBVFRSSUJVVEVJTkZPIHBBdHRyaWJ1dGVJbmZvID0gWEZBX0dldEF0dHJpYnV0ZUJ5TmFtZSh3c0V4cHJlc3Npb24pOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgIGlmIChwQXR0cmlidXRlSW5mbykgew0KKyAgICBiSGFzID0gdGhpcy0+SGFzQXR0cmlidXRlKHBBdHRyaWJ1dGVJbmZvLT5lTmFtZSk7DQorICB9DQorICBpZiAoIWJIYXMpIHsNCisgICAgWEZBX0xQQ0VMRU1FTlRJTkZPIHBFbGVtZW50SW5mbyA9IFhGQV9HZXRFbGVtZW50QnlOYW1lKHdzRXhwcmVzc2lvbik7DQorICAgIGJIYXMgPSAodGhpcy0+R2V0UHJvcGVydHkoaUluZGV4LCBwRWxlbWVudEluZm8tPmVOYW1lKSAhPSBOVUxMKTsNCisgIH0NCisgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KKyAgaWYgKGhWYWx1ZSkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGhWYWx1ZSwgYkhhcyk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0xvYWRYTUwoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCA8IDEgfHwgaUxlbmd0aCA+IDMpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJsb2FkWE1MIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbjsNCisgIEZYX0JPT0wgYklnbm9yZVJvb3QgPSBUUlVFOw0KKyAgRlhfQk9PTCBiT3ZlcndyaXRlID0gMDsNCisgIGlmIChpTGVuZ3RoID49IDEpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNFeHByZXNzaW9uID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgICAgd3NFeHByZXNzaW9uID0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0V4cHJlc3Npb24sIGJzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSk7DQorICAgIGlmICh3c0V4cHJlc3Npb24uSXNFbXB0eSgpKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICB9DQorICBpZiAoaUxlbmd0aCA+PSAyKSB7DQorICAgIGJJZ25vcmVSb290ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMSkgPT0gMCA/IEZBTFNFIDogVFJVRTsNCisgIH0NCisgIGlmIChpTGVuZ3RoID49IDMpIHsNCisgICAgYk92ZXJ3cml0ZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDIpID09IDAgPyBGQUxTRSA6IFRSVUU7DQorICB9DQorICBJWEZBX1BhcnNlciogcFBhcnNlciA9IElYRkFfUGFyc2VyOjpDcmVhdGUobV9wRG9jdW1lbnQpOw0KKyAgaWYgKCFwUGFyc2VyKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBOVUxMOw0KKyAgaW50MzJfdCBpUGFyc2VyU3RhdHVzID0gcFBhcnNlci0+UGFyc2VYTUxEYXRhKHdzRXhwcmVzc2lvbiwgcFhNTE5vZGUsIE5VTEwpOw0KKyAgaWYgKGlQYXJzZXJTdGF0dXMgIT0gWEZBX1BBUlNFU1RBVFVTX0RvbmUgfHwgIXBYTUxOb2RlKSB7DQorICAgIHBQYXJzZXItPlJlbGVhc2UoKTsNCisgICAgcFBhcnNlciA9IE5VTEw7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChiSWdub3JlUm9vdCAmJiAocFhNTE5vZGUtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50IHx8DQorICAgICAgICAgICAgICAgICAgICAgIFhGQV9SZWNvZ25pemVSaWNoVGV4dCgoSUZERV9YTUxFbGVtZW50KilwWE1MTm9kZSkpKSB7DQorICAgIGJJZ25vcmVSb290ID0gRkFMU0U7DQorICB9DQorICBDWEZBX05vZGUqIHBGYWtlUm9vdCA9IHRoaXMtPkNsb25lKEZBTFNFKTsNCisgIENGWF9XaWRlU3RyaW5nQyB3c0NvbnRlbnRUeXBlID0gdGhpcy0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSk7DQorICBpZiAoIXdzQ29udGVudFR5cGUuSXNFbXB0eSgpKSB7DQorICAgIHBGYWtlUm9vdC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSk7DQorICB9DQorICBJRkRFX1hNTE5vZGUqIHBGYWtlWE1MUm9vdCA9IHBGYWtlUm9vdC0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCisgIGlmICghcEZha2VYTUxSb290KSB7DQorICAgIElGREVfWE1MTm9kZSogcFRoaXNYTUxSb290ID0gdGhpcy0+R2V0WE1MTWFwcGluZ05vZGUoKTsNCisgICAgcEZha2VYTUxSb290ID0gcFRoaXNYTUxSb290ID8gcFRoaXNYTUxSb290LT5DbG9uZShGQUxTRSkgOiBOVUxMOw0KKyAgfQ0KKyAgaWYgKCFwRmFrZVhNTFJvb3QpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQ2xhc3NOYW1lOw0KKyAgICB0aGlzLT5HZXRDbGFzc05hbWUod3NDbGFzc05hbWUpOw0KKyAgICBwRmFrZVhNTFJvb3QgPSBJRkRFX1hNTEVsZW1lbnQ6OkNyZWF0ZSh3c0NsYXNzTmFtZSk7DQorICB9DQorICBpZiAoYklnbm9yZVJvb3QpIHsNCisgICAgSUZERV9YTUxOb2RlKiBwWE1MQ2hpbGQgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsNCisgICAgd2hpbGUgKHBYTUxDaGlsZCkgew0KKyAgICAgIElGREVfWE1MTm9kZSogcFhNTFNpYmxpbmcgPQ0KKyAgICAgICAgICBwWE1MQ2hpbGQtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpOw0KKyAgICAgIHBYTUxOb2RlLT5SZW1vdmVDaGlsZE5vZGUocFhNTENoaWxkKTsNCisgICAgICBwRmFrZVhNTFJvb3QtPkluc2VydENoaWxkTm9kZShwWE1MQ2hpbGQpOw0KKyAgICAgIHBYTUxDaGlsZCA9IHBYTUxTaWJsaW5nOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBJRkRFX1hNTE5vZGUqIHBYTUxQYXJlbnQgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpQYXJlbnQpOw0KKyAgICBpZiAocFhNTFBhcmVudCkgew0KKyAgICAgIHBYTUxQYXJlbnQtPlJlbW92ZUNoaWxkTm9kZShwWE1MTm9kZSk7DQorICAgIH0NCisgICAgcEZha2VYTUxSb290LT5JbnNlcnRDaGlsZE5vZGUocFhNTE5vZGUpOw0KKyAgfQ0KKyAgcFBhcnNlci0+Q29uc3RydWN0WEZBTm9kZShwRmFrZVJvb3QsIHBGYWtlWE1MUm9vdCk7DQorICBwRmFrZVJvb3QgPSBwUGFyc2VyLT5HZXRSb290Tm9kZSgpOw0KKyAgaWYgKHBGYWtlUm9vdCkgew0KKyAgICBpZiAoYk92ZXJ3cml0ZSkgew0KKyAgICAgIENYRkFfTm9kZSogcENoaWxkID0gdGhpcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgIENYRkFfTm9kZSogcE5ld0NoaWxkID0gcEZha2VSb290LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgaW50MzJfdCBpbmRleCA9IDA7DQorICAgICAgd2hpbGUgKHBOZXdDaGlsZCkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwSXRlbSA9IHBOZXdDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICAgIHBGYWtlUm9vdC0+UmVtb3ZlQ2hpbGQocE5ld0NoaWxkKTsNCisgICAgICAgIHRoaXMtPkluc2VydENoaWxkKGluZGV4KyssIHBOZXdDaGlsZCk7DQorICAgICAgICBwTmV3Q2hpbGQtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCisgICAgICAgIHBOZXdDaGlsZCA9IHBJdGVtOw0KKyAgICAgIH0NCisgICAgICB3aGlsZSAocENoaWxkKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBJdGVtID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgICAgdGhpcy0+UmVtb3ZlQ2hpbGQocENoaWxkKTsNCisgICAgICAgIHBGYWtlUm9vdC0+SW5zZXJ0Q2hpbGQocENoaWxkKTsNCisgICAgICAgIHBDaGlsZCA9IHBJdGVtOw0KKyAgICAgIH0NCisgICAgICBpZiAoR2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0Zvcm0gJiYNCisgICAgICAgICAgR2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4RGF0YSkgew0KKyAgICAgICAgSUZERV9YTUxOb2RlKiBwVGVtcFhNTE5vZGUgPSB0aGlzLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgICAgdGhpcy0+U2V0WE1MTWFwcGluZ05vZGUocEZha2VYTUxSb290KTsNCisgICAgICAgIHRoaXMtPlNldEZsYWcoWEZBX05PREVGTEFHX093blhNTE5vZGUsIFRSVUUsIEZBTFNFKTsNCisgICAgICAgIGlmIChwVGVtcFhNTE5vZGUgJiYNCisgICAgICAgICAgICBwVGVtcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6UGFyZW50KSA9PSBOVUxMKSB7DQorICAgICAgICAgIHBGYWtlWE1MUm9vdCA9IHBUZW1wWE1MTm9kZTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHBGYWtlWE1MUm9vdCA9IE5VTEw7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIE1vdmVCdWZmZXJNYXBEYXRhKHBGYWtlUm9vdCwgdGhpcywgWEZBX0NhbGNEYXRhLCBUUlVFKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBDWEZBX05vZGUqIHBDaGlsZCA9IHBGYWtlUm9vdC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgIHdoaWxlIChwQ2hpbGQpIHsNCisgICAgICAgIENYRkFfTm9kZSogcEl0ZW0gPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgICBwRmFrZVJvb3QtPlJlbW92ZUNoaWxkKHBDaGlsZCk7DQorICAgICAgICB0aGlzLT5JbnNlcnRDaGlsZChwQ2hpbGQpOw0KKyAgICAgICAgcENoaWxkLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCk7DQorICAgICAgICBwQ2hpbGQgPSBwSXRlbTsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKHBGYWtlWE1MUm9vdCkgew0KKyAgICAgIHBGYWtlUm9vdC0+U2V0WE1MTWFwcGluZ05vZGUocEZha2VYTUxSb290KTsNCisgICAgICBwRmFrZVJvb3QtPlNldEZsYWcoWEZBX05PREVGTEFHX093blhNTE5vZGUsIFRSVUUsIEZBTFNFKTsNCisgICAgfQ0KKyAgICBwRmFrZVJvb3QtPlNldEZsYWcoWEZBX05PREVGTEFHX0hhc1JlbW92ZWQsIFRSVUUsIEZBTFNFKTsNCisgIH0gZWxzZSB7DQorICAgIGlmIChwRmFrZVhNTFJvb3QpIHsNCisgICAgICBwRmFrZVhNTFJvb3QtPlJlbGVhc2UoKTsNCisgICAgICBwRmFrZVhNTFJvb3QgPSBOVUxMOw0KKyAgICB9DQorICB9DQorICBwUGFyc2VyLT5SZWxlYXNlKCk7DQorICBwUGFyc2VyID0gTlVMTDsNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfU2F2ZUZpbHRlcmVkWE1MKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfU2F2ZVhNTChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoIDwgMCB8fCBpTGVuZ3RoID4gMSkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMInNhdmVYTUwiKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfQk9PTCBiUHJldHR5TW9kZSA9IEZBTFNFOw0KKyAgaWYgKGlMZW5ndGggPT0gMSkgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic1ByZXR0eSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICAgIGlmIChic1ByZXR0eS5FcXVhbCgicHJldHR5IikpIHsNCisgICAgICBiUHJldHR5TW9kZSA9IFRSVUU7DQorICAgIH0gZWxzZSB7DQorICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICB9DQorICBDRlhfQnl0ZVN0cmluZ0MgYnNYTUxIZWFkZXIgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iOw0KKyAgaWYgKEdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9Gb3JtKSB7DQorICAgIElGWF9NZW1vcnlTdHJlYW0qIHBNZW1vcnlTdHJlYW0gPSBGWF9DcmVhdGVNZW1vcnlTdHJlYW0oVFJVRSk7DQorICAgIGlmICghcE1lbW9yeVN0cmVhbSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgYnNYTUxIZWFkZXIpOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBJRlhfU3RyZWFtKiBwU3RyZWFtID0gSUZYX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKA0KKyAgICAgICAgKElGWF9GaWxlV3JpdGUqKXBNZW1vcnlTdHJlYW0sDQorICAgICAgICBGWF9TVFJFQU1BQ0NFU1NfVGV4dCB8IEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSB8IEZYX1NUUkVBTUFDQ0VTU19BcHBlbmQpOw0KKyAgICBpZiAoIXBTdHJlYW0pIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIGJzWE1MSGVhZGVyKTsNCisgICAgICBwTWVtb3J5U3RyZWFtLT5SZWxlYXNlKCk7DQorICAgICAgcE1lbW9yeVN0cmVhbSA9IE5VTEw7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHBTdHJlYW0tPlNldENvZGVQYWdlKEZYX0NPREVQQUdFX1VURjgpOw0KKyAgICBwU3RyZWFtLT5Xcml0ZURhdGEoYnNYTUxIZWFkZXIuR2V0UHRyKCksIGJzWE1MSGVhZGVyLkdldExlbmd0aCgpKTsNCisgICAgWEZBX0RhdGFFeHBvcnRlcl9SZWdlbmVyYXRlRm9ybUZpbGUodGhpcywgcFN0cmVhbSwgTlVMTCwgVFJVRSk7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoDQorICAgICAgICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDKHBNZW1vcnlTdHJlYW0tPkdldEJ1ZmZlcigpLCBwTWVtb3J5U3RyZWFtLT5HZXRTaXplKCkpKTsNCisgICAgcFN0cmVhbS0+UmVsZWFzZSgpOw0KKyAgICBwU3RyZWFtID0gTlVMTDsNCisgICAgaWYgKHBNZW1vcnlTdHJlYW0pIHsNCisgICAgICBwTWVtb3J5U3RyZWFtLT5SZWxlYXNlKCk7DQorICAgICAgcE1lbW9yeVN0cmVhbSA9IE5VTEw7DQorICAgIH0NCisgICAgcmV0dXJuOw0KKyAgfSBlbHNlIGlmIChHZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpIHsNCisgICAgSUZERV9YTUxOb2RlKiBwRWxlbWVudCA9IHRoaXMtPkdldFhNTE1hcHBpbmdOb2RlKCk7DQorICAgIGlmICghcEVsZW1lbnQgfHwgcEVsZW1lbnQtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBic1hNTEhlYWRlcik7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIFhGQV9EYXRhRXhwb3J0ZXJfRGVhbFdpdGhEYXRhR3JvdXBOb2RlKHRoaXMpOw0KKyAgICBJRlhfTWVtb3J5U3RyZWFtKiBwTWVtb3J5U3RyZWFtID0gRlhfQ3JlYXRlTWVtb3J5U3RyZWFtKFRSVUUpOw0KKyAgICBpZiAoIXBNZW1vcnlTdHJlYW0pIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIGJzWE1MSGVhZGVyKTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKHBNZW1vcnlTdHJlYW0pIHsNCisgICAgICBJRlhfU3RyZWFtKiBwU3RyZWFtID0gSUZYX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKA0KKyAgICAgICAgICAoSUZYX0ZpbGVXcml0ZSopcE1lbW9yeVN0cmVhbSwgRlhfU1RSRUFNQUNDRVNTX1RleHQgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfU1RSRUFNQUNDRVNTX0FwcGVuZCk7DQorICAgICAgaWYgKHBTdHJlYW0pIHsNCisgICAgICAgIHBTdHJlYW0tPlNldENvZGVQYWdlKEZYX0NPREVQQUdFX1VURjgpOw0KKyAgICAgICAgcFN0cmVhbS0+V3JpdGVEYXRhKGJzWE1MSGVhZGVyLkdldFB0cigpLCBic1hNTEhlYWRlci5HZXRMZW5ndGgoKSk7DQorICAgICAgICBwRWxlbWVudC0+U2F2ZVhNTE5vZGUocFN0cmVhbSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQyhwTWVtb3J5U3RyZWFtLT5HZXRCdWZmZXIoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlTdHJlYW0tPkdldFNpemUoKSkpOw0KKyAgICAgICAgcFN0cmVhbS0+UmVsZWFzZSgpOw0KKyAgICAgICAgcFN0cmVhbSA9IE5VTEw7DQorICAgICAgfQ0KKyAgICAgIGlmIChwTWVtb3J5U3RyZWFtKSB7DQorICAgICAgICBwTWVtb3J5U3RyZWFtLT5SZWxlYXNlKCk7DQorICAgICAgICBwTWVtb3J5U3RyZWFtID0gTlVMTDsNCisgICAgICB9DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksICIiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfU2V0QXR0cmlidXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggIT0gMikgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMInNldEF0dHJpYnV0ZSIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0F0dHJpYnV0ZTsNCisgIENGWF9XaWRlU3RyaW5nIHdzQXR0cmlidXRlVmFsdWU7DQorICBDRlhfQnl0ZVN0cmluZyBic0F0dHJpYnV0ZVZhbHVlID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgIENGWF9CeXRlU3RyaW5nIGJzQXR0cmlidXRlID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygxKTsNCisgIHdzQXR0cmlidXRlVmFsdWUgPQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0F0dHJpYnV0ZVZhbHVlLCBic0F0dHJpYnV0ZVZhbHVlLkdldExlbmd0aCgpKTsNCisgIHdzQXR0cmlidXRlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzQXR0cmlidXRlLCBic0F0dHJpYnV0ZS5HZXRMZW5ndGgoKSk7DQorICB0aGlzLT5TZXRBdHRyaWJ1dGUod3NBdHRyaWJ1dGUsIHdzQXR0cmlidXRlVmFsdWUsIFRSVUUpOw0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19TZXRFbGVtZW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggIT0gMSAmJiBpTGVuZ3RoICE9IDIpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJzZXRFbGVtZW50Iik7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfTm9kZSogcE5vZGUgPSBOVUxMOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOw0KKyAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICBwTm9kZSA9IChDWEZBX05vZGUqKXBBcmd1bWVudHMtPkdldE9iamVjdCgwKTsNCisgIH0NCisgIGlmIChpTGVuZ3RoID49IDIpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNOYW1lID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygxKTsNCisgICAgd3NOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzTmFtZSwgYnNOYW1lLkdldExlbmd0aCgpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfTnMoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICB9IGVsc2Ugew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c05hbWVTcGFjZTsNCisgICAgdGhpcy0+VHJ5TmFtZXNwYWNlKHdzTmFtZVNwYWNlKTsNCisgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NOYW1lU3BhY2UpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfTW9kZWwoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICB9IGVsc2Ugew0KKyAgICBGWEpTRV9WYWx1ZV9TZXQoaFZhbHVlLCBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcCgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPkdldE1vZGVsTm9kZSgpKSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0lzQ29udGFpbmVyKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmIChiU2V0dGluZykgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KKyAgfSBlbHNlIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihoVmFsdWUsIHRoaXMtPklzQ29udGFpbmVyTm9kZSgpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfSXNOdWxsKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICB9IGVsc2Ugew0KKyAgICBpZiAodGhpcy0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1N1YmZvcm0pIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGhWYWx1ZSwgRkFMU0UpOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyBzdHJWYWx1ZTsNCisgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihoVmFsdWUsICFUcnlDb250ZW50KHN0clZhbHVlKSB8fCBzdHJWYWx1ZS5Jc0VtcHR5KCkpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19PbmVPZkNoaWxkKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfTm9kZUFycmF5IHByb3BlcnRzOw0KKyAgICBpbnQzMl90IGlTaXplID0gdGhpcy0+R2V0Tm9kZUxpc3QocHJvcGVydHMsIFhGQV9OT0RFRklMVEVSX09uZU9mUHJvcGVydHkpOw0KKyAgICBpZiAoaVNpemUgPiAwKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0KA0KKyAgICAgICAgICBoVmFsdWUsDQorICAgICAgICAgIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHByb3BlcnRzWzBdKSk7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Db250YWluZXJDbGFzc19HZXREZWx0YShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7fQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfQ29udGFpbmVyQ2xhc3NfR2V0RGVsdGFzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIENYRkFfQXJyYXlOb2RlTGlzdCogcEZvcm1Ob2RlcyA9IG5ldyBDWEZBX0FycmF5Tm9kZUxpc3QobV9wRG9jdW1lbnQpOw0KKyAgRlhKU0VfVmFsdWVfU2V0T2JqZWN0KHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIChDWEZBX09iamVjdCopcEZvcm1Ob2RlcywNCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKc2VOb3JtYWxDbGFzcygpKTsNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Nb2RlbENsYXNzX0NsZWFyRXJyb3JMaXN0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Nb2RlbENsYXNzX0NyZWF0ZU5vZGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgU2NyaXB0X1RlbXBsYXRlX0NyZWF0ZU5vZGUocEFyZ3VtZW50cyk7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTW9kZWxDbGFzc19Jc0NvbXBhdGlibGVOUyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoIDwgMSkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImlzQ29tcGF0aWJsZU5TIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzTmFtZVNwYWNlOw0KKyAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic05hbWVTcGFjZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICAgIHdzTmFtZVNwYWNlID0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic05hbWVTcGFjZSwgYnNOYW1lU3BhY2UuR2V0TGVuZ3RoKCkpOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NOb2RlTmFtZVNwYWNlOw0KKyAgdGhpcy0+VHJ5TmFtZXNwYWNlKHdzTm9kZU5hbWVTcGFjZSk7DQorICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCisgIGlmIChoVmFsdWUpIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihoVmFsdWUsIHdzTm9kZU5hbWVTcGFjZS5FcXVhbCh3c05hbWVTcGFjZSkpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X01vZGVsQ2xhc3NfQ29udGV4dChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7fQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTW9kZWxDbGFzc19BbGlhc05vZGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHt9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfSW50ZWdlcihGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIFNldEludGVnZXIoZUF0dHJpYnV0ZSwgRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGhWYWx1ZSksIFRSVUUpOw0KKyAgfSBlbHNlIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIEdldEludGVnZXIoZUF0dHJpYnV0ZSkpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9JbnRlZ2VyUmVhZChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBpZiAoIWJTZXR0aW5nKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBHZXRJbnRlZ2VyKGVBdHRyaWJ1dGUpKTsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0woRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmIChiU2V0dGluZykgew0KKyAgICBTZXRCb29sZWFuKGVBdHRyaWJ1dGUsIEZYSlNFX1ZhbHVlX1RvQm9vbGVhbihoVmFsdWUpLCBUUlVFKTsNCisgIH0gZWxzZSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBHZXRCb29sZWFuKGVBdHRyaWJ1dGUpID8gIjEiIDogIjAiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTFJlYWQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKCFiU2V0dGluZykgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgR2V0Qm9vbGVhbihlQXR0cmlidXRlKSA/ICIxIiA6ICIwIik7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TZW5kQXR0cmlidXRlQ2hhbmdlTWVzc2FnZSgNCisgICAgdm9pZCogZUF0dHJpYnV0ZSwNCisgICAgdm9pZCogZVZhbHVlLA0KKyAgICBGWF9CT09MIGJTY3JpcHRNb2RpZnkpIHsNCisgIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvID0gbV9wRG9jdW1lbnQtPkdldExheW91dFByb2Nlc3NvcigpOw0KKyAgaWYgKCFwTGF5b3V0UHJvKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9EV09SRCBkd1BhY2tldCA9IHRoaXMtPkdldFBhY2tldElEKCk7DQorICBpZiAoZHdQYWNrZXQgJiBYRkFfWERQUEFDS0VUX0Zvcm0pIHsNCisgICAgRlhfQk9PTCBiTmVlZEZpbmRDb250YWluZXIgPSBGQUxTRTsNCisgICAgWEZBX0VMRU1FTlQgZVR5cGUgPSB0aGlzLT5HZXRDbGFzc0lEKCk7DQorICAgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0NhcHRpb246DQorICAgICAgICBiTmVlZEZpbmRDb250YWluZXIgPSBUUlVFOw0KKyAgICAgICAgcE5vdGlmeS0+T25Ob2RlRXZlbnQodGhpcywgWEZBX05PREVFVkVOVF9WYWx1ZUNoYW5nZWQsIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFsdWUsIHRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0ZvbnQ6DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9QYXJhOiB7DQorICAgICAgICBiTmVlZEZpbmRDb250YWluZXIgPSBUUlVFOw0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IHRoaXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgaWYgKHBQYXJlbnROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfQ2FwdGlvbikgew0KKyAgICAgICAgICBwTm90aWZ5LT5Pbk5vZGVFdmVudCh0aGlzLCBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdlZCwgZUF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhbHVlLCBwUGFyZW50Tm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmVudE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHRoaXMsIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2VkLCBlQXR0cmlidXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFsdWUsIHRoaXMsIHBQYXJlbnROb2RlKTsNCisgICAgICAgIH0NCisgICAgICB9IGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfTWFyZ2luOiB7DQorICAgICAgICBiTmVlZEZpbmRDb250YWluZXIgPSBUUlVFOw0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IHRoaXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgWEZBX0VMRU1FTlQgZVBhcmVudFR5cGUgPSBwUGFyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICAgICAgaWYgKHBQYXJlbnROb2RlLT5Jc0NvbnRhaW5lck5vZGUoKSkgew0KKyAgICAgICAgICBwTm90aWZ5LT5Pbk5vZGVFdmVudCh0aGlzLCBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdlZCwgZUF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhbHVlLCB0aGlzLCBwUGFyZW50Tm9kZSk7DQorICAgICAgICB9IGVsc2UgaWYgKGVQYXJlbnRUeXBlID09IFhGQV9FTEVNRU5UX0NhcHRpb24pIHsNCisgICAgICAgICAgcE5vdGlmeS0+T25Ob2RlRXZlbnQodGhpcywgWEZBX05PREVFVkVOVF9WYWx1ZUNoYW5nZWQsIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYWx1ZSwgcFBhcmVudE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gcFBhcmVudE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgICBpZiAocE5vZGUgJiYgcE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9VaSkgew0KKyAgICAgICAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHRoaXMsIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2VkLCBlQXR0cmlidXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYWx1ZSwgcE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9Db21iOiB7DQorICAgICAgICBDWEZBX05vZGUqIHBFZGl0Tm9kZSA9IHRoaXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgWEZBX0VMRU1FTlQgZVVJVHlwZSA9IHBFZGl0Tm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICAgICAgaWYgKHBFZGl0Tm9kZSAmJiAoZVVJVHlwZSA9PSBYRkFfRUxFTUVOVF9EYXRlVGltZUVkaXQgfHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVVSVR5cGUgPT0gWEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQgfHwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVVSVR5cGUgPT0gWEZBX0VMRU1FTlRfVGV4dEVkaXQpKSB7DQorICAgICAgICAgIENYRkFfTm9kZSogcFVJTm9kZSA9IHBFZGl0Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICAgIGlmIChwVUlOb2RlKSB7DQorICAgICAgICAgICAgcE5vdGlmeS0+T25Ob2RlRXZlbnQodGhpcywgWEZBX05PREVFVkVOVF9WYWx1ZUNoYW5nZWQsIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhbHVlLCBwVUlOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVSU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CdXR0b246DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CYXJjb2RlOg0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdDoNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0RhdGVUaW1lRWRpdDoNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX051bWVyaWNFZGl0Og0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfUGFzc3dvcmRFZGl0Og0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfVGV4dEVkaXQ6IHsNCisgICAgICAgIENYRkFfTm9kZSogcFVJTm9kZSA9IHRoaXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgaWYgKHBVSU5vZGUpIHsNCisgICAgICAgICAgcE5vdGlmeS0+T25Ob2RlRXZlbnQodGhpcywgWEZBX05PREVFVkVOVF9WYWx1ZUNoYW5nZWQsIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYWx1ZSwgcFVJTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVJTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9DaGVja0J1dHRvbjogew0KKyAgICAgICAgYk5lZWRGaW5kQ29udGFpbmVyID0gVFJVRTsNCisgICAgICAgIENYRkFfTm9kZSogcFVJTm9kZSA9IHRoaXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgaWYgKHBVSU5vZGUpIHsNCisgICAgICAgICAgcE5vdGlmeS0+T25Ob2RlRXZlbnQodGhpcywgWEZBX05PREVFVkVOVF9WYWx1ZUNoYW5nZWQsIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYWx1ZSwgcFVJTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVJTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9LZWVwOg0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQm9va2VuZDoNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0JyZWFrOg0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQnJlYWtBZnRlcjoNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0JyZWFrQmVmb3JlOg0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfT3ZlcmZsb3c6DQorICAgICAgICBiTmVlZEZpbmRDb250YWluZXIgPSBUUlVFOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9BcmVhOg0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRHJhdzoNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0V4Y2xHcm91cDoNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0ZpZWxkOg0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfU3ViZm9ybToNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQ6DQorICAgICAgICBwTGF5b3V0UHJvLT5BZGRDaGFuZ2VkQ29udGFpbmVyKHRoaXMpOw0KKyAgICAgICAgcE5vdGlmeS0+T25Ob2RlRXZlbnQodGhpcywgWEZBX05PREVFVkVOVF9WYWx1ZUNoYW5nZWQsIGVBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFsdWUsIHRoaXMsIHRoaXMpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9TaGFycHRleHQ6DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9TaGFycHhtbDoNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX1NoYXJweEhUTUw6IHsNCisgICAgICAgIENYRkFfTm9kZSogcFRleHROb2RlID0gdGhpcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICBpZiAoIXBUZXh0Tm9kZSkgew0KKyAgICAgICAgICByZXR1cm47DQorICAgICAgICB9DQorICAgICAgICBDWEZBX05vZGUqIHBWYWx1ZU5vZGUgPSBwVGV4dE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgaWYgKCFwVmFsdWVOb2RlKSB7DQorICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIFhGQV9FTEVNRU5UIGVUeXBlID0gcFZhbHVlTm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICAgICAgaWYgKGVUeXBlID09IFhGQV9FTEVNRU5UX1ZhbHVlKSB7DQorICAgICAgICAgIGJOZWVkRmluZENvbnRhaW5lciA9IFRSVUU7DQorICAgICAgICAgIENYRkFfTm9kZSogcE5vZGUgPSBwVmFsdWVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICAgICAgaWYgKHBOb2RlICYmIHBOb2RlLT5Jc0NvbnRhaW5lck5vZGUoKSkgew0KKyAgICAgICAgICAgIGlmIChiU2NyaXB0TW9kaWZ5KSB7DQorICAgICAgICAgICAgICBwVmFsdWVOb2RlID0gcE5vZGU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHRoaXMsIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2VkLCBlQXR0cmlidXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYWx1ZSwgcFZhbHVlTm9kZSwgcE5vZGUpOw0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHRoaXMsIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2VkLCBlQXR0cmlidXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYWx1ZSwgcE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgaWYgKGVUeXBlID09IFhGQV9FTEVNRU5UX0l0ZW1zKSB7DQorICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBWYWx1ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICAgICAgICAgIGlmIChwTm9kZSAmJiBwTm9kZS0+SXNDb250YWluZXJOb2RlKCkpIHsNCisgICAgICAgICAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHRoaXMsIFhGQV9OT0RFRVZFTlRfVmFsdWVDaGFuZ2VkLCBlQXR0cmlidXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhbHVlLCBwVmFsdWVOb2RlLCBwTm9kZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKGJOZWVkRmluZENvbnRhaW5lcikgew0KKyAgICAgIENYRkFfTm9kZSogcFBhcmVudCA9IHRoaXM7DQorICAgICAgd2hpbGUgKHBQYXJlbnQpIHsNCisgICAgICAgIGlmIChwUGFyZW50LT5Jc0NvbnRhaW5lck5vZGUoKSkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIHBQYXJlbnQgPSBwUGFyZW50LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICB9DQorICAgICAgaWYgKHBQYXJlbnQpIHsNCisgICAgICAgIHBMYXlvdXRQcm8tPkFkZENoYW5nZWRDb250YWluZXIocFBhcmVudCk7DQorICAgICAgfQ0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBwTm90aWZ5LT5Pbk5vZGVFdmVudCh0aGlzLCBYRkFfTk9ERUVWRU5UX1ZhbHVlQ2hhbmdlZCwgZUF0dHJpYnV0ZSwgZVZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCB0aGlzKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIHN6VmFsdWU7DQorICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhoVmFsdWUsIHN6VmFsdWUpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlID0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelZhbHVlLCBzelZhbHVlLkdldExlbmd0aCgpKTsNCisgICAgU2V0QXR0cmlidXRlKGVBdHRyaWJ1dGUsIHdzVmFsdWUsIFRSVUUpOw0KKyAgICBpZiAoZUF0dHJpYnV0ZSA9PSBYRkFfQVRUUklCVVRFX1VzZSAmJg0KKyAgICAgICAgdGhpcy0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0Rlc2MpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1VzZVZhbCA9IHdzVmFsdWUsIHdzSUQsIHdzU09NOw0KKyAgICAgIENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSA9DQorICAgICAgICAgIChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9UZW1wbGF0ZSk7DQorICAgICAgQ1hGQV9Ob2RlKiBwUHJvdG9Sb290ID0NCisgICAgICAgICAgcFRlbXBsYXRlTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfU3ViZm9ybSkNCisgICAgICAgICAgICAgIC0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VMRU1FTlRfUHJvdG8pOw0KKyAgICAgIGlmICghd3NVc2VWYWwuSXNFbXB0eSgpKSB7DQorICAgICAgICBpZiAod3NVc2VWYWxbMF0gPT0gJyMnKSB7DQorICAgICAgICAgIHdzSUQgPSBDRlhfV2lkZVN0cmluZygoY29uc3QgRlhfV0NIQVIqKXdzVXNlVmFsICsgMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzVXNlVmFsLkdldExlbmd0aCgpIC0gMSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICB3c1NPTSA9DQorICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZygoY29uc3QgRlhfV0NIQVIqKXdzVXNlVmFsLCB3c1VzZVZhbC5HZXRMZW5ndGgoKSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIENYRkFfTm9kZSogcFByb3RvTm9kZSA9IE5VTEw7DQorICAgICAgaWYgKCF3c1NPTS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIEZYX0RXT1JEIGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfQXR0cmlidXRlcyB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzOw0KKyAgICAgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc292ZU5vZGVSUzsNCisgICAgICAgIGludDMyX3QgaVJldCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPlJlc29sdmVPYmplY3RzKA0KKyAgICAgICAgICAgIHBQcm90b1Jvb3QsIHdzU09NLCByZXNvdmVOb2RlUlMsIGR3RmxhZyk7DQorICAgICAgICBpZiAoaVJldCA+IDAgJiYgcmVzb3ZlTm9kZVJTLm5vZGVzWzBdLT5Jc05vZGUoKSkgew0KKyAgICAgICAgICBwUHJvdG9Ob2RlID0gKENYRkFfTm9kZSopcmVzb3ZlTm9kZVJTLm5vZGVzWzBdOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSBpZiAoIXdzSUQuSXNFbXB0eSgpKSB7DQorICAgICAgICBwUHJvdG9Ob2RlID0gbV9wRG9jdW1lbnQtPkdldE5vZGVCeUlEKHBQcm90b1Jvb3QsIHdzSUQpOw0KKyAgICAgIH0NCisgICAgICBpZiAocFByb3RvTm9kZSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwSGVhZENoaWxkID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICAgd2hpbGUgKHBIZWFkQ2hpbGQpIHsNCisgICAgICAgICAgQ1hGQV9Ob2RlKiBwU2libGluZyA9DQorICAgICAgICAgICAgICBwSGVhZENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgICAgICBSZW1vdmVDaGlsZChwSGVhZENoaWxkKTsNCisgICAgICAgICAgcEhlYWRDaGlsZCA9IHBTaWJsaW5nOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwUHJvdG9Gb3JtID0gcFByb3RvTm9kZS0+Q2xvbmVUZW1wbGF0ZVRvRm9ybShUUlVFKTsNCisgICAgICAgIHBIZWFkQ2hpbGQgPSBwUHJvdG9Gb3JtLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICB3aGlsZSAocEhlYWRDaGlsZCkgew0KKyAgICAgICAgICBDWEZBX05vZGUqIHBTaWJsaW5nID0NCisgICAgICAgICAgICAgIHBIZWFkQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgICAgIHBQcm90b0Zvcm0tPlJlbW92ZUNoaWxkKHBIZWFkQ2hpbGQpOw0KKyAgICAgICAgICBJbnNlcnRDaGlsZChwSGVhZENoaWxkKTsNCisgICAgICAgICAgcEhlYWRDaGlsZCA9IHBTaWJsaW5nOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbV9wRG9jdW1lbnQtPlJlbW92ZVB1cmdlTm9kZShwUHJvdG9Gb3JtKTsNCisgICAgICAgIGRlbGV0ZSBwUHJvdG9Gb3JtOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgICAgR2V0QXR0cmlidXRlKGVBdHRyaWJ1dGUsIHdzVmFsdWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VVEY4RW5jb2RlKHdzVmFsdWUsIHdzVmFsdWUuR2V0TGVuZ3RoKCkpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nUmVhZChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKCFiU2V0dGluZykgew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgICBHZXRBdHRyaWJ1dGUoZUF0dHJpYnV0ZSwgd3NWYWx1ZSk7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VURjhFbmNvZGUod3NWYWx1ZSwgd3NWYWx1ZS5HZXRMZW5ndGgoKSkpOw0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Xc2RsQ29ubmVjdGlvbl9FeGVjdXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKChhcmdjID09IDApIHx8IChhcmdjID09IDEpKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgRkFMU0UpOw0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJleGVjdXRlIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRGVsdGFfUmVzdG9yZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDApIHsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwicmVzdG9yZSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0RlbHRhX0N1cnJlbnRWYWx1ZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7fQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRGVsdGFfU2F2ZWRWYWx1ZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHt9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9EZWx0YV9UYXJnZXQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkge30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvbV9NZXNzYWdlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1NPTV9NRVNTQUdFVFlQRSBpTWVzc2FnZVR5cGUpIHsNCisgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQorICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0JPT0wgYk5ldyA9IEZBTFNFOw0KKyAgQ1hGQV9WYWxpZGF0ZSB2YWxpZGF0ZSA9IHBXaWRnZXREYXRhLT5HZXRWYWxpZGF0ZSgpOw0KKyAgaWYgKCF2YWxpZGF0ZSkgew0KKyAgICB2YWxpZGF0ZSA9IHBXaWRnZXREYXRhLT5HZXRWYWxpZGF0ZShUUlVFKTsNCisgICAgYk5ldyA9IFRSVUU7DQorICB9DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNNZXNzYWdlOw0KKyAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBic01lc3NhZ2UpOw0KKyAgICBzd2l0Y2ggKGlNZXNzYWdlVHlwZSkgew0KKyAgICAgIGNhc2UgWEZBX1NPTV9WYWxpZGF0aW9uTWVzc2FnZToNCisgICAgICAgIHZhbGlkYXRlLlNldFNjcmlwdE1lc3NhZ2VUZXh0KA0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic01lc3NhZ2UsIGJzTWVzc2FnZS5HZXRMZW5ndGgoKSkpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfU09NX0Zvcm1hdE1lc3NhZ2U6DQorICAgICAgICB2YWxpZGF0ZS5TZXRGb3JtYXRNZXNzYWdlVGV4dCgNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNNZXNzYWdlLCBic01lc3NhZ2UuR2V0TGVuZ3RoKCkpKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX1NPTV9NYW5kYXRvcnlNZXNzYWdlOg0KKyAgICAgICAgdmFsaWRhdGUuU2V0TnVsbE1lc3NhZ2VUZXh0KA0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic01lc3NhZ2UsIGJzTWVzc2FnZS5HZXRMZW5ndGgoKSkpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmICghYk5ldykgew0KKyAgICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgICAgcE5vdGlmeS0+QWRkQ2FsY1ZhbGlkYXRlKHRoaXMpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2U7DQorICAgIHN3aXRjaCAoaU1lc3NhZ2VUeXBlKSB7DQorICAgICAgY2FzZSBYRkFfU09NX1ZhbGlkYXRpb25NZXNzYWdlOg0KKyAgICAgICAgdmFsaWRhdGUuR2V0U2NyaXB0TWVzc2FnZVRleHQod3NNZXNzYWdlKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX1NPTV9Gb3JtYXRNZXNzYWdlOg0KKyAgICAgICAgdmFsaWRhdGUuR2V0Rm9ybWF0TWVzc2FnZVRleHQod3NNZXNzYWdlKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX1NPTV9NYW5kYXRvcnlNZXNzYWdlOg0KKyAgICAgICAgdmFsaWRhdGUuR2V0TnVsbE1lc3NhZ2VUZXh0KHdzTWVzc2FnZSk7DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NNZXNzYWdlKSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX1ZhbGlkYXRpb25NZXNzYWdlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIFNjcmlwdF9Tb21fTWVzc2FnZShoVmFsdWUsIGJTZXR0aW5nLCBYRkFfU09NX1ZhbGlkYXRpb25NZXNzYWdlKTsNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9MZW5ndGgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIDApOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgcFdpZGdldERhdGEtPkNvdW50Q2hvaWNlTGlzdEl0ZW1zKFRSVUUpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgWEZBX0VMRU1FTlQgY2xhc3NJRCA9IEdldENsYXNzSUQoKTsNCisgIGlmIChjbGFzc0lEID09IFhGQV9FTEVNRU5UX0ZpZWxkKSB7DQorICAgIFNjcmlwdF9GaWVsZF9EZWZhdWx0VmFsdWUoaFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7DQorICAgIHJldHVybjsNCisgIH0gZWxzZSBpZiAoY2xhc3NJRCA9PSBYRkFfRUxFTUVOVF9EcmF3KSB7DQorICAgIFNjcmlwdF9EcmF3X0RlZmF1bHRWYWx1ZShoVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsNCisgICAgcmV0dXJuOw0KKyAgfSBlbHNlIGlmIChjbGFzc0lEID09IFhGQV9FTEVNRU5UX0Jvb2xlYW4pIHsNCisgICAgU2NyaXB0X0Jvb2xlYW5fVmFsdWUoaFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChiU2V0dGluZykgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBuZXdWYWx1ZTsNCisgICAgaWYgKCEoRlhKU0VfVmFsdWVfSXNOdWxsKGhWYWx1ZSkgfHwgRlhKU0VfVmFsdWVfSXNVbmRlZmluZWQoaFZhbHVlKSkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBuZXdWYWx1ZSk7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOZXdWYWx1ZSA9DQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgobmV3VmFsdWUsIG5ld1ZhbHVlLkdldExlbmd0aCgpKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXRWYWx1ZSh3c05ld1ZhbHVlKTsNCisgICAgQ1hGQV9XaWRnZXREYXRhKiBwQ29udGFpbmVyV2lkZ2V0RGF0YSA9IE5VTEw7DQorICAgIGlmIChHZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpIHsNCisgICAgICBDWEZBX05vZGVBcnJheSBmb3JtTm9kZXM7DQorICAgICAgdGhpcy0+R2V0QmluZEl0ZW1zKGZvcm1Ob2Rlcyk7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQaWN0dXJlOw0KKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGZvcm1Ob2Rlcy5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwRm9ybU5vZGUgPSBmb3JtTm9kZXMuR2V0QXQoaSk7DQorICAgICAgICBpZiAoIXBGb3JtTm9kZSB8fCBwRm9ybU5vZGUtPkhhc0ZsYWcoWEZBX05PREVGTEFHX0hhc1JlbW92ZWQpKSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcENvbnRhaW5lcldpZGdldERhdGEgPSBwRm9ybU5vZGUtPkdldENvbnRhaW5lcldpZGdldERhdGEoKTsNCisgICAgICAgIGlmIChwQ29udGFpbmVyV2lkZ2V0RGF0YSkgew0KKyAgICAgICAgICBwQ29udGFpbmVyV2lkZ2V0RGF0YS0+R2V0UGljdHVyZUNvbnRlbnQod3NQaWN0dXJlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1ZBTFVFUElDVFVSRV9EYXRhQmluZCk7DQorICAgICAgICB9DQorICAgICAgICBpZiAoIXdzUGljdHVyZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBwQ29udGFpbmVyV2lkZ2V0RGF0YSA9IE5VTEw7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKEdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9Gb3JtKSB7DQorICAgICAgcENvbnRhaW5lcldpZGdldERhdGEgPSBHZXRDb250YWluZXJXaWRnZXREYXRhKCk7DQorICAgIH0NCisgICAgaWYgKHBDb250YWluZXJXaWRnZXREYXRhKSB7DQorICAgICAgcENvbnRhaW5lcldpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c05ld1ZhbHVlLCB3c0Zvcm1hdFZhbHVlKTsNCisgICAgfQ0KKyAgICBTZXRTY3JpcHRDb250ZW50KHdzTmV3VmFsdWUsIHdzRm9ybWF0VmFsdWUsIFRSVUUsIFRSVUUpOw0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgY29udGVudCA9IEdldFNjcmlwdENvbnRlbnQoVFJVRSk7DQorICAgIGlmIChjb250ZW50LklzRW1wdHkoKSAmJiBjbGFzc0lEICE9IFhGQV9FTEVNRU5UX1RleHQgJiYNCisgICAgICAgIGNsYXNzSUQgIT0gWEZBX0VMRU1FTlRfU3VibWl0VXJsKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChoVmFsdWUpOw0KKyAgICB9IGVsc2UgaWYgKGNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfSW50ZWdlcikgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBGWFNZU193dG9pKGNvbnRlbnQpKTsNCisgICAgfSBlbHNlIGlmIChjbGFzc0lEID09IFhGQV9FTEVNRU5UX0Zsb2F0IHx8IGNsYXNzSUQgPT0gWEZBX0VMRU1FTlRfRGVjaW1hbCkgew0KKyAgICAgIENGWF9EZWNpbWFsIGRlY2ltYWwoY29udGVudCk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0RmxvYXQoaFZhbHVlLCAoRlhfRkxPQVQpKGRvdWJsZSlkZWNpbWFsKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VURjhFbmNvZGUoY29udGVudCwgY29udGVudC5HZXRMZW5ndGgoKSkpOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZV9SZWFkKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmIChiU2V0dGluZykgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyBjb250ZW50ID0gR2V0U2NyaXB0Q29udGVudChUUlVFKTsNCisgIGlmIChjb250ZW50LklzRW1wdHkoKSkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGhWYWx1ZSk7DQorICB9IGVsc2Ugew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VVEY4RW5jb2RlKGNvbnRlbnQsIGNvbnRlbnQuR2V0TGVuZ3RoKCkpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Cb29sZWFuX1ZhbHVlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIG5ld1ZhbHVlOw0KKyAgICBpZiAoIShGWEpTRV9WYWx1ZV9Jc051bGwoaFZhbHVlKSB8fCBGWEpTRV9WYWx1ZV9Jc1VuZGVmaW5lZChoVmFsdWUpKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhoVmFsdWUsIG5ld1ZhbHVlKTsNCisgICAgfQ0KKyAgICBpbnQzMl90IGlWYWx1ZSA9IEZYU1lTX2F0b2kobmV3VmFsdWUpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c05ld1ZhbHVlID0gKGlWYWx1ZSA9PSAwKSA/IEZYX1dTVFJDKEwiMCIpIDogRlhfV1NUUkMoTCIxIik7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0VmFsdWUod3NOZXdWYWx1ZSk7DQorICAgIENYRkFfV2lkZ2V0RGF0YSogcENvbnRhaW5lcldpZGdldERhdGEgPSBHZXRDb250YWluZXJXaWRnZXREYXRhKCk7DQorICAgIGlmIChwQ29udGFpbmVyV2lkZ2V0RGF0YSkgew0KKyAgICAgIHBDb250YWluZXJXaWRnZXREYXRhLT5HZXRGb3JtYXREYXRhVmFsdWUod3NOZXdWYWx1ZSwgd3NGb3JtYXRWYWx1ZSk7DQorICAgIH0NCisgICAgU2V0U2NyaXB0Q29udGVudCh3c05ld1ZhbHVlLCB3c0Zvcm1hdFZhbHVlLCBUUlVFLCBUUlVFKTsNCisgIH0gZWxzZSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUgPSBHZXRTY3JpcHRDb250ZW50KFRSVUUpOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGhWYWx1ZSwgd3NWYWx1ZS5FcXVhbChGWF9XU1RSQyhMIjEiKSkpOw0KKyAgfQ0KK30NCitzdHJ1Y3QgWEZBX0V4ZWNFdmVudFBhcmFJbmZvIHsNCisgcHVibGljOg0KKyAgdWludDMyX3QgbV91SGFzaDsNCisgIGNvbnN0IEZYX1dDSEFSKiBtX2xwY0V2ZW50TmFtZTsNCisgIFhGQV9FVkVOVFRZUEUgbV9ldmVudFR5cGU7DQorICB1aW50MzJfdCBtX3ZhbGlkRmxhZ3M7DQorfTsNCitzdGF0aWMgY29uc3QgWEZBX0V4ZWNFdmVudFBhcmFJbmZvIGdzX2V2ZW50UGFyYUluZm9zW10gPSB7DQorICAgIHsweDAyYTZjNTVhLCBMInBvc3RTdWJtaXQiLCBYRkFfRVZFTlRfUG9zdFN1Ym1pdCwgMH0sDQorICAgIHsweDBhYjQ2NmJiLCBMInByZVN1Ym1pdCIsIFhGQV9FVkVOVF9QcmVTdWJtaXQsIDB9LA0KKyAgICB7MHgxMDlkN2NlNywgTCJtb3VzZUVudGVyIiwgWEZBX0VWRU5UX01vdXNlRW50ZXIsIDV9LA0KKyAgICB7MHgxN2ZhZDM3MywgTCJwb3N0UHJpbnQiLCBYRkFfRVZFTlRfUG9zdFByaW50LCAwfSwNCisgICAgezB4MWJmYzcyZDksIEwicHJlT3BlbiIsIFhGQV9FVkVOVF9QcmVPcGVuLCA3fSwNCisgICAgezB4MjE5NmE0NTIsIEwiaW5pdGlhbGl6ZSIsIFhGQV9FVkVOVF9Jbml0aWFsaXplLCAxfSwNCisgICAgezB4Mjc0MTBmMDMsIEwibW91c2VFeGl0IiwgWEZBX0VWRU5UX01vdXNlRXhpdCwgNX0sDQorICAgIHsweDMzYzQzZGVjLCBMImRvY0Nsb3NlIiwgWEZBX0VWRU5UX0RvY0Nsb3NlLCAwfSwNCisgICAgezB4MzYxZmExYjYsIEwicHJlU2F2ZSIsIFhGQV9FVkVOVF9QcmVTYXZlLCAwfSwNCisgICAgezB4MzZmMWM2ZDgsIEwicHJlU2lnbiIsIFhGQV9FVkVOVF9QcmVTaWduLCA2fSwNCisgICAgezB4NDczMWQ2YmEsIEwiZXhpdCIsIFhGQV9FVkVOVF9FeGl0LCAyfSwNCisgICAgezB4NTZiZjQ1NmIsIEwiZG9jUmVhZHkiLCBYRkFfRVZFTlRfRG9jUmVhZHksIDB9LA0KKyAgICB7MHg3MjMzMDE4YSwgTCJ2YWxpZGF0ZSIsIFhGQV9FVkVOVF9WYWxpZGF0ZSwgMX0sDQorICAgIHsweDg4MDgzODVlLCBMImluZGV4Q2hhbmdlIiwgWEZBX0VWRU5UX0luZGV4Q2hhbmdlLCAzfSwNCisgICAgezB4ODkxZjQ2MDYsIEwiY2hhbmdlIiwgWEZBX0VWRU5UX0NoYW5nZSwgNH0sDQorICAgIHsweDk1MjhhN2I0LCBMInByZVByaW50IiwgWEZBX0VWRU5UX1ByZVByaW50LCAwfSwNCisgICAgezB4OWY2OTNiMjEsIEwibW91c2VEb3duIiwgWEZBX0VWRU5UX01vdXNlRG93biwgNX0sDQorICAgIHsweGNkY2U1NmIzLCBMImZ1bGwiLCBYRkFfRVZFTlRfRnVsbCwgNH0sDQorICAgIHsweGQ1NzZkMDhlLCBMIm1vdXNlVXAiLCBYRkFfRVZFTlRfTW91c2VVcCwgNX0sDQorICAgIHsweGQ5NTY1N2E2LCBMImNsaWNrIiwgWEZBX0VWRU5UX0NsaWNrLCA0fSwNCisgICAgezB4ZGJmYmUwMmUsIEwiY2FsY3VsYXRlIiwgWEZBX0VWRU5UX0NhbGN1bGF0ZSwgMX0sDQorICAgIHsweGUyNWZhN2I4LCBMInBvc3RPcGVuIiwgWEZBX0VWRU5UX1Bvc3RPcGVuLCA3fSwNCisgICAgezB4ZTI4ZGNlN2UsIEwiZW50ZXIiLCBYRkFfRVZFTlRfRW50ZXIsIDJ9LA0KKyAgICB7MHhmYzgyZDY5NSwgTCJwb3N0U2F2ZSIsIFhGQV9FVkVOVF9Qb3N0U2F2ZSwgMH0sDQorICAgIHsweGZkNTRmYmI3LCBMInBvc3RTaWduIiwgWEZBX0VWRU5UX1Bvc3RTaWduLCA2fSwNCit9Ow0KK2NvbnN0IFhGQV9FeGVjRXZlbnRQYXJhSW5mbyogR2V0RXZlbnRQYXJhSW5mb0J5TmFtZSgNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0V2ZW50TmFtZSkgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gd3NFdmVudE5hbWUuR2V0TGVuZ3RoKCk7DQorICB1aW50MzJfdCB1SGFzaCA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzRXZlbnROYW1lLkdldFB0cigpLCBpTGVuZ3RoKTsNCisgIGNvbnN0IFhGQV9FeGVjRXZlbnRQYXJhSW5mbyogZXZlbnRQYXJhSW5mbyA9IE5VTEw7DQorICBpbnQzMl90IGlTdGFydCA9IDAsDQorICAgICAgICAgIGlFbmQgPSAoc2l6ZW9mKGdzX2V2ZW50UGFyYUluZm9zKSAvIHNpemVvZihnc19ldmVudFBhcmFJbmZvc1swXSkpIC0gMTsNCisgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7DQorICBkbyB7DQorICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICBldmVudFBhcmFJbmZvID0gJmdzX2V2ZW50UGFyYUluZm9zW2lNaWRdOw0KKyAgICBpZiAodUhhc2ggPT0gZXZlbnRQYXJhSW5mby0+bV91SGFzaCkgew0KKyAgICAgIHJldHVybiBldmVudFBhcmFJbmZvOw0KKyAgICB9IGVsc2UgaWYgKHVIYXNoIDwgZXZlbnRQYXJhSW5mby0+bV91SGFzaCkgew0KKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgfQ0KKyAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK3ZvaWQgWEZBX1NUUklOR19UT19SR0IoQ0ZYX1dpZGVTdHJpbmcmIHN0clJHQiwNCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHIsDQorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgYikgew0KKyAgciA9IDA7DQorICBnID0gMDsNCisgIGIgPSAwOw0KKyAgRlhfV0NIQVIgemVybyA9ICcwJzsNCisgIGludDMyX3QgaUluZGV4ID0gMDsNCisgIGludDMyX3QgaUxlbiA9IHN0clJHQi5HZXRMZW5ndGgoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMZW47ICsraSkgew0KKyAgICBGWF9XQ0hBUiBjaCA9IHN0clJHQi5HZXRBdChpKTsNCisgICAgaWYgKGNoID09IEwnLCcpIHsNCisgICAgICArK2lJbmRleDsNCisgICAgfQ0KKyAgICBpZiAoaUluZGV4ID4gMikgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGludDMyX3QgaVZhbHVlID0gY2ggLSB6ZXJvOw0KKyAgICBpZiAoaVZhbHVlID49IDAgJiYgaVZhbHVlIDw9IDkpIHsNCisgICAgICBzd2l0Y2ggKGlJbmRleCkgew0KKyAgICAgICAgY2FzZSAwOg0KKyAgICAgICAgICByID0gciAqIDEwICsgaVZhbHVlOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgMToNCisgICAgICAgICAgZyA9IGcgKiAxMCArIGlWYWx1ZTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBiID0gYiAqIDEwICsgaVZhbHVlOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fQm9yZGVyQ29sb3IoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgIGlmICghcFdpZGdldERhdGEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Cb3JkZXIgYm9yZGVyID0gcFdpZGdldERhdGEtPkdldEJvcmRlcihUUlVFKTsNCisgIGludDMyX3QgaVNpemUgPSBib3JkZXIuQ291bnRFZGdlcygpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgc3RyQ29sb3I7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNWYWx1ZTsNCisgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNWYWx1ZSk7DQorICAgIHN0ckNvbG9yID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUsIGJzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KKyAgICBpbnQzMl90IHIgPSAwLCBnID0gMCwgYiA9IDA7DQorICAgIFhGQV9TVFJJTkdfVE9fUkdCKHN0ckNvbG9yLCByLCBnLCBiKTsNCisgICAgRlhfQVJHQiByZ2IgPSBBcmdiRW5jb2RlKDEwMCwgciwgZywgYik7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTaXplOyArK2kpIHsNCisgICAgICBDWEZBX0VkZ2UgZWRnZSA9IGJvcmRlci5HZXRFZGdlKGkpOw0KKyAgICAgIGVkZ2UuU2V0Q29sb3IocmdiKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9FZGdlIGVkZ2UgPSBib3JkZXIuR2V0RWRnZSgwKTsNCisgICAgRlhfQVJHQiBjb2xvciA9IGVkZ2UuR2V0Q29sb3IoKTsNCisgICAgaW50MzJfdCBhLCByLCBnLCBiOw0KKyAgICBBcmdiRGVjb2RlKGNvbG9yLCBhLCByLCBnLCBiKTsNCisgICAgc3RyQ29sb3IuRm9ybWF0KEwiJWQsJWQsJWQiLCByLCBnLCBiKTsNCisgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUoc3RyQ29sb3IpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fQm9yZGVyV2lkdGgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgIGlmICghcFdpZGdldERhdGEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Cb3JkZXIgYm9yZGVyID0gcFdpZGdldERhdGEtPkdldEJvcmRlcihUUlVFKTsNCisgIGludDMyX3QgaVNpemUgPSBib3JkZXIuQ291bnRFZGdlcygpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUaGlja25lc3M7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNWYWx1ZTsNCisgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNWYWx1ZSk7DQorICAgIHdzVGhpY2tuZXNzID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUsIGJzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgKytpKSB7DQorICAgICAgQ1hGQV9FZGdlIGVkZ2UgPSBib3JkZXIuR2V0RWRnZShpKTsNCisgICAgICBDWEZBX01lYXN1cmVtZW50IHRoaWNrbmVzcyh3c1RoaWNrbmVzcyk7DQorICAgICAgZWRnZS5TZXRNU1RoaWNrbmVzcyh0aGlja25lc3MpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX0VkZ2UgZWRnZSA9IGJvcmRlci5HZXRFZGdlKDApOw0KKyAgICBDWEZBX01lYXN1cmVtZW50IHRoaWNrbmVzcyA9IGVkZ2UuR2V0TVNUaGlja25lc3MoKTsNCisgICAgdGhpY2tuZXNzLlRvU3RyaW5nKHdzVGhpY2tuZXNzKTsNCisgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NUaGlja25lc3MpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fRmlsbENvbG9yKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgIGlmICghcFdpZGdldERhdGEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Cb3JkZXIgYm9yZGVyID0gcFdpZGdldERhdGEtPkdldEJvcmRlcihUUlVFKTsNCisgIENYRkFfRmlsbCBib3JkZXJmaWxsID0gYm9yZGVyLkdldEZpbGwoVFJVRSk7DQorICBDWEZBX05vZGUqIHBOb2RlID0gKENYRkFfTm9kZSopYm9yZGVyZmlsbDsNCisgIGlmICghcE5vZGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NDb2xvcjsNCisgIGlmIChiU2V0dGluZykgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic1ZhbHVlOw0KKyAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBic1ZhbHVlKTsNCisgICAgd3NDb2xvciA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1ZhbHVlLCBic1ZhbHVlLkdldExlbmd0aCgpKTsNCisgICAgaW50MzJfdCByLCBnLCBiOw0KKyAgICBYRkFfU1RSSU5HX1RPX1JHQih3c0NvbG9yLCByLCBnLCBiKTsNCisgICAgRlhfQVJHQiBjb2xvciA9IEFyZ2JFbmNvZGUoMHhmZiwgciwgZywgYik7DQorICAgIGJvcmRlcmZpbGwuU2V0Q29sb3IoY29sb3IpOw0KKyAgfSBlbHNlIHsNCisgICAgRlhfQVJHQiBjb2xvciA9IGJvcmRlcmZpbGwuR2V0Q29sb3IoKTsNCisgICAgaW50MzJfdCBhLCByLCBnLCBiOw0KKyAgICBBcmdiRGVjb2RlKGNvbG9yLCBhLCByLCBnLCBiKTsNCisgICAgd3NDb2xvci5Gb3JtYXQoTCIlZCwlZCwlZCIsIHIsIGcsIGIpOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c0NvbG9yKSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RhdGFOb2RlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmICghYlNldHRpbmcpIHsNCisgICAgQ1hGQV9Ob2RlKiBwRGF0YU5vZGUgPSBHZXRCaW5kRGF0YSgpOw0KKyAgICBpZiAocERhdGFOb2RlKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0KA0KKyAgICAgICAgICBoVmFsdWUsDQorICAgICAgICAgIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBEYXRhTm9kZSkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoaFZhbHVlKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9EcmF3X0RlZmF1bHRWYWx1ZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIGlmIChGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoaFZhbHVlKSkgew0KKyAgICAgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQorICAgICAgRlhTWVNfYXNzZXJ0KHBXaWRnZXREYXRhKTsNCisgICAgICBYRkFfRUxFTUVOVCB1aVR5cGUgPSBwV2lkZ2V0RGF0YS0+R2V0VUlUeXBlKCk7DQorICAgICAgaWYgKHVpVHlwZSA9PSBYRkFfRUxFTUVOVF9UZXh0KSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBuZXdWYWx1ZTsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhoVmFsdWUsIG5ld1ZhbHVlKTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTmV3VmFsdWUgPQ0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChuZXdWYWx1ZSwgbmV3VmFsdWUuR2V0TGVuZ3RoKCkpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXRWYWx1ZSh3c05ld1ZhbHVlKTsNCisgICAgICAgIFNldFNjcmlwdENvbnRlbnQod3NOZXdWYWx1ZSwgd3NGb3JtYXRWYWx1ZSwgVFJVRSwgVFJVRSk7DQorICAgICAgfSBlbHNlIGlmICh1aVR5cGUgIT0gWEZBX0VMRU1FTlRfSW1hZ2UpIHsNCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIENGWF9XaWRlU3RyaW5nIGNvbnRlbnQgPSBHZXRTY3JpcHRDb250ZW50KFRSVUUpOw0KKyAgICBpZiAoY29udGVudC5Jc0VtcHR5KCkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXROdWxsKGhWYWx1ZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VVEY4RW5jb2RlKGNvbnRlbnQsIGNvbnRlbnQuR2V0TGVuZ3RoKCkpKTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0RlZmF1bHRWYWx1ZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChoVmFsdWUpKSB7DQorICAgICAgcFdpZGdldERhdGEtPm1fYlByZU51bGwgPSBwV2lkZ2V0RGF0YS0+bV9iSXNOdWxsOw0KKyAgICAgIHBXaWRnZXREYXRhLT5tX2JJc051bGwgPSBUUlVFOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHBXaWRnZXREYXRhLT5tX2JQcmVOdWxsID0gcFdpZGdldERhdGEtPm1fYklzTnVsbDsNCisgICAgICBwV2lkZ2V0RGF0YS0+bV9iSXNOdWxsID0gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZYX0J5dGVTdHJpbmcgbmV3VmFsdWU7DQorICAgIGlmICghKEZYSlNFX1ZhbHVlX0lzTnVsbChoVmFsdWUpIHx8IEZYSlNFX1ZhbHVlX0lzVW5kZWZpbmVkKGhWYWx1ZSkpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgbmV3VmFsdWUpOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTmV3VGV4dCA9DQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgobmV3VmFsdWUsIG5ld1ZhbHVlLkdldExlbmd0aCgpKTsNCisgICAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IHBXaWRnZXREYXRhLT5HZXRVSUNoaWxkKCk7DQorICAgIGlmIChwVUlDaGlsZC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX051bWVyaWNFZGl0KSB7DQorICAgICAgaW50MzJfdCBpTGVhZERpZ2l0cyA9IDA7DQorICAgICAgaW50MzJfdCBpRnJhY0RpZ2l0cyA9IDA7DQorICAgICAgcFdpZGdldERhdGEtPkdldExlYWREaWdpdHMoaUxlYWREaWdpdHMpOw0KKyAgICAgIHBXaWRnZXREYXRhLT5HZXRGcmFjRGlnaXRzKGlGcmFjRGlnaXRzKTsNCisgICAgICB3c05ld1RleHQgPSBYRkFfTnVtZXJpY0xpbWl0KHdzTmV3VGV4dCwgaUxlYWREaWdpdHMsIGlGcmFjRGlnaXRzKTsNCisgICAgfQ0KKyAgICBDWEZBX1dpZGdldERhdGEqIHBDb250YWluZXJXaWRnZXREYXRhID0gR2V0Q29udGFpbmVyV2lkZ2V0RGF0YSgpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdFRleHQod3NOZXdUZXh0KTsNCisgICAgaWYgKHBDb250YWluZXJXaWRnZXREYXRhKSB7DQorICAgICAgcENvbnRhaW5lcldpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c05ld1RleHQsIHdzRm9ybWF0VGV4dCk7DQorICAgIH0NCisgICAgU2V0U2NyaXB0Q29udGVudCh3c05ld1RleHQsIHdzRm9ybWF0VGV4dCwgVFJVRSwgVFJVRSk7DQorICB9IGVsc2Ugew0KKyAgICBDRlhfV2lkZVN0cmluZyBjb250ZW50ID0gR2V0U2NyaXB0Q29udGVudChUUlVFKTsNCisgICAgaWYgKGNvbnRlbnQuSXNFbXB0eSgpKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChoVmFsdWUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBwV2lkZ2V0RGF0YS0+R2V0VUlDaGlsZCgpOw0KKyAgICAgIFhGQV9FTEVNRU5UIGVVSSA9IHBVSUNoaWxkLT5HZXRDbGFzc0lEKCk7DQorICAgICAgQ1hGQV9WYWx1ZSBkZWZWYWwgPSBwV2lkZ2V0RGF0YS0+R2V0Rm9ybVZhbHVlKCk7DQorICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IGRlZlZhbC5HZXROb2RlKCktPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICBpZiAocE5vZGUgJiYgcE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9EZWNpbWFsKSB7DQorICAgICAgICBpZiAoZVVJID09IFhGQV9FTEVNRU5UX051bWVyaWNFZGl0ICYmDQorICAgICAgICAgICAgKHBOb2RlLT5HZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfRnJhY0RpZ2l0cykgPT0gLTEpKSB7DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoDQorICAgICAgICAgICAgICBoVmFsdWUsIEZYX1VURjhFbmNvZGUoY29udGVudCwgY29udGVudC5HZXRMZW5ndGgoKSkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgQ0ZYX0RlY2ltYWwgZGVjaW1hbChjb250ZW50KTsNCisgICAgICAgICAgRlhKU0VfVmFsdWVfU2V0RmxvYXQoaFZhbHVlLCAoRlhfRkxPQVQpKGRvdWJsZSlkZWNpbWFsKTsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2UgaWYgKHBOb2RlICYmIHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfSW50ZWdlcikgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIEZYU1lTX3d0b2koY29udGVudCkpOw0KKyAgICAgIH0gZWxzZSBpZiAocE5vZGUgJiYgcE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9Cb29sZWFuKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKGhWYWx1ZSwgRlhTWVNfd3RvaShjb250ZW50KSA9PSAwID8gRkFMU0UgOiBUUlVFKTsNCisgICAgICB9IGVsc2UgaWYgKHBOb2RlICYmIHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRmxvYXQpIHsNCisgICAgICAgIENGWF9EZWNpbWFsIGRlY2ltYWwoY29udGVudCk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRGbG9hdChoVmFsdWUsIChGWF9GTE9BVCkoZG91YmxlKWRlY2ltYWwpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVVRGOEVuY29kZShjb250ZW50LCBjb250ZW50LkdldExlbmd0aCgpKSk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRWRpdFZhbHVlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQorICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNWYWx1ZTsNCisgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNWYWx1ZSk7DQorICAgIHdzVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNWYWx1ZSwgYnNWYWx1ZS5HZXRMZW5ndGgoKSk7DQorICAgIHBXaWRnZXREYXRhLT5TZXRWYWx1ZSh3c1ZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFX0VkaXQpOw0KKyAgfSBlbHNlIHsNCisgICAgcFdpZGdldERhdGEtPkdldFZhbHVlKHdzVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCk7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVmFsdWUpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fRm9udENvbG9yKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgIGlmICghcFdpZGdldERhdGEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Gb250IGZvbnQgPSBwV2lkZ2V0RGF0YS0+R2V0Rm9udChUUlVFKTsNCisgIENYRkFfTm9kZSogcE5vZGUgPSAoQ1hGQV9Ob2RlKilmb250Ow0KKyAgaWYgKCFwTm9kZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0NvbG9yOw0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzVmFsdWU7DQorICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhoVmFsdWUsIGJzVmFsdWUpOw0KKyAgICB3c0NvbG9yID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUsIGJzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KKyAgICBpbnQzMl90IHIsIGcsIGI7DQorICAgIFhGQV9TVFJJTkdfVE9fUkdCKHdzQ29sb3IsIHIsIGcsIGIpOw0KKyAgICBGWF9BUkdCIGNvbG9yID0gQXJnYkVuY29kZSgweGZmLCByLCBnLCBiKTsNCisgICAgZm9udC5TZXRDb2xvcihjb2xvcik7DQorICB9IGVsc2Ugew0KKyAgICBGWF9BUkdCIGNvbG9yID0gZm9udC5HZXRDb2xvcigpOw0KKyAgICBpbnQzMl90IGEsIHIsIGcsIGI7DQorICAgIEFyZ2JEZWNvZGUoY29sb3IsIGEsIHIsIGcsIGIpOw0KKyAgICB3c0NvbG9yLkZvcm1hdChMIiVkLCVkLCVkIiwgciwgZywgYik7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzQ29sb3IpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9Gb3JtYXRNZXNzYWdlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgU2NyaXB0X1NvbV9NZXNzYWdlKGhWYWx1ZSwgYlNldHRpbmcsIFhGQV9TT01fRm9ybWF0TWVzc2FnZSk7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRm9ybWF0dGVkVmFsdWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQorICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNWYWx1ZTsNCisgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNWYWx1ZSk7DQorICAgIHdzVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNWYWx1ZSwgYnNWYWx1ZS5HZXRMZW5ndGgoKSk7DQorICAgIHBXaWRnZXREYXRhLT5TZXRWYWx1ZSh3c1ZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpOw0KKyAgfSBlbHNlIHsNCisgICAgcFdpZGdldERhdGEtPkdldFZhbHVlKHdzVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVmFsdWUpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fTWFuZGF0b3J5KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgIGlmICghcFdpZGdldERhdGEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9WYWxpZGF0ZSB2YWxpZGF0ZSA9IHBXaWRnZXREYXRhLT5HZXRWYWxpZGF0ZShUUlVFKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNWYWx1ZTsNCisgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNWYWx1ZSk7DQorICAgIHdzVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNWYWx1ZSwgYnNWYWx1ZS5HZXRMZW5ndGgoKSk7DQorICAgIHZhbGlkYXRlLlNldE51bGxUZXN0KHdzVmFsdWUpOw0KKyAgfSBlbHNlIHsNCisgICAgaW50MzJfdCBpVmFsdWUgPSB2YWxpZGF0ZS5HZXROdWxsVGVzdCgpOw0KKyAgICBYRkFfTFBDQVRUUklCVVRFRU5VTUlORk8gcEluZm8gPQ0KKyAgICAgICAgWEZBX0dldEF0dHJpYnV0ZUVudW1CeUlEKChYRkFfQVRUUklCVVRFRU5VTSlpVmFsdWUpOw0KKyAgICBpZiAocEluZm8pIHsNCisgICAgICB3c1ZhbHVlID0gcEluZm8tPnBOYW1lOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVmFsdWUpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fTWFuZGF0b3J5TWVzc2FnZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgU2NyaXB0X1NvbV9NZXNzYWdlKGhWYWx1ZSwgYlNldHRpbmcsIFhGQV9TT01fTWFuZGF0b3J5TWVzc2FnZSk7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfUGFyZW50U3ViZm9ybShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmIChiU2V0dGluZykgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KKyAgfSBlbHNlIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChoVmFsdWUpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX1NlbGVjdGVkSW5kZXgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgaW50MzJfdCBpSW5kZXggPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoaFZhbHVlKTsNCisgICAgaWYgKGlJbmRleCA9PSAtMSkgew0KKyAgICAgIHBXaWRnZXREYXRhLT5DbGVhckFsbFNlbGVjdGlvbnMoKTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgcFdpZGdldERhdGEtPlNldEl0ZW1TdGF0ZShpSW5kZXgsIFRSVUUsIFRSVUUsIFRSVUUpOw0KKyAgfSBlbHNlIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIHBXaWRnZXREYXRhLT5HZXRTZWxlY3RlZEl0ZW0oKSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfQ2xlYXJJdGVtcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBwV2lkZ2V0RGF0YS0+RGVsZXRlSXRlbSgtMSwgVFJVRSk7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRXhlY0V2ZW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMSkgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBldmVudFN0cmluZyA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICAgIGludDMyX3QgaVJldCA9IGV4ZWNTaW5nbGVFdmVudEJ5TmFtZSgNCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChldmVudFN0cmluZywgZXZlbnRTdHJpbmcuR2V0TGVuZ3RoKCkpLA0KKyAgICAgICAgWEZBX0VMRU1FTlRfRmllbGQpOw0KKyAgICBpZiAoZXZlbnRTdHJpbmcgPT0gInZhbGlkYXRlIikgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaVJldCA9PSBYRkFfRVZFTlRFUlJPUl9FcnJvcikgPyBGQUxTRSA6IFRSVUUpKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJleGVjRXZlbnQiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9FeGVjSW5pdGlhbGl6ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDApIHsNCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgWEZBX0VWRU5UX0luaXRpYWxpemUsIEZBTFNFLCBGQUxTRSk7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImV4ZWNJbml0aWFsaXplIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRGVsZXRlSXRlbShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoICE9IDEpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJkZWxldGVJdGVtIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQorICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgaUluZGV4ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCk7DQorICBGWF9CT09MIGJWYWx1ZSA9IHBXaWRnZXREYXRhLT5EZWxldGVJdGVtKGlJbmRleCwgVFJVRSwgVFJVRSk7DQorICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCisgIGlmIChoVmFsdWUpIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihoVmFsdWUsIGJWYWx1ZSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfR2V0U2F2ZUl0ZW0oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCAhPSAxKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiZ2V0U2F2ZUl0ZW0iKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpSW5kZXggPSBwQXJndW1lbnRzLT5HZXRJbnQzMigwKTsNCisgIGlmIChpSW5kZXggPCAwKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQorICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICBGWF9CT09MIGJIYXNJdGVtID0gcFdpZGdldERhdGEtPkdldENob2ljZUxpc3RJdGVtKHdzVmFsdWUsIGlJbmRleCwgVFJVRSk7DQorICBpZiAoYkhhc0l0ZW0pIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1VURjhFbmNvZGUod3NWYWx1ZSwgd3NWYWx1ZS5HZXRMZW5ndGgoKSkpOw0KKyAgfSBlbHNlIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9Cb3VuZEl0ZW0oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCAhPSAxKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiYm91bmRJdGVtIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQorICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9CeXRlU3RyaW5nIGJzVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSA9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUsIGJzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NCb3VuZFZhbHVlOw0KKyAgcFdpZGdldERhdGEtPkdldEl0ZW1WYWx1ZSh3c1ZhbHVlLCB3c0JvdW5kVmFsdWUpOw0KKyAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQorICBpZiAoaFZhbHVlKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzQm91bmRWYWx1ZSkpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0dldEl0ZW1TdGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoICE9IDEpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJnZXRJdGVtU3RhdGUiKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgIGlmICghcFdpZGdldERhdGEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpSW5kZXggPSBwQXJndW1lbnRzLT5HZXRJbnQzMigwKTsNCisgIEZYX0JPT0wgYlZhbHVlID0gcFdpZGdldERhdGEtPkdldEl0ZW1TdGF0ZShpSW5kZXgpOw0KKyAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQorICBpZiAoaFZhbHVlKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oaFZhbHVlLCBiVmFsdWUpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0V4ZWNDYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9DYWxjdWxhdGUsIEZBTFNFLCBGQUxTRSk7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImV4ZWNDYWxjdWxhdGUiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9TZXRJdGVtcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7fQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfR2V0RGlzcGxheUl0ZW0oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCAhPSAxKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZ2V0RGlzcGxheUl0ZW0iKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpSW5kZXggPSBwQXJndW1lbnRzLT5HZXRJbnQzMigwKTsNCisgIGlmIChpSW5kZXggPCAwKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQorICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICBGWF9CT09MIGJIYXNJdGVtID0gcFdpZGdldERhdGEtPkdldENob2ljZUxpc3RJdGVtKHdzVmFsdWUsIGlJbmRleCwgRkFMU0UpOw0KKyAgaWYgKGJIYXNJdGVtKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9VVEY4RW5jb2RlKHdzVmFsdWUsIHdzVmFsdWUuR2V0TGVuZ3RoKCkpKTsNCisgIH0gZWxzZSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldE51bGwocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfU2V0SXRlbVN0YXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggIT0gMikgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMInNldEl0ZW1TdGF0ZSIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlJbmRleCA9IHBBcmd1bWVudHMtPkdldEludDMyKDApOw0KKyAgRlhfQk9PTCBiQWRkID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMSkgPT0gMCA/IEZBTFNFIDogVFJVRTsNCisgIGlmIChiQWRkKSB7DQorICAgIHBXaWRnZXREYXRhLT5TZXRJdGVtU3RhdGUoaUluZGV4LCBUUlVFLCBUUlVFLCBUUlVFKTsNCisgIH0gZWxzZSB7DQorICAgIGlmIChwV2lkZ2V0RGF0YS0+R2V0SXRlbVN0YXRlKGlJbmRleCkpIHsNCisgICAgICBwV2lkZ2V0RGF0YS0+U2V0SXRlbVN0YXRlKGlJbmRleCwgRkFMU0UsIFRSVUUsIFRSVUUpOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfQWRkSXRlbShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoIDwgMSB8fCBpTGVuZ3RoID4gMikgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImFkZEl0ZW0iKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgIGlmICghcFdpZGdldERhdGEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NMYWJlbDsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICBpZiAoaUxlbmd0aCA+PSAxKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzTGFibGUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KKyAgICB3c0xhYmVsID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzTGFibGUsIGJzTGFibGUuR2V0TGVuZ3RoKCkpOw0KKyAgfQ0KKyAgaWYgKGlMZW5ndGggPj0gMikgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic1ZhbHVlID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygxKTsNCisgICAgd3NWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1ZhbHVlLCBic1ZhbHVlLkdldExlbmd0aCgpKTsNCisgIH0NCisgIHBXaWRnZXREYXRhLT5JbnNlcnRJdGVtKHdzTGFiZWwsIHdzVmFsdWUsIC0xLCBUUlVFKTsNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9FeGVjVmFsaWRhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBGQUxTRSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgaW50MzJfdCBpUmV0ID0NCisgICAgICAgICAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgWEZBX0VWRU5UX1ZhbGlkYXRlLCBGQUxTRSwgRkFMU0UpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaVJldCA9PSBYRkFfRVZFTlRFUlJPUl9FcnJvcikgPyBGQUxTRSA6IFRSVUUpKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJleGVjVmFsaWRhdGUiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfRXJyb3JUZXh0KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKCFiU2V0dGluZykgew0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfRGVmYXVsdEFuZFJhd1ZhbHVlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgIGlmICghcFdpZGdldERhdGEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzVmFsdWU7DQorICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhoVmFsdWUsIGJzVmFsdWUpOw0KKyAgICBwV2lkZ2V0RGF0YS0+U2V0U2VsZWN0ZWRNZW1iZXJCeVZhbHVlKA0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUsIGJzVmFsdWUuR2V0TGVuZ3RoKCkpLCBUUlVFLCBUUlVFKTsNCisgIH0gZWxzZSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUgPSBHZXRTY3JpcHRDb250ZW50KFRSVUUpOw0KKyAgICBYRkFfVkVSU0lPTiBjdXJWZXJzaW9uID0gR2V0RG9jdW1lbnQoKS0+R2V0Q3VyVmVyc2lvbk1vZGUoKTsNCisgICAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpICYmIGN1clZlcnNpb24gPj0gWEZBX1ZFUlNJT05fMzAwKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChoVmFsdWUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVmFsdWUpKTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9UcmFuc2llbnQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7fQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX0V4ZWNFdmVudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDEpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgZXZlbnRTdHJpbmcgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KKyAgICBleGVjU2luZ2xlRXZlbnRCeU5hbWUoDQorICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoZXZlbnRTdHJpbmcsIGV2ZW50U3RyaW5nLkdldExlbmd0aCgpKSwNCisgICAgICAgIFhGQV9FTEVNRU5UX0V4Y2xHcm91cCk7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImV4ZWNFdmVudCIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9TZWxlY3RlZE1lbWJlcihDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmICgoYXJnYyA9PSAwKSB8fCAoYXJnYyA9PSAxKSkgew0KKyAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBDWEZBX05vZGUqIHBSZXR1cm5Ob2RlID0gTlVMTDsNCisgICAgICBpZiAoYXJnYyA9PSAwKSB7DQorICAgICAgICBwUmV0dXJuTm9kZSA9IHBXaWRnZXREYXRhLT5HZXRTZWxlY3RlZE1lbWJlcigpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBDRlhfQnl0ZVN0cmluZyBzek5hbWU7DQorICAgICAgICBzek5hbWUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KKyAgICAgICAgcFJldHVybk5vZGUgPSBwV2lkZ2V0RGF0YS0+U2V0U2VsZWN0ZWRNZW1iZXIoDQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6TmFtZSwgc3pOYW1lLkdldExlbmd0aCgpKSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwUmV0dXJuTm9kZSkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0KA0KKyAgICAgICAgICAgIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocFJldHVybk5vZGUpKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwic2VsZWN0ZWRNZW1iZXIiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfRXhlY0luaXRpYWxpemUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9Jbml0aWFsaXplKTsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZXhlY0luaXRpYWxpemUiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfRXhlY0NhbGN1bGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDApIHsNCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgWEZBX0VWRU5UX0NhbGN1bGF0ZSk7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImV4ZWNDYWxjdWxhdGUiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfRXhlY1ZhbGlkYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgRkFMU0UpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGludDMyX3QgaVJldCA9IHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9WYWxpZGF0ZSk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpUmV0ID09IFhGQV9FVkVOVEVSUk9SX0Vycm9yKSA/IEZBTFNFIDogVFJVRSkpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImV4ZWNWYWxpZGF0ZSIpOw0KKyAgfQ0KK30NCitzdGF0aWMgQ1hGQV9Ob2RlKiBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0dldEl0ZW0oQ1hGQV9Ob2RlKiBwSW5zdE1nck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUluZGV4KSB7DQorICBBU1NFUlQocEluc3RNZ3JOb2RlKTsNCisgIGludDMyX3QgaUNvdW50ID0gMDsNCisgIEZYX0RXT1JEIGR3TmFtZUhhc2ggPSAwOw0KKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gcEluc3RNZ3JOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgICBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBYRkFfRUxFTUVOVCBlQ3VyVHlwZSA9IHBOb2RlLT5HZXRDbGFzc0lEKCk7DQorICAgIGlmIChlQ3VyVHlwZSA9PSBYRkFfRUxFTUVOVF9JbnN0YW5jZU1hbmFnZXIpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoKGVDdXJUeXBlICE9IFhGQV9FTEVNRU5UX1N1YmZvcm0pICYmDQorICAgICAgICAoZUN1clR5cGUgIT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldCkpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAoaUNvdW50ID09IDApIHsNCisgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NOYW1lID0gcE5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSk7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSW5zdE5hbWUgPSBwSW5zdE1nck5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSk7DQorICAgICAgaWYgKHdzSW5zdE5hbWUuR2V0TGVuZ3RoKCkgPCAxIHx8IHdzSW5zdE5hbWUuR2V0QXQoMCkgIT0gJ18nIHx8DQorICAgICAgICAgIHdzSW5zdE5hbWUuTWlkKDEpICE9IHdzTmFtZSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgfQ0KKyAgICAgIGR3TmFtZUhhc2ggPSBwTm9kZS0+R2V0TmFtZUhhc2goKTsNCisgICAgfQ0KKyAgICBpZiAoZHdOYW1lSGFzaCAhPSBwTm9kZS0+R2V0TmFtZUhhc2goKSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlDb3VudCsrOw0KKyAgICBpZiAoaUNvdW50ID4gaUluZGV4KSB7DQorICAgICAgcmV0dXJuIHBOb2RlOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fSW5zdGFuY2VJbmRleChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIGludDMyX3QgaVRvID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGhWYWx1ZSk7DQorICAgIGludDMyX3QgaUZyb20gPSBTdWJmb3JtX2FuZF9TdWJmb3JtU2V0X0luc3RhbmNlSW5kZXgoKTsNCisgICAgQ1hGQV9Ob2RlKiBwTWFuYWdlck5vZGUgPSBOVUxMOw0KKyAgICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUHJldlNpYmxpbmcpOw0KKyAgICAgICAgIHBOb2RlICE9IE5VTEw7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QcmV2U2libGluZykpIHsNCisgICAgICBpZiAocE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9JbnN0YW5jZU1hbmFnZXIpIHsNCisgICAgICAgIHBNYW5hZ2VyTm9kZSA9IHBOb2RlOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChwTWFuYWdlck5vZGUpIHsNCisgICAgICBwTWFuYWdlck5vZGUtPkluc3RhbmNlTWFuYWdlcl9Nb3ZlSW5zdGFuY2UoaVRvLCBpRnJvbSk7DQorICAgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgICBDWEZBX05vZGUqIHBUb0luc3RhbmNlID0NCisgICAgICAgICAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9HZXRJdGVtKHBNYW5hZ2VyTm9kZSwgaVRvKTsNCisgICAgICBpZiAocFRvSW5zdGFuY2UgJiYgcFRvSW5zdGFuY2UtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtKSB7DQorICAgICAgICBwTm90aWZ5LT5SdW5TdWJmb3JtSW5kZXhDaGFuZ2UocFRvSW5zdGFuY2UpOw0KKyAgICAgIH0NCisgICAgICBDWEZBX05vZGUqIHBGcm9tSW5zdGFuY2UgPQ0KKyAgICAgICAgICBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0dldEl0ZW0ocE1hbmFnZXJOb2RlLCBpRnJvbSk7DQorICAgICAgaWYgKHBGcm9tSW5zdGFuY2UgJiYgcEZyb21JbnN0YW5jZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1N1YmZvcm0pIHsNCisgICAgICAgIHBOb3RpZnktPlJ1blN1YmZvcm1JbmRleENoYW5nZShwRnJvbUluc3RhbmNlKTsNCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBTdWJmb3JtX2FuZF9TdWJmb3JtU2V0X0luc3RhbmNlSW5kZXgoKSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU3ViZm9ybV9JbnN0YW5jZU1hbmFnZXIoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmICghYlNldHRpbmcpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzTmFtZSA9IHRoaXMtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSk7DQorICAgIENYRkFfTm9kZSogcEluc3RhbmNlTWdyID0gTlVMTDsNCisgICAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1ByZXZTaWJsaW5nKTsNCisgICAgICAgICBwTm9kZSAhPSBOVUxMOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUHJldlNpYmxpbmcpKSB7DQorICAgICAgaWYgKHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfSW5zdGFuY2VNYW5hZ2VyKSB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NJbnN0TWdyTmFtZSA9IHBOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOw0KKyAgICAgICAgaWYgKHdzSW5zdE1nck5hbWUuR2V0TGVuZ3RoKCkgPj0gMSAmJiB3c0luc3RNZ3JOYW1lLkdldEF0KDApID09ICdfJyAmJg0KKyAgICAgICAgICAgIHdzSW5zdE1nck5hbWUuTWlkKDEpID09IHdzTmFtZSkgew0KKyAgICAgICAgICBwSW5zdGFuY2VNZ3IgPSBwTm9kZTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAocEluc3RhbmNlTWdyKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0KA0KKyAgICAgICAgICBoVmFsdWUsDQorICAgICAgICAgIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBJbnN0YW5jZU1ncikpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE51bGwoaFZhbHVlKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9TdWJmb3JtX0xvY2FsZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzTG9jYWxlTmFtZTsNCisgICAgRlhKU0VfVmFsdWVfVG9VVEY4U3RyaW5nKGhWYWx1ZSwgYnNMb2NhbGVOYW1lKTsNCisgICAgdGhpcy0+U2V0Q0RhdGEoDQorICAgICAgICBYRkFfQVRUUklCVVRFX0xvY2FsZSwNCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0xvY2FsZU5hbWUsIGJzTG9jYWxlTmFtZS5HZXRMZW5ndGgoKSksIFRSVUUsDQorICAgICAgICBUUlVFKTsNCisgIH0gZWxzZSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTG9jYWxlTmFtZTsNCisgICAgR2V0TG9jYWxlTmFtZSh3c0xvY2FsZU5hbWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKA0KKyAgICAgICAgaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzTG9jYWxlTmFtZSwgd3NMb2NhbGVOYW1lLkdldExlbmd0aCgpKSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU3ViZm9ybV9FeGVjRXZlbnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAxKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGV2ZW50U3RyaW5nID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgICAgZXhlY1NpbmdsZUV2ZW50QnlOYW1lKA0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGV2ZW50U3RyaW5nLCBldmVudFN0cmluZy5HZXRMZW5ndGgoKSksDQorICAgICAgICBYRkFfRUxFTUVOVF9TdWJmb3JtKTsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiZXhlY0V2ZW50Iik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU3ViZm9ybV9FeGVjSW5pdGlhbGl6ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDApIHsNCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgWEZBX0VWRU5UX0luaXRpYWxpemUpOw0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJleGVjSW5pdGlhbGl6ZSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1N1YmZvcm1fRXhlY0NhbGN1bGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDApIHsNCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgWEZBX0VWRU5UX0NhbGN1bGF0ZSk7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImV4ZWNDYWxjdWxhdGUiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9TdWJmb3JtX0V4ZWNWYWxpZGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDApIHsNCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIEZBTFNFKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpbnQzMl90IGlSZXQgPSBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBYRkFfRVZFTlRfVmFsaWRhdGUpOw0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaVJldCA9PSBYRkFfRVZFTlRFUlJPUl9FcnJvcikgPyBGQUxTRSA6IFRSVUUpKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJleGVjVmFsaWRhdGUiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9TdWJmb3JtX0dldEludmFsaWRPYmplY3RzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJnZXRJbnZhbGlkT2JqZWN0cyIpOw0KKyAgfQ0KK30NCitpbnQzMl90IENYRkFfTm9kZTo6U3ViZm9ybV9hbmRfU3ViZm9ybVNldF9JbnN0YW5jZUluZGV4KCkgew0KKyAgaW50MzJfdCBpbmRleCA9IDA7DQorICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUHJldlNpYmxpbmcpOyBwTm9kZSAhPSBOVUxMOw0KKyAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUHJldlNpYmxpbmcpKSB7DQorICAgIGlmICgocE5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtKSB8fA0KKyAgICAgICAgKHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldCkpIHsNCisgICAgICBpbmRleCsrOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gaW5kZXg7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfVGVtcGxhdGVfRm9ybU5vZGVzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMSkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIFRSVUUpOw0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJmb3JtTm9kZXMiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UZW1wbGF0ZV9SZW1lcmdlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgICBtX3BEb2N1bWVudC0+RG9EYXRhUmVtZXJnZShUUlVFKTsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwicmVtZXJnZSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX0V4ZWNJbml0aWFsaXplKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgICBpZiAoIXBXaWRnZXREYXRhKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBGQUxTRSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBUUlVFKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJleGVjSW5pdGlhbGl6ZSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX0NyZWF0ZU5vZGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoKGFyZ2MgPiAwKSAmJiAoYXJnYyA8IDQpKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHN0clRhZ05hbWU7DQorICAgIENGWF9XaWRlU3RyaW5nIHN0ck5hbWU7DQorICAgIENGWF9XaWRlU3RyaW5nIHN0ck5hbWVTcGFjZTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNUYWdOYW1lID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgICAgc3RyVGFnTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1RhZ05hbWUsIGJzVGFnTmFtZS5HZXRMZW5ndGgoKSk7DQorICAgIGlmIChhcmdjID4gMSkgew0KKyAgICAgIENGWF9CeXRlU3RyaW5nIGJzTmFtZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMSk7DQorICAgICAgc3RyTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic05hbWUsIGJzTmFtZS5HZXRMZW5ndGgoKSk7DQorICAgICAgaWYgKGFyZ2MgPT0gMykgew0KKyAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNOYW1lU3BhY2UgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDIpOw0KKyAgICAgICAgc3RyTmFtZVNwYWNlID0NCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNOYW1lU3BhY2UsIGJzTmFtZVNwYWNlLkdldExlbmd0aCgpKTsNCisgICAgICB9DQorICAgIH0NCisgICAgWEZBX0xQQ0VMRU1FTlRJTkZPIHBFbGVtZW50ID0gWEZBX0dldEVsZW1lbnRCeU5hbWUoc3RyVGFnTmFtZSk7DQorICAgIENYRkFfTm9kZSogcE5ld05vZGUgPSBDcmVhdGVTYW1lUGFja2V0Tm9kZShwRWxlbWVudC0+ZU5hbWUpOw0KKyAgICBpZiAoIXBOZXdOb2RlKSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAoIXN0ck5hbWUuSXNFbXB0eSgpKSB7DQorICAgICAgICBpZiAoWEZBX0dldEF0dHJpYnV0ZU9mRWxlbWVudChwRWxlbWVudC0+ZU5hbWUsIFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfVU5LTk9XTikpIHsNCisgICAgICAgICAgcE5ld05vZGUtPlNldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX05hbWUsIHN0ck5hbWUsIFRSVUUpOw0KKyAgICAgICAgICBpZiAocE5ld05vZGUtPkdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cykgew0KKyAgICAgICAgICAgIHBOZXdOb2RlLT5DcmVhdGVYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIEZYSlNFX1ZhbHVlX1NldCgNCisgICAgICAgICAgICAgIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwTmV3Tm9kZSkpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19OT1RfSEFWRV9QUk9QRVJUWSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IEZYX1dDSEFSKilzdHJUYWdOYW1lLCBMIm5hbWUiKTsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0KA0KKyAgICAgICAgICAgIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocE5ld05vZGUpKTsNCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiY3JlYXRlTm9kZSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX1JlY2FsY3VsYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGlmIChwQXJndW1lbnRzLT5HZXRMZW5ndGgoKSA9PSAxKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgVFJVRSk7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMInJlY2FsY3VsYXRlIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfVGVtcGxhdGVfRXhlY0NhbGN1bGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDApIHsNCisgICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgICAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgRkFMU0UpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgVFJVRSk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZXhlY0NhbGN1bGF0ZSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX0V4ZWNWYWxpZGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDApIHsNCisgICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsNCisgICAgaWYgKCFwV2lkZ2V0RGF0YSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgRkFMU0UpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4ocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgVFJVRSk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZXhlY1ZhbGlkYXRlIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTWFuaWZlc3RfRXZhbHVhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICAgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQorICAgIGlmICghcFdpZGdldERhdGEpIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIEZBTFNFKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksIFRSVUUpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImV2YWx1YXRlIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX01heChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmIChiU2V0dGluZykgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KKyAgICByZXR1cm47DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX09jY3VyIG5vZGVPY2N1ciA9IEdldE9jY3VyTm9kZSgpOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgbm9kZU9jY3VyLkdldE1heCgpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfTWluKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5WQWxJRF9QUk9QX1NFVCk7DQorICAgIHJldHVybjsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfT2NjdXIgbm9kZU9jY3VyID0gR2V0T2NjdXJOb2RlKCk7DQorICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBub2RlT2NjdXIuR2V0TWluKCkpOw0KKyAgfQ0KK30NCitzdGF0aWMgaW50MzJfdCBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0dldENvdW50KENYRkFfTm9kZSogcEluc3RNZ3JOb2RlKSB7DQorICBBU1NFUlQocEluc3RNZ3JOb2RlKTsNCisgIGludDMyX3QgaUNvdW50ID0gMDsNCisgIEZYX0RXT1JEIGR3TmFtZUhhc2ggPSAwOw0KKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gcEluc3RNZ3JOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgICBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBYRkFfRUxFTUVOVCBlQ3VyVHlwZSA9IHBOb2RlLT5HZXRDbGFzc0lEKCk7DQorICAgIGlmIChlQ3VyVHlwZSA9PSBYRkFfRUxFTUVOVF9JbnN0YW5jZU1hbmFnZXIpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoKGVDdXJUeXBlICE9IFhGQV9FTEVNRU5UX1N1YmZvcm0pICYmDQorICAgICAgICAoZUN1clR5cGUgIT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldCkpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAoaUNvdW50ID09IDApIHsNCisgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NOYW1lID0gcE5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSk7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSW5zdE5hbWUgPSBwSW5zdE1nck5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSk7DQorICAgICAgaWYgKHdzSW5zdE5hbWUuR2V0TGVuZ3RoKCkgPCAxIHx8IHdzSW5zdE5hbWUuR2V0QXQoMCkgIT0gJ18nIHx8DQorICAgICAgICAgIHdzSW5zdE5hbWUuTWlkKDEpICE9IHdzTmFtZSkgew0KKyAgICAgICAgcmV0dXJuIGlDb3VudDsNCisgICAgICB9DQorICAgICAgZHdOYW1lSGFzaCA9IHBOb2RlLT5HZXROYW1lSGFzaCgpOw0KKyAgICB9DQorICAgIGlmIChkd05hbWVIYXNoICE9IHBOb2RlLT5HZXROYW1lSGFzaCgpKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaUNvdW50Kys7DQorICB9DQorICByZXR1cm4gaUNvdW50Ow0KK30NCitzdGF0aWMgdm9pZA0KK1hGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfUmVvcmRlckRhdGFOb2Rlc19Tb3J0Tm9kZUFycmF5QnlEb2N1bWVudElkeCgNCisgICAgY29uc3QgQ1hGQV9Ob2RlU2V0JiByZ05vZGVTZXQsDQorICAgIENYRkFfTm9kZUFycmF5JiByZ05vZGVBcnJheSwNCisgICAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4mIHJnSWR4QXJyYXkpIHsNCisgIGludDMyX3QgaUNvdW50ID0gcmdOb2RlU2V0LkdldENvdW50KCk7DQorICByZ05vZGVBcnJheS5TZXRTaXplKGlDb3VudCk7DQorICByZ0lkeEFycmF5LlNldFNpemUoaUNvdW50KTsNCisgIGlmIChpQ291bnQgPT0gMCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlJbmRleCA9IC0xLCBpVG90YWxJbmRleCA9IC0xOw0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQorICBGWF9QT1NJVElPTiBwb3MgPSByZ05vZGVTZXQuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgcmdOb2RlU2V0LkdldE5leHRBc3NvYyhwb3MsIHBOb2RlKTsNCisgIGZvciAocE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkNCisgICAgICAgICAgICAgICAgICAgLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgIHBOb2RlICYmIGlJbmRleCA8IGlDb3VudDsNCisgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBpVG90YWxJbmRleCsrOw0KKyAgICBpZiAocmdOb2RlU2V0Lkxvb2t1cChwTm9kZSkpIHsNCisgICAgICBpSW5kZXgrKzsNCisgICAgICByZ05vZGVBcnJheVtpSW5kZXhdID0gcE5vZGU7DQorICAgICAgcmdJZHhBcnJheVtpSW5kZXhdID0gaVRvdGFsSW5kZXg7DQorICAgIH0NCisgIH0NCit9DQorc3RydWN0IENYRkFfRHVhbE5vZGVBcnJheSB7DQorICBDWEZBX05vZGVTZXQgZmlyc3ROb2RlTGlzdDsNCisgIENYRkFfTm9kZVNldCBzZWNvbmROb2RlTGlzdDsNCit9Ow0KK3N0YXRpYyB2b2lkIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfUmVvcmRlckRhdGFOb2RlcyhDWEZBX05vZGVTZXQmIHNTZXQxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGVTZXQmIHNTZXQyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJbnNlcnRCZWZvcmUpIHsNCisgIENGWF9NYXBQdHJUZW1wbGF0ZTxDWEZBX05vZGUqLA0KKyAgICAgICAgICAgICAgICAgICAgIENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9EV09SRCwgQ1hGQV9EdWFsTm9kZUFycmF5Kj4qPg0KKyAgICAgIHJnTm9kZUxpc3RNYXA7DQorICBGWF9QT1NJVElPTiBwb3M7DQorICBwb3MgPSBzU2V0MS5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocG9zKSB7DQorICAgIENYRkFfTm9kZSogcE5vZGUgPSBOVUxMOw0KKyAgICBzU2V0MS5HZXROZXh0QXNzb2MocG9zLCBwTm9kZSk7DQorICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIEZYX0RXT1JEIGR3TmFtZUhhc2ggPSBwTm9kZS0+R2V0TmFtZUhhc2goKTsNCisgICAgaWYgKCFwUGFyZW50Tm9kZSB8fCAhZHdOYW1lSGFzaCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9EV09SRCwgQ1hGQV9EdWFsTm9kZUFycmF5Kj4qIHBOb2RlTGlzdENoaWxkTWFwID0NCisgICAgICAgIHJnTm9kZUxpc3RNYXBbcFBhcmVudE5vZGVdOw0KKyAgICBpZiAoIXBOb2RlTGlzdENoaWxkTWFwKSB7DQorICAgICAgcmdOb2RlTGlzdE1hcFtwUGFyZW50Tm9kZV0gPSBwTm9kZUxpc3RDaGlsZE1hcCA9DQorICAgICAgICAgIG5ldyBDRlhfTWFwUHRyVGVtcGxhdGU8RlhfRFdPUkQsIENYRkFfRHVhbE5vZGVBcnJheSo+Ow0KKyAgICB9DQorICAgIENYRkFfRHVhbE5vZGVBcnJheSogcER1YWxOb2RlQXJyYXkgPSAoKnBOb2RlTGlzdENoaWxkTWFwKVtkd05hbWVIYXNoXTsNCisgICAgaWYgKCFwRHVhbE5vZGVBcnJheSkgew0KKyAgICAgICgqcE5vZGVMaXN0Q2hpbGRNYXApW2R3TmFtZUhhc2hdID0gcER1YWxOb2RlQXJyYXkgPQ0KKyAgICAgICAgICBuZXcgQ1hGQV9EdWFsTm9kZUFycmF5Ow0KKyAgICB9DQorICAgIHBEdWFsTm9kZUFycmF5LT5maXJzdE5vZGVMaXN0LkFkZChwTm9kZSk7DQorICB9DQorICBwb3MgPSBzU2V0Mi5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocG9zKSB7DQorICAgIENYRkFfTm9kZSogcE5vZGUgPSBOVUxMOw0KKyAgICBzU2V0Mi5HZXROZXh0QXNzb2MocG9zLCBwTm9kZSk7DQorICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIEZYX0RXT1JEIGR3TmFtZUhhc2ggPSBwTm9kZS0+R2V0TmFtZUhhc2goKTsNCisgICAgaWYgKCFwUGFyZW50Tm9kZSB8fCAhZHdOYW1lSGFzaCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIENGWF9NYXBQdHJUZW1wbGF0ZTxGWF9EV09SRCwgQ1hGQV9EdWFsTm9kZUFycmF5Kj4qIHBOb2RlTGlzdENoaWxkTWFwID0NCisgICAgICAgIHJnTm9kZUxpc3RNYXBbcFBhcmVudE5vZGVdOw0KKyAgICBpZiAoIXBOb2RlTGlzdENoaWxkTWFwKSB7DQorICAgICAgcmdOb2RlTGlzdE1hcFtwUGFyZW50Tm9kZV0gPSBwTm9kZUxpc3RDaGlsZE1hcCA9DQorICAgICAgICAgIG5ldyBDRlhfTWFwUHRyVGVtcGxhdGU8RlhfRFdPUkQsIENYRkFfRHVhbE5vZGVBcnJheSo+Ow0KKyAgICB9DQorICAgIENYRkFfRHVhbE5vZGVBcnJheSogcER1YWxOb2RlQXJyYXkgPSAoKnBOb2RlTGlzdENoaWxkTWFwKVtkd05hbWVIYXNoXTsNCisgICAgaWYgKCFwRHVhbE5vZGVBcnJheSkgew0KKyAgICAgICgqcE5vZGVMaXN0Q2hpbGRNYXApW2R3TmFtZUhhc2hdID0gcER1YWxOb2RlQXJyYXkgPQ0KKyAgICAgICAgICBuZXcgQ1hGQV9EdWFsTm9kZUFycmF5Ow0KKyAgICB9DQorICAgIGlmIChwRHVhbE5vZGVBcnJheS0+Zmlyc3ROb2RlTGlzdC5Mb29rdXAocE5vZGUpKSB7DQorICAgICAgcER1YWxOb2RlQXJyYXktPmZpcnN0Tm9kZUxpc3QuUmVtb3ZlS2V5KHBOb2RlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBwRHVhbE5vZGVBcnJheS0+c2Vjb25kTm9kZUxpc3QuQWRkKHBOb2RlKTsNCisgICAgfQ0KKyAgfQ0KKyAgcG9zID0gcmdOb2RlTGlzdE1hcC5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocG9zKSB7DQorICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBOVUxMOw0KKyAgICBDRlhfTWFwUHRyVGVtcGxhdGU8RlhfRFdPUkQsIENYRkFfRHVhbE5vZGVBcnJheSo+KiBwTm9kZUxpc3RDaGlsZE1hcCA9IE5VTEw7DQorICAgIHJnTm9kZUxpc3RNYXAuR2V0TmV4dEFzc29jKHBvcywgcFBhcmVudE5vZGUsIHBOb2RlTGlzdENoaWxkTWFwKTsNCisgICAgaWYgKCFwTm9kZUxpc3RDaGlsZE1hcCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIEZYX1BPU0lUSU9OIGNoaWxkcG9zID0gcE5vZGVMaXN0Q2hpbGRNYXAtPkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgd2hpbGUgKGNoaWxkcG9zKSB7DQorICAgICAgRlhfRFdPUkQgZHdOYW1lSGFzaCA9IDA7DQorICAgICAgQ1hGQV9EdWFsTm9kZUFycmF5KiBwRHVhbE5vZGVBcnJheSA9IE5VTEw7DQorICAgICAgcE5vZGVMaXN0Q2hpbGRNYXAtPkdldE5leHRBc3NvYyhjaGlsZHBvcywgZHdOYW1lSGFzaCwgcER1YWxOb2RlQXJyYXkpOw0KKyAgICAgIGlmICghcER1YWxOb2RlQXJyYXkpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBpZiAocER1YWxOb2RlQXJyYXktPmZpcnN0Tm9kZUxpc3QuR2V0Q291bnQoKSAhPSAwICYmDQorICAgICAgICAgIHBEdWFsTm9kZUFycmF5LT5zZWNvbmROb2RlTGlzdC5HZXRDb3VudCgpICE9IDApIHsNCisgICAgICAgIENYRkFfTm9kZUFycmF5IHJnTm9kZUFycmF5MSwgcmdOb2RlQXJyYXkyOw0KKyAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4gcmdJZHhBcnJheTEsIHJnSWR4QXJyYXkyOw0KKyAgICAgICAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9SZW9yZGVyRGF0YU5vZGVzX1NvcnROb2RlQXJyYXlCeURvY3VtZW50SWR4KA0KKyAgICAgICAgICAgIHBEdWFsTm9kZUFycmF5LT5maXJzdE5vZGVMaXN0LCByZ05vZGVBcnJheTEsIHJnSWR4QXJyYXkxKTsNCisgICAgICAgIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfUmVvcmRlckRhdGFOb2Rlc19Tb3J0Tm9kZUFycmF5QnlEb2N1bWVudElkeCgNCisgICAgICAgICAgICBwRHVhbE5vZGVBcnJheS0+c2Vjb25kTm9kZUxpc3QsIHJnTm9kZUFycmF5MiwgcmdJZHhBcnJheTIpOw0KKyAgICAgICAgaW50MzJfdCBpTGltaXQ7DQorICAgICAgICBDWEZBX05vZGUgKnBQYXJlbnROb2RlID0gTlVMTCwgKnBCZWZvcmVOb2RlID0gTlVMTDsNCisgICAgICAgIGlmIChiSW5zZXJ0QmVmb3JlKSB7DQorICAgICAgICAgIGlMaW1pdCA9IHJnSWR4QXJyYXkyWzBdOw0KKyAgICAgICAgICBwQmVmb3JlTm9kZSA9IHJnTm9kZUFycmF5MlswXTsNCisgICAgICAgICAgcFBhcmVudE5vZGUgPSBwQmVmb3JlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBpTGltaXQgPSByZ0lkeEFycmF5MltyZ0lkeEFycmF5Mi5HZXRTaXplKCkgLSAxXTsNCisgICAgICAgICAgQ1hGQV9Ob2RlKiBwTGFzdE5vZGUgPSByZ05vZGVBcnJheTJbcmdJZHhBcnJheTIuR2V0U2l6ZSgpIC0gMV07DQorICAgICAgICAgIHBQYXJlbnROb2RlID0gcExhc3ROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICAgICAgcEJlZm9yZU5vZGUgPSBwTGFzdE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgICB9DQorICAgICAgICBmb3IgKGludDMyX3QgaUlkeCA9IDAsIGlDb3VudCA9IHJnSWR4QXJyYXkxLkdldFNpemUoKTsgaUlkeCA8IGlDb3VudDsNCisgICAgICAgICAgICAgaUlkeCsrKSB7DQorICAgICAgICAgIENYRkFfTm9kZSogcEN1ck5vZGUgPSByZ05vZGVBcnJheTFbaUlkeF07DQorICAgICAgICAgIHBQYXJlbnROb2RlLT5SZW1vdmVDaGlsZChwQ3VyTm9kZSk7DQorICAgICAgICAgIHBQYXJlbnROb2RlLT5JbnNlcnRDaGlsZChwQ3VyTm9kZSwgcEJlZm9yZU5vZGUpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBkZWxldGUgcER1YWxOb2RlQXJyYXk7DQorICAgIH0NCisgICAgcE5vZGVMaXN0Q2hpbGRNYXAtPlJlbW92ZUFsbCgpOw0KKyAgfQ0KKyAgcmdOb2RlTGlzdE1hcC5SZW1vdmVBbGwoKTsNCit9DQorc3RhdGljIHZvaWQgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9JbnNlcnRJdGVtKA0KKyAgICBDWEZBX05vZGUqIHBJbnN0TWdyTm9kZSwNCisgICAgQ1hGQV9Ob2RlKiBwTmV3SW5zdGFuY2UsDQorICAgIGludDMyX3QgaVBvcywNCisgICAgaW50MzJfdCBpQ291bnQgPSAtMSwNCisgICAgRlhfQk9PTCBiTW92ZURhdGFCaW5kaW5nTm9kZXMgPSBUUlVFKSB7DQorICBpZiAoaUNvdW50IDwgMCkgew0KKyAgICBpQ291bnQgPSBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0dldENvdW50KHBJbnN0TWdyTm9kZSk7DQorICB9DQorICBpZiAoaVBvcyA8IDApIHsNCisgICAgaVBvcyA9IGlDb3VudDsNCisgIH0NCisgIGlmIChpUG9zID09IGlDb3VudCkgew0KKyAgICBDWEZBX05vZGUqIHBOZXh0U2libGluZyA9DQorICAgICAgICBpQ291bnQgPiAwDQorICAgICAgICAgICAgPyBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0dldEl0ZW0ocEluc3RNZ3JOb2RlLCBpQ291bnQgLSAxKQ0KKyAgICAgICAgICAgICAgICAgIC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKQ0KKyAgICAgICAgICAgIDogcEluc3RNZ3JOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICBwSW5zdE1nck5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpDQorICAgICAgICAtPkluc2VydENoaWxkKHBOZXdJbnN0YW5jZSwgcE5leHRTaWJsaW5nKTsNCisgICAgaWYgKGJNb3ZlRGF0YUJpbmRpbmdOb2Rlcykgew0KKyAgICAgIENYRkFfTm9kZVNldCBzTmV3LCBzQWZ0ZXI7DQorICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBQ29udGFpbmVyTm9kZT4NCisgICAgICAgICAgc0l0ZXJhdG9yTmV3KHBOZXdJbnN0YW5jZSk7DQorICAgICAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gc0l0ZXJhdG9yTmV3LkdldEN1cnJlbnQoKTsgcE5vZGU7DQorICAgICAgICAgICBwTm9kZSA9IHNJdGVyYXRvck5ldy5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gcE5vZGUtPkdldEJpbmREYXRhKCk7DQorICAgICAgICBpZiAoIXBEYXRhTm9kZSkgew0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIHNOZXcuQWRkKHBEYXRhTm9kZSk7DQorICAgICAgfQ0KKyAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQUNvbnRhaW5lck5vZGU+DQorICAgICAgICAgIHNJdGVyYXRvckFmdGVyKHBOZXh0U2libGluZyk7DQorICAgICAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gc0l0ZXJhdG9yQWZ0ZXIuR2V0Q3VycmVudCgpOyBwTm9kZTsNCisgICAgICAgICAgIHBOb2RlID0gc0l0ZXJhdG9yQWZ0ZXIuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IHBOb2RlLT5HZXRCaW5kRGF0YSgpOw0KKyAgICAgICAgaWYgKCFwRGF0YU5vZGUpIHsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBzQWZ0ZXIuQWRkKHBEYXRhTm9kZSk7DQorICAgICAgfQ0KKyAgICAgIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfUmVvcmRlckRhdGFOb2RlcyhzTmV3LCBzQWZ0ZXIsIEZBTFNFKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlSW5zdGFuY2UgPQ0KKyAgICAgICAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9HZXRJdGVtKHBJbnN0TWdyTm9kZSwgaVBvcyk7DQorICAgIHBJbnN0TWdyTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkNCisgICAgICAgIC0+SW5zZXJ0Q2hpbGQocE5ld0luc3RhbmNlLCBwQmVmb3JlSW5zdGFuY2UpOw0KKyAgICBpZiAoYk1vdmVEYXRhQmluZGluZ05vZGVzKSB7DQorICAgICAgQ1hGQV9Ob2RlU2V0IHNOZXcsIHNCZWZvcmU7DQorICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBQ29udGFpbmVyTm9kZT4NCisgICAgICAgICAgc0l0ZXJhdG9yTmV3KHBOZXdJbnN0YW5jZSk7DQorICAgICAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gc0l0ZXJhdG9yTmV3LkdldEN1cnJlbnQoKTsgcE5vZGU7DQorICAgICAgICAgICBwTm9kZSA9IHNJdGVyYXRvck5ldy5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gcE5vZGUtPkdldEJpbmREYXRhKCk7DQorICAgICAgICBpZiAoIXBEYXRhTm9kZSkgew0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIHNOZXcuQWRkKHBEYXRhTm9kZSk7DQorICAgICAgfQ0KKyAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQUNvbnRhaW5lck5vZGU+DQorICAgICAgICAgIHNJdGVyYXRvckJlZm9yZShwQmVmb3JlSW5zdGFuY2UpOw0KKyAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHNJdGVyYXRvckJlZm9yZS5HZXRDdXJyZW50KCk7IHBOb2RlOw0KKyAgICAgICAgICAgcE5vZGUgPSBzSXRlcmF0b3JCZWZvcmUuTW92ZVRvTmV4dCgpKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IHBOb2RlLT5HZXRCaW5kRGF0YSgpOw0KKyAgICAgICAgaWYgKCFwRGF0YU5vZGUpIHsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9DQorICAgICAgICBzQmVmb3JlLkFkZChwRGF0YU5vZGUpOw0KKyAgICAgIH0NCisgICAgICBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX1Jlb3JkZXJEYXRhTm9kZXMoc05ldywgc0JlZm9yZSwgVFJVRSk7DQorICAgIH0NCisgIH0NCit9DQorc3RhdGljIHZvaWQgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9SZW1vdmVJdGVtKA0KKyAgICBDWEZBX05vZGUqIHBJbnN0TWdyTm9kZSwNCisgICAgQ1hGQV9Ob2RlKiBwUmVtb3ZlSW5zdGFuY2UsDQorICAgIEZYX0JPT0wgYlJlbW92ZURhdGFCaW5kaW5nID0gVFJVRSkgew0KKyAgcEluc3RNZ3JOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KS0+UmVtb3ZlQ2hpbGQocFJlbW92ZUluc3RhbmNlKTsNCisgIGlmICghYlJlbW92ZURhdGFCaW5kaW5nKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBQ29udGFpbmVyTm9kZT4NCisgICAgICBzSXRlcmF0b3IocFJlbW92ZUluc3RhbmNlKTsNCisgIGZvciAoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUgPSBzSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwRm9ybU5vZGU7DQorICAgICAgIHBGb3JtTm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgQ1hGQV9Ob2RlKiBwRGF0YU5vZGUgPSBwRm9ybU5vZGUtPkdldEJpbmREYXRhKCk7DQorICAgIGlmICghcERhdGFOb2RlKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKHBEYXRhTm9kZS0+UmVtb3ZlQmluZEl0ZW0ocEZvcm1Ob2RlKSA9PSAwKSB7DQorICAgICAgaWYgKENYRkFfTm9kZSogcERhdGFQYXJlbnQgPQ0KKyAgICAgICAgICAgICAgcERhdGFOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSkgew0KKyAgICAgICAgcERhdGFQYXJlbnQtPlJlbW92ZUNoaWxkKHBEYXRhTm9kZSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHBGb3JtTm9kZS0+U2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsIE5VTEwpOw0KKyAgfQ0KK30NCitzdGF0aWMgQ1hGQV9Ob2RlKiBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0NyZWF0ZUluc3RhbmNlKA0KKyAgICBDWEZBX05vZGUqIHBJbnN0TWdyTm9kZSwNCisgICAgRlhfQk9PTCBiRGF0YU1lcmdlKSB7DQorICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwSW5zdE1nck5vZGUtPkdldERvY3VtZW50KCk7DQorICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUgPSBwSW5zdE1nck5vZGUtPkdldFRlbXBsYXRlTm9kZSgpOw0KKyAgQ1hGQV9Ob2RlKiBwRm9ybVBhcmVudCA9IHBJbnN0TWdyTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICBDWEZBX05vZGUqIHBEYXRhU2NvcGUgPSBOVUxMOw0KKyAgZm9yIChDWEZBX05vZGUqIHBSb290Qm91bmROb2RlID0gcEZvcm1QYXJlbnQ7DQorICAgICAgIHBSb290Qm91bmROb2RlICYmDQorICAgICAgIHBSb290Qm91bmROb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZTsNCisgICAgICAgcFJvb3RCb3VuZE5vZGUgPSBwUm9vdEJvdW5kTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpIHsNCisgICAgcERhdGFTY29wZSA9IHBSb290Qm91bmROb2RlLT5HZXRCaW5kRGF0YSgpOw0KKyAgICBpZiAocERhdGFTY29wZSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpZiAoIXBEYXRhU2NvcGUpIHsNCisgICAgcERhdGFTY29wZSA9IChDWEZBX05vZGUqKXBEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfUmVjb3JkKTsNCisgICAgQVNTRVJUKHBEYXRhU2NvcGUpOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwSW5zdGFuY2UgPSBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKA0KKyAgICAgIHBUZW1wbGF0ZU5vZGUsIHBGb3JtUGFyZW50LCBwRGF0YVNjb3BlLCBUUlVFLCBiRGF0YU1lcmdlKTsNCisgIGlmIChwSW5zdGFuY2UpIHsNCisgICAgcERvY3VtZW50LT5EYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucyhwSW5zdGFuY2UpOw0KKyAgICBwRm9ybVBhcmVudC0+UmVtb3ZlQ2hpbGQocEluc3RhbmNlKTsNCisgIH0NCisgIHJldHVybiBwSW5zdGFuY2U7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX0NvdW50KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmIChiU2V0dGluZykgew0KKyAgICBpbnQzMl90IGlEZXNpcmVkID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGhWYWx1ZSk7DQorICAgIEluc3RhbmNlTWFuYWdlcl9TZXRJbnN0YW5jZXMoaURlc2lyZWQpOw0KKyAgfSBlbHNlIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0Q291bnQodGhpcykpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0luc3RhbmNlTWFuYWdlcl9Nb3ZlSW5zdGFuY2UoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgIT0gMikgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVbmRlZmluZWQocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSk7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgaUZyb20gPSBwQXJndW1lbnRzLT5HZXRJbnQzMigwKTsNCisgIGludDMyX3QgaVRvID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMSk7DQorICBJbnN0YW5jZU1hbmFnZXJfTW92ZUluc3RhbmNlKGlUbywgaUZyb20pOw0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfTm9kZSogcFRvSW5zdGFuY2UgPSBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0dldEl0ZW0odGhpcywgaVRvKTsNCisgIGlmIChwVG9JbnN0YW5jZSAmJiBwVG9JbnN0YW5jZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1N1YmZvcm0pIHsNCisgICAgcE5vdGlmeS0+UnVuU3ViZm9ybUluZGV4Q2hhbmdlKHBUb0luc3RhbmNlKTsNCisgIH0NCisgIENYRkFfTm9kZSogcEZyb21JbnN0YW5jZSA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0SXRlbSh0aGlzLCBpRnJvbSk7DQorICBpZiAocEZyb21JbnN0YW5jZSAmJiBwRnJvbUluc3RhbmNlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSkgew0KKyAgICBwTm90aWZ5LT5SdW5TdWJmb3JtSW5kZXhDaGFuZ2UocEZyb21JbnN0YW5jZSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX1JlbW92ZUluc3RhbmNlKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjICE9IDEpIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0VW5kZWZpbmVkKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCkpOw0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlJbmRleCA9IHBBcmd1bWVudHMtPkdldEludDMyKDApOw0KKyAgaW50MzJfdCBpQ291bnQgPSBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0dldENvdW50KHRoaXMpOw0KKyAgaWYgKGlJbmRleCA8IDAgfHwgaUluZGV4ID49IGlDb3VudCkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOREVYX09VVF9PRl9CT1VORFMpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX09jY3VyIG5vZGVPY2N1ciA9IEdldE9jY3VyTm9kZSgpOw0KKyAgaW50MzJfdCBpTWluID0gbm9kZU9jY3VyLkdldE1pbigpOw0KKyAgaWYgKGlDb3VudCAtIDEgPCBpTWluKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfVklPTEFURV9CT1VOREFSWSwgTCJtaW4iKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwUmVtb3ZlSW5zdGFuY2UgPSBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0dldEl0ZW0odGhpcywgaUluZGV4KTsNCisgIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfUmVtb3ZlSXRlbSh0aGlzLCBwUmVtb3ZlSW5zdGFuY2UpOw0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKHBOb3RpZnkpIHsNCisgICAgZm9yIChpbnQzMl90IGkgPSBpSW5kZXg7IGkgPCBpQ291bnQgLSAxOyBpKyspIHsNCisgICAgICBDWEZBX05vZGUqIHBTdWJmb3JtSW5zdGFuY2UgPSBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0dldEl0ZW0odGhpcywgaSk7DQorICAgICAgaWYgKHBTdWJmb3JtSW5zdGFuY2UgJiYNCisgICAgICAgICAgcFN1YmZvcm1JbnN0YW5jZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1N1YmZvcm0pIHsNCisgICAgICAgIHBOb3RpZnktPlJ1blN1YmZvcm1JbmRleENoYW5nZShwU3ViZm9ybUluc3RhbmNlKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvID0gbV9wRG9jdW1lbnQtPkdldExheW91dFByb2Nlc3NvcigpOw0KKyAgaWYgKCFwTGF5b3V0UHJvKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBMYXlvdXRQcm8tPkFkZENoYW5nZWRDb250YWluZXIoDQorICAgICAgKENYRkFfTm9kZSopbV9wRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0Zvcm0pKTsNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfU2V0SW5zdGFuY2VzKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjICE9IDEpIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0VW5kZWZpbmVkKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCkpOw0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlEZXNpcmVkID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCk7DQorICBJbnN0YW5jZU1hbmFnZXJfU2V0SW5zdGFuY2VzKGlEZXNpcmVkKTsNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfQWRkSW5zdGFuY2UoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKChhcmdjICE9IDApICYmIChhcmdjICE9IDEpKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiYWRkSW5zdGFuY2UiKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfQk9PTCBmRmxhZ3MgPSBUUlVFOw0KKyAgaWYgKGFyZ2MgPT0gMSkgew0KKyAgICBmRmxhZ3MgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigwKSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KKyAgfQ0KKyAgaW50MzJfdCBpQ291bnQgPSBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0dldENvdW50KHRoaXMpOw0KKyAgQ1hGQV9PY2N1ciBub2RlT2NjdXIgPSBHZXRPY2N1ck5vZGUoKTsNCisgIGludDMyX3QgaU1heCA9IG5vZGVPY2N1ci5HZXRNYXgoKTsNCisgIGlmIChpTWF4ID49IDAgJiYgaUNvdW50ID49IGlNYXgpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19WSU9MQVRFX0JPVU5EQVJZLCBMIm1heCIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX05vZGUqIHBOZXdJbnN0YW5jZSA9DQorICAgICAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9DcmVhdGVJbnN0YW5jZSh0aGlzLCBmRmxhZ3MpOw0KKyAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9JbnNlcnRJdGVtKHRoaXMsIHBOZXdJbnN0YW5jZSwgaUNvdW50LCBpQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOw0KKyAgRlhKU0VfVmFsdWVfU2V0KA0KKyAgICAgIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksDQorICAgICAgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocE5ld0luc3RhbmNlKSk7DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgcE5vdGlmeS0+UnVuTm9kZUluaXRpYWxpemUocE5ld0luc3RhbmNlKTsNCisgIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvID0gbV9wRG9jdW1lbnQtPkdldExheW91dFByb2Nlc3NvcigpOw0KKyAgaWYgKCFwTGF5b3V0UHJvKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHBMYXlvdXRQcm8tPkFkZENoYW5nZWRDb250YWluZXIoDQorICAgICAgKENYRkFfTm9kZSopbV9wRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0Zvcm0pKTsNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfSW5zZXJ0SW5zdGFuY2UoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKChhcmdjICE9IDEpICYmIChhcmdjICE9IDIpKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiaW5zZXJ0SW5zdGFuY2UiKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpSW5kZXggPSBwQXJndW1lbnRzLT5HZXRJbnQzMigwKTsNCisgIEZYX0JPT0wgYkJpbmQgPSBGQUxTRTsNCisgIGlmIChhcmdjID09IDIpIHsNCisgICAgYkJpbmQgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigxKSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KKyAgfQ0KKyAgQ1hGQV9PY2N1ciBub2RlT2NjdXIgPSBHZXRPY2N1ck5vZGUoKTsNCisgIGludDMyX3QgaUNvdW50ID0gWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9HZXRDb3VudCh0aGlzKTsNCisgIGlmIChpSW5kZXggPCAwIHx8IGlJbmRleCA+IGlDb3VudCkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOREVYX09VVF9PRl9CT1VORFMpOw0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlNYXggPSBub2RlT2NjdXIuR2V0TWF4KCk7DQorICBpZiAoaU1heCA+PSAwICYmIGlDb3VudCA+PSBpTWF4KSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfVklPTEFURV9CT1VOREFSWSwgTCJtYXgiKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTmV3SW5zdGFuY2UgPQ0KKyAgICAgIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfQ3JlYXRlSW5zdGFuY2UodGhpcywgYkJpbmQpOw0KKyAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9JbnNlcnRJdGVtKHRoaXMsIHBOZXdJbnN0YW5jZSwgaUluZGV4LCBpQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSk7DQorICBGWEpTRV9WYWx1ZV9TZXQoDQorICAgICAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwTmV3SW5zdGFuY2UpKTsNCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBwTm90aWZ5LT5SdW5Ob2RlSW5pdGlhbGl6ZShwTmV3SW5zdGFuY2UpOw0KKyAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBMYXlvdXRQcm8gPSBtX3BEb2N1bWVudC0+R2V0TGF5b3V0UHJvY2Vzc29yKCk7DQorICBpZiAoIXBMYXlvdXRQcm8pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgcExheW91dFByby0+QWRkQ2hhbmdlZENvbnRhaW5lcigNCisgICAgICAoQ1hGQV9Ob2RlKiltX3BEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRm9ybSkpOw0KK30NCitpbnQzMl90IENYRkFfTm9kZTo6SW5zdGFuY2VNYW5hZ2VyX1NldEluc3RhbmNlcyhpbnQzMl90IGlEZXNpcmVkKSB7DQorICBDWEZBX09jY3VyIG5vZGVPY2N1ciA9IEdldE9jY3VyTm9kZSgpOw0KKyAgaW50MzJfdCBpTWF4ID0gbm9kZU9jY3VyLkdldE1heCgpOw0KKyAgaW50MzJfdCBpTWluID0gbm9kZU9jY3VyLkdldE1pbigpOw0KKyAgaWYgKGlEZXNpcmVkIDwgaU1pbikgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX1ZJT0xBVEVfQk9VTkRBUlksIEwibWluIik7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgaWYgKChpTWF4ID49IDApICYmIChpRGVzaXJlZCA+IGlNYXgpKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfVklPTEFURV9CT1VOREFSWSwgTCJtYXgiKTsNCisgICAgcmV0dXJuIDI7DQorICB9DQorICBpbnQzMl90IGlDb3VudCA9IFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfR2V0Q291bnQodGhpcyk7DQorICBpZiAoaURlc2lyZWQgPT0gaUNvdW50KSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaWYgKGlEZXNpcmVkIDwgaUNvdW50KSB7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c0luc3RNYW5hZ2VyTmFtZSA9IHRoaXMtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSk7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzSW5zdGFuY2VOYW1lID0gd3NJbnN0TWFuYWdlck5hbWUuSXNFbXB0eSgpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gd3NJbnN0TWFuYWdlck5hbWUNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB3c0luc3RNYW5hZ2VyTmFtZS5NaWQoMSk7DQorICAgIEZYX0RXT1JEIGRJbnN0YW5jZU5hbWVIYXNoID0NCisgICAgICAgIHdzSW5zdGFuY2VOYW1lLklzRW1wdHkoKSA/IDAgOiBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0VygNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NJbnN0YW5jZU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzSW5zdGFuY2VOYW1lLkdldExlbmd0aCgpKTsNCisgICAgQ1hGQV9Ob2RlKiBwUHJldlNpYmxpbmcgPQ0KKyAgICAgICAgKGlEZXNpcmVkID09IDApID8gdGhpcw0KKyAgICAgICAgICAgICAgICAgICAgICAgIDogWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9HZXRJdGVtKHRoaXMsIGlEZXNpcmVkIC0gMSk7DQorICAgIHdoaWxlIChpQ291bnQgPiBpRGVzaXJlZCkgew0KKyAgICAgIENYRkFfTm9kZSogcFJlbW92ZUluc3RhbmNlID0NCisgICAgICAgICAgcFByZXZTaWJsaW5nLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgIGlmIChwUmVtb3ZlSW5zdGFuY2UtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9TdWJmb3JtICYmDQorICAgICAgICAgIHBSZW1vdmVJbnN0YW5jZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBpZiAocFJlbW92ZUluc3RhbmNlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfSW5zdGFuY2VNYW5hZ2VyKSB7DQorICAgICAgICBGWFNZU19hc3NlcnQoRkFMU0UpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlmIChwUmVtb3ZlSW5zdGFuY2UtPkdldE5hbWVIYXNoKCkgPT0gZEluc3RhbmNlTmFtZUhhc2gpIHsNCisgICAgICAgIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfUmVtb3ZlSXRlbSh0aGlzLCBwUmVtb3ZlSW5zdGFuY2UpOw0KKyAgICAgICAgaUNvdW50LS07DQorICAgICAgfQ0KKyAgICB9DQorICB9IGVsc2UgaWYgKGlEZXNpcmVkID4gaUNvdW50KSB7DQorICAgIHdoaWxlIChpQ291bnQgPCBpRGVzaXJlZCkgew0KKyAgICAgIENYRkFfTm9kZSogcE5ld0luc3RhbmNlID0NCisgICAgICAgICAgWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9DcmVhdGVJbnN0YW5jZSh0aGlzLCBUUlVFKTsNCisgICAgICBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0luc2VydEl0ZW0odGhpcywgcE5ld0luc3RhbmNlLCBpQ291bnQsIGlDb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOw0KKyAgICAgIGlDb3VudCsrOw0KKyAgICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgICBpZiAoIXBOb3RpZnkpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICAgIH0NCisgICAgICBwTm90aWZ5LT5SdW5Ob2RlSW5pdGlhbGl6ZShwTmV3SW5zdGFuY2UpOw0KKyAgICB9DQorICB9DQorICBDWEZBX0xheW91dFByb2Nlc3NvciogcExheW91dFBybyA9IG1fcERvY3VtZW50LT5HZXRMYXlvdXRQcm9jZXNzb3IoKTsNCisgIGlmICghcExheW91dFBybykgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIHBMYXlvdXRQcm8tPkFkZENoYW5nZWRDb250YWluZXIoDQorICAgICAgKENYRkFfTm9kZSopbV9wRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0Zvcm0pKTsNCisgIHJldHVybiAwOw0KK30NCitpbnQzMl90IENYRkFfTm9kZTo6SW5zdGFuY2VNYW5hZ2VyX01vdmVJbnN0YW5jZShpbnQzMl90IGlUbywgaW50MzJfdCBpRnJvbSkgew0KKyAgaW50MzJfdCBpQ291bnQgPSBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0dldENvdW50KHRoaXMpOw0KKyAgaWYgKGlGcm9tID4gaUNvdW50IHx8IGlUbyA+IGlDb3VudCAtIDEpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkRFWF9PVVRfT0ZfQk9VTkRTKTsNCisgICAgcmV0dXJuIDE7DQorICB9DQorICBpZiAoaUZyb20gPCAwIHx8IGlUbyA8IDAgfHwgaUZyb20gPT0gaVRvKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTW92ZUluc3RhbmNlID0gWEZBX1NjcmlwdEluc3RhbmNlTWFuYWdlcl9HZXRJdGVtKHRoaXMsIGlGcm9tKTsNCisgIFhGQV9TY3JpcHRJbnN0YW5jZU1hbmFnZXJfUmVtb3ZlSXRlbSh0aGlzLCBwTW92ZUluc3RhbmNlLCBGQUxTRSk7DQorICBYRkFfU2NyaXB0SW5zdGFuY2VNYW5hZ2VyX0luc2VydEl0ZW0odGhpcywgcE1vdmVJbnN0YW5jZSwgaVRvLCBpQ291bnQgLSAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpOw0KKyAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBMYXlvdXRQcm8gPSBtX3BEb2N1bWVudC0+R2V0TGF5b3V0UHJvY2Vzc29yKCk7DQorICBpZiAoIXBMYXlvdXRQcm8pIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBwTGF5b3V0UHJvLT5BZGRDaGFuZ2VkQ29udGFpbmVyKA0KKyAgICAgIChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Gb3JtKSk7DQorICByZXR1cm4gMDsNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9PY2N1cl9NYXgoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgQ1hGQV9PY2N1ciBvY2N1cih0aGlzKTsNCisgIGlmIChiU2V0dGluZykgew0KKyAgICBpbnQzMl90IGlNYXggPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoaFZhbHVlKTsNCisgICAgb2NjdXIuU2V0TWF4KGlNYXgpOw0KKyAgfSBlbHNlIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIG9jY3VyLkdldE1heCgpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9PY2N1cl9NaW4oRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgQ1hGQV9PY2N1ciBvY2N1cih0aGlzKTsNCisgIGlmIChiU2V0dGluZykgew0KKyAgICBpbnQzMl90IGlNaW4gPSBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoaFZhbHVlKTsNCisgICAgb2NjdXIuU2V0TWluKGlNaW4pOw0KKyAgfSBlbHNlIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIG9jY3VyLkdldE1pbigpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9EZXNjX01ldGFkYXRhKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKChhcmdjID09IDApIHx8IChhcmdjID09IDEpKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwgIiIpOw0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJtZXRhZGF0YSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fRm9ybU5vZGVzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMSkgew0KKyAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IChDWEZBX05vZGUqKXBBcmd1bWVudHMtPkdldE9iamVjdCgwKTsNCisgICAgaWYgKHBEYXRhTm9kZSkgew0KKyAgICAgIENYRkFfTm9kZUFycmF5IGZvcm1JdGVtczsNCisgICAgICBDWEZBX0FycmF5Tm9kZUxpc3QqIHBGb3JtTm9kZXMgPSBuZXcgQ1hGQV9BcnJheU5vZGVMaXN0KG1fcERvY3VtZW50KTsNCisgICAgICBwRm9ybU5vZGVzLT5TZXRBcnJheU5vZGVMaXN0KGZvcm1JdGVtcyk7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0T2JqZWN0KA0KKyAgICAgICAgICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCAoQ1hGQV9PYmplY3QqKXBGb3JtTm9kZXMsDQorICAgICAgICAgIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpzZU5vcm1hbENsYXNzKCkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImZvcm1Ob2RlcyIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fUmVtZXJnZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDApIHsNCisgICAgbV9wRG9jdW1lbnQtPkRvRGF0YVJlbWVyZ2UoVFJVRSk7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMInJlbWVyZ2UiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Gb3JtX0V4ZWNJbml0aWFsaXplKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBYRkFfRVZFTlRfSW5pdGlhbGl6ZSk7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImV4ZWNJbml0aWFsaXplIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRm9ybV9SZWNhbGN1bGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBDWEZBX0V2ZW50UGFyYW0qIHBFdmVudFBhcmFtID0NCisgICAgICBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRFdmVudFBhcmFtKCk7DQorICBpZiAocEV2ZW50UGFyYW0tPm1fZVR5cGUgPT0gWEZBX0VWRU5UX0NhbGN1bGF0ZSB8fA0KKyAgICAgIHBFdmVudFBhcmFtLT5tX2VUeXBlID09IFhGQV9FVkVOVF9Jbml0Q2FsY3VsYXRlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMSkgew0KKyAgICBGWF9CT09MIGJTY3JpcHRGbGFncyA9IHBBcmd1bWVudHMtPkdldEludDMyKDApID09IDAgPyBGQUxTRSA6IFRSVUU7DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChiU2NyaXB0RmxhZ3MpIHsNCisgICAgICBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBYRkFfRVZFTlRfQ2FsY3VsYXRlKTsNCisgICAgICBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBYRkFfRVZFTlRfVmFsaWRhdGUpOw0KKyAgICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9SZWFkeSwgVFJVRSk7DQorICAgIH0gZWxzZSB7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwicmVjYWxjdWxhdGUiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Gb3JtX0V4ZWNDYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9DYWxjdWxhdGUpOw0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJleGVjQ2FsY3VsYXRlIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRm9ybV9FeGVjVmFsaWRhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICAgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgICAgaWYgKCFwTm90aWZ5KSB7DQorICAgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLCBGQUxTRSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgaW50MzJfdCBpUmV0ID0gcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgWEZBX0VWRU5UX1ZhbGlkYXRlKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXRCb29sZWFuKHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGlSZXQgPT0gWEZBX0VWRU5URVJST1JfRXJyb3IpID8gRkFMU0UgOiBUUlVFKSk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZXhlY1ZhbGlkYXRlIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRm9ybV9DaGVja3N1bShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmIChiU2V0dGluZykgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic0NoZWNrc3VtOw0KKyAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBic0NoZWNrc3VtKTsNCisgICAgU2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfQ2hlY2tzdW0sDQorICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNDaGVja3N1bSwgYnNDaGVja3N1bS5HZXRMZW5ndGgoKSkpOw0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDaGVja3N1bTsNCisgICAgR2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfQ2hlY2tzdW0sIHdzQ2hlY2tzdW0sIEZBTFNFKTsNCisgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZygNCisgICAgICAgIGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c0NoZWNrc3VtLCB3c0NoZWNrc3VtLkdldExlbmd0aCgpKSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfUGFja2V0X0dldEF0dHJpYnV0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDEpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNBdHRyaWJ1dGVOYW1lID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyaWJ1dGVWYWx1ZTsNCisgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSA9IEdldFhNTE1hcHBpbmdOb2RlKCk7DQorICAgIGlmIChwWE1MTm9kZSAmJiBwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAoKElGREVfWE1MRWxlbWVudCopcFhNTE5vZGUpDQorICAgICAgICAgIC0+R2V0U3RyaW5nKENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0F0dHJpYnV0ZU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic0F0dHJpYnV0ZU5hbWUuR2V0TGVuZ3RoKCkpLA0KKyAgICAgICAgICAgICAgICAgICAgICB3c0F0dHJpYnV0ZVZhbHVlKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKA0KKyAgICAgICAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgIEZYX1VURjhFbmNvZGUod3NBdHRyaWJ1dGVWYWx1ZSwgd3NBdHRyaWJ1dGVWYWx1ZS5HZXRMZW5ndGgoKSkpOw0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJnZXRBdHRyaWJ1dGUiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9QYWNrZXRfU2V0QXR0cmlidXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMikgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic1ZhbHVlID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNOYW1lID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygxKTsNCisgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSA9IEdldFhNTE1hcHBpbmdOb2RlKCk7DQorICAgIGlmIChwWE1MTm9kZSAmJiBwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAoKElGREVfWE1MRWxlbWVudCopcFhNTE5vZGUpDQorICAgICAgICAgIC0+U2V0U3RyaW5nKENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic05hbWUsIGJzTmFtZS5HZXRMZW5ndGgoKSksDQorICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1ZhbHVlLCBic1ZhbHVlLkdldExlbmd0aCgpKSk7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwic2V0QXR0cmlidXRlIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfUGFja2V0X1JlbW92ZUF0dHJpYnV0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDEpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNOYW1lID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lID0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic05hbWUsIGJzTmFtZS5HZXRMZW5ndGgoKSk7DQorICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBHZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICBpZiAocFhNTE5vZGUgJiYgcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgSUZERV9YTUxFbGVtZW50KiBwWE1MRWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQqKXBYTUxOb2RlOw0KKyAgICAgIGlmIChwWE1MRWxlbWVudC0+SGFzQXR0cmlidXRlKHdzTmFtZSkpIHsNCisgICAgICAgIHBYTUxFbGVtZW50LT5SZW1vdmVBdHRyaWJ1dGUod3NOYW1lKTsNCisgICAgICB9DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfU2V0TnVsbChwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpKTsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwicmVtb3ZlQXR0cmlidXRlIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfUGFja2V0X0NvbnRlbnQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmIChiU2V0dGluZykgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic05ld0NvbnRlbnQ7DQorICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhoVmFsdWUsIGJzTmV3Q29udGVudCk7DQorICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBHZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICBpZiAocFhNTE5vZGUgJiYgcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgSUZERV9YTUxFbGVtZW50KiBwWE1MRWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQqKXBYTUxOb2RlOw0KKyAgICAgIHBYTUxFbGVtZW50LT5TZXRUZXh0RGF0YSgNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzTmV3Q29udGVudCwgYnNOZXdDb250ZW50LkdldExlbmd0aCgpKSk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dERhdGE7DQorICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBHZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICBpZiAocFhNTE5vZGUgJiYgcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgSUZERV9YTUxFbGVtZW50KiBwWE1MRWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQqKXBYTUxOb2RlOw0KKyAgICAgIHBYTUxFbGVtZW50LT5HZXRUZXh0RGF0YSh3c1RleHREYXRhKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKA0KKyAgICAgICAgaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVGV4dERhdGEsIHdzVGV4dERhdGEuR2V0TGVuZ3RoKCkpKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfTmV4dChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDApIHsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwibmV4dCIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9DYW5jZWxCYXRjaChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDApIHsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiY2FuY2VsQmF0Y2giKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfRmlyc3QoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImZpcnN0Iik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX1VwZGF0ZUJhdGNoKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJ1cGRhdGVCYXRjaCIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9QcmV2aW91cyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDApIHsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwicHJldmlvdXMiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfSXNCT0YoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImlzQk9GIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0lzRU9GKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJpc0VPRiIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9DYW5jZWwoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImNhbmNlbCIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9VcGRhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMInVwZGF0ZSIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9PcGVuKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJvcGVuIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0RlbGV0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDApIHsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiZGVsZXRlIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0FkZE5ldyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDApIHsNCisgIH0gZWxzZSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiYWRkTmV3Iik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX1JlcXVlcnkoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMInJlcXVlcnkiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfUmVzeW5jKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMCkgew0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJyZXN5bmMiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfQ2xvc2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImNsb3NlIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0xhc3QoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImxhc3QiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfSGFzRGF0YUNoYW5nZWQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAwKSB7DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImhhc0RhdGFDaGFuZ2VkIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0RiKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHt9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9YZmFfVGhpcyhGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKCFiU2V0dGluZykgew0KKyAgICBDWEZBX09iamVjdCogcFRoaXMgPSBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRUaGlzT2JqZWN0KCk7DQorICAgIEZYU1lTX2Fzc2VydChwVGhpcyk7DQorICAgIEZYSlNFX1ZhbHVlX1NldChoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwVGhpcykpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X0hhbmRsZXJfVmVyc2lvbihGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7fQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU3VibWl0Rm9ybWF0X01vZGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHt9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9FeHRyYXNfVHlwZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkge30NCit2b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NjcmlwdF9TdGF0ZWxlc3MoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUoRlhfV1NUUkMoTCIwIikpKTsNCit9DQordm9pZCBDWEZBX05vZGU6OlNjcmlwdF9FbmNyeXB0X0Zvcm1hdChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkge30NCitlbnVtIFhGQV9LRVlUWVBFIHsNCisgIFhGQV9LRVlUWVBFX0N1c3RvbSwNCisgIFhGQV9LRVlUWVBFX0VsZW1lbnQsDQorfTsNCit2b2lkKiBYRkFfR2V0TWFwS2V5X0N1c3RvbShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzS2V5KSB7DQorICBGWF9EV09SRCBkd0tleSA9IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzS2V5LkdldFB0cigpLCB3c0tleS5HZXRMZW5ndGgoKSk7DQorICByZXR1cm4gKHZvaWQqKSh1aW50cHRyX3QpKChkd0tleSA8PCAxKSB8IFhGQV9LRVlUWVBFX0N1c3RvbSk7DQorfQ0KK3ZvaWQqIFhGQV9HZXRNYXBLZXlfRWxlbWVudChYRkFfRUxFTUVOVCBlRWxlbWVudCwgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICByZXR1cm4gKHZvaWQqKSh1aW50cHRyX3QpKChlRWxlbWVudCA8PCAxNikgfCAoZUF0dHJpYnV0ZSA8PCA4KSB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9LRVlUWVBFX0VsZW1lbnQpOw0KK30NCitzdGF0aWMgaW5saW5lIEZYX0JPT0wgWEZBX05vZGVEYXRhX1ByZXBhcmVLZXkoWEZBX0VMRU1FTlQgZUVsZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBwS2V5KSB7DQorICBwS2V5ID0gWEZBX0dldE1hcEtleV9FbGVtZW50KGVFbGVtLCBlQXR0cik7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX05vZGU6Okhhc0F0dHJpYnV0ZShYRkFfQVRUUklCVVRFIGVBdHRyLCBGWF9CT09MIGJDYW5Jbmhlcml0KSB7DQorICB2b2lkKiBwS2V5ID0gTlVMTDsNCisgIGlmICghWEZBX05vZGVEYXRhX1ByZXBhcmVLZXkoR2V0Q2xhc3NJRCgpLCBlQXR0ciwgcEtleSkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIEhhc01hcE1vZHVsZUtleShwS2V5LCBiQ2FuSW5oZXJpdCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpTZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURSBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSkgew0KKyAgWEZBX0xQQ0FUVFJJQlVURUlORk8gcEF0dHIgPSBYRkFfR2V0QXR0cmlidXRlQnlJRChlQXR0cik7DQorICBpZiAocEF0dHIgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBYRkFfQVRUUklCVVRFVFlQRSBlVHlwZSA9IHBBdHRyLT5lVHlwZTsNCisgIGlmIChlVHlwZSA9PSBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFKSB7DQorICAgIFhGQV9MUENOT1RTVVJFQVRUUklCVVRFIHBOb3RzdXJlID0NCisgICAgICAgIFhGQV9HZXROb3RzdXJlQXR0cmlidXRlKEdldENsYXNzSUQoKSwgcEF0dHItPmVOYW1lKTsNCisgICAgZVR5cGUgPSBwTm90c3VyZSA/IHBOb3RzdXJlLT5lVHlwZSA6IFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhOw0KKyAgfQ0KKyAgc3dpdGNoIChlVHlwZSkgew0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVUWVBFX0VudW06IHsNCisgICAgICBYRkFfTFBDQVRUUklCVVRFRU5VTUlORk8gcEVudW0gPSBYRkFfR2V0QXR0cmlidXRlRW51bUJ5TmFtZSh3c1ZhbHVlKTsNCisgICAgICByZXR1cm4gU2V0RW51bShwQXR0ci0+ZU5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgcEVudW0gPyBwRW51bS0+ZU5hbWUNCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChYRkFfQVRUUklCVVRFRU5VTSkoaW50cHRyX3QpKHBBdHRyLT5wRGVmVmFsdWUpLA0KKyAgICAgICAgICAgICAgICAgICAgIGJOb3RpZnkpOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhOg0KKyAgICAgIHJldHVybiBTZXRDRGF0YShwQXR0ci0+ZU5hbWUsIHdzVmFsdWUsIGJOb3RpZnkpOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW46DQorICAgICAgcmV0dXJuIFNldEJvb2xlYW4ocEF0dHItPmVOYW1lLCB3c1ZhbHVlICE9IEZYX1dTVFJDKEwiMCIpLCBiTm90aWZ5KTsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyOg0KKyAgICAgIHJldHVybiBTZXRJbnRlZ2VyKA0KKyAgICAgICAgICBwQXR0ci0+ZU5hbWUsDQorICAgICAgICAgIEZYU1lTX3JvdW5kKEZYX3djc3RvZih3c1ZhbHVlLkdldFB0cigpLCB3c1ZhbHVlLkdldExlbmd0aCgpKSksDQorICAgICAgICAgIGJOb3RpZnkpOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmU6DQorICAgICAgcmV0dXJuIFNldE1lYXN1cmUocEF0dHItPmVOYW1lLCBDWEZBX01lYXN1cmVtZW50KHdzVmFsdWUpLCBiTm90aWZ5KTsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX05vZGU6OkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFIGVBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVc2VEZWZhdWx0KSB7DQorICBYRkFfTFBDQVRUUklCVVRFSU5GTyBwQXR0ciA9IFhGQV9HZXRBdHRyaWJ1dGVCeUlEKGVBdHRyKTsNCisgIGlmIChwQXR0ciA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIFhGQV9BVFRSSUJVVEVUWVBFIGVUeXBlID0gcEF0dHItPmVUeXBlOw0KKyAgaWYgKGVUeXBlID09IFhGQV9BVFRSSUJVVEVUWVBFX05PVFNVUkUpIHsNCisgICAgWEZBX0xQQ05PVFNVUkVBVFRSSUJVVEUgcE5vdHN1cmUgPQ0KKyAgICAgICAgWEZBX0dldE5vdHN1cmVBdHRyaWJ1dGUoR2V0Q2xhc3NJRCgpLCBwQXR0ci0+ZU5hbWUpOw0KKyAgICBlVHlwZSA9IHBOb3RzdXJlID8gcE5vdHN1cmUtPmVUeXBlIDogWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGE7DQorICB9DQorICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURVRZUEVfRW51bTogew0KKyAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVWYWx1ZTsNCisgICAgICBpZiAoIVRyeUVudW0ocEF0dHItPmVOYW1lLCBlVmFsdWUsIGJVc2VEZWZhdWx0KSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICB3c1ZhbHVlID0gWEZBX0dldEF0dHJpYnV0ZUVudW1CeUlEKGVWYWx1ZSktPnBOYW1lOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhOiB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVmFsdWVDOw0KKyAgICAgIGlmICghVHJ5Q0RhdGEocEF0dHItPmVOYW1lLCB3c1ZhbHVlQywgYlVzZURlZmF1bHQpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIHdzVmFsdWUgPSB3c1ZhbHVlQzsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuOiB7DQorICAgICAgRlhfQk9PTCBiVmFsdWU7DQorICAgICAgaWYgKCFUcnlCb29sZWFuKHBBdHRyLT5lTmFtZSwgYlZhbHVlLCBiVXNlRGVmYXVsdCkpIHsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICB9DQorICAgICAgd3NWYWx1ZSA9IGJWYWx1ZSA/IEZYX1dTVFJDKEwiMSIpIDogRlhfV1NUUkMoTCIwIik7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlcjogew0KKyAgICAgIGludDMyX3QgaVZhbHVlOw0KKyAgICAgIGlmICghVHJ5SW50ZWdlcihwQXR0ci0+ZU5hbWUsIGlWYWx1ZSwgYlVzZURlZmF1bHQpKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIHdzVmFsdWUuRm9ybWF0KEwiJWQiLCBpVmFsdWUpOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmU6IHsNCisgICAgICBDWEZBX01lYXN1cmVtZW50IG1WYWx1ZTsNCisgICAgICBpZiAoIVRyeU1lYXN1cmUocEF0dHItPmVOYW1lLCBtVmFsdWUsIGJVc2VEZWZhdWx0KSkgew0KKyAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgIH0NCisgICAgICBtVmFsdWUuVG9TdHJpbmcod3NWYWx1ZSk7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0gYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpTZXRBdHRyaWJ1dGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0F0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkpIHsNCisgIFhGQV9MUENBVFRSSUJVVEVJTkZPIHBBdHRyaWJ1dGVJbmZvID0gWEZBX0dldEF0dHJpYnV0ZUJ5TmFtZSh3c1ZhbHVlKTsNCisgIGlmIChwQXR0cmlidXRlSW5mbykgew0KKyAgICByZXR1cm4gU2V0QXR0cmlidXRlKHBBdHRyaWJ1dGVJbmZvLT5lTmFtZSwgd3NWYWx1ZSwgYk5vdGlmeSk7DQorICB9DQorICB2b2lkKiBwS2V5ID0gWEZBX0dldE1hcEtleV9DdXN0b20od3NBdHRyKTsNCisgIFNldE1hcE1vZHVsZVN0cmluZyhwS2V5LCB3c1ZhbHVlKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6R2V0QXR0cmlidXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVc2VEZWZhdWx0KSB7DQorICBYRkFfTFBDQVRUUklCVVRFSU5GTyBwQXR0cmlidXRlSW5mbyA9IFhGQV9HZXRBdHRyaWJ1dGVCeU5hbWUod3NBdHRyKTsNCisgIGlmIChwQXR0cmlidXRlSW5mbykgew0KKyAgICByZXR1cm4gR2V0QXR0cmlidXRlKHBBdHRyaWJ1dGVJbmZvLT5lTmFtZSwgd3NWYWx1ZSwgYlVzZURlZmF1bHQpOw0KKyAgfQ0KKyAgdm9pZCogcEtleSA9IFhGQV9HZXRNYXBLZXlfQ3VzdG9tKHdzQXR0cik7DQorICBDRlhfV2lkZVN0cmluZ0Mgd3NWYWx1ZUM7DQorICBpZiAoR2V0TWFwTW9kdWxlU3RyaW5nKHBLZXksIHdzVmFsdWVDKSkgew0KKyAgICB3c1ZhbHVlID0gd3NWYWx1ZUM7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX05vZGU6OlJlbW92ZUF0dHJpYnV0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQXR0cikgew0KKyAgdm9pZCogcEtleSA9IFhGQV9HZXRNYXBLZXlfQ3VzdG9tKHdzQXR0cik7DQorICBSZW1vdmVNYXBNb2R1bGVLZXkocEtleSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX05vZGU6OlRyeUJvb2xlYW4oWEZBX0FUVFJJQlVURSBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXNlRGVmYXVsdCkgew0KKyAgdm9pZCogcFZhbHVlID0gTlVMTDsNCisgIGlmICghR2V0VmFsdWUoZUF0dHIsIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sIGJVc2VEZWZhdWx0LCBwVmFsdWUpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGJWYWx1ZSA9IChGWF9CT09MKSh1aW50cHRyX3QpcFZhbHVlOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpUcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEUgZUF0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZURlZmF1bHQpIHsNCisgIHZvaWQqIHBWYWx1ZSA9IE5VTEw7DQorICBpZiAoIUdldFZhbHVlKGVBdHRyLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBiVXNlRGVmYXVsdCwgcFZhbHVlKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpVmFsdWUgPSAoaW50MzJfdCkodWludHB0cl90KXBWYWx1ZTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6VHJ5RW51bShYRkFfQVRUUklCVVRFIGVBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNJiBlVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXNlRGVmYXVsdCkgew0KKyAgdm9pZCogcFZhbHVlID0gTlVMTDsNCisgIGlmICghR2V0VmFsdWUoZUF0dHIsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIGJVc2VEZWZhdWx0LCBwVmFsdWUpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGVWYWx1ZSA9IChYRkFfQVRUUklCVVRFRU5VTSkodWludHB0cl90KXBWYWx1ZTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFIGVBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTWVhc3VyZW1lbnQgbVZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSkgew0KKyAgdm9pZCogcEtleSA9IE5VTEw7DQorICBpZiAoIVhGQV9Ob2RlRGF0YV9QcmVwYXJlS2V5KEdldENsYXNzSUQoKSwgZUF0dHIsIHBLZXkpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIE9uQ2hhbmdpbmcoZUF0dHIsICZtVmFsdWUsIGJOb3RpZnkpOw0KKyAgU2V0TWFwTW9kdWxlQnVmZmVyKHBLZXksICZtVmFsdWUsIHNpemVvZihDWEZBX01lYXN1cmVtZW50KSk7DQorICBPbkNoYW5nZWQoZUF0dHIsICZtVmFsdWUsIGJOb3RpZnkpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpUcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEUgZUF0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9NZWFzdXJlbWVudCYgbVZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZURlZmF1bHQpIHsNCisgIHZvaWQqIHBLZXkgPSBOVUxMOw0KKyAgaWYgKCFYRkFfTm9kZURhdGFfUHJlcGFyZUtleShHZXRDbGFzc0lEKCksIGVBdHRyLCBwS2V5KSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB2b2lkKiBwVmFsdWU7DQorICBpbnQzMl90IGlCeXRlczsNCisgIGlmIChHZXRNYXBNb2R1bGVCdWZmZXIocEtleSwgcFZhbHVlLCBpQnl0ZXMpICYmIGlCeXRlcyA9PSBzaXplb2YobVZhbHVlKSkgew0KKyAgICBGWF9tZW1jcHkoJm1WYWx1ZSwgcFZhbHVlLCBzaXplb2YobVZhbHVlKSk7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaWYgKGJVc2VEZWZhdWx0ICYmDQorICAgICAgWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZShwVmFsdWUsIEdldENsYXNzSUQoKSwgZUF0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBtX2VQYWNrZXQpKSB7DQorICAgIEZYX21lbWNweSgmbVZhbHVlLCBwVmFsdWUsIHNpemVvZihtVmFsdWUpKTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpTZXRDRGF0YShYRkFfQVRUUklCVVRFIGVBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTY3JpcHRNb2RpZnkpIHsNCisgIHZvaWQqIHBLZXkgPSBOVUxMOw0KKyAgaWYgKCFYRkFfTm9kZURhdGFfUHJlcGFyZUtleShHZXRDbGFzc0lEKCksIGVBdHRyLCBwS2V5KSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBPbkNoYW5naW5nKGVBdHRyLCAodm9pZCopKGNvbnN0IEZYX1dDSEFSKil3c1ZhbHVlLCBiTm90aWZ5KTsNCisgIGlmIChlQXR0ciA9PSBYRkFfQVRUUklCVVRFX1ZhbHVlKSB7DQorICAgIENGWF9XaWRlU3RyaW5nKiBwQ2xvbmUgPSBuZXcgQ0ZYX1dpZGVTdHJpbmcod3NWYWx1ZSk7DQorICAgIFNldFVzZXJEYXRhKHBLZXksIHBDbG9uZSwgJmRlbGV0ZVdpZGVTdHJpbmdDYWxsQmFjayk7DQorICB9IGVsc2Ugew0KKyAgICBTZXRNYXBNb2R1bGVTdHJpbmcocEtleSwgd3NWYWx1ZSk7DQorICAgIGlmIChlQXR0ciA9PSBYRkFfQVRUUklCVVRFX05hbWUpIHsNCisgICAgICBVcGRhdGVOYW1lSGFzaCgpOw0KKyAgICAgIGlmIChYRkFfTFBDSlNCVUlMVElOSU5GTyBwQnVpbHRpbiA9DQorICAgICAgICAgICAgICBYRkFfR2V0SlNCdWlsdGluQnlIYXNoKG1fZHdOYW1lSGFzaCkpIHsNCisgICAgICAgIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkFkZEpTQnVpbHRpbk9iamVjdChwQnVpbHRpbik7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBPbkNoYW5nZWQoZUF0dHIsICh2b2lkKikoY29uc3QgRlhfV0NIQVIqKXdzVmFsdWUsIGJOb3RpZnksIGJTY3JpcHRNb2RpZnkpOw0KKyAgaWYgKElzTmVlZFNhdmluZ1hNTE5vZGUoKSAmJiBlQXR0ciAhPSBYRkFfQVRUUklCVVRFX1F1YWxpZmllZE5hbWUgJiYNCisgICAgICBlQXR0ciAhPSBYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlKSB7DQorICAgIGlmIChlQXR0ciA9PSBYRkFfQVRUUklCVVRFX05hbWUgJiYNCisgICAgICAgIChtX2VOb2RlQ2xhc3MgPT0gWEZBX0VMRU1FTlRfRGF0YVZhbHVlIHx8DQorICAgICAgICAgbV9lTm9kZUNsYXNzID09IFhGQV9FTEVNRU5UX0RhdGFHcm91cCkpIHsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBpZiAoZUF0dHIgPT0gWEZBX0FUVFJJQlVURV9WYWx1ZSkgew0KKyAgICAgIEZERV9YTUxOT0RFVFlQRSBlWE1MVHlwZSA9IG1fcFhNTE5vZGUtPkdldFR5cGUoKTsNCisgICAgICBzd2l0Y2ggKGVYTUxUeXBlKSB7DQorICAgICAgICBjYXNlIEZERV9YTUxOT0RFX0VsZW1lbnQ6DQorICAgICAgICAgIGlmIChJc0F0dHJpYnV0ZUluWE1MKCkpIHsNCisgICAgICAgICAgICAoKElGREVfWE1MRWxlbWVudCopbV9wWE1MTm9kZSkNCisgICAgICAgICAgICAgICAgLT5TZXRTdHJpbmcoR2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9RdWFsaWZpZWROYW1lKSwgd3NWYWx1ZSk7DQorICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgRlhfQk9PTCBiRGVsZXRlQ2hpbGRyZW4gPSBUUlVFOw0KKyAgICAgICAgICAgIGlmIChHZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpIHsNCisgICAgICAgICAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwQ2hpbGREYXRhTm9kZSA9DQorICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgICAgICAgICAgIHBDaGlsZERhdGFOb2RlOyBwQ2hpbGREYXRhTm9kZSA9IHBDaGlsZERhdGFOb2RlLT5HZXROb2RlSXRlbSgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICAgICAgICAgIENYRkFfTm9kZUFycmF5IGZvcm1Ob2RlczsNCisgICAgICAgICAgICAgICAgaWYgKHBDaGlsZERhdGFOb2RlLT5HZXRCaW5kSXRlbXMoZm9ybU5vZGVzKSA+IDApIHsNCisgICAgICAgICAgICAgICAgICBiRGVsZXRlQ2hpbGRyZW4gPSBGQUxTRTsNCisgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoYkRlbGV0ZUNoaWxkcmVuKSB7DQorICAgICAgICAgICAgICAoKElGREVfWE1MRWxlbWVudCopbV9wWE1MTm9kZSktPkRlbGV0ZUNoaWxkcmVuKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50KiltX3BYTUxOb2RlKS0+U2V0VGV4dERhdGEod3NWYWx1ZSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlIEZERV9YTUxOT0RFX1RleHQ6DQorICAgICAgICAgICgoSUZERV9YTUxUZXh0KiltX3BYTUxOb2RlKS0+U2V0VGV4dCh3c1ZhbHVlKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBGWFNZU19hc3NlcnQoMCk7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIFhGQV9MUENBVFRSSUJVVEVJTkZPIHBJbmZvID0gWEZBX0dldEF0dHJpYnV0ZUJ5SUQoZUF0dHIpOw0KKyAgICBpZiAocEluZm8pIHsNCisgICAgICBGWFNZU19hc3NlcnQobV9wWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0ck5hbWUgPSBwSW5mby0+cE5hbWU7DQorICAgICAgaWYgKHBJbmZvLT5lTmFtZSA9PSBYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlKSB7DQorICAgICAgICB3c0F0dHJOYW1lID0gRlhfV1NUUkMoTCJ4ZmE6IikgKyB3c0F0dHJOYW1lOw0KKyAgICAgIH0NCisgICAgICAoKElGREVfWE1MRWxlbWVudCopbV9wWE1MTm9kZSktPlNldFN0cmluZyh3c0F0dHJOYW1lLCB3c1ZhbHVlKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpTZXRBdHRyaWJ1dGVWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzWE1MVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5KSB7DQorICB2b2lkKiBwS2V5ID0gTlVMTDsNCisgIGlmICghWEZBX05vZGVEYXRhX1ByZXBhcmVLZXkoR2V0Q2xhc3NJRCgpLCBYRkFfQVRUUklCVVRFX1ZhbHVlLCBwS2V5KSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBPbkNoYW5naW5nKFhGQV9BVFRSSUJVVEVfVmFsdWUsICh2b2lkKikoY29uc3QgRlhfV0NIQVIqKXdzVmFsdWUsIGJOb3RpZnkpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcqIHBDbG9uZSA9IG5ldyBDRlhfV2lkZVN0cmluZyh3c1ZhbHVlKTsNCisgIFNldFVzZXJEYXRhKHBLZXksIHBDbG9uZSwgJmRlbGV0ZVdpZGVTdHJpbmdDYWxsQmFjayk7DQorICBPbkNoYW5nZWQoWEZBX0FUVFJJQlVURV9WYWx1ZSwgKHZvaWQqKShjb25zdCBGWF9XQ0hBUiopd3NWYWx1ZSwgYk5vdGlmeSwNCisgICAgICAgICAgICBiU2NyaXB0TW9kaWZ5KTsNCisgIGlmIChJc05lZWRTYXZpbmdYTUxOb2RlKCkpIHsNCisgICAgRkRFX1hNTE5PREVUWVBFIGVYTUxUeXBlID0gbV9wWE1MTm9kZS0+R2V0VHlwZSgpOw0KKyAgICBzd2l0Y2ggKGVYTUxUeXBlKSB7DQorICAgICAgY2FzZSBGREVfWE1MTk9ERV9FbGVtZW50Og0KKyAgICAgICAgaWYgKElzQXR0cmlidXRlSW5YTUwoKSkgew0KKyAgICAgICAgICAoKElGREVfWE1MRWxlbWVudCopbV9wWE1MTm9kZSkNCisgICAgICAgICAgICAgIC0+U2V0U3RyaW5nKEdldENEYXRhKFhGQV9BVFRSSUJVVEVfUXVhbGlmaWVkTmFtZSksIHdzWE1MVmFsdWUpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgRlhfQk9PTCBiRGVsZXRlQ2hpbGRyZW4gPSBUUlVFOw0KKyAgICAgICAgICBpZiAoR2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKSB7DQorICAgICAgICAgICAgZm9yIChDWEZBX05vZGUqIHBDaGlsZERhdGFOb2RlID0NCisgICAgICAgICAgICAgICAgICAgICB0aGlzLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICAgICAgICAgICBwQ2hpbGREYXRhTm9kZTsgcENoaWxkRGF0YU5vZGUgPSBwQ2hpbGREYXRhTm9kZS0+R2V0Tm9kZUl0ZW0oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICAgICAgICAgIENYRkFfTm9kZUFycmF5IGZvcm1Ob2RlczsNCisgICAgICAgICAgICAgIGlmIChwQ2hpbGREYXRhTm9kZS0+R2V0QmluZEl0ZW1zKGZvcm1Ob2RlcykgPiAwKSB7DQorICAgICAgICAgICAgICAgIGJEZWxldGVDaGlsZHJlbiA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKGJEZWxldGVDaGlsZHJlbikgew0KKyAgICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50KiltX3BYTUxOb2RlKS0+RGVsZXRlQ2hpbGRyZW4oKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICAoKElGREVfWE1MRWxlbWVudCopbV9wWE1MTm9kZSktPlNldFRleHREYXRhKHdzWE1MVmFsdWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MTk9ERV9UZXh0Og0KKyAgICAgICAgKChJRkRFX1hNTFRleHQqKW1fcFhNTE5vZGUpLT5TZXRUZXh0KHdzWE1MVmFsdWUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIEZYU1lTX2Fzc2VydCgwKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpUcnlDRGF0YShYRkFfQVRUUklCVVRFIGVBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXNlRGVmYXVsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiUHJvdG8pIHsNCisgIHZvaWQqIHBLZXkgPSBOVUxMOw0KKyAgaWYgKCFYRkFfTm9kZURhdGFfUHJlcGFyZUtleShHZXRDbGFzc0lEKCksIGVBdHRyLCBwS2V5KSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoZUF0dHIgPT0gWEZBX0FUVFJJQlVURV9WYWx1ZSkgew0KKyAgICBDRlhfV2lkZVN0cmluZyogcFN0ciA9IChDRlhfV2lkZVN0cmluZyopR2V0VXNlckRhdGEocEtleSwgYlByb3RvKTsNCisgICAgaWYgKHBTdHIpIHsNCisgICAgICB3c1ZhbHVlID0gKnBTdHI7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c1ZhbHVlQzsNCisgICAgaWYgKEdldE1hcE1vZHVsZVN0cmluZyhwS2V5LCB3c1ZhbHVlQykpIHsNCisgICAgICB3c1ZhbHVlID0gd3NWYWx1ZUM7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgIH0NCisgIGlmICghYlVzZURlZmF1bHQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgdm9pZCogcFZhbHVlID0gTlVMTDsNCisgIGlmIChYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlKHBWYWx1ZSwgR2V0Q2xhc3NJRCgpLCBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBtX2VQYWNrZXQpKSB7DQorICAgIHdzVmFsdWUgPSAoY29uc3QgRlhfV0NIQVIqKXBWYWx1ZTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpUcnlDRGF0YShYRkFfQVRUUklCVVRFIGVBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZURlZmF1bHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlByb3RvKSB7DQorICB2b2lkKiBwS2V5ID0gTlVMTDsNCisgIGlmICghWEZBX05vZGVEYXRhX1ByZXBhcmVLZXkoR2V0Q2xhc3NJRCgpLCBlQXR0ciwgcEtleSkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKGVBdHRyID09IFhGQV9BVFRSSUJVVEVfVmFsdWUpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmcqIHBTdHIgPSAoQ0ZYX1dpZGVTdHJpbmcqKUdldFVzZXJEYXRhKHBLZXksIGJQcm90byk7DQorICAgIGlmIChwU3RyKSB7DQorICAgICAgd3NWYWx1ZSA9ICpwU3RyOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBpZiAoR2V0TWFwTW9kdWxlU3RyaW5nKHBLZXksIHdzVmFsdWUpKSB7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgIH0NCisgIGlmICghYlVzZURlZmF1bHQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgdm9pZCogcFZhbHVlID0gTlVMTDsNCisgIGlmIChYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlKHBWYWx1ZSwgR2V0Q2xhc3NJRCgpLCBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBtX2VQYWNrZXQpKSB7DQorICAgIHdzVmFsdWUgPSAoQ0ZYX1dpZGVTdHJpbmdDKShjb25zdCBGWF9XQ0hBUiopcFZhbHVlOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX05vZGU6OlNldE9iamVjdChYRkFfQVRUUklCVVRFIGVBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcERhdGEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPKiBwQ2FsbGJhY2tJbmZvKSB7DQorICB2b2lkKiBwS2V5ID0gTlVMTDsNCisgIGlmICghWEZBX05vZGVEYXRhX1ByZXBhcmVLZXkoR2V0Q2xhc3NJRCgpLCBlQXR0ciwgcEtleSkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIFNldFVzZXJEYXRhKHBLZXksIHBEYXRhLCBwQ2FsbGJhY2tJbmZvKTsNCit9DQorRlhfQk9PTCBDWEZBX05vZGU6OlRyeU9iamVjdChYRkFfQVRUUklCVVRFIGVBdHRyLCB2b2lkKiYgcERhdGEpIHsNCisgIHZvaWQqIHBLZXkgPSBOVUxMOw0KKyAgaWYgKCFYRkFfTm9kZURhdGFfUHJlcGFyZUtleShHZXRDbGFzc0lEKCksIGVBdHRyLCBwS2V5KSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBwRGF0YSA9IEdldFVzZXJEYXRhKHBLZXkpOw0KKyAgcmV0dXJuIHBEYXRhICE9IE5VTEw7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpTZXRWYWx1ZShYRkFfQVRUUklCVVRFIGVBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFVFlQRSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkpIHsNCisgIHZvaWQqIHBLZXkgPSBOVUxMOw0KKyAgaWYgKCFYRkFfTm9kZURhdGFfUHJlcGFyZUtleShHZXRDbGFzc0lEKCksIGVBdHRyLCBwS2V5KSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBPbkNoYW5naW5nKGVBdHRyLCBwVmFsdWUsIGJOb3RpZnkpOw0KKyAgU2V0TWFwTW9kdWxlVmFsdWUocEtleSwgcFZhbHVlKTsNCisgIE9uQ2hhbmdlZChlQXR0ciwgcFZhbHVlLCBiTm90aWZ5KTsNCisgIGlmIChJc05lZWRTYXZpbmdYTUxOb2RlKCkpIHsNCisgICAgRlhTWVNfYXNzZXJ0KG1fcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KTsNCisgICAgWEZBX0xQQ0FUVFJJQlVURUlORk8gcEluZm8gPSBYRkFfR2V0QXR0cmlidXRlQnlJRChlQXR0cik7DQorICAgIGlmIChwSW5mbykgew0KKyAgICAgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURVRZUEVfRW51bToNCisgICAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKW1fcFhNTE5vZGUpDQorICAgICAgICAgICAgICAtPlNldFN0cmluZygNCisgICAgICAgICAgICAgICAgICBwSW5mby0+cE5hbWUsDQorICAgICAgICAgICAgICAgICAgWEZBX0dldEF0dHJpYnV0ZUVudW1CeUlEKChYRkFfQVRUUklCVVRFRU5VTSkodWludHB0cl90KXBWYWx1ZSkNCisgICAgICAgICAgICAgICAgICAgICAgLT5wTmFtZSk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuOg0KKyAgICAgICAgICAoKElGREVfWE1MRWxlbWVudCopbV9wWE1MTm9kZSkNCisgICAgICAgICAgICAgIC0+U2V0U3RyaW5nKHBJbmZvLT5wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBWYWx1ZSA/IEZYX1dTVFJDKEwiMSIpIDogRlhfV1NUUkMoTCIwIikpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlcjoNCisgICAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKW1fcFhNTE5vZGUpDQorICAgICAgICAgICAgICAtPlNldEludGVnZXIocEluZm8tPnBOYW1lLCAoaW50MzJfdCkodWludHB0cl90KXBWYWx1ZSk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgRlhTWVNfYXNzZXJ0KDApOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpHZXRWYWx1ZShYRkFfQVRUUklCVVRFIGVBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFVFlQRSBlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXNlRGVmYXVsdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIHBWYWx1ZSkgew0KKyAgdm9pZCogcEtleSA9IE5VTEw7DQorICBpZiAoIVhGQV9Ob2RlRGF0YV9QcmVwYXJlS2V5KEdldENsYXNzSUQoKSwgZUF0dHIsIHBLZXkpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChHZXRNYXBNb2R1bGVWYWx1ZShwS2V5LCBwVmFsdWUpKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaWYgKCFiVXNlRGVmYXVsdCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZShwVmFsdWUsIEdldENsYXNzSUQoKSwgZUF0dHIsIGVUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9lUGFja2V0KTsNCit9DQorc3RhdGljIHZvaWQgWEZBX0RlZmF1bHRGcmVlRGF0YSh2b2lkKiBwRGF0YSkge30NCitzdGF0aWMgWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTyBnc19YRkFEZWZhdWx0RnJlZURhdGEgPSB7DQorICAgIFhGQV9EZWZhdWx0RnJlZURhdGEsIE5VTEx9Ow0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpTZXRVc2VyRGF0YSh2b2lkKiBwS2V5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwRGF0YSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTyogcENhbGxiYWNrSW5mbykgew0KKyAgU2V0TWFwTW9kdWxlQnVmZmVyKHBLZXksICZwRGF0YSwgc2l6ZW9mKHZvaWQqKSwNCisgICAgICAgICAgICAgICAgICAgICBwQ2FsbGJhY2tJbmZvID8gcENhbGxiYWNrSW5mbyA6ICZnc19YRkFEZWZhdWx0RnJlZURhdGEpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpUcnlVc2VyRGF0YSh2b2lkKiBwS2V5LCB2b2lkKiYgcERhdGEsIEZYX0JPT0wgYlByb3RvQWxzbykgew0KKyAgaW50MzJfdCBpQnl0ZXMgPSAwOw0KKyAgaWYgKCFHZXRNYXBNb2R1bGVCdWZmZXIocEtleSwgcERhdGEsIGlCeXRlcywgYlByb3RvQWxzbykpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIGlCeXRlcyA9PSBzaXplb2Yodm9pZCopICYmIEZYU1lTX21lbWNweSgmcERhdGEsIHBEYXRhLCBpQnl0ZXMpOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6U2V0U2NyaXB0Q29udGVudChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1hNTFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTY3JpcHRNb2RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3luY0RhdGEpIHsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBOVUxMOw0KKyAgQ1hGQV9Ob2RlKiBwQmluZE5vZGUgPSBOVUxMOw0KKyAgc3dpdGNoIChHZXRPYmplY3RUeXBlKCkpIHsNCisgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9Db250YWluZXJOb2RlOiB7DQorICAgICAgaWYgKFhGQV9GaWVsZElzTXVsdGlMaXN0Qm94KHRoaXMpKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBWYWx1ZSA9IEdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1ZhbHVlKTsNCisgICAgICAgIENYRkFfTm9kZSogcENoaWxkVmFsdWUgPSBwVmFsdWUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgIEZYU1lTX2Fzc2VydChwQ2hpbGRWYWx1ZSk7DQorICAgICAgICBwQ2hpbGRWYWx1ZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgRlhfV1NUUkMoTCJ0ZXh0L3htbCIpKTsNCisgICAgICAgIHBDaGlsZFZhbHVlLT5TZXRTY3JpcHRDb250ZW50KHdzQ29udGVudCwgd3NDb250ZW50LCBiTm90aWZ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNjcmlwdE1vZGlmeSwgRkFMU0UpOw0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwQmluZCA9IEdldEJpbmREYXRhKCk7DQorICAgICAgICBpZiAoYlN5bmNEYXRhICYmIHBCaW5kKSB7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NTYXZlVGV4dEFycmF5Ow0KKyAgICAgICAgICBpbnQzMl90IGlTaXplID0gMDsNCisgICAgICAgICAgaWYgKCF3c0NvbnRlbnQuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQgPSAwOw0KKyAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCA9IHdzQ29udGVudC5HZXRMZW5ndGgoKTsNCisgICAgICAgICAgICBpbnQzMl90IGlFbmQgPSB3c0NvbnRlbnQuRmluZChMJ1xuJywgaVN0YXJ0KTsNCisgICAgICAgICAgICBpRW5kID0gKGlFbmQgPT0gLTEpID8gaUxlbmd0aCA6IGlFbmQ7DQorICAgICAgICAgICAgd2hpbGUgKGlFbmQgPj0gaVN0YXJ0KSB7DQorICAgICAgICAgICAgICB3c1NhdmVUZXh0QXJyYXkuQWRkKHdzQ29udGVudC5NaWQoaVN0YXJ0LCBpRW5kIC0gaVN0YXJ0KSk7DQorICAgICAgICAgICAgICBpU3RhcnQgPSBpRW5kICsgMTsNCisgICAgICAgICAgICAgIGlmIChpU3RhcnQgPj0gaUxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgIGlFbmQgPSB3c0NvbnRlbnQuRmluZChMJ1xuJywgaVN0YXJ0KTsNCisgICAgICAgICAgICAgIGlmIChpRW5kIDwgMCkgew0KKyAgICAgICAgICAgICAgICB3c1NhdmVUZXh0QXJyYXkuQWRkKHdzQ29udGVudC5NaWQoaVN0YXJ0LCBpTGVuZ3RoIC0gaVN0YXJ0KSk7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlTaXplID0gd3NTYXZlVGV4dEFycmF5LkdldFNpemUoKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAoaVNpemUgPT0gMCkgew0KKyAgICAgICAgICAgIHdoaWxlIChDWEZBX05vZGUqIHBDaGlsZE5vZGUgPQ0KKyAgICAgICAgICAgICAgICAgICAgICAgcEJpbmQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkgew0KKyAgICAgICAgICAgICAgcEJpbmQtPlJlbW92ZUNoaWxkKHBDaGlsZE5vZGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBDWEZBX05vZGVBcnJheSB2YWx1ZU5vZGVzOw0KKyAgICAgICAgICAgIGludDMyX3QgaURhdGFzID0gcEJpbmQtPkdldE5vZGVMaXN0KA0KKyAgICAgICAgICAgICAgICB2YWx1ZU5vZGVzLCBYRkFfTk9ERUZJTFRFUl9DaGlsZHJlbiwgWEZBX0VMRU1FTlRfRGF0YVZhbHVlKTsNCisgICAgICAgICAgICBpZiAoaURhdGFzIDwgaVNpemUpIHsNCisgICAgICAgICAgICAgIGludDMyX3QgaUFkZE5vZGVzID0gaVNpemUgLSBpRGF0YXM7DQorICAgICAgICAgICAgICBDWEZBX05vZGUqIHBWYWx1ZU5vZGVzID0gTlVMTDsNCisgICAgICAgICAgICAgIHdoaWxlIChpQWRkTm9kZXMtLSA+IDApIHsNCisgICAgICAgICAgICAgICAgcFZhbHVlTm9kZXMgPQ0KKyAgICAgICAgICAgICAgICAgICAgcEJpbmQtPkNyZWF0ZVNhbWVQYWNrZXROb2RlKFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSk7DQorICAgICAgICAgICAgICAgIHBWYWx1ZU5vZGVzLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIEZYX1dTVFJDKEwidmFsdWUiKSk7DQorICAgICAgICAgICAgICAgIHBWYWx1ZU5vZGVzLT5DcmVhdGVYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgICAgICAgICAgICBwQmluZC0+SW5zZXJ0Q2hpbGQocFZhbHVlTm9kZXMpOw0KKyAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgcFZhbHVlTm9kZXMgPSBOVUxMOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaURhdGFzID4gaVNpemUpIHsNCisgICAgICAgICAgICAgIGludDMyX3QgaURlbE5vZGVzID0gaURhdGFzIC0gaVNpemU7DQorICAgICAgICAgICAgICB3aGlsZSAoaURlbE5vZGVzLS0gPiAwKSB7DQorICAgICAgICAgICAgICAgIHBCaW5kLT5SZW1vdmVDaGlsZChwQmluZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpKTsNCisgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaW50MzJfdCBpID0gMDsNCisgICAgICAgICAgICBmb3IgKENYRkFfTm9kZSogcFZhbHVlTm9kZSA9DQorICAgICAgICAgICAgICAgICAgICAgcEJpbmQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgICAgICAgICAgIHBWYWx1ZU5vZGU7IHBWYWx1ZU5vZGUgPSBwVmFsdWVOb2RlLT5HZXROb2RlSXRlbSgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgICAgICAgICBwVmFsdWVOb2RlLT5TZXRBdHRyaWJ1dGVWYWx1ZSh3c1NhdmVUZXh0QXJyYXlbaV0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1NhdmVUZXh0QXJyYXlbaV0sIEZBTFNFKTsNCisgICAgICAgICAgICAgIGkrKzsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgbm9kZUFycmF5Ow0KKyAgICAgICAgICBwQmluZC0+R2V0QmluZEl0ZW1zKG5vZGVBcnJheSk7DQorICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5vZGVBcnJheS5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgICAgICAgIENYRkFfTm9kZSogcE5vZGUgPSBub2RlQXJyYXlbaV07DQorICAgICAgICAgICAgaWYgKHBOb2RlID09IHRoaXMpIHsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwTm9kZS0+U2V0U2NyaXB0Q29udGVudCh3c0NvbnRlbnQsIHdzQ29udGVudCwgYk5vdGlmeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2NyaXB0TW9kaWZ5LCBGQUxTRSk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0gZWxzZSBpZiAoR2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cCkgew0KKyAgICAgICAgcE5vZGUgPSB0aGlzOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBDWEZBX05vZGUqIHBWYWx1ZSA9IEdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1ZhbHVlKTsNCisgICAgICAgIENYRkFfTm9kZSogcENoaWxkVmFsdWUgPSBwVmFsdWUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgIEZYU1lTX2Fzc2VydChwQ2hpbGRWYWx1ZSk7DQorICAgICAgICBwQ2hpbGRWYWx1ZS0+U2V0U2NyaXB0Q29udGVudCh3c0NvbnRlbnQsIHdzQ29udGVudCwgYk5vdGlmeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTY3JpcHRNb2RpZnksIEZBTFNFKTsNCisgICAgICB9DQorICAgICAgcEJpbmROb2RlID0gR2V0QmluZERhdGEoKTsNCisgICAgICBpZiAocEJpbmROb2RlICYmIGJTeW5jRGF0YSkgew0KKyAgICAgICAgcEJpbmROb2RlLT5TZXRTY3JpcHRDb250ZW50KHdzQ29udGVudCwgd3NYTUxWYWx1ZSwgYk5vdGlmeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2NyaXB0TW9kaWZ5LCBGQUxTRSk7DQorICAgICAgICBDWEZBX05vZGVBcnJheSBub2RlQXJyYXk7DQorICAgICAgICBwQmluZE5vZGUtPkdldEJpbmRJdGVtcyhub2RlQXJyYXkpOw0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbm9kZUFycmF5LkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICAgIENYRkFfTm9kZSogcE5vZGUgPSBub2RlQXJyYXlbaV07DQorICAgICAgICAgIGlmIChwTm9kZSA9PSB0aGlzKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcE5vZGUtPlNldFNjcmlwdENvbnRlbnQod3NDb250ZW50LCB3c0NvbnRlbnQsIGJOb3RpZnksIFRSVUUsIEZBTFNFKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcEJpbmROb2RlID0gTlVMTDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlOiB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZTsNCisgICAgICBpZiAoR2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4RGF0YSkgew0KKyAgICAgICAgR2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIHdzQ29udGVudFR5cGUsIEZBTFNFKTsNCisgICAgICAgIGlmICh3c0NvbnRlbnRUeXBlLkVxdWFsKEZYX1dTVFJDKEwidGV4dC9odG1sIikpKSB7DQorICAgICAgICAgIHdzQ29udGVudFR5cGUgPSBGWF9XU1RSQyhMIiIpOw0KKyAgICAgICAgICBTZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIENYRkFfTm9kZSogcENvbnRlbnRSYXdEYXRhTm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICBpZiAoIXBDb250ZW50UmF3RGF0YU5vZGUpIHsNCisgICAgICAgIHBDb250ZW50UmF3RGF0YU5vZGUgPQ0KKyAgICAgICAgICAgIENyZWF0ZVNhbWVQYWNrZXROb2RlKCh3c0NvbnRlbnRUeXBlLkVxdWFsKEZYX1dTVFJDKEwidGV4dC94bWwiKSkpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gWEZBX0VMRU1FTlRfU2hhcnB4bWwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBYRkFfRUxFTUVOVF9TaGFycHRleHQpOw0KKyAgICAgICAgSW5zZXJ0Q2hpbGQocENvbnRlbnRSYXdEYXRhTm9kZSk7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBwQ29udGVudFJhd0RhdGFOb2RlLT5TZXRTY3JpcHRDb250ZW50KA0KKyAgICAgICAgICB3c0NvbnRlbnQsIHdzWE1MVmFsdWUsIGJOb3RpZnksIGJTY3JpcHRNb2RpZnksIGJTeW5jRGF0YSk7DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfTm9kZUM6DQorICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfVGV4dE5vZGU6DQorICAgICAgcE5vZGUgPSB0aGlzOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX05vZGVWOg0KKyAgICAgIHBOb2RlID0gdGhpczsNCisgICAgICBpZiAoYlN5bmNEYXRhICYmIEdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9Gb3JtKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnQgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICAgIGlmIChwUGFyZW50KSB7DQorICAgICAgICAgIHBQYXJlbnQgPSBwUGFyZW50LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwUGFyZW50ICYmIHBQYXJlbnQtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9WYWx1ZSkgew0KKyAgICAgICAgICBwUGFyZW50ID0gcFBhcmVudC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgICAgICAgIGlmIChwUGFyZW50ICYmIHBQYXJlbnQtPklzQ29udGFpbmVyTm9kZSgpKSB7DQorICAgICAgICAgICAgcEJpbmROb2RlID0gcFBhcmVudC0+R2V0QmluZERhdGEoKTsNCisgICAgICAgICAgICBpZiAocEJpbmROb2RlKSB7DQorICAgICAgICAgICAgICBwQmluZE5vZGUtPlNldFNjcmlwdENvbnRlbnQod3NDb250ZW50LCB3c1hNTFZhbHVlLCBiTm90aWZ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTY3JpcHRNb2RpZnksIEZBTFNFKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgaWYgKEdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9EYXRhVmFsdWUpIHsNCisgICAgICAgIHBOb2RlID0gdGhpczsNCisgICAgICAgIHBCaW5kTm9kZSA9IHRoaXM7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgaWYgKHBOb2RlKSB7DQorICAgIFNldEF0dHJpYnV0ZVZhbHVlKHdzQ29udGVudCwgd3NYTUxWYWx1ZSwgYk5vdGlmeSwgYlNjcmlwdE1vZGlmeSk7DQorICAgIGlmIChwQmluZE5vZGUgJiYgYlN5bmNEYXRhKSB7DQorICAgICAgQ1hGQV9Ob2RlQXJyYXkgbm9kZUFycmF5Ow0KKyAgICAgIHBCaW5kTm9kZS0+R2V0QmluZEl0ZW1zKG5vZGVBcnJheSk7DQorICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbm9kZUFycmF5LkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gbm9kZUFycmF5W2ldOw0KKyAgICAgICAgcE5vZGUtPlNldFNjcmlwdENvbnRlbnQod3NDb250ZW50LCB3c0NvbnRlbnQsIGJOb3RpZnksIGJTY3JpcHRNb2RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6U2V0Q29udGVudChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1hNTFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTY3JpcHRNb2RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3luY0RhdGEpIHsNCisgIHJldHVybiBTZXRTY3JpcHRDb250ZW50KHdzQ29udGVudCwgd3NYTUxWYWx1ZSwgYk5vdGlmeSwgYlNjcmlwdE1vZGlmeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJTeW5jRGF0YSk7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfTm9kZTo6R2V0U2NyaXB0Q29udGVudChGWF9CT09MIGJTY3JpcHRNb2RpZnkpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsNCisgIHJldHVybiBUcnlDb250ZW50KHdzQ29udGVudCwgYlNjcmlwdE1vZGlmeSkgPyB3c0NvbnRlbnQgOiBDRlhfV2lkZVN0cmluZygpOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX05vZGU6OkdldENvbnRlbnQoKSB7DQorICByZXR1cm4gR2V0U2NyaXB0Q29udGVudCgpOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6VHJ5Q29udGVudChDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJQcm90bykgew0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQorICBzd2l0Y2ggKEdldE9iamVjdFR5cGUoKSkgew0KKyAgICBjYXNlIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGU6DQorICAgICAgaWYgKEdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9FeGNsR3JvdXApIHsNCisgICAgICAgIHBOb2RlID0gdGhpczsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwVmFsdWUgPSBHZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9WYWx1ZSk7DQorICAgICAgICBpZiAoIXBWYWx1ZSkgew0KKyAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBDWEZBX05vZGUqIHBDaGlsZFZhbHVlID0gcFZhbHVlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICBpZiAocENoaWxkVmFsdWUgJiYgWEZBX0ZpZWxkSXNNdWx0aUxpc3RCb3godGhpcykpIHsNCisgICAgICAgICAgcENoaWxkVmFsdWUtPlNldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dTVFJDKEwidGV4dC94bWwiKSk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gcENoaWxkVmFsdWUNCisgICAgICAgICAgICAgICAgICAgPyBwQ2hpbGRWYWx1ZS0+VHJ5Q29udGVudCh3c0NvbnRlbnQsIGJTY3JpcHRNb2RpZnksIGJQcm90bykNCisgICAgICAgICAgICAgICAgICAgOiBGQUxTRTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGU6IHsNCisgICAgICBDWEZBX05vZGUqIHBDb250ZW50UmF3RGF0YU5vZGUgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgaWYgKCFwQ29udGVudFJhd0RhdGFOb2RlKSB7DQorICAgICAgICBYRkFfRUxFTUVOVCBlbGVtZW50ID0gWEZBX0VMRU1FTlRfU2hhcnB0ZXh0Ow0KKyAgICAgICAgaWYgKEdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9FeERhdGEpIHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZTsNCisgICAgICAgICAgR2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIHdzQ29udGVudFR5cGUsIEZBTFNFKTsNCisgICAgICAgICAgaWYgKHdzQ29udGVudFR5cGUuRXF1YWwoRlhfV1NUUkMoTCJ0ZXh0L2h0bWwiKSkpIHsNCisgICAgICAgICAgICBlbGVtZW50ID0gWEZBX0VMRU1FTlRfU2hhcnB4SFRNTDsNCisgICAgICAgICAgfSBlbHNlIGlmICh3c0NvbnRlbnRUeXBlLkVxdWFsKEZYX1dTVFJDKEwidGV4dC94bWwiKSkpIHsNCisgICAgICAgICAgICBlbGVtZW50ID0gWEZBX0VMRU1FTlRfU2hhcnB4bWw7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHBDb250ZW50UmF3RGF0YU5vZGUgPSBDcmVhdGVTYW1lUGFja2V0Tm9kZShlbGVtZW50KTsNCisgICAgICAgIEluc2VydENoaWxkKHBDb250ZW50UmF3RGF0YU5vZGUpOw0KKyAgICAgIH0NCisgICAgICByZXR1cm4gcENvbnRlbnRSYXdEYXRhTm9kZS0+VHJ5Q29udGVudCh3c0NvbnRlbnQsIGJTY3JpcHRNb2RpZnksIGJQcm90byk7DQorICAgIH0NCisgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9Ob2RlQzoNCisgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9Ob2RlVjoNCisgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZToNCisgICAgICBwTm9kZSA9IHRoaXM7DQorICAgIGRlZmF1bHQ6DQorICAgICAgaWYgKEdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9EYXRhVmFsdWUpIHsNCisgICAgICAgIHBOb2RlID0gdGhpczsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICB9DQorICBpZiAocE5vZGUpIHsNCisgICAgaWYgKGJTY3JpcHRNb2RpZnkpIHsNCisgICAgICBJWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKTsNCisgICAgICBpZiAocFNjcmlwdENvbnRleHQpIHsNCisgICAgICAgIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkFkZE5vZGVzT2ZSdW5TY3JpcHQodGhpcyk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiBUcnlDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbnRlbnQsIEZBTFNFLCBiUHJvdG8pOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitDWEZBX05vZGUqIENYRkFfTm9kZTo6R2V0TW9kZWxOb2RlKCkgew0KKyAgc3dpdGNoIChHZXRQYWNrZXRJRCgpKSB7DQorICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9YRFA6DQorICAgICAgcmV0dXJuIG1fcERvY3VtZW50LT5HZXRSb290KCk7DQorICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9Db25maWc6DQorICAgICAgcmV0dXJuIChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Db25maWcpOw0KKyAgICBjYXNlIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGU6DQorICAgICAgcmV0dXJuIChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9UZW1wbGF0ZSk7DQorICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9Gb3JtOg0KKyAgICAgIHJldHVybiAoQ1hGQV9Ob2RlKiltX3BEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRm9ybSk7DQorICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0czoNCisgICAgICByZXR1cm4gKENYRkFfTm9kZSopbV9wRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0RhdGFzZXRzKTsNCisgICAgY2FzZSBYRkFfWERQUEFDS0VUX0xvY2FsZVNldDoNCisgICAgICByZXR1cm4gKENYRkFfTm9kZSopbV9wRG9jdW1lbnQtPkdldFhGQU5vZGUoWEZBX0hBU0hDT0RFX0xvY2FsZVNldCk7DQorICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0Og0KKyAgICAgIHJldHVybiAoQ1hGQV9Ob2RlKiltX3BEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfQ29ubmVjdGlvblNldCk7DQorICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQ6DQorICAgICAgcmV0dXJuIChDWEZBX05vZGUqKW1fcERvY3VtZW50LT5HZXRYRkFOb2RlKFhGQV9IQVNIQ09ERV9Tb3VyY2VTZXQpOw0KKyAgICBjYXNlIFhGQV9YRFBQQUNLRVRfWGRjOg0KKyAgICAgIHJldHVybiAoQ1hGQV9Ob2RlKiltX3BEb2N1bWVudC0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfWGRjKTsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gdGhpczsNCisgIH0NCit9DQorRlhfQk9PTCBDWEZBX05vZGU6OlRyeU5hbWVzcGFjZShDRlhfV2lkZVN0cmluZyYgd3NOYW1lc3BhY2UpIHsNCisgIHdzTmFtZXNwYWNlLkVtcHR5KCk7DQorICBpZiAodGhpcy0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX01vZGVsTm9kZSB8fA0KKyAgICAgIHRoaXMtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9QYWNrZXQpIHsNCisgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSA9IHRoaXMtPkdldFhNTE1hcHBpbmdOb2RlKCk7DQorICAgIGlmICghcFhNTE5vZGUgfHwgcFhNTE5vZGUtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgICgoSUZERV9YTUxFbGVtZW50KilwWE1MTm9kZSktPkdldE5hbWVzcGFjZVVSSSh3c05hbWVzcGFjZSk7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfSBlbHNlIGlmICh0aGlzLT5HZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpIHsNCisgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSA9IHRoaXMtPkdldFhNTE1hcHBpbmdOb2RlKCk7DQorICAgIGlmICghcFhNTE5vZGUpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaWYgKHBYTUxOb2RlLT5HZXRUeXBlKCkgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICAgIGlmICh0aGlzLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRGF0YVZhbHVlICYmDQorICAgICAgICB0aGlzLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfQ29udGFpbnMpID09IFhGQV9BVFRSSUJVVEVFTlVNX01ldGFEYXRhKSB7DQorICAgICAgcmV0dXJuIFhGQV9GREVFeHRlbnNpb25fUmVzb2x2ZU5hbWVzcGFjZVF1YWxpZmllcigNCisgICAgICAgICAgKElGREVfWE1MRWxlbWVudCopcFhNTE5vZGUsDQorICAgICAgICAgIHRoaXMtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfUXVhbGlmaWVkTmFtZSksIHdzTmFtZXNwYWNlKTsNCisgICAgfQ0KKyAgICAoKElGREVfWE1MRWxlbWVudCopcFhNTE5vZGUpLT5HZXROYW1lc3BhY2VVUkkod3NOYW1lc3BhY2UpOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfTm9kZSogcE1vZGVsTm9kZSA9IEdldE1vZGVsTm9kZSgpOw0KKyAgICByZXR1cm4gcE1vZGVsTm9kZS0+VHJ5TmFtZXNwYWNlKHdzTmFtZXNwYWNlKTsNCisgIH0NCit9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldFByb3BlcnR5KGludDMyX3QgaW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVQcm9wZXJ0eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiQ3JlYXRlUHJvcGVydHkpIHsNCisgIFhGQV9FTEVNRU5UIGVFbGVtZW50ID0gR2V0Q2xhc3NJRCgpOw0KKyAgRlhfRFdPUkQgZHdQYWNrZXQgPSBHZXRQYWNrZXRJRCgpOw0KKyAgWEZBX0xQQ1BST1BFUlRZIHBQcm9wZXJ0eSA9DQorICAgICAgWEZBX0dldFByb3BlcnR5T2ZFbGVtZW50KGVFbGVtZW50LCBlUHJvcGVydHksIGR3UGFja2V0KTsNCisgIGlmIChwUHJvcGVydHkgPT0gTlVMTCB8fCBpbmRleCA+PSBwUHJvcGVydHktPnVPY2N1cikgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BDaGlsZDsNCisgIGludDMyX3QgaUNvdW50ID0gMDsNCisgIGZvciAoOyBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBpZiAocE5vZGUtPkdldENsYXNzSUQoKSA9PSBlUHJvcGVydHkpIHsNCisgICAgICBpQ291bnQrKzsNCisgICAgICBpZiAoaUNvdW50ID4gaW5kZXgpIHsNCisgICAgICAgIHJldHVybiBwTm9kZTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmICghYkNyZWF0ZVByb3BlcnR5KSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaWYgKHBQcm9wZXJ0eS0+dUZsYWdzICYgWEZBX1BST1BFUlRZRkxBR19PbmVPZikgew0KKyAgICBwTm9kZSA9IG1fcENoaWxkOw0KKyAgICBmb3IgKDsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgICBYRkFfTFBDUFJPUEVSVFkgcEV4aXN0UHJvdGVydHkgPQ0KKyAgICAgICAgICBYRkFfR2V0UHJvcGVydHlPZkVsZW1lbnQoZUVsZW1lbnQsIHBOb2RlLT5HZXRDbGFzc0lEKCksIGR3UGFja2V0KTsNCisgICAgICBpZiAocEV4aXN0UHJvdGVydHkgJiYgKHBFeGlzdFByb3RlcnR5LT51RmxhZ3MgJiBYRkFfUFJPUEVSVFlGTEFHX09uZU9mKSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBJWEZBX09iakZhY3RvcnkqIHBGYWN0b3J5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXRGYWN0b3J5KCk7DQorICBYRkFfTFBDUEFDS0VUSU5GTyBwUGFja2V0ID0gWEZBX0dldFBhY2tldEJ5SUQoZHdQYWNrZXQpOw0KKyAgQ1hGQV9Ob2RlKiBwTmV3Tm9kZTsNCisgIGZvciAoOyBpQ291bnQgPD0gaW5kZXg7IGlDb3VudCsrKSB7DQorICAgIHBOZXdOb2RlID0gcEZhY3RvcnktPkNyZWF0ZU5vZGUocFBhY2tldCwgZVByb3BlcnR5KTsNCisgICAgaWYgKCFwTmV3Tm9kZSkgew0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHRoaXMtPkluc2VydENoaWxkKHBOZXdOb2RlLCBOVUxMKTsNCisgICAgcE5ld05vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKTsNCisgIH0NCisgIHJldHVybiBwTmV3Tm9kZTsNCit9DQoraW50MzJfdCBDWEZBX05vZGU6OkNvdW50Q2hpbGRyZW4oWEZBX0VMRU1FTlQgZUVsZW1lbnQsIEZYX0JPT0wgYk9ubHlDaGlsZCkgew0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcENoaWxkOw0KKyAgaW50MzJfdCBpQ291bnQgPSAwOw0KKyAgZm9yICg7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIGlmIChwTm9kZS0+R2V0Q2xhc3NJRCgpID09IGVFbGVtZW50IHx8IGVFbGVtZW50ID09IFhGQV9FTEVNRU5UX1VOS05PV04pIHsNCisgICAgICBpZiAoYk9ubHlDaGlsZCkgew0KKyAgICAgICAgWEZBX0xQQ1BST1BFUlRZIHBQcm9wZXJ0ID0gWEZBX0dldFByb3BlcnR5T2ZFbGVtZW50KA0KKyAgICAgICAgICAgIEdldENsYXNzSUQoKSwgcE5vZGUtPkdldENsYXNzSUQoKSwgWEZBX1hEUFBBQ0tFVF9VTktOT1dOKTsNCisgICAgICAgIGlmIChwUHJvcGVydCkgew0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgaUNvdW50Kys7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBpQ291bnQ7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXRDaGlsZChpbnQzMl90IGluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVCBlRWxlbWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiT25seUNoaWxkKSB7DQorICBGWFNZU19hc3NlcnQoaW5kZXggPiAtMSk7DQorICBDWEZBX05vZGUqIHBOb2RlID0gbV9wQ2hpbGQ7DQorICBpbnQzMl90IGlDb3VudCA9IDA7DQorICBmb3IgKDsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsNCisgICAgaWYgKHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gZUVsZW1lbnQgfHwgZUVsZW1lbnQgPT0gWEZBX0VMRU1FTlRfVU5LTk9XTikgew0KKyAgICAgIGlmIChiT25seUNoaWxkKSB7DQorICAgICAgICBYRkFfTFBDUFJPUEVSVFkgcFByb3BlcnQgPSBYRkFfR2V0UHJvcGVydHlPZkVsZW1lbnQoDQorICAgICAgICAgICAgR2V0Q2xhc3NJRCgpLCBwTm9kZS0+R2V0Q2xhc3NJRCgpLCBYRkFfWERQUEFDS0VUX1VOS05PV04pOw0KKyAgICAgICAgaWYgKHBQcm9wZXJ0KSB7DQorICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpQ291bnQrKzsNCisgICAgICBpZiAoaUNvdW50ID4gaW5kZXgpIHsNCisgICAgICAgIHJldHVybiBwTm9kZTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitpbnQzMl90IENYRkFfTm9kZTo6SW5zZXJ0Q2hpbGQoaW50MzJfdCBpbmRleCwgQ1hGQV9Ob2RlKiBwTm9kZSkgew0KKyAgQVNTRVJUKHBOb2RlICE9IE5VTEwgJiYgcE5vZGUtPm1fcE5leHQgPT0gTlVMTCk7DQorICBwTm9kZS0+bV9wUGFyZW50ID0gdGhpczsNCisgIEZYX0JPT0wgYldhc1B1cmdlTm9kZSA9IG1fcERvY3VtZW50LT5SZW1vdmVQdXJnZU5vZGUocE5vZGUpOw0KKyAgRlhTWVNfYXNzZXJ0KGJXYXNQdXJnZU5vZGUgPT0gVFJVRSk7DQorICBpZiAobV9wQ2hpbGQgPT0gTlVMTCB8fCBpbmRleCA9PSAwKSB7DQorICAgIGlmIChpbmRleCA+IDApIHsNCisgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisgICAgcE5vZGUtPm1fcE5leHQgPSBtX3BDaGlsZDsNCisgICAgbV9wQ2hpbGQgPSBwTm9kZTsNCisgICAgaW5kZXggPSAwOw0KKyAgfSBlbHNlIGlmIChpbmRleCA8IDApIHsNCisgICAgbV9wTGFzdENoaWxkLT5tX3BOZXh0ID0gcE5vZGU7DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX05vZGUqIHBQcmV2ID0gbV9wQ2hpbGQ7DQorICAgIGludDMyX3QgaUNvdW50ID0gMDsNCisgICAgd2hpbGUgKCsraUNvdW50ICE9IGluZGV4ICYmIHBQcmV2LT5tX3BOZXh0KSB7DQorICAgICAgcFByZXYgPSBwUHJldi0+bV9wTmV4dDsNCisgICAgfQ0KKyAgICBpZiAoaW5kZXggPiAwICYmIGluZGV4ICE9IGlDb3VudCkgew0KKyAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKyAgICBwTm9kZS0+bV9wTmV4dCA9IHBQcmV2LT5tX3BOZXh0Ow0KKyAgICBwUHJldi0+bV9wTmV4dCA9IHBOb2RlOw0KKyAgICBpbmRleCA9IGlDb3VudDsNCisgIH0NCisgIGlmIChwTm9kZS0+bV9wTmV4dCA9PSBOVUxMKSB7DQorICAgIG1fcExhc3RDaGlsZCA9IHBOb2RlOw0KKyAgfQ0KKyAgQVNTRVJUKG1fcExhc3RDaGlsZCAhPSBOVUxMICYmIG1fcExhc3RDaGlsZC0+bV9wTmV4dCA9PSBOVUxMKTsNCisgIHBOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19IYXNSZW1vdmVkLCBGQUxTRSk7DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAocE5vdGlmeSkgew0KKyAgICBwTm90aWZ5LT5Pbk5vZGVFdmVudCh0aGlzLCBYRkFfTk9ERUVWRU5UX0NoaWxkQWRkZWQsIHBOb2RlKTsNCisgIH0NCisgIGlmIChJc05lZWRTYXZpbmdYTUxOb2RlKCkgJiYgcE5vZGUtPm1fcFhNTE5vZGUpIHsNCisgICAgRlhTWVNfYXNzZXJ0KHBOb2RlLT5tX3BYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OlBhcmVudCkgPT0gTlVMTCk7DQorICAgIG1fcFhNTE5vZGUtPkluc2VydENoaWxkTm9kZShwTm9kZS0+bV9wWE1MTm9kZSwgaW5kZXgpOw0KKyAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfT3duWE1MTm9kZSwgRkFMU0UsIEZBTFNFKTsNCisgIH0NCisgIHJldHVybiBpbmRleDsNCit9DQorRlhfQk9PTCBDWEZBX05vZGU6Okluc2VydENoaWxkKENYRkFfTm9kZSogcE5vZGUsIENYRkFfTm9kZSogcEJlZm9yZU5vZGUpIHsNCisgIGlmICghcE5vZGUgfHwgcE5vZGUtPm1fcFBhcmVudCAhPSBOVUxMIHx8DQorICAgICAgKHBCZWZvcmVOb2RlICYmIHBCZWZvcmVOb2RlLT5tX3BQYXJlbnQgIT0gdGhpcykpIHsNCisgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgRlhfQk9PTCBiV2FzUHVyZ2VOb2RlID0gbV9wRG9jdW1lbnQtPlJlbW92ZVB1cmdlTm9kZShwTm9kZSk7DQorICBGWFNZU19hc3NlcnQoYldhc1B1cmdlTm9kZSA9PSBUUlVFKTsNCisgIGludDMyX3QgbkluZGV4ID0gLTE7DQorICBwTm9kZS0+bV9wUGFyZW50ID0gdGhpczsNCisgIGlmIChtX3BDaGlsZCA9PSBOVUxMIHx8IHBCZWZvcmVOb2RlID09IG1fcENoaWxkKSB7DQorICAgIHBOb2RlLT5tX3BOZXh0ID0gbV9wQ2hpbGQ7DQorICAgIG1fcENoaWxkID0gcE5vZGU7DQorICAgIG5JbmRleCA9IDA7DQorICB9IGVsc2UgaWYgKCFwQmVmb3JlTm9kZSkgew0KKyAgICBwTm9kZS0+bV9wTmV4dCA9IG1fcExhc3RDaGlsZC0+bV9wTmV4dDsNCisgICAgbV9wTGFzdENoaWxkLT5tX3BOZXh0ID0gcE5vZGU7DQorICB9IGVsc2Ugew0KKyAgICBuSW5kZXggPSAxOw0KKyAgICBDWEZBX05vZGUqIHBQcmV2ID0gbV9wQ2hpbGQ7DQorICAgIHdoaWxlIChwUHJldi0+bV9wTmV4dCAhPSBwQmVmb3JlTm9kZSkgew0KKyAgICAgIHBQcmV2ID0gcFByZXYtPm1fcE5leHQ7DQorICAgICAgbkluZGV4Kys7DQorICAgIH0NCisgICAgcE5vZGUtPm1fcE5leHQgPSBwUHJldi0+bV9wTmV4dDsNCisgICAgcFByZXYtPm1fcE5leHQgPSBwTm9kZTsNCisgIH0NCisgIGlmIChwTm9kZS0+bV9wTmV4dCA9PSBOVUxMKSB7DQorICAgIG1fcExhc3RDaGlsZCA9IHBOb2RlOw0KKyAgfQ0KKyAgQVNTRVJUKG1fcExhc3RDaGlsZCAhPSBOVUxMICYmIG1fcExhc3RDaGlsZC0+bV9wTmV4dCA9PSBOVUxMKTsNCisgIHBOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19IYXNSZW1vdmVkLCBGQUxTRSk7DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAocE5vdGlmeSkgew0KKyAgICBwTm90aWZ5LT5Pbk5vZGVFdmVudCh0aGlzLCBYRkFfTk9ERUVWRU5UX0NoaWxkQWRkZWQsIHBOb2RlKTsNCisgIH0NCisgIGlmIChJc05lZWRTYXZpbmdYTUxOb2RlKCkgJiYgcE5vZGUtPm1fcFhNTE5vZGUpIHsNCisgICAgRlhTWVNfYXNzZXJ0KHBOb2RlLT5tX3BYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OlBhcmVudCkgPT0gTlVMTCk7DQorICAgIG1fcFhNTE5vZGUtPkluc2VydENoaWxkTm9kZShwTm9kZS0+bV9wWE1MTm9kZSwgbkluZGV4KTsNCisgICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX093blhNTE5vZGUsIEZBTFNFLCBGQUxTRSk7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkRlcHJlY2F0ZWRfR2V0UHJldlNpYmxpbmcoKSB7DQorICBpZiAoIW1fcFBhcmVudCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIGZvciAoQ1hGQV9Ob2RlKiBwU2libGluZyA9IG1fcFBhcmVudC0+bV9wQ2hpbGQ7IHBTaWJsaW5nOw0KKyAgICAgICBwU2libGluZyA9IHBTaWJsaW5nLT5tX3BOZXh0KSB7DQorICAgIGlmIChwU2libGluZy0+bV9wTmV4dCA9PSB0aGlzKSB7DQorICAgICAgcmV0dXJuIHBTaWJsaW5nOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorRlhfQk9PTCBDWEZBX05vZGU6OlJlbW92ZUNoaWxkKENYRkFfTm9kZSogcE5vZGUsIEZYX0JPT0wgYk5vdGlmeSkgew0KKyAgaWYgKHBOb2RlID09IE5VTEwgfHwgcE5vZGUtPm1fcFBhcmVudCAhPSB0aGlzKSB7DQorICAgIEZYU1lTX2Fzc2VydChGQUxTRSk7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChtX3BDaGlsZCA9PSBwTm9kZSkgew0KKyAgICBtX3BDaGlsZCA9IHBOb2RlLT5tX3BOZXh0Ow0KKyAgICBpZiAobV9wTGFzdENoaWxkID09IHBOb2RlKSB7DQorICAgICAgbV9wTGFzdENoaWxkID0gcE5vZGUtPm1fcE5leHQ7DQorICAgIH0NCisgICAgcE5vZGUtPm1fcE5leHQgPSBOVUxMOw0KKyAgICBwTm9kZS0+bV9wUGFyZW50ID0gTlVMTDsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfTm9kZSogcFByZXYgPSBwTm9kZS0+RGVwcmVjYXRlZF9HZXRQcmV2U2libGluZygpOw0KKyAgICBwUHJldi0+bV9wTmV4dCA9IHBOb2RlLT5tX3BOZXh0Ow0KKyAgICBpZiAobV9wTGFzdENoaWxkID09IHBOb2RlKSB7DQorICAgICAgbV9wTGFzdENoaWxkID0gcE5vZGUtPm1fcE5leHQgPyBwTm9kZS0+bV9wTmV4dCA6IHBQcmV2Ow0KKyAgICB9DQorICAgIHBOb2RlLT5tX3BOZXh0ID0gTlVMTDsNCisgICAgcE5vZGUtPm1fcFBhcmVudCA9IE5VTEw7DQorICB9DQorICBBU1NFUlQobV9wTGFzdENoaWxkID09IE5VTEwgfHwgbV9wTGFzdENoaWxkLT5tX3BOZXh0ID09IE5VTEwpOw0KKyAgT25SZW1vdmVkKHRoaXMsIHBOb2RlLCBiTm90aWZ5KTsNCisgIHBOb2RlLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19IYXNSZW1vdmVkKTsNCisgIG1fcERvY3VtZW50LT5BZGRQdXJnZU5vZGUocE5vZGUpOw0KKyAgaWYgKElzTmVlZFNhdmluZ1hNTE5vZGUoKSAmJiBwTm9kZS0+bV9wWE1MTm9kZSkgew0KKyAgICBpZiAocE5vZGUtPklzQXR0cmlidXRlSW5YTUwoKSkgew0KKyAgICAgIEZYU1lTX2Fzc2VydChwTm9kZS0+bV9wWE1MTm9kZSA9PSBtX3BYTUxOb2RlICYmDQorICAgICAgICAgICAgICAgICAgIG1fcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KTsNCisgICAgICBpZiAocE5vZGUtPm1fcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICBJRkRFX1hNTEVsZW1lbnQqIHBYTUxFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCopKHBOb2RlLT5tX3BYTUxOb2RlKTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0F0dHJpYnV0ZU5hbWUgPQ0KKyAgICAgICAgICAgIHBOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX1F1YWxpZmllZE5hbWUpOw0KKyAgICAgICAgcFhNTEVsZW1lbnQtPlJlbW92ZUF0dHJpYnV0ZSh3c0F0dHJpYnV0ZU5hbWUuR2V0UHRyKCkpOw0KKyAgICAgIH0NCisgICAgICBDRlhfV2lkZVN0cmluZyB3c05hbWU7DQorICAgICAgcE5vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSwgRkFMU0UpOw0KKyAgICAgIElGREVfWE1MRWxlbWVudCogcE5ld1hNTEVsZW1lbnQgPSBJRkRFX1hNTEVsZW1lbnQ6OkNyZWF0ZSh3c05hbWUpOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nQyB3c1ZhbHVlID0gdGhpcy0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSk7DQorICAgICAgaWYgKCF3c1ZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgICAgcE5ld1hNTEVsZW1lbnQtPlNldFRleHREYXRhKHdzVmFsdWUpOw0KKyAgICAgIH0NCisgICAgICBwTm9kZS0+bV9wWE1MTm9kZSA9IHBOZXdYTUxFbGVtZW50Ow0KKyAgICAgIHBOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfQ29udGFpbnMsIFhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd24pOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG1fcFhNTE5vZGUtPlJlbW92ZUNoaWxkTm9kZShwTm9kZS0+bV9wWE1MTm9kZSk7DQorICAgIH0NCisgICAgcE5vZGUtPlNldEZsYWcoWEZBX05PREVGTEFHX093blhNTE5vZGUsIFRSVUUsIEZBTFNFKTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitDWEZBX05vZGUqIENYRkFfTm9kZTo6R2V0Rmlyc3RDaGlsZEJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSkgY29uc3Qgew0KKyAgcmV0dXJuIEdldEZpcnN0Q2hpbGRCeU5hbWUoDQorICAgICAgd3NOYW1lLklzRW1wdHkoKSA/IDAgOiBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05hbWUuR2V0UHRyKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c05hbWUuR2V0TGVuZ3RoKCkpKTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldEZpcnN0Q2hpbGRCeU5hbWUoRlhfRFdPUkQgZHdOYW1lSGFzaCkgY29uc3Qgew0KKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwTm9kZTsNCisgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBpZiAocE5vZGUtPkdldE5hbWVIYXNoKCkgPT0gZHdOYW1lSGFzaCkgew0KKyAgICAgIHJldHVybiBwTm9kZTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVCBlRWxlbWVudCkgY29uc3Qgew0KKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwTm9kZTsNCisgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBpZiAocE5vZGUtPkdldENsYXNzSUQoKSA9PSBlRWxlbWVudCkgew0KKyAgICAgIHJldHVybiBwTm9kZTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXROZXh0U2FtZU5hbWVTaWJsaW5nKEZYX0RXT1JEIGR3TmFtZUhhc2gpIGNvbnN0IHsNCisgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7IHBOb2RlOw0KKyAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIGlmIChwTm9kZS0+R2V0TmFtZUhhc2goKSA9PSBkd05hbWVIYXNoKSB7DQorICAgICAgcmV0dXJuIHBOb2RlOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldE5leHRTYW1lTmFtZVNpYmxpbmcoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOb2RlTmFtZSkgY29uc3Qgew0KKyAgcmV0dXJuIEdldE5leHRTYW1lTmFtZVNpYmxpbmcoDQorICAgICAgd3NOb2RlTmFtZS5Jc0VtcHR5KCkgPyAwDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05vZGVOYW1lLkdldFB0cigpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NOb2RlTmFtZS5HZXRMZW5ndGgoKSkpOw0KK30NCitDWEZBX05vZGUqIENYRkFfTm9kZTo6R2V0TmV4dFNhbWVDbGFzc1NpYmxpbmcoWEZBX0VMRU1FTlQgZUVsZW1lbnQpIGNvbnN0IHsNCisgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7IHBOb2RlOw0KKyAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIGlmIChwTm9kZS0+R2V0Q2xhc3NJRCgpID09IGVFbGVtZW50KSB7DQorICAgICAgcmV0dXJuIHBOb2RlOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQoraW50MzJfdCBDWEZBX05vZGU6OkdldE5vZGVTYW1lTmFtZUluZGV4KCkgY29uc3Qgew0KKyAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICBpZiAoIXBTY3JpcHRDb250ZXh0KSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIHJldHVybiBwU2NyaXB0Q29udGV4dC0+R2V0SW5kZXhCeU5hbWUoKENYRkFfTm9kZSopdGhpcyk7DQorfQ0KK2ludDMyX3QgQ1hGQV9Ob2RlOjpHZXROb2RlU2FtZUNsYXNzSW5kZXgoKSBjb25zdCB7DQorICBJWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKTsNCisgIGlmICghcFNjcmlwdENvbnRleHQpIHsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgcmV0dXJuIHBTY3JpcHRDb250ZXh0LT5HZXRJbmRleEJ5Q2xhc3NOYW1lKChDWEZBX05vZGUqKXRoaXMpOw0KK30NCit2b2lkIENYRkFfTm9kZTo6R2V0U09NRXhwcmVzc2lvbihDRlhfV2lkZVN0cmluZyYgd3NTT01FeHByZXNzaW9uKSB7DQorICBJWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKTsNCisgIGlmICghcFNjcmlwdENvbnRleHQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgcFNjcmlwdENvbnRleHQtPkdldFNvbUV4cHJlc3Npb24odGhpcywgd3NTT01FeHByZXNzaW9uKTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldEluc3RhbmNlTWdyT2ZTdWJmb3JtKCkgew0KKyAgQ1hGQV9Ob2RlKiBwSW5zdGFuY2VNZ3IgPSBOVUxMOw0KKyAgaWYgKG1fZVBhY2tldCA9PSBYRkFfWERQUEFDS0VUX0Zvcm0pIHsNCisgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICBpZiAoIXBQYXJlbnROb2RlIHx8IHBQYXJlbnROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfQXJlYSkgew0KKyAgICAgIHJldHVybiBwSW5zdGFuY2VNZ3I7DQorICAgIH0NCisgICAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1ByZXZTaWJsaW5nKTsNCisgICAgICAgICBwTm9kZSAhPSBOVUxMOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUHJldlNpYmxpbmcpKSB7DQorICAgICAgWEZBX0VMRU1FTlQgZVR5cGUgPSBwTm9kZS0+R2V0Q2xhc3NJRCgpOw0KKyAgICAgIGlmICgoZVR5cGUgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSB8fCBlVHlwZSA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0KSAmJg0KKyAgICAgICAgICBwTm9kZS0+bV9kd05hbWVIYXNoICE9IG1fZHdOYW1lSGFzaCkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlmIChlVHlwZSA9PSBYRkFfRUxFTUVOVF9JbnN0YW5jZU1hbmFnZXIpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c05hbWUgPSBHZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSW5zdE5hbWUgPSBwTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKTsNCisgICAgICAgIGlmICh3c0luc3ROYW1lLkdldExlbmd0aCgpID4gMCAmJiB3c0luc3ROYW1lLkdldEF0KDApID09ICdfJyAmJg0KKyAgICAgICAgICAgIHdzSW5zdE5hbWUuTWlkKDEpID09IHdzTmFtZSkgew0KKyAgICAgICAgICBwSW5zdGFuY2VNZ3IgPSBwTm9kZTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHBJbnN0YW5jZU1ncjsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldE9jY3VyTm9kZSgpIHsNCisgIHJldHVybiBHZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9PY2N1cik7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpIYXNGbGFnKEZYX0RXT1JEIGR3RmxhZykgY29uc3Qgew0KKyAgaWYgKG1fdUZsYWdzICYgZHdGbGFnKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgc3dpdGNoIChkd0ZsYWcpIHsNCisgICAgY2FzZSBYRkFfTk9ERUZMQUdfSGFzUmVtb3ZlZDoNCisgICAgICByZXR1cm4gbV9wUGFyZW50ICYmIG1fcFBhcmVudC0+SGFzRmxhZyhkd0ZsYWcpOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCit2b2lkIENYRkFfTm9kZTo6U2V0RmxhZyhGWF9EV09SRCBkd0ZsYWcsIEZYX0JPT0wgYk9uLCBGWF9CT09MIGJOb3RpZnkpIHsNCisgIGlmIChiT24pIHsNCisgICAgc3dpdGNoIChkd0ZsYWcpIHsNCisgICAgICBjYXNlIFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZDoNCisgICAgICAgIGlmIChiTm90aWZ5ICYmICFIYXNGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCkpIHsNCisgICAgICAgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgICAgICAgICBpZiAocE5vdGlmeSkgew0KKyAgICAgICAgICAgIHBOb3RpZnktPk9uTm9kZUV2ZW50KHRoaXMsIFhGQV9OT0RFRVZFTlRfUmVhZHkpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgbV91RmxhZ3MgfD0gZHdGbGFnOw0KKyAgfSBlbHNlIHsNCisgICAgbV91RmxhZ3MgJj0gfmR3RmxhZzsNCisgIH0NCit9DQorRlhfQk9PTCBDWEZBX05vZGU6OklzQXR0cmlidXRlSW5YTUwoKSB7DQorICByZXR1cm4gR2V0RW51bShYRkFfQVRUUklCVVRFX0NvbnRhaW5zKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9NZXRhRGF0YTsNCit9DQordm9pZCBDWEZBX05vZGU6Ok9uUmVtb3ZlZChDWEZBX05vZGUqIHBQYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBSZW1vdmVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5KSB7DQorICBpZiAoYk5vdGlmeSAmJiAocFBhcmVudCAhPSBOVUxMKSkgew0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgIGlmIChwTm90aWZ5KSB7DQorICAgICAgcE5vdGlmeS0+T25Ob2RlRXZlbnQocFBhcmVudCwgWEZBX05PREVFVkVOVF9DaGlsZFJlbW92ZWQsIHBSZW1vdmVkKTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6T25DaGFuZ2luZyhYRkFfQVRUUklCVVRFIGVBdHRyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBOZXdWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnkpIHsNCisgIGlmIChiTm90aWZ5ICYmIEhhc0ZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkKSkgew0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgIGlmIChwTm90aWZ5KSB7DQorICAgICAgcE5vdGlmeS0+T25Ob2RlRXZlbnQodGhpcywgWEZBX05PREVFVkVOVF9WYWx1ZUNoYW5naW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikodWludHB0cl90KWVBdHRyLCBwTmV3VmFsdWUpOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpPbkNoYW5nZWQoWEZBX0FUVFJJQlVURSBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBOZXdWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNjcmlwdE1vZGlmeSkgew0KKyAgaWYgKGJOb3RpZnkgJiYgSGFzRmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQpKSB7DQorICAgIFNjcmlwdF9BdHRyaWJ1dGVfU2VuZEF0dHJpYnV0ZUNoYW5nZU1lc3NhZ2UoKHZvaWQqKSh1aW50cHRyX3QpZUF0dHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5ld1ZhbHVlLCBiU2NyaXB0TW9kaWZ5KTsNCisgIH0NCit9DQoraW50MzJfdCBDWEZBX05vZGU6OmV4ZWNTaW5nbGVFdmVudEJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRXZlbnROYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlQgZUVsZW1lbnRUeXBlKSB7DQorICBpbnQzMl90IGlSZXQgPSBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsNCisgIGNvbnN0IFhGQV9FeGVjRXZlbnRQYXJhSW5mbyogZXZlbnRQYXJhSW5mbyA9DQorICAgICAgR2V0RXZlbnRQYXJhSW5mb0J5TmFtZSh3c0V2ZW50TmFtZSk7DQorICBpZiAoZXZlbnRQYXJhSW5mbykgew0KKyAgICB1aW50MzJfdCB2YWxpZEZsYWdzID0gZXZlbnRQYXJhSW5mby0+bV92YWxpZEZsYWdzOw0KKyAgICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICAgIGlmICghcE5vdGlmeSkgew0KKyAgICAgIHJldHVybiBpUmV0Ow0KKyAgICB9DQorICAgIGlmICh2YWxpZEZsYWdzID09IDEpIHsNCisgICAgICBpUmV0ID0gcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgZXZlbnRQYXJhSW5mby0+bV9ldmVudFR5cGUpOw0KKyAgICB9IGVsc2UgaWYgKHZhbGlkRmxhZ3MgPT0gMikgew0KKyAgICAgIGlSZXQgPSBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBldmVudFBhcmFJbmZvLT5tX2V2ZW50VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIEZBTFNFKTsNCisgICAgfSBlbHNlIGlmICh2YWxpZEZsYWdzID09IDMpIHsNCisgICAgICBpZiAoZUVsZW1lbnRUeXBlID09IFhGQV9FTEVNRU5UX1N1YmZvcm0pIHsNCisgICAgICAgIGlSZXQgPSBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBldmVudFBhcmFJbmZvLT5tX2V2ZW50VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgRkFMU0UpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmICh2YWxpZEZsYWdzID09IDQpIHsNCisgICAgICBpZiAoZUVsZW1lbnRUeXBlID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cCB8fA0KKyAgICAgICAgICBlRWxlbWVudFR5cGUgPT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCisgICAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgICAgICAgIGlmIChwUGFyZW50Tm9kZSAmJiBwUGFyZW50Tm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cCkgew0KKyAgICAgICAgICBpUmV0ID0gcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgZXZlbnRQYXJhSW5mby0+bV9ldmVudFR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgRkFMU0UpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaVJldCA9IHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIGV2ZW50UGFyYUluZm8tPm1fZXZlbnRUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBGQUxTRSk7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKHZhbGlkRmxhZ3MgPT0gNSkgew0KKyAgICAgIGlmIChlRWxlbWVudFR5cGUgPT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCisgICAgICAgIGlSZXQgPSBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBldmVudFBhcmFJbmZvLT5tX2V2ZW50VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgRkFMU0UpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIGlmICh2YWxpZEZsYWdzID09IDYpIHsNCisgICAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOw0KKyAgICAgIGlmIChwV2lkZ2V0RGF0YSkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwVUlOb2RlID0gcFdpZGdldERhdGEtPkdldFVJQ2hpbGQoKTsNCisgICAgICAgIGlmIChwVUlOb2RlLT5tX2VOb2RlQ2xhc3MgPT0gWEZBX0VMRU1FTlRfU2lnbmF0dXJlKSB7DQorICAgICAgICAgIGlSZXQgPSBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBldmVudFBhcmFJbmZvLT5tX2V2ZW50VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBGQUxTRSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKHZhbGlkRmxhZ3MgPT0gNykgew0KKyAgICAgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7DQorICAgICAgaWYgKHBXaWRnZXREYXRhKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBVSU5vZGUgPSBwV2lkZ2V0RGF0YS0+R2V0VUlDaGlsZCgpOw0KKyAgICAgICAgaWYgKChwVUlOb2RlLT5tX2VOb2RlQ2xhc3MgPT0gWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdCkgJiYNCisgICAgICAgICAgICAoIXBXaWRnZXREYXRhLT5Jc0xpc3RCb3goKSkpIHsNCisgICAgICAgICAgaVJldCA9IHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIGV2ZW50UGFyYUluZm8tPm1fZXZlbnRUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIEZBTFNFKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBpUmV0Ow0KK30NCit2b2lkIENYRkFfTm9kZTo6VXBkYXRlTmFtZUhhc2goKSB7DQorICBYRkFfTFBDTk9UU1VSRUFUVFJJQlVURSBwTm90c3VyZSA9DQorICAgICAgWEZBX0dldE5vdHN1cmVBdHRyaWJ1dGUoR2V0Q2xhc3NJRCgpLCBYRkFfQVRUUklCVVRFX05hbWUpOw0KKyAgaWYgKCFwTm90c3VyZSB8fCBwTm90c3VyZS0+ZVR5cGUgPT0gWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzTmFtZSA9IEdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSk7DQorICAgIG1fZHdOYW1lSGFzaCA9DQorICAgICAgICB3c05hbWUuSXNFbXB0eSgpID8gMCA6IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTmFtZS5HZXRQdHIoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NOYW1lLkdldExlbmd0aCgpKTsNCisgIH0gZWxzZSBpZiAocE5vdHN1cmUtPmVUeXBlID09IFhGQV9BVFRSSUJVVEVUWVBFX0VudW0pIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzTmFtZSA9DQorICAgICAgICBYRkFfR2V0QXR0cmlidXRlRW51bUJ5SUQoR2V0RW51bShYRkFfQVRUUklCVVRFX05hbWUpKS0+cE5hbWU7DQorICAgIG1fZHdOYW1lSGFzaCA9DQorICAgICAgICB3c05hbWUuSXNFbXB0eSgpID8gMCA6IEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzTmFtZS5HZXRQdHIoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NOYW1lLkdldExlbmd0aCgpKTsNCisgIH0NCit9DQorSUZERV9YTUxOb2RlKiBDWEZBX05vZGU6OkNyZWF0ZVhNTE1hcHBpbmdOb2RlKCkgew0KKyAgaWYgKCFtX3BYTUxOb2RlKSB7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c1RhZyA9IEdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSk7DQorICAgIG1fcFhNTE5vZGUgPSBJRkRFX1hNTEVsZW1lbnQ6OkNyZWF0ZSh3c1RhZyk7DQorICAgIFNldEZsYWcoWEZBX05PREVGTEFHX093blhNTE5vZGUsIFRSVUUsIEZBTFNFKTsNCisgIH0NCisgIHJldHVybiBtX3BYTUxOb2RlOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6SXNOZWVkU2F2aW5nWE1MTm9kZSgpIHsNCisgIHJldHVybiBtX3BYTUxOb2RlICYmIChHZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMgfHwNCisgICAgICAgICAgICAgICAgICAgICAgICBHZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfWGZhKTsNCit9DQorWEZBX0xQTUFQTU9EVUxFREFUQSBDWEZBX05vZGU6OkdldE1hcE1vZHVsZURhdGEoRlhfQk9PTCBiQ3JlYXRlTmV3KSB7DQorICBpZiAoIW1fcE1hcE1vZHVsZURhdGEgJiYgYkNyZWF0ZU5ldykgew0KKyAgICBtX3BNYXBNb2R1bGVEYXRhID0gbmV3IFhGQV9NQVBNT0RVTEVEQVRBOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcE1hcE1vZHVsZURhdGE7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpTZXRNYXBNb2R1bGVWYWx1ZSh2b2lkKiBwS2V5LCB2b2lkKiBwVmFsdWUpIHsNCisgIFhGQV9MUE1BUE1PRFVMRURBVEEgcE1vdWRsZSA9IHRoaXMtPkdldE1hcE1vZHVsZURhdGEoVFJVRSk7DQorICBpZiAoIXBNb3VkbGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgcE1vdWRsZS0+bV9WYWx1ZU1hcC5TZXRBdChwS2V5LCBwVmFsdWUpOw0KK30NCitGWF9CT09MIENYRkFfTm9kZTo6R2V0TWFwTW9kdWxlVmFsdWUodm9pZCogcEtleSwgdm9pZComIHBWYWx1ZSkgew0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHRoaXM7DQorICB3aGlsZSAocE5vZGUpIHsNCisgICAgWEZBX0xQTUFQTU9EVUxFREFUQSBwTW91ZGxlID0gcE5vZGUtPkdldE1hcE1vZHVsZURhdGEoRkFMU0UpOw0KKyAgICBpZiAocE1vdWRsZSAmJiBwTW91ZGxlLT5tX1ZhbHVlTWFwLkxvb2t1cChwS2V5LCBwVmFsdWUpKSB7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgcE5vZGUgPSBwTm9kZS0+R2V0UGFja2V0SUQoKSAhPSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzDQorICAgICAgICAgICAgICAgID8gcE5vZGUtPkdldFRlbXBsYXRlTm9kZSgpDQorICAgICAgICAgICAgICAgIDogTlVMTDsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDWEZBX05vZGU6OlNldE1hcE1vZHVsZVN0cmluZyh2b2lkKiBwS2V5LCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUpIHsNCisgIFNldE1hcE1vZHVsZUJ1ZmZlcihwS2V5LCAodm9pZCopd3NWYWx1ZS5HZXRQdHIoKSwNCisgICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlLkdldExlbmd0aCgpICogc2l6ZW9mKEZYX1dDSEFSKSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpHZXRNYXBNb2R1bGVTdHJpbmcodm9pZCogcEtleSwgQ0ZYX1dpZGVTdHJpbmdDJiB3c1ZhbHVlKSB7DQorICB2b2lkKiBwVmFsdWU7DQorICBpbnQzMl90IGlCeXRlczsNCisgIGlmICghR2V0TWFwTW9kdWxlQnVmZmVyKHBLZXksIHBWYWx1ZSwgaUJ5dGVzKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB3c1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmdDKChjb25zdCBGWF9XQ0hBUiopcFZhbHVlLCBpQnl0ZXMgLyBzaXplb2YoRlhfV0NIQVIpKTsNCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENYRkFfTm9kZTo6U2V0TWFwTW9kdWxlQnVmZmVyKA0KKyAgICB2b2lkKiBwS2V5LA0KKyAgICB2b2lkKiBwVmFsdWUsDQorICAgIGludDMyX3QgaUJ5dGVzLA0KKyAgICBYRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPKiBwQ2FsbGJhY2tJbmZvKSB7DQorICBYRkFfTFBNQVBNT0RVTEVEQVRBIHBNb3VkbGUgPSB0aGlzLT5HZXRNYXBNb2R1bGVEYXRhKFRSVUUpOw0KKyAgaWYgKCFwTW91ZGxlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIFhGQV9MUE1BUERBVEFCTE9DSyYgcEJ1ZmZlciA9IHBNb3VkbGUtPm1fQnVmZmVyTWFwW3BLZXldOw0KKyAgaWYgKHBCdWZmZXIgPT0gTlVMTCkgew0KKyAgICBwQnVmZmVyID0gKFhGQV9MUE1BUERBVEFCTE9DSylGWF9BbGxvYyh1aW50OF90LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoWEZBX01BUERBVEFCTE9DSykgKyBpQnl0ZXMpOw0KKyAgfSBlbHNlIGlmIChwQnVmZmVyLT5pQnl0ZXMgIT0gaUJ5dGVzKSB7DQorICAgIGlmIChwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvICYmIHBCdWZmZXItPnBDYWxsYmFja0luZm8tPnBGcmVlKSB7DQorICAgICAgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUoKih2b2lkKiopcEJ1ZmZlci0+R2V0RGF0YSgpKTsNCisgICAgfQ0KKyAgICBwQnVmZmVyID0gKFhGQV9MUE1BUERBVEFCTE9DSylGWF9SZWFsbG9jKHVpbnQ4X3QsIHBCdWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFhGQV9NQVBEQVRBQkxPQ0spICsgaUJ5dGVzKTsNCisgIH0gZWxzZSBpZiAocEJ1ZmZlci0+cENhbGxiYWNrSW5mbyAmJiBwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wRnJlZSkgew0KKyAgICBwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wRnJlZSgqKHZvaWQqKilwQnVmZmVyLT5HZXREYXRhKCkpOw0KKyAgfQ0KKyAgaWYgKHBCdWZmZXIgPT0gTlVMTCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvID0gcENhbGxiYWNrSW5mbzsNCisgIHBCdWZmZXItPmlCeXRlcyA9IGlCeXRlczsNCisgIEZYU1lTX21lbWNweShwQnVmZmVyLT5HZXREYXRhKCksIHBWYWx1ZSwgaUJ5dGVzKTsNCit9DQorRlhfQk9PTCBDWEZBX05vZGU6OkdldE1hcE1vZHVsZUJ1ZmZlcih2b2lkKiBwS2V5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIHBWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlCeXRlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlByb3RvQWxzbykgew0KKyAgWEZBX0xQTUFQREFUQUJMT0NLIHBCdWZmZXIgPSBOVUxMOw0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHRoaXM7DQorICB3aGlsZSAocE5vZGUpIHsNCisgICAgWEZBX0xQTUFQTU9EVUxFREFUQSBwTW91ZGxlID0gcE5vZGUtPkdldE1hcE1vZHVsZURhdGEoRkFMU0UpOw0KKyAgICBpZiAocE1vdWRsZSAmJiBwTW91ZGxlLT5tX0J1ZmZlck1hcC5Mb29rdXAocEtleSwgcEJ1ZmZlcikpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBwTm9kZSA9IChiUHJvdG9BbHNvICYmIHBOb2RlLT5HZXRQYWNrZXRJRCgpICE9IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpDQorICAgICAgICAgICAgICAgID8gcE5vZGUtPkdldFRlbXBsYXRlTm9kZSgpDQorICAgICAgICAgICAgICAgIDogTlVMTDsNCisgIH0NCisgIGlmIChwQnVmZmVyID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcFZhbHVlID0gcEJ1ZmZlci0+R2V0RGF0YSgpOw0KKyAgaUJ5dGVzID0gcEJ1ZmZlci0+aUJ5dGVzOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Ob2RlOjpIYXNNYXBNb2R1bGVLZXkodm9pZCogcEtleSwgRlhfQk9PTCBiUHJvdG9BbHNvKSB7DQorICBDWEZBX05vZGUqIHBOb2RlID0gdGhpczsNCisgIHdoaWxlIChwTm9kZSkgew0KKyAgICB2b2lkKiBwVmFsOw0KKyAgICBYRkFfTFBNQVBNT0RVTEVEQVRBIHBNb3VkbGUgPSBwTm9kZS0+R2V0TWFwTW9kdWxlRGF0YShGQUxTRSk7DQorICAgIGlmIChwTW91ZGxlICYmDQorICAgICAgICAocE1vdWRsZS0+bV9WYWx1ZU1hcC5Mb29rdXAocEtleSwgcFZhbCkgfHwNCisgICAgICAgICBwTW91ZGxlLT5tX0J1ZmZlck1hcC5Mb29rdXAocEtleSwgKFhGQV9MUE1BUERBVEFCTE9DSyYpcFZhbCkpKSB7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgICAgcE5vZGUgPSAoYlByb3RvQWxzbyAmJiBwTm9kZS0+R2V0UGFja2V0SUQoKSAhPSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKQ0KKyAgICAgICAgICAgICAgICA/IHBOb2RlLT5HZXRUZW1wbGF0ZU5vZGUoKQ0KKyAgICAgICAgICAgICAgICA6IE5VTEw7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpSZW1vdmVNYXBNb2R1bGVLZXkodm9pZCogcEtleSkgew0KKyAgWEZBX0xQTUFQTU9EVUxFREFUQSBwTW91ZGxlID0gdGhpcy0+R2V0TWFwTW9kdWxlRGF0YShGQUxTRSk7DQorICBpZiAoIXBNb3VkbGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKHBLZXkpIHsNCisgICAgWEZBX0xQTUFQREFUQUJMT0NLIHBCdWZmZXIgPSBOVUxMOw0KKyAgICBwTW91ZGxlLT5tX0J1ZmZlck1hcC5Mb29rdXAocEtleSwgcEJ1ZmZlcik7DQorICAgIGlmIChwQnVmZmVyKSB7DQorICAgICAgaWYgKHBCdWZmZXItPnBDYWxsYmFja0luZm8gJiYgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUpIHsNCisgICAgICAgIHBCdWZmZXItPnBDYWxsYmFja0luZm8tPnBGcmVlKCoodm9pZCoqKXBCdWZmZXItPkdldERhdGEoKSk7DQorICAgICAgfQ0KKyAgICAgIEZYX0ZyZWUocEJ1ZmZlcik7DQorICAgIH0NCisgICAgcE1vdWRsZS0+bV9CdWZmZXJNYXAuUmVtb3ZlS2V5KHBLZXkpOw0KKyAgICBwTW91ZGxlLT5tX1ZhbHVlTWFwLlJlbW92ZUtleShwS2V5KTsNCisgIH0gZWxzZSB7DQorICAgIFhGQV9MUE1BUERBVEFCTE9DSyBwQnVmZmVyOw0KKyAgICBGWF9QT1NJVElPTiBwb3NCdWZmZXIgPSBwTW91ZGxlLT5tX0J1ZmZlck1hcC5HZXRTdGFydFBvc2l0aW9uKCk7DQorICAgIHdoaWxlIChwb3NCdWZmZXIpIHsNCisgICAgICBwTW91ZGxlLT5tX0J1ZmZlck1hcC5HZXROZXh0QXNzb2MocG9zQnVmZmVyLCBwS2V5LCBwQnVmZmVyKTsNCisgICAgICBpZiAocEJ1ZmZlcikgew0KKyAgICAgICAgaWYgKHBCdWZmZXItPnBDYWxsYmFja0luZm8gJiYgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUpIHsNCisgICAgICAgICAgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUoKih2b2lkKiopcEJ1ZmZlci0+R2V0RGF0YSgpKTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0ZyZWUocEJ1ZmZlcik7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHBNb3VkbGUtPm1fQnVmZmVyTWFwLlJlbW92ZUFsbCgpOw0KKyAgICBwTW91ZGxlLT5tX1ZhbHVlTWFwLlJlbW92ZUFsbCgpOw0KKyAgICBpZiAocE1vdWRsZSkgew0KKyAgICAgIGRlbGV0ZSBwTW91ZGxlOw0KKyAgICAgIHBNb3VkbGUgPSBOVUxMOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpNZXJnZUFsbERhdGEodm9pZCogcERzdE1vZHVsZSwgRlhfQk9PTCBiVXNlU3JjQXR0cikgew0KKyAgWEZBX0xQTUFQTU9EVUxFREFUQSBwRHN0TW9kdWxlRGF0YSA9DQorICAgICAgKChDWEZBX05vZGUqKXBEc3RNb2R1bGUpLT5HZXRNYXBNb2R1bGVEYXRhKFRSVUUpOw0KKyAgaWYgKCFwRHN0TW9kdWxlRGF0YSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBYRkFfTFBNQVBNT0RVTEVEQVRBIHBTcmNNb2R1bGVEYXRhID0gdGhpcy0+R2V0TWFwTW9kdWxlRGF0YShGQUxTRSk7DQorICBpZiAoIXBTcmNNb2R1bGVEYXRhKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX1BPU0lUSU9OIHBzVmFsdWUgPSBwU3JjTW9kdWxlRGF0YS0+bV9WYWx1ZU1hcC5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocHNWYWx1ZSkgew0KKyAgICB2b2lkKiBwS2V5Ow0KKyAgICB2b2lkKiBwVmFsdWU7DQorICAgIHBTcmNNb2R1bGVEYXRhLT5tX1ZhbHVlTWFwLkdldE5leHRBc3NvYyhwc1ZhbHVlLCBwS2V5LCBwVmFsdWUpOw0KKyAgICBpZiAoYlVzZVNyY0F0dHIgfHwgIXBEc3RNb2R1bGVEYXRhLT5tX1ZhbHVlTWFwLkdldFZhbHVlQXQocEtleSkpIHsNCisgICAgICBwRHN0TW9kdWxlRGF0YS0+bV9WYWx1ZU1hcC5TZXRBdChwS2V5LCBwVmFsdWUpOw0KKyAgICB9DQorICB9DQorICBGWF9QT1NJVElPTiBwc0J1ZmZlciA9IHBTcmNNb2R1bGVEYXRhLT5tX0J1ZmZlck1hcC5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocHNCdWZmZXIpIHsNCisgICAgdm9pZCogcEtleTsNCisgICAgWEZBX0xQTUFQREFUQUJMT0NLIHBTcmNCdWZmZXI7DQorICAgIHBTcmNNb2R1bGVEYXRhLT5tX0J1ZmZlck1hcC5HZXROZXh0QXNzb2MocHNCdWZmZXIsIHBLZXksIHBTcmNCdWZmZXIpOw0KKyAgICBYRkFfTFBNQVBEQVRBQkxPQ0smIHBCdWZmZXIgPSBwRHN0TW9kdWxlRGF0YS0+bV9CdWZmZXJNYXBbcEtleV07DQorICAgIGlmIChwQnVmZmVyICYmICFiVXNlU3JjQXR0cikgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChwU3JjQnVmZmVyLT5wQ2FsbGJhY2tJbmZvICYmIHBTcmNCdWZmZXItPnBDYWxsYmFja0luZm8tPnBGcmVlICYmDQorICAgICAgICAhcFNyY0J1ZmZlci0+cENhbGxiYWNrSW5mby0+cENvcHkpIHsNCisgICAgICBpZiAocEJ1ZmZlcikgew0KKyAgICAgICAgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUoKih2b2lkKiopcEJ1ZmZlci0+R2V0RGF0YSgpKTsNCisgICAgICAgIHBEc3RNb2R1bGVEYXRhLT5tX0J1ZmZlck1hcC5SZW1vdmVLZXkocEtleSk7DQorICAgICAgfQ0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChwQnVmZmVyID09IE5VTEwpIHsNCisgICAgICBwQnVmZmVyID0gKFhGQV9MUE1BUERBVEFCTE9DSylGWF9BbGxvYygNCisgICAgICAgICAgdWludDhfdCwgc2l6ZW9mKFhGQV9NQVBEQVRBQkxPQ0spICsgcFNyY0J1ZmZlci0+aUJ5dGVzKTsNCisgICAgfSBlbHNlIGlmIChwQnVmZmVyLT5pQnl0ZXMgIT0gcFNyY0J1ZmZlci0+aUJ5dGVzKSB7DQorICAgICAgaWYgKHBCdWZmZXItPnBDYWxsYmFja0luZm8gJiYgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUpIHsNCisgICAgICAgIHBCdWZmZXItPnBDYWxsYmFja0luZm8tPnBGcmVlKCoodm9pZCoqKXBCdWZmZXItPkdldERhdGEoKSk7DQorICAgICAgfQ0KKyAgICAgIHBCdWZmZXIgPSAoWEZBX0xQTUFQREFUQUJMT0NLKUZYX1JlYWxsb2MoDQorICAgICAgICAgIHVpbnQ4X3QsIHBCdWZmZXIsIHNpemVvZihYRkFfTUFQREFUQUJMT0NLKSArIHBTcmNCdWZmZXItPmlCeXRlcyk7DQorICAgIH0gZWxzZSBpZiAocEJ1ZmZlci0+cENhbGxiYWNrSW5mbyAmJiBwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wRnJlZSkgew0KKyAgICAgIHBCdWZmZXItPnBDYWxsYmFja0luZm8tPnBGcmVlKCoodm9pZCoqKXBCdWZmZXItPkdldERhdGEoKSk7DQorICAgIH0NCisgICAgaWYgKHBCdWZmZXIgPT0gTlVMTCkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIHBCdWZmZXItPnBDYWxsYmFja0luZm8gPSBwU3JjQnVmZmVyLT5wQ2FsbGJhY2tJbmZvOw0KKyAgICBwQnVmZmVyLT5pQnl0ZXMgPSBwU3JjQnVmZmVyLT5pQnl0ZXM7DQorICAgIEZYU1lTX21lbWNweShwQnVmZmVyLT5HZXREYXRhKCksIHBTcmNCdWZmZXItPkdldERhdGEoKSwgcFNyY0J1ZmZlci0+aUJ5dGVzKTsNCisgICAgaWYgKHBCdWZmZXItPnBDYWxsYmFja0luZm8gJiYgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cENvcHkpIHsNCisgICAgICBwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wQ29weSgqKHZvaWQqKilwQnVmZmVyLT5HZXREYXRhKCkpOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlOjpNb3ZlQnVmZmVyTWFwRGF0YShDWEZBX05vZGUqIHBEc3RNb2R1bGUsIHZvaWQqIHBLZXkpIHsNCisgIGlmICghcERzdE1vZHVsZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9CT09MIGJOZWVkTW92ZSA9IFRSVUU7DQorICBpZiAoIXBLZXkpIHsNCisgICAgYk5lZWRNb3ZlID0gRkFMU0U7DQorICB9DQorICBpZiAocERzdE1vZHVsZS0+R2V0Q2xhc3NJRCgpICE9IHRoaXMtPkdldENsYXNzSUQoKSkgew0KKyAgICBiTmVlZE1vdmUgPSBGQUxTRTsNCisgIH0NCisgIFhGQV9MUE1BUE1PRFVMRURBVEEgcFNyY01vZHVsZURhdGEgPSBOVUxMOw0KKyAgWEZBX0xQTUFQTU9EVUxFREFUQSBwRHN0TW9kdWxlRGF0YSA9IE5VTEw7DQorICBpZiAoYk5lZWRNb3ZlKSB7DQorICAgIHBTcmNNb2R1bGVEYXRhID0gdGhpcy0+R2V0TWFwTW9kdWxlRGF0YShGQUxTRSk7DQorICAgIGlmICghcFNyY01vZHVsZURhdGEpIHsNCisgICAgICBiTmVlZE1vdmUgPSBGQUxTRTsNCisgICAgfQ0KKyAgICBwRHN0TW9kdWxlRGF0YSA9IHBEc3RNb2R1bGUtPkdldE1hcE1vZHVsZURhdGEoVFJVRSk7DQorICAgIGlmICghcERzdE1vZHVsZURhdGEpIHsNCisgICAgICBiTmVlZE1vdmUgPSBGQUxTRTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGJOZWVkTW92ZSkgew0KKyAgICB2b2lkKiBwQnVmZmVyQmxvY2tEYXRhID0gcFNyY01vZHVsZURhdGEtPm1fQnVmZmVyTWFwLkdldFZhbHVlQXQocEtleSk7DQorICAgIGlmIChwQnVmZmVyQmxvY2tEYXRhKSB7DQorICAgICAgcFNyY01vZHVsZURhdGEtPm1fQnVmZmVyTWFwLlJlbW92ZUtleShwS2V5KTsNCisgICAgICBwRHN0TW9kdWxlRGF0YS0+bV9CdWZmZXJNYXAuUmVtb3ZlS2V5KHBLZXkpOw0KKyAgICAgIHBEc3RNb2R1bGVEYXRhLT5tX0J1ZmZlck1hcC5TZXRBdChwS2V5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWEZBX0xQTUFQREFUQUJMT0NLKXBCdWZmZXJCbG9ja0RhdGEpOw0KKyAgICB9DQorICB9DQorICBpZiAocERzdE1vZHVsZS0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX05vZGVWKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUgPSBwRHN0TW9kdWxlLT5HZXRTY3JpcHRDb250ZW50KEZBTFNFKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXRWYWx1ZSh3c1ZhbHVlKTsNCisgICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IHBEc3RNb2R1bGUtPkdldENvbnRhaW5lcldpZGdldERhdGEoKTsNCisgICAgaWYgKHBXaWRnZXREYXRhKSB7DQorICAgICAgcFdpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c1ZhbHVlLCB3c0Zvcm1hdFZhbHVlKTsNCisgICAgfQ0KKyAgICBwRHN0TW9kdWxlLT5TZXRTY3JpcHRDb250ZW50KHdzVmFsdWUsIHdzRm9ybWF0VmFsdWUsIFRSVUUsIFRSVUUpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZTo6TW92ZUJ1ZmZlck1hcERhdGEoQ1hGQV9Ob2RlKiBwU3JjTW9kdWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEc3RNb2R1bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBLZXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJlY3Vyc2l2ZSkgew0KKyAgaWYgKCFwU3JjTW9kdWxlIHx8ICFwRHN0TW9kdWxlIHx8ICFwS2V5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChiUmVjdXJzaXZlKSB7DQorICAgIENYRkFfTm9kZSogcFNyY0NoaWxkID0gcFNyY01vZHVsZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBDWEZBX05vZGUqIHBEc3RDaGlsZCA9IHBEc3RNb2R1bGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgZm9yICg7IHBTcmNDaGlsZCAmJiBwRHN0Q2hpbGQ7DQorICAgICAgICAgcFNyY0NoaWxkID0gcFNyY0NoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpLA0KKyAgICAgICAgIHBEc3RDaGlsZCA9IHBEc3RDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgIE1vdmVCdWZmZXJNYXBEYXRhKHBTcmNDaGlsZCwgcERzdENoaWxkLCBwS2V5LCBUUlVFKTsNCisgICAgfQ0KKyAgfQ0KKyAgcFNyY01vZHVsZS0+TW92ZUJ1ZmZlck1hcERhdGEocERzdE1vZHVsZSwgcEtleSk7DQorfQ0KK0NYRkFfTm9kZUxpc3Q6OkNYRkFfTm9kZUxpc3QoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KQ0KKyAgICA6IENYRkFfT2JqZWN0KHBEb2N1bWVudCwgWEZBX09CSkVDVFRZUEVfTm9kZUxpc3QpIHsNCisgIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkNhY2hlTGlzdCh0aGlzKTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGVMaXN0OjpOYW1lZEl0ZW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpIHsNCisgIGludDMyX3QgaUNvdW50ID0gR2V0TGVuZ3RoKCk7DQorICBGWF9EV09SRCBkd0hhc2hDb2RlID0NCisgICAgICBGWF9IYXNoQ29kZV9TdHJpbmdfR2V0Vyh3c05hbWUuR2V0UHRyKCksIHdzTmFtZS5HZXRMZW5ndGgoKSk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBDWEZBX05vZGUqIHJldCA9IEl0ZW0oaSk7DQorICAgIGlmIChkd0hhc2hDb2RlID09IHJldC0+R2V0TmFtZUhhc2goKSkgew0KKyAgICAgIHJldHVybiByZXQ7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCit2b2lkIENYRkFfTm9kZUxpc3Q6OlNjcmlwdF9MaXN0Q2xhc3NfQXBwZW5kKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMSkgew0KKyAgICBDWEZBX05vZGUqIHBOb2RlID0gKENYRkFfTm9kZSopcEFyZ3VtZW50cy0+R2V0T2JqZWN0KDApOw0KKyAgICBpZiAocE5vZGUpIHsNCisgICAgICBBcHBlbmQocE5vZGUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfQVJHVU1FTlRfTUlTTUFUQ0gpOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImFwcGVuZCIpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfTm9kZUxpc3Q6OlNjcmlwdF9MaXN0Q2xhc3NfSW5zZXJ0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGFyZ2MgPT0gMikgew0KKyAgICBDWEZBX05vZGUqIHBOZXdOb2RlID0gKENYRkFfTm9kZSopcEFyZ3VtZW50cy0+R2V0T2JqZWN0KDApOw0KKyAgICBDWEZBX05vZGUqIHBCZWZvcmVOb2RlID0gKENYRkFfTm9kZSopcEFyZ3VtZW50cy0+R2V0T2JqZWN0KDEpOw0KKyAgICBpZiAocE5ld05vZGUpIHsNCisgICAgICBJbnNlcnQocE5ld05vZGUsIHBCZWZvcmVOb2RlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJpbnNlcnQiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGVMaXN0OjpTY3JpcHRfTGlzdENsYXNzX1JlbW92ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDEpIHsNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IChDWEZBX05vZGUqKXBBcmd1bWVudHMtPkdldE9iamVjdCgwKTsNCisgICAgaWYgKHBOb2RlKSB7DQorICAgICAgUmVtb3ZlKHBOb2RlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0FSR1VNRU5UX01JU01BVENIKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJyZW1vdmUiKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGVMaXN0OjpTY3JpcHRfTGlzdENsYXNzX0l0ZW0oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoYXJnYyA9PSAxKSB7DQorICAgIGludDMyX3QgaUluZGV4ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCk7DQorICAgIGlmICgoaUluZGV4ID49IDApICYmIChpSW5kZXggKyAxIDw9IEdldExlbmd0aCgpKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldCgNCisgICAgICAgICAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAoSXRlbShpSW5kZXgpKSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkRFWF9PVVRfT0ZfQk9VTkRTKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJpdGVtIik7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X1RyZWVsaXN0Q2xhc3NfTmFtZWRJdGVtKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChhcmdjID09IDEpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgc3pOYW1lID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9DQorICAgICAgICBOYW1lZEl0ZW0oQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6TmFtZSwgc3pOYW1lLkdldExlbmd0aCgpKSk7DQorICAgIGlmICghcE5vZGUpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfU2V0KHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwTm9kZSkpOw0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJuYW1lZEl0ZW0iKTsNCisgIH0NCit9DQordm9pZCBDWEZBX05vZGVMaXN0OjpTY3JpcHRfTGlzdENsYXNzX0xlbmd0aChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgaWYgKCFiU2V0dGluZykgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgR2V0TGVuZ3RoKCkpOw0KKyAgfSBlbHNlIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgIH0NCit9DQorQ1hGQV9BcnJheU5vZGVMaXN0OjpDWEZBX0FycmF5Tm9kZUxpc3QoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KQ0KKyAgICA6IENYRkFfTm9kZUxpc3QocERvY3VtZW50KSB7fQ0KK3ZvaWQgQ1hGQV9BcnJheU5vZGVMaXN0OjpTZXRBcnJheU5vZGVMaXN0KGNvbnN0IENYRkFfTm9kZUFycmF5JiBzcmNBcnJheSkgew0KKyAgaWYgKHNyY0FycmF5LkdldFNpemUoKSA+IDApIHsNCisgICAgbV9hcnJheS5Db3B5KHNyY0FycmF5KTsNCisgIH0NCit9DQoraW50MzJfdCBDWEZBX0FycmF5Tm9kZUxpc3Q6OkdldExlbmd0aCgpIHsNCisgIHJldHVybiBtX2FycmF5LkdldFNpemUoKTsNCit9DQorRlhfQk9PTCBDWEZBX0FycmF5Tm9kZUxpc3Q6OkFwcGVuZChDWEZBX05vZGUqIHBOb2RlKSB7DQorICBtX2FycmF5LkFkZChwTm9kZSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0FycmF5Tm9kZUxpc3Q6Okluc2VydChDWEZBX05vZGUqIHBOZXdOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlTm9kZSkgew0KKyAgaWYgKHBCZWZvcmVOb2RlID09IE5VTEwpIHsNCisgICAgbV9hcnJheS5BZGQocE5ld05vZGUpOw0KKyAgfSBlbHNlIHsNCisgICAgaW50MzJfdCBpU2l6ZSA9IG1fYXJyYXkuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgKytpKSB7DQorICAgICAgaWYgKG1fYXJyYXlbaV0gPT0gcEJlZm9yZU5vZGUpIHsNCisgICAgICAgIG1fYXJyYXkuSW5zZXJ0QXQoaSwgcE5ld05vZGUpOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX0FycmF5Tm9kZUxpc3Q6OlJlbW92ZShDWEZBX05vZGUqIHBOb2RlKSB7DQorICBpbnQzMl90IGlTaXplID0gbV9hcnJheS5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgKytpKSB7DQorICAgIGlmIChtX2FycmF5W2ldID09IHBOb2RlKSB7DQorICAgICAgbV9hcnJheS5SZW1vdmVBdChpKTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9BcnJheU5vZGVMaXN0OjpJdGVtKGludDMyX3QgaUluZGV4KSB7DQorICBpbnQzMl90IGlTaXplID0gbV9hcnJheS5HZXRTaXplKCk7DQorICBpZiAoaUluZGV4ID49IDAgJiYgaUluZGV4IDwgaVNpemUpIHsNCisgICAgcmV0dXJuIG1fYXJyYXlbaUluZGV4XTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitDWEZBX0F0dGFjaE5vZGVMaXN0OjpDWEZBX0F0dGFjaE5vZGVMaXN0KENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEF0dGFjaE5vZGUpDQorICAgIDogQ1hGQV9Ob2RlTGlzdChwRG9jdW1lbnQpIHsNCisgIG1fcEF0dGFjaE5vZGUgPSBwQXR0YWNoTm9kZTsNCit9DQoraW50MzJfdCBDWEZBX0F0dGFjaE5vZGVMaXN0OjpHZXRMZW5ndGgoKSB7DQorICByZXR1cm4gbV9wQXR0YWNoTm9kZS0+Q291bnRDaGlsZHJlbigNCisgICAgICBYRkFfRUxFTUVOVF9VTktOT1dOLCBtX3BBdHRhY2hOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9BdHRhY2hOb2RlTGlzdDo6QXBwZW5kKENYRkFfTm9kZSogcE5vZGUpIHsNCisgIENYRkFfTm9kZSogcFBhcmVudCA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgIGlmIChwUGFyZW50KSB7DQorICAgIHBQYXJlbnQtPlJlbW92ZUNoaWxkKHBOb2RlKTsNCisgIH0NCisgIHJldHVybiBtX3BBdHRhY2hOb2RlLT5JbnNlcnRDaGlsZChwTm9kZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9BdHRhY2hOb2RlTGlzdDo6SW5zZXJ0KENYRkFfTm9kZSogcE5ld05vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlTm9kZSkgew0KKyAgQ1hGQV9Ob2RlKiBwUGFyZW50ID0gcE5ld05vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgaWYgKHBQYXJlbnQpIHsNCisgICAgcFBhcmVudC0+UmVtb3ZlQ2hpbGQocE5ld05vZGUpOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcEF0dGFjaE5vZGUtPkluc2VydENoaWxkKHBOZXdOb2RlLCBwQmVmb3JlTm9kZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9BdHRhY2hOb2RlTGlzdDo6UmVtb3ZlKENYRkFfTm9kZSogcE5vZGUpIHsNCisgIHJldHVybiBtX3BBdHRhY2hOb2RlLT5SZW1vdmVDaGlsZChwTm9kZSk7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9BdHRhY2hOb2RlTGlzdDo6SXRlbShpbnQzMl90IGlJbmRleCkgew0KKyAgcmV0dXJuIG1fcEF0dGFjaE5vZGUtPkdldENoaWxkKA0KKyAgICAgIGlJbmRleCwgWEZBX0VMRU1FTlRfVU5LTk9XTiwNCisgICAgICBtX3BBdHRhY2hOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfU3ViZm9ybSk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9vYmplY3RhY2NfaW1wLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9vYmplY3RhY2NfaW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWIwYWRmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX29iamVjdGFjY19pbXAuY3BwCkBAIC0wLDAgKzEsMzgwNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfdXRpbHMuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX29iamVjdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jdW1lbnQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3BhcnNlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfc2NyaXB0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NkYXRhLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NsYXlvdXQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2xvY2FsZW1nci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZm0yanNhcGkuaCINCitzdGF0aWMgRlhfQVJHQiBYRkFfV1N0cmluZ1RvQ29sb3IoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1ZhbHVlKSB7DQorICB1aW50OF90IHIgPSAwLCBnID0gMCwgYiA9IDA7DQorICBpZiAod3NWYWx1ZS5HZXRMZW5ndGgoKSA9PSAwKSB7DQorICAgIHJldHVybiAweGZmMDAwMDAwOw0KKyAgfQ0KKyAgaW50IGNjID0gMDsNCisgIGNvbnN0IEZYX1dDSEFSKiBzdHIgPSB3c1ZhbHVlLkdldFB0cigpOw0KKyAgaW50IGxlbiA9IHdzVmFsdWUuR2V0TGVuZ3RoKCk7DQorICB3aGlsZSAoWEZBX0lzU3BhY2Uoc3RyW2NjXSkgJiYgY2MgPCBsZW4pIHsNCisgICAgY2MrKzsNCisgIH0NCisgIGlmIChjYyA+PSBsZW4pIHsNCisgICAgcmV0dXJuIDB4ZmYwMDAwMDA7DQorICB9DQorICB3aGlsZSAoY2MgPCBsZW4pIHsNCisgICAgaWYgKHN0cltjY10gPT0gJywnIHx8ICFYRkFfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHIgPSByICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KKyAgICBjYysrOw0KKyAgfQ0KKyAgaWYgKGNjIDwgbGVuICYmIHN0cltjY10gPT0gJywnKSB7DQorICAgIGNjKys7DQorICAgIHdoaWxlIChYRkFfSXNTcGFjZShzdHJbY2NdKSAmJiBjYyA8IGxlbikgew0KKyAgICAgIGNjKys7DQorICAgIH0NCisgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQorICAgICAgaWYgKHN0cltjY10gPT0gJywnIHx8ICFYRkFfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGcgPSBnICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KKyAgICAgIGNjKys7DQorICAgIH0NCisgICAgaWYgKGNjIDwgbGVuICYmIHN0cltjY10gPT0gJywnKSB7DQorICAgICAgY2MrKzsNCisgICAgICB3aGlsZSAoWEZBX0lzU3BhY2Uoc3RyW2NjXSkgJiYgY2MgPCBsZW4pIHsNCisgICAgICAgIGNjKys7DQorICAgICAgfQ0KKyAgICAgIHdoaWxlIChjYyA8IGxlbikgew0KKyAgICAgICAgaWYgKHN0cltjY10gPT0gJywnIHx8ICFYRkFfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIGIgPSBiICogMTAgKyBzdHJbY2NdIC0gJzAnOw0KKyAgICAgICAgY2MrKzsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiAoMHhmZiA8PCAyNCkgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IGI7DQorfQ0KK1hGQV9FTEVNRU5UIENYRkFfRGF0YTo6R2V0Q2xhc3NJRCgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BOb2RlID8gbV9wTm9kZS0+R2V0Q2xhc3NJRCgpIDogWEZBX0VMRU1FTlRfVU5LTk9XTjsNCit9DQorRlhfQk9PTCBDWEZBX0RhdGE6OlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURSBlQXR0ciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZlZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlVzZURlZmF1bHQpIGNvbnN0IHsNCisgIENYRkFfTWVhc3VyZW1lbnQgbXM7DQorICBpZiAobV9wTm9kZS0+VHJ5TWVhc3VyZShlQXR0ciwgbXMsIGJVc2VEZWZhdWx0KSkgew0KKyAgICBmVmFsdWUgPSBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX0RhdGE6OlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURSBlQXR0ciwgRlhfRkxPQVQgZlZhbHVlKSB7DQorICBDWEZBX01lYXN1cmVtZW50IG1zKGZWYWx1ZSwgWEZBX1VOSVRfUHQpOw0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldE1lYXN1cmUoZUF0dHIsIG1zKTsNCit9DQorQ1hGQV9GaWxsOjpDWEZBX0ZpbGwoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQorQ1hGQV9GaWxsOjp+Q1hGQV9GaWxsKCkge30NCitpbnQzMl90IENYRkFfRmlsbDo6R2V0UHJlc2VuY2UoKSB7DQorICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlKTsNCit9DQordm9pZCBDWEZBX0ZpbGw6OlNldENvbG9yKEZYX0FSR0IgY29sb3IpIHsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9Db2xvcik7DQorICBDRlhfV2lkZVN0cmluZyB3c0NvbG9yOw0KKyAgaW50IGEsIHIsIGcsIGI7DQorICBBcmdiRGVjb2RlKGNvbG9yLCBhLCByLCBnLCBiKTsNCisgIHdzQ29sb3IuRm9ybWF0KEwiJWQsJWQsJWQiLCByLCBnLCBiKTsNCisgIHBOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbG9yKTsNCit9DQorRlhfQVJHQiBDWEZBX0ZpbGw6OkdldENvbG9yKEZYX0JPT0wgYlRleHQpIHsNCisgIGlmIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfQ29sb3IpKSB7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c0NvbG9yOw0KKyAgICBpZiAocE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29sb3IsIEZBTFNFKSkgew0KKyAgICAgIHJldHVybiBYRkFfV1N0cmluZ1RvQ29sb3Iod3NDb2xvcik7DQorICAgIH0NCisgIH0NCisgIGlmIChiVGV4dCkgew0KKyAgICByZXR1cm4gMHhGRjAwMDAwMDsNCisgIH0NCisgIHJldHVybiAweEZGRkZGRkZGOw0KK30NCitpbnQzMl90IENYRkFfRmlsbDo6R2V0RmlsbFR5cGUoKSB7DQorICBDWEZBX05vZGUqIHBDaGlsZCA9IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIHdoaWxlIChwQ2hpbGQpIHsNCisgICAgaW50MzJfdCBlVHlwZSA9IHBDaGlsZC0+R2V0Q2xhc3NJRCgpOw0KKyAgICBpZiAoZVR5cGUgIT0gWEZBX0VMRU1FTlRfQ29sb3IgJiYgZVR5cGUgIT0gWEZBX0VMRU1FTlRfRXh0cmFzKSB7DQorICAgICAgcmV0dXJuIGVUeXBlOw0KKyAgICB9DQorICAgIHBDaGlsZCA9IHBDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgIH0NCisgIHJldHVybiBYRkFfRUxFTUVOVF9Tb2xpZDsNCit9DQoraW50MzJfdCBDWEZBX0ZpbGw6OkdldFBhdHRlcm4oRlhfQVJHQiYgZm9yZUNvbG9yKSB7DQorICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfUGF0dGVybik7DQorICBpZiAoQ1hGQV9Ob2RlKiBwQ29sb3IgPSBwTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfQ29sb3IpKSB7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c0NvbG9yOw0KKyAgICBwQ29sb3ItPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29sb3IsIEZBTFNFKTsNCisgICAgZm9yZUNvbG9yID0gWEZBX1dTdHJpbmdUb0NvbG9yKHdzQ29sb3IpOw0KKyAgfSBlbHNlIHsNCisgICAgZm9yZUNvbG9yID0gMHhGRjAwMDAwMDsNCisgIH0NCisgIHJldHVybiBwTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1R5cGUpOw0KK30NCitpbnQzMl90IENYRkFfRmlsbDo6R2V0U3RpcHBsZShGWF9BUkdCJiBzdGlwcGxlQ29sb3IpIHsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9TdGlwcGxlKTsNCisgIGludDMyX3QgZUF0dHIgPSA1MDsNCisgIHBOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfUmF0ZSwgZUF0dHIpOw0KKyAgaWYgKENYRkFfTm9kZSogcENvbG9yID0gcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0NvbG9yKSkgew0KKyAgICBDRlhfV2lkZVN0cmluZ0Mgd3NDb2xvcjsNCisgICAgcENvbG9yLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbG9yLCBGQUxTRSk7DQorICAgIHN0aXBwbGVDb2xvciA9IFhGQV9XU3RyaW5nVG9Db2xvcih3c0NvbG9yKTsNCisgIH0gZWxzZSB7DQorICAgIHN0aXBwbGVDb2xvciA9IDB4RkYwMDAwMDA7DQorICB9DQorICByZXR1cm4gZUF0dHI7DQorfQ0KK2ludDMyX3QgQ1hGQV9GaWxsOjpHZXRMaW5lYXIoRlhfQVJHQiYgZW5kQ29sb3IpIHsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9MaW5lYXIpOw0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9Ub1JpZ2h0Ow0KKyAgcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9UeXBlLCBlQXR0cik7DQorICBpZiAoQ1hGQV9Ob2RlKiBwQ29sb3IgPSBwTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfQ29sb3IpKSB7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c0NvbG9yOw0KKyAgICBwQ29sb3ItPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29sb3IsIEZBTFNFKTsNCisgICAgZW5kQ29sb3IgPSBYRkFfV1N0cmluZ1RvQ29sb3Iod3NDb2xvcik7DQorICB9IGVsc2Ugew0KKyAgICBlbmRDb2xvciA9IDB4RkYwMDAwMDA7DQorICB9DQorICByZXR1cm4gZUF0dHI7DQorfQ0KK2ludDMyX3QgQ1hGQV9GaWxsOjpHZXRSYWRpYWwoRlhfQVJHQiYgZW5kQ29sb3IpIHsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9SYWRpYWwpOw0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9Ub0VkZ2U7DQorICBwTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX1R5cGUsIGVBdHRyKTsNCisgIGlmIChDWEZBX05vZGUqIHBDb2xvciA9IHBOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9Db2xvcikpIHsNCisgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQ29sb3I7DQorICAgIHBDb2xvci0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NDb2xvciwgRkFMU0UpOw0KKyAgICBlbmRDb2xvciA9IFhGQV9XU3RyaW5nVG9Db2xvcih3c0NvbG9yKTsNCisgIH0gZWxzZSB7DQorICAgIGVuZENvbG9yID0gMHhGRjAwMDAwMDsNCisgIH0NCisgIHJldHVybiBlQXR0cjsNCit9DQorRlhfQk9PTCBDWEZBX0ZpbGw6OlNldFByZXNlbmNlKGludDMyX3QgaVByZXNlbmNlKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCAoWEZBX0FUVFJJQlVURUVOVU0paVByZXNlbmNlKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZpbGw6OlNldEZpbGxUeXBlKGludDMyX3QgaVR5cGUpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX0ZpbGw6OlNldFBhdHRlcm4oaW50MzJfdCBpUGF0dGVybiwgRlhfQVJHQiBmb3JlQ29sb3IpIHsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9QYXR0ZXJuKTsNCisgIENYRkFfTm9kZSogcENvbG9yID0gcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0NvbG9yKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzQ29sb3I7DQorICBpbnQgYSwgciwgZywgYjsNCisgIEFyZ2JEZWNvZGUoZm9yZUNvbG9yLCBhLCByLCBnLCBiKTsNCisgIHdzQ29sb3IuRm9ybWF0KEwiJWQsJWQsJWQiLCByLCBnLCBiKTsNCisgIHBDb2xvci0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NDb2xvcik7DQorICByZXR1cm4gcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9UeXBlLCAoWEZBX0FUVFJJQlVURUVOVU0paVBhdHRlcm4pOw0KK30NCitGWF9CT09MIENYRkFfRmlsbDo6U2V0U3RpcHBsZShpbnQzMl90IGlTdGlwcGxlLCBGWF9BUkdCIHN0aXBwbGVDb2xvcikgew0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1N0aXBwbGUpOw0KKyAgQ1hGQV9Ob2RlKiBwQ29sb3IgPSBwTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfQ29sb3IpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NDb2xvcjsNCisgIGludCBhLCByLCBnLCBiOw0KKyAgQXJnYkRlY29kZShzdGlwcGxlQ29sb3IsIGEsIHIsIGcsIGIpOw0KKyAgd3NDb2xvci5Gb3JtYXQoTCIlZCwlZCwlZCIsIHIsIGcsIGIpOw0KKyAgcENvbG9yLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbG9yKTsNCisgIHJldHVybiBwTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1JhdGUsIChYRkFfQVRUUklCVVRFRU5VTSlpU3RpcHBsZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9GaWxsOjpTZXRMaW5lYXIoaW50MzJfdCBpTGluZWFyLCBGWF9BUkdCIGVuZENvbG9yKSB7DQorICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfTGluZWFyKTsNCisgIENYRkFfTm9kZSogcENvbG9yID0gcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0NvbG9yKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzQ29sb3I7DQorICBpbnQgYSwgciwgZywgYjsNCisgIEFyZ2JEZWNvZGUoZW5kQ29sb3IsIGEsIHIsIGcsIGIpOw0KKyAgd3NDb2xvci5Gb3JtYXQoTCIlZCwlZCwlZCIsIHIsIGcsIGIpOw0KKyAgcENvbG9yLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbG9yKTsNCisgIHJldHVybiBwTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1R5cGUsIChYRkFfQVRUUklCVVRFRU5VTSlpTGluZWFyKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZpbGw6OlNldFJhZGlhbChpbnQzMl90IGlSYWRpYWwsIEZYX0FSR0IgZW5kQ29sb3IpIHsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9SYWRpYWwpOw0KKyAgQ1hGQV9Ob2RlKiBwQ29sb3IgPSBwTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfQ29sb3IpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NDb2xvcjsNCisgIGludCBhLCByLCBnLCBiOw0KKyAgQXJnYkRlY29kZShlbmRDb2xvciwgYSwgciwgZywgYik7DQorICB3c0NvbG9yLkZvcm1hdChMIiVkLCVkLCVkIiwgciwgZywgYik7DQorICBwQ29sb3ItPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29sb3IpOw0KKyAgcmV0dXJuIHBOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfVHlwZSwgKFhGQV9BVFRSSUJVVEVFTlVNKWlSYWRpYWwpOw0KK30NCitDWEZBX01hcmdpbjo6Q1hGQV9NYXJnaW4oQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQorRlhfQk9PTCBDWEZBX01hcmdpbjo6R2V0TGVmdEluc2V0KEZYX0ZMT0FUJiBmSW5zZXQsIEZYX0ZMT0FUIGZEZWZJbnNldCkgY29uc3Qgew0KKyAgZkluc2V0ID0gZkRlZkluc2V0Ow0KKyAgcmV0dXJuIFRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQsIGZJbnNldCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9NYXJnaW46OkdldFRvcEluc2V0KEZYX0ZMT0FUJiBmSW5zZXQsIEZYX0ZMT0FUIGZEZWZJbnNldCkgY29uc3Qgew0KKyAgZkluc2V0ID0gZkRlZkluc2V0Ow0KKyAgcmV0dXJuIFRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9Ub3BJbnNldCwgZkluc2V0KTsNCit9DQorRlhfQk9PTCBDWEZBX01hcmdpbjo6R2V0UmlnaHRJbnNldChGWF9GTE9BVCYgZkluc2V0LCBGWF9GTE9BVCBmRGVmSW5zZXQpIGNvbnN0IHsNCisgIGZJbnNldCA9IGZEZWZJbnNldDsNCisgIHJldHVybiBUcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUmlnaHRJbnNldCwgZkluc2V0KTsNCit9DQorRlhfQk9PTCBDWEZBX01hcmdpbjo6R2V0Qm90dG9tSW5zZXQoRlhfRkxPQVQmIGZJbnNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRGVmSW5zZXQpIGNvbnN0IHsNCisgIGZJbnNldCA9IGZEZWZJbnNldDsNCisgIHJldHVybiBUcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfQm90dG9tSW5zZXQsIGZJbnNldCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9NYXJnaW46OlNldExlZnRJbnNldChGWF9GTE9BVCBmSW5zZXQpIHsNCisgIHJldHVybiBTZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTGVmdEluc2V0LCBmSW5zZXQpOw0KK30NCitGWF9CT09MIENYRkFfTWFyZ2luOjpTZXRUb3BJbnNldChGWF9GTE9BVCBmSW5zZXQpIHsNCisgIHJldHVybiBTZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQsIGZJbnNldCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9NYXJnaW46OlNldFJpZ2h0SW5zZXQoRlhfRkxPQVQgZkluc2V0KSB7DQorICByZXR1cm4gU2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1JpZ2h0SW5zZXQsIGZJbnNldCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9NYXJnaW46OlNldEJvdHRvbUluc2V0KEZYX0ZMT0FUIGZJbnNldCkgew0KKyAgcmV0dXJuIFNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Cb3R0b21JbnNldCwgZkluc2V0KTsNCit9DQorQ1hGQV9Gb250OjpDWEZBX0ZvbnQoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQorRlhfRkxPQVQgQ1hGQV9Gb250OjpHZXRCYXNlbGluZVNoaWZ0KCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9CYXNlbGluZVNoaWZ0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KK30NCitGWF9GTE9BVCBDWEZBX0ZvbnQ6OkdldEhvcml6b250YWxTY2FsZSgpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0ZvbnRIb3Jpem9udGFsU2NhbGUsIHdzVmFsdWUpOw0KKyAgaW50MzJfdCBpU2NhbGUgPSBGWFNZU193dG9pKChjb25zdCBGWF9XQ0hBUiopd3NWYWx1ZSk7DQorICByZXR1cm4gaVNjYWxlID4gMCA/IChGWF9GTE9BVClpU2NhbGUgOiAxMDAuMGY7DQorfQ0KK0ZYX0ZMT0FUIENYRkFfRm9udDo6R2V0VmVydGljYWxTY2FsZSgpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0ZvbnRWZXJ0aWNhbFNjYWxlLCB3c1ZhbHVlKTsNCisgIGludDMyX3QgaVNjYWxlID0gRlhTWVNfd3RvaSgoY29uc3QgRlhfV0NIQVIqKXdzVmFsdWUpOw0KKyAgcmV0dXJuIGlTY2FsZSA+IDAgPyAoRlhfRkxPQVQpaVNjYWxlIDogMTAwLjBmOw0KK30NCitGWF9GTE9BVCBDWEZBX0ZvbnQ6OkdldExldHRlclNwYWNpbmcoKSB7DQorICBDRlhfV2lkZVN0cmluZ0Mgd3NWYWx1ZTsNCisgIGlmICghbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9MZXR0ZXJTcGFjaW5nLCB3c1ZhbHVlKSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIENYRkFfTWVhc3VyZW1lbnQgbXMod3NWYWx1ZSk7DQorICBpZiAobXMuR2V0VW5pdCgpID09IFhGQV9VTklUX0VtKSB7DQorICAgIHJldHVybiBtcy5HZXRWYWx1ZSgpICogR2V0Rm9udFNpemUoKTsNCisgIH0NCisgIHJldHVybiBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KK30NCitpbnQzMl90IENYRkFfRm9udDo6R2V0TGluZVRocm91Z2goKSB7DQorICBpbnQzMl90IGlWYWx1ZSA9IDA7DQorICBtX3BOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTGluZVRocm91Z2gsIGlWYWx1ZSk7DQorICByZXR1cm4gaVZhbHVlOw0KK30NCitpbnQzMl90IENYRkFfRm9udDo6R2V0TGluZVRocm91Z2hQZXJpb2QoKSB7DQorICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX0FsbDsNCisgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9MaW5lVGhyb3VnaFBlcmlvZCwgZUF0dHIpOw0KKyAgcmV0dXJuIGVBdHRyOw0KK30NCitpbnQzMl90IENYRkFfRm9udDo6R2V0T3ZlcmxpbmUoKSB7DQorICBpbnQzMl90IGlWYWx1ZSA9IDA7DQorICBtX3BOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfT3ZlcmxpbmUsIGlWYWx1ZSk7DQorICByZXR1cm4gaVZhbHVlOw0KK30NCitpbnQzMl90IENYRkFfRm9udDo6R2V0T3ZlcmxpbmVQZXJpb2QoKSB7DQorICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX0FsbDsNCisgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9PdmVybGluZVBlcmlvZCwgZUF0dHIpOw0KKyAgcmV0dXJuIGVBdHRyOw0KK30NCitpbnQzMl90IENYRkFfRm9udDo6R2V0VW5kZXJsaW5lKCkgew0KKyAgaW50MzJfdCBpVmFsdWUgPSAwOw0KKyAgbV9wTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX1VuZGVybGluZSwgaVZhbHVlKTsNCisgIHJldHVybiBpVmFsdWU7DQorfQ0KK2ludDMyX3QgQ1hGQV9Gb250OjpHZXRVbmRlcmxpbmVQZXJpb2QoKSB7DQorICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX0FsbDsNCisgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9VbmRlcmxpbmVQZXJpb2QsIGVBdHRyKTsNCisgIHJldHVybiBlQXR0cjsNCit9DQorRlhfRkxPQVQgQ1hGQV9Gb250OjpHZXRGb250U2l6ZSgpIHsNCisgIENYRkFfTWVhc3VyZW1lbnQgbXM7DQorICBtX3BOb2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfU2l6ZSwgbXMpOw0KKyAgcmV0dXJuIG1zLlRvVW5pdChYRkFfVU5JVF9QdCk7DQorfQ0KK3ZvaWQgQ1hGQV9Gb250OjpHZXRUeXBlZmFjZShDRlhfV2lkZVN0cmluZ0MmIHdzVHlwZUZhY2UpIHsNCisgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVHlwZWZhY2UsIHdzVHlwZUZhY2UpOw0KK30NCitGWF9CT09MIENYRkFfRm9udDo6SXNCb2xkKCkgew0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9Ob3JtYWw7DQorICBtX3BOb2RlLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfV2VpZ2h0LCBlQXR0cik7DQorICByZXR1cm4gZUF0dHIgPT0gWEZBX0FUVFJJQlVURUVOVU1fQm9sZDsNCit9DQorRlhfQk9PTCBDWEZBX0ZvbnQ6OklzSXRhbGljKCkgew0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9Ob3JtYWw7DQorICBtX3BOb2RlLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfUG9zdHVyZSwgZUF0dHIpOw0KKyAgcmV0dXJuIGVBdHRyID09IFhGQV9BVFRSSUJVVEVFTlVNX0l0YWxpYzsNCit9DQorRlhfQk9PTCBDWEZBX0ZvbnQ6OklzVXNlS2VybmluZygpIHsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVBdHRyID0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsNCisgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9LZXJuaW5nTW9kZSwgZUF0dHIpOw0KKyAgcmV0dXJuIGVBdHRyID09IFhGQV9BVFRSSUJVVEVFTlVNX1BhaXI7DQorfQ0KK3ZvaWQgQ1hGQV9Gb250OjpTZXRDb2xvcihGWF9BUkdCIGNvbG9yKSB7DQorICBDWEZBX0ZpbGwgZmlsbCA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0ZpbGwpOw0KKyAgZmlsbC5TZXRDb2xvcihjb2xvcik7DQorfQ0KK0ZYX0FSR0IgQ1hGQV9Gb250OjpHZXRDb2xvcigpIHsNCisgIGlmIChDWEZBX0ZpbGwgZmlsbCA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0ZpbGwpKSB7DQorICAgIHJldHVybiBmaWxsLkdldENvbG9yKFRSVUUpOw0KKyAgfQ0KKyAgcmV0dXJuIDB4RkYwMDAwMDA7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Gb250OjpTZXRCYXNlbGluZVNoaWZ0KEZYX0ZMT0FUIGZCYXNlbGluZVNoaWZ0KSB7DQorICBDWEZBX01lYXN1cmVtZW50IG1zKGZCYXNlbGluZVNoaWZ0LCBYRkFfVU5JVF9QdCk7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0Jhc2VsaW5lU2hpZnQsIG1zKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZvbnQ6OlNldEhvcml6b250YWxTY2FsZShGWF9GTE9BVCBmSG9yaXpvbnRhbFNjYWxlKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgd3NWYWx1ZS5Gb3JtYXQoTCIlZCIsIChpbnQzMl90KWZIb3Jpem9udGFsU2NhbGUpOw0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfRm9udEhvcml6b250YWxTY2FsZSwgd3NWYWx1ZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Gb250OjpTZXRWZXJ0aWNhbFNjYWxlKEZYX0ZMT0FUIGZWZXJ0aWNhbFNjYWxlKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgd3NWYWx1ZS5Gb3JtYXQoTCIlZCIsIChpbnQzMl90KWZWZXJ0aWNhbFNjYWxlKTsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0ZvbnRWZXJ0aWNhbFNjYWxlLCB3c1ZhbHVlKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZvbnQ6OlNldExldHRlclNwYWNpbmcoRlhfRkxPQVQgZkxldHRlclNwYWNpbmcsIFhGQV9VTklUIGVVbml0KSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Gb250OjpTZXRMaW5lVGhyb3VnaChpbnQzMl90IGlMaW5lVGhyb3VnaCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldEludGVnZXIoWEZBX0FUVFJJQlVURV9MaW5lVGhyb3VnaCwgaUxpbmVUaHJvdWdoKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZvbnQ6OlNldExpbmVUaHJvdWdoUGVyaW9kKGludDMyX3QgaUxpbmVUaHJvdWdoUGVyaW9kKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0xpbmVUaHJvdWdoUGVyaW9kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKFhGQV9BVFRSSUJVVEVFTlVNKWlMaW5lVGhyb3VnaFBlcmlvZCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Gb250OjpTZXRPdmVybGluZShpbnQzMl90IGlPdmVybGluZSkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldEludGVnZXIoWEZBX0FUVFJJQlVURV9PdmVybGluZSwgaU92ZXJsaW5lKTsNCit9DQorRlhfQk9PTCBDWEZBX0ZvbnQ6OlNldE92ZXJsaW5lUGVyaW9kKGludDMyX3QgaU92ZXJsaW5lUGVyaW9kKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX092ZXJsaW5lUGVyaW9kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKFhGQV9BVFRSSUJVVEVFTlVNKWlPdmVybGluZVBlcmlvZCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Gb250OjpTZXRVbmRlcmxpbmUoaW50MzJfdCBpVW5kZXJsaW5lKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX1VuZGVybGluZSwgaVVuZGVybGluZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9Gb250OjpTZXRVbmRlcmxpbmVQZXJpb2QoaW50MzJfdCBpVW5kZXJsaW5lUGVyaW9kKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1VuZGVybGluZVBlcmlvZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIChYRkFfQVRUUklCVVRFRU5VTSlpVW5kZXJsaW5lUGVyaW9kKTsNCit9DQorQ1hGQV9DYXB0aW9uOjpDWEZBX0NhcHRpb24oQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQoraW50MzJfdCBDWEZBX0NhcHRpb246OkdldFByZXNlbmNlKCkgew0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlOw0KKyAgbV9wTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCBlQXR0cik7DQorICByZXR1cm4gZUF0dHI7DQorfQ0KK2ludDMyX3QgQ1hGQV9DYXB0aW9uOjpHZXRQbGFjZW1lbnRUeXBlKCkgew0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0Ow0KKyAgbV9wTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX1BsYWNlbWVudCwgZUF0dHIpOw0KKyAgcmV0dXJuIGVBdHRyOw0KK30NCitGWF9GTE9BVCBDWEZBX0NhcHRpb246OkdldFJlc2VydmUoKSB7DQorICBDWEZBX01lYXN1cmVtZW50IG1zOw0KKyAgbV9wTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1Jlc2VydmUsIG1zKTsNCisgIHJldHVybiBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KK30NCitDWEZBX01hcmdpbiBDWEZBX0NhcHRpb246OkdldE1hcmdpbigpIHsNCisgIHJldHVybiBDWEZBX01hcmdpbihtX3BOb2RlID8gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfTWFyZ2luKSA6IE5VTEwpOw0KK30NCitDWEZBX0ZvbnQgQ1hGQV9DYXB0aW9uOjpHZXRGb250KCkgew0KKyAgcmV0dXJuIENYRkFfRm9udChtX3BOb2RlID8gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfRm9udCkgOiBOVUxMKTsNCit9DQorQ1hGQV9WYWx1ZSBDWEZBX0NhcHRpb246OkdldFZhbHVlKCkgew0KKyAgcmV0dXJuIENYRkFfVmFsdWUobV9wTm9kZSA/IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1ZhbHVlKSA6IE5VTEwpOw0KK30NCitDWEZBX1BhcmEgQ1hGQV9DYXB0aW9uOjpHZXRQYXJhKCkgew0KKyAgcmV0dXJuIENYRkFfUGFyYShtX3BOb2RlID8gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfUGFyYSkgOiBOVUxMKTsNCit9DQorRlhfQk9PTCBDWEZBX0NhcHRpb246OlNldFByZXNlbmNlKGludDMyX3QgaVByZXNlbmNlKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCAoWEZBX0FUVFJJQlVURUVOVU0paVByZXNlbmNlKTsNCit9DQorRlhfQk9PTCBDWEZBX0NhcHRpb246OlNldFBsYWNlbWVudFR5cGUoaW50MzJfdCBpVHlwZSkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9QbGFjZW1lbnQsIChYRkFfQVRUUklCVVRFRU5VTSlpVHlwZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9DYXB0aW9uOjpTZXRSZXNlcnZlKEZYX0ZMT0FUIGZSZXNlcnZlKSB7DQorICBDWEZBX01lYXN1cmVtZW50IG1zKGZSZXNlcnZlLCBYRkFfVU5JVF9QdCk7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1Jlc2VydmUsIG1zKTsNCit9DQorQ1hGQV9QYXJhOjpDWEZBX1BhcmEoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQoraW50MzJfdCBDWEZBX1BhcmE6OkdldEhvcml6b250YWxBbGlnbigpIHsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVBdHRyID0gWEZBX0FUVFJJQlVURUVOVU1fTGVmdDsNCisgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9IQWxpZ24sIGVBdHRyKTsNCisgIHJldHVybiBlQXR0cjsNCit9DQoraW50MzJfdCBDWEZBX1BhcmE6OkdldFZlcnRpY2FsQWxpZ24oKSB7DQorICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX1RvcDsNCisgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9WQWxpZ24sIGVBdHRyKTsNCisgIHJldHVybiBlQXR0cjsNCit9DQorRlhfRkxPQVQgQ1hGQV9QYXJhOjpHZXRMaW5lSGVpZ2h0KCkgew0KKyAgQ1hGQV9NZWFzdXJlbWVudCBtczsNCisgIG1fcE5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9MaW5lSGVpZ2h0LCBtcyk7DQorICByZXR1cm4gbXMuVG9Vbml0KFhGQV9VTklUX1B0KTsNCit9DQorRlhfRkxPQVQgQ1hGQV9QYXJhOjpHZXRNYXJnaW5MZWZ0KCkgew0KKyAgQ1hGQV9NZWFzdXJlbWVudCBtczsNCisgIG1fcE5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9NYXJnaW5MZWZ0LCBtcyk7DQorICByZXR1cm4gbXMuVG9Vbml0KFhGQV9VTklUX1B0KTsNCit9DQorRlhfRkxPQVQgQ1hGQV9QYXJhOjpHZXRNYXJnaW5SaWdodCgpIHsNCisgIENYRkFfTWVhc3VyZW1lbnQgbXM7DQorICBtX3BOb2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTWFyZ2luUmlnaHQsIG1zKTsNCisgIHJldHVybiBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KK30NCitpbnQzMl90IENYRkFfUGFyYTo6R2V0T3JwaGFucygpIHsNCisgIGludDMyX3QgaVZhbHVlID0gMDsNCisgIG1fcE5vZGUtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9PcnBoYW5zLCBpVmFsdWUpOw0KKyAgcmV0dXJuIGlWYWx1ZTsNCit9DQorRlhfRkxPQVQgQ1hGQV9QYXJhOjpHZXRSYWRpeE9mZnNldCgpIHsNCisgIENYRkFfTWVhc3VyZW1lbnQgbXM7DQorICBtX3BOb2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUmFkaXhPZmZzZXQsIG1zKTsNCisgIHJldHVybiBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KK30NCitGWF9GTE9BVCBDWEZBX1BhcmE6OkdldFNwYWNlQWJvdmUoKSB7DQorICBDWEZBX01lYXN1cmVtZW50IG1zOw0KKyAgbV9wTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1NwYWNlQWJvdmUsIG1zKTsNCisgIHJldHVybiBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KK30NCitGWF9GTE9BVCBDWEZBX1BhcmE6OkdldFNwYWNlQmVsb3coKSB7DQorICBDWEZBX01lYXN1cmVtZW50IG1zOw0KKyAgbV9wTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1NwYWNlQmVsb3csIG1zKTsNCisgIHJldHVybiBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KK30NCitGWF9GTE9BVCBDWEZBX1BhcmE6OkdldFRleHRJbmRlbnQoKSB7DQorICBDWEZBX01lYXN1cmVtZW50IG1zOw0KKyAgbV9wTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1RleHRJbmRlbnQsIG1zKTsNCisgIHJldHVybiBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KK30NCitpbnQzMl90IENYRkFfUGFyYTo6R2V0V2lkb3dzKCkgew0KKyAgaW50MzJfdCBpVmFsdWUgPSAwOw0KKyAgbV9wTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX1dpZG93cywgaVZhbHVlKTsNCisgIHJldHVybiBpVmFsdWU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9QYXJhOjpTZXRIb3Jpem9udGFsQWxpZ24oaW50MzJfdCBpSG9yaXpvbnRhbEFsaWduKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0hBbGlnbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIChYRkFfQVRUUklCVVRFRU5VTSlpSG9yaXpvbnRhbEFsaWduKTsNCit9DQorRlhfQk9PTCBDWEZBX1BhcmE6OlNldFZlcnRpY2FsQWxpZ24oaW50MzJfdCBpVmVydGljYWxBbGlnbikgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9WQWxpZ24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAoWEZBX0FUVFJJQlVURUVOVU0paVZlcnRpY2FsQWxpZ24pOw0KK30NCitGWF9CT09MIENYRkFfUGFyYTo6U2V0TGluZUhlaWdodChGWF9GTE9BVCBmTGluZUhlaWdodCkgew0KKyAgQ1hGQV9NZWFzdXJlbWVudCBtczsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTGluZUhlaWdodCwgbXMpOw0KK30NCitGWF9CT09MIENYRkFfUGFyYTo6U2V0TWFyZ2luTGVmdChGWF9GTE9BVCBmTWFyZ2luTGVmdCkgew0KKyAgQ1hGQV9NZWFzdXJlbWVudCBtcyhmTWFyZ2luTGVmdCwgWEZBX1VOSVRfUHQpOw0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9NYXJnaW5MZWZ0LCBtcyk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9QYXJhOjpTZXRNYXJnaW5SaWdodChGWF9GTE9BVCBmTWFyZ2luUmlnaHQpIHsNCisgIENYRkFfTWVhc3VyZW1lbnQgbXMoZk1hcmdpblJpZ2h0LCBYRkFfVU5JVF9QdCk7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX01hcmdpblJpZ2h0LCBtcyk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9QYXJhOjpTZXRPcnBoYW5zKGludDMyX3QgaU9ycGhhbnMpIHsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfT3JwaGFucywgaU9ycGhhbnMpOw0KK30NCitGWF9CT09MIENYRkFfUGFyYTo6U2V0UmFkaXhPZmZzZXQoRlhfRkxPQVQgZlJhZGl4T2Zmc2V0KSB7DQorICBDWEZBX01lYXN1cmVtZW50IG1zKGZSYWRpeE9mZnNldCwgWEZBX1VOSVRfUHQpOw0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9SYWRpeE9mZnNldCwgbXMpOw0KK30NCitGWF9CT09MIENYRkFfUGFyYTo6U2V0U3BhY2VBYm92ZShGWF9GTE9BVCBmU3BhY2VBYm92ZSkgew0KKyAgQ1hGQV9NZWFzdXJlbWVudCBtcyhmU3BhY2VBYm92ZSwgWEZBX1VOSVRfUHQpOw0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9TcGFjZUFib3ZlLCBtcyk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9QYXJhOjpTZXRTcGFjZUJlbG93KEZYX0ZMT0FUIGZTcGFjZUJlbG93KSB7DQorICBDWEZBX01lYXN1cmVtZW50IG1zKGZTcGFjZUJlbG93LCBYRkFfVU5JVF9QdCk7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1NwYWNlQmVsb3csIG1zKTsNCit9DQorRlhfQk9PTCBDWEZBX1BhcmE6OlNldFRleHRJbmRlbnQoRlhfRkxPQVQgZlRleHRJbmRlbnQpIHsNCisgIENYRkFfTWVhc3VyZW1lbnQgbXMoZlRleHRJbmRlbnQsIFhGQV9VTklUX1B0KTsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVGV4dEluZGVudCwgbXMpOw0KK30NCitGWF9CT09MIENYRkFfUGFyYTo6U2V0V2lkb3dzKGludDMyX3QgaVdpZG93cykgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldEludGVnZXIoWEZBX0FUVFJJQlVURV9XaWRvd3MsIGlXaWRvd3MpOw0KK30NCitDWEZBX0tlZXA6OkNYRkFfS2VlcChDWEZBX05vZGUqIHBOb2RlLCBDWEZBX05vZGUqIHBQYXJlbnQpDQorICAgIDogQ1hGQV9EYXRhKHBOb2RlKSwgbV9wUGFyZW50KHBQYXJlbnQpIHt9DQoraW50MzJfdCBDWEZBX0tlZXA6OkdldEludGFjdCgpIHsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVBdHRyID0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsNCisgIHN3aXRjaCAobV9wUGFyZW50LT5HZXRDbGFzc0lEKCkpIHsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9TdWJmb3JtOiB7DQorICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHJTdWJGb3JtOw0KKyAgICAgIG1fcFBhcmVudC0+VHJ5RW51bShYRkFfQVRUUklCVVRFX0xheW91dCwgZUF0dHJTdWJGb3JtKTsNCisgICAgICBpZiAoZUF0dHJTdWJGb3JtID09IFhGQV9BVFRSSUJVVEVFTlVNX1Bvc2l0aW9uIHx8DQorICAgICAgICAgIGVBdHRyU3ViRm9ybSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Sb3cpIHsNCisgICAgICAgIGVBdHRyID0gWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWE7DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0RyYXc6DQorICAgICAgZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYTsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9JbnRhY3QsIGVBdHRyLCBGQUxTRSk7DQorICByZXR1cm4gZUF0dHI7DQorfQ0KK2ludDMyX3QgQ1hGQV9LZWVwOjpHZXROZXh0KCkgew0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOw0KKyAgbV9wTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX05leHQsIGVBdHRyKTsNCisgIHJldHVybiBlQXR0cjsNCit9DQoraW50MzJfdCBDWEZBX0tlZXA6OkdldFByZXZpb3VzKCkgew0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOw0KKyAgbV9wTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX1ByZXZpb3VzLCBlQXR0cik7DQorICByZXR1cm4gZUF0dHI7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9LZWVwOjpTZXRJbnRhY3QoaW50MzJfdCBpSW50YWN0KSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0ludGFjdCwgKFhGQV9BVFRSSUJVVEVFTlVNKWlJbnRhY3QpOw0KK30NCitGWF9CT09MIENYRkFfS2VlcDo6U2V0TmV4dChpbnQzMl90IGlOZXh0KSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX05leHQsIChYRkFfQVRUUklCVVRFRU5VTSlpTmV4dCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9LZWVwOjpTZXRQcmV2aW91cyhpbnQzMl90IGlQcmV2aW91cykgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9QcmV2aW91cywgKFhGQV9BVFRSSUJVVEVFTlVNKWlQcmV2aW91cyk7DQorfQ0KK0NYRkFfRXZlbnQ6OkNYRkFfRXZlbnQoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQoraW50MzJfdCBDWEZBX0V2ZW50OjpHZXRBY3Rpdml0eSgpIHsNCisgIHJldHVybiBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfQWN0aXZpdHkpOw0KK30NCitpbnQzMl90IENYRkFfRXZlbnQ6OkdldEV2ZW50VHlwZSgpIHsNCisgIENYRkFfTm9kZSogcENoaWxkID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgd2hpbGUgKHBDaGlsZCkgew0KKyAgICBpbnQzMl90IGVUeXBlID0gcENoaWxkLT5HZXRDbGFzc0lEKCk7DQorICAgIGlmIChlVHlwZSAhPSBYRkFfRUxFTUVOVF9FeHRyYXMpIHsNCisgICAgICByZXR1cm4gZVR5cGU7DQorICAgIH0NCisgICAgcENoaWxkID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgfQ0KKyAgcmV0dXJuIFhGQV9FTEVNRU5UX1VOS05PV047DQorfQ0KK3ZvaWQgQ1hGQV9FdmVudDo6R2V0UmVmKENGWF9XaWRlU3RyaW5nQyYgd3NSZWYpIHsNCisgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfUmVmLCB3c1JlZik7DQorfQ0KK2ludDMyX3QgQ1hGQV9FdmVudDo6R2V0RXhlY3V0ZVJ1bkF0KCkgew0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0V4ZWN1dGUpOw0KKyAgcmV0dXJuIHBOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfUnVuQXQpOw0KK30NCitpbnQzMl90IENYRkFfRXZlbnQ6OkdldEV4ZWN1dGVUeXBlKCkgew0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0V4ZWN1dGUpOw0KKyAgcmV0dXJuIHBOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfRXhlY3V0ZVR5cGUpOw0KK30NCit2b2lkIENYRkFfRXZlbnQ6OkdldEV4ZWN1dGVDb25uZWN0aW9uKENGWF9XaWRlU3RyaW5nJiB3c0Nvbm5lY3Rpb24pIHsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9FeGVjdXRlKTsNCisgIENGWF9XaWRlU3RyaW5nQyBjRGF0YTsNCisgIHBOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0Nvbm5lY3Rpb24sIGNEYXRhKTsNCisgIHdzQ29ubmVjdGlvbiA9IGNEYXRhOw0KK30NCitDWEZBX1NjcmlwdCBDWEZBX0V2ZW50OjpHZXRTY3JpcHQoKSB7DQorICByZXR1cm4gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfU2NyaXB0KTsNCit9DQorQ1hGQV9TdWJtaXQgQ1hGQV9FdmVudDo6R2V0U3VibWl0KCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1N1Ym1pdCk7DQorfQ0KK2ludDMyX3QgQ1hGQV9FdmVudDo6R2V0U2lnbkRhdGFPcGVyYXRpb24oKSB7DQorICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfU2lnbkRhdGEpOw0KKyAgcmV0dXJuIHBOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfT3BlcmF0aW9uKTsNCit9DQordm9pZCBDWEZBX0V2ZW50OjpHZXRTaWduRGF0YVRhcmdldChDRlhfV2lkZVN0cmluZyYgd3NUYXJnZXQpIHsNCisgIGlmIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfU2lnbkRhdGEpKSB7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c0NEYXRhOw0KKyAgICBwTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9UYXJnZXQsIHdzQ0RhdGEpOw0KKyAgICB3c1RhcmdldCA9IHdzQ0RhdGE7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9FdmVudDo6U2V0QWN0aXZpdHkoaW50MzJfdCBpQWN0aXZpdHkpIHsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfQWN0aXZpdHksIChYRkFfQVRUUklCVVRFRU5VTSlpQWN0aXZpdHkpOw0KK30NCitGWF9CT09MIENYRkFfRXZlbnQ6OlNldEV2ZW50VHlwZShpbnQzMl90IGlFdmVudFR5cGUpIHsNCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX0V2ZW50OjpTZXRFeGVjdXRlUnVuQXQoaW50MzJfdCBpRXhlY3V0ZVJ1bkF0KSB7DQorICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfRXhlY3V0ZSk7DQorICByZXR1cm4gcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9SdW5BdCwgKFhGQV9BVFRSSUJVVEVFTlVNKWlFeGVjdXRlUnVuQXQpOw0KK30NCitGWF9CT09MIENYRkFfRXZlbnQ6OlNldEV4ZWN1dGVUeXBlKGludDMyX3QgaUV4ZWN1dGVUeXBlKSB7DQorICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfRXhlY3V0ZSk7DQorICByZXR1cm4gcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9FeGVjdXRlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAoWEZBX0FUVFJJQlVURUVOVU0paUV4ZWN1dGVUeXBlKTsNCit9DQorRlhfQk9PTCBDWEZBX0V2ZW50OjpTZXRFeGVjdXRlQ29ubmVjdGlvbihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb25uZWN0aW9uKSB7DQorICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfRXhlY3V0ZSk7DQorICByZXR1cm4gcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfQ29ubmVjdGlvbiwgd3NDb25uZWN0aW9uKTsNCit9DQorRlhfQk9PTCBDWEZBX0V2ZW50OjpTZXRTaWduRGF0YU9wZXJhdGlvbihpbnQzMl90IGlPcGVyYXRpb24pIHsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9TaWduRGF0YSk7DQorICByZXR1cm4gcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9PcGVyYXRpb24sIChYRkFfQVRUUklCVVRFRU5VTSlpT3BlcmF0aW9uKTsNCit9DQorRlhfQk9PTCBDWEZBX0V2ZW50OjpTZXRTaWduRGF0YVRhcmdldChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUYXJnZXQpIHsNCisgIGlmIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfU2lnbkRhdGEpKSB7DQorICAgIHJldHVybiBwTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9UYXJnZXQsIHdzVGFyZ2V0KTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorQ1hGQV9TY3JpcHQ6OkNYRkFfU2NyaXB0KENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KK3ZvaWQgQ1hGQV9TY3JpcHQ6OkdldEJpbmRpbmcoQ0ZYX1dpZGVTdHJpbmcmIHdzQmluZGluZykgew0KKyAgQ0ZYX1dpZGVTdHJpbmdDIGNEYXRhOw0KKyAgbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9CaW5kaW5nLCBjRGF0YSk7DQorICB3c0JpbmRpbmcgPSBjRGF0YTsNCit9DQorWEZBX1NDUklQVFRZUEUgQ1hGQV9TY3JpcHQ6OkdldENvbnRlbnRUeXBlKCkgew0KKyAgQ0ZYX1dpZGVTdHJpbmdDIGNEYXRhOw0KKyAgaWYgKG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIGNEYXRhLCBGQUxTRSkpIHsNCisgICAgaWYgKGNEYXRhID09IEZYX1dTVFJDKEwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IikpIHsNCisgICAgICByZXR1cm4gWEZBX1NDUklQVFRZUEVfSmF2YXNjcmlwdDsNCisgICAgfSBlbHNlIGlmIChjRGF0YSA9PSBGWF9XU1RSQyhMImFwcGxpY2F0aW9uL3gtZm9ybWNhbGMiKSkgew0KKyAgICAgIHJldHVybiBYRkFfU0NSSVBUVFlQRV9Gb3JtY2FsYzsNCisgICAgfSBlbHNlIHsNCisgICAgICByZXR1cm4gWEZBX1NDUklQVFRZUEVfVW5rb3duOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gWEZBX1NDUklQVFRZUEVfRm9ybWNhbGM7DQorfQ0KK2ludDMyX3QgQ1hGQV9TY3JpcHQ6OkdldFJ1bkF0KCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9SdW5BdCk7DQorfQ0KK3ZvaWQgQ1hGQV9TY3JpcHQ6OkdldEV4cHJlc3Npb24oQ0ZYX1dpZGVTdHJpbmcmIHdzRXhwcmVzc2lvbikgew0KKyAgbV9wTm9kZS0+VHJ5Q29udGVudCh3c0V4cHJlc3Npb24pOw0KK30NCitGWF9CT09MIENYRkFfU2NyaXB0OjpTZXRCaW5kaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0JpbmRpbmcpIHsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0JpbmRpbmcsIHdzQmluZGluZyk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9TY3JpcHQ6OlNldENvbnRlbnRUeXBlKFhGQV9TQ1JJUFRUWVBFIGVUeXBlKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1R5cGU7DQorICBzd2l0Y2ggKGVUeXBlKSB7DQorICAgIGNhc2UgWEZBX1NDUklQVFRZUEVfSmF2YXNjcmlwdDoNCisgICAgICB3c1R5cGUgPSBMImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX1NDUklQVFRZUEVfRm9ybWNhbGM6DQorICAgICAgd3NUeXBlID0gTCJhcHBsaWNhdGlvbi94LWZvcm1jYWxjIjsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c1R5cGUpOw0KK30NCitGWF9CT09MIENYRkFfU2NyaXB0OjpTZXRSdW5BdChpbnQzMl90IGlSdW5BdCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9SdW5BdCwgKFhGQV9BVFRSSUJVVEVFTlVNKWlSdW5BdCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9TY3JpcHQ6OlNldEV4cHJlc3Npb24oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRXhwcmVzc2lvbikgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldENvbnRlbnQod3NFeHByZXNzaW9uLCB3c0V4cHJlc3Npb24pOw0KK30NCitDWEZBX1N1Ym1pdDo6Q1hGQV9TdWJtaXQoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQorRlhfQk9PTCBDWEZBX1N1Ym1pdDo6SXNTdWJtaXRFbWJlZFBERigpIHsNCisgIHJldHVybiBtX3BOb2RlLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfRW1iZWRQREYpOw0KK30NCitpbnQzMl90IENYRkFfU3VibWl0OjpHZXRTdWJtaXRGb3JtYXQoKSB7DQorICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0Zvcm1hdCk7DQorfQ0KK3ZvaWQgQ1hGQV9TdWJtaXQ6OkdldFN1Ym1pdFRhcmdldChDRlhfV2lkZVN0cmluZ0MmIHdzVGFyZ2V0KSB7DQorICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1RhcmdldCwgd3NUYXJnZXQpOw0KK30NCitYRkFfVEVYVEVOQ09ESU5HIENYRkFfU3VibWl0OjpHZXRTdWJtaXRUZXh0RW5jb2RpbmcoKSB7DQorICBDRlhfV2lkZVN0cmluZ0Mgd3NDRGF0YTsNCisgIGlmICghbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9UZXh0RW5jb2RpbmcsIHdzQ0RhdGEpKSB7DQorICAgIHJldHVybiBYRkFfVEVYVEVOQ09ESU5HX05vbmU7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlKHdzQ0RhdGEpOw0KKyAgaWYgKHdzVmFsdWUgPT0gTCJCaWctRml2ZSIpIHsNCisgICAgcmV0dXJuIFhGQV9URVhURU5DT0RJTkdfQmlnNTsNCisgIH0gZWxzZSBpZiAod3NWYWx1ZSA9PSBMImZvbnRTcGVjaWZpYyIpIHsNCisgICAgcmV0dXJuIFhGQV9URVhURU5DT0RJTkdfRm9udFNwZWNpZmljOw0KKyAgfSBlbHNlIGlmICh3c1ZhbHVlID09IEwiR0JLIikgew0KKyAgICByZXR1cm4gWEZBX1RFWFRFTkNPRElOR19HQks7DQorICB9IGVsc2UgaWYgKHdzVmFsdWUgPT0gTCJHQi0xODAzMCIpIHsNCisgICAgcmV0dXJuIFhGQV9URVhURU5DT0RJTkdfR0IxODAzMDsNCisgIH0gZWxzZSBpZiAod3NWYWx1ZSA9PSBMIkdCLTIzMTIiKSB7DQorICAgIHJldHVybiBYRkFfVEVYVEVOQ09ESU5HX0dCMjMxMjsNCisgIH0gZWxzZSBpZiAod3NWYWx1ZSA9PSBMIklTTy04ODU5LU5OIikgew0KKyAgICByZXR1cm4gWEZBX1RFWFRFTkNPRElOR19JU084ODU5Tk47DQorICB9IGVsc2UgaWYgKHdzVmFsdWUgPT0gTCJLU0MtNTYwMSIpIHsNCisgICAgcmV0dXJuIFhGQV9URVhURU5DT0RJTkdfS1NDNTYwMTsNCisgIH0gZWxzZSBpZiAod3NWYWx1ZSA9PSBMIlNoaWZ0LUpJUyIpIHsNCisgICAgcmV0dXJuIFhGQV9URVhURU5DT0RJTkdfU2hpZnRKSVM7DQorICB9IGVsc2UgaWYgKHdzVmFsdWUgPT0gTCJVQ1MtMiIpIHsNCisgICAgcmV0dXJuIFhGQV9URVhURU5DT0RJTkdfVUNTMjsNCisgIH0gZWxzZSBpZiAod3NWYWx1ZSA9PSBMIlVURi0xNiIpIHsNCisgICAgcmV0dXJuIFhGQV9URVhURU5DT0RJTkdfVVRGMTY7DQorICB9IGVsc2UgaWYgKHdzVmFsdWUgPT0gTCJVVEYtOCIpIHsNCisgICAgcmV0dXJuIFhGQV9URVhURU5DT0RJTkdfVVRGODsNCisgIH0NCisgIHJldHVybiBYRkFfVEVYVEVOQ09ESU5HX05vbmU7DQorfQ0KK3ZvaWQgQ1hGQV9TdWJtaXQ6OkdldFN1Ym1pdFhEUENvbnRlbnQoQ0ZYX1dpZGVTdHJpbmdDJiB3c0NvbnRlbnQpIHsNCisgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfWGRwQ29udGVudCwgd3NDb250ZW50KTsNCit9DQorRlhfQk9PTCBDWEZBX1N1Ym1pdDo6U2V0U3VibWl0Rm9ybWF0KGludDMyX3QgaVN1Ym1pdEZvcm1hdCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9Gb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAoWEZBX0FUVFJJQlVURUVOVU0paVN1Ym1pdEZvcm1hdCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9TdWJtaXQ6OlNldFN1Ym1pdFRhcmdldChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUYXJnZXQpIHsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1RhcmdldCwgd3NUYXJnZXQpOw0KK30NCitGWF9CT09MIENYRkFfU3VibWl0OjpTZXRTdWJtaXRUZXh0RW5jb2RpbmcoWEZBX1RFWFRFTkNPRElORyBlVGV4dEVuY29kaW5nKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgc3dpdGNoIChlVGV4dEVuY29kaW5nKSB7DQorICAgIGNhc2UgWEZBX1RFWFRFTkNPRElOR19CaWc1Og0KKyAgICAgIHdzVmFsdWUgPSBMIkJpZy1GaXZlIjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfVEVYVEVOQ09ESU5HX0ZvbnRTcGVjaWZpYzoNCisgICAgICB3c1ZhbHVlID0gTCJmb250U3BlY2lmaWMiOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9URVhURU5DT0RJTkdfR0JLOg0KKyAgICAgIHdzVmFsdWUgPSBMIkdCSyI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX1RFWFRFTkNPRElOR19HQjE4MDMwOg0KKyAgICAgIHdzVmFsdWUgPSBMIkdCLTE4MDMwIjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfVEVYVEVOQ09ESU5HX0dCMjMxMjoNCisgICAgICB3c1ZhbHVlID0gTCJHQi0yMzEyIjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfVEVYVEVOQ09ESU5HX0lTTzg4NTlOTjoNCisgICAgICB3c1ZhbHVlID0gTCJJU08tODg1OS1OTiI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX1RFWFRFTkNPRElOR19LU0M1NjAxOg0KKyAgICAgIHdzVmFsdWUgPSBMIktTQy01NjAxIjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfVEVYVEVOQ09ESU5HX1NoaWZ0SklTOg0KKyAgICAgIHdzVmFsdWUgPSBMIlNoaWZ0LUpJUyI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX1RFWFRFTkNPRElOR19VQ1MyOg0KKyAgICAgIHdzVmFsdWUgPSBMIlVDUy0yIjsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfVEVYVEVOQ09ESU5HX1VURjE2Og0KKyAgICAgIHdzVmFsdWUgPSBMIlVURi0xNiI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX1RFWFRFTkNPRElOR19VVEY4Og0KKyAgICAgIHdzVmFsdWUgPSBMIlVURi04IjsNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCisgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1RleHRFbmNvZGluZywgd3NWYWx1ZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9TdWJtaXQ6OlNldFN1Ym1pdFhEUENvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfWGRwQ29udGVudCwgd3NDb250ZW50KTsNCit9DQorWEZBX0VMRU1FTlQgQ1hGQV9WYWx1ZTo6R2V0Q2hpbGRWYWx1ZUNsYXNzSUQoKSB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIFhGQV9FTEVNRU5UX1VOS05PV047DQorICB9DQorICBpZiAoQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkgew0KKyAgICByZXR1cm4gcE5vZGUtPkdldENsYXNzSUQoKTsNCisgIH0NCisgIHJldHVybiBYRkFfRUxFTUVOVF9VTktOT1dOOw0KK30NCitGWF9CT09MIENYRkFfVmFsdWU6OkdldENoaWxkVmFsdWVDb250ZW50KENGWF9XaWRlU3RyaW5nJiB3c0NvbnRlbnQpIHsNCisgIGlmICghbV9wTm9kZSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkgew0KKyAgICByZXR1cm4gcE5vZGUtPlRyeUNvbnRlbnQod3NDb250ZW50KTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorQ1hGQV9BcmMgQ1hGQV9WYWx1ZTo6R2V0QXJjKCkgew0KKyAgcmV0dXJuIG1fcE5vZGUgPyBDWEZBX0FyYyhtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpDQorICAgICAgICAgICAgICAgICA6IE5VTEw7DQorfQ0KK0NYRkFfTGluZSBDWEZBX1ZhbHVlOjpHZXRMaW5lKCkgew0KKyAgcmV0dXJuIG1fcE5vZGUgPyBDWEZBX0xpbmUobV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpKQ0KKyAgICAgICAgICAgICAgICAgOiBOVUxMOw0KK30NCitDWEZBX1JlY3RhbmdsZSBDWEZBX1ZhbHVlOjpHZXRSZWN0YW5nbGUoKSB7DQorICByZXR1cm4gbV9wTm9kZSA/IENYRkFfUmVjdGFuZ2xlKG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkNCisgICAgICAgICAgICAgICAgIDogTlVMTDsNCit9DQorQ1hGQV9UZXh0IENYRkFfVmFsdWU6OkdldFRleHQoKSB7DQorICByZXR1cm4gbV9wTm9kZSA/IENYRkFfVGV4dChtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpDQorICAgICAgICAgICAgICAgICA6IE5VTEw7DQorfQ0KK0NYRkFfRXhEYXRhIENYRkFfVmFsdWU6OkdldEV4RGF0YSgpIHsNCisgIHJldHVybiBtX3BOb2RlID8gQ1hGQV9FeERhdGEobV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpKQ0KKyAgICAgICAgICAgICAgICAgOiBOVUxMOw0KK30NCitDWEZBX0ltYWdlIENYRkFfVmFsdWU6OkdldEltYWdlKCkgew0KKyAgcmV0dXJuIENYRkFfSW1hZ2UoDQorICAgICAgbV9wTm9kZSA/IChtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpIDogTlVMTCwgVFJVRSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9WYWx1ZTo6U2V0Q2hpbGRWYWx1ZUNvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UIGlUeXBlKSB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIGlmICghcE5vZGUpIHsNCisgICAgaWYgKGlUeXBlID09IFhGQV9FTEVNRU5UX1VOS05PV04pIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBpVHlwZSk7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdENvbnRlbnQod3NDb250ZW50KTsNCisgIENYRkFfV2lkZ2V0RGF0YSogcENvbnRhaW5lcldpZGdldERhdGEgPSBwTm9kZS0+R2V0Q29udGFpbmVyV2lkZ2V0RGF0YSgpOw0KKyAgaWYgKHBDb250YWluZXJXaWRnZXREYXRhKSB7DQorICAgIHBDb250YWluZXJXaWRnZXREYXRhLT5HZXRGb3JtYXREYXRhVmFsdWUod3NDb250ZW50LCB3c0Zvcm1hdENvbnRlbnQpOw0KKyAgfQ0KKyAgcmV0dXJuIHBOb2RlLT5TZXRDb250ZW50KHdzQ29udGVudCwgd3NGb3JtYXRDb250ZW50LCBiTm90aWZ5KTsNCit9DQoraW50MzJfdCBDWEZBX0xpbmU6OkdldEhhbmQoKSB7DQorICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0hhbmQpOw0KK30NCitGWF9CT09MIENYRkFfTGluZTo6R2V0U2xvcCgpIHsNCisgIFhGQV9BVFRSSUJVVEVFTlVNIGVTbG9wID0gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1Nsb3BlKTsNCisgIHJldHVybiBlU2xvcCA9PSBYRkFfQVRUUklCVVRFRU5VTV9TbGFzaDsNCit9DQorQ1hGQV9FZGdlIENYRkFfTGluZTo6R2V0RWRnZSgpIHsNCisgIHJldHVybiBDWEZBX0VkZ2UobV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfRWRnZSkpOw0KK30NCitGWF9CT09MIENYRkFfTGluZTo6U2V0SGFuZChpbnQzMl90IGlIYW5kKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0hhbmQsIChYRkFfQVRUUklCVVRFRU5VTSlpSGFuZCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9MaW5lOjpTZXRTbG9wKGludDMyX3QgaVNsb3ApIHsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfU2xvcGUsIChYRkFfQVRUUklCVVRFRU5VTSlpU2xvcCk7DQorfQ0KK0NYRkFfVGV4dDo6Q1hGQV9UZXh0KENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KK3ZvaWQgQ1hGQV9UZXh0OjpHZXROYW1lKENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKSB7DQorICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7DQorfQ0KK2ludDMyX3QgQ1hGQV9UZXh0OjpHZXRNYXhDaGFycygpIHsNCisgIHJldHVybiBtX3BOb2RlLT5HZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWF4Q2hhcnMpOw0KK30NCit2b2lkIENYRkFfVGV4dDo6R2V0UmlkKENGWF9XaWRlU3RyaW5nQyYgd3NSaWQpIHsNCisgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfUmlkLCB3c1JpZCk7DQorfQ0KK3ZvaWQgQ1hGQV9UZXh0OjpHZXRDb250ZW50KENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsNCisgIG1fcE5vZGUtPlRyeUNvbnRlbnQod3NUZXh0KTsNCit9DQordm9pZCBDWEZBX1RleHQ6OlNldENvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0LCBGWF9CT09MIGJOb3RpZnkpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0VmFsdWUod3NUZXh0KTsNCisgIENYRkFfV2lkZ2V0RGF0YSogcENvbnRhaW5lcldpZGdldERhdGEgPSBtX3BOb2RlLT5HZXRDb250YWluZXJXaWRnZXREYXRhKCk7DQorICBpZiAocENvbnRhaW5lcldpZGdldERhdGEpIHsNCisgICAgcENvbnRhaW5lcldpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c1RleHQsIHdzRm9ybWF0VmFsdWUpOw0KKyAgfQ0KKyAgbV9wTm9kZS0+U2V0Q29udGVudCh3c1RleHQsIHdzRm9ybWF0VmFsdWUsIGJOb3RpZnkpOw0KK30NCitGWF9CT09MIENYRkFfVGV4dDo6U2V0TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NOYW1lKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUpOw0KK30NCitGWF9CT09MIENYRkFfVGV4dDo6U2V0TWF4Q2hhcnMoaW50MzJfdCBpTWF4Q2hhcnMpIHsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWF4Q2hhcnMsIGlNYXhDaGFycyk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9UZXh0OjpTZXRSaWQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUmlkKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9SaWQsIHdzUmlkKTsNCit9DQorQ1hGQV9FeERhdGE6OkNYRkFfRXhEYXRhKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KK3ZvaWQgQ1hGQV9FeERhdGE6OkdldENvbnRlbnRUeXBlKENGWF9XaWRlU3RyaW5nQyYgd3NDb250ZW50VHlwZSkgew0KKyAgbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSk7DQorfQ0KK3ZvaWQgQ1hGQV9FeERhdGE6OkdldEhyZWYoQ0ZYX1dpZGVTdHJpbmdDJiB3c0hyZWYpIHsNCisgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfSHJlZiwgd3NIcmVmKTsNCit9DQoraW50MzJfdCBDWEZBX0V4RGF0YTo6R2V0TWF4TGVuZ3RoKCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9NYXhMZW5ndGgpOw0KK30NCit2b2lkIENYRkFfRXhEYXRhOjpHZXRSaWQoQ0ZYX1dpZGVTdHJpbmdDJiB3c1JpZCkgew0KKyAgbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9SaWQsIHdzUmlkKTsNCit9DQoraW50MzJfdCBDWEZBX0V4RGF0YTo6R2V0VHJhbnNmZXJFbmNvZGluZygpIHsNCisgIHJldHVybiBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZyk7DQorfQ0KK3ZvaWQgQ1hGQV9FeERhdGE6OkdldENvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgbV9wTm9kZS0+VHJ5Q29udGVudCh3c1RleHQpOw0KK30NCitGWF9CT09MIENYRkFfRXhEYXRhOjpTZXRDb250ZW50VHlwZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50VHlwZSkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIHdzQ29udGVudFR5cGUpOw0KK30NCitGWF9CT09MIENYRkFfRXhEYXRhOjpTZXRIcmVmKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0hyZWYpIHsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0hyZWYsIHdzSHJlZik7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9FeERhdGE6OlNldE1heExlbmd0aChpbnQzMl90IGlNYXhMZW5ndGgpIHsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWF4TGVuZ3RoLCBpTWF4TGVuZ3RoKTsNCit9DQorRlhfQk9PTCBDWEZBX0V4RGF0YTo6U2V0UmlkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1JpZCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfUmlkLCB3c1JpZCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9FeERhdGE6OlNldFRyYW5zZmVyRW5jb2RpbmcoaW50MzJfdCBpVHJhbnNmZXJFbmNvZGluZykgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9UcmFuc2ZlckVuY29kaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKFhGQV9BVFRSSUJVVEVFTlVNKWlUcmFuc2ZlckVuY29kaW5nKTsNCit9DQorRlhfQk9PTCBDWEZBX0V4RGF0YTo6U2V0Q29udGVudChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3luY0RhdGEpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0VmFsdWUod3NUZXh0KTsNCisgIENYRkFfV2lkZ2V0RGF0YSogcENvbnRhaW5lcldpZGdldERhdGEgPSBtX3BOb2RlLT5HZXRDb250YWluZXJXaWRnZXREYXRhKCk7DQorICBpZiAocENvbnRhaW5lcldpZGdldERhdGEpIHsNCisgICAgcENvbnRhaW5lcldpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c1RleHQsIHdzRm9ybWF0VmFsdWUpOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldENvbnRlbnQod3NUZXh0LCB3c0Zvcm1hdFZhbHVlLCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlN5bmNEYXRhKTsNCit9DQorQ1hGQV9JbWFnZTo6Q1hGQV9JbWFnZShDWEZBX05vZGUqIHBOb2RlLCBGWF9CT09MIGJEZWZWYWx1ZSkNCisgICAgOiBDWEZBX0RhdGEocE5vZGUpLCBtX2JEZWZWYWx1ZShiRGVmVmFsdWUpIHt9DQoraW50MzJfdCBDWEZBX0ltYWdlOjpHZXRBc3BlY3QoKSB7DQorICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0FzcGVjdCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9JbWFnZTo6R2V0Q29udGVudFR5cGUoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudFR5cGUpIHsNCisgIHJldHVybiBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlKTsNCit9DQorRlhfQk9PTCBDWEZBX0ltYWdlOjpHZXRIcmVmKENGWF9XaWRlU3RyaW5nJiB3c0hyZWYpIHsNCisgIGlmIChtX2JEZWZWYWx1ZSkgew0KKyAgICByZXR1cm4gbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9IcmVmLCB3c0hyZWYpOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldEF0dHJpYnV0ZShGWF9XU1RSQyhMImhyZWYiKSwgd3NIcmVmKTsNCit9DQoraW50MzJfdCBDWEZBX0ltYWdlOjpHZXRUcmFuc2ZlckVuY29kaW5nKCkgew0KKyAgaWYgKG1fYkRlZlZhbHVlKSB7DQorICAgIHJldHVybiBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZyk7DQorICB9DQorICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fQmFzZTY0Ow0KK30NCitGWF9CT09MIENYRkFfSW1hZ2U6OkdldENvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlRyeUNvbnRlbnQod3NUZXh0KTsNCit9DQorRlhfQk9PTCBDWEZBX0ltYWdlOjpTZXRBc3BlY3QoaW50MzJfdCBpQXNwZWN0KSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0FzcGVjdCwgKFhGQV9BVFRSSUJVVEVFTlVNKWlBc3BlY3QpOw0KK30NCitGWF9CT09MIENYRkFfSW1hZ2U6OlNldENvbnRlbnRUeXBlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0NvbnRlbnRUeXBlKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9JbWFnZTo6U2V0SHJlZihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NIcmVmKSB7DQorICBpZiAobV9iRGVmVmFsdWUpIHsNCisgICAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfSHJlZiwgd3NIcmVmKTsNCisgIH0NCisgIHJldHVybiBtX3BOb2RlLT5TZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9IcmVmLCB3c0hyZWYpOw0KK30NCitGWF9CT09MIENYRkFfSW1hZ2U6OlNldFRyYW5zZmVyRW5jb2RpbmcoaW50MzJfdCBpVHJhbnNmZXJFbmNvZGluZykgew0KKyAgaWYgKG1fYkRlZlZhbHVlKSB7DQorICAgIHJldHVybiBtX3BOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFhGQV9BVFRSSUJVVEVFTlVNKWlUcmFuc2ZlckVuY29kaW5nKTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfSW1hZ2U6OlNldENvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXRWYWx1ZSh3c1RleHQpOw0KKyAgQ1hGQV9XaWRnZXREYXRhKiBwQ29udGFpbmVyV2lkZ2V0RGF0YSA9IG1fcE5vZGUtPkdldENvbnRhaW5lcldpZGdldERhdGEoKTsNCisgIGlmIChwQ29udGFpbmVyV2lkZ2V0RGF0YSkgew0KKyAgICBwQ29udGFpbmVyV2lkZ2V0RGF0YS0+R2V0Rm9ybWF0RGF0YVZhbHVlKHdzVGV4dCwgd3NGb3JtYXRWYWx1ZSk7DQorICB9DQorICByZXR1cm4gbV9wTm9kZS0+U2V0Q29udGVudCh3c1RleHQsIHdzRm9ybWF0VmFsdWUpOw0KK30NCitDWEZBX0NhbGN1bGF0ZTo6Q1hGQV9DYWxjdWxhdGUoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQoraW50MzJfdCBDWEZBX0NhbGN1bGF0ZTo6R2V0T3ZlcnJpZGUoKSB7DQorICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ID0gWEZBX0FUVFJJQlVURUVOVU1fRXJyb3I7DQorICBtX3BOb2RlLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfT3ZlcnJpZGUsIGVBdHQsIEZBTFNFKTsNCisgIHJldHVybiBlQXR0Ow0KK30NCitDWEZBX1NjcmlwdCBDWEZBX0NhbGN1bGF0ZTo6R2V0U2NyaXB0KCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1NjcmlwdCk7DQorfQ0KK3ZvaWQgQ1hGQV9DYWxjdWxhdGU6OkdldE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nJiB3c01lc3NhZ2UpIHsNCisgIGlmIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfTWVzc2FnZSkpIHsNCisgICAgQ1hGQV9UZXh0IHRleHQocE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1RleHQpKTsNCisgICAgaWYgKHRleHQpIHsNCisgICAgICB0ZXh0LkdldENvbnRlbnQod3NNZXNzYWdlKTsNCisgICAgfQ0KKyAgfQ0KK30NCitGWF9CT09MIENYRkFfQ2FsY3VsYXRlOjpTZXRPdmVycmlkZShpbnQzMl90IGlPdmVycmlkZSkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9PdmVycmlkZSwgKFhGQV9BVFRSSUJVVEVFTlVNKWlPdmVycmlkZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9DYWxjdWxhdGU6OlNldE1lc3NhZ2VUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c01lc3NhZ2UpIHsNCisgIGlmIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfTWVzc2FnZSkpIHsNCisgICAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1RleHQpOw0KKyAgICByZXR1cm4gcENoaWxkTm9kZS0+U2V0Q29udGVudCh3c01lc3NhZ2UsIHdzTWVzc2FnZSk7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0NYRkFfVmFsaWRhdGU6OkNYRkFfVmFsaWRhdGUoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQoraW50MzJfdCBDWEZBX1ZhbGlkYXRlOjpHZXRGb3JtYXRUZXN0KCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9Gb3JtYXRUZXN0KTsNCit9DQorRlhfQk9PTCBDWEZBX1ZhbGlkYXRlOjpTZXRUZXN0VmFsdWUoaW50MzJfdCBpVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlTmFtZSkgew0KKyAgWEZBX0xQQ0FUVFJJQlVURUVOVU1JTkZPIHBJbmZvID0gWEZBX0dldEF0dHJpYnV0ZUVudW1CeU5hbWUod3NWYWx1ZSk7DQorICBpZiAocEluZm8pIHsNCisgICAgZU5hbWUgPSBwSW5mby0+ZU5hbWU7DQorICB9DQorICBtX3BOb2RlLT5TZXRFbnVtKChYRkFfQVRUUklCVVRFKWlUeXBlLCBlTmFtZSwgRkFMU0UpOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9WYWxpZGF0ZTo6U2V0Rm9ybWF0VGVzdChDRlhfV2lkZVN0cmluZyB3c1ZhbHVlKSB7DQorICByZXR1cm4gU2V0VGVzdFZhbHVlKFhGQV9BVFRSSUJVVEVfRm9ybWF0VGVzdCwgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU1fV2FybmluZyk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9WYWxpZGF0ZTo6U2V0TnVsbFRlc3QoQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSkgew0KKyAgcmV0dXJuIFNldFRlc3RWYWx1ZShYRkFfQVRUUklCVVRFX051bGxUZXN0LCB3c1ZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTV9EaXNhYmxlZCk7DQorfQ0KK2ludDMyX3QgQ1hGQV9WYWxpZGF0ZTo6R2V0TnVsbFRlc3QoKSB7DQorICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX051bGxUZXN0KTsNCit9DQoraW50MzJfdCBDWEZBX1ZhbGlkYXRlOjpHZXRTY3JpcHRUZXN0KCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9TY3JpcHRUZXN0KTsNCit9DQordm9pZCBDWEZBX1ZhbGlkYXRlOjpHZXRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyYgd3NNZXNzYWdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c01lc3NhZ2VUeXBlKSB7DQorICBpZiAoQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX01lc3NhZ2UsIEZBTFNFKSkgew0KKyAgICBDWEZBX05vZGUqIHBJdGVtTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgIGZvciAoOyBwSXRlbU5vZGU7DQorICAgICAgICAgcEl0ZW1Ob2RlID0gcEl0ZW1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgaWYgKHBJdGVtTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX1RleHQpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NOYW1lOw0KKyAgICAgIHBJdGVtTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUpOw0KKyAgICAgIGlmICh3c05hbWUuSXNFbXB0eSgpIHx8IHdzTmFtZSA9PSB3c01lc3NhZ2VUeXBlKSB7DQorICAgICAgICBwSXRlbU5vZGUtPlRyeUNvbnRlbnQod3NNZXNzYWdlKTsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDWEZBX1ZhbGlkYXRlOjpTZXRGb3JtYXRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2UpIHsNCisgIFNldE1lc3NhZ2VUZXh0KHdzTWVzc2FnZSwgRlhfV1NUUkMoTCJmb3JtYXRUZXN0IikpOw0KK30NCit2b2lkIENYRkFfVmFsaWRhdGU6OkdldEZvcm1hdE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nJiB3c01lc3NhZ2UpIHsNCisgIEdldE1lc3NhZ2VUZXh0KHdzTWVzc2FnZSwgRlhfV1NUUkMoTCJmb3JtYXRUZXN0IikpOw0KK30NCit2b2lkIENYRkFfVmFsaWRhdGU6OlNldE51bGxNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2UpIHsNCisgIFNldE1lc3NhZ2VUZXh0KHdzTWVzc2FnZSwgRlhfV1NUUkMoTCJudWxsVGVzdCIpKTsNCit9DQordm9pZCBDWEZBX1ZhbGlkYXRlOjpHZXROdWxsTWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzTWVzc2FnZSkgew0KKyAgR2V0TWVzc2FnZVRleHQod3NNZXNzYWdlLCBGWF9XU1RSQyhMIm51bGxUZXN0IikpOw0KK30NCit2b2lkIENYRkFfVmFsaWRhdGU6OlNldE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nJiB3c01lc3NhZ2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTWVzc2FnZVR5cGUpIHsNCisgIGlmIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfTWVzc2FnZSwgVFJVRSkpIHsNCisgICAgQ1hGQV9Ob2RlKiBwSXRlbU5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBmb3IgKDsgcEl0ZW1Ob2RlOw0KKyAgICAgICAgIHBJdGVtTm9kZSA9IHBJdGVtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgIGlmIChwSXRlbU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9UZXh0KSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzTmFtZTsNCisgICAgICBwSXRlbU5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOYW1lKTsNCisgICAgICBpZiAod3NOYW1lLklzRW1wdHkoKSB8fCB3c05hbWUgPT0gd3NNZXNzYWdlVHlwZSkgew0KKyAgICAgICAgcEl0ZW1Ob2RlLT5TZXRDb250ZW50KHdzTWVzc2FnZSwgd3NNZXNzYWdlLCBGQUxTRSk7DQorICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcFRleHROb2RlID0gcE5vZGUtPkNyZWF0ZVNhbWVQYWNrZXROb2RlKFhGQV9FTEVNRU5UX1RleHQpOw0KKyAgICBwTm9kZS0+SW5zZXJ0Q2hpbGQocFRleHROb2RlKTsNCisgICAgcFRleHROb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTWVzc2FnZVR5cGUsIEZBTFNFKTsNCisgICAgcFRleHROb2RlLT5TZXRDb250ZW50KHdzTWVzc2FnZSwgd3NNZXNzYWdlLCBGQUxTRSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9WYWxpZGF0ZTo6R2V0U2NyaXB0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzTWVzc2FnZSkgew0KKyAgR2V0TWVzc2FnZVRleHQod3NNZXNzYWdlLCBGWF9XU1RSQyhMInNjcmlwdFRlc3QiKSk7DQorfQ0KK3ZvaWQgQ1hGQV9WYWxpZGF0ZTo6U2V0U2NyaXB0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcgd3NNZXNzYWdlKSB7DQorICBTZXRNZXNzYWdlVGV4dCh3c01lc3NhZ2UsIEZYX1dTVFJDKEwic2NyaXB0VGVzdCIpKTsNCit9DQordm9pZCBDWEZBX1ZhbGlkYXRlOjpHZXRQaWN0dXJlKENGWF9XaWRlU3RyaW5nJiB3c1BpY3R1cmUpIHsNCisgIGlmIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfUGljdHVyZSkpIHsNCisgICAgcE5vZGUtPlRyeUNvbnRlbnQod3NQaWN0dXJlKTsNCisgIH0NCit9DQorQ1hGQV9TY3JpcHQgQ1hGQV9WYWxpZGF0ZTo6R2V0U2NyaXB0KCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1NjcmlwdCk7DQorfQ0KK0NYRkFfVmFyaWFibGVzOjpDWEZBX1ZhcmlhYmxlcyhDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCitpbnQzMl90IENYRkFfVmFyaWFibGVzOjpDb3VudFNjcmlwdHMoKSB7DQorICByZXR1cm4gbV9wTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9TY3JpcHQpOw0KK30NCitDWEZBX1NjcmlwdCBDWEZBX1ZhcmlhYmxlczo6R2V0U2NyaXB0KGludDMyX3QgbkluZGV4KSB7DQorICByZXR1cm4gbV9wTm9kZS0+R2V0Q2hpbGQobkluZGV4LCBYRkFfRUxFTUVOVF9TY3JpcHQpOw0KK30NCitDWEZBX0JpbmQ6OkNYRkFfQmluZChDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCitpbnQzMl90IENYRkFfQmluZDo6R2V0TWF0Y2goKSB7DQorICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX01hdGNoKTsNCit9DQordm9pZCBDWEZBX0JpbmQ6OkdldFJlZihDRlhfV2lkZVN0cmluZ0MmIHdzUmVmKSB7DQorICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1JlZiwgd3NSZWYpOw0KK30NCit2b2lkIENYRkFfQmluZDo6R2V0UGljdHVyZShDRlhfV2lkZVN0cmluZyYgd3NQaWN0dXJlKSB7DQorICBpZiAoQ1hGQV9Ob2RlKiBwUGljdHVyZSA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1BpY3R1cmUpKSB7DQorICAgIHBQaWN0dXJlLT5UcnlDb250ZW50KHdzUGljdHVyZSk7DQorICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9CaW5kOjpTZXRNYXRjaChpbnQzMl90IGlNYXRjaCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9NYXRjaCwgKFhGQV9BVFRSSUJVVEVFTlVNKWlNYXRjaCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9CaW5kOjpTZXRSZWYoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUmVmKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9SZWYsIHdzUmVmKTsNCit9DQorRlhfQk9PTCBDWEZBX0JpbmQ6OlNldFBpY3R1cmUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGljdHVyZSkgew0KKyAgaWYgKENYRkFfTm9kZSogcFBpY3R1cmUgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9QaWN0dXJlKSkgew0KKyAgICByZXR1cm4gcFBpY3R1cmUtPlNldENvbnRlbnQod3NQaWN0dXJlLCB3c1BpY3R1cmUpOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitDWEZBX0Fzc2lzdDo6Q1hGQV9Bc3Npc3QoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9DQorQ1hGQV9Ub29sVGlwIENYRkFfQXNzaXN0OjpHZXRUb29sVGlwKCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1Rvb2xUaXApOw0KK30NCitDWEZBX1Rvb2xUaXA6OkNYRkFfVG9vbFRpcChDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCitGWF9CT09MIENYRkFfVG9vbFRpcDo6R2V0VGlwKENGWF9XaWRlU3RyaW5nJiB3c1RpcCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlRyeUNvbnRlbnQod3NUaXApOw0KK30NCitGWF9CT09MIENYRkFfVG9vbFRpcDo6U2V0VGlwKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RpcCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldENvbnRlbnQod3NUaXAsIHdzVGlwKTsNCit9DQorQ1hGQV9CaW5kSXRlbXM6OkNYRkFfQmluZEl0ZW1zKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQ0KK3ZvaWQgQ1hGQV9CaW5kSXRlbXM6OkdldENvbm5lY3Rpb24oQ0ZYX1dpZGVTdHJpbmdDJiB3c0Nvbm5lY3Rpb24pIHsNCisgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfQ29ubmVjdGlvbiwgd3NDb25uZWN0aW9uKTsNCit9DQordm9pZCBDWEZBX0JpbmRJdGVtczo6R2V0TGFiZWxSZWYoQ0ZYX1dpZGVTdHJpbmdDJiB3c0xhYmVsUmVmKSB7DQorICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0xhYmVsUmVmLCB3c0xhYmVsUmVmKTsNCit9DQordm9pZCBDWEZBX0JpbmRJdGVtczo6R2V0VmFsdWVSZWYoQ0ZYX1dpZGVTdHJpbmdDJiB3c1ZhbHVlUmVmKSB7DQorICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlUmVmLCB3c1ZhbHVlUmVmKTsNCit9DQordm9pZCBDWEZBX0JpbmRJdGVtczo6R2V0UmVmKENGWF9XaWRlU3RyaW5nQyYgd3NSZWYpIHsNCisgIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfUmVmLCB3c1JlZik7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9CaW5kSXRlbXM6OlNldENvbm5lY3Rpb24oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29ubmVjdGlvbikgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfQ29ubmVjdGlvbiwgd3NDb25uZWN0aW9uKTsNCit9DQorRlhfQk9PTCBDWEZBX0JpbmRJdGVtczo6U2V0TGFiZWxSZWYoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTGFiZWxSZWYpIHsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0xhYmVsUmVmLCB3c0xhYmVsUmVmKTsNCit9DQorRlhfQk9PTCBDWEZBX0JpbmRJdGVtczo6U2V0VmFsdWVSZWYoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWVSZWYpIHsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlUmVmLCB3c1ZhbHVlUmVmKTsNCit9DQorRlhfQk9PTCBDWEZBX0JpbmRJdGVtczo6U2V0UmVmKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1JlZikgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfUmVmLCB3c1JlZik7DQorfQ0KK2ludDMyX3QgQ1hGQV9Cb3g6OkdldEJyZWFrKCkgY29uc3Qgew0KKyAgaWYgKCFtX3BOb2RlKSB7DQorICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9DbG9zZTsNCisgIH0NCisgIHJldHVybiBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfQnJlYWspOw0KK30NCitpbnQzMl90IENYRkFfQm94OjpHZXRIYW5kKCkgY29uc3Qgew0KKyAgaWYgKCFtX3BOb2RlKSB7DQorICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9FdmVuOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9IYW5kKTsNCit9DQoraW50MzJfdCBDWEZBX0JveDo6R2V0UHJlc2VuY2UoKSBjb25zdCB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX0hpZGRlbjsNCisgIH0NCisgIHJldHVybiBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UpOw0KK30NCitpbnQzMl90IENYRkFfQm94OjpDb3VudENvcm5lcnMoKSBjb25zdCB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICByZXR1cm4gbV9wTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9Db3JuZXIpOw0KK30NCitDWEZBX0Nvcm5lciBDWEZBX0JveDo6R2V0Q29ybmVyKGludDMyX3QgbkluZGV4KSBjb25zdCB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gQ1hGQV9Db3JuZXIoDQorICAgICAgbV9wTm9kZS0+R2V0UHJvcGVydHkobkluZGV4LCBYRkFfRUxFTUVOVF9Db3JuZXIsIG5JbmRleCA9PSAwKSk7DQorfQ0KK2ludDMyX3QgQ1hGQV9Cb3g6OkNvdW50RWRnZXMoKSBjb25zdCB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICByZXR1cm4gbV9wTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9FZGdlKTsNCit9DQorQ1hGQV9FZGdlIENYRkFfQm94OjpHZXRFZGdlKGludDMyX3QgbkluZGV4KSBjb25zdCB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gQ1hGQV9FZGdlKG1fcE5vZGUtPkdldFByb3BlcnR5KG5JbmRleCwgWEZBX0VMRU1FTlRfRWRnZSwgbkluZGV4ID09IDApKTsNCit9DQorc3RhdGljIHZvaWQgWEZBX0JPWF9HZXRTdHJva2VzKENYRkFfTm9kZSogcE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfU3Ryb2tlQXJyYXkmIHN0cm9rZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5VTEwpIHsNCisgIHN0cm9rZXMuUmVtb3ZlQWxsKCk7DQorICBpZiAoIXBOb2RlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHN0cm9rZXMuU2V0U2l6ZSg4KTsNCisgIGludDMyX3QgaSwgajsNCisgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgNDsgaSsrKSB7DQorICAgIENYRkFfQ29ybmVyIGNvcm5lciA9DQorICAgICAgICBDWEZBX0Nvcm5lcihwTm9kZS0+R2V0UHJvcGVydHkoaSwgWEZBX0VMRU1FTlRfQ29ybmVyLCBpID09IDApKTsNCisgICAgaWYgKGNvcm5lci5Jc0V4aXN0SW5YTUwoKSB8fCBpID09IDApIHsNCisgICAgICBzdHJva2VzLlNldEF0KGosIGNvcm5lcik7DQorICAgIH0gZWxzZSBpZiAoYk5VTEwpIHsNCisgICAgICBzdHJva2VzLlNldEF0KGosIE5VTEwpOw0KKyAgICB9IGVsc2UgaWYgKGkgPT0gMSkgew0KKyAgICAgIHN0cm9rZXMuU2V0QXQoaiwgc3Ryb2tlc1swXSk7DQorICAgIH0gZWxzZSBpZiAoaSA9PSAyKSB7DQorICAgICAgc3Ryb2tlcy5TZXRBdChqLCBzdHJva2VzWzBdKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBzdHJva2VzLlNldEF0KGosIHN0cm9rZXNbMl0pOw0KKyAgICB9DQorICAgIGorKzsNCisgICAgQ1hGQV9FZGdlIGVkZ2UgPSBDWEZBX0VkZ2UocE5vZGUtPkdldFByb3BlcnR5KGksIFhGQV9FTEVNRU5UX0VkZ2UsIGkgPT0gMCkpOw0KKyAgICBpZiAoZWRnZS5Jc0V4aXN0SW5YTUwoKSB8fCBpID09IDApIHsNCisgICAgICBzdHJva2VzLlNldEF0KGosIGVkZ2UpOw0KKyAgICB9IGVsc2UgaWYgKGJOVUxMKSB7DQorICAgICAgc3Ryb2tlcy5TZXRBdChqLCBOVUxMKTsNCisgICAgfSBlbHNlIGlmIChpID09IDEpIHsNCisgICAgICBzdHJva2VzLlNldEF0KGosIHN0cm9rZXNbMV0pOw0KKyAgICB9IGVsc2UgaWYgKGkgPT0gMikgew0KKyAgICAgIHN0cm9rZXMuU2V0QXQoaiwgc3Ryb2tlc1sxXSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgc3Ryb2tlcy5TZXRBdChqLCBzdHJva2VzWzNdKTsNCisgICAgfQ0KKyAgICBqKys7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Cb3g6OkdldFN0cm9rZXMoQ1hGQV9TdHJva2VBcnJheSYgc3Ryb2tlcykgY29uc3Qgew0KKyAgWEZBX0JPWF9HZXRTdHJva2VzKG1fcE5vZGUsIHN0cm9rZXMsIEZBTFNFKTsNCit9DQorRlhfQk9PTCBDWEZBX0JveDo6SXNDaXJjdWxhcigpIGNvbnN0IHsNCisgIGlmICghbV9wTm9kZSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gbV9wTm9kZS0+R2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX0NpcmN1bGFyKTsNCit9DQorRlhfQk9PTCBDWEZBX0JveDo6R2V0U3RhcnRBbmdsZShGWF9GTE9BVCYgZlN0YXJ0QW5nbGUpIGNvbnN0IHsNCisgIGZTdGFydEFuZ2xlID0gMDsNCisgIGlmICghbV9wTm9kZSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDWEZBX01lYXN1cmVtZW50IG1zOw0KKyAgRlhfQk9PTCBiUmV0ID0gbV9wTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1N0YXJ0QW5nbGUsIG1zLCBGQUxTRSk7DQorICBpZiAoYlJldCkgew0KKyAgICBmU3RhcnRBbmdsZSA9IG1zLkdldFZhbHVlKCk7DQorICB9DQorICByZXR1cm4gYlJldDsNCit9DQorRlhfQk9PTCBDWEZBX0JveDo6R2V0U3dlZXBBbmdsZShGWF9GTE9BVCYgZlN3ZWVwQW5nbGUpIGNvbnN0IHsNCisgIGZTd2VlcEFuZ2xlID0gMzYwOw0KKyAgaWYgKCFtX3BOb2RlKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENYRkFfTWVhc3VyZW1lbnQgbXM7DQorICBGWF9CT09MIGJSZXQgPSBtX3BOb2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfU3dlZXBBbmdsZSwgbXMsIEZBTFNFKTsNCisgIGlmIChiUmV0KSB7DQorICAgIGZTd2VlcEFuZ2xlID0gbXMuR2V0VmFsdWUoKTsNCisgIH0NCisgIHJldHVybiBiUmV0Ow0KK30NCitDWEZBX0ZpbGwgQ1hGQV9Cb3g6OkdldEZpbGwoRlhfQk9PTCBiTW9kaWZpZWQpIGNvbnN0IHsNCisgIGlmICghbV9wTm9kZSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENYRkFfTm9kZSogcEZpbGxOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfRmlsbCwgYk1vZGlmaWVkKTsNCisgIHJldHVybiBDWEZBX0ZpbGwocEZpbGxOb2RlKTsNCit9DQorQ1hGQV9NYXJnaW4gQ1hGQV9Cb3g6OkdldE1hcmdpbigpIGNvbnN0IHsNCisgIGlmICghbV9wTm9kZSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBDWEZBX01hcmdpbihtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9NYXJnaW4pKTsNCit9DQorc3RhdGljIEZYX0JPT0wgWEZBX0JPWF9TYW1lU3R5bGVzKGNvbnN0IENYRkFfU3Ryb2tlQXJyYXkmIHN0cm9rZXMpIHsNCisgIGludDMyX3QgaUNvdW50ID0gc3Ryb2tlcy5HZXRTaXplKCk7DQorICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIENYRkFfU3Ryb2tlIHN0cm9rZTEgPSBzdHJva2VzWzBdOw0KKyAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgaUNvdW50OyBpKyspIHsNCisgICAgQ1hGQV9TdHJva2Ugc3Ryb2tlMiA9IHN0cm9rZXNbaV07DQorICAgIGlmICghc3Ryb2tlMi5Jc0V4aXN0SW5YTUwoKSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmICghc3Ryb2tlMS5Jc0V4aXN0SW5YTUwoKSkgew0KKyAgICAgIHN0cm9rZTEgPSBzdHJva2UyOw0KKyAgICB9IGVsc2UgaWYgKCFzdHJva2UxLlNhbWVTdHlsZXMoc3Ryb2tlMikpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENYRkFfQm94OjpTYW1lU3R5bGVzKCkgY29uc3Qgew0KKyAgaWYgKElzQXJjKCkpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBDWEZBX1N0cm9rZUFycmF5IHN0cm9rZXM7DQorICBYRkFfQk9YX0dldFN0cm9rZXMobV9wTm9kZSwgc3Ryb2tlcywgVFJVRSk7DQorICByZXR1cm4gWEZBX0JPWF9TYW1lU3R5bGVzKHN0cm9rZXMpOw0KK30NCitzdGF0aWMgaW50MzJfdCBYRkFfQk9YXzNEU3R5bGUoY29uc3QgQ1hGQV9TdHJva2VBcnJheSYgc3Ryb2tlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9TdHJva2UmIHN0cm9rZSkgew0KKyAgaW50MzJfdCBpQ291bnQgPSBzdHJva2VzLkdldFNpemUoKTsNCisgIGlmIChpQ291bnQgPCAxKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgc3Ryb2tlID0gc3Ryb2tlc1swXTsNCisgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IGlDb3VudDsgaSsrKSB7DQorICAgIENYRkFfU3Ryb2tlIGZpbmQgPSBzdHJva2VzW2ldOw0KKyAgICBpZiAoIWZpbmQuSXNFeGlzdEluWE1MKCkpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAoIXN0cm9rZS5Jc0V4aXN0SW5YTUwoKSkgew0KKyAgICAgIHN0cm9rZSA9IGZpbmQ7DQorICAgIH0gZWxzZSBpZiAoc3Ryb2tlLkdldFN0cm9rZVR5cGUoKSAhPSBmaW5kLkdldFN0cm9rZVR5cGUoKSkgew0KKyAgICAgIHN0cm9rZSA9IGZpbmQ7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGludDMyX3QgaVR5cGUgPSBzdHJva2UuR2V0U3Ryb2tlVHlwZSgpOw0KKyAgaWYgKGlUeXBlID09IFhGQV9BVFRSSUJVVEVFTlVNX0xvd2VyZWQgfHwgaVR5cGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmFpc2VkIHx8DQorICAgICAgaVR5cGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fRXRjaGVkIHx8DQorICAgICAgaVR5cGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fRW1ib3NzZWQpIHsNCisgICAgcmV0dXJuIGlUeXBlOw0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KK2ludDMyX3QgQ1hGQV9Cb3g6OkdldDNEU3R5bGUoRlhfQk9PTCYgYlZpc2libGUsIEZYX0ZMT0FUJiBmVGhpY2tuZXNzKSBjb25zdCB7DQorICBpZiAoSXNBcmMoKSkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIENYRkFfU3Ryb2tlQXJyYXkgc3Ryb2tlczsNCisgIFhGQV9CT1hfR2V0U3Ryb2tlcyhtX3BOb2RlLCBzdHJva2VzLCBUUlVFKTsNCisgIENYRkFfU3Ryb2tlIHN0cm9rZShOVUxMKTsNCisgIGludDMyX3QgaVR5cGUgPSBYRkFfQk9YXzNEU3R5bGUoc3Ryb2tlcywgc3Ryb2tlKTsNCisgIGlmIChpVHlwZSkgew0KKyAgICBiVmlzaWJsZSA9IHN0cm9rZS5Jc1Zpc2libGUoKTsNCisgICAgZlRoaWNrbmVzcyA9IHN0cm9rZS5HZXRUaGlja25lc3MoKTsNCisgIH0NCisgIHJldHVybiBpVHlwZTsNCit9DQoraW50MzJfdCBDWEZBX1N0cm9rZTo6R2V0UHJlc2VuY2UoKSBjb25zdCB7DQorICByZXR1cm4gbV9wTm9kZSA/IG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9QcmVzZW5jZSkNCisgICAgICAgICAgICAgICAgIDogWEZBX0FUVFJJQlVURUVOVU1fSW52aXNpYmxlOw0KK30NCitpbnQzMl90IENYRkFfU3Ryb2tlOjpHZXRDYXBUeXBlKCkgY29uc3Qgew0KKyAgaWYgKCFtX3BOb2RlKSB7DQorICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9TcXVhcmU7DQorICB9DQorICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0NhcCk7DQorfQ0KK2ludDMyX3QgQ1hGQV9TdHJva2U6OkdldFN0cm9rZVR5cGUoKSBjb25zdCB7DQorICByZXR1cm4gbV9wTm9kZSA/IG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9TdHJva2UpDQorICAgICAgICAgICAgICAgICA6IFhGQV9BVFRSSUJVVEVFTlVNX1NvbGlkOw0KK30NCitGWF9GTE9BVCBDWEZBX1N0cm9rZTo6R2V0VGhpY2tuZXNzKCkgY29uc3Qgew0KKyAgcmV0dXJuIEdldE1TVGhpY2tuZXNzKCkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCit9DQorQ1hGQV9NZWFzdXJlbWVudCBDWEZBX1N0cm9rZTo6R2V0TVNUaGlja25lc3MoKSBjb25zdCB7DQorICByZXR1cm4gbV9wTm9kZSA/IG1fcE5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9UaGlja25lc3MpDQorICAgICAgICAgICAgICAgICA6IFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfTWVhc3VyZShYRkFfRUxFTUVOVF9FZGdlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURV9UaGlja25lc3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0Zvcm0pOw0KK30NCit2b2lkIENYRkFfU3Ryb2tlOjpTZXRUaGlja25lc3MoRlhfRkxPQVQgZlRoaWNrbmVzcykgew0KKyAgaWYgKCFtX3BOb2RlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfTWVhc3VyZW1lbnQgdGhpY2tuZXNzKGZUaGlja25lc3MsIFhGQV9VTklUX1B0KTsNCisgIG1fcE5vZGUtPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9UaGlja25lc3MsIHRoaWNrbmVzcyk7DQorfQ0KK3ZvaWQgQ1hGQV9TdHJva2U6OlNldE1TVGhpY2tuZXNzKENYRkFfTWVhc3VyZW1lbnQgbXNUaGlua25lc3MpIHsNCisgIGlmICghbV9wTm9kZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBtX3BOb2RlLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVGhpY2tuZXNzLCBtc1RoaW5rbmVzcyk7DQorfQ0KK0ZYX0FSR0IgQ1hGQV9TdHJva2U6OkdldENvbG9yKCkgY29uc3Qgew0KKyAgaWYgKCFtX3BOb2RlKSB7DQorICAgIHJldHVybiAweEZGMDAwMDAwOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0NvbG9yKTsNCisgIGlmICghcE5vZGUpIHsNCisgICAgcmV0dXJuIDB4RkYwMDAwMDA7DQorICB9DQorICBDRlhfV2lkZVN0cmluZ0Mgd3NDb2xvcjsNCisgIHBOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbG9yKTsNCisgIHJldHVybiBYRkFfV1N0cmluZ1RvQ29sb3Iod3NDb2xvcik7DQorfQ0KK3ZvaWQgQ1hGQV9TdHJva2U6OlNldENvbG9yKEZYX0FSR0IgYXJnYikgew0KKyAgaWYgKCFtX3BOb2RlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9Db2xvcik7DQorICBDRlhfV2lkZVN0cmluZyB3c0NvbG9yOw0KKyAgaW50IGEsIHIsIGcsIGI7DQorICBBcmdiRGVjb2RlKGFyZ2IsIGEsIHIsIGcsIGIpOw0KKyAgd3NDb2xvci5Gb3JtYXQoTCIlZCwlZCwlZCIsIHIsIGcsIGIpOw0KKyAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29sb3IpOw0KK30NCitpbnQzMl90IENYRkFfU3Ryb2tlOjpHZXRKb2luVHlwZSgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BOb2RlID8gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0pvaW4pDQorICAgICAgICAgICAgICAgICA6IFhGQV9BVFRSSUJVVEVFTlVNX1NxdWFyZTsNCit9DQorRlhfQk9PTCBDWEZBX1N0cm9rZTo6SXNJbnZlcnRlZCgpIGNvbnN0IHsNCisgIHJldHVybiBtX3BOb2RlID8gbV9wTm9kZS0+R2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX0ludmVydGVkKSA6IEZBTFNFOw0KK30NCitGWF9GTE9BVCBDWEZBX1N0cm9rZTo6R2V0UmFkaXVzKCkgY29uc3Qgew0KKyAgcmV0dXJuIG1fcE5vZGUgPyBtX3BOb2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUmFkaXVzKS5Ub1VuaXQoWEZBX1VOSVRfUHQpDQorICAgICAgICAgICAgICAgICA6IDA7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9TdHJva2U6OlNhbWVTdHlsZXMoQ1hGQV9TdHJva2Ugc3Ryb2tlLCBGWF9EV09SRCBkd0ZsYWdzKSBjb25zdCB7DQorICBpZiAobV9wTm9kZSA9PSAoQ1hGQV9Ob2RlKilzdHJva2UpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBpZiAoRlhTWVNfZmFicyhHZXRUaGlja25lc3MoKSAtIHN0cm9rZS5HZXRUaGlja25lc3MoKSkgPj0gMC4wMWYpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKChkd0ZsYWdzICYgWEZBX1NUUk9LRV9TQU1FU1RZTEVfTm9QcmVzZW5jZSkgPT0gMCAmJg0KKyAgICAgIElzVmlzaWJsZSgpICE9IHN0cm9rZS5Jc1Zpc2libGUoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoR2V0U3Ryb2tlVHlwZSgpICE9IHN0cm9rZS5HZXRTdHJva2VUeXBlKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKEdldENvbG9yKCkgIT0gc3Ryb2tlLkdldENvbG9yKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKChkd0ZsYWdzICYgWEZBX1NUUk9LRV9TQU1FU1RZTEVfQ29ybmVyKSAhPSAwICYmDQorICAgICAgRlhTWVNfZmFicyhHZXRSYWRpdXMoKSAtIHN0cm9rZS5HZXRSYWRpdXMoKSkgPj0gMC4wMWYpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0ZMT0FUIFhGQV9HZXRFZGdlVGhpY2tuZXNzKGNvbnN0IENYRkFfU3Ryb2tlQXJyYXkmIHN0cm9rZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiM0RTdHlsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCkgew0KKyAgRlhfRkxPQVQgZlRoaWNrbmVzcyA9IDA7DQorICB7DQorICAgIGlmIChzdHJva2VzW25JbmRleCAqIDIgKyAxXS5HZXRQcmVzZW5jZSgpID09IFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUpIHsNCisgICAgICBpZiAobkluZGV4ID09IDApIHsNCisgICAgICAgIGZUaGlja25lc3MgKz0gMi41ZjsNCisgICAgICB9DQorICAgICAgZlRoaWNrbmVzcyArPSBzdHJva2VzW25JbmRleCAqIDIgKyAxXS5HZXRUaGlja25lc3MoKSAqIChiM0RTdHlsZSA/IDQgOiAyKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGZUaGlja25lc3M7DQorfQ0KK0NYRkFfV2lkZ2V0RGF0YTo6Q1hGQV9XaWRnZXREYXRhKENYRkFfTm9kZSogcE5vZGUpDQorICAgIDogQ1hGQV9EYXRhKHBOb2RlKSwNCisgICAgICBtX2JJc051bGwoVFJVRSksDQorICAgICAgbV9iUHJlTnVsbChUUlVFKSwNCisgICAgICBtX3BVaUNoaWxkTm9kZShOVUxMKSwNCisgICAgICBtX2VVSVR5cGUoWEZBX0VMRU1FTlRfVU5LTk9XTikge30NCitDWEZBX05vZGUqIENYRkFfV2lkZ2V0RGF0YTo6R2V0VUlDaGlsZCgpIHsNCisgIGlmIChtX2VVSVR5cGUgPT0gWEZBX0VMRU1FTlRfVU5LTk9XTikgew0KKyAgICBtX3BVaUNoaWxkTm9kZSA9IFhGQV9DcmVhdGVVSUNoaWxkKG1fcE5vZGUsIG1fZVVJVHlwZSk7DQorICB9DQorICByZXR1cm4gbV9wVWlDaGlsZE5vZGU7DQorfQ0KK1hGQV9FTEVNRU5UIENYRkFfV2lkZ2V0RGF0YTo6R2V0VUlUeXBlKCkgew0KKyAgR2V0VUlDaGlsZCgpOw0KKyAgcmV0dXJuIG1fZVVJVHlwZTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9XaWRnZXREYXRhOjpHZXRSYXdWYWx1ZSgpIHsNCisgIHJldHVybiBtX3BOb2RlLT5HZXRDb250ZW50KCk7DQorfQ0KK2ludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRBY2Nlc3MoRlhfQk9PTCBiVGVtcGxhdGUpIHsNCisgIGlmIChiVGVtcGxhdGUpIHsNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFRlbXBsYXRlTm9kZSgpOw0KKyAgICBpZiAocE5vZGUpIHsNCisgICAgICByZXR1cm4gcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9BY2Nlc3MpOw0KKyAgICB9DQorICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9PcGVuOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGU7DQorICB3aGlsZSAocE5vZGUpIHsNCisgICAgaW50MzJfdCBpQWNjID0gcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9BY2Nlc3MpOw0KKyAgICBpZiAoaUFjYyAhPSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuKSB7DQorICAgICAgcmV0dXJuIGlBY2M7DQorICAgIH0NCisgICAgcE5vZGUgPQ0KKyAgICAgICAgcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQsIFhGQV9PQkpFQ1RUWVBFX0NvbnRhaW5lck5vZGUpOw0KKyAgfQ0KKyAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX09wZW47DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRBY2Nlc3NLZXkoQ0ZYX1dpZGVTdHJpbmdDJiB3c0FjY2Vzc0tleSkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfQWNjZXNzS2V5LCB3c0FjY2Vzc0tleSk7DQorfQ0KK2ludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRBbmNob3JUeXBlKCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9BbmNob3JUeXBlKTsNCit9DQoraW50MzJfdCBDWEZBX1dpZGdldERhdGE6OkdldENvbFNwYW4oKSB7DQorICByZXR1cm4gbV9wTm9kZS0+R2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX0NvbFNwYW4pOw0KK30NCitpbnQzMl90IENYRkFfV2lkZ2V0RGF0YTo6R2V0UHJlc2VuY2UoKSB7DQorICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlKTsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlOw0KKyAgd2hpbGUgKHBOb2RlICYmIHBOb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfQ29udGFpbmVyTm9kZSkgew0KKyAgICBpbnQzMl90IGlBY2MgPSBwTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlKTsNCisgICAgaWYgKGlBY2MgIT0gWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZSkgew0KKyAgICAgIHJldHVybiBpQWNjOw0KKyAgICB9DQorICAgIHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgfQ0KKyAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGU7DQorfQ0KK2ludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRSb3RhdGUoKSB7DQorICBDWEZBX01lYXN1cmVtZW50IG1zOw0KKyAgaWYgKCFtX3BOb2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUm90YXRlLCBtcywgRkFMU0UpKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaW50MzJfdCBpUm90YXRlID0gRlhTWVNfcm91bmQobXMuR2V0VmFsdWUoKSk7DQorICBpUm90YXRlID0gWEZBX01hcFJvdGF0aW9uKGlSb3RhdGUpOw0KKyAgcmV0dXJuIGlSb3RhdGUgLyA5MCAqIDkwOw0KK30NCitDWEZBX0JvcmRlciBDWEZBX1dpZGdldERhdGE6OkdldEJvcmRlcihGWF9CT09MIGJNb2RpZmllZCkgew0KKyAgcmV0dXJuIENYRkFfQm9yZGVyKG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0JvcmRlciwgYk1vZGlmaWVkKSk7DQorfQ0KK0NYRkFfQ2FwdGlvbiBDWEZBX1dpZGdldERhdGE6OkdldENhcHRpb24oRlhfQk9PTCBiTW9kaWZpZWQpIHsNCisgIHJldHVybiBDWEZBX0NhcHRpb24obV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfQ2FwdGlvbiwgYk1vZGlmaWVkKSk7DQorfQ0KK0NYRkFfRm9udCBDWEZBX1dpZGdldERhdGE6OkdldEZvbnQoRlhfQk9PTCBiTW9kaWZpZWQpIHsNCisgIHJldHVybiBDWEZBX0ZvbnQobV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfRm9udCwgYk1vZGlmaWVkKSk7DQorfQ0KK0NYRkFfTWFyZ2luIENYRkFfV2lkZ2V0RGF0YTo6R2V0TWFyZ2luKEZYX0JPT0wgYk1vZGlmaWVkKSB7DQorICByZXR1cm4gQ1hGQV9NYXJnaW4obV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfTWFyZ2luLCBiTW9kaWZpZWQpKTsNCit9DQorQ1hGQV9QYXJhIENYRkFfV2lkZ2V0RGF0YTo6R2V0UGFyYShGWF9CT09MIGJNb2RpZmllZCkgew0KKyAgcmV0dXJuIENYRkFfUGFyYShtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9QYXJhLCBiTW9kaWZpZWQpKTsNCit9DQorQ1hGQV9LZWVwIENYRkFfV2lkZ2V0RGF0YTo6R2V0S2VlcChGWF9CT09MIGJNb2RpZmllZCkgew0KKyAgcmV0dXJuIENYRkFfS2VlcChtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9LZWVwLCBiTW9kaWZpZWQpLA0KKyAgICAgICAgICAgICAgICAgICBtX3BOb2RlKTsNCit9DQordm9pZCBDWEZBX1dpZGdldERhdGE6OkdldEV2ZW50TGlzdChDWEZBX05vZGVBcnJheSYgZXZlbnRzKSB7DQorICBtX3BOb2RlLT5HZXROb2RlTGlzdChldmVudHMsIDAsIFhGQV9FTEVNRU5UX0V2ZW50KTsNCit9DQoraW50MzJfdCBDWEZBX1dpZGdldERhdGE6OkdldEV2ZW50QnlBY3Rpdml0eShpbnQzMl90IGlBY3Rpdml0eSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZUFycmF5JiBldmVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJc0Zvcm1SZWFkeSkgew0KKyAgQ1hGQV9Ob2RlQXJyYXkgYWxsRXZlbnRzOw0KKyAgR2V0RXZlbnRMaXN0KGFsbEV2ZW50cyk7DQorICBpbnQzMl90IGlDb3VudCA9IGFsbEV2ZW50cy5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBDWEZBX0V2ZW50IGV2ZW50KGFsbEV2ZW50c1tpXSk7DQorICAgIGlmIChldmVudC5HZXRBY3Rpdml0eSgpID09IGlBY3Rpdml0eSkgew0KKyAgICAgIGlmIChpQWN0aXZpdHkgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmVhZHkpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c1JlZjsNCisgICAgICAgIGV2ZW50LkdldFJlZih3c1JlZik7DQorICAgICAgICBpZiAoYklzRm9ybVJlYWR5KSB7DQorICAgICAgICAgIGlmICh3c1JlZiA9PSBDRlhfV2lkZVN0cmluZ0MoTCIkZm9ybSIpKSB7DQorICAgICAgICAgICAgZXZlbnRzLkFkZChhbGxFdmVudHNbaV0pOw0KKyAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICBpZiAod3NSZWYgPT0gQ0ZYX1dpZGVTdHJpbmdDKEwiJGxheW91dCIpKSB7DQorICAgICAgICAgICAgZXZlbnRzLkFkZChhbGxFdmVudHNbaV0pOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGV2ZW50cy5BZGQoYWxsRXZlbnRzW2ldKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBldmVudHMuR2V0U2l6ZSgpOw0KK30NCitDWEZBX1ZhbHVlIENYRkFfV2lkZ2V0RGF0YTo6R2V0RGVmYXVsdFZhbHVlKEZYX0JPT0wgYk1vZGlmaWVkKSB7DQorICBDWEZBX05vZGUqIHBUZW1Ob2RlID0gbV9wTm9kZS0+R2V0VGVtcGxhdGVOb2RlKCk7DQorICByZXR1cm4gcFRlbU5vZGUgPyBwVGVtTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfVmFsdWUsIGJNb2RpZmllZCkNCisgICAgICAgICAgICAgICAgICA6IE5VTEw7DQorfQ0KK0NYRkFfVmFsdWUgQ1hGQV9XaWRnZXREYXRhOjpHZXRGb3JtVmFsdWUoRlhfQk9PTCBiTW9kaWZpZWQpIHsNCisgIHJldHVybiBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9WYWx1ZSwgYk1vZGlmaWVkKTsNCit9DQorQ1hGQV9DYWxjdWxhdGUgQ1hGQV9XaWRnZXREYXRhOjpHZXRDYWxjdWxhdGUoRlhfQk9PTCBiTW9kaWZpZWQpIHsNCisgIHJldHVybiBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9DYWxjdWxhdGUsIGJNb2RpZmllZCk7DQorfQ0KK0NYRkFfVmFsaWRhdGUgQ1hGQV9XaWRnZXREYXRhOjpHZXRWYWxpZGF0ZShGWF9CT09MIGJNb2RpZmllZCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1ZhbGlkYXRlLCBiTW9kaWZpZWQpOw0KK30NCitDWEZBX1ZhcmlhYmxlcyBDWEZBX1dpZGdldERhdGE6OkdldFZhcmlhYmxlcyhGWF9CT09MIGJNb2RpZmllZCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1ZhcmlhYmxlcywgYk1vZGlmaWVkKTsNCit9DQorQ1hGQV9CaW5kIENYRkFfV2lkZ2V0RGF0YTo6R2V0QmluZChGWF9CT09MIGJNb2RpZmllZCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0JpbmQsIGJNb2RpZmllZCk7DQorfQ0KK0NYRkFfQXNzaXN0IENYRkFfV2lkZ2V0RGF0YTo6R2V0QXNzaXN0KEZYX0JPT0wgYk1vZGlmaWVkKSB7DQorICByZXR1cm4gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfQXNzaXN0LCBiTW9kaWZpZWQpOw0KK30NCit2b2lkIENYRkFfV2lkZ2V0RGF0YTo6R2V0UmVsZXZhbnQoQ0ZYX1dpZGVTdHJpbmdDJiB3c1JlbGV2YW50KSB7DQorICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1JlbGV2YW50LCB3c1JlbGV2YW50KTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldFdpZHRoKEZYX0ZMT0FUJiBmV2lkdGgpIHsNCisgIHJldHVybiBUcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVywgZldpZHRoKTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEhlaWdodChGWF9GTE9BVCYgZkhlaWdodCkgew0KKyAgcmV0dXJuIFRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9ILCBmSGVpZ2h0KTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldE1pbldpZHRoKEZYX0ZMT0FUJiBmTWluV2lkdGgpIHsNCisgIHJldHVybiBUcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTWluVywgZk1pbldpZHRoKTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldE1pbkhlaWdodChGWF9GTE9BVCYgZk1pbkhlaWdodCkgew0KKyAgcmV0dXJuIFRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9NaW5ILCBmTWluSGVpZ2h0KTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldE1heFdpZHRoKEZYX0ZMT0FUJiBmTWF4V2lkdGgpIHsNCisgIHJldHVybiBUcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTWF4VywgZk1heFdpZHRoKTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldE1heEhlaWdodChGWF9GTE9BVCYgZk1heEhlaWdodCkgew0KKyAgcmV0dXJuIFRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9NYXhILCBmTWF4SGVpZ2h0KTsNCit9DQorQ1hGQV9CaW5kSXRlbXMgQ1hGQV9XaWRnZXREYXRhOjpHZXRCaW5kSXRlbXMoKSB7DQorICByZXR1cm4gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfQmluZEl0ZW1zKTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldEFjY2VzcyhpbnQzMl90IGlBY2Nlc3MsIEZYX0JPT0wgYk5vdGlmeSkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9BY2Nlc3MsIChYRkFfQVRUUklCVVRFRU5VTSlpQWNjZXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgYk5vdGlmeSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXRBY2Nlc3NLZXkoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQWNjZXNzS2V5KSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9BY2Nlc3NLZXksIHdzQWNjZXNzS2V5KTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldEFuY2hvclR5cGUoaW50MzJfdCBpVHlwZSkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9BbmNob3JUeXBlLCAoWEZBX0FUVFJJQlVURUVOVU0paVR5cGUpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0Q29sU3BhbihpbnQzMl90IGlDb2xTcGFuKSB7DQorICByZXR1cm4gbV9wTm9kZS0+U2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX0NvbFNwYW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWEZBX0FUVFJJQlVURUVOVU0paUNvbFNwYW4pOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0UHJlc2VuY2UoaW50MzJfdCBpUHJlc2VuY2UpIHsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIChYRkFfQVRUUklCVVRFRU5VTSlpUHJlc2VuY2UpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0Um90YXRlKGludDMyX3QgaVJvdGF0ZSkgew0KKyAgaVJvdGF0ZSA9IFhGQV9NYXBSb3RhdGlvbihpUm90YXRlKTsNCisgIENYRkFfTWVhc3VyZW1lbnQgbXMoKEZYX0ZMT0FUKWlSb3RhdGUsIFhGQV9VTklUX0FuZ2xlKTsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUm90YXRlLCBtcyk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXRSZWxldmFudChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NSZWxldmFudCkgew0KKyAgcmV0dXJuIG1fcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsIHdzUmVsZXZhbnQpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0U3RhdHVzKEZYX0RXT1JEIGR3U3RhdHVzKSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXRXaWR0aChGWF9GTE9BVCBmV2lkdGgpIHsNCisgIHJldHVybiBTZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVywgZldpZHRoKTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldEhlaWdodChGWF9GTE9BVCBmSGVpZ2h0KSB7DQorICByZXR1cm4gU2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0gsIGZIZWlnaHQpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0TWluV2lkdGgoRlhfRkxPQVQgZk1pbldpZHRoKSB7DQorICByZXR1cm4gU2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX01pblcsIGZNaW5XaWR0aCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXRNaW5IZWlnaHQoRlhfRkxPQVQgZk1pbkhlaWdodCkgew0KKyAgcmV0dXJuIFNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9NaW5ILCBmTWluSGVpZ2h0KTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldE1heFdpZHRoKEZYX0ZMT0FUIGZNYXhXaWR0aCkgew0KKyAgcmV0dXJuIFNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9NYXhXLCBmTWF4V2lkdGgpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0TWF4SGVpZ2h0KEZYX0ZMT0FUIGZNYXhIZWlnaHQpIHsNCisgIHJldHVybiBTZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTWF4SCwgZk1heEhlaWdodCk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXRQb3MoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkgew0KKyAgcmV0dXJuIFNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9YLCB4KSAmJiBTZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfWSwgeSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXROYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c05hbWUpIHsNCisgIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXRCdXR0b25IaWdobGlnaHQoaW50MzJfdCBpQnV0dG9uSGlnaGxpZ2h0KSB7DQorICBDWEZBX05vZGUqIHBVaUNoaWxkTm9kZSA9IEdldFVJQ2hpbGQoKTsNCisgIHJldHVybiBwVWlDaGlsZE5vZGUtPlNldEVudW0oWEZBX0FUVFJJQlVURV9IaWdobGlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChYRkFfQVRUUklCVVRFRU5VTSlpQnV0dG9uSGlnaGxpZ2h0KTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OlNldEJ1dHRvblJvbGxvdmVyKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1JvbGxvdmVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJSaWNoVGV4dCkgew0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0QnV0dG9uRG93bihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEb3duLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlJpY2hUZXh0KSB7DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpTZXRDaGVja0J1dHRvblNoYXBlKGludDMyX3QgaUNoZWNrQnV0dG9uU2hhcGUpIHsNCisgIENYRkFfTm9kZSogcFVpQ2hpbGROb2RlID0gR2V0VUlDaGlsZCgpOw0KKyAgcmV0dXJuIHBVaUNoaWxkTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1NoYXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWEZBX0FUVFJJQlVURUVOVU0paUNoZWNrQnV0dG9uU2hhcGUpOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0Q2hlY2tCdXR0b25NYXJrKGludDMyX3QgaUNoZWNrQnV0dG9uTWFyaykgew0KKyAgQ1hGQV9Ob2RlKiBwVWlDaGlsZE5vZGUgPSBHZXRVSUNoaWxkKCk7DQorICByZXR1cm4gcFVpQ2hpbGROb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfTWFyaywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFhGQV9BVFRSSUJVVEVFTlVNKWlDaGVja0J1dHRvbk1hcmspOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0Q2hlY2tCdXR0b25TaXplKEZYX0ZMT0FUIGZDaGVja0J1dHRvbk1hcmspIHsNCisgIENYRkFfTm9kZSogcFVpQ2hpbGROb2RlID0gR2V0VUlDaGlsZCgpOw0KKyAgaWYgKHBVaUNoaWxkTm9kZSkgew0KKyAgICBDWEZBX01lYXN1cmVtZW50IG1zKGZDaGVja0J1dHRvbk1hcmssIFhGQV9VTklUX1B0KTsNCisgICAgcmV0dXJuIHBVaUNoaWxkTm9kZS0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1NpemUsIG1zKTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorQ1hGQV9Cb3JkZXIgQ1hGQV9XaWRnZXREYXRhOjpHZXRVSUJvcmRlcihGWF9CT09MIGJNb2RpZmllZCkgew0KKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgIHJldHVybiBwVUlDaGlsZCA/IHBVSUNoaWxkLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9Cb3JkZXIsIGJNb2RpZmllZCkNCisgICAgICAgICAgICAgICAgICA6IE5VTEw7DQorfQ0KK0NYRkFfTWFyZ2luIENYRkFfV2lkZ2V0RGF0YTo6R2V0VUlNYXJnaW4oRlhfQk9PTCBiTW9kaWZpZWQpIHsNCisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICByZXR1cm4gcFVJQ2hpbGQgPyBwVUlDaGlsZC0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfTWFyZ2luLCBiTW9kaWZpZWQpDQorICAgICAgICAgICAgICAgICAgOiBOVUxMOw0KK30NCit2b2lkIENYRkFfV2lkZ2V0RGF0YTo6R2V0VUlNYXJnaW4oQ0ZYX1JlY3RGJiBydFVJTWFyZ2luKSB7DQorICBydFVJTWFyZ2luLlJlc2V0KCk7DQorICBDWEZBX01hcmdpbiBtZ1VJID0gR2V0VUlNYXJnaW4oKTsNCisgIGlmICghbWdVSSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX0JvcmRlciBib3JkZXIgPSBHZXRVSUJvcmRlcigpOw0KKyAgaWYgKGJvcmRlciAmJiBib3JkZXIuR2V0UHJlc2VuY2UoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQsIGZUb3BJbnNldCwgZlJpZ2h0SW5zZXQsIGZCb3R0b21JbnNldDsNCisgIEZYX0JPT0wgYkxlZnQgPSBtZ1VJLkdldExlZnRJbnNldChmTGVmdEluc2V0KTsNCisgIEZYX0JPT0wgYlRvcCA9IG1nVUkuR2V0VG9wSW5zZXQoZlRvcEluc2V0KTsNCisgIEZYX0JPT0wgYlJpZ2h0ID0gbWdVSS5HZXRSaWdodEluc2V0KGZSaWdodEluc2V0KTsNCisgIEZYX0JPT0wgYkJvdHRvbSA9IG1nVUkuR2V0Qm90dG9tSW5zZXQoZkJvdHRvbUluc2V0KTsNCisgIGlmIChib3JkZXIpIHsNCisgICAgRlhfQk9PTCBiVmlzaWJsZSA9IEZBTFNFOw0KKyAgICBGWF9GTE9BVCBmVGhpY2tuZXNzID0gMDsNCisgICAgYm9yZGVyLkdldDNEU3R5bGUoYlZpc2libGUsIGZUaGlja25lc3MpOw0KKyAgICBpZiAoIWJMZWZ0IHx8ICFiVG9wIHx8ICFiUmlnaHQgfHwgIWJCb3R0b20pIHsNCisgICAgICBDWEZBX1N0cm9rZUFycmF5IHN0cm9rZXM7DQorICAgICAgYm9yZGVyLkdldFN0cm9rZXMoc3Ryb2tlcyk7DQorICAgICAgaWYgKCFiVG9wKSB7DQorICAgICAgICBmVG9wSW5zZXQgPSBYRkFfR2V0RWRnZVRoaWNrbmVzcyhzdHJva2VzLCBiVmlzaWJsZSwgMCk7DQorICAgICAgfQ0KKyAgICAgIGlmICghYlJpZ2h0KSB7DQorICAgICAgICBmUmlnaHRJbnNldCA9IFhGQV9HZXRFZGdlVGhpY2tuZXNzKHN0cm9rZXMsIGJWaXNpYmxlLCAxKTsNCisgICAgICB9DQorICAgICAgaWYgKCFiQm90dG9tKSB7DQorICAgICAgICBmQm90dG9tSW5zZXQgPSBYRkFfR2V0RWRnZVRoaWNrbmVzcyhzdHJva2VzLCBiVmlzaWJsZSwgMik7DQorICAgICAgfQ0KKyAgICAgIGlmICghYkxlZnQpIHsNCisgICAgICAgIGZMZWZ0SW5zZXQgPSBYRkFfR2V0RWRnZVRoaWNrbmVzcyhzdHJva2VzLCBiVmlzaWJsZSwgMyk7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBydFVJTWFyZ2luLlNldChmTGVmdEluc2V0LCBmVG9wSW5zZXQsIGZSaWdodEluc2V0LCBmQm90dG9tSW5zZXQpOw0KK30NCitpbnQzMl90IENYRkFfV2lkZ2V0RGF0YTo6R2V0QnV0dG9uSGlnaGxpZ2h0KCkgew0KKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgIGlmIChwVUlDaGlsZCkgew0KKyAgICByZXR1cm4gcFVJQ2hpbGQtPkdldEVudW0oWEZBX0FUVFJJQlVURV9IaWdobGlnaHQpOw0KKyAgfQ0KKyAgcmV0dXJuIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfRW51bSgNCisgICAgICBYRkFfRUxFTUVOVF9CdXR0b24sIFhGQV9BVFRSSUJVVEVfSGlnaGxpZ2h0LCBYRkFfWERQUEFDS0VUX0Zvcm0pOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0QnV0dG9uUm9sbG92ZXIoQ0ZYX1dpZGVTdHJpbmcmIHdzUm9sbG92ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSaWNoVGV4dCkgew0KKyAgaWYgKENYRkFfTm9kZSogcEl0ZW1zID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfSXRlbXMpKSB7DQorICAgIENYRkFfTm9kZSogcFRleHQgPSBwSXRlbXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgd2hpbGUgKHBUZXh0KSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzTmFtZTsNCisgICAgICBwVGV4dC0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUpOw0KKyAgICAgIGlmICh3c05hbWUgPT0gRlhfV1NUUkMoTCJyb2xsb3ZlciIpKSB7DQorICAgICAgICBwVGV4dC0+VHJ5Q29udGVudCh3c1JvbGxvdmVyKTsNCisgICAgICAgIGJSaWNoVGV4dCA9IHBUZXh0LT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhEYXRhOw0KKyAgICAgICAgcmV0dXJuICF3c1JvbGxvdmVyLklzRW1wdHkoKTsNCisgICAgICB9DQorICAgICAgcFRleHQgPSBwVGV4dC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0QnV0dG9uRG93bihDRlhfV2lkZVN0cmluZyYgd3NEb3duLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJSaWNoVGV4dCkgew0KKyAgaWYgKENYRkFfTm9kZSogcEl0ZW1zID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfSXRlbXMpKSB7DQorICAgIENYRkFfTm9kZSogcFRleHQgPSBwSXRlbXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgd2hpbGUgKHBUZXh0KSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzTmFtZTsNCisgICAgICBwVGV4dC0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUpOw0KKyAgICAgIGlmICh3c05hbWUgPT0gRlhfV1NUUkMoTCJkb3duIikpIHsNCisgICAgICAgIHBUZXh0LT5UcnlDb250ZW50KHdzRG93bik7DQorICAgICAgICBiUmljaFRleHQgPSBwVGV4dC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4RGF0YTsNCisgICAgICAgIHJldHVybiAhd3NEb3duLklzRW1wdHkoKTsNCisgICAgICB9DQorICAgICAgcFRleHQgPSBwVGV4dC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitpbnQzMl90IENYRkFfV2lkZ2V0RGF0YTo6R2V0Q2hlY2tCdXR0b25TaGFwZSgpIHsNCisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICBpZiAocFVJQ2hpbGQpIHsNCisgICAgcmV0dXJuIHBVSUNoaWxkLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfU2hhcGUpOw0KKyAgfQ0KKyAgcmV0dXJuIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfRW51bSgNCisgICAgICBYRkFfRUxFTUVOVF9DaGVja0J1dHRvbiwgWEZBX0FUVFJJQlVURV9TaGFwZSwgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsNCit9DQoraW50MzJfdCBDWEZBX1dpZGdldERhdGE6OkdldENoZWNrQnV0dG9uTWFyaygpIHsNCisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICBpZiAocFVJQ2hpbGQpIHsNCisgICAgcmV0dXJuIHBVSUNoaWxkLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTWFyayk7DQorICB9DQorICByZXR1cm4gWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9FbnVtKA0KKyAgICAgIFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uLCBYRkFfQVRUUklCVVRFX01hcmssIFhGQV9YRFBQQUNLRVRfRm9ybSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpJc1JhZGlvQnV0dG9uKCkgew0KKyAgaWYgKENYRkFfTm9kZSogcFBhcmVudCA9IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKSB7DQorICAgIHJldHVybiBwUGFyZW50LT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhjbEdyb3VwOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9GTE9BVCBDWEZBX1dpZGdldERhdGE6OkdldENoZWNrQnV0dG9uU2l6ZSgpIHsNCisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICBpZiAocFVJQ2hpbGQpIHsNCisgICAgcmV0dXJuIHBVSUNoaWxkLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfU2l6ZSkuVG9Vbml0KFhGQV9VTklUX1B0KTsNCisgIH0NCisgIHJldHVybiBYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX01lYXN1cmUoDQorICAgICAgICAgICAgIFhGQV9FTEVNRU5UX0NoZWNrQnV0dG9uLCBYRkFfQVRUUklCVVRFX1NpemUsIFhGQV9YRFBQQUNLRVRfRm9ybSkNCisgICAgICAuVG9Vbml0KFhGQV9VTklUX1B0KTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OklzQWxsb3dOZXV0cmFsKCkgew0KKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgIGlmIChwVUlDaGlsZCkgew0KKyAgICByZXR1cm4gcFVJQ2hpbGQtPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9BbGxvd05ldXRyYWwpOw0KKyAgfQ0KKyAgcmV0dXJuIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfQm9vbGVhbigNCisgICAgICBYRkFfRUxFTUVOVF9DaGVja0J1dHRvbiwgWEZBX0FUVFJJQlVURV9BbGxvd05ldXRyYWwsIFhGQV9YRFBQQUNLRVRfRm9ybSk7DQorfQ0KK1hGQV9DSEVDS1NUQVRFIENYRkFfV2lkZ2V0RGF0YTo6R2V0Q2hlY2tTdGF0ZSgpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUgPSBHZXRSYXdWYWx1ZSgpOw0KKyAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBYRkFfQ0hFQ0tTVEFURV9PZmY7DQorICB9DQorICBpZiAoQ1hGQV9Ob2RlKiBwSXRlbXMgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9JdGVtcykpIHsNCisgICAgQ1hGQV9Ob2RlKiBwVGV4dCA9IHBJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBpbnQzMl90IGkgPSAwOw0KKyAgICB3aGlsZSAocFRleHQpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQorICAgICAgaWYgKHBUZXh0LT5UcnlDb250ZW50KHdzQ29udGVudCkgJiYgKHdzQ29udGVudCA9PSB3c1ZhbHVlKSkgew0KKyAgICAgICAgcmV0dXJuIChYRkFfQ0hFQ0tTVEFURSlpOw0KKyAgICAgIH0NCisgICAgICBpKys7DQorICAgICAgcFRleHQgPSBwVGV4dC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIFhGQV9DSEVDS1NUQVRFX09mZjsNCit9DQordm9pZCBDWEZBX1dpZGdldERhdGE6OlNldENoZWNrU3RhdGUoWEZBX0NIRUNLU1RBVEUgZUNoZWNrU3RhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5KSB7DQorICBpZiAoQ1hGQV9XaWRnZXREYXRhIGV4Y2xHcm91cCA9IEdldEV4Y2xHcm91cE5vZGUoKSkgew0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOw0KKyAgICBpZiAoZUNoZWNrU3RhdGUgIT0gWEZBX0NIRUNLU1RBVEVfT2ZmKSB7DQorICAgICAgaWYgKENYRkFfTm9kZSogcEl0ZW1zID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfSXRlbXMpKSB7DQorICAgICAgICBDWEZBX05vZGUqIHBUZXh0ID0gcEl0ZW1zLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgICAgICBpZiAocFRleHQpIHsNCisgICAgICAgICAgcFRleHQtPlRyeUNvbnRlbnQod3NWYWx1ZSk7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcENoaWxkID0NCisgICAgICAgICgoQ1hGQV9Ob2RlKilleGNsR3JvdXApLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgIGZvciAoOyBwQ2hpbGQ7IHBDaGlsZCA9IHBDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgIGlmIChwQ2hpbGQtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9GaWVsZCkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIENYRkFfTm9kZSogcEl0ZW0gPSBwQ2hpbGQtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0l0ZW1zKTsNCisgICAgICBpZiAoIXBJdGVtKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgQ1hGQV9Ob2RlKiBwSXRlbWNoaWxkID0gcEl0ZW0tPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICBpZiAoIXBJdGVtY2hpbGQpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBDRlhfV2lkZVN0cmluZyB0ZXh0ID0gcEl0ZW1jaGlsZC0+R2V0Q29udGVudCgpOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2hpbGRWYWx1ZSA9IHRleHQ7DQorICAgICAgaWYgKHdzVmFsdWUgIT0gdGV4dCkgew0KKyAgICAgICAgcEl0ZW1jaGlsZCA9IHBJdGVtY2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgICBpZiAocEl0ZW1jaGlsZCkgew0KKyAgICAgICAgICB3c0NoaWxkVmFsdWUgPSBwSXRlbWNoaWxkLT5HZXRDb250ZW50KCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICB3c0NoaWxkVmFsdWUuRW1wdHkoKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgQ1hGQV9XaWRnZXREYXRhIGNoKHBDaGlsZCk7DQorICAgICAgY2guU3luY1ZhbHVlKHdzQ2hpbGRWYWx1ZSwgYk5vdGlmeSk7DQorICAgIH0NCisgICAgZXhjbEdyb3VwLlN5bmNWYWx1ZSh3c1ZhbHVlLCBiTm90aWZ5KTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfTm9kZSogcEl0ZW1zID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfSXRlbXMpOw0KKyAgICBpZiAoIXBJdGVtcykgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpbnQzMl90IGkgPSAtMTsNCisgICAgQ1hGQV9Ob2RlKiBwVGV4dCA9IHBJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQorICAgIHdoaWxlIChwVGV4dCkgew0KKyAgICAgIGkrKzsNCisgICAgICBpZiAoaSA9PSBlQ2hlY2tTdGF0ZSkgew0KKyAgICAgICAgcFRleHQtPlRyeUNvbnRlbnQod3NDb250ZW50KTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBwVGV4dCA9IHBUZXh0LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICB9DQorICAgIFN5bmNWYWx1ZSh3c0NvbnRlbnQsIGJOb3RpZnkpOw0KKyAgfQ0KK30NCitDWEZBX05vZGUqIENYRkFfV2lkZ2V0RGF0YTo6R2V0RXhjbEdyb3VwTm9kZSgpIHsNCisgIENYRkFfTm9kZSogcEV4Y2wgPSAoQ1hGQV9Ob2RlKiltX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgIGlmICghcEV4Y2wgfHwgcEV4Y2wtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9FeGNsR3JvdXApIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICByZXR1cm4gcEV4Y2w7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9XaWRnZXREYXRhOjpHZXRTZWxlY3RlZE1lbWJlcigpIHsNCisgIENYRkFfTm9kZSogcFNlbGVjdGVkTWVtYmVyID0gTlVMTDsNCisgIENGWF9XaWRlU3RyaW5nIHdzU3RhdGUgPSBHZXRSYXdWYWx1ZSgpOw0KKyAgaWYgKHdzU3RhdGUuSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBwU2VsZWN0ZWRNZW1iZXI7DQorICB9DQorICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPQ0KKyAgICAgICAgICAgKENYRkFfTm9kZSopbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICAgICBwTm9kZSAhPSBOVUxMOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIENYRkFfV2lkZ2V0RGF0YSB3aWRnZXREYXRhKHBOb2RlKTsNCisgICAgaWYgKHdpZGdldERhdGEuR2V0Q2hlY2tTdGF0ZSgpID09IFhGQV9DSEVDS1NUQVRFX09uKSB7DQorICAgICAgcFNlbGVjdGVkTWVtYmVyID0gcE5vZGU7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBwU2VsZWN0ZWRNZW1iZXI7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9XaWRnZXREYXRhOjpTZXRTZWxlY3RlZE1lbWJlcihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5KSB7DQorICBDWEZBX05vZGUqIHBTZWxlY3RlZE1lbWJlciA9IE5VTEw7DQorICBGWF9EV09SRCBuYW1lSGFzaCA9DQorICAgICAgRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NOYW1lLkdldFB0cigpLCB3c05hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0NCisgICAgICAgICAgIChDWEZBX05vZGUqKW1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICAgcE5vZGUgIT0gTlVMTDsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBpZiAocE5vZGUtPkdldE5hbWVIYXNoKCkgPT0gbmFtZUhhc2gpIHsNCisgICAgICBDWEZBX1dpZGdldERhdGEgd2lkZ2V0RGF0YShwTm9kZSk7DQorICAgICAgd2lkZ2V0RGF0YS5TZXRDaGVja1N0YXRlKFhGQV9DSEVDS1NUQVRFX09uLCBiTm90aWZ5KTsNCisgICAgICBwU2VsZWN0ZWRNZW1iZXIgPSBwTm9kZTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHBTZWxlY3RlZE1lbWJlcjsNCit9DQordm9pZCBDWEZBX1dpZGdldERhdGE6OlNldFNlbGVjdGVkTWVtYmVyQnlWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJOb3RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTY3JpcHRNb2RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTeW5jRGF0YSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NFeGNsR3JvdXA7DQorICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBOb2RlOw0KKyAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIGlmIChwTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0ZpZWxkKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwSXRlbSA9IHBOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9JdGVtcyk7DQorICAgIGlmICghcEl0ZW0pIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBJdGVtY2hpbGQgPSBwSXRlbS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBpZiAoIXBJdGVtY2hpbGQpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0NoaWxkVmFsdWUgPSBwSXRlbWNoaWxkLT5HZXRDb250ZW50KCk7DQorICAgIGlmICh3c1ZhbHVlICE9IHdzQ2hpbGRWYWx1ZSkgew0KKyAgICAgIHBJdGVtY2hpbGQgPSBwSXRlbWNoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgIGlmIChwSXRlbWNoaWxkKSB7DQorICAgICAgICB3c0NoaWxkVmFsdWUgPSBwSXRlbWNoaWxkLT5HZXRDb250ZW50KCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIHdzQ2hpbGRWYWx1ZS5FbXB0eSgpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICB3c0V4Y2xHcm91cCA9IHdzVmFsdWU7DQorICAgIH0NCisgICAgcE5vZGUtPlNldENvbnRlbnQod3NDaGlsZFZhbHVlLCB3c0NoaWxkVmFsdWUsIGJOb3RpZnksIGJTY3JpcHRNb2RpZnksDQorICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsNCisgIH0NCisgIGlmIChtX3BOb2RlKSB7DQorICAgIG1fcE5vZGUtPlNldENvbnRlbnQod3NFeGNsR3JvdXAsIHdzRXhjbEdyb3VwLCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJTeW5jRGF0YSk7DQorICB9DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9XaWRnZXREYXRhOjpHZXRFeGNsR3JvdXBGaXJzdE1lbWJlcigpIHsNCisgIENYRkFfTm9kZSogcEV4Y2wgPSBHZXROb2RlKCk7DQorICBpZiAoIXBFeGNsKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBFeGNsLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICB3aGlsZSAocE5vZGUpIHsNCisgICAgaWYgKHBOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCisgICAgICByZXR1cm4gcE5vZGU7DQorICAgIH0NCisgICAgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitDWEZBX05vZGUqIENYRkFfV2lkZ2V0RGF0YTo6R2V0RXhjbEdyb3VwTmV4dE1lbWJlcihDWEZBX05vZGUqIHBOb2RlKSB7DQorICBpZiAoIXBOb2RlKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTm9kZUZpZWxkID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICB3aGlsZSAocE5vZGVGaWVsZCkgew0KKyAgICBpZiAocE5vZGVGaWVsZC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0ZpZWxkKSB7DQorICAgICAgcmV0dXJuIHBOb2RlRmllbGQ7DQorICAgIH0NCisgICAgcE5vZGVGaWVsZCA9IHBOb2RlRmllbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQoraW50MzJfdCBDWEZBX1dpZGdldERhdGE6OkdldENob2ljZUxpc3RDb21taXRPbigpIHsNCisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICBpZiAocFVJQ2hpbGQpIHsNCisgICAgcmV0dXJuIHBVSUNoaWxkLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfQ29tbWl0T24pOw0KKyAgfQ0KKyAgcmV0dXJuIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfRW51bSgNCisgICAgICBYRkFfRUxFTUVOVF9DaG9pY2VMaXN0LCBYRkFfQVRUUklCVVRFX0NvbW1pdE9uLCBYRkFfWERQUEFDS0VUX0Zvcm0pOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6SXNDaG9pY2VMaXN0QWxsb3dUZXh0RW50cnkoKSB7DQorICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KKyAgaWYgKHBVSUNoaWxkKSB7DQorICAgIHJldHVybiBwVUlDaGlsZC0+R2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX1RleHRFbnRyeSk7DQorICB9DQorICByZXR1cm4gWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9Cb29sZWFuKA0KKyAgICAgIFhGQV9FTEVNRU5UX0Nob2ljZUxpc3QsIFhGQV9BVFRSSUJVVEVfVGV4dEVudHJ5LCBYRkFfWERQUEFDS0VUX0Zvcm0pOw0KK30NCitpbnQzMl90IENYRkFfV2lkZ2V0RGF0YTo6R2V0Q2hvaWNlTGlzdE9wZW4oKSB7DQorICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KKyAgaWYgKHBVSUNoaWxkKSB7DQorICAgIHJldHVybiBwVUlDaGlsZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX09wZW4pOw0KKyAgfQ0KKyAgcmV0dXJuIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfRW51bSgNCisgICAgICBYRkFfRUxFTUVOVF9DaG9pY2VMaXN0LCBYRkFfQVRUUklCVVRFX09wZW4sIFhGQV9YRFBQQUNLRVRfRm9ybSk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpJc0xpc3RCb3goKSB7DQorICBpbnQzMl90IGlPcGVuTW9kZSA9IEdldENob2ljZUxpc3RPcGVuKCk7DQorICByZXR1cm4gKGlPcGVuTW9kZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9BbHdheXMgfHwNCisgICAgICAgICAgaU9wZW5Nb2RlID09IFhGQV9BVFRSSUJVVEVFTlVNX011bHRpU2VsZWN0KTsNCit9DQoraW50MzJfdCBDWEZBX1dpZGdldERhdGE6OkNvdW50Q2hvaWNlTGlzdEl0ZW1zKEZYX0JPT0wgYlNhdmVWYWx1ZSkgew0KKyAgQ1hGQV9Ob2RlQXJyYXkgcEl0ZW1zOw0KKyAgQ1hGQV9Ob2RlKiBwSXRlbSA9IE5VTEw7DQorICBpbnQzMl90IGlDb3VudCA9IDA7DQorICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgZm9yICg7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIGlmIChwTm9kZS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0l0ZW1zKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaUNvdW50Kys7DQorICAgIHBJdGVtcy5BZGQocE5vZGUpOw0KKyAgICBpZiAoaUNvdW50ID09IDIpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGlDb3VudCA9PSAwKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgcEl0ZW0gPSBwSXRlbXNbMF07DQorICBpZiAoaUNvdW50ID4gMSkgew0KKyAgICBGWF9CT09MIGJJdGVtT25lSGFzU2F2ZSA9IHBJdGVtc1swXS0+R2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX1NhdmUpOw0KKyAgICBGWF9CT09MIGJJdGVtVHdvSGFzU2F2ZSA9IHBJdGVtc1sxXS0+R2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX1NhdmUpOw0KKyAgICBpZiAoYkl0ZW1PbmVIYXNTYXZlICE9IGJJdGVtVHdvSGFzU2F2ZSAmJiBiU2F2ZVZhbHVlID09IGJJdGVtVHdvSGFzU2F2ZSkgew0KKyAgICAgIHBJdGVtID0gcEl0ZW1zWzFdOw0KKyAgICB9DQorICB9DQorICBwSXRlbXMuUmVtb3ZlQWxsKCk7DQorICByZXR1cm4gcEl0ZW0tPkNvdW50Q2hpbGRyZW4oWEZBX0VMRU1FTlRfVU5LTk9XTik7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRDaG9pY2VMaXN0SXRlbShDRlhfV2lkZVN0cmluZyYgd3NUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2F2ZVZhbHVlKSB7DQorICB3c1RleHQuRW1wdHkoKTsNCisgIENYRkFfTm9kZUFycmF5IHBJdGVtc0FycmF5Ow0KKyAgQ1hGQV9Ob2RlKiBwSXRlbXMgPSBOVUxMOw0KKyAgaW50MzJfdCBpQ291bnQgPSAwOw0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIGZvciAoOyBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBpZiAocE5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9JdGVtcykgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlDb3VudCsrOw0KKyAgICBwSXRlbXNBcnJheS5BZGQocE5vZGUpOw0KKyAgICBpZiAoaUNvdW50ID09IDIpIHsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGlDb3VudCA9PSAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHBJdGVtcyA9IHBJdGVtc0FycmF5WzBdOw0KKyAgaWYgKGlDb3VudCA+IDEpIHsNCisgICAgRlhfQk9PTCBiSXRlbU9uZUhhc1NhdmUgPSBwSXRlbXNBcnJheVswXS0+R2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX1NhdmUpOw0KKyAgICBGWF9CT09MIGJJdGVtVHdvSGFzU2F2ZSA9IHBJdGVtc0FycmF5WzFdLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSk7DQorICAgIGlmIChiSXRlbU9uZUhhc1NhdmUgIT0gYkl0ZW1Ud29IYXNTYXZlICYmIGJTYXZlVmFsdWUgPT0gYkl0ZW1Ud29IYXNTYXZlKSB7DQorICAgICAgcEl0ZW1zID0gcEl0ZW1zQXJyYXlbMV07DQorICAgIH0NCisgIH0NCisgIGlmIChwSXRlbXMpIHsNCisgICAgQ1hGQV9Ob2RlKiBwSXRlbSA9IHBJdGVtcy0+R2V0Q2hpbGQobkluZGV4LCBYRkFfRUxFTUVOVF9VTktOT1dOKTsNCisgICAgaWYgKHBJdGVtICE9IE5VTEwpIHsNCisgICAgICBwSXRlbS0+VHJ5Q29udGVudCh3c1RleHQpOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXREYXRhOjpHZXRDaG9pY2VMaXN0SXRlbXMoQ0ZYX1dpZGVTdHJpbmdBcnJheSYgd3NUZXh0QXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTYXZlVmFsdWUpIHsNCisgIENYRkFfTm9kZUFycmF5IHBJdGVtczsNCisgIENYRkFfTm9kZSogcEl0ZW0gPSBOVUxMOw0KKyAgaW50MzJfdCBpQ291bnQgPSAwOw0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIGZvciAoOyBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBpZiAocE5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9JdGVtcykgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlDb3VudCsrOw0KKyAgICBwSXRlbXMuQWRkKHBOb2RlKTsNCisgICAgaWYgKGlDb3VudCA9PSAyKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGlmIChpQ291bnQgPT0gMCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBwSXRlbSA9IHBJdGVtc1swXTsNCisgIGlmIChpQ291bnQgPiAxKSB7DQorICAgIEZYX0JPT0wgYkl0ZW1PbmVIYXNTYXZlID0gcEl0ZW1zWzBdLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSk7DQorICAgIEZYX0JPT0wgYkl0ZW1Ud29IYXNTYXZlID0gcEl0ZW1zWzFdLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSk7DQorICAgIGlmIChiSXRlbU9uZUhhc1NhdmUgIT0gYkl0ZW1Ud29IYXNTYXZlICYmIGJTYXZlVmFsdWUgPT0gYkl0ZW1Ud29IYXNTYXZlKSB7DQorICAgICAgcEl0ZW0gPSBwSXRlbXNbMV07DQorICAgIH0NCisgIH0NCisgIHBJdGVtcy5SZW1vdmVBbGwoKTsNCisgIHBOb2RlID0gcEl0ZW0tPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIGZvciAoOyBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBwTm9kZS0+VHJ5Q29udGVudCh3c1RleHRBcnJheS5BZGQoKSk7DQorICB9DQorfQ0KK2ludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpDb3VudFNlbGVjdGVkSXRlbXMoKSB7DQorICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzVmFsdWVBcnJheTsNCisgIEdldFNlbGVjdGVkSXRlbXNWYWx1ZSh3c1ZhbHVlQXJyYXkpOw0KKyAgaWYgKElzTGlzdEJveCgpIHx8ICFJc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpKSB7DQorICAgIHJldHVybiB3c1ZhbHVlQXJyYXkuR2V0U2l6ZSgpOw0KKyAgfQ0KKyAgaW50MzJfdCBpU2VsZWN0ZWQgPSAwOw0KKyAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c1NhdmVUZXh0QXJyYXk7DQorICBHZXRDaG9pY2VMaXN0SXRlbXMod3NTYXZlVGV4dEFycmF5LCBUUlVFKTsNCisgIGludDMyX3QgaVZhbHVlcyA9IHdzVmFsdWVBcnJheS5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpVmFsdWVzOyBpKyspIHsNCisgICAgaW50MzJfdCBpU2F2ZXMgPSB3c1NhdmVUZXh0QXJyYXkuR2V0U2l6ZSgpOw0KKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpU2F2ZXM7IGorKykgew0KKyAgICAgIGlmICh3c1ZhbHVlQXJyYXlbaV0gPT0gd3NTYXZlVGV4dEFycmF5W2pdKSB7DQorICAgICAgICBpU2VsZWN0ZWQrKzsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGlTZWxlY3RlZDsNCit9DQoraW50MzJfdCBDWEZBX1dpZGdldERhdGE6OkdldFNlbGVjdGVkSXRlbShpbnQzMl90IG5JbmRleCkgew0KKyAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c1ZhbHVlQXJyYXk7DQorICBHZXRTZWxlY3RlZEl0ZW1zVmFsdWUod3NWYWx1ZUFycmF5KTsNCisgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NTYXZlVGV4dEFycmF5Ow0KKyAgR2V0Q2hvaWNlTGlzdEl0ZW1zKHdzU2F2ZVRleHRBcnJheSwgVFJVRSk7DQorICBpbnQzMl90IGlTYXZlcyA9IHdzU2F2ZVRleHRBcnJheS5HZXRTaXplKCk7DQorICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpU2F2ZXM7IGorKykgew0KKyAgICBpZiAod3NWYWx1ZUFycmF5W25JbmRleF0gPT0gd3NTYXZlVGV4dEFycmF5W2pdKSB7DQorICAgICAgcmV0dXJuIGo7DQorICAgIH0NCisgIH0NCisgIHJldHVybiAtMTsNCit9DQordm9pZCBDWEZBX1dpZGdldERhdGE6OkdldFNlbGVjdGVkSXRlbXMoQ0ZYX0ludDMyQXJyYXkmIGlTZWxBcnJheSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c1ZhbHVlQXJyYXk7DQorICBHZXRTZWxlY3RlZEl0ZW1zVmFsdWUod3NWYWx1ZUFycmF5KTsNCisgIGludDMyX3QgaVZhbHVlcyA9IHdzVmFsdWVBcnJheS5HZXRTaXplKCk7DQorICBpZiAoaVZhbHVlcyA8IDEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c1NhdmVUZXh0QXJyYXk7DQorICBHZXRDaG9pY2VMaXN0SXRlbXMod3NTYXZlVGV4dEFycmF5LCBUUlVFKTsNCisgIGludDMyX3QgaVNhdmVzID0gd3NTYXZlVGV4dEFycmF5LkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlWYWx1ZXM7IGkrKykgew0KKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpU2F2ZXM7IGorKykgew0KKyAgICAgIGlmICh3c1ZhbHVlQXJyYXlbaV0gPT0gd3NTYXZlVGV4dEFycmF5W2pdKSB7DQorICAgICAgICBpU2VsQXJyYXkuQWRkKGopOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXREYXRhOjpHZXRTZWxlY3RlZEl0ZW1zVmFsdWUoDQorICAgIENGWF9XaWRlU3RyaW5nQXJyYXkmIHdzU2VsVGV4dEFycmF5KSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlID0gR2V0UmF3VmFsdWUoKTsNCisgIGlmIChHZXRDaG9pY2VMaXN0T3BlbigpID09IFhGQV9BVFRSSUJVVEVFTlVNX011bHRpU2VsZWN0KSB7DQorICAgIGlmICghd3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICBpbnQzMl90IGlTdGFydCA9IDA7DQorICAgICAgaW50MzJfdCBpTGVuZ3RoID0gd3NWYWx1ZS5HZXRMZW5ndGgoKTsNCisgICAgICBpbnQzMl90IGlFbmQgPSB3c1ZhbHVlLkZpbmQoTCdcbicsIGlTdGFydCk7DQorICAgICAgaUVuZCA9IChpRW5kID09IC0xKSA/IGlMZW5ndGggOiBpRW5kOw0KKyAgICAgIHdoaWxlIChpRW5kID49IGlTdGFydCkgew0KKyAgICAgICAgd3NTZWxUZXh0QXJyYXkuQWRkKHdzVmFsdWUuTWlkKGlTdGFydCwgaUVuZCAtIGlTdGFydCkpOw0KKyAgICAgICAgaVN0YXJ0ID0gaUVuZCArIDE7DQorICAgICAgICBpZiAoaVN0YXJ0ID49IGlMZW5ndGgpIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBpRW5kID0gd3NWYWx1ZS5GaW5kKEwnXG4nLCBpU3RhcnQpOw0KKyAgICAgICAgaWYgKGlFbmQgPCAwKSB7DQorICAgICAgICAgIHdzU2VsVGV4dEFycmF5LkFkZCh3c1ZhbHVlLk1pZChpU3RhcnQsIGlMZW5ndGggLSBpU3RhcnQpKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIHdzU2VsVGV4dEFycmF5LkFkZCh3c1ZhbHVlKTsNCisgIH0NCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEl0ZW1TdGF0ZShpbnQzMl90IG5JbmRleCkgew0KKyAgaWYgKG5JbmRleCA8IDApIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c1NhdmVUZXh0QXJyYXk7DQorICBHZXRDaG9pY2VMaXN0SXRlbXMod3NTYXZlVGV4dEFycmF5LCBUUlVFKTsNCisgIGlmICh3c1NhdmVUZXh0QXJyYXkuR2V0U2l6ZSgpIDw9IG5JbmRleCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzVmFsdWVBcnJheTsNCisgIEdldFNlbGVjdGVkSXRlbXNWYWx1ZSh3c1ZhbHVlQXJyYXkpOw0KKyAgaW50MzJfdCBpVmFsdWVzID0gd3NWYWx1ZUFycmF5LkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlWYWx1ZXM7IGorKykgew0KKyAgICBpZiAod3NWYWx1ZUFycmF5W2pdID09IHdzU2F2ZVRleHRBcnJheVtuSW5kZXhdKSB7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDWEZBX1dpZGdldERhdGE6OlNldEl0ZW1TdGF0ZShpbnQzMl90IG5JbmRleCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNlbGVjdGVkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3luY0RhdGEpIHsNCisgIGlmIChuSW5kZXggPCAwKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NTYXZlVGV4dEFycmF5Ow0KKyAgR2V0Q2hvaWNlTGlzdEl0ZW1zKHdzU2F2ZVRleHRBcnJheSwgVFJVRSk7DQorICBpZiAod3NTYXZlVGV4dEFycmF5LkdldFNpemUoKSA8PSBuSW5kZXgpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpU2VsID0gLTE7DQorICBDRlhfV2lkZVN0cmluZ0FycmF5IHdzVmFsdWVBcnJheTsNCisgIEdldFNlbGVjdGVkSXRlbXNWYWx1ZSh3c1ZhbHVlQXJyYXkpOw0KKyAgaW50MzJfdCBpVmFsdWVzID0gd3NWYWx1ZUFycmF5LkdldFNpemUoKTsNCisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlWYWx1ZXM7IGorKykgew0KKyAgICBpZiAod3NWYWx1ZUFycmF5W2pdID09IHdzU2F2ZVRleHRBcnJheVtuSW5kZXhdKSB7DQorICAgICAgaVNlbCA9IGo7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIGlmIChHZXRDaG9pY2VMaXN0T3BlbigpID09IFhGQV9BVFRSSUJVVEVFTlVNX011bHRpU2VsZWN0KSB7DQorICAgIGlmIChiU2VsZWN0ZWQpIHsNCisgICAgICBpZiAoaVNlbCA8IDApIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUgPSBHZXRSYXdWYWx1ZSgpOw0KKyAgICAgICAgaWYgKCF3c1ZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICB3c1ZhbHVlICs9IEwiXG4iOw0KKyAgICAgICAgfQ0KKyAgICAgICAgd3NWYWx1ZSArPSB3c1NhdmVUZXh0QXJyYXlbbkluZGV4XTsNCisgICAgICAgIG1fcE5vZGUtPlNldENvbnRlbnQod3NWYWx1ZSwgd3NWYWx1ZSwgYk5vdGlmeSwgYlNjcmlwdE1vZGlmeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlN5bmNEYXRhKTsNCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAoaVNlbCA+PSAwKSB7DQorICAgICAgQ0ZYX0ludDMyQXJyYXkgaVNlbEFycmF5Ow0KKyAgICAgIEdldFNlbGVjdGVkSXRlbXMoaVNlbEFycmF5KTsNCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2VsQXJyYXkuR2V0U2l6ZSgpOyBpKyspIHsNCisgICAgICAgIGlmIChpU2VsQXJyYXlbaV0gPT0gbkluZGV4KSB7DQorICAgICAgICAgIGlTZWxBcnJheS5SZW1vdmVBdChpKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIFNldFNlbGVjdGRJdGVtcyhpU2VsQXJyYXksIGJOb3RpZnksIGJTY3JpcHRNb2RpZnksIGJTeW5jRGF0YSk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGlmIChiU2VsZWN0ZWQpIHsNCisgICAgICBpZiAoaVNlbCA8IDApIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU2F2ZVRleHQgPSB3c1NhdmVUZXh0QXJyYXlbbkluZGV4XTsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0VGV4dCh3c1NhdmVUZXh0KTsNCisgICAgICAgIEdldEZvcm1hdERhdGFWYWx1ZSh3c1NhdmVUZXh0LCB3c0Zvcm1hdFRleHQpOw0KKyAgICAgICAgbV9wTm9kZS0+U2V0Q29udGVudCh3c1NhdmVUZXh0LCB3c0Zvcm1hdFRleHQsIGJOb3RpZnksIGJTY3JpcHRNb2RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTeW5jRGF0YSk7DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGlTZWwgPj0gMCkgew0KKyAgICAgIG1fcE5vZGUtPlNldENvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcoKSwgQ0ZYX1dpZGVTdHJpbmcoKSwgYk5vdGlmeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJTY3JpcHRNb2RpZnksIGJTeW5jRGF0YSk7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDWEZBX1dpZGdldERhdGE6OlNldFNlbGVjdGRJdGVtcyhDRlhfSW50MzJBcnJheSYgaVNlbEFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTm90aWZ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2NyaXB0TW9kaWZ5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3luY0RhdGEpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7DQorICBpbnQzMl90IGlTaXplID0gaVNlbEFycmF5LkdldFNpemUoKTsNCisgIGlmIChpU2l6ZSA+PSAxKSB7DQorICAgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NTYXZlVGV4dEFycmF5Ow0KKyAgICBHZXRDaG9pY2VMaXN0SXRlbXMod3NTYXZlVGV4dEFycmF5LCBUUlVFKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NJdGVtVmFsdWU7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTaXplOyBpKyspIHsNCisgICAgICB3c0l0ZW1WYWx1ZSA9IChpU2l6ZSA9PSAxKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgID8gd3NTYXZlVGV4dEFycmF5W2lTZWxBcnJheVtpXV0NCisgICAgICAgICAgICAgICAgICAgICAgICA6IHdzU2F2ZVRleHRBcnJheVtpU2VsQXJyYXlbaV1dICsgRlhfV1NUUkMoTCJcbiIpOw0KKyAgICAgIHdzVmFsdWUgKz0gd3NJdGVtVmFsdWU7DQorICAgIH0NCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0KHdzVmFsdWUpOw0KKyAgaWYgKEdldENob2ljZUxpc3RPcGVuKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fTXVsdGlTZWxlY3QpIHsNCisgICAgR2V0Rm9ybWF0RGF0YVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0KTsNCisgIH0NCisgIG1fcE5vZGUtPlNldENvbnRlbnQod3NWYWx1ZSwgd3NGb3JtYXQsIGJOb3RpZnksIGJTY3JpcHRNb2RpZnksIGJTeW5jRGF0YSk7DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXREYXRhOjpDbGVhckFsbFNlbGVjdGlvbnMoKSB7DQorICBDWEZBX05vZGUqIHBCaW5kID0gbV9wTm9kZS0+R2V0QmluZERhdGEoKTsNCisgIGlmIChwQmluZCAmJiBHZXRDaG9pY2VMaXN0T3BlbigpID09IFhGQV9BVFRSSUJVVEVFTlVNX011bHRpU2VsZWN0KSB7DQorICAgIHdoaWxlIChDWEZBX05vZGUqIHBDaGlsZE5vZGUgPQ0KKyAgICAgICAgICAgICAgIHBCaW5kLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpIHsNCisgICAgICBwQmluZC0+UmVtb3ZlQ2hpbGQocENoaWxkTm9kZSk7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIFN5bmNWYWx1ZShDRlhfV2lkZVN0cmluZygpLCBGQUxTRSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXREYXRhOjpJbnNlcnRJdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0xhYmVsLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NOZXdWYWx1ZSh3c1ZhbHVlKTsNCisgIGlmICh3c05ld1ZhbHVlLklzRW1wdHkoKSkgew0KKyAgICB3c05ld1ZhbHVlID0gd3NMYWJlbDsNCisgIH0NCisgIENYRkFfTm9kZUFycmF5IGxpc3RpdGVtczsNCisgIGludDMyX3QgaUNvdW50ID0gMDsNCisgIENYRkFfTm9kZSogcEl0ZW1Ob2RlID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgZm9yICg7IHBJdGVtTm9kZTsNCisgICAgICAgcEl0ZW1Ob2RlID0gcEl0ZW1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIGlmIChwSXRlbU5vZGUtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9JdGVtcykgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGxpc3RpdGVtcy5BZGQocEl0ZW1Ob2RlKTsNCisgICAgaUNvdW50Kys7DQorICB9DQorICBpZiAoaUNvdW50IDwgMSkgew0KKyAgICBDWEZBX05vZGUqIHBJdGVtcyA9IG1fcE5vZGUtPkNyZWF0ZVNhbWVQYWNrZXROb2RlKFhGQV9FTEVNRU5UX0l0ZW1zKTsNCisgICAgbV9wTm9kZS0+SW5zZXJ0Q2hpbGQoLTEsIHBJdGVtcyk7DQorICAgIEluc2VydExpc3RUZXh0SXRlbShwSXRlbXMsIHdzTGFiZWwsIG5JbmRleCk7DQorICAgIENYRkFfTm9kZSogcFNhdmVJdGVtcyA9IG1fcE5vZGUtPkNyZWF0ZVNhbWVQYWNrZXROb2RlKFhGQV9FTEVNRU5UX0l0ZW1zKTsNCisgICAgbV9wTm9kZS0+SW5zZXJ0Q2hpbGQoLTEsIHBTYXZlSXRlbXMpOw0KKyAgICBwU2F2ZUl0ZW1zLT5TZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSwgVFJVRSk7DQorICAgIEluc2VydExpc3RUZXh0SXRlbShwU2F2ZUl0ZW1zLCB3c05ld1ZhbHVlLCBuSW5kZXgpOw0KKyAgfSBlbHNlIGlmIChpQ291bnQgPiAxKSB7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDI7IGkrKykgew0KKyAgICAgIENYRkFfTm9kZSogcE5vZGUgPSBsaXN0aXRlbXNbaV07DQorICAgICAgRlhfQk9PTCBiSGFzU2F2ZSA9IHBOb2RlLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSk7DQorICAgICAgaWYgKGJIYXNTYXZlKSB7DQorICAgICAgICBJbnNlcnRMaXN0VGV4dEl0ZW0ocE5vZGUsIHdzTmV3VmFsdWUsIG5JbmRleCk7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIEluc2VydExpc3RUZXh0SXRlbShwTm9kZSwgd3NMYWJlbCwgbkluZGV4KTsNCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIENYRkFfTm9kZSogcE5vZGUgPSBsaXN0aXRlbXNbMF07DQorICAgIHBOb2RlLT5TZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSwgRkFMU0UpOw0KKyAgICBwTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlKTsNCisgICAgQ1hGQV9Ob2RlKiBwU2F2ZUl0ZW1zID0gbV9wTm9kZS0+Q3JlYXRlU2FtZVBhY2tldE5vZGUoWEZBX0VMRU1FTlRfSXRlbXMpOw0KKyAgICBtX3BOb2RlLT5JbnNlcnRDaGlsZCgtMSwgcFNhdmVJdGVtcyk7DQorICAgIHBTYXZlSXRlbXMtPlNldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9TYXZlLCBUUlVFKTsNCisgICAgcFNhdmVJdGVtcy0+U2V0RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCBYRkFfQVRUUklCVVRFRU5VTV9IaWRkZW4pOw0KKyAgICBsaXN0aXRlbXMuUmVtb3ZlQWxsKCk7DQorICAgIENYRkFfTm9kZSogcExpc3ROb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgaW50MzJfdCBpID0gMDsNCisgICAgd2hpbGUgKHBMaXN0Tm9kZSkgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzT2xkVmFsdWU7DQorICAgICAgcExpc3ROb2RlLT5UcnlDb250ZW50KHdzT2xkVmFsdWUpOw0KKyAgICAgIEluc2VydExpc3RUZXh0SXRlbShwU2F2ZUl0ZW1zLCB3c09sZFZhbHVlLCBpKTsNCisgICAgICBpKys7DQorICAgICAgcExpc3ROb2RlID0gcExpc3ROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICB9DQorICAgIEluc2VydExpc3RUZXh0SXRlbShwTm9kZSwgd3NMYWJlbCwgbkluZGV4KTsNCisgICAgSW5zZXJ0TGlzdFRleHRJdGVtKHBTYXZlSXRlbXMsIHdzTmV3VmFsdWUsIG5JbmRleCk7DQorICB9DQorICBpZiAoIWJOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV9wTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0Tm90aWZ5KCktPk9uV2lkZ2V0RGF0YUV2ZW50KA0KKyAgICAgIHRoaXMsIFhGQV9XSURHRVRFVkVOVF9MaXN0SXRlbUFkZGVkLCAodm9pZCopKGNvbnN0IEZYX1dDSEFSKil3c0xhYmVsLA0KKyAgICAgICh2b2lkKikoY29uc3QgRlhfV0NIQVIqKXdzVmFsdWUsICh2b2lkKikodWludHB0cl90KW5JbmRleCk7DQorfQ0KK3ZvaWQgQ1hGQV9XaWRnZXREYXRhOjpHZXRJdGVtTGFiZWwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1ZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTGFiZWwpIHsNCisgIGludDMyX3QgaUNvdW50ID0gMDsNCisgIENYRkFfTm9kZUFycmF5IGxpc3RpdGVtczsNCisgIENYRkFfTm9kZSogcEl0ZW1zID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgZm9yICg7IHBJdGVtczsgcEl0ZW1zID0gcEl0ZW1zLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIGlmIChwSXRlbXMtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9JdGVtcykgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlDb3VudCsrOw0KKyAgICBsaXN0aXRlbXMuQWRkKHBJdGVtcyk7DQorICB9DQorICBpZiAoaUNvdW50IDw9IDEpIHsNCisgICAgd3NMYWJlbCA9IHdzVmFsdWU7DQorICB9IGVsc2Ugew0KKyAgICBDWEZBX05vZGUqIHBMYWJlbEl0ZW1zID0gbGlzdGl0ZW1zWzBdOw0KKyAgICBGWF9CT09MIGJTYXZlID0gcExhYmVsSXRlbXMtPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9TYXZlKTsNCisgICAgQ1hGQV9Ob2RlKiBwU2F2ZUl0ZW1zID0gTlVMTDsNCisgICAgaWYgKGJTYXZlKSB7DQorICAgICAgcFNhdmVJdGVtcyA9IHBMYWJlbEl0ZW1zOw0KKyAgICAgIHBMYWJlbEl0ZW1zID0gbGlzdGl0ZW1zWzFdOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHBTYXZlSXRlbXMgPSBsaXN0aXRlbXNbMV07DQorICAgIH0NCisgICAgaUNvdW50ID0gMDsNCisgICAgaW50MzJfdCBpU2VhcmNoID0gLTE7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsNCisgICAgQ1hGQV9Ob2RlKiBwQ2hpbGRJdGVtID0gcFNhdmVJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBmb3IgKDsgcENoaWxkSXRlbTsNCisgICAgICAgICBwQ2hpbGRJdGVtID0gcENoaWxkSXRlbS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICAgIHBDaGlsZEl0ZW0tPlRyeUNvbnRlbnQod3NDb250ZW50KTsNCisgICAgICBpZiAod3NDb250ZW50ID09IHdzVmFsdWUpIHsNCisgICAgICAgIGlTZWFyY2ggPSBpQ291bnQ7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgaUNvdW50Kys7DQorICAgIH0NCisgICAgaWYgKGlTZWFyY2ggPCAwKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICAgIGlmIChDWEZBX05vZGUqIHBUZXh0ID0NCisgICAgICAgICAgICBwTGFiZWxJdGVtcy0+R2V0Q2hpbGQoaVNlYXJjaCwgWEZBX0VMRU1FTlRfVU5LTk9XTikpIHsNCisgICAgICBwVGV4dC0+VHJ5Q29udGVudCh3c0xhYmVsKTsNCisgICAgfQ0KKyAgfQ0KK30NCit2b2lkIENYRkFfV2lkZ2V0RGF0YTo6R2V0SXRlbVZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMYWJlbCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKSB7DQorICBpbnQzMl90IGlDb3VudCA9IDA7DQorICBDWEZBX05vZGVBcnJheSBsaXN0aXRlbXM7DQorICBDWEZBX05vZGUqIHBJdGVtcyA9IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIGZvciAoOyBwSXRlbXM7IHBJdGVtcyA9IHBJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBpZiAocEl0ZW1zLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfSXRlbXMpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpQ291bnQrKzsNCisgICAgbGlzdGl0ZW1zLkFkZChwSXRlbXMpOw0KKyAgfQ0KKyAgaWYgKGlDb3VudCA8PSAxKSB7DQorICAgIHdzVmFsdWUgPSB3c0xhYmVsOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9Ob2RlKiBwTGFiZWxJdGVtcyA9IGxpc3RpdGVtc1swXTsNCisgICAgRlhfQk9PTCBiU2F2ZSA9IHBMYWJlbEl0ZW1zLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSk7DQorICAgIENYRkFfTm9kZSogcFNhdmVJdGVtcyA9IE5VTEw7DQorICAgIGlmIChiU2F2ZSkgew0KKyAgICAgIHBTYXZlSXRlbXMgPSBwTGFiZWxJdGVtczsNCisgICAgICBwTGFiZWxJdGVtcyA9IGxpc3RpdGVtc1sxXTsNCisgICAgfSBlbHNlIHsNCisgICAgICBwU2F2ZUl0ZW1zID0gbGlzdGl0ZW1zWzFdOw0KKyAgICB9DQorICAgIGlDb3VudCA9IDA7DQorICAgIGludDMyX3QgaVNlYXJjaCA9IC0xOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQorICAgIENYRkFfTm9kZSogcENoaWxkSXRlbSA9IHBMYWJlbEl0ZW1zLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgIGZvciAoOyBwQ2hpbGRJdGVtOw0KKyAgICAgICAgIHBDaGlsZEl0ZW0gPSBwQ2hpbGRJdGVtLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgICAgcENoaWxkSXRlbS0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOw0KKyAgICAgIGlmICh3c0NvbnRlbnQgPT0gd3NMYWJlbCkgew0KKyAgICAgICAgaVNlYXJjaCA9IGlDb3VudDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBpQ291bnQrKzsNCisgICAgfQ0KKyAgICBpZiAoaVNlYXJjaCA8IDApIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgaWYgKENYRkFfTm9kZSogcFRleHQgPSBwU2F2ZUl0ZW1zLT5HZXRDaGlsZChpU2VhcmNoLCBYRkFfRUxFTUVOVF9VTktOT1dOKSkgew0KKyAgICAgIHBUZXh0LT5UcnlDb250ZW50KHdzVmFsdWUpOw0KKyAgICB9DQorICB9DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpEZWxldGVJdGVtKGludDMyX3QgbkluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTY3JpcHRNb2RpZnksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU3luY0RhdGEpIHsNCisgIEZYX0JPT0wgYlNldFZhbHVlID0gRkFMU0U7DQorICBDWEZBX05vZGUqIHBJdGVtcyA9IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIGZvciAoOyBwSXRlbXM7IHBJdGVtcyA9IHBJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgew0KKyAgICBpZiAocEl0ZW1zLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfSXRlbXMpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAobkluZGV4IDwgMCkgew0KKyAgICAgIHdoaWxlIChDWEZBX05vZGUqIHBOb2RlID0gcEl0ZW1zLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpIHsNCisgICAgICAgIHBJdGVtcy0+UmVtb3ZlQ2hpbGQocE5vZGUpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAoIWJTZXRWYWx1ZSAmJiBwSXRlbXMtPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9TYXZlKSkgew0KKyAgICAgICAgU2V0SXRlbVN0YXRlKG5JbmRleCwgRkFMU0UsIFRSVUUsIGJTY3JpcHRNb2RpZnksIGJTeW5jRGF0YSk7DQorICAgICAgICBiU2V0VmFsdWUgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgICBpbnQzMl90IGkgPSAwOw0KKyAgICAgIENYRkFfTm9kZSogcE5vZGUgPSBwSXRlbXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgICB3aGlsZSAocE5vZGUpIHsNCisgICAgICAgIGlmIChpID09IG5JbmRleCkgew0KKyAgICAgICAgICBwSXRlbXMtPlJlbW92ZUNoaWxkKHBOb2RlKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBpKys7DQorICAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKCFiTm90aWZ5KSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgbV9wTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0Tm90aWZ5KCktPk9uV2lkZ2V0RGF0YUV2ZW50KA0KKyAgICAgIHRoaXMsIFhGQV9XSURHRVRFVkVOVF9MaXN0SXRlbVJlbW92ZWQsICh2b2lkKikodWludHB0cl90KW5JbmRleCk7DQorICByZXR1cm4gVFJVRTsNCit9DQoraW50MzJfdCBDWEZBX1dpZGdldERhdGE6OkdldEhvcml6b250YWxTY3JvbGxQb2xpY3koKSB7DQorICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KKyAgaWYgKHBVSUNoaWxkKSB7DQorICAgIHJldHVybiBwVUlDaGlsZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX0hTY3JvbGxQb2xpY3kpOw0KKyAgfQ0KKyAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX0F1dG87DQorfQ0KK2ludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpHZXROdW1iZXJPZkNlbGxzKCkgew0KKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgIGlmICghcFVJQ2hpbGQpIHsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgaWYgKENYRkFfTm9kZSogcE5vZGUgPSBwVUlDaGlsZC0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfQ29tYikpIHsNCisgICAgcmV0dXJuIHBOb2RlLT5HZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTnVtYmVyT2ZDZWxscyk7DQorICB9DQorICByZXR1cm4gLTE7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpJc0RhdGVUaW1lRWRpdFVzZVBpY2tlcigpIHsNCisgIHJldHVybiBUUlVFOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX1dpZGdldERhdGE6OkdldEJhcmNvZGVUeXBlKCkgew0KKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgIHJldHVybiBwVUlDaGlsZCA/IHBVSUNoaWxkLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX1R5cGUpIDogTlVMTDsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEJhcmNvZGVBdHRyaWJ1dGVfQ2hhckVuY29kaW5nKGludDMyX3QmIHZhbCkgew0KKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzQ2hhckVuY29kaW5nOw0KKyAgaWYgKHBVSUNoaWxkLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0NoYXJFbmNvZGluZywgd3NDaGFyRW5jb2RpbmcpKSB7DQorICAgIGlmICh3c0NoYXJFbmNvZGluZy5Db21wYXJlTm9DYXNlKEwiVVRGLTE2IikpIHsNCisgICAgICB2YWwgPSBDSEFSX0VOQ09ESU5HX1VOSUNPREU7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0gZWxzZSBpZiAod3NDaGFyRW5jb2RpbmcuQ29tcGFyZU5vQ2FzZShMIlVURi04IikpIHsNCisgICAgICB2YWwgPSBDSEFSX0VOQ09ESU5HX1VURjg7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEJhcmNvZGVBdHRyaWJ1dGVfQ2hlY2tzdW0oaW50MzJfdCYgdmFsKSB7DQorICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZUNoZWNrc3VtOw0KKyAgaWYgKHBVSUNoaWxkLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfQ2hlY2tzdW0sIGVDaGVja3N1bSkpIHsNCisgICAgc3dpdGNoIChlQ2hlY2tzdW0pIHsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX05vbmU6DQorICAgICAgICB2YWwgPSAwOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9BdXRvOg0KKyAgICAgICAgdmFsID0gMTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fMW1vZDEwOg0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV8xbW9kMTBfMW1vZDExOg0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV8ybW9kMTA6DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEJhcmNvZGVBdHRyaWJ1dGVfRGF0YUxlbmd0aChpbnQzMl90JiB2YWwpIHsNCisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICBDRlhfV2lkZVN0cmluZyB3c0RhdGFMZW5ndGg7DQorICBpZiAocFVJQ2hpbGQtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfRGF0YUxlbmd0aCwgd3NEYXRhTGVuZ3RoKSkgew0KKyAgICB2YWwgPSBGWFNZU193dG9pKHdzRGF0YUxlbmd0aCk7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9TdGFydENoYXIoRlhfQ0hBUiYgdmFsKSB7DQorICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmdDIHdzU3RhcnRFbmRDaGFyOw0KKyAgaWYgKHBVSUNoaWxkLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1N0YXJ0Q2hhciwgd3NTdGFydEVuZENoYXIpKSB7DQorICAgIGlmICh3c1N0YXJ0RW5kQ2hhci5HZXRMZW5ndGgoKSkgew0KKyAgICAgIHZhbCA9IChGWF9DSEFSKXdzU3RhcnRFbmRDaGFyLkdldEF0KDApOw0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRCYXJjb2RlQXR0cmlidXRlX0VuZENoYXIoRlhfQ0hBUiYgdmFsKSB7DQorICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmdDIHdzU3RhcnRFbmRDaGFyOw0KKyAgaWYgKHBVSUNoaWxkLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0VuZENoYXIsIHdzU3RhcnRFbmRDaGFyKSkgew0KKyAgICBpZiAod3NTdGFydEVuZENoYXIuR2V0TGVuZ3RoKCkpIHsNCisgICAgICB2YWwgPSAoRlhfQ0hBUil3c1N0YXJ0RW5kQ2hhci5HZXRBdCgwKTsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9FQ0xldmVsKGludDMyX3QmIHZhbCkgew0KKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzRUNMZXZlbDsNCisgIGlmIChwVUlDaGlsZC0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9FcnJvckNvcnJlY3Rpb25MZXZlbCwgd3NFQ0xldmVsKSkgew0KKyAgICB2YWwgPSBGWFNZU193dG9pKHdzRUNMZXZlbCk7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9Nb2R1bGVXaWR0aChpbnQzMl90JiB2YWwpIHsNCisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICBDWEZBX01lYXN1cmVtZW50IG1Nb2R1bGVXaWR0aEhlaWdodDsNCisgIGlmIChwVUlDaGlsZC0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX01vZHVsZVdpZHRoLCBtTW9kdWxlV2lkdGhIZWlnaHQpKSB7DQorICAgIHZhbCA9IChpbnQzMl90KW1Nb2R1bGVXaWR0aEhlaWdodC5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEJhcmNvZGVBdHRyaWJ1dGVfTW9kdWxlSGVpZ2h0KGludDMyX3QmIHZhbCkgew0KKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgIENYRkFfTWVhc3VyZW1lbnQgbU1vZHVsZVdpZHRoSGVpZ2h0Ow0KKyAgaWYgKHBVSUNoaWxkLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTW9kdWxlSGVpZ2h0LCBtTW9kdWxlV2lkdGhIZWlnaHQpKSB7DQorICAgIHZhbCA9IChpbnQzMl90KW1Nb2R1bGVXaWR0aEhlaWdodC5Ub1VuaXQoWEZBX1VOSVRfUHQpOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEJhcmNvZGVBdHRyaWJ1dGVfUHJpbnRDaGVja3N1bShGWF9CT09MJiB2YWwpIHsNCisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICBGWF9CT09MIGJQcmludENoZWNrRGlnaXQ7DQorICBpZiAocFVJQ2hpbGQtPlRyeUJvb2xlYW4oWEZBX0FUVFJJQlVURV9QcmludENoZWNrRGlnaXQsIGJQcmludENoZWNrRGlnaXQpKSB7DQorICAgIHZhbCA9IGJQcmludENoZWNrRGlnaXQ7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9UZXh0TG9jYXRpb24oaW50MzJfdCYgdmFsKSB7DQorICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOw0KKyAgWEZBX0FUVFJJQlVURUVOVU0gZVRleHRMb2NhdGlvbjsNCisgIGlmIChwVUlDaGlsZC0+VHJ5RW51bShYRkFfQVRUUklCVVRFX1RleHRMb2NhdGlvbiwgZVRleHRMb2NhdGlvbikpIHsNCisgICAgc3dpdGNoIChlVGV4dExvY2F0aW9uKSB7DQorICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOg0KKyAgICAgICAgdmFsID0gQkNfVEVYVF9MT0NfTk9ORTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQWJvdmU6DQorICAgICAgICB2YWwgPSBCQ19URVhUX0xPQ19BQk9WRTsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQmVsb3c6DQorICAgICAgICB2YWwgPSBCQ19URVhUX0xPQ19CRUxPVzsNCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQWJvdmVFbWJlZGRlZDoNCisgICAgICAgIHZhbCA9IEJDX1RFWFRfTE9DX0FCT1ZFRU1CRUQ7DQorICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JlbG93RW1iZWRkZWQ6DQorICAgICAgICB2YWwgPSBCQ19URVhUX0xPQ19CRUxPV0VNQkVEOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRCYXJjb2RlQXR0cmlidXRlX1RydW5jYXRlKEZYX0JPT0wmIHZhbCkgew0KKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgIEZYX0JPT0wgYlRydW5jYXRlOw0KKyAgaWYgKHBVSUNoaWxkLT5UcnlCb29sZWFuKFhGQV9BVFRSSUJVVEVfVHJ1bmNhdGUsIGJUcnVuY2F0ZSkpIHsNCisgICAgdmFsID0gYlRydW5jYXRlOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEJhcmNvZGVBdHRyaWJ1dGVfV2lkZU5hcnJvd1JhdGlvKEZYX0ZMT0FUJiB2YWwpIHsNCisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICBDRlhfV2lkZVN0cmluZyB3c1dpZGVOYXJyb3dSYXRpbzsNCisgIGlmIChwVUlDaGlsZC0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9XaWRlTmFycm93UmF0aW8sIHdzV2lkZU5hcnJvd1JhdGlvKSkgew0KKyAgICBGWF9TVFJTSVpFIHB0UG9zID0gd3NXaWRlTmFycm93UmF0aW8uRmluZCgnOicpOw0KKyAgICBGWF9GTE9BVCBmUmF0aW8gPSAwOw0KKyAgICBpZiAocHRQb3MgPj0gMCkgew0KKyAgICAgIGZSYXRpbyA9IChGWF9GTE9BVClGWFNZU193dG9pKHdzV2lkZU5hcnJvd1JhdGlvKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpbnQzMl90IGZBLCBmQjsNCisgICAgICBmQSA9IEZYU1lTX3d0b2kod3NXaWRlTmFycm93UmF0aW8uTGVmdChwdFBvcykpOw0KKyAgICAgIGZCID0gRlhTWVNfd3RvaSh3c1dpZGVOYXJyb3dSYXRpby5NaWQocHRQb3MgKyAxKSk7DQorICAgICAgaWYgKGZCKSB7DQorICAgICAgICBmUmF0aW8gPSAoRlhfRkxPQVQpZkEgLyBmQjsNCisgICAgICB9DQorICAgIH0NCisgICAgdmFsID0gZlJhdGlvOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDWEZBX1dpZGdldERhdGE6OkdldFBhc3N3b3JkQ2hhcihDRlhfV2lkZVN0cmluZyYgd3NQYXNzV29yZCkgew0KKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgIGlmIChwVUlDaGlsZCkgew0KKyAgICBwVUlDaGlsZC0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9QYXNzd29yZENoYXIsIHdzUGFzc1dvcmQpOw0KKyAgfSBlbHNlIHsNCisgICAgd3NQYXNzV29yZCA9IFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfQ2RhdGEoWEZBX0VMRU1FTlRfUGFzc3dvcmRFZGl0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFX1Bhc3N3b3JkQ2hhciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsNCisgIH0NCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OklzQWxsb3dSaWNoVGV4dCgpIHsNCisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICBGWF9CT09MIGJWYWx1ZSA9IEZBTFNFOw0KKyAgaWYgKHBVSUNoaWxkICYmDQorICAgICAgcFVJQ2hpbGQtPlRyeUJvb2xlYW4oWEZBX0FUVFJJQlVURV9BbGxvd1JpY2hUZXh0LCBiVmFsdWUsIEZBTFNFKSkgew0KKyAgICByZXR1cm4gYlZhbHVlOw0KKyAgfQ0KKyAgaWYgKENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9WYWx1ZSkpIHsNCisgICAgaWYgKENYRkFfTm9kZSogcENoaWxkID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkgew0KKyAgICAgIHJldHVybiBwQ2hpbGQtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9FeERhdGE7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OklzTXVsdGlMaW5lKCkgew0KKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsNCisgIGlmIChwVUlDaGlsZCkgew0KKyAgICByZXR1cm4gcFVJQ2hpbGQtPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9NdWx0aUxpbmUpOw0KKyAgfQ0KKyAgcmV0dXJuIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfQm9vbGVhbigNCisgICAgICBYRkFfRUxFTUVOVF9UZXh0RWRpdCwgWEZBX0FUVFJJQlVURV9NdWx0aUxpbmUsIFhGQV9YRFBQQUNLRVRfRm9ybSk7DQorfQ0KK2ludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRWZXJ0aWNhbFNjcm9sbFBvbGljeSgpIHsNCisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7DQorICBpZiAocFVJQ2hpbGQpIHsNCisgICAgcmV0dXJuIHBVSUNoaWxkLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfVlNjcm9sbFBvbGljeSk7DQorICB9DQorICByZXR1cm4gWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9FbnVtKA0KKyAgICAgIFhGQV9FTEVNRU5UX1RleHRFZGl0LCBYRkFfQVRUUklCVVRFX1ZTY3JvbGxQb2xpY3ksIFhGQV9YRFBQQUNLRVRfRm9ybSk7DQorfQ0KK2ludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRNYXhDaGFycyhYRkFfRUxFTUVOVCYgZVR5cGUpIHsNCisgIGlmIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfVmFsdWUpKSB7DQorICAgIGlmIChDWEZBX05vZGUqIHBDaGlsZCA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpIHsNCisgICAgICBzd2l0Y2ggKHBDaGlsZC0+R2V0Q2xhc3NJRCgpKSB7DQorICAgICAgICBjYXNlIFhGQV9FTEVNRU5UX1RleHQ6DQorICAgICAgICAgIGVUeXBlID0gWEZBX0VMRU1FTlRfVGV4dDsNCisgICAgICAgICAgcmV0dXJuIHBDaGlsZC0+R2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX01heENoYXJzKTsNCisgICAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRXhEYXRhOiB7DQorICAgICAgICAgIGVUeXBlID0gWEZBX0VMRU1FTlRfRXhEYXRhOw0KKyAgICAgICAgICBpbnQzMl90IGlNYXggPSBwQ2hpbGQtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9NYXhMZW5ndGgpOw0KKyAgICAgICAgICByZXR1cm4gaU1heCA8IDAgPyAwIDogaU1heDsNCisgICAgICAgIH0NCisgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRGcmFjRGlnaXRzKGludDMyX3QmIGlGcmFjRGlnaXRzKSB7DQorICBpZiAoQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1ZhbHVlKSkgew0KKyAgICBpZiAoQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBwTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfRGVjaW1hbCkpIHsNCisgICAgICByZXR1cm4gcENoaWxkLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfRnJhY0RpZ2l0cywgaUZyYWNEaWdpdHMpOw0KKyAgICB9DQorICB9DQorICBpRnJhY0RpZ2l0cyA9IC0xOw0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6R2V0TGVhZERpZ2l0cyhpbnQzMl90JiBpTGVhZERpZ2l0cykgew0KKyAgaWYgKENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9WYWx1ZSkpIHsNCisgICAgaWYgKENYRkFfTm9kZSogcENoaWxkID0gcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX0RlY2ltYWwpKSB7DQorICAgICAgcmV0dXJuIHBDaGlsZC0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX0xlYWREaWdpdHMsIGlMZWFkRGlnaXRzKTsNCisgICAgfQ0KKyAgfQ0KKyAgaUxlYWREaWdpdHMgPSAtMTsNCisgIHJldHVybiBGQUxTRTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgWEZBX051bWVyaWNMaW1pdChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlYWQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlUcmVhZCkgew0KKyAgaWYgKChpTGVhZCA9PSAtMSkgJiYgKGlUcmVhZCA9PSAtMSkpIHsNCisgICAgcmV0dXJuIHdzVmFsdWU7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1JldDsNCisgIGludDMyX3QgaUxlYWRfID0gMCwgaVRyZWFkXyA9IC0xOw0KKyAgaW50MzJfdCBpQ291bnQgPSB3c1ZhbHVlLkdldExlbmd0aCgpOw0KKyAgaWYgKGlDb3VudCA9PSAwKSB7DQorICAgIHJldHVybiB3c1ZhbHVlOw0KKyAgfQ0KKyAgaW50MzJfdCBpID0gMDsNCisgIGlmICh3c1ZhbHVlW2ldID09IEwnLScpIHsNCisgICAgd3NSZXQgKz0gTCctJzsNCisgICAgaSsrOw0KKyAgfQ0KKyAgZm9yICg7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICBGWF9XQ0hBUiB3YyA9IHdzVmFsdWVbaV07DQorICAgIGlmIChYRkFfSXNEaWdpdCh3YykpIHsNCisgICAgICBpZiAoaUxlYWQgPj0gMCkgew0KKyAgICAgICAgaUxlYWRfKys7DQorICAgICAgICBpZiAoaUxlYWRfID4gaUxlYWQpIHsNCisgICAgICAgICAgcmV0dXJuIEwiMCI7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIGlmIChpVHJlYWRfID49IDApIHsNCisgICAgICAgIGlUcmVhZF8rKzsNCisgICAgICAgIGlmIChpVHJlYWRfID4gaVRyZWFkKSB7DQorICAgICAgICAgIGlmIChpVHJlYWQgIT0gLTEpIHsNCisgICAgICAgICAgICBDRlhfRGVjaW1hbCB3c0RlY2kgPSBDRlhfRGVjaW1hbCh3c1ZhbHVlKTsNCisgICAgICAgICAgICB3c0RlY2kuU2V0U2NhbGUoaVRyZWFkKTsNCisgICAgICAgICAgICB3c1JldCA9IHdzRGVjaTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICByZXR1cm4gd3NSZXQ7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKHdjID09IEwnLicpIHsNCisgICAgICBpVHJlYWRfID0gMDsNCisgICAgICBpTGVhZCA9IC0xOw0KKyAgICB9DQorICAgIHdzUmV0ICs9IHdjOw0KKyAgfQ0KKyAgcmV0dXJuIHdzUmV0Ow0KK30NCitGWF9CT09MIENYRkFfV2lkZ2V0RGF0YTo6U2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9WQUxVRVBJQ1RVUkUgZVZhbHVlVHlwZSkgew0KKyAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgIFN5bmNWYWx1ZSh3c1ZhbHVlLCBUUlVFKTsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICB0aGlzLT5tX2JQcmVOdWxsID0gdGhpcy0+bV9iSXNOdWxsOw0KKyAgdGhpcy0+bV9iSXNOdWxsID0gRkFMU0U7DQorICBDRlhfV2lkZVN0cmluZyB3c05ld1RleHQod3NWYWx1ZSk7DQorICBDRlhfV2lkZVN0cmluZyB3c1BpY3R1cmU7DQorICBHZXRQaWN0dXJlQ29udGVudCh3c1BpY3R1cmUsIGVWYWx1ZVR5cGUpOw0KKyAgRlhfQk9PTCBiVmFsaWRhdGUgPSBUUlVFOw0KKyAgRlhfQk9PTCBiU3luY0RhdGEgPSBGQUxTRTsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBHZXRVSUNoaWxkKCk7DQorICBpZiAoIXBOb2RlKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgWEZBX0VMRU1FTlQgdWlUeXBlID0gcE5vZGUtPkdldENsYXNzSUQoKTsNCisgIGlmICghd3NQaWN0dXJlLklzRW1wdHkoKSkgew0KKyAgICBDWEZBX0xvY2FsZU1nciogcExvY2FsTWdyID0gbV9wTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0TG9jYWxNZ3IoKTsNCisgICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldExvY2FsKCk7DQorICAgIENYRkFfTG9jYWxlVmFsdWUgd2lkZ2V0VmFsdWUgPSBYRkFfR2V0TG9jYWxlVmFsdWUodGhpcyk7DQorICAgIGJWYWxpZGF0ZSA9DQorICAgICAgICB3aWRnZXRWYWx1ZS5WYWxpZGF0ZVZhbHVlKHdzVmFsdWUsIHdzUGljdHVyZSwgcExvY2FsZSwgJndzUGljdHVyZSk7DQorICAgIGlmIChiVmFsaWRhdGUpIHsNCisgICAgICB3aWRnZXRWYWx1ZSA9IENYRkFfTG9jYWxlVmFsdWUod2lkZ2V0VmFsdWUuR2V0VHlwZSgpLCB3c05ld1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzUGljdHVyZSwgcExvY2FsZSwgcExvY2FsTWdyKTsNCisgICAgICB3c05ld1RleHQgPSB3aWRnZXRWYWx1ZS5HZXRWYWx1ZSgpOw0KKyAgICAgIGlmICh1aVR5cGUgPT0gWEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQpIHsNCisgICAgICAgIGludDMyX3QgaUxlYWREaWdpdHMgPSAwOw0KKyAgICAgICAgaW50MzJfdCBpRnJhY0RpZ2l0cyA9IDA7DQorICAgICAgICBHZXRMZWFkRGlnaXRzKGlMZWFkRGlnaXRzKTsNCisgICAgICAgIEdldEZyYWNEaWdpdHMoaUZyYWNEaWdpdHMpOw0KKyAgICAgICAgd3NOZXdUZXh0ID0gWEZBX051bWVyaWNMaW1pdCh3c05ld1RleHQsIGlMZWFkRGlnaXRzLCBpRnJhY0RpZ2l0cyk7DQorICAgICAgfQ0KKyAgICAgIGJTeW5jRGF0YSA9IFRSVUU7DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGlmICh1aVR5cGUgPT0gWEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQpIHsNCisgICAgICBpZiAod3NOZXdUZXh0ICE9IEZYX1dTVFJDKEwiMCIpKSB7DQorICAgICAgICBpbnQzMl90IGlMZWFkRGlnaXRzID0gMDsNCisgICAgICAgIGludDMyX3QgaUZyYWNEaWdpdHMgPSAwOw0KKyAgICAgICAgR2V0TGVhZERpZ2l0cyhpTGVhZERpZ2l0cyk7DQorICAgICAgICBHZXRGcmFjRGlnaXRzKGlGcmFjRGlnaXRzKTsNCisgICAgICAgIHdzTmV3VGV4dCA9IFhGQV9OdW1lcmljTGltaXQod3NOZXdUZXh0LCBpTGVhZERpZ2l0cywgaUZyYWNEaWdpdHMpOw0KKyAgICAgIH0NCisgICAgICBiU3luY0RhdGEgPSBUUlVFOw0KKyAgICB9DQorICB9DQorICBpZiAodWlUeXBlICE9IFhGQV9FTEVNRU5UX051bWVyaWNFZGl0IHx8IGJTeW5jRGF0YSkgew0KKyAgICBTeW5jVmFsdWUod3NOZXdUZXh0LCBUUlVFKTsNCisgIH0NCisgIHJldHVybiBiVmFsaWRhdGU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRQaWN0dXJlQ29udGVudChDRlhfV2lkZVN0cmluZyYgd3NQaWN0dXJlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfVkFMVUVQSUNUVVJFIGVQaWN0dXJlKSB7DQorICBpZiAoZVBpY3R1cmUgPT0gWEZBX1ZBTFVFUElDVFVSRV9SYXcpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgQ1hGQV9Mb2NhbGVWYWx1ZSB3aWRnZXRWYWx1ZSA9IFhGQV9HZXRMb2NhbGVWYWx1ZSh0aGlzKTsNCisgIHN3aXRjaCAoZVBpY3R1cmUpIHsNCisgICAgY2FzZSBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXk6IHsNCisgICAgICBpZiAoQ1hGQV9Ob2RlKiBwRm9ybWF0ID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfRm9ybWF0KSkgew0KKyAgICAgICAgaWYgKENYRkFfTm9kZSogcFBpY3R1cmUgPSBwRm9ybWF0LT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9QaWN0dXJlKSkgew0KKyAgICAgICAgICBpZiAocFBpY3R1cmUtPlRyeUNvbnRlbnQod3NQaWN0dXJlKSkgew0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0YVBpY3R1cmUsIHdzVGltZVBpY3R1cmU7DQorICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldExvY2FsKCk7DQorICAgICAgaWYgKCFwTG9jYWxlKSB7DQorICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIEZYX0RXT1JEIGR3VHlwZSA9IHdpZGdldFZhbHVlLkdldFR5cGUoKTsNCisgICAgICBzd2l0Y2ggKGR3VHlwZSkgew0KKyAgICAgICAgY2FzZSBYRkFfVlRfREFURToNCisgICAgICAgICAgcExvY2FsZS0+R2V0RGF0ZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzUGljdHVyZSk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfVlRfVElNRToNCisgICAgICAgICAgcExvY2FsZS0+R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzUGljdHVyZSk7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSBYRkFfVlRfREFURVRJTUU6DQorICAgICAgICAgIHBMb2NhbGUtPkdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0RhdGFQaWN0dXJlKTsNCisgICAgICAgICAgcExvY2FsZS0+R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzVGltZVBpY3R1cmUpOw0KKyAgICAgICAgICB3c1BpY3R1cmUgPSB3c0RhdGFQaWN0dXJlICsgRlhfV1NUUkMoTCJUIikgKyB3c1RpbWVQaWN0dXJlOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgWEZBX1ZUX0RFQ0lNQUw6DQorICAgICAgICBjYXNlIFhGQV9WVF9GTE9BVDoNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgY2FzZSBYRkFfVkFMVUVQSUNUVVJFX0VkaXQ6IHsNCisgICAgICBDWEZBX05vZGUqIHBVSSA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1VpKTsNCisgICAgICBpZiAocFVJKSB7DQorICAgICAgICBpZiAoQ1hGQV9Ob2RlKiBwUGljdHVyZSA9IHBVSS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfUGljdHVyZSkpIHsNCisgICAgICAgICAgaWYgKHBQaWN0dXJlLT5UcnlDb250ZW50KHdzUGljdHVyZSkpIHsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGFQaWN0dXJlLCB3c1RpbWVQaWN0dXJlOw0KKyAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldExvY2FsKCk7DQorICAgICAgICBpZiAoIXBMb2NhbGUpIHsNCisgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfRFdPUkQgZHdUeXBlID0gd2lkZ2V0VmFsdWUuR2V0VHlwZSgpOw0KKyAgICAgICAgc3dpdGNoIChkd1R5cGUpIHsNCisgICAgICAgICAgY2FzZSBYRkFfVlRfREFURToNCisgICAgICAgICAgICBwTG9jYWxlLT5HZXREYXRlUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX1Nob3J0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzUGljdHVyZSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGNhc2UgWEZBX1ZUX1RJTUU6DQorICAgICAgICAgICAgcExvY2FsZS0+R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9TaG9ydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1BpY3R1cmUpOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBjYXNlIFhGQV9WVF9EQVRFVElNRToNCisgICAgICAgICAgICBwTG9jYWxlLT5HZXREYXRlUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX1Nob3J0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzRGF0YVBpY3R1cmUpOw0KKyAgICAgICAgICAgIHBMb2NhbGUtPkdldFRpbWVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NUaW1lUGljdHVyZSk7DQorICAgICAgICAgICAgd3NQaWN0dXJlID0gd3NEYXRhUGljdHVyZSArIEwiVCIgKyB3c1RpbWVQaWN0dXJlOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICBjYXNlIFhGQV9WQUxVRVBJQ1RVUkVfRGF0YUJpbmQ6IHsNCisgICAgICBpZiAoQ1hGQV9CaW5kIGJpbmQgPSBHZXRCaW5kKCkpIHsNCisgICAgICAgIGJpbmQuR2V0UGljdHVyZSh3c1BpY3R1cmUpOw0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitJRlhfTG9jYWxlKiBDWEZBX1dpZGdldERhdGE6OkdldExvY2FsKCkgew0KKyAgSUZYX0xvY2FsZSogcExvY2FsZSA9IE5VTEw7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIHBMb2NhbGU7DQorICB9DQorICBGWF9CT09MIGJMb2NhbGUgPSBGQUxTRTsNCisgIENGWF9XaWRlU3RyaW5nIHdzTG9jYWxlTmFtZTsNCisgIGJMb2NhbGUgPSBtX3BOb2RlLT5HZXRMb2NhbGVOYW1lKHdzTG9jYWxlTmFtZSk7DQorICBpZiAoYkxvY2FsZSkgew0KKyAgICBpZiAod3NMb2NhbGVOYW1lLkVxdWFsKEZYX1dTVFJDKEwiYW1iaWVudCIpKSkgew0KKyAgICAgIHBMb2NhbGUgPSBtX3BOb2RlLT5HZXREb2N1bWVudCgpLT5HZXRMb2NhbE1ncigpLT5HZXREZWZMb2NhbGUoKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBwTG9jYWxlID0NCisgICAgICAgICAgbV9wTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0TG9jYWxNZ3IoKS0+R2V0TG9jYWxlQnlOYW1lKHdzTG9jYWxlTmFtZSk7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBwTG9jYWxlOw0KK30NCitzdGF0aWMgRlhfQk9PTCBYRkFfU3BsaXREYXRlVGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRlVGltZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NEYXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RpbWUpIHsNCisgIHdzRGF0ZSA9IEwiIjsNCisgIHdzVGltZSA9IEwiIjsNCisgIGlmICh3c0RhdGVUaW1lLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpbnQgblNwbGl0SW5kZXggPSAtMTsNCisgIG5TcGxpdEluZGV4ID0gd3NEYXRlVGltZS5GaW5kKCdUJyk7DQorICBpZiAoblNwbGl0SW5kZXggPCAwKSB7DQorICAgIG5TcGxpdEluZGV4ID0gd3NEYXRlVGltZS5GaW5kKCcgJyk7DQorICB9DQorICBpZiAoblNwbGl0SW5kZXggPCAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHdzRGF0ZSA9IHdzRGF0ZVRpbWUuTGVmdChuU3BsaXRJbmRleCk7DQorICBpZiAoIXdzRGF0ZS5Jc0VtcHR5KCkpIHsNCisgICAgaW50MzJfdCBpQ291bnQgPSB3c0RhdGUuR2V0TGVuZ3RoKCk7DQorICAgIGludDMyX3QgaSA9IDA7DQorICAgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgIGlmICh3c0RhdGVbaV0gPj0gJzAnICYmIHdzRGF0ZVtpXSA8PSAnOScpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoaSA9PSBpQ291bnQpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgIH0NCisgIHdzVGltZSA9IHdzRGF0ZVRpbWUuUmlnaHQod3NEYXRlVGltZS5HZXRMZW5ndGgoKSAtIG5TcGxpdEluZGV4IC0gMSk7DQorICBpZiAoIXdzVGltZS5Jc0VtcHR5KCkpIHsNCisgICAgaW50MzJfdCBpQ291bnQgPSB3c1RpbWUuR2V0TGVuZ3RoKCk7DQorICAgIGludDMyX3QgaSA9IDA7DQorICAgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgew0KKyAgICAgIGlmICh3c1RpbWVbaV0gPj0gJzAnICYmIHdzVGltZVtpXSA8PSAnOScpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoaSA9PSBpQ291bnQpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCisjaWZuZGVmIFhGQV9QQVJTRV9IQVNfTElORUlERU5USUZJRVINCitGWF9CT09MIENYRkFfRmllbGROb2RlX0lzUmljaFRleHRFZGl0KENYRkFfTm9kZSogcEZpZWxkTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfWE1MTm9kZSomIHBYTUxOb2RlKSB7DQorICBGWF9CT09MIGJSaWNoVGV4dEVkaXQgPSBGQUxTRTsNCisgIHBYTUxOb2RlID0gTlVMTDsNCisgIGlmIChwRmllbGROb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCisgICAgQ1hGQV9Ob2RlKiBwVmFsdWUgPSBwRmllbGROb2RlLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9WYWx1ZSk7DQorICAgIGlmICghcFZhbHVlKSB7DQorICAgICAgcmV0dXJuIGJSaWNoVGV4dEVkaXQ7DQorICAgIH0NCisgICAgQ1hGQV9Ob2RlKiBwQ2hpbGRWYWx1ZSA9IHBWYWx1ZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBpZiAoIXBDaGlsZFZhbHVlKSB7DQorICAgICAgcmV0dXJuIGJSaWNoVGV4dEVkaXQ7DQorICAgIH0NCisgICAgaWYgKHBDaGlsZFZhbHVlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRXhEYXRhKSB7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZTsNCisgICAgICBwQ2hpbGRWYWx1ZS0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIHdzQ29udGVudFR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7DQorICAgICAgYlJpY2hUZXh0RWRpdCA9IHdzQ29udGVudFR5cGUuRXF1YWwoRlhfV1NUUkMoTCJ0ZXh0L2h0bWwiKSk7DQorICAgICAgaWYgKGJSaWNoVGV4dEVkaXQpIHsNCisgICAgICAgIEZYX0JPT0wgYlhNTEluRGF0YSA9IEZBTFNFOw0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwRGF0YU5vZGUgPSBwRmllbGROb2RlLT5HZXRCaW5kRGF0YSgpOw0KKyAgICAgICAgaWYgKHBEYXRhTm9kZSkgew0KKyAgICAgICAgICBJRkRFX1hNTE5vZGUqIHBCaW5kWE1MID0gcERhdGFOb2RlLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgICAgICBGWFNZU19hc3NlcnQocEJpbmRYTUwpOw0KKyAgICAgICAgICBJRkRFX1hNTE5vZGUqIHBWYWx1ZVhNTCA9DQorICAgICAgICAgICAgICBwQmluZFhNTC0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsNCisgICAgICAgICAgaWYgKHBWYWx1ZVhNTCAmJiBwVmFsdWVYTUwtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICAgICAgcFhNTE5vZGUgPSBwVmFsdWVYTUw7DQorICAgICAgICAgICAgYlhNTEluRGF0YSA9IFRSVUU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmICghYlhNTEluRGF0YSkgew0KKyAgICAgICAgICBwWE1MTm9kZSA9IHBDaGlsZFZhbHVlLT5HZXRYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGJSaWNoVGV4dEVkaXQ7DQorfQ0KKyNlbmRpZg0KK0ZYX0JPT0wgQ1hGQV9XaWRnZXREYXRhOjpHZXRWYWx1ZShDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1ZBTFVFUElDVFVSRSBlVmFsdWVUeXBlKSB7DQorI2lmZGVmIFhGQV9QQVJTRV9IQVNfTElORUlERU5USUZJRVINCisgIHdzVmFsdWUgPSBtX3BOb2RlLT5HZXRDb250ZW50KCk7DQorI2Vsc2UNCisgIElGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBOVUxMOw0KKyAgRlhfQk9PTCBiUmljaFRleHRFZGl0ID0gQ1hGQV9GaWVsZE5vZGVfSXNSaWNoVGV4dEVkaXQobV9wTm9kZSwgcFhNTE5vZGUpOw0KKyAgaWYgKGJSaWNoVGV4dEVkaXQpIHsNCisgICAgWEZBX0dldFBsYWluVGV4dEZyb21SaWNoVGV4dChwWE1MTm9kZSwgd3NWYWx1ZSk7DQorICB9IGVsc2Ugew0KKyAgICB3c1ZhbHVlID0gbV9wTm9kZS0+R2V0Q29udGVudCgpOw0KKyAgfQ0KKyNlbmRpZg0KKyAgaWYgKGVWYWx1ZVR5cGUgPT0gWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KSB7DQorICAgIEdldEl0ZW1MYWJlbCh3c1ZhbHVlLCB3c1ZhbHVlKTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzUGljdHVyZTsNCisgIEdldFBpY3R1cmVDb250ZW50KHdzUGljdHVyZSwgZVZhbHVlVHlwZSk7DQorICBDWEZBX05vZGUqIHBOb2RlID0gR2V0VUlDaGlsZCgpOw0KKyAgaWYgKCFwTm9kZSkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIFhGQV9FTEVNRU5UIHVpVHlwZSA9IEdldFVJQ2hpbGQoKS0+R2V0Q2xhc3NJRCgpOw0KKyAgc3dpdGNoICh1aVR5cGUpIHsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9DaG9pY2VMaXN0OiB7DQorICAgICAgaWYgKGVWYWx1ZVR5cGUgPT0gWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KSB7DQorICAgICAgICBpbnQzMl90IGlTZWxJdGVtSW5kZXggPSBHZXRTZWxlY3RlZEl0ZW0oMCk7DQorICAgICAgICBpZiAoaVNlbEl0ZW1JbmRleCA+PSAwKSB7DQorICAgICAgICAgIEdldENob2ljZUxpc3RJdGVtKHdzVmFsdWUsIGlTZWxJdGVtSW5kZXgpOw0KKyAgICAgICAgICB3c1BpY3R1cmUuRW1wdHkoKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0gYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfTnVtZXJpY0VkaXQ6DQorICAgICAgaWYgKGVWYWx1ZVR5cGUgIT0gWEZBX1ZBTFVFUElDVFVSRV9SYXcgJiYgd3NQaWN0dXJlLklzRW1wdHkoKSkgew0KKyAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldExvY2FsKCk7DQorICAgICAgICBpZiAoZVZhbHVlVHlwZSA9PSBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkgJiYgcExvY2FsZSkgew0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c091dHB1dDsNCisgICAgICAgICAgTm9ybWFsaXplTnVtU3RyKHdzVmFsdWUsIHdzT3V0cHV0KTsNCisgICAgICAgICAgRm9ybWF0TnVtU3RyKHdzT3V0cHV0LCBwTG9jYWxlLCB3c091dHB1dCk7DQorICAgICAgICAgIHdzVmFsdWUgPSB3c091dHB1dDsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICBpZiAod3NQaWN0dXJlLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIGlmIChJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0TG9jYWwoKSkgew0KKyAgICBDWEZBX0xvY2FsZVZhbHVlIHdpZGdldFZhbHVlID0gWEZBX0dldExvY2FsZVZhbHVlKHRoaXMpOw0KKyAgICBDWEZBX0xvY2FsZU1nciogcExvY2FsTWdyID0gbV9wTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0TG9jYWxNZ3IoKTsNCisgICAgc3dpdGNoICh3aWRnZXRWYWx1ZS5HZXRUeXBlKCkpIHsNCisgICAgICBjYXNlIFhGQV9WVF9EQVRFOiB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGUsIHdzVGltZTsNCisgICAgICAgIGlmIChYRkFfU3BsaXREYXRlVGltZSh3c1ZhbHVlLCB3c0RhdGUsIHdzVGltZSkpIHsNCisgICAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSBkYXRlKFhGQV9WVF9EQVRFLCB3c0RhdGUsIHBMb2NhbE1ncik7DQorICAgICAgICAgIGlmIChkYXRlLkZvcm1hdFBhdHRlcm5zKHdzVmFsdWUsIHdzUGljdHVyZSwgcExvY2FsZSwgZVZhbHVlVHlwZSkpIHsNCisgICAgICAgICAgICByZXR1cm4gVFJVRTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGNhc2UgWEZBX1ZUX1RJTUU6IHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZSwgd3NUaW1lOw0KKyAgICAgICAgaWYgKFhGQV9TcGxpdERhdGVUaW1lKHdzVmFsdWUsIHdzRGF0ZSwgd3NUaW1lKSkgew0KKyAgICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIHRpbWUoWEZBX1ZUX1RJTUUsIHdzVGltZSwgcExvY2FsTWdyKTsNCisgICAgICAgICAgaWYgKHRpbWUuRm9ybWF0UGF0dGVybnMod3NWYWx1ZSwgd3NQaWN0dXJlLCBwTG9jYWxlLCBlVmFsdWVUeXBlKSkgew0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHdpZGdldFZhbHVlLkZvcm1hdFBhdHRlcm5zKHdzVmFsdWUsIHdzUGljdHVyZSwgcExvY2FsZSwgZVZhbHVlVHlwZSk7DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldE5vcm1hbGl6ZURhdGFWYWx1ZSgNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1ZhbHVlLA0KKyAgICBDRlhfV2lkZVN0cmluZyYgd3NOb3JtYWxpemVWYWx1ZSkgew0KKyAgd3NOb3JtYWxpemVWYWx1ZSA9IHdzVmFsdWU7DQorICBpZiAod3NWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1BpY3R1cmU7DQorICBHZXRQaWN0dXJlQ29udGVudCh3c1BpY3R1cmUsIFhGQV9WQUxVRVBJQ1RVUkVfRGF0YUJpbmQpOw0KKyAgaWYgKHdzUGljdHVyZS5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBGWFNZU19hc3NlcnQoR2V0Tm9kZSgpKTsNCisgIENYRkFfTG9jYWxlTWdyKiBwTG9jYWxNZ3IgPSBHZXROb2RlKCktPkdldERvY3VtZW50KCktPkdldExvY2FsTWdyKCk7DQorICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0TG9jYWwoKTsNCisgIENYRkFfTG9jYWxlVmFsdWUgd2lkZ2V0VmFsdWUgPSBYRkFfR2V0TG9jYWxlVmFsdWUodGhpcyk7DQorICBpZiAod2lkZ2V0VmFsdWUuVmFsaWRhdGVWYWx1ZSh3c1ZhbHVlLCB3c1BpY3R1cmUsIHBMb2NhbGUsICZ3c1BpY3R1cmUpKSB7DQorICAgIHdpZGdldFZhbHVlID0gQ1hGQV9Mb2NhbGVWYWx1ZSh3aWRnZXRWYWx1ZS5HZXRUeXBlKCksIHdzTm9ybWFsaXplVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1BpY3R1cmUsIHBMb2NhbGUsIHBMb2NhbE1ncik7DQorICAgIHdzTm9ybWFsaXplVmFsdWUgPSB3aWRnZXRWYWx1ZS5HZXRWYWx1ZSgpOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX1dpZGdldERhdGE6OkdldEZvcm1hdERhdGFWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXRlZFZhbHVlKSB7DQorICB3c0Zvcm1hdGVkVmFsdWUgPSB3c1ZhbHVlOw0KKyAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NQaWN0dXJlOw0KKyAgR2V0UGljdHVyZUNvbnRlbnQod3NQaWN0dXJlLCBYRkFfVkFMVUVQSUNUVVJFX0RhdGFCaW5kKTsNCisgIGlmICh3c1BpY3R1cmUuSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgaWYgKElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBHZXRMb2NhbCgpKSB7DQorICAgIEZYU1lTX2Fzc2VydChHZXROb2RlKCkpOw0KKyAgICBDWEZBX05vZGUqIHBOb2RlVmFsdWUgPSBHZXROb2RlKCktPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1ZhbHVlKTsNCisgICAgaWYgKCFwTm9kZVZhbHVlKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcFZhbHVlQ2hpbGQgPSBwTm9kZVZhbHVlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgIGlmICghcFZhbHVlQ2hpbGQpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgaW50MzJfdCBpVlRUeXBlID0gWEZBX1ZUX05VTEw7DQorICAgIFhGQV9FTEVNRU5UIGVUeXBlID0gcFZhbHVlQ2hpbGQtPkdldENsYXNzSUQoKTsNCisgICAgc3dpdGNoIChlVHlwZSkgew0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRGVjaW1hbDoNCisgICAgICAgIGlWVFR5cGUgPSBYRkFfVlRfREVDSU1BTDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfRmxvYXQ6DQorICAgICAgICBpVlRUeXBlID0gWEZBX1ZUX0ZMT0FUOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9EYXRlOg0KKyAgICAgICAgaVZUVHlwZSA9IFhGQV9WVF9EQVRFOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9UaW1lOg0KKyAgICAgICAgaVZUVHlwZSA9IFhGQV9WVF9USU1FOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9EYXRlVGltZToNCisgICAgICAgIGlWVFR5cGUgPSBYRkFfVlRfREFURVRJTUU7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0Jvb2xlYW46DQorICAgICAgICBpVlRUeXBlID0gWEZBX1ZUX0JPT0xFQU47DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0ludGVnZXI6DQorICAgICAgICBpVlRUeXBlID0gWEZBX1ZUX0lOVEVHRVI7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX1RleHQ6DQorICAgICAgICBpVlRUeXBlID0gWEZBX1ZUX1RFWFQ7DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgaVZUVHlwZSA9IFhGQV9WVF9OVUxMOw0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgQ1hGQV9Mb2NhbGVNZ3IqIHBMb2NhbE1nciA9IEdldE5vZGUoKS0+R2V0RG9jdW1lbnQoKS0+R2V0TG9jYWxNZ3IoKTsNCisgICAgQ1hGQV9Mb2NhbGVWYWx1ZSB3aWRnZXRWYWx1ZShpVlRUeXBlLCB3c1ZhbHVlLCBwTG9jYWxNZ3IpOw0KKyAgICBzd2l0Y2ggKHdpZGdldFZhbHVlLkdldFR5cGUoKSkgew0KKyAgICAgIGNhc2UgWEZBX1ZUX0RBVEU6IHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZSwgd3NUaW1lOw0KKyAgICAgICAgaWYgKFhGQV9TcGxpdERhdGVUaW1lKHdzVmFsdWUsIHdzRGF0ZSwgd3NUaW1lKSkgew0KKyAgICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIGRhdGUoWEZBX1ZUX0RBVEUsIHdzRGF0ZSwgcExvY2FsTWdyKTsNCisgICAgICAgICAgaWYgKGRhdGUuRm9ybWF0UGF0dGVybnMod3NGb3JtYXRlZFZhbHVlLCB3c1BpY3R1cmUsIHBMb2NhbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9WQUxVRVBJQ1RVUkVfRGF0YUJpbmQpKSB7DQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBjYXNlIFhGQV9WVF9USU1FOiB7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGUsIHdzVGltZTsNCisgICAgICAgIGlmIChYRkFfU3BsaXREYXRlVGltZSh3c1ZhbHVlLCB3c0RhdGUsIHdzVGltZSkpIHsNCisgICAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSB0aW1lKFhGQV9WVF9USU1FLCB3c1RpbWUsIHBMb2NhbE1ncik7DQorICAgICAgICAgIGlmICh0aW1lLkZvcm1hdFBhdHRlcm5zKHdzRm9ybWF0ZWRWYWx1ZSwgd3NQaWN0dXJlLCBwTG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfVkFMVUVQSUNUVVJFX0RhdGFCaW5kKSkgew0KKyAgICAgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHdpZGdldFZhbHVlLkZvcm1hdFBhdHRlcm5zKHdzRm9ybWF0ZWRWYWx1ZSwgd3NQaWN0dXJlLCBwTG9jYWxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfVkFMVUVQSUNUVVJFX0RhdGFCaW5kKTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDWEZBX1dpZGdldERhdGE6Ok5vcm1hbGl6ZU51bVN0cihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkgew0KKyAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHdzT3V0cHV0ID0gd3NWYWx1ZTsNCisgIHdzT3V0cHV0LlRyaW1MZWZ0KCcwJyk7DQorICBpbnQzMl90IGRvdF9pbmRleCA9IHdzT3V0cHV0LkZpbmQoJy4nKTsNCisgIGludDMyX3QgaUZyYWNEaWdpdHMgPSAwOw0KKyAgaWYgKCF3c091dHB1dC5Jc0VtcHR5KCkgJiYgZG90X2luZGV4ID49IDAgJiYNCisgICAgICAoIUdldEZyYWNEaWdpdHMoaUZyYWNEaWdpdHMpIHx8IGlGcmFjRGlnaXRzICE9IC0xKSkgew0KKyAgICB3c091dHB1dC5UcmltUmlnaHQoTCIwIik7DQorICAgIHdzT3V0cHV0LlRyaW1SaWdodChMIi4iKTsNCisgIH0NCisgIGlmICh3c091dHB1dC5Jc0VtcHR5KCkgfHwgd3NPdXRwdXRbMF0gPT0gJy4nKSB7DQorICAgIHdzT3V0cHV0Lkluc2VydCgwLCAnMCcpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfV2lkZ2V0RGF0YTo6Rm9ybWF0TnVtU3RyKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkgew0KKyAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzU3JjTnVtID0gd3NWYWx1ZTsNCisgIENGWF9XaWRlU3RyaW5nIHdzR3JvdXBTeW1ib2w7DQorICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfR3JvdXBpbmcsIHdzR3JvdXBTeW1ib2wpOw0KKyAgRlhfQk9PTCBiTmVnID0gRkFMU0U7DQorICBpZiAod3NTcmNOdW1bMF0gPT0gJy0nKSB7DQorICAgIGJOZWcgPSBUUlVFOw0KKyAgICB3c1NyY051bS5EZWxldGUoMCwgMSk7DQorICB9DQorICBpbnQzMl90IGxlbiA9IHdzU3JjTnVtLkdldExlbmd0aCgpOw0KKyAgaW50MzJfdCBkb3RfaW5kZXggPSB3c1NyY051bS5GaW5kKCcuJyk7DQorICBpZiAoZG90X2luZGV4ID09IC0xKSB7DQorICAgIGRvdF9pbmRleCA9IGxlbjsNCisgIH0NCisgIGludDMyX3QgY2MgPSBkb3RfaW5kZXggLSAxOw0KKyAgaWYgKGNjID49IDApIHsNCisgICAgaW50IG5Qb3MgPSBkb3RfaW5kZXggJSAzOw0KKyAgICB3c091dHB1dC5FbXB0eSgpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBkb3RfaW5kZXg7IGkrKykgew0KKyAgICAgIGlmIChpICUgMyA9PSBuUG9zICYmIGkgIT0gMCkgew0KKyAgICAgICAgd3NPdXRwdXQgKz0gd3NHcm91cFN5bWJvbDsNCisgICAgICB9DQorICAgICAgd3NPdXRwdXQgKz0gd3NTcmNOdW1baV07DQorICAgIH0NCisgICAgaWYgKGRvdF9pbmRleCA8IGxlbikgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOw0KKyAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9EZWNpbWFsLCB3c1N5bWJvbCk7DQorICAgICAgd3NPdXRwdXQgKz0gd3NTeW1ib2w7DQorICAgICAgd3NPdXRwdXQgKz0gd3NTcmNOdW0uUmlnaHQobGVuIC0gZG90X2luZGV4IC0gMSk7DQorICAgIH0NCisgICAgaWYgKGJOZWcpIHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c01pbnVzeW1ib2w7DQorICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzLCB3c01pbnVzeW1ib2wpOw0KKyAgICAgIHdzT3V0cHV0ID0gd3NNaW51c3ltYm9sICsgd3NPdXRwdXQ7DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDWEZBX1dpZGdldERhdGE6OlN5bmNWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYk5vdGlmeSkgew0KKyAgaWYgKCFtX3BOb2RlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0VmFsdWUod3NWYWx1ZSk7DQorICBDWEZBX1dpZGdldERhdGEqIHBDb250YWluZXJXaWRnZXREYXRhID0gbV9wTm9kZS0+R2V0Q29udGFpbmVyV2lkZ2V0RGF0YSgpOw0KKyAgaWYgKHBDb250YWluZXJXaWRnZXREYXRhKSB7DQorICAgIHBDb250YWluZXJXaWRnZXREYXRhLT5HZXRGb3JtYXREYXRhVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXRWYWx1ZSk7DQorICB9DQorICBtX3BOb2RlLT5TZXRDb250ZW50KHdzVmFsdWUsIHdzRm9ybWF0VmFsdWUsIGJOb3RpZnkpOw0KK30NCit2b2lkIENYRkFfV2lkZ2V0RGF0YTo6SW5zZXJ0TGlzdFRleHRJdGVtKENYRkFfTm9kZSogcEl0ZW1zLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCkgew0KKyAgQ1hGQV9Ob2RlKiBwVGV4dCA9IHBJdGVtcy0+Q3JlYXRlU2FtZVBhY2tldE5vZGUoWEZBX0VMRU1FTlRfVGV4dCk7DQorICBwSXRlbXMtPkluc2VydENoaWxkKG5JbmRleCwgcFRleHQpOw0KKyAgcFRleHQtPlNldENvbnRlbnQod3NUZXh0LCB3c1RleHQsIEZBTFNFLCBGQUxTRSwgRkFMU0UpOw0KK30NCitDWEZBX0ZpbHRlciBDWEZBX1dpZGdldERhdGE6OkdldEZpbHRlcihGWF9CT09MIGJNb2RpZmllZCkgew0KKyAgaWYgKCFtX3BVaUNoaWxkTm9kZSkgew0KKyAgICByZXR1cm4gQ1hGQV9GaWx0ZXIoTlVMTCk7DQorICB9DQorICByZXR1cm4gbV9wVWlDaGlsZE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0ZpbHRlciwgYk1vZGlmaWVkKTsNCit9DQorQ1hGQV9NYW5pZmVzdCBDWEZBX1dpZGdldERhdGE6OkdldE1hbmlmZXN0KEZYX0JPT0wgYk1vZGlmaWVkKSB7DQorICBpZiAoIW1fcFVpQ2hpbGROb2RlKSB7DQorICAgIHJldHVybiBDWEZBX01hbmlmZXN0KE5VTEwpOw0KKyAgfQ0KKyAgcmV0dXJuIG1fcFVpQ2hpbGROb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9NYW5pZmVzdCwgYk1vZGlmaWVkKTsNCit9DQorQ1hGQV9PY2N1cjo6Q1hGQV9PY2N1cihDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30NCitpbnQzMl90IENYRkFfT2NjdXI6OkdldE1heCgpIHsNCisgIGludDMyX3QgaU1heCA9IDE7DQorICBpZiAobV9wTm9kZSkgew0KKyAgICBpZiAoIW1fcE5vZGUtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9NYXgsIGlNYXgsIFRSVUUpKSB7DQorICAgICAgaU1heCA9IEdldE1pbigpOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gaU1heDsNCit9DQoraW50MzJfdCBDWEZBX09jY3VyOjpHZXRNaW4oKSB7DQorICBpbnQzMl90IGlNaW4gPSAxOw0KKyAgaWYgKG1fcE5vZGUpIHsNCisgICAgaWYgKCFtX3BOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWluLCBpTWluLCBUUlVFKSB8fCBpTWluIDwgMCkgew0KKyAgICAgIGlNaW4gPSAxOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gaU1pbjsNCit9DQoraW50MzJfdCBDWEZBX09jY3VyOjpHZXRJbml0aWFsKCkgew0KKyAgaW50MzJfdCBpSW5pdCA9IDE7DQorICBpZiAobV9wTm9kZSkgew0KKyAgICBpbnQzMl90IGlNaW4gPSBHZXRNaW4oKTsNCisgICAgaWYgKCFtX3BOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfSW5pdGlhbCwgaUluaXQsIFRSVUUpIHx8DQorICAgICAgICBpSW5pdCA8IGlNaW4pIHsNCisgICAgICBpSW5pdCA9IGlNaW47DQorICAgIH0NCisgIH0NCisgIHJldHVybiBpSW5pdDsNCit9DQorRlhfQk9PTCBDWEZBX09jY3VyOjpHZXRPY2N1ckluZm8oaW50MzJfdCYgaU1pbiwgaW50MzJfdCYgaU1heCwgaW50MzJfdCYgaUluaXQpIHsNCisgIGlmICghbV9wTm9kZSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBpZiAoIW1fcE5vZGUtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9NaW4sIGlNaW4sIEZBTFNFKSB8fCBpTWluIDwgMCkgew0KKyAgICBpTWluID0gMTsNCisgIH0NCisgIGlmICghbV9wTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX01heCwgaU1heCwgRkFMU0UpKSB7DQorICAgIGlmIChpTWluID09IDApIHsNCisgICAgICBpTWF4ID0gMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpTWF4ID0gaU1pbjsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKCFtX3BOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfSW5pdGlhbCwgaUluaXQsIEZBTFNFKSB8fA0KKyAgICAgIGlJbml0IDwgaU1pbikgew0KKyAgICBpSW5pdCA9IGlNaW47DQorICB9DQorICByZXR1cm4gVFJVRTsNCit9DQordm9pZCBDWEZBX09jY3VyOjpTZXRNYXgoaW50MzJfdCBpTWF4KSB7DQorICBpTWF4ID0gKGlNYXggIT0gLTEgJiYgaU1heCA8IDEpID8gMSA6IGlNYXg7DQorICBtX3BOb2RlLT5TZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWF4LCBpTWF4LCBGQUxTRSk7DQorICBpbnQzMl90IGlNaW4gPSBHZXRNaW4oKTsNCisgIGlmIChpTWF4ICE9IC0xICYmIGlNYXggPCBpTWluKSB7DQorICAgIGlNaW4gPSBpTWF4Ow0KKyAgICBtX3BOb2RlLT5TZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWluLCBpTWluLCBGQUxTRSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9PY2N1cjo6U2V0TWluKGludDMyX3QgaU1pbikgew0KKyAgaU1pbiA9IChpTWluIDwgMCkgPyAxIDogaU1pbjsNCisgIG1fcE5vZGUtPlNldEludGVnZXIoWEZBX0FUVFJJQlVURV9NaW4sIGlNaW4sIEZBTFNFKTsNCisgIGludDMyX3QgaU1heCA9IEdldE1heCgpOw0KKyAgaWYgKGlNYXggPiAwICYmIGlNYXggPCBpTWluKSB7DQorICAgIGlNYXggPSBpTWluOw0KKyAgICBtX3BOb2RlLT5TZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWF4LCBpTWF4LCBGQUxTRSk7DQorICB9DQorfQ0KK1hGQV9BVFRSSUJVVEVFTlVNIFhGQV9HZXRFbnVtVHlwZUF0dHJpYnV0ZSgNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSwNCisgICAgWEZBX0FUVFJJQlVURSBhdHRyaWJ1dGVWYWx1ZSA9IFhGQV9BVFRSSUJVVEVfVHlwZSwNCisgICAgWEZBX0FUVFJJQlVURUVOVU0gZURlZmF1bHRWYWx1ZSA9IFhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsKSB7DQorICBYRkFfQVRUUklCVVRFRU5VTSBlVHlwZSA9IGVEZWZhdWx0VmFsdWU7DQorICBpZiAocE5vZGUpIHsNCisgICAgaWYgKCFwTm9kZS0+VHJ5RW51bShhdHRyaWJ1dGVWYWx1ZSwgZVR5cGUsIFRSVUUpKSB7DQorICAgICAgZVR5cGUgPSBlRGVmYXVsdFZhbHVlOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gZVR5cGU7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfRmlsdGVyOjpHZXRGaWx0ZXJTdHJpbmcoWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1N0cmluZ1ZhbHVlOw0KKyAgaWYgKG1fcE5vZGUpIHsNCisgICAgbV9wTm9kZS0+R2V0QXR0cmlidXRlKGVBdHRyaWJ1dGUsIHdzU3RyaW5nVmFsdWUsIEZBTFNFKTsNCisgIH0NCisgIHJldHVybiB3c1N0cmluZ1ZhbHVlOw0KK30NCitYRkFfQVRUUklCVVRFRU5VTSBDWEZBX0ZpbHRlcjo6R2V0QXBwZWFyYW5jZUZpbHRlclR5cGUoKSB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwQXBwZWFyYW5jZUZpbHRlck5vZGUgPQ0KKyAgICAgIG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0FwcGVhcmFuY2VGaWx0ZXIpOw0KKyAgcmV0dXJuIFhGQV9HZXRFbnVtVHlwZUF0dHJpYnV0ZShwQXBwZWFyYW5jZUZpbHRlck5vZGUpOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX0ZpbHRlcjo6R2V0QXBwZWFyYW5jZUZpbHRlckNvbnRlbnQoKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQorICBpZiAobV9wTm9kZSkgew0KKyAgICBDWEZBX05vZGUqIHBBcHBlYXJhbmNlRmlsdGVyTm9kZSA9DQorICAgICAgICBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9BcHBlYXJhbmNlRmlsdGVyKTsNCisgICAgcEFwcGVhcmFuY2VGaWx0ZXJOb2RlLT5UcnlDb250ZW50KHdzQ29udGVudCk7DQorICB9DQorICByZXR1cm4gd3NDb250ZW50Ow0KK30NCitYRkFfQVRUUklCVVRFRU5VTSBDWEZBX0ZpbHRlcjo6R2V0Q2VydGlmaWNhdGVzQ3JlZGVudGlhbFNlcnZlclBvbGljeSgpIHsNCisgIGlmICghbV9wTm9kZSkgew0KKyAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWw7DQorICB9DQorICBDWEZBX05vZGUqIHBDZXJ0c05vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZXMpOw0KKyAgcmV0dXJuIFhGQV9HZXRFbnVtVHlwZUF0dHJpYnV0ZShwQ2VydHNOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFX0NyZWRlbnRpYWxTZXJ2ZXJQb2xpY3kpOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX0ZpbHRlcjo6R2V0Q2VydGlmaWNhdGVzVVJMKCkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NVUkw7DQorICBpZiAobV9wTm9kZSkgew0KKyAgICBDWEZBX05vZGUqIHBDZXJ0c05vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZXMpOw0KKyAgICBwQ2VydHNOb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9VcmwsIHdzVVJMLCBGQUxTRSk7DQorICB9DQorICByZXR1cm4gd3NVUkw7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfRmlsdGVyOjpHZXRDZXJ0aWZpY2F0ZXNVUkxQb2xpY3koKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1VSTFBvbGljeTsNCisgIGlmIChtX3BOb2RlKSB7DQorICAgIENYRkFfTm9kZSogcENlcnRzTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0NlcnRpZmljYXRlcyk7DQorICAgIHBDZXJ0c05vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX1VybFBvbGljeSwgd3NVUkxQb2xpY3ksIEZBTFNFKTsNCisgIH0NCisgIHJldHVybiB3c1VSTFBvbGljeTsNCit9DQorQ1hGQV9XcmFwQ2VydGlmaWNhdGUgQ1hGQV9GaWx0ZXI6OkdldENlcnRpZmljYXRlc0VuY3J5cHRpb24oRlhfQk9PTCBiTW9kaWZpZWQpIHsNCisgIGlmICghbV9wTm9kZSkgew0KKyAgICByZXR1cm4gQ1hGQV9XcmFwQ2VydGlmaWNhdGUoTlVMTCk7DQorICB9DQorICBDWEZBX05vZGUqIHBDZXJ0c05vZGUgPQ0KKyAgICAgIG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0NlcnRpZmljYXRlcywgYk1vZGlmaWVkKTsNCisgIHJldHVybiBDWEZBX1dyYXBDZXJ0aWZpY2F0ZSgNCisgICAgICBwQ2VydHNOb2RlID8gcENlcnRzTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfRW5jcnlwdGlvbiwgYk1vZGlmaWVkKQ0KKyAgICAgICAgICAgICAgICAgOiBOVUxMKTsNCit9DQorQ1hGQV9XcmFwQ2VydGlmaWNhdGUgQ1hGQV9GaWx0ZXI6OkdldENlcnRpZmljYXRlc0lzc3VlcnMoRlhfQk9PTCBiTW9kaWZpZWQpIHsNCisgIGlmICghbV9wTm9kZSkgew0KKyAgICByZXR1cm4gQ1hGQV9XcmFwQ2VydGlmaWNhdGUoTlVMTCk7DQorICB9DQorICBDWEZBX05vZGUqIHBDZXJ0c05vZGUgPQ0KKyAgICAgIG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0NlcnRpZmljYXRlcywgYk1vZGlmaWVkKTsNCisgIHJldHVybiBDWEZBX1dyYXBDZXJ0aWZpY2F0ZSgNCisgICAgICBwQ2VydHNOb2RlID8gcENlcnRzTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfSXNzdWVycywgYk1vZGlmaWVkKQ0KKyAgICAgICAgICAgICAgICAgOiBOVUxMKTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9GaWx0ZXI6OkdldENlcnRpZmljYXRlc0tleVVzYWdlU3RyaW5nKA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmICghbV9wTm9kZSkgew0KKyAgICByZXR1cm4gRlhfV1NUUkMoTCIiKTsNCisgIH0NCisgIENYRkFfTm9kZSogcENlcnRzTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0NlcnRpZmljYXRlcyk7DQorICBDWEZBX05vZGUqIHBLZXlVc2FnZU5vZGUgPSBwQ2VydHNOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9LZXlVc2FnZSk7DQorICBDRlhfV2lkZVN0cmluZyB3c0F0dHJpYnV0ZVZhbHVlOw0KKyAgcEtleVVzYWdlTm9kZS0+R2V0QXR0cmlidXRlKGVBdHRyaWJ1dGUsIHdzQXR0cmlidXRlVmFsdWUsIEZBTFNFKTsNCisgIHJldHVybiB3c0F0dHJpYnV0ZVZhbHVlOw0KK30NCitDWEZBX09pZHMgQ1hGQV9GaWx0ZXI6OkdldENlcnRpZmljYXRlc09pZHMoKSB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIENYRkFfT2lkcyhOVUxMKTsNCisgIH0NCisgIENYRkFfTm9kZSogcENlcnRzTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX0NlcnRpZmljYXRlcyk7DQorICByZXR1cm4gQ1hGQV9PaWRzKHBDZXJ0c05vZGUgPyBwQ2VydHNOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9PaWRzKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTCk7DQorfQ0KK0NYRkFfV3JhcENlcnRpZmljYXRlIENYRkFfRmlsdGVyOjpHZXRDZXJ0aWZpY2F0ZXNTaWduaW5nKEZYX0JPT0wgYk1vZGlmaWVkKSB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIENYRkFfV3JhcENlcnRpZmljYXRlKE5VTEwpOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwQ2VydHNOb2RlID0NCisgICAgICBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9DZXJ0aWZpY2F0ZXMsIGJNb2RpZmllZCk7DQorICByZXR1cm4gQ1hGQV9XcmFwQ2VydGlmaWNhdGUoDQorICAgICAgcENlcnRzTm9kZSA/IHBDZXJ0c05vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX1NpZ25pbmcsIGJNb2RpZmllZCkNCisgICAgICAgICAgICAgICAgIDogTlVMTCk7DQorfQ0KK0NYRkFfRGlnZXN0TWV0aG9kcyBDWEZBX0ZpbHRlcjo6R2V0RGlnZXN0TWV0aG9kcyhGWF9CT09MIGJNb2RpZmllZCkgew0KKyAgcmV0dXJuIENYRkFfRGlnZXN0TWV0aG9kcygNCisgICAgICBtX3BOb2RlID8gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfRGlnZXN0TWV0aG9kcywgYk1vZGlmaWVkKQ0KKyAgICAgICAgICAgICAgOiBOVUxMKTsNCit9DQorQ1hGQV9FbmNvZGluZ3MgQ1hGQV9GaWx0ZXI6OkdldEVuY29kaW5ncyhGWF9CT09MIGJNb2RpZmllZCkgew0KKyAgcmV0dXJuIENYRkFfRW5jb2RpbmdzKA0KKyAgICAgIG1fcE5vZGUgPyBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9FbmNvZGluZ3MsIGJNb2RpZmllZCkNCisgICAgICAgICAgICAgIDogTlVMTCk7DQorfQ0KK0NYRkFfRW5jcnlwdGlvbk1ldGhvZHMgQ1hGQV9GaWx0ZXI6OkdldEVuY3J5cHRpb25NZXRob2RzKEZYX0JPT0wgYk1vZGlmaWVkKSB7DQorICByZXR1cm4gQ1hGQV9FbmNyeXB0aW9uTWV0aG9kcygNCisgICAgICBtX3BOb2RlDQorICAgICAgICAgID8gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfRW5jcnlwdGlvbk1ldGhvZHMsIGJNb2RpZmllZCkNCisgICAgICAgICAgOiBOVUxMKTsNCit9DQorWEZBX0FUVFJJQlVURUVOVU0gQ1hGQV9GaWx0ZXI6OkdldEhhbmRsZXJUeXBlKCkgew0KKyAgaWYgKCFtX3BOb2RlKSB7DQorICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbDsNCisgIH0NCisgIENYRkFfTm9kZSogcEhhbmRsZXJOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfSGFuZGxlcik7DQorICByZXR1cm4gWEZBX0dldEVudW1UeXBlQXR0cmlidXRlKHBIYW5kbGVyTm9kZSk7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfRmlsdGVyOjpHZXRIYW5kbGVyQ29udGVudCgpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsNCisgIGlmIChtX3BOb2RlKSB7DQorICAgIENYRkFfTm9kZSogcEhhbmRsZXJOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfSGFuZGxlcik7DQorICAgIHBIYW5kbGVyTm9kZS0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOw0KKyAgfQ0KKyAgcmV0dXJuIHdzQ29udGVudDsNCit9DQorWEZBX0FUVFJJQlVURUVOVU0gQ1hGQV9GaWx0ZXI6OkdldGxvY2tEb2N1bWVudFR5cGUoKSB7DQorICBpZiAoIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTG9ja0RvY05vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9Mb2NrRG9jdW1lbnQpOw0KKyAgcmV0dXJuIFhGQV9HZXRFbnVtVHlwZUF0dHJpYnV0ZShwTG9ja0RvY05vZGUpOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX0ZpbHRlcjo6R2V0bG9ja0RvY3VtZW50Q29udGVudCgpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudCA9IEZYX1dTVFJDKEwiYXV0byIpOw0KKyAgaWYgKG1fcE5vZGUpIHsNCisgICAgQ1hGQV9Ob2RlKiBwTG9ja0RvY05vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9Mb2NrRG9jdW1lbnQpOw0KKyAgICBwTG9ja0RvY05vZGUtPlRyeUNvbnRlbnQod3NDb250ZW50KTsNCisgIH0NCisgIHJldHVybiB3c0NvbnRlbnQ7DQorfQ0KK2ludDMyX3QgQ1hGQV9GaWx0ZXI6OkdldE1EUFBlcm1pc3Npb25zKCkgew0KKyAgaW50MzJfdCBpUGVybWlzc2lvbnMgPSAyOw0KKyAgaWYgKG1fcE5vZGUpIHsNCisgICAgQ1hGQV9Ob2RlKiBwTURQTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FTEVNRU5UX01kcCk7DQorICAgIGlmICghcE1EUE5vZGUtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9QZXJtaXNzaW9ucywgaVBlcm1pc3Npb25zLCBUUlVFKSkgew0KKyAgICAgIGlQZXJtaXNzaW9ucyA9IDI7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBpUGVybWlzc2lvbnM7DQorfQ0KK1hGQV9BVFRSSUJVVEVFTlVNIENYRkFfRmlsdGVyOjpHZXRNRFBTaWduYXR1cmVUeXBlKCkgew0KKyAgaWYgKCFtX3BOb2RlKSB7DQorICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9GaWx0ZXI7DQorICB9DQorICBDWEZBX05vZGUqIHBNRFBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfTWRwKTsNCisgIHJldHVybiBYRkFfR2V0RW51bVR5cGVBdHRyaWJ1dGUocE1EUE5vZGUsIFhGQV9BVFRSSUJVVEVfU2lnbmF0dXJlVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU1fRmlsdGVyKTsNCit9DQorQ1hGQV9SZWFzb25zIENYRkFfRmlsdGVyOjpHZXRSZWFzb25zKEZYX0JPT0wgYk1vZGlmaWVkKSB7DQorICByZXR1cm4gQ1hGQV9SZWFzb25zKG1fcE5vZGUgPyBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9SZWFzb25zKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTCk7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfRmlsdGVyOjpHZXRUaW1lU3RhbXBTZXJ2ZXIoKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c1NlcnZlclVSSTsNCisgIGlmIChtX3BOb2RlKSB7DQorICAgIENYRkFfTm9kZSogcFRpbWVTdGFtcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9UaW1lU3RhbXApOw0KKyAgICBwVGltZVN0YW1wTm9kZS0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfU2VydmVyLCB3c1NlcnZlclVSSSwgRkFMU0UpOw0KKyAgfQ0KKyAgcmV0dXJuIHdzU2VydmVyVVJJOw0KK30NCitYRkFfQVRUUklCVVRFRU5VTSBDWEZBX0ZpbHRlcjo6R2V0VGltZVN0YW1wVHlwZSgpIHsNCisgIGlmICghbV9wTm9kZSkgew0KKyAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWw7DQorICB9DQorICBDWEZBX05vZGUqIHBUaW1lU3RhbXBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfVGltZVN0YW1wKTsNCisgIHJldHVybiBYRkFfR2V0RW51bVR5cGVBdHRyaWJ1dGUocFRpbWVTdGFtcE5vZGUpOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX0NlcnRpZmljYXRlOjpHZXRDZXJ0aWZpY2F0ZU5hbWUoKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c05hbWU7DQorICBpZiAobV9wTm9kZSkgew0KKyAgICBtX3BOb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUsIEZBTFNFKTsNCisgIH0NCisgIHJldHVybiB3c05hbWU7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfQ2VydGlmaWNhdGU6OkdldENlcnRpZmljYXRlQ29udGVudCgpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsNCisgIGlmIChtX3BOb2RlKSB7DQorICAgIG1fcE5vZGUtPlRyeUNvbnRlbnQod3NDb250ZW50KTsNCisgIH0NCisgIHJldHVybiB3c0NvbnRlbnQ7DQorfQ0KK1hGQV9BVFRSSUJVVEVFTlVNIENYRkFfV3JhcENlcnRpZmljYXRlOjpHZXRUeXBlKCkgew0KKyAgcmV0dXJuIFhGQV9HZXRFbnVtVHlwZUF0dHJpYnV0ZShtX3BOb2RlKTsNCit9DQoraW50MzJfdCBDWEZBX1dyYXBDZXJ0aWZpY2F0ZTo6Q291bnRDZXJ0aWZpY2F0ZXMoKSB7DQorICByZXR1cm4gbV9wTm9kZSA/IG1fcE5vZGUtPkNvdW50Q2hpbGRyZW4oWEZBX0VMRU1FTlRfQ2VydGlmaWNhdGUpIDogMDsNCit9DQorQ1hGQV9DZXJ0aWZpY2F0ZSBDWEZBX1dyYXBDZXJ0aWZpY2F0ZTo6R2V0Q2VydGlmaWNhdGUoaW50MzJfdCBuSW5kZXgpIHsNCisgIHJldHVybiBDWEZBX0NlcnRpZmljYXRlKA0KKyAgICAgIChuSW5kZXggPiAtMSAmJiBtX3BOb2RlKQ0KKyAgICAgICAgICA/IG1fcE5vZGUtPkdldENoaWxkKG5JbmRleCwgWEZBX0VMRU1FTlRfQ2VydGlmaWNhdGUpDQorICAgICAgICAgIDogTlVMTCk7DQorfQ0KK1hGQV9BVFRSSUJVVEVFTlVNIENYRkFfT2lkczo6R2V0T2lkc1R5cGUoKSB7DQorICByZXR1cm4gWEZBX0dldEVudW1UeXBlQXR0cmlidXRlKG1fcE5vZGUpOw0KK30NCitpbnQzMl90IENYRkFfT2lkczo6Q291bnRPaWRzKCkgew0KKyAgcmV0dXJuIG1fcE5vZGUgPyBtX3BOb2RlLT5Db3VudENoaWxkcmVuKFhGQV9FTEVNRU5UX09pZCkgOiAwOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX09pZHM6OkdldE9pZENvbnRlbnQoaW50MzJfdCBuSW5kZXgpIHsNCisgIGlmIChuSW5kZXggPD0gLTEgfHwgIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQorICB9DQorICBDWEZBX05vZGUqIHBPaWROb2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQobkluZGV4LCBYRkFfRUxFTUVOVF9PaWQpOw0KKyAgaWYgKCFwT2lkTm9kZSkgew0KKyAgICByZXR1cm4gRlhfV1NUUkMoTCIiKTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsNCisgIHBPaWROb2RlLT5UcnlDb250ZW50KHdzQ29udGVudCk7DQorICByZXR1cm4gd3NDb250ZW50Ow0KK30NCitYRkFfQVRUUklCVVRFRU5VTSBDWEZBX1N1YmplY3RETnM6OkdldFN1YmplY3RETnNUeXBlKCkgew0KKyAgcmV0dXJuIFhGQV9HZXRFbnVtVHlwZUF0dHJpYnV0ZShtX3BOb2RlKTsNCit9DQoraW50MzJfdCBDWEZBX1N1YmplY3RETnM6OkNvdW50U3ViamVjdEROcygpIHsNCisgIHJldHVybiBtX3BOb2RlID8gbV9wTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9TdWJqZWN0RE4pIDogMDsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9TdWJqZWN0RE5zOjpHZXRTdWJqZWN0RE5TdHJpbmcoaW50MzJfdCBuSW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBpZiAobkluZGV4IDw9IC0xIHx8ICFtX3BOb2RlKSB7DQorICAgIHJldHVybiBGWF9XU1RSQyhMIiIpOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwU3ViamVjdEROTm9kZSA9IG1fcE5vZGUtPkdldENoaWxkKG5JbmRleCwgWEZBX0VMRU1FTlRfU3ViamVjdEROKTsNCisgIGlmICghcFN1YmplY3RETk5vZGUpIHsNCisgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0F0dHJpYnV0ZVZhbHVlOw0KKyAgcFN1YmplY3RETk5vZGUtPkdldEF0dHJpYnV0ZShlQXR0cmlidXRlLCB3c0F0dHJpYnV0ZVZhbHVlLCBGQUxTRSk7DQorICByZXR1cm4gd3NBdHRyaWJ1dGVWYWx1ZTsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9TdWJqZWN0RE5zOjpHZXRTdWJqZWN0RE5Db250ZW50KGludDMyX3QgbkluZGV4KSB7DQorICBpZiAobkluZGV4IDw9IC0xIHx8ICFtX3BOb2RlKSB7DQorICAgIHJldHVybiBGWF9XU1RSQyhMIiIpOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwU3ViamVjdEROTm9kZSA9IG1fcE5vZGUtPkdldENoaWxkKG5JbmRleCwgWEZBX0VMRU1FTlRfU3ViamVjdEROKTsNCisgIGlmICghcFN1YmplY3RETk5vZGUpIHsNCisgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQorICBwU3ViamVjdEROTm9kZS0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOw0KKyAgcmV0dXJuIHdzQ29udGVudDsNCit9DQorWEZBX0FUVFJJQlVURUVOVU0gQ1hGQV9EaWdlc3RNZXRob2RzOjpHZXREaWdlc3RNZXRob2RzVHlwZSgpIHsNCisgIHJldHVybiBYRkFfR2V0RW51bVR5cGVBdHRyaWJ1dGUobV9wTm9kZSk7DQorfQ0KK2ludDMyX3QgQ1hGQV9EaWdlc3RNZXRob2RzOjpDb3VudERpZ2VzdE1ldGhvZHMoKSB7DQorICByZXR1cm4gbV9wTm9kZSA/IG1fcE5vZGUtPkNvdW50Q2hpbGRyZW4oWEZBX0VMRU1FTlRfRGlnZXN0TWV0aG9kKSA6IDA7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfRGlnZXN0TWV0aG9kczo6R2V0RGlnZXN0TWV0aG9kQ29udGVudChpbnQzMl90IG5JbmRleCkgew0KKyAgaWYgKG5JbmRleCA8PSAtMSB8fCAhbV9wTm9kZSkgew0KKyAgICByZXR1cm4gRlhfV1NUUkMoTCIiKTsNCisgIH0NCisgIENYRkFfTm9kZSogcERpZ2VzdE1ldGhvZE5vZGUgPQ0KKyAgICAgIG1fcE5vZGUtPkdldENoaWxkKG5JbmRleCwgWEZBX0VMRU1FTlRfRGlnZXN0TWV0aG9kKTsNCisgIGlmICghcERpZ2VzdE1ldGhvZE5vZGUpIHsNCisgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQorICBwRGlnZXN0TWV0aG9kTm9kZS0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOw0KKyAgcmV0dXJuIHdzQ29udGVudDsNCit9DQorWEZBX0FUVFJJQlVURUVOVU0gQ1hGQV9FbmNvZGluZ3M6OkdldEVuY29kaW5nc1R5cGUoKSB7DQorICByZXR1cm4gWEZBX0dldEVudW1UeXBlQXR0cmlidXRlKG1fcE5vZGUpOw0KK30NCitpbnQzMl90IENYRkFfRW5jb2RpbmdzOjpDb3VudEVuY29kaW5ncygpIHsNCisgIHJldHVybiBtX3BOb2RlID8gbV9wTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9FbmNvZGluZykgOiAwOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX0VuY29kaW5nczo6R2V0RW5jb2RpbmdDb250ZW50KGludDMyX3QgbkluZGV4KSB7DQorICBpZiAobkluZGV4IDw9IC0xIHx8ICFtX3BOb2RlKSB7DQorICAgIHJldHVybiBGWF9XU1RSQyhMIiIpOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwRW5jb2RpbmdOb2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQobkluZGV4LCBYRkFfRUxFTUVOVF9FbmNvZGluZyk7DQorICBpZiAoIXBFbmNvZGluZ05vZGUpIHsNCisgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQorICBwRW5jb2RpbmdOb2RlLT5UcnlDb250ZW50KHdzQ29udGVudCk7DQorICByZXR1cm4gd3NDb250ZW50Ow0KK30NCitYRkFfQVRUUklCVVRFRU5VTSBDWEZBX0VuY3J5cHRpb25NZXRob2RzOjpHZXRFbmNyeXB0aW9uTWV0aG9kc1R5cGUoKSB7DQorICByZXR1cm4gWEZBX0dldEVudW1UeXBlQXR0cmlidXRlKG1fcE5vZGUpOw0KK30NCitpbnQzMl90IENYRkFfRW5jcnlwdGlvbk1ldGhvZHM6OkNvdW50RW5jcnlwdGlvbk1ldGhvZHMoKSB7DQorICByZXR1cm4gbV9wTm9kZSA/IG1fcE5vZGUtPkNvdW50Q2hpbGRyZW4oWEZBX0VMRU1FTlRfRW5jcnlwdGlvbk1ldGhvZCkgOiAwOw0KK30NCitDRlhfV2lkZVN0cmluZyBDWEZBX0VuY3J5cHRpb25NZXRob2RzOjpHZXRFbmNyeXB0aW9uTWV0aG9kQ29udGVudCgNCisgICAgaW50MzJfdCBuSW5kZXgpIHsNCisgIGlmIChuSW5kZXggPD0gLTEgfHwgIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQorICB9DQorICBDWEZBX05vZGUqIHBFbmNyeU1ldGhvZE5vZGUgPQ0KKyAgICAgIG1fcE5vZGUtPkdldENoaWxkKG5JbmRleCwgWEZBX0VMRU1FTlRfRW5jcnlwdGlvbk1ldGhvZCk7DQorICBpZiAoIXBFbmNyeU1ldGhvZE5vZGUpIHsNCisgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQorICBwRW5jcnlNZXRob2ROb2RlLT5UcnlDb250ZW50KHdzQ29udGVudCk7DQorICByZXR1cm4gd3NDb250ZW50Ow0KK30NCitYRkFfQVRUUklCVVRFRU5VTSBDWEZBX1JlYXNvbnM6OkdldFJlYXNvbnNUeXBlKCkgew0KKyAgcmV0dXJuIFhGQV9HZXRFbnVtVHlwZUF0dHJpYnV0ZShtX3BOb2RlKTsNCit9DQoraW50MzJfdCBDWEZBX1JlYXNvbnM6OkNvdW50UmVhc29ucygpIHsNCisgIHJldHVybiBtX3BOb2RlID8gbV9wTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRUxFTUVOVF9SZWFzb24pIDogMDsNCit9DQorQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9SZWFzb25zOjpHZXRSZWFzb25Db250ZW50KGludDMyX3QgbkluZGV4KSB7DQorICBpZiAobkluZGV4IDw9IC0xIHx8ICFtX3BOb2RlKSB7DQorICAgIHJldHVybiBGWF9XU1RSQyhMIiIpOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwUmVhc29uTm9kZSA9IG1fcE5vZGUtPkdldENoaWxkKG5JbmRleCwgWEZBX0VMRU1FTlRfUmVhc29uKTsNCisgIGlmICghcFJlYXNvbk5vZGUpIHsNCisgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQorICBwUmVhc29uTm9kZS0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOw0KKyAgcmV0dXJuIHdzQ29udGVudDsNCit9DQorWEZBX0FUVFJJQlVURUVOVU0gQ1hGQV9NYW5pZmVzdDo6R2V0QWN0aW9uKCkgew0KKyAgcmV0dXJuIFhGQV9HZXRFbnVtVHlwZUF0dHJpYnV0ZShtX3BOb2RlLCBYRkFfQVRUUklCVVRFX0FjdGlvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU1fSW5jbHVkZSk7DQorfQ0KK2ludDMyX3QgQ1hGQV9NYW5pZmVzdDo6Q291bnRSZWl2ZXMoKSB7DQorICByZXR1cm4gbV9wTm9kZSA/IG1fcE5vZGUtPkNvdW50Q2hpbGRyZW4oWEZBX0VMRU1FTlRfUmVmKSA6IDA7DQorfQ0KK0NGWF9XaWRlU3RyaW5nIENYRkFfTWFuaWZlc3Q6OkdldFJlZkNvbnRlbnQoaW50MzJfdCBuSW5kZXgpIHsNCisgIGlmIChuSW5kZXggPD0gLTEgfHwgIW1fcE5vZGUpIHsNCisgICAgcmV0dXJuIEZYX1dTVFJDKEwiIik7DQorICB9DQorICBDWEZBX05vZGUqIHBSZWZOb2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQobkluZGV4LCBYRkFfRUxFTUVOVF9SZWYpOw0KKyAgaWYgKCFwUmVmTm9kZSkgew0KKyAgICByZXR1cm4gRlhfV1NUUkMoTCIiKTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsNCisgIHBSZWZOb2RlLT5UcnlDb250ZW50KHdzQ29udGVudCk7DQorICByZXR1cm4gd3NDb250ZW50Ow0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfcGFyc2VyX2ltcC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfcGFyc2VyX2ltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA2NGMwMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9wYXJzZXJfaW1wLmNwcApAQCAtMCwwICsxLDE2MTggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3V0aWxzLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9vYmplY3QuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY3VtZW50LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9wYXJzZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3NjcmlwdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jZGF0YS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jbGF5b3V0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9sb2NhbGVtZ3IuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2ZtMmpzYXBpLmgiDQorI2luY2x1ZGUgInhmYV9iYXNpY19pbXAuaCINCisjaW5jbHVkZSAieGZhX3BhcnNlcl9pbXAuaCINCitJWEZBX1BhcnNlciogSVhGQV9QYXJzZXI6OkNyZWF0ZShJWEZBX09iakZhY3RvcnkqIHBGYWN0b3J5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRvY3VtZW50UGFyc2VyKSB7DQorICByZXR1cm4gbmV3IENYRkFfU2ltcGxlUGFyc2VyKHBGYWN0b3J5LCBiRG9jdW1lbnRQYXJzZXIpOw0KK30NCitDWEZBX1NpbXBsZVBhcnNlcjo6Q1hGQV9TaW1wbGVQYXJzZXIoSVhGQV9PYmpGYWN0b3J5KiBwRmFjdG9yeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiRG9jdW1lbnRQYXJzZXIpDQorICAgIDogbV9wWE1MUGFyc2VyKG51bGxwdHIpLA0KKyAgICAgIG1fcFhNTERvYyhudWxscHRyKSwNCisgICAgICBtX3BTdHJlYW0obnVsbHB0ciksDQorICAgICAgbV9wRmlsZVJlYWQobnVsbHB0ciksDQorICAgICAgbV9wRmFjdG9yeShwRmFjdG9yeSksDQorICAgICAgbV9wUm9vdE5vZGUobnVsbHB0ciksDQorICAgICAgbV9lUGFja2V0SUQoWEZBX1hEUFBBQ0tFVF9VTktOT1dOKSwNCisgICAgICBtX2JEb2N1bWVudFBhcnNlcihiRG9jdW1lbnRQYXJzZXIpIHsNCit9DQorQ1hGQV9TaW1wbGVQYXJzZXI6On5DWEZBX1NpbXBsZVBhcnNlcigpIHsNCisgIENsb3NlUGFyc2VyKCk7DQorfQ0KK3ZvaWQgQ1hGQV9TaW1wbGVQYXJzZXI6OlNldEZhY3RvcnkoSVhGQV9PYmpGYWN0b3J5KiBwRmFjdG9yeSkgew0KKyAgbV9wRmFjdG9yeSA9IHBGYWN0b3J5Ow0KK30NCitzdGF0aWMgSUZERV9YTUxOb2RlKiBYRkFfRkRFRXh0ZW5zaW9uX0dldERvY3VtZW50Tm9kZSgNCisgICAgSUZERV9YTUxEb2MqIHBYTUxEb2MsDQorICAgIEZYX0JPT0wgYlZlcmlmeVdlbGxGb3JtbmVzcyA9IEZBTFNFKSB7DQorICBpZiAoIXBYTUxEb2MpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBJRkRFX1hNTE5vZGUqIHBYTUxGYWtlUm9vdCA9IHBYTUxEb2MtPkdldFJvb3QoKTsNCisgIGZvciAoSUZERV9YTUxOb2RlKiBwWE1MTm9kZSA9DQorICAgICAgICAgICBwWE1MRmFrZVJvb3QtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7DQorICAgICAgIHBYTUxOb2RlOyBwWE1MTm9kZSA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgew0KKyAgICBpZiAocFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgaWYgKGJWZXJpZnlXZWxsRm9ybW5lc3MpIHsNCisgICAgICAgIGZvciAoSUZERV9YTUxOb2RlKiBwTmV4dE5vZGUgPQ0KKyAgICAgICAgICAgICAgICAgcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpOw0KKyAgICAgICAgICAgICBwTmV4dE5vZGU7DQorICAgICAgICAgICAgIHBOZXh0Tm9kZSA9IHBOZXh0Tm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgICAgICAgaWYgKHBOZXh0Tm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcmV0dXJuIHBYTUxOb2RlOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQoraW50MzJfdCBDWEZBX1NpbXBsZVBhcnNlcjo6U3RhcnRQYXJzZShJRlhfRmlsZVJlYWQqIHBTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkgew0KKyAgQ2xvc2VQYXJzZXIoKTsNCisgIG1fcEZpbGVSZWFkID0gcFN0cmVhbTsNCisgIG1fcFN0cmVhbSA9IElGWF9TdHJlYW06OkNyZWF0ZVN0cmVhbSgNCisgICAgICBwU3RyZWFtLCBGWF9TVFJFQU1BQ0NFU1NfUmVhZCB8IEZYX1NUUkVBTUFDQ0VTU19UZXh0KTsNCisgIGlmIChtX3BTdHJlYW0gPT0gTlVMTCkgew0KKyAgICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX1N0cmVhbUVycjsNCisgIH0NCisgIEZYX1dPUkQgd0NvZGVQYWdlID0gbV9wU3RyZWFtLT5HZXRDb2RlUGFnZSgpOw0KKyAgaWYgKHdDb2RlUGFnZSAhPSBGWF9DT0RFUEFHRV9VVEYxNkxFICYmIHdDb2RlUGFnZSAhPSBGWF9DT0RFUEFHRV9VVEYxNkJFICYmDQorICAgICAgd0NvZGVQYWdlICE9IEZYX0NPREVQQUdFX1VURjgpIHsNCisgICAgbV9wU3RyZWFtLT5TZXRDb2RlUGFnZShGWF9DT0RFUEFHRV9VVEY4KTsNCisgIH0NCisgIG1fcFhNTERvYyA9IElGREVfWE1MRG9jOjpDcmVhdGUoKTsNCisgIGlmIChtX3BYTUxEb2MgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX1N0YXR1c0VycjsNCisgIH0NCisgIG1fcFhNTFBhcnNlciA9IG5ldyBDWEZBX1hNTFBhcnNlcihtX3BYTUxEb2MtPkdldFJvb3QoKSwgbV9wU3RyZWFtKTsNCisgIGlmIChtX3BYTUxQYXJzZXIgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX1N0YXR1c0VycjsNCisgIH0NCisgIGlmICghbV9wWE1MRG9jLT5Mb2FkWE1MKG1fcFhNTFBhcnNlcikpIHsNCisgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TdGF0dXNFcnI7DQorICB9DQorICBtX2VQYWNrZXRJRCA9IGVQYWNrZXRJRDsNCisgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfUmVhZHk7DQorfQ0KK2ludDMyX3QgQ1hGQV9TaW1wbGVQYXJzZXI6OkRvUGFyc2UoSUZYX1BhdXNlKiBwUGF1c2UpIHsNCisgIGlmIChtX3BYTUxEb2MgPT0gTlVMTCB8fCBtX2VQYWNrZXRJRCA9PSBYRkFfWERQUEFDS0VUX1VOS05PV04pIHsNCisgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TdGF0dXNFcnI7DQorICB9DQorICBpbnQzMl90IGlSZXQgPSBtX3BYTUxEb2MtPkRvTG9hZChwUGF1c2UpOw0KKyAgaWYgKGlSZXQgPCAwKSB7DQorICAgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfU3ludGF4RXJyOw0KKyAgfQ0KKyAgaWYgKGlSZXQgPCAxMDApIHsNCisgICAgcmV0dXJuIGlSZXQgLyAyOw0KKyAgfQ0KKyAgbV9wUm9vdE5vZGUgPSBQYXJzZUFzWERQUGFja2V0KFhGQV9GREVFeHRlbnNpb25fR2V0RG9jdW1lbnROb2RlKG1fcFhNTERvYyksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9lUGFja2V0SUQpOw0KKyAgbV9wWE1MRG9jLT5DbG9zZVhNTCgpOw0KKyAgaWYgKG1fcFN0cmVhbSkgew0KKyAgICBtX3BTdHJlYW0tPlJlbGVhc2UoKTsNCisgICAgbV9wU3RyZWFtID0gTlVMTDsNCisgIH0NCisgIGlmICghbV9wUm9vdE5vZGUpIHsNCisgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TdGF0dXNFcnI7DQorICB9DQorICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX0RvbmU7DQorfQ0KK2ludDMyX3QgQ1hGQV9TaW1wbGVQYXJzZXI6OlBhcnNlWE1MRGF0YShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NYTUwsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfWE1MTm9kZSomIHBYTUxOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgew0KKyAgQ2xvc2VQYXJzZXIoKTsNCisgIHBYTUxOb2RlID0gTlVMTDsNCisgIElGWF9TdHJlYW0qIHBTdHJlYW0gPSBYRkFfQ3JlYXRlV2lkZVRleHRSZWFkKHdzWE1MKTsNCisgIGlmICghcFN0cmVhbSkgew0KKyAgICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX1N0cmVhbUVycjsNCisgIH0NCisgIG1fcFN0cmVhbSA9IHBTdHJlYW07DQorICBtX3BYTUxEb2MgPSBJRkRFX1hNTERvYzo6Q3JlYXRlKCk7DQorICBpZiAobV9wWE1MRG9jID09IE5VTEwpIHsNCisgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TdGF0dXNFcnI7DQorICB9DQorICBDWEZBX1hNTFBhcnNlciogcFBhcnNlciA9IG5ldyBDWEZBX1hNTFBhcnNlcihtX3BYTUxEb2MtPkdldFJvb3QoKSwgbV9wU3RyZWFtKTsNCisgIGlmIChwUGFyc2VyID09IE5VTEwpIHsNCisgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TdGF0dXNFcnI7DQorICB9DQorI2lmZGVmIF9YRkFfVkVSSUZZX0NoZWNrc3VtXw0KKyAgcFBhcnNlci0+bV9kd0NoZWNrU3RhdHVzID0gMHgwMzsNCisjZW5kaWYNCisgIGlmICghbV9wWE1MRG9jLT5Mb2FkWE1MKHBQYXJzZXIpKSB7DQorICAgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfU3RhdHVzRXJyOw0KKyAgfQ0KKyAgaW50MzJfdCBpUmV0ID0gbV9wWE1MRG9jLT5Eb0xvYWQocFBhdXNlKTsNCisgIGlmIChpUmV0IDwgMCB8fCBpUmV0ID49IDEwMCkgew0KKyAgICBtX3BYTUxEb2MtPkNsb3NlWE1MKCk7DQorICB9DQorICBpZiAoaVJldCA8IDApIHsNCisgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TeW50YXhFcnI7DQorICB9DQorICBpZiAoaVJldCA8IDEwMCkgew0KKyAgICByZXR1cm4gaVJldCAvIDI7DQorICB9DQorICBpZiAobV9wU3RyZWFtKSB7DQorICAgIG1fcFN0cmVhbS0+UmVsZWFzZSgpOw0KKyAgICBtX3BTdHJlYW0gPSBOVUxMOw0KKyAgfQ0KKyAgcFhNTE5vZGUgPSBYRkFfRkRFRXh0ZW5zaW9uX0dldERvY3VtZW50Tm9kZShtX3BYTUxEb2MpOw0KKyAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19Eb25lOw0KK30NCit2b2lkIENYRkFfU2ltcGxlUGFyc2VyOjpDb25zdHJ1Y3RYRkFOb2RlKENYRkFfTm9kZSogcFhGQU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlKSB7DQorICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCA9IChYRkFfWERQUEFDS0VUKXBYRkFOb2RlLT5HZXRQYWNrZXRJRCgpOw0KKyAgaWYgKGVQYWNrZXRJRCA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKSB7DQorICAgIGlmIChwWEZBTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSkgew0KKyAgICAgIGZvciAoSUZERV9YTUxOb2RlKiBwWE1MQ2hpbGQgPQ0KKyAgICAgICAgICAgICAgIHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOw0KKyAgICAgICAgICAgcFhNTENoaWxkOw0KKyAgICAgICAgICAgcFhNTENoaWxkID0gcFhNTENoaWxkLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgew0KKyAgICAgICAgRkRFX1hNTE5PREVUWVBFIGVOb2RlVHlwZSA9IHBYTUxDaGlsZC0+R2V0VHlwZSgpOw0KKyAgICAgICAgaWYgKGVOb2RlVHlwZSA9PSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChlTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgew0KKyAgICAgICAgICBDWEZBX05vZGUqIHBYRkFDaGlsZCA9IG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSk7DQorICAgICAgICAgIGlmIChwWEZBQ2hpbGQgPT0gTlVMTCkgew0KKyAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c05vZGVTdHI7DQorICAgICAgICAgICgoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQpLT5HZXRMb2NhbFRhZ05hbWUod3NOb2RlU3RyKTsNCisgICAgICAgICAgcFhGQUNoaWxkLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTm9kZVN0cik7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2hpbGRWYWx1ZTsNCisjaWZkZWYgWEZBX1BBUlNFX0hBU19MSU5FSURFTlRJRklFUg0KKyAgICAgICAgICBYRkFfR2V0UGxhaW5UZXh0RnJvbVJpY2hUZXh0KChJRkRFX1hNTEVsZW1lbnQqKXBYTUxDaGlsZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0NoaWxkVmFsdWUpOw0KKyNlbHNlDQorICAgICAgICAgIFhGQV9Db252ZXJ0UmljaFRleHRUb1BsYWluVGV4dCgoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0NoaWxkVmFsdWUpOw0KKyNlbmRpZg0KKyAgICAgICAgICBpZiAoIXdzQ2hpbGRWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgICBwWEZBQ2hpbGQtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ2hpbGRWYWx1ZSk7DQorICAgICAgICAgIH0NCisgICAgICAgICAgcFhGQU5vZGUtPkluc2VydENoaWxkKHBYRkFDaGlsZCk7DQorICAgICAgICAgIHBYRkFDaGlsZC0+U2V0WE1MTWFwcGluZ05vZGUocFhNTENoaWxkKTsNCisgICAgICAgICAgcFhGQUNoaWxkLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCwgVFJVRSwgRkFMU0UpOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgbV9wUm9vdE5vZGUgPSBwWEZBTm9kZTsNCisgICAgfSBlbHNlIHsNCisgICAgICBtX3BSb290Tm9kZSA9IERhdGFMb2FkZXIocFhGQU5vZGUsIHBYTUxOb2RlLCBUUlVFKTsNCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgaWYgKHBYRkFOb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfQ29udGVudE5vZGUpIHsNCisgICAgICBQYXJzZUNvbnRlbnROb2RlKHBYRkFOb2RlLCBwWE1MTm9kZSwgZVBhY2tldElEKTsNCisgICAgICBtX3BSb290Tm9kZSA9IHBYRkFOb2RlOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG1fcFJvb3ROb2RlID0gTm9ybWFsTG9hZGVyKHBYRkFOb2RlLCBwWE1MTm9kZSwgZVBhY2tldElEKTsNCisgICAgfQ0KKyAgfQ0KK30NCitGWF9CT09MIFhGQV9GREVFeHRlbnNpb25fUmVzb2x2ZU5hbWVzcGFjZVF1YWxpZmllcigNCisgICAgSUZERV9YTUxFbGVtZW50KiBwTm9kZSwNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1F1YWxpZmllciwNCisgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZXNwYWNlVVJJKSB7DQorICBpZiAoIXBOb2RlKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIElGREVfWE1MTm9kZSogcEZha2VSb290ID0gcE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Um9vdCk7DQorICBDRlhfV2lkZVN0cmluZyB3c05TQXR0cmlidXRlOw0KKyAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7DQorICBpZiAod3NRdWFsaWZpZXIuSXNFbXB0eSgpKSB7DQorICAgIHdzTlNBdHRyaWJ1dGUgPSBGWF9XU1RSQyhMInhtbG5zIik7DQorICAgIGJSZXQgPSBUUlVFOw0KKyAgfSBlbHNlIHsNCisgICAgd3NOU0F0dHJpYnV0ZSA9IEZYX1dTVFJDKEwieG1sbnM6IikgKyB3c1F1YWxpZmllcjsNCisgIH0NCisgIGZvciAoOyBwTm9kZSAhPSBwRmFrZVJvb3Q7DQorICAgICAgIHBOb2RlID0gKElGREVfWE1MRWxlbWVudCopcE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6UGFyZW50KSkgew0KKyAgICBpZiAocE5vZGUtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKHBOb2RlLT5IYXNBdHRyaWJ1dGUod3NOU0F0dHJpYnV0ZSkpIHsNCisgICAgICBwTm9kZS0+R2V0U3RyaW5nKHdzTlNBdHRyaWJ1dGUsIHdzTmFtZXNwYWNlVVJJKTsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgd3NOYW1lc3BhY2VVUkkuRW1wdHkoKTsNCisgIHJldHVybiBiUmV0Ow0KK30NCitzdGF0aWMgaW5saW5lIHZvaWQgWEZBX0ZERUV4dGVuc2lvbl9HZXRFbGVtZW50VGFnTmFtZXNwYWNlVVJJKA0KKyAgICBJRkRFX1hNTEVsZW1lbnQqIHBFbGVtZW50LA0KKyAgICBDRlhfV2lkZVN0cmluZyYgd3NOYW1lc3BhY2VVUkkpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzTm9kZVN0cjsNCisgIHBFbGVtZW50LT5HZXROYW1lc3BhY2VQcmVmaXgod3NOb2RlU3RyKTsNCisgIGlmICghWEZBX0ZERUV4dGVuc2lvbl9SZXNvbHZlTmFtZXNwYWNlUXVhbGlmaWVyKHBFbGVtZW50LCB3c05vZGVTdHIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c05hbWVzcGFjZVVSSSkpIHsNCisgICAgd3NOYW1lc3BhY2VVUkkuRW1wdHkoKTsNCisgIH0NCit9DQorc3RhdGljIEZYX0JPT0wgWEZBX0ZERUV4dGVuc2lvbl9NYXRjaE5vZGVOYW1lKA0KKyAgICBJRkRFX1hNTE5vZGUqIHBOb2RlLA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTG9jYWxUYWdOYW1lLA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZXNwYWNlVVJJUHJlZml4LA0KKyAgICBGWF9EV09SRCBlTWF0Y2hGbGFncyA9IFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCkgew0KKyAgaWYgKCFwTm9kZSB8fCBwTm9kZS0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgSUZERV9YTUxFbGVtZW50KiBwRWxlbWVudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8SUZERV9YTUxFbGVtZW50Kj4ocE5vZGUpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NOb2RlU3RyOw0KKyAgcEVsZW1lbnQtPkdldExvY2FsVGFnTmFtZSh3c05vZGVTdHIpOw0KKyAgaWYgKHdzTm9kZVN0ciAhPSB3c0xvY2FsVGFnTmFtZSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBYRkFfRkRFRXh0ZW5zaW9uX0dldEVsZW1lbnRUYWdOYW1lc3BhY2VVUkkocEVsZW1lbnQsIHdzTm9kZVN0cik7DQorICBpZiAoZU1hdGNoRmxhZ3MgJiBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0gpIHsNCisgICAgcmV0dXJuIFRSVUU7DQorICB9DQorICBpZiAoZU1hdGNoRmxhZ3MgJiBYRkFfWERQUEFDS0VUX0ZMQUdTX1BSRUZJWE1BVENIKSB7DQorICAgIHJldHVybiB3c05vZGVTdHIuTGVmdCh3c05hbWVzcGFjZVVSSVByZWZpeC5HZXRMZW5ndGgoKSkgPT0NCisgICAgICAgICAgIHdzTmFtZXNwYWNlVVJJUHJlZml4Ow0KKyAgfQ0KKyAgcmV0dXJuIHdzTm9kZVN0ciA9PSB3c05hbWVzcGFjZVVSSVByZWZpeDsNCit9DQorc3RhdGljIEZYX0JPT0wgWEZBX0ZERUV4dGVuc2lvbl9HZXRBdHRyaWJ1dGVMb2NhbE5hbWUoDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NBdHRyaWJ1dGVOYW1lLA0KKyAgICBDRlhfV2lkZVN0cmluZyYgd3NMb2NhbEF0dHJOYW1lKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c0F0dHJOYW1lKHdzQXR0cmlidXRlTmFtZSk7DQorICBGWF9TVFJTSVpFIGlGaW5kID0gd3NBdHRyTmFtZS5GaW5kKEwnOicsIDApOw0KKyAgaWYgKGlGaW5kIDwgMCkgew0KKyAgICB3c0xvY2FsQXR0ck5hbWUgPSB3c0F0dHJOYW1lOw0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9IGVsc2Ugew0KKyAgICB3c0xvY2FsQXR0ck5hbWUgPSB3c0F0dHJOYW1lLlJpZ2h0KHdzQXR0ck5hbWUuR2V0TGVuZ3RoKCkgLSBpRmluZCAtIDEpOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCit9DQorc3RhdGljIEZYX0JPT0wgWEZBX0ZERUV4dGVuc2lvbl9SZXNvbHZlQXR0cmlidXRlKA0KKyAgICBJRkRFX1hNTEVsZW1lbnQqIHBFbGVtZW50LA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQXR0cmlidXRlTmFtZSwNCisgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTG9jYWxBdHRyTmFtZSwNCisgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZXNwYWNlVVJJKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c0F0dHJOYW1lKHdzQXR0cmlidXRlTmFtZSk7DQorICBDRlhfV2lkZVN0cmluZyB3c05TUHJlZml4Ow0KKyAgaWYgKFhGQV9GREVFeHRlbnNpb25fR2V0QXR0cmlidXRlTG9jYWxOYW1lKHdzQXR0cmlidXRlTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0xvY2FsQXR0ck5hbWUpKSB7DQorICAgIHdzTlNQcmVmaXggPSB3c0F0dHJOYW1lLkxlZnQod3NBdHRyaWJ1dGVOYW1lLkdldExlbmd0aCgpIC0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0xvY2FsQXR0ck5hbWUuR2V0TGVuZ3RoKCkgLSAxKTsNCisgIH0NCisgIGlmICh3c0xvY2FsQXR0ck5hbWUgPT0gRlhfV1NUUkMoTCJ4bWxucyIpIHx8DQorICAgICAgd3NOU1ByZWZpeCA9PSBGWF9XU1RSQyhMInhtbG5zIikgfHwgd3NOU1ByZWZpeCA9PSBGWF9XU1RSQyhMInhtbCIpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICghWEZBX0ZERUV4dGVuc2lvbl9SZXNvbHZlTmFtZXNwYWNlUXVhbGlmaWVyKHBFbGVtZW50LCB3c05TUHJlZml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NOYW1lc3BhY2VVUkkpKSB7DQorICAgIHdzTmFtZXNwYWNlVVJJLkVtcHR5KCk7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBUUlVFOw0KK30NCitzdGF0aWMgRlhfQk9PTCBYRkFfRkRFRXh0ZW5zaW9uX0ZpbmRBdHRyaWJ1dGVXaXRoTlMoDQorICAgIElGREVfWE1MRWxlbWVudCogcEVsZW1lbnQsDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMb2NhbEF0dHJpYnV0ZU5hbWUsDQorICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lc3BhY2VVUklQcmVmaXgsDQorICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLA0KKyAgICBGWF9CT09MIGJNYXRjaE5TQXNQcmVmaXggPSBGQUxTRSkgew0KKyAgaWYgKCFwRWxlbWVudCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0F0dHJOYW1lOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyVmFsdWU7DQorICBDRlhfV2lkZVN0cmluZyB3c0F0dHJOUzsNCisgIGZvciAoaW50MzJfdCBpQXR0ckNvdW50ID0gcEVsZW1lbnQtPkNvdW50QXR0cmlidXRlcygpLCBpID0gMDsgaSA8IGlBdHRyQ291bnQ7DQorICAgICAgIGkrKykgew0KKyAgICBwRWxlbWVudC0+R2V0QXR0cmlidXRlKGksIHdzQXR0ck5hbWUsIHdzQXR0clZhbHVlKTsNCisgICAgRlhfU1RSU0laRSBpRmluZCA9IHdzQXR0ck5hbWUuRmluZChMJzonLCAwKTsNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOU1ByZWZpeDsNCisgICAgaWYgKGlGaW5kIDwgMCkgew0KKyAgICAgIGlmICh3c0xvY2FsQXR0cmlidXRlTmFtZSAhPSB3c0F0dHJOYW1lKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKHdzTG9jYWxBdHRyaWJ1dGVOYW1lICE9DQorICAgICAgICAgIHdzQXR0ck5hbWUuUmlnaHQod3NBdHRyTmFtZS5HZXRMZW5ndGgoKSAtIGlGaW5kIC0gMSkpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICB3c05TUHJlZml4ID0gd3NBdHRyTmFtZS5MZWZ0KGlGaW5kKTsNCisgICAgfQ0KKyAgICBpZiAoIVhGQV9GREVFeHRlbnNpb25fUmVzb2x2ZU5hbWVzcGFjZVF1YWxpZmllcihwRWxlbWVudCwgd3NOU1ByZWZpeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NBdHRyTlMpKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKGJNYXRjaE5TQXNQcmVmaXgpIHsNCisgICAgICBpZiAod3NBdHRyTlMuTGVmdCh3c05hbWVzcGFjZVVSSVByZWZpeC5HZXRMZW5ndGgoKSkgIT0NCisgICAgICAgICAgd3NOYW1lc3BhY2VVUklQcmVmaXgpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBpZiAod3NBdHRyTlMgIT0gd3NOYW1lc3BhY2VVUklQcmVmaXgpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICB3c1ZhbHVlID0gd3NBdHRyVmFsdWU7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitDWEZBX05vZGUqIENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZUFzWERQUGFja2V0KElGREVfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKSB7DQorICBzd2l0Y2ggKGVQYWNrZXRJRCkgew0KKyAgICBjYXNlIFhGQV9YRFBQQUNLRVRfVU5LTk9XTjoNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgY2FzZSBYRkFfWERQUEFDS0VUX1hEUDoNCisgICAgICByZXR1cm4gUGFyc2VBc1hEUFBhY2tldF9YRFAocFhNTERvY3VtZW50Tm9kZSwgZVBhY2tldElEKTsNCisgICAgY2FzZSBYRkFfWERQUEFDS0VUX0NvbmZpZzoNCisgICAgICByZXR1cm4gUGFyc2VBc1hEUFBhY2tldF9Db25maWcocFhNTERvY3VtZW50Tm9kZSwgZVBhY2tldElEKTsNCisgICAgY2FzZSBYRkFfWERQUEFDS0VUX1RlbXBsYXRlOg0KKyAgICBjYXNlIFhGQV9YRFBQQUNLRVRfRm9ybToNCisgICAgICByZXR1cm4gUGFyc2VBc1hEUFBhY2tldF9UZW1wbGF0ZUZvcm0ocFhNTERvY3VtZW50Tm9kZSwgZVBhY2tldElEKTsNCisgICAgY2FzZSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzOg0KKyAgICAgIHJldHVybiBQYXJzZUFzWERQUGFja2V0X0RhdGEocFhNTERvY3VtZW50Tm9kZSwgZVBhY2tldElEKTsNCisgICAgY2FzZSBYRkFfWERQUEFDS0VUX1hkYzoNCisgICAgICByZXR1cm4gUGFyc2VBc1hEUFBhY2tldF9YZGMocFhNTERvY3VtZW50Tm9kZSwgZVBhY2tldElEKTsNCisgICAgY2FzZSBYRkFfWERQUEFDS0VUX0xvY2FsZVNldDoNCisgICAgY2FzZSBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQ6DQorICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQ6DQorICAgICAgcmV0dXJuIFBhcnNlQXNYRFBQYWNrZXRfTG9jYWxlQ29ubmVjdGlvblNvdXJjZVNldChwWE1MRG9jdW1lbnROb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVBhY2tldElEKTsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gUGFyc2VBc1hEUFBhY2tldF9Vc2VyKHBYTUxEb2N1bWVudE5vZGUsIGVQYWNrZXRJRCk7DQorICB9DQorICByZXR1cm4gTlVMTDsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX1NpbXBsZVBhcnNlcjo6UGFyc2VBc1hEUFBhY2tldF9YRFAoDQorICAgIElGREVfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSwNCisgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpIHsNCisgIGlmICghWEZBX0ZERUV4dGVuc2lvbl9NYXRjaE5vZGVOYW1lKA0KKyAgICAgICAgICBwWE1MRG9jdW1lbnROb2RlLCBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1hEUCktPnBOYW1lLA0KKyAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1hEUCktPnBVUkksDQorICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfWERQKS0+ZUZsYWdzKSkgew0KKyAgICByZXR1cm4gbnVsbHB0cjsNCisgIH0NCisgIENYRkFfTm9kZSogcFhGQVJvb3ROb2RlID0NCisgICAgICBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfWERQLCBYRkFfRUxFTUVOVF9YZmEpOw0KKyAgaWYgKCFwWEZBUm9vdE5vZGUpIHsNCisgICAgcmV0dXJuIG51bGxwdHI7DQorICB9DQorICBtX3BSb290Tm9kZSA9IHBYRkFSb290Tm9kZTsNCisgIHBYRkFSb290Tm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCBGWF9XU1RSQyhMInhmYSIpKTsNCisgIHsNCisgICAgSUZERV9YTUxFbGVtZW50KiBwRWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQqKXBYTUxEb2N1bWVudE5vZGU7DQorICAgIGludDMyX3QgaUF0dHJpYnV0ZUNvdW50ID0gcEVsZW1lbnQtPkNvdW50QXR0cmlidXRlcygpOw0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQXR0cmlidXRlQ291bnQ7IGkrKykgew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0cmlOYW1lLCB3c0F0dHJpVmFsdWU7DQorICAgICAgcEVsZW1lbnQtPkdldEF0dHJpYnV0ZShpLCB3c0F0dHJpTmFtZSwgd3NBdHRyaVZhbHVlKTsNCisgICAgICBpZiAod3NBdHRyaU5hbWUgPT0gRlhfV1NUUkMoTCJ1dWlkIikpIHsNCisgICAgICAgIHBYRkFSb290Tm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9VdWlkLCB3c0F0dHJpVmFsdWUpOw0KKyAgICAgIH0gZWxzZSBpZiAod3NBdHRyaU5hbWUgPT0gRlhfV1NUUkMoTCJ0aW1lU3RhbXAiKSkgew0KKyAgICAgICAgcFhGQVJvb3ROb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1RpbWVTdGFtcCwgd3NBdHRyaVZhbHVlKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIElGREVfWE1MTm9kZSogcFhNTENvbmZpZ0RPTVJvb3QgPSBudWxscHRyOw0KKyAgQ1hGQV9Ob2RlKiBwWEZBQ29uZmlnRE9NUm9vdCA9IG51bGxwdHI7DQorICB7DQorICAgIGZvciAoSUZERV9YTUxOb2RlKiBwQ2hpbGRJdGVtID0NCisgICAgICAgICAgICAgcFhNTERvY3VtZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsNCisgICAgICAgICBwQ2hpbGRJdGVtOw0KKyAgICAgICAgIHBDaGlsZEl0ZW0gPSBwQ2hpbGRJdGVtLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgew0KKyAgICAgIFhGQV9MUENQQUNLRVRJTkZPIHBQYWNrZXRJbmZvID0gWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Db25maWcpOw0KKyAgICAgIGlmICghWEZBX0ZERUV4dGVuc2lvbl9NYXRjaE5vZGVOYW1lKHBDaGlsZEl0ZW0sIHBQYWNrZXRJbmZvLT5wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFja2V0SW5mby0+cFVSSSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFja2V0SW5mby0+ZUZsYWdzKSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmIChwWEZBUm9vdE5vZGUtPkdldEZpcnN0Q2hpbGRCeU5hbWUocFBhY2tldEluZm8tPnVIYXNoKSkgew0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7DQorICAgICAgfQ0KKyAgICAgIHBYTUxDb25maWdET01Sb290ID0gcENoaWxkSXRlbTsNCisgICAgICBwWEZBQ29uZmlnRE9NUm9vdCA9DQorICAgICAgICAgIFBhcnNlQXNYRFBQYWNrZXRfQ29uZmlnKHBYTUxDb25maWdET01Sb290LCBYRkFfWERQUEFDS0VUX0NvbmZpZyk7DQorICAgICAgcFhGQVJvb3ROb2RlLT5JbnNlcnRDaGlsZChwWEZBQ29uZmlnRE9NUm9vdCwgTlVMTCk7DQorICAgIH0NCisgIH0NCisgIElGREVfWE1MTm9kZSogcFhNTERhdGFzZXRzRE9NUm9vdCA9IG51bGxwdHI7DQorICBJRkRFX1hNTE5vZGUqIHBYTUxGb3JtRE9NUm9vdCA9IG51bGxwdHI7DQorICBJRkRFX1hNTE5vZGUqIHBYTUxUZW1wbGF0ZURPTVJvb3QgPSBudWxscHRyOw0KKyAgew0KKyAgICBmb3IgKElGREVfWE1MTm9kZSogcENoaWxkSXRlbSA9DQorICAgICAgICAgICAgIHBYTUxEb2N1bWVudE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7DQorICAgICAgICAgcENoaWxkSXRlbTsNCisgICAgICAgICBwQ2hpbGRJdGVtID0gcENoaWxkSXRlbS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgICBpZiAoIXBDaGlsZEl0ZW0gfHwgcENoaWxkSXRlbS0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBpZiAocENoaWxkSXRlbSA9PSBwWE1MQ29uZmlnRE9NUm9vdCkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIElGREVfWE1MRWxlbWVudCogcEVsZW1lbnQgPQ0KKyAgICAgICAgICByZWludGVycHJldF9jYXN0PElGREVfWE1MRWxlbWVudCo+KHBDaGlsZEl0ZW0pOw0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzUGFja2V0TmFtZTsNCisgICAgICBwRWxlbWVudC0+R2V0TG9jYWxUYWdOYW1lKHdzUGFja2V0TmFtZSk7DQorICAgICAgWEZBX0xQQ1BBQ0tFVElORk8gcFBhY2tldEluZm8gPSBYRkFfR2V0UGFja2V0QnlOYW1lKHdzUGFja2V0TmFtZSk7DQorICAgICAgaWYgKHBQYWNrZXRJbmZvICYmIHBQYWNrZXRJbmZvLT5wVVJJKSB7DQorICAgICAgICBpZiAoIVhGQV9GREVFeHRlbnNpb25fTWF0Y2hOb2RlTmFtZShwRWxlbWVudCwgcFBhY2tldEluZm8tPnBOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhY2tldEluZm8tPnBVUkksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFja2V0SW5mby0+ZUZsYWdzKSkgew0KKyAgICAgICAgICBwUGFja2V0SW5mbyA9IG51bGxwdHI7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldCA9DQorICAgICAgICAgIHBQYWNrZXRJbmZvID8gcFBhY2tldEluZm8tPmVOYW1lIDogWEZBX1hEUFBBQ0tFVF9VU0VSOw0KKyAgICAgIGlmIChlUGFja2V0ID09IFhGQV9YRFBQQUNLRVRfWERQKSB7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgaWYgKGVQYWNrZXQgPT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cykgew0KKyAgICAgICAgaWYgKHBYTUxEYXRhc2V0c0RPTVJvb3QpIHsNCisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7DQorICAgICAgICB9DQorICAgICAgICBwWE1MRGF0YXNldHNET01Sb290ID0gcEVsZW1lbnQ7DQorICAgICAgfSBlbHNlIGlmIChlUGFja2V0ID09IFhGQV9YRFBQQUNLRVRfRm9ybSkgew0KKyAgICAgICAgaWYgKHBYTUxGb3JtRE9NUm9vdCkgew0KKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsNCisgICAgICAgIH0NCisgICAgICAgIHBYTUxGb3JtRE9NUm9vdCA9IHBFbGVtZW50Ow0KKyAgICAgIH0gZWxzZSBpZiAoZVBhY2tldCA9PSBYRkFfWERQUEFDS0VUX1RlbXBsYXRlKSB7DQorICAgICAgICBpZiAocFhNTFRlbXBsYXRlRE9NUm9vdCkgew0KKyAgICAgICAgICAvLyBGb3VuZCBhIGR1cGxpY2F0ZSB0ZW1wbGF0ZSBwYWNrZXQuDQorICAgICAgICAgIHJldHVybiBudWxscHRyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwUGFja2V0Tm9kZSA9IFBhcnNlQXNYRFBQYWNrZXQocEVsZW1lbnQsIGVQYWNrZXQpOw0KKyAgICAgICAgaWYgKHBQYWNrZXROb2RlKSB7DQorICAgICAgICAgIHBYTUxUZW1wbGF0ZURPTVJvb3QgPSBwRWxlbWVudDsNCisgICAgICAgICAgcFhGQVJvb3ROb2RlLT5JbnNlcnRDaGlsZChwUGFja2V0Tm9kZSk7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIENYRkFfTm9kZSogcFBhY2tldE5vZGUgPSBQYXJzZUFzWERQUGFja2V0KHBFbGVtZW50LCBlUGFja2V0KTsNCisgICAgICAgIGlmIChwUGFja2V0Tm9kZSkgew0KKyAgICAgICAgICBpZiAocFBhY2tldEluZm8gJiYNCisgICAgICAgICAgICAgIChwUGFja2V0SW5mby0+ZUZsYWdzICYgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FKSAmJg0KKyAgICAgICAgICAgICAgcFhGQVJvb3ROb2RlLT5HZXRGaXJzdENoaWxkQnlOYW1lKHBQYWNrZXRJbmZvLT51SGFzaCkpIHsNCisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBwWEZBUm9vdE5vZGUtPkluc2VydENoaWxkKHBQYWNrZXROb2RlKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGlmICghcFhNTFRlbXBsYXRlRE9NUm9vdCkgew0KKyAgICAvLyBObyB0ZW1wbGF0ZSBpcyBmb3VuZC4NCisgICAgcmV0dXJuIG51bGxwdHI7DQorICB9DQorICBpZiAocFhNTERhdGFzZXRzRE9NUm9vdCkgew0KKyAgICBDWEZBX05vZGUqIHBQYWNrZXROb2RlID0NCisgICAgICAgIFBhcnNlQXNYRFBQYWNrZXQocFhNTERhdGFzZXRzRE9NUm9vdCwgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cyk7DQorICAgIGlmIChwUGFja2V0Tm9kZSkgew0KKyAgICAgIHBYRkFSb290Tm9kZS0+SW5zZXJ0Q2hpbGQocFBhY2tldE5vZGUpOw0KKyAgICB9DQorICB9DQorICBpZiAocFhNTEZvcm1ET01Sb290KSB7DQorICAgIENYRkFfTm9kZSogcFBhY2tldE5vZGUgPQ0KKyAgICAgICAgUGFyc2VBc1hEUFBhY2tldChwWE1MRm9ybURPTVJvb3QsIFhGQV9YRFBQQUNLRVRfRm9ybSk7DQorICAgIGlmIChwUGFja2V0Tm9kZSkgew0KKyAgICAgIHBYRkFSb290Tm9kZS0+SW5zZXJ0Q2hpbGQocFBhY2tldE5vZGUpOw0KKyAgICB9DQorICB9DQorICBwWEZBUm9vdE5vZGUtPlNldFhNTE1hcHBpbmdOb2RlKHBYTUxEb2N1bWVudE5vZGUpOw0KKyAgcmV0dXJuIHBYRkFSb290Tm9kZTsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX1NpbXBsZVBhcnNlcjo6UGFyc2VBc1hEUFBhY2tldF9Db25maWcoDQorICAgIElGREVfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSwNCisgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpIHsNCisgIGlmICghWEZBX0ZERUV4dGVuc2lvbl9NYXRjaE5vZGVOYW1lKA0KKyAgICAgICAgICBwWE1MRG9jdW1lbnROb2RlLCBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0NvbmZpZyktPnBOYW1lLA0KKyAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0NvbmZpZyktPnBVUkksDQorICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfQ29uZmlnKS0+ZUZsYWdzKSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENYRkFfTm9kZSogcE5vZGUgPQ0KKyAgICAgIG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9FTEVNRU5UX0NvbmZpZyk7DQorICBpZiAoIXBOb2RlKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgICAgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0NvbmZpZyktPnBOYW1lKTsNCisgIGlmICghTm9ybWFsTG9hZGVyKHBOb2RlLCBwWE1MRG9jdW1lbnROb2RlLCBlUGFja2V0SUQpKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcE5vZGUtPlNldFhNTE1hcHBpbmdOb2RlKHBYTUxEb2N1bWVudE5vZGUpOw0KKyAgcmV0dXJuIHBOb2RlOw0KK30NCitDWEZBX05vZGUqIENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZUFzWERQUGFja2V0X1RlbXBsYXRlRm9ybSgNCisgICAgSUZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLA0KKyAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkgew0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQorICBpZiAoZVBhY2tldElEID09IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUpIHsNCisgICAgaWYgKFhGQV9GREVFeHRlbnNpb25fTWF0Y2hOb2RlTmFtZSgNCisgICAgICAgICAgICBwWE1MRG9jdW1lbnROb2RlLCBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1RlbXBsYXRlKS0+cE5hbWUsDQorICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9UZW1wbGF0ZSktPnBVUkksDQorICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9UZW1wbGF0ZSktPmVGbGFncykpIHsNCisgICAgICBwTm9kZSA9DQorICAgICAgICAgIG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSwgWEZBX0VMRU1FTlRfVGVtcGxhdGUpOw0KKyAgICAgIGlmICghcE5vZGUpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0NCisgICAgICBwTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1RlbXBsYXRlKS0+cE5hbWUpOw0KKyAgICAgIGlmIChtX2JEb2N1bWVudFBhcnNlcikgew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lc3BhY2VVUkk7DQorICAgICAgICBJRkRFX1hNTEVsZW1lbnQqIHBYTUxEb2N1bWVudEVsZW1lbnQgPQ0KKyAgICAgICAgICAgIChJRkRFX1hNTEVsZW1lbnQqKXBYTUxEb2N1bWVudE5vZGU7DQorICAgICAgICBwWE1MRG9jdW1lbnRFbGVtZW50LT5HZXROYW1lc3BhY2VVUkkod3NOYW1lc3BhY2VVUkkpOw0KKyAgICAgICAgaWYgKHdzTmFtZXNwYWNlVVJJLklzRW1wdHkoKSkgew0KKyAgICAgICAgICBwWE1MRG9jdW1lbnRFbGVtZW50LT5HZXRTdHJpbmcoTCJ4bWxuczp4ZmEiLCB3c05hbWVzcGFjZVVSSSk7DQorICAgICAgICB9DQorICAgICAgICBwTm9kZS0+R2V0RG9jdW1lbnQoKS0+UmVjb2duaXplWEZBVmVyc2lvbk51bWJlcih3c05hbWVzcGFjZVVSSSk7DQorICAgICAgfQ0KKyAgICAgIGlmICghTm9ybWFsTG9hZGVyKHBOb2RlLCBwWE1MRG9jdW1lbnROb2RlLCBlUGFja2V0SUQpKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSBpZiAoZVBhY2tldElEID09IFhGQV9YRFBQQUNLRVRfRm9ybSkgew0KKyAgICBpZiAoWEZBX0ZERUV4dGVuc2lvbl9NYXRjaE5vZGVOYW1lKA0KKyAgICAgICAgICAgIHBYTUxEb2N1bWVudE5vZGUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRm9ybSktPnBOYW1lLA0KKyAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRm9ybSktPnBVUkksDQorICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Gb3JtKS0+ZUZsYWdzKSkgew0KKyAgICAgIElGREVfWE1MRWxlbWVudCogcFhNTERvY3VtZW50RWxlbWVudCA9IChJRkRFX1hNTEVsZW1lbnQqKXBYTUxEb2N1bWVudE5vZGU7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDaGVja3N1bTsNCisgICAgICBwWE1MRG9jdW1lbnRFbGVtZW50LT5HZXRTdHJpbmcoTCJjaGVja3N1bSIsIHdzQ2hlY2tzdW0pOw0KKyNpZmRlZiBfWEZBX1ZFUklGWV9DaGVja3N1bV8NCisgICAgICBpZiAod3NDaGVja3N1bS5HZXRMZW5ndGgoKSAhPSAyOCB8fA0KKyAgICAgICAgICBtX3BYTUxQYXJzZXItPm1fZHdDaGVja1N0YXR1cyAhPSAweDAzKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICB9DQorICAgICAgSVhGQV9DaGVja3N1bUNvbnRleHQqIHBDaGVja3N1bSA9IFhGQV9DaGVja3N1bV9DcmVhdGUoKTsNCisgICAgICBwQ2hlY2tzdW0tPlN0YXJ0Q2hlY2tzdW0oKTsNCisgICAgICBwQ2hlY2tzdW0tPlVwZGF0ZUNoZWNrc3VtKG1fcEZpbGVSZWFkLCBtX3BYTUxQYXJzZXItPm1fblN0YXJ0WzBdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wWE1MUGFyc2VyLT5tX25TaXplWzBdKTsNCisgICAgICBwQ2hlY2tzdW0tPlVwZGF0ZUNoZWNrc3VtKG1fcEZpbGVSZWFkLCBtX3BYTUxQYXJzZXItPm1fblN0YXJ0WzFdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wWE1MUGFyc2VyLT5tX25TaXplWzFdKTsNCisgICAgICBwQ2hlY2tzdW0tPkZpbmlzaENoZWNrc3VtKCk7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNDaGVjazsNCisgICAgICBwQ2hlY2tzdW0tPkdldENoZWNrc3VtKGJzQ2hlY2spOw0KKyAgICAgIHBDaGVja3N1bS0+UmVsZWFzZSgpOw0KKyAgICAgIGlmIChic0NoZWNrICE9IHdzQ2hlY2tzdW0uVVRGOEVuY29kZSgpKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICB9DQorI2VuZGlmDQorICAgICAgcE5vZGUgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX0VMRU1FTlRfRm9ybSk7DQorICAgICAgaWYgKCFwTm9kZSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgfQ0KKyAgICAgIHBOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRm9ybSktPnBOYW1lKTsNCisgICAgICBwTm9kZS0+U2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfQ2hlY2tzdW0sIHdzQ2hlY2tzdW0pOw0KKyAgICAgIENYRkFfTm9kZSogcFRlbXBsYXRlUm9vdCA9DQorICAgICAgICAgIG1fcFJvb3ROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRUxFTUVOVF9UZW1wbGF0ZSk7DQorICAgICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVDaG9zZW4gPQ0KKyAgICAgICAgICBwVGVtcGxhdGVSb290DQorICAgICAgICAgICAgICA/IHBUZW1wbGF0ZVJvb3QtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX1N1YmZvcm0pDQorICAgICAgICAgICAgICA6IE5VTEw7DQorICAgICAgRlhfQk9PTCBiVXNlQXR0cmlidXRlID0gVFJVRTsNCisgICAgICBpZiAocFRlbXBsYXRlQ2hvc2VuICYmDQorICAgICAgICAgIHBUZW1wbGF0ZUNob3Nlbi0+R2V0RW51bShYRkFfQVRUUklCVVRFX1Jlc3RvcmVTdGF0ZSkgIT0NCisgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX0F1dG8pIHsNCisgICAgICAgIGJVc2VBdHRyaWJ1dGUgPSBGQUxTRTsNCisgICAgICB9DQorICAgICAgaWYgKCFOb3JtYWxMb2FkZXIocE5vZGUsIHBYTUxEb2N1bWVudE5vZGUsIGVQYWNrZXRJRCwgYlVzZUF0dHJpYnV0ZSkpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKHBOb2RlKSB7DQorICAgIHBOb2RlLT5TZXRYTUxNYXBwaW5nTm9kZShwWE1MRG9jdW1lbnROb2RlKTsNCisgIH0NCisgIHJldHVybiBwTm9kZTsNCit9DQorc3RhdGljIElGREVfWE1MTm9kZSogWEZBX0dldERhdGFTZXRzRnJvbVhEUChJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUpIHsNCisgIGlmIChYRkFfRkRFRXh0ZW5zaW9uX01hdGNoTm9kZU5hbWUoDQorICAgICAgICAgIHBYTUxEb2N1bWVudE5vZGUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRGF0YXNldHMpLT5wTmFtZSwNCisgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9EYXRhc2V0cyktPnBVUkksDQorICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRGF0YXNldHMpLT5lRmxhZ3MpKSB7DQorICAgIHJldHVybiBwWE1MRG9jdW1lbnROb2RlOw0KKyAgfQ0KKyAgaWYgKCFYRkFfRkRFRXh0ZW5zaW9uX01hdGNoTm9kZU5hbWUoDQorICAgICAgICAgIHBYTUxEb2N1bWVudE5vZGUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfWERQKS0+cE5hbWUsDQorICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfWERQKS0+cFVSSSwNCisgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9YRFApLT5lRmxhZ3MpKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgZm9yIChJRkRFX1hNTE5vZGUqIHBEYXRhc2V0c05vZGUgPQ0KKyAgICAgICAgICAgcFhNTERvY3VtZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsNCisgICAgICAgcERhdGFzZXRzTm9kZTsNCisgICAgICAgcERhdGFzZXRzTm9kZSA9IHBEYXRhc2V0c05vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQorICAgIGlmICghWEZBX0ZERUV4dGVuc2lvbl9NYXRjaE5vZGVOYW1lKA0KKyAgICAgICAgICAgIHBEYXRhc2V0c05vZGUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRGF0YXNldHMpLT5wTmFtZSwNCisgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0RhdGFzZXRzKS0+cFVSSSwNCisgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0RhdGFzZXRzKS0+ZUZsYWdzKSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIHJldHVybiBwRGF0YXNldHNOb2RlOw0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9TaW1wbGVQYXJzZXI6OlBhcnNlQXNYRFBQYWNrZXRfRGF0YSgNCisgICAgSUZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLA0KKyAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkgew0KKyAgSUZERV9YTUxOb2RlKiBwRGF0YXNldHNYTUxOb2RlID0gWEZBX0dldERhdGFTZXRzRnJvbVhEUChwWE1MRG9jdW1lbnROb2RlKTsNCisgIGlmIChwRGF0YXNldHNYTUxOb2RlKSB7DQorICAgIENYRkFfTm9kZSogcE5vZGUgPQ0KKyAgICAgICAgbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0RhdGFzZXRzLCBYRkFfRUxFTUVOVF9EYXRhTW9kZWwpOw0KKyAgICBpZiAoIXBOb2RlKSB7DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgICAgICAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRGF0YXNldHMpLT5wTmFtZSk7DQorICAgIGlmICghRGF0YUxvYWRlcihwTm9kZSwgcERhdGFzZXRzWE1MTm9kZSwgRkFMU0UpKSB7DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcE5vZGUtPlNldFhNTE1hcHBpbmdOb2RlKHBEYXRhc2V0c1hNTE5vZGUpOw0KKyAgICByZXR1cm4gcE5vZGU7DQorICB9DQorICBJRkRFX1hNTE5vZGUqIHBEYXRhWE1MTm9kZSA9IE5VTEw7DQorICBpZiAoWEZBX0ZERUV4dGVuc2lvbl9NYXRjaE5vZGVOYW1lKA0KKyAgICAgICAgICBwWE1MRG9jdW1lbnROb2RlLCBGWF9XU1RSQyhMImRhdGEiKSwNCisgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9EYXRhc2V0cyktPnBVUkksDQorICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRGF0YXNldHMpLT5lRmxhZ3MpKSB7DQorICAgICgoSUZERV9YTUxFbGVtZW50KilwWE1MRG9jdW1lbnROb2RlKS0+UmVtb3ZlQXR0cmlidXRlKEwieG1sbnM6eGZhIik7DQorICAgIHBEYXRhWE1MTm9kZSA9IHBYTUxEb2N1bWVudE5vZGU7DQorICB9IGVsc2Ugew0KKyAgICBJRkRFX1hNTEVsZW1lbnQqIHBEYXRhRWxlbWVudCA9DQorICAgICAgICBJRkRFX1hNTEVsZW1lbnQ6OkNyZWF0ZShGWF9XU1RSQyhMInhmYTpkYXRhIikpOw0KKyAgICBJRkRFX1hNTE5vZGUqIHBQYXJlbnRYTUxOb2RlID0NCisgICAgICAgIHBYTUxEb2N1bWVudE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6UGFyZW50KTsNCisgICAgaWYgKHBQYXJlbnRYTUxOb2RlKSB7DQorICAgICAgcFBhcmVudFhNTE5vZGUtPlJlbW92ZUNoaWxkTm9kZShwWE1MRG9jdW1lbnROb2RlKTsNCisgICAgfQ0KKyAgICBGWFNZU19hc3NlcnQocFhNTERvY3VtZW50Tm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpOw0KKyAgICBpZiAocFhNTERvY3VtZW50Tm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAoKElGREVfWE1MRWxlbWVudCopcFhNTERvY3VtZW50Tm9kZSktPlJlbW92ZUF0dHJpYnV0ZShMInhtbG5zOnhmYSIpOw0KKyAgICB9DQorICAgIHBEYXRhRWxlbWVudC0+SW5zZXJ0Q2hpbGROb2RlKHBYTUxEb2N1bWVudE5vZGUpOw0KKyAgICBwRGF0YVhNTE5vZGUgPSBwRGF0YUVsZW1lbnQ7DQorICB9DQorICBpZiAocERhdGFYTUxOb2RlKSB7DQorICAgIENYRkFfTm9kZSogcE5vZGUgPQ0KKyAgICAgICAgbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0RhdGFzZXRzLCBYRkFfRUxFTUVOVF9EYXRhR3JvdXApOw0KKyAgICBpZiAoIXBOb2RlKSB7DQorICAgICAgaWYgKHBEYXRhWE1MTm9kZSAhPSBwWE1MRG9jdW1lbnROb2RlKSB7DQorICAgICAgICBwRGF0YVhNTE5vZGUtPlJlbGVhc2UoKTsNCisgICAgICB9DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMb2NhbE5hbWU7DQorICAgICgoSUZERV9YTUxFbGVtZW50KilwRGF0YVhNTE5vZGUpLT5HZXRMb2NhbFRhZ05hbWUod3NMb2NhbE5hbWUpOw0KKyAgICBwTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c0xvY2FsTmFtZSk7DQorICAgIGlmICghRGF0YUxvYWRlcihwTm9kZSwgcERhdGFYTUxOb2RlLCBUUlVFKSkgew0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICAgIHBOb2RlLT5TZXRYTUxNYXBwaW5nTm9kZShwRGF0YVhNTE5vZGUpOw0KKyAgICBpZiAocERhdGFYTUxOb2RlICE9IHBYTUxEb2N1bWVudE5vZGUpIHsNCisgICAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfT3duWE1MTm9kZSwgVFJVRSwgRkFMU0UpOw0KKyAgICB9DQorICAgIHJldHVybiBwTm9kZTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitDWEZBX05vZGUqIENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZUFzWERQUGFja2V0X0xvY2FsZUNvbm5lY3Rpb25Tb3VyY2VTZXQoDQorICAgIElGREVfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSwNCisgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpIHsNCisgIENYRkFfTm9kZSogcE5vZGUgPSBOVUxMOw0KKyAgaWYgKGVQYWNrZXRJRCA9PSBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCkgew0KKyAgICBpZiAoWEZBX0ZERUV4dGVuc2lvbl9NYXRjaE5vZGVOYW1lKA0KKyAgICAgICAgICAgIHBYTUxEb2N1bWVudE5vZGUsIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfTG9jYWxlU2V0KS0+cE5hbWUsDQorICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Mb2NhbGVTZXQpLT5wVVJJLA0KKyAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfTG9jYWxlU2V0KS0+ZUZsYWdzKSkgew0KKyAgICAgIHBOb2RlID0gbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VMRU1FTlRfTG9jYWxlU2V0KTsNCisgICAgICBpZiAoIXBOb2RlKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICB9DQorICAgICAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Mb2NhbGVTZXQpLT5wTmFtZSk7DQorICAgICAgaWYgKCFOb3JtYWxMb2FkZXIocE5vZGUsIHBYTUxEb2N1bWVudE5vZGUsIGVQYWNrZXRJRCkpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIGlmIChlUGFja2V0SUQgPT0gWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0KSB7DQorICAgIGlmIChYRkFfRkRFRXh0ZW5zaW9uX01hdGNoTm9kZU5hbWUoDQorICAgICAgICAgICAgcFhNTERvY3VtZW50Tm9kZSwNCisgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0Nvbm5lY3Rpb25TZXQpLT5wTmFtZSwNCisgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0Nvbm5lY3Rpb25TZXQpLT5wVVJJLA0KKyAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfQ29ubmVjdGlvblNldCktPmVGbGFncykpIHsNCisgICAgICBwTm9kZSA9IG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVF9Db25uZWN0aW9uU2V0KTsNCisgICAgICBpZiAoIXBOb2RlKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICB9DQorICAgICAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Db25uZWN0aW9uU2V0KS0+cE5hbWUpOw0KKyAgICAgIGlmICghTm9ybWFsTG9hZGVyKHBOb2RlLCBwWE1MRG9jdW1lbnROb2RlLCBlUGFja2V0SUQpKSB7DQorICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSBpZiAoZVBhY2tldElEID09IFhGQV9YRFBQQUNLRVRfU291cmNlU2V0KSB7DQorICAgIGlmIChYRkFfRkRFRXh0ZW5zaW9uX01hdGNoTm9kZU5hbWUoDQorICAgICAgICAgICAgcFhNTERvY3VtZW50Tm9kZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Tb3VyY2VTZXQpLT5wTmFtZSwNCisgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1NvdXJjZVNldCktPnBVUkksDQorICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Tb3VyY2VTZXQpLT5lRmxhZ3MpKSB7DQorICAgICAgcE5vZGUgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRUxFTUVOVF9Tb3VyY2VTZXQpOw0KKyAgICAgIGlmICghcE5vZGUpIHsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICAgIH0NCisgICAgICBwTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1NvdXJjZVNldCktPnBOYW1lKTsNCisgICAgICBpZiAoIU5vcm1hbExvYWRlcihwTm9kZSwgcFhNTERvY3VtZW50Tm9kZSwgZVBhY2tldElEKSkgew0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBpZiAocE5vZGUpIHsNCisgICAgcE5vZGUtPlNldFhNTE1hcHBpbmdOb2RlKHBYTUxEb2N1bWVudE5vZGUpOw0KKyAgfQ0KKyAgcmV0dXJuIHBOb2RlOw0KK30NCitDWEZBX05vZGUqIENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZUFzWERQUGFja2V0X1hkYygNCisgICAgSUZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLA0KKyAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkgew0KKyAgaWYgKFhGQV9GREVFeHRlbnNpb25fTWF0Y2hOb2RlTmFtZSgNCisgICAgICAgICAgcFhNTERvY3VtZW50Tm9kZSwgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9YZGMpLT5wTmFtZSwNCisgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9YZGMpLT5wVVJJLA0KKyAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1hkYyktPmVGbGFncykpIHsNCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9DQorICAgICAgICBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfWGRjLCBYRkFfRUxFTUVOVF9YZGMpOw0KKyAgICBpZiAoIXBOb2RlKSB7DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwNCisgICAgICAgICAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfWGRjKS0+cE5hbWUpOw0KKyAgICBwTm9kZS0+U2V0WE1MTWFwcGluZ05vZGUocFhNTERvY3VtZW50Tm9kZSk7DQorICAgIHJldHVybiBwTm9kZTsNCisgIH0NCisgIHJldHVybiBOVUxMOw0KK30NCitDWEZBX05vZGUqIENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZUFzWERQUGFja2V0X1VzZXIoDQorICAgIElGREVfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSwNCisgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpIHsNCisgIENYRkFfTm9kZSogcE5vZGUgPQ0KKyAgICAgIG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9YRFAsIFhGQV9FTEVNRU5UX1BhY2tldCk7DQorICBpZiAoIXBOb2RlKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOw0KKyAgKChJRkRFX1hNTEVsZW1lbnQqKXBYTUxEb2N1bWVudE5vZGUpLT5HZXRMb2NhbFRhZ05hbWUod3NOYW1lKTsNCisgIHBOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7DQorICBpZiAoIVVzZXJQYWNrZXRMb2FkZXIocE5vZGUsIHBYTUxEb2N1bWVudE5vZGUpKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgcE5vZGUtPlNldFhNTE1hcHBpbmdOb2RlKHBYTUxEb2N1bWVudE5vZGUpOw0KKyAgcmV0dXJuIHBOb2RlOw0KK30NCitDWEZBX05vZGUqIENYRkFfU2ltcGxlUGFyc2VyOjpVc2VyUGFja2V0TG9hZGVyKENYRkFfTm9kZSogcFhGQU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTE5vZGUqIHBYTUxEb2MpIHsNCisgIHJldHVybiBwWEZBTm9kZTsNCit9DQorc3RhdGljIEZYX0JPT0wgWEZBX0ZERUV4dGVuc2lvbl9Jc1N0cmluZ0FsbFdoaXRlc3BhY2UoQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0KSB7DQorICB3c1RleHQuVHJpbVJpZ2h0KEwiXHgyMFx4OVx4RFx4QSIpOw0KKyAgcmV0dXJuIHdzVGV4dC5Jc0VtcHR5KCk7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9TaW1wbGVQYXJzZXI6OkRhdGFMb2FkZXIoQ1hGQV9Ob2RlKiBwWEZBTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfWE1MTm9kZSogcFhNTERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkRvVHJhbnNmb3JtKSB7DQorICBQYXJzZURhdGFHcm91cChwWEZBTm9kZSwgcFhNTERvYywgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cyk7DQorICByZXR1cm4gcFhGQU5vZGU7DQorfQ0KK0NYRkFfTm9kZSogQ1hGQV9TaW1wbGVQYXJzZXI6Ok5vcm1hbExvYWRlcihDWEZBX05vZGUqIHBYRkFOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTE5vZGUqIHBYTUxEb2MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVc2VBdHRyaWJ1dGUpIHsNCisgIEZYX0JPT0wgYk9uZU9mUHJvcGVydHlGb3VuZCA9IEZBTFNFOw0KKyAgZm9yIChJRkRFX1hNTE5vZGUqIHBYTUxDaGlsZCA9IHBYTUxEb2MtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7DQorICAgICAgIHBYTUxDaGlsZDsNCisgICAgICAgcFhNTENoaWxkID0gcFhNTENoaWxkLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgew0KKyAgICBzd2l0Y2ggKHBYTUxDaGlsZC0+R2V0VHlwZSgpKSB7DQorICAgICAgY2FzZSBGREVfWE1MTk9ERV9FbGVtZW50OiB7DQorICAgICAgICBJRkRFX1hNTEVsZW1lbnQqIHBYTUxFbGVtZW50ID0gKElGREVfWE1MRWxlbWVudCopcFhNTENoaWxkOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUYWdOYW1lOw0KKyAgICAgICAgcFhNTEVsZW1lbnQtPkdldExvY2FsVGFnTmFtZSh3c1RhZ05hbWUpOw0KKyAgICAgICAgWEZBX0xQQ0VMRU1FTlRJTkZPIHBFbGVtSW5mbyA9IFhGQV9HZXRFbGVtZW50QnlOYW1lKHdzVGFnTmFtZSk7DQorICAgICAgICBpZiAoIXBFbGVtSW5mbykgew0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIFhGQV9MUENQUk9QRVJUWSBwUHJvcGVydHlJbmZvID0gWEZBX0dldFByb3BlcnR5T2ZFbGVtZW50KA0KKyAgICAgICAgICAgIHBYRkFOb2RlLT5HZXRDbGFzc0lEKCksIHBFbGVtSW5mby0+ZU5hbWUsIGVQYWNrZXRJRCk7DQorICAgICAgICBpZiAocFByb3BlcnR5SW5mbyAmJg0KKyAgICAgICAgICAgICgocFByb3BlcnR5SW5mby0+dUZsYWdzICYNCisgICAgICAgICAgICAgIChYRkFfUFJPUEVSVFlGTEFHX09uZU9mIHwgWEZBX1BST1BFUlRZRkxBR19EZWZhdWx0T25lT2YpKSAhPSAwKSkgew0KKyAgICAgICAgICBpZiAoYk9uZU9mUHJvcGVydHlGb3VuZCkgew0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGJPbmVPZlByb3BlcnR5Rm91bmQgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwWEZBQ2hpbGQgPQ0KKyAgICAgICAgICAgIG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoZVBhY2tldElELCBwRWxlbUluZm8tPmVOYW1lKTsNCisgICAgICAgIGlmIChwWEZBQ2hpbGQgPT0gTlVMTCkgew0KKyAgICAgICAgICByZXR1cm4gTlVMTDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChlUGFja2V0SUQgPT0gWEZBX1hEUFBBQ0tFVF9Db25maWcpIHsNCisgICAgICAgICAgcFhGQUNoaWxkLT5TZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9OYW1lLCB3c1RhZ05hbWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgRlhfQk9PTCBJc05lZWRWYWx1ZSA9IFRSVUU7DQorICAgICAgICBmb3IgKGludDMyX3QgaSA9IDAsIGNvdW50ID0gcFhNTEVsZW1lbnQtPkNvdW50QXR0cmlidXRlcygpOyBpIDwgY291bnQ7DQorICAgICAgICAgICAgIGkrKykgew0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHJRdWFsaWZpZWROYW1lOw0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHJOYW1lOw0KKyAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHJWYWx1ZTsNCisgICAgICAgICAgcFhNTEVsZW1lbnQtPkdldEF0dHJpYnV0ZShpLCB3c0F0dHJRdWFsaWZpZWROYW1lLCB3c0F0dHJWYWx1ZSk7DQorICAgICAgICAgIFhGQV9GREVFeHRlbnNpb25fR2V0QXR0cmlidXRlTG9jYWxOYW1lKHdzQXR0clF1YWxpZmllZE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzQXR0ck5hbWUpOw0KKyAgICAgICAgICBpZiAod3NBdHRyTmFtZSA9PSBGWF9XU1RSQyhMIm5pbCIpICYmDQorICAgICAgICAgICAgICB3c0F0dHJWYWx1ZSA9PSBGWF9XU1RSQyhMInRydWUiKSkgew0KKyAgICAgICAgICAgIElzTmVlZFZhbHVlID0gRkFMU0U7DQorICAgICAgICAgIH0NCisgICAgICAgICAgWEZBX0xQQ0FUVFJJQlVURUlORk8gbHBBdHRySW5mbyA9IFhGQV9HZXRBdHRyaWJ1dGVCeU5hbWUod3NBdHRyTmFtZSk7DQorICAgICAgICAgIGlmICghbHBBdHRySW5mbykgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmICghYlVzZUF0dHJpYnV0ZSAmJiBscEF0dHJJbmZvLT5lTmFtZSAhPSBYRkFfQVRUUklCVVRFX05hbWUgJiYNCisgICAgICAgICAgICAgIGxwQXR0ckluZm8tPmVOYW1lICE9IFhGQV9BVFRSSUJVVEVfU2F2ZSkgew0KKyAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHBYRkFDaGlsZC0+U2V0QXR0cmlidXRlKGxwQXR0ckluZm8tPmVOYW1lLCB3c0F0dHJWYWx1ZSk7DQorICAgICAgICB9DQorICAgICAgICBwWEZBTm9kZS0+SW5zZXJ0Q2hpbGQocFhGQUNoaWxkKTsNCisgICAgICAgIGlmIChwRWxlbUluZm8tPmVOYW1lID09IFhGQV9FTEVNRU5UX1ZhbGlkYXRlIHx8DQorICAgICAgICAgICAgcEVsZW1JbmZvLT5lTmFtZSA9PSBYRkFfRUxFTUVOVF9Mb2NhbGUpIHsNCisgICAgICAgICAgaWYgKGVQYWNrZXRJRCA9PSBYRkFfWERQUEFDS0VUX0NvbmZpZykgew0KKyAgICAgICAgICAgIFBhcnNlQ29udGVudE5vZGUocFhGQUNoaWxkLCBwWE1MRWxlbWVudCwgZVBhY2tldElEKTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBOb3JtYWxMb2FkZXIocFhGQUNoaWxkLCBwWE1MRWxlbWVudCwgZVBhY2tldElELCBiVXNlQXR0cmlidXRlKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIHN3aXRjaCAocFhGQUNoaWxkLT5HZXRPYmplY3RUeXBlKCkpIHsNCisgICAgICAgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9Db250ZW50Tm9kZToNCisgICAgICAgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9UZXh0Tm9kZToNCisgICAgICAgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9Ob2RlQzoNCisgICAgICAgICAgY2FzZSBYRkFfT0JKRUNUVFlQRV9Ob2RlVjoNCisgICAgICAgICAgICBpZiAoSXNOZWVkVmFsdWUpIHsNCisgICAgICAgICAgICAgIFBhcnNlQ29udGVudE5vZGUocFhGQUNoaWxkLCBwWE1MRWxlbWVudCwgZVBhY2tldElEKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgTm9ybWFsTG9hZGVyKHBYRkFDaGlsZCwgcFhNTEVsZW1lbnQsIGVQYWNrZXRJRCwgYlVzZUF0dHJpYnV0ZSk7DQorICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIEZERV9YTUxOT0RFX0luc3RydWN0aW9uOg0KKyAgICAgICAgUGFyc2VJbnN0cnVjdGlvbihwWEZBTm9kZSwgKElGREVfWE1MSW5zdHJ1Y3Rpb24qKXBYTUxDaGlsZCwgZVBhY2tldElEKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHBYRkFOb2RlOw0KK30NCitGWF9CT09MIFhGQV9SZWNvZ25pemVSaWNoVGV4dChJRkRFX1hNTEVsZW1lbnQqIHBSaWNoVGV4dFhNTE5vZGUpIHsNCisgIGlmIChwUmljaFRleHRYTUxOb2RlKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZXNwYWNlVVJJOw0KKyAgICBYRkFfRkRFRXh0ZW5zaW9uX0dldEVsZW1lbnRUYWdOYW1lc3BhY2VVUkkocFJpY2hUZXh0WE1MTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzTmFtZXNwYWNlVVJJKTsNCisgICAgaWYgKHdzTmFtZXNwYWNlVVJJID09IEZYX1dTVFJDKEwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIpKSB7DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorY2xhc3MgUmljaFRleHROb2RlVmlzaXRvciB7DQorIHB1YmxpYzoNCisgIHN0YXRpYyBpbmxpbmUgSUZERV9YTUxOb2RlKiBHZXRGaXJzdENoaWxkKElGREVfWE1MTm9kZSogcE5vZGUpIHsNCisgICAgcmV0dXJuIHBOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOw0KKyAgfQ0KKyAgc3RhdGljIGlubGluZSBJRkRFX1hNTE5vZGUqIEdldE5leHRTaWJsaW5nKElGREVfWE1MTm9kZSogcE5vZGUpIHsNCisgICAgcmV0dXJuIHBOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKTsNCisgIH0NCisgIHN0YXRpYyBpbmxpbmUgSUZERV9YTUxOb2RlKiBHZXRQYXJlbnQoSUZERV9YTUxOb2RlKiBwTm9kZSkgew0KKyAgICByZXR1cm4gcE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6UGFyZW50KTsNCisgIH0NCit9Ow0KKyNpZm5kZWYgWEZBX1BBUlNFX0hBU19MSU5FSURFTlRJRklFUg0KK3ZvaWQgWEZBX0NvbnZlcnRSaWNoVGV4dFRvUGxhaW5UZXh0KElGREVfWE1MRWxlbWVudCogcFJpY2hUZXh0WE1MTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpIHsNCisgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8SUZERV9YTUxOb2RlLCBSaWNoVGV4dE5vZGVWaXNpdG9yPiBzSXRlcmF0b3IoDQorICAgICAgcFJpY2hUZXh0WE1MTm9kZSk7DQorICBDRlhfV2lkZVRleHRCdWYgd3NQbGFpblRleHRCdWY7DQorICBmb3IgKElGREVfWE1MTm9kZSogcE5vZGUgPSBzSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwTm9kZTsNCisgICAgICAgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7DQorICAgIHN3aXRjaCAocE5vZGUtPkdldFR5cGUoKSkgew0KKyAgICAgIGNhc2UgRkRFX1hNTE5PREVfVGV4dDogew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICAgICAgKChJRkRFX1hNTFRleHQqKXBOb2RlKS0+R2V0VGV4dCh3c1RleHQpOw0KKyAgICAgICAgd3NQbGFpblRleHRCdWYgPDwgd3NUZXh0Ow0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MTk9ERV9DaGFyRGF0YTogew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICAgICAgKChJRkRFX1hNTENoYXJEYXRhKilwTm9kZSktPkdldENoYXJEYXRhKHdzVGV4dCk7DQorICAgICAgICB3c1BsYWluVGV4dEJ1ZiA8PCB3c1RleHQ7DQorICAgICAgfSBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHdzT3V0cHV0ID0gd3NQbGFpblRleHRCdWYuR2V0V2lkZVN0cmluZygpOw0KK30NCisjZW5kaWYNCit2b2lkIFhGQV9Db252ZXJ0WE1MVG9QbGFpblRleHQoSUZERV9YTUxFbGVtZW50KiBwUm9vdFhNTE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkgew0KKyAgZm9yIChJRkRFX1hNTE5vZGUqIHBYTUxDaGlsZCA9DQorICAgICAgICAgICBwUm9vdFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7DQorICAgICAgIHBYTUxDaGlsZDsNCisgICAgICAgcFhNTENoaWxkID0gcFhNTENoaWxkLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgew0KKyNpZmRlZiBfREVCVUcNCisgICAgRkRFX1hNTE5PREVUWVBFIG5vZGVUeXBlID0gcFhNTENoaWxkLT5HZXRUeXBlKCk7DQorI2VuZGlmDQorICAgIHN3aXRjaCAocFhNTENoaWxkLT5HZXRUeXBlKCkpIHsNCisgICAgICBjYXNlIEZERV9YTUxOT0RFX0VsZW1lbnQ6IHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dERhdGE7DQorICAgICAgICAoKElGREVfWE1MRWxlbWVudCopcFhNTENoaWxkKS0+R2V0VGV4dERhdGEod3NUZXh0RGF0YSk7DQorICAgICAgICB3c1RleHREYXRhICs9IEZYX1dTVFJDKEwiXG4iKTsNCisgICAgICAgIHdzT3V0cHV0ICs9IHdzVGV4dERhdGE7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIEZERV9YTUxOT0RFX1RleHQ6IHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICAgICgoSUZERV9YTUxUZXh0KilwWE1MQ2hpbGQpLT5HZXRUZXh0KHdzVGV4dCk7DQorICAgICAgICBpZiAoWEZBX0ZERUV4dGVuc2lvbl9Jc1N0cmluZ0FsbFdoaXRlc3BhY2Uod3NUZXh0KSkgew0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIHdzT3V0cHV0ID0gd3NUZXh0Ow0KKyAgICAgICAgfQ0KKyAgICAgIH0gYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MTk9ERV9DaGFyRGF0YTogew0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDaGFyRGF0YTsNCisgICAgICAgICgoSUZERV9YTUxDaGFyRGF0YSopcFhNTENoaWxkKS0+R2V0Q2hhckRhdGEod3NDaGFyRGF0YSk7DQorICAgICAgICBpZiAoWEZBX0ZERUV4dGVuc2lvbl9Jc1N0cmluZ0FsbFdoaXRlc3BhY2Uod3NDaGFyRGF0YSkpIHsNCisgICAgICAgICAgY29udGludWU7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICB3c091dHB1dCA9IHdzQ2hhckRhdGE7DQorICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgRlhTWVNfYXNzZXJ0KEZBTFNFKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9TaW1wbGVQYXJzZXI6OlBhcnNlQ29udGVudE5vZGUoQ1hGQV9Ob2RlKiBwWEZBTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkgew0KKyAgWEZBX0VMRU1FTlQgZWxlbWVudCA9IFhGQV9FTEVNRU5UX1NoYXJwdGV4dDsNCisgIGlmIChwWEZBTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4RGF0YSkgew0KKyAgICBDRlhfV2lkZVN0cmluZ0Mgd3NDb250ZW50VHlwZSA9DQorICAgICAgICBwWEZBTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSk7DQorICAgIGlmICh3c0NvbnRlbnRUeXBlID09IEZYX1dTVFJDKEwidGV4dC9odG1sIikpIHsNCisgICAgICBlbGVtZW50ID0gWEZBX0VMRU1FTlRfU2hhcnB4SFRNTDsNCisgICAgfSBlbHNlIGlmICh3c0NvbnRlbnRUeXBlID09IEZYX1dTVFJDKEwidGV4dC94bWwiKSkgew0KKyAgICAgIGVsZW1lbnQgPSBYRkFfRUxFTUVOVF9TaGFycHhtbDsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGVsZW1lbnQgPT0gWEZBX0VMRU1FTlRfU2hhcnB4SFRNTCkgew0KKyAgICBwWEZBTm9kZS0+U2V0WE1MTWFwcGluZ05vZGUocFhNTE5vZGUpOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgIGZvciAoSUZERV9YTUxOb2RlKiBwWE1MQ2hpbGQgPQ0KKyAgICAgICAgICAgcFhNTE5vZGUtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7DQorICAgICAgIHBYTUxDaGlsZDsNCisgICAgICAgcFhNTENoaWxkID0gcFhNTENoaWxkLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgew0KKyAgICBGREVfWE1MTk9ERVRZUEUgZU5vZGVUeXBlID0gcFhNTENoaWxkLT5HZXRUeXBlKCk7DQorICAgIGlmIChlTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb24pIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBpZiAoZWxlbWVudCA9PSBYRkFfRUxFTUVOVF9TaGFycHhIVE1MKSB7DQorICAgICAgaWYgKGVOb2RlVHlwZSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgaWYgKFhGQV9SZWNvZ25pemVSaWNoVGV4dCgoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQpKSB7DQorI2lmZGVmIFhGQV9QQVJTRV9IQVNfTElORUlERU5USUZJRVINCisgICAgICAgIFhGQV9HZXRQbGFpblRleHRGcm9tUmljaFRleHQoKElGREVfWE1MRWxlbWVudCopcFhNTENoaWxkLCB3c1ZhbHVlKTsNCisjZWxzZQ0KKyAgICAgICAgWEZBX0NvbnZlcnRSaWNoVGV4dFRvUGxhaW5UZXh0KChJRkRFX1hNTEVsZW1lbnQqKXBYTUxDaGlsZCwgd3NWYWx1ZSk7DQorI2VuZGlmDQorICAgICAgfQ0KKyAgICB9IGVsc2UgaWYgKGVsZW1lbnQgPT0gWEZBX0VMRU1FTlRfU2hhcnB4bWwpIHsNCisgICAgICBpZiAoZU5vZGVUeXBlICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBYRkFfQ29udmVydFhNTFRvUGxhaW5UZXh0KChJRkRFX1hNTEVsZW1lbnQqKXBYTUxDaGlsZCwgd3NWYWx1ZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKGVOb2RlVHlwZSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgaWYgKGVOb2RlVHlwZSA9PSBGREVfWE1MTk9ERV9UZXh0KSB7DQorICAgICAgICAoKElGREVfWE1MVGV4dCopcFhNTENoaWxkKS0+R2V0VGV4dCh3c1ZhbHVlKTsNCisgICAgICB9IGVsc2UgaWYgKGVOb2RlVHlwZSA9PSBGREVfWE1MTk9ERV9DaGFyRGF0YSkgew0KKyAgICAgICAgKChJRkRFX1hNTENoYXJEYXRhKilwWE1MQ2hpbGQpLT5HZXRDaGFyRGF0YSh3c1ZhbHVlKTsNCisgICAgICB9DQorICAgIH0NCisgICAgYnJlYWs7DQorICB9DQorICBpZiAoIXdzVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgIGlmIChwWEZBTm9kZS0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX0NvbnRlbnROb2RlKSB7DQorICAgICAgQ1hGQV9Ob2RlKiBwQ29udGVudFJhd0RhdGFOb2RlID0NCisgICAgICAgICAgbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShlUGFja2V0SUQsIGVsZW1lbnQpOw0KKyAgICAgIEZYU1lTX2Fzc2VydChwQ29udGVudFJhd0RhdGFOb2RlKTsNCisgICAgICBwQ29udGVudFJhd0RhdGFOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c1ZhbHVlKTsNCisgICAgICBwWEZBTm9kZS0+SW5zZXJ0Q2hpbGQocENvbnRlbnRSYXdEYXRhTm9kZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgcFhGQU5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzVmFsdWUpOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9TaW1wbGVQYXJzZXI6OlBhcnNlRGF0YUdyb3VwKENYRkFfTm9kZSogcFhGQU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkgew0KKyAgZm9yIChJRkRFX1hNTE5vZGUqIHBYTUxDaGlsZCA9DQorICAgICAgICAgICBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsNCisgICAgICAgcFhNTENoaWxkOw0KKyAgICAgICBwWE1MQ2hpbGQgPSBwWE1MQ2hpbGQtPkdldE5vZGVJdGVtKElGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7DQorICAgIHN3aXRjaCAocFhNTENoaWxkLT5HZXRUeXBlKCkpIHsNCisgICAgICBjYXNlIEZERV9YTUxOT0RFX0VsZW1lbnQ6IHsNCisgICAgICAgIElGREVfWE1MRWxlbWVudCogcFhNTEVsZW1lbnQgPSAoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQ7DQorICAgICAgICB7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZXNwYWNlVVJJOw0KKyAgICAgICAgICBYRkFfRkRFRXh0ZW5zaW9uX0dldEVsZW1lbnRUYWdOYW1lc3BhY2VVUkkocFhNTEVsZW1lbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c05hbWVzcGFjZVVSSSk7DQorICAgICAgICAgIGlmICh3c05hbWVzcGFjZVVSSSA9PQ0KKyAgICAgICAgICAgICAgICAgIEZYX1dTVFJDKEwiaHR0cDovL3d3dy54ZmEuY29tL3NjaGVtYS94ZmEtcGFja2FnZS8iKSB8fA0KKyAgICAgICAgICAgICAgd3NOYW1lc3BhY2VVUkkgPT0NCisgICAgICAgICAgICAgICAgICBGWF9XU1RSQyhMImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLXBhY2thZ2UvIikgfHwNCisgICAgICAgICAgICAgIHdzTmFtZXNwYWNlVVJJID09DQorICAgICAgICAgICAgICAgICAgRlhfV1NUUkMoTCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIpKSB7DQorICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgIH0NCisgICAgICAgICAgaWYgKDApIHsNCisgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgWEZBX0VMRU1FTlQgZU5vZGVUeXBlID0gWEZBX0VMRU1FTlRfRGF0YU1vZGVsOw0KKyAgICAgICAgaWYgKGVOb2RlVHlwZSA9PSBYRkFfRUxFTUVOVF9EYXRhTW9kZWwpIHsNCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRhTm9kZUF0dHI7DQorICAgICAgICAgIGlmIChYRkFfRkRFRXh0ZW5zaW9uX0ZpbmRBdHRyaWJ1dGVXaXRoTlMoDQorICAgICAgICAgICAgICAgICAgcFhNTEVsZW1lbnQsIEZYX1dTVFJDKEwiZGF0YU5vZGUiKSwNCisgICAgICAgICAgICAgICAgICBGWF9XU1RSQyhMImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWRhdGEvMS4wLyIpLA0KKyAgICAgICAgICAgICAgICAgIHdzRGF0YU5vZGVBdHRyKSkgew0KKyAgICAgICAgICAgIGlmICh3c0RhdGFOb2RlQXR0ciA9PSBGWF9XU1RSQyhMImRhdGFHcm91cCIpKSB7DQorICAgICAgICAgICAgICBlTm9kZVR5cGUgPSBYRkFfRUxFTUVOVF9EYXRhR3JvdXA7DQorICAgICAgICAgICAgfSBlbHNlIGlmICh3c0RhdGFOb2RlQXR0ciA9PSBGWF9XU1RSQyhMImRhdGFWYWx1ZSIpKSB7DQorICAgICAgICAgICAgICBlTm9kZVR5cGUgPSBYRkFfRUxFTUVOVF9EYXRhVmFsdWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlOw0KKyAgICAgICAgaWYgKGVOb2RlVHlwZSA9PSBYRkFfRUxFTUVOVF9EYXRhTW9kZWwpIHsNCisgICAgICAgICAgaWYgKFhGQV9GREVFeHRlbnNpb25fRmluZEF0dHJpYnV0ZVdpdGhOUygNCisgICAgICAgICAgICAgICAgICBwWE1MRWxlbWVudCwgRlhfV1NUUkMoTCJjb250ZW50VHlwZSIpLA0KKyAgICAgICAgICAgICAgICAgIEZYX1dTVFJDKEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtZGF0YS8xLjAvIiksDQorICAgICAgICAgICAgICAgICAgd3NDb250ZW50VHlwZSkpIHsNCisgICAgICAgICAgICBpZiAoIXdzQ29udGVudFR5cGUuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgICBlTm9kZVR5cGUgPSBYRkFfRUxFTUVOVF9EYXRhVmFsdWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoZU5vZGVUeXBlID09IFhGQV9FTEVNRU5UX0RhdGFNb2RlbCkgew0KKyAgICAgICAgICBmb3IgKElGREVfWE1MTm9kZSogcFhNTERhdGFDaGlsZCA9DQorICAgICAgICAgICAgICAgICAgIHBYTUxFbGVtZW50LT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOw0KKyAgICAgICAgICAgICAgIHBYTUxEYXRhQ2hpbGQ7IHBYTUxEYXRhQ2hpbGQgPSBwWE1MRGF0YUNoaWxkLT5HZXROb2RlSXRlbSgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgICAgICAgICBpZiAocFhNTERhdGFDaGlsZC0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsNCisgICAgICAgICAgICAgIGlmICghWEZBX1JlY29nbml6ZVJpY2hUZXh0KChJRkRFX1hNTEVsZW1lbnQqKXBYTUxEYXRhQ2hpbGQpKSB7DQorICAgICAgICAgICAgICAgIGVOb2RlVHlwZSA9IFhGQV9FTEVNRU5UX0RhdGFHcm91cDsNCisgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoZU5vZGVUeXBlID09IFhGQV9FTEVNRU5UX0RhdGFNb2RlbCkgew0KKyAgICAgICAgICBlTm9kZVR5cGUgPSBYRkFfRUxFTUVOVF9EYXRhVmFsdWU7DQorICAgICAgICB9DQorICAgICAgICBDWEZBX05vZGUqIHBYRkFDaGlsZCA9DQorICAgICAgICAgICAgbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0RhdGFzZXRzLCBlTm9kZVR5cGUpOw0KKyAgICAgICAgaWYgKHBYRkFDaGlsZCA9PSBOVUxMKSB7DQorICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTm9kZU5hbWU7DQorICAgICAgICBwWE1MRWxlbWVudC0+R2V0TG9jYWxUYWdOYW1lKHdzTm9kZU5hbWUpOw0KKyAgICAgICAgcFhGQUNoaWxkLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTm9kZU5hbWUpOw0KKyAgICAgICAgRlhfQk9PTCBiTmVlZFZhbHVlID0gVFJVRTsNCisgICAgICAgIGlmICgxKSB7DQorICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMCwgY291bnQgPSBwWE1MRWxlbWVudC0+Q291bnRBdHRyaWJ1dGVzKCk7IGkgPCBjb3VudDsNCisgICAgICAgICAgICAgICBpKyspIHsNCisgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHJRdWFsaWZpZWROYW1lOw0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0clZhbHVlOw0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0ck5hbWU7DQorICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyTmFtZXNwYWNlVVJJOw0KKyAgICAgICAgICAgIHBYTUxFbGVtZW50LT5HZXRBdHRyaWJ1dGUoaSwgd3NBdHRyUXVhbGlmaWVkTmFtZSwgd3NBdHRyVmFsdWUpOw0KKyAgICAgICAgICAgIGlmICghWEZBX0ZERUV4dGVuc2lvbl9SZXNvbHZlQXR0cmlidXRlKA0KKyAgICAgICAgICAgICAgICAgICAgcFhNTEVsZW1lbnQsIHdzQXR0clF1YWxpZmllZE5hbWUsIHdzQXR0ck5hbWUsDQorICAgICAgICAgICAgICAgICAgICB3c0F0dHJOYW1lc3BhY2VVUkkpKSB7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHdzQXR0ck5hbWUgPT0gRlhfV1NUUkMoTCJuaWwiKSAmJg0KKyAgICAgICAgICAgICAgICB3c0F0dHJWYWx1ZSA9PSBGWF9XU1RSQyhMInRydWUiKSkgew0KKyAgICAgICAgICAgICAgYk5lZWRWYWx1ZSA9IEZBTFNFOw0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmICh3c0F0dHJOYW1lc3BhY2VVUkkgPT0NCisgICAgICAgICAgICAgICAgICAgIEZYX1dTVFJDKEwiaHR0cDovL3d3dy54ZmEuY29tL3NjaGVtYS94ZmEtcGFja2FnZS8iKSB8fA0KKyAgICAgICAgICAgICAgICB3c0F0dHJOYW1lc3BhY2VVUkkgPT0NCisgICAgICAgICAgICAgICAgICAgIEZYX1dTVFJDKEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtcGFja2FnZS8iKSB8fA0KKyAgICAgICAgICAgICAgICB3c0F0dHJOYW1lc3BhY2VVUkkgPT0NCisgICAgICAgICAgICAgICAgICAgIEZYX1dTVFJDKEwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiKSB8fA0KKyAgICAgICAgICAgICAgICB3c0F0dHJOYW1lc3BhY2VVUkkgPT0NCisgICAgICAgICAgICAgICAgICAgIEZYX1dTVFJDKEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtZGF0YS8xLjAvIikpIHsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoMCkgew0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIENYRkFfTm9kZSogcFhGQU1ldGFEYXRhID0gbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZSgNCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgWEZBX0VMRU1FTlRfRGF0YVZhbHVlKTsNCisgICAgICAgICAgICBpZiAocFhGQU1ldGFEYXRhID09IE5VTEwpIHsNCisgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcFhGQU1ldGFEYXRhLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzQXR0ck5hbWUpOw0KKyAgICAgICAgICAgIHBYRkFNZXRhRGF0YS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9RdWFsaWZpZWROYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NBdHRyUXVhbGlmaWVkTmFtZSk7DQorICAgICAgICAgICAgcFhGQU1ldGFEYXRhLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0F0dHJWYWx1ZSk7DQorICAgICAgICAgICAgcFhGQU1ldGFEYXRhLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfQ29udGFpbnMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX01ldGFEYXRhKTsNCisgICAgICAgICAgICBwWEZBQ2hpbGQtPkluc2VydENoaWxkKHBYRkFNZXRhRGF0YSk7DQorICAgICAgICAgICAgcFhGQU1ldGFEYXRhLT5TZXRYTUxNYXBwaW5nTm9kZShwWE1MRWxlbWVudCk7DQorICAgICAgICAgICAgcFhGQU1ldGFEYXRhLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCwgVFJVRSwgRkFMU0UpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmICghYk5lZWRWYWx1ZSkgew0KKyAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTmlsTmFtZSA9IEZYX1dTVFJDKEwieHNpOm5pbCIpOw0KKyAgICAgICAgICAgIHBYTUxFbGVtZW50LT5SZW1vdmVBdHRyaWJ1dGUod3NOaWxOYW1lKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcFhGQU5vZGUtPkluc2VydENoaWxkKHBYRkFDaGlsZCk7DQorICAgICAgICBpZiAoZU5vZGVUeXBlID09IFhGQV9FTEVNRU5UX0RhdGFHcm91cCkgew0KKyAgICAgICAgICBQYXJzZURhdGFHcm91cChwWEZBQ2hpbGQsIHBYTUxFbGVtZW50LCBlUGFja2V0SUQpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgaWYgKGJOZWVkVmFsdWUpIHsNCisgICAgICAgICAgICBQYXJzZURhdGFWYWx1ZShwWEZBQ2hpbGQsIHBYTUxDaGlsZCwgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cyk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHBYRkFDaGlsZC0+U2V0WE1MTWFwcGluZ05vZGUocFhNTEVsZW1lbnQpOw0KKyAgICAgICAgcFhGQUNoaWxkLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCwgVFJVRSwgRkFMU0UpOw0KKyAgICAgIH0NCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGNhc2UgRkRFX1hNTE5PREVfQ2hhckRhdGE6IHsNCisgICAgICAgIElGREVfWE1MQ2hhckRhdGEqIHBYTUxDaGFyRGF0YSA9IChJRkRFX1hNTENoYXJEYXRhKilwWE1MQ2hpbGQ7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NoYXJEYXRhOw0KKyAgICAgICAgcFhNTENoYXJEYXRhLT5HZXRDaGFyRGF0YSh3c0NoYXJEYXRhKTsNCisgICAgICAgIGlmIChYRkFfRkRFRXh0ZW5zaW9uX0lzU3RyaW5nQWxsV2hpdGVzcGFjZSh3c0NoYXJEYXRhKSkgew0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIENYRkFfTm9kZSogcFhGQUNoaWxkID0gbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0RhdGFzZXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSk7DQorICAgICAgICBpZiAocFhGQUNoaWxkID09IE5VTEwpIHsNCisgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcFhGQUNoaWxkLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NoYXJEYXRhKTsNCisgICAgICAgIHBYRkFOb2RlLT5JbnNlcnRDaGlsZChwWEZBQ2hpbGQpOw0KKyAgICAgICAgcFhGQUNoaWxkLT5TZXRYTUxNYXBwaW5nTm9kZShwWE1MQ2hhckRhdGEpOw0KKyAgICAgICAgcFhGQUNoaWxkLT5TZXRGbGFnKFhGQV9OT0RFRkxBR19Jbml0aWFsaXplZCwgVFJVRSwgRkFMU0UpOw0KKyAgICAgIH0NCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIGNhc2UgRkRFX1hNTE5PREVfVGV4dDogew0KKyAgICAgICAgSUZERV9YTUxUZXh0KiBwWE1MVGV4dCA9IChJRkRFX1hNTFRleHQqKXBYTUxDaGlsZDsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsNCisgICAgICAgIHBYTUxUZXh0LT5HZXRUZXh0KHdzVGV4dCk7DQorICAgICAgICBpZiAoWEZBX0ZERUV4dGVuc2lvbl9Jc1N0cmluZ0FsbFdoaXRlc3BhY2Uod3NUZXh0KSkgew0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0NCisgICAgICAgIENYRkFfTm9kZSogcFhGQUNoaWxkID0gbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0RhdGFzZXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FTEVNRU5UX0RhdGFWYWx1ZSk7DQorICAgICAgICBpZiAocFhGQUNoaWxkID09IE5VTEwpIHsNCisgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcFhGQUNoaWxkLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c1RleHQpOw0KKyAgICAgICAgcFhGQU5vZGUtPkluc2VydENoaWxkKHBYRkFDaGlsZCk7DQorICAgICAgICBwWEZBQ2hpbGQtPlNldFhNTE1hcHBpbmdOb2RlKHBYTUxUZXh0KTsNCisgICAgICAgIHBYRkFDaGlsZC0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQsIFRSVUUsIEZBTFNFKTsNCisgICAgICB9DQorICAgICAgICBjb250aW51ZTsNCisgICAgICBjYXNlIEZERV9YTUxOT0RFX0luc3RydWN0aW9uOg0KKyAgICAgICAgY29udGludWU7DQorICAgICAgZGVmYXVsdDoNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9TaW1wbGVQYXJzZXI6OlBhcnNlRGF0YVZhbHVlKENYRkFfTm9kZSogcFhGQU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkgew0KKyAgQ0ZYX1dpZGVUZXh0QnVmIHdzVmFsdWVUZXh0QnVmOw0KKyAgQ0ZYX1dpZGVUZXh0QnVmIHdzQ3VyVmFsdWVUZXh0QnVmOw0KKyAgRlhfQk9PTCBiTWFya0FzQ29tcG91bmQgPSBGQUxTRTsNCisgIElGREVfWE1MTm9kZSogcFhNTEN1clZhbHVlTm9kZSA9IE5VTEw7DQorICBmb3IgKElGREVfWE1MTm9kZSogcFhNTENoaWxkID0NCisgICAgICAgICAgIHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOw0KKyAgICAgICBwWE1MQ2hpbGQ7DQorICAgICAgIHBYTUxDaGlsZCA9IHBYTUxDaGlsZC0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgRkRFX1hNTE5PREVUWVBFIGVOb2RlVHlwZSA9IHBYTUxDaGlsZC0+R2V0VHlwZSgpOw0KKyAgICBpZiAoZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX0luc3RydWN0aW9uKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Ow0KKyAgICBpZiAoZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX1RleHQpIHsNCisgICAgICAoKElGREVfWE1MVGV4dCopcFhNTENoaWxkKS0+R2V0VGV4dCh3c1RleHQpOw0KKyAgICAgIGlmICghcFhNTEN1clZhbHVlTm9kZSkgew0KKyAgICAgICAgcFhNTEN1clZhbHVlTm9kZSA9IHBYTUxDaGlsZDsNCisgICAgICB9DQorICAgICAgd3NDdXJWYWx1ZVRleHRCdWYgPDwgd3NUZXh0Ow0KKyAgICB9IGVsc2UgaWYgKGVOb2RlVHlwZSA9PSBGREVfWE1MTk9ERV9DaGFyRGF0YSkgew0KKyAgICAgICgoSUZERV9YTUxDaGFyRGF0YSopcFhNTENoaWxkKS0+R2V0Q2hhckRhdGEod3NUZXh0KTsNCisgICAgICBpZiAoIXBYTUxDdXJWYWx1ZU5vZGUpIHsNCisgICAgICAgIHBYTUxDdXJWYWx1ZU5vZGUgPSBwWE1MQ2hpbGQ7DQorICAgICAgfQ0KKyAgICAgIHdzQ3VyVmFsdWVUZXh0QnVmIDw8IHdzVGV4dDsNCisgICAgfSBlbHNlIGlmIChYRkFfUmVjb2duaXplUmljaFRleHQoKElGREVfWE1MRWxlbWVudCopcFhNTENoaWxkKSkgew0KKyNpZmRlZiBYRkFfUEFSU0VfSEFTX0xJTkVJREVOVElGSUVSDQorICAgICAgWEZBX0dldFBsYWluVGV4dEZyb21SaWNoVGV4dCgoSUZERV9YTUxFbGVtZW50KilwWE1MQ2hpbGQsIHdzVGV4dCk7DQorI2Vsc2UNCisgICAgICBYRkFfQ29udmVydFJpY2hUZXh0VG9QbGFpblRleHQoKElGREVfWE1MRWxlbWVudCopcFhNTENoaWxkLCB3c1RleHQpOw0KKyNlbmRpZg0KKyAgICAgIGlmICghcFhNTEN1clZhbHVlTm9kZSkgew0KKyAgICAgICAgcFhNTEN1clZhbHVlTm9kZSA9IHBYTUxDaGlsZDsNCisgICAgICB9DQorICAgICAgd3NDdXJWYWx1ZVRleHRCdWYgPDwgd3NUZXh0Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGJNYXJrQXNDb21wb3VuZCA9IFRSVUU7DQorICAgICAgaWYgKHBYTUxDdXJWYWx1ZU5vZGUpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0N1clZhbHVlID0gd3NDdXJWYWx1ZVRleHRCdWYuR2V0V2lkZVN0cmluZygpOw0KKyAgICAgICAgaWYgKCF3c0N1clZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgICAgICBDWEZBX05vZGUqIHBYRkFDaGlsZCA9DQorICAgICAgICAgICAgICBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKGVQYWNrZXRJRCwgWEZBX0VMRU1FTlRfRGF0YVZhbHVlKTsNCisgICAgICAgICAgaWYgKHBYRkFDaGlsZCA9PSBOVUxMKSB7DQorICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIHBYRkFDaGlsZC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCBGWF9XU1RSQyhMIiIpKTsNCisgICAgICAgICAgcFhGQUNoaWxkLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0N1clZhbHVlKTsNCisgICAgICAgICAgcFhGQU5vZGUtPkluc2VydENoaWxkKHBYRkFDaGlsZCk7DQorICAgICAgICAgIHBYRkFDaGlsZC0+U2V0WE1MTWFwcGluZ05vZGUocFhNTEN1clZhbHVlTm9kZSk7DQorICAgICAgICAgIHBYRkFDaGlsZC0+U2V0RmxhZyhYRkFfTk9ERUZMQUdfSW5pdGlhbGl6ZWQsIFRSVUUsIEZBTFNFKTsNCisgICAgICAgICAgd3NWYWx1ZVRleHRCdWYgPDwgd3NDdXJWYWx1ZTsNCisgICAgICAgICAgd3NDdXJWYWx1ZVRleHRCdWYuQ2xlYXIoKTsNCisgICAgICAgIH0NCisgICAgICAgIHBYTUxDdXJWYWx1ZU5vZGUgPSBOVUxMOw0KKyAgICAgIH0NCisgICAgICBDWEZBX05vZGUqIHBYRkFDaGlsZCA9DQorICAgICAgICAgIG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoZVBhY2tldElELCBYRkFfRUxFTUVOVF9EYXRhVmFsdWUpOw0KKyAgICAgIGlmIChwWEZBQ2hpbGQgPT0gTlVMTCkgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgICBDRlhfV2lkZVN0cmluZyB3c05vZGVTdHI7DQorICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKXBYTUxDaGlsZCktPkdldExvY2FsVGFnTmFtZSh3c05vZGVTdHIpOw0KKyAgICAgIHBYRkFDaGlsZC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05vZGVTdHIpOw0KKyAgICAgIFBhcnNlRGF0YVZhbHVlKHBYRkFDaGlsZCwgcFhNTENoaWxkLCBlUGFja2V0SUQpOw0KKyAgICAgIHBYRkFOb2RlLT5JbnNlcnRDaGlsZChwWEZBQ2hpbGQpOw0KKyAgICAgIHBYRkFDaGlsZC0+U2V0WE1MTWFwcGluZ05vZGUocFhNTENoaWxkKTsNCisgICAgICBwWEZBQ2hpbGQtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkLCBUUlVFLCBGQUxTRSk7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQ3VyVmFsdWUgPSBwWEZBQ2hpbGQtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUpOw0KKyAgICAgIHdzVmFsdWVUZXh0QnVmIDw8IHdzQ3VyVmFsdWU7DQorICAgIH0NCisgIH0NCisgIGlmIChwWE1MQ3VyVmFsdWVOb2RlKSB7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c0N1clZhbHVlID0gd3NDdXJWYWx1ZVRleHRCdWYuR2V0V2lkZVN0cmluZygpOw0KKyAgICBpZiAoIXdzQ3VyVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgaWYgKGJNYXJrQXNDb21wb3VuZCkgew0KKyAgICAgICAgQ1hGQV9Ob2RlKiBwWEZBQ2hpbGQgPQ0KKyAgICAgICAgICAgIG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoZVBhY2tldElELCBYRkFfRUxFTUVOVF9EYXRhVmFsdWUpOw0KKyAgICAgICAgaWYgKHBYRkFDaGlsZCA9PSBOVUxMKSB7DQorICAgICAgICAgIHJldHVybjsNCisgICAgICAgIH0NCisgICAgICAgIHBYRkFDaGlsZC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCBGWF9XU1RSQyhMIiIpKTsNCisgICAgICAgIHBYRkFDaGlsZC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NDdXJWYWx1ZSk7DQorICAgICAgICBwWEZBTm9kZS0+SW5zZXJ0Q2hpbGQocFhGQUNoaWxkKTsNCisgICAgICAgIHBYRkFDaGlsZC0+U2V0WE1MTWFwcGluZ05vZGUocFhNTEN1clZhbHVlTm9kZSk7DQorICAgICAgICBwWEZBQ2hpbGQtPlNldEZsYWcoWEZBX05PREVGTEFHX0luaXRpYWxpemVkLCBUUlVFLCBGQUxTRSk7DQorICAgICAgfQ0KKyAgICAgIHdzVmFsdWVUZXh0QnVmIDw8IHdzQ3VyVmFsdWU7DQorICAgICAgd3NDdXJWYWx1ZVRleHRCdWYuQ2xlYXIoKTsNCisgICAgfQ0KKyAgICBwWE1MQ3VyVmFsdWVOb2RlID0gTlVMTDsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nQyB3c05vZGVWYWx1ZSA9IHdzVmFsdWVUZXh0QnVmLkdldFdpZGVTdHJpbmcoKTsNCisgIHBYRkFOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c05vZGVWYWx1ZSk7DQorfQ0KK3ZvaWQgQ1hGQV9TaW1wbGVQYXJzZXI6OlBhcnNlSW5zdHJ1Y3Rpb24oQ1hGQV9Ob2RlKiBwWEZBTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfWE1MSW5zdHJ1Y3Rpb24qIHBYTUxJbnN0cnVjdGlvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKSB7DQorICBpZiAoIW1fYkRvY3VtZW50UGFyc2VyKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzVGFyZ2V0TmFtZTsNCisgIHBYTUxJbnN0cnVjdGlvbi0+R2V0VGFyZ2V0TmFtZSh3c1RhcmdldE5hbWUpOw0KKyAgaWYgKHdzVGFyZ2V0TmFtZSA9PSBGWF9XU1RSQyhMIm9yaWdpbmFsWEZBVmVyc2lvbiIpKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0YTsNCisgICAgaWYgKHBYTUxJbnN0cnVjdGlvbi0+R2V0RGF0YSgwLCB3c0RhdGEpICYmDQorICAgICAgICAocFhGQU5vZGUtPkdldERvY3VtZW50KCktPlJlY29nbml6ZVhGQVZlcnNpb25OdW1iZXIod3NEYXRhKSAhPQ0KKyAgICAgICAgIFhGQV9WRVJTSU9OX1VOS05PV04pKSB7DQorICAgICAgd3NEYXRhLkVtcHR5KCk7DQorICAgICAgaWYgKHBYTUxJbnN0cnVjdGlvbi0+R2V0RGF0YSgxLCB3c0RhdGEpICYmDQorICAgICAgICAgIHdzRGF0YSA9PSBGWF9XU1RSQyhMInYyLjctc2NyaXB0aW5nOjEiKSkgew0KKyAgICAgICAgcFhGQU5vZGUtPkdldERvY3VtZW50KCktPlNldEZsYWcoWEZBX0RPQ0ZMQUdfU2NyaXB0aW5nLCBUUlVFKTsNCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSBpZiAod3NUYXJnZXROYW1lID09IEZYX1dTVFJDKEwiYWNyb2JhdCIpKSB7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0YTsNCisgICAgaWYgKHBYTUxJbnN0cnVjdGlvbi0+R2V0RGF0YSgwLCB3c0RhdGEpICYmDQorICAgICAgICB3c0RhdGEgPT0gRlhfV1NUUkMoTCJKYXZhU2NyaXB0IikpIHsNCisgICAgICBpZiAocFhNTEluc3RydWN0aW9uLT5HZXREYXRhKDEsIHdzRGF0YSkgJiYNCisgICAgICAgICAgd3NEYXRhID09IEZYX1dTVFJDKEwic3RyaWN0U2NvcGluZyIpKSB7DQorICAgICAgICBwWEZBTm9kZS0+R2V0RG9jdW1lbnQoKS0+U2V0RmxhZyhYRkFfRE9DRkxBR19TdHJpY3RTY29waW5nLCBUUlVFKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCit9DQordm9pZCBDWEZBX1NpbXBsZVBhcnNlcjo6Q2xvc2VQYXJzZXIoKSB7DQorICBpZiAobV9wWE1MRG9jKSB7DQorICAgIG1fcFhNTERvYy0+UmVsZWFzZSgpOw0KKyAgICBtX3BYTUxEb2MgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fcFN0cmVhbSkgew0KKyAgICBtX3BTdHJlYW0tPlJlbGVhc2UoKTsNCisgICAgbV9wU3RyZWFtID0gTlVMTDsNCisgIH0NCit9DQorSVhGQV9Eb2NQYXJzZXIqIElYRkFfRG9jUGFyc2VyOjpDcmVhdGUoSVhGQV9Ob3RpZnkqIHBOb3RpZnkpIHsNCisgIHJldHVybiBuZXcgQ1hGQV9Eb2N1bWVudFBhcnNlcihwTm90aWZ5KTsNCit9DQorQ1hGQV9Eb2N1bWVudFBhcnNlcjo6Q1hGQV9Eb2N1bWVudFBhcnNlcihJWEZBX05vdGlmeSogcE5vdGlmeSkNCisgICAgOiBtX25vZGVQYXJzZXIoTlVMTCwgVFJVRSksIG1fcE5vdGlmeShwTm90aWZ5KSwgbV9wRG9jdW1lbnQoTlVMTCkgew0KK30NCitDWEZBX0RvY3VtZW50UGFyc2VyOjp+Q1hGQV9Eb2N1bWVudFBhcnNlcigpIHsNCisgIENsb3NlUGFyc2VyKCk7DQorfQ0KK2ludDMyX3QgQ1hGQV9Eb2N1bWVudFBhcnNlcjo6U3RhcnRQYXJzZShJRlhfRmlsZVJlYWQqIHBTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKSB7DQorICBDbG9zZVBhcnNlcigpOw0KKyAgaW50MzJfdCBuUmV0U3RhdHVzID0gbV9ub2RlUGFyc2VyLlN0YXJ0UGFyc2UocFN0cmVhbSwgZVBhY2tldElEKTsNCisgIGlmIChuUmV0U3RhdHVzID09IFhGQV9QQVJTRVNUQVRVU19SZWFkeSkgew0KKyAgICBtX3BEb2N1bWVudCA9IG5ldyBDWEZBX0RvY3VtZW50KHRoaXMpOw0KKyAgICBtX25vZGVQYXJzZXIuU2V0RmFjdG9yeShtX3BEb2N1bWVudCk7DQorICB9DQorICByZXR1cm4gblJldFN0YXR1czsNCit9DQoraW50MzJfdCBDWEZBX0RvY3VtZW50UGFyc2VyOjpEb1BhcnNlKElGWF9QYXVzZSogcFBhdXNlKSB7DQorICBpbnQzMl90IG5SZXRTdGF0dXMgPSBtX25vZGVQYXJzZXIuRG9QYXJzZShwUGF1c2UpOw0KKyAgaWYgKG5SZXRTdGF0dXMgPj0gWEZBX1BBUlNFU1RBVFVTX0RvbmUpIHsNCisgICAgRlhTWVNfYXNzZXJ0KG1fcERvY3VtZW50KTsNCisgICAgbV9wRG9jdW1lbnQtPlNldFJvb3QobV9ub2RlUGFyc2VyLkdldFJvb3ROb2RlKCkpOw0KKyAgfQ0KKyAgcmV0dXJuIG5SZXRTdGF0dXM7DQorfQ0KK2ludDMyX3QgQ1hGQV9Eb2N1bWVudFBhcnNlcjo6UGFyc2VYTUxEYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1hNTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTE5vZGUqJiBwWE1MTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgew0KKyAgQ2xvc2VQYXJzZXIoKTsNCisgIGludDMyX3QgblJldFN0YXR1cyA9IG1fbm9kZVBhcnNlci5QYXJzZVhNTERhdGEod3NYTUwsIHBYTUxOb2RlLCBOVUxMKTsNCisgIGlmIChuUmV0U3RhdHVzID09IFhGQV9QQVJTRVNUQVRVU19Eb25lICYmIHBYTUxOb2RlKSB7DQorICAgIG1fcERvY3VtZW50ID0gbmV3IENYRkFfRG9jdW1lbnQodGhpcyk7DQorICAgIG1fbm9kZVBhcnNlci5TZXRGYWN0b3J5KG1fcERvY3VtZW50KTsNCisgIH0NCisgIHJldHVybiBuUmV0U3RhdHVzOw0KK30NCit2b2lkIENYRkFfRG9jdW1lbnRQYXJzZXI6OkNvbnN0cnVjdFhGQU5vZGUoQ1hGQV9Ob2RlKiBwWEZBTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxOb2RlKiBwWE1MTm9kZSkgew0KKyAgaWYgKCFwWEZBTm9kZSB8fCAhcFhNTE5vZGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV9ub2RlUGFyc2VyLkNvbnN0cnVjdFhGQU5vZGUocFhGQU5vZGUsIHBYTUxOb2RlKTsNCisgIENYRkFfTm9kZSogcFJvb3ROb2RlID0gbV9ub2RlUGFyc2VyLkdldFJvb3ROb2RlKCk7DQorICBpZiAobV9wRG9jdW1lbnQgJiYgcFJvb3ROb2RlKSB7DQorICAgIG1fcERvY3VtZW50LT5TZXRSb290KHBSb290Tm9kZSk7DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9Eb2N1bWVudFBhcnNlcjo6Q2xvc2VQYXJzZXIoKSB7DQorICBpZiAobV9wRG9jdW1lbnQpIHsNCisgICAgZGVsZXRlIG1fcERvY3VtZW50Ow0KKyAgICBtX3BEb2N1bWVudCA9IE5VTEw7DQorICB9DQorICBtX25vZGVQYXJzZXIuQ2xvc2VQYXJzZXIoKTsNCit9DQorQ1hGQV9YTUxQYXJzZXI6OkNYRkFfWE1MUGFyc2VyKElGREVfWE1MTm9kZSogcFJvb3QsIElGWF9TdHJlYW0qIHBTdHJlYW0pDQorICAgIDoNCisjaWZkZWYgX1hGQV9WRVJJRllfQ2hlY2tzdW1fDQorICAgICAgbV9uRWxlbWVudFN0YXJ0KDApLA0KKyAgICAgIG1fZHdDaGVja1N0YXR1cygwKSwNCisgICAgICBtX2R3Q3VycmVudENoZWNrU3RhdHVzKDApLA0KKyNlbmRpZg0KKyAgICAgIG1fcFJvb3QocFJvb3QpLA0KKyAgICAgIG1fcFN0cmVhbShwU3RyZWFtKSwNCisgICAgICBtX3BQYXJzZXIobnVsbHB0ciksDQorICAgICAgbV9wUGFyZW50KHBSb290KSwNCisgICAgICBtX3BDaGlsZChudWxscHRyKSwNCisgICAgICBtX05vZGVTdGFjaygxNiksDQorICAgICAgbV9kd1N0YXR1cyhGREVfWE1MU1lOVEFYU1RBVFVTX05vbmUpIHsNCisgIEFTU0VSVChtX3BQYXJlbnQgJiYgbV9wU3RyZWFtKTsNCisgIG1fTm9kZVN0YWNrLlB1c2gobV9wUGFyZW50KTsNCisgIG1fcFBhcnNlciA9IElGREVfWE1MU3ludGF4UGFyc2VyOjpDcmVhdGUoKTsNCisgIG1fcFBhcnNlci0+SW5pdChtX3BTdHJlYW0sIDMyICogMTAyNCwgMTAyNCAqIDEwMjQpOw0KK30NCitDWEZBX1hNTFBhcnNlcjo6fkNYRkFfWE1MUGFyc2VyKCkgew0KKyAgaWYgKG1fcFBhcnNlcikgew0KKyAgICBtX3BQYXJzZXItPlJlbGVhc2UoKTsNCisgIH0NCisgIG1fTm9kZVN0YWNrLlJlbW92ZUFsbCgpOw0KKyAgbV93czEuRW1wdHkoKTsNCisgIG1fd3MyLkVtcHR5KCk7DQorfQ0KK2ludDMyX3QgQ1hGQV9YTUxQYXJzZXI6OkRvUGFyc2VyKElGWF9QYXVzZSogcFBhdXNlKSB7DQorICBpZiAobV9kd1N0YXR1cyA9PSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIGlmIChtX2R3U3RhdHVzID09IEZERV9YTUxTWU5UQVhTVEFUVVNfRU9TKSB7DQorICAgIHJldHVybiAxMDA7DQorICB9DQorICBpbnQzMl90IGlDb3VudCA9IDA7DQorICB3aGlsZSAoVFJVRSkgew0KKyAgICBtX2R3U3RhdHVzID0gbV9wUGFyc2VyLT5Eb1N5bnRheFBhcnNlKCk7DQorICAgIHN3aXRjaCAobV9kd1N0YXR1cykgew0KKyAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19JbnN0cnVjdGlvbk9wZW46DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfSW5zdHJ1Y3Rpb25DbG9zZToNCisgICAgICAgIGlmIChtX3BDaGlsZCkgew0KKyAgICAgICAgICBpZiAobV9wQ2hpbGQtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBtX3BDaGlsZCA9IG1fcFBhcmVudDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19FbGVtZW50T3BlbjoNCisjaWZkZWYgX1hGQV9WRVJJRllfQ2hlY2tzdW1fDQorICAgICAgICBpZiAobV9kd0NoZWNrU3RhdHVzICE9IDB4MDMgJiYgbV9Ob2RlU3RhY2suR2V0U2l6ZSgpID09IDIpIHsNCisgICAgICAgICAgbV9uRWxlbWVudFN0YXJ0ID0gbV9wUGFyc2VyLT5HZXRDdXJyZW50UG9zKCkgLSAxOw0KKyAgICAgICAgfQ0KKyNlbmRpZg0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0VsZW1lbnRCcmVhazoNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19FbGVtZW50Q2xvc2U6DQorICAgICAgICBpZiAobV9wQ2hpbGQtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisgICAgICAgIG1fcFBhcnNlci0+R2V0VGFnTmFtZShtX3dzMSk7DQorICAgICAgICAoKElGREVfWE1MRWxlbWVudCopbV9wQ2hpbGQpLT5HZXRUYWdOYW1lKG1fd3MyKTsNCisgICAgICAgIGlmIChtX3dzMS5HZXRMZW5ndGgoKSA+IDAgJiYgIW1fd3MxLkVxdWFsKG1fd3MyKSkgew0KKyAgICAgICAgICBtX2R3U3RhdHVzID0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvcjsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBtX05vZGVTdGFjay5Qb3AoKTsNCisgICAgICAgIGlmIChtX05vZGVTdGFjay5HZXRTaXplKCkgPCAxKSB7DQorICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIH0NCisjaWZkZWYgX1hGQV9WRVJJRllfQ2hlY2tzdW1fDQorICAgICAgICBlbHNlIGlmIChtX2R3Q3VycmVudENoZWNrU3RhdHVzICE9IDAgJiYgbV9Ob2RlU3RhY2suR2V0U2l6ZSgpID09IDIpIHsNCisgICAgICAgICAgbV9uU2l6ZVttX2R3Q3VycmVudENoZWNrU3RhdHVzIC0gMV0gPQ0KKyAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRDdXJyZW50QmluYXJ5UG9zKCkgLQ0KKyAgICAgICAgICAgICAgbV9uU3RhcnRbbV9kd0N1cnJlbnRDaGVja1N0YXR1cyAtIDFdOw0KKyAgICAgICAgICBtX2R3Q3VycmVudENoZWNrU3RhdHVzID0gMDsNCisgICAgICAgIH0NCisjZW5kaWYNCisgICAgICAgIG1fcFBhcmVudCA9IChJRkRFX1hNTE5vZGUqKSptX05vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7DQorICAgICAgICBtX3BDaGlsZCA9IG1fcFBhcmVudDsNCisgICAgICAgIGlDb3VudCsrOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX1RhcmdldE5hbWU6DQorICAgICAgICBtX3BQYXJzZXItPkdldFRhcmdldE5hbWUobV93czEpOw0KKyAgICAgICAgaWYgKG1fd3MxID09IEZYX1dTVFJDKEwib3JpZ2luYWxYRkFWZXJzaW9uIikgfHwNCisgICAgICAgICAgICBtX3dzMSA9PSBGWF9XU1RSQyhMImFjcm9iYXQiKSkgew0KKyAgICAgICAgICBtX3BDaGlsZCA9IElGREVfWE1MSW5zdHJ1Y3Rpb246OkNyZWF0ZShtX3dzMSk7DQorICAgICAgICAgIG1fcFBhcmVudC0+SW5zZXJ0Q2hpbGROb2RlKG1fcENoaWxkKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIG1fcENoaWxkID0gTlVMTDsNCisgICAgICAgIH0NCisgICAgICAgIG1fd3MxLkVtcHR5KCk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfVGFnTmFtZToNCisgICAgICAgIG1fcFBhcnNlci0+R2V0VGFnTmFtZShtX3dzMSk7DQorICAgICAgICBtX3BDaGlsZCA9IElGREVfWE1MRWxlbWVudDo6Q3JlYXRlKG1fd3MxKTsNCisgICAgICAgIG1fcFBhcmVudC0+SW5zZXJ0Q2hpbGROb2RlKG1fcENoaWxkKTsNCisgICAgICAgIG1fTm9kZVN0YWNrLlB1c2gobV9wQ2hpbGQpOw0KKyAgICAgICAgbV9wUGFyZW50ID0gbV9wQ2hpbGQ7DQorI2lmZGVmIF9YRkFfVkVSSUZZX0NoZWNrc3VtXw0KKyAgICAgICAgaWYgKG1fZHdDaGVja1N0YXR1cyAhPSAweDAzICYmIG1fTm9kZVN0YWNrLkdldFNpemUoKSA9PSAzKSB7DQorICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGFnOw0KKyAgICAgICAgICAoKElGREVfWE1MRWxlbWVudCopbV9wQ2hpbGQpLT5HZXRMb2NhbFRhZ05hbWUod3NUYWcpOw0KKyAgICAgICAgICBpZiAod3NUYWcgPT0gRlhfV1NUUkMoTCJ0ZW1wbGF0ZSIpKSB7DQorICAgICAgICAgICAgbV9kd0NoZWNrU3RhdHVzIHw9IDB4MDE7DQorICAgICAgICAgICAgbV9kd0N1cnJlbnRDaGVja1N0YXR1cyA9IDB4MDE7DQorICAgICAgICAgICAgbV9uU3RhcnRbMF0gPSBtX3BQYXJzZXItPkdldEN1cnJlbnRCaW5hcnlQb3MoKSAtDQorICAgICAgICAgICAgICAgICAgICAgICAgICAobV9wUGFyc2VyLT5HZXRDdXJyZW50UG9zKCkgLSBtX25FbGVtZW50U3RhcnQpOw0KKyAgICAgICAgICB9IGVsc2UgaWYgKHdzVGFnID09IEZYX1dTVFJDKEwiZGF0YXNldHMiKSkgew0KKyAgICAgICAgICAgIG1fZHdDaGVja1N0YXR1cyB8PSAweDAyOw0KKyAgICAgICAgICAgIG1fZHdDdXJyZW50Q2hlY2tTdGF0dXMgPSAweDAyOw0KKyAgICAgICAgICAgIG1fblN0YXJ0WzFdID0gbV9wUGFyc2VyLT5HZXRDdXJyZW50QmluYXJ5UG9zKCkgLQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fcFBhcnNlci0+R2V0Q3VycmVudFBvcygpIC0gbV9uRWxlbWVudFN0YXJ0KTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyNlbmRpZg0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBGREVfWE1MU1lOVEFYU1RBVFVTX0F0dHJpTmFtZToNCisgICAgICAgIG1fcFBhcnNlci0+R2V0QXR0cmlidXRlTmFtZShtX3dzMSk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfQXR0cmlWYWx1ZToNCisgICAgICAgIGlmIChtX3BDaGlsZCkgew0KKyAgICAgICAgICBtX3BQYXJzZXItPkdldEF0dHJpYnV0ZU5hbWUobV93czIpOw0KKyAgICAgICAgICBpZiAobV9wQ2hpbGQtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7DQorICAgICAgICAgICAgKChJRkRFX1hNTEVsZW1lbnQqKW1fcENoaWxkKS0+U2V0U3RyaW5nKG1fd3MxLCBtX3dzMik7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIG1fd3MxLkVtcHR5KCk7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfVGV4dDoNCisgICAgICAgIG1fcFBhcnNlci0+R2V0VGV4dERhdGEobV93czEpOw0KKyAgICAgICAgbV9wQ2hpbGQgPSBJRkRFX1hNTFRleHQ6OkNyZWF0ZShtX3dzMSk7DQorICAgICAgICBtX3BQYXJlbnQtPkluc2VydENoaWxkTm9kZShtX3BDaGlsZCk7DQorICAgICAgICBtX3BDaGlsZCA9IG1fcFBhcmVudDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgRkRFX1hNTFNZTlRBWFNUQVRVU19DRGF0YToNCisgICAgICAgIG1fcFBhcnNlci0+R2V0VGV4dERhdGEobV93czEpOw0KKyAgICAgICAgbV9wQ2hpbGQgPSBJRkRFX1hNTENoYXJEYXRhOjpDcmVhdGUobV93czEpOw0KKyAgICAgICAgbV9wUGFyZW50LT5JbnNlcnRDaGlsZE5vZGUobV9wQ2hpbGQpOw0KKyAgICAgICAgbV9wQ2hpbGQgPSBtX3BQYXJlbnQ7DQorICAgICAgICBicmVhazsNCisgICAgICBjYXNlIEZERV9YTUxTWU5UQVhTVEFUVVNfVGFyZ2V0RGF0YToNCisgICAgICAgIGlmIChtX3BDaGlsZCkgew0KKyAgICAgICAgICBpZiAobV9wQ2hpbGQtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbikgew0KKyAgICAgICAgICAgIG1fZHdTdGF0dXMgPSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yOw0KKyAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmICghbV93czEuSXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgKChJRkRFX1hNTEluc3RydWN0aW9uKiltX3BDaGlsZCktPkFwcGVuZERhdGEobV93czEpOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIG1fcFBhcnNlci0+R2V0VGFyZ2V0RGF0YShtX3dzMSk7DQorICAgICAgICAgICgoSUZERV9YTUxJbnN0cnVjdGlvbiopbV9wQ2hpbGQpLT5BcHBlbmREYXRhKG1fd3MxKTsNCisgICAgICAgIH0NCisgICAgICAgIG1fd3MxLkVtcHR5KCk7DQorICAgICAgICBicmVhazsNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKG1fZHdTdGF0dXMgPT0gRkRFX1hNTFNZTlRBWFNUQVRVU19FcnJvciB8fA0KKyAgICAgICAgbV9kd1N0YXR1cyA9PSBGREVfWE1MU1lOVEFYU1RBVFVTX0VPUykgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIGlmIChwUGF1c2UgIT0gTlVMTCAmJiBpQ291bnQgPiA1MDAgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgIH0NCisgIHJldHVybiAobV9kd1N0YXR1cyA9PSBGREVfWE1MU1lOVEFYU1RBVFVTX0Vycm9yIHx8IG1fTm9kZVN0YWNrLkdldFNpemUoKSAhPSAxKQ0KKyAgICAgICAgICAgICA/IC0xDQorICAgICAgICAgICAgIDogbV9wUGFyc2VyLT5HZXRTdGF0dXMoKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3BhcnNlcl9pbXAuaCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9wYXJzZXJfaW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdmNzZiMwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9wYXJzZXJfaW1wLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfWEZBX1BBUlNFUl9JTVANCisjZGVmaW5lIF9YRkFfUEFSU0VSX0lNUA0KKyNkZWZpbmUgX1hGQV9WRVJJRllfQ2hlY2tzdW1fDQorY2xhc3MgQ1hGQV9YTUxQYXJzZXI7DQorY2xhc3MgQ1hGQV9TaW1wbGVQYXJzZXIgOiBwdWJsaWMgSVhGQV9QYXJzZXIgew0KKyBwdWJsaWM6DQorICBDWEZBX1NpbXBsZVBhcnNlcihJWEZBX09iakZhY3RvcnkqIHBGYWN0b3J5LCBGWF9CT09MIGJEb2N1bWVudFBhcnNlciA9IEZBTFNFKTsNCisgIH5DWEZBX1NpbXBsZVBhcnNlcigpOw0KKyAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKSB7IGRlbGV0ZSB0aGlzOyB9DQorDQorICB2aXJ0dWFsIGludDMyX3QgU3RhcnRQYXJzZShJRlhfRmlsZVJlYWQqIHBTdHJlYW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCA9IFhGQV9YRFBQQUNLRVRfWERQKTsNCisgIHZpcnR1YWwgaW50MzJfdCBEb1BhcnNlKElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCk7DQorICB2aXJ0dWFsIGludDMyX3QgUGFyc2VYTUxEYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1hNTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxOb2RlKiYgcFhNTE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlID0gTlVMTCk7DQorICB2aXJ0dWFsIHZvaWQgQ29uc3RydWN0WEZBTm9kZShDWEZBX05vZGUqIHBYRkFOb2RlLCBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlKTsNCisgIHZpcnR1YWwgSVhGQV9PYmpGYWN0b3J5KiBHZXRGYWN0b3J5KCkgY29uc3QgeyByZXR1cm4gbV9wRmFjdG9yeTsgfQ0KKyAgdmlydHVhbCBDWEZBX05vZGUqIEdldFJvb3ROb2RlKCkgY29uc3QgeyByZXR1cm4gbV9wUm9vdE5vZGU7IH0NCisgIHZpcnR1YWwgSUZERV9YTUxEb2MqIEdldFhNTERvYygpIGNvbnN0IHsgcmV0dXJuIG1fcFhNTERvYzsgfQ0KKyAgdmlydHVhbCB2b2lkIENsb3NlUGFyc2VyKCk7DQorDQorIHByb3RlY3RlZDoNCisgIENYRkFfTm9kZSogUGFyc2VBc1hEUFBhY2tldChJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpOw0KKyAgQ1hGQV9Ob2RlKiBQYXJzZUFzWERQUGFja2V0X1hEUChJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKTsNCisgIENYRkFfTm9kZSogUGFyc2VBc1hEUFBhY2tldF9Db25maWcoSUZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCk7DQorICBDWEZBX05vZGUqIFBhcnNlQXNYRFBQYWNrZXRfVGVtcGxhdGVGb3JtKElGREVfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpOw0KKyAgQ1hGQV9Ob2RlKiBQYXJzZUFzWERQUGFja2V0X0RhdGEoSUZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpOw0KKyAgQ1hGQV9Ob2RlKiBQYXJzZUFzWERQUGFja2V0X0xvY2FsZUNvbm5lY3Rpb25Tb3VyY2VTZXQoDQorICAgICAgSUZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLA0KKyAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKTsNCisgIENYRkFfTm9kZSogUGFyc2VBc1hEUFBhY2tldF9YZGMoSUZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCk7DQorICBDWEZBX05vZGUqIFBhcnNlQXNYRFBQYWNrZXRfVXNlcihJRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCk7DQorICBDWEZBX05vZGUqIE5vcm1hbExvYWRlcihDWEZBX05vZGUqIHBYRkFOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9YTUxOb2RlKiBwWE1MRG9jLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVc2VBdHRyaWJ1dGUgPSBUUlVFKTsNCisgIENYRkFfTm9kZSogRGF0YUxvYWRlcihDWEZBX05vZGUqIHBYRkFOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIElGREVfWE1MTm9kZSogcFhNTERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJEb1RyYW5zZm9ybSk7DQorICBDWEZBX05vZGUqIFVzZXJQYWNrZXRMb2FkZXIoQ1hGQV9Ob2RlKiBwWEZBTm9kZSwgSUZERV9YTUxOb2RlKiBwWE1MRG9jKTsNCisgIHZvaWQgUGFyc2VDb250ZW50Tm9kZShDWEZBX05vZGUqIHBYRkFOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpOw0KKyAgdm9pZCBQYXJzZURhdGFWYWx1ZShDWEZBX05vZGUqIHBYRkFOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTE5vZGUqIHBYTUxOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCk7DQorICB2b2lkIFBhcnNlRGF0YUdyb3VwKENYRkFfTm9kZSogcFhGQU5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgIElGREVfWE1MTm9kZSogcFhNTE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKTsNCisgIHZvaWQgUGFyc2VJbnN0cnVjdGlvbihDWEZBX05vZGUqIHBYRkFOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIElGREVfWE1MSW5zdHJ1Y3Rpb24qIHBYTUxJbnN0cnVjdGlvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCk7DQorICB2b2lkIFNldEZhY3RvcnkoSVhGQV9PYmpGYWN0b3J5KiBwRmFjdG9yeSk7DQorDQorICBDWEZBX1hNTFBhcnNlciogbV9wWE1MUGFyc2VyOw0KKyAgSUZERV9YTUxEb2MqIG1fcFhNTERvYzsNCisgIElGWF9TdHJlYW0qIG1fcFN0cmVhbTsNCisgIElGWF9GaWxlUmVhZCogbV9wRmlsZVJlYWQ7DQorICBJWEZBX09iakZhY3RvcnkqIG1fcEZhY3Rvcnk7DQorICBDWEZBX05vZGUqIG1fcFJvb3ROb2RlOw0KKyAgWEZBX1hEUFBBQ0tFVCBtX2VQYWNrZXRJRDsNCisgIEZYX0JPT0wgbV9iRG9jdW1lbnRQYXJzZXI7DQorICBmcmllbmQgY2xhc3MgQ1hGQV9Eb2N1bWVudFBhcnNlcjsNCit9Ow0KK2NsYXNzIENYRkFfRG9jdW1lbnRQYXJzZXIgOiBwdWJsaWMgSVhGQV9Eb2NQYXJzZXIgew0KKyBwdWJsaWM6DQorICBDWEZBX0RvY3VtZW50UGFyc2VyKElYRkFfTm90aWZ5KiBwTm90aWZ5KTsNCisgIH5DWEZBX0RvY3VtZW50UGFyc2VyKCk7DQorICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpIHsgZGVsZXRlIHRoaXM7IH0NCisgIHZpcnR1YWwgaW50MzJfdCBTdGFydFBhcnNlKElGWF9GaWxlUmVhZCogcFN0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEID0gWEZBX1hEUFBBQ0tFVF9YRFApOw0KKyAgdmlydHVhbCBpbnQzMl90IERvUGFyc2UoSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKTsNCisgIHZpcnR1YWwgaW50MzJfdCBQYXJzZVhNTERhdGEoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzWE1MLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1hNTE5vZGUqJiBwWE1MTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UgPSBOVUxMKTsNCisgIHZpcnR1YWwgdm9pZCBDb25zdHJ1Y3RYRkFOb2RlKENYRkFfTm9kZSogcFhGQU5vZGUsIElGREVfWE1MTm9kZSogcFhNTE5vZGUpOw0KKyAgdmlydHVhbCBJWEZBX09iakZhY3RvcnkqIEdldEZhY3RvcnkoKSBjb25zdCB7DQorICAgIHJldHVybiBtX25vZGVQYXJzZXIuR2V0RmFjdG9yeSgpOw0KKyAgfQ0KKyAgdmlydHVhbCBDWEZBX05vZGUqIEdldFJvb3ROb2RlKCkgY29uc3QgeyByZXR1cm4gbV9ub2RlUGFyc2VyLkdldFJvb3ROb2RlKCk7IH0NCisgIHZpcnR1YWwgSUZERV9YTUxEb2MqIEdldFhNTERvYygpIGNvbnN0IHsgcmV0dXJuIG1fbm9kZVBhcnNlci5HZXRYTUxEb2MoKTsgfQ0KKyAgdmlydHVhbCBJWEZBX05vdGlmeSogR2V0Tm90aWZ5KCkgY29uc3QgeyByZXR1cm4gbV9wTm90aWZ5OyB9DQorICB2aXJ0dWFsIENYRkFfRG9jdW1lbnQqIEdldERvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9wRG9jdW1lbnQ7IH0NCisgIHZpcnR1YWwgdm9pZCBDbG9zZVBhcnNlcigpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICBDWEZBX1NpbXBsZVBhcnNlciBtX25vZGVQYXJzZXI7DQorICBJWEZBX05vdGlmeSogbV9wTm90aWZ5Ow0KKyAgQ1hGQV9Eb2N1bWVudCogbV9wRG9jdW1lbnQ7DQorfTsNCit0eXBlZGVmIENGWF9TdGFja1RlbXBsYXRlPElGREVfWE1MTm9kZSo+IENYRkFfWE1MTm9kZVN0YWNrOw0KK2NsYXNzIENYRkFfWE1MUGFyc2VyIDogcHVibGljIElGREVfWE1MUGFyc2VyIHsNCisgcHVibGljOg0KKyAgQ1hGQV9YTUxQYXJzZXIoSUZERV9YTUxOb2RlKiBwUm9vdCwgSUZYX1N0cmVhbSogcFN0cmVhbSk7DQorICB+Q1hGQV9YTUxQYXJzZXIoKTsNCisNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgeyBkZWxldGUgdGhpczsgfQ0KKyAgdmlydHVhbCBpbnQzMl90IERvUGFyc2VyKElGWF9QYXVzZSogcFBhdXNlKTsNCisNCisjaWZkZWYgX1hGQV9WRVJJRllfQ2hlY2tzdW1fDQorICBGWF9GSUxFU0laRSBtX25TdGFydFsyXTsNCisgIHNpemVfdCBtX25TaXplWzJdOw0KKyAgRlhfRklMRVNJWkUgbV9uRWxlbWVudFN0YXJ0Ow0KKyAgRlhfV09SRCBtX2R3Q2hlY2tTdGF0dXM7DQorICBGWF9XT1JEIG1fZHdDdXJyZW50Q2hlY2tTdGF0dXM7DQorI2VuZGlmDQorDQorIHByb3RlY3RlZDoNCisgIElGREVfWE1MTm9kZSogbV9wUm9vdDsNCisgIElGWF9TdHJlYW0qIG1fcFN0cmVhbTsNCisgIElGREVfWE1MU3ludGF4UGFyc2VyKiBtX3BQYXJzZXI7DQorDQorICBJRkRFX1hNTE5vZGUqIG1fcFBhcmVudDsNCisgIElGREVfWE1MTm9kZSogbV9wQ2hpbGQ7DQorICBDWEZBX1hNTE5vZGVTdGFjayBtX05vZGVTdGFjazsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3MxOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgbV93czI7DQorICBGWF9EV09SRCBtX2R3U3RhdHVzOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3BhcnNlcl9pbXBfZW1iZWRkZXJ0ZXN0LmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9wYXJzZXJfaW1wX2VtYmVkZGVydGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M1MGI0ZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9wYXJzZXJfaW1wX2VtYmVkZGVydGVzdC5jcHAKQEAgLTAsMCArMSwxNSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKK2NsYXNzIFhGQVBhcnNlckltcEVtYmVkZGVydGVzdCA6IHB1YmxpYyBFbWJlZGRlclRlc3Qge307CisKK1RFU1RfRihYRkFQYXJzZXJJbXBFbWJlZGRlcnRlc3QsIEJ1Z18yMTYpIHsKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJidWdfMjE2LnBkZiIpKTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBMb2FkUGFnZSgwKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIHBhZ2UpOworICBVbmxvYWRQYWdlKHBhZ2UpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfZGF0YXdpbmRvdy5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2RhdGF3aW5kb3cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMjU4YjQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2RhdGF3aW5kb3cuY3BwCkBAIC0wLDAgKzEsNDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3V0aWxzLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9vYmplY3QuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY3VtZW50LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9wYXJzZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3NjcmlwdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jZGF0YS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jbGF5b3V0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9sb2NhbGVtZ3IuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2ZtMmpzYXBpLmgiDQorI2luY2x1ZGUgInhmYV9zY3JpcHRfZGF0YXdpbmRvdy5oIg0KK0NTY3JpcHRfRGF0YVdpbmRvdzo6Q1NjcmlwdF9EYXRhV2luZG93KENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCkNCisgICAgOiBDWEZBX09yZGluYXJ5T2JqZWN0KHBEb2N1bWVudCwgWEZBX0VMRU1FTlRfRGF0YVdpbmRvdykgew0KKyAgbV91U2NyaXB0SGFzaCA9IFhGQV9IQVNIQ09ERV9EYXRhV2luZG93Ow0KK30NCitDU2NyaXB0X0RhdGFXaW5kb3c6On5DU2NyaXB0X0RhdGFXaW5kb3coKSB7fQ0KK3ZvaWQgQ1NjcmlwdF9EYXRhV2luZG93OjpTY3JpcHRfRGF0YVdpbmRvd19Nb3ZlQ3VycmVudFJlY29yZCgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykge30NCit2b2lkIENTY3JpcHRfRGF0YVdpbmRvdzo6U2NyaXB0X0RhdGFXaW5kb3dfUmVjb3JkKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7fQ0KK3ZvaWQgQ1NjcmlwdF9EYXRhV2luZG93OjpTY3JpcHRfRGF0YVdpbmRvd19Hb3RvUmVjb3JkKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7fQ0KK3ZvaWQgQ1NjcmlwdF9EYXRhV2luZG93OjpTY3JpcHRfRGF0YVdpbmRvd19Jc1JlY29yZEdyb3VwKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7fQ0KK3ZvaWQgQ1NjcmlwdF9EYXRhV2luZG93OjpTY3JpcHRfRGF0YVdpbmRvd19SZWNvcmRzQmVmb3JlKA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHt9DQordm9pZCBDU2NyaXB0X0RhdGFXaW5kb3c6OlNjcmlwdF9EYXRhV2luZG93X0N1cnJlbnRSZWNvcmROdW1iZXIoDQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkge30NCit2b2lkIENTY3JpcHRfRGF0YVdpbmRvdzo6U2NyaXB0X0RhdGFXaW5kb3dfUmVjb3Jkc0FmdGVyKA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHt9DQordm9pZCBDU2NyaXB0X0RhdGFXaW5kb3c6OlNjcmlwdF9EYXRhV2luZG93X0lzRGVmaW5lZChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2RhdGF3aW5kb3cuaCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfZGF0YXdpbmRvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZTc1NjUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2RhdGF3aW5kb3cuaApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1NDUklQVF9EQVRBV0lORE9XX0hfDQorI2RlZmluZSBfU0NSSVBUX0RBVEFXSU5ET1dfSF8NCitjbGFzcyBDU2NyaXB0X0RhdGFXaW5kb3cgOiBwdWJsaWMgQ1hGQV9PcmRpbmFyeU9iamVjdCB7DQorIHB1YmxpYzoNCisgIENTY3JpcHRfRGF0YVdpbmRvdyhDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpOw0KKyAgdmlydHVhbCB+Q1NjcmlwdF9EYXRhV2luZG93KCk7DQorICB2b2lkIFNjcmlwdF9EYXRhV2luZG93X01vdmVDdXJyZW50UmVjb3JkKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRGF0YVdpbmRvd19SZWNvcmQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9EYXRhV2luZG93X0dvdG9SZWNvcmQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9EYXRhV2luZG93X0lzUmVjb3JkR3JvdXAoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9EYXRhV2luZG93X1JlY29yZHNCZWZvcmUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9EYXRhV2luZG93X0N1cnJlbnRSZWNvcmROdW1iZXIoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9EYXRhV2luZG93X1JlY29yZHNBZnRlcihGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorICB2b2lkIFNjcmlwdF9EYXRhV2luZG93X0lzRGVmaW5lZChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2V2ZW50cHNldWRvbW9kZWwuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ldmVudHBzZXVkb21vZGVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDc4NmFkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ldmVudHBzZXVkb21vZGVsLmNwcApAQCAtMCwwICsxLDI2OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfdXRpbHMuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX29iamVjdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jdW1lbnQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3BhcnNlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfc2NyaXB0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NkYXRhLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NsYXlvdXQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2xvY2FsZW1nci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZm0yanNhcGkuaCINCisjaW5jbHVkZSAieGZhX3NjcmlwdF9ldmVudHBzZXVkb21vZGVsLmgiDQorQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWwoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KQ0KKyAgICA6IENYRkFfT3JkaW5hcnlPYmplY3QocERvY3VtZW50LCBYRkFfRUxFTUVOVF9FdmVudFBzZXVkb01vZGVsKSB7DQorICBtX3VTY3JpcHRIYXNoID0gWEZBX0hBU0hDT0RFX0V2ZW50Ow0KK30NCitDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6On5DU2NyaXB0X0V2ZW50UHNldWRvTW9kZWwoKSB7fQ0KK3ZvaWQgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU3RyaW5nUHJvcGVydHkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZykgew0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzVmFsdWU7DQorICAgIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhoVmFsdWUsIGJzVmFsdWUpOw0KKyAgICB3c1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUsIGJzVmFsdWUuR2V0TGVuZ3RoKCkpOw0KKyAgfSBlbHNlIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NWYWx1ZSkpOw0KKyAgfQ0KK30NCit2b2lkIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0ludGVyUHJvcGVydHkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nKSB7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgaVZhbHVlID0gRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGhWYWx1ZSk7DQorICB9IGVsc2Ugew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgaVZhbHVlKTsNCisgIH0NCit9DQordm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Cb29sZWFuUHJvcGVydHkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZykgew0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIGJWYWx1ZSA9IEZYSlNFX1ZhbHVlX1RvQm9vbGVhbihoVmFsdWUpOw0KKyAgfSBlbHNlIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihoVmFsdWUsIGJWYWx1ZSk7DQorICB9DQorfQ0KK3ZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eSgNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfRFdPUkQgZHdGbGFnLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nKSB7DQorICBJWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKTsNCisgIGlmICghcFNjcmlwdENvbnRleHQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSA9IHBTY3JpcHRDb250ZXh0LT5HZXRFdmVudFBhcmFtKCk7DQorICBpZiAoIXBFdmVudFBhcmFtKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHN3aXRjaCAoZHdGbGFnKSB7DQorICAgIGNhc2UgWEZBX0VWRU5UX0NBTkNFTEFDVElPTjoNCisgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Cb29sZWFuUHJvcGVydHkoDQorICAgICAgICAgIGhWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fYkNhbmNlbEFjdGlvbiwgYlNldHRpbmcpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FVkVOVF9DSEFOR0U6DQorICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU3RyaW5nUHJvcGVydHkoaFZhbHVlLCBwRXZlbnRQYXJhbS0+bV93c0NoYW5nZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0dGluZyk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VWRU5UX0NPTU1JVEtFWToNCisgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9JbnRlclByb3BlcnR5KGhWYWx1ZSwgcEV2ZW50UGFyYW0tPm1faUNvbW1pdEtleSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXR0aW5nKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRVZFTlRfRlVMTFRFWFQ6DQorICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU3RyaW5nUHJvcGVydHkoaFZhbHVlLCBwRXZlbnRQYXJhbS0+bV93c0Z1bGxUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXR0aW5nKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRVZFTlRfS0VZRE9XTjoNCisgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Cb29sZWFuUHJvcGVydHkoaFZhbHVlLCBwRXZlbnRQYXJhbS0+bV9iS2V5RG93biwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldHRpbmcpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FVkVOVF9NT0RJRklFUjoNCisgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Cb29sZWFuUHJvcGVydHkoaFZhbHVlLCBwRXZlbnRQYXJhbS0+bV9iTW9kaWZpZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXR0aW5nKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRVZFTlRfTkVXQ09OVEVOVFRZUEU6DQorICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU3RyaW5nUHJvcGVydHkoDQorICAgICAgICAgIGhWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fd3NOZXdDb250ZW50VHlwZSwgYlNldHRpbmcpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FVkVOVF9ORVdURVhUOg0KKyAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1N0cmluZ1Byb3BlcnR5KGhWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fd3NOZXdUZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXR0aW5nKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRVZFTlRfUFJFVkNPTlRFTlRUWVBFOg0KKyAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1N0cmluZ1Byb3BlcnR5KA0KKyAgICAgICAgICBoVmFsdWUsIHBFdmVudFBhcmFtLT5tX3dzUHJldkNvbnRlbnRUeXBlLCBiU2V0dGluZyk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VWRU5UX1BSRVZURVhUOg0KKyAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1N0cmluZ1Byb3BlcnR5KGhWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fd3NQcmV2VGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0dGluZyk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VWRU5UX1JFRU5URVI6DQorICAgICAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfQm9vbGVhblByb3BlcnR5KGhWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fYlJlZW50ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXR0aW5nKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRVZFTlRfU0VMRU5EOg0KKyAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0ludGVyUHJvcGVydHkoaFZhbHVlLCBwRXZlbnRQYXJhbS0+bV9pU2VsRW5kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldHRpbmcpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FVkVOVF9TRUxTVEFSVDoNCisgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9JbnRlclByb3BlcnR5KGhWYWx1ZSwgcEV2ZW50UGFyYW0tPm1faVNlbFN0YXJ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldHRpbmcpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FVkVOVF9TSElGVDoNCisgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Cb29sZWFuUHJvcGVydHkoaFZhbHVlLCBwRXZlbnRQYXJhbS0+bV9iU2hpZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXR0aW5nKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRVZFTlRfU09BUEZBVUxUQ09ERToNCisgICAgICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TdHJpbmdQcm9wZXJ0eSgNCisgICAgICAgICAgaFZhbHVlLCBwRXZlbnRQYXJhbS0+bV93c1NvYXBGYXVsdENvZGUsIGJTZXR0aW5nKTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRVZFTlRfU09BUEZBVUxUU1RSSU5HOg0KKyAgICAgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1N0cmluZ1Byb3BlcnR5KA0KKyAgICAgICAgICBoVmFsdWUsIHBFdmVudFBhcmFtLT5tX3dzU29hcEZhdWx0U3RyaW5nLCBiU2V0dGluZyk7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VWRU5UX1RBUkdFVDoNCisgICAgICBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICBicmVhazsNCisgIH0NCit9DQordm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0NhbmNlbEFjdGlvbigNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShoVmFsdWUsIFhGQV9FVkVOVF9DQU5DRUxBQ1RJT04sIGJTZXR0aW5nKTsNCit9DQordm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0NoYW5nZSgNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShoVmFsdWUsIFhGQV9FVkVOVF9DSEFOR0UsIGJTZXR0aW5nKTsNCit9DQordm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0NvbW1pdEtleSgNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShoVmFsdWUsIFhGQV9FVkVOVF9DT01NSVRLRVksIGJTZXR0aW5nKTsNCit9DQordm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX0Z1bGxUZXh0KA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Byb3BlcnR5KGhWYWx1ZSwgWEZBX0VWRU5UX0ZVTExURVhULCBiU2V0dGluZyk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9LZXlEb3duKA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Byb3BlcnR5KGhWYWx1ZSwgWEZBX0VWRU5UX0tFWURPV04sIGJTZXR0aW5nKTsNCit9DQordm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX01vZGlmaWVyKA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Byb3BlcnR5KGhWYWx1ZSwgWEZBX0VWRU5UX01PRElGSUVSLCBiU2V0dGluZyk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9OZXdDb250ZW50VHlwZSgNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShoVmFsdWUsIFhGQV9FVkVOVF9ORVdDT05URU5UVFlQRSwgYlNldHRpbmcpOw0KK30NCit2b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfTmV3VGV4dCgNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShoVmFsdWUsIFhGQV9FVkVOVF9ORVdURVhULCBiU2V0dGluZyk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9QcmV2Q29udGVudFR5cGUoDQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUHJvcGVydHkoaFZhbHVlLCBYRkFfRVZFTlRfUFJFVkNPTlRFTlRUWVBFLCBiU2V0dGluZyk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9QcmV2VGV4dCgNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShoVmFsdWUsIFhGQV9FVkVOVF9QUkVWVEVYVCwgYlNldHRpbmcpOw0KK30NCit2b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUmVlbnRlcigNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShoVmFsdWUsIFhGQV9FVkVOVF9SRUVOVEVSLCBiU2V0dGluZyk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TZWxFbmQoDQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUHJvcGVydHkoaFZhbHVlLCBYRkFfRVZFTlRfU0VMRU5ELCBiU2V0dGluZyk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TZWxTdGFydCgNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShoVmFsdWUsIFhGQV9FVkVOVF9TRUxTVEFSVCwgYlNldHRpbmcpOw0KK30NCit2b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU2hpZnQoDQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUHJvcGVydHkoaFZhbHVlLCBYRkFfRVZFTlRfU0hJRlQsIGJTZXR0aW5nKTsNCit9DQordm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1NvYXBGYXVsdENvZGUoDQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgU2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfUHJvcGVydHkoaFZhbHVlLCBYRkFfRVZFTlRfU09BUEZBVUxUQ09ERSwgYlNldHRpbmcpOw0KK30NCit2b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfU29hcEZhdWx0U3RyaW5nKA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Byb3BlcnR5KGhWYWx1ZSwgWEZBX0VWRU5UX1NPQVBGQVVMVFNUUklORywgYlNldHRpbmcpOw0KK30NCit2b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfVGFyZ2V0KA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIFNjcmlwdF9FdmVudFBzZXVkb01vZGVsX1Byb3BlcnR5KGhWYWx1ZSwgWEZBX0VWRU5UX1RBUkdFVCwgYlNldHRpbmcpOw0KK30NCit2b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0V2ZW50UHNldWRvTW9kZWxfRW1pdCgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICBpZiAoIXBTY3JpcHRDb250ZXh0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfRXZlbnRQYXJhbSogcEV2ZW50UGFyYW0gPSBwU2NyaXB0Q29udGV4dC0+R2V0RXZlbnRQYXJhbSgpOw0KKyAgaWYgKCFwRXZlbnRQYXJhbSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9XaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IHBOb3RpZnktPkdldFdpZGdldEhhbmRsZXIoKTsNCisgIGlmICghcFdpZGdldEhhbmRsZXIpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgcFdpZGdldEhhbmRsZXItPlByb2Nlc3NFdmVudChwRXZlbnRQYXJhbS0+bV9wVGFyZ2V0LCBwRXZlbnRQYXJhbSk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9SZXNldCgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICBpZiAoIXBTY3JpcHRDb250ZXh0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfRXZlbnRQYXJhbSogcEV2ZW50UGFyYW0gPSBwU2NyaXB0Q29udGV4dC0+R2V0RXZlbnRQYXJhbSgpOw0KKyAgaWYgKCFwRXZlbnRQYXJhbSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBwRXZlbnRQYXJhbS0+UmVzZXQoKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ldmVudHBzZXVkb21vZGVsLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2V2ZW50cHNldWRvbW9kZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzJjZGZjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ldmVudHBzZXVkb21vZGVsLmgKQEAgLTAsMCArMSw5MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9TQ1JJUFRfRVZFTlRQU0VVRE9NT0RFTF9IXw0KKyNkZWZpbmUgX1NDUklQVF9FVkVOVFBTRVVET01PREVMX0hfDQorI2RlZmluZSBYRkFfRVZFTlRfQ0hBTkdFIDANCisjZGVmaW5lIFhGQV9FVkVOVF9DT01NSVRLRVkgMQ0KKyNkZWZpbmUgWEZBX0VWRU5UX0ZVTExURVhUIDINCisjZGVmaW5lIFhGQV9FVkVOVF9LRVlET1dOIDMNCisjZGVmaW5lIFhGQV9FVkVOVF9NT0RJRklFUiA0DQorI2RlZmluZSBYRkFfRVZFTlRfTkVXQ09OVEVOVFRZUEUgNQ0KKyNkZWZpbmUgWEZBX0VWRU5UX05FV1RFWFQgNg0KKyNkZWZpbmUgWEZBX0VWRU5UX1BSRVZDT05URU5UVFlQRSA3DQorI2RlZmluZSBYRkFfRVZFTlRfUFJFVlRFWFQgOA0KKyNkZWZpbmUgWEZBX0VWRU5UX1JFRU5URVIgOQ0KKyNkZWZpbmUgWEZBX0VWRU5UX1NFTEVORCAxMA0KKyNkZWZpbmUgWEZBX0VWRU5UX1NFTFNUQVJUIDExDQorI2RlZmluZSBYRkFfRVZFTlRfU0hJRlQgMTINCisjZGVmaW5lIFhGQV9FVkVOVF9TT0FQRkFVTFRDT0RFIDEzDQorI2RlZmluZSBYRkFfRVZFTlRfU09BUEZBVUxUU1RSSU5HIDE0DQorI2RlZmluZSBYRkFfRVZFTlRfVEFSR0VUIDE1DQorI2RlZmluZSBYRkFfRVZFTlRfQ0FOQ0VMQUNUSU9OIDE2DQorY2xhc3MgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsIDogcHVibGljIENYRkFfT3JkaW5hcnlPYmplY3Qgew0KKyBwdWJsaWM6DQorICBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWwoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsNCisgIHZpcnR1YWwgfkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbCgpOw0KKw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9DYW5jZWxBY3Rpb24oRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9DaGFuZ2UoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Db21taXRLZXkoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9GdWxsVGV4dChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9LZXlEb3duKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Nb2RpZmllcihGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9OZXdDb250ZW50VHlwZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9OZXdUZXh0KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9QcmV2Q29udGVudFR5cGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9QcmV2VGV4dChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9SZWVudGVyKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TZWxFbmQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TZWxTdGFydChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9TaGlmdChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Tb2FwRmF1bHRDb2RlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Tb2FwRmF1bHRTdHJpbmcoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9UYXJnZXQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9FbWl0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9SZXNldChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbF9Qcm9wZXJ0eShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0ZsYWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ob3N0cHNldWRvbW9kZWwuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ob3N0cHNldWRvbW9kZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNzkyMjAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2hvc3Rwc2V1ZG9tb2RlbC5jcHAKQEAgLTAsMCArMSw3OTkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3V0aWxzLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9vYmplY3QuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY3VtZW50LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9wYXJzZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3NjcmlwdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jZGF0YS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jbGF5b3V0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9sb2NhbGVtZ3IuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2ZtMmpzYXBpLmgiDQorI2luY2x1ZGUgInhmYV9zY3JpcHRfaG9zdHBzZXVkb21vZGVsLmgiDQorQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCkNCisgICAgOiBDWEZBX09yZGluYXJ5T2JqZWN0KHBEb2N1bWVudCwgWEZBX0VMRU1FTlRfSG9zdFBzZXVkb01vZGVsKSB7DQorICBtX3VTY3JpcHRIYXNoID0gWEZBX0hBU0hDT0RFX0hvc3Q7DQorfQ0KK0NTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjp+Q1NjcmlwdF9Ib3N0UHNldWRvTW9kZWwoKSB7fQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfTG9hZFN0cmluZygNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgSVhGQV9Ob3RpZnkqIHBOb3RpZnksDQorICAgIEZYX0RXT1JEIGR3RmxhZykgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsNCisgIHBOb3RpZnktPkdldEFwcFByb3ZpZGVyKCktPkxvYWRTdHJpbmcoZHdGbGFnLCB3c1ZhbHVlKTsNCisgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVmFsdWUpKTsNCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9BcHBUeXBlKA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NBcHBUeXBlOw0KKyAgcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+R2V0QXBwVHlwZSh3c0FwcFR5cGUpOw0KKyAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NBcHBUeXBlKSk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfRm94aXRBcHBUeXBlKA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTlZBbElEX1BST1BfU0VUKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NBcHBUeXBlOw0KKyAgcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+R2V0Rm94aXRBcHBUeXBlKHdzQXBwVHlwZSk7DQorICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c0FwcFR5cGUpKTsNCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9DYWxjdWxhdGlvbnNFbmFibGVkKA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX0RvYyogaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCisgIGlmIChiU2V0dGluZykgew0KKyAgICBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5TZXRDYWxjdWxhdGlvbnNFbmFibGVkKA0KKyAgICAgICAgaERvYywgRlhKU0VfVmFsdWVfVG9Cb29sZWFuKGhWYWx1ZSkpOw0KKyAgICByZXR1cm47DQorICB9DQorICBGWF9CT09MIGJFbmFibGVkID0gcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+SXNDYWxjdWxhdGlvbnNFbmFibGVkKGhEb2MpOw0KKyAgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihoVmFsdWUsIGJFbmFibGVkKTsNCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9DdXJyZW50UGFnZSgNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Eb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+U2V0Q3VycmVudFBhZ2UoaERvYywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVmFsdWVfVG9JbnRlZ2VyKGhWYWx1ZSkpOw0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlDdXJyZW50UGFnZSA9IHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPkdldEN1cnJlbnRQYWdlKGhEb2MpOw0KKyAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIGlDdXJyZW50UGFnZSk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfTGFuZ3VhZ2UoDQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChiU2V0dGluZykgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX1VOQUJMRV9TRVRfTEFOR1VBR0UpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0xhbmd1YWdlOw0KKyAgcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+R2V0TGFuZ3VhZ2Uod3NMYW5ndWFnZSk7DQorICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c0xhbmd1YWdlKSk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfTnVtUGFnZXMoDQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfVU5BQkxFX1NFVF9OVU1QQUdFUyk7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgaU51bVBhZ2VzID0gcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+Q291bnRQYWdlcyhoRG9jKTsNCisgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBpTnVtUGFnZXMpOw0KK30NCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1BsYXRmb3JtKA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19VTkFCTEVfU0VUX1BMQVRGT1JNKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NQbGF0Zm9ybTsNCisgIHBOb3RpZnktPkdldEFwcFByb3ZpZGVyKCktPkdldFBsYXRmb3JtKHdzUGxhdGZvcm0pOw0KKyAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NQbGF0Zm9ybSkpOw0KK30NCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1RpdGxlKA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmICghbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+SXNSdW5BdENsaWVudCgpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX0RvYyogaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCisgIGlmIChiU2V0dGluZykgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic1ZhbHVlOw0KKyAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBic1ZhbHVlKTsNCisgICAgcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+U2V0VGl0bGUoDQorICAgICAgICBoRG9jLCBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNWYWx1ZSwgYnNWYWx1ZS5HZXRMZW5ndGgoKSkpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1RpdGxlOw0KKyAgcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+R2V0VGl0bGUoaERvYywgd3NUaXRsZSk7DQorICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c1RpdGxlKSk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfVmFsaWRhdGlvbnNFbmFibGVkKA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX0RvYyogaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCisgIGlmIChiU2V0dGluZykgew0KKyAgICBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5TZXRWYWxpZGF0aW9uc0VuYWJsZWQoDQorICAgICAgICBoRG9jLCBGWEpTRV9WYWx1ZV9Ub0Jvb2xlYW4oaFZhbHVlKSk7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0JPT0wgYkVuYWJsZWQgPSBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5Jc1ZhbGlkYXRpb25zRW5hYmxlZChoRG9jKTsNCisgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oaFZhbHVlLCBiRW5hYmxlZCk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfVmFyaWF0aW9uKA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIGlmICghbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+SXNSdW5BdENsaWVudCgpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19VTkFCTEVfU0VUX1ZBUklBVElPTik7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzVmFyaWF0aW9uOw0KKyAgcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+R2V0VmFyaWF0aW9uKHdzVmFyaWF0aW9uKTsNCisgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVmFyaWF0aW9uKSk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfVmVyc2lvbigNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKGJTZXR0aW5nKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfVU5BQkxFX1NFVF9WRVJTSU9OKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NWZXJzaW9uOw0KKyAgcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+R2V0VmVyc2lvbih3c1ZlcnNpb24pOw0KKyAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NWZXJzaW9uKSk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfRm94aXRWZXJzaW9uKA0KKyAgICBGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsNCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAoYlNldHRpbmcpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19VTkFCTEVfU0VUX1ZFUlNJT04pOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1ZlcnNpb247DQorICBwTm90aWZ5LT5HZXRBcHBQcm92aWRlcigpLT5HZXRGb3hpdFZlcnNpb24od3NWZXJzaW9uKTsNCisgIEZYSlNFX1ZhbHVlX1NldFVURjhTdHJpbmcoaFZhbHVlLCBGWF9VVEY4RW5jb2RlKHdzVmVyc2lvbikpOw0KK30NCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX05hbWUoDQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChiU2V0dGluZykgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0FwcE5hbWU7DQorICBwTm90aWZ5LT5HZXRBcHBQcm92aWRlcigpLT5HZXRBcHBOYW1lKHdzQXBwTmFtZSk7DQorICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c0FwcE5hbWUpKTsNCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Gb3hpdE5hbWUoDQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChiU2V0dGluZykgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOVkFsSURfUFJPUF9TRVQpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0ZveGl0QXBwTmFtZTsNCisgIHBOb3RpZnktPkdldEFwcFByb3ZpZGVyKCktPkdldEZveGl0QXBwTmFtZSh3c0ZveGl0QXBwTmFtZSk7DQorICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c0ZveGl0QXBwTmFtZSkpOw0KK30NCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0dvdG9VUkwoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGlmICghbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+SXNSdW5BdENsaWVudCgpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggIT0gMSkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImdvdG9VUkwiKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NVUkw7DQorICBpZiAoaUxlbmd0aCA+PSAxKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzVVJMID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsNCisgICAgd3NVUkwgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNVUkwsIGJzVVJMLkdldExlbmd0aCgpKTsNCisgIH0NCisgIHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPkdvdG9VUkwoaERvYywgd3NVUkwpOw0KK30NCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX09wZW5MaXN0KA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpZiAoIW1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPklzUnVuQXRDbGllbnQoKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoICE9IDEpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJvcGVuTGlzdCIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQorICBpZiAoaUxlbmd0aCA+PSAxKSB7DQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRWYWx1ZSgwKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzT2JqZWN0KGhWYWx1ZSkpIHsNCisgICAgICBwTm9kZSA9IChDWEZBX05vZGUqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhWYWx1ZSwgTlVMTCk7DQorICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGhWYWx1ZSkpIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBic1N0cmluZzsNCisgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBic1N0cmluZyk7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uID0NCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzU3RyaW5nLCBic1N0cmluZy5HZXRMZW5ndGgoKSk7DQorICAgICAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICAgICAgaWYgKCFwU2NyaXB0Q29udGV4dCkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoVmFsdWUpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgICBDWEZBX09iamVjdCogcE9iamVjdCA9IHBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCk7DQorICAgICAgaWYgKCFwT2JqZWN0KSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhWYWx1ZSk7DQorICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICAgIEZYX0RXT1JEIGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5nczsNCisgICAgICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb3ZlTm9kZVJTOw0KKyAgICAgIGludDMyX3QgaVJldCA9IHBTY3JpcHRDb250ZXh0LT5SZXNvbHZlT2JqZWN0cyhwT2JqZWN0LCB3c0V4cHJlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc292ZU5vZGVSUywgZHdGbGFnKTsNCisgICAgICBpZiAoaVJldCA8IDEgfHwgIXJlc292ZU5vZGVSUy5ub2Rlc1swXS0+SXNOb2RlKCkpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaFZhbHVlKTsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgICAgcE5vZGUgPSAoQ1hGQV9Ob2RlKilyZXNvdmVOb2RlUlMubm9kZXNbMF07DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoVmFsdWUpOw0KKyAgfQ0KKyAgSVhGQV9Eb2NMYXlvdXQqIHBEb2NMYXlvdXQgPSBtX3BEb2N1bWVudC0+R2V0RG9jTGF5b3V0KCk7DQorICBpZiAoIXBEb2NMYXlvdXQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9XaWRnZXQqIGhXaWRnZXQgPSBwTm90aWZ5LT5HZXRIV2lkZ2V0KHBEb2NMYXlvdXQtPkdldExheW91dEl0ZW0ocE5vZGUpKTsNCisgIGlmICghaFdpZGdldCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5TZXRGb2N1c1dpZGdldChwTm90aWZ5LT5HZXRIRE9DKCksIGhXaWRnZXQpOw0KKyAgcE5vdGlmeS0+T3BlbkRyb3BEb3duTGlzdChoV2lkZ2V0KTsNCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9SZXNwb25zZSgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCA8IDEgfHwgaUxlbmd0aCA+IDQpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJyZXNwb25zZSIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NRdWVzdGlvbjsNCisgIENGWF9XaWRlU3RyaW5nIHdzVGl0bGU7DQorICBDRlhfV2lkZVN0cmluZyB3c0RlZmF1bHRBbnN3ZXI7DQorICBGWF9CT09MIGJNYXJrID0gRkFMU0U7DQorICBpZiAoaUxlbmd0aCA+PSAxKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzUXVlc3Rpb24gPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KKyAgICB3c1F1ZXN0aW9uID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzUXVlc3Rpb24sIGJzUXVlc3Rpb24uR2V0TGVuZ3RoKCkpOw0KKyAgfQ0KKyAgaWYgKGlMZW5ndGggPj0gMikgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic1RpdGxlID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygxKTsNCisgICAgd3NUaXRsZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1RpdGxlLCBic1RpdGxlLkdldExlbmd0aCgpKTsNCisgIH0NCisgIGlmIChpTGVuZ3RoID49IDMpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEZWZhdWx0QW5zd2VyID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygyKTsNCisgICAgd3NEZWZhdWx0QW5zd2VyID0NCisgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0RlZmF1bHRBbnN3ZXIsIGJzRGVmYXVsdEFuc3dlci5HZXRMZW5ndGgoKSk7DQorICB9DQorICBpZiAoaUxlbmd0aCA+PSA0KSB7DQorICAgIGJNYXJrID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMykgPT0gMCA/IEZBTFNFIDogVFJVRTsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzQW5zd2VyOw0KKyAgcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+UmVzcG9uc2Uod3NBbnN3ZXIsIHdzUXVlc3Rpb24sIHdzVGl0bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0RlZmF1bHRBbnN3ZXIsIGJNYXJrKTsNCisgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KKyAgaWYgKGhWYWx1ZSkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRVVEY4U3RyaW5nKGhWYWx1ZSwgRlhfVVRGOEVuY29kZSh3c0Fuc3dlcikpOw0KKyAgfQ0KK30NCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0RvY3VtZW50SW5CYXRjaCgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGludDMyX3QgaUN1ciA9IHBOb3RpZnktPkdldEFwcFByb3ZpZGVyKCktPkdldEN1ckRvY3VtZW50SW5CYXRjaCgpOw0KKyAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQorICBpZiAoaFZhbHVlKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBpQ3VyKTsNCisgIH0NCit9DQorc3RhdGljIGludDMyX3QgWEZBX0ZpbHRlck5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0V4cHJlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRmlsdGVyKSB7DQorICBGWFNZU19hc3NlcnQoblN0YXJ0ID4gLTEpOw0KKyAgaW50MzJfdCBpTGVuZ3RoID0gd3NFeHByZXNzaW9uLkdldExlbmd0aCgpOw0KKyAgaWYgKG5TdGFydCA+PSBpTGVuZ3RoKSB7DQorICAgIHJldHVybiBpTGVuZ3RoOw0KKyAgfQ0KKyAgRlhfV0NIQVIqIHBCdWYgPSB3c0ZpbHRlci5HZXRCdWZmZXIoaUxlbmd0aCAtIG5TdGFydCk7DQorICBpbnQzMl90IG5Db3VudCA9IDA7DQorICBjb25zdCBGWF9XQ0hBUiogcFNyYyA9IHdzRXhwcmVzc2lvbi5HZXRQdHIoKTsNCisgIEZYX1dDSEFSIHdDdXI7DQorICB3aGlsZSAoblN0YXJ0IDwgaUxlbmd0aCkgew0KKyAgICB3Q3VyID0gcFNyY1tuU3RhcnQrK107DQorICAgIGlmICh3Q3VyID09ICcsJykgew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICAgIHBCdWZbbkNvdW50KytdID0gd0N1cjsNCisgIH0NCisgIHdzRmlsdGVyLlJlbGVhc2VCdWZmZXIobkNvdW50KTsNCisgIHdzRmlsdGVyLlRyaW1MZWZ0KCk7DQorICB3c0ZpbHRlci5UcmltUmlnaHQoKTsNCisgIHJldHVybiBuU3RhcnQ7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfUmVzZXREYXRhKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoIDwgMCB8fCBpTGVuZ3RoID4gMSkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMInJlc2V0RGF0YSIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uOw0KKyAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic0V4cHJlc3Npb24gPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KKyAgICB3c0V4cHJlc3Npb24gPQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzRXhwcmVzc2lvbiwgYnNFeHByZXNzaW9uLkdldExlbmd0aCgpKTsNCisgIH0NCisgIGlmICh3c0V4cHJlc3Npb24uSXNFbXB0eSgpKSB7DQorICAgIHBOb3RpZnktPlJlc2V0RGF0YSgpOw0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlTdGFydCA9IDA7DQorICBDRlhfV2lkZVN0cmluZyB3c05hbWU7DQorICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCisgIGludDMyX3QgaUV4cExlbmd0aCA9IHdzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKTsNCisgIHdoaWxlIChpU3RhcnQgPCBpRXhwTGVuZ3RoKSB7DQorICAgIGlTdGFydCA9IFhGQV9GaWx0ZXJOYW1lKHdzRXhwcmVzc2lvbiwgaVN0YXJ0LCB3c05hbWUpOw0KKyAgICBJWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKTsNCisgICAgaWYgKCFwU2NyaXB0Q29udGV4dCkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBDWEZBX09iamVjdCogcE9iamVjdCA9IHBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCk7DQorICAgIGlmICghcE9iamVjdCkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBGWF9EV09SRCBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfCBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwNCisgICAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzOw0KKyAgICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb3ZlTm9kZVJTOw0KKyAgICBpbnQzMl90IGlSZXQgPQ0KKyAgICAgICAgcFNjcmlwdENvbnRleHQtPlJlc29sdmVPYmplY3RzKHBPYmplY3QsIHdzTmFtZSwgcmVzb3ZlTm9kZVJTLCBkd0ZsYWcpOw0KKyAgICBpZiAoaVJldCA8IDEgfHwgIXJlc292ZU5vZGVSUy5ub2Rlc1swXS0+SXNOb2RlKCkpIHsNCisgICAgICBjb250aW51ZTsNCisgICAgfQ0KKyAgICBwTm9kZSA9IChDWEZBX05vZGUqKXJlc292ZU5vZGVSUy5ub2Rlc1swXTsNCisgICAgcE5vdGlmeS0+UmVzZXREYXRhKHBOb2RlLT5HZXRXaWRnZXREYXRhKCkpOw0KKyAgfQ0KKyAgaWYgKCFwTm9kZSkgew0KKyAgICBwTm90aWZ5LT5SZXNldERhdGEoKTsNCisgIH0NCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9CZWVwKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpZiAoIW1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPklzUnVuQXRDbGllbnQoKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoIDwgMCB8fCBpTGVuZ3RoID4gMSkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMImJlZXAiKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYX0RXT1JEIGR3VHlwZSA9IDQ7DQorICBpZiAoaUxlbmd0aCA+PSAxKSB7DQorICAgIGR3VHlwZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDApOw0KKyAgfQ0KKyAgcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+QmVlcChkd1R5cGUpOw0KK30NCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1NldEZvY3VzKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpZiAoIW1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPklzUnVuQXRDbGllbnQoKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoICE9IDEpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJzZXRGb2N1cyIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQorICBpZiAoaUxlbmd0aCA+PSAxKSB7DQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRWYWx1ZSgwKTsNCisgICAgaWYgKEZYSlNFX1ZhbHVlX0lzT2JqZWN0KGhWYWx1ZSkpIHsNCisgICAgICBwTm9kZSA9IChDWEZBX05vZGUqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhWYWx1ZSwgTlVMTCk7DQorICAgIH0gZWxzZSBpZiAoRlhKU0VfVmFsdWVfSXNVVEY4U3RyaW5nKGhWYWx1ZSkpIHsNCisgICAgICBDRlhfQnl0ZVN0cmluZyBic1N0cmluZzsNCisgICAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlLCBic1N0cmluZyk7DQorICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uID0NCisgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzU3RyaW5nLCBic1N0cmluZy5HZXRMZW5ndGgoKSk7DQorICAgICAgSVhGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICAgICAgaWYgKCFwU2NyaXB0Q29udGV4dCkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoVmFsdWUpOw0KKyAgICAgICAgcmV0dXJuOw0KKyAgICAgIH0NCisgICAgICBDWEZBX09iamVjdCogcE9iamVjdCA9IHBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCk7DQorICAgICAgaWYgKCFwT2JqZWN0KSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhWYWx1ZSk7DQorICAgICAgICByZXR1cm47DQorICAgICAgfQ0KKyAgICAgIEZYX0RXT1JEIGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfA0KKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5nczsNCisgICAgICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb3ZlTm9kZVJTOw0KKyAgICAgIGludDMyX3QgaVJldCA9IHBTY3JpcHRDb250ZXh0LT5SZXNvbHZlT2JqZWN0cyhwT2JqZWN0LCB3c0V4cHJlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc292ZU5vZGVSUywgZHdGbGFnKTsNCisgICAgICBpZiAoaVJldCA8IDEgfHwgIXJlc292ZU5vZGVSUy5ub2Rlc1swXS0+SXNOb2RlKCkpIHsNCisgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaFZhbHVlKTsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgICAgcE5vZGUgPSAoQ1hGQV9Ob2RlKilyZXNvdmVOb2RlUlMubm9kZXNbMF07DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoVmFsdWUpOw0KKyAgfQ0KKyAgcE5vdGlmeS0+U2V0Rm9jdXNXaWRnZXROb2RlKHBOb2RlKTsNCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9HZXRGb2N1cygNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfTm9kZSogcE5vZGUgPSBwTm90aWZ5LT5HZXRGb2N1c1dpZGdldE5vZGUoKTsNCisgIGlmICghcE5vZGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhKU0VfVmFsdWVfU2V0KHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocE5vZGUpKTsNCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9NZXNzYWdlQm94KA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpZiAoIW1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPklzUnVuQXRDbGllbnQoKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoIDwgMSB8fCBpTGVuZ3RoID4gNCkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMIm1lc3NhZ2VCb3giKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZTsNCisgIENGWF9XaWRlU3RyaW5nIGJzVGl0bGU7DQorICBGWF9EV09SRCBkd01lc3NhZ2VUeXBlID0gWEZBX01CSUNPTl9FcnJvcjsNCisgIEZYX0RXT1JEIGR3QnV0dG9uVHlwZSA9IFhGQV9NQl9PSzsNCisgIGlmIChpTGVuZ3RoID49IDEpIHsNCisgICAgaWYgKCFTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1ZhbGlkYXRlQXJnc0Zvck1zZyhwQXJndW1lbnRzLCAwLCB3c01lc3NhZ2UpKSB7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICB9DQorICBpZiAoaUxlbmd0aCA+PSAyKSB7DQorICAgIGlmICghU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9WYWxpZGF0ZUFyZ3NGb3JNc2cocEFyZ3VtZW50cywgMSwgYnNUaXRsZSkpIHsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgIH0NCisgIGlmIChpTGVuZ3RoID49IDMpIHsNCisgICAgZHdNZXNzYWdlVHlwZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDIpOw0KKyAgICBpZiAoZHdNZXNzYWdlVHlwZSA+IFhGQV9NQklDT05fU3RhdHVzKSB7DQorICAgICAgZHdNZXNzYWdlVHlwZSA9IFhGQV9NQklDT05fRXJyb3I7DQorICAgIH0NCisgIH0NCisgIGlmIChpTGVuZ3RoID49IDQpIHsNCisgICAgZHdCdXR0b25UeXBlID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMyk7DQorICAgIGlmIChkd0J1dHRvblR5cGUgPiBYRkFfTUJfWWVzTm9DYW5jZWwpIHsNCisgICAgICBkd0J1dHRvblR5cGUgPSBYRkFfTUJfT0s7DQorICAgIH0NCisgIH0NCisgIGludDMyX3QgaVZhbHVlID0gcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+TXNnQm94KA0KKyAgICAgIHdzTWVzc2FnZSwgYnNUaXRsZSwgZHdNZXNzYWdlVHlwZSwgZHdCdXR0b25UeXBlKTsNCisgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KKyAgaWYgKGhWYWx1ZSkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgaVZhbHVlKTsNCisgIH0NCit9DQorRlhfQk9PTCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9WYWxpZGF0ZUFyZ3NGb3JNc2coDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMsDQorICAgIGludDMyX3QgaUFyZ0luZGV4LA0KKyAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSkgew0KKyAgaWYgKHBBcmd1bWVudHMgPT0gTlVMTCB8fCBpQXJnSW5kZXggPCAwKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZYX0JPT0wgYklzSnNUeXBlID0gRkFMU0U7DQorICBpZiAobV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VHlwZSgpID09DQorICAgICAgWEZBX1NDUklQVExBTkdUWVBFX0phdmFzY3JpcHQpIHsNCisgICAgYklzSnNUeXBlID0gVFJVRTsNCisgIH0NCisgIEZYSlNFX0hWQUxVRSBoVmFsdWVBcmcgPSBwQXJndW1lbnRzLT5HZXRWYWx1ZShpQXJnSW5kZXgpOw0KKyAgaWYgKCFGWEpTRV9WYWx1ZV9Jc1VURjhTdHJpbmcoaFZhbHVlQXJnKSAmJiBiSXNKc1R5cGUpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19BUkdVTUVOVF9NSVNNQVRDSCk7DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaFZhbHVlQXJnKTsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgaWYgKEZYSlNFX1ZhbHVlX0lzTnVsbChoVmFsdWVBcmcpKSB7DQorICAgIHdzVmFsdWUgPSBGWF9XU1RSQyhMIiIpOw0KKyAgfSBlbHNlIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnlNZXNzYWdlOw0KKyAgICBGWEpTRV9WYWx1ZV9Ub1VURjhTdHJpbmcoaFZhbHVlQXJnLCBieU1lc3NhZ2UpOw0KKyAgICB3c1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJ5TWVzc2FnZSwgYnlNZXNzYWdlLkdldExlbmd0aCgpKTsNCisgIH0NCisgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaFZhbHVlQXJnKTsNCisgIHJldHVybiBUUlVFOw0KK30NCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0RvY3VtZW50Q291bnRJbkJhdGNoKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpVmFsdWUgPSBwTm90aWZ5LT5HZXRBcHBQcm92aWRlcigpLT5HZXREb2N1bWVudENvdW50SW5CYXRjaCgpOw0KKyAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQorICBpZiAoaFZhbHVlKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBpVmFsdWUpOw0KKyAgfQ0KK30NCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1ByaW50KA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpZiAoIW1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPklzUnVuQXRDbGllbnQoKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoICE9IDgpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJwcmludCIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Eb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7DQorICBGWF9EV09SRCBkd09wdGlvbnMgPSAwOw0KKyAgRlhfQk9PTCBiU2hvd0RpYWxvZyA9IFRSVUU7DQorICBpZiAoaUxlbmd0aCA+PSAxKSB7DQorICAgIGJTaG93RGlhbG9nID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCkgPT0gMCA/IEZBTFNFIDogVFJVRTsNCisgIH0NCisgIGlmIChiU2hvd0RpYWxvZykgew0KKyAgICBkd09wdGlvbnMgfD0gWEZBX1BSSU5UT1BUX1Nob3dEaWFsb2c7DQorICB9DQorICBpbnQzMl90IG5TdGFydFBhZ2UgPSAwOw0KKyAgaWYgKGlMZW5ndGggPj0gMikgew0KKyAgICBuU3RhcnRQYWdlID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMSk7DQorICB9DQorICBpbnQzMl90IG5FbmRQYWdlID0gMDsNCisgIGlmIChpTGVuZ3RoID49IDMpIHsNCisgICAgbkVuZFBhZ2UgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigyKTsNCisgIH0NCisgIEZYX0JPT0wgYkNhbkNhbmNlbCA9IFRSVUU7DQorICBpZiAoaUxlbmd0aCA+PSA0KSB7DQorICAgIGJDYW5DYW5jZWwgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigzKSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KKyAgfQ0KKyAgaWYgKGJDYW5DYW5jZWwpIHsNCisgICAgZHdPcHRpb25zIHw9IFhGQV9QUklOVE9QVF9DYW5DYW5jZWw7DQorICB9DQorICBGWF9CT09MIGJTaHJpbmtQYWdlID0gVFJVRTsNCisgIGlmIChpTGVuZ3RoID49IDUpIHsNCisgICAgYlNocmlua1BhZ2UgPSBwQXJndW1lbnRzLT5HZXRJbnQzMig0KSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KKyAgfQ0KKyAgaWYgKGJTaHJpbmtQYWdlKSB7DQorICAgIGR3T3B0aW9ucyB8PSBYRkFfUFJJTlRPUFRfU2hyaW5rUGFnZTsNCisgIH0NCisgIEZYX0JPT0wgYkFzSW1hZ2UgPSBUUlVFOw0KKyAgaWYgKGlMZW5ndGggPj0gNikgew0KKyAgICBiQXNJbWFnZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDUpID09IDAgPyBGQUxTRSA6IFRSVUU7DQorICB9DQorICBpZiAoYkFzSW1hZ2UpIHsNCisgICAgZHdPcHRpb25zIHw9IFhGQV9QUklOVE9QVF9Bc0ltYWdlOw0KKyAgfQ0KKyAgRlhfQk9PTCBiUmV2ZXJzZU9yZGVyID0gVFJVRTsNCisgIGlmIChpTGVuZ3RoID49IDcpIHsNCisgICAgYkFzSW1hZ2UgPSBwQXJndW1lbnRzLT5HZXRJbnQzMig1KSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KKyAgfQ0KKyAgYlJldmVyc2VPcmRlciA9IHBBcmd1bWVudHMtPkdldEludDMyKDYpID09IDAgPyBGQUxTRSA6IFRSVUU7DQorICBpZiAoYlJldmVyc2VPcmRlcikgew0KKyAgICBkd09wdGlvbnMgfD0gWEZBX1BSSU5UT1BUX1JldmVyc2VPcmRlcjsNCisgIH0NCisgIEZYX0JPT0wgYlByaW50QW5ub3QgPSBUUlVFOw0KKyAgaWYgKGlMZW5ndGggPj0gOCkgew0KKyAgICBiUHJpbnRBbm5vdCA9IHBBcmd1bWVudHMtPkdldEludDMyKDcpID09IDAgPyBGQUxTRSA6IFRSVUU7DQorICB9DQorICBpZiAoYlByaW50QW5ub3QpIHsNCisgICAgZHdPcHRpb25zIHw9IFhGQV9QUklOVE9QVF9QcmludEFubm90Ow0KKyAgfQ0KKyAgcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+UHJpbnQoaERvYywgblN0YXJ0UGFnZSwgbkVuZFBhZ2UsIGR3T3B0aW9ucyk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfSW1wb3J0RGF0YSgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCA8IDAgfHwgaUxlbmd0aCA+IDEpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJpbXBvcnREYXRhIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0ZpbGVQYXRoOw0KKyAgaWYgKGlMZW5ndGggPiAwKSB7DQorICAgIENGWF9CeXRlU3RyaW5nIGJzRmlsZVBhdGggPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOw0KKyAgICB3c0ZpbGVQYXRoID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzRmlsZVBhdGgsIGJzRmlsZVBhdGguR2V0TGVuZ3RoKCkpOw0KKyAgfQ0KKyAgSVhGQV9Eb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7DQorICBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5JbXBvcnREYXRhKGhEb2MsIHdzRmlsZVBhdGgpOw0KK30NCit2b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0V4cG9ydERhdGEoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggPCAwIHx8IGlMZW5ndGggPiAyKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiZXhwb3J0RGF0YSIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Eb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7DQorICBDRlhfV2lkZVN0cmluZyB3c0ZpbGVQYXRoOw0KKyAgRlhfQk9PTCBiWERQID0gVFJVRTsNCisgIGlmIChpTGVuZ3RoID49IDEpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNGaWxlUGF0aCA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7DQorICAgIHdzRmlsZVBhdGggPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNGaWxlUGF0aCwgYnNGaWxlUGF0aC5HZXRMZW5ndGgoKSk7DQorICB9DQorICBpZiAoaUxlbmd0aCA+PSAyKSB7DQorICAgIGJYRFAgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigxKSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KKyAgfQ0KKyAgcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+RXhwb3J0RGF0YShoRG9jLCB3c0ZpbGVQYXRoLCBiWERQKTsNCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9QYWdlVXAoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX0RvYyogaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCisgIGludDMyX3QgbkN1clBhZ2UgPSBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5HZXRDdXJyZW50UGFnZShoRG9jKTsNCisgIGludDMyX3Qgbk5ld1BhZ2UgPSAwOw0KKyAgaWYgKG5DdXJQYWdlIDw9IDEpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbk5ld1BhZ2UgPSBuQ3VyUGFnZSAtIDE7DQorICBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5TZXRDdXJyZW50UGFnZShoRG9jLCBuTmV3UGFnZSk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfUGFnZURvd24oDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX0RvYyogaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCisgIGludDMyX3QgbkN1clBhZ2UgPSBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5HZXRDdXJyZW50UGFnZShoRG9jKTsNCisgIGludDMyX3QgblBhZ2VDb3VudCA9IHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPkNvdW50UGFnZXMoaERvYyk7DQorICBpZiAoIW5QYWdlQ291bnQgfHwgbkN1clBhZ2UgPT0gblBhZ2VDb3VudCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IG5OZXdQYWdlID0gMDsNCisgIGlmIChuQ3VyUGFnZSA+PSBuUGFnZUNvdW50KSB7DQorICAgIG5OZXdQYWdlID0gblBhZ2VDb3VudCAtIDE7DQorICB9IGVsc2Ugew0KKyAgICBuTmV3UGFnZSA9IG5DdXJQYWdlICsgMTsNCisgIH0NCisgIHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPlNldEN1cnJlbnRQYWdlKGhEb2MsIG5OZXdQYWdlKTsNCit9DQordm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6U2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9DdXJyZW50RGF0ZVRpbWUoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c0RhdGFUaW1lID0gcE5vdGlmeS0+R2V0Q3VycmVudERhdGVUaW1lKCk7DQorICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCisgIGlmIChoVmFsdWUpIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhoVmFsdWUsIEZYX1VURjhFbmNvZGUod3NEYXRhVGltZSkpOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2hvc3Rwc2V1ZG9tb2RlbC5oIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ob3N0cHNldWRvbW9kZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTc0MDFiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ob3N0cHNldWRvbW9kZWwuaApAQCAtMCwwICsxLDg0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1NDUklQVF9IT1NUUFNFVURPTU9ERUxfSF8NCisjZGVmaW5lIF9TQ1JJUFRfSE9TVFBTRVVET01PREVMX0hfDQorY2xhc3MgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWwgOiBwdWJsaWMgQ1hGQV9PcmRpbmFyeU9iamVjdCB7DQorIHB1YmxpYzoNCisgIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCk7DQorICB2aXJ0dWFsIH5DU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbCgpOw0KKw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0FwcFR5cGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0ZveGl0QXBwVHlwZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0NhbGN1bGF0aW9uc0VuYWJsZWQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0N1cnJlbnRQYWdlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0xhbmd1YWdlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX051bVBhZ2VzKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1BsYXRmb3JtKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1RpdGxlKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1ZhbGlkYXRpb25zRW5hYmxlZChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1ZhcmlhdGlvbihGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1ZlcnNpb24oRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0ZveGl0VmVyc2lvbihGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX05hbWUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0ZveGl0TmFtZShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTZXR0aW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOw0KKw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0dvdG9VUkwoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfT3Blbkxpc3QoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfUmVzcG9uc2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfRG9jdW1lbnRJbkJhdGNoKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1Jlc2V0RGF0YShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9CZWVwKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1NldEZvY3VzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX0dldEZvY3VzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX01lc3NhZ2VCb3goQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfRG9jdW1lbnRDb3VudEluQmF0Y2goDQorICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfUHJpbnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfSW1wb3J0RGF0YShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9FeHBvcnREYXRhKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfSG9zdFBzZXVkb01vZGVsX1BhZ2VVcChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9QYWdlRG93bihDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9DdXJyZW50RGF0ZVRpbWUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbF9Mb2FkU3RyaW5nKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJWEZBX05vdGlmeSogcE5vdGlmeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZyk7DQorICBGWF9CT09MIFNjcmlwdF9Ib3N0UHNldWRvTW9kZWxfVmFsaWRhdGVBcmdzRm9yTXNnKA0KKyAgICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMsDQorICAgICAgaW50MzJfdCBpQXJnSW5kZXgsDQorICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9pbXAuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9pbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNGYwMjMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2ltcC5jcHAKQEAgLTAsMCArMSw4NDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3V0aWxzLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9vYmplY3QuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY3VtZW50LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9wYXJzZXIuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3NjcmlwdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jZGF0YS5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jbGF5b3V0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9sb2NhbGVtZ3IuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2ZtMmpzYXBpLmgiDQorI2luY2x1ZGUgInhmYV9zY3JpcHRfaW1wLmgiDQorI2luY2x1ZGUgInhmYV9zY3JpcHRfcmVzb2x2ZXByb2Nlc3Nvci5oIg0KKyNpbmNsdWRlICJ4ZmFfc2NyaXB0X25vZGVoZWxwZXIuaCINCitDWEZBX1NjcmlwdENvbnRleHQ6OkNYRkFfU2NyaXB0Q29udGV4dChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpDQorICAgIDogbV9wRG9jdW1lbnQocERvY3VtZW50KSwNCisgICAgICBtX2hKc0NvbnRleHQobnVsbHB0ciksDQorICAgICAgbV9oSnNSdW50aW1lKG51bGxwdHIpLA0KKyAgICAgIG1faEpzQ2xhc3MobnVsbHB0ciksDQorICAgICAgbV9lU2NyaXB0VHlwZShYRkFfU0NSSVBUTEFOR1RZUEVfVW5rb3duKSwNCisgICAgICBtX3BFdmVudFBhcmFtKG51bGxwdHIpLA0KKyAgICAgIG1fcFNjcmlwdE5vZGVBcnJheShudWxscHRyKSwNCisgICAgICBtX3BSZXNvbHZlUHJvY2Vzc29yKG51bGxwdHIpLA0KKyAgICAgIG1faEZNMkpTQ29udGV4dChudWxscHRyKSwNCisgICAgICBtX3BUaGlzT2JqZWN0KG51bGxwdHIpLA0KKyAgICAgIG1fZHdCdWlsdEluSW5GbGFncygwKSwNCisgICAgICBtX2VSdW5BdFR5cGUoWEZBX0FUVFJJQlVURUVOVU1fQ2xpZW50KSB7DQorICBGWF9tZW1zZXQoJm1fSnNHbG9iYWxDbGFzcywgMCwgc2l6ZW9mKEZYSlNFX0NMQVNTKSk7DQorICBGWF9tZW1zZXQoJm1fSnNOb3JtYWxDbGFzcywgMCwgc2l6ZW9mKEZYSlNFX0NMQVNTKSk7DQorfQ0KK0NYRkFfU2NyaXB0Q29udGV4dDo6fkNYRkFfU2NyaXB0Q29udGV4dCgpIHsNCisgIEZYX1BPU0lUSU9OIHBzID0gbV9tYXBYRkFUb0hWYWx1ZS5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocHMpIHsNCisgICAgQ1hGQV9PYmplY3QqIHBYRkFPYmo7DQorICAgIEZYSlNFX0hWQUxVRSBwVmFsdWU7DQorICAgIG1fbWFwWEZBVG9IVmFsdWUuR2V0TmV4dEFzc29jKHBzLCBwWEZBT2JqLCBwVmFsdWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHBWYWx1ZSk7DQorICB9DQorICBtX21hcFhGQVRvSFZhbHVlLlJlbW92ZUFsbCgpOw0KKyAgUmVsZWFzZVZhcmlhYmxlc01hcCgpOw0KKyAgaWYgKG1faEZNMkpTQ29udGV4dCkgew0KKyAgICBYRkFfRk0ySlNfQ29udGV4dFJlbGVhc2UobV9oRk0ySlNDb250ZXh0KTsNCisgICAgbV9oRk0ySlNDb250ZXh0ID0gTlVMTDsNCisgIH0NCisgIGlmIChtX2hKc0NvbnRleHQpIHsNCisgICAgRlhKU0VfQ29udGV4dF9SZWxlYXNlKG1faEpzQ29udGV4dCk7DQorICAgIG1faEpzQ29udGV4dCA9IE5VTEw7DQorICB9DQorICBpZiAobV9wUmVzb2x2ZVByb2Nlc3Nvcikgew0KKyAgICBkZWxldGUgbV9wUmVzb2x2ZVByb2Nlc3NvcjsNCisgICAgbV9wUmVzb2x2ZVByb2Nlc3NvciA9IE5VTEw7DQorICB9DQorICBtX3VwT2JqZWN0QXJyYXkuUmVtb3ZlQWxsKCk7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX0NhY2hlTGlzdEFycmF5LkdldFNpemUoKTsgaSsrKSB7DQorICAgIGRlbGV0ZSAoKENYRkFfTm9kZUxpc3QqKW1fQ2FjaGVMaXN0QXJyYXlbaV0pOw0KKyAgfQ0KKyAgbV9DYWNoZUxpc3RBcnJheS5SZW1vdmVBbGwoKTsNCisgIGlmIChtX2R3QnVpbHRJbkluRmxhZ3MgJiBYRkFfSlNCVUlMVElOX0hhc0NvdW50KSB7DQorICAgIEZYX1BPU0lUSU9OIHBzID0gbV9KU0J1aWx0SW5PYmplY3RzLkdldFN0YXJ0UG9zaXRpb24oKTsNCisgICAgd2hpbGUgKHBzKSB7DQorICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNLZXk7DQorICAgICAgdm9pZCogcFZhbHVlID0gTlVMTDsNCisgICAgICBtX0pTQnVpbHRJbk9iamVjdHMuR2V0TmV4dEFzc29jKHBzLCBic0tleSwgcFZhbHVlKTsNCisgICAgICBpZiAocFZhbHVlKSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKChGWEpTRV9IVkFMVUUpcFZhbHVlKTsNCisgICAgICB9DQorICAgIH0NCisgICAgbV9KU0J1aWx0SW5PYmplY3RzLlJlbW92ZUFsbCgpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfU2NyaXB0Q29udGV4dDo6SW5pdGlhbGl6ZShGWEpTRV9IUlVOVElNRSBoUnVudGltZSkgew0KKyAgbV9oSnNSdW50aW1lID0gaFJ1bnRpbWU7DQorICBEZWZpbmVKc0NvbnRleHQoKTsNCisgIERlZmluZUpzQ2xhc3MoKTsNCisgIG1fcFJlc29sdmVQcm9jZXNzb3IgPSBuZXcgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOw0KK30NCit2b2lkIENYRkFfU2NyaXB0Q29udGV4dDo6UmVsZWFzZSgpIHsNCisgIGRlbGV0ZSB0aGlzOw0KK30NCitGWF9CT09MIENYRkFfU2NyaXB0Q29udGV4dDo6UnVuU2NyaXB0KFhGQV9TQ1JJUFRMQU5HVFlQRSBlU2NyaXB0VHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NTY3JpcHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFJldFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9PYmplY3QqIHBUaGlzT2JqZWN0KSB7DQorICBDRlhfQnl0ZVN0cmluZyBidFNjcmlwdDsNCisgIFhGQV9TQ1JJUFRMQU5HVFlQRSBlU2F2ZVR5cGUgPSBtX2VTY3JpcHRUeXBlOw0KKyAgbV9lU2NyaXB0VHlwZSA9IGVTY3JpcHRUeXBlOw0KKyAgaWYgKGVTY3JpcHRUeXBlID09IFhGQV9TQ1JJUFRMQU5HVFlQRV9Gb3JtY2FsYykgew0KKyAgICBpZiAoIW1faEZNMkpTQ29udGV4dCkgew0KKyAgICAgIG1faEZNMkpTQ29udGV4dCA9IFhGQV9GTTJKU19Db250ZXh0Q3JlYXRlKCk7DQorICAgICAgWEZBX0ZNMkpTX0NvbnRleHRJbml0aWFsaXplKG1faEZNMkpTQ29udGV4dCwgbV9oSnNSdW50aW1lLCBtX2hKc0NvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcERvY3VtZW50KTsNCisgICAgfQ0KKyAgICBDRlhfV2lkZVRleHRCdWYgd3NKYXZhU2NyaXB0Ow0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0Vycm9ySW5mbzsNCisgICAgaW50MzJfdCBpRmxhZ3MgPSBYRkFfRk0ySlNfVHJhbnNsYXRlKHdzU2NyaXB0LCB3c0phdmFTY3JpcHQsIHdzRXJyb3JJbmZvKTsNCisgICAgaWYgKGlGbGFncykgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldFVuZGVmaW5lZChoUmV0VmFsdWUpOw0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBidFNjcmlwdCA9DQorICAgICAgICBGWF9VVEY4RW5jb2RlKHdzSmF2YVNjcmlwdC5HZXRCdWZmZXIoKSwgd3NKYXZhU2NyaXB0LkdldExlbmd0aCgpKTsNCisgIH0gZWxzZSB7DQorICAgIGlmICgobV9kd0J1aWx0SW5JbkZsYWdzICYgWEZBX0pTQlVJTFRJTl9Jbml0aWFsaXplZCkgPT0gMCkgew0KKyAgICAgIG1fZHdCdWlsdEluSW5GbGFncyA9IFhGQV9KU0JVSUxUSU5fSW5pdGlhbGl6ZWQ7DQorICAgICAgRlhfUE9TSVRJT04gcHMgPSBtX0pTQnVpbHRJbk9iamVjdHMuR2V0U3RhcnRQb3NpdGlvbigpOw0KKyAgICAgIGlmIChwcykgew0KKyAgICAgICAgRlhKU0VfSFZBTFVFIGhPYmplY3QgPSBGWEpTRV9Db250ZXh0X0dldEdsb2JhbE9iamVjdChtX2hKc0NvbnRleHQpOw0KKyAgICAgICAgd2hpbGUgKHBzKSB7DQorICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGJzS2V5Ow0KKyAgICAgICAgICB2b2lkKiBwVmFsdWU7DQorICAgICAgICAgIG1fSlNCdWlsdEluT2JqZWN0cy5HZXROZXh0QXNzb2MocHMsIGJzS2V5LCBwVmFsdWUpOw0KKyAgICAgICAgICBGWEpTRV9IVkFMVUUgaFByb3AgPSBGWEpTRV9WYWx1ZV9DcmVhdGUobV9oSnNSdW50aW1lKTsNCisgICAgICAgICAgaWYgKEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoaE9iamVjdCwgYnNLZXksIGhQcm9wKSkgew0KKyAgICAgICAgICAgIG1fSlNCdWlsdEluT2JqZWN0cy5TZXRBdChic0tleSwgaFByb3ApOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX0RlbGV0ZU9iamVjdFByb3AoaE9iamVjdCwgYnNLZXkpOw0KKyAgICAgICAgICAgIG1fZHdCdWlsdEluSW5GbGFncyB8PSBYRkFfSlNCVUlMVElOX0hhc0NvdW50Ow0KKyAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIG1fSlNCdWlsdEluT2JqZWN0cy5SZW1vdmVLZXkoYnNLZXkpOw0KKyAgICAgICAgICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaFByb3ApOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhPYmplY3QpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBidFNjcmlwdCA9IEZYX1VURjhFbmNvZGUod3NTY3JpcHQuR2V0UHRyKCksIHdzU2NyaXB0LkdldExlbmd0aCgpKTsNCisgIH0NCisgIENYRkFfT2JqZWN0KiBwT3JpZ2luYWxPYmplY3QgPSBtX3BUaGlzT2JqZWN0Ow0KKyAgbV9wVGhpc09iamVjdCA9IHBUaGlzT2JqZWN0Ow0KKyAgRlhKU0VfSFZBTFVFIHBWYWx1ZSA9IHBUaGlzT2JqZWN0ID8gR2V0SlNWYWx1ZUZyb21NYXAocFRoaXNPYmplY3QpIDogTlVMTDsNCisgIEZYX0JPT0wgYlJldCA9IEZYSlNFX0V4ZWN1dGVTY3JpcHQobV9oSnNDb250ZXh0LCBidFNjcmlwdCwgaFJldFZhbHVlLCBwVmFsdWUpOw0KKyAgbV9wVGhpc09iamVjdCA9IHBPcmlnaW5hbE9iamVjdDsNCisgIG1fZVNjcmlwdFR5cGUgPSBlU2F2ZVR5cGU7DQorICByZXR1cm4gYlJldDsNCit9DQordm9pZCBDWEZBX1NjcmlwdENvbnRleHQ6Okdsb2JhbFByb3BlcnR5U2V0dGVyKEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFZhbHVlKSB7DQorICBDWEZBX09iamVjdCogbHBPcmdpbmFsTm9kZSA9DQorICAgICAgKENYRkFfT2JqZWN0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoT2JqZWN0LCBOVUxMKTsNCisgIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBscE9yZ2luYWxOb2RlLT5HZXREb2N1bWVudCgpOw0KKyAgQ1hGQV9TY3JpcHRDb250ZXh0KiBscFNjcmlwdENvbnRleHQgPQ0KKyAgICAgIChDWEZBX1NjcmlwdENvbnRleHQqKXBEb2MtPkdldFNjcmlwdENvbnRleHQoKTsNCisgIENYRkFfT2JqZWN0KiBscEN1ck5vZGUgPSBscFNjcmlwdENvbnRleHQtPkdldFZhcmlhYmxlc1RoaXMobHBPcmdpbmFsTm9kZSk7DQorICBDRlhfV2lkZVN0cmluZyB3c1Byb3BOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KA0KKyAgICAgIChjb25zdCBGWF9DSEFSKilzelByb3BOYW1lLkdldFB0cigpLCBzelByb3BOYW1lLkdldExlbmd0aCgpKTsNCisgIEZYX0RXT1JEIGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfCBYRkFfUkVTT0xWRU5PREVfU2libGluZ3MgfA0KKyAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMgfA0KKyAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX0F0dHJpYnV0ZXM7DQorICBDWEZBX05vZGUqIHBSZWZOb2RlID0gKENYRkFfTm9kZSopbHBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCk7DQorICBpZiAobHBPcmdpbmFsTm9kZS0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX1ZhcmlhYmxlc1RoaXMpIHsNCisgICAgcFJlZk5vZGUgPSAoQ1hGQV9Ob2RlKilscEN1ck5vZGU7DQorICB9DQorICBpZiAobHBTY3JpcHRDb250ZXh0LT5RdWVyeU5vZGVCeUZsYWcocFJlZk5vZGUsIHdzUHJvcE5hbWUsIGhWYWx1ZSwgZHdGbGFnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChscE9yZ2luYWxOb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfVmFyaWFibGVzVGhpcykgew0KKyAgICBpZiAoRlhKU0VfVmFsdWVfSXNVbmRlZmluZWQoaFZhbHVlKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE9iamVjdE93blByb3AoaE9iamVjdCwgc3pQcm9wTmFtZSwgaFZhbHVlKTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgIH0NCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gcERvYy0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+U2V0R2xvYmFsUHJvcGVydHkocE5vdGlmeS0+R2V0SERPQygpLCBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFZhbHVlKTsNCit9DQorRlhfQk9PTCBDWEZBX1NjcmlwdENvbnRleHQ6OlF1ZXJ5Tm9kZUJ5RmxhZyhDWEZBX05vZGUqIHJlZk5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHByb3BuYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcpIHsNCisgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvbHZlUnM7DQorICBpbnQzMl90IGlSZXQgPSBSZXNvbHZlT2JqZWN0cyhyZWZOb2RlLCBwcm9wbmFtZSwgcmVzb2x2ZVJzLCBkd0ZsYWcpOw0KKyAgRlhfQk9PTCBiUmVzdWx0ID0gRkFMU0U7DQorICBpZiAoaVJldCA+IDApIHsNCisgICAgYlJlc3VsdCA9IFRSVUU7DQorICAgIGlmIChyZXNvbHZlUnMuZHdGbGFncyA9PSBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfTm9kZXMpIHsNCisgICAgICBGWEpTRV9IVkFMVUUgcFZhbHVlID0gR2V0SlNWYWx1ZUZyb21NYXAocmVzb2x2ZVJzLm5vZGVzWzBdKTsNCisgICAgICBGWEpTRV9WYWx1ZV9TZXQoaFZhbHVlLCBwVmFsdWUpOw0KKyAgICB9IGVsc2UgaWYgKHJlc29sdmVScy5kd0ZsYWdzID09IFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9BdHRyaWJ1dGUpIHsNCisgICAgICBYRkFfTFBDU0NSSVBUQVRUUklCVVRFSU5GTyBscEF0dHJpYnV0ZUluZm8gPSByZXNvbHZlUnMucFNjcmlwdEF0dHJpYnV0ZTsNCisgICAgICBpZiAobHBBdHRyaWJ1dGVJbmZvKSB7DQorICAgICAgICAocmVzb2x2ZVJzLm5vZGVzWzBdLT4qKGxwQXR0cmlidXRlSW5mby0+bHBmbkNhbGxiYWNrKSkoDQorICAgICAgICAgICAgaFZhbHVlLCBiU2V0dGluZywgKFhGQV9BVFRSSUJVVEUpbHBBdHRyaWJ1dGVJbmZvLT5lQXR0cmlidXRlKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIHJldHVybiBiUmVzdWx0Ow0KK30NCit2b2lkIENYRkFfU2NyaXB0Q29udGV4dDo6R2xvYmFsUHJvcGVydHlHZXR0ZXIoRlhKU0VfSE9CSkVDVCBoT2JqZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsNCisgIENYRkFfT2JqZWN0KiBwT3JnaW5hbE9iamVjdCA9DQorICAgICAgKENYRkFfT2JqZWN0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoT2JqZWN0LCBOVUxMKTsNCisgIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBwT3JnaW5hbE9iamVjdC0+R2V0RG9jdW1lbnQoKTsNCisgIENYRkFfU2NyaXB0Q29udGV4dCogbHBTY3JpcHRDb250ZXh0ID0NCisgICAgICAoQ1hGQV9TY3JpcHRDb250ZXh0KilwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICBDWEZBX09iamVjdCogbHBDdXJOb2RlID0gbHBTY3JpcHRDb250ZXh0LT5HZXRWYXJpYWJsZXNUaGlzKHBPcmdpbmFsT2JqZWN0KTsNCisgIENGWF9XaWRlU3RyaW5nIHdzUHJvcE5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoDQorICAgICAgKGNvbnN0IEZYX0NIQVIqKXN6UHJvcE5hbWUuR2V0UHRyKCksIHN6UHJvcE5hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgaWYgKGxwU2NyaXB0Q29udGV4dC0+R2V0VHlwZSgpID09IFhGQV9TQ1JJUFRMQU5HVFlQRV9Gb3JtY2FsYykgew0KKyAgICBpZiAoc3pQcm9wTmFtZSA9PSBGT1hJVF9YRkFfRk0ySlNfRk9STUNBTENfUlVOVElNRSkgew0KKyAgICAgIFhGQV9GTTJKU19HbG9iYWxQcm9wZXJ0eUdldHRlcihscFNjcmlwdENvbnRleHQtPm1faEZNMkpTQ29udGV4dCwgaFZhbHVlKTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgdWludDMyX3QgdUhhc2hDb2RlID0NCisgICAgICAgIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHdzUHJvcE5hbWUsIHdzUHJvcE5hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgICBpZiAodUhhc2hDb2RlICE9IFhGQV9IQVNIQ09ERV9MYXlvdXQpIHsNCisgICAgICBDWEZBX09iamVjdCogcE9iamVjdCA9DQorICAgICAgICAgIGxwU2NyaXB0Q29udGV4dC0+R2V0RG9jdW1lbnQoKS0+R2V0WEZBTm9kZSh1SGFzaENvZGUpOw0KKyAgICAgIGlmIChwT2JqZWN0KSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXQoaFZhbHVlLCBscFNjcmlwdENvbnRleHQtPkdldEpTVmFsdWVGcm9tTWFwKHBPYmplY3QpKTsNCisgICAgICAgIHJldHVybjsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIEZYX0RXT1JEIGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzIHwNCisgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzOw0KKyAgQ1hGQV9Ob2RlKiBwUmVmTm9kZSA9IChDWEZBX05vZGUqKWxwU2NyaXB0Q29udGV4dC0+R2V0VGhpc09iamVjdCgpOw0KKyAgaWYgKHBPcmdpbmFsT2JqZWN0LT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09CSkVDVFRZUEVfVmFyaWFibGVzVGhpcykgew0KKyAgICBwUmVmTm9kZSA9IChDWEZBX05vZGUqKWxwQ3VyTm9kZTsNCisgIH0NCisgIGlmIChscFNjcmlwdENvbnRleHQtPlF1ZXJ5Tm9kZUJ5RmxhZyhwUmVmTm9kZSwgd3NQcm9wTmFtZSwgaFZhbHVlLCBkd0ZsYWcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfCBYRkFfUkVTT0xWRU5PREVfU2libGluZ3M7DQorICBpZiAobHBTY3JpcHRDb250ZXh0LT5RdWVyeU5vZGVCeUZsYWcocFJlZk5vZGUsIHdzUHJvcE5hbWUsIGhWYWx1ZSwgZHdGbGFnLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX09iamVjdCogcFNjcmlwdE9iamVjdCA9DQorICAgICAgbHBTY3JpcHRDb250ZXh0LT5HZXRWYXJpYWJsZXNUaGlzKHBPcmdpbmFsT2JqZWN0LCBUUlVFKTsNCisgIGlmIChwU2NyaXB0T2JqZWN0ICYmDQorICAgICAgbHBTY3JpcHRDb250ZXh0LT5RdWVyeVZhcmlhYmxlSFZhbHVlKChDWEZBX05vZGUqKXBTY3JpcHRPYmplY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6UHJvcE5hbWUsIGhWYWx1ZSwgVFJVRSkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKGxwU2NyaXB0Q29udGV4dC0+UXVlcnlCdWlsdGluSFZhbHVlKHN6UHJvcE5hbWUsIGhWYWx1ZSkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBwRG9jLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5HZXRHbG9iYWxQcm9wZXJ0eShwTm90aWZ5LT5HZXRIRE9DKCksIHN6UHJvcE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVmFsdWUpOw0KK30NCit2b2lkIENYRkFfU2NyaXB0Q29udGV4dDo6Tm9ybWFsUHJvcGVydHlHZXR0ZXIoRlhKU0VfSE9CSkVDVCBoT2JqZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsNCisgIENYRkFfT2JqZWN0KiBwT3JnaW5hbE9iamVjdCA9DQorICAgICAgKENYRkFfT2JqZWN0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoT2JqZWN0LCBOVUxMKTsNCisgIGlmIChwT3JnaW5hbE9iamVjdCA9PSBOVUxMKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVuZGVmaW5lZChoVmFsdWUpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfV2lkZVN0cmluZyB3c1Byb3BOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KA0KKyAgICAgIChjb25zdCBGWF9DSEFSKilzelByb3BOYW1lLkdldFB0cigpLCBzelByb3BOYW1lLkdldExlbmd0aCgpKTsNCisgIENYRkFfU2NyaXB0Q29udGV4dCogbHBTY3JpcHRDb250ZXh0ID0NCisgICAgICAoQ1hGQV9TY3JpcHRDb250ZXh0KilwT3JnaW5hbE9iamVjdC0+R2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgQ1hGQV9PYmplY3QqIHBPYmplY3QgPSBscFNjcmlwdENvbnRleHQtPkdldFZhcmlhYmxlc1RoaXMocE9yZ2luYWxPYmplY3QpOw0KKyAgaWYgKHdzUHJvcE5hbWUgPT0gRlhfV1NUUkMoTCJ4ZmEiKSkgew0KKyAgICBGWEpTRV9IVkFMVUUgcFZhbHVlID0gbHBTY3JpcHRDb250ZXh0LT5HZXRKU1ZhbHVlRnJvbU1hcCgNCisgICAgICAgIGxwU2NyaXB0Q29udGV4dC0+R2V0RG9jdW1lbnQoKS0+R2V0Um9vdCgpKTsNCisgICAgRlhKU0VfVmFsdWVfU2V0KGhWYWx1ZSwgcFZhbHVlKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgRlhfRFdPUkQgZHdGbGFnID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMgfA0KKyAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX0F0dHJpYnV0ZXM7DQorICBGWF9CT09MIGJSZXQgPSBscFNjcmlwdENvbnRleHQtPlF1ZXJ5Tm9kZUJ5RmxhZygNCisgICAgICAoQ1hGQV9Ob2RlKilwT2JqZWN0LCB3c1Byb3BOYW1lLCBoVmFsdWUsIGR3RmxhZywgRkFMU0UpOw0KKyAgaWYgKGJSZXQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKHBPYmplY3QgPT0gbHBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCkgfHwNCisgICAgICAobHBTY3JpcHRDb250ZXh0LT5HZXRUeXBlKCkgPT0gWEZBX1NDUklQVExBTkdUWVBFX0phdmFzY3JpcHQgJiYNCisgICAgICAgIWxwU2NyaXB0Q29udGV4dC0+SXNTdHJpY3RTY29wZUluSmF2YVNjcmlwdCgpKSkgew0KKyAgICBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzOw0KKyAgICBiUmV0ID0gbHBTY3JpcHRDb250ZXh0LT5RdWVyeU5vZGVCeUZsYWcoKENYRkFfTm9kZSopcE9iamVjdCwgd3NQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhWYWx1ZSwgZHdGbGFnLCBGQUxTRSk7DQorICB9DQorICBpZiAoYlJldCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX09iamVjdCogcFNjcmlwdE9iamVjdCA9DQorICAgICAgbHBTY3JpcHRDb250ZXh0LT5HZXRWYXJpYWJsZXNUaGlzKHBPcmdpbmFsT2JqZWN0LCBUUlVFKTsNCisgIGlmIChwU2NyaXB0T2JqZWN0KSB7DQorICAgIGJSZXQgPSBscFNjcmlwdENvbnRleHQtPlF1ZXJ5VmFyaWFibGVIVmFsdWUoKENYRkFfTm9kZSopcFNjcmlwdE9iamVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzelByb3BOYW1lLCBoVmFsdWUsIFRSVUUpOw0KKyAgfQ0KKyAgaWYgKCFiUmV0KSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldFVuZGVmaW5lZChoVmFsdWUpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfU2NyaXB0Q29udGV4dDo6Tm9ybWFsUHJvcGVydHlTZXR0ZXIoRlhKU0VfSE9CSkVDVCBoT2JqZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsNCisgIENYRkFfT2JqZWN0KiBwT3JnaW5hbE9iamVjdCA9DQorICAgICAgKENYRkFfT2JqZWN0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoT2JqZWN0LCBOVUxMKTsNCisgIGlmIChwT3JnaW5hbE9iamVjdCA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfU2NyaXB0Q29udGV4dCogbHBTY3JpcHRDb250ZXh0ID0NCisgICAgICAoQ1hGQV9TY3JpcHRDb250ZXh0KilwT3JnaW5hbE9iamVjdC0+R2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgQ1hGQV9PYmplY3QqIHBPYmplY3QgPSBscFNjcmlwdENvbnRleHQtPkdldFZhcmlhYmxlc1RoaXMocE9yZ2luYWxPYmplY3QpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NQcm9wTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOCgNCisgICAgICAoY29uc3QgRlhfQ0hBUiopc3pQcm9wTmFtZS5HZXRQdHIoKSwgc3pQcm9wTmFtZS5HZXRMZW5ndGgoKSk7DQorICBYRkFfTFBDU0NSSVBUQVRUUklCVVRFSU5GTyBscEF0dHJpYnV0ZUluZm8gPQ0KKyAgICAgIFhGQV9HZXRTY3JpcHRBdHRyaWJ1dGVCeU5hbWUocE9iamVjdC0+R2V0Q2xhc3NJRCgpLCB3c1Byb3BOYW1lKTsNCisgIGlmIChscEF0dHJpYnV0ZUluZm8pIHsNCisgICAgKHBPYmplY3QtPioobHBBdHRyaWJ1dGVJbmZvLT5scGZuQ2FsbGJhY2spKSgNCisgICAgICAgIGhWYWx1ZSwgVFJVRSwgKFhGQV9BVFRSSUJVVEUpbHBBdHRyaWJ1dGVJbmZvLT5lQXR0cmlidXRlKTsNCisgIH0gZWxzZSB7DQorICAgIGlmIChwT2JqZWN0LT5Jc05vZGUoKSkgew0KKyAgICAgIGlmICh3c1Byb3BOYW1lLkdldEF0KDApID09ICcjJykgew0KKyAgICAgICAgd3NQcm9wTmFtZSA9IHdzUHJvcE5hbWUuUmlnaHQod3NQcm9wTmFtZS5HZXRMZW5ndGgoKSAtIDEpOw0KKyAgICAgIH0NCisgICAgICBDWEZBX05vZGUqIHBOb2RlID0gKENYRkFfTm9kZSopcE9iamVjdDsNCisgICAgICBDWEZBX05vZGUqIHBQcm9wT3JDaGlsZCA9IE5VTEw7DQorICAgICAgWEZBX0xQQ0VMRU1FTlRJTkZPIGxwRWxlbWVudEluZm8gPSBYRkFfR2V0RWxlbWVudEJ5TmFtZSh3c1Byb3BOYW1lKTsNCisgICAgICBpZiAobHBFbGVtZW50SW5mbykgew0KKyAgICAgICAgcFByb3BPckNoaWxkID0gcE5vZGUtPkdldFByb3BlcnR5KDAsIGxwRWxlbWVudEluZm8tPmVOYW1lKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgcFByb3BPckNoaWxkID0gcE5vZGUtPkdldEZpcnN0Q2hpbGRCeU5hbWUod3NQcm9wTmFtZSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChwUHJvcE9yQ2hpbGQpIHsNCisgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGVmYXVsdE5hbWUgPSBGWF9XU1RSQyhMIntkZWZhdWx0fSIpOw0KKyAgICAgICAgWEZBX0xQQ1NDUklQVEFUVFJJQlVURUlORk8gbHBBdHRyaWJ1dGVJbmZvID0NCisgICAgICAgICAgICBYRkFfR2V0U2NyaXB0QXR0cmlidXRlQnlOYW1lKHBQcm9wT3JDaGlsZC0+R2V0Q2xhc3NJRCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NEZWZhdWx0TmFtZSk7DQorICAgICAgICBpZiAobHBBdHRyaWJ1dGVJbmZvKSB7DQorICAgICAgICAgIChwUHJvcE9yQ2hpbGQtPioobHBBdHRyaWJ1dGVJbmZvLT5scGZuQ2FsbGJhY2spKSgNCisgICAgICAgICAgICAgIGhWYWx1ZSwgVFJVRSwgKFhGQV9BVFRSSUJVVEUpbHBBdHRyaWJ1dGVJbmZvLT5lQXR0cmlidXRlKTsNCisgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBDWEZBX09iamVjdCogcFNjcmlwdE9iamVjdCA9DQorICAgICAgICBscFNjcmlwdENvbnRleHQtPkdldFZhcmlhYmxlc1RoaXMocE9yZ2luYWxPYmplY3QsIFRSVUUpOw0KKyAgICBpZiAocFNjcmlwdE9iamVjdCkgew0KKyAgICAgIGxwU2NyaXB0Q29udGV4dC0+UXVlcnlWYXJpYWJsZUhWYWx1ZSgoQ1hGQV9Ob2RlKilwU2NyaXB0T2JqZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzelByb3BOYW1lLCBoVmFsdWUsIEZBTFNFKTsNCisgICAgfQ0KKyAgfQ0KK30NCitpbnQzMl90IENYRkFfU2NyaXB0Q29udGV4dDo6Tm9ybWFsUHJvcFR5cGVHZXR0ZXIoDQorICAgIEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwNCisgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICBGWF9CT09MIGJRdWVyeUluKSB7DQorICBDWEZBX09iamVjdCogcE9iamVjdCA9IChDWEZBX09iamVjdCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaE9iamVjdCwgTlVMTCk7DQorICBpZiAocE9iamVjdCA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGWEpTRV9DbGFzc1Byb3BUeXBlX05vbmU7DQorICB9DQorICBDWEZBX1NjcmlwdENvbnRleHQqIGxwU2NyaXB0Q29udGV4dCA9DQorICAgICAgKENYRkFfU2NyaXB0Q29udGV4dCopcE9iamVjdC0+R2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpOw0KKyAgcE9iamVjdCA9IGxwU2NyaXB0Q29udGV4dC0+R2V0VmFyaWFibGVzVGhpcyhwT2JqZWN0KTsNCisgIFhGQV9FTEVNRU5UIG9iakVsZW1lbnQgPSBwT2JqZWN0LT5HZXRDbGFzc0lEKCk7DQorICBDRlhfV2lkZVN0cmluZyB3c1Byb3BOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KA0KKyAgICAgIChjb25zdCBGWF9DSEFSKilzelByb3BOYW1lLkdldFB0cigpLCBzelByb3BOYW1lLkdldExlbmd0aCgpKTsNCisgIGlmIChYRkFfR2V0TWV0aG9kQnlOYW1lKG9iakVsZW1lbnQsIHdzUHJvcE5hbWUpKSB7DQorICAgIHJldHVybiBGWEpTRV9DbGFzc1Byb3BUeXBlX01ldGhvZDsNCisgIH0NCisgIGlmIChiUXVlcnlJbiAmJiAhWEZBX0dldFNjcmlwdEF0dHJpYnV0ZUJ5TmFtZShvYmpFbGVtZW50LCB3c1Byb3BOYW1lKSkgew0KKyAgICByZXR1cm4gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Ob25lOw0KKyAgfQ0KKyAgcmV0dXJuIEZYSlNFX0NsYXNzUHJvcFR5cGVfUHJvcGVydHk7DQorfQ0KK2ludDMyX3QgQ1hGQV9TY3JpcHRDb250ZXh0OjpHbG9iYWxQcm9wVHlwZUdldHRlcigNCisgICAgRlhKU0VfSE9CSkVDVCBoT2JqZWN0LA0KKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsDQorICAgIEZYX0JPT0wgYlF1ZXJ5SW4pIHsNCisgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gKENYRkFfT2JqZWN0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoT2JqZWN0LCBOVUxMKTsNCisgIGlmIChwT2JqZWN0ID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZYSlNFX0NsYXNzUHJvcFR5cGVfTm9uZTsNCisgIH0NCisgIENYRkFfU2NyaXB0Q29udGV4dCogbHBTY3JpcHRDb250ZXh0ID0NCisgICAgICAoQ1hGQV9TY3JpcHRDb250ZXh0KilwT2JqZWN0LT5HZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICBwT2JqZWN0ID0gbHBTY3JpcHRDb250ZXh0LT5HZXRWYXJpYWJsZXNUaGlzKHBPYmplY3QpOw0KKyAgWEZBX0VMRU1FTlQgb2JqRWxlbWVudCA9IHBPYmplY3QtPkdldENsYXNzSUQoKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzUHJvcE5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoDQorICAgICAgKGNvbnN0IEZYX0NIQVIqKXN6UHJvcE5hbWUuR2V0UHRyKCksIHN6UHJvcE5hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgaWYgKFhGQV9HZXRNZXRob2RCeU5hbWUob2JqRWxlbWVudCwgd3NQcm9wTmFtZSkpIHsNCisgICAgcmV0dXJuIEZYSlNFX0NsYXNzUHJvcFR5cGVfTWV0aG9kOw0KKyAgfQ0KKyAgcmV0dXJuIEZYSlNFX0NsYXNzUHJvcFR5cGVfUHJvcGVydHk7DQorfQ0KK3ZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpOb3JtYWxNZXRob2RDYWxsKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsNCisgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gKENYRkFfT2JqZWN0KilGWEpTRV9WYWx1ZV9Ub09iamVjdChoVGhpcywgTlVMTCk7DQorICBpZiAocE9iamVjdCA9PSBOVUxMKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfU2NyaXB0Q29udGV4dCogbHBTY3JpcHRDb250ZXh0ID0NCisgICAgICAoQ1hGQV9TY3JpcHRDb250ZXh0KilwT2JqZWN0LT5HZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCk7DQorICBwT2JqZWN0ID0gbHBTY3JpcHRDb250ZXh0LT5HZXRWYXJpYWJsZXNUaGlzKHBPYmplY3QpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NGdW5OYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KA0KKyAgICAgIChjb25zdCBGWF9DSEFSKilzekZ1bmNOYW1lLkdldFB0cigpLCBzekZ1bmNOYW1lLkdldExlbmd0aCgpKTsNCisgIFhGQV9MUENNRVRIT0RJTkZPIGxwTWV0aG9kSW5mbyA9DQorICAgICAgWEZBX0dldE1ldGhvZEJ5TmFtZShwT2JqZWN0LT5HZXRDbGFzc0lEKCksIHdzRnVuTmFtZSk7DQorICBpZiAoTlVMTCA9PSBscE1ldGhvZEluZm8pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgKHBPYmplY3QtPioobHBNZXRob2RJbmZvLT5scGZuQ2FsbGJhY2spKSgmYXJncyk7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9TY3JpcHRDb250ZXh0OjpJc1N0cmljdFNjb3BlSW5KYXZhU2NyaXB0KCkgew0KKyAgcmV0dXJuIG1fcERvY3VtZW50LT5IYXNGbGFnKFhGQV9ET0NGTEFHX1N0cmljdFNjb3BpbmcpOw0KK30NCitYRkFfU0NSSVBUTEFOR1RZUEUgQ1hGQV9TY3JpcHRDb250ZXh0OjpHZXRUeXBlKCkgew0KKyAgcmV0dXJuIG1fZVNjcmlwdFR5cGU7DQorfQ0KK3ZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpEZWZpbmVKc0NvbnRleHQoKSB7DQorICBtX0pzR2xvYmFsQ2xhc3MuY29uc3RydWN0b3IgPSBOVUxMOw0KKyAgbV9Kc0dsb2JhbENsYXNzLm5hbWUgPSAiUm9vdCI7DQorICBtX0pzR2xvYmFsQ2xhc3MucHJvcE51bSA9IDA7DQorICBtX0pzR2xvYmFsQ2xhc3MucHJvcGVydGllcyA9IE5VTEw7DQorICBtX0pzR2xvYmFsQ2xhc3MubWV0aE51bSA9IDA7DQorICBtX0pzR2xvYmFsQ2xhc3MubWV0aG9kcyA9IE5VTEw7DQorICBtX0pzR2xvYmFsQ2xhc3MuZHluUHJvcEdldHRlciA9IENYRkFfU2NyaXB0Q29udGV4dDo6R2xvYmFsUHJvcGVydHlHZXR0ZXI7DQorICBtX0pzR2xvYmFsQ2xhc3MuZHluUHJvcFNldHRlciA9IENYRkFfU2NyaXB0Q29udGV4dDo6R2xvYmFsUHJvcGVydHlTZXR0ZXI7DQorICBtX0pzR2xvYmFsQ2xhc3MuZHluUHJvcFR5cGVHZXR0ZXIgPSBDWEZBX1NjcmlwdENvbnRleHQ6Okdsb2JhbFByb3BUeXBlR2V0dGVyOw0KKyAgbV9Kc0dsb2JhbENsYXNzLmR5blByb3BEZWxldGVyID0gTlVMTDsNCisgIG1fSnNHbG9iYWxDbGFzcy5keW5NZXRob2RDYWxsID0gQ1hGQV9TY3JpcHRDb250ZXh0OjpOb3JtYWxNZXRob2RDYWxsOw0KKyAgbV9oSnNDb250ZXh0ID0gRlhKU0VfQ29udGV4dF9DcmVhdGUobV9oSnNSdW50aW1lLCAmbV9Kc0dsb2JhbENsYXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFJvb3QoKSk7DQorICBGWEpTRV9Db250ZXh0X0VuYWJsZUNvbXBhdGlibGVNb2RlKA0KKyAgICAgIG1faEpzQ29udGV4dCwgRlhKU0VfQ09NUEFUSUJMRU1PREVGTEFHX0NPTlNUUlVDVE9SRVhUUkFNRVRIT0RTKTsNCit9DQorRlhKU0VfSENPTlRFWFQgQ1hGQV9TY3JpcHRDb250ZXh0OjpDcmVhdGVWYXJpYWJsZXNDb250ZXh0KA0KKyAgICBDWEZBX05vZGUqIHBTY3JpcHROb2RlLA0KKyAgICBDWEZBX05vZGUqIHBTdWJmb3JtKSB7DQorICBpZiAocFNjcmlwdE5vZGUgPT0gTlVMTCB8fCBwU3ViZm9ybSA9PSBOVUxMKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaWYgKG1fbWFwVmFyaWFibGVUb0hWYWx1ZS5HZXRDb3VudCgpID09IDApIHsNCisgICAgbV9Kc0dsb2JhbFZhcmlhYmxlc0NsYXNzLmNvbnN0cnVjdG9yID0gTlVMTDsNCisgICAgbV9Kc0dsb2JhbFZhcmlhYmxlc0NsYXNzLm5hbWUgPSAiWEZBU2NyaXB0T2JqZWN0IjsNCisgICAgbV9Kc0dsb2JhbFZhcmlhYmxlc0NsYXNzLnByb3BOdW0gPSAwOw0KKyAgICBtX0pzR2xvYmFsVmFyaWFibGVzQ2xhc3MucHJvcGVydGllcyA9IE5VTEw7DQorICAgIG1fSnNHbG9iYWxWYXJpYWJsZXNDbGFzcy5tZXRoTnVtID0gMDsNCisgICAgbV9Kc0dsb2JhbFZhcmlhYmxlc0NsYXNzLm1ldGhvZHMgPSBOVUxMOw0KKyAgICBtX0pzR2xvYmFsVmFyaWFibGVzQ2xhc3MuZHluUHJvcEdldHRlciA9DQorICAgICAgICBDWEZBX1NjcmlwdENvbnRleHQ6Okdsb2JhbFByb3BlcnR5R2V0dGVyOw0KKyAgICBtX0pzR2xvYmFsVmFyaWFibGVzQ2xhc3MuZHluUHJvcFNldHRlciA9DQorICAgICAgICBDWEZBX1NjcmlwdENvbnRleHQ6Okdsb2JhbFByb3BlcnR5U2V0dGVyOw0KKyAgICBtX0pzR2xvYmFsVmFyaWFibGVzQ2xhc3MuZHluUHJvcFR5cGVHZXR0ZXIgPQ0KKyAgICAgICAgQ1hGQV9TY3JpcHRDb250ZXh0OjpOb3JtYWxQcm9wVHlwZUdldHRlcjsNCisgICAgbV9Kc0dsb2JhbFZhcmlhYmxlc0NsYXNzLmR5blByb3BEZWxldGVyID0gTlVMTDsNCisgICAgbV9Kc0dsb2JhbFZhcmlhYmxlc0NsYXNzLmR5bk1ldGhvZENhbGwgPQ0KKyAgICAgICAgQ1hGQV9TY3JpcHRDb250ZXh0OjpOb3JtYWxNZXRob2RDYWxsOw0KKyAgfQ0KKyAgQ1hGQV9UaGlzUHJveHkqIGxwVmFyaWFibGVOb2RlID0gbmV3IENYRkFfVGhpc1Byb3h5KHBTdWJmb3JtLCBwU2NyaXB0Tm9kZSk7DQorICBGWEpTRV9IQ09OVEVYVCBoVmFyaWFibGVzQ29udGV4dCA9IEZYSlNFX0NvbnRleHRfQ3JlYXRlKA0KKyAgICAgIG1faEpzUnVudGltZSwgJm1fSnNHbG9iYWxWYXJpYWJsZXNDbGFzcywgKENYRkFfT2JqZWN0KilscFZhcmlhYmxlTm9kZSk7DQorICBGWEpTRV9Db250ZXh0X0VuYWJsZUNvbXBhdGlibGVNb2RlKA0KKyAgICAgIGhWYXJpYWJsZXNDb250ZXh0LCBGWEpTRV9DT01QQVRJQkxFTU9ERUZMQUdfQ09OU1RSVUNUT1JFWFRSQU1FVEhPRFMpOw0KKyAgbV9tYXBWYXJpYWJsZVRvSFZhbHVlLlNldEF0KHBTY3JpcHROb2RlLCBoVmFyaWFibGVzQ29udGV4dCk7DQorICByZXR1cm4gaFZhcmlhYmxlc0NvbnRleHQ7DQorfQ0KK0NYRkFfT2JqZWN0KiBDWEZBX1NjcmlwdENvbnRleHQ6OkdldFZhcmlhYmxlc1RoaXMoQ1hGQV9PYmplY3QqIHBPYmplY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJTY3JpcHROb2RlKSB7DQorICBpZiAocE9iamVjdC0+R2V0T2JqZWN0VHlwZSgpID09IFhGQV9PQkpFQ1RUWVBFX1ZhcmlhYmxlc1RoaXMpIHsNCisgICAgcmV0dXJuIGJTY3JpcHROb2RlID8gKChDWEZBX1RoaXNQcm94eSopcE9iamVjdCktPkdldFNjcmlwdE5vZGUoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgOiAoKENYRkFfVGhpc1Byb3h5KilwT2JqZWN0KS0+R2V0VGhpc05vZGUoKTsNCisgIH0NCisgIHJldHVybiBwT2JqZWN0Ow0KK30NCitGWF9CT09MIENYRkFfU2NyaXB0Q29udGV4dDo6UnVuVmFyaWFibGVzU2NyaXB0KENYRkFfTm9kZSogcFNjcmlwdE5vZGUpIHsNCisgIGlmIChwU2NyaXB0Tm9kZSA9PSBOVUxMKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmIChwU2NyaXB0Tm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1NjcmlwdCkgew0KKyAgICBDWEZBX05vZGUqIHBQYXJlbnQgPSBwU2NyaXB0Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7DQorICAgIGlmICghcFBhcmVudCB8fCBwUGFyZW50LT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfVmFyaWFibGVzKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIGlmIChtX21hcFZhcmlhYmxlVG9IVmFsdWUuR2V0VmFsdWVBdChwU2NyaXB0Tm9kZSkpIHsNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgfQ0KKyAgICBDWEZBX05vZGUqIHBUZXh0Tm9kZSA9IHBTY3JpcHROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICAgIGlmICghcFRleHROb2RlKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c1NjcmlwdDsNCisgICAgaWYgKCFwVGV4dE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzU2NyaXB0KSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDRlhfQnl0ZVN0cmluZyBidFNjcmlwdCA9DQorICAgICAgICBGWF9VVEY4RW5jb2RlKHdzU2NyaXB0LkdldFB0cigpLCB3c1NjcmlwdC5HZXRMZW5ndGgoKSk7DQorICAgIEZYSlNFX0hWQUxVRSBoUmV0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUobV9oSnNSdW50aW1lKTsNCisgICAgQ1hGQV9Ob2RlKiBwVGhpc09iamVjdCA9IHBQYXJlbnQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOw0KKyAgICBGWEpTRV9IQ09OVEVYVCBoVmFyaWFibGVzQ29udGV4dCA9DQorICAgICAgICBDcmVhdGVWYXJpYWJsZXNDb250ZXh0KHBTY3JpcHROb2RlLCBwVGhpc09iamVjdCk7DQorICAgIENYRkFfT2JqZWN0KiBwT3JpZ2luYWxPYmplY3QgPSBtX3BUaGlzT2JqZWN0Ow0KKyAgICBtX3BUaGlzT2JqZWN0ID0gcFRoaXNPYmplY3Q7DQorICAgIEZYX0JPT0wgYlJldCA9IEZYSlNFX0V4ZWN1dGVTY3JpcHQoaFZhcmlhYmxlc0NvbnRleHQsIGJ0U2NyaXB0LCBoUmV0VmFsdWUpOw0KKyAgICBtX3BUaGlzT2JqZWN0ID0gcE9yaWdpbmFsT2JqZWN0Ow0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhSZXRWYWx1ZSk7DQorICAgIHJldHVybiBiUmV0Ow0KKyAgfQ0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9TY3JpcHRDb250ZXh0OjpRdWVyeVZhcmlhYmxlSFZhbHVlKA0KKyAgICBDWEZBX05vZGUqIHBTY3JpcHROb2RlLA0KKyAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsDQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgIEZYX0JPT0wgYkdldHRlcikgew0KKyAgaWYgKHBTY3JpcHROb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfU2NyaXB0KSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIENYRkFfTm9kZSogdmFyaWFibGVzTm9kZSA9IHBTY3JpcHROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgIGlmICghdmFyaWFibGVzTm9kZSB8fCB2YXJpYWJsZXNOb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfVmFyaWFibGVzKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIEZYX0JPT0wgYlJlcyA9IEZBTFNFOw0KKyAgdm9pZCogbHBWYXJpYWJsZXMgPSBtX21hcFZhcmlhYmxlVG9IVmFsdWUuR2V0VmFsdWVBdChwU2NyaXB0Tm9kZSk7DQorICBpZiAobHBWYXJpYWJsZXMpIHsNCisgICAgRlhKU0VfSENPTlRFWFQgaFZhcmlhYmxlQ29udGV4dCA9IChGWEpTRV9IQ09OVEVYVClscFZhcmlhYmxlczsNCisgICAgRlhKU0VfSFZBTFVFIGhPYmplY3QgPSBGWEpTRV9Db250ZXh0X0dldEdsb2JhbE9iamVjdChoVmFyaWFibGVDb250ZXh0KTsNCisgICAgRlhKU0VfSFZBTFVFIGhWYXJpYWJsZVZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKG1faEpzUnVudGltZSk7DQorICAgIGlmICghYkdldHRlcikgew0KKyAgICAgIEZYSlNFX1ZhbHVlX1NldE9iamVjdE93blByb3AoaE9iamVjdCwgc3pQcm9wTmFtZSwgaFZhbHVlKTsNCisgICAgICBiUmVzID0gVFJVRTsNCisgICAgfSBlbHNlIGlmIChGWEpTRV9WYWx1ZV9PYmplY3RIYXNPd25Qcm9wKGhPYmplY3QsIHN6UHJvcE5hbWUsIEZBTFNFKSkgew0KKyAgICAgIEZYSlNFX1ZhbHVlX0dldE9iamVjdFByb3AoaE9iamVjdCwgc3pQcm9wTmFtZSwgaFZhcmlhYmxlVmFsdWUpOw0KKyAgICAgIGlmIChGWEpTRV9WYWx1ZV9Jc0Z1bmN0aW9uKGhWYXJpYWJsZVZhbHVlKSkgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0RnVuY3Rpb25CaW5kKGhWYWx1ZSwgaFZhcmlhYmxlVmFsdWUsIGhPYmplY3QpOw0KKyAgICAgIH0gZWxzZSBpZiAoYkdldHRlcikgew0KKyAgICAgICAgRlhKU0VfVmFsdWVfU2V0KGhWYWx1ZSwgaFZhcmlhYmxlVmFsdWUpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBGWEpTRV9WYWx1ZV9TZXQoaFZhcmlhYmxlVmFsdWUsIGhWYWx1ZSk7DQorICAgICAgfQ0KKyAgICAgIGJSZXMgPSBUUlVFOw0KKyAgICB9DQorICAgIEZYSlNFX1ZhbHVlX1JlbGVhc2UoaFZhcmlhYmxlVmFsdWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhPYmplY3QpOw0KKyAgfQ0KKyAgcmV0dXJuIGJSZXM7DQorfQ0KK0ZYX0JPT0wgQ1hGQV9TY3JpcHRDb250ZXh0OjpRdWVyeUJ1aWx0aW5IVmFsdWUoDQorICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSkgew0KKyAgdm9pZCogcEJ1aWx0aW4gPSBOVUxMOw0KKyAgaWYgKChtX2R3QnVpbHRJbkluRmxhZ3MgJiBYRkFfSlNCVUlMVElOX0hhc0NvdW50KSAmJg0KKyAgICAgIG1fSlNCdWlsdEluT2JqZWN0cy5Mb29rdXAoc3pQcm9wTmFtZSwgcEJ1aWx0aW4pKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldChoVmFsdWUsIChGWEpTRV9IVkFMVUUpcEJ1aWx0aW4pOw0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQordm9pZCBDWEZBX1NjcmlwdENvbnRleHQ6OlJlbGVhc2VWYXJpYWJsZXNNYXAoKSB7DQorICBGWF9QT1NJVElPTiBwcyA9IG1fbWFwVmFyaWFibGVUb0hWYWx1ZS5HZXRTdGFydFBvc2l0aW9uKCk7DQorICB3aGlsZSAocHMpIHsNCisgICAgQ1hGQV9PYmplY3QqIHBTY3JpcHROb2RlOw0KKyAgICBGWEpTRV9IQ09OVEVYVCBoVmFyaWFibGVDb250ZXh0Ow0KKyAgICBtX21hcFZhcmlhYmxlVG9IVmFsdWUuR2V0TmV4dEFzc29jKHBzLCBwU2NyaXB0Tm9kZSwgaFZhcmlhYmxlQ29udGV4dCk7DQorICAgIEZYSlNFX0hWQUxVRSBoT2JqZWN0ID0gRlhKU0VfQ29udGV4dF9HZXRHbG9iYWxPYmplY3QoaFZhcmlhYmxlQ29udGV4dCk7DQorICAgIENYRkFfT2JqZWN0KiBscEN1ck5vZGUgPSAoQ1hGQV9PYmplY3QqKUZYSlNFX1ZhbHVlX1RvT2JqZWN0KGhPYmplY3QsIE5VTEwpOw0KKyAgICBpZiAobHBDdXJOb2RlKSB7DQorICAgICAgZGVsZXRlIChDWEZBX1RoaXNQcm94eSopbHBDdXJOb2RlOw0KKyAgICAgIGxwQ3VyTm9kZSA9IE5VTEw7DQorICAgIH0NCisgICAgRlhKU0VfVmFsdWVfUmVsZWFzZShoT2JqZWN0KTsNCisgICAgRlhKU0VfQ29udGV4dF9SZWxlYXNlKGhWYXJpYWJsZUNvbnRleHQpOw0KKyAgICBoVmFyaWFibGVDb250ZXh0ID0gTlVMTDsNCisgIH0NCisgIG1fbWFwVmFyaWFibGVUb0hWYWx1ZS5SZW1vdmVBbGwoKTsNCit9DQordm9pZCBDWEZBX1NjcmlwdENvbnRleHQ6OkRlZmluZUpzQ2xhc3MoKSB7DQorICBtX0pzTm9ybWFsQ2xhc3MuY29uc3RydWN0b3IgPSBOVUxMOw0KKyAgbV9Kc05vcm1hbENsYXNzLm5hbWUgPSAiWEZBT2JqZWN0IjsNCisgIG1fSnNOb3JtYWxDbGFzcy5wcm9wTnVtID0gMDsNCisgIG1fSnNOb3JtYWxDbGFzcy5wcm9wZXJ0aWVzID0gTlVMTDsNCisgIG1fSnNOb3JtYWxDbGFzcy5tZXRoTnVtID0gMDsNCisgIG1fSnNOb3JtYWxDbGFzcy5tZXRob2RzID0gTlVMTDsNCisgIG1fSnNOb3JtYWxDbGFzcy5keW5Qcm9wR2V0dGVyID0gQ1hGQV9TY3JpcHRDb250ZXh0OjpOb3JtYWxQcm9wZXJ0eUdldHRlcjsNCisgIG1fSnNOb3JtYWxDbGFzcy5keW5Qcm9wU2V0dGVyID0gQ1hGQV9TY3JpcHRDb250ZXh0OjpOb3JtYWxQcm9wZXJ0eVNldHRlcjsNCisgIG1fSnNOb3JtYWxDbGFzcy5keW5Qcm9wVHlwZUdldHRlciA9IENYRkFfU2NyaXB0Q29udGV4dDo6Tm9ybWFsUHJvcFR5cGVHZXR0ZXI7DQorICBtX0pzTm9ybWFsQ2xhc3MuZHluUHJvcERlbGV0ZXIgPSBOVUxMOw0KKyAgbV9Kc05vcm1hbENsYXNzLmR5bk1ldGhvZENhbGwgPSBDWEZBX1NjcmlwdENvbnRleHQ6Ok5vcm1hbE1ldGhvZENhbGw7DQorICBtX2hKc0NsYXNzID0gRlhKU0VfRGVmaW5lQ2xhc3MobV9oSnNDb250ZXh0LCAmbV9Kc05vcm1hbENsYXNzKTsNCit9DQorRlhKU0VfSENMQVNTIENYRkFfU2NyaXB0Q29udGV4dDo6R2V0SnNlTm9ybWFsQ2xhc3MoKSB7DQorICByZXR1cm4gbV9oSnNDbGFzczsNCit9DQordm9pZCBDWEZBX1NjcmlwdENvbnRleHQ6OkFkZEpTQnVpbHRpbk9iamVjdCgNCisgICAgWEZBX0xQQ0pTQlVJTFRJTklORk8gcEJ1aXRpbk9iamVjdCkgew0KKyAgaWYgKG1fZHdCdWlsdEluSW5GbGFncyAmIFhGQV9KU0JVSUxUSU5fSW5pdGlhbGl6ZWQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgbV9KU0J1aWx0SW5PYmplY3RzLlNldEF0KHBCdWl0aW5PYmplY3QtPnBOYW1lLCAodm9pZCopcEJ1aXRpbk9iamVjdCk7DQorfQ0KK2ludDMyX3QgQ1hGQV9TY3JpcHRDb250ZXh0OjpSZXNvbHZlT2JqZWN0cyhDWEZBX09iamVjdCogcmVmTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0V4cHJlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9SUyYgcmVzb2x2ZU5vZGVSUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRFdPUkQgZHdTdHlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogYmluZE5vZGUpIHsNCisgIGlmICh3c0V4cHJlc3Npb24uSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaWYgKG1fZVNjcmlwdFR5cGUgIT0gWEZBX1NDUklQVExBTkdUWVBFX0Zvcm1jYWxjIHx8DQorICAgICAgKGR3U3R5bGVzICYgKFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfCBYRkFfUkVTT0xWRU5PREVfU2libGluZ3MpKSkgew0KKyAgICBtX3VwT2JqZWN0QXJyYXkuUmVtb3ZlQWxsKCk7DQorICB9DQorICBpZiAocmVmTm9kZSAmJg0KKyAgICAgIChkd1N0eWxlcyAmIChYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzKSkgJiYNCisgICAgICByZWZOb2RlLT5Jc05vZGUoKSkgew0KKyAgICBtX3VwT2JqZWN0QXJyYXkuQWRkKChDWEZBX05vZGUqKXJlZk5vZGUpOw0KKyAgfQ0KKyAgRlhfQk9PTCBiTmV4dENyZWF0ZSA9IEZBTFNFOw0KKyAgaWYgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0NyZWF0ZU5vZGUpIHsNCisgICAgbV9wUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpLT5YRkFfU2V0Q3JlYXRlTm9kZVR5cGUoYmluZE5vZGUpOw0KKyAgfQ0KKyAgbV9wUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpLT5tX3BDcmVhdGVQYXJlbnQgPSBOVUxMOw0KKyAgbV9wUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpLT5tX2lDdXJBbGxTdGFydCA9IC0xOw0KKyAgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhIHJuZEZpbmQ7DQorICBpbnQzMl90IG5TdGFydCA9IDA7DQorICBpbnQzMl90IG5MZXZlbCA9IDA7DQorICBpbnQzMl90IG5SZXQgPSAtMTsNCisgIHJuZEZpbmQubV9wU0MgPSB0aGlzOw0KKyAgQ1hGQV9PYmpBcnJheSBmaW5kTm9kZXM7DQorICBpZiAocmVmTm9kZSAhPSBOVUxMKSB7DQorICAgIGZpbmROb2Rlcy5BZGQocmVmTm9kZSk7DQorICB9IGVsc2Ugew0KKyAgICBmaW5kTm9kZXMuQWRkKG1fcERvY3VtZW50LT5HZXRSb290KCkpOw0KKyAgfQ0KKyAgaW50MzJfdCBuTm9kZXMgPSAwOw0KKyAgd2hpbGUgKFRSVUUpIHsNCisgICAgbk5vZGVzID0gZmluZE5vZGVzLkdldFNpemUoKTsNCisgICAgaW50MzJfdCBpID0gMDsNCisgICAgcm5kRmluZC5tX2R3U3R5bGVzID0gZHdTdHlsZXM7DQorICAgIG1fcFJlc29sdmVQcm9jZXNzb3ItPm1faUN1clN0YXJ0ID0gblN0YXJ0Ow0KKyAgICBuU3RhcnQgPSBtX3BSZXNvbHZlUHJvY2Vzc29yLT5YRkFfUmVzb2x2ZU5vZGVzX0dldEZpbHRlcih3c0V4cHJlc3Npb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TdGFydCwgcm5kRmluZCk7DQorICAgIGlmIChuU3RhcnQgPCAxKSB7DQorICAgICAgaWYgKChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9DcmVhdGVOb2RlKSAmJiAhYk5leHRDcmVhdGUpIHsNCisgICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gTlVMTDsNCisgICAgICAgIG5TdGFydCA9IG1fcFJlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKS0+bV9pQ3VyQWxsU3RhcnQ7DQorICAgICAgICBpZiAoblN0YXJ0ICE9IC0xKSB7DQorICAgICAgICAgIHBEYXRhTm9kZSA9IG1fcERvY3VtZW50LT5HZXROb3RCaW5kTm9kZShmaW5kTm9kZXMpOw0KKyAgICAgICAgICBpZiAocERhdGFOb2RlKSB7DQorICAgICAgICAgICAgZmluZE5vZGVzLlJlbW92ZUFsbCgpOw0KKyAgICAgICAgICAgIGZpbmROb2Rlcy5BZGQocERhdGFOb2RlKTsNCisgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgcERhdGFOb2RlID0gKENYRkFfTm9kZSopZmluZE5vZGVzWzBdOw0KKyAgICAgICAgICBmaW5kTm9kZXMuUmVtb3ZlQWxsKCk7DQorICAgICAgICAgIGZpbmROb2Rlcy5BZGQocERhdGFOb2RlKTsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgICBkd1N0eWxlcyB8PSBYRkFfUkVTT0xWRU5PREVfQmluZDsNCisgICAgICAgIGZpbmROb2Rlcy5SZW1vdmVBbGwoKTsNCisgICAgICAgIGZpbmROb2Rlcy5BZGQobV9wUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpLT5tX3BBbGxTdGFydFBhcmVudCk7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChiTmV4dENyZWF0ZSkgew0KKyAgICAgIEZYX0JPT0wgYkNyZWF0ZSA9DQorICAgICAgICAgIG1fcFJlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKS0+WEZBX1Jlc29sdmVOb2Rlc19DcmVhdGVOb2RlKA0KKyAgICAgICAgICAgICAgcm5kRmluZC5tX3dzTmFtZSwgcm5kRmluZC5tX3dzQ29uZGl0aW9uLA0KKyAgICAgICAgICAgICAgblN0YXJ0ID09IHdzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSwgdGhpcyk7DQorICAgICAgaWYgKGJDcmVhdGUpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgQ1hGQV9PYmpBcnJheSByZXROb2RlczsNCisgICAgd2hpbGUgKGkgPCBuTm9kZXMpIHsNCisgICAgICBGWF9CT09MIGJEYXRhQmluZCA9IEZBTFNFOw0KKyAgICAgIGlmICgoKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0JpbmQpIHx8DQorICAgICAgICAgICAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQ3JlYXRlTm9kZSkpICYmDQorICAgICAgICAgIG5Ob2RlcyA+IDEpIHsNCisgICAgICAgIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSBybmRCaW5kOw0KKyAgICAgICAgbV9wUmVzb2x2ZVByb2Nlc3Nvci0+WEZBX1Jlc29sdmVOb2Rlc19HZXRGaWx0ZXIod3NFeHByZXNzaW9uLCBuU3RhcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRCaW5kKTsNCisgICAgICAgIG1fcFJlc29sdmVQcm9jZXNzb3ItPlhGQV9SZXNvbHZlTm9kZV9TZXRJbmRleERhdGFCaW5kKA0KKyAgICAgICAgICAgIHJuZEJpbmQubV93c0NvbmRpdGlvbiwgaSwgbk5vZGVzKTsNCisgICAgICAgIGJEYXRhQmluZCA9IFRSVUU7DQorICAgICAgfQ0KKyAgICAgIHJuZEZpbmQubV9DdXJOb2RlID0gZmluZE5vZGVzW2krK107DQorICAgICAgcm5kRmluZC5tX25MZXZlbCA9IG5MZXZlbDsNCisgICAgICBybmRGaW5kLm1fZHdGbGFnID0gWEZBX1JFU09WRU5PREVfUlNUWVBFX05vZGVzOw0KKyAgICAgIG5SZXQgPSBtX3BSZXNvbHZlUHJvY2Vzc29yLT5YRkFfUmVzb2x2ZU5vZGVzKHJuZEZpbmQpOw0KKyAgICAgIGlmIChuUmV0IDwgMSkgew0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmIChybmRGaW5kLm1fZHdGbGFnID09IFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9BdHRyaWJ1dGUgJiYNCisgICAgICAgICAgcm5kRmluZC5tX3BTY3JpcHRBdHRyaWJ1dGUgJiYgblN0YXJ0IDwgd3NFeHByZXNzaW9uLkdldExlbmd0aCgpKSB7DQorICAgICAgICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gRlhKU0VfVmFsdWVfQ3JlYXRlKG1faEpzUnVudGltZSk7DQorICAgICAgICAocm5kRmluZC5tX05vZGVzWzBdLT4qKHJuZEZpbmQubV9wU2NyaXB0QXR0cmlidXRlLT5scGZuQ2FsbGJhY2spKSgNCisgICAgICAgICAgICBoVmFsdWUsIEZBTFNFLA0KKyAgICAgICAgICAgIChYRkFfQVRUUklCVVRFKXJuZEZpbmQubV9wU2NyaXB0QXR0cmlidXRlLT5lQXR0cmlidXRlKTsNCisgICAgICAgIHJuZEZpbmQubV9Ob2Rlcy5TZXRBdCgwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDWEZBX09iamVjdCopRlhKU0VfVmFsdWVfVG9PYmplY3QoaFZhbHVlLCBOVUxMKSk7DQorICAgICAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKGhWYWx1ZSk7DQorICAgICAgfQ0KKyAgICAgIGludDMyX3QgaVNpemUgPSBtX3VwT2JqZWN0QXJyYXkuR2V0U2l6ZSgpOw0KKyAgICAgIGlmIChpU2l6ZSkgew0KKyAgICAgICAgbV91cE9iamVjdEFycmF5LlJlbW92ZUF0KGlTaXplIC0gMSk7DQorICAgICAgfQ0KKyAgICAgIHJldE5vZGVzLkFwcGVuZChybmRGaW5kLm1fTm9kZXMpOw0KKyAgICAgIHJuZEZpbmQubV9Ob2Rlcy5SZW1vdmVBbGwoKTsNCisgICAgICBpZiAoYkRhdGFCaW5kKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgZmluZE5vZGVzLlJlbW92ZUFsbCgpOw0KKyAgICBuTm9kZXMgPSByZXROb2Rlcy5HZXRTaXplKCk7DQorICAgIGlmIChuTm9kZXMgPCAxKSB7DQorICAgICAgaWYgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0NyZWF0ZU5vZGUpIHsNCisgICAgICAgIGJOZXh0Q3JlYXRlID0gVFJVRTsNCisgICAgICAgIGlmIChtX3BSZXNvbHZlUHJvY2Vzc29yLT5HZXROb2RlSGVscGVyKCktPm1fcENyZWF0ZVBhcmVudCA9PSBOVUxMKSB7DQorICAgICAgICAgIG1fcFJlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKS0+bV9wQ3JlYXRlUGFyZW50ID0NCisgICAgICAgICAgICAgIChDWEZBX05vZGUqKXJuZEZpbmQubV9DdXJOb2RlOw0KKyAgICAgICAgICBtX3BSZXNvbHZlUHJvY2Vzc29yLT5HZXROb2RlSGVscGVyKCktPm1faUNyZWF0ZUNvdW50ID0gMTsNCisgICAgICAgIH0NCisgICAgICAgIEZYX0JPT0wgYkNyZWF0ZSA9DQorICAgICAgICAgICAgbV9wUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpLT5YRkFfUmVzb2x2ZU5vZGVzX0NyZWF0ZU5vZGUoDQorICAgICAgICAgICAgICAgIHJuZEZpbmQubV93c05hbWUsIHJuZEZpbmQubV93c0NvbmRpdGlvbiwNCisgICAgICAgICAgICAgICAgblN0YXJ0ID09IHdzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSwgdGhpcyk7DQorICAgICAgICBpZiAoYkNyZWF0ZSkgew0KKyAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgIH0NCisgICAgZmluZE5vZGVzLkNvcHkocmV0Tm9kZXMpOw0KKyAgICBybmRGaW5kLm1fTm9kZXMuUmVtb3ZlQWxsKCk7DQorICAgIGlmIChuTGV2ZWwgPT0gMCkgew0KKyAgICAgIGR3U3R5bGVzICY9IH4oWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyk7DQorICAgIH0NCisgICAgbkxldmVsKys7DQorICB9DQorICBpZiAoIWJOZXh0Q3JlYXRlKSB7DQorICAgIHJlc29sdmVOb2RlUlMuZHdGbGFncyA9IHJuZEZpbmQubV9kd0ZsYWc7DQorICAgIGlmIChuTm9kZXMgPiAwKSB7DQorICAgICAgcmVzb2x2ZU5vZGVSUy5ub2Rlcy5BcHBlbmQoZmluZE5vZGVzKTsNCisgICAgfQ0KKyAgICBpZiAocm5kRmluZC5tX2R3RmxhZyA9PSBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfQXR0cmlidXRlKSB7DQorICAgICAgcmVzb2x2ZU5vZGVSUy5wU2NyaXB0QXR0cmlidXRlID0gcm5kRmluZC5tX3BTY3JpcHRBdHRyaWJ1dGU7DQorICAgICAgcmV0dXJuIDE7DQorICAgIH0NCisgIH0NCisgIGlmIChkd1N0eWxlcyAmIChYRkFfUkVTT0xWRU5PREVfQ3JlYXRlTm9kZSB8IFhGQV9SRVNPTFZFTk9ERV9CaW5kIHwNCisgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfQmluZE5ldykpIHsNCisgICAgbV9wUmVzb2x2ZVByb2Nlc3Nvci0+WEZBX1Jlc29sdmVOb2RlX1NldFJlc3VsdENyZWF0ZU5vZGUoDQorICAgICAgICByZXNvbHZlTm9kZVJTLCBybmRGaW5kLm1fd3NDb25kaXRpb24pOw0KKyAgICBpZiAoIWJOZXh0Q3JlYXRlICYmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9DcmVhdGVOb2RlKSkgew0KKyAgICAgIHJlc29sdmVOb2RlUlMuZHdGbGFncyA9IFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9FeGlzdE5vZGVzOw0KKyAgICB9DQorICAgIHJldHVybiByZXNvbHZlTm9kZVJTLm5vZGVzLkdldFNpemUoKTsNCisgIH0NCisgIHJldHVybiBuTm9kZXM7DQorfQ0KK0ZYSlNFX0hWQUxVRSBDWEZBX1NjcmlwdENvbnRleHQ6OkdldEpTVmFsdWVGcm9tTWFwKENYRkFfT2JqZWN0KiBwT2JqZWN0KSB7DQorICBpZiAoIXBPYmplY3QpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBpZiAocE9iamVjdC0+SXNOb2RlKCkpIHsNCisgICAgUnVuVmFyaWFibGVzU2NyaXB0KChDWEZBX05vZGUqKXBPYmplY3QpOw0KKyAgfQ0KKyAgdm9pZCogcFZhbHVlID0gbV9tYXBYRkFUb0hWYWx1ZS5HZXRWYWx1ZUF0KHBPYmplY3QpOw0KKyAgaWYgKHBWYWx1ZSA9PSBOVUxMKSB7DQorICAgIEZYSlNFX0hWQUxVRSBqc0h2YWx1ZSA9IEZYSlNFX1ZhbHVlX0NyZWF0ZShtX2hKc1J1bnRpbWUpOw0KKyAgICBGWEpTRV9WYWx1ZV9TZXRPYmplY3QoanNIdmFsdWUsIHBPYmplY3QsIG1faEpzQ2xhc3MpOw0KKyAgICBtX21hcFhGQVRvSFZhbHVlLlNldEF0KHBPYmplY3QsIGpzSHZhbHVlKTsNCisgICAgcFZhbHVlID0ganNIdmFsdWU7DQorICB9DQorICByZXR1cm4gKEZYSlNFX0hWQUxVRSlwVmFsdWU7DQorfQ0KK2ludDMyX3QgQ1hGQV9TY3JpcHRDb250ZXh0OjpHZXRJbmRleEJ5TmFtZShDWEZBX05vZGUqIHJlZk5vZGUpIHsNCisgIENYRkFfTm9kZUhlbHBlciogbHBOb2RlSGVscGVyID0gbV9wUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpOw0KKyAgcmV0dXJuIGxwTm9kZUhlbHBlci0+WEZBX0dldEluZGV4KHJlZk5vZGUsIFhGQV9MT0dJQ19UcmFuc3BhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscE5vZGVIZWxwZXItPlhGQV9Ob2RlSXNQcm9wZXJ0eShyZWZOb2RlKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7DQorfQ0KK2ludDMyX3QgQ1hGQV9TY3JpcHRDb250ZXh0OjpHZXRJbmRleEJ5Q2xhc3NOYW1lKENYRkFfTm9kZSogcmVmTm9kZSkgew0KKyAgQ1hGQV9Ob2RlSGVscGVyKiBscE5vZGVIZWxwZXIgPSBtX3BSZXNvbHZlUHJvY2Vzc29yLT5HZXROb2RlSGVscGVyKCk7DQorICByZXR1cm4gbHBOb2RlSGVscGVyLT5YRkFfR2V0SW5kZXgocmVmTm9kZSwgWEZBX0xPR0lDX1RyYW5zcGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwTm9kZUhlbHBlci0+WEZBX05vZGVJc1Byb3BlcnR5KHJlZk5vZGUpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpOw0KK30NCit2b2lkIENYRkFfU2NyaXB0Q29udGV4dDo6R2V0U29tRXhwcmVzc2lvbihDWEZBX05vZGUqIHJlZk5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRXhwcmVzc2lvbikgew0KKyAgQ1hGQV9Ob2RlSGVscGVyKiBscE5vZGVIZWxwZXIgPSBtX3BSZXNvbHZlUHJvY2Vzc29yLT5HZXROb2RlSGVscGVyKCk7DQorICBscE5vZGVIZWxwZXItPlhGQV9HZXROYW1lRXhwcmVzc2lvbihyZWZOb2RlLCB3c0V4cHJlc3Npb24sIFRSVUUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTE9HSUNfVHJhbnNwYXJlbnQpOw0KK30NCit2b2lkIENYRkFfU2NyaXB0Q29udGV4dDo6U2V0Tm9kZXNPZlJ1blNjcmlwdChDWEZBX05vZGVBcnJheSogcEFycmF5KSB7DQorICBtX3BTY3JpcHROb2RlQXJyYXkgPSBwQXJyYXk7DQorfQ0KK3ZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpBZGROb2Rlc09mUnVuU2NyaXB0KGNvbnN0IENYRkFfTm9kZUFycmF5JiBub2Rlcykgew0KKyAgaWYgKCFtX3BTY3JpcHROb2RlQXJyYXkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG5vZGVzLkdldFNpemUoKSA+IDApIHsNCisgICAgbV9wU2NyaXB0Tm9kZUFycmF5LT5Db3B5KG5vZGVzKTsNCisgIH0NCit9DQordm9pZCBDWEZBX1NjcmlwdENvbnRleHQ6OkFkZE5vZGVzT2ZSdW5TY3JpcHQoQ1hGQV9Ob2RlKiBwTm9kZSkgew0KKyAgaWYgKCFtX3BTY3JpcHROb2RlQXJyYXkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKG1fcFNjcmlwdE5vZGVBcnJheS0+RmluZChwTm9kZSkgPT0gLTEpIHsNCisgICAgbV9wU2NyaXB0Tm9kZUFycmF5LT5BZGQocE5vZGUpOw0KKyAgfQ0KK30NCitJWEZBX1NjcmlwdENvbnRleHQqIFhGQV9TY3JpcHRDb250ZXh0X0NyZWF0ZShDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsNCisgIHJldHVybiBuZXcgQ1hGQV9TY3JpcHRDb250ZXh0KHBEb2N1bWVudCk7DQorfQ0KK3N0YXRpYyBjb25zdCBYRkFfSlNCVUlMVElOSU5GTyBnc19KU0JVSUxUSU5EYXRhW10gPSB7DQorICAgIHsweDgxMDhiOWE5LCAiTnVtYmVyIn0sDQorICAgIHsweGUwN2UzZmJlLCAiRGF0ZSJ9LA0KK307DQorY29uc3QgaW50MzJfdCBnX2lKU0J1aWx0aW5Db3VudCA9DQorICAgIHNpemVvZihYRkFfSlNCVUlMVElOSU5GTykgLyBzaXplb2YoWEZBX0pTQlVJTFRJTklORk8pOw0KK1hGQV9MUENKU0JVSUxUSU5JTkZPIFhGQV9HZXRKU0J1aWx0aW5CeUhhc2godWludDMyX3QgdUhhc2hDb2RlKSB7DQorICBpbnQzMl90IGlTdGFydCA9IDAsIGlFbmQgPSBnX2lKU0J1aWx0aW5Db3VudCAtIDEsIGlNaWQ7DQorICBkbyB7DQorICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOw0KKyAgICBYRkFfTFBDSlNCVUlMVElOSU5GTyBwSW5mbyA9IGdzX0pTQlVJTFRJTkRhdGEgKyBpTWlkOw0KKyAgICBpZiAodUhhc2hDb2RlID09IHBJbmZvLT51VW5pY29kZUhhc2gpIHsNCisgICAgICByZXR1cm4gcEluZm87DQorICAgIH0gZWxzZSBpZiAodUhhc2hDb2RlIDwgcEluZm8tPnVVbmljb2RlSGFzaCkgew0KKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsNCisgICAgfQ0KKyAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOw0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfaW1wLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2ltcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMWVkNmQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2ltcC5oCkBAIC0wLDAgKzEsMTIxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX0ZYRkFfU0NSSVBUX0lNUF9IDQorI2RlZmluZSBfRlhGQV9TQ1JJUFRfSU1QX0gNCisjZGVmaW5lIFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lIDB4MDAwMg0KKyNkZWZpbmUgWEZBX0pTQlVJTFRJTl9Jbml0aWFsaXplZCAweDAwMDENCisjZGVmaW5lIFhGQV9KU0JVSUxUSU5fSGFzQ291bnQgMHgwMDAyDQorY2xhc3MgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOw0KK2NsYXNzIENYRkFfU2NyaXB0Q29udGV4dCA6IHB1YmxpYyBJWEZBX1NjcmlwdENvbnRleHQgew0KKyBwdWJsaWM6DQorICBDWEZBX1NjcmlwdENvbnRleHQoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsNCisgIH5DWEZBX1NjcmlwdENvbnRleHQoKTsNCisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCk7DQorICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShGWEpTRV9IUlVOVElNRSBoUnVudGltZSk7DQorICB2aXJ0dWFsIHZvaWQgU2V0RXZlbnRQYXJhbShDWEZBX0V2ZW50UGFyYW0qIHBFdmVudFBhcmFtKSB7DQorICAgIG1fcEV2ZW50UGFyYW0gPSBwRXZlbnRQYXJhbTsNCisgIH0NCisgIHZpcnR1YWwgQ1hGQV9FdmVudFBhcmFtKiBHZXRFdmVudFBhcmFtKCkgeyByZXR1cm4gbV9wRXZlbnRQYXJhbTsgfQ0KKyAgdmlydHVhbCBGWF9CT09MIFJ1blNjcmlwdChYRkFfU0NSSVBUTEFOR1RZUEUgZVNjcmlwdFR5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NTY3JpcHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoUmV0VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfT2JqZWN0KiBwVGhpc09iamVjdCA9IE5VTEwpOw0KKw0KKyAgdmlydHVhbCBpbnQzMl90IFJlc29sdmVPYmplY3RzKENYRkFfT2JqZWN0KiByZWZOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NFeHByZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9SUyYgcmVzb2x2ZU5vZGVSUywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd1N0eWxlcyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIGJpbmROb2RlID0gTlVMTCk7DQorICB2aXJ0dWFsIEZYSlNFX0hWQUxVRSBHZXRKU1ZhbHVlRnJvbU1hcChDWEZBX09iamVjdCogcE9iamVjdCk7DQorICB2aXJ0dWFsIHZvaWQgQ2FjaGVMaXN0KENYRkFfTm9kZUxpc3QqIHBMaXN0KSB7IG1fQ2FjaGVMaXN0QXJyYXkuQWRkKHBMaXN0KTsgfQ0KKyAgdmlydHVhbCBDWEZBX09iamVjdCogR2V0VGhpc09iamVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fcFRoaXNPYmplY3Q7IH0NCisgIHZpcnR1YWwgRlhKU0VfSFJVTlRJTUUgR2V0UnVudGltZSgpIGNvbnN0IHsgcmV0dXJuIG1faEpzUnVudGltZTsgfQ0KKw0KKyAgdmlydHVhbCBpbnQzMl90IEdldEluZGV4QnlOYW1lKENYRkFfTm9kZSogcmVmTm9kZSk7DQorICB2aXJ0dWFsIGludDMyX3QgR2V0SW5kZXhCeUNsYXNzTmFtZShDWEZBX05vZGUqIHJlZk5vZGUpOw0KKyAgdmlydHVhbCB2b2lkIEdldFNvbUV4cHJlc3Npb24oQ1hGQV9Ob2RlKiByZWZOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRXhwcmVzc2lvbik7DQorDQorICB2aXJ0dWFsIHZvaWQgU2V0Tm9kZXNPZlJ1blNjcmlwdChDWEZBX05vZGVBcnJheSogcEFycmF5KTsNCisgIHZpcnR1YWwgdm9pZCBBZGROb2Rlc09mUnVuU2NyaXB0KGNvbnN0IENYRkFfTm9kZUFycmF5JiBub2Rlcyk7DQorICB2aXJ0dWFsIHZvaWQgQWRkTm9kZXNPZlJ1blNjcmlwdChDWEZBX05vZGUqIHBOb2RlKTsNCisgIHZpcnR1YWwgRlhKU0VfSENMQVNTIEdldEpzZU5vcm1hbENsYXNzKCk7DQorDQorICB2aXJ0dWFsIHZvaWQgQWRkSlNCdWlsdGluT2JqZWN0KFhGQV9MUENKU0JVSUxUSU5JTkZPIHBCdWl0aW5PYmplY3QpOw0KKyAgdmlydHVhbCB2b2lkIFNldFJ1bkF0VHlwZShYRkFfQVRUUklCVVRFRU5VTSBlUnVuQXQpIHsgbV9lUnVuQXRUeXBlID0gZVJ1bkF0OyB9DQorICB2aXJ0dWFsIEZYX0JPT0wgSXNSdW5BdENsaWVudCgpIHsNCisgICAgcmV0dXJuIG1fZVJ1bkF0VHlwZSAhPSBYRkFfQVRUUklCVVRFRU5VTV9TZXJ2ZXI7DQorICB9DQorICBGWF9CT09MIFF1ZXJ5Tm9kZUJ5RmxhZyhDWEZBX05vZGUqIHJlZk5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHByb3BuYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGR3RmxhZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNldHRpbmcpOw0KKyAgRlhfQk9PTCBRdWVyeVZhcmlhYmxlSFZhbHVlKENYRkFfTm9kZSogcFNjcmlwdE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiR2V0dGVyKTsNCisgIEZYX0JPT0wgUXVlcnlCdWlsdGluSFZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KKyAgc3RhdGljIHZvaWQgR2xvYmFsUHJvcGVydHlHZXR0ZXIoRlhKU0VfSE9CSkVDVCBoT2JqZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorICBzdGF0aWMgdm9pZCBHbG9iYWxQcm9wZXJ0eVNldHRlcihGWEpTRV9IT0JKRUNUIGhPYmplY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFZhbHVlKTsNCisgIHN0YXRpYyB2b2lkIE5vcm1hbFByb3BlcnR5R2V0dGVyKEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUpOw0KKyAgc3RhdGljIHZvaWQgTm9ybWFsUHJvcGVydHlTZXR0ZXIoRlhKU0VfSE9CSkVDVCBoT2JqZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSk7DQorICBzdGF0aWMgdm9pZCBOb3JtYWxNZXRob2RDYWxsKEZYSlNFX0hPQkpFQ1QgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7DQorICBzdGF0aWMgaW50MzJfdCBOb3JtYWxQcm9wVHlwZUdldHRlcihGWEpTRV9IT0JKRUNUIGhPYmplY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJRdWVyeUluKTsNCisgIHN0YXRpYyBpbnQzMl90IEdsb2JhbFByb3BUeXBlR2V0dGVyKEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlF1ZXJ5SW4pOw0KKyAgRlhfQk9PTCBSdW5WYXJpYWJsZXNTY3JpcHQoQ1hGQV9Ob2RlKiBwU2NyaXB0Tm9kZSk7DQorICBDWEZBX09iamVjdCogR2V0VmFyaWFibGVzVGhpcyhDWEZBX09iamVjdCogcE9iamVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYlNjcmlwdE5vZGUgPSBGQUxTRSk7DQorICB2b2lkIFJlbGVhc2VWYXJpYWJsZXNNYXAoKTsNCisgIEZYX0JPT0wgSXNTdHJpY3RTY29wZUluSmF2YVNjcmlwdCgpOw0KKyAgWEZBX1NDUklQVExBTkdUWVBFIEdldFR5cGUoKTsNCisgIENYRkFfTm9kZUFycmF5JiBHZXRVcE9iamVjdEFycmF5KCkgeyByZXR1cm4gbV91cE9iamVjdEFycmF5OyB9DQorICBDWEZBX0RvY3VtZW50KiBHZXREb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fcERvY3VtZW50OyB9DQorDQorIHByb3RlY3RlZDoNCisgIHZvaWQgRGVmaW5lSnNDb250ZXh0KCk7DQorICBGWEpTRV9IQ09OVEVYVCBDcmVhdGVWYXJpYWJsZXNDb250ZXh0KENYRkFfTm9kZSogcFNjcmlwdE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFN1YmZvcm0pOw0KKyAgdm9pZCBEZWZpbmVKc0NsYXNzKCk7DQorDQorICBDWEZBX0RvY3VtZW50KiBtX3BEb2N1bWVudDsNCisgIEZYSlNFX0hDT05URVhUIG1faEpzQ29udGV4dDsNCisgIEZYSlNFX0hSVU5USU1FIG1faEpzUnVudGltZTsNCisgIEZYSlNFX0hDTEFTUyBtX2hKc0NsYXNzOw0KKyAgWEZBX1NDUklQVExBTkdUWVBFIG1fZVNjcmlwdFR5cGU7DQorICBGWEpTRV9DTEFTUyBtX0pzR2xvYmFsQ2xhc3M7DQorICBGWEpTRV9DTEFTUyBtX0pzTm9ybWFsQ2xhc3M7DQorICBDRlhfTWFwUHRyVGVtcGxhdGU8Q1hGQV9PYmplY3QqLCBGWEpTRV9IVkFMVUU+IG1fbWFwWEZBVG9IVmFsdWU7DQorICBGWEpTRV9DTEFTUyBtX0pzR2xvYmFsVmFyaWFibGVzQ2xhc3M7DQorICBDRlhfTWFwUHRyVGVtcGxhdGU8Q1hGQV9PYmplY3QqLCBGWEpTRV9IQ09OVEVYVD4gbV9tYXBWYXJpYWJsZVRvSFZhbHVlOw0KKyAgQ1hGQV9FdmVudFBhcmFtKiBtX3BFdmVudFBhcmFtOw0KKyAgQ1hGQV9Ob2RlQXJyYXkgbV91cE9iamVjdEFycmF5Ow0KKyAgQ0ZYX1B0ckFycmF5IG1fQ2FjaGVMaXN0QXJyYXk7DQorICBDWEZBX05vZGVBcnJheSogbV9wU2NyaXB0Tm9kZUFycmF5Ow0KKyAgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yKiBtX3BSZXNvbHZlUHJvY2Vzc29yOw0KKyAgWEZBX0hGTTJKU0NPTlRFWFQgbV9oRk0ySlNDb250ZXh0Ow0KKyAgQ1hGQV9PYmplY3QqIG1fcFRoaXNPYmplY3Q7DQorICBDRlhfQ01hcEJ5dGVTdHJpbmdUb1B0ciBtX0pTQnVpbHRJbk9iamVjdHM7DQorICBGWF9EV09SRCBtX2R3QnVpbHRJbkluRmxhZ3M7DQorICBYRkFfQVRUUklCVVRFRU5VTSBtX2VSdW5BdFR5cGU7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2xheW91dHBzZXVkb21vZGVsLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfbGF5b3V0cHNldWRvbW9kZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMzQ0MTIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2xheW91dHBzZXVkb21vZGVsLmNwcApAQCAtMCwwICsxLDU1MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfdXRpbHMuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX29iamVjdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jdW1lbnQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3BhcnNlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfc2NyaXB0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NkYXRhLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NsYXlvdXQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2xvY2FsZW1nci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZm0yanNhcGkuaCINCisjaW5jbHVkZSAieGZhX3NjcmlwdF9sYXlvdXRwc2V1ZG9tb2RlbC5oIg0KKyNpbmNsdWRlICJ4ZmFfZG9jdW1lbnRfbGF5b3V0X2ltcC5oIg0KKyNpbmNsdWRlICJ4ZmFfbGF5b3V0X2FwcGFkYXB0ZXIuaCINCitDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCkNCisgICAgOiBDWEZBX09yZGluYXJ5T2JqZWN0KHBEb2N1bWVudCwgWEZBX0VMRU1FTlRfTGF5b3V0UHNldWRvTW9kZWwpIHsNCisgIG1fdVNjcmlwdEhhc2ggPSBYRkFfSEFTSENPREVfTGF5b3V0Ow0KK30NCitDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjp+Q1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbCgpIHt9DQordm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUmVhZHkoDQorICAgIEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgIEZYX0JPT0wgYlNldHRpbmcsDQorICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgew0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmIChiU2V0dGluZykgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX1VOQUJMRV9TRVRfUkVBRFkpOw0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlTdGF0dXMgPSBwTm90aWZ5LT5HZXRMYXlvdXRTdGF0dXMoKTsNCisgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oaFZhbHVlLCBpU3RhdHVzID49IDIpOw0KK30NCit2b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9IV1hZKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzLA0KKyAgICBYRkFfTEFZT1VUTU9ERUxfSFdYWSBsYXlvdXRNb2RlbCkgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCA8IDEgfHwgaUxlbmd0aCA+IDMpIHsNCisgICAgY29uc3QgRlhfV0NIQVIqIG1ldGhvZE5hbWUgPSBOVUxMOw0KKyAgICBzd2l0Y2ggKGxheW91dE1vZGVsKSB7DQorICAgICAgY2FzZSBYRkFfTEFZT1VUTU9ERUxfSDoNCisgICAgICAgIG1ldGhvZE5hbWUgPSBMImgiOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfTEFZT1VUTU9ERUxfVzoNCisgICAgICAgIG1ldGhvZE5hbWUgPSBMInciOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfTEFZT1VUTU9ERUxfWDoNCisgICAgICAgIG1ldGhvZE5hbWUgPSBMIngiOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfTEFZT1VUTU9ERUxfWToNCisgICAgICAgIG1ldGhvZE5hbWUgPSBMInkiOw0KKyAgICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgbWV0aG9kTmFtZSk7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfTm9kZSogcE5vZGUgPSBOVUxMOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NVbml0ID0gRlhfV1NUUkMoTCJwdCIpOw0KKyAgaW50MzJfdCBpSW5kZXggPSAwOw0KKyAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICBwTm9kZSA9IChDWEZBX05vZGUqKXBBcmd1bWVudHMtPkdldE9iamVjdCgwKTsNCisgIH0NCisgIGlmIChpTGVuZ3RoID49IDIpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNVbml0ID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygxKTsNCisgICAgaWYgKCFic1VuaXQuSXNFbXB0eSgpKSB7DQorICAgICAgd3NVbml0ID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVW5pdCwgYnNVbml0LkdldExlbmd0aCgpKTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGlMZW5ndGggPj0gMykgew0KKyAgICBpSW5kZXggPSBwQXJndW1lbnRzLT5HZXRJbnQzMigyKTsNCisgIH0NCisgIGlmICghcE5vZGUpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Eb2NMYXlvdXQqIHBEb2NMYXlvdXQgPSBtX3BEb2N1bWVudC0+R2V0RG9jTGF5b3V0KCk7DQorICBpZiAoIXBEb2NMYXlvdXQpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1JlY3RGIHJ0UmVjdDsNCisgIENYRkFfTWVhc3VyZW1lbnQgbWVhc3VyZTsNCisgIENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0gPSBwRG9jTGF5b3V0LT5HZXRMYXlvdXRJdGVtKHBOb2RlKTsNCisgIGlmICghcExheW91dEl0ZW0pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgd2hpbGUgKGlJbmRleCA+IDAgJiYgcExheW91dEl0ZW0pIHsNCisgICAgcExheW91dEl0ZW0gPSBwTGF5b3V0SXRlbS0+R2V0TmV4dCgpOw0KKyAgICBpSW5kZXgtLTsNCisgIH0NCisgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KKyAgaWYgKCFwTGF5b3V0SXRlbSkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRGbG9hdChoVmFsdWUsIDApOw0KKyAgICByZXR1cm47DQorICB9DQorICBwTGF5b3V0SXRlbS0+R2V0UmVjdChydFJlY3QsIFRSVUUpOw0KKyAgc3dpdGNoIChsYXlvdXRNb2RlbCkgew0KKyAgICBjYXNlIFhGQV9MQVlPVVRNT0RFTF9IOg0KKyAgICAgIG1lYXN1cmUuU2V0KHJ0UmVjdC5oZWlnaHQsIFhGQV9VTklUX1B0KTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfTEFZT1VUTU9ERUxfVzoNCisgICAgICBtZWFzdXJlLlNldChydFJlY3Qud2lkdGgsIFhGQV9VTklUX1B0KTsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfTEFZT1VUTU9ERUxfWDoNCisgICAgICBtZWFzdXJlLlNldChydFJlY3QubGVmdCwgWEZBX1VOSVRfUHQpOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9MQVlPVVRNT0RFTF9ZOg0KKyAgICAgIG1lYXN1cmUuU2V0KHJ0UmVjdC50b3AsIFhGQV9VTklUX1B0KTsNCisgICAgICBicmVhazsNCisgIH0NCisgIFhGQV9VTklUIHVuaXQgPSBtZWFzdXJlLkdldFVuaXQod3NVbml0KTsNCisgIEZYX0ZMT0FUIGZWYWx1ZSA9IG1lYXN1cmUuVG9Vbml0KHVuaXQpOw0KKyAgZlZhbHVlID0gRlhTWVNfcm91bmQoZlZhbHVlICogMTAwMCkgLyAxMDAwLjBmOw0KKyAgaWYgKGhWYWx1ZSkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRGbG9hdChoVmFsdWUsIGZWYWx1ZSk7DQorICB9DQorfQ0KK3ZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0goDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9IV1hZKHBBcmd1bWVudHMsIFhGQV9MQVlPVVRNT0RFTF9IKTsNCit9DQordm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfVygNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0hXWFkocEFyZ3VtZW50cywgWEZBX0xBWU9VVE1PREVMX1cpOw0KK30NCit2b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9YKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfSFdYWShwQXJndW1lbnRzLCBYRkFfTEFZT1VUTU9ERUxfWCk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1koDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9IV1hZKHBBcmd1bWVudHMsIFhGQV9MQVlPVVRNT0RFTF9ZKTsNCit9DQordm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfTnVtYmVyZWRQYWdlQ291bnQoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMsDQorICAgIEZYX0JPT0wgYk51bWJlcmVkKSB7DQorICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCA9IG1fcERvY3VtZW50LT5HZXREb2NMYXlvdXQoKTsNCisgIGlmICghcERvY0xheW91dCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBpbnQzMl90IGlQYWdlQ291bnQgPSAwOw0KKyAgaW50MzJfdCBpUGFnZU51bSA9IHBEb2NMYXlvdXQtPkNvdW50UGFnZXMoKTsNCisgIGlmIChiTnVtYmVyZWQpIHsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVBhZ2VOdW07IGkrKykgew0KKyAgICAgIElYRkFfTGF5b3V0UGFnZSogcExheW91dFBhZ2UgPSBwRG9jTGF5b3V0LT5HZXRQYWdlKGkpOw0KKyAgICAgIGlmICghcExheW91dFBhZ2UpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBDWEZBX05vZGUqIHBNYXN0ZXJQYWdlID0gcExheW91dFBhZ2UtPkdldE1hc3RlclBhZ2UoKTsNCisgICAgICBpZiAocE1hc3RlclBhZ2UtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9OdW1iZXJlZCkpIHsNCisgICAgICAgIGlQYWdlQ291bnQrKzsNCisgICAgICB9DQorICAgIH0NCisgIH0gZWxzZSB7DQorICAgIGlQYWdlQ291bnQgPSBpUGFnZU51bTsNCisgIH0NCisgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KKyAgaWYgKGhWYWx1ZSkgew0KKyAgICBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKGhWYWx1ZSwgaVBhZ2VDb3VudCk7DQorICB9DQorfQ0KK3ZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1BhZ2VDb3VudCgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX051bWJlcmVkUGFnZUNvdW50KHBBcmd1bWVudHMsIFRSVUUpOw0KK30NCit2b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlU3BhbigNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCAhPSAxKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwicGFnZVNwYW4iKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQorICBpZiAoaUxlbmd0aCA+PSAxKSB7DQorICAgIHBOb2RlID0gKENYRkFfTm9kZSopcEFyZ3VtZW50cy0+R2V0T2JqZWN0KDApOw0KKyAgfQ0KKyAgaWYgKCFwTm9kZSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCA9IG1fcERvY3VtZW50LT5HZXREb2NMYXlvdXQoKTsNCisgIGlmICghcERvY0xheW91dCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCisgIENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0gPSBwRG9jTGF5b3V0LT5HZXRMYXlvdXRJdGVtKHBOb2RlKTsNCisgIGlmICghcExheW91dEl0ZW0pIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIC0xKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpTGFzdCA9IHBMYXlvdXRJdGVtLT5HZXRMYXN0KCktPkdldFBhZ2UoKS0+R2V0UGFnZUluZGV4KCk7DQorICBpbnQzMl90IGlGaXJzdCA9IHBMYXlvdXRJdGVtLT5HZXRGaXJzdCgpLT5HZXRQYWdlKCktPkdldFBhZ2VJbmRleCgpOw0KKyAgaW50MzJfdCBpUGFnZVNwYW4gPSBpTGFzdCAtIGlGaXJzdCArIDE7DQorICBpZiAoaFZhbHVlKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBpUGFnZVNwYW4pOw0KKyAgfQ0KK30NCit2b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUGFnZUltcChwQXJndW1lbnRzLCBGQUxTRSk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0dldE9iakFycmF5KA0KKyAgICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCwNCisgICAgaW50MzJfdCBpUGFnZU5vLA0KKyAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUeXBlLA0KKyAgICBGWF9CT09MIGJPblBhZ2VBcmVhLA0KKyAgICBDWEZBX05vZGVBcnJheSYgcmV0QXJyYXkpIHsNCisgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcExheW91dFBhZ2UgPQ0KKyAgICAgIChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qKXBEb2NMYXlvdXQtPkdldFBhZ2UoaVBhZ2VObyk7DQorICBpZiAoIXBMYXlvdXRQYWdlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGlmICh3c1R5cGUgPT0gRlhfV1NUUkMoTCJwYWdlQXJlYSIpKSB7DQorICAgIGlmIChDWEZBX05vZGUqIHBNYXN0ZXJQYWdlID0gcExheW91dFBhZ2UtPm1fcEZvcm1Ob2RlKSB7DQorICAgICAgcmV0QXJyYXkuQWRkKHBNYXN0ZXJQYWdlKTsNCisgICAgfQ0KKyAgICByZXR1cm47DQorICB9DQorICBpZiAod3NUeXBlID09IEZYX1dTVFJDKEwiY29udGVudEFyZWEiKSkgew0KKyAgICBmb3IgKENYRkFfTGF5b3V0SXRlbSogcEl0ZW0gPSBwTGF5b3V0UGFnZS0+bV9wRmlyc3RDaGlsZDsgcEl0ZW07DQorICAgICAgICAgcEl0ZW0gPSBwSXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgICBpZiAocEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpIHsNCisgICAgICAgIHJldEFycmF5LkFkZChwSXRlbS0+bV9wRm9ybU5vZGUpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfTWFwUHRyVG9QdHIgZm9ybUl0ZW1zOw0KKyAgZm9ybUl0ZW1zLkluaXRIYXNoVGFibGUoMjU2LCBUUlVFKTsNCisgIGlmICh3c1R5cGUuSXNFbXB0eSgpKSB7DQorICAgIGlmIChDWEZBX05vZGUqIHBNYXN0ZXJQYWdlID0gcExheW91dFBhZ2UtPm1fcEZvcm1Ob2RlKSB7DQorICAgICAgcmV0QXJyYXkuQWRkKHBNYXN0ZXJQYWdlKTsNCisgICAgfQ0KKyAgICBmb3IgKENYRkFfTGF5b3V0SXRlbSogcEl0ZW0gPSBwTGF5b3V0UGFnZS0+bV9wRmlyc3RDaGlsZDsgcEl0ZW07DQorICAgICAgICAgcEl0ZW0gPSBwSXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsNCisgICAgICBpZiAocEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfQ29udGVudEFyZWEpIHsNCisgICAgICAgIHJldEFycmF5LkFkZChwSXRlbS0+bV9wRm9ybU5vZGUpOw0KKyAgICAgICAgaWYgKCFiT25QYWdlQXJlYSkgew0KKyAgICAgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0NvbnRlbnRMYXlvdXRJdGVtPg0KKyAgICAgICAgICBpdGVyYXRvcigoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcEl0ZW0tPm1fcEZpcnN0Q2hpbGQpOw0KKyAgICAgICAgICBmb3IgKENYRkFfQ29udGVudExheW91dEl0ZW0qIHBJdGVtQ2hpbGQgPSBpdGVyYXRvci5HZXRDdXJyZW50KCk7DQorICAgICAgICAgICAgICAgcEl0ZW1DaGlsZDsgcEl0ZW1DaGlsZCA9IGl0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICAgICAgICAgIGlmICghcEl0ZW1DaGlsZC0+SXNDb250ZW50TGF5b3V0SXRlbSgpKSB7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgWEZBX0VMRU1FTlQgZUVsZW1lbnRUeXBlID0gcEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKTsNCisgICAgICAgICAgICBpZiAoZUVsZW1lbnRUeXBlICE9IFhGQV9FTEVNRU5UX0ZpZWxkICYmDQorICAgICAgICAgICAgICAgIGVFbGVtZW50VHlwZSAhPSBYRkFfRUxFTUVOVF9EcmF3ICYmDQorICAgICAgICAgICAgICAgIGVFbGVtZW50VHlwZSAhPSBYRkFfRUxFTUVOVF9TdWJmb3JtICYmDQorICAgICAgICAgICAgICAgIGVFbGVtZW50VHlwZSAhPSBYRkFfRUxFTUVOVF9BcmVhKSB7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKGZvcm1JdGVtcy5HZXRWYWx1ZUF0KHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlKSkgew0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZvcm1JdGVtcy5TZXRBdChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSwgdGhpcyk7DQorICAgICAgICAgICAgcmV0QXJyYXkuQWRkKHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBpZiAoYk9uUGFnZUFyZWEpIHsNCisgICAgICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfVHJhdmVyc2VTdHJhdGVneV9Db250ZW50TGF5b3V0SXRlbT4NCisgICAgICAgICAgaXRlcmF0b3IoKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBJdGVtKTsNCisgICAgICAgICAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwSXRlbUNoaWxkID0gaXRlcmF0b3IuR2V0Q3VycmVudCgpOw0KKyAgICAgICAgICAgICAgIHBJdGVtQ2hpbGQ7IHBJdGVtQ2hpbGQgPSBpdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsNCisgICAgICAgICAgICBpZiAoIXBJdGVtQ2hpbGQtPklzQ29udGVudExheW91dEl0ZW0oKSkgew0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIFhGQV9FTEVNRU5UIGVFbGVtZW50VHlwZSA9IHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCk7DQorICAgICAgICAgICAgaWYgKGVFbGVtZW50VHlwZSAhPSBYRkFfRUxFTUVOVF9GaWVsZCAmJg0KKyAgICAgICAgICAgICAgICBlRWxlbWVudFR5cGUgIT0gWEZBX0VMRU1FTlRfRHJhdyAmJg0KKyAgICAgICAgICAgICAgICBlRWxlbWVudFR5cGUgIT0gWEZBX0VMRU1FTlRfU3ViZm9ybSAmJg0KKyAgICAgICAgICAgICAgICBlRWxlbWVudFR5cGUgIT0gWEZBX0VMRU1FTlRfQXJlYSkgew0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChmb3JtSXRlbXMuR2V0VmFsdWVBdChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSkpIHsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmb3JtSXRlbXMuU2V0QXQocEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUsIHRoaXMpOw0KKyAgICAgICAgICAgIHJldEFycmF5LkFkZChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSk7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgWEZBX0VMRU1FTlQgZVR5cGUgPSBYRkFfRUxFTUVOVF9VTktOT1dOOw0KKyAgaWYgKHdzVHlwZSA9PSBGWF9XU1RSQyhMImZpZWxkIikpIHsNCisgICAgZVR5cGUgPSBYRkFfRUxFTUVOVF9GaWVsZDsNCisgIH0gZWxzZSBpZiAod3NUeXBlID09IEZYX1dTVFJDKEwiZHJhdyIpKSB7DQorICAgIGVUeXBlID0gWEZBX0VMRU1FTlRfRHJhdzsNCisgIH0gZWxzZSBpZiAod3NUeXBlID09IEZYX1dTVFJDKEwic3ViZm9ybSIpKSB7DQorICAgIGVUeXBlID0gWEZBX0VMRU1FTlRfU3ViZm9ybTsNCisgIH0gZWxzZSBpZiAod3NUeXBlID09IEZYX1dTVFJDKEwiYXJlYSIpKSB7DQorICAgIGVUeXBlID0gWEZBX0VMRU1FTlRfQXJlYTsNCisgIH0NCisgIGlmIChlVHlwZSAhPSBYRkFfRUxFTUVOVF9VTktOT1dOKSB7DQorICAgIGZvciAoQ1hGQV9MYXlvdXRJdGVtKiBwSXRlbSA9IHBMYXlvdXRQYWdlLT5tX3BGaXJzdENoaWxkOyBwSXRlbTsNCisgICAgICAgICBwSXRlbSA9IHBJdGVtLT5tX3BOZXh0U2libGluZykgew0KKyAgICAgIGlmIChwSXRlbS0+bV9wRm9ybU5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9Db250ZW50QXJlYSkgew0KKyAgICAgICAgaWYgKCFiT25QYWdlQXJlYSkgew0KKyAgICAgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0NvbnRlbnRMYXlvdXRJdGVtPg0KKyAgICAgICAgICBpdGVyYXRvcigoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcEl0ZW0tPm1fcEZpcnN0Q2hpbGQpOw0KKyAgICAgICAgICBmb3IgKENYRkFfQ29udGVudExheW91dEl0ZW0qIHBJdGVtQ2hpbGQgPSBpdGVyYXRvci5HZXRDdXJyZW50KCk7DQorICAgICAgICAgICAgICAgcEl0ZW1DaGlsZDsgcEl0ZW1DaGlsZCA9IGl0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICAgICAgICAgIGlmICghcEl0ZW1DaGlsZC0+SXNDb250ZW50TGF5b3V0SXRlbSgpKSB7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgIT0gZVR5cGUpIHsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoZm9ybUl0ZW1zLkdldFZhbHVlQXQocEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUpKSB7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZm9ybUl0ZW1zLlNldEF0KHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlLCB0aGlzKTsNCisgICAgICAgICAgICByZXRBcnJheS5BZGQocEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChiT25QYWdlQXJlYSkgew0KKyAgICAgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW0sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0NvbnRlbnRMYXlvdXRJdGVtPg0KKyAgICAgICAgICBpdGVyYXRvcigoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcEl0ZW0pOw0KKyAgICAgICAgICBmb3IgKENYRkFfQ29udGVudExheW91dEl0ZW0qIHBJdGVtQ2hpbGQgPSBpdGVyYXRvci5HZXRDdXJyZW50KCk7DQorICAgICAgICAgICAgICAgcEl0ZW1DaGlsZDsgcEl0ZW1DaGlsZCA9IGl0ZXJhdG9yLk1vdmVUb05leHQoKSkgew0KKyAgICAgICAgICAgIGlmICghcEl0ZW1DaGlsZC0+SXNDb250ZW50TGF5b3V0SXRlbSgpKSB7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRDbGFzc0lEKCkgIT0gZVR5cGUpIHsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoZm9ybUl0ZW1zLkdldFZhbHVlQXQocEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUpKSB7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZm9ybUl0ZW1zLlNldEF0KHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlLCB0aGlzKTsNCisgICAgICAgICAgICByZXRBcnJheS5BZGQocEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybjsNCisgIH0NCit9DQordm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUGFnZUNvbnRlbnQoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggPCAxIHx8IGlMZW5ndGggPiAzKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwicGFnZUNvbnRlbnQiKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaW50MzJfdCBpSW5kZXggPSAwOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NUeXBlOw0KKyAgRlhfQk9PTCBiT25QYWdlQXJlYSA9IEZBTFNFOw0KKyAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICBpSW5kZXggPSBwQXJndW1lbnRzLT5HZXRJbnQzMigwKTsNCisgIH0NCisgIGlmIChpTGVuZ3RoID49IDIpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNUeXBlID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygxKTsNCisgICAgd3NUeXBlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVHlwZSwgYnNUeXBlLkdldExlbmd0aCgpKTsNCisgIH0NCisgIGlmIChpTGVuZ3RoID49IDMpIHsNCisgICAgYk9uUGFnZUFyZWEgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigyKSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KKyAgfQ0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfRG9jTGF5b3V0KiBwRG9jTGF5b3V0ID0gbV9wRG9jdW1lbnQtPkdldERvY0xheW91dCgpOw0KKyAgaWYgKCFwRG9jTGF5b3V0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfTm9kZUFycmF5IHJldEFycmF5Ow0KKyAgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0dldE9iakFycmF5KHBEb2NMYXlvdXQsIGlJbmRleCwgd3NUeXBlLCBiT25QYWdlQXJlYSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRBcnJheSk7DQorICBDWEZBX0FycmF5Tm9kZUxpc3QqIHBBcnJheU5vZGVMaXN0ID0gbmV3IENYRkFfQXJyYXlOb2RlTGlzdChtX3BEb2N1bWVudCk7DQorICBwQXJyYXlOb2RlTGlzdC0+U2V0QXJyYXlOb2RlTGlzdChyZXRBcnJheSk7DQorICBGWEpTRV9WYWx1ZV9TZXRPYmplY3QocEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAoQ1hGQV9PYmplY3QqKXBBcnJheU5vZGVMaXN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpzZU5vcm1hbENsYXNzKCkpOw0KK30NCit2b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9BYnNQYWdlQ291bnQoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9OdW1iZXJlZFBhZ2VDb3VudChwQXJndW1lbnRzLCBGQUxTRSk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0Fic1BhZ2VDb3VudEluQmF0Y2goDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX0RvYyogaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCisgIGludDMyX3QgaVBhZ2VDb3VudCA9IHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPkFic1BhZ2VDb3VudEluQmF0Y2goaERvYyk7DQorICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCisgIGlmIChoVmFsdWUpIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIGlQYWdlQ291bnQpOw0KKyAgfQ0KK30NCit2b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9TaGVldENvdW50SW5CYXRjaCgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KKyAgaW50MzJfdCBpUGFnZUNvdW50ID0gcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+U2hlZXRDb3VudEluQmF0Y2goaERvYyk7DQorICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCisgIGlmIChoVmFsdWUpIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIGlQYWdlQ291bnQpOw0KKyAgfQ0KK30NCit2b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9SZWxheW91dCgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgQ1hGQV9Ob2RlKiBwUm9vdE5vZGUgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpOw0KKyAgQ1hGQV9Ob2RlKiBwRm9ybVJvb3QgPSBwUm9vdE5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FTEVNRU5UX0Zvcm0pOw0KKyAgRlhTWVNfYXNzZXJ0KHBGb3JtUm9vdCk7DQorICBDWEZBX05vZGUqIHBDb250ZW50Um9vdE5vZGUgPSBwRm9ybVJvb3QtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvY2Vzc29yID0gbV9wRG9jdW1lbnQtPkdldExheW91dFByb2Nlc3NvcigpOw0KKyAgaWYgKHBDb250ZW50Um9vdE5vZGUpIHsNCisgICAgcExheW91dFByb2Nlc3Nvci0+QWRkQ2hhbmdlZENvbnRhaW5lcihwQ29udGVudFJvb3ROb2RlKTsNCisgIH0NCisgIHBMYXlvdXRQcm9jZXNzb3ItPlNldEZvcmNlUmVMYXlvdXQoVFJVRSk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0Fic1BhZ2VTcGFuKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUGFnZVNwYW4ocEFyZ3VtZW50cyk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0Fic1BhZ2VJbkJhdGNoKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoICE9IDEpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJhYnNQYWdlSW5CYXRjaCIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCisgIGlmIChpTGVuZ3RoID49IDEpIHsNCisgICAgcE5vZGUgPSAoQ1hGQV9Ob2RlKilwQXJndW1lbnRzLT5HZXRPYmplY3QoMCk7DQorICB9DQorICBpZiAoIXBOb2RlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCA9IG1fcERvY3VtZW50LT5HZXREb2NMYXlvdXQoKTsNCisgIGlmICghcERvY0xheW91dCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX1dpZGdldCogaFdpZGdldCA9IHBOb3RpZnktPkdldEhXaWRnZXQocERvY0xheW91dC0+R2V0TGF5b3V0SXRlbShwTm9kZSkpOw0KKyAgaWYgKCFoV2lkZ2V0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KKyAgaW50MzJfdCBpUGFnZUNvdW50ID0gcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+QWJzUGFnZUluQmF0Y2goaERvYywgaFdpZGdldCk7DQorICBGWEpTRV9IVkFMVUUgaFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsNCisgIGlmIChoVmFsdWUpIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIGlQYWdlQ291bnQpOw0KKyAgfQ0KK30NCit2b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9TaGVldEluQmF0Y2goDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggIT0gMSkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMInNoZWV0SW5CYXRjaCIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCisgIGlmIChpTGVuZ3RoID49IDEpIHsNCisgICAgcE5vZGUgPSAoQ1hGQV9Ob2RlKilwQXJndW1lbnRzLT5HZXRPYmplY3QoMCk7DQorICB9DQorICBpZiAoIXBOb2RlKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX0RvY0xheW91dCogcERvY0xheW91dCA9IG1fcERvY3VtZW50LT5HZXREb2NMYXlvdXQoKTsNCisgIGlmICghcERvY0xheW91dCkgew0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX1dpZGdldCogaFdpZGdldCA9IHBOb3RpZnktPkdldEhXaWRnZXQocERvY0xheW91dC0+R2V0TGF5b3V0SXRlbShwTm9kZSkpOw0KKyAgaWYgKCFoV2lkZ2V0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KKyAgaW50MzJfdCBpUGFnZUNvdW50ID0gcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+U2hlZXRJbkJhdGNoKGhEb2MsIGhXaWRnZXQpOw0KKyAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQorICBpZiAoaFZhbHVlKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBpUGFnZUNvdW50KTsNCisgIH0NCit9DQordm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfU2hlZXQoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlSW1wKHBBcmd1bWVudHMsIFRSVUUpOw0KK30NCit2b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9SZWxheW91dFBhZ2VBcmVhKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7fQ0KK3ZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1NoZWV0Q291bnQoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9OdW1iZXJlZFBhZ2VDb3VudChwQXJndW1lbnRzLCBGQUxTRSk7DQorfQ0KK3ZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0Fic1BhZ2UoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlSW1wKHBBcmd1bWVudHMsIFRSVUUpOw0KK30NCit2b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlSW1wKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzLA0KKyAgICBGWF9CT09MIGJBYnNQYWdlKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoICE9IDEpIHsNCisgICAgY29uc3QgRlhfV0NIQVIqIG1ldGhvZE5hbWU7DQorICAgIGlmIChiQWJzUGFnZSkgew0KKyAgICAgIG1ldGhvZE5hbWUgPSBMImFic1BhZ2UiOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG1ldGhvZE5hbWUgPSBMInBhZ2UiOw0KKyAgICB9DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIG1ldGhvZE5hbWUpOw0KKyAgICByZXR1cm47DQorICB9DQorICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCisgIGlmIChpTGVuZ3RoID49IDEpIHsNCisgICAgcE5vZGUgPSAoQ1hGQV9Ob2RlKilwQXJndW1lbnRzLT5HZXRPYmplY3QoMCk7DQorICB9DQorICBpbnQzMl90IGlQYWdlID0gMDsNCisgIEZYSlNFX0hWQUxVRSBoVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOw0KKyAgaWYgKCFwTm9kZSAmJiBoVmFsdWUpIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIGlQYWdlKTsNCisgIH0NCisgIElYRkFfRG9jTGF5b3V0KiBwRG9jTGF5b3V0ID0gbV9wRG9jdW1lbnQtPkdldERvY0xheW91dCgpOw0KKyAgaWYgKCFwRG9jTGF5b3V0KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0gPSBwRG9jTGF5b3V0LT5HZXRMYXlvdXRJdGVtKHBOb2RlKTsNCisgIGlmICghcExheW91dEl0ZW0pIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIC0xKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaVBhZ2UgPSBwTGF5b3V0SXRlbS0+R2V0Rmlyc3QoKS0+R2V0UGFnZSgpLT5HZXRQYWdlSW5kZXgoKTsNCisgIGlmIChoVmFsdWUpIHsNCisgICAgRlhKU0VfVmFsdWVfU2V0SW50ZWdlcihoVmFsdWUsIGJBYnNQYWdlID8gaVBhZ2UgOiBpUGFnZSArIDEpOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2xheW91dHBzZXVkb21vZGVsLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2xheW91dHBzZXVkb21vZGVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzODhiZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfbGF5b3V0cHNldWRvbW9kZWwuaApAQCAtMCwwICsxLDU4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1NDUklQVF9MQVlPVVRQU0VVRE9NT0RFTF9IXw0KKyNkZWZpbmUgX1NDUklQVF9MQVlPVVRQU0VVRE9NT0RFTF9IXw0KK2VudW0gWEZBX0xBWU9VVE1PREVMX0hXWFkgew0KKyAgWEZBX0xBWU9VVE1PREVMX0gsDQorICBYRkFfTEFZT1VUTU9ERUxfVywNCisgIFhGQV9MQVlPVVRNT0RFTF9YLA0KKyAgWEZBX0xBWU9VVE1PREVMX1kNCit9Ow0KK2NsYXNzIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWwgOiBwdWJsaWMgQ1hGQV9PcmRpbmFyeU9iamVjdCB7DQorIHB1YmxpYzoNCisgIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWwoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsNCisgIH5DU2NyaXB0X0xheW91dFBzZXVkb01vZGVsKCk7DQorDQorICB2b2lkIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9SZWFkeShGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiU2V0dGluZywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7DQorDQorICB2b2lkIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9IV1hZKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MQVlPVVRNT0RFTF9IV1hZIGxheW91dE1vZGVsKTsNCisgIHZvaWQgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0goQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9XKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfWChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1koQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9OdW1iZXJlZFBhZ2VDb3VudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiTnVtYmVyZWQpOw0KKyAgdm9pZCBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUGFnZUNvdW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUGFnZVNwYW4oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfUGFnZUNvbnRlbnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9BYnNQYWdlQ291bnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9BYnNQYWdlQ291bnRJbkJhdGNoKA0KKyAgICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfU2hlZXRDb3VudEluQmF0Y2goQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9SZWxheW91dChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX0Fic1BhZ2VTcGFuKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfQWJzUGFnZUluQmF0Y2goQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9TaGVldEluQmF0Y2goQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9TaGVldChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X0xheW91dFBzZXVkb01vZGVsX1JlbGF5b3V0UGFnZUFyZWEoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9TaGVldENvdW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfQWJzUGFnZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgdm9pZCBTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWxfR2V0T2JqQXJyYXkoSVhGQV9Eb2NMYXlvdXQqIHBEb2NMYXlvdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQYWdlTm8sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiT25QYWdlQXJlYSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZUFycmF5JiByZXRBcnJheSk7DQorICB2b2lkIFNjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbF9QYWdlSW1wKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkFic1BhZ2UpOw0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9sb2dwc2V1ZG9tb2RlbC5jcHAgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2xvZ3BzZXVkb21vZGVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTBkMTQ4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9sb2dwc2V1ZG9tb2RlbC5jcHAKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfdXRpbHMuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX29iamVjdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jdW1lbnQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3BhcnNlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfc2NyaXB0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NkYXRhLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NsYXlvdXQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2xvY2FsZW1nci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZm0yanNhcGkuaCINCisjaW5jbHVkZSAieGZhX3NjcmlwdF9sb2dwc2V1ZG9tb2RlbC5oIg0KK0NTY3JpcHRfTG9nUHNldWRvTW9kZWw6OkNTY3JpcHRfTG9nUHNldWRvTW9kZWwoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KQ0KKyAgICA6IENYRkFfT3JkaW5hcnlPYmplY3QocERvY3VtZW50LCBYRkFfRUxFTUVOVF9Mb2dQc2V1ZG9Nb2RlbCkgew0KKyAgbV91U2NyaXB0SGFzaCA9IFhGQV9IQVNIQ09ERV9Mb2c7DQorfQ0KK0NTY3JpcHRfTG9nUHNldWRvTW9kZWw6On5DU2NyaXB0X0xvZ1BzZXVkb01vZGVsKCkge30NCit2b2lkIENTY3JpcHRfTG9nUHNldWRvTW9kZWw6OlNjcmlwdF9Mb2dQc2V1ZG9Nb2RlbF9NZXNzYWdlKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7fQ0KK3ZvaWQgQ1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xvZ1BzZXVkb01vZGVsX1RyYWNlRW5hYmxlZCgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykge30NCit2b2lkIENTY3JpcHRfTG9nUHNldWRvTW9kZWw6OlNjcmlwdF9Mb2dQc2V1ZG9Nb2RlbF9UcmFjZUFjdGl2YXRlKA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7fQ0KK3ZvaWQgQ1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbDo6U2NyaXB0X0xvZ1BzZXVkb01vZGVsX1RyYWNlRGVhY3RpdmF0ZSgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykge30NCit2b2lkIENTY3JpcHRfTG9nUHNldWRvTW9kZWw6OlNjcmlwdF9Mb2dQc2V1ZG9Nb2RlbF9UcmFjZSgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykge30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2xvZ3BzZXVkb21vZGVsLmggYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X2xvZ3BzZXVkb21vZGVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA1NTE2ZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfbG9ncHNldWRvbW9kZWwuaApAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1NDUklQVF9MT0dQU0VVRE9NT0RFTF9IXw0KKyNkZWZpbmUgX1NDUklQVF9MT0dQU0VVRE9NT0RFTF9IXw0KK2NsYXNzIENTY3JpcHRfTG9nUHNldWRvTW9kZWwgOiBwdWJsaWMgQ1hGQV9PcmRpbmFyeU9iamVjdCB7DQorIHB1YmxpYzoNCisgIENTY3JpcHRfTG9nUHNldWRvTW9kZWwoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsNCisgIHZpcnR1YWwgfkNTY3JpcHRfTG9nUHNldWRvTW9kZWwoKTsNCisNCisgIHZvaWQgU2NyaXB0X0xvZ1BzZXVkb01vZGVsX01lc3NhZ2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Mb2dQc2V1ZG9Nb2RlbF9UcmFjZUVuYWJsZWQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9Mb2dQc2V1ZG9Nb2RlbF9UcmFjZUFjdGl2YXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTG9nUHNldWRvTW9kZWxfVHJhY2VEZWFjdGl2YXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOw0KKyAgdm9pZCBTY3JpcHRfTG9nUHNldWRvTW9kZWxfVHJhY2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X25vZGVoZWxwZXIuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ub2RlaGVscGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmNlZWI1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9ub2RlaGVscGVyLmNwcApAQCAtMCwwICsxLDQzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfdXRpbHMuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX29iamVjdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jdW1lbnQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3BhcnNlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfc2NyaXB0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NkYXRhLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NsYXlvdXQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2xvY2FsZW1nci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZm0yanNhcGkuaCINCisjaW5jbHVkZSAieGZhX3NjcmlwdF9ub2RlaGVscGVyLmgiDQorI2luY2x1ZGUgInhmYV9zY3JpcHRfaW1wLmgiDQorQ1hGQV9Ob2RlSGVscGVyOjpDWEZBX05vZGVIZWxwZXIodm9pZCkNCisgICAgOiBtX2VMYXN0Q3JlYXRlVHlwZShYRkFfRUxFTUVOVF9EYXRhVmFsdWUpLA0KKyAgICAgIG1fcENyZWF0ZVBhcmVudChOVUxMKSwNCisgICAgICBtX2lDcmVhdGVDb3VudCgwKSwNCisgICAgICBtX2lDcmVhdGVGbGFnKFhGQV9SRVNPTFZFTk9ERV9SU1RZUEVfQ3JlYXRlTm9kZU9uZSksDQorICAgICAgbV9pQ3VyQWxsU3RhcnQoLTEpLA0KKyAgICAgIG1fcEFsbFN0YXJ0UGFyZW50KE5VTEwpIHt9DQorQ1hGQV9Ob2RlSGVscGVyOjp+Q1hGQV9Ob2RlSGVscGVyKHZvaWQpIHt9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGVIZWxwZXI6OlhGQV9SZXNvbHZlTm9kZXNfR2V0T25lQ2hpbGQoDQorICAgIENYRkFfTm9kZSogcGFyZW50LA0KKyAgICBjb25zdCBGWF9XQ0hBUiogcHdzTmFtZSwNCisgICAgRlhfQk9PTCBiSXNDbGFzc05hbWUpIHsNCisgIGlmIChwYXJlbnQgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENYRkFfTm9kZUFycmF5IHNpYmxpbmdzOw0KKyAgdWludDMyX3QgdU5hbWVIYXNoID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcocHdzTmFtZSwgRlhTWVNfd2NzbGVuKHB3c05hbWUpKTsNCisgIFhGQV9Ob2RlQWNjX1RyYXZlcnNlQW55U2libGluZ3MocGFyZW50LCB1TmFtZUhhc2gsICZzaWJsaW5ncywgYklzQ2xhc3NOYW1lKTsNCisgIGlmIChzaWJsaW5ncy5HZXRTaXplKCkgPT0gMCkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBzaWJsaW5nc1swXTsNCit9DQoraW50MzJfdCBDWEZBX05vZGVIZWxwZXI6OlhGQV9Db3VudFNpYmxpbmdzKENYRkFfTm9kZSogcE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MT0dJQ19UWVBFIGVMb2dpY1R5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZUFycmF5KiBwU2libGluZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYklzQ2xhc3NOYW1lKSB7DQorICBDWEZBX05vZGUqIHBhcmVudCA9DQorICAgICAgWEZBX1Jlc29sdmVOb2Rlc19HZXRQYXJlbnQocE5vZGUsIFhGQV9MT0dJQ19Ob1RyYW5zcGFyZW50KTsNCisgIGlmIChwYXJlbnQgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIFhGQV9MUENQUk9QRVJUWSBwUHJvcGVydCA9IFhGQV9HZXRQcm9wZXJ0eU9mRWxlbWVudCgNCisgICAgICBwYXJlbnQtPkdldENsYXNzSUQoKSwgcE5vZGUtPkdldENsYXNzSUQoKSwgWEZBX1hEUFBBQ0tFVF9VTktOT1dOKTsNCisgIGlmICghcFByb3BlcnQgJiYgZUxvZ2ljVHlwZSA9PSBYRkFfTE9HSUNfVHJhbnNwYXJlbnQpIHsNCisgICAgcGFyZW50ID0gWEZBX1Jlc29sdmVOb2Rlc19HZXRQYXJlbnQocE5vZGUsIFhGQV9MT0dJQ19UcmFuc3BhcmVudCk7DQorICAgIGlmIChwYXJlbnQgPT0gTlVMTCkgew0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICB9DQorICBpZiAoYklzQ2xhc3NOYW1lKSB7DQorICAgIHJldHVybiBYRkFfTm9kZUFjY19UcmF2ZXJzZVNpYmxpbmdzKHBhcmVudCwgcE5vZGUtPkdldENsYXNzSGFzaENvZGUoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNpYmxpbmdzLCBlTG9naWNUeXBlLCBiSXNDbGFzc05hbWUpOw0KKyAgfSBlbHNlIHsNCisgICAgcmV0dXJuIFhGQV9Ob2RlQWNjX1RyYXZlcnNlU2libGluZ3MocGFyZW50LCBwTm9kZS0+R2V0TmFtZUhhc2goKSwgcFNpYmxpbmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlTG9naWNUeXBlLCBiSXNDbGFzc05hbWUpOw0KKyAgfQ0KK30NCitpbnQzMl90IENYRkFfTm9kZUhlbHBlcjo6WEZBX05vZGVBY2NfVHJhdmVyc2VBbnlTaWJsaW5ncygNCisgICAgQ1hGQV9Ob2RlKiBwYXJlbnQsDQorICAgIEZYX0RXT1JEIGROYW1lSGFzaCwNCisgICAgQ1hGQV9Ob2RlQXJyYXkqIHBTaWJsaW5ncywNCisgICAgRlhfQk9PTCBiSXNDbGFzc05hbWUpIHsNCisgIGlmIChwYXJlbnQgPT0gTlVMTCB8fCBwU2libGluZ3MgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGludDMyX3QgbkNvdW50ID0gMDsNCisgIGludDMyX3QgaSA9IDA7DQorICBDWEZBX05vZGVBcnJheSBwcm9wZXJ0aWVzOw0KKyAgcGFyZW50LT5HZXROb2RlTGlzdChwcm9wZXJ0aWVzLCBYRkFfTk9ERUZJTFRFUl9Qcm9wZXJ0aWVzKTsNCisgIGludDMyX3QgblByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLkdldFNpemUoKTsNCisgIGZvciAoaSA9IDA7IGkgPCBuUHJvcGVydGllczsgKytpKSB7DQorICAgIENYRkFfTm9kZSogY2hpbGQgPSBwcm9wZXJ0aWVzW2ldOw0KKyAgICBpZiAoYklzQ2xhc3NOYW1lKSB7DQorICAgICAgaWYgKGNoaWxkLT5HZXRDbGFzc0hhc2hDb2RlKCkgPT0gZE5hbWVIYXNoKSB7DQorICAgICAgICBwU2libGluZ3MtPkFkZChjaGlsZCk7DQorICAgICAgICBuQ291bnQrKzsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKGNoaWxkLT5HZXROYW1lSGFzaCgpID09IGROYW1lSGFzaCkgew0KKyAgICAgICAgcFNpYmxpbmdzLT5BZGQoY2hpbGQpOw0KKyAgICAgICAgbkNvdW50Kys7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChuQ291bnQgPiAwKSB7DQorICAgICAgcmV0dXJuIG5Db3VudDsNCisgICAgfQ0KKyAgICBuQ291bnQgKz0gWEZBX05vZGVBY2NfVHJhdmVyc2VBbnlTaWJsaW5ncyhjaGlsZCwgZE5hbWVIYXNoLCBwU2libGluZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJc0NsYXNzTmFtZSk7DQorICB9DQorICBDWEZBX05vZGVBcnJheSBjaGlsZHJlbjsNCisgIHBhcmVudC0+R2V0Tm9kZUxpc3QoY2hpbGRyZW4sIFhGQV9OT0RFRklMVEVSX0NoaWxkcmVuKTsNCisgIGludDMyX3QgbkNoaWxkcmVuID0gY2hpbGRyZW4uR2V0U2l6ZSgpOw0KKyAgZm9yIChpID0gMDsgaSA8IG5DaGlsZHJlbjsgaSsrKSB7DQorICAgIENYRkFfTm9kZSogY2hpbGQgPSBjaGlsZHJlbltpXTsNCisgICAgaWYgKGJJc0NsYXNzTmFtZSkgew0KKyAgICAgIGlmIChjaGlsZC0+R2V0Q2xhc3NIYXNoQ29kZSgpID09IGROYW1lSGFzaCkgew0KKyAgICAgICAgaWYgKHBTaWJsaW5ncykgew0KKyAgICAgICAgICBwU2libGluZ3MtPkFkZChjaGlsZCk7DQorICAgICAgICB9DQorICAgICAgICBuQ291bnQrKzsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgaWYgKGNoaWxkLT5HZXROYW1lSGFzaCgpID09IGROYW1lSGFzaCkgew0KKyAgICAgICAgaWYgKHBTaWJsaW5ncykgew0KKyAgICAgICAgICBwU2libGluZ3MtPkFkZChjaGlsZCk7DQorICAgICAgICB9DQorICAgICAgICBuQ291bnQrKzsNCisgICAgICB9DQorICAgIH0NCisgICAgaWYgKG5Db3VudCA+IDApIHsNCisgICAgICByZXR1cm4gbkNvdW50Ow0KKyAgICB9DQorICAgIG5Db3VudCArPSBYRkFfTm9kZUFjY19UcmF2ZXJzZUFueVNpYmxpbmdzKGNoaWxkLCBkTmFtZUhhc2gsIHBTaWJsaW5ncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYklzQ2xhc3NOYW1lKTsNCisgIH0NCisgIHJldHVybiBuQ291bnQ7DQorfQ0KK2ludDMyX3QgQ1hGQV9Ob2RlSGVscGVyOjpYRkFfTm9kZUFjY19UcmF2ZXJzZVNpYmxpbmdzKENYRkFfTm9kZSogcGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RXT1JEIGROYW1lSGFzaCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGVBcnJheSogcFNpYmxpbmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MT0dJQ19UWVBFIGVMb2dpY1R5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNDbGFzc05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNGaW5kUHJvcGVydHkpIHsNCisgIGlmIChwYXJlbnQgPT0gTlVMTCB8fCBwU2libGluZ3MgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGludDMyX3QgbkNvdW50ID0gMDsNCisgIGludDMyX3QgaSA9IDA7DQorICBpZiAoYklzRmluZFByb3BlcnR5KSB7DQorICAgIENYRkFfTm9kZUFycmF5IHByb3BlcnRpZXM7DQorICAgIHBhcmVudC0+R2V0Tm9kZUxpc3QocHJvcGVydGllcywgWEZBX05PREVGSUxURVJfUHJvcGVydGllcyk7DQorICAgIGludDMyX3QgblByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLkdldFNpemUoKTsNCisgICAgZm9yIChpID0gMDsgaSA8IG5Qcm9wZXJ0aWVzOyArK2kpIHsNCisgICAgICBDWEZBX05vZGUqIGNoaWxkID0gcHJvcGVydGllc1tpXTsNCisgICAgICBpZiAoYklzQ2xhc3NOYW1lKSB7DQorICAgICAgICBpZiAoY2hpbGQtPkdldENsYXNzSGFzaENvZGUoKSA9PSBkTmFtZUhhc2gpIHsNCisgICAgICAgICAgcFNpYmxpbmdzLT5BZGQoY2hpbGQpOw0KKyAgICAgICAgICBuQ291bnQrKzsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKGNoaWxkLT5HZXROYW1lSGFzaCgpID09IGROYW1lSGFzaCkgew0KKyAgICAgICAgICBpZiAoY2hpbGQtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9QYWdlU2V0ICYmDQorICAgICAgICAgICAgICBjaGlsZC0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0V4dHJhcyAmJg0KKyAgICAgICAgICAgICAgY2hpbGQtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9JdGVtcykgew0KKyAgICAgICAgICAgIHBTaWJsaW5ncy0+QWRkKGNoaWxkKTsNCisgICAgICAgICAgICBuQ291bnQrKzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBpZiAoY2hpbGQtPklzVW5uYW1lZCgpICYmIGNoaWxkLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfUGFnZVNldCkgew0KKyAgICAgICAgbkNvdW50ICs9IFhGQV9Ob2RlQWNjX1RyYXZlcnNlU2libGluZ3MoY2hpbGQsIGROYW1lSGFzaCwgcFNpYmxpbmdzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUxvZ2ljVHlwZSwgYklzQ2xhc3NOYW1lLCBGQUxTRSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChuQ291bnQgPiAwKSB7DQorICAgICAgcmV0dXJuIG5Db3VudDsNCisgICAgfQ0KKyAgfQ0KKyAgQ1hGQV9Ob2RlQXJyYXkgY2hpbGRyZW47DQorICBwYXJlbnQtPkdldE5vZGVMaXN0KGNoaWxkcmVuLCBYRkFfTk9ERUZJTFRFUl9DaGlsZHJlbik7DQorICBpbnQzMl90IG5DaGlsZHJlbiA9IGNoaWxkcmVuLkdldFNpemUoKTsNCisgIGZvciAoaSA9IDA7IGkgPCBuQ2hpbGRyZW47IGkrKykgew0KKyAgICBDWEZBX05vZGUqIGNoaWxkID0gY2hpbGRyZW5baV07DQorICAgIGlmIChjaGlsZC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1ZhcmlhYmxlcykgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIGlmIChiSXNDbGFzc05hbWUpIHsNCisgICAgICBpZiAoY2hpbGQtPkdldENsYXNzSGFzaENvZGUoKSA9PSBkTmFtZUhhc2gpIHsNCisgICAgICAgIGlmIChwU2libGluZ3MpIHsNCisgICAgICAgICAgcFNpYmxpbmdzLT5BZGQoY2hpbGQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbkNvdW50Kys7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGlmIChjaGlsZC0+R2V0TmFtZUhhc2goKSA9PSBkTmFtZUhhc2gpIHsNCisgICAgICAgIGlmIChwU2libGluZ3MpIHsNCisgICAgICAgICAgcFNpYmxpbmdzLT5BZGQoY2hpbGQpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgbkNvdW50Kys7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChlTG9naWNUeXBlID09IFhGQV9MT0dJQ19Ob1RyYW5zcGFyZW50KSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKFhGQV9Ob2RlSXNUcmFuc3BhcmVudChjaGlsZCkgJiYNCisgICAgICAgIGNoaWxkLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfUGFnZVNldCkgew0KKyAgICAgIG5Db3VudCArPSBYRkFfTm9kZUFjY19UcmF2ZXJzZVNpYmxpbmdzKGNoaWxkLCBkTmFtZUhhc2gsIHBTaWJsaW5ncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlTG9naWNUeXBlLCBiSXNDbGFzc05hbWUsIEZBTFNFKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIG5Db3VudDsNCit9DQorQ1hGQV9Ob2RlKiBDWEZBX05vZGVIZWxwZXI6OlhGQV9SZXNvbHZlTm9kZXNfR2V0UGFyZW50KA0KKyAgICBDWEZBX05vZGUqIHBOb2RlLA0KKyAgICBYRkFfTE9HSUNfVFlQRSBlTG9naWNUeXBlKSB7DQorICBpZiAoIXBOb2RlKSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgaWYgKGVMb2dpY1R5cGUgPT0gWEZBX0xPR0lDX05vVHJhbnNwYXJlbnQpIHsNCisgICAgcmV0dXJuIHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsNCisgIH0NCisgIENYRkFfTm9kZSogcGFyZW50Ow0KKyAgQ1hGQV9Ob2RlKiBub2RlID0gcE5vZGU7DQorICB3aGlsZSAoVFJVRSkgew0KKyAgICBwYXJlbnQgPSBYRkFfUmVzb2x2ZU5vZGVzX0dldFBhcmVudChub2RlKTsNCisgICAgaWYgKHBhcmVudCA9PSBOVUxMKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgWEZBX0VMRU1FTlQgcGFyZW50RWxlbWVudCA9IHBhcmVudC0+R2V0Q2xhc3NJRCgpOw0KKyAgICBpZiAoKCFwYXJlbnQtPklzVW5uYW1lZCgpICYmIHBhcmVudEVsZW1lbnQgIT0gWEZBX0VMRU1FTlRfU3ViZm9ybVNldCkgfHwNCisgICAgICAgIHBhcmVudEVsZW1lbnQgPT0gWEZBX0VMRU1FTlRfVmFyaWFibGVzKSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgbm9kZSA9IHBhcmVudDsNCisgIH0NCisgIHJldHVybiBwYXJlbnQ7DQorfQ0KK2ludDMyX3QgQ1hGQV9Ob2RlSGVscGVyOjpYRkFfR2V0SW5kZXgoQ1hGQV9Ob2RlKiBwTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MT0dJQ19UWVBFIGVMb2dpY1R5cGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJc1Byb3BlcnR5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNDbGFzc0luZGV4KSB7DQorICBDWEZBX05vZGUqIHBhcmVudCA9DQorICAgICAgWEZBX1Jlc29sdmVOb2Rlc19HZXRQYXJlbnQocE5vZGUsIFhGQV9MT0dJQ19Ob1RyYW5zcGFyZW50KTsNCisgIGlmIChwYXJlbnQgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGlmICghYklzUHJvcGVydHkgJiYgZUxvZ2ljVHlwZSA9PSBYRkFfTE9HSUNfVHJhbnNwYXJlbnQpIHsNCisgICAgcGFyZW50ID0gWEZBX1Jlc29sdmVOb2Rlc19HZXRQYXJlbnQocE5vZGUsIFhGQV9MT0dJQ19UcmFuc3BhcmVudCk7DQorICAgIGlmIChwYXJlbnQgPT0gTlVMTCkgew0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICB9DQorICBGWF9EV09SRCBkd0hhc2hOYW1lID0gcE5vZGUtPkdldE5hbWVIYXNoKCk7DQorICBpZiAoYklzQ2xhc3NJbmRleCkgew0KKyAgICBkd0hhc2hOYW1lID0gcE5vZGUtPkdldENsYXNzSGFzaENvZGUoKTsNCisgIH0NCisgIENYRkFfTm9kZUFycmF5IHNpYmxpbmdzOw0KKyAgaW50MzJfdCBpU2l6ZSA9IFhGQV9Ob2RlQWNjX1RyYXZlcnNlU2libGluZ3MocGFyZW50LCBkd0hhc2hOYW1lLCAmc2libGluZ3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlTG9naWNUeXBlLCBiSXNDbGFzc0luZGV4KTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTaXplOyArK2kpIHsNCisgICAgQ1hGQV9Ob2RlKiBjaGlsZCA9IHNpYmxpbmdzW2ldOw0KKyAgICBpZiAoY2hpbGQgPT0gcE5vZGUpIHsNCisgICAgICByZXR1cm4gaTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIDA7DQorfQ0KK3ZvaWQgQ1hGQV9Ob2RlSGVscGVyOjpYRkFfR2V0TmFtZUV4cHJlc3Npb24oQ1hGQV9Ob2RlKiByZWZOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYklzQWxsUGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MT0dJQ19UWVBFIGVMb2dpY1R5cGUpIHsNCisgIHdzTmFtZS5FbXB0eSgpOw0KKyAgaWYgKGJJc0FsbFBhdGgpIHsNCisgICAgWEZBX0dldE5hbWVFeHByZXNzaW9uKHJlZk5vZGUsIHdzTmFtZSwgRkFMU0UsIGVMb2dpY1R5cGUpOw0KKyAgICBDRlhfV2lkZVN0cmluZyB3c1BhcmVudDsNCisgICAgQ1hGQV9Ob2RlKiBwYXJlbnQgPQ0KKyAgICAgICAgWEZBX1Jlc29sdmVOb2Rlc19HZXRQYXJlbnQocmVmTm9kZSwgWEZBX0xPR0lDX05vVHJhbnNwYXJlbnQpOw0KKyAgICB3aGlsZSAocGFyZW50ICE9IE5VTEwpIHsNCisgICAgICBYRkFfR2V0TmFtZUV4cHJlc3Npb24ocGFyZW50LCB3c1BhcmVudCwgRkFMU0UsIGVMb2dpY1R5cGUpOw0KKyAgICAgIHdzUGFyZW50ICs9IEwiLiI7DQorICAgICAgd3NQYXJlbnQgKz0gd3NOYW1lOw0KKyAgICAgIHdzTmFtZSA9IHdzUGFyZW50Ow0KKyAgICAgIHBhcmVudCA9IFhGQV9SZXNvbHZlTm9kZXNfR2V0UGFyZW50KHBhcmVudCwgWEZBX0xPR0lDX05vVHJhbnNwYXJlbnQpOw0KKyAgICB9DQorICAgIHJldHVybjsNCisgIH0gZWxzZSB7DQorICAgIENGWF9XaWRlU3RyaW5nQyB3c1RhZ05hbWU7DQorICAgIENGWF9XaWRlU3RyaW5nIHdzOw0KKyAgICBGWF9CT09MIGJJc1Byb3BlcnR5ID0gWEZBX05vZGVJc1Byb3BlcnR5KHJlZk5vZGUpOw0KKyAgICBpZiAocmVmTm9kZS0+SXNVbm5hbWVkKCkgfHwNCisgICAgICAgIChiSXNQcm9wZXJ0eSAmJiByZWZOb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfUGFnZVNldCkpIHsNCisgICAgICByZWZOb2RlLT5HZXRDbGFzc05hbWUod3NUYWdOYW1lKTsNCisgICAgICB3cyA9IHdzVGFnTmFtZTsNCisgICAgICB3c05hbWUuRm9ybWF0KEwiIyVzWyVkXSIsIChjb25zdCBGWF9XQ0hBUiopd3MsDQorICAgICAgICAgICAgICAgICAgICBYRkFfR2V0SW5kZXgocmVmTm9kZSwgZUxvZ2ljVHlwZSwgYklzUHJvcGVydHksIFRSVUUpKTsNCisgICAgICByZXR1cm47DQorICAgIH0NCisgICAgd3MgPSByZWZOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOw0KKyAgICB3cy5SZXBsYWNlKEwiLiIsIEwiXFwuIik7DQorICAgIHdzTmFtZS5Gb3JtYXQoTCIlc1slZF0iLCAoY29uc3QgRlhfV0NIQVIqKXdzLA0KKyAgICAgICAgICAgICAgICAgIFhGQV9HZXRJbmRleChyZWZOb2RlLCBlTG9naWNUeXBlLCBiSXNQcm9wZXJ0eSwgRkFMU0UpKTsNCisgIH0NCit9DQorRlhfQk9PTCBDWEZBX05vZGVIZWxwZXI6OlhGQV9Ob2RlSXNUcmFuc3BhcmVudChDWEZBX05vZGUqIHJlZk5vZGUpIHsNCisgIGlmIChyZWZOb2RlID09IE5VTEwpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgWEZBX0VMRU1FTlQgZVJlZk5vZGUgPSByZWZOb2RlLT5HZXRDbGFzc0lEKCk7DQorICBpZiAoKHJlZk5vZGUtPklzVW5uYW1lZCgpICYmIHJlZk5vZGUtPklzQ29udGFpbmVyTm9kZSgpKSB8fA0KKyAgICAgIGVSZWZOb2RlID09IFhGQV9FTEVNRU5UX1N1YmZvcm1TZXQgfHwgZVJlZk5vZGUgPT0gWEZBX0VMRU1FTlRfQXJlYSB8fA0KKyAgICAgIGVSZWZOb2RlID09IFhGQV9FTEVNRU5UX1Byb3RvKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIENYRkFfTm9kZUhlbHBlcjo6WEZBX0NyZWF0ZU5vZGVfRm9yQ29uZGl0aW9uKA0KKyAgICBDRlhfV2lkZVN0cmluZyYgd3NDb25kaXRpb24pIHsNCisgIGludDMyX3QgaUxlbiA9IHdzQ29uZGl0aW9uLkdldExlbmd0aCgpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NJbmRleCA9IEZYX1dTVFJDKEwiMCIpOw0KKyAgOw0KKyAgRlhfQk9PTCBiQWxsID0gRkFMU0U7DQorICBpZiAoaUxlbiA9PSAwKSB7DQorICAgIG1faUNyZWF0ZUZsYWcgPSBYRkFfUkVTT0xWRU5PREVfUlNUWVBFX0NyZWF0ZU5vZGVPbmU7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGlmICh3c0NvbmRpdGlvbi5HZXRBdCgwKSA9PSAnWycpIHsNCisgICAgaW50MzJfdCBpID0gMTsNCisgICAgZm9yICg7IGkgPCBpTGVuOyArK2kpIHsNCisgICAgICBGWF9XQ0hBUiBjaCA9IHdzQ29uZGl0aW9uW2ldOw0KKyAgICAgIGlmIChjaCA9PSAnICcpIHsNCisgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgIH0NCisgICAgICBpZiAoY2ggPT0gJysnIHx8IGNoID09ICctJykgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfSBlbHNlIGlmIChjaCA9PSAnKicpIHsNCisgICAgICAgIGJBbGwgPSBUUlVFOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAoYkFsbCkgew0KKyAgICAgIHdzSW5kZXggPSBGWF9XU1RSQyhMIjEiKTsNCisgICAgICBtX2lDcmVhdGVGbGFnID0gWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlQWxsOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIG1faUNyZWF0ZUZsYWcgPSBYRkFfUkVTT0xWRU5PREVfUlNUWVBFX0NyZWF0ZU5vZGVPbmU7DQorICAgICAgd3NJbmRleCA9IHdzQ29uZGl0aW9uLk1pZChpLCBpTGVuIC0gMSAtIGkpOw0KKyAgICB9DQorICAgIGludDMyX3QgaUluZGV4ID0gd3NJbmRleC5HZXRJbnRlZ2VyKCk7DQorICAgIG1faUNyZWF0ZUNvdW50ID0gaUluZGV4Ow0KKyAgICByZXR1cm4gVFJVRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBDWEZBX05vZGVIZWxwZXI6OlhGQV9SZXNvbHZlTm9kZXNfQ3JlYXRlTm9kZSgNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lLA0KKyAgICBDRlhfV2lkZVN0cmluZyB3c0NvbmRpdGlvbiwNCisgICAgRlhfQk9PTCBiTGFzdE5vZGUsDQorICAgIENYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQpIHsNCisgIGlmIChtX3BDcmVhdGVQYXJlbnQgPT0gTlVMTCkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBGWF9CT09MIGJJc0NsYXNzTmFtZSA9IEZBTFNFOw0KKyAgRlhfQk9PTCBiUmVzdWx0ID0gRkFMU0U7DQorICBpZiAod3NOYW1lLkdldEF0KDApID09ICchJykgew0KKyAgICB3c05hbWUgPSB3c05hbWUuUmlnaHQod3NOYW1lLkdldExlbmd0aCgpIC0gMSk7DQorICAgIG1fcENyZWF0ZVBhcmVudCA9IChDWEZBX05vZGUqKXBTY3JpcHRDb250ZXh0LT5HZXREb2N1bWVudCgpLT5HZXRYRkFOb2RlKA0KKyAgICAgICAgWEZBX0hBU0hDT0RFX0RhdGFzZXRzKTsNCisgIH0NCisgIGlmICh3c05hbWUuR2V0QXQoMCkgPT0gJyMnKSB7DQorICAgIGJJc0NsYXNzTmFtZSA9IFRSVUU7DQorICAgIHdzTmFtZSA9IHdzTmFtZS5SaWdodCh3c05hbWUuR2V0TGVuZ3RoKCkgLSAxKTsNCisgIH0NCisgIGlmIChtX2lDcmVhdGVDb3VudCA9PSAwKSB7DQorICAgIFhGQV9DcmVhdGVOb2RlX0ZvckNvbmRpdGlvbih3c0NvbmRpdGlvbik7DQorICB9DQorICBpZiAoYklzQ2xhc3NOYW1lKSB7DQorICAgIFhGQV9MUENFTEVNRU5USU5GTyBscEVsZW1lbnQgPSBYRkFfR2V0RWxlbWVudEJ5TmFtZSh3c05hbWUpOw0KKyAgICBpZiAobHBFbGVtZW50ID09IE5VTEwpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgZm9yIChpbnQzMl90IGlJbmRleCA9IDA7IGlJbmRleCA8IG1faUNyZWF0ZUNvdW50OyBpSW5kZXgrKykgew0KKyAgICAgIENYRkFfTm9kZSogcE5ld05vZGUgPQ0KKyAgICAgICAgICBtX3BDcmVhdGVQYXJlbnQtPkNyZWF0ZVNhbWVQYWNrZXROb2RlKGxwRWxlbWVudC0+ZU5hbWUpOw0KKyAgICAgIGlmIChwTmV3Tm9kZSkgew0KKyAgICAgICAgbV9wQ3JlYXRlUGFyZW50LT5JbnNlcnRDaGlsZChwTmV3Tm9kZSk7DQorICAgICAgICBpZiAoaUluZGV4ID09IG1faUNyZWF0ZUNvdW50IC0gMSkgew0KKyAgICAgICAgICBtX3BDcmVhdGVQYXJlbnQgPSBwTmV3Tm9kZTsNCisgICAgICAgIH0NCisgICAgICAgIGJSZXN1bHQgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfSBlbHNlIHsNCisgICAgWEZBX0VMRU1FTlQgZUNsYXNzVHlwZSA9IFhGQV9FTEVNRU5UX0RhdGFHcm91cDsNCisgICAgaWYgKGJMYXN0Tm9kZSkgew0KKyAgICAgIGVDbGFzc1R5cGUgPSBtX2VMYXN0Q3JlYXRlVHlwZTsNCisgICAgfQ0KKyAgICBmb3IgKGludDMyX3QgaUluZGV4ID0gMDsgaUluZGV4IDwgbV9pQ3JlYXRlQ291bnQ7IGlJbmRleCsrKSB7DQorICAgICAgQ1hGQV9Ob2RlKiBwTmV3Tm9kZSA9IG1fcENyZWF0ZVBhcmVudC0+Q3JlYXRlU2FtZVBhY2tldE5vZGUoZUNsYXNzVHlwZSk7DQorICAgICAgaWYgKHBOZXdOb2RlKSB7DQorICAgICAgICBwTmV3Tm9kZS0+U2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOYW1lKTsNCisgICAgICAgIHBOZXdOb2RlLT5DcmVhdGVYTUxNYXBwaW5nTm9kZSgpOw0KKyAgICAgICAgbV9wQ3JlYXRlUGFyZW50LT5JbnNlcnRDaGlsZChwTmV3Tm9kZSk7DQorICAgICAgICBpZiAoaUluZGV4ID09IG1faUNyZWF0ZUNvdW50IC0gMSkgew0KKyAgICAgICAgICBtX3BDcmVhdGVQYXJlbnQgPSBwTmV3Tm9kZTsNCisgICAgICAgIH0NCisgICAgICAgIGJSZXN1bHQgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgfQ0KKyAgaWYgKCFiUmVzdWx0KSB7DQorICAgIG1fcENyZWF0ZVBhcmVudCA9IE5VTEw7DQorICB9DQorICByZXR1cm4gYlJlc3VsdDsNCit9DQordm9pZCBDWEZBX05vZGVIZWxwZXI6OlhGQV9TZXRDcmVhdGVOb2RlVHlwZShDWEZBX05vZGUqIHJlZk5vZGUpIHsNCisgIGlmIChyZWZOb2RlID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKHJlZk5vZGUtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9TdWJmb3JtKSB7DQorICAgIG1fZUxhc3RDcmVhdGVUeXBlID0gWEZBX0VMRU1FTlRfRGF0YUdyb3VwOw0KKyAgfSBlbHNlIGlmIChyZWZOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfRmllbGQpIHsNCisgICAgbV9lTGFzdENyZWF0ZVR5cGUgPSBYRkFfRmllbGRJc011bHRpTGlzdEJveChyZWZOb2RlKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFhGQV9FTEVNRU5UX0RhdGFHcm91cA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFhGQV9FTEVNRU5UX0RhdGFWYWx1ZTsNCisgIH0gZWxzZSBpZiAocmVmTm9kZS0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX0V4Y2xHcm91cCkgew0KKyAgICBtX2VMYXN0Q3JlYXRlVHlwZSA9IFhGQV9FTEVNRU5UX0RhdGFWYWx1ZTsNCisgIH0NCit9DQorRlhfQk9PTCBDWEZBX05vZGVIZWxwZXI6OlhGQV9Ob2RlSXNQcm9wZXJ0eShDWEZBX05vZGUqIHJlZk5vZGUpIHsNCisgIEZYX0JPT0wgYlJlcyA9IEZBTFNFOw0KKyAgQ1hGQV9Ob2RlKiBwYXJlbnQgPQ0KKyAgICAgIFhGQV9SZXNvbHZlTm9kZXNfR2V0UGFyZW50KHJlZk5vZGUsIFhGQV9MT0dJQ19Ob1RyYW5zcGFyZW50KTsNCisgIGlmIChwYXJlbnQgIT0gTlVMTCAmJiByZWZOb2RlICE9IE5VTEwpIHsNCisgICAgWEZBX0xQQ1BST1BFUlRZIHBQcm9wZXJ0ID0gWEZBX0dldFByb3BlcnR5T2ZFbGVtZW50KA0KKyAgICAgICAgcGFyZW50LT5HZXRDbGFzc0lEKCksIHJlZk5vZGUtPkdldENsYXNzSUQoKSwgWEZBX1hEUFBBQ0tFVF9VTktOT1dOKTsNCisgICAgaWYgKHBQcm9wZXJ0KSB7DQorICAgICAgYlJlcyA9IFRSVUU7DQorICAgIH0NCisgIH0NCisgIHJldHVybiBiUmVzOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X25vZGVoZWxwZXIuaCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfbm9kZWhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZWJmMzMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X25vZGVoZWxwZXIuaApAQCAtMCwwICsxLDY1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1hGQV9OT0RFSEVMUEVSX0hfDQorI2RlZmluZSBfWEZBX05PREVIRUxQRVJfSF8NCitjbGFzcyBDWEZBX1NjcmlwdENvbnRleHQ7DQorZW51bSBYRkFfTE9HSUNfVFlQRSB7DQorICBYRkFfTE9HSUNfTm9UcmFuc3BhcmVudCwNCisgIFhGQV9MT0dJQ19UcmFuc3BhcmVudCwNCit9Ow0KK2NsYXNzIENYRkFfTm9kZUhlbHBlciB7DQorIHB1YmxpYzoNCisgIENYRkFfTm9kZUhlbHBlcih2b2lkKTsNCisgIH5DWEZBX05vZGVIZWxwZXIodm9pZCk7DQorICBDWEZBX05vZGUqIFhGQV9SZXNvbHZlTm9kZXNfR2V0T25lQ2hpbGQoQ1hGQV9Ob2RlKiBwYXJlbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHB3c05hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNDbGFzc05hbWUgPSBGQUxTRSk7DQorICBDWEZBX05vZGUqIFhGQV9SZXNvbHZlTm9kZXNfR2V0UGFyZW50KA0KKyAgICAgIENYRkFfTm9kZSogcE5vZGUsDQorICAgICAgWEZBX0xPR0lDX1RZUEUgZUxvZ2ljVHlwZSA9IFhGQV9MT0dJQ19Ob1RyYW5zcGFyZW50KTsNCisNCisgIGludDMyX3QgWEZBX05vZGVBY2NfVHJhdmVyc2VTaWJsaW5ncyhDWEZBX05vZGUqIHBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkTmFtZUhhc2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkqIHBTaWJsaW5ncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTE9HSUNfVFlQRSBlTG9naWNUeXBlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYklzQ2xhc3NOYW1lID0gRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNGaW5kUHJvcGVydHkgPSBUUlVFKTsNCisgIGludDMyX3QgWEZBX05vZGVBY2NfVHJhdmVyc2VBbnlTaWJsaW5ncyhDWEZBX05vZGUqIHBhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkTmFtZUhhc2gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkqIHBTaWJsaW5ncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJc0NsYXNzTmFtZSA9IEZBTFNFKTsNCisgIGludDMyX3QgWEZBX0NvdW50U2libGluZ3MoQ1hGQV9Ob2RlKiBwTm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0xPR0lDX1RZUEUgZUxvZ2ljVHlwZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkqIHBTaWJsaW5ncywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNDbGFzc05hbWUgPSBGQUxTRSk7DQorICBpbnQzMl90IFhGQV9HZXRJbmRleChDWEZBX05vZGUqIHBOb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0xPR0lDX1RZUEUgZUxvZ2ljVHlwZSA9IFhGQV9MT0dJQ19Ob1RyYW5zcGFyZW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNQcm9wZXJ0eSA9IEZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNDbGFzc0luZGV4ID0gRkFMU0UpOw0KKyAgdm9pZCBYRkFfR2V0TmFtZUV4cHJlc3Npb24oDQorICAgICAgQ1hGQV9Ob2RlKiByZWZOb2RlLA0KKyAgICAgIENGWF9XaWRlU3RyaW5nJiB3c05hbWUsDQorICAgICAgRlhfQk9PTCBiSXNBbGxQYXRoLA0KKyAgICAgIFhGQV9MT0dJQ19UWVBFIGVMb2dpY1R5cGUgPSBYRkFfTE9HSUNfTm9UcmFuc3BhcmVudCk7DQorICBGWF9CT09MIFhGQV9Ob2RlSXNUcmFuc3BhcmVudChDWEZBX05vZGUqIHJlZk5vZGUpOw0KKyAgRlhfQk9PTCBYRkFfUmVzb2x2ZU5vZGVzX0NyZWF0ZU5vZGUoQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb25kaXRpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJMYXN0Tm9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQpOw0KKyAgRlhfQk9PTCBYRkFfQ3JlYXRlTm9kZV9Gb3JDb25kaXRpb24oQ0ZYX1dpZGVTdHJpbmcmIHdzQ29uZGl0aW9uKTsNCisgIHZvaWQgWEZBX1NldENyZWF0ZU5vZGVUeXBlKENYRkFfTm9kZSogcmVmTm9kZSk7DQorICBGWF9CT09MIFhGQV9Ob2RlSXNQcm9wZXJ0eShDWEZBX05vZGUqIHJlZk5vZGUpOw0KKw0KKyBwdWJsaWM6DQorICBYRkFfRUxFTUVOVCBtX2VMYXN0Q3JlYXRlVHlwZTsNCisgIENYRkFfTm9kZSogbV9wQ3JlYXRlUGFyZW50Ow0KKyAgaW50MzJfdCBtX2lDcmVhdGVDb3VudDsNCisgIFhGQV9SRVNPVkVOT0RFX1JTVFlQRSBtX2lDcmVhdGVGbGFnOw0KKyAgaW50MzJfdCBtX2lDdXJBbGxTdGFydDsNCisgIENYRkFfTm9kZSogbV9wQWxsU3RhcnRQYXJlbnQ7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X3Jlc29sdmVwcm9jZXNzb3IuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9yZXNvbHZlcHJvY2Vzc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjQ1YTlkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9yZXNvbHZlcHJvY2Vzc29yLmNwcApAQCAtMCwwICsxLDgyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfdXRpbHMuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX29iamVjdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jdW1lbnQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3BhcnNlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfc2NyaXB0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NkYXRhLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NsYXlvdXQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2xvY2FsZW1nci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZm0yanNhcGkuaCINCisjaW5jbHVkZSAieGZhX3NjcmlwdF9yZXNvbHZlcHJvY2Vzc29yLmgiDQorI2luY2x1ZGUgInhmYV9zY3JpcHRfbm9kZWhlbHBlci5oIg0KKyNpbmNsdWRlICJ4ZmFfc2NyaXB0X2ltcC5oIg0KK0NYRkFfUmVzb2x2ZVByb2Nlc3Nvcjo6Q1hGQV9SZXNvbHZlUHJvY2Vzc29yKHZvaWQpDQorICAgIDogbV9wTm9kZUhlbHBlcihOVUxMKSwgbV9pQ3VyU3RhcnQoMCkgew0KKyAgbV9wTm9kZUhlbHBlciA9IG5ldyBDWEZBX05vZGVIZWxwZXI7DQorfQ0KK0NYRkFfUmVzb2x2ZVByb2Nlc3Nvcjo6fkNYRkFfUmVzb2x2ZVByb2Nlc3Nvcih2b2lkKSB7DQorICBpZiAobV9wTm9kZUhlbHBlcikgew0KKyAgICBkZWxldGUgbV9wTm9kZUhlbHBlcjsNCisgICAgbV9wTm9kZUhlbHBlciA9IE5VTEw7DQorICB9DQorfQ0KK2ludDMyX3QgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpYRkFfUmVzb2x2ZU5vZGVzKENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKSB7DQorICBpZiAocm5kLm1fQ3VyTm9kZSA9PSBOVUxMKSB7DQorICAgIHJldHVybiAtMTsNCisgIH0NCisgIGlmICghcm5kLm1fQ3VyTm9kZS0+SXNOb2RlKCkpIHsNCisgICAgaWYgKHJuZC5tX2R3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0F0dHJpYnV0ZXMpIHsNCisgICAgICByZXR1cm4gWEZBX1Jlc29sdmVOb2Rlc19Gb3JBdHRyaWJ1dGVScyhybmQubV9DdXJOb2RlLCBybmQsIHJuZC5tX3dzTmFtZSk7DQorICAgIH0NCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpZiAocm5kLm1fZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQW55Q2hpbGQpIHsNCisgICAgcmV0dXJuIFhGQV9SZXNvbHZlTm9kZXNfQW55Q2hpbGQocm5kKTsNCisgIH0NCisgIEZYX1dDSEFSIHdjaCA9IHJuZC5tX3dzTmFtZS5HZXRBdCgwKTsNCisgIHN3aXRjaCAod2NoKSB7DQorICAgIGNhc2UgJyQnOg0KKyAgICAgIHJldHVybiBYRkFfUmVzb2x2ZU5vZGVzX0RvbGxhcihybmQpOw0KKyAgICBjYXNlICchJzoNCisgICAgICByZXR1cm4gWEZBX1Jlc29sdmVOb2Rlc19FeGNhbG1hdG9yeShybmQpOw0KKyAgICBjYXNlICcjJzoNCisgICAgICByZXR1cm4gWEZBX1Jlc29sdmVOb2Rlc19OdW1iZXJTaWduKHJuZCk7DQorICAgIGNhc2UgJyonOg0KKyAgICAgIHJldHVybiBYRkFfUmVzb2x2ZU5vZGVzX0FzdGVyaXNrKHJuZCk7DQorICAgIGNhc2UgJy4nOg0KKyAgICAgIHJldHVybiBYRkFfUmVzb2x2ZU5vZGVzX0FueUNoaWxkKHJuZCk7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICBpZiAocm5kLm1fdUhhc2hOYW1lID09IFhGQV9IQVNIQ09ERV9UaGlzICYmIHJuZC5tX25MZXZlbCA9PSAwKSB7DQorICAgIHJuZC5tX05vZGVzLkFkZChybmQubV9wU0MtPkdldFRoaXNPYmplY3QoKSk7DQorICAgIHJldHVybiAxOw0KKyAgfSBlbHNlIGlmIChybmQubV9DdXJOb2RlLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfWGZhKSB7DQorICAgIENYRkFfT2JqZWN0KiBwT2JqTm9kZSA9DQorICAgICAgICBybmQubV9wU0MtPkdldERvY3VtZW50KCktPkdldFhGQU5vZGUocm5kLm1fdUhhc2hOYW1lKTsNCisgICAgaWYgKHBPYmpOb2RlKSB7DQorICAgICAgcm5kLm1fTm9kZXMuQWRkKHBPYmpOb2RlKTsNCisgICAgfSBlbHNlIGlmIChybmQubV91SGFzaE5hbWUgPT0gWEZBX0hBU0hDT0RFX1hmYSkgew0KKyAgICAgIHJuZC5tX05vZGVzLkFkZChybmQubV9DdXJOb2RlKTsNCisgICAgfSBlbHNlIGlmICgocm5kLm1fZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQXR0cmlidXRlcykgJiYNCisgICAgICAgICAgICAgICBYRkFfUmVzb2x2ZU5vZGVzX0ZvckF0dHJpYnV0ZVJzKHJuZC5tX0N1ck5vZGUsIHJuZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZC5tX3dzTmFtZSkpIHsNCisgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgICBpZiAocm5kLm1fTm9kZXMuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgIFhGQV9SZXNvbHZlTm9kZV9GaWx0ZXJDb25kaXRpb24ocm5kLCBybmQubV93c0NvbmRpdGlvbik7DQorICAgIH0NCisgICAgcmV0dXJuIHJuZC5tX05vZGVzLkdldFNpemUoKTsNCisgIH0NCisgIGludDMyX3QgblJldCA9IFhGQV9SZXNvbHZlTm9kZXNfTm9ybWFsKHJuZCk7DQorICBpZiAoblJldCA8IDEgJiYgcm5kLm1fdUhhc2hOYW1lID09IFhGQV9IQVNIQ09ERV9YZmEpIHsNCisgICAgcm5kLm1fTm9kZXMuQWRkKHJuZC5tX3BTQy0+R2V0RG9jdW1lbnQoKS0+R2V0Um9vdCgpKTsNCisgIH0NCisgIHJldHVybiBybmQubV9Ob2Rlcy5HZXRTaXplKCk7DQorfQ0KK2ludDMyX3QgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpYRkFfUmVzb2x2ZU5vZGVzX0FueUNoaWxkKA0KKyAgICBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCkgew0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lID0gcm5kLm1fd3NOYW1lLlJpZ2h0KHJuZC5tX3dzTmFtZS5HZXRMZW5ndGgoKSAtIDEpOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NDb25kaXRpb24gPSBybmQubV93c0NvbmRpdGlvbjsNCisgIENYRkFfTm9kZSogZmluZE5vZGUgPSBOVUxMOw0KKyAgQ1hGQV9Ob2RlQXJyYXkgc2libGluZ3M7DQorICBGWF9CT09MIGJDbGFzc05hbWUgPSBGQUxTRTsNCisgIGlmICh3c05hbWUuR2V0QXQoMCkgPT0gJyMnKSB7DQorICAgIGJDbGFzc05hbWUgPSBUUlVFOw0KKyAgICB3c05hbWUgPSB3c05hbWUuUmlnaHQod3NOYW1lLkdldExlbmd0aCgpIC0gMSk7DQorICB9DQorICBmaW5kTm9kZSA9IG1fcE5vZGVIZWxwZXItPlhGQV9SZXNvbHZlTm9kZXNfR2V0T25lQ2hpbGQoDQorICAgICAgKENYRkFfTm9kZSopcm5kLm1fQ3VyTm9kZSwgd3NOYW1lLCBiQ2xhc3NOYW1lKTsNCisgIGlmIChmaW5kTm9kZSA9PSBOVUxMKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgaWYgKHdzQ29uZGl0aW9uLklzRW1wdHkoKSkgew0KKyAgICBybmQubV9Ob2Rlcy5BZGQoZmluZE5vZGUpOw0KKyAgICByZXR1cm4gcm5kLm1fTm9kZXMuR2V0U2l6ZSgpOw0KKyAgfQ0KKyAgbV9wTm9kZUhlbHBlci0+WEZBX0NvdW50U2libGluZ3MoZmluZE5vZGUsIFhGQV9MT0dJQ19UcmFuc3BhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDWEZBX05vZGVBcnJheSopJnJuZC5tX05vZGVzLCBiQ2xhc3NOYW1lKTsNCisgIFhGQV9SZXNvbHZlTm9kZV9GaWx0ZXJDb25kaXRpb24ocm5kLCB3c0NvbmRpdGlvbik7DQorICByZXR1cm4gcm5kLm1fTm9kZXMuR2V0U2l6ZSgpOw0KK30NCitpbnQzMl90IENYRkFfUmVzb2x2ZVByb2Nlc3Nvcjo6WEZBX1Jlc29sdmVOb2Rlc19Eb2xsYXIoDQorICAgIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKSB7DQorICBDWEZBX09iakFycmF5JiBub2RlcyA9IHJuZC5tX05vZGVzOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lID0gcm5kLm1fd3NOYW1lOw0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NDb25kaXRpb24gPSBybmQubV93c0NvbmRpdGlvbjsNCisgIGludDMyX3QgaU5hbWVMZW4gPSB3c05hbWUuR2V0TGVuZ3RoKCk7DQorICBpZiAoaU5hbWVMZW4gPT0gMSkgew0KKyAgICBub2Rlcy5BZGQocm5kLm1fQ3VyTm9kZSk7DQorICAgIHJldHVybiAxOw0KKyAgfQ0KKyAgaWYgKHJuZC5tX25MZXZlbCA+IDApIHsNCisgICAgcmV0dXJuIC0xOw0KKyAgfQ0KKyAgRlhfRFdPUkQgZHdOYW1lSGFzaCA9DQorICAgICAgRlhfSGFzaENvZGVfU3RyaW5nX0dldFcoKGNvbnN0IEZYX1dDSEFSKil3c05hbWUgKyAxLCBpTmFtZUxlbiAtIDEpOw0KKyAgaWYgKGR3TmFtZUhhc2ggPT0gWEZBX0hBU0hDT0RFX1hmYSkgew0KKyAgICBub2Rlcy5BZGQocm5kLm1fcFNDLT5HZXREb2N1bWVudCgpLT5HZXRSb290KCkpOw0KKyAgfSBlbHNlIHsNCisgICAgQ1hGQV9PYmplY3QqIHBPYmpOb2RlID0gcm5kLm1fcFNDLT5HZXREb2N1bWVudCgpLT5HZXRYRkFOb2RlKGR3TmFtZUhhc2gpOw0KKyAgICBpZiAocE9iak5vZGUpIHsNCisgICAgICBybmQubV9Ob2Rlcy5BZGQocE9iak5vZGUpOw0KKyAgICB9DQorICB9DQorICBpZiAocm5kLm1fTm9kZXMuR2V0U2l6ZSgpID4gMCkgew0KKyAgICBYRkFfUmVzb2x2ZU5vZGVfRmlsdGVyQ29uZGl0aW9uKHJuZCwgd3NDb25kaXRpb24pOw0KKyAgfQ0KKyAgcmV0dXJuIHJuZC5tX05vZGVzLkdldFNpemUoKTsNCit9DQoraW50MzJfdCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZXNfRXhjYWxtYXRvcnkoDQorICAgIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKSB7DQorICBpZiAocm5kLm1fbkxldmVsID4gMCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIENYRkFfTm9kZSogZGF0YXNldHMgPQ0KKyAgICAgIChDWEZBX05vZGUqKXJuZC5tX3BTQy0+R2V0RG9jdW1lbnQoKS0+R2V0WEZBTm9kZShYRkFfSEFTSENPREVfRGF0YXNldHMpOw0KKyAgaWYgKGRhdGFzZXRzID09IE5VTEwpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEgcm5kRmluZDsNCisgIHJuZEZpbmQubV9wU0MgPSBybmQubV9wU0M7DQorICBybmRGaW5kLm1fQ3VyTm9kZSA9IGRhdGFzZXRzOw0KKyAgcm5kRmluZC5tX3dzTmFtZSA9IHJuZC5tX3dzTmFtZS5SaWdodChybmQubV93c05hbWUuR2V0TGVuZ3RoKCkgLSAxKTsNCisgIHJuZEZpbmQubV91SGFzaE5hbWUgPQ0KKyAgICAgIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHJuZEZpbmQubV93c05hbWUsIHJuZEZpbmQubV93c05hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgcm5kRmluZC5tX25MZXZlbCA9IHJuZC5tX25MZXZlbCArIDE7DQorICBybmRGaW5kLm1fZHdTdHlsZXMgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW47DQorICBybmRGaW5kLm1fd3NDb25kaXRpb24gPSBybmQubV93c0NvbmRpdGlvbjsNCisgIFhGQV9SZXNvbHZlTm9kZXMocm5kRmluZCk7DQorICBpZiAocm5kRmluZC5tX05vZGVzLkdldFNpemUoKSA+IDApIHsNCisgICAgcm5kLm1fTm9kZXMuQXBwZW5kKHJuZEZpbmQubV9Ob2Rlcyk7DQorICAgIHJuZEZpbmQubV9Ob2Rlcy5SZW1vdmVBbGwoKTsNCisgIH0NCisgIHJldHVybiBybmQubV9Ob2Rlcy5HZXRTaXplKCk7DQorfQ0KK2ludDMyX3QgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpYRkFfUmVzb2x2ZU5vZGVzX051bWJlclNpZ24oDQorICAgIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKSB7DQorICBDRlhfV2lkZVN0cmluZyB3c05hbWUgPSBybmQubV93c05hbWUuUmlnaHQocm5kLm1fd3NOYW1lLkdldExlbmd0aCgpIC0gMSk7DQorICBDRlhfV2lkZVN0cmluZyB3c0NvbmRpdGlvbiA9IHJuZC5tX3dzQ29uZGl0aW9uOw0KKyAgQ1hGQV9Ob2RlKiBjdXJOb2RlID0gKENYRkFfTm9kZSopcm5kLm1fQ3VyTm9kZTsNCisgIGlmIChYRkFfUmVzb2x2ZU5vZGVzX0ZvckF0dHJpYnV0ZVJzKGN1ck5vZGUsIHJuZCwgd3NOYW1lKSkgew0KKyAgICByZXR1cm4gMTsNCisgIH0NCisgIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSBybmRGaW5kOw0KKyAgcm5kRmluZC5tX3BTQyA9IHJuZC5tX3BTQzsNCisgIHJuZEZpbmQubV9uTGV2ZWwgPSBybmQubV9uTGV2ZWwgKyAxOw0KKyAgcm5kRmluZC5tX2R3U3R5bGVzID0gcm5kLm1fZHdTdHlsZXM7DQorICBybmRGaW5kLm1fZHdTdHlsZXMgfD0gWEZBX1JFU09MVkVOT0RFX1RhZ05hbWU7DQorICBybmRGaW5kLm1fZHdTdHlsZXMgJj0gflhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzOw0KKyAgcm5kRmluZC5tX3dzTmFtZSA9IHdzTmFtZTsNCisgIHJuZEZpbmQubV91SGFzaE5hbWUgPQ0KKyAgICAgIEZYX0hhc2hDb2RlX1N0cmluZ19HZXRXKHJuZEZpbmQubV93c05hbWUsIHJuZEZpbmQubV93c05hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgcm5kRmluZC5tX3dzQ29uZGl0aW9uID0gd3NDb25kaXRpb247DQorICBybmRGaW5kLm1fQ3VyTm9kZSA9IGN1ck5vZGU7DQorICBYRkFfUmVzb2x2ZU5vZGVzX05vcm1hbChybmRGaW5kKTsNCisgIGlmIChybmRGaW5kLm1fTm9kZXMuR2V0U2l6ZSgpID4gMCkgew0KKyAgICBpZiAod3NDb25kaXRpb24uR2V0TGVuZ3RoKCkgPT0gMCAmJiBybmRGaW5kLm1fTm9kZXMuRmluZChjdXJOb2RlKSA+PSAwKSB7DQorICAgICAgcm5kLm1fTm9kZXMuQWRkKGN1ck5vZGUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJuZC5tX05vZGVzLkFwcGVuZChybmRGaW5kLm1fTm9kZXMpOw0KKyAgICAgIHJuZEZpbmQubV9Ob2Rlcy5SZW1vdmVBbGwoKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHJuZC5tX05vZGVzLkdldFNpemUoKTsNCit9DQoraW50MzJfdCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZXNfRm9yQXR0cmlidXRlUnMoDQorICAgIENYRkFfT2JqZWN0KiBjdXJOb2RlLA0KKyAgICBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCwNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHJBdHRyKSB7DQorICBYRkFfTFBDU0NSSVBUQVRUUklCVVRFSU5GTyBscFNjcmlwdEF0dHJpYnV0ZSA9DQorICAgICAgWEZBX0dldFNjcmlwdEF0dHJpYnV0ZUJ5TmFtZShjdXJOb2RlLT5HZXRDbGFzc0lEKCksIHN0ckF0dHIpOw0KKyAgaWYgKGxwU2NyaXB0QXR0cmlidXRlKSB7DQorICAgIHJuZC5tX3BTY3JpcHRBdHRyaWJ1dGUgPSBscFNjcmlwdEF0dHJpYnV0ZTsNCisgICAgcm5kLm1fTm9kZXMuQWRkKGN1ck5vZGUpOw0KKyAgICBybmQubV9kd0ZsYWcgPSBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfQXR0cmlidXRlOw0KKyAgICByZXR1cm4gMTsNCisgIH0NCisgIHJldHVybiAwOw0KK30NCitpbnQzMl90IENYRkFfUmVzb2x2ZVByb2Nlc3Nvcjo6WEZBX1Jlc29sdmVOb2Rlc19Ob3JtYWwoDQorICAgIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKSB7DQorICBpZiAocm5kLm1fbkxldmVsID4gMzIpIHsNCisgICAgcmV0dXJuIDA7DQorICB9DQorICBpZiAoIXJuZC5tX0N1ck5vZGUtPklzTm9kZSgpKSB7DQorICAgIHJldHVybiAwOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBjdXJOb2RlID0gKENYRkFfTm9kZSopcm5kLm1fQ3VyTm9kZTsNCisgIENYRkFfT2JqQXJyYXkmIG5vZGVzID0gcm5kLm1fTm9kZXM7DQorICBpbnQzMl90IG5OdW0gPSBub2Rlcy5HZXRTaXplKCk7DQorICBGWF9EV09SRCBkd1N0eWxlcyA9IHJuZC5tX2R3U3R5bGVzOw0KKyAgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSA9IHJuZC5tX3dzTmFtZTsNCisgIHVpbnQzMl90IHVOYW1lSGFzaCA9IHJuZC5tX3VIYXNoTmFtZTsNCisgIENGWF9XaWRlU3RyaW5nJiB3c0NvbmRpdGlvbiA9IHJuZC5tX3dzQ29uZGl0aW9uOw0KKyAgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhIHJuZEZpbmQ7DQorICBybmRGaW5kLm1fd3NOYW1lID0gcm5kLm1fd3NOYW1lOw0KKyAgcm5kRmluZC5tX3dzQ29uZGl0aW9uID0gcm5kLm1fd3NDb25kaXRpb247DQorICBybmRGaW5kLm1fcFNDID0gcm5kLm1fcFNDOw0KKyAgcm5kRmluZC5tX25MZXZlbCA9IHJuZC5tX25MZXZlbCArIDE7DQorICBybmRGaW5kLm1fdUhhc2hOYW1lID0gdU5hbWVIYXNoOw0KKyAgQ1hGQV9Ob2RlQXJyYXkgY2hpbGRyZW47DQorICBDWEZBX05vZGVBcnJheSBwcm9wZXJ0aWVzOw0KKyAgQ1hGQV9Ob2RlKiBwVmFyaWFibGVzTm9kZSA9IE5VTEw7DQorICBDWEZBX05vZGUqIHBQYWdlU2V0Tm9kZSA9IE5VTEw7DQorICBDWEZBX05vZGUqIHBDaGlsZCA9IGN1ck5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgIHdoaWxlIChwQ2hpbGQpIHsNCisgICAgaWYgKHBDaGlsZC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1ZhcmlhYmxlcykgew0KKyAgICAgIHBWYXJpYWJsZXNOb2RlID0gcENoaWxkOw0KKyAgICAgIHBDaGlsZCA9IHBDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICBjb250aW51ZTsNCisgICAgfSBlbHNlIGlmIChwQ2hpbGQtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9QYWdlU2V0KSB7DQorICAgICAgcFBhZ2VTZXROb2RlID0gcENoaWxkOw0KKyAgICAgIHBDaGlsZCA9IHBDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgICBjb250aW51ZTsNCisgICAgfSBlbHNlIHsNCisgICAgICBYRkFfTFBDUFJPUEVSVFkgcFByb3BlcnQgPSBYRkFfR2V0UHJvcGVydHlPZkVsZW1lbnQoDQorICAgICAgICAgIGN1ck5vZGUtPkdldENsYXNzSUQoKSwgcENoaWxkLT5HZXRDbGFzc0lEKCksIFhGQV9YRFBQQUNLRVRfVU5LTk9XTik7DQorICAgICAgaWYgKHBQcm9wZXJ0KSB7DQorICAgICAgICBwcm9wZXJ0aWVzLkFkZChwQ2hpbGQpOw0KKyAgICAgIH0gZWxzZSB7DQorICAgICAgICBjaGlsZHJlbi5BZGQocENoaWxkKTsNCisgICAgICB9DQorICAgIH0NCisgICAgcENoaWxkID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOw0KKyAgfQ0KKyAgaWYgKChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzKSAmJiBwVmFyaWFibGVzTm9kZSkgew0KKyAgICB1aW50MzJfdCB1UHJvcEhhc2ggPSBwVmFyaWFibGVzTm9kZS0+R2V0Q2xhc3NIYXNoQ29kZSgpOw0KKyAgICBpZiAodVByb3BIYXNoID09IHVOYW1lSGFzaCkgew0KKyAgICAgIG5vZGVzLkFkZChwVmFyaWFibGVzTm9kZSk7DQorICAgIH0gZWxzZSB7DQorICAgICAgcm5kRmluZC5tX0N1ck5vZGUgPSBwVmFyaWFibGVzTm9kZTsNCisgICAgICBYRkFfUmVzb2x2ZU5vZGVzX1NldFN0eWxlc0ZvckNoaWxkKGR3U3R5bGVzLCBybmRGaW5kKTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1NhdmVDb25kaXRpb24gPSBybmRGaW5kLm1fd3NDb25kaXRpb247DQorICAgICAgcm5kRmluZC5tX3dzQ29uZGl0aW9uLkVtcHR5KCk7DQorICAgICAgWEZBX1Jlc29sdmVOb2Rlc19Ob3JtYWwocm5kRmluZCk7DQorICAgICAgcm5kRmluZC5tX3dzQ29uZGl0aW9uID0gd3NTYXZlQ29uZGl0aW9uOw0KKyAgICAgIGlmIChybmRGaW5kLm1fTm9kZXMuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgbm9kZXMuQXBwZW5kKHJuZEZpbmQubV9Ob2Rlcyk7DQorICAgICAgICBybmRGaW5kLm1fTm9kZXMuUmVtb3ZlQWxsKCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChub2Rlcy5HZXRTaXplKCkgPiBuTnVtKSB7DQorICAgICAgWEZBX1Jlc29sdmVOb2RlX0ZpbHRlckNvbmRpdGlvbihybmQsIHdzQ29uZGl0aW9uKTsNCisgICAgICBpZiAobm9kZXMuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgcmV0dXJuIDE7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICB9DQorICBpZiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4pIHsNCisgICAgRlhfQk9PTCBiU2V0RmxhZyA9IEZBTFNFOw0KKyAgICBpZiAocFBhZ2VTZXROb2RlICYmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzKSkgew0KKyAgICAgIGNoaWxkcmVuLkFkZChwUGFnZVNldE5vZGUpOw0KKyAgICB9DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNoaWxkcmVuLkdldFNpemUoKTsgaSsrKSB7DQorICAgICAgQ1hGQV9Ob2RlKiBjaGlsZCA9IGNoaWxkcmVuW2ldOw0KKyAgICAgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lKSB7DQorICAgICAgICBpZiAoY2hpbGQtPkdldENsYXNzSGFzaENvZGUoKSA9PSB1TmFtZUhhc2gpIHsNCisgICAgICAgICAgbm9kZXMuQWRkKGNoaWxkKTsNCisgICAgICAgIH0NCisgICAgICB9IGVsc2UgaWYgKGNoaWxkLT5HZXROYW1lSGFzaCgpID09IHVOYW1lSGFzaCkgew0KKyAgICAgICAgbm9kZXMuQWRkKGNoaWxkKTsNCisgICAgICB9DQorICAgICAgaWYgKG1fcE5vZGVIZWxwZXItPlhGQV9Ob2RlSXNUcmFuc3BhcmVudChjaGlsZCkgJiYNCisgICAgICAgICAgY2hpbGQtPkdldENsYXNzSUQoKSAhPSBYRkFfRUxFTUVOVF9QYWdlU2V0KSB7DQorICAgICAgICBpZiAoIWJTZXRGbGFnKSB7DQorICAgICAgICAgIFhGQV9SZXNvbHZlTm9kZXNfU2V0U3R5bGVzRm9yQ2hpbGQoZHdTdHlsZXMsIHJuZEZpbmQpOw0KKyAgICAgICAgICBiU2V0RmxhZyA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgICBybmRGaW5kLm1fQ3VyTm9kZSA9IGNoaWxkOw0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTYXZlQ29uZGl0aW9uID0gcm5kRmluZC5tX3dzQ29uZGl0aW9uOw0KKyAgICAgICAgcm5kRmluZC5tX3dzQ29uZGl0aW9uLkVtcHR5KCk7DQorICAgICAgICBYRkFfUmVzb2x2ZU5vZGVzX05vcm1hbChybmRGaW5kKTsNCisgICAgICAgIHJuZEZpbmQubV93c0NvbmRpdGlvbiA9IHdzU2F2ZUNvbmRpdGlvbjsNCisgICAgICAgIGlmIChybmRGaW5kLm1fTm9kZXMuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgICBub2Rlcy5BcHBlbmQocm5kRmluZC5tX05vZGVzKTsNCisgICAgICAgICAgcm5kRmluZC5tX05vZGVzLlJlbW92ZUFsbCgpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAobm9kZXMuR2V0U2l6ZSgpID4gbk51bSkgew0KKyAgICAgIGlmICghKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0FMTCkpIHsNCisgICAgICAgIENYRkFfTm9kZUFycmF5IHVwQXJyYXlOb2RlczsNCisgICAgICAgIGlmIChtX3BOb2RlSGVscGVyLT5YRkFfTm9kZUlzVHJhbnNwYXJlbnQoKENYRkFfTm9kZSopY3VyTm9kZSkpIHsNCisgICAgICAgICAgbV9wTm9kZUhlbHBlci0+WEZBX0NvdW50U2libGluZ3MoDQorICAgICAgICAgICAgICAoQ1hGQV9Ob2RlKilub2Rlc1swXSwgWEZBX0xPR0lDX1RyYW5zcGFyZW50LCAmdXBBcnJheU5vZGVzLA0KKyAgICAgICAgICAgICAgISEoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfVGFnTmFtZSkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHVwQXJyYXlOb2Rlcy5HZXRTaXplKCkgPiBub2Rlcy5HZXRTaXplKCkpIHsNCisgICAgICAgICAgdXBBcnJheU5vZGVzWzBdID0gKENYRkFfTm9kZSopbm9kZXNbMF07DQorICAgICAgICAgIG5vZGVzLlJlbW92ZUFsbCgpOw0KKyAgICAgICAgICBub2Rlcy5BcHBlbmQoKENYRkFfT2JqQXJyYXkmKXVwQXJyYXlOb2Rlcyk7DQorICAgICAgICAgIHVwQXJyYXlOb2Rlcy5SZW1vdmVBbGwoKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgWEZBX1Jlc29sdmVOb2RlX0ZpbHRlckNvbmRpdGlvbihybmQsIHdzQ29uZGl0aW9uKTsNCisgICAgICBpZiAobm9kZXMuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgcmV0dXJuIDE7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICB9DQorICBpZiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQXR0cmlidXRlcykgew0KKyAgICBpZiAoWEZBX1Jlc29sdmVOb2Rlc19Gb3JBdHRyaWJ1dGVScyhjdXJOb2RlLCBybmQsIHdzTmFtZSkpIHsNCisgICAgICByZXR1cm4gMTsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMpIHsNCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcHJvcGVydGllcy5HZXRTaXplKCk7IGkrKykgew0KKyAgICAgIENYRkFfTm9kZSogY2hpbGRQcm9wZXJ0eSA9IHByb3BlcnRpZXNbaV07DQorICAgICAgaWYgKGNoaWxkUHJvcGVydHktPklzVW5uYW1lZCgpKSB7DQorICAgICAgICB1aW50MzJfdCB1UHJvcEhhc2ggPSBjaGlsZFByb3BlcnR5LT5HZXRDbGFzc0hhc2hDb2RlKCk7DQorICAgICAgICBpZiAodVByb3BIYXNoID09IHVOYW1lSGFzaCkgew0KKyAgICAgICAgICBub2Rlcy5BZGQoY2hpbGRQcm9wZXJ0eSk7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIGlmIChjaGlsZFByb3BlcnR5LT5HZXROYW1lSGFzaCgpID09IHVOYW1lSGFzaCAmJg0KKyAgICAgICAgICAgICAgICAgY2hpbGRQcm9wZXJ0eS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0V4dHJhcyAmJg0KKyAgICAgICAgICAgICAgICAgY2hpbGRQcm9wZXJ0eS0+R2V0Q2xhc3NJRCgpICE9IFhGQV9FTEVNRU5UX0l0ZW1zKSB7DQorICAgICAgICBub2Rlcy5BZGQoY2hpbGRQcm9wZXJ0eSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChub2Rlcy5HZXRTaXplKCkgPiBuTnVtKSB7DQorICAgICAgWEZBX1Jlc29sdmVOb2RlX0ZpbHRlckNvbmRpdGlvbihybmQsIHdzQ29uZGl0aW9uKTsNCisgICAgICBpZiAobm9kZXMuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgcmV0dXJuIDE7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIENYRkFfTm9kZSogcFByb3AgPSBOVUxMOw0KKyAgICBpZiAoWEZBX0VMRU1FTlRfU3ViZm9ybSA9PSBjdXJOb2RlLT5HZXRDbGFzc0lEKCkgJiYNCisgICAgICAgIFhGQV9IQVNIQ09ERV9PY2N1ciA9PSB1TmFtZUhhc2gpIHsNCisgICAgICBDWEZBX05vZGUqIHBJbnN0YW5jZU1hbmFnZXIgPQ0KKyAgICAgICAgICAoKENYRkFfTm9kZSopY3VyTm9kZSktPkdldEluc3RhbmNlTWdyT2ZTdWJmb3JtKCk7DQorICAgICAgaWYgKHBJbnN0YW5jZU1hbmFnZXIpIHsNCisgICAgICAgIHBQcm9wID0gcEluc3RhbmNlTWFuYWdlci0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfT2NjdXIsIFRSVUUpOw0KKyAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICBYRkFfTFBDRUxFTUVOVElORk8gcEVsZW1lbnQgPSBYRkFfR2V0RWxlbWVudEJ5TmFtZSh3c05hbWUpOw0KKyAgICAgIGlmIChwRWxlbWVudCkgew0KKyAgICAgICAgcFByb3AgPSAoKENYRkFfTm9kZSopY3VyTm9kZSkNCisgICAgICAgICAgICAgICAgICAgIC0+R2V0UHJvcGVydHkoMCwgcEVsZW1lbnQtPmVOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRWxlbWVudC0+ZU5hbWUgIT0gWEZBX0VMRU1FTlRfUGFnZVNldCk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChwUHJvcCkgew0KKyAgICAgIG5vZGVzLkFkZChwUHJvcCk7DQorICAgICAgcmV0dXJuIG5vZGVzLkdldFNpemUoKTsNCisgICAgfQ0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwYXJlbnROb2RlID0gbV9wTm9kZUhlbHBlci0+WEZBX1Jlc29sdmVOb2Rlc19HZXRQYXJlbnQoDQorICAgICAgKENYRkFfTm9kZSopY3VyTm9kZSwgWEZBX0xPR0lDX05vVHJhbnNwYXJlbnQpOw0KKyAgdWludDMyX3QgdUN1ckNsYXNzSGFzaCA9IGN1ck5vZGUtPkdldENsYXNzSGFzaENvZGUoKTsNCisgIGlmIChwYXJlbnROb2RlID09IE5VTEwpIHsNCisgICAgaWYgKHVDdXJDbGFzc0hhc2ggPT0gdU5hbWVIYXNoKSB7DQorICAgICAgbm9kZXMuQWRkKChDWEZBX05vZGUqKWN1ck5vZGUpOw0KKyAgICAgIFhGQV9SZXNvbHZlTm9kZV9GaWx0ZXJDb25kaXRpb24ocm5kLCB3c0NvbmRpdGlvbik7DQorICAgICAgaWYgKG5vZGVzLkdldFNpemUoKSA+IDApIHsNCisgICAgICAgIHJldHVybiAxOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncykgew0KKyAgICBDWEZBX05vZGUqIGNoaWxkID0gcGFyZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgICBGWF9EV09SRCBkd1N1YlN0eWxlcyA9DQorICAgICAgICBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfCBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllczsNCisgICAgaWYgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX1RhZ05hbWUpIHsNCisgICAgICBkd1N1YlN0eWxlcyB8PSBYRkFfUkVTT0xWRU5PREVfVGFnTmFtZTsNCisgICAgfQ0KKyAgICBpZiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQUxMKSB7DQorICAgICAgZHdTdWJTdHlsZXMgfD0gWEZBX1JFU09MVkVOT0RFX0FMTDsNCisgICAgfQ0KKyAgICBybmRGaW5kLm1fZHdTdHlsZXMgPSBkd1N1YlN0eWxlczsNCisgICAgd2hpbGUgKGNoaWxkKSB7DQorICAgICAgaWYgKGNoaWxkID09IGN1ck5vZGUpIHsNCisgICAgICAgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lKSB7DQorICAgICAgICAgIGlmICh1Q3VyQ2xhc3NIYXNoID09IHVOYW1lSGFzaCkgew0KKyAgICAgICAgICAgIG5vZGVzLkFkZChjdXJOb2RlKTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgaWYgKGNoaWxkLT5HZXROYW1lSGFzaCgpID09IHVOYW1lSGFzaCkgew0KKyAgICAgICAgICAgIG5vZGVzLkFkZChjdXJOb2RlKTsNCisgICAgICAgICAgICBpZiAocm5kLm1fbkxldmVsID09IDAgJiYgd3NDb25kaXRpb24uR2V0TGVuZ3RoKCkgPT0gMCkgew0KKyAgICAgICAgICAgICAgbm9kZXMuUmVtb3ZlQWxsKCk7DQorICAgICAgICAgICAgICBub2Rlcy5BZGQoY3VyTm9kZSk7DQorICAgICAgICAgICAgICByZXR1cm4gMTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGNoaWxkID0gY2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7DQorICAgICAgICBjb250aW51ZTsNCisgICAgICB9DQorICAgICAgaWYgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX1RhZ05hbWUpIHsNCisgICAgICAgIGlmIChjaGlsZC0+R2V0Q2xhc3NIYXNoQ29kZSgpID09IHVOYW1lSGFzaCkgew0KKyAgICAgICAgICBub2Rlcy5BZGQoY2hpbGQpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0gZWxzZSBpZiAoY2hpbGQtPkdldE5hbWVIYXNoKCkgPT0gdU5hbWVIYXNoKSB7DQorICAgICAgICBub2Rlcy5BZGQoY2hpbGQpOw0KKyAgICAgIH0NCisgICAgICBYRkFfTFBDUFJPUEVSVFkgcFByb3BlcnQgPSBYRkFfR2V0UHJvcGVydHlPZkVsZW1lbnQoDQorICAgICAgICAgIHBhcmVudE5vZGUtPkdldENsYXNzSUQoKSwgY2hpbGQtPkdldENsYXNzSUQoKSwgWEZBX1hEUFBBQ0tFVF9VTktOT1dOKTsNCisgICAgICBGWF9CT09MIGJJbm5lclNlYXJjaCA9IEZBTFNFOw0KKyAgICAgIGlmIChwUHJvcGVydCkgew0KKyAgICAgICAgaWYgKChjaGlsZC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1ZhcmlhYmxlcyB8fA0KKyAgICAgICAgICAgICBjaGlsZC0+R2V0Q2xhc3NJRCgpID09IFhGQV9FTEVNRU5UX1BhZ2VTZXQpKSB7DQorICAgICAgICAgIGJJbm5lclNlYXJjaCA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlmIChtX3BOb2RlSGVscGVyLT5YRkFfTm9kZUlzVHJhbnNwYXJlbnQoY2hpbGQpKSB7DQorICAgICAgICAgIGJJbm5lclNlYXJjaCA9IFRSVUU7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGlmIChiSW5uZXJTZWFyY2gpIHsNCisgICAgICAgIHJuZEZpbmQubV9DdXJOb2RlID0gY2hpbGQ7DQorICAgICAgICBDRlhfV2lkZVN0cmluZyB3c09yaWdpbkNvbmRpdGlvbiA9IHJuZEZpbmQubV93c0NvbmRpdGlvbjsNCisgICAgICAgIHJuZEZpbmQubV93c0NvbmRpdGlvbi5FbXB0eSgpOw0KKyAgICAgICAgRlhfRFdPUkQgZHdPcmlnaW5TdHlsZSA9IHJuZEZpbmQubV9kd1N0eWxlczsNCisgICAgICAgIHJuZEZpbmQubV9kd1N0eWxlcyA9IGR3T3JpZ2luU3R5bGUgfCBYRkFfUkVTT0xWRU5PREVfQUxMOw0KKyAgICAgICAgWEZBX1Jlc29sdmVOb2Rlc19Ob3JtYWwocm5kRmluZCk7DQorICAgICAgICBybmRGaW5kLm1fZHdTdHlsZXMgPSBkd09yaWdpblN0eWxlOw0KKyAgICAgICAgcm5kRmluZC5tX3dzQ29uZGl0aW9uID0gd3NPcmlnaW5Db25kaXRpb247DQorICAgICAgICBpZiAocm5kRmluZC5tX05vZGVzLkdldFNpemUoKSA+IDApIHsNCisgICAgICAgICAgbm9kZXMuQXBwZW5kKHJuZEZpbmQubV9Ob2Rlcyk7DQorICAgICAgICAgIHJuZEZpbmQubV9Ob2Rlcy5SZW1vdmVBbGwoKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgY2hpbGQgPSBjaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsNCisgICAgfQ0KKyAgICBpZiAobm9kZXMuR2V0U2l6ZSgpID4gbk51bSkgew0KKyAgICAgIGlmIChtX3BOb2RlSGVscGVyLT5YRkFfTm9kZUlzVHJhbnNwYXJlbnQocGFyZW50Tm9kZSkpIHsNCisgICAgICAgIENYRkFfTm9kZUFycmF5IHVwQXJyYXlOb2RlczsNCisgICAgICAgIG1fcE5vZGVIZWxwZXItPlhGQV9Db3VudFNpYmxpbmdzKA0KKyAgICAgICAgICAgIChDWEZBX05vZGUqKW5vZGVzWzBdLCBYRkFfTE9HSUNfVHJhbnNwYXJlbnQsICZ1cEFycmF5Tm9kZXMsDQorICAgICAgICAgICAgISEoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfVGFnTmFtZSkpOw0KKyAgICAgICAgaWYgKHVwQXJyYXlOb2Rlcy5HZXRTaXplKCkgPiBub2Rlcy5HZXRTaXplKCkpIHsNCisgICAgICAgICAgdXBBcnJheU5vZGVzWzBdID0gKENYRkFfTm9kZSopbm9kZXNbMF07DQorICAgICAgICAgIG5vZGVzLlJlbW92ZUFsbCgpOw0KKyAgICAgICAgICBub2Rlcy5BcHBlbmQoKENYRkFfT2JqQXJyYXkmKXVwQXJyYXlOb2Rlcyk7DQorICAgICAgICAgIHVwQXJyYXlOb2Rlcy5SZW1vdmVBbGwoKTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgWEZBX1Jlc29sdmVOb2RlX0ZpbHRlckNvbmRpdGlvbihybmQsIHdzQ29uZGl0aW9uKTsNCisgICAgICBpZiAobm9kZXMuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgICAgcmV0dXJuIDE7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICB9DQorICBpZiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfUGFyZW50KSB7DQorICAgIEZYX0RXT1JEIGR3U3ViU3R5bGVzID0gWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzIHwgWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXM7DQorICAgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lKSB7DQorICAgICAgZHdTdWJTdHlsZXMgfD0gWEZBX1JFU09MVkVOT0RFX1RhZ05hbWU7DQorICAgIH0NCisgICAgaWYgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0FMTCkgew0KKyAgICAgIGR3U3ViU3R5bGVzIHw9IFhGQV9SRVNPTFZFTk9ERV9BTEw7DQorICAgIH0NCisgICAgcm5kRmluZC5tX2R3U3R5bGVzID0gZHdTdWJTdHlsZXM7DQorICAgIHJuZEZpbmQubV9DdXJOb2RlID0gcGFyZW50Tm9kZTsNCisgICAgQ1hGQV9Ob2RlQXJyYXkmIGFycmF5ID0gcm5kLm1fcFNDLT5HZXRVcE9iamVjdEFycmF5KCk7DQorICAgIGFycmF5LkFkZChwYXJlbnROb2RlKTsNCisgICAgWEZBX1Jlc29sdmVOb2Rlc19Ob3JtYWwocm5kRmluZCk7DQorICAgIGlmIChybmRGaW5kLm1fTm9kZXMuR2V0U2l6ZSgpID4gMCkgew0KKyAgICAgIG5vZGVzLkFwcGVuZChybmRGaW5kLm1fTm9kZXMpOw0KKyAgICAgIHJuZEZpbmQubV9Ob2Rlcy5SZW1vdmVBbGwoKTsNCisgICAgfQ0KKyAgICBpZiAobm9kZXMuR2V0U2l6ZSgpID4gbk51bSkgew0KKyAgICAgIHJldHVybiAxOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gMDsNCit9DQoraW50MzJfdCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZXNfQXN0ZXJpc2soDQorICAgIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKSB7DQorICBDWEZBX05vZGUqIGN1ck5vZGUgPSAoQ1hGQV9Ob2RlKilybmQubV9DdXJOb2RlOw0KKyAgQ1hGQV9PYmpBcnJheSYgbm9kZXMgPSBybmQubV9Ob2RlczsNCisgIENYRkFfTm9kZUFycmF5IGFycmF5Ow0KKyAgY3VyTm9kZS0+R2V0Tm9kZUxpc3QoYXJyYXksDQorICAgICAgICAgICAgICAgICAgICAgICBYRkFfTk9ERUZJTFRFUl9DaGlsZHJlbiB8IFhGQV9OT0RFRklMVEVSX1Byb3BlcnRpZXMpOw0KKyAgbm9kZXMuQXBwZW5kKChDWEZBX09iakFycmF5JilhcnJheSk7DQorICByZXR1cm4gbm9kZXMuR2V0U2l6ZSgpOw0KK30NCitpbnQzMl90IENYRkFfUmVzb2x2ZVByb2Nlc3Nvcjo6WEZBX1Jlc29sdmVOb2Rlc19Qb3BTdGFjaygNCisgICAgQ0ZYX0ludDMyQXJyYXkmIHN0YWNrKSB7DQorICBpbnQzMl90IG5UeXBlID0gLTE7DQorICBpbnQzMl90IGlTaXplID0gc3RhY2suR2V0U2l6ZSgpIC0gMTsNCisgIGlmIChpU2l6ZSA+IC0xKSB7DQorICAgIG5UeXBlID0gc3RhY2tbaVNpemVdOw0KKyAgICBzdGFjay5SZW1vdmVBdChpU2l6ZSwgMSk7DQorICB9DQorICByZXR1cm4gblR5cGU7DQorfQ0KK2ludDMyX3QgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpYRkFfUmVzb2x2ZU5vZGVzX0dldEZpbHRlcigNCisgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0V4cHJlc3Npb24sDQorICAgIGludDMyX3QgblN0YXJ0LA0KKyAgICBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCkgew0KKyAgRlhTWVNfYXNzZXJ0KG5TdGFydCA+IC0xKTsNCisgIGludDMyX3QgaUxlbmd0aCA9IHdzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKTsNCisgIGlmIChuU3RhcnQgPj0gaUxlbmd0aCkgew0KKyAgICByZXR1cm4gMDsNCisgIH0NCisgIENGWF9XaWRlU3RyaW5nJiB3c05hbWUgPSBybmQubV93c05hbWU7DQorICBDRlhfV2lkZVN0cmluZyYgd3NDb25kaXRpb24gPSBybmQubV93c0NvbmRpdGlvbjsNCisgIEZYX1dDSEFSKiBwTmFtZUJ1ZiA9IHdzTmFtZS5HZXRCdWZmZXIoaUxlbmd0aCAtIG5TdGFydCk7DQorICBGWF9XQ0hBUiogcENvbmRpdGlvbkJ1ZiA9IHdzQ29uZGl0aW9uLkdldEJ1ZmZlcihpTGVuZ3RoIC0gblN0YXJ0KTsNCisgIGludDMyX3Qgbk5hbWVDb3VudCA9IDA7DQorICBpbnQzMl90IG5Db25kaXRpb25Db3VudCA9IDA7DQorICBDRlhfSW50MzJBcnJheSBzdGFjazsNCisgIGludDMyX3QgblR5cGUgPSAtMTsNCisgIGNvbnN0IEZYX1dDSEFSKiBwU3JjID0gd3NFeHByZXNzaW9uLkdldFB0cigpOw0KKyAgRlhfV0NIQVIgd1ByZXYgPSAwLCB3Q3VyOw0KKyAgRlhfQk9PTCBiSXNDb25kaXRpb24gPSBGQUxTRTsNCisgIHdoaWxlIChuU3RhcnQgPCBpTGVuZ3RoKSB7DQorICAgIHdDdXIgPSBwU3JjW25TdGFydCsrXTsNCisgICAgaWYgKHdDdXIgPT0gJy4nKSB7DQorICAgICAgaWYgKHdQcmV2ID09ICdcXCcpIHsNCisgICAgICAgIHBOYW1lQnVmW25OYW1lQ291bnQgLSAxXSA9IHdQcmV2ID0gJy4nOw0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIGlmIChuTmFtZUNvdW50ID09IDApIHsNCisgICAgICAgIHBOYW1lQnVmW25OYW1lQ291bnQrK10gPSB3Q3VyOw0KKyAgICAgICAgY29udGludWU7DQorICAgICAgfQ0KKyAgICAgIEZYX1dDSEFSIHdMb29rYWhlYWQgPSBuU3RhcnQgPCBpTGVuZ3RoID8gcFNyY1tuU3RhcnRdIDogMDsNCisgICAgICBpZiAod0xvb2thaGVhZCAhPSAnWycgJiYgd0xvb2thaGVhZCAhPSAnKCcpIHsNCisgICAgICAgIGlmIChuVHlwZSA8IDApIHsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmICh3Q3VyID09ICdbJyB8fCB3Q3VyID09ICcoJykgew0KKyAgICAgIGJJc0NvbmRpdGlvbiA9IFRSVUU7DQorICAgIH0gZWxzZSBpZiAod0N1ciA9PSAnLicgJiYgblN0YXJ0IDwgaUxlbmd0aCAmJg0KKyAgICAgICAgICAgICAgIChwU3JjW25TdGFydF0gPT0gJ1snIHx8IHBTcmNbblN0YXJ0XSA9PSAnKCcpKSB7DQorICAgICAgYklzQ29uZGl0aW9uID0gVFJVRTsNCisgICAgfQ0KKyAgICBpZiAoYklzQ29uZGl0aW9uKSB7DQorICAgICAgcENvbmRpdGlvbkJ1ZltuQ29uZGl0aW9uQ291bnQrK10gPSB3Q3VyOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHBOYW1lQnVmW25OYW1lQ291bnQrK10gPSB3Q3VyOw0KKyAgICB9DQorICAgIEZYX0JPT0wgYlJlY3Vyc2l2ZSA9IFRSVUU7DQorICAgIHN3aXRjaCAoblR5cGUpIHsNCisgICAgICBjYXNlIDA6DQorICAgICAgICBpZiAod0N1ciA9PSAnXScpIHsNCisgICAgICAgICAgblR5cGUgPSBYRkFfUmVzb2x2ZU5vZGVzX1BvcFN0YWNrKHN0YWNrKTsNCisgICAgICAgICAgYlJlY3Vyc2l2ZSA9IEZBTFNFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSAxOg0KKyAgICAgICAgaWYgKHdDdXIgPT0gJyknKSB7DQorICAgICAgICAgIG5UeXBlID0gWEZBX1Jlc29sdmVOb2Rlc19Qb3BTdGFjayhzdGFjayk7DQorICAgICAgICAgIGJSZWN1cnNpdmUgPSBGQUxTRTsNCisgICAgICAgIH0NCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgMjoNCisgICAgICAgIGlmICh3Q3VyID09ICciJykgew0KKyAgICAgICAgICBuVHlwZSA9IFhGQV9SZXNvbHZlTm9kZXNfUG9wU3RhY2soc3RhY2spOw0KKyAgICAgICAgICBiUmVjdXJzaXZlID0gRkFMU0U7DQorICAgICAgICB9DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBpZiAoYlJlY3Vyc2l2ZSkgew0KKyAgICAgIHN3aXRjaCAod0N1cikgew0KKyAgICAgICAgY2FzZSAnWyc6DQorICAgICAgICAgIHN0YWNrLkFkZChuVHlwZSk7DQorICAgICAgICAgIG5UeXBlID0gMDsNCisgICAgICAgICAgYnJlYWs7DQorICAgICAgICBjYXNlICcoJzoNCisgICAgICAgICAgc3RhY2suQWRkKG5UeXBlKTsNCisgICAgICAgICAgblR5cGUgPSAxOw0KKyAgICAgICAgICBicmVhazsNCisgICAgICAgIGNhc2UgJyInOg0KKyAgICAgICAgICBzdGFjay5BZGQoblR5cGUpOw0KKyAgICAgICAgICBuVHlwZSA9IDI7DQorICAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICB3UHJldiA9IHdDdXI7DQorICB9DQorICBpZiAoc3RhY2suR2V0U2l6ZSgpID4gMCkgew0KKyAgICByZXR1cm4gLTE7DQorICB9DQorICB3c05hbWUuUmVsZWFzZUJ1ZmZlcihuTmFtZUNvdW50KTsNCisgIHdzTmFtZS5UcmltTGVmdCgpOw0KKyAgd3NOYW1lLlRyaW1SaWdodCgpOw0KKyAgd3NDb25kaXRpb24uUmVsZWFzZUJ1ZmZlcihuQ29uZGl0aW9uQ291bnQpOw0KKyAgd3NDb25kaXRpb24uVHJpbUxlZnQoKTsNCisgIHdzQ29uZGl0aW9uLlRyaW1SaWdodCgpOw0KKyAgcm5kLm1fdUhhc2hOYW1lID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NOYW1lLCB3c05hbWUuR2V0TGVuZ3RoKCkpOw0KKyAgcmV0dXJuIG5TdGFydDsNCit9DQordm9pZCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZV9Db25kaXRpb25BcnJheSgNCisgICAgaW50MzJfdCBpQ3VySW5kZXgsDQorICAgIENGWF9XaWRlU3RyaW5nIHdzQ29uZGl0aW9uLA0KKyAgICBpbnQzMl90IGlGb3VuZENvdW50LA0KKyAgICBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCkgew0KKyAgQ1hGQV9Ob2RlQXJyYXkmIGZpbmROb2RlcyA9IChDWEZBX05vZGVBcnJheSYpcm5kLm1fTm9kZXM7DQorICBpbnQzMl90IGlMZW4gPSB3c0NvbmRpdGlvbi5HZXRMZW5ndGgoKTsNCisgIEZYX0JPT0wgYlJlbGF0aXZlID0gRkFMU0U7DQorICBGWF9CT09MIGJBbGwgPSBGQUxTRTsNCisgIGludDMyX3QgaSA9IDE7DQorICBmb3IgKDsgaSA8IGlMZW47ICsraSkgew0KKyAgICBGWF9XQ0hBUiBjaCA9IHdzQ29uZGl0aW9uW2ldOw0KKyAgICBpZiAoY2ggPT0gJyAnKSB7DQorICAgICAgY29udGludWU7DQorICAgIH0NCisgICAgaWYgKGNoID09ICcrJyB8fCBjaCA9PSAnLScpIHsNCisgICAgICBiUmVsYXRpdmUgPSBUUlVFOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9IGVsc2UgaWYgKGNoID09ICcqJykgew0KKyAgICAgIGJBbGwgPSBUUlVFOw0KKyAgICAgIGJyZWFrOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9DQorICBpZiAoYkFsbCkgew0KKyAgICBpZiAocm5kLm1fZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQ3JlYXRlTm9kZSkgew0KKyAgICAgIGlmIChybmQubV9kd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9CaW5kKSB7DQorICAgICAgICBtX3BOb2RlSGVscGVyLT5tX3BDcmVhdGVQYXJlbnQgPSAoQ1hGQV9Ob2RlKilybmQubV9DdXJOb2RlOw0KKyAgICAgICAgbV9wTm9kZUhlbHBlci0+bV9pQ3JlYXRlQ291bnQgPSAxOw0KKyAgICAgICAgZmluZE5vZGVzLlJlbW92ZUFsbCgpOw0KKyAgICAgICAgbV9wTm9kZUhlbHBlci0+bV9pQ3VyQWxsU3RhcnQgPSAtMTsNCisgICAgICAgIG1fcE5vZGVIZWxwZXItPm1fcEFsbFN0YXJ0UGFyZW50ID0gTlVMTDsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaWYgKG1fcE5vZGVIZWxwZXItPm1faUN1ckFsbFN0YXJ0ID09IC0xKSB7DQorICAgICAgICAgIG1fcE5vZGVIZWxwZXItPm1faUN1ckFsbFN0YXJ0ID0gbV9pQ3VyU3RhcnQ7DQorICAgICAgICAgIG1fcE5vZGVIZWxwZXItPm1fcEFsbFN0YXJ0UGFyZW50ID0gKENYRkFfTm9kZSopcm5kLm1fQ3VyTm9kZTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgIH0gZWxzZSBpZiAocm5kLm1fZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQmluZE5ldykgew0KKyAgICAgIGlmIChtX3BOb2RlSGVscGVyLT5tX2lDdXJBbGxTdGFydCA9PSAtMSkgew0KKyAgICAgICAgbV9wTm9kZUhlbHBlci0+bV9pQ3VyQWxsU3RhcnQgPSBtX2lDdXJTdGFydDsNCisgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKGlGb3VuZENvdW50ID09IDEgJiYgIWlMZW4pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX1dpZGVTdHJpbmcgd3NJbmRleDsNCisgIHdzSW5kZXggPSB3c0NvbmRpdGlvbi5NaWQoaSwgaUxlbiAtIDEgLSBpKTsNCisgIGludDMyX3QgaUluZGV4ID0gd3NJbmRleC5HZXRJbnRlZ2VyKCk7DQorICBpZiAoYlJlbGF0aXZlKSB7DQorICAgIGlJbmRleCArPSBpQ3VySW5kZXg7DQorICB9DQorICBpZiAoaUZvdW5kQ291bnQgPD0gaUluZGV4IHx8IGlJbmRleCA8IDApIHsNCisgICAgaWYgKHJuZC5tX2R3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0NyZWF0ZU5vZGUpIHsNCisgICAgICBtX3BOb2RlSGVscGVyLT5tX3BDcmVhdGVQYXJlbnQgPSAoQ1hGQV9Ob2RlKilybmQubV9DdXJOb2RlOw0KKyAgICAgIG1fcE5vZGVIZWxwZXItPm1faUNyZWF0ZUNvdW50ID0gaUluZGV4IC0gaUZvdW5kQ291bnQgKyAxOw0KKyAgICB9DQorICAgIGZpbmROb2Rlcy5SZW1vdmVBbGwoKTsNCisgIH0gZWxzZSB7DQorICAgIENYRkFfTm9kZSogcmV0ID0gZmluZE5vZGVzW2lJbmRleF07DQorICAgIGZpbmROb2Rlcy5SZW1vdmVBbGwoKTsNCisgICAgZmluZE5vZGVzLkFkZChyZXQpOw0KKyAgfQ0KK30NCit2b2lkIENYRkFfUmVzb2x2ZVByb2Nlc3Nvcjo6WEZBX1Jlc29sdmVOb2RlX0RvUHJlZGljYXRlRmlsdGVyKA0KKyAgICBpbnQzMl90IGlDdXJJbmRleCwNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb25kaXRpb24sDQorICAgIGludDMyX3QgaUZvdW5kQ291bnQsDQorICAgIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKSB7DQorICBDWEZBX05vZGVBcnJheSYgZmluZE5vZGVzID0gKENYRkFfTm9kZUFycmF5JilybmQubV9Ob2RlczsNCisgIEZYU1lTX2Fzc2VydChpRm91bmRDb3VudCA9PSBmaW5kTm9kZXMuR2V0U2l6ZSgpKTsNCisgIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbjsNCisgIElYRkFfU2NyaXB0Q29udGV4dCogcENvbnRleHQgPSBOVUxMOw0KKyAgWEZBX1NDUklQVExBTkdUWVBFIGVMYW5nVHlwZSA9IFhGQV9TQ1JJUFRMQU5HVFlQRV9Vbmtvd247DQorICBpZiAod3NDb25kaXRpb24uTGVmdCgyKSA9PSBGWF9XU1RSQyhMIi5bIikgJiYNCisgICAgICB3c0NvbmRpdGlvbi5SaWdodCgxKSA9PSBGWF9XU1RSQyhMIl0iKSkgew0KKyAgICBlTGFuZ1R5cGUgPSBYRkFfU0NSSVBUTEFOR1RZUEVfRm9ybWNhbGM7DQorICB9IGVsc2UgaWYgKHdzQ29uZGl0aW9uLkxlZnQoMikgPT0gRlhfV1NUUkMoTCIuKCIpICYmDQorICAgICAgICAgICAgIHdzQ29uZGl0aW9uLlJpZ2h0KDEpID09IEZYX1dTVFJDKEwiKSIpKSB7DQorICAgIGVMYW5nVHlwZSA9IFhGQV9TQ1JJUFRMQU5HVFlQRV9KYXZhc2NyaXB0Ow0KKyAgfSBlbHNlIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgcENvbnRleHQgPSBybmQubV9wU0M7DQorICB3c0V4cHJlc3Npb24gPSB3c0NvbmRpdGlvbi5NaWQoMiwgd3NDb25kaXRpb24uR2V0TGVuZ3RoKCkgLSAzKTsNCisgIGZvciAoaW50MzJfdCBpID0gaUZvdW5kQ291bnQgLSAxOyBpID49IDA7IGktLSkgew0KKyAgICBDWEZBX09iamVjdCogbm9kZSA9IGZpbmROb2Rlc1tpXTsNCisgICAgRlhfQk9PTCBiUmV0ID0gRkFMU0U7DQorICAgIEZYSlNFX0hWQUxVRSBwUmV0VmFsdWUgPSBGWEpTRV9WYWx1ZV9DcmVhdGUocm5kLm1fcFNDLT5HZXRSdW50aW1lKCkpOw0KKyAgICBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChlTGFuZ1R5cGUsIHdzRXhwcmVzc2lvbiwgcFJldFZhbHVlLCBub2RlKTsNCisgICAgaWYgKCFiUmV0IHx8ICFGWEpTRV9WYWx1ZV9Ub0Jvb2xlYW4ocFJldFZhbHVlKSkgew0KKyAgICAgIGZpbmROb2Rlcy5SZW1vdmVBdChpKTsNCisgICAgfQ0KKyAgICBGWEpTRV9WYWx1ZV9SZWxlYXNlKHBSZXRWYWx1ZSk7DQorICB9DQorICByZXR1cm47DQorfQ0KK3ZvaWQgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpYRkFfUmVzb2x2ZU5vZGVfRmlsdGVyQ29uZGl0aW9uKA0KKyAgICBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCwNCisgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb25kaXRpb24pIHsNCisgIENYRkFfTm9kZUFycmF5JiBmaW5kTm9kZXMgPSAoQ1hGQV9Ob2RlQXJyYXkmKXJuZC5tX05vZGVzOw0KKyAgaW50MzJfdCBpQ3VyckluZGV4ID0gMDsNCisgIGNvbnN0IENYRkFfTm9kZUFycmF5JiBhcnJheSA9IHJuZC5tX3BTQy0+R2V0VXBPYmplY3RBcnJheSgpOw0KKyAgaW50MzJfdCBpU2l6ZSA9IGFycmF5LkdldFNpemUoKTsNCisgIGlmIChpU2l6ZSkgew0KKyAgICBDWEZBX05vZGUqIGN1ck5vZGUgPSBhcnJheVtpU2l6ZSAtIDFdOw0KKyAgICBGWF9CT09MIGJJc1Byb3BlcnR5ID0gbV9wTm9kZUhlbHBlci0+WEZBX05vZGVJc1Byb3BlcnR5KGN1ck5vZGUpOw0KKyAgICBpZiAoY3VyTm9kZS0+SXNVbm5hbWVkKCkgfHwNCisgICAgICAgIChiSXNQcm9wZXJ0eSAmJiBjdXJOb2RlLT5HZXRDbGFzc0lEKCkgIT0gWEZBX0VMRU1FTlRfUGFnZVNldCkpIHsNCisgICAgICBpQ3VyckluZGV4ID0gbV9wTm9kZUhlbHBlci0+WEZBX0dldEluZGV4KGN1ck5vZGUsIFhGQV9MT0dJQ19UcmFuc3BhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJc1Byb3BlcnR5LCBUUlVFKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBpQ3VyckluZGV4ID0gbV9wTm9kZUhlbHBlci0+WEZBX0dldEluZGV4KGN1ck5vZGUsIFhGQV9MT0dJQ19UcmFuc3BhcmVudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJc1Byb3BlcnR5LCBGQUxTRSk7DQorICAgIH0NCisgIH0NCisgIGludDMyX3QgaUZvdW5kQ291bnQgPSBmaW5kTm9kZXMuR2V0U2l6ZSgpOw0KKyAgd3NDb25kaXRpb24uVHJpbUxlZnQoKTsNCisgIHdzQ29uZGl0aW9uLlRyaW1SaWdodCgpOw0KKyAgaW50MzJfdCBpTGVuID0gd3NDb25kaXRpb24uR2V0TGVuZ3RoKCk7DQorICBpZiAoIWlMZW4pIHsNCisgICAgaWYgKHJuZC5tX2R3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0FMTCkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAoaUZvdW5kQ291bnQgPT0gMSkgew0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAoaUZvdW5kQ291bnQgPD0gaUN1cnJJbmRleCkgew0KKyAgICAgIGlmIChybmQubV9kd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9DcmVhdGVOb2RlKSB7DQorICAgICAgICBtX3BOb2RlSGVscGVyLT5tX3BDcmVhdGVQYXJlbnQgPSAoQ1hGQV9Ob2RlKilybmQubV9DdXJOb2RlOw0KKyAgICAgICAgbV9wTm9kZUhlbHBlci0+bV9pQ3JlYXRlQ291bnQgPSBpQ3VyckluZGV4IC0gaUZvdW5kQ291bnQgKyAxOw0KKyAgICAgIH0NCisgICAgICBmaW5kTm9kZXMuUmVtb3ZlQWxsKCk7DQorICAgICAgcmV0dXJuOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIENYRkFfTm9kZSogcmV0ID0gZmluZE5vZGVzW2lDdXJySW5kZXhdOw0KKyAgICAgIGZpbmROb2Rlcy5SZW1vdmVBbGwoKTsNCisgICAgICBmaW5kTm9kZXMuQWRkKHJldCk7DQorICAgICAgcmV0dXJuOw0KKyAgICB9DQorICB9DQorICBGWF9XQ0hBUiB3VHlwZUNoYXIgPSB3c0NvbmRpdGlvblswXTsNCisgIHN3aXRjaCAod1R5cGVDaGFyKSB7DQorICAgIGNhc2UgJ1snOg0KKyAgICAgIFhGQV9SZXNvbHZlTm9kZV9Db25kaXRpb25BcnJheShpQ3VyckluZGV4LCB3c0NvbmRpdGlvbiwgaUZvdW5kQ291bnQsIHJuZCk7DQorICAgICAgcmV0dXJuOw0KKyAgICBjYXNlICcoJzoNCisgICAgICByZXR1cm47DQorICAgIGNhc2UgJyInOg0KKyAgICAgIHJldHVybjsNCisgICAgY2FzZSAnLic6DQorICAgICAgaWYgKGlMZW4gPiAxICYmICh3c0NvbmRpdGlvblsxXSA9PSAnWycgfHwgd3NDb25kaXRpb25bMV0gPT0gJygnKSkgew0KKyAgICAgICAgWEZBX1Jlc29sdmVOb2RlX0RvUHJlZGljYXRlRmlsdGVyKGlDdXJySW5kZXgsIHdzQ29uZGl0aW9uLCBpRm91bmRDb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmQpOw0KKyAgICAgIH0NCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm47DQorICB9DQorfQ0KK3ZvaWQgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpYRkFfUmVzb2x2ZU5vZGVzX1NldFN0eWxlc0ZvckNoaWxkKA0KKyAgICBGWF9EV09SRCBkd1BhcmVudFN0eWxlcywNCisgICAgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhJiBybmQpIHsNCisgIEZYX0RXT1JEIGR3U3ViU3R5bGVzID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuOw0KKyAgaWYgKGR3UGFyZW50U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX1RhZ05hbWUpIHsNCisgICAgZHdTdWJTdHlsZXMgfD0gWEZBX1JFU09MVkVOT0RFX1RhZ05hbWU7DQorICB9DQorICBkd1N1YlN0eWxlcyAmPSB+WEZBX1JFU09MVkVOT0RFX1BhcmVudDsNCisgIGR3U3ViU3R5bGVzICY9IH5YRkFfUkVTT0xWRU5PREVfU2libGluZ3M7DQorICBkd1N1YlN0eWxlcyAmPSB+WEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXM7DQorICBkd1N1YlN0eWxlcyB8PSBYRkFfUkVTT0xWRU5PREVfQUxMOw0KKyAgcm5kLm1fZHdTdHlsZXMgPSBkd1N1YlN0eWxlczsNCit9DQoraW50MzJfdCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlhGQV9SZXNvbHZlTm9kZV9TZXRSZXN1bHRDcmVhdGVOb2RlKA0KKyAgICBYRkFfUkVTT0xWRU5PREVfUlMmIHJlc29sdmVOb2RlUlMsDQorICAgIENGWF9XaWRlU3RyaW5nJiB3c0xhc3RDb25kaXRpb24pIHsNCisgIGlmIChtX3BOb2RlSGVscGVyLT5tX3BDcmVhdGVQYXJlbnQpIHsNCisgICAgcmVzb2x2ZU5vZGVSUy5ub2Rlcy5BZGQobV9wTm9kZUhlbHBlci0+bV9wQ3JlYXRlUGFyZW50KTsNCisgIH0gZWxzZSB7DQorICAgIG1fcE5vZGVIZWxwZXItPlhGQV9DcmVhdGVOb2RlX0ZvckNvbmRpdGlvbih3c0xhc3RDb25kaXRpb24pOw0KKyAgfQ0KKyAgcmVzb2x2ZU5vZGVSUy5kd0ZsYWdzID0gbV9wTm9kZUhlbHBlci0+bV9pQ3JlYXRlRmxhZzsNCisgIGlmIChyZXNvbHZlTm9kZVJTLmR3RmxhZ3MgPT0gWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlT25lKSB7DQorICAgIGlmIChtX3BOb2RlSGVscGVyLT5tX2lDdXJBbGxTdGFydCAhPSAtMSkgew0KKyAgICAgIHJlc29sdmVOb2RlUlMuZHdGbGFncyA9IFhGQV9SRVNPTFZFTk9ERV9SU1RZUEVfQ3JlYXRlTm9kZU1pZEFsbDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIHJlc29sdmVOb2RlUlMubm9kZXMuR2V0U2l6ZSgpOw0KK30NCit2b2lkIENYRkFfUmVzb2x2ZVByb2Nlc3Nvcjo6WEZBX1Jlc29sdmVOb2RlX1NldEluZGV4RGF0YUJpbmQoDQorICAgIENGWF9XaWRlU3RyaW5nJiB3c05leHRDb25kaXRpb24sDQorICAgIGludDMyX3QmIGlJbmRleCwNCisgICAgaW50MzJfdCBpQ291bnQpIHsNCisgIGlmIChtX3BOb2RlSGVscGVyLT5YRkFfQ3JlYXRlTm9kZV9Gb3JDb25kaXRpb24od3NOZXh0Q29uZGl0aW9uKSkgew0KKyAgICBpZiAobV9wTm9kZUhlbHBlci0+bV9lTGFzdENyZWF0ZVR5cGUgPT0gWEZBX0VMRU1FTlRfRGF0YUdyb3VwKSB7DQorICAgICAgaUluZGV4ID0gMDsNCisgICAgfSBlbHNlIHsNCisgICAgICBpSW5kZXggPSBpQ291bnQgLSAxOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBpSW5kZXggPSBpQ291bnQgLSAxOw0KKyAgfQ0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X3Jlc29sdmVwcm9jZXNzb3IuaCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfcmVzb2x2ZXByb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMWYyNTQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X3Jlc29sdmVwcm9jZXNzb3IuaApAQCAtMCwwICsxLDc5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgX1hGQV9SRVNPTFZFUFJPQ0VTU09SX0hfDQorI2RlZmluZSBfWEZBX1JFU09MVkVQUk9DRVNTT1JfSF8NCitjbGFzcyBDWEZBX05vZGVIZWxwZXI7DQorY2xhc3MgQ1hGQV9TY3JpcHRDb250ZXh0Ow0KK2NsYXNzIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSB7DQorIHB1YmxpYzoNCisgIENYRkFfUmVzb2x2ZU5vZGVzRGF0YShDWEZBX1NjcmlwdENvbnRleHQqIHBTQyA9IE5VTEwpDQorICAgICAgOiBtX3BTQyhwU0MpLA0KKyAgICAgICAgbV9DdXJOb2RlKE5VTEwpLA0KKyAgICAgICAgbV93c05hbWUoKSwNCisgICAgICAgIG1fdUhhc2hOYW1lKDApLA0KKyAgICAgICAgbV93c0NvbmRpdGlvbigpLA0KKyAgICAgICAgbV9uTGV2ZWwoMCksDQorICAgICAgICBtX05vZGVzKCksDQorICAgICAgICBtX2R3U3R5bGVzKFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiksDQorICAgICAgICBtX3BTY3JpcHRBdHRyaWJ1dGUoTlVMTCksDQorICAgICAgICBtX2R3RmxhZyhYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfTm9kZXMpIHt9DQorICB+Q1hGQV9SZXNvbHZlTm9kZXNEYXRhKCkgeyBtX05vZGVzLlJlbW92ZUFsbCgpOyB9DQorICBDWEZBX1NjcmlwdENvbnRleHQqIG1fcFNDOw0KKyAgQ1hGQV9PYmplY3QqIG1fQ3VyTm9kZTsNCisgIENGWF9XaWRlU3RyaW5nIG1fd3NOYW1lOw0KKyAgdWludDMyX3QgbV91SGFzaE5hbWU7DQorICBDRlhfV2lkZVN0cmluZyBtX3dzQ29uZGl0aW9uOw0KKyAgaW50MzJfdCBtX25MZXZlbDsNCisgIENYRkFfT2JqQXJyYXkgbV9Ob2RlczsNCisgIEZYX0RXT1JEIG1fZHdTdHlsZXM7DQorICBYRkFfTFBDU0NSSVBUQVRUUklCVVRFSU5GTyBtX3BTY3JpcHRBdHRyaWJ1dGU7DQorICBYRkFfUkVTT1ZFTk9ERV9SU1RZUEUgbV9kd0ZsYWc7DQorfTsNCitjbGFzcyBDWEZBX1Jlc29sdmVQcm9jZXNzb3Igew0KKyBwdWJsaWM6DQorICBDWEZBX1Jlc29sdmVQcm9jZXNzb3Iodm9pZCk7DQorICB+Q1hGQV9SZXNvbHZlUHJvY2Vzc29yKHZvaWQpOw0KKyAgaW50MzJfdCBYRkFfUmVzb2x2ZU5vZGVzKENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKTsNCisgIGludDMyX3QgWEZBX1Jlc29sdmVOb2Rlc19BbnlDaGlsZChDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCk7DQorICBpbnQzMl90IFhGQV9SZXNvbHZlTm9kZXNfRG9sbGFyKENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKTsNCisgIGludDMyX3QgWEZBX1Jlc29sdmVOb2Rlc19FeGNhbG1hdG9yeShDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCk7DQorICBpbnQzMl90IFhGQV9SZXNvbHZlTm9kZXNfTnVtYmVyU2lnbihDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCk7DQorICBpbnQzMl90IFhGQV9SZXNvbHZlTm9kZXNfQXN0ZXJpc2soQ1hGQV9SZXNvbHZlTm9kZXNEYXRhJiBybmQpOw0KKyAgaW50MzJfdCBYRkFfUmVzb2x2ZU5vZGVzX05vcm1hbChDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCk7DQorICBpbnQzMl90IFhGQV9SZXNvbHZlTm9kZXNfRm9yQXR0cmlidXRlUnMoQ1hGQV9PYmplY3QqIGN1ck5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhJiBybmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHJBdHRyKTsNCisgIHZvaWQgWEZBX1Jlc29sdmVOb2RlX0NvbmRpdGlvbkFycmF5KGludDMyX3QgaUN1ckluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb25kaXRpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlGb3VuZENvdW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhJiBybmQpOw0KKyAgdm9pZCBYRkFfUmVzb2x2ZU5vZGVfRG9QcmVkaWNhdGVGaWx0ZXIoaW50MzJfdCBpQ3VySW5kZXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbmRpdGlvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZvdW5kQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCk7DQorICBpbnQzMl90IFhGQV9SZXNvbHZlTm9kZXNfR2V0RmlsdGVyKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NFeHByZXNzaW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TdGFydCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhJiBybmQpOw0KKyAgdm9pZCBYRkFfUmVzb2x2ZU5vZGVfRmlsdGVyQ29uZGl0aW9uKENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29uZGl0aW9uKTsNCisgIGludDMyX3QgWEZBX1Jlc29sdmVOb2Rlc19Qb3BTdGFjayhDRlhfSW50MzJBcnJheSYgc3RhY2spOw0KKyAgdm9pZCBYRkFfUmVzb2x2ZU5vZGVzX1NldFN0eWxlc0ZvckNoaWxkKEZYX0RXT1JEIGR3UGFyZW50U3R5bGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKTsNCisgIGludDMyX3QgWEZBX1Jlc29sdmVOb2RlX1NldFJlc3VsdENyZWF0ZU5vZGUoWEZBX1JFU09MVkVOT0RFX1JTJiByZXNvbHZlTm9kZVJTLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NMYXN0Q29uZGl0aW9uKTsNCisgIHZvaWQgWEZBX1Jlc29sdmVOb2RlX1NldEluZGV4RGF0YUJpbmQoQ0ZYX1dpZGVTdHJpbmcmIHdzTmV4dENvbmRpdGlvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUluZGV4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCk7DQorICBDWEZBX05vZGVIZWxwZXIqIEdldE5vZGVIZWxwZXIoKSB7IHJldHVybiBtX3BOb2RlSGVscGVyOyB9DQorDQorIHByaXZhdGU6DQorICBDWEZBX05vZGVIZWxwZXIqIG1fcE5vZGVIZWxwZXI7DQorDQorIHB1YmxpYzoNCisgIGludDMyX3QgbV9pQ3VyU3RhcnQ7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X3NpZ25hdHVyZXBzZXVkb21vZGVsLmNwcCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfc2lnbmF0dXJlcHNldWRvbW9kZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZmIyNGQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4ZmEvc3JjL3BhcnNlci94ZmFfc2NyaXB0X3NpZ25hdHVyZXBzZXVkb21vZGVsLmNwcApAQCAtMCwwICsxLDEyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfdXRpbHMuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX29iamVjdC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZG9jdW1lbnQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX3BhcnNlci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfc2NyaXB0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NkYXRhLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2NsYXlvdXQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2xvY2FsZW1nci5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfZm0yanNhcGkuaCINCisjaW5jbHVkZSAieGZhX3NjcmlwdF9zaWduYXR1cmVwc2V1ZG9tb2RlbC5oIg0KK0NTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWw6OkNTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWwoDQorICAgIENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCkNCisgICAgOiBDWEZBX09yZGluYXJ5T2JqZWN0KHBEb2N1bWVudCwgWEZBX0VMRU1FTlRfU2lnbmF0dXJlUHNldWRvTW9kZWwpIHsNCisgIG1fdVNjcmlwdEhhc2ggPSBYRkFfSEFTSENPREVfU2lnbmF0dXJlOw0KK30NCitDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsOjp+Q1NjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbCgpIHt9DQordm9pZCBDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsOjpTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWxfVmVyaWZ5KA0KKyAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7DQorICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsNCisgIGlmIChpTGVuZ3RoIDwgMSB8fCBpTGVuZ3RoID4gNCkgew0KKyAgICBUaHJvd1NjcmlwdEVycm9yTWVzc2FnZShYRkFfSURTX0lOQ09SUkVDVF9OVU1CRVJfT0ZfTUVUSE9ELCBMInZlcmlmeSIpOw0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX05vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0Tm90aWZ5KCk7DQorICBpZiAoIXBOb3RpZnkpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Eb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7DQorICBDWEZBX05vZGUqIHBOb2RlID0gTlVMTDsNCisgIGlmIChpTGVuZ3RoID49IDEpIHsNCisgICAgcE5vZGUgPSAoQ1hGQV9Ob2RlKilwQXJndW1lbnRzLT5HZXRPYmplY3QoMCk7DQorICB9DQorICBpbnQzMl90IGJWZXJpZnkgPSBwTm90aWZ5LT5HZXREb2NQcm92aWRlcigpLT5WZXJpZnkoaERvYywgcE5vZGUpOw0KKyAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQorICBpZiAoaFZhbHVlKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEludGVnZXIoaFZhbHVlLCBiVmVyaWZ5KTsNCisgIH0NCit9DQordm9pZCBDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsOjpTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWxfU2lnbigNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCA8IDMgfHwgaUxlbmd0aCA+IDcpIHsNCisgICAgVGhyb3dTY3JpcHRFcnJvck1lc3NhZ2UoWEZBX0lEU19JTkNPUlJFQ1RfTlVNQkVSX09GX01FVEhPRCwgTCJzaWduIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX0RvYyogaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCisgIENYRkFfTm9kZUxpc3QqIHBOb2RlTGlzdCA9IE5VTEw7DQorICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb247DQorICBDRlhfV2lkZVN0cmluZyB3c1hNTElkZW50Ow0KKyAgaWYgKGlMZW5ndGggPj0gMSkgew0KKyAgICBwTm9kZUxpc3QgPSAoQ1hGQV9Ob2RlTGlzdCopcEFyZ3VtZW50cy0+R2V0T2JqZWN0KDApOw0KKyAgfQ0KKyAgaWYgKGlMZW5ndGggPj0gMikgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBic0V4cHJlc3Npb24gPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDEpOw0KKyAgICB3c0V4cHJlc3Npb24gPQ0KKyAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzRXhwcmVzc2lvbiwgYnNFeHByZXNzaW9uLkdldExlbmd0aCgpKTsNCisgIH0NCisgIGlmIChpTGVuZ3RoID49IDMpIHsNCisgICAgQ0ZYX0J5dGVTdHJpbmcgYnNYTUxJZGVudCA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMik7DQorICAgIHdzWE1MSWRlbnQgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNYTUxJZGVudCwgYnNYTUxJZGVudC5HZXRMZW5ndGgoKSk7DQorICB9DQorICBGWF9CT09MIGJTaWduID0gcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+U2lnbihoRG9jLCBwTm9kZUxpc3QsIHdzRXhwcmVzc2lvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzWE1MSWRlbnQpOw0KKyAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQorICBpZiAoaFZhbHVlKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oaFZhbHVlLCBiU2lnbik7DQorICB9DQorfQ0KK3ZvaWQgQ1NjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbDo6U2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsX0VudW1lcmF0ZSgNCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgew0KKyAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7DQorICBpZiAoaUxlbmd0aCAhPSAwKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiZW51bWVyYXRlIik7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXROb3RpZnkoKTsNCisgIGlmICghcE5vdGlmeSkgew0KKyAgICByZXR1cm47DQorICB9DQorICBJWEZBX0RvYyogaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsNCisgIENYRkFfTm9kZUxpc3QqIHBMaXN0ID0gcE5vdGlmeS0+R2V0RG9jUHJvdmlkZXIoKS0+RW51bWVyYXRlKGhEb2MpOw0KKyAgRlhKU0VfVmFsdWVfU2V0KHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocExpc3QpKTsNCit9DQordm9pZCBDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsOjpTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWxfQ2xlYXIoDQorICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsNCisgIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOw0KKyAgaWYgKGlMZW5ndGggPCAxIHx8IGlMZW5ndGggPiAyKSB7DQorICAgIFRocm93U2NyaXB0RXJyb3JNZXNzYWdlKFhGQV9JRFNfSU5DT1JSRUNUX05VTUJFUl9PRl9NRVRIT0QsIEwiY2xlYXIiKTsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgSVhGQV9Ob3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPkdldE5vdGlmeSgpOw0KKyAgaWYgKCFwTm90aWZ5KSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIElYRkFfRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOw0KKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IE5VTEw7DQorICBGWF9CT09MIGJDbGVhciA9IFRSVUU7DQorICBpZiAoaUxlbmd0aCA+PSAxKSB7DQorICAgIHBOb2RlID0gKENYRkFfTm9kZSopcEFyZ3VtZW50cy0+R2V0T2JqZWN0KDApOw0KKyAgfQ0KKyAgaWYgKGlMZW5ndGggPj0gMikgew0KKyAgICBiQ2xlYXIgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigxKSA9PSAwID8gRkFMU0UgOiBUUlVFOw0KKyAgfQ0KKyAgRlhfQk9PTCBiRmxhZyA9IHBOb3RpZnktPkdldERvY1Byb3ZpZGVyKCktPkNsZWFyKGhEb2MsIHBOb2RlLCBiQ2xlYXIpOw0KKyAgRlhKU0VfSFZBTFVFIGhWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7DQorICBpZiAoaFZhbHVlKSB7DQorICAgIEZYSlNFX1ZhbHVlX1NldEJvb2xlYW4oaFZhbHVlLCBiRmxhZyk7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfc2lnbmF0dXJlcHNldWRvbW9kZWwuaCBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV9zY3JpcHRfc2lnbmF0dXJlcHNldWRvbW9kZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2ExMGI0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3NjcmlwdF9zaWduYXR1cmVwc2V1ZG9tb2RlbC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBfU0NSSVBUX1NJR05BVFVSRVBTRVVET01PREVMX0hfDQorI2RlZmluZSBfU0NSSVBUX1NJR05BVFVSRVBTRVVET01PREVMX0hfDQorY2xhc3MgQ1NjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbCA6IHB1YmxpYyBDWEZBX09yZGluYXJ5T2JqZWN0IHsNCisgcHVibGljOg0KKyAgQ1NjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpOw0KKyAgfkNTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWwoKTsNCisgIHZvaWQgU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsX1ZlcmlmeShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCisgIHZvaWQgU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsX1NpZ24oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbF9FbnVtZXJhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7DQorICB2b2lkIFNjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbF9DbGVhcihDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsNCit9Ow0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV91dGlsc19pbXAuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3V0aWxzX2ltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0YmMzMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV91dGlsc19pbXAuY3BwCkBAIC0wLDAgKzEsNDAxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV91dGlscy5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfb2JqZWN0LmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9kb2N1bWVudC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfcGFyc2VyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9zY3JpcHQuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY2RhdGEuaCINCisjaW5jbHVkZSAieGZhL3NyYy9meGZhL3NyYy9jb21tb24veGZhX2RvY2xheW91dC5oIg0KKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfbG9jYWxlbWdyLmgiDQorI2luY2x1ZGUgInhmYS9zcmMvZnhmYS9zcmMvY29tbW9uL3hmYV9mbTJqc2FwaS5oIg0KK0NYRkFfTm9kZSogWEZBX0NyZWF0ZVVJQ2hpbGQoQ1hGQV9Ob2RlKiBwTm9kZSwgWEZBX0VMRU1FTlQmIGVXaWRnZXRUeXBlKSB7DQorICBYRkFfRUxFTUVOVCBlVHlwZSA9IHBOb2RlLT5HZXRDbGFzc0lEKCk7DQorICBlV2lkZ2V0VHlwZSA9IGVUeXBlOw0KKyAgaWYgKGVUeXBlICE9IFhGQV9FTEVNRU5UX0ZpZWxkICYmIGVUeXBlICE9IFhGQV9FTEVNRU5UX0RyYXcpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBlV2lkZ2V0VHlwZSA9IFhGQV9FTEVNRU5UX1VOS05PV047DQorICBYRkFfRUxFTUVOVCBlVUlUeXBlID0gWEZBX0VMRU1FTlRfVU5LTk9XTjsNCisgIENYRkFfVmFsdWUgZGVmVmFsdWUgPSBwTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfVmFsdWUsIFRSVUUpOw0KKyAgWEZBX0VMRU1FTlQgZVZhbHVlVHlwZSA9IChYRkFfRUxFTUVOVClkZWZWYWx1ZS5HZXRDaGlsZFZhbHVlQ2xhc3NJRCgpOw0KKyAgc3dpdGNoIChlVmFsdWVUeXBlKSB7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfQm9vbGVhbjoNCisgICAgICBlVUlUeXBlID0gWEZBX0VMRU1FTlRfQ2hlY2tCdXR0b247DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfSW50ZWdlcjoNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9EZWNpbWFsOg0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0Zsb2F0Og0KKyAgICAgIGVVSVR5cGUgPSBYRkFfRUxFTUVOVF9OdW1lcmljRWRpdDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9FeERhdGE6DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfVGV4dDoNCisgICAgICBlVUlUeXBlID0gWEZBX0VMRU1FTlRfVGV4dEVkaXQ7DQorICAgICAgZVdpZGdldFR5cGUgPSBYRkFfRUxFTUVOVF9UZXh0Ow0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0RhdGU6DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfVGltZToNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9EYXRlVGltZToNCisgICAgICBlVUlUeXBlID0gWEZBX0VMRU1FTlRfRGF0ZVRpbWVFZGl0Ow0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0ltYWdlOg0KKyAgICAgIGVVSVR5cGUgPSBYRkFfRUxFTUVOVF9JbWFnZUVkaXQ7DQorICAgICAgZVdpZGdldFR5cGUgPSBYRkFfRUxFTUVOVF9JbWFnZTsNCisgICAgICBicmVhazsNCisgICAgICA7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfQXJjOg0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0xpbmU6DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfUmVjdGFuZ2xlOg0KKyAgICAgIGVVSVR5cGUgPSBYRkFfRUxFTUVOVF9EZWZhdWx0VWk7DQorICAgICAgZVdpZGdldFR5cGUgPSBlVmFsdWVUeXBlOw0KKyAgICAgIGJyZWFrOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IE5VTEw7DQorICBDWEZBX05vZGUqIHBVSSA9IHBOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRUxFTUVOVF9VaSwgVFJVRSk7DQorICBDWEZBX05vZGUqIHBDaGlsZCA9IHBVSS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOw0KKyAgZm9yICg7IHBDaGlsZDsgcENoaWxkID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7DQorICAgIFhGQV9FTEVNRU5UIGVDaGlsZCA9IHBDaGlsZC0+R2V0Q2xhc3NJRCgpOw0KKyAgICBpZiAoZUNoaWxkID09IFhGQV9FTEVNRU5UX0V4dHJhcyB8fCBlQ2hpbGQgPT0gWEZBX0VMRU1FTlRfUGljdHVyZSkgew0KKyAgICAgIGNvbnRpbnVlOw0KKyAgICB9DQorICAgIFhGQV9MUENQUk9QRVJUWSBwUHJvdGVydHkgPQ0KKyAgICAgICAgWEZBX0dldFByb3BlcnR5T2ZFbGVtZW50KFhGQV9FTEVNRU5UX1VpLCBlQ2hpbGQsIFhGQV9YRFBQQUNLRVRfRm9ybSk7DQorICAgIGlmIChwUHJvdGVydHkgJiYgKHBQcm90ZXJ0eS0+dUZsYWdzICYgWEZBX1BST1BFUlRZRkxBR19PbmVPZikpIHsNCisgICAgICBwVUlDaGlsZCA9IHBDaGlsZDsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgaWYgKGVUeXBlID09IFhGQV9FTEVNRU5UX0RyYXcpIHsNCisgICAgWEZBX0VMRU1FTlQgZURyYXcgPSBwVUlDaGlsZCA/IHBVSUNoaWxkLT5HZXRDbGFzc0lEKCkgOiBYRkFfRUxFTUVOVF9VTktOT1dOOw0KKyAgICBzd2l0Y2ggKGVEcmF3KSB7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9UZXh0RWRpdDoNCisgICAgICAgIGVXaWRnZXRUeXBlID0gWEZBX0VMRU1FTlRfVGV4dDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfSW1hZ2VFZGl0Og0KKyAgICAgICAgZVdpZGdldFR5cGUgPSBYRkFfRUxFTUVOVF9JbWFnZTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGRlZmF1bHQ6DQorICAgICAgICBlV2lkZ2V0VHlwZSA9DQorICAgICAgICAgICAgZVdpZGdldFR5cGUgPT0gWEZBX0VMRU1FTlRfVU5LTk9XTiA/IFhGQV9FTEVNRU5UX1RleHQgOiBlV2lkZ2V0VHlwZTsNCisgICAgICAgIGJyZWFrOw0KKyAgICB9DQorICB9IGVsc2Ugew0KKyAgICBpZiAocFVJQ2hpbGQgJiYgcFVJQ2hpbGQtPkdldENsYXNzSUQoKSA9PSBYRkFfRUxFTUVOVF9EZWZhdWx0VWkpIHsNCisgICAgICBlV2lkZ2V0VHlwZSA9IFhGQV9FTEVNRU5UX1RleHRFZGl0Ow0KKyAgICB9IGVsc2Ugew0KKyAgICAgIGVXaWRnZXRUeXBlID0gcFVJQ2hpbGQNCisgICAgICAgICAgICAgICAgICAgICAgICA/IHBVSUNoaWxkLT5HZXRDbGFzc0lEKCkNCisgICAgICAgICAgICAgICAgICAgICAgICA6IChlVUlUeXBlID09IFhGQV9FTEVNRU5UX1VOS05PV04gPyBYRkFfRUxFTUVOVF9UZXh0RWRpdA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGVVSVR5cGUpOw0KKyAgICB9DQorICB9DQorICBpZiAoIXBVSUNoaWxkKSB7DQorICAgIGlmIChlVUlUeXBlID09IFhGQV9FTEVNRU5UX1VOS05PV04pIHsNCisgICAgICBlVUlUeXBlID0gWEZBX0VMRU1FTlRfVGV4dEVkaXQ7DQorICAgICAgKChDWEZBX05vZGUqKWRlZlZhbHVlKS0+R2V0UHJvcGVydHkoMCwgWEZBX0VMRU1FTlRfVGV4dCwgVFJVRSk7DQorICAgIH0NCisgICAgcFVJQ2hpbGQgPSBwVUktPkdldFByb3BlcnR5KDAsIGVVSVR5cGUsIFRSVUUpOw0KKyAgfSBlbHNlIGlmIChlVUlUeXBlID09IFhGQV9FTEVNRU5UX1VOS05PV04pIHsNCisgICAgc3dpdGNoIChwVUlDaGlsZC0+R2V0Q2xhc3NJRCgpKSB7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9DaGVja0J1dHRvbjogew0KKyAgICAgICAgZVZhbHVlVHlwZSA9IFhGQV9FTEVNRU5UX1RleHQ7DQorICAgICAgICBpZiAoQ1hGQV9Ob2RlKiBwSXRlbXMgPSBwTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VMRU1FTlRfSXRlbXMpKSB7DQorICAgICAgICAgIGlmIChDWEZBX05vZGUqIHBJdGVtID0gcEl0ZW1zLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9VTktOT1dOKSkgew0KKyAgICAgICAgICAgIGVWYWx1ZVR5cGUgPSBwSXRlbS0+R2V0Q2xhc3NJRCgpOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0RhdGVUaW1lRWRpdDoNCisgICAgICAgIGVWYWx1ZVR5cGUgPSBYRkFfRUxFTUVOVF9EYXRlVGltZTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfSW1hZ2VFZGl0Og0KKyAgICAgICAgZVZhbHVlVHlwZSA9IFhGQV9FTEVNRU5UX0ltYWdlOw0KKyAgICAgICAgYnJlYWs7DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9OdW1lcmljRWRpdDoNCisgICAgICAgIGVWYWx1ZVR5cGUgPSBYRkFfRUxFTUVOVF9GbG9hdDsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdDogew0KKyAgICAgICAgZVZhbHVlVHlwZSA9IChwVUlDaGlsZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX09wZW4pID09DQorICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX011bHRpU2VsZWN0KQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICA/IFhGQV9FTEVNRU5UX0V4RGF0YQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICA6IFhGQV9FTEVNRU5UX1RleHQ7DQorICAgICAgfSBicmVhazsNCisgICAgICBjYXNlIFhGQV9FTEVNRU5UX0JhcmNvZGU6DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9CdXR0b246DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9QYXNzd29yZEVkaXQ6DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9TaWduYXR1cmU6DQorICAgICAgY2FzZSBYRkFfRUxFTUVOVF9UZXh0RWRpdDoNCisgICAgICBkZWZhdWx0Og0KKyAgICAgICAgZVZhbHVlVHlwZSA9IFhGQV9FTEVNRU5UX1RleHQ7DQorICAgICAgICBicmVhazsNCisgICAgfQ0KKyAgICAoKENYRkFfTm9kZSopZGVmVmFsdWUpLT5HZXRQcm9wZXJ0eSgwLCBlVmFsdWVUeXBlLCBUUlVFKTsNCisgIH0NCisgIHJldHVybiBwVUlDaGlsZDsNCit9DQorQ1hGQV9Mb2NhbGVWYWx1ZSBYRkFfR2V0TG9jYWxlVmFsdWUoQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSkgew0KKyAgQ1hGQV9Ob2RlKiBwTm9kZVZhbHVlID0NCisgICAgICBwV2lkZ2V0RGF0YS0+R2V0Tm9kZSgpLT5HZXRDaGlsZCgwLCBYRkFfRUxFTUVOVF9WYWx1ZSk7DQorICBpZiAoIXBOb2RlVmFsdWUpIHsNCisgICAgcmV0dXJuIENYRkFfTG9jYWxlVmFsdWUoKTsNCisgIH0NCisgIENYRkFfTm9kZSogcFZhbHVlQ2hpbGQgPSBwTm9kZVZhbHVlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7DQorICBpZiAoIXBWYWx1ZUNoaWxkKSB7DQorICAgIHJldHVybiBDWEZBX0xvY2FsZVZhbHVlKCk7DQorICB9DQorICBpbnQzMl90IGlWVFR5cGUgPSBYRkFfVlRfTlVMTDsNCisgIFhGQV9FTEVNRU5UIGVUeXBlID0gcFZhbHVlQ2hpbGQtPkdldENsYXNzSUQoKTsNCisgIHN3aXRjaCAoZVR5cGUpIHsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9EZWNpbWFsOg0KKyAgICAgIGlWVFR5cGUgPSBYRkFfVlRfREVDSU1BTDsNCisgICAgICBicmVhazsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9GbG9hdDoNCisgICAgICBpVlRUeXBlID0gWEZBX1ZUX0ZMT0FUOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0RhdGU6DQorICAgICAgaVZUVHlwZSA9IFhGQV9WVF9EQVRFOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX1RpbWU6DQorICAgICAgaVZUVHlwZSA9IFhGQV9WVF9USU1FOw0KKyAgICAgIGJyZWFrOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0RhdGVUaW1lOg0KKyAgICAgIGlWVFR5cGUgPSBYRkFfVlRfREFURVRJTUU7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfQm9vbGVhbjoNCisgICAgICBpVlRUeXBlID0gWEZBX1ZUX0JPT0xFQU47DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfSW50ZWdlcjoNCisgICAgICBpVlRUeXBlID0gWEZBX1ZUX0lOVEVHRVI7DQorICAgICAgYnJlYWs7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfVGV4dDoNCisgICAgICBpVlRUeXBlID0gWEZBX1ZUX1RFWFQ7DQorICAgICAgYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgaVZUVHlwZSA9IFhGQV9WVF9OVUxMOw0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuIENYRkFfTG9jYWxlVmFsdWUoaVZUVHlwZSwgcFdpZGdldERhdGEtPkdldFJhd1ZhbHVlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0RGF0YS0+R2V0Tm9kZSgpLT5HZXREb2N1bWVudCgpLT5HZXRMb2NhbE1ncigpKTsNCit9DQordm9pZCBYRkFfR2V0UGxhaW5UZXh0RnJvbVJpY2hUZXh0KElGREVfWE1MTm9kZSogcFhNTE5vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BsYWluVGV4dCkgew0KKyAgaWYgKHBYTUxOb2RlID09IE5VTEwpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgc3dpdGNoIChwWE1MTm9kZS0+R2V0VHlwZSgpKSB7DQorICAgIGNhc2UgRkRFX1hNTE5PREVfRWxlbWVudDogew0KKyAgICAgIElGREVfWE1MRWxlbWVudCogcFhNTEVsZW1lbnQgPSAoSUZERV9YTUxFbGVtZW50KilwWE1MTm9kZTsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c1RhZzsNCisgICAgICBwWE1MRWxlbWVudC0+R2V0TG9jYWxUYWdOYW1lKHdzVGFnKTsNCisgICAgICB1aW50MzJfdCB1VGFnID0gRlhfSGFzaENvZGVfU3RyaW5nX0dldFcod3NUYWcsIHdzVGFnLkdldExlbmd0aCgpLCBUUlVFKTsNCisgICAgICBpZiAodVRhZyA9PSAweDAwMDFmNzE0KSB7DQorICAgICAgICB3c1BsYWluVGV4dCArPSBMIlxuIjsNCisgICAgICB9IGVsc2UgaWYgKHVUYWcgPT0gMHgwMDAwMDA3MCkgew0KKyAgICAgICAgaWYgKCF3c1BsYWluVGV4dC5Jc0VtcHR5KCkpIHsNCisgICAgICAgICAgd3NQbGFpblRleHQgKz0gTCJcbiI7DQorICAgICAgICB9DQorICAgICAgfSBlbHNlIGlmICh1VGFnID09IDB4YTQ4YWM2Mykgew0KKyAgICAgICAgaWYgKCF3c1BsYWluVGV4dC5Jc0VtcHR5KCkgJiYNCisgICAgICAgICAgICB3c1BsYWluVGV4dFt3c1BsYWluVGV4dC5HZXRMZW5ndGgoKSAtIDFdICE9ICdcbicpIHsNCisgICAgICAgICAgd3NQbGFpblRleHQgKz0gTCJcbiI7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9IGJyZWFrOw0KKyAgICBjYXNlIEZERV9YTUxOT0RFX1RleHQ6IHsNCisgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7DQorICAgICAgKChJRkRFX1hNTFRleHQqKXBYTUxOb2RlKS0+R2V0VGV4dCh3c0NvbnRlbnQpOw0KKyAgICAgIHdzUGxhaW5UZXh0ICs9IHdzQ29udGVudDsNCisgICAgfSBicmVhazsNCisgICAgY2FzZSBGREVfWE1MTk9ERV9DaGFyRGF0YTogew0KKyAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2hhckRhdGE7DQorICAgICAgKChJRkRFX1hNTENoYXJEYXRhKilwWE1MTm9kZSktPkdldENoYXJEYXRhKHdzQ2hhckRhdGEpOw0KKyAgICAgIHdzUGxhaW5UZXh0ICs9IHdzQ2hhckRhdGE7DQorICAgIH0gYnJlYWs7DQorICAgIGRlZmF1bHQ6DQorICAgICAgYnJlYWs7DQorICB9DQorICBmb3IgKElGREVfWE1MTm9kZSogcENoaWxkWE1MID0NCisgICAgICAgICAgIHBYTUxOb2RlLT5HZXROb2RlSXRlbShJRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOw0KKyAgICAgICBwQ2hpbGRYTUw7DQorICAgICAgIHBDaGlsZFhNTCA9IHBDaGlsZFhNTC0+R2V0Tm9kZUl0ZW0oSUZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsNCisgICAgWEZBX0dldFBsYWluVGV4dEZyb21SaWNoVGV4dChwQ2hpbGRYTUwsIHdzUGxhaW5UZXh0KTsNCisgIH0NCit9DQorRlhfQk9PTCBYRkFfRmllbGRJc011bHRpTGlzdEJveChDWEZBX05vZGUqIHBGaWVsZE5vZGUpIHsNCisgIEZYX0JPT0wgYlJldCA9IEZBTFNFOw0KKyAgaWYgKCFwRmllbGROb2RlKSB7DQorICAgIHJldHVybiBiUmV0Ow0KKyAgfQ0KKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IHBGaWVsZE5vZGUtPkdldENoaWxkKDAsIFhGQV9FTEVNRU5UX1VpKTsNCisgIGlmIChwVUlDaGlsZCkgew0KKyAgICBDWEZBX05vZGUqIHBGaXJzdENoaWxkID0gcFVJQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsNCisgICAgaWYgKHBGaXJzdENoaWxkICYmIHBGaXJzdENoaWxkLT5HZXRDbGFzc0lEKCkgPT0gWEZBX0VMRU1FTlRfQ2hvaWNlTGlzdCkgew0KKyAgICAgIGJSZXQgPSBwRmlyc3RDaGlsZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX09wZW4pID09DQorICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX011bHRpU2VsZWN0Ow0KKyAgICB9DQorICB9DQorICByZXR1cm4gYlJldDsNCit9DQorRlhfQk9PTCBYRkFfSXNMYXlvdXRFbGVtZW50KFhGQV9FTEVNRU5UIGVFbGVtZW50LCBGWF9CT09MIGJMYXlvdXRDb250YWluZXIpIHsNCisgIHN3aXRjaCAoZUVsZW1lbnQpIHsNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9EcmF3Og0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0ZpZWxkOg0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0luc3RhbmNlTWFuYWdlcjoNCisgICAgICByZXR1cm4gIWJMYXlvdXRDb250YWluZXI7DQorICAgIGNhc2UgWEZBX0VMRU1FTlRfQXJlYToNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9TdWJmb3JtOg0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0V4Y2xHcm91cDoNCisgICAgY2FzZSBYRkFfRUxFTUVOVF9TdWJmb3JtU2V0Og0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX1BhZ2VBcmVhOg0KKyAgICBjYXNlIFhGQV9FTEVNRU5UX0Zvcm06DQorICAgICAgcmV0dXJuIFRSVUU7DQorICAgIGRlZmF1bHQ6DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitGWF9CT09MIFhGQV9Jc1Rha2luZ3VwU3BhY2UoWEZBX0FUVFJJQlVURUVOVU0gZVByZXNlbmNlKSB7DQorICBzd2l0Y2ggKGVQcmVzZW5jZSkgew0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGU6DQorICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSW52aXNpYmxlOg0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBYRkFfSXNGbG93aW5nTGF5b3V0KFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXQpIHsNCisgIHN3aXRjaCAoZUxheW91dCkgew0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RiOg0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xyX3RiOg0KKyAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JsX3RiOg0KKyAgICAgIHJldHVybiBUUlVFOw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHJldHVybiBGQUxTRTsNCit9DQorRlhfQk9PTCBYRkFfSXNIb3Jpem9udGFsRmxvdyhYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0KSB7DQorICBzd2l0Y2ggKGVMYXlvdXQpIHsNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Mcl90YjoNCisgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SbF90YjoNCisgICAgICByZXR1cm4gVFJVRTsNCisgICAgZGVmYXVsdDoNCisgICAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICByZXR1cm4gRkFMU0U7DQorfQ0KK3N0YXRpYyBjb25zdCBGWF9ET1VCTEUgZnJhY3Rpb25fc2NhbGVzW10gPSB7MC4xLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAwMDAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAwMDAwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAwMDAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAwMDAwMDAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAwMDAwMDAwMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAwMDAwMDAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAwMDAwMDAwMDAxfTsNCitGWF9ET1VCTEUgWEZBX1dpZGVTdHJpbmdUb0RvdWJsZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTdHJpbmdWYWwpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUgPSB3c1N0cmluZ1ZhbDsNCisgIHdzVmFsdWUuVHJpbUxlZnQoKTsNCisgIHdzVmFsdWUuVHJpbVJpZ2h0KCk7DQorICBpbnQ2NF90IG5JbnRlZ3JhbCA9IDA7DQorICBGWF9EV09SRCBkd0ZyYWN0aW9uYWwgPSAwOw0KKyAgaW50MzJfdCBuRXhwb25lbnQgPSAwOw0KKyAgaW50MzJfdCBjYyA9IDA7DQorICBGWF9CT09MIGJOZWdhdGl2ZSA9IEZBTFNFLCBiRXhwU2lnbiA9IEZBTFNFOw0KKyAgY29uc3QgRlhfV0NIQVIqIHN0ciA9IChjb25zdCBGWF9XQ0hBUiopd3NWYWx1ZTsNCisgIGludDMyX3QgbGVuID0gd3NWYWx1ZS5HZXRMZW5ndGgoKTsNCisgIGlmIChzdHJbMF0gPT0gJysnKSB7DQorICAgIGNjKys7DQorICB9IGVsc2UgaWYgKHN0clswXSA9PSAnLScpIHsNCisgICAgYk5lZ2F0aXZlID0gVFJVRTsNCisgICAgY2MrKzsNCisgIH0NCisgIGludDMyX3QgbkludGVncmFsTGVuID0gMDsNCisgIHdoaWxlIChjYyA8IGxlbikgew0KKyAgICBpZiAoc3RyW2NjXSA9PSAnLicgfHwgc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScgfHwNCisgICAgICAgIG5JbnRlZ3JhbExlbiA+IDE3KSB7DQorICAgICAgYnJlYWs7DQorICAgIH0NCisgICAgaWYgKCFYRkFfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIG5JbnRlZ3JhbCA9IG5JbnRlZ3JhbCAqIDEwICsgc3RyW2NjXSAtICcwJzsNCisgICAgY2MrKzsNCisgICAgbkludGVncmFsTGVuKys7DQorICB9DQorICBuSW50ZWdyYWwgPSBiTmVnYXRpdmUgPyAtbkludGVncmFsIDogbkludGVncmFsOw0KKyAgaW50MzJfdCBzY2FsZSA9IDA7DQorICBGWF9ET1VCTEUgZnJhY3Rpb24gPSAwLjA7DQorICBpZiAoY2MgPCBsZW4gJiYgc3RyW2NjXSA9PSAnLicpIHsNCisgICAgY2MrKzsNCisgICAgd2hpbGUgKGNjIDwgbGVuKSB7DQorICAgICAgZnJhY3Rpb24gKz0gZnJhY3Rpb25fc2NhbGVzW3NjYWxlXSAqIChzdHJbY2NdIC0gJzAnKTsNCisgICAgICBzY2FsZSsrOw0KKyAgICAgIGNjKys7DQorICAgICAgaWYgKGNjID09IGxlbikgew0KKyAgICAgICAgYnJlYWs7DQorICAgICAgfQ0KKyAgICAgIGlmIChzY2FsZSA9PSBzaXplb2YoZnJhY3Rpb25fc2NhbGVzKSAvIHNpemVvZihGWF9ET1VCTEUpIHx8DQorICAgICAgICAgIHN0cltjY10gPT0gJ0UnIHx8IHN0cltjY10gPT0gJ2UnKSB7DQorICAgICAgICBicmVhazsNCisgICAgICB9DQorICAgICAgaWYgKCFYRkFfSXNEaWdpdChzdHJbY2NdKSkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGR3RnJhY3Rpb25hbCA9IChGWF9EV09SRCkoZnJhY3Rpb24gKiA0Mjk0OTY3Mjk2LjApOw0KKyAgfQ0KKyAgaWYgKGNjIDwgbGVuICYmIChzdHJbY2NdID09ICdFJyB8fCBzdHJbY2NdID09ICdlJykpIHsNCisgICAgY2MrKzsNCisgICAgaWYgKGNjIDwgbGVuKSB7DQorICAgICAgaWYgKHN0cltjY10gPT0gJysnKSB7DQorICAgICAgICBjYysrOw0KKyAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnLScpIHsNCisgICAgICAgIGJFeHBTaWduID0gVFJVRTsNCisgICAgICAgIGNjKys7DQorICAgICAgfQ0KKyAgICB9DQorICAgIHdoaWxlIChjYyA8IGxlbikgew0KKyAgICAgIGlmIChzdHJbY2NdID09ICcuJyB8fCAhWEZBX0lzRGlnaXQoc3RyW2NjXSkpIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICAgIH0NCisgICAgICBuRXhwb25lbnQgPSBuRXhwb25lbnQgKiAxMCArIHN0cltjY10gLSAnMCc7DQorICAgICAgY2MrKzsNCisgICAgfQ0KKyAgICBuRXhwb25lbnQgPSBiRXhwU2lnbiA/IC1uRXhwb25lbnQgOiBuRXhwb25lbnQ7DQorICB9DQorICBGWF9ET1VCTEUgZFZhbHVlID0gKGR3RnJhY3Rpb25hbCAvIDQyOTQ5NjcyOTYuMCk7DQorICBkVmFsdWUgPSBuSW50ZWdyYWwgKyAobkludGVncmFsID49IDAgPyBkVmFsdWUgOiAtZFZhbHVlKTsNCisgIGlmIChuRXhwb25lbnQgIT0gMCkgew0KKyAgICBkVmFsdWUgKj0gRlhTWVNfcG93KDEwLCAoRlhfRkxPQVQpbkV4cG9uZW50KTsNCisgIH0NCisgIHJldHVybiBkVmFsdWU7DQorfQ0KKw0KK0ZYX0RPVUJMRSBYRkFfQnl0ZVN0cmluZ1RvRG91YmxlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pTdHJpbmdWYWwpIHsNCisgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUgPQ0KKyAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelN0cmluZ1ZhbC5HZXRDU3RyKCksIHN6U3RyaW5nVmFsLkdldExlbmd0aCgpKTsNCisgIHJldHVybiBYRkFfV2lkZVN0cmluZ1RvRG91YmxlKHdzVmFsdWUpOw0KK30NCisNCitpbnQzMl90IFhGQV9NYXBSb3RhdGlvbihpbnQzMl90IG5Sb3RhdGlvbikgew0KKyAgblJvdGF0aW9uID0gblJvdGF0aW9uICUgMzYwOw0KKyAgblJvdGF0aW9uID0gblJvdGF0aW9uIDwgMCA/IG5Sb3RhdGlvbiArIDM2MCA6IG5Sb3RhdGlvbjsNCisgIHJldHVybiBuUm90YXRpb247DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV91dGlsc19pbXBfdW5pdHRlc3QuY3BwIGIveGZhL3NyYy9meGZhL3NyYy9wYXJzZXIveGZhX3V0aWxzX2ltcF91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFmZGM0ZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhmYS9zcmMvcGFyc2VyL3hmYV91dGlsc19pbXBfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCIKKyNpbmNsdWRlICJ4ZmEvc3JjL2Z4ZmEvc3JjL2NvbW1vbi94ZmFfdXRpbHMuaCIKKworVEVTVChYZmFVdGlsc0ltcCwgWEZBX01hcFJvdGF0aW9uKSB7CisgIHN0cnVjdCBUZXN0Q2FzZSB7CisgICAgaW50IGlucHV0OworICAgIGludCBleHBlY3RlZF9vdXRwdXQ7CisgIH0gVGVzdENhc2VzW10gPSB7ey0xMDAwMDAwLCA4MH0sIHstMzYxLCAzNTl9LCB7LTM2MCwgMH0sICB7LTM1OSwgMX0sCisgICAgICAgICAgICAgICAgICAgey05MSwgMjY5fSwgICAgIHstOTAsIDI3MH0sICB7LTg5LCAyNzF9LCB7LTEsIDM1OX0sCisgICAgICAgICAgICAgICAgICAgezAsIDB9LCAgICAgICAgIHsxLCAxfSwgICAgICB7ODksIDg5fSwgICB7OTAsIDkwfSwKKyAgICAgICAgICAgICAgICAgICB7OTEsIDkxfSwgICAgICAgezM1OSwgMzU5fSwgIHszNjAsIDB9LCAgIHszNjEsIDF9LAorICAgICAgICAgICAgICAgICAgIHsxMDAwMDAsIDI4MH19OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKFRlc3RDYXNlcyk7ICsraSkgeworICAgIEVYUEVDVF9FUShUZXN0Q2FzZXNbaV0uZXhwZWN0ZWRfb3V0cHV0LAorICAgICAgICAgICAgICBYRkFfTWFwUm90YXRpb24oVGVzdENhc2VzW2ldLmlucHV0KSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhncmFwaGljcy9zcmMvZnhfZ3JhcGhpY3MuY3BwIGIveGZhL3NyYy9meGdyYXBoaWNzL3NyYy9meF9ncmFwaGljcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkwNjk4MQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhncmFwaGljcy9zcmMvZnhfZ3JhcGhpY3MuY3BwCkBAIC0wLDAgKzEsMTQ2MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSA8bWVtb3J5Pg0KKw0KKyNpbmNsdWRlICJmeF9wYXRoX2dlbmVyYXRvci5oIg0KKyNpbmNsdWRlICJwcmUuaCINCisNCitjbGFzcyBDQUdHX0dyYXBoaWNzIHsNCisgcHVibGljOg0KKyAgQ0FHR19HcmFwaGljcygpOw0KKyAgRlhfRVJSIENyZWF0ZShDRlhfR3JhcGhpY3MqIG93bmVyLA0KKyAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLA0KKyAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwNCisgICAgICAgICAgICAgICAgRlhESUJfRm9ybWF0IGZvcm1hdCk7DQorICB2aXJ0dWFsIH5DQUdHX0dyYXBoaWNzKCk7DQorDQorIHByaXZhdGU6DQorICBDRlhfR3JhcGhpY3MqIF9vd25lcjsNCit9Ow0KK0NGWF9HcmFwaGljczo6Q0ZYX0dyYXBoaWNzKCkgew0KKyAgX3R5cGUgPSBGWF9DT05URVhUX05vbmU7DQorICBfaW5mby5fZ3JhcGhTdGF0ZS5TZXREYXNoQ291bnQoMCk7DQorICBfaW5mby5faXNBbnRpYWxpYXNpbmcgPSBUUlVFOw0KKyAgX2luZm8uX3N0cm9rZUFsaWdubWVudCA9IEZYX1NUUk9LRUFMSUdOTUVOVF9DZW50ZXI7DQorICBfaW5mby5fQ1RNLlNldElkZW50aXR5KCk7DQorICBfaW5mby5faXNBY3RPbkRhc2ggPSBGQUxTRTsNCisgIF9pbmZvLl9zdHJva2VDb2xvciA9IE5VTEw7DQorICBfaW5mby5fZmlsbENvbG9yID0gTlVMTDsNCisgIF9pbmZvLl9mb250ID0gTlVMTDsNCisgIF9pbmZvLl9mb250U2l6ZSA9IDQwLjA7DQorICBfaW5mby5fZm9udEhTY2FsZSA9IDEuMDsNCisgIF9pbmZvLl9mb250U3BhY2luZyA9IDAuMDsNCisgIF9yZW5kZXJEZXZpY2UgPSBOVUxMOw0KKyAgX2FnZ0dyYXBoaWNzID0gTlVMTDsNCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6Q3JlYXRlKENGWF9SZW5kZXJEZXZpY2UqIHJlbmRlckRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0FudGlhbGlhc2luZykgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHJlbmRlckRldmljZSwgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkKTsNCisgIGlmIChfdHlwZSAhPSBGWF9DT05URVhUX05vbmUpIHsNCisgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KKyAgfQ0KKyAgX3R5cGUgPSBGWF9DT05URVhUX0RldmljZTsNCisgIF9pbmZvLl9pc0FudGlhbGlhc2luZyA9IGlzQW50aWFsaWFzaW5nOw0KKyAgX3JlbmRlckRldmljZSA9IHJlbmRlckRldmljZTsNCisgIGlmIChfcmVuZGVyRGV2aWNlLT5HZXREZXZpY2VDYXBzKEZYRENfUkVOREVSX0NBUFMpICYgRlhSQ19TT0ZUX0NMSVApIHsNCisgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICByZXR1cm4gRlhfRVJSX0luZGVmaW5pdGU7DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OkNyZWF0ZShpbnQzMl90IHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfRm9ybWF0IGZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc05hdGl2ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc0FudGlhbGlhc2luZykgew0KKyAgaWYgKF90eXBlICE9IEZYX0NPTlRFWFRfTm9uZSkgew0KKyAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQorICB9DQorICBfdHlwZSA9IEZYX0NPTlRFWFRfRGV2aWNlOw0KKyAgX2luZm8uX2lzQW50aWFsaWFzaW5nID0gaXNBbnRpYWxpYXNpbmc7DQorICB7DQorICAgIF9hZ2dHcmFwaGljcyA9IG5ldyBDQUdHX0dyYXBoaWNzOw0KKyAgICByZXR1cm4gX2FnZ0dyYXBoaWNzLT5DcmVhdGUodGhpcywgd2lkdGgsIGhlaWdodCwgZm9ybWF0KTsNCisgIH0NCit9DQorQ0ZYX0dyYXBoaWNzOjp+Q0ZYX0dyYXBoaWNzKCkgew0KKyAgaWYgKF9hZ2dHcmFwaGljcykgew0KKyAgICBkZWxldGUgX2FnZ0dyYXBoaWNzOw0KKyAgICBfYWdnR3JhcGhpY3MgPSBOVUxMOw0KKyAgfQ0KKyAgX3JlbmRlckRldmljZSA9IE5VTEw7DQorICBfaW5mby5fZ3JhcGhTdGF0ZS5TZXREYXNoQ291bnQoMCk7DQorICBfdHlwZSA9IEZYX0NPTlRFWFRfTm9uZTsNCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6R2V0RGV2aWNlQ2FwKGNvbnN0IGludDMyX3QgY2FwSUQsIEZYX0RldmljZUNhcCYgY2FwVmFsKSB7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIGNhcFZhbCA9IF9yZW5kZXJEZXZpY2UtPkdldERldmljZUNhcHMoY2FwSUQpOw0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OklzUHJpbnRlckRldmljZShGWF9CT09MJiBpc1ByaW50ZXIpIHsNCisgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgaW50MzJfdCBkZXZpY2VDbGFzcyA9IF9yZW5kZXJEZXZpY2UtPkdldERldmljZUNsYXNzKCk7DQorICAgICAgaWYgKGRldmljZUNsYXNzID09IEZYRENfUFJJTlRFUikgew0KKyAgICAgICAgaXNQcmludGVyID0gVFJVRTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaXNQcmludGVyID0gRkFMU0U7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OkVuYWJsZUFudGlhbGlhc2luZyhGWF9CT09MIGlzQW50aWFsaWFzaW5nKSB7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIF9pbmZvLl9pc0FudGlhbGlhc2luZyA9IGlzQW50aWFsaWFzaW5nOw0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlNhdmVHcmFwaFN0YXRlKCkgew0KKyAgc3dpdGNoIChfdHlwZSkgew0KKyAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICBfcmVuZGVyRGV2aWNlLT5TYXZlU3RhdGUoKTsNCisgICAgICBUSW5mbyogaW5mbyA9IG5ldyBUSW5mbzsNCisgICAgICBpbmZvLT5fZ3JhcGhTdGF0ZS5Db3B5KF9pbmZvLl9ncmFwaFN0YXRlKTsNCisgICAgICBpbmZvLT5faXNBbnRpYWxpYXNpbmcgPSBfaW5mby5faXNBbnRpYWxpYXNpbmc7DQorICAgICAgaW5mby0+X3N0cm9rZUFsaWdubWVudCA9IF9pbmZvLl9zdHJva2VBbGlnbm1lbnQ7DQorICAgICAgaW5mby0+X0NUTSA9IF9pbmZvLl9DVE07DQorICAgICAgaW5mby0+X2lzQWN0T25EYXNoID0gX2luZm8uX2lzQWN0T25EYXNoOw0KKyAgICAgIGluZm8tPl9zdHJva2VDb2xvciA9IF9pbmZvLl9zdHJva2VDb2xvcjsNCisgICAgICBpbmZvLT5fZmlsbENvbG9yID0gX2luZm8uX2ZpbGxDb2xvcjsNCisgICAgICBpbmZvLT5fZm9udCA9IF9pbmZvLl9mb250Ow0KKyAgICAgIGluZm8tPl9mb250U2l6ZSA9IF9pbmZvLl9mb250U2l6ZTsNCisgICAgICBpbmZvLT5fZm9udEhTY2FsZSA9IF9pbmZvLl9mb250SFNjYWxlOw0KKyAgICAgIGluZm8tPl9mb250U3BhY2luZyA9IF9pbmZvLl9mb250U3BhY2luZzsNCisgICAgICBfaW5mb1N0YWNrLkFkZChpbmZvKTsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpSZXN0b3JlR3JhcGhTdGF0ZSgpIHsNCisgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgX3JlbmRlckRldmljZS0+UmVzdG9yZVN0YXRlKCk7DQorICAgICAgaW50MzJfdCBzaXplID0gX2luZm9TdGFjay5HZXRTaXplKCk7DQorICAgICAgaWYgKHNpemUgPD0gMCkgew0KKyAgICAgICAgcmV0dXJuIEZYX0VSUl9JbnRlcm1lZGlhdGVfVmFsdWVfSW52YWxpZDsNCisgICAgICB9DQorICAgICAgaW50MzJfdCB0b3BJbmRleCA9IHNpemUgLSAxOw0KKyAgICAgIFRJbmZvKiBpbmZvID0gKFRJbmZvKilfaW5mb1N0YWNrLkdldEF0KHRvcEluZGV4KTsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoaW5mbywgRlhfRVJSX0ludGVybWVkaWF0ZV9WYWx1ZV9JbnZhbGlkKTsNCisgICAgICBfaW5mby5fZ3JhcGhTdGF0ZS5Db3B5KGluZm8tPl9ncmFwaFN0YXRlKTsNCisgICAgICBfaW5mby5faXNBbnRpYWxpYXNpbmcgPSBpbmZvLT5faXNBbnRpYWxpYXNpbmc7DQorICAgICAgX2luZm8uX3N0cm9rZUFsaWdubWVudCA9IGluZm8tPl9zdHJva2VBbGlnbm1lbnQ7DQorICAgICAgX2luZm8uX0NUTSA9IGluZm8tPl9DVE07DQorICAgICAgX2luZm8uX2lzQWN0T25EYXNoID0gaW5mby0+X2lzQWN0T25EYXNoOw0KKyAgICAgIF9pbmZvLl9zdHJva2VDb2xvciA9IGluZm8tPl9zdHJva2VDb2xvcjsNCisgICAgICBfaW5mby5fZmlsbENvbG9yID0gaW5mby0+X2ZpbGxDb2xvcjsNCisgICAgICBfaW5mby5fZm9udCA9IGluZm8tPl9mb250Ow0KKyAgICAgIF9pbmZvLl9mb250U2l6ZSA9IGluZm8tPl9mb250U2l6ZTsNCisgICAgICBfaW5mby5fZm9udEhTY2FsZSA9IGluZm8tPl9mb250SFNjYWxlOw0KKyAgICAgIF9pbmZvLl9mb250U3BhY2luZyA9IGluZm8tPl9mb250U3BhY2luZzsNCisgICAgICBkZWxldGUgaW5mbzsNCisgICAgICBpbmZvID0gTlVMTDsNCisgICAgICBfaW5mb1N0YWNrLlJlbW92ZUF0KHRvcEluZGV4KTsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpHZXRMaW5lQ2FwKENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcCYgbGluZUNhcCkgew0KKyAgc3dpdGNoIChfdHlwZSkgew0KKyAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICBsaW5lQ2FwID0gX2luZm8uX2dyYXBoU3RhdGUubV9MaW5lQ2FwOw0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldExpbmVDYXAoQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwIGxpbmVDYXApIHsNCisgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgX2luZm8uX2dyYXBoU3RhdGUubV9MaW5lQ2FwID0gbGluZUNhcDsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpHZXREYXNoQ291bnQoaW50MzJfdCYgZGFzaENvdW50KSB7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIGRhc2hDb3VudCA9IF9pbmZvLl9ncmFwaFN0YXRlLm1fRGFzaENvdW50Ow0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OkdldExpbmVEYXNoKEZYX0ZMT0FUJiBkYXNoUGhhc2UsIEZYX0ZMT0FUKiBkYXNoQXJyYXkpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChkYXNoQXJyYXksIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIGRhc2hQaGFzZSA9IF9pbmZvLl9ncmFwaFN0YXRlLm1fRGFzaFBoYXNlOw0KKyAgICAgIEZYU1lTX21lbWNweShkYXNoQXJyYXksIF9pbmZvLl9ncmFwaFN0YXRlLm1fRGFzaEFycmF5LA0KKyAgICAgICAgICAgICAgICAgICBfaW5mby5fZ3JhcGhTdGF0ZS5tX0Rhc2hDb3VudCAqIHNpemVvZihGWF9GTE9BVCkpOw0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldExpbmVEYXNoKEZYX0ZMT0FUIGRhc2hQaGFzZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogZGFzaEFycmF5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGFzaENvdW50KSB7DQorICBpZiAoZGFzaENvdW50ID4gMCAmJiAhZGFzaEFycmF5KSB7DQorICAgIHJldHVybiBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQ7DQorICB9DQorICBkYXNoQ291bnQgPSBkYXNoQ291bnQgPCAwID8gMCA6IGRhc2hDb3VudDsNCisgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgRlhfRkxPQVQgc2NhbGUgPSAxLjA7DQorICAgICAgaWYgKF9pbmZvLl9pc0FjdE9uRGFzaCkgew0KKyAgICAgICAgc2NhbGUgPSBfaW5mby5fZ3JhcGhTdGF0ZS5tX0xpbmVXaWR0aDsNCisgICAgICB9DQorICAgICAgX2luZm8uX2dyYXBoU3RhdGUubV9EYXNoUGhhc2UgPSBkYXNoUGhhc2U7DQorICAgICAgX2luZm8uX2dyYXBoU3RhdGUuU2V0RGFzaENvdW50KGRhc2hDb3VudCk7DQorICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZGFzaENvdW50OyBpKyspIHsNCisgICAgICAgIF9pbmZvLl9ncmFwaFN0YXRlLm1fRGFzaEFycmF5W2ldID0gZGFzaEFycmF5W2ldICogc2NhbGU7DQorICAgICAgfQ0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldExpbmVEYXNoKEZYX0Rhc2hTdHlsZSBkYXNoU3R5bGUpIHsNCisgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgcmV0dXJuIFJlbmRlckRldmljZVNldExpbmVEYXNoKGRhc2hTdHlsZSk7DQorICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6R2V0TGluZUpvaW4oQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pbiYgbGluZUpvaW4pIHsNCisgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgbGluZUpvaW4gPSBfaW5mby5fZ3JhcGhTdGF0ZS5tX0xpbmVKb2luOw0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldExpbmVKb2luKENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUpvaW4gbGluZUpvaW4pIHsNCisgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgX2luZm8uX2dyYXBoU3RhdGUubV9MaW5lSm9pbiA9IGxpbmVKb2luOw0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OkdldE1pdGVyTGltaXQoRlhfRkxPQVQmIG1pdGVyTGltaXQpIHsNCisgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgbWl0ZXJMaW1pdCA9IF9pbmZvLl9ncmFwaFN0YXRlLm1fTWl0ZXJMaW1pdDsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTZXRNaXRlckxpbWl0KEZYX0ZMT0FUIG1pdGVyTGltaXQpIHsNCisgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgX2luZm8uX2dyYXBoU3RhdGUubV9NaXRlckxpbWl0ID0gbWl0ZXJMaW1pdDsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpHZXRMaW5lV2lkdGgoRlhfRkxPQVQmIGxpbmVXaWR0aCkgew0KKyAgc3dpdGNoIChfdHlwZSkgew0KKyAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICBsaW5lV2lkdGggPSBfaW5mby5fZ3JhcGhTdGF0ZS5tX0xpbmVXaWR0aDsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTZXRMaW5lV2lkdGgoRlhfRkxPQVQgbGluZVdpZHRoLCBGWF9CT09MIGlzQWN0T25EYXNoKSB7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIF9pbmZvLl9ncmFwaFN0YXRlLm1fTGluZVdpZHRoID0gbGluZVdpZHRoOw0KKyAgICAgIF9pbmZvLl9pc0FjdE9uRGFzaCA9IGlzQWN0T25EYXNoOw0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OkdldFN0cm9rZUFsaWdubWVudChGWF9TdHJva2VBbGlnbm1lbnQmIHN0cm9rZUFsaWdubWVudCkgew0KKyAgc3dpdGNoIChfdHlwZSkgew0KKyAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICBzdHJva2VBbGlnbm1lbnQgPSBfaW5mby5fc3Ryb2tlQWxpZ25tZW50Ow0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldFN0cm9rZUFsaWdubWVudChGWF9TdHJva2VBbGlnbm1lbnQgc3Ryb2tlQWxpZ25tZW50KSB7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIF9pbmZvLl9zdHJva2VBbGlnbm1lbnQgPSBzdHJva2VBbGlnbm1lbnQ7DQorICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6U2V0U3Ryb2tlQ29sb3IoQ0ZYX0NvbG9yKiBjb2xvcikgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGNvbG9yLCBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQpOw0KKyAgc3dpdGNoIChfdHlwZSkgew0KKyAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICBfaW5mby5fc3Ryb2tlQ29sb3IgPSBjb2xvcjsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTZXRGaWxsQ29sb3IoQ0ZYX0NvbG9yKiBjb2xvcikgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGNvbG9yLCBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQpOw0KKyAgc3dpdGNoIChfdHlwZSkgew0KKyAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICBfaW5mby5fZmlsbENvbG9yID0gY29sb3I7DQorICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6U3Ryb2tlUGF0aChDRlhfUGF0aCogcGF0aCwgQ0ZYX01hdHJpeCogbWF0cml4KSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocGF0aCwgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkKTsNCisgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgcmV0dXJuIFJlbmRlckRldmljZVN0cm9rZVBhdGgocGF0aCwgbWF0cml4KTsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpGaWxsUGF0aChDRlhfUGF0aCogcGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GaWxsTW9kZSBmaWxsTW9kZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBtYXRyaXgpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChwYXRoLCBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQpOw0KKyAgc3dpdGNoIChfdHlwZSkgew0KKyAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICByZXR1cm4gUmVuZGVyRGV2aWNlRmlsbFBhdGgocGF0aCwgZmlsbE1vZGUsIG1hdHJpeCk7DQorICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6Q2xpcFBhdGgoQ0ZYX1BhdGgqIHBhdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRmlsbE1vZGUgZmlsbE1vZGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4KSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocGF0aCwgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkKTsNCisgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgRlhfQk9PTCByZXN1bHQgPSBfcmVuZGVyRGV2aWNlLT5TZXRDbGlwX1BhdGhGaWxsKA0KKyAgICAgICAgICBwYXRoLT5HZXRQYXRoRGF0YSgpLCAoQ0ZYX01hdHJpeCopbWF0cml4LCBmaWxsTW9kZSk7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHJlc3VsdCwgRlhfRVJSX0luZGVmaW5pdGUpOw0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OkRyYXdJbWFnZShDRlhfRElCU291cmNlKiBzb3VyY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBtYXRyaXgpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChzb3VyY2UsIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIHJldHVybiBSZW5kZXJEZXZpY2VEcmF3SW1hZ2Uoc291cmNlLCBwb2ludCwgbWF0cml4KTsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTdHJldGNoSW1hZ2UoQ0ZYX0RJQlNvdXJjZSogc291cmNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHNvdXJjZSwgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkKTsNCisgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgcmV0dXJuIFJlbmRlckRldmljZVN0cmV0Y2hJbWFnZShzb3VyY2UsIHJlY3QsIG1hdHJpeCk7DQorICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6Q29uY2F0TWF0cml4KGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKG1hdHJpeCwgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkKTsNCisgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgX2luZm8uX0NUTS5Db25jYXQoKm1hdHJpeCk7DQorICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCit9DQorQ0ZYX01hdHJpeCogQ0ZYX0dyYXBoaWNzOjpHZXRNYXRyaXgoKSB7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgTlVMTCk7DQorICAgICAgcmV0dXJuICZfaW5mby5fQ1RNOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIE5VTEw7IH0NCisgIH0NCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6R2V0Q2xpcFJlY3QoQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIEZYX1JFQ1QgciA9IF9yZW5kZXJEZXZpY2UtPkdldENsaXBCb3goKTsNCisgICAgICByZWN0LmxlZnQgPSAoRlhfRkxPQVQpci5sZWZ0Ow0KKyAgICAgIHJlY3QudG9wID0gKEZYX0ZMT0FUKXIudG9wOw0KKyAgICAgIHJlY3Qud2lkdGggPSAoRlhfRkxPQVQpci5XaWR0aCgpOw0KKyAgICAgIHJlY3QuaGVpZ2h0ID0gKEZYX0ZMT0FUKXIuSGVpZ2h0KCk7DQorICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6U2V0Q2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIEZYX1JFQ1QgcihGWFNZU19yb3VuZChyZWN0LmxlZnQpLCBGWFNZU19yb3VuZChyZWN0LnRvcCksDQorICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKHJlY3QucmlnaHQoKSksIEZYU1lTX3JvdW5kKHJlY3QuYm90dG9tKCkpKTsNCisgICAgICBGWF9CT09MIHJlc3VsdCA9IF9yZW5kZXJEZXZpY2UtPlNldENsaXBfUmVjdCgmcik7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHJlc3VsdCwgRlhfRVJSX01ldGhvZF9Ob3RfU3VwcG9ydGVkKTsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpDbGVhckNsaXAoKSB7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIEZYX0JPT0wgcmVzdWx0ID0gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocmVzdWx0LCBGWF9FUlJfTWV0aG9kX05vdF9TdXBwb3J0ZWQpOw0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldEZvbnQoQ0ZYX0ZvbnQqIGZvbnQpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChmb250LCBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQpOw0KKyAgc3dpdGNoIChfdHlwZSkgew0KKyAgICBjYXNlIEZYX0NPTlRFWFRfRGV2aWNlOiB7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgICAgICBfaW5mby5fZm9udCA9IGZvbnQ7DQorICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6U2V0Rm9udFNpemUoY29uc3QgRlhfRkxPQVQgc2l6ZSkgew0KKyAgRlhfRkxPQVQgZm9udFNpemUgPSBzaXplIDw9IDAgPyAxLjBmIDogc2l6ZTsNCisgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgX2luZm8uX2ZvbnRTaXplID0gZm9udFNpemU7DQorICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6U2V0Rm9udEhTY2FsZShjb25zdCBGWF9GTE9BVCBzY2FsZSkgew0KKyAgRlhfRkxPQVQgZm9udEhTY2FsZSA9IHNjYWxlIDw9IDAgPyAxLjBmIDogc2NhbGU7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIF9pbmZvLl9mb250SFNjYWxlID0gZm9udEhTY2FsZTsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTZXRDaGFyU3BhY2luZyhjb25zdCBGWF9GTE9BVCBzcGFjaW5nKSB7DQorICBGWF9GTE9BVCBmb250U3BhY2luZyA9IHNwYWNpbmcgPCAwID8gMCA6IHNwYWNpbmc7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIF9pbmZvLl9mb250U3BhY2luZyA9IGZvbnRTcGFjaW5nOw0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlNldFRleHREcmF3aW5nTW9kZShjb25zdCBpbnQzMl90IG1vZGUpIHsNCisgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6U2hvd1RleHQoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4KSB7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIHJldHVybiBSZW5kZXJEZXZpY2VTaG93VGV4dChwb2ludCwgdGV4dCwgbWF0cml4KTsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpDYWxjVGV4dFJlY3QoQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgdGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBpc011bHRpbGluZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4KSB7DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIGludDMyX3QgbGVuZ3RoID0gdGV4dC5HZXRMZW5ndGgoKTsNCisgICAgICBGWF9EV09SRCogY2hhckNvZGVzID0gRlhfQWxsb2MoRlhfRFdPUkQsIGxlbmd0aCk7DQorICAgICAgRlhURVhUX0NIQVJQT1MqIGNoYXJQb3MgPSBGWF9BbGxvYyhGWFRFWFRfQ0hBUlBPUywgbGVuZ3RoKTsNCisgICAgICBDYWxjVGV4dEluZm8odGV4dCwgY2hhckNvZGVzLCBjaGFyUG9zLCByZWN0KTsNCisgICAgICBGWF9GcmVlKGNoYXJQb3MpOw0KKyAgICAgIEZYX0ZyZWUoY2hhckNvZGVzKTsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpUcmFuc2ZlcihDRlhfR3JhcGhpY3MqIGdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGdyYXBoaWNzLCBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQpOw0KKyAgQ0ZYX01hdHJpeCBtOw0KKyAgbS5TZXQoX2luZm8uX0NUTS5hLCBfaW5mby5fQ1RNLmIsIF9pbmZvLl9DVE0uYywgX2luZm8uX0NUTS5kLCBfaW5mby5fQ1RNLmUsDQorICAgICAgICBfaW5mby5fQ1RNLmYpOw0KKyAgaWYgKG1hdHJpeCkgew0KKyAgICBtLkNvbmNhdCgqbWF0cml4KTsNCisgIH0NCisgIHN3aXRjaCAoX3R5cGUpIHsNCisgICAgY2FzZSBGWF9DT05URVhUX0RldmljZTogew0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICAgICAgew0KKyAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGdyYXBoaWNzLT5fcmVuZGVyRGV2aWNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQorICAgICAgICBDRlhfRElCaXRtYXAqIGJpdG1hcCA9IGdyYXBoaWNzLT5fcmVuZGVyRGV2aWNlLT5HZXRCaXRtYXAoKTsNCisgICAgICAgIEZYX0JPT0wgcmVzdWx0ID0gX3JlbmRlckRldmljZS0+U2V0RElCaXRzKGJpdG1hcCwgMCwgMCk7DQorICAgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocmVzdWx0LCBGWF9FUlJfTWV0aG9kX05vdF9TdXBwb3J0ZWQpOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpUcmFuc2ZlcihDRlhfR3JhcGhpY3MqIGdyYXBoaWNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHNyY0xlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3JjVG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgZHN0UmVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChncmFwaGljcywgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkKTsNCisgIENGWF9NYXRyaXggbTsNCisgIG0uU2V0KF9pbmZvLl9DVE0uYSwgX2luZm8uX0NUTS5iLCBfaW5mby5fQ1RNLmMsIF9pbmZvLl9DVE0uZCwgX2luZm8uX0NUTS5lLA0KKyAgICAgICAgX2luZm8uX0NUTS5mKTsNCisgIGlmIChtYXRyaXgpIHsNCisgICAgbS5Db25jYXQoKm1hdHJpeCk7DQorICB9DQorICBzd2l0Y2ggKF90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09OVEVYVF9EZXZpY2U6IHsNCisgICAgICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgICAgIHsNCisgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChncmFwaGljcy0+X3JlbmRlckRldmljZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQpOw0KKyAgICAgICAgQ0ZYX0RJQml0bWFwKiBiaXRtYXAgPSBncmFwaGljcy0+X3JlbmRlckRldmljZS0+R2V0Qml0bWFwKCk7DQorICAgICAgICBGWF9CT09MIHJlc3VsdCA9IEZYX0VSUl9JbmRlZmluaXRlOw0KKyAgICAgICAgQ0ZYX0RJQml0bWFwIGJtcDsNCisgICAgICAgIHJlc3VsdCA9IGJtcC5DcmVhdGUoKGludDMyX3QpZHN0UmVjdC53aWR0aCwgKGludDMyX3QpZHN0UmVjdC5oZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcC0+R2V0Rm9ybWF0KCkpOw0KKyAgICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHJlc3VsdCwgRlhfRVJSX0ludGVybWVkaWF0ZV9WYWx1ZV9JbnZhbGlkKTsNCisgICAgICAgIHJlc3VsdCA9IGdyYXBoaWNzLT5fcmVuZGVyRGV2aWNlLT5HZXRESUJpdHMoJmJtcCwgKGludDMyX3Qpc3JjTGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3Qpc3JjVG9wKTsNCisgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChyZXN1bHQsIEZYX0VSUl9NZXRob2RfTm90X1N1cHBvcnRlZCk7DQorICAgICAgICByZXN1bHQgPSBfcmVuZGVyRGV2aWNlLT5TZXRESUJpdHMoJmJtcCwgKGludDMyX3QpZHN0UmVjdC5sZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KWRzdFJlY3QudG9wKTsNCisgICAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChyZXN1bHQsIEZYX0VSUl9NZXRob2RfTm90X1N1cHBvcnRlZCk7DQorICAgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgICB9DQorICAgIH0NCisgICAgZGVmYXVsdDogeyByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7IH0NCisgIH0NCit9DQorQ0ZYX1JlbmRlckRldmljZSogQ0ZYX0dyYXBoaWNzOjpHZXRSZW5kZXJEZXZpY2UoKSB7DQorICByZXR1cm4gX3JlbmRlckRldmljZTsNCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6SW52ZXJzZVJlY3QoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX3JlbmRlckRldmljZSwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgQ0ZYX0RJQml0bWFwKiBiaXRtYXAgPSBfcmVuZGVyRGV2aWNlLT5HZXRCaXRtYXAoKTsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChiaXRtYXAsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgIENGWF9SZWN0RiB0ZW1wKHJlY3QpOw0KKyAgX2luZm8uX0NUTS5UcmFuc2Zvcm1SZWN0KHRlbXApOw0KKyAgQ0ZYX1JlY3RGIHI7DQorICByLlNldCgwLCAwLCAoRlhfRkxPQVQpYml0bWFwLT5HZXRXaWR0aCgpLCAoRlhfRkxPQVQpYml0bWFwLT5HZXRXaWR0aCgpKTsNCisgIHIuSW50ZXJzZWN0KHRlbXApOw0KKyAgaWYgKHIuSXNFbXB0eSgpKSB7DQorICAgIHJldHVybiBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQ7DQorICB9DQorICBGWF9BUkdCKiBwQnVmID0NCisgICAgICAoRlhfQVJHQiopKGJpdG1hcC0+R2V0QnVmZmVyKCkgKyBpbnQzMl90KHIudG9wKSAqIGJpdG1hcC0+R2V0UGl0Y2goKSk7DQorICBpbnQzMl90IGJvdHRvbSA9IChpbnQzMl90KXIuYm90dG9tKCk7DQorICBpbnQzMl90IHJpZ2h0ID0gKGludDMyX3Qpci5yaWdodCgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAoaW50MzJfdClyLnRvcDsgaSA8IGJvdHRvbTsgaSsrKSB7DQorICAgIEZYX0FSR0IqIHBMaW5lID0gcEJ1ZiArIChpbnQzMl90KXIubGVmdDsNCisgICAgZm9yIChpbnQzMl90IGogPSAoaW50MzJfdClyLmxlZnQ7IGogPCByaWdodDsgaisrKSB7DQorICAgICAgRlhfQVJHQiBjID0gKnBMaW5lOw0KKyAgICAgICpwTGluZSsrID0gKGMgJiAweEZGMDAwMDAwKSB8ICgweEZGRkZGRiAtIChjICYgMHgwMEZGRkZGRikpOw0KKyAgICB9DQorICAgIHBCdWYgPSAoRlhfQVJHQiopKCh1aW50OF90KilwQnVmICsgYml0bWFwLT5HZXRQaXRjaCgpKTsNCisgIH0NCisgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpYb3JESUJpdG1hcChjb25zdCBDRlhfRElCaXRtYXAqIHNyY0JpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfcmVuZGVyRGV2aWNlLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICBDRlhfRElCaXRtYXAqIGRzdCA9IF9yZW5kZXJEZXZpY2UtPkdldEJpdG1hcCgpOw0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKGRzdCwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgQ0ZYX1JlY3RGIHRlbXAocmVjdCk7DQorICBfaW5mby5fQ1RNLlRyYW5zZm9ybVJlY3QodGVtcCk7DQorICBDRlhfUmVjdEYgcjsNCisgIHIuU2V0KDAsIDAsIChGWF9GTE9BVClkc3QtPkdldFdpZHRoKCksIChGWF9GTE9BVClkc3QtPkdldFdpZHRoKCkpOw0KKyAgci5JbnRlcnNlY3QodGVtcCk7DQorICBpZiAoci5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZDsNCisgIH0NCisgIEZYX0FSR0IqIHBTcmNCdWYgPSAoRlhfQVJHQiopKHNyY0JpdG1hcC0+R2V0QnVmZmVyKCkgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdChyLnRvcCkgKiBzcmNCaXRtYXAtPkdldFBpdGNoKCkpOw0KKyAgRlhfQVJHQiogcERzdEJ1ZiA9DQorICAgICAgKEZYX0FSR0IqKShkc3QtPkdldEJ1ZmZlcigpICsgaW50MzJfdChyLnRvcCkgKiBkc3QtPkdldFBpdGNoKCkpOw0KKyAgaW50MzJfdCBib3R0b20gPSAoaW50MzJfdClyLmJvdHRvbSgpOw0KKyAgaW50MzJfdCByaWdodCA9IChpbnQzMl90KXIucmlnaHQoKTsNCisgIGZvciAoaW50MzJfdCBpID0gKGludDMyX3Qpci50b3A7IGkgPCBib3R0b207IGkrKykgew0KKyAgICBGWF9BUkdCKiBwU3JjTGluZSA9IHBTcmNCdWYgKyAoaW50MzJfdClyLmxlZnQ7DQorICAgIEZYX0FSR0IqIHBEc3RMaW5lID0gcERzdEJ1ZiArIChpbnQzMl90KXIubGVmdDsNCisgICAgZm9yIChpbnQzMl90IGogPSAoaW50MzJfdClyLmxlZnQ7IGogPCByaWdodDsgaisrKSB7DQorICAgICAgRlhfQVJHQiBjID0gKnBEc3RMaW5lOw0KKyAgICAgICpwRHN0TGluZSsrID0NCisgICAgICAgICAgQXJnYkVuY29kZShGWEFSR0JfQShjKSwgKGMgJiAweEZGRkZGRikgXiAoKnBTcmNMaW5lICYgMHhGRkZGRkYpKTsNCisgICAgICBwU3JjTGluZSsrOw0KKyAgICB9DQorICAgIHBTcmNCdWYgPSAoRlhfQVJHQiopKCh1aW50OF90KilwU3JjQnVmICsgc3JjQml0bWFwLT5HZXRQaXRjaCgpKTsNCisgICAgcERzdEJ1ZiA9IChGWF9BUkdCKikoKHVpbnQ4X3QqKXBEc3RCdWYgKyBkc3QtPkdldFBpdGNoKCkpOw0KKyAgfQ0KKyAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OkVxdkRJQml0bWFwKGNvbnN0IENGWF9ESUJpdG1hcCogc3JjQml0bWFwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9yZW5kZXJEZXZpY2UsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgIENGWF9ESUJpdG1hcCogZHN0ID0gX3JlbmRlckRldmljZS0+R2V0Qml0bWFwKCk7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoZHN0LCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICBDRlhfUmVjdEYgdGVtcChyZWN0KTsNCisgIF9pbmZvLl9DVE0uVHJhbnNmb3JtUmVjdCh0ZW1wKTsNCisgIENGWF9SZWN0RiByOw0KKyAgci5TZXQoMCwgMCwgKEZYX0ZMT0FUKWRzdC0+R2V0V2lkdGgoKSwgKEZYX0ZMT0FUKWRzdC0+R2V0V2lkdGgoKSk7DQorICByLkludGVyc2VjdCh0ZW1wKTsNCisgIGlmIChyLklzRW1wdHkoKSkgew0KKyAgICByZXR1cm4gRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkOw0KKyAgfQ0KKyAgRlhfQVJHQiogcFNyY0J1ZiA9IChGWF9BUkdCKikoc3JjQml0bWFwLT5HZXRCdWZmZXIoKSArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KHIudG9wKSAqIHNyY0JpdG1hcC0+R2V0UGl0Y2goKSk7DQorICBGWF9BUkdCKiBwRHN0QnVmID0NCisgICAgICAoRlhfQVJHQiopKGRzdC0+R2V0QnVmZmVyKCkgKyBpbnQzMl90KHIudG9wKSAqIGRzdC0+R2V0UGl0Y2goKSk7DQorICBpbnQzMl90IGJvdHRvbSA9IChpbnQzMl90KXIuYm90dG9tKCk7DQorICBpbnQzMl90IHJpZ2h0ID0gKGludDMyX3Qpci5yaWdodCgpOw0KKyAgZm9yIChpbnQzMl90IGkgPSAoaW50MzJfdClyLnRvcDsgaSA8IGJvdHRvbTsgaSsrKSB7DQorICAgIEZYX0FSR0IqIHBTcmNMaW5lID0gcFNyY0J1ZiArIChpbnQzMl90KXIubGVmdDsNCisgICAgRlhfQVJHQiogcERzdExpbmUgPSBwRHN0QnVmICsgKGludDMyX3Qpci5sZWZ0Ow0KKyAgICBmb3IgKGludDMyX3QgaiA9IChpbnQzMl90KXIubGVmdDsgaiA8IHJpZ2h0OyBqKyspIHsNCisgICAgICBGWF9BUkdCIGMgPSAqcERzdExpbmU7DQorICAgICAgKnBEc3RMaW5lKysgPQ0KKyAgICAgICAgICBBcmdiRW5jb2RlKEZYQVJHQl9BKGMpLCB+KChjICYgMHhGRkZGRkYpIF4gKCpwU3JjTGluZSAmIDB4RkZGRkZGKSkpOw0KKyAgICAgIHBTcmNMaW5lKys7DQorICAgIH0NCisgICAgcFNyY0J1ZiA9IChGWF9BUkdCKikoKHVpbnQ4X3QqKXBTcmNCdWYgKyBzcmNCaXRtYXAtPkdldFBpdGNoKCkpOw0KKyAgICBwRHN0QnVmID0gKEZYX0FSR0IqKSgodWludDhfdCopcERzdEJ1ZiArIGRzdC0+R2V0UGl0Y2goKSk7DQorICB9DQorICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6UmVuZGVyRGV2aWNlU2V0TGluZURhc2goRlhfRGFzaFN0eWxlIGRhc2hTdHlsZSkgew0KKyAgc3dpdGNoIChkYXNoU3R5bGUpIHsNCisgICAgY2FzZSBGWF9EQVNIU1RZTEVfU29saWQ6IHsNCisgICAgICBfaW5mby5fZ3JhcGhTdGF0ZS5TZXREYXNoQ291bnQoMCk7DQorICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgY2FzZSBGWF9EQVNIU1RZTEVfRGFzaDogew0KKyAgICAgIEZYX0ZMT0FUIGRhc2hBcnJheVtdID0gezMsIDF9Ow0KKyAgICAgIFNldExpbmVEYXNoKDAsIGRhc2hBcnJheSwgMik7DQorICAgICAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorICAgIH0NCisgICAgY2FzZSBGWF9EQVNIU1RZTEVfRG90OiB7DQorICAgICAgRlhfRkxPQVQgZGFzaEFycmF5W10gPSB7MSwgMX07DQorICAgICAgU2V0TGluZURhc2goMCwgZGFzaEFycmF5LCAyKTsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICBjYXNlIEZYX0RBU0hTVFlMRV9EYXNoRG90OiB7DQorICAgICAgRlhfRkxPQVQgZGFzaEFycmF5W10gPSB7MywgMSwgMSwgMX07DQorICAgICAgU2V0TGluZURhc2goMCwgZGFzaEFycmF5LCA0KTsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICBjYXNlIEZYX0RBU0hTVFlMRV9EYXNoRG90RG90OiB7DQorICAgICAgRlhfRkxPQVQgZGFzaEFycmF5W10gPSB7NCwgMSwgMiwgMSwgMiwgMX07DQorICAgICAgU2V0TGluZURhc2goMCwgZGFzaEFycmF5LCA2KTsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQ7IH0NCisgIH0NCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6UmVuZGVyRGV2aWNlU3Ryb2tlUGF0aChDRlhfUGF0aCogcGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9pbmZvLl9zdHJva2VDb2xvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgQ0ZYX01hdHJpeCBtOw0KKyAgbS5TZXQoX2luZm8uX0NUTS5hLCBfaW5mby5fQ1RNLmIsIF9pbmZvLl9DVE0uYywgX2luZm8uX0NUTS5kLCBfaW5mby5fQ1RNLmUsDQorICAgICAgICBfaW5mby5fQ1RNLmYpOw0KKyAgaWYgKG1hdHJpeCkgew0KKyAgICBtLkNvbmNhdCgqbWF0cml4KTsNCisgIH0NCisgIHN3aXRjaCAoX2luZm8uX3N0cm9rZUNvbG9yLT5fdHlwZSkgew0KKyAgICBjYXNlIEZYX0NPTE9SX1NvbGlkOiB7DQorICAgICAgRlhfQk9PTCByZXN1bHQgPSBfcmVuZGVyRGV2aWNlLT5EcmF3UGF0aCgNCisgICAgICAgICAgcGF0aC0+R2V0UGF0aERhdGEoKSwgKENGWF9NYXRyaXgqKSZtLCAmX2luZm8uX2dyYXBoU3RhdGUsIDB4MCwNCisgICAgICAgICAgX2luZm8uX3N0cm9rZUNvbG9yLT5fYXJnYiwgMCk7DQorICAgICAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKHJlc3VsdCwgRlhfRVJSX0luZGVmaW5pdGUpOw0KKyAgICAgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgICB9DQorICAgIGNhc2UgRlhfQ09MT1JfUGF0dGVybjogew0KKyAgICAgIHJldHVybiBTdHJva2VQYXRoV2l0aFBhdHRlcm4ocGF0aCwgJm0pOw0KKyAgICB9DQorICAgIGNhc2UgRlhfQ09MT1JfU2hhZGluZzogew0KKyAgICAgIHJldHVybiBTdHJva2VQYXRoV2l0aFNoYWRpbmcocGF0aCwgJm0pOw0KKyAgICB9DQorICAgIGRlZmF1bHQ6IHsgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOyB9DQorICB9DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlJlbmRlckRldmljZUZpbGxQYXRoKENGWF9QYXRoKiBwYXRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZpbGxNb2RlIGZpbGxNb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9pbmZvLl9maWxsQ29sb3IsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgIENGWF9NYXRyaXggbTsNCisgIG0uU2V0KF9pbmZvLl9DVE0uYSwgX2luZm8uX0NUTS5iLCBfaW5mby5fQ1RNLmMsIF9pbmZvLl9DVE0uZCwgX2luZm8uX0NUTS5lLA0KKyAgICAgICAgX2luZm8uX0NUTS5mKTsNCisgIGlmIChtYXRyaXgpIHsNCisgICAgbS5Db25jYXQoKm1hdHJpeCk7DQorICB9DQorICBzd2l0Y2ggKF9pbmZvLl9maWxsQ29sb3ItPl90eXBlKSB7DQorICAgIGNhc2UgRlhfQ09MT1JfU29saWQ6IHsNCisgICAgICBGWF9CT09MIHJlc3VsdCA9IF9yZW5kZXJEZXZpY2UtPkRyYXdQYXRoKA0KKyAgICAgICAgICBwYXRoLT5HZXRQYXRoRGF0YSgpLCAoQ0ZYX01hdHJpeCopJm0sICZfaW5mby5fZ3JhcGhTdGF0ZSwNCisgICAgICAgICAgX2luZm8uX2ZpbGxDb2xvci0+X2FyZ2IsIDB4MCwgZmlsbE1vZGUpOw0KKyAgICAgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChyZXN1bHQsIEZYX0VSUl9JbmRlZmluaXRlKTsNCisgICAgICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCisgICAgfQ0KKyAgICBjYXNlIEZYX0NPTE9SX1BhdHRlcm46IHsNCisgICAgICB7IHJldHVybiBGaWxsUGF0aFdpdGhQYXR0ZXJuKHBhdGgsIGZpbGxNb2RlLCAmbSk7IH0NCisgICAgfQ0KKyAgICBjYXNlIEZYX0NPTE9SX1NoYWRpbmc6IHsNCisgICAgICB7IHJldHVybiBGaWxsUGF0aFdpdGhTaGFkaW5nKHBhdGgsIGZpbGxNb2RlLCAmbSk7IH0NCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsgfQ0KKyAgfQ0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpSZW5kZXJEZXZpY2VEcmF3SW1hZ2UoQ0ZYX0RJQlNvdXJjZSogc291cmNlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4KSB7DQorICBDRlhfTWF0cml4IG0xOw0KKyAgbTEuU2V0KF9pbmZvLl9DVE0uYSwgX2luZm8uX0NUTS5iLCBfaW5mby5fQ1RNLmMsIF9pbmZvLl9DVE0uZCwgX2luZm8uX0NUTS5lLA0KKyAgICAgICAgIF9pbmZvLl9DVE0uZik7DQorICBpZiAobWF0cml4KSB7DQorICAgIG0xLkNvbmNhdCgqbWF0cml4KTsNCisgIH0NCisgIENGWF9NYXRyaXggbTI7DQorICBtMi5TZXQoKEZYX0ZMT0FUKXNvdXJjZS0+R2V0V2lkdGgoKSwgMC4wLCAwLjAsIChGWF9GTE9BVClzb3VyY2UtPkdldEhlaWdodCgpLA0KKyAgICAgICAgIHBvaW50LngsIHBvaW50LnkpOw0KKyAgbTIuQ29uY2F0KG0xKTsNCisgIGludDMyX3QgbGVmdCwgdG9wOw0KKyAgQ0ZYX0RJQml0bWFwKiBibXAxID0gc291cmNlLT5GbGlwSW1hZ2UoRkFMU0UsIFRSVUUpOw0KKyAgQ0ZYX0RJQml0bWFwKiBibXAyID0gYm1wMS0+VHJhbnNmb3JtVG8oKENGWF9NYXRyaXgqKSZtMiwgbGVmdCwgdG9wKTsNCisgIENGWF9SZWN0RiByOw0KKyAgR2V0Q2xpcFJlY3Qocik7DQorICBGWF9FUlIgcmVzdWx0ID0gRlhfRVJSX0luZGVmaW5pdGU7DQorICB7DQorICAgIENGWF9ESUJpdG1hcCogYml0bWFwID0gX3JlbmRlckRldmljZS0+R2V0Qml0bWFwKCk7DQorICAgIENGWF9ESUJpdG1hcCBibXA7DQorICAgIGJtcC5DcmVhdGUoYml0bWFwLT5HZXRXaWR0aCgpLCBiaXRtYXAtPkdldEhlaWdodCgpLCBGWERJQl9BcmdiKTsNCisgICAgX3JlbmRlckRldmljZS0+R2V0RElCaXRzKCZibXAsIDAsIDApOw0KKyAgICBibXAuVHJhbnNmZXJCaXRtYXAoRlhTWVNfcm91bmQoci5sZWZ0KSwgRlhTWVNfcm91bmQoci50b3ApLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQoci5XaWR0aCgpKSwgRlhTWVNfcm91bmQoci5IZWlnaHQoKSksIGJtcDIsDQorICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChyLmxlZnQgLSBsZWZ0KSwgRlhTWVNfcm91bmQoci50b3AgLSB0b3ApKTsNCisgICAgX3JlbmRlckRldmljZS0+U2V0RElCaXRzKCZibXAsIDAsIDApOw0KKyAgICByZXN1bHQgPSBGWF9FUlJfU3VjY2VlZGVkOw0KKyAgfQ0KKyAgaWYgKGJtcDIpIHsNCisgICAgZGVsZXRlIGJtcDI7DQorICAgIGJtcDIgPSBOVUxMOw0KKyAgfQ0KKyAgaWYgKGJtcDEpIHsNCisgICAgZGVsZXRlIGJtcDE7DQorICAgIGJtcDEgPSBOVUxMOw0KKyAgfQ0KKyAgcmV0dXJuIHJlc3VsdDsNCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6UmVuZGVyRGV2aWNlU3RyZXRjaEltYWdlKENGWF9ESUJTb3VyY2UqIHNvdXJjZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBtYXRyaXgpIHsNCisgIENGWF9NYXRyaXggbTE7DQorICBtMS5TZXQoX2luZm8uX0NUTS5hLCBfaW5mby5fQ1RNLmIsIF9pbmZvLl9DVE0uYywgX2luZm8uX0NUTS5kLCBfaW5mby5fQ1RNLmUsDQorICAgICAgICAgX2luZm8uX0NUTS5mKTsNCisgIGlmIChtYXRyaXgpIHsNCisgICAgbTEuQ29uY2F0KCptYXRyaXgpOw0KKyAgfQ0KKyAgQ0ZYX0RJQml0bWFwKiBibXAxID0NCisgICAgICBzb3VyY2UtPlN0cmV0Y2hUbygoaW50MzJfdClyZWN0LldpZHRoKCksIChpbnQzMl90KXJlY3QuSGVpZ2h0KCkpOw0KKyAgQ0ZYX01hdHJpeCBtMjsNCisgIG0yLlNldChyZWN0LldpZHRoKCksIDAuMCwgMC4wLCByZWN0LkhlaWdodCgpLCByZWN0LmxlZnQsIHJlY3QudG9wKTsNCisgIG0yLkNvbmNhdChtMSk7DQorICBpbnQzMl90IGxlZnQsIHRvcDsNCisgIENGWF9ESUJpdG1hcCogYm1wMiA9IGJtcDEtPkZsaXBJbWFnZShGQUxTRSwgVFJVRSk7DQorICBDRlhfRElCaXRtYXAqIGJtcDMgPSBibXAyLT5UcmFuc2Zvcm1UbygoQ0ZYX01hdHJpeCopJm0yLCBsZWZ0LCB0b3ApOw0KKyAgQ0ZYX1JlY3RGIHI7DQorICBHZXRDbGlwUmVjdChyKTsNCisgIEZYX0VSUiByZXN1bHQgPSBGWF9FUlJfSW5kZWZpbml0ZTsNCisgIHsNCisgICAgQ0ZYX0RJQml0bWFwKiBiaXRtYXAgPSBfcmVuZGVyRGV2aWNlLT5HZXRCaXRtYXAoKTsNCisgICAgYml0bWFwLT5Db21wb3NpdGVCaXRtYXAoRlhTWVNfcm91bmQoci5sZWZ0KSwgRlhTWVNfcm91bmQoci50b3ApLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChyLldpZHRoKCkpLCBGWFNZU19yb3VuZChyLkhlaWdodCgpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wMywgRlhTWVNfcm91bmQoci5sZWZ0IC0gbGVmdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKHIudG9wIC0gdG9wKSk7DQorICAgIHJlc3VsdCA9IEZYX0VSUl9TdWNjZWVkZWQ7DQorICB9DQorICBpZiAoYm1wMykgew0KKyAgICBkZWxldGUgYm1wMzsNCisgICAgYm1wMyA9IE5VTEw7DQorICB9DQorICBpZiAoYm1wMikgew0KKyAgICBkZWxldGUgYm1wMjsNCisgICAgYm1wMiA9IE5VTEw7DQorICB9DQorICBpZiAoYm1wMSkgew0KKyAgICBkZWxldGUgYm1wMTsNCisgICAgYm1wMSA9IE5VTEw7DQorICB9DQorICByZXR1cm4gcmVzdWx0Ow0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpSZW5kZXJEZXZpY2VTaG93VGV4dChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgdGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBtYXRyaXgpIHsNCisgIGludDMyX3QgbGVuZ3RoID0gdGV4dC5HZXRMZW5ndGgoKTsNCisgIEZYX0RXT1JEKiBjaGFyQ29kZXMgPSBGWF9BbGxvYyhGWF9EV09SRCwgbGVuZ3RoKTsNCisgIEZYVEVYVF9DSEFSUE9TKiBjaGFyUG9zID0gRlhfQWxsb2MoRlhURVhUX0NIQVJQT1MsIGxlbmd0aCk7DQorICBDRlhfUmVjdEYgcmVjdDsNCisgIHJlY3QuU2V0KHBvaW50LngsIHBvaW50LnksIDAsIDApOw0KKyAgQ2FsY1RleHRJbmZvKHRleHQsIGNoYXJDb2RlcywgY2hhclBvcywgcmVjdCk7DQorICBDRlhfTWF0cml4IG07DQorICBtLlNldChfaW5mby5fQ1RNLmEsIF9pbmZvLl9DVE0uYiwgX2luZm8uX0NUTS5jLCBfaW5mby5fQ1RNLmQsIF9pbmZvLl9DVE0uZSwNCisgICAgICAgIF9pbmZvLl9DVE0uZik7DQorICBtLlRyYW5zbGF0ZSgwLCBfaW5mby5fZm9udFNpemUgKiBfaW5mby5fZm9udEhTY2FsZSk7DQorICBpZiAobWF0cml4KSB7DQorICAgIG0uQ29uY2F0KCptYXRyaXgpOw0KKyAgfQ0KKyAgRlhfQk9PTCByZXN1bHQgPSBfcmVuZGVyRGV2aWNlLT5EcmF3Tm9ybWFsVGV4dCgNCisgICAgICBsZW5ndGgsIGNoYXJQb3MsIF9pbmZvLl9mb250LCBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKSwNCisgICAgICAtX2luZm8uX2ZvbnRTaXplICogX2luZm8uX2ZvbnRIU2NhbGUsIChDRlhfTWF0cml4KikmbSwNCisgICAgICBfaW5mby5fZmlsbENvbG9yLT5fYXJnYiwgRlhURVhUX0NMRUFSVFlQRSk7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocmVzdWx0LCBGWF9FUlJfSW5kZWZpbml0ZSk7DQorICBGWF9GcmVlKGNoYXJQb3MpOw0KKyAgRlhfRnJlZShjaGFyQ29kZXMpOw0KKyAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0VSUiBDRlhfR3JhcGhpY3M6OlN0cm9rZVBhdGhXaXRoUGF0dGVybihDRlhfUGF0aCogcGF0aCwgQ0ZYX01hdHJpeCogbWF0cml4KSB7DQorICByZXR1cm4gRlhfRVJSX01ldGhvZF9Ob3RfU3VwcG9ydGVkOw0KK30NCitGWF9FUlIgQ0ZYX0dyYXBoaWNzOjpTdHJva2VQYXRoV2l0aFNoYWRpbmcoQ0ZYX1BhdGgqIHBhdGgsIENGWF9NYXRyaXgqIG1hdHJpeCkgew0KKyAgcmV0dXJuIEZYX0VSUl9NZXRob2RfTm90X1N1cHBvcnRlZDsNCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6RmlsbFBhdGhXaXRoUGF0dGVybihDRlhfUGF0aCogcGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZpbGxNb2RlIGZpbGxNb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4KSB7DQorICBDRlhfUGF0dGVybiogcGF0dGVybiA9IF9pbmZvLl9maWxsQ29sb3ItPl9wYXR0ZXJuOw0KKyAgQ0ZYX0RJQml0bWFwKiBiaXRtYXAgPSBfcmVuZGVyRGV2aWNlLT5HZXRCaXRtYXAoKTsNCisgIGludDMyX3Qgd2lkdGggPSBiaXRtYXAtPkdldFdpZHRoKCk7DQorICBpbnQzMl90IGhlaWdodCA9IGJpdG1hcC0+R2V0SGVpZ2h0KCk7DQorICBDRlhfRElCaXRtYXAgYm1wOw0KKyAgYm1wLkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9BcmdiKTsNCisgIF9yZW5kZXJEZXZpY2UtPkdldERJQml0cygmYm1wLCAwLCAwKTsNCisgIHN3aXRjaCAocGF0dGVybi0+X3R5cGUpIHsNCisgICAgY2FzZSBGWF9QQVRURVJOX0JpdG1hcDogew0KKyAgICAgIGludDMyX3QgeFN0ZXAgPSBGWFNZU19yb3VuZChwYXR0ZXJuLT5feDFTdGVwKTsNCisgICAgICBpbnQzMl90IHlTdGVwID0gRlhTWVNfcm91bmQocGF0dGVybi0+X3kxU3RlcCk7DQorICAgICAgaW50MzJfdCB4Q291bnQgPSB3aWR0aCAvIHhTdGVwICsgMTsNCisgICAgICBpbnQzMl90IHlDb3VudCA9IGhlaWdodCAvIHlTdGVwICsgMTsNCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPD0geUNvdW50OyBpKyspIHsNCisgICAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8PSB4Q291bnQ7IGorKykgew0KKyAgICAgICAgICBibXAuVHJhbnNmZXJCaXRtYXAoaiAqIHhTdGVwLCBpICogeVN0ZXAsIHhTdGVwLCB5U3RlcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4tPl9iaXRtYXAsIDAsIDApOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZYX1BBVFRFUk5fSGF0Y2g6IHsNCisgICAgICBGWF9IYXRjaFN0eWxlIGhhdGNoU3R5bGUgPSBfaW5mby5fZmlsbENvbG9yLT5fcGF0dGVybi0+X2hhdGNoU3R5bGU7DQorICAgICAgaWYgKGhhdGNoU3R5bGUgPCBGWF9IQVRDSFNUWUxFX0hvcml6b250YWwgfHwNCisgICAgICAgICAgaGF0Y2hTdHlsZSA+IEZYX0hBVENIU1RZTEVfU29saWREaWFtb25kKSB7DQorICAgICAgICByZXR1cm4gRlhfRVJSX0ludGVybWVkaWF0ZV9WYWx1ZV9JbnZhbGlkOw0KKyAgICAgIH0NCisgICAgICBjb25zdCBGWF9IQVRDSERBVEEmIGRhdGEgPSBoYXRjaEJpdG1hcERhdGFbaGF0Y2hTdHlsZV07DQorICAgICAgQ0ZYX0RJQml0bWFwIG1hc2s7DQorICAgICAgbWFzay5DcmVhdGUoZGF0YS53aWR0aCwgZGF0YS5oZWlnaHQsIEZYRElCXzFicHBNYXNrKTsNCisgICAgICBGWFNZU19tZW1jcHkobWFzay5HZXRCdWZmZXIoKSwgZGF0YS5tYXNrQml0cywNCisgICAgICAgICAgICAgICAgICAgbWFzay5HZXRQaXRjaCgpICogZGF0YS5oZWlnaHQpOw0KKyAgICAgIENGWF9GbG9hdFJlY3QgcmVjdGYgPSBwYXRoLT5HZXRQYXRoRGF0YSgpLT5HZXRCb3VuZGluZ0JveCgpOw0KKyAgICAgIGlmIChtYXRyaXgpIHsNCisgICAgICAgIHJlY3RmLlRyYW5zZm9ybSgoY29uc3QgQ0ZYX01hdHJpeCopbWF0cml4KTsNCisgICAgICB9DQorICAgICAgRlhfUkVDVCByZWN0KEZYU1lTX3JvdW5kKHJlY3RmLmxlZnQpLCBGWFNZU19yb3VuZChyZWN0Zi50b3ApLA0KKyAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChyZWN0Zi5yaWdodCksIEZYU1lTX3JvdW5kKHJlY3RmLmJvdHRvbSkpOw0KKyAgICAgIENGWF9GeGdlRGV2aWNlIGRldmljZTsNCisgICAgICBkZXZpY2UuQXR0YWNoKCZibXApOw0KKyAgICAgIGRldmljZS5GaWxsUmVjdCgmcmVjdCwgX2luZm8uX2ZpbGxDb2xvci0+X3BhdHRlcm4tPl9iYWNrQXJnYik7DQorICAgICAgZm9yIChpbnQzMl90IGogPSByZWN0LmJvdHRvbTsgaiA8IHJlY3QudG9wOyBqICs9IG1hc2suR2V0SGVpZ2h0KCkpIHsNCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gcmVjdC5sZWZ0OyBpIDwgcmVjdC5yaWdodDsgaSArPSBtYXNrLkdldFdpZHRoKCkpIHsNCisgICAgICAgICAgZGV2aWNlLlNldEJpdE1hc2soJm1hc2ssIGksIGosIF9pbmZvLl9maWxsQ29sb3ItPl9wYXR0ZXJuLT5fZm9yZUFyZ2IpOw0KKyAgICAgICAgfQ0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgfQ0KKyAgX3JlbmRlckRldmljZS0+U2F2ZVN0YXRlKCk7DQorICBfcmVuZGVyRGV2aWNlLT5TZXRDbGlwX1BhdGhGaWxsKHBhdGgtPkdldFBhdGhEYXRhKCksIChDRlhfTWF0cml4KiltYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxNb2RlKTsNCisgIFNldERJQml0c1dpdGhNYXRyaXgoJmJtcCwgJnBhdHRlcm4tPl9tYXRyaXgpOw0KKyAgX3JlbmRlckRldmljZS0+UmVzdG9yZVN0YXRlKCk7DQorICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6RmlsbFBhdGhXaXRoU2hhZGluZyhDRlhfUGF0aCogcGF0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZpbGxNb2RlIGZpbGxNb2RlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4KSB7DQorICBDRlhfRElCaXRtYXAqIGJpdG1hcCA9IF9yZW5kZXJEZXZpY2UtPkdldEJpdG1hcCgpOw0KKyAgaW50MzJfdCB3aWR0aCA9IGJpdG1hcC0+R2V0V2lkdGgoKTsNCisgIGludDMyX3QgaGVpZ2h0ID0gYml0bWFwLT5HZXRIZWlnaHQoKTsNCisgIEZYX0ZMT0FUIHN0YXJ0X3ggPSBfaW5mby5fZmlsbENvbG9yLT5fc2hhZGluZy0+X2JlZ2luUG9pbnQueDsNCisgIEZYX0ZMT0FUIHN0YXJ0X3kgPSBfaW5mby5fZmlsbENvbG9yLT5fc2hhZGluZy0+X2JlZ2luUG9pbnQueTsNCisgIEZYX0ZMT0FUIGVuZF94ID0gX2luZm8uX2ZpbGxDb2xvci0+X3NoYWRpbmctPl9lbmRQb2ludC54Ow0KKyAgRlhfRkxPQVQgZW5kX3kgPSBfaW5mby5fZmlsbENvbG9yLT5fc2hhZGluZy0+X2VuZFBvaW50Lnk7DQorICBDRlhfRElCaXRtYXAgYm1wOw0KKyAgYm1wLkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9BcmdiKTsNCisgIF9yZW5kZXJEZXZpY2UtPkdldERJQml0cygmYm1wLCAwLCAwKTsNCisgIGludDMyX3QgcGl0Y2ggPSBibXAuR2V0UGl0Y2goKTsNCisgIEZYX0JPT0wgcmVzdWx0ID0gRkFMU0U7DQorICBzd2l0Y2ggKF9pbmZvLl9maWxsQ29sb3ItPl9zaGFkaW5nLT5fdHlwZSkgew0KKyAgICBjYXNlIEZYX1NIQURJTkdfQXhpYWw6IHsNCisgICAgICBGWF9GTE9BVCB4X3NwYW4gPSBlbmRfeCAtIHN0YXJ0X3g7DQorICAgICAgRlhfRkxPQVQgeV9zcGFuID0gZW5kX3kgLSBzdGFydF95Ow0KKyAgICAgIEZYX0ZMT0FUIGF4aXNfbGVuX3NxdWFyZSA9DQorICAgICAgICAgIEZYU1lTX011bCh4X3NwYW4sIHhfc3BhbikgKyBGWFNZU19NdWwoeV9zcGFuLCB5X3NwYW4pOw0KKyAgICAgIGZvciAoaW50MzJfdCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7DQorICAgICAgICBGWF9EV09SRCogZGliX2J1ZiA9IChGWF9EV09SRCopKGJtcC5HZXRCdWZmZXIoKSArIHJvdyAqIHBpdGNoKTsNCisgICAgICAgIGZvciAoaW50MzJfdCBjb2x1bW4gPSAwOyBjb2x1bW4gPCB3aWR0aDsgY29sdW1uKyspIHsNCisgICAgICAgICAgRlhfRkxPQVQgeCA9IChGWF9GTE9BVCkoY29sdW1uKTsNCisgICAgICAgICAgRlhfRkxPQVQgeSA9IChGWF9GTE9BVCkocm93KTsNCisgICAgICAgICAgRlhfRkxPQVQgc2NhbGUgPSBGWFNZU19EaXYoDQorICAgICAgICAgICAgICBGWFNZU19NdWwoeCAtIHN0YXJ0X3gsIHhfc3BhbikgKyBGWFNZU19NdWwoeSAtIHN0YXJ0X3ksIHlfc3BhbiksDQorICAgICAgICAgICAgICBheGlzX2xlbl9zcXVhcmUpOw0KKyAgICAgICAgICBpZiAoc2NhbGUgPCAwKSB7DQorICAgICAgICAgICAgaWYgKCFfaW5mby5fZmlsbENvbG9yLT5fc2hhZGluZy0+X2lzRXh0ZW5kZWRCZWdpbikgew0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHNjYWxlID0gMDsNCisgICAgICAgICAgfSBlbHNlIGlmIChzY2FsZSA+IDEuMGYpIHsNCisgICAgICAgICAgICBpZiAoIV9pbmZvLl9maWxsQ29sb3ItPl9zaGFkaW5nLT5faXNFeHRlbmRlZEVuZCkgew0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHNjYWxlID0gMS4wZjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpbnQzMl90IGluZGV4ID0gKGludDMyX3QpKHNjYWxlICogKEZYX1NIQURJTkdfU3RlcHMgLSAxKSk7DQorICAgICAgICAgIGRpYl9idWZbY29sdW1uXSA9IF9pbmZvLl9maWxsQ29sb3ItPl9zaGFkaW5nLT5fYXJnYkFycmF5W2luZGV4XTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcmVzdWx0ID0gVFJVRTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBjYXNlIEZYX1NIQURJTkdfUmFkaWFsOiB7DQorICAgICAgRlhfRkxPQVQgc3RhcnRfciA9IF9pbmZvLl9maWxsQ29sb3ItPl9zaGFkaW5nLT5fYmVnaW5SYWRpdXM7DQorICAgICAgRlhfRkxPQVQgZW5kX3IgPSBfaW5mby5fZmlsbENvbG9yLT5fc2hhZGluZy0+X2VuZFJhZGl1czsNCisgICAgICBGWF9GTE9BVCBhID0gRlhTWVNfTXVsKHN0YXJ0X3ggLSBlbmRfeCwgc3RhcnRfeCAtIGVuZF94KSArDQorICAgICAgICAgICAgICAgICAgIEZYU1lTX011bChzdGFydF95IC0gZW5kX3ksIHN0YXJ0X3kgLSBlbmRfeSkgLQ0KKyAgICAgICAgICAgICAgICAgICBGWFNZU19NdWwoc3RhcnRfciAtIGVuZF9yLCBzdGFydF9yIC0gZW5kX3IpOw0KKyAgICAgIGZvciAoaW50MzJfdCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7DQorICAgICAgICBGWF9EV09SRCogZGliX2J1ZiA9IChGWF9EV09SRCopKGJtcC5HZXRCdWZmZXIoKSArIHJvdyAqIHBpdGNoKTsNCisgICAgICAgIGZvciAoaW50MzJfdCBjb2x1bW4gPSAwOyBjb2x1bW4gPCB3aWR0aDsgY29sdW1uKyspIHsNCisgICAgICAgICAgRlhfRkxPQVQgeCA9IChGWF9GTE9BVCkoY29sdW1uKTsNCisgICAgICAgICAgRlhfRkxPQVQgeSA9IChGWF9GTE9BVCkocm93KTsNCisgICAgICAgICAgRlhfRkxPQVQgYiA9IC0yICogKEZYU1lTX011bCh4IC0gc3RhcnRfeCwgZW5kX3ggLSBzdGFydF94KSArDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19NdWwoeSAtIHN0YXJ0X3ksIGVuZF95IC0gc3RhcnRfeSkgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfTXVsKHN0YXJ0X3IsIGVuZF9yIC0gc3RhcnRfcikpOw0KKyAgICAgICAgICBGWF9GTE9BVCBjID0gRlhTWVNfTXVsKHggLSBzdGFydF94LCB4IC0gc3RhcnRfeCkgKw0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfTXVsKHkgLSBzdGFydF95LCB5IC0gc3RhcnRfeSkgLQ0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfTXVsKHN0YXJ0X3IsIHN0YXJ0X3IpOw0KKyAgICAgICAgICBGWF9GTE9BVCBzOw0KKyAgICAgICAgICBpZiAoYSA9PSAwKSB7DQorICAgICAgICAgICAgcyA9IChGWFNZU19EaXYoLWMsIGIpKTsNCisgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBGWF9GTE9BVCBiMl80YWMgPSBGWFNZU19NdWwoYiwgYikgLSA0ICogRlhTWVNfTXVsKGEsIGMpOw0KKyAgICAgICAgICAgIGlmIChiMl80YWMgPCAwKSB7DQorICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgRlhfRkxPQVQgcm9vdCA9IChGWFNZU19zcXJ0KGIyXzRhYykpOw0KKyAgICAgICAgICAgIEZYX0ZMT0FUIHMxLCBzMjsNCisgICAgICAgICAgICBpZiAoYSA+IDApIHsNCisgICAgICAgICAgICAgIHMxID0gRlhTWVNfRGl2KC1iIC0gcm9vdCwgMiAqIGEpOw0KKyAgICAgICAgICAgICAgczIgPSBGWFNZU19EaXYoLWIgKyByb290LCAyICogYSk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHMyID0gRlhTWVNfRGl2KC1iIC0gcm9vdCwgMiAqIGEpOw0KKyAgICAgICAgICAgICAgczEgPSBGWFNZU19EaXYoLWIgKyByb290LCAyICogYSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChzMiA8PSAxLjBmIHx8IF9pbmZvLl9maWxsQ29sb3ItPl9zaGFkaW5nLT5faXNFeHRlbmRlZEVuZCkgew0KKyAgICAgICAgICAgICAgcyA9IChzMik7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgIHMgPSAoczEpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpZiAoKHN0YXJ0X3IpICsgcyAqIChlbmRfciAtIHN0YXJ0X3IpIDwgMCkgew0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICB9DQorICAgICAgICAgIGlmIChzIDwgMCkgew0KKyAgICAgICAgICAgIGlmICghX2luZm8uX2ZpbGxDb2xvci0+X3NoYWRpbmctPl9pc0V4dGVuZGVkQmVnaW4pIHsNCisgICAgICAgICAgICAgIGNvbnRpbnVlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBzID0gMDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgICBpZiAocyA+IDEuMGYpIHsNCisgICAgICAgICAgICBpZiAoIV9pbmZvLl9maWxsQ29sb3ItPl9zaGFkaW5nLT5faXNFeHRlbmRlZEVuZCkgew0KKyAgICAgICAgICAgICAgY29udGludWU7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHMgPSAxLjBmOw0KKyAgICAgICAgICB9DQorICAgICAgICAgIGludCBpbmRleCA9IChpbnQzMl90KShzICogKEZYX1NIQURJTkdfU3RlcHMgLSAxKSk7DQorICAgICAgICAgIGRpYl9idWZbY29sdW1uXSA9IF9pbmZvLl9maWxsQ29sb3ItPl9zaGFkaW5nLT5fYXJnYkFycmF5W2luZGV4XTsNCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgcmVzdWx0ID0gVFJVRTsNCisgICAgICBicmVhazsNCisgICAgfQ0KKyAgICBkZWZhdWx0OiB7IHJlc3VsdCA9IEZBTFNFOyB9DQorICB9DQorICBpZiAocmVzdWx0KSB7DQorICAgIF9yZW5kZXJEZXZpY2UtPlNhdmVTdGF0ZSgpOw0KKyAgICBfcmVuZGVyRGV2aWNlLT5TZXRDbGlwX1BhdGhGaWxsKHBhdGgtPkdldFBhdGhEYXRhKCksIChDRlhfTWF0cml4KiltYXRyaXgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbE1vZGUpOw0KKyAgICBTZXRESUJpdHNXaXRoTWF0cml4KCZibXAsIG1hdHJpeCk7DQorICAgIF9yZW5kZXJEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOw0KKyAgfQ0KKyAgcmV0dXJuIHJlc3VsdDsNCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6U2V0RElCaXRzV2l0aE1hdHJpeChDRlhfRElCU291cmNlKiBzb3VyY2UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBtYXRyaXgpIHsNCisgIGlmIChtYXRyaXgtPklzSWRlbnRpdHkoKSkgew0KKyAgICBfcmVuZGVyRGV2aWNlLT5TZXRESUJpdHMoc291cmNlLCAwLCAwKTsNCisgIH0gZWxzZSB7DQorICAgIENGWF9NYXRyaXggbTsNCisgICAgbS5TZXQoKEZYX0ZMT0FUKXNvdXJjZS0+R2V0V2lkdGgoKSwgMCwgMCwgKEZYX0ZMT0FUKXNvdXJjZS0+R2V0SGVpZ2h0KCksIDAsDQorICAgICAgICAgIDApOw0KKyAgICBtLkNvbmNhdCgqbWF0cml4KTsNCisgICAgaW50MzJfdCBsZWZ0LCB0b3A7DQorICAgIENGWF9ESUJpdG1hcCogYm1wMSA9IHNvdXJjZS0+RmxpcEltYWdlKEZBTFNFLCBUUlVFKTsNCisgICAgQ0ZYX0RJQml0bWFwKiBibXAyID0gYm1wMS0+VHJhbnNmb3JtVG8oKENGWF9NYXRyaXgqKSZtLCBsZWZ0LCB0b3ApOw0KKyAgICBfcmVuZGVyRGV2aWNlLT5TZXRESUJpdHMoYm1wMiwgbGVmdCwgdG9wKTsNCisgICAgaWYgKGJtcDIpIHsNCisgICAgICBkZWxldGUgYm1wMjsNCisgICAgICBibXAyID0gTlVMTDsNCisgICAgfQ0KKyAgICBpZiAoYm1wMSkgew0KKyAgICAgIGRlbGV0ZSBibXAxOw0KKyAgICAgIGJtcDEgPSBOVUxMOw0KKyAgICB9DQorICB9DQorICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRVJSIENGWF9HcmFwaGljczo6Q2FsY1RleHRJbmZvKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB0ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCogY2hhckNvZGVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyogY2hhclBvcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1VuaWNvZGVFbmNvZGluZz4gZW5jb2RpbmcoDQorICAgICAgbmV3IENGWF9Vbmljb2RlRW5jb2RpbmcoX2luZm8uX2ZvbnQpKTsNCisgIGludDMyX3QgbGVuZ3RoID0gdGV4dC5HZXRMZW5ndGgoKTsNCisgIEZYX0ZMT0FUIHBlblggPSAoRlhfRkxPQVQpcmVjdC5sZWZ0Ow0KKyAgRlhfRkxPQVQgcGVuWSA9IChGWF9GTE9BVClyZWN0LnRvcDsNCisgIEZYX0ZMT0FUIGxlZnQgPSAoRlhfRkxPQVQpKDApOw0KKyAgRlhfRkxPQVQgdG9wID0gKEZYX0ZMT0FUKSgwKTsNCisgIGNoYXJDb2Rlc1swXSA9IHRleHQuR2V0QXQoMCk7DQorICBjaGFyUG9zWzBdLm1fT3JpZ2luWCA9IHBlblggKyBsZWZ0Ow0KKyAgY2hhclBvc1swXS5tX09yaWdpblkgPSBwZW5ZICsgdG9wOw0KKyAgY2hhclBvc1swXS5tX0dseXBoSW5kZXggPSBlbmNvZGluZy0+R2x5cGhGcm9tQ2hhckNvZGUoY2hhckNvZGVzWzBdKTsNCisgIGNoYXJQb3NbMF0ubV9Gb250Q2hhcldpZHRoID0gRlhTWVNfcm91bmQoDQorICAgICAgX2luZm8uX2ZvbnQtPkdldEdseXBoV2lkdGgoY2hhclBvc1swXS5tX0dseXBoSW5kZXgpICogX2luZm8uX2ZvbnRIU2NhbGUpOw0KKyAgY2hhclBvc1swXS5tX2JHbHlwaEFkanVzdCA9IFRSVUU7DQorICBjaGFyUG9zWzBdLm1fQWRqdXN0TWF0cml4WzBdID0gLTE7DQorICBjaGFyUG9zWzBdLm1fQWRqdXN0TWF0cml4WzFdID0gMDsNCisgIGNoYXJQb3NbMF0ubV9BZGp1c3RNYXRyaXhbMl0gPSAwOw0KKyAgY2hhclBvc1swXS5tX0FkanVzdE1hdHJpeFszXSA9IDE7DQorICBwZW5YICs9IChGWF9GTE9BVCkoY2hhclBvc1swXS5tX0ZvbnRDaGFyV2lkdGgpICogX2luZm8uX2ZvbnRTaXplIC8gMTAwMCArDQorICAgICAgICAgIF9pbmZvLl9mb250U3BhY2luZzsNCisgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7DQorICAgIGNoYXJDb2Rlc1tpXSA9IHRleHQuR2V0QXQoaSk7DQorICAgIGNoYXJQb3NbaV0ubV9PcmlnaW5YID0gcGVuWCArIGxlZnQ7DQorICAgIGNoYXJQb3NbaV0ubV9PcmlnaW5ZID0gcGVuWSArIHRvcDsNCisgICAgY2hhclBvc1tpXS5tX0dseXBoSW5kZXggPSBlbmNvZGluZy0+R2x5cGhGcm9tQ2hhckNvZGUoY2hhckNvZGVzW2ldKTsNCisgICAgY2hhclBvc1tpXS5tX0ZvbnRDaGFyV2lkdGggPQ0KKyAgICAgICAgRlhTWVNfcm91bmQoX2luZm8uX2ZvbnQtPkdldEdseXBoV2lkdGgoY2hhclBvc1tpXS5tX0dseXBoSW5kZXgpICoNCisgICAgICAgICAgICAgICAgICAgIF9pbmZvLl9mb250SFNjYWxlKTsNCisgICAgY2hhclBvc1tpXS5tX2JHbHlwaEFkanVzdCA9IFRSVUU7DQorICAgIGNoYXJQb3NbaV0ubV9BZGp1c3RNYXRyaXhbMF0gPSAtMTsNCisgICAgY2hhclBvc1tpXS5tX0FkanVzdE1hdHJpeFsxXSA9IDA7DQorICAgIGNoYXJQb3NbaV0ubV9BZGp1c3RNYXRyaXhbMl0gPSAwOw0KKyAgICBjaGFyUG9zW2ldLm1fQWRqdXN0TWF0cml4WzNdID0gMTsNCisgICAgcGVuWCArPSAoRlhfRkxPQVQpKGNoYXJQb3NbaV0ubV9Gb250Q2hhcldpZHRoKSAqIF9pbmZvLl9mb250U2l6ZSAvIDEwMDAgKw0KKyAgICAgICAgICAgIF9pbmZvLl9mb250U3BhY2luZzsNCisgIH0NCisgIHJlY3Qud2lkdGggPSAoRlhfRkxPQVQpcGVuWCAtIHJlY3QubGVmdDsNCisgIHJlY3QuaGVpZ2h0ID0gcmVjdC50b3AgKyBfaW5mby5fZm9udFNpemUgKiBfaW5mby5fZm9udEhTY2FsZSAtIHJlY3QudG9wOw0KKyAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0NBR0dfR3JhcGhpY3M6OkNBR0dfR3JhcGhpY3MoKSB7DQorICBfb3duZXIgPSBOVUxMOw0KK30NCitGWF9FUlIgQ0FHR19HcmFwaGljczo6Q3JlYXRlKENGWF9HcmFwaGljcyogb3duZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgZm9ybWF0KSB7DQorICBpZiAob3duZXItPl9yZW5kZXJEZXZpY2UpIHsNCisgICAgcmV0dXJuIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZDsNCisgIH0NCisgIGlmIChfb3duZXIpIHsNCisgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KKyAgfQ0KKyAgQ0ZYX0Z4Z2VEZXZpY2UqIGRldmljZSA9IG5ldyBDRlhfRnhnZURldmljZTsNCisgIGRldmljZS0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk7DQorICBfb3duZXIgPSBvd25lcjsNCisgIF9vd25lci0+X3JlbmRlckRldmljZSA9IGRldmljZTsNCisgIF9vd25lci0+X3JlbmRlckRldmljZS0+R2V0Qml0bWFwKCktPkNsZWFyKDB4RkZGRkZGRkYpOw0KKyAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0NBR0dfR3JhcGhpY3M6On5DQUdHX0dyYXBoaWNzKCkgew0KKyAgaWYgKF9vd25lci0+X3JlbmRlckRldmljZSkgew0KKyAgICBkZWxldGUgKENGWF9GeGdlRGV2aWNlKilfb3duZXItPl9yZW5kZXJEZXZpY2U7DQorICB9DQorICBfb3duZXIgPSBOVUxMOw0KK30NCitDRlhfUGF0aDo6Q0ZYX1BhdGgoKSB7DQorICBfZ2VuZXJhdG9yID0gTlVMTDsNCit9DQorRlhfRVJSIENGWF9QYXRoOjpDcmVhdGUoKSB7DQorICBpZiAoX2dlbmVyYXRvcikgew0KKyAgICByZXR1cm4gRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQ7DQorICB9DQorICBfZ2VuZXJhdG9yID0gbmV3IENGWF9QYXRoR2VuZXJhdG9yOw0KKyAgX2dlbmVyYXRvci0+Q3JlYXRlKCk7DQorICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCit9DQorQ0ZYX1BhdGg6On5DRlhfUGF0aCgpIHsNCisgIGlmIChfZ2VuZXJhdG9yKSB7DQorICAgIGRlbGV0ZSBfZ2VuZXJhdG9yOw0KKyAgICBfZ2VuZXJhdG9yID0gTlVMTDsNCisgIH0NCit9DQorRlhfRVJSIENGWF9QYXRoOjpNb3ZlVG8oRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9nZW5lcmF0b3IsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgIF9nZW5lcmF0b3ItPk1vdmVUbyh4LCB5KTsNCisgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9FUlIgQ0ZYX1BhdGg6OkxpbmVUbyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2dlbmVyYXRvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgX2dlbmVyYXRvci0+TGluZVRvKHgsIHkpOw0KKyAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0VSUiBDRlhfUGF0aDo6QmV6aWVyVG8oRlhfRkxPQVQgY3RybFgxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybFkxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybFgyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybFkyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9YLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9ZKSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2dlbmVyYXRvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgX2dlbmVyYXRvci0+QmV6aWVyVG8oY3RybFgxLCBjdHJsWTEsIGN0cmxYMiwgY3RybFkyLCB0b1gsIHRvWSk7DQorICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRVJSIENGWF9QYXRoOjpBcmNUbyhGWF9GTE9BVCBsZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9wLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzdGFydEFuZ2xlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3dlZXBBbmdsZSkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9nZW5lcmF0b3IsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgIF9nZW5lcmF0b3ItPkFyY1RvKGxlZnQgKyB3aWR0aCAvIDIsIHRvcCArIGhlaWdodCAvIDIsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwNCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0QW5nbGUsIHN3ZWVwQW5nbGUpOw0KKyAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0VSUiBDRlhfUGF0aDo6Q2xvc2UoKSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2dlbmVyYXRvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgX2dlbmVyYXRvci0+Q2xvc2UoKTsNCisgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9FUlIgQ0ZYX1BhdGg6OkFkZExpbmUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZ2VuZXJhdG9yLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICBfZ2VuZXJhdG9yLT5BZGRMaW5lKHgxLCB5MSwgeDIsIHkyKTsNCisgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9FUlIgQ0ZYX1BhdGg6OkFkZEJlemllcihGWF9GTE9BVCBzdGFydFgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRZLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGN0cmxYMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjdHJsWTEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybFgyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGN0cmxZMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBlbmRYLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGVuZFkpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZ2VuZXJhdG9yLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICBfZ2VuZXJhdG9yLT5BZGRCZXppZXIoc3RhcnRYLCBzdGFydFksIGN0cmxYMSwgY3RybFkxLCBjdHJsWDIsIGN0cmxZMiwgZW5kWCwNCisgICAgICAgICAgICAgICAgICAgICAgICBlbmRZKTsNCisgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9FUlIgQ0ZYX1BhdGg6OkFkZFJlY3RhbmdsZShGWF9GTE9BVCBsZWZ0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoZWlnaHQpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZ2VuZXJhdG9yLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICBfZ2VuZXJhdG9yLT5BZGRSZWN0YW5nbGUobGVmdCwgdG9wLCBsZWZ0ICsgd2lkdGgsIHRvcCArIGhlaWdodCk7DQorICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRVJSIENGWF9QYXRoOjpBZGRFbGxpcHNlKEZYX0ZMT0FUIGxlZnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRvcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGhlaWdodCkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9nZW5lcmF0b3IsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgIF9nZW5lcmF0b3ItPkFkZEVsbGlwc2UobGVmdCArIHdpZHRoIC8gMiwgdG9wICsgaGVpZ2h0IC8gMiwgd2lkdGggLyAyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgLyAyKTsNCisgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9FUlIgQ0ZYX1BhdGg6OkFkZEVsbGlwc2UoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2dlbmVyYXRvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgX2dlbmVyYXRvci0+QWRkRWxsaXBzZShyZWN0LmxlZnQgKyByZWN0LldpZHRoKCkgLyAyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LnRvcCArIHJlY3QuSGVpZ2h0KCkgLyAyLCByZWN0LldpZHRoKCkgLyAyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LkhlaWdodCgpIC8gMik7DQorICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRVJSIENGWF9QYXRoOjpBZGRBcmMoRlhfRkxPQVQgbGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB0b3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3dlZXBBbmdsZSkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9nZW5lcmF0b3IsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgIF9nZW5lcmF0b3ItPkFkZEFyYyhsZWZ0ICsgd2lkdGggLyAyLCB0b3AgKyBoZWlnaHQgLyAyLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIsDQorICAgICAgICAgICAgICAgICAgICAgc3RhcnRBbmdsZSwgc3dlZXBBbmdsZSk7DQorICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRVJSIENGWF9QYXRoOjpBZGRQaWUoRlhfRkxPQVQgbGVmdCwNCisgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB0b3AsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3dlZXBBbmdsZSkgew0KKyAgX0ZYX1JFVFVSTl9WQUxVRV9JRl9GQUlMKF9nZW5lcmF0b3IsIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkKTsNCisgIF9nZW5lcmF0b3ItPkFkZFBpZShsZWZ0ICsgd2lkdGggLyAyLCB0b3AgKyBoZWlnaHQgLyAyLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIsDQorICAgICAgICAgICAgICAgICAgICAgc3RhcnRBbmdsZSwgc3dlZXBBbmdsZSk7DQorICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRVJSIENGWF9QYXRoOjpBZGRTdWJwYXRoKENGWF9QYXRoKiBwYXRoKSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2dlbmVyYXRvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgX2dlbmVyYXRvci0+QWRkUGF0aERhdGEocGF0aC0+R2V0UGF0aERhdGEoKSk7DQorICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCit9DQorRlhfRVJSIENGWF9QYXRoOjpDbGVhcigpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZ2VuZXJhdG9yLCBGWF9FUlJfUHJvcGVydHlfSW52YWxpZCk7DQorICBfZ2VuZXJhdG9yLT5HZXRQYXRoRGF0YSgpLT5TZXRQb2ludENvdW50KDApOw0KKyAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0JPT0wgQ0ZYX1BhdGg6OklzRW1wdHkoKSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwoX2dlbmVyYXRvciwgRlhfRVJSX1Byb3BlcnR5X0ludmFsaWQpOw0KKyAgaWYgKF9nZW5lcmF0b3ItPkdldFBhdGhEYXRhKCktPkdldFBvaW50Q291bnQoKSA9PSAwKSB7DQorICAgIHJldHVybiBUUlVFOw0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitDRlhfUGF0aERhdGEqIENGWF9QYXRoOjpHZXRQYXRoRGF0YSgpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChfZ2VuZXJhdG9yLCBOVUxMKTsNCisgIHJldHVybiBfZ2VuZXJhdG9yLT5HZXRQYXRoRGF0YSgpOw0KK30NCitDRlhfQ29sb3I6OkNGWF9Db2xvcigpIHsNCisgIF90eXBlID0gRlhfQ09MT1JfTm9uZTsNCit9DQorQ0ZYX0NvbG9yOjpDRlhfQ29sb3IoY29uc3QgRlhfQVJHQiBhcmdiKSB7DQorICBfdHlwZSA9IEZYX0NPTE9SX05vbmU7DQorICBTZXQoYXJnYik7DQorfQ0KK0NGWF9Db2xvcjo6Q0ZYX0NvbG9yKENGWF9QYXR0ZXJuKiBwYXR0ZXJuLCBjb25zdCBGWF9BUkdCIGFyZ2IpIHsNCisgIF90eXBlID0gRlhfQ09MT1JfTm9uZTsNCisgIFNldChwYXR0ZXJuLCBhcmdiKTsNCit9DQorQ0ZYX0NvbG9yOjpDRlhfQ29sb3IoQ0ZYX1NoYWRpbmcqIHNoYWRpbmcpIHsNCisgIF90eXBlID0gRlhfQ09MT1JfTm9uZTsNCisgIFNldChzaGFkaW5nKTsNCit9DQorQ0ZYX0NvbG9yOjp+Q0ZYX0NvbG9yKCkgew0KKyAgX3R5cGUgPSBGWF9DT0xPUl9Ob25lOw0KK30NCitGWF9FUlIgQ0ZYX0NvbG9yOjpTZXQoY29uc3QgRlhfQVJHQiBhcmdiKSB7DQorICBfdHlwZSA9IEZYX0NPTE9SX1NvbGlkOw0KKyAgX2FyZ2IgPSBhcmdiOw0KKyAgX3BhdHRlcm4gPSBOVUxMOw0KKyAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0ZYX0VSUiBDRlhfQ29sb3I6OlNldChDRlhfUGF0dGVybiogcGF0dGVybiwgY29uc3QgRlhfQVJHQiBhcmdiKSB7DQorICBfRlhfUkVUVVJOX1ZBTFVFX0lGX0ZBSUwocGF0dGVybiwgRlhfRVJSX1BhcmFtZXRlcl9JbnZhbGlkKTsNCisgIF90eXBlID0gRlhfQ09MT1JfUGF0dGVybjsNCisgIF9hcmdiID0gYXJnYjsNCisgIF9wYXR0ZXJuID0gcGF0dGVybjsNCisgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9FUlIgQ0ZYX0NvbG9yOjpTZXQoQ0ZYX1NoYWRpbmcqIHNoYWRpbmcpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChzaGFkaW5nLCBGWF9FUlJfUGFyYW1ldGVyX0ludmFsaWQpOw0KKyAgX3R5cGUgPSBGWF9DT0xPUl9TaGFkaW5nOw0KKyAgX3NoYWRpbmcgPSBzaGFkaW5nOw0KKyAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK0NGWF9QYXR0ZXJuOjpDRlhfUGF0dGVybigpIHsNCisgIF90eXBlID0gRlhfUEFUVEVSTl9Ob25lOw0KKyAgX21hdHJpeC5TZXRJZGVudGl0eSgpOw0KK30NCitGWF9FUlIgQ0ZYX1BhdHRlcm46OkNyZWF0ZShDRlhfRElCaXRtYXAqIGJpdG1hcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9GTE9BVCB4U3RlcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9GTE9BVCB5U3RlcCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBtYXRyaXgpIHsNCisgIF9GWF9SRVRVUk5fVkFMVUVfSUZfRkFJTChiaXRtYXAsIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZCk7DQorICBpZiAoX3R5cGUgIT0gRlhfUEFUVEVSTl9Ob25lKSB7DQorICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCisgIH0NCisgIF90eXBlID0gRlhfUEFUVEVSTl9CaXRtYXA7DQorICBfYml0bWFwID0gYml0bWFwOw0KKyAgX3gxU3RlcCA9IHhTdGVwOw0KKyAgX3kxU3RlcCA9IHlTdGVwOw0KKyAgaWYgKG1hdHJpeCkgew0KKyAgICBfbWF0cml4LlNldChtYXRyaXgtPmEsIG1hdHJpeC0+YiwgbWF0cml4LT5jLCBtYXRyaXgtPmQsIG1hdHJpeC0+ZSwNCisgICAgICAgICAgICAgICAgbWF0cml4LT5mKTsNCisgIH0NCisgIHJldHVybiBGWF9FUlJfU3VjY2VlZGVkOw0KK30NCitGWF9FUlIgQ0ZYX1BhdHRlcm46OkNyZWF0ZShGWF9IYXRjaFN0eWxlIGhhdGNoU3R5bGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQiBmb3JlQXJnYiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9BUkdCIGJhY2tBcmdiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCkgew0KKyAgaWYgKGhhdGNoU3R5bGUgPCBGWF9IQVRDSFNUWUxFX0hvcml6b250YWwgfHwNCisgICAgICBoYXRjaFN0eWxlID4gRlhfSEFUQ0hTVFlMRV9Tb2xpZERpYW1vbmQpIHsNCisgICAgcmV0dXJuIEZYX0VSUl9QYXJhbWV0ZXJfSW52YWxpZDsNCisgIH0NCisgIGlmIChfdHlwZSAhPSBGWF9QQVRURVJOX05vbmUpIHsNCisgICAgcmV0dXJuIEZYX0VSUl9Qcm9wZXJ0eV9JbnZhbGlkOw0KKyAgfQ0KKyAgX3R5cGUgPSBGWF9QQVRURVJOX0hhdGNoOw0KKyAgX2hhdGNoU3R5bGUgPSBoYXRjaFN0eWxlOw0KKyAgX2ZvcmVBcmdiID0gZm9yZUFyZ2I7DQorICBfYmFja0FyZ2IgPSBiYWNrQXJnYjsNCisgIGlmIChtYXRyaXgpIHsNCisgICAgX21hdHJpeC5TZXQobWF0cml4LT5hLCBtYXRyaXgtPmIsIG1hdHJpeC0+YywgbWF0cml4LT5kLCBtYXRyaXgtPmUsDQorICAgICAgICAgICAgICAgIG1hdHJpeC0+Zik7DQorICB9DQorICByZXR1cm4gRlhfRVJSX1N1Y2NlZWRlZDsNCit9DQorQ0ZYX1BhdHRlcm46On5DRlhfUGF0dGVybigpIHsNCisgIF90eXBlID0gRlhfUEFUVEVSTl9Ob25lOw0KK30NCitDRlhfU2hhZGluZzo6Q0ZYX1NoYWRpbmcoKSB7DQorICBfdHlwZSA9IEZYX1NIQURJTkdfTm9uZTsNCit9DQorRlhfRVJSIENGWF9TaGFkaW5nOjpDcmVhdGVBeGlhbChjb25zdCBDRlhfUG9pbnRGJiBiZWdpblBvaW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgZW5kUG9pbnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzRXh0ZW5kZWRCZWdpbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgaXNFeHRlbmRlZEVuZCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0IgYmVnaW5BcmdiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQiBlbmRBcmdiKSB7DQorICBpZiAoX3R5cGUgIT0gRlhfU0hBRElOR19Ob25lKSB7DQorICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCisgIH0NCisgIF90eXBlID0gRlhfU0hBRElOR19BeGlhbDsNCisgIF9iZWdpblBvaW50ID0gYmVnaW5Qb2ludDsNCisgIF9lbmRQb2ludCA9IGVuZFBvaW50Ow0KKyAgX2lzRXh0ZW5kZWRCZWdpbiA9IGlzRXh0ZW5kZWRCZWdpbjsNCisgIF9pc0V4dGVuZGVkRW5kID0gaXNFeHRlbmRlZEVuZDsNCisgIF9iZWdpbkFyZ2IgPSBiZWdpbkFyZ2I7DQorICBfZW5kQXJnYiA9IGVuZEFyZ2I7DQorICByZXR1cm4gSW5pdEFyZ2JBcnJheSgpOw0KK30NCitGWF9FUlIgQ0ZYX1NoYWRpbmc6OkNyZWF0ZVJhZGlhbChjb25zdCBDRlhfUG9pbnRGJiBiZWdpblBvaW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIGVuZFBvaW50LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0ZMT0FUIGJlZ2luUmFkaXVzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0ZMT0FUIGVuZFJhZGl1cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzRXh0ZW5kZWRCZWdpbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGlzRXh0ZW5kZWRFbmQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQiBiZWdpbkFyZ2IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQiBlbmRBcmdiKSB7DQorICBpZiAoX3R5cGUgIT0gRlhfU0hBRElOR19Ob25lKSB7DQorICAgIHJldHVybiBGWF9FUlJfUHJvcGVydHlfSW52YWxpZDsNCisgIH0NCisgIF90eXBlID0gRlhfU0hBRElOR19SYWRpYWw7DQorICBfYmVnaW5Qb2ludCA9IGJlZ2luUG9pbnQ7DQorICBfZW5kUG9pbnQgPSBlbmRQb2ludDsNCisgIF9iZWdpblJhZGl1cyA9IGJlZ2luUmFkaXVzOw0KKyAgX2VuZFJhZGl1cyA9IGVuZFJhZGl1czsNCisgIF9pc0V4dGVuZGVkQmVnaW4gPSBpc0V4dGVuZGVkQmVnaW47DQorICBfaXNFeHRlbmRlZEVuZCA9IGlzRXh0ZW5kZWRFbmQ7DQorICBfYmVnaW5BcmdiID0gYmVnaW5BcmdiOw0KKyAgX2VuZEFyZ2IgPSBlbmRBcmdiOw0KKyAgcmV0dXJuIEluaXRBcmdiQXJyYXkoKTsNCit9DQorQ0ZYX1NoYWRpbmc6On5DRlhfU2hhZGluZygpIHsNCisgIF90eXBlID0gRlhfU0hBRElOR19Ob25lOw0KK30NCitGWF9FUlIgQ0ZYX1NoYWRpbmc6OkluaXRBcmdiQXJyYXkoKSB7DQorICBpbnQzMl90IGExLCByMSwgZzEsIGIxOw0KKyAgQXJnYkRlY29kZShfYmVnaW5BcmdiLCBhMSwgcjEsIGcxLCBiMSk7DQorICBpbnQzMl90IGEyLCByMiwgZzIsIGIyOw0KKyAgQXJnYkRlY29kZShfZW5kQXJnYiwgYTIsIHIyLCBnMiwgYjIpOw0KKyAgRlhfRkxPQVQgZiA9IChGWF9GTE9BVCkoRlhfU0hBRElOR19TdGVwcyAtIDEpOw0KKyAgRlhfRkxPQVQgYVNjYWxlID0gKEZYX0ZMT0FUKSgxLjAgKiAoYTIgLSBhMSkgLyBmKTsNCisgIEZYX0ZMT0FUIHJTY2FsZSA9IChGWF9GTE9BVCkoMS4wICogKHIyIC0gcjEpIC8gZik7DQorICBGWF9GTE9BVCBnU2NhbGUgPSAoRlhfRkxPQVQpKDEuMCAqIChnMiAtIGcxKSAvIGYpOw0KKyAgRlhfRkxPQVQgYlNjYWxlID0gKEZYX0ZMT0FUKSgxLjAgKiAoYjIgLSBiMSkgLyBmKTsNCisgIGludDMyX3QgYTMsIHIzLCBnMywgYjM7DQorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBGWF9TSEFESU5HX1N0ZXBzOyBpKyspIHsNCisgICAgYTMgPSAoaW50MzJfdCkoaSAqIGFTY2FsZSk7DQorICAgIHIzID0gKGludDMyX3QpKGkgKiByU2NhbGUpOw0KKyAgICBnMyA9IChpbnQzMl90KShpICogZ1NjYWxlKTsNCisgICAgYjMgPSAoaW50MzJfdCkoaSAqIGJTY2FsZSk7DQorICAgIF9hcmdiQXJyYXlbaV0gPQ0KKyAgICAgICAgRlhBUkdCX1RPRElCKEZYQVJHQl9NQUtFKChhMSArIGEzKSwgKHIxICsgcjMpLCAoZzEgKyBnMyksIChiMSArIGIzKSkpOw0KKyAgfQ0KKyAgcmV0dXJuIEZYX0VSUl9TdWNjZWVkZWQ7DQorfQ0KK2NsYXNzIENGWF9QYXVzZSA6IHB1YmxpYyBJRlhfUGF1c2Ugew0KKyBwdWJsaWM6DQorICB2aXJ0dWFsIEZYX0JPT0wgTmVlZFRvUGF1c2VOb3coKSB7IHJldHVybiBUUlVFOyB9DQorfTsNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4Z3JhcGhpY3Mvc3JjL2Z4X3BhdGhfZ2VuZXJhdG9yLmNwcCBiL3hmYS9zcmMvZnhncmFwaGljcy9zcmMvZnhfcGF0aF9nZW5lcmF0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNmE5ZGYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4Z3JhcGhpY3Mvc3JjL2Z4X3BhdGhfZ2VuZXJhdG9yLmNwcApAQCAtMCwwICsxLDIzOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAicHJlLmgiDQorI2luY2x1ZGUgImZ4X3BhdGhfZ2VuZXJhdG9yLmgiDQorQ0ZYX1BhdGhHZW5lcmF0b3I6OkNGWF9QYXRoR2VuZXJhdG9yKCkgew0KKyAgbV9wUGF0aERhdGEgPSBOVUxMOw0KK30NCit2b2lkIENGWF9QYXRoR2VuZXJhdG9yOjpDcmVhdGUoKSB7DQorICBtX3BQYXRoRGF0YSA9IG5ldyBDRlhfUGF0aERhdGE7DQorfQ0KK0NGWF9QYXRoR2VuZXJhdG9yOjp+Q0ZYX1BhdGhHZW5lcmF0b3IoKSB7DQorICBpZiAobV9wUGF0aERhdGEpIHsNCisgICAgZGVsZXRlIG1fcFBhdGhEYXRhOw0KKyAgICBtX3BQYXRoRGF0YSA9IE5VTEw7DQorICB9DQorfQ0KK3ZvaWQgQ0ZYX1BhdGhHZW5lcmF0b3I6OkFkZFBhdGhEYXRhKENGWF9QYXRoRGF0YSogcFBhdGhEYXRhKSB7DQorICBpZiAocFBhdGhEYXRhICYmIHBQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID4gMCkgew0KKyAgICBpbnQgbkNvdW50ID0gcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCk7DQorICAgIEZYX1BBVEhQT0lOVCogcFBvaW50cyA9IHBQYXRoRGF0YS0+R2V0UG9pbnRzKCk7DQorICAgIEFkZFBhdGhEYXRhKHBQb2ludHMsIG5Db3VudCk7DQorICB9DQorfQ0KK3ZvaWQgQ0ZYX1BhdGhHZW5lcmF0b3I6OkFkZFBhdGhEYXRhKEZYX1BBVEhQT0lOVCogcFBvaW50cywgaW50IG5Db3VudCkgew0KKyAgaWYgKHBQb2ludHMgJiYgbkNvdW50ID4gMCkgew0KKyAgICBpbnQgbk9sZENvdW50ID0gbV9wUGF0aERhdGEtPkdldFBvaW50Q291bnQoKTsNCisgICAgbV9wUGF0aERhdGEtPkFkZFBvaW50Q291bnQobkNvdW50KTsNCisgICAgRlhfUEFUSFBPSU5UKiBwRHN0UG9pbnRzID0gbV9wUGF0aERhdGEtPkdldFBvaW50cygpOw0KKyAgICBGWFNZU19tZW1jcHkocERzdFBvaW50cyArIG5PbGRDb3VudCwgcFBvaW50cywNCisgICAgICAgICAgICAgICAgIHNpemVvZihGWF9QQVRIUE9JTlQpICogbkNvdW50KTsNCisgIH0NCit9DQordm9pZCBDRlhfUGF0aEdlbmVyYXRvcjo6TW92ZVRvKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpIHsNCisgIG1fcFBhdGhEYXRhLT5BZGRQb2ludENvdW50KDEpOw0KKyAgbV9wUGF0aERhdGEtPlNldFBvaW50KG1fcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCkgLSAxLCB4LCB5LCBGWFBUX01PVkVUTyk7DQorfQ0KK3ZvaWQgQ0ZYX1BhdGhHZW5lcmF0b3I6OkxpbmVUbyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KSB7DQorICBtX3BQYXRoRGF0YS0+QWRkUG9pbnRDb3VudCgxKTsNCisgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChtX3BQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpIC0gMSwgeCwgeSwgRlhQVF9MSU5FVE8pOw0KK30NCit2b2lkIENGWF9QYXRoR2VuZXJhdG9yOjpCZXppZXJUbyhGWF9GTE9BVCBjdHJsX3gxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGN0cmxfeTEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybF94MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjdHJsX3kyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHRvX3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9feSkgew0KKyAgaW50IG9sZF9jb3VudCA9IG1fcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCk7DQorICBtX3BQYXRoRGF0YS0+QWRkUG9pbnRDb3VudCgzKTsNCisgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChvbGRfY291bnQsIGN0cmxfeDEsIGN0cmxfeTEsIEZYUFRfQkVaSUVSVE8pOw0KKyAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCArIDEsIGN0cmxfeDIsIGN0cmxfeTIsIEZYUFRfQkVaSUVSVE8pOw0KKyAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCArIDIsIHRvX3gsIHRvX3ksIEZYUFRfQkVaSUVSVE8pOw0KK30NCit2b2lkIENGWF9QYXRoR2VuZXJhdG9yOjpDbG9zZSgpIHsNCisgIGlmIChtX3BQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpID4gMCkgew0KKyAgICBpbnQgaW5kZXggPSBtX3BQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpIC0gMTsNCisgICAgRlhfUEFUSFBPSU5UKiBwUG9pbnRzID0gbV9wUGF0aERhdGEtPkdldFBvaW50cygpOw0KKyAgICBwUG9pbnRzW2luZGV4XS5tX0ZsYWcgfD0gRlhQVF9DTE9TRUZJR1VSRTsNCisgIH0NCit9DQordm9pZCBDRlhfUGF0aEdlbmVyYXRvcjo6QWRkTGluZShGWF9GTE9BVCB4MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5Mikgew0KKyAgaW50IG9sZF9jb3VudCA9IG1fcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCk7DQorICBtX3BQYXRoRGF0YS0+QWRkUG9pbnRDb3VudCgyKTsNCisgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChvbGRfY291bnQsIHgxLCB5MSwgRlhQVF9NT1ZFVE8pOw0KKyAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCArIDEsIHgyLCB5MiwgRlhQVF9MSU5FVE8pOw0KK30NCit2b2lkIENGWF9QYXRoR2VuZXJhdG9yOjpBZGRCZXppZXIoRlhfRkxPQVQgc3RhcnRfeCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRfeSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybF94MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybF95MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybF94MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybF95MiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZW5kX3gsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGVuZF95KSB7DQorICBpbnQgb2xkX2NvdW50ID0gbV9wUGF0aERhdGEtPkdldFBvaW50Q291bnQoKTsNCisgIG1fcFBhdGhEYXRhLT5BZGRQb2ludENvdW50KDQpOw0KKyAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCwgc3RhcnRfeCwgc3RhcnRfeSwgRlhQVF9NT1ZFVE8pOw0KKyAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCArIDEsIGN0cmxfeDEsIGN0cmxfeTEsIEZYUFRfQkVaSUVSVE8pOw0KKyAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCArIDIsIGN0cmxfeDIsIGN0cmxfeTIsIEZYUFRfQkVaSUVSVE8pOw0KKyAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCArIDMsIGVuZF94LCBlbmRfeSwgRlhQVF9CRVpJRVJUTyk7DQorfQ0KK3ZvaWQgQ0ZYX1BhdGhHZW5lcmF0b3I6OkFkZFJlY3RhbmdsZShGWF9GTE9BVCB4MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5Mikgew0KKyAgbV9wUGF0aERhdGEtPkFwcGVuZFJlY3QoeDEsIHkxLCB4MiwgeTIpOw0KK30NCit2b2lkIENGWF9QYXRoR2VuZXJhdG9yOjpBZGRFbGxpcHNlKEZYX0ZMT0FUIHgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoZWlnaHQpIHsNCisjaWYgMA0KKyAgICBGWF9GSVhGTE9BVDE2IGs7DQorICAgIGsgPSBmaXgxNl90b184KGZpeHNxcnRfMzJfdG9fMTYoZml4bXVsXzhfOF90b18zMih3aWR0aCwgd2lkdGgpICsgZml4bXVsXzhfOF90b18zMihoZWlnaHQsIGhlaWdodCkpIC8gMik7DQorICAgIGludCBvbGRfY291bnQgPSBtX3BQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpOw0KKyAgICBtX3BQYXRoRGF0YS0+QWRkUG9pbnRDb3VudCg3KTsNCisgICAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCwgeCwgeSAtIGhlaWdodCAvIDIsIEZYUFRfTU9WRVRPKTsNCisgICAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCArIDEsIHggKyBrLCB5IC0gaGVpZ2h0IC8gMiwgRlhQVF9CRVpJRVJUTyk7DQorICAgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChvbGRfY291bnQgKyAyLCB4ICsgaywgeSArIGhlaWdodCAvIDIsIEZYUFRfQkVaSUVSVE8pOw0KKyAgICBtX3BQYXRoRGF0YS0+U2V0UG9pbnQob2xkX2NvdW50ICsgMywgeCwgeSArIGhlaWdodCAvIDIsIEZYUFRfQkVaSUVSVE8pOw0KKyAgICBtX3BQYXRoRGF0YS0+U2V0UG9pbnQob2xkX2NvdW50ICsgNCwgeCAtIGssIHkgKyBoZWlnaHQgLyAyLCBGWFBUX0JFWklFUlRPKTsNCisgICAgbV9wUGF0aERhdGEtPlNldFBvaW50KG9sZF9jb3VudCArIDUsIHggLSBrLCB5IC0gaGVpZ2h0IC8gMiwgRlhQVF9CRVpJRVJUTyk7DQorICAgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChvbGRfY291bnQgKyA2LCB4LCB5IC0gaGVpZ2h0IC8gMiwgRlhQVF9CRVpJRVJUTyk7DQorI2Vsc2UNCisgIEFkZEFyYyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCAwLCBGWF9QSSAqIDIpOw0KKyNlbmRpZg0KK30NCit2b2lkIENGWF9QYXRoR2VuZXJhdG9yOjpBcmNUbyhGWF9GTE9BVCB4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0X2FuZ2xlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN3ZWVwX2FuZ2xlKSB7DQorICBGWF9GTE9BVCB4MCA9IEZYU1lTX2Nvcyhzd2VlcF9hbmdsZSAvIDIpOw0KKyAgRlhfRkxPQVQgeTAgPSBGWFNZU19zaW4oc3dlZXBfYW5nbGUgLyAyKTsNCisgIEZYX0ZMT0FUIHR4ID0gRlhTWVNfRGl2KCgxLjBmIC0geDApICogNCwgMyAqIDEuMGYpOw0KKyAgRlhfRkxPQVQgdHkgPSB5MCAtIEZYU1lTX0RpdihGWFNZU19NdWwodHgsIHgwKSwgeTApOw0KKyAgRlhfRkxPQVQgcHhbM10sIHB5WzNdOw0KKyAgcHhbMF0gPSB4MCArIHR4Ow0KKyAgcHlbMF0gPSAtdHk7DQorICBweFsxXSA9IHgwICsgdHg7DQorICBweVsxXSA9IHR5Ow0KKyAgRlhfRkxPQVQgc24gPSBGWFNZU19zaW4oc3RhcnRfYW5nbGUgKyBzd2VlcF9hbmdsZSAvIDIpOw0KKyAgRlhfRkxPQVQgY3MgPSBGWFNZU19jb3Moc3RhcnRfYW5nbGUgKyBzd2VlcF9hbmdsZSAvIDIpOw0KKyAgaW50IG9sZF9jb3VudCA9IG1fcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCk7DQorICBtX3BQYXRoRGF0YS0+QWRkUG9pbnRDb3VudCgzKTsNCisgIEZYX0ZMT0FUIGJlemllcl94LCBiZXppZXJfeTsNCisgIGJlemllcl94ID0geCArIEZYU1lTX011bCh3aWR0aCwgRlhTWVNfTXVsKHB4WzBdLCBjcykgLSBGWFNZU19NdWwocHlbMF0sIHNuKSk7DQorICBiZXppZXJfeSA9IHkgKyBGWFNZU19NdWwoaGVpZ2h0LCBGWFNZU19NdWwocHhbMF0sIHNuKSArIEZYU1lTX011bChweVswXSwgY3MpKTsNCisgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChvbGRfY291bnQsIGJlemllcl94LCBiZXppZXJfeSwgRlhQVF9CRVpJRVJUTyk7DQorICBiZXppZXJfeCA9IHggKyBGWFNZU19NdWwod2lkdGgsIEZYU1lTX011bChweFsxXSwgY3MpIC0gRlhTWVNfTXVsKHB5WzFdLCBzbikpOw0KKyAgYmV6aWVyX3kgPSB5ICsgRlhTWVNfTXVsKGhlaWdodCwgRlhTWVNfTXVsKHB4WzFdLCBzbikgKyBGWFNZU19NdWwocHlbMV0sIGNzKSk7DQorICBtX3BQYXRoRGF0YS0+U2V0UG9pbnQob2xkX2NvdW50ICsgMSwgYmV6aWVyX3gsIGJlemllcl95LCBGWFBUX0JFWklFUlRPKTsNCisgIGJlemllcl94ID0geCArIEZYU1lTX011bCh3aWR0aCwgRlhTWVNfY29zKHN0YXJ0X2FuZ2xlICsgc3dlZXBfYW5nbGUpKSwNCisgIGJlemllcl95ID0geSArIEZYU1lTX011bChoZWlnaHQsIEZYU1lTX3NpbihzdGFydF9hbmdsZSArIHN3ZWVwX2FuZ2xlKSk7DQorICBtX3BQYXRoRGF0YS0+U2V0UG9pbnQob2xkX2NvdW50ICsgMiwgYmV6aWVyX3gsIGJlemllcl95LCBGWFBUX0JFWklFUlRPKTsNCit9DQordm9pZCBDRlhfUGF0aEdlbmVyYXRvcjo6QWRkQXJjKEZYX0ZMT0FUIHgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0X2FuZ2xlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzd2VlcF9hbmdsZSkgew0KKyNpZiAwDQorICAgIEZYX0ZJWEZMT0FUMzIgc3dlZXAgPSBzd2VlcF9hbmdsZTsNCisgICAgd2hpbGUgKHN3ZWVwID4gRklYRkxPQVQzMl9QSSAqIDIpIHsNCisgICAgICAgIHN3ZWVwIC09IEZJWEZMT0FUMzJfUEkgKiAyOw0KKyAgICB9DQorICAgIGlmIChzd2VlcCA9PSAwKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisgICAgbV9wUGF0aERhdGEtPkFkZFBvaW50Q291bnQoMSk7DQorICAgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChtX3BQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpIC0gMSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHggKyBmaXhtdWxfOF8zMl90b184KHdpZHRoLCBmaXhjb3Moc3RhcnRfYW5nbGUpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHkgKyBmaXhtdWxfOF8zMl90b184KGhlaWdodCwgZml4c2luKHN0YXJ0X2FuZ2xlKSksIEZYUFRfTU9WRVRPKTsNCisgICAgRlhfRklYRkxPQVQzMiBhbmdsZTEgPSAwLCBhbmdsZTI7DQorICAgIEZYX0JPT0wgYkRvbmUgPSBGQUxTRTsNCisgICAgZG8gew0KKyAgICAgICAgYW5nbGUyID0gYW5nbGUxICsgRklYRkxPQVQzMl9QSSAvIDI7DQorICAgICAgICBpZiAoYW5nbGUyID49IHN3ZWVwKSB7DQorICAgICAgICAgICAgYW5nbGUyID0gc3dlZXA7DQorICAgICAgICAgICAgYkRvbmUgPSBUUlVFOw0KKyAgICAgICAgfQ0KKyAgICAgICAgQXJjVG8oeCwgeSwgd2lkdGgsIGhlaWdodCwgc3RhcnRfYW5nbGUgKyBhbmdsZTEsIGFuZ2xlMiAtIGFuZ2xlMSk7DQorICAgICAgICBhbmdsZTEgPSBhbmdsZTI7DQorICAgIH0gd2hpbGUgKCFiRG9uZSk7DQorI2Vsc2UNCisgIGlmIChzd2VlcF9hbmdsZSA9PSAwKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIHN0YXRpYyBjb25zdCBGWF9GTE9BVCBiZXppZXJfYXJjX2FuZ2xlX2Vwc2lsb24gPSAoRlhfRkxPQVQpKDAuMDFmKTsNCisgIHdoaWxlIChzdGFydF9hbmdsZSA+IEZYX1BJICogMikgew0KKyAgICBzdGFydF9hbmdsZSAtPSBGWF9QSSAqIDI7DQorICB9DQorICB3aGlsZSAoc3RhcnRfYW5nbGUgPCAwKSB7DQorICAgIHN0YXJ0X2FuZ2xlICs9IEZYX1BJICogMjsNCisgIH0NCisgIGlmIChzd2VlcF9hbmdsZSA+PSBGWF9QSSAqIDIpIHsNCisgICAgc3dlZXBfYW5nbGUgPSBGWF9QSSAqIDI7DQorICB9DQorICBpZiAoc3dlZXBfYW5nbGUgPD0gLUZYX1BJICogMikgew0KKyAgICBzd2VlcF9hbmdsZSA9IC1GWF9QSSAqIDI7DQorICB9DQorICBtX3BQYXRoRGF0YS0+QWRkUG9pbnRDb3VudCgxKTsNCisgIG1fcFBhdGhEYXRhLT5TZXRQb2ludChtX3BQYXRoRGF0YS0+R2V0UG9pbnRDb3VudCgpIC0gMSwNCisgICAgICAgICAgICAgICAgICAgICAgICB4ICsgRlhTWVNfTXVsKHdpZHRoLCBGWFNZU19jb3Moc3RhcnRfYW5nbGUpKSwNCisgICAgICAgICAgICAgICAgICAgICAgICB5ICsgRlhTWVNfTXVsKGhlaWdodCwgRlhTWVNfc2luKHN0YXJ0X2FuZ2xlKSksDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhQVF9NT1ZFVE8pOw0KKyAgRlhfRkxPQVQgdG90YWxfc3dlZXAgPSAwLCBsb2NhbF9zd2VlcCA9IDAsIHByZXZfc3dlZXAgPSAwOw0KKyAgRlhfQk9PTCBkb25lID0gRkFMU0U7DQorICBkbyB7DQorICAgIGlmIChzd2VlcF9hbmdsZSA8IDApIHsNCisgICAgICBwcmV2X3N3ZWVwID0gdG90YWxfc3dlZXA7DQorICAgICAgbG9jYWxfc3dlZXAgPSAtRlhfUEkgLyAyOw0KKyAgICAgIHRvdGFsX3N3ZWVwIC09IEZYX1BJIC8gMjsNCisgICAgICBpZiAodG90YWxfc3dlZXAgPD0gc3dlZXBfYW5nbGUgKyBiZXppZXJfYXJjX2FuZ2xlX2Vwc2lsb24pIHsNCisgICAgICAgIGxvY2FsX3N3ZWVwID0gc3dlZXBfYW5nbGUgLSBwcmV2X3N3ZWVwOw0KKyAgICAgICAgZG9uZSA9IFRSVUU7DQorICAgICAgfQ0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHByZXZfc3dlZXAgPSB0b3RhbF9zd2VlcDsNCisgICAgICBsb2NhbF9zd2VlcCA9IEZYX1BJIC8gMjsNCisgICAgICB0b3RhbF9zd2VlcCArPSBGWF9QSSAvIDI7DQorICAgICAgaWYgKHRvdGFsX3N3ZWVwID49IHN3ZWVwX2FuZ2xlIC0gYmV6aWVyX2FyY19hbmdsZV9lcHNpbG9uKSB7DQorICAgICAgICBsb2NhbF9zd2VlcCA9IHN3ZWVwX2FuZ2xlIC0gcHJldl9zd2VlcDsNCisgICAgICAgIGRvbmUgPSBUUlVFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBBcmNUbyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBzdGFydF9hbmdsZSwgbG9jYWxfc3dlZXApOw0KKyAgICBzdGFydF9hbmdsZSArPSBsb2NhbF9zd2VlcDsNCisgIH0gd2hpbGUgKCFkb25lKTsNCisjZW5kaWYNCit9DQordm9pZCBDRlhfUGF0aEdlbmVyYXRvcjo6QWRkUGllKEZYX0ZMT0FUIHgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHdpZHRoLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoZWlnaHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0X2FuZ2xlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzd2VlcF9hbmdsZSkgew0KKyAgaWYgKHN3ZWVwX2FuZ2xlID09IDApIHsNCisgICAgaW50IG9sZF9jb3VudCA9IG1fcFBhdGhEYXRhLT5HZXRQb2ludENvdW50KCk7DQorICAgIG1fcFBhdGhEYXRhLT5BZGRQb2ludENvdW50KDIpOw0KKyAgICBtX3BQYXRoRGF0YS0+U2V0UG9pbnQob2xkX2NvdW50LCB4LCB5LCBGWFBUX01PVkVUTyk7DQorICAgIG1fcFBhdGhEYXRhLT5TZXRQb2ludCgNCisgICAgICAgIG9sZF9jb3VudCArIDEsIHggKyBGWFNZU19NdWwod2lkdGgsIEZYU1lTX2NvcyhzdGFydF9hbmdsZSkpLA0KKyAgICAgICAgeSArIEZYU1lTX011bChoZWlnaHQsIEZYU1lTX3NpbihzdGFydF9hbmdsZSkpLCBGWFBUX0xJTkVUTyk7DQorICAgIHJldHVybjsNCisgIH0NCisgIEFkZEFyYyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBzdGFydF9hbmdsZSwgc3dlZXBfYW5nbGUpOw0KKyAgbV9wUGF0aERhdGEtPkFkZFBvaW50Q291bnQoMSk7DQorICBtX3BQYXRoRGF0YS0+U2V0UG9pbnQobV9wUGF0aERhdGEtPkdldFBvaW50Q291bnQoKSAtIDEsIHgsIHksDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhQVF9MSU5FVE8gfCBGWFBUX0NMT1NFRklHVVJFKTsNCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGdyYXBoaWNzL3NyYy9meF9wYXRoX2dlbmVyYXRvci5oIGIveGZhL3NyYy9meGdyYXBoaWNzL3NyYy9meF9wYXRoX2dlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMWY1NjIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4Z3JhcGhpY3Mvc3JjL2Z4X3BhdGhfZ2VuZXJhdG9yLmgKQEAgLTAsMCArMSw2MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIF9fSF9GWF9QQVRIX0dFTkVSQVRPUl9fDQorI2RlZmluZSBfX0hfRlhfUEFUSF9HRU5FUkFUT1JfXw0KKw0KKyNpbmNsdWRlICJjb3JlL2luY2x1ZGUvZnhnZS9meF9nZS5oIg0KKw0KK2NsYXNzIENGWF9QYXRoR2VuZXJhdG9yIHsNCisgcHVibGljOg0KKyAgQ0ZYX1BhdGhHZW5lcmF0b3IoKTsNCisgIHZvaWQgQ3JlYXRlKCk7DQorICB+Q0ZYX1BhdGhHZW5lcmF0b3IoKTsNCisgIENGWF9QYXRoRGF0YSogR2V0UGF0aERhdGEoKSBjb25zdCB7IHJldHVybiBtX3BQYXRoRGF0YTsgfQ0KKyAgdm9pZCBBZGRQYXRoRGF0YShDRlhfUGF0aERhdGEqIHBhdGhfZGF0YSk7DQorICB2b2lkIEFkZFBhdGhEYXRhKEZYX1BBVEhQT0lOVCogcG9pbnRzLCBpbnQgY291bnQpOw0KKyAgdm9pZCBNb3ZlVG8oRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSk7DQorICB2b2lkIExpbmVUbyhGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KTsNCisgIHZvaWQgQmV6aWVyVG8oRlhfRkxPQVQgY3RybF94MSwNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybF95MSwNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybF94MiwNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybF95MiwNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9feCwNCisgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9feSk7DQorICB2b2lkIENsb3NlKCk7DQorICB2b2lkIEFyY1RvKEZYX0ZMT0FUIHgsDQorICAgICAgICAgICAgIEZYX0ZMT0FUIHksDQorICAgICAgICAgICAgIEZYX0ZMT0FUIHdpZHRoLA0KKyAgICAgICAgICAgICBGWF9GTE9BVCBoZWlnaHQsDQorICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0X2FuZ2xlLA0KKyAgICAgICAgICAgICBGWF9GTE9BVCBzd2VlcF9hbmdsZSk7DQorDQorICB2b2lkIEFkZExpbmUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIpOw0KKyAgdm9pZCBBZGRCZXppZXIoRlhfRkxPQVQgc3RhcnRfeCwNCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0X3ksDQorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjdHJsX3gxLA0KKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQgY3RybF95MSwNCisgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGN0cmxfeDIsDQorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjdHJsX3kyLA0KKyAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZW5kX3gsDQorICAgICAgICAgICAgICAgICBGWF9GTE9BVCBlbmRfeSk7DQorICB2b2lkIEFkZFJlY3RhbmdsZShGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5Mik7DQorICB2b2lkIEFkZEVsbGlwc2UoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgRlhfRkxPQVQgd2lkdGgsIEZYX0ZMT0FUIGhlaWdodCk7DQorICB2b2lkIEFkZEFyYyhGWF9GTE9BVCB4LA0KKyAgICAgICAgICAgICAgRlhfRkxPQVQgeSwNCisgICAgICAgICAgICAgIEZYX0ZMT0FUIHdpZHRoLA0KKyAgICAgICAgICAgICAgRlhfRkxPQVQgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRfYW5nbGUsDQorICAgICAgICAgICAgICBGWF9GTE9BVCBzd2VlcF9hbmdsZSk7DQorICB2b2lkIEFkZFBpZShGWF9GTE9BVCB4LA0KKyAgICAgICAgICAgICAgRlhfRkxPQVQgeSwNCisgICAgICAgICAgICAgIEZYX0ZMT0FUIHdpZHRoLA0KKyAgICAgICAgICAgICAgRlhfRkxPQVQgaGVpZ2h0LA0KKyAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRfYW5nbGUsDQorICAgICAgICAgICAgICBGWF9GTE9BVCBzd2VlcF9hbmdsZSk7DQorDQorIHByb3RlY3RlZDoNCisgIENGWF9QYXRoRGF0YSogbV9wUGF0aERhdGE7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4Z3JhcGhpY3Mvc3JjL3ByZS5oIGIveGZhL3NyYy9meGdyYXBoaWNzL3NyYy9wcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2IzMjU1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGdyYXBoaWNzL3NyYy9wcmUuaApAQCAtMCwwICsxLDU4NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpZm5kZWYgRlhTWVNfTXVsDQorI2RlZmluZSBGWFNZU19NdWwoYSwgYikgKChhKSAqIChiKSkNCisjZGVmaW5lIEZYU1lTX0RpdihhLCBiKSAoKGEpIC8gKGIpKQ0KKyNkZWZpbmUgRlhTWVNfTXVsRGl2KGEsIGIsIGMpICgoYSkgKiAoYikgLyAoYykpDQorI2RlZmluZSBGWFNZU19zcXJ0MihhLCBiKSAoRlhfRkxPQVQpIEZYU1lTX3NxcnQoKGEpICogKGEpICsgKGIpICogKGIpKQ0KKyNlbmRpZg0KK2VudW0gew0KKyAgRlhfQ09OVEVYVF9Ob25lID0gMCwNCisgIEZYX0NPTlRFWFRfRGV2aWNlLA0KK307DQorZW51bSB7IEZYX0NPTE9SX05vbmUgPSAwLCBGWF9DT0xPUl9Tb2xpZCwgRlhfQ09MT1JfUGF0dGVybiwgRlhfQ09MT1JfU2hhZGluZyB9Ow0KK2VudW0geyBGWF9QQVRURVJOX05vbmUgPSAwLCBGWF9QQVRURVJOX0JpdG1hcCwgRlhfUEFUVEVSTl9IYXRjaCB9Ow0KK2VudW0geyBGWF9TSEFESU5HX05vbmUgPSAwLCBGWF9TSEFESU5HX0F4aWFsLCBGWF9TSEFESU5HX1JhZGlhbCB9Ow0KKyNkZWZpbmUgRlhfSEFUQ0hTVFlMRV9Ub3RhbCA1Mw0KK3N0cnVjdCBGWF9IQVRDSERBVEEgew0KKyAgaW50MzJfdCB3aWR0aDsNCisgIGludDMyX3QgaGVpZ2h0Ow0KKyAgdWludDhfdCBtYXNrQml0c1s2NF07DQorfTsNCit0eXBlZGVmIEZYX0hBVENIREFUQSBjb25zdCogRlhfTFBDSEFUQ0hEQVRBOw0KK3N0YXRpYyBjb25zdCBGWF9IQVRDSERBVEEgaGF0Y2hCaXRtYXBEYXRhW0ZYX0hBVENIU1RZTEVfVG90YWxdID0gew0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDQwLCAweDQwLCAweDAwLCAweDAwLCAweDIwLCAweDIwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDQwLCAweDQwLCAweDAwLCAweDAwLCAweDIwLCAweDIwLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg0MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDgxLCAweDgxLCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwgMHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwgMHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsIDB4NDIsIDB4NDIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDExLCAweDExLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NTEsIDB4NTEsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHgxNSwgMHgxNSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDUxLCAweDUxLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxNSwgMHgxNSwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YWEsIDB4YWEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweGVlLCAweGVlLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGJiLCAweGJiLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4ZWUsIDB4ZWUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhiYiwgMHhiYiwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHhlZSwgMHhlZSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGJiLCAweGJiLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZWUsIDB4ZWUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4YmIsIDB4YmIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZGQsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4ZGQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhkZCwgMHhkZCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGRkLCAweGRkLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4ZGQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweGVmLCAweGVmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZlLCAweGZlLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZWYsIDB4ZWYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZSwgMHhmZSwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhlZiwgMHhlZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZlLCAweGZlLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZWYsIDB4ZWYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZjcsIDB4ZjcsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg3ZiwgMHg3ZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGY3LCAweGY3LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg3ZiwgMHg3ZiwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDExLCAweDExLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDExLCAweDExLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgxMSwgMHgxMSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDMzLCAweDMzLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgzMywgMHgzMywgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDMzLCAweDMzLCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MzMsIDB4MzMsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDMzLCAweDMzLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4MzMsIDB4MzMsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHgzMywgMHgzMywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MzMsIDB4MzMsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweGMxLCAweGMxLCAweDAwLCAweDAwLCAweGUwLCAweGUwLCAweDAwLCAweDAwLCAweDcwLCAweDcwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4MWMsIDB4MWMsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MGUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwNywgMHgwNywgMHgwMCwgMHgwMCwgMHg4MywgMHg4MywgMHgwMCwgMHgwMCwgMHhjMSwgMHhjMSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGUwLCAweGUwLCAweDAwLCAweDAwLCAweDcwLCAweDcwLCAweDAwLCAweDAwLCAweDM4LCAweDM4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MWMsIDB4MWMsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDcsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MywgMHg4MywgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDgzLCAweDgzLCAweDAwLCAweDAwLCAweDA3LCAweDA3LCAweDAwLCAweDAwLCAweDBlLCAweDBlLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MWMsIDB4MWMsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4NzAsIDB4NzAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhlMCwgMHhlMCwgMHgwMCwgMHgwMCwgMHhjMSwgMHhjMSwgMHgwMCwgMHgwMCwgMHg4MywgMHg4MywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDA3LCAweDA3LCAweDAwLCAweDAwLCAweDBlLCAweDBlLCAweDAwLCAweDAwLCAweDFjLCAweDFjLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4NzAsIDB4NzAsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4ZTAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhjMSwgMHhjMSwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLCAweGNjLCAweGNjLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4Y2MsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhjYywgMHhjYywgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDExLCAweDExLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDExLCAweDExLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHhmMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MGYsIDB4MGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDQwLCAweDQwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgyMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDQwLCAweDQwLCAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweGIxLCAweGIxLCAweDAwLCAweDAwLCAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDAzLCAweDAzLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MWIsIDB4MWIsIDB4MDAsIDB4MDAsIDB4ZDgsIDB4ZDgsIDB4MDAsIDB4MDAsIDB4YzAsIDB4YzAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwYywgMHgwYywgMHgwMCwgMHgwMCwgMHg4ZCwgMHg4ZCwgMHgwMCwgMHgwMCwgMHhiMSwgMHhiMSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDAzLCAweDAzLCAweDAwLCAweDAwLCAweDFiLCAweDFiLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZDgsIDB4ZDgsIDB4MDAsIDB4MDAsIDB4YzAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MGMsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4ZCwgMHg4ZCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDgxLCAweDgxLCAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4ODEsIDB4ODEsIDB4MDAsIDB4MDAsIDB4NDIsIDB4NDIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODEsIDB4ODEsIDB4MDAsIDB4MDAsIDB4NDIsIDB4NDIsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDI1LCAweDI1LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4YzAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgyNSwgMHgyNSwgMHgwMCwgMHgwMCwgMHhjMCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDI1LCAweDI1LCAweDAwLCAweDAwLCAweGMwLCAweGMwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MjUsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhjMCwgMHhjMCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwgMHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsIDB4NDIsIDB4NDIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDU0LCAweDU0LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NDUsIDB4NDUsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MTQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHg1MSwgMHg1MSwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDU0LCAweDU0LCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDQ1LCAweDQ1LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg1MSwgMHg1MSwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NTUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmMCwgMHhmMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHhmMCwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDU1LCAweDU1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmMCwgMHhmMCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhYSwgMHhhYSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgyMiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDAzLCAweDAzLCAweDAwLCAweDAwLCAweDg0LCAweDg0LCAweDAwLCAweDAwLCAweDQ4LCAweDQ4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MzAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDg0LCAweDg0LCAweDAwLCAweDAwLCAweDQ4LCAweDQ4LCAweDAwLCAweDAwLCAweDMwLCAweDMwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MGMsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDg5LCAweDg5LCAweDAwLCAweDAwLCAweDhmLCAweDhmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4OGYsIDB4OGYsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4OTgsIDB4OTgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmOCwgMHhmOCwgMHgwMCwgMHgwMCwgMHhmOCwgMHhmOCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDg5LCAweDg5LCAweDAwLCAweDAwLCAweDhmLCAweDhmLCAweDAwLCAweDAwLCAweDhmLCAweDhmLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4OTgsIDB4OTgsIDB4MDAsIDB4MDAsIDB4ZjgsIDB4ZjgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHhmOCwgMHhmOCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLCAweDg4LCAweDg4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsIDB4ODgsIDB4ODgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4OCwgMHg4OCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDk5LCAweDk5LCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDk5LCAweDk5LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg5OSwgMHg5OSwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZjAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwZiwgMHgwZiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHgwMCwgMHgwMCwgMHhmMCwgMHhmMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLCAweGYwLCAweGYwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MGYsIDB4MGYsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwZiwgMHgwZiwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDgyLCAweDgyLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDI4LCAweDI4LCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MjgsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHg4MiwgMHg4MiwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHg4MiwgMHg4MiwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDI4LCAweDI4LCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4MjgsIDB4MjgsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4ODIsIDB4ODIsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KKyAgICB7MTYsDQorICAgICAxNiwNCisgICAgIHsNCisgICAgICAgICAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDM4LCAweDM4LCAweDAwLCAweDAwLCAweDdjLCAweDdjLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4ZmUsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4N2MsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwNCisgICAgICAgICAweDM4LCAweDM4LCAweDAwLCAweDAwLCAweDdjLCAweDdjLCAweDAwLCAweDAwLCAweGZlLCAweGZlLCAweDAwLCAweDAwLA0KKyAgICAgICAgIDB4N2MsIDB4N2MsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MzgsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsDQorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIH19LA0KK307DQorI2lmIGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9XSU4zMikNCisjZGVmaW5lIEZYX1NUQVJUX1RJTUVSICAgIFwNCisgIFNZU1RFTVRJTUUgc3RhcnQsIHN0b3A7IFwNCisgIDo6R2V0TG9jYWxUaW1lKCZzdGFydCk7DQorI2RlZmluZSBGWF9TVE9QX1RJTUVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICA6OkdldExvY2FsVGltZSgmc3RvcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICBXT1JEIHdTZWNvbmQgPSBzdG9wLndTZWNvbmQgLSBzdGFydC53U2Vjb25kOyAgICAgICAgICAgICAgICAgICBcDQorICBXT1JEIHdNaWxsaXNlY29uZHMgPSBzdG9wLndNaWxsaXNlY29uZHMgLSBzdGFydC53TWlsbGlzZWNvbmRzOyBcDQorICBjaGFyIGJ1ZlsyNTZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICBtZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICBzbnByaW50ZihidWYsIHNpemVvZihidWYpIC0gMSwgImR1cmF0aW9uIGlzICVkIG1pbGxpc2Vjb25kXG4iLCBcDQorICAgICAgICAgICB3U2Vjb25kICogMTAwMCArIHdNaWxsaXNlY29uZHMpOyAgICAgICAgICAgICAgICAgICAgICBcDQorICA6Ok91dHB1dERlYnVnU3RyaW5nKGJ1Zik7DQorI2VsaWYgZGVmaW5lZChfX2xpbnV4KSB8fCBkZWZpbmVkKGxpbnV4KQ0KKyNkZWZpbmUgRlhfU1RBUlRfVElNRVINCisjZGVmaW5lIEZYX1NUT1BfVElNRVINCisjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChfX01BQ09TWF9fKQ0KKyNkZWZpbmUgRlhfU1RBUlRfVElNRVIgICAgICAgIFwNCisgIE5TVGltZUludGVydmFsIHN0YXJ0LCBzdG9wOyBcDQorICBzdGFydCA9IFtOU0RhdGUgdGltZUludGVydmFsU2luY2VSZWZlcmVuY2VEYXRlXTsNCisjZGVmaW5lIEZYX1NUT1BfVElNRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgIHN0b3AgPSBbTlNEYXRlIHRpbWVJbnRlcnZhbFNpbmNlUmVmZXJlbmNlRGF0ZV07IFwNCisgIE5TVGltZUludGVydmFsIGR1cmF0aW9uID0gc3RvcCAtIHN0YXJ0OyAgICAgICAgIFwNCisgIHByaW50ZigiZHVyYXRpb24gaXMgJWYgbWlsbGlzZWNvbmRcbiIsIGR1cmF0aW9uICogMTAwMCk7DQorI2Vsc2UNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4anNlL3NyYy9jbGFzcy5jcHAgYi94ZmEvc3JjL2Z4anNlL3NyYy9jbGFzcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I4MDFhOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhqc2Uvc3JjL2NsYXNzLmNwcApAQCAtMCwwICsxLDMyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJmeHY4LmgiDQorI2luY2x1ZGUgImNvbnRleHQuaCINCisjaW5jbHVkZSAiY2xhc3MuaCINCisjaW5jbHVkZSAidmFsdWUuaCINCisjaW5jbHVkZSAic2NvcGVfaW5saW5lLmgiDQorI2luY2x1ZGUgInV0aWxfaW5saW5lLmgiDQorc3RhdGljIHZvaWQgRlhKU0VfVjhDb25zdHJ1Y3RvckNhbGxiYWNrX1dyYXBwZXIoDQorICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKTsNCitzdGF0aWMgdm9pZCBGWEpTRV9WOEZ1bmN0aW9uQ2FsbGJhY2tfV3JhcHBlcigNCisgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pOw0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4R2V0dGVyQ2FsbGJhY2tfV3JhcHBlcigNCisgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LA0KKyAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbyk7DQorc3RhdGljIHZvaWQgRlhKU0VfVjhTZXR0ZXJDYWxsYmFja19XcmFwcGVyKA0KKyAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksDQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlLA0KKyAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88dm9pZD4mIGluZm8pOw0KK3ZvaWQgRlhKU0VfRGVmaW5lRnVuY3Rpb25zKEZYSlNFX0hDT05URVhUIGhDb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYSlNFX0ZVTkNUSU9OKiBscEZ1bmN0aW9ucywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbk51bSkgew0KKyAgQ0ZYSlNFX0NvbnRleHQqIGxwQ29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX0NvbnRleHQqPihoQ29udGV4dCk7DQorICBBU1NFUlQobHBDb250ZXh0KTsNCisgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZUNvbnRleHQgc2NvcGUobHBDb250ZXh0KTsNCisgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IGxwQ29udGV4dC0+R2V0UnVudGltZSgpOw0KKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGhHbG9iYWxPYmplY3QgPQ0KKyAgICAgIEZYSlNFX0dldEdsb2JhbE9iamVjdEZyb21Db250ZXh0KHNjb3BlLkdldExvY2FsQ29udGV4dCgpKTsNCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5OdW07IGkrKykgew0KKyAgICBoR2xvYmFsT2JqZWN0LT5Gb3JjZVNldCgNCisgICAgICAgIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCBscEZ1bmN0aW9uc1tpXS5uYW1lKSwNCisgICAgICAgIHY4OjpGdW5jdGlvbjo6TmV3KA0KKyAgICAgICAgICAgIHBJc29sYXRlLCBGWEpTRV9WOEZ1bmN0aW9uQ2FsbGJhY2tfV3JhcHBlciwNCisgICAgICAgICAgICB2ODo6RXh0ZXJuYWw6Ok5ldyhwSXNvbGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PEZYSlNFX0ZVTkNUSU9OKj4obHBGdW5jdGlvbnMgKyBpKSkpLA0KKyAgICAgICAgc3RhdGljX2Nhc3Q8djg6OlByb3BlcnR5QXR0cmlidXRlPih2ODo6UmVhZE9ubHkgfCB2ODo6RG9udERlbGV0ZSkpOw0KKyAgfQ0KK30NCitGWEpTRV9IQ0xBU1MgRlhKU0VfRGVmaW5lQ2xhc3MoRlhKU0VfSENPTlRFWFQgaENvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzKSB7DQorICBDRlhKU0VfQ29udGV4dCogbHBDb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfQ29udGV4dCo+KGhDb250ZXh0KTsNCisgIEFTU0VSVChscENvbnRleHQpOw0KKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSENMQVNTPigNCisgICAgICBDRlhKU0VfQ2xhc3M6OkNyZWF0ZShscENvbnRleHQsIGxwQ2xhc3MsIEZBTFNFKSk7DQorfQ0KK0ZYSlNFX0hDTEFTUyBGWEpTRV9HZXRDbGFzcyhGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzek5hbWUpIHsNCisgIHJldHVybiByZWludGVycHJldF9jYXN0PEZYSlNFX0hDTEFTUz4oQ0ZYSlNFX0NsYXNzOjpHZXRDbGFzc0Zyb21Db250ZXh0KA0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX0NvbnRleHQqPihoQ29udGV4dCksIHN6TmFtZSkpOw0KK30NCitzdGF0aWMgdm9pZCBGWEpTRV9WOEZ1bmN0aW9uQ2FsbGJhY2tfV3JhcHBlcigNCisgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsNCisgIGNvbnN0IEZYSlNFX0ZVTkNUSU9OKiBscEZ1bmN0aW9uSW5mbyA9DQorICAgICAgc3RhdGljX2Nhc3Q8RlhKU0VfRlVOQ1RJT04qPihpbmZvLkRhdGEoKS5Bczx2ODo6RXh0ZXJuYWw+KCktPlZhbHVlKCkpOw0KKyAgaWYgKCFscEZ1bmN0aW9uSW5mbykgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfQnl0ZVN0cmluZ0Mgc3pGdW5jdGlvbk5hbWUobHBGdW5jdGlvbkluZm8tPm5hbWUpOw0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFRoaXNWYWx1ZSA9IENGWEpTRV9WYWx1ZTo6Q3JlYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsNCisgIGxwVGhpc1ZhbHVlLT5Gb3JjZVNldFZhbHVlKGluZm8uVGhpcygpKTsNCisgIENGWEpTRV9WYWx1ZSogbHBSZXRWYWx1ZSA9IENGWEpTRV9WYWx1ZTo6Q3JlYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsNCisgIENGWEpTRV9Bcmd1bWVudHNJbXBsIGltcGwgPSB7JmluZm8sIGxwUmV0VmFsdWV9Ow0KKyAgbHBGdW5jdGlvbkluZm8tPmNhbGxiYWNrUHJvYyhyZWludGVycHJldF9jYXN0PEZYSlNFX0hPQkpFQ1Q+KGxwVGhpc1ZhbHVlKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pGdW5jdGlvbk5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX0FyZ3VtZW50cyY+KGltcGwpKTsNCisgIGlmICghbHBSZXRWYWx1ZS0+RGlyZWN0R2V0VmFsdWUoKS5Jc0VtcHR5KCkpIHsNCisgICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChscFJldFZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpKTsNCisgIH0NCisgIGRlbGV0ZSBscFJldFZhbHVlOw0KKyAgbHBSZXRWYWx1ZSA9IE5VTEw7DQorICBkZWxldGUgbHBUaGlzVmFsdWU7DQorICBscFRoaXNWYWx1ZSA9IE5VTEw7DQorfQ0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4Q2xhc3NHbG9iYWxDb25zdHJ1Y3RvckNhbGxiYWNrX1dyYXBwZXIoDQorICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7DQorICBjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzc0RlZmluaXRpb24gPQ0KKyAgICAgIHN0YXRpY19jYXN0PEZYSlNFX0NMQVNTKj4oaW5mby5EYXRhKCkuQXM8djg6OkV4dGVybmFsPigpLT5WYWx1ZSgpKTsNCisgIGlmICghbHBDbGFzc0RlZmluaXRpb24pIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgQ0ZYX0J5dGVTdHJpbmdDIHN6RnVuY3Rpb25OYW1lKGxwQ2xhc3NEZWZpbml0aW9uLT5uYW1lKTsNCisgIENGWEpTRV9WYWx1ZSogbHBUaGlzVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQorICBscFRoaXNWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShpbmZvLlRoaXMoKSk7DQorICBDRlhKU0VfVmFsdWUqIGxwUmV0VmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQorICBDRlhKU0VfQXJndW1lbnRzSW1wbCBpbXBsID0geyZpbmZvLCBscFJldFZhbHVlfTsNCisgIGxwQ2xhc3NEZWZpbml0aW9uLT5jb25zdHJ1Y3RvcihyZWludGVycHJldF9jYXN0PEZYSlNFX0hPQkpFQ1Q+KGxwVGhpc1ZhbHVlKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekZ1bmN0aW9uTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PENGWEpTRV9Bcmd1bWVudHMmPihpbXBsKSk7DQorICBpZiAoIWxwUmV0VmFsdWUtPkRpcmVjdEdldFZhbHVlKCkuSXNFbXB0eSgpKSB7DQorICAgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQobHBSZXRWYWx1ZS0+RGlyZWN0R2V0VmFsdWUoKSk7DQorICB9DQorICBkZWxldGUgbHBSZXRWYWx1ZTsNCisgIGxwUmV0VmFsdWUgPSBOVUxMOw0KKyAgZGVsZXRlIGxwVGhpc1ZhbHVlOw0KKyAgbHBUaGlzVmFsdWUgPSBOVUxMOw0KK30NCitzdGF0aWMgdm9pZCBGWEpTRV9WOEdldHRlckNhbGxiYWNrX1dyYXBwZXIoDQorICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwNCisgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsNCisgIGNvbnN0IEZYSlNFX1BST1BFUlRZKiBscFByb3BlcnR5SW5mbyA9DQorICAgICAgc3RhdGljX2Nhc3Q8RlhKU0VfUFJPUEVSVFkqPihpbmZvLkRhdGEoKS5Bczx2ODo6RXh0ZXJuYWw+KCktPlZhbHVlKCkpOw0KKyAgaWYgKCFscFByb3BlcnR5SW5mbykgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfQnl0ZVN0cmluZ0Mgc3pQcm9wZXJ0eU5hbWUobHBQcm9wZXJ0eUluZm8tPm5hbWUpOw0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFRoaXNWYWx1ZSA9IENGWEpTRV9WYWx1ZTo6Q3JlYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsNCisgIENGWEpTRV9WYWx1ZSogbHBQcm9wVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQorICBscFRoaXNWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShpbmZvLlRoaXMoKSk7DQorICBscFByb3BlcnR5SW5mby0+Z2V0UHJvYyhyZWludGVycHJldF9jYXN0PEZYSlNFX0hPQkpFQ1Q+KGxwVGhpc1ZhbHVlKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN6UHJvcGVydHlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IVkFMVUU+KGxwUHJvcFZhbHVlKSk7DQorICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KGxwUHJvcFZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpKTsNCisgIGRlbGV0ZSBscFRoaXNWYWx1ZTsNCisgIGxwVGhpc1ZhbHVlID0gTlVMTDsNCisgIGRlbGV0ZSBscFByb3BWYWx1ZTsNCisgIGxwUHJvcFZhbHVlID0gTlVMTDsNCit9DQorc3RhdGljIHZvaWQgRlhKU0VfVjhTZXR0ZXJDYWxsYmFja19XcmFwcGVyKA0KKyAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksDQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlLA0KKyAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88dm9pZD4mIGluZm8pIHsNCisgIGNvbnN0IEZYSlNFX1BST1BFUlRZKiBscFByb3BlcnR5SW5mbyA9DQorICAgICAgc3RhdGljX2Nhc3Q8RlhKU0VfUFJPUEVSVFkqPihpbmZvLkRhdGEoKS5Bczx2ODo6RXh0ZXJuYWw+KCktPlZhbHVlKCkpOw0KKyAgaWYgKCFscFByb3BlcnR5SW5mbykgew0KKyAgICByZXR1cm47DQorICB9DQorICBDRlhfQnl0ZVN0cmluZ0Mgc3pQcm9wZXJ0eU5hbWUobHBQcm9wZXJ0eUluZm8tPm5hbWUpOw0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFRoaXNWYWx1ZSA9IENGWEpTRV9WYWx1ZTo6Q3JlYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsNCisgIENGWEpTRV9WYWx1ZSogbHBQcm9wVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQorICBscFRoaXNWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShpbmZvLlRoaXMoKSk7DQorICBscFByb3BWYWx1ZS0+Rm9yY2VTZXRWYWx1ZSh2YWx1ZSk7DQorICBscFByb3BlcnR5SW5mby0+c2V0UHJvYyhyZWludGVycHJldF9jYXN0PEZYSlNFX0hPQkpFQ1Q+KGxwVGhpc1ZhbHVlKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN6UHJvcGVydHlOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IVkFMVUU+KGxwUHJvcFZhbHVlKSk7DQorICBkZWxldGUgbHBUaGlzVmFsdWU7DQorICBscFRoaXNWYWx1ZSA9IE5VTEw7DQorICBkZWxldGUgbHBQcm9wVmFsdWU7DQorICBscFByb3BWYWx1ZSA9IE5VTEw7DQorfQ0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4Q29uc3RydWN0b3JDYWxsYmFja19XcmFwcGVyKA0KKyAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgew0KKyAgY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3NEZWZpbml0aW9uID0NCisgICAgICBzdGF0aWNfY2FzdDxGWEpTRV9DTEFTUyo+KGluZm8uRGF0YSgpLkFzPHY4OjpFeHRlcm5hbD4oKS0+VmFsdWUoKSk7DQorICBpZiAoIWxwQ2xhc3NEZWZpbml0aW9uKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIEZYU1lTX2Fzc2VydChpbmZvLlRoaXMoKS0+SW50ZXJuYWxGaWVsZENvdW50KCkpOw0KKyAgaW5mby5UaGlzKCktPlNldEFsaWduZWRQb2ludGVySW5JbnRlcm5hbEZpZWxkKDAsIE5VTEwpOw0KK30NCitGWEpTRV9IUlVOVElNRSBDRlhKU0VfQXJndW1lbnRzOjpHZXRSdW50aW1lKCkgY29uc3Qgew0KKyAgY29uc3QgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwqIGxwQXJndW1lbnRzID0NCisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IENGWEpTRV9Bcmd1bWVudHNJbXBsKiBjb25zdD4odGhpcyk7DQorICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IUlVOVElNRT4oDQorICAgICAgbHBBcmd1bWVudHMtPm1fcFJldFZhbHVlLT5HZXRJc29sYXRlKCkpOw0KK30NCitpbnQzMl90IENGWEpTRV9Bcmd1bWVudHM6OkdldExlbmd0aCgpIGNvbnN0IHsNCisgIGNvbnN0IENGWEpTRV9Bcmd1bWVudHNJbXBsKiBscEFyZ3VtZW50cyA9DQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogY29uc3Q+KHRoaXMpOw0KKyAgcmV0dXJuIGxwQXJndW1lbnRzLT5tX3BJbmZvLT5MZW5ndGgoKTsNCit9DQorRlhKU0VfSFZBTFVFIENGWEpTRV9Bcmd1bWVudHM6OkdldFZhbHVlKGludDMyX3QgaW5kZXgpIGNvbnN0IHsNCisgIGNvbnN0IENGWEpTRV9Bcmd1bWVudHNJbXBsKiBscEFyZ3VtZW50cyA9DQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogY29uc3Q+KHRoaXMpOw0KKyAgQ0ZYSlNFX1ZhbHVlKiBscEFyZ1ZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUodjg6Oklzb2xhdGU6OkdldEN1cnJlbnQoKSk7DQorICBBU1NFUlQobHBBcmdWYWx1ZSk7DQorICBscEFyZ1ZhbHVlLT5Gb3JjZVNldFZhbHVlKCgqbHBBcmd1bWVudHMtPm1fcEluZm8pW2luZGV4XSk7DQorICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IVkFMVUU+KGxwQXJnVmFsdWUpOw0KK30NCitGWF9CT09MIENGWEpTRV9Bcmd1bWVudHM6OkdldEJvb2xlYW4oaW50MzJfdCBpbmRleCkgY29uc3Qgew0KKyAgY29uc3QgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwqIGxwQXJndW1lbnRzID0NCisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IENGWEpTRV9Bcmd1bWVudHNJbXBsKiBjb25zdD4odGhpcyk7DQorICByZXR1cm4gKCpscEFyZ3VtZW50cy0+bV9wSW5mbylbaW5kZXhdLT5Cb29sZWFuVmFsdWUoKTsNCit9DQoraW50MzJfdCBDRlhKU0VfQXJndW1lbnRzOjpHZXRJbnQzMihpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICBjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogbHBBcmd1bWVudHMgPQ0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwqIGNvbnN0Pih0aGlzKTsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PigoKmxwQXJndW1lbnRzLT5tX3BJbmZvKVtpbmRleF0tPk51bWJlclZhbHVlKCkpOw0KK30NCitGWF9GTE9BVCBDRlhKU0VfQXJndW1lbnRzOjpHZXRGbG9hdChpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICBjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogbHBBcmd1bWVudHMgPQ0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwqIGNvbnN0Pih0aGlzKTsNCisgIHJldHVybiBzdGF0aWNfY2FzdDxGWF9GTE9BVD4oKCpscEFyZ3VtZW50cy0+bV9wSW5mbylbaW5kZXhdLT5OdW1iZXJWYWx1ZSgpKTsNCit9DQorQ0ZYX0J5dGVTdHJpbmcgQ0ZYSlNFX0FyZ3VtZW50czo6R2V0VVRGOFN0cmluZyhpbnQzMl90IGluZGV4KSBjb25zdCB7DQorICBjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogbHBBcmd1bWVudHMgPQ0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwqIGNvbnN0Pih0aGlzKTsNCisgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBoU3RyaW5nID0gKCpscEFyZ3VtZW50cy0+bV9wSW5mbylbaW5kZXhdLT5Ub1N0cmluZygpOw0KKyAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIHN6U3RyaW5nVmFsKGhTdHJpbmcpOw0KKyAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCpzelN0cmluZ1ZhbCk7DQorfQ0KK3ZvaWQqIENGWEpTRV9Bcmd1bWVudHM6OkdldE9iamVjdChpbnQzMl90IGluZGV4LCBGWEpTRV9IQ0xBU1MgaENsYXNzKSBjb25zdCB7DQorICBjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogbHBBcmd1bWVudHMgPQ0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwqIGNvbnN0Pih0aGlzKTsNCisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9ICgqbHBBcmd1bWVudHMtPm1fcEluZm8pW2luZGV4XTsNCisgIEFTU0VSVCghaFZhbHVlLklzRW1wdHkoKSk7DQorICBpZiAoIWhWYWx1ZS0+SXNPYmplY3QoKSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIENGWEpTRV9DbGFzcyogbHBDbGFzcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX0NsYXNzKj4oaENsYXNzKTsNCisgIHJldHVybiBGWEpTRV9SZXRyaWV2ZU9iamVjdEJpbmRpbmcoaFZhbHVlLkFzPHY4OjpPYmplY3Q+KCksIGxwQ2xhc3MpOw0KK30NCitGWEpTRV9IVkFMVUUgQ0ZYSlNFX0FyZ3VtZW50czo6R2V0UmV0dXJuVmFsdWUoKSB7DQorICBjb25zdCBDRlhKU0VfQXJndW1lbnRzSW1wbCogbHBBcmd1bWVudHMgPQ0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ0ZYSlNFX0FyZ3VtZW50c0ltcGwqIGNvbnN0Pih0aGlzKTsNCisgIHJldHVybiByZWludGVycHJldF9jYXN0PEZYSlNFX0hWQUxVRT4obHBBcmd1bWVudHMtPm1fcFJldFZhbHVlKTsNCit9DQorc3RhdGljIHZvaWQgRlhKU0VfQ29udGV4dF9HbG9iYWxPYmpUb1N0cmluZygNCisgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsNCisgIGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzID0NCisgICAgICBzdGF0aWNfY2FzdDxGWEpTRV9DTEFTUyo+KGluZm8uRGF0YSgpLkFzPHY4OjpFeHRlcm5hbD4oKS0+VmFsdWUoKSk7DQorICBpZiAoIWxwQ2xhc3MpIHsNCisgICAgcmV0dXJuOw0KKyAgfQ0KKyAgaWYgKGluZm8uVGhpcygpID09IGluZm8uSG9sZGVyKCkgJiYgbHBDbGFzcy0+bmFtZSkgew0KKyAgICBDRlhfQnl0ZVN0cmluZyBzelN0cmluZ1ZhbDsNCisgICAgc3pTdHJpbmdWYWwuRm9ybWF0KCJbb2JqZWN0ICVzXSIsIGxwQ2xhc3MtPm5hbWUpOw0KKyAgICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KA0KKyAgICAgICAgaW5mby5HZXRJc29sYXRlKCksIChjb25zdCBGWF9DSEFSKilzelN0cmluZ1ZhbCwNCisgICAgICAgIHY4OjpTdHJpbmc6OmtOb3JtYWxTdHJpbmcsIHN6U3RyaW5nVmFsLkdldExlbmd0aCgpKSk7DQorICB9IGVsc2Ugew0KKyAgICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KGluZm8uVGhpcygpLT5PYmplY3RQcm90b1RvU3RyaW5nKCkpOw0KKyAgfQ0KK30NCitDRlhKU0VfQ2xhc3MqIENGWEpTRV9DbGFzczo6Q3JlYXRlKENGWEpTRV9Db250ZXh0KiBscENvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzc0RlZmluaXRpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJJc0pTR2xvYmFsKSB7DQorICBpZiAoIWxwQ29udGV4dCB8fCAhbHBDbGFzc0RlZmluaXRpb24pIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICBDRlhKU0VfQ2xhc3MqIHBDbGFzcyA9DQorICAgICAgR2V0Q2xhc3NGcm9tQ29udGV4dChscENvbnRleHQsIGxwQ2xhc3NEZWZpbml0aW9uLT5uYW1lKTsNCisgIGlmIChwQ2xhc3MpIHsNCisgICAgcmV0dXJuIHBDbGFzczsNCisgIH0NCisgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IGxwQ29udGV4dC0+bV9wSXNvbGF0ZTsNCisgIHBDbGFzcyA9IG5ldyBDRlhKU0VfQ2xhc3MobHBDb250ZXh0KTsNCisgIHBDbGFzcy0+bV9zekNsYXNzTmFtZSA9IGxwQ2xhc3NEZWZpbml0aW9uLT5uYW1lOw0KKyAgcENsYXNzLT5tX2xwQ2xhc3NEZWZpbml0aW9uID0gbHBDbGFzc0RlZmluaXRpb247DQorICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCBzY29wZShwSXNvbGF0ZSk7DQorICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IGhGdW5jdGlvblRlbXBsYXRlID0gdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldygNCisgICAgICBwSXNvbGF0ZSwgYklzSlNHbG9iYWwgPyAwIDogRlhKU0VfVjhDb25zdHJ1Y3RvckNhbGxiYWNrX1dyYXBwZXIsDQorICAgICAgdjg6OkV4dGVybmFsOjpOZXcocElzb2xhdGUsIGNvbnN0X2Nhc3Q8RlhKU0VfQ0xBU1MqPihscENsYXNzRGVmaW5pdGlvbikpKTsNCisgIGhGdW5jdGlvblRlbXBsYXRlLT5TZXRDbGFzc05hbWUoDQorICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsIGxwQ2xhc3NEZWZpbml0aW9uLT5uYW1lKSk7DQorICBoRnVuY3Rpb25UZW1wbGF0ZS0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXRJbnRlcm5hbEZpZWxkQ291bnQoMSk7DQorICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBoT2JqZWN0VGVtcGxhdGUgPQ0KKyAgICAgIGhGdW5jdGlvblRlbXBsYXRlLT5JbnN0YW5jZVRlbXBsYXRlKCk7DQorICBTZXRVcE5hbWVkUHJvcEhhbmRsZXIocElzb2xhdGUsIGhPYmplY3RUZW1wbGF0ZSwgbHBDbGFzc0RlZmluaXRpb24pOw0KKw0KKyAgaWYgKGxwQ2xhc3NEZWZpbml0aW9uLT5wcm9wTnVtKSB7DQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGxwQ2xhc3NEZWZpbml0aW9uLT5wcm9wTnVtOyBpKyspIHsNCisgICAgICBoT2JqZWN0VGVtcGxhdGUtPlNldE5hdGl2ZURhdGFQcm9wZXJ0eSgNCisgICAgICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQ2xhc3NEZWZpbml0aW9uLT5wcm9wZXJ0aWVzW2ldLm5hbWUpLA0KKyAgICAgICAgICBscENsYXNzRGVmaW5pdGlvbi0+cHJvcGVydGllc1tpXS5nZXRQcm9jDQorICAgICAgICAgICAgICA/IEZYSlNFX1Y4R2V0dGVyQ2FsbGJhY2tfV3JhcHBlcg0KKyAgICAgICAgICAgICAgOiBOVUxMLA0KKyAgICAgICAgICBscENsYXNzRGVmaW5pdGlvbi0+cHJvcGVydGllc1tpXS5zZXRQcm9jDQorICAgICAgICAgICAgICA/IEZYSlNFX1Y4U2V0dGVyQ2FsbGJhY2tfV3JhcHBlcg0KKyAgICAgICAgICAgICAgOiBOVUxMLA0KKyAgICAgICAgICB2ODo6RXh0ZXJuYWw6Ok5ldyhwSXNvbGF0ZSwgY29uc3RfY2FzdDxGWEpTRV9QUk9QRVJUWSo+KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQ2xhc3NEZWZpbml0aW9uLT5wcm9wZXJ0aWVzICsgaSkpLA0KKyAgICAgICAgICBzdGF0aWNfY2FzdDx2ODo6UHJvcGVydHlBdHRyaWJ1dGU+KHY4OjpEb250RGVsZXRlKSk7DQorICAgIH0NCisgIH0NCisgIGlmIChscENsYXNzRGVmaW5pdGlvbi0+bWV0aE51bSkgew0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBscENsYXNzRGVmaW5pdGlvbi0+bWV0aE51bTsgaSsrKSB7DQorICAgICAgaE9iamVjdFRlbXBsYXRlLT5TZXQoDQorICAgICAgICAgIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCBscENsYXNzRGVmaW5pdGlvbi0+bWV0aG9kc1tpXS5uYW1lKSwNCisgICAgICAgICAgdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldygNCisgICAgICAgICAgICAgIHBJc29sYXRlLCBGWEpTRV9WOEZ1bmN0aW9uQ2FsbGJhY2tfV3JhcHBlciwNCisgICAgICAgICAgICAgIHY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLCBjb25zdF9jYXN0PEZYSlNFX0ZVTkNUSU9OKj4oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQ2xhc3NEZWZpbml0aW9uLT5tZXRob2RzICsgaSkpKSwNCisgICAgICAgICAgc3RhdGljX2Nhc3Q8djg6OlByb3BlcnR5QXR0cmlidXRlPih2ODo6UmVhZE9ubHkgfCB2ODo6RG9udERlbGV0ZSkpOw0KKyAgICB9DQorICB9DQorICBpZiAobHBDbGFzc0RlZmluaXRpb24tPmNvbnN0cnVjdG9yKSB7DQorICAgIGlmIChiSXNKU0dsb2JhbCkgew0KKyAgICAgIGhPYmplY3RUZW1wbGF0ZS0+U2V0KA0KKyAgICAgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgbHBDbGFzc0RlZmluaXRpb24tPm5hbWUpLA0KKyAgICAgICAgICB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KA0KKyAgICAgICAgICAgICAgcElzb2xhdGUsIEZYSlNFX1Y4Q2xhc3NHbG9iYWxDb25zdHJ1Y3RvckNhbGxiYWNrX1dyYXBwZXIsDQorICAgICAgICAgICAgICB2ODo6RXh0ZXJuYWw6Ok5ldyhwSXNvbGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8RlhKU0VfQ0xBU1MqPihscENsYXNzRGVmaW5pdGlvbikpKSwNCisgICAgICAgICAgc3RhdGljX2Nhc3Q8djg6OlByb3BlcnR5QXR0cmlidXRlPih2ODo6UmVhZE9ubHkgfCB2ODo6RG9udERlbGV0ZSkpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gaExvY2FsQ29udGV4dCA9DQorICAgICAgICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhwSXNvbGF0ZSwgbHBDb250ZXh0LT5tX2hDb250ZXh0KTsNCisgICAgICBGWEpTRV9HZXRHbG9iYWxPYmplY3RGcm9tQ29udGV4dChoTG9jYWxDb250ZXh0KQ0KKyAgICAgICAgICAtPlNldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgbHBDbGFzc0RlZmluaXRpb24tPm5hbWUpLA0KKyAgICAgICAgICAgICAgICB2ODo6RnVuY3Rpb246Ok5ldygNCisgICAgICAgICAgICAgICAgICAgIHBJc29sYXRlLCBGWEpTRV9WOENsYXNzR2xvYmFsQ29uc3RydWN0b3JDYWxsYmFja19XcmFwcGVyLA0KKyAgICAgICAgICAgICAgICAgICAgdjg6OkV4dGVybmFsOjpOZXcocElzb2xhdGUsIGNvbnN0X2Nhc3Q8RlhKU0VfQ0xBU1MqPigNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBDbGFzc0RlZmluaXRpb24pKSkpOw0KKyAgICB9DQorICB9DQorICBpZiAoYklzSlNHbG9iYWwpIHsNCisgICAgaE9iamVjdFRlbXBsYXRlLT5TZXQoDQorICAgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgInRvU3RyaW5nIiksDQorICAgICAgICB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KA0KKyAgICAgICAgICAgIHBJc29sYXRlLCBGWEpTRV9Db250ZXh0X0dsb2JhbE9ialRvU3RyaW5nLA0KKyAgICAgICAgICAgIHY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8RlhKU0VfQ0xBU1MqPihscENsYXNzRGVmaW5pdGlvbikpKSk7DQorICB9DQorICBwQ2xhc3MtPm1faFRlbXBsYXRlLlJlc2V0KGxwQ29udGV4dC0+bV9wSXNvbGF0ZSwgaEZ1bmN0aW9uVGVtcGxhdGUpOw0KKyAgbHBDb250ZXh0LT5tX3JnQ2xhc3Nlcy5BZGQocENsYXNzKTsNCisgIHJldHVybiBwQ2xhc3M7DQorfQ0KK0NGWEpTRV9DbGFzcyogQ0ZYSlNFX0NsYXNzOjpHZXRDbGFzc0Zyb21Db250ZXh0KENGWEpTRV9Db250ZXh0KiBwQ29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TmFtZSkgew0KKyAgZm9yIChpbnQgY291bnQgPSBwQ29udGV4dC0+bV9yZ0NsYXNzZXMuR2V0U2l6ZSgpLCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsNCisgICAgQ0ZYSlNFX0NsYXNzKiBwQ2xhc3MgPSBwQ29udGV4dC0+bV9yZ0NsYXNzZXNbaV07DQorICAgIGlmIChwQ2xhc3MtPm1fc3pDbGFzc05hbWUgPT0gc3pOYW1lKSB7DQorICAgICAgcmV0dXJuIHBDbGFzczsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIE5VTEw7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhqc2Uvc3JjL2NsYXNzLmggYi94ZmEvc3JjL2Z4anNlL3NyYy9jbGFzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwY2FiZTYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4anNlL3NyYy9jbGFzcy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBGWEpTRV9DTEFTU19IXw0KKyNkZWZpbmUgRlhKU0VfQ0xBU1NfSF8NCitjbGFzcyBDRlhKU0VfQ29udGV4dDsNCitjbGFzcyBDRlhKU0VfVmFsdWU7DQorY2xhc3MgQ0ZYSlNFX0NsYXNzIHsNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYSlNFX0NsYXNzKENGWEpTRV9Db250ZXh0KiBscENvbnRleHQpDQorICAgICAgOiBtX2xwQ2xhc3NEZWZpbml0aW9uKG51bGxwdHIpLCBtX3BDb250ZXh0KGxwQ29udGV4dCkge30NCisNCisgcHVibGljOg0KKyAgaW5saW5lIENGWEpTRV9Db250ZXh0KiBHZXRDb250ZXh0KCkgeyByZXR1cm4gbV9wQ29udGV4dDsgfQ0KKyAgaW5saW5lIHY4OjpHbG9iYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+JiBHZXRUZW1wbGF0ZSgpIHsgcmV0dXJuIG1faFRlbXBsYXRlOyB9DQorDQorIHB1YmxpYzoNCisgIHN0YXRpYyBDRlhKU0VfQ2xhc3MqIENyZWF0ZShDRlhKU0VfQ29udGV4dCogcENvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3NEZWZpbnRpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiSXNKU0dsb2JhbCA9IEZBTFNFKTsNCisgIHN0YXRpYyBDRlhKU0VfQ2xhc3MqIEdldENsYXNzRnJvbUNvbnRleHQoQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TmFtZSk7DQorICBzdGF0aWMgdm9pZCBTZXRVcER5blByb3BIYW5kbGVyKENGWEpTRV9Db250ZXh0KiBwQ29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzRGVmaW5pdGlvbik7DQorICBzdGF0aWMgdm9pZCBTZXRVcE5hbWVkUHJvcEhhbmRsZXIoDQorICAgICAgdjg6Oklzb2xhdGUqIHBJc29sYXRlLA0KKyAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+JiBoT2JqZWN0VGVtcGxhdGUsDQorICAgICAgY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3NEZWZpbml0aW9uKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX0J5dGVTdHJpbmcgbV9zekNsYXNzTmFtZTsNCisgIGNvbnN0IEZYSlNFX0NMQVNTKiBtX2xwQ2xhc3NEZWZpbml0aW9uOworICBDRlhKU0VfQ29udGV4dCogbV9wQ29udGV4dDsNCisgIHY4OjpHbG9iYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IG1faFRlbXBsYXRlOw0KKyAgZnJpZW5kIGNsYXNzIENGWEpTRV9Db250ZXh0Ow0KKyAgZnJpZW5kIGNsYXNzIENGWEpTRV9WYWx1ZTsNCit9Ow0KK3N0cnVjdCBDRlhKU0VfQXJndW1lbnRzSW1wbCB7DQorICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiogbV9wSW5mbzsNCisgIENGWEpTRV9WYWx1ZSogbV9wUmV0VmFsdWU7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4anNlL3NyYy9jb250ZXh0LmNwcCBiL3hmYS9zcmMvZnhqc2Uvc3JjL2NvbnRleHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZjViOTMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4anNlL3NyYy9jb250ZXh0LmNwcApAQCAtMCwwICsxLDI0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJmeHY4LmgiDQorI2luY2x1ZGUgImNvbnRleHQuaCINCisjaW5jbHVkZSAiY2xhc3MuaCINCisjaW5jbHVkZSAidmFsdWUuaCINCisjaW5jbHVkZSAic2NvcGVfaW5saW5lLmgiDQorI2luY2x1ZGUgInV0aWxfaW5saW5lLmgiDQorRlhKU0VfSENPTlRFWFQgRlhKU0VfQ29udGV4dF9DcmVhdGUoRlhKU0VfSFJVTlRJTUUgaFJ1bnRpbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhKU0VfQ0xBU1MqIGxwR2xvYmFsQ2xhc3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogbHBHbG9iYWxPYmplY3QpIHsNCisgIENGWEpTRV9Db250ZXh0KiBwQ29udGV4dCA9IENGWEpTRV9Db250ZXh0OjpDcmVhdGUoDQorICAgICAgcmVpbnRlcnByZXRfY2FzdDx2ODo6SXNvbGF0ZSo+KGhSdW50aW1lKSwgbHBHbG9iYWxDbGFzcywgbHBHbG9iYWxPYmplY3QpOw0KKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSENPTlRFWFQ+KHBDb250ZXh0KTsNCit9DQordm9pZCBGWEpTRV9Db250ZXh0X1JlbGVhc2UoRlhKU0VfSENPTlRFWFQgaENvbnRleHQpIHsNCisgIENGWEpTRV9Db250ZXh0KiBwQ29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX0NvbnRleHQqPihoQ29udGV4dCk7DQorICBpZiAocENvbnRleHQpIHsNCisgICAgZGVsZXRlIHBDb250ZXh0Ow0KKyAgfQ0KK30NCitGWEpTRV9IVkFMVUUgRlhKU0VfQ29udGV4dF9HZXRHbG9iYWxPYmplY3QoRlhKU0VfSENPTlRFWFQgaENvbnRleHQpIHsNCisgIENGWEpTRV9Db250ZXh0KiBwQ29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX0NvbnRleHQqPihoQ29udGV4dCk7DQorICBpZiAoIXBDb250ZXh0KSB7DQorICAgIHJldHVybiBOVUxMOw0KKyAgfQ0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUocENvbnRleHQtPkdldFJ1bnRpbWUoKSk7DQorICBBU1NFUlQobHBWYWx1ZSk7DQorICBwQ29udGV4dC0+R2V0R2xvYmFsT2JqZWN0KGxwVmFsdWUpOw0KKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSFZBTFVFPihscFZhbHVlKTsNCit9DQorRlhKU0VfSFJVTlRJTUUgRlhKU0VfQ29udGV4dF9HZXRSdW50aW1lKEZYSlNFX0hDT05URVhUIGhDb250ZXh0KSB7DQorICBDRlhKU0VfQ29udGV4dCogcENvbnRleHQgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9Db250ZXh0Kj4oaENvbnRleHQpOw0KKyAgcmV0dXJuIHBDb250ZXh0ID8gcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IUlVOVElNRT4ocENvbnRleHQtPkdldFJ1bnRpbWUoKSkNCisgICAgICAgICAgICAgICAgICA6IE5VTEw7DQorfQ0KK3N0YXRpYyBjb25zdCBGWF9DSEFSKiBzekNvbXBhdGlibGVNb2RlU2NyaXB0c1tdID0gew0KKyAgICAiKGZ1bmN0aW9uIChnbG9iYWwsIGxpc3QpIHsgJ3VzZSBzdHJpY3QnOyB2YXIgb2JqbmFtZTsgZm9yIChvYmpuYW1lIGluIGxpc3QpIHsgdmFyIGdsb2JhbG9iaiA9IGdsb2JhbFtvYmpuYW1lXTtcblwNCisJCQlpZiAoZ2xvYmFsb2JqKSB7IGxpc3Rbb2JqbmFtZV0uZm9yRWFjaCggZnVuY3Rpb24gKG5hbWUpIHsgaWYgKCFnbG9iYWxvYmpbbmFtZV0pIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbG9iaiwgbmFtZSwge3dyaXRhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IFxuXA0KKwkJCShmdW5jdGlvbiAob2JqKSB7XG5cDQorCWlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG5cDQorCQl0aHJvdyBuZXcgVHlwZUVycm9yKCdtaXNzaW5nIGFyZ3VtZW50IDAgd2hlbiBjYWxsaW5nIGZ1bmN0aW9uICcgKyBvYmpuYW1lICsgJy4nICsgbmFtZSk7XG5cDQorCX1cblwNCisJcmV0dXJuIGdsb2JhbG9iai5wcm90b3R5cGVbbmFtZV0uYXBwbHkob2JqLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTtcblwNCit9KX0pO319KTt9fX0odGhpcywge1N0cmluZzogWydzdWJzdHInLCAndG9VcHBlckNhc2UnXX0pKTsiLA0KK307DQordm9pZCBGWEpTRV9Db250ZXh0X0VuYWJsZUNvbXBhdGlibGVNb2RlKEZYSlNFX0hDT05URVhUIGhDb250ZXh0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EV09SRCBkd0NvbXBhdGlibGVGbGFncykgew0KKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8ICh1aW50MzJfdClGWEpTRV9DT01QQVRJQkxFTU9ERUZMQUdDT1VOVDsgaSsrKSB7DQorICAgIGlmIChkd0NvbXBhdGlibGVGbGFncyAmICgxIDw8IGkpKSB7DQorICAgICAgRlhKU0VfRXhlY3V0ZVNjcmlwdChoQ29udGV4dCwgc3pDb21wYXRpYmxlTW9kZVNjcmlwdHNbaV0sIE5VTEwsIE5VTEwpOw0KKyAgICB9DQorICB9DQorfQ0KK0ZYX0JPT0wgRlhKU0VfRXhlY3V0ZVNjcmlwdChGWEpTRV9IQ09OVEVYVCBoQ29udGV4dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogc3pTY3JpcHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoUmV0VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoTmV3VGhpc09iamVjdCkgew0KKyAgQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfQ29udGV4dCo+KGhDb250ZXh0KTsNCisgIEFTU0VSVChwQ29udGV4dCk7DQorICByZXR1cm4gcENvbnRleHQtPkV4ZWN1dGVTY3JpcHQoDQorICAgICAgc3pTY3JpcHQsIHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFJldFZhbHVlKSwNCisgICAgICByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhOZXdUaGlzT2JqZWN0KSk7DQorfQ0KK3Y4OjpMb2NhbDx2ODo6T2JqZWN0PiBGWEpTRV9DcmVhdGVSZXR1cm5WYWx1ZSh2ODo6SXNvbGF0ZSogcElzb2xhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpUcnlDYXRjaCYgdHJ5Y2F0Y2gpIHsNCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoUmV0dXJuVmFsdWUgPSB2ODo6T2JqZWN0OjpOZXcocElzb2xhdGUpOw0KKyAgaWYgKHRyeWNhdGNoLkhhc0NhdWdodCgpKSB7DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhFeGNlcHRpb24gPSB0cnljYXRjaC5FeGNlcHRpb24oKTsNCisgICAgdjg6OkxvY2FsPHY4OjpNZXNzYWdlPiBoTWVzc2FnZSA9IHRyeWNhdGNoLk1lc3NhZ2UoKTsNCisgICAgaWYgKGhFeGNlcHRpb24tPklzT2JqZWN0KCkpIHsNCisgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWU7DQorICAgICAgaFZhbHVlID0gaEV4Y2VwdGlvbi5Bczx2ODo6T2JqZWN0PigpLT5HZXQoDQorICAgICAgICAgIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAibmFtZSIpKTsNCisgICAgICBpZiAoaFZhbHVlLT5Jc1N0cmluZygpIHx8IGhWYWx1ZS0+SXNTdHJpbmdPYmplY3QoKSkgew0KKyAgICAgICAgaFJldHVyblZhbHVlLT5TZXQoMCwgaFZhbHVlKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaFJldHVyblZhbHVlLT5TZXQoMCwgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJFcnJvciIpKTsNCisgICAgICB9DQorICAgICAgaFZhbHVlID0gaEV4Y2VwdGlvbi5Bczx2ODo6T2JqZWN0PigpLT5HZXQoDQorICAgICAgICAgIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAibWVzc2FnZSIpKTsNCisgICAgICBpZiAoaFZhbHVlLT5Jc1N0cmluZygpIHx8IGhWYWx1ZS0+SXNTdHJpbmdPYmplY3QoKSkgew0KKyAgICAgICAgaFJldHVyblZhbHVlLT5TZXQoMSwgaFZhbHVlKTsNCisgICAgICB9IGVsc2Ugew0KKyAgICAgICAgaFJldHVyblZhbHVlLT5TZXQoMSwgaE1lc3NhZ2UtPkdldCgpKTsNCisgICAgICB9DQorICAgIH0gZWxzZSB7DQorICAgICAgaFJldHVyblZhbHVlLT5TZXQoMCwgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJFcnJvciIpKTsNCisgICAgICBoUmV0dXJuVmFsdWUtPlNldCgxLCBoTWVzc2FnZS0+R2V0KCkpOw0KKyAgICB9DQorICAgIGhSZXR1cm5WYWx1ZS0+U2V0KDIsIGhFeGNlcHRpb24pOw0KKyAgICBoUmV0dXJuVmFsdWUtPlNldCgzLCB2ODo6SW50ZWdlcjo6TmV3KHBJc29sYXRlLCBoTWVzc2FnZS0+R2V0TGluZU51bWJlcigpKSk7DQorICAgIGhSZXR1cm5WYWx1ZS0+U2V0KDQsIGhNZXNzYWdlLT5HZXRTb3VyY2VMaW5lKCkpOw0KKyAgICBoUmV0dXJuVmFsdWUtPlNldCg1LA0KKyAgICAgICAgICAgICAgICAgICAgICB2ODo6SW50ZWdlcjo6TmV3KHBJc29sYXRlLCBoTWVzc2FnZS0+R2V0U3RhcnRDb2x1bW4oKSkpOw0KKyAgICBoUmV0dXJuVmFsdWUtPlNldCg2LCB2ODo6SW50ZWdlcjo6TmV3KHBJc29sYXRlLCBoTWVzc2FnZS0+R2V0RW5kQ29sdW1uKCkpKTsNCisgIH0NCisgIHJldHVybiBoUmV0dXJuVmFsdWU7DQorfQ0KK0ZYX0JPT0wgRlhKU0VfUmV0dXJuVmFsdWVfR2V0TWVzc2FnZShGWEpTRV9IVkFMVUUgaFJldFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgdXRmOE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiB1dGY4TWVzc2FnZSkgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoUmV0VmFsdWUpOw0KKyAgaWYgKCFscFZhbHVlKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IGxwVmFsdWUtPkdldElzb2xhdGUoKTsNCisgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKHBJc29sYXRlKTsNCisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9DQorICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhwSXNvbGF0ZSwgbHBWYWx1ZS0+RGlyZWN0R2V0VmFsdWUoKSk7DQorICBpZiAoIWhWYWx1ZS0+SXNPYmplY3QoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgaFN0cmluZ1ZhbDAoDQorICAgICAgaFZhbHVlLkFzPHY4OjpPYmplY3Q+KCktPkdldCgwKS0+VG9TdHJpbmcoKSk7DQorICB1dGY4TmFtZSA9ICpoU3RyaW5nVmFsMDsNCisgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBoU3RyaW5nVmFsMSgNCisgICAgICBoVmFsdWUuQXM8djg6Ok9iamVjdD4oKS0+R2V0KDEpLT5Ub1N0cmluZygpKTsNCisgIHV0ZjhNZXNzYWdlID0gKmhTdHJpbmdWYWwxOw0KKyAgcmV0dXJuIFRSVUU7DQorfQ0KK0ZYX0JPT0wgRlhKU0VfUmV0dXJuVmFsdWVfR2V0TGluZUluZm8oRlhKU0VfSFZBTFVFIGhSZXRWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5MaW5lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbkNvbCkgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoUmV0VmFsdWUpOw0KKyAgaWYgKCFscFZhbHVlKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IGxwVmFsdWUtPkdldElzb2xhdGUoKTsNCisgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKHBJc29sYXRlKTsNCisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9DQorICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhwSXNvbGF0ZSwgbHBWYWx1ZS0+RGlyZWN0R2V0VmFsdWUoKSk7DQorICBpZiAoIWhWYWx1ZS0+SXNPYmplY3QoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBuTGluZSA9IGhWYWx1ZS5Bczx2ODo6T2JqZWN0PigpLT5HZXQoMyktPlRvSW50MzIoKS0+VmFsdWUoKTsNCisgIG5Db2wgPSBoVmFsdWUuQXM8djg6Ok9iamVjdD4oKS0+R2V0KDUpLT5Ub0ludDMyKCktPlZhbHVlKCk7DQorICByZXR1cm4gVFJVRTsNCit9DQorQ0ZYSlNFX0NvbnRleHQqIENGWEpTRV9Db250ZXh0OjpDcmVhdGUodjg6Oklzb2xhdGUqIHBJc29sYXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYSlNFX0NMQVNTKiBscEdsb2JhbENsYXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGxwR2xvYmFsT2JqZWN0KSB7DQorICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUocElzb2xhdGUpOw0KKyAgQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0ID0gbmV3IENGWEpTRV9Db250ZXh0KHBJc29sYXRlKTsNCisgIENGWEpTRV9DbGFzcyogbHBHbG9iYWxDbGFzc09iaiA9IE5VTEw7DQorICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBoT2JqZWN0VGVtcGxhdGU7DQorICBpZiAobHBHbG9iYWxDbGFzcykgew0KKyAgICBscEdsb2JhbENsYXNzT2JqID0gQ0ZYSlNFX0NsYXNzOjpDcmVhdGUocENvbnRleHQsIGxwR2xvYmFsQ2xhc3MsIFRSVUUpOw0KKyAgICBBU1NFUlQobHBHbG9iYWxDbGFzc09iaik7DQorICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gaEZ1bmN0aW9uVGVtcGxhdGUgPQ0KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvblRlbXBsYXRlPjo6TmV3KHBJc29sYXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwR2xvYmFsQ2xhc3NPYmotPm1faFRlbXBsYXRlKTsNCisgICAgaE9iamVjdFRlbXBsYXRlID0gaEZ1bmN0aW9uVGVtcGxhdGUtPkluc3RhbmNlVGVtcGxhdGUoKTsNCisgIH0gZWxzZSB7DQorICAgIGhPYmplY3RUZW1wbGF0ZSA9IHY4OjpPYmplY3RUZW1wbGF0ZTo6TmV3KCk7DQorICAgIGhPYmplY3RUZW1wbGF0ZS0+U2V0SW50ZXJuYWxGaWVsZENvdW50KDEpOw0KKyAgfQ0KKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBoTmV3Q29udGV4dCA9DQorICAgICAgdjg6OkNvbnRleHQ6Ok5ldyhwSXNvbGF0ZSwgTlVMTCwgaE9iamVjdFRlbXBsYXRlKTsNCisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gaFJvb3RDb250ZXh0ID0gdjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KA0KKyAgICAgIHBJc29sYXRlLCBDRlhKU0VfUnVudGltZURhdGE6OkdldChwSXNvbGF0ZSktPm1faFJvb3RDb250ZXh0KTsNCisgIGhOZXdDb250ZXh0LT5TZXRTZWN1cml0eVRva2VuKGhSb290Q29udGV4dC0+R2V0U2VjdXJpdHlUb2tlbigpKTsNCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoR2xvYmFsT2JqZWN0ID0NCisgICAgICBGWEpTRV9HZXRHbG9iYWxPYmplY3RGcm9tQ29udGV4dChoTmV3Q29udGV4dCk7DQorICBGWEpTRV9VcGRhdGVPYmplY3RCaW5kaW5nKGhHbG9iYWxPYmplY3QsIGxwR2xvYmFsT2JqZWN0KTsNCisgIHBDb250ZXh0LT5tX2hDb250ZXh0LlJlc2V0KHBJc29sYXRlLCBoTmV3Q29udGV4dCk7DQorICByZXR1cm4gcENvbnRleHQ7DQorfQ0KK0NGWEpTRV9Db250ZXh0Ojp+Q0ZYSlNFX0NvbnRleHQoKSB7DQorICBmb3IgKGludDMyX3QgaSA9IDAsIGNvdW50ID0gbV9yZ0NsYXNzZXMuR2V0U2l6ZSgpOyBpIDwgY291bnQ7IGkrKykgew0KKyAgICBDRlhKU0VfQ2xhc3MqIHBDbGFzcyA9IG1fcmdDbGFzc2VzW2ldOw0KKyAgICBpZiAocENsYXNzKSB7DQorICAgICAgZGVsZXRlIHBDbGFzczsNCisgICAgfQ0KKyAgfQ0KKyAgbV9yZ0NsYXNzZXMuUmVtb3ZlQWxsKCk7DQorfQ0KK3ZvaWQgQ0ZYSlNFX0NvbnRleHQ6OkdldEdsb2JhbE9iamVjdChDRlhKU0VfVmFsdWUqIHBWYWx1ZSkgew0KKyAgQVNTRVJUKHBWYWx1ZSk7DQorICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVDb250ZXh0IHNjb3BlKHRoaXMpOw0KKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBoQ29udGV4dCA9DQorICAgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KG1fcElzb2xhdGUsIG1faENvbnRleHQpOw0KKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGhHbG9iYWxPYmplY3QgPSBoQ29udGV4dC0+R2xvYmFsKCk7DQorICBwVmFsdWUtPkZvcmNlU2V0VmFsdWUoaEdsb2JhbE9iamVjdCk7DQorfQ0KK0ZYX0JPT0wgQ0ZYSlNFX0NvbnRleHQ6OkV4ZWN1dGVTY3JpcHQoY29uc3QgRlhfQ0hBUiogc3pTY3JpcHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGxwUmV0VmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGxwTmV3VGhpc09iamVjdCkgew0KKyAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlQ29udGV4dCBzY29wZSh0aGlzKTsNCisgIHY4OjpUcnlDYXRjaCB0cnljYXRjaDsNCisgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBoU2NyaXB0U3RyaW5nID0NCisgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChtX3BJc29sYXRlLCBzelNjcmlwdCk7DQorICBpZiAobHBOZXdUaGlzT2JqZWN0ID09IE5VTEwpIHsNCisgICAgdjg6OkxvY2FsPHY4OjpTY3JpcHQ+IGhTY3JpcHQgPSB2ODo6U2NyaXB0OjpDb21waWxlKGhTY3JpcHRTdHJpbmcpOw0KKyAgICBpZiAoIXRyeWNhdGNoLkhhc0NhdWdodCgpKSB7DQorICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gaFNjcmlwdC0+UnVuKCk7DQorICAgICAgaWYgKCF0cnljYXRjaC5IYXNDYXVnaHQoKSkgew0KKyAgICAgICAgaWYgKGxwUmV0VmFsdWUpIHsNCisgICAgICAgICAgbHBSZXRWYWx1ZS0+bV9oVmFsdWUuUmVzZXQobV9wSXNvbGF0ZSwgaFZhbHVlKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBUUlVFOw0KKyAgICAgIH0NCisgICAgfQ0KKyAgICBpZiAobHBSZXRWYWx1ZSkgew0KKyAgICAgIGxwUmV0VmFsdWUtPm1faFZhbHVlLlJlc2V0KG1fcElzb2xhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfQ3JlYXRlUmV0dXJuVmFsdWUobV9wSXNvbGF0ZSwgdHJ5Y2F0Y2gpKTsNCisgICAgfQ0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9IGVsc2Ugew0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoTmV3VGhpcyA9DQorICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIGxwTmV3VGhpc09iamVjdC0+bV9oVmFsdWUpOw0KKyAgICBBU1NFUlQoIWhOZXdUaGlzLklzRW1wdHkoKSk7DQorICAgIHY4OjpMb2NhbDx2ODo6U2NyaXB0PiBoV3JhcHBlciA9DQorICAgICAgICB2ODo6U2NyaXB0OjpDb21waWxlKHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KA0KKyAgICAgICAgICAgIG1fcElzb2xhdGUsICIoZnVuY3Rpb24gKCkgeyByZXR1cm4gZXZhbChhcmd1bWVudHNbMF0pOyB9KSIpKTsNCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFdyYXBwZXJWYWx1ZSA9IGhXcmFwcGVyLT5SdW4oKTsNCisgICAgQVNTRVJUKGhXcmFwcGVyVmFsdWUtPklzRnVuY3Rpb24oKSk7DQorICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+IGhXcmFwcGVyRm4gPSBoV3JhcHBlclZhbHVlLkFzPHY4OjpGdW5jdGlvbj4oKTsNCisgICAgaWYgKCF0cnljYXRjaC5IYXNDYXVnaHQoKSkgew0KKyAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHJnQXJnc1tdID0ge2hTY3JpcHRTdHJpbmd9Ow0KKyAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9DQorICAgICAgICAgIGhXcmFwcGVyRm4tPkNhbGwoaE5ld1RoaXMuQXM8djg6Ok9iamVjdD4oKSwgMSwgcmdBcmdzKTsNCisgICAgICBpZiAoIXRyeWNhdGNoLkhhc0NhdWdodCgpKSB7DQorICAgICAgICBpZiAobHBSZXRWYWx1ZSkgew0KKyAgICAgICAgICBscFJldFZhbHVlLT5tX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoVmFsdWUpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmIChscFJldFZhbHVlKSB7DQorICAgICAgbHBSZXRWYWx1ZS0+bV9oVmFsdWUuUmVzZXQobV9wSXNvbGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9DcmVhdGVSZXR1cm5WYWx1ZShtX3BJc29sYXRlLCB0cnljYXRjaCkpOw0KKyAgICB9DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCit9DQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGpzZS9zcmMvY29udGV4dC5oIGIveGZhL3NyYy9meGpzZS9zcmMvY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMDY3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4anNlL3NyYy9jb250ZXh0LmgKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQ0KKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuDQorDQorLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20NCisNCisjaWZuZGVmIEZYSlNFX0NPTlRFWFRfSF8NCisjZGVmaW5lIEZYSlNFX0NPTlRFWFRfSF8NCitjbGFzcyBDRlhKU0VfQ2xhc3M7DQorY2xhc3MgQ0ZYSlNFX1ZhbHVlOw0KK2NsYXNzIENGWEpTRV9Db250ZXh0IHsNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYSlNFX0NvbnRleHQodjg6Oklzb2xhdGUqIHBJc29sYXRlKSA6IG1fcElzb2xhdGUocElzb2xhdGUpIHt9DQorDQorIHB1YmxpYzoNCisgIHN0YXRpYyBDRlhKU0VfQ29udGV4dCogQ3JlYXRlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYSlNFX0NMQVNTKiBscEdsb2JhbENsYXNzID0gTlVMTCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGxwR2xvYmFsT2JqZWN0ID0gTlVMTCk7DQorICB+Q0ZYSlNFX0NvbnRleHQoKTsNCisgIFY4X0lOTElORSB2ODo6SXNvbGF0ZSogR2V0UnVudGltZSh2b2lkKSB7IHJldHVybiBtX3BJc29sYXRlOyB9DQorICB2b2lkIEdldEdsb2JhbE9iamVjdChDRlhKU0VfVmFsdWUqIHBWYWx1ZSk7DQorICBGWF9CT09MIEV4ZWN1dGVTY3JpcHQoY29uc3QgRlhfQ0hBUiogc3pTY3JpcHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBscFJldFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogbHBOZXdUaGlzT2JqZWN0ID0gTlVMTCk7DQorDQorIHByb3RlY3RlZDoNCisgIENGWEpTRV9Db250ZXh0KCk7DQorICBDRlhKU0VfQ29udGV4dChjb25zdCBDRlhKU0VfQ29udGV4dCYpOw0KKyAgQ0ZYSlNFX0NvbnRleHQmIG9wZXJhdG9yPShjb25zdCBDRlhKU0VfQ29udGV4dCYpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2ODo6R2xvYmFsPHY4OjpDb250ZXh0PiBtX2hDb250ZXh0Ow0KKyAgdjg6Oklzb2xhdGUqIG1fcElzb2xhdGU7DQorICBDRlhfQXJyYXlUZW1wbGF0ZTxDRlhKU0VfQ2xhc3MqPiBtX3JnQ2xhc3NlczsNCisgIGZyaWVuZCBjbGFzcyBDRlhKU0VfQ2xhc3M7DQorICBmcmllbmQgY2xhc3MgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlQ29udGV4dDsNCisgIGZyaWVuZCBjbGFzcyBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290T3JOb3JtYWxDb250ZXh0Ow0KK307DQordjg6OkxvY2FsPHY4OjpPYmplY3Q+IEZYSlNFX0NyZWF0ZVJldHVyblZhbHVlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OlRyeUNhdGNoJiB0cnljYXRjaCk7DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGpzZS9zcmMvZHlucHJvcC5jcHAgYi94ZmEvc3JjL2Z4anNlL3NyYy9keW5wcm9wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2M1OWY5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGpzZS9zcmMvZHlucHJvcC5jcHAKQEAgLTAsMCArMSw0NTcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgInhmYS9zcmMvZm94aXRsaWIuaCINCisjaW5jbHVkZSAiZnh2OC5oIg0KKyNpbmNsdWRlICJjbGFzcy5oIg0KKyNpbmNsdWRlICJ2YWx1ZS5oIg0KK3N0YXRpYyB2b2lkIEZYSlNFX0R5blByb3BHZXR0ZXJBZGFwdGVyX01ldGhvZENhbGxiYWNrKA0KKyAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgew0KKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGhDYWxsQmFja0luZm8gPSBpbmZvLkRhdGEoKS5Bczx2ODo6T2JqZWN0PigpOw0KKyAgRlhKU0VfQ0xBU1MqIGxwQ2xhc3MgPSBzdGF0aWNfY2FzdDxGWEpTRV9DTEFTUyo+KA0KKyAgICAgIGhDYWxsQmFja0luZm8tPkdldEFsaWduZWRQb2ludGVyRnJvbUludGVybmFsRmllbGQoMCkpOw0KKyAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IGhQcm9wTmFtZSA9DQorICAgICAgaENhbGxCYWNrSW5mby0+R2V0SW50ZXJuYWxGaWVsZCgxKS5Bczx2ODo6U3RyaW5nPigpOw0KKyAgQVNTRVJUKGxwQ2xhc3MgJiYgIWhQcm9wTmFtZS5Jc0VtcHR5KCkpOw0KKyAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIHN6UHJvcE5hbWUoaFByb3BOYW1lKTsNCisgIENGWF9CeXRlU3RyaW5nQyBzekZ4UHJvcE5hbWUgPSAqc3pQcm9wTmFtZTsNCisgIENGWEpTRV9WYWx1ZSogbHBUaGlzVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQorICBscFRoaXNWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShpbmZvLlRoaXMoKSk7DQorICBDRlhKU0VfVmFsdWUqIGxwUmV0VmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQorICBDRlhKU0VfQXJndW1lbnRzSW1wbCBpbXBsID0geyZpbmZvLCBscFJldFZhbHVlfTsNCisgIGxwQ2xhc3MtPmR5bk1ldGhvZENhbGwocmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IT0JKRUNUPihscFRoaXNWYWx1ZSksDQorICAgICAgICAgICAgICAgICAgICAgICAgIHN6RnhQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfQXJndW1lbnRzJj4oaW1wbCkpOw0KKyAgaWYgKCFscFJldFZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpLklzRW1wdHkoKSkgew0KKyAgICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KGxwUmV0VmFsdWUtPkRpcmVjdEdldFZhbHVlKCkpOw0KKyAgfQ0KKyAgZGVsZXRlIGxwUmV0VmFsdWU7DQorICBscFJldFZhbHVlID0gbnVsbHB0cjsKKyAgZGVsZXRlIGxwVGhpc1ZhbHVlOw0KKyAgbHBUaGlzVmFsdWUgPSBudWxscHRyOworfQ0KK3N0YXRpYyB2b2lkIEZYSlNFX0R5blByb3BHZXR0ZXJBZGFwdGVyKGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhWYWx1ZSkgew0KKyAgQVNTRVJUKGxwQ2xhc3MpOw0KKyAgaW50MzJfdCBuUHJvcFR5cGUgPQ0KKyAgICAgIGxwQ2xhc3MtPmR5blByb3BUeXBlR2V0dGVyID09IG51bGxwdHIKKyAgICAgICAgICA/IEZYSlNFX0NsYXNzUHJvcFR5cGVfUHJvcGVydHkNCisgICAgICAgICAgOiBscENsYXNzLT5keW5Qcm9wVHlwZUdldHRlcihoT2JqZWN0LCBzelByb3BOYW1lLCBGQUxTRSk7DQorICBpZiAoblByb3BUeXBlID09IEZYSlNFX0NsYXNzUHJvcFR5cGVfUHJvcGVydHkpIHsNCisgICAgaWYgKGxwQ2xhc3MtPmR5blByb3BHZXR0ZXIpIHsNCisgICAgICBscENsYXNzLT5keW5Qcm9wR2V0dGVyKGhPYmplY3QsIHN6UHJvcE5hbWUsIGhWYWx1ZSk7DQorICAgIH0NCisgIH0gZWxzZSBpZiAoblByb3BUeXBlID09IEZYSlNFX0NsYXNzUHJvcFR5cGVfTWV0aG9kKSB7DQorICAgIGlmIChscENsYXNzLT5keW5NZXRob2RDYWxsICYmIGhWYWx1ZSkgew0KKyAgICAgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgICAgICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBscFZhbHVlLT5HZXRJc29sYXRlKCk7DQorICAgICAgdjg6OkhhbmRsZVNjb3BlIGhzY29wZShwSXNvbGF0ZSk7DQorICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gaENhbGxCYWNrSW5mb1RlbXBsYXRlID0NCisgICAgICAgICAgdjg6Ok9iamVjdFRlbXBsYXRlOjpOZXcoKTsNCisgICAgICBoQ2FsbEJhY2tJbmZvVGVtcGxhdGUtPlNldEludGVybmFsRmllbGRDb3VudCgyKTsNCisgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaENhbGxCYWNrSW5mbyA9DQorICAgICAgICAgIGhDYWxsQmFja0luZm9UZW1wbGF0ZS0+TmV3SW5zdGFuY2UoKTsNCisgICAgICBoQ2FsbEJhY2tJbmZvLT5TZXRBbGlnbmVkUG9pbnRlckluSW50ZXJuYWxGaWVsZCgNCisgICAgICAgICAgMCwgY29uc3RfY2FzdDxGWEpTRV9DTEFTUyo+KGxwQ2xhc3MpKTsNCisgICAgICBoQ2FsbEJhY2tJbmZvLT5TZXRJbnRlcm5hbEZpZWxkKA0KKyAgICAgICAgICAxLCB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOCgNCisgICAgICAgICAgICAgICAgIHBJc29sYXRlLCByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihzelByb3BOYW1lLkdldFB0cigpKSwNCisgICAgICAgICAgICAgICAgIHY4OjpTdHJpbmc6OmtOb3JtYWxTdHJpbmcsIHN6UHJvcE5hbWUuR2V0TGVuZ3RoKCkpKTsNCisgICAgICBscFZhbHVlLT5Gb3JjZVNldFZhbHVlKHY4OjpGdW5jdGlvbjo6TmV3KA0KKyAgICAgICAgICBscFZhbHVlLT5HZXRJc29sYXRlKCksIEZYSlNFX0R5blByb3BHZXR0ZXJBZGFwdGVyX01ldGhvZENhbGxiYWNrLA0KKyAgICAgICAgICBoQ2FsbEJhY2tJbmZvKSk7DQorICAgIH0NCisgIH0NCit9DQorc3RhdGljIHZvaWQgRlhKU0VfRHluUHJvcFNldHRlckFkYXB0ZXIoY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSE9CSkVDVCBoT2JqZWN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFZhbHVlKSB7DQorICBBU1NFUlQobHBDbGFzcyk7DQorICBpbnQzMl90IG5Qcm9wVHlwZSA9DQorICAgICAgbHBDbGFzcy0+ZHluUHJvcFR5cGVHZXR0ZXIgPT0gbnVsbHB0cgorICAgICAgICAgID8gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Qcm9wZXJ0eQ0KKyAgICAgICAgICA6IGxwQ2xhc3MtPmR5blByb3BUeXBlR2V0dGVyKGhPYmplY3QsIHN6UHJvcE5hbWUsIEZBTFNFKTsNCisgIGlmIChuUHJvcFR5cGUgIT0gRlhKU0VfQ2xhc3NQcm9wVHlwZV9NZXRob2QpIHsNCisgICAgaWYgKGxwQ2xhc3MtPmR5blByb3BTZXR0ZXIpIHsNCisgICAgICBscENsYXNzLT5keW5Qcm9wU2V0dGVyKGhPYmplY3QsIHN6UHJvcE5hbWUsIGhWYWx1ZSk7DQorICAgIH0NCisgIH0NCit9DQorc3RhdGljIEZYX0JPT0wgRlhKU0VfRHluUHJvcFF1ZXJ5QWRhcHRlcihjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSkgew0KKyAgQVNTRVJUKGxwQ2xhc3MpOw0KKyAgaW50MzJfdCBuUHJvcFR5cGUgPQ0KKyAgICAgIGxwQ2xhc3MtPmR5blByb3BUeXBlR2V0dGVyID09IG51bGxwdHIKKyAgICAgICAgICA/IEZYSlNFX0NsYXNzUHJvcFR5cGVfUHJvcGVydHkNCisgICAgICAgICAgOiBscENsYXNzLT5keW5Qcm9wVHlwZUdldHRlcihoT2JqZWN0LCBzelByb3BOYW1lLCBUUlVFKTsNCisgIHJldHVybiBuUHJvcFR5cGUgIT0gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Ob25lOw0KK30NCitzdGF0aWMgRlhfQk9PTCBGWEpTRV9EeW5Qcm9wRGVsZXRlckFkYXB0ZXIoY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hPQkpFQ1QgaE9iamVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lKSB7DQorICBBU1NFUlQobHBDbGFzcyk7DQorICBpbnQzMl90IG5Qcm9wVHlwZSA9DQorICAgICAgbHBDbGFzcy0+ZHluUHJvcFR5cGVHZXR0ZXIgPT0gbnVsbHB0cgorICAgICAgICAgID8gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Qcm9wZXJ0eQ0KKyAgICAgICAgICA6IGxwQ2xhc3MtPmR5blByb3BUeXBlR2V0dGVyKGhPYmplY3QsIHN6UHJvcE5hbWUsIEZBTFNFKTsNCisgIGlmIChuUHJvcFR5cGUgIT0gRlhKU0VfQ2xhc3NQcm9wVHlwZV9NZXRob2QpIHsNCisgICAgaWYgKGxwQ2xhc3MtPmR5blByb3BEZWxldGVyKSB7DQorICAgICAgcmV0dXJuIGxwQ2xhc3MtPmR5blByb3BEZWxldGVyKGhPYmplY3QsIHN6UHJvcE5hbWUpOw0KKyAgICB9IGVsc2Ugew0KKyAgICAgIHJldHVybiBuUHJvcFR5cGUgPT0gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Qcm9wZXJ0eSA/IEZBTFNFIDogVFJVRTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIEZBTFNFOw0KK30NCitzdGF0aWMgdm9pZCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yX2dldHRlcigNCisgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsNCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoQ2FsbEJhY2tJbmZvID0gaW5mby5EYXRhKCkuQXM8djg6Ok9iamVjdD4oKTsNCisgIEZYSlNFX0NMQVNTKiBscENsYXNzID0gc3RhdGljX2Nhc3Q8RlhKU0VfQ0xBU1MqPigNCisgICAgICBoQ2FsbEJhY2tJbmZvLT5HZXRBbGlnbmVkUG9pbnRlckZyb21JbnRlcm5hbEZpZWxkKDApKTsNCisgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBoUHJvcE5hbWUgPQ0KKyAgICAgIGhDYWxsQmFja0luZm8tPkdldEludGVybmFsRmllbGQoMSkuQXM8djg6OlN0cmluZz4oKTsNCisgIEFTU0VSVChscENsYXNzICYmICFoUHJvcE5hbWUuSXNFbXB0eSgpKTsNCisgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBzelByb3BOYW1lKGhQcm9wTmFtZSk7DQorICBDRlhfQnl0ZVN0cmluZ0Mgc3pGeFByb3BOYW1lID0gKnN6UHJvcE5hbWU7DQorICBDRlhKU0VfVmFsdWUqIGxwVGhpc1ZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KKyAgQ0ZYSlNFX1ZhbHVlKiBscE5ld1ZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KKyAgbHBUaGlzVmFsdWUtPkZvcmNlU2V0VmFsdWUoaW5mby5UaGlzKCkpOw0KKyAgRlhKU0VfRHluUHJvcEdldHRlckFkYXB0ZXIoDQorICAgICAgbHBDbGFzcywgcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IT0JKRUNUPihscFRoaXNWYWx1ZSksIHN6RnhQcm9wTmFtZSwNCisgICAgICByZWludGVycHJldF9jYXN0PEZYSlNFX0hWQUxVRT4obHBOZXdWYWx1ZSkpOw0KKyAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChscE5ld1ZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpKTsNCisgIGRlbGV0ZSBscFRoaXNWYWx1ZTsNCisgIGxwVGhpc1ZhbHVlID0gbnVsbHB0cjsKKyAgZGVsZXRlIGxwTmV3VmFsdWU7DQorICBscE5ld1ZhbHVlID0gbnVsbHB0cjsKK30NCitzdGF0aWMgdm9pZCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yX3NldHRlcigNCisgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsNCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoQ2FsbEJhY2tJbmZvID0gaW5mby5EYXRhKCkuQXM8djg6Ok9iamVjdD4oKTsNCisgIEZYSlNFX0NMQVNTKiBscENsYXNzID0gc3RhdGljX2Nhc3Q8RlhKU0VfQ0xBU1MqPigNCisgICAgICBoQ2FsbEJhY2tJbmZvLT5HZXRBbGlnbmVkUG9pbnRlckZyb21JbnRlcm5hbEZpZWxkKDApKTsNCisgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBoUHJvcE5hbWUgPQ0KKyAgICAgIGhDYWxsQmFja0luZm8tPkdldEludGVybmFsRmllbGQoMSkuQXM8djg6OlN0cmluZz4oKTsNCisgIEFTU0VSVChscENsYXNzICYmICFoUHJvcE5hbWUuSXNFbXB0eSgpKTsNCisgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBzelByb3BOYW1lKGhQcm9wTmFtZSk7DQorICBDRlhfQnl0ZVN0cmluZ0Mgc3pGeFByb3BOYW1lID0gKnN6UHJvcE5hbWU7DQorICBDRlhKU0VfVmFsdWUqIGxwVGhpc1ZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KKyAgQ0ZYSlNFX1ZhbHVlKiBscE5ld1ZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KKyAgbHBUaGlzVmFsdWUtPkZvcmNlU2V0VmFsdWUoaW5mby5UaGlzKCkpOw0KKyAgbHBOZXdWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShpbmZvWzBdKTsNCisgIEZYSlNFX0R5blByb3BTZXR0ZXJBZGFwdGVyKA0KKyAgICAgIGxwQ2xhc3MsIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSE9CSkVDVD4obHBUaGlzVmFsdWUpLCBzekZ4UHJvcE5hbWUsDQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IVkFMVUU+KGxwTmV3VmFsdWUpKTsNCisgIGRlbGV0ZSBscFRoaXNWYWx1ZTsNCisgIGxwVGhpc1ZhbHVlID0gbnVsbHB0cjsKKyAgZGVsZXRlIGxwTmV3VmFsdWU7DQorICBscE5ld1ZhbHVlID0gbnVsbHB0cjsKK30NCitzdGF0aWMgdm9pZCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKA0KKyAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgew0KKyAgY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3MgPQ0KKyAgICAgIHN0YXRpY19jYXN0PEZYSlNFX0NMQVNTKj4oaW5mby5EYXRhKCkuQXM8djg6OkV4dGVybmFsPigpLT5WYWx1ZSgpKTsNCisgIGlmICghbHBDbGFzcykgew0KKyAgICByZXR1cm47DQorICB9DQorICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBpbmZvLkdldElzb2xhdGUoKTsNCisgIHY4OjpIYW5kbGVTY29wZSBzY29wZShwSXNvbGF0ZSk7DQorICB2ODo6TG9jYWw8djg6OlN0cmluZz4gaFByb3BOYW1lID0gaW5mb1swXS0+VG9TdHJpbmcoKTsNCisgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBzelByb3BOYW1lKGhQcm9wTmFtZSk7DQorICBDRlhfQnl0ZVN0cmluZ0Mgc3pGeFByb3BOYW1lKCpzelByb3BOYW1lLCBzelByb3BOYW1lLmxlbmd0aCgpKTsNCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IGhDYWxsQmFja0luZm9UZW1wbGF0ZSA9DQorICAgICAgdjg6Ok9iamVjdFRlbXBsYXRlOjpOZXcoKTsNCisgIGhDYWxsQmFja0luZm9UZW1wbGF0ZS0+U2V0SW50ZXJuYWxGaWVsZENvdW50KDIpOw0KKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGhDYWxsQmFja0luZm8gPSBoQ2FsbEJhY2tJbmZvVGVtcGxhdGUtPk5ld0luc3RhbmNlKCk7DQorICBoQ2FsbEJhY2tJbmZvLT5TZXRBbGlnbmVkUG9pbnRlckluSW50ZXJuYWxGaWVsZCgNCisgICAgICAwLCBjb25zdF9jYXN0PEZYSlNFX0NMQVNTKj4obHBDbGFzcykpOw0KKyAgaENhbGxCYWNrSW5mby0+U2V0SW50ZXJuYWxGaWVsZCgxLCBoUHJvcE5hbWUpOw0KKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGhQcm9wRGVzY3JpcHRvciA9IHY4OjpPYmplY3Q6Ok5ldyhwSXNvbGF0ZSk7DQorICBoUHJvcERlc2NyaXB0b3ItPkZvcmNlU2V0KA0KKyAgICAgIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAiZ2V0IiksDQorICAgICAgdjg6OkZ1bmN0aW9uOjpOZXcocElzb2xhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfVjhQcm94eUNhbGxiYWNrX2dldE93blByb3BlcnR5RGVzY3JpcHRvcl9nZXR0ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgaENhbGxCYWNrSW5mbykpOw0KKyAgaFByb3BEZXNjcmlwdG9yLT5Gb3JjZVNldCgNCisgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgInNldCIpLA0KKyAgICAgIHY4OjpGdW5jdGlvbjo6TmV3KHBJc29sYXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX1Y4UHJveHlDYWxsYmFja19nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Jfc2V0dGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhDYWxsQmFja0luZm8pKTsNCisgIGhQcm9wRGVzY3JpcHRvci0+Rm9yY2VTZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJlbnVtZXJhYmxlIiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpCb29sZWFuOjpOZXcocElzb2xhdGUsIGZhbHNlKSk7DQorICBoUHJvcERlc2NyaXB0b3ItPkZvcmNlU2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAiY29uZmlndXJhYmxlIiksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpCb29sZWFuOjpOZXcocElzb2xhdGUsIHRydWUpKTsNCisgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQoaFByb3BEZXNjcmlwdG9yKTsNCit9DQorc3RhdGljIHZvaWQgRlhKU0VfVjhQcm94eUNhbGxiYWNrX2dldFByb3BlcnR5RGVzY3JpcHRvcigNCisgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsNCisgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IGluZm8uR2V0SXNvbGF0ZSgpOw0KKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGhDaGFpbk9iaiA9DQorICAgICAgaW5mby5UaGlzKCktPkdldFByb3RvdHlwZSgpLkFzPHY4OjpPYmplY3Q+KCk7DQorICB2ODo6TG9jYWw8djg6OlNjcmlwdD4gZm5Tb3VyY2UgPSB2ODo6U2NyaXB0OjpDb21waWxlKHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KA0KKyAgICAgIHBJc29sYXRlLA0KKyAgICAgICIoZnVuY3Rpb24gKG8sIG5hbWUpIHsgdmFyIGZuLCB4LCBkOyBmbiA9ICINCisgICAgICAiT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgeCA9IG87IHdoaWxlKHggJiYgIShkID0gZm4oeCwgIg0KKyAgICAgICJuYW1lKSkpe3ggPSB4Ll9fcHJvdG9fXzt9IHJldHVybiBkOyB9KSIpKTsNCisgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+IGZuID0gZm5Tb3VyY2UtPlJ1bigpLkFzPHY4OjpGdW5jdGlvbj4oKTsNCisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHJnQXJnc1tdID0ge2hDaGFpbk9iaiwgaW5mb1swXX07DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoQ2hhaW5EZXNjcmlwdG9yID0gZm4tPkNhbGwoaW5mby5UaGlzKCksIDIsIHJnQXJncyk7DQorICBpZiAoIWhDaGFpbkRlc2NyaXB0b3IuSXNFbXB0eSgpICYmIGhDaGFpbkRlc2NyaXB0b3ItPklzT2JqZWN0KCkpIHsNCisgICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChoQ2hhaW5EZXNjcmlwdG9yKTsNCisgIH0gZWxzZSB7DQorICAgIEZYSlNFX1Y4UHJveHlDYWxsYmFja19nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaW5mbyk7DQorICB9DQorfQ0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4UHJveHlDYWxsYmFja19nZXRPd25Qcm9wZXJ0eU5hbWVzKA0KKyAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgew0KKyAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7DQorICB2ODo6SGFuZGxlU2NvcGUgc2NvcGUocElzb2xhdGUpOw0KKyAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldCh2ODo6QXJyYXk6Ok5ldyhwSXNvbGF0ZSkpOw0KK30NCitzdGF0aWMgdm9pZCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZ2V0UHJvcGVydHlOYW1lcygNCisgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsNCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoQ2hhaW5PYmogPQ0KKyAgICAgIGluZm8uVGhpcygpLT5HZXRQcm90b3R5cGUoKS5Bczx2ODo6T2JqZWN0PigpOw0KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaENoYWluUHJvcGVydHlOYW1lcyA9IGhDaGFpbk9iai0+R2V0UHJvcGVydHlOYW1lcygpOw0KKyAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChoQ2hhaW5Qcm9wZXJ0eU5hbWVzKTsNCit9DQorc3RhdGljIHZvaWQgRlhKU0VfVjhQcm94eUNhbGxiYWNrX2RlZmluZVByb3BlcnR5KA0KKyAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgew0KKyAgY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3MgPQ0KKyAgICAgIHN0YXRpY19jYXN0PEZYSlNFX0NMQVNTKj4oaW5mby5EYXRhKCkuQXM8djg6OkV4dGVybmFsPigpLT5WYWx1ZSgpKTsNCisgIGlmICghbHBDbGFzcykgew0KKyAgICByZXR1cm47DQorICB9DQorICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBpbmZvLkdldElzb2xhdGUoKTsNCisgIHY4OjpIYW5kbGVTY29wZSBzY29wZShwSXNvbGF0ZSk7DQorICB2ODo6TG9jYWw8djg6OlN0cmluZz4gaFByb3BOYW1lID0gaW5mb1swXS0+VG9TdHJpbmcoKTsNCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoUHJvcERlc2NyaXB0b3IgPSBpbmZvWzFdLT5Ub09iamVjdCgpOw0KKyAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIHN6UHJvcE5hbWUoaFByb3BOYW1lKTsNCisgIGlmICghaFByb3BEZXNjcmlwdG9yLT5IYXModjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJ2YWx1ZSIpKSkgew0KKyAgICByZXR1cm47DQorICB9DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoUHJvcFZhbHVlID0NCisgICAgICBoUHJvcERlc2NyaXB0b3ItPkdldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgInZhbHVlIikpOw0KKyAgQ0ZYX0J5dGVTdHJpbmdDIHN6RnhQcm9wTmFtZSgqc3pQcm9wTmFtZSwgc3pQcm9wTmFtZS5sZW5ndGgoKSk7DQorICBDRlhKU0VfVmFsdWUqIGxwVGhpc1ZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFByb3BWYWx1ZSA9IENGWEpTRV9WYWx1ZTo6Q3JlYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsNCisgIGxwVGhpc1ZhbHVlLT5Gb3JjZVNldFZhbHVlKGluZm8uVGhpcygpKTsNCisgIGxwUHJvcFZhbHVlLT5Gb3JjZVNldFZhbHVlKGhQcm9wVmFsdWUpOw0KKyAgRlhKU0VfRHluUHJvcFNldHRlckFkYXB0ZXIoDQorICAgICAgbHBDbGFzcywgcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IT0JKRUNUPihscFRoaXNWYWx1ZSksIHN6RnhQcm9wTmFtZSwNCisgICAgICByZWludGVycHJldF9jYXN0PEZYSlNFX0hWQUxVRT4obHBQcm9wVmFsdWUpKTsNCisgIGRlbGV0ZSBscFRoaXNWYWx1ZTsNCisgIGxwVGhpc1ZhbHVlID0gbnVsbHB0cjsKKyAgZGVsZXRlIGxwUHJvcFZhbHVlOw0KKyAgbHBQcm9wVmFsdWUgPSBudWxscHRyOworfQ0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4UHJveHlDYWxsYmFja19kZWxldGUoDQorICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7DQorICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KHRydWUpOw0KKyAgY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3MgPQ0KKyAgICAgIHN0YXRpY19jYXN0PEZYSlNFX0NMQVNTKj4oaW5mby5EYXRhKCkuQXM8djg6OkV4dGVybmFsPigpLT5WYWx1ZSgpKTsNCisgIGlmICghbHBDbGFzcykgew0KKyAgICByZXR1cm47DQorICB9DQorICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBpbmZvLkdldElzb2xhdGUoKTsNCisgIHY4OjpIYW5kbGVTY29wZSBzY29wZShwSXNvbGF0ZSk7DQorICB2ODo6TG9jYWw8djg6OlN0cmluZz4gaFByb3BOYW1lID0gaW5mb1swXS0+VG9TdHJpbmcoKTsNCisgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBzelByb3BOYW1lKGhQcm9wTmFtZSk7DQorICBDRlhfQnl0ZVN0cmluZ0Mgc3pGeFByb3BOYW1lKCpzelByb3BOYW1lLCBzelByb3BOYW1lLmxlbmd0aCgpKTsNCisgIENGWEpTRV9WYWx1ZSogbHBUaGlzVmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQorICBscFRoaXNWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShpbmZvLlRoaXMoKSk7DQorICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KA0KKyAgICAgIEZYSlNFX0R5blByb3BEZWxldGVyQWRhcHRlcigNCisgICAgICAgICAgbHBDbGFzcywgcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IT0JKRUNUPihscFRoaXNWYWx1ZSksIHN6RnhQcm9wTmFtZSkNCisgICAgICAgICAgPyB0cnVlDQorICAgICAgICAgIDogZmFsc2UpOw0KKyAgZGVsZXRlIGxwVGhpc1ZhbHVlOw0KKyAgbHBUaGlzVmFsdWUgPSBudWxscHRyOworfQ0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4UHJveHlDYWxsYmFja19maXgoDQorICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7DQorICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0VW5kZWZpbmVkKCk7DQorfQ0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4X0dlbmVyaWNOYW1lZFByb3BlcnR5UXVlcnlDYWxsYmFjaygKKyAgICB2ODo6TG9jYWw8djg6Ok5hbWU+IHByb3BlcnR5LAorICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6SW50ZWdlcj4mIGluZm8pIHsNCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiB0aGlzT2JqZWN0ID0gaW5mby5UaGlzKCk7DQorICBjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzcyA9DQorICAgICAgc3RhdGljX2Nhc3Q8RlhKU0VfQ0xBU1MqPihpbmZvLkRhdGEoKS5Bczx2ODo6RXh0ZXJuYWw+KCktPlZhbHVlKCkpOw0KKyAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gaW5mby5HZXRJc29sYXRlKCk7DQorICB2ODo6SGFuZGxlU2NvcGUgc2NvcGUocElzb2xhdGUpOw0KKyAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIHN6UHJvcE5hbWUocHJvcGVydHkpOw0KKyAgQ0ZYX0J5dGVTdHJpbmdDIHN6RnhQcm9wTmFtZSgqc3pQcm9wTmFtZSwgc3pQcm9wTmFtZS5sZW5ndGgoKSk7DQorICBDRlhKU0VfVmFsdWUqIGxwVGhpc1ZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KKyAgbHBUaGlzVmFsdWUtPkZvcmNlU2V0VmFsdWUodGhpc09iamVjdCk7DQorICBpZiAoRlhKU0VfRHluUHJvcFF1ZXJ5QWRhcHRlcihscENsYXNzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IT0JKRUNUPihscFRoaXNWYWx1ZSksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekZ4UHJvcE5hbWUpKSB7DQorICAgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQodjg6OkRvbnREZWxldGUpOw0KKyAgfSBlbHNlIHsNCisgICAgY29uc3QgaW50MzJfdCBpVjhBYnNlbnQgPSA2NDsNCisgICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChpVjhBYnNlbnQpOw0KKyAgfQ0KKyAgZGVsZXRlIGxwVGhpc1ZhbHVlOw0KKyAgbHBUaGlzVmFsdWUgPSBudWxscHRyOworfQ0KK3N0YXRpYyB2b2lkIEZYSlNFX1Y4X0dlbmVyaWNOYW1lZFByb3BlcnR5RGVsZXRlckNhbGxiYWNrKA0KKyAgICB2ODo6TG9jYWw8djg6Ok5hbWU+IHByb3BlcnR5LA0KKyAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OkJvb2xlYW4+JiBpbmZvKSB7DQorICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gdGhpc09iamVjdCA9IGluZm8uVGhpcygpOw0KKyAgY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3MgPQ0KKyAgICAgIHN0YXRpY19jYXN0PEZYSlNFX0NMQVNTKj4oaW5mby5EYXRhKCkuQXM8djg6OkV4dGVybmFsPigpLT5WYWx1ZSgpKTsNCisgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IGluZm8uR2V0SXNvbGF0ZSgpOw0KKyAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlKHBJc29sYXRlKTsNCisgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBzelByb3BOYW1lKHByb3BlcnR5KTsNCisgIENGWF9CeXRlU3RyaW5nQyBzekZ4UHJvcE5hbWUoKnN6UHJvcE5hbWUsIHN6UHJvcE5hbWUubGVuZ3RoKCkpOw0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFRoaXNWYWx1ZSA9IENGWEpTRV9WYWx1ZTo6Q3JlYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsNCisgIGxwVGhpc1ZhbHVlLT5Gb3JjZVNldFZhbHVlKHRoaXNPYmplY3QpOw0KKyAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldCgNCisgICAgICBGWEpTRV9EeW5Qcm9wRGVsZXRlckFkYXB0ZXIoDQorICAgICAgICAgIGxwQ2xhc3MsIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSE9CSkVDVD4obHBUaGlzVmFsdWUpLCBzekZ4UHJvcE5hbWUpDQorICAgICAgICAgID8gdHJ1ZQ0KKyAgICAgICAgICA6IGZhbHNlKTsNCisgIGRlbGV0ZSBscFRoaXNWYWx1ZTsNCisgIGxwVGhpc1ZhbHVlID0gbnVsbHB0cjsNCit9DQorc3RhdGljIHZvaWQgRlhKU0VfVjhfR2VuZXJpY05hbWVkUHJvcGVydHlHZXR0ZXJDYWxsYmFjaygNCisgICAgdjg6OkxvY2FsPHY4OjpOYW1lPiBwcm9wZXJ0eSwNCisgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsNCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiB0aGlzT2JqZWN0ID0gaW5mby5UaGlzKCk7DQorICBjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzcyA9DQorICAgICAgc3RhdGljX2Nhc3Q8RlhKU0VfQ0xBU1MqPihpbmZvLkRhdGEoKS5Bczx2ODo6RXh0ZXJuYWw+KCktPlZhbHVlKCkpOw0KKyAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIHN6UHJvcE5hbWUocHJvcGVydHkpOw0KKyAgQ0ZYX0J5dGVTdHJpbmdDIHN6RnhQcm9wTmFtZSgqc3pQcm9wTmFtZSwgc3pQcm9wTmFtZS5sZW5ndGgoKSk7DQorICBDRlhKU0VfVmFsdWUqIGxwVGhpc1ZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KKyAgbHBUaGlzVmFsdWUtPkZvcmNlU2V0VmFsdWUodGhpc09iamVjdCk7DQorICBDRlhKU0VfVmFsdWUqIGxwTmV3VmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQorICBGWEpTRV9EeW5Qcm9wR2V0dGVyQWRhcHRlcigNCisgICAgICBscENsYXNzLCByZWludGVycHJldF9jYXN0PEZYSlNFX0hPQkpFQ1Q+KGxwVGhpc1ZhbHVlKSwgc3pGeFByb3BOYW1lLA0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSFZBTFVFPihscE5ld1ZhbHVlKSk7DQorICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KGxwTmV3VmFsdWUtPkRpcmVjdEdldFZhbHVlKCkpOw0KKyAgZGVsZXRlIGxwVGhpc1ZhbHVlOw0KKyAgbHBUaGlzVmFsdWUgPSBudWxscHRyOw0KK30NCitzdGF0aWMgdm9pZCBGWEpTRV9WOF9HZW5lcmljTmFtZWRQcm9wZXJ0eVNldHRlckNhbGxiYWNrKA0KKyAgICB2ODo6TG9jYWw8djg6Ok5hbWU+IHByb3BlcnR5LA0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWx1ZSwNCisgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsNCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiB0aGlzT2JqZWN0ID0gaW5mby5UaGlzKCk7DQorICBjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzcyA9DQorICAgICAgc3RhdGljX2Nhc3Q8RlhKU0VfQ0xBU1MqPihpbmZvLkRhdGEoKS5Bczx2ODo6RXh0ZXJuYWw+KCktPlZhbHVlKCkpOw0KKyAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIHN6UHJvcE5hbWUocHJvcGVydHkpOw0KKyAgQ0ZYX0J5dGVTdHJpbmdDIHN6RnhQcm9wTmFtZSgqc3pQcm9wTmFtZSwgc3pQcm9wTmFtZS5sZW5ndGgoKSk7DQorICBDRlhKU0VfVmFsdWUqIGxwVGhpc1ZhbHVlID0gQ0ZYSlNFX1ZhbHVlOjpDcmVhdGUoaW5mby5HZXRJc29sYXRlKCkpOw0KKyAgbHBUaGlzVmFsdWUtPkZvcmNlU2V0VmFsdWUodGhpc09iamVjdCk7DQorICBDRlhKU0VfVmFsdWUqIGxwTmV3VmFsdWUgPSBDRlhKU0VfVmFsdWU6OkNyZWF0ZShpbmZvLkdldElzb2xhdGUoKSk7DQorICBscE5ld1ZhbHVlLT5Gb3JjZVNldFZhbHVlKHZhbHVlKTsNCisgIEZYSlNFX0R5blByb3BTZXR0ZXJBZGFwdGVyKA0KKyAgICAgIGxwQ2xhc3MsIHJlaW50ZXJwcmV0X2Nhc3Q8RlhKU0VfSE9CSkVDVD4obHBUaGlzVmFsdWUpLCBzekZ4UHJvcE5hbWUsDQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IVkFMVUU+KGxwTmV3VmFsdWUpKTsNCisgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQodmFsdWUpOw0KKyAgZGVsZXRlIGxwVGhpc1ZhbHVlOw0KKyAgbHBUaGlzVmFsdWUgPSBudWxscHRyOw0KK30NCitzdGF0aWMgdm9pZCBGWEpTRV9WOF9HZW5lcmljTmFtZWRQcm9wZXJ0eUVudW1lcmF0b3JDYWxsYmFjaygNCisgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpBcnJheT4mIGluZm8pIHsNCisgIGNvbnN0IEZYSlNFX0NMQVNTKiBscENsYXNzID0NCisgICAgICBzdGF0aWNfY2FzdDxGWEpTRV9DTEFTUyo+KGluZm8uRGF0YSgpLkFzPHY4OjpFeHRlcm5hbD4oKS0+VmFsdWUoKSk7DQorICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBpbmZvLkdldElzb2xhdGUoKTsNCisgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IG5ld0FycmF5ID0gdjg6OkFycmF5OjpOZXcocElzb2xhdGUsIGxwQ2xhc3MtPnByb3BOdW0pOw0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBscENsYXNzLT5wcm9wTnVtOyBpKyspIHsNCisgICAgbmV3QXJyYXktPlNldCgNCisgICAgICAgIGksIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCBscENsYXNzLT5wcm9wZXJ0aWVzW2ldLm5hbWUpKTsNCisgIH0NCisgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQobmV3QXJyYXkpOw0KK30NCisNCit2b2lkIENGWEpTRV9DbGFzczo6U2V0VXBEeW5Qcm9wSGFuZGxlcihDRlhKU0VfQ29udGV4dCogcENvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhKU0VfQ0xBU1MqIGxwQ2xhc3NEZWZpbml0aW9uKSB7DQorICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBwVmFsdWUtPkdldElzb2xhdGUoKTsNCisgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RPck5vcm1hbENvbnRleHQgc2NvcGUocElzb2xhdGUsIHBDb250ZXh0KTsNCisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gaENvbnRleHQgPSB2ODo6TG9jYWw8djg6OkNvbnRleHQ+OjpOZXcoDQorICAgICAgcElzb2xhdGUsIHBDb250ZXh0ID8gcENvbnRleHQtPm1faENvbnRleHQNCisgICAgICAgICAgICAgICAgICAgICAgICAgOiBDRlhKU0VfUnVudGltZURhdGE6OkdldChwSXNvbGF0ZSktPm1faFJvb3RDb250ZXh0KTsNCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoT2JqZWN0ID0NCisgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KHBJc29sYXRlLCBwVmFsdWUtPm1faFZhbHVlKS5Bczx2ODo6T2JqZWN0PigpOw0KKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGhIYXJtb255UHJveHlPYmogPQ0KKyAgICAgIGhDb250ZXh0LT5HbG9iYWwoKQ0KKyAgICAgICAgICAtPkdldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgIlByb3h5IikpDQorICAgICAgICAgIC5Bczx2ODo6T2JqZWN0PigpOw0KKyAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4gaEhhcm1vbnlQcm94eUNyZWF0ZUZuID0NCisgICAgICBoSGFybW9ueVByb3h5T2JqLT5HZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJjcmVhdGUiKSkNCisgICAgICAgICAgLkFzPHY4OjpGdW5jdGlvbj4oKTsNCisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhPbGRQcm90b3R5cGUgPSBoT2JqZWN0LT5HZXRQcm90b3R5cGUoKTsNCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoVHJhcHBlciA9IHY4OjpPYmplY3Q6Ok5ldyhwSXNvbGF0ZSk7DQorICBoVHJhcHBlci0+Rm9yY2VTZXQoDQorICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiKSwNCisgICAgICB2ODo6RnVuY3Rpb246Ok5ldygNCisgICAgICAgICAgcElzb2xhdGUsIEZYSlNFX1Y4UHJveHlDYWxsYmFja19nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsDQorICAgICAgICAgIHY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PEZYSlNFX0NMQVNTKj4obHBDbGFzc0RlZmluaXRpb24pKSkpOw0KKyAgaFRyYXBwZXItPkZvcmNlU2V0KA0KKyAgICAgIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAiZ2V0UHJvcGVydHlEZXNjcmlwdG9yIiksDQorICAgICAgdjg6OkZ1bmN0aW9uOjpOZXcocElzb2xhdGUsIEZYSlNFX1Y4UHJveHlDYWxsYmFja19nZXRQcm9wZXJ0eURlc2NyaXB0b3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkV4dGVybmFsOjpOZXcocElzb2xhdGUsIGNvbnN0X2Nhc3Q8RlhKU0VfQ0xBU1MqPigNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQ2xhc3NEZWZpbml0aW9uKSkpKTsNCisgIGhUcmFwcGVyLT5Gb3JjZVNldCgNCisgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgImdldE93blByb3BlcnR5TmFtZXMiKSwNCisgICAgICB2ODo6RnVuY3Rpb246Ok5ldyhwSXNvbGF0ZSwgRlhKU0VfVjhQcm94eUNhbGxiYWNrX2dldE93blByb3BlcnR5TmFtZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkV4dGVybmFsOjpOZXcocElzb2xhdGUsIGNvbnN0X2Nhc3Q8RlhKU0VfQ0xBU1MqPigNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQ2xhc3NEZWZpbml0aW9uKSkpKTsNCisgIGhUcmFwcGVyLT5Gb3JjZVNldCgNCisgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgImdldFByb3BlcnR5TmFtZXMiKSwNCisgICAgICB2ODo6RnVuY3Rpb246Ok5ldyhwSXNvbGF0ZSwgRlhKU0VfVjhQcm94eUNhbGxiYWNrX2dldFByb3BlcnR5TmFtZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkV4dGVybmFsOjpOZXcocElzb2xhdGUsIGNvbnN0X2Nhc3Q8RlhKU0VfQ0xBU1MqPigNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQ2xhc3NEZWZpbml0aW9uKSkpKTsNCisgIGhUcmFwcGVyLT5Gb3JjZVNldCgNCisgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgImRlbGV0ZSIpLA0KKyAgICAgIHY4OjpGdW5jdGlvbjo6TmV3KHBJc29sYXRlLCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZGVsZXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLCBjb25zdF9jYXN0PEZYSlNFX0NMQVNTKj4oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscENsYXNzRGVmaW5pdGlvbikpKSk7DQorICBoVHJhcHBlci0+Rm9yY2VTZXQoDQorICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJkZWZpbmVQcm9wZXJ0eSIpLA0KKyAgICAgIHY4OjpGdW5jdGlvbjo6TmV3KHBJc29sYXRlLCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZGVmaW5lUHJvcGVydHksDQorICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkV4dGVybmFsOjpOZXcocElzb2xhdGUsIGNvbnN0X2Nhc3Q8RlhKU0VfQ0xBU1MqPigNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQ2xhc3NEZWZpbml0aW9uKSkpKTsNCisgIGhUcmFwcGVyLT5Gb3JjZVNldCgNCisgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgImZpeCIpLA0KKyAgICAgIHY4OjpGdW5jdGlvbjo6TmV3KHBJc29sYXRlLCBGWEpTRV9WOFByb3h5Q2FsbGJhY2tfZml4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLCBjb25zdF9jYXN0PEZYSlNFX0NMQVNTKj4oDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscENsYXNzRGVmaW5pdGlvbikpKSk7DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZ0FyZ3NbXSA9IHtoVHJhcHBlciwgaE9sZFByb3RvdHlwZX07DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoTmV3UHJvdG90eXBlID0NCisgICAgICBoSGFybW9ueVByb3h5Q3JlYXRlRm4tPkNhbGwoaEhhcm1vbnlQcm94eU9iaiwgMiwgcmdBcmdzKTsNCisgIGhPYmplY3QtPlNldFByb3RvdHlwZShoTmV3UHJvdG90eXBlKTsNCit9DQordm9pZCBDRlhKU0VfQ2xhc3M6OlNldFVwTmFtZWRQcm9wSGFuZGxlcigNCisgICAgdjg6Oklzb2xhdGUqIHBJc29sYXRlLA0KKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiYgaE9iamVjdFRlbXBsYXRlLA0KKyAgICBjb25zdCBGWEpTRV9DTEFTUyogbHBDbGFzc0RlZmluaXRpb24pIHsNCisgIHY4OjpOYW1lZFByb3BlcnR5SGFuZGxlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbigNCisgICAgICBscENsYXNzRGVmaW5pdGlvbi0+ZHluUHJvcEdldHRlcg0KKyAgICAgICAgICA/IEZYSlNFX1Y4X0dlbmVyaWNOYW1lZFByb3BlcnR5R2V0dGVyQ2FsbGJhY2sNCisgICAgICAgICAgOiAwLA0KKyAgICAgIGxwQ2xhc3NEZWZpbml0aW9uLT5keW5Qcm9wU2V0dGVyDQorICAgICAgICAgID8gRlhKU0VfVjhfR2VuZXJpY05hbWVkUHJvcGVydHlTZXR0ZXJDYWxsYmFjaw0KKyAgICAgICAgICA6IDAsDQorICAgICAgbHBDbGFzc0RlZmluaXRpb24tPmR5blByb3BUeXBlR2V0dGVyDQorICAgICAgICAgID8gRlhKU0VfVjhfR2VuZXJpY05hbWVkUHJvcGVydHlRdWVyeUNhbGxiYWNrDQorICAgICAgICAgIDogMCwNCisgICAgICBscENsYXNzRGVmaW5pdGlvbi0+ZHluUHJvcERlbGV0ZXINCisgICAgICAgICAgPyBGWEpTRV9WOF9HZW5lcmljTmFtZWRQcm9wZXJ0eURlbGV0ZXJDYWxsYmFjaw0KKyAgICAgICAgICA6IDAsDQorICAgICAgRlhKU0VfVjhfR2VuZXJpY05hbWVkUHJvcGVydHlFbnVtZXJhdG9yQ2FsbGJhY2ssDQorICAgICAgdjg6OkV4dGVybmFsOjpOZXcocElzb2xhdGUsIGNvbnN0X2Nhc3Q8RlhKU0VfQ0xBU1MqPihscENsYXNzRGVmaW5pdGlvbikpLA0KKyAgICAgIHY4OjpQcm9wZXJ0eUhhbmRsZXJGbGFnczo6a05vbk1hc2tpbmcpOw0KKyAgaE9iamVjdFRlbXBsYXRlLT5TZXRIYW5kbGVyKGNvbmZpZ3VyYXRpb24pOw0KK30NCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4anNlL3NyYy9meHY4LmggYi94ZmEvc3JjL2Z4anNlL3NyYy9meHY4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNjN2IzZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9zcmMvZnhqc2Uvc3JjL2Z4djguaApAQCAtMCwwICsxLDExIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgX0ZYX1Y4X0hfCisjZGVmaW5lIF9GWF9WOF9IXworI2luY2x1ZGUgPHY4Lmg+CisjaW5jbHVkZSA8bGlicGxhdGZvcm0vbGlicGxhdGZvcm0uaD4KKyNlbmRpZgpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGpzZS9zcmMvcnVudGltZS5jcHAgYi94ZmEvc3JjL2Z4anNlL3NyYy9ydW50aW1lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTYzMGRjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGpzZS9zcmMvcnVudGltZS5jcHAKQEAgLTAsMCArMSwxMTIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2luY2x1ZGUgImZwZGZzZGsvaW5jbHVkZS9qc2FwaS9meGpzX3Y4LmgiICAvLyBGb3IgcGVyLWlzb2xhdGUgZGF0YS4NCisjaW5jbHVkZSAieGZhL3NyYy9mb3hpdGxpYi5oIg0KKyNpbmNsdWRlICJmeHY4LmgiDQorI2luY2x1ZGUgInJ1bnRpbWUuaCINCisjaW5jbHVkZSAic2NvcGVfaW5saW5lLmgiDQorDQorLy8gRHVwbGljYXRlcyBmcGRmc2RrJ3MgSlNfUnVudGltZS5oLCBidXQga2VlcHMgWEZBIGZyb20gZGVwZW5kaW5nIG9uIGl0Lg0KKy8vIFRPRE8odHNlcGV6KTogbWFrZSBhIHNpbmdsZSB2ZXJzaW9uIG9mIHRoaXMuDQorY2xhc3MgRlhKU0VfQXJyYXlCdWZmZXJBbGxvY2F0b3IgOiBwdWJsaWMgdjg6OkFycmF5QnVmZmVyOjpBbGxvY2F0b3Igew0KKyAgdm9pZCogQWxsb2NhdGUoc2l6ZV90IGxlbmd0aCkgb3ZlcnJpZGUgeyByZXR1cm4gY2FsbG9jKDEsIGxlbmd0aCk7IH0NCisgIHZvaWQqIEFsbG9jYXRlVW5pbml0aWFsaXplZChzaXplX3QgbGVuZ3RoKSBvdmVycmlkZSB7IHJldHVybiBtYWxsb2MobGVuZ3RoKTsgfQ0KKyAgdm9pZCBGcmVlKHZvaWQqIGRhdGEsIHNpemVfdCBsZW5ndGgpIG92ZXJyaWRlIHsgZnJlZShkYXRhKTsgfQ0KK307DQorDQorc3RhdGljIHZvaWQgRlhKU0VfS2lsbFY4KCkgew0KKyAgdjg6OlY4OjpEaXNwb3NlKCk7DQorfQ0KK3ZvaWQgRlhKU0VfSW5pdGlhbGl6ZSgpIHsNCisgIGlmICghQ0ZYSlNFX1J1bnRpbWVEYXRhOjpnX1J1bnRpbWVMaXN0KSB7DQorICAgIENGWEpTRV9SdW50aW1lRGF0YTo6Z19SdW50aW1lTGlzdCA9IG5ldyBDRlhKU0VfUnVudGltZUxpc3Q7DQorICB9DQorICBzdGF0aWMgRlhfQk9PTCBiVjhJbml0aWFsaXplZCA9IEZBTFNFOw0KKyAgaWYgKGJWOEluaXRpYWxpemVkKSB7DQorICAgIHJldHVybjsNCisgIH0NCisgIGJWOEluaXRpYWxpemVkID0gVFJVRTsNCisgIGF0ZXhpdChGWEpTRV9LaWxsVjgpOw0KK30NCitzdGF0aWMgdm9pZCBGWEpTRV9SdW50aW1lX0Rpc3Bvc2VDYWxsYmFjayh2ODo6SXNvbGF0ZSogcElzb2xhdGUpIHsNCisgIHsNCisgICAgdjg6OkxvY2tlciBsb2NrZXIocElzb2xhdGUpOw0KKyAgICBpZiAoRlhKU19QZXJJc29sYXRlRGF0YSogcERhdGEgPSBGWEpTX1Blcklzb2xhdGVEYXRhOjpHZXQocElzb2xhdGUpKSB7DQorICAgICAgZGVsZXRlIHBEYXRhLT5tX3BGWEpTRVJ1bnRpbWVEYXRhOw0KKyAgICAgIHBEYXRhLT5tX3BGWEpTRVJ1bnRpbWVEYXRhID0gbnVsbHB0cjsNCisgICAgfQ0KKyAgfQ0KKyAgcElzb2xhdGUtPkRpc3Bvc2UoKTsNCit9DQordm9pZCBGWEpTRV9GaW5hbGl6ZSgpIHsNCisgIGlmIChDRlhKU0VfUnVudGltZURhdGE6OmdfUnVudGltZUxpc3QpIHsNCisgICAgQ0ZYSlNFX1J1bnRpbWVEYXRhOjpnX1J1bnRpbWVMaXN0LT5SZW1vdmVBbGxSdW50aW1lcygNCisgICAgICAgIEZYSlNFX1J1bnRpbWVfRGlzcG9zZUNhbGxiYWNrKTsNCisgICAgZGVsZXRlIENGWEpTRV9SdW50aW1lRGF0YTo6Z19SdW50aW1lTGlzdDsNCisgICAgQ0ZYSlNFX1J1bnRpbWVEYXRhOjpnX1J1bnRpbWVMaXN0ID0gTlVMTDsNCisgIH0NCit9DQorRlhKU0VfSFJVTlRJTUUgRlhKU0VfUnVudGltZV9DcmVhdGUoKSB7DQorICB2ODo6SXNvbGF0ZTo6Q3JlYXRlUGFyYW1zIHBhcmFtczsNCisgIHBhcmFtcy5hcnJheV9idWZmZXJfYWxsb2NhdG9yID0gbmV3IEZYSlNFX0FycmF5QnVmZmVyQWxsb2NhdG9yKCk7DQorICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSB2ODo6SXNvbGF0ZTo6TmV3KHBhcmFtcyk7DQorICBBU1NFUlQocElzb2xhdGUgJiYgQ0ZYSlNFX1J1bnRpbWVEYXRhOjpnX1J1bnRpbWVMaXN0KTsNCisgIENGWEpTRV9SdW50aW1lRGF0YTo6Z19SdW50aW1lTGlzdC0+QXBwZW5kUnVudGltZShwSXNvbGF0ZSk7DQorICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IUlVOVElNRT4ocElzb2xhdGUpOw0KK30NCit2b2lkIEZYSlNFX1J1bnRpbWVfUmVsZWFzZShGWEpTRV9IUlVOVElNRSBoUnVudGltZSkgew0KKyAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gcmVpbnRlcnByZXRfY2FzdDx2ODo6SXNvbGF0ZSo+KGhSdW50aW1lKTsNCisgIGlmIChwSXNvbGF0ZSkgew0KKyAgICBBU1NFUlQoQ0ZYSlNFX1J1bnRpbWVEYXRhOjpnX1J1bnRpbWVMaXN0KTsNCisgICAgQ0ZYSlNFX1J1bnRpbWVEYXRhOjpnX1J1bnRpbWVMaXN0LT5SZW1vdmVSdW50aW1lKA0KKyAgICAgICAgcElzb2xhdGUsIEZYSlNFX1J1bnRpbWVfRGlzcG9zZUNhbGxiYWNrKTsNCisgIH0NCit9DQorQ0ZYSlNFX1J1bnRpbWVEYXRhKiBDRlhKU0VfUnVudGltZURhdGE6OkNyZWF0ZSh2ODo6SXNvbGF0ZSogcElzb2xhdGUpIHsNCisgIENGWEpTRV9SdW50aW1lRGF0YSogcFJ1bnRpbWVEYXRhID0gbmV3IENGWEpTRV9SdW50aW1lRGF0YShwSXNvbGF0ZSk7DQorICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUocElzb2xhdGUpOw0KKyAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBoRnVuY1RlbXBsYXRlID0NCisgICAgICB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KHBJc29sYXRlKTsNCisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gaENvbnRleHQgPQ0KKyAgICAgIHY4OjpDb250ZXh0OjpOZXcocElzb2xhdGUsIDAsIGhGdW5jVGVtcGxhdGUtPkluc3RhbmNlVGVtcGxhdGUoKSk7DQorICBoQ29udGV4dC0+U2V0U2VjdXJpdHlUb2tlbih2ODo6RXh0ZXJuYWw6Ok5ldyhwSXNvbGF0ZSwgcElzb2xhdGUpKTsNCisgIHBSdW50aW1lRGF0YS0+bV9oUm9vdENvbnRleHRHbG9iYWxUZW1wbGF0ZS5SZXNldChwSXNvbGF0ZSwgaEZ1bmNUZW1wbGF0ZSk7DQorICBwUnVudGltZURhdGEtPm1faFJvb3RDb250ZXh0LlJlc2V0KHBJc29sYXRlLCBoQ29udGV4dCk7DQorICByZXR1cm4gcFJ1bnRpbWVEYXRhOw0KK30NCitDRlhKU0VfUnVudGltZURhdGEqIENGWEpTRV9SdW50aW1lRGF0YTo6R2V0KHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkgew0KKyAgRlhKU19QZXJJc29sYXRlRGF0YTo6U2V0VXAocElzb2xhdGUpOw0KKyAgRlhKU19QZXJJc29sYXRlRGF0YSogcERhdGEgPSBGWEpTX1Blcklzb2xhdGVEYXRhOjpHZXQocElzb2xhdGUpOw0KKyAgaWYgKCFwRGF0YS0+bV9wRlhKU0VSdW50aW1lRGF0YSkNCisgICAgcERhdGEtPm1fcEZYSlNFUnVudGltZURhdGEgPSBDRlhKU0VfUnVudGltZURhdGE6OkNyZWF0ZShwSXNvbGF0ZSk7DQorICByZXR1cm4gcERhdGEtPm1fcEZYSlNFUnVudGltZURhdGE7DQorfQ0KK0NGWEpTRV9SdW50aW1lTGlzdCogQ0ZYSlNFX1J1bnRpbWVEYXRhOjpnX1J1bnRpbWVMaXN0ID0gTlVMTDsNCit2b2lkIENGWEpTRV9SdW50aW1lTGlzdDo6QXBwZW5kUnVudGltZSh2ODo6SXNvbGF0ZSogcElzb2xhdGUpIHsNCisgIG1fUnVudGltZUxpc3QuQWRkKHBJc29sYXRlKTsNCit9DQordm9pZCBDRlhKU0VfUnVudGltZUxpc3Q6OlJlbW92ZVJ1bnRpbWUoDQorICAgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwNCisgICAgQ0ZYSlNFX1J1bnRpbWVMaXN0OjpSdW50aW1lRGlzcG9zZUNhbGxiYWNrIGxwZm5EaXNwb3NlQ2FsbGJhY2spIHsNCisgIGludDMyX3QgaUlkeCA9IG1fUnVudGltZUxpc3QuRmluZChwSXNvbGF0ZSwgMCk7DQorICBpZiAoaUlkeCA+PSAwKSB7DQorICAgIG1fUnVudGltZUxpc3QuUmVtb3ZlQXQoaUlkeCwgMSk7DQorICB9DQorICBpZiAobHBmbkRpc3Bvc2VDYWxsYmFjaykgew0KKyAgICBscGZuRGlzcG9zZUNhbGxiYWNrKHBJc29sYXRlKTsNCisgIH0NCit9DQordm9pZCBDRlhKU0VfUnVudGltZUxpc3Q6OlJlbW92ZUFsbFJ1bnRpbWVzKA0KKyAgICBDRlhKU0VfUnVudGltZUxpc3Q6OlJ1bnRpbWVEaXNwb3NlQ2FsbGJhY2sgbHBmbkRpc3Bvc2VDYWxsYmFjaykgew0KKyAgaW50MzJfdCBpU2l6ZSA9IG1fUnVudGltZUxpc3QuR2V0U2l6ZSgpOw0KKyAgaWYgKGxwZm5EaXNwb3NlQ2FsbGJhY2spIHsNCisgICAgZm9yIChpbnQzMl90IGlJZHggPSAwOyBpSWR4IDwgaVNpemU7IGlJZHgrKykgew0KKyAgICAgIGxwZm5EaXNwb3NlQ2FsbGJhY2sobV9SdW50aW1lTGlzdFtpSWR4XSk7DQorICAgIH0NCisgIH0NCisgIG1fUnVudGltZUxpc3QuUmVtb3ZlQWxsKCk7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhqc2Uvc3JjL3J1bnRpbWUuaCBiL3hmYS9zcmMvZnhqc2Uvc3JjL3J1bnRpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2MzN2FlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGpzZS9zcmMvcnVudGltZS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBGWEpTRV9SVU5USU1FX0hfDQorI2RlZmluZSBGWEpTRV9SVU5USU1FX0hfDQorY2xhc3MgQ0ZYSlNFX1J1bnRpbWVMaXN0Ow0KK2NsYXNzIENGWEpTRV9SdW50aW1lRGF0YSB7DQorIHByb3RlY3RlZDoNCisgIENGWEpTRV9SdW50aW1lRGF0YSh2ODo6SXNvbGF0ZSogcElzb2xhdGUpIDogbV9wSXNvbGF0ZShwSXNvbGF0ZSl7fTsNCisNCisgcHVibGljOg0KKyAgc3RhdGljIENGWEpTRV9SdW50aW1lRGF0YSogQ3JlYXRlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSk7DQorICBzdGF0aWMgQ0ZYSlNFX1J1bnRpbWVEYXRhKiBHZXQodjg6Oklzb2xhdGUqIHBJc29sYXRlKTsNCisNCisgcHVibGljOg0KKyAgdjg6Oklzb2xhdGUqIG1fcElzb2xhdGU7DQorICB2ODo6R2xvYmFsPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBtX2hSb290Q29udGV4dEdsb2JhbFRlbXBsYXRlOw0KKyAgdjg6Okdsb2JhbDx2ODo6Q29udGV4dD4gbV9oUm9vdENvbnRleHQ7DQorDQorIHB1YmxpYzoNCisgIHN0YXRpYyBDRlhKU0VfUnVudGltZUxpc3QqIGdfUnVudGltZUxpc3Q7DQorDQorIHByb3RlY3RlZDoNCisgIENGWEpTRV9SdW50aW1lRGF0YSgpOw0KKyAgQ0ZYSlNFX1J1bnRpbWVEYXRhKGNvbnN0IENGWEpTRV9SdW50aW1lRGF0YSYpOw0KKyAgQ0ZYSlNFX1J1bnRpbWVEYXRhJiBvcGVyYXRvcj0oY29uc3QgQ0ZYSlNFX1J1bnRpbWVEYXRhJik7DQorfTsNCitjbGFzcyBDRlhKU0VfUnVudGltZUxpc3Qgew0KKyBwdWJsaWM6DQorICB0eXBlZGVmIHZvaWQgKCpSdW50aW1lRGlzcG9zZUNhbGxiYWNrKSh2ODo6SXNvbGF0ZSopOw0KKw0KKyBwdWJsaWM6DQorICB2b2lkIEFwcGVuZFJ1bnRpbWUodjg6Oklzb2xhdGUqIHBJc29sYXRlKTsNCisgIHZvaWQgUmVtb3ZlUnVudGltZSh2ODo6SXNvbGF0ZSogcElzb2xhdGUsDQorICAgICAgICAgICAgICAgICAgICAgUnVudGltZURpc3Bvc2VDYWxsYmFjayBscGZuRGlzcG9zZUNhbGxiYWNrKTsNCisgIHZvaWQgUmVtb3ZlQWxsUnVudGltZXMoUnVudGltZURpc3Bvc2VDYWxsYmFjayBscGZuRGlzcG9zZUNhbGxiYWNrKTsNCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYX0FycmF5VGVtcGxhdGU8djg6Oklzb2xhdGUqPiBtX1J1bnRpbWVMaXN0Ow0KK307DQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEveGZhL3NyYy9meGpzZS9zcmMvc2NvcGVfaW5saW5lLmggYi94ZmEvc3JjL2Z4anNlL3NyYy9zY29wZV9pbmxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDJjNzNhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGpzZS9zcmMvc2NvcGVfaW5saW5lLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tDQorDQorI2lmbmRlZiBGWEpTRV9TQ09QRV9JTkxJTkVfSF8NCisjZGVmaW5lIEZYSlNFX1NDT1BFX0lOTElORV9IXw0KKyNpbmNsdWRlICJydW50aW1lLmgiDQorI2luY2x1ZGUgImNvbnRleHQuaCINCitjbGFzcyBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgew0KKyBwcm90ZWN0ZWQ6DQorICB2ODo6SXNvbGF0ZSogbV9pc29sYXRlOw0KKyAgdjg6OkxvY2tlciBtX2xvY2tlcjsNCisgIHY4OjpJc29sYXRlOjpTY29wZSBtX2lzY29wZTsNCisgIHY4OjpIYW5kbGVTY29wZSBtX2hzY29wZTsNCisNCisgcHVibGljOg0KKyAgZXhwbGljaXQgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkNCisgICAgICA6IG1faXNvbGF0ZShwSXNvbGF0ZSksDQorICAgICAgICBtX2xvY2tlcihwSXNvbGF0ZSksDQorICAgICAgICBtX2lzY29wZShwSXNvbGF0ZSksDQorICAgICAgICBtX2hzY29wZShwSXNvbGF0ZSkge30NCisgIHY4OjpJc29sYXRlKiBHZXRJc29sYXRlKCkgeyByZXR1cm4gbV9pc29sYXRlOyB9DQorDQorIHByaXZhdGU6DQorICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUoY29uc3QgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlJik7DQorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUmKTsNCisgIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSk7DQorICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgc2l6ZV90KTsNCit9Ow0KK2NsYXNzIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHsNCisgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBtX3BhcmVudDsNCisgIHY4OjpDb250ZXh0OjpTY29wZSBtX2NzY29wZTsNCisNCisgcHVibGljOg0KKyAgZXhwbGljaXQgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQodjg6Oklzb2xhdGUqIHBJc29sYXRlKQ0KKyAgICAgIDogbV9wYXJlbnQocElzb2xhdGUpLA0KKyAgICAgICAgbV9jc2NvcGUodjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KA0KKyAgICAgICAgICAgIHBJc29sYXRlLA0KKyAgICAgICAgICAgIENGWEpTRV9SdW50aW1lRGF0YTo6R2V0KHBJc29sYXRlKS0+bV9oUm9vdENvbnRleHQpKSB7fQ0KKw0KKyBwcml2YXRlOg0KKyAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQoDQorICAgICAgY29uc3QgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQmKTsNCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0Jik7DQorICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUpOw0KKyAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCosIHNpemVfdCk7DQorfTsNCitjbGFzcyBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVDb250ZXh0IHsNCisgIENGWEpTRV9Db250ZXh0KiBtX2NvbnRleHQ7DQorICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgbV9wYXJlbnQ7DQorICB2ODo6Q29udGV4dDo6U2NvcGUgbV9jc2NvcGU7DQorDQorIHB1YmxpYzoNCisgIGV4cGxpY2l0IENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZUNvbnRleHQoQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0KQ0KKyAgICAgIDogbV9jb250ZXh0KHBDb250ZXh0KSwNCisgICAgICAgIG1fcGFyZW50KHBDb250ZXh0LT5tX3BJc29sYXRlKSwNCisgICAgICAgIG1fY3Njb3BlKHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhwQ29udGV4dC0+bV9wSXNvbGF0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+bV9oQ29udGV4dCkpIHt9DQorICB2ODo6SXNvbGF0ZSogR2V0SXNvbGF0ZSgpIHsgcmV0dXJuIG1fY29udGV4dC0+bV9wSXNvbGF0ZTsgfQ0KKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBHZXRMb2NhbENvbnRleHQoKSB7DQorICAgIHJldHVybiB2ODo6TG9jYWw8djg6OkNvbnRleHQ+OjpOZXcobV9jb250ZXh0LT5tX3BJc29sYXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fY29udGV4dC0+bV9oQ29udGV4dCk7DQorICB9DQorDQorIHByaXZhdGU6DQorICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVDb250ZXh0KA0KKyAgICAgIGNvbnN0IENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZUNvbnRleHQmKTsNCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZUNvbnRleHQmKTsNCisgIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSk7DQorICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgc2l6ZV90KTsNCit9Ow0KK2NsYXNzIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RPck5vcm1hbENvbnRleHQgew0KKyAgQ0ZYSlNFX0NvbnRleHQqIG1fY29udGV4dDsNCisgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBtX3BhcmVudDsNCisgIHY4OjpDb250ZXh0OjpTY29wZSBtX2NzY29wZTsNCisNCisgcHVibGljOg0KKyAgZXhwbGljaXQgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdE9yTm9ybWFsQ29udGV4dCgNCisgICAgICB2ODo6SXNvbGF0ZSogcElzb2xhdGUsDQorICAgICAgQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0KQ0KKyAgICAgIDogbV9jb250ZXh0KHBDb250ZXh0KSwNCisgICAgICAgIG1fcGFyZW50KHBJc29sYXRlKSwNCisgICAgICAgIG1fY3Njb3BlKHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldygNCisgICAgICAgICAgICBwSXNvbGF0ZSwNCisgICAgICAgICAgICBwQ29udGV4dCA/IHBDb250ZXh0LT5tX2hDb250ZXh0DQorICAgICAgICAgICAgICAgICAgICAgOiBDRlhKU0VfUnVudGltZURhdGE6OkdldChwSXNvbGF0ZSktPm1faFJvb3RDb250ZXh0KSkge30NCisgIHY4OjpJc29sYXRlKiBHZXRJc29sYXRlKCkgeyByZXR1cm4gbV9wYXJlbnQuR2V0SXNvbGF0ZSgpOyB9DQorICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IEdldExvY2FsQ29udGV4dCgpIHsNCisgICAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gbV9wYXJlbnQuR2V0SXNvbGF0ZSgpOw0KKyAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KA0KKyAgICAgICAgcElzb2xhdGUsIG1fY29udGV4dA0KKyAgICAgICAgICAgICAgICAgICAgICA/IG1fY29udGV4dC0+bV9oQ29udGV4dA0KKyAgICAgICAgICAgICAgICAgICAgICA6IENGWEpTRV9SdW50aW1lRGF0YTo6R2V0KHBJc29sYXRlKS0+bV9oUm9vdENvbnRleHQpOw0KKyAgfQ0KKw0KKyBwcml2YXRlOg0KKyAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdE9yTm9ybWFsQ29udGV4dCgNCisgICAgICBjb25zdCBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290T3JOb3JtYWxDb250ZXh0Jik7DQorICB2b2lkIG9wZXJhdG9yPShjb25zdCBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290T3JOb3JtYWxDb250ZXh0Jik7DQorICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUpOw0KKyAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCosIHNpemVfdCk7DQorfTsNCisjZW5kaWYNCmRpZmYgLS1naXQgYS94ZmEvc3JjL2Z4anNlL3NyYy91dGlsX2lubGluZS5oIGIveGZhL3NyYy9meGpzZS9zcmMvdXRpbF9pbmxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDAzNGFhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGpzZS9zcmMvdXRpbF9pbmxpbmUuaApAQCAtMCwwICsxLDQ3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgRlhKU0VfVVRJTF9JTkxJTkVfSF8NCisjZGVmaW5lIEZYSlNFX1VUSUxfSU5MSU5FX0hfDQorc3RhdGljIFY4X0lOTElORSB2ODo6TG9jYWw8djg6Ok9iamVjdD4gRlhKU0VfR2V0R2xvYmFsT2JqZWN0RnJvbUNvbnRleHQoDQorICAgIGNvbnN0IHY4OjpMb2NhbDx2ODo6Q29udGV4dD4mIGhDb250ZXh0KSB7DQorICByZXR1cm4gaENvbnRleHQtPkdsb2JhbCgpLT5HZXRQcm90b3R5cGUoKS5Bczx2ODo6T2JqZWN0PigpOw0KK30NCitzdGF0aWMgVjhfSU5MSU5FIHZvaWQgRlhKU0VfVXBkYXRlT2JqZWN0QmluZGluZyh2ODo6TG9jYWw8djg6Ok9iamVjdD4mIGhPYmplY3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogbHBOZXdCaW5kaW5nKSB7DQorICBBU1NFUlQoIWhPYmplY3QuSXNFbXB0eSgpKTsNCisgIEFTU0VSVChoT2JqZWN0LT5JbnRlcm5hbEZpZWxkQ291bnQoKSA+IDApOw0KKyAgaE9iamVjdC0+U2V0QWxpZ25lZFBvaW50ZXJJbkludGVybmFsRmllbGQoMCwgbHBOZXdCaW5kaW5nKTsNCit9DQorc3RhdGljIFY4X0lOTElORSB2b2lkKiBGWEpTRV9SZXRyaWV2ZU9iamVjdEJpbmRpbmcoDQorICAgIGNvbnN0IHY4OjpMb2NhbDx2ODo6T2JqZWN0PiYgaEpTT2JqZWN0LA0KKyAgICBDRlhKU0VfQ2xhc3MqIGxwQ2xhc3MgPSBOVUxMKSB7DQorICBBU1NFUlQoIWhKU09iamVjdC5Jc0VtcHR5KCkpOw0KKyAgaWYgKCFoSlNPYmplY3QtPklzT2JqZWN0KCkpIHsNCisgICAgcmV0dXJuIE5VTEw7DQorICB9DQorICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaE9iamVjdCA9IGhKU09iamVjdDsNCisgIGlmIChoT2JqZWN0LT5JbnRlcm5hbEZpZWxkQ291bnQoKSA9PSAwKSB7DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhQcm90b09iamVjdCA9IGhPYmplY3QtPkdldFByb3RvdHlwZSgpOw0KKyAgICBpZiAoaFByb3RvT2JqZWN0LklzRW1wdHkoKSB8fCAhaFByb3RvT2JqZWN0LT5Jc09iamVjdCgpKSB7DQorICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisgICAgaE9iamVjdCA9IGhQcm90b09iamVjdC5Bczx2ODo6T2JqZWN0PigpOw0KKyAgICBpZiAoaE9iamVjdC0+SW50ZXJuYWxGaWVsZENvdW50KCkgPT0gMCkgew0KKyAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorICB9DQorICBpZiAobHBDbGFzcykgew0KKyAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IGhDbGFzcyA9DQorICAgICAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+OjpOZXcoDQorICAgICAgICAgICAgbHBDbGFzcy0+R2V0Q29udGV4dCgpLT5HZXRSdW50aW1lKCksIGxwQ2xhc3MtPkdldFRlbXBsYXRlKCkpOw0KKyAgICBpZiAoIWhDbGFzcy0+SGFzSW5zdGFuY2UoaE9iamVjdCkpIHsNCisgICAgICByZXR1cm4gTlVMTDsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuIGhPYmplY3QtPkdldEFsaWduZWRQb2ludGVyRnJvbUludGVybmFsRmllbGQoMCk7DQorfQ0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhqc2Uvc3JjL3ZhbHVlLmNwcCBiL3hmYS9zcmMvZnhqc2Uvc3JjL3ZhbHVlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDgyZmIwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL3NyYy9meGpzZS9zcmMvdmFsdWUuY3BwCkBAIC0wLDAgKzEsNTQ0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpbmNsdWRlICJ4ZmEvc3JjL2ZveGl0bGliLmgiDQorI2luY2x1ZGUgImZ4djguaCINCisjaW5jbHVkZSAidmFsdWUuaCINCisjaW5jbHVkZSAiY2xhc3MuaCINCisjaW5jbHVkZSA8bWF0aC5oPg0KKyNpbmNsdWRlICJ1dGlsX2lubGluZS5oIg0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfSXNVbmRlZmluZWQoRlhKU0VfSFZBTFVFIGhWYWx1ZSkgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgcmV0dXJuIGxwVmFsdWUgJiYgbHBWYWx1ZS0+SXNVbmRlZmluZWQoKTsNCit9DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9Jc051bGwoRlhKU0VfSFZBTFVFIGhWYWx1ZSkgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgcmV0dXJuIGxwVmFsdWUgJiYgbHBWYWx1ZS0+SXNOdWxsKCk7DQorfQ0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfSXNCb29sZWFuKEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIHJldHVybiBscFZhbHVlICYmIGxwVmFsdWUtPklzQm9vbGVhbigpOw0KK30NCitGWF9CT09MIEZYSlNFX1ZhbHVlX0lzVVRGOFN0cmluZyhGWEpTRV9IVkFMVUUgaFZhbHVlKSB7DQorICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICByZXR1cm4gbHBWYWx1ZSAmJiBscFZhbHVlLT5Jc1N0cmluZygpOw0KK30NCitGWF9CT09MIEZYSlNFX1ZhbHVlX0lzTnVtYmVyKEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIHJldHVybiBscFZhbHVlICYmIGxwVmFsdWUtPklzTnVtYmVyKCk7DQorfQ0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfSXNJbnRlZ2VyKEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIHJldHVybiBscFZhbHVlICYmIGxwVmFsdWUtPklzSW50ZWdlcigpOw0KK30NCitGWF9CT09MIEZYSlNFX1ZhbHVlX0lzT2JqZWN0KEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIHJldHVybiBscFZhbHVlICYmIGxwVmFsdWUtPklzT2JqZWN0KCk7DQorfQ0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfSXNBcnJheShGWEpTRV9IVkFMVUUgaFZhbHVlKSB7DQorICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICByZXR1cm4gbHBWYWx1ZSAmJiBscFZhbHVlLT5Jc0FycmF5KCk7DQorfQ0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfSXNGdW5jdGlvbihGWEpTRV9IVkFMVUUgaFZhbHVlKSB7DQorICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICByZXR1cm4gbHBWYWx1ZSAmJiBscFZhbHVlLT5Jc0Z1bmN0aW9uKCk7DQorfQ0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfSXNEYXRlKEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIHJldHVybiBscFZhbHVlICYmIGxwVmFsdWUtPklzRGF0ZSgpOw0KK30NCitGWF9CT09MIEZYSlNFX1ZhbHVlX1RvQm9vbGVhbihGWEpTRV9IVkFMVUUgaFZhbHVlKSB7DQorICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICBBU1NFUlQobHBWYWx1ZSk7DQorICByZXR1cm4gbHBWYWx1ZS0+VG9Cb29sZWFuKCk7DQorfQ0KK0ZYX0ZMT0FUIEZYSlNFX1ZhbHVlX1RvRmxvYXQoRlhKU0VfSFZBTFVFIGhWYWx1ZSkgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgQVNTRVJUKGxwVmFsdWUpOw0KKyAgcmV0dXJuIGxwVmFsdWUtPlRvRmxvYXQoKTsNCit9DQorRlhKU0VfRE9VQkxFIEZYSlNFX1ZhbHVlX1RvRG91YmxlKEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIEFTU0VSVChscFZhbHVlKTsNCisgIHJldHVybiBscFZhbHVlLT5Ub0RvdWJsZSgpOw0KK30NCit2b2lkIEZYSlNFX1ZhbHVlX1RvVVRGOFN0cmluZyhGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzelN0ck91dHB1dCkgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgQVNTRVJUKGxwVmFsdWUpOw0KKyAgcmV0dXJuIGxwVmFsdWUtPlRvU3RyaW5nKHN6U3RyT3V0cHV0KTsNCit9DQoraW50MzJfdCBGWEpTRV9WYWx1ZV9Ub0ludGVnZXIoRlhKU0VfSFZBTFVFIGhWYWx1ZSkgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgQVNTRVJUKGxwVmFsdWUpOw0KKyAgcmV0dXJuIGxwVmFsdWUtPlRvSW50ZWdlcigpOw0KK30NCit2b2lkKiBGWEpTRV9WYWx1ZV9Ub09iamVjdChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWEpTRV9IQ0xBU1MgaENsYXNzKSB7DQorICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICBDRlhKU0VfQ2xhc3MqIGxwQ2xhc3MgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9DbGFzcyo+KGhDbGFzcyk7DQorICBBU1NFUlQobHBWYWx1ZSk7DQorICByZXR1cm4gbHBWYWx1ZS0+VG9PYmplY3QobHBDbGFzcyk7DQorfQ0KK3ZvaWQgRlhKU0VfVmFsdWVfU2V0VW5kZWZpbmVkKEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIEFTU0VSVChscFZhbHVlKTsNCisgIHJldHVybiBscFZhbHVlLT5TZXRVbmRlZmluZWQoKTsNCit9DQordm9pZCBGWEpTRV9WYWx1ZV9TZXROdWxsKEZYSlNFX0hWQUxVRSBoVmFsdWUpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIEFTU0VSVChscFZhbHVlKTsNCisgIHJldHVybiBscFZhbHVlLT5TZXROdWxsKCk7DQorfQ0KK3ZvaWQgRlhKU0VfVmFsdWVfU2V0Qm9vbGVhbihGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9CT09MIGJCb29sZWFuKSB7DQorICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICBBU1NFUlQobHBWYWx1ZSk7DQorICByZXR1cm4gbHBWYWx1ZS0+U2V0Qm9vbGVhbihiQm9vbGVhbik7DQorfQ0KK3ZvaWQgRlhKU0VfVmFsdWVfU2V0VVRGOFN0cmluZyhGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6U3RyaW5nKSB7DQorICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICBBU1NFUlQobHBWYWx1ZSk7DQorICByZXR1cm4gbHBWYWx1ZS0+U2V0U3RyaW5nKHN6U3RyaW5nKTsNCit9DQordm9pZCBGWEpTRV9WYWx1ZV9TZXRJbnRlZ2VyKEZYSlNFX0hWQUxVRSBoVmFsdWUsIGludDMyX3QgbkludGVnZXIpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIEFTU0VSVChscFZhbHVlKTsNCisgIHJldHVybiBscFZhbHVlLT5TZXRJbnRlZ2VyKG5JbnRlZ2VyKTsNCit9DQordm9pZCBGWEpTRV9WYWx1ZV9TZXRGbG9hdChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWF9GTE9BVCBmRmxvYXQpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIEFTU0VSVChscFZhbHVlKTsNCisgIHJldHVybiBscFZhbHVlLT5TZXRGbG9hdChmRmxvYXQpOw0KK30NCit2b2lkIEZYSlNFX1ZhbHVlX1NldERvdWJsZShGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWEpTRV9ET1VCTEUgZERvdWJsZSkgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgQVNTRVJUKGxwVmFsdWUpOw0KKyAgcmV0dXJuIGxwVmFsdWUtPlNldERvdWJsZShkRG91YmxlKTsNCit9DQordm9pZCBGWEpTRV9WYWx1ZV9TZXRPYmplY3QoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBscE9iamVjdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IQ0xBU1MgaENsYXNzKSB7DQorICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICBDRlhKU0VfQ2xhc3MqIGxwQ2xhc3MgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9DbGFzcyo+KGhDbGFzcyk7DQorICBpZiAobHBDbGFzcyA9PSBOVUxMKSB7DQorICAgIEFTU0VSVChscE9iamVjdCA9PSBOVUxMKTsNCisgICAgbHBWYWx1ZS0+U2V0SlNPYmplY3QoKTsNCisgIH0gZWxzZSBpZiAobHBDbGFzcyAhPSBOVUxMKSB7DQorICAgIGxwVmFsdWUtPlNldEhvc3RPYmplY3QobHBPYmplY3QsIGxwQ2xhc3MpOw0KKyAgfQ0KK30NCit2b2lkIEZYSlNFX1ZhbHVlX1NldEFycmF5KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB1VmFsdWVDb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSogcmdWYWx1ZXMpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIHJldHVybiBscFZhbHVlLT5TZXRBcnJheSh1VmFsdWVDb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSoqPihyZ1ZhbHVlcykpOw0KK30NCit2b2lkIEZYSlNFX1ZhbHVlX1NldERhdGUoRlhKU0VfSFZBTFVFIGhWYWx1ZSwgRlhKU0VfRE9VQkxFIGREb3VibGUpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIHJldHVybiBscFZhbHVlLT5TZXREYXRlKGREb3VibGUpOw0KK30NCit2b2lkIEZYSlNFX1ZhbHVlX1NldChGWEpTRV9IVkFMVUUgaFZhbHVlLCBGWEpTRV9IVkFMVUUgaE9yaWdpbmFsVmFsdWUpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIENGWEpTRV9WYWx1ZSogbHBPcmlnaW5hbFZhbHVlID0NCisgICAgICByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhPcmlnaW5hbFZhbHVlKTsNCisgIEFTU0VSVChscFZhbHVlICYmIGxwT3JpZ2luYWxWYWx1ZSk7DQorICByZXR1cm4gbHBWYWx1ZS0+QXNzaWduKGxwT3JpZ2luYWxWYWx1ZSk7DQorfQ0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoUHJvcFZhbHVlKSB7DQorICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoUHJvcFZhbHVlKTsNCisgIEFTU0VSVChscFZhbHVlICYmIGxwUHJvcFZhbHVlKTsNCisgIHJldHVybiBscFZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eShzelByb3BOYW1lLCBscFByb3BWYWx1ZSk7DQorfQ0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfU2V0T2JqZWN0UHJvcChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoUHJvcFZhbHVlKSB7DQorICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoUHJvcFZhbHVlKTsNCisgIEFTU0VSVChscFZhbHVlICYmIGxwUHJvcFZhbHVlKTsNCisgIHJldHVybiBscFZhbHVlLT5TZXRPYmplY3RQcm9wZXJ0eShzelByb3BOYW1lLCBscFByb3BWYWx1ZSk7DQorfQ0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfR2V0T2JqZWN0UHJvcEJ5SWR4KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdVByb3BJZHgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhQcm9wVmFsdWUpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIENGWEpTRV9WYWx1ZSogbHBQcm9wVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhQcm9wVmFsdWUpOw0KKyAgQVNTRVJUKGxwVmFsdWUgJiYgbHBQcm9wVmFsdWUpOw0KKyAgcmV0dXJuIGxwVmFsdWUtPkdldE9iamVjdFByb3BlcnR5KHVQcm9wSWR4LCBscFByb3BWYWx1ZSk7DQorfQ0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfU2V0T2JqZWN0UHJvcEJ5SWR4KEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdVByb3BJZHgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhQcm9wVmFsdWUpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIENGWEpTRV9WYWx1ZSogbHBQcm9wVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhQcm9wVmFsdWUpOw0KKyAgQVNTRVJUKGxwVmFsdWUgJiYgbHBQcm9wVmFsdWUpOw0KKyAgcmV0dXJuIGxwVmFsdWUtPlNldE9iamVjdFByb3BlcnR5KHVQcm9wSWR4LCBscFByb3BWYWx1ZSk7DQorfQ0KK0ZYX0JPT0wgRlhKU0VfVmFsdWVfRGVsZXRlT2JqZWN0UHJvcChGWEpTRV9IVkFMVUUgaFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIEFTU0VSVChscFZhbHVlKTsNCisgIHJldHVybiBscFZhbHVlLT5EZWxldGVPYmplY3RQcm9wZXJ0eShzelByb3BOYW1lKTsNCit9DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9PYmplY3RIYXNPd25Qcm9wKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXNlVHlwZUdldHRlcikgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgQVNTRVJUKGxwVmFsdWUpOw0KKyAgcmV0dXJuIGxwVmFsdWUtPkhhc09iamVjdE93blByb3BlcnR5KHN6UHJvcE5hbWUsIGJVc2VUeXBlR2V0dGVyKTsNCit9DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9TZXRPYmplY3RPd25Qcm9wKEZYSlNFX0hWQUxVRSBoVmFsdWUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhQcm9wVmFsdWUpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaFZhbHVlKTsNCisgIENGWEpTRV9WYWx1ZSogbHBQcm9wVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhQcm9wVmFsdWUpOw0KKyAgQVNTRVJUKGxwVmFsdWUgJiYgbHBQcm9wVmFsdWUpOw0KKyAgcmV0dXJuIGxwVmFsdWUtPlNldE9iamVjdE93blByb3BlcnR5KHN6UHJvcE5hbWUsIGxwUHJvcFZhbHVlKTsNCit9DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9TZXRGdW5jdGlvbkJpbmQoRlhKU0VfSFZBTFVFIGhWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaE9sZEZ1bmN0aW9uLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYSlNFX0hWQUxVRSBoTmV3VGhpcykgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVmFsdWUpOw0KKyAgQ0ZYSlNFX1ZhbHVlKiBscE9sZEZ1bmN0aW9uID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoT2xkRnVuY3Rpb24pOw0KKyAgQ0ZYSlNFX1ZhbHVlKiBscE5ld1RoaXMgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhOZXdUaGlzKTsNCisgIEFTU0VSVChscFZhbHVlICYmIGxwT2xkRnVuY3Rpb24gJiYgbHBOZXdUaGlzKTsNCisgIHJldHVybiBscFZhbHVlLT5TZXRGdW5jdGlvbkJpbmQobHBPbGRGdW5jdGlvbiwgbHBOZXdUaGlzKTsNCit9DQorRlhfQk9PTCBGWEpTRV9WYWx1ZV9DYWxsRnVuY3Rpb24oRlhKU0VfSFZBTFVFIGhGdW5jdGlvbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUgaFRoaXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFIGhSZXRWYWx1ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuQXJnQ291bnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfSFZBTFVFKiBscEFyZ3MpIHsNCisgIENGWEpTRV9WYWx1ZSogbHBGdW5jdGlvbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYSlNFX1ZhbHVlKj4oaEZ1bmN0aW9uKTsNCisgIENGWEpTRV9WYWx1ZSogbHBUaGlzID0gcmVpbnRlcnByZXRfY2FzdDxDRlhKU0VfVmFsdWUqPihoVGhpcyk7DQorICBDRlhKU0VfVmFsdWUqIGxwUmV0VmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhSZXRWYWx1ZSk7DQorICBBU1NFUlQobHBGdW5jdGlvbik7DQorICByZXR1cm4gbHBGdW5jdGlvbi0+Q2FsbChscFRoaXMsIGxwUmV0VmFsdWUsIG5BcmdDb3VudCwgbHBBcmdzKTsNCit9DQorRlhKU0VfSFZBTFVFIEZYSlNFX1ZhbHVlX0NyZWF0ZShGWEpTRV9IUlVOVElNRSBoUnVudGltZSkgew0KKyAgQ0ZYSlNFX1ZhbHVlKiBscFZhbHVlID0NCisgICAgICBDRlhKU0VfVmFsdWU6OkNyZWF0ZShyZWludGVycHJldF9jYXN0PHY4OjpJc29sYXRlKj4oaFJ1bnRpbWUpKTsNCisgIEFTU0VSVChscFZhbHVlKTsNCisgIHJldHVybiByZWludGVycHJldF9jYXN0PEZYSlNFX0hWQUxVRT4obHBWYWx1ZSk7DQorfQ0KK3ZvaWQgRlhKU0VfVmFsdWVfUmVsZWFzZShGWEpTRV9IVkFMVUUgaFZhbHVlKSB7DQorICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICBpZiAobHBWYWx1ZSkgew0KKyAgICBkZWxldGUgbHBWYWx1ZTsNCisgIH0NCit9DQorRlhKU0VfSFJVTlRJTUUgRlhKU0VfVmFsdWVfR2V0UnVudGltZShGWEpTRV9IVkFMVUUgaFZhbHVlKSB7DQorICBDRlhKU0VfVmFsdWUqIGxwVmFsdWUgPSByZWludGVycHJldF9jYXN0PENGWEpTRV9WYWx1ZSo+KGhWYWx1ZSk7DQorICBBU1NFUlQobHBWYWx1ZSk7DQorICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxGWEpTRV9IUlVOVElNRT4obHBWYWx1ZS0+R2V0SXNvbGF0ZSgpKTsNCit9DQordm9pZCBGWEpTRV9UaHJvd01lc3NhZ2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB1dGY4TmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHV0ZjhNZXNzYWdlKSB7DQorICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSB2ODo6SXNvbGF0ZTo6R2V0Q3VycmVudCgpOw0KKyAgQVNTRVJUKHBJc29sYXRlKTsNCisgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKHBJc29sYXRlKTsNCisgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBoTWVzc2FnZSA9IHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KA0KKyAgICAgIHBJc29sYXRlLCB1dGY4TWVzc2FnZS5HZXRDU3RyKCksIHY4OjpTdHJpbmc6OmtOb3JtYWxTdHJpbmcsDQorICAgICAgdXRmOE1lc3NhZ2UuR2V0TGVuZ3RoKCkpOw0KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaEVycm9yOw0KKyAgaWYgKHV0ZjhOYW1lID09ICJSYW5nZUVycm9yIikgew0KKyAgICBoRXJyb3IgPSB2ODo6RXhjZXB0aW9uOjpSYW5nZUVycm9yKGhNZXNzYWdlKTsNCisgIH0gZWxzZSBpZiAodXRmOE5hbWUgPT0gIlJlZmVyZW5jZUVycm9yIikgew0KKyAgICBoRXJyb3IgPSB2ODo6RXhjZXB0aW9uOjpSZWZlcmVuY2VFcnJvcihoTWVzc2FnZSk7DQorICB9IGVsc2UgaWYgKHV0ZjhOYW1lID09ICJTeW50YXhFcnJvciIpIHsNCisgICAgaEVycm9yID0gdjg6OkV4Y2VwdGlvbjo6U3ludGF4RXJyb3IoaE1lc3NhZ2UpOw0KKyAgfSBlbHNlIGlmICh1dGY4TmFtZSA9PSAiVHlwZUVycm9yIikgew0KKyAgICBoRXJyb3IgPSB2ODo6RXhjZXB0aW9uOjpUeXBlRXJyb3IoaE1lc3NhZ2UpOw0KKyAgfSBlbHNlIHsNCisgICAgaEVycm9yID0gdjg6OkV4Y2VwdGlvbjo6RXJyb3IoaE1lc3NhZ2UpOw0KKyAgICBpZiAodXRmOE5hbWUgIT0gIkVycm9yIiAmJiAhdXRmOE5hbWUuSXNFbXB0eSgpKSB7DQorICAgICAgaEVycm9yLkFzPHY4OjpPYmplY3Q+KCktPlNldCgNCisgICAgICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJuYW1lIiksDQorICAgICAgICAgIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCB1dGY4TmFtZS5HZXRDU3RyKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpTdHJpbmc6OmtOb3JtYWxTdHJpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0ZjhOYW1lLkdldExlbmd0aCgpKSk7DQorICAgIH0NCisgIH0NCisgIHBJc29sYXRlLT5UaHJvd0V4Y2VwdGlvbihoRXJyb3IpOw0KK30NCitDRlhKU0VfVmFsdWUqIENGWEpTRV9WYWx1ZTo6Q3JlYXRlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkgew0KKyAgcmV0dXJuIG5ldyBDRlhKU0VfVmFsdWUocElzb2xhdGUpOw0KK30NCit2b2lkKiBDRlhKU0VfVmFsdWU6OlRvT2JqZWN0KENGWEpTRV9DbGFzcyogbHBDbGFzcykgY29uc3Qgew0KKyAgQVNTRVJUKCFtX2hWYWx1ZS5Jc0VtcHR5KCkpOw0KKyAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCisgIEFTU0VSVCghaFZhbHVlLklzRW1wdHkoKSk7DQorICBpZiAoIWhWYWx1ZS0+SXNPYmplY3QoKSkgew0KKyAgICByZXR1cm4gTlVMTDsNCisgIH0NCisgIHJldHVybiBGWEpTRV9SZXRyaWV2ZU9iamVjdEJpbmRpbmcoaFZhbHVlLkFzPHY4OjpPYmplY3Q+KCksIGxwQ2xhc3MpOw0KK30NCitWOF9JTkxJTkUgc3RhdGljIGRvdWJsZSBGWEpTRV9mdG9kKEZYX0ZMT0FUIGZOdW1iZXIpIHsNCisgIGlmIChzaXplb2YoRlhfRkxPQVQpICE9IDQpIHsNCisgICAgQVNTRVJUKEZBTFNFKTsNCisgICAgcmV0dXJuIGZOdW1iZXI7DQorICB9DQorICB1aW50MzJfdCBuRmxvYXRCaXRzID0gKHVpbnQzMl90JilmTnVtYmVyOw0KKyAgdWludDhfdCBuRXhwb25lbnQgPSAodWludDhfdCkobkZsb2F0Qml0cyA+PiAxNiA+PiA3KTsNCisgIGlmIChuRXhwb25lbnQgPT0gMCB8fCBuRXhwb25lbnQgPT0gMjU1KSB7DQorICAgIHJldHVybiBmTnVtYmVyOw0KKyAgfQ0KKyAgaW50OF90IG5FcnJFeHAgPSBuRXhwb25lbnQgLSAxMjcgLSAyMzsNCisgIGlmIChuRXJyRXhwID49IDApIHsNCisgICAgcmV0dXJuIGZOdW1iZXI7DQorICB9DQorICBkb3VibGUgZHdFcnJvciA9IHBvdygyLjAsIG5FcnJFeHApLCBkd0Vycm9ySGFsZiA9IGR3RXJyb3IgLyAyOw0KKyAgZG91YmxlIGROdW1iZXIgPSBmTnVtYmVyLCBkTnVtYmVyQWJzID0gZmFicyhmTnVtYmVyKTsNCisgIGRvdWJsZSBkTnVtYmVyQWJzTWluID0gZE51bWJlckFicyAtIGR3RXJyb3JIYWxmLA0KKyAgICAgICAgIGROdW1iZXJBYnNNYXggPSBkTnVtYmVyQWJzICsgZHdFcnJvckhhbGY7DQorICBpbnQzMl90IGlFcnJQb3MgPSAwOw0KKyAgaWYgKGZsb29yKGROdW1iZXJBYnNNaW4pID09IGZsb29yKGROdW1iZXJBYnNNYXgpKSB7DQorICAgIGROdW1iZXJBYnNNaW4gPSBmbW9kKGROdW1iZXJBYnNNaW4sIDEuMCk7DQorICAgIGROdW1iZXJBYnNNYXggPSBmbW9kKGROdW1iZXJBYnNNYXgsIDEuMCk7DQorICAgIGludDMyX3QgaUVyclBvc01pbiA9IDEsIGlFcnJQb3NNYXggPSAzODsNCisgICAgZG8gew0KKyAgICAgIGludDMyX3QgaU1pZCA9IChpRXJyUG9zTWluICsgaUVyclBvc01heCkgLyAyOw0KKyAgICAgIGRvdWJsZSBkUG93ID0gcG93KDEwLjAsIGlNaWQpOw0KKyAgICAgIGlmIChmbG9vcihkTnVtYmVyQWJzTWluICogZFBvdykgPT0gZmxvb3IoZE51bWJlckFic01heCAqIGRQb3cpKSB7DQorICAgICAgICBpRXJyUG9zTWluID0gaU1pZCArIDE7DQorICAgICAgfSBlbHNlIHsNCisgICAgICAgIGlFcnJQb3NNYXggPSBpTWlkOw0KKyAgICAgIH0NCisgICAgfSB3aGlsZSAoaUVyclBvc01pbiA8IGlFcnJQb3NNYXgpOw0KKyAgICBpRXJyUG9zID0gaUVyclBvc01heDsNCisgIH0NCisgIGRvdWJsZSBkUG93ID0gcG93KDEwLjAsIGlFcnJQb3MpOw0KKyAgcmV0dXJuIGZOdW1iZXIgPCAwID8gY2VpbChkTnVtYmVyICogZFBvdyAtIDAuNSkgLyBkUG93DQorICAgICAgICAgICAgICAgICAgICAgOiBmbG9vcihkTnVtYmVyICogZFBvdyArIDAuNSkgLyBkUG93Ow0KK30NCit2b2lkIENGWEpTRV9WYWx1ZTo6U2V0RmxvYXQoRlhfRkxPQVQgZkZsb2F0KSB7DQorICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUobV9wSXNvbGF0ZSk7DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6TnVtYmVyOjpOZXcobV9wSXNvbGF0ZSwgRlhKU0VfZnRvZChmRmxvYXQpKTsNCisgIG1faFZhbHVlLlJlc2V0KG1fcElzb2xhdGUsIGhWYWx1ZSk7DQorfQ0KK3ZvaWQgQ0ZYSlNFX1ZhbHVlOjpTZXRIb3N0T2JqZWN0KHZvaWQqIGxwT2JqZWN0LCBDRlhKU0VfQ2xhc3MqIGxwQ2xhc3MpIHsNCisgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgQVNTRVJUKGxwQ2xhc3MpOw0KKyAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBoQ2xhc3MgPQ0KKyAgICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT46Ok5ldyhtX3BJc29sYXRlLCBscENsYXNzLT5tX2hUZW1wbGF0ZSk7DQorICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaE9iamVjdCA9IGhDbGFzcy0+SW5zdGFuY2VUZW1wbGF0ZSgpLT5OZXdJbnN0YW5jZSgpOw0KKyAgRlhKU0VfVXBkYXRlT2JqZWN0QmluZGluZyhoT2JqZWN0LCBscE9iamVjdCk7DQorICBtX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoT2JqZWN0KTsNCit9DQordm9pZCBDRlhKU0VfVmFsdWU6OlNldEFycmF5KHVpbnQzMl90IHVWYWx1ZUNvdW50LCBDRlhKU0VfVmFsdWUqKiByZ1ZhbHVlcykgew0KKyAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQorICB2ODo6TG9jYWw8djg6OkFycmF5PiBoQXJyYXlPYmplY3QgPSB2ODo6QXJyYXk6Ok5ldyhtX3BJc29sYXRlLCB1VmFsdWVDb3VudCk7DQorICBpZiAocmdWYWx1ZXMpIHsNCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHVWYWx1ZUNvdW50OyBpKyspIHsNCisgICAgICBpZiAocmdWYWx1ZXNbaV0pIHsNCisgICAgICAgIGhBcnJheU9iamVjdC0+U2V0KGksIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcoDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wSXNvbGF0ZSwgcmdWYWx1ZXNbaV0tPkRpcmVjdEdldFZhbHVlKCkpKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIG1faFZhbHVlLlJlc2V0KG1fcElzb2xhdGUsIGhBcnJheU9iamVjdCk7DQorfQ0KK3ZvaWQgQ0ZYSlNFX1ZhbHVlOjpTZXREYXRlKEZYSlNFX0RPVUJMRSBkRG91YmxlKSB7DQorICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCBzY29wZShtX3BJc29sYXRlKTsNCisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhEYXRlID0gdjg6OkRhdGU6Ok5ldyhtX3BJc29sYXRlLCBkRG91YmxlKTsNCisgIG1faFZhbHVlLlJlc2V0KG1fcElzb2xhdGUsIGhEYXRlKTsNCit9DQorRlhfQk9PTCBDRlhKU0VfVmFsdWU6OlNldE9iamVjdFByb3BlcnR5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBscFByb3BWYWx1ZSkgew0KKyAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoT2JqZWN0ID0NCisgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCisgIGlmICghaE9iamVjdC0+SXNPYmplY3QoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoUHJvcFZhbHVlID0NCisgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIGxwUHJvcFZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpKTsNCisgIHJldHVybiAoRlhfQk9PTCloT2JqZWN0LkFzPHY4OjpPYmplY3Q+KCktPlNldCgNCisgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChtX3BJc29sYXRlLCBzelByb3BOYW1lLkdldENTdHIoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6U3RyaW5nOjprTm9ybWFsU3RyaW5nLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6UHJvcE5hbWUuR2V0TGVuZ3RoKCkpLA0KKyAgICAgIGhQcm9wVmFsdWUpOw0KK30NCitGWF9CT09MIENGWEpTRV9WYWx1ZTo6R2V0T2JqZWN0UHJvcGVydHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlKSB7DQorICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCBzY29wZShtX3BJc29sYXRlKTsNCisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhPYmplY3QgPQ0KKyAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KKyAgaWYgKCFoT2JqZWN0LT5Jc09iamVjdCgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhQcm9wVmFsdWUgPQ0KKyAgICAgIGhPYmplY3QuQXM8djg6Ok9iamVjdD4oKS0+R2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KA0KKyAgICAgICAgICBtX3BJc29sYXRlLCBzelByb3BOYW1lLkdldENTdHIoKSwgdjg6OlN0cmluZzo6a05vcm1hbFN0cmluZywNCisgICAgICAgICAgc3pQcm9wTmFtZS5HZXRMZW5ndGgoKSkpOw0KKyAgbHBQcm9wVmFsdWUtPkZvcmNlU2V0VmFsdWUoaFByb3BWYWx1ZSk7DQorICByZXR1cm4gVFJVRTsNCit9DQorRlhfQk9PTCBDRlhKU0VfVmFsdWU6OlNldE9iamVjdFByb3BlcnR5KHVpbnQzMl90IHVQcm9wSWR4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlKSB7DQorICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCBzY29wZShtX3BJc29sYXRlKTsNCisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhPYmplY3QgPQ0KKyAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KKyAgaWYgKCFoT2JqZWN0LT5Jc09iamVjdCgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhQcm9wVmFsdWUgPQ0KKyAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbHBQcm9wVmFsdWUtPkRpcmVjdEdldFZhbHVlKCkpOw0KKyAgcmV0dXJuIChGWF9CT09MKWhPYmplY3QuQXM8djg6Ok9iamVjdD4oKS0+U2V0KHVQcm9wSWR4LCBoUHJvcFZhbHVlKTsNCit9DQorRlhfQk9PTCBDRlhKU0VfVmFsdWU6OkdldE9iamVjdFByb3BlcnR5KHVpbnQzMl90IHVQcm9wSWR4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlKSB7DQorICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCBzY29wZShtX3BJc29sYXRlKTsNCisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhPYmplY3QgPQ0KKyAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KKyAgaWYgKCFoT2JqZWN0LT5Jc09iamVjdCgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhQcm9wVmFsdWUgPSBoT2JqZWN0LkFzPHY4OjpPYmplY3Q+KCktPkdldCh1UHJvcElkeCk7DQorICBscFByb3BWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShoUHJvcFZhbHVlKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWEpTRV9WYWx1ZTo6RGVsZXRlT2JqZWN0UHJvcGVydHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lKSB7DQorICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCBzY29wZShtX3BJc29sYXRlKTsNCisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhPYmplY3QgPQ0KKyAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KKyAgaWYgKCFoT2JqZWN0LT5Jc09iamVjdCgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIGhPYmplY3QuQXM8djg6Ok9iamVjdD4oKS0+RGVsZXRlKHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KA0KKyAgICAgIG1fcElzb2xhdGUsIHN6UHJvcE5hbWUuR2V0Q1N0cigpLCB2ODo6U3RyaW5nOjprTm9ybWFsU3RyaW5nLA0KKyAgICAgIHN6UHJvcE5hbWUuR2V0TGVuZ3RoKCkpKTsNCisgIHJldHVybiBUUlVFOw0KK30NCitGWF9CT09MIENGWEpTRV9WYWx1ZTo6SGFzT2JqZWN0T3duUHJvcGVydHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MIGJVc2VUeXBlR2V0dGVyKSB7DQorICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCBzY29wZShtX3BJc29sYXRlKTsNCisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhPYmplY3QgPQ0KKyAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KKyAgaWYgKCFoT2JqZWN0LT5Jc09iamVjdCgpKSB7DQorICAgIHJldHVybiBGQUxTRTsNCisgIH0NCisgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBoS2V5ID0gdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgoDQorICAgICAgbV9wSXNvbGF0ZSwgc3pQcm9wTmFtZS5HZXRDU3RyKCksIHY4OjpTdHJpbmc6OmtOb3JtYWxTdHJpbmcsDQorICAgICAgc3pQcm9wTmFtZS5HZXRMZW5ndGgoKSk7DQorICByZXR1cm4gaE9iamVjdC5Bczx2ODo6T2JqZWN0PigpLT5IYXNSZWFsTmFtZWRQcm9wZXJ0eShoS2V5KSB8fA0KKyAgICAgICAgIChiVXNlVHlwZUdldHRlciAmJiBoT2JqZWN0LkFzPHY4OjpPYmplY3Q+KCktPkhhc093blByb3BlcnR5KGhLZXkpKTsNCit9DQorRlhfQk9PTCBDRlhKU0VfVmFsdWU6OlNldE9iamVjdE93blByb3BlcnR5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBscFByb3BWYWx1ZSkgew0KKyAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoT2JqZWN0ID0NCisgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCisgIGlmICghaE9iamVjdC0+SXNPYmplY3QoKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPQ0KKyAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbHBQcm9wVmFsdWUtPm1faFZhbHVlKTsNCisgIHJldHVybiBoT2JqZWN0LkFzPHY4OjpPYmplY3Q+KCktPkZvcmNlU2V0KA0KKyAgICAgIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KG1fcElzb2xhdGUsIHN6UHJvcE5hbWUuR2V0Q1N0cigpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpTdHJpbmc6OmtOb3JtYWxTdHJpbmcsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pQcm9wTmFtZS5HZXRMZW5ndGgoKSksDQorICAgICAgaFZhbHVlKTsNCit9DQorRlhfQk9PTCBDRlhKU0VfVmFsdWU6OlNldEZ1bmN0aW9uQmluZChDRlhKU0VfVmFsdWUqIGxwT2xkRnVuY3Rpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGxwTmV3VGhpcykgew0KKyAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZ0FyZ3NbMl07DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoT2xkRnVuY3Rpb24gPQ0KKyAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbHBPbGRGdW5jdGlvbi0+RGlyZWN0R2V0VmFsdWUoKSk7DQorICBpZiAoaE9sZEZ1bmN0aW9uLklzRW1wdHkoKSB8fCAhaE9sZEZ1bmN0aW9uLT5Jc0Z1bmN0aW9uKCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmdBcmdzWzBdID0gaE9sZEZ1bmN0aW9uOw0KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaE5ld1RoaXMgPQ0KKyAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbHBOZXdUaGlzLT5EaXJlY3RHZXRWYWx1ZSgpKTsNCisgIGlmIChoTmV3VGhpcy5Jc0VtcHR5KCkpIHsNCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgcmdBcmdzWzFdID0gaE5ld1RoaXM7DQorICB2ODo6TG9jYWw8djg6OlN0cmluZz4gaEJpbmRlckZ1bmNTb3VyY2UgPQ0KKyAgICAgIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KG1fcElzb2xhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihmdW5jdGlvbiAob2xkZnVuY3Rpb24sIG5ld3RoaXMpIHsgcmV0dXJuICINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2xkZnVuY3Rpb24uYmluZChuZXd0aGlzKTsgfSkiKTsNCisgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+IGhCaW5kZXJGdW5jID0NCisgICAgICB2ODo6U2NyaXB0OjpDb21waWxlKGhCaW5kZXJGdW5jU291cmNlKS0+UnVuKCkuQXM8djg6OkZ1bmN0aW9uPigpOw0KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaEJvdW5kRnVuY3Rpb24gPQ0KKyAgICAgIGhCaW5kZXJGdW5jLT5DYWxsKG1fcElzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCktPkdsb2JhbCgpLCAyLCByZ0FyZ3MpOw0KKyAgaWYgKGhCb3VuZEZ1bmN0aW9uLklzRW1wdHkoKSB8fCAhaEJvdW5kRnVuY3Rpb24tPklzRnVuY3Rpb24oKSkgew0KKyAgICByZXR1cm4gRkFMU0U7DQorICB9DQorICBtX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoQm91bmRGdW5jdGlvbik7DQorICByZXR1cm4gVFJVRTsNCit9DQorI2RlZmluZSBGWEpTRV9JTlZBTElEX1BUUiAoKHZvaWQqKShpbnRwdHJfdCktMSkNCitGWF9CT09MIENGWEpTRV9WYWx1ZTo6Q2FsbChDRlhKU0VfVmFsdWUqIGxwUmVjZWl2ZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBscFJldFZhbHVlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5BcmdDb3VudCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUqIGxwQXJncykgew0KKyAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQorICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoRnVuY3Rpb25WYWx1ZSA9DQorICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBEaXJlY3RHZXRWYWx1ZSgpKTsNCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoRnVuY3Rpb25PYmplY3QgPQ0KKyAgICAgICFoRnVuY3Rpb25WYWx1ZS5Jc0VtcHR5KCkgJiYgaEZ1bmN0aW9uVmFsdWUtPklzT2JqZWN0KCkNCisgICAgICAgICAgPyBoRnVuY3Rpb25WYWx1ZS5Bczx2ODo6T2JqZWN0PigpDQorICAgICAgICAgIDogdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCk7DQorICB2ODo6VHJ5Q2F0Y2ggdHJ5Y2F0Y2g7DQorICBpZiAoaEZ1bmN0aW9uT2JqZWN0LklzRW1wdHkoKSB8fCAhaEZ1bmN0aW9uT2JqZWN0LT5Jc0NhbGxhYmxlKCkpIHsNCisgICAgaWYgKGxwUmV0VmFsdWUpIHsNCisgICAgICBscFJldFZhbHVlLT5Gb3JjZVNldFZhbHVlKEZYSlNFX0NyZWF0ZVJldHVyblZhbHVlKG1fcElzb2xhdGUsIHRyeWNhdGNoKSk7DQorICAgIH0NCisgICAgcmV0dXJuIEZBTFNFOw0KKyAgfQ0KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFJldHVyblZhbHVlOw0KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4qIGxwTG9jYWxBcmdzID0gTlVMTDsNCisgIGlmIChuQXJnQ291bnQpIHsNCisgICAgbHBMb2NhbEFyZ3MgPSBGWF9BbGxvYyh2ODo6TG9jYWw8djg6OlZhbHVlPiwgbkFyZ0NvdW50KTsNCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5BcmdDb3VudDsgaSsrKSB7DQorICAgICAgbmV3IChscExvY2FsQXJncyArIGkpIHY4OjpMb2NhbDx2ODo6VmFsdWU+Ow0KKyAgICAgIENGWEpTRV9WYWx1ZSogbHBBcmcgPSAoQ0ZYSlNFX1ZhbHVlKilscEFyZ3NbaV07DQorICAgICAgaWYgKGxwQXJnKSB7DQorICAgICAgICBscExvY2FsQXJnc1tpXSA9DQorICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBscEFyZy0+RGlyZWN0R2V0VmFsdWUoKSk7DQorICAgICAgfQ0KKyAgICAgIGlmIChscExvY2FsQXJnc1tpXS5Jc0VtcHR5KCkpIHsNCisgICAgICAgIGxwTG9jYWxBcmdzW2ldID0gdjg6OlVuZGVmaW5lZChtX3BJc29sYXRlKTsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIEZYX0JPT0wgYlJldFZhbHVlID0gVFJVRTsNCisgIGlmIChscFJlY2VpdmVyID09IEZYSlNFX0lOVkFMSURfUFRSKSB7DQorICAgIGhSZXR1cm5WYWx1ZSA9IGhGdW5jdGlvbk9iamVjdC0+Q2FsbEFzQ29uc3RydWN0b3IobkFyZ0NvdW50LCBscExvY2FsQXJncyk7DQorICB9IGVsc2Ugew0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoUmVjZWl2ZXI7DQorICAgIGlmIChscFJlY2VpdmVyKSB7DQorICAgICAgaFJlY2VpdmVyID0NCisgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBscFJlY2VpdmVyLT5EaXJlY3RHZXRWYWx1ZSgpKTsNCisgICAgfQ0KKyAgICBpZiAoaFJlY2VpdmVyLklzRW1wdHkoKSB8fCAhaFJlY2VpdmVyLT5Jc09iamVjdCgpKSB7DQorICAgICAgaFJlY2VpdmVyID0gdjg6Ok9iamVjdDo6TmV3KG1fcElzb2xhdGUpOw0KKyAgICB9DQorICAgIGhSZXR1cm5WYWx1ZSA9DQorICAgICAgICBoRnVuY3Rpb25PYmplY3QtPkNhbGxBc0Z1bmN0aW9uKGhSZWNlaXZlciwgbkFyZ0NvdW50LCBscExvY2FsQXJncyk7DQorICB9DQorICBpZiAodHJ5Y2F0Y2guSGFzQ2F1Z2h0KCkpIHsNCisgICAgaFJldHVyblZhbHVlID0gRlhKU0VfQ3JlYXRlUmV0dXJuVmFsdWUobV9wSXNvbGF0ZSwgdHJ5Y2F0Y2gpOw0KKyAgICBiUmV0VmFsdWUgPSBGQUxTRTsNCisgIH0NCisgIGlmIChscFJldFZhbHVlKSB7DQorICAgIGxwUmV0VmFsdWUtPkZvcmNlU2V0VmFsdWUoaFJldHVyblZhbHVlKTsNCisgIH0NCisgIGlmIChscExvY2FsQXJncykgew0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbkFyZ0NvdW50OyBpKyspIHsNCisgICAgICBscExvY2FsQXJnc1tpXS5+TG9jYWwoKTsNCisgICAgfQ0KKyAgICBGWF9GcmVlKGxwTG9jYWxBcmdzKTsNCisgIH0NCisgIHJldHVybiBiUmV0VmFsdWU7DQorfQ0KZGlmZiAtLWdpdCBhL3hmYS9zcmMvZnhqc2Uvc3JjL3ZhbHVlLmggYi94ZmEvc3JjL2Z4anNlL3NyYy92YWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMTAyYmQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvc3JjL2Z4anNlL3NyYy92YWx1ZS5oCkBAIC0wLDAgKzEsMjM4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlDQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4NCisNCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQ0KKw0KKyNpZm5kZWYgRlhKU0VfVkFMVUVfSF8NCisjZGVmaW5lIEZYSlNFX1ZBTFVFX0hfDQorI2luY2x1ZGUgInNjb3BlX2lubGluZS5oIg0KK2NsYXNzIENGWEpTRV9WYWx1ZSB7DQorIHB1YmxpYzoNCisgIENGWEpTRV9WYWx1ZSh2ODo6SXNvbGF0ZSogcElzb2xhdGUpIDogbV9wSXNvbGF0ZShwSXNvbGF0ZSkge30NCisNCisgcHJvdGVjdGVkOg0KKyAgQ0ZYSlNFX1ZhbHVlKCk7DQorICBDRlhKU0VfVmFsdWUoY29uc3QgQ0ZYSlNFX1ZhbHVlJik7DQorICBDRlhKU0VfVmFsdWUmIG9wZXJhdG9yPShjb25zdCBDRlhKU0VfVmFsdWUmKTsNCisNCisgcHVibGljOg0KKyAgVjhfSU5MSU5FIEZYX0JPT0wgSXNVbmRlZmluZWQoKSBjb25zdCB7DQorICAgIGlmIChtX2hWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPQ0KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQorICAgIHJldHVybiBoVmFsdWUtPklzVW5kZWZpbmVkKCk7DQorICB9DQorICBWOF9JTkxJTkUgRlhfQk9PTCBJc051bGwoKSBjb25zdCB7DQorICAgIGlmIChtX2hWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPQ0KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQorICAgIHJldHVybiBoVmFsdWUtPklzTnVsbCgpOw0KKyAgfQ0KKyAgVjhfSU5MSU5FIEZYX0JPT0wgSXNCb29sZWFuKCkgY29uc3Qgew0KKyAgICBpZiAobV9oVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBzY29wZShtX3BJc29sYXRlKTsNCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0NCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KKyAgICByZXR1cm4gaFZhbHVlLT5Jc0Jvb2xlYW4oKTsNCisgIH0NCisgIFY4X0lOTElORSBGWF9CT09MIElzU3RyaW5nKCkgY29uc3Qgew0KKyAgICBpZiAobV9oVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBzY29wZShtX3BJc29sYXRlKTsNCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0NCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KKyAgICByZXR1cm4gaFZhbHVlLT5Jc1N0cmluZygpOw0KKyAgfQ0KKyAgVjhfSU5MSU5FIEZYX0JPT0wgSXNOdW1iZXIoKSBjb25zdCB7DQorICAgIGlmIChtX2hWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPQ0KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQorICAgIHJldHVybiBoVmFsdWUtPklzTnVtYmVyKCk7DQorICB9DQorICBWOF9JTkxJTkUgRlhfQk9PTCBJc0ludGVnZXIoKSBjb25zdCB7DQorICAgIGlmIChtX2hWYWx1ZS5Jc0VtcHR5KCkpIHsNCisgICAgICByZXR1cm4gRkFMU0U7DQorICAgIH0NCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPQ0KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQorICAgIHJldHVybiBoVmFsdWUtPklzSW50MzIoKTsNCisgIH0NCisgIFY4X0lOTElORSBGWF9CT09MIElzT2JqZWN0KCkgY29uc3Qgew0KKyAgICBpZiAobV9oVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBzY29wZShtX3BJc29sYXRlKTsNCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0NCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KKyAgICByZXR1cm4gaFZhbHVlLT5Jc09iamVjdCgpOw0KKyAgfQ0KKyAgVjhfSU5MSU5FIEZYX0JPT0wgSXNBcnJheSgpIGNvbnN0IHsNCisgICAgaWYgKG1faFZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUobV9wSXNvbGF0ZSk7DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9DQorICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCisgICAgcmV0dXJuIGhWYWx1ZS0+SXNBcnJheSgpOw0KKyAgfQ0KKyAgVjhfSU5MSU5FIEZYX0JPT0wgSXNGdW5jdGlvbigpIGNvbnN0IHsNCisgICAgaWYgKG1faFZhbHVlLklzRW1wdHkoKSkgew0KKyAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKyAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUobV9wSXNvbGF0ZSk7DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9DQorICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCisgICAgcmV0dXJuIGhWYWx1ZS0+SXNGdW5jdGlvbigpOw0KKyAgfQ0KKyAgVjhfSU5MSU5FIEZYX0JPT0wgSXNEYXRlKCkgY29uc3Qgew0KKyAgICBpZiAobV9oVmFsdWUuSXNFbXB0eSgpKSB7DQorICAgICAgcmV0dXJuIEZBTFNFOw0KKyAgICB9DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBzY29wZShtX3BJc29sYXRlKTsNCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0NCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KKyAgICByZXR1cm4gaFZhbHVlLT5Jc0RhdGUoKTsNCisgIH0NCisNCisgcHVibGljOg0KKyAgVjhfSU5MSU5FIEZYX0JPT0wgVG9Cb29sZWFuKCkgY29uc3Qgew0KKyAgICBBU1NFUlQoIW1faFZhbHVlLklzRW1wdHkoKSk7DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPQ0KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQorICAgIHJldHVybiBzdGF0aWNfY2FzdDxGWF9CT09MPihoVmFsdWUtPkJvb2xlYW5WYWx1ZSgpKTsNCisgIH0NCisgIFY4X0lOTElORSBGWF9GTE9BVCBUb0Zsb2F0KCkgY29uc3Qgew0KKyAgICBBU1NFUlQoIW1faFZhbHVlLklzRW1wdHkoKSk7DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPQ0KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQorICAgIHJldHVybiBzdGF0aWNfY2FzdDxGWF9GTE9BVD4oaFZhbHVlLT5OdW1iZXJWYWx1ZSgpKTsNCisgIH0NCisgIFY4X0lOTElORSBGWEpTRV9ET1VCTEUgVG9Eb3VibGUoKSBjb25zdCB7DQorICAgIEFTU0VSVCghbV9oVmFsdWUuSXNFbXB0eSgpKTsNCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9DQorICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsNCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEZYSlNFX0RPVUJMRT4oaFZhbHVlLT5OdW1iZXJWYWx1ZSgpKTsNCisgIH0NCisgIFY4X0lOTElORSBpbnQzMl90IFRvSW50ZWdlcigpIGNvbnN0IHsNCisgICAgQVNTRVJUKCFtX2hWYWx1ZS5Jc0VtcHR5KCkpOw0KKyAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCBzY29wZShtX3BJc29sYXRlKTsNCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0NCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOw0KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaFZhbHVlLT5OdW1iZXJWYWx1ZSgpKTsNCisgIH0NCisgIFY4X0lOTElORSB2b2lkIFRvU3RyaW5nKENGWF9CeXRlU3RyaW5nJiBzelN0ck91dHB1dCkgY29uc3Qgew0KKyAgICBBU1NFUlQoIW1faFZhbHVlLklzRW1wdHkoKSk7DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPQ0KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7DQorICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBoU3RyaW5nID0gaFZhbHVlLT5Ub1N0cmluZygpOw0KKyAgICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgaFN0cmluZ1ZhbChoU3RyaW5nKTsNCisgICAgc3pTdHJPdXRwdXQgPSAqaFN0cmluZ1ZhbDsNCisgIH0NCisgIHZvaWQqIFRvT2JqZWN0KENGWEpTRV9DbGFzcyogbHBDbGFzcykgY29uc3Q7DQorDQorIHB1YmxpYzoNCisgIFY4X0lOTElORSB2b2lkIFNldFVuZGVmaW5lZCgpIHsNCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6VW5kZWZpbmVkKG1fcElzb2xhdGUpOw0KKyAgICBtX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoVmFsdWUpOw0KKyAgfQ0KKyAgVjhfSU5MSU5FIHZvaWQgU2V0TnVsbCgpIHsNCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6TnVsbChtX3BJc29sYXRlKTsNCisgICAgbV9oVmFsdWUuUmVzZXQobV9wSXNvbGF0ZSwgaFZhbHVlKTsNCisgIH0NCisgIFY4X0lOTElORSB2b2lkIFNldEJvb2xlYW4oRlhfQk9PTCBiQm9vbGVhbikgew0KKyAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUobV9wSXNvbGF0ZSk7DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9DQorICAgICAgICB2ODo6Qm9vbGVhbjo6TmV3KG1fcElzb2xhdGUsIGJCb29sZWFuICE9IEZBTFNFKTsNCisgICAgbV9oVmFsdWUuUmVzZXQobV9wSXNvbGF0ZSwgaFZhbHVlKTsNCisgIH0NCisgIFY4X0lOTElORSB2b2lkIFNldEludGVnZXIoaW50MzJfdCBuSW50ZWdlcikgew0KKyAgICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUobV9wSXNvbGF0ZSk7DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9IHY4OjpJbnRlZ2VyOjpOZXcobV9wSXNvbGF0ZSwgbkludGVnZXIpOw0KKyAgICBtX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoVmFsdWUpOw0KKyAgfQ0KKyAgVjhfSU5MSU5FIHZvaWQgU2V0RG91YmxlKEZYSlNFX0RPVUJMRSBkRG91YmxlKSB7DQorICAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBzY29wZShtX3BJc29sYXRlKTsNCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFZhbHVlID0gdjg6Ok51bWJlcjo6TmV3KG1fcElzb2xhdGUsIGREb3VibGUpOw0KKyAgICBtX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoVmFsdWUpOw0KKyAgfQ0KKyAgVjhfSU5MSU5FIHZvaWQgU2V0U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pTdHJpbmcpIHsNCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKG1fcElzb2xhdGUpOw0KKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOCgNCisgICAgICAgIG1fcElzb2xhdGUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHN6U3RyaW5nLkdldFB0cigpKSwNCisgICAgICAgIHY4OjpTdHJpbmc6OmtOb3JtYWxTdHJpbmcsIHN6U3RyaW5nLkdldExlbmd0aCgpKTsNCisgICAgbV9oVmFsdWUuUmVzZXQobV9wSXNvbGF0ZSwgaFZhbHVlKTsNCisgIH0NCisgIFY4X0lOTElORSB2b2lkIFNldEZsb2F0KEZYX0ZMT0FUIGZGbG9hdCk7DQorICBWOF9JTkxJTkUgdm9pZCBTZXRKU09iamVjdCgpIHsNCisgICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7DQorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9IHY4OjpPYmplY3Q6Ok5ldyhtX3BJc29sYXRlKTsNCisgICAgbV9oVmFsdWUuUmVzZXQobV9wSXNvbGF0ZSwgaFZhbHVlKTsNCisgIH0NCisgIHZvaWQgU2V0SG9zdE9iamVjdCh2b2lkKiBscE9iamVjdCwgQ0ZYSlNFX0NsYXNzKiBscENsYXNzKTsNCisgIHZvaWQgU2V0QXJyYXkodWludDMyX3QgdVZhbHVlQ291bnQsIENGWEpTRV9WYWx1ZSoqIHJnVmFsdWVzKTsNCisgIHZvaWQgU2V0RGF0ZShGWEpTRV9ET1VCTEUgZERvdWJsZSk7DQorDQorIHB1YmxpYzoNCisgIEZYX0JPT0wgR2V0T2JqZWN0UHJvcGVydHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlKTsNCisgIEZYX0JPT0wgU2V0T2JqZWN0UHJvcGVydHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlKTsNCisgIEZYX0JPT0wgR2V0T2JqZWN0UHJvcGVydHkodWludDMyX3QgdVByb3BJZHgsIENGWEpTRV9WYWx1ZSogbHBQcm9wVmFsdWUpOw0KKyAgRlhfQk9PTCBTZXRPYmplY3RQcm9wZXJ0eSh1aW50MzJfdCB1UHJvcElkeCwgQ0ZYSlNFX1ZhbHVlKiBscFByb3BWYWx1ZSk7DQorICBGWF9CT09MIERlbGV0ZU9iamVjdFByb3BlcnR5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSk7DQorICBGWF9CT09MIEhhc09iamVjdE93blByb3BlcnR5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCBiVXNlVHlwZUdldHRlcik7DQorICBGWF9CT09MIFNldE9iamVjdE93blByb3BlcnR5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBscFByb3BWYWx1ZSk7DQorICBGWF9CT09MIFNldEZ1bmN0aW9uQmluZChDRlhKU0VfVmFsdWUqIGxwT2xkRnVuY3Rpb24sIENGWEpTRV9WYWx1ZSogbHBOZXdUaGlzKTsNCisgIEZYX0JPT0wgQ2FsbChDRlhKU0VfVmFsdWUqIGxwUmVjZWl2ZXIsDQorICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBscFJldFZhbHVlLA0KKyAgICAgICAgICAgICAgIHVpbnQzMl90IG5BcmdDb3VudCwNCisgICAgICAgICAgICAgICBGWEpTRV9IVkFMVUUqIGxwQXJncyk7DQorDQorIHB1YmxpYzoNCisgIFY4X0lOTElORSB2ODo6SXNvbGF0ZSogR2V0SXNvbGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcElzb2xhdGU7IH0NCisgIFY4X0lOTElORSBjb25zdCB2ODo6R2xvYmFsPHY4OjpWYWx1ZT4mIERpcmVjdEdldFZhbHVlKCkgY29uc3Qgew0KKyAgICByZXR1cm4gbV9oVmFsdWU7DQorICB9DQorICBWOF9JTkxJTkUgdm9pZCBGb3JjZVNldFZhbHVlKHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSkgew0KKyAgICBtX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoVmFsdWUpOw0KKyAgfQ0KKyAgVjhfSU5MSU5FIHZvaWQgQXNzaWduKGNvbnN0IENGWEpTRV9WYWx1ZSogbHBWYWx1ZSkgew0KKyAgICBpZiAobHBWYWx1ZSkgew0KKyAgICAgIG1faFZhbHVlLlJlc2V0KG1fcElzb2xhdGUsIGxwVmFsdWUtPm1faFZhbHVlKTsNCisgICAgfSBlbHNlIHsNCisgICAgICBtX2hWYWx1ZS5SZXNldCgpOw0KKyAgICB9DQorICB9DQorDQorIHB1YmxpYzoNCisgIHN0YXRpYyBDRlhKU0VfVmFsdWUqIENyZWF0ZSh2ODo6SXNvbGF0ZSogcElzb2xhdGUpOw0KKw0KKyBwcm90ZWN0ZWQ6DQorICB2ODo6SXNvbGF0ZSogbV9wSXNvbGF0ZTsNCisgIHY4OjpHbG9iYWw8djg6OlZhbHVlPiBtX2hWYWx1ZTsNCisgIGZyaWVuZCBjbGFzcyBDRlhKU0VfQ29udGV4dDsNCisgIGZyaWVuZCBjbGFzcyBDRlhKU0VfQ2xhc3M7DQorfTsNCisjZW5kaWYNCg==